From 8f85a105da7b266db028dae30fd42f6b0260a2a5 Mon Sep 17 00:00:00 2001 From: Liam Horne Date: Thu, 29 Apr 2021 15:54:44 -0700 Subject: [PATCH 01/81] test: enable auto start of docker-compose services in integration tests --- README.md | 1 - integration-tests/package.json | 4 ++- .../test/basic-l1-l2-communication.spec.ts | 6 ++++ integration-tests/test/erc20.spec.ts | 6 ++++ integration-tests/test/fee-payment.spec.ts | 5 ++++ integration-tests/test/native-eth.spec.ts | 6 ++++ integration-tests/test/ovmcontext.spec.ts | 6 ++++ .../test/queue-ingestion.spec.ts | 5 ++++ .../test/read-proxy-event.spec.ts | 6 ++++ integration-tests/test/rpc.spec.ts | 6 ++++ .../test/shared/docker-compose.ts | 29 +++++++++++++++++++ yarn.lock | 11 +++++-- 12 files changed, 87 insertions(+), 4 deletions(-) create mode 100644 integration-tests/test/shared/docker-compose.ts diff --git a/README.md b/README.md index 37ccdf9212f5d..9974b568d60c1 100644 --- a/README.md +++ b/README.md @@ -69,7 +69,6 @@ cd ops export COMPOSE_DOCKER_CLI_BUILD=1 export DOCKER_BUILDKIT=1 docker-compose build -docker-compose up -d cd ../integration-tests yarn build:integration yarn test:integration diff --git a/integration-tests/package.json b/integration-tests/package.json index 7fb566e561ce1..ce18ac2ed06a3 100644 --- a/integration-tests/package.json +++ b/integration-tests/package.json @@ -23,12 +23,14 @@ "@nomiclabs/hardhat-ethers": "^2.0.2", "chai": "^4.3.3", "chai-as-promised": "^7.1.1", + "docker-compose": "^0.23.8", "envalid": "^7.1.0", "ethereum-waffle": "^3.3.0", "ethers": "^5.0.32", "hardhat": "^2.2.1", "hardhat-gas-reporter": "^1.0.4", "mocha": "^8.3.1", - "rimraf": "^3.0.2" + "rimraf": "^3.0.2", + "shelljs": "^0.8.4" } } diff --git a/integration-tests/test/basic-l1-l2-communication.spec.ts b/integration-tests/test/basic-l1-l2-communication.spec.ts index 0af0cb1339cdb..1c9c372c1c80c 100644 --- a/integration-tests/test/basic-l1-l2-communication.spec.ts +++ b/integration-tests/test/basic-l1-l2-communication.spec.ts @@ -8,6 +8,12 @@ import { Direction } from './shared/watcher-utils' import l1SimpleStorageJson from '../artifacts/contracts/SimpleStorage.sol/SimpleStorage.json' import l2SimpleStorageJson from '../artifacts-ovm/contracts/SimpleStorage.sol/SimpleStorage.json' import { OptimismEnv } from './shared/env' +import { DockerComposeNetwork } from './shared/docker-compose' + + +before(async () => { + await new DockerComposeNetwork().up() +}) describe('Basic L1<>L2 Communication', async () => { let Factory__L1SimpleStorage: ContractFactory diff --git a/integration-tests/test/erc20.spec.ts b/integration-tests/test/erc20.spec.ts index 9eb7105ee0dea..a0c0b8334339c 100644 --- a/integration-tests/test/erc20.spec.ts +++ b/integration-tests/test/erc20.spec.ts @@ -3,6 +3,12 @@ import { ethers } from 'hardhat' import { expect } from 'chai' import { GWEI } from './shared/utils' import { OptimismEnv } from './shared/env' +import { DockerComposeNetwork } from './shared/docker-compose' + + +before(async () => { + await new DockerComposeNetwork().up() +}) describe('Basic ERC20 interactions', async () => { const initialAmount = 1000 diff --git a/integration-tests/test/fee-payment.spec.ts b/integration-tests/test/fee-payment.spec.ts index 2005c57513c29..471f3c4b09832 100644 --- a/integration-tests/test/fee-payment.spec.ts +++ b/integration-tests/test/fee-payment.spec.ts @@ -3,6 +3,11 @@ import chaiAsPromised from 'chai-as-promised' chai.use(chaiAsPromised) import { BigNumber, utils } from 'ethers' import { OptimismEnv } from './shared/env' +import { DockerComposeNetwork } from './shared/docker-compose' + +before(async () => { + await new DockerComposeNetwork().up() +}) describe('Fee Payment Integration Tests', async () => { let env: OptimismEnv diff --git a/integration-tests/test/native-eth.spec.ts b/integration-tests/test/native-eth.spec.ts index 716749141c121..46df329d6ce97 100644 --- a/integration-tests/test/native-eth.spec.ts +++ b/integration-tests/test/native-eth.spec.ts @@ -2,9 +2,15 @@ import { expect } from 'chai' import { Wallet, utils, BigNumber } from 'ethers' import { Direction } from './shared/watcher-utils' +import { DockerComposeNetwork } from './shared/docker-compose' import { PROXY_SEQUENCER_ENTRYPOINT_ADDRESS } from './shared/utils' import { OptimismEnv } from './shared/env' + +before(async () => { + await new DockerComposeNetwork().up() +}) + describe('Native ETH Integration Tests', async () => { let env: OptimismEnv let l1Bob: Wallet diff --git a/integration-tests/test/ovmcontext.spec.ts b/integration-tests/test/ovmcontext.spec.ts index 1f633a5c487e3..2df824bc58c30 100644 --- a/integration-tests/test/ovmcontext.spec.ts +++ b/integration-tests/test/ovmcontext.spec.ts @@ -8,9 +8,15 @@ import { getAddressManager, } from './shared/utils' import { OptimismEnv } from './shared/env' +import { DockerComposeNetwork } from './shared/docker-compose' import { getContractFactory } from '@eth-optimism/contracts' import { Contract, ContractFactory, Wallet, BigNumber } from 'ethers' + +before(async () => { + await new DockerComposeNetwork().up() +}) + /** * These tests cover the OVM execution contexts. In the OVM execution * of a L1 to L2 transaction, both `block.number` and `block.timestamp` diff --git a/integration-tests/test/queue-ingestion.spec.ts b/integration-tests/test/queue-ingestion.spec.ts index bf252fcf0f0d4..811ed75ec34af 100644 --- a/integration-tests/test/queue-ingestion.spec.ts +++ b/integration-tests/test/queue-ingestion.spec.ts @@ -2,11 +2,16 @@ import { injectL2Context } from '@eth-optimism/core-utils' import { sleep } from './shared/utils' import { OptimismEnv } from './shared/env' +import { DockerComposeNetwork } from './shared/docker-compose' /* Imports: External */ import { providers } from 'ethers' import { expect } from 'chai' +before(async () => { + await new DockerComposeNetwork().up() +}) + // This test ensures that the transactions which get `enqueue`d get // added to the L2 blocks by the Sync Service (which queries the DTL) describe('Queue Ingestion', () => { diff --git a/integration-tests/test/read-proxy-event.spec.ts b/integration-tests/test/read-proxy-event.spec.ts index 85ae6980e1806..bfa6741b9a70a 100644 --- a/integration-tests/test/read-proxy-event.spec.ts +++ b/integration-tests/test/read-proxy-event.spec.ts @@ -4,6 +4,12 @@ import { ethers } from 'hardhat' /* Imports: External */ import { Contract, Wallet } from 'ethers' import { OptimismEnv } from './shared/env' +import { DockerComposeNetwork } from './shared/docker-compose' + + +before(async () => { + await new DockerComposeNetwork().up() +}) describe('Reading events from proxy contracts', () => { let l2Wallet: Wallet diff --git a/integration-tests/test/rpc.spec.ts b/integration-tests/test/rpc.spec.ts index 78c67cddc64bd..f0cfe205af0da 100644 --- a/integration-tests/test/rpc.spec.ts +++ b/integration-tests/test/rpc.spec.ts @@ -1,11 +1,17 @@ + import { injectL2Context } from '@eth-optimism/core-utils' import { Wallet, BigNumber } from 'ethers' import chai, { expect } from 'chai' import { sleep, l2Provider, GWEI } from './shared/utils' import chaiAsPromised from 'chai-as-promised' import { OptimismEnv } from './shared/env' +import { DockerComposeNetwork } from './shared/docker-compose' chai.use(chaiAsPromised) +before(async () => { + await new DockerComposeNetwork().up() +}) + describe('Basic RPC tests', () => { let env: OptimismEnv diff --git a/integration-tests/test/shared/docker-compose.ts b/integration-tests/test/shared/docker-compose.ts new file mode 100644 index 0000000000000..82856b55b6e1a --- /dev/null +++ b/integration-tests/test/shared/docker-compose.ts @@ -0,0 +1,29 @@ +import * as compose from 'docker-compose' +import * as shell from 'shelljs' +import * as path from 'path' + + +type ServiceNames = 'batch_submitter' | 'dtl' | 'l2geth' | 'relayer' + +const OPS_DIRECTORY = path.join(process.cwd(), '../ops') +const DEFAULT_SERVICES: ServiceNames[] = ['batch_submitter', 'dtl', 'l2geth', 'relayer'] + +export class DockerComposeNetwork { + constructor(private readonly services: ServiceNames[] = DEFAULT_SERVICES) {} + + async up() { + const out = await compose.upMany(this.services, {cwd: OPS_DIRECTORY}) + + const {err, exitCode} = out; + + if (!err || exitCode) { + console.error(err) + throw new Error('Unexpected error when starting docker-compose network, dumping output') + } + + if (err.includes('Creating')) { + console.info('🐳 Tests required starting containers. Waiting for sequencer to ready.') + shell.exec(`${OPS_DIRECTORY}/scripts/wait-for-sequencer.sh`, {cwd: OPS_DIRECTORY}) + } + } +} diff --git a/yarn.lock b/yarn.lock index 004891bc3cc66..1a3df96546871 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5058,6 +5058,13 @@ directory-tree@^2.2.7: resolved "https://registry.yarnpkg.com/directory-tree/-/directory-tree-2.2.7.tgz#4617c794ee89d5618f03fffb7486c7e49df52ad2" integrity sha512-fgTad/YdV6Y2njsCRK4fl4ZUlGhmb5xj1qrZUIMjvnrKvghVqh8dkB+OUssjYVvb/Q2L+5+8XG0l5uTGI9/8iQ== +docker-compose@^0.23.8: + version "0.23.8" + resolved "https://registry.yarnpkg.com/docker-compose/-/docker-compose-0.23.8.tgz#475b1e1294821d380316c54277ad350074186c6f" + integrity sha512-uUxjnz77oU+HBwwRYKO/O5a1IywSZbWNayC1+q4e4t3HzKwBHi+5pmIpESjpsEvIVl/HWAC3mPB89NjUNEBWuQ== + dependencies: + yaml "^1.10.2" + dom-walk@^0.1.0: version "0.1.2" resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.2.tgz#0c548bef048f4d1f2a97249002236060daa3fd84" @@ -11663,7 +11670,7 @@ shebang-regex@^3.0.0: resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== -shelljs@^0.8.3: +shelljs@^0.8.3, shelljs@^0.8.4: version "0.8.4" resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.4.tgz#de7684feeb767f8716b326078a8a00875890e3c2" integrity sha512-7gk3UZ9kOfPLIAbslLzyWeGiEqx9e3rxwZM0KE6EL8GlGwjym9Mrlx5/p33bWTu9YG6vcS4MBxYZDHYr5lr8BQ== @@ -14063,7 +14070,7 @@ yallist@^4.0.0: resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== -yaml@^1.10.0: +yaml@^1.10.0, yaml@^1.10.2: version "1.10.2" resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== From 5a1cd418b3eae8e89f0a32145953546e6dcda23f Mon Sep 17 00:00:00 2001 From: Liam Horne Date: Fri, 30 Apr 2021 11:00:13 -0700 Subject: [PATCH 02/81] ci: remove unnecessary step in integration workflow --- .github/workflows/integration.yml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/.github/workflows/integration.yml b/.github/workflows/integration.yml index 01b2a3ee25719..9ea07176243e7 100644 --- a/.github/workflows/integration.yml +++ b/.github/workflows/integration.yml @@ -34,10 +34,6 @@ jobs: working-directory: ./ops run: ./scripts/build-ci.sh - - name: Bring the stack up and wait for the sequencer to be ready - working-directory: ./ops - run: docker-compose up -d && ./scripts/wait-for-sequencer.sh - - name: Run the integration tests working-directory: ./integration-tests run: | From f5c29dddc481e5dd7ea792821dd846798cf8f82f Mon Sep 17 00:00:00 2001 From: Liam Horne Date: Fri, 30 Apr 2021 11:18:11 -0700 Subject: [PATCH 03/81] refactor: use mocha globals for integration test docker setup --- integration-tests/mocha.opts | 1 + .../test/basic-l1-l2-communication.spec.ts | 6 --- integration-tests/test/erc20.spec.ts | 6 --- integration-tests/test/fee-payment.spec.ts | 5 --- integration-tests/test/native-eth.spec.ts | 6 --- integration-tests/test/ovmcontext.spec.ts | 27 +++++++------ .../test/queue-ingestion.spec.ts | 5 --- .../test/read-proxy-event.spec.ts | 6 --- integration-tests/test/rpc.spec.ts | 10 +---- .../test/setup-docker-compose-network.js | 6 +++ .../test/shared/docker-compose.ts | 38 ++++++++++++------- integration-tests/test/shared/utils.ts | 13 +++++-- 12 files changed, 55 insertions(+), 74 deletions(-) create mode 100644 integration-tests/mocha.opts create mode 100644 integration-tests/test/setup-docker-compose-network.js diff --git a/integration-tests/mocha.opts b/integration-tests/mocha.opts new file mode 100644 index 0000000000000..3d063618887b9 --- /dev/null +++ b/integration-tests/mocha.opts @@ -0,0 +1 @@ +--file ./test/setup-docker-compose-network.js \ No newline at end of file diff --git a/integration-tests/test/basic-l1-l2-communication.spec.ts b/integration-tests/test/basic-l1-l2-communication.spec.ts index 1c9c372c1c80c..0af0cb1339cdb 100644 --- a/integration-tests/test/basic-l1-l2-communication.spec.ts +++ b/integration-tests/test/basic-l1-l2-communication.spec.ts @@ -8,12 +8,6 @@ import { Direction } from './shared/watcher-utils' import l1SimpleStorageJson from '../artifacts/contracts/SimpleStorage.sol/SimpleStorage.json' import l2SimpleStorageJson from '../artifacts-ovm/contracts/SimpleStorage.sol/SimpleStorage.json' import { OptimismEnv } from './shared/env' -import { DockerComposeNetwork } from './shared/docker-compose' - - -before(async () => { - await new DockerComposeNetwork().up() -}) describe('Basic L1<>L2 Communication', async () => { let Factory__L1SimpleStorage: ContractFactory diff --git a/integration-tests/test/erc20.spec.ts b/integration-tests/test/erc20.spec.ts index a0c0b8334339c..9eb7105ee0dea 100644 --- a/integration-tests/test/erc20.spec.ts +++ b/integration-tests/test/erc20.spec.ts @@ -3,12 +3,6 @@ import { ethers } from 'hardhat' import { expect } from 'chai' import { GWEI } from './shared/utils' import { OptimismEnv } from './shared/env' -import { DockerComposeNetwork } from './shared/docker-compose' - - -before(async () => { - await new DockerComposeNetwork().up() -}) describe('Basic ERC20 interactions', async () => { const initialAmount = 1000 diff --git a/integration-tests/test/fee-payment.spec.ts b/integration-tests/test/fee-payment.spec.ts index 471f3c4b09832..2005c57513c29 100644 --- a/integration-tests/test/fee-payment.spec.ts +++ b/integration-tests/test/fee-payment.spec.ts @@ -3,11 +3,6 @@ import chaiAsPromised from 'chai-as-promised' chai.use(chaiAsPromised) import { BigNumber, utils } from 'ethers' import { OptimismEnv } from './shared/env' -import { DockerComposeNetwork } from './shared/docker-compose' - -before(async () => { - await new DockerComposeNetwork().up() -}) describe('Fee Payment Integration Tests', async () => { let env: OptimismEnv diff --git a/integration-tests/test/native-eth.spec.ts b/integration-tests/test/native-eth.spec.ts index 46df329d6ce97..716749141c121 100644 --- a/integration-tests/test/native-eth.spec.ts +++ b/integration-tests/test/native-eth.spec.ts @@ -2,15 +2,9 @@ import { expect } from 'chai' import { Wallet, utils, BigNumber } from 'ethers' import { Direction } from './shared/watcher-utils' -import { DockerComposeNetwork } from './shared/docker-compose' import { PROXY_SEQUENCER_ENTRYPOINT_ADDRESS } from './shared/utils' import { OptimismEnv } from './shared/env' - -before(async () => { - await new DockerComposeNetwork().up() -}) - describe('Native ETH Integration Tests', async () => { let env: OptimismEnv let l1Bob: Wallet diff --git a/integration-tests/test/ovmcontext.spec.ts b/integration-tests/test/ovmcontext.spec.ts index 2df824bc58c30..16640b974b1f8 100644 --- a/integration-tests/test/ovmcontext.spec.ts +++ b/integration-tests/test/ovmcontext.spec.ts @@ -8,15 +8,9 @@ import { getAddressManager, } from './shared/utils' import { OptimismEnv } from './shared/env' -import { DockerComposeNetwork } from './shared/docker-compose' import { getContractFactory } from '@eth-optimism/contracts' import { Contract, ContractFactory, Wallet, BigNumber } from 'ethers' - -before(async () => { - await new DockerComposeNetwork().up() -}) - /** * These tests cover the OVM execution contexts. In the OVM execution * of a L1 to L2 transaction, both `block.number` and `block.timestamp` @@ -111,16 +105,21 @@ describe('OVM Context: Layer 2 EVM Context', () => { for (let i = start; i < tip.number; i++) { const block = await L2Provider.getBlockWithTransactions(i) - const [, returnData] = await OVMMulticall.callStatic.aggregate([ - [ - OVMMulticall.address, - OVMMulticall.interface.encodeFunctionData('getCurrentBlockTimestamp'), - ], + const [, returnData] = await OVMMulticall.callStatic.aggregate( [ - OVMMulticall.address, - OVMMulticall.interface.encodeFunctionData('getCurrentBlockNumber'), + [ + OVMMulticall.address, + OVMMulticall.interface.encodeFunctionData( + 'getCurrentBlockTimestamp' + ), + ], + [ + OVMMulticall.address, + OVMMulticall.interface.encodeFunctionData('getCurrentBlockNumber'), + ], ], - ], {blockTag: i}) + { blockTag: i } + ) const timestamp = BigNumber.from(returnData[0]) const blockNumber = BigNumber.from(returnData[1]) diff --git a/integration-tests/test/queue-ingestion.spec.ts b/integration-tests/test/queue-ingestion.spec.ts index 811ed75ec34af..bf252fcf0f0d4 100644 --- a/integration-tests/test/queue-ingestion.spec.ts +++ b/integration-tests/test/queue-ingestion.spec.ts @@ -2,16 +2,11 @@ import { injectL2Context } from '@eth-optimism/core-utils' import { sleep } from './shared/utils' import { OptimismEnv } from './shared/env' -import { DockerComposeNetwork } from './shared/docker-compose' /* Imports: External */ import { providers } from 'ethers' import { expect } from 'chai' -before(async () => { - await new DockerComposeNetwork().up() -}) - // This test ensures that the transactions which get `enqueue`d get // added to the L2 blocks by the Sync Service (which queries the DTL) describe('Queue Ingestion', () => { diff --git a/integration-tests/test/read-proxy-event.spec.ts b/integration-tests/test/read-proxy-event.spec.ts index bfa6741b9a70a..85ae6980e1806 100644 --- a/integration-tests/test/read-proxy-event.spec.ts +++ b/integration-tests/test/read-proxy-event.spec.ts @@ -4,12 +4,6 @@ import { ethers } from 'hardhat' /* Imports: External */ import { Contract, Wallet } from 'ethers' import { OptimismEnv } from './shared/env' -import { DockerComposeNetwork } from './shared/docker-compose' - - -before(async () => { - await new DockerComposeNetwork().up() -}) describe('Reading events from proxy contracts', () => { let l2Wallet: Wallet diff --git a/integration-tests/test/rpc.spec.ts b/integration-tests/test/rpc.spec.ts index f0cfe205af0da..fa8b4c6620d46 100644 --- a/integration-tests/test/rpc.spec.ts +++ b/integration-tests/test/rpc.spec.ts @@ -1,17 +1,11 @@ - import { injectL2Context } from '@eth-optimism/core-utils' import { Wallet, BigNumber } from 'ethers' import chai, { expect } from 'chai' import { sleep, l2Provider, GWEI } from './shared/utils' import chaiAsPromised from 'chai-as-promised' import { OptimismEnv } from './shared/env' -import { DockerComposeNetwork } from './shared/docker-compose' chai.use(chaiAsPromised) -before(async () => { - await new DockerComposeNetwork().up() -}) - describe('Basic RPC tests', () => { let env: OptimismEnv @@ -161,8 +155,8 @@ describe('Basic RPC tests', () => { // 96 bytes * 16 per non zero byte const onesCost = BigNumber.from(96).mul(16) const expectedCost = dataLen - .map(len => BigNumber.from(len).mul(4)) - .map(zerosCost => zerosCost.add(onesCost)) + .map((len) => BigNumber.from(len).mul(4)) + .map((zerosCost) => zerosCost.add(onesCost)) // Repeat this test for a series of possible transaction sizes. for (let i = 0; i < dataLen.length; i++) { diff --git a/integration-tests/test/setup-docker-compose-network.js b/integration-tests/test/setup-docker-compose-network.js new file mode 100644 index 0000000000000..8ebe7fad3379d --- /dev/null +++ b/integration-tests/test/setup-docker-compose-network.js @@ -0,0 +1,6 @@ +const { DockerComposeNetwork } = require("./shared/docker-compose") + + +before(async () => { + await new DockerComposeNetwork().up() +}) \ No newline at end of file diff --git a/integration-tests/test/shared/docker-compose.ts b/integration-tests/test/shared/docker-compose.ts index 82856b55b6e1a..cd4e9468a9e1d 100644 --- a/integration-tests/test/shared/docker-compose.ts +++ b/integration-tests/test/shared/docker-compose.ts @@ -2,28 +2,38 @@ import * as compose from 'docker-compose' import * as shell from 'shelljs' import * as path from 'path' - type ServiceNames = 'batch_submitter' | 'dtl' | 'l2geth' | 'relayer' const OPS_DIRECTORY = path.join(process.cwd(), '../ops') -const DEFAULT_SERVICES: ServiceNames[] = ['batch_submitter', 'dtl', 'l2geth', 'relayer'] +const DEFAULT_SERVICES: ServiceNames[] = [ + 'batch_submitter', + 'dtl', + 'l2geth', + 'relayer', +] export class DockerComposeNetwork { - constructor(private readonly services: ServiceNames[] = DEFAULT_SERVICES) {} + constructor(private readonly services: ServiceNames[] = DEFAULT_SERVICES) {} - async up() { - const out = await compose.upMany(this.services, {cwd: OPS_DIRECTORY}) + async up() { + const out = await compose.upMany(this.services, { cwd: OPS_DIRECTORY }) - const {err, exitCode} = out; + const { err, exitCode } = out - if (!err || exitCode) { - console.error(err) - throw new Error('Unexpected error when starting docker-compose network, dumping output') - } + if (!err || exitCode) { + console.error(err) + throw new Error( + 'Unexpected error when starting docker-compose network, dumping output' + ) + } - if (err.includes('Creating')) { - console.info('🐳 Tests required starting containers. Waiting for sequencer to ready.') - shell.exec(`${OPS_DIRECTORY}/scripts/wait-for-sequencer.sh`, {cwd: OPS_DIRECTORY}) - } + if (err.includes('Creating')) { + console.info( + '🐳 Tests required starting containers. Waiting for sequencer to ready.' + ) + shell.exec(`${OPS_DIRECTORY}/scripts/wait-for-sequencer.sh`, { + cwd: OPS_DIRECTORY, + }) } + } } diff --git a/integration-tests/test/shared/utils.ts b/integration-tests/test/shared/utils.ts index 012bed391f72c..48ca55a5c41b5 100644 --- a/integration-tests/test/shared/utils.ts +++ b/integration-tests/test/shared/utils.ts @@ -18,12 +18,17 @@ import { cleanEnv, str, num } from 'envalid' export const GWEI = BigNumber.from(1e9) const env = cleanEnv(process.env, { - L1_URL: str({ default: "http://localhost:9545" }), - L2_URL: str({ default: "http://localhost:8545" }), + L1_URL: str({ default: 'http://localhost:9545' }), + L2_URL: str({ default: 'http://localhost:8545' }), L1_POLLING_INTERVAL: num({ default: 10 }), L2_POLLING_INTERVAL: num({ default: 10 }), - PRIVATE_KEY: str({ default: '0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80' }), - ADDRESS_MANAGER: str({ default: '0x5FbDB2315678afecb367f032d93F642f64180aa3' }) + PRIVATE_KEY: str({ + default: + '0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80', + }), + ADDRESS_MANAGER: str({ + default: '0x5FbDB2315678afecb367f032d93F642f64180aa3', + }), }) // The hardhat instance From 7e6f39335da5e7dbffca503cbf9621f07f32f466 Mon Sep 17 00:00:00 2001 From: Liam Horne Date: Fri, 30 Apr 2021 12:02:30 -0700 Subject: [PATCH 04/81] build: add --fail and --show-error to usage of curl for awaing service readiness --- ops/scripts/batches.sh | 6 ++++-- ops/scripts/deployer.sh | 2 ++ ops/scripts/dtl.sh | 2 +- ops/scripts/geth.sh | 4 +++- ops/scripts/relayer.sh | 4 +++- 5 files changed, 13 insertions(+), 5 deletions(-) diff --git a/ops/scripts/batches.sh b/ops/scripts/batches.sh index e33ad4e68d69c..afb2eb10626b4 100755 --- a/ops/scripts/batches.sh +++ b/ops/scripts/batches.sh @@ -3,13 +3,15 @@ RETRIES=${RETRIES:-40} if [[ ! -z "$URL" ]]; then # get the addrs from the URL provided - ADDRESSES=$(curl --silent --retry-connrefused --retry $RETRIES --retry-delay 5 $URL) + ADDRESSES=$(curl --fail --show-error --silent --retry-connrefused --retry $RETRIES --retry-delay 5 $URL) # set the env export ADDRESS_MANAGER_ADDRESS=$(echo $ADDRESSES | jq -r '.AddressManager') fi # waits for l2geth to be up -curl --silent \ +curl --fail \ + --show-error \ + --silent \ --retry-connrefused \ --retry $RETRIES \ --retry-delay 1 \ diff --git a/ops/scripts/deployer.sh b/ops/scripts/deployer.sh index 83464f307a279..5d330ecda8afb 100755 --- a/ops/scripts/deployer.sh +++ b/ops/scripts/deployer.sh @@ -6,6 +6,8 @@ JSON='{"jsonrpc":"2.0","id":0,"method":"net_version","params":[]}' # wait for the base layer to be up curl \ + --fail \ + --show-error \ --silent \ -H "Content-Type: application/json" \ --retry-connrefused \ diff --git a/ops/scripts/dtl.sh b/ops/scripts/dtl.sh index 2c9d1d3400fe0..d9407b7ca7bcb 100755 --- a/ops/scripts/dtl.sh +++ b/ops/scripts/dtl.sh @@ -3,7 +3,7 @@ RETRIES=${RETRIES:-60} if [[ ! -z "$URL" ]]; then # get the addrs from the URL provided - ADDRESSES=$(curl --silent --retry-connrefused --retry $RETRIES --retry-delay 5 $URL) + ADDRESSES=$(curl --fail --show-error --silent --retry-connrefused --retry $RETRIES --retry-delay 5 $URL) # set the env export DATA_TRANSPORT_LAYER__ADDRESS_MANAGER=$(echo $ADDRESSES | jq -r '.AddressManager') fi diff --git a/ops/scripts/geth.sh b/ops/scripts/geth.sh index 600221e6ac9c8..1767c0ef386cb 100755 --- a/ops/scripts/geth.sh +++ b/ops/scripts/geth.sh @@ -4,7 +4,7 @@ VERBOSITY=${VERBOSITY:-6} if [[ ! -z "$URL" ]]; then # get the addrs from the URL provided - ADDRESSES=$(curl --silent --retry-connrefused --retry $RETRIES --retry-delay 5 $URL) + ADDRESSES=$(curl --fail --show-error --silent --retry-connrefused --retry $RETRIES --retry-delay 5 $URL) function envSet() { VAR=$1 @@ -25,6 +25,8 @@ fi # wait for the dtl to be up, else geth will crash if it cannot connect curl \ + --fail \ + --show-error \ --silent \ --output /dev/null \ --retry-connrefused \ diff --git a/ops/scripts/relayer.sh b/ops/scripts/relayer.sh index 4996f911561c7..cca456fd4aa58 100755 --- a/ops/scripts/relayer.sh +++ b/ops/scripts/relayer.sh @@ -3,13 +3,15 @@ RETRIES=${RETRIES:-60} if [[ ! -z "$URL" ]]; then # get the addrs from the URL provided - ADDRESSES=$(curl --silent --retry-connrefused --retry $RETRIES --retry-delay 5 $URL) + ADDRESSES=$(curl --fail --show-error --silent --retry-connrefused --retry $RETRIES --retry-delay 5 $URL) # set the env export ADDRESS_MANAGER_ADDRESS=$(echo $ADDRESSES | jq -r '.AddressManager') fi # waits for l2geth to be up curl \ + --fail \ + --show-error \ --silent \ --output /dev/null \ --retry-connrefused \ From 7e38638bf42d99462065b3c84c33300f29e90c00 Mon Sep 17 00:00:00 2001 From: Annie Ke Date: Fri, 30 Apr 2021 15:59:41 -0700 Subject: [PATCH 05/81] feat: add node_env to batch submitter (#678) * add node_env to batch submitter * rename log to logger for service consistency * address review comments * make ETH_NETWORK_NAME to disambiguate * move tx data to debug --- packages/batch-submitter/.env.example | 5 ++ .../src/batch-submitter/batch-submitter.ts | 41 +++++----- .../batch-submitter/state-batch-submitter.ts | 40 +++++---- .../src/batch-submitter/tx-batch-submitter.ts | 82 ++++++++++--------- .../src/exec/run-batch-submitter.ts | 65 ++++++++++----- 5 files changed, 139 insertions(+), 94 deletions(-) diff --git a/packages/batch-submitter/.env.example b/packages/batch-submitter/.env.example index 86e016bbacbfa..54576ac4f2fe0 100644 --- a/packages/batch-submitter/.env.example +++ b/packages/batch-submitter/.env.example @@ -1,7 +1,12 @@ +# Environment +NODE_ENV=development +# Leave blank during local development +ETH_NETWORK_NAME= # Logging & monitoring DEBUG=info*,error*,warn*,debug* # Leave the SENTRY_DSN variable unset during local development SENTRY_DSN= +SENTRY_TRACE_RATE= L1_NODE_WEB3_URL=http://localhost:9545 L2_NODE_WEB3_URL=http://localhost:8545 diff --git a/packages/batch-submitter/src/batch-submitter/batch-submitter.ts b/packages/batch-submitter/src/batch-submitter/batch-submitter.ts index 363bc55e7a909..ea63d34881adc 100644 --- a/packages/batch-submitter/src/batch-submitter/batch-submitter.ts +++ b/packages/batch-submitter/src/batch-submitter/batch-submitter.ts @@ -40,7 +40,7 @@ export abstract class BatchSubmitter { readonly maxGasPriceInGwei: number, readonly gasRetryIncrement: number, readonly gasThresholdInGwei: number, - readonly log: Logger, + readonly logger: Logger, readonly metrics: Metrics ) {} @@ -58,13 +58,13 @@ export abstract class BatchSubmitter { } await this._updateChainInfo() await this._checkBalance() - this.log.info('Readying to submit next batch...', { + this.logger.info('Readying to submit next batch...', { l2ChainId: this.l2ChainId, batchSubmitterAddress: await this.signer.getAddress(), }) if (this.syncing === true) { - this.log.info( + this.logger.info( 'Syncing mode enabled! Skipping batch submission and clearing queue...' ) return this._onSync() @@ -83,13 +83,13 @@ export abstract class BatchSubmitter { const ether = utils.formatEther(balance) const num = parseFloat(ether) - this.log.info('Checked balance', { + this.logger.info('Checked balance', { address, ether, }) if (num < this.minBalanceEther) { - this.log.fatal('Current balance lower than min safe balance', { + this.logger.fatal('Current balance lower than min safe balance', { current: num, safeBalance: this.minBalanceEther, }) @@ -130,7 +130,7 @@ export abstract class BatchSubmitter { currentTimestamp if (batchSizeInBytes < this.minTxSize) { if (!isTimeoutReached) { - this.log.info( + this.logger.info( 'Skipping batch submission. Batch too small & max submission timeout not reached.', { batchSizeInBytes, @@ -141,25 +141,28 @@ export abstract class BatchSubmitter { ) return false } - this.log.info('Timeout reached, proceeding with batch submission.', { + this.logger.info('Timeout reached, proceeding with batch submission.', { batchSizeInBytes, lastBatchSubmissionTimestamp: this.lastBatchSubmissionTimestamp, currentTimestamp, }) return true } - this.log.info('Sufficient batch size, proceeding with batch submission.', { - batchSizeInBytes, - lastBatchSubmissionTimestamp: this.lastBatchSubmissionTimestamp, - currentTimestamp, - }) + this.logger.info( + 'Sufficient batch size, proceeding with batch submission.', + { + batchSizeInBytes, + lastBatchSubmissionTimestamp: this.lastBatchSubmissionTimestamp, + currentTimestamp, + } + ) return true } public static async getReceiptWithResubmission( txFunc: (gasPrice) => Promise, resubmissionConfig: ResubmissionConfig, - log: Logger + logger: Logger ): Promise { const { resubmissionTimeout, @@ -176,7 +179,7 @@ export abstract class BatchSubmitter { delay: resubmissionTimeout, }) - log.debug('Resubmission tx receipt', { receipt }) + logger.debug('Resubmission tx receipt', { receipt }) return receipt } @@ -190,7 +193,7 @@ export abstract class BatchSubmitter { 10 ) if (minGasPriceInGwei > this.maxGasPriceInGwei) { - this.log.warn( + this.logger.warn( 'Minimum gas price is higher than max! Ethereum must be congested...' ) minGasPriceInGwei = this.maxGasPriceInGwei @@ -203,7 +206,7 @@ export abstract class BatchSubmitter { successMessage: string ): Promise { this.lastBatchSubmissionTimestamp = Date.now() - this.log.debug('Waiting for receipt...') + this.logger.debug('Waiting for receipt...') const resubmissionConfig: ResubmissionConfig = { resubmissionTimeout: this.resubmissionTimeout, @@ -215,11 +218,11 @@ export abstract class BatchSubmitter { const receipt = await BatchSubmitter.getReceiptWithResubmission( txFunc, resubmissionConfig, - this.log + this.logger ) - this.log.info('Received transaction receipt', { receipt }) - this.log.info(successMessage) + this.logger.info('Received transaction receipt', { receipt }) + this.logger.info(successMessage) return receipt } } diff --git a/packages/batch-submitter/src/batch-submitter/state-batch-submitter.ts b/packages/batch-submitter/src/batch-submitter/state-batch-submitter.ts index 51e2008f5af71..c1b3fbdaa9d97 100644 --- a/packages/batch-submitter/src/batch-submitter/state-batch-submitter.ts +++ b/packages/batch-submitter/src/batch-submitter/state-batch-submitter.ts @@ -40,7 +40,7 @@ export class StateBatchSubmitter extends BatchSubmitter { maxGasPriceInGwei: number, gasRetryIncrement: number, gasThresholdInGwei: number, - log: Logger, + logger: Logger, metrics: Metrics, fraudSubmissionAddress: string ) { @@ -60,7 +60,7 @@ export class StateBatchSubmitter extends BatchSubmitter { maxGasPriceInGwei, gasRetryIncrement, gasThresholdInGwei, - log, + logger, metrics ) this.fraudSubmissionAddress = fraudSubmissionAddress @@ -73,7 +73,7 @@ export class StateBatchSubmitter extends BatchSubmitter { public async _updateChainInfo(): Promise { const info: RollupInfo = await this._getRollupInfo() if (info.mode === 'verifier') { - this.log.error( + this.logger.error( 'Verifier mode enabled! Batch submitter only compatible with sequencer mode' ) process.exit(1) @@ -88,7 +88,7 @@ export class StateBatchSubmitter extends BatchSubmitter { sccAddress === this.chainContract.address && ctcAddress === this.ctcContract.address ) { - this.log.debug('Chain contract already initialized', { + this.logger.debug('Chain contract already initialized', { sccAddress, ctcAddress, }) @@ -102,7 +102,7 @@ export class StateBatchSubmitter extends BatchSubmitter { await getContractFactory('OVM_CanonicalTransactionChain', this.signer) ).attach(ctcAddress) - this.log.info('Connected Optimism contracts', { + this.logger.info('Connected Optimism contracts', { stateCommitmentChain: this.chainContract.address, canonicalTransactionChain: this.ctcContract.address, }) @@ -110,23 +110,23 @@ export class StateBatchSubmitter extends BatchSubmitter { } public async _onSync(): Promise { - this.log.info('Syncing mode enabled! Skipping state batch submission...') + this.logger.info('Syncing mode enabled! Skipping state batch submission...') return } public async _getBatchStartAndEnd(): Promise { - this.log.info('Getting batch start and end for state batch submitter...') + this.logger.info('Getting batch start and end for state batch submitter...') // TODO: Remove BLOCK_OFFSET by adding a tx to Geth's genesis const startBlock: number = (await this.chainContract.getTotalElements()).toNumber() + BLOCK_OFFSET - this.log.info('Retrieved start block number from SCC', { + this.logger.info('Retrieved start block number from SCC', { startBlock, }) // We will submit state roots for txs which have been in the tx chain for a while. const totalElements: number = (await this.ctcContract.getTotalElements()).toNumber() + BLOCK_OFFSET - this.log.info('Retrieved total elements from CTC', { + this.logger.info('Retrieved total elements from CTC', { totalElements, }) @@ -137,11 +137,11 @@ export class StateBatchSubmitter extends BatchSubmitter { if (startBlock >= endBlock) { if (startBlock > endBlock) { - this.log.error( + this.logger.error( 'State commitment chain is larger than transaction chain. This should never happen!' ) } - this.log.info( + this.logger.info( 'No state commitments to submit. Skipping batch submission...' ) return @@ -162,7 +162,7 @@ export class StateBatchSubmitter extends BatchSubmitter { [batch, startBlock] ) const batchSizeInBytes = remove0x(tx).length / 2 - this.log.debug('State batch generated', { + this.logger.debug('State batch generated', { batchSizeInBytes, tx, }) @@ -172,7 +172,7 @@ export class StateBatchSubmitter extends BatchSubmitter { } const offsetStartsAtIndex = startBlock - BLOCK_OFFSET // TODO: Remove BLOCK_OFFSET by adding a tx to Geth's genesis - this.log.debug('Submitting batch.', { tx }) + this.logger.debug('Submitting batch.', { tx }) const nonce = await this.signer.getTransactionCount() const contractFunction = async (gasPrice): Promise => { @@ -181,11 +181,13 @@ export class StateBatchSubmitter extends BatchSubmitter { offsetStartsAtIndex, { nonce, gasPrice } ) - this.log.info('Submitted appendStateBatch transaction', { + this.logger.info('Submitted appendStateBatch transaction', { nonce, txHash: contractTx.hash, contractAddr: this.chainContract.address, from: contractTx.from, + }) + this.logger.debug('appendStateBatch transaction data', { data: contractTx.data, }) return this.signer.provider.waitForTransaction( @@ -208,13 +210,15 @@ export class StateBatchSubmitter extends BatchSubmitter { const batch: Bytes32[] = await bPromise.map( [...Array(blockRange).keys()], async (i: number) => { - this.log.debug('Fetching L2BatchElement', { blockNo: startBlock + i }) + this.logger.debug('Fetching L2BatchElement', { + blockNo: startBlock + i, + }) const block = (await this.l2Provider.getBlockWithTransactions( startBlock + i )) as L2Block const blockTx = block.transactions[0] if (blockTx.from === this.fraudSubmissionAddress) { - this.log.warn('Found transaction from fraud submission address', { + this.logger.warn('Found transaction from fraud submission address', { txHash: blockTx.hash, fraudSubmissionAddress: this.fraudSubmissionAddress, }) @@ -232,7 +236,7 @@ export class StateBatchSubmitter extends BatchSubmitter { ) while (remove0x(tx).length / 2 > this.maxTxSize) { batch.splice(Math.ceil((batch.length * 2) / 3)) // Delete 1/3rd of all of the batch elements - this.log.debug('Splicing batch...', { + this.logger.debug('Splicing batch...', { batchSizeInBytes: tx.length / 2, }) tx = this.chainContract.interface.encodeFunctionData('appendStateBatch', [ @@ -241,7 +245,7 @@ export class StateBatchSubmitter extends BatchSubmitter { ]) } - this.log.info('Generated state commitment batch', { + this.logger.info('Generated state commitment batch', { batch, // list of stateRoots }) return batch diff --git a/packages/batch-submitter/src/batch-submitter/tx-batch-submitter.ts b/packages/batch-submitter/src/batch-submitter/tx-batch-submitter.ts index 2162c71731f55..2a1c946ec0a84 100644 --- a/packages/batch-submitter/src/batch-submitter/tx-batch-submitter.ts +++ b/packages/batch-submitter/src/batch-submitter/tx-batch-submitter.ts @@ -50,7 +50,7 @@ export class TransactionBatchSubmitter extends BatchSubmitter { maxGasPriceInGwei: number, gasRetryIncrement: number, gasThresholdInGwei: number, - log: Logger, + logger: Logger, metrics: Metrics, disableQueueBatchAppend: boolean, autoFixBatchOptions: AutoFixBatchOptions = { @@ -74,7 +74,7 @@ export class TransactionBatchSubmitter extends BatchSubmitter { maxGasPriceInGwei, gasRetryIncrement, gasThresholdInGwei, - log, + logger, metrics ) this.disableQueueBatchAppend = disableQueueBatchAppend @@ -88,7 +88,7 @@ export class TransactionBatchSubmitter extends BatchSubmitter { public async _updateChainInfo(): Promise { const info: RollupInfo = await this._getRollupInfo() if (info.mode === 'verifier') { - this.log.error( + this.logger.error( 'Verifier mode enabled! Batch submitter only compatible with sequencer mode' ) process.exit(1) @@ -101,7 +101,7 @@ export class TransactionBatchSubmitter extends BatchSubmitter { typeof this.chainContract !== 'undefined' && ctcAddress === this.chainContract.address ) { - this.log.debug('Chain contract already initialized', { + this.logger.debug('Chain contract already initialized', { ctcAddress, }) return @@ -116,7 +116,7 @@ export class TransactionBatchSubmitter extends BatchSubmitter { getContractInterface('OVM_CanonicalTransactionChain'), this.signer ) - this.log.info('Initialized new CTC', { + this.logger.info('Initialized new CTC', { address: this.chainContract.address, }) return @@ -124,12 +124,12 @@ export class TransactionBatchSubmitter extends BatchSubmitter { public async _onSync(): Promise { const pendingQueueElements = await this.chainContract.getNumPendingQueueElements() - this.log.debug('Got number of pending queue elements', { + this.logger.debug('Got number of pending queue elements', { pendingQueueElements, }) if (pendingQueueElements !== 0) { - this.log.info( + this.logger.info( 'Syncing mode enabled! Skipping batch submission and clearing queue elements', { pendingQueueElements } ) @@ -143,11 +143,13 @@ export class TransactionBatchSubmitter extends BatchSubmitter { nonce, gasPrice, }) - this.log.info('Submitted appendQueueBatch transaction', { + this.logger.info('Submitted appendQueueBatch transaction', { nonce, txHash: tx.hash, contractAddr: this.chainContract.address, from: tx.from, + }) + this.logger.debug('appendQueueBatch transaction data', { data: tx.data, }) return this.signer.provider.waitForTransaction( @@ -160,18 +162,18 @@ export class TransactionBatchSubmitter extends BatchSubmitter { return this._submitAndLogTx(contractFunction, 'Cleared queue!') } } - this.log.info('Syncing mode enabled but queue is empty. Skipping...') + this.logger.info('Syncing mode enabled but queue is empty. Skipping...') return } public async _getBatchStartAndEnd(): Promise { - this.log.info( + this.logger.info( 'Getting batch start and end for transaction batch submitter...' ) // TODO: Remove BLOCK_OFFSET by adding a tx to Geth's genesis const startBlock = (await this.chainContract.getTotalElements()).toNumber() + BLOCK_OFFSET - this.log.info('Retrieved start block number from CTC', { + this.logger.info('Retrieved start block number from CTC', { startBlock, }) @@ -180,17 +182,17 @@ export class TransactionBatchSubmitter extends BatchSubmitter { startBlock + this.maxBatchSize, await this.l2Provider.getBlockNumber() ) + 1 // +1 because the `endBlock` is *exclusive* - this.log.info('Retrieved end block number from L2 sequencer', { + this.logger.info('Retrieved end block number from L2 sequencer', { endBlock, }) if (startBlock >= endBlock) { if (startBlock > endBlock) { - this.log + this.logger .error(`More chain elements in L1 (${startBlock}) than in the L2 node (${endBlock}). This shouldn't happen because we don't submit batches if the sequencer is syncing.`) } - this.log.info('No txs to submit. Skipping batch submission...') + this.logger.info('No txs to submit. Skipping batch submission...') return } return { @@ -209,7 +211,7 @@ export class TransactionBatchSubmitter extends BatchSubmitter { 10 ) if (gasPriceInGwei > this.gasThresholdInGwei) { - this.log.warn( + this.logger.warn( 'Gas price is higher than gas price threshold; aborting batch submission', { gasPriceInGwei, @@ -224,7 +226,7 @@ export class TransactionBatchSubmitter extends BatchSubmitter { wasBatchTruncated, ] = await this._generateSequencerBatchParams(startBlock, endBlock) const batchSizeInBytes = encodeAppendSequencerBatch(batchParams).length / 2 - this.log.debug('Sequencer batch generated', { + this.logger.debug('Sequencer batch generated', { batchSizeInBytes, }) @@ -236,7 +238,7 @@ export class TransactionBatchSubmitter extends BatchSubmitter { return } const l1tipHeight = await this.signer.provider.getBlockNumber() - this.log.debug('Submitting batch.', { + this.logger.debug('Submitting batch.', { calldata: batchParams, l1tipHeight, }) @@ -247,11 +249,13 @@ export class TransactionBatchSubmitter extends BatchSubmitter { nonce, gasPrice, }) - this.log.info('Submitted appendSequencerBatch transaction', { + this.logger.info('Submitted appendSequencerBatch transaction', { nonce, txHash: tx.hash, contractAddr: this.chainContract.address, from: tx.from, + }) + this.logger.debug('appendSequencerBatch transaction data', { data: tx.data, }) return this.signer.provider.waitForTransaction( @@ -275,7 +279,9 @@ export class TransactionBatchSubmitter extends BatchSubmitter { let batch: Batch = await bPromise.map( [...Array(blockRange).keys()], (i) => { - this.log.debug('Fetching L2BatchElement', { blockNo: startBlock + i }) + this.logger.debug('Fetching L2BatchElement', { + blockNo: startBlock + i, + }) return this._getL2BatchElement(startBlock + i) }, { concurrency: 100 } @@ -284,7 +290,7 @@ export class TransactionBatchSubmitter extends BatchSubmitter { // Fix our batches if we are configured to. TODO: Remove this. batch = await this._fixBatch(batch) if (!(await this._validateBatch(batch))) { - this.log.error('Batch is malformed! Cannot submit next batch!') + this.logger.error('Batch is malformed! Cannot submit next batch!') throw new Error('Batch is malformed! Cannot submit next batch!') } let sequencerBatchParams = await this._getSequencerBatchParams( @@ -294,7 +300,7 @@ export class TransactionBatchSubmitter extends BatchSubmitter { let wasBatchTruncated = false let encoded = encodeAppendSequencerBatch(sequencerBatchParams) while (encoded.length / 2 > this.maxTxSize) { - this.log.debug('Splicing batch...', { + this.logger.debug('Splicing batch...', { batchSizeInBytes: encoded.length / 2, }) batch.splice(Math.ceil((batch.length * 2) / 3)) // Delete 1/3rd of all of the batch elements @@ -309,7 +315,7 @@ export class TransactionBatchSubmitter extends BatchSubmitter { wasBatchTruncated = true } - this.log.info('Generated sequencer batch params', { + this.logger.info('Generated sequencer batch params', { contexts: sequencerBatchParams.contexts, transactions: sequencerBatchParams.transactions, wasBatchTruncated, @@ -324,9 +330,9 @@ export class TransactionBatchSubmitter extends BatchSubmitter { // Verify all of the queue elements are what we expect let nextQueueIndex = await this.chainContract.getNextQueueIndex() for (const ele of batch) { - this.log.debug('Verifying batch element', { ele }) + this.logger.debug('Verifying batch element', { ele }) if (!ele.isSequencerTx) { - this.log.debug('Checking queue equality against L1 queue index', { + this.logger.debug('Checking queue equality against L1 queue index', { nextQueueIndex, }) if (!(await this._doesQueueElementMatchL1(nextQueueIndex, ele))) { @@ -341,11 +347,13 @@ export class TransactionBatchSubmitter extends BatchSubmitter { let lastBlockNumber: number for (const ele of batch) { if (ele.timestamp < lastTimestamp) { - this.log.error('Timestamp monotonicity violated! Element', { ele }) + this.logger.error('Timestamp monotonicity violated! Element', { ele }) return false } if (ele.blockNumber < lastBlockNumber) { - this.log.error('Block Number monotonicity violated! Element', { ele }) + this.logger.error('Block Number monotonicity violated! Element', { + ele, + }) return false } lastTimestamp = ele.timestamp @@ -359,7 +367,7 @@ export class TransactionBatchSubmitter extends BatchSubmitter { queueElement: BatchElement ): Promise { const logEqualityError = (name, index, expected, got) => { - this.log.error('Observed mismatched values', { + this.logger.error('Observed mismatched values', { index, expected, got, @@ -410,7 +418,7 @@ export class TransactionBatchSubmitter extends BatchSubmitter { for (const ele of b) { if (!ele.isSequencerTx) { if (!(await this._doesQueueElementMatchL1(nextQueueIndex, ele))) { - this.log.warn('Fixing double played queue element.', { + this.logger.warn('Fixing double played queue element.', { nextQueueIndex, }) fixedBatch.push(await this._fixQueueElement(nextQueueIndex, ele)) @@ -425,7 +433,7 @@ export class TransactionBatchSubmitter extends BatchSubmitter { // TODO: Remove this super complex logic and rely on Geth to actually supply correct block data. const fixMonotonicity = async (b: Batch): Promise => { - this.log.debug('Fixing monotonicity...') + this.logger.debug('Fixing monotonicity...') // The earliest allowed timestamp/blockNumber is the last timestamp submitted on chain. const { lastTimestamp, @@ -433,7 +441,7 @@ export class TransactionBatchSubmitter extends BatchSubmitter { } = await this._getLastTimestampAndBlockNumber() let earliestTimestamp = lastTimestamp let earliestBlockNumber = lastBlockNumber - this.log.debug('Determined earliest timestamp and blockNumber', { + this.logger.debug('Determined earliest timestamp and blockNumber', { earliestTimestamp, earliestBlockNumber, }) @@ -466,7 +474,7 @@ export class TransactionBatchSubmitter extends BatchSubmitter { } // Actually update the latest timestamp and block number await updateLatestTimestampAndBlockNumber() - this.log.debug('Determined latest timestamp and blockNumber', { + this.logger.debug('Determined latest timestamp and blockNumber', { latestTimestamp, latestBlockNumber, }) @@ -488,7 +496,7 @@ export class TransactionBatchSubmitter extends BatchSubmitter { ele.timestamp < earliestTimestamp || ele.blockNumber < earliestBlockNumber ) { - this.log.error('Fixing timestamp/blockNumber too small', { + this.logger.error('Fixing timestamp/blockNumber too small', { oldTimestamp: ele.timestamp, newTimestamp: earliestTimestamp, oldBlockNumber: ele.blockNumber, @@ -506,7 +514,7 @@ export class TransactionBatchSubmitter extends BatchSubmitter { ele.timestamp > latestTimestamp || ele.blockNumber > latestBlockNumber ) { - this.log.error('Fixing timestamp/blockNumber too large.', { + this.logger.error('Fixing timestamp/blockNumber too large.', { oldTimestamp: ele.timestamp, newTimestamp: latestTimestamp, oldBlockNumber: ele.blockNumber, @@ -563,7 +571,7 @@ export class TransactionBatchSubmitter extends BatchSubmitter { const nextQueueIndex = meta.slice(-20, -10) const lastTimestamp = parseInt(meta.slice(-30, -20), 16) const lastBlockNumber = parseInt(meta.slice(-40, -30), 16) - this.log.debug('Retrieved timestamp and block number from CTC', { + this.logger.debug('Retrieved timestamp and block number from CTC', { lastTimestamp, lastBlockNumber, }) @@ -585,7 +593,7 @@ export class TransactionBatchSubmitter extends BatchSubmitter { timestamp > queueElement.timestamp && blockNumber > queueElement.blockNumber ) { - this.log.warn( + this.logger.warn( 'Double deposit detected. Fixing by skipping the deposit & replacing with a dummy tx.', { timestamp, @@ -607,7 +615,7 @@ export class TransactionBatchSubmitter extends BatchSubmitter { timestamp < queueElement.timestamp && blockNumber < queueElement.blockNumber ) { - this.log.error('A deposit seems to have been skipped!') + this.logger.error('A deposit seems to have been skipped!') throw new Error('Skipped deposit?!') } throw new Error('Unable to fix queue element!') @@ -691,7 +699,7 @@ export class TransactionBatchSubmitter extends BatchSubmitter { private async _getL2BatchElement(blockNumber: number): Promise { const block = await this._getBlock(blockNumber) - this.log.debug('Fetched L2 block', { + this.logger.debug('Fetched L2 block', { block, }) diff --git a/packages/batch-submitter/src/exec/run-batch-submitter.ts b/packages/batch-submitter/src/exec/run-batch-submitter.ts index d0fc2314a1956..82609858052df 100644 --- a/packages/batch-submitter/src/exec/run-batch-submitter.ts +++ b/packages/batch-submitter/src/exec/run-batch-submitter.ts @@ -16,19 +16,34 @@ import { TX_BATCH_SUBMITTER_LOG_TAG, } from '..' +const environment = process.env.NODE_ENV +const network = process.env.ETH_NETWORK_NAME +const release = `batch-submitter@${process.env.npm_package_version}` + /* Logger */ const name = 'oe:batch_submitter:init' -const log = new Logger({ - name, - sentryOptions: { - release: `batch-submitter@${process.env.npm_package_version}`, - dsn: process.env.SENTRY_DSN, - tracesSampleRate: 0.05, - }, -}) +let logger + +if (network) { + // Initialize Sentry for Batch Submitter deployed to a network + logger = new Logger({ + name, + sentryOptions: { + release, + dsn: process.env.SENTRY_DSN, + tracesSampleRate: parseInt(process.env.SENTRY_TRACE_RATE, 10) || 0.05, + environment: network, // separate our Sentry errors by network instead of node environment + }, + }) +} else { + // Skip initializing Sentry + logger = new Logger({ name }) +} + /* Metrics */ const metrics = new Metrics({ prefix: name, + labels: { environment, release, network }, }) interface RequiredEnvVars { @@ -115,11 +130,11 @@ const autoFixBatchOptions: AutoFixBatchOptions = { } export const run = async () => { - log.info('Starting batch submitter...') + logger.info('Starting batch submitter...') for (const [i, val] of Object.entries(requiredEnvVars)) { if (!process.env[val]) { - log.warn('Missing environment variable', { + logger.warn('Missing environment variable', { varName: val, }) exit(1) @@ -144,7 +159,7 @@ export const run = async () => { } const address = await sequencerSigner.getAddress() - log.info('Configured batch submitter addresses', { + logger.info('Configured batch submitter addresses', { batchSubmitterAddress: address, addressManagerAddress: requiredEnvVars.ADDRESS_MANAGER_ADDRESS, }) @@ -164,8 +179,11 @@ export const run = async () => { MAX_GAS_PRICE_IN_GWEI, GAS_RETRY_INCREMENT, GAS_THRESHOLD_IN_GWEI, - log.child({ name: TX_BATCH_SUBMITTER_LOG_TAG }), - new Metrics({ prefix: TX_BATCH_SUBMITTER_LOG_TAG }), + logger.child({ name: TX_BATCH_SUBMITTER_LOG_TAG }), + new Metrics({ + prefix: TX_BATCH_SUBMITTER_LOG_TAG, + labels: { environment, release, network }, + }), DISABLE_QUEUE_BATCH_APPEND, autoFixBatchOptions ) @@ -186,8 +204,11 @@ export const run = async () => { MAX_GAS_PRICE_IN_GWEI, GAS_RETRY_INCREMENT, GAS_THRESHOLD_IN_GWEI, - log.child({ name: STATE_BATCH_SUBMITTER_LOG_TAG }), - new Metrics({ prefix: STATE_BATCH_SUBMITTER_LOG_TAG }), + logger.child({ name: STATE_BATCH_SUBMITTER_LOG_TAG }), + new Metrics({ + prefix: STATE_BATCH_SUBMITTER_LOG_TAG, + labels: { environment, release, network }, + }), FRAUD_SUBMISSION_ADDRESS ) @@ -201,18 +222,22 @@ export const run = async () => { const pendingTxs = await sequencerSigner.getTransactionCount('pending') const latestTxs = await sequencerSigner.getTransactionCount('latest') if (pendingTxs > latestTxs) { - log.info('Detected pending transactions. Clearing all transactions!') + logger.info( + 'Detected pending transactions. Clearing all transactions!' + ) for (let i = latestTxs; i < pendingTxs; i++) { const response = await sequencerSigner.sendTransaction({ to: await sequencerSigner.getAddress(), value: 0, nonce: i, }) - log.info('Submitted empty transaction', { + logger.info('Submitted empty transaction', { nonce: i, txHash: response.hash, to: response.to, from: response.from, + }) + logger.debug('empty transaction data', { data: response.data, }) await sequencerSigner.provider.waitForTransaction( @@ -222,7 +247,7 @@ export const run = async () => { } } } catch (err) { - log.error('Cannot clear transactions', { err }) + logger.error('Cannot clear transactions', { err }) process.exit(1) } } @@ -231,8 +256,8 @@ export const run = async () => { try { await func() } catch (err) { - log.error('Error submitting batch', { err }) - log.info('Retrying...') + logger.error('Error submitting batch', { err }) + logger.info('Retrying...') } // Sleep await new Promise((r) => From f6df843bea54f0ac056c9ebeff1b5615dc1ffbb8 Mon Sep 17 00:00:00 2001 From: ben-chain Date: Sat, 1 May 2021 02:24:18 -0700 Subject: [PATCH 06/81] chore: use primary ovm-solc (#723) --- packages/contracts/hardhat.config.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/contracts/hardhat.config.ts b/packages/contracts/hardhat.config.ts index 26a9bfe9c3d83..1708509fde72f 100644 --- a/packages/contracts/hardhat.config.ts +++ b/packages/contracts/hardhat.config.ts @@ -53,7 +53,7 @@ const config: HardhatUserConfig = { }, }, ovm: { - solcVersion: '0.7.6-allow_kall_2', // temporary until we fix the build for 0.7.6 + solcVersion: '0.7.6', }, typechain: { outDir: 'dist/types', From cc4b096824abacc9e99d25e00da45e88dca42f0c Mon Sep 17 00:00:00 2001 From: Liam Horne Date: Sun, 2 May 2021 03:26:01 -0700 Subject: [PATCH 07/81] fix: ensure hardhat does not fail if no input sources provided (#688) * fix: ensure hardhat does not fail if no input sources provided * lint: fix * chore: add changeset Co-authored-by: smartcontracts Co-authored-by: Georgios Konstantopoulos --- .changeset/olive-fishes-share.md | 5 +++++ packages/hardhat-ovm/src/index.ts | 2 ++ 2 files changed, 7 insertions(+) create mode 100644 .changeset/olive-fishes-share.md diff --git a/.changeset/olive-fishes-share.md b/.changeset/olive-fishes-share.md new file mode 100644 index 0000000000000..9827b08302ec3 --- /dev/null +++ b/.changeset/olive-fishes-share.md @@ -0,0 +1,5 @@ +--- +'@eth-optimism/hardhat-ovm': patch +--- + +Ensure hardhat does not fail if no input sources provided diff --git a/packages/hardhat-ovm/src/index.ts b/packages/hardhat-ovm/src/index.ts index 7ac54e3d301f8..8f8659318a20e 100644 --- a/packages/hardhat-ovm/src/index.ts +++ b/packages/hardhat-ovm/src/index.ts @@ -161,6 +161,8 @@ subtask( } } + if (Object.keys(ovmInput.sources).length === 0) return {} + // Build both inputs separately. const ovmOutput = await hre.run(TASK_COMPILE_SOLIDITY_RUN_SOLCJS, { input: ovmInput, From 9bbe8be5eb42f5c78b0b9ed2467ef9a620b86a9f Mon Sep 17 00:00:00 2001 From: Liam Horne Date: Sun, 2 May 2021 19:36:13 -0700 Subject: [PATCH 08/81] build: make erc20 example private (#729) --- examples/waffle/package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/examples/waffle/package.json b/examples/waffle/package.json index 3767e78319b0d..c7d500d7e19fd 100644 --- a/examples/waffle/package.json +++ b/examples/waffle/package.json @@ -20,6 +20,7 @@ "ERC20", "waffle" ], + "private": true, "homepage": "https://github.com/ethereum-optimism/ERC20-Example#readme", "license": "MIT", "author": "Optimism PBC", From b2724d377ffeac25f0af6378cf3669267d9f4fba Mon Sep 17 00:00:00 2001 From: Liam Horne Date: Sun, 2 May 2021 20:20:38 -0700 Subject: [PATCH 09/81] build: add set -e to various bash scripts that we want to error loudly (#718) * build: add set -e to various bash scripts that we want to error loudly * build: use sh and remove set -e for geth.sh --- ops/scripts/batches.sh | 3 +++ ops/scripts/dtl.sh | 3 +++ ops/scripts/geth.sh | 6 +++++- ops/scripts/relayer.sh | 3 +++ 4 files changed, 14 insertions(+), 1 deletion(-) diff --git a/ops/scripts/batches.sh b/ops/scripts/batches.sh index afb2eb10626b4..09c77db93c5c3 100755 --- a/ops/scripts/batches.sh +++ b/ops/scripts/batches.sh @@ -1,4 +1,7 @@ #!/bin/bash + +set -e + RETRIES=${RETRIES:-40} if [[ ! -z "$URL" ]]; then diff --git a/ops/scripts/dtl.sh b/ops/scripts/dtl.sh index d9407b7ca7bcb..7b97b0fa89c8e 100755 --- a/ops/scripts/dtl.sh +++ b/ops/scripts/dtl.sh @@ -1,4 +1,7 @@ #!/bin/bash + +set -e + RETRIES=${RETRIES:-60} if [[ ! -z "$URL" ]]; then diff --git a/ops/scripts/geth.sh b/ops/scripts/geth.sh index 1767c0ef386cb..2022d892f55f9 100755 --- a/ops/scripts/geth.sh +++ b/ops/scripts/geth.sh @@ -1,4 +1,8 @@ -#!/bin/bash +#!/bin/sh + +# FIXME: Cannot use set -e since bash is not installed in Dockerfile +# set -e + RETRIES=${RETRIES:-40} VERBOSITY=${VERBOSITY:-6} diff --git a/ops/scripts/relayer.sh b/ops/scripts/relayer.sh index cca456fd4aa58..fddd0f48f94dd 100755 --- a/ops/scripts/relayer.sh +++ b/ops/scripts/relayer.sh @@ -1,4 +1,7 @@ #!/bin/bash + +set -e + RETRIES=${RETRIES:-60} if [[ ! -z "$URL" ]]; then From 562266063f6bea20fdb94fbf0b4ebd3767e678e7 Mon Sep 17 00:00:00 2001 From: Georgios Konstantopoulos Date: Mon, 3 May 2021 15:30:51 +0300 Subject: [PATCH 10/81] Dockerize Integration Tests (#670) * test: add docker image for integration tests * feat: add to docker-compose with scale 0 * ci: run and publish integration tests to dockerhub * test: add option to not bring network up for docker integration tests * chore: add --fail --show-error to curl --- .github/workflows/integration.yml | 17 +++++------- .github/workflows/release.yml | 27 +++++++++++++++++++ integration-tests/hardhat.config.ts | 2 +- .../test/setup-docker-compose-network.js | 6 +++-- ops/docker-compose.yml | 15 +++++++++++ ops/docker/Dockerfile.integration-tests | 26 ++++++++++++++++++ ops/docker/Dockerfile.monorepo | 5 ++++ ops/scripts/build-ci.sh | 2 +- ops/scripts/integration-tests.sh | 26 ++++++++++++++++++ 9 files changed, 111 insertions(+), 15 deletions(-) create mode 100644 ops/docker/Dockerfile.integration-tests create mode 100755 ops/scripts/integration-tests.sh diff --git a/.github/workflows/integration.yml b/.github/workflows/integration.yml index 9ea07176243e7..4d3f6c8d36dd9 100644 --- a/.github/workflows/integration.yml +++ b/.github/workflows/integration.yml @@ -34,18 +34,13 @@ jobs: working-directory: ./ops run: ./scripts/build-ci.sh - - name: Run the integration tests - working-directory: ./integration-tests - run: | - yarn build:contracts - yarn build:contracts:ovm - yarn test:integration - env: - FORCE_COLOR: 1 - ENABLE_GAS_REPORT: 1 + - name: Bring the stack up + working-directory: ./ops + run: docker-compose up -d - - name: Print gas report - run: cat integration-tests/gas-report.txt + - name: Run the integration tests + working-directory: ./ops + run: docker-compose run integration_tests # Examples Tests - name: Test & deploy hardhat-example on hardhat (regression) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 599f5382aaed8..2bdc59c027b47 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -104,6 +104,7 @@ jobs: message-relayer: ${{ needs.release.outputs.message-relayer }} data-transport-layer: ${{ needs.release.outputs.data-transport-layer }} contracts: ${{ needs.release.outputs.contracts }} + integration-tests: ${{ needs.release.outputs.integration-tests }} steps: - name: Checkout @@ -228,3 +229,29 @@ jobs: file: ./ops/docker/Dockerfile.deployer push: true tags: ethereumoptimism/deployer:${{ needs.builder.outputs.contracts }} + + integration_tests: + name: Publish Integration tests ${{ needs.builder.outputs.integration-tests }} + needs: builder + if: needs.builder.outputs.integration-tests != '' + runs-on: ubuntu-latest + + steps: + - name: Checkout + uses: actions/checkout@v2 + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v1 + + - name: Login to Docker Hub + uses: docker/login-action@v1 + with: + username: ${{ secrets.DOCKERHUB_ACCESS_TOKEN_USERNAME }} + password: ${{ secrets.DOCKERHUB_ACCESS_TOKEN_SECRET }} + + - name: Build and push + uses: docker/build-push-action@v2 + with: + context: . + file: ./ops/docker/Dockerfile.integration-tests + push: true + tags: ethereumoptimism/integration-tests:${{ needs.builder.outputs.integration-tests }} diff --git a/integration-tests/hardhat.config.ts b/integration-tests/hardhat.config.ts index 7e71745b1de8e..722e35e9604b3 100644 --- a/integration-tests/hardhat.config.ts +++ b/integration-tests/hardhat.config.ts @@ -13,7 +13,7 @@ const config: HardhatUserConfig = { }, networks: { optimism: { - url: 'http://localhost:8545', + url: process.env.L2_URL || 'http://localhost:8545', ovm: true, }, }, diff --git a/integration-tests/test/setup-docker-compose-network.js b/integration-tests/test/setup-docker-compose-network.js index 8ebe7fad3379d..96b73cb7a5bf7 100644 --- a/integration-tests/test/setup-docker-compose-network.js +++ b/integration-tests/test/setup-docker-compose-network.js @@ -2,5 +2,7 @@ const { DockerComposeNetwork } = require("./shared/docker-compose") before(async () => { - await new DockerComposeNetwork().up() -}) \ No newline at end of file + if (!process.env.NO_NETWORK) { + await new DockerComposeNetwork().up() + } +}) diff --git a/ops/docker-compose.yml b/ops/docker-compose.yml index 0c8d9e2e19bf5..b0f3ed6a59fc6 100644 --- a/ops/docker-compose.yml +++ b/ops/docker-compose.yml @@ -128,3 +128,18 @@ services: L2_NODE_WEB3_URL: http://l2geth:8545 URL: http://deployer:8081/addresses.json SEQUENCER_PRIVATE_KEY: "0x59c6995e998f97a5a0044966f0945389dc9e86dae88c7a8412f4603b6b78690d" + + integration_tests: + image: ethereumoptimism/integration-tests + deploy: + replicas: 0 + build: + context: .. + dockerfile: ./ops/docker/Dockerfile.integration-tests + entrypoint: ./integration-tests.sh + environment: + L1_URL: http://l1_chain:8545 + L2_URL: http://l2geth:8545 + URL: http://deployer:8081/addresses.json + ENABLE_GAS_REPORT: 1 + NO_NETWORK: 1 diff --git a/ops/docker/Dockerfile.integration-tests b/ops/docker/Dockerfile.integration-tests new file mode 100644 index 0000000000000..98401b4353130 --- /dev/null +++ b/ops/docker/Dockerfile.integration-tests @@ -0,0 +1,26 @@ +FROM ethereumoptimism/builder AS builder + +FROM node:14-alpine + +RUN apk add --no-cache git curl python bash jq + +WORKDIR /opt/optimism/ + +COPY --from=builder /optimism/*.json /optimism/yarn.lock ./ +COPY --from=builder /optimism/node_modules ./node_modules + +# copy deps (would have been nice if docker followed the symlinks required) +COPY --from=builder /optimism/packages/core-utils/package.json ./packages/core-utils/package.json +COPY --from=builder /optimism/packages/core-utils/dist ./packages/core-utils/dist + +COPY --from=builder /optimism/packages/hardhat-ovm/package.json ./packages/hardhat-ovm/package.json +COPY --from=builder /optimism/packages/hardhat-ovm/dist ./packages/hardhat-ovm/dist + +COPY --from=builder /optimism/packages/contracts ./packages/contracts + +# get the needed built artifacts +WORKDIR /opt/optimism/integration-tests +COPY --from=builder /optimism/integration-tests ./ + +COPY ./ops/scripts/integration-tests.sh ./ +ENTRYPOINT yarn test:integration diff --git a/ops/docker/Dockerfile.monorepo b/ops/docker/Dockerfile.monorepo index 290c62f52ad5b..abbac5072efc6 100644 --- a/ops/docker/Dockerfile.monorepo +++ b/ops/docker/Dockerfile.monorepo @@ -32,6 +32,7 @@ COPY packages/contracts/package.json ./packages/contracts/package.json COPY packages/data-transport-layer/package.json ./packages/data-transport-layer/package.json COPY packages/batch-submitter/package.json ./packages/batch-submitter/package.json COPY packages/message-relayer/package.json ./packages/message-relayer/package.json +COPY integration-tests/package.json ./integration-tests/package.json RUN yarn install --frozen-lockfile @@ -45,17 +46,21 @@ WORKDIR /optimism # code changes COPY --from=builder /optimism/node_modules ./node_modules COPY --from=builder /optimism/packages ./packages +COPY --from=builder /optimism/integration-tests ./integration-tests # the following steps are cheap COPY *.json yarn.lock ./ # copy over the source COPY ./packages ./packages +COPY ./integration-tests ./integration-tests # copy over solc to save time building (35+ seconds vs not doing this step) COPY --from=downloader solc /root/.cache/hardhat-nodejs/compilers/linux-amd64/solc-linux-amd64-v0.7.6+commit.7338295f COPY --from=downloader ovm-solc /root/.cache/hardhat-nodejs/compilers/ovm/0.7.6.js # build it! RUN yarn build +# build integration tests' contracts +RUN yarn workspace @eth-optimism/integration-tests build:integration # get the dump RUN yarn --cwd ./packages/contracts ts-node bin/take-dump.ts diff --git a/ops/scripts/build-ci.sh b/ops/scripts/build-ci.sh index 8e168236ed087..093506657d6ba 100755 --- a/ops/scripts/build-ci.sh +++ b/ops/scripts/build-ci.sh @@ -1,7 +1,7 @@ # build in 2 steps function build_images() { docker-compose build --parallel -- builder l2geth l1_chain - docker-compose build --parallel -- deployer dtl batch_submitter relayer + docker-compose build --parallel -- deployer dtl batch_submitter relayer integration_test } function build_dependencies() { diff --git a/ops/scripts/integration-tests.sh b/ops/scripts/integration-tests.sh new file mode 100755 index 0000000000000..f4564525837ea --- /dev/null +++ b/ops/scripts/integration-tests.sh @@ -0,0 +1,26 @@ +#!/bin/bash +set -e + +RETRIES=${RETRIES:-60} +JSON='{"jsonrpc":"2.0","id":0,"method":"rollup_getInfo","params":[]}' + +if [[ ! -z "$URL" ]]; then + # get the addrs from the URL provided + ADDRESSES=$(curl --fail --show-error --silent --retry-connrefused --retry $RETRIES --retry-delay 5 $URL) + export ADDRESS_MANAGER=$(echo $ADDRESSES | jq -r '.AddressManager') +fi + +# wait for the sequencer to be up +curl \ + --silent \ + --fail \ + --show-error \ + -H "Content-Type: application/json" \ + --retry-connrefused \ + --retry $RETRIES \ + --retry-delay 3 \ + -d $JSON \ + --output /dev/null \ + $L2_URL + +npx hardhat test --network optimism --no-compile From d32d91557633a776a2c214e575e576dd7e399d37 Mon Sep 17 00:00:00 2001 From: Georgios Konstantopoulos Date: Mon, 3 May 2021 22:22:50 +0300 Subject: [PATCH 11/81] fix(hh-ovm): defaults to 0 gasPrice if none provided (#734) * fix(hh-ovm): defaults to 0 gasPrice if none provided * chore: add changeset --- .changeset/dry-bugs-relax.md | 5 +++++ packages/hardhat-ovm/src/index.ts | 5 ++++- 2 files changed, 9 insertions(+), 1 deletion(-) create mode 100644 .changeset/dry-bugs-relax.md diff --git a/.changeset/dry-bugs-relax.md b/.changeset/dry-bugs-relax.md new file mode 100644 index 0000000000000..be7ff09c0932a --- /dev/null +++ b/.changeset/dry-bugs-relax.md @@ -0,0 +1,5 @@ +--- +'@eth-optimism/hardhat-ovm': patch +--- + +default to 0 gasPrice if none provided in the network config diff --git a/packages/hardhat-ovm/src/index.ts b/packages/hardhat-ovm/src/index.ts index 8f8659318a20e..032cfe70e3798 100644 --- a/packages/hardhat-ovm/src/index.ts +++ b/packages/hardhat-ovm/src/index.ts @@ -222,8 +222,11 @@ extendEnvironment(async (hre) => { (hre as any).ethers.provider.url ) provider.pollingInterval = interval + + // the gas price is overriden to the user provided gasPrice or to 0. provider.getGasPrice = async () => - ethers.BigNumber.from(hre.network.config.gasPrice) + ethers.BigNumber.from(hre.network.config.gasPrice || 0) + ;(hre as any).ethers.provider = provider // if the node is up, override the getSigners method's signers From 20df7459284fe5a5bc42aa0608d8b7922a7bfb41 Mon Sep 17 00:00:00 2001 From: Mark Tyneway Date: Mon, 3 May 2021 15:32:47 -0700 Subject: [PATCH 12/81] l2geth: docall protect nil block (#736) * l2geth: protect nil in eth_call * chore: add changeset --- .changeset/forty-hotels-brake.md | 5 +++++ l2geth/internal/ethapi/api.go | 16 +++++++++------- 2 files changed, 14 insertions(+), 7 deletions(-) create mode 100644 .changeset/forty-hotels-brake.md diff --git a/.changeset/forty-hotels-brake.md b/.changeset/forty-hotels-brake.md new file mode 100644 index 0000000000000..da742376623f4 --- /dev/null +++ b/.changeset/forty-hotels-brake.md @@ -0,0 +1,5 @@ +--- +'@eth-optimism/l2geth': patch +--- + +Protect a possible `nil` reference in `eth_call` when the blockchain is empty diff --git a/l2geth/internal/ethapi/api.go b/l2geth/internal/ethapi/api.go index a3f0688f27270..2f3f9940e082a 100644 --- a/l2geth/internal/ethapi/api.go +++ b/l2geth/internal/ethapi/api.go @@ -937,14 +937,16 @@ func DoCall(ctx context.Context, b Backend, args CallArgs, blockNrOrHash rpc.Blo if err != nil { return nil, 0, false, err } - txs := block.Transactions() - if header.Number.Uint64() != 0 { - if len(txs) != 1 { - return nil, 0, false, fmt.Errorf("block %d has more than 1 transaction", header.Number.Uint64()) + if block != nil { + txs := block.Transactions() + if header.Number.Uint64() != 0 { + if len(txs) != 1 { + return nil, 0, false, fmt.Errorf("block %d has more than 1 transaction", header.Number.Uint64()) + } + tx := txs[0] + blockNumber = tx.L1BlockNumber() + timestamp = new(big.Int).SetUint64(tx.L1Timestamp()) } - tx := txs[0] - blockNumber = tx.L1BlockNumber() - timestamp = new(big.Int).SetUint64(tx.L1Timestamp()) } msg, err = core.EncodeSimulatedMessage(msg, timestamp, blockNumber, executionManager, stateManager) if err != nil { From 56f73971c4ee531fa3812b2a43952f2c22232b5a Mon Sep 17 00:00:00 2001 From: Georgios Konstantopoulos Date: Tue, 4 May 2021 03:03:03 +0300 Subject: [PATCH 13/81] ci: use correct service name when building integration tests (#737) --- ops/scripts/build-ci.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ops/scripts/build-ci.sh b/ops/scripts/build-ci.sh index 093506657d6ba..25d46fb896889 100755 --- a/ops/scripts/build-ci.sh +++ b/ops/scripts/build-ci.sh @@ -1,7 +1,7 @@ # build in 2 steps function build_images() { docker-compose build --parallel -- builder l2geth l1_chain - docker-compose build --parallel -- deployer dtl batch_submitter relayer integration_test + docker-compose build --parallel -- deployer dtl batch_submitter relayer integration_tests } function build_dependencies() { From 9f1529c8a6c3b017e67bdade4e9a53e0e70253c0 Mon Sep 17 00:00:00 2001 From: Mark Tyneway Date: Tue, 4 May 2021 01:59:44 -0700 Subject: [PATCH 14/81] l2geth: more flexible start script (#743) * l2geth: update start script * chore: add changeset --- .changeset/nice-walls-relate.md | 5 +++++ l2geth/scripts/start.sh | 32 ++++++++++++++++++-------------- 2 files changed, 23 insertions(+), 14 deletions(-) create mode 100644 .changeset/nice-walls-relate.md diff --git a/.changeset/nice-walls-relate.md b/.changeset/nice-walls-relate.md new file mode 100644 index 0000000000000..da50f111eab2d --- /dev/null +++ b/.changeset/nice-walls-relate.md @@ -0,0 +1,5 @@ +--- +'@eth-optimism/l2geth': patch +--- + +Update the start script to be more configurable diff --git a/l2geth/scripts/start.sh b/l2geth/scripts/start.sh index 284e0c497a192..2da703a772813 100755 --- a/l2geth/scripts/start.sh +++ b/l2geth/scripts/start.sh @@ -5,7 +5,6 @@ REPO=$DIR/.. IS_VERIFIER= DATADIR=$HOME/.ethereum -ETH1_CHAIN_ID=1 TARGET_GAS_LIMIT=9000000 CHAIN_ID=10 ETH1_CTC_DEPLOYMENT_HEIGHT=12207792 @@ -31,7 +30,6 @@ CLI Arguments: --eth1.chainid - eth1 chain id --eth1.ctcdeploymentheight - eth1 ctc deploy height --eth1.l1crossdomainmessengeraddress - eth1 l1 xdomain messenger address - --eth1.ctcdeploymentheight - eth1 ctc deployment height --rollup.statedumppath - http path to the initial state dump --rollup.clienthttp - rollup client http --rollup.pollinterval - polling interval for the rollup client @@ -86,36 +84,36 @@ while (( "$#" )); do exit 1 fi ;; - --eth1.chainid) + --eth1.ctcdeploymentheight) if [ -n "$2" ] && [ ${2:0:1} != "-" ]; then - ETH1_CHAIN_ID="$2" + ETH1_CTC_DEPLOYMENT_HEIGHT="$2" shift 2 else echo "Error: Argument for $1 is missing" >&2 exit 1 fi ;; - --eth1.ctcdeploymentheight) + --eth1.l1gatewayaddress) if [ -n "$2" ] && [ ${2:0:1} != "-" ]; then - ETH1_CTC_DEPLOYMENT_HEIGHT="$2" + ETH1_L1_GATEWAY_ADDRESS="$2" shift 2 else echo "Error: Argument for $1 is missing" >&2 exit 1 fi ;; - --eth1.l1gatewayaddress) + --eth1.l1crossdomainmessengeraddress) if [ -n "$2" ] && [ ${2:0:1} != "-" ]; then - ETH1_L1_GATEWAY_ADDRESS="$2" + ETH1_L1_CROSS_DOMAIN_MESSENGER_ADDRESS="$2" shift 2 else echo "Error: Argument for $1 is missing" >&2 exit 1 fi ;; - --eth1.l1crossdomainmessengeraddress) + --eth1.l1ethgatewayaddress) if [ -n "$2" ] && [ ${2:0:1} != "-" ]; then - ETH1_L1_CROSS_DOMAIN_MESSENGER_ADDRESS="$2" + ETH1_L1_ETH_GATEWAY_ADDRESS="$2" shift 2 else echo "Error: Argument for $1 is missing" >&2 @@ -167,6 +165,15 @@ while (( "$#" )); do exit 1 fi ;; + --rollup.addressmanagerowneraddress) + if [ -n "$2" ] && [ ${2:0:1} != "-" ]; then + ADDRESS_MANAGER_OWNER_ADDRESS="$2" + shift 2 + else + echo "Error: Argument for $1 is missing" >&2 + exit 1 + fi + ;; --cache) if [ -n "$2" ] && [ ${2:0:1} != "-" ]; then CACHE="$2" @@ -195,14 +202,11 @@ done cmd="$REPO/build/bin/geth" cmd="$cmd --eth1.syncservice" cmd="$cmd --datadir $DATADIR" -cmd="$cmd --eth1.chainid $ETH1_CHAIN_ID" cmd="$cmd --eth1.l1crossdomainmessengeraddress $ETH1_L1_CROSS_DOMAIN_MESSENGER_ADDRESS" cmd="$cmd --rollup.addressmanagerowneraddress $ADDRESS_MANAGER_OWNER_ADDRESS" cmd="$cmd --rollup.statedumppath $ROLLUP_STATE_DUMP_PATH" cmd="$cmd --eth1.ctcdeploymentheight $ETH1_CTC_DEPLOYMENT_HEIGHT" -if [[ ! -z $ETH1_L1_GATEWAY_ADDRESS ]]; then - cmd="$cmd --eth1.l1ethgatewayaddress $ETH1_L1_GATEWAY_ADDRESS" -fi +cmd="$cmd --eth1.l1ethgatewayaddress $ETH1_L1_GATEWAY_ADDRESS" cmd="$cmd --rollup.clienthttp $ROLLUP_CLIENT_HTTP" cmd="$cmd --rollup.pollinterval $ROLLUP_POLL_INTERVAL" cmd="$cmd --rollup.timestamprefresh $ROLLUP_TIMESTAMP_REFRESH" From 47e40a2d09e600ba6c6f9fad3095699b7a0db5c0 Mon Sep 17 00:00:00 2001 From: Mark Tyneway Date: Tue, 4 May 2021 11:28:11 -0700 Subject: [PATCH 15/81] fix: dtl config parsing (#744) * dtl: fix config parsing * chore: add changeset --- .changeset/afraid-wasps-wonder.md | 5 +++++ packages/data-transport-layer/src/utils/validation.ts | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 .changeset/afraid-wasps-wonder.md diff --git a/.changeset/afraid-wasps-wonder.md b/.changeset/afraid-wasps-wonder.md new file mode 100644 index 0000000000000..08bec59491208 --- /dev/null +++ b/.changeset/afraid-wasps-wonder.md @@ -0,0 +1,5 @@ +--- +'@eth-optimism/data-transport-layer': patch +--- + +Update the config parsing so that it gives a better error message diff --git a/packages/data-transport-layer/src/utils/validation.ts b/packages/data-transport-layer/src/utils/validation.ts index b0a93d4689e53..b513830d57150 100644 --- a/packages/data-transport-layer/src/utils/validation.ts +++ b/packages/data-transport-layer/src/utils/validation.ts @@ -34,7 +34,7 @@ export const validators = { } }, isJsonRpcProvider: (val: any): boolean => { - return val.ready !== undefined + return val && val.ready !== undefined }, isLevelUP: (val: any): boolean => { // TODO: Fix? From ae1ac05d7032422a71caf25d16f6e548df5b8d7f Mon Sep 17 00:00:00 2001 From: Maurelian Date: Tue, 4 May 2021 14:09:26 -0400 Subject: [PATCH 16/81] fix(contracts): restrict visibilities to external --- .../OVM/execution/OVM_ExecutionManager.sol | 32 +++++++++---------- .../OVM/predeploys/OVM_DeployerWhitelist.sol | 8 ++--- .../verification/OVM_StateTransitioner.sol | 18 +++++------ .../libraries/resolver/Lib_AddressManager.sol | 4 +-- .../libraries/trie/Lib_MerkleTrie.sol | 4 +-- 5 files changed, 33 insertions(+), 33 deletions(-) diff --git a/packages/contracts/contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol b/packages/contracts/contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol index 6fbd2e3ab867b..14a55abf5d646 100644 --- a/packages/contracts/contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol +++ b/packages/contracts/contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol @@ -161,7 +161,7 @@ contract OVM_ExecutionManager is iOVM_ExecutionManager, Lib_AddressResolver { address _ovmStateManager ) override - public + external { // Make sure that run() is not re-enterable. This condition should always be satisfied // Once run has been called once, due to the behavior of _isValidInput(). @@ -228,7 +228,7 @@ contract OVM_ExecutionManager is iOVM_ExecutionManager, Lib_AddressResolver { */ function ovmCALLER() override - public + external view returns ( address _CALLER @@ -258,7 +258,7 @@ contract OVM_ExecutionManager is iOVM_ExecutionManager, Lib_AddressResolver { */ function ovmTIMESTAMP() override - public + external view returns ( uint256 _TIMESTAMP @@ -273,7 +273,7 @@ contract OVM_ExecutionManager is iOVM_ExecutionManager, Lib_AddressResolver { */ function ovmNUMBER() override - public + external view returns ( uint256 _NUMBER @@ -288,7 +288,7 @@ contract OVM_ExecutionManager is iOVM_ExecutionManager, Lib_AddressResolver { */ function ovmGASLIMIT() override - public + external view returns ( uint256 _GASLIMIT @@ -303,7 +303,7 @@ contract OVM_ExecutionManager is iOVM_ExecutionManager, Lib_AddressResolver { */ function ovmCHAINID() override - public + external view returns ( uint256 _CHAINID @@ -322,7 +322,7 @@ contract OVM_ExecutionManager is iOVM_ExecutionManager, Lib_AddressResolver { */ function ovmL1QUEUEORIGIN() override - public + external view returns ( Lib_OVMCodec.QueueOrigin _queueOrigin @@ -337,7 +337,7 @@ contract OVM_ExecutionManager is iOVM_ExecutionManager, Lib_AddressResolver { */ function ovmL1TXORIGIN() override - public + external view returns ( address _l1TxOrigin @@ -417,7 +417,7 @@ contract OVM_ExecutionManager is iOVM_ExecutionManager, Lib_AddressResolver { bytes32 _salt ) override - public + external notStatic fixedGasDiscount(40000) returns ( @@ -456,7 +456,7 @@ contract OVM_ExecutionManager is iOVM_ExecutionManager, Lib_AddressResolver { */ function ovmGETNONCE() override - public + external returns ( uint256 _nonce ) @@ -469,7 +469,7 @@ contract OVM_ExecutionManager is iOVM_ExecutionManager, Lib_AddressResolver { */ function ovmINCREMENTNONCE() override - public + external notStatic { address account = ovmADDRESS(); @@ -618,7 +618,7 @@ contract OVM_ExecutionManager is iOVM_ExecutionManager, Lib_AddressResolver { bytes memory _calldata ) override - public + external fixedGasDiscount(80000) returns ( bool _success, @@ -653,7 +653,7 @@ contract OVM_ExecutionManager is iOVM_ExecutionManager, Lib_AddressResolver { bytes memory _calldata ) override - public + external fixedGasDiscount(40000) returns ( bool _success, @@ -685,7 +685,7 @@ contract OVM_ExecutionManager is iOVM_ExecutionManager, Lib_AddressResolver { bytes32 _key ) override - public + external netGasCost(40000) returns ( bytes32 _value @@ -710,7 +710,7 @@ contract OVM_ExecutionManager is iOVM_ExecutionManager, Lib_AddressResolver { bytes32 _value ) override - public + external notStatic netGasCost(60000) { @@ -782,7 +782,7 @@ contract OVM_ExecutionManager is iOVM_ExecutionManager, Lib_AddressResolver { address _contract ) override - public + external returns ( bytes32 _EXTCODEHASH ) diff --git a/packages/contracts/contracts/optimistic-ethereum/OVM/predeploys/OVM_DeployerWhitelist.sol b/packages/contracts/contracts/optimistic-ethereum/OVM/predeploys/OVM_DeployerWhitelist.sol index cdc6b07fb6b65..463b2ca6a6c62 100644 --- a/packages/contracts/contracts/optimistic-ethereum/OVM/predeploys/OVM_DeployerWhitelist.sol +++ b/packages/contracts/contracts/optimistic-ethereum/OVM/predeploys/OVM_DeployerWhitelist.sol @@ -56,7 +56,7 @@ contract OVM_DeployerWhitelist is iOVM_DeployerWhitelist { bool _allowArbitraryDeployment ) override - public + external { if (initialized == true) { return; @@ -77,7 +77,7 @@ contract OVM_DeployerWhitelist is iOVM_DeployerWhitelist { bool _isWhitelisted ) override - public + external onlyOwner { whitelist[_deployer] = _isWhitelisted; @@ -116,7 +116,7 @@ contract OVM_DeployerWhitelist is iOVM_DeployerWhitelist { */ function enableArbitraryContractDeployment() override - public + external onlyOwner { setAllowArbitraryDeployment(true); @@ -132,7 +132,7 @@ contract OVM_DeployerWhitelist is iOVM_DeployerWhitelist { address _deployer ) override - public + external returns ( bool ) diff --git a/packages/contracts/contracts/optimistic-ethereum/OVM/verification/OVM_StateTransitioner.sol b/packages/contracts/contracts/optimistic-ethereum/OVM/verification/OVM_StateTransitioner.sol index 05bf801c1cdff..b81c4b955c529 100644 --- a/packages/contracts/contracts/optimistic-ethereum/OVM/verification/OVM_StateTransitioner.sol +++ b/packages/contracts/contracts/optimistic-ethereum/OVM/verification/OVM_StateTransitioner.sol @@ -132,7 +132,7 @@ contract OVM_StateTransitioner is Lib_AddressResolver, Abs_FraudContributor, iOV */ function getPreStateRoot() override - public + external view returns ( bytes32 _preStateRoot @@ -147,7 +147,7 @@ contract OVM_StateTransitioner is Lib_AddressResolver, Abs_FraudContributor, iOV */ function getPostStateRoot() override - public + external view returns ( bytes32 _postStateRoot @@ -162,7 +162,7 @@ contract OVM_StateTransitioner is Lib_AddressResolver, Abs_FraudContributor, iOV */ function isComplete() override - public + external view returns ( bool _complete @@ -188,7 +188,7 @@ contract OVM_StateTransitioner is Lib_AddressResolver, Abs_FraudContributor, iOV bytes memory _stateTrieWitness ) override - public + external onlyDuringPhase(TransitionPhase.PRE_EXECUTION) contributesToFraudProof(preStateRoot, transactionHash) { @@ -260,7 +260,7 @@ contract OVM_StateTransitioner is Lib_AddressResolver, Abs_FraudContributor, iOV bytes memory _storageTrieWitness ) override - public + external onlyDuringPhase(TransitionPhase.PRE_EXECUTION) contributesToFraudProof(preStateRoot, transactionHash) { @@ -324,7 +324,7 @@ contract OVM_StateTransitioner is Lib_AddressResolver, Abs_FraudContributor, iOV Lib_OVMCodec.Transaction memory _transaction ) override - public + external onlyDuringPhase(TransitionPhase.PRE_EXECUTION) contributesToFraudProof(preStateRoot, transactionHash) { @@ -374,7 +374,7 @@ contract OVM_StateTransitioner is Lib_AddressResolver, Abs_FraudContributor, iOV bytes memory _stateTrieWitness ) override - public + external onlyDuringPhase(TransitionPhase.POST_EXECUTION) contributesToFraudProof(preStateRoot, transactionHash) { @@ -417,7 +417,7 @@ contract OVM_StateTransitioner is Lib_AddressResolver, Abs_FraudContributor, iOV bytes memory _storageTrieWitness ) override - public + external onlyDuringPhase(TransitionPhase.POST_EXECUTION) contributesToFraudProof(preStateRoot, transactionHash) { @@ -457,7 +457,7 @@ contract OVM_StateTransitioner is Lib_AddressResolver, Abs_FraudContributor, iOV */ function completeTransition() override - public + external onlyDuringPhase(TransitionPhase.POST_EXECUTION) { require( diff --git a/packages/contracts/contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol b/packages/contracts/contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol index 606f2cef30052..e123573f604fa 100644 --- a/packages/contracts/contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol +++ b/packages/contracts/contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol @@ -39,7 +39,7 @@ contract Lib_AddressManager is Ownable { string memory _name, address _address ) - public + external onlyOwner { addresses[_getNameHash(_name)] = _address; @@ -58,7 +58,7 @@ contract Lib_AddressManager is Ownable { function getAddress( string memory _name ) - public + external view returns ( address diff --git a/packages/contracts/contracts/optimistic-ethereum/libraries/trie/Lib_MerkleTrie.sol b/packages/contracts/contracts/optimistic-ethereum/libraries/trie/Lib_MerkleTrie.sol index 6b873fcbe517e..b1f8a8d19eb78 100644 --- a/packages/contracts/contracts/optimistic-ethereum/libraries/trie/Lib_MerkleTrie.sol +++ b/packages/contracts/contracts/optimistic-ethereum/libraries/trie/Lib_MerkleTrie.sol @@ -314,8 +314,8 @@ library Lib_MerkleTrie { currentNodeID = bytes32(RLP_NULL); break; } else if (prefix == PREFIX_EXTENSION_EVEN || prefix == PREFIX_EXTENSION_ODD) { - if (sharedNibbleLength == 0) { - // Our extension node doesn't share any part of our key. + if (sharedNibbleLength != pathRemainder.length) { + // Our extension node is not identical to the remainder. // We've hit the end of this path, updates will need to modify this extension. currentNodeID = bytes32(RLP_NULL); break; From 12dbd81b5507555033a9f3b8f448d2f40f149f99 Mon Sep 17 00:00:00 2001 From: Annie Ke Date: Tue, 4 May 2021 15:53:38 -0700 Subject: [PATCH 17/81] feat[batch-submitter]: add metrics (#722) * add ethBalance gauge * add rest of bs metrics * add changeset --- .changeset/moody-pigs-attend.md | 5 ++ packages/batch-submitter/package.json | 5 +- .../src/batch-submitter/batch-submitter.ts | 54 ++++++++++++- .../src/batch-submitter/tx-batch-submitter.ts | 1 + yarn.lock | 80 ++++++++++++++----- 5 files changed, 122 insertions(+), 23 deletions(-) create mode 100644 .changeset/moody-pigs-attend.md diff --git a/.changeset/moody-pigs-attend.md b/.changeset/moody-pigs-attend.md new file mode 100644 index 0000000000000..141cdfecc985e --- /dev/null +++ b/.changeset/moody-pigs-attend.md @@ -0,0 +1,5 @@ +--- +'@eth-optimism/batch-submitter': patch +--- + +add key metrics to batch submitter diff --git a/packages/batch-submitter/package.json b/packages/batch-submitter/package.json index 5bc805b829680..a665b8197724c 100644 --- a/packages/batch-submitter/package.json +++ b/packages/batch-submitter/package.json @@ -31,16 +31,17 @@ "url": "https://github.com/ethereum-optimism/optimism-monorepo.git" }, "dependencies": { + "@eth-optimism/common-ts": "^0.0.1", "@eth-optimism/contracts": "^0.2.8", "@eth-optimism/core-utils": "^0.3.2", - "@eth-optimism/common-ts": "^0.0.1", "@eth-optimism/ynatm": "^0.2.2", "@ethersproject/abstract-provider": "^5.0.5", "@ethersproject/providers": "^5.0.14", "bluebird": "^3.7.2", "dotenv": "^8.2.0", "ethers": "5.0.0", - "old-contracts": "npm:@eth-optimism/contracts@^0.0.2-alpha.7" + "old-contracts": "npm:@eth-optimism/contracts@^0.0.2-alpha.7", + "prom-client": "^13.1.0" }, "devDependencies": { "@eth-optimism/smock": "^1.1.1", diff --git a/packages/batch-submitter/src/batch-submitter/batch-submitter.ts b/packages/batch-submitter/src/batch-submitter/batch-submitter.ts index ea63d34881adc..24097af75e0ce 100644 --- a/packages/batch-submitter/src/batch-submitter/batch-submitter.ts +++ b/packages/batch-submitter/src/batch-submitter/batch-submitter.ts @@ -1,6 +1,7 @@ /* External Imports */ import { Contract, Signer, utils, providers } from 'ethers' import { TransactionReceipt } from '@ethersproject/abstract-provider' +import { Gauge, Histogram } from 'prom-client' import * as ynatm from '@eth-optimism/ynatm' import { RollupInfo } from '@eth-optimism/core-utils' import { Logger, Metrics } from '@eth-optimism/common-ts' @@ -17,12 +18,21 @@ export interface ResubmissionConfig { gasRetryIncrement: number } +interface BatchSubmitterMetrics { + batchSubmitterETHBalance: Gauge + batchSizeInBytes: Histogram + numTxPerBatch: Histogram + submissionTimestamp: Histogram + submissionGasUsed: Histogram +} + export abstract class BatchSubmitter { protected rollupInfo: RollupInfo protected chainContract: Contract protected l2ChainId: number protected syncing: boolean protected lastBatchSubmissionTimestamp: number = 0 + protected metrics: BatchSubmitterMetrics constructor( readonly signer: Signer, @@ -41,8 +51,10 @@ export abstract class BatchSubmitter { readonly gasRetryIncrement: number, readonly gasThresholdInGwei: number, readonly logger: Logger, - readonly metrics: Metrics - ) {} + readonly defaultMetrics: Metrics + ) { + this.metrics = this._registerMetrics(defaultMetrics) + } public abstract _submitBatch( startBlock: number, @@ -58,6 +70,7 @@ export abstract class BatchSubmitter { } await this._updateChainInfo() await this._checkBalance() + this.logger.info('Readying to submit next batch...', { l2ChainId: this.l2ChainId, batchSubmitterAddress: await this.signer.getAddress(), @@ -87,6 +100,7 @@ export abstract class BatchSubmitter { address, ether, }) + this.metrics.batchSubmitterETHBalance.set(num) if (num < this.minBalanceEther) { this.logger.fatal('Current balance lower than min safe balance', { @@ -146,6 +160,7 @@ export abstract class BatchSubmitter { lastBatchSubmissionTimestamp: this.lastBatchSubmissionTimestamp, currentTimestamp, }) + this.metrics.batchSizeInBytes.observe(batchSizeInBytes) return true } this.logger.info( @@ -156,6 +171,7 @@ export abstract class BatchSubmitter { currentTimestamp, } ) + this.metrics.batchSizeInBytes.observe(batchSizeInBytes) return true } @@ -223,6 +239,40 @@ export abstract class BatchSubmitter { this.logger.info('Received transaction receipt', { receipt }) this.logger.info(successMessage) + this.metrics.submissionGasUsed.observe(receipt.gasUsed.toNumber()) + this.metrics.submissionTimestamp.observe(Date.now()) return receipt } + + private _registerMetrics(metrics: Metrics): BatchSubmitterMetrics { + metrics.registry.clear() + + return { + batchSubmitterETHBalance: new metrics.client.Gauge({ + name: 'batch_submitter_eth_balance', + help: 'ETH balance of the batch submitter', + registers: [metrics.registry], + }), + batchSizeInBytes: new metrics.client.Histogram({ + name: 'batch_size_in_bytes', + help: 'Size of batches in bytes', + registers: [metrics.registry], + }), + numTxPerBatch: new metrics.client.Histogram({ + name: 'num_txs_per_batch', + help: 'Number of transactions in each batch', + registers: [metrics.registry], + }), + submissionTimestamp: new metrics.client.Histogram({ + name: 'submission_timestamp', + help: 'Timestamp of each batch submitter submission', + registers: [metrics.registry], + }), + submissionGasUsed: new metrics.client.Histogram({ + name: 'submission_gash_used', + help: 'Gas used to submit each batch', + registers: [metrics.registry], + }), + } + } } diff --git a/packages/batch-submitter/src/batch-submitter/tx-batch-submitter.ts b/packages/batch-submitter/src/batch-submitter/tx-batch-submitter.ts index 2a1c946ec0a84..cd71c10d20b63 100644 --- a/packages/batch-submitter/src/batch-submitter/tx-batch-submitter.ts +++ b/packages/batch-submitter/src/batch-submitter/tx-batch-submitter.ts @@ -237,6 +237,7 @@ export class TransactionBatchSubmitter extends BatchSubmitter { if (!wasBatchTruncated && !this._shouldSubmitBatch(batchSizeInBytes)) { return } + this.metrics.numTxPerBatch.observe(endBlock - startBlock) const l1tipHeight = await this.signer.provider.getBlockNumber() this.logger.debug('Submitting batch.', { calldata: batchParams, diff --git a/yarn.lock b/yarn.lock index 1a3df96546871..f2785fc45bdf3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1914,15 +1914,15 @@ "@sentry/utils" "6.2.5" tslib "^1.9.3" -"@sentry/core@6.3.1": - version "6.3.1" - resolved "https://registry.yarnpkg.com/@sentry/core/-/core-6.3.1.tgz#5e32ca919c9be30fec0bb3125a556bc711584bdf" - integrity sha512-aVuvVbaehGeN86jZlLDGGkhEtprdOtB6lvYLfGy40Dj1Tkh2mGWE550QsRXAXAqYvQzIYwQR23r6m3o8FujgVg== - dependencies: - "@sentry/hub" "6.3.1" - "@sentry/minimal" "6.3.1" - "@sentry/types" "6.3.1" - "@sentry/utils" "6.3.1" +"@sentry/core@6.3.5": + version "6.3.5" + resolved "https://registry.yarnpkg.com/@sentry/core/-/core-6.3.5.tgz#6b73de736eb9d0040be94cdbb06a744cd6b9172e" + integrity sha512-VR2ibDy33mryD0mT6d9fGhKjdNzS2FSwwZPe9GvmNOjkyjly/oV91BKVoYJneCqOeq8fyj2lvkJGKuupdJNDqg== + dependencies: + "@sentry/hub" "6.3.5" + "@sentry/minimal" "6.3.5" + "@sentry/types" "6.3.5" + "@sentry/utils" "6.3.5" tslib "^1.9.3" "@sentry/hub@5.30.0": @@ -1952,6 +1952,15 @@ "@sentry/utils" "6.3.1" tslib "^1.9.3" +"@sentry/hub@6.3.5": + version "6.3.5" + resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-6.3.5.tgz#c5bc6760f7e4e53e87149703b106804299060389" + integrity sha512-ZYFo7VYKwdPVjuV9BDFiYn+MpANn6eZMz5QDBfZ2dugIvIVbuOyOOLx8PSa3ZXJoVTZZ7s2wD2fi/ZxKjNjZOQ== + dependencies: + "@sentry/types" "6.3.5" + "@sentry/utils" "6.3.5" + tslib "^1.9.3" + "@sentry/minimal@5.30.0": version "5.30.0" resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-5.30.0.tgz#ce3d3a6a273428e0084adcb800bc12e72d34637b" @@ -1979,6 +1988,15 @@ "@sentry/types" "6.3.1" tslib "^1.9.3" +"@sentry/minimal@6.3.5": + version "6.3.5" + resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-6.3.5.tgz#ef4894771243d01d81e91819400d2ecdcb34b411" + integrity sha512-4RqIGAU0+8iI/1sw0GYPTr4SUA88/i2+JPjFJ+qloh5ANVaNwhFPRChw+Ys9xpre8LV9JZrEsEf8AvQr4fkNbA== + dependencies: + "@sentry/hub" "6.3.5" + "@sentry/types" "6.3.5" + tslib "^1.9.3" + "@sentry/node@^5.18.1": version "5.30.0" resolved "https://registry.yarnpkg.com/@sentry/node/-/node-5.30.0.tgz#4ca479e799b1021285d7fe12ac0858951c11cd48" @@ -2010,15 +2028,15 @@ tslib "^1.9.3" "@sentry/node@^6.3.1": - version "6.3.1" - resolved "https://registry.yarnpkg.com/@sentry/node/-/node-6.3.1.tgz#0f81a0e352fa5b3e36bcc53adb6e26cd214c637d" - integrity sha512-D0r603fdNwUPkwvy0IcQaUSTafl+7lrOytiO5dfdLdlkhtTcwivwENc/n8ER8GOC2zpIvYOEIJvzP4PGL85khw== - dependencies: - "@sentry/core" "6.3.1" - "@sentry/hub" "6.3.1" - "@sentry/tracing" "6.3.1" - "@sentry/types" "6.3.1" - "@sentry/utils" "6.3.1" + version "6.3.5" + resolved "https://registry.yarnpkg.com/@sentry/node/-/node-6.3.5.tgz#d5cbf941d0a4caf7b8e644d71cc6b463eeda214e" + integrity sha512-scPB+DoAEPaqkYuyb8d/gVWbFmX5PhaYSNHybeHncaP/P4itLdq/AoAWGNxl0Hj4EQokfT4OZWxaaJi7SCYnaw== + dependencies: + "@sentry/core" "6.3.5" + "@sentry/hub" "6.3.5" + "@sentry/tracing" "6.3.5" + "@sentry/types" "6.3.5" + "@sentry/utils" "6.3.5" cookie "^0.4.1" https-proxy-agent "^5.0.0" lru_map "^0.3.3" @@ -2046,7 +2064,18 @@ "@sentry/utils" "6.2.5" tslib "^1.9.3" -"@sentry/tracing@6.3.1", "@sentry/tracing@^6.3.1": +"@sentry/tracing@6.3.5": + version "6.3.5" + resolved "https://registry.yarnpkg.com/@sentry/tracing/-/tracing-6.3.5.tgz#f76c362159141f860081ec7df80aa9f85b545860" + integrity sha512-TNKAST1ge2g24BlTfVxNp4gP5t3drbi0OVCh8h8ah+J7UjHSfdiqhd9W2h5qv1GO61gGlpWeN/TyioyQmOxu0Q== + dependencies: + "@sentry/hub" "6.3.5" + "@sentry/minimal" "6.3.5" + "@sentry/types" "6.3.5" + "@sentry/utils" "6.3.5" + tslib "^1.9.3" + +"@sentry/tracing@^6.3.1": version "6.3.1" resolved "https://registry.yarnpkg.com/@sentry/tracing/-/tracing-6.3.1.tgz#3b96aabf4d9cebadfec070c006db79801a68ee24" integrity sha512-qveDmoWsXy9qLEblZJwJ1OU/zZRlEd/q7Jhd0Hnwlob8Ci96huABEbYyGdJs18BKVHEFU3gSdVfvrikUE/W17g== @@ -2072,6 +2101,11 @@ resolved "https://registry.yarnpkg.com/@sentry/types/-/types-6.3.1.tgz#af3b54728b29f633f38fbe51b8c10e3834fbc158" integrity sha512-BEBn8JX1yaooCAuonbaMci9z0RjwwMbQ3Eny/eyDdd+rjXprZCZaStZnCvSThbNBqAJ8YaUqY2YBMnEwJxarAw== +"@sentry/types@6.3.5": + version "6.3.5" + resolved "https://registry.yarnpkg.com/@sentry/types/-/types-6.3.5.tgz#d5eca7e76c250882ab78c01a8df894a9a9ca537d" + integrity sha512-tY/3pkAmGYJ3F0BtwInsdt/uclNvF8aNG7XHsTPQNzk7BkNVWjCXx0sjxi6CILirl5nwNxYxVeTr2ZYAEZ/dSQ== + "@sentry/utils@5.30.0": version "5.30.0" resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-5.30.0.tgz#9a5bd7ccff85ccfe7856d493bffa64cabc41e980" @@ -2096,6 +2130,14 @@ "@sentry/types" "6.3.1" tslib "^1.9.3" +"@sentry/utils@6.3.5": + version "6.3.5" + resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-6.3.5.tgz#a4805448cb0314d3d119688162aa695598a10bbb" + integrity sha512-kHUcZ37QYlNzz7c9LVdApITXHaNmQK7+sw/If3M/qpff1fd5XoecA8laLfcYuz+Cw5mRhVmdhPcCRM3Xi1IGXg== + dependencies: + "@sentry/types" "6.3.5" + tslib "^1.9.3" + "@sindresorhus/is@^0.14.0": version "0.14.0" resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" From ea4f01c5babce3489142c1f63a570d86ee9be517 Mon Sep 17 00:00:00 2001 From: Maurelian Date: Wed, 24 Mar 2021 16:50:39 -0400 Subject: [PATCH 18/81] chore(contracts): generate test coverage in CI chore(contracts): make coverage its own action Co-authored-by: Georgios Konstantopoulos --- .github/workflows/ts-packages.yml | 47 ++++++++++++++++++++++++++++++ .gitignore | 1 + package.json | 1 + packages/contracts/README.md | 2 +- packages/contracts/package.json | 4 ++- yarn.lock | 48 ++++++++++++++++++++++--------- 6 files changed, 88 insertions(+), 15 deletions(-) diff --git a/.github/workflows/ts-packages.yml b/.github/workflows/ts-packages.yml index 1b00b36fd13d9..dc348369c50d0 100644 --- a/.github/workflows/ts-packages.yml +++ b/.github/workflows/ts-packages.yml @@ -60,6 +60,53 @@ jobs: ENABLE_GAS_REPORT: 1 - name: Print gas report run: cat packages/contracts/gas-report.txt + + test-coverage: + name: Generate test coverage + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + + - name: Fetch history + run: git fetch + + - name: Setup node + uses: actions/setup-node@v1 + with: + node-version: '12.x' + + - name: Get yarn cache directory path + id: yarn-cache-dir-path + run: echo "::set-output name=dir::$(yarn cache dir)" + + - uses: actions/cache@v2 + id: yarn-cache + with: + path: ${{ steps.yarn-cache-dir-path.outputs.dir }} + key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }} + restore-keys: | + ${{ runner.os }}-yarn- + + - name: Install Dependencies + # only install dependencies if there was a change in the deps + # if: steps.yarn-cache.outputs.cache-hit != 'true' + run: yarn install + + - name: Build + run: yarn build + + - name: Test Coverage + run: yarn test:coverage + # Tests are quite brittle when instrumented by Solidity Coverage. + # If tests pass in the Test job above, tests failing during coverage shouldn't break CI. + continue-on-error: true + - uses: codecov/codecov-action@v1 + with: + files: ./packages/contracts/coverage.json + fail_ci_if_error: false + verbose: true + lint: name: Linting runs-on: ubuntu-latest diff --git a/.gitignore b/.gitignore index 9beef2d083742..088ff66fe6d4f 100644 --- a/.gitignore +++ b/.gitignore @@ -12,6 +12,7 @@ cache-ovm l2geth/build/bin packages/contracts/deployments/custom +packages/contracts/coverage* packages/data-transport-layer/db diff --git a/package.json b/package.json index f04b25b0db0e4..bc0182e4070be 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,7 @@ "clean": "yarn lerna run clean", "build": "yarn lerna run build", "test": "yarn lerna run test --parallel", + "test:coverage": "yarn lerna run test:coverage --parallel", "lint": "yarn lerna run lint", "lint:fix": "yarn lerna run lint:fix", "postinstall": "patch-package", diff --git a/packages/contracts/README.md b/packages/contracts/README.md index 3761a7615ba3a..529f3f219f687 100644 --- a/packages/contracts/README.md +++ b/packages/contracts/README.md @@ -56,7 +56,7 @@ yarn test ./test/path/to/my/test.spec.ts ### Measuring test coverage: ```shell -yarn test-coverage +yarn test:coverage ``` The output is most easily viewable by opening the html file in your browser: diff --git a/packages/contracts/package.json b/packages/contracts/package.json index 18d155a11567b..cc6c6c631910d 100644 --- a/packages/contracts/package.json +++ b/packages/contracts/package.json @@ -29,6 +29,7 @@ "test": "yarn run test:contracts", "test:contracts": "hardhat test --show-stack-traces", "test:gas": "hardhat test \"test/contracts/OVM/execution/OVM_StateManager.gas-spec.ts\" --no-compile --show-stack-traces", + "test:coverage": "NODE_OPTIONS=--max_old_space_size=8192 hardhat coverage", "lint": "yarn run lint:typescript", "lint:typescript": "tslint --format stylish --project .", "lint:fix": "yarn run lint:fix:typescript", @@ -51,7 +52,8 @@ "@openzeppelin/contracts-upgradeable": "^3.3.0", "@typechain/hardhat": "^1.0.1", "ganache-core": "^2.13.2", - "glob": "^7.1.6" + "glob": "^7.1.6", + "solidity-coverage": "^0.7.16" }, "devDependencies": { "@eth-optimism/hardhat-ovm": "^0.1.0", diff --git a/yarn.lock b/yarn.lock index f2785fc45bdf3..60b87873e76ee 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2198,22 +2198,23 @@ resolved "https://registry.yarnpkg.com/@truffle/error/-/error-0.0.12.tgz#83e02e6ffe1d154fe274141d90038a91fd1e186d" integrity sha512-kZqqnPR9YDJG7KCDOcN1qH16Qs0oz1PzF0Y93AWdhXuL9S9HYo/RUUeqGKbPpRBEZldQUS8aa4EzfK08u5pu6g== -"@truffle/interface-adapter@^0.4.20": - version "0.4.20" - resolved "https://registry.yarnpkg.com/@truffle/interface-adapter/-/interface-adapter-0.4.20.tgz#cf3f176e6fe14321bf164d502bf8d05e50209eb5" - integrity sha512-GcdtXjU+Mhx/WuD3Af1thojHilhUAWtKfoNF09oEDyGSrS0QEWq9s9kOFjrfTFJrK+g0I6VXMrU2sIido96NBA== +"@truffle/interface-adapter@^0.4.19": + version "0.4.19" + resolved "https://registry.yarnpkg.com/@truffle/interface-adapter/-/interface-adapter-0.4.19.tgz#19248ac88099f8df34f58a3d43a95ba3470dc89a" + integrity sha512-+Zz6Fr8+I2wYSS8RM3WBOMzf22QffMQTnlsYsRgRHzv3gYoRA9ZDLb84lFRfmWyw+IdXTo90tjRHEb5krC6uxg== dependencies: bn.js "^5.1.3" ethers "^4.0.32" + source-map-support "^0.5.19" web3 "1.2.9" "@truffle/provider@^0.2.24": - version "0.2.27" - resolved "https://registry.yarnpkg.com/@truffle/provider/-/provider-0.2.27.tgz#8d06f94df6e6ea632ccd4518c419f6d3c0b05531" - integrity sha512-PwFcrH++FslHQMZEiID6t6CFTVavJHj4EVszmMS3E4+P9HIcpZTh/hHACqXhvlBxv94J9yM6SFmcSSokn8GC7A== + version "0.2.26" + resolved "https://registry.yarnpkg.com/@truffle/provider/-/provider-0.2.26.tgz#88e31b79973c2427c4a17d9a59411e6fbc810190" + integrity sha512-YKPmhB9S9AQkT2ePGtadwjDduxU23DXXy+5zyM5fevw5GCbXSnf+jG6rICXjPkVFjuKBlXuq5JbuERZn43522Q== dependencies: "@truffle/error" "^0.0.12" - "@truffle/interface-adapter" "^0.4.20" + "@truffle/interface-adapter" "^0.4.19" web3 "1.2.9" "@typechain/ethers-v5@1.0.0": @@ -6839,13 +6840,20 @@ github-from-package@0.0.0: resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce" integrity sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4= -glob-parent@^5.1.0, glob-parent@^5.1.1, glob-parent@~5.1.0: +glob-parent@^5.1.0, glob-parent@^5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== dependencies: is-glob "^4.0.1" +glob-parent@~5.1.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229" + integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ== + dependencies: + is-glob "^4.0.1" + glob@7.1.3: version "7.1.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" @@ -13002,9 +13010,9 @@ u2f-api@0.2.7: integrity sha512-fqLNg8vpvLOD5J/z4B6wpPg4Lvowz1nJ9xdHcCzdUPKcFE/qNCceV2gNZxSJd5vhAZemHr/K/hbzVA0zxB5mkg== uglify-js@^3.1.4: - version "3.13.3" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.13.3.tgz#ce72a1ad154348ea2af61f50933c76cc8802276e" - integrity sha512-otIc7O9LyxpUcQoXzj2hL4LPWKklO6LJWoJUzNa8A17Xgi4fOeDC8FBDOLHnC/Slo1CQgsZMcM6as0M76BZaig== + version "3.13.2" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.13.2.tgz#fe10319861bccc8682bfe2e8151fbdd8aa921c44" + integrity sha512-SbMu4D2Vo95LMC/MetNaso1194M1htEA+JrqE9Hk+G2DhI+itfS9TRu9ZKeCahLDNa/J3n4MqUJ/fOHMzQpRWw== uid-number@0.0.6: version "0.0.6" @@ -13740,7 +13748,21 @@ web3-utils@1.2.9: underscore "1.9.1" utf8 "3.0.0" -web3-utils@^1.0.0-beta.31, web3-utils@^1.3.0, web3-utils@^1.3.4: +web3-utils@^1.0.0-beta.31, web3-utils@^1.3.0: + version "1.3.4" + resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.3.4.tgz#9b1aa30d7549f860b573e7bb7e690999e7192198" + integrity sha512-/vC2v0MaZNpWooJfpRw63u0Y3ag2gNjAWiLtMSL6QQLmCqCy4SQIndMt/vRyx0uMoeGt1YTwSXEcHjUzOhLg0A== + dependencies: + bn.js "^4.11.9" + eth-lib "0.2.8" + ethereum-bloom-filters "^1.0.6" + ethjs-unit "0.1.6" + number-to-bn "1.7.0" + randombytes "^2.1.0" + underscore "1.9.1" + utf8 "3.0.0" + +web3-utils@^1.3.4: version "1.3.5" resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.3.5.tgz#14ee2ff1a7a226867698d6eaffd21aa97aed422e" integrity sha512-5apMRm8ElYjI/92GHqijmaLC+s+d5lgjpjHft+rJSs/dsnX8I8tQreqev0dmU+wzU+2EEe4Sx9a/OwGWHhQv3A== From 90cd0b24254de6fb1d72ce9e397b6f4035abdd02 Mon Sep 17 00:00:00 2001 From: platocrat <37757724+platocrat@users.noreply.github.com> Date: Tue, 4 May 2021 18:29:02 -0700 Subject: [PATCH 19/81] fix: remove hardcoded gasLimit (#754) --- examples/waffle/test/erc20.spec.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/examples/waffle/test/erc20.spec.js b/examples/waffle/test/erc20.spec.js index 1d15c85507a0c..6d71783a3543a 100644 --- a/examples/waffle/test/erc20.spec.js +++ b/examples/waffle/test/erc20.spec.js @@ -58,8 +58,7 @@ describe('ERC20 smart contract', () => { 1000, COIN_NAME, NUM_DECIMALS, - TICKER, - { gasLimit: 8_000_000 } + TICKER ) await ERC20.deployTransaction.wait() }) From daf975f49d3eb6a0a55ffacb1d111a939e9f02fd Mon Sep 17 00:00:00 2001 From: ben-chain Date: Tue, 4 May 2021 18:33:59 -0700 Subject: [PATCH 20/81] fix(hh-ovm): Working builds for M1 macs (#751) * fix(hh-ovm): hack RUN_SOLCJS back to RUN_SOLC * chore: add changeset --- .changeset/quiet-cherries-wave.md | 5 +++++ packages/hardhat-ovm/src/index.ts | 29 +++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+) create mode 100644 .changeset/quiet-cherries-wave.md diff --git a/.changeset/quiet-cherries-wave.md b/.changeset/quiet-cherries-wave.md new file mode 100644 index 0000000000000..67c56109f5333 --- /dev/null +++ b/.changeset/quiet-cherries-wave.md @@ -0,0 +1,5 @@ +--- +"@eth-optimism/hardhat-ovm": patch +--- + +fix(hh-ovm): Working compilation for M1 macs diff --git a/packages/hardhat-ovm/src/index.ts b/packages/hardhat-ovm/src/index.ts index 032cfe70e3798..bdfd2144adaa3 100644 --- a/packages/hardhat-ovm/src/index.ts +++ b/packages/hardhat-ovm/src/index.ts @@ -104,6 +104,34 @@ const getOvmSolcPath = async (version: string): Promise => { return cachedCompilerPath } +// TODO: implement a more elegant fix for this. +// Hardhat on M1 Macbooks does not run TASK_COMPILE_SOLIDITY_RUN_SOLC, but instead this runs one, +// TASK_COMPILE_SOLIDITY_RUN_SOLCJS. We reroute this task back to the solc task in the case +// of OVM compilation. +subtask( + TASK_COMPILE_SOLIDITY_RUN_SOLCJS, + async (args, hre, runSuper) => { + const argsAny = args as any + if (argsAny.real || hre.network.ovm !== true) { + for (const file of Object.keys(argsAny.input.sources)) { + // Ignore any contract that has this tag or in ignore list + if ( + argsAny.input.sources[file].content.includes('// @unsupported: evm') + && hre.network.ovm !== true + ) { + delete argsAny.input.sources[file] + } + } + return runSuper(args) + } else { + return hre.run(TASK_COMPILE_SOLIDITY_RUN_SOLC, { + ...argsAny, + solcPath: argsAny.solcJsPath + }) + } + } +) + subtask( TASK_COMPILE_SOLIDITY_RUN_SOLC, async (args: { input: any; solcPath: string }, hre, runSuper) => { @@ -167,6 +195,7 @@ subtask( const ovmOutput = await hre.run(TASK_COMPILE_SOLIDITY_RUN_SOLCJS, { input: ovmInput, solcJsPath: ovmSolcPath, + real: true }) // Just doing this to add some extra useful information to any errors in the OVM compiler output. From 7bb16724f06acb096e304cb0709d5ac2f7f9501f Mon Sep 17 00:00:00 2001 From: Maurelian Date: Tue, 4 May 2021 14:45:01 -0400 Subject: [PATCH 21/81] fix(hardhat): linter errors --- packages/hardhat-ovm/src/index.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/hardhat-ovm/src/index.ts b/packages/hardhat-ovm/src/index.ts index bdfd2144adaa3..9eab025fad7fa 100644 --- a/packages/hardhat-ovm/src/index.ts +++ b/packages/hardhat-ovm/src/index.ts @@ -255,7 +255,6 @@ extendEnvironment(async (hre) => { // the gas price is overriden to the user provided gasPrice or to 0. provider.getGasPrice = async () => ethers.BigNumber.from(hre.network.config.gasPrice || 0) - ;(hre as any).ethers.provider = provider // if the node is up, override the getSigners method's signers From f4b69d44dbb61b355baf6778fe3479b16f995548 Mon Sep 17 00:00:00 2001 From: Maurelian Date: Tue, 4 May 2021 14:51:00 -0400 Subject: [PATCH 22/81] chore: run lint:check in CI Also ensures all packages have a lint:check, and places the lint:fix and lint:check scripts in the order in which they are run by yarn lint --- .github/workflows/ts-packages.yml | 2 +- integration-tests/package.json | 2 +- package.json | 1 + packages/batch-submitter/package.json | 2 +- packages/common-ts/package.json | 5 +++-- packages/contracts/package.json | 5 +++-- packages/core-utils/package.json | 3 ++- packages/data-transport-layer/package.json | 2 +- packages/hardhat-ovm/package.json | 4 ++-- packages/message-relayer/package.json | 4 ++-- packages/smock/package.json | 2 +- specs/package.json | 3 ++- 12 files changed, 20 insertions(+), 15 deletions(-) diff --git a/.github/workflows/ts-packages.yml b/.github/workflows/ts-packages.yml index dc348369c50d0..2688c4ea574e5 100644 --- a/.github/workflows/ts-packages.yml +++ b/.github/workflows/ts-packages.yml @@ -136,4 +136,4 @@ jobs: run: yarn install - name: Lint - run: yarn lint + run: yarn lint:check diff --git a/integration-tests/package.json b/integration-tests/package.json index ce18ac2ed06a3..367f071794b60 100644 --- a/integration-tests/package.json +++ b/integration-tests/package.json @@ -7,8 +7,8 @@ "license": "MIT", "scripts": { "lint": "yarn lint:fix && yarn lint:check", - "lint:check": "tslint --format stylish --project .", "lint:fix": "prettier --config ./.prettierrc.json --write 'test/**/*.ts'", + "lint:check": "tslint --format stylish --project .", "build:integration": "./scripts/build.sh", "build:contracts": "hardhat compile", "build:contracts:ovm": "hardhat compile --network optimism", diff --git a/package.json b/package.json index bc0182e4070be..cc516cd0f7e79 100644 --- a/package.json +++ b/package.json @@ -20,6 +20,7 @@ "test": "yarn lerna run test --parallel", "test:coverage": "yarn lerna run test:coverage --parallel", "lint": "yarn lerna run lint", + "lint:check": "yarn lerna run lint:check", "lint:fix": "yarn lerna run lint:fix", "postinstall": "patch-package", "release": "yarn build && yarn changeset publish" diff --git a/packages/batch-submitter/package.json b/packages/batch-submitter/package.json index a665b8197724c..231a7f8845e99 100644 --- a/packages/batch-submitter/package.json +++ b/packages/batch-submitter/package.json @@ -13,8 +13,8 @@ "build": "tsc -p ./tsconfig.build.json", "clean": "rimraf cache/ dist/ ./tsconfig.build.tsbuildinfo", "lint": "yarn lint:fix && yarn lint:check", - "lint:check": "tslint --format stylish --project .", "lint:fix": "prettier --config .prettierrc.json --write \"hardhat.config.ts\" \"{src,exec,test}/**/*.ts\"", + "lint:check": "tslint --format stylish --project .", "test": "hardhat test --show-stack-traces" }, "keywords": [ diff --git a/packages/common-ts/package.json b/packages/common-ts/package.json index 707603be396f9..f08d72130040a 100644 --- a/packages/common-ts/package.json +++ b/packages/common-ts/package.json @@ -11,8 +11,9 @@ "all": "yarn clean && yarn build && yarn test && yarn lint:fix && yarn lint", "build": "tsc -p tsconfig.build.json", "clean": "rimraf dist/ ./tsconfig.build.tsbuildinfo", - "lint": "tslint --format stylish --project .", - "lint:fix": "prettier --config .prettierrc.json --write '{src,test}/**/*.ts'" + "lint": "yarn lint:fix && yarn lint:check", + "lint:fix": "prettier --config .prettierrc.json --write '{src,test}/**/*.ts'", + "lint:check": "tslint --format stylish --project ." }, "devDependencies": { "@types/pino": "^6.3.6", diff --git a/packages/contracts/package.json b/packages/contracts/package.json index cc6c6c631910d..577ef1cbecdf9 100644 --- a/packages/contracts/package.json +++ b/packages/contracts/package.json @@ -30,10 +30,11 @@ "test:contracts": "hardhat test --show-stack-traces", "test:gas": "hardhat test \"test/contracts/OVM/execution/OVM_StateManager.gas-spec.ts\" --no-compile --show-stack-traces", "test:coverage": "NODE_OPTIONS=--max_old_space_size=8192 hardhat coverage", - "lint": "yarn run lint:typescript", - "lint:typescript": "tslint --format stylish --project .", + "lint": "yarn lint:fix && yarn lint:check", "lint:fix": "yarn run lint:fix:typescript", "lint:fix:typescript": "prettier --config .prettierrc.json --write \"hardhat.config.ts\" \"{src,test}/**/*.ts\"", + "lint:check": "yarn run lint:typescript", + "lint:typescript": "tslint --format stylish --project .", "clean": "rm -rf ./dist ./artifacts ./artifacts-ovm ./cache ./cache-ovm ./tsconfig.build.tsbuildinfo", "deploy": "./bin/deploy.ts && yarn generate-markdown", "serve": "./bin/serve_dump.sh", diff --git a/packages/core-utils/package.json b/packages/core-utils/package.json index 31f84f7eed2c6..8459d4eae408d 100644 --- a/packages/core-utils/package.json +++ b/packages/core-utils/package.json @@ -13,8 +13,9 @@ "all": "yarn clean && yarn build && yarn test && yarn lint:fix && yarn lint", "build": "tsc -p tsconfig.build.json", "clean": "rimraf dist/ ./tsconfig.build.tsbuildinfo", - "lint": "tslint --format stylish --project .", + "lint": "yarn lint:fix && yarn lint:check", "lint:fix": "prettier --config .prettierrc.json --write '{src,test}/**/*.ts'", + "lint:check": "tslint --format stylish --project .", "test": "ts-mocha test/**/*.spec.ts" }, "devDependencies": { diff --git a/packages/data-transport-layer/package.json b/packages/data-transport-layer/package.json index 1fcbadbfa448b..9287f64a3b66c 100644 --- a/packages/data-transport-layer/package.json +++ b/packages/data-transport-layer/package.json @@ -11,8 +11,8 @@ "clean": "rimraf ./dist ./tsconfig.build.tsbuildinfo", "clean:db": "rimraf ./db", "lint": "yarn run lint:fix && yarn run lint:check", - "lint:check": "tslint --format stylish --project .", "lint:fix": "prettier --config .prettierrc.json --write \"{src,exec,test}/**/*.ts\"", + "lint:check": "tslint --format stylish --project .", "start": "ts-node ./src/services/run.ts", "start:local": "ts-node ./src/services/run.ts | pino-pretty", "test": "hardhat --config test/config/hardhat.config.ts test", diff --git a/packages/hardhat-ovm/package.json b/packages/hardhat-ovm/package.json index dcd0f9f6f6e9b..e9b80a1800c3e 100644 --- a/packages/hardhat-ovm/package.json +++ b/packages/hardhat-ovm/package.json @@ -11,8 +11,8 @@ "clean": "rimraf tsconfig.build.tsbuildinfo dist", "build": "tsc -p tsconfig.build.json", "lint": "yarn run lint:fix && yarn run lint:check", - "lint:check": "tslint --format stylish --project .", - "lint:fix": "prettier --config .prettierrc.json --write \"{src,test}/**/*.ts\"" + "lint:fix": "prettier --config .prettierrc.json --write \"{src,test}/**/*.ts\"", + "lint:check": "tslint --format stylish --project ." }, "dependencies": { "node-fetch": "^2.6.1" diff --git a/packages/message-relayer/package.json b/packages/message-relayer/package.json index 7e735120bd1f3..ca00df58a2564 100644 --- a/packages/message-relayer/package.json +++ b/packages/message-relayer/package.json @@ -13,8 +13,8 @@ "build": "tsc -p ./tsconfig.build.json", "clean": "rimraf dist/ ./tsconfig.build.tsbuildinfo", "lint": "yarn lint:fix && yarn lint:check", - "lint:check": "tslint --format stylish --project .", - "lint:fix": "prettier --config .prettierrc.json --write \"{src,exec,test}/**/*.ts\"" + "lint:fix": "prettier --config .prettierrc.json --write \"{src,exec,test}/**/*.ts\"", + "lint:check": "tslint --format stylish --project ." }, "keywords": [ "optimism", diff --git a/packages/smock/package.json b/packages/smock/package.json index 5330ff31d5e3c..9e3a42f347487 100644 --- a/packages/smock/package.json +++ b/packages/smock/package.json @@ -11,8 +11,8 @@ "build": "tsc -p tsconfig.build.json", "test": "hardhat test --show-stack-traces", "lint": "yarn lint:fix && yarn lint:check", - "lint:check": "tslint --format stylish --project .", "lint:fix": "prettier --config ./.prettierrc.json --write \"hardhat.config.ts\" \"{src,test}/**/*.ts\"", + "lint:check": "tslint --format stylish --project .", "clean": "rimraf ./artifacts ./cache ./dist ./tsconfig.build.tsbuildinfo" }, "peerDependencies": { diff --git a/specs/package.json b/specs/package.json index a3585bc47ed2a..11435d6ba8d06 100644 --- a/specs/package.json +++ b/specs/package.json @@ -7,7 +7,8 @@ "prettier": "2.2.1" }, "scripts": { + "lint": "yarn lint:fix && yarn lint:check", "lint:fix": "yarn prettier --write \"{l2geth,protocol}/**/*.md\"", - "lint": "yarn prettier --check \"{l2geth,protocol}/**/*.md\"" + "lint:check": "yarn prettier --check \"{l2geth,protocol}/**/*.md\"" } } From 67380c110f4a6421ca4b368c72b5e6ff9c805da3 Mon Sep 17 00:00:00 2001 From: platocrat <37757724+platocrat@users.noreply.github.com> Date: Tue, 4 May 2021 18:37:22 -0700 Subject: [PATCH 23/81] fix: remove hardcoded gasPrice and gasLimit (#753) --- examples/hardhat/deploy/ERC20.deploy.js | 2 -- examples/hardhat/test/erc20.test.js | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/examples/hardhat/deploy/ERC20.deploy.js b/examples/hardhat/deploy/ERC20.deploy.js index 6023f53d8fd97..0f6423637f17d 100644 --- a/examples/hardhat/deploy/ERC20.deploy.js +++ b/examples/hardhat/deploy/ERC20.deploy.js @@ -10,8 +10,6 @@ const func = async (hre) => { await deploy('ERC20', { from: deployer, args: [initialSupply, name], - gasPrice: hre.ethers.BigNumber.from('0'), - gasLimit: 8999999, log: true }) } diff --git a/examples/hardhat/test/erc20.test.js b/examples/hardhat/test/erc20.test.js index e3e2141c5aa27..ffae27d24f894 100644 --- a/examples/hardhat/test/erc20.test.js +++ b/examples/hardhat/test/erc20.test.js @@ -18,7 +18,7 @@ describe(`ERC20`, () => { const Factory__ERC20 = await ethers.getContractFactory('ERC20') ERC20 = await Factory__ERC20.connect(account1).deploy( INITIAL_SUPPLY, - TOKEN_NAME, + TOKEN_NAME ) await ERC20.deployTransaction.wait() From 066f6c8bc6e4191ea3dba486e1cfa7501b4c3df2 Mon Sep 17 00:00:00 2001 From: Elena Gesheva Date: Wed, 5 May 2021 15:28:14 +0300 Subject: [PATCH 24/81] Run codechecks in CI for gas cost benchmarking (#672) * Run codechecks in CI for gas cost benchmarking * Add CC_SECRET env var --- .github/workflows/ts-packages.yml | 7 +- packages/contracts/codechecks.yml | 2 + packages/contracts/package.json | 1 + yarn.lock | 131 ++++++++++++++++++++++++++++-- 4 files changed, 132 insertions(+), 9 deletions(-) create mode 100644 packages/contracts/codechecks.yml diff --git a/.github/workflows/ts-packages.yml b/.github/workflows/ts-packages.yml index 2688c4ea574e5..05138e82a6916 100644 --- a/.github/workflows/ts-packages.yml +++ b/.github/workflows/ts-packages.yml @@ -61,6 +61,12 @@ jobs: - name: Print gas report run: cat packages/contracts/gas-report.txt + - name: Run codechecks + working-directory: ./packages/contracts + run: yarn codechecks + env: + CC_SECRET: ${{ secrets.CC_SECRET }} + test-coverage: name: Generate test coverage runs-on: ubuntu-latest @@ -106,7 +112,6 @@ jobs: files: ./packages/contracts/coverage.json fail_ci_if_error: false verbose: true - lint: name: Linting runs-on: ubuntu-latest diff --git a/packages/contracts/codechecks.yml b/packages/contracts/codechecks.yml new file mode 100644 index 0000000000000..7dd55bd055420 --- /dev/null +++ b/packages/contracts/codechecks.yml @@ -0,0 +1,2 @@ +checks: + - name: eth-gas-reporter/codechecks \ No newline at end of file diff --git a/packages/contracts/package.json b/packages/contracts/package.json index 577ef1cbecdf9..2f4a03e7008f6 100644 --- a/packages/contracts/package.json +++ b/packages/contracts/package.json @@ -57,6 +57,7 @@ "solidity-coverage": "^0.7.16" }, "devDependencies": { + "@codechecks/client": "^0.1.10", "@eth-optimism/hardhat-ovm": "^0.1.0", "@eth-optimism/smock": "^1.1.1", "@nomiclabs/hardhat-ethers": "^2.0.1", diff --git a/yarn.lock b/yarn.lock index 60b87873e76ee..7fe65730c8b94 100644 --- a/yarn.lock +++ b/yarn.lock @@ -214,6 +214,32 @@ human-id "^1.0.2" prettier "^1.19.1" +"@codechecks/client@^0.1.10": + version "0.1.10" + resolved "https://registry.yarnpkg.com/@codechecks/client/-/client-0.1.10.tgz#41fe736c424976d9feb8116b131fb9c1f099d105" + integrity sha512-rvX+LknmMohsLTU8mHJqIcNTo8fKfw6A5i7JvT6JJWqwCLi+TujHpRO8BLf48iF96+gU5viVvKfRaUyhc3wloA== + dependencies: + bluebird "^3.5.3" + chalk "^2.4.2" + commander "^2.19.0" + debug "^4.1.1" + execa "^1.0.0" + glob "^7.1.3" + graceful-fs "^4.1.15" + js-yaml "^3.13.1" + json5 "^2.1.0" + lodash "^4.17.11" + marked "^0.7.0" + marked-terminal "^3.3.0" + mkdirp "^0.5.1" + ms "^2.1.1" + promise "^8.0.2" + request "^2.88.0" + request-promise "^4.2.2" + ts-essentials "^1.0.2" + ts-node "^8.0.2" + url-join "^4.0.0" + "@ensdomains/ens@^0.4.4": version "0.4.5" resolved "https://registry.yarnpkg.com/@ensdomains/ens/-/ens-0.4.5.tgz#e0aebc005afdc066447c6e22feb4eda89a5edbfc" @@ -2752,6 +2778,11 @@ ansi-colors@4.1.1, ansi-colors@^4.1.1: resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== +ansi-escapes@^3.1.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" + integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== + ansi-escapes@^4.2.1, ansi-escapes@^4.3.0: version "4.3.2" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" @@ -2798,6 +2829,11 @@ ansi-styles@^4.0.0, ansi-styles@^4.1.0: dependencies: color-convert "^2.0.1" +ansicolors@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/ansicolors/-/ansicolors-0.3.2.tgz#665597de86a9ffe3aa9bfbe6cae5c6ea426b4979" + integrity sha1-ZlWX3oap/+Oqm/vmyuXG6kJrSXk= + anymatch@~3.1.1: version "3.1.2" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" @@ -3666,7 +3702,7 @@ blakejs@^1.1.0: resolved "https://registry.yarnpkg.com/blakejs/-/blakejs-1.1.0.tgz#69df92ef953aa88ca51a32df6ab1c54a155fc7a5" integrity sha1-ad+S75U6qIylGjLfarHFShVfx6U= -bluebird@^3.5.0, bluebird@^3.5.2, bluebird@^3.7.2: +bluebird@^3.5.0, bluebird@^3.5.2, bluebird@^3.5.3, bluebird@^3.7.2: version "3.7.2" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== @@ -4067,6 +4103,14 @@ caniuse-lite@^1.0.30000844: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001207.tgz#364d47d35a3007e528f69adb6fecb07c2bb2cc50" integrity sha512-UPQZdmAsyp2qfCTiMU/zqGSWOYaY9F9LL61V8f+8MrubsaDGpaHD9HRV/EWZGULZn0Hxu48SKzI5DgFwTvHuYw== +cardinal@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/cardinal/-/cardinal-2.1.1.tgz#7cc1055d822d212954d07b085dea251cc7bc5505" + integrity sha1-fMEFXYItISlU0HsIXeolHMe8VQU= + dependencies: + ansicolors "~0.3.2" + redeyed "~2.1.0" + caseless@^0.12.0, caseless@~0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" @@ -4255,6 +4299,13 @@ cli-table3@^0.5.0: optionalDependencies: colors "^1.1.2" +cli-table@^0.3.1: + version "0.3.6" + resolved "https://registry.yarnpkg.com/cli-table/-/cli-table-0.3.6.tgz#e9d6aa859c7fe636981fd3787378c2a20bce92fc" + integrity sha512-ZkNZbnZjKERTY5NwC2SeMeLeifSPq/pubeRoTpdr3WchLlnZg6hEgvHkK5zL7KNFdd9PmHN8lxrENUwI3cE8vQ== + dependencies: + colors "1.0.3" + cli-width@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" @@ -4366,6 +4417,11 @@ color-name@~1.1.4: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== +colors@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" + integrity sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs= + colors@^1.1.2: version "1.4.0" resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" @@ -4405,7 +4461,7 @@ commander@3.0.2: resolved "https://registry.yarnpkg.com/commander/-/commander-3.0.2.tgz#6837c3fb677ad9933d1cfba42dd14d5117d6b39e" integrity sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow== -commander@^2.12.1, commander@^2.20.0: +commander@^2.12.1, commander@^2.19.0, commander@^2.20.0: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== @@ -5417,7 +5473,7 @@ esprima@2.7.x, esprima@^2.7.1: resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" integrity sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE= -esprima@^4.0.0: +esprima@^4.0.0, esprima@~4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== @@ -7194,6 +7250,11 @@ has-flag@^1.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" integrity sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo= +has-flag@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51" + integrity sha1-6CB68cx7MNRGzHC3NLXovhj4jVE= + has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" @@ -8130,6 +8191,13 @@ json5@^1.0.1: dependencies: minimist "^1.2.0" +json5@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.0.tgz#2dfefe720c6ba525d9ebd909950f0515316c89a3" + integrity sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA== + dependencies: + minimist "^1.2.5" + jsonfile@^2.1.0: version "2.4.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" @@ -8866,6 +8934,23 @@ markdown-table@^1.1.3: resolved "https://registry.yarnpkg.com/markdown-table/-/markdown-table-1.1.3.tgz#9fcb69bcfdb8717bfd0398c6ec2d93036ef8de60" integrity sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q== +marked-terminal@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/marked-terminal/-/marked-terminal-3.3.0.tgz#25ce0c0299285998c7636beaefc87055341ba1bd" + integrity sha512-+IUQJ5VlZoAFsM5MHNT7g3RHSkA3eETqhRCdXv4niUMAKHQ7lb1yvAcuGPmm4soxhmtX13u4Li6ZToXtvSEH+A== + dependencies: + ansi-escapes "^3.1.0" + cardinal "^2.1.1" + chalk "^2.4.1" + cli-table "^0.3.1" + node-emoji "^1.4.1" + supports-hyperlinks "^1.0.1" + +marked@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/marked/-/marked-0.7.0.tgz#b64201f051d271b1edc10a04d1ae9b74bb8e5c0e" + integrity sha512-c+yYdCZJQrsRjTPhUx7VKkApw9bwDkNbHUKo1ovgcfDjb2kc8rLuRbIFyXL5WOEUwzSSKo3IXpph2K6DqB/KZg== + match-all@^1.2.6: version "1.2.6" resolved "https://registry.yarnpkg.com/match-all/-/match-all-1.2.6.tgz#66d276ad6b49655551e63d3a6ee53e8be0566f8d" @@ -9593,7 +9678,7 @@ node-addon-api@^3.0.2: resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-3.1.0.tgz#98b21931557466c6729e51cb77cd39c965f42239" integrity sha512-flmrDNB06LIl5lywUz7YlNGZH/5p0M7W28k8hzd9Lshtdh1wshD2Y+U4h9LD6KObOy1f+fEVdgprPrEymjM5uw== -node-emoji@^1.10.0: +node-emoji@^1.10.0, node-emoji@^1.4.1: version "1.10.0" resolved "https://registry.yarnpkg.com/node-emoji/-/node-emoji-1.10.0.tgz#8886abd25d9c7bb61802a658523d1f8d2a89b2da" integrity sha512-Yt3384If5H6BYGVHiHwTL+99OzJKHhgp82S8/dktEK73T26BazdgZ4JZh92xSVtGNJvz9UbXdNAc5hcrXV42vw== @@ -10706,7 +10791,7 @@ promise-to-callback@^1.0.0: is-fn "^1.0.0" set-immediate-shim "^1.0.1" -promise@^8.0.0: +promise@^8.0.0, promise@^8.0.2: version "8.1.0" resolved "https://registry.yarnpkg.com/promise/-/promise-8.1.0.tgz#697c25c3dfe7435dd79fcd58c38a135888eaf05e" integrity sha512-W04AqnILOL/sPRXziNicCjSNRruLAuIHEOVBazepu0545DDNGYHz7ar9ZgZ1fMU8/MA4mVxp5rkBWRi6OXIy3Q== @@ -11169,6 +11254,13 @@ redent@^3.0.0: indent-string "^4.0.0" strip-indent "^3.0.0" +redeyed@~2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/redeyed/-/redeyed-2.1.1.tgz#8984b5815d99cb220469c99eeeffe38913e6cc0b" + integrity sha1-iYS1gV2ZyyIEacme7v/jiRPmzAs= + dependencies: + esprima "~4.0.0" + regenerate@^1.2.1: version "1.4.2" resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" @@ -11277,6 +11369,16 @@ request-promise-native@^1.0.5: stealthy-require "^1.1.1" tough-cookie "^2.3.3" +request-promise@^4.2.2: + version "4.2.6" + resolved "https://registry.yarnpkg.com/request-promise/-/request-promise-4.2.6.tgz#7e7e5b9578630e6f598e3813c0f8eb342a27f0a2" + integrity sha512-HCHI3DJJUakkOr8fNoCc73E5nU5bqITjOYFMDrKHYOXWXrgD/SBaC7LjwuPymUprRyuF06UK7hd/lMHkmUXglQ== + dependencies: + bluebird "^3.5.0" + request-promise-core "1.1.4" + stealthy-require "^1.1.1" + tough-cookie "^2.3.3" + request@^2.79.0, request@^2.85.0, request@^2.88.0, request@^2.88.2: version "2.88.2" resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" @@ -12366,7 +12468,7 @@ supports-color@^3.1.0: dependencies: has-flag "^1.0.0" -supports-color@^5.3.0: +supports-color@^5.0.0, supports-color@^5.3.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== @@ -12380,6 +12482,14 @@ supports-color@^7.1.0: dependencies: has-flag "^4.0.0" +supports-hyperlinks@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-1.0.1.tgz#71daedf36cc1060ac5100c351bb3da48c29c0ef7" + integrity sha512-HHi5kVSefKaJkGYXbDuKbUGRVxqnWGn3J2e39CYcNJEfWciGq2zYtOhXLTlvrOZW1QU7VX67w7fMmWafHX9Pfw== + dependencies: + has-flag "^2.0.0" + supports-color "^5.0.0" + swarm-js@^0.1.40: version "0.1.40" resolved "https://registry.yarnpkg.com/swarm-js/-/swarm-js-0.1.40.tgz#b1bc7b6dcc76061f6c772203e004c11997e06b99" @@ -12689,7 +12799,7 @@ trim-right@^1.0.1: resolved "https://registry.yarnpkg.com/true-case-path/-/true-case-path-2.2.1.tgz#c5bf04a5bbec3fd118be4084461b3a27c4d796bf" integrity sha512-0z3j8R7MCjy10kc/g+qg7Ln3alJTodw9aDuVWZa3uiWqfuBMKeAeP2ocWcxoyM3D73yz3Jt/Pu4qPr4wHSdB/Q== -ts-essentials@^1.0.0: +ts-essentials@^1.0.0, ts-essentials@^1.0.2: version "1.0.4" resolved "https://registry.yarnpkg.com/ts-essentials/-/ts-essentials-1.0.4.tgz#ce3b5dade5f5d97cf69889c11bf7d2da8555b15a" integrity sha512-q3N1xS4vZpRouhYHDPwO0bDW3EZ6SK9CrrDHxi/D6BPReSjpVgWIOpLS2o0gSBZm+7q/wyKp6RVM1AeeW7uyfQ== @@ -12752,7 +12862,7 @@ ts-node@7.0.1: source-map-support "^0.5.6" yn "^2.0.0" -ts-node@^8.2.0: +ts-node@^8.0.2, ts-node@^8.2.0: version "8.10.2" resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-8.10.2.tgz#eee03764633b1234ddd37f8db9ec10b75ec7fb8d" integrity sha512-ISJJGgkIpDdBhWVu3jufsWpK3Rzo7bdiIXJjQc0ynKxVOVcg2oIrf2H2cejminGrptVc6q6/uynAHNCuWGbpVA== @@ -13123,6 +13233,11 @@ urix@^0.1.0: resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= +url-join@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/url-join/-/url-join-4.0.1.tgz#b642e21a2646808ffa178c4c5fda39844e12cde7" + integrity sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA== + url-parse-lax@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73" From 79df44e85e75717523266be11c28c70be7ca6682 Mon Sep 17 00:00:00 2001 From: Karl Floersch Date: Wed, 5 May 2021 10:10:55 -0700 Subject: [PATCH 25/81] feat: add skipped deposit auto heal (#760) * feat: add skipped deposit auto heal * Fix weird lint errors * Use OR instead of AND for skip check --- .changeset/thick-rings-serve.md | 5 ++ .../src/batch-submitter/tx-batch-submitter.ts | 67 ++++++++++++++++++- .../src/exec/run-batch-submitter.ts | 3 + packages/hardhat-ovm/src/index.ts | 39 +++++------ yarn.lock | 2 +- 5 files changed, 92 insertions(+), 24 deletions(-) create mode 100644 .changeset/thick-rings-serve.md diff --git a/.changeset/thick-rings-serve.md b/.changeset/thick-rings-serve.md new file mode 100644 index 0000000000000..e75c6de5a29c8 --- /dev/null +++ b/.changeset/thick-rings-serve.md @@ -0,0 +1,5 @@ +--- +'@eth-optimism/batch-submitter': patch +--- + +Add skipped deposit auto heal diff --git a/packages/batch-submitter/src/batch-submitter/tx-batch-submitter.ts b/packages/batch-submitter/src/batch-submitter/tx-batch-submitter.ts index cd71c10d20b63..d33b9e4be694d 100644 --- a/packages/batch-submitter/src/batch-submitter/tx-batch-submitter.ts +++ b/packages/batch-submitter/src/batch-submitter/tx-batch-submitter.ts @@ -26,6 +26,7 @@ import { Range, BatchSubmitter, BLOCK_OFFSET } from '.' export interface AutoFixBatchOptions { fixDoublePlayedDeposits: boolean fixMonotonicity: boolean + fixSkippedDeposits: boolean } export class TransactionBatchSubmitter extends BatchSubmitter { @@ -56,6 +57,7 @@ export class TransactionBatchSubmitter extends BatchSubmitter { autoFixBatchOptions: AutoFixBatchOptions = { fixDoublePlayedDeposits: false, fixMonotonicity: false, + fixSkippedDeposits: false, } // TODO: Remove this ) { super( @@ -422,7 +424,12 @@ export class TransactionBatchSubmitter extends BatchSubmitter { this.logger.warn('Fixing double played queue element.', { nextQueueIndex, }) - fixedBatch.push(await this._fixQueueElement(nextQueueIndex, ele)) + fixedBatch.push( + await this._fixDoublePlayedDepositQueueElement( + nextQueueIndex, + ele + ) + ) continue } nextQueueIndex++ @@ -432,6 +439,57 @@ export class TransactionBatchSubmitter extends BatchSubmitter { return fixedBatch } + const fixSkippedDeposits = async (b: Batch): Promise => { + this.logger.debug('Fixing skipped deposits...') + let nextQueueIndex = await this.chainContract.getNextQueueIndex() + const fixedBatch: Batch = [] + for (const ele of b) { + // Look for skipped deposits + while (true) { + const pendingQueueElements = await this.chainContract.getNumPendingQueueElements() + const nextRemoteQueueElements = await this.chainContract.getNextQueueIndex() + const totalQueueElements = + pendingQueueElements + nextRemoteQueueElements + // No more queue elements so we clearly haven't skipped anything + if (nextQueueIndex >= totalQueueElements) { + break + } + const [ + queueEleHash, + timestamp, + blockNumber, + ] = await this.chainContract.getQueueElement(nextQueueIndex) + + if (timestamp < ele.timestamp || blockNumber < ele.blockNumber) { + this.logger.error('Fixing skipped deposit', { + badTimestamp: ele.timestamp, + skippedQueueTimestamp: timestamp, + badBlockNumber: ele.blockNumber, + skippedQueueBlockNumber: blockNumber, + }) + // Push a dummy queue element + fixedBatch.push({ + stateRoot: ele.stateRoot, + isSequencerTx: false, + rawTransaction: undefined, + timestamp, + blockNumber, + }) + nextQueueIndex++ + } else { + // The next queue element's timestamp is after this batch element so + // we must not have skipped anything. + break + } + } + fixedBatch.push(ele) + if (!ele.isSequencerTx) { + nextQueueIndex++ + } + } + return fixedBatch + } + // TODO: Remove this super complex logic and rely on Geth to actually supply correct block data. const fixMonotonicity = async (b: Batch): Promise => { this.logger.debug('Fixing monotonicity...') @@ -534,12 +592,17 @@ export class TransactionBatchSubmitter extends BatchSubmitter { return fixedBatch } + // NOTE: It is unsafe to combine multiple autoFix options. + // If you must combine them, manually verify the output before proceeding. if (this.autoFixBatchOptions.fixDoublePlayedDeposits) { batch = await fixDoublePlayedDeposits(batch) } if (this.autoFixBatchOptions.fixMonotonicity) { batch = await fixMonotonicity(batch) } + if (this.autoFixBatchOptions.fixSkippedDeposits) { + batch = await fixSkippedDeposits(batch) + } return batch } @@ -580,7 +643,7 @@ export class TransactionBatchSubmitter extends BatchSubmitter { return { lastTimestamp, lastBlockNumber } } - private async _fixQueueElement( + private async _fixDoublePlayedDepositQueueElement( queueIndex: number, queueElement: BatchElement ): Promise { diff --git a/packages/batch-submitter/src/exec/run-batch-submitter.ts b/packages/batch-submitter/src/exec/run-batch-submitter.ts index 82609858052df..e258683984b59 100644 --- a/packages/batch-submitter/src/exec/run-batch-submitter.ts +++ b/packages/batch-submitter/src/exec/run-batch-submitter.ts @@ -127,6 +127,9 @@ const autoFixBatchOptions: AutoFixBatchOptions = { fixMonotonicity: AUTO_FIX_BATCH_OPTIONS_CONF ? AUTO_FIX_BATCH_OPTIONS_CONF.includes('fixMonotonicity') : false, + fixSkippedDeposits: AUTO_FIX_BATCH_OPTIONS_CONF + ? AUTO_FIX_BATCH_OPTIONS_CONF.includes('fixSkippedDeposits') + : false, } export const run = async () => { diff --git a/packages/hardhat-ovm/src/index.ts b/packages/hardhat-ovm/src/index.ts index 9eab025fad7fa..3b95daec5f016 100644 --- a/packages/hardhat-ovm/src/index.ts +++ b/packages/hardhat-ovm/src/index.ts @@ -108,29 +108,26 @@ const getOvmSolcPath = async (version: string): Promise => { // Hardhat on M1 Macbooks does not run TASK_COMPILE_SOLIDITY_RUN_SOLC, but instead this runs one, // TASK_COMPILE_SOLIDITY_RUN_SOLCJS. We reroute this task back to the solc task in the case // of OVM compilation. -subtask( - TASK_COMPILE_SOLIDITY_RUN_SOLCJS, - async (args, hre, runSuper) => { - const argsAny = args as any - if (argsAny.real || hre.network.ovm !== true) { - for (const file of Object.keys(argsAny.input.sources)) { - // Ignore any contract that has this tag or in ignore list - if ( - argsAny.input.sources[file].content.includes('// @unsupported: evm') - && hre.network.ovm !== true - ) { - delete argsAny.input.sources[file] - } +subtask(TASK_COMPILE_SOLIDITY_RUN_SOLCJS, async (args, hre, runSuper) => { + const argsAny = args as any + if (argsAny.real || hre.network.ovm !== true) { + for (const file of Object.keys(argsAny.input.sources)) { + // Ignore any contract that has this tag or in ignore list + if ( + argsAny.input.sources[file].content.includes('// @unsupported: evm') && + hre.network.ovm !== true + ) { + delete argsAny.input.sources[file] } - return runSuper(args) - } else { - return hre.run(TASK_COMPILE_SOLIDITY_RUN_SOLC, { - ...argsAny, - solcPath: argsAny.solcJsPath - }) } + return runSuper(args) + } else { + return hre.run(TASK_COMPILE_SOLIDITY_RUN_SOLC, { + ...argsAny, + solcPath: argsAny.solcJsPath, + }) } -) +}) subtask( TASK_COMPILE_SOLIDITY_RUN_SOLC, @@ -195,7 +192,7 @@ subtask( const ovmOutput = await hre.run(TASK_COMPILE_SOLIDITY_RUN_SOLCJS, { input: ovmInput, solcJsPath: ovmSolcPath, - real: true + real: true, }) // Just doing this to add some extra useful information to any errors in the OVM compiler output. diff --git a/yarn.lock b/yarn.lock index 7fe65730c8b94..e9d341af5f244 100644 --- a/yarn.lock +++ b/yarn.lock @@ -12096,7 +12096,7 @@ source-map-support@^0.4.15: dependencies: source-map "^0.5.6" -source-map-support@^0.5.13, source-map-support@^0.5.17, source-map-support@^0.5.6: +source-map-support@^0.5.13, source-map-support@^0.5.17, source-map-support@^0.5.19, source-map-support@^0.5.6: version "0.5.19" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== From 34ab776bec5cf2b5e99deed5b3d3b9ca7d1c0c58 Mon Sep 17 00:00:00 2001 From: Mark Tyneway Date: Wed, 5 May 2021 10:27:10 -0700 Subject: [PATCH 26/81] dtl: error logging with message, stack and code (#758) * dtl: error logging with message, stack and code * chore: add changeset --- .changeset/cyan-days-act.md | 5 +++++ .../src/services/l1-ingestion/service.ts | 7 +++++-- 2 files changed, 10 insertions(+), 2 deletions(-) create mode 100644 .changeset/cyan-days-act.md diff --git a/.changeset/cyan-days-act.md b/.changeset/cyan-days-act.md new file mode 100644 index 0000000000000..c4089ad840432 --- /dev/null +++ b/.changeset/cyan-days-act.md @@ -0,0 +1,5 @@ +--- +'@eth-optimism/data-transport-layer': patch +--- + +Better error logging in the DTL diff --git a/packages/data-transport-layer/src/services/l1-ingestion/service.ts b/packages/data-transport-layer/src/services/l1-ingestion/service.ts index daf5a8e448c0b..3bc862cf4feb5 100644 --- a/packages/data-transport-layer/src/services/l1-ingestion/service.ts +++ b/packages/data-transport-layer/src/services/l1-ingestion/service.ts @@ -201,10 +201,13 @@ export class L1IngestionService extends BaseService { } } catch (err) { if (!this.running || this.options.dangerouslyCatchAllErrors) { - this.logger.error('Caught an unhandled error', { err }) + this.logger.error('Caught an unhandled error', { + message: err.toString(), + stack: err.stack, + code: err.code, + }) await sleep(this.options.pollingInterval) } else { - // TODO: Is this the best thing to do here? throw err } } From c7d17ca261537900ba0fa5fa9b6a807464afc823 Mon Sep 17 00:00:00 2001 From: t11s Date: Wed, 5 May 2021 14:02:38 -0700 Subject: [PATCH 27/81] docs: fix bad return value comment (#756) --- packages/smock/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/smock/README.md b/packages/smock/README.md index fda50c981d768..0243a226bb92e 100644 --- a/packages/smock/README.md +++ b/packages/smock/README.md @@ -286,7 +286,7 @@ MyMockContract.smocked.myFunction.will.return.with(() => { return 'Some return value!' }) -console.log(await MyMockContract.myFunction()) // ['Some return value!'] +console.log(await MyMockContract.myFunction()) // 'Some return value!' ``` ### Returning a Function (w/ Arguments) @@ -304,7 +304,7 @@ MyMockContract.smocked.myFunction.will.return.with((myFunctionArgument: string) return myFunctionArgument }) -console.log(await MyMockContract.myFunction('Some return value!')) // ['Some return value!'] +console.log(await MyMockContract.myFunction('Some return value!')) // 'Some return value!' ``` ### Reverting (w/o Data) From b90cfb9e67062df0c6389c4066364e58a3c36b25 Mon Sep 17 00:00:00 2001 From: Mark Tyneway Date: Wed, 5 May 2021 14:51:50 -0700 Subject: [PATCH 28/81] temp: remove codechecks (#768) --- .github/workflows/ts-packages.yml | 6 ------ 1 file changed, 6 deletions(-) diff --git a/.github/workflows/ts-packages.yml b/.github/workflows/ts-packages.yml index 05138e82a6916..898d2922df840 100644 --- a/.github/workflows/ts-packages.yml +++ b/.github/workflows/ts-packages.yml @@ -61,12 +61,6 @@ jobs: - name: Print gas report run: cat packages/contracts/gas-report.txt - - name: Run codechecks - working-directory: ./packages/contracts - run: yarn codechecks - env: - CC_SECRET: ${{ secrets.CC_SECRET }} - test-coverage: name: Generate test coverage runs-on: ubuntu-latest From d2091d43d7ab0f1c04d318ab0f3c0454038854f4 Mon Sep 17 00:00:00 2001 From: smartcontracts Date: Wed, 5 May 2021 18:34:18 -0400 Subject: [PATCH 29/81] fix[contracts]: Remove verifyExclusionProof (#772) * fix[contracts]: Remove verifyExclusionProof * chore: Add changeset --- .changeset/thin-horses-change.md | 5 ++++ .../libraries/trie/Lib_MerkleTrie.sol | 28 ------------------- .../libraries/trie/Lib_SecureMerkleTrie.sol | 25 ----------------- .../trie/TestLib_MerkleTrie.sol | 18 ------------ .../trie/TestLib_SecureMerkleTrie.sol | 18 ------------ 5 files changed, 5 insertions(+), 89 deletions(-) create mode 100644 .changeset/thin-horses-change.md diff --git a/.changeset/thin-horses-change.md b/.changeset/thin-horses-change.md new file mode 100644 index 0000000000000..70a323982f508 --- /dev/null +++ b/.changeset/thin-horses-change.md @@ -0,0 +1,5 @@ +--- +'@eth-optimism/contracts': patch +--- + +Removed verifyExclusionProof function from MerkleTrie library. diff --git a/packages/contracts/contracts/optimistic-ethereum/libraries/trie/Lib_MerkleTrie.sol b/packages/contracts/contracts/optimistic-ethereum/libraries/trie/Lib_MerkleTrie.sol index b1f8a8d19eb78..2997f704b7c54 100644 --- a/packages/contracts/contracts/optimistic-ethereum/libraries/trie/Lib_MerkleTrie.sol +++ b/packages/contracts/contracts/optimistic-ethereum/libraries/trie/Lib_MerkleTrie.sol @@ -92,34 +92,6 @@ library Lib_MerkleTrie { ); } - /** - * @notice Verifies a proof that a given key is *not* present in - * the Merkle trie. - * @param _key Key of the node to search for, as a hex string. - * @param _proof Merkle trie inclusion proof for the node *nearest* the - * target node. - * @param _root Known root of the Merkle trie. Used to verify that the - * included proof is correctly constructed. - * @return _verified `true` if the key is absent in the trie, `false` otherwise. - */ - function verifyExclusionProof( - bytes memory _key, - bytes memory _proof, - bytes32 _root - ) - internal - pure - returns ( - bool _verified - ) - { - ( - bool exists, - ) = get(_key, _proof, _root); - - return exists == false; - } - /** * @notice Updates a Merkle trie and returns a new root hash. * @param _key Key of the node to update, as a hex string. diff --git a/packages/contracts/contracts/optimistic-ethereum/libraries/trie/Lib_SecureMerkleTrie.sol b/packages/contracts/contracts/optimistic-ethereum/libraries/trie/Lib_SecureMerkleTrie.sol index 80a6702540d6d..ba6aba7f09930 100644 --- a/packages/contracts/contracts/optimistic-ethereum/libraries/trie/Lib_SecureMerkleTrie.sol +++ b/packages/contracts/contracts/optimistic-ethereum/libraries/trie/Lib_SecureMerkleTrie.sol @@ -42,31 +42,6 @@ library Lib_SecureMerkleTrie { return Lib_MerkleTrie.verifyInclusionProof(key, _value, _proof, _root); } - /** - * @notice Verifies a proof that a given key is *not* present in - * the Merkle trie. - * @param _key Key of the node to search for, as a hex string. - * @param _proof Merkle trie inclusion proof for the node *nearest* the - * target node. - * @param _root Known root of the Merkle trie. Used to verify that the - * included proof is correctly constructed. - * @return _verified `true` if the key is not present in the trie, `false` otherwise. - */ - function verifyExclusionProof( - bytes memory _key, - bytes memory _proof, - bytes32 _root - ) - internal - pure - returns ( - bool _verified - ) - { - bytes memory key = _getSecureKey(_key); - return Lib_MerkleTrie.verifyExclusionProof(key, _proof, _root); - } - /** * @notice Updates a Merkle trie and returns a new root hash. * @param _key Key of the node to update, as a hex string. diff --git a/packages/contracts/contracts/test-libraries/trie/TestLib_MerkleTrie.sol b/packages/contracts/contracts/test-libraries/trie/TestLib_MerkleTrie.sol index 36335db39f142..3775c0ba98854 100644 --- a/packages/contracts/contracts/test-libraries/trie/TestLib_MerkleTrie.sol +++ b/packages/contracts/contracts/test-libraries/trie/TestLib_MerkleTrie.sol @@ -29,24 +29,6 @@ contract TestLib_MerkleTrie { ); } - function verifyExclusionProof( - bytes memory _key, - bytes memory _proof, - bytes32 _root - ) - public - pure - returns ( - bool - ) - { - return Lib_MerkleTrie.verifyExclusionProof( - _key, - _proof, - _root - ); - } - function update( bytes memory _key, bytes memory _value, diff --git a/packages/contracts/contracts/test-libraries/trie/TestLib_SecureMerkleTrie.sol b/packages/contracts/contracts/test-libraries/trie/TestLib_SecureMerkleTrie.sol index 5ab749a426473..49bf74216a016 100644 --- a/packages/contracts/contracts/test-libraries/trie/TestLib_SecureMerkleTrie.sol +++ b/packages/contracts/contracts/test-libraries/trie/TestLib_SecureMerkleTrie.sol @@ -30,24 +30,6 @@ contract TestLib_SecureMerkleTrie { ); } - function verifyExclusionProof( - bytes memory _key, - bytes memory _proof, - bytes32 _root - ) - public - pure - returns ( - bool - ) - { - return Lib_SecureMerkleTrie.verifyExclusionProof( - _key, - _proof, - _root - ); - } - function update( bytes memory _key, bytes memory _value, From a0a00525d4e6bfdd6fd577be5bba59dc521016d7 Mon Sep 17 00:00:00 2001 From: Mark Tyneway Date: Wed, 5 May 2021 15:43:45 -0700 Subject: [PATCH 30/81] fix: backport value fixes (#766) * dtl: index the value field (#686) * chore: add changeset * chore: add changeset * dtl: pass through value field * core-utils: update and test toRpcString * lint: fix * l2geth: parse value fields * chore: add changeset * dtl: prevent null reference in L1 handler (#757) * dtl: prevent reference of null value * chore: add changeset * dtl: propagate value * lint: fix --- .changeset/beige-keys-hammer.md | 5 ++++ .changeset/brown-bananas-deny.md | 5 ++++ .changeset/tough-lamps-hammer.md | 5 ++++ .changeset/violet-comics-reflect.md | 5 ++++ l2geth/rollup/client.go | 8 +++++-- packages/core-utils/src/common/hex-strings.ts | 15 ++++++++---- .../core-utils/test/common/hex-utils.spec.ts | 24 ++++++++++++++++++- .../handlers/sequencer-batch-appended.ts | 5 ++++ .../l2-ingestion/handlers/transaction.ts | 2 ++ .../src/types/database-types.ts | 2 ++ 10 files changed, 69 insertions(+), 7 deletions(-) create mode 100644 .changeset/beige-keys-hammer.md create mode 100644 .changeset/brown-bananas-deny.md create mode 100644 .changeset/tough-lamps-hammer.md create mode 100644 .changeset/violet-comics-reflect.md diff --git a/.changeset/beige-keys-hammer.md b/.changeset/beige-keys-hammer.md new file mode 100644 index 0000000000000..c7f737b878627 --- /dev/null +++ b/.changeset/beige-keys-hammer.md @@ -0,0 +1,5 @@ +--- +"@eth-optimism/data-transport-layer": patch +--- + +Parse and index the value field in the data transport layer diff --git a/.changeset/brown-bananas-deny.md b/.changeset/brown-bananas-deny.md new file mode 100644 index 0000000000000..0f8c2ca18e103 --- /dev/null +++ b/.changeset/brown-bananas-deny.md @@ -0,0 +1,5 @@ +--- +"@eth-optimism/l2geth": patch +--- + +Add value parsing to the rollup client diff --git a/.changeset/tough-lamps-hammer.md b/.changeset/tough-lamps-hammer.md new file mode 100644 index 0000000000000..204262b71f8ff --- /dev/null +++ b/.changeset/tough-lamps-hammer.md @@ -0,0 +1,5 @@ +--- +"@eth-optimism/core-utils": patch +--- + +Update toRpcHexString to accept ethers.BigNumber and add tests diff --git a/.changeset/violet-comics-reflect.md b/.changeset/violet-comics-reflect.md new file mode 100644 index 0000000000000..8f52dda5c2b98 --- /dev/null +++ b/.changeset/violet-comics-reflect.md @@ -0,0 +1,5 @@ +--- +'@eth-optimism/data-transport-layer': patch +--- + +Prevent access of null value in L1 transaction deserialization diff --git a/l2geth/rollup/client.go b/l2geth/rollup/client.go index 0e55550e46b03..795c8d39453cb 100644 --- a/l2geth/rollup/client.go +++ b/l2geth/rollup/client.go @@ -70,6 +70,7 @@ type transaction struct { BatchIndex uint64 `json:"batchIndex"` BlockNumber uint64 `json:"blockNumber"` Timestamp uint64 `json:"timestamp"` + Value hexutil.Uint64 `json:"value"` GasLimit uint64 `json:"gasLimit"` Target common.Address `json:"target"` Origin *common.Address `json:"origin"` @@ -104,6 +105,7 @@ type signature struct { // it means that the decoding failed. type decoded struct { Signature signature `json:"sig"` + Value hexutil.Uint64 `json:"value"` GasLimit uint64 `json:"gasLimit"` GasPrice uint64 `json:"gasPrice"` Nonce uint64 `json:"nonce"` @@ -228,6 +230,7 @@ func enqueueToTransaction(enqueue *Enqueue) (*types.Transaction, error) { } data := *enqueue.Data + // enqueue transactions have no value value := big.NewInt(0) tx := types.NewTransaction(nonce, target, value, gasLimit, big.NewInt(0), data) @@ -303,7 +306,7 @@ func batchedTransactionToTransaction(res *transaction, signer *types.OVMSigner) if res.Decoded != nil { nonce := res.Decoded.Nonce to := res.Decoded.Target - value := new(big.Int) + value := new(big.Int).SetUint64(uint64(res.Decoded.Value)) // Note: there are two gas limits, one top level and // another on the raw transaction itself. Maybe maxGasLimit // for the top level? @@ -357,7 +360,8 @@ func batchedTransactionToTransaction(res *transaction, signer *types.OVMSigner) gasLimit := res.GasLimit data := res.Data origin := res.Origin - tx := types.NewTransaction(nonce, target, big.NewInt(0), gasLimit, big.NewInt(0), data) + value := new(big.Int).SetUint64(uint64(res.Value)) + tx := types.NewTransaction(nonce, target, value, gasLimit, big.NewInt(0), data) txMeta := types.NewTransactionMeta( new(big.Int).SetUint64(res.BlockNumber), res.Timestamp, diff --git a/packages/core-utils/src/common/hex-strings.ts b/packages/core-utils/src/common/hex-strings.ts index d87c3673fc9eb..71b412c76b569 100644 --- a/packages/core-utils/src/common/hex-strings.ts +++ b/packages/core-utils/src/common/hex-strings.ts @@ -60,11 +60,18 @@ export const toHexString = (inp: Buffer | string | number | null): string => { } } -export const toRpcHexString = (n: number): string => { - if (n === 0) { - return '0x0' +export const toRpcHexString = (n: number | BigNumber): string => { + let num + if (typeof n === 'number') { + num = '0x' + n.toString(16) } else { - return '0x' + toHexString(n).slice(2).replace(/^0+/, '') + num = n.toHexString() + } + + if (num === '0x0') { + return num + } else { + return num.replace(/^0x0/, '0x') } } diff --git a/packages/core-utils/test/common/hex-utils.spec.ts b/packages/core-utils/test/common/hex-utils.spec.ts index 7bb26b70dec90..c91ceca9f2074 100644 --- a/packages/core-utils/test/common/hex-utils.spec.ts +++ b/packages/core-utils/test/common/hex-utils.spec.ts @@ -1,7 +1,8 @@ import { expect } from '../setup' +import { BigNumber } from 'ethers' /* Imports: Internal */ -import { getRandomHexString } from '../../src' +import { getRandomHexString, toRpcHexString } from '../../src' describe('getRandomHexString', () => { const random = global.Math.random @@ -18,3 +19,24 @@ describe('getRandomHexString', () => { expect(getRandomHexString(8)).to.equal('0x' + '88'.repeat(8)) }) }) + +describe('toRpcHexString', () => { + it('should parse 0', () => { + expect(toRpcHexString(0)).to.deep.equal('0x0') + expect(toRpcHexString(BigNumber.from(0))).to.deep.equal('0x0') + }) + + it('should parse non 0', () => { + const cases = [ + { input: 2, output: '0x2' }, + { input: BigNumber.from(2), output: '0x2' }, + { input: 100, output: '0x64' }, + { input: BigNumber.from(100), output: '0x64' }, + { input: 300, output: '0x12c' }, + { input: BigNumber.from(300), output: '0x12c' }, + ] + for (const test of cases) { + expect(toRpcHexString(test.input)).to.deep.equal(test.output) + } + }) +}) diff --git a/packages/data-transport-layer/src/services/l1-ingestion/handlers/sequencer-batch-appended.ts b/packages/data-transport-layer/src/services/l1-ingestion/handlers/sequencer-batch-appended.ts index 5ecf06fdc0cf9..c162994a7d597 100644 --- a/packages/data-transport-layer/src/services/l1-ingestion/handlers/sequencer-batch-appended.ts +++ b/packages/data-transport-layer/src/services/l1-ingestion/handlers/sequencer-batch-appended.ts @@ -5,6 +5,7 @@ import { ctcCoder, fromHexString, toHexString, + toRpcHexString, TxType, EventArgsSequencerBatchAppended, } from '@eth-optimism/core-utils' @@ -120,6 +121,7 @@ export const handleEventsSequencerBatchAppended: EventHandlerSet< data: toHexString(sequencerTransaction), queueOrigin: 'sequencer', type, + value: decoded ? decoded.value : '0x0', queueIndex: null, decoded, confirmed: true, @@ -152,6 +154,7 @@ export const handleEventsSequencerBatchAppended: EventHandlerSet< data: '0x', queueOrigin: 'l1', type: 'EIP155', + value: '0x0', queueIndex: queueIndex.toNumber(), decoded: null, confirmed: true, @@ -254,6 +257,8 @@ const maybeDecodeSequencerBatchTransaction = ( } else { throw new Error(`Unknown sequencer transaction type.`) } + // Temporary fix to propagate the value + decoded.value = '0x0' // Validate the transaction if (!validateBatchTransaction(type, decoded)) { decoded = null diff --git a/packages/data-transport-layer/src/services/l2-ingestion/handlers/transaction.ts b/packages/data-transport-layer/src/services/l2-ingestion/handlers/transaction.ts index b4199ba537016..1769004224b5b 100644 --- a/packages/data-transport-layer/src/services/l2-ingestion/handlers/transaction.ts +++ b/packages/data-transport-layer/src/services/l2-ingestion/handlers/transaction.ts @@ -32,6 +32,7 @@ export const handleSequencerBlock = { let transactionEntry: Partial = { // Legacy support. index: transactionIndex, + value: transaction.value, batchIndex: null, blockNumber: BigNumber.from(transaction.l1BlockNumber).toNumber(), timestamp: BigNumber.from(transaction.l1Timestamp).toNumber(), @@ -47,6 +48,7 @@ export const handleSequencerBlock = { r: padHexString(transaction.r, 32), s: padHexString(transaction.s, 32), }, + value: transaction.value, gasLimit: BigNumber.from(transaction.gas).toNumber(), gasPrice: BigNumber.from(transaction.gasPrice).toNumber(), // ? nonce: BigNumber.from(transaction.nonce).toNumber(), diff --git a/packages/data-transport-layer/src/types/database-types.ts b/packages/data-transport-layer/src/types/database-types.ts index 42074ee459fcd..f477f5a37f23f 100644 --- a/packages/data-transport-layer/src/types/database-types.ts +++ b/packages/data-transport-layer/src/types/database-types.ts @@ -4,6 +4,7 @@ export interface DecodedSequencerBatchTransaction { s: string v: number } + value: string gasLimit: number gasPrice: number nonce: number @@ -31,6 +32,7 @@ export interface TransactionEntry { gasLimit: number target: string origin: string + value: string queueOrigin: 'sequencer' | 'l1' queueIndex: number | null type: 'EIP155' | 'ETH_SIGN' | null From ed2ff66d014666cb27b363026a2ceb6c971cb647 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 5 May 2021 15:45:39 -0700 Subject: [PATCH 31/81] Version Packages (#681) Co-authored-by: github-actions[bot] --- .changeset/afraid-wasps-wonder.md | 5 ----- .changeset/beige-keys-hammer.md | 5 ----- .changeset/brown-bananas-deny.md | 5 ----- .changeset/cyan-days-act.md | 5 ----- .changeset/dry-bugs-relax.md | 5 ----- .changeset/famous-dragons-eat.md | 5 ----- .changeset/forty-hotels-brake.md | 5 ----- .changeset/moody-pigs-attend.md | 5 ----- .changeset/nice-walls-relate.md | 5 ----- .changeset/olive-fishes-share.md | 5 ----- .changeset/quiet-cherries-wave.md | 5 ----- .changeset/silent-turtles-add.md | 9 --------- .changeset/thick-rings-serve.md | 5 ----- .changeset/thin-horses-change.md | 5 ----- .changeset/tough-lamps-hammer.md | 5 ----- .changeset/violet-comics-reflect.md | 5 ----- .changeset/wild-cycles-care.md | 5 ----- .changeset/wild-jokes-help.md | 5 ----- integration-tests/package.json | 6 +++--- l2geth/CHANGELOG.md | 9 +++++++++ l2geth/package.json | 2 +- packages/batch-submitter/CHANGELOG.md | 15 +++++++++++++++ packages/batch-submitter/package.json | 10 +++++----- packages/common-ts/CHANGELOG.md | 6 ++++++ packages/common-ts/package.json | 2 +- packages/contracts/CHANGELOG.md | 10 ++++++++++ packages/contracts/package.json | 8 ++++---- packages/core-utils/CHANGELOG.md | 10 ++++++++++ packages/core-utils/package.json | 2 +- packages/data-transport-layer/CHANGELOG.md | 18 ++++++++++++++++++ packages/data-transport-layer/package.json | 8 ++++---- packages/hardhat-ovm/CHANGELOG.md | 8 ++++++++ packages/hardhat-ovm/package.json | 2 +- packages/message-relayer/CHANGELOG.md | 13 +++++++++++++ packages/message-relayer/package.json | 8 ++++---- packages/smock/CHANGELOG.md | 8 ++++++++ packages/smock/package.json | 4 ++-- 37 files changed, 123 insertions(+), 120 deletions(-) delete mode 100644 .changeset/afraid-wasps-wonder.md delete mode 100644 .changeset/beige-keys-hammer.md delete mode 100644 .changeset/brown-bananas-deny.md delete mode 100644 .changeset/cyan-days-act.md delete mode 100644 .changeset/dry-bugs-relax.md delete mode 100644 .changeset/famous-dragons-eat.md delete mode 100644 .changeset/forty-hotels-brake.md delete mode 100644 .changeset/moody-pigs-attend.md delete mode 100644 .changeset/nice-walls-relate.md delete mode 100644 .changeset/olive-fishes-share.md delete mode 100644 .changeset/quiet-cherries-wave.md delete mode 100644 .changeset/silent-turtles-add.md delete mode 100644 .changeset/thick-rings-serve.md delete mode 100644 .changeset/thin-horses-change.md delete mode 100644 .changeset/tough-lamps-hammer.md delete mode 100644 .changeset/violet-comics-reflect.md delete mode 100644 .changeset/wild-cycles-care.md delete mode 100644 .changeset/wild-jokes-help.md create mode 100644 packages/common-ts/CHANGELOG.md diff --git a/.changeset/afraid-wasps-wonder.md b/.changeset/afraid-wasps-wonder.md deleted file mode 100644 index 08bec59491208..0000000000000 --- a/.changeset/afraid-wasps-wonder.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@eth-optimism/data-transport-layer': patch ---- - -Update the config parsing so that it gives a better error message diff --git a/.changeset/beige-keys-hammer.md b/.changeset/beige-keys-hammer.md deleted file mode 100644 index c7f737b878627..0000000000000 --- a/.changeset/beige-keys-hammer.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@eth-optimism/data-transport-layer": patch ---- - -Parse and index the value field in the data transport layer diff --git a/.changeset/brown-bananas-deny.md b/.changeset/brown-bananas-deny.md deleted file mode 100644 index 0f8c2ca18e103..0000000000000 --- a/.changeset/brown-bananas-deny.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@eth-optimism/l2geth": patch ---- - -Add value parsing to the rollup client diff --git a/.changeset/cyan-days-act.md b/.changeset/cyan-days-act.md deleted file mode 100644 index c4089ad840432..0000000000000 --- a/.changeset/cyan-days-act.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@eth-optimism/data-transport-layer': patch ---- - -Better error logging in the DTL diff --git a/.changeset/dry-bugs-relax.md b/.changeset/dry-bugs-relax.md deleted file mode 100644 index be7ff09c0932a..0000000000000 --- a/.changeset/dry-bugs-relax.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@eth-optimism/hardhat-ovm': patch ---- - -default to 0 gasPrice if none provided in the network config diff --git a/.changeset/famous-dragons-eat.md b/.changeset/famous-dragons-eat.md deleted file mode 100644 index c2d6f96055239..0000000000000 --- a/.changeset/famous-dragons-eat.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@eth-optimism/data-transport-layer': patch ---- - -add metrics to measure http endpoint latency diff --git a/.changeset/forty-hotels-brake.md b/.changeset/forty-hotels-brake.md deleted file mode 100644 index da742376623f4..0000000000000 --- a/.changeset/forty-hotels-brake.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@eth-optimism/l2geth': patch ---- - -Protect a possible `nil` reference in `eth_call` when the blockchain is empty diff --git a/.changeset/moody-pigs-attend.md b/.changeset/moody-pigs-attend.md deleted file mode 100644 index 141cdfecc985e..0000000000000 --- a/.changeset/moody-pigs-attend.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@eth-optimism/batch-submitter': patch ---- - -add key metrics to batch submitter diff --git a/.changeset/nice-walls-relate.md b/.changeset/nice-walls-relate.md deleted file mode 100644 index da50f111eab2d..0000000000000 --- a/.changeset/nice-walls-relate.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@eth-optimism/l2geth': patch ---- - -Update the start script to be more configurable diff --git a/.changeset/olive-fishes-share.md b/.changeset/olive-fishes-share.md deleted file mode 100644 index 9827b08302ec3..0000000000000 --- a/.changeset/olive-fishes-share.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@eth-optimism/hardhat-ovm': patch ---- - -Ensure hardhat does not fail if no input sources provided diff --git a/.changeset/quiet-cherries-wave.md b/.changeset/quiet-cherries-wave.md deleted file mode 100644 index 67c56109f5333..0000000000000 --- a/.changeset/quiet-cherries-wave.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@eth-optimism/hardhat-ovm": patch ---- - -fix(hh-ovm): Working compilation for M1 macs diff --git a/.changeset/silent-turtles-add.md b/.changeset/silent-turtles-add.md deleted file mode 100644 index 068fd7b45b29e..0000000000000 --- a/.changeset/silent-turtles-add.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -'@eth-optimism/common-ts': minor -'@eth-optimism/core-utils': minor -'@eth-optimism/batch-submitter': patch -'@eth-optimism/data-transport-layer': patch -'@eth-optimism/message-relayer': patch ---- - -move metrics, logger, and base-service to new common-ts package diff --git a/.changeset/thick-rings-serve.md b/.changeset/thick-rings-serve.md deleted file mode 100644 index e75c6de5a29c8..0000000000000 --- a/.changeset/thick-rings-serve.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@eth-optimism/batch-submitter': patch ---- - -Add skipped deposit auto heal diff --git a/.changeset/thin-horses-change.md b/.changeset/thin-horses-change.md deleted file mode 100644 index 70a323982f508..0000000000000 --- a/.changeset/thin-horses-change.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@eth-optimism/contracts': patch ---- - -Removed verifyExclusionProof function from MerkleTrie library. diff --git a/.changeset/tough-lamps-hammer.md b/.changeset/tough-lamps-hammer.md deleted file mode 100644 index 204262b71f8ff..0000000000000 --- a/.changeset/tough-lamps-hammer.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@eth-optimism/core-utils": patch ---- - -Update toRpcHexString to accept ethers.BigNumber and add tests diff --git a/.changeset/violet-comics-reflect.md b/.changeset/violet-comics-reflect.md deleted file mode 100644 index 8f52dda5c2b98..0000000000000 --- a/.changeset/violet-comics-reflect.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@eth-optimism/data-transport-layer': patch ---- - -Prevent access of null value in L1 transaction deserialization diff --git a/.changeset/wild-cycles-care.md b/.changeset/wild-cycles-care.md deleted file mode 100644 index a7927a9ecdc08..0000000000000 --- a/.changeset/wild-cycles-care.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@eth-optimism/contracts": patch ---- - -Add pause(), blockMessage() and allowMessage() to L1 messenger diff --git a/.changeset/wild-jokes-help.md b/.changeset/wild-jokes-help.md deleted file mode 100644 index 4ec280b9a5aba..0000000000000 --- a/.changeset/wild-jokes-help.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@eth-optimism/l2geth': patch ---- - -Update `scripts/start.sh` to regenesis v0.2.0 diff --git a/integration-tests/package.json b/integration-tests/package.json index 367f071794b60..c5f90c109ce22 100644 --- a/integration-tests/package.json +++ b/integration-tests/package.json @@ -16,9 +16,9 @@ "clean": "rimraf cache artifacts artifacts-ovm cache-ovm" }, "devDependencies": { - "@eth-optimism/contracts": "^0.2.8", - "@eth-optimism/core-utils": "^0.3.2", - "@eth-optimism/hardhat-ovm": "^0.1.0", + "@eth-optimism/contracts": "^0.2.9", + "@eth-optimism/core-utils": "^0.4.0", + "@eth-optimism/hardhat-ovm": "^0.1.1", "@ethersproject/providers": "^5.0.24", "@nomiclabs/hardhat-ethers": "^2.0.2", "chai": "^4.3.3", diff --git a/l2geth/CHANGELOG.md b/l2geth/CHANGELOG.md index 59a079ce69033..8d43374228f4c 100644 --- a/l2geth/CHANGELOG.md +++ b/l2geth/CHANGELOG.md @@ -1,5 +1,14 @@ # Changelog +## 0.2.6 + +### Patch Changes + +- a0a0052: Add value parsing to the rollup client +- 20df745: Protect a possible `nil` reference in `eth_call` when the blockchain is empty +- 9f1529c: Update the start script to be more configurable +- 925675d: Update `scripts/start.sh` to regenesis v0.2.0 + ## 0.2.5 ### Patch Changes diff --git a/l2geth/package.json b/l2geth/package.json index 7d60000aa44a4..00cb6f1e32459 100644 --- a/l2geth/package.json +++ b/l2geth/package.json @@ -1,5 +1,5 @@ { "name": "@eth-optimism/l2geth", - "version": "0.2.5", + "version": "0.2.6", "private": true } diff --git a/packages/batch-submitter/CHANGELOG.md b/packages/batch-submitter/CHANGELOG.md index e00df7018c30a..c961b97c39d57 100644 --- a/packages/batch-submitter/CHANGELOG.md +++ b/packages/batch-submitter/CHANGELOG.md @@ -1,5 +1,20 @@ # Changelog +## 0.2.4 + +### Patch Changes + +- 12dbd81: add key metrics to batch submitter +- 28dc442: move metrics, logger, and base-service to new common-ts package +- 79df44e: Add skipped deposit auto heal +- Updated dependencies [28dc442] +- Updated dependencies [d2091d4] +- Updated dependencies [a0a0052] +- Updated dependencies [0ef3069] + - @eth-optimism/common-ts@0.1.0 + - @eth-optimism/core-utils@0.4.0 + - @eth-optimism/contracts@0.2.9 + ## 0.2.3 ### Patch Changes diff --git a/packages/batch-submitter/package.json b/packages/batch-submitter/package.json index 231a7f8845e99..daed4f2d9279b 100644 --- a/packages/batch-submitter/package.json +++ b/packages/batch-submitter/package.json @@ -1,6 +1,6 @@ { "name": "@eth-optimism/batch-submitter", - "version": "0.2.3", + "version": "0.2.4", "private": true, "description": "[Optimism] Batch submission for sequencer & aggregators", "main": "dist/index", @@ -31,9 +31,9 @@ "url": "https://github.com/ethereum-optimism/optimism-monorepo.git" }, "dependencies": { - "@eth-optimism/common-ts": "^0.0.1", - "@eth-optimism/contracts": "^0.2.8", - "@eth-optimism/core-utils": "^0.3.2", + "@eth-optimism/common-ts": "^0.1.0", + "@eth-optimism/contracts": "^0.2.9", + "@eth-optimism/core-utils": "^0.4.0", "@eth-optimism/ynatm": "^0.2.2", "@ethersproject/abstract-provider": "^5.0.5", "@ethersproject/providers": "^5.0.14", @@ -44,7 +44,7 @@ "prom-client": "^13.1.0" }, "devDependencies": { - "@eth-optimism/smock": "^1.1.1", + "@eth-optimism/smock": "^1.1.2", "@nomiclabs/hardhat-ethers": "^2.0.2", "@nomiclabs/hardhat-waffle": "^2.0.1", "@types/chai": "^4.1.7", diff --git a/packages/common-ts/CHANGELOG.md b/packages/common-ts/CHANGELOG.md new file mode 100644 index 0000000000000..dbbcb19f72650 --- /dev/null +++ b/packages/common-ts/CHANGELOG.md @@ -0,0 +1,6 @@ +# @eth-optimism/common-ts + +## 0.1.0 +### Minor Changes + +- 28dc442: move metrics, logger, and base-service to new common-ts package diff --git a/packages/common-ts/package.json b/packages/common-ts/package.json index f08d72130040a..92c4eece3fdde 100644 --- a/packages/common-ts/package.json +++ b/packages/common-ts/package.json @@ -1,6 +1,6 @@ { "name": "@eth-optimism/common-ts", - "version": "0.0.1", + "version": "0.1.0", "main": "dist/index", "files": [ "dist/*" diff --git a/packages/contracts/CHANGELOG.md b/packages/contracts/CHANGELOG.md index 08a9e4c49f2b5..2060d28650775 100644 --- a/packages/contracts/CHANGELOG.md +++ b/packages/contracts/CHANGELOG.md @@ -1,5 +1,15 @@ # Changelog +## 0.2.9 + +### Patch Changes + +- d2091d4: Removed verifyExclusionProof function from MerkleTrie library. +- 0ef3069: Add pause(), blockMessage() and allowMessage() to L1 messenger +- Updated dependencies [28dc442] +- Updated dependencies [a0a0052] + - @eth-optimism/core-utils@0.4.0 + ## 0.2.8 ### Patch Changes diff --git a/packages/contracts/package.json b/packages/contracts/package.json index 2f4a03e7008f6..49a683b54cc94 100644 --- a/packages/contracts/package.json +++ b/packages/contracts/package.json @@ -1,6 +1,6 @@ { "name": "@eth-optimism/contracts", - "version": "0.2.8", + "version": "0.2.9", "main": "dist/index", "files": [ "dist/**/*.js", @@ -45,7 +45,7 @@ "generate-markdown": "node scripts/generate-markdown.js" }, "dependencies": { - "@eth-optimism/core-utils": "^0.3.2", + "@eth-optimism/core-utils": "^0.4.0", "@eth-optimism/solc": "^0.6.12-alpha.1", "@ethersproject/abstract-provider": "^5.0.8", "@ethersproject/contracts": "^5.0.5", @@ -58,8 +58,8 @@ }, "devDependencies": { "@codechecks/client": "^0.1.10", - "@eth-optimism/hardhat-ovm": "^0.1.0", - "@eth-optimism/smock": "^1.1.1", + "@eth-optimism/hardhat-ovm": "^0.1.1", + "@eth-optimism/smock": "^1.1.2", "@nomiclabs/hardhat-ethers": "^2.0.1", "@nomiclabs/hardhat-waffle": "^2.0.1", "@typechain/ethers-v5": "1.0.0", diff --git a/packages/core-utils/CHANGELOG.md b/packages/core-utils/CHANGELOG.md index c1f9a5652e013..9df2d94b9e86a 100644 --- a/packages/core-utils/CHANGELOG.md +++ b/packages/core-utils/CHANGELOG.md @@ -1,5 +1,15 @@ # @eth-optimism/core-utils +## 0.4.0 + +### Minor Changes + +- 28dc442: move metrics, logger, and base-service to new common-ts package + +### Patch Changes + +- a0a0052: Update toRpcHexString to accept ethers.BigNumber and add tests + ## 0.3.2 ### Patch Changes diff --git a/packages/core-utils/package.json b/packages/core-utils/package.json index 8459d4eae408d..e78264cec706e 100644 --- a/packages/core-utils/package.json +++ b/packages/core-utils/package.json @@ -1,6 +1,6 @@ { "name": "@eth-optimism/core-utils", - "version": "0.3.2", + "version": "0.4.0", "main": "dist/index", "files": [ "dist/*" diff --git a/packages/data-transport-layer/CHANGELOG.md b/packages/data-transport-layer/CHANGELOG.md index ef9bc38ce4cd1..f5e17e73676b7 100644 --- a/packages/data-transport-layer/CHANGELOG.md +++ b/packages/data-transport-layer/CHANGELOG.md @@ -1,5 +1,23 @@ # data transport layer +## 0.2.4 + +### Patch Changes + +- 47e40a2: Update the config parsing so that it gives a better error message +- a0a0052: Parse and index the value field in the data transport layer +- 34ab776: Better error logging in the DTL +- e6350e2: add metrics to measure http endpoint latency +- 28dc442: move metrics, logger, and base-service to new common-ts package +- a0a0052: Prevent access of null value in L1 transaction deserialization +- Updated dependencies [28dc442] +- Updated dependencies [d2091d4] +- Updated dependencies [a0a0052] +- Updated dependencies [0ef3069] + - @eth-optimism/common-ts@0.1.0 + - @eth-optimism/core-utils@0.4.0 + - @eth-optimism/contracts@0.2.9 + ## 0.2.3 ### Patch Changes diff --git a/packages/data-transport-layer/package.json b/packages/data-transport-layer/package.json index 9287f64a3b66c..9cc4b30d5c364 100644 --- a/packages/data-transport-layer/package.json +++ b/packages/data-transport-layer/package.json @@ -1,6 +1,6 @@ { "name": "@eth-optimism/data-transport-layer", - "version": "0.2.3", + "version": "0.2.4", "private": true, "main": "dist/index", "files": [ @@ -19,9 +19,9 @@ "build": "tsc -p tsconfig.build.json" }, "dependencies": { - "@eth-optimism/common-ts": "^0.0.1", - "@eth-optimism/contracts": "^0.2.8", - "@eth-optimism/core-utils": "^0.3.2", + "@eth-optimism/common-ts": "^0.1.0", + "@eth-optimism/contracts": "^0.2.9", + "@eth-optimism/core-utils": "^0.4.0", "@ethersproject/providers": "^5.0.21", "@sentry/node": "^6.3.1", "@sentry/tracing": "^6.3.1", diff --git a/packages/hardhat-ovm/CHANGELOG.md b/packages/hardhat-ovm/CHANGELOG.md index 60e4569f998b4..399fc9703d648 100644 --- a/packages/hardhat-ovm/CHANGELOG.md +++ b/packages/hardhat-ovm/CHANGELOG.md @@ -1,5 +1,13 @@ # @eth-optimism/hardhat-ovm +## 0.1.1 + +### Patch Changes + +- d32d915: default to 0 gasPrice if none provided in the network config +- cc4b096: Ensure hardhat does not fail if no input sources provided +- daf975f: fix(hh-ovm): Working compilation for M1 macs + ## 0.1.0 ### Minor Changes diff --git a/packages/hardhat-ovm/package.json b/packages/hardhat-ovm/package.json index e9b80a1800c3e..d9d9a61de59b7 100644 --- a/packages/hardhat-ovm/package.json +++ b/packages/hardhat-ovm/package.json @@ -1,6 +1,6 @@ { "name": "@eth-optimism/hardhat-ovm", - "version": "0.1.0", + "version": "0.1.1", "main": "dist/index", "types": "dist/index", "files": [ diff --git a/packages/message-relayer/CHANGELOG.md b/packages/message-relayer/CHANGELOG.md index 1a1f604c9659f..2bb5548d659ca 100644 --- a/packages/message-relayer/CHANGELOG.md +++ b/packages/message-relayer/CHANGELOG.md @@ -1,5 +1,18 @@ # @eth-optimism/message-relayer +## 0.0.5 + +### Patch Changes + +- 28dc442: move metrics, logger, and base-service to new common-ts package +- Updated dependencies [28dc442] +- Updated dependencies [d2091d4] +- Updated dependencies [a0a0052] +- Updated dependencies [0ef3069] + - @eth-optimism/common-ts@0.1.0 + - @eth-optimism/core-utils@0.4.0 + - @eth-optimism/contracts@0.2.9 + ## 0.0.4 ### Patch Changes diff --git a/packages/message-relayer/package.json b/packages/message-relayer/package.json index ca00df58a2564..e3f78bacaa2ca 100644 --- a/packages/message-relayer/package.json +++ b/packages/message-relayer/package.json @@ -1,6 +1,6 @@ { "name": "@eth-optimism/message-relayer", - "version": "0.0.4", + "version": "0.0.5", "private": true, "description": "[Optimism] Cross Domain Message Relayer service", "main": "dist/index", @@ -29,9 +29,9 @@ "url": "https://github.com/ethereum-optimism/optimism.git" }, "dependencies": { - "@eth-optimism/core-utils": "^0.3.0", - "@eth-optimism/common-ts": "^0.0.1", - "@eth-optimism/contracts": "^0.2.5", + "@eth-optimism/core-utils": "^0.4.0", + "@eth-optimism/common-ts": "^0.1.0", + "@eth-optimism/contracts": "^0.2.9", "dotenv": "^8.2.0", "ethers": "^5.1.0", "google-spreadsheet": "^3.1.15", diff --git a/packages/smock/CHANGELOG.md b/packages/smock/CHANGELOG.md index 63e4dcb4e4b83..6ca679caaa3fe 100644 --- a/packages/smock/CHANGELOG.md +++ b/packages/smock/CHANGELOG.md @@ -1,5 +1,13 @@ # @eth-optimism/smock +## 1.1.2 + +### Patch Changes + +- Updated dependencies [28dc442] +- Updated dependencies [a0a0052] + - @eth-optimism/core-utils@0.4.0 + ## 1.1.1 ### Patch Changes diff --git a/packages/smock/package.json b/packages/smock/package.json index 9e3a42f347487..1996ee93727ac 100644 --- a/packages/smock/package.json +++ b/packages/smock/package.json @@ -3,7 +3,7 @@ "files": [ "dist/src/*" ], - "version": "1.1.1", + "version": "1.1.2", "main": "dist/src/index", "types": "dist/src/index", "license": "MIT", @@ -22,7 +22,7 @@ "hardhat": "^2.2.1" }, "dependencies": { - "@eth-optimism/core-utils": "^0.3.2", + "@eth-optimism/core-utils": "^0.4.0", "@ethersproject/abi": "^5.0.13", "@ethersproject/abstract-provider": "^5.0.10", "bn.js": "^5.2.0" From 8168765ec4625d96978214c40daa0b88f5fb25c7 Mon Sep 17 00:00:00 2001 From: Elena Gesheva Date: Thu, 6 May 2021 16:43:46 +0300 Subject: [PATCH 32/81] Reinstate codechecks (#784) * Reinstate codechecks * Upgrade to @codechecks/client@0.1.10-beta --- .github/workflows/ts-packages.yml | 6 ++++++ packages/contracts/package.json | 2 +- yarn.lock | 8 ++++---- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ts-packages.yml b/.github/workflows/ts-packages.yml index 898d2922df840..05138e82a6916 100644 --- a/.github/workflows/ts-packages.yml +++ b/.github/workflows/ts-packages.yml @@ -61,6 +61,12 @@ jobs: - name: Print gas report run: cat packages/contracts/gas-report.txt + - name: Run codechecks + working-directory: ./packages/contracts + run: yarn codechecks + env: + CC_SECRET: ${{ secrets.CC_SECRET }} + test-coverage: name: Generate test coverage runs-on: ubuntu-latest diff --git a/packages/contracts/package.json b/packages/contracts/package.json index 49a683b54cc94..147080222d33c 100644 --- a/packages/contracts/package.json +++ b/packages/contracts/package.json @@ -57,7 +57,7 @@ "solidity-coverage": "^0.7.16" }, "devDependencies": { - "@codechecks/client": "^0.1.10", + "@codechecks/client": "0.1.10-beta", "@eth-optimism/hardhat-ovm": "^0.1.1", "@eth-optimism/smock": "^1.1.2", "@nomiclabs/hardhat-ethers": "^2.0.1", diff --git a/yarn.lock b/yarn.lock index e9d341af5f244..b259654a6f787 100644 --- a/yarn.lock +++ b/yarn.lock @@ -214,10 +214,10 @@ human-id "^1.0.2" prettier "^1.19.1" -"@codechecks/client@^0.1.10": - version "0.1.10" - resolved "https://registry.yarnpkg.com/@codechecks/client/-/client-0.1.10.tgz#41fe736c424976d9feb8116b131fb9c1f099d105" - integrity sha512-rvX+LknmMohsLTU8mHJqIcNTo8fKfw6A5i7JvT6JJWqwCLi+TujHpRO8BLf48iF96+gU5viVvKfRaUyhc3wloA== +"@codechecks/client@0.1.10-beta": + version "0.1.10-beta" + resolved "https://registry.yarnpkg.com/@codechecks/client/-/client-0.1.10-beta.tgz#d93481214f43c1463586d9ca697d358a74fdc093" + integrity sha512-Wja7f4pxPK7A0D5h5RB7SLJCH0+H3Kz+mRXXX5Dj/58/aB1Tp2sXNu0bt0ESDE7CsAd/fROlf+Tu2nrn2g//fA== dependencies: bluebird "^3.5.3" chalk "^2.4.2" From 575bcf68c083dd1a39b981dddf199bc26650a42e Mon Sep 17 00:00:00 2001 From: Annie Ke Date: Thu, 6 May 2021 09:43:11 -0700 Subject: [PATCH 33/81] feat[dtl]: add node env (#735) * move verbose log to debug * feat: add node env to dtl * changeset and new line * conditional sentry and metrics initialization --- .changeset/four-gifts-cry.md | 6 ++++ packages/common-ts/src/base-service.ts | 5 +-- packages/data-transport-layer/.env.example | 4 +++ .../src/services/main/service.ts | 4 +++ .../data-transport-layer/src/services/run.ts | 6 ++++ .../src/services/server/service.ts | 33 +++++++++++++++---- 6 files changed, 48 insertions(+), 10 deletions(-) create mode 100644 .changeset/four-gifts-cry.md diff --git a/.changeset/four-gifts-cry.md b/.changeset/four-gifts-cry.md new file mode 100644 index 0000000000000..d32ace353a81e --- /dev/null +++ b/.changeset/four-gifts-cry.md @@ -0,0 +1,6 @@ +--- +'@eth-optimism/common-ts': patch +'@eth-optimism/data-transport-layer': patch +--- + +add environment and network to dtl, move metric init to app from base-service diff --git a/packages/common-ts/src/base-service.ts b/packages/common-ts/src/base-service.ts index e791b5ecd89a1..df21cf2006018 100644 --- a/packages/common-ts/src/base-service.ts +++ b/packages/common-ts/src/base-service.ts @@ -26,7 +26,6 @@ export class BaseService { this.name = name this.options = mergeDefaultOptions(options, optionSettings) this.logger = new Logger({ name }) - this.metrics = new Metrics({ prefix: name }) } /** @@ -39,9 +38,7 @@ export class BaseService { this.logger.info('Service is initializing...') await this._init() - this.logger.info('Service has initialized.', { - options: this.options, - }) + this.logger.info('Service has initialized.') this.initialized = true } diff --git a/packages/data-transport-layer/.env.example b/packages/data-transport-layer/.env.example index a6c7769e195eb..5885cb207cfb5 100644 --- a/packages/data-transport-layer/.env.example +++ b/packages/data-transport-layer/.env.example @@ -1,4 +1,7 @@ # General options +DATA_TRANSPORT_LAYER__NODE_ENV=development +# Leave blank during local development +DATA_TRANSPORT_LAYER__ETH_NETWORK_NAME= DATA_TRANSPORT_LAYER__DB_PATH=./db DATA_TRANSPORT_LAYER__ADDRESS_MANAGER= DATA_TRANSPORT_LAYER__POLLING_INTERVAL=5000 @@ -26,3 +29,4 @@ DATA_TRANSPORT_LAYER__LEGACY_SEQUENCER_COMPATIBILITY=false # Monitoring # Leave the SENTRY_DSN variable unset during local development DATA_TRANSPORT_LAYER__SENTRY_DSN= +DATA_TRANSPORT_LAYER__SENTRY_TRACE_RATE= diff --git a/packages/data-transport-layer/src/services/main/service.ts b/packages/data-transport-layer/src/services/main/service.ts index 1021d902aa795..d5f4ceb95e9db 100644 --- a/packages/data-transport-layer/src/services/main/service.ts +++ b/packages/data-transport-layer/src/services/main/service.ts @@ -10,6 +10,9 @@ import { validators } from '../../utils' import { L2IngestionService } from '../l2-ingestion/service' export interface L1DataTransportServiceOptions { + nodeEnv: string + ethNetworkName?: 'mainnet' | 'kovan' | 'goerli' + release: string addressManager: string confirmations: number dangerouslyCatchAllErrors?: boolean @@ -26,6 +29,7 @@ export interface L1DataTransportServiceOptions { transactionsPerPollingInterval: number legacySequencerCompatibility: boolean sentryDsn?: string + sentryTraceRate?: number defaultBackend: string } diff --git a/packages/data-transport-layer/src/services/run.ts b/packages/data-transport-layer/src/services/run.ts index 6938f4ac11e79..9074916a48583 100644 --- a/packages/data-transport-layer/src/services/run.ts +++ b/packages/data-transport-layer/src/services/run.ts @@ -10,8 +10,10 @@ interface Bcfg { str: (name: string, defaultValue?: string) => string uint: (name: string, defaultValue?: number) => number bool: (name: string, defaultValue?: boolean) => boolean + ufloat: (name: string, defaultValue?: number) => number } +type ethNetwork = 'mainnet' | 'kovan' | 'goerli' ;(async () => { try { dotenv.config() @@ -23,6 +25,9 @@ interface Bcfg { }) const service = new L1DataTransportService({ + nodeEnv: config.str('node-env', 'development'), + ethNetworkName: config.str('eth-network-name') as ethNetwork, + release: `data-transport-layer@${process.env.npm_package_version}`, dbPath: config.str('db-path', './db'), port: config.uint('server-port', 7878), hostname: config.str('server-hostname', 'localhost'), @@ -49,6 +54,7 @@ interface Bcfg { ), defaultBackend: config.str('default-backend', 'l1'), sentryDsn: config.str('sentry-dsn'), + sentryTraceRate: config.ufloat('sentry-trace-rate', 0.05), }) await service.start() diff --git a/packages/data-transport-layer/src/services/server/service.ts b/packages/data-transport-layer/src/services/server/service.ts index ba21bc6a22b2c..63a76164d42e5 100644 --- a/packages/data-transport-layer/src/services/server/service.ts +++ b/packages/data-transport-layer/src/services/server/service.ts @@ -1,5 +1,5 @@ /* Imports: External */ -import { BaseService } from '@eth-optimism/common-ts' +import { BaseService, Metrics } from '@eth-optimism/common-ts' import express, { Request, Response } from 'express' import promBundle from 'express-prom-bundle' import cors from 'cors' @@ -106,29 +106,50 @@ export class L1TransportServer extends BaseService { private _initializeApp() { // TODO: Maybe pass this in as a parameter instead of creating it here? this.state.app = express() + if (this.options.ethNetworkName) { + this._initMonitoring() + } + this.state.app.use(cors()) + this._registerAllRoutes() + // Sentry error handling must be after all controllers + // and before other error middleware + if (this.options.ethNetworkName) { + this.state.app.use(Sentry.Handlers.errorHandler()) + } + } + + /** + * Initialize Sentry and Prometheus metrics for deployed instances + */ + private _initMonitoring() { // Init Sentry options Sentry.init({ dsn: this.options.sentryDsn, - release: `data-transport-layer@${process.env.npm_package_version}`, + release: this.options.release, integrations: [ new Sentry.Integrations.Http({ tracing: true }), new Tracing.Integrations.Express({ app: this.state.app, }), ], - tracesSampleRate: 0.05, + tracesSampleRate: this.options.sentryTraceRate, }) this.state.app.use(Sentry.Handlers.requestHandler()) this.state.app.use(Sentry.Handlers.tracingHandler()) // Init metrics + this.metrics = new Metrics({ + prefix: this.name, + labels: { + environment: this.options.nodeEnv, + network: this.options.ethNetworkName, + release: this.options.release, + }, + }) const metricsMiddleware = promBundle({ includeMethod: true, includePath: true, }) this.state.app.use(metricsMiddleware) - this.state.app.use(cors()) - this._registerAllRoutes() - this.state.app.use(Sentry.Handlers.errorHandler()) } /** From ce7fa52b392f1932fc4f4ee10f4f22d23d9c0769 Mon Sep 17 00:00:00 2001 From: Mark Tyneway Date: Thu, 6 May 2021 11:15:25 -0700 Subject: [PATCH 34/81] fix: tx enums (#781) * enums: use additional enum for eth_sign txs * chore: add changeset --- .changeset/fluffy-mangos-rest.md | 6 ++++++ packages/core-utils/src/coders/ecdsa-coder.ts | 20 +++++++++++++++++++ .../handlers/sequencer-batch-appended.ts | 3 +++ 3 files changed, 29 insertions(+) create mode 100644 .changeset/fluffy-mangos-rest.md diff --git a/.changeset/fluffy-mangos-rest.md b/.changeset/fluffy-mangos-rest.md new file mode 100644 index 0000000000000..1892226488894 --- /dev/null +++ b/.changeset/fluffy-mangos-rest.md @@ -0,0 +1,6 @@ +--- +'@eth-optimism/core-utils': patch +'@eth-optimism/data-transport-layer': patch +--- + +Add an additional enum for EthSign transactions as they now are batch submitted with 2 different enum values diff --git a/packages/core-utils/src/coders/ecdsa-coder.ts b/packages/core-utils/src/coders/ecdsa-coder.ts index 64fc644beefb0..be381a1077230 100644 --- a/packages/core-utils/src/coders/ecdsa-coder.ts +++ b/packages/core-utils/src/coders/ecdsa-coder.ts @@ -9,11 +9,13 @@ import { Coder, Signature, Uint16, Uint8, Uint24, Address } from './types' export enum TxType { EIP155 = 0, EthSign = 1, + EthSign2 = 2, } export const txTypePlainText = { 0: TxType.EIP155, 1: TxType.EthSign, + 2: TxType.EthSign2, EIP155: TxType.EIP155, EthSign: TxType.EthSign, } @@ -169,6 +171,20 @@ class EthSignTxCoder extends DefaultEcdsaTxCoder { } } +class EthSign2TxCoder extends DefaultEcdsaTxCoder { + constructor() { + super(TxType.EthSign2) + } + + public encode(txData: EthSignTxData): string { + return super.encode(txData) + } + + public decode(txData: string): EthSignTxData { + return super.decode(txData) + } +} + class Eip155TxCoder extends DefaultEcdsaTxCoder { constructor() { super(TxType.EIP155) @@ -209,6 +225,9 @@ function decode(data: string | Buffer): EIP155TxData { if (type === TxType.EthSign) { return new EthSignTxCoder().decode(data) } + if (type === TxType.EthSign2) { + return new EthSign2TxCoder().decode(data) + } return null } @@ -218,6 +237,7 @@ function decode(data: string | Buffer): EIP155TxData { export const ctcCoder = { eip155TxData: new Eip155TxCoder(), ethSignTxData: new EthSignTxCoder(), + ethSign2TxData: new EthSign2TxCoder(), encode, decode, } diff --git a/packages/data-transport-layer/src/services/l1-ingestion/handlers/sequencer-batch-appended.ts b/packages/data-transport-layer/src/services/l1-ingestion/handlers/sequencer-batch-appended.ts index c162994a7d597..c755898eec934 100644 --- a/packages/data-transport-layer/src/services/l1-ingestion/handlers/sequencer-batch-appended.ts +++ b/packages/data-transport-layer/src/services/l1-ingestion/handlers/sequencer-batch-appended.ts @@ -254,6 +254,9 @@ const maybeDecodeSequencerBatchTransaction = ( } else if (txType === TxType.EthSign) { type = 'ETH_SIGN' decoded = ctcCoder.ethSignTxData.decode(transaction.toString('hex')) + } else if (txType === TxType.EthSign2) { + type = 'ETH_SIGN' + decoded = ctcCoder.ethSign2TxData.decode(transaction.toString('hex')) } else { throw new Error(`Unknown sequencer transaction type.`) } From 6dc1877490535dabc6ed5f127b5269cd5316e7e6 Mon Sep 17 00:00:00 2001 From: smartcontracts Date: Thu, 6 May 2021 15:23:17 -0400 Subject: [PATCH 35/81] fix[contracts]: Reduce npm package size (#780) * fix[contracts]: Reduce npm package size * chore[contracts]: Add changeset --- .changeset/thirty-planets-obey.md | 5 +++++ packages/contracts/package.json | 4 ++-- 2 files changed, 7 insertions(+), 2 deletions(-) create mode 100644 .changeset/thirty-planets-obey.md diff --git a/.changeset/thirty-planets-obey.md b/.changeset/thirty-planets-obey.md new file mode 100644 index 0000000000000..6f61807d01145 --- /dev/null +++ b/.changeset/thirty-planets-obey.md @@ -0,0 +1,5 @@ +--- +'@eth-optimism/contracts': patch +--- + +Heavily reduces npm package size by excluding unnecessary files. diff --git a/packages/contracts/package.json b/packages/contracts/package.json index 147080222d33c..d772a9ffee564 100644 --- a/packages/contracts/package.json +++ b/packages/contracts/package.json @@ -6,8 +6,8 @@ "dist/**/*.js", "dist/types/*.ts", "dist/types-ovm/*.ts", - "artifacts/**/*.json", - "artifacts-ovm/**/*.json", + "artifacts/contracts/*.json", + "artifacts-ovm/contracts/*.json", "OVM", "iOVM", "libraries", From 1d40586614dcf56103b371f89e3a7830f53194dd Mon Sep 17 00:00:00 2001 From: smartcontracts Date: Thu, 6 May 2021 15:24:13 -0400 Subject: [PATCH 36/81] chore: Remove various unused dependencies (#782) * chore: Remove various unused dependencies * fix: Move @types/chai-as-promised to integration-tests * fix: waffle-ovm.json compiler import path --- .changeset/clever-fishes-sneeze.md | 11 ++++ examples/waffle/waffle-ovm.json | 2 +- integration-tests/package.json | 1 + packages/batch-submitter/package.json | 3 -- packages/common-ts/package.json | 3 -- packages/contracts/package.json | 1 - packages/core-utils/package.json | 3 -- packages/data-transport-layer/package.json | 3 -- packages/hardhat-ovm/package.json | 3 -- packages/smock/package.json | 1 - yarn.lock | 58 ++-------------------- 11 files changed, 17 insertions(+), 72 deletions(-) create mode 100644 .changeset/clever-fishes-sneeze.md diff --git a/.changeset/clever-fishes-sneeze.md b/.changeset/clever-fishes-sneeze.md new file mode 100644 index 0000000000000..ef2e0199c3dd3 --- /dev/null +++ b/.changeset/clever-fishes-sneeze.md @@ -0,0 +1,11 @@ +--- +'@eth-optimism/batch-submitter': patch +'@eth-optimism/common-ts': patch +'@eth-optimism/contracts': patch +'@eth-optimism/core-utils': patch +'@eth-optimism/data-transport-layer': patch +'@eth-optimism/hardhat-ovm': patch +'@eth-optimism/smock': patch +--- + +Removed various unused dependencies diff --git a/examples/waffle/waffle-ovm.json b/examples/waffle/waffle-ovm.json index ff5dd2cb9893d..859837e1e04fd 100644 --- a/examples/waffle/waffle-ovm.json +++ b/examples/waffle/waffle-ovm.json @@ -1,5 +1,5 @@ { - "compilerVersion": "./node_modules/@eth-optimism/solc", + "compilerVersion": "./../../node_modules/@eth-optimism/solc", "sourceDirectory": "./contracts", "outputDirectory": "./build-ovm" } \ No newline at end of file diff --git a/integration-tests/package.json b/integration-tests/package.json index c5f90c109ce22..216e3b836660f 100644 --- a/integration-tests/package.json +++ b/integration-tests/package.json @@ -21,6 +21,7 @@ "@eth-optimism/hardhat-ovm": "^0.1.1", "@ethersproject/providers": "^5.0.24", "@nomiclabs/hardhat-ethers": "^2.0.2", + "@types/chai-as-promised": "^7.1.3", "chai": "^4.3.3", "chai-as-promised": "^7.1.1", "docker-compose": "^0.23.8", diff --git a/packages/batch-submitter/package.json b/packages/batch-submitter/package.json index daed4f2d9279b..1815e1d2bdf87 100644 --- a/packages/batch-submitter/package.json +++ b/packages/batch-submitter/package.json @@ -48,12 +48,10 @@ "@nomiclabs/hardhat-ethers": "^2.0.2", "@nomiclabs/hardhat-waffle": "^2.0.1", "@types/chai": "^4.1.7", - "@types/chai-as-promised": "^7.1.0", "@types/mocha": "^5.2.6", "@types/node": "^11.11.3", "@types/sinon": "^9.0.10", "chai": "^4.2.0", - "chai-as-promised": "^7.1.1", "ethereum-waffle": "3.0.0", "ganache-core": "^2.13.2", "hardhat": "^2.2.1", @@ -62,7 +60,6 @@ "rimraf": "^2.6.3", "sinon": "^9.2.4", "sinon-chai": "^3.5.0", - "ts-node": "^8.2.0", "typescript": "^4.2.3" }, "resolutions": { diff --git a/packages/common-ts/package.json b/packages/common-ts/package.json index 92c4eece3fdde..9fb80410e082d 100644 --- a/packages/common-ts/package.json +++ b/packages/common-ts/package.json @@ -20,9 +20,6 @@ "@types/pino-multi-stream": "^5.1.1", "prettier": "^2.2.1", "tslint": "^6.1.3", - "tslint-config-prettier": "^1.18.0", - "tslint-no-focused-test": "^0.5.0", - "tslint-plugin-prettier": "^2.3.0", "typescript": "^4.2.3" }, "dependencies": { diff --git a/packages/contracts/package.json b/packages/contracts/package.json index d772a9ffee564..8f2d0db0cd845 100644 --- a/packages/contracts/package.json +++ b/packages/contracts/package.json @@ -46,7 +46,6 @@ }, "dependencies": { "@eth-optimism/core-utils": "^0.4.0", - "@eth-optimism/solc": "^0.6.12-alpha.1", "@ethersproject/abstract-provider": "^5.0.8", "@ethersproject/contracts": "^5.0.5", "@openzeppelin/contracts": "^3.3.0", diff --git a/packages/core-utils/package.json b/packages/core-utils/package.json index e78264cec706e..08b2064594aa0 100644 --- a/packages/core-utils/package.json +++ b/packages/core-utils/package.json @@ -24,9 +24,6 @@ "prettier": "^2.2.1", "ts-mocha": "^8.0.0", "tslint": "^6.1.3", - "tslint-config-prettier": "^1.18.0", - "tslint-no-focused-test": "^0.5.0", - "tslint-plugin-prettier": "^2.3.0", "typescript": "^4.2.3" }, "dependencies": { diff --git a/packages/data-transport-layer/package.json b/packages/data-transport-layer/package.json index 9cc4b30d5c364..c5120a410498a 100644 --- a/packages/data-transport-layer/package.json +++ b/packages/data-transport-layer/package.json @@ -39,15 +39,12 @@ }, "devDependencies": { "@ethersproject/abstract-provider": "^5.1.0", - "@nomiclabs/hardhat-ethers": "^2.0.1", "@types/browser-or-node": "^1.3.0", "@types/cors": "^2.8.9", "@types/levelup": "^4.3.0", "@types/node-fetch": "^2.5.8", - "@types/rimraf": "^3.0.0", "chai": "^4.3.4", "chai-as-promised": "^7.1.1", - "hardhat": "^2.2.1", "mocha": "^8.3.2", "pino-pretty": "^4.7.1", "rimraf": "^3.0.2", diff --git a/packages/hardhat-ovm/package.json b/packages/hardhat-ovm/package.json index d9d9a61de59b7..8500b335ba52c 100644 --- a/packages/hardhat-ovm/package.json +++ b/packages/hardhat-ovm/package.json @@ -17,9 +17,6 @@ "dependencies": { "node-fetch": "^2.6.1" }, - "devDependencies": { - "@types/mocha": "^8.2.2" - }, "peerDependencies": { "ethers": "^5.1.4", "hardhat": "^2.2.1" diff --git a/packages/smock/package.json b/packages/smock/package.json index 1996ee93727ac..f49ec0aa0b63e 100644 --- a/packages/smock/package.json +++ b/packages/smock/package.json @@ -35,7 +35,6 @@ "chai": "^4.3.0", "ethereum-waffle": "^3.3.0", "ethers": "^5.0.31", - "glob": "^7.1.6", "hardhat": "^2.2.1", "lodash": "^4.17.20", "prettier": "^2.2.1" diff --git a/yarn.lock b/yarn.lock index b259654a6f787..483094494d831 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2294,7 +2294,7 @@ resolved "https://registry.yarnpkg.com/@types/browser-or-node/-/browser-or-node-1.3.0.tgz#896ec59bcb8109fc858d8e68d3c056c176a19622" integrity sha512-MVetr65IR7RdJbUxVHsaPFaXAO8fi89zv1g8L/mHygh1Q7xnnK02XZLwfMh57FOpTO6gtnagoPMQ/UOFfctXRQ== -"@types/chai-as-promised@^7.1.0": +"@types/chai-as-promised@^7.1.3": version "7.1.3" resolved "https://registry.yarnpkg.com/@types/chai-as-promised/-/chai-as-promised-7.1.3.tgz#779166b90fda611963a3adbfd00b339d03b747bd" integrity sha512-FQnh1ohPXJELpKhzjuDkPLR2BZCAqed+a6xV4MI/T3XzHfd2FlarfUGUdZYgqYe8oxkYn0fchHEeHfHqdZ96sg== @@ -2351,7 +2351,7 @@ dependencies: "@types/node" "*" -"@types/glob@*", "@types/glob@^7.1.1", "@types/glob@^7.1.3": +"@types/glob@^7.1.1", "@types/glob@^7.1.3": version "7.1.3" resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.3.tgz#e6ba80f36b7daad2c685acd9266382e68985c183" integrity sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w== @@ -2409,11 +2409,6 @@ resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-5.2.7.tgz#315d570ccb56c53452ff8638738df60726d5b6ea" integrity sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ== -"@types/mocha@^8.2.2": - version "8.2.2" - resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-8.2.2.tgz#91daa226eb8c2ff261e6a8cbf8c7304641e095e0" - integrity sha512-Lwh0lzzqT5Pqh6z61P3c3P5nm6fzQK/MMHl9UKeneAeInVflBSz1O2EkX6gM6xfJd7FBXBY5purtLx7fUiZ7Hw== - "@types/node-fetch@^2.5.5", "@types/node-fetch@^2.5.8": version "2.5.9" resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.5.9.tgz#c04a12115aa436f189e39579272b305e477621b4" @@ -2536,14 +2531,6 @@ dependencies: "@types/node" "*" -"@types/rimraf@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/rimraf/-/rimraf-3.0.0.tgz#b9d03f090ece263671898d57bb7bb007023ac19f" - integrity sha512-7WhJ0MdpFgYQPXlF4Dx+DhgvlPCfz/x5mHaeDQAKhcenvQP1KCpLQ18JklAqeGMYSAT2PxLpzd0g2/HE7fj7hQ== - dependencies: - "@types/glob" "*" - "@types/node" "*" - "@types/secp256k1@^4.0.1": version "4.0.1" resolved "https://registry.yarnpkg.com/@types/secp256k1/-/secp256k1-4.0.1.tgz#fb3aa61a1848ad97d7425ff9dcba784549fca5a4" @@ -5460,14 +5447,6 @@ escodegen@1.8.x: optionalDependencies: source-map "~0.2.0" -eslint-plugin-prettier@^2.2.0: - version "2.7.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-2.7.0.tgz#b4312dcf2c1d965379d7f9d5b5f8aaadc6a45904" - integrity sha512-CStQYJgALoQBw3FsBzH0VOVDRnJ/ZimUlpLm226U8qgqYJfPOY/CPK6wyRInMxh73HSKg5wyRwdS4BVYYHwokA== - dependencies: - fast-diff "^1.1.1" - jest-docblock "^21.0.0" - esprima@2.7.x, esprima@^2.7.1: version "2.7.3" resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" @@ -6295,11 +6274,6 @@ fast-deep-equal@^3.1.1: resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== -fast-diff@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" - integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== - fast-glob@^3.0.3, fast-glob@^3.1.1: version "3.2.5" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.5.tgz#7939af2a656de79a4f1901903ee8adcaa7cb9661" @@ -8038,11 +8012,6 @@ isurl@^1.0.0-alpha5: has-to-string-tag-x "^1.2.0" is-object "^1.0.1" -jest-docblock@^21.0.0: - version "21.2.0" - resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-21.2.0.tgz#51529c3b30d5fd159da60c27ceedc195faf8d414" - integrity sha512-5IZ7sY9dBAYSV+YjQ0Ovb540Ku7AO9Z5o2Cg789xj167iQuZ2cG+z0f3Uct6WeYLbU6aQiM2pCs7sZ+4dotydw== - jmespath@^0.15.0: version "0.15.0" resolved "https://registry.yarnpkg.com/jmespath/-/jmespath-0.15.0.tgz#a3f222a9aae9f966f5d27c796510e28091764217" @@ -12862,7 +12831,7 @@ ts-node@7.0.1: source-map-support "^0.5.6" yn "^2.0.0" -ts-node@^8.0.2, ts-node@^8.2.0: +ts-node@^8.0.2: version "8.10.2" resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-8.10.2.tgz#eee03764633b1234ddd37f8db9ec10b75ec7fb8d" integrity sha512-ISJJGgkIpDdBhWVu3jufsWpK3Rzo7bdiIXJjQc0ynKxVOVcg2oIrf2H2cejminGrptVc6q6/uynAHNCuWGbpVA== @@ -12895,30 +12864,11 @@ tsconfig-paths@^3.5.0: minimist "^1.2.0" strip-bom "^3.0.0" -tslib@^1.13.0, tslib@^1.7.1, tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3: +tslib@^1.13.0, tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3: version "1.14.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslint-config-prettier@^1.18.0: - version "1.18.0" - resolved "https://registry.yarnpkg.com/tslint-config-prettier/-/tslint-config-prettier-1.18.0.tgz#75f140bde947d35d8f0d238e0ebf809d64592c37" - integrity sha512-xPw9PgNPLG3iKRxmK7DWr+Ea/SzrvfHtjFt5LBl61gk2UBG/DB9kCXRjv+xyIU1rUtnayLeMUVJBcMX8Z17nDg== - -tslint-no-focused-test@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/tslint-no-focused-test/-/tslint-no-focused-test-0.5.0.tgz#e0a93ef3fa64bd91c7e7437d1f183204880a8ed5" - integrity sha512-YK0PSY5XAdJaTzVIXxnUGyvB5VAi+H9yTc3e40YVtu8Ix3+zLSz4ufvX6rXT3nWpim0DR6fxXoL/Zk8JI641Vg== - -tslint-plugin-prettier@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/tslint-plugin-prettier/-/tslint-plugin-prettier-2.3.0.tgz#73fe71bf9f03842ac48c104122ca9b1de012ecf4" - integrity sha512-F9e4K03yc9xuvv+A0v1EmjcnDwpz8SpCD8HzqSDe0eyg34cBinwn9JjmnnRrNAs4HdleRQj7qijp+P/JTxt4vA== - dependencies: - eslint-plugin-prettier "^2.2.0" - lines-and-columns "^1.1.6" - tslib "^1.7.1" - tslint@^6.1.3: version "6.1.3" resolved "https://registry.yarnpkg.com/tslint/-/tslint-6.1.3.tgz#5c23b2eccc32487d5523bd3a470e9aa31789d904" From 408e063ee440ca26825562df683a6bc0e4d5954d Mon Sep 17 00:00:00 2001 From: smartcontracts Date: Thu, 6 May 2021 16:57:29 -0400 Subject: [PATCH 37/81] chore: Explicitly add tslint and plugins to deps of every package (#794) --- packages/batch-submitter/package.json | 4 +++ packages/common-ts/package.json | 3 ++ packages/contracts/package.json | 4 +++ packages/core-utils/package.json | 3 ++ packages/data-transport-layer/package.json | 4 +++ packages/hardhat-ovm/package.json | 6 ++++ packages/message-relayer/package.json | 8 ++++- packages/smock/package.json | 6 +++- yarn.lock | 39 +++++++++++++++++++++- 9 files changed, 74 insertions(+), 3 deletions(-) diff --git a/packages/batch-submitter/package.json b/packages/batch-submitter/package.json index 1815e1d2bdf87..079ce718de58c 100644 --- a/packages/batch-submitter/package.json +++ b/packages/batch-submitter/package.json @@ -60,6 +60,10 @@ "rimraf": "^2.6.3", "sinon": "^9.2.4", "sinon-chai": "^3.5.0", + "tslint": "^6.1.3", + "tslint-config-prettier": "^1.18.0", + "tslint-no-focused-test": "^0.5.0", + "tslint-plugin-prettier": "^2.3.0", "typescript": "^4.2.3" }, "resolutions": { diff --git a/packages/common-ts/package.json b/packages/common-ts/package.json index 9fb80410e082d..92c4eece3fdde 100644 --- a/packages/common-ts/package.json +++ b/packages/common-ts/package.json @@ -20,6 +20,9 @@ "@types/pino-multi-stream": "^5.1.1", "prettier": "^2.2.1", "tslint": "^6.1.3", + "tslint-config-prettier": "^1.18.0", + "tslint-no-focused-test": "^0.5.0", + "tslint-plugin-prettier": "^2.3.0", "typescript": "^4.2.3" }, "dependencies": { diff --git a/packages/contracts/package.json b/packages/contracts/package.json index 8f2d0db0cd845..1df6c70566b61 100644 --- a/packages/contracts/package.json +++ b/packages/contracts/package.json @@ -84,6 +84,10 @@ "solidity-coverage": "^0.7.16", "ts-generator": "0.0.8", "ts-node": "^9.1.1", + "tslint": "^6.1.3", + "tslint-config-prettier": "^1.18.0", + "tslint-no-focused-test": "^0.5.0", + "tslint-plugin-prettier": "^2.3.0", "typechain": "2.0.0", "yargs": "^16.2.0" }, diff --git a/packages/core-utils/package.json b/packages/core-utils/package.json index 08b2064594aa0..e78264cec706e 100644 --- a/packages/core-utils/package.json +++ b/packages/core-utils/package.json @@ -24,6 +24,9 @@ "prettier": "^2.2.1", "ts-mocha": "^8.0.0", "tslint": "^6.1.3", + "tslint-config-prettier": "^1.18.0", + "tslint-no-focused-test": "^0.5.0", + "tslint-plugin-prettier": "^2.3.0", "typescript": "^4.2.3" }, "dependencies": { diff --git a/packages/data-transport-layer/package.json b/packages/data-transport-layer/package.json index c5120a410498a..f738f6bffde5b 100644 --- a/packages/data-transport-layer/package.json +++ b/packages/data-transport-layer/package.json @@ -49,6 +49,10 @@ "pino-pretty": "^4.7.1", "rimraf": "^3.0.2", "ts-node": "^9.1.1", + "tslint": "^6.1.3", + "tslint-config-prettier": "^1.18.0", + "tslint-no-focused-test": "^0.5.0", + "tslint-plugin-prettier": "^2.3.0", "typescript": "^4.2.3" } } diff --git a/packages/hardhat-ovm/package.json b/packages/hardhat-ovm/package.json index 8500b335ba52c..d41544a5f87e0 100644 --- a/packages/hardhat-ovm/package.json +++ b/packages/hardhat-ovm/package.json @@ -20,5 +20,11 @@ "peerDependencies": { "ethers": "^5.1.4", "hardhat": "^2.2.1" + }, + "devDependencies": { + "tslint": "^6.1.3", + "tslint-config-prettier": "^1.18.0", + "tslint-no-focused-test": "^0.5.0", + "tslint-plugin-prettier": "^2.3.0" } } diff --git a/packages/message-relayer/package.json b/packages/message-relayer/package.json index e3f78bacaa2ca..ae0b17cd106e6 100644 --- a/packages/message-relayer/package.json +++ b/packages/message-relayer/package.json @@ -29,13 +29,19 @@ "url": "https://github.com/ethereum-optimism/optimism.git" }, "dependencies": { - "@eth-optimism/core-utils": "^0.4.0", "@eth-optimism/common-ts": "^0.1.0", "@eth-optimism/contracts": "^0.2.9", + "@eth-optimism/core-utils": "^0.4.0", "dotenv": "^8.2.0", "ethers": "^5.1.0", "google-spreadsheet": "^3.1.15", "merkletreejs": "^0.2.18", "rlp": "^2.2.6" + }, + "devDependencies": { + "tslint": "^6.1.3", + "tslint-config-prettier": "^1.18.0", + "tslint-no-focused-test": "^0.5.0", + "tslint-plugin-prettier": "^2.3.0" } } diff --git a/packages/smock/package.json b/packages/smock/package.json index f49ec0aa0b63e..290b2ad5eec9b 100644 --- a/packages/smock/package.json +++ b/packages/smock/package.json @@ -37,6 +37,10 @@ "ethers": "^5.0.31", "hardhat": "^2.2.1", "lodash": "^4.17.20", - "prettier": "^2.2.1" + "prettier": "^2.2.1", + "tslint": "^6.1.3", + "tslint-config-prettier": "^1.18.0", + "tslint-no-focused-test": "^0.5.0", + "tslint-plugin-prettier": "^2.3.0" } } diff --git a/yarn.lock b/yarn.lock index 483094494d831..ce1f897be3402 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5447,6 +5447,14 @@ escodegen@1.8.x: optionalDependencies: source-map "~0.2.0" +eslint-plugin-prettier@^2.2.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-2.7.0.tgz#b4312dcf2c1d965379d7f9d5b5f8aaadc6a45904" + integrity sha512-CStQYJgALoQBw3FsBzH0VOVDRnJ/ZimUlpLm226U8qgqYJfPOY/CPK6wyRInMxh73HSKg5wyRwdS4BVYYHwokA== + dependencies: + fast-diff "^1.1.1" + jest-docblock "^21.0.0" + esprima@2.7.x, esprima@^2.7.1: version "2.7.3" resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" @@ -6274,6 +6282,11 @@ fast-deep-equal@^3.1.1: resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== +fast-diff@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" + integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== + fast-glob@^3.0.3, fast-glob@^3.1.1: version "3.2.5" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.5.tgz#7939af2a656de79a4f1901903ee8adcaa7cb9661" @@ -8012,6 +8025,11 @@ isurl@^1.0.0-alpha5: has-to-string-tag-x "^1.2.0" is-object "^1.0.1" +jest-docblock@^21.0.0: + version "21.2.0" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-21.2.0.tgz#51529c3b30d5fd159da60c27ceedc195faf8d414" + integrity sha512-5IZ7sY9dBAYSV+YjQ0Ovb540Ku7AO9Z5o2Cg789xj167iQuZ2cG+z0f3Uct6WeYLbU6aQiM2pCs7sZ+4dotydw== + jmespath@^0.15.0: version "0.15.0" resolved "https://registry.yarnpkg.com/jmespath/-/jmespath-0.15.0.tgz#a3f222a9aae9f966f5d27c796510e28091764217" @@ -12864,11 +12882,30 @@ tsconfig-paths@^3.5.0: minimist "^1.2.0" strip-bom "^3.0.0" -tslib@^1.13.0, tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3: +tslib@^1.13.0, tslib@^1.7.1, tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3: version "1.14.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== +tslint-config-prettier@^1.18.0: + version "1.18.0" + resolved "https://registry.yarnpkg.com/tslint-config-prettier/-/tslint-config-prettier-1.18.0.tgz#75f140bde947d35d8f0d238e0ebf809d64592c37" + integrity sha512-xPw9PgNPLG3iKRxmK7DWr+Ea/SzrvfHtjFt5LBl61gk2UBG/DB9kCXRjv+xyIU1rUtnayLeMUVJBcMX8Z17nDg== + +tslint-no-focused-test@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/tslint-no-focused-test/-/tslint-no-focused-test-0.5.0.tgz#e0a93ef3fa64bd91c7e7437d1f183204880a8ed5" + integrity sha512-YK0PSY5XAdJaTzVIXxnUGyvB5VAi+H9yTc3e40YVtu8Ix3+zLSz4ufvX6rXT3nWpim0DR6fxXoL/Zk8JI641Vg== + +tslint-plugin-prettier@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/tslint-plugin-prettier/-/tslint-plugin-prettier-2.3.0.tgz#73fe71bf9f03842ac48c104122ca9b1de012ecf4" + integrity sha512-F9e4K03yc9xuvv+A0v1EmjcnDwpz8SpCD8HzqSDe0eyg34cBinwn9JjmnnRrNAs4HdleRQj7qijp+P/JTxt4vA== + dependencies: + eslint-plugin-prettier "^2.2.0" + lines-and-columns "^1.1.6" + tslib "^1.7.1" + tslint@^6.1.3: version "6.1.3" resolved "https://registry.yarnpkg.com/tslint/-/tslint-6.1.3.tgz#5c23b2eccc32487d5523bd3a470e9aa31789d904" From 5c5ccda10f9c8abbb3a9dfff83215f89dfec457e Mon Sep 17 00:00:00 2001 From: smartcontracts Date: Thu, 6 May 2021 18:32:45 -0400 Subject: [PATCH 38/81] fix: various linting related errors (#796) --- packages/batch-submitter/package.json | 2 +- packages/contracts/package.json | 1 + packages/data-transport-layer/package.json | 2 ++ packages/hardhat-ovm/package.json | 1 + packages/message-relayer/package.json | 1 + specs/package.json | 2 +- yarn.lock | 12 ++++++------ 7 files changed, 13 insertions(+), 8 deletions(-) diff --git a/packages/batch-submitter/package.json b/packages/batch-submitter/package.json index 079ce718de58c..13a8ccb270b03 100644 --- a/packages/batch-submitter/package.json +++ b/packages/batch-submitter/package.json @@ -56,7 +56,7 @@ "ganache-core": "^2.13.2", "hardhat": "^2.2.1", "mocha": "^6.1.4", - "prettier": "^1.16.4", + "prettier": "^2.2.1", "rimraf": "^2.6.3", "sinon": "^9.2.4", "sinon-chai": "^3.5.0", diff --git a/packages/contracts/package.json b/packages/contracts/package.json index 1df6c70566b61..fa2f7bf37299e 100644 --- a/packages/contracts/package.json +++ b/packages/contracts/package.json @@ -79,6 +79,7 @@ "merkletreejs": "^0.2.12", "mkdirp": "^1.0.4", "mocha": "^8.3.0", + "prettier": "^2.2.1", "random-bytes-seed": "^1.0.3", "rlp": "^2.2.6", "solidity-coverage": "^0.7.16", diff --git a/packages/data-transport-layer/package.json b/packages/data-transport-layer/package.json index f738f6bffde5b..9fa093bce898d 100644 --- a/packages/data-transport-layer/package.json +++ b/packages/data-transport-layer/package.json @@ -45,8 +45,10 @@ "@types/node-fetch": "^2.5.8", "chai": "^4.3.4", "chai-as-promised": "^7.1.1", + "hardhat": "^2.2.1", "mocha": "^8.3.2", "pino-pretty": "^4.7.1", + "prettier": "^2.2.1", "rimraf": "^3.0.2", "ts-node": "^9.1.1", "tslint": "^6.1.3", diff --git a/packages/hardhat-ovm/package.json b/packages/hardhat-ovm/package.json index d41544a5f87e0..b120bdaf70d57 100644 --- a/packages/hardhat-ovm/package.json +++ b/packages/hardhat-ovm/package.json @@ -22,6 +22,7 @@ "hardhat": "^2.2.1" }, "devDependencies": { + "prettier": "^2.2.1", "tslint": "^6.1.3", "tslint-config-prettier": "^1.18.0", "tslint-no-focused-test": "^0.5.0", diff --git a/packages/message-relayer/package.json b/packages/message-relayer/package.json index ae0b17cd106e6..9d83f40cd9495 100644 --- a/packages/message-relayer/package.json +++ b/packages/message-relayer/package.json @@ -39,6 +39,7 @@ "rlp": "^2.2.6" }, "devDependencies": { + "prettier": "^2.2.1", "tslint": "^6.1.3", "tslint-config-prettier": "^1.18.0", "tslint-no-focused-test": "^0.5.0", diff --git a/specs/package.json b/specs/package.json index 11435d6ba8d06..42a439621b35d 100644 --- a/specs/package.json +++ b/specs/package.json @@ -4,7 +4,7 @@ "license": "MIT", "private": true, "devDependencies": { - "prettier": "2.2.1" + "prettier": "^2.2.1" }, "scripts": { "lint": "yarn lint:fix && yarn lint:check", diff --git a/yarn.lock b/yarn.lock index ce1f897be3402..2a3d69b9d5d33 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10720,16 +10720,16 @@ prepend-http@^2.0.0: resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc= -prettier@2.2.1, prettier@^2.1.2, prettier@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.2.1.tgz#795a1a78dd52f073da0cd42b21f9c91381923ff5" - integrity sha512-PqyhM2yCjg/oKkFPtTGUojv7gnZAoG80ttl45O6x2Ug/rMJw4wcc9k6aaf2hibP7BGVCCM33gZoGjyvt9mm16Q== - -prettier@^1.14.2, prettier@^1.16.4, prettier@^1.19.1: +prettier@^1.14.2, prettier@^1.19.1: version "1.19.1" resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.19.1.tgz#f7d7f5ff8a9cd872a7be4ca142095956a60797cb" integrity sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew== +prettier@^2.1.2, prettier@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.2.1.tgz#795a1a78dd52f073da0cd42b21f9c91381923ff5" + integrity sha512-PqyhM2yCjg/oKkFPtTGUojv7gnZAoG80ttl45O6x2Ug/rMJw4wcc9k6aaf2hibP7BGVCCM33gZoGjyvt9mm16Q== + printj@~1.1.0: version "1.1.2" resolved "https://registry.yarnpkg.com/printj/-/printj-1.1.2.tgz#d90deb2975a8b9f600fb3a1c94e3f4c53c78a222" From d12e4eef837d951fec0aa8a9787220db5ff57ca4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 6 May 2021 16:39:31 -0700 Subject: [PATCH 39/81] build(deps): bump mixme from 0.5.0 to 0.5.1 (#788) Bumps [mixme](https://github.com/adaltas/node-mixme) from 0.5.0 to 0.5.1. - [Release notes](https://github.com/adaltas/node-mixme/releases) - [Changelog](https://github.com/adaltas/node-mixme/blob/master/CHANGELOG.md) - [Commits](https://github.com/adaltas/node-mixme/compare/v0.5.0...v0.5.1) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 2a3d69b9d5d33..c7edf7ccb7f08 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9329,9 +9329,9 @@ mixin-deep@^1.2.0: is-extendable "^1.0.1" mixme@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/mixme/-/mixme-0.5.0.tgz#7a7ebbb51251724b18054c63c91f5487c0b030ab" - integrity sha512-YyyBIzqe6EEi5xcnN66LXVVvwijMF51liPT9ZqsrHim9s2MgEg4jxI8gsSF6R7pzAotjvBiERC90bbnwAqiDHg== + version "0.5.1" + resolved "https://registry.yarnpkg.com/mixme/-/mixme-0.5.1.tgz#b3da79a563b2da46efba9519830059e4c2a9e40f" + integrity sha512-NaeZIckeBFT7i0XBEpGyFcAE0/bLcQ9MHErTpnU3bLWVE5WZbxG5Y3fDsMxYGifTo5khDA42OquXCC2ngKJB+g== mkdirp-classic@^0.5.2, mkdirp-classic@^0.5.3: version "0.5.3" From e4a86984d082d7f1758687c2e1beaf9e064e6ea1 Mon Sep 17 00:00:00 2001 From: Maurelian Date: Thu, 6 May 2021 19:35:19 -0400 Subject: [PATCH 40/81] docs(contracts): Add codecov badge --- packages/contracts/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/contracts/README.md b/packages/contracts/README.md index 529f3f219f687..9c2280db78132 100644 --- a/packages/contracts/README.md +++ b/packages/contracts/README.md @@ -1,3 +1,5 @@ +[![codecov](https://codecov.io/gh/ethereum-optimism/optimism/branch/master/graph/badge.svg?token=0VTG7PG7YR)](https://codecov.io/gh/ethereum-optimism/optimism) + # Optimistic Ethereum Smart Contracts `@eth-optimism/contracts` contains the various Solidity smart contracts used within the Optimistic Ethereum system. From 536e02b54b34608045f9d476d3956062671f687b Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 7 May 2021 11:54:18 +0300 Subject: [PATCH 41/81] Version Packages (#789) Co-authored-by: github-actions[bot] --- .changeset/clever-fishes-sneeze.md | 11 ----------- .changeset/fluffy-mangos-rest.md | 6 ------ .changeset/four-gifts-cry.md | 6 ------ .changeset/thirty-planets-obey.md | 5 ----- packages/batch-submitter/CHANGELOG.md | 13 +++++++++++++ packages/batch-submitter/package.json | 10 +++++----- packages/common-ts/CHANGELOG.md | 8 ++++++++ packages/common-ts/package.json | 2 +- packages/contracts/CHANGELOG.md | 10 ++++++++++ packages/contracts/package.json | 8 ++++---- packages/core-utils/CHANGELOG.md | 7 +++++++ packages/core-utils/package.json | 2 +- packages/data-transport-layer/CHANGELOG.md | 15 +++++++++++++++ packages/data-transport-layer/package.json | 8 ++++---- packages/hardhat-ovm/CHANGELOG.md | 6 ++++++ packages/hardhat-ovm/package.json | 2 +- packages/smock/CHANGELOG.md | 9 +++++++++ packages/smock/package.json | 4 ++-- 18 files changed, 86 insertions(+), 46 deletions(-) delete mode 100644 .changeset/clever-fishes-sneeze.md delete mode 100644 .changeset/fluffy-mangos-rest.md delete mode 100644 .changeset/four-gifts-cry.md delete mode 100644 .changeset/thirty-planets-obey.md diff --git a/.changeset/clever-fishes-sneeze.md b/.changeset/clever-fishes-sneeze.md deleted file mode 100644 index ef2e0199c3dd3..0000000000000 --- a/.changeset/clever-fishes-sneeze.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -'@eth-optimism/batch-submitter': patch -'@eth-optimism/common-ts': patch -'@eth-optimism/contracts': patch -'@eth-optimism/core-utils': patch -'@eth-optimism/data-transport-layer': patch -'@eth-optimism/hardhat-ovm': patch -'@eth-optimism/smock': patch ---- - -Removed various unused dependencies diff --git a/.changeset/fluffy-mangos-rest.md b/.changeset/fluffy-mangos-rest.md deleted file mode 100644 index 1892226488894..0000000000000 --- a/.changeset/fluffy-mangos-rest.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@eth-optimism/core-utils': patch -'@eth-optimism/data-transport-layer': patch ---- - -Add an additional enum for EthSign transactions as they now are batch submitted with 2 different enum values diff --git a/.changeset/four-gifts-cry.md b/.changeset/four-gifts-cry.md deleted file mode 100644 index d32ace353a81e..0000000000000 --- a/.changeset/four-gifts-cry.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@eth-optimism/common-ts': patch -'@eth-optimism/data-transport-layer': patch ---- - -add environment and network to dtl, move metric init to app from base-service diff --git a/.changeset/thirty-planets-obey.md b/.changeset/thirty-planets-obey.md deleted file mode 100644 index 6f61807d01145..0000000000000 --- a/.changeset/thirty-planets-obey.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@eth-optimism/contracts': patch ---- - -Heavily reduces npm package size by excluding unnecessary files. diff --git a/packages/batch-submitter/CHANGELOG.md b/packages/batch-submitter/CHANGELOG.md index c961b97c39d57..c29aece5dcf75 100644 --- a/packages/batch-submitter/CHANGELOG.md +++ b/packages/batch-submitter/CHANGELOG.md @@ -1,5 +1,18 @@ # Changelog +## 0.2.5 + +### Patch Changes + +- 1d40586: Removed various unused dependencies +- Updated dependencies [1d40586] +- Updated dependencies [ce7fa52] +- Updated dependencies [575bcf6] +- Updated dependencies [6dc1877] + - @eth-optimism/common-ts@0.1.1 + - @eth-optimism/contracts@0.2.10 + - @eth-optimism/core-utils@0.4.1 + ## 0.2.4 ### Patch Changes diff --git a/packages/batch-submitter/package.json b/packages/batch-submitter/package.json index 13a8ccb270b03..010ba7373204c 100644 --- a/packages/batch-submitter/package.json +++ b/packages/batch-submitter/package.json @@ -1,6 +1,6 @@ { "name": "@eth-optimism/batch-submitter", - "version": "0.2.4", + "version": "0.2.5", "private": true, "description": "[Optimism] Batch submission for sequencer & aggregators", "main": "dist/index", @@ -31,9 +31,9 @@ "url": "https://github.com/ethereum-optimism/optimism-monorepo.git" }, "dependencies": { - "@eth-optimism/common-ts": "^0.1.0", - "@eth-optimism/contracts": "^0.2.9", - "@eth-optimism/core-utils": "^0.4.0", + "@eth-optimism/common-ts": "^0.1.1", + "@eth-optimism/contracts": "^0.2.10", + "@eth-optimism/core-utils": "^0.4.1", "@eth-optimism/ynatm": "^0.2.2", "@ethersproject/abstract-provider": "^5.0.5", "@ethersproject/providers": "^5.0.14", @@ -44,7 +44,7 @@ "prom-client": "^13.1.0" }, "devDependencies": { - "@eth-optimism/smock": "^1.1.2", + "@eth-optimism/smock": "^1.1.3", "@nomiclabs/hardhat-ethers": "^2.0.2", "@nomiclabs/hardhat-waffle": "^2.0.1", "@types/chai": "^4.1.7", diff --git a/packages/common-ts/CHANGELOG.md b/packages/common-ts/CHANGELOG.md index dbbcb19f72650..57ea3a780565a 100644 --- a/packages/common-ts/CHANGELOG.md +++ b/packages/common-ts/CHANGELOG.md @@ -1,6 +1,14 @@ # @eth-optimism/common-ts +## 0.1.1 + +### Patch Changes + +- 1d40586: Removed various unused dependencies +- 575bcf6: add environment and network to dtl, move metric init to app from base-service + ## 0.1.0 + ### Minor Changes - 28dc442: move metrics, logger, and base-service to new common-ts package diff --git a/packages/common-ts/package.json b/packages/common-ts/package.json index 92c4eece3fdde..fe3fc13d034a4 100644 --- a/packages/common-ts/package.json +++ b/packages/common-ts/package.json @@ -1,6 +1,6 @@ { "name": "@eth-optimism/common-ts", - "version": "0.1.0", + "version": "0.1.1", "main": "dist/index", "files": [ "dist/*" diff --git a/packages/contracts/CHANGELOG.md b/packages/contracts/CHANGELOG.md index 2060d28650775..a3deba7905207 100644 --- a/packages/contracts/CHANGELOG.md +++ b/packages/contracts/CHANGELOG.md @@ -1,5 +1,15 @@ # Changelog +## 0.2.10 + +### Patch Changes + +- 1d40586: Removed various unused dependencies +- 6dc1877: Heavily reduces npm package size by excluding unnecessary files. +- Updated dependencies [1d40586] +- Updated dependencies [ce7fa52] + - @eth-optimism/core-utils@0.4.1 + ## 0.2.9 ### Patch Changes diff --git a/packages/contracts/package.json b/packages/contracts/package.json index fa2f7bf37299e..d4db212d798a1 100644 --- a/packages/contracts/package.json +++ b/packages/contracts/package.json @@ -1,6 +1,6 @@ { "name": "@eth-optimism/contracts", - "version": "0.2.9", + "version": "0.2.10", "main": "dist/index", "files": [ "dist/**/*.js", @@ -45,7 +45,7 @@ "generate-markdown": "node scripts/generate-markdown.js" }, "dependencies": { - "@eth-optimism/core-utils": "^0.4.0", + "@eth-optimism/core-utils": "^0.4.1", "@ethersproject/abstract-provider": "^5.0.8", "@ethersproject/contracts": "^5.0.5", "@openzeppelin/contracts": "^3.3.0", @@ -57,8 +57,8 @@ }, "devDependencies": { "@codechecks/client": "0.1.10-beta", - "@eth-optimism/hardhat-ovm": "^0.1.1", - "@eth-optimism/smock": "^1.1.2", + "@eth-optimism/hardhat-ovm": "^0.1.2", + "@eth-optimism/smock": "^1.1.3", "@nomiclabs/hardhat-ethers": "^2.0.1", "@nomiclabs/hardhat-waffle": "^2.0.1", "@typechain/ethers-v5": "1.0.0", diff --git a/packages/core-utils/CHANGELOG.md b/packages/core-utils/CHANGELOG.md index 9df2d94b9e86a..d717b0630bf05 100644 --- a/packages/core-utils/CHANGELOG.md +++ b/packages/core-utils/CHANGELOG.md @@ -1,5 +1,12 @@ # @eth-optimism/core-utils +## 0.4.1 + +### Patch Changes + +- 1d40586: Removed various unused dependencies +- ce7fa52: Add an additional enum for EthSign transactions as they now are batch submitted with 2 different enum values + ## 0.4.0 ### Minor Changes diff --git a/packages/core-utils/package.json b/packages/core-utils/package.json index e78264cec706e..7a20745c65bf0 100644 --- a/packages/core-utils/package.json +++ b/packages/core-utils/package.json @@ -1,6 +1,6 @@ { "name": "@eth-optimism/core-utils", - "version": "0.4.0", + "version": "0.4.1", "main": "dist/index", "files": [ "dist/*" diff --git a/packages/data-transport-layer/CHANGELOG.md b/packages/data-transport-layer/CHANGELOG.md index f5e17e73676b7..b57d817d21dcf 100644 --- a/packages/data-transport-layer/CHANGELOG.md +++ b/packages/data-transport-layer/CHANGELOG.md @@ -1,5 +1,20 @@ # data transport layer +## 0.2.5 + +### Patch Changes + +- 1d40586: Removed various unused dependencies +- ce7fa52: Add an additional enum for EthSign transactions as they now are batch submitted with 2 different enum values +- 575bcf6: add environment and network to dtl, move metric init to app from base-service +- Updated dependencies [1d40586] +- Updated dependencies [ce7fa52] +- Updated dependencies [575bcf6] +- Updated dependencies [6dc1877] + - @eth-optimism/common-ts@0.1.1 + - @eth-optimism/contracts@0.2.10 + - @eth-optimism/core-utils@0.4.1 + ## 0.2.4 ### Patch Changes diff --git a/packages/data-transport-layer/package.json b/packages/data-transport-layer/package.json index 9fa093bce898d..ba51285d36bc5 100644 --- a/packages/data-transport-layer/package.json +++ b/packages/data-transport-layer/package.json @@ -1,6 +1,6 @@ { "name": "@eth-optimism/data-transport-layer", - "version": "0.2.4", + "version": "0.2.5", "private": true, "main": "dist/index", "files": [ @@ -19,9 +19,9 @@ "build": "tsc -p tsconfig.build.json" }, "dependencies": { - "@eth-optimism/common-ts": "^0.1.0", - "@eth-optimism/contracts": "^0.2.9", - "@eth-optimism/core-utils": "^0.4.0", + "@eth-optimism/common-ts": "^0.1.1", + "@eth-optimism/contracts": "^0.2.10", + "@eth-optimism/core-utils": "^0.4.1", "@ethersproject/providers": "^5.0.21", "@sentry/node": "^6.3.1", "@sentry/tracing": "^6.3.1", diff --git a/packages/hardhat-ovm/CHANGELOG.md b/packages/hardhat-ovm/CHANGELOG.md index 399fc9703d648..f85b74d4102e1 100644 --- a/packages/hardhat-ovm/CHANGELOG.md +++ b/packages/hardhat-ovm/CHANGELOG.md @@ -1,5 +1,11 @@ # @eth-optimism/hardhat-ovm +## 0.1.2 + +### Patch Changes + +- 1d40586: Removed various unused dependencies + ## 0.1.1 ### Patch Changes diff --git a/packages/hardhat-ovm/package.json b/packages/hardhat-ovm/package.json index b120bdaf70d57..7267228cb7f26 100644 --- a/packages/hardhat-ovm/package.json +++ b/packages/hardhat-ovm/package.json @@ -1,6 +1,6 @@ { "name": "@eth-optimism/hardhat-ovm", - "version": "0.1.1", + "version": "0.1.2", "main": "dist/index", "types": "dist/index", "files": [ diff --git a/packages/smock/CHANGELOG.md b/packages/smock/CHANGELOG.md index 6ca679caaa3fe..28a23a9a42a33 100644 --- a/packages/smock/CHANGELOG.md +++ b/packages/smock/CHANGELOG.md @@ -1,5 +1,14 @@ # @eth-optimism/smock +## 1.1.3 + +### Patch Changes + +- 1d40586: Removed various unused dependencies +- Updated dependencies [1d40586] +- Updated dependencies [ce7fa52] + - @eth-optimism/core-utils@0.4.1 + ## 1.1.2 ### Patch Changes diff --git a/packages/smock/package.json b/packages/smock/package.json index 290b2ad5eec9b..cabda87592c9a 100644 --- a/packages/smock/package.json +++ b/packages/smock/package.json @@ -3,7 +3,7 @@ "files": [ "dist/src/*" ], - "version": "1.1.2", + "version": "1.1.3", "main": "dist/src/index", "types": "dist/src/index", "license": "MIT", @@ -22,7 +22,7 @@ "hardhat": "^2.2.1" }, "dependencies": { - "@eth-optimism/core-utils": "^0.4.0", + "@eth-optimism/core-utils": "^0.4.1", "@ethersproject/abi": "^5.0.13", "@ethersproject/abstract-provider": "^5.0.10", "bn.js": "^5.2.0" From 67e153e1f86a275626cc9f0661ce6f8bc9185d6e Mon Sep 17 00:00:00 2001 From: Elena Gesheva Date: Fri, 7 May 2021 21:58:56 +0300 Subject: [PATCH 42/81] Make ts-packages action always run on PRs and master (#804) --- .github/workflows/ts-packages.yml | 9 --------- 1 file changed, 9 deletions(-) diff --git a/.github/workflows/ts-packages.yml b/.github/workflows/ts-packages.yml index 05138e82a6916..2239ea6bd3e38 100644 --- a/.github/workflows/ts-packages.yml +++ b/.github/workflows/ts-packages.yml @@ -5,16 +5,7 @@ on: branches: - master - '*rc' - paths: - - 'packages/**/*.sol' - - 'packages/**/*.ts' pull_request: - branches: - - master - - '*rc' - paths: - - 'packages/**/*.sol' - - 'packages/**/*.ts' workflow_dispatch: jobs: From 5f3b2cfd61d3ccff5886c828314193b14b75cbd8 Mon Sep 17 00:00:00 2001 From: smartcontracts Date: Fri, 7 May 2021 15:55:27 -0400 Subject: [PATCH 43/81] tests[contracts]: Improve Lib_MerkleTrie test coverage (#783) * wip: Improve Lib_MerkleTrie test coverage * Add a few more JSON tests * fix[contracts]: Separate function for extension node value changes * test: Add some additional JSON tests * Update packages/contracts/test/contracts/libraries/trie/Lib_MerkleTrie.spec.ts Co-authored-by: Maurelian * fix: trailing newlines Co-authored-by: Maurelian --- .../libraries/trie/Lib_MerkleTrie.sol | 72 ++++++++-- .../libraries/utils/Lib_BytesUtils.sol | 2 +- .../libraries/trie/Lib_MerkleTrie.spec.ts | 131 +++++++++++++++++- .../json/libraries/trie/trieanyorder.json | 59 ++++++++ .../data/json/libraries/trie/trietest.json | 26 ++++ 5 files changed, 274 insertions(+), 16 deletions(-) create mode 100644 packages/contracts/test/data/json/libraries/trie/trieanyorder.json create mode 100644 packages/contracts/test/data/json/libraries/trie/trietest.json diff --git a/packages/contracts/contracts/optimistic-ethereum/libraries/trie/Lib_MerkleTrie.sol b/packages/contracts/contracts/optimistic-ethereum/libraries/trie/Lib_MerkleTrie.sol index 2997f704b7c54..bf7b9f17399cc 100644 --- a/packages/contracts/contracts/optimistic-ethereum/libraries/trie/Lib_MerkleTrie.sol +++ b/packages/contracts/contracts/optimistic-ethereum/libraries/trie/Lib_MerkleTrie.sol @@ -122,7 +122,7 @@ library Lib_MerkleTrie { TrieNode[] memory proof = _parseProof(_proof); (uint256 pathLength, bytes memory keyRemainder, ) = _walkNodePath(proof, _key, _root); - TrieNode[] memory newPath = _getNewPath(proof, pathLength, keyRemainder, _value); + TrieNode[] memory newPath = _getNewPath(proof, pathLength, _key, keyRemainder, _value); return _getUpdatedTrieRoot(newPath, _key); } @@ -312,20 +312,20 @@ library Lib_MerkleTrie { } /** - * @notice Creates new nodes to support a k/v pair insertion into a given - * Merkle trie path. + * @notice Creates new nodes to support a k/v pair insertion into a given Merkle trie path. * @param _path Path to the node nearest the k/v pair. - * @param _pathLength Length of the path. Necessary because the provided - * path may include additional nodes (e.g., it comes directly from a proof) - * and we can't resize in-memory arrays without costly duplication. - * @param _keyRemainder Portion of the initial key that must be inserted - * into the trie. + * @param _pathLength Length of the path. Necessary because the provided path may include + * additional nodes (e.g., it comes directly from a proof) and we can't resize in-memory + * arrays without costly duplication. + * @param _key Full original key. + * @param _keyRemainder Portion of the initial key that must be inserted into the trie. * @param _value Value to insert at the given key. * @return _newPath A new path with the inserted k/v pair and extra supporting nodes. */ function _getNewPath( TrieNode[] memory _path, uint256 _pathLength, + bytes memory _key, bytes memory _keyRemainder, bytes memory _value ) @@ -348,7 +348,32 @@ library Lib_MerkleTrie { TrieNode[] memory newNodes = new TrieNode[](3); uint256 totalNewNodes = 0; - if (keyRemainder.length == 0 && lastNodeType == NodeType.LeafNode) { + // Reference: https://github.com/ethereumjs/merkle-patricia-tree/blob/c0a10395aab37d42c175a47114ebfcbd7efcf059/src/baseTrie.ts#L294-L313 + bool matchLeaf = false; + if (lastNodeType == NodeType.LeafNode) { + uint256 l = 0; + if (_path.length > 0) { + for (uint256 i = 0; i < _path.length - 1; i++) { + if (_getNodeType(_path[i]) == NodeType.BranchNode) { + l++; + } else { + l += _getNodeKey(_path[i]).length; + } + } + } + + if ( + _getSharedNibbleLength( + _getNodeKey(lastNode), + Lib_BytesUtils.slice(Lib_BytesUtils.toNibbles(_key), l) + ) == _getNodeKey(lastNode).length + && keyRemainder.length == 0 + ) { + matchLeaf = true; + } + } + + if (matchLeaf) { // We've found a leaf node with the given key. // Simply need to update the value of the node to match. newNodes[totalNewNodes] = _makeLeafNode(_getNodeKey(lastNode), _value); @@ -488,7 +513,7 @@ library Lib_MerkleTrie { // and we can skip this part. if (previousNodeHash.length > 0) { // Re-encode the node based on the previous node. - currentNode = _makeExtensionNode(nodeKey, previousNodeHash); + currentNode = _editExtensionNodeValue(currentNode, previousNodeHash); } } else if (currentNodeType == NodeType.BranchNode) { // If this node is the last element in the path, it'll be correctly encoded @@ -761,6 +786,33 @@ library Lib_MerkleTrie { return _makeNode(raw); } + /** + * Creates a new extension node with the same key but a different value. + * @param _node Extension node to copy and modify. + * @param _value New value for the extension node. + * @return New node with the same key and different value. + */ + function _editExtensionNodeValue( + TrieNode memory _node, + bytes memory _value + ) + private + pure + returns ( + TrieNode memory + ) + { + bytes[] memory raw = new bytes[](2); + bytes memory key = _addHexPrefix(_getNodeKey(_node), false); + raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key)); + if (_value.length < 32) { + raw[1] = _value; + } else { + raw[1] = Lib_RLPWriter.writeBytes(_value); + } + return _makeNode(raw); + } + /** * @notice Creates a new leaf node. * @dev This function is essentially identical to `_makeExtensionNode`. diff --git a/packages/contracts/contracts/optimistic-ethereum/libraries/utils/Lib_BytesUtils.sol b/packages/contracts/contracts/optimistic-ethereum/libraries/utils/Lib_BytesUtils.sol index e6a4880c2da1e..eceadda79c13e 100644 --- a/packages/contracts/contracts/optimistic-ethereum/libraries/utils/Lib_BytesUtils.sol +++ b/packages/contracts/contracts/optimistic-ethereum/libraries/utils/Lib_BytesUtils.sol @@ -93,7 +93,7 @@ library Lib_BytesUtils { bytes memory ) { - if (_bytes.length - _start == 0) { + if (_start >= _bytes.length) { return bytes(''); } diff --git a/packages/contracts/test/contracts/libraries/trie/Lib_MerkleTrie.spec.ts b/packages/contracts/test/contracts/libraries/trie/Lib_MerkleTrie.spec.ts index 2016d39baccf8..063b58327064b 100644 --- a/packages/contracts/test/contracts/libraries/trie/Lib_MerkleTrie.spec.ts +++ b/packages/contracts/test/contracts/libraries/trie/Lib_MerkleTrie.spec.ts @@ -4,12 +4,15 @@ import { expect } from '../../../setup' import * as rlp from 'rlp' import { ethers } from 'hardhat' import { Contract } from 'ethers' -import { toHexString } from '@eth-optimism/core-utils' +import { fromHexString, toHexString } from '@eth-optimism/core-utils' +import { Trie } from 'merkle-patricia-tree/dist/baseTrie' /* Internal Imports */ import { TrieTestGenerator } from '../../../helpers' +import * as officialTestJson from '../../../data/json/libraries/trie/trietest.json' +import * as officialTestAnyOrderJson from '../../../data/json/libraries/trie/trieanyorder.json' -const NODE_COUNTS = [1, 2, 128] +const NODE_COUNTS = [1, 2, 32, 128] describe('Lib_MerkleTrie', () => { let Lib_MerkleTrie: Contract @@ -19,15 +22,112 @@ describe('Lib_MerkleTrie', () => { ).deploy() }) + // Eth-foundation tests: https://github.com/ethereum/tests/tree/develop/TrieTests + describe('official tests', () => { + for (const testName of Object.keys(officialTestJson.tests)) { + it(`should perform official test: ${testName}`, async () => { + const trie = new Trie() + const inputs = officialTestJson.tests[testName].in + const expected = officialTestJson.tests[testName].root + + for (const input of inputs) { + let key: Buffer + if (input[0].startsWith('0x')) { + key = fromHexString(input[0]) + } else { + key = fromHexString( + ethers.utils.hexlify(ethers.utils.toUtf8Bytes(input[0])) + ) + } + + let val: Buffer + if (input[1] === null) { + throw new Error('deletions not supported, check your tests') + } else if (input[1].startsWith('0x')) { + val = fromHexString(input[1]) + } else { + val = fromHexString( + ethers.utils.hexlify(ethers.utils.toUtf8Bytes(input[1])) + ) + } + + const proof = await Trie.createProof(trie, key) + const root = trie.root + await trie.put(key, val) + + const out = await Lib_MerkleTrie.update( + toHexString(key), + toHexString(val), + toHexString(rlp.encode(proof)), + root + ) + + expect(out).to.equal(toHexString(trie.root)) + } + + expect(toHexString(trie.root)).to.equal(expected) + }) + } + }) + + describe('official tests - trie any order', () => { + for (const testName of Object.keys(officialTestAnyOrderJson.tests)) { + it(`should perform official test: ${testName}`, async () => { + const trie = new Trie() + const inputs = officialTestAnyOrderJson.tests[testName].in + const expected = officialTestAnyOrderJson.tests[testName].root + + for (const input of Object.keys(inputs)) { + let key: Buffer + if (input.startsWith('0x')) { + key = fromHexString(input) + } else { + key = fromHexString( + ethers.utils.hexlify(ethers.utils.toUtf8Bytes(input)) + ) + } + + let val: Buffer + if (inputs[input] === null) { + throw new Error('deletions not supported, check your tests') + } else if (inputs[input].startsWith('0x')) { + val = fromHexString(inputs[input]) + } else { + val = fromHexString( + ethers.utils.hexlify(ethers.utils.toUtf8Bytes(inputs[input])) + ) + } + + const proof = await Trie.createProof(trie, key) + const root = trie.root + await trie.put(key, val) + + const out = await Lib_MerkleTrie.update( + toHexString(key), + toHexString(val), + toHexString(rlp.encode(proof)), + root + ) + + expect(out).to.equal(toHexString(trie.root)) + } + + expect(toHexString(trie.root)).to.equal(expected) + }) + } + }) + describe('verifyInclusionProof', () => { for (const nodeCount of NODE_COUNTS) { - describe(`inside a trie with ${nodeCount} nodes`, () => { + describe(`inside a trie with ${nodeCount} nodes and keys/vals of size ${nodeCount} bytes`, () => { let generator: TrieTestGenerator before(async () => { generator = await TrieTestGenerator.fromRandom({ seed: `seed.incluson.${nodeCount}`, nodeCount, secure: false, + keySize: nodeCount, + valSize: nodeCount, }) }) @@ -55,13 +155,15 @@ describe('Lib_MerkleTrie', () => { describe('update', () => { for (const nodeCount of NODE_COUNTS) { - describe(`inside a trie with ${nodeCount} nodes`, () => { + describe(`inside a trie with ${nodeCount} nodes and keys/vals of size ${nodeCount} bytes`, () => { let generator: TrieTestGenerator before(async () => { generator = await TrieTestGenerator.fromRandom({ seed: `seed.update.${nodeCount}`, nodeCount, secure: false, + keySize: nodeCount, + valSize: nodeCount, }) }) @@ -88,17 +190,36 @@ describe('Lib_MerkleTrie', () => { } }) } + + it('should return the single-node root hash if the trie was previously empty', async () => { + const key = '0x1234' + const val = '0x5678' + + const trie = new Trie() + await trie.put(fromHexString(key), fromHexString(val)) + + expect( + await Lib_MerkleTrie.update( + key, + val, + '0x', // Doesn't require a proof + ethers.utils.keccak256('0x80') // Empty Merkle trie root hash + ) + ).to.equal(toHexString(trie.root)) + }) }) describe('get', () => { for (const nodeCount of NODE_COUNTS) { - describe(`inside a trie with ${nodeCount} nodes`, () => { + describe(`inside a trie with ${nodeCount} nodes and keys/vals of size ${nodeCount} bytes`, () => { let generator: TrieTestGenerator before(async () => { generator = await TrieTestGenerator.fromRandom({ seed: `seed.get.${nodeCount}`, nodeCount, secure: false, + keySize: nodeCount, + valSize: nodeCount, }) }) diff --git a/packages/contracts/test/data/json/libraries/trie/trieanyorder.json b/packages/contracts/test/data/json/libraries/trie/trieanyorder.json new file mode 100644 index 0000000000000..44c5208e4d435 --- /dev/null +++ b/packages/contracts/test/data/json/libraries/trie/trieanyorder.json @@ -0,0 +1,59 @@ +{ + "source": "https://github.com/ethereum/tests/blob/develop/TrieTests/trieanyorder.json", + "commit": "7d66cbfff1e6561d1046e45df8b7918d186b136f", + "date": "2019-01-10", + "tests": { + "singleItem": { + "in": { + "A": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + }, + "root": "0xd23786fb4a010da3ce639d66d5e904a11dbc02746d1ce25029e53290cabf28ab" + }, + "dogs": { + "in": { + "doe": "reindeer", + "dog": "puppy", + "dogglesworth": "cat" + }, + "root": "0x8aad789dff2f538bca5d8ea56e8abe10f4c7ba3a5dea95fea4cd6e7c3a1168d3" + }, + "puppy": { + "in": { + "do": "verb", + "horse": "stallion", + "doge": "coin", + "dog": "puppy" + }, + "root": "0x5991bb8c6514148a29db676a14ac506cd2cd5775ace63c30a4fe457715e9ac84" + }, + "foo": { + "in": { + "foo": "bar", + "food": "bass" + }, + "root": "0x17beaa1648bafa633cda809c90c04af50fc8aed3cb40d16efbddee6fdf63c4c3" + }, + "smallValues": { + "in": { + "be": "e", + "dog": "puppy", + "bed": "d" + }, + "root": "0x3f67c7a47520f79faa29255d2d3c084a7a6df0453116ed7232ff10277a8be68b" + }, + "testy": { + "in": { + "test": "test", + "te": "testy" + }, + "root": "0x8452568af70d8d140f58d941338542f645fcca50094b20f3c3d8c3df49337928" + }, + "hex": { + "in": { + "0x0045": "0x0123456789", + "0x4500": "0x9876543210" + }, + "root": "0x285505fcabe84badc8aa310e2aae17eddc7d120aabec8a476902c8184b3a3503" + } + } +} diff --git a/packages/contracts/test/data/json/libraries/trie/trietest.json b/packages/contracts/test/data/json/libraries/trie/trietest.json new file mode 100644 index 0000000000000..8923215f39b82 --- /dev/null +++ b/packages/contracts/test/data/json/libraries/trie/trietest.json @@ -0,0 +1,26 @@ +{ + "source": "https://github.com/ethereum/tests/blob/develop/TrieTests/trietest.json", + "commit": "7d66cbfff1e6561d1046e45df8b7918d186b136f", + "date": "2019-01-10", + "tests": { + "insert-middle-leaf": { + "in": [ + [ "key1aa", "0123456789012345678901234567890123456789xxx"], + [ "key1", "0123456789012345678901234567890123456789Very_Long"], + [ "key2bb", "aval3"], + [ "key2", "short"], + [ "key3cc", "aval3"], + [ "key3","1234567890123456789012345678901"] + ], + "root": "0xcb65032e2f76c48b82b5c24b3db8f670ce73982869d38cd39a624f23d62a9e89" + }, + "branch-value-update": { + "in": [ + [ "abc", "123" ], + [ "abcd", "abcd" ], + [ "abc", "abc" ] + ], + "root": "0x7a320748f780ad9ad5b0837302075ce0eeba6c26e3d8562c67ccc0f1b273298a" + } + } +} From 467e27575b6b8834098278d7781aea023fbfad88 Mon Sep 17 00:00:00 2001 From: Liam Horne Date: Fri, 7 May 2021 14:16:13 -0700 Subject: [PATCH 44/81] Remove unnecessary tsconfig arguments (#798) * style: fix indenting * build: remove skipLibCheck, paths, and baseUrl from base typescript config --- tsconfig.build.json | 4 ++-- tsconfig.json | 9 +-------- 2 files changed, 3 insertions(+), 10 deletions(-) diff --git a/tsconfig.build.json b/tsconfig.build.json index cd2cbbde8030a..7dc9ad4773947 100644 --- a/tsconfig.build.json +++ b/tsconfig.build.json @@ -12,8 +12,8 @@ "emitDecoratorMetadata": true, "experimentalDecorators": true, "typeRoots": [ - "node_modules/@types" - ] + "node_modules/@types" + ] }, "exclude": [ "node_modules", diff --git a/tsconfig.json b/tsconfig.json index e66a11201db54..d8faaf5080f9b 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,10 +1,3 @@ { - "extends": "./tsconfig.build.json", - "compilerOptions": { - "baseUrl": ".", - "paths": { - "@eth-optimism/*": ["packages/*/src", "integration-tests/*/test"] - }, - "skipLibCheck": true - } + "extends": "./tsconfig.build.json" } From f3f04697471d5121f8fd005c397b0baa448eb9a2 Mon Sep 17 00:00:00 2001 From: Ben Wilson <82120899+optimisticben@users.noreply.github.com> Date: Fri, 7 May 2021 17:16:58 -0400 Subject: [PATCH 45/81] Docker-compose metric collection (#763) * Docker-compose metric collection * Added prometheus and dashboard-sync services Co-authored-by: Georgios Konstantopoulos --- ops/Makefile | 40 +++++++++++ ops/README.md | 67 +++++++++++++++++++ ops/docker-compose-metrics.yml | 48 +++++++++++++ ops/docker-compose.yml | 2 +- .../provisioning/dashboards/config.yml | 9 +++ .../provisioning/datasources/influxdb.yml | 10 +++ .../provisioning/datasources/prometheus.yml | 9 +++ ops/docker/prometheus/prometheus.yml | 24 +++++++ ops/docker/scripts/dashboard-sync.py | 30 +++++++++ ops/envs/metrics.env | 3 + ops/scripts/geth.sh | 2 +- 11 files changed, 242 insertions(+), 2 deletions(-) create mode 100644 ops/Makefile create mode 100644 ops/README.md create mode 100644 ops/docker-compose-metrics.yml create mode 100644 ops/docker/grafana/provisioning/dashboards/config.yml create mode 100644 ops/docker/grafana/provisioning/datasources/influxdb.yml create mode 100644 ops/docker/grafana/provisioning/datasources/prometheus.yml create mode 100644 ops/docker/prometheus/prometheus.yml create mode 100644 ops/docker/scripts/dashboard-sync.py create mode 100644 ops/envs/metrics.env diff --git a/ops/Makefile b/ops/Makefile new file mode 100644 index 0000000000000..75b31c9f0c693 --- /dev/null +++ b/ops/Makefile @@ -0,0 +1,40 @@ +up: down + DOCKER_BUILDKIT=1 \ + docker-compose \ + -f docker-compose.yml \ + up --build --detach +.PHONY: up + +down: + docker-compose \ + -f docker-compose.yml \ + down +.PHONY: down + +ps: + docker-compose \ + -f docker-compose.yml \ + ps +.PHONY: ps + +up-metrics: down-metrics + DOCKER_BUILDKIT=1 \ + docker-compose \ + -f docker-compose.yml \ + -f docker-compose-metrics.yml \ + up --build --detach +.PHONY: up-metrics + +down-metrics: + docker-compose \ + -f docker-compose.yml \ + -f docker-compose-metrics.yml \ + down +.PHONY: down-metrics + +ps-metrics: + docker-compose \ + -f docker-compose.yml \ + -f docker-compose-metrics.yml \ + ps +.PHONY: ps \ No newline at end of file diff --git a/ops/README.md b/ops/README.md new file mode 100644 index 0000000000000..df841dfc61ea3 --- /dev/null +++ b/ops/README.md @@ -0,0 +1,67 @@ +# docker-compose + +The docker-compose project runs a local optimism stack. + +## prerequisites + +- docker +- docker-compose +- make + +## Starting and stopping the project + +The base `docker-compose.yml` file will start the required components for a full stack. + +Supplementing the base configuration is an additional metric enabling file, `docker-compose-metrics.yml`. Adding this configuration to the stack will enable metric emission for l2geth and start grafana (for metrics visualisation) and influxdb (for metric collection) instances. + +The base stack can be started and stopped with a command like this (there is no need to specify the default docker-compose.yml) +``` +docker-compose \ + up --build --detach +``` + +To start the stack with monitoring enabled, just add the metric composition file. +``` +docker-compose \ + -f docker-compose.yml \ + -f docker-compose-metrics.yml \ + up --build --detach +``` + +A Makefile has been provided for convience. The following targets are available. +- make up +- make down +- make up-metrics +- make down-metrics + +## Authentication + +Influxdb has authentication disabled. + +Grafana requires a login. The defaults are: +``` +user: admin +password: optimism +``` + +## Data persistance + +Grafana data is not currently saved. Any modifications or additions will be lost on container restart. + +InfluxDB is persisting data to a Docker volume. + +**Stopping the project removing the containers will not clear this volume** + +To remove the influxdb and grafana data, run a commands like +``` +docker volume rm ops_influxdb_data +docker volume rm ops_grafana_data +``` + +## Accessing Grafana dashboards + +After starting up the project Grafana should be listening on http://localhost:3000. + +Access this link and authenticate as `admin` (see #Authentication) + +From the Dashboard list, select "Geth dashboard". diff --git a/ops/docker-compose-metrics.yml b/ops/docker-compose-metrics.yml new file mode 100644 index 0000000000000..3bd70a7d9e932 --- /dev/null +++ b/ops/docker-compose-metrics.yml @@ -0,0 +1,48 @@ +version: "3" + +services: + l2geth: + command: ["--metrics", "--metrics.influxdb", "--metrics.influxdb.endpoint", "http://influxdb:8086", "--metrics.influxdb.database", "l2geth"] + + grafana: + image: grafana/grafana:7.5.5 + env_file: + - ./envs/metrics.env + ports: + - ${GRAFANA_HTTP_PORT:-3000}:3000 + volumes: + - ./docker/grafana/provisioning/:/etc/grafana/provisioning/:ro + - grafana_data:/var/lib/grafana/ + - grafana_dashboards:/grafana-dashboards:ro + + influxdb: + image: quay.io/influxdb/influxdb:1.6 + env_file: + - ./envs/metrics.env + volumes: + - influxdb_data:/var/lib/influxdb + + prometheus: + image: prom/prometheus + env_file: + - ./envs/metrics.env + volumes: + - ./docker/prometheus:/etc/prometheus + - prometheus_data:/prometheus + + dashboard-sync: + image: python:3 + env_file: + - ./envs/metrics.env + command: + - python + - /scripts/dashboard-sync.py + volumes: + - ./docker/scripts/:/scripts + - grafana_dashboards:/grafana-dashboards + +volumes: + influxdb_data: + grafana_data: + grafana_dashboards: + prometheus_data: \ No newline at end of file diff --git a/ops/docker-compose.yml b/ops/docker-compose.yml index b0f3ed6a59fc6..2ca1b5e648900 100644 --- a/ops/docker-compose.yml +++ b/ops/docker-compose.yml @@ -18,7 +18,7 @@ services: dockerfile: Dockerfile ports: # expose the service to the host for integration testing - - ${L1_CHAIN_PORT:-9545}:8545 + - ${L1CHAIN_HTTP_PORT:-9545}:8545 deployer: depends_on: diff --git a/ops/docker/grafana/provisioning/dashboards/config.yml b/ops/docker/grafana/provisioning/dashboards/config.yml new file mode 100644 index 0000000000000..979ffcad8de42 --- /dev/null +++ b/ops/docker/grafana/provisioning/dashboards/config.yml @@ -0,0 +1,9 @@ +apiVersion: 1 + +providers: + - name: dashboards + type: file + updateIntervalSeconds: 30 + options: + path: /grafana-dashboards + foldersFromFilesStructure: true \ No newline at end of file diff --git a/ops/docker/grafana/provisioning/datasources/influxdb.yml b/ops/docker/grafana/provisioning/datasources/influxdb.yml new file mode 100644 index 0000000000000..b1f8d49518200 --- /dev/null +++ b/ops/docker/grafana/provisioning/datasources/influxdb.yml @@ -0,0 +1,10 @@ +apiVersion: 1 +datasources: + - name: InfluxDB + type: influxdb + access: proxy + orgId: 1 + database: l2geth + url: http://influxdb:8086 + version: 1 + editable: false diff --git a/ops/docker/grafana/provisioning/datasources/prometheus.yml b/ops/docker/grafana/provisioning/datasources/prometheus.yml new file mode 100644 index 0000000000000..401e2154fed14 --- /dev/null +++ b/ops/docker/grafana/provisioning/datasources/prometheus.yml @@ -0,0 +1,9 @@ +apiVersion: 1 +datasources: + - name: Prometheus + type: prometheus + access: proxy + orgId: 1 + url: http://prometheus:9090 + version: 1 + editable: false \ No newline at end of file diff --git a/ops/docker/prometheus/prometheus.yml b/ops/docker/prometheus/prometheus.yml new file mode 100644 index 0000000000000..9026833b65f49 --- /dev/null +++ b/ops/docker/prometheus/prometheus.yml @@ -0,0 +1,24 @@ +# my global config +global: + scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute. + evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute. + # scrape_timeout is set to the global default (10s). + +# Alertmanager configuration +alerting: + alertmanagers: + - static_configs: + - targets: + # - alertmanager:9093 + +# Load rules once and periodically evaluate them according to the global 'evaluation_interval'. +rule_files: + # - "first_rules.yml" + # - "second_rules.yml" + +# A scrape configuration containing exactly one endpoint to scrape: +# Here it's Prometheus itself. +scrape_configs: + - job_name: 'data-transport-layer' + static_configs: + - targets: ['dtl:7878'] diff --git a/ops/docker/scripts/dashboard-sync.py b/ops/docker/scripts/dashboard-sync.py new file mode 100644 index 0000000000000..91cc06cee0553 --- /dev/null +++ b/ops/docker/scripts/dashboard-sync.py @@ -0,0 +1,30 @@ + +import os +import urllib.request + +dashboard_list=[ + { + 'name': 'Single Geth', + 'filename': 'single_geth.json', + 'url': 'https://gist.githubusercontent.com/karalabe/1e26f9ea5c842fb118584edadc454e18/raw/6754e6d5c59328e19ad3a8a29a8e7e41fd46e202/geth.json' + } +] +dashboard_path="/grafana-dashboards" + +GF_SECURITY_ADMIN_PASSWORD = os.environ.get('GF_SECURITY_ADMIN_PASSWORD') +if GF_SECURITY_ADMIN_PASSWORD is None: + print('GF_SECURITY_ADMIN_PASSWORD env value is missing, exiting.') + sys.exit(1) + +if (not os.path.exists(dashboard_path)) or (not os.path.isdir(dashboard_path)) or (not os.access(dashboard_path, os.W_OK)): + print('Dashboard path %s is not writable, exiting'.format(dashboard_path)) + sys.exit(1) + +for dashboard in dashboard_list: + with urllib.request.urlopen(dashboard['url']) as f: + response = f.read() + decoded_html = response.decode('utf-8') + data = decoded_html.replace('${DS_INFLUXDB}', 'InfluxDB') + d_file = open(os.path.join(dashboard_path, dashboard['filename']),'w') + d_file.write(data) + d_file.close() diff --git a/ops/envs/metrics.env b/ops/envs/metrics.env new file mode 100644 index 0000000000000..3521cbc3da944 --- /dev/null +++ b/ops/envs/metrics.env @@ -0,0 +1,3 @@ +GF_SECURITY_ADMIN_PASSWORD=optimism +INFLUXDB_HTTP_AUTH_ENABLED=false +INFLUXDB_DB=l2geth diff --git a/ops/scripts/geth.sh b/ops/scripts/geth.sh index 2022d892f55f9..b9aa06d4a1708 100755 --- a/ops/scripts/geth.sh +++ b/ops/scripts/geth.sh @@ -38,4 +38,4 @@ curl \ --retry-delay 1 \ $ROLLUP_CLIENT_HTTP -exec geth --verbosity="$VERBOSITY" +exec geth --verbosity="$VERBOSITY" "$@" From 9599b697336f6ea1ca6e4fa554f1dc12109ef72b Mon Sep 17 00:00:00 2001 From: smartcontracts Date: Fri, 7 May 2021 18:51:05 -0400 Subject: [PATCH 46/81] fix[contracts]: Fix a bug in contracts package json that removed artifacts (#810) * fix: bug in contracts package json * chore: add changeset --- .changeset/warm-zoos-speak.md | 5 +++++ packages/contracts/package.json | 4 ++-- 2 files changed, 7 insertions(+), 2 deletions(-) create mode 100644 .changeset/warm-zoos-speak.md diff --git a/.changeset/warm-zoos-speak.md b/.changeset/warm-zoos-speak.md new file mode 100644 index 0000000000000..03f4c867ab5c8 --- /dev/null +++ b/.changeset/warm-zoos-speak.md @@ -0,0 +1,5 @@ +--- +'@eth-optimism/contracts': patch +--- + +Fixed a bug in package json that stopped artifacts from being published diff --git a/packages/contracts/package.json b/packages/contracts/package.json index d4db212d798a1..8d2b5253a54da 100644 --- a/packages/contracts/package.json +++ b/packages/contracts/package.json @@ -6,8 +6,8 @@ "dist/**/*.js", "dist/types/*.ts", "dist/types-ovm/*.ts", - "artifacts/contracts/*.json", - "artifacts-ovm/contracts/*.json", + "artifacts/contracts/**/*.json", + "artifacts-ovm/contracts/**/*.json", "OVM", "iOVM", "libraries", From 027d6258a0620498f9068262b6b166942c9e35a8 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 8 May 2021 02:07:00 +0300 Subject: [PATCH 47/81] Version Packages (#812) Co-authored-by: github-actions[bot] --- .changeset/warm-zoos-speak.md | 5 ----- packages/contracts/CHANGELOG.md | 6 ++++++ packages/contracts/package.json | 2 +- 3 files changed, 7 insertions(+), 6 deletions(-) delete mode 100644 .changeset/warm-zoos-speak.md diff --git a/.changeset/warm-zoos-speak.md b/.changeset/warm-zoos-speak.md deleted file mode 100644 index 03f4c867ab5c8..0000000000000 --- a/.changeset/warm-zoos-speak.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@eth-optimism/contracts': patch ---- - -Fixed a bug in package json that stopped artifacts from being published diff --git a/packages/contracts/CHANGELOG.md b/packages/contracts/CHANGELOG.md index a3deba7905207..8f81ef078000c 100644 --- a/packages/contracts/CHANGELOG.md +++ b/packages/contracts/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +## 0.2.11 + +### Patch Changes + +- 9599b69: Fixed a bug in package json that stopped artifacts from being published + ## 0.2.10 ### Patch Changes diff --git a/packages/contracts/package.json b/packages/contracts/package.json index 8d2b5253a54da..17ceb22c834ce 100644 --- a/packages/contracts/package.json +++ b/packages/contracts/package.json @@ -1,6 +1,6 @@ { "name": "@eth-optimism/contracts", - "version": "0.2.10", + "version": "0.2.11", "main": "dist/index", "files": [ "dist/**/*.js", From 33fcd841729043ce4c6d4833bf6b9f36a697b1d1 Mon Sep 17 00:00:00 2001 From: Mark Tyneway Date: Fri, 7 May 2021 16:33:56 -0700 Subject: [PATCH 48/81] message-relayer: add in address check for better error alerting (#811) * message-relayer: add in address check for better error alerting * chore: add changeset * relayer: log sending tx and tx confirmation * lint: fix --- .changeset/nasty-bees-remain.md | 5 +++++ packages/message-relayer/src/service.ts | 24 +++++++++++++++++++++++- 2 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 .changeset/nasty-bees-remain.md diff --git a/.changeset/nasty-bees-remain.md b/.changeset/nasty-bees-remain.md new file mode 100644 index 0000000000000..74cc671ad9213 --- /dev/null +++ b/.changeset/nasty-bees-remain.md @@ -0,0 +1,5 @@ +--- +'@eth-optimism/message-relayer': patch +--- + +Add a check for `OVM_L2MessageRelayer` in the AddressManager before attempting to relay messages to help surface errors more quickly diff --git a/packages/message-relayer/src/service.ts b/packages/message-relayer/src/service.ts index c1d71b0fc2358..18fbff994da96 100644 --- a/packages/message-relayer/src/service.ts +++ b/packages/message-relayer/src/service.ts @@ -151,6 +151,20 @@ export class MessageRelayerService extends BaseService { await sleep(this.options.pollingInterval) try { + // Check that the correct address is set in the address manager + const relayer = await this.state.Lib_AddressManager.getAddress( + 'OVM_L2MessageRelayer' + ) + // If it is address(0), then message relaying is not authenticated + if (relayer !== ethers.constants.AddressZero) { + const address = await this.options.l1Wallet.getAddress() + if (relayer !== address) { + throw new Error( + `OVM_L2MessageRelayer (${relayer}) is not set to message-passer EOA ${address}` + ) + } + } + this.logger.info('Checking for newly finalized transactions...') if ( !(await this._isTransactionFinalized( @@ -486,11 +500,19 @@ export class MessageRelayerService extends BaseService { } ) + this.logger.info('Relay message transaction sent', { + transactionHash: result, + }) + try { const receipt = await result.wait() - this.logger.info('Relay message transaction sent', { + this.logger.info('Relay message included in block', { transactionHash: receipt.transactionHash, + blockNumber: receipt.blockNumber, + gasUsed: receipt.gasUsed.toString(), + confirmations: receipt.confirmations, + status: receipt.status, }) } catch (err) { this.logger.error('Real relay attempt failed, skipping.', { err }) From 9b7dd4bfe9c5abc5923cc81edb4190bacb5e1edf Mon Sep 17 00:00:00 2001 From: Mark Tyneway Date: Fri, 7 May 2021 16:55:32 -0700 Subject: [PATCH 49/81] l2geth: start script ws (#806) * l2geth: add wsport parsing to start script * chore: add changeset --- .changeset/sour-onions-burn.md | 5 +++++ l2geth/scripts/start.sh | 12 +++++++++++- 2 files changed, 16 insertions(+), 1 deletion(-) create mode 100644 .changeset/sour-onions-burn.md diff --git a/.changeset/sour-onions-burn.md b/.changeset/sour-onions-burn.md new file mode 100644 index 0000000000000..6c202ac41998a --- /dev/null +++ b/.changeset/sour-onions-burn.md @@ -0,0 +1,5 @@ +--- +'@eth-optimism/l2geth': patch +--- + +Update `scripts/start.sh` to parse the websocket port and pass to geth at runtime diff --git a/l2geth/scripts/start.sh b/l2geth/scripts/start.sh index 2da703a772813..e7d7fad14e860 100755 --- a/l2geth/scripts/start.sh +++ b/l2geth/scripts/start.sh @@ -17,6 +17,7 @@ ROLLUP_POLL_INTERVAL=15s ROLLUP_TIMESTAMP_REFRESH=3m CACHE=1024 RPC_PORT=8545 +WS_PORT=8546 VERBOSITY=3 USAGE=" @@ -84,6 +85,15 @@ while (( "$#" )); do exit 1 fi ;; + --wsport) + if [ -n "$2" ] && [ ${2:0:1} != "-" ]; then + WS_PORT="$2" + shift 2 + else + echo "Error: Argument for $1 is missing" >&2 + exit 1 + fi + ;; --eth1.ctcdeploymentheight) if [ -n "$2" ] && [ ${2:0:1} != "-" ]; then ETH1_CTC_DEPLOYMENT_HEIGHT="$2" @@ -222,7 +232,7 @@ cmd="$cmd --rpccorsdomain '*'" cmd="$cmd --rpcvhosts '*'" cmd="$cmd --ws" cmd="$cmd --wsaddr 0.0.0.0" -cmd="$cmd --wsport 8546" +cmd="$cmd --wsport $WS_PORT" cmd="$cmd --wsorigins '*'" cmd="$cmd --rpcapi 'eth,net,rollup,web3,debug'" cmd="$cmd --gasprice 0" From 60a470cb81c4c6d1538db740b46df09cf4522a7a Mon Sep 17 00:00:00 2001 From: Liam Horne Date: Fri, 7 May 2021 17:05:23 -0700 Subject: [PATCH 50/81] build: add types (#791) Co-authored-by: smartcontracts --- examples/hardhat/package.json | 3 + examples/waffle/package.json | 3 + integration-tests/package.json | 4 + l2geth/package.json | 3 +- packages/batch-submitter/package.json | 4 + packages/common-ts/package.json | 1 + packages/contracts/package.json | 6 ++ packages/core-utils/package.json | 4 + packages/data-transport-layer/package.json | 3 + packages/hardhat-ovm/package.json | 2 + packages/smock/package.json | 4 + specs/package.json | 1 + yarn.lock | 90 ++++++++++++++++++++-- 13 files changed, 122 insertions(+), 6 deletions(-) diff --git a/examples/hardhat/package.json b/examples/hardhat/package.json index 1595983857ed1..46f29693641ae 100644 --- a/examples/hardhat/package.json +++ b/examples/hardhat/package.json @@ -17,6 +17,9 @@ "@eth-optimism/hardhat-ovm": "^0.1.0", "@nomiclabs/hardhat-ethers": "^2.0.1", "@nomiclabs/hardhat-waffle": "^2.0.1", + "@types/chai": "4.2.17", + "@types/chai-as-promised": "^7.1.3", + "@types/mocha": "^8.2.2", "chai": "4.3.4", "chai-as-promised": "^7.1.1", "ethereum-waffle": "^3.3.0", diff --git a/examples/waffle/package.json b/examples/waffle/package.json index c7d500d7e19fd..3d7170ffd2efa 100644 --- a/examples/waffle/package.json +++ b/examples/waffle/package.json @@ -29,6 +29,9 @@ "url": "https://github.com/ethereum-optimism/ERC20-Example.git" }, "devDependencies": { + "@types/chai": "^4.2.17", + "@types/mocha": "^7.0.2", + "@types/rimraf": "^3.0.0", "chai": "^4.3.4", "dotenv": "^8.2.0", "ethereum-waffle": "^3.0.0", diff --git a/integration-tests/package.json b/integration-tests/package.json index 216e3b836660f..712cff307d89a 100644 --- a/integration-tests/package.json +++ b/integration-tests/package.json @@ -22,6 +22,10 @@ "@ethersproject/providers": "^5.0.24", "@nomiclabs/hardhat-ethers": "^2.0.2", "@types/chai-as-promised": "^7.1.3", + "@types/chai": "^4.2.17", + "@types/mocha": "^8.2.2", + "@types/rimraf": "^3.0.0", + "@types/shelljs": "^0.8.8", "chai": "^4.3.3", "chai-as-promised": "^7.1.1", "docker-compose": "^0.23.8", diff --git a/l2geth/package.json b/l2geth/package.json index 00cb6f1e32459..35d04a6d9ac1d 100644 --- a/l2geth/package.json +++ b/l2geth/package.json @@ -1,5 +1,6 @@ { "name": "@eth-optimism/l2geth", "version": "0.2.6", - "private": true + "private": true, + "devDependencies": {} } diff --git a/packages/batch-submitter/package.json b/packages/batch-submitter/package.json index 010ba7373204c..3cabbeec7d343 100644 --- a/packages/batch-submitter/package.json +++ b/packages/batch-submitter/package.json @@ -47,10 +47,14 @@ "@eth-optimism/smock": "^1.1.3", "@nomiclabs/hardhat-ethers": "^2.0.2", "@nomiclabs/hardhat-waffle": "^2.0.1", + "@types/bluebird": "^3.5.34", "@types/chai": "^4.1.7", "@types/mocha": "^5.2.6", "@types/node": "^11.11.3", + "@types/prettier": "^1.19.1", + "@types/rimraf": "^3.0.0", "@types/sinon": "^9.0.10", + "@types/sinon-chai": "^3.2.5", "chai": "^4.2.0", "ethereum-waffle": "3.0.0", "ganache-core": "^2.13.2", diff --git a/packages/common-ts/package.json b/packages/common-ts/package.json index fe3fc13d034a4..17c73f740c2ad 100644 --- a/packages/common-ts/package.json +++ b/packages/common-ts/package.json @@ -18,6 +18,7 @@ "devDependencies": { "@types/pino": "^6.3.6", "@types/pino-multi-stream": "^5.1.1", + "@types/prettier": "^2.2.3", "prettier": "^2.2.1", "tslint": "^6.1.3", "tslint-config-prettier": "^1.18.0", diff --git a/packages/contracts/package.json b/packages/contracts/package.json index 17ceb22c834ce..d1936869480d2 100644 --- a/packages/contracts/package.json +++ b/packages/contracts/package.json @@ -62,8 +62,14 @@ "@nomiclabs/hardhat-ethers": "^2.0.1", "@nomiclabs/hardhat-waffle": "^2.0.1", "@typechain/ethers-v5": "1.0.0", + "@types/buffer-xor": "^2.0.0", + "@types/chai": "^4.2.17", + "@types/copyfiles": "^2.4.0", "@types/glob": "^7.1.3", "@types/lodash": "^4.14.161", + "@types/mkdirp": "^1.0.1", + "@types/mocha": "^8.2.2", + "@types/yargs": "^16.0.1", "buffer-xor": "^2.0.2", "chai": "^4.3.1", "copyfiles": "^2.3.0", diff --git a/packages/core-utils/package.json b/packages/core-utils/package.json index 7a20745c65bf0..111a3b70a8bf6 100644 --- a/packages/core-utils/package.json +++ b/packages/core-utils/package.json @@ -19,6 +19,10 @@ "test": "ts-mocha test/**/*.spec.ts" }, "devDependencies": { + "@types/chai": "^4.2.17", + "@types/lodash": "^4.14.168", + "@types/mocha": "^8.2.2", + "@types/prettier": "^2.2.3", "chai": "^4.3.0", "mocha": "^8.3.0", "prettier": "^2.2.1", diff --git a/packages/data-transport-layer/package.json b/packages/data-transport-layer/package.json index ba51285d36bc5..ae32e55f21246 100644 --- a/packages/data-transport-layer/package.json +++ b/packages/data-transport-layer/package.json @@ -40,8 +40,11 @@ "devDependencies": { "@ethersproject/abstract-provider": "^5.1.0", "@types/browser-or-node": "^1.3.0", + "@types/chai": "^4.2.17", + "@types/chai-as-promised": "^7.1.3", "@types/cors": "^2.8.9", "@types/levelup": "^4.3.0", + "@types/mocha": "^8.2.2", "@types/node-fetch": "^2.5.8", "chai": "^4.3.4", "chai-as-promised": "^7.1.1", diff --git a/packages/hardhat-ovm/package.json b/packages/hardhat-ovm/package.json index 7267228cb7f26..c3184b3b2f250 100644 --- a/packages/hardhat-ovm/package.json +++ b/packages/hardhat-ovm/package.json @@ -22,6 +22,8 @@ "hardhat": "^2.2.1" }, "devDependencies": { + "@types/mocha": "^8.2.2", + "@types/node-fetch": "^2.5.10", "prettier": "^2.2.1", "tslint": "^6.1.3", "tslint-config-prettier": "^1.18.0", diff --git a/packages/smock/package.json b/packages/smock/package.json index cabda87592c9a..aaacc69b3ec4e 100644 --- a/packages/smock/package.json +++ b/packages/smock/package.json @@ -31,7 +31,11 @@ "@nomiclabs/ethereumjs-vm": "^4.2.2", "@nomiclabs/hardhat-ethers": "^2.0.2", "@nomiclabs/hardhat-waffle": "^2.0.1", + "@types/bn.js": "^5.1.0", + "@types/chai": "^4.2.17", + "@types/glob": "^7.1.3", "@types/lodash": "^4.14.161", + "@types/prettier": "^2.2.3", "chai": "^4.3.0", "ethereum-waffle": "^3.3.0", "ethers": "^5.0.31", diff --git a/specs/package.json b/specs/package.json index 42a439621b35d..ae4e4f37690c8 100644 --- a/specs/package.json +++ b/specs/package.json @@ -4,6 +4,7 @@ "license": "MIT", "private": true, "devDependencies": { + "@types/prettier": "2.2.1", "prettier": "^2.2.1" }, "scripts": { diff --git a/yarn.lock b/yarn.lock index c7edf7ccb7f08..86175bedaf922 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2267,6 +2267,11 @@ resolved "https://registry.yarnpkg.com/@types/abstract-leveldown/-/abstract-leveldown-5.0.1.tgz#3c7750d0186b954c7f2d2f6acc8c3c7ba0c3412e" integrity sha512-wYxU3kp5zItbxKmeRYCEplS2MW7DzyBnxPGj+GJVHZEUZiK/nn5Ei1sUFgURDh+X051+zsGe28iud3oHjrYWQQ== +"@types/bluebird@^3.5.34": + version "3.5.34" + resolved "https://registry.yarnpkg.com/@types/bluebird/-/bluebird-3.5.34.tgz#0e9f1f4f5dfab98a421fb973b5f5690d22411893" + integrity sha512-QMc57Pf067Rr78l6f4FftvuIXPYxu0VYFRKrZk1Clv+LWy7gN2fTBiAiv68askFHEHZcTLPFd01kNlpKOiSPgQ== + "@types/bn.js@*", "@types/bn.js@^5.1.0": version "5.1.0" resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-5.1.0.tgz#32c5d271503a12653c62cf4d2b45e6eab8cebc68" @@ -2294,6 +2299,13 @@ resolved "https://registry.yarnpkg.com/@types/browser-or-node/-/browser-or-node-1.3.0.tgz#896ec59bcb8109fc858d8e68d3c056c176a19622" integrity sha512-MVetr65IR7RdJbUxVHsaPFaXAO8fi89zv1g8L/mHygh1Q7xnnK02XZLwfMh57FOpTO6gtnagoPMQ/UOFfctXRQ== +"@types/buffer-xor@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@types/buffer-xor/-/buffer-xor-2.0.0.tgz#15738051e0720b68120cd2cc3f204aa4dc16bab1" + integrity sha512-NEJkIKUE/xboduuIAJmdtUvbXgUOfMkjOo6lWsiBVUIWBC5fVWGT+50yEw9W1Xp4ga76khg57pHELXw5Xm3Y+A== + dependencies: + "@types/node" "*" + "@types/chai-as-promised@^7.1.3": version "7.1.3" resolved "https://registry.yarnpkg.com/@types/chai-as-promised/-/chai-as-promised-7.1.3.tgz#779166b90fda611963a3adbfd00b339d03b747bd" @@ -2306,6 +2318,11 @@ resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.2.16.tgz#f09cc36e18d28274f942e7201147cce34d97e8c8" integrity sha512-vI5iOAsez9+roLS3M3+Xx7w+WRuDtSmF8bQkrbcIJ2sC1PcDgVoA0WGpa+bIrJ+y8zqY2oi//fUctkxtIcXJCw== +"@types/chai@4.2.17", "@types/chai@^4.2.17": + version "4.2.17" + resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.2.17.tgz#85f9f0610f514b22a94125d441f73eef65bde5cc" + integrity sha512-LaiwWNnYuL8xJlQcE91QB2JoswWZckq9A4b+nMPq8dt8AP96727Nb3X4e74u+E3tm4NLTILNI9MYFsyVc30wSA== + "@types/concat-stream@^1.6.0": version "1.6.0" resolved "https://registry.yarnpkg.com/@types/concat-stream/-/concat-stream-1.6.0.tgz#394dbe0bb5fee46b38d896735e8b68ef2390d00d" @@ -2320,6 +2337,11 @@ dependencies: "@types/node" "*" +"@types/copyfiles@^2.4.0": + version "2.4.0" + resolved "https://registry.yarnpkg.com/@types/copyfiles/-/copyfiles-2.4.0.tgz#877ef9aa9def7df889fb1ca900206c79a873d113" + integrity sha512-ujm66wtJzW0ok5bIfwSZdvI4C4E6rbAvG58zow71wLjPPj65rIMu4Uy5LOx5H4eRvaagGUrrKTxqfLiDSsHEGQ== + "@types/cors@^2.8.9": version "2.8.10" resolved "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.10.tgz#61cc8469849e5bcdd0c7044122265c39cec10cf4" @@ -2351,7 +2373,7 @@ dependencies: "@types/node" "*" -"@types/glob@^7.1.1", "@types/glob@^7.1.3": +"@types/glob@*", "@types/glob@^7.1.1", "@types/glob@^7.1.3": version "7.1.3" resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.3.tgz#e6ba80f36b7daad2c685acd9266382e68985c183" integrity sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w== @@ -2372,7 +2394,7 @@ "@types/abstract-leveldown" "*" "@types/node" "*" -"@types/lodash@^4.14.161": +"@types/lodash@^4.14.161", "@types/lodash@^4.14.168": version "4.14.168" resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.168.tgz#fe24632e79b7ade3f132891afff86caa5e5ce008" integrity sha512-oVfRvqHV/V6D1yifJbVRU3TMp8OT6o6BG+U9MkwuJ3U8/CsDHvalRpsxBqivn71ztOFZBTfJMvETbqHiaNSj7Q== @@ -2404,11 +2426,36 @@ dependencies: "@types/node" "*" +"@types/mkdirp@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@types/mkdirp/-/mkdirp-1.0.1.tgz#0930b948914a78587de35458b86c907b6e98bbf6" + integrity sha512-HkGSK7CGAXncr8Qn/0VqNtExEE+PHMWb+qlR1faHMao7ng6P3tAaoWWBMdva0gL5h4zprjIO89GJOLXsMcDm1Q== + dependencies: + "@types/node" "*" + "@types/mocha@^5.2.6": version "5.2.7" resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-5.2.7.tgz#315d570ccb56c53452ff8638738df60726d5b6ea" integrity sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ== +"@types/mocha@^7.0.2": + version "7.0.2" + resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-7.0.2.tgz#b17f16cf933597e10d6d78eae3251e692ce8b0ce" + integrity sha512-ZvO2tAcjmMi8V/5Z3JsyofMe3hasRcaw88cto5etSVMwVQfeivGAlEYmaQgceUSVYFofVjT+ioHsATjdWcFt1w== + +"@types/mocha@^8.2.2": + version "8.2.2" + resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-8.2.2.tgz#91daa226eb8c2ff261e6a8cbf8c7304641e095e0" + integrity sha512-Lwh0lzzqT5Pqh6z61P3c3P5nm6fzQK/MMHl9UKeneAeInVflBSz1O2EkX6gM6xfJd7FBXBY5purtLx7fUiZ7Hw== + +"@types/node-fetch@^2.5.10": + version "2.5.10" + resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.5.10.tgz#9b4d4a0425562f9fcea70b12cb3fcdd946ca8132" + integrity sha512-IpkX0AasN44hgEad0gEF/V6EgR5n69VEqPEgnmoM8GsIGro3PowbWs4tR6IhxUTyPLpOn+fiGG6nrQhcmoCuIQ== + dependencies: + "@types/node" "*" + form-data "^3.0.0" + "@types/node-fetch@^2.5.5", "@types/node-fetch@^2.5.8": version "2.5.9" resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.5.9.tgz#c04a12115aa436f189e39579272b305e477621b4" @@ -2504,12 +2551,17 @@ "@types/pino-std-serializers" "*" "@types/sonic-boom" "*" -"@types/prettier@^1.13.2": +"@types/prettier@2.2.1": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.2.1.tgz#374e31645d58cb18a07b3ecd8e9dede4deb2cccd" + integrity sha512-DxZZbyMAM9GWEzXL+BMZROWz9oo6A9EilwwOMET2UVu2uZTqMWS5S69KVtuVKaRjCUpcrOXRalet86/OpG4kqw== + +"@types/prettier@^1.13.2", "@types/prettier@^1.19.1": version "1.19.1" resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-1.19.1.tgz#33509849f8e679e4add158959fdb086440e9553f" integrity sha512-5qOlnZscTn4xxM5MeGXAMOsIOIKIbh9e85zJWfBRVPlRMEVawzoPhINYbRGkBZCI8LxvBe7tJCdWiarA99OZfQ== -"@types/prettier@^2.1.1": +"@types/prettier@^2.1.1", "@types/prettier@^2.2.3": version "2.2.3" resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.2.3.tgz#ef65165aea2924c9359205bf748865b8881753c0" integrity sha512-PijRCG/K3s3w1We6ynUKdxEc5AcuuH3NBmMDP8uvKVp6X43UY7NQlTzczakXP3DJR0F4dfNQIGjU2cUeRYs2AA== @@ -2531,6 +2583,14 @@ dependencies: "@types/node" "*" +"@types/rimraf@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/rimraf/-/rimraf-3.0.0.tgz#b9d03f090ece263671898d57bb7bb007023ac19f" + integrity sha512-7WhJ0MdpFgYQPXlF4Dx+DhgvlPCfz/x5mHaeDQAKhcenvQP1KCpLQ18JklAqeGMYSAT2PxLpzd0g2/HE7fj7hQ== + dependencies: + "@types/glob" "*" + "@types/node" "*" + "@types/secp256k1@^4.0.1": version "4.0.1" resolved "https://registry.yarnpkg.com/@types/secp256k1/-/secp256k1-4.0.1.tgz#fb3aa61a1848ad97d7425ff9dcba784549fca5a4" @@ -2551,7 +2611,15 @@ "@types/mime" "^1" "@types/node" "*" -"@types/sinon-chai@^3.2.3": +"@types/shelljs@^0.8.8": + version "0.8.8" + resolved "https://registry.yarnpkg.com/@types/shelljs/-/shelljs-0.8.8.tgz#e439c69929b88a2c8123c1a55e09eb708315addf" + integrity sha512-lD3LWdg6j8r0VRBFahJVaxoW0SIcswxKaFUrmKl33RJVeeoNYQAz4uqCJ5Z6v4oIBOsC5GozX+I5SorIKiTcQA== + dependencies: + "@types/glob" "*" + "@types/node" "*" + +"@types/sinon-chai@^3.2.3", "@types/sinon-chai@^3.2.5": version "3.2.5" resolved "https://registry.yarnpkg.com/@types/sinon-chai/-/sinon-chai-3.2.5.tgz#df21ae57b10757da0b26f512145c065f2ad45c48" integrity sha512-bKQqIpew7mmIGNRlxW6Zli/QVyc3zikpGzCa797B/tRnD9OtHvZ/ts8sYXV+Ilj9u3QRaUEM8xrjgd1gwm1BpQ== @@ -2591,6 +2659,18 @@ "@types/bn.js" "*" "@types/underscore" "*" +"@types/yargs-parser@*": + version "20.2.0" + resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-20.2.0.tgz#dd3e6699ba3237f0348cd085e4698780204842f9" + integrity sha512-37RSHht+gzzgYeobbG+KWryeAW8J33Nhr69cjTqSYymXVZEN9NbRYWoYlRtDhHKPVT1FyNKwaTPC1NynKZpzRA== + +"@types/yargs@^16.0.1": + version "16.0.1" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-16.0.1.tgz#5fc5d41f69762e00fbecbc8d4bf9dea47d8726f4" + integrity sha512-x4HABGLyzr5hKUzBC9dvjciOTm11WVH1NWonNjGgxapnTHu5SWUqyqn0zQ6Re0yQU0lsQ6ztLCoMAKDGZflyxA== + dependencies: + "@types/yargs-parser" "*" + "@ungap/promise-all-settled@1.1.2": version "1.1.2" resolved "https://registry.yarnpkg.com/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz#aa58042711d6e3275dd37dc597e5d31e8c290a44" From 751e2be840af343e33836f5cc6d63325a3531ab4 Mon Sep 17 00:00:00 2001 From: Karl Floersch Date: Fri, 7 May 2021 21:09:17 -0700 Subject: [PATCH 51/81] feat: add proposer & sequencer signers to BS (#817) * feat: add proposer & sequencer signers to BS * De-duplicate sequencer & proposer wallets if same addr * Add changeset * Remove out of date comment * Lint --- .changeset/pink-buttons-hang.md | 5 ++ .../src/exec/run-batch-submitter.ts | 52 ++++++++++++++++--- 2 files changed, 49 insertions(+), 8 deletions(-) create mode 100644 .changeset/pink-buttons-hang.md diff --git a/.changeset/pink-buttons-hang.md b/.changeset/pink-buttons-hang.md new file mode 100644 index 0000000000000..809d21409cd2f --- /dev/null +++ b/.changeset/pink-buttons-hang.md @@ -0,0 +1,5 @@ +--- +'@eth-optimism/batch-submitter': patch +--- + +Add the support for different sequencer & proposer keys in the batch submitter. diff --git a/packages/batch-submitter/src/exec/run-batch-submitter.ts b/packages/batch-submitter/src/exec/run-batch-submitter.ts index e258683984b59..9e4108af5ac1b 100644 --- a/packages/batch-submitter/src/exec/run-batch-submitter.ts +++ b/packages/batch-submitter/src/exec/run-batch-submitter.ts @@ -105,7 +105,12 @@ const requiredEnvVars: RequiredEnvVars = { * FRAUD_SUBMISSION_ADDRESS * DISABLE_QUEUE_BATCH_APPEND * SEQUENCER_PRIVATE_KEY + * PROPOSER_PRIVATE_KEY * MNEMONIC + * SEQUENCER_MNEMONIC + * PROPOSER_MNEMONIC + * SEQUENCER_HD_PATH + * PROPOSER_HD_PATH */ const env = process.env const FRAUD_SUBMISSION_ADDRESS = env.FRAUD_SUBMISSION_ADDRESS || 'no fraud' @@ -114,10 +119,15 @@ const MIN_GAS_PRICE_IN_GWEI = parseInt(env.MIN_GAS_PRICE_IN_GWEI, 10) || 0 const MAX_GAS_PRICE_IN_GWEI = parseInt(env.MAX_GAS_PRICE_IN_GWEI, 10) || 70 const GAS_RETRY_INCREMENT = parseInt(env.GAS_RETRY_INCREMENT, 10) || 5 const GAS_THRESHOLD_IN_GWEI = parseInt(env.GAS_THRESHOLD_IN_GWEI, 10) || 100 -// The private key that will be used to submit tx and state batches. + +// Private keys & mnemonics const SEQUENCER_PRIVATE_KEY = env.SEQUENCER_PRIVATE_KEY -const MNEMONIC = env.MNEMONIC -const HD_PATH = env.HD_PATH +const PROPOSER_PRIVATE_KEY = + env.PROPOSER_PRIVATE_KEY || env.SEQUENCER_PRIVATE_KEY // Kept for backwards compatibility +const SEQUENCER_MNEMONIC = env.SEQUENCER_MNEMONIC || env.MNEMONIC +const PROPOSER_MNEMONIC = env.PROPOSER_MNEMONIC || env.MNEMONIC +const SEQUENCER_HD_PATH = env.SEQUENCER_HD_PATH || env.HD_PATH +const PROPOSER_HD_PATH = env.PROPOSER_HD_PATH || env.HD_PATH // Auto fix batch options -- TODO: Remove this very hacky config const AUTO_FIX_BATCH_OPTIONS_CONF = env.AUTO_FIX_BATCH_OPTIONS_CONF const autoFixBatchOptions: AutoFixBatchOptions = { @@ -153,20 +163,46 @@ export const run = async () => { ) let sequencerSigner: Signer + let proposerSigner: Signer if (SEQUENCER_PRIVATE_KEY) { sequencerSigner = new Wallet(SEQUENCER_PRIVATE_KEY, l1Provider) - } else if (MNEMONIC) { - sequencerSigner = Wallet.fromMnemonic(MNEMONIC, HD_PATH).connect(l1Provider) + } else if (SEQUENCER_MNEMONIC) { + sequencerSigner = Wallet.fromMnemonic( + SEQUENCER_MNEMONIC, + SEQUENCER_HD_PATH + ).connect(l1Provider) + } else { + throw new Error( + 'Must pass one of SEQUENCER_PRIVATE_KEY, MNEMONIC, or SEQUENCER_MNEMONIC' + ) + } + if (PROPOSER_PRIVATE_KEY) { + proposerSigner = new Wallet(PROPOSER_PRIVATE_KEY, l1Provider) + } else if (PROPOSER_MNEMONIC) { + proposerSigner = Wallet.fromMnemonic( + PROPOSER_MNEMONIC, + PROPOSER_HD_PATH + ).connect(l1Provider) } else { - throw new Error('Must pass one of SEQUENCER_PRIVATE_KEY or MNEMONIC') + throw new Error( + 'Must pass one of PROPOSER_PRIVATE_KEY, MNEMONIC, or PROPOSER_MNEMONIC' + ) } + const sequencerAddress = await sequencerSigner.getAddress() + const proposerAddress = await proposerSigner.getAddress() const address = await sequencerSigner.getAddress() logger.info('Configured batch submitter addresses', { - batchSubmitterAddress: address, + sequencerAddress, + proposerAddress, addressManagerAddress: requiredEnvVars.ADDRESS_MANAGER_ADDRESS, }) + // If the sequencer & proposer are the same, use a single wallet + if (sequencerAddress === proposerAddress) { + proposerSigner = sequencerSigner + } + const txBatchSubmitter = new TransactionBatchSubmitter( sequencerSigner, l2Provider, @@ -192,7 +228,7 @@ export const run = async () => { ) const stateBatchSubmitter = new StateBatchSubmitter( - sequencerSigner, + proposerSigner, l2Provider, parseInt(requiredEnvVars.MIN_L1_TX_SIZE, 10), parseInt(requiredEnvVars.MAX_L1_TX_SIZE, 10), From 6dc453fca7f196cfee8ec5162e66b0cf2425c024 Mon Sep 17 00:00:00 2001 From: Ben Wilson <82120899+optimisticben@users.noreply.github.com> Date: Mon, 10 May 2021 12:04:26 -0400 Subject: [PATCH 52/81] Add PR labeler to Github action (#826) --- .github/labeler.yml | 37 +++++++++++++++++++++++++++++++++++ .github/workflows/labeler.yml | 13 ++++++++++++ 2 files changed, 50 insertions(+) create mode 100644 .github/labeler.yml create mode 100644 .github/workflows/labeler.yml diff --git a/.github/labeler.yml b/.github/labeler.yml new file mode 100644 index 0000000000000..d7a54745ae9c4 --- /dev/null +++ b/.github/labeler.yml @@ -0,0 +1,37 @@ +--- +A-ci: + - any: ['.github/**/*'] + +A-contracts: + - any: ['packages/contracts/**/*'] + +A-geth: + - any: ['l2geth/**/*'] + +A-integration-tests: + - any: ['integration-tests/**/*'] + +A-ts-packages: + - any: ['packages/**/*'] + all: ['!packages/contracts/**/*'] + +M-batch-submitter: + - any: ['packages/batch-submitter/**/*'] + +M-contracts: + - any: ['packages/contracts/**/*'] + +M-core-utils: + - any: ['packages/core-utils/**/*'] + +M-dtl: + - any: ['packages/data-transport-layer/**/*'] + +M-hardhat-ovm: + - any: ['packages/hardhat-ovm/**/*'] + +M-ops: + - any: ['ops/**/*'] + +M-smock: + - any: ['packages/smock/**/*'] diff --git a/.github/workflows/labeler.yml b/.github/workflows/labeler.yml new file mode 100644 index 0000000000000..f689dfbc359ac --- /dev/null +++ b/.github/workflows/labeler.yml @@ -0,0 +1,13 @@ +--- +name: "Pull Request Labeler" +on: + - pull_request_target + +jobs: + pr-labeler: + runs-on: ubuntu-latest + steps: + - uses: actions/labeler@main + with: + repo-token: "${{ secrets.GITHUB_TOKEN }}" + configuration-path: .github/labeler.yml From 520c47b4981bc1b2e0f3ba98c6d5ceb3e5a38dc4 Mon Sep 17 00:00:00 2001 From: Matt Masurka Date: Mon, 10 May 2021 11:46:01 -0700 Subject: [PATCH 53/81] Removes previous deployment artifacts (#827) --- .gitignore | 1 + .../contracts/deployments/goerli-v1/.chainId | 1 - .../goerli-v1/Lib_AddressManager.json | 199 --- .../OVM_CanonicalTransactionChain.json | 757 ---------- ...OVM_ChainStorageContainer-CTC-batches.json | 488 ------- .../OVM_ChainStorageContainer-CTC-queue.json | 488 ------- ...OVM_ChainStorageContainer-SCC-batches.json | 488 ------- .../goerli-v1/OVM_L1CrossDomainMessenger.json | 477 ------- .../goerli-v1/OVM_StateCommitmentChain.json | 504 ------- .../Proxy__OVM_L1CrossDomainMessenger.json | 118 -- .../goerli-v1/mockOVM_BondManager.json | 216 --- .../cebcb515c1a9c570d96e0b8f6fd237e2.json | 266 ---- .../contracts/deployments/goerli-v2/.chainId | 1 - .../goerli-v2/Lib_AddressManager.json | 232 --- .../OVM_CanonicalTransactionChain.json | 819 ----------- ...OVM_ChainStorageContainer-CTC-batches.json | 453 ------ .../OVM_ChainStorageContainer-CTC-queue.json | 453 ------ ...OVM_ChainStorageContainer-SCC-batches.json | 453 ------ .../goerli-v2/OVM_ExecutionManager.json | 1263 ----------------- .../goerli-v2/OVM_FraudVerifier.json | 576 -------- .../goerli-v2/OVM_L1CrossDomainMessenger.json | 501 ------- .../goerli-v2/OVM_L1ETHGateway.json | 293 ---- .../goerli-v2/OVM_L1MultiMessageRelayer.json | 229 --- .../goerli-v2/OVM_SafetyChecker.json | 74 - .../goerli-v2/OVM_StateCommitmentChain.json | 529 ------- .../goerli-v2/OVM_StateManagerFactory.json | 74 - .../OVM_StateTransitionerFactory.json | 163 --- .../Proxy__OVM_L1CrossDomainMessenger.json | 118 -- .../goerli-v2/Proxy__OVM_L1ETHGateway.json | 118 -- .../goerli-v2/mockOVM_BondManager.json | 242 ---- .../8aef3555d89ad9d3af2f5d28a85dc856.json | 311 ---- .../kovan-v1/Lib_AddressManager.json | 199 --- .../OVM_CanonicalTransactionChain.json | 757 ---------- ...OVM_ChainStorageContainer-CTC-batches.json | 488 ------- .../OVM_ChainStorageContainer-CTC-queue.json | 488 ------- ...OVM_ChainStorageContainer-SCC-batches.json | 488 ------- .../kovan-v1/OVM_L1CrossDomainMessenger.json | 477 ------- .../kovan-v1/OVM_StateCommitmentChain.json | 504 ------- .../Proxy__OVM_L1CrossDomainMessenger.json | 118 -- .../kovan-v1/mockOVM_BondManager.json | 216 --- .../cebcb515c1a9c570d96e0b8f6fd237e2.json | 266 ---- .../contracts/deployments/kovan-v2/.chainId | 1 - .../deployments/{kovan-v1 => kovan}/.chainId | 0 .../Lib_AddressManager.json | 0 .../OVM_CanonicalTransactionChain.json | 0 ...OVM_ChainStorageContainer-CTC-batches.json | 0 .../OVM_ChainStorageContainer-CTC-queue.json | 0 ...OVM_ChainStorageContainer-SCC-batches.json | 0 .../OVM_ExecutionManager.json | 0 .../OVM_FraudVerifier.json | 0 .../OVM_L1CrossDomainMessenger.json | 0 .../{kovan-v2 => kovan}/OVM_L1ETHGateway.json | 0 .../OVM_L1MultiMessageRelayer.json | 0 .../OVM_SafetyChecker.json | 0 .../OVM_StateCommitmentChain.json | 0 .../OVM_StateManagerFactory.json | 0 .../OVM_StateTransitionerFactory.json | 0 .../Proxy__OVM_L1CrossDomainMessenger.json | 0 .../Proxy__OVM_L1ETHGateway.json | 0 .../mockOVM_BondManager.json | 0 .../03aed03b958b1d37f90bd88d0f56dd85.json | 0 .../mainnet-v1/Lib_AddressManager.json | 199 --- .../OVM_CanonicalTransactionChain.json | 757 ---------- ...OVM_ChainStorageContainer-CTC-batches.json | 488 ------- .../OVM_ChainStorageContainer-CTC-queue.json | 488 ------- ...OVM_ChainStorageContainer-SCC-batches.json | 488 ------- .../OVM_L1CrossDomainMessenger.json | 477 ------- .../mainnet-v1/OVM_StateCommitmentChain.json | 504 ------- .../Proxy__OVM_L1CrossDomainMessenger.json | 118 -- .../mainnet-v1/mockOVM_BondManager.json | 216 --- .../cebcb515c1a9c570d96e0b8f6fd237e2.json | 266 ---- .../contracts/deployments/mainnet-v2/.chainId | 1 - .../{mainnet-v1 => mainnet}/.chainId | 0 .../Lib_AddressManager.json | 0 .../OVM_CanonicalTransactionChain.json | 0 ...OVM_ChainStorageContainer-CTC-batches.json | 0 .../OVM_ChainStorageContainer-CTC-queue.json | 0 ...OVM_ChainStorageContainer-SCC-batches.json | 0 .../OVM_ExecutionManager.json | 0 .../OVM_FraudVerifier.json | 0 .../OVM_L1CrossDomainMessenger.json | 0 .../OVM_L1ETHGateway.json | 0 .../OVM_L1MultiMessageRelayer.json | 0 .../OVM_SafetyChecker.json | 0 .../OVM_StateCommitmentChain.json | 0 .../OVM_StateManagerFactory.json | 0 .../OVM_StateTransitionerFactory.json | 0 .../Proxy__OVM_L1CrossDomainMessenger.json | 0 .../Proxy__OVM_L1ETHGateway.json | 0 .../mockOVM_BondManager.json | 0 .../43ee6bb8ef92595aa6d0e22a6c464dff.json | 0 91 files changed, 1 insertion(+), 18908 deletions(-) delete mode 100644 packages/contracts/deployments/goerli-v1/.chainId delete mode 100644 packages/contracts/deployments/goerli-v1/Lib_AddressManager.json delete mode 100644 packages/contracts/deployments/goerli-v1/OVM_CanonicalTransactionChain.json delete mode 100644 packages/contracts/deployments/goerli-v1/OVM_ChainStorageContainer-CTC-batches.json delete mode 100644 packages/contracts/deployments/goerli-v1/OVM_ChainStorageContainer-CTC-queue.json delete mode 100644 packages/contracts/deployments/goerli-v1/OVM_ChainStorageContainer-SCC-batches.json delete mode 100644 packages/contracts/deployments/goerli-v1/OVM_L1CrossDomainMessenger.json delete mode 100644 packages/contracts/deployments/goerli-v1/OVM_StateCommitmentChain.json delete mode 100644 packages/contracts/deployments/goerli-v1/Proxy__OVM_L1CrossDomainMessenger.json delete mode 100644 packages/contracts/deployments/goerli-v1/mockOVM_BondManager.json delete mode 100644 packages/contracts/deployments/goerli-v1/solcInputs/cebcb515c1a9c570d96e0b8f6fd237e2.json delete mode 100644 packages/contracts/deployments/goerli-v2/.chainId delete mode 100644 packages/contracts/deployments/goerli-v2/Lib_AddressManager.json delete mode 100644 packages/contracts/deployments/goerli-v2/OVM_CanonicalTransactionChain.json delete mode 100644 packages/contracts/deployments/goerli-v2/OVM_ChainStorageContainer-CTC-batches.json delete mode 100644 packages/contracts/deployments/goerli-v2/OVM_ChainStorageContainer-CTC-queue.json delete mode 100644 packages/contracts/deployments/goerli-v2/OVM_ChainStorageContainer-SCC-batches.json delete mode 100644 packages/contracts/deployments/goerli-v2/OVM_ExecutionManager.json delete mode 100644 packages/contracts/deployments/goerli-v2/OVM_FraudVerifier.json delete mode 100644 packages/contracts/deployments/goerli-v2/OVM_L1CrossDomainMessenger.json delete mode 100644 packages/contracts/deployments/goerli-v2/OVM_L1ETHGateway.json delete mode 100644 packages/contracts/deployments/goerli-v2/OVM_L1MultiMessageRelayer.json delete mode 100644 packages/contracts/deployments/goerli-v2/OVM_SafetyChecker.json delete mode 100644 packages/contracts/deployments/goerli-v2/OVM_StateCommitmentChain.json delete mode 100644 packages/contracts/deployments/goerli-v2/OVM_StateManagerFactory.json delete mode 100644 packages/contracts/deployments/goerli-v2/OVM_StateTransitionerFactory.json delete mode 100644 packages/contracts/deployments/goerli-v2/Proxy__OVM_L1CrossDomainMessenger.json delete mode 100644 packages/contracts/deployments/goerli-v2/Proxy__OVM_L1ETHGateway.json delete mode 100644 packages/contracts/deployments/goerli-v2/mockOVM_BondManager.json delete mode 100644 packages/contracts/deployments/goerli-v2/solcInputs/8aef3555d89ad9d3af2f5d28a85dc856.json delete mode 100644 packages/contracts/deployments/kovan-v1/Lib_AddressManager.json delete mode 100644 packages/contracts/deployments/kovan-v1/OVM_CanonicalTransactionChain.json delete mode 100644 packages/contracts/deployments/kovan-v1/OVM_ChainStorageContainer-CTC-batches.json delete mode 100644 packages/contracts/deployments/kovan-v1/OVM_ChainStorageContainer-CTC-queue.json delete mode 100644 packages/contracts/deployments/kovan-v1/OVM_ChainStorageContainer-SCC-batches.json delete mode 100644 packages/contracts/deployments/kovan-v1/OVM_L1CrossDomainMessenger.json delete mode 100644 packages/contracts/deployments/kovan-v1/OVM_StateCommitmentChain.json delete mode 100644 packages/contracts/deployments/kovan-v1/Proxy__OVM_L1CrossDomainMessenger.json delete mode 100644 packages/contracts/deployments/kovan-v1/mockOVM_BondManager.json delete mode 100644 packages/contracts/deployments/kovan-v1/solcInputs/cebcb515c1a9c570d96e0b8f6fd237e2.json delete mode 100644 packages/contracts/deployments/kovan-v2/.chainId rename packages/contracts/deployments/{kovan-v1 => kovan}/.chainId (100%) rename packages/contracts/deployments/{kovan-v2 => kovan}/Lib_AddressManager.json (100%) rename packages/contracts/deployments/{kovan-v2 => kovan}/OVM_CanonicalTransactionChain.json (100%) rename packages/contracts/deployments/{kovan-v2 => kovan}/OVM_ChainStorageContainer-CTC-batches.json (100%) rename packages/contracts/deployments/{kovan-v2 => kovan}/OVM_ChainStorageContainer-CTC-queue.json (100%) rename packages/contracts/deployments/{kovan-v2 => kovan}/OVM_ChainStorageContainer-SCC-batches.json (100%) rename packages/contracts/deployments/{kovan-v2 => kovan}/OVM_ExecutionManager.json (100%) rename packages/contracts/deployments/{kovan-v2 => kovan}/OVM_FraudVerifier.json (100%) rename packages/contracts/deployments/{kovan-v2 => kovan}/OVM_L1CrossDomainMessenger.json (100%) rename packages/contracts/deployments/{kovan-v2 => kovan}/OVM_L1ETHGateway.json (100%) rename packages/contracts/deployments/{kovan-v2 => kovan}/OVM_L1MultiMessageRelayer.json (100%) rename packages/contracts/deployments/{kovan-v2 => kovan}/OVM_SafetyChecker.json (100%) rename packages/contracts/deployments/{kovan-v2 => kovan}/OVM_StateCommitmentChain.json (100%) rename packages/contracts/deployments/{kovan-v2 => kovan}/OVM_StateManagerFactory.json (100%) rename packages/contracts/deployments/{kovan-v2 => kovan}/OVM_StateTransitionerFactory.json (100%) rename packages/contracts/deployments/{kovan-v2 => kovan}/Proxy__OVM_L1CrossDomainMessenger.json (100%) rename packages/contracts/deployments/{kovan-v2 => kovan}/Proxy__OVM_L1ETHGateway.json (100%) rename packages/contracts/deployments/{kovan-v2 => kovan}/mockOVM_BondManager.json (100%) rename packages/contracts/deployments/{kovan-v2 => kovan}/solcInputs/03aed03b958b1d37f90bd88d0f56dd85.json (100%) delete mode 100644 packages/contracts/deployments/mainnet-v1/Lib_AddressManager.json delete mode 100644 packages/contracts/deployments/mainnet-v1/OVM_CanonicalTransactionChain.json delete mode 100644 packages/contracts/deployments/mainnet-v1/OVM_ChainStorageContainer-CTC-batches.json delete mode 100644 packages/contracts/deployments/mainnet-v1/OVM_ChainStorageContainer-CTC-queue.json delete mode 100644 packages/contracts/deployments/mainnet-v1/OVM_ChainStorageContainer-SCC-batches.json delete mode 100644 packages/contracts/deployments/mainnet-v1/OVM_L1CrossDomainMessenger.json delete mode 100644 packages/contracts/deployments/mainnet-v1/OVM_StateCommitmentChain.json delete mode 100644 packages/contracts/deployments/mainnet-v1/Proxy__OVM_L1CrossDomainMessenger.json delete mode 100644 packages/contracts/deployments/mainnet-v1/mockOVM_BondManager.json delete mode 100644 packages/contracts/deployments/mainnet-v1/solcInputs/cebcb515c1a9c570d96e0b8f6fd237e2.json delete mode 100644 packages/contracts/deployments/mainnet-v2/.chainId rename packages/contracts/deployments/{mainnet-v1 => mainnet}/.chainId (100%) rename packages/contracts/deployments/{mainnet-v2 => mainnet}/Lib_AddressManager.json (100%) rename packages/contracts/deployments/{mainnet-v2 => mainnet}/OVM_CanonicalTransactionChain.json (100%) rename packages/contracts/deployments/{mainnet-v2 => mainnet}/OVM_ChainStorageContainer-CTC-batches.json (100%) rename packages/contracts/deployments/{mainnet-v2 => mainnet}/OVM_ChainStorageContainer-CTC-queue.json (100%) rename packages/contracts/deployments/{mainnet-v2 => mainnet}/OVM_ChainStorageContainer-SCC-batches.json (100%) rename packages/contracts/deployments/{mainnet-v2 => mainnet}/OVM_ExecutionManager.json (100%) rename packages/contracts/deployments/{mainnet-v2 => mainnet}/OVM_FraudVerifier.json (100%) rename packages/contracts/deployments/{mainnet-v2 => mainnet}/OVM_L1CrossDomainMessenger.json (100%) rename packages/contracts/deployments/{mainnet-v2 => mainnet}/OVM_L1ETHGateway.json (100%) rename packages/contracts/deployments/{mainnet-v2 => mainnet}/OVM_L1MultiMessageRelayer.json (100%) rename packages/contracts/deployments/{mainnet-v2 => mainnet}/OVM_SafetyChecker.json (100%) rename packages/contracts/deployments/{mainnet-v2 => mainnet}/OVM_StateCommitmentChain.json (100%) rename packages/contracts/deployments/{mainnet-v2 => mainnet}/OVM_StateManagerFactory.json (100%) rename packages/contracts/deployments/{mainnet-v2 => mainnet}/OVM_StateTransitionerFactory.json (100%) rename packages/contracts/deployments/{mainnet-v2 => mainnet}/Proxy__OVM_L1CrossDomainMessenger.json (100%) rename packages/contracts/deployments/{mainnet-v2 => mainnet}/Proxy__OVM_L1ETHGateway.json (100%) rename packages/contracts/deployments/{mainnet-v2 => mainnet}/mockOVM_BondManager.json (100%) rename packages/contracts/deployments/{mainnet-v2 => mainnet}/solcInputs/43ee6bb8ef92595aa6d0e22a6c464dff.json (100%) diff --git a/.gitignore b/.gitignore index 088ff66fe6d4f..18b731ead5fc3 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ +.DS_Store node_modules results temp diff --git a/packages/contracts/deployments/goerli-v1/.chainId b/packages/contracts/deployments/goerli-v1/.chainId deleted file mode 100644 index 7813681f5b41c..0000000000000 --- a/packages/contracts/deployments/goerli-v1/.chainId +++ /dev/null @@ -1 +0,0 @@ -5 \ No newline at end of file diff --git a/packages/contracts/deployments/goerli-v1/Lib_AddressManager.json b/packages/contracts/deployments/goerli-v1/Lib_AddressManager.json deleted file mode 100644 index 3a2efd33a8ee1..0000000000000 --- a/packages/contracts/deployments/goerli-v1/Lib_AddressManager.json +++ /dev/null @@ -1,199 +0,0 @@ -{ - "address": "0x5011A092e66B2c89e2d09dfb9E418B4bCFb24C80", - "abi": [ - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "string", - "name": "_name", - "type": "string" - }, - { - "indexed": false, - "internalType": "address", - "name": "_newAddress", - "type": "address" - } - ], - "name": "AddressSet", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "previousOwner", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "newOwner", - "type": "address" - } - ], - "name": "OwnershipTransferred", - "type": "event" - }, - { - "inputs": [ - { - "internalType": "string", - "name": "_name", - "type": "string" - } - ], - "name": "getAddress", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "owner", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "renounceOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "string", - "name": "_name", - "type": "string" - }, - { - "internalType": "address", - "name": "_address", - "type": "address" - } - ], - "name": "setAddress", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_newOwner", - "type": "address" - } - ], - "name": "transferOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - } - ], - "transactionHash": "0x39342ffdce6e6c76b8fa6534d0e5f24ba0917ed09ab713ad0eef7eee73dd08ed", - "receipt": { - "to": null, - "from": "0x558ba9b8d78713fbf768c1f8a584485B4003f43F", - "contractAddress": "0xE630cdf302880783364334455C8352fE0aB5b748", - "transactionIndex": 3, - "gasUsed": "413938", - "logsBloom": "0x00000000000000000000000000000000000000000000000000800000000000000000000022000000000000000000000000000000000040000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000020000000000000000000800000000000000000000000000000000400040000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000001000000000000000000000000000000000000000000", - "blockHash": "0xf1c7969322d44cb9561c6af6b8499e1ee90e81c5e8e6409417454bf3d8bc598f", - "transactionHash": "0x39342ffdce6e6c76b8fa6534d0e5f24ba0917ed09ab713ad0eef7eee73dd08ed", - "logs": [ - { - "transactionIndex": 3, - "blockNumber": 4573376, - "transactionHash": "0x39342ffdce6e6c76b8fa6534d0e5f24ba0917ed09ab713ad0eef7eee73dd08ed", - "address": "0xE630cdf302880783364334455C8352fE0aB5b748", - "topics": [ - "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x000000000000000000000000558ba9b8d78713fbf768c1f8a584485b4003f43f" - ], - "data": "0x", - "logIndex": 9, - "blockHash": "0xf1c7969322d44cb9561c6af6b8499e1ee90e81c5e8e6409417454bf3d8bc598f" - } - ], - "blockNumber": 4573376, - "cumulativeGasUsed": "3107647", - "status": 1, - "byzantium": true - }, - "args": [], - "solcInputHash": "cebcb515c1a9c570d96e0b8f6fd237e2", - "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_newAddress\",\"type\":\"address\"}],\"name\":\"AddressSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"getAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"_address\",\"type\":\"address\"}],\"name\":\"setAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"title\":\"Lib_AddressManager\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":\"Lib_AddressManager\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// +build ovm\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Contract Imports */\\nimport { Ownable } from \\\"./Lib_Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n /*******************************************\\n * Contract Variables: Internal Accounting *\\n *******************************************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n public\\n onlyOwner\\n {\\n emit AddressSet(_name, _address);\\n addresses[_getNameHash(_name)] = _address;\\n }\\n\\n function getAddress(\\n string memory _name\\n )\\n public\\n view\\n returns (address)\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32 _hash\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xdf802e1cc6474df913626991e9fca3835c620a519f397afe04bf9c260e723257\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// +build ovm\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Ownable\\n * @dev Adapted from https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol\\n */\\nabstract contract Ownable {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n address public owner;\\n\\n\\n /**********\\n * Events *\\n **********/\\n\\n event OwnershipTransferred(\\n address indexed previousOwner,\\n address indexed newOwner\\n );\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n constructor() internal {\\n owner = msg.sender;\\n emit OwnershipTransferred(address(0), owner);\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n owner == msg.sender,\\n \\\"Ownable: caller is not the owner\\\"\\n );\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function renounceOwnership()\\n public\\n virtual\\n onlyOwner\\n {\\n emit OwnershipTransferred(owner, address(0));\\n owner = address(0);\\n }\\n\\n function transferOwnership(address _newOwner)\\n public\\n virtual\\n onlyOwner\\n {\\n require(\\n _newOwner != address(0),\\n \\\"Ownable: new owner cannot be the zero address\\\"\\n );\\n\\n emit OwnershipTransferred(owner, _newOwner);\\n owner = _newOwner;\\n }\\n}\\n\",\"keccak256\":\"0xe0409fbd236d16ca6be439d9d97dd36d0d9a0697ee0062d49588b9d29c248e47\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x608060405234801561001057600080fd5b50600080546001600160a01b03191633178082556040516001600160a01b039190911691907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3610614806100696000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c8063715018a61461005c5780638da5cb5b146100665780639b2ea4bd1461008a578063bf40fac11461013b578063f2fde38b146101e1575b600080fd5b610064610207565b005b61006e6102b0565b604080516001600160a01b039092168252519081900360200190f35b610064600480360360408110156100a057600080fd5b8101906020810181356401000000008111156100bb57600080fd5b8201836020820111156100cd57600080fd5b803590602001918460018302840111640100000000831117156100ef57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550505090356001600160a01b031691506102bf9050565b61006e6004803603602081101561015157600080fd5b81019060208101813564010000000081111561016c57600080fd5b82018360208201111561017e57600080fd5b803590602001918460018302840111640100000000831117156101a057600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061040c945050505050565b610064600480360360208110156101f757600080fd5b50356001600160a01b031661043b565b6000546001600160a01b03163314610266576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b031681565b6000546001600160a01b0316331461031e576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b7f188466739ff00cc68bfb2367d23ae4b855264264fe1624caa8884399af23454c82826040518080602001836001600160a01b03168152602001828103825284818151815260200191508051906020019080838360005b8381101561038d578181015183820152602001610375565b50505050905090810190601f1680156103ba5780820380516001836020036101000a031916815260200191505b50935050505060405180910390a180600160006103d68561053a565b815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b031602179055505050565b60006001600061041b8461053a565b81526020810191909152604001600020546001600160a01b031692915050565b6000546001600160a01b0316331461049a576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b0381166104df5760405162461bcd60e51b815260040180806020018281038252602d8152602001806105b2602d913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000816040516020018082805190602001908083835b6020831061056f5780518252601f199092019160209182019101610550565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120905091905056fe4f776e61626c653a206e6577206f776e65722063616e6e6f7420626520746865207a65726f2061646472657373a2646970667358221220304b86da0b56c0241601472f57374abec2a11900a97043845283952624e4512364736f6c63430007060033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100575760003560e01c8063715018a61461005c5780638da5cb5b146100665780639b2ea4bd1461008a578063bf40fac11461013b578063f2fde38b146101e1575b600080fd5b610064610207565b005b61006e6102b0565b604080516001600160a01b039092168252519081900360200190f35b610064600480360360408110156100a057600080fd5b8101906020810181356401000000008111156100bb57600080fd5b8201836020820111156100cd57600080fd5b803590602001918460018302840111640100000000831117156100ef57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550505090356001600160a01b031691506102bf9050565b61006e6004803603602081101561015157600080fd5b81019060208101813564010000000081111561016c57600080fd5b82018360208201111561017e57600080fd5b803590602001918460018302840111640100000000831117156101a057600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061040c945050505050565b610064600480360360208110156101f757600080fd5b50356001600160a01b031661043b565b6000546001600160a01b03163314610266576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b031681565b6000546001600160a01b0316331461031e576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b7f188466739ff00cc68bfb2367d23ae4b855264264fe1624caa8884399af23454c82826040518080602001836001600160a01b03168152602001828103825284818151815260200191508051906020019080838360005b8381101561038d578181015183820152602001610375565b50505050905090810190601f1680156103ba5780820380516001836020036101000a031916815260200191505b50935050505060405180910390a180600160006103d68561053a565b815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b031602179055505050565b60006001600061041b8461053a565b81526020810191909152604001600020546001600160a01b031692915050565b6000546001600160a01b0316331461049a576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b0381166104df5760405162461bcd60e51b815260040180806020018281038252602d8152602001806105b2602d913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000816040516020018082805190602001908083835b6020831061056f5780518252601f199092019160209182019101610550565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120905091905056fe4f776e61626c653a206e6577206f776e65722063616e6e6f7420626520746865207a65726f2061646472657373a2646970667358221220304b86da0b56c0241601472f57374abec2a11900a97043845283952624e4512364736f6c63430007060033", - "devdoc": { - "kind": "dev", - "methods": {}, - "title": "Lib_AddressManager", - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": {}, - "version": 1 - }, - "storageLayout": { - "storage": [ - { - "astId": 11739, - "contract": "contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol:Lib_AddressManager", - "label": "owner", - "offset": 0, - "slot": "0", - "type": "t_address" - }, - { - "astId": 11647, - "contract": "contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol:Lib_AddressManager", - "label": "addresses", - "offset": 0, - "slot": "1", - "type": "t_mapping(t_bytes32,t_address)" - } - ], - "types": { - "t_address": { - "encoding": "inplace", - "label": "address", - "numberOfBytes": "20" - }, - "t_bytes32": { - "encoding": "inplace", - "label": "bytes32", - "numberOfBytes": "32" - }, - "t_mapping(t_bytes32,t_address)": { - "encoding": "mapping", - "key": "t_bytes32", - "label": "mapping(bytes32 => address)", - "numberOfBytes": "32", - "value": "t_address" - } - } - } -} \ No newline at end of file diff --git a/packages/contracts/deployments/goerli-v1/OVM_CanonicalTransactionChain.json b/packages/contracts/deployments/goerli-v1/OVM_CanonicalTransactionChain.json deleted file mode 100644 index c40e8ea7e46c1..0000000000000 --- a/packages/contracts/deployments/goerli-v1/OVM_CanonicalTransactionChain.json +++ /dev/null @@ -1,757 +0,0 @@ -{ - "address": "0x8468e3B58Cc7B34ab07ca5b80CB234e271435120", - "abi": [ - { - "inputs": [ - { - "internalType": "address", - "name": "_libAddressManager", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_forceInclusionPeriodSeconds", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_forceInclusionPeriodBlocks", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_maxTransactionGasLimit", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint256", - "name": "_startingQueueIndex", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_numQueueElements", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_totalElements", - "type": "uint256" - } - ], - "name": "QueueBatchAppended", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint256", - "name": "_startingQueueIndex", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_numQueueElements", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_totalElements", - "type": "uint256" - } - ], - "name": "SequencerBatchAppended", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "_batchIndex", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "bytes32", - "name": "_batchRoot", - "type": "bytes32" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_batchSize", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_prevTotalElements", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "bytes", - "name": "_extraData", - "type": "bytes" - } - ], - "name": "TransactionBatchAppended", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "address", - "name": "_l1TxOrigin", - "type": "address" - }, - { - "indexed": false, - "internalType": "address", - "name": "_target", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_gasLimit", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "bytes", - "name": "_data", - "type": "bytes" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_queueIndex", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_timestamp", - "type": "uint256" - } - ], - "name": "TransactionEnqueued", - "type": "event" - }, - { - "inputs": [], - "name": "L2_GAS_DISCOUNT_DIVISOR", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "MAX_ROLLUP_TX_SIZE", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "MIN_ROLLUP_TX_GAS", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_numQueuedTransactions", - "type": "uint256" - } - ], - "name": "appendQueueBatch", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "appendSequencerBatch", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "batches", - "outputs": [ - { - "internalType": "contract iOVM_ChainStorageContainer", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_target", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_gasLimit", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "_data", - "type": "bytes" - } - ], - "name": "enqueue", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "forceInclusionPeriodBlocks", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "forceInclusionPeriodSeconds", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getNextQueueIndex", - "outputs": [ - { - "internalType": "uint40", - "name": "", - "type": "uint40" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getNumPendingQueueElements", - "outputs": [ - { - "internalType": "uint40", - "name": "", - "type": "uint40" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_index", - "type": "uint256" - } - ], - "name": "getQueueElement", - "outputs": [ - { - "components": [ - { - "internalType": "bytes32", - "name": "queueRoot", - "type": "bytes32" - }, - { - "internalType": "uint40", - "name": "timestamp", - "type": "uint40" - }, - { - "internalType": "uint40", - "name": "blockNumber", - "type": "uint40" - } - ], - "internalType": "struct Lib_OVMCodec.QueueElement", - "name": "_element", - "type": "tuple" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getQueueLength", - "outputs": [ - { - "internalType": "uint40", - "name": "", - "type": "uint40" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getTotalBatches", - "outputs": [ - { - "internalType": "uint256", - "name": "_totalBatches", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getTotalElements", - "outputs": [ - { - "internalType": "uint256", - "name": "_totalElements", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "maxTransactionGasLimit", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "queue", - "outputs": [ - { - "internalType": "contract iOVM_ChainStorageContainer", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "string", - "name": "_name", - "type": "string" - } - ], - "name": "resolve", - "outputs": [ - { - "internalType": "address", - "name": "_contract", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "components": [ - { - "internalType": "uint256", - "name": "timestamp", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "blockNumber", - "type": "uint256" - }, - { - "internalType": "enum Lib_OVMCodec.QueueOrigin", - "name": "l1QueueOrigin", - "type": "uint8" - }, - { - "internalType": "address", - "name": "l1TxOrigin", - "type": "address" - }, - { - "internalType": "address", - "name": "entrypoint", - "type": "address" - }, - { - "internalType": "uint256", - "name": "gasLimit", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "data", - "type": "bytes" - } - ], - "internalType": "struct Lib_OVMCodec.Transaction", - "name": "_transaction", - "type": "tuple" - }, - { - "components": [ - { - "internalType": "bool", - "name": "isSequenced", - "type": "bool" - }, - { - "internalType": "uint256", - "name": "queueIndex", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "timestamp", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "blockNumber", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "txData", - "type": "bytes" - } - ], - "internalType": "struct Lib_OVMCodec.TransactionChainElement", - "name": "_txChainElement", - "type": "tuple" - }, - { - "components": [ - { - "internalType": "uint256", - "name": "batchIndex", - "type": "uint256" - }, - { - "internalType": "bytes32", - "name": "batchRoot", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "batchSize", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "prevTotalElements", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "extraData", - "type": "bytes" - } - ], - "internalType": "struct Lib_OVMCodec.ChainBatchHeader", - "name": "_batchHeader", - "type": "tuple" - }, - { - "components": [ - { - "internalType": "uint256", - "name": "index", - "type": "uint256" - }, - { - "internalType": "bytes32[]", - "name": "siblings", - "type": "bytes32[]" - } - ], - "internalType": "struct Lib_OVMCodec.ChainInclusionProof", - "name": "_inclusionProof", - "type": "tuple" - } - ], - "name": "verifyTransaction", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - } - ], - "transactionHash": "0x46e0f66d5260cc1973f9cf40fa80ed213c1f7d58420d3560b47ff81b28902d4d", - "receipt": { - "to": null, - "from": "0x558ba9b8d78713fbf768c1f8a584485B4003f43F", - "contractAddress": "0xdFB7CdEfFdb717A2117E1577c187b8a8e25C5bEb", - "transactionIndex": 7, - "gasUsed": "2849481", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0xcbbf409c3afd072ebf97e09b1de817fa0641492dac602a0f6ad586fba93162d8", - "transactionHash": "0x46e0f66d5260cc1973f9cf40fa80ed213c1f7d58420d3560b47ff81b28902d4d", - "logs": [], - "blockNumber": 4573384, - "cumulativeGasUsed": "3318562", - "status": 1, - "byzantium": true - }, - "args": [ - "0xE630cdf302880783364334455C8352fE0aB5b748", - 2592000, - 172800, - 9000000 - ], - "solcInputHash": "cebcb515c1a9c570d96e0b8f6fd237e2", - "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_forceInclusionPeriodSeconds\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_forceInclusionPeriodBlocks\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_maxTransactionGasLimit\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_startingQueueIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_numQueueElements\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_totalElements\",\"type\":\"uint256\"}],\"name\":\"QueueBatchAppended\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_startingQueueIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_numQueueElements\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_totalElements\",\"type\":\"uint256\"}],\"name\":\"SequencerBatchAppended\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_batchIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"_batchRoot\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_batchSize\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_prevTotalElements\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"_extraData\",\"type\":\"bytes\"}],\"name\":\"TransactionBatchAppended\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_l1TxOrigin\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_queueIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_timestamp\",\"type\":\"uint256\"}],\"name\":\"TransactionEnqueued\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"L2_GAS_DISCOUNT_DIVISOR\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAX_ROLLUP_TX_SIZE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MIN_ROLLUP_TX_GAS\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_numQueuedTransactions\",\"type\":\"uint256\"}],\"name\":\"appendQueueBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"appendSequencerBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"batches\",\"outputs\":[{\"internalType\":\"contract iOVM_ChainStorageContainer\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"enqueue\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"forceInclusionPeriodBlocks\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"forceInclusionPeriodSeconds\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getNextQueueIndex\",\"outputs\":[{\"internalType\":\"uint40\",\"name\":\"\",\"type\":\"uint40\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getNumPendingQueueElements\",\"outputs\":[{\"internalType\":\"uint40\",\"name\":\"\",\"type\":\"uint40\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"getQueueElement\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"queueRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint40\",\"name\":\"timestamp\",\"type\":\"uint40\"},{\"internalType\":\"uint40\",\"name\":\"blockNumber\",\"type\":\"uint40\"}],\"internalType\":\"struct Lib_OVMCodec.QueueElement\",\"name\":\"_element\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getQueueLength\",\"outputs\":[{\"internalType\":\"uint40\",\"name\":\"\",\"type\":\"uint40\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTotalBatches\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_totalBatches\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTotalElements\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_totalElements\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maxTransactionGasLimit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"queue\",\"outputs\":[{\"internalType\":\"contract iOVM_ChainStorageContainer\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"_contract\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"enum Lib_OVMCodec.QueueOrigin\",\"name\":\"l1QueueOrigin\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"l1TxOrigin\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"entrypoint\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.Transaction\",\"name\":\"_transaction\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isSequenced\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"queueIndex\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"txData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.TransactionChainElement\",\"name\":\"_txChainElement\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"_batchHeader\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"siblings\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct Lib_OVMCodec.ChainInclusionProof\",\"name\":\"_inclusionProof\",\"type\":\"tuple\"}],\"name\":\"verifyTransaction\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"appendQueueBatch(uint256)\":{\"params\":{\"_numQueuedTransactions\":\"Number of transactions to append.\"}},\"appendSequencerBatch()\":{\"details\":\"This function uses a custom encoding scheme for efficiency reasons. .param _shouldStartAtElement Specific batch we expect to start appending to. .param _totalElementsToAppend Total number of batch elements we expect to append. .param _contexts Array of batch contexts. .param _transactionDataFields Array of raw transaction data.\"},\"batches()\":{\"returns\":{\"_0\":\"Reference to the batch storage container.\"}},\"enqueue(address,uint256,bytes)\":{\"params\":{\"_data\":\"Transaction data.\",\"_gasLimit\":\"Gas limit for the given transaction.\",\"_target\":\"Target contract to send the transaction to.\"}},\"getNextQueueIndex()\":{\"returns\":{\"_0\":\"Index for the next queue element.\"}},\"getNumPendingQueueElements()\":{\"returns\":{\"_0\":\"Length of the queue.\"}},\"getQueueElement(uint256)\":{\"params\":{\"_index\":\"Index of the queue element to access.\"},\"returns\":{\"_element\":\"Queue element at the given index.\"}},\"getQueueLength()\":{\"returns\":{\"_0\":\"Length of the queue.\"}},\"getTotalBatches()\":{\"returns\":{\"_totalBatches\":\"Total submitted batches.\"}},\"getTotalElements()\":{\"returns\":{\"_totalElements\":\"Total submitted elements.\"}},\"queue()\":{\"returns\":{\"_0\":\"Reference to the queue storage container.\"}},\"verifyTransaction((uint256,uint256,uint8,address,address,uint256,bytes),(bool,uint256,uint256,uint256,bytes),(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))\":{\"params\":{\"_batchHeader\":\"Header of the batch the transaction was included in.\",\"_inclusionProof\":\"Inclusion proof for the provided transaction chain element.\",\"_transaction\":\"Transaction to verify.\",\"_txChainElement\":\"Transaction chain element corresponding to the transaction.\"},\"returns\":{\"_0\":\"True if the transaction exists in the CTC, false if not.\"}}},\"title\":\"OVM_CanonicalTransactionChain\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"appendQueueBatch(uint256)\":{\"notice\":\"Appends a given number of queued transactions as a single batch.\"},\"appendSequencerBatch()\":{\"notice\":\"Allows the sequencer to append a batch of transactions.\"},\"batches()\":{\"notice\":\"Accesses the batch storage container.\"},\"enqueue(address,uint256,bytes)\":{\"notice\":\"Adds a transaction to the queue.\"},\"getNextQueueIndex()\":{\"notice\":\"Returns the index of the next element to be enqueued.\"},\"getNumPendingQueueElements()\":{\"notice\":\"Get the number of queue elements which have not yet been included.\"},\"getQueueElement(uint256)\":{\"notice\":\"Gets the queue element at a particular index.\"},\"getQueueLength()\":{\"notice\":\"Retrieves the length of the queue, including both pending and canonical transactions.\"},\"getTotalBatches()\":{\"notice\":\"Retrieves the total number of batches submitted.\"},\"getTotalElements()\":{\"notice\":\"Retrieves the total number of elements submitted.\"},\"queue()\":{\"notice\":\"Accesses the queue storage container.\"},\"verifyTransaction((uint256,uint256,uint8,address,address,uint256,bytes),(bool,uint256,uint256,uint256,bytes),(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))\":{\"notice\":\"Verifies whether a transaction is included in the chain.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/OVM/chain/OVM_CanonicalTransactionChain.sol\":\"OVM_CanonicalTransactionChain\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/optimistic-ethereum/OVM/accounts/OVM_ECDSAContractAccount.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.7.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Interface Imports */\\nimport { iOVM_ECDSAContractAccount } from \\\"../../iOVM/accounts/iOVM_ECDSAContractAccount.sol\\\";\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { Lib_ECDSAUtils } from \\\"../../libraries/utils/Lib_ECDSAUtils.sol\\\";\\nimport { Lib_SafeExecutionManagerWrapper } from \\\"../../libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\\\";\\nimport { Lib_SafeMathWrapper } from \\\"../../libraries/wrappers/Lib_SafeMathWrapper.sol\\\";\\n\\n/**\\n * @title OVM_ECDSAContractAccount\\n */\\ncontract OVM_ECDSAContractAccount is iOVM_ECDSAContractAccount {\\n\\n address constant ETH_ERC20_ADDRESS = 0x4200000000000000000000000000000000000006;\\n uint256 constant EXECUTION_VALIDATION_GAS_OVERHEAD = 25000; // TODO: should be the amount sufficient to cover the gas costs of all of the transactions up to and including the CALL/CREATE which forms the entrypoint of the transaction.\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Executes a signed transaction.\\n * @param _transaction Signed EOA transaction.\\n * @param _signatureType Hashing scheme used for the transaction (e.g., ETH signed message).\\n * @param _v Signature `v` parameter.\\n * @param _r Signature `r` parameter.\\n * @param _s Signature `s` parameter.\\n * @return _success Whether or not the call returned (rather than reverted).\\n * @return _returndata Data returned by the call.\\n */\\n function execute(\\n bytes memory _transaction,\\n Lib_OVMCodec.EOASignatureType _signatureType,\\n uint8 _v,\\n bytes32 _r,\\n bytes32 _s\\n )\\n override\\n public\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n bool isEthSign = _signatureType == Lib_OVMCodec.EOASignatureType.ETH_SIGNED_MESSAGE;\\n\\n // Address of this contract within the ovm (ovmADDRESS) should be the same as the\\n // recovered address of the user who signed this message. This is how we manage to shim\\n // account abstraction even though the user isn't a contract.\\n // Need to make sure that the transaction nonce is right and bump it if so.\\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(\\n Lib_ECDSAUtils.recover(\\n _transaction,\\n isEthSign,\\n _v,\\n _r,\\n _s\\n ) == Lib_SafeExecutionManagerWrapper.safeADDRESS(),\\n \\\"Signature provided for EOA transaction execution is invalid.\\\"\\n );\\n\\n Lib_OVMCodec.EIP155Transaction memory decodedTx = Lib_OVMCodec.decodeEIP155Transaction(_transaction, isEthSign);\\n\\n // Need to make sure that the transaction chainId is correct.\\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(\\n decodedTx.chainId == Lib_SafeExecutionManagerWrapper.safeCHAINID(),\\n \\\"Transaction chainId does not match expected OVM chainId.\\\"\\n );\\n\\n // Need to make sure that the transaction nonce is right.\\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(\\n decodedTx.nonce == Lib_SafeExecutionManagerWrapper.safeGETNONCE(),\\n \\\"Transaction nonce does not match the expected nonce.\\\"\\n );\\n\\n // TEMPORARY: Disable gas checks for minnet.\\n // // Need to make sure that the gas is sufficient to execute the transaction.\\n // Lib_SafeExecutionManagerWrapper.safeREQUIRE(\\n // gasleft() >= Lib_SafeMathWrapper.add(decodedTx.gasLimit, EXECUTION_VALIDATION_GAS_OVERHEAD),\\n // \\\"Gas is not sufficient to execute the transaction.\\\"\\n // );\\n\\n // Transfer fee to relayer.\\n address relayer = Lib_SafeExecutionManagerWrapper.safeCALLER();\\n uint256 fee = decodedTx.gasLimit * decodedTx.gasPrice;\\n (bool success, ) = Lib_SafeExecutionManagerWrapper.safeCALL(\\n gasleft(),\\n ETH_ERC20_ADDRESS,\\n abi.encodeWithSignature(\\\"transfer(address,uint256)\\\", relayer, fee)\\n );\\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(\\n success == true,\\n \\\"Fee was not transferred to relayer.\\\"\\n );\\n\\n // Contract creations are signalled by sending a transaction to the zero address.\\n if (decodedTx.to == address(0)) {\\n address created = Lib_SafeExecutionManagerWrapper.safeCREATE(\\n decodedTx.gasLimit,\\n decodedTx.data\\n );\\n\\n // EVM doesn't tell us whether a contract creation failed, even if it reverted during\\n // initialization. Always return `true` for our success value here.\\n return (true, abi.encode(created));\\n } else {\\n // We only want to bump the nonce for `ovmCALL` because `ovmCREATE` automatically bumps\\n // the nonce of the calling account. Normally an EOA would bump the nonce for both\\n // cases, but since this is a contract we'd end up bumping the nonce twice.\\n Lib_SafeExecutionManagerWrapper.safeSETNONCE(decodedTx.nonce + 1);\\n\\n return Lib_SafeExecutionManagerWrapper.safeCALL(\\n decodedTx.gasLimit,\\n decodedTx.to,\\n decodedTx.data\\n );\\n }\\n }\\n}\\n\",\"keccak256\":\"0x4cc167723233d14207aafc252b53f6abc8b788eac8e71abca6f1b0f257610dbd\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/accounts/OVM_ProxyEOA.sol\":{\"content\":\"pragma solidity ^0.7.0;\\n\\n/* Library Imports */\\nimport { Lib_BytesUtils } from \\\"../../libraries/utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { Lib_ECDSAUtils } from \\\"../../libraries/utils/Lib_ECDSAUtils.sol\\\";\\nimport { Lib_SafeExecutionManagerWrapper } from \\\"../../libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\\\";\\n\\n/**\\n * @title OVM_ProxyEOA\\n */\\ncontract OVM_ProxyEOA {\\n\\n bytes32 constant IMPLEMENTATION_KEY = 0xdeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddead;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n constructor(\\n address _implementation\\n ) {\\n _setImplementation(_implementation);\\n }\\n\\n\\n /*********************\\n * Fallback Function *\\n *********************/\\n\\n fallback()\\n external\\n {\\n (bool success, bytes memory returndata) = Lib_SafeExecutionManagerWrapper.safeDELEGATECALL(\\n gasleft(),\\n getImplementation(),\\n msg.data\\n );\\n\\n if (success) {\\n assembly {\\n return(add(returndata, 0x20), mload(returndata))\\n }\\n } else {\\n Lib_SafeExecutionManagerWrapper.safeREVERT(\\n string(returndata)\\n );\\n }\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function upgrade(\\n address _implementation\\n )\\n external\\n {\\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(\\n Lib_SafeExecutionManagerWrapper.safeADDRESS() == Lib_SafeExecutionManagerWrapper.safeCALLER(),\\n \\\"EOAs can only upgrade their own EOA implementation\\\"\\n );\\n\\n _setImplementation(_implementation);\\n }\\n\\n function getImplementation()\\n public\\n returns (\\n address _implementation\\n )\\n {\\n return address(uint160(uint256(\\n Lib_SafeExecutionManagerWrapper.safeSLOAD(\\n IMPLEMENTATION_KEY\\n )\\n )));\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function _setImplementation(\\n address _implementation\\n )\\n internal\\n {\\n Lib_SafeExecutionManagerWrapper.safeSSTORE(\\n IMPLEMENTATION_KEY,\\n bytes32(uint256(uint160(_implementation)))\\n );\\n }\\n}\",\"keccak256\":\"0x693349aff60b7b27db5a4625081bf64507ec4788c522f34bcee503b0325cd41f\"},\"contracts/optimistic-ethereum/OVM/chain/OVM_CanonicalTransactionChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.7.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\nimport { Lib_MerkleTree } from \\\"../../libraries/utils/Lib_MerkleTree.sol\\\";\\nimport { Lib_Math } from \\\"../../libraries/utils/Lib_Math.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_CanonicalTransactionChain } from \\\"../../iOVM/chain/iOVM_CanonicalTransactionChain.sol\\\";\\nimport { iOVM_ChainStorageContainer } from \\\"../../iOVM/chain/iOVM_ChainStorageContainer.sol\\\";\\n\\n/* Contract Imports */\\nimport { OVM_ExecutionManager } from \\\"../execution/OVM_ExecutionManager.sol\\\";\\n\\n\\n/**\\n * @title OVM_CanonicalTransactionChain\\n */\\ncontract OVM_CanonicalTransactionChain is iOVM_CanonicalTransactionChain, Lib_AddressResolver {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n // L2 tx gas-related\\n uint256 constant public MIN_ROLLUP_TX_GAS = 100000;\\n uint256 constant public MAX_ROLLUP_TX_SIZE = 10000;\\n uint256 constant public L2_GAS_DISCOUNT_DIVISOR = 32;\\n\\n // Encoding-related (all in bytes)\\n uint256 constant internal BATCH_CONTEXT_SIZE = 16;\\n uint256 constant internal BATCH_CONTEXT_LENGTH_POS = 12;\\n uint256 constant internal BATCH_CONTEXT_START_POS = 15;\\n uint256 constant internal TX_DATA_HEADER_SIZE = 3;\\n uint256 constant internal BYTES_TILL_TX_DATA = 65;\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n uint256 public forceInclusionPeriodSeconds;\\n uint256 public forceInclusionPeriodBlocks;\\n uint256 public maxTransactionGasLimit;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n constructor(\\n address _libAddressManager,\\n uint256 _forceInclusionPeriodSeconds,\\n uint256 _forceInclusionPeriodBlocks,\\n uint256 _maxTransactionGasLimit\\n )\\n Lib_AddressResolver(_libAddressManager)\\n {\\n forceInclusionPeriodSeconds = _forceInclusionPeriodSeconds;\\n forceInclusionPeriodBlocks = _forceInclusionPeriodBlocks;\\n maxTransactionGasLimit = _maxTransactionGasLimit;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Accesses the batch storage container.\\n * @return Reference to the batch storage container.\\n */\\n function batches()\\n public\\n view\\n returns (\\n iOVM_ChainStorageContainer\\n )\\n {\\n return iOVM_ChainStorageContainer(\\n resolve(\\\"OVM_ChainStorageContainer:CTC:batches\\\")\\n );\\n }\\n\\n /**\\n * Accesses the queue storage container.\\n * @return Reference to the queue storage container.\\n */\\n function queue()\\n public\\n view\\n returns (\\n iOVM_ChainStorageContainer\\n )\\n {\\n return iOVM_ChainStorageContainer(\\n resolve(\\\"OVM_ChainStorageContainer:CTC:queue\\\")\\n );\\n }\\n\\n /**\\n * @inheritdoc iOVM_CanonicalTransactionChain\\n */\\n function getTotalElements()\\n override\\n public\\n view\\n returns (\\n uint256 _totalElements\\n )\\n {\\n (uint40 totalElements,,,) = _getBatchExtraData();\\n return uint256(totalElements);\\n }\\n\\n /**\\n * @inheritdoc iOVM_CanonicalTransactionChain\\n */\\n function getTotalBatches()\\n override\\n public\\n view\\n returns (\\n uint256 _totalBatches\\n )\\n {\\n return batches().length();\\n }\\n\\n /**\\n * @inheritdoc iOVM_CanonicalTransactionChain\\n */\\n function getNextQueueIndex()\\n override\\n public\\n view\\n returns (\\n uint40\\n )\\n {\\n (, uint40 nextQueueIndex,,) = _getBatchExtraData();\\n return nextQueueIndex;\\n }\\n\\n /**\\n * @inheritdoc iOVM_CanonicalTransactionChain\\n */\\n function getQueueElement(\\n uint256 _index\\n )\\n override\\n public\\n view\\n returns (\\n Lib_OVMCodec.QueueElement memory _element\\n )\\n {\\n uint40 trueIndex = uint40(_index * 2);\\n bytes32 queueRoot = queue().get(trueIndex);\\n bytes32 timestampAndBlockNumber = queue().get(trueIndex + 1);\\n\\n uint40 elementTimestamp;\\n uint40 elementBlockNumber;\\n assembly {\\n elementTimestamp := and(timestampAndBlockNumber, 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF)\\n elementBlockNumber := shr(40, and(timestampAndBlockNumber, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000))\\n }\\n\\n return Lib_OVMCodec.QueueElement({\\n queueRoot: queueRoot,\\n timestamp: elementTimestamp,\\n blockNumber: elementBlockNumber\\n });\\n }\\n\\n /**\\n * @inheritdoc iOVM_CanonicalTransactionChain\\n */\\n function getNumPendingQueueElements()\\n override\\n public\\n view\\n returns (\\n uint40\\n )\\n {\\n return getQueueLength() - getNextQueueIndex();\\n }\\n\\n /**\\n * @inheritdoc iOVM_CanonicalTransactionChain\\n */\\n function getQueueLength()\\n override\\n public\\n view\\n returns (\\n uint40\\n )\\n {\\n // The underlying queue data structure stores 2 elements\\n // per insertion, so to get the real queue length we need\\n // to divide by 2. See the usage of `push2(..)`.\\n return uint40(queue().length() / 2);\\n }\\n\\n /**\\n * @inheritdoc iOVM_CanonicalTransactionChain\\n */\\n function enqueue(\\n address _target,\\n uint256 _gasLimit,\\n bytes memory _data\\n )\\n override\\n public\\n {\\n require(\\n _data.length <= MAX_ROLLUP_TX_SIZE,\\n \\\"Transaction data size exceeds maximum for rollup transaction.\\\"\\n );\\n\\n require(\\n _gasLimit <= maxTransactionGasLimit,\\n \\\"Transaction gas limit exceeds maximum for rollup transaction.\\\"\\n );\\n\\n require(\\n _gasLimit >= MIN_ROLLUP_TX_GAS,\\n \\\"Transaction gas limit too low to enqueue.\\\"\\n );\\n\\n // We need to consume some amount of L1 gas in order to rate limit transactions going into\\n // L2. However, L2 is cheaper than L1 so we only need to burn some small proportion of the\\n // provided L1 gas.\\n uint256 gasToConsume = _gasLimit/L2_GAS_DISCOUNT_DIVISOR;\\n uint256 startingGas = gasleft();\\n\\n // Although this check is not necessary (burn below will run out of gas if not true), it\\n // gives the user an explicit reason as to why the enqueue attempt failed.\\n require(\\n startingGas > gasToConsume,\\n \\\"Insufficient gas for L2 rate limiting burn.\\\"\\n );\\n\\n // Here we do some \\\"dumb\\\" work in order to burn gas, although we should probably replace\\n // this with something like minting gas token later on.\\n uint256 i;\\n while(startingGas - gasleft() < gasToConsume) {\\n i++;\\n }\\n\\n bytes32 transactionHash = keccak256(\\n abi.encode(\\n msg.sender,\\n _target,\\n _gasLimit,\\n _data\\n )\\n );\\n\\n bytes32 timestampAndBlockNumber;\\n assembly {\\n timestampAndBlockNumber := timestamp()\\n timestampAndBlockNumber := or(timestampAndBlockNumber, shl(40, number()))\\n }\\n\\n queue().push2(\\n transactionHash,\\n timestampAndBlockNumber\\n );\\n\\n uint256 queueIndex = queue().length() / 2;\\n emit TransactionEnqueued(\\n msg.sender,\\n _target,\\n _gasLimit,\\n _data,\\n queueIndex - 1,\\n block.timestamp\\n );\\n }\\n\\n /**\\n * @inheritdoc iOVM_CanonicalTransactionChain\\n */\\n function appendQueueBatch(\\n uint256 _numQueuedTransactions\\n )\\n override\\n public\\n {\\n // Disable `appendQueueBatch` for minnet\\n revert(\\\"appendQueueBatch is currently disabled.\\\");\\n\\n _numQueuedTransactions = Lib_Math.min(_numQueuedTransactions, getNumPendingQueueElements());\\n require(\\n _numQueuedTransactions > 0,\\n \\\"Must append more than zero transactions.\\\"\\n );\\n\\n bytes32[] memory leaves = new bytes32[](_numQueuedTransactions);\\n uint40 nextQueueIndex = getNextQueueIndex();\\n\\n for (uint256 i = 0; i < _numQueuedTransactions; i++) {\\n if (msg.sender != resolve(\\\"OVM_Sequencer\\\")) {\\n Lib_OVMCodec.QueueElement memory el = getQueueElement(nextQueueIndex);\\n require(\\n el.timestamp + forceInclusionPeriodSeconds < block.timestamp,\\n \\\"Queue transactions cannot be submitted during the sequencer inclusion period.\\\"\\n );\\n }\\n leaves[i] = _getQueueLeafHash(nextQueueIndex);\\n nextQueueIndex++;\\n }\\n\\n Lib_OVMCodec.QueueElement memory lastElement = getQueueElement(nextQueueIndex - 1);\\n\\n _appendBatch(\\n Lib_MerkleTree.getMerkleRoot(leaves),\\n _numQueuedTransactions,\\n _numQueuedTransactions,\\n lastElement.timestamp,\\n lastElement.blockNumber\\n );\\n\\n emit QueueBatchAppended(\\n nextQueueIndex - _numQueuedTransactions,\\n _numQueuedTransactions,\\n getTotalElements()\\n );\\n }\\n\\n /**\\n * @inheritdoc iOVM_CanonicalTransactionChain\\n */\\n function appendSequencerBatch()\\n override\\n public\\n {\\n uint40 shouldStartAtElement;\\n uint24 totalElementsToAppend;\\n uint24 numContexts;\\n assembly {\\n shouldStartAtElement := shr(216, calldataload(4))\\n totalElementsToAppend := shr(232, calldataload(9))\\n numContexts := shr(232, calldataload(12))\\n }\\n\\n require(\\n shouldStartAtElement == getTotalElements(),\\n \\\"Actual batch start index does not match expected start index.\\\"\\n );\\n\\n require(\\n msg.sender == resolve(\\\"OVM_Sequencer\\\"),\\n \\\"Function can only be called by the Sequencer.\\\"\\n );\\n\\n require(\\n numContexts > 0,\\n \\\"Must provide at least one batch context.\\\"\\n );\\n\\n require(\\n totalElementsToAppend > 0,\\n \\\"Must append at least one element.\\\"\\n );\\n\\n uint40 nextTransactionPtr = uint40(BATCH_CONTEXT_START_POS + BATCH_CONTEXT_SIZE * numContexts);\\n uint256 calldataSize;\\n assembly {\\n calldataSize := calldatasize()\\n }\\n\\n require(\\n calldataSize >= nextTransactionPtr,\\n \\\"Not enough BatchContexts provided.\\\"\\n );\\n\\n // Get queue length for future comparison/\\n uint40 queueLength = getQueueLength();\\n\\n // Initialize the array of canonical chain leaves that we will append.\\n bytes32[] memory leaves = new bytes32[](totalElementsToAppend);\\n // Each leaf index corresponds to a tx, either sequenced or enqueued.\\n uint32 leafIndex = 0;\\n // Counter for number of sequencer transactions appended so far.\\n uint32 numSequencerTransactions = 0;\\n // We will sequentially append leaves which are pointers to the queue.\\n // The initial queue index is what is currently in storage.\\n uint40 nextQueueIndex = getNextQueueIndex();\\n\\n BatchContext memory curContext;\\n\\n for (uint32 i = 0; i < numContexts; i++) {\\n BatchContext memory nextContext = _getBatchContext(i);\\n if (i == 0) {\\n _validateFirstBatchContext(nextContext);\\n }\\n _validateNextBatchContext(curContext, nextContext, nextQueueIndex);\\n\\n curContext = nextContext;\\n\\n for (uint32 j = 0; j < curContext.numSequencedTransactions; j++) {\\n uint256 txDataLength;\\n assembly {\\n txDataLength := shr(232, calldataload(nextTransactionPtr))\\n }\\n\\n leaves[leafIndex] = _getSequencerLeafHash(curContext, nextTransactionPtr, txDataLength);\\n nextTransactionPtr += uint40(TX_DATA_HEADER_SIZE + txDataLength);\\n numSequencerTransactions++;\\n leafIndex++;\\n }\\n\\n for (uint32 j = 0; j < curContext.numSubsequentQueueTransactions; j++) {\\n require(nextQueueIndex < queueLength, \\\"Not enough queued transactions to append.\\\");\\n leaves[leafIndex] = _getQueueLeafHash(nextQueueIndex);\\n nextQueueIndex++;\\n leafIndex++;\\n }\\n }\\n\\n _validateFinalBatchContext(curContext);\\n\\n require(\\n calldataSize == nextTransactionPtr,\\n \\\"Not all sequencer transactions were processed.\\\"\\n );\\n\\n require(\\n leafIndex == totalElementsToAppend,\\n \\\"Actual transaction index does not match expected total elements to append.\\\"\\n );\\n\\n // Generate the required metadata that we need to append this batch\\n uint40 numQueuedTransactions = totalElementsToAppend - numSequencerTransactions;\\n uint40 timestamp;\\n uint40 blockNumber;\\n if (curContext.numSubsequentQueueTransactions == 0) {\\n // The last element is a sequencer tx, therefore pull timestamp and block number from the last context.\\n timestamp = uint40(curContext.timestamp);\\n blockNumber = uint40(curContext.blockNumber);\\n } else {\\n // The last element is a queue tx, therefore pull timestamp and block number from the queue element.\\n Lib_OVMCodec.QueueElement memory lastElement = getQueueElement(nextQueueIndex - 1);\\n timestamp = lastElement.timestamp;\\n blockNumber = lastElement.blockNumber;\\n }\\n\\n _appendBatch(\\n Lib_MerkleTree.getMerkleRoot(leaves),\\n totalElementsToAppend,\\n numQueuedTransactions,\\n timestamp,\\n blockNumber\\n );\\n\\n emit SequencerBatchAppended(\\n nextQueueIndex - numQueuedTransactions,\\n numQueuedTransactions,\\n getTotalElements()\\n );\\n }\\n\\n /**\\n * @inheritdoc iOVM_CanonicalTransactionChain\\n */\\n function verifyTransaction(\\n Lib_OVMCodec.Transaction memory _transaction,\\n Lib_OVMCodec.TransactionChainElement memory _txChainElement,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _inclusionProof\\n )\\n override\\n public\\n view\\n returns (\\n bool\\n )\\n {\\n if (_txChainElement.isSequenced == true) {\\n return _verifySequencerTransaction(\\n _transaction,\\n _txChainElement,\\n _batchHeader,\\n _inclusionProof\\n );\\n } else {\\n return _verifyQueueTransaction(\\n _transaction,\\n _txChainElement.queueIndex,\\n _batchHeader,\\n _inclusionProof\\n );\\n }\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Returns the BatchContext located at a particular index.\\n * @param _index The index of the BatchContext\\n * @return The BatchContext at the specified index.\\n */\\n function _getBatchContext(\\n uint256 _index\\n )\\n internal\\n pure\\n returns (\\n BatchContext memory\\n )\\n {\\n uint256 contextPtr = 15 + _index * BATCH_CONTEXT_SIZE;\\n uint256 numSequencedTransactions;\\n uint256 numSubsequentQueueTransactions;\\n uint256 ctxTimestamp;\\n uint256 ctxBlockNumber;\\n\\n assembly {\\n numSequencedTransactions := shr(232, calldataload(contextPtr))\\n numSubsequentQueueTransactions := shr(232, calldataload(add(contextPtr, 3)))\\n ctxTimestamp := shr(216, calldataload(add(contextPtr, 6)))\\n ctxBlockNumber := shr(216, calldataload(add(contextPtr, 11)))\\n }\\n\\n return BatchContext({\\n numSequencedTransactions: numSequencedTransactions,\\n numSubsequentQueueTransactions: numSubsequentQueueTransactions,\\n timestamp: ctxTimestamp,\\n blockNumber: ctxBlockNumber\\n });\\n }\\n\\n /**\\n * Parses the batch context from the extra data.\\n * @return Total number of elements submitted.\\n * @return Index of the next queue element.\\n */\\n function _getBatchExtraData()\\n internal\\n view\\n returns (\\n uint40,\\n uint40,\\n uint40,\\n uint40\\n )\\n {\\n bytes27 extraData = batches().getGlobalMetadata();\\n\\n uint40 totalElements;\\n uint40 nextQueueIndex;\\n uint40 lastTimestamp;\\n uint40 lastBlockNumber;\\n assembly {\\n extraData := shr(40, extraData)\\n totalElements := and(extraData, 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF)\\n nextQueueIndex := shr(40, and(extraData, 0x00000000000000000000000000000000000000000000FFFFFFFFFF0000000000))\\n lastTimestamp := shr(80, and(extraData, 0x0000000000000000000000000000000000FFFFFFFFFF00000000000000000000))\\n lastBlockNumber := shr(120, and(extraData, 0x000000000000000000000000FFFFFFFFFF000000000000000000000000000000))\\n }\\n\\n return (\\n totalElements,\\n nextQueueIndex,\\n lastTimestamp,\\n lastBlockNumber\\n );\\n }\\n\\n /**\\n * Encodes the batch context for the extra data.\\n * @param _totalElements Total number of elements submitted.\\n * @param _nextQueueIndex Index of the next queue element.\\n * @param _timestamp Timestamp for the last batch.\\n * @param _blockNumber Block number of the last batch.\\n * @return Encoded batch context.\\n */\\n function _makeBatchExtraData(\\n uint40 _totalElements,\\n uint40 _nextQueueIndex,\\n uint40 _timestamp,\\n uint40 _blockNumber\\n )\\n internal\\n pure\\n returns (\\n bytes27\\n )\\n {\\n bytes27 extraData;\\n assembly {\\n extraData := _totalElements\\n extraData := or(extraData, shl(40, _nextQueueIndex))\\n extraData := or(extraData, shl(80, _timestamp))\\n extraData := or(extraData, shl(120, _blockNumber))\\n extraData := shl(40, extraData)\\n }\\n\\n return extraData;\\n }\\n\\n /**\\n * Retrieves the hash of a queue element.\\n * @param _index Index of the queue element to retrieve a hash for.\\n * @return Hash of the queue element.\\n */\\n function _getQueueLeafHash(\\n uint256 _index\\n )\\n internal\\n view\\n returns (\\n bytes32\\n )\\n {\\n return _hashTransactionChainElement(\\n Lib_OVMCodec.TransactionChainElement({\\n isSequenced: false,\\n queueIndex: _index,\\n timestamp: 0,\\n blockNumber: 0,\\n txData: hex\\\"\\\"\\n })\\n );\\n }\\n\\n /**\\n * Retrieves the length of the queue.\\n * @return Length of the queue.\\n */\\n function _getQueueLength()\\n internal\\n view\\n returns (\\n uint40\\n )\\n {\\n // The underlying queue data structure stores 2 elements\\n // per insertion, so to get the real queue length we need\\n // to divide by 2. See the usage of `push2(..)`.\\n return uint40(queue().length() / 2);\\n }\\n\\n /**\\n * Retrieves the hash of a sequencer element.\\n * @param _context Batch context for the given element.\\n * @param _nextTransactionPtr Pointer to the next transaction in the calldata.\\n * @param _txDataLength Length of the transaction item.\\n * @return Hash of the sequencer element.\\n */\\n function _getSequencerLeafHash(\\n BatchContext memory _context,\\n uint256 _nextTransactionPtr,\\n uint256 _txDataLength\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n\\n bytes memory chainElement = new bytes(BYTES_TILL_TX_DATA + _txDataLength);\\n uint256 ctxTimestamp = _context.timestamp;\\n uint256 ctxBlockNumber = _context.blockNumber;\\n\\n bytes32 leafHash;\\n assembly {\\n let chainElementStart := add(chainElement, 0x20)\\n\\n // Set the first byte equal to `1` to indicate this is a sequencer chain element.\\n // This distinguishes sequencer ChainElements from queue ChainElements because\\n // all queue ChainElements are ABI encoded and the first byte of ABI encoded\\n // elements is always zero\\n mstore8(chainElementStart, 1)\\n\\n mstore(add(chainElementStart, 1), ctxTimestamp)\\n mstore(add(chainElementStart, 33), ctxBlockNumber)\\n\\n calldatacopy(add(chainElementStart, BYTES_TILL_TX_DATA), add(_nextTransactionPtr, 3), _txDataLength)\\n\\n leafHash := keccak256(chainElementStart, add(BYTES_TILL_TX_DATA, _txDataLength))\\n }\\n\\n return leafHash;\\n }\\n\\n /**\\n * Retrieves the hash of a sequencer element.\\n * @param _txChainElement The chain element which is hashed to calculate the leaf.\\n * @return Hash of the sequencer element.\\n */\\n function _getSequencerLeafHash(\\n Lib_OVMCodec.TransactionChainElement memory _txChainElement\\n )\\n internal\\n view\\n returns(\\n bytes32\\n )\\n {\\n bytes memory txData = _txChainElement.txData;\\n uint256 txDataLength = _txChainElement.txData.length;\\n\\n bytes memory chainElement = new bytes(BYTES_TILL_TX_DATA + txDataLength);\\n uint256 ctxTimestamp = _txChainElement.timestamp;\\n uint256 ctxBlockNumber = _txChainElement.blockNumber;\\n\\n bytes32 leafHash;\\n assembly {\\n let chainElementStart := add(chainElement, 0x20)\\n\\n // Set the first byte equal to `1` to indicate this is a sequencer chain element.\\n // This distinguishes sequencer ChainElements from queue ChainElements because\\n // all queue ChainElements are ABI encoded and the first byte of ABI encoded\\n // elements is always zero\\n mstore8(chainElementStart, 1)\\n\\n mstore(add(chainElementStart, 1), ctxTimestamp)\\n mstore(add(chainElementStart, 33), ctxBlockNumber)\\n\\n pop(staticcall(gas(), 0x04, add(txData, 0x20), txDataLength, add(chainElementStart, BYTES_TILL_TX_DATA), txDataLength))\\n\\n leafHash := keccak256(chainElementStart, add(BYTES_TILL_TX_DATA, txDataLength))\\n }\\n\\n return leafHash;\\n }\\n\\n /**\\n * Inserts a batch into the chain of batches.\\n * @param _transactionRoot Root of the transaction tree for this batch.\\n * @param _batchSize Number of elements in the batch.\\n * @param _numQueuedTransactions Number of queue transactions in the batch.\\n * @param _timestamp The latest batch timestamp.\\n * @param _blockNumber The latest batch blockNumber.\\n */\\n function _appendBatch(\\n bytes32 _transactionRoot,\\n uint256 _batchSize,\\n uint256 _numQueuedTransactions,\\n uint40 _timestamp,\\n uint40 _blockNumber\\n )\\n internal\\n {\\n (uint40 totalElements, uint40 nextQueueIndex, uint40 lastTimestamp, uint40 lastBlockNumber) = _getBatchExtraData();\\n\\n Lib_OVMCodec.ChainBatchHeader memory header = Lib_OVMCodec.ChainBatchHeader({\\n batchIndex: batches().length(),\\n batchRoot: _transactionRoot,\\n batchSize: _batchSize,\\n prevTotalElements: totalElements,\\n extraData: hex\\\"\\\"\\n });\\n\\n emit TransactionBatchAppended(\\n header.batchIndex,\\n header.batchRoot,\\n header.batchSize,\\n header.prevTotalElements,\\n header.extraData\\n );\\n\\n bytes32 batchHeaderHash = Lib_OVMCodec.hashBatchHeader(header);\\n bytes27 latestBatchContext = _makeBatchExtraData(\\n totalElements + uint40(header.batchSize),\\n nextQueueIndex + uint40(_numQueuedTransactions),\\n _timestamp,\\n _blockNumber\\n );\\n\\n batches().push(batchHeaderHash, latestBatchContext);\\n }\\n\\n /**\\n * Checks that the first batch context in a sequencer submission is valid\\n * @param _firstContext The batch context to validate.\\n */\\n function _validateFirstBatchContext(\\n BatchContext memory _firstContext\\n )\\n internal\\n view\\n {\\n // If there are existing elements, this batch must come later.\\n if (getTotalElements() > 0) {\\n (,, uint40 lastTimestamp, uint40 lastBlockNumber) = _getBatchExtraData();\\n require(_firstContext.blockNumber >= lastBlockNumber, \\\"Context block number is lower than last submitted.\\\");\\n require(_firstContext.timestamp >= lastTimestamp, \\\"Context timestamp is lower than last submitted.\\\");\\n }\\n // Sequencer cannot submit contexts which are more than the force inclusion period old.\\n require(_firstContext.timestamp + forceInclusionPeriodSeconds >= block.timestamp, \\\"Context timestamp too far in the past.\\\");\\n require(_firstContext.blockNumber + forceInclusionPeriodBlocks >= block.number, \\\"Context block number too far in the past.\\\");\\n }\\n\\n /**\\n * Checks that a given batch context is valid based on its previous context, and the next queue elemtent.\\n * @param _prevContext The previously validated batch context.\\n * @param _nextContext The batch context to validate with this call.\\n * @param _nextQueueIndex Index of the next queue element to process for the _nextContext's subsequentQueueElements.\\n */\\n function _validateNextBatchContext(\\n BatchContext memory _prevContext,\\n BatchContext memory _nextContext,\\n uint40 _nextQueueIndex\\n )\\n internal\\n view\\n {\\n // All sequencer transactions' times must increase from the previous ones.\\n require(\\n _nextContext.timestamp >= _prevContext.timestamp,\\n \\\"Context timestamp values must monotonically increase.\\\"\\n );\\n\\n require(\\n _nextContext.blockNumber >= _prevContext.blockNumber,\\n \\\"Context blockNumber values must monotonically increase.\\\"\\n );\\n\\n // If there are some queue elements pending:\\n if (getQueueLength() - _nextQueueIndex > 0) {\\n Lib_OVMCodec.QueueElement memory nextQueueElement = getQueueElement(_nextQueueIndex);\\n\\n // If the force inclusion period has passed for an enqueued transaction, it MUST be the next chain element.\\n require(\\n block.timestamp < nextQueueElement.timestamp + forceInclusionPeriodSeconds,\\n \\\"Previously enqueued batches have expired and must be appended before a new sequencer batch.\\\"\\n );\\n\\n // Just like sequencer transaction times must be increasing relative to each other,\\n // We also require that they be increasing relative to any interspersed queue elements.\\n require(\\n _nextContext.timestamp <= nextQueueElement.timestamp,\\n \\\"Sequencer transaction timestamp exceeds that of next queue element.\\\"\\n );\\n\\n require(\\n _nextContext.blockNumber <= nextQueueElement.blockNumber,\\n \\\"Sequencer transaction blockNumber exceeds that of next queue element.\\\"\\n );\\n } \\n }\\n\\n /**\\n * Checks that the final batch context in a sequencer submission is valid.\\n * @param _finalContext The batch context to validate.\\n */\\n function _validateFinalBatchContext(\\n BatchContext memory _finalContext\\n )\\n internal\\n view\\n {\\n // Batches cannot be added from the future, or subsequent enqueue() contexts would violate monotonicity.\\n require(_finalContext.timestamp <= block.timestamp, \\\"Context timestamp is from the future.\\\");\\n require(_finalContext.blockNumber <= block.number, \\\"Context block number is from the future.\\\");\\n }\\n\\n /**\\n * Hashes a transaction chain element.\\n * @param _element Chain element to hash.\\n * @return Hash of the chain element.\\n */\\n function _hashTransactionChainElement(\\n Lib_OVMCodec.TransactionChainElement memory _element\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(\\n abi.encode(\\n _element.isSequenced,\\n _element.queueIndex,\\n _element.timestamp,\\n _element.blockNumber,\\n _element.txData\\n )\\n );\\n }\\n\\n /**\\n * Verifies a sequencer transaction, returning true if it was indeed included in the CTC\\n * @param _transaction The transaction we are verifying inclusion of.\\n * @param _txChainElement The chain element that the transaction is claimed to be a part of.\\n * @param _batchHeader Header of the batch the transaction was included in.\\n * @param _inclusionProof An inclusion proof into the CTC at a particular index.\\n * @return True if the transaction was included in the specified location, else false.\\n */\\n function _verifySequencerTransaction(\\n Lib_OVMCodec.Transaction memory _transaction,\\n Lib_OVMCodec.TransactionChainElement memory _txChainElement,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _inclusionProof\\n )\\n internal\\n view\\n returns (\\n bool\\n )\\n {\\n OVM_ExecutionManager ovmExecutionManager = OVM_ExecutionManager(resolve(\\\"OVM_ExecutionManager\\\"));\\n uint256 gasLimit = ovmExecutionManager.getMaxTransactionGasLimit();\\n bytes32 leafHash = _getSequencerLeafHash(_txChainElement);\\n\\n require(\\n _verifyElement(\\n leafHash,\\n _batchHeader,\\n _inclusionProof\\n ),\\n \\\"Invalid Sequencer transaction inclusion proof.\\\"\\n );\\n\\n require(\\n _transaction.blockNumber == _txChainElement.blockNumber\\n && _transaction.timestamp == _txChainElement.timestamp\\n && _transaction.entrypoint == resolve(\\\"OVM_DecompressionPrecompileAddress\\\")\\n && _transaction.gasLimit == gasLimit\\n && _transaction.l1TxOrigin == address(0)\\n && _transaction.l1QueueOrigin == Lib_OVMCodec.QueueOrigin.SEQUENCER_QUEUE\\n && keccak256(_transaction.data) == keccak256(_txChainElement.txData),\\n \\\"Invalid Sequencer transaction.\\\"\\n );\\n\\n return true;\\n }\\n\\n /**\\n * Verifies a queue transaction, returning true if it was indeed included in the CTC\\n * @param _transaction The transaction we are verifying inclusion of.\\n * @param _queueIndex The queueIndex of the queued transaction.\\n * @param _batchHeader Header of the batch the transaction was included in.\\n * @param _inclusionProof An inclusion proof into the CTC at a particular index (should point to queue tx).\\n * @return True if the transaction was included in the specified location, else false.\\n */\\n function _verifyQueueTransaction(\\n Lib_OVMCodec.Transaction memory _transaction,\\n uint256 _queueIndex,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _inclusionProof\\n )\\n internal\\n view\\n returns (\\n bool\\n )\\n {\\n bytes32 leafHash = _getQueueLeafHash(_queueIndex);\\n\\n require(\\n _verifyElement(\\n leafHash,\\n _batchHeader,\\n _inclusionProof\\n ),\\n \\\"Invalid Queue transaction inclusion proof.\\\"\\n );\\n\\n bytes32 transactionHash = keccak256(\\n abi.encode(\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n )\\n );\\n\\n Lib_OVMCodec.QueueElement memory el = getQueueElement(_queueIndex);\\n require(\\n el.queueRoot == transactionHash\\n && el.timestamp == _transaction.timestamp\\n && el.blockNumber == _transaction.blockNumber,\\n \\\"Invalid Queue transaction.\\\"\\n );\\n\\n return true;\\n }\\n\\n /**\\n * Verifies a batch inclusion proof.\\n * @param _element Hash of the element to verify a proof for.\\n * @param _batchHeader Header of the batch in which the element was included.\\n * @param _proof Merkle inclusion proof for the element.\\n */\\n function _verifyElement(\\n bytes32 _element,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _proof\\n )\\n internal\\n view\\n returns (\\n bool\\n )\\n {\\n require(\\n Lib_OVMCodec.hashBatchHeader(_batchHeader) == batches().get(uint32(_batchHeader.batchIndex)),\\n \\\"Invalid batch header.\\\"\\n );\\n\\n require(\\n Lib_MerkleTree.verify(\\n _batchHeader.batchRoot,\\n _element,\\n _proof.index,\\n _proof.siblings,\\n _batchHeader.batchSize\\n ),\\n \\\"Invalid inclusion proof.\\\"\\n );\\n\\n return true;\\n }\\n}\\n\",\"keccak256\":\"0x66d6fe12fd7d90474ebafd93d75ba57da93a339b38da22c29007e7823c456212\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.7.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\nimport { Lib_EthUtils } from \\\"../../libraries/utils/Lib_EthUtils.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_ExecutionManager } from \\\"../../iOVM/execution/iOVM_ExecutionManager.sol\\\";\\nimport { iOVM_StateManager } from \\\"../../iOVM/execution/iOVM_StateManager.sol\\\";\\nimport { iOVM_SafetyChecker } from \\\"../../iOVM/execution/iOVM_SafetyChecker.sol\\\";\\n\\n/* Contract Imports */\\nimport { OVM_ECDSAContractAccount } from \\\"../accounts/OVM_ECDSAContractAccount.sol\\\";\\nimport { OVM_ProxyEOA } from \\\"../accounts/OVM_ProxyEOA.sol\\\";\\nimport { OVM_DeployerWhitelist } from \\\"../precompiles/OVM_DeployerWhitelist.sol\\\";\\n\\n/**\\n * @title OVM_ExecutionManager\\n */\\ncontract OVM_ExecutionManager is iOVM_ExecutionManager, Lib_AddressResolver {\\n\\n /********************************\\n * External Contract References *\\n ********************************/\\n\\n iOVM_SafetyChecker internal ovmSafetyChecker;\\n iOVM_StateManager internal ovmStateManager;\\n\\n\\n /*******************************\\n * Execution Context Variables *\\n *******************************/\\n\\n GasMeterConfig internal gasMeterConfig;\\n GlobalContext internal globalContext;\\n TransactionContext internal transactionContext;\\n MessageContext internal messageContext;\\n TransactionRecord internal transactionRecord;\\n MessageRecord internal messageRecord;\\n\\n\\n /**************************\\n * Gas Metering Constants *\\n **************************/\\n\\n address constant GAS_METADATA_ADDRESS = 0x06a506A506a506A506a506a506A506A506A506A5;\\n uint256 constant NUISANCE_GAS_SLOAD = 20000;\\n uint256 constant NUISANCE_GAS_SSTORE = 20000;\\n uint256 constant MIN_NUISANCE_GAS_PER_CONTRACT = 30000;\\n uint256 constant NUISANCE_GAS_PER_CONTRACT_BYTE = 100;\\n uint256 constant MIN_GAS_FOR_INVALID_STATE_ACCESS = 30000;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n */\\n constructor(\\n address _libAddressManager,\\n GasMeterConfig memory _gasMeterConfig,\\n GlobalContext memory _globalContext\\n )\\n Lib_AddressResolver(_libAddressManager)\\n {\\n ovmSafetyChecker = iOVM_SafetyChecker(resolve(\\\"OVM_SafetyChecker\\\"));\\n gasMeterConfig = _gasMeterConfig;\\n globalContext = _globalContext;\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n /**\\n * Applies dynamically-sized refund to a transaction to account for the difference in execution\\n * between L1 and L2, so that the overall cost of the ovmOPCODE is fixed.\\n * @param _cost Desired gas cost for the function after the refund.\\n */\\n modifier netGasCost(\\n uint256 _cost\\n ) {\\n uint256 gasProvided = gasleft();\\n _;\\n uint256 gasUsed = gasProvided - gasleft();\\n\\n // We want to refund everything *except* the specified cost.\\n if (_cost < gasUsed) {\\n transactionRecord.ovmGasRefund += gasUsed - _cost;\\n }\\n }\\n\\n /**\\n * Applies a fixed-size gas refund to a transaction to account for the difference in execution\\n * between L1 and L2, so that the overall cost of an ovmOPCODE can be lowered.\\n * @param _discount Amount of gas cost to refund for the ovmOPCODE.\\n */\\n modifier fixedGasDiscount(\\n uint256 _discount\\n ) {\\n uint256 gasProvided = gasleft();\\n _;\\n uint256 gasUsed = gasProvided - gasleft();\\n\\n // We want to refund the specified _discount, unless this risks underflow.\\n if (_discount < gasUsed) {\\n transactionRecord.ovmGasRefund += _discount;\\n } else {\\n // refund all we can without risking underflow.\\n transactionRecord.ovmGasRefund += gasUsed;\\n }\\n }\\n\\n /**\\n * Makes sure we're not inside a static context.\\n */\\n modifier notStatic() {\\n if (messageContext.isStatic == true) {\\n _revertWithFlag(RevertFlag.STATIC_VIOLATION);\\n }\\n _;\\n }\\n\\n\\n /************************************\\n * Transaction Execution Entrypoint *\\n ************************************/\\n\\n /**\\n * Starts the execution of a transaction via the OVM_ExecutionManager.\\n * @param _transaction Transaction data to be executed.\\n * @param _ovmStateManager iOVM_StateManager implementation providing account state.\\n */\\n function run(\\n Lib_OVMCodec.Transaction memory _transaction,\\n address _ovmStateManager\\n )\\n override\\n public\\n {\\n require(transactionContext.ovmNUMBER == 0, \\\"Only be callable at the start of a transaction\\\");\\n // Store our OVM_StateManager instance (significantly easier than attempting to pass the\\n // address around in calldata).\\n ovmStateManager = iOVM_StateManager(_ovmStateManager);\\n\\n // Make sure this function can't be called by anyone except the owner of the\\n // OVM_StateManager (expected to be an OVM_StateTransitioner). We can revert here because\\n // this would make the `run` itself invalid.\\n require(\\n ovmStateManager.isAuthenticated(msg.sender),\\n \\\"Only authenticated addresses in ovmStateManager can call this function\\\"\\n );\\n\\n // Initialize the execution context, must be initialized before we perform any gas metering\\n // or we'll throw a nuisance gas error.\\n _initContext(_transaction);\\n\\n // TEMPORARY: Gas metering is disabled for minnet.\\n // // Check whether we need to start a new epoch, do so if necessary.\\n // _checkNeedsNewEpoch(_transaction.timestamp);\\n\\n // Make sure the transaction's gas limit is valid. We don't revert here because we reserve\\n // reverts for INVALID_STATE_ACCESS.\\n if (_isValidGasLimit(_transaction.gasLimit, _transaction.l1QueueOrigin) == false) {\\n return;\\n }\\n\\n // Check gas right before the call to get total gas consumed by OVM transaction.\\n uint256 gasProvided = gasleft();\\n\\n // Run the transaction, make sure to meter the gas usage.\\n ovmCALL(\\n _transaction.gasLimit - gasMeterConfig.minTransactionGasLimit,\\n _transaction.entrypoint,\\n _transaction.data\\n );\\n uint256 gasUsed = gasProvided - gasleft();\\n\\n // TEMPORARY: Gas metering is disabled for minnet.\\n // // Update the cumulative gas based on the amount of gas used.\\n // _updateCumulativeGas(gasUsed, _transaction.l1QueueOrigin);\\n\\n // Wipe the execution context.\\n _resetContext();\\n\\n // Reset the ovmStateManager.\\n ovmStateManager = iOVM_StateManager(address(0));\\n }\\n\\n\\n /******************************\\n * Opcodes: Execution Context *\\n ******************************/\\n\\n /**\\n * @notice Overrides CALLER.\\n * @return _CALLER Address of the CALLER within the current message context.\\n */\\n function ovmCALLER()\\n override\\n public\\n view\\n returns (\\n address _CALLER\\n )\\n {\\n return messageContext.ovmCALLER;\\n }\\n\\n /**\\n * @notice Overrides ADDRESS.\\n * @return _ADDRESS Active ADDRESS within the current message context.\\n */\\n function ovmADDRESS()\\n override\\n public\\n view\\n returns (\\n address _ADDRESS\\n )\\n {\\n return messageContext.ovmADDRESS;\\n }\\n\\n /**\\n * @notice Overrides TIMESTAMP.\\n * @return _TIMESTAMP Value of the TIMESTAMP within the transaction context.\\n */\\n function ovmTIMESTAMP()\\n override\\n public\\n view\\n returns (\\n uint256 _TIMESTAMP\\n )\\n {\\n return transactionContext.ovmTIMESTAMP;\\n }\\n\\n /**\\n * @notice Overrides NUMBER.\\n * @return _NUMBER Value of the NUMBER within the transaction context.\\n */\\n function ovmNUMBER()\\n override\\n public\\n view\\n returns (\\n uint256 _NUMBER\\n )\\n {\\n return transactionContext.ovmNUMBER;\\n }\\n\\n /**\\n * @notice Overrides GASLIMIT.\\n * @return _GASLIMIT Value of the block's GASLIMIT within the transaction context.\\n */\\n function ovmGASLIMIT()\\n override\\n public\\n view\\n returns (\\n uint256 _GASLIMIT\\n )\\n {\\n return transactionContext.ovmGASLIMIT;\\n }\\n\\n /**\\n * @notice Overrides CHAINID.\\n * @return _CHAINID Value of the chain's CHAINID within the global context.\\n */\\n function ovmCHAINID()\\n override\\n public\\n view\\n returns (\\n uint256 _CHAINID\\n )\\n {\\n return globalContext.ovmCHAINID;\\n }\\n\\n /*********************************\\n * Opcodes: L2 Execution Context *\\n *********************************/\\n\\n /**\\n * @notice Specifies from which L1 rollup queue this transaction originated from.\\n * @return _queueOrigin Address of the ovmL1QUEUEORIGIN within the current message context.\\n */\\n function ovmL1QUEUEORIGIN()\\n override\\n public\\n view\\n returns (\\n Lib_OVMCodec.QueueOrigin _queueOrigin\\n )\\n {\\n return transactionContext.ovmL1QUEUEORIGIN;\\n }\\n\\n /**\\n * @notice Specifies what L1 EOA, if any, sent this transaction.\\n * @return _l1TxOrigin Address of the EOA which send the tx into L2 from L1.\\n */\\n function ovmL1TXORIGIN()\\n override\\n public\\n view\\n returns (\\n address _l1TxOrigin\\n )\\n {\\n return transactionContext.ovmL1TXORIGIN;\\n }\\n\\n /********************\\n * Opcodes: Halting *\\n ********************/\\n\\n /**\\n * @notice Overrides REVERT.\\n * @param _data Bytes data to pass along with the REVERT.\\n */\\n function ovmREVERT(\\n bytes memory _data\\n )\\n override\\n public\\n {\\n _revertWithFlag(RevertFlag.INTENTIONAL_REVERT, _data);\\n }\\n\\n\\n /******************************\\n * Opcodes: Contract Creation *\\n ******************************/\\n\\n /**\\n * @notice Overrides CREATE.\\n * @param _bytecode Code to be used to CREATE a new contract.\\n * @return _contract Address of the created contract.\\n */\\n function ovmCREATE(\\n bytes memory _bytecode\\n )\\n override\\n public\\n notStatic\\n fixedGasDiscount(40000)\\n returns (\\n address _contract\\n )\\n {\\n // Creator is always the current ADDRESS.\\n address creator = ovmADDRESS();\\n\\n // Check that the deployer is whitelisted, or\\n // that arbitrary contract deployment has been enabled.\\n _checkDeployerAllowed(creator);\\n\\n // Generate the correct CREATE address.\\n address contractAddress = Lib_EthUtils.getAddressForCREATE(\\n creator,\\n _getAccountNonce(creator)\\n );\\n\\n return _createContract(\\n contractAddress,\\n _bytecode\\n );\\n }\\n\\n /**\\n * @notice Overrides CREATE2.\\n * @param _bytecode Code to be used to CREATE2 a new contract.\\n * @param _salt Value used to determine the contract's address.\\n * @return _contract Address of the created contract.\\n */\\n function ovmCREATE2(\\n bytes memory _bytecode,\\n bytes32 _salt\\n )\\n override\\n public\\n notStatic\\n fixedGasDiscount(40000)\\n returns (\\n address _contract\\n )\\n {\\n // Creator is always the current ADDRESS.\\n address creator = ovmADDRESS();\\n\\n // Check that the deployer is whitelisted, or\\n // that arbitrary contract deployment has been enabled.\\n _checkDeployerAllowed(creator);\\n\\n // Generate the correct CREATE2 address.\\n address contractAddress = Lib_EthUtils.getAddressForCREATE2(\\n creator,\\n _bytecode,\\n _salt\\n );\\n\\n return _createContract(\\n contractAddress,\\n _bytecode\\n );\\n }\\n\\n\\n /*******************************\\n * Account Abstraction Opcodes *\\n ******************************/\\n\\n /**\\n * Retrieves the nonce of the current ovmADDRESS.\\n * @return _nonce Nonce of the current contract.\\n */\\n function ovmGETNONCE()\\n override\\n public\\n returns (\\n uint256 _nonce\\n )\\n {\\n return _getAccountNonce(ovmADDRESS());\\n }\\n\\n /**\\n * Sets the nonce of the current ovmADDRESS.\\n * @param _nonce New nonce for the current contract.\\n */\\n function ovmSETNONCE(\\n uint256 _nonce\\n )\\n override\\n public\\n notStatic\\n {\\n _setAccountNonce(ovmADDRESS(), _nonce);\\n }\\n\\n /**\\n * Creates a new EOA contract account, for account abstraction.\\n * @dev Essentially functions like ovmCREATE or ovmCREATE2, but we can bypass a lot of checks\\n * because the contract we're creating is trusted (no need to do safety checking or to\\n * handle unexpected reverts). Doesn't need to return an address because the address is\\n * assumed to be the user's actual address.\\n * @param _messageHash Hash of a message signed by some user, for verification.\\n * @param _v Signature `v` parameter.\\n * @param _r Signature `r` parameter.\\n * @param _s Signature `s` parameter.\\n */\\n function ovmCREATEEOA(\\n bytes32 _messageHash,\\n uint8 _v,\\n bytes32 _r,\\n bytes32 _s\\n )\\n override\\n public\\n notStatic\\n {\\n // Recover the EOA address from the message hash and signature parameters. Since we do the\\n // hashing in advance, we don't have handle different message hashing schemes. Even if this\\n // function were to return the wrong address (rather than explicitly returning the zero\\n // address), the rest of the transaction would simply fail (since there's no EOA account to\\n // actually execute the transaction).\\n address eoa = ecrecover(\\n _messageHash,\\n _v + 27,\\n _r,\\n _s\\n );\\n\\n // Invalid signature is a case we proactively handle with a revert. We could alternatively\\n // have this function return a `success` boolean, but this is just easier.\\n if (eoa == address(0)) {\\n ovmREVERT(bytes(\\\"Signature provided for EOA contract creation is invalid.\\\"));\\n }\\n\\n // If the user already has an EOA account, then there's no need to perform this operation.\\n if (_hasEmptyAccount(eoa) == false) {\\n return;\\n }\\n\\n // We always need to initialize the contract with the default account values.\\n _initPendingAccount(eoa);\\n\\n // Temporarily set the current address so it's easier to access on L2.\\n address prevADDRESS = messageContext.ovmADDRESS;\\n messageContext.ovmADDRESS = eoa;\\n\\n // Now actually create the account and get its bytecode. We're not worried about reverts\\n // (other than out of gas, which we can't capture anyway) because this contract is trusted.\\n OVM_ProxyEOA proxyEOA = new OVM_ProxyEOA(0x4200000000000000000000000000000000000003);\\n\\n // Reset the address now that we're done deploying.\\n messageContext.ovmADDRESS = prevADDRESS;\\n\\n // Commit the account with its final values.\\n _commitPendingAccount(\\n eoa,\\n address(proxyEOA),\\n keccak256(Lib_EthUtils.getCode(address(proxyEOA)))\\n );\\n\\n _setAccountNonce(eoa, 0);\\n }\\n\\n\\n /*********************************\\n * Opcodes: Contract Interaction *\\n *********************************/\\n\\n /**\\n * @notice Overrides CALL.\\n * @param _gasLimit Amount of gas to be passed into this call.\\n * @param _address Address of the contract to call.\\n * @param _calldata Data to send along with the call.\\n * @return _success Whether or not the call returned (rather than reverted).\\n * @return _returndata Data returned by the call.\\n */\\n function ovmCALL(\\n uint256 _gasLimit,\\n address _address,\\n bytes memory _calldata\\n )\\n override\\n public\\n fixedGasDiscount(100000)\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n // CALL updates the CALLER and ADDRESS.\\n MessageContext memory nextMessageContext = messageContext;\\n nextMessageContext.ovmCALLER = nextMessageContext.ovmADDRESS;\\n nextMessageContext.ovmADDRESS = _address;\\n\\n return _callContract(\\n nextMessageContext,\\n _gasLimit,\\n _address,\\n _calldata\\n );\\n }\\n\\n /**\\n * @notice Overrides STATICCALL.\\n * @param _gasLimit Amount of gas to be passed into this call.\\n * @param _address Address of the contract to call.\\n * @param _calldata Data to send along with the call.\\n * @return _success Whether or not the call returned (rather than reverted).\\n * @return _returndata Data returned by the call.\\n */\\n function ovmSTATICCALL(\\n uint256 _gasLimit,\\n address _address,\\n bytes memory _calldata\\n )\\n override\\n public\\n fixedGasDiscount(80000)\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n // STATICCALL updates the CALLER, updates the ADDRESS, and runs in a static context.\\n MessageContext memory nextMessageContext = messageContext;\\n nextMessageContext.ovmCALLER = nextMessageContext.ovmADDRESS;\\n nextMessageContext.ovmADDRESS = _address;\\n nextMessageContext.isStatic = true;\\n\\n return _callContract(\\n nextMessageContext,\\n _gasLimit,\\n _address,\\n _calldata\\n );\\n }\\n\\n /**\\n * @notice Overrides DELEGATECALL.\\n * @param _gasLimit Amount of gas to be passed into this call.\\n * @param _address Address of the contract to call.\\n * @param _calldata Data to send along with the call.\\n * @return _success Whether or not the call returned (rather than reverted).\\n * @return _returndata Data returned by the call.\\n */\\n function ovmDELEGATECALL(\\n uint256 _gasLimit,\\n address _address,\\n bytes memory _calldata\\n )\\n override\\n public\\n fixedGasDiscount(40000)\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n // DELEGATECALL does not change anything about the message context.\\n MessageContext memory nextMessageContext = messageContext;\\n bool isStaticEntrypoint = false;\\n\\n return _callContract(\\n nextMessageContext,\\n _gasLimit,\\n _address,\\n _calldata\\n );\\n }\\n\\n\\n /************************************\\n * Opcodes: Contract Storage Access *\\n ************************************/\\n\\n /**\\n * @notice Overrides SLOAD.\\n * @param _key 32 byte key of the storage slot to load.\\n * @return _value 32 byte value of the requested storage slot.\\n */\\n function ovmSLOAD(\\n bytes32 _key\\n )\\n override\\n public\\n netGasCost(40000)\\n returns (\\n bytes32 _value\\n )\\n {\\n // We always SLOAD from the storage of ADDRESS.\\n address contractAddress = ovmADDRESS();\\n\\n return _getContractStorage(\\n contractAddress,\\n _key\\n );\\n }\\n\\n /**\\n * @notice Overrides SSTORE.\\n * @param _key 32 byte key of the storage slot to set.\\n * @param _value 32 byte value for the storage slot.\\n */\\n function ovmSSTORE(\\n bytes32 _key,\\n bytes32 _value\\n )\\n override\\n public\\n notStatic\\n netGasCost(60000)\\n {\\n // We always SSTORE to the storage of ADDRESS.\\n address contractAddress = ovmADDRESS();\\n\\n _putContractStorage(\\n contractAddress,\\n _key,\\n _value\\n );\\n }\\n\\n\\n /*********************************\\n * Opcodes: Contract Code Access *\\n *********************************/\\n\\n /**\\n * @notice Overrides EXTCODECOPY.\\n * @param _contract Address of the contract to copy code from.\\n * @param _offset Offset in bytes from the start of contract code to copy beyond.\\n * @param _length Total number of bytes to copy from the contract's code.\\n * @return _code Bytes of code copied from the requested contract.\\n */\\n function ovmEXTCODECOPY(\\n address _contract,\\n uint256 _offset,\\n uint256 _length\\n )\\n override\\n public\\n returns (\\n bytes memory _code\\n )\\n {\\n // `ovmEXTCODECOPY` is the only overridden opcode capable of producing exactly one byte of\\n // return data. By blocking reads of one byte, we're able to use the condition that an\\n // OVM_ExecutionManager function return value having a length of exactly one byte indicates\\n // an error without an explicit revert. If users were able to read a single byte, they\\n // could forcibly trigger behavior that should only be available to this contract.\\n uint256 length = _length == 1 ? 2 : _length;\\n\\n return Lib_EthUtils.getCode(\\n _getAccountEthAddress(_contract),\\n _offset,\\n length\\n );\\n }\\n\\n /**\\n * @notice Overrides EXTCODESIZE.\\n * @param _contract Address of the contract to query the size of.\\n * @return _EXTCODESIZE Size of the requested contract in bytes.\\n */\\n function ovmEXTCODESIZE(\\n address _contract\\n )\\n override\\n public\\n returns (\\n uint256 _EXTCODESIZE\\n )\\n {\\n return Lib_EthUtils.getCodeSize(\\n _getAccountEthAddress(_contract)\\n );\\n }\\n\\n /**\\n * @notice Overrides EXTCODEHASH.\\n * @param _contract Address of the contract to query the hash of.\\n * @return _EXTCODEHASH Hash of the requested contract.\\n */\\n function ovmEXTCODEHASH(\\n address _contract\\n )\\n override\\n public\\n returns (\\n bytes32 _EXTCODEHASH\\n )\\n {\\n return Lib_EthUtils.getCodeHash(\\n _getAccountEthAddress(_contract)\\n );\\n }\\n\\n\\n /**************************************\\n * Public Functions: Execution Safety *\\n **************************************/\\n\\n /**\\n * Performs the logic to create a contract and revert under various potential conditions.\\n * @dev This function is implemented as `public` because we need to be able to revert a\\n * contract creation without losing information about exactly *why* the contract reverted.\\n * In particular, we want to be sure that contracts cannot trigger an INVALID_STATE_ACCESS\\n * flag and then revert to reset the flag. We're able to do this by making an external\\n * call from `ovmCREATE` and `ovmCREATE2` to `safeCREATE`, which can capture and relay\\n * information before reverting.\\n * @param _address Address of the contract to associate with the one being created.\\n * @param _bytecode Code to be used to create the new contract.\\n */\\n function safeCREATE(\\n address _address,\\n bytes memory _bytecode\\n )\\n override\\n public\\n {\\n // Since this function is public, anyone can attempt to directly call it. We need to make\\n // sure that the OVM_ExecutionManager itself is the only party that can actually try to\\n // call this function.\\n if (msg.sender != address(this)) {\\n return;\\n }\\n\\n // We need to be sure that the user isn't trying to use a contract creation to overwrite\\n // some existing contract. On L1, users will prove that no contract exists at the address\\n // and the OVM_FraudVerifier will populate the code hash of this address with a special\\n // value that represents \\\"known to be an empty account.\\\"\\n if (_hasEmptyAccount(_address) == false) {\\n _revertWithFlag(RevertFlag.CREATE_COLLISION);\\n }\\n\\n // Check the creation bytecode against the OVM_SafetyChecker.\\n if (ovmSafetyChecker.isBytecodeSafe(_bytecode) == false) {\\n _revertWithFlag(RevertFlag.UNSAFE_BYTECODE);\\n }\\n\\n // We always need to initialize the contract with the default account values.\\n _initPendingAccount(_address);\\n\\n // Actually deploy the contract and retrieve its address. This step is hiding a lot of\\n // complexity because we need to ensure that contract creation *never* reverts by itself.\\n // We cover this partially by storing a revert flag and returning (instead of reverting)\\n // when we know that we're inside a contract's creation code.\\n address ethAddress = Lib_EthUtils.createContract(_bytecode);\\n\\n // Contract creation returns the zero address when it fails, which should only be possible\\n // if the user intentionally runs out of gas. However, we might still have a bit of gas\\n // left over since contract calls can only be passed 63/64ths of total gas, so we need to\\n // explicitly handle this case here.\\n if (ethAddress == address(0)) {\\n _revertWithFlag(RevertFlag.CREATE_EXCEPTION);\\n }\\n\\n // Here we pull out the revert flag that would've been set during creation code. Now that\\n // we're out of creation code again, we can just revert normally while passing the flag\\n // through the revert data.\\n if (messageRecord.revertFlag != RevertFlag.DID_NOT_REVERT) {\\n _revertWithFlag(messageRecord.revertFlag);\\n }\\n\\n // Again simply checking that the deployed code is safe too. Contracts can generate\\n // arbitrary deployment code, so there's no easy way to analyze this beforehand.\\n bytes memory deployedCode = Lib_EthUtils.getCode(ethAddress);\\n if (ovmSafetyChecker.isBytecodeSafe(deployedCode) == false) {\\n _revertWithFlag(RevertFlag.UNSAFE_BYTECODE);\\n }\\n\\n // Contract creation didn't need to be reverted and the bytecode is safe. We finish up by\\n // associating the desired address with the newly created contract's code hash and address.\\n _commitPendingAccount(\\n _address,\\n ethAddress,\\n Lib_EthUtils.getCodeHash(ethAddress)\\n );\\n }\\n\\n\\n /***************************************\\n * Public Functions: Execution Context *\\n ***************************************/\\n\\n function getMaxTransactionGasLimit()\\n external\\n view\\n override\\n returns (\\n uint256 _maxTransactionGasLimit\\n )\\n {\\n return gasMeterConfig.maxTransactionGasLimit;\\n }\\n\\n /********************************************\\n * Public Functions: Deployment Witelisting *\\n ********************************************/\\n\\n /**\\n * Checks whether the given address is on the whitelst to ovmCREATE/ovmCREATE2, and reverts if not.\\n * @param _deployerAddress Address attempting to deploy a contract.\\n */\\n function _checkDeployerAllowed(\\n address _deployerAddress\\n )\\n internal\\n {\\n // From an OVM semanitcs perspectibe, this will appear the identical to\\n // the deployer ovmCALLing the whitelist. This is fine--in a sense, we are forcing them to.\\n (bool success, bytes memory data) = ovmCALL(\\n gasleft(),\\n 0x4200000000000000000000000000000000000002,\\n abi.encodeWithSignature(\\\"isDeployerAllowed(address)\\\", _deployerAddress)\\n );\\n bool isAllowed = abi.decode(data, (bool));\\n\\n if (!isAllowed || !success) {\\n _revertWithFlag(RevertFlag.CREATOR_NOT_ALLOWED);\\n } \\n }\\n\\n /********************************************\\n * Internal Functions: Contract Interaction *\\n ********************************************/\\n\\n /**\\n * Creates a new contract and associates it with some contract address.\\n * @param _contractAddress Address to associate the created contract with.\\n * @param _bytecode Bytecode to be used to create the contract.\\n * @return _created Final OVM contract address.\\n */\\n function _createContract(\\n address _contractAddress,\\n bytes memory _bytecode\\n )\\n internal\\n returns (\\n address _created\\n )\\n {\\n // We always update the nonce of the creating account, even if the creation fails.\\n _setAccountNonce(ovmADDRESS(), _getAccountNonce(ovmADDRESS()) + 1);\\n\\n // We're stepping into a CREATE or CREATE2, so we need to update ADDRESS to point\\n // to the contract's associated address and CALLER to point to the previous ADDRESS.\\n MessageContext memory nextMessageContext = messageContext;\\n nextMessageContext.ovmCALLER = messageContext.ovmADDRESS;\\n nextMessageContext.ovmADDRESS = _contractAddress;\\n\\n // Run `safeCREATE` in a new EVM message so that our changes can be reflected even if\\n // `safeCREATE` reverts.\\n (bool _success, ) = _handleExternalInteraction(\\n nextMessageContext,\\n gasleft(),\\n address(this),\\n abi.encodeWithSignature(\\n \\\"safeCREATE(address,bytes)\\\",\\n _contractAddress,\\n _bytecode\\n )\\n );\\n\\n // Need to make sure that this flag is reset so that it isn't propagated to creations in\\n // some parent EVM message.\\n messageRecord.revertFlag = RevertFlag.DID_NOT_REVERT;\\n\\n // Yellow paper requires that address returned is zero if the contract deployment fails.\\n return _success ? _contractAddress : address(0);\\n }\\n\\n /**\\n * Calls the deployed contract associated with a given address.\\n * @param _nextMessageContext Message context to be used for the call.\\n * @param _gasLimit Amount of gas to be passed into this call.\\n * @param _contract OVM address to be called.\\n * @param _calldata Data to send along with the call.\\n * @return _success Whether or not the call returned (rather than reverted).\\n * @return _returndata Data returned by the call.\\n */\\n function _callContract(\\n MessageContext memory _nextMessageContext,\\n uint256 _gasLimit,\\n address _contract,\\n bytes memory _calldata\\n )\\n internal\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n // We reserve addresses of the form 0xdeaddeaddead...NNNN for the container contracts in L2 geth.\\n // So, we block calls to these addresses since they are not safe to run as an OVM contract itself.\\n if (\\n (uint256(_contract) & uint256(0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000)) \\n == uint256(0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000)\\n ) {\\n return (true, hex'');\\n }\\n\\n // Both 0x0000... and the EVM precompiles have the same address on L1 and L2 --> no trie lookup needed.\\n address codeContractAddress =\\n uint(_contract) < 100\\n ? _contract\\n : _getAccountEthAddress(_contract);\\n\\n return _handleExternalInteraction(\\n _nextMessageContext,\\n _gasLimit,\\n codeContractAddress,\\n _calldata\\n );\\n }\\n\\n /**\\n * Handles the logic of making an external call and parsing revert information.\\n * @param _nextMessageContext Message context to be used for the call.\\n * @param _gasLimit Amount of gas to be passed into this call.\\n * @param _target Address of the contract to call.\\n * @param _data Data to send along with the call.\\n * @return _success Whether or not the call returned (rather than reverted).\\n * @return _returndata Data returned by the call.\\n */\\n function _handleExternalInteraction(\\n MessageContext memory _nextMessageContext,\\n uint256 _gasLimit,\\n address _target,\\n bytes memory _data\\n )\\n internal\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n // We need to switch over to our next message context for the duration of this call.\\n MessageContext memory prevMessageContext = messageContext;\\n _switchMessageContext(prevMessageContext, _nextMessageContext);\\n\\n // Nuisance gas is a system used to bound the ability for an attacker to make fraud proofs\\n // expensive by touching a lot of different accounts or storage slots. Since most contracts\\n // only use a few storage slots during any given transaction, this shouldn't be a limiting\\n // factor.\\n uint256 prevNuisanceGasLeft = messageRecord.nuisanceGasLeft;\\n uint256 nuisanceGasLimit = _getNuisanceGasLimit(_gasLimit);\\n messageRecord.nuisanceGasLeft = nuisanceGasLimit;\\n\\n // Make the call and make sure to pass in the gas limit. Another instance of hidden\\n // complexity. `_target` is guaranteed to be a safe contract, meaning its return/revert\\n // behavior can be controlled. In particular, we enforce that flags are passed through\\n // revert data as to retrieve execution metadata that would normally be reverted out of\\n // existence.\\n (bool success, bytes memory returndata) = _target.call{gas: _gasLimit}(_data);\\n\\n // Switch back to the original message context now that we're out of the call.\\n _switchMessageContext(_nextMessageContext, prevMessageContext);\\n\\n // Assuming there were no reverts, the message record should be accurate here. We'll update\\n // this value in the case of a revert.\\n uint256 nuisanceGasLeft = messageRecord.nuisanceGasLeft;\\n\\n // Reverts at this point are completely OK, but we need to make a few updates based on the\\n // information passed through the revert.\\n if (success == false) {\\n (\\n RevertFlag flag,\\n uint256 nuisanceGasLeftPostRevert,\\n uint256 ovmGasRefund,\\n bytes memory returndataFromFlag\\n ) = _decodeRevertData(returndata);\\n\\n // INVALID_STATE_ACCESS is the only flag that triggers an immediate abort of the\\n // parent EVM message. This behavior is necessary because INVALID_STATE_ACCESS must\\n // halt any further transaction execution that could impact the execution result.\\n if (flag == RevertFlag.INVALID_STATE_ACCESS) {\\n _revertWithFlag(flag);\\n }\\n\\n // INTENTIONAL_REVERT, UNSAFE_BYTECODE, STATIC_VIOLATION, and CREATOR_NOT_ALLOWED aren't \\n // dependent on the input state, so we can just handle them like standard reverts. Our only change here\\n // is to record the gas refund reported by the call (enforced by safety checking).\\n if (\\n flag == RevertFlag.INTENTIONAL_REVERT\\n || flag == RevertFlag.UNSAFE_BYTECODE\\n || flag == RevertFlag.STATIC_VIOLATION\\n || flag == RevertFlag.CREATOR_NOT_ALLOWED\\n ) {\\n transactionRecord.ovmGasRefund = ovmGasRefund;\\n }\\n\\n // INTENTIONAL_REVERT needs to pass up the user-provided return data encoded into the\\n // flag, *not* the full encoded flag. All other revert types return no data.\\n if (flag == RevertFlag.INTENTIONAL_REVERT) {\\n returndata = returndataFromFlag;\\n } else {\\n returndata = hex'';\\n }\\n\\n // Reverts mean we need to use up whatever \\\"nuisance gas\\\" was used by the call.\\n // EXCEEDS_NUISANCE_GAS explicitly reduces the remaining nuisance gas for this message\\n // to zero. OUT_OF_GAS is a \\\"pseudo\\\" flag given that messages return no data when they\\n // run out of gas, so we have to treat this like EXCEEDS_NUISANCE_GAS. All other flags\\n // will simply pass up the remaining nuisance gas.\\n nuisanceGasLeft = nuisanceGasLeftPostRevert;\\n }\\n\\n // We need to reset the nuisance gas back to its original value minus the amount used here.\\n messageRecord.nuisanceGasLeft = prevNuisanceGasLeft - (nuisanceGasLimit - nuisanceGasLeft);\\n\\n return (\\n success,\\n returndata\\n );\\n }\\n\\n\\n /******************************************\\n * Internal Functions: State Manipulation *\\n ******************************************/\\n\\n /**\\n * Checks whether an account exists within the OVM_StateManager.\\n * @param _address Address of the account to check.\\n * @return _exists Whether or not the account exists.\\n */\\n function _hasAccount(\\n address _address\\n )\\n internal\\n returns (\\n bool _exists\\n )\\n {\\n _checkAccountLoad(_address);\\n return ovmStateManager.hasAccount(_address);\\n }\\n\\n /**\\n * Checks whether a known empty account exists within the OVM_StateManager.\\n * @param _address Address of the account to check.\\n * @return _exists Whether or not the account empty exists.\\n */\\n function _hasEmptyAccount(\\n address _address\\n )\\n internal\\n returns (\\n bool _exists\\n )\\n {\\n _checkAccountLoad(_address);\\n return ovmStateManager.hasEmptyAccount(_address);\\n }\\n\\n /**\\n * Sets the nonce of an account.\\n * @param _address Address of the account to modify.\\n * @param _nonce New account nonce.\\n */\\n function _setAccountNonce(\\n address _address,\\n uint256 _nonce\\n )\\n internal\\n {\\n _checkAccountChange(_address);\\n ovmStateManager.setAccountNonce(_address, _nonce);\\n }\\n\\n /**\\n * Gets the nonce of an account.\\n * @param _address Address of the account to access.\\n * @return _nonce Nonce of the account.\\n */\\n function _getAccountNonce(\\n address _address\\n )\\n internal\\n returns (\\n uint256 _nonce\\n )\\n {\\n _checkAccountLoad(_address);\\n return ovmStateManager.getAccountNonce(_address);\\n }\\n\\n /**\\n * Retrieves the Ethereum address of an account.\\n * @param _address Address of the account to access.\\n * @return _ethAddress Corresponding Ethereum address.\\n */\\n function _getAccountEthAddress(\\n address _address\\n )\\n internal\\n returns (\\n address _ethAddress\\n )\\n {\\n _checkAccountLoad(_address);\\n return ovmStateManager.getAccountEthAddress(_address);\\n }\\n\\n /**\\n * Creates the default account object for the given address.\\n * @param _address Address of the account create.\\n */\\n function _initPendingAccount(\\n address _address\\n )\\n internal\\n {\\n // Although it seems like `_checkAccountChange` would be more appropriate here, we don't\\n // actually consider an account \\\"changed\\\" until it's inserted into the state (in this case\\n // by `_commitPendingAccount`).\\n _checkAccountLoad(_address);\\n ovmStateManager.initPendingAccount(_address);\\n }\\n\\n /**\\n * Stores additional relevant data for a new account, thereby \\\"committing\\\" it to the state.\\n * This function is only called during `ovmCREATE` and `ovmCREATE2` after a successful contract\\n * creation.\\n * @param _address Address of the account to commit.\\n * @param _ethAddress Address of the associated deployed contract.\\n * @param _codeHash Hash of the code stored at the address.\\n */\\n function _commitPendingAccount(\\n address _address,\\n address _ethAddress,\\n bytes32 _codeHash\\n )\\n internal\\n {\\n _checkAccountChange(_address);\\n ovmStateManager.commitPendingAccount(\\n _address,\\n _ethAddress,\\n _codeHash\\n );\\n }\\n\\n /**\\n * Retrieves the value of a storage slot.\\n * @param _contract Address of the contract to query.\\n * @param _key 32 byte key of the storage slot.\\n * @return _value 32 byte storage slot value.\\n */\\n function _getContractStorage(\\n address _contract,\\n bytes32 _key\\n )\\n internal\\n returns (\\n bytes32 _value\\n )\\n {\\n _checkContractStorageLoad(_contract, _key);\\n return ovmStateManager.getContractStorage(_contract, _key);\\n }\\n\\n /**\\n * Sets the value of a storage slot.\\n * @param _contract Address of the contract to modify.\\n * @param _key 32 byte key of the storage slot.\\n * @param _value 32 byte storage slot value.\\n */\\n function _putContractStorage(\\n address _contract,\\n bytes32 _key,\\n bytes32 _value\\n )\\n internal\\n {\\n // We don't set storage if the value didn't change. Although this acts as a convenient\\n // optimization, it's also necessary to avoid the case in which a contract with no storage\\n // attempts to store the value \\\"0\\\" at any key. Putting this value (and therefore requiring\\n // that the value be committed into the storage trie after execution) would incorrectly\\n // modify the storage root.\\n if (_getContractStorage(_contract, _key) == _value) {\\n return;\\n }\\n\\n _checkContractStorageChange(_contract, _key);\\n ovmStateManager.putContractStorage(_contract, _key, _value);\\n }\\n\\n /**\\n * Validation whenever a contract needs to be loaded. Checks that the account exists, charges\\n * nuisance gas if the account hasn't been loaded before.\\n * @param _address Address of the account to load.\\n */\\n function _checkAccountLoad(\\n address _address\\n )\\n internal\\n {\\n // See `_checkContractStorageLoad` for more information.\\n if (gasleft() < MIN_GAS_FOR_INVALID_STATE_ACCESS) {\\n _revertWithFlag(RevertFlag.OUT_OF_GAS);\\n }\\n\\n // See `_checkContractStorageLoad` for more information.\\n if (ovmStateManager.hasAccount(_address) == false) {\\n _revertWithFlag(RevertFlag.INVALID_STATE_ACCESS);\\n }\\n\\n // Check whether the account has been loaded before and mark it as loaded if not. We need\\n // this because \\\"nuisance gas\\\" only applies to the first time that an account is loaded.\\n (\\n bool _wasAccountAlreadyLoaded\\n ) = ovmStateManager.testAndSetAccountLoaded(_address);\\n\\n // If we hadn't already loaded the account, then we'll need to charge \\\"nuisance gas\\\" based\\n // on the size of the contract code.\\n if (_wasAccountAlreadyLoaded == false) {\\n _useNuisanceGas(\\n (Lib_EthUtils.getCodeSize(_getAccountEthAddress(_address)) * NUISANCE_GAS_PER_CONTRACT_BYTE) + MIN_NUISANCE_GAS_PER_CONTRACT\\n );\\n }\\n }\\n\\n /**\\n * Validation whenever a contract needs to be changed. Checks that the account exists, charges\\n * nuisance gas if the account hasn't been changed before.\\n * @param _address Address of the account to change.\\n */\\n function _checkAccountChange(\\n address _address\\n )\\n internal\\n {\\n // Start by checking for a load as we only want to charge nuisance gas proportional to\\n // contract size once.\\n _checkAccountLoad(_address);\\n\\n // Check whether the account has been changed before and mark it as changed if not. We need\\n // this because \\\"nuisance gas\\\" only applies to the first time that an account is changed.\\n (\\n bool _wasAccountAlreadyChanged\\n ) = ovmStateManager.testAndSetAccountChanged(_address);\\n\\n // If we hadn't already loaded the account, then we'll need to charge \\\"nuisance gas\\\" based\\n // on the size of the contract code.\\n if (_wasAccountAlreadyChanged == false) {\\n ovmStateManager.incrementTotalUncommittedAccounts();\\n _useNuisanceGas(\\n (Lib_EthUtils.getCodeSize(_getAccountEthAddress(_address)) * NUISANCE_GAS_PER_CONTRACT_BYTE) + MIN_NUISANCE_GAS_PER_CONTRACT\\n );\\n }\\n }\\n\\n /**\\n * Validation whenever a slot needs to be loaded. Checks that the account exists, charges\\n * nuisance gas if the slot hasn't been loaded before.\\n * @param _contract Address of the account to load from.\\n * @param _key 32 byte key to load.\\n */\\n function _checkContractStorageLoad(\\n address _contract,\\n bytes32 _key\\n )\\n internal\\n {\\n // Another case of hidden complexity. If we didn't enforce this requirement, then a\\n // contract could pass in just enough gas to cause the INVALID_STATE_ACCESS check to fail\\n // on L1 but not on L2. A contract could use this behavior to prevent the\\n // OVM_ExecutionManager from detecting an invalid state access. Reverting with OUT_OF_GAS\\n // allows us to also charge for the full message nuisance gas, because you deserve that for\\n // trying to break the contract in this way.\\n if (gasleft() < MIN_GAS_FOR_INVALID_STATE_ACCESS) {\\n _revertWithFlag(RevertFlag.OUT_OF_GAS);\\n }\\n\\n // We need to make sure that the transaction isn't trying to access storage that hasn't\\n // been provided to the OVM_StateManager. We'll immediately abort if this is the case.\\n // We know that we have enough gas to do this check because of the above test.\\n if (ovmStateManager.hasContractStorage(_contract, _key) == false) {\\n _revertWithFlag(RevertFlag.INVALID_STATE_ACCESS);\\n }\\n\\n // Check whether the slot has been loaded before and mark it as loaded if not. We need\\n // this because \\\"nuisance gas\\\" only applies to the first time that a slot is loaded.\\n (\\n bool _wasContractStorageAlreadyLoaded\\n ) = ovmStateManager.testAndSetContractStorageLoaded(_contract, _key);\\n\\n // If we hadn't already loaded the account, then we'll need to charge some fixed amount of\\n // \\\"nuisance gas\\\".\\n if (_wasContractStorageAlreadyLoaded == false) {\\n _useNuisanceGas(NUISANCE_GAS_SLOAD);\\n }\\n }\\n\\n /**\\n * Validation whenever a slot needs to be changed. Checks that the account exists, charges\\n * nuisance gas if the slot hasn't been changed before.\\n * @param _contract Address of the account to change.\\n * @param _key 32 byte key to change.\\n */\\n function _checkContractStorageChange(\\n address _contract,\\n bytes32 _key\\n )\\n internal\\n {\\n // Start by checking for load to make sure we have the storage slot and that we charge the\\n // \\\"nuisance gas\\\" necessary to prove the storage slot state.\\n _checkContractStorageLoad(_contract, _key);\\n\\n // Check whether the slot has been changed before and mark it as changed if not. We need\\n // this because \\\"nuisance gas\\\" only applies to the first time that a slot is changed.\\n (\\n bool _wasContractStorageAlreadyChanged\\n ) = ovmStateManager.testAndSetContractStorageChanged(_contract, _key);\\n\\n // If we hadn't already changed the account, then we'll need to charge some fixed amount of\\n // \\\"nuisance gas\\\".\\n if (_wasContractStorageAlreadyChanged == false) {\\n // Changing a storage slot means that we're also going to have to change the\\n // corresponding account, so do an account change check.\\n _checkAccountChange(_contract);\\n\\n ovmStateManager.incrementTotalUncommittedContractStorage();\\n _useNuisanceGas(NUISANCE_GAS_SSTORE);\\n }\\n }\\n\\n\\n /************************************\\n * Internal Functions: Revert Logic *\\n ************************************/\\n\\n /**\\n * Simple encoding for revert data.\\n * @param _flag Flag to revert with.\\n * @param _data Additional user-provided revert data.\\n * @return _revertdata Encoded revert data.\\n */\\n function _encodeRevertData(\\n RevertFlag _flag,\\n bytes memory _data\\n )\\n internal\\n view\\n returns (\\n bytes memory _revertdata\\n )\\n {\\n // Out of gas and create exceptions will fundamentally return no data, so simulating it shouldn't either.\\n if (\\n _flag == RevertFlag.OUT_OF_GAS\\n || _flag == RevertFlag.CREATE_EXCEPTION\\n ) {\\n return bytes('');\\n }\\n\\n // INVALID_STATE_ACCESS doesn't need to return any data other than the flag.\\n if (_flag == RevertFlag.INVALID_STATE_ACCESS) {\\n return abi.encode(\\n _flag,\\n 0,\\n 0,\\n bytes('')\\n );\\n }\\n\\n // Just ABI encode the rest of the parameters.\\n return abi.encode(\\n _flag,\\n messageRecord.nuisanceGasLeft,\\n transactionRecord.ovmGasRefund,\\n _data\\n );\\n }\\n\\n /**\\n * Simple decoding for revert data.\\n * @param _revertdata Revert data to decode.\\n * @return _flag Flag used to revert.\\n * @return _nuisanceGasLeft Amount of nuisance gas unused by the message.\\n * @return _ovmGasRefund Amount of gas refunded during the message.\\n * @return _data Additional user-provided revert data.\\n */\\n function _decodeRevertData(\\n bytes memory _revertdata\\n )\\n internal\\n pure\\n returns (\\n RevertFlag _flag,\\n uint256 _nuisanceGasLeft,\\n uint256 _ovmGasRefund,\\n bytes memory _data\\n )\\n {\\n // A length of zero means the call ran out of gas, just return empty data.\\n if (_revertdata.length == 0) {\\n return (\\n RevertFlag.OUT_OF_GAS,\\n 0,\\n 0,\\n bytes('')\\n );\\n }\\n\\n // ABI decode the incoming data.\\n return abi.decode(_revertdata, (RevertFlag, uint256, uint256, bytes));\\n }\\n\\n /**\\n * Causes a message to revert or abort.\\n * @param _flag Flag to revert with.\\n * @param _data Additional user-provided data.\\n */\\n function _revertWithFlag(\\n RevertFlag _flag,\\n bytes memory _data\\n )\\n internal\\n {\\n // We don't want to revert when we're inside a CREATE or CREATE2, because those opcodes\\n // fail silently (we can't pass any data upwards). Instead, we set a flag and return a\\n // *single* byte, something the OVM_ExecutionManager will not return in any other case.\\n // We're thereby allowed to communicate failure without allowing contracts to trick us into\\n // thinking there was a failure.\\n bool isCreation;\\n assembly {\\n isCreation := eq(extcodesize(caller()), 0)\\n }\\n\\n if (isCreation) {\\n messageRecord.revertFlag = _flag;\\n\\n assembly {\\n return(0, 1)\\n }\\n }\\n\\n // If we're not inside a CREATE or CREATE2, we can simply encode the necessary data and\\n // revert normally.\\n bytes memory revertdata = _encodeRevertData(\\n _flag,\\n _data\\n );\\n\\n assembly {\\n revert(add(revertdata, 0x20), mload(revertdata))\\n }\\n }\\n\\n /**\\n * Causes a message to revert or abort.\\n * @param _flag Flag to revert with.\\n */\\n function _revertWithFlag(\\n RevertFlag _flag\\n )\\n internal\\n {\\n _revertWithFlag(_flag, bytes(''));\\n }\\n\\n\\n /******************************************\\n * Internal Functions: Nuisance Gas Logic *\\n ******************************************/\\n\\n /**\\n * Computes the nuisance gas limit from the gas limit.\\n * @dev This function is currently using a naive implementation whereby the nuisance gas limit\\n * is set to exactly equal the lesser of the gas limit or remaining gas. It's likely that\\n * this implementation is perfectly fine, but we may change this formula later.\\n * @param _gasLimit Gas limit to compute from.\\n * @return _nuisanceGasLimit Computed nuisance gas limit.\\n */\\n function _getNuisanceGasLimit(\\n uint256 _gasLimit\\n )\\n internal\\n view\\n returns (\\n uint256 _nuisanceGasLimit\\n )\\n {\\n return _gasLimit < gasleft() ? _gasLimit : gasleft();\\n }\\n\\n /**\\n * Uses a certain amount of nuisance gas.\\n * @param _amount Amount of nuisance gas to use.\\n */\\n function _useNuisanceGas(\\n uint256 _amount\\n )\\n internal\\n {\\n // Essentially the same as a standard OUT_OF_GAS, except we also retain a record of the gas\\n // refund to be given at the end of the transaction.\\n if (messageRecord.nuisanceGasLeft < _amount) {\\n _revertWithFlag(RevertFlag.EXCEEDS_NUISANCE_GAS);\\n }\\n\\n messageRecord.nuisanceGasLeft -= _amount;\\n }\\n\\n\\n /************************************\\n * Internal Functions: Gas Metering *\\n ************************************/\\n\\n /**\\n * Checks whether a transaction needs to start a new epoch and does so if necessary.\\n * @param _timestamp Transaction timestamp.\\n */\\n function _checkNeedsNewEpoch(\\n uint256 _timestamp\\n )\\n internal\\n {\\n if (\\n _timestamp >= (\\n _getGasMetadata(GasMetadataKey.CURRENT_EPOCH_START_TIMESTAMP)\\n + gasMeterConfig.secondsPerEpoch\\n )\\n ) {\\n _putGasMetadata(\\n GasMetadataKey.CURRENT_EPOCH_START_TIMESTAMP,\\n _timestamp\\n );\\n\\n _putGasMetadata(\\n GasMetadataKey.PREV_EPOCH_SEQUENCER_QUEUE_GAS,\\n _getGasMetadata(\\n GasMetadataKey.CUMULATIVE_SEQUENCER_QUEUE_GAS\\n )\\n );\\n\\n _putGasMetadata(\\n GasMetadataKey.PREV_EPOCH_L1TOL2_QUEUE_GAS,\\n _getGasMetadata(\\n GasMetadataKey.CUMULATIVE_L1TOL2_QUEUE_GAS\\n )\\n );\\n }\\n }\\n\\n /**\\n * Validates the gas limit for a given transaction.\\n * @param _gasLimit Gas limit provided by the transaction.\\n * @param _queueOrigin Queue from which the transaction originated.\\n * @return _valid Whether or not the gas limit is valid.\\n */\\n function _isValidGasLimit(\\n uint256 _gasLimit,\\n Lib_OVMCodec.QueueOrigin _queueOrigin\\n )\\n internal\\n returns (\\n bool _valid\\n )\\n {\\n // Always have to be below the maximum gas limit.\\n if (_gasLimit > gasMeterConfig.maxTransactionGasLimit) {\\n return false;\\n }\\n\\n // Always have to be above the minimum gas limit.\\n if (_gasLimit < gasMeterConfig.minTransactionGasLimit) {\\n return false;\\n }\\n\\n // TEMPORARY: Gas metering is disabled for minnet.\\n return true;\\n // GasMetadataKey cumulativeGasKey;\\n // GasMetadataKey prevEpochGasKey;\\n // if (_queueOrigin == Lib_OVMCodec.QueueOrigin.SEQUENCER_QUEUE) {\\n // cumulativeGasKey = GasMetadataKey.CUMULATIVE_SEQUENCER_QUEUE_GAS;\\n // prevEpochGasKey = GasMetadataKey.PREV_EPOCH_SEQUENCER_QUEUE_GAS;\\n // } else {\\n // cumulativeGasKey = GasMetadataKey.CUMULATIVE_L1TOL2_QUEUE_GAS;\\n // prevEpochGasKey = GasMetadataKey.PREV_EPOCH_L1TOL2_QUEUE_GAS;\\n // }\\n\\n // return (\\n // (\\n // _getGasMetadata(cumulativeGasKey)\\n // - _getGasMetadata(prevEpochGasKey)\\n // + _gasLimit\\n // ) < gasMeterConfig.maxGasPerQueuePerEpoch\\n // );\\n }\\n\\n /**\\n * Updates the cumulative gas after a transaction.\\n * @param _gasUsed Gas used by the transaction.\\n * @param _queueOrigin Queue from which the transaction originated.\\n */\\n function _updateCumulativeGas(\\n uint256 _gasUsed,\\n Lib_OVMCodec.QueueOrigin _queueOrigin\\n )\\n internal\\n {\\n GasMetadataKey cumulativeGasKey;\\n if (_queueOrigin == Lib_OVMCodec.QueueOrigin.SEQUENCER_QUEUE) {\\n cumulativeGasKey = GasMetadataKey.CUMULATIVE_SEQUENCER_QUEUE_GAS;\\n } else {\\n cumulativeGasKey = GasMetadataKey.CUMULATIVE_L1TOL2_QUEUE_GAS;\\n }\\n\\n _putGasMetadata(\\n cumulativeGasKey,\\n (\\n _getGasMetadata(cumulativeGasKey)\\n + gasMeterConfig.minTransactionGasLimit\\n + _gasUsed\\n - transactionRecord.ovmGasRefund\\n )\\n );\\n }\\n\\n /**\\n * Retrieves the value of a gas metadata key.\\n * @param _key Gas metadata key to retrieve.\\n * @return _value Value stored at the given key.\\n */\\n function _getGasMetadata(\\n GasMetadataKey _key\\n )\\n internal\\n returns (\\n uint256 _value\\n )\\n {\\n return uint256(_getContractStorage(\\n GAS_METADATA_ADDRESS,\\n bytes32(uint256(_key))\\n ));\\n }\\n\\n /**\\n * Sets the value of a gas metadata key.\\n * @param _key Gas metadata key to set.\\n * @param _value Value to store at the given key.\\n */\\n function _putGasMetadata(\\n GasMetadataKey _key,\\n uint256 _value\\n )\\n internal\\n {\\n _putContractStorage(\\n GAS_METADATA_ADDRESS,\\n bytes32(uint256(_key)),\\n bytes32(uint256(_value))\\n );\\n }\\n\\n\\n /*****************************************\\n * Internal Functions: Execution Context *\\n *****************************************/\\n\\n /**\\n * Swaps over to a new message context.\\n * @param _prevMessageContext Context we're switching from.\\n * @param _nextMessageContext Context we're switching to.\\n */\\n function _switchMessageContext(\\n MessageContext memory _prevMessageContext,\\n MessageContext memory _nextMessageContext\\n )\\n internal\\n {\\n // Avoid unnecessary the SSTORE.\\n if (_prevMessageContext.ovmCALLER != _nextMessageContext.ovmCALLER) {\\n messageContext.ovmCALLER = _nextMessageContext.ovmCALLER;\\n }\\n\\n // Avoid unnecessary the SSTORE.\\n if (_prevMessageContext.ovmADDRESS != _nextMessageContext.ovmADDRESS) {\\n messageContext.ovmADDRESS = _nextMessageContext.ovmADDRESS;\\n }\\n\\n // Avoid unnecessary the SSTORE.\\n if (_prevMessageContext.isStatic != _nextMessageContext.isStatic) {\\n messageContext.isStatic = _nextMessageContext.isStatic;\\n }\\n }\\n\\n /**\\n * Initializes the execution context.\\n * @param _transaction OVM transaction being executed.\\n */\\n function _initContext(\\n Lib_OVMCodec.Transaction memory _transaction\\n )\\n internal\\n {\\n transactionContext.ovmTIMESTAMP = _transaction.timestamp;\\n transactionContext.ovmNUMBER = _transaction.blockNumber;\\n transactionContext.ovmTXGASLIMIT = _transaction.gasLimit;\\n transactionContext.ovmL1QUEUEORIGIN = _transaction.l1QueueOrigin;\\n transactionContext.ovmL1TXORIGIN = _transaction.l1TxOrigin;\\n transactionContext.ovmGASLIMIT = gasMeterConfig.maxGasPerQueuePerEpoch;\\n\\n messageRecord.nuisanceGasLeft = _getNuisanceGasLimit(_transaction.gasLimit);\\n }\\n\\n /**\\n * Resets the transaction and message context.\\n */\\n function _resetContext()\\n internal\\n {\\n transactionContext.ovmL1TXORIGIN = address(0);\\n transactionContext.ovmTIMESTAMP = 0;\\n transactionContext.ovmNUMBER = 0;\\n transactionContext.ovmGASLIMIT = 0;\\n transactionContext.ovmTXGASLIMIT = 0;\\n transactionContext.ovmL1QUEUEORIGIN = Lib_OVMCodec.QueueOrigin.SEQUENCER_QUEUE;\\n\\n transactionRecord.ovmGasRefund = 0;\\n\\n messageContext.ovmCALLER = address(0);\\n messageContext.ovmADDRESS = address(0);\\n messageContext.isStatic = false;\\n\\n messageRecord.nuisanceGasLeft = 0;\\n messageRecord.revertFlag = RevertFlag.DID_NOT_REVERT;\\n }\\n}\\n\",\"keccak256\":\"0x691ade8b4e9ffe94822f300b00add6d709138dfbd31592c90c12db5512bf765c\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/precompiles/OVM_DeployerWhitelist.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.7.0;\\n\\n/* Library Imports */\\nimport { Lib_Bytes32Utils } from \\\"../../libraries/utils/Lib_Bytes32Utils.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_DeployerWhitelist } from \\\"../../iOVM/precompiles/iOVM_DeployerWhitelist.sol\\\";\\nimport { Lib_SafeExecutionManagerWrapper } from \\\"../../libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\\\";\\n\\n/**\\n * @title OVM_DeployerWhitelist\\n * @dev L2 CONTRACT (NOT COMPILED)\\n */\\ncontract OVM_DeployerWhitelist is iOVM_DeployerWhitelist {\\n\\n /**********************\\n * Contract Constants *\\n **********************/\\n\\n bytes32 internal constant KEY_INITIALIZED = 0x0000000000000000000000000000000000000000000000000000000000000010;\\n bytes32 internal constant KEY_OWNER = 0x0000000000000000000000000000000000000000000000000000000000000011;\\n bytes32 internal constant KEY_ALLOW_ARBITRARY_DEPLOYMENT = 0x0000000000000000000000000000000000000000000000000000000000000012;\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n \\n /**\\n * Blocks functions to anyone except the contract owner.\\n */\\n modifier onlyOwner() {\\n address owner = Lib_Bytes32Utils.toAddress(\\n Lib_SafeExecutionManagerWrapper.safeSLOAD(\\n KEY_OWNER\\n )\\n );\\n\\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(\\n Lib_SafeExecutionManagerWrapper.safeCALLER() == owner,\\n \\\"Function can only be called by the owner of this contract.\\\"\\n );\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n \\n /**\\n * Initializes the whitelist.\\n * @param _owner Address of the owner for this contract.\\n * @param _allowArbitraryDeployment Whether or not to allow arbitrary contract deployment.\\n */\\n function initialize(\\n address _owner,\\n bool _allowArbitraryDeployment\\n )\\n override\\n public\\n {\\n bool initialized = Lib_Bytes32Utils.toBool(\\n Lib_SafeExecutionManagerWrapper.safeSLOAD(KEY_INITIALIZED)\\n );\\n\\n if (initialized == true) {\\n return;\\n }\\n\\n Lib_SafeExecutionManagerWrapper.safeSSTORE(\\n KEY_INITIALIZED,\\n Lib_Bytes32Utils.fromBool(true)\\n );\\n Lib_SafeExecutionManagerWrapper.safeSSTORE(\\n KEY_OWNER,\\n Lib_Bytes32Utils.fromAddress(_owner)\\n );\\n Lib_SafeExecutionManagerWrapper.safeSSTORE(\\n KEY_ALLOW_ARBITRARY_DEPLOYMENT,\\n Lib_Bytes32Utils.fromBool(_allowArbitraryDeployment)\\n );\\n }\\n\\n /**\\n * Gets the owner of the whitelist.\\n */\\n function getOwner()\\n override\\n public\\n returns(\\n address\\n )\\n {\\n return Lib_Bytes32Utils.toAddress(\\n Lib_SafeExecutionManagerWrapper.safeSLOAD(\\n KEY_OWNER\\n )\\n );\\n }\\n\\n /**\\n * Adds or removes an address from the deployment whitelist.\\n * @param _deployer Address to update permissions for.\\n * @param _isWhitelisted Whether or not the address is whitelisted.\\n */\\n function setWhitelistedDeployer(\\n address _deployer,\\n bool _isWhitelisted\\n )\\n override\\n public\\n onlyOwner\\n {\\n Lib_SafeExecutionManagerWrapper.safeSSTORE(\\n Lib_Bytes32Utils.fromAddress(_deployer),\\n Lib_Bytes32Utils.fromBool(_isWhitelisted)\\n );\\n }\\n\\n /**\\n * Updates the owner of this contract.\\n * @param _owner Address of the new owner.\\n */\\n function setOwner(\\n address _owner\\n )\\n override\\n public\\n onlyOwner\\n {\\n Lib_SafeExecutionManagerWrapper.safeSSTORE(\\n KEY_OWNER,\\n Lib_Bytes32Utils.fromAddress(_owner)\\n );\\n }\\n\\n /**\\n * Updates the arbitrary deployment flag.\\n * @param _allowArbitraryDeployment Whether or not to allow arbitrary contract deployment.\\n */\\n function setAllowArbitraryDeployment(\\n bool _allowArbitraryDeployment\\n )\\n override\\n public\\n onlyOwner\\n {\\n Lib_SafeExecutionManagerWrapper.safeSSTORE(\\n KEY_ALLOW_ARBITRARY_DEPLOYMENT,\\n Lib_Bytes32Utils.fromBool(_allowArbitraryDeployment)\\n );\\n }\\n\\n /**\\n * Permanently enables arbitrary contract deployment and deletes the owner.\\n */\\n function enableArbitraryContractDeployment()\\n override\\n public\\n onlyOwner\\n {\\n setAllowArbitraryDeployment(true);\\n setOwner(address(0));\\n }\\n\\n /**\\n * Checks whether an address is allowed to deploy contracts.\\n * @param _deployer Address to check.\\n * @return _allowed Whether or not the address can deploy contracts.\\n */\\n function isDeployerAllowed(\\n address _deployer\\n )\\n override\\n public\\n returns (\\n bool _allowed\\n )\\n {\\n bool initialized = Lib_Bytes32Utils.toBool(\\n Lib_SafeExecutionManagerWrapper.safeSLOAD(KEY_INITIALIZED)\\n );\\n\\n if (initialized == false) {\\n return true;\\n }\\n\\n bool allowArbitraryDeployment = Lib_Bytes32Utils.toBool(\\n Lib_SafeExecutionManagerWrapper.safeSLOAD(KEY_ALLOW_ARBITRARY_DEPLOYMENT)\\n );\\n\\n if (allowArbitraryDeployment == true) {\\n return true;\\n }\\n\\n bool isWhitelisted = Lib_Bytes32Utils.toBool(\\n Lib_SafeExecutionManagerWrapper.safeSLOAD(\\n Lib_Bytes32Utils.fromAddress(_deployer)\\n )\\n );\\n\\n return isWhitelisted; \\n }\\n}\\n\",\"keccak256\":\"0x195ec68e19525110c89103602735662d3a534a559b5e4925a8cd4c2480825689\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/accounts/iOVM_ECDSAContractAccount.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title iOVM_ECDSAContractAccount\\n */\\ninterface iOVM_ECDSAContractAccount {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function execute(\\n bytes memory _transaction,\\n Lib_OVMCodec.EOASignatureType _signatureType,\\n uint8 _v,\\n bytes32 _r,\\n bytes32 _s\\n ) external returns (bool _success, bytes memory _returndata);\\n}\\n\",\"keccak256\":\"0x308729bc62dcffb11ff1d840781105cf1bf0dd4cbcfb1af704b800bb0cfe9b85\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_CanonicalTransactionChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title iOVM_CanonicalTransactionChain\\n */\\ninterface iOVM_CanonicalTransactionChain {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event TransactionEnqueued(\\n address _l1TxOrigin,\\n address _target,\\n uint256 _gasLimit,\\n bytes _data,\\n uint256 _queueIndex,\\n uint256 _timestamp\\n );\\n\\n event QueueBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event SequencerBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event TransactionBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct BatchContext {\\n uint256 numSequencedTransactions;\\n uint256 numSubsequentQueueTransactions;\\n uint256 timestamp;\\n uint256 blockNumber;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements()\\n external\\n view\\n returns (\\n uint256 _totalElements\\n );\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches()\\n external\\n view\\n returns (\\n uint256 _totalBatches\\n );\\n\\n /**\\n * Returns the index of the next element to be enqueued.\\n * @return Index for the next queue element.\\n */\\n function getNextQueueIndex()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Get the number of queue elements which have not yet been included.\\n * @return Length of the queue.\\n */\\n function getNumPendingQueueElements()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Retrieves the length of the queue, including\\n * both pending and canonical transactions.\\n * @return Length of the queue.\\n */\\n function getQueueLength()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Gets the queue element at a particular index.\\n * @param _index Index of the queue element to access.\\n * @return _element Queue element at the given index.\\n */\\n function getQueueElement(\\n uint256 _index\\n )\\n external\\n view\\n returns (\\n Lib_OVMCodec.QueueElement memory _element\\n );\\n\\n /**\\n * Adds a transaction to the queue.\\n * @param _target Target contract to send the transaction to.\\n * @param _gasLimit Gas limit for the given transaction.\\n * @param _data Transaction data.\\n */\\n function enqueue(\\n address _target,\\n uint256 _gasLimit,\\n bytes memory _data\\n )\\n external;\\n\\n /**\\n * Appends a given number of queued transactions as a single batch.\\n * @param _numQueuedTransactions Number of transactions to append.\\n */\\n function appendQueueBatch(\\n uint256 _numQueuedTransactions\\n )\\n external;\\n\\n /**\\n * Allows the sequencer to append a batch of transactions.\\n * @dev This function uses a custom encoding scheme for efficiency reasons.\\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\\n * .param _contexts Array of batch contexts.\\n * .param _transactionDataFields Array of raw transaction data.\\n */\\n function appendSequencerBatch(\\n // uint40 _shouldStartAtElement,\\n // uint24 _totalElementsToAppend,\\n // BatchContext[] _contexts,\\n // bytes[] _transactionDataFields\\n )\\n external;\\n\\n /**\\n * Verifies whether a transaction is included in the chain.\\n * @param _transaction Transaction to verify.\\n * @param _txChainElement Transaction chain element corresponding to the transaction.\\n * @param _batchHeader Header of the batch the transaction was included in.\\n * @param _inclusionProof Inclusion proof for the provided transaction chain element.\\n * @return True if the transaction exists in the CTC, false if not.\\n */\\n function verifyTransaction(\\n Lib_OVMCodec.Transaction memory _transaction,\\n Lib_OVMCodec.TransactionChainElement memory _txChainElement,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _inclusionProof\\n )\\n external\\n view\\n returns (\\n bool\\n );\\n}\\n\",\"keccak256\":\"0x82a4e62286c8bc5e2d3de33f66d9b707cb9636e553dca54b5e95277bd794a934\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_ChainStorageContainer.sol\":{\"content\":\"pragma solidity ^0.7.0;\\n\\n/**\\n * @title iOVM_ChainStorageContainer\\n */\\ninterface iOVM_ChainStorageContainer {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata()\\n external\\n view\\n returns (\\n bytes27\\n );\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length()\\n external\\n view\\n returns (\\n uint256\\n );\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(\\n bytes32 _object\\n )\\n external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(\\n bytes32 _object,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Pushes two objects into the container at the same time. A useful optimization.\\n * @param _objectA First 32 byte value to insert into the container.\\n * @param _objectB Second 32 byte value to insert into the container.\\n */\\n function push2(\\n bytes32 _objectA,\\n bytes32 _objectB\\n )\\n external;\\n\\n /**\\n * Pushes two objects into the container at the same time. Also allows setting the global\\n * metadata field.\\n * @param _objectA First 32 byte value to insert into the container.\\n * @param _objectB Second 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push2(\\n bytes32 _objectA,\\n bytes32 _objectB,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(\\n uint256 _index\\n )\\n external\\n view\\n returns (\\n bytes32\\n );\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index\\n )\\n external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Marks an index as overwritable, meaing the underlying buffer can start to write values over\\n * any objects before and including the given index.\\n */\\n function setNextOverwritableIndex(\\n uint256 _index\\n )\\n external;\\n}\\n\",\"keccak256\":\"0xcfca7da85b35d94c27581c2460b0d48fd0cc51fa72670cc7a2f7f760fb21a2f0\"},\"contracts/optimistic-ethereum/iOVM/execution/iOVM_ExecutionManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\ninterface iOVM_ExecutionManager {\\n /**********\\n * Enums *\\n *********/\\n\\n enum RevertFlag {\\n DID_NOT_REVERT,\\n OUT_OF_GAS,\\n INTENTIONAL_REVERT,\\n EXCEEDS_NUISANCE_GAS,\\n INVALID_STATE_ACCESS,\\n UNSAFE_BYTECODE,\\n CREATE_COLLISION,\\n STATIC_VIOLATION,\\n CREATE_EXCEPTION,\\n CREATOR_NOT_ALLOWED\\n }\\n\\n enum GasMetadataKey {\\n CURRENT_EPOCH_START_TIMESTAMP,\\n CUMULATIVE_SEQUENCER_QUEUE_GAS,\\n CUMULATIVE_L1TOL2_QUEUE_GAS,\\n PREV_EPOCH_SEQUENCER_QUEUE_GAS,\\n PREV_EPOCH_L1TOL2_QUEUE_GAS\\n }\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct GasMeterConfig {\\n uint256 minTransactionGasLimit;\\n uint256 maxTransactionGasLimit;\\n uint256 maxGasPerQueuePerEpoch;\\n uint256 secondsPerEpoch;\\n }\\n\\n struct GlobalContext {\\n uint256 ovmCHAINID;\\n }\\n\\n struct TransactionContext {\\n Lib_OVMCodec.QueueOrigin ovmL1QUEUEORIGIN;\\n uint256 ovmTIMESTAMP;\\n uint256 ovmNUMBER;\\n uint256 ovmGASLIMIT;\\n uint256 ovmTXGASLIMIT;\\n address ovmL1TXORIGIN;\\n }\\n\\n struct TransactionRecord {\\n uint256 ovmGasRefund;\\n }\\n\\n struct MessageContext {\\n address ovmCALLER;\\n address ovmADDRESS;\\n bool isStatic;\\n }\\n\\n struct MessageRecord {\\n uint256 nuisanceGasLeft;\\n RevertFlag revertFlag;\\n }\\n\\n\\n /************************************\\n * Transaction Execution Entrypoint *\\n ************************************/\\n\\n function run(\\n Lib_OVMCodec.Transaction calldata _transaction,\\n address _txStateManager\\n ) external;\\n\\n\\n /*******************\\n * Context Opcodes *\\n *******************/\\n\\n function ovmCALLER() external view returns (address _caller);\\n function ovmADDRESS() external view returns (address _address);\\n function ovmTIMESTAMP() external view returns (uint256 _timestamp);\\n function ovmNUMBER() external view returns (uint256 _number);\\n function ovmGASLIMIT() external view returns (uint256 _gasLimit);\\n function ovmCHAINID() external view returns (uint256 _chainId);\\n\\n\\n /**********************\\n * L2 Context Opcodes *\\n **********************/\\n\\n function ovmL1QUEUEORIGIN() external view returns (Lib_OVMCodec.QueueOrigin _queueOrigin);\\n function ovmL1TXORIGIN() external view returns (address _l1TxOrigin);\\n\\n\\n /*******************\\n * Halting Opcodes *\\n *******************/\\n\\n function ovmREVERT(bytes memory _data) external;\\n\\n\\n /*****************************\\n * Contract Creation Opcodes *\\n *****************************/\\n\\n function ovmCREATE(bytes memory _bytecode) external returns (address _contract);\\n function ovmCREATE2(bytes memory _bytecode, bytes32 _salt) external returns (address _contract);\\n\\n\\n /*******************************\\n * Account Abstraction Opcodes *\\n ******************************/\\n\\n function ovmGETNONCE() external returns (uint256 _nonce);\\n function ovmSETNONCE(uint256 _nonce) external;\\n function ovmCREATEEOA(bytes32 _messageHash, uint8 _v, bytes32 _r, bytes32 _s) external;\\n\\n\\n /****************************\\n * Contract Calling Opcodes *\\n ****************************/\\n\\n function ovmCALL(uint256 _gasLimit, address _address, bytes memory _calldata) external returns (bool _success, bytes memory _returndata);\\n function ovmSTATICCALL(uint256 _gasLimit, address _address, bytes memory _calldata) external returns (bool _success, bytes memory _returndata);\\n function ovmDELEGATECALL(uint256 _gasLimit, address _address, bytes memory _calldata) external returns (bool _success, bytes memory _returndata);\\n\\n\\n /****************************\\n * Contract Storage Opcodes *\\n ****************************/\\n\\n function ovmSLOAD(bytes32 _key) external returns (bytes32 _value);\\n function ovmSSTORE(bytes32 _key, bytes32 _value) external;\\n\\n\\n /*************************\\n * Contract Code Opcodes *\\n *************************/\\n\\n function ovmEXTCODECOPY(address _contract, uint256 _offset, uint256 _length) external returns (bytes memory _code);\\n function ovmEXTCODESIZE(address _contract) external returns (uint256 _size);\\n function ovmEXTCODEHASH(address _contract) external returns (bytes32 _hash);\\n\\n\\n /**************************************\\n * Public Functions: Execution Safety *\\n **************************************/\\n\\n function safeCREATE(address _address, bytes memory _bytecode) external;\\n\\n /***************************************\\n * Public Functions: Execution Context *\\n ***************************************/\\n\\n function getMaxTransactionGasLimit() external view returns (uint _maxTransactionGasLimit);\\n}\\n\",\"keccak256\":\"0xed2ea81fb87874b10ebd34339f0690107a841672941de37b405c2da2c285cff0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/execution/iOVM_SafetyChecker.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title iOVM_SafetyChecker\\n */\\ninterface iOVM_SafetyChecker {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function isBytecodeSafe(bytes calldata _bytecode) external view returns (bool);\\n}\\n\",\"keccak256\":\"0xc8a74aa7d179327dbc35b2dd8b805b76d7ea4dc031e043d957a73c2a136ff682\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/execution/iOVM_StateManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title iOVM_StateManager\\n */\\ninterface iOVM_StateManager {\\n\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n enum ItemState {\\n ITEM_UNTOUCHED,\\n ITEM_LOADED,\\n ITEM_CHANGED,\\n ITEM_COMMITTED\\n }\\n\\n /***************************\\n * Public Functions: Misc *\\n ***************************/\\n\\n function isAuthenticated(address _address) external view returns (bool);\\n\\n /***************************\\n * Public Functions: Setup *\\n ***************************/\\n\\n function owner() external view returns (address _owner);\\n function ovmExecutionManager() external view returns (address _ovmExecutionManager);\\n function setExecutionManager(address _ovmExecutionManager) external;\\n\\n\\n /************************************\\n * Public Functions: Account Access *\\n ************************************/\\n\\n function putAccount(address _address, Lib_OVMCodec.Account memory _account) external;\\n function putEmptyAccount(address _address) external;\\n function getAccount(address _address) external view returns (Lib_OVMCodec.Account memory _account);\\n function hasAccount(address _address) external view returns (bool _exists);\\n function hasEmptyAccount(address _address) external view returns (bool _exists);\\n function setAccountNonce(address _address, uint256 _nonce) external;\\n function getAccountNonce(address _address) external view returns (uint256 _nonce);\\n function getAccountEthAddress(address _address) external view returns (address _ethAddress);\\n function getAccountStorageRoot(address _address) external view returns (bytes32 _storageRoot);\\n function initPendingAccount(address _address) external;\\n function commitPendingAccount(address _address, address _ethAddress, bytes32 _codeHash) external;\\n function testAndSetAccountLoaded(address _address) external returns (bool _wasAccountAlreadyLoaded);\\n function testAndSetAccountChanged(address _address) external returns (bool _wasAccountAlreadyChanged);\\n function commitAccount(address _address) external returns (bool _wasAccountCommitted);\\n function incrementTotalUncommittedAccounts() external;\\n function getTotalUncommittedAccounts() external view returns (uint256 _total);\\n function wasAccountChanged(address _address) external view returns (bool);\\n function wasAccountCommitted(address _address) external view returns (bool);\\n\\n\\n /************************************\\n * Public Functions: Storage Access *\\n ************************************/\\n\\n function putContractStorage(address _contract, bytes32 _key, bytes32 _value) external;\\n function getContractStorage(address _contract, bytes32 _key) external view returns (bytes32 _value);\\n function hasContractStorage(address _contract, bytes32 _key) external returns (bool _exists);\\n function testAndSetContractStorageLoaded(address _contract, bytes32 _key) external returns (bool _wasContractStorageAlreadyLoaded);\\n function testAndSetContractStorageChanged(address _contract, bytes32 _key) external returns (bool _wasContractStorageAlreadyChanged);\\n function commitContractStorage(address _contract, bytes32 _key) external returns (bool _wasContractStorageCommitted);\\n function incrementTotalUncommittedContractStorage() external;\\n function getTotalUncommittedContractStorage() external view returns (uint256 _total);\\n function wasContractStorageChanged(address _contract, bytes32 _key) external view returns (bool);\\n function wasContractStorageCommitted(address _contract, bytes32 _key) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x18930f780c006c023ff13600917320286a56176724c45de6286a82ade19c0a5e\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/precompiles/iOVM_DeployerWhitelist.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title iOVM_DeployerWhitelist\\n */\\ninterface iOVM_DeployerWhitelist {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function initialize(address _owner, bool _allowArbitraryDeployment) external;\\n function getOwner() external returns (address _owner);\\n function setWhitelistedDeployer(address _deployer, bool _isWhitelisted) external;\\n function setOwner(address _newOwner) external;\\n function setAllowArbitraryDeployment(bool _allowArbitraryDeployment) external;\\n function enableArbitraryContractDeployment() external;\\n function isDeployerAllowed(address _deployer) external returns (bool _allowed);\\n}\\n\",\"keccak256\":\"0x969394371cacfc36493230150b6d629173ea72dfdf729330bede475b91d0f004\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/codec/Lib_OVMCodec.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../utils/Lib_Bytes32Utils.sol\\\";\\nimport { Lib_SafeExecutionManagerWrapper } from \\\"../../libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\\\";\\n\\n/**\\n * @title Lib_OVMCodec\\n */\\nlibrary Lib_OVMCodec {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n bytes constant internal RLP_NULL_BYTES = hex'80';\\n bytes constant internal NULL_BYTES = bytes('');\\n\\n // Ring buffer IDs\\n bytes32 constant internal RING_BUFFER_SCC_BATCHES = keccak256(\\\"RING_BUFFER_SCC_BATCHES\\\");\\n bytes32 constant internal RING_BUFFER_CTC_BATCHES = keccak256(\\\"RING_BUFFER_CTC_BATCHES\\\");\\n bytes32 constant internal RING_BUFFER_CTC_QUEUE = keccak256(\\\"RING_BUFFER_CTC_QUEUE\\\");\\n\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum EOASignatureType {\\n EIP155_TRANSACTON,\\n ETH_SIGNED_MESSAGE\\n }\\n\\n enum QueueOrigin {\\n SEQUENCER_QUEUE,\\n L1TOL2_QUEUE\\n }\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Account {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n address ethAddress;\\n bool isFresh;\\n }\\n\\n struct EVMAccount {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n }\\n\\n struct ChainBatchHeader {\\n uint256 batchIndex;\\n bytes32 batchRoot;\\n uint256 batchSize;\\n uint256 prevTotalElements;\\n bytes extraData;\\n }\\n\\n struct ChainInclusionProof {\\n uint256 index;\\n bytes32[] siblings;\\n }\\n\\n struct Transaction {\\n uint256 timestamp;\\n uint256 blockNumber;\\n QueueOrigin l1QueueOrigin;\\n address l1TxOrigin;\\n address entrypoint;\\n uint256 gasLimit;\\n bytes data;\\n }\\n\\n struct TransactionChainElement {\\n bool isSequenced;\\n uint256 queueIndex; // QUEUED TX ONLY\\n uint256 timestamp; // SEQUENCER TX ONLY\\n uint256 blockNumber; // SEQUENCER TX ONLY\\n bytes txData; // SEQUENCER TX ONLY\\n }\\n\\n struct QueueElement {\\n bytes32 queueRoot;\\n uint40 timestamp;\\n uint40 blockNumber;\\n }\\n\\n struct EIP155Transaction {\\n uint256 nonce;\\n uint256 gasPrice;\\n uint256 gasLimit;\\n address to;\\n uint256 value;\\n bytes data;\\n uint256 chainId;\\n }\\n\\n\\n /*********************************************\\n * Internal Functions: Encoding and Decoding *\\n *********************************************/\\n\\n /**\\n * Decodes an EOA transaction (i.e., native Ethereum RLP encoding).\\n * @param _transaction Encoded EOA transaction.\\n * @return _decoded Transaction decoded into a struct.\\n */\\n function decodeEIP155Transaction(\\n bytes memory _transaction,\\n bool _isEthSignedMessage\\n )\\n internal\\n pure\\n returns (\\n EIP155Transaction memory _decoded\\n )\\n {\\n if (_isEthSignedMessage) {\\n (\\n uint256 _nonce,\\n uint256 _gasLimit,\\n uint256 _gasPrice,\\n uint256 _chainId,\\n address _to,\\n bytes memory _data\\n ) = abi.decode(\\n _transaction,\\n (uint256, uint256, uint256, uint256, address ,bytes)\\n );\\n return EIP155Transaction({\\n nonce: _nonce,\\n gasPrice: _gasPrice,\\n gasLimit: _gasLimit,\\n to: _to,\\n value: 0,\\n data: _data,\\n chainId: _chainId\\n });\\n } else {\\n Lib_RLPReader.RLPItem[] memory decoded = Lib_RLPReader.readList(_transaction);\\n\\n return EIP155Transaction({\\n nonce: Lib_RLPReader.readUint256(decoded[0]),\\n gasPrice: Lib_RLPReader.readUint256(decoded[1]),\\n gasLimit: Lib_RLPReader.readUint256(decoded[2]),\\n to: Lib_RLPReader.readAddress(decoded[3]),\\n value: Lib_RLPReader.readUint256(decoded[4]),\\n data: Lib_RLPReader.readBytes(decoded[5]),\\n chainId: Lib_RLPReader.readUint256(decoded[6])\\n });\\n }\\n }\\n\\n function decompressEIP155Transaction(\\n bytes memory _transaction\\n )\\n internal\\n returns (\\n EIP155Transaction memory _decompressed\\n )\\n {\\n return EIP155Transaction({\\n gasLimit: Lib_BytesUtils.toUint24(_transaction, 0),\\n gasPrice: uint256(Lib_BytesUtils.toUint24(_transaction, 3)) * 1000000,\\n nonce: Lib_BytesUtils.toUint24(_transaction, 6),\\n to: Lib_BytesUtils.toAddress(_transaction, 9),\\n data: Lib_BytesUtils.slice(_transaction, 29),\\n chainId: Lib_SafeExecutionManagerWrapper.safeCHAINID(),\\n value: 0\\n });\\n }\\n\\n /**\\n * Encodes an EOA transaction back into the original transaction.\\n * @param _transaction EIP155transaction to encode.\\n * @param _isEthSignedMessage Whether or not this was an eth signed message.\\n * @return Encoded transaction.\\n */\\n function encodeEIP155Transaction(\\n EIP155Transaction memory _transaction,\\n bool _isEthSignedMessage\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n if (_isEthSignedMessage) {\\n return abi.encode(\\n _transaction.nonce,\\n _transaction.gasLimit,\\n _transaction.gasPrice,\\n _transaction.chainId,\\n _transaction.to,\\n _transaction.data\\n );\\n } else {\\n bytes[] memory raw = new bytes[](9);\\n\\n raw[0] = Lib_RLPWriter.writeUint(_transaction.nonce);\\n raw[1] = Lib_RLPWriter.writeUint(_transaction.gasPrice);\\n raw[2] = Lib_RLPWriter.writeUint(_transaction.gasLimit);\\n if (_transaction.to == address(0)) {\\n raw[3] = Lib_RLPWriter.writeBytes('');\\n } else {\\n raw[3] = Lib_RLPWriter.writeAddress(_transaction.to);\\n }\\n raw[4] = Lib_RLPWriter.writeUint(0);\\n raw[5] = Lib_RLPWriter.writeBytes(_transaction.data);\\n raw[6] = Lib_RLPWriter.writeUint(_transaction.chainId);\\n raw[7] = Lib_RLPWriter.writeBytes(bytes(''));\\n raw[8] = Lib_RLPWriter.writeBytes(bytes(''));\\n\\n return Lib_RLPWriter.writeList(raw);\\n }\\n }\\n\\n /**\\n * Encodes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return _encoded Encoded transaction bytes.\\n */\\n function encodeTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes memory _encoded\\n )\\n {\\n return abi.encodePacked(\\n _transaction.timestamp,\\n _transaction.blockNumber,\\n _transaction.l1QueueOrigin,\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n );\\n }\\n\\n /**\\n * Hashes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return _hash Hashed transaction\\n */\\n function hashTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes32 _hash\\n )\\n {\\n return keccak256(encodeTransaction(_transaction));\\n }\\n\\n /**\\n * Converts an OVM account to an EVM account.\\n * @param _in OVM account to convert.\\n * @return _out Converted EVM account.\\n */\\n function toEVMAccount(\\n Account memory _in\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory _out\\n )\\n {\\n return EVMAccount({\\n nonce: _in.nonce,\\n balance: _in.balance,\\n storageRoot: _in.storageRoot,\\n codeHash: _in.codeHash\\n });\\n }\\n\\n /**\\n * @notice RLP-encodes an account state struct.\\n * @param _account Account state struct.\\n * @return _encoded RLP-encoded account state.\\n */\\n function encodeEVMAccount(\\n EVMAccount memory _account\\n )\\n internal\\n pure\\n returns (\\n bytes memory _encoded\\n )\\n {\\n bytes[] memory raw = new bytes[](4);\\n\\n // Unfortunately we can't create this array outright because\\n // Lib_RLPWriter.writeList will reject fixed-size arrays. Assigning\\n // index-by-index circumvents this issue.\\n raw[0] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.nonce)\\n )\\n );\\n raw[1] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.balance)\\n )\\n );\\n raw[2] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.storageRoot));\\n raw[3] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.codeHash));\\n\\n return Lib_RLPWriter.writeList(raw);\\n }\\n\\n /**\\n * @notice Decodes an RLP-encoded account state into a useful struct.\\n * @param _encoded RLP-encoded account state.\\n * @return _account Account state struct.\\n */\\n function decodeEVMAccount(\\n bytes memory _encoded\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory _account\\n )\\n {\\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\\n\\n return EVMAccount({\\n nonce: Lib_RLPReader.readUint256(accountState[0]),\\n balance: Lib_RLPReader.readUint256(accountState[1]),\\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\\n });\\n }\\n\\n /**\\n * Calculates a hash for a given batch header.\\n * @param _batchHeader Header to hash.\\n * @return _hash Hash of the header.\\n */\\n function hashBatchHeader(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n internal\\n pure\\n returns (\\n bytes32 _hash\\n )\\n {\\n return keccak256(\\n abi.encode(\\n _batchHeader.batchRoot,\\n _batchHeader.batchSize,\\n _batchHeader.prevTotalElements,\\n _batchHeader.extraData\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0x19d78734777b4998f1544e235cf3934f20c5055cd76c2bd60bf0f6dacdd72b3a\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// +build ovm\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Contract Imports */\\nimport { Ownable } from \\\"./Lib_Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n /*******************************************\\n * Contract Variables: Internal Accounting *\\n *******************************************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n public\\n onlyOwner\\n {\\n emit AddressSet(_name, _address);\\n addresses[_getNameHash(_name)] = _address;\\n }\\n\\n function getAddress(\\n string memory _name\\n )\\n public\\n view\\n returns (address)\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32 _hash\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xdf802e1cc6474df913626991e9fca3835c620a519f397afe04bf9c260e723257\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// +build ovm\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\ncontract Lib_AddressResolver {\\n\\n /*******************************************\\n * Contract Variables: Contract References *\\n *******************************************/\\n\\n Lib_AddressManager internal libAddressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(\\n address _libAddressManager\\n ) public {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function resolve(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address _contract\\n )\\n {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0xf3b9d78b309ddeec259ce3e0e1cfdef3ca40938e9a81971b28ce2b8ea327f533\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// +build ovm\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Ownable\\n * @dev Adapted from https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol\\n */\\nabstract contract Ownable {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n address public owner;\\n\\n\\n /**********\\n * Events *\\n **********/\\n\\n event OwnershipTransferred(\\n address indexed previousOwner,\\n address indexed newOwner\\n );\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n constructor() internal {\\n owner = msg.sender;\\n emit OwnershipTransferred(address(0), owner);\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n owner == msg.sender,\\n \\\"Ownable: caller is not the owner\\\"\\n );\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function renounceOwnership()\\n public\\n virtual\\n onlyOwner\\n {\\n emit OwnershipTransferred(owner, address(0));\\n owner = address(0);\\n }\\n\\n function transferOwnership(address _newOwner)\\n public\\n virtual\\n onlyOwner\\n {\\n require(\\n _newOwner != address(0),\\n \\\"Ownable: new owner cannot be the zero address\\\"\\n );\\n\\n emit OwnershipTransferred(owner, _newOwner);\\n owner = _newOwner;\\n }\\n}\\n\",\"keccak256\":\"0xe0409fbd236d16ca6be439d9d97dd36d0d9a0697ee0062d49588b9d29c248e47\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPReader.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.7.0;\\n\\n/**\\n * @title Lib_RLPReader\\n * @dev Adapted from \\\"RLPReader\\\" by Hamdi Allam (hamdi.allam97@gmail.com).\\n */\\nlibrary Lib_RLPReader {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 constant internal MAX_LIST_LENGTH = 32;\\n\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum RLPItemType {\\n DATA_ITEM,\\n LIST_ITEM\\n }\\n\\n \\n /***********\\n * Structs *\\n ***********/\\n\\n struct RLPItem {\\n uint256 length;\\n uint256 ptr;\\n }\\n \\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n \\n /**\\n * Converts bytes to a reference to memory position and length.\\n * @param _in Input bytes to convert.\\n * @return Output memory reference.\\n */\\n function toRLPItem(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem memory\\n )\\n {\\n uint256 ptr;\\n assembly {\\n ptr := add(_in, 32)\\n }\\n\\n return RLPItem({\\n length: _in.length,\\n ptr: ptr\\n });\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n (\\n uint256 listOffset,\\n ,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.LIST_ITEM,\\n \\\"Invalid RLP list value.\\\"\\n );\\n\\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\\n // writing to the length. Since we can't know the number of RLP items without looping over\\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\\n // simply set a reasonable maximum list length and decrease the size before we finish.\\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\\n\\n uint256 itemCount = 0;\\n uint256 offset = listOffset;\\n while (offset < _in.length) {\\n require(\\n itemCount < MAX_LIST_LENGTH,\\n \\\"Provided RLP list exceeds max list length.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n ) = _decodeLength(RLPItem({\\n length: _in.length - offset,\\n ptr: _in.ptr + offset\\n }));\\n\\n out[itemCount] = RLPItem({\\n length: itemLength + itemOffset,\\n ptr: _in.ptr + offset\\n });\\n\\n itemCount += 1;\\n offset += itemOffset + itemLength;\\n }\\n\\n // Decrease the array size to match the actual item count.\\n assembly {\\n mstore(out, itemCount)\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n return readList(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes value.\\\"\\n );\\n\\n return _copy(_in.ptr, itemOffset, itemLength);\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return readBytes(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return string(readBytes(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return readString(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n require(\\n _in.length <= 33,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr + itemOffset;\\n bytes32 out;\\n assembly {\\n out := mload(ptr)\\n\\n // Shift the bytes over to match the item size.\\n if lt(itemLength, 32) {\\n out := div(out, exp(256, sub(32, itemLength)))\\n }\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return readBytes32(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return uint256(readBytes32(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return readUint256(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n require(\\n _in.length == 1,\\n \\\"Invalid RLP boolean value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 out;\\n assembly {\\n out := byte(0, mload(ptr))\\n }\\n\\n return out != 0;\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return readBool(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n if (_in.length == 1) {\\n return address(0);\\n }\\n\\n require(\\n _in.length == 21,\\n \\\"Invalid RLP address value.\\\"\\n );\\n\\n return address(readUint256(_in));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return readAddress(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads the raw bytes of an RLP item.\\n * @param _in RLP item to read.\\n * @return Raw RLP bytes.\\n */\\n function readRawBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in);\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Decodes the length of an RLP item.\\n * @param _in RLP item to decode.\\n * @return Offset of the encoded data.\\n * @return Length of the encoded data.\\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\\n */\\n function _decodeLength(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n uint256,\\n uint256,\\n RLPItemType\\n )\\n {\\n require(\\n _in.length > 0,\\n \\\"RLP item cannot be null.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 prefix;\\n assembly {\\n prefix := byte(0, mload(ptr))\\n }\\n\\n if (prefix <= 0x7f) {\\n // Single byte.\\n\\n return (0, 1, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xb7) {\\n // Short string.\\n\\n uint256 strLen = prefix - 0x80;\\n \\n require(\\n _in.length > strLen,\\n \\\"Invalid RLP short string.\\\"\\n );\\n\\n return (1, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xbf) {\\n // Long string.\\n uint256 lenOfStrLen = prefix - 0xb7;\\n\\n require(\\n _in.length > lenOfStrLen,\\n \\\"Invalid RLP long string length.\\\"\\n );\\n\\n uint256 strLen;\\n assembly {\\n // Pick out the string length.\\n strLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfStrLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfStrLen + strLen,\\n \\\"Invalid RLP long string.\\\"\\n );\\n\\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xf7) {\\n // Short list.\\n uint256 listLen = prefix - 0xc0;\\n\\n require(\\n _in.length > listLen,\\n \\\"Invalid RLP short list.\\\"\\n );\\n\\n return (1, listLen, RLPItemType.LIST_ITEM);\\n } else {\\n // Long list.\\n uint256 lenOfListLen = prefix - 0xf7;\\n\\n require(\\n _in.length > lenOfListLen,\\n \\\"Invalid RLP long list length.\\\"\\n );\\n\\n uint256 listLen;\\n assembly {\\n // Pick out the list length.\\n listLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfListLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfListLen + listLen,\\n \\\"Invalid RLP long list.\\\"\\n );\\n\\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\\n }\\n }\\n\\n /**\\n * Copies the bytes from a memory location.\\n * @param _src Pointer to the location to read from.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Copied bytes.\\n */\\n function _copy(\\n uint256 _src,\\n uint256 _offset,\\n uint256 _length\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out = new bytes(_length);\\n if (out.length == 0) {\\n return out;\\n }\\n\\n uint256 src = _src + _offset;\\n uint256 dest;\\n assembly {\\n dest := add(out, 32)\\n }\\n\\n // Copy over as many complete words as we can.\\n for (uint256 i = 0; i < _length / 32; i++) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n\\n src += 32;\\n dest += 32;\\n }\\n\\n // Pick out the remaining bytes.\\n uint256 mask = 256 ** (32 - (_length % 32)) - 1;\\n assembly {\\n mstore(\\n dest,\\n or(\\n and(mload(src), not(mask)),\\n and(mload(dest), mask)\\n )\\n )\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Copies an RLP item into bytes.\\n * @param _in RLP item to copy.\\n * @return Copied bytes.\\n */\\n function _copy(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in.ptr, 0, _in.length);\\n }\\n}\\n\",\"keccak256\":\"0x8338f7b6e5f0ded8fc36d9088fd127ee53ae4040ca3f4838eb6123f642d38c62\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPWriter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.7.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\n\\n/**\\n * @title Lib_RLPWriter\\n * @author Bakaoh (with modifications)\\n */\\nlibrary Lib_RLPWriter {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * RLP encodes a byte string.\\n * @param _in The byte string to encode.\\n * @return _out The RLP encoded string in bytes.\\n */\\n function writeBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n bytes memory encoded;\\n\\n if (_in.length == 1 && uint8(_in[0]) < 128) {\\n encoded = _in;\\n } else {\\n encoded = Lib_BytesUtils.concat(_writeLength(_in.length, 128), _in);\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * RLP encodes a list of RLP encoded byte byte strings.\\n * @param _in The list of RLP encoded byte strings.\\n * @return _out The RLP encoded list of items in bytes.\\n */\\n function writeList(\\n bytes[] memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n bytes memory list = _flatten(_in);\\n return Lib_BytesUtils.concat(_writeLength(list.length, 192), list);\\n }\\n\\n /**\\n * RLP encodes a string.\\n * @param _in The string to encode.\\n * @return _out The RLP encoded string in bytes.\\n */\\n function writeString(\\n string memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(bytes(_in));\\n }\\n\\n /**\\n * RLP encodes an address.\\n * @param _in The address to encode.\\n * @return _out The RLP encoded address in bytes.\\n */\\n function writeAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a uint.\\n * @param _in The uint256 to encode.\\n * @return _out The RLP encoded uint256 in bytes.\\n */\\n function writeUint(\\n uint256 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(_toBinary(_in));\\n }\\n\\n /**\\n * RLP encodes a bool.\\n * @param _in The bool to encode.\\n * @return _out The RLP encoded bool in bytes.\\n */\\n function writeBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n bytes memory encoded = new bytes(1);\\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\\n return encoded;\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\\n * @param _len The length of the string or the payload.\\n * @param _offset 128 if item is string, 192 if item is list.\\n * @return _encoded RLP encoded bytes.\\n */\\n function _writeLength(\\n uint256 _len,\\n uint256 _offset\\n )\\n private\\n pure\\n returns (\\n bytes memory _encoded\\n )\\n {\\n bytes memory encoded;\\n\\n if (_len < 56) {\\n encoded = new bytes(1);\\n encoded[0] = byte(uint8(_len) + uint8(_offset));\\n } else {\\n uint256 lenLen;\\n uint256 i = 1;\\n while (_len / i != 0) {\\n lenLen++;\\n i *= 256;\\n }\\n\\n encoded = new bytes(lenLen + 1);\\n encoded[0] = byte(uint8(lenLen) + uint8(_offset) + 55);\\n for(i = 1; i <= lenLen; i++) {\\n encoded[i] = byte(uint8((_len / (256**(lenLen-i))) % 256));\\n }\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * Encode integer in big endian binary form with no leading zeroes.\\n * @notice TODO: This should be optimized with assembly to save gas costs.\\n * @param _x The integer to encode.\\n * @return _binary RLP encoded bytes.\\n */\\n function _toBinary(\\n uint256 _x\\n )\\n private\\n pure\\n returns (\\n bytes memory _binary\\n )\\n {\\n bytes memory b = abi.encodePacked(_x);\\n\\n uint256 i = 0;\\n for (; i < 32; i++) {\\n if (b[i] != 0) {\\n break;\\n }\\n }\\n\\n bytes memory res = new bytes(32 - i);\\n for (uint256 j = 0; j < res.length; j++) {\\n res[j] = b[i++];\\n }\\n\\n return res;\\n }\\n\\n /**\\n * Copies a piece of memory to another location.\\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\\n * @param _dest Destination location.\\n * @param _src Source location.\\n * @param _len Length of memory to copy.\\n */\\n function _memcpy(\\n uint256 _dest,\\n uint256 _src,\\n uint256 _len\\n )\\n private\\n pure\\n {\\n uint256 dest = _dest;\\n uint256 src = _src;\\n uint256 len = _len;\\n\\n for(; len >= 32; len -= 32) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n dest += 32;\\n src += 32;\\n }\\n\\n uint256 mask = 256 ** (32 - len) - 1;\\n assembly {\\n let srcpart := and(mload(src), not(mask))\\n let destpart := and(mload(dest), mask)\\n mstore(dest, or(destpart, srcpart))\\n }\\n }\\n\\n /**\\n * Flattens a list of byte strings into one byte string.\\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\\n * @param _list List of byte strings to flatten.\\n * @return _flattened The flattened byte string.\\n */\\n function _flatten(\\n bytes[] memory _list\\n )\\n private\\n pure\\n returns (\\n bytes memory _flattened\\n )\\n {\\n if (_list.length == 0) {\\n return new bytes(0);\\n }\\n\\n uint256 len;\\n uint256 i = 0;\\n for (; i < _list.length; i++) {\\n len += _list[i].length;\\n }\\n\\n bytes memory flattened = new bytes(len);\\n uint256 flattenedPtr;\\n assembly { flattenedPtr := add(flattened, 0x20) }\\n\\n for(i = 0; i < _list.length; i++) {\\n bytes memory item = _list[i];\\n\\n uint256 listPtr;\\n assembly { listPtr := add(item, 0x20)}\\n\\n _memcpy(flattenedPtr, listPtr, item.length);\\n flattenedPtr += _list[i].length;\\n }\\n\\n return flattened;\\n }\\n}\",\"keccak256\":\"0x6d1aaef567f8a91bb965b95a95637f433a1f0ac4cf0bc1e209cdb1dd5b0f204b\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_Bytes32Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.7.0;\\n\\n/**\\n * @title Lib_Byte32Utils\\n */\\nlibrary Lib_Bytes32Utils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function toBool(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bool _out\\n )\\n {\\n return _in != 0;\\n }\\n\\n function fromBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes32 _out\\n )\\n {\\n return bytes32(uint256(_in ? 1 : 0));\\n }\\n\\n function toAddress(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n address _out\\n )\\n {\\n return address(uint160(uint256(_in)));\\n }\\n\\n function fromAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes32 _out\\n )\\n {\\n return bytes32(uint256(_in));\\n }\\n\\n function removeLeadingZeros(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n bytes memory out;\\n\\n assembly {\\n // Figure out how many leading zero bytes to remove.\\n let shift := 0\\n for { let i := 0 } and(lt(i, 32), eq(byte(i, _in), 0)) { i := add(i, 1) } {\\n shift := add(shift, 1)\\n }\\n\\n // Reserve some space for our output and fix the free memory pointer.\\n out := mload(0x40)\\n mstore(0x40, add(out, 0x40))\\n\\n // Shift the value and store it into the output bytes.\\n mstore(add(out, 0x20), shl(mul(shift, 8), _in))\\n\\n // Store the new size (with leading zero bytes removed) in the output byte size.\\n mstore(out, sub(32, shift))\\n }\\n\\n return out;\\n }\\n}\\n\",\"keccak256\":\"0x06f97590a80a01daa3bf6aa795449aea91a78684c646b4a6caeece8ef919c80c\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_BytesUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.7.0;\\n\\n/**\\n * @title Lib_BytesUtils\\n */\\nlibrary Lib_BytesUtils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function concat(\\n bytes memory _preBytes,\\n bytes memory _postBytes\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n bytes memory tempBytes;\\n\\n assembly {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // Store the length of the first bytes array at the beginning of\\n // the memory for tempBytes.\\n let length := mload(_preBytes)\\n mstore(tempBytes, length)\\n\\n // Maintain a memory counter for the current write location in the\\n // temp bytes array by adding the 32 bytes for the array length to\\n // the starting location.\\n let mc := add(tempBytes, 0x20)\\n // Stop copying when the memory counter reaches the length of the\\n // first bytes array.\\n let end := add(mc, length)\\n\\n for {\\n // Initialize a copy counter to the start of the _preBytes data,\\n // 32 bytes into its memory.\\n let cc := add(_preBytes, 0x20)\\n } lt(mc, end) {\\n // Increase both counters by 32 bytes each iteration.\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n // Write the _preBytes data into the tempBytes memory 32 bytes\\n // at a time.\\n mstore(mc, mload(cc))\\n }\\n\\n // Add the length of _postBytes to the current length of tempBytes\\n // and store it as the new length in the first 32 bytes of the\\n // tempBytes memory.\\n length := mload(_postBytes)\\n mstore(tempBytes, add(length, mload(tempBytes)))\\n\\n // Move the memory counter back from a multiple of 0x20 to the\\n // actual end of the _preBytes data.\\n mc := end\\n // Stop copying when the memory counter reaches the new combined\\n // length of the arrays.\\n end := add(mc, length)\\n\\n for {\\n let cc := add(_postBytes, 0x20)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n // Update the free-memory pointer by padding our last write location\\n // to 32 bytes: add 31 bytes to the end of tempBytes to move to the\\n // next 32 byte block, then round down to the nearest multiple of\\n // 32. If the sum of the length of the two arrays is zero then add\\n // one before rounding down to leave a blank 32 bytes (the length block with 0).\\n mstore(0x40, and(\\n add(add(end, iszero(add(length, mload(_preBytes)))), 31),\\n not(31) // Round down to the nearest 32 bytes.\\n ))\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_start + _length >= _start, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n if (_bytes.length - _start == 0) {\\n return bytes('');\\n }\\n\\n return slice(_bytes, _start, _bytes.length - _start);\\n }\\n\\n function toBytes32PadLeft(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes32)\\n {\\n bytes32 ret;\\n uint256 len = _bytes.length <= 32 ? _bytes.length : 32;\\n assembly {\\n ret := shr(mul(sub(32, len), 8), mload(add(_bytes, 32)))\\n }\\n return ret;\\n }\\n\\n function toBytes32(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes32)\\n {\\n if (_bytes.length < 32) {\\n bytes32 ret;\\n assembly {\\n ret := mload(add(_bytes, 32))\\n }\\n return ret;\\n }\\n\\n return abi.decode(_bytes,(bytes32)); // will truncate if input length > 32 bytes\\n }\\n\\n function toUint256(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (uint256)\\n {\\n return uint256(toBytes32(_bytes));\\n }\\n\\n function toUint24(bytes memory _bytes, uint256 _start) internal pure returns (uint24) {\\n require(_start + 3 >= _start, \\\"toUint24_overflow\\\");\\n require(_bytes.length >= _start + 3 , \\\"toUint24_outOfBounds\\\");\\n uint24 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x3), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toUint8(bytes memory _bytes, uint256 _start) internal pure returns (uint8) {\\n require(_start + 1 >= _start, \\\"toUint8_overflow\\\");\\n require(_bytes.length >= _start + 1 , \\\"toUint8_outOfBounds\\\");\\n uint8 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x1), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toAddress(bytes memory _bytes, uint256 _start) internal pure returns (address) {\\n require(_start + 20 >= _start, \\\"toAddress_overflow\\\");\\n require(_bytes.length >= _start + 20, \\\"toAddress_outOfBounds\\\");\\n address tempAddress;\\n\\n assembly {\\n tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000)\\n }\\n\\n return tempAddress;\\n }\\n\\n function toNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n bytes memory nibbles = new bytes(_bytes.length * 2);\\n\\n for (uint256 i = 0; i < _bytes.length; i++) {\\n nibbles[i * 2] = _bytes[i] >> 4;\\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\\n }\\n\\n return nibbles;\\n }\\n\\n function fromNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n bytes memory ret = new bytes(_bytes.length / 2);\\n\\n for (uint256 i = 0; i < ret.length; i++) {\\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\\n }\\n\\n return ret;\\n }\\n\\n function equal(\\n bytes memory _bytes,\\n bytes memory _other\\n )\\n internal\\n pure\\n returns (bool)\\n {\\n return keccak256(_bytes) == keccak256(_other);\\n }\\n}\\n\",\"keccak256\":\"0x849e4fedd81cd260e4c3b74b953f00636323574c60d363f36ab331e94aab9219\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_ECDSAUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.7.0;\\n\\n/**\\n * @title Lib_ECDSAUtils\\n */\\nlibrary Lib_ECDSAUtils {\\n\\n /**************************************\\n * Internal Functions: ECDSA Recovery *\\n **************************************/\\n\\n /**\\n * Recovers a signed address given a message and signature.\\n * @param _message Message that was originally signed.\\n * @param _isEthSignedMessage Whether or not the user used the `Ethereum Signed Message` prefix.\\n * @param _v Signature `v` parameter.\\n * @param _r Signature `r` parameter.\\n * @param _s Signature `s` parameter.\\n * @return _sender Signer address.\\n */\\n function recover(\\n bytes memory _message,\\n bool _isEthSignedMessage,\\n uint8 _v,\\n bytes32 _r,\\n bytes32 _s\\n )\\n internal\\n pure\\n returns (\\n address _sender\\n )\\n {\\n bytes32 messageHash = getMessageHash(_message, _isEthSignedMessage);\\n\\n return ecrecover(\\n messageHash,\\n _v + 27,\\n _r,\\n _s\\n );\\n }\\n\\n function getMessageHash(\\n bytes memory _message,\\n bool _isEthSignedMessage\\n )\\n internal\\n pure\\n returns (bytes32) {\\n if (_isEthSignedMessage) {\\n return getEthSignedMessageHash(_message);\\n }\\n return getNativeMessageHash(_message);\\n }\\n\\n\\n /*************************************\\n * Private Functions: ECDSA Recovery *\\n *************************************/\\n\\n /**\\n * Gets the native message hash (simple keccak256) for a message.\\n * @param _message Message to hash.\\n * @return _messageHash Native message hash.\\n */\\n function getNativeMessageHash(\\n bytes memory _message\\n )\\n private\\n pure\\n returns (\\n bytes32 _messageHash\\n )\\n {\\n return keccak256(_message);\\n }\\n\\n /**\\n * Gets the hash of a message with the `Ethereum Signed Message` prefix.\\n * @param _message Message to hash.\\n * @return _messageHash Prefixed message hash.\\n */\\n function getEthSignedMessageHash(\\n bytes memory _message\\n )\\n private\\n pure\\n returns (\\n bytes32 _messageHash\\n )\\n {\\n bytes memory prefix = \\\"\\\\x19Ethereum Signed Message:\\\\n32\\\";\\n bytes32 messageHash = keccak256(_message);\\n return keccak256(abi.encodePacked(prefix, messageHash));\\n }\\n}\",\"keccak256\":\"0x7d6a4cb0f462bfbd9fa703a8ab95156a5f066a15aeeb8e683c90c93fc71736f2\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_EthUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.7.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"./Lib_Bytes32Utils.sol\\\";\\n\\n/**\\n * @title Lib_EthUtils\\n */\\nlibrary Lib_EthUtils {\\n\\n /***********************************\\n * Internal Functions: Code Access *\\n ***********************************/\\n\\n /**\\n * Gets the code for a given address.\\n * @param _address Address to get code for.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return _code Code read from the contract.\\n */\\n function getCode(\\n address _address,\\n uint256 _offset,\\n uint256 _length\\n )\\n internal\\n view\\n returns (\\n bytes memory _code\\n )\\n {\\n assembly {\\n _code := mload(0x40)\\n mstore(0x40, add(_code, add(_length, 0x20)))\\n mstore(_code, _length)\\n extcodecopy(_address, add(_code, 0x20), _offset, _length)\\n }\\n\\n return _code;\\n }\\n\\n /**\\n * Gets the full code for a given address.\\n * @param _address Address to get code for.\\n * @return _code Full code of the contract.\\n */\\n function getCode(\\n address _address\\n )\\n internal\\n view\\n returns (\\n bytes memory _code\\n )\\n {\\n return getCode(\\n _address,\\n 0,\\n getCodeSize(_address)\\n );\\n }\\n\\n /**\\n * Gets the size of a contract's code in bytes.\\n * @param _address Address to get code size for.\\n * @return _codeSize Size of the contract's code in bytes.\\n */\\n function getCodeSize(\\n address _address\\n )\\n internal\\n view\\n returns (\\n uint256 _codeSize\\n )\\n {\\n assembly {\\n _codeSize := extcodesize(_address)\\n }\\n\\n return _codeSize;\\n }\\n\\n /**\\n * Gets the hash of a contract's code.\\n * @param _address Address to get a code hash for.\\n * @return _codeHash Hash of the contract's code.\\n */\\n function getCodeHash(\\n address _address\\n )\\n internal\\n view\\n returns (\\n bytes32 _codeHash\\n )\\n {\\n assembly {\\n _codeHash := extcodehash(_address)\\n }\\n\\n return _codeHash;\\n }\\n\\n\\n /*****************************************\\n * Internal Functions: Contract Creation *\\n *****************************************/\\n\\n /**\\n * Creates a contract with some given initialization code.\\n * @param _code Contract initialization code.\\n * @return _created Address of the created contract.\\n */\\n function createContract(\\n bytes memory _code\\n )\\n internal\\n returns (\\n address _created\\n )\\n {\\n assembly {\\n _created := create(\\n 0,\\n add(_code, 0x20),\\n mload(_code)\\n )\\n }\\n\\n return _created;\\n }\\n\\n /**\\n * Computes the address that would be generated by CREATE.\\n * @param _creator Address creating the contract.\\n * @param _nonce Creator's nonce.\\n * @return _address Address to be generated by CREATE.\\n */\\n function getAddressForCREATE(\\n address _creator,\\n uint256 _nonce\\n )\\n internal\\n pure\\n returns (\\n address _address\\n )\\n {\\n bytes[] memory encoded = new bytes[](2);\\n encoded[0] = Lib_RLPWriter.writeAddress(_creator);\\n encoded[1] = Lib_RLPWriter.writeUint(_nonce);\\n\\n bytes memory encodedList = Lib_RLPWriter.writeList(encoded);\\n return Lib_Bytes32Utils.toAddress(keccak256(encodedList));\\n }\\n\\n /**\\n * Computes the address that would be generated by CREATE2.\\n * @param _creator Address creating the contract.\\n * @param _bytecode Bytecode of the contract to be created.\\n * @param _salt 32 byte salt value mixed into the hash.\\n * @return _address Address to be generated by CREATE2.\\n */\\n function getAddressForCREATE2(\\n address _creator,\\n bytes memory _bytecode,\\n bytes32 _salt\\n )\\n internal\\n pure\\n returns (address _address)\\n {\\n bytes32 hashedData = keccak256(abi.encodePacked(\\n byte(0xff),\\n _creator,\\n _salt,\\n keccak256(_bytecode)\\n ));\\n\\n return Lib_Bytes32Utils.toAddress(hashedData);\\n }\\n}\\n\",\"keccak256\":\"0x9cc5440ff8fbe2fea9faf929a5a16a172bfaebedca26b8bafbf4ed459038f1e2\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.7.0;\\n\\n/**\\n * @title Lib_Math\\n */\\nlibrary Lib_Math {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Calculates the minumum of two numbers.\\n * @param _x First number to compare.\\n * @param _y Second number to compare.\\n * @return Lesser of the two numbers.\\n */\\n function min(\\n uint256 _x,\\n uint256 _y\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n if (_x < _y) {\\n return _x;\\n }\\n\\n return _y;\\n }\\n}\\n\",\"keccak256\":\"0x0f5a022dfc2b4dbbc330198c6045446fbcae8ef2171d4e3466eb5e510b368f14\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_MerkleTree.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.7.0;\\n\\n/**\\n * @title Lib_MerkleTree\\n * @author River Keefer\\n */\\nlibrary Lib_MerkleTree {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Calculates a merkle root for a list of 32-byte leaf hashes. WARNING: If the number\\n * of leaves passed in is not a power of two, it pads out the tree with zero hashes.\\n * If you do not know the original length of elements for the tree you are verifying,\\n * then this may allow empty leaves past _elements.length to pass a verification check down the line.\\n * @param _elements Array of hashes from which to generate a merkle root.\\n * @return Merkle root of the leaves, with zero hashes for non-powers-of-two (see above).\\n */\\n function getMerkleRoot(\\n bytes32[] memory _elements\\n )\\n internal\\n view\\n returns (\\n bytes32\\n )\\n {\\n require(\\n _elements.length > 0,\\n \\\"Lib_MerkleTree: Must provide at least one leaf hash.\\\"\\n );\\n\\n if (_elements.length == 0) {\\n return _elements[0];\\n }\\n\\n uint256[16] memory defaults = [\\n 0x290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563,\\n 0x633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d,\\n 0x890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d,\\n 0x3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd8,\\n 0xecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da,\\n 0xdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da5,\\n 0x617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d7,\\n 0x292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead,\\n 0xe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e10,\\n 0x7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f82,\\n 0xe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e83636516,\\n 0x3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c,\\n 0xad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e,\\n 0xa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab,\\n 0x4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c862,\\n 0x2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf10\\n ];\\n\\n // Reserve memory space for our hashes.\\n bytes memory buf = new bytes(64);\\n\\n // We'll need to keep track of left and right siblings.\\n bytes32 leftSibling;\\n bytes32 rightSibling;\\n\\n // Number of non-empty nodes at the current depth.\\n uint256 rowSize = _elements.length;\\n\\n // Current depth, counting from 0 at the leaves\\n uint256 depth = 0;\\n\\n // Common sub-expressions\\n uint256 halfRowSize; // rowSize / 2\\n bool rowSizeIsOdd; // rowSize % 2 == 1\\n\\n while (rowSize > 1) {\\n halfRowSize = rowSize / 2;\\n rowSizeIsOdd = rowSize % 2 == 1;\\n\\n for (uint256 i = 0; i < halfRowSize; i++) {\\n leftSibling = _elements[(2 * i) ];\\n rightSibling = _elements[(2 * i) + 1];\\n assembly {\\n mstore(add(buf, 32), leftSibling )\\n mstore(add(buf, 64), rightSibling)\\n }\\n\\n _elements[i] = keccak256(buf);\\n }\\n\\n if (rowSizeIsOdd) {\\n leftSibling = _elements[rowSize - 1];\\n rightSibling = bytes32(defaults[depth]);\\n assembly {\\n mstore(add(buf, 32), leftSibling)\\n mstore(add(buf, 64), rightSibling)\\n }\\n\\n _elements[halfRowSize] = keccak256(buf);\\n }\\n\\n rowSize = halfRowSize + (rowSizeIsOdd ? 1 : 0);\\n depth++;\\n }\\n\\n return _elements[0];\\n }\\n\\n /**\\n * Verifies a merkle branch for the given leaf hash. Assumes the original length\\n * of leaves generated is a known, correct input, and does not return true for indices \\n * extending past that index (even if _siblings would be otherwise valid.)\\n * @param _root The Merkle root to verify against.\\n * @param _leaf The leaf hash to verify inclusion of.\\n * @param _index The index in the tree of this leaf.\\n * @param _siblings Array of sibline nodes in the inclusion proof, starting from depth 0 (bottom of the tree). \\n * @param _totalLeaves The total number of leaves originally passed into.\\n * @return Whether or not the merkle branch and leaf passes verification.\\n */\\n function verify(\\n bytes32 _root,\\n bytes32 _leaf,\\n uint256 _index,\\n bytes32[] memory _siblings,\\n uint256 _totalLeaves\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n require(\\n _totalLeaves > 0,\\n \\\"Lib_MerkleTree: Total leaves must be greater than zero.\\\"\\n );\\n\\n require(\\n _index < _totalLeaves,\\n \\\"Lib_MerkleTree: Index out of bounds.\\\"\\n );\\n\\n require(\\n _siblings.length == _ceilLog2(_totalLeaves),\\n \\\"Lib_MerkleTree: Total siblings does not correctly correspond to total leaves.\\\"\\n );\\n\\n bytes32 computedRoot = _leaf;\\n\\n for (uint256 i = 0; i < _siblings.length; i++) {\\n if ((_index & 1) == 1) {\\n computedRoot = keccak256(\\n abi.encodePacked(\\n _siblings[i],\\n computedRoot\\n )\\n );\\n } else {\\n computedRoot = keccak256(\\n abi.encodePacked(\\n computedRoot,\\n _siblings[i]\\n )\\n );\\n }\\n\\n _index >>= 1;\\n }\\n\\n return _root == computedRoot;\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Calculates the integer ceiling of the log base 2 of an input.\\n * @param _in Unsigned input to calculate the log.\\n * @return ceil(log_base_2(_in))\\n */\\n function _ceilLog2(\\n uint256 _in\\n )\\n private\\n pure\\n returns (\\n uint256\\n )\\n { \\n require(\\n _in > 0,\\n \\\"Lib_MerkleTree: Cannot compute ceil(log_2) of 0.\\\"\\n );\\n\\n if (_in == 1) {\\n return 0;\\n }\\n\\n // Find the highest set bit (will be floor(log_2)).\\n // Borrowed with <3 from https://github.com/ethereum/solidity-examples\\n uint256 val = _in;\\n uint256 highest = 0;\\n for (uint8 i = 128; i >= 1; i >>= 1) {\\n if (val & (uint(1) << i) - 1 << i != 0) {\\n highest += i;\\n val >>= i;\\n }\\n }\\n\\n // Increment by one if this is not a perfect logarithm.\\n if ((uint(1) << highest) != _in) {\\n highest += 1;\\n }\\n\\n return highest;\\n }\\n}\\n\",\"keccak256\":\"0x5a859eccd3c4e7e31db90f3022069a725d5389e16fbcace3fe653d6b0acf80f6\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.7.0;\\n\\n/**\\n * @title Lib_SafeExecutionManagerWrapper\\n */\\nlibrary Lib_SafeExecutionManagerWrapper {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Makes an ovmCALL and performs all the necessary safety checks.\\n * @param _gasLimit Gas limit for the call.\\n * @param _target Address to call.\\n * @param _calldata Data to send to the call.\\n * @return _success Whether or not the call reverted.\\n * @return _returndata Data returned by the call.\\n */\\n function safeCALL(\\n uint256 _gasLimit,\\n address _target,\\n bytes memory _calldata\\n )\\n internal\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCALL(uint256,address,bytes)\\\",\\n _gasLimit,\\n _target,\\n _calldata\\n )\\n );\\n\\n return abi.decode(returndata, (bool, bytes));\\n }\\n\\n /**\\n * Makes an ovmCALL and performs all the necessary safety checks.\\n * @param _gasLimit Gas limit for the call.\\n * @param _target Address to call.\\n * @param _calldata Data to send to the call.\\n * @return _success Whether or not the call reverted.\\n * @return _returndata Data returned by the call.\\n */\\n function safeDELEGATECALL(\\n uint256 _gasLimit,\\n address _target,\\n bytes memory _calldata\\n )\\n internal\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmDELEGATECALL(uint256,address,bytes)\\\",\\n _gasLimit,\\n _target,\\n _calldata\\n )\\n );\\n\\n return abi.decode(returndata, (bool, bytes));\\n }\\n\\n /**\\n * Performs an ovmCREATE and the necessary safety checks.\\n * @param _gasLimit Gas limit for the creation.\\n * @param _bytecode Code for the new contract.\\n * @return _contract Address of the created contract.\\n */\\n function safeCREATE(\\n uint256 _gasLimit,\\n bytes memory _bytecode\\n )\\n internal\\n returns (\\n address _contract\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n _gasLimit,\\n abi.encodeWithSignature(\\n \\\"ovmCREATE(bytes)\\\",\\n _bytecode\\n )\\n );\\n\\n return abi.decode(returndata, (address));\\n }\\n\\n /**\\n * Performs an ovmEXTCODESIZE and the necessary safety checks.\\n * @param _contract Address of the contract to query the size of.\\n * @return _EXTCODESIZE Size of the requested contract in bytes.\\n */\\n function safeEXTCODESIZE(\\n address _contract\\n )\\n internal\\n returns (\\n uint256 _EXTCODESIZE\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmEXTCODESIZE(address)\\\",\\n _contract\\n )\\n );\\n\\n return abi.decode(returndata, (uint256));\\n }\\n\\n /**\\n * Performs a safe ovmCHAINID call.\\n * @return _CHAINID Result of calling ovmCHAINID.\\n */\\n function safeCHAINID()\\n internal\\n returns (\\n uint256 _CHAINID\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCHAINID()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (uint256));\\n }\\n\\n /**\\n * Performs a safe ovmCALLER call.\\n * @return _CALLER Result of calling ovmCALLER.\\n */\\n function safeCALLER()\\n internal\\n returns (\\n address _CALLER\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCALLER()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (address));\\n }\\n\\n /**\\n * Performs a safe ovmADDRESS call.\\n * @return _ADDRESS Result of calling ovmADDRESS.\\n */\\n function safeADDRESS()\\n internal\\n returns (\\n address _ADDRESS\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmADDRESS()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (address));\\n }\\n\\n /**\\n * Performs a safe ovmGETNONCE call.\\n * @return _nonce Result of calling ovmGETNONCE.\\n */\\n function safeGETNONCE()\\n internal\\n returns (\\n uint256 _nonce\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmGETNONCE()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (uint256));\\n }\\n\\n /**\\n * Performs a safe ovmSETNONCE call.\\n * @param _nonce New account nonce.\\n */\\n function safeSETNONCE(\\n uint256 _nonce\\n )\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmSETNONCE(uint256)\\\",\\n _nonce\\n )\\n );\\n }\\n\\n /**\\n * Performs a safe ovmCREATEEOA call.\\n * @param _messageHash Message hash which was signed by EOA\\n * @param _v v value of signature (0 or 1)\\n * @param _r r value of signature\\n * @param _s s value of signature\\n */\\n function safeCREATEEOA(\\n bytes32 _messageHash,\\n uint8 _v,\\n bytes32 _r,\\n bytes32 _s\\n )\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCREATEEOA(bytes32,uint8,bytes32,bytes32)\\\",\\n _messageHash,\\n _v,\\n _r,\\n _s\\n )\\n );\\n }\\n\\n /**\\n * Performs a safe REVERT.\\n * @param _reason String revert reason to pass along with the REVERT.\\n */\\n function safeREVERT(\\n string memory _reason\\n )\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmREVERT(bytes)\\\",\\n bytes(_reason)\\n )\\n );\\n }\\n\\n /**\\n * Performs a safe \\\"require\\\".\\n * @param _condition Boolean condition that must be true or will revert.\\n * @param _reason String revert reason to pass along with the REVERT.\\n */\\n function safeREQUIRE(\\n bool _condition,\\n string memory _reason\\n )\\n internal\\n {\\n if (!_condition) {\\n safeREVERT(\\n _reason\\n );\\n }\\n }\\n\\n /**\\n * Performs a safe ovmSLOAD call.\\n */\\n function safeSLOAD(\\n bytes32 _key\\n )\\n internal\\n returns (\\n bytes32\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmSLOAD(bytes32)\\\",\\n _key\\n )\\n );\\n\\n return abi.decode(returndata, (bytes32));\\n }\\n\\n /**\\n * Performs a safe ovmSSTORE call.\\n */\\n function safeSSTORE(\\n bytes32 _key,\\n bytes32 _value\\n )\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmSSTORE(bytes32,bytes32)\\\",\\n _key,\\n _value\\n )\\n );\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Performs an ovm interaction and the necessary safety checks.\\n * @param _gasLimit Gas limit for the interaction.\\n * @param _calldata Data to send to the OVM_ExecutionManager (encoded with sighash).\\n * @return _returndata Data sent back by the OVM_ExecutionManager.\\n */\\n function _safeExecutionManagerInteraction(\\n uint256 _gasLimit,\\n bytes memory _calldata\\n )\\n private\\n returns (\\n bytes memory _returndata\\n )\\n {\\n address ovmExecutionManager = msg.sender;\\n (\\n bool success,\\n bytes memory returndata\\n ) = ovmExecutionManager.call{gas: _gasLimit}(_calldata);\\n\\n if (success == false) {\\n assembly {\\n revert(add(returndata, 0x20), mload(returndata))\\n }\\n } else if (returndata.length == 1) {\\n assembly {\\n return(0, 1)\\n }\\n } else {\\n return returndata;\\n }\\n }\\n\\n function _safeExecutionManagerInteraction(\\n bytes memory _calldata\\n )\\n private\\n returns (\\n bytes memory _returndata\\n )\\n {\\n return _safeExecutionManagerInteraction(\\n gasleft(),\\n _calldata\\n );\\n }\\n}\\n\",\"keccak256\":\"0xdc30487ca1580f3498d4a1c4e26dc53158c00b44bd72da212a66267c22a139b0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/wrappers/Lib_SafeMathWrapper.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// Pulled from @openzeppelin/contracts/math/SafeMath.sol\\npragma solidity ^0.7.0;\\n\\n/* Library Imports */\\nimport { Lib_SafeExecutionManagerWrapper } from \\\"./Lib_SafeExecutionManagerWrapper.sol\\\";\\n\\n/**\\n * @title Lib_SafeMathWrapper\\n */\\n\\n/**\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\n * checks.\\n *\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\n * in bugs, because programmers usually assume that an overflow raises an\\n * error, which is the standard behavior in high level programming languages.\\n * `SafeMath` restores this intuition by reverting the transaction when an\\n * operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n */\\n\\nlibrary Lib_SafeMathWrapper {\\n /**\\n * @dev Returns the addition of two unsigned integers, reverting on\\n * overflow.\\n *\\n * Counterpart to Solidity's `+` operator.\\n *\\n * Requirements:\\n *\\n * - Addition cannot overflow.\\n */\\n function add(uint256 a, uint256 b) internal returns (uint256) {\\n uint256 c = a + b;\\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(c >= a, \\\"Lib_SafeMathWrapper: addition overflow\\\");\\n\\n return c;\\n }\\n\\n /**\\n * @dev Returns the subtraction of two unsigned integers, reverting on\\n * overflow (when the result is negative).\\n *\\n * Counterpart to Solidity's `-` operator.\\n *\\n * Requirements:\\n *\\n * - Subtraction cannot overflow.\\n */\\n function sub(uint256 a, uint256 b) internal returns (uint256) {\\n return sub(a, b, \\\"Lib_SafeMathWrapper: subtraction overflow\\\");\\n }\\n\\n /**\\n * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\n * overflow (when the result is negative).\\n *\\n * Counterpart to Solidity's `-` operator.\\n *\\n * Requirements:\\n *\\n * - Subtraction cannot overflow.\\n */\\n function sub(uint256 a, uint256 b, string memory errorMessage) internal returns (uint256) {\\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(b <= a, errorMessage);\\n uint256 c = a - b;\\n\\n return c;\\n }\\n\\n /**\\n * @dev Returns the multiplication of two unsigned integers, reverting on\\n * overflow.\\n *\\n * Counterpart to Solidity's `*` operator.\\n *\\n * Requirements:\\n *\\n * - Multiplication cannot overflow.\\n */\\n function mul(uint256 a, uint256 b) internal returns (uint256) {\\n // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\n // benefit is lost if 'b' is also tested.\\n // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\n if (a == 0) {\\n return 0;\\n }\\n\\n uint256 c = a * b;\\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(c / a == b, \\\"Lib_SafeMathWrapper: multiplication overflow\\\");\\n\\n return c;\\n }\\n\\n /**\\n * @dev Returns the integer division of two unsigned integers. Reverts on\\n * division by zero. The result is rounded towards zero.\\n *\\n * Counterpart to Solidity's `/` operator. Note: this function uses a\\n * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n * uses an invalid opcode to revert (consuming all remaining gas).\\n *\\n * Requirements:\\n *\\n * - The divisor cannot be zero.\\n */\\n function div(uint256 a, uint256 b) internal returns (uint256) {\\n return div(a, b, \\\"Lib_SafeMathWrapper: division by zero\\\");\\n }\\n\\n /**\\n * @dev Returns the integer division of two unsigned integers. Reverts with custom message on\\n * division by zero. The result is rounded towards zero.\\n *\\n * Counterpart to Solidity's `/` operator. Note: this function uses a\\n * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n * uses an invalid opcode to revert (consuming all remaining gas).\\n *\\n * Requirements:\\n *\\n * - The divisor cannot be zero.\\n */\\n function div(uint256 a, uint256 b, string memory errorMessage) internal returns (uint256) {\\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(b > 0, errorMessage);\\n uint256 c = a / b;\\n // assert(a == b * c + a % b); // There is no case in which this doesn't hold\\n\\n return c;\\n }\\n\\n /**\\n * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n * Reverts when dividing by zero.\\n *\\n * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n * opcode (which leaves remaining gas untouched) while Solidity uses an\\n * invalid opcode to revert (consuming all remaining gas).\\n *\\n * Requirements:\\n *\\n * - The divisor cannot be zero.\\n */\\n function mod(uint256 a, uint256 b) internal returns (uint256) {\\n return mod(a, b, \\\"Lib_SafeMathWrapper: modulo by zero\\\");\\n }\\n\\n /**\\n * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n * Reverts with custom message when dividing by zero.\\n *\\n * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n * opcode (which leaves remaining gas untouched) while Solidity uses an\\n * invalid opcode to revert (consuming all remaining gas).\\n *\\n * Requirements:\\n *\\n * - The divisor cannot be zero.\\n */\\n function mod(uint256 a, uint256 b, string memory errorMessage) internal returns (uint256) {\\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(b != 0, errorMessage);\\n return a % b;\\n }\\n}\",\"keccak256\":\"0x529f1ddb3002186d9240e20557495c8fb339a5d384552c1c05bd27641db2a7b2\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x60806040523480156200001157600080fd5b50604051620031a8380380620031a8833981016040819052620000349162000067565b600080546001600160a01b0319166001600160a01b039590951694909417909355600191909155600255600355620000b2565b600080600080608085870312156200007d578384fd5b84516001600160a01b038116811462000094578485fd5b60208601516040870151606090970151919890975090945092505050565b6130e680620000c26000396000f3fe608060405234801561001057600080fd5b50600436106101215760003560e01c80638d38c6c1116100ad578063d0f8934411610071578063d0f893441461020e578063e10d29ee14610216578063e561dddc1461021e578063f722b41a14610226578063facdc5da1461022e57610121565b80638d38c6c1146101e6578063b8f77005146101ee578063c139eb15146101f6578063c2cf696f146101fe578063cfdf677e1461020657610121565b80636fee07e0116100f45780636fee07e0146101a457806378f4b2f2146101b95780637a167a8a146101c15780637aa63a86146101d6578063876ed5cb146101de57610121565b8063138387a4146101265780632a7f18be14610144578063461a4478146101645780634de569ce14610184575b600080fd5b61012e610241565b60405161013b9190612eb2565b60405180910390f35b610157610152366004612346565b610247565b60405161013b9190612e84565b6101776101723660046121d9565b610394565b60405161013b91906123a9565b61019761019236600461221f565b610470565b60405161013b9190612442565b6101b76101b2366004612146565b6104aa565b005b61012e6106cd565b6101c96106d4565b60405161013b9190612ee2565b61012e6106e9565b61012e610704565b61012e61070a565b6101c9610710565b61012e610799565b61012e61079f565b6101776107a4565b6101b76107cc565b610177610bb3565b61012e610bd6565b6101c9610c50565b6101b761023c366004612346565b610c68565b60025481565b61024f611e97565b60028202600061025d610bb3565b6001600160a01b0316639507d39a836040518263ffffffff1660e01b81526004016102889190612ee2565b60206040518083038186803b1580156102a057600080fd5b505afa1580156102b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102d891906121c1565b905060006102e4610bb3565b6001600160a01b0316639507d39a846001016040518263ffffffff1660e01b81526004016103129190612ee2565b60206040518083038186803b15801561032a57600080fd5b505afa15801561033e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061036291906121c1565b6040805160608101825293845264ffffffffff808316602086015260289290921c90911690830152509150505b919050565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b838110156103f45781810151838201526020016103dc565b50505050905090810190601f1680156104215780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561043e57600080fd5b505afa158015610452573d6000803e3d6000fd5b505050506040513d602081101561046857600080fd5b505192915050565b82516000901515600114156104925761048b85858585610dcb565b90506104a2565b61048b8585602001518585610f96565b949350505050565b612710815111156104d65760405162461bcd60e51b81526004016104cd9061255e565b60405180910390fd5b6003548211156104f85760405162461bcd60e51b81526004016104cd90612764565b620186a082101561051b5760405162461bcd60e51b81526004016104cd90612946565b6020820460005a90508181116105435760405162461bcd60e51b81526004016104cd90612bc0565b60005b825a8303101561055857600101610546565b60003387878760405160200161057194939291906123bd565b60408051601f19818403018152919052805160209091012090504360281b4217610599610bb3565b6001600160a01b031663d41c021883836040518363ffffffff1660e01b81526004016105c692919061249b565b600060405180830381600087803b1580156105e057600080fd5b505af11580156105f4573d6000803e3d6000fd5b5050505060006002610604610bb3565b6001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b15801561063c57600080fd5b505afa158015610650573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061067491906121c1565b8161067b57fe5b0490507f4b388aecf9fa6cc92253704e5975a6129a4f735bdbd99567df4ed0094ee4ceb5338a8a8a60018603426040516106ba969594939291906123fa565b60405180910390a1505050505050505050565b620186a081565b6000806106df61106b565b5090935050505090565b6000806106f461106b565b50505064ffffffffff1692915050565b61271081565b60035481565b6000600261071c610bb3565b6001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b15801561075457600080fd5b505afa158015610768573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061078c91906121c1565b8161079357fe5b04905090565b60015481565b602081565b60006107c760405180606001604052806025815260200161305860259139610394565b905090565b60043560d81c60093560e890811c90600c35901c6107e86106e9565b8364ffffffffff161461080d5760405162461bcd60e51b81526004016104cd90612a6b565b61083b6040518060400160405280600d81526020016c27ab26afa9b2b8bab2b731b2b960991b815250610394565b6001600160a01b0316336001600160a01b03161461086b5760405162461bcd60e51b81526004016104cd90612ac8565b60008162ffffff16116108905760405162461bcd60e51b81526004016104cd906127c1565b60008262ffffff16116108b55760405162461bcd60e51b81526004016104cd90612d15565b600f601062ffffff831602013664ffffffffff82168110156108e95760405162461bcd60e51b81526004016104cd90612d9c565b60006108f3610710565b905060008562ffffff1667ffffffffffffffff8111801561091357600080fd5b5060405190808252806020026020018201604052801561093d578160200160208202803683370190505b509050600080600061094d6106d4565b9050610957611eb7565b60005b8962ffffff168163ffffffff161015610a8a57600061097e8263ffffffff16611119565b905063ffffffff82166109945761099481611169565b61099f838286611236565b80925060005b835163ffffffff82161015610a00578a3560e81c6109cb8564ffffffffff8e1683611346565b898963ffffffff16815181106109dd57fe5b60209081029190910101529a909a016003019960019687019695860195016109a5565b5060005b83602001518163ffffffff161015610a80578864ffffffffff168564ffffffffff1610610a435760405162461bcd60e51b81526004016104cd90612dde565b610a538564ffffffffff166113d0565b888863ffffffff1681518110610a6557fe5b60209081029190910101526001968701969485019401610a04565b505060010161095a565b50610a948161141b565b8764ffffffffff168714610aba5760405162461bcd60e51b81526004016104cd90612809565b8962ffffff168463ffffffff1614610ae45760405162461bcd60e51b81526004016104cd90612857565b6000838b62ffffff160363ffffffff169050600080836020015160001415610b1757505060408201516060830151610b3e565b6000610b2c6001870364ffffffffff16610247565b90508060200151925080604001519150505b610b5f610b4a89611463565b8e62ffffff168564ffffffffff168585611893565b7f602f1aeac0ca2e7a13e281a9ef0ad7838542712ce16780fa2ecffd351f05f89983860384610b8c6106e9565b604051610b9b93929190612ef4565b60405180910390a15050505050505050505050505050565b60006107c7604051806060016040528060238152602001612f3b60239139610394565b6000610be06107a4565b6001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b158015610c1857600080fd5b505afa158015610c2c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107c791906121c1565b6000610c5a6106d4565b610c62610710565b03905090565b60405162461bcd60e51b81526004016104cd906124ce565b83811015610d4557610cb66040518060400160405280600d81526020016c27ab26afa9b2b8bab2b731b2b960991b815250610394565b6001600160a01b0316336001600160a01b031614610d12576000610ce08364ffffffffff16610247565b905042600154826020015164ffffffffff160110610d105760405162461bcd60e51b81526004016104cd906129f8565b505b610d228264ffffffffff166113d0565b838281518110610d2e57fe5b602090810291909101015260019182019101610c80565b506000610d5b6001830364ffffffffff16610247565b9050610d7a610d6984611463565b858684602001518560400151611893565b7f64d7f508348c70dea42d5302a393987e4abc20e45954ab3f9d320207751956f0848364ffffffffff160385610dae6106e9565b604051610dbd93929190612ebb565b60405180910390a150505050565b600080610e036040518060400160405280601481526020017327ab26afa2bc32b1baba34b7b726b0b730b3b2b960611b815250610394565b90506000816001600160a01b0316631c4712a76040518163ffffffff1660e01b815260040160206040518083038186803b158015610e4057600080fd5b505afa158015610e54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e7891906121c1565b90506000610e8587611a4d565b9050610e92818787611ae6565b610eae5760405162461bcd60e51b81526004016104cd9061268d565b86606001518860200151148015610ec9575060408701518851145b8015610f0a5750610ef1604051806060016040528060228152602001612f5e60229139610394565b6001600160a01b031688608001516001600160a01b0316145b8015610f195750818860a00151145b8015610f30575060608801516001600160a01b0316155b8015610f4b5750600088604001516001811115610f4957fe5b145b8015610f6c57508660800151805190602001208860c0015180519060200120145b610f885760405162461bcd60e51b81526004016104cd9061272d565b506001979650505050505050565b600080610fa2856113d0565b9050610faf818585611ae6565b610fcb5760405162461bcd60e51b81526004016104cd90612c60565b6000866060015187608001518860a001518960c00151604051602001610ff494939291906123bd565b604051602081830303815290604052805190602001209050600061101787610247565b80519091508214801561103557508751602082015164ffffffffff16145b801561104f57508760200151816040015164ffffffffff16145b610f885760405162461bcd60e51b81526004016104cd90612b15565b600080600080600061107b6107a4565b6001600160a01b031663ccf8f9696040518163ffffffff1660e01b815260040160206040518083038186803b1580156110b357600080fd5b505afa1580156110c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110eb919061219b565b64ffffffffff602882901c811697605083901c82169750607883901c8216965060a09290921c169350915050565b611121611eb7565b5060408051608081018252601092909202600f81013560e890811c84526012820135901c6020840152601581013560d890811c92840192909252601a0135901c606082015290565b60006111736106e9565b11156111e35760008061118461106b565b9350935050508064ffffffffff16836060015110156111b55760405162461bcd60e51b81526004016104cd906126db565b8164ffffffffff16836040015110156111e05760405162461bcd60e51b81526004016104cd906125bb565b50505b42600154826040015101101561120b5760405162461bcd60e51b81526004016104cd90612d56565b4360025482606001510110156112335760405162461bcd60e51b81526004016104cd90612515565b50565b82604001518260400151101561125e5760405162461bcd60e51b81526004016104cd90612c0b565b8260600151826060015110156112865760405162461bcd60e51b81526004016104cd90612e27565b600081611291610710565b0364ffffffffff1611156113415760006112b18264ffffffffff16610247565b9050600154816020015164ffffffffff160142106112e15760405162461bcd60e51b81526004016104cd9061260a565b806020015164ffffffffff16836040015111156113105760405162461bcd60e51b81526004016104cd9061298f565b806040015164ffffffffff168360600151111561133f5760405162461bcd60e51b81526004016104cd90612caa565b505b505050565b6000808260410167ffffffffffffffff8111801561136357600080fd5b506040519080825280601f01601f19166020018201604052801561138e576020820181803683370190505b50604086015160608701519192509060006020840160018153836001820152826021820152866003890160418301376041870190209450505050509392505050565b60006114156040518060a00160405280600015158152602001848152602001600081526020016000815260200160405180602001604052806000815250815250611bd7565b92915050565b428160400151111561143f5760405162461bcd60e51b81526004016104cd90612b7b565b43816060015111156112335760405162461bcd60e51b81526004016104cd906128c7565b6000808251116114a45760405162461bcd60e51b815260040180806020018281038252603481526020018061307d6034913960400191505060405180910390fd5b81516114c657816000815181106114b757fe5b6020026020010151905061038f565b60408051610200810182527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56381527f633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d60208201527f890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d818301527f3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd86060808301919091527fecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da60808301527fdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da560a08301527f617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d760c08301527f292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead60e08301527fe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e106101008301527f7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f826101208301527fe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e836365166101408301527f3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c6101608301527fad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e6101808301527fa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab6101a08301527f4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c8626101c08301527f2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf106101e083015282518381529081018352909160009190602082018180368337505085519192506000918291508180805b600184111561186f5750506002820460018084161460005b828110156117eb578a816002028151811061179257fe5b602002602001015196508a81600202600101815181106117ae57fe5b6020026020010151955086602089015285604089015287805190602001208b82815181106117d857fe5b602090810291909101015260010161177b565b50801561184e5789600185038151811061180157fe5b6020026020010151955087836010811061181757fe5b602002015160001b945085602088015284604088015286805190602001208a838151811061184157fe5b6020026020010181815250505b8061185a57600061185d565b60015b60ff1682019350600190920191611763565b8960008151811061187c57fe5b602002602001015198505050505050505050919050565b6000806000806118a161106b565b935093509350935060006040518060a001604052806118be6107a4565b6001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b1580156118f657600080fd5b505afa15801561190a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061192e91906121c1565b81526020018b81526020018a81526020018664ffffffffff16815260200160405180602001604052806000815250815250905080600001517f127186556e7be68c7e31263195225b4de02820707889540969f62c05cf73525e82602001518360400151846060015185608001516040516119ab94939291906124a9565b60405180910390a260006119be82611c1f565b905060006119d6836040015188018b88018b8b611c48565b90506119e06107a4565b6001600160a01b0316632015276c83836040518363ffffffff1660e01b8152600401611a0d929190612485565b600060405180830381600087803b158015611a2757600080fd5b505af1158015611a3b573d6000803e3d6000fd5b50505050505050505050505050505050565b6080810151805160009190826041820167ffffffffffffffff81118015611a7357600080fd5b506040519080825280601f01601f191660200182016040528015611a9e576020820181803683370190505b5060408601516060870151919250906000602084016001815383600182015282602182015285604182018760208a0160045afa50604190950190942095505050505050919050565b6000611af06107a4565b8351604051634a83e9cd60e11b81526001600160a01b039290921691639507d39a91611b1e91600401612ed1565b60206040518083038186803b158015611b3657600080fd5b505afa158015611b4a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b6e91906121c1565b611b7784611c1f565b14611b945760405162461bcd60e51b81526004016104cd90612b4c565b611bb1836020015185846000015185602001518760400151611c67565b611bcd5760405162461bcd60e51b81526004016104cd9061290f565b5060019392505050565b8051602080830151604080850151606086015160808701519251600096611c0296909594910161244d565b604051602081830303815290604052805190602001209050919050565b60008160200151826040015183606001518460800151604051602001611c0294939291906124a9565b602892831b9390931760509190911b1760789290921b91909117901b90565b6000808211611ca75760405162461bcd60e51b8152600401808060200182810382526037815260200180612fd46037913960400191505060405180910390fd5b818410611ce55760405162461bcd60e51b8152600401808060200182810382526024815260200180612f806024913960400191505060405180910390fd5b611cee82611dec565b835114611d2c5760405162461bcd60e51b815260040180806020018281038252604d81526020018061300b604d913960600191505060405180910390fd5b8460005b8451811015611ddf578560011660011415611d8e57848181518110611d5157fe5b6020026020010151826040516020018083815260200182815260200192505050604051602081830303815290604052805190602001209150611dd3565b81858281518110611d9b57fe5b602002602001015160405160200180838152602001828152602001925050506040516020818303038152906040528051906020012091505b600195861c9501611d30565b5090951495945050505050565b6000808211611e2c5760405162461bcd60e51b8152600401808060200182810382526030815260200180612fa46030913960400191505060405180910390fd5b8160011415611e3d5750600061038f565b81600060805b60018160ff1610611e81578060ff1660018260ff166001901b03901b8316600014611e765760ff811692831c9291909101905b60011c607f16611e43565b506001811b8414611e90576001015b9392505050565b604080516060810182526000808252602082018190529181019190915290565b6040518060800160405280600081526020016000815260200160008152602001600081525090565b600067ffffffffffffffff831115611ef357fe5b611f06601f8401601f1916602001612f16565b9050828152838383011115611f1a57600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b038116811461038f57600080fd5b600082601f830112611f58578081fd5b611e9083833560208501611edf565b80356002811061038f57600080fd5b600060a08284031215611f87578081fd5b60405160a0810167ffffffffffffffff8282108183111715611fa557fe5b81604052829350843583526020850135602084015260408501356040840152606085013560608401526080850135915080821115611fe257600080fd5b50611fef85828601611f48565b6080830152505092915050565b60006040828403121561200d578081fd5b6040516040810167ffffffffffffffff828210818311171561202b57fe5b816040528293508435835260209150818501358181111561204b57600080fd5b8501601f8101871361205c57600080fd5b80358281111561206857fe5b8381029250612078848401612f16565b8181528481019083860185850187018b101561209357600080fd5b600095505b838610156120b6578035835260019590950194918601918601612098565b5080868801525050505050505092915050565b600060a082840312156120da578081fd5b60405160a0810167ffffffffffffffff82821081831117156120f857fe5b8160405282935084359150811515821461211157600080fd5b8183526020850135602084015260408501356040840152606085013560608401526080850135915080821115611fe257600080fd5b60008060006060848603121561215a578283fd5b61216384611f31565b925060208401359150604084013567ffffffffffffffff811115612185578182fd5b61219186828701611f48565b9150509250925092565b6000602082840312156121ac578081fd5b815164ffffffffff1981168114611e90578182fd5b6000602082840312156121d2578081fd5b5051919050565b6000602082840312156121ea578081fd5b813567ffffffffffffffff811115612200578182fd5b8201601f81018413612210578182fd5b6104a284823560208401611edf565b60008060008060808587031215612234578081fd5b843567ffffffffffffffff8082111561224b578283fd5b9086019060e0828903121561225e578283fd5b61226860e0612f16565b823581526020830135602082015261228260408401611f67565b604082015261229360608401611f31565b60608201526122a460808401611f31565b608082015260a083013560a082015260c0830135828111156122c4578485fd5b6122d08a828601611f48565b60c083015250955060208701359150808211156122eb578283fd5b6122f7888389016120c9565b9450604087013591508082111561230c578283fd5b61231888838901611f76565b9350606087013591508082111561232d578283fd5b5061233a87828801611ffc565b91505092959194509250565b600060208284031215612357578081fd5b5035919050565b60008151808452815b8181101561238357602081850181015186830182015201612367565b818111156123945782602083870101525b50601f01601f19169290920160200192915050565b6001600160a01b0391909116815260200190565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906123f09083018461235e565b9695505050505050565b6001600160a01b038781168252861660208201526040810185905260c06060820181905260009061242d9083018661235e565b60808301949094525060a00152949350505050565b901515815260200190565b6000861515825285602083015284604083015283606083015260a0608083015261247a60a083018461235e565b979650505050505050565b91825264ffffffffff1916602082015260400190565b918252602082015260400190565b6000858252846020830152836040830152608060608301526123f0608083018461235e565b60208082526027908201527f617070656e64517565756542617463682069732063757272656e746c7920646960408201526639b0b13632b21760c91b606082015260800190565b60208082526029908201527f436f6e7465787420626c6f636b206e756d62657220746f6f2066617220696e206040820152683a3432903830b9ba1760b91b606082015260800190565b6020808252603d908201527f5472616e73616374696f6e20646174612073697a652065786365656473206d6160408201527f78696d756d20666f7220726f6c6c7570207472616e73616374696f6e2e000000606082015260800190565b6020808252602f908201527f436f6e746578742074696d657374616d70206973206c6f776572207468616e2060408201526e3630b9ba1039bab136b4ba3a32b21760891b606082015260800190565b6020808252605b908201527f50726576696f75736c7920656e7175657565642062617463686573206861766560408201527f206578706972656420616e64206d75737420626520617070656e64656420626560608201527f666f72652061206e65772073657175656e6365722062617463682e0000000000608082015260a00190565b6020808252602e908201527f496e76616c69642053657175656e636572207472616e73616374696f6e20696e60408201526d31b63ab9b4b7b710383937b7b31760911b606082015260800190565b60208082526032908201527f436f6e7465787420626c6f636b206e756d626572206973206c6f77657220746860408201527130b7103630b9ba1039bab136b4ba3a32b21760711b606082015260800190565b6020808252601e908201527f496e76616c69642053657175656e636572207472616e73616374696f6e2e0000604082015260600190565b6020808252603d908201527f5472616e73616374696f6e20676173206c696d69742065786365656473206d6160408201527f78696d756d20666f7220726f6c6c7570207472616e73616374696f6e2e000000606082015260800190565b60208082526028908201527f4d7573742070726f76696465206174206c65617374206f6e652062617463682060408201526731b7b73a32bc3a1760c11b606082015260800190565b6020808252602e908201527f4e6f7420616c6c2073657175656e636572207472616e73616374696f6e73207760408201526d32b93290383937b1b2b9b9b2b21760911b606082015260800190565b6020808252604a908201527f41637475616c207472616e73616374696f6e20696e64657820646f6573206e6f60408201527f74206d6174636820657870656374656420746f74616c20656c656d656e7473206060820152693a379030b83832b7321760b11b608082015260a00190565b60208082526028908201527f436f6e7465787420626c6f636b206e756d6265722069732066726f6d2074686560408201526710333aba3ab9329760c11b606082015260800190565b60208082526018908201527f496e76616c696420696e636c7573696f6e2070726f6f662e0000000000000000604082015260600190565b60208082526029908201527f5472616e73616374696f6e20676173206c696d697420746f6f206c6f7720746f6040820152681032b738bab2bab29760b91b606082015260800190565b60208082526043908201527f53657175656e636572207472616e73616374696f6e2074696d657374616d702060408201527f657863656564732074686174206f66206e65787420717565756520656c656d65606082015262373a1760e91b608082015260a00190565b6020808252604d908201527f5175657565207472616e73616374696f6e732063616e6e6f742062652073756260408201527f6d697474656420647572696e67207468652073657175656e63657220696e636c60608201526c3ab9b4b7b7103832b934b7b21760991b608082015260a00190565b6020808252603d908201527f41637475616c20626174636820737461727420696e64657820646f6573206e6f60408201527f74206d6174636820657870656374656420737461727420696e6465782e000000606082015260800190565b6020808252602d908201527f46756e6374696f6e2063616e206f6e6c792062652063616c6c6564206279207460408201526c34329029b2b8bab2b731b2b91760991b606082015260800190565b6020808252601a908201527f496e76616c6964205175657565207472616e73616374696f6e2e000000000000604082015260600190565b60208082526015908201527424b73b30b634b2103130ba31b4103432b0b232b91760591b604082015260600190565b60208082526025908201527f436f6e746578742074696d657374616d702069732066726f6d207468652066756040820152643a3ab9329760d91b606082015260800190565b6020808252602b908201527f496e73756666696369656e742067617320666f72204c322072617465206c696d60408201526a34ba34b73390313ab9371760a91b606082015260800190565b60208082526035908201527f436f6e746578742074696d657374616d702076616c756573206d757374206d6f6040820152743737ba37b734b1b0b6363c9034b731b932b0b9b29760591b606082015260800190565b6020808252602a908201527f496e76616c6964205175657565207472616e73616374696f6e20696e636c757360408201526934b7b710383937b7b31760b11b606082015260800190565b60208082526045908201527f53657175656e636572207472616e73616374696f6e20626c6f636b4e756d626560408201527f7220657863656564732074686174206f66206e65787420717565756520656c6560608201526436b2b73a1760d91b608082015260a00190565b60208082526021908201527f4d75737420617070656e64206174206c65617374206f6e6520656c656d656e746040820152601760f91b606082015260800190565b60208082526026908201527f436f6e746578742074696d657374616d7020746f6f2066617220696e20746865604082015265103830b9ba1760d11b606082015260800190565b60208082526022908201527f4e6f7420656e6f756768204261746368436f6e74657874732070726f76696465604082015261321760f11b606082015260800190565b60208082526029908201527f4e6f7420656e6f75676820717565756564207472616e73616374696f6e732074604082015268379030b83832b7321760b91b606082015260800190565b60208082526037908201527f436f6e7465787420626c6f636b4e756d6265722076616c756573206d7573742060408201527f6d6f6e6f746f6e6963616c6c7920696e6372656173652e000000000000000000606082015260800190565b8151815260208083015164ffffffffff90811691830191909152604092830151169181019190915260600190565b90815260200190565b9283526020830191909152604082015260600190565b63ffffffff91909116815260200190565b64ffffffffff91909116815260200190565b64ffffffffff9384168152919092166020820152604081019190915260600190565b60405181810167ffffffffffffffff81118282101715612f3257fe5b60405291905056fe4f564d5f436861696e53746f72616765436f6e7461696e65723a4354433a71756575654f564d5f4465636f6d7072657373696f6e507265636f6d70696c65416464726573734c69625f4d65726b6c65547265653a20496e646578206f7574206f6620626f756e64732e4c69625f4d65726b6c65547265653a2043616e6e6f7420636f6d70757465206365696c286c6f675f3229206f6620302e4c69625f4d65726b6c65547265653a20546f74616c206c6561766573206d7573742062652067726561746572207468616e207a65726f2e4c69625f4d65726b6c65547265653a20546f74616c207369626c696e677320646f6573206e6f7420636f72726563746c7920636f72726573706f6e6420746f20746f74616c206c65617665732e4f564d5f436861696e53746f72616765436f6e7461696e65723a4354433a626174636865734c69625f4d65726b6c65547265653a204d7573742070726f76696465206174206c65617374206f6e65206c65616620686173682ea26469706673582212203512ca678bca74305bf6a879ce3d6142d5a90f38111948470b55a07a416cec5964736f6c63430007060033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101215760003560e01c80638d38c6c1116100ad578063d0f8934411610071578063d0f893441461020e578063e10d29ee14610216578063e561dddc1461021e578063f722b41a14610226578063facdc5da1461022e57610121565b80638d38c6c1146101e6578063b8f77005146101ee578063c139eb15146101f6578063c2cf696f146101fe578063cfdf677e1461020657610121565b80636fee07e0116100f45780636fee07e0146101a457806378f4b2f2146101b95780637a167a8a146101c15780637aa63a86146101d6578063876ed5cb146101de57610121565b8063138387a4146101265780632a7f18be14610144578063461a4478146101645780634de569ce14610184575b600080fd5b61012e610241565b60405161013b9190612eb2565b60405180910390f35b610157610152366004612346565b610247565b60405161013b9190612e84565b6101776101723660046121d9565b610394565b60405161013b91906123a9565b61019761019236600461221f565b610470565b60405161013b9190612442565b6101b76101b2366004612146565b6104aa565b005b61012e6106cd565b6101c96106d4565b60405161013b9190612ee2565b61012e6106e9565b61012e610704565b61012e61070a565b6101c9610710565b61012e610799565b61012e61079f565b6101776107a4565b6101b76107cc565b610177610bb3565b61012e610bd6565b6101c9610c50565b6101b761023c366004612346565b610c68565b60025481565b61024f611e97565b60028202600061025d610bb3565b6001600160a01b0316639507d39a836040518263ffffffff1660e01b81526004016102889190612ee2565b60206040518083038186803b1580156102a057600080fd5b505afa1580156102b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102d891906121c1565b905060006102e4610bb3565b6001600160a01b0316639507d39a846001016040518263ffffffff1660e01b81526004016103129190612ee2565b60206040518083038186803b15801561032a57600080fd5b505afa15801561033e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061036291906121c1565b6040805160608101825293845264ffffffffff808316602086015260289290921c90911690830152509150505b919050565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b838110156103f45781810151838201526020016103dc565b50505050905090810190601f1680156104215780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561043e57600080fd5b505afa158015610452573d6000803e3d6000fd5b505050506040513d602081101561046857600080fd5b505192915050565b82516000901515600114156104925761048b85858585610dcb565b90506104a2565b61048b8585602001518585610f96565b949350505050565b612710815111156104d65760405162461bcd60e51b81526004016104cd9061255e565b60405180910390fd5b6003548211156104f85760405162461bcd60e51b81526004016104cd90612764565b620186a082101561051b5760405162461bcd60e51b81526004016104cd90612946565b6020820460005a90508181116105435760405162461bcd60e51b81526004016104cd90612bc0565b60005b825a8303101561055857600101610546565b60003387878760405160200161057194939291906123bd565b60408051601f19818403018152919052805160209091012090504360281b4217610599610bb3565b6001600160a01b031663d41c021883836040518363ffffffff1660e01b81526004016105c692919061249b565b600060405180830381600087803b1580156105e057600080fd5b505af11580156105f4573d6000803e3d6000fd5b5050505060006002610604610bb3565b6001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b15801561063c57600080fd5b505afa158015610650573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061067491906121c1565b8161067b57fe5b0490507f4b388aecf9fa6cc92253704e5975a6129a4f735bdbd99567df4ed0094ee4ceb5338a8a8a60018603426040516106ba969594939291906123fa565b60405180910390a1505050505050505050565b620186a081565b6000806106df61106b565b5090935050505090565b6000806106f461106b565b50505064ffffffffff1692915050565b61271081565b60035481565b6000600261071c610bb3565b6001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b15801561075457600080fd5b505afa158015610768573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061078c91906121c1565b8161079357fe5b04905090565b60015481565b602081565b60006107c760405180606001604052806025815260200161305860259139610394565b905090565b60043560d81c60093560e890811c90600c35901c6107e86106e9565b8364ffffffffff161461080d5760405162461bcd60e51b81526004016104cd90612a6b565b61083b6040518060400160405280600d81526020016c27ab26afa9b2b8bab2b731b2b960991b815250610394565b6001600160a01b0316336001600160a01b03161461086b5760405162461bcd60e51b81526004016104cd90612ac8565b60008162ffffff16116108905760405162461bcd60e51b81526004016104cd906127c1565b60008262ffffff16116108b55760405162461bcd60e51b81526004016104cd90612d15565b600f601062ffffff831602013664ffffffffff82168110156108e95760405162461bcd60e51b81526004016104cd90612d9c565b60006108f3610710565b905060008562ffffff1667ffffffffffffffff8111801561091357600080fd5b5060405190808252806020026020018201604052801561093d578160200160208202803683370190505b509050600080600061094d6106d4565b9050610957611eb7565b60005b8962ffffff168163ffffffff161015610a8a57600061097e8263ffffffff16611119565b905063ffffffff82166109945761099481611169565b61099f838286611236565b80925060005b835163ffffffff82161015610a00578a3560e81c6109cb8564ffffffffff8e1683611346565b898963ffffffff16815181106109dd57fe5b60209081029190910101529a909a016003019960019687019695860195016109a5565b5060005b83602001518163ffffffff161015610a80578864ffffffffff168564ffffffffff1610610a435760405162461bcd60e51b81526004016104cd90612dde565b610a538564ffffffffff166113d0565b888863ffffffff1681518110610a6557fe5b60209081029190910101526001968701969485019401610a04565b505060010161095a565b50610a948161141b565b8764ffffffffff168714610aba5760405162461bcd60e51b81526004016104cd90612809565b8962ffffff168463ffffffff1614610ae45760405162461bcd60e51b81526004016104cd90612857565b6000838b62ffffff160363ffffffff169050600080836020015160001415610b1757505060408201516060830151610b3e565b6000610b2c6001870364ffffffffff16610247565b90508060200151925080604001519150505b610b5f610b4a89611463565b8e62ffffff168564ffffffffff168585611893565b7f602f1aeac0ca2e7a13e281a9ef0ad7838542712ce16780fa2ecffd351f05f89983860384610b8c6106e9565b604051610b9b93929190612ef4565b60405180910390a15050505050505050505050505050565b60006107c7604051806060016040528060238152602001612f3b60239139610394565b6000610be06107a4565b6001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b158015610c1857600080fd5b505afa158015610c2c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107c791906121c1565b6000610c5a6106d4565b610c62610710565b03905090565b60405162461bcd60e51b81526004016104cd906124ce565b83811015610d4557610cb66040518060400160405280600d81526020016c27ab26afa9b2b8bab2b731b2b960991b815250610394565b6001600160a01b0316336001600160a01b031614610d12576000610ce08364ffffffffff16610247565b905042600154826020015164ffffffffff160110610d105760405162461bcd60e51b81526004016104cd906129f8565b505b610d228264ffffffffff166113d0565b838281518110610d2e57fe5b602090810291909101015260019182019101610c80565b506000610d5b6001830364ffffffffff16610247565b9050610d7a610d6984611463565b858684602001518560400151611893565b7f64d7f508348c70dea42d5302a393987e4abc20e45954ab3f9d320207751956f0848364ffffffffff160385610dae6106e9565b604051610dbd93929190612ebb565b60405180910390a150505050565b600080610e036040518060400160405280601481526020017327ab26afa2bc32b1baba34b7b726b0b730b3b2b960611b815250610394565b90506000816001600160a01b0316631c4712a76040518163ffffffff1660e01b815260040160206040518083038186803b158015610e4057600080fd5b505afa158015610e54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e7891906121c1565b90506000610e8587611a4d565b9050610e92818787611ae6565b610eae5760405162461bcd60e51b81526004016104cd9061268d565b86606001518860200151148015610ec9575060408701518851145b8015610f0a5750610ef1604051806060016040528060228152602001612f5e60229139610394565b6001600160a01b031688608001516001600160a01b0316145b8015610f195750818860a00151145b8015610f30575060608801516001600160a01b0316155b8015610f4b5750600088604001516001811115610f4957fe5b145b8015610f6c57508660800151805190602001208860c0015180519060200120145b610f885760405162461bcd60e51b81526004016104cd9061272d565b506001979650505050505050565b600080610fa2856113d0565b9050610faf818585611ae6565b610fcb5760405162461bcd60e51b81526004016104cd90612c60565b6000866060015187608001518860a001518960c00151604051602001610ff494939291906123bd565b604051602081830303815290604052805190602001209050600061101787610247565b80519091508214801561103557508751602082015164ffffffffff16145b801561104f57508760200151816040015164ffffffffff16145b610f885760405162461bcd60e51b81526004016104cd90612b15565b600080600080600061107b6107a4565b6001600160a01b031663ccf8f9696040518163ffffffff1660e01b815260040160206040518083038186803b1580156110b357600080fd5b505afa1580156110c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110eb919061219b565b64ffffffffff602882901c811697605083901c82169750607883901c8216965060a09290921c169350915050565b611121611eb7565b5060408051608081018252601092909202600f81013560e890811c84526012820135901c6020840152601581013560d890811c92840192909252601a0135901c606082015290565b60006111736106e9565b11156111e35760008061118461106b565b9350935050508064ffffffffff16836060015110156111b55760405162461bcd60e51b81526004016104cd906126db565b8164ffffffffff16836040015110156111e05760405162461bcd60e51b81526004016104cd906125bb565b50505b42600154826040015101101561120b5760405162461bcd60e51b81526004016104cd90612d56565b4360025482606001510110156112335760405162461bcd60e51b81526004016104cd90612515565b50565b82604001518260400151101561125e5760405162461bcd60e51b81526004016104cd90612c0b565b8260600151826060015110156112865760405162461bcd60e51b81526004016104cd90612e27565b600081611291610710565b0364ffffffffff1611156113415760006112b18264ffffffffff16610247565b9050600154816020015164ffffffffff160142106112e15760405162461bcd60e51b81526004016104cd9061260a565b806020015164ffffffffff16836040015111156113105760405162461bcd60e51b81526004016104cd9061298f565b806040015164ffffffffff168360600151111561133f5760405162461bcd60e51b81526004016104cd90612caa565b505b505050565b6000808260410167ffffffffffffffff8111801561136357600080fd5b506040519080825280601f01601f19166020018201604052801561138e576020820181803683370190505b50604086015160608701519192509060006020840160018153836001820152826021820152866003890160418301376041870190209450505050509392505050565b60006114156040518060a00160405280600015158152602001848152602001600081526020016000815260200160405180602001604052806000815250815250611bd7565b92915050565b428160400151111561143f5760405162461bcd60e51b81526004016104cd90612b7b565b43816060015111156112335760405162461bcd60e51b81526004016104cd906128c7565b6000808251116114a45760405162461bcd60e51b815260040180806020018281038252603481526020018061307d6034913960400191505060405180910390fd5b81516114c657816000815181106114b757fe5b6020026020010151905061038f565b60408051610200810182527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56381527f633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d60208201527f890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d818301527f3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd86060808301919091527fecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da60808301527fdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da560a08301527f617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d760c08301527f292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead60e08301527fe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e106101008301527f7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f826101208301527fe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e836365166101408301527f3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c6101608301527fad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e6101808301527fa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab6101a08301527f4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c8626101c08301527f2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf106101e083015282518381529081018352909160009190602082018180368337505085519192506000918291508180805b600184111561186f5750506002820460018084161460005b828110156117eb578a816002028151811061179257fe5b602002602001015196508a81600202600101815181106117ae57fe5b6020026020010151955086602089015285604089015287805190602001208b82815181106117d857fe5b602090810291909101015260010161177b565b50801561184e5789600185038151811061180157fe5b6020026020010151955087836010811061181757fe5b602002015160001b945085602088015284604088015286805190602001208a838151811061184157fe5b6020026020010181815250505b8061185a57600061185d565b60015b60ff1682019350600190920191611763565b8960008151811061187c57fe5b602002602001015198505050505050505050919050565b6000806000806118a161106b565b935093509350935060006040518060a001604052806118be6107a4565b6001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b1580156118f657600080fd5b505afa15801561190a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061192e91906121c1565b81526020018b81526020018a81526020018664ffffffffff16815260200160405180602001604052806000815250815250905080600001517f127186556e7be68c7e31263195225b4de02820707889540969f62c05cf73525e82602001518360400151846060015185608001516040516119ab94939291906124a9565b60405180910390a260006119be82611c1f565b905060006119d6836040015188018b88018b8b611c48565b90506119e06107a4565b6001600160a01b0316632015276c83836040518363ffffffff1660e01b8152600401611a0d929190612485565b600060405180830381600087803b158015611a2757600080fd5b505af1158015611a3b573d6000803e3d6000fd5b50505050505050505050505050505050565b6080810151805160009190826041820167ffffffffffffffff81118015611a7357600080fd5b506040519080825280601f01601f191660200182016040528015611a9e576020820181803683370190505b5060408601516060870151919250906000602084016001815383600182015282602182015285604182018760208a0160045afa50604190950190942095505050505050919050565b6000611af06107a4565b8351604051634a83e9cd60e11b81526001600160a01b039290921691639507d39a91611b1e91600401612ed1565b60206040518083038186803b158015611b3657600080fd5b505afa158015611b4a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b6e91906121c1565b611b7784611c1f565b14611b945760405162461bcd60e51b81526004016104cd90612b4c565b611bb1836020015185846000015185602001518760400151611c67565b611bcd5760405162461bcd60e51b81526004016104cd9061290f565b5060019392505050565b8051602080830151604080850151606086015160808701519251600096611c0296909594910161244d565b604051602081830303815290604052805190602001209050919050565b60008160200151826040015183606001518460800151604051602001611c0294939291906124a9565b602892831b9390931760509190911b1760789290921b91909117901b90565b6000808211611ca75760405162461bcd60e51b8152600401808060200182810382526037815260200180612fd46037913960400191505060405180910390fd5b818410611ce55760405162461bcd60e51b8152600401808060200182810382526024815260200180612f806024913960400191505060405180910390fd5b611cee82611dec565b835114611d2c5760405162461bcd60e51b815260040180806020018281038252604d81526020018061300b604d913960600191505060405180910390fd5b8460005b8451811015611ddf578560011660011415611d8e57848181518110611d5157fe5b6020026020010151826040516020018083815260200182815260200192505050604051602081830303815290604052805190602001209150611dd3565b81858281518110611d9b57fe5b602002602001015160405160200180838152602001828152602001925050506040516020818303038152906040528051906020012091505b600195861c9501611d30565b5090951495945050505050565b6000808211611e2c5760405162461bcd60e51b8152600401808060200182810382526030815260200180612fa46030913960400191505060405180910390fd5b8160011415611e3d5750600061038f565b81600060805b60018160ff1610611e81578060ff1660018260ff166001901b03901b8316600014611e765760ff811692831c9291909101905b60011c607f16611e43565b506001811b8414611e90576001015b9392505050565b604080516060810182526000808252602082018190529181019190915290565b6040518060800160405280600081526020016000815260200160008152602001600081525090565b600067ffffffffffffffff831115611ef357fe5b611f06601f8401601f1916602001612f16565b9050828152838383011115611f1a57600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b038116811461038f57600080fd5b600082601f830112611f58578081fd5b611e9083833560208501611edf565b80356002811061038f57600080fd5b600060a08284031215611f87578081fd5b60405160a0810167ffffffffffffffff8282108183111715611fa557fe5b81604052829350843583526020850135602084015260408501356040840152606085013560608401526080850135915080821115611fe257600080fd5b50611fef85828601611f48565b6080830152505092915050565b60006040828403121561200d578081fd5b6040516040810167ffffffffffffffff828210818311171561202b57fe5b816040528293508435835260209150818501358181111561204b57600080fd5b8501601f8101871361205c57600080fd5b80358281111561206857fe5b8381029250612078848401612f16565b8181528481019083860185850187018b101561209357600080fd5b600095505b838610156120b6578035835260019590950194918601918601612098565b5080868801525050505050505092915050565b600060a082840312156120da578081fd5b60405160a0810167ffffffffffffffff82821081831117156120f857fe5b8160405282935084359150811515821461211157600080fd5b8183526020850135602084015260408501356040840152606085013560608401526080850135915080821115611fe257600080fd5b60008060006060848603121561215a578283fd5b61216384611f31565b925060208401359150604084013567ffffffffffffffff811115612185578182fd5b61219186828701611f48565b9150509250925092565b6000602082840312156121ac578081fd5b815164ffffffffff1981168114611e90578182fd5b6000602082840312156121d2578081fd5b5051919050565b6000602082840312156121ea578081fd5b813567ffffffffffffffff811115612200578182fd5b8201601f81018413612210578182fd5b6104a284823560208401611edf565b60008060008060808587031215612234578081fd5b843567ffffffffffffffff8082111561224b578283fd5b9086019060e0828903121561225e578283fd5b61226860e0612f16565b823581526020830135602082015261228260408401611f67565b604082015261229360608401611f31565b60608201526122a460808401611f31565b608082015260a083013560a082015260c0830135828111156122c4578485fd5b6122d08a828601611f48565b60c083015250955060208701359150808211156122eb578283fd5b6122f7888389016120c9565b9450604087013591508082111561230c578283fd5b61231888838901611f76565b9350606087013591508082111561232d578283fd5b5061233a87828801611ffc565b91505092959194509250565b600060208284031215612357578081fd5b5035919050565b60008151808452815b8181101561238357602081850181015186830182015201612367565b818111156123945782602083870101525b50601f01601f19169290920160200192915050565b6001600160a01b0391909116815260200190565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906123f09083018461235e565b9695505050505050565b6001600160a01b038781168252861660208201526040810185905260c06060820181905260009061242d9083018661235e565b60808301949094525060a00152949350505050565b901515815260200190565b6000861515825285602083015284604083015283606083015260a0608083015261247a60a083018461235e565b979650505050505050565b91825264ffffffffff1916602082015260400190565b918252602082015260400190565b6000858252846020830152836040830152608060608301526123f0608083018461235e565b60208082526027908201527f617070656e64517565756542617463682069732063757272656e746c7920646960408201526639b0b13632b21760c91b606082015260800190565b60208082526029908201527f436f6e7465787420626c6f636b206e756d62657220746f6f2066617220696e206040820152683a3432903830b9ba1760b91b606082015260800190565b6020808252603d908201527f5472616e73616374696f6e20646174612073697a652065786365656473206d6160408201527f78696d756d20666f7220726f6c6c7570207472616e73616374696f6e2e000000606082015260800190565b6020808252602f908201527f436f6e746578742074696d657374616d70206973206c6f776572207468616e2060408201526e3630b9ba1039bab136b4ba3a32b21760891b606082015260800190565b6020808252605b908201527f50726576696f75736c7920656e7175657565642062617463686573206861766560408201527f206578706972656420616e64206d75737420626520617070656e64656420626560608201527f666f72652061206e65772073657175656e6365722062617463682e0000000000608082015260a00190565b6020808252602e908201527f496e76616c69642053657175656e636572207472616e73616374696f6e20696e60408201526d31b63ab9b4b7b710383937b7b31760911b606082015260800190565b60208082526032908201527f436f6e7465787420626c6f636b206e756d626572206973206c6f77657220746860408201527130b7103630b9ba1039bab136b4ba3a32b21760711b606082015260800190565b6020808252601e908201527f496e76616c69642053657175656e636572207472616e73616374696f6e2e0000604082015260600190565b6020808252603d908201527f5472616e73616374696f6e20676173206c696d69742065786365656473206d6160408201527f78696d756d20666f7220726f6c6c7570207472616e73616374696f6e2e000000606082015260800190565b60208082526028908201527f4d7573742070726f76696465206174206c65617374206f6e652062617463682060408201526731b7b73a32bc3a1760c11b606082015260800190565b6020808252602e908201527f4e6f7420616c6c2073657175656e636572207472616e73616374696f6e73207760408201526d32b93290383937b1b2b9b9b2b21760911b606082015260800190565b6020808252604a908201527f41637475616c207472616e73616374696f6e20696e64657820646f6573206e6f60408201527f74206d6174636820657870656374656420746f74616c20656c656d656e7473206060820152693a379030b83832b7321760b11b608082015260a00190565b60208082526028908201527f436f6e7465787420626c6f636b206e756d6265722069732066726f6d2074686560408201526710333aba3ab9329760c11b606082015260800190565b60208082526018908201527f496e76616c696420696e636c7573696f6e2070726f6f662e0000000000000000604082015260600190565b60208082526029908201527f5472616e73616374696f6e20676173206c696d697420746f6f206c6f7720746f6040820152681032b738bab2bab29760b91b606082015260800190565b60208082526043908201527f53657175656e636572207472616e73616374696f6e2074696d657374616d702060408201527f657863656564732074686174206f66206e65787420717565756520656c656d65606082015262373a1760e91b608082015260a00190565b6020808252604d908201527f5175657565207472616e73616374696f6e732063616e6e6f742062652073756260408201527f6d697474656420647572696e67207468652073657175656e63657220696e636c60608201526c3ab9b4b7b7103832b934b7b21760991b608082015260a00190565b6020808252603d908201527f41637475616c20626174636820737461727420696e64657820646f6573206e6f60408201527f74206d6174636820657870656374656420737461727420696e6465782e000000606082015260800190565b6020808252602d908201527f46756e6374696f6e2063616e206f6e6c792062652063616c6c6564206279207460408201526c34329029b2b8bab2b731b2b91760991b606082015260800190565b6020808252601a908201527f496e76616c6964205175657565207472616e73616374696f6e2e000000000000604082015260600190565b60208082526015908201527424b73b30b634b2103130ba31b4103432b0b232b91760591b604082015260600190565b60208082526025908201527f436f6e746578742074696d657374616d702069732066726f6d207468652066756040820152643a3ab9329760d91b606082015260800190565b6020808252602b908201527f496e73756666696369656e742067617320666f72204c322072617465206c696d60408201526a34ba34b73390313ab9371760a91b606082015260800190565b60208082526035908201527f436f6e746578742074696d657374616d702076616c756573206d757374206d6f6040820152743737ba37b734b1b0b6363c9034b731b932b0b9b29760591b606082015260800190565b6020808252602a908201527f496e76616c6964205175657565207472616e73616374696f6e20696e636c757360408201526934b7b710383937b7b31760b11b606082015260800190565b60208082526045908201527f53657175656e636572207472616e73616374696f6e20626c6f636b4e756d626560408201527f7220657863656564732074686174206f66206e65787420717565756520656c6560608201526436b2b73a1760d91b608082015260a00190565b60208082526021908201527f4d75737420617070656e64206174206c65617374206f6e6520656c656d656e746040820152601760f91b606082015260800190565b60208082526026908201527f436f6e746578742074696d657374616d7020746f6f2066617220696e20746865604082015265103830b9ba1760d11b606082015260800190565b60208082526022908201527f4e6f7420656e6f756768204261746368436f6e74657874732070726f76696465604082015261321760f11b606082015260800190565b60208082526029908201527f4e6f7420656e6f75676820717565756564207472616e73616374696f6e732074604082015268379030b83832b7321760b91b606082015260800190565b60208082526037908201527f436f6e7465787420626c6f636b4e756d6265722076616c756573206d7573742060408201527f6d6f6e6f746f6e6963616c6c7920696e6372656173652e000000000000000000606082015260800190565b8151815260208083015164ffffffffff90811691830191909152604092830151169181019190915260600190565b90815260200190565b9283526020830191909152604082015260600190565b63ffffffff91909116815260200190565b64ffffffffff91909116815260200190565b64ffffffffff9384168152919092166020820152604081019190915260600190565b60405181810167ffffffffffffffff81118282101715612f3257fe5b60405291905056fe4f564d5f436861696e53746f72616765436f6e7461696e65723a4354433a71756575654f564d5f4465636f6d7072657373696f6e507265636f6d70696c65416464726573734c69625f4d65726b6c65547265653a20496e646578206f7574206f6620626f756e64732e4c69625f4d65726b6c65547265653a2043616e6e6f7420636f6d70757465206365696c286c6f675f3229206f6620302e4c69625f4d65726b6c65547265653a20546f74616c206c6561766573206d7573742062652067726561746572207468616e207a65726f2e4c69625f4d65726b6c65547265653a20546f74616c207369626c696e677320646f6573206e6f7420636f72726563746c7920636f72726573706f6e6420746f20746f74616c206c65617665732e4f564d5f436861696e53746f72616765436f6e7461696e65723a4354433a626174636865734c69625f4d65726b6c65547265653a204d7573742070726f76696465206174206c65617374206f6e65206c65616620686173682ea26469706673582212203512ca678bca74305bf6a879ce3d6142d5a90f38111948470b55a07a416cec5964736f6c63430007060033", - "devdoc": { - "kind": "dev", - "methods": { - "appendQueueBatch(uint256)": { - "params": { - "_numQueuedTransactions": "Number of transactions to append." - } - }, - "appendSequencerBatch()": { - "details": "This function uses a custom encoding scheme for efficiency reasons. .param _shouldStartAtElement Specific batch we expect to start appending to. .param _totalElementsToAppend Total number of batch elements we expect to append. .param _contexts Array of batch contexts. .param _transactionDataFields Array of raw transaction data." - }, - "batches()": { - "returns": { - "_0": "Reference to the batch storage container." - } - }, - "enqueue(address,uint256,bytes)": { - "params": { - "_data": "Transaction data.", - "_gasLimit": "Gas limit for the given transaction.", - "_target": "Target contract to send the transaction to." - } - }, - "getNextQueueIndex()": { - "returns": { - "_0": "Index for the next queue element." - } - }, - "getNumPendingQueueElements()": { - "returns": { - "_0": "Length of the queue." - } - }, - "getQueueElement(uint256)": { - "params": { - "_index": "Index of the queue element to access." - }, - "returns": { - "_element": "Queue element at the given index." - } - }, - "getQueueLength()": { - "returns": { - "_0": "Length of the queue." - } - }, - "getTotalBatches()": { - "returns": { - "_totalBatches": "Total submitted batches." - } - }, - "getTotalElements()": { - "returns": { - "_totalElements": "Total submitted elements." - } - }, - "queue()": { - "returns": { - "_0": "Reference to the queue storage container." - } - }, - "verifyTransaction((uint256,uint256,uint8,address,address,uint256,bytes),(bool,uint256,uint256,uint256,bytes),(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))": { - "params": { - "_batchHeader": "Header of the batch the transaction was included in.", - "_inclusionProof": "Inclusion proof for the provided transaction chain element.", - "_transaction": "Transaction to verify.", - "_txChainElement": "Transaction chain element corresponding to the transaction." - }, - "returns": { - "_0": "True if the transaction exists in the CTC, false if not." - } - } - }, - "title": "OVM_CanonicalTransactionChain", - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": { - "appendQueueBatch(uint256)": { - "notice": "Appends a given number of queued transactions as a single batch." - }, - "appendSequencerBatch()": { - "notice": "Allows the sequencer to append a batch of transactions." - }, - "batches()": { - "notice": "Accesses the batch storage container." - }, - "enqueue(address,uint256,bytes)": { - "notice": "Adds a transaction to the queue." - }, - "getNextQueueIndex()": { - "notice": "Returns the index of the next element to be enqueued." - }, - "getNumPendingQueueElements()": { - "notice": "Get the number of queue elements which have not yet been included." - }, - "getQueueElement(uint256)": { - "notice": "Gets the queue element at a particular index." - }, - "getQueueLength()": { - "notice": "Retrieves the length of the queue, including both pending and canonical transactions." - }, - "getTotalBatches()": { - "notice": "Retrieves the total number of batches submitted." - }, - "getTotalElements()": { - "notice": "Retrieves the total number of elements submitted." - }, - "queue()": { - "notice": "Accesses the queue storage container." - }, - "verifyTransaction((uint256,uint256,uint8,address,address,uint256,bytes),(bool,uint256,uint256,uint256,bytes),(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))": { - "notice": "Verifies whether a transaction is included in the chain." - } - }, - "version": 1 - }, - "storageLayout": { - "storage": [ - { - "astId": 11707, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_CanonicalTransactionChain.sol:OVM_CanonicalTransactionChain", - "label": "libAddressManager", - "offset": 0, - "slot": "0", - "type": "t_contract(Lib_AddressManager)11700" - }, - { - "astId": 1388, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_CanonicalTransactionChain.sol:OVM_CanonicalTransactionChain", - "label": "forceInclusionPeriodSeconds", - "offset": 0, - "slot": "1", - "type": "t_uint256" - }, - { - "astId": 1390, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_CanonicalTransactionChain.sol:OVM_CanonicalTransactionChain", - "label": "forceInclusionPeriodBlocks", - "offset": 0, - "slot": "2", - "type": "t_uint256" - }, - { - "astId": 1392, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_CanonicalTransactionChain.sol:OVM_CanonicalTransactionChain", - "label": "maxTransactionGasLimit", - "offset": 0, - "slot": "3", - "type": "t_uint256" - } - ], - "types": { - "t_contract(Lib_AddressManager)11700": { - "encoding": "inplace", - "label": "contract Lib_AddressManager", - "numberOfBytes": "20" - }, - "t_uint256": { - "encoding": "inplace", - "label": "uint256", - "numberOfBytes": "32" - } - } - } -} \ No newline at end of file diff --git a/packages/contracts/deployments/goerli-v1/OVM_ChainStorageContainer-CTC-batches.json b/packages/contracts/deployments/goerli-v1/OVM_ChainStorageContainer-CTC-batches.json deleted file mode 100644 index 8dbb3690db947..0000000000000 --- a/packages/contracts/deployments/goerli-v1/OVM_ChainStorageContainer-CTC-batches.json +++ /dev/null @@ -1,488 +0,0 @@ -{ - "address": "0xe0992cB281cfb66cC53A98B7d32B0305d37F723D", - "abi": [ - { - "inputs": [ - { - "internalType": "address", - "name": "_libAddressManager", - "type": "address" - }, - { - "internalType": "string", - "name": "_owner", - "type": "string" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_index", - "type": "uint256" - }, - { - "internalType": "bytes27", - "name": "_globalMetadata", - "type": "bytes27" - } - ], - "name": "deleteElementsAfterInclusive", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_index", - "type": "uint256" - } - ], - "name": "deleteElementsAfterInclusive", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_index", - "type": "uint256" - } - ], - "name": "get", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getGlobalMetadata", - "outputs": [ - { - "internalType": "bytes27", - "name": "", - "type": "bytes27" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "length", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "owner", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "_object", - "type": "bytes32" - }, - { - "internalType": "bytes27", - "name": "_globalMetadata", - "type": "bytes27" - } - ], - "name": "push", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "_object", - "type": "bytes32" - } - ], - "name": "push", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "_objectA", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "_objectB", - "type": "bytes32" - }, - { - "internalType": "bytes27", - "name": "_globalMetadata", - "type": "bytes27" - } - ], - "name": "push2", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "_objectA", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "_objectB", - "type": "bytes32" - } - ], - "name": "push2", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "string", - "name": "_name", - "type": "string" - } - ], - "name": "resolve", - "outputs": [ - { - "internalType": "address", - "name": "_contract", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes27", - "name": "_globalMetadata", - "type": "bytes27" - } - ], - "name": "setGlobalMetadata", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_index", - "type": "uint256" - } - ], - "name": "setNextOverwritableIndex", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - } - ], - "transactionHash": "0x86b9f5af9ce79ad3dca2a59ed521e75d88ed6d816f85e49b15232731cf1b16eb", - "receipt": { - "to": null, - "from": "0x558ba9b8d78713fbf768c1f8a584485B4003f43F", - "contractAddress": "0x4C4a482b6bE75FDce6E94Be10423363108f34fDf", - "transactionIndex": 1, - "gasUsed": "1103714", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0x7dc617150a7075769c500e7ebe66c4357400e4d7a81a26495e265d4949b2fdd6", - "transactionHash": "0x86b9f5af9ce79ad3dca2a59ed521e75d88ed6d816f85e49b15232731cf1b16eb", - "logs": [], - "blockNumber": 4573377, - "cumulativeGasUsed": "1155953", - "status": 1, - "byzantium": true - }, - "args": [ - "0xE630cdf302880783364334455C8352fE0aB5b748", - "OVM_CanonicalTransactionChain" - ], - "solcInputHash": "cebcb515c1a9c570d96e0b8f6fd237e2", - "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_owner\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"get\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getGlobalMetadata\",\"outputs\":[{\"internalType\":\"bytes27\",\"name\":\"\",\"type\":\"bytes27\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"length\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_objectA\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"_objectB\",\"type\":\"bytes32\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"push2\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_objectA\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"_objectB\",\"type\":\"bytes32\"}],\"name\":\"push2\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"_contract\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"setGlobalMetadata\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"setNextOverwritableIndex\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\",\"_owner\":\"Name of the contract that owns this container (will be resolved later).\"}},\"deleteElementsAfterInclusive(uint256)\":{\"params\":{\"_index\":\"Object index to delete from.\"}},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_index\":\"Object index to delete from.\"}},\"get(uint256)\":{\"params\":{\"_index\":\"Index of the particular object to access.\"},\"returns\":{\"_0\":\"32 byte object value.\"}},\"getGlobalMetadata()\":{\"returns\":{\"_0\":\"Container global metadata field.\"}},\"length()\":{\"returns\":{\"_0\":\"Number of objects in the container.\"}},\"push(bytes32)\":{\"params\":{\"_object\":\"A 32 byte value to insert into the container.\"}},\"push(bytes32,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_object\":\"A 32 byte value to insert into the container.\"}},\"push2(bytes32,bytes32)\":{\"params\":{\"_objectA\":\"First 32 byte value to insert into the container.\",\"_objectB\":\"Second 32 byte value to insert into the container.\"}},\"push2(bytes32,bytes32,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_objectA\":\"First 32 byte value to insert into the container.\",\"_objectB\":\"Second 32 byte value to insert into the container.\"}},\"setGlobalMetadata(bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata to set.\"}}},\"title\":\"OVM_ChainStorageContainer\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"deleteElementsAfterInclusive(uint256)\":{\"notice\":\"Removes all objects after and including a given index.\"},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"notice\":\"Removes all objects after and including a given index. Also allows setting the global metadata field.\"},\"get(uint256)\":{\"notice\":\"Retrieves an object from the container.\"},\"getGlobalMetadata()\":{\"notice\":\"Retrieves the container's global metadata field.\"},\"length()\":{\"notice\":\"Retrieves the number of objects stored in the container.\"},\"push(bytes32)\":{\"notice\":\"Pushes an object into the container.\"},\"push(bytes32,bytes27)\":{\"notice\":\"Pushes an object into the container. Function allows setting the global metadata since we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global metadata (it's an optimization).\"},\"push2(bytes32,bytes32)\":{\"notice\":\"Pushes two objects into the container at the same time. A useful optimization.\"},\"push2(bytes32,bytes32,bytes27)\":{\"notice\":\"Pushes two objects into the container at the same time. Also allows setting the global metadata field.\"},\"setGlobalMetadata(bytes27)\":{\"notice\":\"Sets the container's global metadata field. We're using `bytes27` here because we use five bytes to maintain the length of the underlying data structure, meaning we have an extra 27 bytes to store arbitrary data.\"},\"setNextOverwritableIndex(uint256)\":{\"notice\":\"Marks an index as overwritable, meaing the underlying buffer can start to write values over any objects before and including the given index.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol\":\"OVM_ChainStorageContainer\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol\":{\"content\":\"pragma solidity ^0.7.0;\\n\\n/* Library Imports */\\nimport { Lib_RingBuffer } from \\\"../../libraries/utils/Lib_RingBuffer.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_ChainStorageContainer } from \\\"../../iOVM/chain/iOVM_ChainStorageContainer.sol\\\";\\n\\n/**\\n * @title OVM_ChainStorageContainer\\n */\\ncontract OVM_ChainStorageContainer is iOVM_ChainStorageContainer, Lib_AddressResolver {\\n\\n /*************\\n * Libraries *\\n *************/\\n\\n using Lib_RingBuffer for Lib_RingBuffer.RingBuffer;\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n string public owner;\\n Lib_RingBuffer.RingBuffer internal buffer;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n \\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n * @param _owner Name of the contract that owns this container (will be resolved later).\\n */\\n constructor(\\n address _libAddressManager,\\n string memory _owner\\n )\\n Lib_AddressResolver(_libAddressManager)\\n {\\n owner = _owner;\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n \\n modifier onlyOwner() {\\n require(\\n msg.sender == resolve(owner),\\n \\\"OVM_ChainStorageContainer: Function can only be called by the owner.\\\"\\n );\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function setGlobalMetadata(\\n bytes27 _globalMetadata\\n )\\n override\\n public\\n onlyOwner\\n {\\n return buffer.setExtraData(_globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function getGlobalMetadata()\\n override\\n public\\n view\\n returns (\\n bytes27\\n )\\n {\\n return buffer.getExtraData();\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function length()\\n override\\n public\\n view\\n returns (\\n uint256\\n )\\n {\\n return uint256(buffer.getLength());\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function push(\\n bytes32 _object\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.push(_object);\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function push(\\n bytes32 _object,\\n bytes27 _globalMetadata\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.push(_object, _globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function push2(\\n bytes32 _objectA,\\n bytes32 _objectB\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.push2(_objectA, _objectB);\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function push2(\\n bytes32 _objectA,\\n bytes32 _objectB,\\n bytes27 _globalMetadata\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.push2(_objectA, _objectB, _globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function get(\\n uint256 _index\\n )\\n override\\n public\\n view\\n returns (\\n bytes32\\n )\\n {\\n return buffer.get(uint40(_index));\\n }\\n \\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.deleteElementsAfterInclusive(\\n uint40(_index)\\n );\\n }\\n \\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index,\\n bytes27 _globalMetadata\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.deleteElementsAfterInclusive(\\n uint40(_index),\\n _globalMetadata\\n );\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function setNextOverwritableIndex(\\n uint256 _index\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.nextOverwritableIndex = _index;\\n }\\n}\\n\",\"keccak256\":\"0xc722e9528988810bd754002dfe3923bc9ac9252c1d981c4803fd5053603bfb11\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_ChainStorageContainer.sol\":{\"content\":\"pragma solidity ^0.7.0;\\n\\n/**\\n * @title iOVM_ChainStorageContainer\\n */\\ninterface iOVM_ChainStorageContainer {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata()\\n external\\n view\\n returns (\\n bytes27\\n );\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length()\\n external\\n view\\n returns (\\n uint256\\n );\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(\\n bytes32 _object\\n )\\n external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(\\n bytes32 _object,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Pushes two objects into the container at the same time. A useful optimization.\\n * @param _objectA First 32 byte value to insert into the container.\\n * @param _objectB Second 32 byte value to insert into the container.\\n */\\n function push2(\\n bytes32 _objectA,\\n bytes32 _objectB\\n )\\n external;\\n\\n /**\\n * Pushes two objects into the container at the same time. Also allows setting the global\\n * metadata field.\\n * @param _objectA First 32 byte value to insert into the container.\\n * @param _objectB Second 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push2(\\n bytes32 _objectA,\\n bytes32 _objectB,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(\\n uint256 _index\\n )\\n external\\n view\\n returns (\\n bytes32\\n );\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index\\n )\\n external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Marks an index as overwritable, meaing the underlying buffer can start to write values over\\n * any objects before and including the given index.\\n */\\n function setNextOverwritableIndex(\\n uint256 _index\\n )\\n external;\\n}\\n\",\"keccak256\":\"0xcfca7da85b35d94c27581c2460b0d48fd0cc51fa72670cc7a2f7f760fb21a2f0\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// +build ovm\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Contract Imports */\\nimport { Ownable } from \\\"./Lib_Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n /*******************************************\\n * Contract Variables: Internal Accounting *\\n *******************************************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n public\\n onlyOwner\\n {\\n emit AddressSet(_name, _address);\\n addresses[_getNameHash(_name)] = _address;\\n }\\n\\n function getAddress(\\n string memory _name\\n )\\n public\\n view\\n returns (address)\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32 _hash\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xdf802e1cc6474df913626991e9fca3835c620a519f397afe04bf9c260e723257\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// +build ovm\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\ncontract Lib_AddressResolver {\\n\\n /*******************************************\\n * Contract Variables: Contract References *\\n *******************************************/\\n\\n Lib_AddressManager internal libAddressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(\\n address _libAddressManager\\n ) public {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function resolve(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address _contract\\n )\\n {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0xf3b9d78b309ddeec259ce3e0e1cfdef3ca40938e9a81971b28ce2b8ea327f533\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// +build ovm\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Ownable\\n * @dev Adapted from https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol\\n */\\nabstract contract Ownable {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n address public owner;\\n\\n\\n /**********\\n * Events *\\n **********/\\n\\n event OwnershipTransferred(\\n address indexed previousOwner,\\n address indexed newOwner\\n );\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n constructor() internal {\\n owner = msg.sender;\\n emit OwnershipTransferred(address(0), owner);\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n owner == msg.sender,\\n \\\"Ownable: caller is not the owner\\\"\\n );\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function renounceOwnership()\\n public\\n virtual\\n onlyOwner\\n {\\n emit OwnershipTransferred(owner, address(0));\\n owner = address(0);\\n }\\n\\n function transferOwnership(address _newOwner)\\n public\\n virtual\\n onlyOwner\\n {\\n require(\\n _newOwner != address(0),\\n \\\"Ownable: new owner cannot be the zero address\\\"\\n );\\n\\n emit OwnershipTransferred(owner, _newOwner);\\n owner = _newOwner;\\n }\\n}\\n\",\"keccak256\":\"0xe0409fbd236d16ca6be439d9d97dd36d0d9a0697ee0062d49588b9d29c248e47\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_RingBuffer.sol\":{\"content\":\"pragma solidity ^0.7.0;\\n\\nlibrary Lib_RingBuffer {\\n using Lib_RingBuffer for RingBuffer;\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Buffer {\\n uint256 length;\\n mapping (uint256 => bytes32) buf;\\n }\\n\\n struct RingBuffer {\\n bytes32 contextA;\\n bytes32 contextB;\\n Buffer bufferA;\\n Buffer bufferB;\\n uint256 nextOverwritableIndex;\\n }\\n\\n struct RingBufferContext {\\n // contextA\\n uint40 globalIndex;\\n bytes27 extraData;\\n\\n // contextB\\n uint64 currBufferIndex;\\n uint40 prevResetIndex;\\n uint40 currResetIndex;\\n }\\n\\n\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 constant MIN_CAPACITY = 16;\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n * @param _extraData Optional global extra data.\\n */\\n function push(\\n RingBuffer storage _self,\\n bytes32 _value,\\n bytes27 _extraData\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n Buffer storage currBuffer = _self.getBuffer(ctx.currBufferIndex);\\n\\n // Set a minimum capacity.\\n if (currBuffer.length == 0) {\\n currBuffer.length = MIN_CAPACITY;\\n }\\n\\n // Check if we need to expand the buffer.\\n if (ctx.globalIndex - ctx.currResetIndex >= currBuffer.length) {\\n if (ctx.currResetIndex < _self.nextOverwritableIndex) {\\n // We're going to overwrite the inactive buffer.\\n // Bump the buffer index, reset the delete offset, and set our reset indices.\\n ctx.currBufferIndex++;\\n ctx.prevResetIndex = ctx.currResetIndex;\\n ctx.currResetIndex = ctx.globalIndex;\\n\\n // Swap over to the next buffer.\\n currBuffer = _self.getBuffer(ctx.currBufferIndex);\\n } else {\\n // We're not overwriting yet, double the length of the current buffer.\\n currBuffer.length *= 2;\\n }\\n }\\n\\n // Index to write to is the difference of the global and reset indices.\\n uint256 writeHead = ctx.globalIndex - ctx.currResetIndex;\\n currBuffer.buf[writeHead] = _value;\\n\\n // Bump the global index and insert our extra data, then save the context.\\n ctx.globalIndex++;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n */\\n function push(\\n RingBuffer storage _self,\\n bytes32 _value\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n \\n _self.push(\\n _value,\\n ctx.extraData\\n );\\n }\\n\\n /**\\n * Pushes a two elements to the buffer.\\n * @param _self Buffer to access.\\n * @param _valueA First value to push to the buffer.\\n * @param _valueA Second value to push to the buffer.\\n * @param _extraData Optional global extra data.\\n */\\n function push2(\\n RingBuffer storage _self,\\n bytes32 _valueA,\\n bytes32 _valueB,\\n bytes27 _extraData\\n )\\n internal\\n {\\n _self.push(_valueA, _extraData);\\n _self.push(_valueB, _extraData);\\n }\\n\\n /**\\n * Pushes a two elements to the buffer.\\n * @param _self Buffer to access.\\n * @param _valueA First value to push to the buffer.\\n * @param _valueA Second value to push to the buffer.\\n */\\n function push2(\\n RingBuffer storage _self,\\n bytes32 _valueA,\\n bytes32 _valueB\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n\\n _self.push2(\\n _valueA,\\n _valueB,\\n ctx.extraData\\n );\\n }\\n\\n /**\\n * Retrieves an element from the buffer.\\n * @param _self Buffer to access.\\n * @param _index Element index to retrieve.\\n * @return Value of the element at the given index.\\n */\\n function get(\\n RingBuffer storage _self,\\n uint256 _index\\n )\\n internal\\n view\\n returns (\\n bytes32 \\n )\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n\\n require(\\n _index < ctx.globalIndex,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n Buffer storage currBuffer = _self.getBuffer(ctx.currBufferIndex);\\n Buffer storage prevBuffer = _self.getBuffer(ctx.currBufferIndex + 1);\\n\\n if (_index >= ctx.currResetIndex) {\\n // We're trying to load an element from the current buffer.\\n // Relative index is just the difference from the reset index.\\n uint256 relativeIndex = _index - ctx.currResetIndex;\\n\\n // Shouldn't happen but why not check.\\n require(\\n relativeIndex < currBuffer.length,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n return currBuffer.buf[relativeIndex];\\n } else {\\n // We're trying to load an element from the previous buffer.\\n // Relative index is the difference from the reset index in the other direction.\\n uint256 relativeIndex = ctx.currResetIndex - _index;\\n\\n // Condition only fails in the case that we deleted and flipped buffers.\\n require(\\n ctx.currResetIndex > ctx.prevResetIndex,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n // Make sure we're not trying to read beyond the array.\\n require(\\n relativeIndex <= prevBuffer.length,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n return prevBuffer.buf[prevBuffer.length - relativeIndex];\\n }\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n * @param _extraData Optional global extra data.\\n */\\n function deleteElementsAfterInclusive(\\n RingBuffer storage _self,\\n uint40 _index,\\n bytes27 _extraData\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n\\n require(\\n _index < ctx.globalIndex && _index >= ctx.prevResetIndex,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n Buffer storage currBuffer = _self.getBuffer(ctx.currBufferIndex);\\n Buffer storage prevBuffer = _self.getBuffer(ctx.currBufferIndex + 1);\\n\\n if (_index < ctx.currResetIndex) {\\n // We're switching back to the previous buffer.\\n // Reduce the buffer index, set the current reset index back to match the previous one.\\n // We use the equality of these two values to prevent reading beyond this buffer.\\n ctx.currBufferIndex--;\\n ctx.currResetIndex = ctx.prevResetIndex;\\n }\\n\\n // Set our global index and extra data, save the context.\\n ctx.globalIndex = _index;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n */\\n function deleteElementsAfterInclusive(\\n RingBuffer storage _self,\\n uint40 _index\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n _self.deleteElementsAfterInclusive(\\n _index,\\n ctx.extraData\\n );\\n }\\n\\n /**\\n * Retrieves the current global index.\\n * @param _self Buffer to access.\\n * @return Current global index.\\n */\\n function getLength(\\n RingBuffer storage _self\\n )\\n internal\\n view\\n returns (\\n uint40\\n )\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n return ctx.globalIndex;\\n }\\n\\n /**\\n * Changes current global extra data.\\n * @param _self Buffer to access.\\n * @param _extraData New global extra data.\\n */\\n function setExtraData(\\n RingBuffer storage _self,\\n bytes27 _extraData\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Retrieves the current global extra data.\\n * @param _self Buffer to access.\\n * @return Current global extra data.\\n */\\n function getExtraData(\\n RingBuffer storage _self\\n )\\n internal\\n view\\n returns (\\n bytes27\\n )\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n return ctx.extraData;\\n }\\n\\n /**\\n * Sets the current ring buffer context.\\n * @param _self Buffer to access.\\n * @param _ctx Current ring buffer context.\\n */\\n function setContext(\\n RingBuffer storage _self,\\n RingBufferContext memory _ctx\\n )\\n internal\\n returns (\\n bytes32\\n )\\n {\\n bytes32 contextA;\\n bytes32 contextB;\\n\\n uint40 globalIndex = _ctx.globalIndex;\\n bytes27 extraData = _ctx.extraData;\\n assembly {\\n contextA := globalIndex\\n contextA := or(contextA, extraData)\\n }\\n\\n uint64 currBufferIndex = _ctx.currBufferIndex;\\n uint40 prevResetIndex = _ctx.prevResetIndex;\\n uint40 currResetIndex = _ctx.currResetIndex;\\n assembly {\\n contextB := currBufferIndex\\n contextB := or(contextB, shl(64, prevResetIndex))\\n contextB := or(contextB, shl(104, currResetIndex))\\n }\\n\\n if (_self.contextA != contextA) {\\n _self.contextA = contextA;\\n }\\n\\n if (_self.contextB != contextB) {\\n _self.contextB = contextB;\\n }\\n }\\n\\n /**\\n * Retrieves the current ring buffer context.\\n * @param _self Buffer to access.\\n * @return Current ring buffer context.\\n */\\n function getContext(\\n RingBuffer storage _self\\n )\\n internal\\n view\\n returns (\\n RingBufferContext memory\\n )\\n {\\n bytes32 contextA = _self.contextA;\\n bytes32 contextB = _self.contextB;\\n\\n uint40 globalIndex;\\n bytes27 extraData;\\n assembly {\\n globalIndex := and(contextA, 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF)\\n extraData := and(contextA, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000)\\n }\\n\\n uint64 currBufferIndex;\\n uint40 prevResetIndex;\\n uint40 currResetIndex;\\n assembly {\\n currBufferIndex := and(contextB, 0x000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF)\\n prevResetIndex := shr(64, and(contextB, 0x00000000000000000000000000000000000000FFFFFFFFFF0000000000000000))\\n currResetIndex := shr(104, and(contextB, 0x0000000000000000000000000000FFFFFFFFFF00000000000000000000000000))\\n }\\n\\n return RingBufferContext({\\n globalIndex: globalIndex,\\n extraData: extraData,\\n currBufferIndex: currBufferIndex,\\n prevResetIndex: prevResetIndex,\\n currResetIndex: currResetIndex\\n });\\n }\\n\\n /**\\n * Retrieves the a buffer from the ring buffer by index.\\n * @param _self Buffer to access.\\n * @param _which Index of the sub buffer to access.\\n * @return Sub buffer for the index.\\n */\\n function getBuffer(\\n RingBuffer storage _self,\\n uint256 _which\\n )\\n internal\\n view\\n returns (\\n Buffer storage\\n )\\n {\\n return _which % 2 == 0 ? _self.bufferA : _self.bufferB;\\n }\\n}\\n\",\"keccak256\":\"0x0c4bb53aba64441b2ec26e7a13de8f04f104bb654e550ccc30db500cac33d2a3\"}},\"version\":1}", - "bytecode": "0x60806040523480156200001157600080fd5b50604051620013f3380380620013f3833981810160405260408110156200003757600080fd5b8151602083018051604051929492938301929190846401000000008211156200005f57600080fd5b9083019060208201858111156200007557600080fd5b82516401000000008111828201881017156200009057600080fd5b82525081516020918201929091019080838360005b83811015620000bf578181015183820152602001620000a5565b50505050905090810190601f168015620000ed5780820380516001836020036101000a031916815260200191505b506040525050600080546001600160a01b0319166001600160a01b038516179055508051620001249060019060208401906200012d565b505050620001d9565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282620001655760008555620001b0565b82601f106200018057805160ff1916838001178555620001b0565b82800160010185558215620001b0579182015b82811115620001b057825182559160200191906001019062000193565b50620001be929150620001c2565b5090565b5b80821115620001be5760008155600101620001c3565b61120a80620001e96000396000f3fe608060405234801561001057600080fd5b50600436106100cf5760003560e01c80634651d91e1161008c578063b298e36b11610066578063b298e36b14610315578063ccf8f96914610332578063d41c021814610355578063fa9e936c14610378576100cf565b80634651d91e1461025e5780638da5cb5b1461027b5780639507d39a146102f8576100cf565b806314f22255146100d4578063167fd681146101075780631f7b6d32146101325780632015276c1461014c57806329061de214610177578063461a44781461019c575b600080fd5b610105600480360360608110156100ea57600080fd5b508035906020810135906040013564ffffffffff1916610395565b005b6101056004803603604081101561011d57600080fd5b508035906020013564ffffffffff191661048c565b61013a61054c565b60408051918252519081900360200190f35b6101056004803603604081101561016257600080fd5b508035906020013564ffffffffff1916610564565b6101056004803603602081101561018d57600080fd5b503564ffffffffff1916610620565b610242600480360360208110156101b257600080fd5b8101906020810181356401000000008111156101cd57600080fd5b8201836020820111156101df57600080fd5b8035906020019184600183028401116401000000008311171561020157600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506106de945050505050565b604080516001600160a01b039092168252519081900360200190f35b6101056004803603602081101561027457600080fd5b50356107ba565b610283610875565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102bd5781810151838201526020016102a5565b50505050905090810190601f1680156102ea5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61013a6004803603602081101561030e57600080fd5b5035610902565b6101056004803603602081101561032b57600080fd5b503561091c565b61033a6109d7565b6040805164ffffffffff199092168252519081900360200190f35b6101056004803603604081101561036b57600080fd5b50803590602001356109e8565b6101056004803603602081101561038e57600080fd5b5035610aa4565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261042b93909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b820191906000526020600020905b81548152906001019060200180831161040457829003601f168201915b50505050506106de565b6001600160a01b0316336001600160a01b03161461047a5760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b6104876002848484610b59565b505050565b60018054604080516020601f6002600019610100878916150201909516949094049384018190048102820181019092528281526104ed93909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b6001600160a01b0316336001600160a01b03161461053c5760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b61054860028383610b75565b5050565b60006105586002610cb7565b64ffffffffff16905090565b60018054604080516020601f6002600019610100878916150201909516949094049384018190048102820181019092528281526105c593909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b6001600160a01b0316336001600160a01b0316146106145760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b61054860028383610ccb565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261068193909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b6001600160a01b0316336001600160a01b0316146106d05760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b6106db600282610dca565b50565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b8381101561073e578181015183820152602001610726565b50505050905090810190601f16801561076b5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561078857600080fd5b505afa15801561079c573d6000803e3d6000fd5b505050506040513d60208110156107b257600080fd5b505192915050565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261081b93909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b6001600160a01b0316336001600160a01b03161461086a5760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b6106db600282610def565b60018054604080516020600284861615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156108fa5780601f106108cf576101008083540402835291602001916108fa565b820191906000526020600020905b8154815290600101906020018083116108dd57829003601f168201915b505050505081565b6000610916600264ffffffffff8416610e15565b92915050565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261097d93909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b6001600160a01b0316336001600160a01b0316146109cc5760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b6106db60028261101e565b60006109e36002611044565b905090565b60018054604080516020601f600260001961010087891615020190951694909404938401819004810282018101909252828152610a4993909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b6001600160a01b0316336001600160a01b031614610a985760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b6105486002838361105b565b60018054604080516020601f600260001961010087891615020190951694909404938401819004810282018101909252828152610b0593909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b6001600160a01b0316336001600160a01b031614610b545760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b600855565b610b64848483610ccb565b610b6f848383610ccb565b50505050565b6000610b8084611083565b9050806000015164ffffffffff168364ffffffffff16108015610bb55750806060015164ffffffffff168364ffffffffff1610155b610bfd576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b6000610c20826040015167ffffffffffffffff16866110e390919063ffffffff16565b90506000610c48836040015160010167ffffffffffffffff16876110e390919063ffffffff16565b9050826080015164ffffffffff168564ffffffffff161015610c8c576040830180516000190167ffffffffffffffff169052606083015164ffffffffff1660808401525b64ffffffffff8516835264ffffffffff1984166020840152610cae8684611103565b50505050505050565b600080610cc383611083565b519392505050565b6000610cd684611083565b90506000610cfb826040015167ffffffffffffffff16866110e390919063ffffffff16565b8054909150610d0957601081555b8054608083015183510364ffffffffff1610610d80578460060154826080015164ffffffffff161015610d785760408201805160010167ffffffffffffffff169081905260808301805164ffffffffff90811660608601528451169052610d719086906110e3565b9050610d80565b805460020281555b608082015182510364ffffffffff9081166000818152600184810160209081526040909220889055855101909216845264ffffffffff19851691840191909152610cae8684611103565b6000610dd583611083565b64ffffffffff19831660208201529050610b6f8382611103565b6000610dfa83611083565b905061048782826020015185610b759092919063ffffffff16565b600080610e2184611083565b805190915064ffffffffff168310610e77576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b6000610e9a826040015167ffffffffffffffff16866110e390919063ffffffff16565b90506000610ec2836040015160010167ffffffffffffffff16876110e390919063ffffffff16565b9050826080015164ffffffffff168510610f4f576080830151825464ffffffffff9091168603908110610f33576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b6000908152600190920160205250604090205491506109169050565b6080830151606084015164ffffffffff9182168781039290911610610fb2576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b8154811115610fff576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b8154036000908152600190910160205260409020549250610916915050565b600061102983611083565b905061048782826020015185610ccb9092919063ffffffff16565b60008061105083611083565b602001519392505050565b600061106684611083565b9050610b6f8383836020015187610b59909392919063ffffffff16565b61108b611162565b5080546001909101546040805160a08101825264ffffffffff808516825264ffffffffff19909416602082015267ffffffffffffffff8316818301529082901c8316606082015260689190911c909116608082015290565b600060028206156110f757826004016110fc565b826002015b9392505050565b80516020820151604080840151606085015160808601518754600096868117969584901b8517606884901b17959094909390929091871461114257868a555b858a60010154146111555760018a018690555b5050505050505092915050565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091529056fe4f564d5f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2063616e206f6e6c792062652063616c6c656420627920746865206f776e65722ea264697066735822122037f5f91f3a7302668798afaeee2c0c2d9aad06dfcc80e263efc2cd8f4842eebe64736f6c63430007060033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100cf5760003560e01c80634651d91e1161008c578063b298e36b11610066578063b298e36b14610315578063ccf8f96914610332578063d41c021814610355578063fa9e936c14610378576100cf565b80634651d91e1461025e5780638da5cb5b1461027b5780639507d39a146102f8576100cf565b806314f22255146100d4578063167fd681146101075780631f7b6d32146101325780632015276c1461014c57806329061de214610177578063461a44781461019c575b600080fd5b610105600480360360608110156100ea57600080fd5b508035906020810135906040013564ffffffffff1916610395565b005b6101056004803603604081101561011d57600080fd5b508035906020013564ffffffffff191661048c565b61013a61054c565b60408051918252519081900360200190f35b6101056004803603604081101561016257600080fd5b508035906020013564ffffffffff1916610564565b6101056004803603602081101561018d57600080fd5b503564ffffffffff1916610620565b610242600480360360208110156101b257600080fd5b8101906020810181356401000000008111156101cd57600080fd5b8201836020820111156101df57600080fd5b8035906020019184600183028401116401000000008311171561020157600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506106de945050505050565b604080516001600160a01b039092168252519081900360200190f35b6101056004803603602081101561027457600080fd5b50356107ba565b610283610875565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102bd5781810151838201526020016102a5565b50505050905090810190601f1680156102ea5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61013a6004803603602081101561030e57600080fd5b5035610902565b6101056004803603602081101561032b57600080fd5b503561091c565b61033a6109d7565b6040805164ffffffffff199092168252519081900360200190f35b6101056004803603604081101561036b57600080fd5b50803590602001356109e8565b6101056004803603602081101561038e57600080fd5b5035610aa4565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261042b93909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b820191906000526020600020905b81548152906001019060200180831161040457829003601f168201915b50505050506106de565b6001600160a01b0316336001600160a01b03161461047a5760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b6104876002848484610b59565b505050565b60018054604080516020601f6002600019610100878916150201909516949094049384018190048102820181019092528281526104ed93909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b6001600160a01b0316336001600160a01b03161461053c5760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b61054860028383610b75565b5050565b60006105586002610cb7565b64ffffffffff16905090565b60018054604080516020601f6002600019610100878916150201909516949094049384018190048102820181019092528281526105c593909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b6001600160a01b0316336001600160a01b0316146106145760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b61054860028383610ccb565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261068193909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b6001600160a01b0316336001600160a01b0316146106d05760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b6106db600282610dca565b50565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b8381101561073e578181015183820152602001610726565b50505050905090810190601f16801561076b5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561078857600080fd5b505afa15801561079c573d6000803e3d6000fd5b505050506040513d60208110156107b257600080fd5b505192915050565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261081b93909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b6001600160a01b0316336001600160a01b03161461086a5760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b6106db600282610def565b60018054604080516020600284861615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156108fa5780601f106108cf576101008083540402835291602001916108fa565b820191906000526020600020905b8154815290600101906020018083116108dd57829003601f168201915b505050505081565b6000610916600264ffffffffff8416610e15565b92915050565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261097d93909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b6001600160a01b0316336001600160a01b0316146109cc5760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b6106db60028261101e565b60006109e36002611044565b905090565b60018054604080516020601f600260001961010087891615020190951694909404938401819004810282018101909252828152610a4993909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b6001600160a01b0316336001600160a01b031614610a985760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b6105486002838361105b565b60018054604080516020601f600260001961010087891615020190951694909404938401819004810282018101909252828152610b0593909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b6001600160a01b0316336001600160a01b031614610b545760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b600855565b610b64848483610ccb565b610b6f848383610ccb565b50505050565b6000610b8084611083565b9050806000015164ffffffffff168364ffffffffff16108015610bb55750806060015164ffffffffff168364ffffffffff1610155b610bfd576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b6000610c20826040015167ffffffffffffffff16866110e390919063ffffffff16565b90506000610c48836040015160010167ffffffffffffffff16876110e390919063ffffffff16565b9050826080015164ffffffffff168564ffffffffff161015610c8c576040830180516000190167ffffffffffffffff169052606083015164ffffffffff1660808401525b64ffffffffff8516835264ffffffffff1984166020840152610cae8684611103565b50505050505050565b600080610cc383611083565b519392505050565b6000610cd684611083565b90506000610cfb826040015167ffffffffffffffff16866110e390919063ffffffff16565b8054909150610d0957601081555b8054608083015183510364ffffffffff1610610d80578460060154826080015164ffffffffff161015610d785760408201805160010167ffffffffffffffff169081905260808301805164ffffffffff90811660608601528451169052610d719086906110e3565b9050610d80565b805460020281555b608082015182510364ffffffffff9081166000818152600184810160209081526040909220889055855101909216845264ffffffffff19851691840191909152610cae8684611103565b6000610dd583611083565b64ffffffffff19831660208201529050610b6f8382611103565b6000610dfa83611083565b905061048782826020015185610b759092919063ffffffff16565b600080610e2184611083565b805190915064ffffffffff168310610e77576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b6000610e9a826040015167ffffffffffffffff16866110e390919063ffffffff16565b90506000610ec2836040015160010167ffffffffffffffff16876110e390919063ffffffff16565b9050826080015164ffffffffff168510610f4f576080830151825464ffffffffff9091168603908110610f33576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b6000908152600190920160205250604090205491506109169050565b6080830151606084015164ffffffffff9182168781039290911610610fb2576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b8154811115610fff576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b8154036000908152600190910160205260409020549250610916915050565b600061102983611083565b905061048782826020015185610ccb9092919063ffffffff16565b60008061105083611083565b602001519392505050565b600061106684611083565b9050610b6f8383836020015187610b59909392919063ffffffff16565b61108b611162565b5080546001909101546040805160a08101825264ffffffffff808516825264ffffffffff19909416602082015267ffffffffffffffff8316818301529082901c8316606082015260689190911c909116608082015290565b600060028206156110f757826004016110fc565b826002015b9392505050565b80516020820151604080840151606085015160808601518754600096868117969584901b8517606884901b17959094909390929091871461114257868a555b858a60010154146111555760018a018690555b5050505050505092915050565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091529056fe4f564d5f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2063616e206f6e6c792062652063616c6c656420627920746865206f776e65722ea264697066735822122037f5f91f3a7302668798afaeee2c0c2d9aad06dfcc80e263efc2cd8f4842eebe64736f6c63430007060033", - "devdoc": { - "kind": "dev", - "methods": { - "constructor": { - "params": { - "_libAddressManager": "Address of the Address Manager.", - "_owner": "Name of the contract that owns this container (will be resolved later)." - } - }, - "deleteElementsAfterInclusive(uint256)": { - "params": { - "_index": "Object index to delete from." - } - }, - "deleteElementsAfterInclusive(uint256,bytes27)": { - "params": { - "_globalMetadata": "New global metadata for the container.", - "_index": "Object index to delete from." - } - }, - "get(uint256)": { - "params": { - "_index": "Index of the particular object to access." - }, - "returns": { - "_0": "32 byte object value." - } - }, - "getGlobalMetadata()": { - "returns": { - "_0": "Container global metadata field." - } - }, - "length()": { - "returns": { - "_0": "Number of objects in the container." - } - }, - "push(bytes32)": { - "params": { - "_object": "A 32 byte value to insert into the container." - } - }, - "push(bytes32,bytes27)": { - "params": { - "_globalMetadata": "New global metadata for the container.", - "_object": "A 32 byte value to insert into the container." - } - }, - "push2(bytes32,bytes32)": { - "params": { - "_objectA": "First 32 byte value to insert into the container.", - "_objectB": "Second 32 byte value to insert into the container." - } - }, - "push2(bytes32,bytes32,bytes27)": { - "params": { - "_globalMetadata": "New global metadata for the container.", - "_objectA": "First 32 byte value to insert into the container.", - "_objectB": "Second 32 byte value to insert into the container." - } - }, - "setGlobalMetadata(bytes27)": { - "params": { - "_globalMetadata": "New global metadata to set." - } - } - }, - "title": "OVM_ChainStorageContainer", - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": { - "deleteElementsAfterInclusive(uint256)": { - "notice": "Removes all objects after and including a given index." - }, - "deleteElementsAfterInclusive(uint256,bytes27)": { - "notice": "Removes all objects after and including a given index. Also allows setting the global metadata field." - }, - "get(uint256)": { - "notice": "Retrieves an object from the container." - }, - "getGlobalMetadata()": { - "notice": "Retrieves the container's global metadata field." - }, - "length()": { - "notice": "Retrieves the number of objects stored in the container." - }, - "push(bytes32)": { - "notice": "Pushes an object into the container." - }, - "push(bytes32,bytes27)": { - "notice": "Pushes an object into the container. Function allows setting the global metadata since we'll need to touch the \"length\" storage slot anyway, which also contains the global metadata (it's an optimization)." - }, - "push2(bytes32,bytes32)": { - "notice": "Pushes two objects into the container at the same time. A useful optimization." - }, - "push2(bytes32,bytes32,bytes27)": { - "notice": "Pushes two objects into the container at the same time. Also allows setting the global metadata field." - }, - "setGlobalMetadata(bytes27)": { - "notice": "Sets the container's global metadata field. We're using `bytes27` here because we use five bytes to maintain the length of the underlying data structure, meaning we have an extra 27 bytes to store arbitrary data." - }, - "setNextOverwritableIndex(uint256)": { - "notice": "Marks an index as overwritable, meaing the underlying buffer can start to write values over any objects before and including the given index." - } - }, - "version": 1 - }, - "storageLayout": { - "storage": [ - { - "astId": 11707, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "libAddressManager", - "offset": 0, - "slot": "0", - "type": "t_contract(Lib_AddressManager)11700" - }, - { - "astId": 2888, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "owner", - "offset": 0, - "slot": "1", - "type": "t_string_storage" - }, - { - "astId": 2890, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "buffer", - "offset": 0, - "slot": "2", - "type": "t_struct(RingBuffer)16365_storage" - } - ], - "types": { - "t_bytes32": { - "encoding": "inplace", - "label": "bytes32", - "numberOfBytes": "32" - }, - "t_contract(Lib_AddressManager)11700": { - "encoding": "inplace", - "label": "contract Lib_AddressManager", - "numberOfBytes": "20" - }, - "t_mapping(t_uint256,t_bytes32)": { - "encoding": "mapping", - "key": "t_uint256", - "label": "mapping(uint256 => bytes32)", - "numberOfBytes": "32", - "value": "t_bytes32" - }, - "t_string_storage": { - "encoding": "bytes", - "label": "string", - "numberOfBytes": "32" - }, - "t_struct(Buffer)16354_storage": { - "encoding": "inplace", - "label": "struct Lib_RingBuffer.Buffer", - "members": [ - { - "astId": 16349, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "length", - "offset": 0, - "slot": "0", - "type": "t_uint256" - }, - { - "astId": 16353, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "buf", - "offset": 0, - "slot": "1", - "type": "t_mapping(t_uint256,t_bytes32)" - } - ], - "numberOfBytes": "64" - }, - "t_struct(RingBuffer)16365_storage": { - "encoding": "inplace", - "label": "struct Lib_RingBuffer.RingBuffer", - "members": [ - { - "astId": 16356, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "contextA", - "offset": 0, - "slot": "0", - "type": "t_bytes32" - }, - { - "astId": 16358, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "contextB", - "offset": 0, - "slot": "1", - "type": "t_bytes32" - }, - { - "astId": 16360, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "bufferA", - "offset": 0, - "slot": "2", - "type": "t_struct(Buffer)16354_storage" - }, - { - "astId": 16362, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "bufferB", - "offset": 0, - "slot": "4", - "type": "t_struct(Buffer)16354_storage" - }, - { - "astId": 16364, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "nextOverwritableIndex", - "offset": 0, - "slot": "6", - "type": "t_uint256" - } - ], - "numberOfBytes": "224" - }, - "t_uint256": { - "encoding": "inplace", - "label": "uint256", - "numberOfBytes": "32" - } - } - } -} \ No newline at end of file diff --git a/packages/contracts/deployments/goerli-v1/OVM_ChainStorageContainer-CTC-queue.json b/packages/contracts/deployments/goerli-v1/OVM_ChainStorageContainer-CTC-queue.json deleted file mode 100644 index 9f1b63d29496b..0000000000000 --- a/packages/contracts/deployments/goerli-v1/OVM_ChainStorageContainer-CTC-queue.json +++ /dev/null @@ -1,488 +0,0 @@ -{ - "address": "0x85f5bDc9C0269D32154fa1CCdbf697B46AF37273", - "abi": [ - { - "inputs": [ - { - "internalType": "address", - "name": "_libAddressManager", - "type": "address" - }, - { - "internalType": "string", - "name": "_owner", - "type": "string" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_index", - "type": "uint256" - }, - { - "internalType": "bytes27", - "name": "_globalMetadata", - "type": "bytes27" - } - ], - "name": "deleteElementsAfterInclusive", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_index", - "type": "uint256" - } - ], - "name": "deleteElementsAfterInclusive", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_index", - "type": "uint256" - } - ], - "name": "get", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getGlobalMetadata", - "outputs": [ - { - "internalType": "bytes27", - "name": "", - "type": "bytes27" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "length", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "owner", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "_object", - "type": "bytes32" - }, - { - "internalType": "bytes27", - "name": "_globalMetadata", - "type": "bytes27" - } - ], - "name": "push", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "_object", - "type": "bytes32" - } - ], - "name": "push", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "_objectA", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "_objectB", - "type": "bytes32" - }, - { - "internalType": "bytes27", - "name": "_globalMetadata", - "type": "bytes27" - } - ], - "name": "push2", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "_objectA", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "_objectB", - "type": "bytes32" - } - ], - "name": "push2", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "string", - "name": "_name", - "type": "string" - } - ], - "name": "resolve", - "outputs": [ - { - "internalType": "address", - "name": "_contract", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes27", - "name": "_globalMetadata", - "type": "bytes27" - } - ], - "name": "setGlobalMetadata", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_index", - "type": "uint256" - } - ], - "name": "setNextOverwritableIndex", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - } - ], - "transactionHash": "0x99b89c2345373c5b66554e90da495293799b15988d76cbddc60ff7ab8e9cb996", - "receipt": { - "to": null, - "from": "0x558ba9b8d78713fbf768c1f8a584485B4003f43F", - "contractAddress": "0xC9DE904214A3496b23E54d7876e4A5CfD4584F49", - "transactionIndex": 0, - "gasUsed": "1103714", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0xc4de8bb6a3be0356605a754b0f0913dc2d1ce2a52dd31480cf90815785cd7e9e", - "transactionHash": "0x99b89c2345373c5b66554e90da495293799b15988d76cbddc60ff7ab8e9cb996", - "logs": [], - "blockNumber": 4573379, - "cumulativeGasUsed": "1103714", - "status": 1, - "byzantium": true - }, - "args": [ - "0xE630cdf302880783364334455C8352fE0aB5b748", - "OVM_CanonicalTransactionChain" - ], - "solcInputHash": "cebcb515c1a9c570d96e0b8f6fd237e2", - "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_owner\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"get\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getGlobalMetadata\",\"outputs\":[{\"internalType\":\"bytes27\",\"name\":\"\",\"type\":\"bytes27\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"length\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_objectA\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"_objectB\",\"type\":\"bytes32\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"push2\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_objectA\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"_objectB\",\"type\":\"bytes32\"}],\"name\":\"push2\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"_contract\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"setGlobalMetadata\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"setNextOverwritableIndex\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\",\"_owner\":\"Name of the contract that owns this container (will be resolved later).\"}},\"deleteElementsAfterInclusive(uint256)\":{\"params\":{\"_index\":\"Object index to delete from.\"}},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_index\":\"Object index to delete from.\"}},\"get(uint256)\":{\"params\":{\"_index\":\"Index of the particular object to access.\"},\"returns\":{\"_0\":\"32 byte object value.\"}},\"getGlobalMetadata()\":{\"returns\":{\"_0\":\"Container global metadata field.\"}},\"length()\":{\"returns\":{\"_0\":\"Number of objects in the container.\"}},\"push(bytes32)\":{\"params\":{\"_object\":\"A 32 byte value to insert into the container.\"}},\"push(bytes32,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_object\":\"A 32 byte value to insert into the container.\"}},\"push2(bytes32,bytes32)\":{\"params\":{\"_objectA\":\"First 32 byte value to insert into the container.\",\"_objectB\":\"Second 32 byte value to insert into the container.\"}},\"push2(bytes32,bytes32,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_objectA\":\"First 32 byte value to insert into the container.\",\"_objectB\":\"Second 32 byte value to insert into the container.\"}},\"setGlobalMetadata(bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata to set.\"}}},\"title\":\"OVM_ChainStorageContainer\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"deleteElementsAfterInclusive(uint256)\":{\"notice\":\"Removes all objects after and including a given index.\"},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"notice\":\"Removes all objects after and including a given index. Also allows setting the global metadata field.\"},\"get(uint256)\":{\"notice\":\"Retrieves an object from the container.\"},\"getGlobalMetadata()\":{\"notice\":\"Retrieves the container's global metadata field.\"},\"length()\":{\"notice\":\"Retrieves the number of objects stored in the container.\"},\"push(bytes32)\":{\"notice\":\"Pushes an object into the container.\"},\"push(bytes32,bytes27)\":{\"notice\":\"Pushes an object into the container. Function allows setting the global metadata since we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global metadata (it's an optimization).\"},\"push2(bytes32,bytes32)\":{\"notice\":\"Pushes two objects into the container at the same time. A useful optimization.\"},\"push2(bytes32,bytes32,bytes27)\":{\"notice\":\"Pushes two objects into the container at the same time. Also allows setting the global metadata field.\"},\"setGlobalMetadata(bytes27)\":{\"notice\":\"Sets the container's global metadata field. We're using `bytes27` here because we use five bytes to maintain the length of the underlying data structure, meaning we have an extra 27 bytes to store arbitrary data.\"},\"setNextOverwritableIndex(uint256)\":{\"notice\":\"Marks an index as overwritable, meaing the underlying buffer can start to write values over any objects before and including the given index.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol\":\"OVM_ChainStorageContainer\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol\":{\"content\":\"pragma solidity ^0.7.0;\\n\\n/* Library Imports */\\nimport { Lib_RingBuffer } from \\\"../../libraries/utils/Lib_RingBuffer.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_ChainStorageContainer } from \\\"../../iOVM/chain/iOVM_ChainStorageContainer.sol\\\";\\n\\n/**\\n * @title OVM_ChainStorageContainer\\n */\\ncontract OVM_ChainStorageContainer is iOVM_ChainStorageContainer, Lib_AddressResolver {\\n\\n /*************\\n * Libraries *\\n *************/\\n\\n using Lib_RingBuffer for Lib_RingBuffer.RingBuffer;\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n string public owner;\\n Lib_RingBuffer.RingBuffer internal buffer;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n \\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n * @param _owner Name of the contract that owns this container (will be resolved later).\\n */\\n constructor(\\n address _libAddressManager,\\n string memory _owner\\n )\\n Lib_AddressResolver(_libAddressManager)\\n {\\n owner = _owner;\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n \\n modifier onlyOwner() {\\n require(\\n msg.sender == resolve(owner),\\n \\\"OVM_ChainStorageContainer: Function can only be called by the owner.\\\"\\n );\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function setGlobalMetadata(\\n bytes27 _globalMetadata\\n )\\n override\\n public\\n onlyOwner\\n {\\n return buffer.setExtraData(_globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function getGlobalMetadata()\\n override\\n public\\n view\\n returns (\\n bytes27\\n )\\n {\\n return buffer.getExtraData();\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function length()\\n override\\n public\\n view\\n returns (\\n uint256\\n )\\n {\\n return uint256(buffer.getLength());\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function push(\\n bytes32 _object\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.push(_object);\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function push(\\n bytes32 _object,\\n bytes27 _globalMetadata\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.push(_object, _globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function push2(\\n bytes32 _objectA,\\n bytes32 _objectB\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.push2(_objectA, _objectB);\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function push2(\\n bytes32 _objectA,\\n bytes32 _objectB,\\n bytes27 _globalMetadata\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.push2(_objectA, _objectB, _globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function get(\\n uint256 _index\\n )\\n override\\n public\\n view\\n returns (\\n bytes32\\n )\\n {\\n return buffer.get(uint40(_index));\\n }\\n \\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.deleteElementsAfterInclusive(\\n uint40(_index)\\n );\\n }\\n \\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index,\\n bytes27 _globalMetadata\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.deleteElementsAfterInclusive(\\n uint40(_index),\\n _globalMetadata\\n );\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function setNextOverwritableIndex(\\n uint256 _index\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.nextOverwritableIndex = _index;\\n }\\n}\\n\",\"keccak256\":\"0xc722e9528988810bd754002dfe3923bc9ac9252c1d981c4803fd5053603bfb11\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_ChainStorageContainer.sol\":{\"content\":\"pragma solidity ^0.7.0;\\n\\n/**\\n * @title iOVM_ChainStorageContainer\\n */\\ninterface iOVM_ChainStorageContainer {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata()\\n external\\n view\\n returns (\\n bytes27\\n );\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length()\\n external\\n view\\n returns (\\n uint256\\n );\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(\\n bytes32 _object\\n )\\n external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(\\n bytes32 _object,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Pushes two objects into the container at the same time. A useful optimization.\\n * @param _objectA First 32 byte value to insert into the container.\\n * @param _objectB Second 32 byte value to insert into the container.\\n */\\n function push2(\\n bytes32 _objectA,\\n bytes32 _objectB\\n )\\n external;\\n\\n /**\\n * Pushes two objects into the container at the same time. Also allows setting the global\\n * metadata field.\\n * @param _objectA First 32 byte value to insert into the container.\\n * @param _objectB Second 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push2(\\n bytes32 _objectA,\\n bytes32 _objectB,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(\\n uint256 _index\\n )\\n external\\n view\\n returns (\\n bytes32\\n );\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index\\n )\\n external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Marks an index as overwritable, meaing the underlying buffer can start to write values over\\n * any objects before and including the given index.\\n */\\n function setNextOverwritableIndex(\\n uint256 _index\\n )\\n external;\\n}\\n\",\"keccak256\":\"0xcfca7da85b35d94c27581c2460b0d48fd0cc51fa72670cc7a2f7f760fb21a2f0\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// +build ovm\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Contract Imports */\\nimport { Ownable } from \\\"./Lib_Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n /*******************************************\\n * Contract Variables: Internal Accounting *\\n *******************************************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n public\\n onlyOwner\\n {\\n emit AddressSet(_name, _address);\\n addresses[_getNameHash(_name)] = _address;\\n }\\n\\n function getAddress(\\n string memory _name\\n )\\n public\\n view\\n returns (address)\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32 _hash\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xdf802e1cc6474df913626991e9fca3835c620a519f397afe04bf9c260e723257\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// +build ovm\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\ncontract Lib_AddressResolver {\\n\\n /*******************************************\\n * Contract Variables: Contract References *\\n *******************************************/\\n\\n Lib_AddressManager internal libAddressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(\\n address _libAddressManager\\n ) public {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function resolve(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address _contract\\n )\\n {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0xf3b9d78b309ddeec259ce3e0e1cfdef3ca40938e9a81971b28ce2b8ea327f533\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// +build ovm\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Ownable\\n * @dev Adapted from https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol\\n */\\nabstract contract Ownable {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n address public owner;\\n\\n\\n /**********\\n * Events *\\n **********/\\n\\n event OwnershipTransferred(\\n address indexed previousOwner,\\n address indexed newOwner\\n );\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n constructor() internal {\\n owner = msg.sender;\\n emit OwnershipTransferred(address(0), owner);\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n owner == msg.sender,\\n \\\"Ownable: caller is not the owner\\\"\\n );\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function renounceOwnership()\\n public\\n virtual\\n onlyOwner\\n {\\n emit OwnershipTransferred(owner, address(0));\\n owner = address(0);\\n }\\n\\n function transferOwnership(address _newOwner)\\n public\\n virtual\\n onlyOwner\\n {\\n require(\\n _newOwner != address(0),\\n \\\"Ownable: new owner cannot be the zero address\\\"\\n );\\n\\n emit OwnershipTransferred(owner, _newOwner);\\n owner = _newOwner;\\n }\\n}\\n\",\"keccak256\":\"0xe0409fbd236d16ca6be439d9d97dd36d0d9a0697ee0062d49588b9d29c248e47\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_RingBuffer.sol\":{\"content\":\"pragma solidity ^0.7.0;\\n\\nlibrary Lib_RingBuffer {\\n using Lib_RingBuffer for RingBuffer;\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Buffer {\\n uint256 length;\\n mapping (uint256 => bytes32) buf;\\n }\\n\\n struct RingBuffer {\\n bytes32 contextA;\\n bytes32 contextB;\\n Buffer bufferA;\\n Buffer bufferB;\\n uint256 nextOverwritableIndex;\\n }\\n\\n struct RingBufferContext {\\n // contextA\\n uint40 globalIndex;\\n bytes27 extraData;\\n\\n // contextB\\n uint64 currBufferIndex;\\n uint40 prevResetIndex;\\n uint40 currResetIndex;\\n }\\n\\n\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 constant MIN_CAPACITY = 16;\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n * @param _extraData Optional global extra data.\\n */\\n function push(\\n RingBuffer storage _self,\\n bytes32 _value,\\n bytes27 _extraData\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n Buffer storage currBuffer = _self.getBuffer(ctx.currBufferIndex);\\n\\n // Set a minimum capacity.\\n if (currBuffer.length == 0) {\\n currBuffer.length = MIN_CAPACITY;\\n }\\n\\n // Check if we need to expand the buffer.\\n if (ctx.globalIndex - ctx.currResetIndex >= currBuffer.length) {\\n if (ctx.currResetIndex < _self.nextOverwritableIndex) {\\n // We're going to overwrite the inactive buffer.\\n // Bump the buffer index, reset the delete offset, and set our reset indices.\\n ctx.currBufferIndex++;\\n ctx.prevResetIndex = ctx.currResetIndex;\\n ctx.currResetIndex = ctx.globalIndex;\\n\\n // Swap over to the next buffer.\\n currBuffer = _self.getBuffer(ctx.currBufferIndex);\\n } else {\\n // We're not overwriting yet, double the length of the current buffer.\\n currBuffer.length *= 2;\\n }\\n }\\n\\n // Index to write to is the difference of the global and reset indices.\\n uint256 writeHead = ctx.globalIndex - ctx.currResetIndex;\\n currBuffer.buf[writeHead] = _value;\\n\\n // Bump the global index and insert our extra data, then save the context.\\n ctx.globalIndex++;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n */\\n function push(\\n RingBuffer storage _self,\\n bytes32 _value\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n \\n _self.push(\\n _value,\\n ctx.extraData\\n );\\n }\\n\\n /**\\n * Pushes a two elements to the buffer.\\n * @param _self Buffer to access.\\n * @param _valueA First value to push to the buffer.\\n * @param _valueA Second value to push to the buffer.\\n * @param _extraData Optional global extra data.\\n */\\n function push2(\\n RingBuffer storage _self,\\n bytes32 _valueA,\\n bytes32 _valueB,\\n bytes27 _extraData\\n )\\n internal\\n {\\n _self.push(_valueA, _extraData);\\n _self.push(_valueB, _extraData);\\n }\\n\\n /**\\n * Pushes a two elements to the buffer.\\n * @param _self Buffer to access.\\n * @param _valueA First value to push to the buffer.\\n * @param _valueA Second value to push to the buffer.\\n */\\n function push2(\\n RingBuffer storage _self,\\n bytes32 _valueA,\\n bytes32 _valueB\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n\\n _self.push2(\\n _valueA,\\n _valueB,\\n ctx.extraData\\n );\\n }\\n\\n /**\\n * Retrieves an element from the buffer.\\n * @param _self Buffer to access.\\n * @param _index Element index to retrieve.\\n * @return Value of the element at the given index.\\n */\\n function get(\\n RingBuffer storage _self,\\n uint256 _index\\n )\\n internal\\n view\\n returns (\\n bytes32 \\n )\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n\\n require(\\n _index < ctx.globalIndex,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n Buffer storage currBuffer = _self.getBuffer(ctx.currBufferIndex);\\n Buffer storage prevBuffer = _self.getBuffer(ctx.currBufferIndex + 1);\\n\\n if (_index >= ctx.currResetIndex) {\\n // We're trying to load an element from the current buffer.\\n // Relative index is just the difference from the reset index.\\n uint256 relativeIndex = _index - ctx.currResetIndex;\\n\\n // Shouldn't happen but why not check.\\n require(\\n relativeIndex < currBuffer.length,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n return currBuffer.buf[relativeIndex];\\n } else {\\n // We're trying to load an element from the previous buffer.\\n // Relative index is the difference from the reset index in the other direction.\\n uint256 relativeIndex = ctx.currResetIndex - _index;\\n\\n // Condition only fails in the case that we deleted and flipped buffers.\\n require(\\n ctx.currResetIndex > ctx.prevResetIndex,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n // Make sure we're not trying to read beyond the array.\\n require(\\n relativeIndex <= prevBuffer.length,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n return prevBuffer.buf[prevBuffer.length - relativeIndex];\\n }\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n * @param _extraData Optional global extra data.\\n */\\n function deleteElementsAfterInclusive(\\n RingBuffer storage _self,\\n uint40 _index,\\n bytes27 _extraData\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n\\n require(\\n _index < ctx.globalIndex && _index >= ctx.prevResetIndex,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n Buffer storage currBuffer = _self.getBuffer(ctx.currBufferIndex);\\n Buffer storage prevBuffer = _self.getBuffer(ctx.currBufferIndex + 1);\\n\\n if (_index < ctx.currResetIndex) {\\n // We're switching back to the previous buffer.\\n // Reduce the buffer index, set the current reset index back to match the previous one.\\n // We use the equality of these two values to prevent reading beyond this buffer.\\n ctx.currBufferIndex--;\\n ctx.currResetIndex = ctx.prevResetIndex;\\n }\\n\\n // Set our global index and extra data, save the context.\\n ctx.globalIndex = _index;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n */\\n function deleteElementsAfterInclusive(\\n RingBuffer storage _self,\\n uint40 _index\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n _self.deleteElementsAfterInclusive(\\n _index,\\n ctx.extraData\\n );\\n }\\n\\n /**\\n * Retrieves the current global index.\\n * @param _self Buffer to access.\\n * @return Current global index.\\n */\\n function getLength(\\n RingBuffer storage _self\\n )\\n internal\\n view\\n returns (\\n uint40\\n )\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n return ctx.globalIndex;\\n }\\n\\n /**\\n * Changes current global extra data.\\n * @param _self Buffer to access.\\n * @param _extraData New global extra data.\\n */\\n function setExtraData(\\n RingBuffer storage _self,\\n bytes27 _extraData\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Retrieves the current global extra data.\\n * @param _self Buffer to access.\\n * @return Current global extra data.\\n */\\n function getExtraData(\\n RingBuffer storage _self\\n )\\n internal\\n view\\n returns (\\n bytes27\\n )\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n return ctx.extraData;\\n }\\n\\n /**\\n * Sets the current ring buffer context.\\n * @param _self Buffer to access.\\n * @param _ctx Current ring buffer context.\\n */\\n function setContext(\\n RingBuffer storage _self,\\n RingBufferContext memory _ctx\\n )\\n internal\\n returns (\\n bytes32\\n )\\n {\\n bytes32 contextA;\\n bytes32 contextB;\\n\\n uint40 globalIndex = _ctx.globalIndex;\\n bytes27 extraData = _ctx.extraData;\\n assembly {\\n contextA := globalIndex\\n contextA := or(contextA, extraData)\\n }\\n\\n uint64 currBufferIndex = _ctx.currBufferIndex;\\n uint40 prevResetIndex = _ctx.prevResetIndex;\\n uint40 currResetIndex = _ctx.currResetIndex;\\n assembly {\\n contextB := currBufferIndex\\n contextB := or(contextB, shl(64, prevResetIndex))\\n contextB := or(contextB, shl(104, currResetIndex))\\n }\\n\\n if (_self.contextA != contextA) {\\n _self.contextA = contextA;\\n }\\n\\n if (_self.contextB != contextB) {\\n _self.contextB = contextB;\\n }\\n }\\n\\n /**\\n * Retrieves the current ring buffer context.\\n * @param _self Buffer to access.\\n * @return Current ring buffer context.\\n */\\n function getContext(\\n RingBuffer storage _self\\n )\\n internal\\n view\\n returns (\\n RingBufferContext memory\\n )\\n {\\n bytes32 contextA = _self.contextA;\\n bytes32 contextB = _self.contextB;\\n\\n uint40 globalIndex;\\n bytes27 extraData;\\n assembly {\\n globalIndex := and(contextA, 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF)\\n extraData := and(contextA, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000)\\n }\\n\\n uint64 currBufferIndex;\\n uint40 prevResetIndex;\\n uint40 currResetIndex;\\n assembly {\\n currBufferIndex := and(contextB, 0x000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF)\\n prevResetIndex := shr(64, and(contextB, 0x00000000000000000000000000000000000000FFFFFFFFFF0000000000000000))\\n currResetIndex := shr(104, and(contextB, 0x0000000000000000000000000000FFFFFFFFFF00000000000000000000000000))\\n }\\n\\n return RingBufferContext({\\n globalIndex: globalIndex,\\n extraData: extraData,\\n currBufferIndex: currBufferIndex,\\n prevResetIndex: prevResetIndex,\\n currResetIndex: currResetIndex\\n });\\n }\\n\\n /**\\n * Retrieves the a buffer from the ring buffer by index.\\n * @param _self Buffer to access.\\n * @param _which Index of the sub buffer to access.\\n * @return Sub buffer for the index.\\n */\\n function getBuffer(\\n RingBuffer storage _self,\\n uint256 _which\\n )\\n internal\\n view\\n returns (\\n Buffer storage\\n )\\n {\\n return _which % 2 == 0 ? _self.bufferA : _self.bufferB;\\n }\\n}\\n\",\"keccak256\":\"0x0c4bb53aba64441b2ec26e7a13de8f04f104bb654e550ccc30db500cac33d2a3\"}},\"version\":1}", - "bytecode": "0x60806040523480156200001157600080fd5b50604051620013f3380380620013f3833981810160405260408110156200003757600080fd5b8151602083018051604051929492938301929190846401000000008211156200005f57600080fd5b9083019060208201858111156200007557600080fd5b82516401000000008111828201881017156200009057600080fd5b82525081516020918201929091019080838360005b83811015620000bf578181015183820152602001620000a5565b50505050905090810190601f168015620000ed5780820380516001836020036101000a031916815260200191505b506040525050600080546001600160a01b0319166001600160a01b038516179055508051620001249060019060208401906200012d565b505050620001d9565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282620001655760008555620001b0565b82601f106200018057805160ff1916838001178555620001b0565b82800160010185558215620001b0579182015b82811115620001b057825182559160200191906001019062000193565b50620001be929150620001c2565b5090565b5b80821115620001be5760008155600101620001c3565b61120a80620001e96000396000f3fe608060405234801561001057600080fd5b50600436106100cf5760003560e01c80634651d91e1161008c578063b298e36b11610066578063b298e36b14610315578063ccf8f96914610332578063d41c021814610355578063fa9e936c14610378576100cf565b80634651d91e1461025e5780638da5cb5b1461027b5780639507d39a146102f8576100cf565b806314f22255146100d4578063167fd681146101075780631f7b6d32146101325780632015276c1461014c57806329061de214610177578063461a44781461019c575b600080fd5b610105600480360360608110156100ea57600080fd5b508035906020810135906040013564ffffffffff1916610395565b005b6101056004803603604081101561011d57600080fd5b508035906020013564ffffffffff191661048c565b61013a61054c565b60408051918252519081900360200190f35b6101056004803603604081101561016257600080fd5b508035906020013564ffffffffff1916610564565b6101056004803603602081101561018d57600080fd5b503564ffffffffff1916610620565b610242600480360360208110156101b257600080fd5b8101906020810181356401000000008111156101cd57600080fd5b8201836020820111156101df57600080fd5b8035906020019184600183028401116401000000008311171561020157600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506106de945050505050565b604080516001600160a01b039092168252519081900360200190f35b6101056004803603602081101561027457600080fd5b50356107ba565b610283610875565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102bd5781810151838201526020016102a5565b50505050905090810190601f1680156102ea5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61013a6004803603602081101561030e57600080fd5b5035610902565b6101056004803603602081101561032b57600080fd5b503561091c565b61033a6109d7565b6040805164ffffffffff199092168252519081900360200190f35b6101056004803603604081101561036b57600080fd5b50803590602001356109e8565b6101056004803603602081101561038e57600080fd5b5035610aa4565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261042b93909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b820191906000526020600020905b81548152906001019060200180831161040457829003601f168201915b50505050506106de565b6001600160a01b0316336001600160a01b03161461047a5760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b6104876002848484610b59565b505050565b60018054604080516020601f6002600019610100878916150201909516949094049384018190048102820181019092528281526104ed93909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b6001600160a01b0316336001600160a01b03161461053c5760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b61054860028383610b75565b5050565b60006105586002610cb7565b64ffffffffff16905090565b60018054604080516020601f6002600019610100878916150201909516949094049384018190048102820181019092528281526105c593909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b6001600160a01b0316336001600160a01b0316146106145760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b61054860028383610ccb565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261068193909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b6001600160a01b0316336001600160a01b0316146106d05760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b6106db600282610dca565b50565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b8381101561073e578181015183820152602001610726565b50505050905090810190601f16801561076b5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561078857600080fd5b505afa15801561079c573d6000803e3d6000fd5b505050506040513d60208110156107b257600080fd5b505192915050565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261081b93909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b6001600160a01b0316336001600160a01b03161461086a5760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b6106db600282610def565b60018054604080516020600284861615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156108fa5780601f106108cf576101008083540402835291602001916108fa565b820191906000526020600020905b8154815290600101906020018083116108dd57829003601f168201915b505050505081565b6000610916600264ffffffffff8416610e15565b92915050565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261097d93909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b6001600160a01b0316336001600160a01b0316146109cc5760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b6106db60028261101e565b60006109e36002611044565b905090565b60018054604080516020601f600260001961010087891615020190951694909404938401819004810282018101909252828152610a4993909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b6001600160a01b0316336001600160a01b031614610a985760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b6105486002838361105b565b60018054604080516020601f600260001961010087891615020190951694909404938401819004810282018101909252828152610b0593909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b6001600160a01b0316336001600160a01b031614610b545760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b600855565b610b64848483610ccb565b610b6f848383610ccb565b50505050565b6000610b8084611083565b9050806000015164ffffffffff168364ffffffffff16108015610bb55750806060015164ffffffffff168364ffffffffff1610155b610bfd576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b6000610c20826040015167ffffffffffffffff16866110e390919063ffffffff16565b90506000610c48836040015160010167ffffffffffffffff16876110e390919063ffffffff16565b9050826080015164ffffffffff168564ffffffffff161015610c8c576040830180516000190167ffffffffffffffff169052606083015164ffffffffff1660808401525b64ffffffffff8516835264ffffffffff1984166020840152610cae8684611103565b50505050505050565b600080610cc383611083565b519392505050565b6000610cd684611083565b90506000610cfb826040015167ffffffffffffffff16866110e390919063ffffffff16565b8054909150610d0957601081555b8054608083015183510364ffffffffff1610610d80578460060154826080015164ffffffffff161015610d785760408201805160010167ffffffffffffffff169081905260808301805164ffffffffff90811660608601528451169052610d719086906110e3565b9050610d80565b805460020281555b608082015182510364ffffffffff9081166000818152600184810160209081526040909220889055855101909216845264ffffffffff19851691840191909152610cae8684611103565b6000610dd583611083565b64ffffffffff19831660208201529050610b6f8382611103565b6000610dfa83611083565b905061048782826020015185610b759092919063ffffffff16565b600080610e2184611083565b805190915064ffffffffff168310610e77576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b6000610e9a826040015167ffffffffffffffff16866110e390919063ffffffff16565b90506000610ec2836040015160010167ffffffffffffffff16876110e390919063ffffffff16565b9050826080015164ffffffffff168510610f4f576080830151825464ffffffffff9091168603908110610f33576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b6000908152600190920160205250604090205491506109169050565b6080830151606084015164ffffffffff9182168781039290911610610fb2576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b8154811115610fff576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b8154036000908152600190910160205260409020549250610916915050565b600061102983611083565b905061048782826020015185610ccb9092919063ffffffff16565b60008061105083611083565b602001519392505050565b600061106684611083565b9050610b6f8383836020015187610b59909392919063ffffffff16565b61108b611162565b5080546001909101546040805160a08101825264ffffffffff808516825264ffffffffff19909416602082015267ffffffffffffffff8316818301529082901c8316606082015260689190911c909116608082015290565b600060028206156110f757826004016110fc565b826002015b9392505050565b80516020820151604080840151606085015160808601518754600096868117969584901b8517606884901b17959094909390929091871461114257868a555b858a60010154146111555760018a018690555b5050505050505092915050565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091529056fe4f564d5f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2063616e206f6e6c792062652063616c6c656420627920746865206f776e65722ea264697066735822122037f5f91f3a7302668798afaeee2c0c2d9aad06dfcc80e263efc2cd8f4842eebe64736f6c63430007060033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100cf5760003560e01c80634651d91e1161008c578063b298e36b11610066578063b298e36b14610315578063ccf8f96914610332578063d41c021814610355578063fa9e936c14610378576100cf565b80634651d91e1461025e5780638da5cb5b1461027b5780639507d39a146102f8576100cf565b806314f22255146100d4578063167fd681146101075780631f7b6d32146101325780632015276c1461014c57806329061de214610177578063461a44781461019c575b600080fd5b610105600480360360608110156100ea57600080fd5b508035906020810135906040013564ffffffffff1916610395565b005b6101056004803603604081101561011d57600080fd5b508035906020013564ffffffffff191661048c565b61013a61054c565b60408051918252519081900360200190f35b6101056004803603604081101561016257600080fd5b508035906020013564ffffffffff1916610564565b6101056004803603602081101561018d57600080fd5b503564ffffffffff1916610620565b610242600480360360208110156101b257600080fd5b8101906020810181356401000000008111156101cd57600080fd5b8201836020820111156101df57600080fd5b8035906020019184600183028401116401000000008311171561020157600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506106de945050505050565b604080516001600160a01b039092168252519081900360200190f35b6101056004803603602081101561027457600080fd5b50356107ba565b610283610875565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102bd5781810151838201526020016102a5565b50505050905090810190601f1680156102ea5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61013a6004803603602081101561030e57600080fd5b5035610902565b6101056004803603602081101561032b57600080fd5b503561091c565b61033a6109d7565b6040805164ffffffffff199092168252519081900360200190f35b6101056004803603604081101561036b57600080fd5b50803590602001356109e8565b6101056004803603602081101561038e57600080fd5b5035610aa4565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261042b93909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b820191906000526020600020905b81548152906001019060200180831161040457829003601f168201915b50505050506106de565b6001600160a01b0316336001600160a01b03161461047a5760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b6104876002848484610b59565b505050565b60018054604080516020601f6002600019610100878916150201909516949094049384018190048102820181019092528281526104ed93909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b6001600160a01b0316336001600160a01b03161461053c5760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b61054860028383610b75565b5050565b60006105586002610cb7565b64ffffffffff16905090565b60018054604080516020601f6002600019610100878916150201909516949094049384018190048102820181019092528281526105c593909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b6001600160a01b0316336001600160a01b0316146106145760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b61054860028383610ccb565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261068193909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b6001600160a01b0316336001600160a01b0316146106d05760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b6106db600282610dca565b50565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b8381101561073e578181015183820152602001610726565b50505050905090810190601f16801561076b5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561078857600080fd5b505afa15801561079c573d6000803e3d6000fd5b505050506040513d60208110156107b257600080fd5b505192915050565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261081b93909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b6001600160a01b0316336001600160a01b03161461086a5760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b6106db600282610def565b60018054604080516020600284861615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156108fa5780601f106108cf576101008083540402835291602001916108fa565b820191906000526020600020905b8154815290600101906020018083116108dd57829003601f168201915b505050505081565b6000610916600264ffffffffff8416610e15565b92915050565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261097d93909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b6001600160a01b0316336001600160a01b0316146109cc5760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b6106db60028261101e565b60006109e36002611044565b905090565b60018054604080516020601f600260001961010087891615020190951694909404938401819004810282018101909252828152610a4993909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b6001600160a01b0316336001600160a01b031614610a985760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b6105486002838361105b565b60018054604080516020601f600260001961010087891615020190951694909404938401819004810282018101909252828152610b0593909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b6001600160a01b0316336001600160a01b031614610b545760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b600855565b610b64848483610ccb565b610b6f848383610ccb565b50505050565b6000610b8084611083565b9050806000015164ffffffffff168364ffffffffff16108015610bb55750806060015164ffffffffff168364ffffffffff1610155b610bfd576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b6000610c20826040015167ffffffffffffffff16866110e390919063ffffffff16565b90506000610c48836040015160010167ffffffffffffffff16876110e390919063ffffffff16565b9050826080015164ffffffffff168564ffffffffff161015610c8c576040830180516000190167ffffffffffffffff169052606083015164ffffffffff1660808401525b64ffffffffff8516835264ffffffffff1984166020840152610cae8684611103565b50505050505050565b600080610cc383611083565b519392505050565b6000610cd684611083565b90506000610cfb826040015167ffffffffffffffff16866110e390919063ffffffff16565b8054909150610d0957601081555b8054608083015183510364ffffffffff1610610d80578460060154826080015164ffffffffff161015610d785760408201805160010167ffffffffffffffff169081905260808301805164ffffffffff90811660608601528451169052610d719086906110e3565b9050610d80565b805460020281555b608082015182510364ffffffffff9081166000818152600184810160209081526040909220889055855101909216845264ffffffffff19851691840191909152610cae8684611103565b6000610dd583611083565b64ffffffffff19831660208201529050610b6f8382611103565b6000610dfa83611083565b905061048782826020015185610b759092919063ffffffff16565b600080610e2184611083565b805190915064ffffffffff168310610e77576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b6000610e9a826040015167ffffffffffffffff16866110e390919063ffffffff16565b90506000610ec2836040015160010167ffffffffffffffff16876110e390919063ffffffff16565b9050826080015164ffffffffff168510610f4f576080830151825464ffffffffff9091168603908110610f33576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b6000908152600190920160205250604090205491506109169050565b6080830151606084015164ffffffffff9182168781039290911610610fb2576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b8154811115610fff576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b8154036000908152600190910160205260409020549250610916915050565b600061102983611083565b905061048782826020015185610ccb9092919063ffffffff16565b60008061105083611083565b602001519392505050565b600061106684611083565b9050610b6f8383836020015187610b59909392919063ffffffff16565b61108b611162565b5080546001909101546040805160a08101825264ffffffffff808516825264ffffffffff19909416602082015267ffffffffffffffff8316818301529082901c8316606082015260689190911c909116608082015290565b600060028206156110f757826004016110fc565b826002015b9392505050565b80516020820151604080840151606085015160808601518754600096868117969584901b8517606884901b17959094909390929091871461114257868a555b858a60010154146111555760018a018690555b5050505050505092915050565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091529056fe4f564d5f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2063616e206f6e6c792062652063616c6c656420627920746865206f776e65722ea264697066735822122037f5f91f3a7302668798afaeee2c0c2d9aad06dfcc80e263efc2cd8f4842eebe64736f6c63430007060033", - "devdoc": { - "kind": "dev", - "methods": { - "constructor": { - "params": { - "_libAddressManager": "Address of the Address Manager.", - "_owner": "Name of the contract that owns this container (will be resolved later)." - } - }, - "deleteElementsAfterInclusive(uint256)": { - "params": { - "_index": "Object index to delete from." - } - }, - "deleteElementsAfterInclusive(uint256,bytes27)": { - "params": { - "_globalMetadata": "New global metadata for the container.", - "_index": "Object index to delete from." - } - }, - "get(uint256)": { - "params": { - "_index": "Index of the particular object to access." - }, - "returns": { - "_0": "32 byte object value." - } - }, - "getGlobalMetadata()": { - "returns": { - "_0": "Container global metadata field." - } - }, - "length()": { - "returns": { - "_0": "Number of objects in the container." - } - }, - "push(bytes32)": { - "params": { - "_object": "A 32 byte value to insert into the container." - } - }, - "push(bytes32,bytes27)": { - "params": { - "_globalMetadata": "New global metadata for the container.", - "_object": "A 32 byte value to insert into the container." - } - }, - "push2(bytes32,bytes32)": { - "params": { - "_objectA": "First 32 byte value to insert into the container.", - "_objectB": "Second 32 byte value to insert into the container." - } - }, - "push2(bytes32,bytes32,bytes27)": { - "params": { - "_globalMetadata": "New global metadata for the container.", - "_objectA": "First 32 byte value to insert into the container.", - "_objectB": "Second 32 byte value to insert into the container." - } - }, - "setGlobalMetadata(bytes27)": { - "params": { - "_globalMetadata": "New global metadata to set." - } - } - }, - "title": "OVM_ChainStorageContainer", - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": { - "deleteElementsAfterInclusive(uint256)": { - "notice": "Removes all objects after and including a given index." - }, - "deleteElementsAfterInclusive(uint256,bytes27)": { - "notice": "Removes all objects after and including a given index. Also allows setting the global metadata field." - }, - "get(uint256)": { - "notice": "Retrieves an object from the container." - }, - "getGlobalMetadata()": { - "notice": "Retrieves the container's global metadata field." - }, - "length()": { - "notice": "Retrieves the number of objects stored in the container." - }, - "push(bytes32)": { - "notice": "Pushes an object into the container." - }, - "push(bytes32,bytes27)": { - "notice": "Pushes an object into the container. Function allows setting the global metadata since we'll need to touch the \"length\" storage slot anyway, which also contains the global metadata (it's an optimization)." - }, - "push2(bytes32,bytes32)": { - "notice": "Pushes two objects into the container at the same time. A useful optimization." - }, - "push2(bytes32,bytes32,bytes27)": { - "notice": "Pushes two objects into the container at the same time. Also allows setting the global metadata field." - }, - "setGlobalMetadata(bytes27)": { - "notice": "Sets the container's global metadata field. We're using `bytes27` here because we use five bytes to maintain the length of the underlying data structure, meaning we have an extra 27 bytes to store arbitrary data." - }, - "setNextOverwritableIndex(uint256)": { - "notice": "Marks an index as overwritable, meaing the underlying buffer can start to write values over any objects before and including the given index." - } - }, - "version": 1 - }, - "storageLayout": { - "storage": [ - { - "astId": 11707, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "libAddressManager", - "offset": 0, - "slot": "0", - "type": "t_contract(Lib_AddressManager)11700" - }, - { - "astId": 2888, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "owner", - "offset": 0, - "slot": "1", - "type": "t_string_storage" - }, - { - "astId": 2890, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "buffer", - "offset": 0, - "slot": "2", - "type": "t_struct(RingBuffer)16365_storage" - } - ], - "types": { - "t_bytes32": { - "encoding": "inplace", - "label": "bytes32", - "numberOfBytes": "32" - }, - "t_contract(Lib_AddressManager)11700": { - "encoding": "inplace", - "label": "contract Lib_AddressManager", - "numberOfBytes": "20" - }, - "t_mapping(t_uint256,t_bytes32)": { - "encoding": "mapping", - "key": "t_uint256", - "label": "mapping(uint256 => bytes32)", - "numberOfBytes": "32", - "value": "t_bytes32" - }, - "t_string_storage": { - "encoding": "bytes", - "label": "string", - "numberOfBytes": "32" - }, - "t_struct(Buffer)16354_storage": { - "encoding": "inplace", - "label": "struct Lib_RingBuffer.Buffer", - "members": [ - { - "astId": 16349, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "length", - "offset": 0, - "slot": "0", - "type": "t_uint256" - }, - { - "astId": 16353, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "buf", - "offset": 0, - "slot": "1", - "type": "t_mapping(t_uint256,t_bytes32)" - } - ], - "numberOfBytes": "64" - }, - "t_struct(RingBuffer)16365_storage": { - "encoding": "inplace", - "label": "struct Lib_RingBuffer.RingBuffer", - "members": [ - { - "astId": 16356, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "contextA", - "offset": 0, - "slot": "0", - "type": "t_bytes32" - }, - { - "astId": 16358, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "contextB", - "offset": 0, - "slot": "1", - "type": "t_bytes32" - }, - { - "astId": 16360, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "bufferA", - "offset": 0, - "slot": "2", - "type": "t_struct(Buffer)16354_storage" - }, - { - "astId": 16362, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "bufferB", - "offset": 0, - "slot": "4", - "type": "t_struct(Buffer)16354_storage" - }, - { - "astId": 16364, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "nextOverwritableIndex", - "offset": 0, - "slot": "6", - "type": "t_uint256" - } - ], - "numberOfBytes": "224" - }, - "t_uint256": { - "encoding": "inplace", - "label": "uint256", - "numberOfBytes": "32" - } - } - } -} \ No newline at end of file diff --git a/packages/contracts/deployments/goerli-v1/OVM_ChainStorageContainer-SCC-batches.json b/packages/contracts/deployments/goerli-v1/OVM_ChainStorageContainer-SCC-batches.json deleted file mode 100644 index 15bfeae043847..0000000000000 --- a/packages/contracts/deployments/goerli-v1/OVM_ChainStorageContainer-SCC-batches.json +++ /dev/null @@ -1,488 +0,0 @@ -{ - "address": "0x2c68C92992c516b7Bdd816cc471938025672fd7a", - "abi": [ - { - "inputs": [ - { - "internalType": "address", - "name": "_libAddressManager", - "type": "address" - }, - { - "internalType": "string", - "name": "_owner", - "type": "string" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_index", - "type": "uint256" - }, - { - "internalType": "bytes27", - "name": "_globalMetadata", - "type": "bytes27" - } - ], - "name": "deleteElementsAfterInclusive", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_index", - "type": "uint256" - } - ], - "name": "deleteElementsAfterInclusive", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_index", - "type": "uint256" - } - ], - "name": "get", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getGlobalMetadata", - "outputs": [ - { - "internalType": "bytes27", - "name": "", - "type": "bytes27" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "length", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "owner", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "_object", - "type": "bytes32" - }, - { - "internalType": "bytes27", - "name": "_globalMetadata", - "type": "bytes27" - } - ], - "name": "push", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "_object", - "type": "bytes32" - } - ], - "name": "push", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "_objectA", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "_objectB", - "type": "bytes32" - }, - { - "internalType": "bytes27", - "name": "_globalMetadata", - "type": "bytes27" - } - ], - "name": "push2", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "_objectA", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "_objectB", - "type": "bytes32" - } - ], - "name": "push2", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "string", - "name": "_name", - "type": "string" - } - ], - "name": "resolve", - "outputs": [ - { - "internalType": "address", - "name": "_contract", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes27", - "name": "_globalMetadata", - "type": "bytes27" - } - ], - "name": "setGlobalMetadata", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_index", - "type": "uint256" - } - ], - "name": "setNextOverwritableIndex", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - } - ], - "transactionHash": "0x5168f58ec0e907689b4729909da455ae3f39f09f6808faafde219c910e6ef404", - "receipt": { - "to": null, - "from": "0x558ba9b8d78713fbf768c1f8a584485B4003f43F", - "contractAddress": "0x02A1e0C8d29Bf76989F18D56cd502Eba0AC0D212", - "transactionIndex": 1, - "gasUsed": "1103654", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0x0a7b99f8dfb069836b98855e10f4febe0718604be13cfe614132e592cf0a134e", - "transactionHash": "0x5168f58ec0e907689b4729909da455ae3f39f09f6808faafde219c910e6ef404", - "logs": [], - "blockNumber": 4573381, - "cumulativeGasUsed": "1128075", - "status": 1, - "byzantium": true - }, - "args": [ - "0xE630cdf302880783364334455C8352fE0aB5b748", - "OVM_StateCommitmentChain" - ], - "solcInputHash": "cebcb515c1a9c570d96e0b8f6fd237e2", - "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_owner\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"get\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getGlobalMetadata\",\"outputs\":[{\"internalType\":\"bytes27\",\"name\":\"\",\"type\":\"bytes27\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"length\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_objectA\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"_objectB\",\"type\":\"bytes32\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"push2\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_objectA\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"_objectB\",\"type\":\"bytes32\"}],\"name\":\"push2\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"_contract\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"setGlobalMetadata\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"setNextOverwritableIndex\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\",\"_owner\":\"Name of the contract that owns this container (will be resolved later).\"}},\"deleteElementsAfterInclusive(uint256)\":{\"params\":{\"_index\":\"Object index to delete from.\"}},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_index\":\"Object index to delete from.\"}},\"get(uint256)\":{\"params\":{\"_index\":\"Index of the particular object to access.\"},\"returns\":{\"_0\":\"32 byte object value.\"}},\"getGlobalMetadata()\":{\"returns\":{\"_0\":\"Container global metadata field.\"}},\"length()\":{\"returns\":{\"_0\":\"Number of objects in the container.\"}},\"push(bytes32)\":{\"params\":{\"_object\":\"A 32 byte value to insert into the container.\"}},\"push(bytes32,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_object\":\"A 32 byte value to insert into the container.\"}},\"push2(bytes32,bytes32)\":{\"params\":{\"_objectA\":\"First 32 byte value to insert into the container.\",\"_objectB\":\"Second 32 byte value to insert into the container.\"}},\"push2(bytes32,bytes32,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_objectA\":\"First 32 byte value to insert into the container.\",\"_objectB\":\"Second 32 byte value to insert into the container.\"}},\"setGlobalMetadata(bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata to set.\"}}},\"title\":\"OVM_ChainStorageContainer\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"deleteElementsAfterInclusive(uint256)\":{\"notice\":\"Removes all objects after and including a given index.\"},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"notice\":\"Removes all objects after and including a given index. Also allows setting the global metadata field.\"},\"get(uint256)\":{\"notice\":\"Retrieves an object from the container.\"},\"getGlobalMetadata()\":{\"notice\":\"Retrieves the container's global metadata field.\"},\"length()\":{\"notice\":\"Retrieves the number of objects stored in the container.\"},\"push(bytes32)\":{\"notice\":\"Pushes an object into the container.\"},\"push(bytes32,bytes27)\":{\"notice\":\"Pushes an object into the container. Function allows setting the global metadata since we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global metadata (it's an optimization).\"},\"push2(bytes32,bytes32)\":{\"notice\":\"Pushes two objects into the container at the same time. A useful optimization.\"},\"push2(bytes32,bytes32,bytes27)\":{\"notice\":\"Pushes two objects into the container at the same time. Also allows setting the global metadata field.\"},\"setGlobalMetadata(bytes27)\":{\"notice\":\"Sets the container's global metadata field. We're using `bytes27` here because we use five bytes to maintain the length of the underlying data structure, meaning we have an extra 27 bytes to store arbitrary data.\"},\"setNextOverwritableIndex(uint256)\":{\"notice\":\"Marks an index as overwritable, meaing the underlying buffer can start to write values over any objects before and including the given index.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol\":\"OVM_ChainStorageContainer\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol\":{\"content\":\"pragma solidity ^0.7.0;\\n\\n/* Library Imports */\\nimport { Lib_RingBuffer } from \\\"../../libraries/utils/Lib_RingBuffer.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_ChainStorageContainer } from \\\"../../iOVM/chain/iOVM_ChainStorageContainer.sol\\\";\\n\\n/**\\n * @title OVM_ChainStorageContainer\\n */\\ncontract OVM_ChainStorageContainer is iOVM_ChainStorageContainer, Lib_AddressResolver {\\n\\n /*************\\n * Libraries *\\n *************/\\n\\n using Lib_RingBuffer for Lib_RingBuffer.RingBuffer;\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n string public owner;\\n Lib_RingBuffer.RingBuffer internal buffer;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n \\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n * @param _owner Name of the contract that owns this container (will be resolved later).\\n */\\n constructor(\\n address _libAddressManager,\\n string memory _owner\\n )\\n Lib_AddressResolver(_libAddressManager)\\n {\\n owner = _owner;\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n \\n modifier onlyOwner() {\\n require(\\n msg.sender == resolve(owner),\\n \\\"OVM_ChainStorageContainer: Function can only be called by the owner.\\\"\\n );\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function setGlobalMetadata(\\n bytes27 _globalMetadata\\n )\\n override\\n public\\n onlyOwner\\n {\\n return buffer.setExtraData(_globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function getGlobalMetadata()\\n override\\n public\\n view\\n returns (\\n bytes27\\n )\\n {\\n return buffer.getExtraData();\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function length()\\n override\\n public\\n view\\n returns (\\n uint256\\n )\\n {\\n return uint256(buffer.getLength());\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function push(\\n bytes32 _object\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.push(_object);\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function push(\\n bytes32 _object,\\n bytes27 _globalMetadata\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.push(_object, _globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function push2(\\n bytes32 _objectA,\\n bytes32 _objectB\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.push2(_objectA, _objectB);\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function push2(\\n bytes32 _objectA,\\n bytes32 _objectB,\\n bytes27 _globalMetadata\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.push2(_objectA, _objectB, _globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function get(\\n uint256 _index\\n )\\n override\\n public\\n view\\n returns (\\n bytes32\\n )\\n {\\n return buffer.get(uint40(_index));\\n }\\n \\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.deleteElementsAfterInclusive(\\n uint40(_index)\\n );\\n }\\n \\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index,\\n bytes27 _globalMetadata\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.deleteElementsAfterInclusive(\\n uint40(_index),\\n _globalMetadata\\n );\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function setNextOverwritableIndex(\\n uint256 _index\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.nextOverwritableIndex = _index;\\n }\\n}\\n\",\"keccak256\":\"0xc722e9528988810bd754002dfe3923bc9ac9252c1d981c4803fd5053603bfb11\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_ChainStorageContainer.sol\":{\"content\":\"pragma solidity ^0.7.0;\\n\\n/**\\n * @title iOVM_ChainStorageContainer\\n */\\ninterface iOVM_ChainStorageContainer {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata()\\n external\\n view\\n returns (\\n bytes27\\n );\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length()\\n external\\n view\\n returns (\\n uint256\\n );\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(\\n bytes32 _object\\n )\\n external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(\\n bytes32 _object,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Pushes two objects into the container at the same time. A useful optimization.\\n * @param _objectA First 32 byte value to insert into the container.\\n * @param _objectB Second 32 byte value to insert into the container.\\n */\\n function push2(\\n bytes32 _objectA,\\n bytes32 _objectB\\n )\\n external;\\n\\n /**\\n * Pushes two objects into the container at the same time. Also allows setting the global\\n * metadata field.\\n * @param _objectA First 32 byte value to insert into the container.\\n * @param _objectB Second 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push2(\\n bytes32 _objectA,\\n bytes32 _objectB,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(\\n uint256 _index\\n )\\n external\\n view\\n returns (\\n bytes32\\n );\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index\\n )\\n external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Marks an index as overwritable, meaing the underlying buffer can start to write values over\\n * any objects before and including the given index.\\n */\\n function setNextOverwritableIndex(\\n uint256 _index\\n )\\n external;\\n}\\n\",\"keccak256\":\"0xcfca7da85b35d94c27581c2460b0d48fd0cc51fa72670cc7a2f7f760fb21a2f0\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// +build ovm\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Contract Imports */\\nimport { Ownable } from \\\"./Lib_Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n /*******************************************\\n * Contract Variables: Internal Accounting *\\n *******************************************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n public\\n onlyOwner\\n {\\n emit AddressSet(_name, _address);\\n addresses[_getNameHash(_name)] = _address;\\n }\\n\\n function getAddress(\\n string memory _name\\n )\\n public\\n view\\n returns (address)\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32 _hash\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xdf802e1cc6474df913626991e9fca3835c620a519f397afe04bf9c260e723257\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// +build ovm\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\ncontract Lib_AddressResolver {\\n\\n /*******************************************\\n * Contract Variables: Contract References *\\n *******************************************/\\n\\n Lib_AddressManager internal libAddressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(\\n address _libAddressManager\\n ) public {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function resolve(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address _contract\\n )\\n {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0xf3b9d78b309ddeec259ce3e0e1cfdef3ca40938e9a81971b28ce2b8ea327f533\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// +build ovm\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Ownable\\n * @dev Adapted from https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol\\n */\\nabstract contract Ownable {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n address public owner;\\n\\n\\n /**********\\n * Events *\\n **********/\\n\\n event OwnershipTransferred(\\n address indexed previousOwner,\\n address indexed newOwner\\n );\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n constructor() internal {\\n owner = msg.sender;\\n emit OwnershipTransferred(address(0), owner);\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n owner == msg.sender,\\n \\\"Ownable: caller is not the owner\\\"\\n );\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function renounceOwnership()\\n public\\n virtual\\n onlyOwner\\n {\\n emit OwnershipTransferred(owner, address(0));\\n owner = address(0);\\n }\\n\\n function transferOwnership(address _newOwner)\\n public\\n virtual\\n onlyOwner\\n {\\n require(\\n _newOwner != address(0),\\n \\\"Ownable: new owner cannot be the zero address\\\"\\n );\\n\\n emit OwnershipTransferred(owner, _newOwner);\\n owner = _newOwner;\\n }\\n}\\n\",\"keccak256\":\"0xe0409fbd236d16ca6be439d9d97dd36d0d9a0697ee0062d49588b9d29c248e47\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_RingBuffer.sol\":{\"content\":\"pragma solidity ^0.7.0;\\n\\nlibrary Lib_RingBuffer {\\n using Lib_RingBuffer for RingBuffer;\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Buffer {\\n uint256 length;\\n mapping (uint256 => bytes32) buf;\\n }\\n\\n struct RingBuffer {\\n bytes32 contextA;\\n bytes32 contextB;\\n Buffer bufferA;\\n Buffer bufferB;\\n uint256 nextOverwritableIndex;\\n }\\n\\n struct RingBufferContext {\\n // contextA\\n uint40 globalIndex;\\n bytes27 extraData;\\n\\n // contextB\\n uint64 currBufferIndex;\\n uint40 prevResetIndex;\\n uint40 currResetIndex;\\n }\\n\\n\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 constant MIN_CAPACITY = 16;\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n * @param _extraData Optional global extra data.\\n */\\n function push(\\n RingBuffer storage _self,\\n bytes32 _value,\\n bytes27 _extraData\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n Buffer storage currBuffer = _self.getBuffer(ctx.currBufferIndex);\\n\\n // Set a minimum capacity.\\n if (currBuffer.length == 0) {\\n currBuffer.length = MIN_CAPACITY;\\n }\\n\\n // Check if we need to expand the buffer.\\n if (ctx.globalIndex - ctx.currResetIndex >= currBuffer.length) {\\n if (ctx.currResetIndex < _self.nextOverwritableIndex) {\\n // We're going to overwrite the inactive buffer.\\n // Bump the buffer index, reset the delete offset, and set our reset indices.\\n ctx.currBufferIndex++;\\n ctx.prevResetIndex = ctx.currResetIndex;\\n ctx.currResetIndex = ctx.globalIndex;\\n\\n // Swap over to the next buffer.\\n currBuffer = _self.getBuffer(ctx.currBufferIndex);\\n } else {\\n // We're not overwriting yet, double the length of the current buffer.\\n currBuffer.length *= 2;\\n }\\n }\\n\\n // Index to write to is the difference of the global and reset indices.\\n uint256 writeHead = ctx.globalIndex - ctx.currResetIndex;\\n currBuffer.buf[writeHead] = _value;\\n\\n // Bump the global index and insert our extra data, then save the context.\\n ctx.globalIndex++;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n */\\n function push(\\n RingBuffer storage _self,\\n bytes32 _value\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n \\n _self.push(\\n _value,\\n ctx.extraData\\n );\\n }\\n\\n /**\\n * Pushes a two elements to the buffer.\\n * @param _self Buffer to access.\\n * @param _valueA First value to push to the buffer.\\n * @param _valueA Second value to push to the buffer.\\n * @param _extraData Optional global extra data.\\n */\\n function push2(\\n RingBuffer storage _self,\\n bytes32 _valueA,\\n bytes32 _valueB,\\n bytes27 _extraData\\n )\\n internal\\n {\\n _self.push(_valueA, _extraData);\\n _self.push(_valueB, _extraData);\\n }\\n\\n /**\\n * Pushes a two elements to the buffer.\\n * @param _self Buffer to access.\\n * @param _valueA First value to push to the buffer.\\n * @param _valueA Second value to push to the buffer.\\n */\\n function push2(\\n RingBuffer storage _self,\\n bytes32 _valueA,\\n bytes32 _valueB\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n\\n _self.push2(\\n _valueA,\\n _valueB,\\n ctx.extraData\\n );\\n }\\n\\n /**\\n * Retrieves an element from the buffer.\\n * @param _self Buffer to access.\\n * @param _index Element index to retrieve.\\n * @return Value of the element at the given index.\\n */\\n function get(\\n RingBuffer storage _self,\\n uint256 _index\\n )\\n internal\\n view\\n returns (\\n bytes32 \\n )\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n\\n require(\\n _index < ctx.globalIndex,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n Buffer storage currBuffer = _self.getBuffer(ctx.currBufferIndex);\\n Buffer storage prevBuffer = _self.getBuffer(ctx.currBufferIndex + 1);\\n\\n if (_index >= ctx.currResetIndex) {\\n // We're trying to load an element from the current buffer.\\n // Relative index is just the difference from the reset index.\\n uint256 relativeIndex = _index - ctx.currResetIndex;\\n\\n // Shouldn't happen but why not check.\\n require(\\n relativeIndex < currBuffer.length,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n return currBuffer.buf[relativeIndex];\\n } else {\\n // We're trying to load an element from the previous buffer.\\n // Relative index is the difference from the reset index in the other direction.\\n uint256 relativeIndex = ctx.currResetIndex - _index;\\n\\n // Condition only fails in the case that we deleted and flipped buffers.\\n require(\\n ctx.currResetIndex > ctx.prevResetIndex,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n // Make sure we're not trying to read beyond the array.\\n require(\\n relativeIndex <= prevBuffer.length,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n return prevBuffer.buf[prevBuffer.length - relativeIndex];\\n }\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n * @param _extraData Optional global extra data.\\n */\\n function deleteElementsAfterInclusive(\\n RingBuffer storage _self,\\n uint40 _index,\\n bytes27 _extraData\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n\\n require(\\n _index < ctx.globalIndex && _index >= ctx.prevResetIndex,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n Buffer storage currBuffer = _self.getBuffer(ctx.currBufferIndex);\\n Buffer storage prevBuffer = _self.getBuffer(ctx.currBufferIndex + 1);\\n\\n if (_index < ctx.currResetIndex) {\\n // We're switching back to the previous buffer.\\n // Reduce the buffer index, set the current reset index back to match the previous one.\\n // We use the equality of these two values to prevent reading beyond this buffer.\\n ctx.currBufferIndex--;\\n ctx.currResetIndex = ctx.prevResetIndex;\\n }\\n\\n // Set our global index and extra data, save the context.\\n ctx.globalIndex = _index;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n */\\n function deleteElementsAfterInclusive(\\n RingBuffer storage _self,\\n uint40 _index\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n _self.deleteElementsAfterInclusive(\\n _index,\\n ctx.extraData\\n );\\n }\\n\\n /**\\n * Retrieves the current global index.\\n * @param _self Buffer to access.\\n * @return Current global index.\\n */\\n function getLength(\\n RingBuffer storage _self\\n )\\n internal\\n view\\n returns (\\n uint40\\n )\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n return ctx.globalIndex;\\n }\\n\\n /**\\n * Changes current global extra data.\\n * @param _self Buffer to access.\\n * @param _extraData New global extra data.\\n */\\n function setExtraData(\\n RingBuffer storage _self,\\n bytes27 _extraData\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Retrieves the current global extra data.\\n * @param _self Buffer to access.\\n * @return Current global extra data.\\n */\\n function getExtraData(\\n RingBuffer storage _self\\n )\\n internal\\n view\\n returns (\\n bytes27\\n )\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n return ctx.extraData;\\n }\\n\\n /**\\n * Sets the current ring buffer context.\\n * @param _self Buffer to access.\\n * @param _ctx Current ring buffer context.\\n */\\n function setContext(\\n RingBuffer storage _self,\\n RingBufferContext memory _ctx\\n )\\n internal\\n returns (\\n bytes32\\n )\\n {\\n bytes32 contextA;\\n bytes32 contextB;\\n\\n uint40 globalIndex = _ctx.globalIndex;\\n bytes27 extraData = _ctx.extraData;\\n assembly {\\n contextA := globalIndex\\n contextA := or(contextA, extraData)\\n }\\n\\n uint64 currBufferIndex = _ctx.currBufferIndex;\\n uint40 prevResetIndex = _ctx.prevResetIndex;\\n uint40 currResetIndex = _ctx.currResetIndex;\\n assembly {\\n contextB := currBufferIndex\\n contextB := or(contextB, shl(64, prevResetIndex))\\n contextB := or(contextB, shl(104, currResetIndex))\\n }\\n\\n if (_self.contextA != contextA) {\\n _self.contextA = contextA;\\n }\\n\\n if (_self.contextB != contextB) {\\n _self.contextB = contextB;\\n }\\n }\\n\\n /**\\n * Retrieves the current ring buffer context.\\n * @param _self Buffer to access.\\n * @return Current ring buffer context.\\n */\\n function getContext(\\n RingBuffer storage _self\\n )\\n internal\\n view\\n returns (\\n RingBufferContext memory\\n )\\n {\\n bytes32 contextA = _self.contextA;\\n bytes32 contextB = _self.contextB;\\n\\n uint40 globalIndex;\\n bytes27 extraData;\\n assembly {\\n globalIndex := and(contextA, 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF)\\n extraData := and(contextA, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000)\\n }\\n\\n uint64 currBufferIndex;\\n uint40 prevResetIndex;\\n uint40 currResetIndex;\\n assembly {\\n currBufferIndex := and(contextB, 0x000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF)\\n prevResetIndex := shr(64, and(contextB, 0x00000000000000000000000000000000000000FFFFFFFFFF0000000000000000))\\n currResetIndex := shr(104, and(contextB, 0x0000000000000000000000000000FFFFFFFFFF00000000000000000000000000))\\n }\\n\\n return RingBufferContext({\\n globalIndex: globalIndex,\\n extraData: extraData,\\n currBufferIndex: currBufferIndex,\\n prevResetIndex: prevResetIndex,\\n currResetIndex: currResetIndex\\n });\\n }\\n\\n /**\\n * Retrieves the a buffer from the ring buffer by index.\\n * @param _self Buffer to access.\\n * @param _which Index of the sub buffer to access.\\n * @return Sub buffer for the index.\\n */\\n function getBuffer(\\n RingBuffer storage _self,\\n uint256 _which\\n )\\n internal\\n view\\n returns (\\n Buffer storage\\n )\\n {\\n return _which % 2 == 0 ? _self.bufferA : _self.bufferB;\\n }\\n}\\n\",\"keccak256\":\"0x0c4bb53aba64441b2ec26e7a13de8f04f104bb654e550ccc30db500cac33d2a3\"}},\"version\":1}", - "bytecode": "0x60806040523480156200001157600080fd5b50604051620013f3380380620013f3833981810160405260408110156200003757600080fd5b8151602083018051604051929492938301929190846401000000008211156200005f57600080fd5b9083019060208201858111156200007557600080fd5b82516401000000008111828201881017156200009057600080fd5b82525081516020918201929091019080838360005b83811015620000bf578181015183820152602001620000a5565b50505050905090810190601f168015620000ed5780820380516001836020036101000a031916815260200191505b506040525050600080546001600160a01b0319166001600160a01b038516179055508051620001249060019060208401906200012d565b505050620001d9565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282620001655760008555620001b0565b82601f106200018057805160ff1916838001178555620001b0565b82800160010185558215620001b0579182015b82811115620001b057825182559160200191906001019062000193565b50620001be929150620001c2565b5090565b5b80821115620001be5760008155600101620001c3565b61120a80620001e96000396000f3fe608060405234801561001057600080fd5b50600436106100cf5760003560e01c80634651d91e1161008c578063b298e36b11610066578063b298e36b14610315578063ccf8f96914610332578063d41c021814610355578063fa9e936c14610378576100cf565b80634651d91e1461025e5780638da5cb5b1461027b5780639507d39a146102f8576100cf565b806314f22255146100d4578063167fd681146101075780631f7b6d32146101325780632015276c1461014c57806329061de214610177578063461a44781461019c575b600080fd5b610105600480360360608110156100ea57600080fd5b508035906020810135906040013564ffffffffff1916610395565b005b6101056004803603604081101561011d57600080fd5b508035906020013564ffffffffff191661048c565b61013a61054c565b60408051918252519081900360200190f35b6101056004803603604081101561016257600080fd5b508035906020013564ffffffffff1916610564565b6101056004803603602081101561018d57600080fd5b503564ffffffffff1916610620565b610242600480360360208110156101b257600080fd5b8101906020810181356401000000008111156101cd57600080fd5b8201836020820111156101df57600080fd5b8035906020019184600183028401116401000000008311171561020157600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506106de945050505050565b604080516001600160a01b039092168252519081900360200190f35b6101056004803603602081101561027457600080fd5b50356107ba565b610283610875565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102bd5781810151838201526020016102a5565b50505050905090810190601f1680156102ea5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61013a6004803603602081101561030e57600080fd5b5035610902565b6101056004803603602081101561032b57600080fd5b503561091c565b61033a6109d7565b6040805164ffffffffff199092168252519081900360200190f35b6101056004803603604081101561036b57600080fd5b50803590602001356109e8565b6101056004803603602081101561038e57600080fd5b5035610aa4565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261042b93909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b820191906000526020600020905b81548152906001019060200180831161040457829003601f168201915b50505050506106de565b6001600160a01b0316336001600160a01b03161461047a5760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b6104876002848484610b59565b505050565b60018054604080516020601f6002600019610100878916150201909516949094049384018190048102820181019092528281526104ed93909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b6001600160a01b0316336001600160a01b03161461053c5760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b61054860028383610b75565b5050565b60006105586002610cb7565b64ffffffffff16905090565b60018054604080516020601f6002600019610100878916150201909516949094049384018190048102820181019092528281526105c593909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b6001600160a01b0316336001600160a01b0316146106145760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b61054860028383610ccb565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261068193909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b6001600160a01b0316336001600160a01b0316146106d05760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b6106db600282610dca565b50565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b8381101561073e578181015183820152602001610726565b50505050905090810190601f16801561076b5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561078857600080fd5b505afa15801561079c573d6000803e3d6000fd5b505050506040513d60208110156107b257600080fd5b505192915050565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261081b93909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b6001600160a01b0316336001600160a01b03161461086a5760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b6106db600282610def565b60018054604080516020600284861615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156108fa5780601f106108cf576101008083540402835291602001916108fa565b820191906000526020600020905b8154815290600101906020018083116108dd57829003601f168201915b505050505081565b6000610916600264ffffffffff8416610e15565b92915050565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261097d93909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b6001600160a01b0316336001600160a01b0316146109cc5760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b6106db60028261101e565b60006109e36002611044565b905090565b60018054604080516020601f600260001961010087891615020190951694909404938401819004810282018101909252828152610a4993909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b6001600160a01b0316336001600160a01b031614610a985760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b6105486002838361105b565b60018054604080516020601f600260001961010087891615020190951694909404938401819004810282018101909252828152610b0593909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b6001600160a01b0316336001600160a01b031614610b545760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b600855565b610b64848483610ccb565b610b6f848383610ccb565b50505050565b6000610b8084611083565b9050806000015164ffffffffff168364ffffffffff16108015610bb55750806060015164ffffffffff168364ffffffffff1610155b610bfd576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b6000610c20826040015167ffffffffffffffff16866110e390919063ffffffff16565b90506000610c48836040015160010167ffffffffffffffff16876110e390919063ffffffff16565b9050826080015164ffffffffff168564ffffffffff161015610c8c576040830180516000190167ffffffffffffffff169052606083015164ffffffffff1660808401525b64ffffffffff8516835264ffffffffff1984166020840152610cae8684611103565b50505050505050565b600080610cc383611083565b519392505050565b6000610cd684611083565b90506000610cfb826040015167ffffffffffffffff16866110e390919063ffffffff16565b8054909150610d0957601081555b8054608083015183510364ffffffffff1610610d80578460060154826080015164ffffffffff161015610d785760408201805160010167ffffffffffffffff169081905260808301805164ffffffffff90811660608601528451169052610d719086906110e3565b9050610d80565b805460020281555b608082015182510364ffffffffff9081166000818152600184810160209081526040909220889055855101909216845264ffffffffff19851691840191909152610cae8684611103565b6000610dd583611083565b64ffffffffff19831660208201529050610b6f8382611103565b6000610dfa83611083565b905061048782826020015185610b759092919063ffffffff16565b600080610e2184611083565b805190915064ffffffffff168310610e77576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b6000610e9a826040015167ffffffffffffffff16866110e390919063ffffffff16565b90506000610ec2836040015160010167ffffffffffffffff16876110e390919063ffffffff16565b9050826080015164ffffffffff168510610f4f576080830151825464ffffffffff9091168603908110610f33576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b6000908152600190920160205250604090205491506109169050565b6080830151606084015164ffffffffff9182168781039290911610610fb2576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b8154811115610fff576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b8154036000908152600190910160205260409020549250610916915050565b600061102983611083565b905061048782826020015185610ccb9092919063ffffffff16565b60008061105083611083565b602001519392505050565b600061106684611083565b9050610b6f8383836020015187610b59909392919063ffffffff16565b61108b611162565b5080546001909101546040805160a08101825264ffffffffff808516825264ffffffffff19909416602082015267ffffffffffffffff8316818301529082901c8316606082015260689190911c909116608082015290565b600060028206156110f757826004016110fc565b826002015b9392505050565b80516020820151604080840151606085015160808601518754600096868117969584901b8517606884901b17959094909390929091871461114257868a555b858a60010154146111555760018a018690555b5050505050505092915050565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091529056fe4f564d5f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2063616e206f6e6c792062652063616c6c656420627920746865206f776e65722ea264697066735822122037f5f91f3a7302668798afaeee2c0c2d9aad06dfcc80e263efc2cd8f4842eebe64736f6c63430007060033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100cf5760003560e01c80634651d91e1161008c578063b298e36b11610066578063b298e36b14610315578063ccf8f96914610332578063d41c021814610355578063fa9e936c14610378576100cf565b80634651d91e1461025e5780638da5cb5b1461027b5780639507d39a146102f8576100cf565b806314f22255146100d4578063167fd681146101075780631f7b6d32146101325780632015276c1461014c57806329061de214610177578063461a44781461019c575b600080fd5b610105600480360360608110156100ea57600080fd5b508035906020810135906040013564ffffffffff1916610395565b005b6101056004803603604081101561011d57600080fd5b508035906020013564ffffffffff191661048c565b61013a61054c565b60408051918252519081900360200190f35b6101056004803603604081101561016257600080fd5b508035906020013564ffffffffff1916610564565b6101056004803603602081101561018d57600080fd5b503564ffffffffff1916610620565b610242600480360360208110156101b257600080fd5b8101906020810181356401000000008111156101cd57600080fd5b8201836020820111156101df57600080fd5b8035906020019184600183028401116401000000008311171561020157600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506106de945050505050565b604080516001600160a01b039092168252519081900360200190f35b6101056004803603602081101561027457600080fd5b50356107ba565b610283610875565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102bd5781810151838201526020016102a5565b50505050905090810190601f1680156102ea5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61013a6004803603602081101561030e57600080fd5b5035610902565b6101056004803603602081101561032b57600080fd5b503561091c565b61033a6109d7565b6040805164ffffffffff199092168252519081900360200190f35b6101056004803603604081101561036b57600080fd5b50803590602001356109e8565b6101056004803603602081101561038e57600080fd5b5035610aa4565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261042b93909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b820191906000526020600020905b81548152906001019060200180831161040457829003601f168201915b50505050506106de565b6001600160a01b0316336001600160a01b03161461047a5760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b6104876002848484610b59565b505050565b60018054604080516020601f6002600019610100878916150201909516949094049384018190048102820181019092528281526104ed93909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b6001600160a01b0316336001600160a01b03161461053c5760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b61054860028383610b75565b5050565b60006105586002610cb7565b64ffffffffff16905090565b60018054604080516020601f6002600019610100878916150201909516949094049384018190048102820181019092528281526105c593909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b6001600160a01b0316336001600160a01b0316146106145760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b61054860028383610ccb565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261068193909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b6001600160a01b0316336001600160a01b0316146106d05760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b6106db600282610dca565b50565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b8381101561073e578181015183820152602001610726565b50505050905090810190601f16801561076b5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561078857600080fd5b505afa15801561079c573d6000803e3d6000fd5b505050506040513d60208110156107b257600080fd5b505192915050565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261081b93909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b6001600160a01b0316336001600160a01b03161461086a5760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b6106db600282610def565b60018054604080516020600284861615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156108fa5780601f106108cf576101008083540402835291602001916108fa565b820191906000526020600020905b8154815290600101906020018083116108dd57829003601f168201915b505050505081565b6000610916600264ffffffffff8416610e15565b92915050565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261097d93909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b6001600160a01b0316336001600160a01b0316146109cc5760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b6106db60028261101e565b60006109e36002611044565b905090565b60018054604080516020601f600260001961010087891615020190951694909404938401819004810282018101909252828152610a4993909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b6001600160a01b0316336001600160a01b031614610a985760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b6105486002838361105b565b60018054604080516020601f600260001961010087891615020190951694909404938401819004810282018101909252828152610b0593909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b6001600160a01b0316336001600160a01b031614610b545760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b600855565b610b64848483610ccb565b610b6f848383610ccb565b50505050565b6000610b8084611083565b9050806000015164ffffffffff168364ffffffffff16108015610bb55750806060015164ffffffffff168364ffffffffff1610155b610bfd576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b6000610c20826040015167ffffffffffffffff16866110e390919063ffffffff16565b90506000610c48836040015160010167ffffffffffffffff16876110e390919063ffffffff16565b9050826080015164ffffffffff168564ffffffffff161015610c8c576040830180516000190167ffffffffffffffff169052606083015164ffffffffff1660808401525b64ffffffffff8516835264ffffffffff1984166020840152610cae8684611103565b50505050505050565b600080610cc383611083565b519392505050565b6000610cd684611083565b90506000610cfb826040015167ffffffffffffffff16866110e390919063ffffffff16565b8054909150610d0957601081555b8054608083015183510364ffffffffff1610610d80578460060154826080015164ffffffffff161015610d785760408201805160010167ffffffffffffffff169081905260808301805164ffffffffff90811660608601528451169052610d719086906110e3565b9050610d80565b805460020281555b608082015182510364ffffffffff9081166000818152600184810160209081526040909220889055855101909216845264ffffffffff19851691840191909152610cae8684611103565b6000610dd583611083565b64ffffffffff19831660208201529050610b6f8382611103565b6000610dfa83611083565b905061048782826020015185610b759092919063ffffffff16565b600080610e2184611083565b805190915064ffffffffff168310610e77576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b6000610e9a826040015167ffffffffffffffff16866110e390919063ffffffff16565b90506000610ec2836040015160010167ffffffffffffffff16876110e390919063ffffffff16565b9050826080015164ffffffffff168510610f4f576080830151825464ffffffffff9091168603908110610f33576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b6000908152600190920160205250604090205491506109169050565b6080830151606084015164ffffffffff9182168781039290911610610fb2576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b8154811115610fff576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b8154036000908152600190910160205260409020549250610916915050565b600061102983611083565b905061048782826020015185610ccb9092919063ffffffff16565b60008061105083611083565b602001519392505050565b600061106684611083565b9050610b6f8383836020015187610b59909392919063ffffffff16565b61108b611162565b5080546001909101546040805160a08101825264ffffffffff808516825264ffffffffff19909416602082015267ffffffffffffffff8316818301529082901c8316606082015260689190911c909116608082015290565b600060028206156110f757826004016110fc565b826002015b9392505050565b80516020820151604080840151606085015160808601518754600096868117969584901b8517606884901b17959094909390929091871461114257868a555b858a60010154146111555760018a018690555b5050505050505092915050565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091529056fe4f564d5f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2063616e206f6e6c792062652063616c6c656420627920746865206f776e65722ea264697066735822122037f5f91f3a7302668798afaeee2c0c2d9aad06dfcc80e263efc2cd8f4842eebe64736f6c63430007060033", - "devdoc": { - "kind": "dev", - "methods": { - "constructor": { - "params": { - "_libAddressManager": "Address of the Address Manager.", - "_owner": "Name of the contract that owns this container (will be resolved later)." - } - }, - "deleteElementsAfterInclusive(uint256)": { - "params": { - "_index": "Object index to delete from." - } - }, - "deleteElementsAfterInclusive(uint256,bytes27)": { - "params": { - "_globalMetadata": "New global metadata for the container.", - "_index": "Object index to delete from." - } - }, - "get(uint256)": { - "params": { - "_index": "Index of the particular object to access." - }, - "returns": { - "_0": "32 byte object value." - } - }, - "getGlobalMetadata()": { - "returns": { - "_0": "Container global metadata field." - } - }, - "length()": { - "returns": { - "_0": "Number of objects in the container." - } - }, - "push(bytes32)": { - "params": { - "_object": "A 32 byte value to insert into the container." - } - }, - "push(bytes32,bytes27)": { - "params": { - "_globalMetadata": "New global metadata for the container.", - "_object": "A 32 byte value to insert into the container." - } - }, - "push2(bytes32,bytes32)": { - "params": { - "_objectA": "First 32 byte value to insert into the container.", - "_objectB": "Second 32 byte value to insert into the container." - } - }, - "push2(bytes32,bytes32,bytes27)": { - "params": { - "_globalMetadata": "New global metadata for the container.", - "_objectA": "First 32 byte value to insert into the container.", - "_objectB": "Second 32 byte value to insert into the container." - } - }, - "setGlobalMetadata(bytes27)": { - "params": { - "_globalMetadata": "New global metadata to set." - } - } - }, - "title": "OVM_ChainStorageContainer", - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": { - "deleteElementsAfterInclusive(uint256)": { - "notice": "Removes all objects after and including a given index." - }, - "deleteElementsAfterInclusive(uint256,bytes27)": { - "notice": "Removes all objects after and including a given index. Also allows setting the global metadata field." - }, - "get(uint256)": { - "notice": "Retrieves an object from the container." - }, - "getGlobalMetadata()": { - "notice": "Retrieves the container's global metadata field." - }, - "length()": { - "notice": "Retrieves the number of objects stored in the container." - }, - "push(bytes32)": { - "notice": "Pushes an object into the container." - }, - "push(bytes32,bytes27)": { - "notice": "Pushes an object into the container. Function allows setting the global metadata since we'll need to touch the \"length\" storage slot anyway, which also contains the global metadata (it's an optimization)." - }, - "push2(bytes32,bytes32)": { - "notice": "Pushes two objects into the container at the same time. A useful optimization." - }, - "push2(bytes32,bytes32,bytes27)": { - "notice": "Pushes two objects into the container at the same time. Also allows setting the global metadata field." - }, - "setGlobalMetadata(bytes27)": { - "notice": "Sets the container's global metadata field. We're using `bytes27` here because we use five bytes to maintain the length of the underlying data structure, meaning we have an extra 27 bytes to store arbitrary data." - }, - "setNextOverwritableIndex(uint256)": { - "notice": "Marks an index as overwritable, meaing the underlying buffer can start to write values over any objects before and including the given index." - } - }, - "version": 1 - }, - "storageLayout": { - "storage": [ - { - "astId": 11707, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "libAddressManager", - "offset": 0, - "slot": "0", - "type": "t_contract(Lib_AddressManager)11700" - }, - { - "astId": 2888, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "owner", - "offset": 0, - "slot": "1", - "type": "t_string_storage" - }, - { - "astId": 2890, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "buffer", - "offset": 0, - "slot": "2", - "type": "t_struct(RingBuffer)16365_storage" - } - ], - "types": { - "t_bytes32": { - "encoding": "inplace", - "label": "bytes32", - "numberOfBytes": "32" - }, - "t_contract(Lib_AddressManager)11700": { - "encoding": "inplace", - "label": "contract Lib_AddressManager", - "numberOfBytes": "20" - }, - "t_mapping(t_uint256,t_bytes32)": { - "encoding": "mapping", - "key": "t_uint256", - "label": "mapping(uint256 => bytes32)", - "numberOfBytes": "32", - "value": "t_bytes32" - }, - "t_string_storage": { - "encoding": "bytes", - "label": "string", - "numberOfBytes": "32" - }, - "t_struct(Buffer)16354_storage": { - "encoding": "inplace", - "label": "struct Lib_RingBuffer.Buffer", - "members": [ - { - "astId": 16349, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "length", - "offset": 0, - "slot": "0", - "type": "t_uint256" - }, - { - "astId": 16353, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "buf", - "offset": 0, - "slot": "1", - "type": "t_mapping(t_uint256,t_bytes32)" - } - ], - "numberOfBytes": "64" - }, - "t_struct(RingBuffer)16365_storage": { - "encoding": "inplace", - "label": "struct Lib_RingBuffer.RingBuffer", - "members": [ - { - "astId": 16356, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "contextA", - "offset": 0, - "slot": "0", - "type": "t_bytes32" - }, - { - "astId": 16358, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "contextB", - "offset": 0, - "slot": "1", - "type": "t_bytes32" - }, - { - "astId": 16360, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "bufferA", - "offset": 0, - "slot": "2", - "type": "t_struct(Buffer)16354_storage" - }, - { - "astId": 16362, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "bufferB", - "offset": 0, - "slot": "4", - "type": "t_struct(Buffer)16354_storage" - }, - { - "astId": 16364, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "nextOverwritableIndex", - "offset": 0, - "slot": "6", - "type": "t_uint256" - } - ], - "numberOfBytes": "224" - }, - "t_uint256": { - "encoding": "inplace", - "label": "uint256", - "numberOfBytes": "32" - } - } - } -} \ No newline at end of file diff --git a/packages/contracts/deployments/goerli-v1/OVM_L1CrossDomainMessenger.json b/packages/contracts/deployments/goerli-v1/OVM_L1CrossDomainMessenger.json deleted file mode 100644 index 9e4fbcd6caaf2..0000000000000 --- a/packages/contracts/deployments/goerli-v1/OVM_L1CrossDomainMessenger.json +++ /dev/null @@ -1,477 +0,0 @@ -{ - "address": "0x1c15fcA66a14eB2de5cDCf0BF1f45580b58ca5AC", - "abi": [ - { - "inputs": [], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "bytes32", - "name": "msgHash", - "type": "bytes32" - } - ], - "name": "RelayedMessage", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "bytes", - "name": "message", - "type": "bytes" - } - ], - "name": "SentMessage", - "type": "event" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_libAddressManager", - "type": "address" - } - ], - "name": "initialize", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "messageNonce", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_target", - "type": "address" - }, - { - "internalType": "address", - "name": "_sender", - "type": "address" - }, - { - "internalType": "bytes", - "name": "_message", - "type": "bytes" - }, - { - "internalType": "uint256", - "name": "_messageNonce", - "type": "uint256" - }, - { - "components": [ - { - "internalType": "bytes32", - "name": "stateRoot", - "type": "bytes32" - }, - { - "components": [ - { - "internalType": "uint256", - "name": "batchIndex", - "type": "uint256" - }, - { - "internalType": "bytes32", - "name": "batchRoot", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "batchSize", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "prevTotalElements", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "extraData", - "type": "bytes" - } - ], - "internalType": "struct Lib_OVMCodec.ChainBatchHeader", - "name": "stateRootBatchHeader", - "type": "tuple" - }, - { - "components": [ - { - "internalType": "uint256", - "name": "index", - "type": "uint256" - }, - { - "internalType": "bytes32[]", - "name": "siblings", - "type": "bytes32[]" - } - ], - "internalType": "struct Lib_OVMCodec.ChainInclusionProof", - "name": "stateRootProof", - "type": "tuple" - }, - { - "internalType": "bytes", - "name": "stateTrieWitness", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "storageTrieWitness", - "type": "bytes" - } - ], - "internalType": "struct iOVM_L1CrossDomainMessenger.L2MessageInclusionProof", - "name": "_proof", - "type": "tuple" - } - ], - "name": "relayMessage", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "name": "relayedMessages", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_target", - "type": "address" - }, - { - "internalType": "address", - "name": "_sender", - "type": "address" - }, - { - "internalType": "bytes", - "name": "_message", - "type": "bytes" - }, - { - "internalType": "uint256", - "name": "_messageNonce", - "type": "uint256" - }, - { - "internalType": "uint32", - "name": "_gasLimit", - "type": "uint32" - } - ], - "name": "replayMessage", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "string", - "name": "_name", - "type": "string" - } - ], - "name": "resolve", - "outputs": [ - { - "internalType": "address", - "name": "_contract", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_target", - "type": "address" - }, - { - "internalType": "bytes", - "name": "_message", - "type": "bytes" - }, - { - "internalType": "uint32", - "name": "_gasLimit", - "type": "uint32" - } - ], - "name": "sendMessage", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "name": "sentMessages", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "name": "successfulMessages", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "xDomainMessageSender", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - } - ], - "transactionHash": "0x58185415b9f46e832c94156c7ff7c404e0bd4e41bf72422cd4da96647cd75f9e", - "receipt": { - "to": null, - "from": "0x558ba9b8d78713fbf768c1f8a584485B4003f43F", - "contractAddress": "0x2c299baBfF749D06abd68653769Dc1119C401bFF", - "transactionIndex": 3, - "gasUsed": "2165184", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0xa32e80c913e7a984d2d98e55cedf5835a409847785ddedfca99c7c17cf0f7add", - "transactionHash": "0x58185415b9f46e832c94156c7ff7c404e0bd4e41bf72422cd4da96647cd75f9e", - "logs": [], - "blockNumber": 4573442, - "cumulativeGasUsed": "2405923", - "status": 1, - "byzantium": true - }, - "args": [], - "solcInputHash": "cebcb515c1a9c570d96e0b8f6fd237e2", - "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"msgHash\",\"type\":\"bytes32\"}],\"name\":\"RelayedMessage\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"}],\"name\":\"SentMessage\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"messageNonce\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_sender\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_message\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"_messageNonce\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"stateRootBatchHeader\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"siblings\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct Lib_OVMCodec.ChainInclusionProof\",\"name\":\"stateRootProof\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"stateTrieWitness\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"storageTrieWitness\",\"type\":\"bytes\"}],\"internalType\":\"struct iOVM_L1CrossDomainMessenger.L2MessageInclusionProof\",\"name\":\"_proof\",\"type\":\"tuple\"}],\"name\":\"relayMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"relayedMessages\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_sender\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_message\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"_messageNonce\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"_gasLimit\",\"type\":\"uint32\"}],\"name\":\"replayMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"_contract\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_message\",\"type\":\"bytes\"},{\"internalType\":\"uint32\",\"name\":\"_gasLimit\",\"type\":\"uint32\"}],\"name\":\"sendMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"sentMessages\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"successfulMessages\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"xDomainMessageSender\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This contract lives on L1. It sends L1->L2 messages into L2, and relays L2->L1 messages from L2 to their target on L1.\",\"kind\":\"dev\",\"methods\":{\"initialize(address)\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\"}},\"relayMessage(address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))\":{\"params\":{\"_message\":\"Message to send to the target.\",\"_messageNonce\":\"Nonce for the provided message.\",\"_proof\":\"Inclusion proof for the given message.\",\"_sender\":\"Message sender address.\",\"_target\":\"Target contract address.\"}},\"replayMessage(address,address,bytes,uint256,uint32)\":{\"params\":{\"_gasLimit\":\"Gas limit for the provided message.\",\"_message\":\"Message to send to the target.\",\"_messageNonce\":\"Nonce for the provided message.\",\"_sender\":\"Original sender address.\",\"_target\":\"Target contract address.\"}},\"sendMessage(address,bytes,uint32)\":{\"params\":{\"_gasLimit\":\"Gas limit for the provided message.\",\"_message\":\"Message to send to the target.\",\"_target\":\"Target contract address.\"}}},\"title\":\"OVM_L1CrossDomainMessenger\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"constructor\":{\"notice\":\"Pass a default zero address to the address resolver. This will be updated when initialized.\"},\"relayMessage(address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))\":{\"notice\":\"Relays a cross domain message to a contract.\"},\"replayMessage(address,address,bytes,uint256,uint32)\":{\"notice\":\"Replays a cross domain message to the target messenger.\"},\"sendMessage(address,bytes,uint32)\":{\"notice\":\"Sends a cross domain message to the target messenger.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/OVM/bridge/OVM_L1CrossDomainMessenger.sol\":\"OVM_L1CrossDomainMessenger\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/optimistic-ethereum/OVM/bridge/OVM_BaseCrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// +build ovm\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Interface Imports */\\nimport { iOVM_BaseCrossDomainMessenger } from \\\"../../iOVM/bridge/iOVM_BaseCrossDomainMessenger.sol\\\";\\n\\n/* Library Imports */\\nimport { Lib_ReentrancyGuard } from \\\"../../libraries/utils/Lib_ReentrancyGuard.sol\\\";\\n\\n/**\\n * @title OVM_BaseCrossDomainMessenger\\n */\\nabstract contract OVM_BaseCrossDomainMessenger is iOVM_BaseCrossDomainMessenger, Lib_ReentrancyGuard {\\n\\n /**********************\\n * Contract Variables *\\n **********************/\\n\\n mapping (bytes32 => bool) public relayedMessages;\\n mapping (bytes32 => bool) public successfulMessages;\\n mapping (bytes32 => bool) public sentMessages;\\n uint256 public messageNonce;\\n address override public xDomainMessageSender;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n constructor() Lib_ReentrancyGuard() internal {}\\n\\n /**\\n * Sends a cross domain message to the target messenger.\\n * @param _target Target contract address.\\n * @param _message Message to send to the target.\\n * @param _gasLimit Gas limit for the provided message.\\n */\\n function sendMessage(\\n address _target,\\n bytes memory _message,\\n uint32 _gasLimit\\n )\\n override\\n public\\n {\\n bytes memory xDomainCalldata = _getXDomainCalldata(\\n _target,\\n msg.sender,\\n _message,\\n messageNonce\\n );\\n\\n messageNonce += 1;\\n sentMessages[keccak256(xDomainCalldata)] = true;\\n\\n _sendXDomainMessage(xDomainCalldata, _gasLimit);\\n emit SentMessage(xDomainCalldata);\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Generates the correct cross domain calldata for a message.\\n * @param _target Target contract address.\\n * @param _sender Message sender address.\\n * @param _message Message to send to the target.\\n * @param _messageNonce Nonce for the provided message.\\n * @return ABI encoded cross domain calldata.\\n */\\n function _getXDomainCalldata(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _messageNonce\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return abi.encodeWithSignature(\\n \\\"relayMessage(address,address,bytes,uint256)\\\",\\n _target,\\n _sender,\\n _message,\\n _messageNonce\\n );\\n }\\n\\n /**\\n * Sends a cross domain message.\\n * @param _message Message to send.\\n * @param _gasLimit Gas limit for the provided message.\\n */\\n function _sendXDomainMessage(\\n bytes memory _message,\\n uint256 _gasLimit\\n )\\n virtual\\n internal\\n {\\n revert(\\\"Implement me in child contracts!\\\");\\n }\\n}\\n\",\"keccak256\":\"0x25c5521fb5cd66f91aa927b7c199cd2006ba6a2c3857b17e53e2d0727334ea2c\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/bridge/OVM_L1CrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\nimport { Lib_AddressManager } from \\\"../../libraries/resolver/Lib_AddressManager.sol\\\";\\nimport { Lib_SecureMerkleTrie } from \\\"../../libraries/trie/Lib_SecureMerkleTrie.sol\\\";\\nimport { Lib_ReentrancyGuard } from \\\"../../libraries/utils/Lib_ReentrancyGuard.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_L1CrossDomainMessenger } from \\\"../../iOVM/bridge/iOVM_L1CrossDomainMessenger.sol\\\";\\nimport { iOVM_CanonicalTransactionChain } from \\\"../../iOVM/chain/iOVM_CanonicalTransactionChain.sol\\\";\\nimport { iOVM_StateCommitmentChain } from \\\"../../iOVM/chain/iOVM_StateCommitmentChain.sol\\\";\\n\\n/* Contract Imports */\\nimport { OVM_BaseCrossDomainMessenger } from \\\"./OVM_BaseCrossDomainMessenger.sol\\\";\\n\\n/**\\n * @title OVM_L1CrossDomainMessenger\\n * @dev This contract lives on L1. It sends L1->L2 messages into L2, and relays L2->L1 messages from L2 to their target on L1.\\n */\\ncontract OVM_L1CrossDomainMessenger is iOVM_L1CrossDomainMessenger, OVM_BaseCrossDomainMessenger, Lib_AddressResolver {\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * Pass a default zero address to the address resolver. This will be updated when initialized.\\n */\\n constructor()\\n Lib_AddressResolver(address(0))\\n {}\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n */\\n function initialize(\\n address _libAddressManager\\n )\\n public\\n {\\n require(address(libAddressManager) == address(0), \\\"L1CrossDomainMessenger already intialized.\\\");\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n /**\\n * Modifier to enforce that, if configured, only the OVM_L2MessageRelayer contract may successfully call a method.\\n */\\n modifier onlyRelayer() {\\n address relayer = resolve(\\\"OVM_L2MessageRelayer\\\");\\n if (relayer != address(0)) {\\n require(\\n msg.sender == relayer,\\n \\\"Only OVM_L2MessageRelayer can relay L2-to-L1 messages.\\\"\\n );\\n }\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Relays a cross domain message to a contract.\\n * @inheritdoc iOVM_L1CrossDomainMessenger\\n */\\n function relayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _messageNonce,\\n L2MessageInclusionProof memory _proof\\n )\\n override\\n public\\n nonReentrant\\n onlyRelayer()\\n {\\n bytes memory xDomainCalldata = _getXDomainCalldata(\\n _target,\\n _sender,\\n _message,\\n _messageNonce\\n );\\n\\n require(\\n _verifyXDomainMessage(\\n xDomainCalldata,\\n _proof\\n ) == true,\\n \\\"Provided message could not be verified.\\\"\\n );\\n\\n bytes32 xDomainCalldataHash = keccak256(xDomainCalldata);\\n\\n require(\\n successfulMessages[xDomainCalldataHash] == false,\\n \\\"Provided message has already been received.\\\"\\n );\\n\\n xDomainMessageSender = _sender;\\n (bool success, ) = _target.call(_message);\\n\\n // Mark the message as received if the call was successful. Ensures that a message can be\\n // relayed multiple times in the case that the call reverted.\\n if (success == true) {\\n successfulMessages[xDomainCalldataHash] = true;\\n emit RelayedMessage(xDomainCalldataHash);\\n }\\n\\n // Store an identifier that can be used to prove that the given message was relayed by some\\n // user. Gives us an easy way to pay relayers for their work.\\n bytes32 relayId = keccak256(\\n abi.encodePacked(\\n xDomainCalldata,\\n msg.sender,\\n block.number\\n )\\n );\\n relayedMessages[relayId] = true;\\n }\\n\\n /**\\n * Replays a cross domain message to the target messenger.\\n * @inheritdoc iOVM_L1CrossDomainMessenger\\n */\\n function replayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _messageNonce,\\n uint32 _gasLimit\\n )\\n override\\n public\\n {\\n bytes memory xDomainCalldata = _getXDomainCalldata(\\n _target,\\n _sender,\\n _message,\\n _messageNonce\\n );\\n\\n require(\\n sentMessages[keccak256(xDomainCalldata)] == true,\\n \\\"Provided message has not already been sent.\\\"\\n );\\n\\n _sendXDomainMessage(xDomainCalldata, _gasLimit);\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Verifies that the given message is valid.\\n * @param _xDomainCalldata Calldata to verify.\\n * @param _proof Inclusion proof for the message.\\n * @return Whether or not the provided message is valid.\\n */\\n function _verifyXDomainMessage(\\n bytes memory _xDomainCalldata,\\n L2MessageInclusionProof memory _proof\\n )\\n internal\\n view\\n returns (\\n bool\\n )\\n {\\n return (\\n _verifyStateRootProof(_proof)\\n && _verifyStorageProof(_xDomainCalldata, _proof)\\n );\\n }\\n\\n /**\\n * Verifies that the state root within an inclusion proof is valid.\\n * @param _proof Message inclusion proof.\\n * @return Whether or not the provided proof is valid.\\n */\\n function _verifyStateRootProof(\\n L2MessageInclusionProof memory _proof\\n )\\n internal\\n view\\n returns (\\n bool\\n )\\n {\\n iOVM_StateCommitmentChain ovmStateCommitmentChain = iOVM_StateCommitmentChain(resolve(\\\"OVM_StateCommitmentChain\\\"));\\n\\n return (\\n ovmStateCommitmentChain.insideFraudProofWindow(_proof.stateRootBatchHeader) == false\\n && ovmStateCommitmentChain.verifyStateCommitment(\\n _proof.stateRoot,\\n _proof.stateRootBatchHeader,\\n _proof.stateRootProof\\n )\\n );\\n }\\n\\n /**\\n * Verifies that the storage proof within an inclusion proof is valid.\\n * @param _xDomainCalldata Encoded message calldata.\\n * @param _proof Message inclusion proof.\\n * @return Whether or not the provided proof is valid.\\n */\\n function _verifyStorageProof(\\n bytes memory _xDomainCalldata,\\n L2MessageInclusionProof memory _proof\\n )\\n internal\\n view\\n returns (\\n bool\\n )\\n {\\n bytes32 storageKey = keccak256(\\n abi.encodePacked(\\n keccak256(\\n abi.encodePacked(\\n _xDomainCalldata,\\n resolve(\\\"OVM_L2CrossDomainMessenger\\\")\\n )\\n ),\\n uint256(0)\\n )\\n );\\n\\n (\\n bool exists,\\n bytes memory encodedMessagePassingAccount\\n ) = Lib_SecureMerkleTrie.get(\\n abi.encodePacked(0x4200000000000000000000000000000000000000),\\n _proof.stateTrieWitness,\\n _proof.stateRoot\\n );\\n\\n require(\\n exists == true,\\n \\\"Message passing precompile has not been initialized or invalid proof provided.\\\"\\n );\\n\\n Lib_OVMCodec.EVMAccount memory account = Lib_OVMCodec.decodeEVMAccount(\\n encodedMessagePassingAccount\\n );\\n\\n return Lib_SecureMerkleTrie.verifyInclusionProof(\\n abi.encodePacked(storageKey),\\n abi.encodePacked(uint8(1)),\\n _proof.storageTrieWitness,\\n account.storageRoot\\n );\\n }\\n\\n /**\\n * Sends a cross domain message.\\n * @param _message Message to send.\\n * @param _gasLimit OVM gas limit for the message.\\n */\\n function _sendXDomainMessage(\\n bytes memory _message,\\n uint256 _gasLimit\\n )\\n override\\n internal\\n {\\n iOVM_CanonicalTransactionChain(resolve(\\\"OVM_CanonicalTransactionChain\\\")).enqueue(\\n resolve(\\\"OVM_L2CrossDomainMessenger\\\"),\\n _gasLimit,\\n _message\\n );\\n }\\n}\\n\",\"keccak256\":\"0x62ead80db43d27db3da44f44b9edc1ecfd041134f8422036ddfb499fc324cfe4\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/bridge/iOVM_BaseCrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// +build ovm\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/**\\n * @title iOVM_BaseCrossDomainMessenger\\n */\\ninterface iOVM_BaseCrossDomainMessenger {\\n\\n /**********\\n * Events *\\n **********/\\n event SentMessage(bytes message);\\n event RelayedMessage(bytes32 msgHash);\\n\\n /**********************\\n * Contract Variables *\\n **********************/\\n function xDomainMessageSender() external view returns (address);\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sends a cross domain message to the target messenger.\\n * @param _target Target contract address.\\n * @param _message Message to send to the target.\\n * @param _gasLimit Gas limit for the provided message.\\n */\\n function sendMessage(\\n address _target,\\n bytes calldata _message,\\n uint32 _gasLimit\\n ) external;\\n}\\n\",\"keccak256\":\"0x5da9f0957057d97fb45e514c6d247724e645d8f05c1c2b958cb360ecd9dbce50\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/bridge/iOVM_L1CrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_BaseCrossDomainMessenger } from \\\"./iOVM_BaseCrossDomainMessenger.sol\\\";\\n\\n/**\\n * @title iOVM_L1CrossDomainMessenger\\n */\\ninterface iOVM_L1CrossDomainMessenger is iOVM_BaseCrossDomainMessenger {\\n\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n struct L2MessageInclusionProof {\\n bytes32 stateRoot;\\n Lib_OVMCodec.ChainBatchHeader stateRootBatchHeader;\\n Lib_OVMCodec.ChainInclusionProof stateRootProof;\\n bytes stateTrieWitness;\\n bytes storageTrieWitness;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Relays a cross domain message to a contract.\\n * @param _target Target contract address.\\n * @param _sender Message sender address.\\n * @param _message Message to send to the target.\\n * @param _messageNonce Nonce for the provided message.\\n * @param _proof Inclusion proof for the given message.\\n */\\n function relayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _messageNonce,\\n L2MessageInclusionProof memory _proof\\n ) external;\\n\\n /**\\n * Replays a cross domain message to the target messenger.\\n * @param _target Target contract address.\\n * @param _sender Original sender address.\\n * @param _message Message to send to the target.\\n * @param _messageNonce Nonce for the provided message.\\n * @param _gasLimit Gas limit for the provided message.\\n */\\n function replayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _messageNonce,\\n uint32 _gasLimit\\n ) external;\\n}\\n\",\"keccak256\":\"0x51fb52c2a5ed1d3491a68431eb034aebe17f261c6dce7c7b4631a4f01b0b8bb8\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_CanonicalTransactionChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title iOVM_CanonicalTransactionChain\\n */\\ninterface iOVM_CanonicalTransactionChain {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event TransactionEnqueued(\\n address _l1TxOrigin,\\n address _target,\\n uint256 _gasLimit,\\n bytes _data,\\n uint256 _queueIndex,\\n uint256 _timestamp\\n );\\n\\n event QueueBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event SequencerBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event TransactionBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct BatchContext {\\n uint256 numSequencedTransactions;\\n uint256 numSubsequentQueueTransactions;\\n uint256 timestamp;\\n uint256 blockNumber;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements()\\n external\\n view\\n returns (\\n uint256 _totalElements\\n );\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches()\\n external\\n view\\n returns (\\n uint256 _totalBatches\\n );\\n\\n /**\\n * Returns the index of the next element to be enqueued.\\n * @return Index for the next queue element.\\n */\\n function getNextQueueIndex()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Get the number of queue elements which have not yet been included.\\n * @return Length of the queue.\\n */\\n function getNumPendingQueueElements()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Retrieves the length of the queue, including\\n * both pending and canonical transactions.\\n * @return Length of the queue.\\n */\\n function getQueueLength()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Gets the queue element at a particular index.\\n * @param _index Index of the queue element to access.\\n * @return _element Queue element at the given index.\\n */\\n function getQueueElement(\\n uint256 _index\\n )\\n external\\n view\\n returns (\\n Lib_OVMCodec.QueueElement memory _element\\n );\\n\\n /**\\n * Adds a transaction to the queue.\\n * @param _target Target contract to send the transaction to.\\n * @param _gasLimit Gas limit for the given transaction.\\n * @param _data Transaction data.\\n */\\n function enqueue(\\n address _target,\\n uint256 _gasLimit,\\n bytes memory _data\\n )\\n external;\\n\\n /**\\n * Appends a given number of queued transactions as a single batch.\\n * @param _numQueuedTransactions Number of transactions to append.\\n */\\n function appendQueueBatch(\\n uint256 _numQueuedTransactions\\n )\\n external;\\n\\n /**\\n * Allows the sequencer to append a batch of transactions.\\n * @dev This function uses a custom encoding scheme for efficiency reasons.\\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\\n * .param _contexts Array of batch contexts.\\n * .param _transactionDataFields Array of raw transaction data.\\n */\\n function appendSequencerBatch(\\n // uint40 _shouldStartAtElement,\\n // uint24 _totalElementsToAppend,\\n // BatchContext[] _contexts,\\n // bytes[] _transactionDataFields\\n )\\n external;\\n\\n /**\\n * Verifies whether a transaction is included in the chain.\\n * @param _transaction Transaction to verify.\\n * @param _txChainElement Transaction chain element corresponding to the transaction.\\n * @param _batchHeader Header of the batch the transaction was included in.\\n * @param _inclusionProof Inclusion proof for the provided transaction chain element.\\n * @return True if the transaction exists in the CTC, false if not.\\n */\\n function verifyTransaction(\\n Lib_OVMCodec.Transaction memory _transaction,\\n Lib_OVMCodec.TransactionChainElement memory _txChainElement,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _inclusionProof\\n )\\n external\\n view\\n returns (\\n bool\\n );\\n}\\n\",\"keccak256\":\"0x82a4e62286c8bc5e2d3de33f66d9b707cb9636e553dca54b5e95277bd794a934\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_StateCommitmentChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title iOVM_StateCommitmentChain\\n */\\ninterface iOVM_StateCommitmentChain {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event StateBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n event StateBatchDeleted(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot\\n );\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements()\\n external\\n view\\n returns (\\n uint256 _totalElements\\n );\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches()\\n external\\n view\\n returns (\\n uint256 _totalBatches\\n );\\n\\n /**\\n * Retrieves the timestamp of the last batch submitted by the sequencer.\\n * @return _lastSequencerTimestamp Last sequencer batch timestamp.\\n */\\n function getLastSequencerTimestamp()\\n external\\n view\\n returns (\\n uint256 _lastSequencerTimestamp\\n );\\n\\n /**\\n * Appends a batch of state roots to the chain.\\n * @param _batch Batch of state roots.\\n * @param _shouldStartAtElement Index of the element at which this batch should start.\\n */\\n function appendStateBatch(\\n bytes32[] calldata _batch,\\n uint256 _shouldStartAtElement\\n )\\n external;\\n\\n /**\\n * Deletes all state roots after (and including) a given batch.\\n * @param _batchHeader Header of the batch to start deleting from.\\n */\\n function deleteStateBatch(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n external;\\n\\n /**\\n * Verifies a batch inclusion proof.\\n * @param _element Hash of the element to verify a proof for.\\n * @param _batchHeader Header of the batch in which the element was included.\\n * @param _proof Merkle inclusion proof for the element.\\n */\\n function verifyStateCommitment(\\n bytes32 _element,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _proof\\n )\\n external\\n view\\n returns (\\n bool _verified\\n );\\n\\n /**\\n * Checks whether a given batch is still inside its fraud proof window.\\n * @param _batchHeader Header of the batch to check.\\n * @return _inside Whether or not the batch is inside the fraud proof window.\\n */\\n function insideFraudProofWindow(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n external\\n view\\n returns (\\n bool _inside\\n );\\n}\\n\",\"keccak256\":\"0x6646d6ff392b81aab52a7a277e91540819464751de0af5afd1962094b2e92448\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/codec/Lib_OVMCodec.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../utils/Lib_Bytes32Utils.sol\\\";\\nimport { Lib_SafeExecutionManagerWrapper } from \\\"../../libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\\\";\\n\\n/**\\n * @title Lib_OVMCodec\\n */\\nlibrary Lib_OVMCodec {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n bytes constant internal RLP_NULL_BYTES = hex'80';\\n bytes constant internal NULL_BYTES = bytes('');\\n\\n // Ring buffer IDs\\n bytes32 constant internal RING_BUFFER_SCC_BATCHES = keccak256(\\\"RING_BUFFER_SCC_BATCHES\\\");\\n bytes32 constant internal RING_BUFFER_CTC_BATCHES = keccak256(\\\"RING_BUFFER_CTC_BATCHES\\\");\\n bytes32 constant internal RING_BUFFER_CTC_QUEUE = keccak256(\\\"RING_BUFFER_CTC_QUEUE\\\");\\n\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum EOASignatureType {\\n EIP155_TRANSACTON,\\n ETH_SIGNED_MESSAGE\\n }\\n\\n enum QueueOrigin {\\n SEQUENCER_QUEUE,\\n L1TOL2_QUEUE\\n }\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Account {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n address ethAddress;\\n bool isFresh;\\n }\\n\\n struct EVMAccount {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n }\\n\\n struct ChainBatchHeader {\\n uint256 batchIndex;\\n bytes32 batchRoot;\\n uint256 batchSize;\\n uint256 prevTotalElements;\\n bytes extraData;\\n }\\n\\n struct ChainInclusionProof {\\n uint256 index;\\n bytes32[] siblings;\\n }\\n\\n struct Transaction {\\n uint256 timestamp;\\n uint256 blockNumber;\\n QueueOrigin l1QueueOrigin;\\n address l1TxOrigin;\\n address entrypoint;\\n uint256 gasLimit;\\n bytes data;\\n }\\n\\n struct TransactionChainElement {\\n bool isSequenced;\\n uint256 queueIndex; // QUEUED TX ONLY\\n uint256 timestamp; // SEQUENCER TX ONLY\\n uint256 blockNumber; // SEQUENCER TX ONLY\\n bytes txData; // SEQUENCER TX ONLY\\n }\\n\\n struct QueueElement {\\n bytes32 queueRoot;\\n uint40 timestamp;\\n uint40 blockNumber;\\n }\\n\\n struct EIP155Transaction {\\n uint256 nonce;\\n uint256 gasPrice;\\n uint256 gasLimit;\\n address to;\\n uint256 value;\\n bytes data;\\n uint256 chainId;\\n }\\n\\n\\n /*********************************************\\n * Internal Functions: Encoding and Decoding *\\n *********************************************/\\n\\n /**\\n * Decodes an EOA transaction (i.e., native Ethereum RLP encoding).\\n * @param _transaction Encoded EOA transaction.\\n * @return _decoded Transaction decoded into a struct.\\n */\\n function decodeEIP155Transaction(\\n bytes memory _transaction,\\n bool _isEthSignedMessage\\n )\\n internal\\n pure\\n returns (\\n EIP155Transaction memory _decoded\\n )\\n {\\n if (_isEthSignedMessage) {\\n (\\n uint256 _nonce,\\n uint256 _gasLimit,\\n uint256 _gasPrice,\\n uint256 _chainId,\\n address _to,\\n bytes memory _data\\n ) = abi.decode(\\n _transaction,\\n (uint256, uint256, uint256, uint256, address ,bytes)\\n );\\n return EIP155Transaction({\\n nonce: _nonce,\\n gasPrice: _gasPrice,\\n gasLimit: _gasLimit,\\n to: _to,\\n value: 0,\\n data: _data,\\n chainId: _chainId\\n });\\n } else {\\n Lib_RLPReader.RLPItem[] memory decoded = Lib_RLPReader.readList(_transaction);\\n\\n return EIP155Transaction({\\n nonce: Lib_RLPReader.readUint256(decoded[0]),\\n gasPrice: Lib_RLPReader.readUint256(decoded[1]),\\n gasLimit: Lib_RLPReader.readUint256(decoded[2]),\\n to: Lib_RLPReader.readAddress(decoded[3]),\\n value: Lib_RLPReader.readUint256(decoded[4]),\\n data: Lib_RLPReader.readBytes(decoded[5]),\\n chainId: Lib_RLPReader.readUint256(decoded[6])\\n });\\n }\\n }\\n\\n function decompressEIP155Transaction(\\n bytes memory _transaction\\n )\\n internal\\n returns (\\n EIP155Transaction memory _decompressed\\n )\\n {\\n return EIP155Transaction({\\n gasLimit: Lib_BytesUtils.toUint24(_transaction, 0),\\n gasPrice: uint256(Lib_BytesUtils.toUint24(_transaction, 3)) * 1000000,\\n nonce: Lib_BytesUtils.toUint24(_transaction, 6),\\n to: Lib_BytesUtils.toAddress(_transaction, 9),\\n data: Lib_BytesUtils.slice(_transaction, 29),\\n chainId: Lib_SafeExecutionManagerWrapper.safeCHAINID(),\\n value: 0\\n });\\n }\\n\\n /**\\n * Encodes an EOA transaction back into the original transaction.\\n * @param _transaction EIP155transaction to encode.\\n * @param _isEthSignedMessage Whether or not this was an eth signed message.\\n * @return Encoded transaction.\\n */\\n function encodeEIP155Transaction(\\n EIP155Transaction memory _transaction,\\n bool _isEthSignedMessage\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n if (_isEthSignedMessage) {\\n return abi.encode(\\n _transaction.nonce,\\n _transaction.gasLimit,\\n _transaction.gasPrice,\\n _transaction.chainId,\\n _transaction.to,\\n _transaction.data\\n );\\n } else {\\n bytes[] memory raw = new bytes[](9);\\n\\n raw[0] = Lib_RLPWriter.writeUint(_transaction.nonce);\\n raw[1] = Lib_RLPWriter.writeUint(_transaction.gasPrice);\\n raw[2] = Lib_RLPWriter.writeUint(_transaction.gasLimit);\\n if (_transaction.to == address(0)) {\\n raw[3] = Lib_RLPWriter.writeBytes('');\\n } else {\\n raw[3] = Lib_RLPWriter.writeAddress(_transaction.to);\\n }\\n raw[4] = Lib_RLPWriter.writeUint(0);\\n raw[5] = Lib_RLPWriter.writeBytes(_transaction.data);\\n raw[6] = Lib_RLPWriter.writeUint(_transaction.chainId);\\n raw[7] = Lib_RLPWriter.writeBytes(bytes(''));\\n raw[8] = Lib_RLPWriter.writeBytes(bytes(''));\\n\\n return Lib_RLPWriter.writeList(raw);\\n }\\n }\\n\\n /**\\n * Encodes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return _encoded Encoded transaction bytes.\\n */\\n function encodeTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes memory _encoded\\n )\\n {\\n return abi.encodePacked(\\n _transaction.timestamp,\\n _transaction.blockNumber,\\n _transaction.l1QueueOrigin,\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n );\\n }\\n\\n /**\\n * Hashes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return _hash Hashed transaction\\n */\\n function hashTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes32 _hash\\n )\\n {\\n return keccak256(encodeTransaction(_transaction));\\n }\\n\\n /**\\n * Converts an OVM account to an EVM account.\\n * @param _in OVM account to convert.\\n * @return _out Converted EVM account.\\n */\\n function toEVMAccount(\\n Account memory _in\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory _out\\n )\\n {\\n return EVMAccount({\\n nonce: _in.nonce,\\n balance: _in.balance,\\n storageRoot: _in.storageRoot,\\n codeHash: _in.codeHash\\n });\\n }\\n\\n /**\\n * @notice RLP-encodes an account state struct.\\n * @param _account Account state struct.\\n * @return _encoded RLP-encoded account state.\\n */\\n function encodeEVMAccount(\\n EVMAccount memory _account\\n )\\n internal\\n pure\\n returns (\\n bytes memory _encoded\\n )\\n {\\n bytes[] memory raw = new bytes[](4);\\n\\n // Unfortunately we can't create this array outright because\\n // Lib_RLPWriter.writeList will reject fixed-size arrays. Assigning\\n // index-by-index circumvents this issue.\\n raw[0] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.nonce)\\n )\\n );\\n raw[1] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.balance)\\n )\\n );\\n raw[2] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.storageRoot));\\n raw[3] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.codeHash));\\n\\n return Lib_RLPWriter.writeList(raw);\\n }\\n\\n /**\\n * @notice Decodes an RLP-encoded account state into a useful struct.\\n * @param _encoded RLP-encoded account state.\\n * @return _account Account state struct.\\n */\\n function decodeEVMAccount(\\n bytes memory _encoded\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory _account\\n )\\n {\\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\\n\\n return EVMAccount({\\n nonce: Lib_RLPReader.readUint256(accountState[0]),\\n balance: Lib_RLPReader.readUint256(accountState[1]),\\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\\n });\\n }\\n\\n /**\\n * Calculates a hash for a given batch header.\\n * @param _batchHeader Header to hash.\\n * @return _hash Hash of the header.\\n */\\n function hashBatchHeader(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n internal\\n pure\\n returns (\\n bytes32 _hash\\n )\\n {\\n return keccak256(\\n abi.encode(\\n _batchHeader.batchRoot,\\n _batchHeader.batchSize,\\n _batchHeader.prevTotalElements,\\n _batchHeader.extraData\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0x19d78734777b4998f1544e235cf3934f20c5055cd76c2bd60bf0f6dacdd72b3a\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// +build ovm\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Contract Imports */\\nimport { Ownable } from \\\"./Lib_Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n /*******************************************\\n * Contract Variables: Internal Accounting *\\n *******************************************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n public\\n onlyOwner\\n {\\n emit AddressSet(_name, _address);\\n addresses[_getNameHash(_name)] = _address;\\n }\\n\\n function getAddress(\\n string memory _name\\n )\\n public\\n view\\n returns (address)\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32 _hash\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xdf802e1cc6474df913626991e9fca3835c620a519f397afe04bf9c260e723257\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// +build ovm\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\ncontract Lib_AddressResolver {\\n\\n /*******************************************\\n * Contract Variables: Contract References *\\n *******************************************/\\n\\n Lib_AddressManager internal libAddressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(\\n address _libAddressManager\\n ) public {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function resolve(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address _contract\\n )\\n {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0xf3b9d78b309ddeec259ce3e0e1cfdef3ca40938e9a81971b28ce2b8ea327f533\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// +build ovm\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Ownable\\n * @dev Adapted from https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol\\n */\\nabstract contract Ownable {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n address public owner;\\n\\n\\n /**********\\n * Events *\\n **********/\\n\\n event OwnershipTransferred(\\n address indexed previousOwner,\\n address indexed newOwner\\n );\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n constructor() internal {\\n owner = msg.sender;\\n emit OwnershipTransferred(address(0), owner);\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n owner == msg.sender,\\n \\\"Ownable: caller is not the owner\\\"\\n );\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function renounceOwnership()\\n public\\n virtual\\n onlyOwner\\n {\\n emit OwnershipTransferred(owner, address(0));\\n owner = address(0);\\n }\\n\\n function transferOwnership(address _newOwner)\\n public\\n virtual\\n onlyOwner\\n {\\n require(\\n _newOwner != address(0),\\n \\\"Ownable: new owner cannot be the zero address\\\"\\n );\\n\\n emit OwnershipTransferred(owner, _newOwner);\\n owner = _newOwner;\\n }\\n}\\n\",\"keccak256\":\"0xe0409fbd236d16ca6be439d9d97dd36d0d9a0697ee0062d49588b9d29c248e47\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPReader.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.7.0;\\n\\n/**\\n * @title Lib_RLPReader\\n * @dev Adapted from \\\"RLPReader\\\" by Hamdi Allam (hamdi.allam97@gmail.com).\\n */\\nlibrary Lib_RLPReader {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 constant internal MAX_LIST_LENGTH = 32;\\n\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum RLPItemType {\\n DATA_ITEM,\\n LIST_ITEM\\n }\\n\\n \\n /***********\\n * Structs *\\n ***********/\\n\\n struct RLPItem {\\n uint256 length;\\n uint256 ptr;\\n }\\n \\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n \\n /**\\n * Converts bytes to a reference to memory position and length.\\n * @param _in Input bytes to convert.\\n * @return Output memory reference.\\n */\\n function toRLPItem(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem memory\\n )\\n {\\n uint256 ptr;\\n assembly {\\n ptr := add(_in, 32)\\n }\\n\\n return RLPItem({\\n length: _in.length,\\n ptr: ptr\\n });\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n (\\n uint256 listOffset,\\n ,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.LIST_ITEM,\\n \\\"Invalid RLP list value.\\\"\\n );\\n\\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\\n // writing to the length. Since we can't know the number of RLP items without looping over\\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\\n // simply set a reasonable maximum list length and decrease the size before we finish.\\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\\n\\n uint256 itemCount = 0;\\n uint256 offset = listOffset;\\n while (offset < _in.length) {\\n require(\\n itemCount < MAX_LIST_LENGTH,\\n \\\"Provided RLP list exceeds max list length.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n ) = _decodeLength(RLPItem({\\n length: _in.length - offset,\\n ptr: _in.ptr + offset\\n }));\\n\\n out[itemCount] = RLPItem({\\n length: itemLength + itemOffset,\\n ptr: _in.ptr + offset\\n });\\n\\n itemCount += 1;\\n offset += itemOffset + itemLength;\\n }\\n\\n // Decrease the array size to match the actual item count.\\n assembly {\\n mstore(out, itemCount)\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n return readList(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes value.\\\"\\n );\\n\\n return _copy(_in.ptr, itemOffset, itemLength);\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return readBytes(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return string(readBytes(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return readString(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n require(\\n _in.length <= 33,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr + itemOffset;\\n bytes32 out;\\n assembly {\\n out := mload(ptr)\\n\\n // Shift the bytes over to match the item size.\\n if lt(itemLength, 32) {\\n out := div(out, exp(256, sub(32, itemLength)))\\n }\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return readBytes32(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return uint256(readBytes32(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return readUint256(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n require(\\n _in.length == 1,\\n \\\"Invalid RLP boolean value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 out;\\n assembly {\\n out := byte(0, mload(ptr))\\n }\\n\\n return out != 0;\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return readBool(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n if (_in.length == 1) {\\n return address(0);\\n }\\n\\n require(\\n _in.length == 21,\\n \\\"Invalid RLP address value.\\\"\\n );\\n\\n return address(readUint256(_in));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return readAddress(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads the raw bytes of an RLP item.\\n * @param _in RLP item to read.\\n * @return Raw RLP bytes.\\n */\\n function readRawBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in);\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Decodes the length of an RLP item.\\n * @param _in RLP item to decode.\\n * @return Offset of the encoded data.\\n * @return Length of the encoded data.\\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\\n */\\n function _decodeLength(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n uint256,\\n uint256,\\n RLPItemType\\n )\\n {\\n require(\\n _in.length > 0,\\n \\\"RLP item cannot be null.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 prefix;\\n assembly {\\n prefix := byte(0, mload(ptr))\\n }\\n\\n if (prefix <= 0x7f) {\\n // Single byte.\\n\\n return (0, 1, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xb7) {\\n // Short string.\\n\\n uint256 strLen = prefix - 0x80;\\n \\n require(\\n _in.length > strLen,\\n \\\"Invalid RLP short string.\\\"\\n );\\n\\n return (1, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xbf) {\\n // Long string.\\n uint256 lenOfStrLen = prefix - 0xb7;\\n\\n require(\\n _in.length > lenOfStrLen,\\n \\\"Invalid RLP long string length.\\\"\\n );\\n\\n uint256 strLen;\\n assembly {\\n // Pick out the string length.\\n strLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfStrLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfStrLen + strLen,\\n \\\"Invalid RLP long string.\\\"\\n );\\n\\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xf7) {\\n // Short list.\\n uint256 listLen = prefix - 0xc0;\\n\\n require(\\n _in.length > listLen,\\n \\\"Invalid RLP short list.\\\"\\n );\\n\\n return (1, listLen, RLPItemType.LIST_ITEM);\\n } else {\\n // Long list.\\n uint256 lenOfListLen = prefix - 0xf7;\\n\\n require(\\n _in.length > lenOfListLen,\\n \\\"Invalid RLP long list length.\\\"\\n );\\n\\n uint256 listLen;\\n assembly {\\n // Pick out the list length.\\n listLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfListLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfListLen + listLen,\\n \\\"Invalid RLP long list.\\\"\\n );\\n\\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\\n }\\n }\\n\\n /**\\n * Copies the bytes from a memory location.\\n * @param _src Pointer to the location to read from.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Copied bytes.\\n */\\n function _copy(\\n uint256 _src,\\n uint256 _offset,\\n uint256 _length\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out = new bytes(_length);\\n if (out.length == 0) {\\n return out;\\n }\\n\\n uint256 src = _src + _offset;\\n uint256 dest;\\n assembly {\\n dest := add(out, 32)\\n }\\n\\n // Copy over as many complete words as we can.\\n for (uint256 i = 0; i < _length / 32; i++) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n\\n src += 32;\\n dest += 32;\\n }\\n\\n // Pick out the remaining bytes.\\n uint256 mask = 256 ** (32 - (_length % 32)) - 1;\\n assembly {\\n mstore(\\n dest,\\n or(\\n and(mload(src), not(mask)),\\n and(mload(dest), mask)\\n )\\n )\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Copies an RLP item into bytes.\\n * @param _in RLP item to copy.\\n * @return Copied bytes.\\n */\\n function _copy(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in.ptr, 0, _in.length);\\n }\\n}\\n\",\"keccak256\":\"0x8338f7b6e5f0ded8fc36d9088fd127ee53ae4040ca3f4838eb6123f642d38c62\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPWriter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.7.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\n\\n/**\\n * @title Lib_RLPWriter\\n * @author Bakaoh (with modifications)\\n */\\nlibrary Lib_RLPWriter {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * RLP encodes a byte string.\\n * @param _in The byte string to encode.\\n * @return _out The RLP encoded string in bytes.\\n */\\n function writeBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n bytes memory encoded;\\n\\n if (_in.length == 1 && uint8(_in[0]) < 128) {\\n encoded = _in;\\n } else {\\n encoded = Lib_BytesUtils.concat(_writeLength(_in.length, 128), _in);\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * RLP encodes a list of RLP encoded byte byte strings.\\n * @param _in The list of RLP encoded byte strings.\\n * @return _out The RLP encoded list of items in bytes.\\n */\\n function writeList(\\n bytes[] memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n bytes memory list = _flatten(_in);\\n return Lib_BytesUtils.concat(_writeLength(list.length, 192), list);\\n }\\n\\n /**\\n * RLP encodes a string.\\n * @param _in The string to encode.\\n * @return _out The RLP encoded string in bytes.\\n */\\n function writeString(\\n string memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(bytes(_in));\\n }\\n\\n /**\\n * RLP encodes an address.\\n * @param _in The address to encode.\\n * @return _out The RLP encoded address in bytes.\\n */\\n function writeAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a uint.\\n * @param _in The uint256 to encode.\\n * @return _out The RLP encoded uint256 in bytes.\\n */\\n function writeUint(\\n uint256 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(_toBinary(_in));\\n }\\n\\n /**\\n * RLP encodes a bool.\\n * @param _in The bool to encode.\\n * @return _out The RLP encoded bool in bytes.\\n */\\n function writeBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n bytes memory encoded = new bytes(1);\\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\\n return encoded;\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\\n * @param _len The length of the string or the payload.\\n * @param _offset 128 if item is string, 192 if item is list.\\n * @return _encoded RLP encoded bytes.\\n */\\n function _writeLength(\\n uint256 _len,\\n uint256 _offset\\n )\\n private\\n pure\\n returns (\\n bytes memory _encoded\\n )\\n {\\n bytes memory encoded;\\n\\n if (_len < 56) {\\n encoded = new bytes(1);\\n encoded[0] = byte(uint8(_len) + uint8(_offset));\\n } else {\\n uint256 lenLen;\\n uint256 i = 1;\\n while (_len / i != 0) {\\n lenLen++;\\n i *= 256;\\n }\\n\\n encoded = new bytes(lenLen + 1);\\n encoded[0] = byte(uint8(lenLen) + uint8(_offset) + 55);\\n for(i = 1; i <= lenLen; i++) {\\n encoded[i] = byte(uint8((_len / (256**(lenLen-i))) % 256));\\n }\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * Encode integer in big endian binary form with no leading zeroes.\\n * @notice TODO: This should be optimized with assembly to save gas costs.\\n * @param _x The integer to encode.\\n * @return _binary RLP encoded bytes.\\n */\\n function _toBinary(\\n uint256 _x\\n )\\n private\\n pure\\n returns (\\n bytes memory _binary\\n )\\n {\\n bytes memory b = abi.encodePacked(_x);\\n\\n uint256 i = 0;\\n for (; i < 32; i++) {\\n if (b[i] != 0) {\\n break;\\n }\\n }\\n\\n bytes memory res = new bytes(32 - i);\\n for (uint256 j = 0; j < res.length; j++) {\\n res[j] = b[i++];\\n }\\n\\n return res;\\n }\\n\\n /**\\n * Copies a piece of memory to another location.\\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\\n * @param _dest Destination location.\\n * @param _src Source location.\\n * @param _len Length of memory to copy.\\n */\\n function _memcpy(\\n uint256 _dest,\\n uint256 _src,\\n uint256 _len\\n )\\n private\\n pure\\n {\\n uint256 dest = _dest;\\n uint256 src = _src;\\n uint256 len = _len;\\n\\n for(; len >= 32; len -= 32) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n dest += 32;\\n src += 32;\\n }\\n\\n uint256 mask = 256 ** (32 - len) - 1;\\n assembly {\\n let srcpart := and(mload(src), not(mask))\\n let destpart := and(mload(dest), mask)\\n mstore(dest, or(destpart, srcpart))\\n }\\n }\\n\\n /**\\n * Flattens a list of byte strings into one byte string.\\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\\n * @param _list List of byte strings to flatten.\\n * @return _flattened The flattened byte string.\\n */\\n function _flatten(\\n bytes[] memory _list\\n )\\n private\\n pure\\n returns (\\n bytes memory _flattened\\n )\\n {\\n if (_list.length == 0) {\\n return new bytes(0);\\n }\\n\\n uint256 len;\\n uint256 i = 0;\\n for (; i < _list.length; i++) {\\n len += _list[i].length;\\n }\\n\\n bytes memory flattened = new bytes(len);\\n uint256 flattenedPtr;\\n assembly { flattenedPtr := add(flattened, 0x20) }\\n\\n for(i = 0; i < _list.length; i++) {\\n bytes memory item = _list[i];\\n\\n uint256 listPtr;\\n assembly { listPtr := add(item, 0x20)}\\n\\n _memcpy(flattenedPtr, listPtr, item.length);\\n flattenedPtr += _list[i].length;\\n }\\n\\n return flattened;\\n }\\n}\",\"keccak256\":\"0x6d1aaef567f8a91bb965b95a95637f433a1f0ac4cf0bc1e209cdb1dd5b0f204b\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/trie/Lib_MerkleTrie.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.7.0;\\n\\n/* Library Imports */\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\n\\n/**\\n * @title Lib_MerkleTrie\\n */\\nlibrary Lib_MerkleTrie {\\n\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n enum NodeType {\\n BranchNode,\\n ExtensionNode,\\n LeafNode\\n }\\n\\n struct TrieNode {\\n bytes encoded;\\n Lib_RLPReader.RLPItem[] decoded;\\n }\\n\\n\\n /**********************\\n * Contract Constants *\\n **********************/\\n\\n // TREE_RADIX determines the number of elements per branch node.\\n uint256 constant TREE_RADIX = 16;\\n // Branch nodes have TREE_RADIX elements plus an additional `value` slot.\\n uint256 constant BRANCH_NODE_LENGTH = TREE_RADIX + 1;\\n // Leaf nodes and extension nodes always have two elements, a `path` and a `value`.\\n uint256 constant LEAF_OR_EXTENSION_NODE_LENGTH = 2;\\n\\n // Prefixes are prepended to the `path` within a leaf or extension node and\\n // allow us to differentiate between the two node types. `ODD` or `EVEN` is\\n // determined by the number of nibbles within the unprefixed `path`. If the\\n // number of nibbles if even, we need to insert an extra padding nibble so\\n // the resulting prefixed `path` has an even number of nibbles.\\n uint8 constant PREFIX_EXTENSION_EVEN = 0;\\n uint8 constant PREFIX_EXTENSION_ODD = 1;\\n uint8 constant PREFIX_LEAF_EVEN = 2;\\n uint8 constant PREFIX_LEAF_ODD = 3;\\n\\n // Just a utility constant. RLP represents `NULL` as 0x80.\\n bytes1 constant RLP_NULL = bytes1(0x80);\\n bytes constant RLP_NULL_BYTES = hex'80';\\n bytes32 constant internal KECCAK256_RLP_NULL_BYTES = keccak256(RLP_NULL_BYTES);\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * @notice Verifies a proof that a given key/value pair is present in the\\n * Merkle trie.\\n * @param _key Key of the node to search for, as a hex string.\\n * @param _value Value of the node to search for, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the desired node. Unlike\\n * traditional Merkle trees, this proof is executed top-down and consists\\n * of a list of RLP-encoded nodes that make a path down to the target node.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _verified `true` if the k/v pair exists in the trie, `false` otherwise.\\n */\\n function verifyInclusionProof(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bool _verified\\n )\\n {\\n (\\n bool exists,\\n bytes memory value\\n ) = get(_key, _proof, _root);\\n\\n return (\\n exists && Lib_BytesUtils.equal(_value, value)\\n );\\n }\\n\\n /**\\n * @notice Verifies a proof that a given key is *not* present in\\n * the Merkle trie.\\n * @param _key Key of the node to search for, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\\n * target node.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _verified `true` if the key is absent in the trie, `false` otherwise.\\n */\\n function verifyExclusionProof(\\n bytes memory _key,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bool _verified\\n )\\n {\\n (\\n bool exists,\\n ) = get(_key, _proof, _root);\\n\\n return exists == false;\\n }\\n\\n /**\\n * @notice Updates a Merkle trie and returns a new root hash.\\n * @param _key Key of the node to update, as a hex string.\\n * @param _value Value of the node to update, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\\n * target node. If the key exists, we can simply update the value.\\n * Otherwise, we need to modify the trie to handle the new k/v pair.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _updatedRoot Root hash of the newly constructed trie.\\n */\\n function update(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bytes32 _updatedRoot\\n )\\n {\\n // Special case when inserting the very first node.\\n if (_root == KECCAK256_RLP_NULL_BYTES) {\\n return getSingleNodeRootHash(_key, _value);\\n }\\n\\n TrieNode[] memory proof = _parseProof(_proof);\\n (uint256 pathLength, bytes memory keyRemainder, ) = _walkNodePath(proof, _key, _root);\\n TrieNode[] memory newPath = _getNewPath(proof, pathLength, keyRemainder, _value);\\n\\n return _getUpdatedTrieRoot(newPath, _key);\\n }\\n\\n /**\\n * @notice Retrieves the value associated with a given key.\\n * @param _key Key to search for, as hex bytes.\\n * @param _proof Merkle trie inclusion proof for the key.\\n * @param _root Known root of the Merkle trie.\\n * @return _exists Whether or not the key exists.\\n * @return _value Value of the key if it exists.\\n */\\n function get(\\n bytes memory _key,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bool _exists,\\n bytes memory _value\\n )\\n {\\n TrieNode[] memory proof = _parseProof(_proof);\\n (uint256 pathLength, bytes memory keyRemainder, bool isFinalNode) = _walkNodePath(proof, _key, _root);\\n\\n bool exists = keyRemainder.length == 0;\\n\\n require(\\n exists || isFinalNode,\\n \\\"Provided proof is invalid.\\\"\\n );\\n\\n bytes memory value = exists ? _getNodeValue(proof[pathLength - 1]) : bytes('');\\n\\n return (\\n exists,\\n value\\n );\\n }\\n\\n /**\\n * Computes the root hash for a trie with a single node.\\n * @param _key Key for the single node.\\n * @param _value Value for the single node.\\n * @return _updatedRoot Hash of the trie.\\n */\\n function getSingleNodeRootHash(\\n bytes memory _key,\\n bytes memory _value\\n )\\n internal\\n pure\\n returns (\\n bytes32 _updatedRoot\\n )\\n {\\n return keccak256(_makeLeafNode(\\n Lib_BytesUtils.toNibbles(_key),\\n _value\\n ).encoded);\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * @notice Walks through a proof using a provided key.\\n * @param _proof Inclusion proof to walk through.\\n * @param _key Key to use for the walk.\\n * @param _root Known root of the trie.\\n * @return _pathLength Length of the final path\\n * @return _keyRemainder Portion of the key remaining after the walk.\\n * @return _isFinalNode Whether or not we've hit a dead end.\\n */\\n function _walkNodePath(\\n TrieNode[] memory _proof,\\n bytes memory _key,\\n bytes32 _root\\n )\\n private\\n pure\\n returns (\\n uint256 _pathLength,\\n bytes memory _keyRemainder,\\n bool _isFinalNode\\n )\\n {\\n uint256 pathLength = 0;\\n bytes memory key = Lib_BytesUtils.toNibbles(_key);\\n\\n bytes32 currentNodeID = _root;\\n uint256 currentKeyIndex = 0;\\n uint256 currentKeyIncrement = 0;\\n TrieNode memory currentNode;\\n\\n // Proof is top-down, so we start at the first element (root).\\n for (uint256 i = 0; i < _proof.length; i++) {\\n currentNode = _proof[i];\\n currentKeyIndex += currentKeyIncrement;\\n\\n // Keep track of the proof elements we actually need.\\n // It's expensive to resize arrays, so this simply reduces gas costs.\\n pathLength += 1;\\n\\n if (currentKeyIndex == 0) {\\n // First proof element is always the root node.\\n require(\\n keccak256(currentNode.encoded) == currentNodeID,\\n \\\"Invalid root hash\\\"\\n );\\n } else if (currentNode.encoded.length >= 32) {\\n // Nodes 32 bytes or larger are hashed inside branch nodes.\\n require(\\n keccak256(currentNode.encoded) == currentNodeID,\\n \\\"Invalid large internal hash\\\"\\n );\\n } else {\\n // Nodes smaller than 31 bytes aren't hashed.\\n require(\\n Lib_BytesUtils.toBytes32(currentNode.encoded) == currentNodeID,\\n \\\"Invalid internal node hash\\\"\\n );\\n }\\n\\n if (currentNode.decoded.length == BRANCH_NODE_LENGTH) {\\n if (currentKeyIndex == key.length) {\\n // We've hit the end of the key, meaning the value should be within this branch node.\\n break;\\n } else {\\n // We're not at the end of the key yet.\\n // Figure out what the next node ID should be and continue.\\n uint8 branchKey = uint8(key[currentKeyIndex]);\\n Lib_RLPReader.RLPItem memory nextNode = currentNode.decoded[branchKey];\\n currentNodeID = _getNodeID(nextNode);\\n currentKeyIncrement = 1;\\n continue;\\n }\\n } else if (currentNode.decoded.length == LEAF_OR_EXTENSION_NODE_LENGTH) {\\n bytes memory path = _getNodePath(currentNode);\\n uint8 prefix = uint8(path[0]);\\n uint8 offset = 2 - prefix % 2;\\n bytes memory pathRemainder = Lib_BytesUtils.slice(path, offset);\\n bytes memory keyRemainder = Lib_BytesUtils.slice(key, currentKeyIndex);\\n uint256 sharedNibbleLength = _getSharedNibbleLength(pathRemainder, keyRemainder);\\n\\n if (prefix == PREFIX_LEAF_EVEN || prefix == PREFIX_LEAF_ODD) {\\n if (\\n pathRemainder.length == sharedNibbleLength &&\\n keyRemainder.length == sharedNibbleLength\\n ) {\\n // The key within this leaf matches our key exactly.\\n // Increment the key index to reflect that we have no remainder.\\n currentKeyIndex += sharedNibbleLength;\\n }\\n\\n // We've hit a leaf node, so our next node should be NULL.\\n currentNodeID = bytes32(RLP_NULL);\\n break;\\n } else if (prefix == PREFIX_EXTENSION_EVEN || prefix == PREFIX_EXTENSION_ODD) {\\n if (sharedNibbleLength == 0) {\\n // Our extension node doesn't share any part of our key.\\n // We've hit the end of this path, updates will need to modify this extension.\\n currentNodeID = bytes32(RLP_NULL);\\n break;\\n } else {\\n // Our extension shares some nibbles.\\n // Carry on to the next node.\\n currentNodeID = _getNodeID(currentNode.decoded[1]);\\n currentKeyIncrement = sharedNibbleLength;\\n continue;\\n }\\n } else {\\n revert(\\\"Received a node with an unknown prefix\\\");\\n }\\n } else {\\n revert(\\\"Received an unparseable node.\\\");\\n }\\n }\\n\\n // If our node ID is NULL, then we're at a dead end.\\n bool isFinalNode = currentNodeID == bytes32(RLP_NULL);\\n return (pathLength, Lib_BytesUtils.slice(key, currentKeyIndex), isFinalNode);\\n }\\n\\n /**\\n * @notice Creates new nodes to support a k/v pair insertion into a given\\n * Merkle trie path.\\n * @param _path Path to the node nearest the k/v pair.\\n * @param _pathLength Length of the path. Necessary because the provided\\n * path may include additional nodes (e.g., it comes directly from a proof)\\n * and we can't resize in-memory arrays without costly duplication.\\n * @param _keyRemainder Portion of the initial key that must be inserted\\n * into the trie.\\n * @param _value Value to insert at the given key.\\n * @return _newPath A new path with the inserted k/v pair and extra supporting nodes.\\n */\\n function _getNewPath(\\n TrieNode[] memory _path,\\n uint256 _pathLength,\\n bytes memory _keyRemainder,\\n bytes memory _value\\n )\\n private\\n pure\\n returns (\\n TrieNode[] memory _newPath\\n )\\n {\\n bytes memory keyRemainder = _keyRemainder;\\n\\n // Most of our logic depends on the status of the last node in the path.\\n TrieNode memory lastNode = _path[_pathLength - 1];\\n NodeType lastNodeType = _getNodeType(lastNode);\\n\\n // Create an array for newly created nodes.\\n // We need up to three new nodes, depending on the contents of the last node.\\n // Since array resizing is expensive, we'll keep track of the size manually.\\n // We're using an explicit `totalNewNodes += 1` after insertions for clarity.\\n TrieNode[] memory newNodes = new TrieNode[](3);\\n uint256 totalNewNodes = 0;\\n\\n if (keyRemainder.length == 0 && lastNodeType == NodeType.LeafNode) {\\n // We've found a leaf node with the given key.\\n // Simply need to update the value of the node to match.\\n newNodes[totalNewNodes] = _makeLeafNode(_getNodeKey(lastNode), _value);\\n totalNewNodes += 1;\\n } else if (lastNodeType == NodeType.BranchNode) {\\n if (keyRemainder.length == 0) {\\n // We've found a branch node with the given key.\\n // Simply need to update the value of the node to match.\\n newNodes[totalNewNodes] = _editBranchValue(lastNode, _value);\\n totalNewNodes += 1;\\n } else {\\n // We've found a branch node, but it doesn't contain our key.\\n // Reinsert the old branch for now.\\n newNodes[totalNewNodes] = lastNode;\\n totalNewNodes += 1;\\n // Create a new leaf node, slicing our remainder since the first byte points\\n // to our branch node.\\n newNodes[totalNewNodes] = _makeLeafNode(Lib_BytesUtils.slice(keyRemainder, 1), _value);\\n totalNewNodes += 1;\\n }\\n } else {\\n // Our last node is either an extension node or a leaf node with a different key.\\n bytes memory lastNodeKey = _getNodeKey(lastNode);\\n uint256 sharedNibbleLength = _getSharedNibbleLength(lastNodeKey, keyRemainder);\\n\\n if (sharedNibbleLength != 0) {\\n // We've got some shared nibbles between the last node and our key remainder.\\n // We'll need to insert an extension node that covers these shared nibbles.\\n bytes memory nextNodeKey = Lib_BytesUtils.slice(lastNodeKey, 0, sharedNibbleLength);\\n newNodes[totalNewNodes] = _makeExtensionNode(nextNodeKey, _getNodeHash(_value));\\n totalNewNodes += 1;\\n\\n // Cut down the keys since we've just covered these shared nibbles.\\n lastNodeKey = Lib_BytesUtils.slice(lastNodeKey, sharedNibbleLength);\\n keyRemainder = Lib_BytesUtils.slice(keyRemainder, sharedNibbleLength);\\n }\\n\\n // Create an empty branch to fill in.\\n TrieNode memory newBranch = _makeEmptyBranchNode();\\n\\n if (lastNodeKey.length == 0) {\\n // Key remainder was larger than the key for our last node.\\n // The value within our last node is therefore going to be shifted into\\n // a branch value slot.\\n newBranch = _editBranchValue(newBranch, _getNodeValue(lastNode));\\n } else {\\n // Last node key was larger than the key remainder.\\n // We're going to modify some index of our branch.\\n uint8 branchKey = uint8(lastNodeKey[0]);\\n // Move on to the next nibble.\\n lastNodeKey = Lib_BytesUtils.slice(lastNodeKey, 1);\\n\\n if (lastNodeType == NodeType.LeafNode) {\\n // We're dealing with a leaf node.\\n // We'll modify the key and insert the old leaf node into the branch index.\\n TrieNode memory modifiedLastNode = _makeLeafNode(lastNodeKey, _getNodeValue(lastNode));\\n newBranch = _editBranchIndex(newBranch, branchKey, _getNodeHash(modifiedLastNode.encoded));\\n } else if (lastNodeKey.length != 0) {\\n // We're dealing with a shrinking extension node.\\n // We need to modify the node to decrease the size of the key.\\n TrieNode memory modifiedLastNode = _makeExtensionNode(lastNodeKey, _getNodeValue(lastNode));\\n newBranch = _editBranchIndex(newBranch, branchKey, _getNodeHash(modifiedLastNode.encoded));\\n } else {\\n // We're dealing with an unnecessary extension node.\\n // We're going to delete the node entirely.\\n // Simply insert its current value into the branch index.\\n newBranch = _editBranchIndex(newBranch, branchKey, _getNodeValue(lastNode));\\n }\\n }\\n\\n if (keyRemainder.length == 0) {\\n // We've got nothing left in the key remainder.\\n // Simply insert the value into the branch value slot.\\n newBranch = _editBranchValue(newBranch, _value);\\n // Push the branch into the list of new nodes.\\n newNodes[totalNewNodes] = newBranch;\\n totalNewNodes += 1;\\n } else {\\n // We've got some key remainder to work with.\\n // We'll be inserting a leaf node into the trie.\\n // First, move on to the next nibble.\\n keyRemainder = Lib_BytesUtils.slice(keyRemainder, 1);\\n // Push the branch into the list of new nodes.\\n newNodes[totalNewNodes] = newBranch;\\n totalNewNodes += 1;\\n // Push a new leaf node for our k/v pair.\\n newNodes[totalNewNodes] = _makeLeafNode(keyRemainder, _value);\\n totalNewNodes += 1;\\n }\\n }\\n\\n // Finally, join the old path with our newly created nodes.\\n // Since we're overwriting the last node in the path, we use `_pathLength - 1`.\\n return _joinNodeArrays(_path, _pathLength - 1, newNodes, totalNewNodes);\\n }\\n\\n /**\\n * @notice Computes the trie root from a given path.\\n * @param _nodes Path to some k/v pair.\\n * @param _key Key for the k/v pair.\\n * @return _updatedRoot Root hash for the updated trie.\\n */\\n function _getUpdatedTrieRoot(\\n TrieNode[] memory _nodes,\\n bytes memory _key\\n )\\n private\\n pure\\n returns (\\n bytes32 _updatedRoot\\n )\\n {\\n bytes memory key = Lib_BytesUtils.toNibbles(_key);\\n\\n // Some variables to keep track of during iteration.\\n TrieNode memory currentNode;\\n NodeType currentNodeType;\\n bytes memory previousNodeHash;\\n\\n // Run through the path backwards to rebuild our root hash.\\n for (uint256 i = _nodes.length; i > 0; i--) {\\n // Pick out the current node.\\n currentNode = _nodes[i - 1];\\n currentNodeType = _getNodeType(currentNode);\\n\\n if (currentNodeType == NodeType.LeafNode) {\\n // Leaf nodes are already correctly encoded.\\n // Shift the key over to account for the nodes key.\\n bytes memory nodeKey = _getNodeKey(currentNode);\\n key = Lib_BytesUtils.slice(key, 0, key.length - nodeKey.length);\\n } else if (currentNodeType == NodeType.ExtensionNode) {\\n // Shift the key over to account for the nodes key.\\n bytes memory nodeKey = _getNodeKey(currentNode);\\n key = Lib_BytesUtils.slice(key, 0, key.length - nodeKey.length);\\n\\n // If this node is the last element in the path, it'll be correctly encoded\\n // and we can skip this part.\\n if (previousNodeHash.length > 0) {\\n // Re-encode the node based on the previous node.\\n currentNode = _makeExtensionNode(nodeKey, previousNodeHash);\\n }\\n } else if (currentNodeType == NodeType.BranchNode) {\\n // If this node is the last element in the path, it'll be correctly encoded\\n // and we can skip this part.\\n if (previousNodeHash.length > 0) {\\n // Re-encode the node based on the previous node.\\n uint8 branchKey = uint8(key[key.length - 1]);\\n key = Lib_BytesUtils.slice(key, 0, key.length - 1);\\n currentNode = _editBranchIndex(currentNode, branchKey, previousNodeHash);\\n }\\n }\\n\\n // Compute the node hash for the next iteration.\\n previousNodeHash = _getNodeHash(currentNode.encoded);\\n }\\n\\n // Current node should be the root at this point.\\n // Simply return the hash of its encoding.\\n return keccak256(currentNode.encoded);\\n }\\n\\n /**\\n * @notice Parses an RLP-encoded proof into something more useful.\\n * @param _proof RLP-encoded proof to parse.\\n * @return _parsed Proof parsed into easily accessible structs.\\n */\\n function _parseProof(\\n bytes memory _proof\\n )\\n private\\n pure\\n returns (\\n TrieNode[] memory _parsed\\n )\\n {\\n Lib_RLPReader.RLPItem[] memory nodes = Lib_RLPReader.readList(_proof);\\n TrieNode[] memory proof = new TrieNode[](nodes.length);\\n\\n for (uint256 i = 0; i < nodes.length; i++) {\\n bytes memory encoded = Lib_RLPReader.readBytes(nodes[i]);\\n proof[i] = TrieNode({\\n encoded: encoded,\\n decoded: Lib_RLPReader.readList(encoded)\\n });\\n }\\n\\n return proof;\\n }\\n\\n /**\\n * @notice Picks out the ID for a node. Node ID is referred to as the\\n * \\\"hash\\\" within the specification, but nodes < 32 bytes are not actually\\n * hashed.\\n * @param _node Node to pull an ID for.\\n * @return _nodeID ID for the node, depending on the size of its contents.\\n */\\n function _getNodeID(\\n Lib_RLPReader.RLPItem memory _node\\n )\\n private\\n pure\\n returns (\\n bytes32 _nodeID\\n )\\n {\\n bytes memory nodeID;\\n\\n if (_node.length < 32) {\\n // Nodes smaller than 32 bytes are RLP encoded.\\n nodeID = Lib_RLPReader.readRawBytes(_node);\\n } else {\\n // Nodes 32 bytes or larger are hashed.\\n nodeID = Lib_RLPReader.readBytes(_node);\\n }\\n\\n return Lib_BytesUtils.toBytes32(nodeID);\\n }\\n\\n /**\\n * @notice Gets the path for a leaf or extension node.\\n * @param _node Node to get a path for.\\n * @return _path Node path, converted to an array of nibbles.\\n */\\n function _getNodePath(\\n TrieNode memory _node\\n )\\n private\\n pure\\n returns (\\n bytes memory _path\\n )\\n {\\n return Lib_BytesUtils.toNibbles(Lib_RLPReader.readBytes(_node.decoded[0]));\\n }\\n\\n /**\\n * @notice Gets the key for a leaf or extension node. Keys are essentially\\n * just paths without any prefix.\\n * @param _node Node to get a key for.\\n * @return _key Node key, converted to an array of nibbles.\\n */\\n function _getNodeKey(\\n TrieNode memory _node\\n )\\n private\\n pure\\n returns (\\n bytes memory _key\\n )\\n {\\n return _removeHexPrefix(_getNodePath(_node));\\n }\\n\\n /**\\n * @notice Gets the path for a node.\\n * @param _node Node to get a value for.\\n * @return _value Node value, as hex bytes.\\n */\\n function _getNodeValue(\\n TrieNode memory _node\\n )\\n private\\n pure\\n returns (\\n bytes memory _value\\n )\\n {\\n return Lib_RLPReader.readBytes(_node.decoded[_node.decoded.length - 1]);\\n }\\n\\n /**\\n * @notice Computes the node hash for an encoded node. Nodes < 32 bytes\\n * are not hashed, all others are keccak256 hashed.\\n * @param _encoded Encoded node to hash.\\n * @return _hash Hash of the encoded node. Simply the input if < 32 bytes.\\n */\\n function _getNodeHash(\\n bytes memory _encoded\\n )\\n private\\n pure\\n returns (\\n bytes memory _hash\\n )\\n {\\n if (_encoded.length < 32) {\\n return _encoded;\\n } else {\\n return abi.encodePacked(keccak256(_encoded));\\n }\\n }\\n\\n /**\\n * @notice Determines the type for a given node.\\n * @param _node Node to determine a type for.\\n * @return _type Type of the node; BranchNode/ExtensionNode/LeafNode.\\n */\\n function _getNodeType(\\n TrieNode memory _node\\n )\\n private\\n pure\\n returns (\\n NodeType _type\\n )\\n {\\n if (_node.decoded.length == BRANCH_NODE_LENGTH) {\\n return NodeType.BranchNode;\\n } else if (_node.decoded.length == LEAF_OR_EXTENSION_NODE_LENGTH) {\\n bytes memory path = _getNodePath(_node);\\n uint8 prefix = uint8(path[0]);\\n\\n if (prefix == PREFIX_LEAF_EVEN || prefix == PREFIX_LEAF_ODD) {\\n return NodeType.LeafNode;\\n } else if (prefix == PREFIX_EXTENSION_EVEN || prefix == PREFIX_EXTENSION_ODD) {\\n return NodeType.ExtensionNode;\\n }\\n }\\n\\n revert(\\\"Invalid node type\\\");\\n }\\n\\n /**\\n * @notice Utility; determines the number of nibbles shared between two\\n * nibble arrays.\\n * @param _a First nibble array.\\n * @param _b Second nibble array.\\n * @return _shared Number of shared nibbles.\\n */\\n function _getSharedNibbleLength(\\n bytes memory _a,\\n bytes memory _b\\n )\\n private\\n pure\\n returns (\\n uint256 _shared\\n )\\n {\\n uint256 i = 0;\\n while (_a.length > i && _b.length > i && _a[i] == _b[i]) {\\n i++;\\n }\\n return i;\\n }\\n\\n /**\\n * @notice Utility; converts an RLP-encoded node into our nice struct.\\n * @param _raw RLP-encoded node to convert.\\n * @return _node Node as a TrieNode struct.\\n */\\n function _makeNode(\\n bytes[] memory _raw\\n )\\n private\\n pure\\n returns (\\n TrieNode memory _node\\n )\\n {\\n bytes memory encoded = Lib_RLPWriter.writeList(_raw);\\n\\n return TrieNode({\\n encoded: encoded,\\n decoded: Lib_RLPReader.readList(encoded)\\n });\\n }\\n\\n /**\\n * @notice Utility; converts an RLP-decoded node into our nice struct.\\n * @param _items RLP-decoded node to convert.\\n * @return _node Node as a TrieNode struct.\\n */\\n function _makeNode(\\n Lib_RLPReader.RLPItem[] memory _items\\n )\\n private\\n pure\\n returns (\\n TrieNode memory _node\\n )\\n {\\n bytes[] memory raw = new bytes[](_items.length);\\n for (uint256 i = 0; i < _items.length; i++) {\\n raw[i] = Lib_RLPReader.readRawBytes(_items[i]);\\n }\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Creates a new extension node.\\n * @param _key Key for the extension node, unprefixed.\\n * @param _value Value for the extension node.\\n * @return _node New extension node with the given k/v pair.\\n */\\n function _makeExtensionNode(\\n bytes memory _key,\\n bytes memory _value\\n )\\n private\\n pure\\n returns (\\n TrieNode memory _node\\n )\\n {\\n bytes[] memory raw = new bytes[](2);\\n bytes memory key = _addHexPrefix(_key, false);\\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\\n raw[1] = Lib_RLPWriter.writeBytes(_value);\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Creates a new leaf node.\\n * @dev This function is essentially identical to `_makeExtensionNode`.\\n * Although we could route both to a single method with a flag, it's\\n * more gas efficient to keep them separate and duplicate the logic.\\n * @param _key Key for the leaf node, unprefixed.\\n * @param _value Value for the leaf node.\\n * @return _node New leaf node with the given k/v pair.\\n */\\n function _makeLeafNode(\\n bytes memory _key,\\n bytes memory _value\\n )\\n private\\n pure\\n returns (\\n TrieNode memory _node\\n )\\n {\\n bytes[] memory raw = new bytes[](2);\\n bytes memory key = _addHexPrefix(_key, true);\\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\\n raw[1] = Lib_RLPWriter.writeBytes(_value);\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Creates an empty branch node.\\n * @return _node Empty branch node as a TrieNode struct.\\n */\\n function _makeEmptyBranchNode()\\n private\\n pure\\n returns (\\n TrieNode memory _node\\n )\\n {\\n bytes[] memory raw = new bytes[](BRANCH_NODE_LENGTH);\\n for (uint256 i = 0; i < raw.length; i++) {\\n raw[i] = RLP_NULL_BYTES;\\n }\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Modifies the value slot for a given branch.\\n * @param _branch Branch node to modify.\\n * @param _value Value to insert into the branch.\\n * @return _updatedNode Modified branch node.\\n */\\n function _editBranchValue(\\n TrieNode memory _branch,\\n bytes memory _value\\n )\\n private\\n pure\\n returns (\\n TrieNode memory _updatedNode\\n )\\n {\\n bytes memory encoded = Lib_RLPWriter.writeBytes(_value);\\n _branch.decoded[_branch.decoded.length - 1] = Lib_RLPReader.toRLPItem(encoded);\\n return _makeNode(_branch.decoded);\\n }\\n\\n /**\\n * @notice Modifies a slot at an index for a given branch.\\n * @param _branch Branch node to modify.\\n * @param _index Slot index to modify.\\n * @param _value Value to insert into the slot.\\n * @return _updatedNode Modified branch node.\\n */\\n function _editBranchIndex(\\n TrieNode memory _branch,\\n uint8 _index,\\n bytes memory _value\\n )\\n private\\n pure\\n returns (\\n TrieNode memory _updatedNode\\n )\\n {\\n bytes memory encoded = _value.length < 32 ? _value : Lib_RLPWriter.writeBytes(_value);\\n _branch.decoded[_index] = Lib_RLPReader.toRLPItem(encoded);\\n return _makeNode(_branch.decoded);\\n }\\n\\n /**\\n * @notice Utility; adds a prefix to a key.\\n * @param _key Key to prefix.\\n * @param _isLeaf Whether or not the key belongs to a leaf.\\n * @return _prefixedKey Prefixed key.\\n */\\n function _addHexPrefix(\\n bytes memory _key,\\n bool _isLeaf\\n )\\n private\\n pure\\n returns (\\n bytes memory _prefixedKey\\n )\\n {\\n uint8 prefix = _isLeaf ? uint8(0x02) : uint8(0x00);\\n uint8 offset = uint8(_key.length % 2);\\n bytes memory prefixed = new bytes(2 - offset);\\n prefixed[0] = bytes1(prefix + offset);\\n return Lib_BytesUtils.concat(prefixed, _key);\\n }\\n\\n /**\\n * @notice Utility; removes a prefix from a path.\\n * @param _path Path to remove the prefix from.\\n * @return _unprefixedKey Unprefixed key.\\n */\\n function _removeHexPrefix(\\n bytes memory _path\\n )\\n private\\n pure\\n returns (\\n bytes memory _unprefixedKey\\n )\\n {\\n if (uint8(_path[0]) % 2 == 0) {\\n return Lib_BytesUtils.slice(_path, 2);\\n } else {\\n return Lib_BytesUtils.slice(_path, 1);\\n }\\n }\\n\\n /**\\n * @notice Utility; combines two node arrays. Array lengths are required\\n * because the actual lengths may be longer than the filled lengths.\\n * Array resizing is extremely costly and should be avoided.\\n * @param _a First array to join.\\n * @param _aLength Length of the first array.\\n * @param _b Second array to join.\\n * @param _bLength Length of the second array.\\n * @return _joined Combined node array.\\n */\\n function _joinNodeArrays(\\n TrieNode[] memory _a,\\n uint256 _aLength,\\n TrieNode[] memory _b,\\n uint256 _bLength\\n )\\n private\\n pure\\n returns (\\n TrieNode[] memory _joined\\n )\\n {\\n TrieNode[] memory ret = new TrieNode[](_aLength + _bLength);\\n\\n // Copy elements from the first array.\\n for (uint256 i = 0; i < _aLength; i++) {\\n ret[i] = _a[i];\\n }\\n\\n // Copy elements from the second array.\\n for (uint256 i = 0; i < _bLength; i++) {\\n ret[i + _aLength] = _b[i];\\n }\\n\\n return ret;\\n }\\n}\\n\",\"keccak256\":\"0xe84d904dcf0c03d5ebd0792c3aee70bf32e94513f3d3ac3636b53937116efd49\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/trie/Lib_SecureMerkleTrie.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_MerkleTrie } from \\\"./Lib_MerkleTrie.sol\\\";\\n\\n/**\\n * @title Lib_SecureMerkleTrie\\n */\\nlibrary Lib_SecureMerkleTrie {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * @notice Verifies a proof that a given key/value pair is present in the\\n * Merkle trie.\\n * @param _key Key of the node to search for, as a hex string.\\n * @param _value Value of the node to search for, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the desired node. Unlike\\n * traditional Merkle trees, this proof is executed top-down and consists\\n * of a list of RLP-encoded nodes that make a path down to the target node.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _verified `true` if the k/v pair exists in the trie, `false` otherwise.\\n */\\n function verifyInclusionProof(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bool _verified\\n )\\n {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.verifyInclusionProof(key, _value, _proof, _root);\\n }\\n\\n /**\\n * @notice Verifies a proof that a given key is *not* present in\\n * the Merkle trie.\\n * @param _key Key of the node to search for, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\\n * target node.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _verified `true` if the key is not present in the trie, `false` otherwise.\\n */\\n function verifyExclusionProof(\\n bytes memory _key,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bool _verified\\n )\\n {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.verifyExclusionProof(key, _proof, _root);\\n }\\n\\n /**\\n * @notice Updates a Merkle trie and returns a new root hash.\\n * @param _key Key of the node to update, as a hex string.\\n * @param _value Value of the node to update, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\\n * target node. If the key exists, we can simply update the value.\\n * Otherwise, we need to modify the trie to handle the new k/v pair.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _updatedRoot Root hash of the newly constructed trie.\\n */\\n function update(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bytes32 _updatedRoot\\n )\\n {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.update(key, _value, _proof, _root);\\n }\\n\\n /**\\n * @notice Retrieves the value associated with a given key.\\n * @param _key Key to search for, as hex bytes.\\n * @param _proof Merkle trie inclusion proof for the key.\\n * @param _root Known root of the Merkle trie.\\n * @return _exists Whether or not the key exists.\\n * @return _value Value of the key if it exists.\\n */\\n function get(\\n bytes memory _key,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bool _exists,\\n bytes memory _value\\n )\\n {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.get(key, _proof, _root);\\n }\\n\\n /**\\n * Computes the root hash for a trie with a single node.\\n * @param _key Key for the single node.\\n * @param _value Value for the single node.\\n * @return _updatedRoot Hash of the trie.\\n */\\n function getSingleNodeRootHash(\\n bytes memory _key,\\n bytes memory _value\\n )\\n internal\\n pure\\n returns (\\n bytes32 _updatedRoot\\n )\\n {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.getSingleNodeRootHash(key, _value);\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Computes the secure counterpart to a key.\\n * @param _key Key to get a secure key from.\\n * @return _secureKey Secure version of the key.\\n */\\n function _getSecureKey(\\n bytes memory _key\\n )\\n private\\n pure\\n returns (\\n bytes memory _secureKey\\n )\\n {\\n return abi.encodePacked(keccak256(_key));\\n }\\n}\",\"keccak256\":\"0x79355346f74bb1eb9eeb733cb5d9677d50115c4f390307cbf608fe071a1ada0c\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_Bytes32Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.7.0;\\n\\n/**\\n * @title Lib_Byte32Utils\\n */\\nlibrary Lib_Bytes32Utils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function toBool(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bool _out\\n )\\n {\\n return _in != 0;\\n }\\n\\n function fromBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes32 _out\\n )\\n {\\n return bytes32(uint256(_in ? 1 : 0));\\n }\\n\\n function toAddress(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n address _out\\n )\\n {\\n return address(uint160(uint256(_in)));\\n }\\n\\n function fromAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes32 _out\\n )\\n {\\n return bytes32(uint256(_in));\\n }\\n\\n function removeLeadingZeros(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n bytes memory out;\\n\\n assembly {\\n // Figure out how many leading zero bytes to remove.\\n let shift := 0\\n for { let i := 0 } and(lt(i, 32), eq(byte(i, _in), 0)) { i := add(i, 1) } {\\n shift := add(shift, 1)\\n }\\n\\n // Reserve some space for our output and fix the free memory pointer.\\n out := mload(0x40)\\n mstore(0x40, add(out, 0x40))\\n\\n // Shift the value and store it into the output bytes.\\n mstore(add(out, 0x20), shl(mul(shift, 8), _in))\\n\\n // Store the new size (with leading zero bytes removed) in the output byte size.\\n mstore(out, sub(32, shift))\\n }\\n\\n return out;\\n }\\n}\\n\",\"keccak256\":\"0x06f97590a80a01daa3bf6aa795449aea91a78684c646b4a6caeece8ef919c80c\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_BytesUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.7.0;\\n\\n/**\\n * @title Lib_BytesUtils\\n */\\nlibrary Lib_BytesUtils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function concat(\\n bytes memory _preBytes,\\n bytes memory _postBytes\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n bytes memory tempBytes;\\n\\n assembly {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // Store the length of the first bytes array at the beginning of\\n // the memory for tempBytes.\\n let length := mload(_preBytes)\\n mstore(tempBytes, length)\\n\\n // Maintain a memory counter for the current write location in the\\n // temp bytes array by adding the 32 bytes for the array length to\\n // the starting location.\\n let mc := add(tempBytes, 0x20)\\n // Stop copying when the memory counter reaches the length of the\\n // first bytes array.\\n let end := add(mc, length)\\n\\n for {\\n // Initialize a copy counter to the start of the _preBytes data,\\n // 32 bytes into its memory.\\n let cc := add(_preBytes, 0x20)\\n } lt(mc, end) {\\n // Increase both counters by 32 bytes each iteration.\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n // Write the _preBytes data into the tempBytes memory 32 bytes\\n // at a time.\\n mstore(mc, mload(cc))\\n }\\n\\n // Add the length of _postBytes to the current length of tempBytes\\n // and store it as the new length in the first 32 bytes of the\\n // tempBytes memory.\\n length := mload(_postBytes)\\n mstore(tempBytes, add(length, mload(tempBytes)))\\n\\n // Move the memory counter back from a multiple of 0x20 to the\\n // actual end of the _preBytes data.\\n mc := end\\n // Stop copying when the memory counter reaches the new combined\\n // length of the arrays.\\n end := add(mc, length)\\n\\n for {\\n let cc := add(_postBytes, 0x20)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n // Update the free-memory pointer by padding our last write location\\n // to 32 bytes: add 31 bytes to the end of tempBytes to move to the\\n // next 32 byte block, then round down to the nearest multiple of\\n // 32. If the sum of the length of the two arrays is zero then add\\n // one before rounding down to leave a blank 32 bytes (the length block with 0).\\n mstore(0x40, and(\\n add(add(end, iszero(add(length, mload(_preBytes)))), 31),\\n not(31) // Round down to the nearest 32 bytes.\\n ))\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_start + _length >= _start, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n if (_bytes.length - _start == 0) {\\n return bytes('');\\n }\\n\\n return slice(_bytes, _start, _bytes.length - _start);\\n }\\n\\n function toBytes32PadLeft(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes32)\\n {\\n bytes32 ret;\\n uint256 len = _bytes.length <= 32 ? _bytes.length : 32;\\n assembly {\\n ret := shr(mul(sub(32, len), 8), mload(add(_bytes, 32)))\\n }\\n return ret;\\n }\\n\\n function toBytes32(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes32)\\n {\\n if (_bytes.length < 32) {\\n bytes32 ret;\\n assembly {\\n ret := mload(add(_bytes, 32))\\n }\\n return ret;\\n }\\n\\n return abi.decode(_bytes,(bytes32)); // will truncate if input length > 32 bytes\\n }\\n\\n function toUint256(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (uint256)\\n {\\n return uint256(toBytes32(_bytes));\\n }\\n\\n function toUint24(bytes memory _bytes, uint256 _start) internal pure returns (uint24) {\\n require(_start + 3 >= _start, \\\"toUint24_overflow\\\");\\n require(_bytes.length >= _start + 3 , \\\"toUint24_outOfBounds\\\");\\n uint24 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x3), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toUint8(bytes memory _bytes, uint256 _start) internal pure returns (uint8) {\\n require(_start + 1 >= _start, \\\"toUint8_overflow\\\");\\n require(_bytes.length >= _start + 1 , \\\"toUint8_outOfBounds\\\");\\n uint8 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x1), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toAddress(bytes memory _bytes, uint256 _start) internal pure returns (address) {\\n require(_start + 20 >= _start, \\\"toAddress_overflow\\\");\\n require(_bytes.length >= _start + 20, \\\"toAddress_outOfBounds\\\");\\n address tempAddress;\\n\\n assembly {\\n tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000)\\n }\\n\\n return tempAddress;\\n }\\n\\n function toNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n bytes memory nibbles = new bytes(_bytes.length * 2);\\n\\n for (uint256 i = 0; i < _bytes.length; i++) {\\n nibbles[i * 2] = _bytes[i] >> 4;\\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\\n }\\n\\n return nibbles;\\n }\\n\\n function fromNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n bytes memory ret = new bytes(_bytes.length / 2);\\n\\n for (uint256 i = 0; i < ret.length; i++) {\\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\\n }\\n\\n return ret;\\n }\\n\\n function equal(\\n bytes memory _bytes,\\n bytes memory _other\\n )\\n internal\\n pure\\n returns (bool)\\n {\\n return keccak256(_bytes) == keccak256(_other);\\n }\\n}\\n\",\"keccak256\":\"0x849e4fedd81cd260e4c3b74b953f00636323574c60d363f36ab331e94aab9219\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_ReentrancyGuard.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// +build ovm\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @dev Contract module that helps prevent reentrant calls to a function.\\n *\\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\\n * available, which can be applied to functions to make sure there are no nested\\n * (reentrant) calls to them.\\n *\\n * Note that because there is a single `nonReentrant` guard, functions marked as\\n * `nonReentrant` may not call one another. This can be worked around by making\\n * those functions `private`, and then adding `external` `nonReentrant` entry\\n * points to them.\\n *\\n * TIP: If you would like to learn more about reentrancy and alternative ways\\n * to protect against it, check out our blog post\\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\\n */\\nabstract contract Lib_ReentrancyGuard {\\n // Booleans are more expensive than uint256 or any type that takes up a full\\n // word because each write operation emits an extra SLOAD to first read the\\n // slot's contents, replace the bits taken up by the boolean, and then write\\n // back. This is the compiler's defense against contract upgrades and\\n // pointer aliasing, and it cannot be disabled.\\n\\n // The values being non-zero value makes deployment a bit more expensive,\\n // but in exchange the refund on every call to nonReentrant will be lower in\\n // amount. Since refunds are capped to a percentage of the total\\n // transaction's gas, it is best to keep them low in cases like this one, to\\n // increase the likelihood of the full refund coming into effect.\\n uint256 private constant _NOT_ENTERED = 1;\\n uint256 private constant _ENTERED = 2;\\n\\n uint256 private _status;\\n\\n constructor () internal {\\n _status = _NOT_ENTERED;\\n }\\n\\n /**\\n * @dev Prevents a contract from calling itself, directly or indirectly.\\n * Calling a `nonReentrant` function from another `nonReentrant`\\n * function is not supported. It is possible to prevent this from happening\\n * by making the `nonReentrant` function external, and make it call a\\n * `private` function that does the actual work.\\n */\\n modifier nonReentrant() {\\n // On the first call to nonReentrant, _notEntered will be true\\n require(_status != _ENTERED, \\\"ReentrancyGuard: reentrant call\\\");\\n\\n // Any calls to nonReentrant after this point will fail\\n _status = _ENTERED;\\n\\n _;\\n\\n // By storing the original value once again, a refund is triggered (see\\n // https://eips.ethereum.org/EIPS/eip-2200)\\n _status = _NOT_ENTERED;\\n }\\n}\\n\",\"keccak256\":\"0x8cb909f4039d8d9770578c6c469e8f3cfcbb6088c209ce663742c023920af9c1\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.7.0;\\n\\n/**\\n * @title Lib_SafeExecutionManagerWrapper\\n */\\nlibrary Lib_SafeExecutionManagerWrapper {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Makes an ovmCALL and performs all the necessary safety checks.\\n * @param _gasLimit Gas limit for the call.\\n * @param _target Address to call.\\n * @param _calldata Data to send to the call.\\n * @return _success Whether or not the call reverted.\\n * @return _returndata Data returned by the call.\\n */\\n function safeCALL(\\n uint256 _gasLimit,\\n address _target,\\n bytes memory _calldata\\n )\\n internal\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCALL(uint256,address,bytes)\\\",\\n _gasLimit,\\n _target,\\n _calldata\\n )\\n );\\n\\n return abi.decode(returndata, (bool, bytes));\\n }\\n\\n /**\\n * Makes an ovmCALL and performs all the necessary safety checks.\\n * @param _gasLimit Gas limit for the call.\\n * @param _target Address to call.\\n * @param _calldata Data to send to the call.\\n * @return _success Whether or not the call reverted.\\n * @return _returndata Data returned by the call.\\n */\\n function safeDELEGATECALL(\\n uint256 _gasLimit,\\n address _target,\\n bytes memory _calldata\\n )\\n internal\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmDELEGATECALL(uint256,address,bytes)\\\",\\n _gasLimit,\\n _target,\\n _calldata\\n )\\n );\\n\\n return abi.decode(returndata, (bool, bytes));\\n }\\n\\n /**\\n * Performs an ovmCREATE and the necessary safety checks.\\n * @param _gasLimit Gas limit for the creation.\\n * @param _bytecode Code for the new contract.\\n * @return _contract Address of the created contract.\\n */\\n function safeCREATE(\\n uint256 _gasLimit,\\n bytes memory _bytecode\\n )\\n internal\\n returns (\\n address _contract\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n _gasLimit,\\n abi.encodeWithSignature(\\n \\\"ovmCREATE(bytes)\\\",\\n _bytecode\\n )\\n );\\n\\n return abi.decode(returndata, (address));\\n }\\n\\n /**\\n * Performs an ovmEXTCODESIZE and the necessary safety checks.\\n * @param _contract Address of the contract to query the size of.\\n * @return _EXTCODESIZE Size of the requested contract in bytes.\\n */\\n function safeEXTCODESIZE(\\n address _contract\\n )\\n internal\\n returns (\\n uint256 _EXTCODESIZE\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmEXTCODESIZE(address)\\\",\\n _contract\\n )\\n );\\n\\n return abi.decode(returndata, (uint256));\\n }\\n\\n /**\\n * Performs a safe ovmCHAINID call.\\n * @return _CHAINID Result of calling ovmCHAINID.\\n */\\n function safeCHAINID()\\n internal\\n returns (\\n uint256 _CHAINID\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCHAINID()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (uint256));\\n }\\n\\n /**\\n * Performs a safe ovmCALLER call.\\n * @return _CALLER Result of calling ovmCALLER.\\n */\\n function safeCALLER()\\n internal\\n returns (\\n address _CALLER\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCALLER()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (address));\\n }\\n\\n /**\\n * Performs a safe ovmADDRESS call.\\n * @return _ADDRESS Result of calling ovmADDRESS.\\n */\\n function safeADDRESS()\\n internal\\n returns (\\n address _ADDRESS\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmADDRESS()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (address));\\n }\\n\\n /**\\n * Performs a safe ovmGETNONCE call.\\n * @return _nonce Result of calling ovmGETNONCE.\\n */\\n function safeGETNONCE()\\n internal\\n returns (\\n uint256 _nonce\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmGETNONCE()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (uint256));\\n }\\n\\n /**\\n * Performs a safe ovmSETNONCE call.\\n * @param _nonce New account nonce.\\n */\\n function safeSETNONCE(\\n uint256 _nonce\\n )\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmSETNONCE(uint256)\\\",\\n _nonce\\n )\\n );\\n }\\n\\n /**\\n * Performs a safe ovmCREATEEOA call.\\n * @param _messageHash Message hash which was signed by EOA\\n * @param _v v value of signature (0 or 1)\\n * @param _r r value of signature\\n * @param _s s value of signature\\n */\\n function safeCREATEEOA(\\n bytes32 _messageHash,\\n uint8 _v,\\n bytes32 _r,\\n bytes32 _s\\n )\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCREATEEOA(bytes32,uint8,bytes32,bytes32)\\\",\\n _messageHash,\\n _v,\\n _r,\\n _s\\n )\\n );\\n }\\n\\n /**\\n * Performs a safe REVERT.\\n * @param _reason String revert reason to pass along with the REVERT.\\n */\\n function safeREVERT(\\n string memory _reason\\n )\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmREVERT(bytes)\\\",\\n bytes(_reason)\\n )\\n );\\n }\\n\\n /**\\n * Performs a safe \\\"require\\\".\\n * @param _condition Boolean condition that must be true or will revert.\\n * @param _reason String revert reason to pass along with the REVERT.\\n */\\n function safeREQUIRE(\\n bool _condition,\\n string memory _reason\\n )\\n internal\\n {\\n if (!_condition) {\\n safeREVERT(\\n _reason\\n );\\n }\\n }\\n\\n /**\\n * Performs a safe ovmSLOAD call.\\n */\\n function safeSLOAD(\\n bytes32 _key\\n )\\n internal\\n returns (\\n bytes32\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmSLOAD(bytes32)\\\",\\n _key\\n )\\n );\\n\\n return abi.decode(returndata, (bytes32));\\n }\\n\\n /**\\n * Performs a safe ovmSSTORE call.\\n */\\n function safeSSTORE(\\n bytes32 _key,\\n bytes32 _value\\n )\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmSSTORE(bytes32,bytes32)\\\",\\n _key,\\n _value\\n )\\n );\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Performs an ovm interaction and the necessary safety checks.\\n * @param _gasLimit Gas limit for the interaction.\\n * @param _calldata Data to send to the OVM_ExecutionManager (encoded with sighash).\\n * @return _returndata Data sent back by the OVM_ExecutionManager.\\n */\\n function _safeExecutionManagerInteraction(\\n uint256 _gasLimit,\\n bytes memory _calldata\\n )\\n private\\n returns (\\n bytes memory _returndata\\n )\\n {\\n address ovmExecutionManager = msg.sender;\\n (\\n bool success,\\n bytes memory returndata\\n ) = ovmExecutionManager.call{gas: _gasLimit}(_calldata);\\n\\n if (success == false) {\\n assembly {\\n revert(add(returndata, 0x20), mload(returndata))\\n }\\n } else if (returndata.length == 1) {\\n assembly {\\n return(0, 1)\\n }\\n } else {\\n return returndata;\\n }\\n }\\n\\n function _safeExecutionManagerInteraction(\\n bytes memory _calldata\\n )\\n private\\n returns (\\n bytes memory _returndata\\n )\\n {\\n return _safeExecutionManagerInteraction(\\n gasleft(),\\n _calldata\\n );\\n }\\n}\\n\",\"keccak256\":\"0xdc30487ca1580f3498d4a1c4e26dc53158c00b44bd72da212a66267c22a139b0\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x608060405234801561001057600080fd5b506001600055600680546001600160a01b03191690556125c6806100356000396000f3fe608060405234801561001057600080fd5b506004361061009e5760003560e01c806382e3702d1161006657806382e3702d1461011c578063b1b1b2091461012f578063c4d66de814610142578063d7fd19dd14610155578063ecc70428146101685761009e565b806321d800ec146100a35780633dbb202b146100cc578063461a4478146100e15780636e296e4514610101578063706ceab614610109575b600080fd5b6100b66100b136600461203d565b61017d565b6040516100c39190612253565b60405180910390f35b6100df6100da366004611fc1565b610192565b005b6100f46100ef366004612055565b610221565b6040516100c391906121db565b6100f46102fd565b6100df610117366004611f4a565b61030c565b6100b661012a36600461203d565b61037c565b6100b661013d36600461203d565b610391565b6100df610150366004611e01565b6103a6565b6100df610163366004611e1b565b6103f1565b61017061065f565b6040516100c39190612124565b60016020526000908152604090205460ff1681565b60006101a2843385600454610665565b60048054600190810190915581516020808401919091206000908152600390915260409020805460ff1916909117905590506101e48163ffffffff84166106b2565b7f0ee9ffdb2334d78de97ffb066b23a352a4d35180cefb36589d663fbb1eb6f3268160405161021391906122d5565b60405180910390a150505050565b60065460405163bf40fac160e01b81526020600482018181528451602484015284516000946001600160a01b03169363bf40fac1938793928392604401918501908083838b5b8381101561027f578181015183820152602001610267565b50505050905090810190601f1680156102ac5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b1580156102c957600080fd5b505afa1580156102dd573d6000803e3d6000fd5b505050506040513d60208110156102f357600080fd5b505190505b919050565b6005546001600160a01b031681565b600061031a86868686610665565b805160208083019190912060009081526003909152604090205490915060ff1615156001146103645760405162461bcd60e51b815260040161035b90612333565b60405180910390fd5b610374818363ffffffff166106b2565b505050505050565b60036020526000908152604090205460ff1681565b60026020526000908152604090205460ff1681565b6006546001600160a01b0316156103cf5760405162461bcd60e51b815260040161035b9061241b565b600680546001600160a01b0319166001600160a01b0392909216919091179055565b60026000541415610449576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6002600090815560408051808201909152601481527327ab26afa61926b2b9b9b0b3b2a932b630bcb2b960611b602082015261048490610221565b90506001600160a01b038116156104bd57336001600160a01b038216146104bd5760405162461bcd60e51b815260040161035b9061237e565b60006104cb87878787610665565b90506104d7818461078a565b15156001146104f85760405162461bcd60e51b815260040161035b906123d4565b80516020808301919091206000818152600290925260409091205460ff16156105335760405162461bcd60e51b815260040161035b906122e8565b600580546001600160a01b0319166001600160a01b03898116919091179091556040516000918a169061056790899061213b565b6000604051808303816000865af19150503d80600081146105a4576040519150601f19603f3d011682016040523d82523d6000602084013e6105a9565b606091505b50909150506001811515141561060b5760008281526002602052604090819020805460ff19166001179055517f4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c90610602908490612124565b60405180910390a15b600083334360405160200161062293929190612189565b60408051601f1981840301815291815281516020928301206000908152600192839052908120805460ff1916831790555550505050505050505050565b60045481565b60608484848460405160240161067e94939291906121ef565b60408051601f198184030181529190526020810180516001600160e01b031663cbd4ece960e01b1790529050949350505050565b6106f06040518060400160405280601d81526020017f4f564d5f43616e6f6e6963616c5472616e73616374696f6e436861696e000000815250610221565b6001600160a01b0316636fee07e061073c6040518060400160405280601a81526020017f4f564d5f4c3243726f7373446f6d61696e4d657373656e676572000000000000815250610221565b83856040518463ffffffff1660e01b815260040161075c9392919061222c565b600060405180830381600087803b15801561077657600080fd5b505af1158015610374573d6000803e3d6000fd5b6000610795826107af565b80156107a657506107a6838361090c565b90505b92915050565b6000806107f06040518060400160405280601881526020017f4f564d5f5374617465436f6d6d69746d656e74436861696e0000000000000000815250610221565b6020840151604051639418bddd60e01b81529192506001600160a01b03831691639418bddd91610822916004016124d9565b60206040518083038186803b15801561083a57600080fd5b505afa15801561084e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610872919061201d565b1580156109055750825160208401516040808601519051634d69ee5760e01b81526001600160a01b03851693634d69ee57936108b593919290919060040161225e565b60206040518083038186803b1580156108cd57600080fd5b505afa1580156108e1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610905919061201d565b9392505050565b6000808361094e6040518060400160405280601a81526020017f4f564d5f4c3243726f7373446f6d61696e4d657373656e676572000000000000815250610221565b60405160200161095f929190612157565b60405160208183030381529060405280519060200120600060405160200161098892919061212d565b6040516020818303038152906040528051906020012090506000806109d7602160991b6040516020016109bb919061210c565b60408051601f1981840301815291905260608701518751610a69565b90925090506001821515146109fe5760405162461bcd60e51b815260040161035b90612465565b6000610a0982610a92565b9050610a5e84604051602001610a1f9190612124565b6040516020818303038152906040526001604051602001610a4091906121c3565b60405160208183030381529060405288608001518460400151610b24565b979650505050505050565b600060606000610a7886610b48565b9050610a85818686610b78565b9250925050935093915050565b610a9a611bb7565b6000610aa583610c4b565b90506040518060800160405280610acf83600081518110610ac257fe5b6020026020010151610c5e565b8152602001610ae483600181518110610ac257fe5b8152602001610b0683600281518110610af957fe5b6020026020010151610c65565b8152602001610b1b83600381518110610af957fe5b90529392505050565b600080610b3086610b48565b9050610b3e81868686610d5e565b9695505050505050565b60608180519060200120604051602001610b629190612124565b6040516020818303038152906040529050919050565b600060606000610b8785610d84565b90506000806000610b99848a89610e5b565b81519295509093509150158080610bad5750815b610bfe576040805162461bcd60e51b815260206004820152601a60248201527f50726f76696465642070726f6f6620697320696e76616c69642e000000000000604482015290519081900360640190fd5b600081610c1a5760405180602001604052806000815250610c39565b610c39866001870381518110610c2c57fe5b60200260200101516111fe565b919b919a509098505050505050505050565b60606107a9610c598361121a565b61123f565b60006107a9825b6000602182600001511115610cc1576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e000000000000604482015290519081900360640190fd5b6000806000610ccf856113b5565b919450925090506000816001811115610ce457fe5b14610d36576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e000000000000604482015290519081900360640190fd5b602080860151840180519091841015610b3e5760208490036101000a90049695505050505050565b6000806000610d6e878686610b78565b91509150818015610a5e5750610a5e86826116de565b60606000610d9183610c4b565b90506000815167ffffffffffffffff81118015610dad57600080fd5b50604051908082528060200260200182016040528015610de757816020015b610dd4611bde565b815260200190600190039081610dcc5790505b50905060005b8251811015610e53576000610e14848381518110610e0757fe5b60200260200101516116f4565b90506040518060400160405280828152602001610e3083610c4b565b815250838381518110610e3f57fe5b602090810291909101015250600101610ded565b509392505050565b60006060818080610e6b87611783565b905085600080610e79611bde565b60005b8c518110156111d6578c8181518110610e9157fe5b6020026020010151915082840193506001870196508360001415610f0557815180516020909101208514610f00576040805162461bcd60e51b8152602060048201526011602482015270092dcecc2d8d2c840e4dedee840d0c2e6d607b1b604482015290519081900360640190fd5b610fcc565b815151602011610f6c57815180516020909101208514610f00576040805162461bcd60e51b815260206004820152601b60248201527f496e76616c6964206c6172676520696e7465726e616c20686173680000000000604482015290519081900360640190fd5b84610f7a8360000151611880565b14610fcc576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420696e7465726e616c206e6f64652068617368000000000000604482015290519081900360640190fd5b6020820151516011141561103b578551841415610fe8576111d6565b6000868581518110610ff657fe5b602001015160f81c60f81b60f81c9050600083602001518260ff168151811061101b57fe5b6020026020010151905061102e816118ac565b96506001945050506111ce565b60028260200151511415611181576000611054836118e2565b905060008160008151811061106557fe5b016020015160f81c90506001811660020360006110858460ff8416611900565b905060006110938b8a611900565b905060006110a18383611931565b905060ff8516600214806110b8575060ff85166003145b156110ea578083511480156110cd5750808251145b156110d757988901985b50600160ff1b99506111d6945050505050565b60ff851615806110fd575060ff85166001145b1561114a578061111a5750600160ff1b99506111d6945050505050565b61113b886020015160018151811061112e57fe5b60200260200101516118ac565b9a5097506111ce945050505050565b60405162461bcd60e51b815260040180806020018281038252602681526020018061256b6026913960400191505060405180910390fd5b6040805162461bcd60e51b815260206004820152601d60248201527f526563656976656420616e20756e706172736561626c65206e6f64652e000000604482015290519081900360640190fd5b600101610e7c565b50600160ff1b8414866111e98786611900565b909e909d50909b509950505050505050505050565b602081015180516060916107a9916000198101908110610e0757fe5b611222611bf8565b506040805180820190915281518152602082810190820152919050565b606060008061124d846113b5565b9193509091506001905081600181111561126357fe5b146112b5576040805162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c50206c6973742076616c75652e000000000000000000604482015290519081900360640190fd5b6040805160208082526104208201909252600091816020015b6112d6611bf8565b8152602001906001900390816112ce5790505090506000835b86518110156113aa57602082106113375760405162461bcd60e51b815260040180806020018281038252602a815260200180612541602a913960400191505060405180910390fd5b6000806113636040518060400160405280858c60000151038152602001858c60200151018152506113b5565b509150915060405180604001604052808383018152602001848b602001510181525085858151811061139157fe5b60209081029190910101526001939093019201016112ef565b508152949350505050565b600080600080846000015111611412576040805162461bcd60e51b815260206004820152601860248201527f524c50206974656d2063616e6e6f74206265206e756c6c2e0000000000000000604482015290519081900360640190fd5b6020840151805160001a607f81116114375760006001600094509450945050506116d7565b60b781116114ac578551607f19820190811061149a576040805162461bcd60e51b815260206004820152601960248201527f496e76616c696420524c502073686f727420737472696e672e00000000000000604482015290519081900360640190fd5b600195509350600092506116d7915050565b60bf811161159057855160b619820190811061150f576040805162461bcd60e51b815260206004820152601f60248201527f496e76616c696420524c50206c6f6e6720737472696e67206c656e6774682e00604482015290519081900360640190fd5b6000816020036101000a600185015104905080820188600001511161157b576040805162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c50206c6f6e6720737472696e672e0000000000000000604482015290519081900360640190fd5b600190910195509350600092506116d7915050565b60f7811161160457855160bf1982019081106115f3576040805162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c502073686f7274206c6973742e000000000000000000604482015290519081900360640190fd5b6001955093508492506116d7915050565b855160f619820190811061165f576040805162461bcd60e51b815260206004820152601d60248201527f496e76616c696420524c50206c6f6e67206c697374206c656e6774682e000000604482015290519081900360640190fd5b6000816020036101000a60018501510490508082018860000151116116c4576040805162461bcd60e51b815260206004820152601660248201527524b73b30b634b210292628103637b733903634b9ba1760511b604482015290519081900360640190fd5b60019182019650945092506116d7915050565b9193909250565b8051602091820120825192909101919091201490565b60606000806000611704856113b5565b91945092509050600081600181111561171957fe5b1461176b576040805162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c502062797465732076616c75652e0000000000000000604482015290519081900360640190fd5b61177a85602001518484611997565b95945050505050565b60606000825160020267ffffffffffffffff811180156117a257600080fd5b506040519080825280601f01601f1916602001820160405280156117cd576020820181803683370190505b50905060005b83518110156118795760048482815181106117ea57fe5b602001015160f81c60f81b6001600160f81b031916901c82826002028151811061181057fe5b60200101906001600160f81b031916908160001a905350601084828151811061183557fe5b016020015160f81c8161184457fe5b0660f81b82826002026001018151811061185a57fe5b60200101906001600160f81b031916908160001a9053506001016117d3565b5092915050565b6000602082511015611897575060208101516102f8565b8180602001905160208110156102f357600080fd5b600060606020836000015110156118cd576118c683611a45565b90506118d9565b6118d6836116f4565b90505b61090581611880565b60606107a96118fb8360200151600081518110610e0757fe5b611783565b6060818351036000141561192357506040805160208101909152600081526107a9565b6107a6838384865103611a50565b6000805b8084511180156119455750808351115b801561198a575082818151811061195857fe5b602001015160f81c60f81b6001600160f81b03191684828151811061197957fe5b01602001516001600160f81b031916145b156107a657600101611935565b606060008267ffffffffffffffff811180156119b257600080fd5b506040519080825280601f01601f1916602001820160405280156119dd576020820181803683370190505b5090508051600014156119f1579050610905565b8484016020820160005b60208604811015611a1c5782518252602092830192909101906001016119fb565b5080519151601f959095166020036101000a600019019182169119909416179092525092915050565b60606107a982611ba1565b60608182601f011015611a9b576040805162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b604482015290519081900360640190fd5b828284011015611ae3576040805162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b604482015290519081900360640190fd5b81830184511015611b2f576040805162461bcd60e51b8152602060048201526011602482015270736c6963655f6f75744f66426f756e647360781b604482015290519081900360640190fd5b606082158015611b4e5760405191506000825260208201604052611b98565b6040519150601f8416801560200281840101858101878315602002848b0101015b81831015611b87578051835260209283019201611b6f565b5050858452601f01601f1916604052505b50949350505050565b60606107a9826020015160008460000151611997565b60408051608081018252600080825260208201819052918101829052606081019190915290565b604051806040016040528060608152602001606081525090565b604051806040016040528060008152602001600081525090565b600067ffffffffffffffff831115611c2657fe5b611c39601f8401601f19166020016124ec565b9050828152838383011115611c4d57600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b03811681146102f857600080fd5b600082601f830112611c8b578081fd5b6107a683833560208501611c12565b600060a08284031215611cab578081fd5b60405160a0810167ffffffffffffffff8282108183111715611cc957fe5b81604052829350843583526020850135602084015260408501356040840152606085013560608401526080850135915080821115611d0657600080fd5b50611d1385828601611c7b565b6080830152505092915050565b600060408284031215611d31578081fd5b6040516040810167ffffffffffffffff8282108183111715611d4f57fe5b8160405282935084358352602091508185013581811115611d6f57600080fd5b8501601f81018713611d8057600080fd5b803582811115611d8c57fe5b8381029250611d9c8484016124ec565b8181528481019083860185850187018b1015611db757600080fd5b600095505b83861015611dda578035835260019590950194918601918601611dbc565b5080868801525050505050505092915050565b803563ffffffff811681146102f857600080fd5b600060208284031215611e12578081fd5b6107a682611c64565b600080600080600060a08688031215611e32578081fd5b611e3b86611c64565b9450611e4960208701611c64565b9350604086013567ffffffffffffffff80821115611e65578283fd5b611e7189838a01611c7b565b9450606088013593506080880135915080821115611e8d578283fd5b9087019060a0828a031215611ea0578283fd5b611eaa60a06124ec565b82358152602083013582811115611ebf578485fd5b611ecb8b828601611c9a565b602083015250604083013582811115611ee2578485fd5b611eee8b828601611d20565b604083015250606083013582811115611f05578485fd5b611f118b828601611c7b565b606083015250608083013582811115611f28578485fd5b611f348b828601611c7b565b6080830152508093505050509295509295909350565b600080600080600060a08688031215611f61578081fd5b611f6a86611c64565b9450611f7860208701611c64565b9350604086013567ffffffffffffffff811115611f93578182fd5b611f9f88828901611c7b565b93505060608601359150611fb560808701611ded565b90509295509295909350565b600080600060608486031215611fd5578283fd5b611fde84611c64565b9250602084013567ffffffffffffffff811115611ff9578283fd5b61200586828701611c7b565b92505061201460408501611ded565b90509250925092565b60006020828403121561202e578081fd5b815180151581146107a6578182fd5b60006020828403121561204e578081fd5b5035919050565b600060208284031215612066578081fd5b813567ffffffffffffffff81111561207c578182fd5b8201601f8101841361208c578182fd5b61209b84823560208401611c12565b949350505050565b600081518084526120bb816020860160208601612510565b601f01601f19169290920160200192915050565b600081518352602082015160208401526040820151604084015260608201516060840152608082015160a0608085015261209b60a08501826120a3565b60609190911b6001600160601b031916815260140190565b90815260200190565b918252602082015260400190565b6000825161214d818460208701612510565b9190910192915050565b60008351612169818460208801612510565b60609390931b6001600160601b0319169190920190815260140192915050565b6000845161219b818460208901612510565b60609490941b6001600160601b03191691909301908152601481019190915260340192915050565b60f89190911b6001600160f81b031916815260010190565b6001600160a01b0391909116815260200190565b6001600160a01b0385811682528416602082015260806040820181905260009061221b908301856120a3565b905082606083015295945050505050565b600060018060a01b03851682528360208301526060604083015261177a60608301846120a3565b901515815260200190565b6000848252602060608184015261227860608401866120cf565b838103604085015260408101855182528286015160408484015281815180845260608501915085830194508693505b808410156122c757845182529385019360019390930192908501906122a7565b509998505050505050505050565b6000602082526107a660208301846120a3565b6020808252602b908201527f50726f7669646564206d6573736167652068617320616c72656164792062656560408201526a37103932b1b2b4bb32b21760a91b606082015260800190565b6020808252602b908201527f50726f7669646564206d65737361676520686173206e6f7420616c726561647960408201526a103132b2b71039b2b73a1760a91b606082015260800190565b60208082526036908201527f4f6e6c79204f564d5f4c324d65737361676552656c617965722063616e2072656040820152753630bc90261916ba3796a6189036b2b9b9b0b3b2b99760511b606082015260800190565b60208082526027908201527f50726f7669646564206d65737361676520636f756c64206e6f742062652076656040820152663934b334b2b21760c91b606082015260800190565b6020808252602a908201527f4c3143726f7373446f6d61696e4d657373656e67657220616c72656164792069604082015269373a34b0b634bd32b21760b11b606082015260800190565b6020808252604e908201527f4d6573736167652070617373696e6720707265636f6d70696c6520686173206e60408201527f6f74206265656e20696e697469616c697a6564206f7220696e76616c6964207060608201526d3937b7b310383937bb34b232b21760911b608082015260a00190565b6000602082526107a660208301846120cf565b60405181810167ffffffffffffffff8111828210171561250857fe5b604052919050565b60005b8381101561252b578181015183820152602001612513565b8381111561253a576000848401525b5050505056fe50726f766964656420524c50206c6973742065786365656473206d6178206c697374206c656e6774682e52656365697665642061206e6f6465207769746820616e20756e6b6e6f776e20707265666978a2646970667358221220ae7749addc98d54af4f2ee40764425eeab8281fa56632aa683ab7fadbe10912764736f6c63430007060033", - "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061009e5760003560e01c806382e3702d1161006657806382e3702d1461011c578063b1b1b2091461012f578063c4d66de814610142578063d7fd19dd14610155578063ecc70428146101685761009e565b806321d800ec146100a35780633dbb202b146100cc578063461a4478146100e15780636e296e4514610101578063706ceab614610109575b600080fd5b6100b66100b136600461203d565b61017d565b6040516100c39190612253565b60405180910390f35b6100df6100da366004611fc1565b610192565b005b6100f46100ef366004612055565b610221565b6040516100c391906121db565b6100f46102fd565b6100df610117366004611f4a565b61030c565b6100b661012a36600461203d565b61037c565b6100b661013d36600461203d565b610391565b6100df610150366004611e01565b6103a6565b6100df610163366004611e1b565b6103f1565b61017061065f565b6040516100c39190612124565b60016020526000908152604090205460ff1681565b60006101a2843385600454610665565b60048054600190810190915581516020808401919091206000908152600390915260409020805460ff1916909117905590506101e48163ffffffff84166106b2565b7f0ee9ffdb2334d78de97ffb066b23a352a4d35180cefb36589d663fbb1eb6f3268160405161021391906122d5565b60405180910390a150505050565b60065460405163bf40fac160e01b81526020600482018181528451602484015284516000946001600160a01b03169363bf40fac1938793928392604401918501908083838b5b8381101561027f578181015183820152602001610267565b50505050905090810190601f1680156102ac5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b1580156102c957600080fd5b505afa1580156102dd573d6000803e3d6000fd5b505050506040513d60208110156102f357600080fd5b505190505b919050565b6005546001600160a01b031681565b600061031a86868686610665565b805160208083019190912060009081526003909152604090205490915060ff1615156001146103645760405162461bcd60e51b815260040161035b90612333565b60405180910390fd5b610374818363ffffffff166106b2565b505050505050565b60036020526000908152604090205460ff1681565b60026020526000908152604090205460ff1681565b6006546001600160a01b0316156103cf5760405162461bcd60e51b815260040161035b9061241b565b600680546001600160a01b0319166001600160a01b0392909216919091179055565b60026000541415610449576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6002600090815560408051808201909152601481527327ab26afa61926b2b9b9b0b3b2a932b630bcb2b960611b602082015261048490610221565b90506001600160a01b038116156104bd57336001600160a01b038216146104bd5760405162461bcd60e51b815260040161035b9061237e565b60006104cb87878787610665565b90506104d7818461078a565b15156001146104f85760405162461bcd60e51b815260040161035b906123d4565b80516020808301919091206000818152600290925260409091205460ff16156105335760405162461bcd60e51b815260040161035b906122e8565b600580546001600160a01b0319166001600160a01b03898116919091179091556040516000918a169061056790899061213b565b6000604051808303816000865af19150503d80600081146105a4576040519150601f19603f3d011682016040523d82523d6000602084013e6105a9565b606091505b50909150506001811515141561060b5760008281526002602052604090819020805460ff19166001179055517f4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c90610602908490612124565b60405180910390a15b600083334360405160200161062293929190612189565b60408051601f1981840301815291815281516020928301206000908152600192839052908120805460ff1916831790555550505050505050505050565b60045481565b60608484848460405160240161067e94939291906121ef565b60408051601f198184030181529190526020810180516001600160e01b031663cbd4ece960e01b1790529050949350505050565b6106f06040518060400160405280601d81526020017f4f564d5f43616e6f6e6963616c5472616e73616374696f6e436861696e000000815250610221565b6001600160a01b0316636fee07e061073c6040518060400160405280601a81526020017f4f564d5f4c3243726f7373446f6d61696e4d657373656e676572000000000000815250610221565b83856040518463ffffffff1660e01b815260040161075c9392919061222c565b600060405180830381600087803b15801561077657600080fd5b505af1158015610374573d6000803e3d6000fd5b6000610795826107af565b80156107a657506107a6838361090c565b90505b92915050565b6000806107f06040518060400160405280601881526020017f4f564d5f5374617465436f6d6d69746d656e74436861696e0000000000000000815250610221565b6020840151604051639418bddd60e01b81529192506001600160a01b03831691639418bddd91610822916004016124d9565b60206040518083038186803b15801561083a57600080fd5b505afa15801561084e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610872919061201d565b1580156109055750825160208401516040808601519051634d69ee5760e01b81526001600160a01b03851693634d69ee57936108b593919290919060040161225e565b60206040518083038186803b1580156108cd57600080fd5b505afa1580156108e1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610905919061201d565b9392505050565b6000808361094e6040518060400160405280601a81526020017f4f564d5f4c3243726f7373446f6d61696e4d657373656e676572000000000000815250610221565b60405160200161095f929190612157565b60405160208183030381529060405280519060200120600060405160200161098892919061212d565b6040516020818303038152906040528051906020012090506000806109d7602160991b6040516020016109bb919061210c565b60408051601f1981840301815291905260608701518751610a69565b90925090506001821515146109fe5760405162461bcd60e51b815260040161035b90612465565b6000610a0982610a92565b9050610a5e84604051602001610a1f9190612124565b6040516020818303038152906040526001604051602001610a4091906121c3565b60405160208183030381529060405288608001518460400151610b24565b979650505050505050565b600060606000610a7886610b48565b9050610a85818686610b78565b9250925050935093915050565b610a9a611bb7565b6000610aa583610c4b565b90506040518060800160405280610acf83600081518110610ac257fe5b6020026020010151610c5e565b8152602001610ae483600181518110610ac257fe5b8152602001610b0683600281518110610af957fe5b6020026020010151610c65565b8152602001610b1b83600381518110610af957fe5b90529392505050565b600080610b3086610b48565b9050610b3e81868686610d5e565b9695505050505050565b60608180519060200120604051602001610b629190612124565b6040516020818303038152906040529050919050565b600060606000610b8785610d84565b90506000806000610b99848a89610e5b565b81519295509093509150158080610bad5750815b610bfe576040805162461bcd60e51b815260206004820152601a60248201527f50726f76696465642070726f6f6620697320696e76616c69642e000000000000604482015290519081900360640190fd5b600081610c1a5760405180602001604052806000815250610c39565b610c39866001870381518110610c2c57fe5b60200260200101516111fe565b919b919a509098505050505050505050565b60606107a9610c598361121a565b61123f565b60006107a9825b6000602182600001511115610cc1576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e000000000000604482015290519081900360640190fd5b6000806000610ccf856113b5565b919450925090506000816001811115610ce457fe5b14610d36576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e000000000000604482015290519081900360640190fd5b602080860151840180519091841015610b3e5760208490036101000a90049695505050505050565b6000806000610d6e878686610b78565b91509150818015610a5e5750610a5e86826116de565b60606000610d9183610c4b565b90506000815167ffffffffffffffff81118015610dad57600080fd5b50604051908082528060200260200182016040528015610de757816020015b610dd4611bde565b815260200190600190039081610dcc5790505b50905060005b8251811015610e53576000610e14848381518110610e0757fe5b60200260200101516116f4565b90506040518060400160405280828152602001610e3083610c4b565b815250838381518110610e3f57fe5b602090810291909101015250600101610ded565b509392505050565b60006060818080610e6b87611783565b905085600080610e79611bde565b60005b8c518110156111d6578c8181518110610e9157fe5b6020026020010151915082840193506001870196508360001415610f0557815180516020909101208514610f00576040805162461bcd60e51b8152602060048201526011602482015270092dcecc2d8d2c840e4dedee840d0c2e6d607b1b604482015290519081900360640190fd5b610fcc565b815151602011610f6c57815180516020909101208514610f00576040805162461bcd60e51b815260206004820152601b60248201527f496e76616c6964206c6172676520696e7465726e616c20686173680000000000604482015290519081900360640190fd5b84610f7a8360000151611880565b14610fcc576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420696e7465726e616c206e6f64652068617368000000000000604482015290519081900360640190fd5b6020820151516011141561103b578551841415610fe8576111d6565b6000868581518110610ff657fe5b602001015160f81c60f81b60f81c9050600083602001518260ff168151811061101b57fe5b6020026020010151905061102e816118ac565b96506001945050506111ce565b60028260200151511415611181576000611054836118e2565b905060008160008151811061106557fe5b016020015160f81c90506001811660020360006110858460ff8416611900565b905060006110938b8a611900565b905060006110a18383611931565b905060ff8516600214806110b8575060ff85166003145b156110ea578083511480156110cd5750808251145b156110d757988901985b50600160ff1b99506111d6945050505050565b60ff851615806110fd575060ff85166001145b1561114a578061111a5750600160ff1b99506111d6945050505050565b61113b886020015160018151811061112e57fe5b60200260200101516118ac565b9a5097506111ce945050505050565b60405162461bcd60e51b815260040180806020018281038252602681526020018061256b6026913960400191505060405180910390fd5b6040805162461bcd60e51b815260206004820152601d60248201527f526563656976656420616e20756e706172736561626c65206e6f64652e000000604482015290519081900360640190fd5b600101610e7c565b50600160ff1b8414866111e98786611900565b909e909d50909b509950505050505050505050565b602081015180516060916107a9916000198101908110610e0757fe5b611222611bf8565b506040805180820190915281518152602082810190820152919050565b606060008061124d846113b5565b9193509091506001905081600181111561126357fe5b146112b5576040805162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c50206c6973742076616c75652e000000000000000000604482015290519081900360640190fd5b6040805160208082526104208201909252600091816020015b6112d6611bf8565b8152602001906001900390816112ce5790505090506000835b86518110156113aa57602082106113375760405162461bcd60e51b815260040180806020018281038252602a815260200180612541602a913960400191505060405180910390fd5b6000806113636040518060400160405280858c60000151038152602001858c60200151018152506113b5565b509150915060405180604001604052808383018152602001848b602001510181525085858151811061139157fe5b60209081029190910101526001939093019201016112ef565b508152949350505050565b600080600080846000015111611412576040805162461bcd60e51b815260206004820152601860248201527f524c50206974656d2063616e6e6f74206265206e756c6c2e0000000000000000604482015290519081900360640190fd5b6020840151805160001a607f81116114375760006001600094509450945050506116d7565b60b781116114ac578551607f19820190811061149a576040805162461bcd60e51b815260206004820152601960248201527f496e76616c696420524c502073686f727420737472696e672e00000000000000604482015290519081900360640190fd5b600195509350600092506116d7915050565b60bf811161159057855160b619820190811061150f576040805162461bcd60e51b815260206004820152601f60248201527f496e76616c696420524c50206c6f6e6720737472696e67206c656e6774682e00604482015290519081900360640190fd5b6000816020036101000a600185015104905080820188600001511161157b576040805162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c50206c6f6e6720737472696e672e0000000000000000604482015290519081900360640190fd5b600190910195509350600092506116d7915050565b60f7811161160457855160bf1982019081106115f3576040805162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c502073686f7274206c6973742e000000000000000000604482015290519081900360640190fd5b6001955093508492506116d7915050565b855160f619820190811061165f576040805162461bcd60e51b815260206004820152601d60248201527f496e76616c696420524c50206c6f6e67206c697374206c656e6774682e000000604482015290519081900360640190fd5b6000816020036101000a60018501510490508082018860000151116116c4576040805162461bcd60e51b815260206004820152601660248201527524b73b30b634b210292628103637b733903634b9ba1760511b604482015290519081900360640190fd5b60019182019650945092506116d7915050565b9193909250565b8051602091820120825192909101919091201490565b60606000806000611704856113b5565b91945092509050600081600181111561171957fe5b1461176b576040805162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c502062797465732076616c75652e0000000000000000604482015290519081900360640190fd5b61177a85602001518484611997565b95945050505050565b60606000825160020267ffffffffffffffff811180156117a257600080fd5b506040519080825280601f01601f1916602001820160405280156117cd576020820181803683370190505b50905060005b83518110156118795760048482815181106117ea57fe5b602001015160f81c60f81b6001600160f81b031916901c82826002028151811061181057fe5b60200101906001600160f81b031916908160001a905350601084828151811061183557fe5b016020015160f81c8161184457fe5b0660f81b82826002026001018151811061185a57fe5b60200101906001600160f81b031916908160001a9053506001016117d3565b5092915050565b6000602082511015611897575060208101516102f8565b8180602001905160208110156102f357600080fd5b600060606020836000015110156118cd576118c683611a45565b90506118d9565b6118d6836116f4565b90505b61090581611880565b60606107a96118fb8360200151600081518110610e0757fe5b611783565b6060818351036000141561192357506040805160208101909152600081526107a9565b6107a6838384865103611a50565b6000805b8084511180156119455750808351115b801561198a575082818151811061195857fe5b602001015160f81c60f81b6001600160f81b03191684828151811061197957fe5b01602001516001600160f81b031916145b156107a657600101611935565b606060008267ffffffffffffffff811180156119b257600080fd5b506040519080825280601f01601f1916602001820160405280156119dd576020820181803683370190505b5090508051600014156119f1579050610905565b8484016020820160005b60208604811015611a1c5782518252602092830192909101906001016119fb565b5080519151601f959095166020036101000a600019019182169119909416179092525092915050565b60606107a982611ba1565b60608182601f011015611a9b576040805162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b604482015290519081900360640190fd5b828284011015611ae3576040805162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b604482015290519081900360640190fd5b81830184511015611b2f576040805162461bcd60e51b8152602060048201526011602482015270736c6963655f6f75744f66426f756e647360781b604482015290519081900360640190fd5b606082158015611b4e5760405191506000825260208201604052611b98565b6040519150601f8416801560200281840101858101878315602002848b0101015b81831015611b87578051835260209283019201611b6f565b5050858452601f01601f1916604052505b50949350505050565b60606107a9826020015160008460000151611997565b60408051608081018252600080825260208201819052918101829052606081019190915290565b604051806040016040528060608152602001606081525090565b604051806040016040528060008152602001600081525090565b600067ffffffffffffffff831115611c2657fe5b611c39601f8401601f19166020016124ec565b9050828152838383011115611c4d57600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b03811681146102f857600080fd5b600082601f830112611c8b578081fd5b6107a683833560208501611c12565b600060a08284031215611cab578081fd5b60405160a0810167ffffffffffffffff8282108183111715611cc957fe5b81604052829350843583526020850135602084015260408501356040840152606085013560608401526080850135915080821115611d0657600080fd5b50611d1385828601611c7b565b6080830152505092915050565b600060408284031215611d31578081fd5b6040516040810167ffffffffffffffff8282108183111715611d4f57fe5b8160405282935084358352602091508185013581811115611d6f57600080fd5b8501601f81018713611d8057600080fd5b803582811115611d8c57fe5b8381029250611d9c8484016124ec565b8181528481019083860185850187018b1015611db757600080fd5b600095505b83861015611dda578035835260019590950194918601918601611dbc565b5080868801525050505050505092915050565b803563ffffffff811681146102f857600080fd5b600060208284031215611e12578081fd5b6107a682611c64565b600080600080600060a08688031215611e32578081fd5b611e3b86611c64565b9450611e4960208701611c64565b9350604086013567ffffffffffffffff80821115611e65578283fd5b611e7189838a01611c7b565b9450606088013593506080880135915080821115611e8d578283fd5b9087019060a0828a031215611ea0578283fd5b611eaa60a06124ec565b82358152602083013582811115611ebf578485fd5b611ecb8b828601611c9a565b602083015250604083013582811115611ee2578485fd5b611eee8b828601611d20565b604083015250606083013582811115611f05578485fd5b611f118b828601611c7b565b606083015250608083013582811115611f28578485fd5b611f348b828601611c7b565b6080830152508093505050509295509295909350565b600080600080600060a08688031215611f61578081fd5b611f6a86611c64565b9450611f7860208701611c64565b9350604086013567ffffffffffffffff811115611f93578182fd5b611f9f88828901611c7b565b93505060608601359150611fb560808701611ded565b90509295509295909350565b600080600060608486031215611fd5578283fd5b611fde84611c64565b9250602084013567ffffffffffffffff811115611ff9578283fd5b61200586828701611c7b565b92505061201460408501611ded565b90509250925092565b60006020828403121561202e578081fd5b815180151581146107a6578182fd5b60006020828403121561204e578081fd5b5035919050565b600060208284031215612066578081fd5b813567ffffffffffffffff81111561207c578182fd5b8201601f8101841361208c578182fd5b61209b84823560208401611c12565b949350505050565b600081518084526120bb816020860160208601612510565b601f01601f19169290920160200192915050565b600081518352602082015160208401526040820151604084015260608201516060840152608082015160a0608085015261209b60a08501826120a3565b60609190911b6001600160601b031916815260140190565b90815260200190565b918252602082015260400190565b6000825161214d818460208701612510565b9190910192915050565b60008351612169818460208801612510565b60609390931b6001600160601b0319169190920190815260140192915050565b6000845161219b818460208901612510565b60609490941b6001600160601b03191691909301908152601481019190915260340192915050565b60f89190911b6001600160f81b031916815260010190565b6001600160a01b0391909116815260200190565b6001600160a01b0385811682528416602082015260806040820181905260009061221b908301856120a3565b905082606083015295945050505050565b600060018060a01b03851682528360208301526060604083015261177a60608301846120a3565b901515815260200190565b6000848252602060608184015261227860608401866120cf565b838103604085015260408101855182528286015160408484015281815180845260608501915085830194508693505b808410156122c757845182529385019360019390930192908501906122a7565b509998505050505050505050565b6000602082526107a660208301846120a3565b6020808252602b908201527f50726f7669646564206d6573736167652068617320616c72656164792062656560408201526a37103932b1b2b4bb32b21760a91b606082015260800190565b6020808252602b908201527f50726f7669646564206d65737361676520686173206e6f7420616c726561647960408201526a103132b2b71039b2b73a1760a91b606082015260800190565b60208082526036908201527f4f6e6c79204f564d5f4c324d65737361676552656c617965722063616e2072656040820152753630bc90261916ba3796a6189036b2b9b9b0b3b2b99760511b606082015260800190565b60208082526027908201527f50726f7669646564206d65737361676520636f756c64206e6f742062652076656040820152663934b334b2b21760c91b606082015260800190565b6020808252602a908201527f4c3143726f7373446f6d61696e4d657373656e67657220616c72656164792069604082015269373a34b0b634bd32b21760b11b606082015260800190565b6020808252604e908201527f4d6573736167652070617373696e6720707265636f6d70696c6520686173206e60408201527f6f74206265656e20696e697469616c697a6564206f7220696e76616c6964207060608201526d3937b7b310383937bb34b232b21760911b608082015260a00190565b6000602082526107a660208301846120cf565b60405181810167ffffffffffffffff8111828210171561250857fe5b604052919050565b60005b8381101561252b578181015183820152602001612513565b8381111561253a576000848401525b5050505056fe50726f766964656420524c50206c6973742065786365656473206d6178206c697374206c656e6774682e52656365697665642061206e6f6465207769746820616e20756e6b6e6f776e20707265666978a2646970667358221220ae7749addc98d54af4f2ee40764425eeab8281fa56632aa683ab7fadbe10912764736f6c63430007060033", - "devdoc": { - "details": "This contract lives on L1. It sends L1->L2 messages into L2, and relays L2->L1 messages from L2 to their target on L1.", - "kind": "dev", - "methods": { - "initialize(address)": { - "params": { - "_libAddressManager": "Address of the Address Manager." - } - }, - "relayMessage(address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))": { - "params": { - "_message": "Message to send to the target.", - "_messageNonce": "Nonce for the provided message.", - "_proof": "Inclusion proof for the given message.", - "_sender": "Message sender address.", - "_target": "Target contract address." - } - }, - "replayMessage(address,address,bytes,uint256,uint32)": { - "params": { - "_gasLimit": "Gas limit for the provided message.", - "_message": "Message to send to the target.", - "_messageNonce": "Nonce for the provided message.", - "_sender": "Original sender address.", - "_target": "Target contract address." - } - }, - "sendMessage(address,bytes,uint32)": { - "params": { - "_gasLimit": "Gas limit for the provided message.", - "_message": "Message to send to the target.", - "_target": "Target contract address." - } - } - }, - "title": "OVM_L1CrossDomainMessenger", - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": { - "constructor": { - "notice": "Pass a default zero address to the address resolver. This will be updated when initialized." - }, - "relayMessage(address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))": { - "notice": "Relays a cross domain message to a contract." - }, - "replayMessage(address,address,bytes,uint256,uint32)": { - "notice": "Replays a cross domain message to the target messenger." - }, - "sendMessage(address,bytes,uint32)": { - "notice": "Sends a cross domain message to the target messenger." - } - }, - "version": 1 - }, - "storageLayout": { - "storage": [ - { - "astId": 16313, - "contract": "contracts/optimistic-ethereum/OVM/bridge/OVM_L1CrossDomainMessenger.sol:OVM_L1CrossDomainMessenger", - "label": "_status", - "offset": 0, - "slot": "0", - "type": "t_uint256" - }, - { - "astId": 679, - "contract": "contracts/optimistic-ethereum/OVM/bridge/OVM_L1CrossDomainMessenger.sol:OVM_L1CrossDomainMessenger", - "label": "relayedMessages", - "offset": 0, - "slot": "1", - "type": "t_mapping(t_bytes32,t_bool)" - }, - { - "astId": 683, - "contract": "contracts/optimistic-ethereum/OVM/bridge/OVM_L1CrossDomainMessenger.sol:OVM_L1CrossDomainMessenger", - "label": "successfulMessages", - "offset": 0, - "slot": "2", - "type": "t_mapping(t_bytes32,t_bool)" - }, - { - "astId": 687, - "contract": "contracts/optimistic-ethereum/OVM/bridge/OVM_L1CrossDomainMessenger.sol:OVM_L1CrossDomainMessenger", - "label": "sentMessages", - "offset": 0, - "slot": "3", - "type": "t_mapping(t_bytes32,t_bool)" - }, - { - "astId": 689, - "contract": "contracts/optimistic-ethereum/OVM/bridge/OVM_L1CrossDomainMessenger.sol:OVM_L1CrossDomainMessenger", - "label": "messageNonce", - "offset": 0, - "slot": "4", - "type": "t_uint256" - }, - { - "astId": 692, - "contract": "contracts/optimistic-ethereum/OVM/bridge/OVM_L1CrossDomainMessenger.sol:OVM_L1CrossDomainMessenger", - "label": "xDomainMessageSender", - "offset": 0, - "slot": "5", - "type": "t_address" - }, - { - "astId": 11707, - "contract": "contracts/optimistic-ethereum/OVM/bridge/OVM_L1CrossDomainMessenger.sol:OVM_L1CrossDomainMessenger", - "label": "libAddressManager", - "offset": 0, - "slot": "6", - "type": "t_contract(Lib_AddressManager)11700" - } - ], - "types": { - "t_address": { - "encoding": "inplace", - "label": "address", - "numberOfBytes": "20" - }, - "t_bool": { - "encoding": "inplace", - "label": "bool", - "numberOfBytes": "1" - }, - "t_bytes32": { - "encoding": "inplace", - "label": "bytes32", - "numberOfBytes": "32" - }, - "t_contract(Lib_AddressManager)11700": { - "encoding": "inplace", - "label": "contract Lib_AddressManager", - "numberOfBytes": "20" - }, - "t_mapping(t_bytes32,t_bool)": { - "encoding": "mapping", - "key": "t_bytes32", - "label": "mapping(bytes32 => bool)", - "numberOfBytes": "32", - "value": "t_bool" - }, - "t_uint256": { - "encoding": "inplace", - "label": "uint256", - "numberOfBytes": "32" - } - } - } -} \ No newline at end of file diff --git a/packages/contracts/deployments/goerli-v1/OVM_StateCommitmentChain.json b/packages/contracts/deployments/goerli-v1/OVM_StateCommitmentChain.json deleted file mode 100644 index 0391f86ddeecc..0000000000000 --- a/packages/contracts/deployments/goerli-v1/OVM_StateCommitmentChain.json +++ /dev/null @@ -1,504 +0,0 @@ -{ - "address": "0xAE493AD1fFCD654E6e4b78a66be3c9780a6ca89d", - "abi": [ - { - "inputs": [ - { - "internalType": "address", - "name": "_libAddressManager", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_fraudProofWindow", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_sequencerPublishWindow", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "_batchIndex", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "bytes32", - "name": "_batchRoot", - "type": "bytes32" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_batchSize", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_prevTotalElements", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "bytes", - "name": "_extraData", - "type": "bytes" - } - ], - "name": "StateBatchAppended", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "_batchIndex", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "bytes32", - "name": "_batchRoot", - "type": "bytes32" - } - ], - "name": "StateBatchDeleted", - "type": "event" - }, - { - "inputs": [], - "name": "FRAUD_PROOF_WINDOW", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "SEQUENCER_PUBLISH_WINDOW", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32[]", - "name": "_batch", - "type": "bytes32[]" - }, - { - "internalType": "uint256", - "name": "_shouldStartAtElement", - "type": "uint256" - } - ], - "name": "appendStateBatch", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "batches", - "outputs": [ - { - "internalType": "contract iOVM_ChainStorageContainer", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "components": [ - { - "internalType": "uint256", - "name": "batchIndex", - "type": "uint256" - }, - { - "internalType": "bytes32", - "name": "batchRoot", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "batchSize", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "prevTotalElements", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "extraData", - "type": "bytes" - } - ], - "internalType": "struct Lib_OVMCodec.ChainBatchHeader", - "name": "_batchHeader", - "type": "tuple" - } - ], - "name": "deleteStateBatch", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "getLastSequencerTimestamp", - "outputs": [ - { - "internalType": "uint256", - "name": "_lastSequencerTimestamp", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getTotalBatches", - "outputs": [ - { - "internalType": "uint256", - "name": "_totalBatches", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getTotalElements", - "outputs": [ - { - "internalType": "uint256", - "name": "_totalElements", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "components": [ - { - "internalType": "uint256", - "name": "batchIndex", - "type": "uint256" - }, - { - "internalType": "bytes32", - "name": "batchRoot", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "batchSize", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "prevTotalElements", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "extraData", - "type": "bytes" - } - ], - "internalType": "struct Lib_OVMCodec.ChainBatchHeader", - "name": "_batchHeader", - "type": "tuple" - } - ], - "name": "insideFraudProofWindow", - "outputs": [ - { - "internalType": "bool", - "name": "_inside", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "string", - "name": "_name", - "type": "string" - } - ], - "name": "resolve", - "outputs": [ - { - "internalType": "address", - "name": "_contract", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "_element", - "type": "bytes32" - }, - { - "components": [ - { - "internalType": "uint256", - "name": "batchIndex", - "type": "uint256" - }, - { - "internalType": "bytes32", - "name": "batchRoot", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "batchSize", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "prevTotalElements", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "extraData", - "type": "bytes" - } - ], - "internalType": "struct Lib_OVMCodec.ChainBatchHeader", - "name": "_batchHeader", - "type": "tuple" - }, - { - "components": [ - { - "internalType": "uint256", - "name": "index", - "type": "uint256" - }, - { - "internalType": "bytes32[]", - "name": "siblings", - "type": "bytes32[]" - } - ], - "internalType": "struct Lib_OVMCodec.ChainInclusionProof", - "name": "_proof", - "type": "tuple" - } - ], - "name": "verifyStateCommitment", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - } - ], - "transactionHash": "0xb39654f6dfba167749e5ed12a67f10721f84abd56328a468a2a0ec665eeef725", - "receipt": { - "to": null, - "from": "0x558ba9b8d78713fbf768c1f8a584485B4003f43F", - "contractAddress": "0xE1A99Ff67B5c92502bA94b5337576de3624cb512", - "transactionIndex": 0, - "gasUsed": "1626450", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0xdcbf3bbc2709ed51ce548a98413a3f341a8fc245c4a435e7570e9aee5d2d95f3", - "transactionHash": "0xb39654f6dfba167749e5ed12a67f10721f84abd56328a468a2a0ec665eeef725", - "logs": [], - "blockNumber": 4573386, - "cumulativeGasUsed": "1626450", - "status": 1, - "byzantium": true - }, - "args": [ - "0xE630cdf302880783364334455C8352fE0aB5b748", - 604800, - 1800 - ], - "solcInputHash": "cebcb515c1a9c570d96e0b8f6fd237e2", - "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_fraudProofWindow\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_sequencerPublishWindow\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_batchIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"_batchRoot\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_batchSize\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_prevTotalElements\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"_extraData\",\"type\":\"bytes\"}],\"name\":\"StateBatchAppended\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_batchIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"_batchRoot\",\"type\":\"bytes32\"}],\"name\":\"StateBatchDeleted\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"FRAUD_PROOF_WINDOW\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"SEQUENCER_PUBLISH_WINDOW\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"_batch\",\"type\":\"bytes32[]\"},{\"internalType\":\"uint256\",\"name\":\"_shouldStartAtElement\",\"type\":\"uint256\"}],\"name\":\"appendStateBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"batches\",\"outputs\":[{\"internalType\":\"contract iOVM_ChainStorageContainer\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"_batchHeader\",\"type\":\"tuple\"}],\"name\":\"deleteStateBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLastSequencerTimestamp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_lastSequencerTimestamp\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTotalBatches\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_totalBatches\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTotalElements\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_totalElements\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"_batchHeader\",\"type\":\"tuple\"}],\"name\":\"insideFraudProofWindow\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"_inside\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"_contract\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_element\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"_batchHeader\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"siblings\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct Lib_OVMCodec.ChainInclusionProof\",\"name\":\"_proof\",\"type\":\"tuple\"}],\"name\":\"verifyStateCommitment\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"appendStateBatch(bytes32[],uint256)\":{\"params\":{\"_batch\":\"Batch of state roots.\",\"_shouldStartAtElement\":\"Index of the element at which this batch should start.\"}},\"batches()\":{\"returns\":{\"_0\":\"Reference to the batch storage container.\"}},\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\"}},\"deleteStateBatch((uint256,bytes32,uint256,uint256,bytes))\":{\"params\":{\"_batchHeader\":\"Header of the batch to start deleting from.\"}},\"getLastSequencerTimestamp()\":{\"returns\":{\"_lastSequencerTimestamp\":\"Last sequencer batch timestamp.\"}},\"getTotalBatches()\":{\"returns\":{\"_totalBatches\":\"Total submitted batches.\"}},\"getTotalElements()\":{\"returns\":{\"_totalElements\":\"Total submitted elements.\"}},\"insideFraudProofWindow((uint256,bytes32,uint256,uint256,bytes))\":{\"params\":{\"_batchHeader\":\"Header of the batch to check.\"},\"returns\":{\"_inside\":\"Whether or not the batch is inside the fraud proof window.\"}},\"verifyStateCommitment(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))\":{\"params\":{\"_batchHeader\":\"Header of the batch in which the element was included.\",\"_element\":\"Hash of the element to verify a proof for.\",\"_proof\":\"Merkle inclusion proof for the element.\"}}},\"title\":\"OVM_StateCommitmentChain\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"appendStateBatch(bytes32[],uint256)\":{\"notice\":\"Appends a batch of state roots to the chain.\"},\"batches()\":{\"notice\":\"Accesses the batch storage container.\"},\"deleteStateBatch((uint256,bytes32,uint256,uint256,bytes))\":{\"notice\":\"Deletes all state roots after (and including) a given batch.\"},\"getLastSequencerTimestamp()\":{\"notice\":\"Retrieves the timestamp of the last batch submitted by the sequencer.\"},\"getTotalBatches()\":{\"notice\":\"Retrieves the total number of batches submitted.\"},\"getTotalElements()\":{\"notice\":\"Retrieves the total number of elements submitted.\"},\"insideFraudProofWindow((uint256,bytes32,uint256,uint256,bytes))\":{\"notice\":\"Checks whether a given batch is still inside its fraud proof window.\"},\"verifyStateCommitment(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))\":{\"notice\":\"Verifies a batch inclusion proof.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/OVM/chain/OVM_StateCommitmentChain.sol\":\"OVM_StateCommitmentChain\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/math/SafeMath.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\n * checks.\\n *\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\n * in bugs, because programmers usually assume that an overflow raises an\\n * error, which is the standard behavior in high level programming languages.\\n * `SafeMath` restores this intuition by reverting the transaction when an\\n * operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n */\\nlibrary SafeMath {\\n /**\\n * @dev Returns the addition of two unsigned integers, with an overflow flag.\\n *\\n * _Available since v3.4._\\n */\\n function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n uint256 c = a + b;\\n if (c < a) return (false, 0);\\n return (true, c);\\n }\\n\\n /**\\n * @dev Returns the substraction of two unsigned integers, with an overflow flag.\\n *\\n * _Available since v3.4._\\n */\\n function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n if (b > a) return (false, 0);\\n return (true, a - b);\\n }\\n\\n /**\\n * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\\n *\\n * _Available since v3.4._\\n */\\n function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\n // benefit is lost if 'b' is also tested.\\n // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\n if (a == 0) return (true, 0);\\n uint256 c = a * b;\\n if (c / a != b) return (false, 0);\\n return (true, c);\\n }\\n\\n /**\\n * @dev Returns the division of two unsigned integers, with a division by zero flag.\\n *\\n * _Available since v3.4._\\n */\\n function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n if (b == 0) return (false, 0);\\n return (true, a / b);\\n }\\n\\n /**\\n * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\\n *\\n * _Available since v3.4._\\n */\\n function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n if (b == 0) return (false, 0);\\n return (true, a % b);\\n }\\n\\n /**\\n * @dev Returns the addition of two unsigned integers, reverting on\\n * overflow.\\n *\\n * Counterpart to Solidity's `+` operator.\\n *\\n * Requirements:\\n *\\n * - Addition cannot overflow.\\n */\\n function add(uint256 a, uint256 b) internal pure returns (uint256) {\\n uint256 c = a + b;\\n require(c >= a, \\\"SafeMath: addition overflow\\\");\\n return c;\\n }\\n\\n /**\\n * @dev Returns the subtraction of two unsigned integers, reverting on\\n * overflow (when the result is negative).\\n *\\n * Counterpart to Solidity's `-` operator.\\n *\\n * Requirements:\\n *\\n * - Subtraction cannot overflow.\\n */\\n function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\n require(b <= a, \\\"SafeMath: subtraction overflow\\\");\\n return a - b;\\n }\\n\\n /**\\n * @dev Returns the multiplication of two unsigned integers, reverting on\\n * overflow.\\n *\\n * Counterpart to Solidity's `*` operator.\\n *\\n * Requirements:\\n *\\n * - Multiplication cannot overflow.\\n */\\n function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\n if (a == 0) return 0;\\n uint256 c = a * b;\\n require(c / a == b, \\\"SafeMath: multiplication overflow\\\");\\n return c;\\n }\\n\\n /**\\n * @dev Returns the integer division of two unsigned integers, reverting on\\n * division by zero. The result is rounded towards zero.\\n *\\n * Counterpart to Solidity's `/` operator. Note: this function uses a\\n * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n * uses an invalid opcode to revert (consuming all remaining gas).\\n *\\n * Requirements:\\n *\\n * - The divisor cannot be zero.\\n */\\n function div(uint256 a, uint256 b) internal pure returns (uint256) {\\n require(b > 0, \\\"SafeMath: division by zero\\\");\\n return a / b;\\n }\\n\\n /**\\n * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n * reverting when dividing by zero.\\n *\\n * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n * opcode (which leaves remaining gas untouched) while Solidity uses an\\n * invalid opcode to revert (consuming all remaining gas).\\n *\\n * Requirements:\\n *\\n * - The divisor cannot be zero.\\n */\\n function mod(uint256 a, uint256 b) internal pure returns (uint256) {\\n require(b > 0, \\\"SafeMath: modulo by zero\\\");\\n return a % b;\\n }\\n\\n /**\\n * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\n * overflow (when the result is negative).\\n *\\n * CAUTION: This function is deprecated because it requires allocating memory for the error\\n * message unnecessarily. For custom revert reasons use {trySub}.\\n *\\n * Counterpart to Solidity's `-` operator.\\n *\\n * Requirements:\\n *\\n * - Subtraction cannot overflow.\\n */\\n function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n require(b <= a, errorMessage);\\n return a - b;\\n }\\n\\n /**\\n * @dev Returns the integer division of two unsigned integers, reverting with custom message on\\n * division by zero. The result is rounded towards zero.\\n *\\n * CAUTION: This function is deprecated because it requires allocating memory for the error\\n * message unnecessarily. For custom revert reasons use {tryDiv}.\\n *\\n * Counterpart to Solidity's `/` operator. Note: this function uses a\\n * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n * uses an invalid opcode to revert (consuming all remaining gas).\\n *\\n * Requirements:\\n *\\n * - The divisor cannot be zero.\\n */\\n function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n require(b > 0, errorMessage);\\n return a / b;\\n }\\n\\n /**\\n * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n * reverting with custom message when dividing by zero.\\n *\\n * CAUTION: This function is deprecated because it requires allocating memory for the error\\n * message unnecessarily. For custom revert reasons use {tryMod}.\\n *\\n * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n * opcode (which leaves remaining gas untouched) while Solidity uses an\\n * invalid opcode to revert (consuming all remaining gas).\\n *\\n * Requirements:\\n *\\n * - The divisor cannot be zero.\\n */\\n function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n require(b > 0, errorMessage);\\n return a % b;\\n }\\n}\\n\",\"keccak256\":\"0xcc78a17dd88fa5a2edc60c8489e2f405c0913b377216a5b26b35656b2d0dab52\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/chain/OVM_StateCommitmentChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.7.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\nimport { Lib_MerkleTree } from \\\"../../libraries/utils/Lib_MerkleTree.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_FraudVerifier } from \\\"../../iOVM/verification/iOVM_FraudVerifier.sol\\\";\\nimport { iOVM_StateCommitmentChain } from \\\"../../iOVM/chain/iOVM_StateCommitmentChain.sol\\\";\\nimport { iOVM_CanonicalTransactionChain } from \\\"../../iOVM/chain/iOVM_CanonicalTransactionChain.sol\\\";\\nimport { iOVM_BondManager } from \\\"../../iOVM/verification/iOVM_BondManager.sol\\\";\\nimport { iOVM_ChainStorageContainer } from \\\"../../iOVM/chain/iOVM_ChainStorageContainer.sol\\\";\\n\\n/* External Imports */\\nimport '@openzeppelin/contracts/math/SafeMath.sol';\\n\\n/**\\n * @title OVM_StateCommitmentChain\\n */\\ncontract OVM_StateCommitmentChain is iOVM_StateCommitmentChain, Lib_AddressResolver {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 public FRAUD_PROOF_WINDOW;\\n uint256 public SEQUENCER_PUBLISH_WINDOW;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n */\\n constructor(\\n address _libAddressManager,\\n uint256 _fraudProofWindow,\\n uint256 _sequencerPublishWindow\\n )\\n Lib_AddressResolver(_libAddressManager)\\n {\\n FRAUD_PROOF_WINDOW = _fraudProofWindow;\\n SEQUENCER_PUBLISH_WINDOW = _sequencerPublishWindow;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Accesses the batch storage container.\\n * @return Reference to the batch storage container.\\n */\\n function batches()\\n public\\n view\\n returns (\\n iOVM_ChainStorageContainer\\n )\\n {\\n return iOVM_ChainStorageContainer(\\n resolve(\\\"OVM_ChainStorageContainer:SCC:batches\\\")\\n );\\n }\\n\\n /**\\n * @inheritdoc iOVM_StateCommitmentChain\\n */\\n function getTotalElements()\\n override\\n public\\n view\\n returns (\\n uint256 _totalElements\\n )\\n {\\n (uint40 totalElements, ) = _getBatchExtraData();\\n return uint256(totalElements);\\n }\\n\\n /**\\n * @inheritdoc iOVM_StateCommitmentChain\\n */\\n function getTotalBatches()\\n override\\n public\\n view\\n returns (\\n uint256 _totalBatches\\n )\\n {\\n return batches().length();\\n }\\n\\n /**\\n * @inheritdoc iOVM_StateCommitmentChain\\n */\\n function getLastSequencerTimestamp()\\n override\\n public\\n view\\n returns (\\n uint256 _lastSequencerTimestamp\\n )\\n {\\n (, uint40 lastSequencerTimestamp) = _getBatchExtraData();\\n return uint256(lastSequencerTimestamp);\\n }\\n\\n /**\\n * @inheritdoc iOVM_StateCommitmentChain\\n */\\n function appendStateBatch(\\n bytes32[] memory _batch,\\n uint256 _shouldStartAtElement\\n )\\n override\\n public\\n {\\n // Fail fast in to make sure our batch roots aren't accidentally made fraudulent by the\\n // publication of batches by some other user.\\n require(\\n _shouldStartAtElement == getTotalElements(),\\n \\\"Actual batch start index does not match expected start index.\\\"\\n );\\n\\n // Proposers must have previously staked at the BondManager\\n require(\\n iOVM_BondManager(resolve(\\\"OVM_BondManager\\\")).isCollateralized(msg.sender),\\n \\\"Proposer does not have enough collateral posted\\\"\\n );\\n\\n require(\\n _batch.length > 0,\\n \\\"Cannot submit an empty state batch.\\\"\\n );\\n\\n require(\\n getTotalElements() + _batch.length <= iOVM_CanonicalTransactionChain(resolve(\\\"OVM_CanonicalTransactionChain\\\")).getTotalElements(),\\n \\\"Number of state roots cannot exceed the number of canonical transactions.\\\"\\n );\\n\\n // Pass the block's timestamp and the publisher of the data\\n // to be used in the fraud proofs\\n _appendBatch(\\n _batch,\\n abi.encode(block.timestamp, msg.sender)\\n );\\n }\\n\\n /**\\n * @inheritdoc iOVM_StateCommitmentChain\\n */\\n function deleteStateBatch(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n override\\n public\\n {\\n require(\\n msg.sender == resolve(\\\"OVM_FraudVerifier\\\"),\\n \\\"State batches can only be deleted by the OVM_FraudVerifier.\\\"\\n );\\n\\n require(\\n _isValidBatchHeader(_batchHeader),\\n \\\"Invalid batch header.\\\"\\n );\\n\\n require(\\n insideFraudProofWindow(_batchHeader),\\n \\\"State batches can only be deleted within the fraud proof window.\\\"\\n );\\n\\n _deleteBatch(_batchHeader);\\n }\\n\\n /**\\n * @inheritdoc iOVM_StateCommitmentChain\\n */\\n function verifyStateCommitment(\\n bytes32 _element,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _proof\\n )\\n override\\n public\\n view\\n returns (\\n bool\\n )\\n {\\n require(\\n _isValidBatchHeader(_batchHeader),\\n \\\"Invalid batch header.\\\"\\n );\\n\\n require(\\n Lib_MerkleTree.verify(\\n _batchHeader.batchRoot,\\n _element,\\n _proof.index,\\n _proof.siblings,\\n _batchHeader.batchSize\\n ),\\n \\\"Invalid inclusion proof.\\\"\\n );\\n\\n return true;\\n }\\n\\n /**\\n * @inheritdoc iOVM_StateCommitmentChain\\n */\\n function insideFraudProofWindow(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n override\\n public\\n view\\n returns (\\n bool _inside\\n )\\n {\\n (uint256 timestamp,) = abi.decode(\\n _batchHeader.extraData,\\n (uint256, address)\\n );\\n\\n require(\\n timestamp != 0,\\n \\\"Batch header timestamp cannot be zero\\\"\\n );\\n return SafeMath.add(timestamp, FRAUD_PROOF_WINDOW) > block.timestamp;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Parses the batch context from the extra data.\\n * @return Total number of elements submitted.\\n * @return Timestamp of the last batch submitted by the sequencer.\\n */\\n function _getBatchExtraData()\\n internal\\n view\\n returns (\\n uint40,\\n uint40\\n )\\n {\\n bytes27 extraData = batches().getGlobalMetadata();\\n\\n uint40 totalElements;\\n uint40 lastSequencerTimestamp;\\n assembly {\\n extraData := shr(40, extraData)\\n totalElements := and(extraData, 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF)\\n lastSequencerTimestamp := shr(40, and(extraData, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000))\\n }\\n\\n return (\\n totalElements,\\n lastSequencerTimestamp\\n );\\n }\\n\\n /**\\n * Encodes the batch context for the extra data.\\n * @param _totalElements Total number of elements submitted.\\n * @param _lastSequencerTimestamp Timestamp of the last batch submitted by the sequencer.\\n * @return Encoded batch context.\\n */\\n function _makeBatchExtraData(\\n uint40 _totalElements,\\n uint40 _lastSequencerTimestamp\\n )\\n internal\\n pure\\n returns (\\n bytes27\\n )\\n {\\n bytes27 extraData;\\n assembly {\\n extraData := _totalElements\\n extraData := or(extraData, shl(40, _lastSequencerTimestamp))\\n extraData := shl(40, extraData)\\n }\\n\\n return extraData;\\n }\\n\\n /**\\n * Appends a batch to the chain.\\n * @param _batch Elements within the batch.\\n * @param _extraData Any extra data to append to the batch.\\n */\\n function _appendBatch(\\n bytes32[] memory _batch,\\n bytes memory _extraData\\n )\\n internal\\n {\\n address sequencer = resolve(\\\"OVM_Sequencer\\\");\\n (uint40 totalElements, uint40 lastSequencerTimestamp) = _getBatchExtraData();\\n\\n if (msg.sender == sequencer) {\\n lastSequencerTimestamp = uint40(block.timestamp);\\n } else {\\n // We keep track of the last batch submitted by the sequencer so there's a window in\\n // which only the sequencer can publish state roots. A window like this just reduces\\n // the chance of \\\"system breaking\\\" state roots being published while we're still in\\n // testing mode. This window should be removed or significantly reduced in the future.\\n require(\\n lastSequencerTimestamp + SEQUENCER_PUBLISH_WINDOW < block.timestamp,\\n \\\"Cannot publish state roots within the sequencer publication window.\\\"\\n );\\n }\\n\\n Lib_OVMCodec.ChainBatchHeader memory batchHeader = Lib_OVMCodec.ChainBatchHeader({\\n batchIndex: getTotalBatches(),\\n batchRoot: Lib_MerkleTree.getMerkleRoot(_batch),\\n batchSize: _batch.length,\\n prevTotalElements: totalElements,\\n extraData: _extraData\\n });\\n\\n emit StateBatchAppended(\\n batchHeader.batchIndex,\\n batchHeader.batchRoot,\\n batchHeader.batchSize,\\n batchHeader.prevTotalElements,\\n batchHeader.extraData\\n );\\n\\n batches().push(\\n Lib_OVMCodec.hashBatchHeader(batchHeader),\\n _makeBatchExtraData(\\n uint40(batchHeader.prevTotalElements + batchHeader.batchSize),\\n lastSequencerTimestamp\\n )\\n );\\n }\\n\\n /**\\n * Removes a batch and all subsequent batches from the chain.\\n * @param _batchHeader Header of the batch to remove.\\n */\\n function _deleteBatch(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n internal\\n {\\n require(\\n _batchHeader.batchIndex < batches().length(),\\n \\\"Invalid batch index.\\\"\\n );\\n\\n require(\\n _isValidBatchHeader(_batchHeader),\\n \\\"Invalid batch header.\\\"\\n );\\n\\n batches().deleteElementsAfterInclusive(\\n _batchHeader.batchIndex,\\n _makeBatchExtraData(\\n uint40(_batchHeader.prevTotalElements),\\n 0\\n )\\n );\\n\\n emit StateBatchDeleted(\\n _batchHeader.batchIndex,\\n _batchHeader.batchRoot\\n );\\n }\\n\\n /**\\n * Checks that a batch header matches the stored hash for the given index.\\n * @param _batchHeader Batch header to validate.\\n * @return Whether or not the header matches the stored one.\\n */\\n function _isValidBatchHeader(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n internal\\n view\\n returns (\\n bool\\n )\\n {\\n return Lib_OVMCodec.hashBatchHeader(_batchHeader) == batches().get(_batchHeader.batchIndex);\\n }\\n}\\n\",\"keccak256\":\"0xb93198fb1ea4469f21deb7329f5f0e1e3a826cd14a959fa4b8ffdd2cd325a715\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_CanonicalTransactionChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title iOVM_CanonicalTransactionChain\\n */\\ninterface iOVM_CanonicalTransactionChain {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event TransactionEnqueued(\\n address _l1TxOrigin,\\n address _target,\\n uint256 _gasLimit,\\n bytes _data,\\n uint256 _queueIndex,\\n uint256 _timestamp\\n );\\n\\n event QueueBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event SequencerBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event TransactionBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct BatchContext {\\n uint256 numSequencedTransactions;\\n uint256 numSubsequentQueueTransactions;\\n uint256 timestamp;\\n uint256 blockNumber;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements()\\n external\\n view\\n returns (\\n uint256 _totalElements\\n );\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches()\\n external\\n view\\n returns (\\n uint256 _totalBatches\\n );\\n\\n /**\\n * Returns the index of the next element to be enqueued.\\n * @return Index for the next queue element.\\n */\\n function getNextQueueIndex()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Get the number of queue elements which have not yet been included.\\n * @return Length of the queue.\\n */\\n function getNumPendingQueueElements()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Retrieves the length of the queue, including\\n * both pending and canonical transactions.\\n * @return Length of the queue.\\n */\\n function getQueueLength()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Gets the queue element at a particular index.\\n * @param _index Index of the queue element to access.\\n * @return _element Queue element at the given index.\\n */\\n function getQueueElement(\\n uint256 _index\\n )\\n external\\n view\\n returns (\\n Lib_OVMCodec.QueueElement memory _element\\n );\\n\\n /**\\n * Adds a transaction to the queue.\\n * @param _target Target contract to send the transaction to.\\n * @param _gasLimit Gas limit for the given transaction.\\n * @param _data Transaction data.\\n */\\n function enqueue(\\n address _target,\\n uint256 _gasLimit,\\n bytes memory _data\\n )\\n external;\\n\\n /**\\n * Appends a given number of queued transactions as a single batch.\\n * @param _numQueuedTransactions Number of transactions to append.\\n */\\n function appendQueueBatch(\\n uint256 _numQueuedTransactions\\n )\\n external;\\n\\n /**\\n * Allows the sequencer to append a batch of transactions.\\n * @dev This function uses a custom encoding scheme for efficiency reasons.\\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\\n * .param _contexts Array of batch contexts.\\n * .param _transactionDataFields Array of raw transaction data.\\n */\\n function appendSequencerBatch(\\n // uint40 _shouldStartAtElement,\\n // uint24 _totalElementsToAppend,\\n // BatchContext[] _contexts,\\n // bytes[] _transactionDataFields\\n )\\n external;\\n\\n /**\\n * Verifies whether a transaction is included in the chain.\\n * @param _transaction Transaction to verify.\\n * @param _txChainElement Transaction chain element corresponding to the transaction.\\n * @param _batchHeader Header of the batch the transaction was included in.\\n * @param _inclusionProof Inclusion proof for the provided transaction chain element.\\n * @return True if the transaction exists in the CTC, false if not.\\n */\\n function verifyTransaction(\\n Lib_OVMCodec.Transaction memory _transaction,\\n Lib_OVMCodec.TransactionChainElement memory _txChainElement,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _inclusionProof\\n )\\n external\\n view\\n returns (\\n bool\\n );\\n}\\n\",\"keccak256\":\"0x82a4e62286c8bc5e2d3de33f66d9b707cb9636e553dca54b5e95277bd794a934\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_ChainStorageContainer.sol\":{\"content\":\"pragma solidity ^0.7.0;\\n\\n/**\\n * @title iOVM_ChainStorageContainer\\n */\\ninterface iOVM_ChainStorageContainer {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata()\\n external\\n view\\n returns (\\n bytes27\\n );\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length()\\n external\\n view\\n returns (\\n uint256\\n );\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(\\n bytes32 _object\\n )\\n external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(\\n bytes32 _object,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Pushes two objects into the container at the same time. A useful optimization.\\n * @param _objectA First 32 byte value to insert into the container.\\n * @param _objectB Second 32 byte value to insert into the container.\\n */\\n function push2(\\n bytes32 _objectA,\\n bytes32 _objectB\\n )\\n external;\\n\\n /**\\n * Pushes two objects into the container at the same time. Also allows setting the global\\n * metadata field.\\n * @param _objectA First 32 byte value to insert into the container.\\n * @param _objectB Second 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push2(\\n bytes32 _objectA,\\n bytes32 _objectB,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(\\n uint256 _index\\n )\\n external\\n view\\n returns (\\n bytes32\\n );\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index\\n )\\n external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Marks an index as overwritable, meaing the underlying buffer can start to write values over\\n * any objects before and including the given index.\\n */\\n function setNextOverwritableIndex(\\n uint256 _index\\n )\\n external;\\n}\\n\",\"keccak256\":\"0xcfca7da85b35d94c27581c2460b0d48fd0cc51fa72670cc7a2f7f760fb21a2f0\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_StateCommitmentChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title iOVM_StateCommitmentChain\\n */\\ninterface iOVM_StateCommitmentChain {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event StateBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n event StateBatchDeleted(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot\\n );\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements()\\n external\\n view\\n returns (\\n uint256 _totalElements\\n );\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches()\\n external\\n view\\n returns (\\n uint256 _totalBatches\\n );\\n\\n /**\\n * Retrieves the timestamp of the last batch submitted by the sequencer.\\n * @return _lastSequencerTimestamp Last sequencer batch timestamp.\\n */\\n function getLastSequencerTimestamp()\\n external\\n view\\n returns (\\n uint256 _lastSequencerTimestamp\\n );\\n\\n /**\\n * Appends a batch of state roots to the chain.\\n * @param _batch Batch of state roots.\\n * @param _shouldStartAtElement Index of the element at which this batch should start.\\n */\\n function appendStateBatch(\\n bytes32[] calldata _batch,\\n uint256 _shouldStartAtElement\\n )\\n external;\\n\\n /**\\n * Deletes all state roots after (and including) a given batch.\\n * @param _batchHeader Header of the batch to start deleting from.\\n */\\n function deleteStateBatch(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n external;\\n\\n /**\\n * Verifies a batch inclusion proof.\\n * @param _element Hash of the element to verify a proof for.\\n * @param _batchHeader Header of the batch in which the element was included.\\n * @param _proof Merkle inclusion proof for the element.\\n */\\n function verifyStateCommitment(\\n bytes32 _element,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _proof\\n )\\n external\\n view\\n returns (\\n bool _verified\\n );\\n\\n /**\\n * Checks whether a given batch is still inside its fraud proof window.\\n * @param _batchHeader Header of the batch to check.\\n * @return _inside Whether or not the batch is inside the fraud proof window.\\n */\\n function insideFraudProofWindow(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n external\\n view\\n returns (\\n bool _inside\\n );\\n}\\n\",\"keccak256\":\"0x6646d6ff392b81aab52a7a277e91540819464751de0af5afd1962094b2e92448\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/verification/iOVM_BondManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\ninterface ERC20 {\\n function transfer(address, uint256) external returns (bool);\\n function transferFrom(address, address, uint256) external returns (bool);\\n}\\n\\n/// All the errors which may be encountered on the bond manager\\nlibrary Errors {\\n string constant ERC20_ERR = \\\"BondManager: Could not post bond\\\";\\n string constant ALREADY_FINALIZED = \\\"BondManager: Fraud proof for this pre-state root has already been finalized\\\";\\n string constant SLASHED = \\\"BondManager: Cannot finalize withdrawal, you probably got slashed\\\";\\n string constant WRONG_STATE = \\\"BondManager: Wrong bond state for proposer\\\";\\n string constant CANNOT_CLAIM = \\\"BondManager: Cannot claim yet. Dispute must be finalized first\\\";\\n\\n string constant WITHDRAWAL_PENDING = \\\"BondManager: Withdrawal already pending\\\";\\n string constant TOO_EARLY = \\\"BondManager: Too early to finalize your withdrawal\\\";\\n\\n string constant ONLY_TRANSITIONER = \\\"BondManager: Only the transitioner for this pre-state root may call this function\\\";\\n string constant ONLY_FRAUD_VERIFIER = \\\"BondManager: Only the fraud verifier may call this function\\\";\\n string constant ONLY_STATE_COMMITMENT_CHAIN = \\\"BondManager: Only the state commitment chain may call this function\\\";\\n string constant WAIT_FOR_DISPUTES = \\\"BondManager: Wait for other potential disputes\\\";\\n}\\n\\n/**\\n * @title iOVM_BondManager\\n */\\ninterface iOVM_BondManager {\\n\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n /// The lifecycle of a proposer's bond\\n enum State {\\n // Before depositing or after getting slashed, a user is uncollateralized\\n NOT_COLLATERALIZED,\\n // After depositing, a user is collateralized\\n COLLATERALIZED,\\n // After a user has initiated a withdrawal\\n WITHDRAWING\\n }\\n\\n /// A bond posted by a proposer\\n struct Bond {\\n // The user's state\\n State state;\\n // The timestamp at which a proposer issued their withdrawal request\\n uint32 withdrawalTimestamp;\\n // The time when the first disputed was initiated for this bond\\n uint256 firstDisputeAt;\\n // The earliest observed state root for this bond which has had fraud\\n bytes32 earliestDisputedStateRoot;\\n // The state root's timestamp\\n uint256 earliestTimestamp;\\n }\\n\\n // Per pre-state root, store the number of state provisions that were made\\n // and how many of these calls were made by each user. Payouts will then be\\n // claimed by users proportionally for that dispute.\\n struct Rewards {\\n // Flag to check if rewards for a fraud proof are claimable\\n bool canClaim;\\n // Total number of `recordGasSpent` calls made\\n uint256 total;\\n // The gas spent by each user to provide witness data. The sum of all\\n // values inside this map MUST be equal to the value of `total`\\n mapping(address => uint256) gasSpent;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function recordGasSpent(\\n bytes32 _preStateRoot,\\n bytes32 _txHash,\\n address _who,\\n uint256 _gasSpent\\n ) external;\\n\\n function finalize(\\n bytes32 _preStateRoot,\\n address _publisher,\\n uint256 _timestamp\\n ) external;\\n\\n function deposit() external;\\n\\n function startWithdrawal() external;\\n\\n function finalizeWithdrawal() external;\\n\\n function claim(\\n address _who\\n ) external;\\n\\n function isCollateralized(\\n address _who\\n ) external view returns (bool);\\n\\n function getGasSpent(\\n bytes32 _preStateRoot,\\n address _who\\n ) external view returns (uint256);\\n}\\n\",\"keccak256\":\"0x3c2a8a399487857158649db1896749d86e39cba545a8aeb2e2bb0f3bdfa7a5b1\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/verification/iOVM_FraudVerifier.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_StateTransitioner } from \\\"./iOVM_StateTransitioner.sol\\\";\\n\\n/**\\n * @title iOVM_FraudVerifier\\n */\\ninterface iOVM_FraudVerifier {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event FraudProofInitialized(\\n bytes32 _preStateRoot,\\n uint256 _preStateRootIndex,\\n bytes32 _transactionHash,\\n address _who\\n );\\n\\n event FraudProofFinalized(\\n bytes32 _preStateRoot,\\n uint256 _preStateRootIndex,\\n bytes32 _transactionHash,\\n address _who\\n );\\n\\n\\n /***************************************\\n * Public Functions: Transition Status *\\n ***************************************/\\n\\n function getStateTransitioner(bytes32 _preStateRoot, bytes32 _txHash) external view returns (iOVM_StateTransitioner _transitioner);\\n\\n\\n /****************************************\\n * Public Functions: Fraud Verification *\\n ****************************************/\\n\\n function initializeFraudVerification(\\n bytes32 _preStateRoot,\\n Lib_OVMCodec.ChainBatchHeader calldata _preStateRootBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof calldata _preStateRootProof,\\n Lib_OVMCodec.Transaction calldata _transaction,\\n Lib_OVMCodec.TransactionChainElement calldata _txChainElement,\\n Lib_OVMCodec.ChainBatchHeader calldata _transactionBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof calldata _transactionProof\\n ) external;\\n\\n function finalizeFraudVerification(\\n bytes32 _preStateRoot,\\n Lib_OVMCodec.ChainBatchHeader calldata _preStateRootBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof calldata _preStateRootProof,\\n bytes32 _txHash,\\n bytes32 _postStateRoot,\\n Lib_OVMCodec.ChainBatchHeader calldata _postStateRootBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof calldata _postStateRootProof\\n ) external;\\n}\\n\",\"keccak256\":\"0x5efd7bb18164bbd3e9d58379e8203fbf2a7ee802b1a48dff3ceaaec1523b1751\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/verification/iOVM_StateTransitioner.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title iOVM_StateTransitioner\\n */\\ninterface iOVM_StateTransitioner {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AccountCommitted(\\n address _address\\n );\\n\\n event ContractStorageCommitted(\\n address _address,\\n bytes32 _key\\n );\\n\\n\\n /**********************************\\n * Public Functions: State Access *\\n **********************************/\\n\\n function getPreStateRoot() external view returns (bytes32 _preStateRoot);\\n function getPostStateRoot() external view returns (bytes32 _postStateRoot);\\n function isComplete() external view returns (bool _complete);\\n\\n\\n /***********************************\\n * Public Functions: Pre-Execution *\\n ***********************************/\\n\\n function proveContractState(\\n address _ovmContractAddress,\\n address _ethContractAddress,\\n bytes calldata _stateTrieWitness\\n ) external;\\n\\n function proveStorageSlot(\\n address _ovmContractAddress,\\n bytes32 _key,\\n bytes calldata _storageTrieWitness\\n ) external;\\n\\n\\n /*******************************\\n * Public Functions: Execution *\\n *******************************/\\n\\n function applyTransaction(\\n Lib_OVMCodec.Transaction calldata _transaction\\n ) external;\\n\\n\\n /************************************\\n * Public Functions: Post-Execution *\\n ************************************/\\n\\n function commitContractState(\\n address _ovmContractAddress,\\n bytes calldata _stateTrieWitness\\n ) external;\\n\\n function commitStorageSlot(\\n address _ovmContractAddress,\\n bytes32 _key,\\n bytes calldata _storageTrieWitness\\n ) external;\\n\\n\\n /**********************************\\n * Public Functions: Finalization *\\n **********************************/\\n\\n function completeTransition() external;\\n}\\n\",\"keccak256\":\"0x3d044ac0a3bb6ad3d529f904b3191117511f9c379678ca03010e1ebdfcb5c34b\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/codec/Lib_OVMCodec.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../utils/Lib_Bytes32Utils.sol\\\";\\nimport { Lib_SafeExecutionManagerWrapper } from \\\"../../libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\\\";\\n\\n/**\\n * @title Lib_OVMCodec\\n */\\nlibrary Lib_OVMCodec {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n bytes constant internal RLP_NULL_BYTES = hex'80';\\n bytes constant internal NULL_BYTES = bytes('');\\n\\n // Ring buffer IDs\\n bytes32 constant internal RING_BUFFER_SCC_BATCHES = keccak256(\\\"RING_BUFFER_SCC_BATCHES\\\");\\n bytes32 constant internal RING_BUFFER_CTC_BATCHES = keccak256(\\\"RING_BUFFER_CTC_BATCHES\\\");\\n bytes32 constant internal RING_BUFFER_CTC_QUEUE = keccak256(\\\"RING_BUFFER_CTC_QUEUE\\\");\\n\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum EOASignatureType {\\n EIP155_TRANSACTON,\\n ETH_SIGNED_MESSAGE\\n }\\n\\n enum QueueOrigin {\\n SEQUENCER_QUEUE,\\n L1TOL2_QUEUE\\n }\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Account {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n address ethAddress;\\n bool isFresh;\\n }\\n\\n struct EVMAccount {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n }\\n\\n struct ChainBatchHeader {\\n uint256 batchIndex;\\n bytes32 batchRoot;\\n uint256 batchSize;\\n uint256 prevTotalElements;\\n bytes extraData;\\n }\\n\\n struct ChainInclusionProof {\\n uint256 index;\\n bytes32[] siblings;\\n }\\n\\n struct Transaction {\\n uint256 timestamp;\\n uint256 blockNumber;\\n QueueOrigin l1QueueOrigin;\\n address l1TxOrigin;\\n address entrypoint;\\n uint256 gasLimit;\\n bytes data;\\n }\\n\\n struct TransactionChainElement {\\n bool isSequenced;\\n uint256 queueIndex; // QUEUED TX ONLY\\n uint256 timestamp; // SEQUENCER TX ONLY\\n uint256 blockNumber; // SEQUENCER TX ONLY\\n bytes txData; // SEQUENCER TX ONLY\\n }\\n\\n struct QueueElement {\\n bytes32 queueRoot;\\n uint40 timestamp;\\n uint40 blockNumber;\\n }\\n\\n struct EIP155Transaction {\\n uint256 nonce;\\n uint256 gasPrice;\\n uint256 gasLimit;\\n address to;\\n uint256 value;\\n bytes data;\\n uint256 chainId;\\n }\\n\\n\\n /*********************************************\\n * Internal Functions: Encoding and Decoding *\\n *********************************************/\\n\\n /**\\n * Decodes an EOA transaction (i.e., native Ethereum RLP encoding).\\n * @param _transaction Encoded EOA transaction.\\n * @return _decoded Transaction decoded into a struct.\\n */\\n function decodeEIP155Transaction(\\n bytes memory _transaction,\\n bool _isEthSignedMessage\\n )\\n internal\\n pure\\n returns (\\n EIP155Transaction memory _decoded\\n )\\n {\\n if (_isEthSignedMessage) {\\n (\\n uint256 _nonce,\\n uint256 _gasLimit,\\n uint256 _gasPrice,\\n uint256 _chainId,\\n address _to,\\n bytes memory _data\\n ) = abi.decode(\\n _transaction,\\n (uint256, uint256, uint256, uint256, address ,bytes)\\n );\\n return EIP155Transaction({\\n nonce: _nonce,\\n gasPrice: _gasPrice,\\n gasLimit: _gasLimit,\\n to: _to,\\n value: 0,\\n data: _data,\\n chainId: _chainId\\n });\\n } else {\\n Lib_RLPReader.RLPItem[] memory decoded = Lib_RLPReader.readList(_transaction);\\n\\n return EIP155Transaction({\\n nonce: Lib_RLPReader.readUint256(decoded[0]),\\n gasPrice: Lib_RLPReader.readUint256(decoded[1]),\\n gasLimit: Lib_RLPReader.readUint256(decoded[2]),\\n to: Lib_RLPReader.readAddress(decoded[3]),\\n value: Lib_RLPReader.readUint256(decoded[4]),\\n data: Lib_RLPReader.readBytes(decoded[5]),\\n chainId: Lib_RLPReader.readUint256(decoded[6])\\n });\\n }\\n }\\n\\n function decompressEIP155Transaction(\\n bytes memory _transaction\\n )\\n internal\\n returns (\\n EIP155Transaction memory _decompressed\\n )\\n {\\n return EIP155Transaction({\\n gasLimit: Lib_BytesUtils.toUint24(_transaction, 0),\\n gasPrice: uint256(Lib_BytesUtils.toUint24(_transaction, 3)) * 1000000,\\n nonce: Lib_BytesUtils.toUint24(_transaction, 6),\\n to: Lib_BytesUtils.toAddress(_transaction, 9),\\n data: Lib_BytesUtils.slice(_transaction, 29),\\n chainId: Lib_SafeExecutionManagerWrapper.safeCHAINID(),\\n value: 0\\n });\\n }\\n\\n /**\\n * Encodes an EOA transaction back into the original transaction.\\n * @param _transaction EIP155transaction to encode.\\n * @param _isEthSignedMessage Whether or not this was an eth signed message.\\n * @return Encoded transaction.\\n */\\n function encodeEIP155Transaction(\\n EIP155Transaction memory _transaction,\\n bool _isEthSignedMessage\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n if (_isEthSignedMessage) {\\n return abi.encode(\\n _transaction.nonce,\\n _transaction.gasLimit,\\n _transaction.gasPrice,\\n _transaction.chainId,\\n _transaction.to,\\n _transaction.data\\n );\\n } else {\\n bytes[] memory raw = new bytes[](9);\\n\\n raw[0] = Lib_RLPWriter.writeUint(_transaction.nonce);\\n raw[1] = Lib_RLPWriter.writeUint(_transaction.gasPrice);\\n raw[2] = Lib_RLPWriter.writeUint(_transaction.gasLimit);\\n if (_transaction.to == address(0)) {\\n raw[3] = Lib_RLPWriter.writeBytes('');\\n } else {\\n raw[3] = Lib_RLPWriter.writeAddress(_transaction.to);\\n }\\n raw[4] = Lib_RLPWriter.writeUint(0);\\n raw[5] = Lib_RLPWriter.writeBytes(_transaction.data);\\n raw[6] = Lib_RLPWriter.writeUint(_transaction.chainId);\\n raw[7] = Lib_RLPWriter.writeBytes(bytes(''));\\n raw[8] = Lib_RLPWriter.writeBytes(bytes(''));\\n\\n return Lib_RLPWriter.writeList(raw);\\n }\\n }\\n\\n /**\\n * Encodes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return _encoded Encoded transaction bytes.\\n */\\n function encodeTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes memory _encoded\\n )\\n {\\n return abi.encodePacked(\\n _transaction.timestamp,\\n _transaction.blockNumber,\\n _transaction.l1QueueOrigin,\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n );\\n }\\n\\n /**\\n * Hashes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return _hash Hashed transaction\\n */\\n function hashTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes32 _hash\\n )\\n {\\n return keccak256(encodeTransaction(_transaction));\\n }\\n\\n /**\\n * Converts an OVM account to an EVM account.\\n * @param _in OVM account to convert.\\n * @return _out Converted EVM account.\\n */\\n function toEVMAccount(\\n Account memory _in\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory _out\\n )\\n {\\n return EVMAccount({\\n nonce: _in.nonce,\\n balance: _in.balance,\\n storageRoot: _in.storageRoot,\\n codeHash: _in.codeHash\\n });\\n }\\n\\n /**\\n * @notice RLP-encodes an account state struct.\\n * @param _account Account state struct.\\n * @return _encoded RLP-encoded account state.\\n */\\n function encodeEVMAccount(\\n EVMAccount memory _account\\n )\\n internal\\n pure\\n returns (\\n bytes memory _encoded\\n )\\n {\\n bytes[] memory raw = new bytes[](4);\\n\\n // Unfortunately we can't create this array outright because\\n // Lib_RLPWriter.writeList will reject fixed-size arrays. Assigning\\n // index-by-index circumvents this issue.\\n raw[0] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.nonce)\\n )\\n );\\n raw[1] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.balance)\\n )\\n );\\n raw[2] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.storageRoot));\\n raw[3] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.codeHash));\\n\\n return Lib_RLPWriter.writeList(raw);\\n }\\n\\n /**\\n * @notice Decodes an RLP-encoded account state into a useful struct.\\n * @param _encoded RLP-encoded account state.\\n * @return _account Account state struct.\\n */\\n function decodeEVMAccount(\\n bytes memory _encoded\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory _account\\n )\\n {\\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\\n\\n return EVMAccount({\\n nonce: Lib_RLPReader.readUint256(accountState[0]),\\n balance: Lib_RLPReader.readUint256(accountState[1]),\\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\\n });\\n }\\n\\n /**\\n * Calculates a hash for a given batch header.\\n * @param _batchHeader Header to hash.\\n * @return _hash Hash of the header.\\n */\\n function hashBatchHeader(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n internal\\n pure\\n returns (\\n bytes32 _hash\\n )\\n {\\n return keccak256(\\n abi.encode(\\n _batchHeader.batchRoot,\\n _batchHeader.batchSize,\\n _batchHeader.prevTotalElements,\\n _batchHeader.extraData\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0x19d78734777b4998f1544e235cf3934f20c5055cd76c2bd60bf0f6dacdd72b3a\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// +build ovm\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Contract Imports */\\nimport { Ownable } from \\\"./Lib_Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n /*******************************************\\n * Contract Variables: Internal Accounting *\\n *******************************************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n public\\n onlyOwner\\n {\\n emit AddressSet(_name, _address);\\n addresses[_getNameHash(_name)] = _address;\\n }\\n\\n function getAddress(\\n string memory _name\\n )\\n public\\n view\\n returns (address)\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32 _hash\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xdf802e1cc6474df913626991e9fca3835c620a519f397afe04bf9c260e723257\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// +build ovm\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\ncontract Lib_AddressResolver {\\n\\n /*******************************************\\n * Contract Variables: Contract References *\\n *******************************************/\\n\\n Lib_AddressManager internal libAddressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(\\n address _libAddressManager\\n ) public {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function resolve(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address _contract\\n )\\n {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0xf3b9d78b309ddeec259ce3e0e1cfdef3ca40938e9a81971b28ce2b8ea327f533\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// +build ovm\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Ownable\\n * @dev Adapted from https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol\\n */\\nabstract contract Ownable {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n address public owner;\\n\\n\\n /**********\\n * Events *\\n **********/\\n\\n event OwnershipTransferred(\\n address indexed previousOwner,\\n address indexed newOwner\\n );\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n constructor() internal {\\n owner = msg.sender;\\n emit OwnershipTransferred(address(0), owner);\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n owner == msg.sender,\\n \\\"Ownable: caller is not the owner\\\"\\n );\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function renounceOwnership()\\n public\\n virtual\\n onlyOwner\\n {\\n emit OwnershipTransferred(owner, address(0));\\n owner = address(0);\\n }\\n\\n function transferOwnership(address _newOwner)\\n public\\n virtual\\n onlyOwner\\n {\\n require(\\n _newOwner != address(0),\\n \\\"Ownable: new owner cannot be the zero address\\\"\\n );\\n\\n emit OwnershipTransferred(owner, _newOwner);\\n owner = _newOwner;\\n }\\n}\\n\",\"keccak256\":\"0xe0409fbd236d16ca6be439d9d97dd36d0d9a0697ee0062d49588b9d29c248e47\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPReader.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.7.0;\\n\\n/**\\n * @title Lib_RLPReader\\n * @dev Adapted from \\\"RLPReader\\\" by Hamdi Allam (hamdi.allam97@gmail.com).\\n */\\nlibrary Lib_RLPReader {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 constant internal MAX_LIST_LENGTH = 32;\\n\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum RLPItemType {\\n DATA_ITEM,\\n LIST_ITEM\\n }\\n\\n \\n /***********\\n * Structs *\\n ***********/\\n\\n struct RLPItem {\\n uint256 length;\\n uint256 ptr;\\n }\\n \\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n \\n /**\\n * Converts bytes to a reference to memory position and length.\\n * @param _in Input bytes to convert.\\n * @return Output memory reference.\\n */\\n function toRLPItem(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem memory\\n )\\n {\\n uint256 ptr;\\n assembly {\\n ptr := add(_in, 32)\\n }\\n\\n return RLPItem({\\n length: _in.length,\\n ptr: ptr\\n });\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n (\\n uint256 listOffset,\\n ,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.LIST_ITEM,\\n \\\"Invalid RLP list value.\\\"\\n );\\n\\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\\n // writing to the length. Since we can't know the number of RLP items without looping over\\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\\n // simply set a reasonable maximum list length and decrease the size before we finish.\\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\\n\\n uint256 itemCount = 0;\\n uint256 offset = listOffset;\\n while (offset < _in.length) {\\n require(\\n itemCount < MAX_LIST_LENGTH,\\n \\\"Provided RLP list exceeds max list length.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n ) = _decodeLength(RLPItem({\\n length: _in.length - offset,\\n ptr: _in.ptr + offset\\n }));\\n\\n out[itemCount] = RLPItem({\\n length: itemLength + itemOffset,\\n ptr: _in.ptr + offset\\n });\\n\\n itemCount += 1;\\n offset += itemOffset + itemLength;\\n }\\n\\n // Decrease the array size to match the actual item count.\\n assembly {\\n mstore(out, itemCount)\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n return readList(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes value.\\\"\\n );\\n\\n return _copy(_in.ptr, itemOffset, itemLength);\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return readBytes(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return string(readBytes(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return readString(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n require(\\n _in.length <= 33,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr + itemOffset;\\n bytes32 out;\\n assembly {\\n out := mload(ptr)\\n\\n // Shift the bytes over to match the item size.\\n if lt(itemLength, 32) {\\n out := div(out, exp(256, sub(32, itemLength)))\\n }\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return readBytes32(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return uint256(readBytes32(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return readUint256(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n require(\\n _in.length == 1,\\n \\\"Invalid RLP boolean value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 out;\\n assembly {\\n out := byte(0, mload(ptr))\\n }\\n\\n return out != 0;\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return readBool(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n if (_in.length == 1) {\\n return address(0);\\n }\\n\\n require(\\n _in.length == 21,\\n \\\"Invalid RLP address value.\\\"\\n );\\n\\n return address(readUint256(_in));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return readAddress(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads the raw bytes of an RLP item.\\n * @param _in RLP item to read.\\n * @return Raw RLP bytes.\\n */\\n function readRawBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in);\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Decodes the length of an RLP item.\\n * @param _in RLP item to decode.\\n * @return Offset of the encoded data.\\n * @return Length of the encoded data.\\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\\n */\\n function _decodeLength(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n uint256,\\n uint256,\\n RLPItemType\\n )\\n {\\n require(\\n _in.length > 0,\\n \\\"RLP item cannot be null.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 prefix;\\n assembly {\\n prefix := byte(0, mload(ptr))\\n }\\n\\n if (prefix <= 0x7f) {\\n // Single byte.\\n\\n return (0, 1, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xb7) {\\n // Short string.\\n\\n uint256 strLen = prefix - 0x80;\\n \\n require(\\n _in.length > strLen,\\n \\\"Invalid RLP short string.\\\"\\n );\\n\\n return (1, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xbf) {\\n // Long string.\\n uint256 lenOfStrLen = prefix - 0xb7;\\n\\n require(\\n _in.length > lenOfStrLen,\\n \\\"Invalid RLP long string length.\\\"\\n );\\n\\n uint256 strLen;\\n assembly {\\n // Pick out the string length.\\n strLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfStrLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfStrLen + strLen,\\n \\\"Invalid RLP long string.\\\"\\n );\\n\\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xf7) {\\n // Short list.\\n uint256 listLen = prefix - 0xc0;\\n\\n require(\\n _in.length > listLen,\\n \\\"Invalid RLP short list.\\\"\\n );\\n\\n return (1, listLen, RLPItemType.LIST_ITEM);\\n } else {\\n // Long list.\\n uint256 lenOfListLen = prefix - 0xf7;\\n\\n require(\\n _in.length > lenOfListLen,\\n \\\"Invalid RLP long list length.\\\"\\n );\\n\\n uint256 listLen;\\n assembly {\\n // Pick out the list length.\\n listLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfListLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfListLen + listLen,\\n \\\"Invalid RLP long list.\\\"\\n );\\n\\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\\n }\\n }\\n\\n /**\\n * Copies the bytes from a memory location.\\n * @param _src Pointer to the location to read from.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Copied bytes.\\n */\\n function _copy(\\n uint256 _src,\\n uint256 _offset,\\n uint256 _length\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out = new bytes(_length);\\n if (out.length == 0) {\\n return out;\\n }\\n\\n uint256 src = _src + _offset;\\n uint256 dest;\\n assembly {\\n dest := add(out, 32)\\n }\\n\\n // Copy over as many complete words as we can.\\n for (uint256 i = 0; i < _length / 32; i++) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n\\n src += 32;\\n dest += 32;\\n }\\n\\n // Pick out the remaining bytes.\\n uint256 mask = 256 ** (32 - (_length % 32)) - 1;\\n assembly {\\n mstore(\\n dest,\\n or(\\n and(mload(src), not(mask)),\\n and(mload(dest), mask)\\n )\\n )\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Copies an RLP item into bytes.\\n * @param _in RLP item to copy.\\n * @return Copied bytes.\\n */\\n function _copy(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in.ptr, 0, _in.length);\\n }\\n}\\n\",\"keccak256\":\"0x8338f7b6e5f0ded8fc36d9088fd127ee53ae4040ca3f4838eb6123f642d38c62\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPWriter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.7.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\n\\n/**\\n * @title Lib_RLPWriter\\n * @author Bakaoh (with modifications)\\n */\\nlibrary Lib_RLPWriter {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * RLP encodes a byte string.\\n * @param _in The byte string to encode.\\n * @return _out The RLP encoded string in bytes.\\n */\\n function writeBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n bytes memory encoded;\\n\\n if (_in.length == 1 && uint8(_in[0]) < 128) {\\n encoded = _in;\\n } else {\\n encoded = Lib_BytesUtils.concat(_writeLength(_in.length, 128), _in);\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * RLP encodes a list of RLP encoded byte byte strings.\\n * @param _in The list of RLP encoded byte strings.\\n * @return _out The RLP encoded list of items in bytes.\\n */\\n function writeList(\\n bytes[] memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n bytes memory list = _flatten(_in);\\n return Lib_BytesUtils.concat(_writeLength(list.length, 192), list);\\n }\\n\\n /**\\n * RLP encodes a string.\\n * @param _in The string to encode.\\n * @return _out The RLP encoded string in bytes.\\n */\\n function writeString(\\n string memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(bytes(_in));\\n }\\n\\n /**\\n * RLP encodes an address.\\n * @param _in The address to encode.\\n * @return _out The RLP encoded address in bytes.\\n */\\n function writeAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a uint.\\n * @param _in The uint256 to encode.\\n * @return _out The RLP encoded uint256 in bytes.\\n */\\n function writeUint(\\n uint256 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(_toBinary(_in));\\n }\\n\\n /**\\n * RLP encodes a bool.\\n * @param _in The bool to encode.\\n * @return _out The RLP encoded bool in bytes.\\n */\\n function writeBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n bytes memory encoded = new bytes(1);\\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\\n return encoded;\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\\n * @param _len The length of the string or the payload.\\n * @param _offset 128 if item is string, 192 if item is list.\\n * @return _encoded RLP encoded bytes.\\n */\\n function _writeLength(\\n uint256 _len,\\n uint256 _offset\\n )\\n private\\n pure\\n returns (\\n bytes memory _encoded\\n )\\n {\\n bytes memory encoded;\\n\\n if (_len < 56) {\\n encoded = new bytes(1);\\n encoded[0] = byte(uint8(_len) + uint8(_offset));\\n } else {\\n uint256 lenLen;\\n uint256 i = 1;\\n while (_len / i != 0) {\\n lenLen++;\\n i *= 256;\\n }\\n\\n encoded = new bytes(lenLen + 1);\\n encoded[0] = byte(uint8(lenLen) + uint8(_offset) + 55);\\n for(i = 1; i <= lenLen; i++) {\\n encoded[i] = byte(uint8((_len / (256**(lenLen-i))) % 256));\\n }\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * Encode integer in big endian binary form with no leading zeroes.\\n * @notice TODO: This should be optimized with assembly to save gas costs.\\n * @param _x The integer to encode.\\n * @return _binary RLP encoded bytes.\\n */\\n function _toBinary(\\n uint256 _x\\n )\\n private\\n pure\\n returns (\\n bytes memory _binary\\n )\\n {\\n bytes memory b = abi.encodePacked(_x);\\n\\n uint256 i = 0;\\n for (; i < 32; i++) {\\n if (b[i] != 0) {\\n break;\\n }\\n }\\n\\n bytes memory res = new bytes(32 - i);\\n for (uint256 j = 0; j < res.length; j++) {\\n res[j] = b[i++];\\n }\\n\\n return res;\\n }\\n\\n /**\\n * Copies a piece of memory to another location.\\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\\n * @param _dest Destination location.\\n * @param _src Source location.\\n * @param _len Length of memory to copy.\\n */\\n function _memcpy(\\n uint256 _dest,\\n uint256 _src,\\n uint256 _len\\n )\\n private\\n pure\\n {\\n uint256 dest = _dest;\\n uint256 src = _src;\\n uint256 len = _len;\\n\\n for(; len >= 32; len -= 32) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n dest += 32;\\n src += 32;\\n }\\n\\n uint256 mask = 256 ** (32 - len) - 1;\\n assembly {\\n let srcpart := and(mload(src), not(mask))\\n let destpart := and(mload(dest), mask)\\n mstore(dest, or(destpart, srcpart))\\n }\\n }\\n\\n /**\\n * Flattens a list of byte strings into one byte string.\\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\\n * @param _list List of byte strings to flatten.\\n * @return _flattened The flattened byte string.\\n */\\n function _flatten(\\n bytes[] memory _list\\n )\\n private\\n pure\\n returns (\\n bytes memory _flattened\\n )\\n {\\n if (_list.length == 0) {\\n return new bytes(0);\\n }\\n\\n uint256 len;\\n uint256 i = 0;\\n for (; i < _list.length; i++) {\\n len += _list[i].length;\\n }\\n\\n bytes memory flattened = new bytes(len);\\n uint256 flattenedPtr;\\n assembly { flattenedPtr := add(flattened, 0x20) }\\n\\n for(i = 0; i < _list.length; i++) {\\n bytes memory item = _list[i];\\n\\n uint256 listPtr;\\n assembly { listPtr := add(item, 0x20)}\\n\\n _memcpy(flattenedPtr, listPtr, item.length);\\n flattenedPtr += _list[i].length;\\n }\\n\\n return flattened;\\n }\\n}\",\"keccak256\":\"0x6d1aaef567f8a91bb965b95a95637f433a1f0ac4cf0bc1e209cdb1dd5b0f204b\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_Bytes32Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.7.0;\\n\\n/**\\n * @title Lib_Byte32Utils\\n */\\nlibrary Lib_Bytes32Utils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function toBool(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bool _out\\n )\\n {\\n return _in != 0;\\n }\\n\\n function fromBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes32 _out\\n )\\n {\\n return bytes32(uint256(_in ? 1 : 0));\\n }\\n\\n function toAddress(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n address _out\\n )\\n {\\n return address(uint160(uint256(_in)));\\n }\\n\\n function fromAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes32 _out\\n )\\n {\\n return bytes32(uint256(_in));\\n }\\n\\n function removeLeadingZeros(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n bytes memory out;\\n\\n assembly {\\n // Figure out how many leading zero bytes to remove.\\n let shift := 0\\n for { let i := 0 } and(lt(i, 32), eq(byte(i, _in), 0)) { i := add(i, 1) } {\\n shift := add(shift, 1)\\n }\\n\\n // Reserve some space for our output and fix the free memory pointer.\\n out := mload(0x40)\\n mstore(0x40, add(out, 0x40))\\n\\n // Shift the value and store it into the output bytes.\\n mstore(add(out, 0x20), shl(mul(shift, 8), _in))\\n\\n // Store the new size (with leading zero bytes removed) in the output byte size.\\n mstore(out, sub(32, shift))\\n }\\n\\n return out;\\n }\\n}\\n\",\"keccak256\":\"0x06f97590a80a01daa3bf6aa795449aea91a78684c646b4a6caeece8ef919c80c\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_BytesUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.7.0;\\n\\n/**\\n * @title Lib_BytesUtils\\n */\\nlibrary Lib_BytesUtils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function concat(\\n bytes memory _preBytes,\\n bytes memory _postBytes\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n bytes memory tempBytes;\\n\\n assembly {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // Store the length of the first bytes array at the beginning of\\n // the memory for tempBytes.\\n let length := mload(_preBytes)\\n mstore(tempBytes, length)\\n\\n // Maintain a memory counter for the current write location in the\\n // temp bytes array by adding the 32 bytes for the array length to\\n // the starting location.\\n let mc := add(tempBytes, 0x20)\\n // Stop copying when the memory counter reaches the length of the\\n // first bytes array.\\n let end := add(mc, length)\\n\\n for {\\n // Initialize a copy counter to the start of the _preBytes data,\\n // 32 bytes into its memory.\\n let cc := add(_preBytes, 0x20)\\n } lt(mc, end) {\\n // Increase both counters by 32 bytes each iteration.\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n // Write the _preBytes data into the tempBytes memory 32 bytes\\n // at a time.\\n mstore(mc, mload(cc))\\n }\\n\\n // Add the length of _postBytes to the current length of tempBytes\\n // and store it as the new length in the first 32 bytes of the\\n // tempBytes memory.\\n length := mload(_postBytes)\\n mstore(tempBytes, add(length, mload(tempBytes)))\\n\\n // Move the memory counter back from a multiple of 0x20 to the\\n // actual end of the _preBytes data.\\n mc := end\\n // Stop copying when the memory counter reaches the new combined\\n // length of the arrays.\\n end := add(mc, length)\\n\\n for {\\n let cc := add(_postBytes, 0x20)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n // Update the free-memory pointer by padding our last write location\\n // to 32 bytes: add 31 bytes to the end of tempBytes to move to the\\n // next 32 byte block, then round down to the nearest multiple of\\n // 32. If the sum of the length of the two arrays is zero then add\\n // one before rounding down to leave a blank 32 bytes (the length block with 0).\\n mstore(0x40, and(\\n add(add(end, iszero(add(length, mload(_preBytes)))), 31),\\n not(31) // Round down to the nearest 32 bytes.\\n ))\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_start + _length >= _start, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n if (_bytes.length - _start == 0) {\\n return bytes('');\\n }\\n\\n return slice(_bytes, _start, _bytes.length - _start);\\n }\\n\\n function toBytes32PadLeft(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes32)\\n {\\n bytes32 ret;\\n uint256 len = _bytes.length <= 32 ? _bytes.length : 32;\\n assembly {\\n ret := shr(mul(sub(32, len), 8), mload(add(_bytes, 32)))\\n }\\n return ret;\\n }\\n\\n function toBytes32(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes32)\\n {\\n if (_bytes.length < 32) {\\n bytes32 ret;\\n assembly {\\n ret := mload(add(_bytes, 32))\\n }\\n return ret;\\n }\\n\\n return abi.decode(_bytes,(bytes32)); // will truncate if input length > 32 bytes\\n }\\n\\n function toUint256(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (uint256)\\n {\\n return uint256(toBytes32(_bytes));\\n }\\n\\n function toUint24(bytes memory _bytes, uint256 _start) internal pure returns (uint24) {\\n require(_start + 3 >= _start, \\\"toUint24_overflow\\\");\\n require(_bytes.length >= _start + 3 , \\\"toUint24_outOfBounds\\\");\\n uint24 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x3), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toUint8(bytes memory _bytes, uint256 _start) internal pure returns (uint8) {\\n require(_start + 1 >= _start, \\\"toUint8_overflow\\\");\\n require(_bytes.length >= _start + 1 , \\\"toUint8_outOfBounds\\\");\\n uint8 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x1), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toAddress(bytes memory _bytes, uint256 _start) internal pure returns (address) {\\n require(_start + 20 >= _start, \\\"toAddress_overflow\\\");\\n require(_bytes.length >= _start + 20, \\\"toAddress_outOfBounds\\\");\\n address tempAddress;\\n\\n assembly {\\n tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000)\\n }\\n\\n return tempAddress;\\n }\\n\\n function toNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n bytes memory nibbles = new bytes(_bytes.length * 2);\\n\\n for (uint256 i = 0; i < _bytes.length; i++) {\\n nibbles[i * 2] = _bytes[i] >> 4;\\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\\n }\\n\\n return nibbles;\\n }\\n\\n function fromNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n bytes memory ret = new bytes(_bytes.length / 2);\\n\\n for (uint256 i = 0; i < ret.length; i++) {\\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\\n }\\n\\n return ret;\\n }\\n\\n function equal(\\n bytes memory _bytes,\\n bytes memory _other\\n )\\n internal\\n pure\\n returns (bool)\\n {\\n return keccak256(_bytes) == keccak256(_other);\\n }\\n}\\n\",\"keccak256\":\"0x849e4fedd81cd260e4c3b74b953f00636323574c60d363f36ab331e94aab9219\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_MerkleTree.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.7.0;\\n\\n/**\\n * @title Lib_MerkleTree\\n * @author River Keefer\\n */\\nlibrary Lib_MerkleTree {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Calculates a merkle root for a list of 32-byte leaf hashes. WARNING: If the number\\n * of leaves passed in is not a power of two, it pads out the tree with zero hashes.\\n * If you do not know the original length of elements for the tree you are verifying,\\n * then this may allow empty leaves past _elements.length to pass a verification check down the line.\\n * @param _elements Array of hashes from which to generate a merkle root.\\n * @return Merkle root of the leaves, with zero hashes for non-powers-of-two (see above).\\n */\\n function getMerkleRoot(\\n bytes32[] memory _elements\\n )\\n internal\\n view\\n returns (\\n bytes32\\n )\\n {\\n require(\\n _elements.length > 0,\\n \\\"Lib_MerkleTree: Must provide at least one leaf hash.\\\"\\n );\\n\\n if (_elements.length == 0) {\\n return _elements[0];\\n }\\n\\n uint256[16] memory defaults = [\\n 0x290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563,\\n 0x633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d,\\n 0x890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d,\\n 0x3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd8,\\n 0xecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da,\\n 0xdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da5,\\n 0x617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d7,\\n 0x292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead,\\n 0xe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e10,\\n 0x7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f82,\\n 0xe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e83636516,\\n 0x3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c,\\n 0xad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e,\\n 0xa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab,\\n 0x4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c862,\\n 0x2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf10\\n ];\\n\\n // Reserve memory space for our hashes.\\n bytes memory buf = new bytes(64);\\n\\n // We'll need to keep track of left and right siblings.\\n bytes32 leftSibling;\\n bytes32 rightSibling;\\n\\n // Number of non-empty nodes at the current depth.\\n uint256 rowSize = _elements.length;\\n\\n // Current depth, counting from 0 at the leaves\\n uint256 depth = 0;\\n\\n // Common sub-expressions\\n uint256 halfRowSize; // rowSize / 2\\n bool rowSizeIsOdd; // rowSize % 2 == 1\\n\\n while (rowSize > 1) {\\n halfRowSize = rowSize / 2;\\n rowSizeIsOdd = rowSize % 2 == 1;\\n\\n for (uint256 i = 0; i < halfRowSize; i++) {\\n leftSibling = _elements[(2 * i) ];\\n rightSibling = _elements[(2 * i) + 1];\\n assembly {\\n mstore(add(buf, 32), leftSibling )\\n mstore(add(buf, 64), rightSibling)\\n }\\n\\n _elements[i] = keccak256(buf);\\n }\\n\\n if (rowSizeIsOdd) {\\n leftSibling = _elements[rowSize - 1];\\n rightSibling = bytes32(defaults[depth]);\\n assembly {\\n mstore(add(buf, 32), leftSibling)\\n mstore(add(buf, 64), rightSibling)\\n }\\n\\n _elements[halfRowSize] = keccak256(buf);\\n }\\n\\n rowSize = halfRowSize + (rowSizeIsOdd ? 1 : 0);\\n depth++;\\n }\\n\\n return _elements[0];\\n }\\n\\n /**\\n * Verifies a merkle branch for the given leaf hash. Assumes the original length\\n * of leaves generated is a known, correct input, and does not return true for indices \\n * extending past that index (even if _siblings would be otherwise valid.)\\n * @param _root The Merkle root to verify against.\\n * @param _leaf The leaf hash to verify inclusion of.\\n * @param _index The index in the tree of this leaf.\\n * @param _siblings Array of sibline nodes in the inclusion proof, starting from depth 0 (bottom of the tree). \\n * @param _totalLeaves The total number of leaves originally passed into.\\n * @return Whether or not the merkle branch and leaf passes verification.\\n */\\n function verify(\\n bytes32 _root,\\n bytes32 _leaf,\\n uint256 _index,\\n bytes32[] memory _siblings,\\n uint256 _totalLeaves\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n require(\\n _totalLeaves > 0,\\n \\\"Lib_MerkleTree: Total leaves must be greater than zero.\\\"\\n );\\n\\n require(\\n _index < _totalLeaves,\\n \\\"Lib_MerkleTree: Index out of bounds.\\\"\\n );\\n\\n require(\\n _siblings.length == _ceilLog2(_totalLeaves),\\n \\\"Lib_MerkleTree: Total siblings does not correctly correspond to total leaves.\\\"\\n );\\n\\n bytes32 computedRoot = _leaf;\\n\\n for (uint256 i = 0; i < _siblings.length; i++) {\\n if ((_index & 1) == 1) {\\n computedRoot = keccak256(\\n abi.encodePacked(\\n _siblings[i],\\n computedRoot\\n )\\n );\\n } else {\\n computedRoot = keccak256(\\n abi.encodePacked(\\n computedRoot,\\n _siblings[i]\\n )\\n );\\n }\\n\\n _index >>= 1;\\n }\\n\\n return _root == computedRoot;\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Calculates the integer ceiling of the log base 2 of an input.\\n * @param _in Unsigned input to calculate the log.\\n * @return ceil(log_base_2(_in))\\n */\\n function _ceilLog2(\\n uint256 _in\\n )\\n private\\n pure\\n returns (\\n uint256\\n )\\n { \\n require(\\n _in > 0,\\n \\\"Lib_MerkleTree: Cannot compute ceil(log_2) of 0.\\\"\\n );\\n\\n if (_in == 1) {\\n return 0;\\n }\\n\\n // Find the highest set bit (will be floor(log_2)).\\n // Borrowed with <3 from https://github.com/ethereum/solidity-examples\\n uint256 val = _in;\\n uint256 highest = 0;\\n for (uint8 i = 128; i >= 1; i >>= 1) {\\n if (val & (uint(1) << i) - 1 << i != 0) {\\n highest += i;\\n val >>= i;\\n }\\n }\\n\\n // Increment by one if this is not a perfect logarithm.\\n if ((uint(1) << highest) != _in) {\\n highest += 1;\\n }\\n\\n return highest;\\n }\\n}\\n\",\"keccak256\":\"0x5a859eccd3c4e7e31db90f3022069a725d5389e16fbcace3fe653d6b0acf80f6\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.7.0;\\n\\n/**\\n * @title Lib_SafeExecutionManagerWrapper\\n */\\nlibrary Lib_SafeExecutionManagerWrapper {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Makes an ovmCALL and performs all the necessary safety checks.\\n * @param _gasLimit Gas limit for the call.\\n * @param _target Address to call.\\n * @param _calldata Data to send to the call.\\n * @return _success Whether or not the call reverted.\\n * @return _returndata Data returned by the call.\\n */\\n function safeCALL(\\n uint256 _gasLimit,\\n address _target,\\n bytes memory _calldata\\n )\\n internal\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCALL(uint256,address,bytes)\\\",\\n _gasLimit,\\n _target,\\n _calldata\\n )\\n );\\n\\n return abi.decode(returndata, (bool, bytes));\\n }\\n\\n /**\\n * Makes an ovmCALL and performs all the necessary safety checks.\\n * @param _gasLimit Gas limit for the call.\\n * @param _target Address to call.\\n * @param _calldata Data to send to the call.\\n * @return _success Whether or not the call reverted.\\n * @return _returndata Data returned by the call.\\n */\\n function safeDELEGATECALL(\\n uint256 _gasLimit,\\n address _target,\\n bytes memory _calldata\\n )\\n internal\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmDELEGATECALL(uint256,address,bytes)\\\",\\n _gasLimit,\\n _target,\\n _calldata\\n )\\n );\\n\\n return abi.decode(returndata, (bool, bytes));\\n }\\n\\n /**\\n * Performs an ovmCREATE and the necessary safety checks.\\n * @param _gasLimit Gas limit for the creation.\\n * @param _bytecode Code for the new contract.\\n * @return _contract Address of the created contract.\\n */\\n function safeCREATE(\\n uint256 _gasLimit,\\n bytes memory _bytecode\\n )\\n internal\\n returns (\\n address _contract\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n _gasLimit,\\n abi.encodeWithSignature(\\n \\\"ovmCREATE(bytes)\\\",\\n _bytecode\\n )\\n );\\n\\n return abi.decode(returndata, (address));\\n }\\n\\n /**\\n * Performs an ovmEXTCODESIZE and the necessary safety checks.\\n * @param _contract Address of the contract to query the size of.\\n * @return _EXTCODESIZE Size of the requested contract in bytes.\\n */\\n function safeEXTCODESIZE(\\n address _contract\\n )\\n internal\\n returns (\\n uint256 _EXTCODESIZE\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmEXTCODESIZE(address)\\\",\\n _contract\\n )\\n );\\n\\n return abi.decode(returndata, (uint256));\\n }\\n\\n /**\\n * Performs a safe ovmCHAINID call.\\n * @return _CHAINID Result of calling ovmCHAINID.\\n */\\n function safeCHAINID()\\n internal\\n returns (\\n uint256 _CHAINID\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCHAINID()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (uint256));\\n }\\n\\n /**\\n * Performs a safe ovmCALLER call.\\n * @return _CALLER Result of calling ovmCALLER.\\n */\\n function safeCALLER()\\n internal\\n returns (\\n address _CALLER\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCALLER()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (address));\\n }\\n\\n /**\\n * Performs a safe ovmADDRESS call.\\n * @return _ADDRESS Result of calling ovmADDRESS.\\n */\\n function safeADDRESS()\\n internal\\n returns (\\n address _ADDRESS\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmADDRESS()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (address));\\n }\\n\\n /**\\n * Performs a safe ovmGETNONCE call.\\n * @return _nonce Result of calling ovmGETNONCE.\\n */\\n function safeGETNONCE()\\n internal\\n returns (\\n uint256 _nonce\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmGETNONCE()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (uint256));\\n }\\n\\n /**\\n * Performs a safe ovmSETNONCE call.\\n * @param _nonce New account nonce.\\n */\\n function safeSETNONCE(\\n uint256 _nonce\\n )\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmSETNONCE(uint256)\\\",\\n _nonce\\n )\\n );\\n }\\n\\n /**\\n * Performs a safe ovmCREATEEOA call.\\n * @param _messageHash Message hash which was signed by EOA\\n * @param _v v value of signature (0 or 1)\\n * @param _r r value of signature\\n * @param _s s value of signature\\n */\\n function safeCREATEEOA(\\n bytes32 _messageHash,\\n uint8 _v,\\n bytes32 _r,\\n bytes32 _s\\n )\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCREATEEOA(bytes32,uint8,bytes32,bytes32)\\\",\\n _messageHash,\\n _v,\\n _r,\\n _s\\n )\\n );\\n }\\n\\n /**\\n * Performs a safe REVERT.\\n * @param _reason String revert reason to pass along with the REVERT.\\n */\\n function safeREVERT(\\n string memory _reason\\n )\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmREVERT(bytes)\\\",\\n bytes(_reason)\\n )\\n );\\n }\\n\\n /**\\n * Performs a safe \\\"require\\\".\\n * @param _condition Boolean condition that must be true or will revert.\\n * @param _reason String revert reason to pass along with the REVERT.\\n */\\n function safeREQUIRE(\\n bool _condition,\\n string memory _reason\\n )\\n internal\\n {\\n if (!_condition) {\\n safeREVERT(\\n _reason\\n );\\n }\\n }\\n\\n /**\\n * Performs a safe ovmSLOAD call.\\n */\\n function safeSLOAD(\\n bytes32 _key\\n )\\n internal\\n returns (\\n bytes32\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmSLOAD(bytes32)\\\",\\n _key\\n )\\n );\\n\\n return abi.decode(returndata, (bytes32));\\n }\\n\\n /**\\n * Performs a safe ovmSSTORE call.\\n */\\n function safeSSTORE(\\n bytes32 _key,\\n bytes32 _value\\n )\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmSSTORE(bytes32,bytes32)\\\",\\n _key,\\n _value\\n )\\n );\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Performs an ovm interaction and the necessary safety checks.\\n * @param _gasLimit Gas limit for the interaction.\\n * @param _calldata Data to send to the OVM_ExecutionManager (encoded with sighash).\\n * @return _returndata Data sent back by the OVM_ExecutionManager.\\n */\\n function _safeExecutionManagerInteraction(\\n uint256 _gasLimit,\\n bytes memory _calldata\\n )\\n private\\n returns (\\n bytes memory _returndata\\n )\\n {\\n address ovmExecutionManager = msg.sender;\\n (\\n bool success,\\n bytes memory returndata\\n ) = ovmExecutionManager.call{gas: _gasLimit}(_calldata);\\n\\n if (success == false) {\\n assembly {\\n revert(add(returndata, 0x20), mload(returndata))\\n }\\n } else if (returndata.length == 1) {\\n assembly {\\n return(0, 1)\\n }\\n } else {\\n return returndata;\\n }\\n }\\n\\n function _safeExecutionManagerInteraction(\\n bytes memory _calldata\\n )\\n private\\n returns (\\n bytes memory _returndata\\n )\\n {\\n return _safeExecutionManagerInteraction(\\n gasleft(),\\n _calldata\\n );\\n }\\n}\\n\",\"keccak256\":\"0xdc30487ca1580f3498d4a1c4e26dc53158c00b44bd72da212a66267c22a139b0\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x608060405234801561001057600080fd5b50604051611bdd380380611bdd83398101604081905261002f9161005b565b600080546001600160a01b0319166001600160a01b03949094169390931790925560015560025561009c565b60008060006060848603121561006f578283fd5b83516001600160a01b0381168114610085578384fd5b602085015160409095015190969495509392505050565b611b32806100ab6000396000f3fe608060405234801561001057600080fd5b50600436106100a95760003560e01c80638ca5cbb9116100715780638ca5cbb91461011c5780639418bddd14610131578063b8e189ac14610144578063c17b291b14610157578063cfdf677e1461015f578063e561dddc14610167576100a9565b8063461a4478146100ae5780634d69ee57146100d75780637aa63a86146100f75780637ad168a01461010c57806381eb62ef14610114575b600080fd5b6100c16100bc3660046114d2565b61016f565b6040516100ce919061158e565b60405180910390f35b6100ea6100e5366004611420565b61024d565b6040516100ce91906115a2565b6100ff6102c0565b6040516100ce91906115ad565b6100ff6102d9565b6100ff6102f2565b61012f61012a36600461137f565b6102f8565b005b6100ea61013f366004611520565b61050c565b61012f610152366004611520565b61055c565b6100ff610614565b6100c161061a565b6100ff610642565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b838110156101cf5781810151838201526020016101b7565b50505050905090810190601f1680156101fc5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561021957600080fd5b505afa15801561022d573d6000803e3d6000fd5b505050506040513d602081101561024357600080fd5b505190505b919050565b6000610258836106bc565b61027d5760405162461bcd60e51b815260040161027490611738565b60405180910390fd5b61029a836020015185846000015185602001518760400151610754565b6102b65760405162461bcd60e51b8152600401610274906116a4565b5060019392505050565b6000806102cb6108d9565b5064ffffffffff1691505090565b6000806102e46108d9565b64ffffffffff169250505090565b60025481565b6103006102c0565b811461031e5760405162461bcd60e51b8152600401610274906116db565b61034e6040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b81525061016f565b6001600160a01b03166302ad4d2a336040518263ffffffff1660e01b8152600401610379919061158e565b60206040518083038186803b15801561039157600080fd5b505afa1580156103a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103c991906113c2565b6103e55760405162461bcd60e51b8152600401610274906118aa565b60008251116104065760405162461bcd60e51b815260040161027490611867565b6104446040518060400160405280601d81526020017f4f564d5f43616e6f6e6963616c5472616e73616374696f6e436861696e00000081525061016f565b6001600160a01b0316637aa63a866040518163ffffffff1660e01b815260040160206040518083038186803b15801561047c57600080fd5b505afa158015610490573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104b49190611408565b82516104be6102c0565b0111156104dd5760405162461bcd60e51b815260040161027490611635565b6105088242336040516020016104f4929190611990565b60405160208183030381529060405261096e565b5050565b60008082608001518060200190518101906105279190611553565b509050806105475760405162461bcd60e51b815260040161027490611822565b4261055482600154610b10565b119392505050565b61058e6040518060400160405280601181526020017027ab26afa33930bab22b32b934b334b2b960791b81525061016f565b6001600160a01b0316336001600160a01b0316146105be5760405162461bcd60e51b8152600401610274906117c5565b6105c7816106bc565b6105e35760405162461bcd60e51b815260040161027490611738565b6105ec8161050c565b6106085760405162461bcd60e51b815260040161027490611767565b61061181610b71565b50565b60015481565b600061063d604051806060016040528060258152602001611aa46025913961016f565b905090565b600061064c61061a565b6001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b15801561068457600080fd5b505afa158015610698573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061063d9190611408565b60006106c661061a565b8251604051634a83e9cd60e11b81526001600160a01b039290921691639507d39a916106f4916004016115ad565b60206040518083038186803b15801561070c57600080fd5b505afa158015610720573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107449190611408565b61074d83610ce9565b1492915050565b60008082116107945760405162461bcd60e51b8152600401808060200182810382526037815260200180611a206037913960400191505060405180910390fd5b8184106107d25760405162461bcd60e51b81526004018080602001828103825260248152602001806119cc6024913960400191505060405180910390fd5b6107db82610d2f565b8351146108195760405162461bcd60e51b815260040180806020018281038252604d815260200180611a57604d913960600191505060405180910390fd5b8460005b84518110156108cc57856001166001141561087b5784818151811061083e57fe5b60200260200101518260405160200180838152602001828152602001925050506040516020818303038152906040528051906020012091506108c0565b8185828151811061088857fe5b602002602001015160405160200180838152602001828152602001925050506040516020818303038152906040528051906020012091505b600195861c950161081d565b5090951495945050505050565b60008060006108e661061a565b6001600160a01b031663ccf8f9696040518163ffffffff1660e01b815260040160206040518083038186803b15801561091e57600080fd5b505afa158015610932573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061095691906113e2565b64ffffffffff602882901c16935060501c9150509091565b600061099e6040518060400160405280600d81526020016c27ab26afa9b2b8bab2b731b2b960991b81525061016f565b90506000806109ab6108d9565b9092509050336001600160a01b03841614156109c85750426109f2565b426002548264ffffffffff1601106109f25760405162461bcd60e51b8152600401610274906118f9565b60006040518060a00160405280610a07610642565b8152602001610a1588610dd9565b8152602001875181526020018464ffffffffff16815260200186815250905080600001517f16be4c5129a4e03cf3350262e181dc02ddfb4a6008d925368c0899fcd97ca9c58260200151836040015184606001518560800151604051610a7e94939291906115cc565b60405180910390a2610a8e61061a565b6001600160a01b0316632015276c610aa583610ce9565b610ab9846040015185606001510186611209565b6040518363ffffffff1660e01b8152600401610ad69291906115b6565b600060405180830381600087803b158015610af057600080fd5b505af1158015610b04573d6000803e3d6000fd5b50505050505050505050565b600082820183811015610b6a576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b610b7961061a565b6001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b158015610bb157600080fd5b505afa158015610bc5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610be99190611408565b815110610c085760405162461bcd60e51b815260040161027490611962565b610c11816106bc565b610c2d5760405162461bcd60e51b815260040161027490611738565b610c3561061a565b6001600160a01b031663167fd6818260000151610c5784606001516000611209565b6040518363ffffffff1660e01b8152600401610c749291906115b6565b600060405180830381600087803b158015610c8e57600080fd5b505af1158015610ca2573d6000803e3d6000fd5b5050505080600001517f8747b69ce8fdb31c3b9b0a67bd8049ad8c1a69ea417b69b12174068abd9cbd648260200151604051610cde91906115ad565b60405180910390a250565b60008160200151826040015183606001518460800151604051602001610d1294939291906115cc565b604051602081830303815290604052805190602001209050919050565b6000808211610d6f5760405162461bcd60e51b81526004018080602001828103825260308152602001806119f06030913960400191505060405180910390fd5b8160011415610d8057506000610248565b81600060805b60018160ff1610610dc4578060ff1660018260ff166001901b03901b8316600014610db95760ff811692831c9291909101905b60011c607f16610d86565b506001811b8414610b6a576001019392505050565b600080825111610e1a5760405162461bcd60e51b8152600401808060200182810382526034815260200180611ac96034913960400191505060405180910390fd5b8151610e3c5781600081518110610e2d57fe5b60200260200101519050610248565b60408051610200810182527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56381527f633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d60208201527f890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d818301527f3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd86060808301919091527fecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da60808301527fdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da560a08301527f617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d760c08301527f292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead60e08301527fe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e106101008301527f7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f826101208301527fe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e836365166101408301527f3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c6101608301527fad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e6101808301527fa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab6101a08301527f4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c8626101c08301527f2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf106101e083015282518381529081018352909160009190602082018180368337505085519192506000918291508180805b60018411156111e55750506002820460018084161460005b82811015611161578a816002028151811061110857fe5b602002602001015196508a816002026001018151811061112457fe5b6020026020010151955086602089015285604089015287805190602001208b828151811061114e57fe5b60209081029190910101526001016110f1565b5080156111c45789600185038151811061117757fe5b6020026020010151955087836010811061118d57fe5b602002015160001b945085602088015284604088015286805190602001208a83815181106111b757fe5b6020026020010181815250505b806111d05760006111d3565b60015b60ff16820193506001909201916110d9565b896000815181106111f257fe5b602002602001015198505050505050505050919050565b602890811b91909117901b90565b600067ffffffffffffffff83111561122b57fe5b61123e601f8401601f19166020016119a7565b905082815283838301111561125257600080fd5b828260208301376000602084830101529392505050565b600082601f830112611279578081fd5b8135602067ffffffffffffffff82111561128f57fe5b80820261129d8282016119a7565b8381528281019086840183880185018910156112b7578687fd5b8693505b858410156112d95780358352600193909301929184019184016112bb565b50979650505050505050565b600060a082840312156112f6578081fd5b60405160a0810167ffffffffffffffff828210818311171561131457fe5b8160405282935084358352602085013560208401526040850135604084015260608501356060840152608085013591508082111561135157600080fd5b508301601f8101851361136357600080fd5b61137285823560208401611217565b6080830152505092915050565b60008060408385031215611391578182fd5b823567ffffffffffffffff8111156113a7578283fd5b6113b385828601611269565b95602094909401359450505050565b6000602082840312156113d3578081fd5b81518015158114610b6a578182fd5b6000602082840312156113f3578081fd5b815164ffffffffff1981168114610b6a578182fd5b600060208284031215611419578081fd5b5051919050565b600080600060608486031215611434578081fd5b83359250602084013567ffffffffffffffff80821115611452578283fd5b61145e878388016112e5565b93506040860135915080821115611473578283fd5b9085019060408288031215611486578283fd5b60405160408101818110838211171561149b57fe5b604052823581526020830135828111156114b3578485fd5b6114bf89828601611269565b6020830152508093505050509250925092565b6000602082840312156114e3578081fd5b813567ffffffffffffffff8111156114f9578182fd5b8201601f81018413611509578182fd5b61151884823560208401611217565b949350505050565b600060208284031215611531578081fd5b813567ffffffffffffffff811115611547578182fd5b611518848285016112e5565b60008060408385031215611565578182fd5b825160208401519092506001600160a01b0381168114611583578182fd5b809150509250929050565b6001600160a01b0391909116815260200190565b901515815260200190565b90815260200190565b91825264ffffffffff1916602082015260400190565b600085825260208581840152846040840152608060608401528351806080850152825b8181101561160b5785810183015185820160a0015282016115ef565b8181111561161c578360a083870101525b50601f01601f19169290920160a0019695505050505050565b60208082526049908201527f4e756d626572206f6620737461746520726f6f74732063616e6e6f742065786360408201527f65656420746865206e756d626572206f662063616e6f6e6963616c207472616e60608201526839b0b1ba34b7b7399760b91b608082015260a00190565b60208082526018908201527f496e76616c696420696e636c7573696f6e2070726f6f662e0000000000000000604082015260600190565b6020808252603d908201527f41637475616c20626174636820737461727420696e64657820646f6573206e6f60408201527f74206d6174636820657870656374656420737461727420696e6465782e000000606082015260800190565b60208082526015908201527424b73b30b634b2103130ba31b4103432b0b232b91760591b604082015260600190565b602080825260409082018190527f537461746520626174636865732063616e206f6e6c792062652064656c657465908201527f642077697468696e207468652066726175642070726f6f662077696e646f772e606082015260800190565b6020808252603b908201527f537461746520626174636865732063616e206f6e6c792062652064656c65746560408201527f6420627920746865204f564d5f467261756456657269666965722e0000000000606082015260800190565b60208082526025908201527f4261746368206865616465722074696d657374616d702063616e6e6f74206265604082015264207a65726f60d81b606082015260800190565b60208082526023908201527f43616e6e6f74207375626d697420616e20656d7074792073746174652062617460408201526231b41760e91b606082015260800190565b6020808252602f908201527f50726f706f73657220646f6573206e6f74206861766520656e6f75676820636f60408201526e1b1b185d195c985b081c1bdcdd1959608a1b606082015260800190565b60208082526043908201527f43616e6e6f74207075626c69736820737461746520726f6f747320776974686960408201527f6e207468652073657175656e636572207075626c69636174696f6e2077696e6460608201526237bb9760e91b608082015260a00190565b60208082526014908201527324b73b30b634b2103130ba31b41034b73232bc1760611b604082015260600190565b9182526001600160a01b0316602082015260400190565b60405181810167ffffffffffffffff811182821017156119c357fe5b60405291905056fe4c69625f4d65726b6c65547265653a20496e646578206f7574206f6620626f756e64732e4c69625f4d65726b6c65547265653a2043616e6e6f7420636f6d70757465206365696c286c6f675f3229206f6620302e4c69625f4d65726b6c65547265653a20546f74616c206c6561766573206d7573742062652067726561746572207468616e207a65726f2e4c69625f4d65726b6c65547265653a20546f74616c207369626c696e677320646f6573206e6f7420636f72726563746c7920636f72726573706f6e6420746f20746f74616c206c65617665732e4f564d5f436861696e53746f72616765436f6e7461696e65723a5343433a626174636865734c69625f4d65726b6c65547265653a204d7573742070726f76696465206174206c65617374206f6e65206c65616620686173682ea26469706673582212206c6482b6f7e523363e832b3b1ee9e8f289af99ec8740fb9ad096a98e94e0ed8164736f6c63430007060033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100a95760003560e01c80638ca5cbb9116100715780638ca5cbb91461011c5780639418bddd14610131578063b8e189ac14610144578063c17b291b14610157578063cfdf677e1461015f578063e561dddc14610167576100a9565b8063461a4478146100ae5780634d69ee57146100d75780637aa63a86146100f75780637ad168a01461010c57806381eb62ef14610114575b600080fd5b6100c16100bc3660046114d2565b61016f565b6040516100ce919061158e565b60405180910390f35b6100ea6100e5366004611420565b61024d565b6040516100ce91906115a2565b6100ff6102c0565b6040516100ce91906115ad565b6100ff6102d9565b6100ff6102f2565b61012f61012a36600461137f565b6102f8565b005b6100ea61013f366004611520565b61050c565b61012f610152366004611520565b61055c565b6100ff610614565b6100c161061a565b6100ff610642565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b838110156101cf5781810151838201526020016101b7565b50505050905090810190601f1680156101fc5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561021957600080fd5b505afa15801561022d573d6000803e3d6000fd5b505050506040513d602081101561024357600080fd5b505190505b919050565b6000610258836106bc565b61027d5760405162461bcd60e51b815260040161027490611738565b60405180910390fd5b61029a836020015185846000015185602001518760400151610754565b6102b65760405162461bcd60e51b8152600401610274906116a4565b5060019392505050565b6000806102cb6108d9565b5064ffffffffff1691505090565b6000806102e46108d9565b64ffffffffff169250505090565b60025481565b6103006102c0565b811461031e5760405162461bcd60e51b8152600401610274906116db565b61034e6040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b81525061016f565b6001600160a01b03166302ad4d2a336040518263ffffffff1660e01b8152600401610379919061158e565b60206040518083038186803b15801561039157600080fd5b505afa1580156103a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103c991906113c2565b6103e55760405162461bcd60e51b8152600401610274906118aa565b60008251116104065760405162461bcd60e51b815260040161027490611867565b6104446040518060400160405280601d81526020017f4f564d5f43616e6f6e6963616c5472616e73616374696f6e436861696e00000081525061016f565b6001600160a01b0316637aa63a866040518163ffffffff1660e01b815260040160206040518083038186803b15801561047c57600080fd5b505afa158015610490573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104b49190611408565b82516104be6102c0565b0111156104dd5760405162461bcd60e51b815260040161027490611635565b6105088242336040516020016104f4929190611990565b60405160208183030381529060405261096e565b5050565b60008082608001518060200190518101906105279190611553565b509050806105475760405162461bcd60e51b815260040161027490611822565b4261055482600154610b10565b119392505050565b61058e6040518060400160405280601181526020017027ab26afa33930bab22b32b934b334b2b960791b81525061016f565b6001600160a01b0316336001600160a01b0316146105be5760405162461bcd60e51b8152600401610274906117c5565b6105c7816106bc565b6105e35760405162461bcd60e51b815260040161027490611738565b6105ec8161050c565b6106085760405162461bcd60e51b815260040161027490611767565b61061181610b71565b50565b60015481565b600061063d604051806060016040528060258152602001611aa46025913961016f565b905090565b600061064c61061a565b6001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b15801561068457600080fd5b505afa158015610698573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061063d9190611408565b60006106c661061a565b8251604051634a83e9cd60e11b81526001600160a01b039290921691639507d39a916106f4916004016115ad565b60206040518083038186803b15801561070c57600080fd5b505afa158015610720573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107449190611408565b61074d83610ce9565b1492915050565b60008082116107945760405162461bcd60e51b8152600401808060200182810382526037815260200180611a206037913960400191505060405180910390fd5b8184106107d25760405162461bcd60e51b81526004018080602001828103825260248152602001806119cc6024913960400191505060405180910390fd5b6107db82610d2f565b8351146108195760405162461bcd60e51b815260040180806020018281038252604d815260200180611a57604d913960600191505060405180910390fd5b8460005b84518110156108cc57856001166001141561087b5784818151811061083e57fe5b60200260200101518260405160200180838152602001828152602001925050506040516020818303038152906040528051906020012091506108c0565b8185828151811061088857fe5b602002602001015160405160200180838152602001828152602001925050506040516020818303038152906040528051906020012091505b600195861c950161081d565b5090951495945050505050565b60008060006108e661061a565b6001600160a01b031663ccf8f9696040518163ffffffff1660e01b815260040160206040518083038186803b15801561091e57600080fd5b505afa158015610932573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061095691906113e2565b64ffffffffff602882901c16935060501c9150509091565b600061099e6040518060400160405280600d81526020016c27ab26afa9b2b8bab2b731b2b960991b81525061016f565b90506000806109ab6108d9565b9092509050336001600160a01b03841614156109c85750426109f2565b426002548264ffffffffff1601106109f25760405162461bcd60e51b8152600401610274906118f9565b60006040518060a00160405280610a07610642565b8152602001610a1588610dd9565b8152602001875181526020018464ffffffffff16815260200186815250905080600001517f16be4c5129a4e03cf3350262e181dc02ddfb4a6008d925368c0899fcd97ca9c58260200151836040015184606001518560800151604051610a7e94939291906115cc565b60405180910390a2610a8e61061a565b6001600160a01b0316632015276c610aa583610ce9565b610ab9846040015185606001510186611209565b6040518363ffffffff1660e01b8152600401610ad69291906115b6565b600060405180830381600087803b158015610af057600080fd5b505af1158015610b04573d6000803e3d6000fd5b50505050505050505050565b600082820183811015610b6a576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b610b7961061a565b6001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b158015610bb157600080fd5b505afa158015610bc5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610be99190611408565b815110610c085760405162461bcd60e51b815260040161027490611962565b610c11816106bc565b610c2d5760405162461bcd60e51b815260040161027490611738565b610c3561061a565b6001600160a01b031663167fd6818260000151610c5784606001516000611209565b6040518363ffffffff1660e01b8152600401610c749291906115b6565b600060405180830381600087803b158015610c8e57600080fd5b505af1158015610ca2573d6000803e3d6000fd5b5050505080600001517f8747b69ce8fdb31c3b9b0a67bd8049ad8c1a69ea417b69b12174068abd9cbd648260200151604051610cde91906115ad565b60405180910390a250565b60008160200151826040015183606001518460800151604051602001610d1294939291906115cc565b604051602081830303815290604052805190602001209050919050565b6000808211610d6f5760405162461bcd60e51b81526004018080602001828103825260308152602001806119f06030913960400191505060405180910390fd5b8160011415610d8057506000610248565b81600060805b60018160ff1610610dc4578060ff1660018260ff166001901b03901b8316600014610db95760ff811692831c9291909101905b60011c607f16610d86565b506001811b8414610b6a576001019392505050565b600080825111610e1a5760405162461bcd60e51b8152600401808060200182810382526034815260200180611ac96034913960400191505060405180910390fd5b8151610e3c5781600081518110610e2d57fe5b60200260200101519050610248565b60408051610200810182527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56381527f633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d60208201527f890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d818301527f3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd86060808301919091527fecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da60808301527fdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da560a08301527f617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d760c08301527f292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead60e08301527fe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e106101008301527f7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f826101208301527fe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e836365166101408301527f3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c6101608301527fad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e6101808301527fa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab6101a08301527f4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c8626101c08301527f2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf106101e083015282518381529081018352909160009190602082018180368337505085519192506000918291508180805b60018411156111e55750506002820460018084161460005b82811015611161578a816002028151811061110857fe5b602002602001015196508a816002026001018151811061112457fe5b6020026020010151955086602089015285604089015287805190602001208b828151811061114e57fe5b60209081029190910101526001016110f1565b5080156111c45789600185038151811061117757fe5b6020026020010151955087836010811061118d57fe5b602002015160001b945085602088015284604088015286805190602001208a83815181106111b757fe5b6020026020010181815250505b806111d05760006111d3565b60015b60ff16820193506001909201916110d9565b896000815181106111f257fe5b602002602001015198505050505050505050919050565b602890811b91909117901b90565b600067ffffffffffffffff83111561122b57fe5b61123e601f8401601f19166020016119a7565b905082815283838301111561125257600080fd5b828260208301376000602084830101529392505050565b600082601f830112611279578081fd5b8135602067ffffffffffffffff82111561128f57fe5b80820261129d8282016119a7565b8381528281019086840183880185018910156112b7578687fd5b8693505b858410156112d95780358352600193909301929184019184016112bb565b50979650505050505050565b600060a082840312156112f6578081fd5b60405160a0810167ffffffffffffffff828210818311171561131457fe5b8160405282935084358352602085013560208401526040850135604084015260608501356060840152608085013591508082111561135157600080fd5b508301601f8101851361136357600080fd5b61137285823560208401611217565b6080830152505092915050565b60008060408385031215611391578182fd5b823567ffffffffffffffff8111156113a7578283fd5b6113b385828601611269565b95602094909401359450505050565b6000602082840312156113d3578081fd5b81518015158114610b6a578182fd5b6000602082840312156113f3578081fd5b815164ffffffffff1981168114610b6a578182fd5b600060208284031215611419578081fd5b5051919050565b600080600060608486031215611434578081fd5b83359250602084013567ffffffffffffffff80821115611452578283fd5b61145e878388016112e5565b93506040860135915080821115611473578283fd5b9085019060408288031215611486578283fd5b60405160408101818110838211171561149b57fe5b604052823581526020830135828111156114b3578485fd5b6114bf89828601611269565b6020830152508093505050509250925092565b6000602082840312156114e3578081fd5b813567ffffffffffffffff8111156114f9578182fd5b8201601f81018413611509578182fd5b61151884823560208401611217565b949350505050565b600060208284031215611531578081fd5b813567ffffffffffffffff811115611547578182fd5b611518848285016112e5565b60008060408385031215611565578182fd5b825160208401519092506001600160a01b0381168114611583578182fd5b809150509250929050565b6001600160a01b0391909116815260200190565b901515815260200190565b90815260200190565b91825264ffffffffff1916602082015260400190565b600085825260208581840152846040840152608060608401528351806080850152825b8181101561160b5785810183015185820160a0015282016115ef565b8181111561161c578360a083870101525b50601f01601f19169290920160a0019695505050505050565b60208082526049908201527f4e756d626572206f6620737461746520726f6f74732063616e6e6f742065786360408201527f65656420746865206e756d626572206f662063616e6f6e6963616c207472616e60608201526839b0b1ba34b7b7399760b91b608082015260a00190565b60208082526018908201527f496e76616c696420696e636c7573696f6e2070726f6f662e0000000000000000604082015260600190565b6020808252603d908201527f41637475616c20626174636820737461727420696e64657820646f6573206e6f60408201527f74206d6174636820657870656374656420737461727420696e6465782e000000606082015260800190565b60208082526015908201527424b73b30b634b2103130ba31b4103432b0b232b91760591b604082015260600190565b602080825260409082018190527f537461746520626174636865732063616e206f6e6c792062652064656c657465908201527f642077697468696e207468652066726175642070726f6f662077696e646f772e606082015260800190565b6020808252603b908201527f537461746520626174636865732063616e206f6e6c792062652064656c65746560408201527f6420627920746865204f564d5f467261756456657269666965722e0000000000606082015260800190565b60208082526025908201527f4261746368206865616465722074696d657374616d702063616e6e6f74206265604082015264207a65726f60d81b606082015260800190565b60208082526023908201527f43616e6e6f74207375626d697420616e20656d7074792073746174652062617460408201526231b41760e91b606082015260800190565b6020808252602f908201527f50726f706f73657220646f6573206e6f74206861766520656e6f75676820636f60408201526e1b1b185d195c985b081c1bdcdd1959608a1b606082015260800190565b60208082526043908201527f43616e6e6f74207075626c69736820737461746520726f6f747320776974686960408201527f6e207468652073657175656e636572207075626c69636174696f6e2077696e6460608201526237bb9760e91b608082015260a00190565b60208082526014908201527324b73b30b634b2103130ba31b41034b73232bc1760611b604082015260600190565b9182526001600160a01b0316602082015260400190565b60405181810167ffffffffffffffff811182821017156119c357fe5b60405291905056fe4c69625f4d65726b6c65547265653a20496e646578206f7574206f6620626f756e64732e4c69625f4d65726b6c65547265653a2043616e6e6f7420636f6d70757465206365696c286c6f675f3229206f6620302e4c69625f4d65726b6c65547265653a20546f74616c206c6561766573206d7573742062652067726561746572207468616e207a65726f2e4c69625f4d65726b6c65547265653a20546f74616c207369626c696e677320646f6573206e6f7420636f72726563746c7920636f72726573706f6e6420746f20746f74616c206c65617665732e4f564d5f436861696e53746f72616765436f6e7461696e65723a5343433a626174636865734c69625f4d65726b6c65547265653a204d7573742070726f76696465206174206c65617374206f6e65206c65616620686173682ea26469706673582212206c6482b6f7e523363e832b3b1ee9e8f289af99ec8740fb9ad096a98e94e0ed8164736f6c63430007060033", - "devdoc": { - "kind": "dev", - "methods": { - "appendStateBatch(bytes32[],uint256)": { - "params": { - "_batch": "Batch of state roots.", - "_shouldStartAtElement": "Index of the element at which this batch should start." - } - }, - "batches()": { - "returns": { - "_0": "Reference to the batch storage container." - } - }, - "constructor": { - "params": { - "_libAddressManager": "Address of the Address Manager." - } - }, - "deleteStateBatch((uint256,bytes32,uint256,uint256,bytes))": { - "params": { - "_batchHeader": "Header of the batch to start deleting from." - } - }, - "getLastSequencerTimestamp()": { - "returns": { - "_lastSequencerTimestamp": "Last sequencer batch timestamp." - } - }, - "getTotalBatches()": { - "returns": { - "_totalBatches": "Total submitted batches." - } - }, - "getTotalElements()": { - "returns": { - "_totalElements": "Total submitted elements." - } - }, - "insideFraudProofWindow((uint256,bytes32,uint256,uint256,bytes))": { - "params": { - "_batchHeader": "Header of the batch to check." - }, - "returns": { - "_inside": "Whether or not the batch is inside the fraud proof window." - } - }, - "verifyStateCommitment(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))": { - "params": { - "_batchHeader": "Header of the batch in which the element was included.", - "_element": "Hash of the element to verify a proof for.", - "_proof": "Merkle inclusion proof for the element." - } - } - }, - "title": "OVM_StateCommitmentChain", - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": { - "appendStateBatch(bytes32[],uint256)": { - "notice": "Appends a batch of state roots to the chain." - }, - "batches()": { - "notice": "Accesses the batch storage container." - }, - "deleteStateBatch((uint256,bytes32,uint256,uint256,bytes))": { - "notice": "Deletes all state roots after (and including) a given batch." - }, - "getLastSequencerTimestamp()": { - "notice": "Retrieves the timestamp of the last batch submitted by the sequencer." - }, - "getTotalBatches()": { - "notice": "Retrieves the total number of batches submitted." - }, - "getTotalElements()": { - "notice": "Retrieves the total number of elements submitted." - }, - "insideFraudProofWindow((uint256,bytes32,uint256,uint256,bytes))": { - "notice": "Checks whether a given batch is still inside its fraud proof window." - }, - "verifyStateCommitment(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))": { - "notice": "Verifies a batch inclusion proof." - } - }, - "version": 1 - }, - "storageLayout": { - "storage": [ - { - "astId": 11707, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_StateCommitmentChain.sol:OVM_StateCommitmentChain", - "label": "libAddressManager", - "offset": 0, - "slot": "0", - "type": "t_contract(Lib_AddressManager)11700" - }, - { - "astId": 3141, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_StateCommitmentChain.sol:OVM_StateCommitmentChain", - "label": "FRAUD_PROOF_WINDOW", - "offset": 0, - "slot": "1", - "type": "t_uint256" - }, - { - "astId": 3143, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_StateCommitmentChain.sol:OVM_StateCommitmentChain", - "label": "SEQUENCER_PUBLISH_WINDOW", - "offset": 0, - "slot": "2", - "type": "t_uint256" - } - ], - "types": { - "t_contract(Lib_AddressManager)11700": { - "encoding": "inplace", - "label": "contract Lib_AddressManager", - "numberOfBytes": "20" - }, - "t_uint256": { - "encoding": "inplace", - "label": "uint256", - "numberOfBytes": "32" - } - } - } -} \ No newline at end of file diff --git a/packages/contracts/deployments/goerli-v1/Proxy__OVM_L1CrossDomainMessenger.json b/packages/contracts/deployments/goerli-v1/Proxy__OVM_L1CrossDomainMessenger.json deleted file mode 100644 index 8764771553fea..0000000000000 --- a/packages/contracts/deployments/goerli-v1/Proxy__OVM_L1CrossDomainMessenger.json +++ /dev/null @@ -1,118 +0,0 @@ -{ - "address": "0x0f94dA8E27A6116E341c5C807aD32c62EBc90eB6", - "abi": [ - { - "inputs": [ - { - "internalType": "address", - "name": "_libAddressManager", - "type": "address" - }, - { - "internalType": "string", - "name": "_implementationName", - "type": "string" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "stateMutability": "nonpayable", - "type": "fallback" - } - ], - "transactionHash": "0xf56350f6788ffb9ebfa35403412369a4fac3147ab5a612956ea8146fe14308ed", - "receipt": { - "to": null, - "from": "0x558ba9b8d78713fbf768c1f8a584485B4003f43F", - "contractAddress": "0x40C6cA6dDdd27E9B4d50da1E393B82b71B1C5D45", - "transactionIndex": 15, - "gasUsed": "228252", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0x255fee49c39936345b0004796d61db7b0953cc70f0a9081d86d3447b23b491a2", - "transactionHash": "0xf56350f6788ffb9ebfa35403412369a4fac3147ab5a612956ea8146fe14308ed", - "logs": [], - "blockNumber": 4573449, - "cumulativeGasUsed": "1727110", - "status": 1, - "byzantium": true - }, - "args": [ - "0xE630cdf302880783364334455C8352fE0aB5b748", - "OVM_L1CrossDomainMessenger" - ], - "solcInputHash": "cebcb515c1a9c570d96e0b8f6fd237e2", - "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_implementationName\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"stateMutability\":\"nonpayable\",\"type\":\"fallback\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_implementationName\":\"implementationName of the contract to proxy to.\",\"_libAddressManager\":\"Address of the Lib_AddressManager.\"}}},\"title\":\"Lib_ResolvedDelegateProxy\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/libraries/resolver/Lib_ResolvedDelegateProxy.sol\":\"Lib_ResolvedDelegateProxy\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// +build ovm\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Contract Imports */\\nimport { Ownable } from \\\"./Lib_Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n /*******************************************\\n * Contract Variables: Internal Accounting *\\n *******************************************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n public\\n onlyOwner\\n {\\n emit AddressSet(_name, _address);\\n addresses[_getNameHash(_name)] = _address;\\n }\\n\\n function getAddress(\\n string memory _name\\n )\\n public\\n view\\n returns (address)\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32 _hash\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xdf802e1cc6474df913626991e9fca3835c620a519f397afe04bf9c260e723257\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// +build ovm\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Ownable\\n * @dev Adapted from https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol\\n */\\nabstract contract Ownable {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n address public owner;\\n\\n\\n /**********\\n * Events *\\n **********/\\n\\n event OwnershipTransferred(\\n address indexed previousOwner,\\n address indexed newOwner\\n );\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n constructor() internal {\\n owner = msg.sender;\\n emit OwnershipTransferred(address(0), owner);\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n owner == msg.sender,\\n \\\"Ownable: caller is not the owner\\\"\\n );\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function renounceOwnership()\\n public\\n virtual\\n onlyOwner\\n {\\n emit OwnershipTransferred(owner, address(0));\\n owner = address(0);\\n }\\n\\n function transferOwnership(address _newOwner)\\n public\\n virtual\\n onlyOwner\\n {\\n require(\\n _newOwner != address(0),\\n \\\"Ownable: new owner cannot be the zero address\\\"\\n );\\n\\n emit OwnershipTransferred(owner, _newOwner);\\n owner = _newOwner;\\n }\\n}\\n\",\"keccak256\":\"0xe0409fbd236d16ca6be439d9d97dd36d0d9a0697ee0062d49588b9d29c248e47\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_ResolvedDelegateProxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.7.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_ResolvedDelegateProxy\\n */\\ncontract Lib_ResolvedDelegateProxy {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n // Using mappings to store fields to avoid overwriting storage slots in the\\n // implementation contract. For example, instead of storing these fields at\\n // storage slot `0` & `1`, they are stored at `hash(${FIELD_NAME} + address(this))`\\n // See: https://solidity.readthedocs.io/en/v0.7.0/internals/layout_in_storage.html\\n mapping(address=>string) private implementationName;\\n mapping(address=>Lib_AddressManager) private addressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n * @param _implementationName implementationName of the contract to proxy to.\\n */\\n constructor(\\n address _libAddressManager,\\n string memory _implementationName\\n )\\n {\\n addressManager[address(this)] = Lib_AddressManager(_libAddressManager);\\n implementationName[address(this)] = _implementationName;\\n }\\n\\n\\n /*********************\\n * Fallback Function *\\n *********************/\\n\\n fallback()\\n external\\n {\\n address target = addressManager[address(this)].getAddress((implementationName[address(this)]));\\n require(\\n target != address(0),\\n \\\"Target address must be initialized.\\\"\\n );\\n\\n (bool success, bytes memory returndata) = target.delegatecall(msg.data);\\n\\n if (success == true) {\\n assembly {\\n return(add(returndata, 0x20), mload(returndata))\\n }\\n } else {\\n assembly {\\n revert(add(returndata, 0x20), mload(returndata))\\n }\\n }\\n }\\n}\\n\",\"keccak256\":\"0x7b94d77f1ceef7bf89687de3a9c574d994d531e4b98007b106fbac54bab7e8ea\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x608060405234801561001057600080fd5b506040516104173803806104178339818101604052604081101561003357600080fd5b81516020830180516040519294929383019291908464010000000082111561005a57600080fd5b90830190602082018581111561006f57600080fd5b825164010000000081118282018810171561008957600080fd5b82525081516020918201929091019080838360005b838110156100b657818101518382015260200161009e565b50505050905090810190601f1680156100e35780820380516001836020036101000a031916815260200191505b5060409081523060009081526001602090815282822080546001600160a01b0319166001600160a01b038a16179055818152919020855161012c95509093509085019150610134565b5050506101d5565b828054600181600116156101000203166002900490600052602060002090601f01602090048101928261016a57600085556101b0565b82601f1061018357805160ff19168380011785556101b0565b828001600101855582156101b0579182015b828111156101b0578251825591602001919060010190610195565b506101bc9291506101c0565b5090565b5b808211156101bc57600081556001016101c1565b610233806101e46000396000f3fe608060405234801561001057600080fd5b5030600090815260016020818152604080842054848352818520915163bf40fac160e01b815260048101938452825460026101009682161596909602600019011694909404602485018190526001600160a01b039091169363bf40fac19391829160440190849080156100c45780601f10610099576101008083540402835291602001916100c4565b820191906000526020600020905b8154815290600101906020018083116100a757829003601f168201915b50509250505060206040518083038186803b1580156100e257600080fd5b505afa1580156100f6573d6000803e3d6000fd5b505050506040513d602081101561010c57600080fd5b505190506001600160a01b0381166101555760405162461bcd60e51b81526004018080602001828103825260238152602001806101db6023913960400191505060405180910390fd5b600080826001600160a01b03166000366040518083838082843760405192019450600093509091505080830381855af49150503d80600081146101b4576040519150601f19603f3d011682016040523d82523d6000602084013e6101b9565b606091505b509092509050600182151514156101d257805160208201f35b805160208201fdfe5461726765742061646472657373206d75737420626520696e697469616c697a65642ea264697066735822122022cf2e6b66b75ae0d7a780704aa9d326dd541b72493bb1a405188ed67fed0b5964736f6c63430007060033", - "deployedBytecode": "0x608060405234801561001057600080fd5b5030600090815260016020818152604080842054848352818520915163bf40fac160e01b815260048101938452825460026101009682161596909602600019011694909404602485018190526001600160a01b039091169363bf40fac19391829160440190849080156100c45780601f10610099576101008083540402835291602001916100c4565b820191906000526020600020905b8154815290600101906020018083116100a757829003601f168201915b50509250505060206040518083038186803b1580156100e257600080fd5b505afa1580156100f6573d6000803e3d6000fd5b505050506040513d602081101561010c57600080fd5b505190506001600160a01b0381166101555760405162461bcd60e51b81526004018080602001828103825260238152602001806101db6023913960400191505060405180910390fd5b600080826001600160a01b03166000366040518083838082843760405192019450600093509091505080830381855af49150503d80600081146101b4576040519150601f19603f3d011682016040523d82523d6000602084013e6101b9565b606091505b509092509050600182151514156101d257805160208201f35b805160208201fdfe5461726765742061646472657373206d75737420626520696e697469616c697a65642ea264697066735822122022cf2e6b66b75ae0d7a780704aa9d326dd541b72493bb1a405188ed67fed0b5964736f6c63430007060033", - "devdoc": { - "kind": "dev", - "methods": { - "constructor": { - "params": { - "_implementationName": "implementationName of the contract to proxy to.", - "_libAddressManager": "Address of the Lib_AddressManager." - } - } - }, - "title": "Lib_ResolvedDelegateProxy", - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": {}, - "version": 1 - }, - "storageLayout": { - "storage": [ - { - "astId": 11832, - "contract": "contracts/optimistic-ethereum/libraries/resolver/Lib_ResolvedDelegateProxy.sol:Lib_ResolvedDelegateProxy", - "label": "implementationName", - "offset": 0, - "slot": "0", - "type": "t_mapping(t_address,t_string_storage)" - }, - { - "astId": 11836, - "contract": "contracts/optimistic-ethereum/libraries/resolver/Lib_ResolvedDelegateProxy.sol:Lib_ResolvedDelegateProxy", - "label": "addressManager", - "offset": 0, - "slot": "1", - "type": "t_mapping(t_address,t_contract(Lib_AddressManager)11700)" - } - ], - "types": { - "t_address": { - "encoding": "inplace", - "label": "address", - "numberOfBytes": "20" - }, - "t_contract(Lib_AddressManager)11700": { - "encoding": "inplace", - "label": "contract Lib_AddressManager", - "numberOfBytes": "20" - }, - "t_mapping(t_address,t_contract(Lib_AddressManager)11700)": { - "encoding": "mapping", - "key": "t_address", - "label": "mapping(address => contract Lib_AddressManager)", - "numberOfBytes": "32", - "value": "t_contract(Lib_AddressManager)11700" - }, - "t_mapping(t_address,t_string_storage)": { - "encoding": "mapping", - "key": "t_address", - "label": "mapping(address => string)", - "numberOfBytes": "32", - "value": "t_string_storage" - }, - "t_string_storage": { - "encoding": "bytes", - "label": "string", - "numberOfBytes": "32" - } - } - } -} \ No newline at end of file diff --git a/packages/contracts/deployments/goerli-v1/mockOVM_BondManager.json b/packages/contracts/deployments/goerli-v1/mockOVM_BondManager.json deleted file mode 100644 index 640e6b36c492e..0000000000000 --- a/packages/contracts/deployments/goerli-v1/mockOVM_BondManager.json +++ /dev/null @@ -1,216 +0,0 @@ -{ - "address": "0x1F5AbC065D4B3F3dc127CA8B0042bD4Fcaf79EFC", - "abi": [ - { - "inputs": [ - { - "internalType": "address", - "name": "_libAddressManager", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_who", - "type": "address" - } - ], - "name": "claim", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "deposit", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "_preStateRoot", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "_publisher", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_timestamp", - "type": "uint256" - } - ], - "name": "finalize", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "finalizeWithdrawal", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "_preStateRoot", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "_who", - "type": "address" - } - ], - "name": "getGasSpent", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_who", - "type": "address" - } - ], - "name": "isCollateralized", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "_preStateRoot", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "_txHash", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "_who", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_gasSpent", - "type": "uint256" - } - ], - "name": "recordGasSpent", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "string", - "name": "_name", - "type": "string" - } - ], - "name": "resolve", - "outputs": [ - { - "internalType": "address", - "name": "_contract", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "startWithdrawal", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - } - ], - "transactionHash": "0xef2081df685c50aab54d3c8925d756ac3d5a8e3e8205ace17b9b9887a4181567", - "receipt": { - "to": null, - "from": "0x558ba9b8d78713fbf768c1f8a584485B4003f43F", - "contractAddress": "0x0C4BFBfB44090E1c1AB4a648366456ccFCF9bfA1", - "transactionIndex": 4, - "gasUsed": "291376", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0xc98e11cb9072c6fda982fe6445382fa34298a9a83d3bdfedc88fded88680fe97", - "transactionHash": "0xef2081df685c50aab54d3c8925d756ac3d5a8e3e8205ace17b9b9887a4181567", - "logs": [], - "blockNumber": 4573388, - "cumulativeGasUsed": "864063", - "status": 1, - "byzantium": true - }, - "args": [ - "0xE630cdf302880783364334455C8352fE0aB5b748" - ], - "solcInputHash": "cebcb515c1a9c570d96e0b8f6fd237e2", - "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_who\",\"type\":\"address\"}],\"name\":\"claim\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"deposit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_preStateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"_publisher\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_timestamp\",\"type\":\"uint256\"}],\"name\":\"finalize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"finalizeWithdrawal\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_preStateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"_who\",\"type\":\"address\"}],\"name\":\"getGasSpent\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_who\",\"type\":\"address\"}],\"name\":\"isCollateralized\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_preStateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"_txHash\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"_who\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_gasSpent\",\"type\":\"uint256\"}],\"name\":\"recordGasSpent\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"_contract\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"startWithdrawal\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"title\":\"mockOVM_BondManager\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/mockOVM/verification/mockOVM_BondManager.sol\":\"mockOVM_BondManager\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/optimistic-ethereum/iOVM/verification/iOVM_BondManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\ninterface ERC20 {\\n function transfer(address, uint256) external returns (bool);\\n function transferFrom(address, address, uint256) external returns (bool);\\n}\\n\\n/// All the errors which may be encountered on the bond manager\\nlibrary Errors {\\n string constant ERC20_ERR = \\\"BondManager: Could not post bond\\\";\\n string constant ALREADY_FINALIZED = \\\"BondManager: Fraud proof for this pre-state root has already been finalized\\\";\\n string constant SLASHED = \\\"BondManager: Cannot finalize withdrawal, you probably got slashed\\\";\\n string constant WRONG_STATE = \\\"BondManager: Wrong bond state for proposer\\\";\\n string constant CANNOT_CLAIM = \\\"BondManager: Cannot claim yet. Dispute must be finalized first\\\";\\n\\n string constant WITHDRAWAL_PENDING = \\\"BondManager: Withdrawal already pending\\\";\\n string constant TOO_EARLY = \\\"BondManager: Too early to finalize your withdrawal\\\";\\n\\n string constant ONLY_TRANSITIONER = \\\"BondManager: Only the transitioner for this pre-state root may call this function\\\";\\n string constant ONLY_FRAUD_VERIFIER = \\\"BondManager: Only the fraud verifier may call this function\\\";\\n string constant ONLY_STATE_COMMITMENT_CHAIN = \\\"BondManager: Only the state commitment chain may call this function\\\";\\n string constant WAIT_FOR_DISPUTES = \\\"BondManager: Wait for other potential disputes\\\";\\n}\\n\\n/**\\n * @title iOVM_BondManager\\n */\\ninterface iOVM_BondManager {\\n\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n /// The lifecycle of a proposer's bond\\n enum State {\\n // Before depositing or after getting slashed, a user is uncollateralized\\n NOT_COLLATERALIZED,\\n // After depositing, a user is collateralized\\n COLLATERALIZED,\\n // After a user has initiated a withdrawal\\n WITHDRAWING\\n }\\n\\n /// A bond posted by a proposer\\n struct Bond {\\n // The user's state\\n State state;\\n // The timestamp at which a proposer issued their withdrawal request\\n uint32 withdrawalTimestamp;\\n // The time when the first disputed was initiated for this bond\\n uint256 firstDisputeAt;\\n // The earliest observed state root for this bond which has had fraud\\n bytes32 earliestDisputedStateRoot;\\n // The state root's timestamp\\n uint256 earliestTimestamp;\\n }\\n\\n // Per pre-state root, store the number of state provisions that were made\\n // and how many of these calls were made by each user. Payouts will then be\\n // claimed by users proportionally for that dispute.\\n struct Rewards {\\n // Flag to check if rewards for a fraud proof are claimable\\n bool canClaim;\\n // Total number of `recordGasSpent` calls made\\n uint256 total;\\n // The gas spent by each user to provide witness data. The sum of all\\n // values inside this map MUST be equal to the value of `total`\\n mapping(address => uint256) gasSpent;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function recordGasSpent(\\n bytes32 _preStateRoot,\\n bytes32 _txHash,\\n address _who,\\n uint256 _gasSpent\\n ) external;\\n\\n function finalize(\\n bytes32 _preStateRoot,\\n address _publisher,\\n uint256 _timestamp\\n ) external;\\n\\n function deposit() external;\\n\\n function startWithdrawal() external;\\n\\n function finalizeWithdrawal() external;\\n\\n function claim(\\n address _who\\n ) external;\\n\\n function isCollateralized(\\n address _who\\n ) external view returns (bool);\\n\\n function getGasSpent(\\n bytes32 _preStateRoot,\\n address _who\\n ) external view returns (uint256);\\n}\\n\",\"keccak256\":\"0x3c2a8a399487857158649db1896749d86e39cba545a8aeb2e2bb0f3bdfa7a5b1\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// +build ovm\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Contract Imports */\\nimport { Ownable } from \\\"./Lib_Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n /*******************************************\\n * Contract Variables: Internal Accounting *\\n *******************************************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n public\\n onlyOwner\\n {\\n emit AddressSet(_name, _address);\\n addresses[_getNameHash(_name)] = _address;\\n }\\n\\n function getAddress(\\n string memory _name\\n )\\n public\\n view\\n returns (address)\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32 _hash\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xdf802e1cc6474df913626991e9fca3835c620a519f397afe04bf9c260e723257\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// +build ovm\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\ncontract Lib_AddressResolver {\\n\\n /*******************************************\\n * Contract Variables: Contract References *\\n *******************************************/\\n\\n Lib_AddressManager internal libAddressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(\\n address _libAddressManager\\n ) public {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function resolve(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address _contract\\n )\\n {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0xf3b9d78b309ddeec259ce3e0e1cfdef3ca40938e9a81971b28ce2b8ea327f533\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// +build ovm\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Ownable\\n * @dev Adapted from https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol\\n */\\nabstract contract Ownable {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n address public owner;\\n\\n\\n /**********\\n * Events *\\n **********/\\n\\n event OwnershipTransferred(\\n address indexed previousOwner,\\n address indexed newOwner\\n );\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n constructor() internal {\\n owner = msg.sender;\\n emit OwnershipTransferred(address(0), owner);\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n owner == msg.sender,\\n \\\"Ownable: caller is not the owner\\\"\\n );\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function renounceOwnership()\\n public\\n virtual\\n onlyOwner\\n {\\n emit OwnershipTransferred(owner, address(0));\\n owner = address(0);\\n }\\n\\n function transferOwnership(address _newOwner)\\n public\\n virtual\\n onlyOwner\\n {\\n require(\\n _newOwner != address(0),\\n \\\"Ownable: new owner cannot be the zero address\\\"\\n );\\n\\n emit OwnershipTransferred(owner, _newOwner);\\n owner = _newOwner;\\n }\\n}\\n\",\"keccak256\":\"0xe0409fbd236d16ca6be439d9d97dd36d0d9a0697ee0062d49588b9d29c248e47\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/mockOVM/verification/mockOVM_BondManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.7.0;\\n\\n/* Interface Imports */\\nimport { iOVM_BondManager } from \\\"../../iOVM/verification/iOVM_BondManager.sol\\\";\\n\\n/* Contract Imports */\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/**\\n * @title mockOVM_BondManager\\n */\\ncontract mockOVM_BondManager is iOVM_BondManager, Lib_AddressResolver {\\n constructor(\\n address _libAddressManager\\n )\\n Lib_AddressResolver(_libAddressManager)\\n {}\\n\\n function recordGasSpent(\\n bytes32 _preStateRoot,\\n bytes32 _txHash,\\n address _who,\\n uint256 _gasSpent\\n )\\n override\\n public\\n {}\\n\\n function finalize(\\n bytes32 _preStateRoot,\\n address _publisher,\\n uint256 _timestamp\\n )\\n override\\n public\\n {}\\n\\n function deposit()\\n override\\n public\\n {}\\n\\n function startWithdrawal()\\n override\\n public\\n {}\\n\\n function finalizeWithdrawal()\\n override\\n public\\n {}\\n\\n function claim(\\n address _who\\n )\\n override\\n public\\n {}\\n\\n function isCollateralized(\\n address _who\\n )\\n override\\n public\\n view\\n returns (\\n bool\\n )\\n {\\n // Only authenticate sequencer to submit state root batches.\\n return _who == resolve(\\\"OVM_Sequencer\\\");\\n }\\n\\n function getGasSpent(\\n bytes32 _preStateRoot,\\n address _who\\n )\\n override\\n public\\n view\\n returns (\\n uint256\\n )\\n {\\n return 0;\\n }\\n}\\n\",\"keccak256\":\"0x03c283c91205609fbc19856d9c7fb15da972c3499e00ed049453654723bfaa4c\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x608060405234801561001057600080fd5b506040516104463803806104468339818101604052602081101561003357600080fd5b5051600080546001600160a01b039092166001600160a01b03199092169190911790556103e1806100656000396000f3fe608060405234801561001057600080fd5b50600436106100935760003560e01c8063abfbbe1311610066578063abfbbe13146101f4578063bc2f8dd814610226578063c5b6aa2f14610226578063d0e30db014610226578063dc6453dc1461022e57610093565b806302ad4d2a146100985780631e16e92f146100d25780631e83409a1461010c578063461a447814610132575b600080fd5b6100be600480360360208110156100ae57600080fd5b50356001600160a01b031661026c565b604080519115158252519081900360200190f35b61010a600480360360808110156100e857600080fd5b508035906020810135906001600160a01b0360408201351690606001356102b7565b005b61010a6004803603602081101561012257600080fd5b50356001600160a01b03166102bd565b6101d86004803603602081101561014857600080fd5b81019060208101813564010000000081111561016357600080fd5b82018360208201111561017557600080fd5b8035906020019184600183028401116401000000008311171561019757600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506102c0945050505050565b604080516001600160a01b039092168252519081900360200190f35b61010a6004803603606081101561020a57600080fd5b508035906001600160a01b03602082013516906040013561039c565b61010a6103a1565b61025a6004803603604081101561024457600080fd5b50803590602001356001600160a01b03166103a3565b60408051918252519081900360200190f35b600061029c6040518060400160405280600d81526020016c27ab26afa9b2b8bab2b731b2b960991b8152506102c0565b6001600160a01b0316826001600160a01b0316149050919050565b50505050565b50565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b83811015610320578181015183820152602001610308565b50505050905090810190601f16801561034d5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561036a57600080fd5b505afa15801561037e573d6000803e3d6000fd5b505050506040513d602081101561039457600080fd5b505192915050565b505050565b565b60009291505056fea26469706673582212203f0728d2ffd5e87f3b2f160e5704cc5c07ae231349c1c6286f6360e26317c39b64736f6c63430007060033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100935760003560e01c8063abfbbe1311610066578063abfbbe13146101f4578063bc2f8dd814610226578063c5b6aa2f14610226578063d0e30db014610226578063dc6453dc1461022e57610093565b806302ad4d2a146100985780631e16e92f146100d25780631e83409a1461010c578063461a447814610132575b600080fd5b6100be600480360360208110156100ae57600080fd5b50356001600160a01b031661026c565b604080519115158252519081900360200190f35b61010a600480360360808110156100e857600080fd5b508035906020810135906001600160a01b0360408201351690606001356102b7565b005b61010a6004803603602081101561012257600080fd5b50356001600160a01b03166102bd565b6101d86004803603602081101561014857600080fd5b81019060208101813564010000000081111561016357600080fd5b82018360208201111561017557600080fd5b8035906020019184600183028401116401000000008311171561019757600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506102c0945050505050565b604080516001600160a01b039092168252519081900360200190f35b61010a6004803603606081101561020a57600080fd5b508035906001600160a01b03602082013516906040013561039c565b61010a6103a1565b61025a6004803603604081101561024457600080fd5b50803590602001356001600160a01b03166103a3565b60408051918252519081900360200190f35b600061029c6040518060400160405280600d81526020016c27ab26afa9b2b8bab2b731b2b960991b8152506102c0565b6001600160a01b0316826001600160a01b0316149050919050565b50505050565b50565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b83811015610320578181015183820152602001610308565b50505050905090810190601f16801561034d5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561036a57600080fd5b505afa15801561037e573d6000803e3d6000fd5b505050506040513d602081101561039457600080fd5b505192915050565b505050565b565b60009291505056fea26469706673582212203f0728d2ffd5e87f3b2f160e5704cc5c07ae231349c1c6286f6360e26317c39b64736f6c63430007060033", - "devdoc": { - "kind": "dev", - "methods": {}, - "title": "mockOVM_BondManager", - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": {}, - "version": 1 - }, - "storageLayout": { - "storage": [ - { - "astId": 11707, - "contract": "contracts/optimistic-ethereum/mockOVM/verification/mockOVM_BondManager.sol:mockOVM_BondManager", - "label": "libAddressManager", - "offset": 0, - "slot": "0", - "type": "t_contract(Lib_AddressManager)11700" - } - ], - "types": { - "t_contract(Lib_AddressManager)11700": { - "encoding": "inplace", - "label": "contract Lib_AddressManager", - "numberOfBytes": "20" - } - } - } -} \ No newline at end of file diff --git a/packages/contracts/deployments/goerli-v1/solcInputs/cebcb515c1a9c570d96e0b8f6fd237e2.json b/packages/contracts/deployments/goerli-v1/solcInputs/cebcb515c1a9c570d96e0b8f6fd237e2.json deleted file mode 100644 index 2481f94bd54d4..0000000000000 --- a/packages/contracts/deployments/goerli-v1/solcInputs/cebcb515c1a9c570d96e0b8f6fd237e2.json +++ /dev/null @@ -1,266 +0,0 @@ -{ - "language": "Solidity", - "sources": { - "contracts/optimistic-ethereum/iOVM/accounts/iOVM_ECDSAContractAccount.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/**\n * @title iOVM_ECDSAContractAccount\n */\ninterface iOVM_ECDSAContractAccount {\n\n /********************\n * Public Functions *\n ********************/\n\n function execute(\n bytes memory _transaction,\n Lib_OVMCodec.EOASignatureType _signatureType,\n uint8 _v,\n bytes32 _r,\n bytes32 _s\n ) external returns (bool _success, bytes memory _returndata);\n}\n" - }, - "contracts/optimistic-ethereum/libraries/codec/Lib_OVMCodec.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_RLPReader } from \"../rlp/Lib_RLPReader.sol\";\nimport { Lib_RLPWriter } from \"../rlp/Lib_RLPWriter.sol\";\nimport { Lib_BytesUtils } from \"../utils/Lib_BytesUtils.sol\";\nimport { Lib_Bytes32Utils } from \"../utils/Lib_Bytes32Utils.sol\";\nimport { Lib_SafeExecutionManagerWrapper } from \"../../libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\";\n\n/**\n * @title Lib_OVMCodec\n */\nlibrary Lib_OVMCodec {\n\n /*************\n * Constants *\n *************/\n\n bytes constant internal RLP_NULL_BYTES = hex'80';\n bytes constant internal NULL_BYTES = bytes('');\n\n // Ring buffer IDs\n bytes32 constant internal RING_BUFFER_SCC_BATCHES = keccak256(\"RING_BUFFER_SCC_BATCHES\");\n bytes32 constant internal RING_BUFFER_CTC_BATCHES = keccak256(\"RING_BUFFER_CTC_BATCHES\");\n bytes32 constant internal RING_BUFFER_CTC_QUEUE = keccak256(\"RING_BUFFER_CTC_QUEUE\");\n\n\n /*********\n * Enums *\n *********/\n\n enum EOASignatureType {\n EIP155_TRANSACTON,\n ETH_SIGNED_MESSAGE\n }\n\n enum QueueOrigin {\n SEQUENCER_QUEUE,\n L1TOL2_QUEUE\n }\n\n\n /***********\n * Structs *\n ***********/\n\n struct Account {\n uint256 nonce;\n uint256 balance;\n bytes32 storageRoot;\n bytes32 codeHash;\n address ethAddress;\n bool isFresh;\n }\n\n struct EVMAccount {\n uint256 nonce;\n uint256 balance;\n bytes32 storageRoot;\n bytes32 codeHash;\n }\n\n struct ChainBatchHeader {\n uint256 batchIndex;\n bytes32 batchRoot;\n uint256 batchSize;\n uint256 prevTotalElements;\n bytes extraData;\n }\n\n struct ChainInclusionProof {\n uint256 index;\n bytes32[] siblings;\n }\n\n struct Transaction {\n uint256 timestamp;\n uint256 blockNumber;\n QueueOrigin l1QueueOrigin;\n address l1TxOrigin;\n address entrypoint;\n uint256 gasLimit;\n bytes data;\n }\n\n struct TransactionChainElement {\n bool isSequenced;\n uint256 queueIndex; // QUEUED TX ONLY\n uint256 timestamp; // SEQUENCER TX ONLY\n uint256 blockNumber; // SEQUENCER TX ONLY\n bytes txData; // SEQUENCER TX ONLY\n }\n\n struct QueueElement {\n bytes32 queueRoot;\n uint40 timestamp;\n uint40 blockNumber;\n }\n\n struct EIP155Transaction {\n uint256 nonce;\n uint256 gasPrice;\n uint256 gasLimit;\n address to;\n uint256 value;\n bytes data;\n uint256 chainId;\n }\n\n\n /*********************************************\n * Internal Functions: Encoding and Decoding *\n *********************************************/\n\n /**\n * Decodes an EOA transaction (i.e., native Ethereum RLP encoding).\n * @param _transaction Encoded EOA transaction.\n * @return _decoded Transaction decoded into a struct.\n */\n function decodeEIP155Transaction(\n bytes memory _transaction,\n bool _isEthSignedMessage\n )\n internal\n pure\n returns (\n EIP155Transaction memory _decoded\n )\n {\n if (_isEthSignedMessage) {\n (\n uint256 _nonce,\n uint256 _gasLimit,\n uint256 _gasPrice,\n uint256 _chainId,\n address _to,\n bytes memory _data\n ) = abi.decode(\n _transaction,\n (uint256, uint256, uint256, uint256, address ,bytes)\n );\n return EIP155Transaction({\n nonce: _nonce,\n gasPrice: _gasPrice,\n gasLimit: _gasLimit,\n to: _to,\n value: 0,\n data: _data,\n chainId: _chainId\n });\n } else {\n Lib_RLPReader.RLPItem[] memory decoded = Lib_RLPReader.readList(_transaction);\n\n return EIP155Transaction({\n nonce: Lib_RLPReader.readUint256(decoded[0]),\n gasPrice: Lib_RLPReader.readUint256(decoded[1]),\n gasLimit: Lib_RLPReader.readUint256(decoded[2]),\n to: Lib_RLPReader.readAddress(decoded[3]),\n value: Lib_RLPReader.readUint256(decoded[4]),\n data: Lib_RLPReader.readBytes(decoded[5]),\n chainId: Lib_RLPReader.readUint256(decoded[6])\n });\n }\n }\n\n function decompressEIP155Transaction(\n bytes memory _transaction\n )\n internal\n returns (\n EIP155Transaction memory _decompressed\n )\n {\n return EIP155Transaction({\n gasLimit: Lib_BytesUtils.toUint24(_transaction, 0),\n gasPrice: uint256(Lib_BytesUtils.toUint24(_transaction, 3)) * 1000000,\n nonce: Lib_BytesUtils.toUint24(_transaction, 6),\n to: Lib_BytesUtils.toAddress(_transaction, 9),\n data: Lib_BytesUtils.slice(_transaction, 29),\n chainId: Lib_SafeExecutionManagerWrapper.safeCHAINID(),\n value: 0\n });\n }\n\n /**\n * Encodes an EOA transaction back into the original transaction.\n * @param _transaction EIP155transaction to encode.\n * @param _isEthSignedMessage Whether or not this was an eth signed message.\n * @return Encoded transaction.\n */\n function encodeEIP155Transaction(\n EIP155Transaction memory _transaction,\n bool _isEthSignedMessage\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n if (_isEthSignedMessage) {\n return abi.encode(\n _transaction.nonce,\n _transaction.gasLimit,\n _transaction.gasPrice,\n _transaction.chainId,\n _transaction.to,\n _transaction.data\n );\n } else {\n bytes[] memory raw = new bytes[](9);\n\n raw[0] = Lib_RLPWriter.writeUint(_transaction.nonce);\n raw[1] = Lib_RLPWriter.writeUint(_transaction.gasPrice);\n raw[2] = Lib_RLPWriter.writeUint(_transaction.gasLimit);\n if (_transaction.to == address(0)) {\n raw[3] = Lib_RLPWriter.writeBytes('');\n } else {\n raw[3] = Lib_RLPWriter.writeAddress(_transaction.to);\n }\n raw[4] = Lib_RLPWriter.writeUint(0);\n raw[5] = Lib_RLPWriter.writeBytes(_transaction.data);\n raw[6] = Lib_RLPWriter.writeUint(_transaction.chainId);\n raw[7] = Lib_RLPWriter.writeBytes(bytes(''));\n raw[8] = Lib_RLPWriter.writeBytes(bytes(''));\n\n return Lib_RLPWriter.writeList(raw);\n }\n }\n\n /**\n * Encodes a standard OVM transaction.\n * @param _transaction OVM transaction to encode.\n * @return _encoded Encoded transaction bytes.\n */\n function encodeTransaction(\n Transaction memory _transaction\n )\n internal\n pure\n returns (\n bytes memory _encoded\n )\n {\n return abi.encodePacked(\n _transaction.timestamp,\n _transaction.blockNumber,\n _transaction.l1QueueOrigin,\n _transaction.l1TxOrigin,\n _transaction.entrypoint,\n _transaction.gasLimit,\n _transaction.data\n );\n }\n\n /**\n * Hashes a standard OVM transaction.\n * @param _transaction OVM transaction to encode.\n * @return _hash Hashed transaction\n */\n function hashTransaction(\n Transaction memory _transaction\n )\n internal\n pure\n returns (\n bytes32 _hash\n )\n {\n return keccak256(encodeTransaction(_transaction));\n }\n\n /**\n * Converts an OVM account to an EVM account.\n * @param _in OVM account to convert.\n * @return _out Converted EVM account.\n */\n function toEVMAccount(\n Account memory _in\n )\n internal\n pure\n returns (\n EVMAccount memory _out\n )\n {\n return EVMAccount({\n nonce: _in.nonce,\n balance: _in.balance,\n storageRoot: _in.storageRoot,\n codeHash: _in.codeHash\n });\n }\n\n /**\n * @notice RLP-encodes an account state struct.\n * @param _account Account state struct.\n * @return _encoded RLP-encoded account state.\n */\n function encodeEVMAccount(\n EVMAccount memory _account\n )\n internal\n pure\n returns (\n bytes memory _encoded\n )\n {\n bytes[] memory raw = new bytes[](4);\n\n // Unfortunately we can't create this array outright because\n // Lib_RLPWriter.writeList will reject fixed-size arrays. Assigning\n // index-by-index circumvents this issue.\n raw[0] = Lib_RLPWriter.writeBytes(\n Lib_Bytes32Utils.removeLeadingZeros(\n bytes32(_account.nonce)\n )\n );\n raw[1] = Lib_RLPWriter.writeBytes(\n Lib_Bytes32Utils.removeLeadingZeros(\n bytes32(_account.balance)\n )\n );\n raw[2] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.storageRoot));\n raw[3] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.codeHash));\n\n return Lib_RLPWriter.writeList(raw);\n }\n\n /**\n * @notice Decodes an RLP-encoded account state into a useful struct.\n * @param _encoded RLP-encoded account state.\n * @return _account Account state struct.\n */\n function decodeEVMAccount(\n bytes memory _encoded\n )\n internal\n pure\n returns (\n EVMAccount memory _account\n )\n {\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\n\n return EVMAccount({\n nonce: Lib_RLPReader.readUint256(accountState[0]),\n balance: Lib_RLPReader.readUint256(accountState[1]),\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\n });\n }\n\n /**\n * Calculates a hash for a given batch header.\n * @param _batchHeader Header to hash.\n * @return _hash Hash of the header.\n */\n function hashBatchHeader(\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\n )\n internal\n pure\n returns (\n bytes32 _hash\n )\n {\n return keccak256(\n abi.encode(\n _batchHeader.batchRoot,\n _batchHeader.batchSize,\n _batchHeader.prevTotalElements,\n _batchHeader.extraData\n )\n );\n }\n}\n" - }, - "contracts/optimistic-ethereum/libraries/rlp/Lib_RLPReader.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.7.0;\n\n/**\n * @title Lib_RLPReader\n * @dev Adapted from \"RLPReader\" by Hamdi Allam (hamdi.allam97@gmail.com).\n */\nlibrary Lib_RLPReader {\n\n /*************\n * Constants *\n *************/\n\n uint256 constant internal MAX_LIST_LENGTH = 32;\n\n\n /*********\n * Enums *\n *********/\n\n enum RLPItemType {\n DATA_ITEM,\n LIST_ITEM\n }\n\n \n /***********\n * Structs *\n ***********/\n\n struct RLPItem {\n uint256 length;\n uint256 ptr;\n }\n \n\n /**********************\n * Internal Functions *\n **********************/\n \n /**\n * Converts bytes to a reference to memory position and length.\n * @param _in Input bytes to convert.\n * @return Output memory reference.\n */\n function toRLPItem(\n bytes memory _in\n )\n internal\n pure\n returns (\n RLPItem memory\n )\n {\n uint256 ptr;\n assembly {\n ptr := add(_in, 32)\n }\n\n return RLPItem({\n length: _in.length,\n ptr: ptr\n });\n }\n\n /**\n * Reads an RLP list value into a list of RLP items.\n * @param _in RLP list value.\n * @return Decoded RLP list items.\n */\n function readList(\n RLPItem memory _in\n )\n internal\n pure\n returns (\n RLPItem[] memory\n )\n {\n (\n uint256 listOffset,\n ,\n RLPItemType itemType\n ) = _decodeLength(_in);\n\n require(\n itemType == RLPItemType.LIST_ITEM,\n \"Invalid RLP list value.\"\n );\n\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\n // writing to the length. Since we can't know the number of RLP items without looping over\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\n // simply set a reasonable maximum list length and decrease the size before we finish.\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\n\n uint256 itemCount = 0;\n uint256 offset = listOffset;\n while (offset < _in.length) {\n require(\n itemCount < MAX_LIST_LENGTH,\n \"Provided RLP list exceeds max list length.\"\n );\n\n (\n uint256 itemOffset,\n uint256 itemLength,\n ) = _decodeLength(RLPItem({\n length: _in.length - offset,\n ptr: _in.ptr + offset\n }));\n\n out[itemCount] = RLPItem({\n length: itemLength + itemOffset,\n ptr: _in.ptr + offset\n });\n\n itemCount += 1;\n offset += itemOffset + itemLength;\n }\n\n // Decrease the array size to match the actual item count.\n assembly {\n mstore(out, itemCount)\n }\n\n return out;\n }\n\n /**\n * Reads an RLP list value into a list of RLP items.\n * @param _in RLP list value.\n * @return Decoded RLP list items.\n */\n function readList(\n bytes memory _in\n )\n internal\n pure\n returns (\n RLPItem[] memory\n )\n {\n return readList(\n toRLPItem(_in)\n );\n }\n\n /**\n * Reads an RLP bytes value into bytes.\n * @param _in RLP bytes value.\n * @return Decoded bytes.\n */\n function readBytes(\n RLPItem memory _in\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n (\n uint256 itemOffset,\n uint256 itemLength,\n RLPItemType itemType\n ) = _decodeLength(_in);\n\n require(\n itemType == RLPItemType.DATA_ITEM,\n \"Invalid RLP bytes value.\"\n );\n\n return _copy(_in.ptr, itemOffset, itemLength);\n }\n\n /**\n * Reads an RLP bytes value into bytes.\n * @param _in RLP bytes value.\n * @return Decoded bytes.\n */\n function readBytes(\n bytes memory _in\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n return readBytes(\n toRLPItem(_in)\n );\n }\n\n /**\n * Reads an RLP string value into a string.\n * @param _in RLP string value.\n * @return Decoded string.\n */\n function readString(\n RLPItem memory _in\n )\n internal\n pure\n returns (\n string memory\n )\n {\n return string(readBytes(_in));\n }\n\n /**\n * Reads an RLP string value into a string.\n * @param _in RLP string value.\n * @return Decoded string.\n */\n function readString(\n bytes memory _in\n )\n internal\n pure\n returns (\n string memory\n )\n {\n return readString(\n toRLPItem(_in)\n );\n }\n\n /**\n * Reads an RLP bytes32 value into a bytes32.\n * @param _in RLP bytes32 value.\n * @return Decoded bytes32.\n */\n function readBytes32(\n RLPItem memory _in\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n require(\n _in.length <= 33,\n \"Invalid RLP bytes32 value.\"\n );\n\n (\n uint256 itemOffset,\n uint256 itemLength,\n RLPItemType itemType\n ) = _decodeLength(_in);\n\n require(\n itemType == RLPItemType.DATA_ITEM,\n \"Invalid RLP bytes32 value.\"\n );\n\n uint256 ptr = _in.ptr + itemOffset;\n bytes32 out;\n assembly {\n out := mload(ptr)\n\n // Shift the bytes over to match the item size.\n if lt(itemLength, 32) {\n out := div(out, exp(256, sub(32, itemLength)))\n }\n }\n\n return out;\n }\n\n /**\n * Reads an RLP bytes32 value into a bytes32.\n * @param _in RLP bytes32 value.\n * @return Decoded bytes32.\n */\n function readBytes32(\n bytes memory _in\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n return readBytes32(\n toRLPItem(_in)\n );\n }\n\n /**\n * Reads an RLP uint256 value into a uint256.\n * @param _in RLP uint256 value.\n * @return Decoded uint256.\n */\n function readUint256(\n RLPItem memory _in\n )\n internal\n pure\n returns (\n uint256\n )\n {\n return uint256(readBytes32(_in));\n }\n\n /**\n * Reads an RLP uint256 value into a uint256.\n * @param _in RLP uint256 value.\n * @return Decoded uint256.\n */\n function readUint256(\n bytes memory _in\n )\n internal\n pure\n returns (\n uint256\n )\n {\n return readUint256(\n toRLPItem(_in)\n );\n }\n\n /**\n * Reads an RLP bool value into a bool.\n * @param _in RLP bool value.\n * @return Decoded bool.\n */\n function readBool(\n RLPItem memory _in\n )\n internal\n pure\n returns (\n bool\n )\n {\n require(\n _in.length == 1,\n \"Invalid RLP boolean value.\"\n );\n\n uint256 ptr = _in.ptr;\n uint256 out;\n assembly {\n out := byte(0, mload(ptr))\n }\n\n return out != 0;\n }\n\n /**\n * Reads an RLP bool value into a bool.\n * @param _in RLP bool value.\n * @return Decoded bool.\n */\n function readBool(\n bytes memory _in\n )\n internal\n pure\n returns (\n bool\n )\n {\n return readBool(\n toRLPItem(_in)\n );\n }\n\n /**\n * Reads an RLP address value into a address.\n * @param _in RLP address value.\n * @return Decoded address.\n */\n function readAddress(\n RLPItem memory _in\n )\n internal\n pure\n returns (\n address\n )\n {\n if (_in.length == 1) {\n return address(0);\n }\n\n require(\n _in.length == 21,\n \"Invalid RLP address value.\"\n );\n\n return address(readUint256(_in));\n }\n\n /**\n * Reads an RLP address value into a address.\n * @param _in RLP address value.\n * @return Decoded address.\n */\n function readAddress(\n bytes memory _in\n )\n internal\n pure\n returns (\n address\n )\n {\n return readAddress(\n toRLPItem(_in)\n );\n }\n\n /**\n * Reads the raw bytes of an RLP item.\n * @param _in RLP item to read.\n * @return Raw RLP bytes.\n */\n function readRawBytes(\n RLPItem memory _in\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n return _copy(_in);\n }\n\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * Decodes the length of an RLP item.\n * @param _in RLP item to decode.\n * @return Offset of the encoded data.\n * @return Length of the encoded data.\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\n */\n function _decodeLength(\n RLPItem memory _in\n )\n private\n pure\n returns (\n uint256,\n uint256,\n RLPItemType\n )\n {\n require(\n _in.length > 0,\n \"RLP item cannot be null.\"\n );\n\n uint256 ptr = _in.ptr;\n uint256 prefix;\n assembly {\n prefix := byte(0, mload(ptr))\n }\n\n if (prefix <= 0x7f) {\n // Single byte.\n\n return (0, 1, RLPItemType.DATA_ITEM);\n } else if (prefix <= 0xb7) {\n // Short string.\n\n uint256 strLen = prefix - 0x80;\n \n require(\n _in.length > strLen,\n \"Invalid RLP short string.\"\n );\n\n return (1, strLen, RLPItemType.DATA_ITEM);\n } else if (prefix <= 0xbf) {\n // Long string.\n uint256 lenOfStrLen = prefix - 0xb7;\n\n require(\n _in.length > lenOfStrLen,\n \"Invalid RLP long string length.\"\n );\n\n uint256 strLen;\n assembly {\n // Pick out the string length.\n strLen := div(\n mload(add(ptr, 1)),\n exp(256, sub(32, lenOfStrLen))\n )\n }\n\n require(\n _in.length > lenOfStrLen + strLen,\n \"Invalid RLP long string.\"\n );\n\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\n } else if (prefix <= 0xf7) {\n // Short list.\n uint256 listLen = prefix - 0xc0;\n\n require(\n _in.length > listLen,\n \"Invalid RLP short list.\"\n );\n\n return (1, listLen, RLPItemType.LIST_ITEM);\n } else {\n // Long list.\n uint256 lenOfListLen = prefix - 0xf7;\n\n require(\n _in.length > lenOfListLen,\n \"Invalid RLP long list length.\"\n );\n\n uint256 listLen;\n assembly {\n // Pick out the list length.\n listLen := div(\n mload(add(ptr, 1)),\n exp(256, sub(32, lenOfListLen))\n )\n }\n\n require(\n _in.length > lenOfListLen + listLen,\n \"Invalid RLP long list.\"\n );\n\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\n }\n }\n\n /**\n * Copies the bytes from a memory location.\n * @param _src Pointer to the location to read from.\n * @param _offset Offset to start reading from.\n * @param _length Number of bytes to read.\n * @return Copied bytes.\n */\n function _copy(\n uint256 _src,\n uint256 _offset,\n uint256 _length\n )\n private\n pure\n returns (\n bytes memory\n )\n {\n bytes memory out = new bytes(_length);\n if (out.length == 0) {\n return out;\n }\n\n uint256 src = _src + _offset;\n uint256 dest;\n assembly {\n dest := add(out, 32)\n }\n\n // Copy over as many complete words as we can.\n for (uint256 i = 0; i < _length / 32; i++) {\n assembly {\n mstore(dest, mload(src))\n }\n\n src += 32;\n dest += 32;\n }\n\n // Pick out the remaining bytes.\n uint256 mask = 256 ** (32 - (_length % 32)) - 1;\n assembly {\n mstore(\n dest,\n or(\n and(mload(src), not(mask)),\n and(mload(dest), mask)\n )\n )\n }\n\n return out;\n }\n\n /**\n * Copies an RLP item into bytes.\n * @param _in RLP item to copy.\n * @return Copied bytes.\n */\n function _copy(\n RLPItem memory _in\n )\n private\n pure\n returns (\n bytes memory\n )\n {\n return _copy(_in.ptr, 0, _in.length);\n }\n}\n" - }, - "contracts/optimistic-ethereum/libraries/rlp/Lib_RLPWriter.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.7.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_BytesUtils } from \"../utils/Lib_BytesUtils.sol\";\n\n/**\n * @title Lib_RLPWriter\n * @author Bakaoh (with modifications)\n */\nlibrary Lib_RLPWriter {\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * RLP encodes a byte string.\n * @param _in The byte string to encode.\n * @return _out The RLP encoded string in bytes.\n */\n function writeBytes(\n bytes memory _in\n )\n internal\n pure\n returns (\n bytes memory _out\n )\n {\n bytes memory encoded;\n\n if (_in.length == 1 && uint8(_in[0]) < 128) {\n encoded = _in;\n } else {\n encoded = Lib_BytesUtils.concat(_writeLength(_in.length, 128), _in);\n }\n\n return encoded;\n }\n\n /**\n * RLP encodes a list of RLP encoded byte byte strings.\n * @param _in The list of RLP encoded byte strings.\n * @return _out The RLP encoded list of items in bytes.\n */\n function writeList(\n bytes[] memory _in\n )\n internal\n pure\n returns (\n bytes memory _out\n )\n {\n bytes memory list = _flatten(_in);\n return Lib_BytesUtils.concat(_writeLength(list.length, 192), list);\n }\n\n /**\n * RLP encodes a string.\n * @param _in The string to encode.\n * @return _out The RLP encoded string in bytes.\n */\n function writeString(\n string memory _in\n )\n internal\n pure\n returns (\n bytes memory _out\n )\n {\n return writeBytes(bytes(_in));\n }\n\n /**\n * RLP encodes an address.\n * @param _in The address to encode.\n * @return _out The RLP encoded address in bytes.\n */\n function writeAddress(\n address _in\n )\n internal\n pure\n returns (\n bytes memory _out\n )\n {\n return writeBytes(abi.encodePacked(_in));\n }\n\n /**\n * RLP encodes a uint.\n * @param _in The uint256 to encode.\n * @return _out The RLP encoded uint256 in bytes.\n */\n function writeUint(\n uint256 _in\n )\n internal\n pure\n returns (\n bytes memory _out\n )\n {\n return writeBytes(_toBinary(_in));\n }\n\n /**\n * RLP encodes a bool.\n * @param _in The bool to encode.\n * @return _out The RLP encoded bool in bytes.\n */\n function writeBool(\n bool _in\n )\n internal\n pure\n returns (\n bytes memory _out\n )\n {\n bytes memory encoded = new bytes(1);\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\n return encoded;\n }\n\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\n * @param _len The length of the string or the payload.\n * @param _offset 128 if item is string, 192 if item is list.\n * @return _encoded RLP encoded bytes.\n */\n function _writeLength(\n uint256 _len,\n uint256 _offset\n )\n private\n pure\n returns (\n bytes memory _encoded\n )\n {\n bytes memory encoded;\n\n if (_len < 56) {\n encoded = new bytes(1);\n encoded[0] = byte(uint8(_len) + uint8(_offset));\n } else {\n uint256 lenLen;\n uint256 i = 1;\n while (_len / i != 0) {\n lenLen++;\n i *= 256;\n }\n\n encoded = new bytes(lenLen + 1);\n encoded[0] = byte(uint8(lenLen) + uint8(_offset) + 55);\n for(i = 1; i <= lenLen; i++) {\n encoded[i] = byte(uint8((_len / (256**(lenLen-i))) % 256));\n }\n }\n\n return encoded;\n }\n\n /**\n * Encode integer in big endian binary form with no leading zeroes.\n * @notice TODO: This should be optimized with assembly to save gas costs.\n * @param _x The integer to encode.\n * @return _binary RLP encoded bytes.\n */\n function _toBinary(\n uint256 _x\n )\n private\n pure\n returns (\n bytes memory _binary\n )\n {\n bytes memory b = abi.encodePacked(_x);\n\n uint256 i = 0;\n for (; i < 32; i++) {\n if (b[i] != 0) {\n break;\n }\n }\n\n bytes memory res = new bytes(32 - i);\n for (uint256 j = 0; j < res.length; j++) {\n res[j] = b[i++];\n }\n\n return res;\n }\n\n /**\n * Copies a piece of memory to another location.\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\n * @param _dest Destination location.\n * @param _src Source location.\n * @param _len Length of memory to copy.\n */\n function _memcpy(\n uint256 _dest,\n uint256 _src,\n uint256 _len\n )\n private\n pure\n {\n uint256 dest = _dest;\n uint256 src = _src;\n uint256 len = _len;\n\n for(; len >= 32; len -= 32) {\n assembly {\n mstore(dest, mload(src))\n }\n dest += 32;\n src += 32;\n }\n\n uint256 mask = 256 ** (32 - len) - 1;\n assembly {\n let srcpart := and(mload(src), not(mask))\n let destpart := and(mload(dest), mask)\n mstore(dest, or(destpart, srcpart))\n }\n }\n\n /**\n * Flattens a list of byte strings into one byte string.\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\n * @param _list List of byte strings to flatten.\n * @return _flattened The flattened byte string.\n */\n function _flatten(\n bytes[] memory _list\n )\n private\n pure\n returns (\n bytes memory _flattened\n )\n {\n if (_list.length == 0) {\n return new bytes(0);\n }\n\n uint256 len;\n uint256 i = 0;\n for (; i < _list.length; i++) {\n len += _list[i].length;\n }\n\n bytes memory flattened = new bytes(len);\n uint256 flattenedPtr;\n assembly { flattenedPtr := add(flattened, 0x20) }\n\n for(i = 0; i < _list.length; i++) {\n bytes memory item = _list[i];\n\n uint256 listPtr;\n assembly { listPtr := add(item, 0x20)}\n\n _memcpy(flattenedPtr, listPtr, item.length);\n flattenedPtr += _list[i].length;\n }\n\n return flattened;\n }\n}" - }, - "contracts/optimistic-ethereum/libraries/utils/Lib_BytesUtils.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.7.0;\n\n/**\n * @title Lib_BytesUtils\n */\nlibrary Lib_BytesUtils {\n\n /**********************\n * Internal Functions *\n **********************/\n\n function concat(\n bytes memory _preBytes,\n bytes memory _postBytes\n )\n internal\n pure\n returns (bytes memory)\n {\n bytes memory tempBytes;\n\n assembly {\n // Get a location of some free memory and store it in tempBytes as\n // Solidity does for memory variables.\n tempBytes := mload(0x40)\n\n // Store the length of the first bytes array at the beginning of\n // the memory for tempBytes.\n let length := mload(_preBytes)\n mstore(tempBytes, length)\n\n // Maintain a memory counter for the current write location in the\n // temp bytes array by adding the 32 bytes for the array length to\n // the starting location.\n let mc := add(tempBytes, 0x20)\n // Stop copying when the memory counter reaches the length of the\n // first bytes array.\n let end := add(mc, length)\n\n for {\n // Initialize a copy counter to the start of the _preBytes data,\n // 32 bytes into its memory.\n let cc := add(_preBytes, 0x20)\n } lt(mc, end) {\n // Increase both counters by 32 bytes each iteration.\n mc := add(mc, 0x20)\n cc := add(cc, 0x20)\n } {\n // Write the _preBytes data into the tempBytes memory 32 bytes\n // at a time.\n mstore(mc, mload(cc))\n }\n\n // Add the length of _postBytes to the current length of tempBytes\n // and store it as the new length in the first 32 bytes of the\n // tempBytes memory.\n length := mload(_postBytes)\n mstore(tempBytes, add(length, mload(tempBytes)))\n\n // Move the memory counter back from a multiple of 0x20 to the\n // actual end of the _preBytes data.\n mc := end\n // Stop copying when the memory counter reaches the new combined\n // length of the arrays.\n end := add(mc, length)\n\n for {\n let cc := add(_postBytes, 0x20)\n } lt(mc, end) {\n mc := add(mc, 0x20)\n cc := add(cc, 0x20)\n } {\n mstore(mc, mload(cc))\n }\n\n // Update the free-memory pointer by padding our last write location\n // to 32 bytes: add 31 bytes to the end of tempBytes to move to the\n // next 32 byte block, then round down to the nearest multiple of\n // 32. If the sum of the length of the two arrays is zero then add\n // one before rounding down to leave a blank 32 bytes (the length block with 0).\n mstore(0x40, and(\n add(add(end, iszero(add(length, mload(_preBytes)))), 31),\n not(31) // Round down to the nearest 32 bytes.\n ))\n }\n\n return tempBytes;\n }\n\n function slice(\n bytes memory _bytes,\n uint256 _start,\n uint256 _length\n )\n internal\n pure\n returns (bytes memory)\n {\n require(_length + 31 >= _length, \"slice_overflow\");\n require(_start + _length >= _start, \"slice_overflow\");\n require(_bytes.length >= _start + _length, \"slice_outOfBounds\");\n\n bytes memory tempBytes;\n\n assembly {\n switch iszero(_length)\n case 0 {\n // Get a location of some free memory and store it in tempBytes as\n // Solidity does for memory variables.\n tempBytes := mload(0x40)\n\n // The first word of the slice result is potentially a partial\n // word read from the original array. To read it, we calculate\n // the length of that partial word and start copying that many\n // bytes into the array. The first word we copy will start with\n // data we don't care about, but the last `lengthmod` bytes will\n // land at the beginning of the contents of the new array. When\n // we're done copying, we overwrite the full first word with\n // the actual length of the slice.\n let lengthmod := and(_length, 31)\n\n // The multiplication in the next line is necessary\n // because when slicing multiples of 32 bytes (lengthmod == 0)\n // the following copy loop was copying the origin's length\n // and then ending prematurely not copying everything it should.\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\n let end := add(mc, _length)\n\n for {\n // The multiplication in the next line has the same exact purpose\n // as the one above.\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\n } lt(mc, end) {\n mc := add(mc, 0x20)\n cc := add(cc, 0x20)\n } {\n mstore(mc, mload(cc))\n }\n\n mstore(tempBytes, _length)\n\n //update free-memory pointer\n //allocating the array padded to 32 bytes like the compiler does now\n mstore(0x40, and(add(mc, 31), not(31)))\n }\n //if we want a zero-length slice let's just return a zero-length array\n default {\n tempBytes := mload(0x40)\n\n //zero out the 32 bytes slice we are about to return\n //we need to do it because Solidity does not garbage collect\n mstore(tempBytes, 0)\n\n mstore(0x40, add(tempBytes, 0x20))\n }\n }\n\n return tempBytes;\n }\n\n function slice(\n bytes memory _bytes,\n uint256 _start\n )\n internal\n pure\n returns (bytes memory)\n {\n if (_bytes.length - _start == 0) {\n return bytes('');\n }\n\n return slice(_bytes, _start, _bytes.length - _start);\n }\n\n function toBytes32PadLeft(\n bytes memory _bytes\n )\n internal\n pure\n returns (bytes32)\n {\n bytes32 ret;\n uint256 len = _bytes.length <= 32 ? _bytes.length : 32;\n assembly {\n ret := shr(mul(sub(32, len), 8), mload(add(_bytes, 32)))\n }\n return ret;\n }\n\n function toBytes32(\n bytes memory _bytes\n )\n internal\n pure\n returns (bytes32)\n {\n if (_bytes.length < 32) {\n bytes32 ret;\n assembly {\n ret := mload(add(_bytes, 32))\n }\n return ret;\n }\n\n return abi.decode(_bytes,(bytes32)); // will truncate if input length > 32 bytes\n }\n\n function toUint256(\n bytes memory _bytes\n )\n internal\n pure\n returns (uint256)\n {\n return uint256(toBytes32(_bytes));\n }\n\n function toUint24(bytes memory _bytes, uint256 _start) internal pure returns (uint24) {\n require(_start + 3 >= _start, \"toUint24_overflow\");\n require(_bytes.length >= _start + 3 , \"toUint24_outOfBounds\");\n uint24 tempUint;\n\n assembly {\n tempUint := mload(add(add(_bytes, 0x3), _start))\n }\n\n return tempUint;\n }\n\n function toUint8(bytes memory _bytes, uint256 _start) internal pure returns (uint8) {\n require(_start + 1 >= _start, \"toUint8_overflow\");\n require(_bytes.length >= _start + 1 , \"toUint8_outOfBounds\");\n uint8 tempUint;\n\n assembly {\n tempUint := mload(add(add(_bytes, 0x1), _start))\n }\n\n return tempUint;\n }\n\n function toAddress(bytes memory _bytes, uint256 _start) internal pure returns (address) {\n require(_start + 20 >= _start, \"toAddress_overflow\");\n require(_bytes.length >= _start + 20, \"toAddress_outOfBounds\");\n address tempAddress;\n\n assembly {\n tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000)\n }\n\n return tempAddress;\n }\n\n function toNibbles(\n bytes memory _bytes\n )\n internal\n pure\n returns (bytes memory)\n {\n bytes memory nibbles = new bytes(_bytes.length * 2);\n\n for (uint256 i = 0; i < _bytes.length; i++) {\n nibbles[i * 2] = _bytes[i] >> 4;\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\n }\n\n return nibbles;\n }\n\n function fromNibbles(\n bytes memory _bytes\n )\n internal\n pure\n returns (bytes memory)\n {\n bytes memory ret = new bytes(_bytes.length / 2);\n\n for (uint256 i = 0; i < ret.length; i++) {\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\n }\n\n return ret;\n }\n\n function equal(\n bytes memory _bytes,\n bytes memory _other\n )\n internal\n pure\n returns (bool)\n {\n return keccak256(_bytes) == keccak256(_other);\n }\n}\n" - }, - "contracts/optimistic-ethereum/libraries/utils/Lib_Bytes32Utils.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.7.0;\n\n/**\n * @title Lib_Byte32Utils\n */\nlibrary Lib_Bytes32Utils {\n\n /**********************\n * Internal Functions *\n **********************/\n\n function toBool(\n bytes32 _in\n )\n internal\n pure\n returns (\n bool _out\n )\n {\n return _in != 0;\n }\n\n function fromBool(\n bool _in\n )\n internal\n pure\n returns (\n bytes32 _out\n )\n {\n return bytes32(uint256(_in ? 1 : 0));\n }\n\n function toAddress(\n bytes32 _in\n )\n internal\n pure\n returns (\n address _out\n )\n {\n return address(uint160(uint256(_in)));\n }\n\n function fromAddress(\n address _in\n )\n internal\n pure\n returns (\n bytes32 _out\n )\n {\n return bytes32(uint256(_in));\n }\n\n function removeLeadingZeros(\n bytes32 _in\n )\n internal\n pure\n returns (\n bytes memory _out\n )\n {\n bytes memory out;\n\n assembly {\n // Figure out how many leading zero bytes to remove.\n let shift := 0\n for { let i := 0 } and(lt(i, 32), eq(byte(i, _in), 0)) { i := add(i, 1) } {\n shift := add(shift, 1)\n }\n\n // Reserve some space for our output and fix the free memory pointer.\n out := mload(0x40)\n mstore(0x40, add(out, 0x40))\n\n // Shift the value and store it into the output bytes.\n mstore(add(out, 0x20), shl(mul(shift, 8), _in))\n\n // Store the new size (with leading zero bytes removed) in the output byte size.\n mstore(out, sub(32, shift))\n }\n\n return out;\n }\n}\n" - }, - "contracts/optimistic-ethereum/libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.7.0;\n\n/**\n * @title Lib_SafeExecutionManagerWrapper\n */\nlibrary Lib_SafeExecutionManagerWrapper {\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Makes an ovmCALL and performs all the necessary safety checks.\n * @param _gasLimit Gas limit for the call.\n * @param _target Address to call.\n * @param _calldata Data to send to the call.\n * @return _success Whether or not the call reverted.\n * @return _returndata Data returned by the call.\n */\n function safeCALL(\n uint256 _gasLimit,\n address _target,\n bytes memory _calldata\n )\n internal\n returns (\n bool _success,\n bytes memory _returndata\n )\n {\n bytes memory returndata = _safeExecutionManagerInteraction(\n abi.encodeWithSignature(\n \"ovmCALL(uint256,address,bytes)\",\n _gasLimit,\n _target,\n _calldata\n )\n );\n\n return abi.decode(returndata, (bool, bytes));\n }\n\n /**\n * Makes an ovmCALL and performs all the necessary safety checks.\n * @param _gasLimit Gas limit for the call.\n * @param _target Address to call.\n * @param _calldata Data to send to the call.\n * @return _success Whether or not the call reverted.\n * @return _returndata Data returned by the call.\n */\n function safeDELEGATECALL(\n uint256 _gasLimit,\n address _target,\n bytes memory _calldata\n )\n internal\n returns (\n bool _success,\n bytes memory _returndata\n )\n {\n bytes memory returndata = _safeExecutionManagerInteraction(\n abi.encodeWithSignature(\n \"ovmDELEGATECALL(uint256,address,bytes)\",\n _gasLimit,\n _target,\n _calldata\n )\n );\n\n return abi.decode(returndata, (bool, bytes));\n }\n\n /**\n * Performs an ovmCREATE and the necessary safety checks.\n * @param _gasLimit Gas limit for the creation.\n * @param _bytecode Code for the new contract.\n * @return _contract Address of the created contract.\n */\n function safeCREATE(\n uint256 _gasLimit,\n bytes memory _bytecode\n )\n internal\n returns (\n address _contract\n )\n {\n bytes memory returndata = _safeExecutionManagerInteraction(\n _gasLimit,\n abi.encodeWithSignature(\n \"ovmCREATE(bytes)\",\n _bytecode\n )\n );\n\n return abi.decode(returndata, (address));\n }\n\n /**\n * Performs an ovmEXTCODESIZE and the necessary safety checks.\n * @param _contract Address of the contract to query the size of.\n * @return _EXTCODESIZE Size of the requested contract in bytes.\n */\n function safeEXTCODESIZE(\n address _contract\n )\n internal\n returns (\n uint256 _EXTCODESIZE\n )\n {\n bytes memory returndata = _safeExecutionManagerInteraction(\n abi.encodeWithSignature(\n \"ovmEXTCODESIZE(address)\",\n _contract\n )\n );\n\n return abi.decode(returndata, (uint256));\n }\n\n /**\n * Performs a safe ovmCHAINID call.\n * @return _CHAINID Result of calling ovmCHAINID.\n */\n function safeCHAINID()\n internal\n returns (\n uint256 _CHAINID\n )\n {\n bytes memory returndata = _safeExecutionManagerInteraction(\n abi.encodeWithSignature(\n \"ovmCHAINID()\"\n )\n );\n\n return abi.decode(returndata, (uint256));\n }\n\n /**\n * Performs a safe ovmCALLER call.\n * @return _CALLER Result of calling ovmCALLER.\n */\n function safeCALLER()\n internal\n returns (\n address _CALLER\n )\n {\n bytes memory returndata = _safeExecutionManagerInteraction(\n abi.encodeWithSignature(\n \"ovmCALLER()\"\n )\n );\n\n return abi.decode(returndata, (address));\n }\n\n /**\n * Performs a safe ovmADDRESS call.\n * @return _ADDRESS Result of calling ovmADDRESS.\n */\n function safeADDRESS()\n internal\n returns (\n address _ADDRESS\n )\n {\n bytes memory returndata = _safeExecutionManagerInteraction(\n abi.encodeWithSignature(\n \"ovmADDRESS()\"\n )\n );\n\n return abi.decode(returndata, (address));\n }\n\n /**\n * Performs a safe ovmGETNONCE call.\n * @return _nonce Result of calling ovmGETNONCE.\n */\n function safeGETNONCE()\n internal\n returns (\n uint256 _nonce\n )\n {\n bytes memory returndata = _safeExecutionManagerInteraction(\n abi.encodeWithSignature(\n \"ovmGETNONCE()\"\n )\n );\n\n return abi.decode(returndata, (uint256));\n }\n\n /**\n * Performs a safe ovmSETNONCE call.\n * @param _nonce New account nonce.\n */\n function safeSETNONCE(\n uint256 _nonce\n )\n internal\n {\n _safeExecutionManagerInteraction(\n abi.encodeWithSignature(\n \"ovmSETNONCE(uint256)\",\n _nonce\n )\n );\n }\n\n /**\n * Performs a safe ovmCREATEEOA call.\n * @param _messageHash Message hash which was signed by EOA\n * @param _v v value of signature (0 or 1)\n * @param _r r value of signature\n * @param _s s value of signature\n */\n function safeCREATEEOA(\n bytes32 _messageHash,\n uint8 _v,\n bytes32 _r,\n bytes32 _s\n )\n internal\n {\n _safeExecutionManagerInteraction(\n abi.encodeWithSignature(\n \"ovmCREATEEOA(bytes32,uint8,bytes32,bytes32)\",\n _messageHash,\n _v,\n _r,\n _s\n )\n );\n }\n\n /**\n * Performs a safe REVERT.\n * @param _reason String revert reason to pass along with the REVERT.\n */\n function safeREVERT(\n string memory _reason\n )\n internal\n {\n _safeExecutionManagerInteraction(\n abi.encodeWithSignature(\n \"ovmREVERT(bytes)\",\n bytes(_reason)\n )\n );\n }\n\n /**\n * Performs a safe \"require\".\n * @param _condition Boolean condition that must be true or will revert.\n * @param _reason String revert reason to pass along with the REVERT.\n */\n function safeREQUIRE(\n bool _condition,\n string memory _reason\n )\n internal\n {\n if (!_condition) {\n safeREVERT(\n _reason\n );\n }\n }\n\n /**\n * Performs a safe ovmSLOAD call.\n */\n function safeSLOAD(\n bytes32 _key\n )\n internal\n returns (\n bytes32\n )\n {\n bytes memory returndata = _safeExecutionManagerInteraction(\n abi.encodeWithSignature(\n \"ovmSLOAD(bytes32)\",\n _key\n )\n );\n\n return abi.decode(returndata, (bytes32));\n }\n\n /**\n * Performs a safe ovmSSTORE call.\n */\n function safeSSTORE(\n bytes32 _key,\n bytes32 _value\n )\n internal\n {\n _safeExecutionManagerInteraction(\n abi.encodeWithSignature(\n \"ovmSSTORE(bytes32,bytes32)\",\n _key,\n _value\n )\n );\n }\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * Performs an ovm interaction and the necessary safety checks.\n * @param _gasLimit Gas limit for the interaction.\n * @param _calldata Data to send to the OVM_ExecutionManager (encoded with sighash).\n * @return _returndata Data sent back by the OVM_ExecutionManager.\n */\n function _safeExecutionManagerInteraction(\n uint256 _gasLimit,\n bytes memory _calldata\n )\n private\n returns (\n bytes memory _returndata\n )\n {\n address ovmExecutionManager = msg.sender;\n (\n bool success,\n bytes memory returndata\n ) = ovmExecutionManager.call{gas: _gasLimit}(_calldata);\n\n if (success == false) {\n assembly {\n revert(add(returndata, 0x20), mload(returndata))\n }\n } else if (returndata.length == 1) {\n assembly {\n return(0, 1)\n }\n } else {\n return returndata;\n }\n }\n\n function _safeExecutionManagerInteraction(\n bytes memory _calldata\n )\n private\n returns (\n bytes memory _returndata\n )\n {\n return _safeExecutionManagerInteraction(\n gasleft(),\n _calldata\n );\n }\n}\n" - }, - "contracts/optimistic-ethereum/OVM/accounts/OVM_ECDSAContractAccount.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.7.0;\npragma experimental ABIEncoderV2;\n\n/* Interface Imports */\nimport { iOVM_ECDSAContractAccount } from \"../../iOVM/accounts/iOVM_ECDSAContractAccount.sol\";\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_ECDSAUtils } from \"../../libraries/utils/Lib_ECDSAUtils.sol\";\nimport { Lib_SafeExecutionManagerWrapper } from \"../../libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\";\nimport { Lib_SafeMathWrapper } from \"../../libraries/wrappers/Lib_SafeMathWrapper.sol\";\n\n/**\n * @title OVM_ECDSAContractAccount\n */\ncontract OVM_ECDSAContractAccount is iOVM_ECDSAContractAccount {\n\n address constant ETH_ERC20_ADDRESS = 0x4200000000000000000000000000000000000006;\n uint256 constant EXECUTION_VALIDATION_GAS_OVERHEAD = 25000; // TODO: should be the amount sufficient to cover the gas costs of all of the transactions up to and including the CALL/CREATE which forms the entrypoint of the transaction.\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Executes a signed transaction.\n * @param _transaction Signed EOA transaction.\n * @param _signatureType Hashing scheme used for the transaction (e.g., ETH signed message).\n * @param _v Signature `v` parameter.\n * @param _r Signature `r` parameter.\n * @param _s Signature `s` parameter.\n * @return _success Whether or not the call returned (rather than reverted).\n * @return _returndata Data returned by the call.\n */\n function execute(\n bytes memory _transaction,\n Lib_OVMCodec.EOASignatureType _signatureType,\n uint8 _v,\n bytes32 _r,\n bytes32 _s\n )\n override\n public\n returns (\n bool _success,\n bytes memory _returndata\n )\n {\n bool isEthSign = _signatureType == Lib_OVMCodec.EOASignatureType.ETH_SIGNED_MESSAGE;\n\n // Address of this contract within the ovm (ovmADDRESS) should be the same as the\n // recovered address of the user who signed this message. This is how we manage to shim\n // account abstraction even though the user isn't a contract.\n // Need to make sure that the transaction nonce is right and bump it if so.\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(\n Lib_ECDSAUtils.recover(\n _transaction,\n isEthSign,\n _v,\n _r,\n _s\n ) == Lib_SafeExecutionManagerWrapper.safeADDRESS(),\n \"Signature provided for EOA transaction execution is invalid.\"\n );\n\n Lib_OVMCodec.EIP155Transaction memory decodedTx = Lib_OVMCodec.decodeEIP155Transaction(_transaction, isEthSign);\n\n // Need to make sure that the transaction chainId is correct.\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(\n decodedTx.chainId == Lib_SafeExecutionManagerWrapper.safeCHAINID(),\n \"Transaction chainId does not match expected OVM chainId.\"\n );\n\n // Need to make sure that the transaction nonce is right.\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(\n decodedTx.nonce == Lib_SafeExecutionManagerWrapper.safeGETNONCE(),\n \"Transaction nonce does not match the expected nonce.\"\n );\n\n // TEMPORARY: Disable gas checks for minnet.\n // // Need to make sure that the gas is sufficient to execute the transaction.\n // Lib_SafeExecutionManagerWrapper.safeREQUIRE(\n // gasleft() >= Lib_SafeMathWrapper.add(decodedTx.gasLimit, EXECUTION_VALIDATION_GAS_OVERHEAD),\n // \"Gas is not sufficient to execute the transaction.\"\n // );\n\n // Transfer fee to relayer.\n address relayer = Lib_SafeExecutionManagerWrapper.safeCALLER();\n uint256 fee = decodedTx.gasLimit * decodedTx.gasPrice;\n (bool success, ) = Lib_SafeExecutionManagerWrapper.safeCALL(\n gasleft(),\n ETH_ERC20_ADDRESS,\n abi.encodeWithSignature(\"transfer(address,uint256)\", relayer, fee)\n );\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(\n success == true,\n \"Fee was not transferred to relayer.\"\n );\n\n // Contract creations are signalled by sending a transaction to the zero address.\n if (decodedTx.to == address(0)) {\n address created = Lib_SafeExecutionManagerWrapper.safeCREATE(\n decodedTx.gasLimit,\n decodedTx.data\n );\n\n // EVM doesn't tell us whether a contract creation failed, even if it reverted during\n // initialization. Always return `true` for our success value here.\n return (true, abi.encode(created));\n } else {\n // We only want to bump the nonce for `ovmCALL` because `ovmCREATE` automatically bumps\n // the nonce of the calling account. Normally an EOA would bump the nonce for both\n // cases, but since this is a contract we'd end up bumping the nonce twice.\n Lib_SafeExecutionManagerWrapper.safeSETNONCE(decodedTx.nonce + 1);\n\n return Lib_SafeExecutionManagerWrapper.safeCALL(\n decodedTx.gasLimit,\n decodedTx.to,\n decodedTx.data\n );\n }\n }\n}\n" - }, - "contracts/optimistic-ethereum/libraries/utils/Lib_ECDSAUtils.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.7.0;\n\n/**\n * @title Lib_ECDSAUtils\n */\nlibrary Lib_ECDSAUtils {\n\n /**************************************\n * Internal Functions: ECDSA Recovery *\n **************************************/\n\n /**\n * Recovers a signed address given a message and signature.\n * @param _message Message that was originally signed.\n * @param _isEthSignedMessage Whether or not the user used the `Ethereum Signed Message` prefix.\n * @param _v Signature `v` parameter.\n * @param _r Signature `r` parameter.\n * @param _s Signature `s` parameter.\n * @return _sender Signer address.\n */\n function recover(\n bytes memory _message,\n bool _isEthSignedMessage,\n uint8 _v,\n bytes32 _r,\n bytes32 _s\n )\n internal\n pure\n returns (\n address _sender\n )\n {\n bytes32 messageHash = getMessageHash(_message, _isEthSignedMessage);\n\n return ecrecover(\n messageHash,\n _v + 27,\n _r,\n _s\n );\n }\n\n function getMessageHash(\n bytes memory _message,\n bool _isEthSignedMessage\n )\n internal\n pure\n returns (bytes32) {\n if (_isEthSignedMessage) {\n return getEthSignedMessageHash(_message);\n }\n return getNativeMessageHash(_message);\n }\n\n\n /*************************************\n * Private Functions: ECDSA Recovery *\n *************************************/\n\n /**\n * Gets the native message hash (simple keccak256) for a message.\n * @param _message Message to hash.\n * @return _messageHash Native message hash.\n */\n function getNativeMessageHash(\n bytes memory _message\n )\n private\n pure\n returns (\n bytes32 _messageHash\n )\n {\n return keccak256(_message);\n }\n\n /**\n * Gets the hash of a message with the `Ethereum Signed Message` prefix.\n * @param _message Message to hash.\n * @return _messageHash Prefixed message hash.\n */\n function getEthSignedMessageHash(\n bytes memory _message\n )\n private\n pure\n returns (\n bytes32 _messageHash\n )\n {\n bytes memory prefix = \"\\x19Ethereum Signed Message:\\n32\";\n bytes32 messageHash = keccak256(_message);\n return keccak256(abi.encodePacked(prefix, messageHash));\n }\n}" - }, - "contracts/optimistic-ethereum/libraries/wrappers/Lib_SafeMathWrapper.sol": { - "content": "// SPDX-License-Identifier: MIT\n// Pulled from @openzeppelin/contracts/math/SafeMath.sol\npragma solidity ^0.7.0;\n\n/* Library Imports */\nimport { Lib_SafeExecutionManagerWrapper } from \"./Lib_SafeExecutionManagerWrapper.sol\";\n\n/**\n * @title Lib_SafeMathWrapper\n */\n\n/**\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\n * checks.\n *\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\n * in bugs, because programmers usually assume that an overflow raises an\n * error, which is the standard behavior in high level programming languages.\n * `SafeMath` restores this intuition by reverting the transaction when an\n * operation overflows.\n *\n * Using this library instead of the unchecked operations eliminates an entire\n * class of bugs, so it's recommended to use it always.\n */\n\nlibrary Lib_SafeMathWrapper {\n /**\n * @dev Returns the addition of two unsigned integers, reverting on\n * overflow.\n *\n * Counterpart to Solidity's `+` operator.\n *\n * Requirements:\n *\n * - Addition cannot overflow.\n */\n function add(uint256 a, uint256 b) internal returns (uint256) {\n uint256 c = a + b;\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(c >= a, \"Lib_SafeMathWrapper: addition overflow\");\n\n return c;\n }\n\n /**\n * @dev Returns the subtraction of two unsigned integers, reverting on\n * overflow (when the result is negative).\n *\n * Counterpart to Solidity's `-` operator.\n *\n * Requirements:\n *\n * - Subtraction cannot overflow.\n */\n function sub(uint256 a, uint256 b) internal returns (uint256) {\n return sub(a, b, \"Lib_SafeMathWrapper: subtraction overflow\");\n }\n\n /**\n * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\n * overflow (when the result is negative).\n *\n * Counterpart to Solidity's `-` operator.\n *\n * Requirements:\n *\n * - Subtraction cannot overflow.\n */\n function sub(uint256 a, uint256 b, string memory errorMessage) internal returns (uint256) {\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(b <= a, errorMessage);\n uint256 c = a - b;\n\n return c;\n }\n\n /**\n * @dev Returns the multiplication of two unsigned integers, reverting on\n * overflow.\n *\n * Counterpart to Solidity's `*` operator.\n *\n * Requirements:\n *\n * - Multiplication cannot overflow.\n */\n function mul(uint256 a, uint256 b) internal returns (uint256) {\n // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\n // benefit is lost if 'b' is also tested.\n // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\n if (a == 0) {\n return 0;\n }\n\n uint256 c = a * b;\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(c / a == b, \"Lib_SafeMathWrapper: multiplication overflow\");\n\n return c;\n }\n\n /**\n * @dev Returns the integer division of two unsigned integers. Reverts on\n * division by zero. The result is rounded towards zero.\n *\n * Counterpart to Solidity's `/` operator. Note: this function uses a\n * `revert` opcode (which leaves remaining gas untouched) while Solidity\n * uses an invalid opcode to revert (consuming all remaining gas).\n *\n * Requirements:\n *\n * - The divisor cannot be zero.\n */\n function div(uint256 a, uint256 b) internal returns (uint256) {\n return div(a, b, \"Lib_SafeMathWrapper: division by zero\");\n }\n\n /**\n * @dev Returns the integer division of two unsigned integers. Reverts with custom message on\n * division by zero. The result is rounded towards zero.\n *\n * Counterpart to Solidity's `/` operator. Note: this function uses a\n * `revert` opcode (which leaves remaining gas untouched) while Solidity\n * uses an invalid opcode to revert (consuming all remaining gas).\n *\n * Requirements:\n *\n * - The divisor cannot be zero.\n */\n function div(uint256 a, uint256 b, string memory errorMessage) internal returns (uint256) {\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(b > 0, errorMessage);\n uint256 c = a / b;\n // assert(a == b * c + a % b); // There is no case in which this doesn't hold\n\n return c;\n }\n\n /**\n * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\n * Reverts when dividing by zero.\n *\n * Counterpart to Solidity's `%` operator. This function uses a `revert`\n * opcode (which leaves remaining gas untouched) while Solidity uses an\n * invalid opcode to revert (consuming all remaining gas).\n *\n * Requirements:\n *\n * - The divisor cannot be zero.\n */\n function mod(uint256 a, uint256 b) internal returns (uint256) {\n return mod(a, b, \"Lib_SafeMathWrapper: modulo by zero\");\n }\n\n /**\n * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\n * Reverts with custom message when dividing by zero.\n *\n * Counterpart to Solidity's `%` operator. This function uses a `revert`\n * opcode (which leaves remaining gas untouched) while Solidity uses an\n * invalid opcode to revert (consuming all remaining gas).\n *\n * Requirements:\n *\n * - The divisor cannot be zero.\n */\n function mod(uint256 a, uint256 b, string memory errorMessage) internal returns (uint256) {\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(b != 0, errorMessage);\n return a % b;\n }\n}" - }, - "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.7.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\nimport { Lib_EthUtils } from \"../../libraries/utils/Lib_EthUtils.sol\";\n\n/* Interface Imports */\nimport { iOVM_ExecutionManager } from \"../../iOVM/execution/iOVM_ExecutionManager.sol\";\nimport { iOVM_StateManager } from \"../../iOVM/execution/iOVM_StateManager.sol\";\nimport { iOVM_SafetyChecker } from \"../../iOVM/execution/iOVM_SafetyChecker.sol\";\n\n/* Contract Imports */\nimport { OVM_ECDSAContractAccount } from \"../accounts/OVM_ECDSAContractAccount.sol\";\nimport { OVM_ProxyEOA } from \"../accounts/OVM_ProxyEOA.sol\";\nimport { OVM_DeployerWhitelist } from \"../precompiles/OVM_DeployerWhitelist.sol\";\n\n/**\n * @title OVM_ExecutionManager\n */\ncontract OVM_ExecutionManager is iOVM_ExecutionManager, Lib_AddressResolver {\n\n /********************************\n * External Contract References *\n ********************************/\n\n iOVM_SafetyChecker internal ovmSafetyChecker;\n iOVM_StateManager internal ovmStateManager;\n\n\n /*******************************\n * Execution Context Variables *\n *******************************/\n\n GasMeterConfig internal gasMeterConfig;\n GlobalContext internal globalContext;\n TransactionContext internal transactionContext;\n MessageContext internal messageContext;\n TransactionRecord internal transactionRecord;\n MessageRecord internal messageRecord;\n\n\n /**************************\n * Gas Metering Constants *\n **************************/\n\n address constant GAS_METADATA_ADDRESS = 0x06a506A506a506A506a506a506A506A506A506A5;\n uint256 constant NUISANCE_GAS_SLOAD = 20000;\n uint256 constant NUISANCE_GAS_SSTORE = 20000;\n uint256 constant MIN_NUISANCE_GAS_PER_CONTRACT = 30000;\n uint256 constant NUISANCE_GAS_PER_CONTRACT_BYTE = 100;\n uint256 constant MIN_GAS_FOR_INVALID_STATE_ACCESS = 30000;\n\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n constructor(\n address _libAddressManager,\n GasMeterConfig memory _gasMeterConfig,\n GlobalContext memory _globalContext\n )\n Lib_AddressResolver(_libAddressManager)\n {\n ovmSafetyChecker = iOVM_SafetyChecker(resolve(\"OVM_SafetyChecker\"));\n gasMeterConfig = _gasMeterConfig;\n globalContext = _globalContext;\n }\n\n\n /**********************\n * Function Modifiers *\n **********************/\n\n /**\n * Applies dynamically-sized refund to a transaction to account for the difference in execution\n * between L1 and L2, so that the overall cost of the ovmOPCODE is fixed.\n * @param _cost Desired gas cost for the function after the refund.\n */\n modifier netGasCost(\n uint256 _cost\n ) {\n uint256 gasProvided = gasleft();\n _;\n uint256 gasUsed = gasProvided - gasleft();\n\n // We want to refund everything *except* the specified cost.\n if (_cost < gasUsed) {\n transactionRecord.ovmGasRefund += gasUsed - _cost;\n }\n }\n\n /**\n * Applies a fixed-size gas refund to a transaction to account for the difference in execution\n * between L1 and L2, so that the overall cost of an ovmOPCODE can be lowered.\n * @param _discount Amount of gas cost to refund for the ovmOPCODE.\n */\n modifier fixedGasDiscount(\n uint256 _discount\n ) {\n uint256 gasProvided = gasleft();\n _;\n uint256 gasUsed = gasProvided - gasleft();\n\n // We want to refund the specified _discount, unless this risks underflow.\n if (_discount < gasUsed) {\n transactionRecord.ovmGasRefund += _discount;\n } else {\n // refund all we can without risking underflow.\n transactionRecord.ovmGasRefund += gasUsed;\n }\n }\n\n /**\n * Makes sure we're not inside a static context.\n */\n modifier notStatic() {\n if (messageContext.isStatic == true) {\n _revertWithFlag(RevertFlag.STATIC_VIOLATION);\n }\n _;\n }\n\n\n /************************************\n * Transaction Execution Entrypoint *\n ************************************/\n\n /**\n * Starts the execution of a transaction via the OVM_ExecutionManager.\n * @param _transaction Transaction data to be executed.\n * @param _ovmStateManager iOVM_StateManager implementation providing account state.\n */\n function run(\n Lib_OVMCodec.Transaction memory _transaction,\n address _ovmStateManager\n )\n override\n public\n {\n require(transactionContext.ovmNUMBER == 0, \"Only be callable at the start of a transaction\");\n // Store our OVM_StateManager instance (significantly easier than attempting to pass the\n // address around in calldata).\n ovmStateManager = iOVM_StateManager(_ovmStateManager);\n\n // Make sure this function can't be called by anyone except the owner of the\n // OVM_StateManager (expected to be an OVM_StateTransitioner). We can revert here because\n // this would make the `run` itself invalid.\n require(\n ovmStateManager.isAuthenticated(msg.sender),\n \"Only authenticated addresses in ovmStateManager can call this function\"\n );\n\n // Initialize the execution context, must be initialized before we perform any gas metering\n // or we'll throw a nuisance gas error.\n _initContext(_transaction);\n\n // TEMPORARY: Gas metering is disabled for minnet.\n // // Check whether we need to start a new epoch, do so if necessary.\n // _checkNeedsNewEpoch(_transaction.timestamp);\n\n // Make sure the transaction's gas limit is valid. We don't revert here because we reserve\n // reverts for INVALID_STATE_ACCESS.\n if (_isValidGasLimit(_transaction.gasLimit, _transaction.l1QueueOrigin) == false) {\n return;\n }\n\n // Check gas right before the call to get total gas consumed by OVM transaction.\n uint256 gasProvided = gasleft();\n\n // Run the transaction, make sure to meter the gas usage.\n ovmCALL(\n _transaction.gasLimit - gasMeterConfig.minTransactionGasLimit,\n _transaction.entrypoint,\n _transaction.data\n );\n uint256 gasUsed = gasProvided - gasleft();\n\n // TEMPORARY: Gas metering is disabled for minnet.\n // // Update the cumulative gas based on the amount of gas used.\n // _updateCumulativeGas(gasUsed, _transaction.l1QueueOrigin);\n\n // Wipe the execution context.\n _resetContext();\n\n // Reset the ovmStateManager.\n ovmStateManager = iOVM_StateManager(address(0));\n }\n\n\n /******************************\n * Opcodes: Execution Context *\n ******************************/\n\n /**\n * @notice Overrides CALLER.\n * @return _CALLER Address of the CALLER within the current message context.\n */\n function ovmCALLER()\n override\n public\n view\n returns (\n address _CALLER\n )\n {\n return messageContext.ovmCALLER;\n }\n\n /**\n * @notice Overrides ADDRESS.\n * @return _ADDRESS Active ADDRESS within the current message context.\n */\n function ovmADDRESS()\n override\n public\n view\n returns (\n address _ADDRESS\n )\n {\n return messageContext.ovmADDRESS;\n }\n\n /**\n * @notice Overrides TIMESTAMP.\n * @return _TIMESTAMP Value of the TIMESTAMP within the transaction context.\n */\n function ovmTIMESTAMP()\n override\n public\n view\n returns (\n uint256 _TIMESTAMP\n )\n {\n return transactionContext.ovmTIMESTAMP;\n }\n\n /**\n * @notice Overrides NUMBER.\n * @return _NUMBER Value of the NUMBER within the transaction context.\n */\n function ovmNUMBER()\n override\n public\n view\n returns (\n uint256 _NUMBER\n )\n {\n return transactionContext.ovmNUMBER;\n }\n\n /**\n * @notice Overrides GASLIMIT.\n * @return _GASLIMIT Value of the block's GASLIMIT within the transaction context.\n */\n function ovmGASLIMIT()\n override\n public\n view\n returns (\n uint256 _GASLIMIT\n )\n {\n return transactionContext.ovmGASLIMIT;\n }\n\n /**\n * @notice Overrides CHAINID.\n * @return _CHAINID Value of the chain's CHAINID within the global context.\n */\n function ovmCHAINID()\n override\n public\n view\n returns (\n uint256 _CHAINID\n )\n {\n return globalContext.ovmCHAINID;\n }\n\n /*********************************\n * Opcodes: L2 Execution Context *\n *********************************/\n\n /**\n * @notice Specifies from which L1 rollup queue this transaction originated from.\n * @return _queueOrigin Address of the ovmL1QUEUEORIGIN within the current message context.\n */\n function ovmL1QUEUEORIGIN()\n override\n public\n view\n returns (\n Lib_OVMCodec.QueueOrigin _queueOrigin\n )\n {\n return transactionContext.ovmL1QUEUEORIGIN;\n }\n\n /**\n * @notice Specifies what L1 EOA, if any, sent this transaction.\n * @return _l1TxOrigin Address of the EOA which send the tx into L2 from L1.\n */\n function ovmL1TXORIGIN()\n override\n public\n view\n returns (\n address _l1TxOrigin\n )\n {\n return transactionContext.ovmL1TXORIGIN;\n }\n\n /********************\n * Opcodes: Halting *\n ********************/\n\n /**\n * @notice Overrides REVERT.\n * @param _data Bytes data to pass along with the REVERT.\n */\n function ovmREVERT(\n bytes memory _data\n )\n override\n public\n {\n _revertWithFlag(RevertFlag.INTENTIONAL_REVERT, _data);\n }\n\n\n /******************************\n * Opcodes: Contract Creation *\n ******************************/\n\n /**\n * @notice Overrides CREATE.\n * @param _bytecode Code to be used to CREATE a new contract.\n * @return _contract Address of the created contract.\n */\n function ovmCREATE(\n bytes memory _bytecode\n )\n override\n public\n notStatic\n fixedGasDiscount(40000)\n returns (\n address _contract\n )\n {\n // Creator is always the current ADDRESS.\n address creator = ovmADDRESS();\n\n // Check that the deployer is whitelisted, or\n // that arbitrary contract deployment has been enabled.\n _checkDeployerAllowed(creator);\n\n // Generate the correct CREATE address.\n address contractAddress = Lib_EthUtils.getAddressForCREATE(\n creator,\n _getAccountNonce(creator)\n );\n\n return _createContract(\n contractAddress,\n _bytecode\n );\n }\n\n /**\n * @notice Overrides CREATE2.\n * @param _bytecode Code to be used to CREATE2 a new contract.\n * @param _salt Value used to determine the contract's address.\n * @return _contract Address of the created contract.\n */\n function ovmCREATE2(\n bytes memory _bytecode,\n bytes32 _salt\n )\n override\n public\n notStatic\n fixedGasDiscount(40000)\n returns (\n address _contract\n )\n {\n // Creator is always the current ADDRESS.\n address creator = ovmADDRESS();\n\n // Check that the deployer is whitelisted, or\n // that arbitrary contract deployment has been enabled.\n _checkDeployerAllowed(creator);\n\n // Generate the correct CREATE2 address.\n address contractAddress = Lib_EthUtils.getAddressForCREATE2(\n creator,\n _bytecode,\n _salt\n );\n\n return _createContract(\n contractAddress,\n _bytecode\n );\n }\n\n\n /*******************************\n * Account Abstraction Opcodes *\n ******************************/\n\n /**\n * Retrieves the nonce of the current ovmADDRESS.\n * @return _nonce Nonce of the current contract.\n */\n function ovmGETNONCE()\n override\n public\n returns (\n uint256 _nonce\n )\n {\n return _getAccountNonce(ovmADDRESS());\n }\n\n /**\n * Sets the nonce of the current ovmADDRESS.\n * @param _nonce New nonce for the current contract.\n */\n function ovmSETNONCE(\n uint256 _nonce\n )\n override\n public\n notStatic\n {\n _setAccountNonce(ovmADDRESS(), _nonce);\n }\n\n /**\n * Creates a new EOA contract account, for account abstraction.\n * @dev Essentially functions like ovmCREATE or ovmCREATE2, but we can bypass a lot of checks\n * because the contract we're creating is trusted (no need to do safety checking or to\n * handle unexpected reverts). Doesn't need to return an address because the address is\n * assumed to be the user's actual address.\n * @param _messageHash Hash of a message signed by some user, for verification.\n * @param _v Signature `v` parameter.\n * @param _r Signature `r` parameter.\n * @param _s Signature `s` parameter.\n */\n function ovmCREATEEOA(\n bytes32 _messageHash,\n uint8 _v,\n bytes32 _r,\n bytes32 _s\n )\n override\n public\n notStatic\n {\n // Recover the EOA address from the message hash and signature parameters. Since we do the\n // hashing in advance, we don't have handle different message hashing schemes. Even if this\n // function were to return the wrong address (rather than explicitly returning the zero\n // address), the rest of the transaction would simply fail (since there's no EOA account to\n // actually execute the transaction).\n address eoa = ecrecover(\n _messageHash,\n _v + 27,\n _r,\n _s\n );\n\n // Invalid signature is a case we proactively handle with a revert. We could alternatively\n // have this function return a `success` boolean, but this is just easier.\n if (eoa == address(0)) {\n ovmREVERT(bytes(\"Signature provided for EOA contract creation is invalid.\"));\n }\n\n // If the user already has an EOA account, then there's no need to perform this operation.\n if (_hasEmptyAccount(eoa) == false) {\n return;\n }\n\n // We always need to initialize the contract with the default account values.\n _initPendingAccount(eoa);\n\n // Temporarily set the current address so it's easier to access on L2.\n address prevADDRESS = messageContext.ovmADDRESS;\n messageContext.ovmADDRESS = eoa;\n\n // Now actually create the account and get its bytecode. We're not worried about reverts\n // (other than out of gas, which we can't capture anyway) because this contract is trusted.\n OVM_ProxyEOA proxyEOA = new OVM_ProxyEOA(0x4200000000000000000000000000000000000003);\n\n // Reset the address now that we're done deploying.\n messageContext.ovmADDRESS = prevADDRESS;\n\n // Commit the account with its final values.\n _commitPendingAccount(\n eoa,\n address(proxyEOA),\n keccak256(Lib_EthUtils.getCode(address(proxyEOA)))\n );\n\n _setAccountNonce(eoa, 0);\n }\n\n\n /*********************************\n * Opcodes: Contract Interaction *\n *********************************/\n\n /**\n * @notice Overrides CALL.\n * @param _gasLimit Amount of gas to be passed into this call.\n * @param _address Address of the contract to call.\n * @param _calldata Data to send along with the call.\n * @return _success Whether or not the call returned (rather than reverted).\n * @return _returndata Data returned by the call.\n */\n function ovmCALL(\n uint256 _gasLimit,\n address _address,\n bytes memory _calldata\n )\n override\n public\n fixedGasDiscount(100000)\n returns (\n bool _success,\n bytes memory _returndata\n )\n {\n // CALL updates the CALLER and ADDRESS.\n MessageContext memory nextMessageContext = messageContext;\n nextMessageContext.ovmCALLER = nextMessageContext.ovmADDRESS;\n nextMessageContext.ovmADDRESS = _address;\n\n return _callContract(\n nextMessageContext,\n _gasLimit,\n _address,\n _calldata\n );\n }\n\n /**\n * @notice Overrides STATICCALL.\n * @param _gasLimit Amount of gas to be passed into this call.\n * @param _address Address of the contract to call.\n * @param _calldata Data to send along with the call.\n * @return _success Whether or not the call returned (rather than reverted).\n * @return _returndata Data returned by the call.\n */\n function ovmSTATICCALL(\n uint256 _gasLimit,\n address _address,\n bytes memory _calldata\n )\n override\n public\n fixedGasDiscount(80000)\n returns (\n bool _success,\n bytes memory _returndata\n )\n {\n // STATICCALL updates the CALLER, updates the ADDRESS, and runs in a static context.\n MessageContext memory nextMessageContext = messageContext;\n nextMessageContext.ovmCALLER = nextMessageContext.ovmADDRESS;\n nextMessageContext.ovmADDRESS = _address;\n nextMessageContext.isStatic = true;\n\n return _callContract(\n nextMessageContext,\n _gasLimit,\n _address,\n _calldata\n );\n }\n\n /**\n * @notice Overrides DELEGATECALL.\n * @param _gasLimit Amount of gas to be passed into this call.\n * @param _address Address of the contract to call.\n * @param _calldata Data to send along with the call.\n * @return _success Whether or not the call returned (rather than reverted).\n * @return _returndata Data returned by the call.\n */\n function ovmDELEGATECALL(\n uint256 _gasLimit,\n address _address,\n bytes memory _calldata\n )\n override\n public\n fixedGasDiscount(40000)\n returns (\n bool _success,\n bytes memory _returndata\n )\n {\n // DELEGATECALL does not change anything about the message context.\n MessageContext memory nextMessageContext = messageContext;\n bool isStaticEntrypoint = false;\n\n return _callContract(\n nextMessageContext,\n _gasLimit,\n _address,\n _calldata\n );\n }\n\n\n /************************************\n * Opcodes: Contract Storage Access *\n ************************************/\n\n /**\n * @notice Overrides SLOAD.\n * @param _key 32 byte key of the storage slot to load.\n * @return _value 32 byte value of the requested storage slot.\n */\n function ovmSLOAD(\n bytes32 _key\n )\n override\n public\n netGasCost(40000)\n returns (\n bytes32 _value\n )\n {\n // We always SLOAD from the storage of ADDRESS.\n address contractAddress = ovmADDRESS();\n\n return _getContractStorage(\n contractAddress,\n _key\n );\n }\n\n /**\n * @notice Overrides SSTORE.\n * @param _key 32 byte key of the storage slot to set.\n * @param _value 32 byte value for the storage slot.\n */\n function ovmSSTORE(\n bytes32 _key,\n bytes32 _value\n )\n override\n public\n notStatic\n netGasCost(60000)\n {\n // We always SSTORE to the storage of ADDRESS.\n address contractAddress = ovmADDRESS();\n\n _putContractStorage(\n contractAddress,\n _key,\n _value\n );\n }\n\n\n /*********************************\n * Opcodes: Contract Code Access *\n *********************************/\n\n /**\n * @notice Overrides EXTCODECOPY.\n * @param _contract Address of the contract to copy code from.\n * @param _offset Offset in bytes from the start of contract code to copy beyond.\n * @param _length Total number of bytes to copy from the contract's code.\n * @return _code Bytes of code copied from the requested contract.\n */\n function ovmEXTCODECOPY(\n address _contract,\n uint256 _offset,\n uint256 _length\n )\n override\n public\n returns (\n bytes memory _code\n )\n {\n // `ovmEXTCODECOPY` is the only overridden opcode capable of producing exactly one byte of\n // return data. By blocking reads of one byte, we're able to use the condition that an\n // OVM_ExecutionManager function return value having a length of exactly one byte indicates\n // an error without an explicit revert. If users were able to read a single byte, they\n // could forcibly trigger behavior that should only be available to this contract.\n uint256 length = _length == 1 ? 2 : _length;\n\n return Lib_EthUtils.getCode(\n _getAccountEthAddress(_contract),\n _offset,\n length\n );\n }\n\n /**\n * @notice Overrides EXTCODESIZE.\n * @param _contract Address of the contract to query the size of.\n * @return _EXTCODESIZE Size of the requested contract in bytes.\n */\n function ovmEXTCODESIZE(\n address _contract\n )\n override\n public\n returns (\n uint256 _EXTCODESIZE\n )\n {\n return Lib_EthUtils.getCodeSize(\n _getAccountEthAddress(_contract)\n );\n }\n\n /**\n * @notice Overrides EXTCODEHASH.\n * @param _contract Address of the contract to query the hash of.\n * @return _EXTCODEHASH Hash of the requested contract.\n */\n function ovmEXTCODEHASH(\n address _contract\n )\n override\n public\n returns (\n bytes32 _EXTCODEHASH\n )\n {\n return Lib_EthUtils.getCodeHash(\n _getAccountEthAddress(_contract)\n );\n }\n\n\n /**************************************\n * Public Functions: Execution Safety *\n **************************************/\n\n /**\n * Performs the logic to create a contract and revert under various potential conditions.\n * @dev This function is implemented as `public` because we need to be able to revert a\n * contract creation without losing information about exactly *why* the contract reverted.\n * In particular, we want to be sure that contracts cannot trigger an INVALID_STATE_ACCESS\n * flag and then revert to reset the flag. We're able to do this by making an external\n * call from `ovmCREATE` and `ovmCREATE2` to `safeCREATE`, which can capture and relay\n * information before reverting.\n * @param _address Address of the contract to associate with the one being created.\n * @param _bytecode Code to be used to create the new contract.\n */\n function safeCREATE(\n address _address,\n bytes memory _bytecode\n )\n override\n public\n {\n // Since this function is public, anyone can attempt to directly call it. We need to make\n // sure that the OVM_ExecutionManager itself is the only party that can actually try to\n // call this function.\n if (msg.sender != address(this)) {\n return;\n }\n\n // We need to be sure that the user isn't trying to use a contract creation to overwrite\n // some existing contract. On L1, users will prove that no contract exists at the address\n // and the OVM_FraudVerifier will populate the code hash of this address with a special\n // value that represents \"known to be an empty account.\"\n if (_hasEmptyAccount(_address) == false) {\n _revertWithFlag(RevertFlag.CREATE_COLLISION);\n }\n\n // Check the creation bytecode against the OVM_SafetyChecker.\n if (ovmSafetyChecker.isBytecodeSafe(_bytecode) == false) {\n _revertWithFlag(RevertFlag.UNSAFE_BYTECODE);\n }\n\n // We always need to initialize the contract with the default account values.\n _initPendingAccount(_address);\n\n // Actually deploy the contract and retrieve its address. This step is hiding a lot of\n // complexity because we need to ensure that contract creation *never* reverts by itself.\n // We cover this partially by storing a revert flag and returning (instead of reverting)\n // when we know that we're inside a contract's creation code.\n address ethAddress = Lib_EthUtils.createContract(_bytecode);\n\n // Contract creation returns the zero address when it fails, which should only be possible\n // if the user intentionally runs out of gas. However, we might still have a bit of gas\n // left over since contract calls can only be passed 63/64ths of total gas, so we need to\n // explicitly handle this case here.\n if (ethAddress == address(0)) {\n _revertWithFlag(RevertFlag.CREATE_EXCEPTION);\n }\n\n // Here we pull out the revert flag that would've been set during creation code. Now that\n // we're out of creation code again, we can just revert normally while passing the flag\n // through the revert data.\n if (messageRecord.revertFlag != RevertFlag.DID_NOT_REVERT) {\n _revertWithFlag(messageRecord.revertFlag);\n }\n\n // Again simply checking that the deployed code is safe too. Contracts can generate\n // arbitrary deployment code, so there's no easy way to analyze this beforehand.\n bytes memory deployedCode = Lib_EthUtils.getCode(ethAddress);\n if (ovmSafetyChecker.isBytecodeSafe(deployedCode) == false) {\n _revertWithFlag(RevertFlag.UNSAFE_BYTECODE);\n }\n\n // Contract creation didn't need to be reverted and the bytecode is safe. We finish up by\n // associating the desired address with the newly created contract's code hash and address.\n _commitPendingAccount(\n _address,\n ethAddress,\n Lib_EthUtils.getCodeHash(ethAddress)\n );\n }\n\n\n /***************************************\n * Public Functions: Execution Context *\n ***************************************/\n\n function getMaxTransactionGasLimit()\n external\n view\n override\n returns (\n uint256 _maxTransactionGasLimit\n )\n {\n return gasMeterConfig.maxTransactionGasLimit;\n }\n\n /********************************************\n * Public Functions: Deployment Witelisting *\n ********************************************/\n\n /**\n * Checks whether the given address is on the whitelst to ovmCREATE/ovmCREATE2, and reverts if not.\n * @param _deployerAddress Address attempting to deploy a contract.\n */\n function _checkDeployerAllowed(\n address _deployerAddress\n )\n internal\n {\n // From an OVM semanitcs perspectibe, this will appear the identical to\n // the deployer ovmCALLing the whitelist. This is fine--in a sense, we are forcing them to.\n (bool success, bytes memory data) = ovmCALL(\n gasleft(),\n 0x4200000000000000000000000000000000000002,\n abi.encodeWithSignature(\"isDeployerAllowed(address)\", _deployerAddress)\n );\n bool isAllowed = abi.decode(data, (bool));\n\n if (!isAllowed || !success) {\n _revertWithFlag(RevertFlag.CREATOR_NOT_ALLOWED);\n } \n }\n\n /********************************************\n * Internal Functions: Contract Interaction *\n ********************************************/\n\n /**\n * Creates a new contract and associates it with some contract address.\n * @param _contractAddress Address to associate the created contract with.\n * @param _bytecode Bytecode to be used to create the contract.\n * @return _created Final OVM contract address.\n */\n function _createContract(\n address _contractAddress,\n bytes memory _bytecode\n )\n internal\n returns (\n address _created\n )\n {\n // We always update the nonce of the creating account, even if the creation fails.\n _setAccountNonce(ovmADDRESS(), _getAccountNonce(ovmADDRESS()) + 1);\n\n // We're stepping into a CREATE or CREATE2, so we need to update ADDRESS to point\n // to the contract's associated address and CALLER to point to the previous ADDRESS.\n MessageContext memory nextMessageContext = messageContext;\n nextMessageContext.ovmCALLER = messageContext.ovmADDRESS;\n nextMessageContext.ovmADDRESS = _contractAddress;\n\n // Run `safeCREATE` in a new EVM message so that our changes can be reflected even if\n // `safeCREATE` reverts.\n (bool _success, ) = _handleExternalInteraction(\n nextMessageContext,\n gasleft(),\n address(this),\n abi.encodeWithSignature(\n \"safeCREATE(address,bytes)\",\n _contractAddress,\n _bytecode\n )\n );\n\n // Need to make sure that this flag is reset so that it isn't propagated to creations in\n // some parent EVM message.\n messageRecord.revertFlag = RevertFlag.DID_NOT_REVERT;\n\n // Yellow paper requires that address returned is zero if the contract deployment fails.\n return _success ? _contractAddress : address(0);\n }\n\n /**\n * Calls the deployed contract associated with a given address.\n * @param _nextMessageContext Message context to be used for the call.\n * @param _gasLimit Amount of gas to be passed into this call.\n * @param _contract OVM address to be called.\n * @param _calldata Data to send along with the call.\n * @return _success Whether or not the call returned (rather than reverted).\n * @return _returndata Data returned by the call.\n */\n function _callContract(\n MessageContext memory _nextMessageContext,\n uint256 _gasLimit,\n address _contract,\n bytes memory _calldata\n )\n internal\n returns (\n bool _success,\n bytes memory _returndata\n )\n {\n // We reserve addresses of the form 0xdeaddeaddead...NNNN for the container contracts in L2 geth.\n // So, we block calls to these addresses since they are not safe to run as an OVM contract itself.\n if (\n (uint256(_contract) & uint256(0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000)) \n == uint256(0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000)\n ) {\n return (true, hex'');\n }\n\n // Both 0x0000... and the EVM precompiles have the same address on L1 and L2 --> no trie lookup needed.\n address codeContractAddress =\n uint(_contract) < 100\n ? _contract\n : _getAccountEthAddress(_contract);\n\n return _handleExternalInteraction(\n _nextMessageContext,\n _gasLimit,\n codeContractAddress,\n _calldata\n );\n }\n\n /**\n * Handles the logic of making an external call and parsing revert information.\n * @param _nextMessageContext Message context to be used for the call.\n * @param _gasLimit Amount of gas to be passed into this call.\n * @param _target Address of the contract to call.\n * @param _data Data to send along with the call.\n * @return _success Whether or not the call returned (rather than reverted).\n * @return _returndata Data returned by the call.\n */\n function _handleExternalInteraction(\n MessageContext memory _nextMessageContext,\n uint256 _gasLimit,\n address _target,\n bytes memory _data\n )\n internal\n returns (\n bool _success,\n bytes memory _returndata\n )\n {\n // We need to switch over to our next message context for the duration of this call.\n MessageContext memory prevMessageContext = messageContext;\n _switchMessageContext(prevMessageContext, _nextMessageContext);\n\n // Nuisance gas is a system used to bound the ability for an attacker to make fraud proofs\n // expensive by touching a lot of different accounts or storage slots. Since most contracts\n // only use a few storage slots during any given transaction, this shouldn't be a limiting\n // factor.\n uint256 prevNuisanceGasLeft = messageRecord.nuisanceGasLeft;\n uint256 nuisanceGasLimit = _getNuisanceGasLimit(_gasLimit);\n messageRecord.nuisanceGasLeft = nuisanceGasLimit;\n\n // Make the call and make sure to pass in the gas limit. Another instance of hidden\n // complexity. `_target` is guaranteed to be a safe contract, meaning its return/revert\n // behavior can be controlled. In particular, we enforce that flags are passed through\n // revert data as to retrieve execution metadata that would normally be reverted out of\n // existence.\n (bool success, bytes memory returndata) = _target.call{gas: _gasLimit}(_data);\n\n // Switch back to the original message context now that we're out of the call.\n _switchMessageContext(_nextMessageContext, prevMessageContext);\n\n // Assuming there were no reverts, the message record should be accurate here. We'll update\n // this value in the case of a revert.\n uint256 nuisanceGasLeft = messageRecord.nuisanceGasLeft;\n\n // Reverts at this point are completely OK, but we need to make a few updates based on the\n // information passed through the revert.\n if (success == false) {\n (\n RevertFlag flag,\n uint256 nuisanceGasLeftPostRevert,\n uint256 ovmGasRefund,\n bytes memory returndataFromFlag\n ) = _decodeRevertData(returndata);\n\n // INVALID_STATE_ACCESS is the only flag that triggers an immediate abort of the\n // parent EVM message. This behavior is necessary because INVALID_STATE_ACCESS must\n // halt any further transaction execution that could impact the execution result.\n if (flag == RevertFlag.INVALID_STATE_ACCESS) {\n _revertWithFlag(flag);\n }\n\n // INTENTIONAL_REVERT, UNSAFE_BYTECODE, STATIC_VIOLATION, and CREATOR_NOT_ALLOWED aren't \n // dependent on the input state, so we can just handle them like standard reverts. Our only change here\n // is to record the gas refund reported by the call (enforced by safety checking).\n if (\n flag == RevertFlag.INTENTIONAL_REVERT\n || flag == RevertFlag.UNSAFE_BYTECODE\n || flag == RevertFlag.STATIC_VIOLATION\n || flag == RevertFlag.CREATOR_NOT_ALLOWED\n ) {\n transactionRecord.ovmGasRefund = ovmGasRefund;\n }\n\n // INTENTIONAL_REVERT needs to pass up the user-provided return data encoded into the\n // flag, *not* the full encoded flag. All other revert types return no data.\n if (flag == RevertFlag.INTENTIONAL_REVERT) {\n returndata = returndataFromFlag;\n } else {\n returndata = hex'';\n }\n\n // Reverts mean we need to use up whatever \"nuisance gas\" was used by the call.\n // EXCEEDS_NUISANCE_GAS explicitly reduces the remaining nuisance gas for this message\n // to zero. OUT_OF_GAS is a \"pseudo\" flag given that messages return no data when they\n // run out of gas, so we have to treat this like EXCEEDS_NUISANCE_GAS. All other flags\n // will simply pass up the remaining nuisance gas.\n nuisanceGasLeft = nuisanceGasLeftPostRevert;\n }\n\n // We need to reset the nuisance gas back to its original value minus the amount used here.\n messageRecord.nuisanceGasLeft = prevNuisanceGasLeft - (nuisanceGasLimit - nuisanceGasLeft);\n\n return (\n success,\n returndata\n );\n }\n\n\n /******************************************\n * Internal Functions: State Manipulation *\n ******************************************/\n\n /**\n * Checks whether an account exists within the OVM_StateManager.\n * @param _address Address of the account to check.\n * @return _exists Whether or not the account exists.\n */\n function _hasAccount(\n address _address\n )\n internal\n returns (\n bool _exists\n )\n {\n _checkAccountLoad(_address);\n return ovmStateManager.hasAccount(_address);\n }\n\n /**\n * Checks whether a known empty account exists within the OVM_StateManager.\n * @param _address Address of the account to check.\n * @return _exists Whether or not the account empty exists.\n */\n function _hasEmptyAccount(\n address _address\n )\n internal\n returns (\n bool _exists\n )\n {\n _checkAccountLoad(_address);\n return ovmStateManager.hasEmptyAccount(_address);\n }\n\n /**\n * Sets the nonce of an account.\n * @param _address Address of the account to modify.\n * @param _nonce New account nonce.\n */\n function _setAccountNonce(\n address _address,\n uint256 _nonce\n )\n internal\n {\n _checkAccountChange(_address);\n ovmStateManager.setAccountNonce(_address, _nonce);\n }\n\n /**\n * Gets the nonce of an account.\n * @param _address Address of the account to access.\n * @return _nonce Nonce of the account.\n */\n function _getAccountNonce(\n address _address\n )\n internal\n returns (\n uint256 _nonce\n )\n {\n _checkAccountLoad(_address);\n return ovmStateManager.getAccountNonce(_address);\n }\n\n /**\n * Retrieves the Ethereum address of an account.\n * @param _address Address of the account to access.\n * @return _ethAddress Corresponding Ethereum address.\n */\n function _getAccountEthAddress(\n address _address\n )\n internal\n returns (\n address _ethAddress\n )\n {\n _checkAccountLoad(_address);\n return ovmStateManager.getAccountEthAddress(_address);\n }\n\n /**\n * Creates the default account object for the given address.\n * @param _address Address of the account create.\n */\n function _initPendingAccount(\n address _address\n )\n internal\n {\n // Although it seems like `_checkAccountChange` would be more appropriate here, we don't\n // actually consider an account \"changed\" until it's inserted into the state (in this case\n // by `_commitPendingAccount`).\n _checkAccountLoad(_address);\n ovmStateManager.initPendingAccount(_address);\n }\n\n /**\n * Stores additional relevant data for a new account, thereby \"committing\" it to the state.\n * This function is only called during `ovmCREATE` and `ovmCREATE2` after a successful contract\n * creation.\n * @param _address Address of the account to commit.\n * @param _ethAddress Address of the associated deployed contract.\n * @param _codeHash Hash of the code stored at the address.\n */\n function _commitPendingAccount(\n address _address,\n address _ethAddress,\n bytes32 _codeHash\n )\n internal\n {\n _checkAccountChange(_address);\n ovmStateManager.commitPendingAccount(\n _address,\n _ethAddress,\n _codeHash\n );\n }\n\n /**\n * Retrieves the value of a storage slot.\n * @param _contract Address of the contract to query.\n * @param _key 32 byte key of the storage slot.\n * @return _value 32 byte storage slot value.\n */\n function _getContractStorage(\n address _contract,\n bytes32 _key\n )\n internal\n returns (\n bytes32 _value\n )\n {\n _checkContractStorageLoad(_contract, _key);\n return ovmStateManager.getContractStorage(_contract, _key);\n }\n\n /**\n * Sets the value of a storage slot.\n * @param _contract Address of the contract to modify.\n * @param _key 32 byte key of the storage slot.\n * @param _value 32 byte storage slot value.\n */\n function _putContractStorage(\n address _contract,\n bytes32 _key,\n bytes32 _value\n )\n internal\n {\n // We don't set storage if the value didn't change. Although this acts as a convenient\n // optimization, it's also necessary to avoid the case in which a contract with no storage\n // attempts to store the value \"0\" at any key. Putting this value (and therefore requiring\n // that the value be committed into the storage trie after execution) would incorrectly\n // modify the storage root.\n if (_getContractStorage(_contract, _key) == _value) {\n return;\n }\n\n _checkContractStorageChange(_contract, _key);\n ovmStateManager.putContractStorage(_contract, _key, _value);\n }\n\n /**\n * Validation whenever a contract needs to be loaded. Checks that the account exists, charges\n * nuisance gas if the account hasn't been loaded before.\n * @param _address Address of the account to load.\n */\n function _checkAccountLoad(\n address _address\n )\n internal\n {\n // See `_checkContractStorageLoad` for more information.\n if (gasleft() < MIN_GAS_FOR_INVALID_STATE_ACCESS) {\n _revertWithFlag(RevertFlag.OUT_OF_GAS);\n }\n\n // See `_checkContractStorageLoad` for more information.\n if (ovmStateManager.hasAccount(_address) == false) {\n _revertWithFlag(RevertFlag.INVALID_STATE_ACCESS);\n }\n\n // Check whether the account has been loaded before and mark it as loaded if not. We need\n // this because \"nuisance gas\" only applies to the first time that an account is loaded.\n (\n bool _wasAccountAlreadyLoaded\n ) = ovmStateManager.testAndSetAccountLoaded(_address);\n\n // If we hadn't already loaded the account, then we'll need to charge \"nuisance gas\" based\n // on the size of the contract code.\n if (_wasAccountAlreadyLoaded == false) {\n _useNuisanceGas(\n (Lib_EthUtils.getCodeSize(_getAccountEthAddress(_address)) * NUISANCE_GAS_PER_CONTRACT_BYTE) + MIN_NUISANCE_GAS_PER_CONTRACT\n );\n }\n }\n\n /**\n * Validation whenever a contract needs to be changed. Checks that the account exists, charges\n * nuisance gas if the account hasn't been changed before.\n * @param _address Address of the account to change.\n */\n function _checkAccountChange(\n address _address\n )\n internal\n {\n // Start by checking for a load as we only want to charge nuisance gas proportional to\n // contract size once.\n _checkAccountLoad(_address);\n\n // Check whether the account has been changed before and mark it as changed if not. We need\n // this because \"nuisance gas\" only applies to the first time that an account is changed.\n (\n bool _wasAccountAlreadyChanged\n ) = ovmStateManager.testAndSetAccountChanged(_address);\n\n // If we hadn't already loaded the account, then we'll need to charge \"nuisance gas\" based\n // on the size of the contract code.\n if (_wasAccountAlreadyChanged == false) {\n ovmStateManager.incrementTotalUncommittedAccounts();\n _useNuisanceGas(\n (Lib_EthUtils.getCodeSize(_getAccountEthAddress(_address)) * NUISANCE_GAS_PER_CONTRACT_BYTE) + MIN_NUISANCE_GAS_PER_CONTRACT\n );\n }\n }\n\n /**\n * Validation whenever a slot needs to be loaded. Checks that the account exists, charges\n * nuisance gas if the slot hasn't been loaded before.\n * @param _contract Address of the account to load from.\n * @param _key 32 byte key to load.\n */\n function _checkContractStorageLoad(\n address _contract,\n bytes32 _key\n )\n internal\n {\n // Another case of hidden complexity. If we didn't enforce this requirement, then a\n // contract could pass in just enough gas to cause the INVALID_STATE_ACCESS check to fail\n // on L1 but not on L2. A contract could use this behavior to prevent the\n // OVM_ExecutionManager from detecting an invalid state access. Reverting with OUT_OF_GAS\n // allows us to also charge for the full message nuisance gas, because you deserve that for\n // trying to break the contract in this way.\n if (gasleft() < MIN_GAS_FOR_INVALID_STATE_ACCESS) {\n _revertWithFlag(RevertFlag.OUT_OF_GAS);\n }\n\n // We need to make sure that the transaction isn't trying to access storage that hasn't\n // been provided to the OVM_StateManager. We'll immediately abort if this is the case.\n // We know that we have enough gas to do this check because of the above test.\n if (ovmStateManager.hasContractStorage(_contract, _key) == false) {\n _revertWithFlag(RevertFlag.INVALID_STATE_ACCESS);\n }\n\n // Check whether the slot has been loaded before and mark it as loaded if not. We need\n // this because \"nuisance gas\" only applies to the first time that a slot is loaded.\n (\n bool _wasContractStorageAlreadyLoaded\n ) = ovmStateManager.testAndSetContractStorageLoaded(_contract, _key);\n\n // If we hadn't already loaded the account, then we'll need to charge some fixed amount of\n // \"nuisance gas\".\n if (_wasContractStorageAlreadyLoaded == false) {\n _useNuisanceGas(NUISANCE_GAS_SLOAD);\n }\n }\n\n /**\n * Validation whenever a slot needs to be changed. Checks that the account exists, charges\n * nuisance gas if the slot hasn't been changed before.\n * @param _contract Address of the account to change.\n * @param _key 32 byte key to change.\n */\n function _checkContractStorageChange(\n address _contract,\n bytes32 _key\n )\n internal\n {\n // Start by checking for load to make sure we have the storage slot and that we charge the\n // \"nuisance gas\" necessary to prove the storage slot state.\n _checkContractStorageLoad(_contract, _key);\n\n // Check whether the slot has been changed before and mark it as changed if not. We need\n // this because \"nuisance gas\" only applies to the first time that a slot is changed.\n (\n bool _wasContractStorageAlreadyChanged\n ) = ovmStateManager.testAndSetContractStorageChanged(_contract, _key);\n\n // If we hadn't already changed the account, then we'll need to charge some fixed amount of\n // \"nuisance gas\".\n if (_wasContractStorageAlreadyChanged == false) {\n // Changing a storage slot means that we're also going to have to change the\n // corresponding account, so do an account change check.\n _checkAccountChange(_contract);\n\n ovmStateManager.incrementTotalUncommittedContractStorage();\n _useNuisanceGas(NUISANCE_GAS_SSTORE);\n }\n }\n\n\n /************************************\n * Internal Functions: Revert Logic *\n ************************************/\n\n /**\n * Simple encoding for revert data.\n * @param _flag Flag to revert with.\n * @param _data Additional user-provided revert data.\n * @return _revertdata Encoded revert data.\n */\n function _encodeRevertData(\n RevertFlag _flag,\n bytes memory _data\n )\n internal\n view\n returns (\n bytes memory _revertdata\n )\n {\n // Out of gas and create exceptions will fundamentally return no data, so simulating it shouldn't either.\n if (\n _flag == RevertFlag.OUT_OF_GAS\n || _flag == RevertFlag.CREATE_EXCEPTION\n ) {\n return bytes('');\n }\n\n // INVALID_STATE_ACCESS doesn't need to return any data other than the flag.\n if (_flag == RevertFlag.INVALID_STATE_ACCESS) {\n return abi.encode(\n _flag,\n 0,\n 0,\n bytes('')\n );\n }\n\n // Just ABI encode the rest of the parameters.\n return abi.encode(\n _flag,\n messageRecord.nuisanceGasLeft,\n transactionRecord.ovmGasRefund,\n _data\n );\n }\n\n /**\n * Simple decoding for revert data.\n * @param _revertdata Revert data to decode.\n * @return _flag Flag used to revert.\n * @return _nuisanceGasLeft Amount of nuisance gas unused by the message.\n * @return _ovmGasRefund Amount of gas refunded during the message.\n * @return _data Additional user-provided revert data.\n */\n function _decodeRevertData(\n bytes memory _revertdata\n )\n internal\n pure\n returns (\n RevertFlag _flag,\n uint256 _nuisanceGasLeft,\n uint256 _ovmGasRefund,\n bytes memory _data\n )\n {\n // A length of zero means the call ran out of gas, just return empty data.\n if (_revertdata.length == 0) {\n return (\n RevertFlag.OUT_OF_GAS,\n 0,\n 0,\n bytes('')\n );\n }\n\n // ABI decode the incoming data.\n return abi.decode(_revertdata, (RevertFlag, uint256, uint256, bytes));\n }\n\n /**\n * Causes a message to revert or abort.\n * @param _flag Flag to revert with.\n * @param _data Additional user-provided data.\n */\n function _revertWithFlag(\n RevertFlag _flag,\n bytes memory _data\n )\n internal\n {\n // We don't want to revert when we're inside a CREATE or CREATE2, because those opcodes\n // fail silently (we can't pass any data upwards). Instead, we set a flag and return a\n // *single* byte, something the OVM_ExecutionManager will not return in any other case.\n // We're thereby allowed to communicate failure without allowing contracts to trick us into\n // thinking there was a failure.\n bool isCreation;\n assembly {\n isCreation := eq(extcodesize(caller()), 0)\n }\n\n if (isCreation) {\n messageRecord.revertFlag = _flag;\n\n assembly {\n return(0, 1)\n }\n }\n\n // If we're not inside a CREATE or CREATE2, we can simply encode the necessary data and\n // revert normally.\n bytes memory revertdata = _encodeRevertData(\n _flag,\n _data\n );\n\n assembly {\n revert(add(revertdata, 0x20), mload(revertdata))\n }\n }\n\n /**\n * Causes a message to revert or abort.\n * @param _flag Flag to revert with.\n */\n function _revertWithFlag(\n RevertFlag _flag\n )\n internal\n {\n _revertWithFlag(_flag, bytes(''));\n }\n\n\n /******************************************\n * Internal Functions: Nuisance Gas Logic *\n ******************************************/\n\n /**\n * Computes the nuisance gas limit from the gas limit.\n * @dev This function is currently using a naive implementation whereby the nuisance gas limit\n * is set to exactly equal the lesser of the gas limit or remaining gas. It's likely that\n * this implementation is perfectly fine, but we may change this formula later.\n * @param _gasLimit Gas limit to compute from.\n * @return _nuisanceGasLimit Computed nuisance gas limit.\n */\n function _getNuisanceGasLimit(\n uint256 _gasLimit\n )\n internal\n view\n returns (\n uint256 _nuisanceGasLimit\n )\n {\n return _gasLimit < gasleft() ? _gasLimit : gasleft();\n }\n\n /**\n * Uses a certain amount of nuisance gas.\n * @param _amount Amount of nuisance gas to use.\n */\n function _useNuisanceGas(\n uint256 _amount\n )\n internal\n {\n // Essentially the same as a standard OUT_OF_GAS, except we also retain a record of the gas\n // refund to be given at the end of the transaction.\n if (messageRecord.nuisanceGasLeft < _amount) {\n _revertWithFlag(RevertFlag.EXCEEDS_NUISANCE_GAS);\n }\n\n messageRecord.nuisanceGasLeft -= _amount;\n }\n\n\n /************************************\n * Internal Functions: Gas Metering *\n ************************************/\n\n /**\n * Checks whether a transaction needs to start a new epoch and does so if necessary.\n * @param _timestamp Transaction timestamp.\n */\n function _checkNeedsNewEpoch(\n uint256 _timestamp\n )\n internal\n {\n if (\n _timestamp >= (\n _getGasMetadata(GasMetadataKey.CURRENT_EPOCH_START_TIMESTAMP)\n + gasMeterConfig.secondsPerEpoch\n )\n ) {\n _putGasMetadata(\n GasMetadataKey.CURRENT_EPOCH_START_TIMESTAMP,\n _timestamp\n );\n\n _putGasMetadata(\n GasMetadataKey.PREV_EPOCH_SEQUENCER_QUEUE_GAS,\n _getGasMetadata(\n GasMetadataKey.CUMULATIVE_SEQUENCER_QUEUE_GAS\n )\n );\n\n _putGasMetadata(\n GasMetadataKey.PREV_EPOCH_L1TOL2_QUEUE_GAS,\n _getGasMetadata(\n GasMetadataKey.CUMULATIVE_L1TOL2_QUEUE_GAS\n )\n );\n }\n }\n\n /**\n * Validates the gas limit for a given transaction.\n * @param _gasLimit Gas limit provided by the transaction.\n * @param _queueOrigin Queue from which the transaction originated.\n * @return _valid Whether or not the gas limit is valid.\n */\n function _isValidGasLimit(\n uint256 _gasLimit,\n Lib_OVMCodec.QueueOrigin _queueOrigin\n )\n internal\n returns (\n bool _valid\n )\n {\n // Always have to be below the maximum gas limit.\n if (_gasLimit > gasMeterConfig.maxTransactionGasLimit) {\n return false;\n }\n\n // Always have to be above the minimum gas limit.\n if (_gasLimit < gasMeterConfig.minTransactionGasLimit) {\n return false;\n }\n\n // TEMPORARY: Gas metering is disabled for minnet.\n return true;\n // GasMetadataKey cumulativeGasKey;\n // GasMetadataKey prevEpochGasKey;\n // if (_queueOrigin == Lib_OVMCodec.QueueOrigin.SEQUENCER_QUEUE) {\n // cumulativeGasKey = GasMetadataKey.CUMULATIVE_SEQUENCER_QUEUE_GAS;\n // prevEpochGasKey = GasMetadataKey.PREV_EPOCH_SEQUENCER_QUEUE_GAS;\n // } else {\n // cumulativeGasKey = GasMetadataKey.CUMULATIVE_L1TOL2_QUEUE_GAS;\n // prevEpochGasKey = GasMetadataKey.PREV_EPOCH_L1TOL2_QUEUE_GAS;\n // }\n\n // return (\n // (\n // _getGasMetadata(cumulativeGasKey)\n // - _getGasMetadata(prevEpochGasKey)\n // + _gasLimit\n // ) < gasMeterConfig.maxGasPerQueuePerEpoch\n // );\n }\n\n /**\n * Updates the cumulative gas after a transaction.\n * @param _gasUsed Gas used by the transaction.\n * @param _queueOrigin Queue from which the transaction originated.\n */\n function _updateCumulativeGas(\n uint256 _gasUsed,\n Lib_OVMCodec.QueueOrigin _queueOrigin\n )\n internal\n {\n GasMetadataKey cumulativeGasKey;\n if (_queueOrigin == Lib_OVMCodec.QueueOrigin.SEQUENCER_QUEUE) {\n cumulativeGasKey = GasMetadataKey.CUMULATIVE_SEQUENCER_QUEUE_GAS;\n } else {\n cumulativeGasKey = GasMetadataKey.CUMULATIVE_L1TOL2_QUEUE_GAS;\n }\n\n _putGasMetadata(\n cumulativeGasKey,\n (\n _getGasMetadata(cumulativeGasKey)\n + gasMeterConfig.minTransactionGasLimit\n + _gasUsed\n - transactionRecord.ovmGasRefund\n )\n );\n }\n\n /**\n * Retrieves the value of a gas metadata key.\n * @param _key Gas metadata key to retrieve.\n * @return _value Value stored at the given key.\n */\n function _getGasMetadata(\n GasMetadataKey _key\n )\n internal\n returns (\n uint256 _value\n )\n {\n return uint256(_getContractStorage(\n GAS_METADATA_ADDRESS,\n bytes32(uint256(_key))\n ));\n }\n\n /**\n * Sets the value of a gas metadata key.\n * @param _key Gas metadata key to set.\n * @param _value Value to store at the given key.\n */\n function _putGasMetadata(\n GasMetadataKey _key,\n uint256 _value\n )\n internal\n {\n _putContractStorage(\n GAS_METADATA_ADDRESS,\n bytes32(uint256(_key)),\n bytes32(uint256(_value))\n );\n }\n\n\n /*****************************************\n * Internal Functions: Execution Context *\n *****************************************/\n\n /**\n * Swaps over to a new message context.\n * @param _prevMessageContext Context we're switching from.\n * @param _nextMessageContext Context we're switching to.\n */\n function _switchMessageContext(\n MessageContext memory _prevMessageContext,\n MessageContext memory _nextMessageContext\n )\n internal\n {\n // Avoid unnecessary the SSTORE.\n if (_prevMessageContext.ovmCALLER != _nextMessageContext.ovmCALLER) {\n messageContext.ovmCALLER = _nextMessageContext.ovmCALLER;\n }\n\n // Avoid unnecessary the SSTORE.\n if (_prevMessageContext.ovmADDRESS != _nextMessageContext.ovmADDRESS) {\n messageContext.ovmADDRESS = _nextMessageContext.ovmADDRESS;\n }\n\n // Avoid unnecessary the SSTORE.\n if (_prevMessageContext.isStatic != _nextMessageContext.isStatic) {\n messageContext.isStatic = _nextMessageContext.isStatic;\n }\n }\n\n /**\n * Initializes the execution context.\n * @param _transaction OVM transaction being executed.\n */\n function _initContext(\n Lib_OVMCodec.Transaction memory _transaction\n )\n internal\n {\n transactionContext.ovmTIMESTAMP = _transaction.timestamp;\n transactionContext.ovmNUMBER = _transaction.blockNumber;\n transactionContext.ovmTXGASLIMIT = _transaction.gasLimit;\n transactionContext.ovmL1QUEUEORIGIN = _transaction.l1QueueOrigin;\n transactionContext.ovmL1TXORIGIN = _transaction.l1TxOrigin;\n transactionContext.ovmGASLIMIT = gasMeterConfig.maxGasPerQueuePerEpoch;\n\n messageRecord.nuisanceGasLeft = _getNuisanceGasLimit(_transaction.gasLimit);\n }\n\n /**\n * Resets the transaction and message context.\n */\n function _resetContext()\n internal\n {\n transactionContext.ovmL1TXORIGIN = address(0);\n transactionContext.ovmTIMESTAMP = 0;\n transactionContext.ovmNUMBER = 0;\n transactionContext.ovmGASLIMIT = 0;\n transactionContext.ovmTXGASLIMIT = 0;\n transactionContext.ovmL1QUEUEORIGIN = Lib_OVMCodec.QueueOrigin.SEQUENCER_QUEUE;\n\n transactionRecord.ovmGasRefund = 0;\n\n messageContext.ovmCALLER = address(0);\n messageContext.ovmADDRESS = address(0);\n messageContext.isStatic = false;\n\n messageRecord.nuisanceGasLeft = 0;\n messageRecord.revertFlag = RevertFlag.DID_NOT_REVERT;\n }\n}\n" - }, - "contracts/optimistic-ethereum/libraries/resolver/Lib_AddressResolver.sol": { - "content": "// SPDX-License-Identifier: MIT\n// +build ovm\npragma solidity >0.5.0 <0.8.0;\n\n/* Library Imports */\nimport { Lib_AddressManager } from \"./Lib_AddressManager.sol\";\n\n/**\n * @title Lib_AddressResolver\n */\ncontract Lib_AddressResolver {\n\n /*******************************************\n * Contract Variables: Contract References *\n *******************************************/\n\n Lib_AddressManager internal libAddressManager;\n\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Lib_AddressManager.\n */\n constructor(\n address _libAddressManager\n ) public {\n libAddressManager = Lib_AddressManager(_libAddressManager);\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n function resolve(\n string memory _name\n )\n public\n view\n returns (\n address _contract\n )\n {\n return libAddressManager.getAddress(_name);\n }\n}\n" - }, - "contracts/optimistic-ethereum/libraries/utils/Lib_EthUtils.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.7.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_RLPWriter } from \"../rlp/Lib_RLPWriter.sol\";\nimport { Lib_Bytes32Utils } from \"./Lib_Bytes32Utils.sol\";\n\n/**\n * @title Lib_EthUtils\n */\nlibrary Lib_EthUtils {\n\n /***********************************\n * Internal Functions: Code Access *\n ***********************************/\n\n /**\n * Gets the code for a given address.\n * @param _address Address to get code for.\n * @param _offset Offset to start reading from.\n * @param _length Number of bytes to read.\n * @return _code Code read from the contract.\n */\n function getCode(\n address _address,\n uint256 _offset,\n uint256 _length\n )\n internal\n view\n returns (\n bytes memory _code\n )\n {\n assembly {\n _code := mload(0x40)\n mstore(0x40, add(_code, add(_length, 0x20)))\n mstore(_code, _length)\n extcodecopy(_address, add(_code, 0x20), _offset, _length)\n }\n\n return _code;\n }\n\n /**\n * Gets the full code for a given address.\n * @param _address Address to get code for.\n * @return _code Full code of the contract.\n */\n function getCode(\n address _address\n )\n internal\n view\n returns (\n bytes memory _code\n )\n {\n return getCode(\n _address,\n 0,\n getCodeSize(_address)\n );\n }\n\n /**\n * Gets the size of a contract's code in bytes.\n * @param _address Address to get code size for.\n * @return _codeSize Size of the contract's code in bytes.\n */\n function getCodeSize(\n address _address\n )\n internal\n view\n returns (\n uint256 _codeSize\n )\n {\n assembly {\n _codeSize := extcodesize(_address)\n }\n\n return _codeSize;\n }\n\n /**\n * Gets the hash of a contract's code.\n * @param _address Address to get a code hash for.\n * @return _codeHash Hash of the contract's code.\n */\n function getCodeHash(\n address _address\n )\n internal\n view\n returns (\n bytes32 _codeHash\n )\n {\n assembly {\n _codeHash := extcodehash(_address)\n }\n\n return _codeHash;\n }\n\n\n /*****************************************\n * Internal Functions: Contract Creation *\n *****************************************/\n\n /**\n * Creates a contract with some given initialization code.\n * @param _code Contract initialization code.\n * @return _created Address of the created contract.\n */\n function createContract(\n bytes memory _code\n )\n internal\n returns (\n address _created\n )\n {\n assembly {\n _created := create(\n 0,\n add(_code, 0x20),\n mload(_code)\n )\n }\n\n return _created;\n }\n\n /**\n * Computes the address that would be generated by CREATE.\n * @param _creator Address creating the contract.\n * @param _nonce Creator's nonce.\n * @return _address Address to be generated by CREATE.\n */\n function getAddressForCREATE(\n address _creator,\n uint256 _nonce\n )\n internal\n pure\n returns (\n address _address\n )\n {\n bytes[] memory encoded = new bytes[](2);\n encoded[0] = Lib_RLPWriter.writeAddress(_creator);\n encoded[1] = Lib_RLPWriter.writeUint(_nonce);\n\n bytes memory encodedList = Lib_RLPWriter.writeList(encoded);\n return Lib_Bytes32Utils.toAddress(keccak256(encodedList));\n }\n\n /**\n * Computes the address that would be generated by CREATE2.\n * @param _creator Address creating the contract.\n * @param _bytecode Bytecode of the contract to be created.\n * @param _salt 32 byte salt value mixed into the hash.\n * @return _address Address to be generated by CREATE2.\n */\n function getAddressForCREATE2(\n address _creator,\n bytes memory _bytecode,\n bytes32 _salt\n )\n internal\n pure\n returns (address _address)\n {\n bytes32 hashedData = keccak256(abi.encodePacked(\n byte(0xff),\n _creator,\n _salt,\n keccak256(_bytecode)\n ));\n\n return Lib_Bytes32Utils.toAddress(hashedData);\n }\n}\n" - }, - "contracts/optimistic-ethereum/iOVM/execution/iOVM_ExecutionManager.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\ninterface iOVM_ExecutionManager {\n /**********\n * Enums *\n *********/\n\n enum RevertFlag {\n DID_NOT_REVERT,\n OUT_OF_GAS,\n INTENTIONAL_REVERT,\n EXCEEDS_NUISANCE_GAS,\n INVALID_STATE_ACCESS,\n UNSAFE_BYTECODE,\n CREATE_COLLISION,\n STATIC_VIOLATION,\n CREATE_EXCEPTION,\n CREATOR_NOT_ALLOWED\n }\n\n enum GasMetadataKey {\n CURRENT_EPOCH_START_TIMESTAMP,\n CUMULATIVE_SEQUENCER_QUEUE_GAS,\n CUMULATIVE_L1TOL2_QUEUE_GAS,\n PREV_EPOCH_SEQUENCER_QUEUE_GAS,\n PREV_EPOCH_L1TOL2_QUEUE_GAS\n }\n\n /***********\n * Structs *\n ***********/\n\n struct GasMeterConfig {\n uint256 minTransactionGasLimit;\n uint256 maxTransactionGasLimit;\n uint256 maxGasPerQueuePerEpoch;\n uint256 secondsPerEpoch;\n }\n\n struct GlobalContext {\n uint256 ovmCHAINID;\n }\n\n struct TransactionContext {\n Lib_OVMCodec.QueueOrigin ovmL1QUEUEORIGIN;\n uint256 ovmTIMESTAMP;\n uint256 ovmNUMBER;\n uint256 ovmGASLIMIT;\n uint256 ovmTXGASLIMIT;\n address ovmL1TXORIGIN;\n }\n\n struct TransactionRecord {\n uint256 ovmGasRefund;\n }\n\n struct MessageContext {\n address ovmCALLER;\n address ovmADDRESS;\n bool isStatic;\n }\n\n struct MessageRecord {\n uint256 nuisanceGasLeft;\n RevertFlag revertFlag;\n }\n\n\n /************************************\n * Transaction Execution Entrypoint *\n ************************************/\n\n function run(\n Lib_OVMCodec.Transaction calldata _transaction,\n address _txStateManager\n ) external;\n\n\n /*******************\n * Context Opcodes *\n *******************/\n\n function ovmCALLER() external view returns (address _caller);\n function ovmADDRESS() external view returns (address _address);\n function ovmTIMESTAMP() external view returns (uint256 _timestamp);\n function ovmNUMBER() external view returns (uint256 _number);\n function ovmGASLIMIT() external view returns (uint256 _gasLimit);\n function ovmCHAINID() external view returns (uint256 _chainId);\n\n\n /**********************\n * L2 Context Opcodes *\n **********************/\n\n function ovmL1QUEUEORIGIN() external view returns (Lib_OVMCodec.QueueOrigin _queueOrigin);\n function ovmL1TXORIGIN() external view returns (address _l1TxOrigin);\n\n\n /*******************\n * Halting Opcodes *\n *******************/\n\n function ovmREVERT(bytes memory _data) external;\n\n\n /*****************************\n * Contract Creation Opcodes *\n *****************************/\n\n function ovmCREATE(bytes memory _bytecode) external returns (address _contract);\n function ovmCREATE2(bytes memory _bytecode, bytes32 _salt) external returns (address _contract);\n\n\n /*******************************\n * Account Abstraction Opcodes *\n ******************************/\n\n function ovmGETNONCE() external returns (uint256 _nonce);\n function ovmSETNONCE(uint256 _nonce) external;\n function ovmCREATEEOA(bytes32 _messageHash, uint8 _v, bytes32 _r, bytes32 _s) external;\n\n\n /****************************\n * Contract Calling Opcodes *\n ****************************/\n\n function ovmCALL(uint256 _gasLimit, address _address, bytes memory _calldata) external returns (bool _success, bytes memory _returndata);\n function ovmSTATICCALL(uint256 _gasLimit, address _address, bytes memory _calldata) external returns (bool _success, bytes memory _returndata);\n function ovmDELEGATECALL(uint256 _gasLimit, address _address, bytes memory _calldata) external returns (bool _success, bytes memory _returndata);\n\n\n /****************************\n * Contract Storage Opcodes *\n ****************************/\n\n function ovmSLOAD(bytes32 _key) external returns (bytes32 _value);\n function ovmSSTORE(bytes32 _key, bytes32 _value) external;\n\n\n /*************************\n * Contract Code Opcodes *\n *************************/\n\n function ovmEXTCODECOPY(address _contract, uint256 _offset, uint256 _length) external returns (bytes memory _code);\n function ovmEXTCODESIZE(address _contract) external returns (uint256 _size);\n function ovmEXTCODEHASH(address _contract) external returns (bytes32 _hash);\n\n\n /**************************************\n * Public Functions: Execution Safety *\n **************************************/\n\n function safeCREATE(address _address, bytes memory _bytecode) external;\n\n /***************************************\n * Public Functions: Execution Context *\n ***************************************/\n\n function getMaxTransactionGasLimit() external view returns (uint _maxTransactionGasLimit);\n}\n" - }, - "contracts/optimistic-ethereum/iOVM/execution/iOVM_StateManager.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/**\n * @title iOVM_StateManager\n */\ninterface iOVM_StateManager {\n\n /*******************\n * Data Structures *\n *******************/\n\n enum ItemState {\n ITEM_UNTOUCHED,\n ITEM_LOADED,\n ITEM_CHANGED,\n ITEM_COMMITTED\n }\n\n /***************************\n * Public Functions: Misc *\n ***************************/\n\n function isAuthenticated(address _address) external view returns (bool);\n\n /***************************\n * Public Functions: Setup *\n ***************************/\n\n function owner() external view returns (address _owner);\n function ovmExecutionManager() external view returns (address _ovmExecutionManager);\n function setExecutionManager(address _ovmExecutionManager) external;\n\n\n /************************************\n * Public Functions: Account Access *\n ************************************/\n\n function putAccount(address _address, Lib_OVMCodec.Account memory _account) external;\n function putEmptyAccount(address _address) external;\n function getAccount(address _address) external view returns (Lib_OVMCodec.Account memory _account);\n function hasAccount(address _address) external view returns (bool _exists);\n function hasEmptyAccount(address _address) external view returns (bool _exists);\n function setAccountNonce(address _address, uint256 _nonce) external;\n function getAccountNonce(address _address) external view returns (uint256 _nonce);\n function getAccountEthAddress(address _address) external view returns (address _ethAddress);\n function getAccountStorageRoot(address _address) external view returns (bytes32 _storageRoot);\n function initPendingAccount(address _address) external;\n function commitPendingAccount(address _address, address _ethAddress, bytes32 _codeHash) external;\n function testAndSetAccountLoaded(address _address) external returns (bool _wasAccountAlreadyLoaded);\n function testAndSetAccountChanged(address _address) external returns (bool _wasAccountAlreadyChanged);\n function commitAccount(address _address) external returns (bool _wasAccountCommitted);\n function incrementTotalUncommittedAccounts() external;\n function getTotalUncommittedAccounts() external view returns (uint256 _total);\n function wasAccountChanged(address _address) external view returns (bool);\n function wasAccountCommitted(address _address) external view returns (bool);\n\n\n /************************************\n * Public Functions: Storage Access *\n ************************************/\n\n function putContractStorage(address _contract, bytes32 _key, bytes32 _value) external;\n function getContractStorage(address _contract, bytes32 _key) external view returns (bytes32 _value);\n function hasContractStorage(address _contract, bytes32 _key) external returns (bool _exists);\n function testAndSetContractStorageLoaded(address _contract, bytes32 _key) external returns (bool _wasContractStorageAlreadyLoaded);\n function testAndSetContractStorageChanged(address _contract, bytes32 _key) external returns (bool _wasContractStorageAlreadyChanged);\n function commitContractStorage(address _contract, bytes32 _key) external returns (bool _wasContractStorageCommitted);\n function incrementTotalUncommittedContractStorage() external;\n function getTotalUncommittedContractStorage() external view returns (uint256 _total);\n function wasContractStorageChanged(address _contract, bytes32 _key) external view returns (bool);\n function wasContractStorageCommitted(address _contract, bytes32 _key) external view returns (bool);\n}\n" - }, - "contracts/optimistic-ethereum/iOVM/execution/iOVM_SafetyChecker.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/**\n * @title iOVM_SafetyChecker\n */\ninterface iOVM_SafetyChecker {\n\n /********************\n * Public Functions *\n ********************/\n\n function isBytecodeSafe(bytes calldata _bytecode) external view returns (bool);\n}\n" - }, - "contracts/optimistic-ethereum/OVM/accounts/OVM_ProxyEOA.sol": { - "content": "pragma solidity ^0.7.0;\n\n/* Library Imports */\nimport { Lib_BytesUtils } from \"../../libraries/utils/Lib_BytesUtils.sol\";\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_ECDSAUtils } from \"../../libraries/utils/Lib_ECDSAUtils.sol\";\nimport { Lib_SafeExecutionManagerWrapper } from \"../../libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\";\n\n/**\n * @title OVM_ProxyEOA\n */\ncontract OVM_ProxyEOA {\n\n bytes32 constant IMPLEMENTATION_KEY = 0xdeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddead;\n\n /***************\n * Constructor *\n ***************/\n\n constructor(\n address _implementation\n ) {\n _setImplementation(_implementation);\n }\n\n\n /*********************\n * Fallback Function *\n *********************/\n\n fallback()\n external\n {\n (bool success, bytes memory returndata) = Lib_SafeExecutionManagerWrapper.safeDELEGATECALL(\n gasleft(),\n getImplementation(),\n msg.data\n );\n\n if (success) {\n assembly {\n return(add(returndata, 0x20), mload(returndata))\n }\n } else {\n Lib_SafeExecutionManagerWrapper.safeREVERT(\n string(returndata)\n );\n }\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n function upgrade(\n address _implementation\n )\n external\n {\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(\n Lib_SafeExecutionManagerWrapper.safeADDRESS() == Lib_SafeExecutionManagerWrapper.safeCALLER(),\n \"EOAs can only upgrade their own EOA implementation\"\n );\n\n _setImplementation(_implementation);\n }\n\n function getImplementation()\n public\n returns (\n address _implementation\n )\n {\n return address(uint160(uint256(\n Lib_SafeExecutionManagerWrapper.safeSLOAD(\n IMPLEMENTATION_KEY\n )\n )));\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n function _setImplementation(\n address _implementation\n )\n internal\n {\n Lib_SafeExecutionManagerWrapper.safeSSTORE(\n IMPLEMENTATION_KEY,\n bytes32(uint256(uint160(_implementation)))\n );\n }\n}" - }, - "contracts/optimistic-ethereum/OVM/precompiles/OVM_DeployerWhitelist.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.7.0;\n\n/* Library Imports */\nimport { Lib_Bytes32Utils } from \"../../libraries/utils/Lib_Bytes32Utils.sol\";\n\n/* Interface Imports */\nimport { iOVM_DeployerWhitelist } from \"../../iOVM/precompiles/iOVM_DeployerWhitelist.sol\";\nimport { Lib_SafeExecutionManagerWrapper } from \"../../libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\";\n\n/**\n * @title OVM_DeployerWhitelist\n * @dev L2 CONTRACT (NOT COMPILED)\n */\ncontract OVM_DeployerWhitelist is iOVM_DeployerWhitelist {\n\n /**********************\n * Contract Constants *\n **********************/\n\n bytes32 internal constant KEY_INITIALIZED = 0x0000000000000000000000000000000000000000000000000000000000000010;\n bytes32 internal constant KEY_OWNER = 0x0000000000000000000000000000000000000000000000000000000000000011;\n bytes32 internal constant KEY_ALLOW_ARBITRARY_DEPLOYMENT = 0x0000000000000000000000000000000000000000000000000000000000000012;\n\n\n /**********************\n * Function Modifiers *\n **********************/\n \n /**\n * Blocks functions to anyone except the contract owner.\n */\n modifier onlyOwner() {\n address owner = Lib_Bytes32Utils.toAddress(\n Lib_SafeExecutionManagerWrapper.safeSLOAD(\n KEY_OWNER\n )\n );\n\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(\n Lib_SafeExecutionManagerWrapper.safeCALLER() == owner,\n \"Function can only be called by the owner of this contract.\"\n );\n _;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n \n /**\n * Initializes the whitelist.\n * @param _owner Address of the owner for this contract.\n * @param _allowArbitraryDeployment Whether or not to allow arbitrary contract deployment.\n */\n function initialize(\n address _owner,\n bool _allowArbitraryDeployment\n )\n override\n public\n {\n bool initialized = Lib_Bytes32Utils.toBool(\n Lib_SafeExecutionManagerWrapper.safeSLOAD(KEY_INITIALIZED)\n );\n\n if (initialized == true) {\n return;\n }\n\n Lib_SafeExecutionManagerWrapper.safeSSTORE(\n KEY_INITIALIZED,\n Lib_Bytes32Utils.fromBool(true)\n );\n Lib_SafeExecutionManagerWrapper.safeSSTORE(\n KEY_OWNER,\n Lib_Bytes32Utils.fromAddress(_owner)\n );\n Lib_SafeExecutionManagerWrapper.safeSSTORE(\n KEY_ALLOW_ARBITRARY_DEPLOYMENT,\n Lib_Bytes32Utils.fromBool(_allowArbitraryDeployment)\n );\n }\n\n /**\n * Gets the owner of the whitelist.\n */\n function getOwner()\n override\n public\n returns(\n address\n )\n {\n return Lib_Bytes32Utils.toAddress(\n Lib_SafeExecutionManagerWrapper.safeSLOAD(\n KEY_OWNER\n )\n );\n }\n\n /**\n * Adds or removes an address from the deployment whitelist.\n * @param _deployer Address to update permissions for.\n * @param _isWhitelisted Whether or not the address is whitelisted.\n */\n function setWhitelistedDeployer(\n address _deployer,\n bool _isWhitelisted\n )\n override\n public\n onlyOwner\n {\n Lib_SafeExecutionManagerWrapper.safeSSTORE(\n Lib_Bytes32Utils.fromAddress(_deployer),\n Lib_Bytes32Utils.fromBool(_isWhitelisted)\n );\n }\n\n /**\n * Updates the owner of this contract.\n * @param _owner Address of the new owner.\n */\n function setOwner(\n address _owner\n )\n override\n public\n onlyOwner\n {\n Lib_SafeExecutionManagerWrapper.safeSSTORE(\n KEY_OWNER,\n Lib_Bytes32Utils.fromAddress(_owner)\n );\n }\n\n /**\n * Updates the arbitrary deployment flag.\n * @param _allowArbitraryDeployment Whether or not to allow arbitrary contract deployment.\n */\n function setAllowArbitraryDeployment(\n bool _allowArbitraryDeployment\n )\n override\n public\n onlyOwner\n {\n Lib_SafeExecutionManagerWrapper.safeSSTORE(\n KEY_ALLOW_ARBITRARY_DEPLOYMENT,\n Lib_Bytes32Utils.fromBool(_allowArbitraryDeployment)\n );\n }\n\n /**\n * Permanently enables arbitrary contract deployment and deletes the owner.\n */\n function enableArbitraryContractDeployment()\n override\n public\n onlyOwner\n {\n setAllowArbitraryDeployment(true);\n setOwner(address(0));\n }\n\n /**\n * Checks whether an address is allowed to deploy contracts.\n * @param _deployer Address to check.\n * @return _allowed Whether or not the address can deploy contracts.\n */\n function isDeployerAllowed(\n address _deployer\n )\n override\n public\n returns (\n bool _allowed\n )\n {\n bool initialized = Lib_Bytes32Utils.toBool(\n Lib_SafeExecutionManagerWrapper.safeSLOAD(KEY_INITIALIZED)\n );\n\n if (initialized == false) {\n return true;\n }\n\n bool allowArbitraryDeployment = Lib_Bytes32Utils.toBool(\n Lib_SafeExecutionManagerWrapper.safeSLOAD(KEY_ALLOW_ARBITRARY_DEPLOYMENT)\n );\n\n if (allowArbitraryDeployment == true) {\n return true;\n }\n\n bool isWhitelisted = Lib_Bytes32Utils.toBool(\n Lib_SafeExecutionManagerWrapper.safeSLOAD(\n Lib_Bytes32Utils.fromAddress(_deployer)\n )\n );\n\n return isWhitelisted; \n }\n}\n" - }, - "contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol": { - "content": "// SPDX-License-Identifier: MIT\n// +build ovm\npragma solidity >0.5.0 <0.8.0;\n\n/* Contract Imports */\nimport { Ownable } from \"./Lib_Ownable.sol\";\n\n/**\n * @title Lib_AddressManager\n */\ncontract Lib_AddressManager is Ownable {\n\n /**********\n * Events *\n **********/\n\n event AddressSet(\n string _name,\n address _newAddress\n );\n\n /*******************************************\n * Contract Variables: Internal Accounting *\n *******************************************/\n\n mapping (bytes32 => address) private addresses;\n\n\n /********************\n * Public Functions *\n ********************/\n\n function setAddress(\n string memory _name,\n address _address\n )\n public\n onlyOwner\n {\n emit AddressSet(_name, _address);\n addresses[_getNameHash(_name)] = _address;\n }\n\n function getAddress(\n string memory _name\n )\n public\n view\n returns (address)\n {\n return addresses[_getNameHash(_name)];\n }\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n function _getNameHash(\n string memory _name\n )\n internal\n pure\n returns (\n bytes32 _hash\n )\n {\n return keccak256(abi.encodePacked(_name));\n }\n}\n" - }, - "contracts/optimistic-ethereum/libraries/resolver/Lib_Ownable.sol": { - "content": "// SPDX-License-Identifier: MIT\n// +build ovm\npragma solidity >0.5.0 <0.8.0;\n\n/**\n * @title Ownable\n * @dev Adapted from https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol\n */\nabstract contract Ownable {\n\n /*************\n * Variables *\n *************/\n\n address public owner;\n\n\n /**********\n * Events *\n **********/\n\n event OwnershipTransferred(\n address indexed previousOwner,\n address indexed newOwner\n );\n\n\n /***************\n * Constructor *\n ***************/\n\n constructor() internal {\n owner = msg.sender;\n emit OwnershipTransferred(address(0), owner);\n }\n\n\n /**********************\n * Function Modifiers *\n **********************/\n\n modifier onlyOwner() {\n require(\n owner == msg.sender,\n \"Ownable: caller is not the owner\"\n );\n _;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n function renounceOwnership()\n public\n virtual\n onlyOwner\n {\n emit OwnershipTransferred(owner, address(0));\n owner = address(0);\n }\n\n function transferOwnership(address _newOwner)\n public\n virtual\n onlyOwner\n {\n require(\n _newOwner != address(0),\n \"Ownable: new owner cannot be the zero address\"\n );\n\n emit OwnershipTransferred(owner, _newOwner);\n owner = _newOwner;\n }\n}\n" - }, - "contracts/optimistic-ethereum/iOVM/precompiles/iOVM_DeployerWhitelist.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/**\n * @title iOVM_DeployerWhitelist\n */\ninterface iOVM_DeployerWhitelist {\n\n /********************\n * Public Functions *\n ********************/\n\n function initialize(address _owner, bool _allowArbitraryDeployment) external;\n function getOwner() external returns (address _owner);\n function setWhitelistedDeployer(address _deployer, bool _isWhitelisted) external;\n function setOwner(address _newOwner) external;\n function setAllowArbitraryDeployment(bool _allowArbitraryDeployment) external;\n function enableArbitraryContractDeployment() external;\n function isDeployerAllowed(address _deployer) external returns (bool _allowed);\n}\n" - }, - "contracts/optimistic-ethereum/OVM/precompiles/OVM_SequencerEntrypoint.sol": { - "content": "pragma solidity ^0.7.0;\n\n/* Library Imports */\nimport { Lib_BytesUtils } from \"../../libraries/utils/Lib_BytesUtils.sol\";\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_ECDSAUtils } from \"../../libraries/utils/Lib_ECDSAUtils.sol\";\nimport { Lib_SafeExecutionManagerWrapper } from \"../../libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\";\n\n/**\n * @title OVM_SequencerEntrypoint\n */\ncontract OVM_SequencerEntrypoint {\n\n /*********\n * Enums *\n *********/\n \n enum TransactionType {\n NATIVE_ETH_TRANSACTION,\n ETH_SIGNED_MESSAGE\n }\n\n\n /*********************\n * Fallback Function *\n *********************/\n\n /**\n * Uses a custom \"compressed\" format to save on calldata gas:\n * calldata[00:01]: transaction type (0 == EIP 155, 2 == Eth Sign Message)\n * calldata[01:33]: signature \"r\" parameter\n * calldata[33:65]: signature \"s\" parameter\n * calldata[66:69]: transaction gas limit\n * calldata[69:72]: transaction gas price\n * calldata[72:75]: transaction nonce\n * calldata[75:95]: transaction target address\n * calldata[95:XX]: transaction data\n */\n fallback()\n external\n {\n TransactionType transactionType = _getTransactionType(Lib_BytesUtils.toUint8(msg.data, 0));\n\n bytes32 r = Lib_BytesUtils.toBytes32(Lib_BytesUtils.slice(msg.data, 1, 32));\n bytes32 s = Lib_BytesUtils.toBytes32(Lib_BytesUtils.slice(msg.data, 33, 32));\n uint8 v = Lib_BytesUtils.toUint8(msg.data, 65);\n\n // Remainder is the transaction to execute.\n bytes memory compressedTx = Lib_BytesUtils.slice(msg.data, 66);\n bool isEthSignedMessage = transactionType == TransactionType.ETH_SIGNED_MESSAGE;\n\n // Need to decompress and then re-encode the transaction based on the original encoding.\n bytes memory encodedTx = Lib_OVMCodec.encodeEIP155Transaction(\n Lib_OVMCodec.decompressEIP155Transaction(compressedTx),\n isEthSignedMessage\n );\n\n address target = Lib_ECDSAUtils.recover(\n encodedTx,\n isEthSignedMessage,\n uint8(v),\n r,\n s\n );\n\n if (Lib_SafeExecutionManagerWrapper.safeEXTCODESIZE(target) == 0) {\n // ProxyEOA has not yet been deployed for this EOA.\n bytes32 messageHash = Lib_ECDSAUtils.getMessageHash(encodedTx, isEthSignedMessage);\n Lib_SafeExecutionManagerWrapper.safeCREATEEOA(messageHash, uint8(v), r, s);\n }\n\n // ProxyEOA has been deployed for this EOA, continue to CALL.\n bytes memory callbytes = abi.encodeWithSignature(\n \"execute(bytes,uint8,uint8,bytes32,bytes32)\",\n encodedTx,\n isEthSignedMessage,\n uint8(v),\n r,\n s\n );\n\n Lib_SafeExecutionManagerWrapper.safeCALL(\n gasleft(),\n target,\n callbytes\n );\n }\n \n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Converts a uint256 into a TransactionType enum.\n * @param _transactionType Transaction type index.\n * @return Transaction type enum value.\n */\n function _getTransactionType(\n uint8 _transactionType\n )\n internal\n returns (\n TransactionType\n )\n {\n if (_transactionType == 0) {\n return TransactionType.NATIVE_ETH_TRANSACTION;\n } if (_transactionType == 2) {\n return TransactionType.ETH_SIGNED_MESSAGE;\n } else {\n Lib_SafeExecutionManagerWrapper.safeREVERT(\n \"Transaction type must be 0 or 2\"\n );\n }\n }\n}\n" - }, - "contracts/test-libraries/utils/TestLib_ECDSAUtils.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.7.0;\n\n/* Library Imports */\nimport { Lib_ECDSAUtils } from \"../../optimistic-ethereum/libraries/utils/Lib_ECDSAUtils.sol\";\n\n/**\n * @title TestLib_ECDSAUtils\n */\ncontract TestLib_ECDSAUtils {\n\n function recover(\n bytes memory _message,\n bool _isEthSignedMessage,\n uint8 _v,\n bytes32 _r,\n bytes32 _s\n )\n public\n pure\n returns (\n address _sender\n )\n {\n return Lib_ECDSAUtils.recover(\n _message,\n _isEthSignedMessage,\n _v,\n _r,\n _s\n );\n }\n}\n" - }, - "contracts/test-libraries/codec/TestLib_OVMCodec.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.7.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../optimistic-ethereum/libraries/codec/Lib_OVMCodec.sol\";\n\n/**\n * @title TestLib_OVMCodec\n */\ncontract TestLib_OVMCodec {\n\n function decodeEIP155Transaction(\n bytes memory _transaction,\n bool _isEthSignedMessage\n )\n public\n pure\n returns (\n Lib_OVMCodec.EIP155Transaction memory _decoded\n )\n {\n return Lib_OVMCodec.decodeEIP155Transaction(_transaction, _isEthSignedMessage);\n }\n\n function encodeTransaction(\n Lib_OVMCodec.Transaction memory _transaction\n )\n public\n pure\n returns (\n bytes memory _encoded\n )\n {\n return Lib_OVMCodec.encodeTransaction(_transaction);\n }\n\n function hashTransaction(\n Lib_OVMCodec.Transaction memory _transaction\n )\n public\n pure\n returns (\n bytes32 _hash\n )\n {\n return Lib_OVMCodec.hashTransaction(_transaction);\n }\n\n function decompressEIP155Transaction(\n bytes memory _transaction\n )\n public\n returns (\n Lib_OVMCodec.EIP155Transaction memory _decompressed\n )\n {\n return Lib_OVMCodec.decompressEIP155Transaction(_transaction);\n }\n}\n" - }, - "contracts/optimistic-ethereum/OVM/verification/OVM_StateTransitioner.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.7.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\nimport { Lib_EthUtils } from \"../../libraries/utils/Lib_EthUtils.sol\";\nimport { Lib_Bytes32Utils } from \"../../libraries/utils/Lib_Bytes32Utils.sol\";\nimport { Lib_BytesUtils } from \"../../libraries/utils/Lib_BytesUtils.sol\";\nimport { Lib_SecureMerkleTrie } from \"../../libraries/trie/Lib_SecureMerkleTrie.sol\";\nimport { Lib_RLPWriter } from \"../../libraries/rlp/Lib_RLPWriter.sol\";\nimport { Lib_RLPReader } from \"../../libraries/rlp/Lib_RLPReader.sol\";\n\n/* Interface Imports */\nimport { iOVM_StateTransitioner } from \"../../iOVM/verification/iOVM_StateTransitioner.sol\";\nimport { iOVM_BondManager } from \"../../iOVM/verification/iOVM_BondManager.sol\";\nimport { iOVM_ExecutionManager } from \"../../iOVM/execution/iOVM_ExecutionManager.sol\";\nimport { iOVM_StateManager } from \"../../iOVM/execution/iOVM_StateManager.sol\";\nimport { iOVM_StateManagerFactory } from \"../../iOVM/execution/iOVM_StateManagerFactory.sol\";\n\n/* Contract Imports */\nimport { OVM_FraudContributor } from \"./OVM_FraudContributor.sol\";\n\n/**\n * @title OVM_StateTransitioner\n */\ncontract OVM_StateTransitioner is Lib_AddressResolver, OVM_FraudContributor, iOVM_StateTransitioner {\n\n /*******************\n * Data Structures *\n *******************/\n\n enum TransitionPhase {\n PRE_EXECUTION,\n POST_EXECUTION,\n COMPLETE\n }\n\n\n /*******************************************\n * Contract Variables: Contract References *\n *******************************************/\n\n iOVM_StateManager public ovmStateManager;\n\n\n /*******************************************\n * Contract Variables: Internal Accounting *\n *******************************************/\n\n bytes32 internal preStateRoot;\n bytes32 internal postStateRoot;\n TransitionPhase public phase;\n uint256 internal stateTransitionIndex;\n bytes32 internal transactionHash;\n\n\n /*************\n * Constants *\n *************/\n\n bytes32 internal constant EMPTY_ACCOUNT_CODE_HASH = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;\n bytes32 internal constant EMPTY_ACCOUNT_STORAGE_ROOT = 0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421;\n\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n * @param _stateTransitionIndex Index of the state transition being verified.\n * @param _preStateRoot State root before the transition was executed.\n * @param _transactionHash Hash of the executed transaction.\n */\n constructor(\n address _libAddressManager,\n uint256 _stateTransitionIndex,\n bytes32 _preStateRoot,\n bytes32 _transactionHash\n )\n Lib_AddressResolver(_libAddressManager)\n {\n stateTransitionIndex = _stateTransitionIndex;\n preStateRoot = _preStateRoot;\n postStateRoot = _preStateRoot;\n transactionHash = _transactionHash;\n\n ovmStateManager = iOVM_StateManagerFactory(resolve(\"OVM_StateManagerFactory\")).create(address(this));\n }\n\n\n /**********************\n * Function Modifiers *\n **********************/\n\n /**\n * Checks that a function is only run during a specific phase.\n * @param _phase Phase the function must run within.\n */\n modifier onlyDuringPhase(\n TransitionPhase _phase\n ) {\n require(\n phase == _phase,\n \"Function must be called during the correct phase.\"\n );\n _;\n }\n\n\n /**********************************\n * Public Functions: State Access *\n **********************************/\n\n /**\n * Retrieves the state root before execution.\n * @return _preStateRoot State root before execution.\n */\n function getPreStateRoot()\n override\n public\n view\n returns (\n bytes32 _preStateRoot\n )\n {\n return preStateRoot;\n }\n\n /**\n * Retrieves the state root after execution.\n * @return _postStateRoot State root after execution.\n */\n function getPostStateRoot()\n override\n public\n view\n returns (\n bytes32 _postStateRoot\n )\n {\n return postStateRoot;\n }\n\n /**\n * Checks whether the transitioner is complete.\n * @return _complete Whether or not the transition process is finished.\n */\n function isComplete()\n override\n public\n view\n returns (\n bool _complete\n )\n {\n return phase == TransitionPhase.COMPLETE;\n }\n \n\n /***********************************\n * Public Functions: Pre-Execution *\n ***********************************/\n\n /**\n * Allows a user to prove the initial state of a contract.\n * @param _ovmContractAddress Address of the contract on the OVM.\n * @param _ethContractAddress Address of the corresponding contract on L1.\n * @param _stateTrieWitness Proof of the account state.\n */\n function proveContractState(\n address _ovmContractAddress,\n address _ethContractAddress,\n bytes memory _stateTrieWitness\n )\n override\n public\n onlyDuringPhase(TransitionPhase.PRE_EXECUTION)\n contributesToFraudProof(preStateRoot, transactionHash)\n {\n // Exit quickly to avoid unnecessary work.\n require(\n (\n ovmStateManager.hasAccount(_ovmContractAddress) == false\n && ovmStateManager.hasEmptyAccount(_ovmContractAddress) == false\n ),\n \"Account state has already been proven.\"\n );\n\n // Function will fail if the proof is not a valid inclusion or exclusion proof.\n (\n bool exists,\n bytes memory encodedAccount\n ) = Lib_SecureMerkleTrie.get(\n abi.encodePacked(_ovmContractAddress),\n _stateTrieWitness,\n preStateRoot\n );\n\n if (exists == true) {\n // Account exists, this was an inclusion proof.\n Lib_OVMCodec.EVMAccount memory account = Lib_OVMCodec.decodeEVMAccount(\n encodedAccount\n );\n\n address ethContractAddress = _ethContractAddress;\n if (account.codeHash == EMPTY_ACCOUNT_CODE_HASH) {\n // Use a known empty contract to prevent an attack in which a user provides a\n // contract address here and then later deploys code to it.\n ethContractAddress = 0x0000000000000000000000000000000000000000;\n } else {\n // Otherwise, make sure that the code at the provided eth address matches the hash\n // of the code stored on L2.\n require(\n Lib_EthUtils.getCodeHash(ethContractAddress) == account.codeHash,\n \"OVM_StateTransitioner: Provided L1 contract code hash does not match L2 contract code hash.\"\n );\n }\n\n ovmStateManager.putAccount(\n _ovmContractAddress,\n Lib_OVMCodec.Account({\n nonce: account.nonce,\n balance: account.balance,\n storageRoot: account.storageRoot,\n codeHash: account.codeHash,\n ethAddress: ethContractAddress,\n isFresh: false\n })\n );\n } else {\n // Account does not exist, this was an exclusion proof.\n ovmStateManager.putEmptyAccount(_ovmContractAddress);\n }\n }\n\n /**\n * Allows a user to prove the initial state of a contract storage slot.\n * @param _ovmContractAddress Address of the contract on the OVM.\n * @param _key Claimed account slot key.\n * @param _storageTrieWitness Proof of the storage slot.\n */\n function proveStorageSlot(\n address _ovmContractAddress,\n bytes32 _key,\n bytes memory _storageTrieWitness\n )\n override\n public\n onlyDuringPhase(TransitionPhase.PRE_EXECUTION)\n contributesToFraudProof(preStateRoot, transactionHash)\n {\n // Exit quickly to avoid unnecessary work.\n require(\n ovmStateManager.hasContractStorage(_ovmContractAddress, _key) == false,\n \"Storage slot has already been proven.\"\n );\n\n require(\n ovmStateManager.hasAccount(_ovmContractAddress) == true,\n \"Contract must be verified before proving a storage slot.\"\n );\n\n bytes32 storageRoot = ovmStateManager.getAccountStorageRoot(_ovmContractAddress);\n bytes32 value;\n\n if (storageRoot == EMPTY_ACCOUNT_STORAGE_ROOT) {\n // Storage trie was empty, so the user is always allowed to insert zero-byte values.\n value = bytes32(0);\n } else {\n // Function will fail if the proof is not a valid inclusion or exclusion proof.\n (\n bool exists,\n bytes memory encodedValue\n ) = Lib_SecureMerkleTrie.get(\n abi.encodePacked(_key),\n _storageTrieWitness,\n storageRoot\n );\n\n if (exists == true) {\n // Inclusion proof.\n // Stored values are RLP encoded, with leading zeros removed.\n value = Lib_BytesUtils.toBytes32PadLeft(\n Lib_RLPReader.readBytes(encodedValue)\n );\n } else {\n // Exclusion proof, can only be zero bytes.\n value = bytes32(0);\n }\n }\n\n ovmStateManager.putContractStorage(\n _ovmContractAddress,\n _key,\n value\n );\n }\n\n\n /*******************************\n * Public Functions: Execution *\n *******************************/\n\n /**\n * Executes the state transition.\n * @param _transaction OVM transaction to execute.\n */\n function applyTransaction(\n Lib_OVMCodec.Transaction memory _transaction\n )\n override\n public\n onlyDuringPhase(TransitionPhase.PRE_EXECUTION)\n contributesToFraudProof(preStateRoot, transactionHash)\n {\n require(\n Lib_OVMCodec.hashTransaction(_transaction) == transactionHash,\n \"Invalid transaction provided.\"\n );\n\n // We require gas to complete the logic here in run() before/after execution,\n // But must ensure the full _tx.gasLimit can be given to the ovmCALL (determinism)\n // This includes 1/64 of the gas getting lost because of EIP-150 (lost twice--first \n // going into EM, then going into the code contract).\n require(\n gasleft() >= 100000 + _transaction.gasLimit * 1032 / 1000, // 1032/1000 = 1.032 = (64/63)^2 rounded up\n \"Not enough gas to execute transaction deterministically.\"\n );\n\n iOVM_ExecutionManager ovmExecutionManager = iOVM_ExecutionManager(resolve(\"OVM_ExecutionManager\"));\n\n // We call `setExecutionManager` right before `run` (and not earlier) just in case the\n // OVM_ExecutionManager address was updated between the time when this contract was created\n // and when `applyTransaction` was called.\n ovmStateManager.setExecutionManager(address(ovmExecutionManager));\n\n // `run` always succeeds *unless* the user hasn't provided enough gas to `applyTransaction`\n // or an INVALID_STATE_ACCESS flag was triggered. Either way, we won't get beyond this line\n // if that's the case.\n ovmExecutionManager.run(_transaction, address(ovmStateManager));\n\n phase = TransitionPhase.POST_EXECUTION;\n }\n\n\n /************************************\n * Public Functions: Post-Execution *\n ************************************/\n\n /**\n * Allows a user to commit the final state of a contract.\n * @param _ovmContractAddress Address of the contract on the OVM.\n * @param _stateTrieWitness Proof of the account state.\n */\n function commitContractState(\n address _ovmContractAddress,\n bytes memory _stateTrieWitness\n )\n override\n public\n onlyDuringPhase(TransitionPhase.POST_EXECUTION)\n contributesToFraudProof(preStateRoot, transactionHash)\n {\n require(\n ovmStateManager.getTotalUncommittedContractStorage() == 0,\n \"All storage must be committed before committing account states.\"\n );\n\n require (\n ovmStateManager.commitAccount(_ovmContractAddress) == true,\n \"Account state wasn't changed or has already been committed.\"\n );\n\n Lib_OVMCodec.Account memory account = ovmStateManager.getAccount(_ovmContractAddress);\n\n postStateRoot = Lib_SecureMerkleTrie.update(\n abi.encodePacked(_ovmContractAddress),\n Lib_OVMCodec.encodeEVMAccount(\n Lib_OVMCodec.toEVMAccount(account)\n ),\n _stateTrieWitness,\n postStateRoot\n );\n\n // Emit an event to help clients figure out the proof ordering.\n emit AccountCommitted(\n _ovmContractAddress\n );\n }\n\n /**\n * Allows a user to commit the final state of a contract storage slot.\n * @param _ovmContractAddress Address of the contract on the OVM.\n * @param _key Claimed account slot key.\n * @param _storageTrieWitness Proof of the storage slot.\n */\n function commitStorageSlot(\n address _ovmContractAddress,\n bytes32 _key,\n bytes memory _storageTrieWitness\n )\n override\n public\n onlyDuringPhase(TransitionPhase.POST_EXECUTION)\n contributesToFraudProof(preStateRoot, transactionHash)\n {\n require(\n ovmStateManager.commitContractStorage(_ovmContractAddress, _key) == true,\n \"Storage slot value wasn't changed or has already been committed.\"\n );\n\n Lib_OVMCodec.Account memory account = ovmStateManager.getAccount(_ovmContractAddress);\n bytes32 value = ovmStateManager.getContractStorage(_ovmContractAddress, _key);\n\n account.storageRoot = Lib_SecureMerkleTrie.update(\n abi.encodePacked(_key),\n Lib_RLPWriter.writeBytes(\n Lib_Bytes32Utils.removeLeadingZeros(value)\n ),\n _storageTrieWitness,\n account.storageRoot\n );\n\n ovmStateManager.putAccount(_ovmContractAddress, account);\n\n // Emit an event to help clients figure out the proof ordering.\n emit ContractStorageCommitted(\n _ovmContractAddress,\n _key\n );\n }\n\n\n /**********************************\n * Public Functions: Finalization *\n **********************************/\n\n /**\n * Finalizes the transition process.\n */\n function completeTransition()\n override\n public\n onlyDuringPhase(TransitionPhase.POST_EXECUTION)\n {\n require(\n ovmStateManager.getTotalUncommittedAccounts() == 0,\n \"All accounts must be committed before completing a transition.\"\n );\n\n require(\n ovmStateManager.getTotalUncommittedContractStorage() == 0,\n \"All storage must be committed before completing a transition.\"\n );\n\n phase = TransitionPhase.COMPLETE;\n }\n}\n" - }, - "contracts/optimistic-ethereum/libraries/trie/Lib_SecureMerkleTrie.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_MerkleTrie } from \"./Lib_MerkleTrie.sol\";\n\n/**\n * @title Lib_SecureMerkleTrie\n */\nlibrary Lib_SecureMerkleTrie {\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * @notice Verifies a proof that a given key/value pair is present in the\n * Merkle trie.\n * @param _key Key of the node to search for, as a hex string.\n * @param _value Value of the node to search for, as a hex string.\n * @param _proof Merkle trie inclusion proof for the desired node. Unlike\n * traditional Merkle trees, this proof is executed top-down and consists\n * of a list of RLP-encoded nodes that make a path down to the target node.\n * @param _root Known root of the Merkle trie. Used to verify that the\n * included proof is correctly constructed.\n * @return _verified `true` if the k/v pair exists in the trie, `false` otherwise.\n */\n function verifyInclusionProof(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n )\n internal\n pure\n returns (\n bool _verified\n )\n {\n bytes memory key = _getSecureKey(_key);\n return Lib_MerkleTrie.verifyInclusionProof(key, _value, _proof, _root);\n }\n\n /**\n * @notice Verifies a proof that a given key is *not* present in\n * the Merkle trie.\n * @param _key Key of the node to search for, as a hex string.\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\n * target node.\n * @param _root Known root of the Merkle trie. Used to verify that the\n * included proof is correctly constructed.\n * @return _verified `true` if the key is not present in the trie, `false` otherwise.\n */\n function verifyExclusionProof(\n bytes memory _key,\n bytes memory _proof,\n bytes32 _root\n )\n internal\n pure\n returns (\n bool _verified\n )\n {\n bytes memory key = _getSecureKey(_key);\n return Lib_MerkleTrie.verifyExclusionProof(key, _proof, _root);\n }\n\n /**\n * @notice Updates a Merkle trie and returns a new root hash.\n * @param _key Key of the node to update, as a hex string.\n * @param _value Value of the node to update, as a hex string.\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\n * target node. If the key exists, we can simply update the value.\n * Otherwise, we need to modify the trie to handle the new k/v pair.\n * @param _root Known root of the Merkle trie. Used to verify that the\n * included proof is correctly constructed.\n * @return _updatedRoot Root hash of the newly constructed trie.\n */\n function update(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n )\n internal\n pure\n returns (\n bytes32 _updatedRoot\n )\n {\n bytes memory key = _getSecureKey(_key);\n return Lib_MerkleTrie.update(key, _value, _proof, _root);\n }\n\n /**\n * @notice Retrieves the value associated with a given key.\n * @param _key Key to search for, as hex bytes.\n * @param _proof Merkle trie inclusion proof for the key.\n * @param _root Known root of the Merkle trie.\n * @return _exists Whether or not the key exists.\n * @return _value Value of the key if it exists.\n */\n function get(\n bytes memory _key,\n bytes memory _proof,\n bytes32 _root\n )\n internal\n pure\n returns (\n bool _exists,\n bytes memory _value\n )\n {\n bytes memory key = _getSecureKey(_key);\n return Lib_MerkleTrie.get(key, _proof, _root);\n }\n\n /**\n * Computes the root hash for a trie with a single node.\n * @param _key Key for the single node.\n * @param _value Value for the single node.\n * @return _updatedRoot Hash of the trie.\n */\n function getSingleNodeRootHash(\n bytes memory _key,\n bytes memory _value\n )\n internal\n pure\n returns (\n bytes32 _updatedRoot\n )\n {\n bytes memory key = _getSecureKey(_key);\n return Lib_MerkleTrie.getSingleNodeRootHash(key, _value);\n }\n\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * Computes the secure counterpart to a key.\n * @param _key Key to get a secure key from.\n * @return _secureKey Secure version of the key.\n */\n function _getSecureKey(\n bytes memory _key\n )\n private\n pure\n returns (\n bytes memory _secureKey\n )\n {\n return abi.encodePacked(keccak256(_key));\n }\n}" - }, - "contracts/optimistic-ethereum/iOVM/verification/iOVM_StateTransitioner.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/**\n * @title iOVM_StateTransitioner\n */\ninterface iOVM_StateTransitioner {\n\n /**********\n * Events *\n **********/\n\n event AccountCommitted(\n address _address\n );\n\n event ContractStorageCommitted(\n address _address,\n bytes32 _key\n );\n\n\n /**********************************\n * Public Functions: State Access *\n **********************************/\n\n function getPreStateRoot() external view returns (bytes32 _preStateRoot);\n function getPostStateRoot() external view returns (bytes32 _postStateRoot);\n function isComplete() external view returns (bool _complete);\n\n\n /***********************************\n * Public Functions: Pre-Execution *\n ***********************************/\n\n function proveContractState(\n address _ovmContractAddress,\n address _ethContractAddress,\n bytes calldata _stateTrieWitness\n ) external;\n\n function proveStorageSlot(\n address _ovmContractAddress,\n bytes32 _key,\n bytes calldata _storageTrieWitness\n ) external;\n\n\n /*******************************\n * Public Functions: Execution *\n *******************************/\n\n function applyTransaction(\n Lib_OVMCodec.Transaction calldata _transaction\n ) external;\n\n\n /************************************\n * Public Functions: Post-Execution *\n ************************************/\n\n function commitContractState(\n address _ovmContractAddress,\n bytes calldata _stateTrieWitness\n ) external;\n\n function commitStorageSlot(\n address _ovmContractAddress,\n bytes32 _key,\n bytes calldata _storageTrieWitness\n ) external;\n\n\n /**********************************\n * Public Functions: Finalization *\n **********************************/\n\n function completeTransition() external;\n}\n" - }, - "contracts/optimistic-ethereum/iOVM/verification/iOVM_BondManager.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\ninterface ERC20 {\n function transfer(address, uint256) external returns (bool);\n function transferFrom(address, address, uint256) external returns (bool);\n}\n\n/// All the errors which may be encountered on the bond manager\nlibrary Errors {\n string constant ERC20_ERR = \"BondManager: Could not post bond\";\n string constant ALREADY_FINALIZED = \"BondManager: Fraud proof for this pre-state root has already been finalized\";\n string constant SLASHED = \"BondManager: Cannot finalize withdrawal, you probably got slashed\";\n string constant WRONG_STATE = \"BondManager: Wrong bond state for proposer\";\n string constant CANNOT_CLAIM = \"BondManager: Cannot claim yet. Dispute must be finalized first\";\n\n string constant WITHDRAWAL_PENDING = \"BondManager: Withdrawal already pending\";\n string constant TOO_EARLY = \"BondManager: Too early to finalize your withdrawal\";\n\n string constant ONLY_TRANSITIONER = \"BondManager: Only the transitioner for this pre-state root may call this function\";\n string constant ONLY_FRAUD_VERIFIER = \"BondManager: Only the fraud verifier may call this function\";\n string constant ONLY_STATE_COMMITMENT_CHAIN = \"BondManager: Only the state commitment chain may call this function\";\n string constant WAIT_FOR_DISPUTES = \"BondManager: Wait for other potential disputes\";\n}\n\n/**\n * @title iOVM_BondManager\n */\ninterface iOVM_BondManager {\n\n /*******************\n * Data Structures *\n *******************/\n\n /// The lifecycle of a proposer's bond\n enum State {\n // Before depositing or after getting slashed, a user is uncollateralized\n NOT_COLLATERALIZED,\n // After depositing, a user is collateralized\n COLLATERALIZED,\n // After a user has initiated a withdrawal\n WITHDRAWING\n }\n\n /// A bond posted by a proposer\n struct Bond {\n // The user's state\n State state;\n // The timestamp at which a proposer issued their withdrawal request\n uint32 withdrawalTimestamp;\n // The time when the first disputed was initiated for this bond\n uint256 firstDisputeAt;\n // The earliest observed state root for this bond which has had fraud\n bytes32 earliestDisputedStateRoot;\n // The state root's timestamp\n uint256 earliestTimestamp;\n }\n\n // Per pre-state root, store the number of state provisions that were made\n // and how many of these calls were made by each user. Payouts will then be\n // claimed by users proportionally for that dispute.\n struct Rewards {\n // Flag to check if rewards for a fraud proof are claimable\n bool canClaim;\n // Total number of `recordGasSpent` calls made\n uint256 total;\n // The gas spent by each user to provide witness data. The sum of all\n // values inside this map MUST be equal to the value of `total`\n mapping(address => uint256) gasSpent;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n function recordGasSpent(\n bytes32 _preStateRoot,\n bytes32 _txHash,\n address _who,\n uint256 _gasSpent\n ) external;\n\n function finalize(\n bytes32 _preStateRoot,\n address _publisher,\n uint256 _timestamp\n ) external;\n\n function deposit() external;\n\n function startWithdrawal() external;\n\n function finalizeWithdrawal() external;\n\n function claim(\n address _who\n ) external;\n\n function isCollateralized(\n address _who\n ) external view returns (bool);\n\n function getGasSpent(\n bytes32 _preStateRoot,\n address _who\n ) external view returns (uint256);\n}\n" - }, - "contracts/optimistic-ethereum/iOVM/execution/iOVM_StateManagerFactory.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Contract Imports */\nimport { iOVM_StateManager } from \"./iOVM_StateManager.sol\";\n\n/**\n * @title iOVM_StateManagerFactory\n */\ninterface iOVM_StateManagerFactory {\n\n /***************************************\n * Public Functions: Contract Creation *\n ***************************************/\n\n function create(\n address _owner\n )\n external\n returns (\n iOVM_StateManager _ovmStateManager\n );\n}\n" - }, - "contracts/optimistic-ethereum/OVM/verification/OVM_FraudContributor.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.7.0;\n\nimport { iOVM_BondManager } from \"../../iOVM/verification/iOVM_BondManager.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/// Minimal contract to be inherited by contracts consumed by users that provide\n/// data for fraud proofs\nabstract contract OVM_FraudContributor is Lib_AddressResolver {\n /// Decorate your functions with this modifier to store how much total gas was\n /// consumed by the sender, to reward users fairly\n modifier contributesToFraudProof(bytes32 preStateRoot, bytes32 txHash) {\n uint256 startGas = gasleft();\n _;\n uint256 gasSpent = startGas - gasleft();\n iOVM_BondManager(resolve('OVM_BondManager')).recordGasSpent(preStateRoot, txHash, msg.sender, gasSpent);\n }\n}\n" - }, - "contracts/optimistic-ethereum/libraries/trie/Lib_MerkleTrie.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.7.0;\n\n/* Library Imports */\nimport { Lib_BytesUtils } from \"../utils/Lib_BytesUtils.sol\";\nimport { Lib_RLPReader } from \"../rlp/Lib_RLPReader.sol\";\nimport { Lib_RLPWriter } from \"../rlp/Lib_RLPWriter.sol\";\n\n/**\n * @title Lib_MerkleTrie\n */\nlibrary Lib_MerkleTrie {\n\n /*******************\n * Data Structures *\n *******************/\n\n enum NodeType {\n BranchNode,\n ExtensionNode,\n LeafNode\n }\n\n struct TrieNode {\n bytes encoded;\n Lib_RLPReader.RLPItem[] decoded;\n }\n\n\n /**********************\n * Contract Constants *\n **********************/\n\n // TREE_RADIX determines the number of elements per branch node.\n uint256 constant TREE_RADIX = 16;\n // Branch nodes have TREE_RADIX elements plus an additional `value` slot.\n uint256 constant BRANCH_NODE_LENGTH = TREE_RADIX + 1;\n // Leaf nodes and extension nodes always have two elements, a `path` and a `value`.\n uint256 constant LEAF_OR_EXTENSION_NODE_LENGTH = 2;\n\n // Prefixes are prepended to the `path` within a leaf or extension node and\n // allow us to differentiate between the two node types. `ODD` or `EVEN` is\n // determined by the number of nibbles within the unprefixed `path`. If the\n // number of nibbles if even, we need to insert an extra padding nibble so\n // the resulting prefixed `path` has an even number of nibbles.\n uint8 constant PREFIX_EXTENSION_EVEN = 0;\n uint8 constant PREFIX_EXTENSION_ODD = 1;\n uint8 constant PREFIX_LEAF_EVEN = 2;\n uint8 constant PREFIX_LEAF_ODD = 3;\n\n // Just a utility constant. RLP represents `NULL` as 0x80.\n bytes1 constant RLP_NULL = bytes1(0x80);\n bytes constant RLP_NULL_BYTES = hex'80';\n bytes32 constant internal KECCAK256_RLP_NULL_BYTES = keccak256(RLP_NULL_BYTES);\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * @notice Verifies a proof that a given key/value pair is present in the\n * Merkle trie.\n * @param _key Key of the node to search for, as a hex string.\n * @param _value Value of the node to search for, as a hex string.\n * @param _proof Merkle trie inclusion proof for the desired node. Unlike\n * traditional Merkle trees, this proof is executed top-down and consists\n * of a list of RLP-encoded nodes that make a path down to the target node.\n * @param _root Known root of the Merkle trie. Used to verify that the\n * included proof is correctly constructed.\n * @return _verified `true` if the k/v pair exists in the trie, `false` otherwise.\n */\n function verifyInclusionProof(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n )\n internal\n pure\n returns (\n bool _verified\n )\n {\n (\n bool exists,\n bytes memory value\n ) = get(_key, _proof, _root);\n\n return (\n exists && Lib_BytesUtils.equal(_value, value)\n );\n }\n\n /**\n * @notice Verifies a proof that a given key is *not* present in\n * the Merkle trie.\n * @param _key Key of the node to search for, as a hex string.\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\n * target node.\n * @param _root Known root of the Merkle trie. Used to verify that the\n * included proof is correctly constructed.\n * @return _verified `true` if the key is absent in the trie, `false` otherwise.\n */\n function verifyExclusionProof(\n bytes memory _key,\n bytes memory _proof,\n bytes32 _root\n )\n internal\n pure\n returns (\n bool _verified\n )\n {\n (\n bool exists,\n ) = get(_key, _proof, _root);\n\n return exists == false;\n }\n\n /**\n * @notice Updates a Merkle trie and returns a new root hash.\n * @param _key Key of the node to update, as a hex string.\n * @param _value Value of the node to update, as a hex string.\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\n * target node. If the key exists, we can simply update the value.\n * Otherwise, we need to modify the trie to handle the new k/v pair.\n * @param _root Known root of the Merkle trie. Used to verify that the\n * included proof is correctly constructed.\n * @return _updatedRoot Root hash of the newly constructed trie.\n */\n function update(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n )\n internal\n pure\n returns (\n bytes32 _updatedRoot\n )\n {\n // Special case when inserting the very first node.\n if (_root == KECCAK256_RLP_NULL_BYTES) {\n return getSingleNodeRootHash(_key, _value);\n }\n\n TrieNode[] memory proof = _parseProof(_proof);\n (uint256 pathLength, bytes memory keyRemainder, ) = _walkNodePath(proof, _key, _root);\n TrieNode[] memory newPath = _getNewPath(proof, pathLength, keyRemainder, _value);\n\n return _getUpdatedTrieRoot(newPath, _key);\n }\n\n /**\n * @notice Retrieves the value associated with a given key.\n * @param _key Key to search for, as hex bytes.\n * @param _proof Merkle trie inclusion proof for the key.\n * @param _root Known root of the Merkle trie.\n * @return _exists Whether or not the key exists.\n * @return _value Value of the key if it exists.\n */\n function get(\n bytes memory _key,\n bytes memory _proof,\n bytes32 _root\n )\n internal\n pure\n returns (\n bool _exists,\n bytes memory _value\n )\n {\n TrieNode[] memory proof = _parseProof(_proof);\n (uint256 pathLength, bytes memory keyRemainder, bool isFinalNode) = _walkNodePath(proof, _key, _root);\n\n bool exists = keyRemainder.length == 0;\n\n require(\n exists || isFinalNode,\n \"Provided proof is invalid.\"\n );\n\n bytes memory value = exists ? _getNodeValue(proof[pathLength - 1]) : bytes('');\n\n return (\n exists,\n value\n );\n }\n\n /**\n * Computes the root hash for a trie with a single node.\n * @param _key Key for the single node.\n * @param _value Value for the single node.\n * @return _updatedRoot Hash of the trie.\n */\n function getSingleNodeRootHash(\n bytes memory _key,\n bytes memory _value\n )\n internal\n pure\n returns (\n bytes32 _updatedRoot\n )\n {\n return keccak256(_makeLeafNode(\n Lib_BytesUtils.toNibbles(_key),\n _value\n ).encoded);\n }\n\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * @notice Walks through a proof using a provided key.\n * @param _proof Inclusion proof to walk through.\n * @param _key Key to use for the walk.\n * @param _root Known root of the trie.\n * @return _pathLength Length of the final path\n * @return _keyRemainder Portion of the key remaining after the walk.\n * @return _isFinalNode Whether or not we've hit a dead end.\n */\n function _walkNodePath(\n TrieNode[] memory _proof,\n bytes memory _key,\n bytes32 _root\n )\n private\n pure\n returns (\n uint256 _pathLength,\n bytes memory _keyRemainder,\n bool _isFinalNode\n )\n {\n uint256 pathLength = 0;\n bytes memory key = Lib_BytesUtils.toNibbles(_key);\n\n bytes32 currentNodeID = _root;\n uint256 currentKeyIndex = 0;\n uint256 currentKeyIncrement = 0;\n TrieNode memory currentNode;\n\n // Proof is top-down, so we start at the first element (root).\n for (uint256 i = 0; i < _proof.length; i++) {\n currentNode = _proof[i];\n currentKeyIndex += currentKeyIncrement;\n\n // Keep track of the proof elements we actually need.\n // It's expensive to resize arrays, so this simply reduces gas costs.\n pathLength += 1;\n\n if (currentKeyIndex == 0) {\n // First proof element is always the root node.\n require(\n keccak256(currentNode.encoded) == currentNodeID,\n \"Invalid root hash\"\n );\n } else if (currentNode.encoded.length >= 32) {\n // Nodes 32 bytes or larger are hashed inside branch nodes.\n require(\n keccak256(currentNode.encoded) == currentNodeID,\n \"Invalid large internal hash\"\n );\n } else {\n // Nodes smaller than 31 bytes aren't hashed.\n require(\n Lib_BytesUtils.toBytes32(currentNode.encoded) == currentNodeID,\n \"Invalid internal node hash\"\n );\n }\n\n if (currentNode.decoded.length == BRANCH_NODE_LENGTH) {\n if (currentKeyIndex == key.length) {\n // We've hit the end of the key, meaning the value should be within this branch node.\n break;\n } else {\n // We're not at the end of the key yet.\n // Figure out what the next node ID should be and continue.\n uint8 branchKey = uint8(key[currentKeyIndex]);\n Lib_RLPReader.RLPItem memory nextNode = currentNode.decoded[branchKey];\n currentNodeID = _getNodeID(nextNode);\n currentKeyIncrement = 1;\n continue;\n }\n } else if (currentNode.decoded.length == LEAF_OR_EXTENSION_NODE_LENGTH) {\n bytes memory path = _getNodePath(currentNode);\n uint8 prefix = uint8(path[0]);\n uint8 offset = 2 - prefix % 2;\n bytes memory pathRemainder = Lib_BytesUtils.slice(path, offset);\n bytes memory keyRemainder = Lib_BytesUtils.slice(key, currentKeyIndex);\n uint256 sharedNibbleLength = _getSharedNibbleLength(pathRemainder, keyRemainder);\n\n if (prefix == PREFIX_LEAF_EVEN || prefix == PREFIX_LEAF_ODD) {\n if (\n pathRemainder.length == sharedNibbleLength &&\n keyRemainder.length == sharedNibbleLength\n ) {\n // The key within this leaf matches our key exactly.\n // Increment the key index to reflect that we have no remainder.\n currentKeyIndex += sharedNibbleLength;\n }\n\n // We've hit a leaf node, so our next node should be NULL.\n currentNodeID = bytes32(RLP_NULL);\n break;\n } else if (prefix == PREFIX_EXTENSION_EVEN || prefix == PREFIX_EXTENSION_ODD) {\n if (sharedNibbleLength == 0) {\n // Our extension node doesn't share any part of our key.\n // We've hit the end of this path, updates will need to modify this extension.\n currentNodeID = bytes32(RLP_NULL);\n break;\n } else {\n // Our extension shares some nibbles.\n // Carry on to the next node.\n currentNodeID = _getNodeID(currentNode.decoded[1]);\n currentKeyIncrement = sharedNibbleLength;\n continue;\n }\n } else {\n revert(\"Received a node with an unknown prefix\");\n }\n } else {\n revert(\"Received an unparseable node.\");\n }\n }\n\n // If our node ID is NULL, then we're at a dead end.\n bool isFinalNode = currentNodeID == bytes32(RLP_NULL);\n return (pathLength, Lib_BytesUtils.slice(key, currentKeyIndex), isFinalNode);\n }\n\n /**\n * @notice Creates new nodes to support a k/v pair insertion into a given\n * Merkle trie path.\n * @param _path Path to the node nearest the k/v pair.\n * @param _pathLength Length of the path. Necessary because the provided\n * path may include additional nodes (e.g., it comes directly from a proof)\n * and we can't resize in-memory arrays without costly duplication.\n * @param _keyRemainder Portion of the initial key that must be inserted\n * into the trie.\n * @param _value Value to insert at the given key.\n * @return _newPath A new path with the inserted k/v pair and extra supporting nodes.\n */\n function _getNewPath(\n TrieNode[] memory _path,\n uint256 _pathLength,\n bytes memory _keyRemainder,\n bytes memory _value\n )\n private\n pure\n returns (\n TrieNode[] memory _newPath\n )\n {\n bytes memory keyRemainder = _keyRemainder;\n\n // Most of our logic depends on the status of the last node in the path.\n TrieNode memory lastNode = _path[_pathLength - 1];\n NodeType lastNodeType = _getNodeType(lastNode);\n\n // Create an array for newly created nodes.\n // We need up to three new nodes, depending on the contents of the last node.\n // Since array resizing is expensive, we'll keep track of the size manually.\n // We're using an explicit `totalNewNodes += 1` after insertions for clarity.\n TrieNode[] memory newNodes = new TrieNode[](3);\n uint256 totalNewNodes = 0;\n\n if (keyRemainder.length == 0 && lastNodeType == NodeType.LeafNode) {\n // We've found a leaf node with the given key.\n // Simply need to update the value of the node to match.\n newNodes[totalNewNodes] = _makeLeafNode(_getNodeKey(lastNode), _value);\n totalNewNodes += 1;\n } else if (lastNodeType == NodeType.BranchNode) {\n if (keyRemainder.length == 0) {\n // We've found a branch node with the given key.\n // Simply need to update the value of the node to match.\n newNodes[totalNewNodes] = _editBranchValue(lastNode, _value);\n totalNewNodes += 1;\n } else {\n // We've found a branch node, but it doesn't contain our key.\n // Reinsert the old branch for now.\n newNodes[totalNewNodes] = lastNode;\n totalNewNodes += 1;\n // Create a new leaf node, slicing our remainder since the first byte points\n // to our branch node.\n newNodes[totalNewNodes] = _makeLeafNode(Lib_BytesUtils.slice(keyRemainder, 1), _value);\n totalNewNodes += 1;\n }\n } else {\n // Our last node is either an extension node or a leaf node with a different key.\n bytes memory lastNodeKey = _getNodeKey(lastNode);\n uint256 sharedNibbleLength = _getSharedNibbleLength(lastNodeKey, keyRemainder);\n\n if (sharedNibbleLength != 0) {\n // We've got some shared nibbles between the last node and our key remainder.\n // We'll need to insert an extension node that covers these shared nibbles.\n bytes memory nextNodeKey = Lib_BytesUtils.slice(lastNodeKey, 0, sharedNibbleLength);\n newNodes[totalNewNodes] = _makeExtensionNode(nextNodeKey, _getNodeHash(_value));\n totalNewNodes += 1;\n\n // Cut down the keys since we've just covered these shared nibbles.\n lastNodeKey = Lib_BytesUtils.slice(lastNodeKey, sharedNibbleLength);\n keyRemainder = Lib_BytesUtils.slice(keyRemainder, sharedNibbleLength);\n }\n\n // Create an empty branch to fill in.\n TrieNode memory newBranch = _makeEmptyBranchNode();\n\n if (lastNodeKey.length == 0) {\n // Key remainder was larger than the key for our last node.\n // The value within our last node is therefore going to be shifted into\n // a branch value slot.\n newBranch = _editBranchValue(newBranch, _getNodeValue(lastNode));\n } else {\n // Last node key was larger than the key remainder.\n // We're going to modify some index of our branch.\n uint8 branchKey = uint8(lastNodeKey[0]);\n // Move on to the next nibble.\n lastNodeKey = Lib_BytesUtils.slice(lastNodeKey, 1);\n\n if (lastNodeType == NodeType.LeafNode) {\n // We're dealing with a leaf node.\n // We'll modify the key and insert the old leaf node into the branch index.\n TrieNode memory modifiedLastNode = _makeLeafNode(lastNodeKey, _getNodeValue(lastNode));\n newBranch = _editBranchIndex(newBranch, branchKey, _getNodeHash(modifiedLastNode.encoded));\n } else if (lastNodeKey.length != 0) {\n // We're dealing with a shrinking extension node.\n // We need to modify the node to decrease the size of the key.\n TrieNode memory modifiedLastNode = _makeExtensionNode(lastNodeKey, _getNodeValue(lastNode));\n newBranch = _editBranchIndex(newBranch, branchKey, _getNodeHash(modifiedLastNode.encoded));\n } else {\n // We're dealing with an unnecessary extension node.\n // We're going to delete the node entirely.\n // Simply insert its current value into the branch index.\n newBranch = _editBranchIndex(newBranch, branchKey, _getNodeValue(lastNode));\n }\n }\n\n if (keyRemainder.length == 0) {\n // We've got nothing left in the key remainder.\n // Simply insert the value into the branch value slot.\n newBranch = _editBranchValue(newBranch, _value);\n // Push the branch into the list of new nodes.\n newNodes[totalNewNodes] = newBranch;\n totalNewNodes += 1;\n } else {\n // We've got some key remainder to work with.\n // We'll be inserting a leaf node into the trie.\n // First, move on to the next nibble.\n keyRemainder = Lib_BytesUtils.slice(keyRemainder, 1);\n // Push the branch into the list of new nodes.\n newNodes[totalNewNodes] = newBranch;\n totalNewNodes += 1;\n // Push a new leaf node for our k/v pair.\n newNodes[totalNewNodes] = _makeLeafNode(keyRemainder, _value);\n totalNewNodes += 1;\n }\n }\n\n // Finally, join the old path with our newly created nodes.\n // Since we're overwriting the last node in the path, we use `_pathLength - 1`.\n return _joinNodeArrays(_path, _pathLength - 1, newNodes, totalNewNodes);\n }\n\n /**\n * @notice Computes the trie root from a given path.\n * @param _nodes Path to some k/v pair.\n * @param _key Key for the k/v pair.\n * @return _updatedRoot Root hash for the updated trie.\n */\n function _getUpdatedTrieRoot(\n TrieNode[] memory _nodes,\n bytes memory _key\n )\n private\n pure\n returns (\n bytes32 _updatedRoot\n )\n {\n bytes memory key = Lib_BytesUtils.toNibbles(_key);\n\n // Some variables to keep track of during iteration.\n TrieNode memory currentNode;\n NodeType currentNodeType;\n bytes memory previousNodeHash;\n\n // Run through the path backwards to rebuild our root hash.\n for (uint256 i = _nodes.length; i > 0; i--) {\n // Pick out the current node.\n currentNode = _nodes[i - 1];\n currentNodeType = _getNodeType(currentNode);\n\n if (currentNodeType == NodeType.LeafNode) {\n // Leaf nodes are already correctly encoded.\n // Shift the key over to account for the nodes key.\n bytes memory nodeKey = _getNodeKey(currentNode);\n key = Lib_BytesUtils.slice(key, 0, key.length - nodeKey.length);\n } else if (currentNodeType == NodeType.ExtensionNode) {\n // Shift the key over to account for the nodes key.\n bytes memory nodeKey = _getNodeKey(currentNode);\n key = Lib_BytesUtils.slice(key, 0, key.length - nodeKey.length);\n\n // If this node is the last element in the path, it'll be correctly encoded\n // and we can skip this part.\n if (previousNodeHash.length > 0) {\n // Re-encode the node based on the previous node.\n currentNode = _makeExtensionNode(nodeKey, previousNodeHash);\n }\n } else if (currentNodeType == NodeType.BranchNode) {\n // If this node is the last element in the path, it'll be correctly encoded\n // and we can skip this part.\n if (previousNodeHash.length > 0) {\n // Re-encode the node based on the previous node.\n uint8 branchKey = uint8(key[key.length - 1]);\n key = Lib_BytesUtils.slice(key, 0, key.length - 1);\n currentNode = _editBranchIndex(currentNode, branchKey, previousNodeHash);\n }\n }\n\n // Compute the node hash for the next iteration.\n previousNodeHash = _getNodeHash(currentNode.encoded);\n }\n\n // Current node should be the root at this point.\n // Simply return the hash of its encoding.\n return keccak256(currentNode.encoded);\n }\n\n /**\n * @notice Parses an RLP-encoded proof into something more useful.\n * @param _proof RLP-encoded proof to parse.\n * @return _parsed Proof parsed into easily accessible structs.\n */\n function _parseProof(\n bytes memory _proof\n )\n private\n pure\n returns (\n TrieNode[] memory _parsed\n )\n {\n Lib_RLPReader.RLPItem[] memory nodes = Lib_RLPReader.readList(_proof);\n TrieNode[] memory proof = new TrieNode[](nodes.length);\n\n for (uint256 i = 0; i < nodes.length; i++) {\n bytes memory encoded = Lib_RLPReader.readBytes(nodes[i]);\n proof[i] = TrieNode({\n encoded: encoded,\n decoded: Lib_RLPReader.readList(encoded)\n });\n }\n\n return proof;\n }\n\n /**\n * @notice Picks out the ID for a node. Node ID is referred to as the\n * \"hash\" within the specification, but nodes < 32 bytes are not actually\n * hashed.\n * @param _node Node to pull an ID for.\n * @return _nodeID ID for the node, depending on the size of its contents.\n */\n function _getNodeID(\n Lib_RLPReader.RLPItem memory _node\n )\n private\n pure\n returns (\n bytes32 _nodeID\n )\n {\n bytes memory nodeID;\n\n if (_node.length < 32) {\n // Nodes smaller than 32 bytes are RLP encoded.\n nodeID = Lib_RLPReader.readRawBytes(_node);\n } else {\n // Nodes 32 bytes or larger are hashed.\n nodeID = Lib_RLPReader.readBytes(_node);\n }\n\n return Lib_BytesUtils.toBytes32(nodeID);\n }\n\n /**\n * @notice Gets the path for a leaf or extension node.\n * @param _node Node to get a path for.\n * @return _path Node path, converted to an array of nibbles.\n */\n function _getNodePath(\n TrieNode memory _node\n )\n private\n pure\n returns (\n bytes memory _path\n )\n {\n return Lib_BytesUtils.toNibbles(Lib_RLPReader.readBytes(_node.decoded[0]));\n }\n\n /**\n * @notice Gets the key for a leaf or extension node. Keys are essentially\n * just paths without any prefix.\n * @param _node Node to get a key for.\n * @return _key Node key, converted to an array of nibbles.\n */\n function _getNodeKey(\n TrieNode memory _node\n )\n private\n pure\n returns (\n bytes memory _key\n )\n {\n return _removeHexPrefix(_getNodePath(_node));\n }\n\n /**\n * @notice Gets the path for a node.\n * @param _node Node to get a value for.\n * @return _value Node value, as hex bytes.\n */\n function _getNodeValue(\n TrieNode memory _node\n )\n private\n pure\n returns (\n bytes memory _value\n )\n {\n return Lib_RLPReader.readBytes(_node.decoded[_node.decoded.length - 1]);\n }\n\n /**\n * @notice Computes the node hash for an encoded node. Nodes < 32 bytes\n * are not hashed, all others are keccak256 hashed.\n * @param _encoded Encoded node to hash.\n * @return _hash Hash of the encoded node. Simply the input if < 32 bytes.\n */\n function _getNodeHash(\n bytes memory _encoded\n )\n private\n pure\n returns (\n bytes memory _hash\n )\n {\n if (_encoded.length < 32) {\n return _encoded;\n } else {\n return abi.encodePacked(keccak256(_encoded));\n }\n }\n\n /**\n * @notice Determines the type for a given node.\n * @param _node Node to determine a type for.\n * @return _type Type of the node; BranchNode/ExtensionNode/LeafNode.\n */\n function _getNodeType(\n TrieNode memory _node\n )\n private\n pure\n returns (\n NodeType _type\n )\n {\n if (_node.decoded.length == BRANCH_NODE_LENGTH) {\n return NodeType.BranchNode;\n } else if (_node.decoded.length == LEAF_OR_EXTENSION_NODE_LENGTH) {\n bytes memory path = _getNodePath(_node);\n uint8 prefix = uint8(path[0]);\n\n if (prefix == PREFIX_LEAF_EVEN || prefix == PREFIX_LEAF_ODD) {\n return NodeType.LeafNode;\n } else if (prefix == PREFIX_EXTENSION_EVEN || prefix == PREFIX_EXTENSION_ODD) {\n return NodeType.ExtensionNode;\n }\n }\n\n revert(\"Invalid node type\");\n }\n\n /**\n * @notice Utility; determines the number of nibbles shared between two\n * nibble arrays.\n * @param _a First nibble array.\n * @param _b Second nibble array.\n * @return _shared Number of shared nibbles.\n */\n function _getSharedNibbleLength(\n bytes memory _a,\n bytes memory _b\n )\n private\n pure\n returns (\n uint256 _shared\n )\n {\n uint256 i = 0;\n while (_a.length > i && _b.length > i && _a[i] == _b[i]) {\n i++;\n }\n return i;\n }\n\n /**\n * @notice Utility; converts an RLP-encoded node into our nice struct.\n * @param _raw RLP-encoded node to convert.\n * @return _node Node as a TrieNode struct.\n */\n function _makeNode(\n bytes[] memory _raw\n )\n private\n pure\n returns (\n TrieNode memory _node\n )\n {\n bytes memory encoded = Lib_RLPWriter.writeList(_raw);\n\n return TrieNode({\n encoded: encoded,\n decoded: Lib_RLPReader.readList(encoded)\n });\n }\n\n /**\n * @notice Utility; converts an RLP-decoded node into our nice struct.\n * @param _items RLP-decoded node to convert.\n * @return _node Node as a TrieNode struct.\n */\n function _makeNode(\n Lib_RLPReader.RLPItem[] memory _items\n )\n private\n pure\n returns (\n TrieNode memory _node\n )\n {\n bytes[] memory raw = new bytes[](_items.length);\n for (uint256 i = 0; i < _items.length; i++) {\n raw[i] = Lib_RLPReader.readRawBytes(_items[i]);\n }\n return _makeNode(raw);\n }\n\n /**\n * @notice Creates a new extension node.\n * @param _key Key for the extension node, unprefixed.\n * @param _value Value for the extension node.\n * @return _node New extension node with the given k/v pair.\n */\n function _makeExtensionNode(\n bytes memory _key,\n bytes memory _value\n )\n private\n pure\n returns (\n TrieNode memory _node\n )\n {\n bytes[] memory raw = new bytes[](2);\n bytes memory key = _addHexPrefix(_key, false);\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\n raw[1] = Lib_RLPWriter.writeBytes(_value);\n return _makeNode(raw);\n }\n\n /**\n * @notice Creates a new leaf node.\n * @dev This function is essentially identical to `_makeExtensionNode`.\n * Although we could route both to a single method with a flag, it's\n * more gas efficient to keep them separate and duplicate the logic.\n * @param _key Key for the leaf node, unprefixed.\n * @param _value Value for the leaf node.\n * @return _node New leaf node with the given k/v pair.\n */\n function _makeLeafNode(\n bytes memory _key,\n bytes memory _value\n )\n private\n pure\n returns (\n TrieNode memory _node\n )\n {\n bytes[] memory raw = new bytes[](2);\n bytes memory key = _addHexPrefix(_key, true);\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\n raw[1] = Lib_RLPWriter.writeBytes(_value);\n return _makeNode(raw);\n }\n\n /**\n * @notice Creates an empty branch node.\n * @return _node Empty branch node as a TrieNode struct.\n */\n function _makeEmptyBranchNode()\n private\n pure\n returns (\n TrieNode memory _node\n )\n {\n bytes[] memory raw = new bytes[](BRANCH_NODE_LENGTH);\n for (uint256 i = 0; i < raw.length; i++) {\n raw[i] = RLP_NULL_BYTES;\n }\n return _makeNode(raw);\n }\n\n /**\n * @notice Modifies the value slot for a given branch.\n * @param _branch Branch node to modify.\n * @param _value Value to insert into the branch.\n * @return _updatedNode Modified branch node.\n */\n function _editBranchValue(\n TrieNode memory _branch,\n bytes memory _value\n )\n private\n pure\n returns (\n TrieNode memory _updatedNode\n )\n {\n bytes memory encoded = Lib_RLPWriter.writeBytes(_value);\n _branch.decoded[_branch.decoded.length - 1] = Lib_RLPReader.toRLPItem(encoded);\n return _makeNode(_branch.decoded);\n }\n\n /**\n * @notice Modifies a slot at an index for a given branch.\n * @param _branch Branch node to modify.\n * @param _index Slot index to modify.\n * @param _value Value to insert into the slot.\n * @return _updatedNode Modified branch node.\n */\n function _editBranchIndex(\n TrieNode memory _branch,\n uint8 _index,\n bytes memory _value\n )\n private\n pure\n returns (\n TrieNode memory _updatedNode\n )\n {\n bytes memory encoded = _value.length < 32 ? _value : Lib_RLPWriter.writeBytes(_value);\n _branch.decoded[_index] = Lib_RLPReader.toRLPItem(encoded);\n return _makeNode(_branch.decoded);\n }\n\n /**\n * @notice Utility; adds a prefix to a key.\n * @param _key Key to prefix.\n * @param _isLeaf Whether or not the key belongs to a leaf.\n * @return _prefixedKey Prefixed key.\n */\n function _addHexPrefix(\n bytes memory _key,\n bool _isLeaf\n )\n private\n pure\n returns (\n bytes memory _prefixedKey\n )\n {\n uint8 prefix = _isLeaf ? uint8(0x02) : uint8(0x00);\n uint8 offset = uint8(_key.length % 2);\n bytes memory prefixed = new bytes(2 - offset);\n prefixed[0] = bytes1(prefix + offset);\n return Lib_BytesUtils.concat(prefixed, _key);\n }\n\n /**\n * @notice Utility; removes a prefix from a path.\n * @param _path Path to remove the prefix from.\n * @return _unprefixedKey Unprefixed key.\n */\n function _removeHexPrefix(\n bytes memory _path\n )\n private\n pure\n returns (\n bytes memory _unprefixedKey\n )\n {\n if (uint8(_path[0]) % 2 == 0) {\n return Lib_BytesUtils.slice(_path, 2);\n } else {\n return Lib_BytesUtils.slice(_path, 1);\n }\n }\n\n /**\n * @notice Utility; combines two node arrays. Array lengths are required\n * because the actual lengths may be longer than the filled lengths.\n * Array resizing is extremely costly and should be avoided.\n * @param _a First array to join.\n * @param _aLength Length of the first array.\n * @param _b Second array to join.\n * @param _bLength Length of the second array.\n * @return _joined Combined node array.\n */\n function _joinNodeArrays(\n TrieNode[] memory _a,\n uint256 _aLength,\n TrieNode[] memory _b,\n uint256 _bLength\n )\n private\n pure\n returns (\n TrieNode[] memory _joined\n )\n {\n TrieNode[] memory ret = new TrieNode[](_aLength + _bLength);\n\n // Copy elements from the first array.\n for (uint256 i = 0; i < _aLength; i++) {\n ret[i] = _a[i];\n }\n\n // Copy elements from the second array.\n for (uint256 i = 0; i < _bLength; i++) {\n ret[i + _aLength] = _b[i];\n }\n\n return ret;\n }\n}\n" - }, - "contracts/optimistic-ethereum/OVM/verification/OVM_StateTransitionerFactory.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.7.0;\n\n/* Library Imports */\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/* Interface Imports */\nimport { iOVM_StateTransitioner } from \"../../iOVM/verification/iOVM_StateTransitioner.sol\";\nimport { iOVM_StateTransitionerFactory } from \"../../iOVM/verification/iOVM_StateTransitionerFactory.sol\";\nimport { iOVM_FraudVerifier } from \"../../iOVM/verification/iOVM_FraudVerifier.sol\";\n\n/* Contract Imports */\nimport { OVM_StateTransitioner } from \"./OVM_StateTransitioner.sol\";\n\n/**\n * @title OVM_StateTransitionerFactory\n */\ncontract OVM_StateTransitionerFactory is iOVM_StateTransitionerFactory, Lib_AddressResolver {\n\n constructor( address _libAddressManager)\n Lib_AddressResolver(_libAddressManager){}\n\n /***************************************\n * Public Functions: Contract Creation *\n ***************************************/\n\n /**\n * Creates a new OVM_StateTransitioner\n * @param _libAddressManager Address of the Address Manager.\n * @param _stateTransitionIndex Index of the state transition being verified.\n * @param _preStateRoot State root before the transition was executed.\n * @param _transactionHash Hash of the executed transaction.\n * @return _ovmStateTransitioner New OVM_StateTransitioner instance.\n */\n function create(\n address _libAddressManager,\n uint256 _stateTransitionIndex,\n bytes32 _preStateRoot,\n bytes32 _transactionHash\n )\n override\n public\n returns (\n iOVM_StateTransitioner _ovmStateTransitioner\n )\n {\n require(\n msg.sender == resolve(\"OVM_FraudVerifier\"),\n \"Create can only be done by the OVM_FraudVerifier.\"\n );\n return new OVM_StateTransitioner(\n _libAddressManager,\n _stateTransitionIndex,\n _preStateRoot,\n _transactionHash\n );\n }\n}\n" - }, - "contracts/optimistic-ethereum/iOVM/verification/iOVM_StateTransitionerFactory.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Contract Imports */\nimport { iOVM_StateTransitioner } from \"./iOVM_StateTransitioner.sol\";\n\n/**\n * @title iOVM_StateTransitionerFactory\n */\ninterface iOVM_StateTransitionerFactory {\n\n /***************************************\n * Public Functions: Contract Creation *\n ***************************************/\n\n function create(\n address _proxyManager,\n uint256 _stateTransitionIndex,\n bytes32 _preStateRoot,\n bytes32 _transactionHash\n )\n external\n returns (\n iOVM_StateTransitioner _ovmStateTransitioner\n );\n}\n" - }, - "contracts/optimistic-ethereum/iOVM/verification/iOVM_FraudVerifier.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/* Interface Imports */\nimport { iOVM_StateTransitioner } from \"./iOVM_StateTransitioner.sol\";\n\n/**\n * @title iOVM_FraudVerifier\n */\ninterface iOVM_FraudVerifier {\n\n /**********\n * Events *\n **********/\n\n event FraudProofInitialized(\n bytes32 _preStateRoot,\n uint256 _preStateRootIndex,\n bytes32 _transactionHash,\n address _who\n );\n\n event FraudProofFinalized(\n bytes32 _preStateRoot,\n uint256 _preStateRootIndex,\n bytes32 _transactionHash,\n address _who\n );\n\n\n /***************************************\n * Public Functions: Transition Status *\n ***************************************/\n\n function getStateTransitioner(bytes32 _preStateRoot, bytes32 _txHash) external view returns (iOVM_StateTransitioner _transitioner);\n\n\n /****************************************\n * Public Functions: Fraud Verification *\n ****************************************/\n\n function initializeFraudVerification(\n bytes32 _preStateRoot,\n Lib_OVMCodec.ChainBatchHeader calldata _preStateRootBatchHeader,\n Lib_OVMCodec.ChainInclusionProof calldata _preStateRootProof,\n Lib_OVMCodec.Transaction calldata _transaction,\n Lib_OVMCodec.TransactionChainElement calldata _txChainElement,\n Lib_OVMCodec.ChainBatchHeader calldata _transactionBatchHeader,\n Lib_OVMCodec.ChainInclusionProof calldata _transactionProof\n ) external;\n\n function finalizeFraudVerification(\n bytes32 _preStateRoot,\n Lib_OVMCodec.ChainBatchHeader calldata _preStateRootBatchHeader,\n Lib_OVMCodec.ChainInclusionProof calldata _preStateRootProof,\n bytes32 _txHash,\n bytes32 _postStateRoot,\n Lib_OVMCodec.ChainBatchHeader calldata _postStateRootBatchHeader,\n Lib_OVMCodec.ChainInclusionProof calldata _postStateRootProof\n ) external;\n}\n" - }, - "contracts/optimistic-ethereum/OVM/verification/OVM_FraudVerifier.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.7.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/* Interface Imports */\nimport { iOVM_FraudVerifier } from \"../../iOVM/verification/iOVM_FraudVerifier.sol\";\nimport { iOVM_StateTransitioner } from \"../../iOVM/verification/iOVM_StateTransitioner.sol\";\nimport { iOVM_StateTransitionerFactory } from \"../../iOVM/verification/iOVM_StateTransitionerFactory.sol\";\nimport { iOVM_BondManager } from \"../../iOVM/verification/iOVM_BondManager.sol\";\nimport { iOVM_StateCommitmentChain } from \"../../iOVM/chain/iOVM_StateCommitmentChain.sol\";\nimport { iOVM_CanonicalTransactionChain } from \"../../iOVM/chain/iOVM_CanonicalTransactionChain.sol\";\n\n/* Contract Imports */\nimport { OVM_FraudContributor } from \"./OVM_FraudContributor.sol\";\n\ncontract OVM_FraudVerifier is Lib_AddressResolver, OVM_FraudContributor, iOVM_FraudVerifier {\n\n /*******************************************\n * Contract Variables: Internal Accounting *\n *******************************************/\n\n mapping (bytes32 => iOVM_StateTransitioner) internal transitioners;\n\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n constructor(\n address _libAddressManager\n )\n Lib_AddressResolver(_libAddressManager)\n {}\n\n\n /***************************************\n * Public Functions: Transition Status *\n ***************************************/\n\n /**\n * Retrieves the state transitioner for a given root.\n * @param _preStateRoot State root to query a transitioner for.\n * @return _transitioner Corresponding state transitioner contract.\n */\n function getStateTransitioner(\n bytes32 _preStateRoot,\n bytes32 _txHash\n )\n override\n public\n view\n returns (\n iOVM_StateTransitioner _transitioner\n )\n {\n return transitioners[keccak256(abi.encodePacked(_preStateRoot, _txHash))];\n }\n\n\n /****************************************\n * Public Functions: Fraud Verification *\n ****************************************/\n\n /**\n * Begins the fraud verification process.\n * @param _preStateRoot State root before the fraudulent transaction.\n * @param _preStateRootBatchHeader Batch header for the provided pre-state root.\n * @param _preStateRootProof Inclusion proof for the provided pre-state root.\n * @param _transaction OVM transaction claimed to be fraudulent.\n * @param _txChainElement OVM transaction chain element.\n * @param _transactionBatchHeader Batch header for the provided transaction.\n * @param _transactionProof Inclusion proof for the provided transaction.\n */\n function initializeFraudVerification(\n bytes32 _preStateRoot,\n Lib_OVMCodec.ChainBatchHeader memory _preStateRootBatchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _preStateRootProof,\n Lib_OVMCodec.Transaction memory _transaction,\n Lib_OVMCodec.TransactionChainElement memory _txChainElement,\n Lib_OVMCodec.ChainBatchHeader memory _transactionBatchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _transactionProof\n )\n override\n public\n contributesToFraudProof(_preStateRoot, Lib_OVMCodec.hashTransaction(_transaction))\n {\n bytes32 _txHash = Lib_OVMCodec.hashTransaction(_transaction);\n\n if (_hasStateTransitioner(_preStateRoot, _txHash)) {\n return;\n }\n\n iOVM_StateCommitmentChain ovmStateCommitmentChain = iOVM_StateCommitmentChain(resolve(\"OVM_StateCommitmentChain\"));\n iOVM_CanonicalTransactionChain ovmCanonicalTransactionChain = iOVM_CanonicalTransactionChain(resolve(\"OVM_CanonicalTransactionChain\"));\n\n require(\n ovmStateCommitmentChain.verifyStateCommitment(\n _preStateRoot,\n _preStateRootBatchHeader,\n _preStateRootProof\n ),\n \"Invalid pre-state root inclusion proof.\"\n );\n\n require(\n ovmCanonicalTransactionChain.verifyTransaction(\n _transaction,\n _txChainElement,\n _transactionBatchHeader,\n _transactionProof\n ),\n \"Invalid transaction inclusion proof.\"\n );\n\n require (\n _preStateRootBatchHeader.prevTotalElements + _preStateRootProof.index + 1 == _transactionBatchHeader.prevTotalElements + _transactionProof.index,\n \"Pre-state root global index must equal to the transaction root global index.\"\n );\n\n _deployTransitioner(_preStateRoot, _txHash, _preStateRootProof.index);\n\n emit FraudProofInitialized(\n _preStateRoot,\n _preStateRootProof.index,\n _txHash,\n msg.sender\n );\n }\n\n /**\n * Finalizes the fraud verification process.\n * @param _preStateRoot State root before the fraudulent transaction.\n * @param _preStateRootBatchHeader Batch header for the provided pre-state root.\n * @param _preStateRootProof Inclusion proof for the provided pre-state root.\n * @param _txHash The transaction for the state root\n * @param _postStateRoot State root after the fraudulent transaction.\n * @param _postStateRootBatchHeader Batch header for the provided post-state root.\n * @param _postStateRootProof Inclusion proof for the provided post-state root.\n */\n function finalizeFraudVerification(\n bytes32 _preStateRoot,\n Lib_OVMCodec.ChainBatchHeader memory _preStateRootBatchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _preStateRootProof,\n bytes32 _txHash,\n bytes32 _postStateRoot,\n Lib_OVMCodec.ChainBatchHeader memory _postStateRootBatchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _postStateRootProof\n )\n override\n public\n contributesToFraudProof(_preStateRoot, _txHash)\n {\n iOVM_StateTransitioner transitioner = getStateTransitioner(_preStateRoot, _txHash);\n iOVM_StateCommitmentChain ovmStateCommitmentChain = iOVM_StateCommitmentChain(resolve(\"OVM_StateCommitmentChain\"));\n iOVM_BondManager ovmBondManager = iOVM_BondManager(resolve(\"OVM_BondManager\"));\n\n require(\n transitioner.isComplete() == true,\n \"State transition process must be completed prior to finalization.\"\n );\n\n require (\n _postStateRootBatchHeader.prevTotalElements + _postStateRootProof.index == _preStateRootBatchHeader.prevTotalElements + _preStateRootProof.index + 1,\n \"Post-state root global index must equal to the pre state root global index plus one.\"\n );\n\n require(\n ovmStateCommitmentChain.verifyStateCommitment(\n _preStateRoot,\n _preStateRootBatchHeader,\n _preStateRootProof\n ),\n \"Invalid pre-state root inclusion proof.\"\n );\n\n require(\n ovmStateCommitmentChain.verifyStateCommitment(\n _postStateRoot,\n _postStateRootBatchHeader,\n _postStateRootProof\n ),\n \"Invalid post-state root inclusion proof.\"\n );\n\n // If the post state root did not match, then there was fraud and we should delete the batch\n require(\n _postStateRoot != transitioner.getPostStateRoot(),\n \"State transition has not been proven fraudulent.\"\n );\n \n _cancelStateTransition(_postStateRootBatchHeader, _preStateRoot);\n\n // TEMPORARY: Remove the transitioner; for minnet.\n transitioners[keccak256(abi.encodePacked(_preStateRoot, _txHash))] = iOVM_StateTransitioner(0x0000000000000000000000000000000000000000);\n\n emit FraudProofFinalized(\n _preStateRoot,\n _preStateRootProof.index,\n _txHash,\n msg.sender\n );\n }\n\n\n /************************************\n * Internal Functions: Verification *\n ************************************/\n\n /**\n * Checks whether a transitioner already exists for a given pre-state root.\n * @param _preStateRoot Pre-state root to check.\n * @return _exists Whether or not we already have a transitioner for the root.\n */\n function _hasStateTransitioner(\n bytes32 _preStateRoot,\n bytes32 _txHash\n )\n internal\n view\n returns (\n bool _exists\n )\n {\n return address(getStateTransitioner(_preStateRoot, _txHash)) != address(0);\n }\n\n /**\n * Deploys a new state transitioner.\n * @param _preStateRoot Pre-state root to initialize the transitioner with.\n * @param _txHash Hash of the transaction this transitioner will execute.\n * @param _stateTransitionIndex Index of the transaction in the chain.\n */\n function _deployTransitioner(\n bytes32 _preStateRoot,\n bytes32 _txHash,\n uint256 _stateTransitionIndex\n )\n internal\n {\n transitioners[keccak256(abi.encodePacked(_preStateRoot, _txHash))] = iOVM_StateTransitionerFactory(\n resolve(\"OVM_StateTransitionerFactory\")\n ).create(\n address(libAddressManager),\n _stateTransitionIndex,\n _preStateRoot,\n _txHash\n );\n }\n\n /**\n * Removes a state transition from the state commitment chain.\n * @param _postStateRootBatchHeader Header for the post-state root.\n * @param _preStateRoot Pre-state root hash.\n */\n function _cancelStateTransition(\n Lib_OVMCodec.ChainBatchHeader memory _postStateRootBatchHeader,\n bytes32 _preStateRoot\n )\n internal\n {\n iOVM_StateCommitmentChain ovmStateCommitmentChain = iOVM_StateCommitmentChain(resolve(\"OVM_StateCommitmentChain\"));\n iOVM_BondManager ovmBondManager = iOVM_BondManager(resolve(\"OVM_BondManager\"));\n\n // Delete the state batch.\n ovmStateCommitmentChain.deleteStateBatch(\n _postStateRootBatchHeader\n );\n\n // Get the timestamp and publisher for that block.\n (uint256 timestamp, address publisher) = abi.decode(_postStateRootBatchHeader.extraData, (uint256, address));\n\n // Slash the bonds at the bond manager.\n ovmBondManager.finalize(\n _preStateRoot,\n publisher,\n timestamp\n );\n }\n}\n" - }, - "contracts/optimistic-ethereum/iOVM/chain/iOVM_StateCommitmentChain.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/**\n * @title iOVM_StateCommitmentChain\n */\ninterface iOVM_StateCommitmentChain {\n\n /**********\n * Events *\n **********/\n\n event StateBatchAppended(\n uint256 indexed _batchIndex,\n bytes32 _batchRoot,\n uint256 _batchSize,\n uint256 _prevTotalElements,\n bytes _extraData\n );\n\n event StateBatchDeleted(\n uint256 indexed _batchIndex,\n bytes32 _batchRoot\n );\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Retrieves the total number of elements submitted.\n * @return _totalElements Total submitted elements.\n */\n function getTotalElements()\n external\n view\n returns (\n uint256 _totalElements\n );\n\n /**\n * Retrieves the total number of batches submitted.\n * @return _totalBatches Total submitted batches.\n */\n function getTotalBatches()\n external\n view\n returns (\n uint256 _totalBatches\n );\n\n /**\n * Retrieves the timestamp of the last batch submitted by the sequencer.\n * @return _lastSequencerTimestamp Last sequencer batch timestamp.\n */\n function getLastSequencerTimestamp()\n external\n view\n returns (\n uint256 _lastSequencerTimestamp\n );\n\n /**\n * Appends a batch of state roots to the chain.\n * @param _batch Batch of state roots.\n * @param _shouldStartAtElement Index of the element at which this batch should start.\n */\n function appendStateBatch(\n bytes32[] calldata _batch,\n uint256 _shouldStartAtElement\n )\n external;\n\n /**\n * Deletes all state roots after (and including) a given batch.\n * @param _batchHeader Header of the batch to start deleting from.\n */\n function deleteStateBatch(\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\n )\n external;\n\n /**\n * Verifies a batch inclusion proof.\n * @param _element Hash of the element to verify a proof for.\n * @param _batchHeader Header of the batch in which the element was included.\n * @param _proof Merkle inclusion proof for the element.\n */\n function verifyStateCommitment(\n bytes32 _element,\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _proof\n )\n external\n view\n returns (\n bool _verified\n );\n\n /**\n * Checks whether a given batch is still inside its fraud proof window.\n * @param _batchHeader Header of the batch to check.\n * @return _inside Whether or not the batch is inside the fraud proof window.\n */\n function insideFraudProofWindow(\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\n )\n external\n view\n returns (\n bool _inside\n );\n}\n" - }, - "contracts/optimistic-ethereum/iOVM/chain/iOVM_CanonicalTransactionChain.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/**\n * @title iOVM_CanonicalTransactionChain\n */\ninterface iOVM_CanonicalTransactionChain {\n\n /**********\n * Events *\n **********/\n\n event TransactionEnqueued(\n address _l1TxOrigin,\n address _target,\n uint256 _gasLimit,\n bytes _data,\n uint256 _queueIndex,\n uint256 _timestamp\n );\n\n event QueueBatchAppended(\n uint256 _startingQueueIndex,\n uint256 _numQueueElements,\n uint256 _totalElements\n );\n\n event SequencerBatchAppended(\n uint256 _startingQueueIndex,\n uint256 _numQueueElements,\n uint256 _totalElements\n );\n\n event TransactionBatchAppended(\n uint256 indexed _batchIndex,\n bytes32 _batchRoot,\n uint256 _batchSize,\n uint256 _prevTotalElements,\n bytes _extraData\n );\n\n\n /***********\n * Structs *\n ***********/\n\n struct BatchContext {\n uint256 numSequencedTransactions;\n uint256 numSubsequentQueueTransactions;\n uint256 timestamp;\n uint256 blockNumber;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Retrieves the total number of elements submitted.\n * @return _totalElements Total submitted elements.\n */\n function getTotalElements()\n external\n view\n returns (\n uint256 _totalElements\n );\n\n /**\n * Retrieves the total number of batches submitted.\n * @return _totalBatches Total submitted batches.\n */\n function getTotalBatches()\n external\n view\n returns (\n uint256 _totalBatches\n );\n\n /**\n * Returns the index of the next element to be enqueued.\n * @return Index for the next queue element.\n */\n function getNextQueueIndex()\n external\n view\n returns (\n uint40\n );\n\n /**\n * Get the number of queue elements which have not yet been included.\n * @return Length of the queue.\n */\n function getNumPendingQueueElements()\n external\n view\n returns (\n uint40\n );\n\n /**\n * Retrieves the length of the queue, including\n * both pending and canonical transactions.\n * @return Length of the queue.\n */\n function getQueueLength()\n external\n view\n returns (\n uint40\n );\n\n /**\n * Gets the queue element at a particular index.\n * @param _index Index of the queue element to access.\n * @return _element Queue element at the given index.\n */\n function getQueueElement(\n uint256 _index\n )\n external\n view\n returns (\n Lib_OVMCodec.QueueElement memory _element\n );\n\n /**\n * Adds a transaction to the queue.\n * @param _target Target contract to send the transaction to.\n * @param _gasLimit Gas limit for the given transaction.\n * @param _data Transaction data.\n */\n function enqueue(\n address _target,\n uint256 _gasLimit,\n bytes memory _data\n )\n external;\n\n /**\n * Appends a given number of queued transactions as a single batch.\n * @param _numQueuedTransactions Number of transactions to append.\n */\n function appendQueueBatch(\n uint256 _numQueuedTransactions\n )\n external;\n\n /**\n * Allows the sequencer to append a batch of transactions.\n * @dev This function uses a custom encoding scheme for efficiency reasons.\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\n * .param _contexts Array of batch contexts.\n * .param _transactionDataFields Array of raw transaction data.\n */\n function appendSequencerBatch(\n // uint40 _shouldStartAtElement,\n // uint24 _totalElementsToAppend,\n // BatchContext[] _contexts,\n // bytes[] _transactionDataFields\n )\n external;\n\n /**\n * Verifies whether a transaction is included in the chain.\n * @param _transaction Transaction to verify.\n * @param _txChainElement Transaction chain element corresponding to the transaction.\n * @param _batchHeader Header of the batch the transaction was included in.\n * @param _inclusionProof Inclusion proof for the provided transaction chain element.\n * @return True if the transaction exists in the CTC, false if not.\n */\n function verifyTransaction(\n Lib_OVMCodec.Transaction memory _transaction,\n Lib_OVMCodec.TransactionChainElement memory _txChainElement,\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _inclusionProof\n )\n external\n view\n returns (\n bool\n );\n}\n" - }, - "contracts/optimistic-ethereum/OVM/verification/OVM_BondManager.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.7.0;\n\n/* Library Imports */\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/* Interface Imports */\nimport { iOVM_BondManager, Errors, ERC20 } from \"../../iOVM/verification/iOVM_BondManager.sol\";\nimport { iOVM_FraudVerifier } from \"../../iOVM/verification/iOVM_FraudVerifier.sol\";\n\n/**\n * @title OVM_BondManager\n */\ncontract OVM_BondManager is iOVM_BondManager, Lib_AddressResolver {\n\n /****************************\n * Constants and Parameters *\n ****************************/\n\n /// The period to find the earliest fraud proof for a publisher\n uint256 public constant multiFraudProofPeriod = 7 days;\n\n /// The dispute period\n uint256 public constant disputePeriodSeconds = 7 days;\n\n /// The minimum collateral a sequencer must post\n uint256 public constant requiredCollateral = 1 ether;\n\n\n /*******************************************\n * Contract Variables: Contract References *\n *******************************************/\n\n /// The bond token\n ERC20 immutable public token;\n\n\n /********************************************\n * Contract Variables: Internal Accounting *\n *******************************************/\n\n /// The bonds posted by each proposer\n mapping(address => Bond) public bonds;\n\n /// For each pre-state root, there's an array of witnessProviders that must be rewarded\n /// for posting witnesses\n mapping(bytes32 => Rewards) public witnessProviders;\n\n\n /***************\n * Constructor *\n ***************/\n\n /// Initializes with a ERC20 token to be used for the fidelity bonds\n /// and with the Address Manager\n constructor(ERC20 _token, address _libAddressManager)\n Lib_AddressResolver(_libAddressManager)\n {\n token = _token;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n /// Adds `who` to the list of witnessProviders for the provided `preStateRoot`.\n function recordGasSpent(bytes32 _preStateRoot, bytes32 _txHash, address who, uint256 gasSpent) override public {\n // The sender must be the transitioner that corresponds to the claimed pre-state root\n address transitioner = address(iOVM_FraudVerifier(resolve(\"OVM_FraudVerifier\")).getStateTransitioner(_preStateRoot, _txHash));\n require(transitioner == msg.sender, Errors.ONLY_TRANSITIONER);\n\n witnessProviders[_preStateRoot].total += gasSpent;\n witnessProviders[_preStateRoot].gasSpent[who] += gasSpent;\n }\n\n /// Slashes + distributes rewards or frees up the sequencer's bond, only called by\n /// `FraudVerifier.finalizeFraudVerification`\n function finalize(bytes32 _preStateRoot, address publisher, uint256 timestamp) override public {\n require(msg.sender == resolve(\"OVM_FraudVerifier\"), Errors.ONLY_FRAUD_VERIFIER);\n require(witnessProviders[_preStateRoot].canClaim == false, Errors.ALREADY_FINALIZED);\n\n // allow users to claim from that state root's\n // pool of collateral (effectively slashing the sequencer)\n witnessProviders[_preStateRoot].canClaim = true;\n\n Bond storage bond = bonds[publisher];\n if (bond.firstDisputeAt == 0) {\n bond.firstDisputeAt = block.timestamp;\n bond.earliestDisputedStateRoot = _preStateRoot;\n bond.earliestTimestamp = timestamp;\n } else if (\n // only update the disputed state root for the publisher if it's within\n // the dispute period _and_ if it's before the previous one\n block.timestamp < bond.firstDisputeAt + multiFraudProofPeriod &&\n timestamp < bond.earliestTimestamp\n ) {\n bond.earliestDisputedStateRoot = _preStateRoot;\n bond.earliestTimestamp = timestamp;\n }\n\n // if the fraud proof's dispute period does not intersect with the \n // withdrawal's timestamp, then the user should not be slashed\n // e.g if a user at day 10 submits a withdrawal, and a fraud proof\n // from day 1 gets published, the user won't be slashed since day 8 (1d + 7d)\n // is before the user started their withdrawal. on the contrary, if the user\n // had started their withdrawal at, say, day 6, they would be slashed\n if (\n bond.withdrawalTimestamp != 0 && \n uint256(bond.withdrawalTimestamp) > timestamp + disputePeriodSeconds &&\n bond.state == State.WITHDRAWING\n ) {\n return;\n }\n\n // slash!\n bond.state = State.NOT_COLLATERALIZED;\n }\n\n /// Sequencers call this function to post collateral which will be used for\n /// the `appendBatch` call\n function deposit() override public {\n require(\n token.transferFrom(msg.sender, address(this), requiredCollateral),\n Errors.ERC20_ERR\n );\n\n // This cannot overflow\n bonds[msg.sender].state = State.COLLATERALIZED;\n }\n\n /// Starts the withdrawal for a publisher\n function startWithdrawal() override public {\n Bond storage bond = bonds[msg.sender];\n require(bond.withdrawalTimestamp == 0, Errors.WITHDRAWAL_PENDING);\n require(bond.state == State.COLLATERALIZED, Errors.WRONG_STATE);\n\n bond.state = State.WITHDRAWING;\n bond.withdrawalTimestamp = uint32(block.timestamp);\n }\n\n /// Finalizes a pending withdrawal from a publisher\n function finalizeWithdrawal() override public {\n Bond storage bond = bonds[msg.sender];\n\n require(\n block.timestamp >= uint256(bond.withdrawalTimestamp) + disputePeriodSeconds, \n Errors.TOO_EARLY\n );\n require(bond.state == State.WITHDRAWING, Errors.SLASHED);\n \n // refunds!\n bond.state = State.NOT_COLLATERALIZED;\n bond.withdrawalTimestamp = 0;\n \n require(\n token.transfer(msg.sender, requiredCollateral),\n Errors.ERC20_ERR\n );\n }\n\n /// Claims the user's reward for the witnesses they provided for the earliest\n /// disputed state root of the designated publisher\n function claim(address who) override public {\n Bond storage bond = bonds[who];\n require(\n block.timestamp >= bond.firstDisputeAt + multiFraudProofPeriod,\n Errors.WAIT_FOR_DISPUTES\n );\n\n // reward the earliest state root for this publisher\n bytes32 _preStateRoot = bond.earliestDisputedStateRoot;\n Rewards storage rewards = witnessProviders[_preStateRoot];\n\n // only allow claiming if fraud was proven in `finalize`\n require(rewards.canClaim, Errors.CANNOT_CLAIM);\n\n // proportional allocation - only reward 50% (rest gets locked in the\n // contract forever\n uint256 amount = (requiredCollateral * rewards.gasSpent[msg.sender]) / (2 * rewards.total);\n\n // reset the user's spent gas so they cannot double claim\n rewards.gasSpent[msg.sender] = 0;\n\n // transfer\n require(token.transfer(msg.sender, amount), Errors.ERC20_ERR);\n }\n\n /// Checks if the user is collateralized\n function isCollateralized(address who) override public view returns (bool) {\n return bonds[who].state == State.COLLATERALIZED;\n }\n\n /// Gets how many witnesses the user has provided for the state root\n function getGasSpent(bytes32 preStateRoot, address who) override public view returns (uint256) {\n return witnessProviders[preStateRoot].gasSpent[who];\n }\n}\n" - }, - "contracts/test-helpers/Mock_FraudVerifier.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.7.0;\n\nimport { OVM_BondManager } from \"./../optimistic-ethereum/OVM/verification/OVM_BondManager.sol\";\n\ncontract Mock_FraudVerifier {\n OVM_BondManager bondManager;\n\n mapping (bytes32 => address) transitioners;\n\n function setBondManager(OVM_BondManager _bondManager) public {\n bondManager = _bondManager;\n }\n\n function setStateTransitioner(bytes32 preStateRoot, bytes32 txHash, address addr) public {\n transitioners[keccak256(abi.encodePacked(preStateRoot, txHash))] = addr;\n }\n\n function getStateTransitioner(\n bytes32 _preStateRoot,\n bytes32 _txHash\n )\n public\n view\n returns (\n address\n )\n {\n return transitioners[keccak256(abi.encodePacked(_preStateRoot, _txHash))];\n }\n\n function finalize(bytes32 _preStateRoot, address publisher, uint256 timestamp) public {\n bondManager.finalize(_preStateRoot, publisher, timestamp);\n }\n}\n" - }, - "contracts/optimistic-ethereum/OVM/chain/OVM_StateCommitmentChain.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.7.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\nimport { Lib_MerkleTree } from \"../../libraries/utils/Lib_MerkleTree.sol\";\n\n/* Interface Imports */\nimport { iOVM_FraudVerifier } from \"../../iOVM/verification/iOVM_FraudVerifier.sol\";\nimport { iOVM_StateCommitmentChain } from \"../../iOVM/chain/iOVM_StateCommitmentChain.sol\";\nimport { iOVM_CanonicalTransactionChain } from \"../../iOVM/chain/iOVM_CanonicalTransactionChain.sol\";\nimport { iOVM_BondManager } from \"../../iOVM/verification/iOVM_BondManager.sol\";\nimport { iOVM_ChainStorageContainer } from \"../../iOVM/chain/iOVM_ChainStorageContainer.sol\";\n\n/* External Imports */\nimport '@openzeppelin/contracts/math/SafeMath.sol';\n\n/**\n * @title OVM_StateCommitmentChain\n */\ncontract OVM_StateCommitmentChain is iOVM_StateCommitmentChain, Lib_AddressResolver {\n\n /*************\n * Constants *\n *************/\n\n uint256 public FRAUD_PROOF_WINDOW;\n uint256 public SEQUENCER_PUBLISH_WINDOW;\n\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n constructor(\n address _libAddressManager,\n uint256 _fraudProofWindow,\n uint256 _sequencerPublishWindow\n )\n Lib_AddressResolver(_libAddressManager)\n {\n FRAUD_PROOF_WINDOW = _fraudProofWindow;\n SEQUENCER_PUBLISH_WINDOW = _sequencerPublishWindow;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Accesses the batch storage container.\n * @return Reference to the batch storage container.\n */\n function batches()\n public\n view\n returns (\n iOVM_ChainStorageContainer\n )\n {\n return iOVM_ChainStorageContainer(\n resolve(\"OVM_ChainStorageContainer:SCC:batches\")\n );\n }\n\n /**\n * @inheritdoc iOVM_StateCommitmentChain\n */\n function getTotalElements()\n override\n public\n view\n returns (\n uint256 _totalElements\n )\n {\n (uint40 totalElements, ) = _getBatchExtraData();\n return uint256(totalElements);\n }\n\n /**\n * @inheritdoc iOVM_StateCommitmentChain\n */\n function getTotalBatches()\n override\n public\n view\n returns (\n uint256 _totalBatches\n )\n {\n return batches().length();\n }\n\n /**\n * @inheritdoc iOVM_StateCommitmentChain\n */\n function getLastSequencerTimestamp()\n override\n public\n view\n returns (\n uint256 _lastSequencerTimestamp\n )\n {\n (, uint40 lastSequencerTimestamp) = _getBatchExtraData();\n return uint256(lastSequencerTimestamp);\n }\n\n /**\n * @inheritdoc iOVM_StateCommitmentChain\n */\n function appendStateBatch(\n bytes32[] memory _batch,\n uint256 _shouldStartAtElement\n )\n override\n public\n {\n // Fail fast in to make sure our batch roots aren't accidentally made fraudulent by the\n // publication of batches by some other user.\n require(\n _shouldStartAtElement == getTotalElements(),\n \"Actual batch start index does not match expected start index.\"\n );\n\n // Proposers must have previously staked at the BondManager\n require(\n iOVM_BondManager(resolve(\"OVM_BondManager\")).isCollateralized(msg.sender),\n \"Proposer does not have enough collateral posted\"\n );\n\n require(\n _batch.length > 0,\n \"Cannot submit an empty state batch.\"\n );\n\n require(\n getTotalElements() + _batch.length <= iOVM_CanonicalTransactionChain(resolve(\"OVM_CanonicalTransactionChain\")).getTotalElements(),\n \"Number of state roots cannot exceed the number of canonical transactions.\"\n );\n\n // Pass the block's timestamp and the publisher of the data\n // to be used in the fraud proofs\n _appendBatch(\n _batch,\n abi.encode(block.timestamp, msg.sender)\n );\n }\n\n /**\n * @inheritdoc iOVM_StateCommitmentChain\n */\n function deleteStateBatch(\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\n )\n override\n public\n {\n require(\n msg.sender == resolve(\"OVM_FraudVerifier\"),\n \"State batches can only be deleted by the OVM_FraudVerifier.\"\n );\n\n require(\n _isValidBatchHeader(_batchHeader),\n \"Invalid batch header.\"\n );\n\n require(\n insideFraudProofWindow(_batchHeader),\n \"State batches can only be deleted within the fraud proof window.\"\n );\n\n _deleteBatch(_batchHeader);\n }\n\n /**\n * @inheritdoc iOVM_StateCommitmentChain\n */\n function verifyStateCommitment(\n bytes32 _element,\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _proof\n )\n override\n public\n view\n returns (\n bool\n )\n {\n require(\n _isValidBatchHeader(_batchHeader),\n \"Invalid batch header.\"\n );\n\n require(\n Lib_MerkleTree.verify(\n _batchHeader.batchRoot,\n _element,\n _proof.index,\n _proof.siblings,\n _batchHeader.batchSize\n ),\n \"Invalid inclusion proof.\"\n );\n\n return true;\n }\n\n /**\n * @inheritdoc iOVM_StateCommitmentChain\n */\n function insideFraudProofWindow(\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\n )\n override\n public\n view\n returns (\n bool _inside\n )\n {\n (uint256 timestamp,) = abi.decode(\n _batchHeader.extraData,\n (uint256, address)\n );\n\n require(\n timestamp != 0,\n \"Batch header timestamp cannot be zero\"\n );\n return SafeMath.add(timestamp, FRAUD_PROOF_WINDOW) > block.timestamp;\n }\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Parses the batch context from the extra data.\n * @return Total number of elements submitted.\n * @return Timestamp of the last batch submitted by the sequencer.\n */\n function _getBatchExtraData()\n internal\n view\n returns (\n uint40,\n uint40\n )\n {\n bytes27 extraData = batches().getGlobalMetadata();\n\n uint40 totalElements;\n uint40 lastSequencerTimestamp;\n assembly {\n extraData := shr(40, extraData)\n totalElements := and(extraData, 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF)\n lastSequencerTimestamp := shr(40, and(extraData, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000))\n }\n\n return (\n totalElements,\n lastSequencerTimestamp\n );\n }\n\n /**\n * Encodes the batch context for the extra data.\n * @param _totalElements Total number of elements submitted.\n * @param _lastSequencerTimestamp Timestamp of the last batch submitted by the sequencer.\n * @return Encoded batch context.\n */\n function _makeBatchExtraData(\n uint40 _totalElements,\n uint40 _lastSequencerTimestamp\n )\n internal\n pure\n returns (\n bytes27\n )\n {\n bytes27 extraData;\n assembly {\n extraData := _totalElements\n extraData := or(extraData, shl(40, _lastSequencerTimestamp))\n extraData := shl(40, extraData)\n }\n\n return extraData;\n }\n\n /**\n * Appends a batch to the chain.\n * @param _batch Elements within the batch.\n * @param _extraData Any extra data to append to the batch.\n */\n function _appendBatch(\n bytes32[] memory _batch,\n bytes memory _extraData\n )\n internal\n {\n address sequencer = resolve(\"OVM_Sequencer\");\n (uint40 totalElements, uint40 lastSequencerTimestamp) = _getBatchExtraData();\n\n if (msg.sender == sequencer) {\n lastSequencerTimestamp = uint40(block.timestamp);\n } else {\n // We keep track of the last batch submitted by the sequencer so there's a window in\n // which only the sequencer can publish state roots. A window like this just reduces\n // the chance of \"system breaking\" state roots being published while we're still in\n // testing mode. This window should be removed or significantly reduced in the future.\n require(\n lastSequencerTimestamp + SEQUENCER_PUBLISH_WINDOW < block.timestamp,\n \"Cannot publish state roots within the sequencer publication window.\"\n );\n }\n\n Lib_OVMCodec.ChainBatchHeader memory batchHeader = Lib_OVMCodec.ChainBatchHeader({\n batchIndex: getTotalBatches(),\n batchRoot: Lib_MerkleTree.getMerkleRoot(_batch),\n batchSize: _batch.length,\n prevTotalElements: totalElements,\n extraData: _extraData\n });\n\n emit StateBatchAppended(\n batchHeader.batchIndex,\n batchHeader.batchRoot,\n batchHeader.batchSize,\n batchHeader.prevTotalElements,\n batchHeader.extraData\n );\n\n batches().push(\n Lib_OVMCodec.hashBatchHeader(batchHeader),\n _makeBatchExtraData(\n uint40(batchHeader.prevTotalElements + batchHeader.batchSize),\n lastSequencerTimestamp\n )\n );\n }\n\n /**\n * Removes a batch and all subsequent batches from the chain.\n * @param _batchHeader Header of the batch to remove.\n */\n function _deleteBatch(\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\n )\n internal\n {\n require(\n _batchHeader.batchIndex < batches().length(),\n \"Invalid batch index.\"\n );\n\n require(\n _isValidBatchHeader(_batchHeader),\n \"Invalid batch header.\"\n );\n\n batches().deleteElementsAfterInclusive(\n _batchHeader.batchIndex,\n _makeBatchExtraData(\n uint40(_batchHeader.prevTotalElements),\n 0\n )\n );\n\n emit StateBatchDeleted(\n _batchHeader.batchIndex,\n _batchHeader.batchRoot\n );\n }\n\n /**\n * Checks that a batch header matches the stored hash for the given index.\n * @param _batchHeader Batch header to validate.\n * @return Whether or not the header matches the stored one.\n */\n function _isValidBatchHeader(\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\n )\n internal\n view\n returns (\n bool\n )\n {\n return Lib_OVMCodec.hashBatchHeader(_batchHeader) == batches().get(_batchHeader.batchIndex);\n }\n}\n" - }, - "contracts/optimistic-ethereum/libraries/utils/Lib_MerkleTree.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.7.0;\n\n/**\n * @title Lib_MerkleTree\n * @author River Keefer\n */\nlibrary Lib_MerkleTree {\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Calculates a merkle root for a list of 32-byte leaf hashes. WARNING: If the number\n * of leaves passed in is not a power of two, it pads out the tree with zero hashes.\n * If you do not know the original length of elements for the tree you are verifying,\n * then this may allow empty leaves past _elements.length to pass a verification check down the line.\n * @param _elements Array of hashes from which to generate a merkle root.\n * @return Merkle root of the leaves, with zero hashes for non-powers-of-two (see above).\n */\n function getMerkleRoot(\n bytes32[] memory _elements\n )\n internal\n view\n returns (\n bytes32\n )\n {\n require(\n _elements.length > 0,\n \"Lib_MerkleTree: Must provide at least one leaf hash.\"\n );\n\n if (_elements.length == 0) {\n return _elements[0];\n }\n\n uint256[16] memory defaults = [\n 0x290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563,\n 0x633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d,\n 0x890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d,\n 0x3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd8,\n 0xecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da,\n 0xdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da5,\n 0x617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d7,\n 0x292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead,\n 0xe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e10,\n 0x7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f82,\n 0xe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e83636516,\n 0x3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c,\n 0xad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e,\n 0xa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab,\n 0x4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c862,\n 0x2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf10\n ];\n\n // Reserve memory space for our hashes.\n bytes memory buf = new bytes(64);\n\n // We'll need to keep track of left and right siblings.\n bytes32 leftSibling;\n bytes32 rightSibling;\n\n // Number of non-empty nodes at the current depth.\n uint256 rowSize = _elements.length;\n\n // Current depth, counting from 0 at the leaves\n uint256 depth = 0;\n\n // Common sub-expressions\n uint256 halfRowSize; // rowSize / 2\n bool rowSizeIsOdd; // rowSize % 2 == 1\n\n while (rowSize > 1) {\n halfRowSize = rowSize / 2;\n rowSizeIsOdd = rowSize % 2 == 1;\n\n for (uint256 i = 0; i < halfRowSize; i++) {\n leftSibling = _elements[(2 * i) ];\n rightSibling = _elements[(2 * i) + 1];\n assembly {\n mstore(add(buf, 32), leftSibling )\n mstore(add(buf, 64), rightSibling)\n }\n\n _elements[i] = keccak256(buf);\n }\n\n if (rowSizeIsOdd) {\n leftSibling = _elements[rowSize - 1];\n rightSibling = bytes32(defaults[depth]);\n assembly {\n mstore(add(buf, 32), leftSibling)\n mstore(add(buf, 64), rightSibling)\n }\n\n _elements[halfRowSize] = keccak256(buf);\n }\n\n rowSize = halfRowSize + (rowSizeIsOdd ? 1 : 0);\n depth++;\n }\n\n return _elements[0];\n }\n\n /**\n * Verifies a merkle branch for the given leaf hash. Assumes the original length\n * of leaves generated is a known, correct input, and does not return true for indices \n * extending past that index (even if _siblings would be otherwise valid.)\n * @param _root The Merkle root to verify against.\n * @param _leaf The leaf hash to verify inclusion of.\n * @param _index The index in the tree of this leaf.\n * @param _siblings Array of sibline nodes in the inclusion proof, starting from depth 0 (bottom of the tree). \n * @param _totalLeaves The total number of leaves originally passed into.\n * @return Whether or not the merkle branch and leaf passes verification.\n */\n function verify(\n bytes32 _root,\n bytes32 _leaf,\n uint256 _index,\n bytes32[] memory _siblings,\n uint256 _totalLeaves\n )\n internal\n pure\n returns (\n bool\n )\n {\n require(\n _totalLeaves > 0,\n \"Lib_MerkleTree: Total leaves must be greater than zero.\"\n );\n\n require(\n _index < _totalLeaves,\n \"Lib_MerkleTree: Index out of bounds.\"\n );\n\n require(\n _siblings.length == _ceilLog2(_totalLeaves),\n \"Lib_MerkleTree: Total siblings does not correctly correspond to total leaves.\"\n );\n\n bytes32 computedRoot = _leaf;\n\n for (uint256 i = 0; i < _siblings.length; i++) {\n if ((_index & 1) == 1) {\n computedRoot = keccak256(\n abi.encodePacked(\n _siblings[i],\n computedRoot\n )\n );\n } else {\n computedRoot = keccak256(\n abi.encodePacked(\n computedRoot,\n _siblings[i]\n )\n );\n }\n\n _index >>= 1;\n }\n\n return _root == computedRoot;\n }\n\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * Calculates the integer ceiling of the log base 2 of an input.\n * @param _in Unsigned input to calculate the log.\n * @return ceil(log_base_2(_in))\n */\n function _ceilLog2(\n uint256 _in\n )\n private\n pure\n returns (\n uint256\n )\n { \n require(\n _in > 0,\n \"Lib_MerkleTree: Cannot compute ceil(log_2) of 0.\"\n );\n\n if (_in == 1) {\n return 0;\n }\n\n // Find the highest set bit (will be floor(log_2)).\n // Borrowed with <3 from https://github.com/ethereum/solidity-examples\n uint256 val = _in;\n uint256 highest = 0;\n for (uint8 i = 128; i >= 1; i >>= 1) {\n if (val & (uint(1) << i) - 1 << i != 0) {\n highest += i;\n val >>= i;\n }\n }\n\n // Increment by one if this is not a perfect logarithm.\n if ((uint(1) << highest) != _in) {\n highest += 1;\n }\n\n return highest;\n }\n}\n" - }, - "contracts/optimistic-ethereum/iOVM/chain/iOVM_ChainStorageContainer.sol": { - "content": "pragma solidity ^0.7.0;\n\n/**\n * @title iOVM_ChainStorageContainer\n */\ninterface iOVM_ChainStorageContainer {\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\n * 27 bytes to store arbitrary data.\n * @param _globalMetadata New global metadata to set.\n */\n function setGlobalMetadata(\n bytes27 _globalMetadata\n )\n external;\n\n /**\n * Retrieves the container's global metadata field.\n * @return Container global metadata field.\n */\n function getGlobalMetadata()\n external\n view\n returns (\n bytes27\n );\n\n /**\n * Retrieves the number of objects stored in the container.\n * @return Number of objects in the container.\n */\n function length()\n external\n view\n returns (\n uint256\n );\n\n /**\n * Pushes an object into the container.\n * @param _object A 32 byte value to insert into the container.\n */\n function push(\n bytes32 _object\n )\n external;\n\n /**\n * Pushes an object into the container. Function allows setting the global metadata since\n * we'll need to touch the \"length\" storage slot anyway, which also contains the global\n * metadata (it's an optimization).\n * @param _object A 32 byte value to insert into the container.\n * @param _globalMetadata New global metadata for the container.\n */\n function push(\n bytes32 _object,\n bytes27 _globalMetadata\n )\n external;\n\n /**\n * Pushes two objects into the container at the same time. A useful optimization.\n * @param _objectA First 32 byte value to insert into the container.\n * @param _objectB Second 32 byte value to insert into the container.\n */\n function push2(\n bytes32 _objectA,\n bytes32 _objectB\n )\n external;\n\n /**\n * Pushes two objects into the container at the same time. Also allows setting the global\n * metadata field.\n * @param _objectA First 32 byte value to insert into the container.\n * @param _objectB Second 32 byte value to insert into the container.\n * @param _globalMetadata New global metadata for the container.\n */\n function push2(\n bytes32 _objectA,\n bytes32 _objectB,\n bytes27 _globalMetadata\n )\n external;\n\n /**\n * Retrieves an object from the container.\n * @param _index Index of the particular object to access.\n * @return 32 byte object value.\n */\n function get(\n uint256 _index\n )\n external\n view\n returns (\n bytes32\n );\n\n /**\n * Removes all objects after and including a given index.\n * @param _index Object index to delete from.\n */\n function deleteElementsAfterInclusive(\n uint256 _index\n )\n external;\n\n /**\n * Removes all objects after and including a given index. Also allows setting the global\n * metadata field.\n * @param _index Object index to delete from.\n * @param _globalMetadata New global metadata for the container.\n */\n function deleteElementsAfterInclusive(\n uint256 _index,\n bytes27 _globalMetadata\n )\n external;\n\n /**\n * Marks an index as overwritable, meaing the underlying buffer can start to write values over\n * any objects before and including the given index.\n */\n function setNextOverwritableIndex(\n uint256 _index\n )\n external;\n}\n" - }, - "@openzeppelin/contracts/math/SafeMath.sol": { - "content": "// SPDX-License-Identifier: MIT\n\npragma solidity >=0.6.0 <0.8.0;\n\n/**\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\n * checks.\n *\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\n * in bugs, because programmers usually assume that an overflow raises an\n * error, which is the standard behavior in high level programming languages.\n * `SafeMath` restores this intuition by reverting the transaction when an\n * operation overflows.\n *\n * Using this library instead of the unchecked operations eliminates an entire\n * class of bugs, so it's recommended to use it always.\n */\nlibrary SafeMath {\n /**\n * @dev Returns the addition of two unsigned integers, with an overflow flag.\n *\n * _Available since v3.4._\n */\n function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n uint256 c = a + b;\n if (c < a) return (false, 0);\n return (true, c);\n }\n\n /**\n * @dev Returns the substraction of two unsigned integers, with an overflow flag.\n *\n * _Available since v3.4._\n */\n function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n if (b > a) return (false, 0);\n return (true, a - b);\n }\n\n /**\n * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\n *\n * _Available since v3.4._\n */\n function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\n // benefit is lost if 'b' is also tested.\n // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\n if (a == 0) return (true, 0);\n uint256 c = a * b;\n if (c / a != b) return (false, 0);\n return (true, c);\n }\n\n /**\n * @dev Returns the division of two unsigned integers, with a division by zero flag.\n *\n * _Available since v3.4._\n */\n function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n if (b == 0) return (false, 0);\n return (true, a / b);\n }\n\n /**\n * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\n *\n * _Available since v3.4._\n */\n function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n if (b == 0) return (false, 0);\n return (true, a % b);\n }\n\n /**\n * @dev Returns the addition of two unsigned integers, reverting on\n * overflow.\n *\n * Counterpart to Solidity's `+` operator.\n *\n * Requirements:\n *\n * - Addition cannot overflow.\n */\n function add(uint256 a, uint256 b) internal pure returns (uint256) {\n uint256 c = a + b;\n require(c >= a, \"SafeMath: addition overflow\");\n return c;\n }\n\n /**\n * @dev Returns the subtraction of two unsigned integers, reverting on\n * overflow (when the result is negative).\n *\n * Counterpart to Solidity's `-` operator.\n *\n * Requirements:\n *\n * - Subtraction cannot overflow.\n */\n function sub(uint256 a, uint256 b) internal pure returns (uint256) {\n require(b <= a, \"SafeMath: subtraction overflow\");\n return a - b;\n }\n\n /**\n * @dev Returns the multiplication of two unsigned integers, reverting on\n * overflow.\n *\n * Counterpart to Solidity's `*` operator.\n *\n * Requirements:\n *\n * - Multiplication cannot overflow.\n */\n function mul(uint256 a, uint256 b) internal pure returns (uint256) {\n if (a == 0) return 0;\n uint256 c = a * b;\n require(c / a == b, \"SafeMath: multiplication overflow\");\n return c;\n }\n\n /**\n * @dev Returns the integer division of two unsigned integers, reverting on\n * division by zero. The result is rounded towards zero.\n *\n * Counterpart to Solidity's `/` operator. Note: this function uses a\n * `revert` opcode (which leaves remaining gas untouched) while Solidity\n * uses an invalid opcode to revert (consuming all remaining gas).\n *\n * Requirements:\n *\n * - The divisor cannot be zero.\n */\n function div(uint256 a, uint256 b) internal pure returns (uint256) {\n require(b > 0, \"SafeMath: division by zero\");\n return a / b;\n }\n\n /**\n * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\n * reverting when dividing by zero.\n *\n * Counterpart to Solidity's `%` operator. This function uses a `revert`\n * opcode (which leaves remaining gas untouched) while Solidity uses an\n * invalid opcode to revert (consuming all remaining gas).\n *\n * Requirements:\n *\n * - The divisor cannot be zero.\n */\n function mod(uint256 a, uint256 b) internal pure returns (uint256) {\n require(b > 0, \"SafeMath: modulo by zero\");\n return a % b;\n }\n\n /**\n * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\n * overflow (when the result is negative).\n *\n * CAUTION: This function is deprecated because it requires allocating memory for the error\n * message unnecessarily. For custom revert reasons use {trySub}.\n *\n * Counterpart to Solidity's `-` operator.\n *\n * Requirements:\n *\n * - Subtraction cannot overflow.\n */\n function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\n require(b <= a, errorMessage);\n return a - b;\n }\n\n /**\n * @dev Returns the integer division of two unsigned integers, reverting with custom message on\n * division by zero. The result is rounded towards zero.\n *\n * CAUTION: This function is deprecated because it requires allocating memory for the error\n * message unnecessarily. For custom revert reasons use {tryDiv}.\n *\n * Counterpart to Solidity's `/` operator. Note: this function uses a\n * `revert` opcode (which leaves remaining gas untouched) while Solidity\n * uses an invalid opcode to revert (consuming all remaining gas).\n *\n * Requirements:\n *\n * - The divisor cannot be zero.\n */\n function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\n require(b > 0, errorMessage);\n return a / b;\n }\n\n /**\n * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\n * reverting with custom message when dividing by zero.\n *\n * CAUTION: This function is deprecated because it requires allocating memory for the error\n * message unnecessarily. For custom revert reasons use {tryMod}.\n *\n * Counterpart to Solidity's `%` operator. This function uses a `revert`\n * opcode (which leaves remaining gas untouched) while Solidity uses an\n * invalid opcode to revert (consuming all remaining gas).\n *\n * Requirements:\n *\n * - The divisor cannot be zero.\n */\n function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\n require(b > 0, errorMessage);\n return a % b;\n }\n}\n" - }, - "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol": { - "content": "pragma solidity ^0.7.0;\n\n/* Library Imports */\nimport { Lib_RingBuffer } from \"../../libraries/utils/Lib_RingBuffer.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/* Interface Imports */\nimport { iOVM_ChainStorageContainer } from \"../../iOVM/chain/iOVM_ChainStorageContainer.sol\";\n\n/**\n * @title OVM_ChainStorageContainer\n */\ncontract OVM_ChainStorageContainer is iOVM_ChainStorageContainer, Lib_AddressResolver {\n\n /*************\n * Libraries *\n *************/\n\n using Lib_RingBuffer for Lib_RingBuffer.RingBuffer;\n\n\n /*************\n * Variables *\n *************/\n\n string public owner;\n Lib_RingBuffer.RingBuffer internal buffer;\n\n\n /***************\n * Constructor *\n ***************/\n \n /**\n * @param _libAddressManager Address of the Address Manager.\n * @param _owner Name of the contract that owns this container (will be resolved later).\n */\n constructor(\n address _libAddressManager,\n string memory _owner\n )\n Lib_AddressResolver(_libAddressManager)\n {\n owner = _owner;\n }\n\n\n /**********************\n * Function Modifiers *\n **********************/\n \n modifier onlyOwner() {\n require(\n msg.sender == resolve(owner),\n \"OVM_ChainStorageContainer: Function can only be called by the owner.\"\n );\n _;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @inheritdoc iOVM_ChainStorageContainer\n */\n function setGlobalMetadata(\n bytes27 _globalMetadata\n )\n override\n public\n onlyOwner\n {\n return buffer.setExtraData(_globalMetadata);\n }\n\n /**\n * @inheritdoc iOVM_ChainStorageContainer\n */\n function getGlobalMetadata()\n override\n public\n view\n returns (\n bytes27\n )\n {\n return buffer.getExtraData();\n }\n\n /**\n * @inheritdoc iOVM_ChainStorageContainer\n */\n function length()\n override\n public\n view\n returns (\n uint256\n )\n {\n return uint256(buffer.getLength());\n }\n\n /**\n * @inheritdoc iOVM_ChainStorageContainer\n */\n function push(\n bytes32 _object\n )\n override\n public\n onlyOwner\n {\n buffer.push(_object);\n }\n\n /**\n * @inheritdoc iOVM_ChainStorageContainer\n */\n function push(\n bytes32 _object,\n bytes27 _globalMetadata\n )\n override\n public\n onlyOwner\n {\n buffer.push(_object, _globalMetadata);\n }\n\n /**\n * @inheritdoc iOVM_ChainStorageContainer\n */\n function push2(\n bytes32 _objectA,\n bytes32 _objectB\n )\n override\n public\n onlyOwner\n {\n buffer.push2(_objectA, _objectB);\n }\n\n /**\n * @inheritdoc iOVM_ChainStorageContainer\n */\n function push2(\n bytes32 _objectA,\n bytes32 _objectB,\n bytes27 _globalMetadata\n )\n override\n public\n onlyOwner\n {\n buffer.push2(_objectA, _objectB, _globalMetadata);\n }\n\n /**\n * @inheritdoc iOVM_ChainStorageContainer\n */\n function get(\n uint256 _index\n )\n override\n public\n view\n returns (\n bytes32\n )\n {\n return buffer.get(uint40(_index));\n }\n \n /**\n * @inheritdoc iOVM_ChainStorageContainer\n */\n function deleteElementsAfterInclusive(\n uint256 _index\n )\n override\n public\n onlyOwner\n {\n buffer.deleteElementsAfterInclusive(\n uint40(_index)\n );\n }\n \n /**\n * @inheritdoc iOVM_ChainStorageContainer\n */\n function deleteElementsAfterInclusive(\n uint256 _index,\n bytes27 _globalMetadata\n )\n override\n public\n onlyOwner\n {\n buffer.deleteElementsAfterInclusive(\n uint40(_index),\n _globalMetadata\n );\n }\n\n /**\n * @inheritdoc iOVM_ChainStorageContainer\n */\n function setNextOverwritableIndex(\n uint256 _index\n )\n override\n public\n onlyOwner\n {\n buffer.nextOverwritableIndex = _index;\n }\n}\n" - }, - "contracts/optimistic-ethereum/libraries/utils/Lib_RingBuffer.sol": { - "content": "pragma solidity ^0.7.0;\n\nlibrary Lib_RingBuffer {\n using Lib_RingBuffer for RingBuffer;\n\n /***********\n * Structs *\n ***********/\n\n struct Buffer {\n uint256 length;\n mapping (uint256 => bytes32) buf;\n }\n\n struct RingBuffer {\n bytes32 contextA;\n bytes32 contextB;\n Buffer bufferA;\n Buffer bufferB;\n uint256 nextOverwritableIndex;\n }\n\n struct RingBufferContext {\n // contextA\n uint40 globalIndex;\n bytes27 extraData;\n\n // contextB\n uint64 currBufferIndex;\n uint40 prevResetIndex;\n uint40 currResetIndex;\n }\n\n\n /*************\n * Constants *\n *************/\n\n uint256 constant MIN_CAPACITY = 16;\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Pushes a single element to the buffer.\n * @param _self Buffer to access.\n * @param _value Value to push to the buffer.\n * @param _extraData Optional global extra data.\n */\n function push(\n RingBuffer storage _self,\n bytes32 _value,\n bytes27 _extraData\n )\n internal\n {\n RingBufferContext memory ctx = _self.getContext();\n Buffer storage currBuffer = _self.getBuffer(ctx.currBufferIndex);\n\n // Set a minimum capacity.\n if (currBuffer.length == 0) {\n currBuffer.length = MIN_CAPACITY;\n }\n\n // Check if we need to expand the buffer.\n if (ctx.globalIndex - ctx.currResetIndex >= currBuffer.length) {\n if (ctx.currResetIndex < _self.nextOverwritableIndex) {\n // We're going to overwrite the inactive buffer.\n // Bump the buffer index, reset the delete offset, and set our reset indices.\n ctx.currBufferIndex++;\n ctx.prevResetIndex = ctx.currResetIndex;\n ctx.currResetIndex = ctx.globalIndex;\n\n // Swap over to the next buffer.\n currBuffer = _self.getBuffer(ctx.currBufferIndex);\n } else {\n // We're not overwriting yet, double the length of the current buffer.\n currBuffer.length *= 2;\n }\n }\n\n // Index to write to is the difference of the global and reset indices.\n uint256 writeHead = ctx.globalIndex - ctx.currResetIndex;\n currBuffer.buf[writeHead] = _value;\n\n // Bump the global index and insert our extra data, then save the context.\n ctx.globalIndex++;\n ctx.extraData = _extraData;\n _self.setContext(ctx);\n }\n\n /**\n * Pushes a single element to the buffer.\n * @param _self Buffer to access.\n * @param _value Value to push to the buffer.\n */\n function push(\n RingBuffer storage _self,\n bytes32 _value\n )\n internal\n {\n RingBufferContext memory ctx = _self.getContext();\n \n _self.push(\n _value,\n ctx.extraData\n );\n }\n\n /**\n * Pushes a two elements to the buffer.\n * @param _self Buffer to access.\n * @param _valueA First value to push to the buffer.\n * @param _valueA Second value to push to the buffer.\n * @param _extraData Optional global extra data.\n */\n function push2(\n RingBuffer storage _self,\n bytes32 _valueA,\n bytes32 _valueB,\n bytes27 _extraData\n )\n internal\n {\n _self.push(_valueA, _extraData);\n _self.push(_valueB, _extraData);\n }\n\n /**\n * Pushes a two elements to the buffer.\n * @param _self Buffer to access.\n * @param _valueA First value to push to the buffer.\n * @param _valueA Second value to push to the buffer.\n */\n function push2(\n RingBuffer storage _self,\n bytes32 _valueA,\n bytes32 _valueB\n )\n internal\n {\n RingBufferContext memory ctx = _self.getContext();\n\n _self.push2(\n _valueA,\n _valueB,\n ctx.extraData\n );\n }\n\n /**\n * Retrieves an element from the buffer.\n * @param _self Buffer to access.\n * @param _index Element index to retrieve.\n * @return Value of the element at the given index.\n */\n function get(\n RingBuffer storage _self,\n uint256 _index\n )\n internal\n view\n returns (\n bytes32 \n )\n {\n RingBufferContext memory ctx = _self.getContext();\n\n require(\n _index < ctx.globalIndex,\n \"Index out of bounds.\"\n );\n\n Buffer storage currBuffer = _self.getBuffer(ctx.currBufferIndex);\n Buffer storage prevBuffer = _self.getBuffer(ctx.currBufferIndex + 1);\n\n if (_index >= ctx.currResetIndex) {\n // We're trying to load an element from the current buffer.\n // Relative index is just the difference from the reset index.\n uint256 relativeIndex = _index - ctx.currResetIndex;\n\n // Shouldn't happen but why not check.\n require(\n relativeIndex < currBuffer.length,\n \"Index out of bounds.\"\n );\n\n return currBuffer.buf[relativeIndex];\n } else {\n // We're trying to load an element from the previous buffer.\n // Relative index is the difference from the reset index in the other direction.\n uint256 relativeIndex = ctx.currResetIndex - _index;\n\n // Condition only fails in the case that we deleted and flipped buffers.\n require(\n ctx.currResetIndex > ctx.prevResetIndex,\n \"Index out of bounds.\"\n );\n\n // Make sure we're not trying to read beyond the array.\n require(\n relativeIndex <= prevBuffer.length,\n \"Index out of bounds.\"\n );\n\n return prevBuffer.buf[prevBuffer.length - relativeIndex];\n }\n }\n\n /**\n * Deletes all elements after (and including) a given index.\n * @param _self Buffer to access.\n * @param _index Index of the element to delete from (inclusive).\n * @param _extraData Optional global extra data.\n */\n function deleteElementsAfterInclusive(\n RingBuffer storage _self,\n uint40 _index,\n bytes27 _extraData\n )\n internal\n {\n RingBufferContext memory ctx = _self.getContext();\n\n require(\n _index < ctx.globalIndex && _index >= ctx.prevResetIndex,\n \"Index out of bounds.\"\n );\n\n Buffer storage currBuffer = _self.getBuffer(ctx.currBufferIndex);\n Buffer storage prevBuffer = _self.getBuffer(ctx.currBufferIndex + 1);\n\n if (_index < ctx.currResetIndex) {\n // We're switching back to the previous buffer.\n // Reduce the buffer index, set the current reset index back to match the previous one.\n // We use the equality of these two values to prevent reading beyond this buffer.\n ctx.currBufferIndex--;\n ctx.currResetIndex = ctx.prevResetIndex;\n }\n\n // Set our global index and extra data, save the context.\n ctx.globalIndex = _index;\n ctx.extraData = _extraData;\n _self.setContext(ctx);\n }\n\n /**\n * Deletes all elements after (and including) a given index.\n * @param _self Buffer to access.\n * @param _index Index of the element to delete from (inclusive).\n */\n function deleteElementsAfterInclusive(\n RingBuffer storage _self,\n uint40 _index\n )\n internal\n {\n RingBufferContext memory ctx = _self.getContext();\n _self.deleteElementsAfterInclusive(\n _index,\n ctx.extraData\n );\n }\n\n /**\n * Retrieves the current global index.\n * @param _self Buffer to access.\n * @return Current global index.\n */\n function getLength(\n RingBuffer storage _self\n )\n internal\n view\n returns (\n uint40\n )\n {\n RingBufferContext memory ctx = _self.getContext();\n return ctx.globalIndex;\n }\n\n /**\n * Changes current global extra data.\n * @param _self Buffer to access.\n * @param _extraData New global extra data.\n */\n function setExtraData(\n RingBuffer storage _self,\n bytes27 _extraData\n )\n internal\n {\n RingBufferContext memory ctx = _self.getContext();\n ctx.extraData = _extraData;\n _self.setContext(ctx);\n }\n\n /**\n * Retrieves the current global extra data.\n * @param _self Buffer to access.\n * @return Current global extra data.\n */\n function getExtraData(\n RingBuffer storage _self\n )\n internal\n view\n returns (\n bytes27\n )\n {\n RingBufferContext memory ctx = _self.getContext();\n return ctx.extraData;\n }\n\n /**\n * Sets the current ring buffer context.\n * @param _self Buffer to access.\n * @param _ctx Current ring buffer context.\n */\n function setContext(\n RingBuffer storage _self,\n RingBufferContext memory _ctx\n )\n internal\n returns (\n bytes32\n )\n {\n bytes32 contextA;\n bytes32 contextB;\n\n uint40 globalIndex = _ctx.globalIndex;\n bytes27 extraData = _ctx.extraData;\n assembly {\n contextA := globalIndex\n contextA := or(contextA, extraData)\n }\n\n uint64 currBufferIndex = _ctx.currBufferIndex;\n uint40 prevResetIndex = _ctx.prevResetIndex;\n uint40 currResetIndex = _ctx.currResetIndex;\n assembly {\n contextB := currBufferIndex\n contextB := or(contextB, shl(64, prevResetIndex))\n contextB := or(contextB, shl(104, currResetIndex))\n }\n\n if (_self.contextA != contextA) {\n _self.contextA = contextA;\n }\n\n if (_self.contextB != contextB) {\n _self.contextB = contextB;\n }\n }\n\n /**\n * Retrieves the current ring buffer context.\n * @param _self Buffer to access.\n * @return Current ring buffer context.\n */\n function getContext(\n RingBuffer storage _self\n )\n internal\n view\n returns (\n RingBufferContext memory\n )\n {\n bytes32 contextA = _self.contextA;\n bytes32 contextB = _self.contextB;\n\n uint40 globalIndex;\n bytes27 extraData;\n assembly {\n globalIndex := and(contextA, 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF)\n extraData := and(contextA, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000)\n }\n\n uint64 currBufferIndex;\n uint40 prevResetIndex;\n uint40 currResetIndex;\n assembly {\n currBufferIndex := and(contextB, 0x000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF)\n prevResetIndex := shr(64, and(contextB, 0x00000000000000000000000000000000000000FFFFFFFFFF0000000000000000))\n currResetIndex := shr(104, and(contextB, 0x0000000000000000000000000000FFFFFFFFFF00000000000000000000000000))\n }\n\n return RingBufferContext({\n globalIndex: globalIndex,\n extraData: extraData,\n currBufferIndex: currBufferIndex,\n prevResetIndex: prevResetIndex,\n currResetIndex: currResetIndex\n });\n }\n\n /**\n * Retrieves the a buffer from the ring buffer by index.\n * @param _self Buffer to access.\n * @param _which Index of the sub buffer to access.\n * @return Sub buffer for the index.\n */\n function getBuffer(\n RingBuffer storage _self,\n uint256 _which\n )\n internal\n view\n returns (\n Buffer storage\n )\n {\n return _which % 2 == 0 ? _self.bufferA : _self.bufferB;\n }\n}\n" - }, - "contracts/test-libraries/utils/TestLib_RingBuffer.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.7.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_RingBuffer } from \"../../optimistic-ethereum/libraries/utils/Lib_RingBuffer.sol\";\n\n/**\n * @title TestLib_RingBuffer\n */\ncontract TestLib_RingBuffer {\n using Lib_RingBuffer for Lib_RingBuffer.RingBuffer;\n \n Lib_RingBuffer.RingBuffer internal buf;\n\n function push(\n bytes32 _value,\n bytes27 _extraData\n )\n public\n {\n buf.push(\n _value,\n _extraData\n );\n }\n\n function push2(\n bytes32 _valueA,\n bytes32 _valueB,\n bytes27 _extraData\n )\n public\n {\n buf.push2(\n _valueA,\n _valueB,\n _extraData\n );\n }\n\n function get(\n uint256 _index\n )\n public\n view\n returns (\n bytes32 \n )\n {\n return buf.get(_index);\n }\n\n function deleteElementsAfterInclusive(\n uint40 _index,\n bytes27 _extraData\n )\n internal\n {\n return buf.deleteElementsAfterInclusive(\n _index,\n _extraData\n );\n }\n\n function getLength()\n internal\n view\n returns (\n uint40\n )\n {\n return buf.getLength();\n }\n\n function getExtraData()\n internal\n view\n returns (\n bytes27\n )\n {\n return buf.getExtraData();\n }\n}\n" - }, - "contracts/optimistic-ethereum/OVM/chain/OVM_CanonicalTransactionChain.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.7.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\nimport { Lib_MerkleTree } from \"../../libraries/utils/Lib_MerkleTree.sol\";\nimport { Lib_Math } from \"../../libraries/utils/Lib_Math.sol\";\n\n/* Interface Imports */\nimport { iOVM_CanonicalTransactionChain } from \"../../iOVM/chain/iOVM_CanonicalTransactionChain.sol\";\nimport { iOVM_ChainStorageContainer } from \"../../iOVM/chain/iOVM_ChainStorageContainer.sol\";\n\n/* Contract Imports */\nimport { OVM_ExecutionManager } from \"../execution/OVM_ExecutionManager.sol\";\n\n\n/**\n * @title OVM_CanonicalTransactionChain\n */\ncontract OVM_CanonicalTransactionChain is iOVM_CanonicalTransactionChain, Lib_AddressResolver {\n\n /*************\n * Constants *\n *************/\n\n // L2 tx gas-related\n uint256 constant public MIN_ROLLUP_TX_GAS = 100000;\n uint256 constant public MAX_ROLLUP_TX_SIZE = 10000;\n uint256 constant public L2_GAS_DISCOUNT_DIVISOR = 32;\n\n // Encoding-related (all in bytes)\n uint256 constant internal BATCH_CONTEXT_SIZE = 16;\n uint256 constant internal BATCH_CONTEXT_LENGTH_POS = 12;\n uint256 constant internal BATCH_CONTEXT_START_POS = 15;\n uint256 constant internal TX_DATA_HEADER_SIZE = 3;\n uint256 constant internal BYTES_TILL_TX_DATA = 65;\n\n\n /*************\n * Variables *\n *************/\n\n uint256 public forceInclusionPeriodSeconds;\n uint256 public forceInclusionPeriodBlocks;\n uint256 public maxTransactionGasLimit;\n\n\n /***************\n * Constructor *\n ***************/\n\n constructor(\n address _libAddressManager,\n uint256 _forceInclusionPeriodSeconds,\n uint256 _forceInclusionPeriodBlocks,\n uint256 _maxTransactionGasLimit\n )\n Lib_AddressResolver(_libAddressManager)\n {\n forceInclusionPeriodSeconds = _forceInclusionPeriodSeconds;\n forceInclusionPeriodBlocks = _forceInclusionPeriodBlocks;\n maxTransactionGasLimit = _maxTransactionGasLimit;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Accesses the batch storage container.\n * @return Reference to the batch storage container.\n */\n function batches()\n public\n view\n returns (\n iOVM_ChainStorageContainer\n )\n {\n return iOVM_ChainStorageContainer(\n resolve(\"OVM_ChainStorageContainer:CTC:batches\")\n );\n }\n\n /**\n * Accesses the queue storage container.\n * @return Reference to the queue storage container.\n */\n function queue()\n public\n view\n returns (\n iOVM_ChainStorageContainer\n )\n {\n return iOVM_ChainStorageContainer(\n resolve(\"OVM_ChainStorageContainer:CTC:queue\")\n );\n }\n\n /**\n * @inheritdoc iOVM_CanonicalTransactionChain\n */\n function getTotalElements()\n override\n public\n view\n returns (\n uint256 _totalElements\n )\n {\n (uint40 totalElements,,,) = _getBatchExtraData();\n return uint256(totalElements);\n }\n\n /**\n * @inheritdoc iOVM_CanonicalTransactionChain\n */\n function getTotalBatches()\n override\n public\n view\n returns (\n uint256 _totalBatches\n )\n {\n return batches().length();\n }\n\n /**\n * @inheritdoc iOVM_CanonicalTransactionChain\n */\n function getNextQueueIndex()\n override\n public\n view\n returns (\n uint40\n )\n {\n (, uint40 nextQueueIndex,,) = _getBatchExtraData();\n return nextQueueIndex;\n }\n\n /**\n * @inheritdoc iOVM_CanonicalTransactionChain\n */\n function getQueueElement(\n uint256 _index\n )\n override\n public\n view\n returns (\n Lib_OVMCodec.QueueElement memory _element\n )\n {\n uint40 trueIndex = uint40(_index * 2);\n bytes32 queueRoot = queue().get(trueIndex);\n bytes32 timestampAndBlockNumber = queue().get(trueIndex + 1);\n\n uint40 elementTimestamp;\n uint40 elementBlockNumber;\n assembly {\n elementTimestamp := and(timestampAndBlockNumber, 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF)\n elementBlockNumber := shr(40, and(timestampAndBlockNumber, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000))\n }\n\n return Lib_OVMCodec.QueueElement({\n queueRoot: queueRoot,\n timestamp: elementTimestamp,\n blockNumber: elementBlockNumber\n });\n }\n\n /**\n * @inheritdoc iOVM_CanonicalTransactionChain\n */\n function getNumPendingQueueElements()\n override\n public\n view\n returns (\n uint40\n )\n {\n return getQueueLength() - getNextQueueIndex();\n }\n\n /**\n * @inheritdoc iOVM_CanonicalTransactionChain\n */\n function getQueueLength()\n override\n public\n view\n returns (\n uint40\n )\n {\n // The underlying queue data structure stores 2 elements\n // per insertion, so to get the real queue length we need\n // to divide by 2. See the usage of `push2(..)`.\n return uint40(queue().length() / 2);\n }\n\n /**\n * @inheritdoc iOVM_CanonicalTransactionChain\n */\n function enqueue(\n address _target,\n uint256 _gasLimit,\n bytes memory _data\n )\n override\n public\n {\n require(\n _data.length <= MAX_ROLLUP_TX_SIZE,\n \"Transaction data size exceeds maximum for rollup transaction.\"\n );\n\n require(\n _gasLimit <= maxTransactionGasLimit,\n \"Transaction gas limit exceeds maximum for rollup transaction.\"\n );\n\n require(\n _gasLimit >= MIN_ROLLUP_TX_GAS,\n \"Transaction gas limit too low to enqueue.\"\n );\n\n // We need to consume some amount of L1 gas in order to rate limit transactions going into\n // L2. However, L2 is cheaper than L1 so we only need to burn some small proportion of the\n // provided L1 gas.\n uint256 gasToConsume = _gasLimit/L2_GAS_DISCOUNT_DIVISOR;\n uint256 startingGas = gasleft();\n\n // Although this check is not necessary (burn below will run out of gas if not true), it\n // gives the user an explicit reason as to why the enqueue attempt failed.\n require(\n startingGas > gasToConsume,\n \"Insufficient gas for L2 rate limiting burn.\"\n );\n\n // Here we do some \"dumb\" work in order to burn gas, although we should probably replace\n // this with something like minting gas token later on.\n uint256 i;\n while(startingGas - gasleft() < gasToConsume) {\n i++;\n }\n\n bytes32 transactionHash = keccak256(\n abi.encode(\n msg.sender,\n _target,\n _gasLimit,\n _data\n )\n );\n\n bytes32 timestampAndBlockNumber;\n assembly {\n timestampAndBlockNumber := timestamp()\n timestampAndBlockNumber := or(timestampAndBlockNumber, shl(40, number()))\n }\n\n queue().push2(\n transactionHash,\n timestampAndBlockNumber\n );\n\n uint256 queueIndex = queue().length() / 2;\n emit TransactionEnqueued(\n msg.sender,\n _target,\n _gasLimit,\n _data,\n queueIndex - 1,\n block.timestamp\n );\n }\n\n /**\n * @inheritdoc iOVM_CanonicalTransactionChain\n */\n function appendQueueBatch(\n uint256 _numQueuedTransactions\n )\n override\n public\n {\n // Disable `appendQueueBatch` for minnet\n revert(\"appendQueueBatch is currently disabled.\");\n\n _numQueuedTransactions = Lib_Math.min(_numQueuedTransactions, getNumPendingQueueElements());\n require(\n _numQueuedTransactions > 0,\n \"Must append more than zero transactions.\"\n );\n\n bytes32[] memory leaves = new bytes32[](_numQueuedTransactions);\n uint40 nextQueueIndex = getNextQueueIndex();\n\n for (uint256 i = 0; i < _numQueuedTransactions; i++) {\n if (msg.sender != resolve(\"OVM_Sequencer\")) {\n Lib_OVMCodec.QueueElement memory el = getQueueElement(nextQueueIndex);\n require(\n el.timestamp + forceInclusionPeriodSeconds < block.timestamp,\n \"Queue transactions cannot be submitted during the sequencer inclusion period.\"\n );\n }\n leaves[i] = _getQueueLeafHash(nextQueueIndex);\n nextQueueIndex++;\n }\n\n Lib_OVMCodec.QueueElement memory lastElement = getQueueElement(nextQueueIndex - 1);\n\n _appendBatch(\n Lib_MerkleTree.getMerkleRoot(leaves),\n _numQueuedTransactions,\n _numQueuedTransactions,\n lastElement.timestamp,\n lastElement.blockNumber\n );\n\n emit QueueBatchAppended(\n nextQueueIndex - _numQueuedTransactions,\n _numQueuedTransactions,\n getTotalElements()\n );\n }\n\n /**\n * @inheritdoc iOVM_CanonicalTransactionChain\n */\n function appendSequencerBatch()\n override\n public\n {\n uint40 shouldStartAtElement;\n uint24 totalElementsToAppend;\n uint24 numContexts;\n assembly {\n shouldStartAtElement := shr(216, calldataload(4))\n totalElementsToAppend := shr(232, calldataload(9))\n numContexts := shr(232, calldataload(12))\n }\n\n require(\n shouldStartAtElement == getTotalElements(),\n \"Actual batch start index does not match expected start index.\"\n );\n\n require(\n msg.sender == resolve(\"OVM_Sequencer\"),\n \"Function can only be called by the Sequencer.\"\n );\n\n require(\n numContexts > 0,\n \"Must provide at least one batch context.\"\n );\n\n require(\n totalElementsToAppend > 0,\n \"Must append at least one element.\"\n );\n\n uint40 nextTransactionPtr = uint40(BATCH_CONTEXT_START_POS + BATCH_CONTEXT_SIZE * numContexts);\n uint256 calldataSize;\n assembly {\n calldataSize := calldatasize()\n }\n\n require(\n calldataSize >= nextTransactionPtr,\n \"Not enough BatchContexts provided.\"\n );\n\n // Get queue length for future comparison/\n uint40 queueLength = getQueueLength();\n\n // Initialize the array of canonical chain leaves that we will append.\n bytes32[] memory leaves = new bytes32[](totalElementsToAppend);\n // Each leaf index corresponds to a tx, either sequenced or enqueued.\n uint32 leafIndex = 0;\n // Counter for number of sequencer transactions appended so far.\n uint32 numSequencerTransactions = 0;\n // We will sequentially append leaves which are pointers to the queue.\n // The initial queue index is what is currently in storage.\n uint40 nextQueueIndex = getNextQueueIndex();\n\n BatchContext memory curContext;\n\n for (uint32 i = 0; i < numContexts; i++) {\n BatchContext memory nextContext = _getBatchContext(i);\n if (i == 0) {\n _validateFirstBatchContext(nextContext);\n }\n _validateNextBatchContext(curContext, nextContext, nextQueueIndex);\n\n curContext = nextContext;\n\n for (uint32 j = 0; j < curContext.numSequencedTransactions; j++) {\n uint256 txDataLength;\n assembly {\n txDataLength := shr(232, calldataload(nextTransactionPtr))\n }\n\n leaves[leafIndex] = _getSequencerLeafHash(curContext, nextTransactionPtr, txDataLength);\n nextTransactionPtr += uint40(TX_DATA_HEADER_SIZE + txDataLength);\n numSequencerTransactions++;\n leafIndex++;\n }\n\n for (uint32 j = 0; j < curContext.numSubsequentQueueTransactions; j++) {\n require(nextQueueIndex < queueLength, \"Not enough queued transactions to append.\");\n leaves[leafIndex] = _getQueueLeafHash(nextQueueIndex);\n nextQueueIndex++;\n leafIndex++;\n }\n }\n\n _validateFinalBatchContext(curContext);\n\n require(\n calldataSize == nextTransactionPtr,\n \"Not all sequencer transactions were processed.\"\n );\n\n require(\n leafIndex == totalElementsToAppend,\n \"Actual transaction index does not match expected total elements to append.\"\n );\n\n // Generate the required metadata that we need to append this batch\n uint40 numQueuedTransactions = totalElementsToAppend - numSequencerTransactions;\n uint40 timestamp;\n uint40 blockNumber;\n if (curContext.numSubsequentQueueTransactions == 0) {\n // The last element is a sequencer tx, therefore pull timestamp and block number from the last context.\n timestamp = uint40(curContext.timestamp);\n blockNumber = uint40(curContext.blockNumber);\n } else {\n // The last element is a queue tx, therefore pull timestamp and block number from the queue element.\n Lib_OVMCodec.QueueElement memory lastElement = getQueueElement(nextQueueIndex - 1);\n timestamp = lastElement.timestamp;\n blockNumber = lastElement.blockNumber;\n }\n\n _appendBatch(\n Lib_MerkleTree.getMerkleRoot(leaves),\n totalElementsToAppend,\n numQueuedTransactions,\n timestamp,\n blockNumber\n );\n\n emit SequencerBatchAppended(\n nextQueueIndex - numQueuedTransactions,\n numQueuedTransactions,\n getTotalElements()\n );\n }\n\n /**\n * @inheritdoc iOVM_CanonicalTransactionChain\n */\n function verifyTransaction(\n Lib_OVMCodec.Transaction memory _transaction,\n Lib_OVMCodec.TransactionChainElement memory _txChainElement,\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _inclusionProof\n )\n override\n public\n view\n returns (\n bool\n )\n {\n if (_txChainElement.isSequenced == true) {\n return _verifySequencerTransaction(\n _transaction,\n _txChainElement,\n _batchHeader,\n _inclusionProof\n );\n } else {\n return _verifyQueueTransaction(\n _transaction,\n _txChainElement.queueIndex,\n _batchHeader,\n _inclusionProof\n );\n }\n }\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Returns the BatchContext located at a particular index.\n * @param _index The index of the BatchContext\n * @return The BatchContext at the specified index.\n */\n function _getBatchContext(\n uint256 _index\n )\n internal\n pure\n returns (\n BatchContext memory\n )\n {\n uint256 contextPtr = 15 + _index * BATCH_CONTEXT_SIZE;\n uint256 numSequencedTransactions;\n uint256 numSubsequentQueueTransactions;\n uint256 ctxTimestamp;\n uint256 ctxBlockNumber;\n\n assembly {\n numSequencedTransactions := shr(232, calldataload(contextPtr))\n numSubsequentQueueTransactions := shr(232, calldataload(add(contextPtr, 3)))\n ctxTimestamp := shr(216, calldataload(add(contextPtr, 6)))\n ctxBlockNumber := shr(216, calldataload(add(contextPtr, 11)))\n }\n\n return BatchContext({\n numSequencedTransactions: numSequencedTransactions,\n numSubsequentQueueTransactions: numSubsequentQueueTransactions,\n timestamp: ctxTimestamp,\n blockNumber: ctxBlockNumber\n });\n }\n\n /**\n * Parses the batch context from the extra data.\n * @return Total number of elements submitted.\n * @return Index of the next queue element.\n */\n function _getBatchExtraData()\n internal\n view\n returns (\n uint40,\n uint40,\n uint40,\n uint40\n )\n {\n bytes27 extraData = batches().getGlobalMetadata();\n\n uint40 totalElements;\n uint40 nextQueueIndex;\n uint40 lastTimestamp;\n uint40 lastBlockNumber;\n assembly {\n extraData := shr(40, extraData)\n totalElements := and(extraData, 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF)\n nextQueueIndex := shr(40, and(extraData, 0x00000000000000000000000000000000000000000000FFFFFFFFFF0000000000))\n lastTimestamp := shr(80, and(extraData, 0x0000000000000000000000000000000000FFFFFFFFFF00000000000000000000))\n lastBlockNumber := shr(120, and(extraData, 0x000000000000000000000000FFFFFFFFFF000000000000000000000000000000))\n }\n\n return (\n totalElements,\n nextQueueIndex,\n lastTimestamp,\n lastBlockNumber\n );\n }\n\n /**\n * Encodes the batch context for the extra data.\n * @param _totalElements Total number of elements submitted.\n * @param _nextQueueIndex Index of the next queue element.\n * @param _timestamp Timestamp for the last batch.\n * @param _blockNumber Block number of the last batch.\n * @return Encoded batch context.\n */\n function _makeBatchExtraData(\n uint40 _totalElements,\n uint40 _nextQueueIndex,\n uint40 _timestamp,\n uint40 _blockNumber\n )\n internal\n pure\n returns (\n bytes27\n )\n {\n bytes27 extraData;\n assembly {\n extraData := _totalElements\n extraData := or(extraData, shl(40, _nextQueueIndex))\n extraData := or(extraData, shl(80, _timestamp))\n extraData := or(extraData, shl(120, _blockNumber))\n extraData := shl(40, extraData)\n }\n\n return extraData;\n }\n\n /**\n * Retrieves the hash of a queue element.\n * @param _index Index of the queue element to retrieve a hash for.\n * @return Hash of the queue element.\n */\n function _getQueueLeafHash(\n uint256 _index\n )\n internal\n view\n returns (\n bytes32\n )\n {\n return _hashTransactionChainElement(\n Lib_OVMCodec.TransactionChainElement({\n isSequenced: false,\n queueIndex: _index,\n timestamp: 0,\n blockNumber: 0,\n txData: hex\"\"\n })\n );\n }\n\n /**\n * Retrieves the length of the queue.\n * @return Length of the queue.\n */\n function _getQueueLength()\n internal\n view\n returns (\n uint40\n )\n {\n // The underlying queue data structure stores 2 elements\n // per insertion, so to get the real queue length we need\n // to divide by 2. See the usage of `push2(..)`.\n return uint40(queue().length() / 2);\n }\n\n /**\n * Retrieves the hash of a sequencer element.\n * @param _context Batch context for the given element.\n * @param _nextTransactionPtr Pointer to the next transaction in the calldata.\n * @param _txDataLength Length of the transaction item.\n * @return Hash of the sequencer element.\n */\n function _getSequencerLeafHash(\n BatchContext memory _context,\n uint256 _nextTransactionPtr,\n uint256 _txDataLength\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n\n bytes memory chainElement = new bytes(BYTES_TILL_TX_DATA + _txDataLength);\n uint256 ctxTimestamp = _context.timestamp;\n uint256 ctxBlockNumber = _context.blockNumber;\n\n bytes32 leafHash;\n assembly {\n let chainElementStart := add(chainElement, 0x20)\n\n // Set the first byte equal to `1` to indicate this is a sequencer chain element.\n // This distinguishes sequencer ChainElements from queue ChainElements because\n // all queue ChainElements are ABI encoded and the first byte of ABI encoded\n // elements is always zero\n mstore8(chainElementStart, 1)\n\n mstore(add(chainElementStart, 1), ctxTimestamp)\n mstore(add(chainElementStart, 33), ctxBlockNumber)\n\n calldatacopy(add(chainElementStart, BYTES_TILL_TX_DATA), add(_nextTransactionPtr, 3), _txDataLength)\n\n leafHash := keccak256(chainElementStart, add(BYTES_TILL_TX_DATA, _txDataLength))\n }\n\n return leafHash;\n }\n\n /**\n * Retrieves the hash of a sequencer element.\n * @param _txChainElement The chain element which is hashed to calculate the leaf.\n * @return Hash of the sequencer element.\n */\n function _getSequencerLeafHash(\n Lib_OVMCodec.TransactionChainElement memory _txChainElement\n )\n internal\n view\n returns(\n bytes32\n )\n {\n bytes memory txData = _txChainElement.txData;\n uint256 txDataLength = _txChainElement.txData.length;\n\n bytes memory chainElement = new bytes(BYTES_TILL_TX_DATA + txDataLength);\n uint256 ctxTimestamp = _txChainElement.timestamp;\n uint256 ctxBlockNumber = _txChainElement.blockNumber;\n\n bytes32 leafHash;\n assembly {\n let chainElementStart := add(chainElement, 0x20)\n\n // Set the first byte equal to `1` to indicate this is a sequencer chain element.\n // This distinguishes sequencer ChainElements from queue ChainElements because\n // all queue ChainElements are ABI encoded and the first byte of ABI encoded\n // elements is always zero\n mstore8(chainElementStart, 1)\n\n mstore(add(chainElementStart, 1), ctxTimestamp)\n mstore(add(chainElementStart, 33), ctxBlockNumber)\n\n pop(staticcall(gas(), 0x04, add(txData, 0x20), txDataLength, add(chainElementStart, BYTES_TILL_TX_DATA), txDataLength))\n\n leafHash := keccak256(chainElementStart, add(BYTES_TILL_TX_DATA, txDataLength))\n }\n\n return leafHash;\n }\n\n /**\n * Inserts a batch into the chain of batches.\n * @param _transactionRoot Root of the transaction tree for this batch.\n * @param _batchSize Number of elements in the batch.\n * @param _numQueuedTransactions Number of queue transactions in the batch.\n * @param _timestamp The latest batch timestamp.\n * @param _blockNumber The latest batch blockNumber.\n */\n function _appendBatch(\n bytes32 _transactionRoot,\n uint256 _batchSize,\n uint256 _numQueuedTransactions,\n uint40 _timestamp,\n uint40 _blockNumber\n )\n internal\n {\n (uint40 totalElements, uint40 nextQueueIndex, uint40 lastTimestamp, uint40 lastBlockNumber) = _getBatchExtraData();\n\n Lib_OVMCodec.ChainBatchHeader memory header = Lib_OVMCodec.ChainBatchHeader({\n batchIndex: batches().length(),\n batchRoot: _transactionRoot,\n batchSize: _batchSize,\n prevTotalElements: totalElements,\n extraData: hex\"\"\n });\n\n emit TransactionBatchAppended(\n header.batchIndex,\n header.batchRoot,\n header.batchSize,\n header.prevTotalElements,\n header.extraData\n );\n\n bytes32 batchHeaderHash = Lib_OVMCodec.hashBatchHeader(header);\n bytes27 latestBatchContext = _makeBatchExtraData(\n totalElements + uint40(header.batchSize),\n nextQueueIndex + uint40(_numQueuedTransactions),\n _timestamp,\n _blockNumber\n );\n\n batches().push(batchHeaderHash, latestBatchContext);\n }\n\n /**\n * Checks that the first batch context in a sequencer submission is valid\n * @param _firstContext The batch context to validate.\n */\n function _validateFirstBatchContext(\n BatchContext memory _firstContext\n )\n internal\n view\n {\n // If there are existing elements, this batch must come later.\n if (getTotalElements() > 0) {\n (,, uint40 lastTimestamp, uint40 lastBlockNumber) = _getBatchExtraData();\n require(_firstContext.blockNumber >= lastBlockNumber, \"Context block number is lower than last submitted.\");\n require(_firstContext.timestamp >= lastTimestamp, \"Context timestamp is lower than last submitted.\");\n }\n // Sequencer cannot submit contexts which are more than the force inclusion period old.\n require(_firstContext.timestamp + forceInclusionPeriodSeconds >= block.timestamp, \"Context timestamp too far in the past.\");\n require(_firstContext.blockNumber + forceInclusionPeriodBlocks >= block.number, \"Context block number too far in the past.\");\n }\n\n /**\n * Checks that a given batch context is valid based on its previous context, and the next queue elemtent.\n * @param _prevContext The previously validated batch context.\n * @param _nextContext The batch context to validate with this call.\n * @param _nextQueueIndex Index of the next queue element to process for the _nextContext's subsequentQueueElements.\n */\n function _validateNextBatchContext(\n BatchContext memory _prevContext,\n BatchContext memory _nextContext,\n uint40 _nextQueueIndex\n )\n internal\n view\n {\n // All sequencer transactions' times must increase from the previous ones.\n require(\n _nextContext.timestamp >= _prevContext.timestamp,\n \"Context timestamp values must monotonically increase.\"\n );\n\n require(\n _nextContext.blockNumber >= _prevContext.blockNumber,\n \"Context blockNumber values must monotonically increase.\"\n );\n\n // If there are some queue elements pending:\n if (getQueueLength() - _nextQueueIndex > 0) {\n Lib_OVMCodec.QueueElement memory nextQueueElement = getQueueElement(_nextQueueIndex);\n\n // If the force inclusion period has passed for an enqueued transaction, it MUST be the next chain element.\n require(\n block.timestamp < nextQueueElement.timestamp + forceInclusionPeriodSeconds,\n \"Previously enqueued batches have expired and must be appended before a new sequencer batch.\"\n );\n\n // Just like sequencer transaction times must be increasing relative to each other,\n // We also require that they be increasing relative to any interspersed queue elements.\n require(\n _nextContext.timestamp <= nextQueueElement.timestamp,\n \"Sequencer transaction timestamp exceeds that of next queue element.\"\n );\n\n require(\n _nextContext.blockNumber <= nextQueueElement.blockNumber,\n \"Sequencer transaction blockNumber exceeds that of next queue element.\"\n );\n } \n }\n\n /**\n * Checks that the final batch context in a sequencer submission is valid.\n * @param _finalContext The batch context to validate.\n */\n function _validateFinalBatchContext(\n BatchContext memory _finalContext\n )\n internal\n view\n {\n // Batches cannot be added from the future, or subsequent enqueue() contexts would violate monotonicity.\n require(_finalContext.timestamp <= block.timestamp, \"Context timestamp is from the future.\");\n require(_finalContext.blockNumber <= block.number, \"Context block number is from the future.\");\n }\n\n /**\n * Hashes a transaction chain element.\n * @param _element Chain element to hash.\n * @return Hash of the chain element.\n */\n function _hashTransactionChainElement(\n Lib_OVMCodec.TransactionChainElement memory _element\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n return keccak256(\n abi.encode(\n _element.isSequenced,\n _element.queueIndex,\n _element.timestamp,\n _element.blockNumber,\n _element.txData\n )\n );\n }\n\n /**\n * Verifies a sequencer transaction, returning true if it was indeed included in the CTC\n * @param _transaction The transaction we are verifying inclusion of.\n * @param _txChainElement The chain element that the transaction is claimed to be a part of.\n * @param _batchHeader Header of the batch the transaction was included in.\n * @param _inclusionProof An inclusion proof into the CTC at a particular index.\n * @return True if the transaction was included in the specified location, else false.\n */\n function _verifySequencerTransaction(\n Lib_OVMCodec.Transaction memory _transaction,\n Lib_OVMCodec.TransactionChainElement memory _txChainElement,\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _inclusionProof\n )\n internal\n view\n returns (\n bool\n )\n {\n OVM_ExecutionManager ovmExecutionManager = OVM_ExecutionManager(resolve(\"OVM_ExecutionManager\"));\n uint256 gasLimit = ovmExecutionManager.getMaxTransactionGasLimit();\n bytes32 leafHash = _getSequencerLeafHash(_txChainElement);\n\n require(\n _verifyElement(\n leafHash,\n _batchHeader,\n _inclusionProof\n ),\n \"Invalid Sequencer transaction inclusion proof.\"\n );\n\n require(\n _transaction.blockNumber == _txChainElement.blockNumber\n && _transaction.timestamp == _txChainElement.timestamp\n && _transaction.entrypoint == resolve(\"OVM_DecompressionPrecompileAddress\")\n && _transaction.gasLimit == gasLimit\n && _transaction.l1TxOrigin == address(0)\n && _transaction.l1QueueOrigin == Lib_OVMCodec.QueueOrigin.SEQUENCER_QUEUE\n && keccak256(_transaction.data) == keccak256(_txChainElement.txData),\n \"Invalid Sequencer transaction.\"\n );\n\n return true;\n }\n\n /**\n * Verifies a queue transaction, returning true if it was indeed included in the CTC\n * @param _transaction The transaction we are verifying inclusion of.\n * @param _queueIndex The queueIndex of the queued transaction.\n * @param _batchHeader Header of the batch the transaction was included in.\n * @param _inclusionProof An inclusion proof into the CTC at a particular index (should point to queue tx).\n * @return True if the transaction was included in the specified location, else false.\n */\n function _verifyQueueTransaction(\n Lib_OVMCodec.Transaction memory _transaction,\n uint256 _queueIndex,\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _inclusionProof\n )\n internal\n view\n returns (\n bool\n )\n {\n bytes32 leafHash = _getQueueLeafHash(_queueIndex);\n\n require(\n _verifyElement(\n leafHash,\n _batchHeader,\n _inclusionProof\n ),\n \"Invalid Queue transaction inclusion proof.\"\n );\n\n bytes32 transactionHash = keccak256(\n abi.encode(\n _transaction.l1TxOrigin,\n _transaction.entrypoint,\n _transaction.gasLimit,\n _transaction.data\n )\n );\n\n Lib_OVMCodec.QueueElement memory el = getQueueElement(_queueIndex);\n require(\n el.queueRoot == transactionHash\n && el.timestamp == _transaction.timestamp\n && el.blockNumber == _transaction.blockNumber,\n \"Invalid Queue transaction.\"\n );\n\n return true;\n }\n\n /**\n * Verifies a batch inclusion proof.\n * @param _element Hash of the element to verify a proof for.\n * @param _batchHeader Header of the batch in which the element was included.\n * @param _proof Merkle inclusion proof for the element.\n */\n function _verifyElement(\n bytes32 _element,\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _proof\n )\n internal\n view\n returns (\n bool\n )\n {\n require(\n Lib_OVMCodec.hashBatchHeader(_batchHeader) == batches().get(uint32(_batchHeader.batchIndex)),\n \"Invalid batch header.\"\n );\n\n require(\n Lib_MerkleTree.verify(\n _batchHeader.batchRoot,\n _element,\n _proof.index,\n _proof.siblings,\n _batchHeader.batchSize\n ),\n \"Invalid inclusion proof.\"\n );\n\n return true;\n }\n}\n" - }, - "contracts/optimistic-ethereum/libraries/utils/Lib_Math.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.7.0;\n\n/**\n * @title Lib_Math\n */\nlibrary Lib_Math {\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Calculates the minumum of two numbers.\n * @param _x First number to compare.\n * @param _y Second number to compare.\n * @return Lesser of the two numbers.\n */\n function min(\n uint256 _x,\n uint256 _y\n )\n internal\n pure\n returns (\n uint256\n )\n {\n if (_x < _y) {\n return _x;\n }\n\n return _y;\n }\n}\n" - }, - "contracts/optimistic-ethereum/OVM/bridge/OVM_L1CrossDomainMessenger.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\nimport { Lib_AddressManager } from \"../../libraries/resolver/Lib_AddressManager.sol\";\nimport { Lib_SecureMerkleTrie } from \"../../libraries/trie/Lib_SecureMerkleTrie.sol\";\nimport { Lib_ReentrancyGuard } from \"../../libraries/utils/Lib_ReentrancyGuard.sol\";\n\n/* Interface Imports */\nimport { iOVM_L1CrossDomainMessenger } from \"../../iOVM/bridge/iOVM_L1CrossDomainMessenger.sol\";\nimport { iOVM_CanonicalTransactionChain } from \"../../iOVM/chain/iOVM_CanonicalTransactionChain.sol\";\nimport { iOVM_StateCommitmentChain } from \"../../iOVM/chain/iOVM_StateCommitmentChain.sol\";\n\n/* Contract Imports */\nimport { OVM_BaseCrossDomainMessenger } from \"./OVM_BaseCrossDomainMessenger.sol\";\n\n/**\n * @title OVM_L1CrossDomainMessenger\n * @dev This contract lives on L1. It sends L1->L2 messages into L2, and relays L2->L1 messages from L2 to their target on L1.\n */\ncontract OVM_L1CrossDomainMessenger is iOVM_L1CrossDomainMessenger, OVM_BaseCrossDomainMessenger, Lib_AddressResolver {\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * Pass a default zero address to the address resolver. This will be updated when initialized.\n */\n constructor()\n Lib_AddressResolver(address(0))\n {}\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n function initialize(\n address _libAddressManager\n )\n public\n {\n require(address(libAddressManager) == address(0), \"L1CrossDomainMessenger already intialized.\");\n libAddressManager = Lib_AddressManager(_libAddressManager);\n }\n\n\n /**********************\n * Function Modifiers *\n **********************/\n\n /**\n * Modifier to enforce that, if configured, only the OVM_L2MessageRelayer contract may successfully call a method.\n */\n modifier onlyRelayer() {\n address relayer = resolve(\"OVM_L2MessageRelayer\");\n if (relayer != address(0)) {\n require(\n msg.sender == relayer,\n \"Only OVM_L2MessageRelayer can relay L2-to-L1 messages.\"\n );\n }\n _;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Relays a cross domain message to a contract.\n * @inheritdoc iOVM_L1CrossDomainMessenger\n */\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce,\n L2MessageInclusionProof memory _proof\n )\n override\n public\n nonReentrant\n onlyRelayer()\n {\n bytes memory xDomainCalldata = _getXDomainCalldata(\n _target,\n _sender,\n _message,\n _messageNonce\n );\n\n require(\n _verifyXDomainMessage(\n xDomainCalldata,\n _proof\n ) == true,\n \"Provided message could not be verified.\"\n );\n\n bytes32 xDomainCalldataHash = keccak256(xDomainCalldata);\n\n require(\n successfulMessages[xDomainCalldataHash] == false,\n \"Provided message has already been received.\"\n );\n\n xDomainMessageSender = _sender;\n (bool success, ) = _target.call(_message);\n\n // Mark the message as received if the call was successful. Ensures that a message can be\n // relayed multiple times in the case that the call reverted.\n if (success == true) {\n successfulMessages[xDomainCalldataHash] = true;\n emit RelayedMessage(xDomainCalldataHash);\n }\n\n // Store an identifier that can be used to prove that the given message was relayed by some\n // user. Gives us an easy way to pay relayers for their work.\n bytes32 relayId = keccak256(\n abi.encodePacked(\n xDomainCalldata,\n msg.sender,\n block.number\n )\n );\n relayedMessages[relayId] = true;\n }\n\n /**\n * Replays a cross domain message to the target messenger.\n * @inheritdoc iOVM_L1CrossDomainMessenger\n */\n function replayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce,\n uint32 _gasLimit\n )\n override\n public\n {\n bytes memory xDomainCalldata = _getXDomainCalldata(\n _target,\n _sender,\n _message,\n _messageNonce\n );\n\n require(\n sentMessages[keccak256(xDomainCalldata)] == true,\n \"Provided message has not already been sent.\"\n );\n\n _sendXDomainMessage(xDomainCalldata, _gasLimit);\n }\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Verifies that the given message is valid.\n * @param _xDomainCalldata Calldata to verify.\n * @param _proof Inclusion proof for the message.\n * @return Whether or not the provided message is valid.\n */\n function _verifyXDomainMessage(\n bytes memory _xDomainCalldata,\n L2MessageInclusionProof memory _proof\n )\n internal\n view\n returns (\n bool\n )\n {\n return (\n _verifyStateRootProof(_proof)\n && _verifyStorageProof(_xDomainCalldata, _proof)\n );\n }\n\n /**\n * Verifies that the state root within an inclusion proof is valid.\n * @param _proof Message inclusion proof.\n * @return Whether or not the provided proof is valid.\n */\n function _verifyStateRootProof(\n L2MessageInclusionProof memory _proof\n )\n internal\n view\n returns (\n bool\n )\n {\n iOVM_StateCommitmentChain ovmStateCommitmentChain = iOVM_StateCommitmentChain(resolve(\"OVM_StateCommitmentChain\"));\n\n return (\n ovmStateCommitmentChain.insideFraudProofWindow(_proof.stateRootBatchHeader) == false\n && ovmStateCommitmentChain.verifyStateCommitment(\n _proof.stateRoot,\n _proof.stateRootBatchHeader,\n _proof.stateRootProof\n )\n );\n }\n\n /**\n * Verifies that the storage proof within an inclusion proof is valid.\n * @param _xDomainCalldata Encoded message calldata.\n * @param _proof Message inclusion proof.\n * @return Whether or not the provided proof is valid.\n */\n function _verifyStorageProof(\n bytes memory _xDomainCalldata,\n L2MessageInclusionProof memory _proof\n )\n internal\n view\n returns (\n bool\n )\n {\n bytes32 storageKey = keccak256(\n abi.encodePacked(\n keccak256(\n abi.encodePacked(\n _xDomainCalldata,\n resolve(\"OVM_L2CrossDomainMessenger\")\n )\n ),\n uint256(0)\n )\n );\n\n (\n bool exists,\n bytes memory encodedMessagePassingAccount\n ) = Lib_SecureMerkleTrie.get(\n abi.encodePacked(0x4200000000000000000000000000000000000000),\n _proof.stateTrieWitness,\n _proof.stateRoot\n );\n\n require(\n exists == true,\n \"Message passing precompile has not been initialized or invalid proof provided.\"\n );\n\n Lib_OVMCodec.EVMAccount memory account = Lib_OVMCodec.decodeEVMAccount(\n encodedMessagePassingAccount\n );\n\n return Lib_SecureMerkleTrie.verifyInclusionProof(\n abi.encodePacked(storageKey),\n abi.encodePacked(uint8(1)),\n _proof.storageTrieWitness,\n account.storageRoot\n );\n }\n\n /**\n * Sends a cross domain message.\n * @param _message Message to send.\n * @param _gasLimit OVM gas limit for the message.\n */\n function _sendXDomainMessage(\n bytes memory _message,\n uint256 _gasLimit\n )\n override\n internal\n {\n iOVM_CanonicalTransactionChain(resolve(\"OVM_CanonicalTransactionChain\")).enqueue(\n resolve(\"OVM_L2CrossDomainMessenger\"),\n _gasLimit,\n _message\n );\n }\n}\n" - }, - "contracts/optimistic-ethereum/libraries/utils/Lib_ReentrancyGuard.sol": { - "content": "// SPDX-License-Identifier: MIT\n// +build ovm\npragma solidity >0.5.0 <0.8.0;\n\n/**\n * @dev Contract module that helps prevent reentrant calls to a function.\n *\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\n * available, which can be applied to functions to make sure there are no nested\n * (reentrant) calls to them.\n *\n * Note that because there is a single `nonReentrant` guard, functions marked as\n * `nonReentrant` may not call one another. This can be worked around by making\n * those functions `private`, and then adding `external` `nonReentrant` entry\n * points to them.\n *\n * TIP: If you would like to learn more about reentrancy and alternative ways\n * to protect against it, check out our blog post\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\n */\nabstract contract Lib_ReentrancyGuard {\n // Booleans are more expensive than uint256 or any type that takes up a full\n // word because each write operation emits an extra SLOAD to first read the\n // slot's contents, replace the bits taken up by the boolean, and then write\n // back. This is the compiler's defense against contract upgrades and\n // pointer aliasing, and it cannot be disabled.\n\n // The values being non-zero value makes deployment a bit more expensive,\n // but in exchange the refund on every call to nonReentrant will be lower in\n // amount. Since refunds are capped to a percentage of the total\n // transaction's gas, it is best to keep them low in cases like this one, to\n // increase the likelihood of the full refund coming into effect.\n uint256 private constant _NOT_ENTERED = 1;\n uint256 private constant _ENTERED = 2;\n\n uint256 private _status;\n\n constructor () internal {\n _status = _NOT_ENTERED;\n }\n\n /**\n * @dev Prevents a contract from calling itself, directly or indirectly.\n * Calling a `nonReentrant` function from another `nonReentrant`\n * function is not supported. It is possible to prevent this from happening\n * by making the `nonReentrant` function external, and make it call a\n * `private` function that does the actual work.\n */\n modifier nonReentrant() {\n // On the first call to nonReentrant, _notEntered will be true\n require(_status != _ENTERED, \"ReentrancyGuard: reentrant call\");\n\n // Any calls to nonReentrant after this point will fail\n _status = _ENTERED;\n\n _;\n\n // By storing the original value once again, a refund is triggered (see\n // https://eips.ethereum.org/EIPS/eip-2200)\n _status = _NOT_ENTERED;\n }\n}\n" - }, - "contracts/optimistic-ethereum/iOVM/bridge/iOVM_L1CrossDomainMessenger.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/* Interface Imports */\nimport { iOVM_BaseCrossDomainMessenger } from \"./iOVM_BaseCrossDomainMessenger.sol\";\n\n/**\n * @title iOVM_L1CrossDomainMessenger\n */\ninterface iOVM_L1CrossDomainMessenger is iOVM_BaseCrossDomainMessenger {\n\n /*******************\n * Data Structures *\n *******************/\n\n struct L2MessageInclusionProof {\n bytes32 stateRoot;\n Lib_OVMCodec.ChainBatchHeader stateRootBatchHeader;\n Lib_OVMCodec.ChainInclusionProof stateRootProof;\n bytes stateTrieWitness;\n bytes storageTrieWitness;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Relays a cross domain message to a contract.\n * @param _target Target contract address.\n * @param _sender Message sender address.\n * @param _message Message to send to the target.\n * @param _messageNonce Nonce for the provided message.\n * @param _proof Inclusion proof for the given message.\n */\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce,\n L2MessageInclusionProof memory _proof\n ) external;\n\n /**\n * Replays a cross domain message to the target messenger.\n * @param _target Target contract address.\n * @param _sender Original sender address.\n * @param _message Message to send to the target.\n * @param _messageNonce Nonce for the provided message.\n * @param _gasLimit Gas limit for the provided message.\n */\n function replayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce,\n uint32 _gasLimit\n ) external;\n}\n" - }, - "contracts/optimistic-ethereum/OVM/bridge/OVM_BaseCrossDomainMessenger.sol": { - "content": "// SPDX-License-Identifier: MIT\n// +build ovm\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Interface Imports */\nimport { iOVM_BaseCrossDomainMessenger } from \"../../iOVM/bridge/iOVM_BaseCrossDomainMessenger.sol\";\n\n/* Library Imports */\nimport { Lib_ReentrancyGuard } from \"../../libraries/utils/Lib_ReentrancyGuard.sol\";\n\n/**\n * @title OVM_BaseCrossDomainMessenger\n */\nabstract contract OVM_BaseCrossDomainMessenger is iOVM_BaseCrossDomainMessenger, Lib_ReentrancyGuard {\n\n /**********************\n * Contract Variables *\n **********************/\n\n mapping (bytes32 => bool) public relayedMessages;\n mapping (bytes32 => bool) public successfulMessages;\n mapping (bytes32 => bool) public sentMessages;\n uint256 public messageNonce;\n address override public xDomainMessageSender;\n\n /********************\n * Public Functions *\n ********************/\n\n constructor() Lib_ReentrancyGuard() internal {}\n\n /**\n * Sends a cross domain message to the target messenger.\n * @param _target Target contract address.\n * @param _message Message to send to the target.\n * @param _gasLimit Gas limit for the provided message.\n */\n function sendMessage(\n address _target,\n bytes memory _message,\n uint32 _gasLimit\n )\n override\n public\n {\n bytes memory xDomainCalldata = _getXDomainCalldata(\n _target,\n msg.sender,\n _message,\n messageNonce\n );\n\n messageNonce += 1;\n sentMessages[keccak256(xDomainCalldata)] = true;\n\n _sendXDomainMessage(xDomainCalldata, _gasLimit);\n emit SentMessage(xDomainCalldata);\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Generates the correct cross domain calldata for a message.\n * @param _target Target contract address.\n * @param _sender Message sender address.\n * @param _message Message to send to the target.\n * @param _messageNonce Nonce for the provided message.\n * @return ABI encoded cross domain calldata.\n */\n function _getXDomainCalldata(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n return abi.encodeWithSignature(\n \"relayMessage(address,address,bytes,uint256)\",\n _target,\n _sender,\n _message,\n _messageNonce\n );\n }\n\n /**\n * Sends a cross domain message.\n * @param _message Message to send.\n * @param _gasLimit Gas limit for the provided message.\n */\n function _sendXDomainMessage(\n bytes memory _message,\n uint256 _gasLimit\n )\n virtual\n internal\n {\n revert(\"Implement me in child contracts!\");\n }\n}\n" - }, - "contracts/optimistic-ethereum/iOVM/bridge/iOVM_BaseCrossDomainMessenger.sol": { - "content": "// SPDX-License-Identifier: MIT\n// +build ovm\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/**\n * @title iOVM_BaseCrossDomainMessenger\n */\ninterface iOVM_BaseCrossDomainMessenger {\n\n /**********\n * Events *\n **********/\n event SentMessage(bytes message);\n event RelayedMessage(bytes32 msgHash);\n\n /**********************\n * Contract Variables *\n **********************/\n function xDomainMessageSender() external view returns (address);\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Sends a cross domain message to the target messenger.\n * @param _target Target contract address.\n * @param _message Message to send to the target.\n * @param _gasLimit Gas limit for the provided message.\n */\n function sendMessage(\n address _target,\n bytes calldata _message,\n uint32 _gasLimit\n ) external;\n}\n" - }, - "contracts/optimistic-ethereum/OVM/bridge/OVM_L2CrossDomainMessenger.sol": { - "content": "// SPDX-License-Identifier: MIT\n// +build ovm\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\nimport { Lib_ReentrancyGuard } from \"../../libraries/utils/Lib_ReentrancyGuard.sol\";\n\n/* Interface Imports */\nimport { iOVM_L2CrossDomainMessenger } from \"../../iOVM/bridge/iOVM_L2CrossDomainMessenger.sol\";\nimport { iOVM_L1MessageSender } from \"../../iOVM/precompiles/iOVM_L1MessageSender.sol\";\nimport { iOVM_L2ToL1MessagePasser } from \"../../iOVM/precompiles/iOVM_L2ToL1MessagePasser.sol\";\n\n/* Contract Imports */\nimport { OVM_BaseCrossDomainMessenger } from \"./OVM_BaseCrossDomainMessenger.sol\";\n\n/**\n * @title OVM_L2CrossDomainMessenger\n * @dev L2 CONTRACT (COMPILED)\n * This contract lives on L2. It sends messages to L1, and relays them from L1.\n */\ncontract OVM_L2CrossDomainMessenger is iOVM_L2CrossDomainMessenger, OVM_BaseCrossDomainMessenger, Lib_AddressResolver {\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n constructor(\n address _libAddressManager\n )\n public\n Lib_AddressResolver(_libAddressManager)\n {}\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Relays a cross domain message to a contract.\n * @inheritdoc iOVM_L2CrossDomainMessenger\n */\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce\n )\n override\n nonReentrant\n public\n {\n require(\n _verifyXDomainMessage() == true,\n \"Provided message could not be verified.\"\n );\n\n bytes memory xDomainCalldata = _getXDomainCalldata(\n _target,\n _sender,\n _message,\n _messageNonce\n );\n\n bytes32 xDomainCalldataHash = keccak256(xDomainCalldata);\n\n require(\n successfulMessages[xDomainCalldataHash] == false,\n \"Provided message has already been received.\"\n );\n\n xDomainMessageSender = _sender;\n (bool success, ) = _target.call(_message);\n\n // Mark the message as received if the call was successful. Ensures that a message can be\n // relayed multiple times in the case that the call reverted.\n if (success == true) {\n successfulMessages[xDomainCalldataHash] = true;\n emit RelayedMessage(xDomainCalldataHash);\n }\n\n // Store an identifier that can be used to prove that the given message was relayed by some\n // user. Gives us an easy way to pay relayers for their work.\n bytes32 relayId = keccak256(\n abi.encodePacked(\n xDomainCalldata,\n msg.sender,\n block.number\n )\n );\n relayedMessages[relayId] = true;\n }\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Verifies that a received cross domain message is valid.\n * @return _valid Whether or not the message is valid.\n */\n function _verifyXDomainMessage()\n internal\n returns (\n bool _valid\n )\n {\n return (\n iOVM_L1MessageSender(resolve(\"OVM_L1MessageSender\")).getL1MessageSender() == resolve(\"OVM_L1CrossDomainMessenger\")\n );\n }\n\n /**\n * Sends a cross domain message.\n * @param _message Message to send.\n * @param _gasLimit Gas limit for the provided message.\n */\n function _sendXDomainMessage(\n bytes memory _message,\n uint256 _gasLimit\n )\n override\n internal\n {\n iOVM_L2ToL1MessagePasser(resolve(\"OVM_L2ToL1MessagePasser\")).passMessageToL1(_message);\n }\n}\n" - }, - "contracts/optimistic-ethereum/iOVM/bridge/iOVM_L2CrossDomainMessenger.sol": { - "content": "// SPDX-License-Identifier: MIT\n// +build ovm\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Interface Imports */\nimport { iOVM_BaseCrossDomainMessenger } from \"./iOVM_BaseCrossDomainMessenger.sol\";\n\n/**\n * @title iOVM_L2CrossDomainMessenger\n */\ninterface iOVM_L2CrossDomainMessenger is iOVM_BaseCrossDomainMessenger {\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Relays a cross domain message to a contract.\n * @param _target Target contract address.\n * @param _sender Message sender address.\n * @param _message Message to send to the target.\n * @param _messageNonce Nonce for the provided message.\n */\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce\n ) external;\n}\n" - }, - "contracts/optimistic-ethereum/iOVM/precompiles/iOVM_L1MessageSender.sol": { - "content": "// SPDX-License-Identifier: MIT\n// +build ovm\npragma solidity >0.5.0 <0.8.0;\n\n/**\n * @title iOVM_L1MessageSender\n */\ninterface iOVM_L1MessageSender {\n\n /********************\n * Public Functions *\n ********************/\n\n function getL1MessageSender() external returns (address _l1MessageSender);\n}\n" - }, - "contracts/optimistic-ethereum/iOVM/precompiles/iOVM_L2ToL1MessagePasser.sol": { - "content": "// SPDX-License-Identifier: MIT\n// +build ovm\npragma solidity >0.5.0 <0.8.0;\n\n/**\n * @title iOVM_L2ToL1MessagePasser\n */\ninterface iOVM_L2ToL1MessagePasser {\n\n /**********\n * Events *\n **********/\n\n event L2ToL1Message(\n uint256 _nonce,\n address _sender,\n bytes _data\n );\n\n\n /********************\n * Public Functions *\n ********************/\n\n function passMessageToL1(bytes calldata _message) external;\n}\n" - }, - "contracts/optimistic-ethereum/OVM/precompiles/OVM_L2ToL1MessagePasser.sol": { - "content": "// SPDX-License-Identifier: MIT\n// +build ovm\npragma solidity >0.5.0 <0.8.0;\n\n/* Interface Imports */\nimport { iOVM_L2ToL1MessagePasser } from \"../../iOVM/precompiles/iOVM_L2ToL1MessagePasser.sol\";\n\n/**\n * @title OVM_L2ToL1MessagePasser\n * @dev L2 CONTRACT (COMPILED)\n */\ncontract OVM_L2ToL1MessagePasser is iOVM_L2ToL1MessagePasser {\n\n /**********************\n * Contract Variables *\n **********************/\n\n mapping (bytes32 => bool) public sentMessages;\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Passes a message to L1.\n * @param _message Message to pass to L1.\n */\n function passMessageToL1(\n bytes memory _message\n )\n override\n public\n {\n sentMessages[keccak256(\n abi.encodePacked(\n _message,\n msg.sender\n )\n )] = true;\n }\n}\n" - }, - "contracts/optimistic-ethereum/OVM/precompiles/OVM_L1MessageSender.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.7.0;\n\n/* Interface Imports */\nimport { iOVM_L1MessageSender } from \"../../iOVM/precompiles/iOVM_L1MessageSender.sol\";\nimport { iOVM_ExecutionManager } from \"../../iOVM/execution/iOVM_ExecutionManager.sol\";\n\n/**\n * @title OVM_L1MessageSender\n * @dev L2 CONTRACT (NOT COMPILED)\n */\ncontract OVM_L1MessageSender is iOVM_L1MessageSender {\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @return _l1MessageSender L1 message sender address (msg.sender).\n */\n function getL1MessageSender()\n override\n public\n view\n returns (\n address _l1MessageSender\n )\n {\n return iOVM_ExecutionManager(msg.sender).ovmL1TXORIGIN();\n }\n}\n" - }, - "contracts/optimistic-ethereum/OVM/precompiles/OVM_ETH.sol": { - "content": "// SPDX-License-Identifier: MIT\n// +build ovm\npragma solidity >0.5.0 <0.8.0;\n\n/* Library Imports */\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/* Interface Imports */\nimport { iOVM_ERC20 } from \"../../iOVM/precompiles/iOVM_ERC20.sol\";\nimport { iOVM_BaseCrossDomainMessenger } from \"../../iOVM/bridge/iOVM_BaseCrossDomainMessenger.sol\";\n\n/**\n * @title OVM_ETH\n * @dev L2 CONTRACT (COMPILED)\n */\ncontract OVM_ETH is iOVM_ERC20, Lib_AddressResolver {\n\n uint256 constant private MAX_UINT256 = 2**256 - 1;\n mapping (address => uint256) public balances;\n mapping (address => mapping (address => uint256)) public allowed;\n /*\n NOTE:\n The following variables are OPTIONAL vanities. One does not have to include them.\n They allow one to customise the token contract & in no way influences the core functionality.\n Some wallets/interfaces might not even bother to look at this information.\n */\n string public name; //fancy name: eg OVM Coin\n uint8 public decimals; //How many decimals to show.\n string public symbol; //An identifier: eg OVM\n uint256 public override totalSupply;\n\n constructor(\n address _libAddressManager,\n uint256 _initialAmount,\n string memory _tokenName,\n uint8 _decimalUnits,\n string memory _tokenSymbol\n )\n public\n Lib_AddressResolver(_libAddressManager)\n {\n balances[msg.sender] = _initialAmount; // Give the creator all initial tokens\n totalSupply = _initialAmount; // Update total supply\n name = _tokenName; // Set the name for display purposes\n decimals = _decimalUnits; // Amount of decimals for display purposes\n symbol = _tokenSymbol; // Set the symbol for display purposes\n }\n\n modifier onlyOVMETHBridge() {\n address bridgeOnL2 = resolve(\"OVM_L2ETHBridge\");\n require(bridgeOnL2 != address(0), \"OVM_L2ETHBridge is not yet initialized.\");\n require(msg.sender == bridgeOnL2, \"Only callable by OVM ETH Deposit/Withdrawal contract\");\n _;\n }\n\n function transfer(address _to, uint256 _value) external override returns (bool success) {\n require(balances[msg.sender] >= _value);\n balances[msg.sender] -= _value;\n balances[_to] += _value;\n emit Transfer(msg.sender, _to, _value);\n return true;\n }\n\n function transferFrom(address _from, address _to, uint256 _value) external override returns (bool success) {\n uint256 allowance = allowed[_from][msg.sender];\n require(balances[_from] >= _value && allowance >= _value);\n balances[_to] += _value;\n balances[_from] -= _value;\n if (allowance < MAX_UINT256) {\n allowed[_from][msg.sender] -= _value;\n }\n emit Transfer(_from, _to, _value);\n return true;\n }\n\n function balanceOf(address _owner) external view override returns (uint256 balance) {\n return balances[_owner];\n }\n\n function approve(address _spender, uint256 _value) external override returns (bool success) {\n allowed[msg.sender][_spender] = _value;\n emit Approval(msg.sender, _spender, _value);\n return true;\n }\n\n function allowance(address _owner, address _spender) external view override returns (uint256 remaining) {\n return allowed[_owner][_spender];\n }\n\n function mint(address _account, uint256 _amount) external onlyOVMETHBridge returns (bool success) {\n uint256 newTotalSupply = totalSupply + _amount;\n require(newTotalSupply >= totalSupply, \"SafeMath: addition overflow\");\n totalSupply = newTotalSupply;\n balances[_account] += _amount;\n\n emit Mint(_account, _amount);\n return true;\n }\n\n function burn(address _account, uint256 _amount) external onlyOVMETHBridge returns (bool success) {\n require(balances[_account] >= _amount, \"Unable to burn due to insufficient balance\");\n balances[_account] -= _amount;\n totalSupply -= _amount;\n\n emit Burn(_account, _amount);\n return true;\n }\n}\n" - }, - "contracts/optimistic-ethereum/iOVM/precompiles/iOVM_ERC20.sol": { - "content": "// SPDX-License-Identifier: MIT\n// +build ovm\npragma solidity >0.5.0 <0.8.0;\n\n/**\n * @title iOVM_ERC20\n */\ninterface iOVM_ERC20 {\n /* This is a slight change to the ERC20 base standard.\n function totalSupply() constant returns (uint256 supply);\n is replaced with:\n uint256 public totalSupply;\n This automatically creates a getter function for the totalSupply.\n This is moved to the base contract since public getter functions are not\n currently recognised as an implementation of the matching abstract\n function by the compiler.\n */\n /// total amount of tokens\n function totalSupply() external view returns (uint256);\n\n /// @param _owner The address from which the balance will be retrieved\n /// @return balance The balance\n function balanceOf(address _owner) external view returns (uint256 balance);\n\n /// @notice send `_value` token to `_to` from `msg.sender`\n /// @param _to The address of the recipient\n /// @param _value The amount of token to be transferred\n /// @return success Whether the transfer was successful or not\n function transfer(address _to, uint256 _value) external returns (bool success);\n\n /// @notice send `_value` token to `_to` from `_from` on the condition it is approved by `_from`\n /// @param _from The address of the sender\n /// @param _to The address of the recipient\n /// @param _value The amount of token to be transferred\n /// @return success Whether the transfer was successful or not\n function transferFrom(address _from, address _to, uint256 _value) external returns (bool success);\n\n /// @notice `msg.sender` approves `_spender` to spend `_value` tokens\n /// @param _spender The address of the account able to transfer the tokens\n /// @param _value The amount of tokens to be approved for transfer\n /// @return success Whether the approval was successful or not\n function approve(address _spender, uint256 _value) external returns (bool success);\n\n /// @param _owner The address of the account owning tokens\n /// @param _spender The address of the account able to transfer the tokens\n /// @return remaining Amount of remaining tokens allowed to spent\n function allowance(address _owner, address _spender) external view returns (uint256 remaining);\n\n // solhint-disable-next-line no-simple-event-func-name\n event Transfer(address indexed _from, address indexed _to, uint256 _value);\n event Approval(address indexed _owner, address indexed _spender, uint256 _value);\n event Mint(address indexed _account, uint256 _amount);\n event Burn(address indexed _account, uint256 _amount);\n}\n" - }, - "contracts/optimistic-ethereum/mockOVM/bridge/mockOVM_CrossDomainMessenger.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.7.0;\npragma experimental ABIEncoderV2;\n\n/* Contract Imports */\nimport { iOVM_BaseCrossDomainMessenger } from \"../../iOVM/bridge/iOVM_BaseCrossDomainMessenger.sol\";\n\n/**\n * @title mockOVM_CrossDomainMessenger\n */\ncontract mockOVM_CrossDomainMessenger is iOVM_BaseCrossDomainMessenger {\n\n /***********\n * Structs *\n ***********/\n\n struct ReceivedMessage {\n uint256 timestamp;\n address target;\n address sender;\n bytes message;\n uint256 messageNonce;\n uint32 gasLimit;\n }\n\n\n /**********************\n * Contract Variables *\n **********************/\n\n ReceivedMessage[] internal fullReceivedMessages;\n address internal targetMessengerAddress;\n uint256 internal lastRelayedMessage;\n uint256 internal delay;\n uint256 public messageNonce;\n address override public xDomainMessageSender;\n\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _delay Time in seconds before a message can be relayed.\n */\n constructor(\n uint256 _delay\n ) {\n delay = _delay;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Sets the target messenger address.\n * @dev Currently, this function is public and therefore allows anyone to modify the target\n * messenger for a given xdomain messenger contract. Obviously this shouldn't be allowed,\n * but we still need to determine an adequate mechanism for updating this address.\n * @param _targetMessengerAddress New messenger address.\n */\n function setTargetMessengerAddress(\n address _targetMessengerAddress\n )\n public\n {\n targetMessengerAddress = _targetMessengerAddress;\n }\n\n /**\n * Sends a message to another mock xdomain messenger.\n * @param _target Target for the message.\n * @param _message Message to send.\n * @param _gasLimit Amount of gas to send with the call.\n */\n function sendMessage(\n address _target,\n bytes memory _message,\n uint32 _gasLimit\n )\n override\n public\n {\n mockOVM_CrossDomainMessenger targetMessenger = mockOVM_CrossDomainMessenger(\n targetMessengerAddress\n );\n\n // Just send it over!\n targetMessenger.receiveMessage(ReceivedMessage({\n timestamp: block.timestamp,\n target: _target,\n sender: msg.sender,\n message: _message,\n messageNonce: messageNonce,\n gasLimit: _gasLimit\n }));\n\n messageNonce += 1;\n }\n\n /**\n * Receives a message to be sent later.\n * @param _message Message to send later.\n */\n function receiveMessage(\n ReceivedMessage memory _message\n )\n public\n {\n fullReceivedMessages.push(_message);\n }\n\n /**\n * Checks whether we have messages to relay.\n * @param _exists Whether or not we have more messages to relay.\n */\n function hasNextMessage()\n public\n view\n returns (\n bool _exists\n )\n {\n return fullReceivedMessages.length > lastRelayedMessage;\n }\n\n /**\n * Relays the last received message not yet relayed.\n */\n function relayNextMessage()\n public\n {\n require(hasNextMessage(), \"No pending messages to relay\");\n ReceivedMessage memory nextMessage = fullReceivedMessages[lastRelayedMessage];\n require(nextMessage.timestamp + delay < block.timestamp, \"Message is not ready to be relayed. The delay period is not up yet!\");\n\n xDomainMessageSender = nextMessage.sender;\n (bool success,) = nextMessage.target.call{gas: nextMessage.gasLimit}(nextMessage.message);\n require(success, \"Cross-domain message call reverted. Did you set your gas limit high enough?\");\n lastRelayedMessage += 1;\n }\n}\n" - }, - "contracts/test-libraries/trie/TestLib_SecureMerkleTrie.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.7.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_SecureMerkleTrie } from \"../../optimistic-ethereum/libraries/trie/Lib_SecureMerkleTrie.sol\";\n\n/**\n * @title TestLib_SecureMerkleTrie\n */\ncontract TestLib_SecureMerkleTrie {\n\n function verifyInclusionProof(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n )\n public\n pure\n returns (\n bool\n )\n {\n return Lib_SecureMerkleTrie.verifyInclusionProof(\n _key,\n _value,\n _proof,\n _root\n );\n }\n\n function verifyExclusionProof(\n bytes memory _key,\n bytes memory _proof,\n bytes32 _root\n )\n public\n pure\n returns (\n bool\n )\n {\n return Lib_SecureMerkleTrie.verifyExclusionProof(\n _key,\n _proof,\n _root\n );\n }\n\n function update(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n )\n public\n pure\n returns (\n bytes32\n )\n {\n return Lib_SecureMerkleTrie.update(\n _key,\n _value,\n _proof,\n _root\n );\n }\n\n function get(\n bytes memory _key,\n bytes memory _proof,\n bytes32 _root\n )\n public\n pure\n returns (\n bool,\n bytes memory\n )\n {\n return Lib_SecureMerkleTrie.get(\n _key,\n _proof,\n _root\n );\n }\n\n function getSingleNodeRootHash(\n bytes memory _key,\n bytes memory _value\n )\n public\n pure\n returns (\n bytes32\n )\n {\n return Lib_SecureMerkleTrie.getSingleNodeRootHash(\n _key,\n _value\n );\n }\n}\n" - }, - "contracts/test-libraries/trie/TestLib_MerkleTrie.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.7.0;\n\n/* Library Imports */\nimport { Lib_MerkleTrie } from \"../../optimistic-ethereum/libraries/trie/Lib_MerkleTrie.sol\";\n\n/**\n * @title TestLib_MerkleTrie\n */\ncontract TestLib_MerkleTrie {\n\n function verifyInclusionProof(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n )\n public\n pure\n returns (\n bool\n )\n {\n return Lib_MerkleTrie.verifyInclusionProof(\n _key,\n _value,\n _proof,\n _root\n );\n }\n\n function verifyExclusionProof(\n bytes memory _key,\n bytes memory _proof,\n bytes32 _root\n )\n public\n pure\n returns (\n bool\n )\n {\n return Lib_MerkleTrie.verifyExclusionProof(\n _key,\n _proof,\n _root\n );\n }\n\n function update(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n )\n public\n pure\n returns (\n bytes32\n )\n {\n return Lib_MerkleTrie.update(\n _key,\n _value,\n _proof,\n _root\n );\n }\n\n function get(\n bytes memory _key,\n bytes memory _proof,\n bytes32 _root\n )\n public\n pure\n returns (\n bool,\n bytes memory\n )\n {\n return Lib_MerkleTrie.get(\n _key,\n _proof,\n _root\n );\n }\n\n function getSingleNodeRootHash(\n bytes memory _key,\n bytes memory _value\n )\n public\n pure\n returns (\n bytes32\n )\n {\n return Lib_MerkleTrie.getSingleNodeRootHash(\n _key,\n _value\n );\n }\n}\n" - }, - "contracts/test-libraries/rlp/TestLib_RLPWriter.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.7.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_RLPWriter } from \"../../optimistic-ethereum/libraries/rlp/Lib_RLPWriter.sol\";\nimport { TestERC20 } from \"../../test-helpers/TestERC20.sol\";\n\n/**\n * @title TestLib_RLPWriter\n */\ncontract TestLib_RLPWriter {\n\n function writeBytes(\n bytes memory _in\n )\n public\n pure\n returns (\n bytes memory _out\n )\n {\n return Lib_RLPWriter.writeBytes(_in);\n }\n\n function writeList(\n bytes[] memory _in\n )\n public\n pure\n returns (\n bytes memory _out\n )\n {\n return Lib_RLPWriter.writeList(_in);\n }\n\n function writeString(\n string memory _in\n )\n public\n pure\n returns (\n bytes memory _out\n )\n {\n return Lib_RLPWriter.writeString(_in);\n }\n\n function writeAddress(\n address _in\n )\n public\n pure\n returns (\n bytes memory _out\n )\n {\n return Lib_RLPWriter.writeAddress(_in);\n }\n\n function writeUint(\n uint256 _in\n )\n public\n pure\n returns (\n bytes memory _out\n )\n {\n return Lib_RLPWriter.writeUint(_in);\n }\n\n function writeBool(\n bool _in\n )\n public\n pure\n returns (\n bytes memory _out\n )\n {\n return Lib_RLPWriter.writeBool(_in);\n }\n\n function writeAddressWithTaintedMemory(\n address _in\n )\n public\n returns (\n bytes memory _out\n )\n {\n new TestERC20();\n return Lib_RLPWriter.writeAddress(_in);\n }\n}\n" - }, - "contracts/test-helpers/TestERC20.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.7.0;\n\n// a test ERC20 token with an open mint function\ncontract TestERC20 {\n using SafeMath for uint;\n\n string public constant name = 'Test';\n string public constant symbol = 'TST';\n uint8 public constant decimals = 18;\n uint256 public totalSupply;\n mapping(address => uint) public balanceOf;\n mapping(address => mapping(address => uint)) public allowance;\n\n event Approval(address indexed owner, address indexed spender, uint256 value);\n event Transfer(address indexed from, address indexed to, uint256 value);\n\n constructor() public {}\n\n function mint(address to, uint256 value) public {\n totalSupply = totalSupply.add(value);\n balanceOf[to] = balanceOf[to].add(value);\n emit Transfer(address(0), to, value);\n }\n\n function _approve(address owner, address spender, uint256 value) private {\n allowance[owner][spender] = value;\n emit Approval(owner, spender, value);\n }\n\n function _transfer(address from, address to, uint256 value) private {\n balanceOf[from] = balanceOf[from].sub(value);\n balanceOf[to] = balanceOf[to].add(value);\n emit Transfer(from, to, value);\n }\n\n function approve(address spender, uint256 value) external returns (bool) {\n _approve(msg.sender, spender, value);\n return true;\n }\n\n function transfer(address to, uint256 value) external returns (bool) {\n _transfer(msg.sender, to, value);\n return true;\n }\n\n function transferFrom(address from, address to, uint256 value) external returns (bool) {\n if (allowance[from][msg.sender] != uint(-1)) {\n allowance[from][msg.sender] = allowance[from][msg.sender].sub(value);\n }\n _transfer(from, to, value);\n return true;\n }\n}\n\nlibrary SafeMath {\n function add(uint256 x, uint256 y) internal pure returns (uint256 z) {\n require((z = x + y) >= x, 'ds-math-add-overflow');\n }\n\n function sub(uint256 x, uint256 y) internal pure returns (uint256 z) {\n require((z = x - y) <= x, 'ds-math-sub-underflow');\n }\n\n function mul(uint256 x, uint256 y) internal pure returns (uint256 z) {\n require(y == 0 || (z = x * y) / y == x, 'ds-math-mul-overflow');\n }\n}\n" - }, - "contracts/test-libraries/utils/TestLib_BytesUtils.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.7.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_BytesUtils } from \"../../optimistic-ethereum/libraries/utils/Lib_BytesUtils.sol\";\nimport { TestERC20 } from \"../../test-helpers/TestERC20.sol\";\n\n/**\n * @title TestLib_BytesUtils\n */\ncontract TestLib_BytesUtils {\n\n function concat(\n bytes memory _preBytes,\n bytes memory _postBytes\n )\n public\n pure\n returns (bytes memory)\n {\n return Lib_BytesUtils.concat(\n _preBytes,\n _postBytes\n );\n }\n\n function slice(\n bytes memory _bytes,\n uint256 _start,\n uint256 _length\n )\n public\n pure\n returns (bytes memory)\n {\n return Lib_BytesUtils.slice(\n _bytes,\n _start,\n _length\n );\n }\n\n function toBytes32(\n bytes memory _bytes\n )\n public\n pure\n returns (bytes32)\n {\n return Lib_BytesUtils.toBytes32(\n _bytes\n );\n }\n\n function toUint256(\n bytes memory _bytes\n )\n public\n pure\n returns (uint256)\n {\n return Lib_BytesUtils.toUint256(\n _bytes\n );\n }\n\n function toNibbles(\n bytes memory _bytes\n )\n public\n pure\n returns (bytes memory)\n {\n return Lib_BytesUtils.toNibbles(\n _bytes\n );\n }\n\n function fromNibbles(\n bytes memory _bytes\n )\n public\n pure\n returns (bytes memory)\n {\n return Lib_BytesUtils.fromNibbles(\n _bytes\n );\n }\n\n function equal(\n bytes memory _bytes,\n bytes memory _other\n )\n public\n pure\n returns (bool)\n {\n return Lib_BytesUtils.equal(\n _bytes,\n _other\n );\n }\n\n function sliceWithTaintedMemory(\n bytes memory _bytes,\n uint256 _start,\n uint256 _length\n )\n public\n returns (bytes memory)\n {\n new TestERC20();\n return Lib_BytesUtils.slice(\n _bytes,\n _start,\n _length\n );\n }\n}\n" - }, - "contracts/test-libraries/utils/TestLib_EthUtils.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.7.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_EthUtils } from \"../../optimistic-ethereum/libraries/utils/Lib_EthUtils.sol\";\n\n/**\n * @title TestLib_EthUtils\n */\ncontract TestLib_EthUtils {\n\n function getCode(\n address _address,\n uint256 _offset,\n uint256 _length\n )\n public\n view\n returns (\n bytes memory _code\n )\n {\n return Lib_EthUtils.getCode(\n _address,\n _offset,\n _length\n );\n }\n\n function getCode(\n address _address\n )\n public\n view\n returns (\n bytes memory _code\n )\n {\n return Lib_EthUtils.getCode(\n _address\n );\n }\n\n function getCodeSize(\n address _address\n )\n public\n view\n returns (\n uint256 _codeSize\n )\n {\n return Lib_EthUtils.getCodeSize(\n _address\n );\n }\n\n function getCodeHash(\n address _address\n )\n public\n view\n returns (\n bytes32 _codeHash\n )\n {\n return Lib_EthUtils.getCodeHash(\n _address\n );\n }\n\n function createContract(\n bytes memory _code\n )\n public\n returns (\n address _created\n )\n {\n return Lib_EthUtils.createContract(\n _code\n );\n }\n\n function getAddressForCREATE(\n address _creator,\n uint256 _nonce\n )\n public\n pure\n returns (\n address _address\n )\n {\n return Lib_EthUtils.getAddressForCREATE(\n _creator,\n _nonce\n );\n }\n\n function getAddressForCREATE2(\n address _creator,\n bytes memory _bytecode,\n bytes32 _salt\n )\n public\n pure\n returns (address _address)\n {\n return Lib_EthUtils.getAddressForCREATE2(\n _creator,\n _bytecode,\n _salt\n );\n }\n}\n" - }, - "contracts/test-libraries/utils/TestLib_Bytes32Utils.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.7.0;\n\n/* Library Imports */\nimport { Lib_Bytes32Utils } from \"../../optimistic-ethereum/libraries/utils/Lib_Bytes32Utils.sol\";\n\n/**\n * @title TestLib_Byte32Utils\n */\ncontract TestLib_Bytes32Utils {\n\n function toBool(\n bytes32 _in\n )\n public\n pure\n returns (\n bool _out\n )\n {\n return Lib_Bytes32Utils.toBool(_in);\n }\n\n function fromBool(\n bool _in\n )\n public\n pure\n returns (\n bytes32 _out\n )\n {\n return Lib_Bytes32Utils.fromBool(_in);\n }\n\n function toAddress(\n bytes32 _in\n )\n public\n pure\n returns (\n address _out\n )\n {\n return Lib_Bytes32Utils.toAddress(_in);\n }\n\n function fromAddress(\n address _in\n )\n public\n pure\n returns (\n bytes32 _out\n )\n {\n return Lib_Bytes32Utils.fromAddress(_in);\n }\n}\n" - }, - "contracts/test-libraries/rlp/TestLib_RLPReader.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.7.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_RLPReader } from \"../../optimistic-ethereum/libraries/rlp/Lib_RLPReader.sol\";\n\n/**\n * @title TestLib_RLPReader\n */\ncontract TestLib_RLPReader {\n\n function readList(\n bytes memory _in\n )\n public\n pure\n returns (\n bytes[] memory\n )\n {\n Lib_RLPReader.RLPItem[] memory decoded = Lib_RLPReader.readList(_in);\n bytes[] memory out = new bytes[](decoded.length);\n for (uint256 i = 0; i < out.length; i++) {\n out[i] = Lib_RLPReader.readRawBytes(decoded[i]);\n }\n return out;\n }\n\n function readString(\n bytes memory _in\n )\n public\n pure\n returns (\n string memory\n )\n {\n return Lib_RLPReader.readString(_in);\n }\n\n function readBytes(\n bytes memory _in\n )\n public\n pure\n returns (\n bytes memory\n )\n {\n return Lib_RLPReader.readBytes(_in);\n }\n\n function readBytes32(\n bytes memory _in\n )\n public\n pure\n returns (\n bytes32\n )\n {\n return Lib_RLPReader.readBytes32(_in);\n }\n\n function readUint256(\n bytes memory _in\n )\n public\n pure\n returns (\n uint256\n )\n {\n return Lib_RLPReader.readUint256(_in);\n }\n\n function readBool(\n bytes memory _in\n )\n public\n pure\n returns (\n bool\n )\n {\n return Lib_RLPReader.readBool(_in);\n }\n\n function readAddress(\n bytes memory _in\n )\n public\n pure\n returns (\n address\n )\n {\n return Lib_RLPReader.readAddress(_in);\n }\n}\n" - }, - "contracts/optimistic-ethereum/libraries/resolver/Lib_ResolvedDelegateProxy.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.7.0;\n\n/* Library Imports */\nimport { Lib_AddressManager } from \"./Lib_AddressManager.sol\";\n\n/**\n * @title Lib_ResolvedDelegateProxy\n */\ncontract Lib_ResolvedDelegateProxy {\n\n /*************\n * Variables *\n *************/\n\n // Using mappings to store fields to avoid overwriting storage slots in the\n // implementation contract. For example, instead of storing these fields at\n // storage slot `0` & `1`, they are stored at `hash(${FIELD_NAME} + address(this))`\n // See: https://solidity.readthedocs.io/en/v0.7.0/internals/layout_in_storage.html\n mapping(address=>string) private implementationName;\n mapping(address=>Lib_AddressManager) private addressManager;\n\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Lib_AddressManager.\n * @param _implementationName implementationName of the contract to proxy to.\n */\n constructor(\n address _libAddressManager,\n string memory _implementationName\n )\n {\n addressManager[address(this)] = Lib_AddressManager(_libAddressManager);\n implementationName[address(this)] = _implementationName;\n }\n\n\n /*********************\n * Fallback Function *\n *********************/\n\n fallback()\n external\n {\n address target = addressManager[address(this)].getAddress((implementationName[address(this)]));\n require(\n target != address(0),\n \"Target address must be initialized.\"\n );\n\n (bool success, bytes memory returndata) = target.delegatecall(msg.data);\n\n if (success == true) {\n assembly {\n return(add(returndata, 0x20), mload(returndata))\n }\n } else {\n assembly {\n revert(add(returndata, 0x20), mload(returndata))\n }\n }\n }\n}\n" - }, - "contracts/test-libraries/utils/TestLib_MerkleTree.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.7.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_MerkleTree } from \"../../optimistic-ethereum/libraries/utils/Lib_MerkleTree.sol\";\n\n/**\n * @title TestLib_MerkleTree\n */\ncontract TestLib_MerkleTree {\n\n function getMerkleRoot(\n bytes32[] memory _elements\n )\n public\n view\n returns (\n bytes32\n )\n {\n return Lib_MerkleTree.getMerkleRoot(\n _elements\n );\n }\n\n function verify(\n bytes32 _root,\n bytes32 _leaf,\n uint256 _index,\n bytes32[] memory _siblings,\n uint256 _totalLeaves\n )\n public\n pure\n returns (\n bool\n )\n {\n return Lib_MerkleTree.verify(\n _root,\n _leaf,\n _index,\n _siblings,\n _totalLeaves\n );\n }\n}\n" - }, - "contracts/optimistic-ethereum/mockOVM/verification/mockOVM_BondManager.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.7.0;\n\n/* Interface Imports */\nimport { iOVM_BondManager } from \"../../iOVM/verification/iOVM_BondManager.sol\";\n\n/* Contract Imports */\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/**\n * @title mockOVM_BondManager\n */\ncontract mockOVM_BondManager is iOVM_BondManager, Lib_AddressResolver {\n constructor(\n address _libAddressManager\n )\n Lib_AddressResolver(_libAddressManager)\n {}\n\n function recordGasSpent(\n bytes32 _preStateRoot,\n bytes32 _txHash,\n address _who,\n uint256 _gasSpent\n )\n override\n public\n {}\n\n function finalize(\n bytes32 _preStateRoot,\n address _publisher,\n uint256 _timestamp\n )\n override\n public\n {}\n\n function deposit()\n override\n public\n {}\n\n function startWithdrawal()\n override\n public\n {}\n\n function finalizeWithdrawal()\n override\n public\n {}\n\n function claim(\n address _who\n )\n override\n public\n {}\n\n function isCollateralized(\n address _who\n )\n override\n public\n view\n returns (\n bool\n )\n {\n // Only authenticate sequencer to submit state root batches.\n return _who == resolve(\"OVM_Sequencer\");\n }\n\n function getGasSpent(\n bytes32 _preStateRoot,\n address _who\n )\n override\n public\n view\n returns (\n uint256\n )\n {\n return 0;\n }\n}\n" - }, - "contracts/optimistic-ethereum/OVM/execution/OVM_StateManagerFactory.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.7.0;\n\n/* Interface Imports */\nimport { iOVM_StateManager } from \"../../iOVM/execution/iOVM_StateManager.sol\";\nimport { iOVM_StateManagerFactory } from \"../../iOVM/execution/iOVM_StateManagerFactory.sol\";\n\n/* Contract Imports */\nimport { OVM_StateManager } from \"./OVM_StateManager.sol\";\n\n/**\n * @title OVM_StateManagerFactory\n */\ncontract OVM_StateManagerFactory is iOVM_StateManagerFactory {\n\n /***************************************\n * Public Functions: Contract Creation *\n ***************************************/\n\n /**\n * Creates a new OVM_StateManager\n * @param _owner Owner of the created contract.\n * @return _ovmStateManager New OVM_StateManager instance.\n */\n function create(\n address _owner\n )\n override\n public\n returns (\n iOVM_StateManager _ovmStateManager\n )\n {\n return new OVM_StateManager(_owner);\n }\n}\n" - }, - "contracts/optimistic-ethereum/OVM/execution/OVM_StateManager.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.7.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/* Interface Imports */\nimport { iOVM_StateManager } from \"../../iOVM/execution/iOVM_StateManager.sol\";\n\n/**\n * @title OVM_StateManager\n */\ncontract OVM_StateManager is iOVM_StateManager {\n\n /**********************\n * Contract Constants *\n **********************/\n\n bytes32 constant internal EMPTY_ACCOUNT_STORAGE_ROOT = 0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421;\n bytes32 constant internal EMPTY_ACCOUNT_CODE_HASH = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;\n bytes32 constant internal STORAGE_XOR_VALUE = 0xFEEDFACECAFEBEEFFEEDFACECAFEBEEFFEEDFACECAFEBEEFFEEDFACECAFEBEEF;\n\n\n /*******************************************\n * Contract Variables: Contract References *\n *******************************************/\n\n address override public owner;\n address override public ovmExecutionManager;\n\n\n /****************************************\n * Contract Variables: Internal Storage *\n ****************************************/\n\n mapping (address => Lib_OVMCodec.Account) internal accounts;\n mapping (address => mapping (bytes32 => bytes32)) internal contractStorage;\n mapping (address => mapping (bytes32 => bool)) internal verifiedContractStorage;\n mapping (bytes32 => ItemState) internal itemStates;\n uint256 internal totalUncommittedAccounts;\n uint256 internal totalUncommittedContractStorage;\n\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _owner Address of the owner of this contract.\n */\n constructor(\n address _owner\n ) {\n owner = _owner;\n }\n\n\n /**********************\n * Function Modifiers *\n **********************/\n\n /**\n * Simple authentication, this contract should only be accessible to the owner or to the\n * OVM_ExecutionManager during the transaction execution process.\n */\n modifier authenticated() {\n require(\n msg.sender == owner || msg.sender == ovmExecutionManager,\n \"Function can only be called by authenticated addresses\"\n );\n _;\n }\n\n /***************************\n * Public Functions: Misc *\n ***************************/\n\n\n function isAuthenticated(\n address _address\n )\n override\n public\n view\n returns (bool)\n {\n return (_address == owner || _address == ovmExecutionManager);\n }\n\n /***************************\n * Public Functions: Setup *\n ***************************/\n\n /**\n * Sets the address of the OVM_ExecutionManager.\n * @param _ovmExecutionManager Address of the OVM_ExecutionManager.\n */\n function setExecutionManager(\n address _ovmExecutionManager\n )\n override\n public\n authenticated\n {\n ovmExecutionManager = _ovmExecutionManager;\n }\n\n\n /************************************\n * Public Functions: Account Access *\n ************************************/\n\n /**\n * Inserts an account into the state.\n * @param _address Address of the account to insert.\n * @param _account Account to insert for the given address.\n */\n function putAccount(\n address _address,\n Lib_OVMCodec.Account memory _account\n )\n override\n public\n authenticated\n {\n accounts[_address] = _account;\n }\n\n /**\n * Marks an account as empty.\n * @param _address Address of the account to mark.\n */\n function putEmptyAccount(\n address _address\n )\n override\n public\n authenticated\n {\n Lib_OVMCodec.Account storage account = accounts[_address];\n account.storageRoot = EMPTY_ACCOUNT_STORAGE_ROOT;\n account.codeHash = EMPTY_ACCOUNT_CODE_HASH;\n }\n\n /**\n * Retrieves an account from the state.\n * @param _address Address of the account to retrieve.\n * @return _account Account for the given address.\n */\n function getAccount(address _address)\n override\n public\n view\n returns (\n Lib_OVMCodec.Account memory _account\n )\n {\n return accounts[_address];\n }\n\n /**\n * Checks whether the state has a given account.\n * @param _address Address of the account to check.\n * @return _exists Whether or not the state has the account.\n */\n function hasAccount(\n address _address\n )\n override\n public\n view\n returns (\n bool _exists\n )\n {\n return accounts[_address].codeHash != bytes32(0);\n }\n\n /**\n * Checks whether the state has a given known empty account.\n * @param _address Address of the account to check.\n * @return _exists Whether or not the state has the empty account.\n */\n function hasEmptyAccount(\n address _address\n )\n override\n public\n view\n returns (\n bool _exists\n )\n {\n return (\n accounts[_address].codeHash == EMPTY_ACCOUNT_CODE_HASH\n && accounts[_address].nonce == 0\n );\n }\n\n /**\n * Sets the nonce of an account.\n * @param _address Address of the account to modify.\n * @param _nonce New account nonce.\n */\n function setAccountNonce(\n address _address,\n uint256 _nonce\n )\n override\n public\n authenticated\n {\n accounts[_address].nonce = _nonce;\n }\n\n /**\n * Gets the nonce of an account.\n * @param _address Address of the account to access.\n * @return _nonce Nonce of the account.\n */\n function getAccountNonce(\n address _address\n )\n override\n public\n view\n returns (\n uint256 _nonce\n )\n {\n return accounts[_address].nonce;\n }\n\n /**\n * Retrieves the Ethereum address of an account.\n * @param _address Address of the account to access.\n * @return _ethAddress Corresponding Ethereum address.\n */\n function getAccountEthAddress(\n address _address\n )\n override\n public\n view\n returns (\n address _ethAddress\n )\n {\n return accounts[_address].ethAddress;\n }\n\n /**\n * Retrieves the storage root of an account.\n * @param _address Address of the account to access.\n * @return _storageRoot Corresponding storage root.\n */\n function getAccountStorageRoot(\n address _address\n )\n override\n public\n view\n returns (\n bytes32 _storageRoot\n )\n {\n return accounts[_address].storageRoot;\n }\n\n /**\n * Initializes a pending account (during CREATE or CREATE2) with the default values.\n * @param _address Address of the account to initialize.\n */\n function initPendingAccount(\n address _address\n )\n override\n public\n authenticated\n {\n Lib_OVMCodec.Account storage account = accounts[_address];\n account.nonce = 1;\n account.storageRoot = EMPTY_ACCOUNT_STORAGE_ROOT;\n account.codeHash = EMPTY_ACCOUNT_CODE_HASH;\n account.isFresh = true;\n }\n\n /**\n * Finalizes the creation of a pending account (during CREATE or CREATE2).\n * @param _address Address of the account to finalize.\n * @param _ethAddress Address of the account's associated contract on Ethereum.\n * @param _codeHash Hash of the account's code.\n */\n function commitPendingAccount(\n address _address,\n address _ethAddress,\n bytes32 _codeHash\n )\n override\n public\n authenticated\n {\n Lib_OVMCodec.Account storage account = accounts[_address];\n account.ethAddress = _ethAddress;\n account.codeHash = _codeHash;\n }\n\n /**\n * Checks whether an account has already been retrieved, and marks it as retrieved if not.\n * @param _address Address of the account to check.\n * @return _wasAccountAlreadyLoaded Whether or not the account was already loaded.\n */\n function testAndSetAccountLoaded(\n address _address\n )\n override\n public\n authenticated\n returns (\n bool _wasAccountAlreadyLoaded\n )\n {\n return _testAndSetItemState(\n _getItemHash(_address),\n ItemState.ITEM_LOADED\n );\n }\n\n /**\n * Checks whether an account has already been modified, and marks it as modified if not.\n * @param _address Address of the account to check.\n * @return _wasAccountAlreadyChanged Whether or not the account was already modified.\n */\n function testAndSetAccountChanged(\n address _address\n )\n override\n public\n authenticated\n returns (\n bool _wasAccountAlreadyChanged\n )\n {\n return _testAndSetItemState(\n _getItemHash(_address),\n ItemState.ITEM_CHANGED\n );\n }\n\n /**\n * Attempts to mark an account as committed.\n * @param _address Address of the account to commit.\n * @return _wasAccountCommitted Whether or not the account was committed.\n */\n function commitAccount(\n address _address\n )\n override\n public\n authenticated\n returns (\n bool _wasAccountCommitted\n )\n {\n bytes32 item = _getItemHash(_address);\n if (itemStates[item] != ItemState.ITEM_CHANGED) {\n return false;\n }\n\n itemStates[item] = ItemState.ITEM_COMMITTED;\n totalUncommittedAccounts -= 1;\n\n return true;\n }\n\n /**\n * Increments the total number of uncommitted accounts.\n */\n function incrementTotalUncommittedAccounts()\n override\n public\n authenticated\n {\n totalUncommittedAccounts += 1;\n }\n\n /**\n * Gets the total number of uncommitted accounts.\n * @return _total Total uncommitted accounts.\n */\n function getTotalUncommittedAccounts()\n override\n public\n view\n returns (\n uint256 _total\n )\n {\n return totalUncommittedAccounts;\n }\n\n /**\n * Checks whether a given account was changed during execution.\n * @param _address Address to check.\n * @return Whether or not the account was changed.\n */\n function wasAccountChanged(\n address _address\n )\n override\n public\n view\n returns (\n bool\n )\n {\n bytes32 item = _getItemHash(_address);\n return itemStates[item] >= ItemState.ITEM_CHANGED;\n }\n\n /**\n * Checks whether a given account was committed after execution.\n * @param _address Address to check.\n * @return Whether or not the account was committed.\n */\n function wasAccountCommitted(\n address _address\n )\n override\n public\n view\n returns (\n bool\n )\n {\n bytes32 item = _getItemHash(_address);\n return itemStates[item] >= ItemState.ITEM_COMMITTED;\n }\n\n\n /************************************\n * Public Functions: Storage Access *\n ************************************/\n\n /**\n * Changes a contract storage slot value.\n * @param _contract Address of the contract to modify.\n * @param _key 32 byte storage slot key.\n * @param _value 32 byte storage slot value.\n */\n function putContractStorage(\n address _contract,\n bytes32 _key,\n bytes32 _value\n )\n override\n public\n authenticated\n {\n // A hilarious optimization. `SSTORE`ing a value of `bytes32(0)` is common enough that it's\n // worth populating this with a non-zero value in advance (during the fraud proof\n // initialization phase) to cut the execution-time cost down to 5000 gas.\n contractStorage[_contract][_key] = _value ^ STORAGE_XOR_VALUE;\n\n // Only used when initially populating the contract storage. OVM_ExecutionManager will\n // perform a `hasContractStorage` INVALID_STATE_ACCESS check before putting any contract\n // storage because writing to zero when the actual value is nonzero causes a gas\n // discrepancy. Could be moved into a new `putVerifiedContractStorage` function, or\n // something along those lines.\n if (verifiedContractStorage[_contract][_key] == false) {\n verifiedContractStorage[_contract][_key] = true;\n }\n }\n\n /**\n * Retrieves a contract storage slot value.\n * @param _contract Address of the contract to access.\n * @param _key 32 byte storage slot key.\n * @return _value 32 byte storage slot value.\n */\n function getContractStorage(\n address _contract,\n bytes32 _key\n )\n override\n public\n view\n returns (\n bytes32 _value\n )\n {\n // Storage XOR system doesn't work for newly created contracts that haven't set this\n // storage slot value yet.\n if (\n verifiedContractStorage[_contract][_key] == false\n && accounts[_contract].isFresh\n ) {\n return bytes32(0);\n }\n\n // See `putContractStorage` for more information about the XOR here.\n return contractStorage[_contract][_key] ^ STORAGE_XOR_VALUE;\n }\n\n /**\n * Checks whether a contract storage slot exists in the state.\n * @param _contract Address of the contract to access.\n * @param _key 32 byte storage slot key.\n * @return _exists Whether or not the key was set in the state.\n */\n function hasContractStorage(\n address _contract,\n bytes32 _key\n )\n override\n public\n view\n returns (\n bool _exists\n )\n {\n return verifiedContractStorage[_contract][_key] || accounts[_contract].isFresh;\n }\n\n /**\n * Checks whether a storage slot has already been retrieved, and marks it as retrieved if not.\n * @param _contract Address of the contract to check.\n * @param _key 32 byte storage slot key.\n * @return _wasContractStorageAlreadyLoaded Whether or not the slot was already loaded.\n */\n function testAndSetContractStorageLoaded(\n address _contract,\n bytes32 _key\n )\n override\n public\n authenticated\n returns (\n bool _wasContractStorageAlreadyLoaded\n )\n {\n return _testAndSetItemState(\n _getItemHash(_contract, _key),\n ItemState.ITEM_LOADED\n );\n }\n\n /**\n * Checks whether a storage slot has already been modified, and marks it as modified if not.\n * @param _contract Address of the contract to check.\n * @param _key 32 byte storage slot key.\n * @return _wasContractStorageAlreadyChanged Whether or not the slot was already modified.\n */\n function testAndSetContractStorageChanged(\n address _contract,\n bytes32 _key\n )\n override\n public\n authenticated\n returns (\n bool _wasContractStorageAlreadyChanged\n )\n {\n return _testAndSetItemState(\n _getItemHash(_contract, _key),\n ItemState.ITEM_CHANGED\n );\n }\n\n /**\n * Attempts to mark a storage slot as committed.\n * @param _contract Address of the account to commit.\n * @param _key 32 byte slot key to commit.\n * @return _wasContractStorageCommitted Whether or not the slot was committed.\n */\n function commitContractStorage(\n address _contract,\n bytes32 _key\n )\n override\n public\n authenticated\n returns (\n bool _wasContractStorageCommitted\n )\n {\n bytes32 item = _getItemHash(_contract, _key);\n if (itemStates[item] != ItemState.ITEM_CHANGED) {\n return false;\n }\n\n itemStates[item] = ItemState.ITEM_COMMITTED;\n totalUncommittedContractStorage -= 1;\n\n return true;\n }\n\n /**\n * Increments the total number of uncommitted storage slots.\n */\n function incrementTotalUncommittedContractStorage()\n override\n public\n authenticated\n {\n totalUncommittedContractStorage += 1;\n }\n\n /**\n * Gets the total number of uncommitted storage slots.\n * @return _total Total uncommitted storage slots.\n */\n function getTotalUncommittedContractStorage()\n override\n public\n view\n returns (\n uint256 _total\n )\n {\n return totalUncommittedContractStorage;\n }\n\n /**\n * Checks whether a given storage slot was changed during execution.\n * @param _contract Address to check.\n * @param _key Key of the storage slot to check.\n * @return Whether or not the storage slot was changed.\n */\n function wasContractStorageChanged(\n address _contract,\n bytes32 _key\n )\n override\n public\n view\n returns (\n bool\n )\n {\n bytes32 item = _getItemHash(_contract, _key);\n return itemStates[item] >= ItemState.ITEM_CHANGED;\n }\n\n /**\n * Checks whether a given storage slot was committed after execution.\n * @param _contract Address to check.\n * @param _key Key of the storage slot to check.\n * @return Whether or not the storage slot was committed.\n */\n function wasContractStorageCommitted(\n address _contract,\n bytes32 _key\n )\n override\n public\n view\n returns (\n bool\n )\n {\n bytes32 item = _getItemHash(_contract, _key);\n return itemStates[item] >= ItemState.ITEM_COMMITTED;\n }\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Generates a unique hash for an address.\n * @param _address Address to generate a hash for.\n * @return Unique hash for the given address.\n */\n function _getItemHash(\n address _address\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n return keccak256(abi.encodePacked(_address));\n }\n\n /**\n * Generates a unique hash for an address/key pair.\n * @param _contract Address to generate a hash for.\n * @param _key Key to generate a hash for.\n * @return Unique hash for the given pair.\n */\n function _getItemHash(\n address _contract,\n bytes32 _key\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n return keccak256(abi.encodePacked(\n _contract,\n _key\n ));\n }\n\n /**\n * Checks whether an item is in a particular state (ITEM_LOADED or ITEM_CHANGED) and sets the\n * item to the provided state if not.\n * @param _item 32 byte item ID to check.\n * @param _minItemState Minimum state that must be satisfied by the item.\n * @return _wasItemState Whether or not the item was already in the state.\n */\n function _testAndSetItemState(\n bytes32 _item,\n ItemState _minItemState\n )\n internal\n returns (\n bool _wasItemState\n )\n {\n bool wasItemState = itemStates[_item] >= _minItemState;\n\n if (wasItemState == false) {\n itemStates[_item] = _minItemState;\n }\n\n return wasItemState;\n }\n}\n" - }, - "contracts/optimistic-ethereum/mockOVM/accounts/mockOVM_ECDSAContractAccount.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.7.0;\npragma experimental ABIEncoderV2;\n\n/* Interface Imports */\nimport { iOVM_ECDSAContractAccount } from \"../../iOVM/accounts/iOVM_ECDSAContractAccount.sol\";\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_ECDSAUtils } from \"../../libraries/utils/Lib_ECDSAUtils.sol\";\nimport { Lib_SafeExecutionManagerWrapper } from \"../../libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\";\n\n/**\n * @title mockOVM_ECDSAContractAccount\n */\ncontract mockOVM_ECDSAContractAccount is iOVM_ECDSAContractAccount {\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Executes a signed transaction.\n * @param _transaction Signed EOA transaction.\n * @param _signatureType Hashing scheme used for the transaction (e.g., ETH signed message).\n * @param _v Signature `v` parameter.\n * @param _r Signature `r` parameter.\n * @param _s Signature `s` parameter.\n * @return _success Whether or not the call returned (rather than reverted).\n * @return _returndata Data returned by the call.\n */\n function execute(\n bytes memory _transaction,\n Lib_OVMCodec.EOASignatureType _signatureType,\n uint8 _v,\n bytes32 _r,\n bytes32 _s\n )\n override\n public\n returns (\n bool _success,\n bytes memory _returndata\n )\n {\n bool isEthSign = _signatureType == Lib_OVMCodec.EOASignatureType.ETH_SIGNED_MESSAGE;\n Lib_OVMCodec.EIP155Transaction memory decodedTx = Lib_OVMCodec.decodeEIP155Transaction(_transaction, isEthSign);\n\n // Need to make sure that the transaction nonce is right.\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(\n decodedTx.nonce == Lib_SafeExecutionManagerWrapper.safeGETNONCE(),\n \"Transaction nonce does not match the expected nonce.\"\n );\n\n // Contract creations are signalled by sending a transaction to the zero address.\n if (decodedTx.to == address(0)) {\n address created = Lib_SafeExecutionManagerWrapper.safeCREATE(\n decodedTx.gasLimit,\n decodedTx.data\n );\n\n // If the created address is the ZERO_ADDRESS then we know the deployment failed, though not why\n return (created != address(0), abi.encode(created));\n } else {\n // We only want to bump the nonce for `ovmCALL` because `ovmCREATE` automatically bumps\n // the nonce of the calling account. Normally an EOA would bump the nonce for both\n // cases, but since this is a contract we'd end up bumping the nonce twice.\n Lib_SafeExecutionManagerWrapper.safeSETNONCE(decodedTx.nonce + 1);\n\n return Lib_SafeExecutionManagerWrapper.safeCALL(\n decodedTx.gasLimit,\n decodedTx.to,\n decodedTx.data\n );\n }\n }\n\n function qall(\n uint256 _gasLimit,\n address _to,\n bytes memory _data\n )\n public\n returns (\n bool _success,\n bytes memory _returndata\n )\n {\n return Lib_SafeExecutionManagerWrapper.safeCALL(\n _gasLimit,\n _to,\n _data\n );\n }\n}\n" - }, - "contracts/optimistic-ethereum/OVM/precompiles/OVM_ProxySequencerEntrypoint.sol": { - "content": "pragma solidity ^0.7.0;\n\n/* Library Imports */\nimport { Lib_SafeExecutionManagerWrapper } from \"../../libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\";\n\n/**\n * @title OVM_ProxySequencerEntrypoint\n */\ncontract OVM_ProxySequencerEntrypoint {\n\n /*********************\n * Fallback Function *\n *********************/\n\n fallback()\n external\n {\n Lib_SafeExecutionManagerWrapper.safeDELEGATECALL(\n gasleft(),\n _getImplementation(),\n msg.data\n );\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n function init(\n address _implementation,\n address _owner\n )\n external\n {\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(\n _getOwner() == address(0),\n \"ProxySequencerEntrypoint has already been inited\"\n );\n _setOwner(_owner);\n _setImplementation(_implementation);\n }\n\n function upgrade(\n address _implementation\n )\n external\n {\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(\n _getOwner() == Lib_SafeExecutionManagerWrapper.safeCALLER(),\n \"Only owner can upgrade the Entrypoint\"\n );\n\n _setImplementation(_implementation);\n }\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n function _setImplementation(\n address _implementation\n )\n internal\n {\n Lib_SafeExecutionManagerWrapper.safeSSTORE(\n bytes32(uint256(0)),\n bytes32(uint256(uint160(_implementation)))\n );\n }\n\n function _getImplementation()\n internal\n returns (\n address _implementation\n )\n {\n return address(uint160(uint256(\n Lib_SafeExecutionManagerWrapper.safeSLOAD(\n bytes32(uint256(0))\n )\n )));\n }\n\n function _setOwner(\n address _owner\n )\n internal\n {\n Lib_SafeExecutionManagerWrapper.safeSSTORE(\n bytes32(uint256(1)),\n bytes32(uint256(uint160(_owner)))\n );\n }\n\n function _getOwner()\n internal\n returns (\n address _owner\n )\n {\n return address(uint160(uint256(\n Lib_SafeExecutionManagerWrapper.safeSLOAD(\n bytes32(uint256(1))\n )\n )));\n }\n}\n" - }, - "contracts/optimistic-ethereum/OVM/execution/OVM_SafetyChecker.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.7.0;\n\n/* Interface Imports */\nimport { iOVM_SafetyChecker } from \"../../iOVM/execution/iOVM_SafetyChecker.sol\";\n\n/**\n * @title OVM_SafetyChecker\n */\ncontract OVM_SafetyChecker is iOVM_SafetyChecker {\n\n /********************\n * Public Functions *\n ********************/\n /**\n * Returns whether or not all of the provided bytecode is safe.\n * @param _bytecode The bytecode to safety check.\n * @return `true` if the bytecode is safe, `false` otherwise.\n */\n function isBytecodeSafe(\n bytes memory _bytecode\n )\n override\n external\n pure\n returns (bool)\n {\n // autogenerated by gen_safety_checker_constants.py\n // number of bytes to skip for each opcode\n uint256[8] memory opcodeSkippableBytes = [\n uint256(0x0001010101010101010101010000000001010101010101010101010101010000),\n uint256(0x0100000000000000000000000000000000000000010101010101000000010100),\n uint256(0x0000000000000000000000000000000001010101000000010101010100000000),\n uint256(0x0203040500000000000000000000000000000000000000000000000000000000),\n uint256(0x0101010101010101010101010101010101010101010101010101010101010101),\n uint256(0x0101010101000000000000000000000000000000000000000000000000000000),\n uint256(0x0000000000000000000000000000000000000000000000000000000000000000),\n uint256(0x0000000000000000000000000000000000000000000000000000000000000000)\n ];\n // Mask to gate opcode specific cases\n uint256 opcodeGateMask = ~uint256(0xffffffffffffffffffffffe000000000fffffffff070ffff9c0ffffec000f001);\n // Halting opcodes\n uint256 opcodeHaltingMask = ~uint256(0x4008000000000000000000000000000000000000004000000000000000000001);\n // PUSH opcodes\n uint256 opcodePushMask = ~uint256(0xffffffff000000000000000000000000);\n\n uint256 codeLength;\n uint256 _pc;\n assembly {\n _pc := add(_bytecode, 0x20)\n }\n codeLength = _pc + _bytecode.length;\n do {\n // current opcode: 0x00...0xff\n uint256 opNum;\n\n // inline assembly removes the extra add + bounds check\n assembly {\n let word := mload(_pc) //load the next 32 bytes at pc into word\n\n // Look up number of bytes to skip from opcodeSkippableBytes and then update indexInWord\n // E.g. the 02030405 in opcodeSkippableBytes is the number of bytes to skip for PUSH1->4\n // We repeat this 6 times, thus we can only skip bytes for up to PUSH4 ((1+4) * 6 = 30 < 32).\n // If we see an opcode that is listed as 0 skippable bytes e.g. PUSH5,\n // then we will get stuck on that indexInWord and then opNum will be set to the PUSH5 opcode.\n let indexInWord := byte(0, mload(add(opcodeSkippableBytes, byte(0, word))))\n indexInWord := add(indexInWord, byte(0, mload(add(opcodeSkippableBytes, byte(indexInWord, word)))))\n indexInWord := add(indexInWord, byte(0, mload(add(opcodeSkippableBytes, byte(indexInWord, word)))))\n indexInWord := add(indexInWord, byte(0, mload(add(opcodeSkippableBytes, byte(indexInWord, word)))))\n indexInWord := add(indexInWord, byte(0, mload(add(opcodeSkippableBytes, byte(indexInWord, word)))))\n indexInWord := add(indexInWord, byte(0, mload(add(opcodeSkippableBytes, byte(indexInWord, word)))))\n _pc := add(_pc, indexInWord)\n\n opNum := byte(indexInWord, word)\n }\n\n // + push opcodes\n // + stop opcodes [STOP(0x00),JUMP(0x56),RETURN(0xf3),INVALID(0xfe)]\n // + caller opcode CALLER(0x33)\n // + blacklisted opcodes\n uint256 opBit = 1 << opNum;\n if (opBit & opcodeGateMask == 0) {\n if (opBit & opcodePushMask == 0) {\n // all pushes are valid opcodes\n // subsequent bytes are not opcodes. Skip them.\n _pc += (opNum - 0x5e); // PUSH1 is 0x60, so opNum-0x5f = PUSHed bytes and we +1 to\n // skip the _pc++; line below in order to save gas ((-0x5f + 1) = -0x5e)\n continue;\n } else if (opBit & opcodeHaltingMask == 0) {\n // STOP or JUMP or RETURN or INVALID (Note: REVERT is blacklisted, so not included here)\n // We are now inside unreachable code until we hit a JUMPDEST!\n do {\n _pc++;\n assembly {\n opNum := byte(0, mload(_pc))\n }\n // encountered a JUMPDEST\n if (opNum == 0x5b) break;\n // skip PUSHed bytes\n if ((1 << opNum) & opcodePushMask == 0) _pc += (opNum - 0x5f); // opNum-0x5f = PUSHed bytes (PUSH1 is 0x60)\n } while (_pc < codeLength);\n // opNum is 0x5b, so we don't continue here since the pc++ is fine\n } else if (opNum == 0x33) { // Caller opcode\n uint256 firstOps; // next 32 bytes of bytecode\n uint256 secondOps; // following 32 bytes of bytecode\n\n assembly {\n firstOps := mload(_pc)\n // 37 bytes total, 5 left over --> 32 - 5 bytes = 27 bytes = 216 bits\n secondOps := shr(216, mload(add(_pc, 0x20)))\n }\n\n // Call identity precompile\n // CALLER POP PUSH1 0x00 PUSH1 0x04 GAS CALL\n // 32 - 8 bytes = 24 bytes = 192\n if ((firstOps >> 192) == 0x3350600060045af1) {\n _pc += 8;\n // Call EM and abort execution if instructed\n // CALLER PUSH1 0x00 SWAP1 GAS CALL PC PUSH1 0x0E ADD JUMPI RETURNDATASIZE PUSH1 0x00 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x00 REVERT JUMPDEST RETURNDATASIZE PUSH1 0x01 EQ ISZERO PC PUSH1 0x0a ADD JUMPI PUSH1 0x01 PUSH1 0x00 RETURN JUMPDEST \n } else if (firstOps == 0x336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a015760 && secondOps == 0x016000f35b) {\n _pc += 37;\n } else {\n return false;\n }\n continue;\n } else {\n // encountered a non-whitelisted opcode!\n return false;\n }\n }\n _pc++;\n } while (_pc < codeLength);\n return true;\n }\n}\n" - } - }, - "settings": { - "optimizer": { - "enabled": true, - "runs": 200 - }, - "outputSelection": { - "*": { - "*": [ - "storageLayout", - "abi", - "evm.bytecode", - "evm.deployedBytecode", - "evm.methodIdentifiers", - "metadata", - "devdoc", - "userdoc", - "evm.gasEstimates" - ], - "": [ - "ast" - ] - } - }, - "metadata": { - "useLiteralContent": true - } - } -} \ No newline at end of file diff --git a/packages/contracts/deployments/goerli-v2/.chainId b/packages/contracts/deployments/goerli-v2/.chainId deleted file mode 100644 index 7813681f5b41c..0000000000000 --- a/packages/contracts/deployments/goerli-v2/.chainId +++ /dev/null @@ -1 +0,0 @@ -5 \ No newline at end of file diff --git a/packages/contracts/deployments/goerli-v2/Lib_AddressManager.json b/packages/contracts/deployments/goerli-v2/Lib_AddressManager.json deleted file mode 100644 index e7651b8b3943f..0000000000000 --- a/packages/contracts/deployments/goerli-v2/Lib_AddressManager.json +++ /dev/null @@ -1,232 +0,0 @@ -{ - "address": "0x9933d137bBF050Cf3D7555fE1beC91eF698814e5", - "abi": [ - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "string", - "name": "_name", - "type": "string" - }, - { - "indexed": false, - "internalType": "address", - "name": "_newAddress", - "type": "address" - } - ], - "name": "AddressSet", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "previousOwner", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "newOwner", - "type": "address" - } - ], - "name": "OwnershipTransferred", - "type": "event" - }, - { - "inputs": [ - { - "internalType": "string", - "name": "_name", - "type": "string" - } - ], - "name": "getAddress", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "owner", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "renounceOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "string", - "name": "_name", - "type": "string" - }, - { - "internalType": "address", - "name": "_address", - "type": "address" - } - ], - "name": "setAddress", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_newOwner", - "type": "address" - } - ], - "name": "transferOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - } - ], - "transactionHash": "0xe4bec6f564f060056fa29104ea4241e57cd26111d4ec962be1d736bdca12814b", - "receipt": { - "to": null, - "from": "0x558ba9b8d78713fbf768c1f8a584485B4003f43F", - "contractAddress": "0x9933d137bBF050Cf3D7555fE1beC91eF698814e5", - "transactionIndex": 45, - "gasUsed": "413950", - "logsBloom": "0x04000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000040000000000000200000000000000000000000000000000000000001000000000000000000000000000000000000020000000000000000000800000000000000000000000000000000400000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000001000000000000000000000000000000008000000000", - "blockHash": "0xc52edf9f260c95f0c03d48923deb9beb36cbf18c0064c04c6d4c9f2da843ad09", - "transactionHash": "0xe4bec6f564f060056fa29104ea4241e57cd26111d4ec962be1d736bdca12814b", - "logs": [ - { - "transactionIndex": 45, - "blockNumber": 4607685, - "transactionHash": "0xe4bec6f564f060056fa29104ea4241e57cd26111d4ec962be1d736bdca12814b", - "address": "0x9933d137bBF050Cf3D7555fE1beC91eF698814e5", - "topics": [ - "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x000000000000000000000000558ba9b8d78713fbf768c1f8a584485b4003f43f" - ], - "data": "0x", - "logIndex": 63, - "blockHash": "0xc52edf9f260c95f0c03d48923deb9beb36cbf18c0064c04c6d4c9f2da843ad09" - } - ], - "blockNumber": 4607685, - "cumulativeGasUsed": "5541035", - "status": 1, - "byzantium": true - }, - "args": [], - "solcInputHash": "8aef3555d89ad9d3af2f5d28a85dc856", - "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_newAddress\",\"type\":\"address\"}],\"name\":\"AddressSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"getAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"_address\",\"type\":\"address\"}],\"name\":\"setAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"getAddress(string)\":{\"params\":{\"_name\":\"Name to retrieve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}},\"setAddress(string,address)\":{\"params\":{\"_address\":\"Address to associate with the name.\",\"_name\":\"String name to associate an address with.\"}},\"transferOwnership(address)\":{\"params\":{\"_newOwner\":\"Address of the new contract owner.\"}}},\"title\":\"Lib_AddressManager\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"getAddress(string)\":{\"notice\":\"Retrieves the address associated with a given name.\"},\"renounceOwnership()\":{\"notice\":\"Sets the owner of this contract to the zero address, effectively renouncing ownership completely. Can only be called by the current owner of this contract.\"},\"setAddress(string,address)\":{\"notice\":\"Changes the address associated with a particular name.\"},\"transferOwnership(address)\":{\"notice\":\"Transfers ownership of this contract to a new address. Can only be called by the current owner of this contract.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":\"Lib_AddressManager\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Contract Imports */\\nimport { Ownable } from \\\"./Lib_Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n public\\n onlyOwner\\n {\\n addresses[_getNameHash(_name)] = _address;\\n\\n emit AddressSet(\\n _name,\\n _address\\n );\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0x36473d229ce0ba9d1cac5f02f84be843d9dcc8008525590a1652a2c2636f95f2\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Ownable\\n * @dev Adapted from https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol\\n */\\nabstract contract Ownable {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n address public owner;\\n\\n\\n /**********\\n * Events *\\n **********/\\n\\n event OwnershipTransferred(\\n address indexed previousOwner,\\n address indexed newOwner\\n );\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n constructor() {\\n owner = msg.sender;\\n emit OwnershipTransferred(address(0), owner);\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n owner == msg.sender,\\n \\\"Ownable: caller is not the owner\\\"\\n );\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the owner of this contract to the zero address, effectively renouncing ownership\\n * completely. Can only be called by the current owner of this contract.\\n */\\n function renounceOwnership()\\n public\\n virtual\\n onlyOwner\\n {\\n emit OwnershipTransferred(owner, address(0));\\n owner = address(0);\\n }\\n\\n /**\\n * Transfers ownership of this contract to a new address. Can only be called by the current\\n * owner of this contract.\\n * @param _newOwner Address of the new contract owner.\\n */\\n function transferOwnership(\\n address _newOwner\\n )\\n public\\n virtual\\n onlyOwner\\n {\\n require(\\n _newOwner != address(0),\\n \\\"Ownable: new owner cannot be the zero address\\\"\\n );\\n\\n emit OwnershipTransferred(owner, _newOwner);\\n owner = _newOwner;\\n }\\n}\\n\",\"keccak256\":\"0x83f9a6c4608b5929086429205b00f8211cdfcba83f3c84520f24d8aa64fe4b82\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x608060405234801561001057600080fd5b50600080546001600160a01b03191633178082556040516001600160a01b039190911691907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3610614806100696000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c8063715018a61461005c5780638da5cb5b146100665780639b2ea4bd1461008a578063bf40fac11461013b578063f2fde38b146101e1575b600080fd5b610064610207565b005b61006e6102b0565b604080516001600160a01b039092168252519081900360200190f35b610064600480360360408110156100a057600080fd5b8101906020810181356401000000008111156100bb57600080fd5b8201836020820111156100cd57600080fd5b803590602001918460018302840111640100000000831117156100ef57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550505090356001600160a01b031691506102bf9050565b61006e6004803603602081101561015157600080fd5b81019060208101813564010000000081111561016c57600080fd5b82018360208201111561017e57600080fd5b803590602001918460018302840111640100000000831117156101a057600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061040c945050505050565b610064600480360360208110156101f757600080fd5b50356001600160a01b031661043b565b6000546001600160a01b03163314610266576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b031681565b6000546001600160a01b0316331461031e576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b806001600061032c8561053a565b815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b031602179055507f188466739ff00cc68bfb2367d23ae4b855264264fe1624caa8884399af23454c82826040518080602001836001600160a01b03168152602001828103825284818151815260200191508051906020019080838360005b838110156103cd5781810151838201526020016103b5565b50505050905090810190601f1680156103fa5780820380516001836020036101000a031916815260200191505b50935050505060405180910390a15050565b60006001600061041b8461053a565b81526020810191909152604001600020546001600160a01b031692915050565b6000546001600160a01b0316331461049a576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b0381166104df5760405162461bcd60e51b815260040180806020018281038252602d8152602001806105b2602d913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000816040516020018082805190602001908083835b6020831061056f5780518252601f199092019160209182019101610550565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120905091905056fe4f776e61626c653a206e6577206f776e65722063616e6e6f7420626520746865207a65726f2061646472657373a26469706673582212203d2647bc6de3ee55079ebd08922f3e105da07a5b10855436eae39c7de4e20c4364736f6c63430007060033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100575760003560e01c8063715018a61461005c5780638da5cb5b146100665780639b2ea4bd1461008a578063bf40fac11461013b578063f2fde38b146101e1575b600080fd5b610064610207565b005b61006e6102b0565b604080516001600160a01b039092168252519081900360200190f35b610064600480360360408110156100a057600080fd5b8101906020810181356401000000008111156100bb57600080fd5b8201836020820111156100cd57600080fd5b803590602001918460018302840111640100000000831117156100ef57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550505090356001600160a01b031691506102bf9050565b61006e6004803603602081101561015157600080fd5b81019060208101813564010000000081111561016c57600080fd5b82018360208201111561017e57600080fd5b803590602001918460018302840111640100000000831117156101a057600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061040c945050505050565b610064600480360360208110156101f757600080fd5b50356001600160a01b031661043b565b6000546001600160a01b03163314610266576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b031681565b6000546001600160a01b0316331461031e576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b806001600061032c8561053a565b815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b031602179055507f188466739ff00cc68bfb2367d23ae4b855264264fe1624caa8884399af23454c82826040518080602001836001600160a01b03168152602001828103825284818151815260200191508051906020019080838360005b838110156103cd5781810151838201526020016103b5565b50505050905090810190601f1680156103fa5780820380516001836020036101000a031916815260200191505b50935050505060405180910390a15050565b60006001600061041b8461053a565b81526020810191909152604001600020546001600160a01b031692915050565b6000546001600160a01b0316331461049a576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b0381166104df5760405162461bcd60e51b815260040180806020018281038252602d8152602001806105b2602d913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000816040516020018082805190602001908083835b6020831061056f5780518252601f199092019160209182019101610550565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120905091905056fe4f776e61626c653a206e6577206f776e65722063616e6e6f7420626520746865207a65726f2061646472657373a26469706673582212203d2647bc6de3ee55079ebd08922f3e105da07a5b10855436eae39c7de4e20c4364736f6c63430007060033", - "devdoc": { - "kind": "dev", - "methods": { - "getAddress(string)": { - "params": { - "_name": "Name to retrieve an address for." - }, - "returns": { - "_0": "Address associated with the given name." - } - }, - "setAddress(string,address)": { - "params": { - "_address": "Address to associate with the name.", - "_name": "String name to associate an address with." - } - }, - "transferOwnership(address)": { - "params": { - "_newOwner": "Address of the new contract owner." - } - } - }, - "title": "Lib_AddressManager", - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": { - "getAddress(string)": { - "notice": "Retrieves the address associated with a given name." - }, - "renounceOwnership()": { - "notice": "Sets the owner of this contract to the zero address, effectively renouncing ownership completely. Can only be called by the current owner of this contract." - }, - "setAddress(string,address)": { - "notice": "Changes the address associated with a particular name." - }, - "transferOwnership(address)": { - "notice": "Transfers ownership of this contract to a new address. Can only be called by the current owner of this contract." - } - }, - "version": 1 - }, - "storageLayout": { - "storage": [ - { - "astId": 12590, - "contract": "contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol:Lib_AddressManager", - "label": "owner", - "offset": 0, - "slot": "0", - "type": "t_address" - }, - { - "astId": 12494, - "contract": "contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol:Lib_AddressManager", - "label": "addresses", - "offset": 0, - "slot": "1", - "type": "t_mapping(t_bytes32,t_address)" - } - ], - "types": { - "t_address": { - "encoding": "inplace", - "label": "address", - "numberOfBytes": "20" - }, - "t_bytes32": { - "encoding": "inplace", - "label": "bytes32", - "numberOfBytes": "32" - }, - "t_mapping(t_bytes32,t_address)": { - "encoding": "mapping", - "key": "t_bytes32", - "label": "mapping(bytes32 => address)", - "numberOfBytes": "32", - "value": "t_address" - } - } - } -} \ No newline at end of file diff --git a/packages/contracts/deployments/goerli-v2/OVM_CanonicalTransactionChain.json b/packages/contracts/deployments/goerli-v2/OVM_CanonicalTransactionChain.json deleted file mode 100644 index df2c201fa6c82..0000000000000 --- a/packages/contracts/deployments/goerli-v2/OVM_CanonicalTransactionChain.json +++ /dev/null @@ -1,819 +0,0 @@ -{ - "address": "0x557057458Ba57F03e3191ddA69118DFe42a7295d", - "abi": [ - { - "inputs": [ - { - "internalType": "address", - "name": "_libAddressManager", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_forceInclusionPeriodSeconds", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_forceInclusionPeriodBlocks", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_maxTransactionGasLimit", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint256", - "name": "_startingQueueIndex", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_numQueueElements", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_totalElements", - "type": "uint256" - } - ], - "name": "QueueBatchAppended", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint256", - "name": "_startingQueueIndex", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_numQueueElements", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_totalElements", - "type": "uint256" - } - ], - "name": "SequencerBatchAppended", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "_batchIndex", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "bytes32", - "name": "_batchRoot", - "type": "bytes32" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_batchSize", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_prevTotalElements", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "bytes", - "name": "_extraData", - "type": "bytes" - } - ], - "name": "TransactionBatchAppended", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "address", - "name": "_l1TxOrigin", - "type": "address" - }, - { - "indexed": false, - "internalType": "address", - "name": "_target", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_gasLimit", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "bytes", - "name": "_data", - "type": "bytes" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_queueIndex", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_timestamp", - "type": "uint256" - } - ], - "name": "TransactionEnqueued", - "type": "event" - }, - { - "inputs": [], - "name": "L2_GAS_DISCOUNT_DIVISOR", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "MAX_ROLLUP_TX_SIZE", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "MIN_ROLLUP_TX_GAS", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "name": "appendQueueBatch", - "outputs": [], - "stateMutability": "pure", - "type": "function" - }, - { - "inputs": [], - "name": "appendSequencerBatch", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "batches", - "outputs": [ - { - "internalType": "contract iOVM_ChainStorageContainer", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_target", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_gasLimit", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "_data", - "type": "bytes" - } - ], - "name": "enqueue", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "forceInclusionPeriodBlocks", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "forceInclusionPeriodSeconds", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getLastBlockNumber", - "outputs": [ - { - "internalType": "uint40", - "name": "", - "type": "uint40" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getLastTimestamp", - "outputs": [ - { - "internalType": "uint40", - "name": "", - "type": "uint40" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getNextQueueIndex", - "outputs": [ - { - "internalType": "uint40", - "name": "", - "type": "uint40" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getNumPendingQueueElements", - "outputs": [ - { - "internalType": "uint40", - "name": "", - "type": "uint40" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_index", - "type": "uint256" - } - ], - "name": "getQueueElement", - "outputs": [ - { - "components": [ - { - "internalType": "bytes32", - "name": "transactionHash", - "type": "bytes32" - }, - { - "internalType": "uint40", - "name": "timestamp", - "type": "uint40" - }, - { - "internalType": "uint40", - "name": "blockNumber", - "type": "uint40" - } - ], - "internalType": "struct Lib_OVMCodec.QueueElement", - "name": "_element", - "type": "tuple" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getQueueLength", - "outputs": [ - { - "internalType": "uint40", - "name": "", - "type": "uint40" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getTotalBatches", - "outputs": [ - { - "internalType": "uint256", - "name": "_totalBatches", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getTotalElements", - "outputs": [ - { - "internalType": "uint256", - "name": "_totalElements", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "libAddressManager", - "outputs": [ - { - "internalType": "contract Lib_AddressManager", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "maxTransactionGasLimit", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "queue", - "outputs": [ - { - "internalType": "contract iOVM_ChainStorageContainer", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "string", - "name": "_name", - "type": "string" - } - ], - "name": "resolve", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "components": [ - { - "internalType": "uint256", - "name": "timestamp", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "blockNumber", - "type": "uint256" - }, - { - "internalType": "enum Lib_OVMCodec.QueueOrigin", - "name": "l1QueueOrigin", - "type": "uint8" - }, - { - "internalType": "address", - "name": "l1TxOrigin", - "type": "address" - }, - { - "internalType": "address", - "name": "entrypoint", - "type": "address" - }, - { - "internalType": "uint256", - "name": "gasLimit", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "data", - "type": "bytes" - } - ], - "internalType": "struct Lib_OVMCodec.Transaction", - "name": "_transaction", - "type": "tuple" - }, - { - "components": [ - { - "internalType": "bool", - "name": "isSequenced", - "type": "bool" - }, - { - "internalType": "uint256", - "name": "queueIndex", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "timestamp", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "blockNumber", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "txData", - "type": "bytes" - } - ], - "internalType": "struct Lib_OVMCodec.TransactionChainElement", - "name": "_txChainElement", - "type": "tuple" - }, - { - "components": [ - { - "internalType": "uint256", - "name": "batchIndex", - "type": "uint256" - }, - { - "internalType": "bytes32", - "name": "batchRoot", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "batchSize", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "prevTotalElements", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "extraData", - "type": "bytes" - } - ], - "internalType": "struct Lib_OVMCodec.ChainBatchHeader", - "name": "_batchHeader", - "type": "tuple" - }, - { - "components": [ - { - "internalType": "uint256", - "name": "index", - "type": "uint256" - }, - { - "internalType": "bytes32[]", - "name": "siblings", - "type": "bytes32[]" - } - ], - "internalType": "struct Lib_OVMCodec.ChainInclusionProof", - "name": "_inclusionProof", - "type": "tuple" - } - ], - "name": "verifyTransaction", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - } - ], - "transactionHash": "0x1350cc92dc25ff2e7706ee71e66f17820f7942b7371d2c9b457b005ad75e18cf", - "receipt": { - "to": null, - "from": "0x558ba9b8d78713fbf768c1f8a584485B4003f43F", - "contractAddress": "0x557057458Ba57F03e3191ddA69118DFe42a7295d", - "transactionIndex": 39, - "gasUsed": "2831038", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0x314550dfc478df9b575d3c08fc9393605dd307eb6de60741b97db7e7bedc39cf", - "transactionHash": "0x1350cc92dc25ff2e7706ee71e66f17820f7942b7371d2c9b457b005ad75e18cf", - "logs": [], - "blockNumber": 4607699, - "cumulativeGasUsed": "6934376", - "status": 1, - "byzantium": true - }, - "args": [ - "0x9933d137bBF050Cf3D7555fE1beC91eF698814e5", - 18000000, - 1200000, - 9000000 - ], - "solcInputHash": "8aef3555d89ad9d3af2f5d28a85dc856", - "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_forceInclusionPeriodSeconds\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_forceInclusionPeriodBlocks\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_maxTransactionGasLimit\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_startingQueueIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_numQueueElements\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_totalElements\",\"type\":\"uint256\"}],\"name\":\"QueueBatchAppended\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_startingQueueIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_numQueueElements\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_totalElements\",\"type\":\"uint256\"}],\"name\":\"SequencerBatchAppended\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_batchIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"_batchRoot\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_batchSize\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_prevTotalElements\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"_extraData\",\"type\":\"bytes\"}],\"name\":\"TransactionBatchAppended\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_l1TxOrigin\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_queueIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_timestamp\",\"type\":\"uint256\"}],\"name\":\"TransactionEnqueued\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"L2_GAS_DISCOUNT_DIVISOR\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAX_ROLLUP_TX_SIZE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MIN_ROLLUP_TX_GAS\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"appendQueueBatch\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"appendSequencerBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"batches\",\"outputs\":[{\"internalType\":\"contract iOVM_ChainStorageContainer\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"enqueue\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"forceInclusionPeriodBlocks\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"forceInclusionPeriodSeconds\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLastBlockNumber\",\"outputs\":[{\"internalType\":\"uint40\",\"name\":\"\",\"type\":\"uint40\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLastTimestamp\",\"outputs\":[{\"internalType\":\"uint40\",\"name\":\"\",\"type\":\"uint40\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getNextQueueIndex\",\"outputs\":[{\"internalType\":\"uint40\",\"name\":\"\",\"type\":\"uint40\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getNumPendingQueueElements\",\"outputs\":[{\"internalType\":\"uint40\",\"name\":\"\",\"type\":\"uint40\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"getQueueElement\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"transactionHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint40\",\"name\":\"timestamp\",\"type\":\"uint40\"},{\"internalType\":\"uint40\",\"name\":\"blockNumber\",\"type\":\"uint40\"}],\"internalType\":\"struct Lib_OVMCodec.QueueElement\",\"name\":\"_element\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getQueueLength\",\"outputs\":[{\"internalType\":\"uint40\",\"name\":\"\",\"type\":\"uint40\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTotalBatches\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_totalBatches\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTotalElements\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_totalElements\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maxTransactionGasLimit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"queue\",\"outputs\":[{\"internalType\":\"contract iOVM_ChainStorageContainer\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"enum Lib_OVMCodec.QueueOrigin\",\"name\":\"l1QueueOrigin\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"l1TxOrigin\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"entrypoint\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.Transaction\",\"name\":\"_transaction\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isSequenced\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"queueIndex\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"txData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.TransactionChainElement\",\"name\":\"_txChainElement\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"_batchHeader\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"siblings\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct Lib_OVMCodec.ChainInclusionProof\",\"name\":\"_inclusionProof\",\"type\":\"tuple\"}],\"name\":\"verifyTransaction\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The Canonical Transaction Chain (CTC) contract is an append-only log of transactions which must be applied to the rollup state. It defines the ordering of rollup transactions by writing them to the 'CTC:batches' instance of the Chain Storage Container. The CTC also allows any account to 'enqueue' an L2 transaction, which will require that the Sequencer will eventually append it to the rollup state. If the Sequencer does not include an enqueued transaction within the 'force inclusion period', then any account may force it to be included by calling appendQueueBatch(). Compiler used: solc Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"appendSequencerBatch()\":{\"details\":\"This function uses a custom encoding scheme for efficiency reasons. .param _shouldStartAtElement Specific batch we expect to start appending to. .param _totalElementsToAppend Total number of batch elements we expect to append. .param _contexts Array of batch contexts. .param _transactionDataFields Array of raw transaction data.\"},\"batches()\":{\"returns\":{\"_0\":\"Reference to the batch storage container.\"}},\"enqueue(address,uint256,bytes)\":{\"params\":{\"_data\":\"Transaction data.\",\"_gasLimit\":\"Gas limit for the enqueued L2 transaction.\",\"_target\":\"Target L2 contract to send the transaction to.\"}},\"getLastBlockNumber()\":{\"returns\":{\"_0\":\"Blocknumber for the last transaction.\"}},\"getLastTimestamp()\":{\"returns\":{\"_0\":\"Timestamp for the last transaction.\"}},\"getNextQueueIndex()\":{\"returns\":{\"_0\":\"Index for the next queue element.\"}},\"getNumPendingQueueElements()\":{\"returns\":{\"_0\":\"Number of pending queue elements.\"}},\"getQueueElement(uint256)\":{\"params\":{\"_index\":\"Index of the queue element to access.\"},\"returns\":{\"_element\":\"Queue element at the given index.\"}},\"getQueueLength()\":{\"returns\":{\"_0\":\"Length of the queue.\"}},\"getTotalBatches()\":{\"returns\":{\"_totalBatches\":\"Total submitted batches.\"}},\"getTotalElements()\":{\"returns\":{\"_totalElements\":\"Total submitted elements.\"}},\"queue()\":{\"returns\":{\"_0\":\"Reference to the queue storage container.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}},\"verifyTransaction((uint256,uint256,uint8,address,address,uint256,bytes),(bool,uint256,uint256,uint256,bytes),(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))\":{\"params\":{\"_batchHeader\":\"Header of the batch the transaction was included in.\",\"_inclusionProof\":\"Inclusion proof for the provided transaction chain element.\",\"_transaction\":\"Transaction to verify.\",\"_txChainElement\":\"Transaction chain element corresponding to the transaction.\"},\"returns\":{\"_0\":\"True if the transaction exists in the CTC, false if not.\"}}},\"title\":\"OVM_CanonicalTransactionChain\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"appendQueueBatch(uint256)\":{\"notice\":\"Appends a given number of queued transactions as a single batch. param _numQueuedTransactions Number of transactions to append.\"},\"appendSequencerBatch()\":{\"notice\":\"Allows the sequencer to append a batch of transactions.\"},\"batches()\":{\"notice\":\"Accesses the batch storage container.\"},\"enqueue(address,uint256,bytes)\":{\"notice\":\"Adds a transaction to the queue.\"},\"getLastBlockNumber()\":{\"notice\":\"Returns the blocknumber of the last transaction.\"},\"getLastTimestamp()\":{\"notice\":\"Returns the timestamp of the last transaction.\"},\"getNextQueueIndex()\":{\"notice\":\"Returns the index of the next element to be enqueued.\"},\"getNumPendingQueueElements()\":{\"notice\":\"Get the number of queue elements which have not yet been included.\"},\"getQueueElement(uint256)\":{\"notice\":\"Gets the queue element at a particular index.\"},\"getQueueLength()\":{\"notice\":\"Retrieves the length of the queue, including both pending and canonical transactions.\"},\"getTotalBatches()\":{\"notice\":\"Retrieves the total number of batches submitted.\"},\"getTotalElements()\":{\"notice\":\"Retrieves the total number of elements submitted.\"},\"queue()\":{\"notice\":\"Accesses the queue storage container.\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"},\"verifyTransaction((uint256,uint256,uint8,address,address,uint256,bytes),(bool,uint256,uint256,uint256,bytes),(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))\":{\"notice\":\"Verifies whether a transaction is included in the chain.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/OVM/chain/OVM_CanonicalTransactionChain.sol\":\"OVM_CanonicalTransactionChain\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/optimistic-ethereum/OVM/accounts/OVM_ECDSAContractAccount.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Interface Imports */\\nimport { iOVM_ECDSAContractAccount } from \\\"../../iOVM/accounts/iOVM_ECDSAContractAccount.sol\\\";\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { Lib_ECDSAUtils } from \\\"../../libraries/utils/Lib_ECDSAUtils.sol\\\";\\nimport { Lib_SafeExecutionManagerWrapper } from \\\"../../libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\\\";\\nimport { Lib_SafeMathWrapper } from \\\"../../libraries/wrappers/Lib_SafeMathWrapper.sol\\\";\\n\\n/**\\n * @title OVM_ECDSAContractAccount\\n * @dev The ECDSA Contract Account can be used as the implementation for a ProxyEOA deployed by the\\n * ovmCREATEEOA operation. It enables backwards compatibility with Ethereum's Layer 1, by \\n * providing eth_sign and EIP155 formatted transaction encodings.\\n *\\n * Compiler used: solc\\n * Runtime target: OVM\\n */\\ncontract OVM_ECDSAContractAccount is iOVM_ECDSAContractAccount {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n // TODO: should be the amount sufficient to cover the gas costs of all of the transactions up\\n // to and including the CALL/CREATE which forms the entrypoint of the transaction.\\n uint256 constant EXECUTION_VALIDATION_GAS_OVERHEAD = 25000;\\n address constant ETH_ERC20_ADDRESS = 0x4200000000000000000000000000000000000006;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Executes a signed transaction.\\n * @param _transaction Signed EOA transaction.\\n * @param _signatureType Hashing scheme used for the transaction (e.g., ETH signed message).\\n * @param _v Signature `v` parameter.\\n * @param _r Signature `r` parameter.\\n * @param _s Signature `s` parameter.\\n * @return Whether or not the call returned (rather than reverted).\\n * @return Data returned by the call.\\n */\\n function execute(\\n bytes memory _transaction,\\n Lib_OVMCodec.EOASignatureType _signatureType,\\n uint8 _v,\\n bytes32 _r,\\n bytes32 _s\\n )\\n override\\n public\\n returns (\\n bool,\\n bytes memory\\n )\\n {\\n bool isEthSign = _signatureType == Lib_OVMCodec.EOASignatureType.ETH_SIGNED_MESSAGE;\\n\\n // Address of this contract within the ovm (ovmADDRESS) should be the same as the\\n // recovered address of the user who signed this message. This is how we manage to shim\\n // account abstraction even though the user isn't a contract.\\n // Need to make sure that the transaction nonce is right and bump it if so.\\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(\\n Lib_ECDSAUtils.recover(\\n _transaction,\\n isEthSign,\\n _v,\\n _r,\\n _s\\n ) == Lib_SafeExecutionManagerWrapper.safeADDRESS(),\\n \\\"Signature provided for EOA transaction execution is invalid.\\\"\\n );\\n\\n Lib_OVMCodec.EIP155Transaction memory decodedTx = Lib_OVMCodec.decodeEIP155Transaction(_transaction, isEthSign);\\n\\n // Need to make sure that the transaction chainId is correct.\\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(\\n decodedTx.chainId == Lib_SafeExecutionManagerWrapper.safeCHAINID(),\\n \\\"Transaction chainId does not match expected OVM chainId.\\\"\\n );\\n\\n // Need to make sure that the transaction nonce is right.\\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(\\n decodedTx.nonce == Lib_SafeExecutionManagerWrapper.safeGETNONCE(),\\n \\\"Transaction nonce does not match the expected nonce.\\\"\\n );\\n\\n // TEMPORARY: Disable gas checks for mainnet.\\n // // Need to make sure that the gas is sufficient to execute the transaction.\\n // Lib_SafeExecutionManagerWrapper.safeREQUIRE(\\n // gasleft() >= Lib_SafeMathWrapper.add(decodedTx.gasLimit, EXECUTION_VALIDATION_GAS_OVERHEAD),\\n // \\\"Gas is not sufficient to execute the transaction.\\\"\\n // );\\n\\n // Transfer fee to relayer.\\n address relayer = Lib_SafeExecutionManagerWrapper.safeCALLER();\\n uint256 fee = Lib_SafeMathWrapper.mul(decodedTx.gasLimit, decodedTx.gasPrice);\\n (bool success, ) = Lib_SafeExecutionManagerWrapper.safeCALL(\\n gasleft(),\\n ETH_ERC20_ADDRESS,\\n abi.encodeWithSignature(\\\"transfer(address,uint256)\\\", relayer, fee)\\n );\\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(\\n success == true,\\n \\\"Fee was not transferred to relayer.\\\"\\n );\\n\\n // Contract creations are signalled by sending a transaction to the zero address.\\n if (decodedTx.to == address(0)) {\\n (address created, bytes memory revertData) = Lib_SafeExecutionManagerWrapper.safeCREATE(\\n gasleft(),\\n decodedTx.data\\n );\\n\\n // Return true if the contract creation succeeded, false w/ revertData otherwise.\\n if (created != address(0)) {\\n return (true, abi.encode(created));\\n } else {\\n return (false, revertData);\\n }\\n } else {\\n // We only want to bump the nonce for `ovmCALL` because `ovmCREATE` automatically bumps\\n // the nonce of the calling account. Normally an EOA would bump the nonce for both\\n // cases, but since this is a contract we'd end up bumping the nonce twice.\\n Lib_SafeExecutionManagerWrapper.safeINCREMENTNONCE();\\n\\n return Lib_SafeExecutionManagerWrapper.safeCALL(\\n gasleft(),\\n decodedTx.to,\\n decodedTx.data\\n );\\n }\\n }\\n}\\n\",\"keccak256\":\"0xcba0b593ad36291ec3d8c61ca254057c1bdcf1c9debf8ef920add32a51b14817\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/accounts/OVM_ProxyEOA.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_Bytes32Utils } from \\\"../../libraries/utils/Lib_Bytes32Utils.sol\\\";\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { Lib_ECDSAUtils } from \\\"../../libraries/utils/Lib_ECDSAUtils.sol\\\";\\nimport { Lib_SafeExecutionManagerWrapper } from \\\"../../libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\\\";\\n\\n/**\\n * @title OVM_ProxyEOA\\n * @dev The Proxy EOA contract uses a delegate call to execute the logic in an implementation contract.\\n * In combination with the logic implemented in the ECDSA Contract Account, this enables a form of upgradable \\n * 'account abstraction' on layer 2. \\n * \\n * Compiler used: solc\\n * Runtime target: OVM\\n */\\ncontract OVM_ProxyEOA {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n bytes32 constant IMPLEMENTATION_KEY = 0xdeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddead;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _implementation Address of the initial implementation contract.\\n */\\n constructor(\\n address _implementation\\n )\\n {\\n _setImplementation(_implementation);\\n }\\n\\n\\n /*********************\\n * Fallback Function *\\n *********************/\\n\\n fallback()\\n external\\n {\\n (bool success, bytes memory returndata) = Lib_SafeExecutionManagerWrapper.safeDELEGATECALL(\\n gasleft(),\\n getImplementation(),\\n msg.data\\n );\\n\\n if (success) {\\n assembly {\\n return(add(returndata, 0x20), mload(returndata))\\n }\\n } else {\\n Lib_SafeExecutionManagerWrapper.safeREVERT(\\n string(returndata)\\n );\\n }\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the implementation address.\\n * @param _implementation New implementation address.\\n */\\n function upgrade(\\n address _implementation\\n )\\n external\\n {\\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(\\n Lib_SafeExecutionManagerWrapper.safeADDRESS() == Lib_SafeExecutionManagerWrapper.safeCALLER(),\\n \\\"EOAs can only upgrade their own EOA implementation\\\"\\n );\\n\\n _setImplementation(_implementation);\\n }\\n\\n /**\\n * Gets the address of the current implementation.\\n * @return Current implementation address.\\n */\\n function getImplementation()\\n public\\n returns (\\n address\\n )\\n {\\n return Lib_Bytes32Utils.toAddress(\\n Lib_SafeExecutionManagerWrapper.safeSLOAD(\\n IMPLEMENTATION_KEY\\n )\\n );\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function _setImplementation(\\n address _implementation\\n )\\n internal\\n {\\n Lib_SafeExecutionManagerWrapper.safeSSTORE(\\n IMPLEMENTATION_KEY,\\n Lib_Bytes32Utils.fromAddress(_implementation)\\n );\\n }\\n}\\n\",\"keccak256\":\"0x220433074300f98c50f923df76050fbaa548e83926351b7a27f379aa851f70ec\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/chain/OVM_CanonicalTransactionChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// @unsupported: ovm\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\nimport { Lib_MerkleTree } from \\\"../../libraries/utils/Lib_MerkleTree.sol\\\";\\nimport { Lib_Math } from \\\"../../libraries/utils/Lib_Math.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_CanonicalTransactionChain } from \\\"../../iOVM/chain/iOVM_CanonicalTransactionChain.sol\\\";\\nimport { iOVM_ChainStorageContainer } from \\\"../../iOVM/chain/iOVM_ChainStorageContainer.sol\\\";\\n\\n/* Contract Imports */\\nimport { OVM_ExecutionManager } from \\\"../execution/OVM_ExecutionManager.sol\\\";\\n\\n\\n/**\\n * @title OVM_CanonicalTransactionChain\\n * @dev The Canonical Transaction Chain (CTC) contract is an append-only log of transactions\\n * which must be applied to the rollup state. It defines the ordering of rollup transactions by\\n * writing them to the 'CTC:batches' instance of the Chain Storage Container.\\n * The CTC also allows any account to 'enqueue' an L2 transaction, which will require that the Sequencer\\n * will eventually append it to the rollup state.\\n * If the Sequencer does not include an enqueued transaction within the 'force inclusion period',\\n * then any account may force it to be included by calling appendQueueBatch().\\n *\\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract OVM_CanonicalTransactionChain is iOVM_CanonicalTransactionChain, Lib_AddressResolver {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n // L2 tx gas-related\\n uint256 constant public MIN_ROLLUP_TX_GAS = 100000;\\n uint256 constant public MAX_ROLLUP_TX_SIZE = 50000;\\n uint256 constant public L2_GAS_DISCOUNT_DIVISOR = 32;\\n\\n // Encoding-related (all in bytes)\\n uint256 constant internal BATCH_CONTEXT_SIZE = 16;\\n uint256 constant internal BATCH_CONTEXT_LENGTH_POS = 12;\\n uint256 constant internal BATCH_CONTEXT_START_POS = 15;\\n uint256 constant internal TX_DATA_HEADER_SIZE = 3;\\n uint256 constant internal BYTES_TILL_TX_DATA = 65;\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n uint256 public forceInclusionPeriodSeconds;\\n uint256 public forceInclusionPeriodBlocks;\\n uint256 public maxTransactionGasLimit;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n constructor(\\n address _libAddressManager,\\n uint256 _forceInclusionPeriodSeconds,\\n uint256 _forceInclusionPeriodBlocks,\\n uint256 _maxTransactionGasLimit\\n )\\n Lib_AddressResolver(_libAddressManager)\\n {\\n forceInclusionPeriodSeconds = _forceInclusionPeriodSeconds;\\n forceInclusionPeriodBlocks = _forceInclusionPeriodBlocks;\\n maxTransactionGasLimit = _maxTransactionGasLimit;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Accesses the batch storage container.\\n * @return Reference to the batch storage container.\\n */\\n function batches()\\n override\\n public\\n view\\n returns (\\n iOVM_ChainStorageContainer\\n )\\n {\\n return iOVM_ChainStorageContainer(\\n resolve(\\\"OVM_ChainStorageContainer:CTC:batches\\\")\\n );\\n }\\n\\n /**\\n * Accesses the queue storage container.\\n * @return Reference to the queue storage container.\\n */\\n function queue()\\n override\\n public\\n view\\n returns (\\n iOVM_ChainStorageContainer\\n )\\n {\\n return iOVM_ChainStorageContainer(\\n resolve(\\\"OVM_ChainStorageContainer:CTC:queue\\\")\\n );\\n }\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements()\\n override\\n public\\n view\\n returns (\\n uint256 _totalElements\\n )\\n {\\n (uint40 totalElements,,,) = _getBatchExtraData();\\n return uint256(totalElements);\\n }\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches()\\n override\\n public\\n view\\n returns (\\n uint256 _totalBatches\\n )\\n {\\n return batches().length();\\n }\\n\\n /**\\n * Returns the index of the next element to be enqueued.\\n * @return Index for the next queue element.\\n */\\n function getNextQueueIndex()\\n override\\n public\\n view\\n returns (\\n uint40\\n )\\n {\\n (,uint40 nextQueueIndex,,) = _getBatchExtraData();\\n return nextQueueIndex;\\n }\\n\\n /**\\n * Returns the timestamp of the last transaction.\\n * @return Timestamp for the last transaction.\\n */\\n function getLastTimestamp()\\n override\\n public\\n view\\n returns (\\n uint40\\n )\\n {\\n (,,uint40 lastTimestamp,) = _getBatchExtraData();\\n return lastTimestamp;\\n }\\n\\n /**\\n * Returns the blocknumber of the last transaction.\\n * @return Blocknumber for the last transaction.\\n */\\n function getLastBlockNumber()\\n override\\n public\\n view\\n returns (\\n uint40\\n )\\n {\\n (,,,uint40 lastBlockNumber) = _getBatchExtraData();\\n return lastBlockNumber;\\n }\\n\\n /**\\n * Gets the queue element at a particular index.\\n * @param _index Index of the queue element to access.\\n * @return _element Queue element at the given index.\\n */\\n function getQueueElement(\\n uint256 _index\\n )\\n override\\n public\\n view\\n returns (\\n Lib_OVMCodec.QueueElement memory _element\\n )\\n {\\n return _getQueueElement(\\n _index,\\n queue()\\n );\\n }\\n\\n /**\\n * Get the number of queue elements which have not yet been included.\\n * @return Number of pending queue elements.\\n */\\n function getNumPendingQueueElements()\\n override\\n public\\n view\\n returns (\\n uint40\\n )\\n {\\n return getQueueLength() - getNextQueueIndex();\\n }\\n\\n /**\\n * Retrieves the length of the queue, including\\n * both pending and canonical transactions.\\n * @return Length of the queue.\\n */\\n function getQueueLength()\\n override\\n public\\n view\\n returns (\\n uint40\\n )\\n {\\n return _getQueueLength(\\n queue()\\n );\\n }\\n\\n /**\\n * Adds a transaction to the queue.\\n * @param _target Target L2 contract to send the transaction to.\\n * @param _gasLimit Gas limit for the enqueued L2 transaction.\\n * @param _data Transaction data.\\n */\\n function enqueue(\\n address _target,\\n uint256 _gasLimit,\\n bytes memory _data\\n )\\n override\\n public\\n {\\n require(\\n _data.length <= MAX_ROLLUP_TX_SIZE,\\n \\\"Transaction data size exceeds maximum for rollup transaction.\\\"\\n );\\n\\n require(\\n _gasLimit <= maxTransactionGasLimit,\\n \\\"Transaction gas limit exceeds maximum for rollup transaction.\\\"\\n );\\n\\n require(\\n _gasLimit >= MIN_ROLLUP_TX_GAS,\\n \\\"Transaction gas limit too low to enqueue.\\\"\\n );\\n\\n // We need to consume some amount of L1 gas in order to rate limit transactions going into\\n // L2. However, L2 is cheaper than L1 so we only need to burn some small proportion of the\\n // provided L1 gas.\\n uint256 gasToConsume = _gasLimit/L2_GAS_DISCOUNT_DIVISOR;\\n uint256 startingGas = gasleft();\\n\\n // Although this check is not necessary (burn below will run out of gas if not true), it\\n // gives the user an explicit reason as to why the enqueue attempt failed.\\n require(\\n startingGas > gasToConsume,\\n \\\"Insufficient gas for L2 rate limiting burn.\\\"\\n );\\n\\n // Here we do some \\\"dumb\\\" work in order to burn gas, although we should probably replace\\n // this with something like minting gas token later on.\\n uint256 i;\\n while(startingGas - gasleft() < gasToConsume) {\\n i++;\\n }\\n\\n bytes32 transactionHash = keccak256(\\n abi.encode(\\n msg.sender,\\n _target,\\n _gasLimit,\\n _data\\n )\\n );\\n\\n bytes32 timestampAndBlockNumber;\\n assembly {\\n timestampAndBlockNumber := timestamp()\\n timestampAndBlockNumber := or(timestampAndBlockNumber, shl(40, number()))\\n }\\n\\n iOVM_ChainStorageContainer queueRef = queue();\\n\\n queueRef.push(transactionHash);\\n queueRef.push(timestampAndBlockNumber);\\n\\n // The underlying queue data structure stores 2 elements\\n // per insertion, so to get the real queue length we need\\n // to divide by 2 and subtract 1.\\n uint256 queueIndex = queueRef.length() / 2 - 1;\\n emit TransactionEnqueued(\\n msg.sender,\\n _target,\\n _gasLimit,\\n _data,\\n queueIndex,\\n block.timestamp\\n );\\n }\\n\\n /**\\n * Appends a given number of queued transactions as a single batch.\\n * param _numQueuedTransactions Number of transactions to append.\\n */\\n function appendQueueBatch(\\n uint256 // _numQueuedTransactions\\n )\\n override\\n public\\n pure\\n {\\n // TEMPORARY: Disable `appendQueueBatch` for minnet\\n revert(\\\"appendQueueBatch is currently disabled.\\\");\\n\\n // _numQueuedTransactions = Lib_Math.min(_numQueuedTransactions, getNumPendingQueueElements());\\n // require(\\n // _numQueuedTransactions > 0,\\n // \\\"Must append more than zero transactions.\\\"\\n // );\\n\\n // bytes32[] memory leaves = new bytes32[](_numQueuedTransactions);\\n // uint40 nextQueueIndex = getNextQueueIndex();\\n\\n // for (uint256 i = 0; i < _numQueuedTransactions; i++) {\\n // if (msg.sender != resolve(\\\"OVM_Sequencer\\\")) {\\n // Lib_OVMCodec.QueueElement memory el = getQueueElement(nextQueueIndex);\\n // require(\\n // el.timestamp + forceInclusionPeriodSeconds < block.timestamp,\\n // \\\"Queue transactions cannot be submitted during the sequencer inclusion period.\\\"\\n // );\\n // }\\n // leaves[i] = _getQueueLeafHash(nextQueueIndex);\\n // nextQueueIndex++;\\n // }\\n\\n // Lib_OVMCodec.QueueElement memory lastElement = getQueueElement(nextQueueIndex - 1);\\n\\n // _appendBatch(\\n // Lib_MerkleTree.getMerkleRoot(leaves),\\n // _numQueuedTransactions,\\n // _numQueuedTransactions,\\n // lastElement.timestamp,\\n // lastElement.blockNumber\\n // );\\n\\n // emit QueueBatchAppended(\\n // nextQueueIndex - _numQueuedTransactions,\\n // _numQueuedTransactions,\\n // getTotalElements()\\n // );\\n }\\n\\n /**\\n * Allows the sequencer to append a batch of transactions.\\n * @dev This function uses a custom encoding scheme for efficiency reasons.\\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\\n * .param _contexts Array of batch contexts.\\n * .param _transactionDataFields Array of raw transaction data.\\n */\\n function appendSequencerBatch()\\n override\\n public\\n {\\n uint40 shouldStartAtElement;\\n uint24 totalElementsToAppend;\\n uint24 numContexts;\\n assembly {\\n shouldStartAtElement := shr(216, calldataload(4))\\n totalElementsToAppend := shr(232, calldataload(9))\\n numContexts := shr(232, calldataload(12))\\n }\\n\\n require(\\n shouldStartAtElement == getTotalElements(),\\n \\\"Actual batch start index does not match expected start index.\\\"\\n );\\n\\n require(\\n msg.sender == resolve(\\\"OVM_Sequencer\\\"),\\n \\\"Function can only be called by the Sequencer.\\\"\\n );\\n\\n require(\\n numContexts > 0,\\n \\\"Must provide at least one batch context.\\\"\\n );\\n\\n require(\\n totalElementsToAppend > 0,\\n \\\"Must append at least one element.\\\"\\n );\\n\\n uint40 nextTransactionPtr = uint40(BATCH_CONTEXT_START_POS + BATCH_CONTEXT_SIZE * numContexts);\\n\\n require(\\n msg.data.length >= nextTransactionPtr,\\n \\\"Not enough BatchContexts provided.\\\"\\n );\\n\\n // Take a reference to the queue and its length so we don't have to keep resolving it.\\n // Length isn't going to change during the course of execution, so it's fine to simply\\n // resolve this once at the start. Saves gas.\\n iOVM_ChainStorageContainer queueRef = queue();\\n uint40 queueLength = _getQueueLength(queueRef);\\n\\n // Reserve some memory to save gas on hashing later on. This is a relatively safe estimate\\n // for the average transaction size that will prevent having to resize this chunk of memory\\n // later on. Saves gas.\\n bytes memory hashMemory = new bytes((msg.data.length / totalElementsToAppend) * 2);\\n\\n // Initialize the array of canonical chain leaves that we will append.\\n bytes32[] memory leaves = new bytes32[](totalElementsToAppend);\\n\\n // Each leaf index corresponds to a tx, either sequenced or enqueued.\\n uint32 leafIndex = 0;\\n\\n // Counter for number of sequencer transactions appended so far.\\n uint32 numSequencerTransactions = 0;\\n\\n // We will sequentially append leaves which are pointers to the queue.\\n // The initial queue index is what is currently in storage.\\n uint40 nextQueueIndex = getNextQueueIndex();\\n\\n BatchContext memory curContext;\\n for (uint32 i = 0; i < numContexts; i++) {\\n BatchContext memory nextContext = _getBatchContext(i);\\n\\n if (i == 0) {\\n // Execute a special check for the first batch.\\n _validateFirstBatchContext(nextContext);\\n }\\n\\n // Execute this check on every single batch, including the first one.\\n _validateNextBatchContext(\\n curContext,\\n nextContext,\\n nextQueueIndex,\\n queueRef\\n );\\n\\n // Now we can update our current context.\\n curContext = nextContext;\\n\\n // Process sequencer transactions first.\\n for (uint32 j = 0; j < curContext.numSequencedTransactions; j++) {\\n uint256 txDataLength;\\n assembly {\\n txDataLength := shr(232, calldataload(nextTransactionPtr))\\n }\\n require(\\n txDataLength <= MAX_ROLLUP_TX_SIZE,\\n \\\"Transaction data size exceeds maximum for rollup transaction.\\\"\\n );\\n\\n leaves[leafIndex] = _getSequencerLeafHash(\\n curContext,\\n nextTransactionPtr,\\n txDataLength,\\n hashMemory\\n );\\n\\n nextTransactionPtr += uint40(TX_DATA_HEADER_SIZE + txDataLength);\\n numSequencerTransactions++;\\n leafIndex++;\\n }\\n\\n // Now process any subsequent queue transactions.\\n for (uint32 j = 0; j < curContext.numSubsequentQueueTransactions; j++) {\\n require(\\n nextQueueIndex < queueLength,\\n \\\"Not enough queued transactions to append.\\\"\\n );\\n\\n leaves[leafIndex] = _getQueueLeafHash(nextQueueIndex);\\n nextQueueIndex++;\\n leafIndex++;\\n }\\n }\\n\\n _validateFinalBatchContext(\\n curContext,\\n nextQueueIndex,\\n queueLength,\\n queueRef\\n );\\n\\n require(\\n msg.data.length == nextTransactionPtr,\\n \\\"Not all sequencer transactions were processed.\\\"\\n );\\n\\n require(\\n leafIndex == totalElementsToAppend,\\n \\\"Actual transaction index does not match expected total elements to append.\\\"\\n );\\n\\n // Generate the required metadata that we need to append this batch\\n uint40 numQueuedTransactions = totalElementsToAppend - numSequencerTransactions;\\n uint40 blockTimestamp;\\n uint40 blockNumber;\\n if (curContext.numSubsequentQueueTransactions == 0) {\\n // The last element is a sequencer tx, therefore pull timestamp and block number from the last context.\\n blockTimestamp = uint40(curContext.timestamp);\\n blockNumber = uint40(curContext.blockNumber);\\n } else {\\n // The last element is a queue tx, therefore pull timestamp and block number from the queue element.\\n // curContext.numSubsequentQueueTransactions > 0 which means that we've processed at least one queue element.\\n // We increment nextQueueIndex after processing each queue element,\\n // so the index of the last element we processed is nextQueueIndex - 1.\\n Lib_OVMCodec.QueueElement memory lastElement = _getQueueElement(\\n nextQueueIndex - 1,\\n queueRef\\n );\\n\\n blockTimestamp = lastElement.timestamp;\\n blockNumber = lastElement.blockNumber;\\n }\\n\\n // For efficiency reasons getMerkleRoot modifies the `leaves` argument in place\\n // while calculating the root hash therefore any arguments passed to it must not\\n // be used again afterwards\\n _appendBatch(\\n Lib_MerkleTree.getMerkleRoot(leaves),\\n totalElementsToAppend,\\n numQueuedTransactions,\\n blockTimestamp,\\n blockNumber\\n );\\n\\n emit SequencerBatchAppended(\\n nextQueueIndex - numQueuedTransactions,\\n numQueuedTransactions,\\n getTotalElements()\\n );\\n }\\n\\n /**\\n * Verifies whether a transaction is included in the chain.\\n * @param _transaction Transaction to verify.\\n * @param _txChainElement Transaction chain element corresponding to the transaction.\\n * @param _batchHeader Header of the batch the transaction was included in.\\n * @param _inclusionProof Inclusion proof for the provided transaction chain element.\\n * @return True if the transaction exists in the CTC, false if not.\\n */\\n function verifyTransaction(\\n Lib_OVMCodec.Transaction memory _transaction,\\n Lib_OVMCodec.TransactionChainElement memory _txChainElement,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _inclusionProof\\n )\\n override\\n public\\n view\\n returns (\\n bool\\n )\\n {\\n if (_txChainElement.isSequenced == true) {\\n return _verifySequencerTransaction(\\n _transaction,\\n _txChainElement,\\n _batchHeader,\\n _inclusionProof\\n );\\n } else {\\n return _verifyQueueTransaction(\\n _transaction,\\n _txChainElement.queueIndex,\\n _batchHeader,\\n _inclusionProof\\n );\\n }\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Returns the BatchContext located at a particular index.\\n * @param _index The index of the BatchContext\\n * @return The BatchContext at the specified index.\\n */\\n function _getBatchContext(\\n uint256 _index\\n )\\n internal\\n pure\\n returns (\\n BatchContext memory\\n )\\n {\\n uint256 contextPtr = 15 + _index * BATCH_CONTEXT_SIZE;\\n uint256 numSequencedTransactions;\\n uint256 numSubsequentQueueTransactions;\\n uint256 ctxTimestamp;\\n uint256 ctxBlockNumber;\\n\\n assembly {\\n numSequencedTransactions := shr(232, calldataload(contextPtr))\\n numSubsequentQueueTransactions := shr(232, calldataload(add(contextPtr, 3)))\\n ctxTimestamp := shr(216, calldataload(add(contextPtr, 6)))\\n ctxBlockNumber := shr(216, calldataload(add(contextPtr, 11)))\\n }\\n\\n return BatchContext({\\n numSequencedTransactions: numSequencedTransactions,\\n numSubsequentQueueTransactions: numSubsequentQueueTransactions,\\n timestamp: ctxTimestamp,\\n blockNumber: ctxBlockNumber\\n });\\n }\\n\\n /**\\n * Parses the batch context from the extra data.\\n * @return Total number of elements submitted.\\n * @return Index of the next queue element.\\n */\\n function _getBatchExtraData()\\n internal\\n view\\n returns (\\n uint40,\\n uint40,\\n uint40,\\n uint40\\n )\\n {\\n bytes27 extraData = batches().getGlobalMetadata();\\n\\n uint40 totalElements;\\n uint40 nextQueueIndex;\\n uint40 lastTimestamp;\\n uint40 lastBlockNumber;\\n assembly {\\n extraData := shr(40, extraData)\\n totalElements := and(extraData, 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF)\\n nextQueueIndex := shr(40, and(extraData, 0x00000000000000000000000000000000000000000000FFFFFFFFFF0000000000))\\n lastTimestamp := shr(80, and(extraData, 0x0000000000000000000000000000000000FFFFFFFFFF00000000000000000000))\\n lastBlockNumber := shr(120, and(extraData, 0x000000000000000000000000FFFFFFFFFF000000000000000000000000000000))\\n }\\n\\n return (\\n totalElements,\\n nextQueueIndex,\\n lastTimestamp,\\n lastBlockNumber\\n );\\n }\\n\\n /**\\n * Encodes the batch context for the extra data.\\n * @param _totalElements Total number of elements submitted.\\n * @param _nextQueueIndex Index of the next queue element.\\n * @param _timestamp Timestamp for the last batch.\\n * @param _blockNumber Block number of the last batch.\\n * @return Encoded batch context.\\n */\\n function _makeBatchExtraData(\\n uint40 _totalElements,\\n uint40 _nextQueueIndex,\\n uint40 _timestamp,\\n uint40 _blockNumber\\n )\\n internal\\n pure\\n returns (\\n bytes27\\n )\\n {\\n bytes27 extraData;\\n assembly {\\n extraData := _totalElements\\n extraData := or(extraData, shl(40, _nextQueueIndex))\\n extraData := or(extraData, shl(80, _timestamp))\\n extraData := or(extraData, shl(120, _blockNumber))\\n extraData := shl(40, extraData)\\n }\\n\\n return extraData;\\n }\\n\\n /**\\n * Retrieves the hash of a queue element.\\n * @param _index Index of the queue element to retrieve a hash for.\\n * @return Hash of the queue element.\\n */\\n function _getQueueLeafHash(\\n uint256 _index\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return _hashTransactionChainElement(\\n Lib_OVMCodec.TransactionChainElement({\\n isSequenced: false,\\n queueIndex: _index,\\n timestamp: 0,\\n blockNumber: 0,\\n txData: hex\\\"\\\"\\n })\\n );\\n }\\n\\n /**\\n * Gets the queue element at a particular index.\\n * @param _index Index of the queue element to access.\\n * @return _element Queue element at the given index.\\n */\\n function _getQueueElement(\\n uint256 _index,\\n iOVM_ChainStorageContainer _queueRef\\n )\\n internal\\n view\\n returns (\\n Lib_OVMCodec.QueueElement memory _element\\n )\\n {\\n // The underlying queue data structure stores 2 elements\\n // per insertion, so to get the actual desired queue index\\n // we need to multiply by 2.\\n uint40 trueIndex = uint40(_index * 2);\\n bytes32 transactionHash = _queueRef.get(trueIndex);\\n bytes32 timestampAndBlockNumber = _queueRef.get(trueIndex + 1);\\n\\n uint40 elementTimestamp;\\n uint40 elementBlockNumber;\\n assembly {\\n elementTimestamp := and(timestampAndBlockNumber, 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF)\\n elementBlockNumber := shr(40, and(timestampAndBlockNumber, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000))\\n }\\n\\n return Lib_OVMCodec.QueueElement({\\n transactionHash: transactionHash,\\n timestamp: elementTimestamp,\\n blockNumber: elementBlockNumber\\n });\\n }\\n\\n /**\\n * Retrieves the length of the queue.\\n * @return Length of the queue.\\n */\\n function _getQueueLength(\\n iOVM_ChainStorageContainer _queueRef\\n )\\n internal\\n view\\n returns (\\n uint40\\n )\\n {\\n // The underlying queue data structure stores 2 elements\\n // per insertion, so to get the real queue length we need\\n // to divide by 2.\\n return uint40(_queueRef.length() / 2);\\n }\\n\\n /**\\n * Retrieves the hash of a sequencer element.\\n * @param _context Batch context for the given element.\\n * @param _nextTransactionPtr Pointer to the next transaction in the calldata.\\n * @param _txDataLength Length of the transaction item.\\n * @return Hash of the sequencer element.\\n */\\n function _getSequencerLeafHash(\\n BatchContext memory _context,\\n uint256 _nextTransactionPtr,\\n uint256 _txDataLength,\\n bytes memory _hashMemory\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n // Only allocate more memory if we didn't reserve enough to begin with.\\n if (BYTES_TILL_TX_DATA + _txDataLength > _hashMemory.length) {\\n _hashMemory = new bytes(BYTES_TILL_TX_DATA + _txDataLength);\\n }\\n\\n uint256 ctxTimestamp = _context.timestamp;\\n uint256 ctxBlockNumber = _context.blockNumber;\\n\\n bytes32 leafHash;\\n assembly {\\n let chainElementStart := add(_hashMemory, 0x20)\\n\\n // Set the first byte equal to `1` to indicate this is a sequencer chain element.\\n // This distinguishes sequencer ChainElements from queue ChainElements because\\n // all queue ChainElements are ABI encoded and the first byte of ABI encoded\\n // elements is always zero\\n mstore8(chainElementStart, 1)\\n\\n mstore(add(chainElementStart, 1), ctxTimestamp)\\n mstore(add(chainElementStart, 33), ctxBlockNumber)\\n\\n calldatacopy(add(chainElementStart, BYTES_TILL_TX_DATA), add(_nextTransactionPtr, 3), _txDataLength)\\n\\n leafHash := keccak256(chainElementStart, add(BYTES_TILL_TX_DATA, _txDataLength))\\n }\\n\\n return leafHash;\\n }\\n\\n /**\\n * Retrieves the hash of a sequencer element.\\n * @param _txChainElement The chain element which is hashed to calculate the leaf.\\n * @return Hash of the sequencer element.\\n */\\n function _getSequencerLeafHash(\\n Lib_OVMCodec.TransactionChainElement memory _txChainElement\\n )\\n internal\\n view\\n returns(\\n bytes32\\n )\\n {\\n bytes memory txData = _txChainElement.txData;\\n uint256 txDataLength = _txChainElement.txData.length;\\n\\n bytes memory chainElement = new bytes(BYTES_TILL_TX_DATA + txDataLength);\\n uint256 ctxTimestamp = _txChainElement.timestamp;\\n uint256 ctxBlockNumber = _txChainElement.blockNumber;\\n\\n bytes32 leafHash;\\n assembly {\\n let chainElementStart := add(chainElement, 0x20)\\n\\n // Set the first byte equal to `1` to indicate this is a sequencer chain element.\\n // This distinguishes sequencer ChainElements from queue ChainElements because\\n // all queue ChainElements are ABI encoded and the first byte of ABI encoded\\n // elements is always zero\\n mstore8(chainElementStart, 1)\\n\\n mstore(add(chainElementStart, 1), ctxTimestamp)\\n mstore(add(chainElementStart, 33), ctxBlockNumber)\\n\\n pop(staticcall(gas(), 0x04, add(txData, 0x20), txDataLength, add(chainElementStart, BYTES_TILL_TX_DATA), txDataLength))\\n\\n leafHash := keccak256(chainElementStart, add(BYTES_TILL_TX_DATA, txDataLength))\\n }\\n\\n return leafHash;\\n }\\n\\n /**\\n * Inserts a batch into the chain of batches.\\n * @param _transactionRoot Root of the transaction tree for this batch.\\n * @param _batchSize Number of elements in the batch.\\n * @param _numQueuedTransactions Number of queue transactions in the batch.\\n * @param _timestamp The latest batch timestamp.\\n * @param _blockNumber The latest batch blockNumber.\\n */\\n function _appendBatch(\\n bytes32 _transactionRoot,\\n uint256 _batchSize,\\n uint256 _numQueuedTransactions,\\n uint40 _timestamp,\\n uint40 _blockNumber\\n )\\n internal\\n {\\n iOVM_ChainStorageContainer batchesRef = batches();\\n (uint40 totalElements, uint40 nextQueueIndex,,) = _getBatchExtraData();\\n\\n Lib_OVMCodec.ChainBatchHeader memory header = Lib_OVMCodec.ChainBatchHeader({\\n batchIndex: batchesRef.length(),\\n batchRoot: _transactionRoot,\\n batchSize: _batchSize,\\n prevTotalElements: totalElements,\\n extraData: hex\\\"\\\"\\n });\\n\\n emit TransactionBatchAppended(\\n header.batchIndex,\\n header.batchRoot,\\n header.batchSize,\\n header.prevTotalElements,\\n header.extraData\\n );\\n\\n bytes32 batchHeaderHash = Lib_OVMCodec.hashBatchHeader(header);\\n bytes27 latestBatchContext = _makeBatchExtraData(\\n totalElements + uint40(header.batchSize),\\n nextQueueIndex + uint40(_numQueuedTransactions),\\n _timestamp,\\n _blockNumber\\n );\\n\\n batchesRef.push(batchHeaderHash, latestBatchContext);\\n }\\n\\n /**\\n * Checks that the first batch context in a sequencer submission is valid\\n * @param _firstContext The batch context to validate.\\n */\\n function _validateFirstBatchContext(\\n BatchContext memory _firstContext\\n )\\n internal\\n view\\n {\\n // If there are existing elements, this batch must have the same context\\n // or a later timestamp and block number.\\n if (getTotalElements() > 0) {\\n (,, uint40 lastTimestamp, uint40 lastBlockNumber) = _getBatchExtraData();\\n\\n require(\\n _firstContext.blockNumber >= lastBlockNumber,\\n \\\"Context block number is lower than last submitted.\\\"\\n );\\n\\n require(\\n _firstContext.timestamp >= lastTimestamp,\\n \\\"Context timestamp is lower than last submitted.\\\"\\n );\\n }\\n\\n // Sequencer cannot submit contexts which are more than the force inclusion period old.\\n require(\\n _firstContext.timestamp + forceInclusionPeriodSeconds >= block.timestamp,\\n \\\"Context timestamp too far in the past.\\\"\\n );\\n\\n require(\\n _firstContext.blockNumber + forceInclusionPeriodBlocks >= block.number,\\n \\\"Context block number too far in the past.\\\"\\n );\\n }\\n\\n /**\\n * Checks that a given batch context has a time context which is below a given que element\\n * @param _context The batch context to validate has values lower.\\n * @param _queueIndex Index of the queue element we are validating came later than the context.\\n * @param _queueRef The storage container for the queue.\\n */\\n function _validateContextBeforeEnqueue(\\n BatchContext memory _context,\\n uint40 _queueIndex,\\n iOVM_ChainStorageContainer _queueRef\\n )\\n internal\\n view\\n {\\n Lib_OVMCodec.QueueElement memory nextQueueElement = _getQueueElement(\\n _queueIndex,\\n _queueRef\\n );\\n\\n // If the force inclusion period has passed for an enqueued transaction, it MUST be the next chain element.\\n require(\\n block.timestamp < nextQueueElement.timestamp + forceInclusionPeriodSeconds,\\n \\\"Previously enqueued batches have expired and must be appended before a new sequencer batch.\\\"\\n );\\n\\n // Just like sequencer transaction times must be increasing relative to each other,\\n // We also require that they be increasing relative to any interspersed queue elements.\\n require(\\n _context.timestamp <= nextQueueElement.timestamp,\\n \\\"Sequencer transaction timestamp exceeds that of next queue element.\\\"\\n );\\n\\n require(\\n _context.blockNumber <= nextQueueElement.blockNumber,\\n \\\"Sequencer transaction blockNumber exceeds that of next queue element.\\\"\\n );\\n }\\n\\n /**\\n * Checks that a given batch context is valid based on its previous context, and the next queue elemtent.\\n * @param _prevContext The previously validated batch context.\\n * @param _nextContext The batch context to validate with this call.\\n * @param _nextQueueIndex Index of the next queue element to process for the _nextContext's subsequentQueueElements.\\n * @param _queueRef The storage container for the queue.\\n */\\n function _validateNextBatchContext(\\n BatchContext memory _prevContext,\\n BatchContext memory _nextContext,\\n uint40 _nextQueueIndex,\\n iOVM_ChainStorageContainer _queueRef\\n )\\n internal\\n view\\n {\\n // All sequencer transactions' times must be greater than or equal to the previous ones.\\n require(\\n _nextContext.timestamp >= _prevContext.timestamp,\\n \\\"Context timestamp values must monotonically increase.\\\"\\n );\\n\\n require(\\n _nextContext.blockNumber >= _prevContext.blockNumber,\\n \\\"Context blockNumber values must monotonically increase.\\\"\\n );\\n\\n // If there is going to be a queue element pulled in from this context:\\n if (_nextContext.numSubsequentQueueTransactions > 0) {\\n _validateContextBeforeEnqueue(\\n _nextContext,\\n _nextQueueIndex,\\n _queueRef\\n );\\n }\\n }\\n\\n /**\\n * Checks that the final batch context in a sequencer submission is valid.\\n * @param _finalContext The batch context to validate.\\n * @param _queueLength The length of the queue at the start of the batchAppend call.\\n * @param _nextQueueIndex The next element in the queue that will be pulled into the CTC.\\n * @param _queueRef The storage container for the queue.\\n */\\n function _validateFinalBatchContext(\\n BatchContext memory _finalContext,\\n uint40 _nextQueueIndex,\\n uint40 _queueLength,\\n iOVM_ChainStorageContainer _queueRef\\n )\\n internal\\n view\\n {\\n // If the queue is not now empty, check the mononoticity of whatever the next batch that will come in is.\\n if (_queueLength - _nextQueueIndex > 0 && _finalContext.numSubsequentQueueTransactions == 0) {\\n _validateContextBeforeEnqueue(\\n _finalContext,\\n _nextQueueIndex,\\n _queueRef\\n );\\n }\\n // Batches cannot be added from the future, or subsequent enqueue() contexts would violate monotonicity.\\n require(_finalContext.timestamp <= block.timestamp, \\\"Context timestamp is from the future.\\\");\\n require(_finalContext.blockNumber <= block.number, \\\"Context block number is from the future.\\\");\\n }\\n\\n /**\\n * Hashes a transaction chain element.\\n * @param _element Chain element to hash.\\n * @return Hash of the chain element.\\n */\\n function _hashTransactionChainElement(\\n Lib_OVMCodec.TransactionChainElement memory _element\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(\\n abi.encode(\\n _element.isSequenced,\\n _element.queueIndex,\\n _element.timestamp,\\n _element.blockNumber,\\n _element.txData\\n )\\n );\\n }\\n\\n /**\\n * Verifies a sequencer transaction, returning true if it was indeed included in the CTC\\n * @param _transaction The transaction we are verifying inclusion of.\\n * @param _txChainElement The chain element that the transaction is claimed to be a part of.\\n * @param _batchHeader Header of the batch the transaction was included in.\\n * @param _inclusionProof An inclusion proof into the CTC at a particular index.\\n * @return True if the transaction was included in the specified location, else false.\\n */\\n function _verifySequencerTransaction(\\n Lib_OVMCodec.Transaction memory _transaction,\\n Lib_OVMCodec.TransactionChainElement memory _txChainElement,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _inclusionProof\\n )\\n internal\\n view\\n returns (\\n bool\\n )\\n {\\n OVM_ExecutionManager ovmExecutionManager = OVM_ExecutionManager(resolve(\\\"OVM_ExecutionManager\\\"));\\n uint256 gasLimit = ovmExecutionManager.getMaxTransactionGasLimit();\\n bytes32 leafHash = _getSequencerLeafHash(_txChainElement);\\n\\n require(\\n _verifyElement(\\n leafHash,\\n _batchHeader,\\n _inclusionProof\\n ),\\n \\\"Invalid Sequencer transaction inclusion proof.\\\"\\n );\\n\\n require(\\n _transaction.blockNumber == _txChainElement.blockNumber\\n && _transaction.timestamp == _txChainElement.timestamp\\n && _transaction.entrypoint == resolve(\\\"OVM_DecompressionPrecompileAddress\\\")\\n && _transaction.gasLimit == gasLimit\\n && _transaction.l1TxOrigin == address(0)\\n && _transaction.l1QueueOrigin == Lib_OVMCodec.QueueOrigin.SEQUENCER_QUEUE\\n && keccak256(_transaction.data) == keccak256(_txChainElement.txData),\\n \\\"Invalid Sequencer transaction.\\\"\\n );\\n\\n return true;\\n }\\n\\n /**\\n * Verifies a queue transaction, returning true if it was indeed included in the CTC\\n * @param _transaction The transaction we are verifying inclusion of.\\n * @param _queueIndex The queueIndex of the queued transaction.\\n * @param _batchHeader Header of the batch the transaction was included in.\\n * @param _inclusionProof An inclusion proof into the CTC at a particular index (should point to queue tx).\\n * @return True if the transaction was included in the specified location, else false.\\n */\\n function _verifyQueueTransaction(\\n Lib_OVMCodec.Transaction memory _transaction,\\n uint256 _queueIndex,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _inclusionProof\\n )\\n internal\\n view\\n returns (\\n bool\\n )\\n {\\n bytes32 leafHash = _getQueueLeafHash(_queueIndex);\\n\\n require(\\n _verifyElement(\\n leafHash,\\n _batchHeader,\\n _inclusionProof\\n ),\\n \\\"Invalid Queue transaction inclusion proof.\\\"\\n );\\n\\n bytes32 transactionHash = keccak256(\\n abi.encode(\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n )\\n );\\n\\n Lib_OVMCodec.QueueElement memory el = getQueueElement(_queueIndex);\\n require(\\n el.transactionHash == transactionHash\\n && el.timestamp == _transaction.timestamp\\n && el.blockNumber == _transaction.blockNumber,\\n \\\"Invalid Queue transaction.\\\"\\n );\\n\\n return true;\\n }\\n\\n /**\\n * Verifies a batch inclusion proof.\\n * @param _element Hash of the element to verify a proof for.\\n * @param _batchHeader Header of the batch in which the element was included.\\n * @param _proof Merkle inclusion proof for the element.\\n */\\n function _verifyElement(\\n bytes32 _element,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _proof\\n )\\n internal\\n view\\n returns (\\n bool\\n )\\n {\\n require(\\n Lib_OVMCodec.hashBatchHeader(_batchHeader) == batches().get(uint32(_batchHeader.batchIndex)),\\n \\\"Invalid batch header.\\\"\\n );\\n\\n require(\\n Lib_MerkleTree.verify(\\n _batchHeader.batchRoot,\\n _element,\\n _proof.index,\\n _proof.siblings,\\n _batchHeader.batchSize\\n ),\\n \\\"Invalid inclusion proof.\\\"\\n );\\n\\n return true;\\n }\\n}\\n\",\"keccak256\":\"0x70eb90b2f03d5b4c78af0b479d253eacdf311e760b80108710aafc0aa0b84941\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// @unsupported: ovm\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\nimport { Lib_EthUtils } from \\\"../../libraries/utils/Lib_EthUtils.sol\\\";\\nimport { Lib_ErrorUtils } from \\\"../../libraries/utils/Lib_ErrorUtils.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_ExecutionManager } from \\\"../../iOVM/execution/iOVM_ExecutionManager.sol\\\";\\nimport { iOVM_StateManager } from \\\"../../iOVM/execution/iOVM_StateManager.sol\\\";\\nimport { iOVM_SafetyChecker } from \\\"../../iOVM/execution/iOVM_SafetyChecker.sol\\\";\\n\\n/* Contract Imports */\\nimport { OVM_ECDSAContractAccount } from \\\"../accounts/OVM_ECDSAContractAccount.sol\\\";\\nimport { OVM_ProxyEOA } from \\\"../accounts/OVM_ProxyEOA.sol\\\";\\nimport { OVM_DeployerWhitelist } from \\\"../predeploys/OVM_DeployerWhitelist.sol\\\";\\n\\n/**\\n * @title OVM_ExecutionManager\\n * @dev The Execution Manager (EM) is the core of our OVM implementation, and provides a sandboxed\\n * environment allowing us to execute OVM transactions deterministically on either Layer 1 or\\n * Layer 2.\\n * The EM's run() function is the first function called during the execution of any\\n * transaction on L2.\\n * For each context-dependent EVM operation the EM has a function which implements a corresponding\\n * OVM operation, which will read state from the State Manager contract.\\n * The EM relies on the Safety Checker to verify that code deployed to Layer 2 does not contain any\\n * context-dependent operations.\\n *\\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract OVM_ExecutionManager is iOVM_ExecutionManager, Lib_AddressResolver {\\n\\n /********************************\\n * External Contract References *\\n ********************************/\\n\\n iOVM_SafetyChecker internal ovmSafetyChecker;\\n iOVM_StateManager internal ovmStateManager;\\n\\n\\n /*******************************\\n * Execution Context Variables *\\n *******************************/\\n\\n GasMeterConfig internal gasMeterConfig;\\n GlobalContext internal globalContext;\\n TransactionContext internal transactionContext;\\n MessageContext internal messageContext;\\n TransactionRecord internal transactionRecord;\\n MessageRecord internal messageRecord;\\n\\n\\n /**************************\\n * Gas Metering Constants *\\n **************************/\\n\\n address constant GAS_METADATA_ADDRESS = 0x06a506A506a506A506a506a506A506A506A506A5;\\n uint256 constant NUISANCE_GAS_SLOAD = 20000;\\n uint256 constant NUISANCE_GAS_SSTORE = 20000;\\n uint256 constant MIN_NUISANCE_GAS_PER_CONTRACT = 30000;\\n uint256 constant NUISANCE_GAS_PER_CONTRACT_BYTE = 100;\\n uint256 constant MIN_GAS_FOR_INVALID_STATE_ACCESS = 30000;\\n\\n /**************************\\n * Default Context Values *\\n **************************/\\n\\n uint256 constant DEFAULT_UINT256 = 0xdefa017defa017defa017defa017defa017defa017defa017defa017defa017d;\\n address constant DEFAULT_ADDRESS = 0xdEfa017defA017DeFA017DEfa017DeFA017DeFa0;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n */\\n constructor(\\n address _libAddressManager,\\n GasMeterConfig memory _gasMeterConfig,\\n GlobalContext memory _globalContext\\n )\\n Lib_AddressResolver(_libAddressManager)\\n {\\n ovmSafetyChecker = iOVM_SafetyChecker(resolve(\\\"OVM_SafetyChecker\\\"));\\n gasMeterConfig = _gasMeterConfig;\\n globalContext = _globalContext;\\n _resetContext();\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n /**\\n * Applies dynamically-sized refund to a transaction to account for the difference in execution\\n * between L1 and L2, so that the overall cost of the ovmOPCODE is fixed.\\n * @param _cost Desired gas cost for the function after the refund.\\n */\\n modifier netGasCost(\\n uint256 _cost\\n ) {\\n uint256 gasProvided = gasleft();\\n _;\\n uint256 gasUsed = gasProvided - gasleft();\\n\\n // We want to refund everything *except* the specified cost.\\n if (_cost < gasUsed) {\\n transactionRecord.ovmGasRefund += gasUsed - _cost;\\n }\\n }\\n\\n /**\\n * Applies a fixed-size gas refund to a transaction to account for the difference in execution\\n * between L1 and L2, so that the overall cost of an ovmOPCODE can be lowered.\\n * @param _discount Amount of gas cost to refund for the ovmOPCODE.\\n */\\n modifier fixedGasDiscount(\\n uint256 _discount\\n ) {\\n uint256 gasProvided = gasleft();\\n _;\\n uint256 gasUsed = gasProvided - gasleft();\\n\\n // We want to refund the specified _discount, unless this risks underflow.\\n if (_discount < gasUsed) {\\n transactionRecord.ovmGasRefund += _discount;\\n } else {\\n // refund all we can without risking underflow.\\n transactionRecord.ovmGasRefund += gasUsed;\\n }\\n }\\n\\n /**\\n * Makes sure we're not inside a static context.\\n */\\n modifier notStatic() {\\n if (messageContext.isStatic == true) {\\n _revertWithFlag(RevertFlag.STATIC_VIOLATION);\\n }\\n _;\\n }\\n\\n\\n /************************************\\n * Transaction Execution Entrypoint *\\n ************************************/\\n\\n /**\\n * Starts the execution of a transaction via the OVM_ExecutionManager.\\n * @param _transaction Transaction data to be executed.\\n * @param _ovmStateManager iOVM_StateManager implementation providing account state.\\n */\\n function run(\\n Lib_OVMCodec.Transaction memory _transaction,\\n address _ovmStateManager\\n )\\n override\\n public\\n {\\n // Make sure that run() is not re-enterable. This condition should always be satisfied\\n // Once run has been called once, due to the behavior of _isValidInput().\\n if (transactionContext.ovmNUMBER != DEFAULT_UINT256) {\\n return;\\n }\\n\\n // Store our OVM_StateManager instance (significantly easier than attempting to pass the\\n // address around in calldata).\\n ovmStateManager = iOVM_StateManager(_ovmStateManager);\\n\\n // Make sure this function can't be called by anyone except the owner of the\\n // OVM_StateManager (expected to be an OVM_StateTransitioner). We can revert here because\\n // this would make the `run` itself invalid.\\n require(\\n // This method may return false during fraud proofs, but always returns true in L2 nodes' State Manager precompile.\\n ovmStateManager.isAuthenticated(msg.sender),\\n \\\"Only authenticated addresses in ovmStateManager can call this function\\\"\\n );\\n\\n // Initialize the execution context, must be initialized before we perform any gas metering\\n // or we'll throw a nuisance gas error.\\n _initContext(_transaction);\\n\\n // TEMPORARY: Gas metering is disabled for minnet.\\n // // Check whether we need to start a new epoch, do so if necessary.\\n // _checkNeedsNewEpoch(_transaction.timestamp);\\n\\n // Make sure the transaction's gas limit is valid. We don't revert here because we reserve\\n // reverts for INVALID_STATE_ACCESS.\\n if (_isValidInput(_transaction) == false) {\\n _resetContext();\\n return;\\n }\\n\\n // TEMPORARY: Gas metering is disabled for minnet.\\n // // Check gas right before the call to get total gas consumed by OVM transaction.\\n // uint256 gasProvided = gasleft();\\n\\n // Run the transaction, make sure to meter the gas usage.\\n ovmCALL(\\n _transaction.gasLimit - gasMeterConfig.minTransactionGasLimit,\\n _transaction.entrypoint,\\n _transaction.data\\n );\\n\\n // TEMPORARY: Gas metering is disabled for minnet.\\n // // Update the cumulative gas based on the amount of gas used.\\n // uint256 gasUsed = gasProvided - gasleft();\\n // _updateCumulativeGas(gasUsed, _transaction.l1QueueOrigin);\\n\\n // Wipe the execution context.\\n _resetContext();\\n }\\n\\n\\n /******************************\\n * Opcodes: Execution Context *\\n ******************************/\\n\\n /**\\n * @notice Overrides CALLER.\\n * @return _CALLER Address of the CALLER within the current message context.\\n */\\n function ovmCALLER()\\n override\\n public\\n view\\n returns (\\n address _CALLER\\n )\\n {\\n return messageContext.ovmCALLER;\\n }\\n\\n /**\\n * @notice Overrides ADDRESS.\\n * @return _ADDRESS Active ADDRESS within the current message context.\\n */\\n function ovmADDRESS()\\n override\\n public\\n view\\n returns (\\n address _ADDRESS\\n )\\n {\\n return messageContext.ovmADDRESS;\\n }\\n\\n /**\\n * @notice Overrides TIMESTAMP.\\n * @return _TIMESTAMP Value of the TIMESTAMP within the transaction context.\\n */\\n function ovmTIMESTAMP()\\n override\\n public\\n view\\n returns (\\n uint256 _TIMESTAMP\\n )\\n {\\n return transactionContext.ovmTIMESTAMP;\\n }\\n\\n /**\\n * @notice Overrides NUMBER.\\n * @return _NUMBER Value of the NUMBER within the transaction context.\\n */\\n function ovmNUMBER()\\n override\\n public\\n view\\n returns (\\n uint256 _NUMBER\\n )\\n {\\n return transactionContext.ovmNUMBER;\\n }\\n\\n /**\\n * @notice Overrides GASLIMIT.\\n * @return _GASLIMIT Value of the block's GASLIMIT within the transaction context.\\n */\\n function ovmGASLIMIT()\\n override\\n public\\n view\\n returns (\\n uint256 _GASLIMIT\\n )\\n {\\n return transactionContext.ovmGASLIMIT;\\n }\\n\\n /**\\n * @notice Overrides CHAINID.\\n * @return _CHAINID Value of the chain's CHAINID within the global context.\\n */\\n function ovmCHAINID()\\n override\\n public\\n view\\n returns (\\n uint256 _CHAINID\\n )\\n {\\n return globalContext.ovmCHAINID;\\n }\\n\\n /*********************************\\n * Opcodes: L2 Execution Context *\\n *********************************/\\n\\n /**\\n * @notice Specifies from which L1 rollup queue this transaction originated from.\\n * @return _queueOrigin Address of the ovmL1QUEUEORIGIN within the current message context.\\n */\\n function ovmL1QUEUEORIGIN()\\n override\\n public\\n view\\n returns (\\n Lib_OVMCodec.QueueOrigin _queueOrigin\\n )\\n {\\n return transactionContext.ovmL1QUEUEORIGIN;\\n }\\n\\n /**\\n * @notice Specifies which L1 account, if any, sent this transaction by calling enqueue().\\n * @return _l1TxOrigin Address of the account which sent the tx into L2 from L1.\\n */\\n function ovmL1TXORIGIN()\\n override\\n public\\n view\\n returns (\\n address _l1TxOrigin\\n )\\n {\\n return transactionContext.ovmL1TXORIGIN;\\n }\\n\\n /********************\\n * Opcodes: Halting *\\n ********************/\\n\\n /**\\n * @notice Overrides REVERT.\\n * @param _data Bytes data to pass along with the REVERT.\\n */\\n function ovmREVERT(\\n bytes memory _data\\n )\\n override\\n public\\n {\\n _revertWithFlag(RevertFlag.INTENTIONAL_REVERT, _data);\\n }\\n\\n\\n /******************************\\n * Opcodes: Contract Creation *\\n ******************************/\\n\\n /**\\n * @notice Overrides CREATE.\\n * @param _bytecode Code to be used to CREATE a new contract.\\n * @return Address of the created contract.\\n * @return Revert data, if and only if the creation threw an exception.\\n */\\n function ovmCREATE(\\n bytes memory _bytecode\\n )\\n override\\n public\\n notStatic\\n fixedGasDiscount(40000)\\n returns (\\n address,\\n bytes memory\\n )\\n {\\n // Creator is always the current ADDRESS.\\n address creator = ovmADDRESS();\\n\\n // Check that the deployer is whitelisted, or\\n // that arbitrary contract deployment has been enabled.\\n _checkDeployerAllowed(creator);\\n\\n // Generate the correct CREATE address.\\n address contractAddress = Lib_EthUtils.getAddressForCREATE(\\n creator,\\n _getAccountNonce(creator)\\n );\\n\\n return _createContract(\\n contractAddress,\\n _bytecode\\n );\\n }\\n\\n /**\\n * @notice Overrides CREATE2.\\n * @param _bytecode Code to be used to CREATE2 a new contract.\\n * @param _salt Value used to determine the contract's address.\\n * @return Address of the created contract.\\n * @return Revert data, if and only if the creation threw an exception.\\n */\\n function ovmCREATE2(\\n bytes memory _bytecode,\\n bytes32 _salt\\n )\\n override\\n public\\n notStatic\\n fixedGasDiscount(40000)\\n returns (\\n address,\\n bytes memory\\n )\\n {\\n // Creator is always the current ADDRESS.\\n address creator = ovmADDRESS();\\n\\n // Check that the deployer is whitelisted, or\\n // that arbitrary contract deployment has been enabled.\\n _checkDeployerAllowed(creator);\\n\\n // Generate the correct CREATE2 address.\\n address contractAddress = Lib_EthUtils.getAddressForCREATE2(\\n creator,\\n _bytecode,\\n _salt\\n );\\n\\n return _createContract(\\n contractAddress,\\n _bytecode\\n );\\n }\\n\\n\\n /*******************************\\n * Account Abstraction Opcodes *\\n ******************************/\\n\\n /**\\n * Retrieves the nonce of the current ovmADDRESS.\\n * @return _nonce Nonce of the current contract.\\n */\\n function ovmGETNONCE()\\n override\\n public\\n returns (\\n uint256 _nonce\\n )\\n {\\n return _getAccountNonce(ovmADDRESS());\\n }\\n\\n /**\\n * Bumps the nonce of the current ovmADDRESS by one.\\n */\\n function ovmINCREMENTNONCE()\\n override\\n public\\n notStatic\\n {\\n address account = ovmADDRESS();\\n uint256 nonce = _getAccountNonce(account);\\n\\n // Prevent overflow.\\n if (nonce + 1 > nonce) {\\n _setAccountNonce(account, nonce + 1);\\n }\\n }\\n\\n /**\\n * Creates a new EOA contract account, for account abstraction.\\n * @dev Essentially functions like ovmCREATE or ovmCREATE2, but we can bypass a lot of checks\\n * because the contract we're creating is trusted (no need to do safety checking or to\\n * handle unexpected reverts). Doesn't need to return an address because the address is\\n * assumed to be the user's actual address.\\n * @param _messageHash Hash of a message signed by some user, for verification.\\n * @param _v Signature `v` parameter.\\n * @param _r Signature `r` parameter.\\n * @param _s Signature `s` parameter.\\n */\\n function ovmCREATEEOA(\\n bytes32 _messageHash,\\n uint8 _v,\\n bytes32 _r,\\n bytes32 _s\\n )\\n override\\n public\\n notStatic\\n {\\n // Recover the EOA address from the message hash and signature parameters. Since we do the\\n // hashing in advance, we don't have handle different message hashing schemes. Even if this\\n // function were to return the wrong address (rather than explicitly returning the zero\\n // address), the rest of the transaction would simply fail (since there's no EOA account to\\n // actually execute the transaction).\\n address eoa = ecrecover(\\n _messageHash,\\n _v + 27,\\n _r,\\n _s\\n );\\n\\n // Invalid signature is a case we proactively handle with a revert. We could alternatively\\n // have this function return a `success` boolean, but this is just easier.\\n if (eoa == address(0)) {\\n ovmREVERT(bytes(\\\"Signature provided for EOA contract creation is invalid.\\\"));\\n }\\n\\n // If the user already has an EOA account, then there's no need to perform this operation.\\n if (_hasEmptyAccount(eoa) == false) {\\n return;\\n }\\n\\n // We always need to initialize the contract with the default account values.\\n _initPendingAccount(eoa);\\n\\n // Temporarily set the current address so it's easier to access on L2.\\n address prevADDRESS = messageContext.ovmADDRESS;\\n messageContext.ovmADDRESS = eoa;\\n\\n // Now actually create the account and get its bytecode. We're not worried about reverts\\n // (other than out of gas, which we can't capture anyway) because this contract is trusted.\\n OVM_ProxyEOA proxyEOA = new OVM_ProxyEOA(0x4200000000000000000000000000000000000003);\\n\\n // Reset the address now that we're done deploying.\\n messageContext.ovmADDRESS = prevADDRESS;\\n\\n // Commit the account with its final values.\\n _commitPendingAccount(\\n eoa,\\n address(proxyEOA),\\n keccak256(Lib_EthUtils.getCode(address(proxyEOA)))\\n );\\n\\n _setAccountNonce(eoa, 0);\\n }\\n\\n\\n /*********************************\\n * Opcodes: Contract Interaction *\\n *********************************/\\n\\n /**\\n * @notice Overrides CALL.\\n * @param _gasLimit Amount of gas to be passed into this call.\\n * @param _address Address of the contract to call.\\n * @param _calldata Data to send along with the call.\\n * @return _success Whether or not the call returned (rather than reverted).\\n * @return _returndata Data returned by the call.\\n */\\n function ovmCALL(\\n uint256 _gasLimit,\\n address _address,\\n bytes memory _calldata\\n )\\n override\\n public\\n fixedGasDiscount(100000)\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n // CALL updates the CALLER and ADDRESS.\\n MessageContext memory nextMessageContext = messageContext;\\n nextMessageContext.ovmCALLER = nextMessageContext.ovmADDRESS;\\n nextMessageContext.ovmADDRESS = _address;\\n\\n return _callContract(\\n nextMessageContext,\\n _gasLimit,\\n _address,\\n _calldata\\n );\\n }\\n\\n /**\\n * @notice Overrides STATICCALL.\\n * @param _gasLimit Amount of gas to be passed into this call.\\n * @param _address Address of the contract to call.\\n * @param _calldata Data to send along with the call.\\n * @return _success Whether or not the call returned (rather than reverted).\\n * @return _returndata Data returned by the call.\\n */\\n function ovmSTATICCALL(\\n uint256 _gasLimit,\\n address _address,\\n bytes memory _calldata\\n )\\n override\\n public\\n fixedGasDiscount(80000)\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n // STATICCALL updates the CALLER, updates the ADDRESS, and runs in a static context.\\n MessageContext memory nextMessageContext = messageContext;\\n nextMessageContext.ovmCALLER = nextMessageContext.ovmADDRESS;\\n nextMessageContext.ovmADDRESS = _address;\\n nextMessageContext.isStatic = true;\\n\\n return _callContract(\\n nextMessageContext,\\n _gasLimit,\\n _address,\\n _calldata\\n );\\n }\\n\\n /**\\n * @notice Overrides DELEGATECALL.\\n * @param _gasLimit Amount of gas to be passed into this call.\\n * @param _address Address of the contract to call.\\n * @param _calldata Data to send along with the call.\\n * @return _success Whether or not the call returned (rather than reverted).\\n * @return _returndata Data returned by the call.\\n */\\n function ovmDELEGATECALL(\\n uint256 _gasLimit,\\n address _address,\\n bytes memory _calldata\\n )\\n override\\n public\\n fixedGasDiscount(40000)\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n // DELEGATECALL does not change anything about the message context.\\n MessageContext memory nextMessageContext = messageContext;\\n\\n return _callContract(\\n nextMessageContext,\\n _gasLimit,\\n _address,\\n _calldata\\n );\\n }\\n\\n\\n /************************************\\n * Opcodes: Contract Storage Access *\\n ************************************/\\n\\n /**\\n * @notice Overrides SLOAD.\\n * @param _key 32 byte key of the storage slot to load.\\n * @return _value 32 byte value of the requested storage slot.\\n */\\n function ovmSLOAD(\\n bytes32 _key\\n )\\n override\\n public\\n netGasCost(40000)\\n returns (\\n bytes32 _value\\n )\\n {\\n // We always SLOAD from the storage of ADDRESS.\\n address contractAddress = ovmADDRESS();\\n\\n return _getContractStorage(\\n contractAddress,\\n _key\\n );\\n }\\n\\n /**\\n * @notice Overrides SSTORE.\\n * @param _key 32 byte key of the storage slot to set.\\n * @param _value 32 byte value for the storage slot.\\n */\\n function ovmSSTORE(\\n bytes32 _key,\\n bytes32 _value\\n )\\n override\\n public\\n notStatic\\n netGasCost(60000)\\n {\\n // We always SSTORE to the storage of ADDRESS.\\n address contractAddress = ovmADDRESS();\\n\\n _putContractStorage(\\n contractAddress,\\n _key,\\n _value\\n );\\n }\\n\\n\\n /*********************************\\n * Opcodes: Contract Code Access *\\n *********************************/\\n\\n /**\\n * @notice Overrides EXTCODECOPY.\\n * @param _contract Address of the contract to copy code from.\\n * @param _offset Offset in bytes from the start of contract code to copy beyond.\\n * @param _length Total number of bytes to copy from the contract's code.\\n * @return _code Bytes of code copied from the requested contract.\\n */\\n function ovmEXTCODECOPY(\\n address _contract,\\n uint256 _offset,\\n uint256 _length\\n )\\n override\\n public\\n returns (\\n bytes memory _code\\n )\\n {\\n // `ovmEXTCODECOPY` is the only overridden opcode capable of producing exactly one byte of\\n // return data. By blocking reads of one byte, we're able to use the condition that an\\n // OVM_ExecutionManager function return value having a length of exactly one byte indicates\\n // an error without an explicit revert. If users were able to read a single byte, they\\n // could forcibly trigger behavior that should only be available to this contract.\\n uint256 length = _length == 1 ? 2 : _length;\\n\\n return Lib_EthUtils.getCode(\\n _getAccountEthAddress(_contract),\\n _offset,\\n length\\n );\\n }\\n\\n /**\\n * @notice Overrides EXTCODESIZE.\\n * @param _contract Address of the contract to query the size of.\\n * @return _EXTCODESIZE Size of the requested contract in bytes.\\n */\\n function ovmEXTCODESIZE(\\n address _contract\\n )\\n override\\n public\\n returns (\\n uint256 _EXTCODESIZE\\n )\\n {\\n return Lib_EthUtils.getCodeSize(\\n _getAccountEthAddress(_contract)\\n );\\n }\\n\\n /**\\n * @notice Overrides EXTCODEHASH.\\n * @param _contract Address of the contract to query the hash of.\\n * @return _EXTCODEHASH Hash of the requested contract.\\n */\\n function ovmEXTCODEHASH(\\n address _contract\\n )\\n override\\n public\\n returns (\\n bytes32 _EXTCODEHASH\\n )\\n {\\n return Lib_EthUtils.getCodeHash(\\n _getAccountEthAddress(_contract)\\n );\\n }\\n\\n /***************************************\\n * Public Functions: Execution Context *\\n ***************************************/\\n\\n function getMaxTransactionGasLimit()\\n external\\n view\\n override\\n returns (\\n uint256 _maxTransactionGasLimit\\n )\\n {\\n return gasMeterConfig.maxTransactionGasLimit;\\n }\\n\\n /********************************************\\n * Public Functions: Deployment Whitelisting *\\n ********************************************/\\n\\n /**\\n * Checks whether the given address is on the whitelist to ovmCREATE/ovmCREATE2, and reverts if not.\\n * @param _deployerAddress Address attempting to deploy a contract.\\n */\\n function _checkDeployerAllowed(\\n address _deployerAddress\\n )\\n internal\\n {\\n // From an OVM semantics perspective, this will appear identical to\\n // the deployer ovmCALLing the whitelist. This is fine--in a sense, we are forcing them to.\\n (bool success, bytes memory data) = ovmCALL(\\n gasleft(),\\n 0x4200000000000000000000000000000000000002,\\n abi.encodeWithSignature(\\\"isDeployerAllowed(address)\\\", _deployerAddress)\\n );\\n bool isAllowed = abi.decode(data, (bool));\\n\\n if (!isAllowed || !success) {\\n _revertWithFlag(RevertFlag.CREATOR_NOT_ALLOWED);\\n }\\n }\\n\\n /********************************************\\n * Internal Functions: Contract Interaction *\\n ********************************************/\\n\\n /**\\n * Creates a new contract and associates it with some contract address.\\n * @param _contractAddress Address to associate the created contract with.\\n * @param _bytecode Bytecode to be used to create the contract.\\n * @return Final OVM contract address.\\n * @return Revertdata, if and only if the creation threw an exception.\\n */\\n function _createContract(\\n address _contractAddress,\\n bytes memory _bytecode\\n )\\n internal\\n returns (\\n address,\\n bytes memory\\n )\\n {\\n // We always update the nonce of the creating account, even if the creation fails.\\n _setAccountNonce(ovmADDRESS(), _getAccountNonce(ovmADDRESS()) + 1);\\n\\n // We're stepping into a CREATE or CREATE2, so we need to update ADDRESS to point\\n // to the contract's associated address and CALLER to point to the previous ADDRESS.\\n MessageContext memory nextMessageContext = messageContext;\\n nextMessageContext.ovmCALLER = messageContext.ovmADDRESS;\\n nextMessageContext.ovmADDRESS = _contractAddress;\\n\\n // Run the common logic which occurs between call-type and create-type messages,\\n // passing in the creation bytecode and `true` to trigger create-specific logic.\\n (bool success, bytes memory data) = _handleExternalMessage(\\n nextMessageContext,\\n gasleft(),\\n _contractAddress,\\n _bytecode,\\n true\\n );\\n\\n // Yellow paper requires that address returned is zero if the contract deployment fails.\\n return (\\n success ? _contractAddress : address(0),\\n data\\n );\\n }\\n\\n /**\\n * Calls the deployed contract associated with a given address.\\n * @param _nextMessageContext Message context to be used for the call.\\n * @param _gasLimit Amount of gas to be passed into this call.\\n * @param _contract OVM address to be called.\\n * @param _calldata Data to send along with the call.\\n * @return _success Whether or not the call returned (rather than reverted).\\n * @return _returndata Data returned by the call.\\n */\\n function _callContract(\\n MessageContext memory _nextMessageContext,\\n uint256 _gasLimit,\\n address _contract,\\n bytes memory _calldata\\n )\\n internal\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n // We reserve addresses of the form 0xdeaddeaddead...NNNN for the container contracts in L2 geth.\\n // So, we block calls to these addresses since they are not safe to run as an OVM contract itself.\\n if (\\n (uint256(_contract) & uint256(0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000))\\n == uint256(0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000)\\n ) {\\n // EVM does not return data in the success case, see: https://github.com/ethereum/go-ethereum/blob/aae7660410f0ef90279e14afaaf2f429fdc2a186/core/vm/instructions.go#L600-L604\\n return (true, hex'');\\n }\\n\\n // Both 0x0000... and the EVM precompiles have the same address on L1 and L2 --> no trie lookup needed.\\n address codeContractAddress =\\n uint(_contract) < 100\\n ? _contract\\n : _getAccountEthAddress(_contract);\\n\\n return _handleExternalMessage(\\n _nextMessageContext,\\n _gasLimit,\\n codeContractAddress,\\n _calldata,\\n false\\n );\\n }\\n\\n /**\\n * Handles all interactions which involve the execution manager calling out to untrusted code (both calls and creates).\\n * Ensures that OVM-related measures are enforced, including L2 gas refunds, nuisance gas, and flagged reversions.\\n *\\n * @param _nextMessageContext Message context to be used for the external message.\\n * @param _gasLimit Amount of gas to be passed into this message.\\n * @param _contract OVM address being called or deployed to\\n * @param _data Data for the message (either calldata or creation code)\\n * @param _isCreate Whether this is a create-type message.\\n * @return Whether or not the message (either a call or deployment) succeeded.\\n * @return Data returned by the message.\\n */\\n function _handleExternalMessage(\\n MessageContext memory _nextMessageContext,\\n uint256 _gasLimit,\\n address _contract,\\n bytes memory _data,\\n bool _isCreate\\n )\\n internal\\n returns (\\n bool,\\n bytes memory\\n )\\n {\\n // We need to switch over to our next message context for the duration of this call.\\n MessageContext memory prevMessageContext = messageContext;\\n _switchMessageContext(prevMessageContext, _nextMessageContext);\\n\\n // Nuisance gas is a system used to bound the ability for an attacker to make fraud proofs\\n // expensive by touching a lot of different accounts or storage slots. Since most contracts\\n // only use a few storage slots during any given transaction, this shouldn't be a limiting\\n // factor.\\n uint256 prevNuisanceGasLeft = messageRecord.nuisanceGasLeft;\\n uint256 nuisanceGasLimit = _getNuisanceGasLimit(_gasLimit);\\n messageRecord.nuisanceGasLeft = nuisanceGasLimit;\\n\\n // Make the call and make sure to pass in the gas limit. Another instance of hidden\\n // complexity. `_contract` is guaranteed to be a safe contract, meaning its return/revert\\n // behavior can be controlled. In particular, we enforce that flags are passed through\\n // revert data as to retrieve execution metadata that would normally be reverted out of\\n // existence.\\n\\n bool success;\\n bytes memory returndata;\\n if (_isCreate) {\\n // safeCREATE() is a function which replicates a CREATE message, but uses return values\\n // Which match that of CALL (i.e. bool, bytes). This allows many security checks to be\\n // to be shared between untrusted call and create call frames.\\n (success, returndata) = address(this).call(\\n abi.encodeWithSelector(\\n this.safeCREATE.selector,\\n _gasLimit,\\n _data,\\n _contract\\n )\\n );\\n } else {\\n (success, returndata) = _contract.call{gas: _gasLimit}(_data);\\n }\\n\\n // Switch back to the original message context now that we're out of the call.\\n _switchMessageContext(_nextMessageContext, prevMessageContext);\\n\\n // Assuming there were no reverts, the message record should be accurate here. We'll update\\n // this value in the case of a revert.\\n uint256 nuisanceGasLeft = messageRecord.nuisanceGasLeft;\\n\\n // Reverts at this point are completely OK, but we need to make a few updates based on the\\n // information passed through the revert.\\n if (success == false) {\\n (\\n RevertFlag flag,\\n uint256 nuisanceGasLeftPostRevert,\\n uint256 ovmGasRefund,\\n bytes memory returndataFromFlag\\n ) = _decodeRevertData(returndata);\\n\\n // INVALID_STATE_ACCESS is the only flag that triggers an immediate abort of the\\n // parent EVM message. This behavior is necessary because INVALID_STATE_ACCESS must\\n // halt any further transaction execution that could impact the execution result.\\n if (flag == RevertFlag.INVALID_STATE_ACCESS) {\\n _revertWithFlag(flag);\\n }\\n\\n // INTENTIONAL_REVERT, UNSAFE_BYTECODE, STATIC_VIOLATION, and CREATOR_NOT_ALLOWED aren't\\n // dependent on the input state, so we can just handle them like standard reverts. Our only change here\\n // is to record the gas refund reported by the call (enforced by safety checking).\\n if (\\n flag == RevertFlag.INTENTIONAL_REVERT\\n || flag == RevertFlag.UNSAFE_BYTECODE\\n || flag == RevertFlag.STATIC_VIOLATION\\n || flag == RevertFlag.CREATOR_NOT_ALLOWED\\n ) {\\n transactionRecord.ovmGasRefund = ovmGasRefund;\\n }\\n\\n // INTENTIONAL_REVERT needs to pass up the user-provided return data encoded into the\\n // flag, *not* the full encoded flag. All other revert types return no data.\\n if (\\n flag == RevertFlag.INTENTIONAL_REVERT\\n || _isCreate\\n ) {\\n returndata = returndataFromFlag;\\n } else {\\n returndata = hex'';\\n }\\n\\n // Reverts mean we need to use up whatever \\\"nuisance gas\\\" was used by the call.\\n // EXCEEDS_NUISANCE_GAS explicitly reduces the remaining nuisance gas for this message\\n // to zero. OUT_OF_GAS is a \\\"pseudo\\\" flag given that messages return no data when they\\n // run out of gas, so we have to treat this like EXCEEDS_NUISANCE_GAS. All other flags\\n // will simply pass up the remaining nuisance gas.\\n nuisanceGasLeft = nuisanceGasLeftPostRevert;\\n }\\n\\n // We need to reset the nuisance gas back to its original value minus the amount used here.\\n messageRecord.nuisanceGasLeft = prevNuisanceGasLeft - (nuisanceGasLimit - nuisanceGasLeft);\\n\\n return (\\n success,\\n returndata\\n );\\n }\\n\\n /**\\n * Handles the creation-specific safety measures required for OVM contract deployment.\\n * This function sanitizes the return types for creation messages to match calls (bool, bytes),\\n * by being an external function which the EM can call, that mimics the success/fail case of the CREATE.\\n * This allows for consistent handling of both types of messages in _handleExternalMessage().\\n * Having this step occur as a separate call frame also allows us to easily revert the \\n * contract deployment in the event that the code is unsafe.\\n * \\n * @param _gasLimit Amount of gas to be passed into this creation.\\n * @param _creationCode Code to pass into CREATE for deployment.\\n * @param _address OVM address being deployed to.\\n */\\n function safeCREATE(\\n uint _gasLimit,\\n bytes memory _creationCode,\\n address _address\\n )\\n external\\n {\\n // The only way this should callable is from within _createContract(),\\n // and it should DEFINITELY not be callable by a non-EM code contract.\\n if (msg.sender != address(this)) {\\n return;\\n }\\n // Check that there is not already code at this address.\\n if (_hasEmptyAccount(_address) == false) {\\n // Note: in the EVM, this case burns all allotted gas. For improved\\n // developer experience, we do return the remaining gas.\\n _revertWithFlag(\\n RevertFlag.CREATE_COLLISION,\\n Lib_ErrorUtils.encodeRevertString(\\\"A contract has already been deployed to this address\\\")\\n );\\n }\\n\\n // Check the creation bytecode against the OVM_SafetyChecker.\\n if (ovmSafetyChecker.isBytecodeSafe(_creationCode) == false) {\\n _revertWithFlag(\\n RevertFlag.UNSAFE_BYTECODE,\\n Lib_ErrorUtils.encodeRevertString(\\\"Contract creation code contains unsafe opcodes. Did you use the right compiler or pass an unsafe constructor argument?\\\")\\n );\\n }\\n\\n // We always need to initialize the contract with the default account values.\\n _initPendingAccount(_address);\\n\\n // Actually execute the EVM create message.\\n // NOTE: The inline assembly below means we can NOT make any evm calls between here and then.\\n address ethAddress = Lib_EthUtils.createContract(_creationCode);\\n\\n if (ethAddress == address(0)) {\\n // If the creation fails, the EVM lets us grab its revert data. This may contain a revert flag\\n // to be used above in _handleExternalMessage, so we pass the revert data back up unmodified.\\n assembly { \\n returndatacopy(0,0,returndatasize())\\n revert(0, returndatasize())\\n }\\n }\\n\\n // Again simply checking that the deployed code is safe too. Contracts can generate\\n // arbitrary deployment code, so there's no easy way to analyze this beforehand.\\n bytes memory deployedCode = Lib_EthUtils.getCode(ethAddress);\\n if (ovmSafetyChecker.isBytecodeSafe(deployedCode) == false) {\\n _revertWithFlag(\\n RevertFlag.UNSAFE_BYTECODE,\\n Lib_ErrorUtils.encodeRevertString(\\\"Constructor attempted to deploy unsafe bytecode.\\\")\\n );\\n }\\n\\n // Contract creation didn't need to be reverted and the bytecode is safe. We finish up by\\n // associating the desired address with the newly created contract's code hash and address.\\n _commitPendingAccount(\\n _address,\\n ethAddress,\\n Lib_EthUtils.getCodeHash(ethAddress)\\n );\\n }\\n\\n /******************************************\\n * Internal Functions: State Manipulation *\\n ******************************************/\\n\\n /**\\n * Checks whether an account exists within the OVM_StateManager.\\n * @param _address Address of the account to check.\\n * @return _exists Whether or not the account exists.\\n */\\n function _hasAccount(\\n address _address\\n )\\n internal\\n returns (\\n bool _exists\\n )\\n {\\n _checkAccountLoad(_address);\\n return ovmStateManager.hasAccount(_address);\\n }\\n\\n /**\\n * Checks whether a known empty account exists within the OVM_StateManager.\\n * @param _address Address of the account to check.\\n * @return _exists Whether or not the account empty exists.\\n */\\n function _hasEmptyAccount(\\n address _address\\n )\\n internal\\n returns (\\n bool _exists\\n )\\n {\\n _checkAccountLoad(_address);\\n return ovmStateManager.hasEmptyAccount(_address);\\n }\\n\\n /**\\n * Sets the nonce of an account.\\n * @param _address Address of the account to modify.\\n * @param _nonce New account nonce.\\n */\\n function _setAccountNonce(\\n address _address,\\n uint256 _nonce\\n )\\n internal\\n {\\n _checkAccountChange(_address);\\n ovmStateManager.setAccountNonce(_address, _nonce);\\n }\\n\\n /**\\n * Gets the nonce of an account.\\n * @param _address Address of the account to access.\\n * @return _nonce Nonce of the account.\\n */\\n function _getAccountNonce(\\n address _address\\n )\\n internal\\n returns (\\n uint256 _nonce\\n )\\n {\\n _checkAccountLoad(_address);\\n return ovmStateManager.getAccountNonce(_address);\\n }\\n\\n /**\\n * Retrieves the Ethereum address of an account.\\n * @param _address Address of the account to access.\\n * @return _ethAddress Corresponding Ethereum address.\\n */\\n function _getAccountEthAddress(\\n address _address\\n )\\n internal\\n returns (\\n address _ethAddress\\n )\\n {\\n _checkAccountLoad(_address);\\n return ovmStateManager.getAccountEthAddress(_address);\\n }\\n\\n /**\\n * Creates the default account object for the given address.\\n * @param _address Address of the account create.\\n */\\n function _initPendingAccount(\\n address _address\\n )\\n internal\\n {\\n // Although it seems like `_checkAccountChange` would be more appropriate here, we don't\\n // actually consider an account \\\"changed\\\" until it's inserted into the state (in this case\\n // by `_commitPendingAccount`).\\n _checkAccountLoad(_address);\\n ovmStateManager.initPendingAccount(_address);\\n }\\n\\n /**\\n * Stores additional relevant data for a new account, thereby \\\"committing\\\" it to the state.\\n * This function is only called during `ovmCREATE` and `ovmCREATE2` after a successful contract\\n * creation.\\n * @param _address Address of the account to commit.\\n * @param _ethAddress Address of the associated deployed contract.\\n * @param _codeHash Hash of the code stored at the address.\\n */\\n function _commitPendingAccount(\\n address _address,\\n address _ethAddress,\\n bytes32 _codeHash\\n )\\n internal\\n {\\n _checkAccountChange(_address);\\n ovmStateManager.commitPendingAccount(\\n _address,\\n _ethAddress,\\n _codeHash\\n );\\n }\\n\\n /**\\n * Retrieves the value of a storage slot.\\n * @param _contract Address of the contract to query.\\n * @param _key 32 byte key of the storage slot.\\n * @return _value 32 byte storage slot value.\\n */\\n function _getContractStorage(\\n address _contract,\\n bytes32 _key\\n )\\n internal\\n returns (\\n bytes32 _value\\n )\\n {\\n _checkContractStorageLoad(_contract, _key);\\n return ovmStateManager.getContractStorage(_contract, _key);\\n }\\n\\n /**\\n * Sets the value of a storage slot.\\n * @param _contract Address of the contract to modify.\\n * @param _key 32 byte key of the storage slot.\\n * @param _value 32 byte storage slot value.\\n */\\n function _putContractStorage(\\n address _contract,\\n bytes32 _key,\\n bytes32 _value\\n )\\n internal\\n {\\n // We don't set storage if the value didn't change. Although this acts as a convenient\\n // optimization, it's also necessary to avoid the case in which a contract with no storage\\n // attempts to store the value \\\"0\\\" at any key. Putting this value (and therefore requiring\\n // that the value be committed into the storage trie after execution) would incorrectly\\n // modify the storage root.\\n if (_getContractStorage(_contract, _key) == _value) {\\n return;\\n }\\n\\n _checkContractStorageChange(_contract, _key);\\n ovmStateManager.putContractStorage(_contract, _key, _value);\\n }\\n\\n /**\\n * Validation whenever a contract needs to be loaded. Checks that the account exists, charges\\n * nuisance gas if the account hasn't been loaded before.\\n * @param _address Address of the account to load.\\n */\\n function _checkAccountLoad(\\n address _address\\n )\\n internal\\n {\\n // See `_checkContractStorageLoad` for more information.\\n if (gasleft() < MIN_GAS_FOR_INVALID_STATE_ACCESS) {\\n _revertWithFlag(RevertFlag.OUT_OF_GAS);\\n }\\n\\n // See `_checkContractStorageLoad` for more information.\\n if (ovmStateManager.hasAccount(_address) == false) {\\n _revertWithFlag(RevertFlag.INVALID_STATE_ACCESS);\\n }\\n\\n // Check whether the account has been loaded before and mark it as loaded if not. We need\\n // this because \\\"nuisance gas\\\" only applies to the first time that an account is loaded.\\n (\\n bool _wasAccountAlreadyLoaded\\n ) = ovmStateManager.testAndSetAccountLoaded(_address);\\n\\n // If we hadn't already loaded the account, then we'll need to charge \\\"nuisance gas\\\" based\\n // on the size of the contract code.\\n if (_wasAccountAlreadyLoaded == false) {\\n _useNuisanceGas(\\n (Lib_EthUtils.getCodeSize(_getAccountEthAddress(_address)) * NUISANCE_GAS_PER_CONTRACT_BYTE) + MIN_NUISANCE_GAS_PER_CONTRACT\\n );\\n }\\n }\\n\\n /**\\n * Validation whenever a contract needs to be changed. Checks that the account exists, charges\\n * nuisance gas if the account hasn't been changed before.\\n * @param _address Address of the account to change.\\n */\\n function _checkAccountChange(\\n address _address\\n )\\n internal\\n {\\n // Start by checking for a load as we only want to charge nuisance gas proportional to\\n // contract size once.\\n _checkAccountLoad(_address);\\n\\n // Check whether the account has been changed before and mark it as changed if not. We need\\n // this because \\\"nuisance gas\\\" only applies to the first time that an account is changed.\\n (\\n bool _wasAccountAlreadyChanged\\n ) = ovmStateManager.testAndSetAccountChanged(_address);\\n\\n // If we hadn't already loaded the account, then we'll need to charge \\\"nuisance gas\\\" based\\n // on the size of the contract code.\\n if (_wasAccountAlreadyChanged == false) {\\n ovmStateManager.incrementTotalUncommittedAccounts();\\n _useNuisanceGas(\\n (Lib_EthUtils.getCodeSize(_getAccountEthAddress(_address)) * NUISANCE_GAS_PER_CONTRACT_BYTE) + MIN_NUISANCE_GAS_PER_CONTRACT\\n );\\n }\\n }\\n\\n /**\\n * Validation whenever a slot needs to be loaded. Checks that the account exists, charges\\n * nuisance gas if the slot hasn't been loaded before.\\n * @param _contract Address of the account to load from.\\n * @param _key 32 byte key to load.\\n */\\n function _checkContractStorageLoad(\\n address _contract,\\n bytes32 _key\\n )\\n internal\\n {\\n // Another case of hidden complexity. If we didn't enforce this requirement, then a\\n // contract could pass in just enough gas to cause the INVALID_STATE_ACCESS check to fail\\n // on L1 but not on L2. A contract could use this behavior to prevent the\\n // OVM_ExecutionManager from detecting an invalid state access. Reverting with OUT_OF_GAS\\n // allows us to also charge for the full message nuisance gas, because you deserve that for\\n // trying to break the contract in this way.\\n if (gasleft() < MIN_GAS_FOR_INVALID_STATE_ACCESS) {\\n _revertWithFlag(RevertFlag.OUT_OF_GAS);\\n }\\n\\n // We need to make sure that the transaction isn't trying to access storage that hasn't\\n // been provided to the OVM_StateManager. We'll immediately abort if this is the case.\\n // We know that we have enough gas to do this check because of the above test.\\n if (ovmStateManager.hasContractStorage(_contract, _key) == false) {\\n _revertWithFlag(RevertFlag.INVALID_STATE_ACCESS);\\n }\\n\\n // Check whether the slot has been loaded before and mark it as loaded if not. We need\\n // this because \\\"nuisance gas\\\" only applies to the first time that a slot is loaded.\\n (\\n bool _wasContractStorageAlreadyLoaded\\n ) = ovmStateManager.testAndSetContractStorageLoaded(_contract, _key);\\n\\n // If we hadn't already loaded the account, then we'll need to charge some fixed amount of\\n // \\\"nuisance gas\\\".\\n if (_wasContractStorageAlreadyLoaded == false) {\\n _useNuisanceGas(NUISANCE_GAS_SLOAD);\\n }\\n }\\n\\n /**\\n * Validation whenever a slot needs to be changed. Checks that the account exists, charges\\n * nuisance gas if the slot hasn't been changed before.\\n * @param _contract Address of the account to change.\\n * @param _key 32 byte key to change.\\n */\\n function _checkContractStorageChange(\\n address _contract,\\n bytes32 _key\\n )\\n internal\\n {\\n // Start by checking for load to make sure we have the storage slot and that we charge the\\n // \\\"nuisance gas\\\" necessary to prove the storage slot state.\\n _checkContractStorageLoad(_contract, _key);\\n\\n // Check whether the slot has been changed before and mark it as changed if not. We need\\n // this because \\\"nuisance gas\\\" only applies to the first time that a slot is changed.\\n (\\n bool _wasContractStorageAlreadyChanged\\n ) = ovmStateManager.testAndSetContractStorageChanged(_contract, _key);\\n\\n // If we hadn't already changed the account, then we'll need to charge some fixed amount of\\n // \\\"nuisance gas\\\".\\n if (_wasContractStorageAlreadyChanged == false) {\\n // Changing a storage slot means that we're also going to have to change the\\n // corresponding account, so do an account change check.\\n _checkAccountChange(_contract);\\n\\n ovmStateManager.incrementTotalUncommittedContractStorage();\\n _useNuisanceGas(NUISANCE_GAS_SSTORE);\\n }\\n }\\n\\n\\n /************************************\\n * Internal Functions: Revert Logic *\\n ************************************/\\n\\n /**\\n * Simple encoding for revert data.\\n * @param _flag Flag to revert with.\\n * @param _data Additional user-provided revert data.\\n * @return _revertdata Encoded revert data.\\n */\\n function _encodeRevertData(\\n RevertFlag _flag,\\n bytes memory _data\\n )\\n internal\\n view\\n returns (\\n bytes memory _revertdata\\n )\\n {\\n // Out of gas and create exceptions will fundamentally return no data, so simulating it shouldn't either.\\n if (\\n _flag == RevertFlag.OUT_OF_GAS\\n ) {\\n return bytes('');\\n }\\n\\n // INVALID_STATE_ACCESS doesn't need to return any data other than the flag.\\n if (_flag == RevertFlag.INVALID_STATE_ACCESS) {\\n return abi.encode(\\n _flag,\\n 0,\\n 0,\\n bytes('')\\n );\\n }\\n\\n // Just ABI encode the rest of the parameters.\\n return abi.encode(\\n _flag,\\n messageRecord.nuisanceGasLeft,\\n transactionRecord.ovmGasRefund,\\n _data\\n );\\n }\\n\\n /**\\n * Simple decoding for revert data.\\n * @param _revertdata Revert data to decode.\\n * @return _flag Flag used to revert.\\n * @return _nuisanceGasLeft Amount of nuisance gas unused by the message.\\n * @return _ovmGasRefund Amount of gas refunded during the message.\\n * @return _data Additional user-provided revert data.\\n */\\n function _decodeRevertData(\\n bytes memory _revertdata\\n )\\n internal\\n pure\\n returns (\\n RevertFlag _flag,\\n uint256 _nuisanceGasLeft,\\n uint256 _ovmGasRefund,\\n bytes memory _data\\n )\\n {\\n // A length of zero means the call ran out of gas, just return empty data.\\n if (_revertdata.length == 0) {\\n return (\\n RevertFlag.OUT_OF_GAS,\\n 0,\\n 0,\\n bytes('')\\n );\\n }\\n\\n // ABI decode the incoming data.\\n return abi.decode(_revertdata, (RevertFlag, uint256, uint256, bytes));\\n }\\n\\n /**\\n * Causes a message to revert or abort.\\n * @param _flag Flag to revert with.\\n * @param _data Additional user-provided data.\\n */\\n function _revertWithFlag(\\n RevertFlag _flag,\\n bytes memory _data\\n )\\n internal\\n view\\n {\\n bytes memory revertdata = _encodeRevertData(\\n _flag,\\n _data\\n );\\n\\n assembly {\\n revert(add(revertdata, 0x20), mload(revertdata))\\n }\\n }\\n\\n /**\\n * Causes a message to revert or abort.\\n * @param _flag Flag to revert with.\\n */\\n function _revertWithFlag(\\n RevertFlag _flag\\n )\\n internal\\n {\\n _revertWithFlag(_flag, bytes(''));\\n }\\n\\n\\n /******************************************\\n * Internal Functions: Nuisance Gas Logic *\\n ******************************************/\\n\\n /**\\n * Computes the nuisance gas limit from the gas limit.\\n * @dev This function is currently using a naive implementation whereby the nuisance gas limit\\n * is set to exactly equal the lesser of the gas limit or remaining gas. It's likely that\\n * this implementation is perfectly fine, but we may change this formula later.\\n * @param _gasLimit Gas limit to compute from.\\n * @return _nuisanceGasLimit Computed nuisance gas limit.\\n */\\n function _getNuisanceGasLimit(\\n uint256 _gasLimit\\n )\\n internal\\n view\\n returns (\\n uint256 _nuisanceGasLimit\\n )\\n {\\n return _gasLimit < gasleft() ? _gasLimit : gasleft();\\n }\\n\\n /**\\n * Uses a certain amount of nuisance gas.\\n * @param _amount Amount of nuisance gas to use.\\n */\\n function _useNuisanceGas(\\n uint256 _amount\\n )\\n internal\\n {\\n // Essentially the same as a standard OUT_OF_GAS, except we also retain a record of the gas\\n // refund to be given at the end of the transaction.\\n if (messageRecord.nuisanceGasLeft < _amount) {\\n _revertWithFlag(RevertFlag.EXCEEDS_NUISANCE_GAS);\\n }\\n\\n messageRecord.nuisanceGasLeft -= _amount;\\n }\\n\\n\\n /************************************\\n * Internal Functions: Gas Metering *\\n ************************************/\\n\\n /**\\n * Checks whether a transaction needs to start a new epoch and does so if necessary.\\n * @param _timestamp Transaction timestamp.\\n */\\n function _checkNeedsNewEpoch(\\n uint256 _timestamp\\n )\\n internal\\n {\\n if (\\n _timestamp >= (\\n _getGasMetadata(GasMetadataKey.CURRENT_EPOCH_START_TIMESTAMP)\\n + gasMeterConfig.secondsPerEpoch\\n )\\n ) {\\n _putGasMetadata(\\n GasMetadataKey.CURRENT_EPOCH_START_TIMESTAMP,\\n _timestamp\\n );\\n\\n _putGasMetadata(\\n GasMetadataKey.PREV_EPOCH_SEQUENCER_QUEUE_GAS,\\n _getGasMetadata(\\n GasMetadataKey.CUMULATIVE_SEQUENCER_QUEUE_GAS\\n )\\n );\\n\\n _putGasMetadata(\\n GasMetadataKey.PREV_EPOCH_L1TOL2_QUEUE_GAS,\\n _getGasMetadata(\\n GasMetadataKey.CUMULATIVE_L1TOL2_QUEUE_GAS\\n )\\n );\\n }\\n }\\n\\n /**\\n * Validates the input values of a transaction.\\n * @return _valid Whether or not the transaction data is valid.\\n */\\n function _isValidInput(\\n Lib_OVMCodec.Transaction memory _transaction\\n )\\n view\\n internal\\n returns (\\n bool\\n )\\n {\\n // Prevent reentrancy to run():\\n // This check prevents calling run with the default ovmNumber.\\n // Combined with the first check in run():\\n // if (transactionContext.ovmNUMBER != DEFAULT_UINT256) { return; }\\n // It should be impossible to re-enter since run() returns before any other call frames are created.\\n // Since this value is already being written to storage, we save much gas compared to\\n // using the standard nonReentrant pattern.\\n if (_transaction.blockNumber == DEFAULT_UINT256) {\\n return false;\\n }\\n\\n if (_isValidGasLimit(_transaction.gasLimit, _transaction.l1QueueOrigin) == false) {\\n return false;\\n }\\n\\n return true;\\n }\\n\\n /**\\n * Validates the gas limit for a given transaction.\\n * @param _gasLimit Gas limit provided by the transaction.\\n * param _queueOrigin Queue from which the transaction originated.\\n * @return _valid Whether or not the gas limit is valid.\\n */\\n function _isValidGasLimit(\\n uint256 _gasLimit,\\n Lib_OVMCodec.QueueOrigin // _queueOrigin\\n )\\n view\\n internal\\n returns (\\n bool _valid\\n )\\n {\\n // Always have to be below the maximum gas limit.\\n if (_gasLimit > gasMeterConfig.maxTransactionGasLimit) {\\n return false;\\n }\\n\\n // Always have to be above the minimum gas limit.\\n if (_gasLimit < gasMeterConfig.minTransactionGasLimit) {\\n return false;\\n }\\n\\n // TEMPORARY: Gas metering is disabled for minnet.\\n return true;\\n // GasMetadataKey cumulativeGasKey;\\n // GasMetadataKey prevEpochGasKey;\\n // if (_queueOrigin == Lib_OVMCodec.QueueOrigin.SEQUENCER_QUEUE) {\\n // cumulativeGasKey = GasMetadataKey.CUMULATIVE_SEQUENCER_QUEUE_GAS;\\n // prevEpochGasKey = GasMetadataKey.PREV_EPOCH_SEQUENCER_QUEUE_GAS;\\n // } else {\\n // cumulativeGasKey = GasMetadataKey.CUMULATIVE_L1TOL2_QUEUE_GAS;\\n // prevEpochGasKey = GasMetadataKey.PREV_EPOCH_L1TOL2_QUEUE_GAS;\\n // }\\n\\n // return (\\n // (\\n // _getGasMetadata(cumulativeGasKey)\\n // - _getGasMetadata(prevEpochGasKey)\\n // + _gasLimit\\n // ) < gasMeterConfig.maxGasPerQueuePerEpoch\\n // );\\n }\\n\\n /**\\n * Updates the cumulative gas after a transaction.\\n * @param _gasUsed Gas used by the transaction.\\n * @param _queueOrigin Queue from which the transaction originated.\\n */\\n function _updateCumulativeGas(\\n uint256 _gasUsed,\\n Lib_OVMCodec.QueueOrigin _queueOrigin\\n )\\n internal\\n {\\n GasMetadataKey cumulativeGasKey;\\n if (_queueOrigin == Lib_OVMCodec.QueueOrigin.SEQUENCER_QUEUE) {\\n cumulativeGasKey = GasMetadataKey.CUMULATIVE_SEQUENCER_QUEUE_GAS;\\n } else {\\n cumulativeGasKey = GasMetadataKey.CUMULATIVE_L1TOL2_QUEUE_GAS;\\n }\\n\\n _putGasMetadata(\\n cumulativeGasKey,\\n (\\n _getGasMetadata(cumulativeGasKey)\\n + gasMeterConfig.minTransactionGasLimit\\n + _gasUsed\\n - transactionRecord.ovmGasRefund\\n )\\n );\\n }\\n\\n /**\\n * Retrieves the value of a gas metadata key.\\n * @param _key Gas metadata key to retrieve.\\n * @return _value Value stored at the given key.\\n */\\n function _getGasMetadata(\\n GasMetadataKey _key\\n )\\n internal\\n returns (\\n uint256 _value\\n )\\n {\\n return uint256(_getContractStorage(\\n GAS_METADATA_ADDRESS,\\n bytes32(uint256(_key))\\n ));\\n }\\n\\n /**\\n * Sets the value of a gas metadata key.\\n * @param _key Gas metadata key to set.\\n * @param _value Value to store at the given key.\\n */\\n function _putGasMetadata(\\n GasMetadataKey _key,\\n uint256 _value\\n )\\n internal\\n {\\n _putContractStorage(\\n GAS_METADATA_ADDRESS,\\n bytes32(uint256(_key)),\\n bytes32(uint256(_value))\\n );\\n }\\n\\n\\n /*****************************************\\n * Internal Functions: Execution Context *\\n *****************************************/\\n\\n /**\\n * Swaps over to a new message context.\\n * @param _prevMessageContext Context we're switching from.\\n * @param _nextMessageContext Context we're switching to.\\n */\\n function _switchMessageContext(\\n MessageContext memory _prevMessageContext,\\n MessageContext memory _nextMessageContext\\n )\\n internal\\n {\\n // Avoid unnecessary the SSTORE.\\n if (_prevMessageContext.ovmCALLER != _nextMessageContext.ovmCALLER) {\\n messageContext.ovmCALLER = _nextMessageContext.ovmCALLER;\\n }\\n\\n // Avoid unnecessary the SSTORE.\\n if (_prevMessageContext.ovmADDRESS != _nextMessageContext.ovmADDRESS) {\\n messageContext.ovmADDRESS = _nextMessageContext.ovmADDRESS;\\n }\\n\\n // Avoid unnecessary the SSTORE.\\n if (_prevMessageContext.isStatic != _nextMessageContext.isStatic) {\\n messageContext.isStatic = _nextMessageContext.isStatic;\\n }\\n }\\n\\n /**\\n * Initializes the execution context.\\n * @param _transaction OVM transaction being executed.\\n */\\n function _initContext(\\n Lib_OVMCodec.Transaction memory _transaction\\n )\\n internal\\n {\\n transactionContext.ovmTIMESTAMP = _transaction.timestamp;\\n transactionContext.ovmNUMBER = _transaction.blockNumber;\\n transactionContext.ovmTXGASLIMIT = _transaction.gasLimit;\\n transactionContext.ovmL1QUEUEORIGIN = _transaction.l1QueueOrigin;\\n transactionContext.ovmL1TXORIGIN = _transaction.l1TxOrigin;\\n transactionContext.ovmGASLIMIT = gasMeterConfig.maxGasPerQueuePerEpoch;\\n\\n messageRecord.nuisanceGasLeft = _getNuisanceGasLimit(_transaction.gasLimit);\\n }\\n\\n /**\\n * Resets the transaction and message context.\\n */\\n function _resetContext()\\n internal\\n {\\n transactionContext.ovmL1TXORIGIN = DEFAULT_ADDRESS;\\n transactionContext.ovmTIMESTAMP = DEFAULT_UINT256;\\n transactionContext.ovmNUMBER = DEFAULT_UINT256;\\n transactionContext.ovmGASLIMIT = DEFAULT_UINT256;\\n transactionContext.ovmTXGASLIMIT = DEFAULT_UINT256;\\n transactionContext.ovmL1QUEUEORIGIN = Lib_OVMCodec.QueueOrigin.SEQUENCER_QUEUE;\\n\\n transactionRecord.ovmGasRefund = DEFAULT_UINT256;\\n\\n messageContext.ovmCALLER = DEFAULT_ADDRESS;\\n messageContext.ovmADDRESS = DEFAULT_ADDRESS;\\n messageContext.isStatic = false;\\n\\n messageRecord.nuisanceGasLeft = DEFAULT_UINT256;\\n\\n // Reset the ovmStateManager.\\n ovmStateManager = iOVM_StateManager(address(0));\\n }\\n\\n /*****************************\\n * L2-only Helper Functions *\\n *****************************/\\n\\n /**\\n * Unreachable helper function for simulating eth_calls with an OVM message context.\\n * This function will throw an exception in all cases other than when used as a custom entrypoint in L2 Geth to simulate eth_call.\\n * @param _transaction the message transaction to simulate.\\n * @param _from the OVM account the simulated call should be from.\\n */\\n function simulateMessage(\\n Lib_OVMCodec.Transaction memory _transaction,\\n address _from,\\n iOVM_StateManager _ovmStateManager\\n )\\n external\\n returns (\\n bool,\\n bytes memory\\n )\\n {\\n // Prevent this call from having any effect unless in a custom-set VM frame\\n require(msg.sender == address(0));\\n\\n ovmStateManager = _ovmStateManager;\\n _initContext(_transaction);\\n messageRecord.nuisanceGasLeft = uint(-1);\\n\\n messageContext.ovmADDRESS = _from;\\n\\n bool isCreate = _transaction.entrypoint == address(0);\\n if (isCreate) {\\n (address created, bytes memory revertData) = ovmCREATE(_transaction.data);\\n if (created == address(0)) {\\n return (false, revertData);\\n } else {\\n // The eth_call RPC endpoint for to = undefined will return the deployed bytecode\\n // in the success case, differing from standard create messages.\\n return (true, Lib_EthUtils.getCode(created));\\n }\\n } else {\\n return ovmCALL(\\n _transaction.gasLimit,\\n _transaction.entrypoint,\\n _transaction.data\\n );\\n }\\n }\\n}\\n\",\"keccak256\":\"0x3178e4fa03d69704dd45de49b4282b2ce36500f50c8b3286c6b8fe15bc5009ad\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/predeploys/OVM_DeployerWhitelist.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_Bytes32Utils } from \\\"../../libraries/utils/Lib_Bytes32Utils.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_DeployerWhitelist } from \\\"../../iOVM/predeploys/iOVM_DeployerWhitelist.sol\\\";\\nimport { Lib_SafeExecutionManagerWrapper } from \\\"../../libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\\\";\\n\\n/**\\n * @title OVM_DeployerWhitelist\\n * @dev The Deployer Whitelist is a temporary predeploy used to provide additional safety during the\\n * initial phases of our mainnet roll out. It is owned by the Optimism team, and defines accounts\\n * which are allowed to deploy contracts on Layer2. The Execution Manager will only allow an \\n * ovmCREATE or ovmCREATE2 operation to proceed if the deployer's address whitelisted.\\n * \\n * Compiler used: solc\\n * Runtime target: OVM\\n */\\ncontract OVM_DeployerWhitelist is iOVM_DeployerWhitelist {\\n\\n /**********************\\n * Contract Constants *\\n **********************/\\n\\n bytes32 internal constant KEY_INITIALIZED = 0x0000000000000000000000000000000000000000000000000000000000000010;\\n bytes32 internal constant KEY_OWNER = 0x0000000000000000000000000000000000000000000000000000000000000011;\\n bytes32 internal constant KEY_ALLOW_ARBITRARY_DEPLOYMENT = 0x0000000000000000000000000000000000000000000000000000000000000012;\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n \\n /**\\n * Blocks functions to anyone except the contract owner.\\n */\\n modifier onlyOwner() {\\n address owner = Lib_Bytes32Utils.toAddress(\\n Lib_SafeExecutionManagerWrapper.safeSLOAD(\\n KEY_OWNER\\n )\\n );\\n\\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(\\n Lib_SafeExecutionManagerWrapper.safeCALLER() == owner,\\n \\\"Function can only be called by the owner of this contract.\\\"\\n );\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n \\n /**\\n * Initializes the whitelist.\\n * @param _owner Address of the owner for this contract.\\n * @param _allowArbitraryDeployment Whether or not to allow arbitrary contract deployment.\\n */\\n function initialize(\\n address _owner,\\n bool _allowArbitraryDeployment\\n )\\n override\\n public\\n {\\n bool initialized = Lib_Bytes32Utils.toBool(\\n Lib_SafeExecutionManagerWrapper.safeSLOAD(KEY_INITIALIZED)\\n );\\n\\n if (initialized == true) {\\n return;\\n }\\n\\n Lib_SafeExecutionManagerWrapper.safeSSTORE(\\n KEY_INITIALIZED,\\n Lib_Bytes32Utils.fromBool(true)\\n );\\n Lib_SafeExecutionManagerWrapper.safeSSTORE(\\n KEY_OWNER,\\n Lib_Bytes32Utils.fromAddress(_owner)\\n );\\n Lib_SafeExecutionManagerWrapper.safeSSTORE(\\n KEY_ALLOW_ARBITRARY_DEPLOYMENT,\\n Lib_Bytes32Utils.fromBool(_allowArbitraryDeployment)\\n );\\n }\\n\\n /**\\n * Gets the owner of the whitelist.\\n */\\n function getOwner()\\n override\\n public\\n returns(\\n address\\n )\\n {\\n return Lib_Bytes32Utils.toAddress(\\n Lib_SafeExecutionManagerWrapper.safeSLOAD(\\n KEY_OWNER\\n )\\n );\\n }\\n\\n /**\\n * Adds or removes an address from the deployment whitelist.\\n * @param _deployer Address to update permissions for.\\n * @param _isWhitelisted Whether or not the address is whitelisted.\\n */\\n function setWhitelistedDeployer(\\n address _deployer,\\n bool _isWhitelisted\\n )\\n override\\n public\\n onlyOwner\\n {\\n Lib_SafeExecutionManagerWrapper.safeSSTORE(\\n Lib_Bytes32Utils.fromAddress(_deployer),\\n Lib_Bytes32Utils.fromBool(_isWhitelisted)\\n );\\n }\\n\\n /**\\n * Updates the owner of this contract.\\n * @param _owner Address of the new owner.\\n */\\n function setOwner(\\n address _owner\\n )\\n override\\n public\\n onlyOwner\\n {\\n Lib_SafeExecutionManagerWrapper.safeSSTORE(\\n KEY_OWNER,\\n Lib_Bytes32Utils.fromAddress(_owner)\\n );\\n }\\n\\n /**\\n * Updates the arbitrary deployment flag.\\n * @param _allowArbitraryDeployment Whether or not to allow arbitrary contract deployment.\\n */\\n function setAllowArbitraryDeployment(\\n bool _allowArbitraryDeployment\\n )\\n override\\n public\\n onlyOwner\\n {\\n Lib_SafeExecutionManagerWrapper.safeSSTORE(\\n KEY_ALLOW_ARBITRARY_DEPLOYMENT,\\n Lib_Bytes32Utils.fromBool(_allowArbitraryDeployment)\\n );\\n }\\n\\n /**\\n * Permanently enables arbitrary contract deployment and deletes the owner.\\n */\\n function enableArbitraryContractDeployment()\\n override\\n public\\n onlyOwner\\n {\\n setAllowArbitraryDeployment(true);\\n setOwner(address(0));\\n }\\n\\n /**\\n * Checks whether an address is allowed to deploy contracts.\\n * @param _deployer Address to check.\\n * @return _allowed Whether or not the address can deploy contracts.\\n */\\n function isDeployerAllowed(\\n address _deployer\\n )\\n override\\n public\\n returns (\\n bool _allowed\\n )\\n {\\n bool initialized = Lib_Bytes32Utils.toBool(\\n Lib_SafeExecutionManagerWrapper.safeSLOAD(KEY_INITIALIZED)\\n );\\n\\n if (initialized == false) {\\n return true;\\n }\\n\\n bool allowArbitraryDeployment = Lib_Bytes32Utils.toBool(\\n Lib_SafeExecutionManagerWrapper.safeSLOAD(KEY_ALLOW_ARBITRARY_DEPLOYMENT)\\n );\\n\\n if (allowArbitraryDeployment == true) {\\n return true;\\n }\\n\\n bool isWhitelisted = Lib_Bytes32Utils.toBool(\\n Lib_SafeExecutionManagerWrapper.safeSLOAD(\\n Lib_Bytes32Utils.fromAddress(_deployer)\\n )\\n );\\n\\n return isWhitelisted; \\n }\\n}\\n\",\"keccak256\":\"0xe746e2a3f649d3d9760db8a0b6dccee5cdb267c9615268181285846277307084\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/accounts/iOVM_ECDSAContractAccount.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title iOVM_ECDSAContractAccount\\n */\\ninterface iOVM_ECDSAContractAccount {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function execute(\\n bytes memory _transaction,\\n Lib_OVMCodec.EOASignatureType _signatureType,\\n uint8 _v,\\n bytes32 _r,\\n bytes32 _s\\n ) external returns (bool _success, bytes memory _returndata);\\n}\\n\",\"keccak256\":\"0x308729bc62dcffb11ff1d840781105cf1bf0dd4cbcfb1af704b800bb0cfe9b85\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_CanonicalTransactionChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_ChainStorageContainer } from \\\"./iOVM_ChainStorageContainer.sol\\\";\\n\\n/**\\n * @title iOVM_CanonicalTransactionChain\\n */\\ninterface iOVM_CanonicalTransactionChain {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event TransactionEnqueued(\\n address _l1TxOrigin,\\n address _target,\\n uint256 _gasLimit,\\n bytes _data,\\n uint256 _queueIndex,\\n uint256 _timestamp\\n );\\n\\n event QueueBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event SequencerBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event TransactionBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct BatchContext {\\n uint256 numSequencedTransactions;\\n uint256 numSubsequentQueueTransactions;\\n uint256 timestamp;\\n uint256 blockNumber;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n\\n /**\\n * Accesses the batch storage container.\\n * @return Reference to the batch storage container.\\n */\\n function batches()\\n external\\n view\\n returns (\\n iOVM_ChainStorageContainer\\n );\\n\\n /**\\n * Accesses the queue storage container.\\n * @return Reference to the queue storage container.\\n */\\n function queue()\\n external\\n view\\n returns (\\n iOVM_ChainStorageContainer\\n );\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements()\\n external\\n view\\n returns (\\n uint256 _totalElements\\n );\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches()\\n external\\n view\\n returns (\\n uint256 _totalBatches\\n );\\n\\n /**\\n * Returns the index of the next element to be enqueued.\\n * @return Index for the next queue element.\\n */\\n function getNextQueueIndex()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Gets the queue element at a particular index.\\n * @param _index Index of the queue element to access.\\n * @return _element Queue element at the given index.\\n */\\n function getQueueElement(\\n uint256 _index\\n )\\n external\\n view\\n returns (\\n Lib_OVMCodec.QueueElement memory _element\\n );\\n\\n /**\\n * Returns the timestamp of the last transaction.\\n * @return Timestamp for the last transaction.\\n */\\n function getLastTimestamp()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Returns the blocknumber of the last transaction.\\n * @return Blocknumber for the last transaction.\\n */\\n function getLastBlockNumber()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Get the number of queue elements which have not yet been included.\\n * @return Number of pending queue elements.\\n */\\n function getNumPendingQueueElements()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Retrieves the length of the queue, including\\n * both pending and canonical transactions.\\n * @return Length of the queue.\\n */\\n function getQueueLength()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n\\n /**\\n * Adds a transaction to the queue.\\n * @param _target Target contract to send the transaction to.\\n * @param _gasLimit Gas limit for the given transaction.\\n * @param _data Transaction data.\\n */\\n function enqueue(\\n address _target,\\n uint256 _gasLimit,\\n bytes memory _data\\n )\\n external;\\n\\n /**\\n * Appends a given number of queued transactions as a single batch.\\n * @param _numQueuedTransactions Number of transactions to append.\\n */\\n function appendQueueBatch(\\n uint256 _numQueuedTransactions\\n )\\n external;\\n\\n /**\\n * Allows the sequencer to append a batch of transactions.\\n * @dev This function uses a custom encoding scheme for efficiency reasons.\\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\\n * .param _contexts Array of batch contexts.\\n * .param _transactionDataFields Array of raw transaction data.\\n */\\n function appendSequencerBatch(\\n // uint40 _shouldStartAtElement,\\n // uint24 _totalElementsToAppend,\\n // BatchContext[] _contexts,\\n // bytes[] _transactionDataFields\\n )\\n external;\\n\\n /**\\n * Verifies whether a transaction is included in the chain.\\n * @param _transaction Transaction to verify.\\n * @param _txChainElement Transaction chain element corresponding to the transaction.\\n * @param _batchHeader Header of the batch the transaction was included in.\\n * @param _inclusionProof Inclusion proof for the provided transaction chain element.\\n * @return True if the transaction exists in the CTC, false if not.\\n */\\n function verifyTransaction(\\n Lib_OVMCodec.Transaction memory _transaction,\\n Lib_OVMCodec.TransactionChainElement memory _txChainElement,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _inclusionProof\\n )\\n external\\n view\\n returns (\\n bool\\n );\\n}\\n\",\"keccak256\":\"0xb5e55488a1982841c07cdf5ff475da4789596f111dd48f01b1918ee4c775cf3a\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_ChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title iOVM_ChainStorageContainer\\n */\\ninterface iOVM_ChainStorageContainer {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata()\\n external\\n view\\n returns (\\n bytes27\\n );\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length()\\n external\\n view\\n returns (\\n uint256\\n );\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(\\n bytes32 _object\\n )\\n external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(\\n bytes32 _object,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(\\n uint256 _index\\n )\\n external\\n view\\n returns (\\n bytes32\\n );\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index\\n )\\n external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Marks an index as overwritable, meaing the underlying buffer can start to write values over\\n * any objects before and including the given index.\\n */\\n function setNextOverwritableIndex(\\n uint256 _index\\n )\\n external;\\n}\\n\",\"keccak256\":\"0x2d7973a0ad84c23ec62624d3f1e3aeb198cc72686ff1e6cfa17155556b320c94\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/execution/iOVM_ExecutionManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\ninterface iOVM_ExecutionManager {\\n /**********\\n * Enums *\\n *********/\\n\\n enum RevertFlag {\\n OUT_OF_GAS,\\n INTENTIONAL_REVERT,\\n EXCEEDS_NUISANCE_GAS,\\n INVALID_STATE_ACCESS,\\n UNSAFE_BYTECODE,\\n CREATE_COLLISION,\\n STATIC_VIOLATION,\\n CREATOR_NOT_ALLOWED\\n }\\n\\n enum GasMetadataKey {\\n CURRENT_EPOCH_START_TIMESTAMP,\\n CUMULATIVE_SEQUENCER_QUEUE_GAS,\\n CUMULATIVE_L1TOL2_QUEUE_GAS,\\n PREV_EPOCH_SEQUENCER_QUEUE_GAS,\\n PREV_EPOCH_L1TOL2_QUEUE_GAS\\n }\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct GasMeterConfig {\\n uint256 minTransactionGasLimit;\\n uint256 maxTransactionGasLimit;\\n uint256 maxGasPerQueuePerEpoch;\\n uint256 secondsPerEpoch;\\n }\\n\\n struct GlobalContext {\\n uint256 ovmCHAINID;\\n }\\n\\n struct TransactionContext {\\n Lib_OVMCodec.QueueOrigin ovmL1QUEUEORIGIN;\\n uint256 ovmTIMESTAMP;\\n uint256 ovmNUMBER;\\n uint256 ovmGASLIMIT;\\n uint256 ovmTXGASLIMIT;\\n address ovmL1TXORIGIN;\\n }\\n\\n struct TransactionRecord {\\n uint256 ovmGasRefund;\\n }\\n\\n struct MessageContext {\\n address ovmCALLER;\\n address ovmADDRESS;\\n bool isStatic;\\n }\\n\\n struct MessageRecord {\\n uint256 nuisanceGasLeft;\\n }\\n\\n\\n /************************************\\n * Transaction Execution Entrypoint *\\n ************************************/\\n\\n function run(\\n Lib_OVMCodec.Transaction calldata _transaction,\\n address _txStateManager\\n ) external;\\n\\n\\n /*******************\\n * Context Opcodes *\\n *******************/\\n\\n function ovmCALLER() external view returns (address _caller);\\n function ovmADDRESS() external view returns (address _address);\\n function ovmTIMESTAMP() external view returns (uint256 _timestamp);\\n function ovmNUMBER() external view returns (uint256 _number);\\n function ovmGASLIMIT() external view returns (uint256 _gasLimit);\\n function ovmCHAINID() external view returns (uint256 _chainId);\\n\\n\\n /**********************\\n * L2 Context Opcodes *\\n **********************/\\n\\n function ovmL1QUEUEORIGIN() external view returns (Lib_OVMCodec.QueueOrigin _queueOrigin);\\n function ovmL1TXORIGIN() external view returns (address _l1TxOrigin);\\n\\n\\n /*******************\\n * Halting Opcodes *\\n *******************/\\n\\n function ovmREVERT(bytes memory _data) external;\\n\\n\\n /*****************************\\n * Contract Creation Opcodes *\\n *****************************/\\n\\n function ovmCREATE(bytes memory _bytecode) external returns (address _contract, bytes memory _revertdata);\\n function ovmCREATE2(bytes memory _bytecode, bytes32 _salt) external returns (address _contract, bytes memory _revertdata);\\n\\n\\n /*******************************\\n * Account Abstraction Opcodes *\\n ******************************/\\n\\n function ovmGETNONCE() external returns (uint256 _nonce);\\n function ovmINCREMENTNONCE() external;\\n function ovmCREATEEOA(bytes32 _messageHash, uint8 _v, bytes32 _r, bytes32 _s) external;\\n\\n\\n /****************************\\n * Contract Calling Opcodes *\\n ****************************/\\n\\n function ovmCALL(uint256 _gasLimit, address _address, bytes memory _calldata) external returns (bool _success, bytes memory _returndata);\\n function ovmSTATICCALL(uint256 _gasLimit, address _address, bytes memory _calldata) external returns (bool _success, bytes memory _returndata);\\n function ovmDELEGATECALL(uint256 _gasLimit, address _address, bytes memory _calldata) external returns (bool _success, bytes memory _returndata);\\n\\n\\n /****************************\\n * Contract Storage Opcodes *\\n ****************************/\\n\\n function ovmSLOAD(bytes32 _key) external returns (bytes32 _value);\\n function ovmSSTORE(bytes32 _key, bytes32 _value) external;\\n\\n\\n /*************************\\n * Contract Code Opcodes *\\n *************************/\\n\\n function ovmEXTCODECOPY(address _contract, uint256 _offset, uint256 _length) external returns (bytes memory _code);\\n function ovmEXTCODESIZE(address _contract) external returns (uint256 _size);\\n function ovmEXTCODEHASH(address _contract) external returns (bytes32 _hash);\\n\\n\\n /***************************************\\n * Public Functions: Execution Context *\\n ***************************************/\\n\\n function getMaxTransactionGasLimit() external view returns (uint _maxTransactionGasLimit);\\n}\\n\",\"keccak256\":\"0xa613e2f578d56aa80f0916df538b487f8213a18933e78fdecb9efeedae02cf9c\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/execution/iOVM_SafetyChecker.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title iOVM_SafetyChecker\\n */\\ninterface iOVM_SafetyChecker {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function isBytecodeSafe(bytes calldata _bytecode) external pure returns (bool);\\n}\\n\",\"keccak256\":\"0xde6639676d4ec4f77297652d5ede2429bc93e74e11fefd9e9de4bc92dd784878\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/execution/iOVM_StateManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title iOVM_StateManager\\n */\\ninterface iOVM_StateManager {\\n\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n enum ItemState {\\n ITEM_UNTOUCHED,\\n ITEM_LOADED,\\n ITEM_CHANGED,\\n ITEM_COMMITTED\\n }\\n\\n /***************************\\n * Public Functions: Misc *\\n ***************************/\\n\\n function isAuthenticated(address _address) external view returns (bool);\\n\\n /***************************\\n * Public Functions: Setup *\\n ***************************/\\n\\n function owner() external view returns (address _owner);\\n function ovmExecutionManager() external view returns (address _ovmExecutionManager);\\n function setExecutionManager(address _ovmExecutionManager) external;\\n\\n\\n /************************************\\n * Public Functions: Account Access *\\n ************************************/\\n\\n function putAccount(address _address, Lib_OVMCodec.Account memory _account) external;\\n function putEmptyAccount(address _address) external;\\n function getAccount(address _address) external view returns (Lib_OVMCodec.Account memory _account);\\n function hasAccount(address _address) external view returns (bool _exists);\\n function hasEmptyAccount(address _address) external view returns (bool _exists);\\n function setAccountNonce(address _address, uint256 _nonce) external;\\n function getAccountNonce(address _address) external view returns (uint256 _nonce);\\n function getAccountEthAddress(address _address) external view returns (address _ethAddress);\\n function getAccountStorageRoot(address _address) external view returns (bytes32 _storageRoot);\\n function initPendingAccount(address _address) external;\\n function commitPendingAccount(address _address, address _ethAddress, bytes32 _codeHash) external;\\n function testAndSetAccountLoaded(address _address) external returns (bool _wasAccountAlreadyLoaded);\\n function testAndSetAccountChanged(address _address) external returns (bool _wasAccountAlreadyChanged);\\n function commitAccount(address _address) external returns (bool _wasAccountCommitted);\\n function incrementTotalUncommittedAccounts() external;\\n function getTotalUncommittedAccounts() external view returns (uint256 _total);\\n function wasAccountChanged(address _address) external view returns (bool);\\n function wasAccountCommitted(address _address) external view returns (bool);\\n\\n\\n /************************************\\n * Public Functions: Storage Access *\\n ************************************/\\n\\n function putContractStorage(address _contract, bytes32 _key, bytes32 _value) external;\\n function getContractStorage(address _contract, bytes32 _key) external view returns (bytes32 _value);\\n function hasContractStorage(address _contract, bytes32 _key) external view returns (bool _exists);\\n function testAndSetContractStorageLoaded(address _contract, bytes32 _key) external returns (bool _wasContractStorageAlreadyLoaded);\\n function testAndSetContractStorageChanged(address _contract, bytes32 _key) external returns (bool _wasContractStorageAlreadyChanged);\\n function commitContractStorage(address _contract, bytes32 _key) external returns (bool _wasContractStorageCommitted);\\n function incrementTotalUncommittedContractStorage() external;\\n function getTotalUncommittedContractStorage() external view returns (uint256 _total);\\n function wasContractStorageChanged(address _contract, bytes32 _key) external view returns (bool);\\n function wasContractStorageCommitted(address _contract, bytes32 _key) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x7a11dbd1f61593ba34debe07e39eef59967307f7f372ba9855bee0953585d08d\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/predeploys/iOVM_DeployerWhitelist.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title iOVM_DeployerWhitelist\\n */\\ninterface iOVM_DeployerWhitelist {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function initialize(address _owner, bool _allowArbitraryDeployment) external;\\n function getOwner() external returns (address _owner);\\n function setWhitelistedDeployer(address _deployer, bool _isWhitelisted) external;\\n function setOwner(address _newOwner) external;\\n function setAllowArbitraryDeployment(bool _allowArbitraryDeployment) external;\\n function enableArbitraryContractDeployment() external;\\n function isDeployerAllowed(address _deployer) external returns (bool _allowed);\\n}\\n\",\"keccak256\":\"0x969394371cacfc36493230150b6d629173ea72dfdf729330bede475b91d0f004\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/codec/Lib_OVMCodec.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../utils/Lib_Bytes32Utils.sol\\\";\\nimport { Lib_SafeExecutionManagerWrapper } from \\\"../../libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\\\";\\n\\n/**\\n * @title Lib_OVMCodec\\n */\\nlibrary Lib_OVMCodec {\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum EOASignatureType {\\n EIP155_TRANSACTION,\\n ETH_SIGNED_MESSAGE\\n }\\n\\n enum QueueOrigin {\\n SEQUENCER_QUEUE,\\n L1TOL2_QUEUE\\n }\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Account {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n address ethAddress;\\n bool isFresh;\\n }\\n\\n struct EVMAccount {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n }\\n\\n struct ChainBatchHeader {\\n uint256 batchIndex;\\n bytes32 batchRoot;\\n uint256 batchSize;\\n uint256 prevTotalElements;\\n bytes extraData;\\n }\\n\\n struct ChainInclusionProof {\\n uint256 index;\\n bytes32[] siblings;\\n }\\n\\n struct Transaction {\\n uint256 timestamp;\\n uint256 blockNumber;\\n QueueOrigin l1QueueOrigin;\\n address l1TxOrigin;\\n address entrypoint;\\n uint256 gasLimit;\\n bytes data;\\n }\\n\\n struct TransactionChainElement {\\n bool isSequenced;\\n uint256 queueIndex; // QUEUED TX ONLY\\n uint256 timestamp; // SEQUENCER TX ONLY\\n uint256 blockNumber; // SEQUENCER TX ONLY\\n bytes txData; // SEQUENCER TX ONLY\\n }\\n\\n struct QueueElement {\\n bytes32 transactionHash;\\n uint40 timestamp;\\n uint40 blockNumber;\\n }\\n\\n struct EIP155Transaction {\\n uint256 nonce;\\n uint256 gasPrice;\\n uint256 gasLimit;\\n address to;\\n uint256 value;\\n bytes data;\\n uint256 chainId;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Decodes an EOA transaction (i.e., native Ethereum RLP encoding).\\n * @param _transaction Encoded EOA transaction.\\n * @return Transaction decoded into a struct.\\n */\\n function decodeEIP155Transaction(\\n bytes memory _transaction,\\n bool _isEthSignedMessage\\n )\\n internal\\n pure\\n returns (\\n EIP155Transaction memory\\n )\\n {\\n if (_isEthSignedMessage) {\\n (\\n uint256 _nonce,\\n uint256 _gasLimit,\\n uint256 _gasPrice,\\n uint256 _chainId,\\n address _to,\\n bytes memory _data\\n ) = abi.decode(\\n _transaction,\\n (uint256, uint256, uint256, uint256, address ,bytes)\\n );\\n return EIP155Transaction({\\n nonce: _nonce,\\n gasPrice: _gasPrice,\\n gasLimit: _gasLimit,\\n to: _to,\\n value: 0,\\n data: _data,\\n chainId: _chainId\\n });\\n } else {\\n Lib_RLPReader.RLPItem[] memory decoded = Lib_RLPReader.readList(_transaction);\\n\\n return EIP155Transaction({\\n nonce: Lib_RLPReader.readUint256(decoded[0]),\\n gasPrice: Lib_RLPReader.readUint256(decoded[1]),\\n gasLimit: Lib_RLPReader.readUint256(decoded[2]),\\n to: Lib_RLPReader.readAddress(decoded[3]),\\n value: Lib_RLPReader.readUint256(decoded[4]),\\n data: Lib_RLPReader.readBytes(decoded[5]),\\n chainId: Lib_RLPReader.readUint256(decoded[6])\\n });\\n }\\n }\\n\\n /**\\n * Decompresses a compressed EIP155 transaction.\\n * @param _transaction Compressed EIP155 transaction bytes.\\n * @return Transaction parsed into a struct.\\n */\\n function decompressEIP155Transaction(\\n bytes memory _transaction\\n )\\n internal\\n returns (\\n EIP155Transaction memory\\n )\\n {\\n return EIP155Transaction({\\n gasLimit: Lib_BytesUtils.toUint24(_transaction, 0),\\n gasPrice: uint256(Lib_BytesUtils.toUint24(_transaction, 3)) * 1000000,\\n nonce: Lib_BytesUtils.toUint24(_transaction, 6),\\n to: Lib_BytesUtils.toAddress(_transaction, 9),\\n data: Lib_BytesUtils.slice(_transaction, 29),\\n chainId: Lib_SafeExecutionManagerWrapper.safeCHAINID(),\\n value: 0\\n });\\n }\\n\\n /**\\n * Encodes an EOA transaction back into the original transaction.\\n * @param _transaction EIP155transaction to encode.\\n * @param _isEthSignedMessage Whether or not this was an eth signed message.\\n * @return Encoded transaction.\\n */\\n function encodeEIP155Transaction(\\n EIP155Transaction memory _transaction,\\n bool _isEthSignedMessage\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n if (_isEthSignedMessage) {\\n return abi.encode(\\n _transaction.nonce,\\n _transaction.gasLimit,\\n _transaction.gasPrice,\\n _transaction.chainId,\\n _transaction.to,\\n _transaction.data\\n );\\n } else {\\n bytes[] memory raw = new bytes[](9);\\n\\n raw[0] = Lib_RLPWriter.writeUint(_transaction.nonce);\\n raw[1] = Lib_RLPWriter.writeUint(_transaction.gasPrice);\\n raw[2] = Lib_RLPWriter.writeUint(_transaction.gasLimit);\\n if (_transaction.to == address(0)) {\\n raw[3] = Lib_RLPWriter.writeBytes('');\\n } else {\\n raw[3] = Lib_RLPWriter.writeAddress(_transaction.to);\\n }\\n raw[4] = Lib_RLPWriter.writeUint(0);\\n raw[5] = Lib_RLPWriter.writeBytes(_transaction.data);\\n raw[6] = Lib_RLPWriter.writeUint(_transaction.chainId);\\n raw[7] = Lib_RLPWriter.writeBytes(bytes(''));\\n raw[8] = Lib_RLPWriter.writeBytes(bytes(''));\\n\\n return Lib_RLPWriter.writeList(raw);\\n }\\n }\\n\\n /**\\n * Encodes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Encoded transaction bytes.\\n */\\n function encodeTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return abi.encodePacked(\\n _transaction.timestamp,\\n _transaction.blockNumber,\\n _transaction.l1QueueOrigin,\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n );\\n }\\n\\n /**\\n * Hashes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Hashed transaction\\n */\\n function hashTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(encodeTransaction(_transaction));\\n }\\n\\n /**\\n * Converts an OVM account to an EVM account.\\n * @param _in OVM account to convert.\\n * @return Converted EVM account.\\n */\\n function toEVMAccount(\\n Account memory _in\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n return EVMAccount({\\n nonce: _in.nonce,\\n balance: _in.balance,\\n storageRoot: _in.storageRoot,\\n codeHash: _in.codeHash\\n });\\n }\\n\\n /**\\n * @notice RLP-encodes an account state struct.\\n * @param _account Account state struct.\\n * @return RLP-encoded account state.\\n */\\n function encodeEVMAccount(\\n EVMAccount memory _account\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes[] memory raw = new bytes[](4);\\n\\n // Unfortunately we can't create this array outright because\\n // Lib_RLPWriter.writeList will reject fixed-size arrays. Assigning\\n // index-by-index circumvents this issue.\\n raw[0] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.nonce)\\n )\\n );\\n raw[1] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.balance)\\n )\\n );\\n raw[2] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.storageRoot));\\n raw[3] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.codeHash));\\n\\n return Lib_RLPWriter.writeList(raw);\\n }\\n\\n /**\\n * @notice Decodes an RLP-encoded account state into a useful struct.\\n * @param _encoded RLP-encoded account state.\\n * @return Account state struct.\\n */\\n function decodeEVMAccount(\\n bytes memory _encoded\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\\n\\n return EVMAccount({\\n nonce: Lib_RLPReader.readUint256(accountState[0]),\\n balance: Lib_RLPReader.readUint256(accountState[1]),\\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\\n });\\n }\\n\\n /**\\n * Calculates a hash for a given batch header.\\n * @param _batchHeader Header to hash.\\n * @return Hash of the header.\\n */\\n function hashBatchHeader(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(\\n abi.encode(\\n _batchHeader.batchRoot,\\n _batchHeader.batchSize,\\n _batchHeader.prevTotalElements,\\n _batchHeader.extraData\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0xe7e518ba7bba3fa28c532f8902576c1bb4dfc1ec4b62bed6da50623248ba17c3\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Contract Imports */\\nimport { Ownable } from \\\"./Lib_Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n public\\n onlyOwner\\n {\\n addresses[_getNameHash(_name)] = _address;\\n\\n emit AddressSet(\\n _name,\\n _address\\n );\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0x36473d229ce0ba9d1cac5f02f84be843d9dcc8008525590a1652a2c2636f95f2\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(\\n address _libAddressManager\\n ) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x65981feeabff6a81783ea97d44baf988a18a86c8cb374c46fdb71819cbacc7c0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Ownable\\n * @dev Adapted from https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol\\n */\\nabstract contract Ownable {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n address public owner;\\n\\n\\n /**********\\n * Events *\\n **********/\\n\\n event OwnershipTransferred(\\n address indexed previousOwner,\\n address indexed newOwner\\n );\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n constructor() {\\n owner = msg.sender;\\n emit OwnershipTransferred(address(0), owner);\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n owner == msg.sender,\\n \\\"Ownable: caller is not the owner\\\"\\n );\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the owner of this contract to the zero address, effectively renouncing ownership\\n * completely. Can only be called by the current owner of this contract.\\n */\\n function renounceOwnership()\\n public\\n virtual\\n onlyOwner\\n {\\n emit OwnershipTransferred(owner, address(0));\\n owner = address(0);\\n }\\n\\n /**\\n * Transfers ownership of this contract to a new address. Can only be called by the current\\n * owner of this contract.\\n * @param _newOwner Address of the new contract owner.\\n */\\n function transferOwnership(\\n address _newOwner\\n )\\n public\\n virtual\\n onlyOwner\\n {\\n require(\\n _newOwner != address(0),\\n \\\"Ownable: new owner cannot be the zero address\\\"\\n );\\n\\n emit OwnershipTransferred(owner, _newOwner);\\n owner = _newOwner;\\n }\\n}\\n\",\"keccak256\":\"0x83f9a6c4608b5929086429205b00f8211cdfcba83f3c84520f24d8aa64fe4b82\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPReader.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_RLPReader\\n * @dev Adapted from \\\"RLPReader\\\" by Hamdi Allam (hamdi.allam97@gmail.com).\\n */\\nlibrary Lib_RLPReader {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 constant internal MAX_LIST_LENGTH = 32;\\n\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum RLPItemType {\\n DATA_ITEM,\\n LIST_ITEM\\n }\\n\\n \\n /***********\\n * Structs *\\n ***********/\\n\\n struct RLPItem {\\n uint256 length;\\n uint256 ptr;\\n }\\n \\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n \\n /**\\n * Converts bytes to a reference to memory position and length.\\n * @param _in Input bytes to convert.\\n * @return Output memory reference.\\n */\\n function toRLPItem(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem memory\\n )\\n {\\n uint256 ptr;\\n assembly {\\n ptr := add(_in, 32)\\n }\\n\\n return RLPItem({\\n length: _in.length,\\n ptr: ptr\\n });\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n (\\n uint256 listOffset,\\n ,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.LIST_ITEM,\\n \\\"Invalid RLP list value.\\\"\\n );\\n\\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\\n // writing to the length. Since we can't know the number of RLP items without looping over\\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\\n // simply set a reasonable maximum list length and decrease the size before we finish.\\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\\n\\n uint256 itemCount = 0;\\n uint256 offset = listOffset;\\n while (offset < _in.length) {\\n require(\\n itemCount < MAX_LIST_LENGTH,\\n \\\"Provided RLP list exceeds max list length.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n ) = _decodeLength(RLPItem({\\n length: _in.length - offset,\\n ptr: _in.ptr + offset\\n }));\\n\\n out[itemCount] = RLPItem({\\n length: itemLength + itemOffset,\\n ptr: _in.ptr + offset\\n });\\n\\n itemCount += 1;\\n offset += itemOffset + itemLength;\\n }\\n\\n // Decrease the array size to match the actual item count.\\n assembly {\\n mstore(out, itemCount)\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n return readList(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes value.\\\"\\n );\\n\\n return _copy(_in.ptr, itemOffset, itemLength);\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return readBytes(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return string(readBytes(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return readString(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n require(\\n _in.length <= 33,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr + itemOffset;\\n bytes32 out;\\n assembly {\\n out := mload(ptr)\\n\\n // Shift the bytes over to match the item size.\\n if lt(itemLength, 32) {\\n out := div(out, exp(256, sub(32, itemLength)))\\n }\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return readBytes32(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return uint256(readBytes32(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return readUint256(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n require(\\n _in.length == 1,\\n \\\"Invalid RLP boolean value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 out;\\n assembly {\\n out := byte(0, mload(ptr))\\n }\\n\\n require(\\n out == 0 || out == 1,\\n \\\"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\\\"\\n );\\n\\n return out != 0;\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return readBool(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n if (_in.length == 1) {\\n return address(0);\\n }\\n\\n require(\\n _in.length == 21,\\n \\\"Invalid RLP address value.\\\"\\n );\\n\\n return address(readUint256(_in));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return readAddress(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads the raw bytes of an RLP item.\\n * @param _in RLP item to read.\\n * @return Raw RLP bytes.\\n */\\n function readRawBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in);\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Decodes the length of an RLP item.\\n * @param _in RLP item to decode.\\n * @return Offset of the encoded data.\\n * @return Length of the encoded data.\\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\\n */\\n function _decodeLength(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n uint256,\\n uint256,\\n RLPItemType\\n )\\n {\\n require(\\n _in.length > 0,\\n \\\"RLP item cannot be null.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 prefix;\\n assembly {\\n prefix := byte(0, mload(ptr))\\n }\\n\\n if (prefix <= 0x7f) {\\n // Single byte.\\n\\n return (0, 1, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xb7) {\\n // Short string.\\n\\n uint256 strLen = prefix - 0x80;\\n \\n require(\\n _in.length > strLen,\\n \\\"Invalid RLP short string.\\\"\\n );\\n\\n return (1, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xbf) {\\n // Long string.\\n uint256 lenOfStrLen = prefix - 0xb7;\\n\\n require(\\n _in.length > lenOfStrLen,\\n \\\"Invalid RLP long string length.\\\"\\n );\\n\\n uint256 strLen;\\n assembly {\\n // Pick out the string length.\\n strLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfStrLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfStrLen + strLen,\\n \\\"Invalid RLP long string.\\\"\\n );\\n\\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xf7) {\\n // Short list.\\n uint256 listLen = prefix - 0xc0;\\n\\n require(\\n _in.length > listLen,\\n \\\"Invalid RLP short list.\\\"\\n );\\n\\n return (1, listLen, RLPItemType.LIST_ITEM);\\n } else {\\n // Long list.\\n uint256 lenOfListLen = prefix - 0xf7;\\n\\n require(\\n _in.length > lenOfListLen,\\n \\\"Invalid RLP long list length.\\\"\\n );\\n\\n uint256 listLen;\\n assembly {\\n // Pick out the list length.\\n listLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfListLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfListLen + listLen,\\n \\\"Invalid RLP long list.\\\"\\n );\\n\\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\\n }\\n }\\n\\n /**\\n * Copies the bytes from a memory location.\\n * @param _src Pointer to the location to read from.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Copied bytes.\\n */\\n function _copy(\\n uint256 _src,\\n uint256 _offset,\\n uint256 _length\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out = new bytes(_length);\\n if (out.length == 0) {\\n return out;\\n }\\n\\n uint256 src = _src + _offset;\\n uint256 dest;\\n assembly {\\n dest := add(out, 32)\\n }\\n\\n // Copy over as many complete words as we can.\\n for (uint256 i = 0; i < _length / 32; i++) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n\\n src += 32;\\n dest += 32;\\n }\\n\\n // Pick out the remaining bytes.\\n uint256 mask = 256 ** (32 - (_length % 32)) - 1;\\n assembly {\\n mstore(\\n dest,\\n or(\\n and(mload(src), not(mask)),\\n and(mload(dest), mask)\\n )\\n )\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Copies an RLP item into bytes.\\n * @param _in RLP item to copy.\\n * @return Copied bytes.\\n */\\n function _copy(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in.ptr, 0, _in.length);\\n }\\n}\\n\",\"keccak256\":\"0xbdb8fae0ca2483b4cc07607a5070fc25e33c54b4e4462b99e7c0b13aac48a09b\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPWriter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\n\\n/**\\n * @title Lib_RLPWriter\\n * @author Bakaoh (with modifications)\\n */\\nlibrary Lib_RLPWriter {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * RLP encodes a byte string.\\n * @param _in The byte string to encode.\\n * @return _out The RLP encoded string in bytes.\\n */\\n function writeBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n bytes memory encoded;\\n\\n if (_in.length == 1 && uint8(_in[0]) < 128) {\\n encoded = _in;\\n } else {\\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * RLP encodes a list of RLP encoded byte byte strings.\\n * @param _in The list of RLP encoded byte strings.\\n * @return _out The RLP encoded list of items in bytes.\\n */\\n function writeList(\\n bytes[] memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n bytes memory list = _flatten(_in);\\n return abi.encodePacked(_writeLength(list.length, 192), list);\\n }\\n\\n /**\\n * RLP encodes a string.\\n * @param _in The string to encode.\\n * @return _out The RLP encoded string in bytes.\\n */\\n function writeString(\\n string memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(bytes(_in));\\n }\\n\\n /**\\n * RLP encodes an address.\\n * @param _in The address to encode.\\n * @return _out The RLP encoded address in bytes.\\n */\\n function writeAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a uint.\\n * @param _in The uint256 to encode.\\n * @return _out The RLP encoded uint256 in bytes.\\n */\\n function writeUint(\\n uint256 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(_toBinary(_in));\\n }\\n\\n /**\\n * RLP encodes a bool.\\n * @param _in The bool to encode.\\n * @return _out The RLP encoded bool in bytes.\\n */\\n function writeBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n bytes memory encoded = new bytes(1);\\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\\n return encoded;\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\\n * @param _len The length of the string or the payload.\\n * @param _offset 128 if item is string, 192 if item is list.\\n * @return _encoded RLP encoded bytes.\\n */\\n function _writeLength(\\n uint256 _len,\\n uint256 _offset\\n )\\n private\\n pure\\n returns (\\n bytes memory _encoded\\n )\\n {\\n bytes memory encoded;\\n\\n if (_len < 56) {\\n encoded = new bytes(1);\\n encoded[0] = byte(uint8(_len) + uint8(_offset));\\n } else {\\n uint256 lenLen;\\n uint256 i = 1;\\n while (_len / i != 0) {\\n lenLen++;\\n i *= 256;\\n }\\n\\n encoded = new bytes(lenLen + 1);\\n encoded[0] = byte(uint8(lenLen) + uint8(_offset) + 55);\\n for(i = 1; i <= lenLen; i++) {\\n encoded[i] = byte(uint8((_len / (256**(lenLen-i))) % 256));\\n }\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * Encode integer in big endian binary form with no leading zeroes.\\n * @notice TODO: This should be optimized with assembly to save gas costs.\\n * @param _x The integer to encode.\\n * @return _binary RLP encoded bytes.\\n */\\n function _toBinary(\\n uint256 _x\\n )\\n private\\n pure\\n returns (\\n bytes memory _binary\\n )\\n {\\n bytes memory b = abi.encodePacked(_x);\\n\\n uint256 i = 0;\\n for (; i < 32; i++) {\\n if (b[i] != 0) {\\n break;\\n }\\n }\\n\\n bytes memory res = new bytes(32 - i);\\n for (uint256 j = 0; j < res.length; j++) {\\n res[j] = b[i++];\\n }\\n\\n return res;\\n }\\n\\n /**\\n * Copies a piece of memory to another location.\\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\\n * @param _dest Destination location.\\n * @param _src Source location.\\n * @param _len Length of memory to copy.\\n */\\n function _memcpy(\\n uint256 _dest,\\n uint256 _src,\\n uint256 _len\\n )\\n private\\n pure\\n {\\n uint256 dest = _dest;\\n uint256 src = _src;\\n uint256 len = _len;\\n\\n for(; len >= 32; len -= 32) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n dest += 32;\\n src += 32;\\n }\\n\\n uint256 mask = 256 ** (32 - len) - 1;\\n assembly {\\n let srcpart := and(mload(src), not(mask))\\n let destpart := and(mload(dest), mask)\\n mstore(dest, or(destpart, srcpart))\\n }\\n }\\n\\n /**\\n * Flattens a list of byte strings into one byte string.\\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\\n * @param _list List of byte strings to flatten.\\n * @return _flattened The flattened byte string.\\n */\\n function _flatten(\\n bytes[] memory _list\\n )\\n private\\n pure\\n returns (\\n bytes memory _flattened\\n )\\n {\\n if (_list.length == 0) {\\n return new bytes(0);\\n }\\n\\n uint256 len;\\n uint256 i = 0;\\n for (; i < _list.length; i++) {\\n len += _list[i].length;\\n }\\n\\n bytes memory flattened = new bytes(len);\\n uint256 flattenedPtr;\\n assembly { flattenedPtr := add(flattened, 0x20) }\\n\\n for(i = 0; i < _list.length; i++) {\\n bytes memory item = _list[i];\\n\\n uint256 listPtr;\\n assembly { listPtr := add(item, 0x20)}\\n\\n _memcpy(flattenedPtr, listPtr, item.length);\\n flattenedPtr += _list[i].length;\\n }\\n\\n return flattened;\\n }\\n}\",\"keccak256\":\"0xbcb24619c1758cb0d9f3fe5c79495950045a9087046a02b9ce01df46ae09ae5b\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_Bytes32Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_Byte32Utils\\n */\\nlibrary Lib_Bytes32Utils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \\\"true.\\\"\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as a boolean.\\n */\\n function toBool(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return _in != 0;\\n }\\n\\n /**\\n * Converts a boolean to a bytes32 value.\\n * @param _in Input boolean value.\\n * @return Boolean as a bytes32.\\n */\\n function fromBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in ? 1 : 0));\\n }\\n\\n /**\\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as an address.\\n */\\n function toAddress(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return address(uint160(uint256(_in)));\\n }\\n\\n /**\\n * Converts an address to a bytes32.\\n * @param _in Input address value.\\n * @return Address as a bytes32.\\n */\\n function fromAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in));\\n }\\n\\n /**\\n * Removes the leading zeros from a bytes32 value and returns a new (smaller) bytes value.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 without any leading zeros.\\n */\\n function removeLeadingZeros(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out;\\n\\n assembly {\\n // Figure out how many leading zero bytes to remove.\\n let shift := 0\\n for { let i := 0 } and(lt(i, 32), eq(byte(i, _in), 0)) { i := add(i, 1) } {\\n shift := add(shift, 1)\\n }\\n\\n // Reserve some space for our output and fix the free memory pointer.\\n out := mload(0x40)\\n mstore(0x40, add(out, 0x40))\\n\\n // Shift the value and store it into the output bytes.\\n mstore(add(out, 0x20), shl(mul(shift, 8), _in))\\n\\n // Store the new size (with leading zero bytes removed) in the output byte size.\\n mstore(out, sub(32, shift))\\n }\\n\\n return out;\\n }\\n}\\n\",\"keccak256\":\"0xfa2def593e3fc56a31852c3744aefdaa93cec74e721bfcfeb1e5d166c7c60b64\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_BytesUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_BytesUtils\\n */\\nlibrary Lib_BytesUtils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_start + _length >= _start, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n if (_bytes.length - _start == 0) {\\n return bytes('');\\n }\\n\\n return slice(_bytes, _start, _bytes.length - _start);\\n }\\n\\n function toBytes32PadLeft(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes32)\\n {\\n bytes32 ret;\\n uint256 len = _bytes.length <= 32 ? _bytes.length : 32;\\n assembly {\\n ret := shr(mul(sub(32, len), 8), mload(add(_bytes, 32)))\\n }\\n return ret;\\n }\\n\\n function toBytes32(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes32)\\n {\\n if (_bytes.length < 32) {\\n bytes32 ret;\\n assembly {\\n ret := mload(add(_bytes, 32))\\n }\\n return ret;\\n }\\n\\n return abi.decode(_bytes,(bytes32)); // will truncate if input length > 32 bytes\\n }\\n\\n function toUint256(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (uint256)\\n {\\n return uint256(toBytes32(_bytes));\\n }\\n\\n function toUint24(bytes memory _bytes, uint256 _start) internal pure returns (uint24) {\\n require(_start + 3 >= _start, \\\"toUint24_overflow\\\");\\n require(_bytes.length >= _start + 3 , \\\"toUint24_outOfBounds\\\");\\n uint24 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x3), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toUint8(bytes memory _bytes, uint256 _start) internal pure returns (uint8) {\\n require(_start + 1 >= _start, \\\"toUint8_overflow\\\");\\n require(_bytes.length >= _start + 1 , \\\"toUint8_outOfBounds\\\");\\n uint8 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x1), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toAddress(bytes memory _bytes, uint256 _start) internal pure returns (address) {\\n require(_start + 20 >= _start, \\\"toAddress_overflow\\\");\\n require(_bytes.length >= _start + 20, \\\"toAddress_outOfBounds\\\");\\n address tempAddress;\\n\\n assembly {\\n tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000)\\n }\\n\\n return tempAddress;\\n }\\n\\n function toNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n bytes memory nibbles = new bytes(_bytes.length * 2);\\n\\n for (uint256 i = 0; i < _bytes.length; i++) {\\n nibbles[i * 2] = _bytes[i] >> 4;\\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\\n }\\n\\n return nibbles;\\n }\\n\\n function fromNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n bytes memory ret = new bytes(_bytes.length / 2);\\n\\n for (uint256 i = 0; i < ret.length; i++) {\\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\\n }\\n\\n return ret;\\n }\\n\\n function equal(\\n bytes memory _bytes,\\n bytes memory _other\\n )\\n internal\\n pure\\n returns (bool)\\n {\\n return keccak256(_bytes) == keccak256(_other);\\n }\\n}\\n\",\"keccak256\":\"0x0adf22e1b22ba09911e859f64cb3b484e992be4f9fd3b09088e6225bf8d06ce0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_ECDSAUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_ECDSAUtils\\n */\\nlibrary Lib_ECDSAUtils {\\n\\n /**************************************\\n * Internal Functions: ECDSA Recovery *\\n **************************************/\\n\\n /**\\n * Recovers a signed address given a message and signature.\\n * @param _message Message that was originally signed.\\n * @param _isEthSignedMessage Whether or not the user used the `Ethereum Signed Message` prefix.\\n * @param _v Signature `v` parameter.\\n * @param _r Signature `r` parameter.\\n * @param _s Signature `s` parameter.\\n * @return _sender Signer address.\\n */\\n function recover(\\n bytes memory _message,\\n bool _isEthSignedMessage,\\n uint8 _v,\\n bytes32 _r,\\n bytes32 _s\\n )\\n internal\\n pure\\n returns (\\n address _sender\\n )\\n {\\n bytes32 messageHash = getMessageHash(_message, _isEthSignedMessage);\\n\\n return ecrecover(\\n messageHash,\\n _v + 27,\\n _r,\\n _s\\n );\\n }\\n\\n function getMessageHash(\\n bytes memory _message,\\n bool _isEthSignedMessage\\n )\\n internal\\n pure\\n returns (bytes32) {\\n if (_isEthSignedMessage) {\\n return getEthSignedMessageHash(_message);\\n }\\n return getNativeMessageHash(_message);\\n }\\n\\n\\n /*************************************\\n * Private Functions: ECDSA Recovery *\\n *************************************/\\n\\n /**\\n * Gets the native message hash (simple keccak256) for a message.\\n * @param _message Message to hash.\\n * @return _messageHash Native message hash.\\n */\\n function getNativeMessageHash(\\n bytes memory _message\\n )\\n private\\n pure\\n returns (\\n bytes32 _messageHash\\n )\\n {\\n return keccak256(_message);\\n }\\n\\n /**\\n * Gets the hash of a message with the `Ethereum Signed Message` prefix.\\n * @param _message Message to hash.\\n * @return _messageHash Prefixed message hash.\\n */\\n function getEthSignedMessageHash(\\n bytes memory _message\\n )\\n private\\n pure\\n returns (\\n bytes32 _messageHash\\n )\\n {\\n bytes memory prefix = \\\"\\\\x19Ethereum Signed Message:\\\\n32\\\";\\n bytes32 messageHash = keccak256(_message);\\n return keccak256(abi.encodePacked(prefix, messageHash));\\n }\\n}\",\"keccak256\":\"0xda865d8cc014940a4755e329db9c6272a31bd9a340000a4ecc005d46299a585c\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_ErrorUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/**\\n * @title Lib_ErrorUtils\\n */\\nlibrary Lib_ErrorUtils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Encodes an error string into raw solidity-style revert data.\\n * (i.e. ascii bytes, prefixed with bytes4(keccak(\\\"Error(string))\\\"))\\n * Ref: https://docs.soliditylang.org/en/v0.8.2/control-structures.html?highlight=Error(string)#panic-via-assert-and-error-via-require\\n * @param _reason Reason for the reversion.\\n * @return Standard solidity revert data for the given reason.\\n */\\n function encodeRevertString(\\n string memory _reason\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return abi.encodeWithSignature(\\n \\\"Error(string)\\\",\\n _reason\\n );\\n }\\n}\\n\",\"keccak256\":\"0xfc64ec4a81fb50865b502a0004ed154e8598e1a313db77303fc95e41f536e6b7\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_EthUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// @unsupported: ovm\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"./Lib_Bytes32Utils.sol\\\";\\n\\n/**\\n * @title Lib_EthUtils\\n */\\nlibrary Lib_EthUtils {\\n\\n /***********************************\\n * Internal Functions: Code Access *\\n ***********************************/\\n\\n /**\\n * Gets the code for a given address.\\n * @param _address Address to get code for.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return _code Code read from the contract.\\n */\\n function getCode(\\n address _address,\\n uint256 _offset,\\n uint256 _length\\n )\\n internal\\n view\\n returns (\\n bytes memory _code\\n )\\n {\\n assembly {\\n _code := mload(0x40)\\n mstore(0x40, add(_code, add(_length, 0x20)))\\n mstore(_code, _length)\\n extcodecopy(_address, add(_code, 0x20), _offset, _length)\\n }\\n\\n return _code;\\n }\\n\\n /**\\n * Gets the full code for a given address.\\n * @param _address Address to get code for.\\n * @return _code Full code of the contract.\\n */\\n function getCode(\\n address _address\\n )\\n internal\\n view\\n returns (\\n bytes memory _code\\n )\\n {\\n return getCode(\\n _address,\\n 0,\\n getCodeSize(_address)\\n );\\n }\\n\\n /**\\n * Gets the size of a contract's code in bytes.\\n * @param _address Address to get code size for.\\n * @return _codeSize Size of the contract's code in bytes.\\n */\\n function getCodeSize(\\n address _address\\n )\\n internal\\n view\\n returns (\\n uint256 _codeSize\\n )\\n {\\n assembly {\\n _codeSize := extcodesize(_address)\\n }\\n\\n return _codeSize;\\n }\\n\\n /**\\n * Gets the hash of a contract's code.\\n * @param _address Address to get a code hash for.\\n * @return _codeHash Hash of the contract's code.\\n */\\n function getCodeHash(\\n address _address\\n )\\n internal\\n view\\n returns (\\n bytes32 _codeHash\\n )\\n {\\n assembly {\\n _codeHash := extcodehash(_address)\\n }\\n\\n return _codeHash;\\n }\\n\\n\\n /*****************************************\\n * Internal Functions: Contract Creation *\\n *****************************************/\\n\\n /**\\n * Creates a contract with some given initialization code.\\n * @param _code Contract initialization code.\\n * @return _created Address of the created contract.\\n */\\n function createContract(\\n bytes memory _code\\n )\\n internal\\n returns (\\n address _created\\n )\\n {\\n assembly {\\n _created := create(\\n 0,\\n add(_code, 0x20),\\n mload(_code)\\n )\\n }\\n\\n return _created;\\n }\\n\\n /**\\n * Computes the address that would be generated by CREATE.\\n * @param _creator Address creating the contract.\\n * @param _nonce Creator's nonce.\\n * @return _address Address to be generated by CREATE.\\n */\\n function getAddressForCREATE(\\n address _creator,\\n uint256 _nonce\\n )\\n internal\\n pure\\n returns (\\n address _address\\n )\\n {\\n bytes[] memory encoded = new bytes[](2);\\n encoded[0] = Lib_RLPWriter.writeAddress(_creator);\\n encoded[1] = Lib_RLPWriter.writeUint(_nonce);\\n\\n bytes memory encodedList = Lib_RLPWriter.writeList(encoded);\\n return Lib_Bytes32Utils.toAddress(keccak256(encodedList));\\n }\\n\\n /**\\n * Computes the address that would be generated by CREATE2.\\n * @param _creator Address creating the contract.\\n * @param _bytecode Bytecode of the contract to be created.\\n * @param _salt 32 byte salt value mixed into the hash.\\n * @return _address Address to be generated by CREATE2.\\n */\\n function getAddressForCREATE2(\\n address _creator,\\n bytes memory _bytecode,\\n bytes32 _salt\\n )\\n internal\\n pure\\n returns (address _address)\\n {\\n bytes32 hashedData = keccak256(abi.encodePacked(\\n byte(0xff),\\n _creator,\\n _salt,\\n keccak256(_bytecode)\\n ));\\n\\n return Lib_Bytes32Utils.toAddress(hashedData);\\n }\\n}\\n\",\"keccak256\":\"0x5fdf009da11f90cb5e99e5cd160d07bb744a5a2055774a646bdf277ad6910595\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_Math\\n */\\nlibrary Lib_Math {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Calculates the minumum of two numbers.\\n * @param _x First number to compare.\\n * @param _y Second number to compare.\\n * @return Lesser of the two numbers.\\n */\\n function min(\\n uint256 _x,\\n uint256 _y\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n if (_x < _y) {\\n return _x;\\n }\\n\\n return _y;\\n }\\n}\\n\",\"keccak256\":\"0xcc36559529e708e99b8fd2ab0078fcba5a1f81787b08c1cf4cd46288ad64ee58\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_MerkleTree.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_MerkleTree\\n * @author River Keefer\\n */\\nlibrary Lib_MerkleTree {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Calculates a merkle root for a list of 32-byte leaf hashes. WARNING: If the number\\n * of leaves passed in is not a power of two, it pads out the tree with zero hashes.\\n * If you do not know the original length of elements for the tree you are verifying,\\n * then this may allow empty leaves past _elements.length to pass a verification check down the line.\\n * Note that the _elements argument is modified, therefore it must not be used again afterwards\\n * @param _elements Array of hashes from which to generate a merkle root.\\n * @return Merkle root of the leaves, with zero hashes for non-powers-of-two (see above).\\n */\\n function getMerkleRoot(\\n bytes32[] memory _elements\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n require(\\n _elements.length > 0,\\n \\\"Lib_MerkleTree: Must provide at least one leaf hash.\\\"\\n );\\n\\n if (_elements.length == 1) {\\n return _elements[0];\\n }\\n\\n uint256[16] memory defaults = [\\n 0x290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563,\\n 0x633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d,\\n 0x890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d,\\n 0x3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd8,\\n 0xecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da,\\n 0xdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da5,\\n 0x617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d7,\\n 0x292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead,\\n 0xe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e10,\\n 0x7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f82,\\n 0xe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e83636516,\\n 0x3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c,\\n 0xad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e,\\n 0xa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab,\\n 0x4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c862,\\n 0x2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf10\\n ];\\n\\n // Reserve memory space for our hashes.\\n bytes memory buf = new bytes(64);\\n\\n // We'll need to keep track of left and right siblings.\\n bytes32 leftSibling;\\n bytes32 rightSibling;\\n\\n // Number of non-empty nodes at the current depth.\\n uint256 rowSize = _elements.length;\\n\\n // Current depth, counting from 0 at the leaves\\n uint256 depth = 0;\\n\\n // Common sub-expressions\\n uint256 halfRowSize; // rowSize / 2\\n bool rowSizeIsOdd; // rowSize % 2 == 1\\n\\n while (rowSize > 1) {\\n halfRowSize = rowSize / 2;\\n rowSizeIsOdd = rowSize % 2 == 1;\\n\\n for (uint256 i = 0; i < halfRowSize; i++) {\\n leftSibling = _elements[(2 * i) ];\\n rightSibling = _elements[(2 * i) + 1];\\n assembly {\\n mstore(add(buf, 32), leftSibling )\\n mstore(add(buf, 64), rightSibling)\\n }\\n\\n _elements[i] = keccak256(buf);\\n }\\n\\n if (rowSizeIsOdd) {\\n leftSibling = _elements[rowSize - 1];\\n rightSibling = bytes32(defaults[depth]);\\n assembly {\\n mstore(add(buf, 32), leftSibling)\\n mstore(add(buf, 64), rightSibling)\\n }\\n\\n _elements[halfRowSize] = keccak256(buf);\\n }\\n\\n rowSize = halfRowSize + (rowSizeIsOdd ? 1 : 0);\\n depth++;\\n }\\n\\n return _elements[0];\\n }\\n\\n /**\\n * Verifies a merkle branch for the given leaf hash. Assumes the original length\\n * of leaves generated is a known, correct input, and does not return true for indices\\n * extending past that index (even if _siblings would be otherwise valid.)\\n * @param _root The Merkle root to verify against.\\n * @param _leaf The leaf hash to verify inclusion of.\\n * @param _index The index in the tree of this leaf.\\n * @param _siblings Array of sibline nodes in the inclusion proof, starting from depth 0 (bottom of the tree).\\n * @param _totalLeaves The total number of leaves originally passed into.\\n * @return Whether or not the merkle branch and leaf passes verification.\\n */\\n function verify(\\n bytes32 _root,\\n bytes32 _leaf,\\n uint256 _index,\\n bytes32[] memory _siblings,\\n uint256 _totalLeaves\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n require(\\n _totalLeaves > 0,\\n \\\"Lib_MerkleTree: Total leaves must be greater than zero.\\\"\\n );\\n\\n require(\\n _index < _totalLeaves,\\n \\\"Lib_MerkleTree: Index out of bounds.\\\"\\n );\\n\\n require(\\n _siblings.length == _ceilLog2(_totalLeaves),\\n \\\"Lib_MerkleTree: Total siblings does not correctly correspond to total leaves.\\\"\\n );\\n\\n bytes32 computedRoot = _leaf;\\n\\n for (uint256 i = 0; i < _siblings.length; i++) {\\n if ((_index & 1) == 1) {\\n computedRoot = keccak256(\\n abi.encodePacked(\\n _siblings[i],\\n computedRoot\\n )\\n );\\n } else {\\n computedRoot = keccak256(\\n abi.encodePacked(\\n computedRoot,\\n _siblings[i]\\n )\\n );\\n }\\n\\n _index >>= 1;\\n }\\n\\n return _root == computedRoot;\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Calculates the integer ceiling of the log base 2 of an input.\\n * @param _in Unsigned input to calculate the log.\\n * @return ceil(log_base_2(_in))\\n */\\n function _ceilLog2(\\n uint256 _in\\n )\\n private\\n pure\\n returns (\\n uint256\\n )\\n {\\n require(\\n _in > 0,\\n \\\"Lib_MerkleTree: Cannot compute ceil(log_2) of 0.\\\"\\n );\\n\\n if (_in == 1) {\\n return 0;\\n }\\n\\n // Find the highest set bit (will be floor(log_2)).\\n // Borrowed with <3 from https://github.com/ethereum/solidity-examples\\n uint256 val = _in;\\n uint256 highest = 0;\\n for (uint256 i = 128; i >= 1; i >>= 1) {\\n if (val & (uint(1) << i) - 1 << i != 0) {\\n highest += i;\\n val >>= i;\\n }\\n }\\n\\n // Increment by one if this is not a perfect logarithm.\\n if ((uint(1) << highest) != _in) {\\n highest += 1;\\n }\\n\\n return highest;\\n }\\n}\\n\",\"keccak256\":\"0xa78edb9fbd34712771a1ebff05bc5e1abec7fc1e9a1bfb709d183099b44fa62a\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_ErrorUtils } from \\\"../utils/Lib_ErrorUtils.sol\\\";\\n\\n/**\\n * @title Lib_SafeExecutionManagerWrapper\\n * @dev The Safe Execution Manager Wrapper provides functions which facilitate writing OVM safe \\n * code using the standard solidity compiler, by routing all its operations through the Execution \\n * Manager.\\n * \\n * Compiler used: solc\\n * Runtime target: OVM\\n */\\nlibrary Lib_SafeExecutionManagerWrapper {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Performs a safe ovmCALL.\\n * @param _gasLimit Gas limit for the call.\\n * @param _target Address to call.\\n * @param _calldata Data to send to the call.\\n * @return _success Whether or not the call reverted.\\n * @return _returndata Data returned by the call.\\n */\\n function safeCALL(\\n uint256 _gasLimit,\\n address _target,\\n bytes memory _calldata\\n )\\n internal\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCALL(uint256,address,bytes)\\\",\\n _gasLimit,\\n _target,\\n _calldata\\n )\\n );\\n\\n return abi.decode(returndata, (bool, bytes));\\n }\\n\\n /**\\n * Performs a safe ovmDELEGATECALL.\\n * @param _gasLimit Gas limit for the call.\\n * @param _target Address to call.\\n * @param _calldata Data to send to the call.\\n * @return _success Whether or not the call reverted.\\n * @return _returndata Data returned by the call.\\n */\\n function safeDELEGATECALL(\\n uint256 _gasLimit,\\n address _target,\\n bytes memory _calldata\\n )\\n internal\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmDELEGATECALL(uint256,address,bytes)\\\",\\n _gasLimit,\\n _target,\\n _calldata\\n )\\n );\\n\\n return abi.decode(returndata, (bool, bytes));\\n }\\n\\n /**\\n * Performs a safe ovmCREATE call.\\n * @param _gasLimit Gas limit for the creation.\\n * @param _bytecode Code for the new contract.\\n * @return _contract Address of the created contract.\\n */\\n function safeCREATE(\\n uint256 _gasLimit,\\n bytes memory _bytecode\\n )\\n internal\\n returns (\\n address,\\n bytes memory\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n _gasLimit,\\n abi.encodeWithSignature(\\n \\\"ovmCREATE(bytes)\\\",\\n _bytecode\\n )\\n );\\n\\n return abi.decode(returndata, (address, bytes));\\n }\\n\\n /**\\n * Performs a safe ovmEXTCODESIZE call.\\n * @param _contract Address of the contract to query the size of.\\n * @return _EXTCODESIZE Size of the requested contract in bytes.\\n */\\n function safeEXTCODESIZE(\\n address _contract\\n )\\n internal\\n returns (\\n uint256 _EXTCODESIZE\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmEXTCODESIZE(address)\\\",\\n _contract\\n )\\n );\\n\\n return abi.decode(returndata, (uint256));\\n }\\n\\n /**\\n * Performs a safe ovmCHAINID call.\\n * @return _CHAINID Result of calling ovmCHAINID.\\n */\\n function safeCHAINID()\\n internal\\n returns (\\n uint256 _CHAINID\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCHAINID()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (uint256));\\n }\\n\\n /**\\n * Performs a safe ovmCALLER call.\\n * @return _CALLER Result of calling ovmCALLER.\\n */\\n function safeCALLER()\\n internal\\n returns (\\n address _CALLER\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCALLER()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (address));\\n }\\n\\n /**\\n * Performs a safe ovmADDRESS call.\\n * @return _ADDRESS Result of calling ovmADDRESS.\\n */\\n function safeADDRESS()\\n internal\\n returns (\\n address _ADDRESS\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmADDRESS()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (address));\\n }\\n\\n /**\\n * Performs a safe ovmGETNONCE call.\\n * @return _nonce Result of calling ovmGETNONCE.\\n */\\n function safeGETNONCE()\\n internal\\n returns (\\n uint256 _nonce\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmGETNONCE()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (uint256));\\n }\\n\\n /**\\n * Performs a safe ovmINCREMENTNONCE call.\\n */\\n function safeINCREMENTNONCE()\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmINCREMENTNONCE()\\\"\\n )\\n );\\n }\\n\\n /**\\n * Performs a safe ovmCREATEEOA call.\\n * @param _messageHash Message hash which was signed by EOA\\n * @param _v v value of signature (0 or 1)\\n * @param _r r value of signature\\n * @param _s s value of signature\\n */\\n function safeCREATEEOA(\\n bytes32 _messageHash,\\n uint8 _v,\\n bytes32 _r,\\n bytes32 _s\\n )\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCREATEEOA(bytes32,uint8,bytes32,bytes32)\\\",\\n _messageHash,\\n _v,\\n _r,\\n _s\\n )\\n );\\n }\\n\\n /**\\n * Performs a safe REVERT.\\n * @param _reason String revert reason to pass along with the REVERT.\\n */\\n function safeREVERT(\\n string memory _reason\\n )\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmREVERT(bytes)\\\",\\n Lib_ErrorUtils.encodeRevertString(\\n _reason\\n )\\n )\\n );\\n }\\n\\n /**\\n * Performs a safe \\\"require\\\".\\n * @param _condition Boolean condition that must be true or will revert.\\n * @param _reason String revert reason to pass along with the REVERT.\\n */\\n function safeREQUIRE(\\n bool _condition,\\n string memory _reason\\n )\\n internal\\n {\\n if (!_condition) {\\n safeREVERT(\\n _reason\\n );\\n }\\n }\\n\\n /**\\n * Performs a safe ovmSLOAD call.\\n */\\n function safeSLOAD(\\n bytes32 _key\\n )\\n internal\\n returns (\\n bytes32\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmSLOAD(bytes32)\\\",\\n _key\\n )\\n );\\n\\n return abi.decode(returndata, (bytes32));\\n }\\n\\n /**\\n * Performs a safe ovmSSTORE call.\\n */\\n function safeSSTORE(\\n bytes32 _key,\\n bytes32 _value\\n )\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmSSTORE(bytes32,bytes32)\\\",\\n _key,\\n _value\\n )\\n );\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Performs an ovm interaction and the necessary safety checks.\\n * @param _gasLimit Gas limit for the interaction.\\n * @param _calldata Data to send to the OVM_ExecutionManager (encoded with sighash).\\n * @return _returndata Data sent back by the OVM_ExecutionManager.\\n */\\n function _safeExecutionManagerInteraction(\\n uint256 _gasLimit,\\n bytes memory _calldata\\n )\\n private\\n returns (\\n bytes memory _returndata\\n )\\n {\\n address ovmExecutionManager = msg.sender;\\n (\\n bool success,\\n bytes memory returndata\\n ) = ovmExecutionManager.call{gas: _gasLimit}(_calldata);\\n\\n if (success == false) {\\n assembly {\\n revert(add(returndata, 0x20), mload(returndata))\\n }\\n } else if (returndata.length == 1) {\\n assembly {\\n return(0, 1)\\n }\\n } else {\\n return returndata;\\n }\\n }\\n\\n function _safeExecutionManagerInteraction(\\n bytes memory _calldata\\n )\\n private\\n returns (\\n bytes memory _returndata\\n )\\n {\\n return _safeExecutionManagerInteraction(\\n gasleft(),\\n _calldata\\n );\\n }\\n}\\n\",\"keccak256\":\"0x41e146e7912af794a17cd43c5a276674be956bfa8f3ca5b451bcb82d81e6f492\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/wrappers/Lib_SafeMathWrapper.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// Pulled from @openzeppelin/contracts/math/SafeMath.sol\\n// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_SafeExecutionManagerWrapper } from \\\"./Lib_SafeExecutionManagerWrapper.sol\\\";\\n\\n/**\\n * @title Lib_SafeMathWrapper\\n */\\n\\n/**\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\n * checks.\\n *\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\n * in bugs, because programmers usually assume that an overflow raises an\\n * error, which is the standard behavior in high level programming languages.\\n * `SafeMath` restores this intuition by reverting the transaction when an\\n * operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n */\\n\\nlibrary Lib_SafeMathWrapper {\\n /**\\n * @dev Returns the addition of two unsigned integers, reverting on\\n * overflow.\\n *\\n * Counterpart to Solidity's `+` operator.\\n *\\n * Requirements:\\n *\\n * - Addition cannot overflow.\\n */\\n function add(uint256 a, uint256 b) internal returns (uint256) {\\n uint256 c = a + b;\\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(c >= a, \\\"Lib_SafeMathWrapper: addition overflow\\\");\\n\\n return c;\\n }\\n\\n /**\\n * @dev Returns the subtraction of two unsigned integers, reverting on\\n * overflow (when the result is negative).\\n *\\n * Counterpart to Solidity's `-` operator.\\n *\\n * Requirements:\\n *\\n * - Subtraction cannot overflow.\\n */\\n function sub(uint256 a, uint256 b) internal returns (uint256) {\\n return sub(a, b, \\\"Lib_SafeMathWrapper: subtraction overflow\\\");\\n }\\n\\n /**\\n * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\n * overflow (when the result is negative).\\n *\\n * Counterpart to Solidity's `-` operator.\\n *\\n * Requirements:\\n *\\n * - Subtraction cannot overflow.\\n */\\n function sub(uint256 a, uint256 b, string memory errorMessage) internal returns (uint256) {\\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(b <= a, errorMessage);\\n uint256 c = a - b;\\n\\n return c;\\n }\\n\\n /**\\n * @dev Returns the multiplication of two unsigned integers, reverting on\\n * overflow.\\n *\\n * Counterpart to Solidity's `*` operator.\\n *\\n * Requirements:\\n *\\n * - Multiplication cannot overflow.\\n */\\n function mul(uint256 a, uint256 b) internal returns (uint256) {\\n // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\n // benefit is lost if 'b' is also tested.\\n // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\n if (a == 0) {\\n return 0;\\n }\\n\\n uint256 c = a * b;\\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(c / a == b, \\\"Lib_SafeMathWrapper: multiplication overflow\\\");\\n\\n return c;\\n }\\n\\n /**\\n * @dev Returns the integer division of two unsigned integers. Reverts on\\n * division by zero. The result is rounded towards zero.\\n *\\n * Counterpart to Solidity's `/` operator. Note: this function uses a\\n * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n * uses an invalid opcode to revert (consuming all remaining gas).\\n *\\n * Requirements:\\n *\\n * - The divisor cannot be zero.\\n */\\n function div(uint256 a, uint256 b) internal returns (uint256) {\\n return div(a, b, \\\"Lib_SafeMathWrapper: division by zero\\\");\\n }\\n\\n /**\\n * @dev Returns the integer division of two unsigned integers. Reverts with custom message on\\n * division by zero. The result is rounded towards zero.\\n *\\n * Counterpart to Solidity's `/` operator. Note: this function uses a\\n * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n * uses an invalid opcode to revert (consuming all remaining gas).\\n *\\n * Requirements:\\n *\\n * - The divisor cannot be zero.\\n */\\n function div(uint256 a, uint256 b, string memory errorMessage) internal returns (uint256) {\\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(b > 0, errorMessage);\\n uint256 c = a / b;\\n // assert(a == b * c + a % b); // There is no case in which this doesn't hold\\n\\n return c;\\n }\\n\\n /**\\n * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n * Reverts when dividing by zero.\\n *\\n * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n * opcode (which leaves remaining gas untouched) while Solidity uses an\\n * invalid opcode to revert (consuming all remaining gas).\\n *\\n * Requirements:\\n *\\n * - The divisor cannot be zero.\\n */\\n function mod(uint256 a, uint256 b) internal returns (uint256) {\\n return mod(a, b, \\\"Lib_SafeMathWrapper: modulo by zero\\\");\\n }\\n\\n /**\\n * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n * Reverts with custom message when dividing by zero.\\n *\\n * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n * opcode (which leaves remaining gas untouched) while Solidity uses an\\n * invalid opcode to revert (consuming all remaining gas).\\n *\\n * Requirements:\\n *\\n * - The divisor cannot be zero.\\n */\\n function mod(uint256 a, uint256 b, string memory errorMessage) internal returns (uint256) {\\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(b != 0, errorMessage);\\n return a % b;\\n }\\n}\",\"keccak256\":\"0xc58aa064894677f65fc8205f79252d15e59a0f5e2794e5c2d069c7b2bc97a9e2\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x60806040523480156200001157600080fd5b506040516200315338038062003153833981016040819052620000349162000067565b600080546001600160a01b0319166001600160a01b039590951694909417909355600191909155600255600355620000b2565b600080600080608085870312156200007d578384fd5b84516001600160a01b038116811462000094578485fd5b60208601516040870151606090970151919890975090945092505050565b61309180620000c26000396000f3fe608060405234801561001057600080fd5b50600436106101425760003560e01c8063876ed5cb116100b8578063cfdf677e1161007c578063cfdf677e1461023f578063d0f8934414610247578063e10d29ee1461024f578063e561dddc14610257578063f722b41a1461025f578063facdc5da1461026757610142565b8063876ed5cb146102175780638d38c6c11461021f578063b8f7700514610227578063c139eb151461022f578063c2cf696f1461023757610142565b80634de569ce1161010a5780634de569ce146101c25780635ae6256d146101e25780636fee07e0146101ea57806378f4b2f2146101ff5780637a167a8a146102075780637aa63a861461020f57610142565b8063138387a414610147578063299ca478146101655780632a7f18be1461017a578063378997701461019a578063461a4478146101af575b600080fd5b61014f61027a565b60405161015c91906124c7565b60405180910390f35b61016d610280565b60405161015c91906123eb565b61018d610188366004612388565b61028f565b60405161015c9190612e4e565b6101a26102b0565b60405161015c9190612e8d565b61016d6101bd36600461221b565b6102c4565b6101d56101d0366004612261565b6103a0565b60405161015c9190612484565b6101a26103da565b6101fd6101f8366004612188565b6103ee565b005b61014f61066d565b6101a2610674565b61014f610689565b61014f6106a4565b61014f6106aa565b6101a26106b0565b61014f6106c7565b61014f6106cd565b61016d6106d2565b6101fd6106f5565b61016d610b69565b61014f610b8c565b6101a2610c06565b6101fd610275366004612388565b610c1e565b60025481565b6000546001600160a01b031681565b610297611ed9565b6102a8826102a3610b69565b610c36565b90505b919050565b6000806102bb610d76565b50935050505090565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b8381101561032457818101518382015260200161030c565b50505050905090810190601f1680156103515780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561036e57600080fd5b505afa158015610382573d6000803e3d6000fd5b505050506040513d602081101561039857600080fd5b505192915050565b82516000901515600114156103c2576103bb85858585610e24565b90506103d2565b6103bb8585602001518585610fef565b949350505050565b6000806103e5610d76565b94505050505090565b61c3508151111561041a5760405162461bcd60e51b81526004016104119061259b565b60405180910390fd5b60035482111561043c5760405162461bcd60e51b8152600401610411906127a1565b620186a082101561045f5760405162461bcd60e51b815260040161041190612983565b6020820460005a90508181116104875760405162461bcd60e51b815260040161041190612b8a565b60005b825a8303101561049c5760010161048a565b6000338787876040516020016104b594939291906123ff565b60408051601f19818403018152919052805160209091012090504360281b421760006104df610b69565b60405163b298e36b60e01b81529091506001600160a01b0382169063b298e36b9061050e9086906004016124c7565b600060405180830381600087803b15801561052857600080fd5b505af115801561053c573d6000803e3d6000fd5b505060405163b298e36b60e01b81526001600160a01b038416925063b298e36b915061056c9085906004016124c7565b600060405180830381600087803b15801561058657600080fd5b505af115801561059a573d6000803e3d6000fd5b50505050600060016002836001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b1580156105dd57600080fd5b505afa1580156105f1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106159190612203565b8161061c57fe5b040390507f4b388aecf9fa6cc92253704e5975a6129a4f735bdbd99567df4ed0094ee4ceb5338b8b8b85426040516106599695949392919061243c565b60405180910390a150505050505050505050565b620186a081565b60008061067f610d76565b5090935050505090565b600080610694610d76565b50505064ffffffffff1692915050565b61c35081565b60035481565b60006106c26106bd610b69565b6110c4565b905090565b60015481565b602081565b60006106c2604051806060016040528060258152602001613003602591396102c4565b60043560d81c60093560e890811c90600c35901c610711610689565b8364ffffffffff16146107365760405162461bcd60e51b815260040161041190612a35565b6107646040518060400160405280600d81526020016c27ab26afa9b2b8bab2b731b2b960991b8152506102c4565b6001600160a01b0316336001600160a01b0316146107945760405162461bcd60e51b815260040161041190612a92565b60008162ffffff16116107b95760405162461bcd60e51b8152600401610411906127fe565b60008262ffffff16116107de5760405162461bcd60e51b815260040161041190612cdf565b600f601062ffffff8316020164ffffffffff81163610156108115760405162461bcd60e51b815260040161041190612d66565b600061081b610b69565b90506000610828826110c4565b9050600062ffffff8616368161083a57fe5b0460020267ffffffffffffffff8111801561085457600080fd5b506040519080825280601f01601f19166020018201604052801561087f576020820181803683370190505b50905060008662ffffff1667ffffffffffffffff811180156108a057600080fd5b506040519080825280602002602001820160405280156108ca578160200160208202803683370190505b50905060008060006108da610674565b90506108e4611ef9565b60005b8a62ffffff168163ffffffff161015610a3b57600061090b8263ffffffff16611147565b905063ffffffff82166109215761092181611197565b61092d8382868d611264565b80925060005b835163ffffffff821610156109b1578b3560e81c61c3508111156109695760405162461bcd60e51b81526004016104119061259b565b61097c858e64ffffffffff16838d6112cf565b898963ffffffff168151811061098e57fe5b60209081029190910101529b909b016003019a6001968701969586019501610933565b5060005b83602001518163ffffffff161015610a31578964ffffffffff168564ffffffffff16106109f45760405162461bcd60e51b815260040161041190612da8565b610a048564ffffffffff16611363565b888863ffffffff1681518110610a1657fe5b602090810291909101015260019687019694850194016109b5565b50506001016108e7565b50610a488183898b6113a8565b3664ffffffffff8a1614610a6e5760405162461bcd60e51b815260040161041190612846565b8a62ffffff168463ffffffff1614610a985760405162461bcd60e51b815260040161041190612894565b6000838c62ffffff160363ffffffff169050600080836020015160001415610acb57505060408201516060830151610af3565b6000610ae16001870364ffffffffff168d610c36565b90508060200151925080604001519150505b610b14610aff8961141b565b8f62ffffff168564ffffffffff16858561184f565b7f602f1aeac0ca2e7a13e281a9ef0ad7838542712ce16780fa2ecffd351f05f89983860384610b41610689565b604051610b5093929190612e9f565b60405180910390a1505050505050505050505050505050565b60006106c2604051806060016040528060238152602001612ee6602391396102c4565b6000610b966106d2565b6001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b158015610bce57600080fd5b505afa158015610be2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106c29190612203565b6000610c10610674565b610c186106b0565b03905090565b60405162461bcd60e51b81526004016104119061250b565b610c3e611ed9565b604051634a83e9cd60e11b815260028402906000906001600160a01b03851690639507d39a90610c72908590600401612e8d565b60206040518083038186803b158015610c8a57600080fd5b505afa158015610c9e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cc29190612203565b90506000846001600160a01b0316639507d39a846001016040518263ffffffff1660e01b8152600401610cf59190612e8d565b60206040518083038186803b158015610d0d57600080fd5b505afa158015610d21573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d459190612203565b6040805160608101825293845264ffffffffff828116602086015260289290921c9091169083015250949350505050565b6000806000806000610d866106d2565b6001600160a01b031663ccf8f9696040518163ffffffff1660e01b815260040160206040518083038186803b158015610dbe57600080fd5b505afa158015610dd2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610df691906121dd565b64ffffffffff602882901c811697605083901c82169750607883901c8216965060a09290921c169350915050565b600080610e5c6040518060400160405280601481526020017327ab26afa2bc32b1baba34b7b726b0b730b3b2b960611b8152506102c4565b90506000816001600160a01b0316631c4712a76040518163ffffffff1660e01b815260040160206040518083038186803b158015610e9957600080fd5b505afa158015610ead573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ed19190612203565b90506000610ede87611a02565b9050610eeb818787611a9b565b610f075760405162461bcd60e51b8152600401610411906126ca565b86606001518860200151148015610f22575060408701518851145b8015610f635750610f4a604051806060016040528060228152602001612f09602291396102c4565b6001600160a01b031688608001516001600160a01b0316145b8015610f725750818860a00151145b8015610f89575060608801516001600160a01b0316155b8015610fa45750600088604001516001811115610fa257fe5b145b8015610fc557508660800151805190602001208860c0015180519060200120145b610fe15760405162461bcd60e51b81526004016104119061276a565b506001979650505050505050565b600080610ffb85611363565b9050611008818585611a9b565b6110245760405162461bcd60e51b815260040161041190612c2a565b6000866060015187608001518860a001518960c0015160405160200161104d94939291906123ff565b60405160208183030381529060405280519060200120905060006110708761028f565b80519091508214801561108e57508751602082015164ffffffffff16145b80156110a857508760200151816040015164ffffffffff16145b610fe15760405162461bcd60e51b815260040161041190612adf565b60006002826001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b15801561110157600080fd5b505afa158015611115573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111399190612203565b8161114057fe5b0492915050565b61114f611ef9565b5060408051608081018252601092909202600f81013560e890811c84526012820135901c6020840152601581013560d890811c92840192909252601a0135901c606082015290565b60006111a1610689565b1115611211576000806111b2610d76565b9350935050508064ffffffffff16836060015110156111e35760405162461bcd60e51b815260040161041190612718565b8164ffffffffff168360400151101561120e5760405162461bcd60e51b8152600401610411906125f8565b50505b4260015482604001510110156112395760405162461bcd60e51b815260040161041190612d20565b4360025482606001510110156112615760405162461bcd60e51b815260040161041190612552565b50565b83604001518360400151101561128c5760405162461bcd60e51b815260040161041190612bd5565b8360600151836060015110156112b45760405162461bcd60e51b815260040161041190612df1565b6020830151156112c9576112c9838383611b8c565b50505050565b60008151836041011115611326578260410167ffffffffffffffff811180156112f757600080fd5b506040519080825280601f01601f191660200182016040528015611322576020820181803683370190505b5091505b6040850151606086015160006020850160018153836001820152826021820152866003890160418301376041870190209350505050949350505050565b60006102a86040518060a00160405280600015158152602001848152602001600081526020016000815260200160405180602001604052806000815250815250611c2d565b600083830364ffffffffff161180156113c357506020840151155b156113d3576113d3848483611b8c565b42846040015111156113f75760405162461bcd60e51b815260040161041190612b45565b43846060015111156112c95760405162461bcd60e51b815260040161041190612904565b60008082511161145c5760405162461bcd60e51b81526004018080602001828103825260348152602001806130286034913960400191505060405180910390fd5b815160011415611482578160008151811061147357fe5b602002602001015190506102ab565b60408051610200810182527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56381527f633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d60208201527f890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d818301527f3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd86060808301919091527fecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da60808301527fdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da560a08301527f617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d760c08301527f292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead60e08301527fe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e106101008301527f7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f826101208301527fe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e836365166101408301527f3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c6101608301527fad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e6101808301527fa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab6101a08301527f4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c8626101c08301527f2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf106101e083015282518381529081018352909160009190602082018180368337505085519192506000918291508180805b600184111561182b5750506002820460018084161460005b828110156117a7578a816002028151811061174e57fe5b602002602001015196508a816002026001018151811061176a57fe5b6020026020010151955086602089015285604089015287805190602001208b828151811061179457fe5b6020908102919091010152600101611737565b50801561180a578960018503815181106117bd57fe5b602002602001015195508783601081106117d357fe5b602002015160001b945085602088015284604088015286805190602001208a83815181106117fd57fe5b6020026020010181815250505b80611816576000611819565b60015b60ff168201935060019092019161171f565b8960008151811061183857fe5b602002602001015198505050505050505050919050565b60006118596106d2565b9050600080611866610d76565b50509150915060006040518060a00160405280856001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b1580156118b257600080fd5b505afa1580156118c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118ea9190612203565b81526020018a81526020018981526020018464ffffffffff16815260200160405180602001604052806000815250815250905080600001517f127186556e7be68c7e31263195225b4de02820707889540969f62c05cf73525e826020015183604001518460600151856080015160405161196794939291906124e6565b60405180910390a2600061197a82611c75565b90506000611992836040015186018a86018a8a611c9e565b60405163080549db60e21b81529091506001600160a01b03871690632015276c906119c390859085906004016124d0565b600060405180830381600087803b1580156119dd57600080fd5b505af11580156119f1573d6000803e3d6000fd5b505050505050505050505050505050565b6080810151805160009190826041820167ffffffffffffffff81118015611a2857600080fd5b506040519080825280601f01601f191660200182016040528015611a53576020820181803683370190505b5060408601516060870151919250906000602084016001815383600182015282602182015285604182018760208a0160045afa50604190950190942095505050505050919050565b6000611aa56106d2565b8351604051634a83e9cd60e11b81526001600160a01b039290921691639507d39a91611ad391600401612e7c565b60206040518083038186803b158015611aeb57600080fd5b505afa158015611aff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b239190612203565b611b2c84611c75565b14611b495760405162461bcd60e51b815260040161041190612b16565b611b66836020015185846000015185602001518760400151611cbd565b611b825760405162461bcd60e51b81526004016104119061294c565b5060019392505050565b6000611b9f8364ffffffffff1683610c36565b9050600154816020015164ffffffffff16014210611bcf5760405162461bcd60e51b815260040161041190612647565b806020015164ffffffffff1684604001511115611bfe5760405162461bcd60e51b8152600401610411906129cc565b806040015164ffffffffff16846060015111156112c95760405162461bcd60e51b815260040161041190612c74565b8051602080830151604080850151606086015160808701519251600096611c5896909594910161248f565b604051602081830303815290604052805190602001209050919050565b60008160200151826040015183606001518460800151604051602001611c5894939291906124e6565b602892831b9390931760509190911b1760789290921b91909117901b90565b6000808211611cfd5760405162461bcd60e51b8152600401808060200182810382526037815260200180612f7f6037913960400191505060405180910390fd5b818410611d3b5760405162461bcd60e51b8152600401808060200182810382526024815260200180612f2b6024913960400191505060405180910390fd5b611d4482611e42565b835114611d825760405162461bcd60e51b815260040180806020018281038252604d815260200180612fb6604d913960600191505060405180910390fd5b8460005b8451811015611e35578560011660011415611de457848181518110611da757fe5b6020026020010151826040516020018083815260200182815260200192505050604051602081830303815290604052805190602001209150611e29565b81858281518110611df157fe5b602002602001015160405160200180838152602001828152602001925050506040516020818303038152906040528051906020012091505b600195861c9501611d86565b5090951495945050505050565b6000808211611e825760405162461bcd60e51b8152600401808060200182810382526030815260200180612f4f6030913960400191505060405180910390fd5b8160011415611e93575060006102ab565b81600060805b60018110611ec3576000196001821b01811b831615611ebb5791821c91908101905b60011c611e99565b506001811b8414611ed2576001015b9392505050565b604080516060810182526000808252602082018190529181019190915290565b6040518060800160405280600081526020016000815260200160008152602001600081525090565b600067ffffffffffffffff831115611f3557fe5b611f48601f8401601f1916602001612ec1565b9050828152838383011115611f5c57600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b03811681146102ab57600080fd5b600082601f830112611f9a578081fd5b611ed283833560208501611f21565b8035600281106102ab57600080fd5b600060a08284031215611fc9578081fd5b60405160a0810167ffffffffffffffff8282108183111715611fe757fe5b8160405282935084358352602085013560208401526040850135604084015260608501356060840152608085013591508082111561202457600080fd5b5061203185828601611f8a565b6080830152505092915050565b60006040828403121561204f578081fd5b6040516040810167ffffffffffffffff828210818311171561206d57fe5b816040528293508435835260209150818501358181111561208d57600080fd5b8501601f8101871361209e57600080fd5b8035828111156120aa57fe5b83810292506120ba848401612ec1565b8181528481019083860185850187018b10156120d557600080fd5b600095505b838610156120f85780358352600195909501949186019186016120da565b5080868801525050505050505092915050565b600060a0828403121561211c578081fd5b60405160a0810167ffffffffffffffff828210818311171561213a57fe5b8160405282935084359150811515821461215357600080fd5b818352602085013560208401526040850135604084015260608501356060840152608085013591508082111561202457600080fd5b60008060006060848603121561219c578283fd5b6121a584611f73565b925060208401359150604084013567ffffffffffffffff8111156121c7578182fd5b6121d386828701611f8a565b9150509250925092565b6000602082840312156121ee578081fd5b815164ffffffffff1981168114611ed2578182fd5b600060208284031215612214578081fd5b5051919050565b60006020828403121561222c578081fd5b813567ffffffffffffffff811115612242578182fd5b8201601f81018413612252578182fd5b6103d284823560208401611f21565b60008060008060808587031215612276578081fd5b843567ffffffffffffffff8082111561228d578283fd5b9086019060e082890312156122a0578283fd5b6122aa60e0612ec1565b82358152602083013560208201526122c460408401611fa9565b60408201526122d560608401611f73565b60608201526122e660808401611f73565b608082015260a083013560a082015260c083013582811115612306578485fd5b6123128a828601611f8a565b60c0830152509550602087013591508082111561232d578283fd5b6123398883890161210b565b9450604087013591508082111561234e578283fd5b61235a88838901611fb8565b9350606087013591508082111561236f578283fd5b5061237c8782880161203e565b91505092959194509250565b600060208284031215612399578081fd5b5035919050565b60008151808452815b818110156123c5576020818501810151868301820152016123a9565b818111156123d65782602083870101525b50601f01601f19169290920160200192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612432908301846123a0565b9695505050505050565b6001600160a01b038781168252861660208201526040810185905260c06060820181905260009061246f908301866123a0565b60808301949094525060a00152949350505050565b901515815260200190565b6000861515825285602083015284604083015283606083015260a060808301526124bc60a08301846123a0565b979650505050505050565b90815260200190565b91825264ffffffffff1916602082015260400190565b60008582528460208301528360408301526080606083015261243260808301846123a0565b60208082526027908201527f617070656e64517565756542617463682069732063757272656e746c7920646960408201526639b0b13632b21760c91b606082015260800190565b60208082526029908201527f436f6e7465787420626c6f636b206e756d62657220746f6f2066617220696e206040820152683a3432903830b9ba1760b91b606082015260800190565b6020808252603d908201527f5472616e73616374696f6e20646174612073697a652065786365656473206d6160408201527f78696d756d20666f7220726f6c6c7570207472616e73616374696f6e2e000000606082015260800190565b6020808252602f908201527f436f6e746578742074696d657374616d70206973206c6f776572207468616e2060408201526e3630b9ba1039bab136b4ba3a32b21760891b606082015260800190565b6020808252605b908201527f50726576696f75736c7920656e7175657565642062617463686573206861766560408201527f206578706972656420616e64206d75737420626520617070656e64656420626560608201527f666f72652061206e65772073657175656e6365722062617463682e0000000000608082015260a00190565b6020808252602e908201527f496e76616c69642053657175656e636572207472616e73616374696f6e20696e60408201526d31b63ab9b4b7b710383937b7b31760911b606082015260800190565b60208082526032908201527f436f6e7465787420626c6f636b206e756d626572206973206c6f77657220746860408201527130b7103630b9ba1039bab136b4ba3a32b21760711b606082015260800190565b6020808252601e908201527f496e76616c69642053657175656e636572207472616e73616374696f6e2e0000604082015260600190565b6020808252603d908201527f5472616e73616374696f6e20676173206c696d69742065786365656473206d6160408201527f78696d756d20666f7220726f6c6c7570207472616e73616374696f6e2e000000606082015260800190565b60208082526028908201527f4d7573742070726f76696465206174206c65617374206f6e652062617463682060408201526731b7b73a32bc3a1760c11b606082015260800190565b6020808252602e908201527f4e6f7420616c6c2073657175656e636572207472616e73616374696f6e73207760408201526d32b93290383937b1b2b9b9b2b21760911b606082015260800190565b6020808252604a908201527f41637475616c207472616e73616374696f6e20696e64657820646f6573206e6f60408201527f74206d6174636820657870656374656420746f74616c20656c656d656e7473206060820152693a379030b83832b7321760b11b608082015260a00190565b60208082526028908201527f436f6e7465787420626c6f636b206e756d6265722069732066726f6d2074686560408201526710333aba3ab9329760c11b606082015260800190565b60208082526018908201527f496e76616c696420696e636c7573696f6e2070726f6f662e0000000000000000604082015260600190565b60208082526029908201527f5472616e73616374696f6e20676173206c696d697420746f6f206c6f7720746f6040820152681032b738bab2bab29760b91b606082015260800190565b60208082526043908201527f53657175656e636572207472616e73616374696f6e2074696d657374616d702060408201527f657863656564732074686174206f66206e65787420717565756520656c656d65606082015262373a1760e91b608082015260a00190565b6020808252603d908201527f41637475616c20626174636820737461727420696e64657820646f6573206e6f60408201527f74206d6174636820657870656374656420737461727420696e6465782e000000606082015260800190565b6020808252602d908201527f46756e6374696f6e2063616e206f6e6c792062652063616c6c6564206279207460408201526c34329029b2b8bab2b731b2b91760991b606082015260800190565b6020808252601a908201527f496e76616c6964205175657565207472616e73616374696f6e2e000000000000604082015260600190565b60208082526015908201527424b73b30b634b2103130ba31b4103432b0b232b91760591b604082015260600190565b60208082526025908201527f436f6e746578742074696d657374616d702069732066726f6d207468652066756040820152643a3ab9329760d91b606082015260800190565b6020808252602b908201527f496e73756666696369656e742067617320666f72204c322072617465206c696d60408201526a34ba34b73390313ab9371760a91b606082015260800190565b60208082526035908201527f436f6e746578742074696d657374616d702076616c756573206d757374206d6f6040820152743737ba37b734b1b0b6363c9034b731b932b0b9b29760591b606082015260800190565b6020808252602a908201527f496e76616c6964205175657565207472616e73616374696f6e20696e636c757360408201526934b7b710383937b7b31760b11b606082015260800190565b60208082526045908201527f53657175656e636572207472616e73616374696f6e20626c6f636b4e756d626560408201527f7220657863656564732074686174206f66206e65787420717565756520656c6560608201526436b2b73a1760d91b608082015260a00190565b60208082526021908201527f4d75737420617070656e64206174206c65617374206f6e6520656c656d656e746040820152601760f91b606082015260800190565b60208082526026908201527f436f6e746578742074696d657374616d7020746f6f2066617220696e20746865604082015265103830b9ba1760d11b606082015260800190565b60208082526022908201527f4e6f7420656e6f756768204261746368436f6e74657874732070726f76696465604082015261321760f11b606082015260800190565b60208082526029908201527f4e6f7420656e6f75676820717565756564207472616e73616374696f6e732074604082015268379030b83832b7321760b91b606082015260800190565b60208082526037908201527f436f6e7465787420626c6f636b4e756d6265722076616c756573206d7573742060408201527f6d6f6e6f746f6e6963616c6c7920696e6372656173652e000000000000000000606082015260800190565b8151815260208083015164ffffffffff90811691830191909152604092830151169181019190915260600190565b63ffffffff91909116815260200190565b64ffffffffff91909116815260200190565b64ffffffffff9384168152919092166020820152604081019190915260600190565b60405181810167ffffffffffffffff81118282101715612edd57fe5b60405291905056fe4f564d5f436861696e53746f72616765436f6e7461696e65723a4354433a71756575654f564d5f4465636f6d7072657373696f6e507265636f6d70696c65416464726573734c69625f4d65726b6c65547265653a20496e646578206f7574206f6620626f756e64732e4c69625f4d65726b6c65547265653a2043616e6e6f7420636f6d70757465206365696c286c6f675f3229206f6620302e4c69625f4d65726b6c65547265653a20546f74616c206c6561766573206d7573742062652067726561746572207468616e207a65726f2e4c69625f4d65726b6c65547265653a20546f74616c207369626c696e677320646f6573206e6f7420636f72726563746c7920636f72726573706f6e6420746f20746f74616c206c65617665732e4f564d5f436861696e53746f72616765436f6e7461696e65723a4354433a626174636865734c69625f4d65726b6c65547265653a204d7573742070726f76696465206174206c65617374206f6e65206c65616620686173682ea2646970667358221220d2749821a51ac153f6dd589822c218a2c3b2a43e2655d709f0c54d4ae38f16a964736f6c63430007060033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101425760003560e01c8063876ed5cb116100b8578063cfdf677e1161007c578063cfdf677e1461023f578063d0f8934414610247578063e10d29ee1461024f578063e561dddc14610257578063f722b41a1461025f578063facdc5da1461026757610142565b8063876ed5cb146102175780638d38c6c11461021f578063b8f7700514610227578063c139eb151461022f578063c2cf696f1461023757610142565b80634de569ce1161010a5780634de569ce146101c25780635ae6256d146101e25780636fee07e0146101ea57806378f4b2f2146101ff5780637a167a8a146102075780637aa63a861461020f57610142565b8063138387a414610147578063299ca478146101655780632a7f18be1461017a578063378997701461019a578063461a4478146101af575b600080fd5b61014f61027a565b60405161015c91906124c7565b60405180910390f35b61016d610280565b60405161015c91906123eb565b61018d610188366004612388565b61028f565b60405161015c9190612e4e565b6101a26102b0565b60405161015c9190612e8d565b61016d6101bd36600461221b565b6102c4565b6101d56101d0366004612261565b6103a0565b60405161015c9190612484565b6101a26103da565b6101fd6101f8366004612188565b6103ee565b005b61014f61066d565b6101a2610674565b61014f610689565b61014f6106a4565b61014f6106aa565b6101a26106b0565b61014f6106c7565b61014f6106cd565b61016d6106d2565b6101fd6106f5565b61016d610b69565b61014f610b8c565b6101a2610c06565b6101fd610275366004612388565b610c1e565b60025481565b6000546001600160a01b031681565b610297611ed9565b6102a8826102a3610b69565b610c36565b90505b919050565b6000806102bb610d76565b50935050505090565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b8381101561032457818101518382015260200161030c565b50505050905090810190601f1680156103515780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561036e57600080fd5b505afa158015610382573d6000803e3d6000fd5b505050506040513d602081101561039857600080fd5b505192915050565b82516000901515600114156103c2576103bb85858585610e24565b90506103d2565b6103bb8585602001518585610fef565b949350505050565b6000806103e5610d76565b94505050505090565b61c3508151111561041a5760405162461bcd60e51b81526004016104119061259b565b60405180910390fd5b60035482111561043c5760405162461bcd60e51b8152600401610411906127a1565b620186a082101561045f5760405162461bcd60e51b815260040161041190612983565b6020820460005a90508181116104875760405162461bcd60e51b815260040161041190612b8a565b60005b825a8303101561049c5760010161048a565b6000338787876040516020016104b594939291906123ff565b60408051601f19818403018152919052805160209091012090504360281b421760006104df610b69565b60405163b298e36b60e01b81529091506001600160a01b0382169063b298e36b9061050e9086906004016124c7565b600060405180830381600087803b15801561052857600080fd5b505af115801561053c573d6000803e3d6000fd5b505060405163b298e36b60e01b81526001600160a01b038416925063b298e36b915061056c9085906004016124c7565b600060405180830381600087803b15801561058657600080fd5b505af115801561059a573d6000803e3d6000fd5b50505050600060016002836001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b1580156105dd57600080fd5b505afa1580156105f1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106159190612203565b8161061c57fe5b040390507f4b388aecf9fa6cc92253704e5975a6129a4f735bdbd99567df4ed0094ee4ceb5338b8b8b85426040516106599695949392919061243c565b60405180910390a150505050505050505050565b620186a081565b60008061067f610d76565b5090935050505090565b600080610694610d76565b50505064ffffffffff1692915050565b61c35081565b60035481565b60006106c26106bd610b69565b6110c4565b905090565b60015481565b602081565b60006106c2604051806060016040528060258152602001613003602591396102c4565b60043560d81c60093560e890811c90600c35901c610711610689565b8364ffffffffff16146107365760405162461bcd60e51b815260040161041190612a35565b6107646040518060400160405280600d81526020016c27ab26afa9b2b8bab2b731b2b960991b8152506102c4565b6001600160a01b0316336001600160a01b0316146107945760405162461bcd60e51b815260040161041190612a92565b60008162ffffff16116107b95760405162461bcd60e51b8152600401610411906127fe565b60008262ffffff16116107de5760405162461bcd60e51b815260040161041190612cdf565b600f601062ffffff8316020164ffffffffff81163610156108115760405162461bcd60e51b815260040161041190612d66565b600061081b610b69565b90506000610828826110c4565b9050600062ffffff8616368161083a57fe5b0460020267ffffffffffffffff8111801561085457600080fd5b506040519080825280601f01601f19166020018201604052801561087f576020820181803683370190505b50905060008662ffffff1667ffffffffffffffff811180156108a057600080fd5b506040519080825280602002602001820160405280156108ca578160200160208202803683370190505b50905060008060006108da610674565b90506108e4611ef9565b60005b8a62ffffff168163ffffffff161015610a3b57600061090b8263ffffffff16611147565b905063ffffffff82166109215761092181611197565b61092d8382868d611264565b80925060005b835163ffffffff821610156109b1578b3560e81c61c3508111156109695760405162461bcd60e51b81526004016104119061259b565b61097c858e64ffffffffff16838d6112cf565b898963ffffffff168151811061098e57fe5b60209081029190910101529b909b016003019a6001968701969586019501610933565b5060005b83602001518163ffffffff161015610a31578964ffffffffff168564ffffffffff16106109f45760405162461bcd60e51b815260040161041190612da8565b610a048564ffffffffff16611363565b888863ffffffff1681518110610a1657fe5b602090810291909101015260019687019694850194016109b5565b50506001016108e7565b50610a488183898b6113a8565b3664ffffffffff8a1614610a6e5760405162461bcd60e51b815260040161041190612846565b8a62ffffff168463ffffffff1614610a985760405162461bcd60e51b815260040161041190612894565b6000838c62ffffff160363ffffffff169050600080836020015160001415610acb57505060408201516060830151610af3565b6000610ae16001870364ffffffffff168d610c36565b90508060200151925080604001519150505b610b14610aff8961141b565b8f62ffffff168564ffffffffff16858561184f565b7f602f1aeac0ca2e7a13e281a9ef0ad7838542712ce16780fa2ecffd351f05f89983860384610b41610689565b604051610b5093929190612e9f565b60405180910390a1505050505050505050505050505050565b60006106c2604051806060016040528060238152602001612ee6602391396102c4565b6000610b966106d2565b6001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b158015610bce57600080fd5b505afa158015610be2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106c29190612203565b6000610c10610674565b610c186106b0565b03905090565b60405162461bcd60e51b81526004016104119061250b565b610c3e611ed9565b604051634a83e9cd60e11b815260028402906000906001600160a01b03851690639507d39a90610c72908590600401612e8d565b60206040518083038186803b158015610c8a57600080fd5b505afa158015610c9e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cc29190612203565b90506000846001600160a01b0316639507d39a846001016040518263ffffffff1660e01b8152600401610cf59190612e8d565b60206040518083038186803b158015610d0d57600080fd5b505afa158015610d21573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d459190612203565b6040805160608101825293845264ffffffffff828116602086015260289290921c9091169083015250949350505050565b6000806000806000610d866106d2565b6001600160a01b031663ccf8f9696040518163ffffffff1660e01b815260040160206040518083038186803b158015610dbe57600080fd5b505afa158015610dd2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610df691906121dd565b64ffffffffff602882901c811697605083901c82169750607883901c8216965060a09290921c169350915050565b600080610e5c6040518060400160405280601481526020017327ab26afa2bc32b1baba34b7b726b0b730b3b2b960611b8152506102c4565b90506000816001600160a01b0316631c4712a76040518163ffffffff1660e01b815260040160206040518083038186803b158015610e9957600080fd5b505afa158015610ead573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ed19190612203565b90506000610ede87611a02565b9050610eeb818787611a9b565b610f075760405162461bcd60e51b8152600401610411906126ca565b86606001518860200151148015610f22575060408701518851145b8015610f635750610f4a604051806060016040528060228152602001612f09602291396102c4565b6001600160a01b031688608001516001600160a01b0316145b8015610f725750818860a00151145b8015610f89575060608801516001600160a01b0316155b8015610fa45750600088604001516001811115610fa257fe5b145b8015610fc557508660800151805190602001208860c0015180519060200120145b610fe15760405162461bcd60e51b81526004016104119061276a565b506001979650505050505050565b600080610ffb85611363565b9050611008818585611a9b565b6110245760405162461bcd60e51b815260040161041190612c2a565b6000866060015187608001518860a001518960c0015160405160200161104d94939291906123ff565b60405160208183030381529060405280519060200120905060006110708761028f565b80519091508214801561108e57508751602082015164ffffffffff16145b80156110a857508760200151816040015164ffffffffff16145b610fe15760405162461bcd60e51b815260040161041190612adf565b60006002826001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b15801561110157600080fd5b505afa158015611115573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111399190612203565b8161114057fe5b0492915050565b61114f611ef9565b5060408051608081018252601092909202600f81013560e890811c84526012820135901c6020840152601581013560d890811c92840192909252601a0135901c606082015290565b60006111a1610689565b1115611211576000806111b2610d76565b9350935050508064ffffffffff16836060015110156111e35760405162461bcd60e51b815260040161041190612718565b8164ffffffffff168360400151101561120e5760405162461bcd60e51b8152600401610411906125f8565b50505b4260015482604001510110156112395760405162461bcd60e51b815260040161041190612d20565b4360025482606001510110156112615760405162461bcd60e51b815260040161041190612552565b50565b83604001518360400151101561128c5760405162461bcd60e51b815260040161041190612bd5565b8360600151836060015110156112b45760405162461bcd60e51b815260040161041190612df1565b6020830151156112c9576112c9838383611b8c565b50505050565b60008151836041011115611326578260410167ffffffffffffffff811180156112f757600080fd5b506040519080825280601f01601f191660200182016040528015611322576020820181803683370190505b5091505b6040850151606086015160006020850160018153836001820152826021820152866003890160418301376041870190209350505050949350505050565b60006102a86040518060a00160405280600015158152602001848152602001600081526020016000815260200160405180602001604052806000815250815250611c2d565b600083830364ffffffffff161180156113c357506020840151155b156113d3576113d3848483611b8c565b42846040015111156113f75760405162461bcd60e51b815260040161041190612b45565b43846060015111156112c95760405162461bcd60e51b815260040161041190612904565b60008082511161145c5760405162461bcd60e51b81526004018080602001828103825260348152602001806130286034913960400191505060405180910390fd5b815160011415611482578160008151811061147357fe5b602002602001015190506102ab565b60408051610200810182527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56381527f633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d60208201527f890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d818301527f3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd86060808301919091527fecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da60808301527fdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da560a08301527f617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d760c08301527f292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead60e08301527fe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e106101008301527f7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f826101208301527fe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e836365166101408301527f3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c6101608301527fad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e6101808301527fa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab6101a08301527f4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c8626101c08301527f2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf106101e083015282518381529081018352909160009190602082018180368337505085519192506000918291508180805b600184111561182b5750506002820460018084161460005b828110156117a7578a816002028151811061174e57fe5b602002602001015196508a816002026001018151811061176a57fe5b6020026020010151955086602089015285604089015287805190602001208b828151811061179457fe5b6020908102919091010152600101611737565b50801561180a578960018503815181106117bd57fe5b602002602001015195508783601081106117d357fe5b602002015160001b945085602088015284604088015286805190602001208a83815181106117fd57fe5b6020026020010181815250505b80611816576000611819565b60015b60ff168201935060019092019161171f565b8960008151811061183857fe5b602002602001015198505050505050505050919050565b60006118596106d2565b9050600080611866610d76565b50509150915060006040518060a00160405280856001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b1580156118b257600080fd5b505afa1580156118c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118ea9190612203565b81526020018a81526020018981526020018464ffffffffff16815260200160405180602001604052806000815250815250905080600001517f127186556e7be68c7e31263195225b4de02820707889540969f62c05cf73525e826020015183604001518460600151856080015160405161196794939291906124e6565b60405180910390a2600061197a82611c75565b90506000611992836040015186018a86018a8a611c9e565b60405163080549db60e21b81529091506001600160a01b03871690632015276c906119c390859085906004016124d0565b600060405180830381600087803b1580156119dd57600080fd5b505af11580156119f1573d6000803e3d6000fd5b505050505050505050505050505050565b6080810151805160009190826041820167ffffffffffffffff81118015611a2857600080fd5b506040519080825280601f01601f191660200182016040528015611a53576020820181803683370190505b5060408601516060870151919250906000602084016001815383600182015282602182015285604182018760208a0160045afa50604190950190942095505050505050919050565b6000611aa56106d2565b8351604051634a83e9cd60e11b81526001600160a01b039290921691639507d39a91611ad391600401612e7c565b60206040518083038186803b158015611aeb57600080fd5b505afa158015611aff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b239190612203565b611b2c84611c75565b14611b495760405162461bcd60e51b815260040161041190612b16565b611b66836020015185846000015185602001518760400151611cbd565b611b825760405162461bcd60e51b81526004016104119061294c565b5060019392505050565b6000611b9f8364ffffffffff1683610c36565b9050600154816020015164ffffffffff16014210611bcf5760405162461bcd60e51b815260040161041190612647565b806020015164ffffffffff1684604001511115611bfe5760405162461bcd60e51b8152600401610411906129cc565b806040015164ffffffffff16846060015111156112c95760405162461bcd60e51b815260040161041190612c74565b8051602080830151604080850151606086015160808701519251600096611c5896909594910161248f565b604051602081830303815290604052805190602001209050919050565b60008160200151826040015183606001518460800151604051602001611c5894939291906124e6565b602892831b9390931760509190911b1760789290921b91909117901b90565b6000808211611cfd5760405162461bcd60e51b8152600401808060200182810382526037815260200180612f7f6037913960400191505060405180910390fd5b818410611d3b5760405162461bcd60e51b8152600401808060200182810382526024815260200180612f2b6024913960400191505060405180910390fd5b611d4482611e42565b835114611d825760405162461bcd60e51b815260040180806020018281038252604d815260200180612fb6604d913960600191505060405180910390fd5b8460005b8451811015611e35578560011660011415611de457848181518110611da757fe5b6020026020010151826040516020018083815260200182815260200192505050604051602081830303815290604052805190602001209150611e29565b81858281518110611df157fe5b602002602001015160405160200180838152602001828152602001925050506040516020818303038152906040528051906020012091505b600195861c9501611d86565b5090951495945050505050565b6000808211611e825760405162461bcd60e51b8152600401808060200182810382526030815260200180612f4f6030913960400191505060405180910390fd5b8160011415611e93575060006102ab565b81600060805b60018110611ec3576000196001821b01811b831615611ebb5791821c91908101905b60011c611e99565b506001811b8414611ed2576001015b9392505050565b604080516060810182526000808252602082018190529181019190915290565b6040518060800160405280600081526020016000815260200160008152602001600081525090565b600067ffffffffffffffff831115611f3557fe5b611f48601f8401601f1916602001612ec1565b9050828152838383011115611f5c57600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b03811681146102ab57600080fd5b600082601f830112611f9a578081fd5b611ed283833560208501611f21565b8035600281106102ab57600080fd5b600060a08284031215611fc9578081fd5b60405160a0810167ffffffffffffffff8282108183111715611fe757fe5b8160405282935084358352602085013560208401526040850135604084015260608501356060840152608085013591508082111561202457600080fd5b5061203185828601611f8a565b6080830152505092915050565b60006040828403121561204f578081fd5b6040516040810167ffffffffffffffff828210818311171561206d57fe5b816040528293508435835260209150818501358181111561208d57600080fd5b8501601f8101871361209e57600080fd5b8035828111156120aa57fe5b83810292506120ba848401612ec1565b8181528481019083860185850187018b10156120d557600080fd5b600095505b838610156120f85780358352600195909501949186019186016120da565b5080868801525050505050505092915050565b600060a0828403121561211c578081fd5b60405160a0810167ffffffffffffffff828210818311171561213a57fe5b8160405282935084359150811515821461215357600080fd5b818352602085013560208401526040850135604084015260608501356060840152608085013591508082111561202457600080fd5b60008060006060848603121561219c578283fd5b6121a584611f73565b925060208401359150604084013567ffffffffffffffff8111156121c7578182fd5b6121d386828701611f8a565b9150509250925092565b6000602082840312156121ee578081fd5b815164ffffffffff1981168114611ed2578182fd5b600060208284031215612214578081fd5b5051919050565b60006020828403121561222c578081fd5b813567ffffffffffffffff811115612242578182fd5b8201601f81018413612252578182fd5b6103d284823560208401611f21565b60008060008060808587031215612276578081fd5b843567ffffffffffffffff8082111561228d578283fd5b9086019060e082890312156122a0578283fd5b6122aa60e0612ec1565b82358152602083013560208201526122c460408401611fa9565b60408201526122d560608401611f73565b60608201526122e660808401611f73565b608082015260a083013560a082015260c083013582811115612306578485fd5b6123128a828601611f8a565b60c0830152509550602087013591508082111561232d578283fd5b6123398883890161210b565b9450604087013591508082111561234e578283fd5b61235a88838901611fb8565b9350606087013591508082111561236f578283fd5b5061237c8782880161203e565b91505092959194509250565b600060208284031215612399578081fd5b5035919050565b60008151808452815b818110156123c5576020818501810151868301820152016123a9565b818111156123d65782602083870101525b50601f01601f19169290920160200192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612432908301846123a0565b9695505050505050565b6001600160a01b038781168252861660208201526040810185905260c06060820181905260009061246f908301866123a0565b60808301949094525060a00152949350505050565b901515815260200190565b6000861515825285602083015284604083015283606083015260a060808301526124bc60a08301846123a0565b979650505050505050565b90815260200190565b91825264ffffffffff1916602082015260400190565b60008582528460208301528360408301526080606083015261243260808301846123a0565b60208082526027908201527f617070656e64517565756542617463682069732063757272656e746c7920646960408201526639b0b13632b21760c91b606082015260800190565b60208082526029908201527f436f6e7465787420626c6f636b206e756d62657220746f6f2066617220696e206040820152683a3432903830b9ba1760b91b606082015260800190565b6020808252603d908201527f5472616e73616374696f6e20646174612073697a652065786365656473206d6160408201527f78696d756d20666f7220726f6c6c7570207472616e73616374696f6e2e000000606082015260800190565b6020808252602f908201527f436f6e746578742074696d657374616d70206973206c6f776572207468616e2060408201526e3630b9ba1039bab136b4ba3a32b21760891b606082015260800190565b6020808252605b908201527f50726576696f75736c7920656e7175657565642062617463686573206861766560408201527f206578706972656420616e64206d75737420626520617070656e64656420626560608201527f666f72652061206e65772073657175656e6365722062617463682e0000000000608082015260a00190565b6020808252602e908201527f496e76616c69642053657175656e636572207472616e73616374696f6e20696e60408201526d31b63ab9b4b7b710383937b7b31760911b606082015260800190565b60208082526032908201527f436f6e7465787420626c6f636b206e756d626572206973206c6f77657220746860408201527130b7103630b9ba1039bab136b4ba3a32b21760711b606082015260800190565b6020808252601e908201527f496e76616c69642053657175656e636572207472616e73616374696f6e2e0000604082015260600190565b6020808252603d908201527f5472616e73616374696f6e20676173206c696d69742065786365656473206d6160408201527f78696d756d20666f7220726f6c6c7570207472616e73616374696f6e2e000000606082015260800190565b60208082526028908201527f4d7573742070726f76696465206174206c65617374206f6e652062617463682060408201526731b7b73a32bc3a1760c11b606082015260800190565b6020808252602e908201527f4e6f7420616c6c2073657175656e636572207472616e73616374696f6e73207760408201526d32b93290383937b1b2b9b9b2b21760911b606082015260800190565b6020808252604a908201527f41637475616c207472616e73616374696f6e20696e64657820646f6573206e6f60408201527f74206d6174636820657870656374656420746f74616c20656c656d656e7473206060820152693a379030b83832b7321760b11b608082015260a00190565b60208082526028908201527f436f6e7465787420626c6f636b206e756d6265722069732066726f6d2074686560408201526710333aba3ab9329760c11b606082015260800190565b60208082526018908201527f496e76616c696420696e636c7573696f6e2070726f6f662e0000000000000000604082015260600190565b60208082526029908201527f5472616e73616374696f6e20676173206c696d697420746f6f206c6f7720746f6040820152681032b738bab2bab29760b91b606082015260800190565b60208082526043908201527f53657175656e636572207472616e73616374696f6e2074696d657374616d702060408201527f657863656564732074686174206f66206e65787420717565756520656c656d65606082015262373a1760e91b608082015260a00190565b6020808252603d908201527f41637475616c20626174636820737461727420696e64657820646f6573206e6f60408201527f74206d6174636820657870656374656420737461727420696e6465782e000000606082015260800190565b6020808252602d908201527f46756e6374696f6e2063616e206f6e6c792062652063616c6c6564206279207460408201526c34329029b2b8bab2b731b2b91760991b606082015260800190565b6020808252601a908201527f496e76616c6964205175657565207472616e73616374696f6e2e000000000000604082015260600190565b60208082526015908201527424b73b30b634b2103130ba31b4103432b0b232b91760591b604082015260600190565b60208082526025908201527f436f6e746578742074696d657374616d702069732066726f6d207468652066756040820152643a3ab9329760d91b606082015260800190565b6020808252602b908201527f496e73756666696369656e742067617320666f72204c322072617465206c696d60408201526a34ba34b73390313ab9371760a91b606082015260800190565b60208082526035908201527f436f6e746578742074696d657374616d702076616c756573206d757374206d6f6040820152743737ba37b734b1b0b6363c9034b731b932b0b9b29760591b606082015260800190565b6020808252602a908201527f496e76616c6964205175657565207472616e73616374696f6e20696e636c757360408201526934b7b710383937b7b31760b11b606082015260800190565b60208082526045908201527f53657175656e636572207472616e73616374696f6e20626c6f636b4e756d626560408201527f7220657863656564732074686174206f66206e65787420717565756520656c6560608201526436b2b73a1760d91b608082015260a00190565b60208082526021908201527f4d75737420617070656e64206174206c65617374206f6e6520656c656d656e746040820152601760f91b606082015260800190565b60208082526026908201527f436f6e746578742074696d657374616d7020746f6f2066617220696e20746865604082015265103830b9ba1760d11b606082015260800190565b60208082526022908201527f4e6f7420656e6f756768204261746368436f6e74657874732070726f76696465604082015261321760f11b606082015260800190565b60208082526029908201527f4e6f7420656e6f75676820717565756564207472616e73616374696f6e732074604082015268379030b83832b7321760b91b606082015260800190565b60208082526037908201527f436f6e7465787420626c6f636b4e756d6265722076616c756573206d7573742060408201527f6d6f6e6f746f6e6963616c6c7920696e6372656173652e000000000000000000606082015260800190565b8151815260208083015164ffffffffff90811691830191909152604092830151169181019190915260600190565b63ffffffff91909116815260200190565b64ffffffffff91909116815260200190565b64ffffffffff9384168152919092166020820152604081019190915260600190565b60405181810167ffffffffffffffff81118282101715612edd57fe5b60405291905056fe4f564d5f436861696e53746f72616765436f6e7461696e65723a4354433a71756575654f564d5f4465636f6d7072657373696f6e507265636f6d70696c65416464726573734c69625f4d65726b6c65547265653a20496e646578206f7574206f6620626f756e64732e4c69625f4d65726b6c65547265653a2043616e6e6f7420636f6d70757465206365696c286c6f675f3229206f6620302e4c69625f4d65726b6c65547265653a20546f74616c206c6561766573206d7573742062652067726561746572207468616e207a65726f2e4c69625f4d65726b6c65547265653a20546f74616c207369626c696e677320646f6573206e6f7420636f72726563746c7920636f72726573706f6e6420746f20746f74616c206c65617665732e4f564d5f436861696e53746f72616765436f6e7461696e65723a4354433a626174636865734c69625f4d65726b6c65547265653a204d7573742070726f76696465206174206c65617374206f6e65206c65616620686173682ea2646970667358221220d2749821a51ac153f6dd589822c218a2c3b2a43e2655d709f0c54d4ae38f16a964736f6c63430007060033", - "devdoc": { - "details": "The Canonical Transaction Chain (CTC) contract is an append-only log of transactions which must be applied to the rollup state. It defines the ordering of rollup transactions by writing them to the 'CTC:batches' instance of the Chain Storage Container. The CTC also allows any account to 'enqueue' an L2 transaction, which will require that the Sequencer will eventually append it to the rollup state. If the Sequencer does not include an enqueued transaction within the 'force inclusion period', then any account may force it to be included by calling appendQueueBatch(). Compiler used: solc Runtime target: EVM", - "kind": "dev", - "methods": { - "appendSequencerBatch()": { - "details": "This function uses a custom encoding scheme for efficiency reasons. .param _shouldStartAtElement Specific batch we expect to start appending to. .param _totalElementsToAppend Total number of batch elements we expect to append. .param _contexts Array of batch contexts. .param _transactionDataFields Array of raw transaction data." - }, - "batches()": { - "returns": { - "_0": "Reference to the batch storage container." - } - }, - "enqueue(address,uint256,bytes)": { - "params": { - "_data": "Transaction data.", - "_gasLimit": "Gas limit for the enqueued L2 transaction.", - "_target": "Target L2 contract to send the transaction to." - } - }, - "getLastBlockNumber()": { - "returns": { - "_0": "Blocknumber for the last transaction." - } - }, - "getLastTimestamp()": { - "returns": { - "_0": "Timestamp for the last transaction." - } - }, - "getNextQueueIndex()": { - "returns": { - "_0": "Index for the next queue element." - } - }, - "getNumPendingQueueElements()": { - "returns": { - "_0": "Number of pending queue elements." - } - }, - "getQueueElement(uint256)": { - "params": { - "_index": "Index of the queue element to access." - }, - "returns": { - "_element": "Queue element at the given index." - } - }, - "getQueueLength()": { - "returns": { - "_0": "Length of the queue." - } - }, - "getTotalBatches()": { - "returns": { - "_totalBatches": "Total submitted batches." - } - }, - "getTotalElements()": { - "returns": { - "_totalElements": "Total submitted elements." - } - }, - "queue()": { - "returns": { - "_0": "Reference to the queue storage container." - } - }, - "resolve(string)": { - "params": { - "_name": "Name to resolve an address for." - }, - "returns": { - "_0": "Address associated with the given name." - } - }, - "verifyTransaction((uint256,uint256,uint8,address,address,uint256,bytes),(bool,uint256,uint256,uint256,bytes),(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))": { - "params": { - "_batchHeader": "Header of the batch the transaction was included in.", - "_inclusionProof": "Inclusion proof for the provided transaction chain element.", - "_transaction": "Transaction to verify.", - "_txChainElement": "Transaction chain element corresponding to the transaction." - }, - "returns": { - "_0": "True if the transaction exists in the CTC, false if not." - } - } - }, - "title": "OVM_CanonicalTransactionChain", - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": { - "appendQueueBatch(uint256)": { - "notice": "Appends a given number of queued transactions as a single batch. param _numQueuedTransactions Number of transactions to append." - }, - "appendSequencerBatch()": { - "notice": "Allows the sequencer to append a batch of transactions." - }, - "batches()": { - "notice": "Accesses the batch storage container." - }, - "enqueue(address,uint256,bytes)": { - "notice": "Adds a transaction to the queue." - }, - "getLastBlockNumber()": { - "notice": "Returns the blocknumber of the last transaction." - }, - "getLastTimestamp()": { - "notice": "Returns the timestamp of the last transaction." - }, - "getNextQueueIndex()": { - "notice": "Returns the index of the next element to be enqueued." - }, - "getNumPendingQueueElements()": { - "notice": "Get the number of queue elements which have not yet been included." - }, - "getQueueElement(uint256)": { - "notice": "Gets the queue element at a particular index." - }, - "getQueueLength()": { - "notice": "Retrieves the length of the queue, including both pending and canonical transactions." - }, - "getTotalBatches()": { - "notice": "Retrieves the total number of batches submitted." - }, - "getTotalElements()": { - "notice": "Retrieves the total number of elements submitted." - }, - "queue()": { - "notice": "Accesses the queue storage container." - }, - "resolve(string)": { - "notice": "Resolves the address associated with a given name." - }, - "verifyTransaction((uint256,uint256,uint8,address,address,uint256,bytes),(bool,uint256,uint256,uint256,bytes),(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))": { - "notice": "Verifies whether a transaction is included in the chain." - } - }, - "version": 1 - }, - "storageLayout": { - "storage": [ - { - "astId": 12557, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_CanonicalTransactionChain.sol:OVM_CanonicalTransactionChain", - "label": "libAddressManager", - "offset": 0, - "slot": "0", - "type": "t_contract(Lib_AddressManager)12550" - }, - { - "astId": 2249, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_CanonicalTransactionChain.sol:OVM_CanonicalTransactionChain", - "label": "forceInclusionPeriodSeconds", - "offset": 0, - "slot": "1", - "type": "t_uint256" - }, - { - "astId": 2251, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_CanonicalTransactionChain.sol:OVM_CanonicalTransactionChain", - "label": "forceInclusionPeriodBlocks", - "offset": 0, - "slot": "2", - "type": "t_uint256" - }, - { - "astId": 2253, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_CanonicalTransactionChain.sol:OVM_CanonicalTransactionChain", - "label": "maxTransactionGasLimit", - "offset": 0, - "slot": "3", - "type": "t_uint256" - } - ], - "types": { - "t_contract(Lib_AddressManager)12550": { - "encoding": "inplace", - "label": "contract Lib_AddressManager", - "numberOfBytes": "20" - }, - "t_uint256": { - "encoding": "inplace", - "label": "uint256", - "numberOfBytes": "32" - } - } - } -} \ No newline at end of file diff --git a/packages/contracts/deployments/goerli-v2/OVM_ChainStorageContainer-CTC-batches.json b/packages/contracts/deployments/goerli-v2/OVM_ChainStorageContainer-CTC-batches.json deleted file mode 100644 index 6040fc165e8c2..0000000000000 --- a/packages/contracts/deployments/goerli-v2/OVM_ChainStorageContainer-CTC-batches.json +++ /dev/null @@ -1,453 +0,0 @@ -{ - "address": "0x648D625eCa2A2491547d2D702e21070675518E4a", - "abi": [ - { - "inputs": [ - { - "internalType": "address", - "name": "_libAddressManager", - "type": "address" - }, - { - "internalType": "string", - "name": "_owner", - "type": "string" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_index", - "type": "uint256" - }, - { - "internalType": "bytes27", - "name": "_globalMetadata", - "type": "bytes27" - } - ], - "name": "deleteElementsAfterInclusive", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_index", - "type": "uint256" - } - ], - "name": "deleteElementsAfterInclusive", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_index", - "type": "uint256" - } - ], - "name": "get", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getGlobalMetadata", - "outputs": [ - { - "internalType": "bytes27", - "name": "", - "type": "bytes27" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "length", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "libAddressManager", - "outputs": [ - { - "internalType": "contract Lib_AddressManager", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "owner", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "_object", - "type": "bytes32" - }, - { - "internalType": "bytes27", - "name": "_globalMetadata", - "type": "bytes27" - } - ], - "name": "push", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "_object", - "type": "bytes32" - } - ], - "name": "push", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "string", - "name": "_name", - "type": "string" - } - ], - "name": "resolve", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes27", - "name": "_globalMetadata", - "type": "bytes27" - } - ], - "name": "setGlobalMetadata", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_index", - "type": "uint256" - } - ], - "name": "setNextOverwritableIndex", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - } - ], - "transactionHash": "0xadaaf35e504173951b2e70b000d79d614c2c32e53b54f953d2b17fa602056224", - "receipt": { - "to": null, - "from": "0x558ba9b8d78713fbf768c1f8a584485B4003f43F", - "contractAddress": "0x648D625eCa2A2491547d2D702e21070675518E4a", - "transactionIndex": 23, - "gasUsed": "971002", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0xa64531779337b0b8f20acdfb177dc30bd463d8c4354133e5f71b1a60a44e2e22", - "transactionHash": "0xadaaf35e504173951b2e70b000d79d614c2c32e53b54f953d2b17fa602056224", - "logs": [], - "blockNumber": 4607692, - "cumulativeGasUsed": "4087204", - "status": 1, - "byzantium": true - }, - "args": [ - "0x9933d137bBF050Cf3D7555fE1beC91eF698814e5", - "OVM_CanonicalTransactionChain" - ], - "solcInputHash": "8aef3555d89ad9d3af2f5d28a85dc856", - "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_owner\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"get\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getGlobalMetadata\",\"outputs\":[{\"internalType\":\"bytes27\",\"name\":\"\",\"type\":\"bytes27\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"length\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"setGlobalMetadata\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"setNextOverwritableIndex\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The Chain Storage Container provides its owner contract with read, write and delete functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which can no longer be used in a fraud proof due to the fraud window having passed, and the associated chain state or transactions being finalized. Three distinct Chain Storage Containers will be deployed on Layer 1: 1. Stores transaction batches for the Canonical Transaction Chain 2. Stores queued transactions for the Canonical Transaction Chain 3. Stores chain state batches for the State Commitment Chain Compiler used: solc Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\",\"_owner\":\"Name of the contract that owns this container (will be resolved later).\"}},\"deleteElementsAfterInclusive(uint256)\":{\"params\":{\"_index\":\"Object index to delete from.\"}},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_index\":\"Object index to delete from.\"}},\"get(uint256)\":{\"params\":{\"_index\":\"Index of the particular object to access.\"},\"returns\":{\"_0\":\"32 byte object value.\"}},\"getGlobalMetadata()\":{\"returns\":{\"_0\":\"Container global metadata field.\"}},\"length()\":{\"returns\":{\"_0\":\"Number of objects in the container.\"}},\"push(bytes32)\":{\"params\":{\"_object\":\"A 32 byte value to insert into the container.\"}},\"push(bytes32,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_object\":\"A 32 byte value to insert into the container.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}},\"setGlobalMetadata(bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata to set.\"}}},\"title\":\"OVM_ChainStorageContainer\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"deleteElementsAfterInclusive(uint256)\":{\"notice\":\"Removes all objects after and including a given index.\"},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"notice\":\"Removes all objects after and including a given index. Also allows setting the global metadata field.\"},\"get(uint256)\":{\"notice\":\"Retrieves an object from the container.\"},\"getGlobalMetadata()\":{\"notice\":\"Retrieves the container's global metadata field.\"},\"length()\":{\"notice\":\"Retrieves the number of objects stored in the container.\"},\"push(bytes32)\":{\"notice\":\"Pushes an object into the container.\"},\"push(bytes32,bytes27)\":{\"notice\":\"Pushes an object into the container. Function allows setting the global metadata since we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global metadata (it's an optimization).\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"},\"setGlobalMetadata(bytes27)\":{\"notice\":\"Sets the container's global metadata field. We're using `bytes27` here because we use five bytes to maintain the length of the underlying data structure, meaning we have an extra 27 bytes to store arbitrary data.\"},\"setNextOverwritableIndex(uint256)\":{\"notice\":\"Marks an index as overwritable, meaing the underlying buffer can start to write values over any objects before and including the given index.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol\":\"OVM_ChainStorageContainer\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_RingBuffer } from \\\"../../libraries/utils/Lib_RingBuffer.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_ChainStorageContainer } from \\\"../../iOVM/chain/iOVM_ChainStorageContainer.sol\\\";\\n\\n/**\\n * @title OVM_ChainStorageContainer\\n * @dev The Chain Storage Container provides its owner contract with read, write and delete functionality.\\n * This provides gas efficiency gains by enabling it to overwrite storage slots which can no longer be used\\n * in a fraud proof due to the fraud window having passed, and the associated chain state or\\n * transactions being finalized.\\n * Three distinct Chain Storage Containers will be deployed on Layer 1:\\n * 1. Stores transaction batches for the Canonical Transaction Chain\\n * 2. Stores queued transactions for the Canonical Transaction Chain\\n * 3. Stores chain state batches for the State Commitment Chain\\n *\\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract OVM_ChainStorageContainer is iOVM_ChainStorageContainer, Lib_AddressResolver {\\n\\n /*************\\n * Libraries *\\n *************/\\n\\n using Lib_RingBuffer for Lib_RingBuffer.RingBuffer;\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n string public owner;\\n Lib_RingBuffer.RingBuffer internal buffer;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n * @param _owner Name of the contract that owns this container (will be resolved later).\\n */\\n constructor(\\n address _libAddressManager,\\n string memory _owner\\n )\\n Lib_AddressResolver(_libAddressManager)\\n {\\n owner = _owner;\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n msg.sender == resolve(owner),\\n \\\"OVM_ChainStorageContainer: Function can only be called by the owner.\\\"\\n );\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function setGlobalMetadata(\\n bytes27 _globalMetadata\\n )\\n override\\n public\\n onlyOwner\\n {\\n return buffer.setExtraData(_globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function getGlobalMetadata()\\n override\\n public\\n view\\n returns (\\n bytes27\\n )\\n {\\n return buffer.getExtraData();\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function length()\\n override\\n public\\n view\\n returns (\\n uint256\\n )\\n {\\n return uint256(buffer.getLength());\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function push(\\n bytes32 _object\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.push(_object);\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function push(\\n bytes32 _object,\\n bytes27 _globalMetadata\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.push(_object, _globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function get(\\n uint256 _index\\n )\\n override\\n public\\n view\\n returns (\\n bytes32\\n )\\n {\\n return buffer.get(uint40(_index));\\n }\\n \\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.deleteElementsAfterInclusive(\\n uint40(_index)\\n );\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index,\\n bytes27 _globalMetadata\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.deleteElementsAfterInclusive(\\n uint40(_index),\\n _globalMetadata\\n );\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function setNextOverwritableIndex(\\n uint256 _index\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.nextOverwritableIndex = _index;\\n }\\n}\\n\",\"keccak256\":\"0x52e3ef7166fe134d32997917067e3d74128173b12fb6231eec34132102ddbb50\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_ChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title iOVM_ChainStorageContainer\\n */\\ninterface iOVM_ChainStorageContainer {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata()\\n external\\n view\\n returns (\\n bytes27\\n );\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length()\\n external\\n view\\n returns (\\n uint256\\n );\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(\\n bytes32 _object\\n )\\n external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(\\n bytes32 _object,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(\\n uint256 _index\\n )\\n external\\n view\\n returns (\\n bytes32\\n );\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index\\n )\\n external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Marks an index as overwritable, meaing the underlying buffer can start to write values over\\n * any objects before and including the given index.\\n */\\n function setNextOverwritableIndex(\\n uint256 _index\\n )\\n external;\\n}\\n\",\"keccak256\":\"0x2d7973a0ad84c23ec62624d3f1e3aeb198cc72686ff1e6cfa17155556b320c94\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Contract Imports */\\nimport { Ownable } from \\\"./Lib_Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n public\\n onlyOwner\\n {\\n addresses[_getNameHash(_name)] = _address;\\n\\n emit AddressSet(\\n _name,\\n _address\\n );\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0x36473d229ce0ba9d1cac5f02f84be843d9dcc8008525590a1652a2c2636f95f2\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(\\n address _libAddressManager\\n ) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x65981feeabff6a81783ea97d44baf988a18a86c8cb374c46fdb71819cbacc7c0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Ownable\\n * @dev Adapted from https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol\\n */\\nabstract contract Ownable {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n address public owner;\\n\\n\\n /**********\\n * Events *\\n **********/\\n\\n event OwnershipTransferred(\\n address indexed previousOwner,\\n address indexed newOwner\\n );\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n constructor() {\\n owner = msg.sender;\\n emit OwnershipTransferred(address(0), owner);\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n owner == msg.sender,\\n \\\"Ownable: caller is not the owner\\\"\\n );\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the owner of this contract to the zero address, effectively renouncing ownership\\n * completely. Can only be called by the current owner of this contract.\\n */\\n function renounceOwnership()\\n public\\n virtual\\n onlyOwner\\n {\\n emit OwnershipTransferred(owner, address(0));\\n owner = address(0);\\n }\\n\\n /**\\n * Transfers ownership of this contract to a new address. Can only be called by the current\\n * owner of this contract.\\n * @param _newOwner Address of the new contract owner.\\n */\\n function transferOwnership(\\n address _newOwner\\n )\\n public\\n virtual\\n onlyOwner\\n {\\n require(\\n _newOwner != address(0),\\n \\\"Ownable: new owner cannot be the zero address\\\"\\n );\\n\\n emit OwnershipTransferred(owner, _newOwner);\\n owner = _newOwner;\\n }\\n}\\n\",\"keccak256\":\"0x83f9a6c4608b5929086429205b00f8211cdfcba83f3c84520f24d8aa64fe4b82\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_RingBuffer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\nlibrary Lib_RingBuffer {\\n using Lib_RingBuffer for RingBuffer;\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Buffer {\\n uint256 length;\\n mapping (uint256 => bytes32) buf;\\n }\\n\\n struct RingBuffer {\\n bytes32 contextA;\\n bytes32 contextB;\\n Buffer bufferA;\\n Buffer bufferB;\\n uint256 nextOverwritableIndex;\\n }\\n\\n struct RingBufferContext {\\n // contextA\\n uint40 globalIndex;\\n bytes27 extraData;\\n\\n // contextB\\n uint64 currBufferIndex;\\n uint40 prevResetIndex;\\n uint40 currResetIndex;\\n }\\n\\n\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 constant MIN_CAPACITY = 16;\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n * @param _extraData Optional global extra data.\\n */\\n function push(\\n RingBuffer storage _self,\\n bytes32 _value,\\n bytes27 _extraData\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n Buffer storage currBuffer = _self.getBuffer(ctx.currBufferIndex);\\n\\n // Set a minimum capacity.\\n if (currBuffer.length == 0) {\\n currBuffer.length = MIN_CAPACITY;\\n }\\n\\n // Check if we need to expand the buffer.\\n if (ctx.globalIndex - ctx.currResetIndex >= currBuffer.length) {\\n if (ctx.currResetIndex < _self.nextOverwritableIndex) {\\n // We're going to overwrite the inactive buffer.\\n // Bump the buffer index, reset the delete offset, and set our reset indices.\\n ctx.currBufferIndex++;\\n ctx.prevResetIndex = ctx.currResetIndex;\\n ctx.currResetIndex = ctx.globalIndex;\\n\\n // Swap over to the next buffer.\\n currBuffer = _self.getBuffer(ctx.currBufferIndex);\\n } else {\\n // We're not overwriting yet, double the length of the current buffer.\\n currBuffer.length *= 2;\\n }\\n }\\n\\n // Index to write to is the difference of the global and reset indices.\\n uint256 writeHead = ctx.globalIndex - ctx.currResetIndex;\\n currBuffer.buf[writeHead] = _value;\\n\\n // Bump the global index and insert our extra data, then save the context.\\n ctx.globalIndex++;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n */\\n function push(\\n RingBuffer storage _self,\\n bytes32 _value\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n \\n _self.push(\\n _value,\\n ctx.extraData\\n );\\n }\\n\\n /**\\n * Retrieves an element from the buffer.\\n * @param _self Buffer to access.\\n * @param _index Element index to retrieve.\\n * @return Value of the element at the given index.\\n */\\n function get(\\n RingBuffer storage _self,\\n uint256 _index\\n )\\n internal\\n view\\n returns (\\n bytes32 \\n )\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n\\n require(\\n _index < ctx.globalIndex,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n Buffer storage currBuffer = _self.getBuffer(ctx.currBufferIndex);\\n Buffer storage prevBuffer = _self.getBuffer(ctx.currBufferIndex + 1);\\n\\n if (_index >= ctx.currResetIndex) {\\n // We're trying to load an element from the current buffer.\\n // Relative index is just the difference from the reset index.\\n uint256 relativeIndex = _index - ctx.currResetIndex;\\n\\n // Shouldn't happen but why not check.\\n require(\\n relativeIndex < currBuffer.length,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n return currBuffer.buf[relativeIndex];\\n } else {\\n // We're trying to load an element from the previous buffer.\\n // Relative index is the difference from the reset index in the other direction.\\n uint256 relativeIndex = ctx.currResetIndex - _index;\\n\\n // Condition only fails in the case that we deleted and flipped buffers.\\n require(\\n ctx.currResetIndex > ctx.prevResetIndex,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n // Make sure we're not trying to read beyond the array.\\n require(\\n relativeIndex <= prevBuffer.length,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n return prevBuffer.buf[prevBuffer.length - relativeIndex];\\n }\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n * @param _extraData Optional global extra data.\\n */\\n function deleteElementsAfterInclusive(\\n RingBuffer storage _self,\\n uint40 _index,\\n bytes27 _extraData\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n\\n require(\\n _index < ctx.globalIndex && _index >= ctx.prevResetIndex,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n if (_index < ctx.currResetIndex) {\\n // We're switching back to the previous buffer.\\n // Reduce the buffer index, set the current reset index back to match the previous one.\\n // We use the equality of these two values to prevent reading beyond this buffer.\\n ctx.currBufferIndex--;\\n ctx.currResetIndex = ctx.prevResetIndex;\\n }\\n\\n // Set our global index and extra data, save the context.\\n ctx.globalIndex = _index;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n */\\n function deleteElementsAfterInclusive(\\n RingBuffer storage _self,\\n uint40 _index\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n _self.deleteElementsAfterInclusive(\\n _index,\\n ctx.extraData\\n );\\n }\\n\\n /**\\n * Retrieves the current global index.\\n * @param _self Buffer to access.\\n * @return Current global index.\\n */\\n function getLength(\\n RingBuffer storage _self\\n )\\n internal\\n view\\n returns (\\n uint40\\n )\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n return ctx.globalIndex;\\n }\\n\\n /**\\n * Changes current global extra data.\\n * @param _self Buffer to access.\\n * @param _extraData New global extra data.\\n */\\n function setExtraData(\\n RingBuffer storage _self,\\n bytes27 _extraData\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Retrieves the current global extra data.\\n * @param _self Buffer to access.\\n * @return Current global extra data.\\n */\\n function getExtraData(\\n RingBuffer storage _self\\n )\\n internal\\n view\\n returns (\\n bytes27\\n )\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n return ctx.extraData;\\n }\\n\\n /**\\n * Sets the current ring buffer context.\\n * @param _self Buffer to access.\\n * @param _ctx Current ring buffer context.\\n */\\n function setContext(\\n RingBuffer storage _self,\\n RingBufferContext memory _ctx\\n )\\n internal\\n {\\n bytes32 contextA;\\n bytes32 contextB;\\n\\n uint40 globalIndex = _ctx.globalIndex;\\n bytes27 extraData = _ctx.extraData;\\n assembly {\\n contextA := globalIndex\\n contextA := or(contextA, extraData)\\n }\\n\\n uint64 currBufferIndex = _ctx.currBufferIndex;\\n uint40 prevResetIndex = _ctx.prevResetIndex;\\n uint40 currResetIndex = _ctx.currResetIndex;\\n assembly {\\n contextB := currBufferIndex\\n contextB := or(contextB, shl(64, prevResetIndex))\\n contextB := or(contextB, shl(104, currResetIndex))\\n }\\n\\n if (_self.contextA != contextA) {\\n _self.contextA = contextA;\\n }\\n\\n if (_self.contextB != contextB) {\\n _self.contextB = contextB;\\n }\\n }\\n\\n /**\\n * Retrieves the current ring buffer context.\\n * @param _self Buffer to access.\\n * @return Current ring buffer context.\\n */\\n function getContext(\\n RingBuffer storage _self\\n )\\n internal\\n view\\n returns (\\n RingBufferContext memory\\n )\\n {\\n bytes32 contextA = _self.contextA;\\n bytes32 contextB = _self.contextB;\\n\\n uint40 globalIndex;\\n bytes27 extraData;\\n assembly {\\n globalIndex := and(contextA, 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF)\\n extraData := and(contextA, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000)\\n }\\n\\n uint64 currBufferIndex;\\n uint40 prevResetIndex;\\n uint40 currResetIndex;\\n assembly {\\n currBufferIndex := and(contextB, 0x000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF)\\n prevResetIndex := shr(64, and(contextB, 0x00000000000000000000000000000000000000FFFFFFFFFF0000000000000000))\\n currResetIndex := shr(104, and(contextB, 0x0000000000000000000000000000FFFFFFFFFF00000000000000000000000000))\\n }\\n\\n return RingBufferContext({\\n globalIndex: globalIndex,\\n extraData: extraData,\\n currBufferIndex: currBufferIndex,\\n prevResetIndex: prevResetIndex,\\n currResetIndex: currResetIndex\\n });\\n }\\n\\n /**\\n * Retrieves the a buffer from the ring buffer by index.\\n * @param _self Buffer to access.\\n * @param _which Index of the sub buffer to access.\\n * @return Sub buffer for the index.\\n */\\n function getBuffer(\\n RingBuffer storage _self,\\n uint256 _which\\n )\\n internal\\n view\\n returns (\\n Buffer storage\\n )\\n {\\n return _which % 2 == 0 ? _self.bufferA : _self.bufferB;\\n }\\n}\\n\",\"keccak256\":\"0xb38cb98da2d09f922d5cfe772bdbd36ede2b2267ade93128e949c9da21b89940\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x60806040523480156200001157600080fd5b506040516200118d3803806200118d833981810160405260408110156200003757600080fd5b8151602083018051604051929492938301929190846401000000008211156200005f57600080fd5b9083019060208201858111156200007557600080fd5b82516401000000008111828201881017156200009057600080fd5b82525081516020918201929091019080838360005b83811015620000bf578181015183820152602001620000a5565b50505050905090810190601f168015620000ed5780820380516001836020036101000a031916815260200191505b506040525050600080546001600160a01b0319166001600160a01b038516179055508051620001249060019060208401906200012d565b505050620001d9565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282620001655760008555620001b0565b82601f106200018057805160ff1916838001178555620001b0565b82800160010185558215620001b0579182015b82811115620001b057825182559160200191906001019062000193565b50620001be929150620001c2565b5090565b5b80821115620001be5760008155600101620001c3565b610fa480620001e96000396000f3fe608060405234801561001057600080fd5b50600436106100b45760003560e01c80634651d91e116100715780634651d91e1461021a5780638da5cb5b146102375780639507d39a146102b4578063b298e36b146102d1578063ccf8f969146102ee578063fa9e936c14610311576100b4565b8063167fd681146100b95780631f7b6d32146100e65780632015276c1461010057806329061de21461012b578063299ca47814610150578063461a447814610174575b600080fd5b6100e4600480360360408110156100cf57600080fd5b508035906020013564ffffffffff191661032e565b005b6100ee610423565b60408051918252519081900360200190f35b6100e46004803603604081101561011657600080fd5b508035906020013564ffffffffff191661043b565b6100e46004803603602081101561014157600080fd5b503564ffffffffff19166104f7565b6101586105b5565b604080516001600160a01b039092168252519081900360200190f35b6101586004803603602081101561018a57600080fd5b8101906020810181356401000000008111156101a557600080fd5b8201836020820111156101b757600080fd5b803590602001918460018302840111640100000000831117156101d957600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506105c4945050505050565b6100e46004803603602081101561023057600080fd5b50356106a0565b61023f61075b565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610279578181015183820152602001610261565b50505050905090810190601f1680156102a65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6100ee600480360360208110156102ca57600080fd5b50356107e8565b6100e4600480360360208110156102e757600080fd5b5035610802565b6102f66108bd565b6040805164ffffffffff199092168252519081900360200190f35b6100e46004803603602081101561032757600080fd5b50356108ce565b60018054604080516020601f6002600019610100878916150201909516949094049384018190048102820181019092528281526103c493909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b820191906000526020600020905b81548152906001019060200180831161039d57829003601f168201915b50505050506105c4565b6001600160a01b0316336001600160a01b0316146104135760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b61041f60028383610983565b5050565b600061042f6002610a75565b64ffffffffff16905090565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261049c93909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146104eb5760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b61041f60028383610a89565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261055893909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146105a75760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b6105b2600282610b90565b50565b6000546001600160a01b031681565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b8381101561062457818101518382015260200161060c565b50505050905090810190601f1680156106515780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561066e57600080fd5b505afa158015610682573d6000803e3d6000fd5b505050506040513d602081101561069857600080fd5b505192915050565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261070193909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146107505760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b6105b2600282610bba565b60018054604080516020600284861615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156107e05780601f106107b5576101008083540402835291602001916107e0565b820191906000526020600020905b8154815290600101906020018083116107c357829003601f168201915b505050505081565b60006107fc600264ffffffffff8416610be0565b92915050565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261086393909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146108b25760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b6105b2600282610de9565b60006108c96002610e0f565b905090565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261092f93909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b03161461097e5760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b600855565b600061098e84610e26565b9050806000015164ffffffffff168364ffffffffff161080156109c35750806060015164ffffffffff168364ffffffffff1610155b610a0b576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b806080015164ffffffffff168364ffffffffff161015610a4d576040810180516000190167ffffffffffffffff169052606081015164ffffffffff1660808201525b64ffffffffff8316815264ffffffffff1982166020820152610a6f8482610e86565b50505050565b600080610a8183610e26565b519392505050565b6000610a9484610e26565b90506000610ab9826040015167ffffffffffffffff1686610edc90919063ffffffff16565b8054909150610ac757601081555b8054608083015183510364ffffffffff1610610b3e578460060154826080015164ffffffffff161015610b365760408201805160010167ffffffffffffffff169081905260808301805164ffffffffff90811660608601528451169052610b2f908690610edc565b9050610b3e565b805460020281555b608082015182510364ffffffffff9081166000818152600184810160209081526040909220889055855101909216845264ffffffffff19851691840191909152610b888684610e86565b505050505050565b6000610b9b83610e26565b64ffffffffff19831660208201529050610bb58382610e86565b505050565b6000610bc583610e26565b9050610bb5828260200151856109839092919063ffffffff16565b600080610bec84610e26565b805190915064ffffffffff168310610c42576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b6000610c65826040015167ffffffffffffffff1686610edc90919063ffffffff16565b90506000610c8d836040015160010167ffffffffffffffff1687610edc90919063ffffffff16565b9050826080015164ffffffffff168510610d1a576080830151825464ffffffffff9091168603908110610cfe576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b6000908152600190920160205250604090205491506107fc9050565b6080830151606084015164ffffffffff9182168781039290911610610d7d576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b8154811115610dca576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b81540360009081526001909101602052604090205492506107fc915050565b6000610df483610e26565b9050610bb582826020015185610a899092919063ffffffff16565b600080610e1b83610e26565b602001519392505050565b610e2e610efc565b5080546001909101546040805160a08101825264ffffffffff808516825264ffffffffff19909416602082015267ffffffffffffffff8316818301529082901c8316606082015260689190911c909116608082015290565b80516020820151604080840151606085015160808601518754858717969483901b8417606883901b1795939291908714610ebe578689555b85896001015414610ed157600189018690555b505050505050505050565b60006002820615610ef05782600401610ef5565b826002015b9392505050565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091529056fe4f564d5f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2063616e206f6e6c792062652063616c6c656420627920746865206f776e65722ea26469706673582212204a2a7ecf8f5f0c65c63241718caf1a7f24a3e346c23cab12b3750f7a2ffd56c564736f6c63430007060033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100b45760003560e01c80634651d91e116100715780634651d91e1461021a5780638da5cb5b146102375780639507d39a146102b4578063b298e36b146102d1578063ccf8f969146102ee578063fa9e936c14610311576100b4565b8063167fd681146100b95780631f7b6d32146100e65780632015276c1461010057806329061de21461012b578063299ca47814610150578063461a447814610174575b600080fd5b6100e4600480360360408110156100cf57600080fd5b508035906020013564ffffffffff191661032e565b005b6100ee610423565b60408051918252519081900360200190f35b6100e46004803603604081101561011657600080fd5b508035906020013564ffffffffff191661043b565b6100e46004803603602081101561014157600080fd5b503564ffffffffff19166104f7565b6101586105b5565b604080516001600160a01b039092168252519081900360200190f35b6101586004803603602081101561018a57600080fd5b8101906020810181356401000000008111156101a557600080fd5b8201836020820111156101b757600080fd5b803590602001918460018302840111640100000000831117156101d957600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506105c4945050505050565b6100e46004803603602081101561023057600080fd5b50356106a0565b61023f61075b565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610279578181015183820152602001610261565b50505050905090810190601f1680156102a65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6100ee600480360360208110156102ca57600080fd5b50356107e8565b6100e4600480360360208110156102e757600080fd5b5035610802565b6102f66108bd565b6040805164ffffffffff199092168252519081900360200190f35b6100e46004803603602081101561032757600080fd5b50356108ce565b60018054604080516020601f6002600019610100878916150201909516949094049384018190048102820181019092528281526103c493909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b820191906000526020600020905b81548152906001019060200180831161039d57829003601f168201915b50505050506105c4565b6001600160a01b0316336001600160a01b0316146104135760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b61041f60028383610983565b5050565b600061042f6002610a75565b64ffffffffff16905090565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261049c93909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146104eb5760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b61041f60028383610a89565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261055893909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146105a75760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b6105b2600282610b90565b50565b6000546001600160a01b031681565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b8381101561062457818101518382015260200161060c565b50505050905090810190601f1680156106515780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561066e57600080fd5b505afa158015610682573d6000803e3d6000fd5b505050506040513d602081101561069857600080fd5b505192915050565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261070193909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146107505760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b6105b2600282610bba565b60018054604080516020600284861615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156107e05780601f106107b5576101008083540402835291602001916107e0565b820191906000526020600020905b8154815290600101906020018083116107c357829003601f168201915b505050505081565b60006107fc600264ffffffffff8416610be0565b92915050565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261086393909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146108b25760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b6105b2600282610de9565b60006108c96002610e0f565b905090565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261092f93909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b03161461097e5760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b600855565b600061098e84610e26565b9050806000015164ffffffffff168364ffffffffff161080156109c35750806060015164ffffffffff168364ffffffffff1610155b610a0b576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b806080015164ffffffffff168364ffffffffff161015610a4d576040810180516000190167ffffffffffffffff169052606081015164ffffffffff1660808201525b64ffffffffff8316815264ffffffffff1982166020820152610a6f8482610e86565b50505050565b600080610a8183610e26565b519392505050565b6000610a9484610e26565b90506000610ab9826040015167ffffffffffffffff1686610edc90919063ffffffff16565b8054909150610ac757601081555b8054608083015183510364ffffffffff1610610b3e578460060154826080015164ffffffffff161015610b365760408201805160010167ffffffffffffffff169081905260808301805164ffffffffff90811660608601528451169052610b2f908690610edc565b9050610b3e565b805460020281555b608082015182510364ffffffffff9081166000818152600184810160209081526040909220889055855101909216845264ffffffffff19851691840191909152610b888684610e86565b505050505050565b6000610b9b83610e26565b64ffffffffff19831660208201529050610bb58382610e86565b505050565b6000610bc583610e26565b9050610bb5828260200151856109839092919063ffffffff16565b600080610bec84610e26565b805190915064ffffffffff168310610c42576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b6000610c65826040015167ffffffffffffffff1686610edc90919063ffffffff16565b90506000610c8d836040015160010167ffffffffffffffff1687610edc90919063ffffffff16565b9050826080015164ffffffffff168510610d1a576080830151825464ffffffffff9091168603908110610cfe576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b6000908152600190920160205250604090205491506107fc9050565b6080830151606084015164ffffffffff9182168781039290911610610d7d576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b8154811115610dca576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b81540360009081526001909101602052604090205492506107fc915050565b6000610df483610e26565b9050610bb582826020015185610a899092919063ffffffff16565b600080610e1b83610e26565b602001519392505050565b610e2e610efc565b5080546001909101546040805160a08101825264ffffffffff808516825264ffffffffff19909416602082015267ffffffffffffffff8316818301529082901c8316606082015260689190911c909116608082015290565b80516020820151604080840151606085015160808601518754858717969483901b8417606883901b1795939291908714610ebe578689555b85896001015414610ed157600189018690555b505050505050505050565b60006002820615610ef05782600401610ef5565b826002015b9392505050565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091529056fe4f564d5f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2063616e206f6e6c792062652063616c6c656420627920746865206f776e65722ea26469706673582212204a2a7ecf8f5f0c65c63241718caf1a7f24a3e346c23cab12b3750f7a2ffd56c564736f6c63430007060033", - "devdoc": { - "details": "The Chain Storage Container provides its owner contract with read, write and delete functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which can no longer be used in a fraud proof due to the fraud window having passed, and the associated chain state or transactions being finalized. Three distinct Chain Storage Containers will be deployed on Layer 1: 1. Stores transaction batches for the Canonical Transaction Chain 2. Stores queued transactions for the Canonical Transaction Chain 3. Stores chain state batches for the State Commitment Chain Compiler used: solc Runtime target: EVM", - "kind": "dev", - "methods": { - "constructor": { - "params": { - "_libAddressManager": "Address of the Address Manager.", - "_owner": "Name of the contract that owns this container (will be resolved later)." - } - }, - "deleteElementsAfterInclusive(uint256)": { - "params": { - "_index": "Object index to delete from." - } - }, - "deleteElementsAfterInclusive(uint256,bytes27)": { - "params": { - "_globalMetadata": "New global metadata for the container.", - "_index": "Object index to delete from." - } - }, - "get(uint256)": { - "params": { - "_index": "Index of the particular object to access." - }, - "returns": { - "_0": "32 byte object value." - } - }, - "getGlobalMetadata()": { - "returns": { - "_0": "Container global metadata field." - } - }, - "length()": { - "returns": { - "_0": "Number of objects in the container." - } - }, - "push(bytes32)": { - "params": { - "_object": "A 32 byte value to insert into the container." - } - }, - "push(bytes32,bytes27)": { - "params": { - "_globalMetadata": "New global metadata for the container.", - "_object": "A 32 byte value to insert into the container." - } - }, - "resolve(string)": { - "params": { - "_name": "Name to resolve an address for." - }, - "returns": { - "_0": "Address associated with the given name." - } - }, - "setGlobalMetadata(bytes27)": { - "params": { - "_globalMetadata": "New global metadata to set." - } - } - }, - "title": "OVM_ChainStorageContainer", - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": { - "deleteElementsAfterInclusive(uint256)": { - "notice": "Removes all objects after and including a given index." - }, - "deleteElementsAfterInclusive(uint256,bytes27)": { - "notice": "Removes all objects after and including a given index. Also allows setting the global metadata field." - }, - "get(uint256)": { - "notice": "Retrieves an object from the container." - }, - "getGlobalMetadata()": { - "notice": "Retrieves the container's global metadata field." - }, - "length()": { - "notice": "Retrieves the number of objects stored in the container." - }, - "push(bytes32)": { - "notice": "Pushes an object into the container." - }, - "push(bytes32,bytes27)": { - "notice": "Pushes an object into the container. Function allows setting the global metadata since we'll need to touch the \"length\" storage slot anyway, which also contains the global metadata (it's an optimization)." - }, - "resolve(string)": { - "notice": "Resolves the address associated with a given name." - }, - "setGlobalMetadata(bytes27)": { - "notice": "Sets the container's global metadata field. We're using `bytes27` here because we use five bytes to maintain the length of the underlying data structure, meaning we have an extra 27 bytes to store arbitrary data." - }, - "setNextOverwritableIndex(uint256)": { - "notice": "Marks an index as overwritable, meaing the underlying buffer can start to write values over any objects before and including the given index." - } - }, - "version": 1 - }, - "storageLayout": { - "storage": [ - { - "astId": 12557, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "libAddressManager", - "offset": 0, - "slot": "0", - "type": "t_contract(Lib_AddressManager)12550" - }, - { - "astId": 3772, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "owner", - "offset": 0, - "slot": "1", - "type": "t_string_storage" - }, - { - "astId": 3774, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "buffer", - "offset": 0, - "slot": "2", - "type": "t_struct(RingBuffer)17830_storage" - } - ], - "types": { - "t_bytes32": { - "encoding": "inplace", - "label": "bytes32", - "numberOfBytes": "32" - }, - "t_contract(Lib_AddressManager)12550": { - "encoding": "inplace", - "label": "contract Lib_AddressManager", - "numberOfBytes": "20" - }, - "t_mapping(t_uint256,t_bytes32)": { - "encoding": "mapping", - "key": "t_uint256", - "label": "mapping(uint256 => bytes32)", - "numberOfBytes": "32", - "value": "t_bytes32" - }, - "t_string_storage": { - "encoding": "bytes", - "label": "string", - "numberOfBytes": "32" - }, - "t_struct(Buffer)17819_storage": { - "encoding": "inplace", - "label": "struct Lib_RingBuffer.Buffer", - "members": [ - { - "astId": 17814, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "length", - "offset": 0, - "slot": "0", - "type": "t_uint256" - }, - { - "astId": 17818, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "buf", - "offset": 0, - "slot": "1", - "type": "t_mapping(t_uint256,t_bytes32)" - } - ], - "numberOfBytes": "64" - }, - "t_struct(RingBuffer)17830_storage": { - "encoding": "inplace", - "label": "struct Lib_RingBuffer.RingBuffer", - "members": [ - { - "astId": 17821, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "contextA", - "offset": 0, - "slot": "0", - "type": "t_bytes32" - }, - { - "astId": 17823, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "contextB", - "offset": 0, - "slot": "1", - "type": "t_bytes32" - }, - { - "astId": 17825, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "bufferA", - "offset": 0, - "slot": "2", - "type": "t_struct(Buffer)17819_storage" - }, - { - "astId": 17827, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "bufferB", - "offset": 0, - "slot": "4", - "type": "t_struct(Buffer)17819_storage" - }, - { - "astId": 17829, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "nextOverwritableIndex", - "offset": 0, - "slot": "6", - "type": "t_uint256" - } - ], - "numberOfBytes": "224" - }, - "t_uint256": { - "encoding": "inplace", - "label": "uint256", - "numberOfBytes": "32" - } - } - } -} \ No newline at end of file diff --git a/packages/contracts/deployments/goerli-v2/OVM_ChainStorageContainer-CTC-queue.json b/packages/contracts/deployments/goerli-v2/OVM_ChainStorageContainer-CTC-queue.json deleted file mode 100644 index 54d1636b9e67d..0000000000000 --- a/packages/contracts/deployments/goerli-v2/OVM_ChainStorageContainer-CTC-queue.json +++ /dev/null @@ -1,453 +0,0 @@ -{ - "address": "0xe7C69bfEC244EC659871E5685fc17D86eaFB8305", - "abi": [ - { - "inputs": [ - { - "internalType": "address", - "name": "_libAddressManager", - "type": "address" - }, - { - "internalType": "string", - "name": "_owner", - "type": "string" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_index", - "type": "uint256" - }, - { - "internalType": "bytes27", - "name": "_globalMetadata", - "type": "bytes27" - } - ], - "name": "deleteElementsAfterInclusive", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_index", - "type": "uint256" - } - ], - "name": "deleteElementsAfterInclusive", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_index", - "type": "uint256" - } - ], - "name": "get", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getGlobalMetadata", - "outputs": [ - { - "internalType": "bytes27", - "name": "", - "type": "bytes27" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "length", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "libAddressManager", - "outputs": [ - { - "internalType": "contract Lib_AddressManager", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "owner", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "_object", - "type": "bytes32" - }, - { - "internalType": "bytes27", - "name": "_globalMetadata", - "type": "bytes27" - } - ], - "name": "push", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "_object", - "type": "bytes32" - } - ], - "name": "push", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "string", - "name": "_name", - "type": "string" - } - ], - "name": "resolve", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes27", - "name": "_globalMetadata", - "type": "bytes27" - } - ], - "name": "setGlobalMetadata", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_index", - "type": "uint256" - } - ], - "name": "setNextOverwritableIndex", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - } - ], - "transactionHash": "0xb0fbdd4386adddb89b076fbc5d3f94a1d7b1aa61037c197b83f68395ed0b1bb0", - "receipt": { - "to": null, - "from": "0x558ba9b8d78713fbf768c1f8a584485B4003f43F", - "contractAddress": "0xe7C69bfEC244EC659871E5685fc17D86eaFB8305", - "transactionIndex": 52, - "gasUsed": "971002", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0xa9684ff0ef457e5df2d97d9e328aaeb65b5151fb99010f3dae39665fa3c61d50", - "transactionHash": "0xb0fbdd4386adddb89b076fbc5d3f94a1d7b1aa61037c197b83f68395ed0b1bb0", - "logs": [], - "blockNumber": 4607694, - "cumulativeGasUsed": "4479996", - "status": 1, - "byzantium": true - }, - "args": [ - "0x9933d137bBF050Cf3D7555fE1beC91eF698814e5", - "OVM_CanonicalTransactionChain" - ], - "solcInputHash": "8aef3555d89ad9d3af2f5d28a85dc856", - "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_owner\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"get\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getGlobalMetadata\",\"outputs\":[{\"internalType\":\"bytes27\",\"name\":\"\",\"type\":\"bytes27\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"length\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"setGlobalMetadata\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"setNextOverwritableIndex\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The Chain Storage Container provides its owner contract with read, write and delete functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which can no longer be used in a fraud proof due to the fraud window having passed, and the associated chain state or transactions being finalized. Three distinct Chain Storage Containers will be deployed on Layer 1: 1. Stores transaction batches for the Canonical Transaction Chain 2. Stores queued transactions for the Canonical Transaction Chain 3. Stores chain state batches for the State Commitment Chain Compiler used: solc Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\",\"_owner\":\"Name of the contract that owns this container (will be resolved later).\"}},\"deleteElementsAfterInclusive(uint256)\":{\"params\":{\"_index\":\"Object index to delete from.\"}},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_index\":\"Object index to delete from.\"}},\"get(uint256)\":{\"params\":{\"_index\":\"Index of the particular object to access.\"},\"returns\":{\"_0\":\"32 byte object value.\"}},\"getGlobalMetadata()\":{\"returns\":{\"_0\":\"Container global metadata field.\"}},\"length()\":{\"returns\":{\"_0\":\"Number of objects in the container.\"}},\"push(bytes32)\":{\"params\":{\"_object\":\"A 32 byte value to insert into the container.\"}},\"push(bytes32,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_object\":\"A 32 byte value to insert into the container.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}},\"setGlobalMetadata(bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata to set.\"}}},\"title\":\"OVM_ChainStorageContainer\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"deleteElementsAfterInclusive(uint256)\":{\"notice\":\"Removes all objects after and including a given index.\"},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"notice\":\"Removes all objects after and including a given index. Also allows setting the global metadata field.\"},\"get(uint256)\":{\"notice\":\"Retrieves an object from the container.\"},\"getGlobalMetadata()\":{\"notice\":\"Retrieves the container's global metadata field.\"},\"length()\":{\"notice\":\"Retrieves the number of objects stored in the container.\"},\"push(bytes32)\":{\"notice\":\"Pushes an object into the container.\"},\"push(bytes32,bytes27)\":{\"notice\":\"Pushes an object into the container. Function allows setting the global metadata since we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global metadata (it's an optimization).\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"},\"setGlobalMetadata(bytes27)\":{\"notice\":\"Sets the container's global metadata field. We're using `bytes27` here because we use five bytes to maintain the length of the underlying data structure, meaning we have an extra 27 bytes to store arbitrary data.\"},\"setNextOverwritableIndex(uint256)\":{\"notice\":\"Marks an index as overwritable, meaing the underlying buffer can start to write values over any objects before and including the given index.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol\":\"OVM_ChainStorageContainer\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_RingBuffer } from \\\"../../libraries/utils/Lib_RingBuffer.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_ChainStorageContainer } from \\\"../../iOVM/chain/iOVM_ChainStorageContainer.sol\\\";\\n\\n/**\\n * @title OVM_ChainStorageContainer\\n * @dev The Chain Storage Container provides its owner contract with read, write and delete functionality.\\n * This provides gas efficiency gains by enabling it to overwrite storage slots which can no longer be used\\n * in a fraud proof due to the fraud window having passed, and the associated chain state or\\n * transactions being finalized.\\n * Three distinct Chain Storage Containers will be deployed on Layer 1:\\n * 1. Stores transaction batches for the Canonical Transaction Chain\\n * 2. Stores queued transactions for the Canonical Transaction Chain\\n * 3. Stores chain state batches for the State Commitment Chain\\n *\\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract OVM_ChainStorageContainer is iOVM_ChainStorageContainer, Lib_AddressResolver {\\n\\n /*************\\n * Libraries *\\n *************/\\n\\n using Lib_RingBuffer for Lib_RingBuffer.RingBuffer;\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n string public owner;\\n Lib_RingBuffer.RingBuffer internal buffer;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n * @param _owner Name of the contract that owns this container (will be resolved later).\\n */\\n constructor(\\n address _libAddressManager,\\n string memory _owner\\n )\\n Lib_AddressResolver(_libAddressManager)\\n {\\n owner = _owner;\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n msg.sender == resolve(owner),\\n \\\"OVM_ChainStorageContainer: Function can only be called by the owner.\\\"\\n );\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function setGlobalMetadata(\\n bytes27 _globalMetadata\\n )\\n override\\n public\\n onlyOwner\\n {\\n return buffer.setExtraData(_globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function getGlobalMetadata()\\n override\\n public\\n view\\n returns (\\n bytes27\\n )\\n {\\n return buffer.getExtraData();\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function length()\\n override\\n public\\n view\\n returns (\\n uint256\\n )\\n {\\n return uint256(buffer.getLength());\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function push(\\n bytes32 _object\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.push(_object);\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function push(\\n bytes32 _object,\\n bytes27 _globalMetadata\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.push(_object, _globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function get(\\n uint256 _index\\n )\\n override\\n public\\n view\\n returns (\\n bytes32\\n )\\n {\\n return buffer.get(uint40(_index));\\n }\\n \\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.deleteElementsAfterInclusive(\\n uint40(_index)\\n );\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index,\\n bytes27 _globalMetadata\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.deleteElementsAfterInclusive(\\n uint40(_index),\\n _globalMetadata\\n );\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function setNextOverwritableIndex(\\n uint256 _index\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.nextOverwritableIndex = _index;\\n }\\n}\\n\",\"keccak256\":\"0x52e3ef7166fe134d32997917067e3d74128173b12fb6231eec34132102ddbb50\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_ChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title iOVM_ChainStorageContainer\\n */\\ninterface iOVM_ChainStorageContainer {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata()\\n external\\n view\\n returns (\\n bytes27\\n );\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length()\\n external\\n view\\n returns (\\n uint256\\n );\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(\\n bytes32 _object\\n )\\n external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(\\n bytes32 _object,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(\\n uint256 _index\\n )\\n external\\n view\\n returns (\\n bytes32\\n );\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index\\n )\\n external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Marks an index as overwritable, meaing the underlying buffer can start to write values over\\n * any objects before and including the given index.\\n */\\n function setNextOverwritableIndex(\\n uint256 _index\\n )\\n external;\\n}\\n\",\"keccak256\":\"0x2d7973a0ad84c23ec62624d3f1e3aeb198cc72686ff1e6cfa17155556b320c94\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Contract Imports */\\nimport { Ownable } from \\\"./Lib_Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n public\\n onlyOwner\\n {\\n addresses[_getNameHash(_name)] = _address;\\n\\n emit AddressSet(\\n _name,\\n _address\\n );\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0x36473d229ce0ba9d1cac5f02f84be843d9dcc8008525590a1652a2c2636f95f2\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(\\n address _libAddressManager\\n ) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x65981feeabff6a81783ea97d44baf988a18a86c8cb374c46fdb71819cbacc7c0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Ownable\\n * @dev Adapted from https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol\\n */\\nabstract contract Ownable {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n address public owner;\\n\\n\\n /**********\\n * Events *\\n **********/\\n\\n event OwnershipTransferred(\\n address indexed previousOwner,\\n address indexed newOwner\\n );\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n constructor() {\\n owner = msg.sender;\\n emit OwnershipTransferred(address(0), owner);\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n owner == msg.sender,\\n \\\"Ownable: caller is not the owner\\\"\\n );\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the owner of this contract to the zero address, effectively renouncing ownership\\n * completely. Can only be called by the current owner of this contract.\\n */\\n function renounceOwnership()\\n public\\n virtual\\n onlyOwner\\n {\\n emit OwnershipTransferred(owner, address(0));\\n owner = address(0);\\n }\\n\\n /**\\n * Transfers ownership of this contract to a new address. Can only be called by the current\\n * owner of this contract.\\n * @param _newOwner Address of the new contract owner.\\n */\\n function transferOwnership(\\n address _newOwner\\n )\\n public\\n virtual\\n onlyOwner\\n {\\n require(\\n _newOwner != address(0),\\n \\\"Ownable: new owner cannot be the zero address\\\"\\n );\\n\\n emit OwnershipTransferred(owner, _newOwner);\\n owner = _newOwner;\\n }\\n}\\n\",\"keccak256\":\"0x83f9a6c4608b5929086429205b00f8211cdfcba83f3c84520f24d8aa64fe4b82\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_RingBuffer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\nlibrary Lib_RingBuffer {\\n using Lib_RingBuffer for RingBuffer;\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Buffer {\\n uint256 length;\\n mapping (uint256 => bytes32) buf;\\n }\\n\\n struct RingBuffer {\\n bytes32 contextA;\\n bytes32 contextB;\\n Buffer bufferA;\\n Buffer bufferB;\\n uint256 nextOverwritableIndex;\\n }\\n\\n struct RingBufferContext {\\n // contextA\\n uint40 globalIndex;\\n bytes27 extraData;\\n\\n // contextB\\n uint64 currBufferIndex;\\n uint40 prevResetIndex;\\n uint40 currResetIndex;\\n }\\n\\n\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 constant MIN_CAPACITY = 16;\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n * @param _extraData Optional global extra data.\\n */\\n function push(\\n RingBuffer storage _self,\\n bytes32 _value,\\n bytes27 _extraData\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n Buffer storage currBuffer = _self.getBuffer(ctx.currBufferIndex);\\n\\n // Set a minimum capacity.\\n if (currBuffer.length == 0) {\\n currBuffer.length = MIN_CAPACITY;\\n }\\n\\n // Check if we need to expand the buffer.\\n if (ctx.globalIndex - ctx.currResetIndex >= currBuffer.length) {\\n if (ctx.currResetIndex < _self.nextOverwritableIndex) {\\n // We're going to overwrite the inactive buffer.\\n // Bump the buffer index, reset the delete offset, and set our reset indices.\\n ctx.currBufferIndex++;\\n ctx.prevResetIndex = ctx.currResetIndex;\\n ctx.currResetIndex = ctx.globalIndex;\\n\\n // Swap over to the next buffer.\\n currBuffer = _self.getBuffer(ctx.currBufferIndex);\\n } else {\\n // We're not overwriting yet, double the length of the current buffer.\\n currBuffer.length *= 2;\\n }\\n }\\n\\n // Index to write to is the difference of the global and reset indices.\\n uint256 writeHead = ctx.globalIndex - ctx.currResetIndex;\\n currBuffer.buf[writeHead] = _value;\\n\\n // Bump the global index and insert our extra data, then save the context.\\n ctx.globalIndex++;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n */\\n function push(\\n RingBuffer storage _self,\\n bytes32 _value\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n \\n _self.push(\\n _value,\\n ctx.extraData\\n );\\n }\\n\\n /**\\n * Retrieves an element from the buffer.\\n * @param _self Buffer to access.\\n * @param _index Element index to retrieve.\\n * @return Value of the element at the given index.\\n */\\n function get(\\n RingBuffer storage _self,\\n uint256 _index\\n )\\n internal\\n view\\n returns (\\n bytes32 \\n )\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n\\n require(\\n _index < ctx.globalIndex,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n Buffer storage currBuffer = _self.getBuffer(ctx.currBufferIndex);\\n Buffer storage prevBuffer = _self.getBuffer(ctx.currBufferIndex + 1);\\n\\n if (_index >= ctx.currResetIndex) {\\n // We're trying to load an element from the current buffer.\\n // Relative index is just the difference from the reset index.\\n uint256 relativeIndex = _index - ctx.currResetIndex;\\n\\n // Shouldn't happen but why not check.\\n require(\\n relativeIndex < currBuffer.length,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n return currBuffer.buf[relativeIndex];\\n } else {\\n // We're trying to load an element from the previous buffer.\\n // Relative index is the difference from the reset index in the other direction.\\n uint256 relativeIndex = ctx.currResetIndex - _index;\\n\\n // Condition only fails in the case that we deleted and flipped buffers.\\n require(\\n ctx.currResetIndex > ctx.prevResetIndex,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n // Make sure we're not trying to read beyond the array.\\n require(\\n relativeIndex <= prevBuffer.length,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n return prevBuffer.buf[prevBuffer.length - relativeIndex];\\n }\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n * @param _extraData Optional global extra data.\\n */\\n function deleteElementsAfterInclusive(\\n RingBuffer storage _self,\\n uint40 _index,\\n bytes27 _extraData\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n\\n require(\\n _index < ctx.globalIndex && _index >= ctx.prevResetIndex,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n if (_index < ctx.currResetIndex) {\\n // We're switching back to the previous buffer.\\n // Reduce the buffer index, set the current reset index back to match the previous one.\\n // We use the equality of these two values to prevent reading beyond this buffer.\\n ctx.currBufferIndex--;\\n ctx.currResetIndex = ctx.prevResetIndex;\\n }\\n\\n // Set our global index and extra data, save the context.\\n ctx.globalIndex = _index;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n */\\n function deleteElementsAfterInclusive(\\n RingBuffer storage _self,\\n uint40 _index\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n _self.deleteElementsAfterInclusive(\\n _index,\\n ctx.extraData\\n );\\n }\\n\\n /**\\n * Retrieves the current global index.\\n * @param _self Buffer to access.\\n * @return Current global index.\\n */\\n function getLength(\\n RingBuffer storage _self\\n )\\n internal\\n view\\n returns (\\n uint40\\n )\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n return ctx.globalIndex;\\n }\\n\\n /**\\n * Changes current global extra data.\\n * @param _self Buffer to access.\\n * @param _extraData New global extra data.\\n */\\n function setExtraData(\\n RingBuffer storage _self,\\n bytes27 _extraData\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Retrieves the current global extra data.\\n * @param _self Buffer to access.\\n * @return Current global extra data.\\n */\\n function getExtraData(\\n RingBuffer storage _self\\n )\\n internal\\n view\\n returns (\\n bytes27\\n )\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n return ctx.extraData;\\n }\\n\\n /**\\n * Sets the current ring buffer context.\\n * @param _self Buffer to access.\\n * @param _ctx Current ring buffer context.\\n */\\n function setContext(\\n RingBuffer storage _self,\\n RingBufferContext memory _ctx\\n )\\n internal\\n {\\n bytes32 contextA;\\n bytes32 contextB;\\n\\n uint40 globalIndex = _ctx.globalIndex;\\n bytes27 extraData = _ctx.extraData;\\n assembly {\\n contextA := globalIndex\\n contextA := or(contextA, extraData)\\n }\\n\\n uint64 currBufferIndex = _ctx.currBufferIndex;\\n uint40 prevResetIndex = _ctx.prevResetIndex;\\n uint40 currResetIndex = _ctx.currResetIndex;\\n assembly {\\n contextB := currBufferIndex\\n contextB := or(contextB, shl(64, prevResetIndex))\\n contextB := or(contextB, shl(104, currResetIndex))\\n }\\n\\n if (_self.contextA != contextA) {\\n _self.contextA = contextA;\\n }\\n\\n if (_self.contextB != contextB) {\\n _self.contextB = contextB;\\n }\\n }\\n\\n /**\\n * Retrieves the current ring buffer context.\\n * @param _self Buffer to access.\\n * @return Current ring buffer context.\\n */\\n function getContext(\\n RingBuffer storage _self\\n )\\n internal\\n view\\n returns (\\n RingBufferContext memory\\n )\\n {\\n bytes32 contextA = _self.contextA;\\n bytes32 contextB = _self.contextB;\\n\\n uint40 globalIndex;\\n bytes27 extraData;\\n assembly {\\n globalIndex := and(contextA, 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF)\\n extraData := and(contextA, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000)\\n }\\n\\n uint64 currBufferIndex;\\n uint40 prevResetIndex;\\n uint40 currResetIndex;\\n assembly {\\n currBufferIndex := and(contextB, 0x000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF)\\n prevResetIndex := shr(64, and(contextB, 0x00000000000000000000000000000000000000FFFFFFFFFF0000000000000000))\\n currResetIndex := shr(104, and(contextB, 0x0000000000000000000000000000FFFFFFFFFF00000000000000000000000000))\\n }\\n\\n return RingBufferContext({\\n globalIndex: globalIndex,\\n extraData: extraData,\\n currBufferIndex: currBufferIndex,\\n prevResetIndex: prevResetIndex,\\n currResetIndex: currResetIndex\\n });\\n }\\n\\n /**\\n * Retrieves the a buffer from the ring buffer by index.\\n * @param _self Buffer to access.\\n * @param _which Index of the sub buffer to access.\\n * @return Sub buffer for the index.\\n */\\n function getBuffer(\\n RingBuffer storage _self,\\n uint256 _which\\n )\\n internal\\n view\\n returns (\\n Buffer storage\\n )\\n {\\n return _which % 2 == 0 ? _self.bufferA : _self.bufferB;\\n }\\n}\\n\",\"keccak256\":\"0xb38cb98da2d09f922d5cfe772bdbd36ede2b2267ade93128e949c9da21b89940\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x60806040523480156200001157600080fd5b506040516200118d3803806200118d833981810160405260408110156200003757600080fd5b8151602083018051604051929492938301929190846401000000008211156200005f57600080fd5b9083019060208201858111156200007557600080fd5b82516401000000008111828201881017156200009057600080fd5b82525081516020918201929091019080838360005b83811015620000bf578181015183820152602001620000a5565b50505050905090810190601f168015620000ed5780820380516001836020036101000a031916815260200191505b506040525050600080546001600160a01b0319166001600160a01b038516179055508051620001249060019060208401906200012d565b505050620001d9565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282620001655760008555620001b0565b82601f106200018057805160ff1916838001178555620001b0565b82800160010185558215620001b0579182015b82811115620001b057825182559160200191906001019062000193565b50620001be929150620001c2565b5090565b5b80821115620001be5760008155600101620001c3565b610fa480620001e96000396000f3fe608060405234801561001057600080fd5b50600436106100b45760003560e01c80634651d91e116100715780634651d91e1461021a5780638da5cb5b146102375780639507d39a146102b4578063b298e36b146102d1578063ccf8f969146102ee578063fa9e936c14610311576100b4565b8063167fd681146100b95780631f7b6d32146100e65780632015276c1461010057806329061de21461012b578063299ca47814610150578063461a447814610174575b600080fd5b6100e4600480360360408110156100cf57600080fd5b508035906020013564ffffffffff191661032e565b005b6100ee610423565b60408051918252519081900360200190f35b6100e46004803603604081101561011657600080fd5b508035906020013564ffffffffff191661043b565b6100e46004803603602081101561014157600080fd5b503564ffffffffff19166104f7565b6101586105b5565b604080516001600160a01b039092168252519081900360200190f35b6101586004803603602081101561018a57600080fd5b8101906020810181356401000000008111156101a557600080fd5b8201836020820111156101b757600080fd5b803590602001918460018302840111640100000000831117156101d957600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506105c4945050505050565b6100e46004803603602081101561023057600080fd5b50356106a0565b61023f61075b565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610279578181015183820152602001610261565b50505050905090810190601f1680156102a65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6100ee600480360360208110156102ca57600080fd5b50356107e8565b6100e4600480360360208110156102e757600080fd5b5035610802565b6102f66108bd565b6040805164ffffffffff199092168252519081900360200190f35b6100e46004803603602081101561032757600080fd5b50356108ce565b60018054604080516020601f6002600019610100878916150201909516949094049384018190048102820181019092528281526103c493909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b820191906000526020600020905b81548152906001019060200180831161039d57829003601f168201915b50505050506105c4565b6001600160a01b0316336001600160a01b0316146104135760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b61041f60028383610983565b5050565b600061042f6002610a75565b64ffffffffff16905090565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261049c93909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146104eb5760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b61041f60028383610a89565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261055893909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146105a75760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b6105b2600282610b90565b50565b6000546001600160a01b031681565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b8381101561062457818101518382015260200161060c565b50505050905090810190601f1680156106515780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561066e57600080fd5b505afa158015610682573d6000803e3d6000fd5b505050506040513d602081101561069857600080fd5b505192915050565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261070193909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146107505760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b6105b2600282610bba565b60018054604080516020600284861615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156107e05780601f106107b5576101008083540402835291602001916107e0565b820191906000526020600020905b8154815290600101906020018083116107c357829003601f168201915b505050505081565b60006107fc600264ffffffffff8416610be0565b92915050565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261086393909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146108b25760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b6105b2600282610de9565b60006108c96002610e0f565b905090565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261092f93909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b03161461097e5760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b600855565b600061098e84610e26565b9050806000015164ffffffffff168364ffffffffff161080156109c35750806060015164ffffffffff168364ffffffffff1610155b610a0b576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b806080015164ffffffffff168364ffffffffff161015610a4d576040810180516000190167ffffffffffffffff169052606081015164ffffffffff1660808201525b64ffffffffff8316815264ffffffffff1982166020820152610a6f8482610e86565b50505050565b600080610a8183610e26565b519392505050565b6000610a9484610e26565b90506000610ab9826040015167ffffffffffffffff1686610edc90919063ffffffff16565b8054909150610ac757601081555b8054608083015183510364ffffffffff1610610b3e578460060154826080015164ffffffffff161015610b365760408201805160010167ffffffffffffffff169081905260808301805164ffffffffff90811660608601528451169052610b2f908690610edc565b9050610b3e565b805460020281555b608082015182510364ffffffffff9081166000818152600184810160209081526040909220889055855101909216845264ffffffffff19851691840191909152610b888684610e86565b505050505050565b6000610b9b83610e26565b64ffffffffff19831660208201529050610bb58382610e86565b505050565b6000610bc583610e26565b9050610bb5828260200151856109839092919063ffffffff16565b600080610bec84610e26565b805190915064ffffffffff168310610c42576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b6000610c65826040015167ffffffffffffffff1686610edc90919063ffffffff16565b90506000610c8d836040015160010167ffffffffffffffff1687610edc90919063ffffffff16565b9050826080015164ffffffffff168510610d1a576080830151825464ffffffffff9091168603908110610cfe576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b6000908152600190920160205250604090205491506107fc9050565b6080830151606084015164ffffffffff9182168781039290911610610d7d576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b8154811115610dca576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b81540360009081526001909101602052604090205492506107fc915050565b6000610df483610e26565b9050610bb582826020015185610a899092919063ffffffff16565b600080610e1b83610e26565b602001519392505050565b610e2e610efc565b5080546001909101546040805160a08101825264ffffffffff808516825264ffffffffff19909416602082015267ffffffffffffffff8316818301529082901c8316606082015260689190911c909116608082015290565b80516020820151604080840151606085015160808601518754858717969483901b8417606883901b1795939291908714610ebe578689555b85896001015414610ed157600189018690555b505050505050505050565b60006002820615610ef05782600401610ef5565b826002015b9392505050565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091529056fe4f564d5f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2063616e206f6e6c792062652063616c6c656420627920746865206f776e65722ea26469706673582212204a2a7ecf8f5f0c65c63241718caf1a7f24a3e346c23cab12b3750f7a2ffd56c564736f6c63430007060033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100b45760003560e01c80634651d91e116100715780634651d91e1461021a5780638da5cb5b146102375780639507d39a146102b4578063b298e36b146102d1578063ccf8f969146102ee578063fa9e936c14610311576100b4565b8063167fd681146100b95780631f7b6d32146100e65780632015276c1461010057806329061de21461012b578063299ca47814610150578063461a447814610174575b600080fd5b6100e4600480360360408110156100cf57600080fd5b508035906020013564ffffffffff191661032e565b005b6100ee610423565b60408051918252519081900360200190f35b6100e46004803603604081101561011657600080fd5b508035906020013564ffffffffff191661043b565b6100e46004803603602081101561014157600080fd5b503564ffffffffff19166104f7565b6101586105b5565b604080516001600160a01b039092168252519081900360200190f35b6101586004803603602081101561018a57600080fd5b8101906020810181356401000000008111156101a557600080fd5b8201836020820111156101b757600080fd5b803590602001918460018302840111640100000000831117156101d957600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506105c4945050505050565b6100e46004803603602081101561023057600080fd5b50356106a0565b61023f61075b565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610279578181015183820152602001610261565b50505050905090810190601f1680156102a65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6100ee600480360360208110156102ca57600080fd5b50356107e8565b6100e4600480360360208110156102e757600080fd5b5035610802565b6102f66108bd565b6040805164ffffffffff199092168252519081900360200190f35b6100e46004803603602081101561032757600080fd5b50356108ce565b60018054604080516020601f6002600019610100878916150201909516949094049384018190048102820181019092528281526103c493909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b820191906000526020600020905b81548152906001019060200180831161039d57829003601f168201915b50505050506105c4565b6001600160a01b0316336001600160a01b0316146104135760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b61041f60028383610983565b5050565b600061042f6002610a75565b64ffffffffff16905090565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261049c93909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146104eb5760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b61041f60028383610a89565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261055893909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146105a75760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b6105b2600282610b90565b50565b6000546001600160a01b031681565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b8381101561062457818101518382015260200161060c565b50505050905090810190601f1680156106515780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561066e57600080fd5b505afa158015610682573d6000803e3d6000fd5b505050506040513d602081101561069857600080fd5b505192915050565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261070193909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146107505760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b6105b2600282610bba565b60018054604080516020600284861615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156107e05780601f106107b5576101008083540402835291602001916107e0565b820191906000526020600020905b8154815290600101906020018083116107c357829003601f168201915b505050505081565b60006107fc600264ffffffffff8416610be0565b92915050565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261086393909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146108b25760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b6105b2600282610de9565b60006108c96002610e0f565b905090565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261092f93909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b03161461097e5760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b600855565b600061098e84610e26565b9050806000015164ffffffffff168364ffffffffff161080156109c35750806060015164ffffffffff168364ffffffffff1610155b610a0b576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b806080015164ffffffffff168364ffffffffff161015610a4d576040810180516000190167ffffffffffffffff169052606081015164ffffffffff1660808201525b64ffffffffff8316815264ffffffffff1982166020820152610a6f8482610e86565b50505050565b600080610a8183610e26565b519392505050565b6000610a9484610e26565b90506000610ab9826040015167ffffffffffffffff1686610edc90919063ffffffff16565b8054909150610ac757601081555b8054608083015183510364ffffffffff1610610b3e578460060154826080015164ffffffffff161015610b365760408201805160010167ffffffffffffffff169081905260808301805164ffffffffff90811660608601528451169052610b2f908690610edc565b9050610b3e565b805460020281555b608082015182510364ffffffffff9081166000818152600184810160209081526040909220889055855101909216845264ffffffffff19851691840191909152610b888684610e86565b505050505050565b6000610b9b83610e26565b64ffffffffff19831660208201529050610bb58382610e86565b505050565b6000610bc583610e26565b9050610bb5828260200151856109839092919063ffffffff16565b600080610bec84610e26565b805190915064ffffffffff168310610c42576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b6000610c65826040015167ffffffffffffffff1686610edc90919063ffffffff16565b90506000610c8d836040015160010167ffffffffffffffff1687610edc90919063ffffffff16565b9050826080015164ffffffffff168510610d1a576080830151825464ffffffffff9091168603908110610cfe576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b6000908152600190920160205250604090205491506107fc9050565b6080830151606084015164ffffffffff9182168781039290911610610d7d576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b8154811115610dca576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b81540360009081526001909101602052604090205492506107fc915050565b6000610df483610e26565b9050610bb582826020015185610a899092919063ffffffff16565b600080610e1b83610e26565b602001519392505050565b610e2e610efc565b5080546001909101546040805160a08101825264ffffffffff808516825264ffffffffff19909416602082015267ffffffffffffffff8316818301529082901c8316606082015260689190911c909116608082015290565b80516020820151604080840151606085015160808601518754858717969483901b8417606883901b1795939291908714610ebe578689555b85896001015414610ed157600189018690555b505050505050505050565b60006002820615610ef05782600401610ef5565b826002015b9392505050565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091529056fe4f564d5f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2063616e206f6e6c792062652063616c6c656420627920746865206f776e65722ea26469706673582212204a2a7ecf8f5f0c65c63241718caf1a7f24a3e346c23cab12b3750f7a2ffd56c564736f6c63430007060033", - "devdoc": { - "details": "The Chain Storage Container provides its owner contract with read, write and delete functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which can no longer be used in a fraud proof due to the fraud window having passed, and the associated chain state or transactions being finalized. Three distinct Chain Storage Containers will be deployed on Layer 1: 1. Stores transaction batches for the Canonical Transaction Chain 2. Stores queued transactions for the Canonical Transaction Chain 3. Stores chain state batches for the State Commitment Chain Compiler used: solc Runtime target: EVM", - "kind": "dev", - "methods": { - "constructor": { - "params": { - "_libAddressManager": "Address of the Address Manager.", - "_owner": "Name of the contract that owns this container (will be resolved later)." - } - }, - "deleteElementsAfterInclusive(uint256)": { - "params": { - "_index": "Object index to delete from." - } - }, - "deleteElementsAfterInclusive(uint256,bytes27)": { - "params": { - "_globalMetadata": "New global metadata for the container.", - "_index": "Object index to delete from." - } - }, - "get(uint256)": { - "params": { - "_index": "Index of the particular object to access." - }, - "returns": { - "_0": "32 byte object value." - } - }, - "getGlobalMetadata()": { - "returns": { - "_0": "Container global metadata field." - } - }, - "length()": { - "returns": { - "_0": "Number of objects in the container." - } - }, - "push(bytes32)": { - "params": { - "_object": "A 32 byte value to insert into the container." - } - }, - "push(bytes32,bytes27)": { - "params": { - "_globalMetadata": "New global metadata for the container.", - "_object": "A 32 byte value to insert into the container." - } - }, - "resolve(string)": { - "params": { - "_name": "Name to resolve an address for." - }, - "returns": { - "_0": "Address associated with the given name." - } - }, - "setGlobalMetadata(bytes27)": { - "params": { - "_globalMetadata": "New global metadata to set." - } - } - }, - "title": "OVM_ChainStorageContainer", - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": { - "deleteElementsAfterInclusive(uint256)": { - "notice": "Removes all objects after and including a given index." - }, - "deleteElementsAfterInclusive(uint256,bytes27)": { - "notice": "Removes all objects after and including a given index. Also allows setting the global metadata field." - }, - "get(uint256)": { - "notice": "Retrieves an object from the container." - }, - "getGlobalMetadata()": { - "notice": "Retrieves the container's global metadata field." - }, - "length()": { - "notice": "Retrieves the number of objects stored in the container." - }, - "push(bytes32)": { - "notice": "Pushes an object into the container." - }, - "push(bytes32,bytes27)": { - "notice": "Pushes an object into the container. Function allows setting the global metadata since we'll need to touch the \"length\" storage slot anyway, which also contains the global metadata (it's an optimization)." - }, - "resolve(string)": { - "notice": "Resolves the address associated with a given name." - }, - "setGlobalMetadata(bytes27)": { - "notice": "Sets the container's global metadata field. We're using `bytes27` here because we use five bytes to maintain the length of the underlying data structure, meaning we have an extra 27 bytes to store arbitrary data." - }, - "setNextOverwritableIndex(uint256)": { - "notice": "Marks an index as overwritable, meaing the underlying buffer can start to write values over any objects before and including the given index." - } - }, - "version": 1 - }, - "storageLayout": { - "storage": [ - { - "astId": 12557, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "libAddressManager", - "offset": 0, - "slot": "0", - "type": "t_contract(Lib_AddressManager)12550" - }, - { - "astId": 3772, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "owner", - "offset": 0, - "slot": "1", - "type": "t_string_storage" - }, - { - "astId": 3774, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "buffer", - "offset": 0, - "slot": "2", - "type": "t_struct(RingBuffer)17830_storage" - } - ], - "types": { - "t_bytes32": { - "encoding": "inplace", - "label": "bytes32", - "numberOfBytes": "32" - }, - "t_contract(Lib_AddressManager)12550": { - "encoding": "inplace", - "label": "contract Lib_AddressManager", - "numberOfBytes": "20" - }, - "t_mapping(t_uint256,t_bytes32)": { - "encoding": "mapping", - "key": "t_uint256", - "label": "mapping(uint256 => bytes32)", - "numberOfBytes": "32", - "value": "t_bytes32" - }, - "t_string_storage": { - "encoding": "bytes", - "label": "string", - "numberOfBytes": "32" - }, - "t_struct(Buffer)17819_storage": { - "encoding": "inplace", - "label": "struct Lib_RingBuffer.Buffer", - "members": [ - { - "astId": 17814, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "length", - "offset": 0, - "slot": "0", - "type": "t_uint256" - }, - { - "astId": 17818, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "buf", - "offset": 0, - "slot": "1", - "type": "t_mapping(t_uint256,t_bytes32)" - } - ], - "numberOfBytes": "64" - }, - "t_struct(RingBuffer)17830_storage": { - "encoding": "inplace", - "label": "struct Lib_RingBuffer.RingBuffer", - "members": [ - { - "astId": 17821, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "contextA", - "offset": 0, - "slot": "0", - "type": "t_bytes32" - }, - { - "astId": 17823, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "contextB", - "offset": 0, - "slot": "1", - "type": "t_bytes32" - }, - { - "astId": 17825, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "bufferA", - "offset": 0, - "slot": "2", - "type": "t_struct(Buffer)17819_storage" - }, - { - "astId": 17827, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "bufferB", - "offset": 0, - "slot": "4", - "type": "t_struct(Buffer)17819_storage" - }, - { - "astId": 17829, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "nextOverwritableIndex", - "offset": 0, - "slot": "6", - "type": "t_uint256" - } - ], - "numberOfBytes": "224" - }, - "t_uint256": { - "encoding": "inplace", - "label": "uint256", - "numberOfBytes": "32" - } - } - } -} \ No newline at end of file diff --git a/packages/contracts/deployments/goerli-v2/OVM_ChainStorageContainer-SCC-batches.json b/packages/contracts/deployments/goerli-v2/OVM_ChainStorageContainer-SCC-batches.json deleted file mode 100644 index ada7be38b06a5..0000000000000 --- a/packages/contracts/deployments/goerli-v2/OVM_ChainStorageContainer-SCC-batches.json +++ /dev/null @@ -1,453 +0,0 @@ -{ - "address": "0x96bD3A792Cc288C51C55A33BC8089026c7009bfd", - "abi": [ - { - "inputs": [ - { - "internalType": "address", - "name": "_libAddressManager", - "type": "address" - }, - { - "internalType": "string", - "name": "_owner", - "type": "string" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_index", - "type": "uint256" - }, - { - "internalType": "bytes27", - "name": "_globalMetadata", - "type": "bytes27" - } - ], - "name": "deleteElementsAfterInclusive", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_index", - "type": "uint256" - } - ], - "name": "deleteElementsAfterInclusive", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_index", - "type": "uint256" - } - ], - "name": "get", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getGlobalMetadata", - "outputs": [ - { - "internalType": "bytes27", - "name": "", - "type": "bytes27" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "length", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "libAddressManager", - "outputs": [ - { - "internalType": "contract Lib_AddressManager", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "owner", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "_object", - "type": "bytes32" - }, - { - "internalType": "bytes27", - "name": "_globalMetadata", - "type": "bytes27" - } - ], - "name": "push", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "_object", - "type": "bytes32" - } - ], - "name": "push", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "string", - "name": "_name", - "type": "string" - } - ], - "name": "resolve", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes27", - "name": "_globalMetadata", - "type": "bytes27" - } - ], - "name": "setGlobalMetadata", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_index", - "type": "uint256" - } - ], - "name": "setNextOverwritableIndex", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - } - ], - "transactionHash": "0xea10c27add14a7018e171325bef4e74e94d6090e882954cce1873b751ff8e33c", - "receipt": { - "to": null, - "from": "0x558ba9b8d78713fbf768c1f8a584485B4003f43F", - "contractAddress": "0x96bD3A792Cc288C51C55A33BC8089026c7009bfd", - "transactionIndex": 38, - "gasUsed": "970942", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0x036895d3c72fa85ed0f7854c885061b3c8e12361b8a59b64262f92dcfa856542", - "transactionHash": "0xea10c27add14a7018e171325bef4e74e94d6090e882954cce1873b751ff8e33c", - "logs": [], - "blockNumber": 4607697, - "cumulativeGasUsed": "3138918", - "status": 1, - "byzantium": true - }, - "args": [ - "0x9933d137bBF050Cf3D7555fE1beC91eF698814e5", - "OVM_StateCommitmentChain" - ], - "solcInputHash": "8aef3555d89ad9d3af2f5d28a85dc856", - "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_owner\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"get\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getGlobalMetadata\",\"outputs\":[{\"internalType\":\"bytes27\",\"name\":\"\",\"type\":\"bytes27\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"length\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"setGlobalMetadata\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"setNextOverwritableIndex\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The Chain Storage Container provides its owner contract with read, write and delete functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which can no longer be used in a fraud proof due to the fraud window having passed, and the associated chain state or transactions being finalized. Three distinct Chain Storage Containers will be deployed on Layer 1: 1. Stores transaction batches for the Canonical Transaction Chain 2. Stores queued transactions for the Canonical Transaction Chain 3. Stores chain state batches for the State Commitment Chain Compiler used: solc Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\",\"_owner\":\"Name of the contract that owns this container (will be resolved later).\"}},\"deleteElementsAfterInclusive(uint256)\":{\"params\":{\"_index\":\"Object index to delete from.\"}},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_index\":\"Object index to delete from.\"}},\"get(uint256)\":{\"params\":{\"_index\":\"Index of the particular object to access.\"},\"returns\":{\"_0\":\"32 byte object value.\"}},\"getGlobalMetadata()\":{\"returns\":{\"_0\":\"Container global metadata field.\"}},\"length()\":{\"returns\":{\"_0\":\"Number of objects in the container.\"}},\"push(bytes32)\":{\"params\":{\"_object\":\"A 32 byte value to insert into the container.\"}},\"push(bytes32,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_object\":\"A 32 byte value to insert into the container.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}},\"setGlobalMetadata(bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata to set.\"}}},\"title\":\"OVM_ChainStorageContainer\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"deleteElementsAfterInclusive(uint256)\":{\"notice\":\"Removes all objects after and including a given index.\"},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"notice\":\"Removes all objects after and including a given index. Also allows setting the global metadata field.\"},\"get(uint256)\":{\"notice\":\"Retrieves an object from the container.\"},\"getGlobalMetadata()\":{\"notice\":\"Retrieves the container's global metadata field.\"},\"length()\":{\"notice\":\"Retrieves the number of objects stored in the container.\"},\"push(bytes32)\":{\"notice\":\"Pushes an object into the container.\"},\"push(bytes32,bytes27)\":{\"notice\":\"Pushes an object into the container. Function allows setting the global metadata since we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global metadata (it's an optimization).\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"},\"setGlobalMetadata(bytes27)\":{\"notice\":\"Sets the container's global metadata field. We're using `bytes27` here because we use five bytes to maintain the length of the underlying data structure, meaning we have an extra 27 bytes to store arbitrary data.\"},\"setNextOverwritableIndex(uint256)\":{\"notice\":\"Marks an index as overwritable, meaing the underlying buffer can start to write values over any objects before and including the given index.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol\":\"OVM_ChainStorageContainer\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_RingBuffer } from \\\"../../libraries/utils/Lib_RingBuffer.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_ChainStorageContainer } from \\\"../../iOVM/chain/iOVM_ChainStorageContainer.sol\\\";\\n\\n/**\\n * @title OVM_ChainStorageContainer\\n * @dev The Chain Storage Container provides its owner contract with read, write and delete functionality.\\n * This provides gas efficiency gains by enabling it to overwrite storage slots which can no longer be used\\n * in a fraud proof due to the fraud window having passed, and the associated chain state or\\n * transactions being finalized.\\n * Three distinct Chain Storage Containers will be deployed on Layer 1:\\n * 1. Stores transaction batches for the Canonical Transaction Chain\\n * 2. Stores queued transactions for the Canonical Transaction Chain\\n * 3. Stores chain state batches for the State Commitment Chain\\n *\\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract OVM_ChainStorageContainer is iOVM_ChainStorageContainer, Lib_AddressResolver {\\n\\n /*************\\n * Libraries *\\n *************/\\n\\n using Lib_RingBuffer for Lib_RingBuffer.RingBuffer;\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n string public owner;\\n Lib_RingBuffer.RingBuffer internal buffer;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n * @param _owner Name of the contract that owns this container (will be resolved later).\\n */\\n constructor(\\n address _libAddressManager,\\n string memory _owner\\n )\\n Lib_AddressResolver(_libAddressManager)\\n {\\n owner = _owner;\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n msg.sender == resolve(owner),\\n \\\"OVM_ChainStorageContainer: Function can only be called by the owner.\\\"\\n );\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function setGlobalMetadata(\\n bytes27 _globalMetadata\\n )\\n override\\n public\\n onlyOwner\\n {\\n return buffer.setExtraData(_globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function getGlobalMetadata()\\n override\\n public\\n view\\n returns (\\n bytes27\\n )\\n {\\n return buffer.getExtraData();\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function length()\\n override\\n public\\n view\\n returns (\\n uint256\\n )\\n {\\n return uint256(buffer.getLength());\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function push(\\n bytes32 _object\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.push(_object);\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function push(\\n bytes32 _object,\\n bytes27 _globalMetadata\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.push(_object, _globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function get(\\n uint256 _index\\n )\\n override\\n public\\n view\\n returns (\\n bytes32\\n )\\n {\\n return buffer.get(uint40(_index));\\n }\\n \\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.deleteElementsAfterInclusive(\\n uint40(_index)\\n );\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index,\\n bytes27 _globalMetadata\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.deleteElementsAfterInclusive(\\n uint40(_index),\\n _globalMetadata\\n );\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function setNextOverwritableIndex(\\n uint256 _index\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.nextOverwritableIndex = _index;\\n }\\n}\\n\",\"keccak256\":\"0x52e3ef7166fe134d32997917067e3d74128173b12fb6231eec34132102ddbb50\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_ChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title iOVM_ChainStorageContainer\\n */\\ninterface iOVM_ChainStorageContainer {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata()\\n external\\n view\\n returns (\\n bytes27\\n );\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length()\\n external\\n view\\n returns (\\n uint256\\n );\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(\\n bytes32 _object\\n )\\n external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(\\n bytes32 _object,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(\\n uint256 _index\\n )\\n external\\n view\\n returns (\\n bytes32\\n );\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index\\n )\\n external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Marks an index as overwritable, meaing the underlying buffer can start to write values over\\n * any objects before and including the given index.\\n */\\n function setNextOverwritableIndex(\\n uint256 _index\\n )\\n external;\\n}\\n\",\"keccak256\":\"0x2d7973a0ad84c23ec62624d3f1e3aeb198cc72686ff1e6cfa17155556b320c94\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Contract Imports */\\nimport { Ownable } from \\\"./Lib_Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n public\\n onlyOwner\\n {\\n addresses[_getNameHash(_name)] = _address;\\n\\n emit AddressSet(\\n _name,\\n _address\\n );\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0x36473d229ce0ba9d1cac5f02f84be843d9dcc8008525590a1652a2c2636f95f2\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(\\n address _libAddressManager\\n ) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x65981feeabff6a81783ea97d44baf988a18a86c8cb374c46fdb71819cbacc7c0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Ownable\\n * @dev Adapted from https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol\\n */\\nabstract contract Ownable {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n address public owner;\\n\\n\\n /**********\\n * Events *\\n **********/\\n\\n event OwnershipTransferred(\\n address indexed previousOwner,\\n address indexed newOwner\\n );\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n constructor() {\\n owner = msg.sender;\\n emit OwnershipTransferred(address(0), owner);\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n owner == msg.sender,\\n \\\"Ownable: caller is not the owner\\\"\\n );\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the owner of this contract to the zero address, effectively renouncing ownership\\n * completely. Can only be called by the current owner of this contract.\\n */\\n function renounceOwnership()\\n public\\n virtual\\n onlyOwner\\n {\\n emit OwnershipTransferred(owner, address(0));\\n owner = address(0);\\n }\\n\\n /**\\n * Transfers ownership of this contract to a new address. Can only be called by the current\\n * owner of this contract.\\n * @param _newOwner Address of the new contract owner.\\n */\\n function transferOwnership(\\n address _newOwner\\n )\\n public\\n virtual\\n onlyOwner\\n {\\n require(\\n _newOwner != address(0),\\n \\\"Ownable: new owner cannot be the zero address\\\"\\n );\\n\\n emit OwnershipTransferred(owner, _newOwner);\\n owner = _newOwner;\\n }\\n}\\n\",\"keccak256\":\"0x83f9a6c4608b5929086429205b00f8211cdfcba83f3c84520f24d8aa64fe4b82\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_RingBuffer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\nlibrary Lib_RingBuffer {\\n using Lib_RingBuffer for RingBuffer;\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Buffer {\\n uint256 length;\\n mapping (uint256 => bytes32) buf;\\n }\\n\\n struct RingBuffer {\\n bytes32 contextA;\\n bytes32 contextB;\\n Buffer bufferA;\\n Buffer bufferB;\\n uint256 nextOverwritableIndex;\\n }\\n\\n struct RingBufferContext {\\n // contextA\\n uint40 globalIndex;\\n bytes27 extraData;\\n\\n // contextB\\n uint64 currBufferIndex;\\n uint40 prevResetIndex;\\n uint40 currResetIndex;\\n }\\n\\n\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 constant MIN_CAPACITY = 16;\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n * @param _extraData Optional global extra data.\\n */\\n function push(\\n RingBuffer storage _self,\\n bytes32 _value,\\n bytes27 _extraData\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n Buffer storage currBuffer = _self.getBuffer(ctx.currBufferIndex);\\n\\n // Set a minimum capacity.\\n if (currBuffer.length == 0) {\\n currBuffer.length = MIN_CAPACITY;\\n }\\n\\n // Check if we need to expand the buffer.\\n if (ctx.globalIndex - ctx.currResetIndex >= currBuffer.length) {\\n if (ctx.currResetIndex < _self.nextOverwritableIndex) {\\n // We're going to overwrite the inactive buffer.\\n // Bump the buffer index, reset the delete offset, and set our reset indices.\\n ctx.currBufferIndex++;\\n ctx.prevResetIndex = ctx.currResetIndex;\\n ctx.currResetIndex = ctx.globalIndex;\\n\\n // Swap over to the next buffer.\\n currBuffer = _self.getBuffer(ctx.currBufferIndex);\\n } else {\\n // We're not overwriting yet, double the length of the current buffer.\\n currBuffer.length *= 2;\\n }\\n }\\n\\n // Index to write to is the difference of the global and reset indices.\\n uint256 writeHead = ctx.globalIndex - ctx.currResetIndex;\\n currBuffer.buf[writeHead] = _value;\\n\\n // Bump the global index and insert our extra data, then save the context.\\n ctx.globalIndex++;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n */\\n function push(\\n RingBuffer storage _self,\\n bytes32 _value\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n \\n _self.push(\\n _value,\\n ctx.extraData\\n );\\n }\\n\\n /**\\n * Retrieves an element from the buffer.\\n * @param _self Buffer to access.\\n * @param _index Element index to retrieve.\\n * @return Value of the element at the given index.\\n */\\n function get(\\n RingBuffer storage _self,\\n uint256 _index\\n )\\n internal\\n view\\n returns (\\n bytes32 \\n )\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n\\n require(\\n _index < ctx.globalIndex,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n Buffer storage currBuffer = _self.getBuffer(ctx.currBufferIndex);\\n Buffer storage prevBuffer = _self.getBuffer(ctx.currBufferIndex + 1);\\n\\n if (_index >= ctx.currResetIndex) {\\n // We're trying to load an element from the current buffer.\\n // Relative index is just the difference from the reset index.\\n uint256 relativeIndex = _index - ctx.currResetIndex;\\n\\n // Shouldn't happen but why not check.\\n require(\\n relativeIndex < currBuffer.length,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n return currBuffer.buf[relativeIndex];\\n } else {\\n // We're trying to load an element from the previous buffer.\\n // Relative index is the difference from the reset index in the other direction.\\n uint256 relativeIndex = ctx.currResetIndex - _index;\\n\\n // Condition only fails in the case that we deleted and flipped buffers.\\n require(\\n ctx.currResetIndex > ctx.prevResetIndex,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n // Make sure we're not trying to read beyond the array.\\n require(\\n relativeIndex <= prevBuffer.length,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n return prevBuffer.buf[prevBuffer.length - relativeIndex];\\n }\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n * @param _extraData Optional global extra data.\\n */\\n function deleteElementsAfterInclusive(\\n RingBuffer storage _self,\\n uint40 _index,\\n bytes27 _extraData\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n\\n require(\\n _index < ctx.globalIndex && _index >= ctx.prevResetIndex,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n if (_index < ctx.currResetIndex) {\\n // We're switching back to the previous buffer.\\n // Reduce the buffer index, set the current reset index back to match the previous one.\\n // We use the equality of these two values to prevent reading beyond this buffer.\\n ctx.currBufferIndex--;\\n ctx.currResetIndex = ctx.prevResetIndex;\\n }\\n\\n // Set our global index and extra data, save the context.\\n ctx.globalIndex = _index;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n */\\n function deleteElementsAfterInclusive(\\n RingBuffer storage _self,\\n uint40 _index\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n _self.deleteElementsAfterInclusive(\\n _index,\\n ctx.extraData\\n );\\n }\\n\\n /**\\n * Retrieves the current global index.\\n * @param _self Buffer to access.\\n * @return Current global index.\\n */\\n function getLength(\\n RingBuffer storage _self\\n )\\n internal\\n view\\n returns (\\n uint40\\n )\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n return ctx.globalIndex;\\n }\\n\\n /**\\n * Changes current global extra data.\\n * @param _self Buffer to access.\\n * @param _extraData New global extra data.\\n */\\n function setExtraData(\\n RingBuffer storage _self,\\n bytes27 _extraData\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Retrieves the current global extra data.\\n * @param _self Buffer to access.\\n * @return Current global extra data.\\n */\\n function getExtraData(\\n RingBuffer storage _self\\n )\\n internal\\n view\\n returns (\\n bytes27\\n )\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n return ctx.extraData;\\n }\\n\\n /**\\n * Sets the current ring buffer context.\\n * @param _self Buffer to access.\\n * @param _ctx Current ring buffer context.\\n */\\n function setContext(\\n RingBuffer storage _self,\\n RingBufferContext memory _ctx\\n )\\n internal\\n {\\n bytes32 contextA;\\n bytes32 contextB;\\n\\n uint40 globalIndex = _ctx.globalIndex;\\n bytes27 extraData = _ctx.extraData;\\n assembly {\\n contextA := globalIndex\\n contextA := or(contextA, extraData)\\n }\\n\\n uint64 currBufferIndex = _ctx.currBufferIndex;\\n uint40 prevResetIndex = _ctx.prevResetIndex;\\n uint40 currResetIndex = _ctx.currResetIndex;\\n assembly {\\n contextB := currBufferIndex\\n contextB := or(contextB, shl(64, prevResetIndex))\\n contextB := or(contextB, shl(104, currResetIndex))\\n }\\n\\n if (_self.contextA != contextA) {\\n _self.contextA = contextA;\\n }\\n\\n if (_self.contextB != contextB) {\\n _self.contextB = contextB;\\n }\\n }\\n\\n /**\\n * Retrieves the current ring buffer context.\\n * @param _self Buffer to access.\\n * @return Current ring buffer context.\\n */\\n function getContext(\\n RingBuffer storage _self\\n )\\n internal\\n view\\n returns (\\n RingBufferContext memory\\n )\\n {\\n bytes32 contextA = _self.contextA;\\n bytes32 contextB = _self.contextB;\\n\\n uint40 globalIndex;\\n bytes27 extraData;\\n assembly {\\n globalIndex := and(contextA, 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF)\\n extraData := and(contextA, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000)\\n }\\n\\n uint64 currBufferIndex;\\n uint40 prevResetIndex;\\n uint40 currResetIndex;\\n assembly {\\n currBufferIndex := and(contextB, 0x000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF)\\n prevResetIndex := shr(64, and(contextB, 0x00000000000000000000000000000000000000FFFFFFFFFF0000000000000000))\\n currResetIndex := shr(104, and(contextB, 0x0000000000000000000000000000FFFFFFFFFF00000000000000000000000000))\\n }\\n\\n return RingBufferContext({\\n globalIndex: globalIndex,\\n extraData: extraData,\\n currBufferIndex: currBufferIndex,\\n prevResetIndex: prevResetIndex,\\n currResetIndex: currResetIndex\\n });\\n }\\n\\n /**\\n * Retrieves the a buffer from the ring buffer by index.\\n * @param _self Buffer to access.\\n * @param _which Index of the sub buffer to access.\\n * @return Sub buffer for the index.\\n */\\n function getBuffer(\\n RingBuffer storage _self,\\n uint256 _which\\n )\\n internal\\n view\\n returns (\\n Buffer storage\\n )\\n {\\n return _which % 2 == 0 ? _self.bufferA : _self.bufferB;\\n }\\n}\\n\",\"keccak256\":\"0xb38cb98da2d09f922d5cfe772bdbd36ede2b2267ade93128e949c9da21b89940\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x60806040523480156200001157600080fd5b506040516200118d3803806200118d833981810160405260408110156200003757600080fd5b8151602083018051604051929492938301929190846401000000008211156200005f57600080fd5b9083019060208201858111156200007557600080fd5b82516401000000008111828201881017156200009057600080fd5b82525081516020918201929091019080838360005b83811015620000bf578181015183820152602001620000a5565b50505050905090810190601f168015620000ed5780820380516001836020036101000a031916815260200191505b506040525050600080546001600160a01b0319166001600160a01b038516179055508051620001249060019060208401906200012d565b505050620001d9565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282620001655760008555620001b0565b82601f106200018057805160ff1916838001178555620001b0565b82800160010185558215620001b0579182015b82811115620001b057825182559160200191906001019062000193565b50620001be929150620001c2565b5090565b5b80821115620001be5760008155600101620001c3565b610fa480620001e96000396000f3fe608060405234801561001057600080fd5b50600436106100b45760003560e01c80634651d91e116100715780634651d91e1461021a5780638da5cb5b146102375780639507d39a146102b4578063b298e36b146102d1578063ccf8f969146102ee578063fa9e936c14610311576100b4565b8063167fd681146100b95780631f7b6d32146100e65780632015276c1461010057806329061de21461012b578063299ca47814610150578063461a447814610174575b600080fd5b6100e4600480360360408110156100cf57600080fd5b508035906020013564ffffffffff191661032e565b005b6100ee610423565b60408051918252519081900360200190f35b6100e46004803603604081101561011657600080fd5b508035906020013564ffffffffff191661043b565b6100e46004803603602081101561014157600080fd5b503564ffffffffff19166104f7565b6101586105b5565b604080516001600160a01b039092168252519081900360200190f35b6101586004803603602081101561018a57600080fd5b8101906020810181356401000000008111156101a557600080fd5b8201836020820111156101b757600080fd5b803590602001918460018302840111640100000000831117156101d957600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506105c4945050505050565b6100e46004803603602081101561023057600080fd5b50356106a0565b61023f61075b565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610279578181015183820152602001610261565b50505050905090810190601f1680156102a65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6100ee600480360360208110156102ca57600080fd5b50356107e8565b6100e4600480360360208110156102e757600080fd5b5035610802565b6102f66108bd565b6040805164ffffffffff199092168252519081900360200190f35b6100e46004803603602081101561032757600080fd5b50356108ce565b60018054604080516020601f6002600019610100878916150201909516949094049384018190048102820181019092528281526103c493909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b820191906000526020600020905b81548152906001019060200180831161039d57829003601f168201915b50505050506105c4565b6001600160a01b0316336001600160a01b0316146104135760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b61041f60028383610983565b5050565b600061042f6002610a75565b64ffffffffff16905090565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261049c93909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146104eb5760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b61041f60028383610a89565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261055893909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146105a75760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b6105b2600282610b90565b50565b6000546001600160a01b031681565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b8381101561062457818101518382015260200161060c565b50505050905090810190601f1680156106515780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561066e57600080fd5b505afa158015610682573d6000803e3d6000fd5b505050506040513d602081101561069857600080fd5b505192915050565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261070193909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146107505760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b6105b2600282610bba565b60018054604080516020600284861615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156107e05780601f106107b5576101008083540402835291602001916107e0565b820191906000526020600020905b8154815290600101906020018083116107c357829003601f168201915b505050505081565b60006107fc600264ffffffffff8416610be0565b92915050565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261086393909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146108b25760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b6105b2600282610de9565b60006108c96002610e0f565b905090565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261092f93909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b03161461097e5760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b600855565b600061098e84610e26565b9050806000015164ffffffffff168364ffffffffff161080156109c35750806060015164ffffffffff168364ffffffffff1610155b610a0b576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b806080015164ffffffffff168364ffffffffff161015610a4d576040810180516000190167ffffffffffffffff169052606081015164ffffffffff1660808201525b64ffffffffff8316815264ffffffffff1982166020820152610a6f8482610e86565b50505050565b600080610a8183610e26565b519392505050565b6000610a9484610e26565b90506000610ab9826040015167ffffffffffffffff1686610edc90919063ffffffff16565b8054909150610ac757601081555b8054608083015183510364ffffffffff1610610b3e578460060154826080015164ffffffffff161015610b365760408201805160010167ffffffffffffffff169081905260808301805164ffffffffff90811660608601528451169052610b2f908690610edc565b9050610b3e565b805460020281555b608082015182510364ffffffffff9081166000818152600184810160209081526040909220889055855101909216845264ffffffffff19851691840191909152610b888684610e86565b505050505050565b6000610b9b83610e26565b64ffffffffff19831660208201529050610bb58382610e86565b505050565b6000610bc583610e26565b9050610bb5828260200151856109839092919063ffffffff16565b600080610bec84610e26565b805190915064ffffffffff168310610c42576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b6000610c65826040015167ffffffffffffffff1686610edc90919063ffffffff16565b90506000610c8d836040015160010167ffffffffffffffff1687610edc90919063ffffffff16565b9050826080015164ffffffffff168510610d1a576080830151825464ffffffffff9091168603908110610cfe576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b6000908152600190920160205250604090205491506107fc9050565b6080830151606084015164ffffffffff9182168781039290911610610d7d576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b8154811115610dca576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b81540360009081526001909101602052604090205492506107fc915050565b6000610df483610e26565b9050610bb582826020015185610a899092919063ffffffff16565b600080610e1b83610e26565b602001519392505050565b610e2e610efc565b5080546001909101546040805160a08101825264ffffffffff808516825264ffffffffff19909416602082015267ffffffffffffffff8316818301529082901c8316606082015260689190911c909116608082015290565b80516020820151604080840151606085015160808601518754858717969483901b8417606883901b1795939291908714610ebe578689555b85896001015414610ed157600189018690555b505050505050505050565b60006002820615610ef05782600401610ef5565b826002015b9392505050565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091529056fe4f564d5f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2063616e206f6e6c792062652063616c6c656420627920746865206f776e65722ea26469706673582212204a2a7ecf8f5f0c65c63241718caf1a7f24a3e346c23cab12b3750f7a2ffd56c564736f6c63430007060033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100b45760003560e01c80634651d91e116100715780634651d91e1461021a5780638da5cb5b146102375780639507d39a146102b4578063b298e36b146102d1578063ccf8f969146102ee578063fa9e936c14610311576100b4565b8063167fd681146100b95780631f7b6d32146100e65780632015276c1461010057806329061de21461012b578063299ca47814610150578063461a447814610174575b600080fd5b6100e4600480360360408110156100cf57600080fd5b508035906020013564ffffffffff191661032e565b005b6100ee610423565b60408051918252519081900360200190f35b6100e46004803603604081101561011657600080fd5b508035906020013564ffffffffff191661043b565b6100e46004803603602081101561014157600080fd5b503564ffffffffff19166104f7565b6101586105b5565b604080516001600160a01b039092168252519081900360200190f35b6101586004803603602081101561018a57600080fd5b8101906020810181356401000000008111156101a557600080fd5b8201836020820111156101b757600080fd5b803590602001918460018302840111640100000000831117156101d957600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506105c4945050505050565b6100e46004803603602081101561023057600080fd5b50356106a0565b61023f61075b565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610279578181015183820152602001610261565b50505050905090810190601f1680156102a65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6100ee600480360360208110156102ca57600080fd5b50356107e8565b6100e4600480360360208110156102e757600080fd5b5035610802565b6102f66108bd565b6040805164ffffffffff199092168252519081900360200190f35b6100e46004803603602081101561032757600080fd5b50356108ce565b60018054604080516020601f6002600019610100878916150201909516949094049384018190048102820181019092528281526103c493909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b820191906000526020600020905b81548152906001019060200180831161039d57829003601f168201915b50505050506105c4565b6001600160a01b0316336001600160a01b0316146104135760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b61041f60028383610983565b5050565b600061042f6002610a75565b64ffffffffff16905090565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261049c93909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146104eb5760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b61041f60028383610a89565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261055893909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146105a75760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b6105b2600282610b90565b50565b6000546001600160a01b031681565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b8381101561062457818101518382015260200161060c565b50505050905090810190601f1680156106515780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561066e57600080fd5b505afa158015610682573d6000803e3d6000fd5b505050506040513d602081101561069857600080fd5b505192915050565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261070193909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146107505760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b6105b2600282610bba565b60018054604080516020600284861615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156107e05780601f106107b5576101008083540402835291602001916107e0565b820191906000526020600020905b8154815290600101906020018083116107c357829003601f168201915b505050505081565b60006107fc600264ffffffffff8416610be0565b92915050565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261086393909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146108b25760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b6105b2600282610de9565b60006108c96002610e0f565b905090565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261092f93909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b03161461097e5760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b600855565b600061098e84610e26565b9050806000015164ffffffffff168364ffffffffff161080156109c35750806060015164ffffffffff168364ffffffffff1610155b610a0b576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b806080015164ffffffffff168364ffffffffff161015610a4d576040810180516000190167ffffffffffffffff169052606081015164ffffffffff1660808201525b64ffffffffff8316815264ffffffffff1982166020820152610a6f8482610e86565b50505050565b600080610a8183610e26565b519392505050565b6000610a9484610e26565b90506000610ab9826040015167ffffffffffffffff1686610edc90919063ffffffff16565b8054909150610ac757601081555b8054608083015183510364ffffffffff1610610b3e578460060154826080015164ffffffffff161015610b365760408201805160010167ffffffffffffffff169081905260808301805164ffffffffff90811660608601528451169052610b2f908690610edc565b9050610b3e565b805460020281555b608082015182510364ffffffffff9081166000818152600184810160209081526040909220889055855101909216845264ffffffffff19851691840191909152610b888684610e86565b505050505050565b6000610b9b83610e26565b64ffffffffff19831660208201529050610bb58382610e86565b505050565b6000610bc583610e26565b9050610bb5828260200151856109839092919063ffffffff16565b600080610bec84610e26565b805190915064ffffffffff168310610c42576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b6000610c65826040015167ffffffffffffffff1686610edc90919063ffffffff16565b90506000610c8d836040015160010167ffffffffffffffff1687610edc90919063ffffffff16565b9050826080015164ffffffffff168510610d1a576080830151825464ffffffffff9091168603908110610cfe576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b6000908152600190920160205250604090205491506107fc9050565b6080830151606084015164ffffffffff9182168781039290911610610d7d576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b8154811115610dca576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b81540360009081526001909101602052604090205492506107fc915050565b6000610df483610e26565b9050610bb582826020015185610a899092919063ffffffff16565b600080610e1b83610e26565b602001519392505050565b610e2e610efc565b5080546001909101546040805160a08101825264ffffffffff808516825264ffffffffff19909416602082015267ffffffffffffffff8316818301529082901c8316606082015260689190911c909116608082015290565b80516020820151604080840151606085015160808601518754858717969483901b8417606883901b1795939291908714610ebe578689555b85896001015414610ed157600189018690555b505050505050505050565b60006002820615610ef05782600401610ef5565b826002015b9392505050565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091529056fe4f564d5f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2063616e206f6e6c792062652063616c6c656420627920746865206f776e65722ea26469706673582212204a2a7ecf8f5f0c65c63241718caf1a7f24a3e346c23cab12b3750f7a2ffd56c564736f6c63430007060033", - "devdoc": { - "details": "The Chain Storage Container provides its owner contract with read, write and delete functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which can no longer be used in a fraud proof due to the fraud window having passed, and the associated chain state or transactions being finalized. Three distinct Chain Storage Containers will be deployed on Layer 1: 1. Stores transaction batches for the Canonical Transaction Chain 2. Stores queued transactions for the Canonical Transaction Chain 3. Stores chain state batches for the State Commitment Chain Compiler used: solc Runtime target: EVM", - "kind": "dev", - "methods": { - "constructor": { - "params": { - "_libAddressManager": "Address of the Address Manager.", - "_owner": "Name of the contract that owns this container (will be resolved later)." - } - }, - "deleteElementsAfterInclusive(uint256)": { - "params": { - "_index": "Object index to delete from." - } - }, - "deleteElementsAfterInclusive(uint256,bytes27)": { - "params": { - "_globalMetadata": "New global metadata for the container.", - "_index": "Object index to delete from." - } - }, - "get(uint256)": { - "params": { - "_index": "Index of the particular object to access." - }, - "returns": { - "_0": "32 byte object value." - } - }, - "getGlobalMetadata()": { - "returns": { - "_0": "Container global metadata field." - } - }, - "length()": { - "returns": { - "_0": "Number of objects in the container." - } - }, - "push(bytes32)": { - "params": { - "_object": "A 32 byte value to insert into the container." - } - }, - "push(bytes32,bytes27)": { - "params": { - "_globalMetadata": "New global metadata for the container.", - "_object": "A 32 byte value to insert into the container." - } - }, - "resolve(string)": { - "params": { - "_name": "Name to resolve an address for." - }, - "returns": { - "_0": "Address associated with the given name." - } - }, - "setGlobalMetadata(bytes27)": { - "params": { - "_globalMetadata": "New global metadata to set." - } - } - }, - "title": "OVM_ChainStorageContainer", - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": { - "deleteElementsAfterInclusive(uint256)": { - "notice": "Removes all objects after and including a given index." - }, - "deleteElementsAfterInclusive(uint256,bytes27)": { - "notice": "Removes all objects after and including a given index. Also allows setting the global metadata field." - }, - "get(uint256)": { - "notice": "Retrieves an object from the container." - }, - "getGlobalMetadata()": { - "notice": "Retrieves the container's global metadata field." - }, - "length()": { - "notice": "Retrieves the number of objects stored in the container." - }, - "push(bytes32)": { - "notice": "Pushes an object into the container." - }, - "push(bytes32,bytes27)": { - "notice": "Pushes an object into the container. Function allows setting the global metadata since we'll need to touch the \"length\" storage slot anyway, which also contains the global metadata (it's an optimization)." - }, - "resolve(string)": { - "notice": "Resolves the address associated with a given name." - }, - "setGlobalMetadata(bytes27)": { - "notice": "Sets the container's global metadata field. We're using `bytes27` here because we use five bytes to maintain the length of the underlying data structure, meaning we have an extra 27 bytes to store arbitrary data." - }, - "setNextOverwritableIndex(uint256)": { - "notice": "Marks an index as overwritable, meaing the underlying buffer can start to write values over any objects before and including the given index." - } - }, - "version": 1 - }, - "storageLayout": { - "storage": [ - { - "astId": 12557, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "libAddressManager", - "offset": 0, - "slot": "0", - "type": "t_contract(Lib_AddressManager)12550" - }, - { - "astId": 3772, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "owner", - "offset": 0, - "slot": "1", - "type": "t_string_storage" - }, - { - "astId": 3774, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "buffer", - "offset": 0, - "slot": "2", - "type": "t_struct(RingBuffer)17830_storage" - } - ], - "types": { - "t_bytes32": { - "encoding": "inplace", - "label": "bytes32", - "numberOfBytes": "32" - }, - "t_contract(Lib_AddressManager)12550": { - "encoding": "inplace", - "label": "contract Lib_AddressManager", - "numberOfBytes": "20" - }, - "t_mapping(t_uint256,t_bytes32)": { - "encoding": "mapping", - "key": "t_uint256", - "label": "mapping(uint256 => bytes32)", - "numberOfBytes": "32", - "value": "t_bytes32" - }, - "t_string_storage": { - "encoding": "bytes", - "label": "string", - "numberOfBytes": "32" - }, - "t_struct(Buffer)17819_storage": { - "encoding": "inplace", - "label": "struct Lib_RingBuffer.Buffer", - "members": [ - { - "astId": 17814, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "length", - "offset": 0, - "slot": "0", - "type": "t_uint256" - }, - { - "astId": 17818, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "buf", - "offset": 0, - "slot": "1", - "type": "t_mapping(t_uint256,t_bytes32)" - } - ], - "numberOfBytes": "64" - }, - "t_struct(RingBuffer)17830_storage": { - "encoding": "inplace", - "label": "struct Lib_RingBuffer.RingBuffer", - "members": [ - { - "astId": 17821, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "contextA", - "offset": 0, - "slot": "0", - "type": "t_bytes32" - }, - { - "astId": 17823, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "contextB", - "offset": 0, - "slot": "1", - "type": "t_bytes32" - }, - { - "astId": 17825, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "bufferA", - "offset": 0, - "slot": "2", - "type": "t_struct(Buffer)17819_storage" - }, - { - "astId": 17827, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "bufferB", - "offset": 0, - "slot": "4", - "type": "t_struct(Buffer)17819_storage" - }, - { - "astId": 17829, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "nextOverwritableIndex", - "offset": 0, - "slot": "6", - "type": "t_uint256" - } - ], - "numberOfBytes": "224" - }, - "t_uint256": { - "encoding": "inplace", - "label": "uint256", - "numberOfBytes": "32" - } - } - } -} \ No newline at end of file diff --git a/packages/contracts/deployments/goerli-v2/OVM_ExecutionManager.json b/packages/contracts/deployments/goerli-v2/OVM_ExecutionManager.json deleted file mode 100644 index 0e284fa98d774..0000000000000 --- a/packages/contracts/deployments/goerli-v2/OVM_ExecutionManager.json +++ /dev/null @@ -1,1263 +0,0 @@ -{ - "address": "0x3212027673655d3047c13139e3233ccd4A78417c", - "abi": [ - { - "inputs": [ - { - "internalType": "address", - "name": "_libAddressManager", - "type": "address" - }, - { - "components": [ - { - "internalType": "uint256", - "name": "minTransactionGasLimit", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "maxTransactionGasLimit", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "maxGasPerQueuePerEpoch", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "secondsPerEpoch", - "type": "uint256" - } - ], - "internalType": "struct iOVM_ExecutionManager.GasMeterConfig", - "name": "_gasMeterConfig", - "type": "tuple" - }, - { - "components": [ - { - "internalType": "uint256", - "name": "ovmCHAINID", - "type": "uint256" - } - ], - "internalType": "struct iOVM_ExecutionManager.GlobalContext", - "name": "_globalContext", - "type": "tuple" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "inputs": [], - "name": "getMaxTransactionGasLimit", - "outputs": [ - { - "internalType": "uint256", - "name": "_maxTransactionGasLimit", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "libAddressManager", - "outputs": [ - { - "internalType": "contract Lib_AddressManager", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "ovmADDRESS", - "outputs": [ - { - "internalType": "address", - "name": "_ADDRESS", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_gasLimit", - "type": "uint256" - }, - { - "internalType": "address", - "name": "_address", - "type": "address" - }, - { - "internalType": "bytes", - "name": "_calldata", - "type": "bytes" - } - ], - "name": "ovmCALL", - "outputs": [ - { - "internalType": "bool", - "name": "_success", - "type": "bool" - }, - { - "internalType": "bytes", - "name": "_returndata", - "type": "bytes" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "ovmCALLER", - "outputs": [ - { - "internalType": "address", - "name": "_CALLER", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "ovmCHAINID", - "outputs": [ - { - "internalType": "uint256", - "name": "_CHAINID", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes", - "name": "_bytecode", - "type": "bytes" - } - ], - "name": "ovmCREATE", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - }, - { - "internalType": "bytes", - "name": "", - "type": "bytes" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes", - "name": "_bytecode", - "type": "bytes" - }, - { - "internalType": "bytes32", - "name": "_salt", - "type": "bytes32" - } - ], - "name": "ovmCREATE2", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - }, - { - "internalType": "bytes", - "name": "", - "type": "bytes" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "_messageHash", - "type": "bytes32" - }, - { - "internalType": "uint8", - "name": "_v", - "type": "uint8" - }, - { - "internalType": "bytes32", - "name": "_r", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "_s", - "type": "bytes32" - } - ], - "name": "ovmCREATEEOA", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_gasLimit", - "type": "uint256" - }, - { - "internalType": "address", - "name": "_address", - "type": "address" - }, - { - "internalType": "bytes", - "name": "_calldata", - "type": "bytes" - } - ], - "name": "ovmDELEGATECALL", - "outputs": [ - { - "internalType": "bool", - "name": "_success", - "type": "bool" - }, - { - "internalType": "bytes", - "name": "_returndata", - "type": "bytes" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_contract", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_offset", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_length", - "type": "uint256" - } - ], - "name": "ovmEXTCODECOPY", - "outputs": [ - { - "internalType": "bytes", - "name": "_code", - "type": "bytes" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_contract", - "type": "address" - } - ], - "name": "ovmEXTCODEHASH", - "outputs": [ - { - "internalType": "bytes32", - "name": "_EXTCODEHASH", - "type": "bytes32" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_contract", - "type": "address" - } - ], - "name": "ovmEXTCODESIZE", - "outputs": [ - { - "internalType": "uint256", - "name": "_EXTCODESIZE", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "ovmGASLIMIT", - "outputs": [ - { - "internalType": "uint256", - "name": "_GASLIMIT", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "ovmGETNONCE", - "outputs": [ - { - "internalType": "uint256", - "name": "_nonce", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "ovmINCREMENTNONCE", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "ovmL1QUEUEORIGIN", - "outputs": [ - { - "internalType": "enum Lib_OVMCodec.QueueOrigin", - "name": "_queueOrigin", - "type": "uint8" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "ovmL1TXORIGIN", - "outputs": [ - { - "internalType": "address", - "name": "_l1TxOrigin", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "ovmNUMBER", - "outputs": [ - { - "internalType": "uint256", - "name": "_NUMBER", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes", - "name": "_data", - "type": "bytes" - } - ], - "name": "ovmREVERT", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "_key", - "type": "bytes32" - } - ], - "name": "ovmSLOAD", - "outputs": [ - { - "internalType": "bytes32", - "name": "_value", - "type": "bytes32" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "_key", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "_value", - "type": "bytes32" - } - ], - "name": "ovmSSTORE", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_gasLimit", - "type": "uint256" - }, - { - "internalType": "address", - "name": "_address", - "type": "address" - }, - { - "internalType": "bytes", - "name": "_calldata", - "type": "bytes" - } - ], - "name": "ovmSTATICCALL", - "outputs": [ - { - "internalType": "bool", - "name": "_success", - "type": "bool" - }, - { - "internalType": "bytes", - "name": "_returndata", - "type": "bytes" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "ovmTIMESTAMP", - "outputs": [ - { - "internalType": "uint256", - "name": "_TIMESTAMP", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "string", - "name": "_name", - "type": "string" - } - ], - "name": "resolve", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "components": [ - { - "internalType": "uint256", - "name": "timestamp", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "blockNumber", - "type": "uint256" - }, - { - "internalType": "enum Lib_OVMCodec.QueueOrigin", - "name": "l1QueueOrigin", - "type": "uint8" - }, - { - "internalType": "address", - "name": "l1TxOrigin", - "type": "address" - }, - { - "internalType": "address", - "name": "entrypoint", - "type": "address" - }, - { - "internalType": "uint256", - "name": "gasLimit", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "data", - "type": "bytes" - } - ], - "internalType": "struct Lib_OVMCodec.Transaction", - "name": "_transaction", - "type": "tuple" - }, - { - "internalType": "address", - "name": "_ovmStateManager", - "type": "address" - } - ], - "name": "run", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_gasLimit", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "_creationCode", - "type": "bytes" - }, - { - "internalType": "address", - "name": "_address", - "type": "address" - } - ], - "name": "safeCREATE", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "components": [ - { - "internalType": "uint256", - "name": "timestamp", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "blockNumber", - "type": "uint256" - }, - { - "internalType": "enum Lib_OVMCodec.QueueOrigin", - "name": "l1QueueOrigin", - "type": "uint8" - }, - { - "internalType": "address", - "name": "l1TxOrigin", - "type": "address" - }, - { - "internalType": "address", - "name": "entrypoint", - "type": "address" - }, - { - "internalType": "uint256", - "name": "gasLimit", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "data", - "type": "bytes" - } - ], - "internalType": "struct Lib_OVMCodec.Transaction", - "name": "_transaction", - "type": "tuple" - }, - { - "internalType": "address", - "name": "_from", - "type": "address" - }, - { - "internalType": "contract iOVM_StateManager", - "name": "_ovmStateManager", - "type": "address" - } - ], - "name": "simulateMessage", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - }, - { - "internalType": "bytes", - "name": "", - "type": "bytes" - } - ], - "stateMutability": "nonpayable", - "type": "function" - } - ], - "transactionHash": "0x238392302d39825115949d4290e22fbf37f06df055565b5bc38f8a27552cc68a", - "receipt": { - "to": null, - "from": "0x558ba9b8d78713fbf768c1f8a584485B4003f43F", - "contractAddress": "0x3212027673655d3047c13139e3233ccd4A78417c", - "transactionIndex": 17, - "gasUsed": "3584878", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0xf36edd52bac61b94c4ef4a838c09b6acf110c113c602c84afed6091e8a8d2de4", - "transactionHash": "0x238392302d39825115949d4290e22fbf37f06df055565b5bc38f8a27552cc68a", - "logs": [], - "blockNumber": 4607713, - "cumulativeGasUsed": "4915026", - "status": 1, - "byzantium": true - }, - "args": [ - "0x9933d137bBF050Cf3D7555fE1beC91eF698814e5", - { - "minTransactionGasLimit": 50000, - "maxTransactionGasLimit": 9000000, - "maxGasPerQueuePerEpoch": 250000000, - "secondsPerEpoch": 0 - }, - { - "ovmCHAINID": 420 - } - ], - "solcInputHash": "8aef3555d89ad9d3af2f5d28a85dc856", - "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"minTransactionGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxTransactionGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxGasPerQueuePerEpoch\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"secondsPerEpoch\",\"type\":\"uint256\"}],\"internalType\":\"struct iOVM_ExecutionManager.GasMeterConfig\",\"name\":\"_gasMeterConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"ovmCHAINID\",\"type\":\"uint256\"}],\"internalType\":\"struct iOVM_ExecutionManager.GlobalContext\",\"name\":\"_globalContext\",\"type\":\"tuple\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"getMaxTransactionGasLimit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_maxTransactionGasLimit\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ovmADDRESS\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"_ADDRESS\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_address\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_calldata\",\"type\":\"bytes\"}],\"name\":\"ovmCALL\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"_success\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"_returndata\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ovmCALLER\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"_CALLER\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ovmCHAINID\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_CHAINID\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_bytecode\",\"type\":\"bytes\"}],\"name\":\"ovmCREATE\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_bytecode\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"_salt\",\"type\":\"bytes32\"}],\"name\":\"ovmCREATE2\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_messageHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint8\",\"name\":\"_v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"_r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"_s\",\"type\":\"bytes32\"}],\"name\":\"ovmCREATEEOA\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_address\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_calldata\",\"type\":\"bytes\"}],\"name\":\"ovmDELEGATECALL\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"_success\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"_returndata\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_contract\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_offset\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_length\",\"type\":\"uint256\"}],\"name\":\"ovmEXTCODECOPY\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"_code\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_contract\",\"type\":\"address\"}],\"name\":\"ovmEXTCODEHASH\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"_EXTCODEHASH\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_contract\",\"type\":\"address\"}],\"name\":\"ovmEXTCODESIZE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_EXTCODESIZE\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ovmGASLIMIT\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_GASLIMIT\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ovmGETNONCE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_nonce\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ovmINCREMENTNONCE\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ovmL1QUEUEORIGIN\",\"outputs\":[{\"internalType\":\"enum Lib_OVMCodec.QueueOrigin\",\"name\":\"_queueOrigin\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ovmL1TXORIGIN\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"_l1TxOrigin\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ovmNUMBER\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_NUMBER\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"ovmREVERT\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_key\",\"type\":\"bytes32\"}],\"name\":\"ovmSLOAD\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"_value\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_key\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"_value\",\"type\":\"bytes32\"}],\"name\":\"ovmSSTORE\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_address\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_calldata\",\"type\":\"bytes\"}],\"name\":\"ovmSTATICCALL\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"_success\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"_returndata\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ovmTIMESTAMP\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_TIMESTAMP\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"enum Lib_OVMCodec.QueueOrigin\",\"name\":\"l1QueueOrigin\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"l1TxOrigin\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"entrypoint\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.Transaction\",\"name\":\"_transaction\",\"type\":\"tuple\"},{\"internalType\":\"address\",\"name\":\"_ovmStateManager\",\"type\":\"address\"}],\"name\":\"run\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_creationCode\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"_address\",\"type\":\"address\"}],\"name\":\"safeCREATE\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"enum Lib_OVMCodec.QueueOrigin\",\"name\":\"l1QueueOrigin\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"l1TxOrigin\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"entrypoint\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.Transaction\",\"name\":\"_transaction\",\"type\":\"tuple\"},{\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"internalType\":\"contract iOVM_StateManager\",\"name\":\"_ovmStateManager\",\"type\":\"address\"}],\"name\":\"simulateMessage\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The Execution Manager (EM) is the core of our OVM implementation, and provides a sandboxed environment allowing us to execute OVM transactions deterministically on either Layer 1 or Layer 2. The EM's run() function is the first function called during the execution of any transaction on L2. For each context-dependent EVM operation the EM has a function which implements a corresponding OVM operation, which will read state from the State Manager contract. The EM relies on the Safety Checker to verify that code deployed to Layer 2 does not contain any context-dependent operations. Compiler used: solc Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\"}},\"ovmADDRESS()\":{\"returns\":{\"_ADDRESS\":\"Active ADDRESS within the current message context.\"}},\"ovmCALL(uint256,address,bytes)\":{\"params\":{\"_address\":\"Address of the contract to call.\",\"_calldata\":\"Data to send along with the call.\",\"_gasLimit\":\"Amount of gas to be passed into this call.\"},\"returns\":{\"_returndata\":\"Data returned by the call.\",\"_success\":\"Whether or not the call returned (rather than reverted).\"}},\"ovmCALLER()\":{\"returns\":{\"_CALLER\":\"Address of the CALLER within the current message context.\"}},\"ovmCHAINID()\":{\"returns\":{\"_CHAINID\":\"Value of the chain's CHAINID within the global context.\"}},\"ovmCREATE(bytes)\":{\"params\":{\"_bytecode\":\"Code to be used to CREATE a new contract.\"},\"returns\":{\"_0\":\"Address of the created contract.\",\"_1\":\"Revert data, if and only if the creation threw an exception.\"}},\"ovmCREATE2(bytes,bytes32)\":{\"params\":{\"_bytecode\":\"Code to be used to CREATE2 a new contract.\",\"_salt\":\"Value used to determine the contract's address.\"},\"returns\":{\"_0\":\"Address of the created contract.\",\"_1\":\"Revert data, if and only if the creation threw an exception.\"}},\"ovmCREATEEOA(bytes32,uint8,bytes32,bytes32)\":{\"details\":\"Essentially functions like ovmCREATE or ovmCREATE2, but we can bypass a lot of checks because the contract we're creating is trusted (no need to do safety checking or to handle unexpected reverts). Doesn't need to return an address because the address is assumed to be the user's actual address.\",\"params\":{\"_messageHash\":\"Hash of a message signed by some user, for verification.\",\"_r\":\"Signature `r` parameter.\",\"_s\":\"Signature `s` parameter.\",\"_v\":\"Signature `v` parameter.\"}},\"ovmDELEGATECALL(uint256,address,bytes)\":{\"params\":{\"_address\":\"Address of the contract to call.\",\"_calldata\":\"Data to send along with the call.\",\"_gasLimit\":\"Amount of gas to be passed into this call.\"},\"returns\":{\"_returndata\":\"Data returned by the call.\",\"_success\":\"Whether or not the call returned (rather than reverted).\"}},\"ovmEXTCODECOPY(address,uint256,uint256)\":{\"params\":{\"_contract\":\"Address of the contract to copy code from.\",\"_length\":\"Total number of bytes to copy from the contract's code.\",\"_offset\":\"Offset in bytes from the start of contract code to copy beyond.\"},\"returns\":{\"_code\":\"Bytes of code copied from the requested contract.\"}},\"ovmEXTCODEHASH(address)\":{\"params\":{\"_contract\":\"Address of the contract to query the hash of.\"},\"returns\":{\"_EXTCODEHASH\":\"Hash of the requested contract.\"}},\"ovmEXTCODESIZE(address)\":{\"params\":{\"_contract\":\"Address of the contract to query the size of.\"},\"returns\":{\"_EXTCODESIZE\":\"Size of the requested contract in bytes.\"}},\"ovmGASLIMIT()\":{\"returns\":{\"_GASLIMIT\":\"Value of the block's GASLIMIT within the transaction context.\"}},\"ovmGETNONCE()\":{\"returns\":{\"_nonce\":\"Nonce of the current contract.\"}},\"ovmL1QUEUEORIGIN()\":{\"returns\":{\"_queueOrigin\":\"Address of the ovmL1QUEUEORIGIN within the current message context.\"}},\"ovmL1TXORIGIN()\":{\"returns\":{\"_l1TxOrigin\":\"Address of the account which sent the tx into L2 from L1.\"}},\"ovmNUMBER()\":{\"returns\":{\"_NUMBER\":\"Value of the NUMBER within the transaction context.\"}},\"ovmREVERT(bytes)\":{\"params\":{\"_data\":\"Bytes data to pass along with the REVERT.\"}},\"ovmSLOAD(bytes32)\":{\"params\":{\"_key\":\"32 byte key of the storage slot to load.\"},\"returns\":{\"_value\":\"32 byte value of the requested storage slot.\"}},\"ovmSSTORE(bytes32,bytes32)\":{\"params\":{\"_key\":\"32 byte key of the storage slot to set.\",\"_value\":\"32 byte value for the storage slot.\"}},\"ovmSTATICCALL(uint256,address,bytes)\":{\"params\":{\"_address\":\"Address of the contract to call.\",\"_calldata\":\"Data to send along with the call.\",\"_gasLimit\":\"Amount of gas to be passed into this call.\"},\"returns\":{\"_returndata\":\"Data returned by the call.\",\"_success\":\"Whether or not the call returned (rather than reverted).\"}},\"ovmTIMESTAMP()\":{\"returns\":{\"_TIMESTAMP\":\"Value of the TIMESTAMP within the transaction context.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}},\"run((uint256,uint256,uint8,address,address,uint256,bytes),address)\":{\"params\":{\"_ovmStateManager\":\"iOVM_StateManager implementation providing account state.\",\"_transaction\":\"Transaction data to be executed.\"}},\"safeCREATE(uint256,bytes,address)\":{\"params\":{\"_address\":\"OVM address being deployed to.\",\"_creationCode\":\"Code to pass into CREATE for deployment.\",\"_gasLimit\":\"Amount of gas to be passed into this creation.\"}},\"simulateMessage((uint256,uint256,uint8,address,address,uint256,bytes),address,address)\":{\"params\":{\"_from\":\"the OVM account the simulated call should be from.\",\"_transaction\":\"the message transaction to simulate.\"}}},\"title\":\"OVM_ExecutionManager\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"ovmADDRESS()\":{\"notice\":\"Overrides ADDRESS.\"},\"ovmCALL(uint256,address,bytes)\":{\"notice\":\"Overrides CALL.\"},\"ovmCALLER()\":{\"notice\":\"Overrides CALLER.\"},\"ovmCHAINID()\":{\"notice\":\"Overrides CHAINID.\"},\"ovmCREATE(bytes)\":{\"notice\":\"Overrides CREATE.\"},\"ovmCREATE2(bytes,bytes32)\":{\"notice\":\"Overrides CREATE2.\"},\"ovmCREATEEOA(bytes32,uint8,bytes32,bytes32)\":{\"notice\":\"Creates a new EOA contract account, for account abstraction.\"},\"ovmDELEGATECALL(uint256,address,bytes)\":{\"notice\":\"Overrides DELEGATECALL.\"},\"ovmEXTCODECOPY(address,uint256,uint256)\":{\"notice\":\"Overrides EXTCODECOPY.\"},\"ovmEXTCODEHASH(address)\":{\"notice\":\"Overrides EXTCODEHASH.\"},\"ovmEXTCODESIZE(address)\":{\"notice\":\"Overrides EXTCODESIZE.\"},\"ovmGASLIMIT()\":{\"notice\":\"Overrides GASLIMIT.\"},\"ovmGETNONCE()\":{\"notice\":\"Retrieves the nonce of the current ovmADDRESS.\"},\"ovmINCREMENTNONCE()\":{\"notice\":\"Bumps the nonce of the current ovmADDRESS by one.\"},\"ovmL1QUEUEORIGIN()\":{\"notice\":\"Specifies from which L1 rollup queue this transaction originated from.\"},\"ovmL1TXORIGIN()\":{\"notice\":\"Specifies which L1 account, if any, sent this transaction by calling enqueue().\"},\"ovmNUMBER()\":{\"notice\":\"Overrides NUMBER.\"},\"ovmREVERT(bytes)\":{\"notice\":\"Overrides REVERT.\"},\"ovmSLOAD(bytes32)\":{\"notice\":\"Overrides SLOAD.\"},\"ovmSSTORE(bytes32,bytes32)\":{\"notice\":\"Overrides SSTORE.\"},\"ovmSTATICCALL(uint256,address,bytes)\":{\"notice\":\"Overrides STATICCALL.\"},\"ovmTIMESTAMP()\":{\"notice\":\"Overrides TIMESTAMP.\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"},\"run((uint256,uint256,uint8,address,address,uint256,bytes),address)\":{\"notice\":\"Starts the execution of a transaction via the OVM_ExecutionManager.\"},\"safeCREATE(uint256,bytes,address)\":{\"notice\":\"Handles the creation-specific safety measures required for OVM contract deployment. This function sanitizes the return types for creation messages to match calls (bool, bytes), by being an external function which the EM can call, that mimics the success/fail case of the CREATE. This allows for consistent handling of both types of messages in _handleExternalMessage(). Having this step occur as a separate call frame also allows us to easily revert the contract deployment in the event that the code is unsafe. \"},\"simulateMessage((uint256,uint256,uint8,address,address,uint256,bytes),address,address)\":{\"notice\":\"Unreachable helper function for simulating eth_calls with an OVM message context. This function will throw an exception in all cases other than when used as a custom entrypoint in L2 Geth to simulate eth_call.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol\":\"OVM_ExecutionManager\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/optimistic-ethereum/OVM/accounts/OVM_ECDSAContractAccount.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Interface Imports */\\nimport { iOVM_ECDSAContractAccount } from \\\"../../iOVM/accounts/iOVM_ECDSAContractAccount.sol\\\";\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { Lib_ECDSAUtils } from \\\"../../libraries/utils/Lib_ECDSAUtils.sol\\\";\\nimport { Lib_SafeExecutionManagerWrapper } from \\\"../../libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\\\";\\nimport { Lib_SafeMathWrapper } from \\\"../../libraries/wrappers/Lib_SafeMathWrapper.sol\\\";\\n\\n/**\\n * @title OVM_ECDSAContractAccount\\n * @dev The ECDSA Contract Account can be used as the implementation for a ProxyEOA deployed by the\\n * ovmCREATEEOA operation. It enables backwards compatibility with Ethereum's Layer 1, by \\n * providing eth_sign and EIP155 formatted transaction encodings.\\n *\\n * Compiler used: solc\\n * Runtime target: OVM\\n */\\ncontract OVM_ECDSAContractAccount is iOVM_ECDSAContractAccount {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n // TODO: should be the amount sufficient to cover the gas costs of all of the transactions up\\n // to and including the CALL/CREATE which forms the entrypoint of the transaction.\\n uint256 constant EXECUTION_VALIDATION_GAS_OVERHEAD = 25000;\\n address constant ETH_ERC20_ADDRESS = 0x4200000000000000000000000000000000000006;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Executes a signed transaction.\\n * @param _transaction Signed EOA transaction.\\n * @param _signatureType Hashing scheme used for the transaction (e.g., ETH signed message).\\n * @param _v Signature `v` parameter.\\n * @param _r Signature `r` parameter.\\n * @param _s Signature `s` parameter.\\n * @return Whether or not the call returned (rather than reverted).\\n * @return Data returned by the call.\\n */\\n function execute(\\n bytes memory _transaction,\\n Lib_OVMCodec.EOASignatureType _signatureType,\\n uint8 _v,\\n bytes32 _r,\\n bytes32 _s\\n )\\n override\\n public\\n returns (\\n bool,\\n bytes memory\\n )\\n {\\n bool isEthSign = _signatureType == Lib_OVMCodec.EOASignatureType.ETH_SIGNED_MESSAGE;\\n\\n // Address of this contract within the ovm (ovmADDRESS) should be the same as the\\n // recovered address of the user who signed this message. This is how we manage to shim\\n // account abstraction even though the user isn't a contract.\\n // Need to make sure that the transaction nonce is right and bump it if so.\\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(\\n Lib_ECDSAUtils.recover(\\n _transaction,\\n isEthSign,\\n _v,\\n _r,\\n _s\\n ) == Lib_SafeExecutionManagerWrapper.safeADDRESS(),\\n \\\"Signature provided for EOA transaction execution is invalid.\\\"\\n );\\n\\n Lib_OVMCodec.EIP155Transaction memory decodedTx = Lib_OVMCodec.decodeEIP155Transaction(_transaction, isEthSign);\\n\\n // Need to make sure that the transaction chainId is correct.\\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(\\n decodedTx.chainId == Lib_SafeExecutionManagerWrapper.safeCHAINID(),\\n \\\"Transaction chainId does not match expected OVM chainId.\\\"\\n );\\n\\n // Need to make sure that the transaction nonce is right.\\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(\\n decodedTx.nonce == Lib_SafeExecutionManagerWrapper.safeGETNONCE(),\\n \\\"Transaction nonce does not match the expected nonce.\\\"\\n );\\n\\n // TEMPORARY: Disable gas checks for mainnet.\\n // // Need to make sure that the gas is sufficient to execute the transaction.\\n // Lib_SafeExecutionManagerWrapper.safeREQUIRE(\\n // gasleft() >= Lib_SafeMathWrapper.add(decodedTx.gasLimit, EXECUTION_VALIDATION_GAS_OVERHEAD),\\n // \\\"Gas is not sufficient to execute the transaction.\\\"\\n // );\\n\\n // Transfer fee to relayer.\\n address relayer = Lib_SafeExecutionManagerWrapper.safeCALLER();\\n uint256 fee = Lib_SafeMathWrapper.mul(decodedTx.gasLimit, decodedTx.gasPrice);\\n (bool success, ) = Lib_SafeExecutionManagerWrapper.safeCALL(\\n gasleft(),\\n ETH_ERC20_ADDRESS,\\n abi.encodeWithSignature(\\\"transfer(address,uint256)\\\", relayer, fee)\\n );\\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(\\n success == true,\\n \\\"Fee was not transferred to relayer.\\\"\\n );\\n\\n // Contract creations are signalled by sending a transaction to the zero address.\\n if (decodedTx.to == address(0)) {\\n (address created, bytes memory revertData) = Lib_SafeExecutionManagerWrapper.safeCREATE(\\n gasleft(),\\n decodedTx.data\\n );\\n\\n // Return true if the contract creation succeeded, false w/ revertData otherwise.\\n if (created != address(0)) {\\n return (true, abi.encode(created));\\n } else {\\n return (false, revertData);\\n }\\n } else {\\n // We only want to bump the nonce for `ovmCALL` because `ovmCREATE` automatically bumps\\n // the nonce of the calling account. Normally an EOA would bump the nonce for both\\n // cases, but since this is a contract we'd end up bumping the nonce twice.\\n Lib_SafeExecutionManagerWrapper.safeINCREMENTNONCE();\\n\\n return Lib_SafeExecutionManagerWrapper.safeCALL(\\n gasleft(),\\n decodedTx.to,\\n decodedTx.data\\n );\\n }\\n }\\n}\\n\",\"keccak256\":\"0xcba0b593ad36291ec3d8c61ca254057c1bdcf1c9debf8ef920add32a51b14817\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/accounts/OVM_ProxyEOA.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_Bytes32Utils } from \\\"../../libraries/utils/Lib_Bytes32Utils.sol\\\";\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { Lib_ECDSAUtils } from \\\"../../libraries/utils/Lib_ECDSAUtils.sol\\\";\\nimport { Lib_SafeExecutionManagerWrapper } from \\\"../../libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\\\";\\n\\n/**\\n * @title OVM_ProxyEOA\\n * @dev The Proxy EOA contract uses a delegate call to execute the logic in an implementation contract.\\n * In combination with the logic implemented in the ECDSA Contract Account, this enables a form of upgradable \\n * 'account abstraction' on layer 2. \\n * \\n * Compiler used: solc\\n * Runtime target: OVM\\n */\\ncontract OVM_ProxyEOA {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n bytes32 constant IMPLEMENTATION_KEY = 0xdeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddead;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _implementation Address of the initial implementation contract.\\n */\\n constructor(\\n address _implementation\\n )\\n {\\n _setImplementation(_implementation);\\n }\\n\\n\\n /*********************\\n * Fallback Function *\\n *********************/\\n\\n fallback()\\n external\\n {\\n (bool success, bytes memory returndata) = Lib_SafeExecutionManagerWrapper.safeDELEGATECALL(\\n gasleft(),\\n getImplementation(),\\n msg.data\\n );\\n\\n if (success) {\\n assembly {\\n return(add(returndata, 0x20), mload(returndata))\\n }\\n } else {\\n Lib_SafeExecutionManagerWrapper.safeREVERT(\\n string(returndata)\\n );\\n }\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the implementation address.\\n * @param _implementation New implementation address.\\n */\\n function upgrade(\\n address _implementation\\n )\\n external\\n {\\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(\\n Lib_SafeExecutionManagerWrapper.safeADDRESS() == Lib_SafeExecutionManagerWrapper.safeCALLER(),\\n \\\"EOAs can only upgrade their own EOA implementation\\\"\\n );\\n\\n _setImplementation(_implementation);\\n }\\n\\n /**\\n * Gets the address of the current implementation.\\n * @return Current implementation address.\\n */\\n function getImplementation()\\n public\\n returns (\\n address\\n )\\n {\\n return Lib_Bytes32Utils.toAddress(\\n Lib_SafeExecutionManagerWrapper.safeSLOAD(\\n IMPLEMENTATION_KEY\\n )\\n );\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function _setImplementation(\\n address _implementation\\n )\\n internal\\n {\\n Lib_SafeExecutionManagerWrapper.safeSSTORE(\\n IMPLEMENTATION_KEY,\\n Lib_Bytes32Utils.fromAddress(_implementation)\\n );\\n }\\n}\\n\",\"keccak256\":\"0x220433074300f98c50f923df76050fbaa548e83926351b7a27f379aa851f70ec\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// @unsupported: ovm\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\nimport { Lib_EthUtils } from \\\"../../libraries/utils/Lib_EthUtils.sol\\\";\\nimport { Lib_ErrorUtils } from \\\"../../libraries/utils/Lib_ErrorUtils.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_ExecutionManager } from \\\"../../iOVM/execution/iOVM_ExecutionManager.sol\\\";\\nimport { iOVM_StateManager } from \\\"../../iOVM/execution/iOVM_StateManager.sol\\\";\\nimport { iOVM_SafetyChecker } from \\\"../../iOVM/execution/iOVM_SafetyChecker.sol\\\";\\n\\n/* Contract Imports */\\nimport { OVM_ECDSAContractAccount } from \\\"../accounts/OVM_ECDSAContractAccount.sol\\\";\\nimport { OVM_ProxyEOA } from \\\"../accounts/OVM_ProxyEOA.sol\\\";\\nimport { OVM_DeployerWhitelist } from \\\"../predeploys/OVM_DeployerWhitelist.sol\\\";\\n\\n/**\\n * @title OVM_ExecutionManager\\n * @dev The Execution Manager (EM) is the core of our OVM implementation, and provides a sandboxed\\n * environment allowing us to execute OVM transactions deterministically on either Layer 1 or\\n * Layer 2.\\n * The EM's run() function is the first function called during the execution of any\\n * transaction on L2.\\n * For each context-dependent EVM operation the EM has a function which implements a corresponding\\n * OVM operation, which will read state from the State Manager contract.\\n * The EM relies on the Safety Checker to verify that code deployed to Layer 2 does not contain any\\n * context-dependent operations.\\n *\\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract OVM_ExecutionManager is iOVM_ExecutionManager, Lib_AddressResolver {\\n\\n /********************************\\n * External Contract References *\\n ********************************/\\n\\n iOVM_SafetyChecker internal ovmSafetyChecker;\\n iOVM_StateManager internal ovmStateManager;\\n\\n\\n /*******************************\\n * Execution Context Variables *\\n *******************************/\\n\\n GasMeterConfig internal gasMeterConfig;\\n GlobalContext internal globalContext;\\n TransactionContext internal transactionContext;\\n MessageContext internal messageContext;\\n TransactionRecord internal transactionRecord;\\n MessageRecord internal messageRecord;\\n\\n\\n /**************************\\n * Gas Metering Constants *\\n **************************/\\n\\n address constant GAS_METADATA_ADDRESS = 0x06a506A506a506A506a506a506A506A506A506A5;\\n uint256 constant NUISANCE_GAS_SLOAD = 20000;\\n uint256 constant NUISANCE_GAS_SSTORE = 20000;\\n uint256 constant MIN_NUISANCE_GAS_PER_CONTRACT = 30000;\\n uint256 constant NUISANCE_GAS_PER_CONTRACT_BYTE = 100;\\n uint256 constant MIN_GAS_FOR_INVALID_STATE_ACCESS = 30000;\\n\\n /**************************\\n * Default Context Values *\\n **************************/\\n\\n uint256 constant DEFAULT_UINT256 = 0xdefa017defa017defa017defa017defa017defa017defa017defa017defa017d;\\n address constant DEFAULT_ADDRESS = 0xdEfa017defA017DeFA017DEfa017DeFA017DeFa0;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n */\\n constructor(\\n address _libAddressManager,\\n GasMeterConfig memory _gasMeterConfig,\\n GlobalContext memory _globalContext\\n )\\n Lib_AddressResolver(_libAddressManager)\\n {\\n ovmSafetyChecker = iOVM_SafetyChecker(resolve(\\\"OVM_SafetyChecker\\\"));\\n gasMeterConfig = _gasMeterConfig;\\n globalContext = _globalContext;\\n _resetContext();\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n /**\\n * Applies dynamically-sized refund to a transaction to account for the difference in execution\\n * between L1 and L2, so that the overall cost of the ovmOPCODE is fixed.\\n * @param _cost Desired gas cost for the function after the refund.\\n */\\n modifier netGasCost(\\n uint256 _cost\\n ) {\\n uint256 gasProvided = gasleft();\\n _;\\n uint256 gasUsed = gasProvided - gasleft();\\n\\n // We want to refund everything *except* the specified cost.\\n if (_cost < gasUsed) {\\n transactionRecord.ovmGasRefund += gasUsed - _cost;\\n }\\n }\\n\\n /**\\n * Applies a fixed-size gas refund to a transaction to account for the difference in execution\\n * between L1 and L2, so that the overall cost of an ovmOPCODE can be lowered.\\n * @param _discount Amount of gas cost to refund for the ovmOPCODE.\\n */\\n modifier fixedGasDiscount(\\n uint256 _discount\\n ) {\\n uint256 gasProvided = gasleft();\\n _;\\n uint256 gasUsed = gasProvided - gasleft();\\n\\n // We want to refund the specified _discount, unless this risks underflow.\\n if (_discount < gasUsed) {\\n transactionRecord.ovmGasRefund += _discount;\\n } else {\\n // refund all we can without risking underflow.\\n transactionRecord.ovmGasRefund += gasUsed;\\n }\\n }\\n\\n /**\\n * Makes sure we're not inside a static context.\\n */\\n modifier notStatic() {\\n if (messageContext.isStatic == true) {\\n _revertWithFlag(RevertFlag.STATIC_VIOLATION);\\n }\\n _;\\n }\\n\\n\\n /************************************\\n * Transaction Execution Entrypoint *\\n ************************************/\\n\\n /**\\n * Starts the execution of a transaction via the OVM_ExecutionManager.\\n * @param _transaction Transaction data to be executed.\\n * @param _ovmStateManager iOVM_StateManager implementation providing account state.\\n */\\n function run(\\n Lib_OVMCodec.Transaction memory _transaction,\\n address _ovmStateManager\\n )\\n override\\n public\\n {\\n // Make sure that run() is not re-enterable. This condition should always be satisfied\\n // Once run has been called once, due to the behavior of _isValidInput().\\n if (transactionContext.ovmNUMBER != DEFAULT_UINT256) {\\n return;\\n }\\n\\n // Store our OVM_StateManager instance (significantly easier than attempting to pass the\\n // address around in calldata).\\n ovmStateManager = iOVM_StateManager(_ovmStateManager);\\n\\n // Make sure this function can't be called by anyone except the owner of the\\n // OVM_StateManager (expected to be an OVM_StateTransitioner). We can revert here because\\n // this would make the `run` itself invalid.\\n require(\\n // This method may return false during fraud proofs, but always returns true in L2 nodes' State Manager precompile.\\n ovmStateManager.isAuthenticated(msg.sender),\\n \\\"Only authenticated addresses in ovmStateManager can call this function\\\"\\n );\\n\\n // Initialize the execution context, must be initialized before we perform any gas metering\\n // or we'll throw a nuisance gas error.\\n _initContext(_transaction);\\n\\n // TEMPORARY: Gas metering is disabled for minnet.\\n // // Check whether we need to start a new epoch, do so if necessary.\\n // _checkNeedsNewEpoch(_transaction.timestamp);\\n\\n // Make sure the transaction's gas limit is valid. We don't revert here because we reserve\\n // reverts for INVALID_STATE_ACCESS.\\n if (_isValidInput(_transaction) == false) {\\n _resetContext();\\n return;\\n }\\n\\n // TEMPORARY: Gas metering is disabled for minnet.\\n // // Check gas right before the call to get total gas consumed by OVM transaction.\\n // uint256 gasProvided = gasleft();\\n\\n // Run the transaction, make sure to meter the gas usage.\\n ovmCALL(\\n _transaction.gasLimit - gasMeterConfig.minTransactionGasLimit,\\n _transaction.entrypoint,\\n _transaction.data\\n );\\n\\n // TEMPORARY: Gas metering is disabled for minnet.\\n // // Update the cumulative gas based on the amount of gas used.\\n // uint256 gasUsed = gasProvided - gasleft();\\n // _updateCumulativeGas(gasUsed, _transaction.l1QueueOrigin);\\n\\n // Wipe the execution context.\\n _resetContext();\\n }\\n\\n\\n /******************************\\n * Opcodes: Execution Context *\\n ******************************/\\n\\n /**\\n * @notice Overrides CALLER.\\n * @return _CALLER Address of the CALLER within the current message context.\\n */\\n function ovmCALLER()\\n override\\n public\\n view\\n returns (\\n address _CALLER\\n )\\n {\\n return messageContext.ovmCALLER;\\n }\\n\\n /**\\n * @notice Overrides ADDRESS.\\n * @return _ADDRESS Active ADDRESS within the current message context.\\n */\\n function ovmADDRESS()\\n override\\n public\\n view\\n returns (\\n address _ADDRESS\\n )\\n {\\n return messageContext.ovmADDRESS;\\n }\\n\\n /**\\n * @notice Overrides TIMESTAMP.\\n * @return _TIMESTAMP Value of the TIMESTAMP within the transaction context.\\n */\\n function ovmTIMESTAMP()\\n override\\n public\\n view\\n returns (\\n uint256 _TIMESTAMP\\n )\\n {\\n return transactionContext.ovmTIMESTAMP;\\n }\\n\\n /**\\n * @notice Overrides NUMBER.\\n * @return _NUMBER Value of the NUMBER within the transaction context.\\n */\\n function ovmNUMBER()\\n override\\n public\\n view\\n returns (\\n uint256 _NUMBER\\n )\\n {\\n return transactionContext.ovmNUMBER;\\n }\\n\\n /**\\n * @notice Overrides GASLIMIT.\\n * @return _GASLIMIT Value of the block's GASLIMIT within the transaction context.\\n */\\n function ovmGASLIMIT()\\n override\\n public\\n view\\n returns (\\n uint256 _GASLIMIT\\n )\\n {\\n return transactionContext.ovmGASLIMIT;\\n }\\n\\n /**\\n * @notice Overrides CHAINID.\\n * @return _CHAINID Value of the chain's CHAINID within the global context.\\n */\\n function ovmCHAINID()\\n override\\n public\\n view\\n returns (\\n uint256 _CHAINID\\n )\\n {\\n return globalContext.ovmCHAINID;\\n }\\n\\n /*********************************\\n * Opcodes: L2 Execution Context *\\n *********************************/\\n\\n /**\\n * @notice Specifies from which L1 rollup queue this transaction originated from.\\n * @return _queueOrigin Address of the ovmL1QUEUEORIGIN within the current message context.\\n */\\n function ovmL1QUEUEORIGIN()\\n override\\n public\\n view\\n returns (\\n Lib_OVMCodec.QueueOrigin _queueOrigin\\n )\\n {\\n return transactionContext.ovmL1QUEUEORIGIN;\\n }\\n\\n /**\\n * @notice Specifies which L1 account, if any, sent this transaction by calling enqueue().\\n * @return _l1TxOrigin Address of the account which sent the tx into L2 from L1.\\n */\\n function ovmL1TXORIGIN()\\n override\\n public\\n view\\n returns (\\n address _l1TxOrigin\\n )\\n {\\n return transactionContext.ovmL1TXORIGIN;\\n }\\n\\n /********************\\n * Opcodes: Halting *\\n ********************/\\n\\n /**\\n * @notice Overrides REVERT.\\n * @param _data Bytes data to pass along with the REVERT.\\n */\\n function ovmREVERT(\\n bytes memory _data\\n )\\n override\\n public\\n {\\n _revertWithFlag(RevertFlag.INTENTIONAL_REVERT, _data);\\n }\\n\\n\\n /******************************\\n * Opcodes: Contract Creation *\\n ******************************/\\n\\n /**\\n * @notice Overrides CREATE.\\n * @param _bytecode Code to be used to CREATE a new contract.\\n * @return Address of the created contract.\\n * @return Revert data, if and only if the creation threw an exception.\\n */\\n function ovmCREATE(\\n bytes memory _bytecode\\n )\\n override\\n public\\n notStatic\\n fixedGasDiscount(40000)\\n returns (\\n address,\\n bytes memory\\n )\\n {\\n // Creator is always the current ADDRESS.\\n address creator = ovmADDRESS();\\n\\n // Check that the deployer is whitelisted, or\\n // that arbitrary contract deployment has been enabled.\\n _checkDeployerAllowed(creator);\\n\\n // Generate the correct CREATE address.\\n address contractAddress = Lib_EthUtils.getAddressForCREATE(\\n creator,\\n _getAccountNonce(creator)\\n );\\n\\n return _createContract(\\n contractAddress,\\n _bytecode\\n );\\n }\\n\\n /**\\n * @notice Overrides CREATE2.\\n * @param _bytecode Code to be used to CREATE2 a new contract.\\n * @param _salt Value used to determine the contract's address.\\n * @return Address of the created contract.\\n * @return Revert data, if and only if the creation threw an exception.\\n */\\n function ovmCREATE2(\\n bytes memory _bytecode,\\n bytes32 _salt\\n )\\n override\\n public\\n notStatic\\n fixedGasDiscount(40000)\\n returns (\\n address,\\n bytes memory\\n )\\n {\\n // Creator is always the current ADDRESS.\\n address creator = ovmADDRESS();\\n\\n // Check that the deployer is whitelisted, or\\n // that arbitrary contract deployment has been enabled.\\n _checkDeployerAllowed(creator);\\n\\n // Generate the correct CREATE2 address.\\n address contractAddress = Lib_EthUtils.getAddressForCREATE2(\\n creator,\\n _bytecode,\\n _salt\\n );\\n\\n return _createContract(\\n contractAddress,\\n _bytecode\\n );\\n }\\n\\n\\n /*******************************\\n * Account Abstraction Opcodes *\\n ******************************/\\n\\n /**\\n * Retrieves the nonce of the current ovmADDRESS.\\n * @return _nonce Nonce of the current contract.\\n */\\n function ovmGETNONCE()\\n override\\n public\\n returns (\\n uint256 _nonce\\n )\\n {\\n return _getAccountNonce(ovmADDRESS());\\n }\\n\\n /**\\n * Bumps the nonce of the current ovmADDRESS by one.\\n */\\n function ovmINCREMENTNONCE()\\n override\\n public\\n notStatic\\n {\\n address account = ovmADDRESS();\\n uint256 nonce = _getAccountNonce(account);\\n\\n // Prevent overflow.\\n if (nonce + 1 > nonce) {\\n _setAccountNonce(account, nonce + 1);\\n }\\n }\\n\\n /**\\n * Creates a new EOA contract account, for account abstraction.\\n * @dev Essentially functions like ovmCREATE or ovmCREATE2, but we can bypass a lot of checks\\n * because the contract we're creating is trusted (no need to do safety checking or to\\n * handle unexpected reverts). Doesn't need to return an address because the address is\\n * assumed to be the user's actual address.\\n * @param _messageHash Hash of a message signed by some user, for verification.\\n * @param _v Signature `v` parameter.\\n * @param _r Signature `r` parameter.\\n * @param _s Signature `s` parameter.\\n */\\n function ovmCREATEEOA(\\n bytes32 _messageHash,\\n uint8 _v,\\n bytes32 _r,\\n bytes32 _s\\n )\\n override\\n public\\n notStatic\\n {\\n // Recover the EOA address from the message hash and signature parameters. Since we do the\\n // hashing in advance, we don't have handle different message hashing schemes. Even if this\\n // function were to return the wrong address (rather than explicitly returning the zero\\n // address), the rest of the transaction would simply fail (since there's no EOA account to\\n // actually execute the transaction).\\n address eoa = ecrecover(\\n _messageHash,\\n _v + 27,\\n _r,\\n _s\\n );\\n\\n // Invalid signature is a case we proactively handle with a revert. We could alternatively\\n // have this function return a `success` boolean, but this is just easier.\\n if (eoa == address(0)) {\\n ovmREVERT(bytes(\\\"Signature provided for EOA contract creation is invalid.\\\"));\\n }\\n\\n // If the user already has an EOA account, then there's no need to perform this operation.\\n if (_hasEmptyAccount(eoa) == false) {\\n return;\\n }\\n\\n // We always need to initialize the contract with the default account values.\\n _initPendingAccount(eoa);\\n\\n // Temporarily set the current address so it's easier to access on L2.\\n address prevADDRESS = messageContext.ovmADDRESS;\\n messageContext.ovmADDRESS = eoa;\\n\\n // Now actually create the account and get its bytecode. We're not worried about reverts\\n // (other than out of gas, which we can't capture anyway) because this contract is trusted.\\n OVM_ProxyEOA proxyEOA = new OVM_ProxyEOA(0x4200000000000000000000000000000000000003);\\n\\n // Reset the address now that we're done deploying.\\n messageContext.ovmADDRESS = prevADDRESS;\\n\\n // Commit the account with its final values.\\n _commitPendingAccount(\\n eoa,\\n address(proxyEOA),\\n keccak256(Lib_EthUtils.getCode(address(proxyEOA)))\\n );\\n\\n _setAccountNonce(eoa, 0);\\n }\\n\\n\\n /*********************************\\n * Opcodes: Contract Interaction *\\n *********************************/\\n\\n /**\\n * @notice Overrides CALL.\\n * @param _gasLimit Amount of gas to be passed into this call.\\n * @param _address Address of the contract to call.\\n * @param _calldata Data to send along with the call.\\n * @return _success Whether or not the call returned (rather than reverted).\\n * @return _returndata Data returned by the call.\\n */\\n function ovmCALL(\\n uint256 _gasLimit,\\n address _address,\\n bytes memory _calldata\\n )\\n override\\n public\\n fixedGasDiscount(100000)\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n // CALL updates the CALLER and ADDRESS.\\n MessageContext memory nextMessageContext = messageContext;\\n nextMessageContext.ovmCALLER = nextMessageContext.ovmADDRESS;\\n nextMessageContext.ovmADDRESS = _address;\\n\\n return _callContract(\\n nextMessageContext,\\n _gasLimit,\\n _address,\\n _calldata\\n );\\n }\\n\\n /**\\n * @notice Overrides STATICCALL.\\n * @param _gasLimit Amount of gas to be passed into this call.\\n * @param _address Address of the contract to call.\\n * @param _calldata Data to send along with the call.\\n * @return _success Whether or not the call returned (rather than reverted).\\n * @return _returndata Data returned by the call.\\n */\\n function ovmSTATICCALL(\\n uint256 _gasLimit,\\n address _address,\\n bytes memory _calldata\\n )\\n override\\n public\\n fixedGasDiscount(80000)\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n // STATICCALL updates the CALLER, updates the ADDRESS, and runs in a static context.\\n MessageContext memory nextMessageContext = messageContext;\\n nextMessageContext.ovmCALLER = nextMessageContext.ovmADDRESS;\\n nextMessageContext.ovmADDRESS = _address;\\n nextMessageContext.isStatic = true;\\n\\n return _callContract(\\n nextMessageContext,\\n _gasLimit,\\n _address,\\n _calldata\\n );\\n }\\n\\n /**\\n * @notice Overrides DELEGATECALL.\\n * @param _gasLimit Amount of gas to be passed into this call.\\n * @param _address Address of the contract to call.\\n * @param _calldata Data to send along with the call.\\n * @return _success Whether or not the call returned (rather than reverted).\\n * @return _returndata Data returned by the call.\\n */\\n function ovmDELEGATECALL(\\n uint256 _gasLimit,\\n address _address,\\n bytes memory _calldata\\n )\\n override\\n public\\n fixedGasDiscount(40000)\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n // DELEGATECALL does not change anything about the message context.\\n MessageContext memory nextMessageContext = messageContext;\\n\\n return _callContract(\\n nextMessageContext,\\n _gasLimit,\\n _address,\\n _calldata\\n );\\n }\\n\\n\\n /************************************\\n * Opcodes: Contract Storage Access *\\n ************************************/\\n\\n /**\\n * @notice Overrides SLOAD.\\n * @param _key 32 byte key of the storage slot to load.\\n * @return _value 32 byte value of the requested storage slot.\\n */\\n function ovmSLOAD(\\n bytes32 _key\\n )\\n override\\n public\\n netGasCost(40000)\\n returns (\\n bytes32 _value\\n )\\n {\\n // We always SLOAD from the storage of ADDRESS.\\n address contractAddress = ovmADDRESS();\\n\\n return _getContractStorage(\\n contractAddress,\\n _key\\n );\\n }\\n\\n /**\\n * @notice Overrides SSTORE.\\n * @param _key 32 byte key of the storage slot to set.\\n * @param _value 32 byte value for the storage slot.\\n */\\n function ovmSSTORE(\\n bytes32 _key,\\n bytes32 _value\\n )\\n override\\n public\\n notStatic\\n netGasCost(60000)\\n {\\n // We always SSTORE to the storage of ADDRESS.\\n address contractAddress = ovmADDRESS();\\n\\n _putContractStorage(\\n contractAddress,\\n _key,\\n _value\\n );\\n }\\n\\n\\n /*********************************\\n * Opcodes: Contract Code Access *\\n *********************************/\\n\\n /**\\n * @notice Overrides EXTCODECOPY.\\n * @param _contract Address of the contract to copy code from.\\n * @param _offset Offset in bytes from the start of contract code to copy beyond.\\n * @param _length Total number of bytes to copy from the contract's code.\\n * @return _code Bytes of code copied from the requested contract.\\n */\\n function ovmEXTCODECOPY(\\n address _contract,\\n uint256 _offset,\\n uint256 _length\\n )\\n override\\n public\\n returns (\\n bytes memory _code\\n )\\n {\\n // `ovmEXTCODECOPY` is the only overridden opcode capable of producing exactly one byte of\\n // return data. By blocking reads of one byte, we're able to use the condition that an\\n // OVM_ExecutionManager function return value having a length of exactly one byte indicates\\n // an error without an explicit revert. If users were able to read a single byte, they\\n // could forcibly trigger behavior that should only be available to this contract.\\n uint256 length = _length == 1 ? 2 : _length;\\n\\n return Lib_EthUtils.getCode(\\n _getAccountEthAddress(_contract),\\n _offset,\\n length\\n );\\n }\\n\\n /**\\n * @notice Overrides EXTCODESIZE.\\n * @param _contract Address of the contract to query the size of.\\n * @return _EXTCODESIZE Size of the requested contract in bytes.\\n */\\n function ovmEXTCODESIZE(\\n address _contract\\n )\\n override\\n public\\n returns (\\n uint256 _EXTCODESIZE\\n )\\n {\\n return Lib_EthUtils.getCodeSize(\\n _getAccountEthAddress(_contract)\\n );\\n }\\n\\n /**\\n * @notice Overrides EXTCODEHASH.\\n * @param _contract Address of the contract to query the hash of.\\n * @return _EXTCODEHASH Hash of the requested contract.\\n */\\n function ovmEXTCODEHASH(\\n address _contract\\n )\\n override\\n public\\n returns (\\n bytes32 _EXTCODEHASH\\n )\\n {\\n return Lib_EthUtils.getCodeHash(\\n _getAccountEthAddress(_contract)\\n );\\n }\\n\\n /***************************************\\n * Public Functions: Execution Context *\\n ***************************************/\\n\\n function getMaxTransactionGasLimit()\\n external\\n view\\n override\\n returns (\\n uint256 _maxTransactionGasLimit\\n )\\n {\\n return gasMeterConfig.maxTransactionGasLimit;\\n }\\n\\n /********************************************\\n * Public Functions: Deployment Whitelisting *\\n ********************************************/\\n\\n /**\\n * Checks whether the given address is on the whitelist to ovmCREATE/ovmCREATE2, and reverts if not.\\n * @param _deployerAddress Address attempting to deploy a contract.\\n */\\n function _checkDeployerAllowed(\\n address _deployerAddress\\n )\\n internal\\n {\\n // From an OVM semantics perspective, this will appear identical to\\n // the deployer ovmCALLing the whitelist. This is fine--in a sense, we are forcing them to.\\n (bool success, bytes memory data) = ovmCALL(\\n gasleft(),\\n 0x4200000000000000000000000000000000000002,\\n abi.encodeWithSignature(\\\"isDeployerAllowed(address)\\\", _deployerAddress)\\n );\\n bool isAllowed = abi.decode(data, (bool));\\n\\n if (!isAllowed || !success) {\\n _revertWithFlag(RevertFlag.CREATOR_NOT_ALLOWED);\\n }\\n }\\n\\n /********************************************\\n * Internal Functions: Contract Interaction *\\n ********************************************/\\n\\n /**\\n * Creates a new contract and associates it with some contract address.\\n * @param _contractAddress Address to associate the created contract with.\\n * @param _bytecode Bytecode to be used to create the contract.\\n * @return Final OVM contract address.\\n * @return Revertdata, if and only if the creation threw an exception.\\n */\\n function _createContract(\\n address _contractAddress,\\n bytes memory _bytecode\\n )\\n internal\\n returns (\\n address,\\n bytes memory\\n )\\n {\\n // We always update the nonce of the creating account, even if the creation fails.\\n _setAccountNonce(ovmADDRESS(), _getAccountNonce(ovmADDRESS()) + 1);\\n\\n // We're stepping into a CREATE or CREATE2, so we need to update ADDRESS to point\\n // to the contract's associated address and CALLER to point to the previous ADDRESS.\\n MessageContext memory nextMessageContext = messageContext;\\n nextMessageContext.ovmCALLER = messageContext.ovmADDRESS;\\n nextMessageContext.ovmADDRESS = _contractAddress;\\n\\n // Run the common logic which occurs between call-type and create-type messages,\\n // passing in the creation bytecode and `true` to trigger create-specific logic.\\n (bool success, bytes memory data) = _handleExternalMessage(\\n nextMessageContext,\\n gasleft(),\\n _contractAddress,\\n _bytecode,\\n true\\n );\\n\\n // Yellow paper requires that address returned is zero if the contract deployment fails.\\n return (\\n success ? _contractAddress : address(0),\\n data\\n );\\n }\\n\\n /**\\n * Calls the deployed contract associated with a given address.\\n * @param _nextMessageContext Message context to be used for the call.\\n * @param _gasLimit Amount of gas to be passed into this call.\\n * @param _contract OVM address to be called.\\n * @param _calldata Data to send along with the call.\\n * @return _success Whether or not the call returned (rather than reverted).\\n * @return _returndata Data returned by the call.\\n */\\n function _callContract(\\n MessageContext memory _nextMessageContext,\\n uint256 _gasLimit,\\n address _contract,\\n bytes memory _calldata\\n )\\n internal\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n // We reserve addresses of the form 0xdeaddeaddead...NNNN for the container contracts in L2 geth.\\n // So, we block calls to these addresses since they are not safe to run as an OVM contract itself.\\n if (\\n (uint256(_contract) & uint256(0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000))\\n == uint256(0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000)\\n ) {\\n // EVM does not return data in the success case, see: https://github.com/ethereum/go-ethereum/blob/aae7660410f0ef90279e14afaaf2f429fdc2a186/core/vm/instructions.go#L600-L604\\n return (true, hex'');\\n }\\n\\n // Both 0x0000... and the EVM precompiles have the same address on L1 and L2 --> no trie lookup needed.\\n address codeContractAddress =\\n uint(_contract) < 100\\n ? _contract\\n : _getAccountEthAddress(_contract);\\n\\n return _handleExternalMessage(\\n _nextMessageContext,\\n _gasLimit,\\n codeContractAddress,\\n _calldata,\\n false\\n );\\n }\\n\\n /**\\n * Handles all interactions which involve the execution manager calling out to untrusted code (both calls and creates).\\n * Ensures that OVM-related measures are enforced, including L2 gas refunds, nuisance gas, and flagged reversions.\\n *\\n * @param _nextMessageContext Message context to be used for the external message.\\n * @param _gasLimit Amount of gas to be passed into this message.\\n * @param _contract OVM address being called or deployed to\\n * @param _data Data for the message (either calldata or creation code)\\n * @param _isCreate Whether this is a create-type message.\\n * @return Whether or not the message (either a call or deployment) succeeded.\\n * @return Data returned by the message.\\n */\\n function _handleExternalMessage(\\n MessageContext memory _nextMessageContext,\\n uint256 _gasLimit,\\n address _contract,\\n bytes memory _data,\\n bool _isCreate\\n )\\n internal\\n returns (\\n bool,\\n bytes memory\\n )\\n {\\n // We need to switch over to our next message context for the duration of this call.\\n MessageContext memory prevMessageContext = messageContext;\\n _switchMessageContext(prevMessageContext, _nextMessageContext);\\n\\n // Nuisance gas is a system used to bound the ability for an attacker to make fraud proofs\\n // expensive by touching a lot of different accounts or storage slots. Since most contracts\\n // only use a few storage slots during any given transaction, this shouldn't be a limiting\\n // factor.\\n uint256 prevNuisanceGasLeft = messageRecord.nuisanceGasLeft;\\n uint256 nuisanceGasLimit = _getNuisanceGasLimit(_gasLimit);\\n messageRecord.nuisanceGasLeft = nuisanceGasLimit;\\n\\n // Make the call and make sure to pass in the gas limit. Another instance of hidden\\n // complexity. `_contract` is guaranteed to be a safe contract, meaning its return/revert\\n // behavior can be controlled. In particular, we enforce that flags are passed through\\n // revert data as to retrieve execution metadata that would normally be reverted out of\\n // existence.\\n\\n bool success;\\n bytes memory returndata;\\n if (_isCreate) {\\n // safeCREATE() is a function which replicates a CREATE message, but uses return values\\n // Which match that of CALL (i.e. bool, bytes). This allows many security checks to be\\n // to be shared between untrusted call and create call frames.\\n (success, returndata) = address(this).call(\\n abi.encodeWithSelector(\\n this.safeCREATE.selector,\\n _gasLimit,\\n _data,\\n _contract\\n )\\n );\\n } else {\\n (success, returndata) = _contract.call{gas: _gasLimit}(_data);\\n }\\n\\n // Switch back to the original message context now that we're out of the call.\\n _switchMessageContext(_nextMessageContext, prevMessageContext);\\n\\n // Assuming there were no reverts, the message record should be accurate here. We'll update\\n // this value in the case of a revert.\\n uint256 nuisanceGasLeft = messageRecord.nuisanceGasLeft;\\n\\n // Reverts at this point are completely OK, but we need to make a few updates based on the\\n // information passed through the revert.\\n if (success == false) {\\n (\\n RevertFlag flag,\\n uint256 nuisanceGasLeftPostRevert,\\n uint256 ovmGasRefund,\\n bytes memory returndataFromFlag\\n ) = _decodeRevertData(returndata);\\n\\n // INVALID_STATE_ACCESS is the only flag that triggers an immediate abort of the\\n // parent EVM message. This behavior is necessary because INVALID_STATE_ACCESS must\\n // halt any further transaction execution that could impact the execution result.\\n if (flag == RevertFlag.INVALID_STATE_ACCESS) {\\n _revertWithFlag(flag);\\n }\\n\\n // INTENTIONAL_REVERT, UNSAFE_BYTECODE, STATIC_VIOLATION, and CREATOR_NOT_ALLOWED aren't\\n // dependent on the input state, so we can just handle them like standard reverts. Our only change here\\n // is to record the gas refund reported by the call (enforced by safety checking).\\n if (\\n flag == RevertFlag.INTENTIONAL_REVERT\\n || flag == RevertFlag.UNSAFE_BYTECODE\\n || flag == RevertFlag.STATIC_VIOLATION\\n || flag == RevertFlag.CREATOR_NOT_ALLOWED\\n ) {\\n transactionRecord.ovmGasRefund = ovmGasRefund;\\n }\\n\\n // INTENTIONAL_REVERT needs to pass up the user-provided return data encoded into the\\n // flag, *not* the full encoded flag. All other revert types return no data.\\n if (\\n flag == RevertFlag.INTENTIONAL_REVERT\\n || _isCreate\\n ) {\\n returndata = returndataFromFlag;\\n } else {\\n returndata = hex'';\\n }\\n\\n // Reverts mean we need to use up whatever \\\"nuisance gas\\\" was used by the call.\\n // EXCEEDS_NUISANCE_GAS explicitly reduces the remaining nuisance gas for this message\\n // to zero. OUT_OF_GAS is a \\\"pseudo\\\" flag given that messages return no data when they\\n // run out of gas, so we have to treat this like EXCEEDS_NUISANCE_GAS. All other flags\\n // will simply pass up the remaining nuisance gas.\\n nuisanceGasLeft = nuisanceGasLeftPostRevert;\\n }\\n\\n // We need to reset the nuisance gas back to its original value minus the amount used here.\\n messageRecord.nuisanceGasLeft = prevNuisanceGasLeft - (nuisanceGasLimit - nuisanceGasLeft);\\n\\n return (\\n success,\\n returndata\\n );\\n }\\n\\n /**\\n * Handles the creation-specific safety measures required for OVM contract deployment.\\n * This function sanitizes the return types for creation messages to match calls (bool, bytes),\\n * by being an external function which the EM can call, that mimics the success/fail case of the CREATE.\\n * This allows for consistent handling of both types of messages in _handleExternalMessage().\\n * Having this step occur as a separate call frame also allows us to easily revert the \\n * contract deployment in the event that the code is unsafe.\\n * \\n * @param _gasLimit Amount of gas to be passed into this creation.\\n * @param _creationCode Code to pass into CREATE for deployment.\\n * @param _address OVM address being deployed to.\\n */\\n function safeCREATE(\\n uint _gasLimit,\\n bytes memory _creationCode,\\n address _address\\n )\\n external\\n {\\n // The only way this should callable is from within _createContract(),\\n // and it should DEFINITELY not be callable by a non-EM code contract.\\n if (msg.sender != address(this)) {\\n return;\\n }\\n // Check that there is not already code at this address.\\n if (_hasEmptyAccount(_address) == false) {\\n // Note: in the EVM, this case burns all allotted gas. For improved\\n // developer experience, we do return the remaining gas.\\n _revertWithFlag(\\n RevertFlag.CREATE_COLLISION,\\n Lib_ErrorUtils.encodeRevertString(\\\"A contract has already been deployed to this address\\\")\\n );\\n }\\n\\n // Check the creation bytecode against the OVM_SafetyChecker.\\n if (ovmSafetyChecker.isBytecodeSafe(_creationCode) == false) {\\n _revertWithFlag(\\n RevertFlag.UNSAFE_BYTECODE,\\n Lib_ErrorUtils.encodeRevertString(\\\"Contract creation code contains unsafe opcodes. Did you use the right compiler or pass an unsafe constructor argument?\\\")\\n );\\n }\\n\\n // We always need to initialize the contract with the default account values.\\n _initPendingAccount(_address);\\n\\n // Actually execute the EVM create message.\\n // NOTE: The inline assembly below means we can NOT make any evm calls between here and then.\\n address ethAddress = Lib_EthUtils.createContract(_creationCode);\\n\\n if (ethAddress == address(0)) {\\n // If the creation fails, the EVM lets us grab its revert data. This may contain a revert flag\\n // to be used above in _handleExternalMessage, so we pass the revert data back up unmodified.\\n assembly { \\n returndatacopy(0,0,returndatasize())\\n revert(0, returndatasize())\\n }\\n }\\n\\n // Again simply checking that the deployed code is safe too. Contracts can generate\\n // arbitrary deployment code, so there's no easy way to analyze this beforehand.\\n bytes memory deployedCode = Lib_EthUtils.getCode(ethAddress);\\n if (ovmSafetyChecker.isBytecodeSafe(deployedCode) == false) {\\n _revertWithFlag(\\n RevertFlag.UNSAFE_BYTECODE,\\n Lib_ErrorUtils.encodeRevertString(\\\"Constructor attempted to deploy unsafe bytecode.\\\")\\n );\\n }\\n\\n // Contract creation didn't need to be reverted and the bytecode is safe. We finish up by\\n // associating the desired address with the newly created contract's code hash and address.\\n _commitPendingAccount(\\n _address,\\n ethAddress,\\n Lib_EthUtils.getCodeHash(ethAddress)\\n );\\n }\\n\\n /******************************************\\n * Internal Functions: State Manipulation *\\n ******************************************/\\n\\n /**\\n * Checks whether an account exists within the OVM_StateManager.\\n * @param _address Address of the account to check.\\n * @return _exists Whether or not the account exists.\\n */\\n function _hasAccount(\\n address _address\\n )\\n internal\\n returns (\\n bool _exists\\n )\\n {\\n _checkAccountLoad(_address);\\n return ovmStateManager.hasAccount(_address);\\n }\\n\\n /**\\n * Checks whether a known empty account exists within the OVM_StateManager.\\n * @param _address Address of the account to check.\\n * @return _exists Whether or not the account empty exists.\\n */\\n function _hasEmptyAccount(\\n address _address\\n )\\n internal\\n returns (\\n bool _exists\\n )\\n {\\n _checkAccountLoad(_address);\\n return ovmStateManager.hasEmptyAccount(_address);\\n }\\n\\n /**\\n * Sets the nonce of an account.\\n * @param _address Address of the account to modify.\\n * @param _nonce New account nonce.\\n */\\n function _setAccountNonce(\\n address _address,\\n uint256 _nonce\\n )\\n internal\\n {\\n _checkAccountChange(_address);\\n ovmStateManager.setAccountNonce(_address, _nonce);\\n }\\n\\n /**\\n * Gets the nonce of an account.\\n * @param _address Address of the account to access.\\n * @return _nonce Nonce of the account.\\n */\\n function _getAccountNonce(\\n address _address\\n )\\n internal\\n returns (\\n uint256 _nonce\\n )\\n {\\n _checkAccountLoad(_address);\\n return ovmStateManager.getAccountNonce(_address);\\n }\\n\\n /**\\n * Retrieves the Ethereum address of an account.\\n * @param _address Address of the account to access.\\n * @return _ethAddress Corresponding Ethereum address.\\n */\\n function _getAccountEthAddress(\\n address _address\\n )\\n internal\\n returns (\\n address _ethAddress\\n )\\n {\\n _checkAccountLoad(_address);\\n return ovmStateManager.getAccountEthAddress(_address);\\n }\\n\\n /**\\n * Creates the default account object for the given address.\\n * @param _address Address of the account create.\\n */\\n function _initPendingAccount(\\n address _address\\n )\\n internal\\n {\\n // Although it seems like `_checkAccountChange` would be more appropriate here, we don't\\n // actually consider an account \\\"changed\\\" until it's inserted into the state (in this case\\n // by `_commitPendingAccount`).\\n _checkAccountLoad(_address);\\n ovmStateManager.initPendingAccount(_address);\\n }\\n\\n /**\\n * Stores additional relevant data for a new account, thereby \\\"committing\\\" it to the state.\\n * This function is only called during `ovmCREATE` and `ovmCREATE2` after a successful contract\\n * creation.\\n * @param _address Address of the account to commit.\\n * @param _ethAddress Address of the associated deployed contract.\\n * @param _codeHash Hash of the code stored at the address.\\n */\\n function _commitPendingAccount(\\n address _address,\\n address _ethAddress,\\n bytes32 _codeHash\\n )\\n internal\\n {\\n _checkAccountChange(_address);\\n ovmStateManager.commitPendingAccount(\\n _address,\\n _ethAddress,\\n _codeHash\\n );\\n }\\n\\n /**\\n * Retrieves the value of a storage slot.\\n * @param _contract Address of the contract to query.\\n * @param _key 32 byte key of the storage slot.\\n * @return _value 32 byte storage slot value.\\n */\\n function _getContractStorage(\\n address _contract,\\n bytes32 _key\\n )\\n internal\\n returns (\\n bytes32 _value\\n )\\n {\\n _checkContractStorageLoad(_contract, _key);\\n return ovmStateManager.getContractStorage(_contract, _key);\\n }\\n\\n /**\\n * Sets the value of a storage slot.\\n * @param _contract Address of the contract to modify.\\n * @param _key 32 byte key of the storage slot.\\n * @param _value 32 byte storage slot value.\\n */\\n function _putContractStorage(\\n address _contract,\\n bytes32 _key,\\n bytes32 _value\\n )\\n internal\\n {\\n // We don't set storage if the value didn't change. Although this acts as a convenient\\n // optimization, it's also necessary to avoid the case in which a contract with no storage\\n // attempts to store the value \\\"0\\\" at any key. Putting this value (and therefore requiring\\n // that the value be committed into the storage trie after execution) would incorrectly\\n // modify the storage root.\\n if (_getContractStorage(_contract, _key) == _value) {\\n return;\\n }\\n\\n _checkContractStorageChange(_contract, _key);\\n ovmStateManager.putContractStorage(_contract, _key, _value);\\n }\\n\\n /**\\n * Validation whenever a contract needs to be loaded. Checks that the account exists, charges\\n * nuisance gas if the account hasn't been loaded before.\\n * @param _address Address of the account to load.\\n */\\n function _checkAccountLoad(\\n address _address\\n )\\n internal\\n {\\n // See `_checkContractStorageLoad` for more information.\\n if (gasleft() < MIN_GAS_FOR_INVALID_STATE_ACCESS) {\\n _revertWithFlag(RevertFlag.OUT_OF_GAS);\\n }\\n\\n // See `_checkContractStorageLoad` for more information.\\n if (ovmStateManager.hasAccount(_address) == false) {\\n _revertWithFlag(RevertFlag.INVALID_STATE_ACCESS);\\n }\\n\\n // Check whether the account has been loaded before and mark it as loaded if not. We need\\n // this because \\\"nuisance gas\\\" only applies to the first time that an account is loaded.\\n (\\n bool _wasAccountAlreadyLoaded\\n ) = ovmStateManager.testAndSetAccountLoaded(_address);\\n\\n // If we hadn't already loaded the account, then we'll need to charge \\\"nuisance gas\\\" based\\n // on the size of the contract code.\\n if (_wasAccountAlreadyLoaded == false) {\\n _useNuisanceGas(\\n (Lib_EthUtils.getCodeSize(_getAccountEthAddress(_address)) * NUISANCE_GAS_PER_CONTRACT_BYTE) + MIN_NUISANCE_GAS_PER_CONTRACT\\n );\\n }\\n }\\n\\n /**\\n * Validation whenever a contract needs to be changed. Checks that the account exists, charges\\n * nuisance gas if the account hasn't been changed before.\\n * @param _address Address of the account to change.\\n */\\n function _checkAccountChange(\\n address _address\\n )\\n internal\\n {\\n // Start by checking for a load as we only want to charge nuisance gas proportional to\\n // contract size once.\\n _checkAccountLoad(_address);\\n\\n // Check whether the account has been changed before and mark it as changed if not. We need\\n // this because \\\"nuisance gas\\\" only applies to the first time that an account is changed.\\n (\\n bool _wasAccountAlreadyChanged\\n ) = ovmStateManager.testAndSetAccountChanged(_address);\\n\\n // If we hadn't already loaded the account, then we'll need to charge \\\"nuisance gas\\\" based\\n // on the size of the contract code.\\n if (_wasAccountAlreadyChanged == false) {\\n ovmStateManager.incrementTotalUncommittedAccounts();\\n _useNuisanceGas(\\n (Lib_EthUtils.getCodeSize(_getAccountEthAddress(_address)) * NUISANCE_GAS_PER_CONTRACT_BYTE) + MIN_NUISANCE_GAS_PER_CONTRACT\\n );\\n }\\n }\\n\\n /**\\n * Validation whenever a slot needs to be loaded. Checks that the account exists, charges\\n * nuisance gas if the slot hasn't been loaded before.\\n * @param _contract Address of the account to load from.\\n * @param _key 32 byte key to load.\\n */\\n function _checkContractStorageLoad(\\n address _contract,\\n bytes32 _key\\n )\\n internal\\n {\\n // Another case of hidden complexity. If we didn't enforce this requirement, then a\\n // contract could pass in just enough gas to cause the INVALID_STATE_ACCESS check to fail\\n // on L1 but not on L2. A contract could use this behavior to prevent the\\n // OVM_ExecutionManager from detecting an invalid state access. Reverting with OUT_OF_GAS\\n // allows us to also charge for the full message nuisance gas, because you deserve that for\\n // trying to break the contract in this way.\\n if (gasleft() < MIN_GAS_FOR_INVALID_STATE_ACCESS) {\\n _revertWithFlag(RevertFlag.OUT_OF_GAS);\\n }\\n\\n // We need to make sure that the transaction isn't trying to access storage that hasn't\\n // been provided to the OVM_StateManager. We'll immediately abort if this is the case.\\n // We know that we have enough gas to do this check because of the above test.\\n if (ovmStateManager.hasContractStorage(_contract, _key) == false) {\\n _revertWithFlag(RevertFlag.INVALID_STATE_ACCESS);\\n }\\n\\n // Check whether the slot has been loaded before and mark it as loaded if not. We need\\n // this because \\\"nuisance gas\\\" only applies to the first time that a slot is loaded.\\n (\\n bool _wasContractStorageAlreadyLoaded\\n ) = ovmStateManager.testAndSetContractStorageLoaded(_contract, _key);\\n\\n // If we hadn't already loaded the account, then we'll need to charge some fixed amount of\\n // \\\"nuisance gas\\\".\\n if (_wasContractStorageAlreadyLoaded == false) {\\n _useNuisanceGas(NUISANCE_GAS_SLOAD);\\n }\\n }\\n\\n /**\\n * Validation whenever a slot needs to be changed. Checks that the account exists, charges\\n * nuisance gas if the slot hasn't been changed before.\\n * @param _contract Address of the account to change.\\n * @param _key 32 byte key to change.\\n */\\n function _checkContractStorageChange(\\n address _contract,\\n bytes32 _key\\n )\\n internal\\n {\\n // Start by checking for load to make sure we have the storage slot and that we charge the\\n // \\\"nuisance gas\\\" necessary to prove the storage slot state.\\n _checkContractStorageLoad(_contract, _key);\\n\\n // Check whether the slot has been changed before and mark it as changed if not. We need\\n // this because \\\"nuisance gas\\\" only applies to the first time that a slot is changed.\\n (\\n bool _wasContractStorageAlreadyChanged\\n ) = ovmStateManager.testAndSetContractStorageChanged(_contract, _key);\\n\\n // If we hadn't already changed the account, then we'll need to charge some fixed amount of\\n // \\\"nuisance gas\\\".\\n if (_wasContractStorageAlreadyChanged == false) {\\n // Changing a storage slot means that we're also going to have to change the\\n // corresponding account, so do an account change check.\\n _checkAccountChange(_contract);\\n\\n ovmStateManager.incrementTotalUncommittedContractStorage();\\n _useNuisanceGas(NUISANCE_GAS_SSTORE);\\n }\\n }\\n\\n\\n /************************************\\n * Internal Functions: Revert Logic *\\n ************************************/\\n\\n /**\\n * Simple encoding for revert data.\\n * @param _flag Flag to revert with.\\n * @param _data Additional user-provided revert data.\\n * @return _revertdata Encoded revert data.\\n */\\n function _encodeRevertData(\\n RevertFlag _flag,\\n bytes memory _data\\n )\\n internal\\n view\\n returns (\\n bytes memory _revertdata\\n )\\n {\\n // Out of gas and create exceptions will fundamentally return no data, so simulating it shouldn't either.\\n if (\\n _flag == RevertFlag.OUT_OF_GAS\\n ) {\\n return bytes('');\\n }\\n\\n // INVALID_STATE_ACCESS doesn't need to return any data other than the flag.\\n if (_flag == RevertFlag.INVALID_STATE_ACCESS) {\\n return abi.encode(\\n _flag,\\n 0,\\n 0,\\n bytes('')\\n );\\n }\\n\\n // Just ABI encode the rest of the parameters.\\n return abi.encode(\\n _flag,\\n messageRecord.nuisanceGasLeft,\\n transactionRecord.ovmGasRefund,\\n _data\\n );\\n }\\n\\n /**\\n * Simple decoding for revert data.\\n * @param _revertdata Revert data to decode.\\n * @return _flag Flag used to revert.\\n * @return _nuisanceGasLeft Amount of nuisance gas unused by the message.\\n * @return _ovmGasRefund Amount of gas refunded during the message.\\n * @return _data Additional user-provided revert data.\\n */\\n function _decodeRevertData(\\n bytes memory _revertdata\\n )\\n internal\\n pure\\n returns (\\n RevertFlag _flag,\\n uint256 _nuisanceGasLeft,\\n uint256 _ovmGasRefund,\\n bytes memory _data\\n )\\n {\\n // A length of zero means the call ran out of gas, just return empty data.\\n if (_revertdata.length == 0) {\\n return (\\n RevertFlag.OUT_OF_GAS,\\n 0,\\n 0,\\n bytes('')\\n );\\n }\\n\\n // ABI decode the incoming data.\\n return abi.decode(_revertdata, (RevertFlag, uint256, uint256, bytes));\\n }\\n\\n /**\\n * Causes a message to revert or abort.\\n * @param _flag Flag to revert with.\\n * @param _data Additional user-provided data.\\n */\\n function _revertWithFlag(\\n RevertFlag _flag,\\n bytes memory _data\\n )\\n internal\\n view\\n {\\n bytes memory revertdata = _encodeRevertData(\\n _flag,\\n _data\\n );\\n\\n assembly {\\n revert(add(revertdata, 0x20), mload(revertdata))\\n }\\n }\\n\\n /**\\n * Causes a message to revert or abort.\\n * @param _flag Flag to revert with.\\n */\\n function _revertWithFlag(\\n RevertFlag _flag\\n )\\n internal\\n {\\n _revertWithFlag(_flag, bytes(''));\\n }\\n\\n\\n /******************************************\\n * Internal Functions: Nuisance Gas Logic *\\n ******************************************/\\n\\n /**\\n * Computes the nuisance gas limit from the gas limit.\\n * @dev This function is currently using a naive implementation whereby the nuisance gas limit\\n * is set to exactly equal the lesser of the gas limit or remaining gas. It's likely that\\n * this implementation is perfectly fine, but we may change this formula later.\\n * @param _gasLimit Gas limit to compute from.\\n * @return _nuisanceGasLimit Computed nuisance gas limit.\\n */\\n function _getNuisanceGasLimit(\\n uint256 _gasLimit\\n )\\n internal\\n view\\n returns (\\n uint256 _nuisanceGasLimit\\n )\\n {\\n return _gasLimit < gasleft() ? _gasLimit : gasleft();\\n }\\n\\n /**\\n * Uses a certain amount of nuisance gas.\\n * @param _amount Amount of nuisance gas to use.\\n */\\n function _useNuisanceGas(\\n uint256 _amount\\n )\\n internal\\n {\\n // Essentially the same as a standard OUT_OF_GAS, except we also retain a record of the gas\\n // refund to be given at the end of the transaction.\\n if (messageRecord.nuisanceGasLeft < _amount) {\\n _revertWithFlag(RevertFlag.EXCEEDS_NUISANCE_GAS);\\n }\\n\\n messageRecord.nuisanceGasLeft -= _amount;\\n }\\n\\n\\n /************************************\\n * Internal Functions: Gas Metering *\\n ************************************/\\n\\n /**\\n * Checks whether a transaction needs to start a new epoch and does so if necessary.\\n * @param _timestamp Transaction timestamp.\\n */\\n function _checkNeedsNewEpoch(\\n uint256 _timestamp\\n )\\n internal\\n {\\n if (\\n _timestamp >= (\\n _getGasMetadata(GasMetadataKey.CURRENT_EPOCH_START_TIMESTAMP)\\n + gasMeterConfig.secondsPerEpoch\\n )\\n ) {\\n _putGasMetadata(\\n GasMetadataKey.CURRENT_EPOCH_START_TIMESTAMP,\\n _timestamp\\n );\\n\\n _putGasMetadata(\\n GasMetadataKey.PREV_EPOCH_SEQUENCER_QUEUE_GAS,\\n _getGasMetadata(\\n GasMetadataKey.CUMULATIVE_SEQUENCER_QUEUE_GAS\\n )\\n );\\n\\n _putGasMetadata(\\n GasMetadataKey.PREV_EPOCH_L1TOL2_QUEUE_GAS,\\n _getGasMetadata(\\n GasMetadataKey.CUMULATIVE_L1TOL2_QUEUE_GAS\\n )\\n );\\n }\\n }\\n\\n /**\\n * Validates the input values of a transaction.\\n * @return _valid Whether or not the transaction data is valid.\\n */\\n function _isValidInput(\\n Lib_OVMCodec.Transaction memory _transaction\\n )\\n view\\n internal\\n returns (\\n bool\\n )\\n {\\n // Prevent reentrancy to run():\\n // This check prevents calling run with the default ovmNumber.\\n // Combined with the first check in run():\\n // if (transactionContext.ovmNUMBER != DEFAULT_UINT256) { return; }\\n // It should be impossible to re-enter since run() returns before any other call frames are created.\\n // Since this value is already being written to storage, we save much gas compared to\\n // using the standard nonReentrant pattern.\\n if (_transaction.blockNumber == DEFAULT_UINT256) {\\n return false;\\n }\\n\\n if (_isValidGasLimit(_transaction.gasLimit, _transaction.l1QueueOrigin) == false) {\\n return false;\\n }\\n\\n return true;\\n }\\n\\n /**\\n * Validates the gas limit for a given transaction.\\n * @param _gasLimit Gas limit provided by the transaction.\\n * param _queueOrigin Queue from which the transaction originated.\\n * @return _valid Whether or not the gas limit is valid.\\n */\\n function _isValidGasLimit(\\n uint256 _gasLimit,\\n Lib_OVMCodec.QueueOrigin // _queueOrigin\\n )\\n view\\n internal\\n returns (\\n bool _valid\\n )\\n {\\n // Always have to be below the maximum gas limit.\\n if (_gasLimit > gasMeterConfig.maxTransactionGasLimit) {\\n return false;\\n }\\n\\n // Always have to be above the minimum gas limit.\\n if (_gasLimit < gasMeterConfig.minTransactionGasLimit) {\\n return false;\\n }\\n\\n // TEMPORARY: Gas metering is disabled for minnet.\\n return true;\\n // GasMetadataKey cumulativeGasKey;\\n // GasMetadataKey prevEpochGasKey;\\n // if (_queueOrigin == Lib_OVMCodec.QueueOrigin.SEQUENCER_QUEUE) {\\n // cumulativeGasKey = GasMetadataKey.CUMULATIVE_SEQUENCER_QUEUE_GAS;\\n // prevEpochGasKey = GasMetadataKey.PREV_EPOCH_SEQUENCER_QUEUE_GAS;\\n // } else {\\n // cumulativeGasKey = GasMetadataKey.CUMULATIVE_L1TOL2_QUEUE_GAS;\\n // prevEpochGasKey = GasMetadataKey.PREV_EPOCH_L1TOL2_QUEUE_GAS;\\n // }\\n\\n // return (\\n // (\\n // _getGasMetadata(cumulativeGasKey)\\n // - _getGasMetadata(prevEpochGasKey)\\n // + _gasLimit\\n // ) < gasMeterConfig.maxGasPerQueuePerEpoch\\n // );\\n }\\n\\n /**\\n * Updates the cumulative gas after a transaction.\\n * @param _gasUsed Gas used by the transaction.\\n * @param _queueOrigin Queue from which the transaction originated.\\n */\\n function _updateCumulativeGas(\\n uint256 _gasUsed,\\n Lib_OVMCodec.QueueOrigin _queueOrigin\\n )\\n internal\\n {\\n GasMetadataKey cumulativeGasKey;\\n if (_queueOrigin == Lib_OVMCodec.QueueOrigin.SEQUENCER_QUEUE) {\\n cumulativeGasKey = GasMetadataKey.CUMULATIVE_SEQUENCER_QUEUE_GAS;\\n } else {\\n cumulativeGasKey = GasMetadataKey.CUMULATIVE_L1TOL2_QUEUE_GAS;\\n }\\n\\n _putGasMetadata(\\n cumulativeGasKey,\\n (\\n _getGasMetadata(cumulativeGasKey)\\n + gasMeterConfig.minTransactionGasLimit\\n + _gasUsed\\n - transactionRecord.ovmGasRefund\\n )\\n );\\n }\\n\\n /**\\n * Retrieves the value of a gas metadata key.\\n * @param _key Gas metadata key to retrieve.\\n * @return _value Value stored at the given key.\\n */\\n function _getGasMetadata(\\n GasMetadataKey _key\\n )\\n internal\\n returns (\\n uint256 _value\\n )\\n {\\n return uint256(_getContractStorage(\\n GAS_METADATA_ADDRESS,\\n bytes32(uint256(_key))\\n ));\\n }\\n\\n /**\\n * Sets the value of a gas metadata key.\\n * @param _key Gas metadata key to set.\\n * @param _value Value to store at the given key.\\n */\\n function _putGasMetadata(\\n GasMetadataKey _key,\\n uint256 _value\\n )\\n internal\\n {\\n _putContractStorage(\\n GAS_METADATA_ADDRESS,\\n bytes32(uint256(_key)),\\n bytes32(uint256(_value))\\n );\\n }\\n\\n\\n /*****************************************\\n * Internal Functions: Execution Context *\\n *****************************************/\\n\\n /**\\n * Swaps over to a new message context.\\n * @param _prevMessageContext Context we're switching from.\\n * @param _nextMessageContext Context we're switching to.\\n */\\n function _switchMessageContext(\\n MessageContext memory _prevMessageContext,\\n MessageContext memory _nextMessageContext\\n )\\n internal\\n {\\n // Avoid unnecessary the SSTORE.\\n if (_prevMessageContext.ovmCALLER != _nextMessageContext.ovmCALLER) {\\n messageContext.ovmCALLER = _nextMessageContext.ovmCALLER;\\n }\\n\\n // Avoid unnecessary the SSTORE.\\n if (_prevMessageContext.ovmADDRESS != _nextMessageContext.ovmADDRESS) {\\n messageContext.ovmADDRESS = _nextMessageContext.ovmADDRESS;\\n }\\n\\n // Avoid unnecessary the SSTORE.\\n if (_prevMessageContext.isStatic != _nextMessageContext.isStatic) {\\n messageContext.isStatic = _nextMessageContext.isStatic;\\n }\\n }\\n\\n /**\\n * Initializes the execution context.\\n * @param _transaction OVM transaction being executed.\\n */\\n function _initContext(\\n Lib_OVMCodec.Transaction memory _transaction\\n )\\n internal\\n {\\n transactionContext.ovmTIMESTAMP = _transaction.timestamp;\\n transactionContext.ovmNUMBER = _transaction.blockNumber;\\n transactionContext.ovmTXGASLIMIT = _transaction.gasLimit;\\n transactionContext.ovmL1QUEUEORIGIN = _transaction.l1QueueOrigin;\\n transactionContext.ovmL1TXORIGIN = _transaction.l1TxOrigin;\\n transactionContext.ovmGASLIMIT = gasMeterConfig.maxGasPerQueuePerEpoch;\\n\\n messageRecord.nuisanceGasLeft = _getNuisanceGasLimit(_transaction.gasLimit);\\n }\\n\\n /**\\n * Resets the transaction and message context.\\n */\\n function _resetContext()\\n internal\\n {\\n transactionContext.ovmL1TXORIGIN = DEFAULT_ADDRESS;\\n transactionContext.ovmTIMESTAMP = DEFAULT_UINT256;\\n transactionContext.ovmNUMBER = DEFAULT_UINT256;\\n transactionContext.ovmGASLIMIT = DEFAULT_UINT256;\\n transactionContext.ovmTXGASLIMIT = DEFAULT_UINT256;\\n transactionContext.ovmL1QUEUEORIGIN = Lib_OVMCodec.QueueOrigin.SEQUENCER_QUEUE;\\n\\n transactionRecord.ovmGasRefund = DEFAULT_UINT256;\\n\\n messageContext.ovmCALLER = DEFAULT_ADDRESS;\\n messageContext.ovmADDRESS = DEFAULT_ADDRESS;\\n messageContext.isStatic = false;\\n\\n messageRecord.nuisanceGasLeft = DEFAULT_UINT256;\\n\\n // Reset the ovmStateManager.\\n ovmStateManager = iOVM_StateManager(address(0));\\n }\\n\\n /*****************************\\n * L2-only Helper Functions *\\n *****************************/\\n\\n /**\\n * Unreachable helper function for simulating eth_calls with an OVM message context.\\n * This function will throw an exception in all cases other than when used as a custom entrypoint in L2 Geth to simulate eth_call.\\n * @param _transaction the message transaction to simulate.\\n * @param _from the OVM account the simulated call should be from.\\n */\\n function simulateMessage(\\n Lib_OVMCodec.Transaction memory _transaction,\\n address _from,\\n iOVM_StateManager _ovmStateManager\\n )\\n external\\n returns (\\n bool,\\n bytes memory\\n )\\n {\\n // Prevent this call from having any effect unless in a custom-set VM frame\\n require(msg.sender == address(0));\\n\\n ovmStateManager = _ovmStateManager;\\n _initContext(_transaction);\\n messageRecord.nuisanceGasLeft = uint(-1);\\n\\n messageContext.ovmADDRESS = _from;\\n\\n bool isCreate = _transaction.entrypoint == address(0);\\n if (isCreate) {\\n (address created, bytes memory revertData) = ovmCREATE(_transaction.data);\\n if (created == address(0)) {\\n return (false, revertData);\\n } else {\\n // The eth_call RPC endpoint for to = undefined will return the deployed bytecode\\n // in the success case, differing from standard create messages.\\n return (true, Lib_EthUtils.getCode(created));\\n }\\n } else {\\n return ovmCALL(\\n _transaction.gasLimit,\\n _transaction.entrypoint,\\n _transaction.data\\n );\\n }\\n }\\n}\\n\",\"keccak256\":\"0x3178e4fa03d69704dd45de49b4282b2ce36500f50c8b3286c6b8fe15bc5009ad\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/predeploys/OVM_DeployerWhitelist.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_Bytes32Utils } from \\\"../../libraries/utils/Lib_Bytes32Utils.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_DeployerWhitelist } from \\\"../../iOVM/predeploys/iOVM_DeployerWhitelist.sol\\\";\\nimport { Lib_SafeExecutionManagerWrapper } from \\\"../../libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\\\";\\n\\n/**\\n * @title OVM_DeployerWhitelist\\n * @dev The Deployer Whitelist is a temporary predeploy used to provide additional safety during the\\n * initial phases of our mainnet roll out. It is owned by the Optimism team, and defines accounts\\n * which are allowed to deploy contracts on Layer2. The Execution Manager will only allow an \\n * ovmCREATE or ovmCREATE2 operation to proceed if the deployer's address whitelisted.\\n * \\n * Compiler used: solc\\n * Runtime target: OVM\\n */\\ncontract OVM_DeployerWhitelist is iOVM_DeployerWhitelist {\\n\\n /**********************\\n * Contract Constants *\\n **********************/\\n\\n bytes32 internal constant KEY_INITIALIZED = 0x0000000000000000000000000000000000000000000000000000000000000010;\\n bytes32 internal constant KEY_OWNER = 0x0000000000000000000000000000000000000000000000000000000000000011;\\n bytes32 internal constant KEY_ALLOW_ARBITRARY_DEPLOYMENT = 0x0000000000000000000000000000000000000000000000000000000000000012;\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n \\n /**\\n * Blocks functions to anyone except the contract owner.\\n */\\n modifier onlyOwner() {\\n address owner = Lib_Bytes32Utils.toAddress(\\n Lib_SafeExecutionManagerWrapper.safeSLOAD(\\n KEY_OWNER\\n )\\n );\\n\\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(\\n Lib_SafeExecutionManagerWrapper.safeCALLER() == owner,\\n \\\"Function can only be called by the owner of this contract.\\\"\\n );\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n \\n /**\\n * Initializes the whitelist.\\n * @param _owner Address of the owner for this contract.\\n * @param _allowArbitraryDeployment Whether or not to allow arbitrary contract deployment.\\n */\\n function initialize(\\n address _owner,\\n bool _allowArbitraryDeployment\\n )\\n override\\n public\\n {\\n bool initialized = Lib_Bytes32Utils.toBool(\\n Lib_SafeExecutionManagerWrapper.safeSLOAD(KEY_INITIALIZED)\\n );\\n\\n if (initialized == true) {\\n return;\\n }\\n\\n Lib_SafeExecutionManagerWrapper.safeSSTORE(\\n KEY_INITIALIZED,\\n Lib_Bytes32Utils.fromBool(true)\\n );\\n Lib_SafeExecutionManagerWrapper.safeSSTORE(\\n KEY_OWNER,\\n Lib_Bytes32Utils.fromAddress(_owner)\\n );\\n Lib_SafeExecutionManagerWrapper.safeSSTORE(\\n KEY_ALLOW_ARBITRARY_DEPLOYMENT,\\n Lib_Bytes32Utils.fromBool(_allowArbitraryDeployment)\\n );\\n }\\n\\n /**\\n * Gets the owner of the whitelist.\\n */\\n function getOwner()\\n override\\n public\\n returns(\\n address\\n )\\n {\\n return Lib_Bytes32Utils.toAddress(\\n Lib_SafeExecutionManagerWrapper.safeSLOAD(\\n KEY_OWNER\\n )\\n );\\n }\\n\\n /**\\n * Adds or removes an address from the deployment whitelist.\\n * @param _deployer Address to update permissions for.\\n * @param _isWhitelisted Whether or not the address is whitelisted.\\n */\\n function setWhitelistedDeployer(\\n address _deployer,\\n bool _isWhitelisted\\n )\\n override\\n public\\n onlyOwner\\n {\\n Lib_SafeExecutionManagerWrapper.safeSSTORE(\\n Lib_Bytes32Utils.fromAddress(_deployer),\\n Lib_Bytes32Utils.fromBool(_isWhitelisted)\\n );\\n }\\n\\n /**\\n * Updates the owner of this contract.\\n * @param _owner Address of the new owner.\\n */\\n function setOwner(\\n address _owner\\n )\\n override\\n public\\n onlyOwner\\n {\\n Lib_SafeExecutionManagerWrapper.safeSSTORE(\\n KEY_OWNER,\\n Lib_Bytes32Utils.fromAddress(_owner)\\n );\\n }\\n\\n /**\\n * Updates the arbitrary deployment flag.\\n * @param _allowArbitraryDeployment Whether or not to allow arbitrary contract deployment.\\n */\\n function setAllowArbitraryDeployment(\\n bool _allowArbitraryDeployment\\n )\\n override\\n public\\n onlyOwner\\n {\\n Lib_SafeExecutionManagerWrapper.safeSSTORE(\\n KEY_ALLOW_ARBITRARY_DEPLOYMENT,\\n Lib_Bytes32Utils.fromBool(_allowArbitraryDeployment)\\n );\\n }\\n\\n /**\\n * Permanently enables arbitrary contract deployment and deletes the owner.\\n */\\n function enableArbitraryContractDeployment()\\n override\\n public\\n onlyOwner\\n {\\n setAllowArbitraryDeployment(true);\\n setOwner(address(0));\\n }\\n\\n /**\\n * Checks whether an address is allowed to deploy contracts.\\n * @param _deployer Address to check.\\n * @return _allowed Whether or not the address can deploy contracts.\\n */\\n function isDeployerAllowed(\\n address _deployer\\n )\\n override\\n public\\n returns (\\n bool _allowed\\n )\\n {\\n bool initialized = Lib_Bytes32Utils.toBool(\\n Lib_SafeExecutionManagerWrapper.safeSLOAD(KEY_INITIALIZED)\\n );\\n\\n if (initialized == false) {\\n return true;\\n }\\n\\n bool allowArbitraryDeployment = Lib_Bytes32Utils.toBool(\\n Lib_SafeExecutionManagerWrapper.safeSLOAD(KEY_ALLOW_ARBITRARY_DEPLOYMENT)\\n );\\n\\n if (allowArbitraryDeployment == true) {\\n return true;\\n }\\n\\n bool isWhitelisted = Lib_Bytes32Utils.toBool(\\n Lib_SafeExecutionManagerWrapper.safeSLOAD(\\n Lib_Bytes32Utils.fromAddress(_deployer)\\n )\\n );\\n\\n return isWhitelisted; \\n }\\n}\\n\",\"keccak256\":\"0xe746e2a3f649d3d9760db8a0b6dccee5cdb267c9615268181285846277307084\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/accounts/iOVM_ECDSAContractAccount.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title iOVM_ECDSAContractAccount\\n */\\ninterface iOVM_ECDSAContractAccount {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function execute(\\n bytes memory _transaction,\\n Lib_OVMCodec.EOASignatureType _signatureType,\\n uint8 _v,\\n bytes32 _r,\\n bytes32 _s\\n ) external returns (bool _success, bytes memory _returndata);\\n}\\n\",\"keccak256\":\"0x308729bc62dcffb11ff1d840781105cf1bf0dd4cbcfb1af704b800bb0cfe9b85\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/execution/iOVM_ExecutionManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\ninterface iOVM_ExecutionManager {\\n /**********\\n * Enums *\\n *********/\\n\\n enum RevertFlag {\\n OUT_OF_GAS,\\n INTENTIONAL_REVERT,\\n EXCEEDS_NUISANCE_GAS,\\n INVALID_STATE_ACCESS,\\n UNSAFE_BYTECODE,\\n CREATE_COLLISION,\\n STATIC_VIOLATION,\\n CREATOR_NOT_ALLOWED\\n }\\n\\n enum GasMetadataKey {\\n CURRENT_EPOCH_START_TIMESTAMP,\\n CUMULATIVE_SEQUENCER_QUEUE_GAS,\\n CUMULATIVE_L1TOL2_QUEUE_GAS,\\n PREV_EPOCH_SEQUENCER_QUEUE_GAS,\\n PREV_EPOCH_L1TOL2_QUEUE_GAS\\n }\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct GasMeterConfig {\\n uint256 minTransactionGasLimit;\\n uint256 maxTransactionGasLimit;\\n uint256 maxGasPerQueuePerEpoch;\\n uint256 secondsPerEpoch;\\n }\\n\\n struct GlobalContext {\\n uint256 ovmCHAINID;\\n }\\n\\n struct TransactionContext {\\n Lib_OVMCodec.QueueOrigin ovmL1QUEUEORIGIN;\\n uint256 ovmTIMESTAMP;\\n uint256 ovmNUMBER;\\n uint256 ovmGASLIMIT;\\n uint256 ovmTXGASLIMIT;\\n address ovmL1TXORIGIN;\\n }\\n\\n struct TransactionRecord {\\n uint256 ovmGasRefund;\\n }\\n\\n struct MessageContext {\\n address ovmCALLER;\\n address ovmADDRESS;\\n bool isStatic;\\n }\\n\\n struct MessageRecord {\\n uint256 nuisanceGasLeft;\\n }\\n\\n\\n /************************************\\n * Transaction Execution Entrypoint *\\n ************************************/\\n\\n function run(\\n Lib_OVMCodec.Transaction calldata _transaction,\\n address _txStateManager\\n ) external;\\n\\n\\n /*******************\\n * Context Opcodes *\\n *******************/\\n\\n function ovmCALLER() external view returns (address _caller);\\n function ovmADDRESS() external view returns (address _address);\\n function ovmTIMESTAMP() external view returns (uint256 _timestamp);\\n function ovmNUMBER() external view returns (uint256 _number);\\n function ovmGASLIMIT() external view returns (uint256 _gasLimit);\\n function ovmCHAINID() external view returns (uint256 _chainId);\\n\\n\\n /**********************\\n * L2 Context Opcodes *\\n **********************/\\n\\n function ovmL1QUEUEORIGIN() external view returns (Lib_OVMCodec.QueueOrigin _queueOrigin);\\n function ovmL1TXORIGIN() external view returns (address _l1TxOrigin);\\n\\n\\n /*******************\\n * Halting Opcodes *\\n *******************/\\n\\n function ovmREVERT(bytes memory _data) external;\\n\\n\\n /*****************************\\n * Contract Creation Opcodes *\\n *****************************/\\n\\n function ovmCREATE(bytes memory _bytecode) external returns (address _contract, bytes memory _revertdata);\\n function ovmCREATE2(bytes memory _bytecode, bytes32 _salt) external returns (address _contract, bytes memory _revertdata);\\n\\n\\n /*******************************\\n * Account Abstraction Opcodes *\\n ******************************/\\n\\n function ovmGETNONCE() external returns (uint256 _nonce);\\n function ovmINCREMENTNONCE() external;\\n function ovmCREATEEOA(bytes32 _messageHash, uint8 _v, bytes32 _r, bytes32 _s) external;\\n\\n\\n /****************************\\n * Contract Calling Opcodes *\\n ****************************/\\n\\n function ovmCALL(uint256 _gasLimit, address _address, bytes memory _calldata) external returns (bool _success, bytes memory _returndata);\\n function ovmSTATICCALL(uint256 _gasLimit, address _address, bytes memory _calldata) external returns (bool _success, bytes memory _returndata);\\n function ovmDELEGATECALL(uint256 _gasLimit, address _address, bytes memory _calldata) external returns (bool _success, bytes memory _returndata);\\n\\n\\n /****************************\\n * Contract Storage Opcodes *\\n ****************************/\\n\\n function ovmSLOAD(bytes32 _key) external returns (bytes32 _value);\\n function ovmSSTORE(bytes32 _key, bytes32 _value) external;\\n\\n\\n /*************************\\n * Contract Code Opcodes *\\n *************************/\\n\\n function ovmEXTCODECOPY(address _contract, uint256 _offset, uint256 _length) external returns (bytes memory _code);\\n function ovmEXTCODESIZE(address _contract) external returns (uint256 _size);\\n function ovmEXTCODEHASH(address _contract) external returns (bytes32 _hash);\\n\\n\\n /***************************************\\n * Public Functions: Execution Context *\\n ***************************************/\\n\\n function getMaxTransactionGasLimit() external view returns (uint _maxTransactionGasLimit);\\n}\\n\",\"keccak256\":\"0xa613e2f578d56aa80f0916df538b487f8213a18933e78fdecb9efeedae02cf9c\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/execution/iOVM_SafetyChecker.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title iOVM_SafetyChecker\\n */\\ninterface iOVM_SafetyChecker {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function isBytecodeSafe(bytes calldata _bytecode) external pure returns (bool);\\n}\\n\",\"keccak256\":\"0xde6639676d4ec4f77297652d5ede2429bc93e74e11fefd9e9de4bc92dd784878\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/execution/iOVM_StateManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title iOVM_StateManager\\n */\\ninterface iOVM_StateManager {\\n\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n enum ItemState {\\n ITEM_UNTOUCHED,\\n ITEM_LOADED,\\n ITEM_CHANGED,\\n ITEM_COMMITTED\\n }\\n\\n /***************************\\n * Public Functions: Misc *\\n ***************************/\\n\\n function isAuthenticated(address _address) external view returns (bool);\\n\\n /***************************\\n * Public Functions: Setup *\\n ***************************/\\n\\n function owner() external view returns (address _owner);\\n function ovmExecutionManager() external view returns (address _ovmExecutionManager);\\n function setExecutionManager(address _ovmExecutionManager) external;\\n\\n\\n /************************************\\n * Public Functions: Account Access *\\n ************************************/\\n\\n function putAccount(address _address, Lib_OVMCodec.Account memory _account) external;\\n function putEmptyAccount(address _address) external;\\n function getAccount(address _address) external view returns (Lib_OVMCodec.Account memory _account);\\n function hasAccount(address _address) external view returns (bool _exists);\\n function hasEmptyAccount(address _address) external view returns (bool _exists);\\n function setAccountNonce(address _address, uint256 _nonce) external;\\n function getAccountNonce(address _address) external view returns (uint256 _nonce);\\n function getAccountEthAddress(address _address) external view returns (address _ethAddress);\\n function getAccountStorageRoot(address _address) external view returns (bytes32 _storageRoot);\\n function initPendingAccount(address _address) external;\\n function commitPendingAccount(address _address, address _ethAddress, bytes32 _codeHash) external;\\n function testAndSetAccountLoaded(address _address) external returns (bool _wasAccountAlreadyLoaded);\\n function testAndSetAccountChanged(address _address) external returns (bool _wasAccountAlreadyChanged);\\n function commitAccount(address _address) external returns (bool _wasAccountCommitted);\\n function incrementTotalUncommittedAccounts() external;\\n function getTotalUncommittedAccounts() external view returns (uint256 _total);\\n function wasAccountChanged(address _address) external view returns (bool);\\n function wasAccountCommitted(address _address) external view returns (bool);\\n\\n\\n /************************************\\n * Public Functions: Storage Access *\\n ************************************/\\n\\n function putContractStorage(address _contract, bytes32 _key, bytes32 _value) external;\\n function getContractStorage(address _contract, bytes32 _key) external view returns (bytes32 _value);\\n function hasContractStorage(address _contract, bytes32 _key) external view returns (bool _exists);\\n function testAndSetContractStorageLoaded(address _contract, bytes32 _key) external returns (bool _wasContractStorageAlreadyLoaded);\\n function testAndSetContractStorageChanged(address _contract, bytes32 _key) external returns (bool _wasContractStorageAlreadyChanged);\\n function commitContractStorage(address _contract, bytes32 _key) external returns (bool _wasContractStorageCommitted);\\n function incrementTotalUncommittedContractStorage() external;\\n function getTotalUncommittedContractStorage() external view returns (uint256 _total);\\n function wasContractStorageChanged(address _contract, bytes32 _key) external view returns (bool);\\n function wasContractStorageCommitted(address _contract, bytes32 _key) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x7a11dbd1f61593ba34debe07e39eef59967307f7f372ba9855bee0953585d08d\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/predeploys/iOVM_DeployerWhitelist.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title iOVM_DeployerWhitelist\\n */\\ninterface iOVM_DeployerWhitelist {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function initialize(address _owner, bool _allowArbitraryDeployment) external;\\n function getOwner() external returns (address _owner);\\n function setWhitelistedDeployer(address _deployer, bool _isWhitelisted) external;\\n function setOwner(address _newOwner) external;\\n function setAllowArbitraryDeployment(bool _allowArbitraryDeployment) external;\\n function enableArbitraryContractDeployment() external;\\n function isDeployerAllowed(address _deployer) external returns (bool _allowed);\\n}\\n\",\"keccak256\":\"0x969394371cacfc36493230150b6d629173ea72dfdf729330bede475b91d0f004\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/codec/Lib_OVMCodec.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../utils/Lib_Bytes32Utils.sol\\\";\\nimport { Lib_SafeExecutionManagerWrapper } from \\\"../../libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\\\";\\n\\n/**\\n * @title Lib_OVMCodec\\n */\\nlibrary Lib_OVMCodec {\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum EOASignatureType {\\n EIP155_TRANSACTION,\\n ETH_SIGNED_MESSAGE\\n }\\n\\n enum QueueOrigin {\\n SEQUENCER_QUEUE,\\n L1TOL2_QUEUE\\n }\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Account {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n address ethAddress;\\n bool isFresh;\\n }\\n\\n struct EVMAccount {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n }\\n\\n struct ChainBatchHeader {\\n uint256 batchIndex;\\n bytes32 batchRoot;\\n uint256 batchSize;\\n uint256 prevTotalElements;\\n bytes extraData;\\n }\\n\\n struct ChainInclusionProof {\\n uint256 index;\\n bytes32[] siblings;\\n }\\n\\n struct Transaction {\\n uint256 timestamp;\\n uint256 blockNumber;\\n QueueOrigin l1QueueOrigin;\\n address l1TxOrigin;\\n address entrypoint;\\n uint256 gasLimit;\\n bytes data;\\n }\\n\\n struct TransactionChainElement {\\n bool isSequenced;\\n uint256 queueIndex; // QUEUED TX ONLY\\n uint256 timestamp; // SEQUENCER TX ONLY\\n uint256 blockNumber; // SEQUENCER TX ONLY\\n bytes txData; // SEQUENCER TX ONLY\\n }\\n\\n struct QueueElement {\\n bytes32 transactionHash;\\n uint40 timestamp;\\n uint40 blockNumber;\\n }\\n\\n struct EIP155Transaction {\\n uint256 nonce;\\n uint256 gasPrice;\\n uint256 gasLimit;\\n address to;\\n uint256 value;\\n bytes data;\\n uint256 chainId;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Decodes an EOA transaction (i.e., native Ethereum RLP encoding).\\n * @param _transaction Encoded EOA transaction.\\n * @return Transaction decoded into a struct.\\n */\\n function decodeEIP155Transaction(\\n bytes memory _transaction,\\n bool _isEthSignedMessage\\n )\\n internal\\n pure\\n returns (\\n EIP155Transaction memory\\n )\\n {\\n if (_isEthSignedMessage) {\\n (\\n uint256 _nonce,\\n uint256 _gasLimit,\\n uint256 _gasPrice,\\n uint256 _chainId,\\n address _to,\\n bytes memory _data\\n ) = abi.decode(\\n _transaction,\\n (uint256, uint256, uint256, uint256, address ,bytes)\\n );\\n return EIP155Transaction({\\n nonce: _nonce,\\n gasPrice: _gasPrice,\\n gasLimit: _gasLimit,\\n to: _to,\\n value: 0,\\n data: _data,\\n chainId: _chainId\\n });\\n } else {\\n Lib_RLPReader.RLPItem[] memory decoded = Lib_RLPReader.readList(_transaction);\\n\\n return EIP155Transaction({\\n nonce: Lib_RLPReader.readUint256(decoded[0]),\\n gasPrice: Lib_RLPReader.readUint256(decoded[1]),\\n gasLimit: Lib_RLPReader.readUint256(decoded[2]),\\n to: Lib_RLPReader.readAddress(decoded[3]),\\n value: Lib_RLPReader.readUint256(decoded[4]),\\n data: Lib_RLPReader.readBytes(decoded[5]),\\n chainId: Lib_RLPReader.readUint256(decoded[6])\\n });\\n }\\n }\\n\\n /**\\n * Decompresses a compressed EIP155 transaction.\\n * @param _transaction Compressed EIP155 transaction bytes.\\n * @return Transaction parsed into a struct.\\n */\\n function decompressEIP155Transaction(\\n bytes memory _transaction\\n )\\n internal\\n returns (\\n EIP155Transaction memory\\n )\\n {\\n return EIP155Transaction({\\n gasLimit: Lib_BytesUtils.toUint24(_transaction, 0),\\n gasPrice: uint256(Lib_BytesUtils.toUint24(_transaction, 3)) * 1000000,\\n nonce: Lib_BytesUtils.toUint24(_transaction, 6),\\n to: Lib_BytesUtils.toAddress(_transaction, 9),\\n data: Lib_BytesUtils.slice(_transaction, 29),\\n chainId: Lib_SafeExecutionManagerWrapper.safeCHAINID(),\\n value: 0\\n });\\n }\\n\\n /**\\n * Encodes an EOA transaction back into the original transaction.\\n * @param _transaction EIP155transaction to encode.\\n * @param _isEthSignedMessage Whether or not this was an eth signed message.\\n * @return Encoded transaction.\\n */\\n function encodeEIP155Transaction(\\n EIP155Transaction memory _transaction,\\n bool _isEthSignedMessage\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n if (_isEthSignedMessage) {\\n return abi.encode(\\n _transaction.nonce,\\n _transaction.gasLimit,\\n _transaction.gasPrice,\\n _transaction.chainId,\\n _transaction.to,\\n _transaction.data\\n );\\n } else {\\n bytes[] memory raw = new bytes[](9);\\n\\n raw[0] = Lib_RLPWriter.writeUint(_transaction.nonce);\\n raw[1] = Lib_RLPWriter.writeUint(_transaction.gasPrice);\\n raw[2] = Lib_RLPWriter.writeUint(_transaction.gasLimit);\\n if (_transaction.to == address(0)) {\\n raw[3] = Lib_RLPWriter.writeBytes('');\\n } else {\\n raw[3] = Lib_RLPWriter.writeAddress(_transaction.to);\\n }\\n raw[4] = Lib_RLPWriter.writeUint(0);\\n raw[5] = Lib_RLPWriter.writeBytes(_transaction.data);\\n raw[6] = Lib_RLPWriter.writeUint(_transaction.chainId);\\n raw[7] = Lib_RLPWriter.writeBytes(bytes(''));\\n raw[8] = Lib_RLPWriter.writeBytes(bytes(''));\\n\\n return Lib_RLPWriter.writeList(raw);\\n }\\n }\\n\\n /**\\n * Encodes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Encoded transaction bytes.\\n */\\n function encodeTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return abi.encodePacked(\\n _transaction.timestamp,\\n _transaction.blockNumber,\\n _transaction.l1QueueOrigin,\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n );\\n }\\n\\n /**\\n * Hashes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Hashed transaction\\n */\\n function hashTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(encodeTransaction(_transaction));\\n }\\n\\n /**\\n * Converts an OVM account to an EVM account.\\n * @param _in OVM account to convert.\\n * @return Converted EVM account.\\n */\\n function toEVMAccount(\\n Account memory _in\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n return EVMAccount({\\n nonce: _in.nonce,\\n balance: _in.balance,\\n storageRoot: _in.storageRoot,\\n codeHash: _in.codeHash\\n });\\n }\\n\\n /**\\n * @notice RLP-encodes an account state struct.\\n * @param _account Account state struct.\\n * @return RLP-encoded account state.\\n */\\n function encodeEVMAccount(\\n EVMAccount memory _account\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes[] memory raw = new bytes[](4);\\n\\n // Unfortunately we can't create this array outright because\\n // Lib_RLPWriter.writeList will reject fixed-size arrays. Assigning\\n // index-by-index circumvents this issue.\\n raw[0] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.nonce)\\n )\\n );\\n raw[1] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.balance)\\n )\\n );\\n raw[2] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.storageRoot));\\n raw[3] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.codeHash));\\n\\n return Lib_RLPWriter.writeList(raw);\\n }\\n\\n /**\\n * @notice Decodes an RLP-encoded account state into a useful struct.\\n * @param _encoded RLP-encoded account state.\\n * @return Account state struct.\\n */\\n function decodeEVMAccount(\\n bytes memory _encoded\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\\n\\n return EVMAccount({\\n nonce: Lib_RLPReader.readUint256(accountState[0]),\\n balance: Lib_RLPReader.readUint256(accountState[1]),\\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\\n });\\n }\\n\\n /**\\n * Calculates a hash for a given batch header.\\n * @param _batchHeader Header to hash.\\n * @return Hash of the header.\\n */\\n function hashBatchHeader(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(\\n abi.encode(\\n _batchHeader.batchRoot,\\n _batchHeader.batchSize,\\n _batchHeader.prevTotalElements,\\n _batchHeader.extraData\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0xe7e518ba7bba3fa28c532f8902576c1bb4dfc1ec4b62bed6da50623248ba17c3\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Contract Imports */\\nimport { Ownable } from \\\"./Lib_Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n public\\n onlyOwner\\n {\\n addresses[_getNameHash(_name)] = _address;\\n\\n emit AddressSet(\\n _name,\\n _address\\n );\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0x36473d229ce0ba9d1cac5f02f84be843d9dcc8008525590a1652a2c2636f95f2\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(\\n address _libAddressManager\\n ) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x65981feeabff6a81783ea97d44baf988a18a86c8cb374c46fdb71819cbacc7c0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Ownable\\n * @dev Adapted from https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol\\n */\\nabstract contract Ownable {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n address public owner;\\n\\n\\n /**********\\n * Events *\\n **********/\\n\\n event OwnershipTransferred(\\n address indexed previousOwner,\\n address indexed newOwner\\n );\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n constructor() {\\n owner = msg.sender;\\n emit OwnershipTransferred(address(0), owner);\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n owner == msg.sender,\\n \\\"Ownable: caller is not the owner\\\"\\n );\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the owner of this contract to the zero address, effectively renouncing ownership\\n * completely. Can only be called by the current owner of this contract.\\n */\\n function renounceOwnership()\\n public\\n virtual\\n onlyOwner\\n {\\n emit OwnershipTransferred(owner, address(0));\\n owner = address(0);\\n }\\n\\n /**\\n * Transfers ownership of this contract to a new address. Can only be called by the current\\n * owner of this contract.\\n * @param _newOwner Address of the new contract owner.\\n */\\n function transferOwnership(\\n address _newOwner\\n )\\n public\\n virtual\\n onlyOwner\\n {\\n require(\\n _newOwner != address(0),\\n \\\"Ownable: new owner cannot be the zero address\\\"\\n );\\n\\n emit OwnershipTransferred(owner, _newOwner);\\n owner = _newOwner;\\n }\\n}\\n\",\"keccak256\":\"0x83f9a6c4608b5929086429205b00f8211cdfcba83f3c84520f24d8aa64fe4b82\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPReader.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_RLPReader\\n * @dev Adapted from \\\"RLPReader\\\" by Hamdi Allam (hamdi.allam97@gmail.com).\\n */\\nlibrary Lib_RLPReader {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 constant internal MAX_LIST_LENGTH = 32;\\n\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum RLPItemType {\\n DATA_ITEM,\\n LIST_ITEM\\n }\\n\\n \\n /***********\\n * Structs *\\n ***********/\\n\\n struct RLPItem {\\n uint256 length;\\n uint256 ptr;\\n }\\n \\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n \\n /**\\n * Converts bytes to a reference to memory position and length.\\n * @param _in Input bytes to convert.\\n * @return Output memory reference.\\n */\\n function toRLPItem(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem memory\\n )\\n {\\n uint256 ptr;\\n assembly {\\n ptr := add(_in, 32)\\n }\\n\\n return RLPItem({\\n length: _in.length,\\n ptr: ptr\\n });\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n (\\n uint256 listOffset,\\n ,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.LIST_ITEM,\\n \\\"Invalid RLP list value.\\\"\\n );\\n\\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\\n // writing to the length. Since we can't know the number of RLP items without looping over\\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\\n // simply set a reasonable maximum list length and decrease the size before we finish.\\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\\n\\n uint256 itemCount = 0;\\n uint256 offset = listOffset;\\n while (offset < _in.length) {\\n require(\\n itemCount < MAX_LIST_LENGTH,\\n \\\"Provided RLP list exceeds max list length.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n ) = _decodeLength(RLPItem({\\n length: _in.length - offset,\\n ptr: _in.ptr + offset\\n }));\\n\\n out[itemCount] = RLPItem({\\n length: itemLength + itemOffset,\\n ptr: _in.ptr + offset\\n });\\n\\n itemCount += 1;\\n offset += itemOffset + itemLength;\\n }\\n\\n // Decrease the array size to match the actual item count.\\n assembly {\\n mstore(out, itemCount)\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n return readList(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes value.\\\"\\n );\\n\\n return _copy(_in.ptr, itemOffset, itemLength);\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return readBytes(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return string(readBytes(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return readString(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n require(\\n _in.length <= 33,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr + itemOffset;\\n bytes32 out;\\n assembly {\\n out := mload(ptr)\\n\\n // Shift the bytes over to match the item size.\\n if lt(itemLength, 32) {\\n out := div(out, exp(256, sub(32, itemLength)))\\n }\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return readBytes32(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return uint256(readBytes32(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return readUint256(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n require(\\n _in.length == 1,\\n \\\"Invalid RLP boolean value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 out;\\n assembly {\\n out := byte(0, mload(ptr))\\n }\\n\\n require(\\n out == 0 || out == 1,\\n \\\"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\\\"\\n );\\n\\n return out != 0;\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return readBool(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n if (_in.length == 1) {\\n return address(0);\\n }\\n\\n require(\\n _in.length == 21,\\n \\\"Invalid RLP address value.\\\"\\n );\\n\\n return address(readUint256(_in));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return readAddress(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads the raw bytes of an RLP item.\\n * @param _in RLP item to read.\\n * @return Raw RLP bytes.\\n */\\n function readRawBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in);\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Decodes the length of an RLP item.\\n * @param _in RLP item to decode.\\n * @return Offset of the encoded data.\\n * @return Length of the encoded data.\\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\\n */\\n function _decodeLength(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n uint256,\\n uint256,\\n RLPItemType\\n )\\n {\\n require(\\n _in.length > 0,\\n \\\"RLP item cannot be null.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 prefix;\\n assembly {\\n prefix := byte(0, mload(ptr))\\n }\\n\\n if (prefix <= 0x7f) {\\n // Single byte.\\n\\n return (0, 1, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xb7) {\\n // Short string.\\n\\n uint256 strLen = prefix - 0x80;\\n \\n require(\\n _in.length > strLen,\\n \\\"Invalid RLP short string.\\\"\\n );\\n\\n return (1, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xbf) {\\n // Long string.\\n uint256 lenOfStrLen = prefix - 0xb7;\\n\\n require(\\n _in.length > lenOfStrLen,\\n \\\"Invalid RLP long string length.\\\"\\n );\\n\\n uint256 strLen;\\n assembly {\\n // Pick out the string length.\\n strLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfStrLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfStrLen + strLen,\\n \\\"Invalid RLP long string.\\\"\\n );\\n\\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xf7) {\\n // Short list.\\n uint256 listLen = prefix - 0xc0;\\n\\n require(\\n _in.length > listLen,\\n \\\"Invalid RLP short list.\\\"\\n );\\n\\n return (1, listLen, RLPItemType.LIST_ITEM);\\n } else {\\n // Long list.\\n uint256 lenOfListLen = prefix - 0xf7;\\n\\n require(\\n _in.length > lenOfListLen,\\n \\\"Invalid RLP long list length.\\\"\\n );\\n\\n uint256 listLen;\\n assembly {\\n // Pick out the list length.\\n listLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfListLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfListLen + listLen,\\n \\\"Invalid RLP long list.\\\"\\n );\\n\\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\\n }\\n }\\n\\n /**\\n * Copies the bytes from a memory location.\\n * @param _src Pointer to the location to read from.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Copied bytes.\\n */\\n function _copy(\\n uint256 _src,\\n uint256 _offset,\\n uint256 _length\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out = new bytes(_length);\\n if (out.length == 0) {\\n return out;\\n }\\n\\n uint256 src = _src + _offset;\\n uint256 dest;\\n assembly {\\n dest := add(out, 32)\\n }\\n\\n // Copy over as many complete words as we can.\\n for (uint256 i = 0; i < _length / 32; i++) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n\\n src += 32;\\n dest += 32;\\n }\\n\\n // Pick out the remaining bytes.\\n uint256 mask = 256 ** (32 - (_length % 32)) - 1;\\n assembly {\\n mstore(\\n dest,\\n or(\\n and(mload(src), not(mask)),\\n and(mload(dest), mask)\\n )\\n )\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Copies an RLP item into bytes.\\n * @param _in RLP item to copy.\\n * @return Copied bytes.\\n */\\n function _copy(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in.ptr, 0, _in.length);\\n }\\n}\\n\",\"keccak256\":\"0xbdb8fae0ca2483b4cc07607a5070fc25e33c54b4e4462b99e7c0b13aac48a09b\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPWriter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\n\\n/**\\n * @title Lib_RLPWriter\\n * @author Bakaoh (with modifications)\\n */\\nlibrary Lib_RLPWriter {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * RLP encodes a byte string.\\n * @param _in The byte string to encode.\\n * @return _out The RLP encoded string in bytes.\\n */\\n function writeBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n bytes memory encoded;\\n\\n if (_in.length == 1 && uint8(_in[0]) < 128) {\\n encoded = _in;\\n } else {\\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * RLP encodes a list of RLP encoded byte byte strings.\\n * @param _in The list of RLP encoded byte strings.\\n * @return _out The RLP encoded list of items in bytes.\\n */\\n function writeList(\\n bytes[] memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n bytes memory list = _flatten(_in);\\n return abi.encodePacked(_writeLength(list.length, 192), list);\\n }\\n\\n /**\\n * RLP encodes a string.\\n * @param _in The string to encode.\\n * @return _out The RLP encoded string in bytes.\\n */\\n function writeString(\\n string memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(bytes(_in));\\n }\\n\\n /**\\n * RLP encodes an address.\\n * @param _in The address to encode.\\n * @return _out The RLP encoded address in bytes.\\n */\\n function writeAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a uint.\\n * @param _in The uint256 to encode.\\n * @return _out The RLP encoded uint256 in bytes.\\n */\\n function writeUint(\\n uint256 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(_toBinary(_in));\\n }\\n\\n /**\\n * RLP encodes a bool.\\n * @param _in The bool to encode.\\n * @return _out The RLP encoded bool in bytes.\\n */\\n function writeBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n bytes memory encoded = new bytes(1);\\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\\n return encoded;\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\\n * @param _len The length of the string or the payload.\\n * @param _offset 128 if item is string, 192 if item is list.\\n * @return _encoded RLP encoded bytes.\\n */\\n function _writeLength(\\n uint256 _len,\\n uint256 _offset\\n )\\n private\\n pure\\n returns (\\n bytes memory _encoded\\n )\\n {\\n bytes memory encoded;\\n\\n if (_len < 56) {\\n encoded = new bytes(1);\\n encoded[0] = byte(uint8(_len) + uint8(_offset));\\n } else {\\n uint256 lenLen;\\n uint256 i = 1;\\n while (_len / i != 0) {\\n lenLen++;\\n i *= 256;\\n }\\n\\n encoded = new bytes(lenLen + 1);\\n encoded[0] = byte(uint8(lenLen) + uint8(_offset) + 55);\\n for(i = 1; i <= lenLen; i++) {\\n encoded[i] = byte(uint8((_len / (256**(lenLen-i))) % 256));\\n }\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * Encode integer in big endian binary form with no leading zeroes.\\n * @notice TODO: This should be optimized with assembly to save gas costs.\\n * @param _x The integer to encode.\\n * @return _binary RLP encoded bytes.\\n */\\n function _toBinary(\\n uint256 _x\\n )\\n private\\n pure\\n returns (\\n bytes memory _binary\\n )\\n {\\n bytes memory b = abi.encodePacked(_x);\\n\\n uint256 i = 0;\\n for (; i < 32; i++) {\\n if (b[i] != 0) {\\n break;\\n }\\n }\\n\\n bytes memory res = new bytes(32 - i);\\n for (uint256 j = 0; j < res.length; j++) {\\n res[j] = b[i++];\\n }\\n\\n return res;\\n }\\n\\n /**\\n * Copies a piece of memory to another location.\\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\\n * @param _dest Destination location.\\n * @param _src Source location.\\n * @param _len Length of memory to copy.\\n */\\n function _memcpy(\\n uint256 _dest,\\n uint256 _src,\\n uint256 _len\\n )\\n private\\n pure\\n {\\n uint256 dest = _dest;\\n uint256 src = _src;\\n uint256 len = _len;\\n\\n for(; len >= 32; len -= 32) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n dest += 32;\\n src += 32;\\n }\\n\\n uint256 mask = 256 ** (32 - len) - 1;\\n assembly {\\n let srcpart := and(mload(src), not(mask))\\n let destpart := and(mload(dest), mask)\\n mstore(dest, or(destpart, srcpart))\\n }\\n }\\n\\n /**\\n * Flattens a list of byte strings into one byte string.\\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\\n * @param _list List of byte strings to flatten.\\n * @return _flattened The flattened byte string.\\n */\\n function _flatten(\\n bytes[] memory _list\\n )\\n private\\n pure\\n returns (\\n bytes memory _flattened\\n )\\n {\\n if (_list.length == 0) {\\n return new bytes(0);\\n }\\n\\n uint256 len;\\n uint256 i = 0;\\n for (; i < _list.length; i++) {\\n len += _list[i].length;\\n }\\n\\n bytes memory flattened = new bytes(len);\\n uint256 flattenedPtr;\\n assembly { flattenedPtr := add(flattened, 0x20) }\\n\\n for(i = 0; i < _list.length; i++) {\\n bytes memory item = _list[i];\\n\\n uint256 listPtr;\\n assembly { listPtr := add(item, 0x20)}\\n\\n _memcpy(flattenedPtr, listPtr, item.length);\\n flattenedPtr += _list[i].length;\\n }\\n\\n return flattened;\\n }\\n}\",\"keccak256\":\"0xbcb24619c1758cb0d9f3fe5c79495950045a9087046a02b9ce01df46ae09ae5b\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_Bytes32Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_Byte32Utils\\n */\\nlibrary Lib_Bytes32Utils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \\\"true.\\\"\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as a boolean.\\n */\\n function toBool(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return _in != 0;\\n }\\n\\n /**\\n * Converts a boolean to a bytes32 value.\\n * @param _in Input boolean value.\\n * @return Boolean as a bytes32.\\n */\\n function fromBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in ? 1 : 0));\\n }\\n\\n /**\\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as an address.\\n */\\n function toAddress(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return address(uint160(uint256(_in)));\\n }\\n\\n /**\\n * Converts an address to a bytes32.\\n * @param _in Input address value.\\n * @return Address as a bytes32.\\n */\\n function fromAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in));\\n }\\n\\n /**\\n * Removes the leading zeros from a bytes32 value and returns a new (smaller) bytes value.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 without any leading zeros.\\n */\\n function removeLeadingZeros(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out;\\n\\n assembly {\\n // Figure out how many leading zero bytes to remove.\\n let shift := 0\\n for { let i := 0 } and(lt(i, 32), eq(byte(i, _in), 0)) { i := add(i, 1) } {\\n shift := add(shift, 1)\\n }\\n\\n // Reserve some space for our output and fix the free memory pointer.\\n out := mload(0x40)\\n mstore(0x40, add(out, 0x40))\\n\\n // Shift the value and store it into the output bytes.\\n mstore(add(out, 0x20), shl(mul(shift, 8), _in))\\n\\n // Store the new size (with leading zero bytes removed) in the output byte size.\\n mstore(out, sub(32, shift))\\n }\\n\\n return out;\\n }\\n}\\n\",\"keccak256\":\"0xfa2def593e3fc56a31852c3744aefdaa93cec74e721bfcfeb1e5d166c7c60b64\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_BytesUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_BytesUtils\\n */\\nlibrary Lib_BytesUtils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_start + _length >= _start, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n if (_bytes.length - _start == 0) {\\n return bytes('');\\n }\\n\\n return slice(_bytes, _start, _bytes.length - _start);\\n }\\n\\n function toBytes32PadLeft(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes32)\\n {\\n bytes32 ret;\\n uint256 len = _bytes.length <= 32 ? _bytes.length : 32;\\n assembly {\\n ret := shr(mul(sub(32, len), 8), mload(add(_bytes, 32)))\\n }\\n return ret;\\n }\\n\\n function toBytes32(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes32)\\n {\\n if (_bytes.length < 32) {\\n bytes32 ret;\\n assembly {\\n ret := mload(add(_bytes, 32))\\n }\\n return ret;\\n }\\n\\n return abi.decode(_bytes,(bytes32)); // will truncate if input length > 32 bytes\\n }\\n\\n function toUint256(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (uint256)\\n {\\n return uint256(toBytes32(_bytes));\\n }\\n\\n function toUint24(bytes memory _bytes, uint256 _start) internal pure returns (uint24) {\\n require(_start + 3 >= _start, \\\"toUint24_overflow\\\");\\n require(_bytes.length >= _start + 3 , \\\"toUint24_outOfBounds\\\");\\n uint24 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x3), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toUint8(bytes memory _bytes, uint256 _start) internal pure returns (uint8) {\\n require(_start + 1 >= _start, \\\"toUint8_overflow\\\");\\n require(_bytes.length >= _start + 1 , \\\"toUint8_outOfBounds\\\");\\n uint8 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x1), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toAddress(bytes memory _bytes, uint256 _start) internal pure returns (address) {\\n require(_start + 20 >= _start, \\\"toAddress_overflow\\\");\\n require(_bytes.length >= _start + 20, \\\"toAddress_outOfBounds\\\");\\n address tempAddress;\\n\\n assembly {\\n tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000)\\n }\\n\\n return tempAddress;\\n }\\n\\n function toNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n bytes memory nibbles = new bytes(_bytes.length * 2);\\n\\n for (uint256 i = 0; i < _bytes.length; i++) {\\n nibbles[i * 2] = _bytes[i] >> 4;\\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\\n }\\n\\n return nibbles;\\n }\\n\\n function fromNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n bytes memory ret = new bytes(_bytes.length / 2);\\n\\n for (uint256 i = 0; i < ret.length; i++) {\\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\\n }\\n\\n return ret;\\n }\\n\\n function equal(\\n bytes memory _bytes,\\n bytes memory _other\\n )\\n internal\\n pure\\n returns (bool)\\n {\\n return keccak256(_bytes) == keccak256(_other);\\n }\\n}\\n\",\"keccak256\":\"0x0adf22e1b22ba09911e859f64cb3b484e992be4f9fd3b09088e6225bf8d06ce0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_ECDSAUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_ECDSAUtils\\n */\\nlibrary Lib_ECDSAUtils {\\n\\n /**************************************\\n * Internal Functions: ECDSA Recovery *\\n **************************************/\\n\\n /**\\n * Recovers a signed address given a message and signature.\\n * @param _message Message that was originally signed.\\n * @param _isEthSignedMessage Whether or not the user used the `Ethereum Signed Message` prefix.\\n * @param _v Signature `v` parameter.\\n * @param _r Signature `r` parameter.\\n * @param _s Signature `s` parameter.\\n * @return _sender Signer address.\\n */\\n function recover(\\n bytes memory _message,\\n bool _isEthSignedMessage,\\n uint8 _v,\\n bytes32 _r,\\n bytes32 _s\\n )\\n internal\\n pure\\n returns (\\n address _sender\\n )\\n {\\n bytes32 messageHash = getMessageHash(_message, _isEthSignedMessage);\\n\\n return ecrecover(\\n messageHash,\\n _v + 27,\\n _r,\\n _s\\n );\\n }\\n\\n function getMessageHash(\\n bytes memory _message,\\n bool _isEthSignedMessage\\n )\\n internal\\n pure\\n returns (bytes32) {\\n if (_isEthSignedMessage) {\\n return getEthSignedMessageHash(_message);\\n }\\n return getNativeMessageHash(_message);\\n }\\n\\n\\n /*************************************\\n * Private Functions: ECDSA Recovery *\\n *************************************/\\n\\n /**\\n * Gets the native message hash (simple keccak256) for a message.\\n * @param _message Message to hash.\\n * @return _messageHash Native message hash.\\n */\\n function getNativeMessageHash(\\n bytes memory _message\\n )\\n private\\n pure\\n returns (\\n bytes32 _messageHash\\n )\\n {\\n return keccak256(_message);\\n }\\n\\n /**\\n * Gets the hash of a message with the `Ethereum Signed Message` prefix.\\n * @param _message Message to hash.\\n * @return _messageHash Prefixed message hash.\\n */\\n function getEthSignedMessageHash(\\n bytes memory _message\\n )\\n private\\n pure\\n returns (\\n bytes32 _messageHash\\n )\\n {\\n bytes memory prefix = \\\"\\\\x19Ethereum Signed Message:\\\\n32\\\";\\n bytes32 messageHash = keccak256(_message);\\n return keccak256(abi.encodePacked(prefix, messageHash));\\n }\\n}\",\"keccak256\":\"0xda865d8cc014940a4755e329db9c6272a31bd9a340000a4ecc005d46299a585c\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_ErrorUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/**\\n * @title Lib_ErrorUtils\\n */\\nlibrary Lib_ErrorUtils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Encodes an error string into raw solidity-style revert data.\\n * (i.e. ascii bytes, prefixed with bytes4(keccak(\\\"Error(string))\\\"))\\n * Ref: https://docs.soliditylang.org/en/v0.8.2/control-structures.html?highlight=Error(string)#panic-via-assert-and-error-via-require\\n * @param _reason Reason for the reversion.\\n * @return Standard solidity revert data for the given reason.\\n */\\n function encodeRevertString(\\n string memory _reason\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return abi.encodeWithSignature(\\n \\\"Error(string)\\\",\\n _reason\\n );\\n }\\n}\\n\",\"keccak256\":\"0xfc64ec4a81fb50865b502a0004ed154e8598e1a313db77303fc95e41f536e6b7\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_EthUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// @unsupported: ovm\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"./Lib_Bytes32Utils.sol\\\";\\n\\n/**\\n * @title Lib_EthUtils\\n */\\nlibrary Lib_EthUtils {\\n\\n /***********************************\\n * Internal Functions: Code Access *\\n ***********************************/\\n\\n /**\\n * Gets the code for a given address.\\n * @param _address Address to get code for.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return _code Code read from the contract.\\n */\\n function getCode(\\n address _address,\\n uint256 _offset,\\n uint256 _length\\n )\\n internal\\n view\\n returns (\\n bytes memory _code\\n )\\n {\\n assembly {\\n _code := mload(0x40)\\n mstore(0x40, add(_code, add(_length, 0x20)))\\n mstore(_code, _length)\\n extcodecopy(_address, add(_code, 0x20), _offset, _length)\\n }\\n\\n return _code;\\n }\\n\\n /**\\n * Gets the full code for a given address.\\n * @param _address Address to get code for.\\n * @return _code Full code of the contract.\\n */\\n function getCode(\\n address _address\\n )\\n internal\\n view\\n returns (\\n bytes memory _code\\n )\\n {\\n return getCode(\\n _address,\\n 0,\\n getCodeSize(_address)\\n );\\n }\\n\\n /**\\n * Gets the size of a contract's code in bytes.\\n * @param _address Address to get code size for.\\n * @return _codeSize Size of the contract's code in bytes.\\n */\\n function getCodeSize(\\n address _address\\n )\\n internal\\n view\\n returns (\\n uint256 _codeSize\\n )\\n {\\n assembly {\\n _codeSize := extcodesize(_address)\\n }\\n\\n return _codeSize;\\n }\\n\\n /**\\n * Gets the hash of a contract's code.\\n * @param _address Address to get a code hash for.\\n * @return _codeHash Hash of the contract's code.\\n */\\n function getCodeHash(\\n address _address\\n )\\n internal\\n view\\n returns (\\n bytes32 _codeHash\\n )\\n {\\n assembly {\\n _codeHash := extcodehash(_address)\\n }\\n\\n return _codeHash;\\n }\\n\\n\\n /*****************************************\\n * Internal Functions: Contract Creation *\\n *****************************************/\\n\\n /**\\n * Creates a contract with some given initialization code.\\n * @param _code Contract initialization code.\\n * @return _created Address of the created contract.\\n */\\n function createContract(\\n bytes memory _code\\n )\\n internal\\n returns (\\n address _created\\n )\\n {\\n assembly {\\n _created := create(\\n 0,\\n add(_code, 0x20),\\n mload(_code)\\n )\\n }\\n\\n return _created;\\n }\\n\\n /**\\n * Computes the address that would be generated by CREATE.\\n * @param _creator Address creating the contract.\\n * @param _nonce Creator's nonce.\\n * @return _address Address to be generated by CREATE.\\n */\\n function getAddressForCREATE(\\n address _creator,\\n uint256 _nonce\\n )\\n internal\\n pure\\n returns (\\n address _address\\n )\\n {\\n bytes[] memory encoded = new bytes[](2);\\n encoded[0] = Lib_RLPWriter.writeAddress(_creator);\\n encoded[1] = Lib_RLPWriter.writeUint(_nonce);\\n\\n bytes memory encodedList = Lib_RLPWriter.writeList(encoded);\\n return Lib_Bytes32Utils.toAddress(keccak256(encodedList));\\n }\\n\\n /**\\n * Computes the address that would be generated by CREATE2.\\n * @param _creator Address creating the contract.\\n * @param _bytecode Bytecode of the contract to be created.\\n * @param _salt 32 byte salt value mixed into the hash.\\n * @return _address Address to be generated by CREATE2.\\n */\\n function getAddressForCREATE2(\\n address _creator,\\n bytes memory _bytecode,\\n bytes32 _salt\\n )\\n internal\\n pure\\n returns (address _address)\\n {\\n bytes32 hashedData = keccak256(abi.encodePacked(\\n byte(0xff),\\n _creator,\\n _salt,\\n keccak256(_bytecode)\\n ));\\n\\n return Lib_Bytes32Utils.toAddress(hashedData);\\n }\\n}\\n\",\"keccak256\":\"0x5fdf009da11f90cb5e99e5cd160d07bb744a5a2055774a646bdf277ad6910595\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_ErrorUtils } from \\\"../utils/Lib_ErrorUtils.sol\\\";\\n\\n/**\\n * @title Lib_SafeExecutionManagerWrapper\\n * @dev The Safe Execution Manager Wrapper provides functions which facilitate writing OVM safe \\n * code using the standard solidity compiler, by routing all its operations through the Execution \\n * Manager.\\n * \\n * Compiler used: solc\\n * Runtime target: OVM\\n */\\nlibrary Lib_SafeExecutionManagerWrapper {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Performs a safe ovmCALL.\\n * @param _gasLimit Gas limit for the call.\\n * @param _target Address to call.\\n * @param _calldata Data to send to the call.\\n * @return _success Whether or not the call reverted.\\n * @return _returndata Data returned by the call.\\n */\\n function safeCALL(\\n uint256 _gasLimit,\\n address _target,\\n bytes memory _calldata\\n )\\n internal\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCALL(uint256,address,bytes)\\\",\\n _gasLimit,\\n _target,\\n _calldata\\n )\\n );\\n\\n return abi.decode(returndata, (bool, bytes));\\n }\\n\\n /**\\n * Performs a safe ovmDELEGATECALL.\\n * @param _gasLimit Gas limit for the call.\\n * @param _target Address to call.\\n * @param _calldata Data to send to the call.\\n * @return _success Whether or not the call reverted.\\n * @return _returndata Data returned by the call.\\n */\\n function safeDELEGATECALL(\\n uint256 _gasLimit,\\n address _target,\\n bytes memory _calldata\\n )\\n internal\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmDELEGATECALL(uint256,address,bytes)\\\",\\n _gasLimit,\\n _target,\\n _calldata\\n )\\n );\\n\\n return abi.decode(returndata, (bool, bytes));\\n }\\n\\n /**\\n * Performs a safe ovmCREATE call.\\n * @param _gasLimit Gas limit for the creation.\\n * @param _bytecode Code for the new contract.\\n * @return _contract Address of the created contract.\\n */\\n function safeCREATE(\\n uint256 _gasLimit,\\n bytes memory _bytecode\\n )\\n internal\\n returns (\\n address,\\n bytes memory\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n _gasLimit,\\n abi.encodeWithSignature(\\n \\\"ovmCREATE(bytes)\\\",\\n _bytecode\\n )\\n );\\n\\n return abi.decode(returndata, (address, bytes));\\n }\\n\\n /**\\n * Performs a safe ovmEXTCODESIZE call.\\n * @param _contract Address of the contract to query the size of.\\n * @return _EXTCODESIZE Size of the requested contract in bytes.\\n */\\n function safeEXTCODESIZE(\\n address _contract\\n )\\n internal\\n returns (\\n uint256 _EXTCODESIZE\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmEXTCODESIZE(address)\\\",\\n _contract\\n )\\n );\\n\\n return abi.decode(returndata, (uint256));\\n }\\n\\n /**\\n * Performs a safe ovmCHAINID call.\\n * @return _CHAINID Result of calling ovmCHAINID.\\n */\\n function safeCHAINID()\\n internal\\n returns (\\n uint256 _CHAINID\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCHAINID()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (uint256));\\n }\\n\\n /**\\n * Performs a safe ovmCALLER call.\\n * @return _CALLER Result of calling ovmCALLER.\\n */\\n function safeCALLER()\\n internal\\n returns (\\n address _CALLER\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCALLER()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (address));\\n }\\n\\n /**\\n * Performs a safe ovmADDRESS call.\\n * @return _ADDRESS Result of calling ovmADDRESS.\\n */\\n function safeADDRESS()\\n internal\\n returns (\\n address _ADDRESS\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmADDRESS()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (address));\\n }\\n\\n /**\\n * Performs a safe ovmGETNONCE call.\\n * @return _nonce Result of calling ovmGETNONCE.\\n */\\n function safeGETNONCE()\\n internal\\n returns (\\n uint256 _nonce\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmGETNONCE()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (uint256));\\n }\\n\\n /**\\n * Performs a safe ovmINCREMENTNONCE call.\\n */\\n function safeINCREMENTNONCE()\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmINCREMENTNONCE()\\\"\\n )\\n );\\n }\\n\\n /**\\n * Performs a safe ovmCREATEEOA call.\\n * @param _messageHash Message hash which was signed by EOA\\n * @param _v v value of signature (0 or 1)\\n * @param _r r value of signature\\n * @param _s s value of signature\\n */\\n function safeCREATEEOA(\\n bytes32 _messageHash,\\n uint8 _v,\\n bytes32 _r,\\n bytes32 _s\\n )\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCREATEEOA(bytes32,uint8,bytes32,bytes32)\\\",\\n _messageHash,\\n _v,\\n _r,\\n _s\\n )\\n );\\n }\\n\\n /**\\n * Performs a safe REVERT.\\n * @param _reason String revert reason to pass along with the REVERT.\\n */\\n function safeREVERT(\\n string memory _reason\\n )\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmREVERT(bytes)\\\",\\n Lib_ErrorUtils.encodeRevertString(\\n _reason\\n )\\n )\\n );\\n }\\n\\n /**\\n * Performs a safe \\\"require\\\".\\n * @param _condition Boolean condition that must be true or will revert.\\n * @param _reason String revert reason to pass along with the REVERT.\\n */\\n function safeREQUIRE(\\n bool _condition,\\n string memory _reason\\n )\\n internal\\n {\\n if (!_condition) {\\n safeREVERT(\\n _reason\\n );\\n }\\n }\\n\\n /**\\n * Performs a safe ovmSLOAD call.\\n */\\n function safeSLOAD(\\n bytes32 _key\\n )\\n internal\\n returns (\\n bytes32\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmSLOAD(bytes32)\\\",\\n _key\\n )\\n );\\n\\n return abi.decode(returndata, (bytes32));\\n }\\n\\n /**\\n * Performs a safe ovmSSTORE call.\\n */\\n function safeSSTORE(\\n bytes32 _key,\\n bytes32 _value\\n )\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmSSTORE(bytes32,bytes32)\\\",\\n _key,\\n _value\\n )\\n );\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Performs an ovm interaction and the necessary safety checks.\\n * @param _gasLimit Gas limit for the interaction.\\n * @param _calldata Data to send to the OVM_ExecutionManager (encoded with sighash).\\n * @return _returndata Data sent back by the OVM_ExecutionManager.\\n */\\n function _safeExecutionManagerInteraction(\\n uint256 _gasLimit,\\n bytes memory _calldata\\n )\\n private\\n returns (\\n bytes memory _returndata\\n )\\n {\\n address ovmExecutionManager = msg.sender;\\n (\\n bool success,\\n bytes memory returndata\\n ) = ovmExecutionManager.call{gas: _gasLimit}(_calldata);\\n\\n if (success == false) {\\n assembly {\\n revert(add(returndata, 0x20), mload(returndata))\\n }\\n } else if (returndata.length == 1) {\\n assembly {\\n return(0, 1)\\n }\\n } else {\\n return returndata;\\n }\\n }\\n\\n function _safeExecutionManagerInteraction(\\n bytes memory _calldata\\n )\\n private\\n returns (\\n bytes memory _returndata\\n )\\n {\\n return _safeExecutionManagerInteraction(\\n gasleft(),\\n _calldata\\n );\\n }\\n}\\n\",\"keccak256\":\"0x41e146e7912af794a17cd43c5a276674be956bfa8f3ca5b451bcb82d81e6f492\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/wrappers/Lib_SafeMathWrapper.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// Pulled from @openzeppelin/contracts/math/SafeMath.sol\\n// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_SafeExecutionManagerWrapper } from \\\"./Lib_SafeExecutionManagerWrapper.sol\\\";\\n\\n/**\\n * @title Lib_SafeMathWrapper\\n */\\n\\n/**\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\n * checks.\\n *\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\n * in bugs, because programmers usually assume that an overflow raises an\\n * error, which is the standard behavior in high level programming languages.\\n * `SafeMath` restores this intuition by reverting the transaction when an\\n * operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n */\\n\\nlibrary Lib_SafeMathWrapper {\\n /**\\n * @dev Returns the addition of two unsigned integers, reverting on\\n * overflow.\\n *\\n * Counterpart to Solidity's `+` operator.\\n *\\n * Requirements:\\n *\\n * - Addition cannot overflow.\\n */\\n function add(uint256 a, uint256 b) internal returns (uint256) {\\n uint256 c = a + b;\\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(c >= a, \\\"Lib_SafeMathWrapper: addition overflow\\\");\\n\\n return c;\\n }\\n\\n /**\\n * @dev Returns the subtraction of two unsigned integers, reverting on\\n * overflow (when the result is negative).\\n *\\n * Counterpart to Solidity's `-` operator.\\n *\\n * Requirements:\\n *\\n * - Subtraction cannot overflow.\\n */\\n function sub(uint256 a, uint256 b) internal returns (uint256) {\\n return sub(a, b, \\\"Lib_SafeMathWrapper: subtraction overflow\\\");\\n }\\n\\n /**\\n * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\n * overflow (when the result is negative).\\n *\\n * Counterpart to Solidity's `-` operator.\\n *\\n * Requirements:\\n *\\n * - Subtraction cannot overflow.\\n */\\n function sub(uint256 a, uint256 b, string memory errorMessage) internal returns (uint256) {\\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(b <= a, errorMessage);\\n uint256 c = a - b;\\n\\n return c;\\n }\\n\\n /**\\n * @dev Returns the multiplication of two unsigned integers, reverting on\\n * overflow.\\n *\\n * Counterpart to Solidity's `*` operator.\\n *\\n * Requirements:\\n *\\n * - Multiplication cannot overflow.\\n */\\n function mul(uint256 a, uint256 b) internal returns (uint256) {\\n // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\n // benefit is lost if 'b' is also tested.\\n // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\n if (a == 0) {\\n return 0;\\n }\\n\\n uint256 c = a * b;\\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(c / a == b, \\\"Lib_SafeMathWrapper: multiplication overflow\\\");\\n\\n return c;\\n }\\n\\n /**\\n * @dev Returns the integer division of two unsigned integers. Reverts on\\n * division by zero. The result is rounded towards zero.\\n *\\n * Counterpart to Solidity's `/` operator. Note: this function uses a\\n * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n * uses an invalid opcode to revert (consuming all remaining gas).\\n *\\n * Requirements:\\n *\\n * - The divisor cannot be zero.\\n */\\n function div(uint256 a, uint256 b) internal returns (uint256) {\\n return div(a, b, \\\"Lib_SafeMathWrapper: division by zero\\\");\\n }\\n\\n /**\\n * @dev Returns the integer division of two unsigned integers. Reverts with custom message on\\n * division by zero. The result is rounded towards zero.\\n *\\n * Counterpart to Solidity's `/` operator. Note: this function uses a\\n * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n * uses an invalid opcode to revert (consuming all remaining gas).\\n *\\n * Requirements:\\n *\\n * - The divisor cannot be zero.\\n */\\n function div(uint256 a, uint256 b, string memory errorMessage) internal returns (uint256) {\\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(b > 0, errorMessage);\\n uint256 c = a / b;\\n // assert(a == b * c + a % b); // There is no case in which this doesn't hold\\n\\n return c;\\n }\\n\\n /**\\n * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n * Reverts when dividing by zero.\\n *\\n * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n * opcode (which leaves remaining gas untouched) while Solidity uses an\\n * invalid opcode to revert (consuming all remaining gas).\\n *\\n * Requirements:\\n *\\n * - The divisor cannot be zero.\\n */\\n function mod(uint256 a, uint256 b) internal returns (uint256) {\\n return mod(a, b, \\\"Lib_SafeMathWrapper: modulo by zero\\\");\\n }\\n\\n /**\\n * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n * Reverts with custom message when dividing by zero.\\n *\\n * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n * opcode (which leaves remaining gas untouched) while Solidity uses an\\n * invalid opcode to revert (consuming all remaining gas).\\n *\\n * Requirements:\\n *\\n * - The divisor cannot be zero.\\n */\\n function mod(uint256 a, uint256 b, string memory errorMessage) internal returns (uint256) {\\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(b != 0, errorMessage);\\n return a % b;\\n }\\n}\",\"keccak256\":\"0xc58aa064894677f65fc8205f79252d15e59a0f5e2794e5c2d069c7b2bc97a9e2\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x60806040523480156200001157600080fd5b5060405162003d3138038062003d31833981016040819052620000349162000292565b600080546001600160a01b0319166001600160a01b03851617905560408051808201909152601181527027ab26afa9b0b332ba3ca1b432b1b5b2b960791b60208201526200008290620000d7565b600180546001600160a01b0319166001600160a01b039290921691909117905581516003556020820151600455604082015160055560608201516006558051600755620000ce620001b9565b50505062000337565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b83811015620001395781810151838201526020016200011f565b50505050905090810190601f168015620001675780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b1580156200018557600080fd5b505afa1580156200019a573d6000803e3d6000fd5b505050506040513d6020811015620001b157600080fd5b505192915050565b600d80546001600160a01b031990811673defa017defa017defa017defa017defa017defa09081179092557fdefa017defa017defa017defa017defa017defa017defa017defa017defa017d6009819055600a819055600b819055600c8190556008805460ff191690556010819055600e8054831684179055600f8054831690931760ff60a01b1916909255601191909155600280549091169055565b60006020828403121562000268578081fd5b604051602081016001600160401b03811182821017156200028557fe5b6040529151825250919050565b600080600083850360c0811215620002a8578384fd5b84516001600160a01b0381168114620002bf578485fd5b93506080601f1982011215620002d3578283fd5b50604051608081016001600160401b0381118282101715620002f157fe5b806040525060208501518152604085015160208201526060850151604082015260808501516060820152809250506200032e8560a0860162000256565b90509250925092565b6139ea80620003476000396000f3fe60806040523480156200001157600080fd5b5060043610620001f05760003560e01c80637cebbe94116200011157806399ccd98b11620000a5578063bdbf8c36116200007b578063bdbf8c361462000402578063c1fb2ea2146200040c578063fcb6829b1462000416578063ffe73914146200042d57620001f0565b806399ccd98b14620003ca5780639be3ad6714620003e15780639dc9dc9314620003f857620001f0565b806385979f7611620000e757806385979f7614620003885780638bb42e15146200039f5780639058025614620003b6578063996d79a514620003c057620001f0565b80637cebbe9414620003405780638435035b146200034a5780638540661f146200036157620001f0565b8063299ca47811620001895780635a98c361116200015f5780635a98c36114620002ef5780637350906414620002f9578063741a33eb1462000303578063746c32f1146200031a57620001f0565b8063299ca47814620002a85780632a2a7adb14620002c1578063461a447814620002d857620001f0565b80631c4712a711620001cb5780631c4712a7146200026457806320160f3a146200026e57806322bd64c0146200027857806324749d5c146200029157620001f0565b806303daa95914620001f5578063101185a4146200022457806314aa2ff7146200023d575b600080fd5b6200020c620002063660046200287b565b62000444565b6040516200021b919062002cd8565b60405180910390f35b6200022e6200048e565b6040516200021b919062002dc9565b620002546200024e36600462002912565b62000497565b6040516200021b92919062002d53565b6200020c6200053e565b6200020c62000544565b6200028f62000289366004620028ad565b6200054a565b005b6200020c620002a2366004620027e4565b620005b5565b620002b2620005d4565b6040516200021b919062002ce1565b6200028f620002d236600462002912565b620005e3565b620002b2620002e936600462002a3d565b620005f3565b6200020c620006d5565b620002b2620006db565b6200028f62000314366004620028cf565b620006ea565b620003316200032b36600462002822565b62000875565b6040516200021b919062002db4565b6200028f620008ae565b6200020c6200035b366004620027e4565b6200090f565b620003786200037236600462002b45565b62000926565b6040516200021b92919062002d79565b620003786200039936600462002b45565b620009a3565b62000378620003b036600462002adc565b620009f4565b6200020c62000ad4565b620002b262000ada565b62000254620003db36600462002950565b62000ae9565b6200028f620003f236600462002a87565b62000b89565b620002b262000cd3565b6200020c62000ce2565b6200020c62000ce8565b6200028f6200042736600462002ba1565b62000d03565b620003786200043e36600462002b45565b62000f18565b6000619c4060005a905060006200045a62000ada565b905062000468818662000f6b565b93505060005a82039050808310156200048657601080548483030190555b505050919050565b60085460ff1690565b600f5460009060609060ff600160a01b90910416151560011415620004c257620004c260066200100a565b619c4060005a90506000620004d662000ada565b9050620004e38162001025565b6000620004fb82620004f584620010b4565b62001147565b9050620005098188620011e3565b95509550505060005a82039050808310156200052d57601080548401905562000536565b60108054820190555b505050915091565b60045490565b600b5490565b600f5460ff600160a01b909104161515600114156200056f576200056f60066200100a565b61ea6060005a905060006200058362000ada565b90506200059281868662001274565b5060005a8203905080831015620005ae57601080548483030190555b5050505050565b6000620005cc620005c68362001300565b62001393565b90505b919050565b6000546001600160a01b031681565b620005f060018262001397565b50565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b83811015620006555781810151838201526020016200063b565b50505050905090810190601f168015620006835780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b158015620006a157600080fd5b505afa158015620006b6573d6000803e3d6000fd5b505050506040513d6020811015620006cd57600080fd5b505192915050565b600a5490565b600e546001600160a01b031690565b600f5460ff600160a01b909104161515600114156200070f576200070f60066200100a565b600060018585601b0185856040516000815260200160405260405162000739949392919062002d96565b6020604051602081039080840390855afa1580156200075c573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166200079c576200079c604051806060016040528060388152602001620038a360389139620005e3565b620007a781620013af565b620007b357506200086f565b620007be8162001442565b600f80546001600160a01b038381166001600160a01b03198316179092556040519116906000906003602160991b0190620007f990620026af565b62000805919062002ce1565b604051809103906000f08015801562000822573d6000803e3d6000fd5b50600f80546001600160a01b0319166001600160a01b03851617905590506200085e83826200085181620014af565b80519060200120620014c9565b6200086b8360006200150a565b5050505b50505050565b60606000826001146200088957826200088c565b60025b9050620008a56200089d8662001300565b858362001581565b95945050505050565b600f5460ff600160a01b90910416151560011415620008d357620008d360066200100a565b6000620008df62000ada565b90506000620008ee82620010b4565b9050808160010111156200090b576200090b82826001016200150a565b5050565b6000620005cc620009208362001300565b620015a3565b600060606201388060005a60408051606081018252600f546001600160a01b039081168252891660208201526001918101919091529091506200096c81898989620015a7565b945094505060005a82039050808310156200098f57601080548401905562000998565b60108054820190555b505050935093915050565b60006060620186a060005a60408051606081018252600f5460ff600160a01b8204161515928201929092526001600160a01b03918216815290881660208201529091506200096c81898989620015a7565b60006060331562000a0457600080fd5b600280546001600160a01b0319166001600160a01b03851617905562000a2a8562001640565b600019601155600f80546001600160a01b0319166001600160a01b038681169190911790915560808601511615801562000aad5760008062000a708860c0015162000497565b90925090506001600160a01b03821662000a935760009450925062000acc915050565b600162000aa083620014af565b9450945050505062000acc565b62000ac68660a0015187608001518860c00151620009a3565b92509250505b935093915050565b60075490565b600f546001600160a01b031690565b600f5460009060609060ff600160a01b9091041615156001141562000b145762000b1460066200100a565b619c4060005a9050600062000b2862000ada565b905062000b358162001025565b600062000b44828989620016b5565b905062000b528189620011e3565b95509550505060005a820390508083101562000b7657601080548401905562000b7f565b60108054820190555b5050509250929050565b600a547fdefa017defa017defa017defa017defa017defa017defa017defa017defa017d1462000bb9576200090b565b600280546001600160a01b0319166001600160a01b038381169190911791829055604051630d15d41560e41b815291169063d15d41509062000c0090339060040162002ce1565b60206040518083038186803b15801562000c1957600080fd5b505afa15801562000c2e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000c54919062002859565b62000c7c5760405162461bcd60e51b815260040162000c739062002e4e565b60405180910390fd5b62000c878262001640565b62000c9282620016ff565b62000ca75762000ca162001761565b6200090b565b62000cc76003600001548360a001510383608001518460c00151620009a3565b50506200090b62001761565b600d546001600160a01b031690565b60095490565b600062000cfe62000cf862000ada565b620010b4565b905090565b33301462000d115762000f13565b62000d1c81620013af565b62000d515762000d51600562000d4b6040518060600160405280603481526020016200395160349139620017fe565b62001397565b6001546040516352275acd60e11b81526001600160a01b039091169063a44eb59a9062000d8390859060040162002db4565b60206040518083038186803b15801562000d9c57600080fd5b505afa15801562000db1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000dd7919062002859565b62000e065762000e06600462000d4b6040518060a0016040528060768152602001620038db60769139620017fe565b62000e118162001442565b600062000e1e8362001843565b90506001600160a01b03811662000e39573d6000803e3d6000fd5b600062000e4682620014af565b6001546040516352275acd60e11b81529192506001600160a01b03169063a44eb59a9062000e7990849060040162002db4565b60206040518083038186803b15801562000e9257600080fd5b505afa15801562000ea7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000ecd919062002859565b62000efc5762000efc600462000d4b6040518060600160405280603081526020016200398560309139620017fe565b620005ae838362000f0d8562001393565b620014c9565b505050565b60006060619c4060005a60408051606081018252600e546001600160a01b039081168252600f549081166020830152600160a01b900460ff161515918101919091529091506200096c81898989620015a7565b600062000f79838362001854565b600254604051631aaf392f60e01b81526001600160a01b0390911690631aaf392f9062000fad908690869060040162002d19565b60206040518083038186803b15801562000fc657600080fd5b505afa15801562000fdb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001001919062002894565b90505b92915050565b620005f0816040518060200160405280600081525062001397565b600080620010785a6002602160991b018560405160240162001048919062002ce1565b60408051601f198184030181529190526020810180516001600160e01b031663b1540a0160e01b179052620009a3565b9150915060008180602001905181019062001094919062002859565b9050801580620010a2575082155b156200086f576200086f60076200100a565b6000620010c182620019a4565b60025460405163d126199f60e01b81526001600160a01b039091169063d126199f90620010f390859060040162002ce1565b60206040518083038186803b1580156200110c57600080fd5b505afa15801562001121573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620005cc919062002894565b60408051600280825260608201909252600091829190816020015b606081526020019060019003908162001162579050509050620011858462001b03565b816000815181106200119357fe5b6020026020010181905250620011a98362001b31565b81600181518110620011b757fe5b60200260200101819052506000620011cf8262001b48565b9050620008a5818051906020012062001b92565b600060606200120c620011f562000ada565b6200120362000cf862000ada565b6001016200150a565b60408051606081018252600f5460ff600160a01b8204161515928201929092526001600160a01b039182168152908516602082015260008062001254835a8989600162001b95565b91509150816200126657600062001268565b865b97909650945050505050565b8062001281848462000f6b565b14156200128e5762000f13565b6200129a838362001e28565b600254604051635c17d62960e01b81526001600160a01b0390911690635c17d62990620012d09086908690869060040162002d32565b600060405180830381600087803b158015620012eb57600080fd5b505af11580156200086b573d6000803e3d6000fd5b60006200130d82620019a4565b600254604051637c8ee70360e01b81526001600160a01b0390911690637c8ee703906200133f90859060040162002ce1565b60206040518083038186803b1580156200135857600080fd5b505afa1580156200136d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620005cc919062002803565b3f90565b6000620013a5838362001f49565b9050805160208201fd5b6000620013bc82620019a4565b6002546040516307a1294560e01b81526001600160a01b03909116906307a1294590620013ee90859060040162002ce1565b60206040518083038186803b1580156200140757600080fd5b505afa1580156200141c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620005cc919062002859565b6200144d81620019a4565b600254604051637e78a4d160e11b81526001600160a01b039091169063fcf149a2906200147f90849060040162002ce1565b600060405180830381600087803b1580156200149a57600080fd5b505af1158015620005ae573d6000803e3d6000fd5b6060620005cc826000620014c385620015a3565b62001581565b620014d48362001ffc565b6002546040516368510af960e11b81526001600160a01b039091169063d0a215f290620012d09086908690869060040162002cf5565b620015158262001ffc565b6002546040516374855dc360e11b81526001600160a01b039091169063e90abb869062001549908590859060040162002d19565b600060405180830381600087803b1580156200156457600080fd5b505af115801562001579573d6000803e3d6000fd5b505050505050565b60606040519050602082018101604052818152818360208301863c9392505050565b3b90565b6000606073ffffffffffffffffffffffffffffffffffff0000841673deaddeaddeaddeaddeaddeaddeaddeaddead00001415620015f857505060408051602081019091526000815260019062001637565b60006064856001600160a01b0316106200161d57620016178562001300565b6200161f565b845b90506200163187878387600062001b95565b92509250505b94509492505050565b80516009556020810151600a5560a0810151600c5560408101516008805460ff1916600183818111156200167057fe5b02179055506060810151600d80546001600160a01b0319166001600160a01b03909216919091179055600554600b5560a0810151620016af906200211a565b60115550565b60008060ff60f81b85848680519060200120604051602001620016dc949392919062002c4e565b604051602081830303815290604052805190602001209050620008a58162001b92565b60007fdefa017defa017defa017defa017defa017defa017defa017defa017defa017d826020015114156200173757506000620005cf565b6200174b8260a0015183604001516200212f565b6200175957506000620005cf565b506001919050565b600d80546001600160a01b031990811673defa017defa017defa017defa017defa017defa09081179092557fdefa017defa017defa017defa017defa017defa017defa017defa017defa017d6009819055600a819055600b819055600c8190556008805460ff191690556010819055600e8054831684179055600f8054831690931760ff60a01b1916909255601191909155600280549091169055565b60608160405160240162001813919062002db4565b60408051601f198184030181529190526020810180516001600160e01b031662461bcd60e51b1790529050919050565b60008151602083016000f092915050565b6175305a10156200186b576200186b60006200100a565b600254604051630ad2267960e01b81526001600160a01b0390911690630ad22679906200189f908590859060040162002d19565b60206040518083038186803b158015620018b857600080fd5b505afa158015620018cd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620018f3919062002859565b62001904576200190460036200100a565b600254604051632bcdee1960e21b81526000916001600160a01b03169063af37b8649062001939908690869060040162002d19565b602060405180830381600087803b1580156200195457600080fd5b505af115801562001969573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200198f919062002859565b90508062000f135762000f13614e2062002163565b6175305a1015620019bb57620019bb60006200100a565b60025460405163c8e40fbf60e01b81526001600160a01b039091169063c8e40fbf90620019ed90849060040162002ce1565b60206040518083038186803b15801562001a0657600080fd5b505afa15801562001a1b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001a41919062002859565b62001a525762001a5260036200100a565b600254604051633ecdecc760e21b81526000916001600160a01b03169063fb37b31c9062001a8590859060040162002ce1565b602060405180830381600087803b15801562001aa057600080fd5b505af115801562001ab5573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001adb919062002859565b9050806200090b576200090b617530606462001afb620009208662001300565b020162002163565b6060620005cc8260405160200162001b1c919062002c31565b60405160208183030381529060405262002186565b6060620005cc62001b4283620021e0565b62002186565b6060600062001b5783620022f1565b905062001b67815160c0620023fe565b8160405160200162001b7b92919062002ca5565b604051602081830303815290604052915050919050565b90565b6040805160608082018352600e546001600160a01b039081168352600f549081166020840152600160a01b900460ff161515928201929092526000919062001bde81896200255b565b601154600062001bee896200211a565b6011819055905060006060871562001cb257604051309063fcb6829b60e01b9062001c22908e908d908f9060240162002eba565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b031990941693909317909252905162001c62919062002c87565b6000604051808303816000865af19150503d806000811462001ca1576040519150601f19603f3d011682016040523d82523d6000602084013e62001ca6565b606091505b50909250905062001d19565b896001600160a01b03168b8a60405162001ccd919062002c87565b60006040518083038160008787f1925050503d806000811462001d0d576040519150601f19603f3d011682016040523d82523d6000602084013e62001d12565b606091505b5090925090505b62001d258c866200255b565b6011548262001e105760008060008062001d3f8662002612565b92965090945092509050600384600781111562001d5857fe5b141562001d6a5762001d6a846200100a565b600184600781111562001d7957fe5b148062001d925750600484600781111562001d9057fe5b145b8062001daa5750600684600781111562001da857fe5b145b8062001dc25750600784600781111562001dc057fe5b145b1562001dce5760108290555b600184600781111562001ddd57fe5b148062001de757508c5b1562001df65780955062001e09565b6040518060200160405280600081525095505b5090925050505b90920390920360115590999098509650505050505050565b62001e34828262001854565b60025460405163af3dc01160e01b81526000916001600160a01b03169063af3dc0119062001e69908690869060040162002d19565b602060405180830381600087803b15801562001e8457600080fd5b505af115801562001e99573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001ebf919062002859565b90508062000f135762001ed28362001ffc565b600260009054906101000a90046001600160a01b03166001600160a01b031663c3fd9b256040518163ffffffff1660e01b8152600401600060405180830381600087803b15801562001f2357600080fd5b505af115801562001f38573d6000803e3d6000fd5b5050505062000f13614e2062002163565b6060600083600781111562001f5a57fe5b141562001f77575060408051602081019091526000815262001004565b600383600781111562001f8657fe5b141562001fc85760408051602080820183526000808352925162001fb1938793909283920162002dde565b604051602081830303815290604052905062001004565b60115460105460405162001fe59286929091869060200162002e1e565b604051602081830303815290604052905092915050565b6200200781620019a4565b60025460405163011b1f7960e41b81526000916001600160a01b0316906311b1f790906200203a90859060040162002ce1565b602060405180830381600087803b1580156200205557600080fd5b505af11580156200206a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062002090919062002859565b9050806200090b57600260009054906101000a90046001600160a01b03166001600160a01b03166333f943056040518163ffffffff1660e01b8152600401600060405180830381600087803b158015620020e957600080fd5b505af1158015620020fe573d6000803e3d6000fd5b505050506200090b617530606462001afb620009208662001300565b60005a82106200212b575a620005cc565b5090565b600454600090831115620021465750600062001004565b6003548310156200215a5750600062001004565b50600192915050565b6011548111156200217a576200217a60026200100a565b60118054919091039055565b60608082516001148015620021b05750608083600081518110620021a657fe5b016020015160f81c105b15620021be575081620005cc565b620021cc83516080620023fe565b8360405160200162001fe592919062002ca5565b6060600082604051602001620021f7919062002cd8565b604051602081830303815290604052905060005b602081101562002246578181815181106200222257fe5b01602001516001600160f81b031916156200223d5762002246565b6001016200220b565b6000816020036001600160401b03811180156200226257600080fd5b506040519080825280601f01601f1916602001820160405280156200228e576020820181803683370190505b50905060005b8151811015620022e8578351600184019385918110620022b057fe5b602001015160f81c60f81b828281518110620022c857fe5b60200101906001600160f81b031916908160001a90535060010162002294565b50949350505050565b6060815160001415620023145750604080516000815260208101909152620005cf565b6000805b83518110156200234a578381815181106200232f57fe5b60200260200101515182019150808060010191505062002318565b6000826001600160401b03811180156200236357600080fd5b506040519080825280601f01601f1916602001820160405280156200238f576020820181803683370190505b50600092509050602081015b8551831015620022e8576000868481518110620023b457fe5b602002602001015190506000602082019050620023d48382845162002669565b878581518110620023e157fe5b60200260200101515183019250505082806001019350506200239b565b60608060388410156200245b576040805160018082528183019092529060208201818036833701905050905082840160f81b816000815181106200243e57fe5b60200101906001600160f81b031916908160001a90535062001001565b600060015b8086816200246a57fe5b041562002481576001909101906101000262002460565b816001016001600160401b03811180156200249b57600080fd5b506040519080825280601f01601f191660200182016040528015620024c7576020820181803683370190505b50925084820160370160f81b83600081518110620024e157fe5b60200101906001600160f81b031916908160001a905350600190505b81811162002552576101008183036101000a87816200251857fe5b04816200252157fe5b0660f81b8382815181106200253257fe5b60200101906001600160f81b031916908160001a905350600101620024fd565b50509392505050565b805182516001600160a01b0390811691161462002594578051600e80546001600160a01b0319166001600160a01b039092169190911790555b80602001516001600160a01b031682602001516001600160a01b031614620025db576020810151600f80546001600160a01b0319166001600160a01b039092169190911790555b8060400151151582604001511515146200090b5760400151600f8054911515600160a01b0260ff60a01b1990921691909117905550565b6000806000606084516000141562002643575050604080516020810190915260008082529250829150819062002662565b8480602001905181019062002659919062002996565b93509350935093505b9193509193565b8282825b602081106200268e578151835260209283019290910190601f19016200266d565b905182516020929092036101000a6000190180199091169116179052505050565b61092a8062002f7983390190565b6000620026d4620026ce8462002f11565b62002eed565b9050828152838383011115620026e957600080fd5b828260208301376000602084830101529392505050565b8035620005cf8162002f62565b600082601f8301126200271e578081fd5b6200100183833560208501620026bd565b803560028110620005cf57600080fd5b600060e0828403121562002751578081fd5b6200275d60e062002eed565b905081358152602082013560208201526200277b604083016200272f565b60408201526200278e6060830162002700565b6060820152620027a16080830162002700565b608082015260a082013560a082015260c08201356001600160401b03811115620027ca57600080fd5b620027d8848285016200270d565b60c08301525092915050565b600060208284031215620027f6578081fd5b8135620010018162002f62565b60006020828403121562002815578081fd5b8151620010018162002f62565b60008060006060848603121562002837578182fd5b8335620028448162002f62565b95602085013595506040909401359392505050565b6000602082840312156200286b578081fd5b8151801515811462001001578182fd5b6000602082840312156200288d578081fd5b5035919050565b600060208284031215620028a6578081fd5b5051919050565b60008060408385031215620028c0578182fd5b50508035926020909101359150565b60008060008060808587031215620028e5578081fd5b84359350602085013560ff81168114620028fd578182fd5b93969395505050506040820135916060013590565b60006020828403121562002924578081fd5b81356001600160401b038111156200293a578182fd5b62002948848285016200270d565b949350505050565b6000806040838503121562002963578182fd5b82356001600160401b0381111562002979578283fd5b62002987858286016200270d565b95602094909401359450505050565b60008060008060808587031215620029ac578182fd5b845160088110620029bb578283fd5b80945050602085015192506040850151915060608501516001600160401b03811115620029e6578182fd5b8501601f81018713620029f7578182fd5b805162002a08620026ce8262002f11565b81815288602083850101111562002a1d578384fd5b62002a3082602083016020860162002f33565b9598949750929550505050565b60006020828403121562002a4f578081fd5b81356001600160401b0381111562002a65578182fd5b8201601f8101841362002a76578182fd5b6200294884823560208401620026bd565b6000806040838503121562002a9a578182fd5b82356001600160401b0381111562002ab0578283fd5b62002abe858286016200273f565b925050602083013562002ad18162002f62565b809150509250929050565b60008060006060848603121562002af1578081fd5b83356001600160401b0381111562002b07578182fd5b62002b15868287016200273f565b935050602084013562002b288162002f62565b9150604084013562002b3a8162002f62565b809150509250925092565b60008060006060848603121562002b5a578081fd5b83359250602084013562002b6e8162002f62565b915060408401356001600160401b0381111562002b89578182fd5b62002b97868287016200270d565b9150509250925092565b60008060006060848603121562002bb6578081fd5b8335925060208401356001600160401b0381111562002bd3578182fd5b62002be1868287016200270d565b925050604084013562002b3a8162002f62565b6000815180845262002c0e81602086016020860162002f33565b601f01601f19169290920160200192915050565b6008811062002c2d57fe5b9052565b60609190911b6bffffffffffffffffffffffff1916815260140190565b6001600160f81b031994909416845260609290921b6bffffffffffffffffffffffff191660018401526015830152603582015260550190565b6000825162002c9b81846020870162002f33565b9190910192915050565b6000835162002cb981846020880162002f33565b83519083019062002ccf81836020880162002f33565b01949350505050565b90815260200190565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039390931683526020830191909152604082015260600190565b6001600160a01b0383168152604060208201819052600090620029489083018462002bf4565b600083151582526040602083015262002948604083018462002bf4565b93845260ff9290921660208401526040830152606082015260800190565b60006020825262001001602083018462002bf4565b602081016002831062002dd857fe5b91905290565b600062002dec828762002c22565b60ff8516602083015260ff841660408301526080606083015262002e14608083018462002bf4565b9695505050505050565b600062002e2c828762002c22565b8460208301528360408301526080606083015262002e14608083018462002bf4565b60208082526046908201527f4f6e6c792061757468656e746963617465642061646472657373657320696e2060408201527f6f766d53746174654d616e616765722063616e2063616c6c20746869732066756060820152653731ba34b7b760d11b608082015260a00190565b60008482526060602083015262002ed5606083018562002bf4565b905060018060a01b0383166040830152949350505050565b6040518181016001600160401b038111828210171562002f0957fe5b604052919050565b60006001600160401b0382111562002f2557fe5b50601f01601f191660200190565b60005b8381101562002f5057818101518382015260200162002f36565b838111156200086f5750506000910152565b6001600160a01b0381168114620005f057600080fdfe608060405234801561001057600080fd5b5060405161092a38038061092a8339818101604052602081101561003357600080fd5b505161003e81610044565b506101d9565b61008d7fdeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddead60001b61007e8361009060201b6103ca1760201c565b61009c60201b6103d61760201c565b50565b6001600160a01b031690565b604080516024810184905260448082018490528251808303909101815260649091019091526020810180516001600160e01b03908116628af59360e61b179091526100e891906100ed16565b505050565b60606100f95a836100ff565b92915050565b60606000339050600080826001600160a01b031686866040518082805190602001908083835b602083106101445780518252601f199092019160209182019101610125565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038160008787f1925050503d80600081146101a7576040519150601f19603f3d011682016040523d82523d6000602084013e6101ac565b606091505b509092509050816101bf57805160208201fd5b8051600114156101cf5760016000f35b92506100f9915050565b610742806101e86000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c80630900f010146100a1578063aaf10f42146100c9575b6000806100825a6100456100ed565b6000368080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061012592505050565b91509150811561009457805160208201f35b61009d816102c8565b5050005b6100c7600480360360208110156100b757600080fd5b50356001600160a01b031661037a565b005b6100d16100ed565b604080516001600160a01b039092168252519081900360200190f35b600061012061011b7fdeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddead610422565b610488565b905090565b6000606060006101ed86868660405160240180848152602001836001600160a01b0316815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561018657818101518382015260200161016e565b50505050905090810190601f1680156101b35780820380516001836020036101000a031916815260200191505b5060408051601f198184030181529190526020810180516001600160e01b03166001620631bb60e21b0319179052945061048b9350505050565b905080806020019051604081101561020457600080fd5b81516020830180516040519294929383019291908464010000000082111561022b57600080fd5b90830190602082018581111561024057600080fd5b825164010000000081118282018810171561025a57600080fd5b82525081516020918201929091019080838360005b8381101561028757818101518382015260200161026f565b50505050905090810190601f1680156102b45780820380516001836020036101000a031916815260200191505b506040525050509250925050935093915050565b6103766102d48261049d565b6040516024018080602001828103825283818151815260200191508051906020019080838360005b838110156103145781810151838201526020016102fc565b50505050905090810190601f1680156103415780820380516001836020036101000a031916815260200191505b5060408051601f198184030181529190526020810180516001600160e01b0316632a2a7adb60e01b179052925061048b915050565b5050565b6103be6103856104e0565b6001600160a01b0316610396610536565b6001600160a01b0316146040518060600160405280603281526020016106db6032913961056d565b6103c78161057b565b50565b6001600160a01b031690565b604080516024810184905260448082018490528251808303909101815260649091019091526020810180516001600160e01b0316628af59360e61b17905261041d9061048b565b505050565b6040805160248082018490528251808303909101815260449091019091526020810180516001600160e01b03166303daa95960e01b17905260009081906104689061048b565b905080806020019051602081101561047f57600080fd5b50519392505050565b90565b60606104975a836105ad565b92915050565b6060816040516024016104b09190610687565b60408051601f198184030181529190526020810180516001600160e01b031662461bcd60e51b1790529050919050565b6040805160048152602481019091526020810180516001600160e01b0316631cd4241960e21b17905260009081906105179061048b565b905080806020019051602081101561052e57600080fd5b505191505090565b6040805160048152602481019091526020810180516001600160e01b031663996d79a560e01b17905260009081906105179061048b565b8161037657610376816102c8565b6103c77fdeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddead6105a8836103ca565b6103d6565b60606000339050600080826001600160a01b031686866040518082805190602001908083835b602083106105f25780518252601f1990920191602091820191016105d3565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038160008787f1925050503d8060008114610655576040519150601f19603f3d011682016040523d82523d6000602084013e61065a565b606091505b5090925090508161066d57805160208201fd5b80516001141561067d5760016000f35b9250610497915050565b6000602080835283518082850152825b818110156106b357858101830151858201604001528201610697565b818111156106c45783604083870101525b50601f01601f191692909201604001939250505056fe454f41732063616e206f6e6c792075706772616465207468656972206f776e20454f4120696d706c656d656e746174696f6ea2646970667358221220d88169321d81d0add2ef5498a13d592c0bb23250b25e21900194a0612d0aa6b064736f6c634300070600335369676e61747572652070726f766964656420666f7220454f4120636f6e7472616374206372656174696f6e20697320696e76616c69642e436f6e7472616374206372656174696f6e20636f646520636f6e7461696e7320756e73616665206f70636f6465732e2044696420796f75207573652074686520726967687420636f6d70696c6572206f72207061737320616e20756e7361666520636f6e7374727563746f7220617267756d656e743f4120636f6e74726163742068617320616c7265616479206265656e206465706c6f79656420746f20746869732061646472657373436f6e7374727563746f7220617474656d7074656420746f206465706c6f7920756e736166652062797465636f64652ea2646970667358221220eda3c5433870e6e35af08fbb60226195c5bc1aec0581e3e0053d2d87e0ed101e64736f6c63430007060033", - "deployedBytecode": "0x60806040523480156200001157600080fd5b5060043610620001f05760003560e01c80637cebbe94116200011157806399ccd98b11620000a5578063bdbf8c36116200007b578063bdbf8c361462000402578063c1fb2ea2146200040c578063fcb6829b1462000416578063ffe73914146200042d57620001f0565b806399ccd98b14620003ca5780639be3ad6714620003e15780639dc9dc9314620003f857620001f0565b806385979f7611620000e757806385979f7614620003885780638bb42e15146200039f5780639058025614620003b6578063996d79a514620003c057620001f0565b80637cebbe9414620003405780638435035b146200034a5780638540661f146200036157620001f0565b8063299ca47811620001895780635a98c361116200015f5780635a98c36114620002ef5780637350906414620002f9578063741a33eb1462000303578063746c32f1146200031a57620001f0565b8063299ca47814620002a85780632a2a7adb14620002c1578063461a447814620002d857620001f0565b80631c4712a711620001cb5780631c4712a7146200026457806320160f3a146200026e57806322bd64c0146200027857806324749d5c146200029157620001f0565b806303daa95914620001f5578063101185a4146200022457806314aa2ff7146200023d575b600080fd5b6200020c620002063660046200287b565b62000444565b6040516200021b919062002cd8565b60405180910390f35b6200022e6200048e565b6040516200021b919062002dc9565b620002546200024e36600462002912565b62000497565b6040516200021b92919062002d53565b6200020c6200053e565b6200020c62000544565b6200028f62000289366004620028ad565b6200054a565b005b6200020c620002a2366004620027e4565b620005b5565b620002b2620005d4565b6040516200021b919062002ce1565b6200028f620002d236600462002912565b620005e3565b620002b2620002e936600462002a3d565b620005f3565b6200020c620006d5565b620002b2620006db565b6200028f62000314366004620028cf565b620006ea565b620003316200032b36600462002822565b62000875565b6040516200021b919062002db4565b6200028f620008ae565b6200020c6200035b366004620027e4565b6200090f565b620003786200037236600462002b45565b62000926565b6040516200021b92919062002d79565b620003786200039936600462002b45565b620009a3565b62000378620003b036600462002adc565b620009f4565b6200020c62000ad4565b620002b262000ada565b62000254620003db36600462002950565b62000ae9565b6200028f620003f236600462002a87565b62000b89565b620002b262000cd3565b6200020c62000ce2565b6200020c62000ce8565b6200028f6200042736600462002ba1565b62000d03565b620003786200043e36600462002b45565b62000f18565b6000619c4060005a905060006200045a62000ada565b905062000468818662000f6b565b93505060005a82039050808310156200048657601080548483030190555b505050919050565b60085460ff1690565b600f5460009060609060ff600160a01b90910416151560011415620004c257620004c260066200100a565b619c4060005a90506000620004d662000ada565b9050620004e38162001025565b6000620004fb82620004f584620010b4565b62001147565b9050620005098188620011e3565b95509550505060005a82039050808310156200052d57601080548401905562000536565b60108054820190555b505050915091565b60045490565b600b5490565b600f5460ff600160a01b909104161515600114156200056f576200056f60066200100a565b61ea6060005a905060006200058362000ada565b90506200059281868662001274565b5060005a8203905080831015620005ae57601080548483030190555b5050505050565b6000620005cc620005c68362001300565b62001393565b90505b919050565b6000546001600160a01b031681565b620005f060018262001397565b50565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b83811015620006555781810151838201526020016200063b565b50505050905090810190601f168015620006835780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b158015620006a157600080fd5b505afa158015620006b6573d6000803e3d6000fd5b505050506040513d6020811015620006cd57600080fd5b505192915050565b600a5490565b600e546001600160a01b031690565b600f5460ff600160a01b909104161515600114156200070f576200070f60066200100a565b600060018585601b0185856040516000815260200160405260405162000739949392919062002d96565b6020604051602081039080840390855afa1580156200075c573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166200079c576200079c604051806060016040528060388152602001620038a360389139620005e3565b620007a781620013af565b620007b357506200086f565b620007be8162001442565b600f80546001600160a01b038381166001600160a01b03198316179092556040519116906000906003602160991b0190620007f990620026af565b62000805919062002ce1565b604051809103906000f08015801562000822573d6000803e3d6000fd5b50600f80546001600160a01b0319166001600160a01b03851617905590506200085e83826200085181620014af565b80519060200120620014c9565b6200086b8360006200150a565b5050505b50505050565b60606000826001146200088957826200088c565b60025b9050620008a56200089d8662001300565b858362001581565b95945050505050565b600f5460ff600160a01b90910416151560011415620008d357620008d360066200100a565b6000620008df62000ada565b90506000620008ee82620010b4565b9050808160010111156200090b576200090b82826001016200150a565b5050565b6000620005cc620009208362001300565b620015a3565b600060606201388060005a60408051606081018252600f546001600160a01b039081168252891660208201526001918101919091529091506200096c81898989620015a7565b945094505060005a82039050808310156200098f57601080548401905562000998565b60108054820190555b505050935093915050565b60006060620186a060005a60408051606081018252600f5460ff600160a01b8204161515928201929092526001600160a01b03918216815290881660208201529091506200096c81898989620015a7565b60006060331562000a0457600080fd5b600280546001600160a01b0319166001600160a01b03851617905562000a2a8562001640565b600019601155600f80546001600160a01b0319166001600160a01b038681169190911790915560808601511615801562000aad5760008062000a708860c0015162000497565b90925090506001600160a01b03821662000a935760009450925062000acc915050565b600162000aa083620014af565b9450945050505062000acc565b62000ac68660a0015187608001518860c00151620009a3565b92509250505b935093915050565b60075490565b600f546001600160a01b031690565b600f5460009060609060ff600160a01b9091041615156001141562000b145762000b1460066200100a565b619c4060005a9050600062000b2862000ada565b905062000b358162001025565b600062000b44828989620016b5565b905062000b528189620011e3565b95509550505060005a820390508083101562000b7657601080548401905562000b7f565b60108054820190555b5050509250929050565b600a547fdefa017defa017defa017defa017defa017defa017defa017defa017defa017d1462000bb9576200090b565b600280546001600160a01b0319166001600160a01b038381169190911791829055604051630d15d41560e41b815291169063d15d41509062000c0090339060040162002ce1565b60206040518083038186803b15801562000c1957600080fd5b505afa15801562000c2e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000c54919062002859565b62000c7c5760405162461bcd60e51b815260040162000c739062002e4e565b60405180910390fd5b62000c878262001640565b62000c9282620016ff565b62000ca75762000ca162001761565b6200090b565b62000cc76003600001548360a001510383608001518460c00151620009a3565b50506200090b62001761565b600d546001600160a01b031690565b60095490565b600062000cfe62000cf862000ada565b620010b4565b905090565b33301462000d115762000f13565b62000d1c81620013af565b62000d515762000d51600562000d4b6040518060600160405280603481526020016200395160349139620017fe565b62001397565b6001546040516352275acd60e11b81526001600160a01b039091169063a44eb59a9062000d8390859060040162002db4565b60206040518083038186803b15801562000d9c57600080fd5b505afa15801562000db1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000dd7919062002859565b62000e065762000e06600462000d4b6040518060a0016040528060768152602001620038db60769139620017fe565b62000e118162001442565b600062000e1e8362001843565b90506001600160a01b03811662000e39573d6000803e3d6000fd5b600062000e4682620014af565b6001546040516352275acd60e11b81529192506001600160a01b03169063a44eb59a9062000e7990849060040162002db4565b60206040518083038186803b15801562000e9257600080fd5b505afa15801562000ea7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000ecd919062002859565b62000efc5762000efc600462000d4b6040518060600160405280603081526020016200398560309139620017fe565b620005ae838362000f0d8562001393565b620014c9565b505050565b60006060619c4060005a60408051606081018252600e546001600160a01b039081168252600f549081166020830152600160a01b900460ff161515918101919091529091506200096c81898989620015a7565b600062000f79838362001854565b600254604051631aaf392f60e01b81526001600160a01b0390911690631aaf392f9062000fad908690869060040162002d19565b60206040518083038186803b15801562000fc657600080fd5b505afa15801562000fdb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001001919062002894565b90505b92915050565b620005f0816040518060200160405280600081525062001397565b600080620010785a6002602160991b018560405160240162001048919062002ce1565b60408051601f198184030181529190526020810180516001600160e01b031663b1540a0160e01b179052620009a3565b9150915060008180602001905181019062001094919062002859565b9050801580620010a2575082155b156200086f576200086f60076200100a565b6000620010c182620019a4565b60025460405163d126199f60e01b81526001600160a01b039091169063d126199f90620010f390859060040162002ce1565b60206040518083038186803b1580156200110c57600080fd5b505afa15801562001121573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620005cc919062002894565b60408051600280825260608201909252600091829190816020015b606081526020019060019003908162001162579050509050620011858462001b03565b816000815181106200119357fe5b6020026020010181905250620011a98362001b31565b81600181518110620011b757fe5b60200260200101819052506000620011cf8262001b48565b9050620008a5818051906020012062001b92565b600060606200120c620011f562000ada565b6200120362000cf862000ada565b6001016200150a565b60408051606081018252600f5460ff600160a01b8204161515928201929092526001600160a01b039182168152908516602082015260008062001254835a8989600162001b95565b91509150816200126657600062001268565b865b97909650945050505050565b8062001281848462000f6b565b14156200128e5762000f13565b6200129a838362001e28565b600254604051635c17d62960e01b81526001600160a01b0390911690635c17d62990620012d09086908690869060040162002d32565b600060405180830381600087803b158015620012eb57600080fd5b505af11580156200086b573d6000803e3d6000fd5b60006200130d82620019a4565b600254604051637c8ee70360e01b81526001600160a01b0390911690637c8ee703906200133f90859060040162002ce1565b60206040518083038186803b1580156200135857600080fd5b505afa1580156200136d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620005cc919062002803565b3f90565b6000620013a5838362001f49565b9050805160208201fd5b6000620013bc82620019a4565b6002546040516307a1294560e01b81526001600160a01b03909116906307a1294590620013ee90859060040162002ce1565b60206040518083038186803b1580156200140757600080fd5b505afa1580156200141c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620005cc919062002859565b6200144d81620019a4565b600254604051637e78a4d160e11b81526001600160a01b039091169063fcf149a2906200147f90849060040162002ce1565b600060405180830381600087803b1580156200149a57600080fd5b505af1158015620005ae573d6000803e3d6000fd5b6060620005cc826000620014c385620015a3565b62001581565b620014d48362001ffc565b6002546040516368510af960e11b81526001600160a01b039091169063d0a215f290620012d09086908690869060040162002cf5565b620015158262001ffc565b6002546040516374855dc360e11b81526001600160a01b039091169063e90abb869062001549908590859060040162002d19565b600060405180830381600087803b1580156200156457600080fd5b505af115801562001579573d6000803e3d6000fd5b505050505050565b60606040519050602082018101604052818152818360208301863c9392505050565b3b90565b6000606073ffffffffffffffffffffffffffffffffffff0000841673deaddeaddeaddeaddeaddeaddeaddeaddead00001415620015f857505060408051602081019091526000815260019062001637565b60006064856001600160a01b0316106200161d57620016178562001300565b6200161f565b845b90506200163187878387600062001b95565b92509250505b94509492505050565b80516009556020810151600a5560a0810151600c5560408101516008805460ff1916600183818111156200167057fe5b02179055506060810151600d80546001600160a01b0319166001600160a01b03909216919091179055600554600b5560a0810151620016af906200211a565b60115550565b60008060ff60f81b85848680519060200120604051602001620016dc949392919062002c4e565b604051602081830303815290604052805190602001209050620008a58162001b92565b60007fdefa017defa017defa017defa017defa017defa017defa017defa017defa017d826020015114156200173757506000620005cf565b6200174b8260a0015183604001516200212f565b6200175957506000620005cf565b506001919050565b600d80546001600160a01b031990811673defa017defa017defa017defa017defa017defa09081179092557fdefa017defa017defa017defa017defa017defa017defa017defa017defa017d6009819055600a819055600b819055600c8190556008805460ff191690556010819055600e8054831684179055600f8054831690931760ff60a01b1916909255601191909155600280549091169055565b60608160405160240162001813919062002db4565b60408051601f198184030181529190526020810180516001600160e01b031662461bcd60e51b1790529050919050565b60008151602083016000f092915050565b6175305a10156200186b576200186b60006200100a565b600254604051630ad2267960e01b81526001600160a01b0390911690630ad22679906200189f908590859060040162002d19565b60206040518083038186803b158015620018b857600080fd5b505afa158015620018cd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620018f3919062002859565b62001904576200190460036200100a565b600254604051632bcdee1960e21b81526000916001600160a01b03169063af37b8649062001939908690869060040162002d19565b602060405180830381600087803b1580156200195457600080fd5b505af115801562001969573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200198f919062002859565b90508062000f135762000f13614e2062002163565b6175305a1015620019bb57620019bb60006200100a565b60025460405163c8e40fbf60e01b81526001600160a01b039091169063c8e40fbf90620019ed90849060040162002ce1565b60206040518083038186803b15801562001a0657600080fd5b505afa15801562001a1b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001a41919062002859565b62001a525762001a5260036200100a565b600254604051633ecdecc760e21b81526000916001600160a01b03169063fb37b31c9062001a8590859060040162002ce1565b602060405180830381600087803b15801562001aa057600080fd5b505af115801562001ab5573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001adb919062002859565b9050806200090b576200090b617530606462001afb620009208662001300565b020162002163565b6060620005cc8260405160200162001b1c919062002c31565b60405160208183030381529060405262002186565b6060620005cc62001b4283620021e0565b62002186565b6060600062001b5783620022f1565b905062001b67815160c0620023fe565b8160405160200162001b7b92919062002ca5565b604051602081830303815290604052915050919050565b90565b6040805160608082018352600e546001600160a01b039081168352600f549081166020840152600160a01b900460ff161515928201929092526000919062001bde81896200255b565b601154600062001bee896200211a565b6011819055905060006060871562001cb257604051309063fcb6829b60e01b9062001c22908e908d908f9060240162002eba565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b031990941693909317909252905162001c62919062002c87565b6000604051808303816000865af19150503d806000811462001ca1576040519150601f19603f3d011682016040523d82523d6000602084013e62001ca6565b606091505b50909250905062001d19565b896001600160a01b03168b8a60405162001ccd919062002c87565b60006040518083038160008787f1925050503d806000811462001d0d576040519150601f19603f3d011682016040523d82523d6000602084013e62001d12565b606091505b5090925090505b62001d258c866200255b565b6011548262001e105760008060008062001d3f8662002612565b92965090945092509050600384600781111562001d5857fe5b141562001d6a5762001d6a846200100a565b600184600781111562001d7957fe5b148062001d925750600484600781111562001d9057fe5b145b8062001daa5750600684600781111562001da857fe5b145b8062001dc25750600784600781111562001dc057fe5b145b1562001dce5760108290555b600184600781111562001ddd57fe5b148062001de757508c5b1562001df65780955062001e09565b6040518060200160405280600081525095505b5090925050505b90920390920360115590999098509650505050505050565b62001e34828262001854565b60025460405163af3dc01160e01b81526000916001600160a01b03169063af3dc0119062001e69908690869060040162002d19565b602060405180830381600087803b15801562001e8457600080fd5b505af115801562001e99573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001ebf919062002859565b90508062000f135762001ed28362001ffc565b600260009054906101000a90046001600160a01b03166001600160a01b031663c3fd9b256040518163ffffffff1660e01b8152600401600060405180830381600087803b15801562001f2357600080fd5b505af115801562001f38573d6000803e3d6000fd5b5050505062000f13614e2062002163565b6060600083600781111562001f5a57fe5b141562001f77575060408051602081019091526000815262001004565b600383600781111562001f8657fe5b141562001fc85760408051602080820183526000808352925162001fb1938793909283920162002dde565b604051602081830303815290604052905062001004565b60115460105460405162001fe59286929091869060200162002e1e565b604051602081830303815290604052905092915050565b6200200781620019a4565b60025460405163011b1f7960e41b81526000916001600160a01b0316906311b1f790906200203a90859060040162002ce1565b602060405180830381600087803b1580156200205557600080fd5b505af11580156200206a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062002090919062002859565b9050806200090b57600260009054906101000a90046001600160a01b03166001600160a01b03166333f943056040518163ffffffff1660e01b8152600401600060405180830381600087803b158015620020e957600080fd5b505af1158015620020fe573d6000803e3d6000fd5b505050506200090b617530606462001afb620009208662001300565b60005a82106200212b575a620005cc565b5090565b600454600090831115620021465750600062001004565b6003548310156200215a5750600062001004565b50600192915050565b6011548111156200217a576200217a60026200100a565b60118054919091039055565b60608082516001148015620021b05750608083600081518110620021a657fe5b016020015160f81c105b15620021be575081620005cc565b620021cc83516080620023fe565b8360405160200162001fe592919062002ca5565b6060600082604051602001620021f7919062002cd8565b604051602081830303815290604052905060005b602081101562002246578181815181106200222257fe5b01602001516001600160f81b031916156200223d5762002246565b6001016200220b565b6000816020036001600160401b03811180156200226257600080fd5b506040519080825280601f01601f1916602001820160405280156200228e576020820181803683370190505b50905060005b8151811015620022e8578351600184019385918110620022b057fe5b602001015160f81c60f81b828281518110620022c857fe5b60200101906001600160f81b031916908160001a90535060010162002294565b50949350505050565b6060815160001415620023145750604080516000815260208101909152620005cf565b6000805b83518110156200234a578381815181106200232f57fe5b60200260200101515182019150808060010191505062002318565b6000826001600160401b03811180156200236357600080fd5b506040519080825280601f01601f1916602001820160405280156200238f576020820181803683370190505b50600092509050602081015b8551831015620022e8576000868481518110620023b457fe5b602002602001015190506000602082019050620023d48382845162002669565b878581518110620023e157fe5b60200260200101515183019250505082806001019350506200239b565b60608060388410156200245b576040805160018082528183019092529060208201818036833701905050905082840160f81b816000815181106200243e57fe5b60200101906001600160f81b031916908160001a90535062001001565b600060015b8086816200246a57fe5b041562002481576001909101906101000262002460565b816001016001600160401b03811180156200249b57600080fd5b506040519080825280601f01601f191660200182016040528015620024c7576020820181803683370190505b50925084820160370160f81b83600081518110620024e157fe5b60200101906001600160f81b031916908160001a905350600190505b81811162002552576101008183036101000a87816200251857fe5b04816200252157fe5b0660f81b8382815181106200253257fe5b60200101906001600160f81b031916908160001a905350600101620024fd565b50509392505050565b805182516001600160a01b0390811691161462002594578051600e80546001600160a01b0319166001600160a01b039092169190911790555b80602001516001600160a01b031682602001516001600160a01b031614620025db576020810151600f80546001600160a01b0319166001600160a01b039092169190911790555b8060400151151582604001511515146200090b5760400151600f8054911515600160a01b0260ff60a01b1990921691909117905550565b6000806000606084516000141562002643575050604080516020810190915260008082529250829150819062002662565b8480602001905181019062002659919062002996565b93509350935093505b9193509193565b8282825b602081106200268e578151835260209283019290910190601f19016200266d565b905182516020929092036101000a6000190180199091169116179052505050565b61092a8062002f7983390190565b6000620026d4620026ce8462002f11565b62002eed565b9050828152838383011115620026e957600080fd5b828260208301376000602084830101529392505050565b8035620005cf8162002f62565b600082601f8301126200271e578081fd5b6200100183833560208501620026bd565b803560028110620005cf57600080fd5b600060e0828403121562002751578081fd5b6200275d60e062002eed565b905081358152602082013560208201526200277b604083016200272f565b60408201526200278e6060830162002700565b6060820152620027a16080830162002700565b608082015260a082013560a082015260c08201356001600160401b03811115620027ca57600080fd5b620027d8848285016200270d565b60c08301525092915050565b600060208284031215620027f6578081fd5b8135620010018162002f62565b60006020828403121562002815578081fd5b8151620010018162002f62565b60008060006060848603121562002837578182fd5b8335620028448162002f62565b95602085013595506040909401359392505050565b6000602082840312156200286b578081fd5b8151801515811462001001578182fd5b6000602082840312156200288d578081fd5b5035919050565b600060208284031215620028a6578081fd5b5051919050565b60008060408385031215620028c0578182fd5b50508035926020909101359150565b60008060008060808587031215620028e5578081fd5b84359350602085013560ff81168114620028fd578182fd5b93969395505050506040820135916060013590565b60006020828403121562002924578081fd5b81356001600160401b038111156200293a578182fd5b62002948848285016200270d565b949350505050565b6000806040838503121562002963578182fd5b82356001600160401b0381111562002979578283fd5b62002987858286016200270d565b95602094909401359450505050565b60008060008060808587031215620029ac578182fd5b845160088110620029bb578283fd5b80945050602085015192506040850151915060608501516001600160401b03811115620029e6578182fd5b8501601f81018713620029f7578182fd5b805162002a08620026ce8262002f11565b81815288602083850101111562002a1d578384fd5b62002a3082602083016020860162002f33565b9598949750929550505050565b60006020828403121562002a4f578081fd5b81356001600160401b0381111562002a65578182fd5b8201601f8101841362002a76578182fd5b6200294884823560208401620026bd565b6000806040838503121562002a9a578182fd5b82356001600160401b0381111562002ab0578283fd5b62002abe858286016200273f565b925050602083013562002ad18162002f62565b809150509250929050565b60008060006060848603121562002af1578081fd5b83356001600160401b0381111562002b07578182fd5b62002b15868287016200273f565b935050602084013562002b288162002f62565b9150604084013562002b3a8162002f62565b809150509250925092565b60008060006060848603121562002b5a578081fd5b83359250602084013562002b6e8162002f62565b915060408401356001600160401b0381111562002b89578182fd5b62002b97868287016200270d565b9150509250925092565b60008060006060848603121562002bb6578081fd5b8335925060208401356001600160401b0381111562002bd3578182fd5b62002be1868287016200270d565b925050604084013562002b3a8162002f62565b6000815180845262002c0e81602086016020860162002f33565b601f01601f19169290920160200192915050565b6008811062002c2d57fe5b9052565b60609190911b6bffffffffffffffffffffffff1916815260140190565b6001600160f81b031994909416845260609290921b6bffffffffffffffffffffffff191660018401526015830152603582015260550190565b6000825162002c9b81846020870162002f33565b9190910192915050565b6000835162002cb981846020880162002f33565b83519083019062002ccf81836020880162002f33565b01949350505050565b90815260200190565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039390931683526020830191909152604082015260600190565b6001600160a01b0383168152604060208201819052600090620029489083018462002bf4565b600083151582526040602083015262002948604083018462002bf4565b93845260ff9290921660208401526040830152606082015260800190565b60006020825262001001602083018462002bf4565b602081016002831062002dd857fe5b91905290565b600062002dec828762002c22565b60ff8516602083015260ff841660408301526080606083015262002e14608083018462002bf4565b9695505050505050565b600062002e2c828762002c22565b8460208301528360408301526080606083015262002e14608083018462002bf4565b60208082526046908201527f4f6e6c792061757468656e746963617465642061646472657373657320696e2060408201527f6f766d53746174654d616e616765722063616e2063616c6c20746869732066756060820152653731ba34b7b760d11b608082015260a00190565b60008482526060602083015262002ed5606083018562002bf4565b905060018060a01b0383166040830152949350505050565b6040518181016001600160401b038111828210171562002f0957fe5b604052919050565b60006001600160401b0382111562002f2557fe5b50601f01601f191660200190565b60005b8381101562002f5057818101518382015260200162002f36565b838111156200086f5750506000910152565b6001600160a01b0381168114620005f057600080fdfe608060405234801561001057600080fd5b5060405161092a38038061092a8339818101604052602081101561003357600080fd5b505161003e81610044565b506101d9565b61008d7fdeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddead60001b61007e8361009060201b6103ca1760201c565b61009c60201b6103d61760201c565b50565b6001600160a01b031690565b604080516024810184905260448082018490528251808303909101815260649091019091526020810180516001600160e01b03908116628af59360e61b179091526100e891906100ed16565b505050565b60606100f95a836100ff565b92915050565b60606000339050600080826001600160a01b031686866040518082805190602001908083835b602083106101445780518252601f199092019160209182019101610125565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038160008787f1925050503d80600081146101a7576040519150601f19603f3d011682016040523d82523d6000602084013e6101ac565b606091505b509092509050816101bf57805160208201fd5b8051600114156101cf5760016000f35b92506100f9915050565b610742806101e86000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c80630900f010146100a1578063aaf10f42146100c9575b6000806100825a6100456100ed565b6000368080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061012592505050565b91509150811561009457805160208201f35b61009d816102c8565b5050005b6100c7600480360360208110156100b757600080fd5b50356001600160a01b031661037a565b005b6100d16100ed565b604080516001600160a01b039092168252519081900360200190f35b600061012061011b7fdeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddead610422565b610488565b905090565b6000606060006101ed86868660405160240180848152602001836001600160a01b0316815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561018657818101518382015260200161016e565b50505050905090810190601f1680156101b35780820380516001836020036101000a031916815260200191505b5060408051601f198184030181529190526020810180516001600160e01b03166001620631bb60e21b0319179052945061048b9350505050565b905080806020019051604081101561020457600080fd5b81516020830180516040519294929383019291908464010000000082111561022b57600080fd5b90830190602082018581111561024057600080fd5b825164010000000081118282018810171561025a57600080fd5b82525081516020918201929091019080838360005b8381101561028757818101518382015260200161026f565b50505050905090810190601f1680156102b45780820380516001836020036101000a031916815260200191505b506040525050509250925050935093915050565b6103766102d48261049d565b6040516024018080602001828103825283818151815260200191508051906020019080838360005b838110156103145781810151838201526020016102fc565b50505050905090810190601f1680156103415780820380516001836020036101000a031916815260200191505b5060408051601f198184030181529190526020810180516001600160e01b0316632a2a7adb60e01b179052925061048b915050565b5050565b6103be6103856104e0565b6001600160a01b0316610396610536565b6001600160a01b0316146040518060600160405280603281526020016106db6032913961056d565b6103c78161057b565b50565b6001600160a01b031690565b604080516024810184905260448082018490528251808303909101815260649091019091526020810180516001600160e01b0316628af59360e61b17905261041d9061048b565b505050565b6040805160248082018490528251808303909101815260449091019091526020810180516001600160e01b03166303daa95960e01b17905260009081906104689061048b565b905080806020019051602081101561047f57600080fd5b50519392505050565b90565b60606104975a836105ad565b92915050565b6060816040516024016104b09190610687565b60408051601f198184030181529190526020810180516001600160e01b031662461bcd60e51b1790529050919050565b6040805160048152602481019091526020810180516001600160e01b0316631cd4241960e21b17905260009081906105179061048b565b905080806020019051602081101561052e57600080fd5b505191505090565b6040805160048152602481019091526020810180516001600160e01b031663996d79a560e01b17905260009081906105179061048b565b8161037657610376816102c8565b6103c77fdeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddead6105a8836103ca565b6103d6565b60606000339050600080826001600160a01b031686866040518082805190602001908083835b602083106105f25780518252601f1990920191602091820191016105d3565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038160008787f1925050503d8060008114610655576040519150601f19603f3d011682016040523d82523d6000602084013e61065a565b606091505b5090925090508161066d57805160208201fd5b80516001141561067d5760016000f35b9250610497915050565b6000602080835283518082850152825b818110156106b357858101830151858201604001528201610697565b818111156106c45783604083870101525b50601f01601f191692909201604001939250505056fe454f41732063616e206f6e6c792075706772616465207468656972206f776e20454f4120696d706c656d656e746174696f6ea2646970667358221220d88169321d81d0add2ef5498a13d592c0bb23250b25e21900194a0612d0aa6b064736f6c634300070600335369676e61747572652070726f766964656420666f7220454f4120636f6e7472616374206372656174696f6e20697320696e76616c69642e436f6e7472616374206372656174696f6e20636f646520636f6e7461696e7320756e73616665206f70636f6465732e2044696420796f75207573652074686520726967687420636f6d70696c6572206f72207061737320616e20756e7361666520636f6e7374727563746f7220617267756d656e743f4120636f6e74726163742068617320616c7265616479206265656e206465706c6f79656420746f20746869732061646472657373436f6e7374727563746f7220617474656d7074656420746f206465706c6f7920756e736166652062797465636f64652ea2646970667358221220eda3c5433870e6e35af08fbb60226195c5bc1aec0581e3e0053d2d87e0ed101e64736f6c63430007060033", - "devdoc": { - "details": "The Execution Manager (EM) is the core of our OVM implementation, and provides a sandboxed environment allowing us to execute OVM transactions deterministically on either Layer 1 or Layer 2. The EM's run() function is the first function called during the execution of any transaction on L2. For each context-dependent EVM operation the EM has a function which implements a corresponding OVM operation, which will read state from the State Manager contract. The EM relies on the Safety Checker to verify that code deployed to Layer 2 does not contain any context-dependent operations. Compiler used: solc Runtime target: EVM", - "kind": "dev", - "methods": { - "constructor": { - "params": { - "_libAddressManager": "Address of the Address Manager." - } - }, - "ovmADDRESS()": { - "returns": { - "_ADDRESS": "Active ADDRESS within the current message context." - } - }, - "ovmCALL(uint256,address,bytes)": { - "params": { - "_address": "Address of the contract to call.", - "_calldata": "Data to send along with the call.", - "_gasLimit": "Amount of gas to be passed into this call." - }, - "returns": { - "_returndata": "Data returned by the call.", - "_success": "Whether or not the call returned (rather than reverted)." - } - }, - "ovmCALLER()": { - "returns": { - "_CALLER": "Address of the CALLER within the current message context." - } - }, - "ovmCHAINID()": { - "returns": { - "_CHAINID": "Value of the chain's CHAINID within the global context." - } - }, - "ovmCREATE(bytes)": { - "params": { - "_bytecode": "Code to be used to CREATE a new contract." - }, - "returns": { - "_0": "Address of the created contract.", - "_1": "Revert data, if and only if the creation threw an exception." - } - }, - "ovmCREATE2(bytes,bytes32)": { - "params": { - "_bytecode": "Code to be used to CREATE2 a new contract.", - "_salt": "Value used to determine the contract's address." - }, - "returns": { - "_0": "Address of the created contract.", - "_1": "Revert data, if and only if the creation threw an exception." - } - }, - "ovmCREATEEOA(bytes32,uint8,bytes32,bytes32)": { - "details": "Essentially functions like ovmCREATE or ovmCREATE2, but we can bypass a lot of checks because the contract we're creating is trusted (no need to do safety checking or to handle unexpected reverts). Doesn't need to return an address because the address is assumed to be the user's actual address.", - "params": { - "_messageHash": "Hash of a message signed by some user, for verification.", - "_r": "Signature `r` parameter.", - "_s": "Signature `s` parameter.", - "_v": "Signature `v` parameter." - } - }, - "ovmDELEGATECALL(uint256,address,bytes)": { - "params": { - "_address": "Address of the contract to call.", - "_calldata": "Data to send along with the call.", - "_gasLimit": "Amount of gas to be passed into this call." - }, - "returns": { - "_returndata": "Data returned by the call.", - "_success": "Whether or not the call returned (rather than reverted)." - } - }, - "ovmEXTCODECOPY(address,uint256,uint256)": { - "params": { - "_contract": "Address of the contract to copy code from.", - "_length": "Total number of bytes to copy from the contract's code.", - "_offset": "Offset in bytes from the start of contract code to copy beyond." - }, - "returns": { - "_code": "Bytes of code copied from the requested contract." - } - }, - "ovmEXTCODEHASH(address)": { - "params": { - "_contract": "Address of the contract to query the hash of." - }, - "returns": { - "_EXTCODEHASH": "Hash of the requested contract." - } - }, - "ovmEXTCODESIZE(address)": { - "params": { - "_contract": "Address of the contract to query the size of." - }, - "returns": { - "_EXTCODESIZE": "Size of the requested contract in bytes." - } - }, - "ovmGASLIMIT()": { - "returns": { - "_GASLIMIT": "Value of the block's GASLIMIT within the transaction context." - } - }, - "ovmGETNONCE()": { - "returns": { - "_nonce": "Nonce of the current contract." - } - }, - "ovmL1QUEUEORIGIN()": { - "returns": { - "_queueOrigin": "Address of the ovmL1QUEUEORIGIN within the current message context." - } - }, - "ovmL1TXORIGIN()": { - "returns": { - "_l1TxOrigin": "Address of the account which sent the tx into L2 from L1." - } - }, - "ovmNUMBER()": { - "returns": { - "_NUMBER": "Value of the NUMBER within the transaction context." - } - }, - "ovmREVERT(bytes)": { - "params": { - "_data": "Bytes data to pass along with the REVERT." - } - }, - "ovmSLOAD(bytes32)": { - "params": { - "_key": "32 byte key of the storage slot to load." - }, - "returns": { - "_value": "32 byte value of the requested storage slot." - } - }, - "ovmSSTORE(bytes32,bytes32)": { - "params": { - "_key": "32 byte key of the storage slot to set.", - "_value": "32 byte value for the storage slot." - } - }, - "ovmSTATICCALL(uint256,address,bytes)": { - "params": { - "_address": "Address of the contract to call.", - "_calldata": "Data to send along with the call.", - "_gasLimit": "Amount of gas to be passed into this call." - }, - "returns": { - "_returndata": "Data returned by the call.", - "_success": "Whether or not the call returned (rather than reverted)." - } - }, - "ovmTIMESTAMP()": { - "returns": { - "_TIMESTAMP": "Value of the TIMESTAMP within the transaction context." - } - }, - "resolve(string)": { - "params": { - "_name": "Name to resolve an address for." - }, - "returns": { - "_0": "Address associated with the given name." - } - }, - "run((uint256,uint256,uint8,address,address,uint256,bytes),address)": { - "params": { - "_ovmStateManager": "iOVM_StateManager implementation providing account state.", - "_transaction": "Transaction data to be executed." - } - }, - "safeCREATE(uint256,bytes,address)": { - "params": { - "_address": "OVM address being deployed to.", - "_creationCode": "Code to pass into CREATE for deployment.", - "_gasLimit": "Amount of gas to be passed into this creation." - } - }, - "simulateMessage((uint256,uint256,uint8,address,address,uint256,bytes),address,address)": { - "params": { - "_from": "the OVM account the simulated call should be from.", - "_transaction": "the message transaction to simulate." - } - } - }, - "title": "OVM_ExecutionManager", - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": { - "ovmADDRESS()": { - "notice": "Overrides ADDRESS." - }, - "ovmCALL(uint256,address,bytes)": { - "notice": "Overrides CALL." - }, - "ovmCALLER()": { - "notice": "Overrides CALLER." - }, - "ovmCHAINID()": { - "notice": "Overrides CHAINID." - }, - "ovmCREATE(bytes)": { - "notice": "Overrides CREATE." - }, - "ovmCREATE2(bytes,bytes32)": { - "notice": "Overrides CREATE2." - }, - "ovmCREATEEOA(bytes32,uint8,bytes32,bytes32)": { - "notice": "Creates a new EOA contract account, for account abstraction." - }, - "ovmDELEGATECALL(uint256,address,bytes)": { - "notice": "Overrides DELEGATECALL." - }, - "ovmEXTCODECOPY(address,uint256,uint256)": { - "notice": "Overrides EXTCODECOPY." - }, - "ovmEXTCODEHASH(address)": { - "notice": "Overrides EXTCODEHASH." - }, - "ovmEXTCODESIZE(address)": { - "notice": "Overrides EXTCODESIZE." - }, - "ovmGASLIMIT()": { - "notice": "Overrides GASLIMIT." - }, - "ovmGETNONCE()": { - "notice": "Retrieves the nonce of the current ovmADDRESS." - }, - "ovmINCREMENTNONCE()": { - "notice": "Bumps the nonce of the current ovmADDRESS by one." - }, - "ovmL1QUEUEORIGIN()": { - "notice": "Specifies from which L1 rollup queue this transaction originated from." - }, - "ovmL1TXORIGIN()": { - "notice": "Specifies which L1 account, if any, sent this transaction by calling enqueue()." - }, - "ovmNUMBER()": { - "notice": "Overrides NUMBER." - }, - "ovmREVERT(bytes)": { - "notice": "Overrides REVERT." - }, - "ovmSLOAD(bytes32)": { - "notice": "Overrides SLOAD." - }, - "ovmSSTORE(bytes32,bytes32)": { - "notice": "Overrides SSTORE." - }, - "ovmSTATICCALL(uint256,address,bytes)": { - "notice": "Overrides STATICCALL." - }, - "ovmTIMESTAMP()": { - "notice": "Overrides TIMESTAMP." - }, - "resolve(string)": { - "notice": "Resolves the address associated with a given name." - }, - "run((uint256,uint256,uint8,address,address,uint256,bytes),address)": { - "notice": "Starts the execution of a transaction via the OVM_ExecutionManager." - }, - "safeCREATE(uint256,bytes,address)": { - "notice": "Handles the creation-specific safety measures required for OVM contract deployment. This function sanitizes the return types for creation messages to match calls (bool, bytes), by being an external function which the EM can call, that mimics the success/fail case of the CREATE. This allows for consistent handling of both types of messages in _handleExternalMessage(). Having this step occur as a separate call frame also allows us to easily revert the contract deployment in the event that the code is unsafe. " - }, - "simulateMessage((uint256,uint256,uint8,address,address,uint256,bytes),address,address)": { - "notice": "Unreachable helper function for simulating eth_calls with an OVM message context. This function will throw an exception in all cases other than when used as a custom entrypoint in L2 Geth to simulate eth_call." - } - }, - "version": 1 - }, - "storageLayout": { - "storage": [ - { - "astId": 12557, - "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", - "label": "libAddressManager", - "offset": 0, - "slot": "0", - "type": "t_contract(Lib_AddressManager)12550" - }, - { - "astId": 4494, - "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", - "label": "ovmSafetyChecker", - "offset": 0, - "slot": "1", - "type": "t_contract(iOVM_SafetyChecker)11062" - }, - { - "astId": 4496, - "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", - "label": "ovmStateManager", - "offset": 0, - "slot": "2", - "type": "t_contract(iOVM_StateManager)11294" - }, - { - "astId": 4498, - "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", - "label": "gasMeterConfig", - "offset": 0, - "slot": "3", - "type": "t_struct(GasMeterConfig)10847_storage" - }, - { - "astId": 4500, - "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", - "label": "globalContext", - "offset": 0, - "slot": "7", - "type": "t_struct(GlobalContext)10850_storage" - }, - { - "astId": 4502, - "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", - "label": "transactionContext", - "offset": 0, - "slot": "8", - "type": "t_struct(TransactionContext)10863_storage" - }, - { - "astId": 4504, - "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", - "label": "messageContext", - "offset": 0, - "slot": "14", - "type": "t_struct(MessageContext)10873_storage" - }, - { - "astId": 4506, - "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", - "label": "transactionRecord", - "offset": 0, - "slot": "16", - "type": "t_struct(TransactionRecord)10866_storage" - }, - { - "astId": 4508, - "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", - "label": "messageRecord", - "offset": 0, - "slot": "17", - "type": "t_struct(MessageRecord)10876_storage" - } - ], - "types": { - "t_address": { - "encoding": "inplace", - "label": "address", - "numberOfBytes": "20" - }, - "t_bool": { - "encoding": "inplace", - "label": "bool", - "numberOfBytes": "1" - }, - "t_contract(Lib_AddressManager)12550": { - "encoding": "inplace", - "label": "contract Lib_AddressManager", - "numberOfBytes": "20" - }, - "t_contract(iOVM_SafetyChecker)11062": { - "encoding": "inplace", - "label": "contract iOVM_SafetyChecker", - "numberOfBytes": "20" - }, - "t_contract(iOVM_StateManager)11294": { - "encoding": "inplace", - "label": "contract iOVM_StateManager", - "numberOfBytes": "20" - }, - "t_enum(QueueOrigin)11860": { - "encoding": "inplace", - "label": "enum Lib_OVMCodec.QueueOrigin", - "numberOfBytes": "1" - }, - "t_struct(GasMeterConfig)10847_storage": { - "encoding": "inplace", - "label": "struct iOVM_ExecutionManager.GasMeterConfig", - "members": [ - { - "astId": 10840, - "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", - "label": "minTransactionGasLimit", - "offset": 0, - "slot": "0", - "type": "t_uint256" - }, - { - "astId": 10842, - "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", - "label": "maxTransactionGasLimit", - "offset": 0, - "slot": "1", - "type": "t_uint256" - }, - { - "astId": 10844, - "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", - "label": "maxGasPerQueuePerEpoch", - "offset": 0, - "slot": "2", - "type": "t_uint256" - }, - { - "astId": 10846, - "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", - "label": "secondsPerEpoch", - "offset": 0, - "slot": "3", - "type": "t_uint256" - } - ], - "numberOfBytes": "128" - }, - "t_struct(GlobalContext)10850_storage": { - "encoding": "inplace", - "label": "struct iOVM_ExecutionManager.GlobalContext", - "members": [ - { - "astId": 10849, - "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", - "label": "ovmCHAINID", - "offset": 0, - "slot": "0", - "type": "t_uint256" - } - ], - "numberOfBytes": "32" - }, - "t_struct(MessageContext)10873_storage": { - "encoding": "inplace", - "label": "struct iOVM_ExecutionManager.MessageContext", - "members": [ - { - "astId": 10868, - "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", - "label": "ovmCALLER", - "offset": 0, - "slot": "0", - "type": "t_address" - }, - { - "astId": 10870, - "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", - "label": "ovmADDRESS", - "offset": 0, - "slot": "1", - "type": "t_address" - }, - { - "astId": 10872, - "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", - "label": "isStatic", - "offset": 20, - "slot": "1", - "type": "t_bool" - } - ], - "numberOfBytes": "64" - }, - "t_struct(MessageRecord)10876_storage": { - "encoding": "inplace", - "label": "struct iOVM_ExecutionManager.MessageRecord", - "members": [ - { - "astId": 10875, - "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", - "label": "nuisanceGasLeft", - "offset": 0, - "slot": "0", - "type": "t_uint256" - } - ], - "numberOfBytes": "32" - }, - "t_struct(TransactionContext)10863_storage": { - "encoding": "inplace", - "label": "struct iOVM_ExecutionManager.TransactionContext", - "members": [ - { - "astId": 10852, - "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", - "label": "ovmL1QUEUEORIGIN", - "offset": 0, - "slot": "0", - "type": "t_enum(QueueOrigin)11860" - }, - { - "astId": 10854, - "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", - "label": "ovmTIMESTAMP", - "offset": 0, - "slot": "1", - "type": "t_uint256" - }, - { - "astId": 10856, - "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", - "label": "ovmNUMBER", - "offset": 0, - "slot": "2", - "type": "t_uint256" - }, - { - "astId": 10858, - "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", - "label": "ovmGASLIMIT", - "offset": 0, - "slot": "3", - "type": "t_uint256" - }, - { - "astId": 10860, - "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", - "label": "ovmTXGASLIMIT", - "offset": 0, - "slot": "4", - "type": "t_uint256" - }, - { - "astId": 10862, - "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", - "label": "ovmL1TXORIGIN", - "offset": 0, - "slot": "5", - "type": "t_address" - } - ], - "numberOfBytes": "192" - }, - "t_struct(TransactionRecord)10866_storage": { - "encoding": "inplace", - "label": "struct iOVM_ExecutionManager.TransactionRecord", - "members": [ - { - "astId": 10865, - "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", - "label": "ovmGasRefund", - "offset": 0, - "slot": "0", - "type": "t_uint256" - } - ], - "numberOfBytes": "32" - }, - "t_uint256": { - "encoding": "inplace", - "label": "uint256", - "numberOfBytes": "32" - } - } - } -} \ No newline at end of file diff --git a/packages/contracts/deployments/goerli-v2/OVM_FraudVerifier.json b/packages/contracts/deployments/goerli-v2/OVM_FraudVerifier.json deleted file mode 100644 index 276cf96b46b90..0000000000000 --- a/packages/contracts/deployments/goerli-v2/OVM_FraudVerifier.json +++ /dev/null @@ -1,576 +0,0 @@ -{ - "address": "0x08BB26333Ed18CcF632e2d68DdC9B5aFfb2EE687", - "abi": [ - { - "inputs": [ - { - "internalType": "address", - "name": "_libAddressManager", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "bytes32", - "name": "_preStateRoot", - "type": "bytes32" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_preStateRootIndex", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "bytes32", - "name": "_transactionHash", - "type": "bytes32" - }, - { - "indexed": false, - "internalType": "address", - "name": "_who", - "type": "address" - } - ], - "name": "FraudProofFinalized", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "bytes32", - "name": "_preStateRoot", - "type": "bytes32" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_preStateRootIndex", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "bytes32", - "name": "_transactionHash", - "type": "bytes32" - }, - { - "indexed": false, - "internalType": "address", - "name": "_who", - "type": "address" - } - ], - "name": "FraudProofInitialized", - "type": "event" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "_preStateRoot", - "type": "bytes32" - }, - { - "components": [ - { - "internalType": "uint256", - "name": "batchIndex", - "type": "uint256" - }, - { - "internalType": "bytes32", - "name": "batchRoot", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "batchSize", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "prevTotalElements", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "extraData", - "type": "bytes" - } - ], - "internalType": "struct Lib_OVMCodec.ChainBatchHeader", - "name": "_preStateRootBatchHeader", - "type": "tuple" - }, - { - "components": [ - { - "internalType": "uint256", - "name": "index", - "type": "uint256" - }, - { - "internalType": "bytes32[]", - "name": "siblings", - "type": "bytes32[]" - } - ], - "internalType": "struct Lib_OVMCodec.ChainInclusionProof", - "name": "_preStateRootProof", - "type": "tuple" - }, - { - "internalType": "bytes32", - "name": "_txHash", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "_postStateRoot", - "type": "bytes32" - }, - { - "components": [ - { - "internalType": "uint256", - "name": "batchIndex", - "type": "uint256" - }, - { - "internalType": "bytes32", - "name": "batchRoot", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "batchSize", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "prevTotalElements", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "extraData", - "type": "bytes" - } - ], - "internalType": "struct Lib_OVMCodec.ChainBatchHeader", - "name": "_postStateRootBatchHeader", - "type": "tuple" - }, - { - "components": [ - { - "internalType": "uint256", - "name": "index", - "type": "uint256" - }, - { - "internalType": "bytes32[]", - "name": "siblings", - "type": "bytes32[]" - } - ], - "internalType": "struct Lib_OVMCodec.ChainInclusionProof", - "name": "_postStateRootProof", - "type": "tuple" - } - ], - "name": "finalizeFraudVerification", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "_preStateRoot", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "_txHash", - "type": "bytes32" - } - ], - "name": "getStateTransitioner", - "outputs": [ - { - "internalType": "contract iOVM_StateTransitioner", - "name": "_transitioner", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "_preStateRoot", - "type": "bytes32" - }, - { - "components": [ - { - "internalType": "uint256", - "name": "batchIndex", - "type": "uint256" - }, - { - "internalType": "bytes32", - "name": "batchRoot", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "batchSize", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "prevTotalElements", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "extraData", - "type": "bytes" - } - ], - "internalType": "struct Lib_OVMCodec.ChainBatchHeader", - "name": "_preStateRootBatchHeader", - "type": "tuple" - }, - { - "components": [ - { - "internalType": "uint256", - "name": "index", - "type": "uint256" - }, - { - "internalType": "bytes32[]", - "name": "siblings", - "type": "bytes32[]" - } - ], - "internalType": "struct Lib_OVMCodec.ChainInclusionProof", - "name": "_preStateRootProof", - "type": "tuple" - }, - { - "components": [ - { - "internalType": "uint256", - "name": "timestamp", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "blockNumber", - "type": "uint256" - }, - { - "internalType": "enum Lib_OVMCodec.QueueOrigin", - "name": "l1QueueOrigin", - "type": "uint8" - }, - { - "internalType": "address", - "name": "l1TxOrigin", - "type": "address" - }, - { - "internalType": "address", - "name": "entrypoint", - "type": "address" - }, - { - "internalType": "uint256", - "name": "gasLimit", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "data", - "type": "bytes" - } - ], - "internalType": "struct Lib_OVMCodec.Transaction", - "name": "_transaction", - "type": "tuple" - }, - { - "components": [ - { - "internalType": "bool", - "name": "isSequenced", - "type": "bool" - }, - { - "internalType": "uint256", - "name": "queueIndex", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "timestamp", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "blockNumber", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "txData", - "type": "bytes" - } - ], - "internalType": "struct Lib_OVMCodec.TransactionChainElement", - "name": "_txChainElement", - "type": "tuple" - }, - { - "components": [ - { - "internalType": "uint256", - "name": "batchIndex", - "type": "uint256" - }, - { - "internalType": "bytes32", - "name": "batchRoot", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "batchSize", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "prevTotalElements", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "extraData", - "type": "bytes" - } - ], - "internalType": "struct Lib_OVMCodec.ChainBatchHeader", - "name": "_transactionBatchHeader", - "type": "tuple" - }, - { - "components": [ - { - "internalType": "uint256", - "name": "index", - "type": "uint256" - }, - { - "internalType": "bytes32[]", - "name": "siblings", - "type": "bytes32[]" - } - ], - "internalType": "struct Lib_OVMCodec.ChainInclusionProof", - "name": "_transactionProof", - "type": "tuple" - } - ], - "name": "initializeFraudVerification", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "libAddressManager", - "outputs": [ - { - "internalType": "contract Lib_AddressManager", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "string", - "name": "_name", - "type": "string" - } - ], - "name": "resolve", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - } - ], - "transactionHash": "0x5d2d769147b43708700c13426ed3a2c6c3cac3e857ae416c2f37e99dd40b1746", - "receipt": { - "to": null, - "from": "0x558ba9b8d78713fbf768c1f8a584485B4003f43F", - "contractAddress": "0x08BB26333Ed18CcF632e2d68DdC9B5aFfb2EE687", - "transactionIndex": 53, - "gasUsed": "1386986", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0x9829a0c79485c5f7cb4af5c1f43c4b1200a4903fd2e75cd38542d12804f1d641", - "transactionHash": "0x5d2d769147b43708700c13426ed3a2c6c3cac3e857ae416c2f37e99dd40b1746", - "logs": [], - "blockNumber": 4607716, - "cumulativeGasUsed": "7896194", - "status": 1, - "byzantium": true - }, - "args": [ - "0x9933d137bBF050Cf3D7555fE1beC91eF698814e5" - ], - "solcInputHash": "8aef3555d89ad9d3af2f5d28a85dc856", - "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"_preStateRoot\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_preStateRootIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"_transactionHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_who\",\"type\":\"address\"}],\"name\":\"FraudProofFinalized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"_preStateRoot\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_preStateRootIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"_transactionHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_who\",\"type\":\"address\"}],\"name\":\"FraudProofInitialized\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_preStateRoot\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"_preStateRootBatchHeader\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"siblings\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct Lib_OVMCodec.ChainInclusionProof\",\"name\":\"_preStateRootProof\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"_txHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"_postStateRoot\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"_postStateRootBatchHeader\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"siblings\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct Lib_OVMCodec.ChainInclusionProof\",\"name\":\"_postStateRootProof\",\"type\":\"tuple\"}],\"name\":\"finalizeFraudVerification\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_preStateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"_txHash\",\"type\":\"bytes32\"}],\"name\":\"getStateTransitioner\",\"outputs\":[{\"internalType\":\"contract iOVM_StateTransitioner\",\"name\":\"_transitioner\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_preStateRoot\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"_preStateRootBatchHeader\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"siblings\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct Lib_OVMCodec.ChainInclusionProof\",\"name\":\"_preStateRootProof\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"enum Lib_OVMCodec.QueueOrigin\",\"name\":\"l1QueueOrigin\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"l1TxOrigin\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"entrypoint\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.Transaction\",\"name\":\"_transaction\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isSequenced\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"queueIndex\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"txData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.TransactionChainElement\",\"name\":\"_txChainElement\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"_transactionBatchHeader\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"siblings\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct Lib_OVMCodec.ChainInclusionProof\",\"name\":\"_transactionProof\",\"type\":\"tuple\"}],\"name\":\"initializeFraudVerification\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The Fraud Verifier contract coordinates the entire fraud proof verification process. If the fraud proof was successful it prunes any state batches from State Commitment Chain which were published after the fraudulent state root. Compiler used: solc Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\"}},\"finalizeFraudVerification(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes32,bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))\":{\"params\":{\"_postStateRoot\":\"State root after the fraudulent transaction.\",\"_postStateRootBatchHeader\":\"Batch header for the provided post-state root.\",\"_postStateRootProof\":\"Inclusion proof for the provided post-state root.\",\"_preStateRoot\":\"State root before the fraudulent transaction.\",\"_preStateRootBatchHeader\":\"Batch header for the provided pre-state root.\",\"_preStateRootProof\":\"Inclusion proof for the provided pre-state root.\",\"_txHash\":\"The transaction for the state root\"}},\"getStateTransitioner(bytes32,bytes32)\":{\"params\":{\"_preStateRoot\":\"State root to query a transitioner for.\"},\"returns\":{\"_transitioner\":\"Corresponding state transitioner contract.\"}},\"initializeFraudVerification(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),(uint256,uint256,uint8,address,address,uint256,bytes),(bool,uint256,uint256,uint256,bytes),(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))\":{\"params\":{\"_preStateRoot\":\"State root before the fraudulent transaction.\",\"_preStateRootBatchHeader\":\"Batch header for the provided pre-state root.\",\"_preStateRootProof\":\"Inclusion proof for the provided pre-state root.\",\"_transaction\":\"OVM transaction claimed to be fraudulent.\",\"_transactionBatchHeader\":\"Batch header for the provided transaction.\",\"_transactionProof\":\"Inclusion proof for the provided transaction.\",\"_txChainElement\":\"OVM transaction chain element.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}}},\"title\":\"OVM_FraudVerifier\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"finalizeFraudVerification(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes32,bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))\":{\"notice\":\"Finalizes the fraud verification process.\"},\"getStateTransitioner(bytes32,bytes32)\":{\"notice\":\"Retrieves the state transitioner for a given root.\"},\"initializeFraudVerification(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),(uint256,uint256,uint8,address,address,uint256,bytes),(bool,uint256,uint256,uint256,bytes),(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))\":{\"notice\":\"Begins the fraud verification process.\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/OVM/verification/OVM_FraudVerifier.sol\":\"OVM_FraudVerifier\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/optimistic-ethereum/OVM/verification/Abs_FraudContributor.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\nimport { iOVM_BondManager } from \\\"../../iOVM/verification/iOVM_BondManager.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/// Minimal contract to be inherited by contracts consumed by users that provide\\n/// data for fraud proofs\\nabstract contract Abs_FraudContributor is Lib_AddressResolver {\\n /// Decorate your functions with this modifier to store how much total gas was\\n /// consumed by the sender, to reward users fairly\\n modifier contributesToFraudProof(bytes32 preStateRoot, bytes32 txHash) {\\n uint256 startGas = gasleft();\\n _;\\n uint256 gasSpent = startGas - gasleft();\\n iOVM_BondManager(resolve('OVM_BondManager')).recordGasSpent(preStateRoot, txHash, msg.sender, gasSpent);\\n }\\n}\\n\",\"keccak256\":\"0x6c27d089a297103cb93b30f7649ab68691cc6b948c315f1037e5de1fe9bf5903\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/verification/OVM_FraudVerifier.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_FraudVerifier } from \\\"../../iOVM/verification/iOVM_FraudVerifier.sol\\\";\\nimport { iOVM_StateTransitioner } from \\\"../../iOVM/verification/iOVM_StateTransitioner.sol\\\";\\nimport { iOVM_StateTransitionerFactory } from \\\"../../iOVM/verification/iOVM_StateTransitionerFactory.sol\\\";\\nimport { iOVM_BondManager } from \\\"../../iOVM/verification/iOVM_BondManager.sol\\\";\\nimport { iOVM_StateCommitmentChain } from \\\"../../iOVM/chain/iOVM_StateCommitmentChain.sol\\\";\\nimport { iOVM_CanonicalTransactionChain } from \\\"../../iOVM/chain/iOVM_CanonicalTransactionChain.sol\\\";\\n\\n/* Contract Imports */\\nimport { Abs_FraudContributor } from \\\"./Abs_FraudContributor.sol\\\";\\n\\n\\n\\n/**\\n * @title OVM_FraudVerifier\\n * @dev The Fraud Verifier contract coordinates the entire fraud proof verification process. \\n * If the fraud proof was successful it prunes any state batches from State Commitment Chain\\n * which were published after the fraudulent state root.\\n * \\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract OVM_FraudVerifier is Lib_AddressResolver, Abs_FraudContributor, iOVM_FraudVerifier {\\n\\n /*******************************************\\n * Contract Variables: Internal Accounting *\\n *******************************************/\\n\\n mapping (bytes32 => iOVM_StateTransitioner) internal transitioners;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n */\\n constructor(\\n address _libAddressManager\\n )\\n Lib_AddressResolver(_libAddressManager)\\n {}\\n\\n\\n /***************************************\\n * Public Functions: Transition Status *\\n ***************************************/\\n\\n /**\\n * Retrieves the state transitioner for a given root.\\n * @param _preStateRoot State root to query a transitioner for.\\n * @return _transitioner Corresponding state transitioner contract.\\n */\\n function getStateTransitioner(\\n bytes32 _preStateRoot,\\n bytes32 _txHash\\n )\\n override\\n public\\n view\\n returns (\\n iOVM_StateTransitioner _transitioner\\n )\\n {\\n return transitioners[keccak256(abi.encodePacked(_preStateRoot, _txHash))];\\n }\\n\\n\\n /****************************************\\n * Public Functions: Fraud Verification *\\n ****************************************/\\n\\n /**\\n * Begins the fraud verification process.\\n * @param _preStateRoot State root before the fraudulent transaction.\\n * @param _preStateRootBatchHeader Batch header for the provided pre-state root.\\n * @param _preStateRootProof Inclusion proof for the provided pre-state root.\\n * @param _transaction OVM transaction claimed to be fraudulent.\\n * @param _txChainElement OVM transaction chain element.\\n * @param _transactionBatchHeader Batch header for the provided transaction.\\n * @param _transactionProof Inclusion proof for the provided transaction.\\n */\\n function initializeFraudVerification(\\n bytes32 _preStateRoot,\\n Lib_OVMCodec.ChainBatchHeader memory _preStateRootBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _preStateRootProof,\\n Lib_OVMCodec.Transaction memory _transaction,\\n Lib_OVMCodec.TransactionChainElement memory _txChainElement,\\n Lib_OVMCodec.ChainBatchHeader memory _transactionBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _transactionProof\\n )\\n override\\n public\\n contributesToFraudProof(_preStateRoot, Lib_OVMCodec.hashTransaction(_transaction))\\n {\\n bytes32 _txHash = Lib_OVMCodec.hashTransaction(_transaction);\\n\\n if (_hasStateTransitioner(_preStateRoot, _txHash)) {\\n return;\\n }\\n\\n iOVM_StateCommitmentChain ovmStateCommitmentChain = iOVM_StateCommitmentChain(resolve(\\\"OVM_StateCommitmentChain\\\"));\\n iOVM_CanonicalTransactionChain ovmCanonicalTransactionChain = iOVM_CanonicalTransactionChain(resolve(\\\"OVM_CanonicalTransactionChain\\\"));\\n\\n require(\\n ovmStateCommitmentChain.verifyStateCommitment(\\n _preStateRoot,\\n _preStateRootBatchHeader,\\n _preStateRootProof\\n ),\\n \\\"Invalid pre-state root inclusion proof.\\\"\\n );\\n\\n require(\\n ovmCanonicalTransactionChain.verifyTransaction(\\n _transaction,\\n _txChainElement,\\n _transactionBatchHeader,\\n _transactionProof\\n ),\\n \\\"Invalid transaction inclusion proof.\\\"\\n );\\n\\n require (\\n _preStateRootBatchHeader.prevTotalElements + _preStateRootProof.index + 1 == _transactionBatchHeader.prevTotalElements + _transactionProof.index,\\n \\\"Pre-state root global index must equal to the transaction root global index.\\\"\\n );\\n\\n _deployTransitioner(_preStateRoot, _txHash, _preStateRootProof.index);\\n\\n emit FraudProofInitialized(\\n _preStateRoot,\\n _preStateRootProof.index,\\n _txHash,\\n msg.sender\\n );\\n }\\n\\n /**\\n * Finalizes the fraud verification process.\\n * @param _preStateRoot State root before the fraudulent transaction.\\n * @param _preStateRootBatchHeader Batch header for the provided pre-state root.\\n * @param _preStateRootProof Inclusion proof for the provided pre-state root.\\n * @param _txHash The transaction for the state root\\n * @param _postStateRoot State root after the fraudulent transaction.\\n * @param _postStateRootBatchHeader Batch header for the provided post-state root.\\n * @param _postStateRootProof Inclusion proof for the provided post-state root.\\n */\\n function finalizeFraudVerification(\\n bytes32 _preStateRoot,\\n Lib_OVMCodec.ChainBatchHeader memory _preStateRootBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _preStateRootProof,\\n bytes32 _txHash,\\n bytes32 _postStateRoot,\\n Lib_OVMCodec.ChainBatchHeader memory _postStateRootBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _postStateRootProof\\n )\\n override\\n public\\n contributesToFraudProof(_preStateRoot, _txHash)\\n {\\n iOVM_StateTransitioner transitioner = getStateTransitioner(_preStateRoot, _txHash);\\n iOVM_StateCommitmentChain ovmStateCommitmentChain = iOVM_StateCommitmentChain(resolve(\\\"OVM_StateCommitmentChain\\\"));\\n\\n require(\\n transitioner.isComplete() == true,\\n \\\"State transition process must be completed prior to finalization.\\\"\\n );\\n\\n require (\\n _postStateRootBatchHeader.prevTotalElements + _postStateRootProof.index == _preStateRootBatchHeader.prevTotalElements + _preStateRootProof.index + 1,\\n \\\"Post-state root global index must equal to the pre state root global index plus one.\\\"\\n );\\n\\n require(\\n ovmStateCommitmentChain.verifyStateCommitment(\\n _preStateRoot,\\n _preStateRootBatchHeader,\\n _preStateRootProof\\n ),\\n \\\"Invalid pre-state root inclusion proof.\\\"\\n );\\n\\n require(\\n ovmStateCommitmentChain.verifyStateCommitment(\\n _postStateRoot,\\n _postStateRootBatchHeader,\\n _postStateRootProof\\n ),\\n \\\"Invalid post-state root inclusion proof.\\\"\\n );\\n\\n // If the post state root did not match, then there was fraud and we should delete the batch\\n require(\\n _postStateRoot != transitioner.getPostStateRoot(),\\n \\\"State transition has not been proven fraudulent.\\\"\\n );\\n \\n _cancelStateTransition(_postStateRootBatchHeader, _preStateRoot);\\n\\n // TEMPORARY: Remove the transitioner; for minnet.\\n transitioners[keccak256(abi.encodePacked(_preStateRoot, _txHash))] = iOVM_StateTransitioner(0x0000000000000000000000000000000000000000);\\n\\n emit FraudProofFinalized(\\n _preStateRoot,\\n _preStateRootProof.index,\\n _txHash,\\n msg.sender\\n );\\n }\\n\\n\\n /************************************\\n * Internal Functions: Verification *\\n ************************************/\\n\\n /**\\n * Checks whether a transitioner already exists for a given pre-state root.\\n * @param _preStateRoot Pre-state root to check.\\n * @return _exists Whether or not we already have a transitioner for the root.\\n */\\n function _hasStateTransitioner(\\n bytes32 _preStateRoot,\\n bytes32 _txHash\\n )\\n internal\\n view\\n returns (\\n bool _exists\\n )\\n {\\n return address(getStateTransitioner(_preStateRoot, _txHash)) != address(0);\\n }\\n\\n /**\\n * Deploys a new state transitioner.\\n * @param _preStateRoot Pre-state root to initialize the transitioner with.\\n * @param _txHash Hash of the transaction this transitioner will execute.\\n * @param _stateTransitionIndex Index of the transaction in the chain.\\n */\\n function _deployTransitioner(\\n bytes32 _preStateRoot,\\n bytes32 _txHash,\\n uint256 _stateTransitionIndex\\n )\\n internal\\n {\\n transitioners[keccak256(abi.encodePacked(_preStateRoot, _txHash))] = iOVM_StateTransitionerFactory(\\n resolve(\\\"OVM_StateTransitionerFactory\\\")\\n ).create(\\n address(libAddressManager),\\n _stateTransitionIndex,\\n _preStateRoot,\\n _txHash\\n );\\n }\\n\\n /**\\n * Removes a state transition from the state commitment chain.\\n * @param _postStateRootBatchHeader Header for the post-state root.\\n * @param _preStateRoot Pre-state root hash.\\n */\\n function _cancelStateTransition(\\n Lib_OVMCodec.ChainBatchHeader memory _postStateRootBatchHeader,\\n bytes32 _preStateRoot\\n )\\n internal\\n {\\n iOVM_StateCommitmentChain ovmStateCommitmentChain = iOVM_StateCommitmentChain(resolve(\\\"OVM_StateCommitmentChain\\\"));\\n iOVM_BondManager ovmBondManager = iOVM_BondManager(resolve(\\\"OVM_BondManager\\\"));\\n\\n // Delete the state batch.\\n ovmStateCommitmentChain.deleteStateBatch(\\n _postStateRootBatchHeader\\n );\\n\\n // Get the timestamp and publisher for that block.\\n (uint256 timestamp, address publisher) = abi.decode(_postStateRootBatchHeader.extraData, (uint256, address));\\n\\n // Slash the bonds at the bond manager.\\n ovmBondManager.finalize(\\n _preStateRoot,\\n publisher,\\n timestamp\\n );\\n }\\n}\\n\",\"keccak256\":\"0x5a0ee382d8b4a7aa46d3c52f10005e58b374ddf2113dd7e0113591477c4cfa04\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_CanonicalTransactionChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_ChainStorageContainer } from \\\"./iOVM_ChainStorageContainer.sol\\\";\\n\\n/**\\n * @title iOVM_CanonicalTransactionChain\\n */\\ninterface iOVM_CanonicalTransactionChain {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event TransactionEnqueued(\\n address _l1TxOrigin,\\n address _target,\\n uint256 _gasLimit,\\n bytes _data,\\n uint256 _queueIndex,\\n uint256 _timestamp\\n );\\n\\n event QueueBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event SequencerBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event TransactionBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct BatchContext {\\n uint256 numSequencedTransactions;\\n uint256 numSubsequentQueueTransactions;\\n uint256 timestamp;\\n uint256 blockNumber;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n\\n /**\\n * Accesses the batch storage container.\\n * @return Reference to the batch storage container.\\n */\\n function batches()\\n external\\n view\\n returns (\\n iOVM_ChainStorageContainer\\n );\\n\\n /**\\n * Accesses the queue storage container.\\n * @return Reference to the queue storage container.\\n */\\n function queue()\\n external\\n view\\n returns (\\n iOVM_ChainStorageContainer\\n );\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements()\\n external\\n view\\n returns (\\n uint256 _totalElements\\n );\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches()\\n external\\n view\\n returns (\\n uint256 _totalBatches\\n );\\n\\n /**\\n * Returns the index of the next element to be enqueued.\\n * @return Index for the next queue element.\\n */\\n function getNextQueueIndex()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Gets the queue element at a particular index.\\n * @param _index Index of the queue element to access.\\n * @return _element Queue element at the given index.\\n */\\n function getQueueElement(\\n uint256 _index\\n )\\n external\\n view\\n returns (\\n Lib_OVMCodec.QueueElement memory _element\\n );\\n\\n /**\\n * Returns the timestamp of the last transaction.\\n * @return Timestamp for the last transaction.\\n */\\n function getLastTimestamp()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Returns the blocknumber of the last transaction.\\n * @return Blocknumber for the last transaction.\\n */\\n function getLastBlockNumber()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Get the number of queue elements which have not yet been included.\\n * @return Number of pending queue elements.\\n */\\n function getNumPendingQueueElements()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Retrieves the length of the queue, including\\n * both pending and canonical transactions.\\n * @return Length of the queue.\\n */\\n function getQueueLength()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n\\n /**\\n * Adds a transaction to the queue.\\n * @param _target Target contract to send the transaction to.\\n * @param _gasLimit Gas limit for the given transaction.\\n * @param _data Transaction data.\\n */\\n function enqueue(\\n address _target,\\n uint256 _gasLimit,\\n bytes memory _data\\n )\\n external;\\n\\n /**\\n * Appends a given number of queued transactions as a single batch.\\n * @param _numQueuedTransactions Number of transactions to append.\\n */\\n function appendQueueBatch(\\n uint256 _numQueuedTransactions\\n )\\n external;\\n\\n /**\\n * Allows the sequencer to append a batch of transactions.\\n * @dev This function uses a custom encoding scheme for efficiency reasons.\\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\\n * .param _contexts Array of batch contexts.\\n * .param _transactionDataFields Array of raw transaction data.\\n */\\n function appendSequencerBatch(\\n // uint40 _shouldStartAtElement,\\n // uint24 _totalElementsToAppend,\\n // BatchContext[] _contexts,\\n // bytes[] _transactionDataFields\\n )\\n external;\\n\\n /**\\n * Verifies whether a transaction is included in the chain.\\n * @param _transaction Transaction to verify.\\n * @param _txChainElement Transaction chain element corresponding to the transaction.\\n * @param _batchHeader Header of the batch the transaction was included in.\\n * @param _inclusionProof Inclusion proof for the provided transaction chain element.\\n * @return True if the transaction exists in the CTC, false if not.\\n */\\n function verifyTransaction(\\n Lib_OVMCodec.Transaction memory _transaction,\\n Lib_OVMCodec.TransactionChainElement memory _txChainElement,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _inclusionProof\\n )\\n external\\n view\\n returns (\\n bool\\n );\\n}\\n\",\"keccak256\":\"0xb5e55488a1982841c07cdf5ff475da4789596f111dd48f01b1918ee4c775cf3a\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_ChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title iOVM_ChainStorageContainer\\n */\\ninterface iOVM_ChainStorageContainer {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata()\\n external\\n view\\n returns (\\n bytes27\\n );\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length()\\n external\\n view\\n returns (\\n uint256\\n );\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(\\n bytes32 _object\\n )\\n external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(\\n bytes32 _object,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(\\n uint256 _index\\n )\\n external\\n view\\n returns (\\n bytes32\\n );\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index\\n )\\n external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Marks an index as overwritable, meaing the underlying buffer can start to write values over\\n * any objects before and including the given index.\\n */\\n function setNextOverwritableIndex(\\n uint256 _index\\n )\\n external;\\n}\\n\",\"keccak256\":\"0x2d7973a0ad84c23ec62624d3f1e3aeb198cc72686ff1e6cfa17155556b320c94\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_StateCommitmentChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title iOVM_StateCommitmentChain\\n */\\ninterface iOVM_StateCommitmentChain {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event StateBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n event StateBatchDeleted(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot\\n );\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements()\\n external\\n view\\n returns (\\n uint256 _totalElements\\n );\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches()\\n external\\n view\\n returns (\\n uint256 _totalBatches\\n );\\n\\n /**\\n * Retrieves the timestamp of the last batch submitted by the sequencer.\\n * @return _lastSequencerTimestamp Last sequencer batch timestamp.\\n */\\n function getLastSequencerTimestamp()\\n external\\n view\\n returns (\\n uint256 _lastSequencerTimestamp\\n );\\n\\n /**\\n * Appends a batch of state roots to the chain.\\n * @param _batch Batch of state roots.\\n * @param _shouldStartAtElement Index of the element at which this batch should start.\\n */\\n function appendStateBatch(\\n bytes32[] calldata _batch,\\n uint256 _shouldStartAtElement\\n )\\n external;\\n\\n /**\\n * Deletes all state roots after (and including) a given batch.\\n * @param _batchHeader Header of the batch to start deleting from.\\n */\\n function deleteStateBatch(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n external;\\n\\n /**\\n * Verifies a batch inclusion proof.\\n * @param _element Hash of the element to verify a proof for.\\n * @param _batchHeader Header of the batch in which the element was included.\\n * @param _proof Merkle inclusion proof for the element.\\n */\\n function verifyStateCommitment(\\n bytes32 _element,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _proof\\n )\\n external\\n view\\n returns (\\n bool _verified\\n );\\n\\n /**\\n * Checks whether a given batch is still inside its fraud proof window.\\n * @param _batchHeader Header of the batch to check.\\n * @return _inside Whether or not the batch is inside the fraud proof window.\\n */\\n function insideFraudProofWindow(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n external\\n view\\n returns (\\n bool _inside\\n );\\n}\\n\",\"keccak256\":\"0x6646d6ff392b81aab52a7a277e91540819464751de0af5afd1962094b2e92448\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/verification/iOVM_BondManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\ninterface ERC20 {\\n function transfer(address, uint256) external returns (bool);\\n function transferFrom(address, address, uint256) external returns (bool);\\n}\\n\\n/// All the errors which may be encountered on the bond manager\\nlibrary Errors {\\n string constant ERC20_ERR = \\\"BondManager: Could not post bond\\\";\\n string constant ALREADY_FINALIZED = \\\"BondManager: Fraud proof for this pre-state root has already been finalized\\\";\\n string constant SLASHED = \\\"BondManager: Cannot finalize withdrawal, you probably got slashed\\\";\\n string constant WRONG_STATE = \\\"BondManager: Wrong bond state for proposer\\\";\\n string constant CANNOT_CLAIM = \\\"BondManager: Cannot claim yet. Dispute must be finalized first\\\";\\n\\n string constant WITHDRAWAL_PENDING = \\\"BondManager: Withdrawal already pending\\\";\\n string constant TOO_EARLY = \\\"BondManager: Too early to finalize your withdrawal\\\";\\n\\n string constant ONLY_TRANSITIONER = \\\"BondManager: Only the transitioner for this pre-state root may call this function\\\";\\n string constant ONLY_FRAUD_VERIFIER = \\\"BondManager: Only the fraud verifier may call this function\\\";\\n string constant ONLY_STATE_COMMITMENT_CHAIN = \\\"BondManager: Only the state commitment chain may call this function\\\";\\n string constant WAIT_FOR_DISPUTES = \\\"BondManager: Wait for other potential disputes\\\";\\n}\\n\\n/**\\n * @title iOVM_BondManager\\n */\\ninterface iOVM_BondManager {\\n\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n /// The lifecycle of a proposer's bond\\n enum State {\\n // Before depositing or after getting slashed, a user is uncollateralized\\n NOT_COLLATERALIZED,\\n // After depositing, a user is collateralized\\n COLLATERALIZED,\\n // After a user has initiated a withdrawal\\n WITHDRAWING\\n }\\n\\n /// A bond posted by a proposer\\n struct Bond {\\n // The user's state\\n State state;\\n // The timestamp at which a proposer issued their withdrawal request\\n uint32 withdrawalTimestamp;\\n // The time when the first disputed was initiated for this bond\\n uint256 firstDisputeAt;\\n // The earliest observed state root for this bond which has had fraud\\n bytes32 earliestDisputedStateRoot;\\n // The state root's timestamp\\n uint256 earliestTimestamp;\\n }\\n\\n // Per pre-state root, store the number of state provisions that were made\\n // and how many of these calls were made by each user. Payouts will then be\\n // claimed by users proportionally for that dispute.\\n struct Rewards {\\n // Flag to check if rewards for a fraud proof are claimable\\n bool canClaim;\\n // Total number of `recordGasSpent` calls made\\n uint256 total;\\n // The gas spent by each user to provide witness data. The sum of all\\n // values inside this map MUST be equal to the value of `total`\\n mapping(address => uint256) gasSpent;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function recordGasSpent(\\n bytes32 _preStateRoot,\\n bytes32 _txHash,\\n address _who,\\n uint256 _gasSpent\\n ) external;\\n\\n function finalize(\\n bytes32 _preStateRoot,\\n address _publisher,\\n uint256 _timestamp\\n ) external;\\n\\n function deposit() external;\\n\\n function startWithdrawal() external;\\n\\n function finalizeWithdrawal() external;\\n\\n function claim(\\n address _who\\n ) external;\\n\\n function isCollateralized(\\n address _who\\n ) external view returns (bool);\\n\\n function getGasSpent(\\n bytes32 _preStateRoot,\\n address _who\\n ) external view returns (uint256);\\n}\\n\",\"keccak256\":\"0x3c2a8a399487857158649db1896749d86e39cba545a8aeb2e2bb0f3bdfa7a5b1\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/verification/iOVM_FraudVerifier.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_StateTransitioner } from \\\"./iOVM_StateTransitioner.sol\\\";\\n\\n/**\\n * @title iOVM_FraudVerifier\\n */\\ninterface iOVM_FraudVerifier {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event FraudProofInitialized(\\n bytes32 _preStateRoot,\\n uint256 _preStateRootIndex,\\n bytes32 _transactionHash,\\n address _who\\n );\\n\\n event FraudProofFinalized(\\n bytes32 _preStateRoot,\\n uint256 _preStateRootIndex,\\n bytes32 _transactionHash,\\n address _who\\n );\\n\\n\\n /***************************************\\n * Public Functions: Transition Status *\\n ***************************************/\\n\\n function getStateTransitioner(bytes32 _preStateRoot, bytes32 _txHash) external view returns (iOVM_StateTransitioner _transitioner);\\n\\n\\n /****************************************\\n * Public Functions: Fraud Verification *\\n ****************************************/\\n\\n function initializeFraudVerification(\\n bytes32 _preStateRoot,\\n Lib_OVMCodec.ChainBatchHeader calldata _preStateRootBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof calldata _preStateRootProof,\\n Lib_OVMCodec.Transaction calldata _transaction,\\n Lib_OVMCodec.TransactionChainElement calldata _txChainElement,\\n Lib_OVMCodec.ChainBatchHeader calldata _transactionBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof calldata _transactionProof\\n ) external;\\n\\n function finalizeFraudVerification(\\n bytes32 _preStateRoot,\\n Lib_OVMCodec.ChainBatchHeader calldata _preStateRootBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof calldata _preStateRootProof,\\n bytes32 _txHash,\\n bytes32 _postStateRoot,\\n Lib_OVMCodec.ChainBatchHeader calldata _postStateRootBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof calldata _postStateRootProof\\n ) external;\\n}\\n\",\"keccak256\":\"0x5efd7bb18164bbd3e9d58379e8203fbf2a7ee802b1a48dff3ceaaec1523b1751\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/verification/iOVM_StateTransitioner.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title iOVM_StateTransitioner\\n */\\ninterface iOVM_StateTransitioner {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AccountCommitted(\\n address _address\\n );\\n\\n event ContractStorageCommitted(\\n address _address,\\n bytes32 _key\\n );\\n\\n\\n /**********************************\\n * Public Functions: State Access *\\n **********************************/\\n\\n function getPreStateRoot() external view returns (bytes32 _preStateRoot);\\n function getPostStateRoot() external view returns (bytes32 _postStateRoot);\\n function isComplete() external view returns (bool _complete);\\n\\n\\n /***********************************\\n * Public Functions: Pre-Execution *\\n ***********************************/\\n\\n function proveContractState(\\n address _ovmContractAddress,\\n address _ethContractAddress,\\n bytes calldata _stateTrieWitness\\n ) external;\\n\\n function proveStorageSlot(\\n address _ovmContractAddress,\\n bytes32 _key,\\n bytes calldata _storageTrieWitness\\n ) external;\\n\\n\\n /*******************************\\n * Public Functions: Execution *\\n *******************************/\\n\\n function applyTransaction(\\n Lib_OVMCodec.Transaction calldata _transaction\\n ) external;\\n\\n\\n /************************************\\n * Public Functions: Post-Execution *\\n ************************************/\\n\\n function commitContractState(\\n address _ovmContractAddress,\\n bytes calldata _stateTrieWitness\\n ) external;\\n\\n function commitStorageSlot(\\n address _ovmContractAddress,\\n bytes32 _key,\\n bytes calldata _storageTrieWitness\\n ) external;\\n\\n\\n /**********************************\\n * Public Functions: Finalization *\\n **********************************/\\n\\n function completeTransition() external;\\n}\\n\",\"keccak256\":\"0x3d044ac0a3bb6ad3d529f904b3191117511f9c379678ca03010e1ebdfcb5c34b\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/verification/iOVM_StateTransitionerFactory.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Contract Imports */\\nimport { iOVM_StateTransitioner } from \\\"./iOVM_StateTransitioner.sol\\\";\\n\\n/**\\n * @title iOVM_StateTransitionerFactory\\n */\\ninterface iOVM_StateTransitionerFactory {\\n\\n /***************************************\\n * Public Functions: Contract Creation *\\n ***************************************/\\n\\n function create(\\n address _proxyManager,\\n uint256 _stateTransitionIndex,\\n bytes32 _preStateRoot,\\n bytes32 _transactionHash\\n )\\n external\\n returns (\\n iOVM_StateTransitioner _ovmStateTransitioner\\n );\\n}\\n\",\"keccak256\":\"0x60a0f0c104e4c0c7863268a93005762e8146d393f9cfddfdd6a2d6585c5911fc\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/codec/Lib_OVMCodec.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../utils/Lib_Bytes32Utils.sol\\\";\\nimport { Lib_SafeExecutionManagerWrapper } from \\\"../../libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\\\";\\n\\n/**\\n * @title Lib_OVMCodec\\n */\\nlibrary Lib_OVMCodec {\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum EOASignatureType {\\n EIP155_TRANSACTION,\\n ETH_SIGNED_MESSAGE\\n }\\n\\n enum QueueOrigin {\\n SEQUENCER_QUEUE,\\n L1TOL2_QUEUE\\n }\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Account {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n address ethAddress;\\n bool isFresh;\\n }\\n\\n struct EVMAccount {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n }\\n\\n struct ChainBatchHeader {\\n uint256 batchIndex;\\n bytes32 batchRoot;\\n uint256 batchSize;\\n uint256 prevTotalElements;\\n bytes extraData;\\n }\\n\\n struct ChainInclusionProof {\\n uint256 index;\\n bytes32[] siblings;\\n }\\n\\n struct Transaction {\\n uint256 timestamp;\\n uint256 blockNumber;\\n QueueOrigin l1QueueOrigin;\\n address l1TxOrigin;\\n address entrypoint;\\n uint256 gasLimit;\\n bytes data;\\n }\\n\\n struct TransactionChainElement {\\n bool isSequenced;\\n uint256 queueIndex; // QUEUED TX ONLY\\n uint256 timestamp; // SEQUENCER TX ONLY\\n uint256 blockNumber; // SEQUENCER TX ONLY\\n bytes txData; // SEQUENCER TX ONLY\\n }\\n\\n struct QueueElement {\\n bytes32 transactionHash;\\n uint40 timestamp;\\n uint40 blockNumber;\\n }\\n\\n struct EIP155Transaction {\\n uint256 nonce;\\n uint256 gasPrice;\\n uint256 gasLimit;\\n address to;\\n uint256 value;\\n bytes data;\\n uint256 chainId;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Decodes an EOA transaction (i.e., native Ethereum RLP encoding).\\n * @param _transaction Encoded EOA transaction.\\n * @return Transaction decoded into a struct.\\n */\\n function decodeEIP155Transaction(\\n bytes memory _transaction,\\n bool _isEthSignedMessage\\n )\\n internal\\n pure\\n returns (\\n EIP155Transaction memory\\n )\\n {\\n if (_isEthSignedMessage) {\\n (\\n uint256 _nonce,\\n uint256 _gasLimit,\\n uint256 _gasPrice,\\n uint256 _chainId,\\n address _to,\\n bytes memory _data\\n ) = abi.decode(\\n _transaction,\\n (uint256, uint256, uint256, uint256, address ,bytes)\\n );\\n return EIP155Transaction({\\n nonce: _nonce,\\n gasPrice: _gasPrice,\\n gasLimit: _gasLimit,\\n to: _to,\\n value: 0,\\n data: _data,\\n chainId: _chainId\\n });\\n } else {\\n Lib_RLPReader.RLPItem[] memory decoded = Lib_RLPReader.readList(_transaction);\\n\\n return EIP155Transaction({\\n nonce: Lib_RLPReader.readUint256(decoded[0]),\\n gasPrice: Lib_RLPReader.readUint256(decoded[1]),\\n gasLimit: Lib_RLPReader.readUint256(decoded[2]),\\n to: Lib_RLPReader.readAddress(decoded[3]),\\n value: Lib_RLPReader.readUint256(decoded[4]),\\n data: Lib_RLPReader.readBytes(decoded[5]),\\n chainId: Lib_RLPReader.readUint256(decoded[6])\\n });\\n }\\n }\\n\\n /**\\n * Decompresses a compressed EIP155 transaction.\\n * @param _transaction Compressed EIP155 transaction bytes.\\n * @return Transaction parsed into a struct.\\n */\\n function decompressEIP155Transaction(\\n bytes memory _transaction\\n )\\n internal\\n returns (\\n EIP155Transaction memory\\n )\\n {\\n return EIP155Transaction({\\n gasLimit: Lib_BytesUtils.toUint24(_transaction, 0),\\n gasPrice: uint256(Lib_BytesUtils.toUint24(_transaction, 3)) * 1000000,\\n nonce: Lib_BytesUtils.toUint24(_transaction, 6),\\n to: Lib_BytesUtils.toAddress(_transaction, 9),\\n data: Lib_BytesUtils.slice(_transaction, 29),\\n chainId: Lib_SafeExecutionManagerWrapper.safeCHAINID(),\\n value: 0\\n });\\n }\\n\\n /**\\n * Encodes an EOA transaction back into the original transaction.\\n * @param _transaction EIP155transaction to encode.\\n * @param _isEthSignedMessage Whether or not this was an eth signed message.\\n * @return Encoded transaction.\\n */\\n function encodeEIP155Transaction(\\n EIP155Transaction memory _transaction,\\n bool _isEthSignedMessage\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n if (_isEthSignedMessage) {\\n return abi.encode(\\n _transaction.nonce,\\n _transaction.gasLimit,\\n _transaction.gasPrice,\\n _transaction.chainId,\\n _transaction.to,\\n _transaction.data\\n );\\n } else {\\n bytes[] memory raw = new bytes[](9);\\n\\n raw[0] = Lib_RLPWriter.writeUint(_transaction.nonce);\\n raw[1] = Lib_RLPWriter.writeUint(_transaction.gasPrice);\\n raw[2] = Lib_RLPWriter.writeUint(_transaction.gasLimit);\\n if (_transaction.to == address(0)) {\\n raw[3] = Lib_RLPWriter.writeBytes('');\\n } else {\\n raw[3] = Lib_RLPWriter.writeAddress(_transaction.to);\\n }\\n raw[4] = Lib_RLPWriter.writeUint(0);\\n raw[5] = Lib_RLPWriter.writeBytes(_transaction.data);\\n raw[6] = Lib_RLPWriter.writeUint(_transaction.chainId);\\n raw[7] = Lib_RLPWriter.writeBytes(bytes(''));\\n raw[8] = Lib_RLPWriter.writeBytes(bytes(''));\\n\\n return Lib_RLPWriter.writeList(raw);\\n }\\n }\\n\\n /**\\n * Encodes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Encoded transaction bytes.\\n */\\n function encodeTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return abi.encodePacked(\\n _transaction.timestamp,\\n _transaction.blockNumber,\\n _transaction.l1QueueOrigin,\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n );\\n }\\n\\n /**\\n * Hashes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Hashed transaction\\n */\\n function hashTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(encodeTransaction(_transaction));\\n }\\n\\n /**\\n * Converts an OVM account to an EVM account.\\n * @param _in OVM account to convert.\\n * @return Converted EVM account.\\n */\\n function toEVMAccount(\\n Account memory _in\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n return EVMAccount({\\n nonce: _in.nonce,\\n balance: _in.balance,\\n storageRoot: _in.storageRoot,\\n codeHash: _in.codeHash\\n });\\n }\\n\\n /**\\n * @notice RLP-encodes an account state struct.\\n * @param _account Account state struct.\\n * @return RLP-encoded account state.\\n */\\n function encodeEVMAccount(\\n EVMAccount memory _account\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes[] memory raw = new bytes[](4);\\n\\n // Unfortunately we can't create this array outright because\\n // Lib_RLPWriter.writeList will reject fixed-size arrays. Assigning\\n // index-by-index circumvents this issue.\\n raw[0] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.nonce)\\n )\\n );\\n raw[1] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.balance)\\n )\\n );\\n raw[2] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.storageRoot));\\n raw[3] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.codeHash));\\n\\n return Lib_RLPWriter.writeList(raw);\\n }\\n\\n /**\\n * @notice Decodes an RLP-encoded account state into a useful struct.\\n * @param _encoded RLP-encoded account state.\\n * @return Account state struct.\\n */\\n function decodeEVMAccount(\\n bytes memory _encoded\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\\n\\n return EVMAccount({\\n nonce: Lib_RLPReader.readUint256(accountState[0]),\\n balance: Lib_RLPReader.readUint256(accountState[1]),\\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\\n });\\n }\\n\\n /**\\n * Calculates a hash for a given batch header.\\n * @param _batchHeader Header to hash.\\n * @return Hash of the header.\\n */\\n function hashBatchHeader(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(\\n abi.encode(\\n _batchHeader.batchRoot,\\n _batchHeader.batchSize,\\n _batchHeader.prevTotalElements,\\n _batchHeader.extraData\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0xe7e518ba7bba3fa28c532f8902576c1bb4dfc1ec4b62bed6da50623248ba17c3\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Contract Imports */\\nimport { Ownable } from \\\"./Lib_Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n public\\n onlyOwner\\n {\\n addresses[_getNameHash(_name)] = _address;\\n\\n emit AddressSet(\\n _name,\\n _address\\n );\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0x36473d229ce0ba9d1cac5f02f84be843d9dcc8008525590a1652a2c2636f95f2\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(\\n address _libAddressManager\\n ) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x65981feeabff6a81783ea97d44baf988a18a86c8cb374c46fdb71819cbacc7c0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Ownable\\n * @dev Adapted from https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol\\n */\\nabstract contract Ownable {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n address public owner;\\n\\n\\n /**********\\n * Events *\\n **********/\\n\\n event OwnershipTransferred(\\n address indexed previousOwner,\\n address indexed newOwner\\n );\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n constructor() {\\n owner = msg.sender;\\n emit OwnershipTransferred(address(0), owner);\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n owner == msg.sender,\\n \\\"Ownable: caller is not the owner\\\"\\n );\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the owner of this contract to the zero address, effectively renouncing ownership\\n * completely. Can only be called by the current owner of this contract.\\n */\\n function renounceOwnership()\\n public\\n virtual\\n onlyOwner\\n {\\n emit OwnershipTransferred(owner, address(0));\\n owner = address(0);\\n }\\n\\n /**\\n * Transfers ownership of this contract to a new address. Can only be called by the current\\n * owner of this contract.\\n * @param _newOwner Address of the new contract owner.\\n */\\n function transferOwnership(\\n address _newOwner\\n )\\n public\\n virtual\\n onlyOwner\\n {\\n require(\\n _newOwner != address(0),\\n \\\"Ownable: new owner cannot be the zero address\\\"\\n );\\n\\n emit OwnershipTransferred(owner, _newOwner);\\n owner = _newOwner;\\n }\\n}\\n\",\"keccak256\":\"0x83f9a6c4608b5929086429205b00f8211cdfcba83f3c84520f24d8aa64fe4b82\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPReader.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_RLPReader\\n * @dev Adapted from \\\"RLPReader\\\" by Hamdi Allam (hamdi.allam97@gmail.com).\\n */\\nlibrary Lib_RLPReader {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 constant internal MAX_LIST_LENGTH = 32;\\n\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum RLPItemType {\\n DATA_ITEM,\\n LIST_ITEM\\n }\\n\\n \\n /***********\\n * Structs *\\n ***********/\\n\\n struct RLPItem {\\n uint256 length;\\n uint256 ptr;\\n }\\n \\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n \\n /**\\n * Converts bytes to a reference to memory position and length.\\n * @param _in Input bytes to convert.\\n * @return Output memory reference.\\n */\\n function toRLPItem(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem memory\\n )\\n {\\n uint256 ptr;\\n assembly {\\n ptr := add(_in, 32)\\n }\\n\\n return RLPItem({\\n length: _in.length,\\n ptr: ptr\\n });\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n (\\n uint256 listOffset,\\n ,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.LIST_ITEM,\\n \\\"Invalid RLP list value.\\\"\\n );\\n\\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\\n // writing to the length. Since we can't know the number of RLP items without looping over\\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\\n // simply set a reasonable maximum list length and decrease the size before we finish.\\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\\n\\n uint256 itemCount = 0;\\n uint256 offset = listOffset;\\n while (offset < _in.length) {\\n require(\\n itemCount < MAX_LIST_LENGTH,\\n \\\"Provided RLP list exceeds max list length.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n ) = _decodeLength(RLPItem({\\n length: _in.length - offset,\\n ptr: _in.ptr + offset\\n }));\\n\\n out[itemCount] = RLPItem({\\n length: itemLength + itemOffset,\\n ptr: _in.ptr + offset\\n });\\n\\n itemCount += 1;\\n offset += itemOffset + itemLength;\\n }\\n\\n // Decrease the array size to match the actual item count.\\n assembly {\\n mstore(out, itemCount)\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n return readList(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes value.\\\"\\n );\\n\\n return _copy(_in.ptr, itemOffset, itemLength);\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return readBytes(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return string(readBytes(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return readString(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n require(\\n _in.length <= 33,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr + itemOffset;\\n bytes32 out;\\n assembly {\\n out := mload(ptr)\\n\\n // Shift the bytes over to match the item size.\\n if lt(itemLength, 32) {\\n out := div(out, exp(256, sub(32, itemLength)))\\n }\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return readBytes32(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return uint256(readBytes32(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return readUint256(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n require(\\n _in.length == 1,\\n \\\"Invalid RLP boolean value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 out;\\n assembly {\\n out := byte(0, mload(ptr))\\n }\\n\\n require(\\n out == 0 || out == 1,\\n \\\"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\\\"\\n );\\n\\n return out != 0;\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return readBool(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n if (_in.length == 1) {\\n return address(0);\\n }\\n\\n require(\\n _in.length == 21,\\n \\\"Invalid RLP address value.\\\"\\n );\\n\\n return address(readUint256(_in));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return readAddress(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads the raw bytes of an RLP item.\\n * @param _in RLP item to read.\\n * @return Raw RLP bytes.\\n */\\n function readRawBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in);\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Decodes the length of an RLP item.\\n * @param _in RLP item to decode.\\n * @return Offset of the encoded data.\\n * @return Length of the encoded data.\\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\\n */\\n function _decodeLength(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n uint256,\\n uint256,\\n RLPItemType\\n )\\n {\\n require(\\n _in.length > 0,\\n \\\"RLP item cannot be null.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 prefix;\\n assembly {\\n prefix := byte(0, mload(ptr))\\n }\\n\\n if (prefix <= 0x7f) {\\n // Single byte.\\n\\n return (0, 1, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xb7) {\\n // Short string.\\n\\n uint256 strLen = prefix - 0x80;\\n \\n require(\\n _in.length > strLen,\\n \\\"Invalid RLP short string.\\\"\\n );\\n\\n return (1, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xbf) {\\n // Long string.\\n uint256 lenOfStrLen = prefix - 0xb7;\\n\\n require(\\n _in.length > lenOfStrLen,\\n \\\"Invalid RLP long string length.\\\"\\n );\\n\\n uint256 strLen;\\n assembly {\\n // Pick out the string length.\\n strLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfStrLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfStrLen + strLen,\\n \\\"Invalid RLP long string.\\\"\\n );\\n\\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xf7) {\\n // Short list.\\n uint256 listLen = prefix - 0xc0;\\n\\n require(\\n _in.length > listLen,\\n \\\"Invalid RLP short list.\\\"\\n );\\n\\n return (1, listLen, RLPItemType.LIST_ITEM);\\n } else {\\n // Long list.\\n uint256 lenOfListLen = prefix - 0xf7;\\n\\n require(\\n _in.length > lenOfListLen,\\n \\\"Invalid RLP long list length.\\\"\\n );\\n\\n uint256 listLen;\\n assembly {\\n // Pick out the list length.\\n listLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfListLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfListLen + listLen,\\n \\\"Invalid RLP long list.\\\"\\n );\\n\\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\\n }\\n }\\n\\n /**\\n * Copies the bytes from a memory location.\\n * @param _src Pointer to the location to read from.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Copied bytes.\\n */\\n function _copy(\\n uint256 _src,\\n uint256 _offset,\\n uint256 _length\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out = new bytes(_length);\\n if (out.length == 0) {\\n return out;\\n }\\n\\n uint256 src = _src + _offset;\\n uint256 dest;\\n assembly {\\n dest := add(out, 32)\\n }\\n\\n // Copy over as many complete words as we can.\\n for (uint256 i = 0; i < _length / 32; i++) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n\\n src += 32;\\n dest += 32;\\n }\\n\\n // Pick out the remaining bytes.\\n uint256 mask = 256 ** (32 - (_length % 32)) - 1;\\n assembly {\\n mstore(\\n dest,\\n or(\\n and(mload(src), not(mask)),\\n and(mload(dest), mask)\\n )\\n )\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Copies an RLP item into bytes.\\n * @param _in RLP item to copy.\\n * @return Copied bytes.\\n */\\n function _copy(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in.ptr, 0, _in.length);\\n }\\n}\\n\",\"keccak256\":\"0xbdb8fae0ca2483b4cc07607a5070fc25e33c54b4e4462b99e7c0b13aac48a09b\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPWriter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\n\\n/**\\n * @title Lib_RLPWriter\\n * @author Bakaoh (with modifications)\\n */\\nlibrary Lib_RLPWriter {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * RLP encodes a byte string.\\n * @param _in The byte string to encode.\\n * @return _out The RLP encoded string in bytes.\\n */\\n function writeBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n bytes memory encoded;\\n\\n if (_in.length == 1 && uint8(_in[0]) < 128) {\\n encoded = _in;\\n } else {\\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * RLP encodes a list of RLP encoded byte byte strings.\\n * @param _in The list of RLP encoded byte strings.\\n * @return _out The RLP encoded list of items in bytes.\\n */\\n function writeList(\\n bytes[] memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n bytes memory list = _flatten(_in);\\n return abi.encodePacked(_writeLength(list.length, 192), list);\\n }\\n\\n /**\\n * RLP encodes a string.\\n * @param _in The string to encode.\\n * @return _out The RLP encoded string in bytes.\\n */\\n function writeString(\\n string memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(bytes(_in));\\n }\\n\\n /**\\n * RLP encodes an address.\\n * @param _in The address to encode.\\n * @return _out The RLP encoded address in bytes.\\n */\\n function writeAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a uint.\\n * @param _in The uint256 to encode.\\n * @return _out The RLP encoded uint256 in bytes.\\n */\\n function writeUint(\\n uint256 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(_toBinary(_in));\\n }\\n\\n /**\\n * RLP encodes a bool.\\n * @param _in The bool to encode.\\n * @return _out The RLP encoded bool in bytes.\\n */\\n function writeBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n bytes memory encoded = new bytes(1);\\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\\n return encoded;\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\\n * @param _len The length of the string or the payload.\\n * @param _offset 128 if item is string, 192 if item is list.\\n * @return _encoded RLP encoded bytes.\\n */\\n function _writeLength(\\n uint256 _len,\\n uint256 _offset\\n )\\n private\\n pure\\n returns (\\n bytes memory _encoded\\n )\\n {\\n bytes memory encoded;\\n\\n if (_len < 56) {\\n encoded = new bytes(1);\\n encoded[0] = byte(uint8(_len) + uint8(_offset));\\n } else {\\n uint256 lenLen;\\n uint256 i = 1;\\n while (_len / i != 0) {\\n lenLen++;\\n i *= 256;\\n }\\n\\n encoded = new bytes(lenLen + 1);\\n encoded[0] = byte(uint8(lenLen) + uint8(_offset) + 55);\\n for(i = 1; i <= lenLen; i++) {\\n encoded[i] = byte(uint8((_len / (256**(lenLen-i))) % 256));\\n }\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * Encode integer in big endian binary form with no leading zeroes.\\n * @notice TODO: This should be optimized with assembly to save gas costs.\\n * @param _x The integer to encode.\\n * @return _binary RLP encoded bytes.\\n */\\n function _toBinary(\\n uint256 _x\\n )\\n private\\n pure\\n returns (\\n bytes memory _binary\\n )\\n {\\n bytes memory b = abi.encodePacked(_x);\\n\\n uint256 i = 0;\\n for (; i < 32; i++) {\\n if (b[i] != 0) {\\n break;\\n }\\n }\\n\\n bytes memory res = new bytes(32 - i);\\n for (uint256 j = 0; j < res.length; j++) {\\n res[j] = b[i++];\\n }\\n\\n return res;\\n }\\n\\n /**\\n * Copies a piece of memory to another location.\\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\\n * @param _dest Destination location.\\n * @param _src Source location.\\n * @param _len Length of memory to copy.\\n */\\n function _memcpy(\\n uint256 _dest,\\n uint256 _src,\\n uint256 _len\\n )\\n private\\n pure\\n {\\n uint256 dest = _dest;\\n uint256 src = _src;\\n uint256 len = _len;\\n\\n for(; len >= 32; len -= 32) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n dest += 32;\\n src += 32;\\n }\\n\\n uint256 mask = 256 ** (32 - len) - 1;\\n assembly {\\n let srcpart := and(mload(src), not(mask))\\n let destpart := and(mload(dest), mask)\\n mstore(dest, or(destpart, srcpart))\\n }\\n }\\n\\n /**\\n * Flattens a list of byte strings into one byte string.\\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\\n * @param _list List of byte strings to flatten.\\n * @return _flattened The flattened byte string.\\n */\\n function _flatten(\\n bytes[] memory _list\\n )\\n private\\n pure\\n returns (\\n bytes memory _flattened\\n )\\n {\\n if (_list.length == 0) {\\n return new bytes(0);\\n }\\n\\n uint256 len;\\n uint256 i = 0;\\n for (; i < _list.length; i++) {\\n len += _list[i].length;\\n }\\n\\n bytes memory flattened = new bytes(len);\\n uint256 flattenedPtr;\\n assembly { flattenedPtr := add(flattened, 0x20) }\\n\\n for(i = 0; i < _list.length; i++) {\\n bytes memory item = _list[i];\\n\\n uint256 listPtr;\\n assembly { listPtr := add(item, 0x20)}\\n\\n _memcpy(flattenedPtr, listPtr, item.length);\\n flattenedPtr += _list[i].length;\\n }\\n\\n return flattened;\\n }\\n}\",\"keccak256\":\"0xbcb24619c1758cb0d9f3fe5c79495950045a9087046a02b9ce01df46ae09ae5b\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_Bytes32Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_Byte32Utils\\n */\\nlibrary Lib_Bytes32Utils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \\\"true.\\\"\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as a boolean.\\n */\\n function toBool(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return _in != 0;\\n }\\n\\n /**\\n * Converts a boolean to a bytes32 value.\\n * @param _in Input boolean value.\\n * @return Boolean as a bytes32.\\n */\\n function fromBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in ? 1 : 0));\\n }\\n\\n /**\\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as an address.\\n */\\n function toAddress(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return address(uint160(uint256(_in)));\\n }\\n\\n /**\\n * Converts an address to a bytes32.\\n * @param _in Input address value.\\n * @return Address as a bytes32.\\n */\\n function fromAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in));\\n }\\n\\n /**\\n * Removes the leading zeros from a bytes32 value and returns a new (smaller) bytes value.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 without any leading zeros.\\n */\\n function removeLeadingZeros(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out;\\n\\n assembly {\\n // Figure out how many leading zero bytes to remove.\\n let shift := 0\\n for { let i := 0 } and(lt(i, 32), eq(byte(i, _in), 0)) { i := add(i, 1) } {\\n shift := add(shift, 1)\\n }\\n\\n // Reserve some space for our output and fix the free memory pointer.\\n out := mload(0x40)\\n mstore(0x40, add(out, 0x40))\\n\\n // Shift the value and store it into the output bytes.\\n mstore(add(out, 0x20), shl(mul(shift, 8), _in))\\n\\n // Store the new size (with leading zero bytes removed) in the output byte size.\\n mstore(out, sub(32, shift))\\n }\\n\\n return out;\\n }\\n}\\n\",\"keccak256\":\"0xfa2def593e3fc56a31852c3744aefdaa93cec74e721bfcfeb1e5d166c7c60b64\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_BytesUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_BytesUtils\\n */\\nlibrary Lib_BytesUtils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_start + _length >= _start, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n if (_bytes.length - _start == 0) {\\n return bytes('');\\n }\\n\\n return slice(_bytes, _start, _bytes.length - _start);\\n }\\n\\n function toBytes32PadLeft(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes32)\\n {\\n bytes32 ret;\\n uint256 len = _bytes.length <= 32 ? _bytes.length : 32;\\n assembly {\\n ret := shr(mul(sub(32, len), 8), mload(add(_bytes, 32)))\\n }\\n return ret;\\n }\\n\\n function toBytes32(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes32)\\n {\\n if (_bytes.length < 32) {\\n bytes32 ret;\\n assembly {\\n ret := mload(add(_bytes, 32))\\n }\\n return ret;\\n }\\n\\n return abi.decode(_bytes,(bytes32)); // will truncate if input length > 32 bytes\\n }\\n\\n function toUint256(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (uint256)\\n {\\n return uint256(toBytes32(_bytes));\\n }\\n\\n function toUint24(bytes memory _bytes, uint256 _start) internal pure returns (uint24) {\\n require(_start + 3 >= _start, \\\"toUint24_overflow\\\");\\n require(_bytes.length >= _start + 3 , \\\"toUint24_outOfBounds\\\");\\n uint24 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x3), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toUint8(bytes memory _bytes, uint256 _start) internal pure returns (uint8) {\\n require(_start + 1 >= _start, \\\"toUint8_overflow\\\");\\n require(_bytes.length >= _start + 1 , \\\"toUint8_outOfBounds\\\");\\n uint8 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x1), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toAddress(bytes memory _bytes, uint256 _start) internal pure returns (address) {\\n require(_start + 20 >= _start, \\\"toAddress_overflow\\\");\\n require(_bytes.length >= _start + 20, \\\"toAddress_outOfBounds\\\");\\n address tempAddress;\\n\\n assembly {\\n tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000)\\n }\\n\\n return tempAddress;\\n }\\n\\n function toNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n bytes memory nibbles = new bytes(_bytes.length * 2);\\n\\n for (uint256 i = 0; i < _bytes.length; i++) {\\n nibbles[i * 2] = _bytes[i] >> 4;\\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\\n }\\n\\n return nibbles;\\n }\\n\\n function fromNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n bytes memory ret = new bytes(_bytes.length / 2);\\n\\n for (uint256 i = 0; i < ret.length; i++) {\\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\\n }\\n\\n return ret;\\n }\\n\\n function equal(\\n bytes memory _bytes,\\n bytes memory _other\\n )\\n internal\\n pure\\n returns (bool)\\n {\\n return keccak256(_bytes) == keccak256(_other);\\n }\\n}\\n\",\"keccak256\":\"0x0adf22e1b22ba09911e859f64cb3b484e992be4f9fd3b09088e6225bf8d06ce0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_ErrorUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/**\\n * @title Lib_ErrorUtils\\n */\\nlibrary Lib_ErrorUtils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Encodes an error string into raw solidity-style revert data.\\n * (i.e. ascii bytes, prefixed with bytes4(keccak(\\\"Error(string))\\\"))\\n * Ref: https://docs.soliditylang.org/en/v0.8.2/control-structures.html?highlight=Error(string)#panic-via-assert-and-error-via-require\\n * @param _reason Reason for the reversion.\\n * @return Standard solidity revert data for the given reason.\\n */\\n function encodeRevertString(\\n string memory _reason\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return abi.encodeWithSignature(\\n \\\"Error(string)\\\",\\n _reason\\n );\\n }\\n}\\n\",\"keccak256\":\"0xfc64ec4a81fb50865b502a0004ed154e8598e1a313db77303fc95e41f536e6b7\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_ErrorUtils } from \\\"../utils/Lib_ErrorUtils.sol\\\";\\n\\n/**\\n * @title Lib_SafeExecutionManagerWrapper\\n * @dev The Safe Execution Manager Wrapper provides functions which facilitate writing OVM safe \\n * code using the standard solidity compiler, by routing all its operations through the Execution \\n * Manager.\\n * \\n * Compiler used: solc\\n * Runtime target: OVM\\n */\\nlibrary Lib_SafeExecutionManagerWrapper {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Performs a safe ovmCALL.\\n * @param _gasLimit Gas limit for the call.\\n * @param _target Address to call.\\n * @param _calldata Data to send to the call.\\n * @return _success Whether or not the call reverted.\\n * @return _returndata Data returned by the call.\\n */\\n function safeCALL(\\n uint256 _gasLimit,\\n address _target,\\n bytes memory _calldata\\n )\\n internal\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCALL(uint256,address,bytes)\\\",\\n _gasLimit,\\n _target,\\n _calldata\\n )\\n );\\n\\n return abi.decode(returndata, (bool, bytes));\\n }\\n\\n /**\\n * Performs a safe ovmDELEGATECALL.\\n * @param _gasLimit Gas limit for the call.\\n * @param _target Address to call.\\n * @param _calldata Data to send to the call.\\n * @return _success Whether or not the call reverted.\\n * @return _returndata Data returned by the call.\\n */\\n function safeDELEGATECALL(\\n uint256 _gasLimit,\\n address _target,\\n bytes memory _calldata\\n )\\n internal\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmDELEGATECALL(uint256,address,bytes)\\\",\\n _gasLimit,\\n _target,\\n _calldata\\n )\\n );\\n\\n return abi.decode(returndata, (bool, bytes));\\n }\\n\\n /**\\n * Performs a safe ovmCREATE call.\\n * @param _gasLimit Gas limit for the creation.\\n * @param _bytecode Code for the new contract.\\n * @return _contract Address of the created contract.\\n */\\n function safeCREATE(\\n uint256 _gasLimit,\\n bytes memory _bytecode\\n )\\n internal\\n returns (\\n address,\\n bytes memory\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n _gasLimit,\\n abi.encodeWithSignature(\\n \\\"ovmCREATE(bytes)\\\",\\n _bytecode\\n )\\n );\\n\\n return abi.decode(returndata, (address, bytes));\\n }\\n\\n /**\\n * Performs a safe ovmEXTCODESIZE call.\\n * @param _contract Address of the contract to query the size of.\\n * @return _EXTCODESIZE Size of the requested contract in bytes.\\n */\\n function safeEXTCODESIZE(\\n address _contract\\n )\\n internal\\n returns (\\n uint256 _EXTCODESIZE\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmEXTCODESIZE(address)\\\",\\n _contract\\n )\\n );\\n\\n return abi.decode(returndata, (uint256));\\n }\\n\\n /**\\n * Performs a safe ovmCHAINID call.\\n * @return _CHAINID Result of calling ovmCHAINID.\\n */\\n function safeCHAINID()\\n internal\\n returns (\\n uint256 _CHAINID\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCHAINID()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (uint256));\\n }\\n\\n /**\\n * Performs a safe ovmCALLER call.\\n * @return _CALLER Result of calling ovmCALLER.\\n */\\n function safeCALLER()\\n internal\\n returns (\\n address _CALLER\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCALLER()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (address));\\n }\\n\\n /**\\n * Performs a safe ovmADDRESS call.\\n * @return _ADDRESS Result of calling ovmADDRESS.\\n */\\n function safeADDRESS()\\n internal\\n returns (\\n address _ADDRESS\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmADDRESS()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (address));\\n }\\n\\n /**\\n * Performs a safe ovmGETNONCE call.\\n * @return _nonce Result of calling ovmGETNONCE.\\n */\\n function safeGETNONCE()\\n internal\\n returns (\\n uint256 _nonce\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmGETNONCE()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (uint256));\\n }\\n\\n /**\\n * Performs a safe ovmINCREMENTNONCE call.\\n */\\n function safeINCREMENTNONCE()\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmINCREMENTNONCE()\\\"\\n )\\n );\\n }\\n\\n /**\\n * Performs a safe ovmCREATEEOA call.\\n * @param _messageHash Message hash which was signed by EOA\\n * @param _v v value of signature (0 or 1)\\n * @param _r r value of signature\\n * @param _s s value of signature\\n */\\n function safeCREATEEOA(\\n bytes32 _messageHash,\\n uint8 _v,\\n bytes32 _r,\\n bytes32 _s\\n )\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCREATEEOA(bytes32,uint8,bytes32,bytes32)\\\",\\n _messageHash,\\n _v,\\n _r,\\n _s\\n )\\n );\\n }\\n\\n /**\\n * Performs a safe REVERT.\\n * @param _reason String revert reason to pass along with the REVERT.\\n */\\n function safeREVERT(\\n string memory _reason\\n )\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmREVERT(bytes)\\\",\\n Lib_ErrorUtils.encodeRevertString(\\n _reason\\n )\\n )\\n );\\n }\\n\\n /**\\n * Performs a safe \\\"require\\\".\\n * @param _condition Boolean condition that must be true or will revert.\\n * @param _reason String revert reason to pass along with the REVERT.\\n */\\n function safeREQUIRE(\\n bool _condition,\\n string memory _reason\\n )\\n internal\\n {\\n if (!_condition) {\\n safeREVERT(\\n _reason\\n );\\n }\\n }\\n\\n /**\\n * Performs a safe ovmSLOAD call.\\n */\\n function safeSLOAD(\\n bytes32 _key\\n )\\n internal\\n returns (\\n bytes32\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmSLOAD(bytes32)\\\",\\n _key\\n )\\n );\\n\\n return abi.decode(returndata, (bytes32));\\n }\\n\\n /**\\n * Performs a safe ovmSSTORE call.\\n */\\n function safeSSTORE(\\n bytes32 _key,\\n bytes32 _value\\n )\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmSSTORE(bytes32,bytes32)\\\",\\n _key,\\n _value\\n )\\n );\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Performs an ovm interaction and the necessary safety checks.\\n * @param _gasLimit Gas limit for the interaction.\\n * @param _calldata Data to send to the OVM_ExecutionManager (encoded with sighash).\\n * @return _returndata Data sent back by the OVM_ExecutionManager.\\n */\\n function _safeExecutionManagerInteraction(\\n uint256 _gasLimit,\\n bytes memory _calldata\\n )\\n private\\n returns (\\n bytes memory _returndata\\n )\\n {\\n address ovmExecutionManager = msg.sender;\\n (\\n bool success,\\n bytes memory returndata\\n ) = ovmExecutionManager.call{gas: _gasLimit}(_calldata);\\n\\n if (success == false) {\\n assembly {\\n revert(add(returndata, 0x20), mload(returndata))\\n }\\n } else if (returndata.length == 1) {\\n assembly {\\n return(0, 1)\\n }\\n } else {\\n return returndata;\\n }\\n }\\n\\n function _safeExecutionManagerInteraction(\\n bytes memory _calldata\\n )\\n private\\n returns (\\n bytes memory _returndata\\n )\\n {\\n return _safeExecutionManagerInteraction(\\n gasleft(),\\n _calldata\\n );\\n }\\n}\\n\",\"keccak256\":\"0x41e146e7912af794a17cd43c5a276674be956bfa8f3ca5b451bcb82d81e6f492\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x608060405234801561001057600080fd5b5060405161184138038061184183398101604081905261002f91610054565b600080546001600160a01b0319166001600160a01b0392909216919091179055610082565b600060208284031215610065578081fd5b81516001600160a01b038116811461007b578182fd5b9392505050565b6117b0806100916000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c8063299ca4781461005c578063461a44781461007a57806398d8867d1461008d578063a286ba1c146100a2578063b48ec820146100b5575b600080fd5b6100646100c8565b6040516100719190611306565b60405180910390f35b610064610088366004611101565b6100d7565b6100a061009b366004611029565b6101b5565b005b6100a06100b0366004610f64565b6104f4565b6100646100c3366004610f43565b6108bb565b6000546001600160a01b031681565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b8381101561013757818101518382015260200161011f565b50505050905090810190601f1680156101645780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561018157600080fd5b505afa158015610195573d6000803e3d6000fd5b505050506040513d60208110156101ab57600080fd5b505190505b919050565b866101bf8561090a565b60005a905060006101cf8861090a565b90506101db8b82610923565b156101e65750610432565b60006102216040518060400160405280601881526020017727ab26afa9ba30ba32a1b7b6b6b4ba36b2b73a21b430b4b760411b8152506100d7565b905060006102636040518060400160405280601d81526020017f4f564d5f43616e6f6e6963616c5472616e73616374696f6e436861696e0000008152506100d7565b9050816001600160a01b0316634d69ee578e8e8e6040518463ffffffff1660e01b81526004016102959392919061135f565b60206040518083038186803b1580156102ad57600080fd5b505afa1580156102c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102e59190610f0f565b61030a5760405162461bcd60e51b8152600401610301906115e7565b60405180910390fd5b6040516326f2b4e760e11b81526001600160a01b03821690634de569ce9061033c908d908d908d908d90600401611641565b60206040518083038186803b15801561035457600080fd5b505afa158015610368573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061038c9190610f0f565b6103a85760405162461bcd60e51b815260040161030190611499565b86600001518860600151018b600001518d6060015101600101146103de5760405162461bcd60e51b815260040161030190611525565b6103ed8d848d60000151610942565b7f41a48bde2468fac6f670f39b66d7b91f311053e1f28eab9d75056546e6eaac958d8c6000015185336040516104269493929190611394565b60405180910390a15050505b60005a820390506104696040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506100d7565b6001600160a01b0316631e16e92f858533856040518563ffffffff1660e01b815260040180858152602001848152602001836001600160a01b03168152602001828152602001945050505050600060405180830381600087803b1580156104cf57600080fd5b505af11580156104e3573d6000803e3d6000fd5b505050505050505050505050505050565b868460005a905060006105078b896108bb565b905060006105446040518060400160405280601881526020017727ab26afa9ba30ba32a1b7b6b6b4ba36b2b73a21b430b4b760411b8152506100d7565b9050816001600160a01b031663b2fa1c9e6040518163ffffffff1660e01b815260040160206040518083038186803b15801561057f57600080fd5b505afa158015610593573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b79190610f0f565b15156001146105d85760405162461bcd60e51b8152600401610301906113b8565b89600001518b606001510160010186600001518860600151011461060e5760405162461bcd60e51b81526004016103019061141f565b604051634d69ee5760e01b81526001600160a01b03821690634d69ee579061063e908f908f908f9060040161135f565b60206040518083038186803b15801561065657600080fd5b505afa15801561066a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061068e9190610f0f565b6106aa5760405162461bcd60e51b8152600401610301906115e7565b604051634d69ee5760e01b81526001600160a01b03821690634d69ee57906106da908b908b908b9060040161135f565b60206040518083038186803b1580156106f257600080fd5b505afa158015610706573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061072a9190610f0f565b6107465760405162461bcd60e51b8152600401610301906114dd565b816001600160a01b031663c1c618b86040518163ffffffff1660e01b815260040160206040518083038186803b15801561077f57600080fd5b505afa158015610793573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107b79190610f2b565b8814156107d65760405162461bcd60e51b815260040161030190611597565b6107e0878d610a6d565b6000600160008e8c6040516020016107f9929190611289565b60405160208183030381529060405280519060200120815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b031602179055507f1e5fff3c23daf51ea67aaa3bbc738bcedaa98be5a5503f0e63a336a004b075b18c8b600001518b3360405161087a9493929190611394565b60405180910390a1505060005a820390506104696040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506100d7565b60006001600084846040516020016108d4929190611289565b60408051808303601f19018152918152815160209283012083529082019290925201600020546001600160a01b03169392505050565b600061091582610bc7565b805190602001209050919050565b60008061093084846108bb565b6001600160a01b031614159392505050565b6109806040518060400160405280601c81526020017f4f564d5f53746174655472616e736974696f6e6572466163746f7279000000008152506100d7565b600054604051631168a38160e11b81526001600160a01b03928316926322d14702926109b79291169085908890889060040161131a565b602060405180830381600087803b1580156109d157600080fd5b505af11580156109e5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a0991906110e5565b600160008585604051602001610a20929190611289565b60405160208183030381529060405280519060200120815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b03160217905550505050565b6000610aa86040518060400160405280601881526020017727ab26afa9ba30ba32a1b7b6b6b4ba36b2b73a21b430b4b760411b8152506100d7565b90506000610adc6040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506100d7565b604051632e38626b60e21b81529091506001600160a01b0383169063b8e189ac90610b0b90879060040161162e565b600060405180830381600087803b158015610b2557600080fd5b505af1158015610b39573d6000803e3d6000fd5b505050506000808560800151806020019051810190610b58919061114f565b60405163abfbbe1360e01b815291935091506001600160a01b0384169063abfbbe1390610b8d90889085908790600401611340565b600060405180830381600087803b158015610ba757600080fd5b505af1158015610bbb573d6000803e3d6000fd5b50505050505050505050565b6060816000015182602001518360400151846060015185608001518660a001518760c00151604051602001610c029796959493929190611297565b6040516020818303038152906040529050919050565b600067ffffffffffffffff831115610c2c57fe5b610c3f601f8401601f1916602001611700565b9050828152838383011115610c5357600080fd5b828260208301376000602084830101529392505050565b80356101b081611754565b600082601f830112610c85578081fd5b610c9483833560208501610c18565b9392505050565b8035600281106101b057600080fd5b600060a08284031215610cbb578081fd5b60405160a0810167ffffffffffffffff8282108183111715610cd957fe5b81604052829350843583526020850135602084015260408501356040840152606085013560608401526080850135915080821115610d1657600080fd5b50610d2385828601610c75565b6080830152505092915050565b600060408284031215610d41578081fd5b6040516040810167ffffffffffffffff8282108183111715610d5f57fe5b8160405282935084358352602091508185013581811115610d7f57600080fd5b8501601f81018713610d9057600080fd5b803582811115610d9c57fe5b8381029250610dac848401611700565b8181528481019083860185850187018b1015610dc757600080fd5b600095505b83861015610dea578035835260019590950194918601918601610dcc565b5080868801525050505050505092915050565b600060a08284031215610e0e578081fd5b60405160a0810167ffffffffffffffff8282108183111715610e2c57fe5b8160405282935084359150610e408261176c565b8183526020850135602084015260408501356040840152606085013560608401526080850135915080821115610d1657600080fd5b600060e08284031215610e86578081fd5b610e9060e0611700565b90508135815260208201356020820152610eac60408301610c9b565b6040820152610ebd60608301610c6a565b6060820152610ece60808301610c6a565b608082015260a082013560a082015260c082013567ffffffffffffffff811115610ef757600080fd5b610f0384828501610c75565b60c08301525092915050565b600060208284031215610f20578081fd5b8151610c948161176c565b600060208284031215610f3c578081fd5b5051919050565b60008060408385031215610f55578081fd5b50508035926020909101359150565b600080600080600080600060e0888a031215610f7e578283fd5b87359650602088013567ffffffffffffffff80821115610f9c578485fd5b610fa88b838c01610caa565b975060408a0135915080821115610fbd578485fd5b610fc98b838c01610d30565b965060608a0135955060808a0135945060a08a0135915080821115610fec578384fd5b610ff88b838c01610caa565b935060c08a013591508082111561100d578283fd5b5061101a8a828b01610d30565b91505092959891949750929550565b600080600080600080600060e0888a031215611043578081fd5b87359650602088013567ffffffffffffffff80821115611061578283fd5b61106d8b838c01610caa565b975060408a0135915080821115611082578283fd5b61108e8b838c01610d30565b965060608a01359150808211156110a3578283fd5b6110af8b838c01610e75565b955060808a01359150808211156110c4578283fd5b6110d08b838c01610dfd565b945060a08a0135915080821115610fec578283fd5b6000602082840312156110f6578081fd5b8151610c9481611754565b600060208284031215611112578081fd5b813567ffffffffffffffff811115611128578182fd5b8201601f81018413611138578182fd5b61114784823560208401610c18565b949350505050565b60008060408385031215611161578182fd5b82519150602083015161117381611754565b809150509250929050565b6001600160a01b03169052565b600081518084526111a3816020860160208601611724565b601f01601f19169290920160200192915050565b600081518352602082015160208401526040820151604084015260608201516060840152608082015160a0608085015261114760a085018261118b565b6000604083018251845260208084015160408287015282815180855260608801915083830194508592505b8083101561123f578451825293830193600192909201919083019061121f565b509695505050505050565b6000815115158352602082015160208401526040820151604084015260608201516060840152608082015160a0608085015261114760a085018261118b565b918252602082015260400190565b6000888252876020830152600287106112ac57fe5b8660f81b60408301526bffffffffffffffffffffffff19808760601b166041840152808660601b1660558401525083606983015282516112f3816089850160208701611724565b9190910160890198975050505050505050565b6001600160a01b0391909116815260200190565b6001600160a01b0394909416845260208401929092526040830152606082015260800190565b9283526001600160a01b03919091166020830152604082015260600190565b60008482526060602083015261137860608301856111b7565b828103604084015261138a81856111f4565b9695505050505050565b938452602084019290925260408301526001600160a01b0316606082015260800190565b60208082526041908201527f5374617465207472616e736974696f6e2070726f63657373206d75737420626560408201527f20636f6d706c65746564207072696f7220746f2066696e616c697a6174696f6e6060820152601760f91b608082015260a00190565b60208082526054908201527f506f73742d737461746520726f6f7420676c6f62616c20696e646578206d757360408201527f7420657175616c20746f207468652070726520737461746520726f6f7420676c60608201527337b130b61034b73232bc1038363ab99037b7329760611b608082015260a00190565b60208082526024908201527f496e76616c6964207472616e73616374696f6e20696e636c7573696f6e20707260408201526337b7b31760e11b606082015260800190565b60208082526028908201527f496e76616c696420706f73742d737461746520726f6f7420696e636c7573696f6040820152673710383937b7b31760c11b606082015260800190565b6020808252604c908201527f5072652d737461746520726f6f7420676c6f62616c20696e646578206d75737460408201527f20657175616c20746f20746865207472616e73616374696f6e20726f6f74206760608201526b3637b130b61034b73232bc1760a11b608082015260a00190565b60208082526030908201527f5374617465207472616e736974696f6e20686173206e6f74206265656e20707260408201526f37bb32b710333930bab23ab632b73a1760811b606082015260800190565b60208082526027908201527f496e76616c6964207072652d737461746520726f6f7420696e636c7573696f6e60408201526610383937b7b31760c91b606082015260800190565b600060208252610c9460208301846111b7565b60006080825285516080830152602086015160a083015260408601516002811061166757fe5b60c083015260608601516001600160a01b031660e0830152608086015161169261010084018261117e565b5060a086015161012083015260c086015160e06101408401526116b961016084018261118b565b905082810360208401526116cd818761124a565b905082810360408401526116e181866111b7565b905082810360608401526116f581856111f4565b979650505050505050565b60405181810167ffffffffffffffff8111828210171561171c57fe5b604052919050565b60005b8381101561173f578181015183820152602001611727565b8381111561174e576000848401525b50505050565b6001600160a01b038116811461176957600080fd5b50565b801515811461176957600080fdfea2646970667358221220a4410e55d1858a434fb2e375f4d9fc03c5c14eec8400c883a4327d88553f607164736f6c63430007060033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100575760003560e01c8063299ca4781461005c578063461a44781461007a57806398d8867d1461008d578063a286ba1c146100a2578063b48ec820146100b5575b600080fd5b6100646100c8565b6040516100719190611306565b60405180910390f35b610064610088366004611101565b6100d7565b6100a061009b366004611029565b6101b5565b005b6100a06100b0366004610f64565b6104f4565b6100646100c3366004610f43565b6108bb565b6000546001600160a01b031681565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b8381101561013757818101518382015260200161011f565b50505050905090810190601f1680156101645780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561018157600080fd5b505afa158015610195573d6000803e3d6000fd5b505050506040513d60208110156101ab57600080fd5b505190505b919050565b866101bf8561090a565b60005a905060006101cf8861090a565b90506101db8b82610923565b156101e65750610432565b60006102216040518060400160405280601881526020017727ab26afa9ba30ba32a1b7b6b6b4ba36b2b73a21b430b4b760411b8152506100d7565b905060006102636040518060400160405280601d81526020017f4f564d5f43616e6f6e6963616c5472616e73616374696f6e436861696e0000008152506100d7565b9050816001600160a01b0316634d69ee578e8e8e6040518463ffffffff1660e01b81526004016102959392919061135f565b60206040518083038186803b1580156102ad57600080fd5b505afa1580156102c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102e59190610f0f565b61030a5760405162461bcd60e51b8152600401610301906115e7565b60405180910390fd5b6040516326f2b4e760e11b81526001600160a01b03821690634de569ce9061033c908d908d908d908d90600401611641565b60206040518083038186803b15801561035457600080fd5b505afa158015610368573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061038c9190610f0f565b6103a85760405162461bcd60e51b815260040161030190611499565b86600001518860600151018b600001518d6060015101600101146103de5760405162461bcd60e51b815260040161030190611525565b6103ed8d848d60000151610942565b7f41a48bde2468fac6f670f39b66d7b91f311053e1f28eab9d75056546e6eaac958d8c6000015185336040516104269493929190611394565b60405180910390a15050505b60005a820390506104696040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506100d7565b6001600160a01b0316631e16e92f858533856040518563ffffffff1660e01b815260040180858152602001848152602001836001600160a01b03168152602001828152602001945050505050600060405180830381600087803b1580156104cf57600080fd5b505af11580156104e3573d6000803e3d6000fd5b505050505050505050505050505050565b868460005a905060006105078b896108bb565b905060006105446040518060400160405280601881526020017727ab26afa9ba30ba32a1b7b6b6b4ba36b2b73a21b430b4b760411b8152506100d7565b9050816001600160a01b031663b2fa1c9e6040518163ffffffff1660e01b815260040160206040518083038186803b15801561057f57600080fd5b505afa158015610593573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b79190610f0f565b15156001146105d85760405162461bcd60e51b8152600401610301906113b8565b89600001518b606001510160010186600001518860600151011461060e5760405162461bcd60e51b81526004016103019061141f565b604051634d69ee5760e01b81526001600160a01b03821690634d69ee579061063e908f908f908f9060040161135f565b60206040518083038186803b15801561065657600080fd5b505afa15801561066a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061068e9190610f0f565b6106aa5760405162461bcd60e51b8152600401610301906115e7565b604051634d69ee5760e01b81526001600160a01b03821690634d69ee57906106da908b908b908b9060040161135f565b60206040518083038186803b1580156106f257600080fd5b505afa158015610706573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061072a9190610f0f565b6107465760405162461bcd60e51b8152600401610301906114dd565b816001600160a01b031663c1c618b86040518163ffffffff1660e01b815260040160206040518083038186803b15801561077f57600080fd5b505afa158015610793573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107b79190610f2b565b8814156107d65760405162461bcd60e51b815260040161030190611597565b6107e0878d610a6d565b6000600160008e8c6040516020016107f9929190611289565b60405160208183030381529060405280519060200120815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b031602179055507f1e5fff3c23daf51ea67aaa3bbc738bcedaa98be5a5503f0e63a336a004b075b18c8b600001518b3360405161087a9493929190611394565b60405180910390a1505060005a820390506104696040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506100d7565b60006001600084846040516020016108d4929190611289565b60408051808303601f19018152918152815160209283012083529082019290925201600020546001600160a01b03169392505050565b600061091582610bc7565b805190602001209050919050565b60008061093084846108bb565b6001600160a01b031614159392505050565b6109806040518060400160405280601c81526020017f4f564d5f53746174655472616e736974696f6e6572466163746f7279000000008152506100d7565b600054604051631168a38160e11b81526001600160a01b03928316926322d14702926109b79291169085908890889060040161131a565b602060405180830381600087803b1580156109d157600080fd5b505af11580156109e5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a0991906110e5565b600160008585604051602001610a20929190611289565b60405160208183030381529060405280519060200120815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b03160217905550505050565b6000610aa86040518060400160405280601881526020017727ab26afa9ba30ba32a1b7b6b6b4ba36b2b73a21b430b4b760411b8152506100d7565b90506000610adc6040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506100d7565b604051632e38626b60e21b81529091506001600160a01b0383169063b8e189ac90610b0b90879060040161162e565b600060405180830381600087803b158015610b2557600080fd5b505af1158015610b39573d6000803e3d6000fd5b505050506000808560800151806020019051810190610b58919061114f565b60405163abfbbe1360e01b815291935091506001600160a01b0384169063abfbbe1390610b8d90889085908790600401611340565b600060405180830381600087803b158015610ba757600080fd5b505af1158015610bbb573d6000803e3d6000fd5b50505050505050505050565b6060816000015182602001518360400151846060015185608001518660a001518760c00151604051602001610c029796959493929190611297565b6040516020818303038152906040529050919050565b600067ffffffffffffffff831115610c2c57fe5b610c3f601f8401601f1916602001611700565b9050828152838383011115610c5357600080fd5b828260208301376000602084830101529392505050565b80356101b081611754565b600082601f830112610c85578081fd5b610c9483833560208501610c18565b9392505050565b8035600281106101b057600080fd5b600060a08284031215610cbb578081fd5b60405160a0810167ffffffffffffffff8282108183111715610cd957fe5b81604052829350843583526020850135602084015260408501356040840152606085013560608401526080850135915080821115610d1657600080fd5b50610d2385828601610c75565b6080830152505092915050565b600060408284031215610d41578081fd5b6040516040810167ffffffffffffffff8282108183111715610d5f57fe5b8160405282935084358352602091508185013581811115610d7f57600080fd5b8501601f81018713610d9057600080fd5b803582811115610d9c57fe5b8381029250610dac848401611700565b8181528481019083860185850187018b1015610dc757600080fd5b600095505b83861015610dea578035835260019590950194918601918601610dcc565b5080868801525050505050505092915050565b600060a08284031215610e0e578081fd5b60405160a0810167ffffffffffffffff8282108183111715610e2c57fe5b8160405282935084359150610e408261176c565b8183526020850135602084015260408501356040840152606085013560608401526080850135915080821115610d1657600080fd5b600060e08284031215610e86578081fd5b610e9060e0611700565b90508135815260208201356020820152610eac60408301610c9b565b6040820152610ebd60608301610c6a565b6060820152610ece60808301610c6a565b608082015260a082013560a082015260c082013567ffffffffffffffff811115610ef757600080fd5b610f0384828501610c75565b60c08301525092915050565b600060208284031215610f20578081fd5b8151610c948161176c565b600060208284031215610f3c578081fd5b5051919050565b60008060408385031215610f55578081fd5b50508035926020909101359150565b600080600080600080600060e0888a031215610f7e578283fd5b87359650602088013567ffffffffffffffff80821115610f9c578485fd5b610fa88b838c01610caa565b975060408a0135915080821115610fbd578485fd5b610fc98b838c01610d30565b965060608a0135955060808a0135945060a08a0135915080821115610fec578384fd5b610ff88b838c01610caa565b935060c08a013591508082111561100d578283fd5b5061101a8a828b01610d30565b91505092959891949750929550565b600080600080600080600060e0888a031215611043578081fd5b87359650602088013567ffffffffffffffff80821115611061578283fd5b61106d8b838c01610caa565b975060408a0135915080821115611082578283fd5b61108e8b838c01610d30565b965060608a01359150808211156110a3578283fd5b6110af8b838c01610e75565b955060808a01359150808211156110c4578283fd5b6110d08b838c01610dfd565b945060a08a0135915080821115610fec578283fd5b6000602082840312156110f6578081fd5b8151610c9481611754565b600060208284031215611112578081fd5b813567ffffffffffffffff811115611128578182fd5b8201601f81018413611138578182fd5b61114784823560208401610c18565b949350505050565b60008060408385031215611161578182fd5b82519150602083015161117381611754565b809150509250929050565b6001600160a01b03169052565b600081518084526111a3816020860160208601611724565b601f01601f19169290920160200192915050565b600081518352602082015160208401526040820151604084015260608201516060840152608082015160a0608085015261114760a085018261118b565b6000604083018251845260208084015160408287015282815180855260608801915083830194508592505b8083101561123f578451825293830193600192909201919083019061121f565b509695505050505050565b6000815115158352602082015160208401526040820151604084015260608201516060840152608082015160a0608085015261114760a085018261118b565b918252602082015260400190565b6000888252876020830152600287106112ac57fe5b8660f81b60408301526bffffffffffffffffffffffff19808760601b166041840152808660601b1660558401525083606983015282516112f3816089850160208701611724565b9190910160890198975050505050505050565b6001600160a01b0391909116815260200190565b6001600160a01b0394909416845260208401929092526040830152606082015260800190565b9283526001600160a01b03919091166020830152604082015260600190565b60008482526060602083015261137860608301856111b7565b828103604084015261138a81856111f4565b9695505050505050565b938452602084019290925260408301526001600160a01b0316606082015260800190565b60208082526041908201527f5374617465207472616e736974696f6e2070726f63657373206d75737420626560408201527f20636f6d706c65746564207072696f7220746f2066696e616c697a6174696f6e6060820152601760f91b608082015260a00190565b60208082526054908201527f506f73742d737461746520726f6f7420676c6f62616c20696e646578206d757360408201527f7420657175616c20746f207468652070726520737461746520726f6f7420676c60608201527337b130b61034b73232bc1038363ab99037b7329760611b608082015260a00190565b60208082526024908201527f496e76616c6964207472616e73616374696f6e20696e636c7573696f6e20707260408201526337b7b31760e11b606082015260800190565b60208082526028908201527f496e76616c696420706f73742d737461746520726f6f7420696e636c7573696f6040820152673710383937b7b31760c11b606082015260800190565b6020808252604c908201527f5072652d737461746520726f6f7420676c6f62616c20696e646578206d75737460408201527f20657175616c20746f20746865207472616e73616374696f6e20726f6f74206760608201526b3637b130b61034b73232bc1760a11b608082015260a00190565b60208082526030908201527f5374617465207472616e736974696f6e20686173206e6f74206265656e20707260408201526f37bb32b710333930bab23ab632b73a1760811b606082015260800190565b60208082526027908201527f496e76616c6964207072652d737461746520726f6f7420696e636c7573696f6e60408201526610383937b7b31760c91b606082015260800190565b600060208252610c9460208301846111b7565b60006080825285516080830152602086015160a083015260408601516002811061166757fe5b60c083015260608601516001600160a01b031660e0830152608086015161169261010084018261117e565b5060a086015161012083015260c086015160e06101408401526116b961016084018261118b565b905082810360208401526116cd818761124a565b905082810360408401526116e181866111b7565b905082810360608401526116f581856111f4565b979650505050505050565b60405181810167ffffffffffffffff8111828210171561171c57fe5b604052919050565b60005b8381101561173f578181015183820152602001611727565b8381111561174e576000848401525b50505050565b6001600160a01b038116811461176957600080fd5b50565b801515811461176957600080fdfea2646970667358221220a4410e55d1858a434fb2e375f4d9fc03c5c14eec8400c883a4327d88553f607164736f6c63430007060033", - "devdoc": { - "details": "The Fraud Verifier contract coordinates the entire fraud proof verification process. If the fraud proof was successful it prunes any state batches from State Commitment Chain which were published after the fraudulent state root. Compiler used: solc Runtime target: EVM", - "kind": "dev", - "methods": { - "constructor": { - "params": { - "_libAddressManager": "Address of the Address Manager." - } - }, - "finalizeFraudVerification(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes32,bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))": { - "params": { - "_postStateRoot": "State root after the fraudulent transaction.", - "_postStateRootBatchHeader": "Batch header for the provided post-state root.", - "_postStateRootProof": "Inclusion proof for the provided post-state root.", - "_preStateRoot": "State root before the fraudulent transaction.", - "_preStateRootBatchHeader": "Batch header for the provided pre-state root.", - "_preStateRootProof": "Inclusion proof for the provided pre-state root.", - "_txHash": "The transaction for the state root" - } - }, - "getStateTransitioner(bytes32,bytes32)": { - "params": { - "_preStateRoot": "State root to query a transitioner for." - }, - "returns": { - "_transitioner": "Corresponding state transitioner contract." - } - }, - "initializeFraudVerification(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),(uint256,uint256,uint8,address,address,uint256,bytes),(bool,uint256,uint256,uint256,bytes),(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))": { - "params": { - "_preStateRoot": "State root before the fraudulent transaction.", - "_preStateRootBatchHeader": "Batch header for the provided pre-state root.", - "_preStateRootProof": "Inclusion proof for the provided pre-state root.", - "_transaction": "OVM transaction claimed to be fraudulent.", - "_transactionBatchHeader": "Batch header for the provided transaction.", - "_transactionProof": "Inclusion proof for the provided transaction.", - "_txChainElement": "OVM transaction chain element." - } - }, - "resolve(string)": { - "params": { - "_name": "Name to resolve an address for." - }, - "returns": { - "_0": "Address associated with the given name." - } - } - }, - "title": "OVM_FraudVerifier", - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": { - "finalizeFraudVerification(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes32,bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))": { - "notice": "Finalizes the fraud verification process." - }, - "getStateTransitioner(bytes32,bytes32)": { - "notice": "Retrieves the state transitioner for a given root." - }, - "initializeFraudVerification(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),(uint256,uint256,uint8,address,address,uint256,bytes),(bool,uint256,uint256,uint256,bytes),(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))": { - "notice": "Begins the fraud verification process." - }, - "resolve(string)": { - "notice": "Resolves the address associated with a given name." - } - }, - "version": 1 - }, - "storageLayout": { - "storage": [ - { - "astId": 12557, - "contract": "contracts/optimistic-ethereum/OVM/verification/OVM_FraudVerifier.sol:OVM_FraudVerifier", - "label": "libAddressManager", - "offset": 0, - "slot": "0", - "type": "t_contract(Lib_AddressManager)12550" - }, - { - "astId": 9171, - "contract": "contracts/optimistic-ethereum/OVM/verification/OVM_FraudVerifier.sol:OVM_FraudVerifier", - "label": "transitioners", - "offset": 0, - "slot": "1", - "type": "t_mapping(t_bytes32,t_contract(iOVM_StateTransitioner)11744)" - } - ], - "types": { - "t_bytes32": { - "encoding": "inplace", - "label": "bytes32", - "numberOfBytes": "32" - }, - "t_contract(Lib_AddressManager)12550": { - "encoding": "inplace", - "label": "contract Lib_AddressManager", - "numberOfBytes": "20" - }, - "t_contract(iOVM_StateTransitioner)11744": { - "encoding": "inplace", - "label": "contract iOVM_StateTransitioner", - "numberOfBytes": "20" - }, - "t_mapping(t_bytes32,t_contract(iOVM_StateTransitioner)11744)": { - "encoding": "mapping", - "key": "t_bytes32", - "label": "mapping(bytes32 => contract iOVM_StateTransitioner)", - "numberOfBytes": "32", - "value": "t_contract(iOVM_StateTransitioner)11744" - } - } - } -} \ No newline at end of file diff --git a/packages/contracts/deployments/goerli-v2/OVM_L1CrossDomainMessenger.json b/packages/contracts/deployments/goerli-v2/OVM_L1CrossDomainMessenger.json deleted file mode 100644 index 6d18c00aebfbc..0000000000000 --- a/packages/contracts/deployments/goerli-v2/OVM_L1CrossDomainMessenger.json +++ /dev/null @@ -1,501 +0,0 @@ -{ - "address": "0x7910D57c49fAE4F7c896A6cd185aB1e6196D8161", - "abi": [ - { - "inputs": [], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "bytes32", - "name": "msgHash", - "type": "bytes32" - } - ], - "name": "RelayedMessage", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "bytes", - "name": "message", - "type": "bytes" - } - ], - "name": "SentMessage", - "type": "event" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_libAddressManager", - "type": "address" - } - ], - "name": "initialize", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "libAddressManager", - "outputs": [ - { - "internalType": "contract Lib_AddressManager", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "messageNonce", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_target", - "type": "address" - }, - { - "internalType": "address", - "name": "_sender", - "type": "address" - }, - { - "internalType": "bytes", - "name": "_message", - "type": "bytes" - }, - { - "internalType": "uint256", - "name": "_messageNonce", - "type": "uint256" - }, - { - "components": [ - { - "internalType": "bytes32", - "name": "stateRoot", - "type": "bytes32" - }, - { - "components": [ - { - "internalType": "uint256", - "name": "batchIndex", - "type": "uint256" - }, - { - "internalType": "bytes32", - "name": "batchRoot", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "batchSize", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "prevTotalElements", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "extraData", - "type": "bytes" - } - ], - "internalType": "struct Lib_OVMCodec.ChainBatchHeader", - "name": "stateRootBatchHeader", - "type": "tuple" - }, - { - "components": [ - { - "internalType": "uint256", - "name": "index", - "type": "uint256" - }, - { - "internalType": "bytes32[]", - "name": "siblings", - "type": "bytes32[]" - } - ], - "internalType": "struct Lib_OVMCodec.ChainInclusionProof", - "name": "stateRootProof", - "type": "tuple" - }, - { - "internalType": "bytes", - "name": "stateTrieWitness", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "storageTrieWitness", - "type": "bytes" - } - ], - "internalType": "struct iOVM_L1CrossDomainMessenger.L2MessageInclusionProof", - "name": "_proof", - "type": "tuple" - } - ], - "name": "relayMessage", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "name": "relayedMessages", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_target", - "type": "address" - }, - { - "internalType": "address", - "name": "_sender", - "type": "address" - }, - { - "internalType": "bytes", - "name": "_message", - "type": "bytes" - }, - { - "internalType": "uint256", - "name": "_messageNonce", - "type": "uint256" - }, - { - "internalType": "uint32", - "name": "_gasLimit", - "type": "uint32" - } - ], - "name": "replayMessage", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "string", - "name": "_name", - "type": "string" - } - ], - "name": "resolve", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_target", - "type": "address" - }, - { - "internalType": "bytes", - "name": "_message", - "type": "bytes" - }, - { - "internalType": "uint32", - "name": "_gasLimit", - "type": "uint32" - } - ], - "name": "sendMessage", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "name": "sentMessages", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "name": "successfulMessages", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "xDomainMessageSender", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - } - ], - "transactionHash": "0x8b64ebf0c3487cceb01d17e8439c564b2b14799f28c35a2b1aac3fb058d6f283", - "receipt": { - "to": null, - "from": "0x558ba9b8d78713fbf768c1f8a584485B4003f43F", - "contractAddress": "0x7910D57c49fAE4F7c896A6cd185aB1e6196D8161", - "transactionIndex": 40, - "gasUsed": "2223784", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0x607efd803565bbe09d8be93b83ab720a6c102e18881feb5da411098364b00e61", - "transactionHash": "0x8b64ebf0c3487cceb01d17e8439c564b2b14799f28c35a2b1aac3fb058d6f283", - "logs": [], - "blockNumber": 4607706, - "cumulativeGasUsed": "4706575", - "status": 1, - "byzantium": true - }, - "args": [], - "solcInputHash": "8aef3555d89ad9d3af2f5d28a85dc856", - "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"msgHash\",\"type\":\"bytes32\"}],\"name\":\"RelayedMessage\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"}],\"name\":\"SentMessage\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"messageNonce\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_sender\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_message\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"_messageNonce\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"stateRootBatchHeader\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"siblings\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct Lib_OVMCodec.ChainInclusionProof\",\"name\":\"stateRootProof\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"stateTrieWitness\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"storageTrieWitness\",\"type\":\"bytes\"}],\"internalType\":\"struct iOVM_L1CrossDomainMessenger.L2MessageInclusionProof\",\"name\":\"_proof\",\"type\":\"tuple\"}],\"name\":\"relayMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"relayedMessages\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_sender\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_message\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"_messageNonce\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"_gasLimit\",\"type\":\"uint32\"}],\"name\":\"replayMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_message\",\"type\":\"bytes\"},{\"internalType\":\"uint32\",\"name\":\"_gasLimit\",\"type\":\"uint32\"}],\"name\":\"sendMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"sentMessages\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"successfulMessages\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"xDomainMessageSender\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The L1 Cross Domain Messenger contract sends messages from L1 to L2, and relays messages from L2 onto L1. In the event that a message sent from L1 to L2 is rejected for exceeding the L2 epoch gas limit, it can be resubmitted via this contract's replay function. Compiler used: solc Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"initialize(address)\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\"}},\"relayMessage(address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))\":{\"params\":{\"_message\":\"Message to send to the target.\",\"_messageNonce\":\"Nonce for the provided message.\",\"_proof\":\"Inclusion proof for the given message.\",\"_sender\":\"Message sender address.\",\"_target\":\"Target contract address.\"}},\"replayMessage(address,address,bytes,uint256,uint32)\":{\"params\":{\"_gasLimit\":\"Gas limit for the provided message.\",\"_message\":\"Message to send to the target.\",\"_messageNonce\":\"Nonce for the provided message.\",\"_sender\":\"Original sender address.\",\"_target\":\"Target contract address.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}},\"sendMessage(address,bytes,uint32)\":{\"params\":{\"_gasLimit\":\"Gas limit for the provided message.\",\"_message\":\"Message to send to the target.\",\"_target\":\"Target contract address.\"}}},\"title\":\"OVM_L1CrossDomainMessenger\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"constructor\":{\"notice\":\"Pass a default zero address to the address resolver. This will be updated when initialized.\"},\"relayMessage(address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))\":{\"notice\":\"Relays a cross domain message to a contract.\"},\"replayMessage(address,address,bytes,uint256,uint32)\":{\"notice\":\"Replays a cross domain message to the target messenger.\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"},\"sendMessage(address,bytes,uint32)\":{\"notice\":\"Sends a cross domain message to the target messenger.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1CrossDomainMessenger.sol\":\"OVM_L1CrossDomainMessenger\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/optimistic-ethereum/OVM/bridge/messaging/Abs_BaseCrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Interface Imports */\\nimport { iAbs_BaseCrossDomainMessenger } from \\\"../../../iOVM/bridge/messaging/iAbs_BaseCrossDomainMessenger.sol\\\";\\n\\n/* Library Imports */\\nimport { Lib_ReentrancyGuard } from \\\"../../../libraries/utils/Lib_ReentrancyGuard.sol\\\";\\n\\n/**\\n * @title Abs_BaseCrossDomainMessenger\\n * @dev The Base Cross Domain Messenger is an abstract contract providing the interface and common functionality used in the\\n * L1 and L2 Cross Domain Messengers. It can also serve as a template for developers wishing to implement a custom bridge \\n * contract to suit their needs.\\n *\\n * Compiler used: defined by child contract\\n * Runtime target: defined by child contract\\n */\\nabstract contract Abs_BaseCrossDomainMessenger is iAbs_BaseCrossDomainMessenger, Lib_ReentrancyGuard {\\n /**************\\n * Constants *\\n **************/\\n\\n // The default x-domain message sender being set to a non-zero value makes\\n // deployment a bit more expensive, but in exchange the refund on every call to\\n // `relayMessage` by the L1 and L2 messengers will be higher.\\n address internal constant DEFAULT_XDOMAIN_SENDER = 0x000000000000000000000000000000000000dEaD;\\n\\n /**********************\\n * Contract Variables *\\n **********************/\\n\\n mapping (bytes32 => bool) public relayedMessages;\\n mapping (bytes32 => bool) public successfulMessages;\\n mapping (bytes32 => bool) public sentMessages;\\n uint256 public messageNonce;\\n address internal xDomainMsgSender = DEFAULT_XDOMAIN_SENDER;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n constructor() Lib_ReentrancyGuard() {}\\n\\n function xDomainMessageSender() public override view returns (address) {\\n require(xDomainMsgSender != DEFAULT_XDOMAIN_SENDER, \\\"xDomainMessageSender is not set\\\");\\n return xDomainMsgSender;\\n }\\n\\n /**\\n * Sends a cross domain message to the target messenger.\\n * @param _target Target contract address.\\n * @param _message Message to send to the target.\\n * @param _gasLimit Gas limit for the provided message.\\n */\\n function sendMessage(\\n address _target,\\n bytes memory _message,\\n uint32 _gasLimit\\n )\\n override\\n public\\n {\\n bytes memory xDomainCalldata = _getXDomainCalldata(\\n _target,\\n msg.sender,\\n _message,\\n messageNonce\\n );\\n\\n messageNonce += 1;\\n sentMessages[keccak256(xDomainCalldata)] = true;\\n\\n _sendXDomainMessage(xDomainCalldata, _gasLimit);\\n emit SentMessage(xDomainCalldata);\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Generates the correct cross domain calldata for a message.\\n * @param _target Target contract address.\\n * @param _sender Message sender address.\\n * @param _message Message to send to the target.\\n * @param _messageNonce Nonce for the provided message.\\n * @return ABI encoded cross domain calldata.\\n */\\n function _getXDomainCalldata(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _messageNonce\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return abi.encodeWithSignature(\\n \\\"relayMessage(address,address,bytes,uint256)\\\",\\n _target,\\n _sender,\\n _message,\\n _messageNonce\\n );\\n }\\n\\n /**\\n * Sends a cross domain message.\\n * param // Message to send.\\n * param // Gas limit for the provided message.\\n */\\n function _sendXDomainMessage(\\n bytes memory, // _message,\\n uint256 // _gasLimit\\n )\\n virtual\\n internal\\n {\\n revert(\\\"Implement me in child contracts!\\\");\\n }\\n}\\n\",\"keccak256\":\"0xe6fa23a72685870720dcc4c2b4b6ff7f40aec284c3e1a02251f2369703a87260\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1CrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../../libraries/resolver/Lib_AddressResolver.sol\\\";\\nimport { Lib_AddressManager } from \\\"../../../libraries/resolver/Lib_AddressManager.sol\\\";\\nimport { Lib_SecureMerkleTrie } from \\\"../../../libraries/trie/Lib_SecureMerkleTrie.sol\\\";\\nimport { Lib_ReentrancyGuard } from \\\"../../../libraries/utils/Lib_ReentrancyGuard.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_L1CrossDomainMessenger } from \\\"../../../iOVM/bridge/messaging/iOVM_L1CrossDomainMessenger.sol\\\";\\nimport { iOVM_CanonicalTransactionChain } from \\\"../../../iOVM/chain/iOVM_CanonicalTransactionChain.sol\\\";\\nimport { iOVM_StateCommitmentChain } from \\\"../../../iOVM/chain/iOVM_StateCommitmentChain.sol\\\";\\n\\n/* Contract Imports */\\nimport { Abs_BaseCrossDomainMessenger } from \\\"./Abs_BaseCrossDomainMessenger.sol\\\";\\n\\n/**\\n * @title OVM_L1CrossDomainMessenger\\n * @dev The L1 Cross Domain Messenger contract sends messages from L1 to L2, and relays messages from L2 onto L1.\\n * In the event that a message sent from L1 to L2 is rejected for exceeding the L2 epoch gas limit, it can be resubmitted\\n * via this contract's replay function.\\n *\\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract OVM_L1CrossDomainMessenger is iOVM_L1CrossDomainMessenger, Abs_BaseCrossDomainMessenger, Lib_AddressResolver {\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * Pass a default zero address to the address resolver. This will be updated when initialized.\\n */\\n constructor()\\n Lib_AddressResolver(address(0))\\n {}\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n */\\n function initialize(\\n address _libAddressManager\\n )\\n public\\n {\\n require(address(libAddressManager) == address(0), \\\"L1CrossDomainMessenger already intialized.\\\");\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n xDomainMsgSender = DEFAULT_XDOMAIN_SENDER;\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n /**\\n * Modifier to enforce that, if configured, only the OVM_L2MessageRelayer contract may successfully call a method.\\n */\\n modifier onlyRelayer() {\\n address relayer = resolve(\\\"OVM_L2MessageRelayer\\\");\\n if (relayer != address(0)) {\\n require(\\n msg.sender == relayer,\\n \\\"Only OVM_L2MessageRelayer can relay L2-to-L1 messages.\\\"\\n );\\n }\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Relays a cross domain message to a contract.\\n * @inheritdoc iOVM_L1CrossDomainMessenger\\n */\\n function relayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _messageNonce,\\n L2MessageInclusionProof memory _proof\\n )\\n override\\n public\\n nonReentrant\\n onlyRelayer()\\n {\\n bytes memory xDomainCalldata = _getXDomainCalldata(\\n _target,\\n _sender,\\n _message,\\n _messageNonce\\n );\\n\\n require(\\n _verifyXDomainMessage(\\n xDomainCalldata,\\n _proof\\n ) == true,\\n \\\"Provided message could not be verified.\\\"\\n );\\n\\n bytes32 xDomainCalldataHash = keccak256(xDomainCalldata);\\n\\n require(\\n successfulMessages[xDomainCalldataHash] == false,\\n \\\"Provided message has already been received.\\\"\\n );\\n\\n xDomainMsgSender = _sender;\\n (bool success, ) = _target.call(_message);\\n xDomainMsgSender = DEFAULT_XDOMAIN_SENDER;\\n\\n // Mark the message as received if the call was successful. Ensures that a message can be\\n // relayed multiple times in the case that the call reverted.\\n if (success == true) {\\n successfulMessages[xDomainCalldataHash] = true;\\n emit RelayedMessage(xDomainCalldataHash);\\n }\\n\\n // Store an identifier that can be used to prove that the given message was relayed by some\\n // user. Gives us an easy way to pay relayers for their work.\\n bytes32 relayId = keccak256(\\n abi.encodePacked(\\n xDomainCalldata,\\n msg.sender,\\n block.number\\n )\\n );\\n relayedMessages[relayId] = true;\\n }\\n\\n /**\\n * Replays a cross domain message to the target messenger.\\n * @inheritdoc iOVM_L1CrossDomainMessenger\\n */\\n function replayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _messageNonce,\\n uint32 _gasLimit\\n )\\n override\\n public\\n {\\n bytes memory xDomainCalldata = _getXDomainCalldata(\\n _target,\\n _sender,\\n _message,\\n _messageNonce\\n );\\n\\n require(\\n sentMessages[keccak256(xDomainCalldata)] == true,\\n \\\"Provided message has not already been sent.\\\"\\n );\\n\\n _sendXDomainMessage(xDomainCalldata, _gasLimit);\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Verifies that the given message is valid.\\n * @param _xDomainCalldata Calldata to verify.\\n * @param _proof Inclusion proof for the message.\\n * @return Whether or not the provided message is valid.\\n */\\n function _verifyXDomainMessage(\\n bytes memory _xDomainCalldata,\\n L2MessageInclusionProof memory _proof\\n )\\n internal\\n view\\n returns (\\n bool\\n )\\n {\\n return (\\n _verifyStateRootProof(_proof)\\n && _verifyStorageProof(_xDomainCalldata, _proof)\\n );\\n }\\n\\n /**\\n * Verifies that the state root within an inclusion proof is valid.\\n * @param _proof Message inclusion proof.\\n * @return Whether or not the provided proof is valid.\\n */\\n function _verifyStateRootProof(\\n L2MessageInclusionProof memory _proof\\n )\\n internal\\n view\\n returns (\\n bool\\n )\\n {\\n iOVM_StateCommitmentChain ovmStateCommitmentChain = iOVM_StateCommitmentChain(resolve(\\\"OVM_StateCommitmentChain\\\"));\\n\\n return (\\n ovmStateCommitmentChain.insideFraudProofWindow(_proof.stateRootBatchHeader) == false\\n && ovmStateCommitmentChain.verifyStateCommitment(\\n _proof.stateRoot,\\n _proof.stateRootBatchHeader,\\n _proof.stateRootProof\\n )\\n );\\n }\\n\\n /**\\n * Verifies that the storage proof within an inclusion proof is valid.\\n * @param _xDomainCalldata Encoded message calldata.\\n * @param _proof Message inclusion proof.\\n * @return Whether or not the provided proof is valid.\\n */\\n function _verifyStorageProof(\\n bytes memory _xDomainCalldata,\\n L2MessageInclusionProof memory _proof\\n )\\n internal\\n view\\n returns (\\n bool\\n )\\n {\\n bytes32 storageKey = keccak256(\\n abi.encodePacked(\\n keccak256(\\n abi.encodePacked(\\n _xDomainCalldata,\\n resolve(\\\"OVM_L2CrossDomainMessenger\\\")\\n )\\n ),\\n uint256(0)\\n )\\n );\\n\\n (\\n bool exists,\\n bytes memory encodedMessagePassingAccount\\n ) = Lib_SecureMerkleTrie.get(\\n abi.encodePacked(0x4200000000000000000000000000000000000000),\\n _proof.stateTrieWitness,\\n _proof.stateRoot\\n );\\n\\n require(\\n exists == true,\\n \\\"Message passing predeploy has not been initialized or invalid proof provided.\\\"\\n );\\n\\n Lib_OVMCodec.EVMAccount memory account = Lib_OVMCodec.decodeEVMAccount(\\n encodedMessagePassingAccount\\n );\\n\\n return Lib_SecureMerkleTrie.verifyInclusionProof(\\n abi.encodePacked(storageKey),\\n abi.encodePacked(uint8(1)),\\n _proof.storageTrieWitness,\\n account.storageRoot\\n );\\n }\\n\\n /**\\n * Sends a cross domain message.\\n * @param _message Message to send.\\n * @param _gasLimit OVM gas limit for the message.\\n */\\n function _sendXDomainMessage(\\n bytes memory _message,\\n uint256 _gasLimit\\n )\\n override\\n internal\\n {\\n iOVM_CanonicalTransactionChain(resolve(\\\"OVM_CanonicalTransactionChain\\\")).enqueue(\\n resolve(\\\"OVM_L2CrossDomainMessenger\\\"),\\n _gasLimit,\\n _message\\n );\\n }\\n}\\n\",\"keccak256\":\"0xf1ffb01c7274d1fde7713cc1e6c5ee5c77edfb0849b94d34a7ac0c26d795c478\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/bridge/messaging/iAbs_BaseCrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/**\\n * @title iAbs_BaseCrossDomainMessenger\\n */\\ninterface iAbs_BaseCrossDomainMessenger {\\n\\n /**********\\n * Events *\\n **********/\\n event SentMessage(bytes message);\\n event RelayedMessage(bytes32 msgHash);\\n\\n /**********************\\n * Contract Variables *\\n **********************/\\n function xDomainMessageSender() external view returns (address);\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sends a cross domain message to the target messenger.\\n * @param _target Target contract address.\\n * @param _message Message to send to the target.\\n * @param _gasLimit Gas limit for the provided message.\\n */\\n function sendMessage(\\n address _target,\\n bytes calldata _message,\\n uint32 _gasLimit\\n ) external;\\n}\\n\",\"keccak256\":\"0xc2bd6b373daae2ede34281f4be5938d02b9d1cfb056b40d65ff70b7f16ce3c86\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/bridge/messaging/iOVM_L1CrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { iAbs_BaseCrossDomainMessenger } from \\\"./iAbs_BaseCrossDomainMessenger.sol\\\";\\n\\n/**\\n * @title iOVM_L1CrossDomainMessenger\\n */\\ninterface iOVM_L1CrossDomainMessenger is iAbs_BaseCrossDomainMessenger {\\n\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n struct L2MessageInclusionProof {\\n bytes32 stateRoot;\\n Lib_OVMCodec.ChainBatchHeader stateRootBatchHeader;\\n Lib_OVMCodec.ChainInclusionProof stateRootProof;\\n bytes stateTrieWitness;\\n bytes storageTrieWitness;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Relays a cross domain message to a contract.\\n * @param _target Target contract address.\\n * @param _sender Message sender address.\\n * @param _message Message to send to the target.\\n * @param _messageNonce Nonce for the provided message.\\n * @param _proof Inclusion proof for the given message.\\n */\\n function relayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _messageNonce,\\n L2MessageInclusionProof memory _proof\\n ) external;\\n\\n /**\\n * Replays a cross domain message to the target messenger.\\n * @param _target Target contract address.\\n * @param _sender Original sender address.\\n * @param _message Message to send to the target.\\n * @param _messageNonce Nonce for the provided message.\\n * @param _gasLimit Gas limit for the provided message.\\n */\\n function replayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _messageNonce,\\n uint32 _gasLimit\\n ) external;\\n}\\n\",\"keccak256\":\"0xdcd239d0b215e400674d78e8db4ac12ba18efc34fa78e24c2ff867f61062dba2\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_CanonicalTransactionChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_ChainStorageContainer } from \\\"./iOVM_ChainStorageContainer.sol\\\";\\n\\n/**\\n * @title iOVM_CanonicalTransactionChain\\n */\\ninterface iOVM_CanonicalTransactionChain {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event TransactionEnqueued(\\n address _l1TxOrigin,\\n address _target,\\n uint256 _gasLimit,\\n bytes _data,\\n uint256 _queueIndex,\\n uint256 _timestamp\\n );\\n\\n event QueueBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event SequencerBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event TransactionBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct BatchContext {\\n uint256 numSequencedTransactions;\\n uint256 numSubsequentQueueTransactions;\\n uint256 timestamp;\\n uint256 blockNumber;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n\\n /**\\n * Accesses the batch storage container.\\n * @return Reference to the batch storage container.\\n */\\n function batches()\\n external\\n view\\n returns (\\n iOVM_ChainStorageContainer\\n );\\n\\n /**\\n * Accesses the queue storage container.\\n * @return Reference to the queue storage container.\\n */\\n function queue()\\n external\\n view\\n returns (\\n iOVM_ChainStorageContainer\\n );\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements()\\n external\\n view\\n returns (\\n uint256 _totalElements\\n );\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches()\\n external\\n view\\n returns (\\n uint256 _totalBatches\\n );\\n\\n /**\\n * Returns the index of the next element to be enqueued.\\n * @return Index for the next queue element.\\n */\\n function getNextQueueIndex()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Gets the queue element at a particular index.\\n * @param _index Index of the queue element to access.\\n * @return _element Queue element at the given index.\\n */\\n function getQueueElement(\\n uint256 _index\\n )\\n external\\n view\\n returns (\\n Lib_OVMCodec.QueueElement memory _element\\n );\\n\\n /**\\n * Returns the timestamp of the last transaction.\\n * @return Timestamp for the last transaction.\\n */\\n function getLastTimestamp()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Returns the blocknumber of the last transaction.\\n * @return Blocknumber for the last transaction.\\n */\\n function getLastBlockNumber()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Get the number of queue elements which have not yet been included.\\n * @return Number of pending queue elements.\\n */\\n function getNumPendingQueueElements()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Retrieves the length of the queue, including\\n * both pending and canonical transactions.\\n * @return Length of the queue.\\n */\\n function getQueueLength()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n\\n /**\\n * Adds a transaction to the queue.\\n * @param _target Target contract to send the transaction to.\\n * @param _gasLimit Gas limit for the given transaction.\\n * @param _data Transaction data.\\n */\\n function enqueue(\\n address _target,\\n uint256 _gasLimit,\\n bytes memory _data\\n )\\n external;\\n\\n /**\\n * Appends a given number of queued transactions as a single batch.\\n * @param _numQueuedTransactions Number of transactions to append.\\n */\\n function appendQueueBatch(\\n uint256 _numQueuedTransactions\\n )\\n external;\\n\\n /**\\n * Allows the sequencer to append a batch of transactions.\\n * @dev This function uses a custom encoding scheme for efficiency reasons.\\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\\n * .param _contexts Array of batch contexts.\\n * .param _transactionDataFields Array of raw transaction data.\\n */\\n function appendSequencerBatch(\\n // uint40 _shouldStartAtElement,\\n // uint24 _totalElementsToAppend,\\n // BatchContext[] _contexts,\\n // bytes[] _transactionDataFields\\n )\\n external;\\n\\n /**\\n * Verifies whether a transaction is included in the chain.\\n * @param _transaction Transaction to verify.\\n * @param _txChainElement Transaction chain element corresponding to the transaction.\\n * @param _batchHeader Header of the batch the transaction was included in.\\n * @param _inclusionProof Inclusion proof for the provided transaction chain element.\\n * @return True if the transaction exists in the CTC, false if not.\\n */\\n function verifyTransaction(\\n Lib_OVMCodec.Transaction memory _transaction,\\n Lib_OVMCodec.TransactionChainElement memory _txChainElement,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _inclusionProof\\n )\\n external\\n view\\n returns (\\n bool\\n );\\n}\\n\",\"keccak256\":\"0xb5e55488a1982841c07cdf5ff475da4789596f111dd48f01b1918ee4c775cf3a\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_ChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title iOVM_ChainStorageContainer\\n */\\ninterface iOVM_ChainStorageContainer {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata()\\n external\\n view\\n returns (\\n bytes27\\n );\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length()\\n external\\n view\\n returns (\\n uint256\\n );\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(\\n bytes32 _object\\n )\\n external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(\\n bytes32 _object,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(\\n uint256 _index\\n )\\n external\\n view\\n returns (\\n bytes32\\n );\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index\\n )\\n external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Marks an index as overwritable, meaing the underlying buffer can start to write values over\\n * any objects before and including the given index.\\n */\\n function setNextOverwritableIndex(\\n uint256 _index\\n )\\n external;\\n}\\n\",\"keccak256\":\"0x2d7973a0ad84c23ec62624d3f1e3aeb198cc72686ff1e6cfa17155556b320c94\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_StateCommitmentChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title iOVM_StateCommitmentChain\\n */\\ninterface iOVM_StateCommitmentChain {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event StateBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n event StateBatchDeleted(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot\\n );\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements()\\n external\\n view\\n returns (\\n uint256 _totalElements\\n );\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches()\\n external\\n view\\n returns (\\n uint256 _totalBatches\\n );\\n\\n /**\\n * Retrieves the timestamp of the last batch submitted by the sequencer.\\n * @return _lastSequencerTimestamp Last sequencer batch timestamp.\\n */\\n function getLastSequencerTimestamp()\\n external\\n view\\n returns (\\n uint256 _lastSequencerTimestamp\\n );\\n\\n /**\\n * Appends a batch of state roots to the chain.\\n * @param _batch Batch of state roots.\\n * @param _shouldStartAtElement Index of the element at which this batch should start.\\n */\\n function appendStateBatch(\\n bytes32[] calldata _batch,\\n uint256 _shouldStartAtElement\\n )\\n external;\\n\\n /**\\n * Deletes all state roots after (and including) a given batch.\\n * @param _batchHeader Header of the batch to start deleting from.\\n */\\n function deleteStateBatch(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n external;\\n\\n /**\\n * Verifies a batch inclusion proof.\\n * @param _element Hash of the element to verify a proof for.\\n * @param _batchHeader Header of the batch in which the element was included.\\n * @param _proof Merkle inclusion proof for the element.\\n */\\n function verifyStateCommitment(\\n bytes32 _element,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _proof\\n )\\n external\\n view\\n returns (\\n bool _verified\\n );\\n\\n /**\\n * Checks whether a given batch is still inside its fraud proof window.\\n * @param _batchHeader Header of the batch to check.\\n * @return _inside Whether or not the batch is inside the fraud proof window.\\n */\\n function insideFraudProofWindow(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n external\\n view\\n returns (\\n bool _inside\\n );\\n}\\n\",\"keccak256\":\"0x6646d6ff392b81aab52a7a277e91540819464751de0af5afd1962094b2e92448\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/codec/Lib_OVMCodec.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../utils/Lib_Bytes32Utils.sol\\\";\\nimport { Lib_SafeExecutionManagerWrapper } from \\\"../../libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\\\";\\n\\n/**\\n * @title Lib_OVMCodec\\n */\\nlibrary Lib_OVMCodec {\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum EOASignatureType {\\n EIP155_TRANSACTION,\\n ETH_SIGNED_MESSAGE\\n }\\n\\n enum QueueOrigin {\\n SEQUENCER_QUEUE,\\n L1TOL2_QUEUE\\n }\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Account {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n address ethAddress;\\n bool isFresh;\\n }\\n\\n struct EVMAccount {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n }\\n\\n struct ChainBatchHeader {\\n uint256 batchIndex;\\n bytes32 batchRoot;\\n uint256 batchSize;\\n uint256 prevTotalElements;\\n bytes extraData;\\n }\\n\\n struct ChainInclusionProof {\\n uint256 index;\\n bytes32[] siblings;\\n }\\n\\n struct Transaction {\\n uint256 timestamp;\\n uint256 blockNumber;\\n QueueOrigin l1QueueOrigin;\\n address l1TxOrigin;\\n address entrypoint;\\n uint256 gasLimit;\\n bytes data;\\n }\\n\\n struct TransactionChainElement {\\n bool isSequenced;\\n uint256 queueIndex; // QUEUED TX ONLY\\n uint256 timestamp; // SEQUENCER TX ONLY\\n uint256 blockNumber; // SEQUENCER TX ONLY\\n bytes txData; // SEQUENCER TX ONLY\\n }\\n\\n struct QueueElement {\\n bytes32 transactionHash;\\n uint40 timestamp;\\n uint40 blockNumber;\\n }\\n\\n struct EIP155Transaction {\\n uint256 nonce;\\n uint256 gasPrice;\\n uint256 gasLimit;\\n address to;\\n uint256 value;\\n bytes data;\\n uint256 chainId;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Decodes an EOA transaction (i.e., native Ethereum RLP encoding).\\n * @param _transaction Encoded EOA transaction.\\n * @return Transaction decoded into a struct.\\n */\\n function decodeEIP155Transaction(\\n bytes memory _transaction,\\n bool _isEthSignedMessage\\n )\\n internal\\n pure\\n returns (\\n EIP155Transaction memory\\n )\\n {\\n if (_isEthSignedMessage) {\\n (\\n uint256 _nonce,\\n uint256 _gasLimit,\\n uint256 _gasPrice,\\n uint256 _chainId,\\n address _to,\\n bytes memory _data\\n ) = abi.decode(\\n _transaction,\\n (uint256, uint256, uint256, uint256, address ,bytes)\\n );\\n return EIP155Transaction({\\n nonce: _nonce,\\n gasPrice: _gasPrice,\\n gasLimit: _gasLimit,\\n to: _to,\\n value: 0,\\n data: _data,\\n chainId: _chainId\\n });\\n } else {\\n Lib_RLPReader.RLPItem[] memory decoded = Lib_RLPReader.readList(_transaction);\\n\\n return EIP155Transaction({\\n nonce: Lib_RLPReader.readUint256(decoded[0]),\\n gasPrice: Lib_RLPReader.readUint256(decoded[1]),\\n gasLimit: Lib_RLPReader.readUint256(decoded[2]),\\n to: Lib_RLPReader.readAddress(decoded[3]),\\n value: Lib_RLPReader.readUint256(decoded[4]),\\n data: Lib_RLPReader.readBytes(decoded[5]),\\n chainId: Lib_RLPReader.readUint256(decoded[6])\\n });\\n }\\n }\\n\\n /**\\n * Decompresses a compressed EIP155 transaction.\\n * @param _transaction Compressed EIP155 transaction bytes.\\n * @return Transaction parsed into a struct.\\n */\\n function decompressEIP155Transaction(\\n bytes memory _transaction\\n )\\n internal\\n returns (\\n EIP155Transaction memory\\n )\\n {\\n return EIP155Transaction({\\n gasLimit: Lib_BytesUtils.toUint24(_transaction, 0),\\n gasPrice: uint256(Lib_BytesUtils.toUint24(_transaction, 3)) * 1000000,\\n nonce: Lib_BytesUtils.toUint24(_transaction, 6),\\n to: Lib_BytesUtils.toAddress(_transaction, 9),\\n data: Lib_BytesUtils.slice(_transaction, 29),\\n chainId: Lib_SafeExecutionManagerWrapper.safeCHAINID(),\\n value: 0\\n });\\n }\\n\\n /**\\n * Encodes an EOA transaction back into the original transaction.\\n * @param _transaction EIP155transaction to encode.\\n * @param _isEthSignedMessage Whether or not this was an eth signed message.\\n * @return Encoded transaction.\\n */\\n function encodeEIP155Transaction(\\n EIP155Transaction memory _transaction,\\n bool _isEthSignedMessage\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n if (_isEthSignedMessage) {\\n return abi.encode(\\n _transaction.nonce,\\n _transaction.gasLimit,\\n _transaction.gasPrice,\\n _transaction.chainId,\\n _transaction.to,\\n _transaction.data\\n );\\n } else {\\n bytes[] memory raw = new bytes[](9);\\n\\n raw[0] = Lib_RLPWriter.writeUint(_transaction.nonce);\\n raw[1] = Lib_RLPWriter.writeUint(_transaction.gasPrice);\\n raw[2] = Lib_RLPWriter.writeUint(_transaction.gasLimit);\\n if (_transaction.to == address(0)) {\\n raw[3] = Lib_RLPWriter.writeBytes('');\\n } else {\\n raw[3] = Lib_RLPWriter.writeAddress(_transaction.to);\\n }\\n raw[4] = Lib_RLPWriter.writeUint(0);\\n raw[5] = Lib_RLPWriter.writeBytes(_transaction.data);\\n raw[6] = Lib_RLPWriter.writeUint(_transaction.chainId);\\n raw[7] = Lib_RLPWriter.writeBytes(bytes(''));\\n raw[8] = Lib_RLPWriter.writeBytes(bytes(''));\\n\\n return Lib_RLPWriter.writeList(raw);\\n }\\n }\\n\\n /**\\n * Encodes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Encoded transaction bytes.\\n */\\n function encodeTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return abi.encodePacked(\\n _transaction.timestamp,\\n _transaction.blockNumber,\\n _transaction.l1QueueOrigin,\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n );\\n }\\n\\n /**\\n * Hashes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Hashed transaction\\n */\\n function hashTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(encodeTransaction(_transaction));\\n }\\n\\n /**\\n * Converts an OVM account to an EVM account.\\n * @param _in OVM account to convert.\\n * @return Converted EVM account.\\n */\\n function toEVMAccount(\\n Account memory _in\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n return EVMAccount({\\n nonce: _in.nonce,\\n balance: _in.balance,\\n storageRoot: _in.storageRoot,\\n codeHash: _in.codeHash\\n });\\n }\\n\\n /**\\n * @notice RLP-encodes an account state struct.\\n * @param _account Account state struct.\\n * @return RLP-encoded account state.\\n */\\n function encodeEVMAccount(\\n EVMAccount memory _account\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes[] memory raw = new bytes[](4);\\n\\n // Unfortunately we can't create this array outright because\\n // Lib_RLPWriter.writeList will reject fixed-size arrays. Assigning\\n // index-by-index circumvents this issue.\\n raw[0] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.nonce)\\n )\\n );\\n raw[1] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.balance)\\n )\\n );\\n raw[2] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.storageRoot));\\n raw[3] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.codeHash));\\n\\n return Lib_RLPWriter.writeList(raw);\\n }\\n\\n /**\\n * @notice Decodes an RLP-encoded account state into a useful struct.\\n * @param _encoded RLP-encoded account state.\\n * @return Account state struct.\\n */\\n function decodeEVMAccount(\\n bytes memory _encoded\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\\n\\n return EVMAccount({\\n nonce: Lib_RLPReader.readUint256(accountState[0]),\\n balance: Lib_RLPReader.readUint256(accountState[1]),\\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\\n });\\n }\\n\\n /**\\n * Calculates a hash for a given batch header.\\n * @param _batchHeader Header to hash.\\n * @return Hash of the header.\\n */\\n function hashBatchHeader(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(\\n abi.encode(\\n _batchHeader.batchRoot,\\n _batchHeader.batchSize,\\n _batchHeader.prevTotalElements,\\n _batchHeader.extraData\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0xe7e518ba7bba3fa28c532f8902576c1bb4dfc1ec4b62bed6da50623248ba17c3\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Contract Imports */\\nimport { Ownable } from \\\"./Lib_Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n public\\n onlyOwner\\n {\\n addresses[_getNameHash(_name)] = _address;\\n\\n emit AddressSet(\\n _name,\\n _address\\n );\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0x36473d229ce0ba9d1cac5f02f84be843d9dcc8008525590a1652a2c2636f95f2\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(\\n address _libAddressManager\\n ) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x65981feeabff6a81783ea97d44baf988a18a86c8cb374c46fdb71819cbacc7c0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Ownable\\n * @dev Adapted from https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol\\n */\\nabstract contract Ownable {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n address public owner;\\n\\n\\n /**********\\n * Events *\\n **********/\\n\\n event OwnershipTransferred(\\n address indexed previousOwner,\\n address indexed newOwner\\n );\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n constructor() {\\n owner = msg.sender;\\n emit OwnershipTransferred(address(0), owner);\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n owner == msg.sender,\\n \\\"Ownable: caller is not the owner\\\"\\n );\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the owner of this contract to the zero address, effectively renouncing ownership\\n * completely. Can only be called by the current owner of this contract.\\n */\\n function renounceOwnership()\\n public\\n virtual\\n onlyOwner\\n {\\n emit OwnershipTransferred(owner, address(0));\\n owner = address(0);\\n }\\n\\n /**\\n * Transfers ownership of this contract to a new address. Can only be called by the current\\n * owner of this contract.\\n * @param _newOwner Address of the new contract owner.\\n */\\n function transferOwnership(\\n address _newOwner\\n )\\n public\\n virtual\\n onlyOwner\\n {\\n require(\\n _newOwner != address(0),\\n \\\"Ownable: new owner cannot be the zero address\\\"\\n );\\n\\n emit OwnershipTransferred(owner, _newOwner);\\n owner = _newOwner;\\n }\\n}\\n\",\"keccak256\":\"0x83f9a6c4608b5929086429205b00f8211cdfcba83f3c84520f24d8aa64fe4b82\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPReader.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_RLPReader\\n * @dev Adapted from \\\"RLPReader\\\" by Hamdi Allam (hamdi.allam97@gmail.com).\\n */\\nlibrary Lib_RLPReader {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 constant internal MAX_LIST_LENGTH = 32;\\n\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum RLPItemType {\\n DATA_ITEM,\\n LIST_ITEM\\n }\\n\\n \\n /***********\\n * Structs *\\n ***********/\\n\\n struct RLPItem {\\n uint256 length;\\n uint256 ptr;\\n }\\n \\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n \\n /**\\n * Converts bytes to a reference to memory position and length.\\n * @param _in Input bytes to convert.\\n * @return Output memory reference.\\n */\\n function toRLPItem(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem memory\\n )\\n {\\n uint256 ptr;\\n assembly {\\n ptr := add(_in, 32)\\n }\\n\\n return RLPItem({\\n length: _in.length,\\n ptr: ptr\\n });\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n (\\n uint256 listOffset,\\n ,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.LIST_ITEM,\\n \\\"Invalid RLP list value.\\\"\\n );\\n\\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\\n // writing to the length. Since we can't know the number of RLP items without looping over\\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\\n // simply set a reasonable maximum list length and decrease the size before we finish.\\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\\n\\n uint256 itemCount = 0;\\n uint256 offset = listOffset;\\n while (offset < _in.length) {\\n require(\\n itemCount < MAX_LIST_LENGTH,\\n \\\"Provided RLP list exceeds max list length.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n ) = _decodeLength(RLPItem({\\n length: _in.length - offset,\\n ptr: _in.ptr + offset\\n }));\\n\\n out[itemCount] = RLPItem({\\n length: itemLength + itemOffset,\\n ptr: _in.ptr + offset\\n });\\n\\n itemCount += 1;\\n offset += itemOffset + itemLength;\\n }\\n\\n // Decrease the array size to match the actual item count.\\n assembly {\\n mstore(out, itemCount)\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n return readList(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes value.\\\"\\n );\\n\\n return _copy(_in.ptr, itemOffset, itemLength);\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return readBytes(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return string(readBytes(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return readString(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n require(\\n _in.length <= 33,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr + itemOffset;\\n bytes32 out;\\n assembly {\\n out := mload(ptr)\\n\\n // Shift the bytes over to match the item size.\\n if lt(itemLength, 32) {\\n out := div(out, exp(256, sub(32, itemLength)))\\n }\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return readBytes32(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return uint256(readBytes32(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return readUint256(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n require(\\n _in.length == 1,\\n \\\"Invalid RLP boolean value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 out;\\n assembly {\\n out := byte(0, mload(ptr))\\n }\\n\\n require(\\n out == 0 || out == 1,\\n \\\"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\\\"\\n );\\n\\n return out != 0;\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return readBool(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n if (_in.length == 1) {\\n return address(0);\\n }\\n\\n require(\\n _in.length == 21,\\n \\\"Invalid RLP address value.\\\"\\n );\\n\\n return address(readUint256(_in));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return readAddress(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads the raw bytes of an RLP item.\\n * @param _in RLP item to read.\\n * @return Raw RLP bytes.\\n */\\n function readRawBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in);\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Decodes the length of an RLP item.\\n * @param _in RLP item to decode.\\n * @return Offset of the encoded data.\\n * @return Length of the encoded data.\\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\\n */\\n function _decodeLength(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n uint256,\\n uint256,\\n RLPItemType\\n )\\n {\\n require(\\n _in.length > 0,\\n \\\"RLP item cannot be null.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 prefix;\\n assembly {\\n prefix := byte(0, mload(ptr))\\n }\\n\\n if (prefix <= 0x7f) {\\n // Single byte.\\n\\n return (0, 1, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xb7) {\\n // Short string.\\n\\n uint256 strLen = prefix - 0x80;\\n \\n require(\\n _in.length > strLen,\\n \\\"Invalid RLP short string.\\\"\\n );\\n\\n return (1, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xbf) {\\n // Long string.\\n uint256 lenOfStrLen = prefix - 0xb7;\\n\\n require(\\n _in.length > lenOfStrLen,\\n \\\"Invalid RLP long string length.\\\"\\n );\\n\\n uint256 strLen;\\n assembly {\\n // Pick out the string length.\\n strLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfStrLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfStrLen + strLen,\\n \\\"Invalid RLP long string.\\\"\\n );\\n\\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xf7) {\\n // Short list.\\n uint256 listLen = prefix - 0xc0;\\n\\n require(\\n _in.length > listLen,\\n \\\"Invalid RLP short list.\\\"\\n );\\n\\n return (1, listLen, RLPItemType.LIST_ITEM);\\n } else {\\n // Long list.\\n uint256 lenOfListLen = prefix - 0xf7;\\n\\n require(\\n _in.length > lenOfListLen,\\n \\\"Invalid RLP long list length.\\\"\\n );\\n\\n uint256 listLen;\\n assembly {\\n // Pick out the list length.\\n listLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfListLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfListLen + listLen,\\n \\\"Invalid RLP long list.\\\"\\n );\\n\\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\\n }\\n }\\n\\n /**\\n * Copies the bytes from a memory location.\\n * @param _src Pointer to the location to read from.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Copied bytes.\\n */\\n function _copy(\\n uint256 _src,\\n uint256 _offset,\\n uint256 _length\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out = new bytes(_length);\\n if (out.length == 0) {\\n return out;\\n }\\n\\n uint256 src = _src + _offset;\\n uint256 dest;\\n assembly {\\n dest := add(out, 32)\\n }\\n\\n // Copy over as many complete words as we can.\\n for (uint256 i = 0; i < _length / 32; i++) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n\\n src += 32;\\n dest += 32;\\n }\\n\\n // Pick out the remaining bytes.\\n uint256 mask = 256 ** (32 - (_length % 32)) - 1;\\n assembly {\\n mstore(\\n dest,\\n or(\\n and(mload(src), not(mask)),\\n and(mload(dest), mask)\\n )\\n )\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Copies an RLP item into bytes.\\n * @param _in RLP item to copy.\\n * @return Copied bytes.\\n */\\n function _copy(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in.ptr, 0, _in.length);\\n }\\n}\\n\",\"keccak256\":\"0xbdb8fae0ca2483b4cc07607a5070fc25e33c54b4e4462b99e7c0b13aac48a09b\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPWriter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\n\\n/**\\n * @title Lib_RLPWriter\\n * @author Bakaoh (with modifications)\\n */\\nlibrary Lib_RLPWriter {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * RLP encodes a byte string.\\n * @param _in The byte string to encode.\\n * @return _out The RLP encoded string in bytes.\\n */\\n function writeBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n bytes memory encoded;\\n\\n if (_in.length == 1 && uint8(_in[0]) < 128) {\\n encoded = _in;\\n } else {\\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * RLP encodes a list of RLP encoded byte byte strings.\\n * @param _in The list of RLP encoded byte strings.\\n * @return _out The RLP encoded list of items in bytes.\\n */\\n function writeList(\\n bytes[] memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n bytes memory list = _flatten(_in);\\n return abi.encodePacked(_writeLength(list.length, 192), list);\\n }\\n\\n /**\\n * RLP encodes a string.\\n * @param _in The string to encode.\\n * @return _out The RLP encoded string in bytes.\\n */\\n function writeString(\\n string memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(bytes(_in));\\n }\\n\\n /**\\n * RLP encodes an address.\\n * @param _in The address to encode.\\n * @return _out The RLP encoded address in bytes.\\n */\\n function writeAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a uint.\\n * @param _in The uint256 to encode.\\n * @return _out The RLP encoded uint256 in bytes.\\n */\\n function writeUint(\\n uint256 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(_toBinary(_in));\\n }\\n\\n /**\\n * RLP encodes a bool.\\n * @param _in The bool to encode.\\n * @return _out The RLP encoded bool in bytes.\\n */\\n function writeBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n bytes memory encoded = new bytes(1);\\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\\n return encoded;\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\\n * @param _len The length of the string or the payload.\\n * @param _offset 128 if item is string, 192 if item is list.\\n * @return _encoded RLP encoded bytes.\\n */\\n function _writeLength(\\n uint256 _len,\\n uint256 _offset\\n )\\n private\\n pure\\n returns (\\n bytes memory _encoded\\n )\\n {\\n bytes memory encoded;\\n\\n if (_len < 56) {\\n encoded = new bytes(1);\\n encoded[0] = byte(uint8(_len) + uint8(_offset));\\n } else {\\n uint256 lenLen;\\n uint256 i = 1;\\n while (_len / i != 0) {\\n lenLen++;\\n i *= 256;\\n }\\n\\n encoded = new bytes(lenLen + 1);\\n encoded[0] = byte(uint8(lenLen) + uint8(_offset) + 55);\\n for(i = 1; i <= lenLen; i++) {\\n encoded[i] = byte(uint8((_len / (256**(lenLen-i))) % 256));\\n }\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * Encode integer in big endian binary form with no leading zeroes.\\n * @notice TODO: This should be optimized with assembly to save gas costs.\\n * @param _x The integer to encode.\\n * @return _binary RLP encoded bytes.\\n */\\n function _toBinary(\\n uint256 _x\\n )\\n private\\n pure\\n returns (\\n bytes memory _binary\\n )\\n {\\n bytes memory b = abi.encodePacked(_x);\\n\\n uint256 i = 0;\\n for (; i < 32; i++) {\\n if (b[i] != 0) {\\n break;\\n }\\n }\\n\\n bytes memory res = new bytes(32 - i);\\n for (uint256 j = 0; j < res.length; j++) {\\n res[j] = b[i++];\\n }\\n\\n return res;\\n }\\n\\n /**\\n * Copies a piece of memory to another location.\\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\\n * @param _dest Destination location.\\n * @param _src Source location.\\n * @param _len Length of memory to copy.\\n */\\n function _memcpy(\\n uint256 _dest,\\n uint256 _src,\\n uint256 _len\\n )\\n private\\n pure\\n {\\n uint256 dest = _dest;\\n uint256 src = _src;\\n uint256 len = _len;\\n\\n for(; len >= 32; len -= 32) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n dest += 32;\\n src += 32;\\n }\\n\\n uint256 mask = 256 ** (32 - len) - 1;\\n assembly {\\n let srcpart := and(mload(src), not(mask))\\n let destpart := and(mload(dest), mask)\\n mstore(dest, or(destpart, srcpart))\\n }\\n }\\n\\n /**\\n * Flattens a list of byte strings into one byte string.\\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\\n * @param _list List of byte strings to flatten.\\n * @return _flattened The flattened byte string.\\n */\\n function _flatten(\\n bytes[] memory _list\\n )\\n private\\n pure\\n returns (\\n bytes memory _flattened\\n )\\n {\\n if (_list.length == 0) {\\n return new bytes(0);\\n }\\n\\n uint256 len;\\n uint256 i = 0;\\n for (; i < _list.length; i++) {\\n len += _list[i].length;\\n }\\n\\n bytes memory flattened = new bytes(len);\\n uint256 flattenedPtr;\\n assembly { flattenedPtr := add(flattened, 0x20) }\\n\\n for(i = 0; i < _list.length; i++) {\\n bytes memory item = _list[i];\\n\\n uint256 listPtr;\\n assembly { listPtr := add(item, 0x20)}\\n\\n _memcpy(flattenedPtr, listPtr, item.length);\\n flattenedPtr += _list[i].length;\\n }\\n\\n return flattened;\\n }\\n}\",\"keccak256\":\"0xbcb24619c1758cb0d9f3fe5c79495950045a9087046a02b9ce01df46ae09ae5b\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/trie/Lib_MerkleTrie.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\n\\n/**\\n * @title Lib_MerkleTrie\\n */\\nlibrary Lib_MerkleTrie {\\n\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n enum NodeType {\\n BranchNode,\\n ExtensionNode,\\n LeafNode\\n }\\n\\n struct TrieNode {\\n bytes encoded;\\n Lib_RLPReader.RLPItem[] decoded;\\n }\\n\\n\\n /**********************\\n * Contract Constants *\\n **********************/\\n\\n // TREE_RADIX determines the number of elements per branch node.\\n uint256 constant TREE_RADIX = 16;\\n // Branch nodes have TREE_RADIX elements plus an additional `value` slot.\\n uint256 constant BRANCH_NODE_LENGTH = TREE_RADIX + 1;\\n // Leaf nodes and extension nodes always have two elements, a `path` and a `value`.\\n uint256 constant LEAF_OR_EXTENSION_NODE_LENGTH = 2;\\n\\n // Prefixes are prepended to the `path` within a leaf or extension node and\\n // allow us to differentiate between the two node types. `ODD` or `EVEN` is\\n // determined by the number of nibbles within the unprefixed `path`. If the\\n // number of nibbles if even, we need to insert an extra padding nibble so\\n // the resulting prefixed `path` has an even number of nibbles.\\n uint8 constant PREFIX_EXTENSION_EVEN = 0;\\n uint8 constant PREFIX_EXTENSION_ODD = 1;\\n uint8 constant PREFIX_LEAF_EVEN = 2;\\n uint8 constant PREFIX_LEAF_ODD = 3;\\n\\n // Just a utility constant. RLP represents `NULL` as 0x80.\\n bytes1 constant RLP_NULL = bytes1(0x80);\\n bytes constant RLP_NULL_BYTES = hex'80';\\n bytes32 constant internal KECCAK256_RLP_NULL_BYTES = keccak256(RLP_NULL_BYTES);\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * @notice Verifies a proof that a given key/value pair is present in the\\n * Merkle trie.\\n * @param _key Key of the node to search for, as a hex string.\\n * @param _value Value of the node to search for, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the desired node. Unlike\\n * traditional Merkle trees, this proof is executed top-down and consists\\n * of a list of RLP-encoded nodes that make a path down to the target node.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _verified `true` if the k/v pair exists in the trie, `false` otherwise.\\n */\\n function verifyInclusionProof(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bool _verified\\n )\\n {\\n (\\n bool exists,\\n bytes memory value\\n ) = get(_key, _proof, _root);\\n\\n return (\\n exists && Lib_BytesUtils.equal(_value, value)\\n );\\n }\\n\\n /**\\n * @notice Verifies a proof that a given key is *not* present in\\n * the Merkle trie.\\n * @param _key Key of the node to search for, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\\n * target node.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _verified `true` if the key is absent in the trie, `false` otherwise.\\n */\\n function verifyExclusionProof(\\n bytes memory _key,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bool _verified\\n )\\n {\\n (\\n bool exists,\\n ) = get(_key, _proof, _root);\\n\\n return exists == false;\\n }\\n\\n /**\\n * @notice Updates a Merkle trie and returns a new root hash.\\n * @param _key Key of the node to update, as a hex string.\\n * @param _value Value of the node to update, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\\n * target node. If the key exists, we can simply update the value.\\n * Otherwise, we need to modify the trie to handle the new k/v pair.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _updatedRoot Root hash of the newly constructed trie.\\n */\\n function update(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bytes32 _updatedRoot\\n )\\n {\\n // Special case when inserting the very first node.\\n if (_root == KECCAK256_RLP_NULL_BYTES) {\\n return getSingleNodeRootHash(_key, _value);\\n }\\n\\n TrieNode[] memory proof = _parseProof(_proof);\\n (uint256 pathLength, bytes memory keyRemainder, ) = _walkNodePath(proof, _key, _root);\\n TrieNode[] memory newPath = _getNewPath(proof, pathLength, keyRemainder, _value);\\n\\n return _getUpdatedTrieRoot(newPath, _key);\\n }\\n\\n /**\\n * @notice Retrieves the value associated with a given key.\\n * @param _key Key to search for, as hex bytes.\\n * @param _proof Merkle trie inclusion proof for the key.\\n * @param _root Known root of the Merkle trie.\\n * @return _exists Whether or not the key exists.\\n * @return _value Value of the key if it exists.\\n */\\n function get(\\n bytes memory _key,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bool _exists,\\n bytes memory _value\\n )\\n {\\n TrieNode[] memory proof = _parseProof(_proof);\\n (uint256 pathLength, bytes memory keyRemainder, bool isFinalNode) = _walkNodePath(proof, _key, _root);\\n\\n bool exists = keyRemainder.length == 0;\\n\\n require(\\n exists || isFinalNode,\\n \\\"Provided proof is invalid.\\\"\\n );\\n\\n bytes memory value = exists ? _getNodeValue(proof[pathLength - 1]) : bytes('');\\n\\n return (\\n exists,\\n value\\n );\\n }\\n\\n /**\\n * Computes the root hash for a trie with a single node.\\n * @param _key Key for the single node.\\n * @param _value Value for the single node.\\n * @return _updatedRoot Hash of the trie.\\n */\\n function getSingleNodeRootHash(\\n bytes memory _key,\\n bytes memory _value\\n )\\n internal\\n pure\\n returns (\\n bytes32 _updatedRoot\\n )\\n {\\n return keccak256(_makeLeafNode(\\n Lib_BytesUtils.toNibbles(_key),\\n _value\\n ).encoded);\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * @notice Walks through a proof using a provided key.\\n * @param _proof Inclusion proof to walk through.\\n * @param _key Key to use for the walk.\\n * @param _root Known root of the trie.\\n * @return _pathLength Length of the final path\\n * @return _keyRemainder Portion of the key remaining after the walk.\\n * @return _isFinalNode Whether or not we've hit a dead end.\\n */\\n function _walkNodePath(\\n TrieNode[] memory _proof,\\n bytes memory _key,\\n bytes32 _root\\n )\\n private\\n pure\\n returns (\\n uint256 _pathLength,\\n bytes memory _keyRemainder,\\n bool _isFinalNode\\n )\\n {\\n uint256 pathLength = 0;\\n bytes memory key = Lib_BytesUtils.toNibbles(_key);\\n\\n bytes32 currentNodeID = _root;\\n uint256 currentKeyIndex = 0;\\n uint256 currentKeyIncrement = 0;\\n TrieNode memory currentNode;\\n\\n // Proof is top-down, so we start at the first element (root).\\n for (uint256 i = 0; i < _proof.length; i++) {\\n currentNode = _proof[i];\\n currentKeyIndex += currentKeyIncrement;\\n\\n // Keep track of the proof elements we actually need.\\n // It's expensive to resize arrays, so this simply reduces gas costs.\\n pathLength += 1;\\n\\n if (currentKeyIndex == 0) {\\n // First proof element is always the root node.\\n require(\\n keccak256(currentNode.encoded) == currentNodeID,\\n \\\"Invalid root hash\\\"\\n );\\n } else if (currentNode.encoded.length >= 32) {\\n // Nodes 32 bytes or larger are hashed inside branch nodes.\\n require(\\n keccak256(currentNode.encoded) == currentNodeID,\\n \\\"Invalid large internal hash\\\"\\n );\\n } else {\\n // Nodes smaller than 31 bytes aren't hashed.\\n require(\\n Lib_BytesUtils.toBytes32(currentNode.encoded) == currentNodeID,\\n \\\"Invalid internal node hash\\\"\\n );\\n }\\n\\n if (currentNode.decoded.length == BRANCH_NODE_LENGTH) {\\n if (currentKeyIndex == key.length) {\\n // We've hit the end of the key, meaning the value should be within this branch node.\\n break;\\n } else {\\n // We're not at the end of the key yet.\\n // Figure out what the next node ID should be and continue.\\n uint8 branchKey = uint8(key[currentKeyIndex]);\\n Lib_RLPReader.RLPItem memory nextNode = currentNode.decoded[branchKey];\\n currentNodeID = _getNodeID(nextNode);\\n currentKeyIncrement = 1;\\n continue;\\n }\\n } else if (currentNode.decoded.length == LEAF_OR_EXTENSION_NODE_LENGTH) {\\n bytes memory path = _getNodePath(currentNode);\\n uint8 prefix = uint8(path[0]);\\n uint8 offset = 2 - prefix % 2;\\n bytes memory pathRemainder = Lib_BytesUtils.slice(path, offset);\\n bytes memory keyRemainder = Lib_BytesUtils.slice(key, currentKeyIndex);\\n uint256 sharedNibbleLength = _getSharedNibbleLength(pathRemainder, keyRemainder);\\n\\n if (prefix == PREFIX_LEAF_EVEN || prefix == PREFIX_LEAF_ODD) {\\n if (\\n pathRemainder.length == sharedNibbleLength &&\\n keyRemainder.length == sharedNibbleLength\\n ) {\\n // The key within this leaf matches our key exactly.\\n // Increment the key index to reflect that we have no remainder.\\n currentKeyIndex += sharedNibbleLength;\\n }\\n\\n // We've hit a leaf node, so our next node should be NULL.\\n currentNodeID = bytes32(RLP_NULL);\\n break;\\n } else if (prefix == PREFIX_EXTENSION_EVEN || prefix == PREFIX_EXTENSION_ODD) {\\n if (sharedNibbleLength == 0) {\\n // Our extension node doesn't share any part of our key.\\n // We've hit the end of this path, updates will need to modify this extension.\\n currentNodeID = bytes32(RLP_NULL);\\n break;\\n } else {\\n // Our extension shares some nibbles.\\n // Carry on to the next node.\\n currentNodeID = _getNodeID(currentNode.decoded[1]);\\n currentKeyIncrement = sharedNibbleLength;\\n continue;\\n }\\n } else {\\n revert(\\\"Received a node with an unknown prefix\\\");\\n }\\n } else {\\n revert(\\\"Received an unparseable node.\\\");\\n }\\n }\\n\\n // If our node ID is NULL, then we're at a dead end.\\n bool isFinalNode = currentNodeID == bytes32(RLP_NULL);\\n return (pathLength, Lib_BytesUtils.slice(key, currentKeyIndex), isFinalNode);\\n }\\n\\n /**\\n * @notice Creates new nodes to support a k/v pair insertion into a given\\n * Merkle trie path.\\n * @param _path Path to the node nearest the k/v pair.\\n * @param _pathLength Length of the path. Necessary because the provided\\n * path may include additional nodes (e.g., it comes directly from a proof)\\n * and we can't resize in-memory arrays without costly duplication.\\n * @param _keyRemainder Portion of the initial key that must be inserted\\n * into the trie.\\n * @param _value Value to insert at the given key.\\n * @return _newPath A new path with the inserted k/v pair and extra supporting nodes.\\n */\\n function _getNewPath(\\n TrieNode[] memory _path,\\n uint256 _pathLength,\\n bytes memory _keyRemainder,\\n bytes memory _value\\n )\\n private\\n pure\\n returns (\\n TrieNode[] memory _newPath\\n )\\n {\\n bytes memory keyRemainder = _keyRemainder;\\n\\n // Most of our logic depends on the status of the last node in the path.\\n TrieNode memory lastNode = _path[_pathLength - 1];\\n NodeType lastNodeType = _getNodeType(lastNode);\\n\\n // Create an array for newly created nodes.\\n // We need up to three new nodes, depending on the contents of the last node.\\n // Since array resizing is expensive, we'll keep track of the size manually.\\n // We're using an explicit `totalNewNodes += 1` after insertions for clarity.\\n TrieNode[] memory newNodes = new TrieNode[](3);\\n uint256 totalNewNodes = 0;\\n\\n if (keyRemainder.length == 0 && lastNodeType == NodeType.LeafNode) {\\n // We've found a leaf node with the given key.\\n // Simply need to update the value of the node to match.\\n newNodes[totalNewNodes] = _makeLeafNode(_getNodeKey(lastNode), _value);\\n totalNewNodes += 1;\\n } else if (lastNodeType == NodeType.BranchNode) {\\n if (keyRemainder.length == 0) {\\n // We've found a branch node with the given key.\\n // Simply need to update the value of the node to match.\\n newNodes[totalNewNodes] = _editBranchValue(lastNode, _value);\\n totalNewNodes += 1;\\n } else {\\n // We've found a branch node, but it doesn't contain our key.\\n // Reinsert the old branch for now.\\n newNodes[totalNewNodes] = lastNode;\\n totalNewNodes += 1;\\n // Create a new leaf node, slicing our remainder since the first byte points\\n // to our branch node.\\n newNodes[totalNewNodes] = _makeLeafNode(Lib_BytesUtils.slice(keyRemainder, 1), _value);\\n totalNewNodes += 1;\\n }\\n } else {\\n // Our last node is either an extension node or a leaf node with a different key.\\n bytes memory lastNodeKey = _getNodeKey(lastNode);\\n uint256 sharedNibbleLength = _getSharedNibbleLength(lastNodeKey, keyRemainder);\\n\\n if (sharedNibbleLength != 0) {\\n // We've got some shared nibbles between the last node and our key remainder.\\n // We'll need to insert an extension node that covers these shared nibbles.\\n bytes memory nextNodeKey = Lib_BytesUtils.slice(lastNodeKey, 0, sharedNibbleLength);\\n newNodes[totalNewNodes] = _makeExtensionNode(nextNodeKey, _getNodeHash(_value));\\n totalNewNodes += 1;\\n\\n // Cut down the keys since we've just covered these shared nibbles.\\n lastNodeKey = Lib_BytesUtils.slice(lastNodeKey, sharedNibbleLength);\\n keyRemainder = Lib_BytesUtils.slice(keyRemainder, sharedNibbleLength);\\n }\\n\\n // Create an empty branch to fill in.\\n TrieNode memory newBranch = _makeEmptyBranchNode();\\n\\n if (lastNodeKey.length == 0) {\\n // Key remainder was larger than the key for our last node.\\n // The value within our last node is therefore going to be shifted into\\n // a branch value slot.\\n newBranch = _editBranchValue(newBranch, _getNodeValue(lastNode));\\n } else {\\n // Last node key was larger than the key remainder.\\n // We're going to modify some index of our branch.\\n uint8 branchKey = uint8(lastNodeKey[0]);\\n // Move on to the next nibble.\\n lastNodeKey = Lib_BytesUtils.slice(lastNodeKey, 1);\\n\\n if (lastNodeType == NodeType.LeafNode) {\\n // We're dealing with a leaf node.\\n // We'll modify the key and insert the old leaf node into the branch index.\\n TrieNode memory modifiedLastNode = _makeLeafNode(lastNodeKey, _getNodeValue(lastNode));\\n newBranch = _editBranchIndex(newBranch, branchKey, _getNodeHash(modifiedLastNode.encoded));\\n } else if (lastNodeKey.length != 0) {\\n // We're dealing with a shrinking extension node.\\n // We need to modify the node to decrease the size of the key.\\n TrieNode memory modifiedLastNode = _makeExtensionNode(lastNodeKey, _getNodeValue(lastNode));\\n newBranch = _editBranchIndex(newBranch, branchKey, _getNodeHash(modifiedLastNode.encoded));\\n } else {\\n // We're dealing with an unnecessary extension node.\\n // We're going to delete the node entirely.\\n // Simply insert its current value into the branch index.\\n newBranch = _editBranchIndex(newBranch, branchKey, _getNodeValue(lastNode));\\n }\\n }\\n\\n if (keyRemainder.length == 0) {\\n // We've got nothing left in the key remainder.\\n // Simply insert the value into the branch value slot.\\n newBranch = _editBranchValue(newBranch, _value);\\n // Push the branch into the list of new nodes.\\n newNodes[totalNewNodes] = newBranch;\\n totalNewNodes += 1;\\n } else {\\n // We've got some key remainder to work with.\\n // We'll be inserting a leaf node into the trie.\\n // First, move on to the next nibble.\\n keyRemainder = Lib_BytesUtils.slice(keyRemainder, 1);\\n // Push the branch into the list of new nodes.\\n newNodes[totalNewNodes] = newBranch;\\n totalNewNodes += 1;\\n // Push a new leaf node for our k/v pair.\\n newNodes[totalNewNodes] = _makeLeafNode(keyRemainder, _value);\\n totalNewNodes += 1;\\n }\\n }\\n\\n // Finally, join the old path with our newly created nodes.\\n // Since we're overwriting the last node in the path, we use `_pathLength - 1`.\\n return _joinNodeArrays(_path, _pathLength - 1, newNodes, totalNewNodes);\\n }\\n\\n /**\\n * @notice Computes the trie root from a given path.\\n * @param _nodes Path to some k/v pair.\\n * @param _key Key for the k/v pair.\\n * @return _updatedRoot Root hash for the updated trie.\\n */\\n function _getUpdatedTrieRoot(\\n TrieNode[] memory _nodes,\\n bytes memory _key\\n )\\n private\\n pure\\n returns (\\n bytes32 _updatedRoot\\n )\\n {\\n bytes memory key = Lib_BytesUtils.toNibbles(_key);\\n\\n // Some variables to keep track of during iteration.\\n TrieNode memory currentNode;\\n NodeType currentNodeType;\\n bytes memory previousNodeHash;\\n\\n // Run through the path backwards to rebuild our root hash.\\n for (uint256 i = _nodes.length; i > 0; i--) {\\n // Pick out the current node.\\n currentNode = _nodes[i - 1];\\n currentNodeType = _getNodeType(currentNode);\\n\\n if (currentNodeType == NodeType.LeafNode) {\\n // Leaf nodes are already correctly encoded.\\n // Shift the key over to account for the nodes key.\\n bytes memory nodeKey = _getNodeKey(currentNode);\\n key = Lib_BytesUtils.slice(key, 0, key.length - nodeKey.length);\\n } else if (currentNodeType == NodeType.ExtensionNode) {\\n // Shift the key over to account for the nodes key.\\n bytes memory nodeKey = _getNodeKey(currentNode);\\n key = Lib_BytesUtils.slice(key, 0, key.length - nodeKey.length);\\n\\n // If this node is the last element in the path, it'll be correctly encoded\\n // and we can skip this part.\\n if (previousNodeHash.length > 0) {\\n // Re-encode the node based on the previous node.\\n currentNode = _makeExtensionNode(nodeKey, previousNodeHash);\\n }\\n } else if (currentNodeType == NodeType.BranchNode) {\\n // If this node is the last element in the path, it'll be correctly encoded\\n // and we can skip this part.\\n if (previousNodeHash.length > 0) {\\n // Re-encode the node based on the previous node.\\n uint8 branchKey = uint8(key[key.length - 1]);\\n key = Lib_BytesUtils.slice(key, 0, key.length - 1);\\n currentNode = _editBranchIndex(currentNode, branchKey, previousNodeHash);\\n }\\n }\\n\\n // Compute the node hash for the next iteration.\\n previousNodeHash = _getNodeHash(currentNode.encoded);\\n }\\n\\n // Current node should be the root at this point.\\n // Simply return the hash of its encoding.\\n return keccak256(currentNode.encoded);\\n }\\n\\n /**\\n * @notice Parses an RLP-encoded proof into something more useful.\\n * @param _proof RLP-encoded proof to parse.\\n * @return _parsed Proof parsed into easily accessible structs.\\n */\\n function _parseProof(\\n bytes memory _proof\\n )\\n private\\n pure\\n returns (\\n TrieNode[] memory _parsed\\n )\\n {\\n Lib_RLPReader.RLPItem[] memory nodes = Lib_RLPReader.readList(_proof);\\n TrieNode[] memory proof = new TrieNode[](nodes.length);\\n\\n for (uint256 i = 0; i < nodes.length; i++) {\\n bytes memory encoded = Lib_RLPReader.readBytes(nodes[i]);\\n proof[i] = TrieNode({\\n encoded: encoded,\\n decoded: Lib_RLPReader.readList(encoded)\\n });\\n }\\n\\n return proof;\\n }\\n\\n /**\\n * @notice Picks out the ID for a node. Node ID is referred to as the\\n * \\\"hash\\\" within the specification, but nodes < 32 bytes are not actually\\n * hashed.\\n * @param _node Node to pull an ID for.\\n * @return _nodeID ID for the node, depending on the size of its contents.\\n */\\n function _getNodeID(\\n Lib_RLPReader.RLPItem memory _node\\n )\\n private\\n pure\\n returns (\\n bytes32 _nodeID\\n )\\n {\\n bytes memory nodeID;\\n\\n if (_node.length < 32) {\\n // Nodes smaller than 32 bytes are RLP encoded.\\n nodeID = Lib_RLPReader.readRawBytes(_node);\\n } else {\\n // Nodes 32 bytes or larger are hashed.\\n nodeID = Lib_RLPReader.readBytes(_node);\\n }\\n\\n return Lib_BytesUtils.toBytes32(nodeID);\\n }\\n\\n /**\\n * @notice Gets the path for a leaf or extension node.\\n * @param _node Node to get a path for.\\n * @return _path Node path, converted to an array of nibbles.\\n */\\n function _getNodePath(\\n TrieNode memory _node\\n )\\n private\\n pure\\n returns (\\n bytes memory _path\\n )\\n {\\n return Lib_BytesUtils.toNibbles(Lib_RLPReader.readBytes(_node.decoded[0]));\\n }\\n\\n /**\\n * @notice Gets the key for a leaf or extension node. Keys are essentially\\n * just paths without any prefix.\\n * @param _node Node to get a key for.\\n * @return _key Node key, converted to an array of nibbles.\\n */\\n function _getNodeKey(\\n TrieNode memory _node\\n )\\n private\\n pure\\n returns (\\n bytes memory _key\\n )\\n {\\n return _removeHexPrefix(_getNodePath(_node));\\n }\\n\\n /**\\n * @notice Gets the path for a node.\\n * @param _node Node to get a value for.\\n * @return _value Node value, as hex bytes.\\n */\\n function _getNodeValue(\\n TrieNode memory _node\\n )\\n private\\n pure\\n returns (\\n bytes memory _value\\n )\\n {\\n return Lib_RLPReader.readBytes(_node.decoded[_node.decoded.length - 1]);\\n }\\n\\n /**\\n * @notice Computes the node hash for an encoded node. Nodes < 32 bytes\\n * are not hashed, all others are keccak256 hashed.\\n * @param _encoded Encoded node to hash.\\n * @return _hash Hash of the encoded node. Simply the input if < 32 bytes.\\n */\\n function _getNodeHash(\\n bytes memory _encoded\\n )\\n private\\n pure\\n returns (\\n bytes memory _hash\\n )\\n {\\n if (_encoded.length < 32) {\\n return _encoded;\\n } else {\\n return abi.encodePacked(keccak256(_encoded));\\n }\\n }\\n\\n /**\\n * @notice Determines the type for a given node.\\n * @param _node Node to determine a type for.\\n * @return _type Type of the node; BranchNode/ExtensionNode/LeafNode.\\n */\\n function _getNodeType(\\n TrieNode memory _node\\n )\\n private\\n pure\\n returns (\\n NodeType _type\\n )\\n {\\n if (_node.decoded.length == BRANCH_NODE_LENGTH) {\\n return NodeType.BranchNode;\\n } else if (_node.decoded.length == LEAF_OR_EXTENSION_NODE_LENGTH) {\\n bytes memory path = _getNodePath(_node);\\n uint8 prefix = uint8(path[0]);\\n\\n if (prefix == PREFIX_LEAF_EVEN || prefix == PREFIX_LEAF_ODD) {\\n return NodeType.LeafNode;\\n } else if (prefix == PREFIX_EXTENSION_EVEN || prefix == PREFIX_EXTENSION_ODD) {\\n return NodeType.ExtensionNode;\\n }\\n }\\n\\n revert(\\\"Invalid node type\\\");\\n }\\n\\n /**\\n * @notice Utility; determines the number of nibbles shared between two\\n * nibble arrays.\\n * @param _a First nibble array.\\n * @param _b Second nibble array.\\n * @return _shared Number of shared nibbles.\\n */\\n function _getSharedNibbleLength(\\n bytes memory _a,\\n bytes memory _b\\n )\\n private\\n pure\\n returns (\\n uint256 _shared\\n )\\n {\\n uint256 i = 0;\\n while (_a.length > i && _b.length > i && _a[i] == _b[i]) {\\n i++;\\n }\\n return i;\\n }\\n\\n /**\\n * @notice Utility; converts an RLP-encoded node into our nice struct.\\n * @param _raw RLP-encoded node to convert.\\n * @return _node Node as a TrieNode struct.\\n */\\n function _makeNode(\\n bytes[] memory _raw\\n )\\n private\\n pure\\n returns (\\n TrieNode memory _node\\n )\\n {\\n bytes memory encoded = Lib_RLPWriter.writeList(_raw);\\n\\n return TrieNode({\\n encoded: encoded,\\n decoded: Lib_RLPReader.readList(encoded)\\n });\\n }\\n\\n /**\\n * @notice Utility; converts an RLP-decoded node into our nice struct.\\n * @param _items RLP-decoded node to convert.\\n * @return _node Node as a TrieNode struct.\\n */\\n function _makeNode(\\n Lib_RLPReader.RLPItem[] memory _items\\n )\\n private\\n pure\\n returns (\\n TrieNode memory _node\\n )\\n {\\n bytes[] memory raw = new bytes[](_items.length);\\n for (uint256 i = 0; i < _items.length; i++) {\\n raw[i] = Lib_RLPReader.readRawBytes(_items[i]);\\n }\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Creates a new extension node.\\n * @param _key Key for the extension node, unprefixed.\\n * @param _value Value for the extension node.\\n * @return _node New extension node with the given k/v pair.\\n */\\n function _makeExtensionNode(\\n bytes memory _key,\\n bytes memory _value\\n )\\n private\\n pure\\n returns (\\n TrieNode memory _node\\n )\\n {\\n bytes[] memory raw = new bytes[](2);\\n bytes memory key = _addHexPrefix(_key, false);\\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\\n raw[1] = Lib_RLPWriter.writeBytes(_value);\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Creates a new leaf node.\\n * @dev This function is essentially identical to `_makeExtensionNode`.\\n * Although we could route both to a single method with a flag, it's\\n * more gas efficient to keep them separate and duplicate the logic.\\n * @param _key Key for the leaf node, unprefixed.\\n * @param _value Value for the leaf node.\\n * @return _node New leaf node with the given k/v pair.\\n */\\n function _makeLeafNode(\\n bytes memory _key,\\n bytes memory _value\\n )\\n private\\n pure\\n returns (\\n TrieNode memory _node\\n )\\n {\\n bytes[] memory raw = new bytes[](2);\\n bytes memory key = _addHexPrefix(_key, true);\\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\\n raw[1] = Lib_RLPWriter.writeBytes(_value);\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Creates an empty branch node.\\n * @return _node Empty branch node as a TrieNode struct.\\n */\\n function _makeEmptyBranchNode()\\n private\\n pure\\n returns (\\n TrieNode memory _node\\n )\\n {\\n bytes[] memory raw = new bytes[](BRANCH_NODE_LENGTH);\\n for (uint256 i = 0; i < raw.length; i++) {\\n raw[i] = RLP_NULL_BYTES;\\n }\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Modifies the value slot for a given branch.\\n * @param _branch Branch node to modify.\\n * @param _value Value to insert into the branch.\\n * @return _updatedNode Modified branch node.\\n */\\n function _editBranchValue(\\n TrieNode memory _branch,\\n bytes memory _value\\n )\\n private\\n pure\\n returns (\\n TrieNode memory _updatedNode\\n )\\n {\\n bytes memory encoded = Lib_RLPWriter.writeBytes(_value);\\n _branch.decoded[_branch.decoded.length - 1] = Lib_RLPReader.toRLPItem(encoded);\\n return _makeNode(_branch.decoded);\\n }\\n\\n /**\\n * @notice Modifies a slot at an index for a given branch.\\n * @param _branch Branch node to modify.\\n * @param _index Slot index to modify.\\n * @param _value Value to insert into the slot.\\n * @return _updatedNode Modified branch node.\\n */\\n function _editBranchIndex(\\n TrieNode memory _branch,\\n uint8 _index,\\n bytes memory _value\\n )\\n private\\n pure\\n returns (\\n TrieNode memory _updatedNode\\n )\\n {\\n bytes memory encoded = _value.length < 32 ? _value : Lib_RLPWriter.writeBytes(_value);\\n _branch.decoded[_index] = Lib_RLPReader.toRLPItem(encoded);\\n return _makeNode(_branch.decoded);\\n }\\n\\n /**\\n * @notice Utility; adds a prefix to a key.\\n * @param _key Key to prefix.\\n * @param _isLeaf Whether or not the key belongs to a leaf.\\n * @return _prefixedKey Prefixed key.\\n */\\n function _addHexPrefix(\\n bytes memory _key,\\n bool _isLeaf\\n )\\n private\\n pure\\n returns (\\n bytes memory _prefixedKey\\n )\\n {\\n uint8 prefix = _isLeaf ? uint8(0x02) : uint8(0x00);\\n uint8 offset = uint8(_key.length % 2);\\n bytes memory prefixed = new bytes(2 - offset);\\n prefixed[0] = bytes1(prefix + offset);\\n return abi.encodePacked(prefixed, _key);\\n }\\n\\n /**\\n * @notice Utility; removes a prefix from a path.\\n * @param _path Path to remove the prefix from.\\n * @return _unprefixedKey Unprefixed key.\\n */\\n function _removeHexPrefix(\\n bytes memory _path\\n )\\n private\\n pure\\n returns (\\n bytes memory _unprefixedKey\\n )\\n {\\n if (uint8(_path[0]) % 2 == 0) {\\n return Lib_BytesUtils.slice(_path, 2);\\n } else {\\n return Lib_BytesUtils.slice(_path, 1);\\n }\\n }\\n\\n /**\\n * @notice Utility; combines two node arrays. Array lengths are required\\n * because the actual lengths may be longer than the filled lengths.\\n * Array resizing is extremely costly and should be avoided.\\n * @param _a First array to join.\\n * @param _aLength Length of the first array.\\n * @param _b Second array to join.\\n * @param _bLength Length of the second array.\\n * @return _joined Combined node array.\\n */\\n function _joinNodeArrays(\\n TrieNode[] memory _a,\\n uint256 _aLength,\\n TrieNode[] memory _b,\\n uint256 _bLength\\n )\\n private\\n pure\\n returns (\\n TrieNode[] memory _joined\\n )\\n {\\n TrieNode[] memory ret = new TrieNode[](_aLength + _bLength);\\n\\n // Copy elements from the first array.\\n for (uint256 i = 0; i < _aLength; i++) {\\n ret[i] = _a[i];\\n }\\n\\n // Copy elements from the second array.\\n for (uint256 i = 0; i < _bLength; i++) {\\n ret[i + _aLength] = _b[i];\\n }\\n\\n return ret;\\n }\\n}\\n\",\"keccak256\":\"0x161f65220b8c5cf295232f8c58c2744fbc898bf77da5f9d9c5b2dd673dafc6f6\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/trie/Lib_SecureMerkleTrie.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_MerkleTrie } from \\\"./Lib_MerkleTrie.sol\\\";\\n\\n/**\\n * @title Lib_SecureMerkleTrie\\n */\\nlibrary Lib_SecureMerkleTrie {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * @notice Verifies a proof that a given key/value pair is present in the\\n * Merkle trie.\\n * @param _key Key of the node to search for, as a hex string.\\n * @param _value Value of the node to search for, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the desired node. Unlike\\n * traditional Merkle trees, this proof is executed top-down and consists\\n * of a list of RLP-encoded nodes that make a path down to the target node.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _verified `true` if the k/v pair exists in the trie, `false` otherwise.\\n */\\n function verifyInclusionProof(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bool _verified\\n )\\n {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.verifyInclusionProof(key, _value, _proof, _root);\\n }\\n\\n /**\\n * @notice Verifies a proof that a given key is *not* present in\\n * the Merkle trie.\\n * @param _key Key of the node to search for, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\\n * target node.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _verified `true` if the key is not present in the trie, `false` otherwise.\\n */\\n function verifyExclusionProof(\\n bytes memory _key,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bool _verified\\n )\\n {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.verifyExclusionProof(key, _proof, _root);\\n }\\n\\n /**\\n * @notice Updates a Merkle trie and returns a new root hash.\\n * @param _key Key of the node to update, as a hex string.\\n * @param _value Value of the node to update, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\\n * target node. If the key exists, we can simply update the value.\\n * Otherwise, we need to modify the trie to handle the new k/v pair.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _updatedRoot Root hash of the newly constructed trie.\\n */\\n function update(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bytes32 _updatedRoot\\n )\\n {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.update(key, _value, _proof, _root);\\n }\\n\\n /**\\n * @notice Retrieves the value associated with a given key.\\n * @param _key Key to search for, as hex bytes.\\n * @param _proof Merkle trie inclusion proof for the key.\\n * @param _root Known root of the Merkle trie.\\n * @return _exists Whether or not the key exists.\\n * @return _value Value of the key if it exists.\\n */\\n function get(\\n bytes memory _key,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bool _exists,\\n bytes memory _value\\n )\\n {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.get(key, _proof, _root);\\n }\\n\\n /**\\n * Computes the root hash for a trie with a single node.\\n * @param _key Key for the single node.\\n * @param _value Value for the single node.\\n * @return _updatedRoot Hash of the trie.\\n */\\n function getSingleNodeRootHash(\\n bytes memory _key,\\n bytes memory _value\\n )\\n internal\\n pure\\n returns (\\n bytes32 _updatedRoot\\n )\\n {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.getSingleNodeRootHash(key, _value);\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Computes the secure counterpart to a key.\\n * @param _key Key to get a secure key from.\\n * @return _secureKey Secure version of the key.\\n */\\n function _getSecureKey(\\n bytes memory _key\\n )\\n private\\n pure\\n returns (\\n bytes memory _secureKey\\n )\\n {\\n return abi.encodePacked(keccak256(_key));\\n }\\n}\",\"keccak256\":\"0x79355346f74bb1eb9eeb733cb5d9677d50115c4f390307cbf608fe071a1ada0c\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_Bytes32Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_Byte32Utils\\n */\\nlibrary Lib_Bytes32Utils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \\\"true.\\\"\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as a boolean.\\n */\\n function toBool(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return _in != 0;\\n }\\n\\n /**\\n * Converts a boolean to a bytes32 value.\\n * @param _in Input boolean value.\\n * @return Boolean as a bytes32.\\n */\\n function fromBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in ? 1 : 0));\\n }\\n\\n /**\\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as an address.\\n */\\n function toAddress(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return address(uint160(uint256(_in)));\\n }\\n\\n /**\\n * Converts an address to a bytes32.\\n * @param _in Input address value.\\n * @return Address as a bytes32.\\n */\\n function fromAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in));\\n }\\n\\n /**\\n * Removes the leading zeros from a bytes32 value and returns a new (smaller) bytes value.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 without any leading zeros.\\n */\\n function removeLeadingZeros(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out;\\n\\n assembly {\\n // Figure out how many leading zero bytes to remove.\\n let shift := 0\\n for { let i := 0 } and(lt(i, 32), eq(byte(i, _in), 0)) { i := add(i, 1) } {\\n shift := add(shift, 1)\\n }\\n\\n // Reserve some space for our output and fix the free memory pointer.\\n out := mload(0x40)\\n mstore(0x40, add(out, 0x40))\\n\\n // Shift the value and store it into the output bytes.\\n mstore(add(out, 0x20), shl(mul(shift, 8), _in))\\n\\n // Store the new size (with leading zero bytes removed) in the output byte size.\\n mstore(out, sub(32, shift))\\n }\\n\\n return out;\\n }\\n}\\n\",\"keccak256\":\"0xfa2def593e3fc56a31852c3744aefdaa93cec74e721bfcfeb1e5d166c7c60b64\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_BytesUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_BytesUtils\\n */\\nlibrary Lib_BytesUtils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_start + _length >= _start, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n if (_bytes.length - _start == 0) {\\n return bytes('');\\n }\\n\\n return slice(_bytes, _start, _bytes.length - _start);\\n }\\n\\n function toBytes32PadLeft(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes32)\\n {\\n bytes32 ret;\\n uint256 len = _bytes.length <= 32 ? _bytes.length : 32;\\n assembly {\\n ret := shr(mul(sub(32, len), 8), mload(add(_bytes, 32)))\\n }\\n return ret;\\n }\\n\\n function toBytes32(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes32)\\n {\\n if (_bytes.length < 32) {\\n bytes32 ret;\\n assembly {\\n ret := mload(add(_bytes, 32))\\n }\\n return ret;\\n }\\n\\n return abi.decode(_bytes,(bytes32)); // will truncate if input length > 32 bytes\\n }\\n\\n function toUint256(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (uint256)\\n {\\n return uint256(toBytes32(_bytes));\\n }\\n\\n function toUint24(bytes memory _bytes, uint256 _start) internal pure returns (uint24) {\\n require(_start + 3 >= _start, \\\"toUint24_overflow\\\");\\n require(_bytes.length >= _start + 3 , \\\"toUint24_outOfBounds\\\");\\n uint24 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x3), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toUint8(bytes memory _bytes, uint256 _start) internal pure returns (uint8) {\\n require(_start + 1 >= _start, \\\"toUint8_overflow\\\");\\n require(_bytes.length >= _start + 1 , \\\"toUint8_outOfBounds\\\");\\n uint8 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x1), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toAddress(bytes memory _bytes, uint256 _start) internal pure returns (address) {\\n require(_start + 20 >= _start, \\\"toAddress_overflow\\\");\\n require(_bytes.length >= _start + 20, \\\"toAddress_outOfBounds\\\");\\n address tempAddress;\\n\\n assembly {\\n tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000)\\n }\\n\\n return tempAddress;\\n }\\n\\n function toNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n bytes memory nibbles = new bytes(_bytes.length * 2);\\n\\n for (uint256 i = 0; i < _bytes.length; i++) {\\n nibbles[i * 2] = _bytes[i] >> 4;\\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\\n }\\n\\n return nibbles;\\n }\\n\\n function fromNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n bytes memory ret = new bytes(_bytes.length / 2);\\n\\n for (uint256 i = 0; i < ret.length; i++) {\\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\\n }\\n\\n return ret;\\n }\\n\\n function equal(\\n bytes memory _bytes,\\n bytes memory _other\\n )\\n internal\\n pure\\n returns (bool)\\n {\\n return keccak256(_bytes) == keccak256(_other);\\n }\\n}\\n\",\"keccak256\":\"0x0adf22e1b22ba09911e859f64cb3b484e992be4f9fd3b09088e6225bf8d06ce0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_ErrorUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/**\\n * @title Lib_ErrorUtils\\n */\\nlibrary Lib_ErrorUtils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Encodes an error string into raw solidity-style revert data.\\n * (i.e. ascii bytes, prefixed with bytes4(keccak(\\\"Error(string))\\\"))\\n * Ref: https://docs.soliditylang.org/en/v0.8.2/control-structures.html?highlight=Error(string)#panic-via-assert-and-error-via-require\\n * @param _reason Reason for the reversion.\\n * @return Standard solidity revert data for the given reason.\\n */\\n function encodeRevertString(\\n string memory _reason\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return abi.encodeWithSignature(\\n \\\"Error(string)\\\",\\n _reason\\n );\\n }\\n}\\n\",\"keccak256\":\"0xfc64ec4a81fb50865b502a0004ed154e8598e1a313db77303fc95e41f536e6b7\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_ReentrancyGuard.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @dev Contract module that helps prevent reentrant calls to a function.\\n *\\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\\n * available, which can be applied to functions to make sure there are no nested\\n * (reentrant) calls to them.\\n *\\n * Note that because there is a single `nonReentrant` guard, functions marked as\\n * `nonReentrant` may not call one another. This can be worked around by making\\n * those functions `private`, and then adding `external` `nonReentrant` entry\\n * points to them.\\n *\\n * TIP: If you would like to learn more about reentrancy and alternative ways\\n * to protect against it, check out our blog post\\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\\n */\\nabstract contract Lib_ReentrancyGuard {\\n // Booleans are more expensive than uint256 or any type that takes up a full\\n // word because each write operation emits an extra SLOAD to first read the\\n // slot's contents, replace the bits taken up by the boolean, and then write\\n // back. This is the compiler's defense against contract upgrades and\\n // pointer aliasing, and it cannot be disabled.\\n\\n // The values being non-zero value makes deployment a bit more expensive,\\n // but in exchange the refund on every call to nonReentrant will be lower in\\n // amount. Since refunds are capped to a percentage of the total\\n // transaction's gas, it is best to keep them low in cases like this one, to\\n // increase the likelihood of the full refund coming into effect.\\n uint256 private constant _NOT_ENTERED = 1;\\n uint256 private constant _ENTERED = 2;\\n\\n uint256 private _status;\\n\\n constructor () {\\n _status = _NOT_ENTERED;\\n }\\n\\n /**\\n * @dev Prevents a contract from calling itself, directly or indirectly.\\n * Calling a `nonReentrant` function from another `nonReentrant`\\n * function is not supported. It is possible to prevent this from happening\\n * by making the `nonReentrant` function external, and make it call a\\n * `private` function that does the actual work.\\n */\\n modifier nonReentrant() {\\n // On the first call to nonReentrant, _notEntered will be true\\n require(_status != _ENTERED, \\\"ReentrancyGuard: reentrant call\\\");\\n\\n // Any calls to nonReentrant after this point will fail\\n _status = _ENTERED;\\n\\n _;\\n\\n // By storing the original value once again, a refund is triggered (see\\n // https://eips.ethereum.org/EIPS/eip-2200)\\n _status = _NOT_ENTERED;\\n }\\n}\\n\",\"keccak256\":\"0x4e1727687288cb1db2a4df3b056626f1bf0513520c3651667b1762f579c4ca7f\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_ErrorUtils } from \\\"../utils/Lib_ErrorUtils.sol\\\";\\n\\n/**\\n * @title Lib_SafeExecutionManagerWrapper\\n * @dev The Safe Execution Manager Wrapper provides functions which facilitate writing OVM safe \\n * code using the standard solidity compiler, by routing all its operations through the Execution \\n * Manager.\\n * \\n * Compiler used: solc\\n * Runtime target: OVM\\n */\\nlibrary Lib_SafeExecutionManagerWrapper {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Performs a safe ovmCALL.\\n * @param _gasLimit Gas limit for the call.\\n * @param _target Address to call.\\n * @param _calldata Data to send to the call.\\n * @return _success Whether or not the call reverted.\\n * @return _returndata Data returned by the call.\\n */\\n function safeCALL(\\n uint256 _gasLimit,\\n address _target,\\n bytes memory _calldata\\n )\\n internal\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCALL(uint256,address,bytes)\\\",\\n _gasLimit,\\n _target,\\n _calldata\\n )\\n );\\n\\n return abi.decode(returndata, (bool, bytes));\\n }\\n\\n /**\\n * Performs a safe ovmDELEGATECALL.\\n * @param _gasLimit Gas limit for the call.\\n * @param _target Address to call.\\n * @param _calldata Data to send to the call.\\n * @return _success Whether or not the call reverted.\\n * @return _returndata Data returned by the call.\\n */\\n function safeDELEGATECALL(\\n uint256 _gasLimit,\\n address _target,\\n bytes memory _calldata\\n )\\n internal\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmDELEGATECALL(uint256,address,bytes)\\\",\\n _gasLimit,\\n _target,\\n _calldata\\n )\\n );\\n\\n return abi.decode(returndata, (bool, bytes));\\n }\\n\\n /**\\n * Performs a safe ovmCREATE call.\\n * @param _gasLimit Gas limit for the creation.\\n * @param _bytecode Code for the new contract.\\n * @return _contract Address of the created contract.\\n */\\n function safeCREATE(\\n uint256 _gasLimit,\\n bytes memory _bytecode\\n )\\n internal\\n returns (\\n address,\\n bytes memory\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n _gasLimit,\\n abi.encodeWithSignature(\\n \\\"ovmCREATE(bytes)\\\",\\n _bytecode\\n )\\n );\\n\\n return abi.decode(returndata, (address, bytes));\\n }\\n\\n /**\\n * Performs a safe ovmEXTCODESIZE call.\\n * @param _contract Address of the contract to query the size of.\\n * @return _EXTCODESIZE Size of the requested contract in bytes.\\n */\\n function safeEXTCODESIZE(\\n address _contract\\n )\\n internal\\n returns (\\n uint256 _EXTCODESIZE\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmEXTCODESIZE(address)\\\",\\n _contract\\n )\\n );\\n\\n return abi.decode(returndata, (uint256));\\n }\\n\\n /**\\n * Performs a safe ovmCHAINID call.\\n * @return _CHAINID Result of calling ovmCHAINID.\\n */\\n function safeCHAINID()\\n internal\\n returns (\\n uint256 _CHAINID\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCHAINID()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (uint256));\\n }\\n\\n /**\\n * Performs a safe ovmCALLER call.\\n * @return _CALLER Result of calling ovmCALLER.\\n */\\n function safeCALLER()\\n internal\\n returns (\\n address _CALLER\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCALLER()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (address));\\n }\\n\\n /**\\n * Performs a safe ovmADDRESS call.\\n * @return _ADDRESS Result of calling ovmADDRESS.\\n */\\n function safeADDRESS()\\n internal\\n returns (\\n address _ADDRESS\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmADDRESS()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (address));\\n }\\n\\n /**\\n * Performs a safe ovmGETNONCE call.\\n * @return _nonce Result of calling ovmGETNONCE.\\n */\\n function safeGETNONCE()\\n internal\\n returns (\\n uint256 _nonce\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmGETNONCE()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (uint256));\\n }\\n\\n /**\\n * Performs a safe ovmINCREMENTNONCE call.\\n */\\n function safeINCREMENTNONCE()\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmINCREMENTNONCE()\\\"\\n )\\n );\\n }\\n\\n /**\\n * Performs a safe ovmCREATEEOA call.\\n * @param _messageHash Message hash which was signed by EOA\\n * @param _v v value of signature (0 or 1)\\n * @param _r r value of signature\\n * @param _s s value of signature\\n */\\n function safeCREATEEOA(\\n bytes32 _messageHash,\\n uint8 _v,\\n bytes32 _r,\\n bytes32 _s\\n )\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCREATEEOA(bytes32,uint8,bytes32,bytes32)\\\",\\n _messageHash,\\n _v,\\n _r,\\n _s\\n )\\n );\\n }\\n\\n /**\\n * Performs a safe REVERT.\\n * @param _reason String revert reason to pass along with the REVERT.\\n */\\n function safeREVERT(\\n string memory _reason\\n )\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmREVERT(bytes)\\\",\\n Lib_ErrorUtils.encodeRevertString(\\n _reason\\n )\\n )\\n );\\n }\\n\\n /**\\n * Performs a safe \\\"require\\\".\\n * @param _condition Boolean condition that must be true or will revert.\\n * @param _reason String revert reason to pass along with the REVERT.\\n */\\n function safeREQUIRE(\\n bool _condition,\\n string memory _reason\\n )\\n internal\\n {\\n if (!_condition) {\\n safeREVERT(\\n _reason\\n );\\n }\\n }\\n\\n /**\\n * Performs a safe ovmSLOAD call.\\n */\\n function safeSLOAD(\\n bytes32 _key\\n )\\n internal\\n returns (\\n bytes32\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmSLOAD(bytes32)\\\",\\n _key\\n )\\n );\\n\\n return abi.decode(returndata, (bytes32));\\n }\\n\\n /**\\n * Performs a safe ovmSSTORE call.\\n */\\n function safeSSTORE(\\n bytes32 _key,\\n bytes32 _value\\n )\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmSSTORE(bytes32,bytes32)\\\",\\n _key,\\n _value\\n )\\n );\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Performs an ovm interaction and the necessary safety checks.\\n * @param _gasLimit Gas limit for the interaction.\\n * @param _calldata Data to send to the OVM_ExecutionManager (encoded with sighash).\\n * @return _returndata Data sent back by the OVM_ExecutionManager.\\n */\\n function _safeExecutionManagerInteraction(\\n uint256 _gasLimit,\\n bytes memory _calldata\\n )\\n private\\n returns (\\n bytes memory _returndata\\n )\\n {\\n address ovmExecutionManager = msg.sender;\\n (\\n bool success,\\n bytes memory returndata\\n ) = ovmExecutionManager.call{gas: _gasLimit}(_calldata);\\n\\n if (success == false) {\\n assembly {\\n revert(add(returndata, 0x20), mload(returndata))\\n }\\n } else if (returndata.length == 1) {\\n assembly {\\n return(0, 1)\\n }\\n } else {\\n return returndata;\\n }\\n }\\n\\n function _safeExecutionManagerInteraction(\\n bytes memory _calldata\\n )\\n private\\n returns (\\n bytes memory _returndata\\n )\\n {\\n return _safeExecutionManagerInteraction(\\n gasleft(),\\n _calldata\\n );\\n }\\n}\\n\",\"keccak256\":\"0x41e146e7912af794a17cd43c5a276674be956bfa8f3ca5b451bcb82d81e6f492\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x6080604052600580546001600160a01b03191661dead17905534801561002457600080fd5b506001600055600680546001600160a01b031916905561266d806100496000396000f3fe608060405234801561001057600080fd5b50600436106100a95760003560e01c8063706ceab611610071578063706ceab61461011c57806382e3702d1461012f578063b1b1b20914610142578063c4d66de814610155578063d7fd19dd14610168578063ecc704281461017b576100a9565b806321d800ec146100ae578063299ca478146100d75780633dbb202b146100ec578063461a4478146101015780636e296e4514610114575b600080fd5b6100c16100bc3660046120ae565b610190565b6040516100ce91906122c4565b60405180910390f35b6100df6101a5565b6040516100ce919061224c565b6100ff6100fa366004612032565b6101b4565b005b6100df61010f3660046120c6565b610243565b6100df61031f565b6100ff61012a366004611fbb565b610368565b6100c161013d3660046120ae565b6103cf565b6100c16101503660046120ae565b6103e4565b6100ff610163366004611e72565b6103f9565b6100ff610176366004611e8c565b61044f565b6101836106d0565b6040516100ce9190612195565b60016020526000908152604090205460ff1681565b6006546001600160a01b031681565b60006101c48433856004546106d6565b60048054600190810190915581516020808401919091206000908152600390915260409020805460ff1916909117905590506102068163ffffffff8416610723565b7f0ee9ffdb2334d78de97ffb066b23a352a4d35180cefb36589d663fbb1eb6f326816040516102359190612346565b60405180910390a150505050565b60065460405163bf40fac160e01b81526020600482018181528451602484015284516000946001600160a01b03169363bf40fac1938793928392604401918501908083838b5b838110156102a1578181015183820152602001610289565b50505050905090810190601f1680156102ce5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b1580156102eb57600080fd5b505afa1580156102ff573d6000803e3d6000fd5b505050506040513d602081101561031557600080fd5b505190505b919050565b6005546000906001600160a01b031661dead14156103585760405162461bcd60e51b815260040161034f90612359565b60405180910390fd5b506005546001600160a01b031690565b6000610376868686866106d6565b805160208083019190912060009081526003909152604090205490915060ff1615156001146103b75760405162461bcd60e51b815260040161034f9061244e565b6103c7818363ffffffff16610723565b505050505050565b60036020526000908152604090205460ff1681565b60026020526000908152604090205460ff1681565b6006546001600160a01b0316156104225760405162461bcd60e51b815260040161034f90612536565b600680546001600160a01b039092166001600160a01b03199283161790556005805490911661dead179055565b600260005414156104a7576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6002600090815560408051808201909152601481527327ab26afa61926b2b9b9b0b3b2a932b630bcb2b960611b60208201526104e290610243565b90506001600160a01b0381161561051b57336001600160a01b0382161461051b5760405162461bcd60e51b815260040161034f90612499565b6000610529878787876106d6565b905061053581846107fb565b15156001146105565760405162461bcd60e51b815260040161034f906124ef565b80516020808301919091206000818152600290925260409091205460ff16156105915760405162461bcd60e51b815260040161034f90612390565b600580546001600160a01b0319166001600160a01b03898116919091179091556040516000918a16906105c59089906121ac565b6000604051808303816000865af19150503d8060008114610602576040519150601f19603f3d011682016040523d82523d6000602084013e610607565b606091505b5050600580546001600160a01b03191661dead17905590508015156001141561067c5760008281526002602052604090819020805460ff19166001179055517f4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c90610673908490612195565b60405180910390a15b6000833343604051602001610693939291906121fa565b60408051601f1981840301815291815281516020928301206000908152600192839052908120805460ff1916831790555550505050505050505050565b60045481565b6060848484846040516024016106ef9493929190612260565b60408051601f198184030181529190526020810180516001600160e01b031663cbd4ece960e01b1790529050949350505050565b6107616040518060400160405280601d81526020017f4f564d5f43616e6f6e6963616c5472616e73616374696f6e436861696e000000815250610243565b6001600160a01b0316636fee07e06107ad6040518060400160405280601a81526020017f4f564d5f4c3243726f7373446f6d61696e4d657373656e676572000000000000815250610243565b83856040518463ffffffff1660e01b81526004016107cd9392919061229d565b600060405180830381600087803b1580156107e757600080fd5b505af11580156103c7573d6000803e3d6000fd5b600061080682610820565b80156108175750610817838361097d565b90505b92915050565b6000806108616040518060400160405280601881526020017f4f564d5f5374617465436f6d6d69746d656e74436861696e0000000000000000815250610243565b6020840151604051639418bddd60e01b81529192506001600160a01b03831691639418bddd9161089391600401612580565b60206040518083038186803b1580156108ab57600080fd5b505afa1580156108bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108e3919061208e565b1580156109765750825160208401516040808601519051634d69ee5760e01b81526001600160a01b03851693634d69ee57936109269391929091906004016122cf565b60206040518083038186803b15801561093e57600080fd5b505afa158015610952573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610976919061208e565b9392505050565b600080836109bf6040518060400160405280601a81526020017f4f564d5f4c3243726f7373446f6d61696e4d657373656e676572000000000000815250610243565b6040516020016109d09291906121c8565b6040516020818303038152906040528051906020012060006040516020016109f992919061219e565b604051602081830303815290604052805190602001209050600080610a48602160991b604051602001610a2c919061217d565b60408051601f1981840301815291905260608701518751610ada565b9092509050600182151514610a6f5760405162461bcd60e51b815260040161034f906123db565b6000610a7a82610b03565b9050610acf84604051602001610a909190612195565b6040516020818303038152906040526001604051602001610ab19190612234565b60405160208183030381529060405288608001518460400151610b95565b979650505050505050565b600060606000610ae986610bb9565b9050610af6818686610be9565b9250925050935093915050565b610b0b611c28565b6000610b1683610cbc565b90506040518060800160405280610b4083600081518110610b3357fe5b6020026020010151610ccf565b8152602001610b5583600181518110610b3357fe5b8152602001610b7783600281518110610b6a57fe5b6020026020010151610cd6565b8152602001610b8c83600381518110610b6a57fe5b90529392505050565b600080610ba186610bb9565b9050610baf81868686610dcf565b9695505050505050565b60608180519060200120604051602001610bd39190612195565b6040516020818303038152906040529050919050565b600060606000610bf885610df5565b90506000806000610c0a848a89610ecc565b81519295509093509150158080610c1e5750815b610c6f576040805162461bcd60e51b815260206004820152601a60248201527f50726f76696465642070726f6f6620697320696e76616c69642e000000000000604482015290519081900360640190fd5b600081610c8b5760405180602001604052806000815250610caa565b610caa866001870381518110610c9d57fe5b602002602001015161126f565b919b919a509098505050505050505050565b606061081a610cca8361128b565b6112b0565b600061081a825b6000602182600001511115610d32576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e000000000000604482015290519081900360640190fd5b6000806000610d4085611426565b919450925090506000816001811115610d5557fe5b14610da7576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e000000000000604482015290519081900360640190fd5b602080860151840180519091841015610baf5760208490036101000a90049695505050505050565b6000806000610ddf878686610be9565b91509150818015610acf5750610acf868261174f565b60606000610e0283610cbc565b90506000815167ffffffffffffffff81118015610e1e57600080fd5b50604051908082528060200260200182016040528015610e5857816020015b610e45611c4f565b815260200190600190039081610e3d5790505b50905060005b8251811015610ec4576000610e85848381518110610e7857fe5b6020026020010151611765565b90506040518060400160405280828152602001610ea183610cbc565b815250838381518110610eb057fe5b602090810291909101015250600101610e5e565b509392505050565b60006060818080610edc876117f4565b905085600080610eea611c4f565b60005b8c51811015611247578c8181518110610f0257fe5b6020026020010151915082840193506001870196508360001415610f7657815180516020909101208514610f71576040805162461bcd60e51b8152602060048201526011602482015270092dcecc2d8d2c840e4dedee840d0c2e6d607b1b604482015290519081900360640190fd5b61103d565b815151602011610fdd57815180516020909101208514610f71576040805162461bcd60e51b815260206004820152601b60248201527f496e76616c6964206c6172676520696e7465726e616c20686173680000000000604482015290519081900360640190fd5b84610feb83600001516118f1565b1461103d576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420696e7465726e616c206e6f64652068617368000000000000604482015290519081900360640190fd5b602082015151601114156110ac57855184141561105957611247565b600086858151811061106757fe5b602001015160f81c60f81b60f81c9050600083602001518260ff168151811061108c57fe5b6020026020010151905061109f8161191d565b965060019450505061123f565b600282602001515114156111f25760006110c583611953565b90506000816000815181106110d657fe5b016020015160f81c90506001811660020360006110f68460ff8416611971565b905060006111048b8a611971565b9050600061111283836119a2565b905060ff851660021480611129575060ff85166003145b1561115b5780835114801561113e5750808251145b1561114857988901985b50600160ff1b9950611247945050505050565b60ff8516158061116e575060ff85166001145b156111bb578061118b5750600160ff1b9950611247945050505050565b6111ac886020015160018151811061119f57fe5b602002602001015161191d565b9a50975061123f945050505050565b60405162461bcd60e51b81526004018080602001828103825260268152602001806126126026913960400191505060405180910390fd5b6040805162461bcd60e51b815260206004820152601d60248201527f526563656976656420616e20756e706172736561626c65206e6f64652e000000604482015290519081900360640190fd5b600101610eed565b50600160ff1b84148661125a8786611971565b909e909d50909b509950505050505050505050565b6020810151805160609161081a916000198101908110610e7857fe5b611293611c69565b506040805180820190915281518152602082810190820152919050565b60606000806112be84611426565b919350909150600190508160018111156112d457fe5b14611326576040805162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c50206c6973742076616c75652e000000000000000000604482015290519081900360640190fd5b6040805160208082526104208201909252600091816020015b611347611c69565b81526020019060019003908161133f5790505090506000835b865181101561141b57602082106113a85760405162461bcd60e51b815260040180806020018281038252602a8152602001806125e8602a913960400191505060405180910390fd5b6000806113d46040518060400160405280858c60000151038152602001858c6020015101815250611426565b509150915060405180604001604052808383018152602001848b602001510181525085858151811061140257fe5b6020908102919091010152600193909301920101611360565b508152949350505050565b600080600080846000015111611483576040805162461bcd60e51b815260206004820152601860248201527f524c50206974656d2063616e6e6f74206265206e756c6c2e0000000000000000604482015290519081900360640190fd5b6020840151805160001a607f81116114a8576000600160009450945094505050611748565b60b7811161151d578551607f19820190811061150b576040805162461bcd60e51b815260206004820152601960248201527f496e76616c696420524c502073686f727420737472696e672e00000000000000604482015290519081900360640190fd5b60019550935060009250611748915050565b60bf811161160157855160b6198201908110611580576040805162461bcd60e51b815260206004820152601f60248201527f496e76616c696420524c50206c6f6e6720737472696e67206c656e6774682e00604482015290519081900360640190fd5b6000816020036101000a60018501510490508082018860000151116115ec576040805162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c50206c6f6e6720737472696e672e0000000000000000604482015290519081900360640190fd5b60019091019550935060009250611748915050565b60f7811161167557855160bf198201908110611664576040805162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c502073686f7274206c6973742e000000000000000000604482015290519081900360640190fd5b600195509350849250611748915050565b855160f61982019081106116d0576040805162461bcd60e51b815260206004820152601d60248201527f496e76616c696420524c50206c6f6e67206c697374206c656e6774682e000000604482015290519081900360640190fd5b6000816020036101000a6001850151049050808201886000015111611735576040805162461bcd60e51b815260206004820152601660248201527524b73b30b634b210292628103637b733903634b9ba1760511b604482015290519081900360640190fd5b6001918201965094509250611748915050565b9193909250565b8051602091820120825192909101919091201490565b6060600080600061177585611426565b91945092509050600081600181111561178a57fe5b146117dc576040805162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c502062797465732076616c75652e0000000000000000604482015290519081900360640190fd5b6117eb85602001518484611a08565b95945050505050565b60606000825160020267ffffffffffffffff8111801561181357600080fd5b506040519080825280601f01601f19166020018201604052801561183e576020820181803683370190505b50905060005b83518110156118ea57600484828151811061185b57fe5b602001015160f81c60f81b6001600160f81b031916901c82826002028151811061188157fe5b60200101906001600160f81b031916908160001a90535060108482815181106118a657fe5b016020015160f81c816118b557fe5b0660f81b8282600202600101815181106118cb57fe5b60200101906001600160f81b031916908160001a905350600101611844565b5092915050565b60006020825110156119085750602081015161031a565b81806020019051602081101561031557600080fd5b6000606060208360000151101561193e5761193783611ab6565b905061194a565b61194783611765565b90505b610976816118f1565b606061081a61196c8360200151600081518110610e7857fe5b6117f4565b60608183510360001415611994575060408051602081019091526000815261081a565b610817838384865103611ac1565b6000805b8084511180156119b65750808351115b80156119fb57508281815181106119c957fe5b602001015160f81c60f81b6001600160f81b0319168482815181106119ea57fe5b01602001516001600160f81b031916145b15610817576001016119a6565b606060008267ffffffffffffffff81118015611a2357600080fd5b506040519080825280601f01601f191660200182016040528015611a4e576020820181803683370190505b509050805160001415611a62579050610976565b8484016020820160005b60208604811015611a8d578251825260209283019290910190600101611a6c565b5080519151601f959095166020036101000a600019019182169119909416179092525092915050565b606061081a82611c12565b60608182601f011015611b0c576040805162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b604482015290519081900360640190fd5b828284011015611b54576040805162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b604482015290519081900360640190fd5b81830184511015611ba0576040805162461bcd60e51b8152602060048201526011602482015270736c6963655f6f75744f66426f756e647360781b604482015290519081900360640190fd5b606082158015611bbf5760405191506000825260208201604052611c09565b6040519150601f8416801560200281840101858101878315602002848b0101015b81831015611bf8578051835260209283019201611be0565b5050858452601f01601f1916604052505b50949350505050565b606061081a826020015160008460000151611a08565b60408051608081018252600080825260208201819052918101829052606081019190915290565b604051806040016040528060608152602001606081525090565b604051806040016040528060008152602001600081525090565b600067ffffffffffffffff831115611c9757fe5b611caa601f8401601f1916602001612593565b9050828152838383011115611cbe57600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b038116811461031a57600080fd5b600082601f830112611cfc578081fd5b61081783833560208501611c83565b600060a08284031215611d1c578081fd5b60405160a0810167ffffffffffffffff8282108183111715611d3a57fe5b81604052829350843583526020850135602084015260408501356040840152606085013560608401526080850135915080821115611d7757600080fd5b50611d8485828601611cec565b6080830152505092915050565b600060408284031215611da2578081fd5b6040516040810167ffffffffffffffff8282108183111715611dc057fe5b8160405282935084358352602091508185013581811115611de057600080fd5b8501601f81018713611df157600080fd5b803582811115611dfd57fe5b8381029250611e0d848401612593565b8181528481019083860185850187018b1015611e2857600080fd5b600095505b83861015611e4b578035835260019590950194918601918601611e2d565b5080868801525050505050505092915050565b803563ffffffff8116811461031a57600080fd5b600060208284031215611e83578081fd5b61081782611cd5565b600080600080600060a08688031215611ea3578081fd5b611eac86611cd5565b9450611eba60208701611cd5565b9350604086013567ffffffffffffffff80821115611ed6578283fd5b611ee289838a01611cec565b9450606088013593506080880135915080821115611efe578283fd5b9087019060a0828a031215611f11578283fd5b611f1b60a0612593565b82358152602083013582811115611f30578485fd5b611f3c8b828601611d0b565b602083015250604083013582811115611f53578485fd5b611f5f8b828601611d91565b604083015250606083013582811115611f76578485fd5b611f828b828601611cec565b606083015250608083013582811115611f99578485fd5b611fa58b828601611cec565b6080830152508093505050509295509295909350565b600080600080600060a08688031215611fd2578081fd5b611fdb86611cd5565b9450611fe960208701611cd5565b9350604086013567ffffffffffffffff811115612004578182fd5b61201088828901611cec565b9350506060860135915061202660808701611e5e565b90509295509295909350565b600080600060608486031215612046578283fd5b61204f84611cd5565b9250602084013567ffffffffffffffff81111561206a578283fd5b61207686828701611cec565b92505061208560408501611e5e565b90509250925092565b60006020828403121561209f578081fd5b81518015158114610817578182fd5b6000602082840312156120bf578081fd5b5035919050565b6000602082840312156120d7578081fd5b813567ffffffffffffffff8111156120ed578182fd5b8201601f810184136120fd578182fd5b61210c84823560208401611c83565b949350505050565b6000815180845261212c8160208601602086016125b7565b601f01601f19169290920160200192915050565b600081518352602082015160208401526040820151604084015260608201516060840152608082015160a0608085015261210c60a0850182612114565b60609190911b6001600160601b031916815260140190565b90815260200190565b918252602082015260400190565b600082516121be8184602087016125b7565b9190910192915050565b600083516121da8184602088016125b7565b60609390931b6001600160601b0319169190920190815260140192915050565b6000845161220c8184602089016125b7565b60609490941b6001600160601b03191691909301908152601481019190915260340192915050565b60f89190911b6001600160f81b031916815260010190565b6001600160a01b0391909116815260200190565b6001600160a01b0385811682528416602082015260806040820181905260009061228c90830185612114565b905082606083015295945050505050565b600060018060a01b0385168252836020830152606060408301526117eb6060830184612114565b901515815260200190565b600084825260206060818401526122e96060840186612140565b838103604085015260408101855182528286015160408484015281815180845260608501915085830194508693505b808410156123385784518252938501936001939093019290850190612318565b509998505050505050505050565b6000602082526108176020830184612114565b6020808252601f908201527f78446f6d61696e4d65737361676553656e646572206973206e6f742073657400604082015260600190565b6020808252602b908201527f50726f7669646564206d6573736167652068617320616c72656164792062656560408201526a37103932b1b2b4bb32b21760a91b606082015260800190565b6020808252604d908201527f4d6573736167652070617373696e67207072656465706c6f7920686173206e6f60408201527f74206265656e20696e697469616c697a6564206f7220696e76616c696420707260608201526c37b7b310383937bb34b232b21760991b608082015260a00190565b6020808252602b908201527f50726f7669646564206d65737361676520686173206e6f7420616c726561647960408201526a103132b2b71039b2b73a1760a91b606082015260800190565b60208082526036908201527f4f6e6c79204f564d5f4c324d65737361676552656c617965722063616e2072656040820152753630bc90261916ba3796a6189036b2b9b9b0b3b2b99760511b606082015260800190565b60208082526027908201527f50726f7669646564206d65737361676520636f756c64206e6f742062652076656040820152663934b334b2b21760c91b606082015260800190565b6020808252602a908201527f4c3143726f7373446f6d61696e4d657373656e67657220616c72656164792069604082015269373a34b0b634bd32b21760b11b606082015260800190565b6000602082526108176020830184612140565b60405181810167ffffffffffffffff811182821017156125af57fe5b604052919050565b60005b838110156125d25781810151838201526020016125ba565b838111156125e1576000848401525b5050505056fe50726f766964656420524c50206c6973742065786365656473206d6178206c697374206c656e6774682e52656365697665642061206e6f6465207769746820616e20756e6b6e6f776e20707265666978a2646970667358221220986a82679006a5fd2879b63e2292241fdf0320ad43895a86819e893ed06c6c9264736f6c63430007060033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100a95760003560e01c8063706ceab611610071578063706ceab61461011c57806382e3702d1461012f578063b1b1b20914610142578063c4d66de814610155578063d7fd19dd14610168578063ecc704281461017b576100a9565b806321d800ec146100ae578063299ca478146100d75780633dbb202b146100ec578063461a4478146101015780636e296e4514610114575b600080fd5b6100c16100bc3660046120ae565b610190565b6040516100ce91906122c4565b60405180910390f35b6100df6101a5565b6040516100ce919061224c565b6100ff6100fa366004612032565b6101b4565b005b6100df61010f3660046120c6565b610243565b6100df61031f565b6100ff61012a366004611fbb565b610368565b6100c161013d3660046120ae565b6103cf565b6100c16101503660046120ae565b6103e4565b6100ff610163366004611e72565b6103f9565b6100ff610176366004611e8c565b61044f565b6101836106d0565b6040516100ce9190612195565b60016020526000908152604090205460ff1681565b6006546001600160a01b031681565b60006101c48433856004546106d6565b60048054600190810190915581516020808401919091206000908152600390915260409020805460ff1916909117905590506102068163ffffffff8416610723565b7f0ee9ffdb2334d78de97ffb066b23a352a4d35180cefb36589d663fbb1eb6f326816040516102359190612346565b60405180910390a150505050565b60065460405163bf40fac160e01b81526020600482018181528451602484015284516000946001600160a01b03169363bf40fac1938793928392604401918501908083838b5b838110156102a1578181015183820152602001610289565b50505050905090810190601f1680156102ce5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b1580156102eb57600080fd5b505afa1580156102ff573d6000803e3d6000fd5b505050506040513d602081101561031557600080fd5b505190505b919050565b6005546000906001600160a01b031661dead14156103585760405162461bcd60e51b815260040161034f90612359565b60405180910390fd5b506005546001600160a01b031690565b6000610376868686866106d6565b805160208083019190912060009081526003909152604090205490915060ff1615156001146103b75760405162461bcd60e51b815260040161034f9061244e565b6103c7818363ffffffff16610723565b505050505050565b60036020526000908152604090205460ff1681565b60026020526000908152604090205460ff1681565b6006546001600160a01b0316156104225760405162461bcd60e51b815260040161034f90612536565b600680546001600160a01b039092166001600160a01b03199283161790556005805490911661dead179055565b600260005414156104a7576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6002600090815560408051808201909152601481527327ab26afa61926b2b9b9b0b3b2a932b630bcb2b960611b60208201526104e290610243565b90506001600160a01b0381161561051b57336001600160a01b0382161461051b5760405162461bcd60e51b815260040161034f90612499565b6000610529878787876106d6565b905061053581846107fb565b15156001146105565760405162461bcd60e51b815260040161034f906124ef565b80516020808301919091206000818152600290925260409091205460ff16156105915760405162461bcd60e51b815260040161034f90612390565b600580546001600160a01b0319166001600160a01b03898116919091179091556040516000918a16906105c59089906121ac565b6000604051808303816000865af19150503d8060008114610602576040519150601f19603f3d011682016040523d82523d6000602084013e610607565b606091505b5050600580546001600160a01b03191661dead17905590508015156001141561067c5760008281526002602052604090819020805460ff19166001179055517f4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c90610673908490612195565b60405180910390a15b6000833343604051602001610693939291906121fa565b60408051601f1981840301815291815281516020928301206000908152600192839052908120805460ff1916831790555550505050505050505050565b60045481565b6060848484846040516024016106ef9493929190612260565b60408051601f198184030181529190526020810180516001600160e01b031663cbd4ece960e01b1790529050949350505050565b6107616040518060400160405280601d81526020017f4f564d5f43616e6f6e6963616c5472616e73616374696f6e436861696e000000815250610243565b6001600160a01b0316636fee07e06107ad6040518060400160405280601a81526020017f4f564d5f4c3243726f7373446f6d61696e4d657373656e676572000000000000815250610243565b83856040518463ffffffff1660e01b81526004016107cd9392919061229d565b600060405180830381600087803b1580156107e757600080fd5b505af11580156103c7573d6000803e3d6000fd5b600061080682610820565b80156108175750610817838361097d565b90505b92915050565b6000806108616040518060400160405280601881526020017f4f564d5f5374617465436f6d6d69746d656e74436861696e0000000000000000815250610243565b6020840151604051639418bddd60e01b81529192506001600160a01b03831691639418bddd9161089391600401612580565b60206040518083038186803b1580156108ab57600080fd5b505afa1580156108bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108e3919061208e565b1580156109765750825160208401516040808601519051634d69ee5760e01b81526001600160a01b03851693634d69ee57936109269391929091906004016122cf565b60206040518083038186803b15801561093e57600080fd5b505afa158015610952573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610976919061208e565b9392505050565b600080836109bf6040518060400160405280601a81526020017f4f564d5f4c3243726f7373446f6d61696e4d657373656e676572000000000000815250610243565b6040516020016109d09291906121c8565b6040516020818303038152906040528051906020012060006040516020016109f992919061219e565b604051602081830303815290604052805190602001209050600080610a48602160991b604051602001610a2c919061217d565b60408051601f1981840301815291905260608701518751610ada565b9092509050600182151514610a6f5760405162461bcd60e51b815260040161034f906123db565b6000610a7a82610b03565b9050610acf84604051602001610a909190612195565b6040516020818303038152906040526001604051602001610ab19190612234565b60405160208183030381529060405288608001518460400151610b95565b979650505050505050565b600060606000610ae986610bb9565b9050610af6818686610be9565b9250925050935093915050565b610b0b611c28565b6000610b1683610cbc565b90506040518060800160405280610b4083600081518110610b3357fe5b6020026020010151610ccf565b8152602001610b5583600181518110610b3357fe5b8152602001610b7783600281518110610b6a57fe5b6020026020010151610cd6565b8152602001610b8c83600381518110610b6a57fe5b90529392505050565b600080610ba186610bb9565b9050610baf81868686610dcf565b9695505050505050565b60608180519060200120604051602001610bd39190612195565b6040516020818303038152906040529050919050565b600060606000610bf885610df5565b90506000806000610c0a848a89610ecc565b81519295509093509150158080610c1e5750815b610c6f576040805162461bcd60e51b815260206004820152601a60248201527f50726f76696465642070726f6f6620697320696e76616c69642e000000000000604482015290519081900360640190fd5b600081610c8b5760405180602001604052806000815250610caa565b610caa866001870381518110610c9d57fe5b602002602001015161126f565b919b919a509098505050505050505050565b606061081a610cca8361128b565b6112b0565b600061081a825b6000602182600001511115610d32576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e000000000000604482015290519081900360640190fd5b6000806000610d4085611426565b919450925090506000816001811115610d5557fe5b14610da7576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e000000000000604482015290519081900360640190fd5b602080860151840180519091841015610baf5760208490036101000a90049695505050505050565b6000806000610ddf878686610be9565b91509150818015610acf5750610acf868261174f565b60606000610e0283610cbc565b90506000815167ffffffffffffffff81118015610e1e57600080fd5b50604051908082528060200260200182016040528015610e5857816020015b610e45611c4f565b815260200190600190039081610e3d5790505b50905060005b8251811015610ec4576000610e85848381518110610e7857fe5b6020026020010151611765565b90506040518060400160405280828152602001610ea183610cbc565b815250838381518110610eb057fe5b602090810291909101015250600101610e5e565b509392505050565b60006060818080610edc876117f4565b905085600080610eea611c4f565b60005b8c51811015611247578c8181518110610f0257fe5b6020026020010151915082840193506001870196508360001415610f7657815180516020909101208514610f71576040805162461bcd60e51b8152602060048201526011602482015270092dcecc2d8d2c840e4dedee840d0c2e6d607b1b604482015290519081900360640190fd5b61103d565b815151602011610fdd57815180516020909101208514610f71576040805162461bcd60e51b815260206004820152601b60248201527f496e76616c6964206c6172676520696e7465726e616c20686173680000000000604482015290519081900360640190fd5b84610feb83600001516118f1565b1461103d576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420696e7465726e616c206e6f64652068617368000000000000604482015290519081900360640190fd5b602082015151601114156110ac57855184141561105957611247565b600086858151811061106757fe5b602001015160f81c60f81b60f81c9050600083602001518260ff168151811061108c57fe5b6020026020010151905061109f8161191d565b965060019450505061123f565b600282602001515114156111f25760006110c583611953565b90506000816000815181106110d657fe5b016020015160f81c90506001811660020360006110f68460ff8416611971565b905060006111048b8a611971565b9050600061111283836119a2565b905060ff851660021480611129575060ff85166003145b1561115b5780835114801561113e5750808251145b1561114857988901985b50600160ff1b9950611247945050505050565b60ff8516158061116e575060ff85166001145b156111bb578061118b5750600160ff1b9950611247945050505050565b6111ac886020015160018151811061119f57fe5b602002602001015161191d565b9a50975061123f945050505050565b60405162461bcd60e51b81526004018080602001828103825260268152602001806126126026913960400191505060405180910390fd5b6040805162461bcd60e51b815260206004820152601d60248201527f526563656976656420616e20756e706172736561626c65206e6f64652e000000604482015290519081900360640190fd5b600101610eed565b50600160ff1b84148661125a8786611971565b909e909d50909b509950505050505050505050565b6020810151805160609161081a916000198101908110610e7857fe5b611293611c69565b506040805180820190915281518152602082810190820152919050565b60606000806112be84611426565b919350909150600190508160018111156112d457fe5b14611326576040805162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c50206c6973742076616c75652e000000000000000000604482015290519081900360640190fd5b6040805160208082526104208201909252600091816020015b611347611c69565b81526020019060019003908161133f5790505090506000835b865181101561141b57602082106113a85760405162461bcd60e51b815260040180806020018281038252602a8152602001806125e8602a913960400191505060405180910390fd5b6000806113d46040518060400160405280858c60000151038152602001858c6020015101815250611426565b509150915060405180604001604052808383018152602001848b602001510181525085858151811061140257fe5b6020908102919091010152600193909301920101611360565b508152949350505050565b600080600080846000015111611483576040805162461bcd60e51b815260206004820152601860248201527f524c50206974656d2063616e6e6f74206265206e756c6c2e0000000000000000604482015290519081900360640190fd5b6020840151805160001a607f81116114a8576000600160009450945094505050611748565b60b7811161151d578551607f19820190811061150b576040805162461bcd60e51b815260206004820152601960248201527f496e76616c696420524c502073686f727420737472696e672e00000000000000604482015290519081900360640190fd5b60019550935060009250611748915050565b60bf811161160157855160b6198201908110611580576040805162461bcd60e51b815260206004820152601f60248201527f496e76616c696420524c50206c6f6e6720737472696e67206c656e6774682e00604482015290519081900360640190fd5b6000816020036101000a60018501510490508082018860000151116115ec576040805162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c50206c6f6e6720737472696e672e0000000000000000604482015290519081900360640190fd5b60019091019550935060009250611748915050565b60f7811161167557855160bf198201908110611664576040805162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c502073686f7274206c6973742e000000000000000000604482015290519081900360640190fd5b600195509350849250611748915050565b855160f61982019081106116d0576040805162461bcd60e51b815260206004820152601d60248201527f496e76616c696420524c50206c6f6e67206c697374206c656e6774682e000000604482015290519081900360640190fd5b6000816020036101000a6001850151049050808201886000015111611735576040805162461bcd60e51b815260206004820152601660248201527524b73b30b634b210292628103637b733903634b9ba1760511b604482015290519081900360640190fd5b6001918201965094509250611748915050565b9193909250565b8051602091820120825192909101919091201490565b6060600080600061177585611426565b91945092509050600081600181111561178a57fe5b146117dc576040805162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c502062797465732076616c75652e0000000000000000604482015290519081900360640190fd5b6117eb85602001518484611a08565b95945050505050565b60606000825160020267ffffffffffffffff8111801561181357600080fd5b506040519080825280601f01601f19166020018201604052801561183e576020820181803683370190505b50905060005b83518110156118ea57600484828151811061185b57fe5b602001015160f81c60f81b6001600160f81b031916901c82826002028151811061188157fe5b60200101906001600160f81b031916908160001a90535060108482815181106118a657fe5b016020015160f81c816118b557fe5b0660f81b8282600202600101815181106118cb57fe5b60200101906001600160f81b031916908160001a905350600101611844565b5092915050565b60006020825110156119085750602081015161031a565b81806020019051602081101561031557600080fd5b6000606060208360000151101561193e5761193783611ab6565b905061194a565b61194783611765565b90505b610976816118f1565b606061081a61196c8360200151600081518110610e7857fe5b6117f4565b60608183510360001415611994575060408051602081019091526000815261081a565b610817838384865103611ac1565b6000805b8084511180156119b65750808351115b80156119fb57508281815181106119c957fe5b602001015160f81c60f81b6001600160f81b0319168482815181106119ea57fe5b01602001516001600160f81b031916145b15610817576001016119a6565b606060008267ffffffffffffffff81118015611a2357600080fd5b506040519080825280601f01601f191660200182016040528015611a4e576020820181803683370190505b509050805160001415611a62579050610976565b8484016020820160005b60208604811015611a8d578251825260209283019290910190600101611a6c565b5080519151601f959095166020036101000a600019019182169119909416179092525092915050565b606061081a82611c12565b60608182601f011015611b0c576040805162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b604482015290519081900360640190fd5b828284011015611b54576040805162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b604482015290519081900360640190fd5b81830184511015611ba0576040805162461bcd60e51b8152602060048201526011602482015270736c6963655f6f75744f66426f756e647360781b604482015290519081900360640190fd5b606082158015611bbf5760405191506000825260208201604052611c09565b6040519150601f8416801560200281840101858101878315602002848b0101015b81831015611bf8578051835260209283019201611be0565b5050858452601f01601f1916604052505b50949350505050565b606061081a826020015160008460000151611a08565b60408051608081018252600080825260208201819052918101829052606081019190915290565b604051806040016040528060608152602001606081525090565b604051806040016040528060008152602001600081525090565b600067ffffffffffffffff831115611c9757fe5b611caa601f8401601f1916602001612593565b9050828152838383011115611cbe57600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b038116811461031a57600080fd5b600082601f830112611cfc578081fd5b61081783833560208501611c83565b600060a08284031215611d1c578081fd5b60405160a0810167ffffffffffffffff8282108183111715611d3a57fe5b81604052829350843583526020850135602084015260408501356040840152606085013560608401526080850135915080821115611d7757600080fd5b50611d8485828601611cec565b6080830152505092915050565b600060408284031215611da2578081fd5b6040516040810167ffffffffffffffff8282108183111715611dc057fe5b8160405282935084358352602091508185013581811115611de057600080fd5b8501601f81018713611df157600080fd5b803582811115611dfd57fe5b8381029250611e0d848401612593565b8181528481019083860185850187018b1015611e2857600080fd5b600095505b83861015611e4b578035835260019590950194918601918601611e2d565b5080868801525050505050505092915050565b803563ffffffff8116811461031a57600080fd5b600060208284031215611e83578081fd5b61081782611cd5565b600080600080600060a08688031215611ea3578081fd5b611eac86611cd5565b9450611eba60208701611cd5565b9350604086013567ffffffffffffffff80821115611ed6578283fd5b611ee289838a01611cec565b9450606088013593506080880135915080821115611efe578283fd5b9087019060a0828a031215611f11578283fd5b611f1b60a0612593565b82358152602083013582811115611f30578485fd5b611f3c8b828601611d0b565b602083015250604083013582811115611f53578485fd5b611f5f8b828601611d91565b604083015250606083013582811115611f76578485fd5b611f828b828601611cec565b606083015250608083013582811115611f99578485fd5b611fa58b828601611cec565b6080830152508093505050509295509295909350565b600080600080600060a08688031215611fd2578081fd5b611fdb86611cd5565b9450611fe960208701611cd5565b9350604086013567ffffffffffffffff811115612004578182fd5b61201088828901611cec565b9350506060860135915061202660808701611e5e565b90509295509295909350565b600080600060608486031215612046578283fd5b61204f84611cd5565b9250602084013567ffffffffffffffff81111561206a578283fd5b61207686828701611cec565b92505061208560408501611e5e565b90509250925092565b60006020828403121561209f578081fd5b81518015158114610817578182fd5b6000602082840312156120bf578081fd5b5035919050565b6000602082840312156120d7578081fd5b813567ffffffffffffffff8111156120ed578182fd5b8201601f810184136120fd578182fd5b61210c84823560208401611c83565b949350505050565b6000815180845261212c8160208601602086016125b7565b601f01601f19169290920160200192915050565b600081518352602082015160208401526040820151604084015260608201516060840152608082015160a0608085015261210c60a0850182612114565b60609190911b6001600160601b031916815260140190565b90815260200190565b918252602082015260400190565b600082516121be8184602087016125b7565b9190910192915050565b600083516121da8184602088016125b7565b60609390931b6001600160601b0319169190920190815260140192915050565b6000845161220c8184602089016125b7565b60609490941b6001600160601b03191691909301908152601481019190915260340192915050565b60f89190911b6001600160f81b031916815260010190565b6001600160a01b0391909116815260200190565b6001600160a01b0385811682528416602082015260806040820181905260009061228c90830185612114565b905082606083015295945050505050565b600060018060a01b0385168252836020830152606060408301526117eb6060830184612114565b901515815260200190565b600084825260206060818401526122e96060840186612140565b838103604085015260408101855182528286015160408484015281815180845260608501915085830194508693505b808410156123385784518252938501936001939093019290850190612318565b509998505050505050505050565b6000602082526108176020830184612114565b6020808252601f908201527f78446f6d61696e4d65737361676553656e646572206973206e6f742073657400604082015260600190565b6020808252602b908201527f50726f7669646564206d6573736167652068617320616c72656164792062656560408201526a37103932b1b2b4bb32b21760a91b606082015260800190565b6020808252604d908201527f4d6573736167652070617373696e67207072656465706c6f7920686173206e6f60408201527f74206265656e20696e697469616c697a6564206f7220696e76616c696420707260608201526c37b7b310383937bb34b232b21760991b608082015260a00190565b6020808252602b908201527f50726f7669646564206d65737361676520686173206e6f7420616c726561647960408201526a103132b2b71039b2b73a1760a91b606082015260800190565b60208082526036908201527f4f6e6c79204f564d5f4c324d65737361676552656c617965722063616e2072656040820152753630bc90261916ba3796a6189036b2b9b9b0b3b2b99760511b606082015260800190565b60208082526027908201527f50726f7669646564206d65737361676520636f756c64206e6f742062652076656040820152663934b334b2b21760c91b606082015260800190565b6020808252602a908201527f4c3143726f7373446f6d61696e4d657373656e67657220616c72656164792069604082015269373a34b0b634bd32b21760b11b606082015260800190565b6000602082526108176020830184612140565b60405181810167ffffffffffffffff811182821017156125af57fe5b604052919050565b60005b838110156125d25781810151838201526020016125ba565b838111156125e1576000848401525b5050505056fe50726f766964656420524c50206c6973742065786365656473206d6178206c697374206c656e6774682e52656365697665642061206e6f6465207769746820616e20756e6b6e6f776e20707265666978a2646970667358221220986a82679006a5fd2879b63e2292241fdf0320ad43895a86819e893ed06c6c9264736f6c63430007060033", - "devdoc": { - "details": "The L1 Cross Domain Messenger contract sends messages from L1 to L2, and relays messages from L2 onto L1. In the event that a message sent from L1 to L2 is rejected for exceeding the L2 epoch gas limit, it can be resubmitted via this contract's replay function. Compiler used: solc Runtime target: EVM", - "kind": "dev", - "methods": { - "initialize(address)": { - "params": { - "_libAddressManager": "Address of the Address Manager." - } - }, - "relayMessage(address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))": { - "params": { - "_message": "Message to send to the target.", - "_messageNonce": "Nonce for the provided message.", - "_proof": "Inclusion proof for the given message.", - "_sender": "Message sender address.", - "_target": "Target contract address." - } - }, - "replayMessage(address,address,bytes,uint256,uint32)": { - "params": { - "_gasLimit": "Gas limit for the provided message.", - "_message": "Message to send to the target.", - "_messageNonce": "Nonce for the provided message.", - "_sender": "Original sender address.", - "_target": "Target contract address." - } - }, - "resolve(string)": { - "params": { - "_name": "Name to resolve an address for." - }, - "returns": { - "_0": "Address associated with the given name." - } - }, - "sendMessage(address,bytes,uint32)": { - "params": { - "_gasLimit": "Gas limit for the provided message.", - "_message": "Message to send to the target.", - "_target": "Target contract address." - } - } - }, - "title": "OVM_L1CrossDomainMessenger", - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": { - "constructor": { - "notice": "Pass a default zero address to the address resolver. This will be updated when initialized." - }, - "relayMessage(address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))": { - "notice": "Relays a cross domain message to a contract." - }, - "replayMessage(address,address,bytes,uint256,uint32)": { - "notice": "Replays a cross domain message to the target messenger." - }, - "resolve(string)": { - "notice": "Resolves the address associated with a given name." - }, - "sendMessage(address,bytes,uint32)": { - "notice": "Sends a cross domain message to the target messenger." - } - }, - "version": 1 - }, - "storageLayout": { - "storage": [ - { - "astId": 17778, - "contract": "contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1CrossDomainMessenger.sol:OVM_L1CrossDomainMessenger", - "label": "_status", - "offset": 0, - "slot": "0", - "type": "t_uint256" - }, - { - "astId": 686, - "contract": "contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1CrossDomainMessenger.sol:OVM_L1CrossDomainMessenger", - "label": "relayedMessages", - "offset": 0, - "slot": "1", - "type": "t_mapping(t_bytes32,t_bool)" - }, - { - "astId": 690, - "contract": "contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1CrossDomainMessenger.sol:OVM_L1CrossDomainMessenger", - "label": "successfulMessages", - "offset": 0, - "slot": "2", - "type": "t_mapping(t_bytes32,t_bool)" - }, - { - "astId": 694, - "contract": "contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1CrossDomainMessenger.sol:OVM_L1CrossDomainMessenger", - "label": "sentMessages", - "offset": 0, - "slot": "3", - "type": "t_mapping(t_bytes32,t_bool)" - }, - { - "astId": 696, - "contract": "contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1CrossDomainMessenger.sol:OVM_L1CrossDomainMessenger", - "label": "messageNonce", - "offset": 0, - "slot": "4", - "type": "t_uint256" - }, - { - "astId": 699, - "contract": "contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1CrossDomainMessenger.sol:OVM_L1CrossDomainMessenger", - "label": "xDomainMsgSender", - "offset": 0, - "slot": "5", - "type": "t_address" - }, - { - "astId": 12557, - "contract": "contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1CrossDomainMessenger.sol:OVM_L1CrossDomainMessenger", - "label": "libAddressManager", - "offset": 0, - "slot": "6", - "type": "t_contract(Lib_AddressManager)12550" - } - ], - "types": { - "t_address": { - "encoding": "inplace", - "label": "address", - "numberOfBytes": "20" - }, - "t_bool": { - "encoding": "inplace", - "label": "bool", - "numberOfBytes": "1" - }, - "t_bytes32": { - "encoding": "inplace", - "label": "bytes32", - "numberOfBytes": "32" - }, - "t_contract(Lib_AddressManager)12550": { - "encoding": "inplace", - "label": "contract Lib_AddressManager", - "numberOfBytes": "20" - }, - "t_mapping(t_bytes32,t_bool)": { - "encoding": "mapping", - "key": "t_bytes32", - "label": "mapping(bytes32 => bool)", - "numberOfBytes": "32", - "value": "t_bool" - }, - "t_uint256": { - "encoding": "inplace", - "label": "uint256", - "numberOfBytes": "32" - } - } - } -} \ No newline at end of file diff --git a/packages/contracts/deployments/goerli-v2/OVM_L1ETHGateway.json b/packages/contracts/deployments/goerli-v2/OVM_L1ETHGateway.json deleted file mode 100644 index 6041c846c772a..0000000000000 --- a/packages/contracts/deployments/goerli-v2/OVM_L1ETHGateway.json +++ /dev/null @@ -1,293 +0,0 @@ -{ - "address": "0x2C9573A5c0d94075601dB745255645FE5D2e5f7C", - "abi": [ - { - "inputs": [], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "_from", - "type": "address" - }, - { - "indexed": false, - "internalType": "address", - "name": "_to", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_amount", - "type": "uint256" - } - ], - "name": "DepositInitiated", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "_to", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_amount", - "type": "uint256" - } - ], - "name": "WithdrawalFinalized", - "type": "event" - }, - { - "inputs": [], - "name": "deposit", - "outputs": [], - "stateMutability": "payable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_to", - "type": "address" - } - ], - "name": "depositTo", - "outputs": [], - "stateMutability": "payable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_amount", - "type": "uint256" - } - ], - "name": "finalizeWithdrawal", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "getFinalizeDepositL2Gas", - "outputs": [ - { - "internalType": "uint32", - "name": "", - "type": "uint32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_libAddressManager", - "type": "address" - }, - { - "internalType": "address", - "name": "_ovmEth", - "type": "address" - } - ], - "name": "initialize", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "libAddressManager", - "outputs": [ - { - "internalType": "contract Lib_AddressManager", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "messenger", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "ovmEth", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "string", - "name": "_name", - "type": "string" - } - ], - "name": "resolve", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "stateMutability": "payable", - "type": "receive" - } - ], - "transactionHash": "0xea5e3398b2bed956814d631e5995ecd04255223367409905edcd5fe9cdc4b9e0", - "receipt": { - "to": null, - "from": "0x558ba9b8d78713fbf768c1f8a584485B4003f43F", - "contractAddress": "0x2C9573A5c0d94075601dB745255645FE5D2e5f7C", - "transactionIndex": 54, - "gasUsed": "609976", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0xf667471a78bbfd62a9e20500b7675f361fe223384db7af4ee06d130e29ee140c", - "transactionHash": "0xea5e3398b2bed956814d631e5995ecd04255223367409905edcd5fe9cdc4b9e0", - "logs": [], - "blockNumber": 4607744, - "cumulativeGasUsed": "3705422", - "status": 1, - "byzantium": true - }, - "args": [], - "solcInputHash": "8aef3555d89ad9d3af2f5d28a85dc856", - "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"DepositInitiated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"WithdrawalFinalized\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"deposit\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"}],\"name\":\"depositTo\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"finalizeWithdrawal\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getFinalizeDepositL2Gas\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_ovmEth\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"messenger\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ovmEth\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"details\":\"The L1 ETH Gateway is a contract which stores deposited ETH that is in use on L2. Compiler used: solc Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"deposit()\":{\"details\":\"deposit an amount of the ETH to the caller's balance on L2\"},\"depositTo(address)\":{\"details\":\"deposit an amount of ETH to a recipients's balance on L2\",\"params\":{\"_to\":\"L2 address to credit the withdrawal to\"}},\"finalizeWithdrawal(address,uint256)\":{\"details\":\"Complete a withdrawal from L2 to L1, and credit funds to the recipient's balance of the L1 ETH token. Since only the xDomainMessenger can call this function, it will never be called before the withdrawal is finalized. \",\"params\":{\"_amount\":\"Amount of the ETH to withdraw\",\"_to\":\"L1 address to credit the withdrawal to\"}},\"initialize(address,address)\":{\"params\":{\"_libAddressManager\":\"Address manager for this OE deployment\",\"_ovmEth\":\"L2 OVM_ETH implementation of iOVM_DepositedToken\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}}},\"title\":\"OVM_L1ETHGateway\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/OVM/bridge/tokens/OVM_L1ETHGateway.sol\":\"OVM_L1ETHGateway\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/optimistic-ethereum/OVM/bridge/tokens/OVM_L1ETHGateway.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// @unsupported: ovm\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Interface Imports */\\nimport { iOVM_L1ETHGateway } from \\\"../../../iOVM/bridge/tokens/iOVM_L1ETHGateway.sol\\\";\\nimport { iOVM_L2DepositedToken } from \\\"../../../iOVM/bridge/tokens/iOVM_L2DepositedToken.sol\\\";\\n\\n/* Library Imports */\\nimport { OVM_CrossDomainEnabled } from \\\"../../../libraries/bridge/OVM_CrossDomainEnabled.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../../libraries/resolver/Lib_AddressResolver.sol\\\";\\nimport { Lib_AddressManager } from \\\"../../../libraries/resolver/Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title OVM_L1ETHGateway\\n * @dev The L1 ETH Gateway is a contract which stores deposited ETH that is in use on L2.\\n *\\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract OVM_L1ETHGateway is iOVM_L1ETHGateway, OVM_CrossDomainEnabled, Lib_AddressResolver {\\n\\n /********************\\n * Public Constants *\\n ********************/\\n\\n uint32 public constant override getFinalizeDepositL2Gas = 1200000;\\n\\n /********************************\\n * External Contract References *\\n ********************************/\\n\\n address public ovmEth;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n // This contract lives behind a proxy, so the constructor parameters will go unused.\\n constructor()\\n OVM_CrossDomainEnabled(address(0))\\n Lib_AddressResolver(address(0))\\n public\\n {}\\n\\n /******************\\n * Initialization *\\n ******************/\\n\\n /**\\n * @param _libAddressManager Address manager for this OE deployment\\n * @param _ovmEth L2 OVM_ETH implementation of iOVM_DepositedToken\\n */\\n function initialize(\\n address _libAddressManager,\\n address _ovmEth\\n )\\n public\\n {\\n require(libAddressManager == Lib_AddressManager(0), \\\"Contract has already been initialized.\\\");\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n ovmEth = _ovmEth;\\n messenger = resolve(\\\"Proxy__OVM_L1CrossDomainMessenger\\\");\\n }\\n\\n /**************\\n * Depositing *\\n **************/\\n\\n receive()\\n external\\n payable\\n {\\n _initiateDeposit(msg.sender, msg.sender);\\n }\\n\\n /**\\n * @dev deposit an amount of the ETH to the caller's balance on L2\\n */\\n function deposit() \\n external\\n override\\n payable\\n {\\n _initiateDeposit(msg.sender, msg.sender);\\n }\\n\\n /**\\n * @dev deposit an amount of ETH to a recipients's balance on L2\\n * @param _to L2 address to credit the withdrawal to\\n */\\n function depositTo(\\n address _to\\n )\\n external\\n override\\n payable\\n {\\n _initiateDeposit(msg.sender, _to);\\n }\\n\\n /**\\n * @dev Performs the logic for deposits by storing the ETH and informing the L2 ETH Gateway of the deposit.\\n *\\n * @param _from Account to pull the deposit from on L1\\n * @param _to Account to give the deposit to on L2\\n */\\n function _initiateDeposit(\\n address _from,\\n address _to\\n )\\n internal\\n {\\n // Construct calldata for l2ETHGateway.finalizeDeposit(_to, _amount)\\n bytes memory data =\\n abi.encodeWithSelector(\\n iOVM_L2DepositedToken.finalizeDeposit.selector,\\n _to,\\n msg.value\\n );\\n\\n // Send calldata into L2\\n sendCrossDomainMessage(\\n ovmEth,\\n data,\\n getFinalizeDepositL2Gas\\n );\\n\\n emit DepositInitiated(_from, _to, msg.value);\\n }\\n\\n /*************************\\n * Cross-chain Functions *\\n *************************/\\n\\n /**\\n * @dev Complete a withdrawal from L2 to L1, and credit funds to the recipient's balance of the\\n * L1 ETH token.\\n * Since only the xDomainMessenger can call this function, it will never be called before the withdrawal is finalized. \\n *\\n * @param _to L1 address to credit the withdrawal to\\n * @param _amount Amount of the ETH to withdraw\\n */\\n function finalizeWithdrawal(\\n address _to,\\n uint256 _amount\\n )\\n external\\n override\\n onlyFromCrossDomainAccount(ovmEth)\\n {\\n _safeTransferETH(_to, _amount);\\n\\n emit WithdrawalFinalized(_to, _amount);\\n }\\n\\n /**********************************\\n * Internal Functions: Accounting *\\n **********************************/\\n\\n /**\\n * @dev Internal accounting function for moving around L1 ETH.\\n *\\n * @param _to L1 address to transfer ETH to\\n * @param _value Amount of ETH to send to\\n */\\n function _safeTransferETH(\\n address _to,\\n uint256 _value\\n )\\n internal\\n {\\n (bool success, ) = _to.call{value: _value}(new bytes(0));\\n require(success, 'TransferHelper::safeTransferETH: ETH transfer failed');\\n }\\n}\\n\",\"keccak256\":\"0x2fff613bf362d01f05d8653247fe46b07dd7bb21c460a30e471d45b7ebd0e627\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/bridge/messaging/iAbs_BaseCrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/**\\n * @title iAbs_BaseCrossDomainMessenger\\n */\\ninterface iAbs_BaseCrossDomainMessenger {\\n\\n /**********\\n * Events *\\n **********/\\n event SentMessage(bytes message);\\n event RelayedMessage(bytes32 msgHash);\\n\\n /**********************\\n * Contract Variables *\\n **********************/\\n function xDomainMessageSender() external view returns (address);\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sends a cross domain message to the target messenger.\\n * @param _target Target contract address.\\n * @param _message Message to send to the target.\\n * @param _gasLimit Gas limit for the provided message.\\n */\\n function sendMessage(\\n address _target,\\n bytes calldata _message,\\n uint32 _gasLimit\\n ) external;\\n}\\n\",\"keccak256\":\"0xc2bd6b373daae2ede34281f4be5938d02b9d1cfb056b40d65ff70b7f16ce3c86\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/bridge/tokens/iOVM_L1ETHGateway.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0;\\npragma experimental ABIEncoderV2;\\n\\n/**\\n * @title iOVM_L1ETHGateway\\n */\\ninterface iOVM_L1ETHGateway {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event DepositInitiated(\\n address indexed _from,\\n address _to,\\n uint256 _amount\\n );\\n\\n event WithdrawalFinalized(\\n address indexed _to,\\n uint256 _amount\\n );\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function deposit()\\n external\\n payable;\\n\\n function depositTo(\\n address _to\\n )\\n external\\n payable;\\n\\n /*************************\\n * Cross-chain Functions *\\n *************************/\\n\\n function finalizeWithdrawal(\\n address _to,\\n uint _amount\\n )\\n external;\\n\\n function getFinalizeDepositL2Gas()\\n external\\n view\\n returns(\\n uint32\\n );\\n}\\n\",\"keccak256\":\"0x7e6805c5cacfd159410c7cd57a3d586e0fc5810bc46600bbd840a252e243e5ba\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/bridge/tokens/iOVM_L2DepositedToken.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0;\\npragma experimental ABIEncoderV2;\\n\\n/**\\n * @title iOVM_L2DepositedToken\\n */\\ninterface iOVM_L2DepositedToken {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event WithdrawalInitiated(\\n address indexed _from,\\n address _to,\\n uint256 _amount\\n );\\n\\n event DepositFinalized(\\n address indexed _to,\\n uint256 _amount\\n ); \\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function withdraw(\\n uint _amount\\n )\\n external;\\n\\n function withdrawTo(\\n address _to,\\n uint _amount\\n )\\n external;\\n\\n\\n /*************************\\n * Cross-chain Functions *\\n *************************/\\n\\n function finalizeDeposit(\\n address _to,\\n uint _amount\\n )\\n external;\\n}\\n\",\"keccak256\":\"0xaa874355e98c444a58712179acaf5ca344296dfa8229577a38a1d14160ce46f8\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/bridge/OVM_CrossDomainEnabled.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n/* Interface Imports */\\nimport { iAbs_BaseCrossDomainMessenger } from \\\"../../iOVM/bridge/messaging/iAbs_BaseCrossDomainMessenger.sol\\\";\\n\\n/**\\n * @title OVM_CrossDomainEnabled\\n * @dev Helper contract for contracts performing cross-domain communications\\n *\\n * Compiler used: defined by inheriting contract\\n * Runtime target: defined by inheriting contract\\n */\\ncontract OVM_CrossDomainEnabled {\\n // Messenger contract used to send and recieve messages from the other domain.\\n address public messenger;\\n\\n /***************\\n * Constructor *\\n ***************/ \\n constructor(\\n address _messenger\\n ) {\\n messenger = _messenger;\\n }\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n /**\\n * @notice Enforces that the modified function is only callable by a specific cross-domain account.\\n * @param _sourceDomainAccount The only account on the originating domain which is authenticated to call this function.\\n */\\n modifier onlyFromCrossDomainAccount(\\n address _sourceDomainAccount\\n ) {\\n require(\\n msg.sender == address(getCrossDomainMessenger()),\\n \\\"OVM_XCHAIN: messenger contract unauthenticated\\\"\\n );\\n\\n require(\\n getCrossDomainMessenger().xDomainMessageSender() == _sourceDomainAccount,\\n \\\"OVM_XCHAIN: wrong sender of cross-domain message\\\"\\n );\\n\\n _;\\n }\\n \\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * @notice Gets the messenger, usually from storage. This function is exposed in case a child contract needs to override.\\n * @return The address of the cross-domain messenger contract which should be used. \\n */\\n function getCrossDomainMessenger()\\n internal\\n virtual\\n returns(\\n iAbs_BaseCrossDomainMessenger\\n )\\n {\\n return iAbs_BaseCrossDomainMessenger(messenger);\\n }\\n\\n /**\\n * @notice Sends a message to an account on another domain\\n * @param _crossDomainTarget The intended recipient on the destination domain\\n * @param _data The data to send to the target (usually calldata to a function with `onlyFromCrossDomainAccount()`)\\n * @param _gasLimit The gasLimit for the receipt of the message on the target domain.\\n */\\n function sendCrossDomainMessage(\\n address _crossDomainTarget,\\n bytes memory _data,\\n uint32 _gasLimit\\n ) internal {\\n getCrossDomainMessenger().sendMessage(_crossDomainTarget, _data, _gasLimit);\\n }\\n}\\n\",\"keccak256\":\"0x1b1c5adbb359f3f46ca9e43b366a80563c031560e9f1f24ab4742b2d79403ce7\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Contract Imports */\\nimport { Ownable } from \\\"./Lib_Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n public\\n onlyOwner\\n {\\n addresses[_getNameHash(_name)] = _address;\\n\\n emit AddressSet(\\n _name,\\n _address\\n );\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0x36473d229ce0ba9d1cac5f02f84be843d9dcc8008525590a1652a2c2636f95f2\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(\\n address _libAddressManager\\n ) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x65981feeabff6a81783ea97d44baf988a18a86c8cb374c46fdb71819cbacc7c0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Ownable\\n * @dev Adapted from https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol\\n */\\nabstract contract Ownable {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n address public owner;\\n\\n\\n /**********\\n * Events *\\n **********/\\n\\n event OwnershipTransferred(\\n address indexed previousOwner,\\n address indexed newOwner\\n );\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n constructor() {\\n owner = msg.sender;\\n emit OwnershipTransferred(address(0), owner);\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n owner == msg.sender,\\n \\\"Ownable: caller is not the owner\\\"\\n );\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the owner of this contract to the zero address, effectively renouncing ownership\\n * completely. Can only be called by the current owner of this contract.\\n */\\n function renounceOwnership()\\n public\\n virtual\\n onlyOwner\\n {\\n emit OwnershipTransferred(owner, address(0));\\n owner = address(0);\\n }\\n\\n /**\\n * Transfers ownership of this contract to a new address. Can only be called by the current\\n * owner of this contract.\\n * @param _newOwner Address of the new contract owner.\\n */\\n function transferOwnership(\\n address _newOwner\\n )\\n public\\n virtual\\n onlyOwner\\n {\\n require(\\n _newOwner != address(0),\\n \\\"Ownable: new owner cannot be the zero address\\\"\\n );\\n\\n emit OwnershipTransferred(owner, _newOwner);\\n owner = _newOwner;\\n }\\n}\\n\",\"keccak256\":\"0x83f9a6c4608b5929086429205b00f8211cdfcba83f3c84520f24d8aa64fe4b82\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x608060405234801561001057600080fd5b50600080546001600160a01b03199081169091556001805490911690556109fb8061003c6000396000f3fe60806040526004361061008a5760003560e01c8063485cc95511610059578063485cc95514610122578063490b5b7814610142578063b760faf914610157578063d0e30db01461016a578063f4f7b41a146101725761009b565b80631273a090146100a0578063299ca478146100cb5780633cb747bf146100ed578063461a4478146101025761009b565b3661009b576100993333610192565b005b600080fd5b3480156100ac57600080fd5b506100b5610246565b6040516100c29190610935565b60405180910390f35b3480156100d757600080fd5b506100e061024d565b6040516100c29190610865565b3480156100f957600080fd5b506100e061025c565b34801561010e57600080fd5b506100e061011d366004610797565b61026b565b34801561012e57600080fd5b5061009961013d36600461073c565b610347565b34801561014e57600080fd5b506100e06103ef565b61009961016536600461071b565b6103fe565b61009961040b565b34801561017e57600080fd5b5061009961018d36600461076e565b610417565b6000638d6e9a5b60e01b82346040516024016101af929190610879565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526002549091506101fe906001600160a01b03168262124f80610578565b826001600160a01b03167ff531653a5819e21265de50358610d55dbe6594c61605b209dfa4280d277938c18334604051610239929190610879565b60405180910390a2505050565b62124f8081565b6001546001600160a01b031681565b6000546001600160a01b031681565b60015460405163bf40fac160e01b81526020600482018181528451602484015284516000946001600160a01b03169363bf40fac1938793928392604401918501908083838b5b838110156102c95781810151838201526020016102b1565b50505050905090810190601f1680156102f65780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561031357600080fd5b505afa158015610327573d6000803e3d6000fd5b505050506040513d602081101561033d57600080fd5b505190505b919050565b6001546001600160a01b0316156103795760405162461bcd60e51b8152600401610370906108e6565b60405180910390fd5b600180546001600160a01b038085166001600160a01b0319928316179092556002805492841692909116919091179055604080516060810190915260218082526103cb91906109a5602083013961026b565b600080546001600160a01b0319166001600160a01b03929092169190911790555050565b6002546001600160a01b031681565b6104083382610192565b50565b6104153333610192565b565b6002546001600160a01b031661042b610663565b6001600160a01b0316336001600160a01b03161461047a5760405162461bcd60e51b815260040180806020018281038252602e815260200180610947602e913960400191505060405180910390fd5b806001600160a01b031661048c610663565b6001600160a01b0316636e296e456040518163ffffffff1660e01b815260040160206040518083038186803b1580156104c457600080fd5b505afa1580156104d8573d6000803e3d6000fd5b505050506040513d60208110156104ee57600080fd5b50516001600160a01b0316146105355760405162461bcd60e51b81526004018080602001828103825260308152602001806109756030913960400191505060405180910390fd5b61053f8383610672565b826001600160a01b03167f9e5c4f9f4e46b8629d3dda85f43a69194f50254404a72dc62b9e932d9c94eda883604051610239919061092c565b610580610663565b6001600160a01b0316633dbb202b8484846040518463ffffffff1660e01b815260040180846001600160a01b03168152602001806020018363ffffffff168152602001828103825284818151815260200191508051906020019080838360005b838110156105f85781810151838201526020016105e0565b50505050905090810190601f1680156106255780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b15801561064657600080fd5b505af115801561065a573d6000803e3d6000fd5b50505050505050565b6000546001600160a01b031690565b604080516000808252602082019092526001600160a01b03841690839060405161069c919061082c565b60006040518083038185875af1925050503d80600081146106d9576040519150601f19603f3d011682016040523d82523d6000602084013e6106de565b606091505b50509050806106ff5760405162461bcd60e51b815260040161037090610892565b505050565b80356001600160a01b038116811461034257600080fd5b60006020828403121561072c578081fd5b61073582610704565b9392505050565b6000806040838503121561074e578081fd5b61075783610704565b915061076560208401610704565b90509250929050565b60008060408385031215610780578182fd5b61078983610704565b946020939093013593505050565b600060208083850312156107a9578182fd5b823567ffffffffffffffff808211156107c0578384fd5b818501915085601f8301126107d3578384fd5b8135818111156107df57fe5b604051601f8201601f19168101850183811182821017156107fc57fe5b6040528181528382018501881015610812578586fd5b818585018683013790810190930193909352509392505050565b60008251815b8181101561084c5760208186018101518583015201610832565b8181111561085a5782828501525b509190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b60208082526034908201527f5472616e7366657248656c7065723a3a736166655472616e736665724554483a60408201527308115512081d1c985b9cd9995c8819985a5b195960621b606082015260800190565b60208082526026908201527f436f6e74726163742068617320616c7265616479206265656e20696e697469616040820152653634bd32b21760d11b606082015260800190565b90815260200190565b63ffffffff9190911681526020019056fe4f564d5f58434841494e3a206d657373656e67657220636f6e747261637420756e61757468656e746963617465644f564d5f58434841494e3a2077726f6e672073656e646572206f662063726f73732d646f6d61696e206d65737361676550726f78795f5f4f564d5f4c3143726f7373446f6d61696e4d657373656e676572a2646970667358221220de066aaa5fd57148be6a10db0bda6a09708546d12d7c2fe0052632e7ed22cdd064736f6c63430007060033", - "deployedBytecode": "0x60806040526004361061008a5760003560e01c8063485cc95511610059578063485cc95514610122578063490b5b7814610142578063b760faf914610157578063d0e30db01461016a578063f4f7b41a146101725761009b565b80631273a090146100a0578063299ca478146100cb5780633cb747bf146100ed578063461a4478146101025761009b565b3661009b576100993333610192565b005b600080fd5b3480156100ac57600080fd5b506100b5610246565b6040516100c29190610935565b60405180910390f35b3480156100d757600080fd5b506100e061024d565b6040516100c29190610865565b3480156100f957600080fd5b506100e061025c565b34801561010e57600080fd5b506100e061011d366004610797565b61026b565b34801561012e57600080fd5b5061009961013d36600461073c565b610347565b34801561014e57600080fd5b506100e06103ef565b61009961016536600461071b565b6103fe565b61009961040b565b34801561017e57600080fd5b5061009961018d36600461076e565b610417565b6000638d6e9a5b60e01b82346040516024016101af929190610879565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526002549091506101fe906001600160a01b03168262124f80610578565b826001600160a01b03167ff531653a5819e21265de50358610d55dbe6594c61605b209dfa4280d277938c18334604051610239929190610879565b60405180910390a2505050565b62124f8081565b6001546001600160a01b031681565b6000546001600160a01b031681565b60015460405163bf40fac160e01b81526020600482018181528451602484015284516000946001600160a01b03169363bf40fac1938793928392604401918501908083838b5b838110156102c95781810151838201526020016102b1565b50505050905090810190601f1680156102f65780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561031357600080fd5b505afa158015610327573d6000803e3d6000fd5b505050506040513d602081101561033d57600080fd5b505190505b919050565b6001546001600160a01b0316156103795760405162461bcd60e51b8152600401610370906108e6565b60405180910390fd5b600180546001600160a01b038085166001600160a01b0319928316179092556002805492841692909116919091179055604080516060810190915260218082526103cb91906109a5602083013961026b565b600080546001600160a01b0319166001600160a01b03929092169190911790555050565b6002546001600160a01b031681565b6104083382610192565b50565b6104153333610192565b565b6002546001600160a01b031661042b610663565b6001600160a01b0316336001600160a01b03161461047a5760405162461bcd60e51b815260040180806020018281038252602e815260200180610947602e913960400191505060405180910390fd5b806001600160a01b031661048c610663565b6001600160a01b0316636e296e456040518163ffffffff1660e01b815260040160206040518083038186803b1580156104c457600080fd5b505afa1580156104d8573d6000803e3d6000fd5b505050506040513d60208110156104ee57600080fd5b50516001600160a01b0316146105355760405162461bcd60e51b81526004018080602001828103825260308152602001806109756030913960400191505060405180910390fd5b61053f8383610672565b826001600160a01b03167f9e5c4f9f4e46b8629d3dda85f43a69194f50254404a72dc62b9e932d9c94eda883604051610239919061092c565b610580610663565b6001600160a01b0316633dbb202b8484846040518463ffffffff1660e01b815260040180846001600160a01b03168152602001806020018363ffffffff168152602001828103825284818151815260200191508051906020019080838360005b838110156105f85781810151838201526020016105e0565b50505050905090810190601f1680156106255780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b15801561064657600080fd5b505af115801561065a573d6000803e3d6000fd5b50505050505050565b6000546001600160a01b031690565b604080516000808252602082019092526001600160a01b03841690839060405161069c919061082c565b60006040518083038185875af1925050503d80600081146106d9576040519150601f19603f3d011682016040523d82523d6000602084013e6106de565b606091505b50509050806106ff5760405162461bcd60e51b815260040161037090610892565b505050565b80356001600160a01b038116811461034257600080fd5b60006020828403121561072c578081fd5b61073582610704565b9392505050565b6000806040838503121561074e578081fd5b61075783610704565b915061076560208401610704565b90509250929050565b60008060408385031215610780578182fd5b61078983610704565b946020939093013593505050565b600060208083850312156107a9578182fd5b823567ffffffffffffffff808211156107c0578384fd5b818501915085601f8301126107d3578384fd5b8135818111156107df57fe5b604051601f8201601f19168101850183811182821017156107fc57fe5b6040528181528382018501881015610812578586fd5b818585018683013790810190930193909352509392505050565b60008251815b8181101561084c5760208186018101518583015201610832565b8181111561085a5782828501525b509190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b60208082526034908201527f5472616e7366657248656c7065723a3a736166655472616e736665724554483a60408201527308115512081d1c985b9cd9995c8819985a5b195960621b606082015260800190565b60208082526026908201527f436f6e74726163742068617320616c7265616479206265656e20696e697469616040820152653634bd32b21760d11b606082015260800190565b90815260200190565b63ffffffff9190911681526020019056fe4f564d5f58434841494e3a206d657373656e67657220636f6e747261637420756e61757468656e746963617465644f564d5f58434841494e3a2077726f6e672073656e646572206f662063726f73732d646f6d61696e206d65737361676550726f78795f5f4f564d5f4c3143726f7373446f6d61696e4d657373656e676572a2646970667358221220de066aaa5fd57148be6a10db0bda6a09708546d12d7c2fe0052632e7ed22cdd064736f6c63430007060033", - "devdoc": { - "details": "The L1 ETH Gateway is a contract which stores deposited ETH that is in use on L2. Compiler used: solc Runtime target: EVM", - "kind": "dev", - "methods": { - "deposit()": { - "details": "deposit an amount of the ETH to the caller's balance on L2" - }, - "depositTo(address)": { - "details": "deposit an amount of ETH to a recipients's balance on L2", - "params": { - "_to": "L2 address to credit the withdrawal to" - } - }, - "finalizeWithdrawal(address,uint256)": { - "details": "Complete a withdrawal from L2 to L1, and credit funds to the recipient's balance of the L1 ETH token. Since only the xDomainMessenger can call this function, it will never be called before the withdrawal is finalized. ", - "params": { - "_amount": "Amount of the ETH to withdraw", - "_to": "L1 address to credit the withdrawal to" - } - }, - "initialize(address,address)": { - "params": { - "_libAddressManager": "Address manager for this OE deployment", - "_ovmEth": "L2 OVM_ETH implementation of iOVM_DepositedToken" - } - }, - "resolve(string)": { - "params": { - "_name": "Name to resolve an address for." - }, - "returns": { - "_0": "Address associated with the given name." - } - } - }, - "title": "OVM_L1ETHGateway", - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": { - "resolve(string)": { - "notice": "Resolves the address associated with a given name." - } - }, - "version": 1 - }, - "storageLayout": { - "storage": [ - { - "astId": 11770, - "contract": "contracts/optimistic-ethereum/OVM/bridge/tokens/OVM_L1ETHGateway.sol:OVM_L1ETHGateway", - "label": "messenger", - "offset": 0, - "slot": "0", - "type": "t_address" - }, - { - "astId": 12557, - "contract": "contracts/optimistic-ethereum/OVM/bridge/tokens/OVM_L1ETHGateway.sol:OVM_L1ETHGateway", - "label": "libAddressManager", - "offset": 0, - "slot": "1", - "type": "t_contract(Lib_AddressManager)12550" - }, - { - "astId": 1967, - "contract": "contracts/optimistic-ethereum/OVM/bridge/tokens/OVM_L1ETHGateway.sol:OVM_L1ETHGateway", - "label": "ovmEth", - "offset": 0, - "slot": "2", - "type": "t_address" - } - ], - "types": { - "t_address": { - "encoding": "inplace", - "label": "address", - "numberOfBytes": "20" - }, - "t_contract(Lib_AddressManager)12550": { - "encoding": "inplace", - "label": "contract Lib_AddressManager", - "numberOfBytes": "20" - } - } - } -} \ No newline at end of file diff --git a/packages/contracts/deployments/goerli-v2/OVM_L1MultiMessageRelayer.json b/packages/contracts/deployments/goerli-v2/OVM_L1MultiMessageRelayer.json deleted file mode 100644 index a891e7021aa11..0000000000000 --- a/packages/contracts/deployments/goerli-v2/OVM_L1MultiMessageRelayer.json +++ /dev/null @@ -1,229 +0,0 @@ -{ - "address": "0x120b44cC54e9b7E79b3583BE6B797D36DF9fD90a", - "abi": [ - { - "inputs": [ - { - "internalType": "address", - "name": "_libAddressManager", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "inputs": [ - { - "components": [ - { - "internalType": "address", - "name": "target", - "type": "address" - }, - { - "internalType": "address", - "name": "sender", - "type": "address" - }, - { - "internalType": "bytes", - "name": "message", - "type": "bytes" - }, - { - "internalType": "uint256", - "name": "messageNonce", - "type": "uint256" - }, - { - "components": [ - { - "internalType": "bytes32", - "name": "stateRoot", - "type": "bytes32" - }, - { - "components": [ - { - "internalType": "uint256", - "name": "batchIndex", - "type": "uint256" - }, - { - "internalType": "bytes32", - "name": "batchRoot", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "batchSize", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "prevTotalElements", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "extraData", - "type": "bytes" - } - ], - "internalType": "struct Lib_OVMCodec.ChainBatchHeader", - "name": "stateRootBatchHeader", - "type": "tuple" - }, - { - "components": [ - { - "internalType": "uint256", - "name": "index", - "type": "uint256" - }, - { - "internalType": "bytes32[]", - "name": "siblings", - "type": "bytes32[]" - } - ], - "internalType": "struct Lib_OVMCodec.ChainInclusionProof", - "name": "stateRootProof", - "type": "tuple" - }, - { - "internalType": "bytes", - "name": "stateTrieWitness", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "storageTrieWitness", - "type": "bytes" - } - ], - "internalType": "struct iOVM_L1CrossDomainMessenger.L2MessageInclusionProof", - "name": "proof", - "type": "tuple" - } - ], - "internalType": "struct iOVM_L1MultiMessageRelayer.L2ToL1Message[]", - "name": "_messages", - "type": "tuple[]" - } - ], - "name": "batchRelayMessages", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "libAddressManager", - "outputs": [ - { - "internalType": "contract Lib_AddressManager", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "string", - "name": "_name", - "type": "string" - } - ], - "name": "resolve", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - } - ], - "transactionHash": "0xb8d3082d8da8a9de36f96ccfca98d56c7db1ef35b712cfeae497c05b770d8d37", - "receipt": { - "to": null, - "from": "0x558ba9b8d78713fbf768c1f8a584485B4003f43F", - "contractAddress": "0x120b44cC54e9b7E79b3583BE6B797D36DF9fD90a", - "transactionIndex": 25, - "gasUsed": "606489", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0x255c60cfa34318fd2dac09408044bd5c5b5897e2a90e54f6f0928ae4eee6ea11", - "transactionHash": "0xb8d3082d8da8a9de36f96ccfca98d56c7db1ef35b712cfeae497c05b770d8d37", - "logs": [], - "blockNumber": 4607726, - "cumulativeGasUsed": "2069125", - "status": 1, - "byzantium": true - }, - "args": [ - "0x9933d137bBF050Cf3D7555fE1beC91eF698814e5" - ], - "solcInputHash": "8aef3555d89ad9d3af2f5d28a85dc856", - "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"messageNonce\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"stateRootBatchHeader\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"siblings\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct Lib_OVMCodec.ChainInclusionProof\",\"name\":\"stateRootProof\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"stateTrieWitness\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"storageTrieWitness\",\"type\":\"bytes\"}],\"internalType\":\"struct iOVM_L1CrossDomainMessenger.L2MessageInclusionProof\",\"name\":\"proof\",\"type\":\"tuple\"}],\"internalType\":\"struct iOVM_L1MultiMessageRelayer.L2ToL1Message[]\",\"name\":\"_messages\",\"type\":\"tuple[]\"}],\"name\":\"batchRelayMessages\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The L1 Multi-Message Relayer contract is a gas efficiency optimization which enables the relayer to submit multiple messages in a single transaction to be relayed by the L1 Cross Domain Message Sender. Compiler used: solc Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"batchRelayMessages((address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))[])\":{\"params\":{\"_messages\":\"An array of L2 to L1 messages\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}}},\"title\":\"OVM_L1MultiMessageRelayer\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"batchRelayMessages((address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))[])\":{\"notice\":\"Forwards multiple cross domain messages to the L1 Cross Domain Messenger for relaying\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1MultiMessageRelayer.sol\":\"OVM_L1MultiMessageRelayer\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1MultiMessageRelayer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// @unsupported: ovm\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n/* Interface Imports */\\nimport { iOVM_L1CrossDomainMessenger } from \\\"../../../iOVM/bridge/messaging/iOVM_L1CrossDomainMessenger.sol\\\";\\nimport { iOVM_L1MultiMessageRelayer } from \\\"../../../iOVM/bridge/messaging/iOVM_L1MultiMessageRelayer.sol\\\";\\n\\n/* Contract Imports */\\nimport { Lib_AddressResolver } from \\\"../../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n\\n/**\\n * @title OVM_L1MultiMessageRelayer\\n * @dev The L1 Multi-Message Relayer contract is a gas efficiency optimization which enables the \\n * relayer to submit multiple messages in a single transaction to be relayed by the L1 Cross Domain\\n * Message Sender.\\n *\\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract OVM_L1MultiMessageRelayer is iOVM_L1MultiMessageRelayer, Lib_AddressResolver {\\n\\n /***************\\n * Constructor *\\n ***************/\\n constructor(\\n address _libAddressManager\\n ) \\n Lib_AddressResolver(_libAddressManager)\\n {}\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyBatchRelayer() {\\n require(\\n msg.sender == resolve(\\\"OVM_L2BatchMessageRelayer\\\"),\\n \\\"OVM_L1MultiMessageRelayer: Function can only be called by the OVM_L2BatchMessageRelayer\\\"\\n );\\n _;\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * @notice Forwards multiple cross domain messages to the L1 Cross Domain Messenger for relaying\\n * @param _messages An array of L2 to L1 messages\\n */\\n function batchRelayMessages(L2ToL1Message[] calldata _messages) \\n override\\n external\\n onlyBatchRelayer \\n {\\n iOVM_L1CrossDomainMessenger messenger = iOVM_L1CrossDomainMessenger(resolve(\\\"Proxy__OVM_L1CrossDomainMessenger\\\"));\\n for (uint256 i = 0; i < _messages.length; i++) {\\n L2ToL1Message memory message = _messages[i];\\n messenger.relayMessage(\\n message.target,\\n message.sender,\\n message.message,\\n message.messageNonce,\\n message.proof\\n );\\n }\\n }\\n}\\n\",\"keccak256\":\"0xbccd671aae35ef04fa45b3019f0a9d8d3e1d7b60a6261d979579f93f9c508725\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/bridge/messaging/iAbs_BaseCrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/**\\n * @title iAbs_BaseCrossDomainMessenger\\n */\\ninterface iAbs_BaseCrossDomainMessenger {\\n\\n /**********\\n * Events *\\n **********/\\n event SentMessage(bytes message);\\n event RelayedMessage(bytes32 msgHash);\\n\\n /**********************\\n * Contract Variables *\\n **********************/\\n function xDomainMessageSender() external view returns (address);\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sends a cross domain message to the target messenger.\\n * @param _target Target contract address.\\n * @param _message Message to send to the target.\\n * @param _gasLimit Gas limit for the provided message.\\n */\\n function sendMessage(\\n address _target,\\n bytes calldata _message,\\n uint32 _gasLimit\\n ) external;\\n}\\n\",\"keccak256\":\"0xc2bd6b373daae2ede34281f4be5938d02b9d1cfb056b40d65ff70b7f16ce3c86\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/bridge/messaging/iOVM_L1CrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { iAbs_BaseCrossDomainMessenger } from \\\"./iAbs_BaseCrossDomainMessenger.sol\\\";\\n\\n/**\\n * @title iOVM_L1CrossDomainMessenger\\n */\\ninterface iOVM_L1CrossDomainMessenger is iAbs_BaseCrossDomainMessenger {\\n\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n struct L2MessageInclusionProof {\\n bytes32 stateRoot;\\n Lib_OVMCodec.ChainBatchHeader stateRootBatchHeader;\\n Lib_OVMCodec.ChainInclusionProof stateRootProof;\\n bytes stateTrieWitness;\\n bytes storageTrieWitness;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Relays a cross domain message to a contract.\\n * @param _target Target contract address.\\n * @param _sender Message sender address.\\n * @param _message Message to send to the target.\\n * @param _messageNonce Nonce for the provided message.\\n * @param _proof Inclusion proof for the given message.\\n */\\n function relayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _messageNonce,\\n L2MessageInclusionProof memory _proof\\n ) external;\\n\\n /**\\n * Replays a cross domain message to the target messenger.\\n * @param _target Target contract address.\\n * @param _sender Original sender address.\\n * @param _message Message to send to the target.\\n * @param _messageNonce Nonce for the provided message.\\n * @param _gasLimit Gas limit for the provided message.\\n */\\n function replayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _messageNonce,\\n uint32 _gasLimit\\n ) external;\\n}\\n\",\"keccak256\":\"0xdcd239d0b215e400674d78e8db4ac12ba18efc34fa78e24c2ff867f61062dba2\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/bridge/messaging/iOVM_L1MultiMessageRelayer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Interface Imports */\\nimport { iOVM_L1CrossDomainMessenger } from \\\"../../../iOVM/bridge/messaging/iOVM_L1CrossDomainMessenger.sol\\\";\\ninterface iOVM_L1MultiMessageRelayer {\\n\\n struct L2ToL1Message {\\n address target;\\n address sender;\\n bytes message;\\n uint256 messageNonce;\\n iOVM_L1CrossDomainMessenger.L2MessageInclusionProof proof;\\n }\\n\\n function batchRelayMessages(L2ToL1Message[] calldata _messages) external; \\n}\\n\",\"keccak256\":\"0xed86c23182a66b1a6c90c3f484b5d7264069e1a3849eb2fdd3608f9686282687\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/codec/Lib_OVMCodec.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../utils/Lib_Bytes32Utils.sol\\\";\\nimport { Lib_SafeExecutionManagerWrapper } from \\\"../../libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\\\";\\n\\n/**\\n * @title Lib_OVMCodec\\n */\\nlibrary Lib_OVMCodec {\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum EOASignatureType {\\n EIP155_TRANSACTION,\\n ETH_SIGNED_MESSAGE\\n }\\n\\n enum QueueOrigin {\\n SEQUENCER_QUEUE,\\n L1TOL2_QUEUE\\n }\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Account {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n address ethAddress;\\n bool isFresh;\\n }\\n\\n struct EVMAccount {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n }\\n\\n struct ChainBatchHeader {\\n uint256 batchIndex;\\n bytes32 batchRoot;\\n uint256 batchSize;\\n uint256 prevTotalElements;\\n bytes extraData;\\n }\\n\\n struct ChainInclusionProof {\\n uint256 index;\\n bytes32[] siblings;\\n }\\n\\n struct Transaction {\\n uint256 timestamp;\\n uint256 blockNumber;\\n QueueOrigin l1QueueOrigin;\\n address l1TxOrigin;\\n address entrypoint;\\n uint256 gasLimit;\\n bytes data;\\n }\\n\\n struct TransactionChainElement {\\n bool isSequenced;\\n uint256 queueIndex; // QUEUED TX ONLY\\n uint256 timestamp; // SEQUENCER TX ONLY\\n uint256 blockNumber; // SEQUENCER TX ONLY\\n bytes txData; // SEQUENCER TX ONLY\\n }\\n\\n struct QueueElement {\\n bytes32 transactionHash;\\n uint40 timestamp;\\n uint40 blockNumber;\\n }\\n\\n struct EIP155Transaction {\\n uint256 nonce;\\n uint256 gasPrice;\\n uint256 gasLimit;\\n address to;\\n uint256 value;\\n bytes data;\\n uint256 chainId;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Decodes an EOA transaction (i.e., native Ethereum RLP encoding).\\n * @param _transaction Encoded EOA transaction.\\n * @return Transaction decoded into a struct.\\n */\\n function decodeEIP155Transaction(\\n bytes memory _transaction,\\n bool _isEthSignedMessage\\n )\\n internal\\n pure\\n returns (\\n EIP155Transaction memory\\n )\\n {\\n if (_isEthSignedMessage) {\\n (\\n uint256 _nonce,\\n uint256 _gasLimit,\\n uint256 _gasPrice,\\n uint256 _chainId,\\n address _to,\\n bytes memory _data\\n ) = abi.decode(\\n _transaction,\\n (uint256, uint256, uint256, uint256, address ,bytes)\\n );\\n return EIP155Transaction({\\n nonce: _nonce,\\n gasPrice: _gasPrice,\\n gasLimit: _gasLimit,\\n to: _to,\\n value: 0,\\n data: _data,\\n chainId: _chainId\\n });\\n } else {\\n Lib_RLPReader.RLPItem[] memory decoded = Lib_RLPReader.readList(_transaction);\\n\\n return EIP155Transaction({\\n nonce: Lib_RLPReader.readUint256(decoded[0]),\\n gasPrice: Lib_RLPReader.readUint256(decoded[1]),\\n gasLimit: Lib_RLPReader.readUint256(decoded[2]),\\n to: Lib_RLPReader.readAddress(decoded[3]),\\n value: Lib_RLPReader.readUint256(decoded[4]),\\n data: Lib_RLPReader.readBytes(decoded[5]),\\n chainId: Lib_RLPReader.readUint256(decoded[6])\\n });\\n }\\n }\\n\\n /**\\n * Decompresses a compressed EIP155 transaction.\\n * @param _transaction Compressed EIP155 transaction bytes.\\n * @return Transaction parsed into a struct.\\n */\\n function decompressEIP155Transaction(\\n bytes memory _transaction\\n )\\n internal\\n returns (\\n EIP155Transaction memory\\n )\\n {\\n return EIP155Transaction({\\n gasLimit: Lib_BytesUtils.toUint24(_transaction, 0),\\n gasPrice: uint256(Lib_BytesUtils.toUint24(_transaction, 3)) * 1000000,\\n nonce: Lib_BytesUtils.toUint24(_transaction, 6),\\n to: Lib_BytesUtils.toAddress(_transaction, 9),\\n data: Lib_BytesUtils.slice(_transaction, 29),\\n chainId: Lib_SafeExecutionManagerWrapper.safeCHAINID(),\\n value: 0\\n });\\n }\\n\\n /**\\n * Encodes an EOA transaction back into the original transaction.\\n * @param _transaction EIP155transaction to encode.\\n * @param _isEthSignedMessage Whether or not this was an eth signed message.\\n * @return Encoded transaction.\\n */\\n function encodeEIP155Transaction(\\n EIP155Transaction memory _transaction,\\n bool _isEthSignedMessage\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n if (_isEthSignedMessage) {\\n return abi.encode(\\n _transaction.nonce,\\n _transaction.gasLimit,\\n _transaction.gasPrice,\\n _transaction.chainId,\\n _transaction.to,\\n _transaction.data\\n );\\n } else {\\n bytes[] memory raw = new bytes[](9);\\n\\n raw[0] = Lib_RLPWriter.writeUint(_transaction.nonce);\\n raw[1] = Lib_RLPWriter.writeUint(_transaction.gasPrice);\\n raw[2] = Lib_RLPWriter.writeUint(_transaction.gasLimit);\\n if (_transaction.to == address(0)) {\\n raw[3] = Lib_RLPWriter.writeBytes('');\\n } else {\\n raw[3] = Lib_RLPWriter.writeAddress(_transaction.to);\\n }\\n raw[4] = Lib_RLPWriter.writeUint(0);\\n raw[5] = Lib_RLPWriter.writeBytes(_transaction.data);\\n raw[6] = Lib_RLPWriter.writeUint(_transaction.chainId);\\n raw[7] = Lib_RLPWriter.writeBytes(bytes(''));\\n raw[8] = Lib_RLPWriter.writeBytes(bytes(''));\\n\\n return Lib_RLPWriter.writeList(raw);\\n }\\n }\\n\\n /**\\n * Encodes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Encoded transaction bytes.\\n */\\n function encodeTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return abi.encodePacked(\\n _transaction.timestamp,\\n _transaction.blockNumber,\\n _transaction.l1QueueOrigin,\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n );\\n }\\n\\n /**\\n * Hashes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Hashed transaction\\n */\\n function hashTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(encodeTransaction(_transaction));\\n }\\n\\n /**\\n * Converts an OVM account to an EVM account.\\n * @param _in OVM account to convert.\\n * @return Converted EVM account.\\n */\\n function toEVMAccount(\\n Account memory _in\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n return EVMAccount({\\n nonce: _in.nonce,\\n balance: _in.balance,\\n storageRoot: _in.storageRoot,\\n codeHash: _in.codeHash\\n });\\n }\\n\\n /**\\n * @notice RLP-encodes an account state struct.\\n * @param _account Account state struct.\\n * @return RLP-encoded account state.\\n */\\n function encodeEVMAccount(\\n EVMAccount memory _account\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes[] memory raw = new bytes[](4);\\n\\n // Unfortunately we can't create this array outright because\\n // Lib_RLPWriter.writeList will reject fixed-size arrays. Assigning\\n // index-by-index circumvents this issue.\\n raw[0] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.nonce)\\n )\\n );\\n raw[1] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.balance)\\n )\\n );\\n raw[2] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.storageRoot));\\n raw[3] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.codeHash));\\n\\n return Lib_RLPWriter.writeList(raw);\\n }\\n\\n /**\\n * @notice Decodes an RLP-encoded account state into a useful struct.\\n * @param _encoded RLP-encoded account state.\\n * @return Account state struct.\\n */\\n function decodeEVMAccount(\\n bytes memory _encoded\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\\n\\n return EVMAccount({\\n nonce: Lib_RLPReader.readUint256(accountState[0]),\\n balance: Lib_RLPReader.readUint256(accountState[1]),\\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\\n });\\n }\\n\\n /**\\n * Calculates a hash for a given batch header.\\n * @param _batchHeader Header to hash.\\n * @return Hash of the header.\\n */\\n function hashBatchHeader(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(\\n abi.encode(\\n _batchHeader.batchRoot,\\n _batchHeader.batchSize,\\n _batchHeader.prevTotalElements,\\n _batchHeader.extraData\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0xe7e518ba7bba3fa28c532f8902576c1bb4dfc1ec4b62bed6da50623248ba17c3\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Contract Imports */\\nimport { Ownable } from \\\"./Lib_Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n public\\n onlyOwner\\n {\\n addresses[_getNameHash(_name)] = _address;\\n\\n emit AddressSet(\\n _name,\\n _address\\n );\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0x36473d229ce0ba9d1cac5f02f84be843d9dcc8008525590a1652a2c2636f95f2\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(\\n address _libAddressManager\\n ) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x65981feeabff6a81783ea97d44baf988a18a86c8cb374c46fdb71819cbacc7c0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Ownable\\n * @dev Adapted from https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol\\n */\\nabstract contract Ownable {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n address public owner;\\n\\n\\n /**********\\n * Events *\\n **********/\\n\\n event OwnershipTransferred(\\n address indexed previousOwner,\\n address indexed newOwner\\n );\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n constructor() {\\n owner = msg.sender;\\n emit OwnershipTransferred(address(0), owner);\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n owner == msg.sender,\\n \\\"Ownable: caller is not the owner\\\"\\n );\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the owner of this contract to the zero address, effectively renouncing ownership\\n * completely. Can only be called by the current owner of this contract.\\n */\\n function renounceOwnership()\\n public\\n virtual\\n onlyOwner\\n {\\n emit OwnershipTransferred(owner, address(0));\\n owner = address(0);\\n }\\n\\n /**\\n * Transfers ownership of this contract to a new address. Can only be called by the current\\n * owner of this contract.\\n * @param _newOwner Address of the new contract owner.\\n */\\n function transferOwnership(\\n address _newOwner\\n )\\n public\\n virtual\\n onlyOwner\\n {\\n require(\\n _newOwner != address(0),\\n \\\"Ownable: new owner cannot be the zero address\\\"\\n );\\n\\n emit OwnershipTransferred(owner, _newOwner);\\n owner = _newOwner;\\n }\\n}\\n\",\"keccak256\":\"0x83f9a6c4608b5929086429205b00f8211cdfcba83f3c84520f24d8aa64fe4b82\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPReader.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_RLPReader\\n * @dev Adapted from \\\"RLPReader\\\" by Hamdi Allam (hamdi.allam97@gmail.com).\\n */\\nlibrary Lib_RLPReader {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 constant internal MAX_LIST_LENGTH = 32;\\n\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum RLPItemType {\\n DATA_ITEM,\\n LIST_ITEM\\n }\\n\\n \\n /***********\\n * Structs *\\n ***********/\\n\\n struct RLPItem {\\n uint256 length;\\n uint256 ptr;\\n }\\n \\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n \\n /**\\n * Converts bytes to a reference to memory position and length.\\n * @param _in Input bytes to convert.\\n * @return Output memory reference.\\n */\\n function toRLPItem(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem memory\\n )\\n {\\n uint256 ptr;\\n assembly {\\n ptr := add(_in, 32)\\n }\\n\\n return RLPItem({\\n length: _in.length,\\n ptr: ptr\\n });\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n (\\n uint256 listOffset,\\n ,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.LIST_ITEM,\\n \\\"Invalid RLP list value.\\\"\\n );\\n\\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\\n // writing to the length. Since we can't know the number of RLP items without looping over\\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\\n // simply set a reasonable maximum list length and decrease the size before we finish.\\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\\n\\n uint256 itemCount = 0;\\n uint256 offset = listOffset;\\n while (offset < _in.length) {\\n require(\\n itemCount < MAX_LIST_LENGTH,\\n \\\"Provided RLP list exceeds max list length.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n ) = _decodeLength(RLPItem({\\n length: _in.length - offset,\\n ptr: _in.ptr + offset\\n }));\\n\\n out[itemCount] = RLPItem({\\n length: itemLength + itemOffset,\\n ptr: _in.ptr + offset\\n });\\n\\n itemCount += 1;\\n offset += itemOffset + itemLength;\\n }\\n\\n // Decrease the array size to match the actual item count.\\n assembly {\\n mstore(out, itemCount)\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n return readList(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes value.\\\"\\n );\\n\\n return _copy(_in.ptr, itemOffset, itemLength);\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return readBytes(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return string(readBytes(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return readString(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n require(\\n _in.length <= 33,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr + itemOffset;\\n bytes32 out;\\n assembly {\\n out := mload(ptr)\\n\\n // Shift the bytes over to match the item size.\\n if lt(itemLength, 32) {\\n out := div(out, exp(256, sub(32, itemLength)))\\n }\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return readBytes32(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return uint256(readBytes32(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return readUint256(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n require(\\n _in.length == 1,\\n \\\"Invalid RLP boolean value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 out;\\n assembly {\\n out := byte(0, mload(ptr))\\n }\\n\\n require(\\n out == 0 || out == 1,\\n \\\"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\\\"\\n );\\n\\n return out != 0;\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return readBool(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n if (_in.length == 1) {\\n return address(0);\\n }\\n\\n require(\\n _in.length == 21,\\n \\\"Invalid RLP address value.\\\"\\n );\\n\\n return address(readUint256(_in));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return readAddress(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads the raw bytes of an RLP item.\\n * @param _in RLP item to read.\\n * @return Raw RLP bytes.\\n */\\n function readRawBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in);\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Decodes the length of an RLP item.\\n * @param _in RLP item to decode.\\n * @return Offset of the encoded data.\\n * @return Length of the encoded data.\\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\\n */\\n function _decodeLength(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n uint256,\\n uint256,\\n RLPItemType\\n )\\n {\\n require(\\n _in.length > 0,\\n \\\"RLP item cannot be null.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 prefix;\\n assembly {\\n prefix := byte(0, mload(ptr))\\n }\\n\\n if (prefix <= 0x7f) {\\n // Single byte.\\n\\n return (0, 1, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xb7) {\\n // Short string.\\n\\n uint256 strLen = prefix - 0x80;\\n \\n require(\\n _in.length > strLen,\\n \\\"Invalid RLP short string.\\\"\\n );\\n\\n return (1, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xbf) {\\n // Long string.\\n uint256 lenOfStrLen = prefix - 0xb7;\\n\\n require(\\n _in.length > lenOfStrLen,\\n \\\"Invalid RLP long string length.\\\"\\n );\\n\\n uint256 strLen;\\n assembly {\\n // Pick out the string length.\\n strLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfStrLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfStrLen + strLen,\\n \\\"Invalid RLP long string.\\\"\\n );\\n\\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xf7) {\\n // Short list.\\n uint256 listLen = prefix - 0xc0;\\n\\n require(\\n _in.length > listLen,\\n \\\"Invalid RLP short list.\\\"\\n );\\n\\n return (1, listLen, RLPItemType.LIST_ITEM);\\n } else {\\n // Long list.\\n uint256 lenOfListLen = prefix - 0xf7;\\n\\n require(\\n _in.length > lenOfListLen,\\n \\\"Invalid RLP long list length.\\\"\\n );\\n\\n uint256 listLen;\\n assembly {\\n // Pick out the list length.\\n listLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfListLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfListLen + listLen,\\n \\\"Invalid RLP long list.\\\"\\n );\\n\\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\\n }\\n }\\n\\n /**\\n * Copies the bytes from a memory location.\\n * @param _src Pointer to the location to read from.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Copied bytes.\\n */\\n function _copy(\\n uint256 _src,\\n uint256 _offset,\\n uint256 _length\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out = new bytes(_length);\\n if (out.length == 0) {\\n return out;\\n }\\n\\n uint256 src = _src + _offset;\\n uint256 dest;\\n assembly {\\n dest := add(out, 32)\\n }\\n\\n // Copy over as many complete words as we can.\\n for (uint256 i = 0; i < _length / 32; i++) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n\\n src += 32;\\n dest += 32;\\n }\\n\\n // Pick out the remaining bytes.\\n uint256 mask = 256 ** (32 - (_length % 32)) - 1;\\n assembly {\\n mstore(\\n dest,\\n or(\\n and(mload(src), not(mask)),\\n and(mload(dest), mask)\\n )\\n )\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Copies an RLP item into bytes.\\n * @param _in RLP item to copy.\\n * @return Copied bytes.\\n */\\n function _copy(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in.ptr, 0, _in.length);\\n }\\n}\\n\",\"keccak256\":\"0xbdb8fae0ca2483b4cc07607a5070fc25e33c54b4e4462b99e7c0b13aac48a09b\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPWriter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\n\\n/**\\n * @title Lib_RLPWriter\\n * @author Bakaoh (with modifications)\\n */\\nlibrary Lib_RLPWriter {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * RLP encodes a byte string.\\n * @param _in The byte string to encode.\\n * @return _out The RLP encoded string in bytes.\\n */\\n function writeBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n bytes memory encoded;\\n\\n if (_in.length == 1 && uint8(_in[0]) < 128) {\\n encoded = _in;\\n } else {\\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * RLP encodes a list of RLP encoded byte byte strings.\\n * @param _in The list of RLP encoded byte strings.\\n * @return _out The RLP encoded list of items in bytes.\\n */\\n function writeList(\\n bytes[] memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n bytes memory list = _flatten(_in);\\n return abi.encodePacked(_writeLength(list.length, 192), list);\\n }\\n\\n /**\\n * RLP encodes a string.\\n * @param _in The string to encode.\\n * @return _out The RLP encoded string in bytes.\\n */\\n function writeString(\\n string memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(bytes(_in));\\n }\\n\\n /**\\n * RLP encodes an address.\\n * @param _in The address to encode.\\n * @return _out The RLP encoded address in bytes.\\n */\\n function writeAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a uint.\\n * @param _in The uint256 to encode.\\n * @return _out The RLP encoded uint256 in bytes.\\n */\\n function writeUint(\\n uint256 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(_toBinary(_in));\\n }\\n\\n /**\\n * RLP encodes a bool.\\n * @param _in The bool to encode.\\n * @return _out The RLP encoded bool in bytes.\\n */\\n function writeBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n bytes memory encoded = new bytes(1);\\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\\n return encoded;\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\\n * @param _len The length of the string or the payload.\\n * @param _offset 128 if item is string, 192 if item is list.\\n * @return _encoded RLP encoded bytes.\\n */\\n function _writeLength(\\n uint256 _len,\\n uint256 _offset\\n )\\n private\\n pure\\n returns (\\n bytes memory _encoded\\n )\\n {\\n bytes memory encoded;\\n\\n if (_len < 56) {\\n encoded = new bytes(1);\\n encoded[0] = byte(uint8(_len) + uint8(_offset));\\n } else {\\n uint256 lenLen;\\n uint256 i = 1;\\n while (_len / i != 0) {\\n lenLen++;\\n i *= 256;\\n }\\n\\n encoded = new bytes(lenLen + 1);\\n encoded[0] = byte(uint8(lenLen) + uint8(_offset) + 55);\\n for(i = 1; i <= lenLen; i++) {\\n encoded[i] = byte(uint8((_len / (256**(lenLen-i))) % 256));\\n }\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * Encode integer in big endian binary form with no leading zeroes.\\n * @notice TODO: This should be optimized with assembly to save gas costs.\\n * @param _x The integer to encode.\\n * @return _binary RLP encoded bytes.\\n */\\n function _toBinary(\\n uint256 _x\\n )\\n private\\n pure\\n returns (\\n bytes memory _binary\\n )\\n {\\n bytes memory b = abi.encodePacked(_x);\\n\\n uint256 i = 0;\\n for (; i < 32; i++) {\\n if (b[i] != 0) {\\n break;\\n }\\n }\\n\\n bytes memory res = new bytes(32 - i);\\n for (uint256 j = 0; j < res.length; j++) {\\n res[j] = b[i++];\\n }\\n\\n return res;\\n }\\n\\n /**\\n * Copies a piece of memory to another location.\\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\\n * @param _dest Destination location.\\n * @param _src Source location.\\n * @param _len Length of memory to copy.\\n */\\n function _memcpy(\\n uint256 _dest,\\n uint256 _src,\\n uint256 _len\\n )\\n private\\n pure\\n {\\n uint256 dest = _dest;\\n uint256 src = _src;\\n uint256 len = _len;\\n\\n for(; len >= 32; len -= 32) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n dest += 32;\\n src += 32;\\n }\\n\\n uint256 mask = 256 ** (32 - len) - 1;\\n assembly {\\n let srcpart := and(mload(src), not(mask))\\n let destpart := and(mload(dest), mask)\\n mstore(dest, or(destpart, srcpart))\\n }\\n }\\n\\n /**\\n * Flattens a list of byte strings into one byte string.\\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\\n * @param _list List of byte strings to flatten.\\n * @return _flattened The flattened byte string.\\n */\\n function _flatten(\\n bytes[] memory _list\\n )\\n private\\n pure\\n returns (\\n bytes memory _flattened\\n )\\n {\\n if (_list.length == 0) {\\n return new bytes(0);\\n }\\n\\n uint256 len;\\n uint256 i = 0;\\n for (; i < _list.length; i++) {\\n len += _list[i].length;\\n }\\n\\n bytes memory flattened = new bytes(len);\\n uint256 flattenedPtr;\\n assembly { flattenedPtr := add(flattened, 0x20) }\\n\\n for(i = 0; i < _list.length; i++) {\\n bytes memory item = _list[i];\\n\\n uint256 listPtr;\\n assembly { listPtr := add(item, 0x20)}\\n\\n _memcpy(flattenedPtr, listPtr, item.length);\\n flattenedPtr += _list[i].length;\\n }\\n\\n return flattened;\\n }\\n}\",\"keccak256\":\"0xbcb24619c1758cb0d9f3fe5c79495950045a9087046a02b9ce01df46ae09ae5b\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_Bytes32Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_Byte32Utils\\n */\\nlibrary Lib_Bytes32Utils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \\\"true.\\\"\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as a boolean.\\n */\\n function toBool(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return _in != 0;\\n }\\n\\n /**\\n * Converts a boolean to a bytes32 value.\\n * @param _in Input boolean value.\\n * @return Boolean as a bytes32.\\n */\\n function fromBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in ? 1 : 0));\\n }\\n\\n /**\\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as an address.\\n */\\n function toAddress(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return address(uint160(uint256(_in)));\\n }\\n\\n /**\\n * Converts an address to a bytes32.\\n * @param _in Input address value.\\n * @return Address as a bytes32.\\n */\\n function fromAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in));\\n }\\n\\n /**\\n * Removes the leading zeros from a bytes32 value and returns a new (smaller) bytes value.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 without any leading zeros.\\n */\\n function removeLeadingZeros(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out;\\n\\n assembly {\\n // Figure out how many leading zero bytes to remove.\\n let shift := 0\\n for { let i := 0 } and(lt(i, 32), eq(byte(i, _in), 0)) { i := add(i, 1) } {\\n shift := add(shift, 1)\\n }\\n\\n // Reserve some space for our output and fix the free memory pointer.\\n out := mload(0x40)\\n mstore(0x40, add(out, 0x40))\\n\\n // Shift the value and store it into the output bytes.\\n mstore(add(out, 0x20), shl(mul(shift, 8), _in))\\n\\n // Store the new size (with leading zero bytes removed) in the output byte size.\\n mstore(out, sub(32, shift))\\n }\\n\\n return out;\\n }\\n}\\n\",\"keccak256\":\"0xfa2def593e3fc56a31852c3744aefdaa93cec74e721bfcfeb1e5d166c7c60b64\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_BytesUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_BytesUtils\\n */\\nlibrary Lib_BytesUtils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_start + _length >= _start, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n if (_bytes.length - _start == 0) {\\n return bytes('');\\n }\\n\\n return slice(_bytes, _start, _bytes.length - _start);\\n }\\n\\n function toBytes32PadLeft(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes32)\\n {\\n bytes32 ret;\\n uint256 len = _bytes.length <= 32 ? _bytes.length : 32;\\n assembly {\\n ret := shr(mul(sub(32, len), 8), mload(add(_bytes, 32)))\\n }\\n return ret;\\n }\\n\\n function toBytes32(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes32)\\n {\\n if (_bytes.length < 32) {\\n bytes32 ret;\\n assembly {\\n ret := mload(add(_bytes, 32))\\n }\\n return ret;\\n }\\n\\n return abi.decode(_bytes,(bytes32)); // will truncate if input length > 32 bytes\\n }\\n\\n function toUint256(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (uint256)\\n {\\n return uint256(toBytes32(_bytes));\\n }\\n\\n function toUint24(bytes memory _bytes, uint256 _start) internal pure returns (uint24) {\\n require(_start + 3 >= _start, \\\"toUint24_overflow\\\");\\n require(_bytes.length >= _start + 3 , \\\"toUint24_outOfBounds\\\");\\n uint24 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x3), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toUint8(bytes memory _bytes, uint256 _start) internal pure returns (uint8) {\\n require(_start + 1 >= _start, \\\"toUint8_overflow\\\");\\n require(_bytes.length >= _start + 1 , \\\"toUint8_outOfBounds\\\");\\n uint8 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x1), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toAddress(bytes memory _bytes, uint256 _start) internal pure returns (address) {\\n require(_start + 20 >= _start, \\\"toAddress_overflow\\\");\\n require(_bytes.length >= _start + 20, \\\"toAddress_outOfBounds\\\");\\n address tempAddress;\\n\\n assembly {\\n tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000)\\n }\\n\\n return tempAddress;\\n }\\n\\n function toNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n bytes memory nibbles = new bytes(_bytes.length * 2);\\n\\n for (uint256 i = 0; i < _bytes.length; i++) {\\n nibbles[i * 2] = _bytes[i] >> 4;\\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\\n }\\n\\n return nibbles;\\n }\\n\\n function fromNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n bytes memory ret = new bytes(_bytes.length / 2);\\n\\n for (uint256 i = 0; i < ret.length; i++) {\\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\\n }\\n\\n return ret;\\n }\\n\\n function equal(\\n bytes memory _bytes,\\n bytes memory _other\\n )\\n internal\\n pure\\n returns (bool)\\n {\\n return keccak256(_bytes) == keccak256(_other);\\n }\\n}\\n\",\"keccak256\":\"0x0adf22e1b22ba09911e859f64cb3b484e992be4f9fd3b09088e6225bf8d06ce0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_ErrorUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/**\\n * @title Lib_ErrorUtils\\n */\\nlibrary Lib_ErrorUtils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Encodes an error string into raw solidity-style revert data.\\n * (i.e. ascii bytes, prefixed with bytes4(keccak(\\\"Error(string))\\\"))\\n * Ref: https://docs.soliditylang.org/en/v0.8.2/control-structures.html?highlight=Error(string)#panic-via-assert-and-error-via-require\\n * @param _reason Reason for the reversion.\\n * @return Standard solidity revert data for the given reason.\\n */\\n function encodeRevertString(\\n string memory _reason\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return abi.encodeWithSignature(\\n \\\"Error(string)\\\",\\n _reason\\n );\\n }\\n}\\n\",\"keccak256\":\"0xfc64ec4a81fb50865b502a0004ed154e8598e1a313db77303fc95e41f536e6b7\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_ErrorUtils } from \\\"../utils/Lib_ErrorUtils.sol\\\";\\n\\n/**\\n * @title Lib_SafeExecutionManagerWrapper\\n * @dev The Safe Execution Manager Wrapper provides functions which facilitate writing OVM safe \\n * code using the standard solidity compiler, by routing all its operations through the Execution \\n * Manager.\\n * \\n * Compiler used: solc\\n * Runtime target: OVM\\n */\\nlibrary Lib_SafeExecutionManagerWrapper {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Performs a safe ovmCALL.\\n * @param _gasLimit Gas limit for the call.\\n * @param _target Address to call.\\n * @param _calldata Data to send to the call.\\n * @return _success Whether or not the call reverted.\\n * @return _returndata Data returned by the call.\\n */\\n function safeCALL(\\n uint256 _gasLimit,\\n address _target,\\n bytes memory _calldata\\n )\\n internal\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCALL(uint256,address,bytes)\\\",\\n _gasLimit,\\n _target,\\n _calldata\\n )\\n );\\n\\n return abi.decode(returndata, (bool, bytes));\\n }\\n\\n /**\\n * Performs a safe ovmDELEGATECALL.\\n * @param _gasLimit Gas limit for the call.\\n * @param _target Address to call.\\n * @param _calldata Data to send to the call.\\n * @return _success Whether or not the call reverted.\\n * @return _returndata Data returned by the call.\\n */\\n function safeDELEGATECALL(\\n uint256 _gasLimit,\\n address _target,\\n bytes memory _calldata\\n )\\n internal\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmDELEGATECALL(uint256,address,bytes)\\\",\\n _gasLimit,\\n _target,\\n _calldata\\n )\\n );\\n\\n return abi.decode(returndata, (bool, bytes));\\n }\\n\\n /**\\n * Performs a safe ovmCREATE call.\\n * @param _gasLimit Gas limit for the creation.\\n * @param _bytecode Code for the new contract.\\n * @return _contract Address of the created contract.\\n */\\n function safeCREATE(\\n uint256 _gasLimit,\\n bytes memory _bytecode\\n )\\n internal\\n returns (\\n address,\\n bytes memory\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n _gasLimit,\\n abi.encodeWithSignature(\\n \\\"ovmCREATE(bytes)\\\",\\n _bytecode\\n )\\n );\\n\\n return abi.decode(returndata, (address, bytes));\\n }\\n\\n /**\\n * Performs a safe ovmEXTCODESIZE call.\\n * @param _contract Address of the contract to query the size of.\\n * @return _EXTCODESIZE Size of the requested contract in bytes.\\n */\\n function safeEXTCODESIZE(\\n address _contract\\n )\\n internal\\n returns (\\n uint256 _EXTCODESIZE\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmEXTCODESIZE(address)\\\",\\n _contract\\n )\\n );\\n\\n return abi.decode(returndata, (uint256));\\n }\\n\\n /**\\n * Performs a safe ovmCHAINID call.\\n * @return _CHAINID Result of calling ovmCHAINID.\\n */\\n function safeCHAINID()\\n internal\\n returns (\\n uint256 _CHAINID\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCHAINID()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (uint256));\\n }\\n\\n /**\\n * Performs a safe ovmCALLER call.\\n * @return _CALLER Result of calling ovmCALLER.\\n */\\n function safeCALLER()\\n internal\\n returns (\\n address _CALLER\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCALLER()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (address));\\n }\\n\\n /**\\n * Performs a safe ovmADDRESS call.\\n * @return _ADDRESS Result of calling ovmADDRESS.\\n */\\n function safeADDRESS()\\n internal\\n returns (\\n address _ADDRESS\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmADDRESS()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (address));\\n }\\n\\n /**\\n * Performs a safe ovmGETNONCE call.\\n * @return _nonce Result of calling ovmGETNONCE.\\n */\\n function safeGETNONCE()\\n internal\\n returns (\\n uint256 _nonce\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmGETNONCE()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (uint256));\\n }\\n\\n /**\\n * Performs a safe ovmINCREMENTNONCE call.\\n */\\n function safeINCREMENTNONCE()\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmINCREMENTNONCE()\\\"\\n )\\n );\\n }\\n\\n /**\\n * Performs a safe ovmCREATEEOA call.\\n * @param _messageHash Message hash which was signed by EOA\\n * @param _v v value of signature (0 or 1)\\n * @param _r r value of signature\\n * @param _s s value of signature\\n */\\n function safeCREATEEOA(\\n bytes32 _messageHash,\\n uint8 _v,\\n bytes32 _r,\\n bytes32 _s\\n )\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCREATEEOA(bytes32,uint8,bytes32,bytes32)\\\",\\n _messageHash,\\n _v,\\n _r,\\n _s\\n )\\n );\\n }\\n\\n /**\\n * Performs a safe REVERT.\\n * @param _reason String revert reason to pass along with the REVERT.\\n */\\n function safeREVERT(\\n string memory _reason\\n )\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmREVERT(bytes)\\\",\\n Lib_ErrorUtils.encodeRevertString(\\n _reason\\n )\\n )\\n );\\n }\\n\\n /**\\n * Performs a safe \\\"require\\\".\\n * @param _condition Boolean condition that must be true or will revert.\\n * @param _reason String revert reason to pass along with the REVERT.\\n */\\n function safeREQUIRE(\\n bool _condition,\\n string memory _reason\\n )\\n internal\\n {\\n if (!_condition) {\\n safeREVERT(\\n _reason\\n );\\n }\\n }\\n\\n /**\\n * Performs a safe ovmSLOAD call.\\n */\\n function safeSLOAD(\\n bytes32 _key\\n )\\n internal\\n returns (\\n bytes32\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmSLOAD(bytes32)\\\",\\n _key\\n )\\n );\\n\\n return abi.decode(returndata, (bytes32));\\n }\\n\\n /**\\n * Performs a safe ovmSSTORE call.\\n */\\n function safeSSTORE(\\n bytes32 _key,\\n bytes32 _value\\n )\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmSSTORE(bytes32,bytes32)\\\",\\n _key,\\n _value\\n )\\n );\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Performs an ovm interaction and the necessary safety checks.\\n * @param _gasLimit Gas limit for the interaction.\\n * @param _calldata Data to send to the OVM_ExecutionManager (encoded with sighash).\\n * @return _returndata Data sent back by the OVM_ExecutionManager.\\n */\\n function _safeExecutionManagerInteraction(\\n uint256 _gasLimit,\\n bytes memory _calldata\\n )\\n private\\n returns (\\n bytes memory _returndata\\n )\\n {\\n address ovmExecutionManager = msg.sender;\\n (\\n bool success,\\n bytes memory returndata\\n ) = ovmExecutionManager.call{gas: _gasLimit}(_calldata);\\n\\n if (success == false) {\\n assembly {\\n revert(add(returndata, 0x20), mload(returndata))\\n }\\n } else if (returndata.length == 1) {\\n assembly {\\n return(0, 1)\\n }\\n } else {\\n return returndata;\\n }\\n }\\n\\n function _safeExecutionManagerInteraction(\\n bytes memory _calldata\\n )\\n private\\n returns (\\n bytes memory _returndata\\n )\\n {\\n return _safeExecutionManagerInteraction(\\n gasleft(),\\n _calldata\\n );\\n }\\n}\\n\",\"keccak256\":\"0x41e146e7912af794a17cd43c5a276674be956bfa8f3ca5b451bcb82d81e6f492\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x608060405234801561001057600080fd5b50604051610a22380380610a2283398101604081905261002f91610054565b600080546001600160a01b0319166001600160a01b0392909216919091179055610082565b600060208284031215610065578081fd5b81516001600160a01b038116811461007b578182fd5b9392505050565b610991806100916000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c806316e9cd9b14610046578063299ca4781461005b578063461a447814610079575b600080fd5b61005961005436600461057d565b61008c565b005b6100636101ea565b60405161007091906106db565b60405180910390f35b6100636100873660046105ec565b6101f9565b6100ca6040518060400160405280601981526020017f4f564d5f4c3242617463684d65737361676552656c61796572000000000000008152506101f9565b6001600160a01b0316336001600160a01b0316146101035760405162461bcd60e51b81526004016100fa906107d7565b60405180910390fd5b600061012660405180606001604052806021815260200161093b602191396101f9565b905060005b828110156101e457600084848381811061014157fe5b9050602002810190610153919061085a565b61015c9061089d565b8051602082015160408084015160608501516080860151925163d7fd19dd60e01b81529596506001600160a01b0389169563d7fd19dd956101a5959094909392916004016106ef565b600060405180830381600087803b1580156101bf57600080fd5b505af11580156101d3573d6000803e3d6000fd5b50506001909301925061012b915050565b50505050565b6000546001600160a01b031681565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b83811015610259578181015183820152602001610241565b50505050905090810190601f1680156102865780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b1580156102a357600080fd5b505afa1580156102b7573d6000803e3d6000fd5b505050506040513d60208110156102cd57600080fd5b505190505b919050565b600067ffffffffffffffff8311156102eb57fe5b6102fe601f8401601f1916602001610879565b905082815283838301111561031257600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b03811681146102d257600080fd5b600082601f830112610350578081fd5b61035f838335602085016102d7565b9392505050565b600060a08284031215610377578081fd5b60405160a0810167ffffffffffffffff828210818311171561039557fe5b816040528293508435835260208501356020840152604085013560408401526060850135606084015260808501359150808211156103d257600080fd5b506103df85828601610340565b6080830152505092915050565b6000604082840312156103fd578081fd5b6040516040810167ffffffffffffffff828210818311171561041b57fe5b816040528293508435835260209150818501358181111561043b57600080fd5b8501601f8101871361044c57600080fd5b80358281111561045857fe5b8381029250610468848401610879565b8181528481019083860185850187018b101561048357600080fd5b600095505b838610156104a6578035835260019590950194918601918601610488565b5080868801525050505050505092915050565b600060a082840312156104ca578081fd5b6104d460a0610879565b905081358152602082013567ffffffffffffffff808211156104f557600080fd5b61050185838601610366565b6020840152604084013591508082111561051a57600080fd5b610526858386016103ec565b6040840152606084013591508082111561053f57600080fd5b61054b85838601610340565b6060840152608084013591508082111561056457600080fd5b5061057184828501610340565b60808301525092915050565b6000806020838503121561058f578182fd5b823567ffffffffffffffff808211156105a6578384fd5b818501915085601f8301126105b9578384fd5b8135818111156105c7578485fd5b86602080830285010111156105da578485fd5b60209290920196919550909350505050565b6000602082840312156105fd578081fd5b813567ffffffffffffffff811115610613578182fd5b8201601f81018413610623578182fd5b610632848235602084016102d7565b949350505050565b60008151808452815b8181101561065f57602081850181015186830182015201610643565b818111156106705782602083870101525b50601f01601f19169290920160200192915050565b6000604083018251845260208084015160408287015282815180855260608801915083830194508592505b808310156106d057845182529383019360019290920191908301906106b0565b509695505050505050565b6001600160a01b0391909116815260200190565b6001600160a01b0386811682528516602082015260a06040820181905260009061071b9083018661063a565b846060840152828103608084015283518152602084015160a06020830152805160a0830152602081015160c0830152604081015160e083015260608101516101008301526080810151905060a061012083015261077c61014083018261063a565b9050604085015182820360408401526107958282610685565b915050606085015182820360608401526107af828261063a565b915050608085015182820360808401526107c9828261063a565b9a9950505050505050505050565b60208082526057908201527f4f564d5f4c314d756c74694d65737361676552656c617965723a2046756e637460408201527f696f6e2063616e206f6e6c792062652063616c6c656420627920746865204f5660608201527f4d5f4c3242617463684d65737361676552656c61796572000000000000000000608082015260a00190565b60008235609e1983360301811261086f578182fd5b9190910192915050565b60405181810167ffffffffffffffff8111828210171561089557fe5b604052919050565b600060a082360312156108ae578081fd5b60405160a0810167ffffffffffffffff82821081831117156108cc57fe5b816040526108d985610329565b83526108e760208601610329565b602084015260408501359150808211156108ff578384fd5b61090b36838701610340565b604084015260608501356060840152608085013591508082111561092d578384fd5b50610571368286016104b956fe50726f78795f5f4f564d5f4c3143726f7373446f6d61696e4d657373656e676572a26469706673582212203e2aca3202e2494f57a37417a0e525f62e9aa0b961adf7d7df974a4cb58ddd4364736f6c63430007060033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100415760003560e01c806316e9cd9b14610046578063299ca4781461005b578063461a447814610079575b600080fd5b61005961005436600461057d565b61008c565b005b6100636101ea565b60405161007091906106db565b60405180910390f35b6100636100873660046105ec565b6101f9565b6100ca6040518060400160405280601981526020017f4f564d5f4c3242617463684d65737361676552656c61796572000000000000008152506101f9565b6001600160a01b0316336001600160a01b0316146101035760405162461bcd60e51b81526004016100fa906107d7565b60405180910390fd5b600061012660405180606001604052806021815260200161093b602191396101f9565b905060005b828110156101e457600084848381811061014157fe5b9050602002810190610153919061085a565b61015c9061089d565b8051602082015160408084015160608501516080860151925163d7fd19dd60e01b81529596506001600160a01b0389169563d7fd19dd956101a5959094909392916004016106ef565b600060405180830381600087803b1580156101bf57600080fd5b505af11580156101d3573d6000803e3d6000fd5b50506001909301925061012b915050565b50505050565b6000546001600160a01b031681565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b83811015610259578181015183820152602001610241565b50505050905090810190601f1680156102865780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b1580156102a357600080fd5b505afa1580156102b7573d6000803e3d6000fd5b505050506040513d60208110156102cd57600080fd5b505190505b919050565b600067ffffffffffffffff8311156102eb57fe5b6102fe601f8401601f1916602001610879565b905082815283838301111561031257600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b03811681146102d257600080fd5b600082601f830112610350578081fd5b61035f838335602085016102d7565b9392505050565b600060a08284031215610377578081fd5b60405160a0810167ffffffffffffffff828210818311171561039557fe5b816040528293508435835260208501356020840152604085013560408401526060850135606084015260808501359150808211156103d257600080fd5b506103df85828601610340565b6080830152505092915050565b6000604082840312156103fd578081fd5b6040516040810167ffffffffffffffff828210818311171561041b57fe5b816040528293508435835260209150818501358181111561043b57600080fd5b8501601f8101871361044c57600080fd5b80358281111561045857fe5b8381029250610468848401610879565b8181528481019083860185850187018b101561048357600080fd5b600095505b838610156104a6578035835260019590950194918601918601610488565b5080868801525050505050505092915050565b600060a082840312156104ca578081fd5b6104d460a0610879565b905081358152602082013567ffffffffffffffff808211156104f557600080fd5b61050185838601610366565b6020840152604084013591508082111561051a57600080fd5b610526858386016103ec565b6040840152606084013591508082111561053f57600080fd5b61054b85838601610340565b6060840152608084013591508082111561056457600080fd5b5061057184828501610340565b60808301525092915050565b6000806020838503121561058f578182fd5b823567ffffffffffffffff808211156105a6578384fd5b818501915085601f8301126105b9578384fd5b8135818111156105c7578485fd5b86602080830285010111156105da578485fd5b60209290920196919550909350505050565b6000602082840312156105fd578081fd5b813567ffffffffffffffff811115610613578182fd5b8201601f81018413610623578182fd5b610632848235602084016102d7565b949350505050565b60008151808452815b8181101561065f57602081850181015186830182015201610643565b818111156106705782602083870101525b50601f01601f19169290920160200192915050565b6000604083018251845260208084015160408287015282815180855260608801915083830194508592505b808310156106d057845182529383019360019290920191908301906106b0565b509695505050505050565b6001600160a01b0391909116815260200190565b6001600160a01b0386811682528516602082015260a06040820181905260009061071b9083018661063a565b846060840152828103608084015283518152602084015160a06020830152805160a0830152602081015160c0830152604081015160e083015260608101516101008301526080810151905060a061012083015261077c61014083018261063a565b9050604085015182820360408401526107958282610685565b915050606085015182820360608401526107af828261063a565b915050608085015182820360808401526107c9828261063a565b9a9950505050505050505050565b60208082526057908201527f4f564d5f4c314d756c74694d65737361676552656c617965723a2046756e637460408201527f696f6e2063616e206f6e6c792062652063616c6c656420627920746865204f5660608201527f4d5f4c3242617463684d65737361676552656c61796572000000000000000000608082015260a00190565b60008235609e1983360301811261086f578182fd5b9190910192915050565b60405181810167ffffffffffffffff8111828210171561089557fe5b604052919050565b600060a082360312156108ae578081fd5b60405160a0810167ffffffffffffffff82821081831117156108cc57fe5b816040526108d985610329565b83526108e760208601610329565b602084015260408501359150808211156108ff578384fd5b61090b36838701610340565b604084015260608501356060840152608085013591508082111561092d578384fd5b50610571368286016104b956fe50726f78795f5f4f564d5f4c3143726f7373446f6d61696e4d657373656e676572a26469706673582212203e2aca3202e2494f57a37417a0e525f62e9aa0b961adf7d7df974a4cb58ddd4364736f6c63430007060033", - "devdoc": { - "details": "The L1 Multi-Message Relayer contract is a gas efficiency optimization which enables the relayer to submit multiple messages in a single transaction to be relayed by the L1 Cross Domain Message Sender. Compiler used: solc Runtime target: EVM", - "kind": "dev", - "methods": { - "batchRelayMessages((address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))[])": { - "params": { - "_messages": "An array of L2 to L1 messages" - } - }, - "resolve(string)": { - "params": { - "_name": "Name to resolve an address for." - }, - "returns": { - "_0": "Address associated with the given name." - } - } - }, - "title": "OVM_L1MultiMessageRelayer", - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": { - "batchRelayMessages((address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))[])": { - "notice": "Forwards multiple cross domain messages to the L1 Cross Domain Messenger for relaying" - }, - "resolve(string)": { - "notice": "Resolves the address associated with a given name." - } - }, - "version": 1 - }, - "storageLayout": { - "storage": [ - { - "astId": 12557, - "contract": "contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1MultiMessageRelayer.sol:OVM_L1MultiMessageRelayer", - "label": "libAddressManager", - "offset": 0, - "slot": "0", - "type": "t_contract(Lib_AddressManager)12550" - } - ], - "types": { - "t_contract(Lib_AddressManager)12550": { - "encoding": "inplace", - "label": "contract Lib_AddressManager", - "numberOfBytes": "20" - } - } - } -} \ No newline at end of file diff --git a/packages/contracts/deployments/goerli-v2/OVM_SafetyChecker.json b/packages/contracts/deployments/goerli-v2/OVM_SafetyChecker.json deleted file mode 100644 index 67bdd926389b6..0000000000000 --- a/packages/contracts/deployments/goerli-v2/OVM_SafetyChecker.json +++ /dev/null @@ -1,74 +0,0 @@ -{ - "address": "0x97203a63AC85D811b75575bc5F7Ddc414548B287", - "abi": [ - { - "inputs": [ - { - "internalType": "bytes", - "name": "_bytecode", - "type": "bytes" - } - ], - "name": "isBytecodeSafe", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "pure", - "type": "function" - } - ], - "transactionHash": "0xc2f9e5e30361586f35e0063251015d8092f0459284227eb4eb7b83c7e5124ac9", - "receipt": { - "to": null, - "from": "0x558ba9b8d78713fbf768c1f8a584485B4003f43F", - "contractAddress": "0x97203a63AC85D811b75575bc5F7Ddc414548B287", - "transactionIndex": 30, - "gasUsed": "243548", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0x041615b86c697eafea7bce92ef177992bc197fcc0ddb18217e935ea2de13a38e", - "transactionHash": "0xc2f9e5e30361586f35e0063251015d8092f0459284227eb4eb7b83c7e5124ac9", - "logs": [], - "blockNumber": 4607724, - "cumulativeGasUsed": "2111792", - "status": 1, - "byzantium": true - }, - "args": [], - "solcInputHash": "8aef3555d89ad9d3af2f5d28a85dc856", - "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_bytecode\",\"type\":\"bytes\"}],\"name\":\"isBytecodeSafe\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The Safety Checker verifies that contracts deployed on L2 do not contain any \\\"unsafe\\\" operations. An operation is considered unsafe if it would access state variables which are specific to the environment (ie. L1 or L2) in which it is executed, as this could be used to \\\"escape the sandbox\\\" of the OVM, resulting in non-deterministic fraud proofs. That is, an attacker would be able to \\\"prove fraud\\\" on an honestly applied transaction. Note that a \\\"safe\\\" contract requires opcodes to appear in a particular pattern; omission of \\\"unsafe\\\" opcodes is necessary, but not sufficient. Compiler used: solc Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"isBytecodeSafe(bytes)\":{\"params\":{\"_bytecode\":\"The bytecode to safety check.\"},\"returns\":{\"_0\":\"`true` if the bytecode is safe, `false` otherwise.\"}}},\"title\":\"OVM_SafetyChecker\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"isBytecodeSafe(bytes)\":{\"notice\":\"Returns whether or not all of the provided bytecode is safe.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/OVM/execution/OVM_SafetyChecker.sol\":\"OVM_SafetyChecker\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/optimistic-ethereum/OVM/execution/OVM_SafetyChecker.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Interface Imports */\\nimport { iOVM_SafetyChecker } from \\\"../../iOVM/execution/iOVM_SafetyChecker.sol\\\";\\n\\n/**\\n * @title OVM_SafetyChecker\\n * @dev The Safety Checker verifies that contracts deployed on L2 do not contain any\\n * \\\"unsafe\\\" operations. An operation is considered unsafe if it would access state variables which\\n * are specific to the environment (ie. L1 or L2) in which it is executed, as this could be used\\n * to \\\"escape the sandbox\\\" of the OVM, resulting in non-deterministic fraud proofs. \\n * That is, an attacker would be able to \\\"prove fraud\\\" on an honestly applied transaction.\\n * Note that a \\\"safe\\\" contract requires opcodes to appear in a particular pattern;\\n * omission of \\\"unsafe\\\" opcodes is necessary, but not sufficient.\\n *\\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract OVM_SafetyChecker is iOVM_SafetyChecker {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Returns whether or not all of the provided bytecode is safe.\\n * @param _bytecode The bytecode to safety check.\\n * @return `true` if the bytecode is safe, `false` otherwise.\\n */\\n function isBytecodeSafe(\\n bytes memory _bytecode\\n )\\n override\\n external\\n pure\\n returns (\\n bool\\n )\\n {\\n // autogenerated by gen_safety_checker_constants.py\\n // number of bytes to skip for each opcode\\n uint256[8] memory opcodeSkippableBytes = [\\n uint256(0x0001010101010101010101010000000001010101010101010101010101010000),\\n uint256(0x0100000000000000000000000000000000000000010101010101000000010100),\\n uint256(0x0000000000000000000000000000000001010101000000010101010100000000),\\n uint256(0x0203040500000000000000000000000000000000000000000000000000000000),\\n uint256(0x0101010101010101010101010101010101010101010101010101010101010101),\\n uint256(0x0101010101000000000000000000000000000000000000000000000000000000),\\n uint256(0x0000000000000000000000000000000000000000000000000000000000000000),\\n uint256(0x0000000000000000000000000000000000000000000000000000000000000000)\\n ];\\n // Mask to gate opcode specific cases\\n uint256 opcodeGateMask = ~uint256(0xffffffffffffffffffffffe000000000fffffffff070ffff9c0ffffec000f001);\\n // Halting opcodes\\n uint256 opcodeHaltingMask = ~uint256(0x4008000000000000000000000000000000000000004000000000000000000001);\\n // PUSH opcodes\\n uint256 opcodePushMask = ~uint256(0xffffffff000000000000000000000000);\\n\\n uint256 codeLength;\\n uint256 _pc;\\n assembly {\\n _pc := add(_bytecode, 0x20)\\n }\\n codeLength = _pc + _bytecode.length;\\n do {\\n // current opcode: 0x00...0xff\\n uint256 opNum;\\n\\n // inline assembly removes the extra add + bounds check\\n assembly {\\n let word := mload(_pc) //load the next 32 bytes at pc into word\\n\\n // Look up number of bytes to skip from opcodeSkippableBytes and then update indexInWord\\n // E.g. the 02030405 in opcodeSkippableBytes is the number of bytes to skip for PUSH1->4\\n // We repeat this 6 times, thus we can only skip bytes for up to PUSH4 ((1+4) * 6 = 30 < 32).\\n // If we see an opcode that is listed as 0 skippable bytes e.g. PUSH5,\\n // then we will get stuck on that indexInWord and then opNum will be set to the PUSH5 opcode.\\n let indexInWord := byte(0, mload(add(opcodeSkippableBytes, byte(0, word))))\\n indexInWord := add(indexInWord, byte(0, mload(add(opcodeSkippableBytes, byte(indexInWord, word)))))\\n indexInWord := add(indexInWord, byte(0, mload(add(opcodeSkippableBytes, byte(indexInWord, word)))))\\n indexInWord := add(indexInWord, byte(0, mload(add(opcodeSkippableBytes, byte(indexInWord, word)))))\\n indexInWord := add(indexInWord, byte(0, mload(add(opcodeSkippableBytes, byte(indexInWord, word)))))\\n indexInWord := add(indexInWord, byte(0, mload(add(opcodeSkippableBytes, byte(indexInWord, word)))))\\n _pc := add(_pc, indexInWord)\\n\\n opNum := byte(indexInWord, word)\\n }\\n\\n // + push opcodes\\n // + stop opcodes [STOP(0x00),JUMP(0x56),RETURN(0xf3),INVALID(0xfe)]\\n // + caller opcode CALLER(0x33)\\n // + blacklisted opcodes\\n uint256 opBit = 1 << opNum;\\n if (opBit & opcodeGateMask == 0) {\\n if (opBit & opcodePushMask == 0) {\\n // all pushes are valid opcodes\\n // subsequent bytes are not opcodes. Skip them.\\n _pc += (opNum - 0x5e); // PUSH1 is 0x60, so opNum-0x5f = PUSHed bytes and we +1 to\\n // skip the _pc++; line below in order to save gas ((-0x5f + 1) = -0x5e)\\n continue;\\n } else if (opBit & opcodeHaltingMask == 0) {\\n // STOP or JUMP or RETURN or INVALID (Note: REVERT is blacklisted, so not included here)\\n // We are now inside unreachable code until we hit a JUMPDEST!\\n do {\\n _pc++;\\n assembly {\\n opNum := byte(0, mload(_pc))\\n }\\n // encountered a JUMPDEST\\n if (opNum == 0x5b) break;\\n // skip PUSHed bytes\\n if ((1 << opNum) & opcodePushMask == 0) _pc += (opNum - 0x5f); // opNum-0x5f = PUSHed bytes (PUSH1 is 0x60)\\n } while (_pc < codeLength);\\n // opNum is 0x5b, so we don't continue here since the pc++ is fine\\n } else if (opNum == 0x33) { // Caller opcode\\n uint256 firstOps; // next 32 bytes of bytecode\\n uint256 secondOps; // following 32 bytes of bytecode\\n\\n assembly {\\n firstOps := mload(_pc)\\n // 37 bytes total, 5 left over --> 32 - 5 bytes = 27 bytes = 216 bits\\n secondOps := shr(216, mload(add(_pc, 0x20)))\\n }\\n\\n // Call identity precompile\\n // CALLER POP PUSH1 0x00 PUSH1 0x04 GAS CALL\\n // 32 - 8 bytes = 24 bytes = 192\\n if ((firstOps >> 192) == 0x3350600060045af1) {\\n _pc += 8;\\n // Call EM and abort execution if instructed\\n // CALLER PUSH1 0x00 SWAP1 GAS CALL PC PUSH1 0x0E ADD JUMPI RETURNDATASIZE PUSH1 0x00 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x00 REVERT JUMPDEST RETURNDATASIZE PUSH1 0x01 EQ ISZERO PC PUSH1 0x0a ADD JUMPI PUSH1 0x01 PUSH1 0x00 RETURN JUMPDEST \\n } else if (firstOps == 0x336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a015760 && secondOps == 0x016000f35b) {\\n _pc += 37;\\n } else {\\n return false;\\n }\\n continue;\\n } else {\\n // encountered a non-whitelisted opcode!\\n return false;\\n }\\n }\\n _pc++;\\n } while (_pc < codeLength);\\n return true;\\n }\\n}\\n\",\"keccak256\":\"0xb1578ea95da5f6e7d5f5428ccc5efe629b3b9ef88fed7625fa7b78cdb9539508\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/execution/iOVM_SafetyChecker.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title iOVM_SafetyChecker\\n */\\ninterface iOVM_SafetyChecker {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function isBytecodeSafe(bytes calldata _bytecode) external pure returns (bool);\\n}\\n\",\"keccak256\":\"0xde6639676d4ec4f77297652d5ede2429bc93e74e11fefd9e9de4bc92dd784878\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x608060405234801561001057600080fd5b50610373806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063a44eb59a14610030575b600080fd5b6100d66004803603602081101561004657600080fd5b81019060208101813564010000000081111561006157600080fd5b82018360208201111561007357600080fd5b8035906020019184600183028401116401000000008311171561009557600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506100ea945050505050565b604080519115158252519081900360200190f35b60408051610100810182527e0101010101010101010101000000000101010101010101010101010101000081526b010101010101000000010100600160f81b016020808301919091526f0101010100000001010101010000000092820192909252630203040560e01b60608201527f0101010101010101010101010101010101010101010101010101010101010101608082015264010101010160d81b60a0820152600060c0820181905260e0820181905283519092741fffffffff000000000f8f000063f000013fff0ffe916a40000000000000000000026117ff60f31b039163ffffffff60601b1991870181019087015b8051600081811a880151811a82811a890151821a0182811a890151821a0182811a890151821a0182811a890151821a0182811a89015190911a01918201911a6001811b86811661032057808516610239575001605d1901610326565b80861661027e575b8280600101935050825160001a915081605b141561025e57610279565b6001821b851661027157918101605e1901915b838310610241575b610320565b816033141561030f578251602084015160d81c673350600060045af160c083901c14156102b057600885019450610306565b817f336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a0157601480156102e357508064016000f35b145b156102f357602585019450610306565b60009a5050505050505050505050610338565b50505050610326565b600098505050505050505050610338565b50506001015b8181106101dd57600196505050505050505b91905056fea2646970667358221220aecd52c999e70adbfcec5bc46b7f1233db7d3ef40ce7024d2b4ea5a054eac97864736f6c63430007060033", - "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061002b5760003560e01c8063a44eb59a14610030575b600080fd5b6100d66004803603602081101561004657600080fd5b81019060208101813564010000000081111561006157600080fd5b82018360208201111561007357600080fd5b8035906020019184600183028401116401000000008311171561009557600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506100ea945050505050565b604080519115158252519081900360200190f35b60408051610100810182527e0101010101010101010101000000000101010101010101010101010101000081526b010101010101000000010100600160f81b016020808301919091526f0101010100000001010101010000000092820192909252630203040560e01b60608201527f0101010101010101010101010101010101010101010101010101010101010101608082015264010101010160d81b60a0820152600060c0820181905260e0820181905283519092741fffffffff000000000f8f000063f000013fff0ffe916a40000000000000000000026117ff60f31b039163ffffffff60601b1991870181019087015b8051600081811a880151811a82811a890151821a0182811a890151821a0182811a890151821a0182811a890151821a0182811a89015190911a01918201911a6001811b86811661032057808516610239575001605d1901610326565b80861661027e575b8280600101935050825160001a915081605b141561025e57610279565b6001821b851661027157918101605e1901915b838310610241575b610320565b816033141561030f578251602084015160d81c673350600060045af160c083901c14156102b057600885019450610306565b817f336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a0157601480156102e357508064016000f35b145b156102f357602585019450610306565b60009a5050505050505050505050610338565b50505050610326565b600098505050505050505050610338565b50506001015b8181106101dd57600196505050505050505b91905056fea2646970667358221220aecd52c999e70adbfcec5bc46b7f1233db7d3ef40ce7024d2b4ea5a054eac97864736f6c63430007060033", - "devdoc": { - "details": "The Safety Checker verifies that contracts deployed on L2 do not contain any \"unsafe\" operations. An operation is considered unsafe if it would access state variables which are specific to the environment (ie. L1 or L2) in which it is executed, as this could be used to \"escape the sandbox\" of the OVM, resulting in non-deterministic fraud proofs. That is, an attacker would be able to \"prove fraud\" on an honestly applied transaction. Note that a \"safe\" contract requires opcodes to appear in a particular pattern; omission of \"unsafe\" opcodes is necessary, but not sufficient. Compiler used: solc Runtime target: EVM", - "kind": "dev", - "methods": { - "isBytecodeSafe(bytes)": { - "params": { - "_bytecode": "The bytecode to safety check." - }, - "returns": { - "_0": "`true` if the bytecode is safe, `false` otherwise." - } - } - }, - "title": "OVM_SafetyChecker", - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": { - "isBytecodeSafe(bytes)": { - "notice": "Returns whether or not all of the provided bytecode is safe." - } - }, - "version": 1 - }, - "storageLayout": { - "storage": [], - "types": null - } -} \ No newline at end of file diff --git a/packages/contracts/deployments/goerli-v2/OVM_StateCommitmentChain.json b/packages/contracts/deployments/goerli-v2/OVM_StateCommitmentChain.json deleted file mode 100644 index bac149dcfdbdd..0000000000000 --- a/packages/contracts/deployments/goerli-v2/OVM_StateCommitmentChain.json +++ /dev/null @@ -1,529 +0,0 @@ -{ - "address": "0xc983d52292DCBBEE53a0730C6A3EEb61c6F19129", - "abi": [ - { - "inputs": [ - { - "internalType": "address", - "name": "_libAddressManager", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_fraudProofWindow", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_sequencerPublishWindow", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "_batchIndex", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "bytes32", - "name": "_batchRoot", - "type": "bytes32" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_batchSize", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_prevTotalElements", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "bytes", - "name": "_extraData", - "type": "bytes" - } - ], - "name": "StateBatchAppended", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "_batchIndex", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "bytes32", - "name": "_batchRoot", - "type": "bytes32" - } - ], - "name": "StateBatchDeleted", - "type": "event" - }, - { - "inputs": [], - "name": "FRAUD_PROOF_WINDOW", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "SEQUENCER_PUBLISH_WINDOW", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32[]", - "name": "_batch", - "type": "bytes32[]" - }, - { - "internalType": "uint256", - "name": "_shouldStartAtElement", - "type": "uint256" - } - ], - "name": "appendStateBatch", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "batches", - "outputs": [ - { - "internalType": "contract iOVM_ChainStorageContainer", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "components": [ - { - "internalType": "uint256", - "name": "batchIndex", - "type": "uint256" - }, - { - "internalType": "bytes32", - "name": "batchRoot", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "batchSize", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "prevTotalElements", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "extraData", - "type": "bytes" - } - ], - "internalType": "struct Lib_OVMCodec.ChainBatchHeader", - "name": "_batchHeader", - "type": "tuple" - } - ], - "name": "deleteStateBatch", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "getLastSequencerTimestamp", - "outputs": [ - { - "internalType": "uint256", - "name": "_lastSequencerTimestamp", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getTotalBatches", - "outputs": [ - { - "internalType": "uint256", - "name": "_totalBatches", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getTotalElements", - "outputs": [ - { - "internalType": "uint256", - "name": "_totalElements", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "components": [ - { - "internalType": "uint256", - "name": "batchIndex", - "type": "uint256" - }, - { - "internalType": "bytes32", - "name": "batchRoot", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "batchSize", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "prevTotalElements", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "extraData", - "type": "bytes" - } - ], - "internalType": "struct Lib_OVMCodec.ChainBatchHeader", - "name": "_batchHeader", - "type": "tuple" - } - ], - "name": "insideFraudProofWindow", - "outputs": [ - { - "internalType": "bool", - "name": "_inside", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "libAddressManager", - "outputs": [ - { - "internalType": "contract Lib_AddressManager", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "string", - "name": "_name", - "type": "string" - } - ], - "name": "resolve", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "_element", - "type": "bytes32" - }, - { - "components": [ - { - "internalType": "uint256", - "name": "batchIndex", - "type": "uint256" - }, - { - "internalType": "bytes32", - "name": "batchRoot", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "batchSize", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "prevTotalElements", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "extraData", - "type": "bytes" - } - ], - "internalType": "struct Lib_OVMCodec.ChainBatchHeader", - "name": "_batchHeader", - "type": "tuple" - }, - { - "components": [ - { - "internalType": "uint256", - "name": "index", - "type": "uint256" - }, - { - "internalType": "bytes32[]", - "name": "siblings", - "type": "bytes32[]" - } - ], - "internalType": "struct Lib_OVMCodec.ChainInclusionProof", - "name": "_proof", - "type": "tuple" - } - ], - "name": "verifyStateCommitment", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - } - ], - "transactionHash": "0x7296db3d312f6c14ac4ba25654201283b985a6b8ce4f31c7167228362a247182", - "receipt": { - "to": null, - "from": "0x558ba9b8d78713fbf768c1f8a584485B4003f43F", - "contractAddress": "0xc983d52292DCBBEE53a0730C6A3EEb61c6F19129", - "transactionIndex": 20, - "gasUsed": "1630165", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0x83772688c3b1f5b2d808f15a5377cdc67f251e4f8bfc4577a0031c5fb68494f7", - "transactionHash": "0x7296db3d312f6c14ac4ba25654201283b985a6b8ce4f31c7167228362a247182", - "logs": [], - "blockNumber": 4607701, - "cumulativeGasUsed": "4884442", - "status": 1, - "byzantium": true - }, - "args": [ - "0x9933d137bBF050Cf3D7555fE1beC91eF698814e5", - 30, - 18000000 - ], - "solcInputHash": "8aef3555d89ad9d3af2f5d28a85dc856", - "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_fraudProofWindow\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_sequencerPublishWindow\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_batchIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"_batchRoot\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_batchSize\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_prevTotalElements\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"_extraData\",\"type\":\"bytes\"}],\"name\":\"StateBatchAppended\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_batchIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"_batchRoot\",\"type\":\"bytes32\"}],\"name\":\"StateBatchDeleted\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"FRAUD_PROOF_WINDOW\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"SEQUENCER_PUBLISH_WINDOW\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"_batch\",\"type\":\"bytes32[]\"},{\"internalType\":\"uint256\",\"name\":\"_shouldStartAtElement\",\"type\":\"uint256\"}],\"name\":\"appendStateBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"batches\",\"outputs\":[{\"internalType\":\"contract iOVM_ChainStorageContainer\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"_batchHeader\",\"type\":\"tuple\"}],\"name\":\"deleteStateBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLastSequencerTimestamp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_lastSequencerTimestamp\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTotalBatches\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_totalBatches\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTotalElements\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_totalElements\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"_batchHeader\",\"type\":\"tuple\"}],\"name\":\"insideFraudProofWindow\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"_inside\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_element\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"_batchHeader\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"siblings\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct Lib_OVMCodec.ChainInclusionProof\",\"name\":\"_proof\",\"type\":\"tuple\"}],\"name\":\"verifyStateCommitment\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The State Commitment Chain (SCC) contract contains a list of proposed state roots which Proposers assert to be a result of each transaction in the Canonical Transaction Chain (CTC). Elements here have a 1:1 correspondence with transactions in the CTC, and should be the unique state root calculated off-chain by applying the canonical transactions one by one. Compiler used: solc Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"appendStateBatch(bytes32[],uint256)\":{\"params\":{\"_batch\":\"Batch of state roots.\",\"_shouldStartAtElement\":\"Index of the element at which this batch should start.\"}},\"batches()\":{\"returns\":{\"_0\":\"Reference to the batch storage container.\"}},\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\"}},\"deleteStateBatch((uint256,bytes32,uint256,uint256,bytes))\":{\"params\":{\"_batchHeader\":\"Header of the batch to start deleting from.\"}},\"getLastSequencerTimestamp()\":{\"returns\":{\"_lastSequencerTimestamp\":\"Last sequencer batch timestamp.\"}},\"getTotalBatches()\":{\"returns\":{\"_totalBatches\":\"Total submitted batches.\"}},\"getTotalElements()\":{\"returns\":{\"_totalElements\":\"Total submitted elements.\"}},\"insideFraudProofWindow((uint256,bytes32,uint256,uint256,bytes))\":{\"params\":{\"_batchHeader\":\"Header of the batch to check.\"},\"returns\":{\"_inside\":\"Whether or not the batch is inside the fraud proof window.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}},\"verifyStateCommitment(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))\":{\"params\":{\"_batchHeader\":\"Header of the batch in which the element was included.\",\"_element\":\"Hash of the element to verify a proof for.\",\"_proof\":\"Merkle inclusion proof for the element.\"}}},\"title\":\"OVM_StateCommitmentChain\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"appendStateBatch(bytes32[],uint256)\":{\"notice\":\"Appends a batch of state roots to the chain.\"},\"batches()\":{\"notice\":\"Accesses the batch storage container.\"},\"deleteStateBatch((uint256,bytes32,uint256,uint256,bytes))\":{\"notice\":\"Deletes all state roots after (and including) a given batch.\"},\"getLastSequencerTimestamp()\":{\"notice\":\"Retrieves the timestamp of the last batch submitted by the sequencer.\"},\"getTotalBatches()\":{\"notice\":\"Retrieves the total number of batches submitted.\"},\"getTotalElements()\":{\"notice\":\"Retrieves the total number of elements submitted.\"},\"insideFraudProofWindow((uint256,bytes32,uint256,uint256,bytes))\":{\"notice\":\"Checks whether a given batch is still inside its fraud proof window.\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"},\"verifyStateCommitment(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))\":{\"notice\":\"Verifies a batch inclusion proof.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/OVM/chain/OVM_StateCommitmentChain.sol\":\"OVM_StateCommitmentChain\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/math/SafeMath.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\n * checks.\\n *\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\n * in bugs, because programmers usually assume that an overflow raises an\\n * error, which is the standard behavior in high level programming languages.\\n * `SafeMath` restores this intuition by reverting the transaction when an\\n * operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n */\\nlibrary SafeMath {\\n /**\\n * @dev Returns the addition of two unsigned integers, with an overflow flag.\\n *\\n * _Available since v3.4._\\n */\\n function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n uint256 c = a + b;\\n if (c < a) return (false, 0);\\n return (true, c);\\n }\\n\\n /**\\n * @dev Returns the substraction of two unsigned integers, with an overflow flag.\\n *\\n * _Available since v3.4._\\n */\\n function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n if (b > a) return (false, 0);\\n return (true, a - b);\\n }\\n\\n /**\\n * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\\n *\\n * _Available since v3.4._\\n */\\n function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\n // benefit is lost if 'b' is also tested.\\n // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\n if (a == 0) return (true, 0);\\n uint256 c = a * b;\\n if (c / a != b) return (false, 0);\\n return (true, c);\\n }\\n\\n /**\\n * @dev Returns the division of two unsigned integers, with a division by zero flag.\\n *\\n * _Available since v3.4._\\n */\\n function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n if (b == 0) return (false, 0);\\n return (true, a / b);\\n }\\n\\n /**\\n * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\\n *\\n * _Available since v3.4._\\n */\\n function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n if (b == 0) return (false, 0);\\n return (true, a % b);\\n }\\n\\n /**\\n * @dev Returns the addition of two unsigned integers, reverting on\\n * overflow.\\n *\\n * Counterpart to Solidity's `+` operator.\\n *\\n * Requirements:\\n *\\n * - Addition cannot overflow.\\n */\\n function add(uint256 a, uint256 b) internal pure returns (uint256) {\\n uint256 c = a + b;\\n require(c >= a, \\\"SafeMath: addition overflow\\\");\\n return c;\\n }\\n\\n /**\\n * @dev Returns the subtraction of two unsigned integers, reverting on\\n * overflow (when the result is negative).\\n *\\n * Counterpart to Solidity's `-` operator.\\n *\\n * Requirements:\\n *\\n * - Subtraction cannot overflow.\\n */\\n function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\n require(b <= a, \\\"SafeMath: subtraction overflow\\\");\\n return a - b;\\n }\\n\\n /**\\n * @dev Returns the multiplication of two unsigned integers, reverting on\\n * overflow.\\n *\\n * Counterpart to Solidity's `*` operator.\\n *\\n * Requirements:\\n *\\n * - Multiplication cannot overflow.\\n */\\n function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\n if (a == 0) return 0;\\n uint256 c = a * b;\\n require(c / a == b, \\\"SafeMath: multiplication overflow\\\");\\n return c;\\n }\\n\\n /**\\n * @dev Returns the integer division of two unsigned integers, reverting on\\n * division by zero. The result is rounded towards zero.\\n *\\n * Counterpart to Solidity's `/` operator. Note: this function uses a\\n * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n * uses an invalid opcode to revert (consuming all remaining gas).\\n *\\n * Requirements:\\n *\\n * - The divisor cannot be zero.\\n */\\n function div(uint256 a, uint256 b) internal pure returns (uint256) {\\n require(b > 0, \\\"SafeMath: division by zero\\\");\\n return a / b;\\n }\\n\\n /**\\n * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n * reverting when dividing by zero.\\n *\\n * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n * opcode (which leaves remaining gas untouched) while Solidity uses an\\n * invalid opcode to revert (consuming all remaining gas).\\n *\\n * Requirements:\\n *\\n * - The divisor cannot be zero.\\n */\\n function mod(uint256 a, uint256 b) internal pure returns (uint256) {\\n require(b > 0, \\\"SafeMath: modulo by zero\\\");\\n return a % b;\\n }\\n\\n /**\\n * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\n * overflow (when the result is negative).\\n *\\n * CAUTION: This function is deprecated because it requires allocating memory for the error\\n * message unnecessarily. For custom revert reasons use {trySub}.\\n *\\n * Counterpart to Solidity's `-` operator.\\n *\\n * Requirements:\\n *\\n * - Subtraction cannot overflow.\\n */\\n function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n require(b <= a, errorMessage);\\n return a - b;\\n }\\n\\n /**\\n * @dev Returns the integer division of two unsigned integers, reverting with custom message on\\n * division by zero. The result is rounded towards zero.\\n *\\n * CAUTION: This function is deprecated because it requires allocating memory for the error\\n * message unnecessarily. For custom revert reasons use {tryDiv}.\\n *\\n * Counterpart to Solidity's `/` operator. Note: this function uses a\\n * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n * uses an invalid opcode to revert (consuming all remaining gas).\\n *\\n * Requirements:\\n *\\n * - The divisor cannot be zero.\\n */\\n function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n require(b > 0, errorMessage);\\n return a / b;\\n }\\n\\n /**\\n * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n * reverting with custom message when dividing by zero.\\n *\\n * CAUTION: This function is deprecated because it requires allocating memory for the error\\n * message unnecessarily. For custom revert reasons use {tryMod}.\\n *\\n * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n * opcode (which leaves remaining gas untouched) while Solidity uses an\\n * invalid opcode to revert (consuming all remaining gas).\\n *\\n * Requirements:\\n *\\n * - The divisor cannot be zero.\\n */\\n function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n require(b > 0, errorMessage);\\n return a % b;\\n }\\n}\\n\",\"keccak256\":\"0xcc78a17dd88fa5a2edc60c8489e2f405c0913b377216a5b26b35656b2d0dab52\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/chain/OVM_StateCommitmentChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\nimport { Lib_MerkleTree } from \\\"../../libraries/utils/Lib_MerkleTree.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_FraudVerifier } from \\\"../../iOVM/verification/iOVM_FraudVerifier.sol\\\";\\nimport { iOVM_StateCommitmentChain } from \\\"../../iOVM/chain/iOVM_StateCommitmentChain.sol\\\";\\nimport { iOVM_CanonicalTransactionChain } from \\\"../../iOVM/chain/iOVM_CanonicalTransactionChain.sol\\\";\\nimport { iOVM_BondManager } from \\\"../../iOVM/verification/iOVM_BondManager.sol\\\";\\nimport { iOVM_ChainStorageContainer } from \\\"../../iOVM/chain/iOVM_ChainStorageContainer.sol\\\";\\n\\n/* External Imports */\\nimport '@openzeppelin/contracts/math/SafeMath.sol';\\n\\n/**\\n * @title OVM_StateCommitmentChain\\n * @dev The State Commitment Chain (SCC) contract contains a list of proposed state roots which\\n * Proposers assert to be a result of each transaction in the Canonical Transaction Chain (CTC).\\n * Elements here have a 1:1 correspondence with transactions in the CTC, and should be the unique\\n * state root calculated off-chain by applying the canonical transactions one by one.\\n *\\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract OVM_StateCommitmentChain is iOVM_StateCommitmentChain, Lib_AddressResolver {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 public FRAUD_PROOF_WINDOW;\\n uint256 public SEQUENCER_PUBLISH_WINDOW;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n */\\n constructor(\\n address _libAddressManager,\\n uint256 _fraudProofWindow,\\n uint256 _sequencerPublishWindow\\n )\\n Lib_AddressResolver(_libAddressManager)\\n {\\n FRAUD_PROOF_WINDOW = _fraudProofWindow;\\n SEQUENCER_PUBLISH_WINDOW = _sequencerPublishWindow;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Accesses the batch storage container.\\n * @return Reference to the batch storage container.\\n */\\n function batches()\\n public\\n view\\n returns (\\n iOVM_ChainStorageContainer\\n )\\n {\\n return iOVM_ChainStorageContainer(\\n resolve(\\\"OVM_ChainStorageContainer:SCC:batches\\\")\\n );\\n }\\n\\n /**\\n * @inheritdoc iOVM_StateCommitmentChain\\n */\\n function getTotalElements()\\n override\\n public\\n view\\n returns (\\n uint256 _totalElements\\n )\\n {\\n (uint40 totalElements, ) = _getBatchExtraData();\\n return uint256(totalElements);\\n }\\n\\n /**\\n * @inheritdoc iOVM_StateCommitmentChain\\n */\\n function getTotalBatches()\\n override\\n public\\n view\\n returns (\\n uint256 _totalBatches\\n )\\n {\\n return batches().length();\\n }\\n\\n /**\\n * @inheritdoc iOVM_StateCommitmentChain\\n */\\n function getLastSequencerTimestamp()\\n override\\n public\\n view\\n returns (\\n uint256 _lastSequencerTimestamp\\n )\\n {\\n (, uint40 lastSequencerTimestamp) = _getBatchExtraData();\\n return uint256(lastSequencerTimestamp);\\n }\\n\\n /**\\n * @inheritdoc iOVM_StateCommitmentChain\\n */\\n function appendStateBatch(\\n bytes32[] memory _batch,\\n uint256 _shouldStartAtElement\\n )\\n override\\n public\\n {\\n // Fail fast in to make sure our batch roots aren't accidentally made fraudulent by the\\n // publication of batches by some other user.\\n require(\\n _shouldStartAtElement == getTotalElements(),\\n \\\"Actual batch start index does not match expected start index.\\\"\\n );\\n\\n // Proposers must have previously staked at the BondManager\\n require(\\n iOVM_BondManager(resolve(\\\"OVM_BondManager\\\")).isCollateralized(msg.sender),\\n \\\"Proposer does not have enough collateral posted\\\"\\n );\\n\\n require(\\n _batch.length > 0,\\n \\\"Cannot submit an empty state batch.\\\"\\n );\\n\\n require(\\n getTotalElements() + _batch.length <= iOVM_CanonicalTransactionChain(resolve(\\\"OVM_CanonicalTransactionChain\\\")).getTotalElements(),\\n \\\"Number of state roots cannot exceed the number of canonical transactions.\\\"\\n );\\n\\n // Pass the block's timestamp and the publisher of the data\\n // to be used in the fraud proofs\\n _appendBatch(\\n _batch,\\n abi.encode(block.timestamp, msg.sender)\\n );\\n }\\n\\n /**\\n * @inheritdoc iOVM_StateCommitmentChain\\n */\\n function deleteStateBatch(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n override\\n public\\n {\\n require(\\n msg.sender == resolve(\\\"OVM_FraudVerifier\\\"),\\n \\\"State batches can only be deleted by the OVM_FraudVerifier.\\\"\\n );\\n\\n require(\\n _isValidBatchHeader(_batchHeader),\\n \\\"Invalid batch header.\\\"\\n );\\n\\n require(\\n insideFraudProofWindow(_batchHeader),\\n \\\"State batches can only be deleted within the fraud proof window.\\\"\\n );\\n\\n _deleteBatch(_batchHeader);\\n }\\n\\n /**\\n * @inheritdoc iOVM_StateCommitmentChain\\n */\\n function verifyStateCommitment(\\n bytes32 _element,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _proof\\n )\\n override\\n public\\n view\\n returns (\\n bool\\n )\\n {\\n require(\\n _isValidBatchHeader(_batchHeader),\\n \\\"Invalid batch header.\\\"\\n );\\n\\n require(\\n Lib_MerkleTree.verify(\\n _batchHeader.batchRoot,\\n _element,\\n _proof.index,\\n _proof.siblings,\\n _batchHeader.batchSize\\n ),\\n \\\"Invalid inclusion proof.\\\"\\n );\\n\\n return true;\\n }\\n\\n /**\\n * @inheritdoc iOVM_StateCommitmentChain\\n */\\n function insideFraudProofWindow(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n override\\n public\\n view\\n returns (\\n bool _inside\\n )\\n {\\n (uint256 timestamp,) = abi.decode(\\n _batchHeader.extraData,\\n (uint256, address)\\n );\\n\\n require(\\n timestamp != 0,\\n \\\"Batch header timestamp cannot be zero\\\"\\n );\\n return SafeMath.add(timestamp, FRAUD_PROOF_WINDOW) > block.timestamp;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Parses the batch context from the extra data.\\n * @return Total number of elements submitted.\\n * @return Timestamp of the last batch submitted by the sequencer.\\n */\\n function _getBatchExtraData()\\n internal\\n view\\n returns (\\n uint40,\\n uint40\\n )\\n {\\n bytes27 extraData = batches().getGlobalMetadata();\\n\\n uint40 totalElements;\\n uint40 lastSequencerTimestamp;\\n assembly {\\n extraData := shr(40, extraData)\\n totalElements := and(extraData, 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF)\\n lastSequencerTimestamp := shr(40, and(extraData, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000))\\n }\\n\\n return (\\n totalElements,\\n lastSequencerTimestamp\\n );\\n }\\n\\n /**\\n * Encodes the batch context for the extra data.\\n * @param _totalElements Total number of elements submitted.\\n * @param _lastSequencerTimestamp Timestamp of the last batch submitted by the sequencer.\\n * @return Encoded batch context.\\n */\\n function _makeBatchExtraData(\\n uint40 _totalElements,\\n uint40 _lastSequencerTimestamp\\n )\\n internal\\n pure\\n returns (\\n bytes27\\n )\\n {\\n bytes27 extraData;\\n assembly {\\n extraData := _totalElements\\n extraData := or(extraData, shl(40, _lastSequencerTimestamp))\\n extraData := shl(40, extraData)\\n }\\n\\n return extraData;\\n }\\n\\n /**\\n * Appends a batch to the chain.\\n * @param _batch Elements within the batch.\\n * @param _extraData Any extra data to append to the batch.\\n */\\n function _appendBatch(\\n bytes32[] memory _batch,\\n bytes memory _extraData\\n )\\n internal\\n {\\n address sequencer = resolve(\\\"OVM_Proposer\\\");\\n (uint40 totalElements, uint40 lastSequencerTimestamp) = _getBatchExtraData();\\n\\n if (msg.sender == sequencer) {\\n lastSequencerTimestamp = uint40(block.timestamp);\\n } else {\\n // We keep track of the last batch submitted by the sequencer so there's a window in\\n // which only the sequencer can publish state roots. A window like this just reduces\\n // the chance of \\\"system breaking\\\" state roots being published while we're still in\\n // testing mode. This window should be removed or significantly reduced in the future.\\n require(\\n lastSequencerTimestamp + SEQUENCER_PUBLISH_WINDOW < block.timestamp,\\n \\\"Cannot publish state roots within the sequencer publication window.\\\"\\n );\\n }\\n\\n // For efficiency reasons getMerkleRoot modifies the `_batch` argument in place\\n // while calculating the root hash therefore any arguments passed to it must not\\n // be used again afterwards\\n Lib_OVMCodec.ChainBatchHeader memory batchHeader = Lib_OVMCodec.ChainBatchHeader({\\n batchIndex: getTotalBatches(),\\n batchRoot: Lib_MerkleTree.getMerkleRoot(_batch),\\n batchSize: _batch.length,\\n prevTotalElements: totalElements,\\n extraData: _extraData\\n });\\n\\n emit StateBatchAppended(\\n batchHeader.batchIndex,\\n batchHeader.batchRoot,\\n batchHeader.batchSize,\\n batchHeader.prevTotalElements,\\n batchHeader.extraData\\n );\\n\\n batches().push(\\n Lib_OVMCodec.hashBatchHeader(batchHeader),\\n _makeBatchExtraData(\\n uint40(batchHeader.prevTotalElements + batchHeader.batchSize),\\n lastSequencerTimestamp\\n )\\n );\\n }\\n\\n /**\\n * Removes a batch and all subsequent batches from the chain.\\n * @param _batchHeader Header of the batch to remove.\\n */\\n function _deleteBatch(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n internal\\n {\\n require(\\n _batchHeader.batchIndex < batches().length(),\\n \\\"Invalid batch index.\\\"\\n );\\n\\n require(\\n _isValidBatchHeader(_batchHeader),\\n \\\"Invalid batch header.\\\"\\n );\\n\\n batches().deleteElementsAfterInclusive(\\n _batchHeader.batchIndex,\\n _makeBatchExtraData(\\n uint40(_batchHeader.prevTotalElements),\\n 0\\n )\\n );\\n\\n emit StateBatchDeleted(\\n _batchHeader.batchIndex,\\n _batchHeader.batchRoot\\n );\\n }\\n\\n /**\\n * Checks that a batch header matches the stored hash for the given index.\\n * @param _batchHeader Batch header to validate.\\n * @return Whether or not the header matches the stored one.\\n */\\n function _isValidBatchHeader(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n internal\\n view\\n returns (\\n bool\\n )\\n {\\n return Lib_OVMCodec.hashBatchHeader(_batchHeader) == batches().get(_batchHeader.batchIndex);\\n }\\n}\\n\",\"keccak256\":\"0x5b72c845f856a06c978880d3cb2db40dafebaebf399df100c6ac832eaf41d7bd\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_CanonicalTransactionChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_ChainStorageContainer } from \\\"./iOVM_ChainStorageContainer.sol\\\";\\n\\n/**\\n * @title iOVM_CanonicalTransactionChain\\n */\\ninterface iOVM_CanonicalTransactionChain {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event TransactionEnqueued(\\n address _l1TxOrigin,\\n address _target,\\n uint256 _gasLimit,\\n bytes _data,\\n uint256 _queueIndex,\\n uint256 _timestamp\\n );\\n\\n event QueueBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event SequencerBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event TransactionBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct BatchContext {\\n uint256 numSequencedTransactions;\\n uint256 numSubsequentQueueTransactions;\\n uint256 timestamp;\\n uint256 blockNumber;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n\\n /**\\n * Accesses the batch storage container.\\n * @return Reference to the batch storage container.\\n */\\n function batches()\\n external\\n view\\n returns (\\n iOVM_ChainStorageContainer\\n );\\n\\n /**\\n * Accesses the queue storage container.\\n * @return Reference to the queue storage container.\\n */\\n function queue()\\n external\\n view\\n returns (\\n iOVM_ChainStorageContainer\\n );\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements()\\n external\\n view\\n returns (\\n uint256 _totalElements\\n );\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches()\\n external\\n view\\n returns (\\n uint256 _totalBatches\\n );\\n\\n /**\\n * Returns the index of the next element to be enqueued.\\n * @return Index for the next queue element.\\n */\\n function getNextQueueIndex()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Gets the queue element at a particular index.\\n * @param _index Index of the queue element to access.\\n * @return _element Queue element at the given index.\\n */\\n function getQueueElement(\\n uint256 _index\\n )\\n external\\n view\\n returns (\\n Lib_OVMCodec.QueueElement memory _element\\n );\\n\\n /**\\n * Returns the timestamp of the last transaction.\\n * @return Timestamp for the last transaction.\\n */\\n function getLastTimestamp()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Returns the blocknumber of the last transaction.\\n * @return Blocknumber for the last transaction.\\n */\\n function getLastBlockNumber()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Get the number of queue elements which have not yet been included.\\n * @return Number of pending queue elements.\\n */\\n function getNumPendingQueueElements()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Retrieves the length of the queue, including\\n * both pending and canonical transactions.\\n * @return Length of the queue.\\n */\\n function getQueueLength()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n\\n /**\\n * Adds a transaction to the queue.\\n * @param _target Target contract to send the transaction to.\\n * @param _gasLimit Gas limit for the given transaction.\\n * @param _data Transaction data.\\n */\\n function enqueue(\\n address _target,\\n uint256 _gasLimit,\\n bytes memory _data\\n )\\n external;\\n\\n /**\\n * Appends a given number of queued transactions as a single batch.\\n * @param _numQueuedTransactions Number of transactions to append.\\n */\\n function appendQueueBatch(\\n uint256 _numQueuedTransactions\\n )\\n external;\\n\\n /**\\n * Allows the sequencer to append a batch of transactions.\\n * @dev This function uses a custom encoding scheme for efficiency reasons.\\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\\n * .param _contexts Array of batch contexts.\\n * .param _transactionDataFields Array of raw transaction data.\\n */\\n function appendSequencerBatch(\\n // uint40 _shouldStartAtElement,\\n // uint24 _totalElementsToAppend,\\n // BatchContext[] _contexts,\\n // bytes[] _transactionDataFields\\n )\\n external;\\n\\n /**\\n * Verifies whether a transaction is included in the chain.\\n * @param _transaction Transaction to verify.\\n * @param _txChainElement Transaction chain element corresponding to the transaction.\\n * @param _batchHeader Header of the batch the transaction was included in.\\n * @param _inclusionProof Inclusion proof for the provided transaction chain element.\\n * @return True if the transaction exists in the CTC, false if not.\\n */\\n function verifyTransaction(\\n Lib_OVMCodec.Transaction memory _transaction,\\n Lib_OVMCodec.TransactionChainElement memory _txChainElement,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _inclusionProof\\n )\\n external\\n view\\n returns (\\n bool\\n );\\n}\\n\",\"keccak256\":\"0xb5e55488a1982841c07cdf5ff475da4789596f111dd48f01b1918ee4c775cf3a\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_ChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title iOVM_ChainStorageContainer\\n */\\ninterface iOVM_ChainStorageContainer {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata()\\n external\\n view\\n returns (\\n bytes27\\n );\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length()\\n external\\n view\\n returns (\\n uint256\\n );\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(\\n bytes32 _object\\n )\\n external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(\\n bytes32 _object,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(\\n uint256 _index\\n )\\n external\\n view\\n returns (\\n bytes32\\n );\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index\\n )\\n external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Marks an index as overwritable, meaing the underlying buffer can start to write values over\\n * any objects before and including the given index.\\n */\\n function setNextOverwritableIndex(\\n uint256 _index\\n )\\n external;\\n}\\n\",\"keccak256\":\"0x2d7973a0ad84c23ec62624d3f1e3aeb198cc72686ff1e6cfa17155556b320c94\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_StateCommitmentChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title iOVM_StateCommitmentChain\\n */\\ninterface iOVM_StateCommitmentChain {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event StateBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n event StateBatchDeleted(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot\\n );\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements()\\n external\\n view\\n returns (\\n uint256 _totalElements\\n );\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches()\\n external\\n view\\n returns (\\n uint256 _totalBatches\\n );\\n\\n /**\\n * Retrieves the timestamp of the last batch submitted by the sequencer.\\n * @return _lastSequencerTimestamp Last sequencer batch timestamp.\\n */\\n function getLastSequencerTimestamp()\\n external\\n view\\n returns (\\n uint256 _lastSequencerTimestamp\\n );\\n\\n /**\\n * Appends a batch of state roots to the chain.\\n * @param _batch Batch of state roots.\\n * @param _shouldStartAtElement Index of the element at which this batch should start.\\n */\\n function appendStateBatch(\\n bytes32[] calldata _batch,\\n uint256 _shouldStartAtElement\\n )\\n external;\\n\\n /**\\n * Deletes all state roots after (and including) a given batch.\\n * @param _batchHeader Header of the batch to start deleting from.\\n */\\n function deleteStateBatch(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n external;\\n\\n /**\\n * Verifies a batch inclusion proof.\\n * @param _element Hash of the element to verify a proof for.\\n * @param _batchHeader Header of the batch in which the element was included.\\n * @param _proof Merkle inclusion proof for the element.\\n */\\n function verifyStateCommitment(\\n bytes32 _element,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _proof\\n )\\n external\\n view\\n returns (\\n bool _verified\\n );\\n\\n /**\\n * Checks whether a given batch is still inside its fraud proof window.\\n * @param _batchHeader Header of the batch to check.\\n * @return _inside Whether or not the batch is inside the fraud proof window.\\n */\\n function insideFraudProofWindow(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n external\\n view\\n returns (\\n bool _inside\\n );\\n}\\n\",\"keccak256\":\"0x6646d6ff392b81aab52a7a277e91540819464751de0af5afd1962094b2e92448\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/verification/iOVM_BondManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\ninterface ERC20 {\\n function transfer(address, uint256) external returns (bool);\\n function transferFrom(address, address, uint256) external returns (bool);\\n}\\n\\n/// All the errors which may be encountered on the bond manager\\nlibrary Errors {\\n string constant ERC20_ERR = \\\"BondManager: Could not post bond\\\";\\n string constant ALREADY_FINALIZED = \\\"BondManager: Fraud proof for this pre-state root has already been finalized\\\";\\n string constant SLASHED = \\\"BondManager: Cannot finalize withdrawal, you probably got slashed\\\";\\n string constant WRONG_STATE = \\\"BondManager: Wrong bond state for proposer\\\";\\n string constant CANNOT_CLAIM = \\\"BondManager: Cannot claim yet. Dispute must be finalized first\\\";\\n\\n string constant WITHDRAWAL_PENDING = \\\"BondManager: Withdrawal already pending\\\";\\n string constant TOO_EARLY = \\\"BondManager: Too early to finalize your withdrawal\\\";\\n\\n string constant ONLY_TRANSITIONER = \\\"BondManager: Only the transitioner for this pre-state root may call this function\\\";\\n string constant ONLY_FRAUD_VERIFIER = \\\"BondManager: Only the fraud verifier may call this function\\\";\\n string constant ONLY_STATE_COMMITMENT_CHAIN = \\\"BondManager: Only the state commitment chain may call this function\\\";\\n string constant WAIT_FOR_DISPUTES = \\\"BondManager: Wait for other potential disputes\\\";\\n}\\n\\n/**\\n * @title iOVM_BondManager\\n */\\ninterface iOVM_BondManager {\\n\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n /// The lifecycle of a proposer's bond\\n enum State {\\n // Before depositing or after getting slashed, a user is uncollateralized\\n NOT_COLLATERALIZED,\\n // After depositing, a user is collateralized\\n COLLATERALIZED,\\n // After a user has initiated a withdrawal\\n WITHDRAWING\\n }\\n\\n /// A bond posted by a proposer\\n struct Bond {\\n // The user's state\\n State state;\\n // The timestamp at which a proposer issued their withdrawal request\\n uint32 withdrawalTimestamp;\\n // The time when the first disputed was initiated for this bond\\n uint256 firstDisputeAt;\\n // The earliest observed state root for this bond which has had fraud\\n bytes32 earliestDisputedStateRoot;\\n // The state root's timestamp\\n uint256 earliestTimestamp;\\n }\\n\\n // Per pre-state root, store the number of state provisions that were made\\n // and how many of these calls were made by each user. Payouts will then be\\n // claimed by users proportionally for that dispute.\\n struct Rewards {\\n // Flag to check if rewards for a fraud proof are claimable\\n bool canClaim;\\n // Total number of `recordGasSpent` calls made\\n uint256 total;\\n // The gas spent by each user to provide witness data. The sum of all\\n // values inside this map MUST be equal to the value of `total`\\n mapping(address => uint256) gasSpent;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function recordGasSpent(\\n bytes32 _preStateRoot,\\n bytes32 _txHash,\\n address _who,\\n uint256 _gasSpent\\n ) external;\\n\\n function finalize(\\n bytes32 _preStateRoot,\\n address _publisher,\\n uint256 _timestamp\\n ) external;\\n\\n function deposit() external;\\n\\n function startWithdrawal() external;\\n\\n function finalizeWithdrawal() external;\\n\\n function claim(\\n address _who\\n ) external;\\n\\n function isCollateralized(\\n address _who\\n ) external view returns (bool);\\n\\n function getGasSpent(\\n bytes32 _preStateRoot,\\n address _who\\n ) external view returns (uint256);\\n}\\n\",\"keccak256\":\"0x3c2a8a399487857158649db1896749d86e39cba545a8aeb2e2bb0f3bdfa7a5b1\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/verification/iOVM_FraudVerifier.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_StateTransitioner } from \\\"./iOVM_StateTransitioner.sol\\\";\\n\\n/**\\n * @title iOVM_FraudVerifier\\n */\\ninterface iOVM_FraudVerifier {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event FraudProofInitialized(\\n bytes32 _preStateRoot,\\n uint256 _preStateRootIndex,\\n bytes32 _transactionHash,\\n address _who\\n );\\n\\n event FraudProofFinalized(\\n bytes32 _preStateRoot,\\n uint256 _preStateRootIndex,\\n bytes32 _transactionHash,\\n address _who\\n );\\n\\n\\n /***************************************\\n * Public Functions: Transition Status *\\n ***************************************/\\n\\n function getStateTransitioner(bytes32 _preStateRoot, bytes32 _txHash) external view returns (iOVM_StateTransitioner _transitioner);\\n\\n\\n /****************************************\\n * Public Functions: Fraud Verification *\\n ****************************************/\\n\\n function initializeFraudVerification(\\n bytes32 _preStateRoot,\\n Lib_OVMCodec.ChainBatchHeader calldata _preStateRootBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof calldata _preStateRootProof,\\n Lib_OVMCodec.Transaction calldata _transaction,\\n Lib_OVMCodec.TransactionChainElement calldata _txChainElement,\\n Lib_OVMCodec.ChainBatchHeader calldata _transactionBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof calldata _transactionProof\\n ) external;\\n\\n function finalizeFraudVerification(\\n bytes32 _preStateRoot,\\n Lib_OVMCodec.ChainBatchHeader calldata _preStateRootBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof calldata _preStateRootProof,\\n bytes32 _txHash,\\n bytes32 _postStateRoot,\\n Lib_OVMCodec.ChainBatchHeader calldata _postStateRootBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof calldata _postStateRootProof\\n ) external;\\n}\\n\",\"keccak256\":\"0x5efd7bb18164bbd3e9d58379e8203fbf2a7ee802b1a48dff3ceaaec1523b1751\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/verification/iOVM_StateTransitioner.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title iOVM_StateTransitioner\\n */\\ninterface iOVM_StateTransitioner {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AccountCommitted(\\n address _address\\n );\\n\\n event ContractStorageCommitted(\\n address _address,\\n bytes32 _key\\n );\\n\\n\\n /**********************************\\n * Public Functions: State Access *\\n **********************************/\\n\\n function getPreStateRoot() external view returns (bytes32 _preStateRoot);\\n function getPostStateRoot() external view returns (bytes32 _postStateRoot);\\n function isComplete() external view returns (bool _complete);\\n\\n\\n /***********************************\\n * Public Functions: Pre-Execution *\\n ***********************************/\\n\\n function proveContractState(\\n address _ovmContractAddress,\\n address _ethContractAddress,\\n bytes calldata _stateTrieWitness\\n ) external;\\n\\n function proveStorageSlot(\\n address _ovmContractAddress,\\n bytes32 _key,\\n bytes calldata _storageTrieWitness\\n ) external;\\n\\n\\n /*******************************\\n * Public Functions: Execution *\\n *******************************/\\n\\n function applyTransaction(\\n Lib_OVMCodec.Transaction calldata _transaction\\n ) external;\\n\\n\\n /************************************\\n * Public Functions: Post-Execution *\\n ************************************/\\n\\n function commitContractState(\\n address _ovmContractAddress,\\n bytes calldata _stateTrieWitness\\n ) external;\\n\\n function commitStorageSlot(\\n address _ovmContractAddress,\\n bytes32 _key,\\n bytes calldata _storageTrieWitness\\n ) external;\\n\\n\\n /**********************************\\n * Public Functions: Finalization *\\n **********************************/\\n\\n function completeTransition() external;\\n}\\n\",\"keccak256\":\"0x3d044ac0a3bb6ad3d529f904b3191117511f9c379678ca03010e1ebdfcb5c34b\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/codec/Lib_OVMCodec.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../utils/Lib_Bytes32Utils.sol\\\";\\nimport { Lib_SafeExecutionManagerWrapper } from \\\"../../libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\\\";\\n\\n/**\\n * @title Lib_OVMCodec\\n */\\nlibrary Lib_OVMCodec {\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum EOASignatureType {\\n EIP155_TRANSACTION,\\n ETH_SIGNED_MESSAGE\\n }\\n\\n enum QueueOrigin {\\n SEQUENCER_QUEUE,\\n L1TOL2_QUEUE\\n }\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Account {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n address ethAddress;\\n bool isFresh;\\n }\\n\\n struct EVMAccount {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n }\\n\\n struct ChainBatchHeader {\\n uint256 batchIndex;\\n bytes32 batchRoot;\\n uint256 batchSize;\\n uint256 prevTotalElements;\\n bytes extraData;\\n }\\n\\n struct ChainInclusionProof {\\n uint256 index;\\n bytes32[] siblings;\\n }\\n\\n struct Transaction {\\n uint256 timestamp;\\n uint256 blockNumber;\\n QueueOrigin l1QueueOrigin;\\n address l1TxOrigin;\\n address entrypoint;\\n uint256 gasLimit;\\n bytes data;\\n }\\n\\n struct TransactionChainElement {\\n bool isSequenced;\\n uint256 queueIndex; // QUEUED TX ONLY\\n uint256 timestamp; // SEQUENCER TX ONLY\\n uint256 blockNumber; // SEQUENCER TX ONLY\\n bytes txData; // SEQUENCER TX ONLY\\n }\\n\\n struct QueueElement {\\n bytes32 transactionHash;\\n uint40 timestamp;\\n uint40 blockNumber;\\n }\\n\\n struct EIP155Transaction {\\n uint256 nonce;\\n uint256 gasPrice;\\n uint256 gasLimit;\\n address to;\\n uint256 value;\\n bytes data;\\n uint256 chainId;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Decodes an EOA transaction (i.e., native Ethereum RLP encoding).\\n * @param _transaction Encoded EOA transaction.\\n * @return Transaction decoded into a struct.\\n */\\n function decodeEIP155Transaction(\\n bytes memory _transaction,\\n bool _isEthSignedMessage\\n )\\n internal\\n pure\\n returns (\\n EIP155Transaction memory\\n )\\n {\\n if (_isEthSignedMessage) {\\n (\\n uint256 _nonce,\\n uint256 _gasLimit,\\n uint256 _gasPrice,\\n uint256 _chainId,\\n address _to,\\n bytes memory _data\\n ) = abi.decode(\\n _transaction,\\n (uint256, uint256, uint256, uint256, address ,bytes)\\n );\\n return EIP155Transaction({\\n nonce: _nonce,\\n gasPrice: _gasPrice,\\n gasLimit: _gasLimit,\\n to: _to,\\n value: 0,\\n data: _data,\\n chainId: _chainId\\n });\\n } else {\\n Lib_RLPReader.RLPItem[] memory decoded = Lib_RLPReader.readList(_transaction);\\n\\n return EIP155Transaction({\\n nonce: Lib_RLPReader.readUint256(decoded[0]),\\n gasPrice: Lib_RLPReader.readUint256(decoded[1]),\\n gasLimit: Lib_RLPReader.readUint256(decoded[2]),\\n to: Lib_RLPReader.readAddress(decoded[3]),\\n value: Lib_RLPReader.readUint256(decoded[4]),\\n data: Lib_RLPReader.readBytes(decoded[5]),\\n chainId: Lib_RLPReader.readUint256(decoded[6])\\n });\\n }\\n }\\n\\n /**\\n * Decompresses a compressed EIP155 transaction.\\n * @param _transaction Compressed EIP155 transaction bytes.\\n * @return Transaction parsed into a struct.\\n */\\n function decompressEIP155Transaction(\\n bytes memory _transaction\\n )\\n internal\\n returns (\\n EIP155Transaction memory\\n )\\n {\\n return EIP155Transaction({\\n gasLimit: Lib_BytesUtils.toUint24(_transaction, 0),\\n gasPrice: uint256(Lib_BytesUtils.toUint24(_transaction, 3)) * 1000000,\\n nonce: Lib_BytesUtils.toUint24(_transaction, 6),\\n to: Lib_BytesUtils.toAddress(_transaction, 9),\\n data: Lib_BytesUtils.slice(_transaction, 29),\\n chainId: Lib_SafeExecutionManagerWrapper.safeCHAINID(),\\n value: 0\\n });\\n }\\n\\n /**\\n * Encodes an EOA transaction back into the original transaction.\\n * @param _transaction EIP155transaction to encode.\\n * @param _isEthSignedMessage Whether or not this was an eth signed message.\\n * @return Encoded transaction.\\n */\\n function encodeEIP155Transaction(\\n EIP155Transaction memory _transaction,\\n bool _isEthSignedMessage\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n if (_isEthSignedMessage) {\\n return abi.encode(\\n _transaction.nonce,\\n _transaction.gasLimit,\\n _transaction.gasPrice,\\n _transaction.chainId,\\n _transaction.to,\\n _transaction.data\\n );\\n } else {\\n bytes[] memory raw = new bytes[](9);\\n\\n raw[0] = Lib_RLPWriter.writeUint(_transaction.nonce);\\n raw[1] = Lib_RLPWriter.writeUint(_transaction.gasPrice);\\n raw[2] = Lib_RLPWriter.writeUint(_transaction.gasLimit);\\n if (_transaction.to == address(0)) {\\n raw[3] = Lib_RLPWriter.writeBytes('');\\n } else {\\n raw[3] = Lib_RLPWriter.writeAddress(_transaction.to);\\n }\\n raw[4] = Lib_RLPWriter.writeUint(0);\\n raw[5] = Lib_RLPWriter.writeBytes(_transaction.data);\\n raw[6] = Lib_RLPWriter.writeUint(_transaction.chainId);\\n raw[7] = Lib_RLPWriter.writeBytes(bytes(''));\\n raw[8] = Lib_RLPWriter.writeBytes(bytes(''));\\n\\n return Lib_RLPWriter.writeList(raw);\\n }\\n }\\n\\n /**\\n * Encodes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Encoded transaction bytes.\\n */\\n function encodeTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return abi.encodePacked(\\n _transaction.timestamp,\\n _transaction.blockNumber,\\n _transaction.l1QueueOrigin,\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n );\\n }\\n\\n /**\\n * Hashes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Hashed transaction\\n */\\n function hashTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(encodeTransaction(_transaction));\\n }\\n\\n /**\\n * Converts an OVM account to an EVM account.\\n * @param _in OVM account to convert.\\n * @return Converted EVM account.\\n */\\n function toEVMAccount(\\n Account memory _in\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n return EVMAccount({\\n nonce: _in.nonce,\\n balance: _in.balance,\\n storageRoot: _in.storageRoot,\\n codeHash: _in.codeHash\\n });\\n }\\n\\n /**\\n * @notice RLP-encodes an account state struct.\\n * @param _account Account state struct.\\n * @return RLP-encoded account state.\\n */\\n function encodeEVMAccount(\\n EVMAccount memory _account\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes[] memory raw = new bytes[](4);\\n\\n // Unfortunately we can't create this array outright because\\n // Lib_RLPWriter.writeList will reject fixed-size arrays. Assigning\\n // index-by-index circumvents this issue.\\n raw[0] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.nonce)\\n )\\n );\\n raw[1] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.balance)\\n )\\n );\\n raw[2] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.storageRoot));\\n raw[3] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.codeHash));\\n\\n return Lib_RLPWriter.writeList(raw);\\n }\\n\\n /**\\n * @notice Decodes an RLP-encoded account state into a useful struct.\\n * @param _encoded RLP-encoded account state.\\n * @return Account state struct.\\n */\\n function decodeEVMAccount(\\n bytes memory _encoded\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\\n\\n return EVMAccount({\\n nonce: Lib_RLPReader.readUint256(accountState[0]),\\n balance: Lib_RLPReader.readUint256(accountState[1]),\\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\\n });\\n }\\n\\n /**\\n * Calculates a hash for a given batch header.\\n * @param _batchHeader Header to hash.\\n * @return Hash of the header.\\n */\\n function hashBatchHeader(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(\\n abi.encode(\\n _batchHeader.batchRoot,\\n _batchHeader.batchSize,\\n _batchHeader.prevTotalElements,\\n _batchHeader.extraData\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0xe7e518ba7bba3fa28c532f8902576c1bb4dfc1ec4b62bed6da50623248ba17c3\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Contract Imports */\\nimport { Ownable } from \\\"./Lib_Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n public\\n onlyOwner\\n {\\n addresses[_getNameHash(_name)] = _address;\\n\\n emit AddressSet(\\n _name,\\n _address\\n );\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0x36473d229ce0ba9d1cac5f02f84be843d9dcc8008525590a1652a2c2636f95f2\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(\\n address _libAddressManager\\n ) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x65981feeabff6a81783ea97d44baf988a18a86c8cb374c46fdb71819cbacc7c0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Ownable\\n * @dev Adapted from https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol\\n */\\nabstract contract Ownable {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n address public owner;\\n\\n\\n /**********\\n * Events *\\n **********/\\n\\n event OwnershipTransferred(\\n address indexed previousOwner,\\n address indexed newOwner\\n );\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n constructor() {\\n owner = msg.sender;\\n emit OwnershipTransferred(address(0), owner);\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n owner == msg.sender,\\n \\\"Ownable: caller is not the owner\\\"\\n );\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the owner of this contract to the zero address, effectively renouncing ownership\\n * completely. Can only be called by the current owner of this contract.\\n */\\n function renounceOwnership()\\n public\\n virtual\\n onlyOwner\\n {\\n emit OwnershipTransferred(owner, address(0));\\n owner = address(0);\\n }\\n\\n /**\\n * Transfers ownership of this contract to a new address. Can only be called by the current\\n * owner of this contract.\\n * @param _newOwner Address of the new contract owner.\\n */\\n function transferOwnership(\\n address _newOwner\\n )\\n public\\n virtual\\n onlyOwner\\n {\\n require(\\n _newOwner != address(0),\\n \\\"Ownable: new owner cannot be the zero address\\\"\\n );\\n\\n emit OwnershipTransferred(owner, _newOwner);\\n owner = _newOwner;\\n }\\n}\\n\",\"keccak256\":\"0x83f9a6c4608b5929086429205b00f8211cdfcba83f3c84520f24d8aa64fe4b82\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPReader.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_RLPReader\\n * @dev Adapted from \\\"RLPReader\\\" by Hamdi Allam (hamdi.allam97@gmail.com).\\n */\\nlibrary Lib_RLPReader {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 constant internal MAX_LIST_LENGTH = 32;\\n\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum RLPItemType {\\n DATA_ITEM,\\n LIST_ITEM\\n }\\n\\n \\n /***********\\n * Structs *\\n ***********/\\n\\n struct RLPItem {\\n uint256 length;\\n uint256 ptr;\\n }\\n \\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n \\n /**\\n * Converts bytes to a reference to memory position and length.\\n * @param _in Input bytes to convert.\\n * @return Output memory reference.\\n */\\n function toRLPItem(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem memory\\n )\\n {\\n uint256 ptr;\\n assembly {\\n ptr := add(_in, 32)\\n }\\n\\n return RLPItem({\\n length: _in.length,\\n ptr: ptr\\n });\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n (\\n uint256 listOffset,\\n ,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.LIST_ITEM,\\n \\\"Invalid RLP list value.\\\"\\n );\\n\\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\\n // writing to the length. Since we can't know the number of RLP items without looping over\\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\\n // simply set a reasonable maximum list length and decrease the size before we finish.\\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\\n\\n uint256 itemCount = 0;\\n uint256 offset = listOffset;\\n while (offset < _in.length) {\\n require(\\n itemCount < MAX_LIST_LENGTH,\\n \\\"Provided RLP list exceeds max list length.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n ) = _decodeLength(RLPItem({\\n length: _in.length - offset,\\n ptr: _in.ptr + offset\\n }));\\n\\n out[itemCount] = RLPItem({\\n length: itemLength + itemOffset,\\n ptr: _in.ptr + offset\\n });\\n\\n itemCount += 1;\\n offset += itemOffset + itemLength;\\n }\\n\\n // Decrease the array size to match the actual item count.\\n assembly {\\n mstore(out, itemCount)\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n return readList(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes value.\\\"\\n );\\n\\n return _copy(_in.ptr, itemOffset, itemLength);\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return readBytes(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return string(readBytes(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return readString(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n require(\\n _in.length <= 33,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr + itemOffset;\\n bytes32 out;\\n assembly {\\n out := mload(ptr)\\n\\n // Shift the bytes over to match the item size.\\n if lt(itemLength, 32) {\\n out := div(out, exp(256, sub(32, itemLength)))\\n }\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return readBytes32(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return uint256(readBytes32(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return readUint256(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n require(\\n _in.length == 1,\\n \\\"Invalid RLP boolean value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 out;\\n assembly {\\n out := byte(0, mload(ptr))\\n }\\n\\n require(\\n out == 0 || out == 1,\\n \\\"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\\\"\\n );\\n\\n return out != 0;\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return readBool(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n if (_in.length == 1) {\\n return address(0);\\n }\\n\\n require(\\n _in.length == 21,\\n \\\"Invalid RLP address value.\\\"\\n );\\n\\n return address(readUint256(_in));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return readAddress(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads the raw bytes of an RLP item.\\n * @param _in RLP item to read.\\n * @return Raw RLP bytes.\\n */\\n function readRawBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in);\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Decodes the length of an RLP item.\\n * @param _in RLP item to decode.\\n * @return Offset of the encoded data.\\n * @return Length of the encoded data.\\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\\n */\\n function _decodeLength(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n uint256,\\n uint256,\\n RLPItemType\\n )\\n {\\n require(\\n _in.length > 0,\\n \\\"RLP item cannot be null.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 prefix;\\n assembly {\\n prefix := byte(0, mload(ptr))\\n }\\n\\n if (prefix <= 0x7f) {\\n // Single byte.\\n\\n return (0, 1, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xb7) {\\n // Short string.\\n\\n uint256 strLen = prefix - 0x80;\\n \\n require(\\n _in.length > strLen,\\n \\\"Invalid RLP short string.\\\"\\n );\\n\\n return (1, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xbf) {\\n // Long string.\\n uint256 lenOfStrLen = prefix - 0xb7;\\n\\n require(\\n _in.length > lenOfStrLen,\\n \\\"Invalid RLP long string length.\\\"\\n );\\n\\n uint256 strLen;\\n assembly {\\n // Pick out the string length.\\n strLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfStrLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfStrLen + strLen,\\n \\\"Invalid RLP long string.\\\"\\n );\\n\\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xf7) {\\n // Short list.\\n uint256 listLen = prefix - 0xc0;\\n\\n require(\\n _in.length > listLen,\\n \\\"Invalid RLP short list.\\\"\\n );\\n\\n return (1, listLen, RLPItemType.LIST_ITEM);\\n } else {\\n // Long list.\\n uint256 lenOfListLen = prefix - 0xf7;\\n\\n require(\\n _in.length > lenOfListLen,\\n \\\"Invalid RLP long list length.\\\"\\n );\\n\\n uint256 listLen;\\n assembly {\\n // Pick out the list length.\\n listLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfListLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfListLen + listLen,\\n \\\"Invalid RLP long list.\\\"\\n );\\n\\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\\n }\\n }\\n\\n /**\\n * Copies the bytes from a memory location.\\n * @param _src Pointer to the location to read from.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Copied bytes.\\n */\\n function _copy(\\n uint256 _src,\\n uint256 _offset,\\n uint256 _length\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out = new bytes(_length);\\n if (out.length == 0) {\\n return out;\\n }\\n\\n uint256 src = _src + _offset;\\n uint256 dest;\\n assembly {\\n dest := add(out, 32)\\n }\\n\\n // Copy over as many complete words as we can.\\n for (uint256 i = 0; i < _length / 32; i++) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n\\n src += 32;\\n dest += 32;\\n }\\n\\n // Pick out the remaining bytes.\\n uint256 mask = 256 ** (32 - (_length % 32)) - 1;\\n assembly {\\n mstore(\\n dest,\\n or(\\n and(mload(src), not(mask)),\\n and(mload(dest), mask)\\n )\\n )\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Copies an RLP item into bytes.\\n * @param _in RLP item to copy.\\n * @return Copied bytes.\\n */\\n function _copy(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in.ptr, 0, _in.length);\\n }\\n}\\n\",\"keccak256\":\"0xbdb8fae0ca2483b4cc07607a5070fc25e33c54b4e4462b99e7c0b13aac48a09b\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPWriter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\n\\n/**\\n * @title Lib_RLPWriter\\n * @author Bakaoh (with modifications)\\n */\\nlibrary Lib_RLPWriter {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * RLP encodes a byte string.\\n * @param _in The byte string to encode.\\n * @return _out The RLP encoded string in bytes.\\n */\\n function writeBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n bytes memory encoded;\\n\\n if (_in.length == 1 && uint8(_in[0]) < 128) {\\n encoded = _in;\\n } else {\\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * RLP encodes a list of RLP encoded byte byte strings.\\n * @param _in The list of RLP encoded byte strings.\\n * @return _out The RLP encoded list of items in bytes.\\n */\\n function writeList(\\n bytes[] memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n bytes memory list = _flatten(_in);\\n return abi.encodePacked(_writeLength(list.length, 192), list);\\n }\\n\\n /**\\n * RLP encodes a string.\\n * @param _in The string to encode.\\n * @return _out The RLP encoded string in bytes.\\n */\\n function writeString(\\n string memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(bytes(_in));\\n }\\n\\n /**\\n * RLP encodes an address.\\n * @param _in The address to encode.\\n * @return _out The RLP encoded address in bytes.\\n */\\n function writeAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a uint.\\n * @param _in The uint256 to encode.\\n * @return _out The RLP encoded uint256 in bytes.\\n */\\n function writeUint(\\n uint256 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(_toBinary(_in));\\n }\\n\\n /**\\n * RLP encodes a bool.\\n * @param _in The bool to encode.\\n * @return _out The RLP encoded bool in bytes.\\n */\\n function writeBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n bytes memory encoded = new bytes(1);\\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\\n return encoded;\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\\n * @param _len The length of the string or the payload.\\n * @param _offset 128 if item is string, 192 if item is list.\\n * @return _encoded RLP encoded bytes.\\n */\\n function _writeLength(\\n uint256 _len,\\n uint256 _offset\\n )\\n private\\n pure\\n returns (\\n bytes memory _encoded\\n )\\n {\\n bytes memory encoded;\\n\\n if (_len < 56) {\\n encoded = new bytes(1);\\n encoded[0] = byte(uint8(_len) + uint8(_offset));\\n } else {\\n uint256 lenLen;\\n uint256 i = 1;\\n while (_len / i != 0) {\\n lenLen++;\\n i *= 256;\\n }\\n\\n encoded = new bytes(lenLen + 1);\\n encoded[0] = byte(uint8(lenLen) + uint8(_offset) + 55);\\n for(i = 1; i <= lenLen; i++) {\\n encoded[i] = byte(uint8((_len / (256**(lenLen-i))) % 256));\\n }\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * Encode integer in big endian binary form with no leading zeroes.\\n * @notice TODO: This should be optimized with assembly to save gas costs.\\n * @param _x The integer to encode.\\n * @return _binary RLP encoded bytes.\\n */\\n function _toBinary(\\n uint256 _x\\n )\\n private\\n pure\\n returns (\\n bytes memory _binary\\n )\\n {\\n bytes memory b = abi.encodePacked(_x);\\n\\n uint256 i = 0;\\n for (; i < 32; i++) {\\n if (b[i] != 0) {\\n break;\\n }\\n }\\n\\n bytes memory res = new bytes(32 - i);\\n for (uint256 j = 0; j < res.length; j++) {\\n res[j] = b[i++];\\n }\\n\\n return res;\\n }\\n\\n /**\\n * Copies a piece of memory to another location.\\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\\n * @param _dest Destination location.\\n * @param _src Source location.\\n * @param _len Length of memory to copy.\\n */\\n function _memcpy(\\n uint256 _dest,\\n uint256 _src,\\n uint256 _len\\n )\\n private\\n pure\\n {\\n uint256 dest = _dest;\\n uint256 src = _src;\\n uint256 len = _len;\\n\\n for(; len >= 32; len -= 32) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n dest += 32;\\n src += 32;\\n }\\n\\n uint256 mask = 256 ** (32 - len) - 1;\\n assembly {\\n let srcpart := and(mload(src), not(mask))\\n let destpart := and(mload(dest), mask)\\n mstore(dest, or(destpart, srcpart))\\n }\\n }\\n\\n /**\\n * Flattens a list of byte strings into one byte string.\\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\\n * @param _list List of byte strings to flatten.\\n * @return _flattened The flattened byte string.\\n */\\n function _flatten(\\n bytes[] memory _list\\n )\\n private\\n pure\\n returns (\\n bytes memory _flattened\\n )\\n {\\n if (_list.length == 0) {\\n return new bytes(0);\\n }\\n\\n uint256 len;\\n uint256 i = 0;\\n for (; i < _list.length; i++) {\\n len += _list[i].length;\\n }\\n\\n bytes memory flattened = new bytes(len);\\n uint256 flattenedPtr;\\n assembly { flattenedPtr := add(flattened, 0x20) }\\n\\n for(i = 0; i < _list.length; i++) {\\n bytes memory item = _list[i];\\n\\n uint256 listPtr;\\n assembly { listPtr := add(item, 0x20)}\\n\\n _memcpy(flattenedPtr, listPtr, item.length);\\n flattenedPtr += _list[i].length;\\n }\\n\\n return flattened;\\n }\\n}\",\"keccak256\":\"0xbcb24619c1758cb0d9f3fe5c79495950045a9087046a02b9ce01df46ae09ae5b\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_Bytes32Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_Byte32Utils\\n */\\nlibrary Lib_Bytes32Utils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \\\"true.\\\"\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as a boolean.\\n */\\n function toBool(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return _in != 0;\\n }\\n\\n /**\\n * Converts a boolean to a bytes32 value.\\n * @param _in Input boolean value.\\n * @return Boolean as a bytes32.\\n */\\n function fromBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in ? 1 : 0));\\n }\\n\\n /**\\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as an address.\\n */\\n function toAddress(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return address(uint160(uint256(_in)));\\n }\\n\\n /**\\n * Converts an address to a bytes32.\\n * @param _in Input address value.\\n * @return Address as a bytes32.\\n */\\n function fromAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in));\\n }\\n\\n /**\\n * Removes the leading zeros from a bytes32 value and returns a new (smaller) bytes value.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 without any leading zeros.\\n */\\n function removeLeadingZeros(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out;\\n\\n assembly {\\n // Figure out how many leading zero bytes to remove.\\n let shift := 0\\n for { let i := 0 } and(lt(i, 32), eq(byte(i, _in), 0)) { i := add(i, 1) } {\\n shift := add(shift, 1)\\n }\\n\\n // Reserve some space for our output and fix the free memory pointer.\\n out := mload(0x40)\\n mstore(0x40, add(out, 0x40))\\n\\n // Shift the value and store it into the output bytes.\\n mstore(add(out, 0x20), shl(mul(shift, 8), _in))\\n\\n // Store the new size (with leading zero bytes removed) in the output byte size.\\n mstore(out, sub(32, shift))\\n }\\n\\n return out;\\n }\\n}\\n\",\"keccak256\":\"0xfa2def593e3fc56a31852c3744aefdaa93cec74e721bfcfeb1e5d166c7c60b64\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_BytesUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_BytesUtils\\n */\\nlibrary Lib_BytesUtils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_start + _length >= _start, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n if (_bytes.length - _start == 0) {\\n return bytes('');\\n }\\n\\n return slice(_bytes, _start, _bytes.length - _start);\\n }\\n\\n function toBytes32PadLeft(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes32)\\n {\\n bytes32 ret;\\n uint256 len = _bytes.length <= 32 ? _bytes.length : 32;\\n assembly {\\n ret := shr(mul(sub(32, len), 8), mload(add(_bytes, 32)))\\n }\\n return ret;\\n }\\n\\n function toBytes32(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes32)\\n {\\n if (_bytes.length < 32) {\\n bytes32 ret;\\n assembly {\\n ret := mload(add(_bytes, 32))\\n }\\n return ret;\\n }\\n\\n return abi.decode(_bytes,(bytes32)); // will truncate if input length > 32 bytes\\n }\\n\\n function toUint256(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (uint256)\\n {\\n return uint256(toBytes32(_bytes));\\n }\\n\\n function toUint24(bytes memory _bytes, uint256 _start) internal pure returns (uint24) {\\n require(_start + 3 >= _start, \\\"toUint24_overflow\\\");\\n require(_bytes.length >= _start + 3 , \\\"toUint24_outOfBounds\\\");\\n uint24 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x3), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toUint8(bytes memory _bytes, uint256 _start) internal pure returns (uint8) {\\n require(_start + 1 >= _start, \\\"toUint8_overflow\\\");\\n require(_bytes.length >= _start + 1 , \\\"toUint8_outOfBounds\\\");\\n uint8 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x1), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toAddress(bytes memory _bytes, uint256 _start) internal pure returns (address) {\\n require(_start + 20 >= _start, \\\"toAddress_overflow\\\");\\n require(_bytes.length >= _start + 20, \\\"toAddress_outOfBounds\\\");\\n address tempAddress;\\n\\n assembly {\\n tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000)\\n }\\n\\n return tempAddress;\\n }\\n\\n function toNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n bytes memory nibbles = new bytes(_bytes.length * 2);\\n\\n for (uint256 i = 0; i < _bytes.length; i++) {\\n nibbles[i * 2] = _bytes[i] >> 4;\\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\\n }\\n\\n return nibbles;\\n }\\n\\n function fromNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n bytes memory ret = new bytes(_bytes.length / 2);\\n\\n for (uint256 i = 0; i < ret.length; i++) {\\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\\n }\\n\\n return ret;\\n }\\n\\n function equal(\\n bytes memory _bytes,\\n bytes memory _other\\n )\\n internal\\n pure\\n returns (bool)\\n {\\n return keccak256(_bytes) == keccak256(_other);\\n }\\n}\\n\",\"keccak256\":\"0x0adf22e1b22ba09911e859f64cb3b484e992be4f9fd3b09088e6225bf8d06ce0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_ErrorUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/**\\n * @title Lib_ErrorUtils\\n */\\nlibrary Lib_ErrorUtils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Encodes an error string into raw solidity-style revert data.\\n * (i.e. ascii bytes, prefixed with bytes4(keccak(\\\"Error(string))\\\"))\\n * Ref: https://docs.soliditylang.org/en/v0.8.2/control-structures.html?highlight=Error(string)#panic-via-assert-and-error-via-require\\n * @param _reason Reason for the reversion.\\n * @return Standard solidity revert data for the given reason.\\n */\\n function encodeRevertString(\\n string memory _reason\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return abi.encodeWithSignature(\\n \\\"Error(string)\\\",\\n _reason\\n );\\n }\\n}\\n\",\"keccak256\":\"0xfc64ec4a81fb50865b502a0004ed154e8598e1a313db77303fc95e41f536e6b7\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_MerkleTree.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_MerkleTree\\n * @author River Keefer\\n */\\nlibrary Lib_MerkleTree {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Calculates a merkle root for a list of 32-byte leaf hashes. WARNING: If the number\\n * of leaves passed in is not a power of two, it pads out the tree with zero hashes.\\n * If you do not know the original length of elements for the tree you are verifying,\\n * then this may allow empty leaves past _elements.length to pass a verification check down the line.\\n * Note that the _elements argument is modified, therefore it must not be used again afterwards\\n * @param _elements Array of hashes from which to generate a merkle root.\\n * @return Merkle root of the leaves, with zero hashes for non-powers-of-two (see above).\\n */\\n function getMerkleRoot(\\n bytes32[] memory _elements\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n require(\\n _elements.length > 0,\\n \\\"Lib_MerkleTree: Must provide at least one leaf hash.\\\"\\n );\\n\\n if (_elements.length == 1) {\\n return _elements[0];\\n }\\n\\n uint256[16] memory defaults = [\\n 0x290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563,\\n 0x633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d,\\n 0x890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d,\\n 0x3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd8,\\n 0xecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da,\\n 0xdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da5,\\n 0x617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d7,\\n 0x292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead,\\n 0xe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e10,\\n 0x7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f82,\\n 0xe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e83636516,\\n 0x3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c,\\n 0xad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e,\\n 0xa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab,\\n 0x4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c862,\\n 0x2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf10\\n ];\\n\\n // Reserve memory space for our hashes.\\n bytes memory buf = new bytes(64);\\n\\n // We'll need to keep track of left and right siblings.\\n bytes32 leftSibling;\\n bytes32 rightSibling;\\n\\n // Number of non-empty nodes at the current depth.\\n uint256 rowSize = _elements.length;\\n\\n // Current depth, counting from 0 at the leaves\\n uint256 depth = 0;\\n\\n // Common sub-expressions\\n uint256 halfRowSize; // rowSize / 2\\n bool rowSizeIsOdd; // rowSize % 2 == 1\\n\\n while (rowSize > 1) {\\n halfRowSize = rowSize / 2;\\n rowSizeIsOdd = rowSize % 2 == 1;\\n\\n for (uint256 i = 0; i < halfRowSize; i++) {\\n leftSibling = _elements[(2 * i) ];\\n rightSibling = _elements[(2 * i) + 1];\\n assembly {\\n mstore(add(buf, 32), leftSibling )\\n mstore(add(buf, 64), rightSibling)\\n }\\n\\n _elements[i] = keccak256(buf);\\n }\\n\\n if (rowSizeIsOdd) {\\n leftSibling = _elements[rowSize - 1];\\n rightSibling = bytes32(defaults[depth]);\\n assembly {\\n mstore(add(buf, 32), leftSibling)\\n mstore(add(buf, 64), rightSibling)\\n }\\n\\n _elements[halfRowSize] = keccak256(buf);\\n }\\n\\n rowSize = halfRowSize + (rowSizeIsOdd ? 1 : 0);\\n depth++;\\n }\\n\\n return _elements[0];\\n }\\n\\n /**\\n * Verifies a merkle branch for the given leaf hash. Assumes the original length\\n * of leaves generated is a known, correct input, and does not return true for indices\\n * extending past that index (even if _siblings would be otherwise valid.)\\n * @param _root The Merkle root to verify against.\\n * @param _leaf The leaf hash to verify inclusion of.\\n * @param _index The index in the tree of this leaf.\\n * @param _siblings Array of sibline nodes in the inclusion proof, starting from depth 0 (bottom of the tree).\\n * @param _totalLeaves The total number of leaves originally passed into.\\n * @return Whether or not the merkle branch and leaf passes verification.\\n */\\n function verify(\\n bytes32 _root,\\n bytes32 _leaf,\\n uint256 _index,\\n bytes32[] memory _siblings,\\n uint256 _totalLeaves\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n require(\\n _totalLeaves > 0,\\n \\\"Lib_MerkleTree: Total leaves must be greater than zero.\\\"\\n );\\n\\n require(\\n _index < _totalLeaves,\\n \\\"Lib_MerkleTree: Index out of bounds.\\\"\\n );\\n\\n require(\\n _siblings.length == _ceilLog2(_totalLeaves),\\n \\\"Lib_MerkleTree: Total siblings does not correctly correspond to total leaves.\\\"\\n );\\n\\n bytes32 computedRoot = _leaf;\\n\\n for (uint256 i = 0; i < _siblings.length; i++) {\\n if ((_index & 1) == 1) {\\n computedRoot = keccak256(\\n abi.encodePacked(\\n _siblings[i],\\n computedRoot\\n )\\n );\\n } else {\\n computedRoot = keccak256(\\n abi.encodePacked(\\n computedRoot,\\n _siblings[i]\\n )\\n );\\n }\\n\\n _index >>= 1;\\n }\\n\\n return _root == computedRoot;\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Calculates the integer ceiling of the log base 2 of an input.\\n * @param _in Unsigned input to calculate the log.\\n * @return ceil(log_base_2(_in))\\n */\\n function _ceilLog2(\\n uint256 _in\\n )\\n private\\n pure\\n returns (\\n uint256\\n )\\n {\\n require(\\n _in > 0,\\n \\\"Lib_MerkleTree: Cannot compute ceil(log_2) of 0.\\\"\\n );\\n\\n if (_in == 1) {\\n return 0;\\n }\\n\\n // Find the highest set bit (will be floor(log_2)).\\n // Borrowed with <3 from https://github.com/ethereum/solidity-examples\\n uint256 val = _in;\\n uint256 highest = 0;\\n for (uint256 i = 128; i >= 1; i >>= 1) {\\n if (val & (uint(1) << i) - 1 << i != 0) {\\n highest += i;\\n val >>= i;\\n }\\n }\\n\\n // Increment by one if this is not a perfect logarithm.\\n if ((uint(1) << highest) != _in) {\\n highest += 1;\\n }\\n\\n return highest;\\n }\\n}\\n\",\"keccak256\":\"0xa78edb9fbd34712771a1ebff05bc5e1abec7fc1e9a1bfb709d183099b44fa62a\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_ErrorUtils } from \\\"../utils/Lib_ErrorUtils.sol\\\";\\n\\n/**\\n * @title Lib_SafeExecutionManagerWrapper\\n * @dev The Safe Execution Manager Wrapper provides functions which facilitate writing OVM safe \\n * code using the standard solidity compiler, by routing all its operations through the Execution \\n * Manager.\\n * \\n * Compiler used: solc\\n * Runtime target: OVM\\n */\\nlibrary Lib_SafeExecutionManagerWrapper {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Performs a safe ovmCALL.\\n * @param _gasLimit Gas limit for the call.\\n * @param _target Address to call.\\n * @param _calldata Data to send to the call.\\n * @return _success Whether or not the call reverted.\\n * @return _returndata Data returned by the call.\\n */\\n function safeCALL(\\n uint256 _gasLimit,\\n address _target,\\n bytes memory _calldata\\n )\\n internal\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCALL(uint256,address,bytes)\\\",\\n _gasLimit,\\n _target,\\n _calldata\\n )\\n );\\n\\n return abi.decode(returndata, (bool, bytes));\\n }\\n\\n /**\\n * Performs a safe ovmDELEGATECALL.\\n * @param _gasLimit Gas limit for the call.\\n * @param _target Address to call.\\n * @param _calldata Data to send to the call.\\n * @return _success Whether or not the call reverted.\\n * @return _returndata Data returned by the call.\\n */\\n function safeDELEGATECALL(\\n uint256 _gasLimit,\\n address _target,\\n bytes memory _calldata\\n )\\n internal\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmDELEGATECALL(uint256,address,bytes)\\\",\\n _gasLimit,\\n _target,\\n _calldata\\n )\\n );\\n\\n return abi.decode(returndata, (bool, bytes));\\n }\\n\\n /**\\n * Performs a safe ovmCREATE call.\\n * @param _gasLimit Gas limit for the creation.\\n * @param _bytecode Code for the new contract.\\n * @return _contract Address of the created contract.\\n */\\n function safeCREATE(\\n uint256 _gasLimit,\\n bytes memory _bytecode\\n )\\n internal\\n returns (\\n address,\\n bytes memory\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n _gasLimit,\\n abi.encodeWithSignature(\\n \\\"ovmCREATE(bytes)\\\",\\n _bytecode\\n )\\n );\\n\\n return abi.decode(returndata, (address, bytes));\\n }\\n\\n /**\\n * Performs a safe ovmEXTCODESIZE call.\\n * @param _contract Address of the contract to query the size of.\\n * @return _EXTCODESIZE Size of the requested contract in bytes.\\n */\\n function safeEXTCODESIZE(\\n address _contract\\n )\\n internal\\n returns (\\n uint256 _EXTCODESIZE\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmEXTCODESIZE(address)\\\",\\n _contract\\n )\\n );\\n\\n return abi.decode(returndata, (uint256));\\n }\\n\\n /**\\n * Performs a safe ovmCHAINID call.\\n * @return _CHAINID Result of calling ovmCHAINID.\\n */\\n function safeCHAINID()\\n internal\\n returns (\\n uint256 _CHAINID\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCHAINID()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (uint256));\\n }\\n\\n /**\\n * Performs a safe ovmCALLER call.\\n * @return _CALLER Result of calling ovmCALLER.\\n */\\n function safeCALLER()\\n internal\\n returns (\\n address _CALLER\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCALLER()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (address));\\n }\\n\\n /**\\n * Performs a safe ovmADDRESS call.\\n * @return _ADDRESS Result of calling ovmADDRESS.\\n */\\n function safeADDRESS()\\n internal\\n returns (\\n address _ADDRESS\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmADDRESS()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (address));\\n }\\n\\n /**\\n * Performs a safe ovmGETNONCE call.\\n * @return _nonce Result of calling ovmGETNONCE.\\n */\\n function safeGETNONCE()\\n internal\\n returns (\\n uint256 _nonce\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmGETNONCE()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (uint256));\\n }\\n\\n /**\\n * Performs a safe ovmINCREMENTNONCE call.\\n */\\n function safeINCREMENTNONCE()\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmINCREMENTNONCE()\\\"\\n )\\n );\\n }\\n\\n /**\\n * Performs a safe ovmCREATEEOA call.\\n * @param _messageHash Message hash which was signed by EOA\\n * @param _v v value of signature (0 or 1)\\n * @param _r r value of signature\\n * @param _s s value of signature\\n */\\n function safeCREATEEOA(\\n bytes32 _messageHash,\\n uint8 _v,\\n bytes32 _r,\\n bytes32 _s\\n )\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCREATEEOA(bytes32,uint8,bytes32,bytes32)\\\",\\n _messageHash,\\n _v,\\n _r,\\n _s\\n )\\n );\\n }\\n\\n /**\\n * Performs a safe REVERT.\\n * @param _reason String revert reason to pass along with the REVERT.\\n */\\n function safeREVERT(\\n string memory _reason\\n )\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmREVERT(bytes)\\\",\\n Lib_ErrorUtils.encodeRevertString(\\n _reason\\n )\\n )\\n );\\n }\\n\\n /**\\n * Performs a safe \\\"require\\\".\\n * @param _condition Boolean condition that must be true or will revert.\\n * @param _reason String revert reason to pass along with the REVERT.\\n */\\n function safeREQUIRE(\\n bool _condition,\\n string memory _reason\\n )\\n internal\\n {\\n if (!_condition) {\\n safeREVERT(\\n _reason\\n );\\n }\\n }\\n\\n /**\\n * Performs a safe ovmSLOAD call.\\n */\\n function safeSLOAD(\\n bytes32 _key\\n )\\n internal\\n returns (\\n bytes32\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmSLOAD(bytes32)\\\",\\n _key\\n )\\n );\\n\\n return abi.decode(returndata, (bytes32));\\n }\\n\\n /**\\n * Performs a safe ovmSSTORE call.\\n */\\n function safeSSTORE(\\n bytes32 _key,\\n bytes32 _value\\n )\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmSSTORE(bytes32,bytes32)\\\",\\n _key,\\n _value\\n )\\n );\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Performs an ovm interaction and the necessary safety checks.\\n * @param _gasLimit Gas limit for the interaction.\\n * @param _calldata Data to send to the OVM_ExecutionManager (encoded with sighash).\\n * @return _returndata Data sent back by the OVM_ExecutionManager.\\n */\\n function _safeExecutionManagerInteraction(\\n uint256 _gasLimit,\\n bytes memory _calldata\\n )\\n private\\n returns (\\n bytes memory _returndata\\n )\\n {\\n address ovmExecutionManager = msg.sender;\\n (\\n bool success,\\n bytes memory returndata\\n ) = ovmExecutionManager.call{gas: _gasLimit}(_calldata);\\n\\n if (success == false) {\\n assembly {\\n revert(add(returndata, 0x20), mload(returndata))\\n }\\n } else if (returndata.length == 1) {\\n assembly {\\n return(0, 1)\\n }\\n } else {\\n return returndata;\\n }\\n }\\n\\n function _safeExecutionManagerInteraction(\\n bytes memory _calldata\\n )\\n private\\n returns (\\n bytes memory _returndata\\n )\\n {\\n return _safeExecutionManagerInteraction(\\n gasleft(),\\n _calldata\\n );\\n }\\n}\\n\",\"keccak256\":\"0x41e146e7912af794a17cd43c5a276674be956bfa8f3ca5b451bcb82d81e6f492\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x608060405234801561001057600080fd5b50604051611bee380380611bee83398101604081905261002f9161005b565b600080546001600160a01b0319166001600160a01b03949094169390931790925560015560025561009c565b60008060006060848603121561006f578283fd5b83516001600160a01b0381168114610085578384fd5b602085015160409095015190969495509392505050565b611b43806100ab6000396000f3fe608060405234801561001057600080fd5b50600436106100b45760003560e01c80638ca5cbb9116100715780638ca5cbb91461012f5780639418bddd14610144578063b8e189ac14610157578063c17b291b1461016a578063cfdf677e14610172578063e561dddc1461017a576100b4565b8063299ca478146100b9578063461a4478146100d75780634d69ee57146100ea5780637aa63a861461010a5780637ad168a01461011f57806381eb62ef14610127575b600080fd5b6100c1610182565b6040516100ce919061159f565b60405180910390f35b6100c16100e53660046114e3565b610191565b6100fd6100f8366004611431565b61026f565b6040516100ce91906115b3565b6101126102e2565b6040516100ce91906115be565b6101126102fb565b610112610314565b61014261013d366004611390565b61031a565b005b6100fd610152366004611531565b61052e565b610142610165366004611531565b61057e565b610112610636565b6100c161063c565b610112610664565b6000546001600160a01b031681565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b838110156101f15781810151838201526020016101d9565b50505050905090810190601f16801561021e5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561023b57600080fd5b505afa15801561024f573d6000803e3d6000fd5b505050506040513d602081101561026557600080fd5b505190505b919050565b600061027a836106de565b61029f5760405162461bcd60e51b815260040161029690611749565b60405180910390fd5b6102bc836020015185846000015185602001518760400151610776565b6102d85760405162461bcd60e51b8152600401610296906116b5565b5060019392505050565b6000806102ed6108fb565b5064ffffffffff1691505090565b6000806103066108fb565b64ffffffffff169250505090565b60025481565b6103226102e2565b81146103405760405162461bcd60e51b8152600401610296906116ec565b6103706040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b815250610191565b6001600160a01b03166302ad4d2a336040518263ffffffff1660e01b815260040161039b919061159f565b60206040518083038186803b1580156103b357600080fd5b505afa1580156103c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103eb91906113d3565b6104075760405162461bcd60e51b8152600401610296906118bb565b60008251116104285760405162461bcd60e51b815260040161029690611878565b6104666040518060400160405280601d81526020017f4f564d5f43616e6f6e6963616c5472616e73616374696f6e436861696e000000815250610191565b6001600160a01b0316637aa63a866040518163ffffffff1660e01b815260040160206040518083038186803b15801561049e57600080fd5b505afa1580156104b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104d69190611419565b82516104e06102e2565b0111156104ff5760405162461bcd60e51b815260040161029690611646565b61052a8242336040516020016105169291906119a1565b604051602081830303815290604052610990565b5050565b60008082608001518060200190518101906105499190611564565b509050806105695760405162461bcd60e51b815260040161029690611833565b4261057682600154610b31565b119392505050565b6105b06040518060400160405280601181526020017027ab26afa33930bab22b32b934b334b2b960791b815250610191565b6001600160a01b0316336001600160a01b0316146105e05760405162461bcd60e51b8152600401610296906117d6565b6105e9816106de565b6106055760405162461bcd60e51b815260040161029690611749565b61060e8161052e565b61062a5760405162461bcd60e51b815260040161029690611778565b61063381610b92565b50565b60015481565b600061065f604051806060016040528060258152602001611ab560259139610191565b905090565b600061066e61063c565b6001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b1580156106a657600080fd5b505afa1580156106ba573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061065f9190611419565b60006106e861063c565b8251604051634a83e9cd60e11b81526001600160a01b039290921691639507d39a91610716916004016115be565b60206040518083038186803b15801561072e57600080fd5b505afa158015610742573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107669190611419565b61076f83610d0a565b1492915050565b60008082116107b65760405162461bcd60e51b8152600401808060200182810382526037815260200180611a316037913960400191505060405180910390fd5b8184106107f45760405162461bcd60e51b81526004018080602001828103825260248152602001806119dd6024913960400191505060405180910390fd5b6107fd82610d50565b83511461083b5760405162461bcd60e51b815260040180806020018281038252604d815260200180611a68604d913960600191505060405180910390fd5b8460005b84518110156108ee57856001166001141561089d5784818151811061086057fe5b60200260200101518260405160200180838152602001828152602001925050506040516020818303038152906040528051906020012091506108e2565b818582815181106108aa57fe5b602002602001015160405160200180838152602001828152602001925050506040516020818303038152906040528051906020012091505b600195861c950161083f565b5090951495945050505050565b600080600061090861063c565b6001600160a01b031663ccf8f9696040518163ffffffff1660e01b815260040160206040518083038186803b15801561094057600080fd5b505afa158015610954573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061097891906113f3565b64ffffffffff602882901c16935060501c9150509091565b60006109bf6040518060400160405280600c81526020016b27ab26afa83937b837b9b2b960a11b815250610191565b90506000806109cc6108fb565b9092509050336001600160a01b03841614156109e9575042610a13565b426002548264ffffffffff160110610a135760405162461bcd60e51b81526004016102969061190a565b60006040518060a00160405280610a28610664565b8152602001610a3688610de6565b8152602001875181526020018464ffffffffff16815260200186815250905080600001517f16be4c5129a4e03cf3350262e181dc02ddfb4a6008d925368c0899fcd97ca9c58260200151836040015184606001518560800151604051610a9f94939291906115dd565b60405180910390a2610aaf61063c565b6001600160a01b0316632015276c610ac683610d0a565b610ada84604001518560600151018661121a565b6040518363ffffffff1660e01b8152600401610af79291906115c7565b600060405180830381600087803b158015610b1157600080fd5b505af1158015610b25573d6000803e3d6000fd5b50505050505050505050565b600082820183811015610b8b576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b610b9a61063c565b6001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b158015610bd257600080fd5b505afa158015610be6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c0a9190611419565b815110610c295760405162461bcd60e51b815260040161029690611973565b610c32816106de565b610c4e5760405162461bcd60e51b815260040161029690611749565b610c5661063c565b6001600160a01b031663167fd6818260000151610c788460600151600061121a565b6040518363ffffffff1660e01b8152600401610c959291906115c7565b600060405180830381600087803b158015610caf57600080fd5b505af1158015610cc3573d6000803e3d6000fd5b5050505080600001517f8747b69ce8fdb31c3b9b0a67bd8049ad8c1a69ea417b69b12174068abd9cbd648260200151604051610cff91906115be565b60405180910390a250565b60008160200151826040015183606001518460800151604051602001610d3394939291906115dd565b604051602081830303815290604052805190602001209050919050565b6000808211610d905760405162461bcd60e51b8152600401808060200182810382526030815260200180611a016030913960400191505060405180910390fd5b8160011415610da15750600061026a565b81600060805b60018110610dd1576000196001821b01811b831615610dc95791821c91908101905b60011c610da7565b506001811b8414610b8b576001019392505050565b600080825111610e275760405162461bcd60e51b8152600401808060200182810382526034815260200180611ada6034913960400191505060405180910390fd5b815160011415610e4d5781600081518110610e3e57fe5b6020026020010151905061026a565b60408051610200810182527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56381527f633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d60208201527f890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d818301527f3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd86060808301919091527fecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da60808301527fdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da560a08301527f617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d760c08301527f292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead60e08301527fe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e106101008301527f7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f826101208301527fe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e836365166101408301527f3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c6101608301527fad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e6101808301527fa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab6101a08301527f4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c8626101c08301527f2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf106101e083015282518381529081018352909160009190602082018180368337505085519192506000918291508180805b60018411156111f65750506002820460018084161460005b82811015611172578a816002028151811061111957fe5b602002602001015196508a816002026001018151811061113557fe5b6020026020010151955086602089015285604089015287805190602001208b828151811061115f57fe5b6020908102919091010152600101611102565b5080156111d55789600185038151811061118857fe5b6020026020010151955087836010811061119e57fe5b602002015160001b945085602088015284604088015286805190602001208a83815181106111c857fe5b6020026020010181815250505b806111e15760006111e4565b60015b60ff16820193506001909201916110ea565b8960008151811061120357fe5b602002602001015198505050505050505050919050565b602890811b91909117901b90565b600067ffffffffffffffff83111561123c57fe5b61124f601f8401601f19166020016119b8565b905082815283838301111561126357600080fd5b828260208301376000602084830101529392505050565b600082601f83011261128a578081fd5b8135602067ffffffffffffffff8211156112a057fe5b8082026112ae8282016119b8565b8381528281019086840183880185018910156112c8578687fd5b8693505b858410156112ea5780358352600193909301929184019184016112cc565b50979650505050505050565b600060a08284031215611307578081fd5b60405160a0810167ffffffffffffffff828210818311171561132557fe5b8160405282935084358352602085013560208401526040850135604084015260608501356060840152608085013591508082111561136257600080fd5b508301601f8101851361137457600080fd5b61138385823560208401611228565b6080830152505092915050565b600080604083850312156113a2578182fd5b823567ffffffffffffffff8111156113b8578283fd5b6113c48582860161127a565b95602094909401359450505050565b6000602082840312156113e4578081fd5b81518015158114610b8b578182fd5b600060208284031215611404578081fd5b815164ffffffffff1981168114610b8b578182fd5b60006020828403121561142a578081fd5b5051919050565b600080600060608486031215611445578081fd5b83359250602084013567ffffffffffffffff80821115611463578283fd5b61146f878388016112f6565b93506040860135915080821115611484578283fd5b9085019060408288031215611497578283fd5b6040516040810181811083821117156114ac57fe5b604052823581526020830135828111156114c4578485fd5b6114d08982860161127a565b6020830152508093505050509250925092565b6000602082840312156114f4578081fd5b813567ffffffffffffffff81111561150a578182fd5b8201601f8101841361151a578182fd5b61152984823560208401611228565b949350505050565b600060208284031215611542578081fd5b813567ffffffffffffffff811115611558578182fd5b611529848285016112f6565b60008060408385031215611576578182fd5b825160208401519092506001600160a01b0381168114611594578182fd5b809150509250929050565b6001600160a01b0391909116815260200190565b901515815260200190565b90815260200190565b91825264ffffffffff1916602082015260400190565b600085825260208581840152846040840152608060608401528351806080850152825b8181101561161c5785810183015185820160a001528201611600565b8181111561162d578360a083870101525b50601f01601f19169290920160a0019695505050505050565b60208082526049908201527f4e756d626572206f6620737461746520726f6f74732063616e6e6f742065786360408201527f65656420746865206e756d626572206f662063616e6f6e6963616c207472616e60608201526839b0b1ba34b7b7399760b91b608082015260a00190565b60208082526018908201527f496e76616c696420696e636c7573696f6e2070726f6f662e0000000000000000604082015260600190565b6020808252603d908201527f41637475616c20626174636820737461727420696e64657820646f6573206e6f60408201527f74206d6174636820657870656374656420737461727420696e6465782e000000606082015260800190565b60208082526015908201527424b73b30b634b2103130ba31b4103432b0b232b91760591b604082015260600190565b602080825260409082018190527f537461746520626174636865732063616e206f6e6c792062652064656c657465908201527f642077697468696e207468652066726175642070726f6f662077696e646f772e606082015260800190565b6020808252603b908201527f537461746520626174636865732063616e206f6e6c792062652064656c65746560408201527f6420627920746865204f564d5f467261756456657269666965722e0000000000606082015260800190565b60208082526025908201527f4261746368206865616465722074696d657374616d702063616e6e6f74206265604082015264207a65726f60d81b606082015260800190565b60208082526023908201527f43616e6e6f74207375626d697420616e20656d7074792073746174652062617460408201526231b41760e91b606082015260800190565b6020808252602f908201527f50726f706f73657220646f6573206e6f74206861766520656e6f75676820636f60408201526e1b1b185d195c985b081c1bdcdd1959608a1b606082015260800190565b60208082526043908201527f43616e6e6f74207075626c69736820737461746520726f6f747320776974686960408201527f6e207468652073657175656e636572207075626c69636174696f6e2077696e6460608201526237bb9760e91b608082015260a00190565b60208082526014908201527324b73b30b634b2103130ba31b41034b73232bc1760611b604082015260600190565b9182526001600160a01b0316602082015260400190565b60405181810167ffffffffffffffff811182821017156119d457fe5b60405291905056fe4c69625f4d65726b6c65547265653a20496e646578206f7574206f6620626f756e64732e4c69625f4d65726b6c65547265653a2043616e6e6f7420636f6d70757465206365696c286c6f675f3229206f6620302e4c69625f4d65726b6c65547265653a20546f74616c206c6561766573206d7573742062652067726561746572207468616e207a65726f2e4c69625f4d65726b6c65547265653a20546f74616c207369626c696e677320646f6573206e6f7420636f72726563746c7920636f72726573706f6e6420746f20746f74616c206c65617665732e4f564d5f436861696e53746f72616765436f6e7461696e65723a5343433a626174636865734c69625f4d65726b6c65547265653a204d7573742070726f76696465206174206c65617374206f6e65206c65616620686173682ea26469706673582212205a53bdb76b8e28d75b2be7dcf60e9f820f307d9d4f6af0f920bb9b973d964c7264736f6c63430007060033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100b45760003560e01c80638ca5cbb9116100715780638ca5cbb91461012f5780639418bddd14610144578063b8e189ac14610157578063c17b291b1461016a578063cfdf677e14610172578063e561dddc1461017a576100b4565b8063299ca478146100b9578063461a4478146100d75780634d69ee57146100ea5780637aa63a861461010a5780637ad168a01461011f57806381eb62ef14610127575b600080fd5b6100c1610182565b6040516100ce919061159f565b60405180910390f35b6100c16100e53660046114e3565b610191565b6100fd6100f8366004611431565b61026f565b6040516100ce91906115b3565b6101126102e2565b6040516100ce91906115be565b6101126102fb565b610112610314565b61014261013d366004611390565b61031a565b005b6100fd610152366004611531565b61052e565b610142610165366004611531565b61057e565b610112610636565b6100c161063c565b610112610664565b6000546001600160a01b031681565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b838110156101f15781810151838201526020016101d9565b50505050905090810190601f16801561021e5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561023b57600080fd5b505afa15801561024f573d6000803e3d6000fd5b505050506040513d602081101561026557600080fd5b505190505b919050565b600061027a836106de565b61029f5760405162461bcd60e51b815260040161029690611749565b60405180910390fd5b6102bc836020015185846000015185602001518760400151610776565b6102d85760405162461bcd60e51b8152600401610296906116b5565b5060019392505050565b6000806102ed6108fb565b5064ffffffffff1691505090565b6000806103066108fb565b64ffffffffff169250505090565b60025481565b6103226102e2565b81146103405760405162461bcd60e51b8152600401610296906116ec565b6103706040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b815250610191565b6001600160a01b03166302ad4d2a336040518263ffffffff1660e01b815260040161039b919061159f565b60206040518083038186803b1580156103b357600080fd5b505afa1580156103c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103eb91906113d3565b6104075760405162461bcd60e51b8152600401610296906118bb565b60008251116104285760405162461bcd60e51b815260040161029690611878565b6104666040518060400160405280601d81526020017f4f564d5f43616e6f6e6963616c5472616e73616374696f6e436861696e000000815250610191565b6001600160a01b0316637aa63a866040518163ffffffff1660e01b815260040160206040518083038186803b15801561049e57600080fd5b505afa1580156104b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104d69190611419565b82516104e06102e2565b0111156104ff5760405162461bcd60e51b815260040161029690611646565b61052a8242336040516020016105169291906119a1565b604051602081830303815290604052610990565b5050565b60008082608001518060200190518101906105499190611564565b509050806105695760405162461bcd60e51b815260040161029690611833565b4261057682600154610b31565b119392505050565b6105b06040518060400160405280601181526020017027ab26afa33930bab22b32b934b334b2b960791b815250610191565b6001600160a01b0316336001600160a01b0316146105e05760405162461bcd60e51b8152600401610296906117d6565b6105e9816106de565b6106055760405162461bcd60e51b815260040161029690611749565b61060e8161052e565b61062a5760405162461bcd60e51b815260040161029690611778565b61063381610b92565b50565b60015481565b600061065f604051806060016040528060258152602001611ab560259139610191565b905090565b600061066e61063c565b6001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b1580156106a657600080fd5b505afa1580156106ba573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061065f9190611419565b60006106e861063c565b8251604051634a83e9cd60e11b81526001600160a01b039290921691639507d39a91610716916004016115be565b60206040518083038186803b15801561072e57600080fd5b505afa158015610742573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107669190611419565b61076f83610d0a565b1492915050565b60008082116107b65760405162461bcd60e51b8152600401808060200182810382526037815260200180611a316037913960400191505060405180910390fd5b8184106107f45760405162461bcd60e51b81526004018080602001828103825260248152602001806119dd6024913960400191505060405180910390fd5b6107fd82610d50565b83511461083b5760405162461bcd60e51b815260040180806020018281038252604d815260200180611a68604d913960600191505060405180910390fd5b8460005b84518110156108ee57856001166001141561089d5784818151811061086057fe5b60200260200101518260405160200180838152602001828152602001925050506040516020818303038152906040528051906020012091506108e2565b818582815181106108aa57fe5b602002602001015160405160200180838152602001828152602001925050506040516020818303038152906040528051906020012091505b600195861c950161083f565b5090951495945050505050565b600080600061090861063c565b6001600160a01b031663ccf8f9696040518163ffffffff1660e01b815260040160206040518083038186803b15801561094057600080fd5b505afa158015610954573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061097891906113f3565b64ffffffffff602882901c16935060501c9150509091565b60006109bf6040518060400160405280600c81526020016b27ab26afa83937b837b9b2b960a11b815250610191565b90506000806109cc6108fb565b9092509050336001600160a01b03841614156109e9575042610a13565b426002548264ffffffffff160110610a135760405162461bcd60e51b81526004016102969061190a565b60006040518060a00160405280610a28610664565b8152602001610a3688610de6565b8152602001875181526020018464ffffffffff16815260200186815250905080600001517f16be4c5129a4e03cf3350262e181dc02ddfb4a6008d925368c0899fcd97ca9c58260200151836040015184606001518560800151604051610a9f94939291906115dd565b60405180910390a2610aaf61063c565b6001600160a01b0316632015276c610ac683610d0a565b610ada84604001518560600151018661121a565b6040518363ffffffff1660e01b8152600401610af79291906115c7565b600060405180830381600087803b158015610b1157600080fd5b505af1158015610b25573d6000803e3d6000fd5b50505050505050505050565b600082820183811015610b8b576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b610b9a61063c565b6001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b158015610bd257600080fd5b505afa158015610be6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c0a9190611419565b815110610c295760405162461bcd60e51b815260040161029690611973565b610c32816106de565b610c4e5760405162461bcd60e51b815260040161029690611749565b610c5661063c565b6001600160a01b031663167fd6818260000151610c788460600151600061121a565b6040518363ffffffff1660e01b8152600401610c959291906115c7565b600060405180830381600087803b158015610caf57600080fd5b505af1158015610cc3573d6000803e3d6000fd5b5050505080600001517f8747b69ce8fdb31c3b9b0a67bd8049ad8c1a69ea417b69b12174068abd9cbd648260200151604051610cff91906115be565b60405180910390a250565b60008160200151826040015183606001518460800151604051602001610d3394939291906115dd565b604051602081830303815290604052805190602001209050919050565b6000808211610d905760405162461bcd60e51b8152600401808060200182810382526030815260200180611a016030913960400191505060405180910390fd5b8160011415610da15750600061026a565b81600060805b60018110610dd1576000196001821b01811b831615610dc95791821c91908101905b60011c610da7565b506001811b8414610b8b576001019392505050565b600080825111610e275760405162461bcd60e51b8152600401808060200182810382526034815260200180611ada6034913960400191505060405180910390fd5b815160011415610e4d5781600081518110610e3e57fe5b6020026020010151905061026a565b60408051610200810182527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56381527f633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d60208201527f890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d818301527f3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd86060808301919091527fecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da60808301527fdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da560a08301527f617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d760c08301527f292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead60e08301527fe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e106101008301527f7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f826101208301527fe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e836365166101408301527f3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c6101608301527fad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e6101808301527fa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab6101a08301527f4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c8626101c08301527f2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf106101e083015282518381529081018352909160009190602082018180368337505085519192506000918291508180805b60018411156111f65750506002820460018084161460005b82811015611172578a816002028151811061111957fe5b602002602001015196508a816002026001018151811061113557fe5b6020026020010151955086602089015285604089015287805190602001208b828151811061115f57fe5b6020908102919091010152600101611102565b5080156111d55789600185038151811061118857fe5b6020026020010151955087836010811061119e57fe5b602002015160001b945085602088015284604088015286805190602001208a83815181106111c857fe5b6020026020010181815250505b806111e15760006111e4565b60015b60ff16820193506001909201916110ea565b8960008151811061120357fe5b602002602001015198505050505050505050919050565b602890811b91909117901b90565b600067ffffffffffffffff83111561123c57fe5b61124f601f8401601f19166020016119b8565b905082815283838301111561126357600080fd5b828260208301376000602084830101529392505050565b600082601f83011261128a578081fd5b8135602067ffffffffffffffff8211156112a057fe5b8082026112ae8282016119b8565b8381528281019086840183880185018910156112c8578687fd5b8693505b858410156112ea5780358352600193909301929184019184016112cc565b50979650505050505050565b600060a08284031215611307578081fd5b60405160a0810167ffffffffffffffff828210818311171561132557fe5b8160405282935084358352602085013560208401526040850135604084015260608501356060840152608085013591508082111561136257600080fd5b508301601f8101851361137457600080fd5b61138385823560208401611228565b6080830152505092915050565b600080604083850312156113a2578182fd5b823567ffffffffffffffff8111156113b8578283fd5b6113c48582860161127a565b95602094909401359450505050565b6000602082840312156113e4578081fd5b81518015158114610b8b578182fd5b600060208284031215611404578081fd5b815164ffffffffff1981168114610b8b578182fd5b60006020828403121561142a578081fd5b5051919050565b600080600060608486031215611445578081fd5b83359250602084013567ffffffffffffffff80821115611463578283fd5b61146f878388016112f6565b93506040860135915080821115611484578283fd5b9085019060408288031215611497578283fd5b6040516040810181811083821117156114ac57fe5b604052823581526020830135828111156114c4578485fd5b6114d08982860161127a565b6020830152508093505050509250925092565b6000602082840312156114f4578081fd5b813567ffffffffffffffff81111561150a578182fd5b8201601f8101841361151a578182fd5b61152984823560208401611228565b949350505050565b600060208284031215611542578081fd5b813567ffffffffffffffff811115611558578182fd5b611529848285016112f6565b60008060408385031215611576578182fd5b825160208401519092506001600160a01b0381168114611594578182fd5b809150509250929050565b6001600160a01b0391909116815260200190565b901515815260200190565b90815260200190565b91825264ffffffffff1916602082015260400190565b600085825260208581840152846040840152608060608401528351806080850152825b8181101561161c5785810183015185820160a001528201611600565b8181111561162d578360a083870101525b50601f01601f19169290920160a0019695505050505050565b60208082526049908201527f4e756d626572206f6620737461746520726f6f74732063616e6e6f742065786360408201527f65656420746865206e756d626572206f662063616e6f6e6963616c207472616e60608201526839b0b1ba34b7b7399760b91b608082015260a00190565b60208082526018908201527f496e76616c696420696e636c7573696f6e2070726f6f662e0000000000000000604082015260600190565b6020808252603d908201527f41637475616c20626174636820737461727420696e64657820646f6573206e6f60408201527f74206d6174636820657870656374656420737461727420696e6465782e000000606082015260800190565b60208082526015908201527424b73b30b634b2103130ba31b4103432b0b232b91760591b604082015260600190565b602080825260409082018190527f537461746520626174636865732063616e206f6e6c792062652064656c657465908201527f642077697468696e207468652066726175642070726f6f662077696e646f772e606082015260800190565b6020808252603b908201527f537461746520626174636865732063616e206f6e6c792062652064656c65746560408201527f6420627920746865204f564d5f467261756456657269666965722e0000000000606082015260800190565b60208082526025908201527f4261746368206865616465722074696d657374616d702063616e6e6f74206265604082015264207a65726f60d81b606082015260800190565b60208082526023908201527f43616e6e6f74207375626d697420616e20656d7074792073746174652062617460408201526231b41760e91b606082015260800190565b6020808252602f908201527f50726f706f73657220646f6573206e6f74206861766520656e6f75676820636f60408201526e1b1b185d195c985b081c1bdcdd1959608a1b606082015260800190565b60208082526043908201527f43616e6e6f74207075626c69736820737461746520726f6f747320776974686960408201527f6e207468652073657175656e636572207075626c69636174696f6e2077696e6460608201526237bb9760e91b608082015260a00190565b60208082526014908201527324b73b30b634b2103130ba31b41034b73232bc1760611b604082015260600190565b9182526001600160a01b0316602082015260400190565b60405181810167ffffffffffffffff811182821017156119d457fe5b60405291905056fe4c69625f4d65726b6c65547265653a20496e646578206f7574206f6620626f756e64732e4c69625f4d65726b6c65547265653a2043616e6e6f7420636f6d70757465206365696c286c6f675f3229206f6620302e4c69625f4d65726b6c65547265653a20546f74616c206c6561766573206d7573742062652067726561746572207468616e207a65726f2e4c69625f4d65726b6c65547265653a20546f74616c207369626c696e677320646f6573206e6f7420636f72726563746c7920636f72726573706f6e6420746f20746f74616c206c65617665732e4f564d5f436861696e53746f72616765436f6e7461696e65723a5343433a626174636865734c69625f4d65726b6c65547265653a204d7573742070726f76696465206174206c65617374206f6e65206c65616620686173682ea26469706673582212205a53bdb76b8e28d75b2be7dcf60e9f820f307d9d4f6af0f920bb9b973d964c7264736f6c63430007060033", - "devdoc": { - "details": "The State Commitment Chain (SCC) contract contains a list of proposed state roots which Proposers assert to be a result of each transaction in the Canonical Transaction Chain (CTC). Elements here have a 1:1 correspondence with transactions in the CTC, and should be the unique state root calculated off-chain by applying the canonical transactions one by one. Compiler used: solc Runtime target: EVM", - "kind": "dev", - "methods": { - "appendStateBatch(bytes32[],uint256)": { - "params": { - "_batch": "Batch of state roots.", - "_shouldStartAtElement": "Index of the element at which this batch should start." - } - }, - "batches()": { - "returns": { - "_0": "Reference to the batch storage container." - } - }, - "constructor": { - "params": { - "_libAddressManager": "Address of the Address Manager." - } - }, - "deleteStateBatch((uint256,bytes32,uint256,uint256,bytes))": { - "params": { - "_batchHeader": "Header of the batch to start deleting from." - } - }, - "getLastSequencerTimestamp()": { - "returns": { - "_lastSequencerTimestamp": "Last sequencer batch timestamp." - } - }, - "getTotalBatches()": { - "returns": { - "_totalBatches": "Total submitted batches." - } - }, - "getTotalElements()": { - "returns": { - "_totalElements": "Total submitted elements." - } - }, - "insideFraudProofWindow((uint256,bytes32,uint256,uint256,bytes))": { - "params": { - "_batchHeader": "Header of the batch to check." - }, - "returns": { - "_inside": "Whether or not the batch is inside the fraud proof window." - } - }, - "resolve(string)": { - "params": { - "_name": "Name to resolve an address for." - }, - "returns": { - "_0": "Address associated with the given name." - } - }, - "verifyStateCommitment(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))": { - "params": { - "_batchHeader": "Header of the batch in which the element was included.", - "_element": "Hash of the element to verify a proof for.", - "_proof": "Merkle inclusion proof for the element." - } - } - }, - "title": "OVM_StateCommitmentChain", - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": { - "appendStateBatch(bytes32[],uint256)": { - "notice": "Appends a batch of state roots to the chain." - }, - "batches()": { - "notice": "Accesses the batch storage container." - }, - "deleteStateBatch((uint256,bytes32,uint256,uint256,bytes))": { - "notice": "Deletes all state roots after (and including) a given batch." - }, - "getLastSequencerTimestamp()": { - "notice": "Retrieves the timestamp of the last batch submitted by the sequencer." - }, - "getTotalBatches()": { - "notice": "Retrieves the total number of batches submitted." - }, - "getTotalElements()": { - "notice": "Retrieves the total number of elements submitted." - }, - "insideFraudProofWindow((uint256,bytes32,uint256,uint256,bytes))": { - "notice": "Checks whether a given batch is still inside its fraud proof window." - }, - "resolve(string)": { - "notice": "Resolves the address associated with a given name." - }, - "verifyStateCommitment(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))": { - "notice": "Verifies a batch inclusion proof." - } - }, - "version": 1 - }, - "storageLayout": { - "storage": [ - { - "astId": 12557, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_StateCommitmentChain.sol:OVM_StateCommitmentChain", - "label": "libAddressManager", - "offset": 0, - "slot": "0", - "type": "t_contract(Lib_AddressManager)12550" - }, - { - "astId": 3984, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_StateCommitmentChain.sol:OVM_StateCommitmentChain", - "label": "FRAUD_PROOF_WINDOW", - "offset": 0, - "slot": "1", - "type": "t_uint256" - }, - { - "astId": 3986, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_StateCommitmentChain.sol:OVM_StateCommitmentChain", - "label": "SEQUENCER_PUBLISH_WINDOW", - "offset": 0, - "slot": "2", - "type": "t_uint256" - } - ], - "types": { - "t_contract(Lib_AddressManager)12550": { - "encoding": "inplace", - "label": "contract Lib_AddressManager", - "numberOfBytes": "20" - }, - "t_uint256": { - "encoding": "inplace", - "label": "uint256", - "numberOfBytes": "32" - } - } - } -} \ No newline at end of file diff --git a/packages/contracts/deployments/goerli-v2/OVM_StateManagerFactory.json b/packages/contracts/deployments/goerli-v2/OVM_StateManagerFactory.json deleted file mode 100644 index 15bc9354cc548..0000000000000 --- a/packages/contracts/deployments/goerli-v2/OVM_StateManagerFactory.json +++ /dev/null @@ -1,74 +0,0 @@ -{ - "address": "0x625Ee9D6a8486FDc0c70b1793F37d368f4698014", - "abi": [ - { - "inputs": [ - { - "internalType": "address", - "name": "_owner", - "type": "address" - } - ], - "name": "create", - "outputs": [ - { - "internalType": "contract iOVM_StateManager", - "name": "", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "function" - } - ], - "transactionHash": "0xab522f8de1b5f0ade60ff6e4b388bb071ad6edd21961462aa1d8ad4eb77d90d3", - "receipt": { - "to": null, - "from": "0x558ba9b8d78713fbf768c1f8a584485B4003f43F", - "contractAddress": "0x625Ee9D6a8486FDc0c70b1793F37d368f4698014", - "transactionIndex": 22, - "gasUsed": "1170970", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0xaafc8b020eea3929a46ba83b8a5b71023f681927a7a7ce69b95c59ccb58639f9", - "transactionHash": "0xab522f8de1b5f0ade60ff6e4b388bb071ad6edd21961462aa1d8ad4eb77d90d3", - "logs": [], - "blockNumber": 4607718, - "cumulativeGasUsed": "2579046", - "status": 1, - "byzantium": true - }, - "args": [], - "solcInputHash": "8aef3555d89ad9d3af2f5d28a85dc856", - "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"}],\"name\":\"create\",\"outputs\":[{\"internalType\":\"contract iOVM_StateManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The State Manager Factory is called by a State Transitioner's init code, to create a new State Manager for use in the Fraud Verification process. Compiler used: solc Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"create(address)\":{\"params\":{\"_owner\":\"Owner of the created contract.\"},\"returns\":{\"_0\":\"New OVM_StateManager instance.\"}}},\"title\":\"OVM_StateManagerFactory\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"create(address)\":{\"notice\":\"Creates a new OVM_StateManager\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/OVM/execution/OVM_StateManagerFactory.sol\":\"OVM_StateManagerFactory\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/optimistic-ethereum/OVM/execution/OVM_StateManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_StateManager } from \\\"../../iOVM/execution/iOVM_StateManager.sol\\\";\\n\\n/**\\n * @title OVM_StateManager\\n * @dev The State Manager contract holds all storage values for contracts in the OVM. It can only be written to by the\\n * the Execution Manager and State Transitioner. It runs on L1 during the setup and execution of a fraud proof.\\n * The same logic runs on L2, but has been implemented as a precompile in the L2 go-ethereum client\\n * (see https://github.com/ethereum-optimism/go-ethereum/blob/master/core/vm/ovm_state_manager.go).\\n * \\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract OVM_StateManager is iOVM_StateManager {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n bytes32 constant internal EMPTY_ACCOUNT_STORAGE_ROOT = 0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421;\\n bytes32 constant internal EMPTY_ACCOUNT_CODE_HASH = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;\\n bytes32 constant internal STORAGE_XOR_VALUE = 0xFEEDFACECAFEBEEFFEEDFACECAFEBEEFFEEDFACECAFEBEEFFEEDFACECAFEBEEF;\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n address override public owner;\\n address override public ovmExecutionManager;\\n mapping (address => Lib_OVMCodec.Account) internal accounts;\\n mapping (address => mapping (bytes32 => bytes32)) internal contractStorage;\\n mapping (address => mapping (bytes32 => bool)) internal verifiedContractStorage;\\n mapping (bytes32 => ItemState) internal itemStates;\\n uint256 internal totalUncommittedAccounts;\\n uint256 internal totalUncommittedContractStorage;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _owner Address of the owner of this contract.\\n */\\n constructor(\\n address _owner\\n )\\n {\\n owner = _owner;\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n /**\\n * Simple authentication, this contract should only be accessible to the owner (which is expected to be the State Transitioner during `PRE_EXECUTION` \\n * or the OVM_ExecutionManager during transaction execution.\\n */\\n modifier authenticated() {\\n // owner is the State Transitioner\\n require(\\n msg.sender == owner || msg.sender == ovmExecutionManager,\\n \\\"Function can only be called by authenticated addresses\\\"\\n );\\n _;\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Checks whether a given address is allowed to modify this contract.\\n * @param _address Address to check.\\n * @return Whether or not the address can modify this contract.\\n */\\n function isAuthenticated(\\n address _address\\n )\\n override\\n public\\n view\\n returns (\\n bool\\n )\\n {\\n return (_address == owner || _address == ovmExecutionManager);\\n }\\n\\n /**\\n * Sets the address of the OVM_ExecutionManager.\\n * @param _ovmExecutionManager Address of the OVM_ExecutionManager.\\n */\\n function setExecutionManager(\\n address _ovmExecutionManager\\n )\\n override\\n public\\n authenticated\\n {\\n ovmExecutionManager = _ovmExecutionManager;\\n }\\n\\n /**\\n * Inserts an account into the state.\\n * @param _address Address of the account to insert.\\n * @param _account Account to insert for the given address.\\n */\\n function putAccount(\\n address _address,\\n Lib_OVMCodec.Account memory _account\\n )\\n override\\n public\\n authenticated\\n {\\n accounts[_address] = _account;\\n }\\n\\n /**\\n * Marks an account as empty.\\n * @param _address Address of the account to mark.\\n */\\n function putEmptyAccount(\\n address _address\\n )\\n override\\n public\\n authenticated\\n {\\n Lib_OVMCodec.Account storage account = accounts[_address];\\n account.storageRoot = EMPTY_ACCOUNT_STORAGE_ROOT;\\n account.codeHash = EMPTY_ACCOUNT_CODE_HASH;\\n }\\n\\n /**\\n * Retrieves an account from the state.\\n * @param _address Address of the account to retrieve.\\n * @return Account for the given address.\\n */\\n function getAccount(\\n address _address\\n )\\n override\\n public\\n view\\n returns (\\n Lib_OVMCodec.Account memory\\n )\\n {\\n return accounts[_address];\\n }\\n\\n /**\\n * Checks whether the state has a given account.\\n * @param _address Address of the account to check.\\n * @return Whether or not the state has the account.\\n */\\n function hasAccount(\\n address _address\\n )\\n override\\n public\\n view\\n returns (\\n bool\\n )\\n {\\n return accounts[_address].codeHash != bytes32(0);\\n }\\n\\n /**\\n * Checks whether the state has a given known empty account.\\n * @param _address Address of the account to check.\\n * @return Whether or not the state has the empty account.\\n */\\n function hasEmptyAccount(\\n address _address\\n )\\n override\\n public\\n view\\n returns (\\n bool\\n )\\n {\\n return (\\n accounts[_address].codeHash == EMPTY_ACCOUNT_CODE_HASH\\n && accounts[_address].nonce == 0\\n );\\n }\\n\\n /**\\n * Sets the nonce of an account.\\n * @param _address Address of the account to modify.\\n * @param _nonce New account nonce.\\n */\\n function setAccountNonce(\\n address _address,\\n uint256 _nonce\\n )\\n override\\n public\\n authenticated\\n {\\n accounts[_address].nonce = _nonce;\\n }\\n\\n /**\\n * Gets the nonce of an account.\\n * @param _address Address of the account to access.\\n * @return Nonce of the account.\\n */\\n function getAccountNonce(\\n address _address\\n )\\n override\\n public\\n view\\n returns (\\n uint256\\n )\\n {\\n return accounts[_address].nonce;\\n }\\n\\n /**\\n * Retrieves the Ethereum address of an account.\\n * @param _address Address of the account to access.\\n * @return Corresponding Ethereum address.\\n */\\n function getAccountEthAddress(\\n address _address\\n )\\n override\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return accounts[_address].ethAddress;\\n }\\n\\n /**\\n * Retrieves the storage root of an account.\\n * @param _address Address of the account to access.\\n * @return Corresponding storage root.\\n */\\n function getAccountStorageRoot(\\n address _address\\n )\\n override\\n public\\n view\\n returns (\\n bytes32\\n )\\n {\\n return accounts[_address].storageRoot;\\n }\\n\\n /**\\n * Initializes a pending account (during CREATE or CREATE2) with the default values.\\n * @param _address Address of the account to initialize.\\n */\\n function initPendingAccount(\\n address _address\\n )\\n override\\n public\\n authenticated\\n {\\n Lib_OVMCodec.Account storage account = accounts[_address];\\n account.nonce = 1;\\n account.storageRoot = EMPTY_ACCOUNT_STORAGE_ROOT;\\n account.codeHash = EMPTY_ACCOUNT_CODE_HASH;\\n account.isFresh = true;\\n }\\n\\n /**\\n * Finalizes the creation of a pending account (during CREATE or CREATE2).\\n * @param _address Address of the account to finalize.\\n * @param _ethAddress Address of the account's associated contract on Ethereum.\\n * @param _codeHash Hash of the account's code.\\n */\\n function commitPendingAccount(\\n address _address,\\n address _ethAddress,\\n bytes32 _codeHash\\n )\\n override\\n public\\n authenticated\\n {\\n Lib_OVMCodec.Account storage account = accounts[_address];\\n account.ethAddress = _ethAddress;\\n account.codeHash = _codeHash;\\n }\\n\\n /**\\n * Checks whether an account has already been retrieved, and marks it as retrieved if not.\\n * @param _address Address of the account to check.\\n * @return Whether or not the account was already loaded.\\n */\\n function testAndSetAccountLoaded(\\n address _address\\n )\\n override\\n public\\n authenticated\\n returns (\\n bool\\n )\\n {\\n return _testAndSetItemState(\\n _getItemHash(_address),\\n ItemState.ITEM_LOADED\\n );\\n }\\n\\n /**\\n * Checks whether an account has already been modified, and marks it as modified if not.\\n * @param _address Address of the account to check.\\n * @return Whether or not the account was already modified.\\n */\\n function testAndSetAccountChanged(\\n address _address\\n )\\n override\\n public\\n authenticated\\n returns (\\n bool\\n )\\n {\\n return _testAndSetItemState(\\n _getItemHash(_address),\\n ItemState.ITEM_CHANGED\\n );\\n }\\n\\n /**\\n * Attempts to mark an account as committed.\\n * @param _address Address of the account to commit.\\n * @return Whether or not the account was committed.\\n */\\n function commitAccount(\\n address _address\\n )\\n override\\n public\\n authenticated\\n returns (\\n bool\\n )\\n {\\n bytes32 item = _getItemHash(_address);\\n if (itemStates[item] != ItemState.ITEM_CHANGED) {\\n return false;\\n }\\n\\n itemStates[item] = ItemState.ITEM_COMMITTED;\\n totalUncommittedAccounts -= 1;\\n\\n return true;\\n }\\n\\n /**\\n * Increments the total number of uncommitted accounts.\\n */\\n function incrementTotalUncommittedAccounts()\\n override\\n public\\n authenticated\\n {\\n totalUncommittedAccounts += 1;\\n }\\n\\n /**\\n * Gets the total number of uncommitted accounts.\\n * @return Total uncommitted accounts.\\n */\\n function getTotalUncommittedAccounts()\\n override\\n public\\n view\\n returns (\\n uint256\\n )\\n {\\n return totalUncommittedAccounts;\\n }\\n\\n /**\\n * Checks whether a given account was changed during execution.\\n * @param _address Address to check.\\n * @return Whether or not the account was changed.\\n */\\n function wasAccountChanged(\\n address _address\\n )\\n override\\n public\\n view\\n returns (\\n bool\\n )\\n {\\n bytes32 item = _getItemHash(_address);\\n return itemStates[item] >= ItemState.ITEM_CHANGED;\\n }\\n\\n /**\\n * Checks whether a given account was committed after execution.\\n * @param _address Address to check.\\n * @return Whether or not the account was committed.\\n */\\n function wasAccountCommitted(\\n address _address\\n )\\n override\\n public\\n view\\n returns (\\n bool\\n )\\n {\\n bytes32 item = _getItemHash(_address);\\n return itemStates[item] >= ItemState.ITEM_COMMITTED;\\n }\\n\\n\\n /************************************\\n * Public Functions: Storage Access *\\n ************************************/\\n\\n /**\\n * Changes a contract storage slot value.\\n * @param _contract Address of the contract to modify.\\n * @param _key 32 byte storage slot key.\\n * @param _value 32 byte storage slot value.\\n */\\n function putContractStorage(\\n address _contract,\\n bytes32 _key,\\n bytes32 _value\\n )\\n override\\n public\\n authenticated\\n {\\n // A hilarious optimization. `SSTORE`ing a value of `bytes32(0)` is common enough that it's\\n // worth populating this with a non-zero value in advance (during the fraud proof\\n // initialization phase) to cut the execution-time cost down to 5000 gas.\\n contractStorage[_contract][_key] = _value ^ STORAGE_XOR_VALUE;\\n\\n // Only used when initially populating the contract storage. OVM_ExecutionManager will\\n // perform a `hasContractStorage` INVALID_STATE_ACCESS check before putting any contract\\n // storage because writing to zero when the actual value is nonzero causes a gas\\n // discrepancy. Could be moved into a new `putVerifiedContractStorage` function, or\\n // something along those lines.\\n if (verifiedContractStorage[_contract][_key] == false) {\\n verifiedContractStorage[_contract][_key] = true;\\n }\\n }\\n\\n /**\\n * Retrieves a contract storage slot value.\\n * @param _contract Address of the contract to access.\\n * @param _key 32 byte storage slot key.\\n * @return 32 byte storage slot value.\\n */\\n function getContractStorage(\\n address _contract,\\n bytes32 _key\\n )\\n override\\n public\\n view\\n returns (\\n bytes32\\n )\\n {\\n // Storage XOR system doesn't work for newly created contracts that haven't set this\\n // storage slot value yet.\\n if (\\n verifiedContractStorage[_contract][_key] == false\\n && accounts[_contract].isFresh\\n ) {\\n return bytes32(0);\\n }\\n\\n // See `putContractStorage` for more information about the XOR here.\\n return contractStorage[_contract][_key] ^ STORAGE_XOR_VALUE;\\n }\\n\\n /**\\n * Checks whether a contract storage slot exists in the state.\\n * @param _contract Address of the contract to access.\\n * @param _key 32 byte storage slot key.\\n * @return Whether or not the key was set in the state.\\n */\\n function hasContractStorage(\\n address _contract,\\n bytes32 _key\\n )\\n override\\n public\\n view\\n returns (\\n bool\\n )\\n {\\n return verifiedContractStorage[_contract][_key] || accounts[_contract].isFresh;\\n }\\n\\n /**\\n * Checks whether a storage slot has already been retrieved, and marks it as retrieved if not.\\n * @param _contract Address of the contract to check.\\n * @param _key 32 byte storage slot key.\\n * @return Whether or not the slot was already loaded.\\n */\\n function testAndSetContractStorageLoaded(\\n address _contract,\\n bytes32 _key\\n )\\n override\\n public\\n authenticated\\n returns (\\n bool\\n )\\n {\\n return _testAndSetItemState(\\n _getItemHash(_contract, _key),\\n ItemState.ITEM_LOADED\\n );\\n }\\n\\n /**\\n * Checks whether a storage slot has already been modified, and marks it as modified if not.\\n * @param _contract Address of the contract to check.\\n * @param _key 32 byte storage slot key.\\n * @return Whether or not the slot was already modified.\\n */\\n function testAndSetContractStorageChanged(\\n address _contract,\\n bytes32 _key\\n )\\n override\\n public\\n authenticated\\n returns (\\n bool\\n )\\n {\\n return _testAndSetItemState(\\n _getItemHash(_contract, _key),\\n ItemState.ITEM_CHANGED\\n );\\n }\\n\\n /**\\n * Attempts to mark a storage slot as committed.\\n * @param _contract Address of the account to commit.\\n * @param _key 32 byte slot key to commit.\\n * @return Whether or not the slot was committed.\\n */\\n function commitContractStorage(\\n address _contract,\\n bytes32 _key\\n )\\n override\\n public\\n authenticated\\n returns (\\n bool\\n )\\n {\\n bytes32 item = _getItemHash(_contract, _key);\\n if (itemStates[item] != ItemState.ITEM_CHANGED) {\\n return false;\\n }\\n\\n itemStates[item] = ItemState.ITEM_COMMITTED;\\n totalUncommittedContractStorage -= 1;\\n\\n return true;\\n }\\n\\n /**\\n * Increments the total number of uncommitted storage slots.\\n */\\n function incrementTotalUncommittedContractStorage()\\n override\\n public\\n authenticated\\n {\\n totalUncommittedContractStorage += 1;\\n }\\n\\n /**\\n * Gets the total number of uncommitted storage slots.\\n * @return Total uncommitted storage slots.\\n */\\n function getTotalUncommittedContractStorage()\\n override\\n public\\n view\\n returns (\\n uint256\\n )\\n {\\n return totalUncommittedContractStorage;\\n }\\n\\n /**\\n * Checks whether a given storage slot was changed during execution.\\n * @param _contract Address to check.\\n * @param _key Key of the storage slot to check.\\n * @return Whether or not the storage slot was changed.\\n */\\n function wasContractStorageChanged(\\n address _contract,\\n bytes32 _key\\n )\\n override\\n public\\n view\\n returns (\\n bool\\n )\\n {\\n bytes32 item = _getItemHash(_contract, _key);\\n return itemStates[item] >= ItemState.ITEM_CHANGED;\\n }\\n\\n /**\\n * Checks whether a given storage slot was committed after execution.\\n * @param _contract Address to check.\\n * @param _key Key of the storage slot to check.\\n * @return Whether or not the storage slot was committed.\\n */\\n function wasContractStorageCommitted(\\n address _contract,\\n bytes32 _key\\n )\\n override\\n public\\n view\\n returns (\\n bool\\n )\\n {\\n bytes32 item = _getItemHash(_contract, _key);\\n return itemStates[item] >= ItemState.ITEM_COMMITTED;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Generates a unique hash for an address.\\n * @param _address Address to generate a hash for.\\n * @return Unique hash for the given address.\\n */\\n function _getItemHash(\\n address _address\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(abi.encodePacked(_address));\\n }\\n\\n /**\\n * Generates a unique hash for an address/key pair.\\n * @param _contract Address to generate a hash for.\\n * @param _key Key to generate a hash for.\\n * @return Unique hash for the given pair.\\n */\\n function _getItemHash(\\n address _contract,\\n bytes32 _key\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(abi.encodePacked(\\n _contract,\\n _key\\n ));\\n }\\n\\n /**\\n * Checks whether an item is in a particular state (ITEM_LOADED or ITEM_CHANGED) and sets the\\n * item to the provided state if not.\\n * @param _item 32 byte item ID to check.\\n * @param _minItemState Minimum state that must be satisfied by the item.\\n * @return Whether or not the item was already in the state.\\n */\\n function _testAndSetItemState(\\n bytes32 _item,\\n ItemState _minItemState\\n )\\n internal\\n returns (\\n bool\\n )\\n {\\n bool wasItemState = itemStates[_item] >= _minItemState;\\n\\n if (wasItemState == false) {\\n itemStates[_item] = _minItemState;\\n }\\n\\n return wasItemState;\\n }\\n}\\n\",\"keccak256\":\"0x8509e24a2c361ce37710e637800cf46ed97482ab5d12d32b5f1ef8adeb474814\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/execution/OVM_StateManagerFactory.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Interface Imports */\\nimport { iOVM_StateManager } from \\\"../../iOVM/execution/iOVM_StateManager.sol\\\";\\nimport { iOVM_StateManagerFactory } from \\\"../../iOVM/execution/iOVM_StateManagerFactory.sol\\\";\\n\\n/* Contract Imports */\\nimport { OVM_StateManager } from \\\"./OVM_StateManager.sol\\\";\\n\\n/**\\n * @title OVM_StateManagerFactory\\n * @dev The State Manager Factory is called by a State Transitioner's init code, to create a new\\n * State Manager for use in the Fraud Verification process.\\n * \\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract OVM_StateManagerFactory is iOVM_StateManagerFactory {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Creates a new OVM_StateManager\\n * @param _owner Owner of the created contract.\\n * @return New OVM_StateManager instance.\\n */\\n function create(\\n address _owner\\n )\\n override\\n public\\n returns (\\n iOVM_StateManager\\n )\\n {\\n return new OVM_StateManager(_owner);\\n }\\n}\\n\",\"keccak256\":\"0xe2576f2a2ef4e829464216212d919f4aa4bda7144b5454d111f6eaca4aaf4a33\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/execution/iOVM_StateManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title iOVM_StateManager\\n */\\ninterface iOVM_StateManager {\\n\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n enum ItemState {\\n ITEM_UNTOUCHED,\\n ITEM_LOADED,\\n ITEM_CHANGED,\\n ITEM_COMMITTED\\n }\\n\\n /***************************\\n * Public Functions: Misc *\\n ***************************/\\n\\n function isAuthenticated(address _address) external view returns (bool);\\n\\n /***************************\\n * Public Functions: Setup *\\n ***************************/\\n\\n function owner() external view returns (address _owner);\\n function ovmExecutionManager() external view returns (address _ovmExecutionManager);\\n function setExecutionManager(address _ovmExecutionManager) external;\\n\\n\\n /************************************\\n * Public Functions: Account Access *\\n ************************************/\\n\\n function putAccount(address _address, Lib_OVMCodec.Account memory _account) external;\\n function putEmptyAccount(address _address) external;\\n function getAccount(address _address) external view returns (Lib_OVMCodec.Account memory _account);\\n function hasAccount(address _address) external view returns (bool _exists);\\n function hasEmptyAccount(address _address) external view returns (bool _exists);\\n function setAccountNonce(address _address, uint256 _nonce) external;\\n function getAccountNonce(address _address) external view returns (uint256 _nonce);\\n function getAccountEthAddress(address _address) external view returns (address _ethAddress);\\n function getAccountStorageRoot(address _address) external view returns (bytes32 _storageRoot);\\n function initPendingAccount(address _address) external;\\n function commitPendingAccount(address _address, address _ethAddress, bytes32 _codeHash) external;\\n function testAndSetAccountLoaded(address _address) external returns (bool _wasAccountAlreadyLoaded);\\n function testAndSetAccountChanged(address _address) external returns (bool _wasAccountAlreadyChanged);\\n function commitAccount(address _address) external returns (bool _wasAccountCommitted);\\n function incrementTotalUncommittedAccounts() external;\\n function getTotalUncommittedAccounts() external view returns (uint256 _total);\\n function wasAccountChanged(address _address) external view returns (bool);\\n function wasAccountCommitted(address _address) external view returns (bool);\\n\\n\\n /************************************\\n * Public Functions: Storage Access *\\n ************************************/\\n\\n function putContractStorage(address _contract, bytes32 _key, bytes32 _value) external;\\n function getContractStorage(address _contract, bytes32 _key) external view returns (bytes32 _value);\\n function hasContractStorage(address _contract, bytes32 _key) external view returns (bool _exists);\\n function testAndSetContractStorageLoaded(address _contract, bytes32 _key) external returns (bool _wasContractStorageAlreadyLoaded);\\n function testAndSetContractStorageChanged(address _contract, bytes32 _key) external returns (bool _wasContractStorageAlreadyChanged);\\n function commitContractStorage(address _contract, bytes32 _key) external returns (bool _wasContractStorageCommitted);\\n function incrementTotalUncommittedContractStorage() external;\\n function getTotalUncommittedContractStorage() external view returns (uint256 _total);\\n function wasContractStorageChanged(address _contract, bytes32 _key) external view returns (bool);\\n function wasContractStorageCommitted(address _contract, bytes32 _key) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x7a11dbd1f61593ba34debe07e39eef59967307f7f372ba9855bee0953585d08d\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/execution/iOVM_StateManagerFactory.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Contract Imports */\\nimport { iOVM_StateManager } from \\\"./iOVM_StateManager.sol\\\";\\n\\n/**\\n * @title iOVM_StateManagerFactory\\n */\\ninterface iOVM_StateManagerFactory {\\n\\n /***************************************\\n * Public Functions: Contract Creation *\\n ***************************************/\\n\\n function create(\\n address _owner\\n )\\n external\\n returns (\\n iOVM_StateManager _ovmStateManager\\n );\\n}\\n\",\"keccak256\":\"0x27a90fc43889d0c7d1db50f37907ef7386d9b415d15a1e91a0a068cba59afd36\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/codec/Lib_OVMCodec.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../utils/Lib_Bytes32Utils.sol\\\";\\nimport { Lib_SafeExecutionManagerWrapper } from \\\"../../libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\\\";\\n\\n/**\\n * @title Lib_OVMCodec\\n */\\nlibrary Lib_OVMCodec {\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum EOASignatureType {\\n EIP155_TRANSACTION,\\n ETH_SIGNED_MESSAGE\\n }\\n\\n enum QueueOrigin {\\n SEQUENCER_QUEUE,\\n L1TOL2_QUEUE\\n }\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Account {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n address ethAddress;\\n bool isFresh;\\n }\\n\\n struct EVMAccount {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n }\\n\\n struct ChainBatchHeader {\\n uint256 batchIndex;\\n bytes32 batchRoot;\\n uint256 batchSize;\\n uint256 prevTotalElements;\\n bytes extraData;\\n }\\n\\n struct ChainInclusionProof {\\n uint256 index;\\n bytes32[] siblings;\\n }\\n\\n struct Transaction {\\n uint256 timestamp;\\n uint256 blockNumber;\\n QueueOrigin l1QueueOrigin;\\n address l1TxOrigin;\\n address entrypoint;\\n uint256 gasLimit;\\n bytes data;\\n }\\n\\n struct TransactionChainElement {\\n bool isSequenced;\\n uint256 queueIndex; // QUEUED TX ONLY\\n uint256 timestamp; // SEQUENCER TX ONLY\\n uint256 blockNumber; // SEQUENCER TX ONLY\\n bytes txData; // SEQUENCER TX ONLY\\n }\\n\\n struct QueueElement {\\n bytes32 transactionHash;\\n uint40 timestamp;\\n uint40 blockNumber;\\n }\\n\\n struct EIP155Transaction {\\n uint256 nonce;\\n uint256 gasPrice;\\n uint256 gasLimit;\\n address to;\\n uint256 value;\\n bytes data;\\n uint256 chainId;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Decodes an EOA transaction (i.e., native Ethereum RLP encoding).\\n * @param _transaction Encoded EOA transaction.\\n * @return Transaction decoded into a struct.\\n */\\n function decodeEIP155Transaction(\\n bytes memory _transaction,\\n bool _isEthSignedMessage\\n )\\n internal\\n pure\\n returns (\\n EIP155Transaction memory\\n )\\n {\\n if (_isEthSignedMessage) {\\n (\\n uint256 _nonce,\\n uint256 _gasLimit,\\n uint256 _gasPrice,\\n uint256 _chainId,\\n address _to,\\n bytes memory _data\\n ) = abi.decode(\\n _transaction,\\n (uint256, uint256, uint256, uint256, address ,bytes)\\n );\\n return EIP155Transaction({\\n nonce: _nonce,\\n gasPrice: _gasPrice,\\n gasLimit: _gasLimit,\\n to: _to,\\n value: 0,\\n data: _data,\\n chainId: _chainId\\n });\\n } else {\\n Lib_RLPReader.RLPItem[] memory decoded = Lib_RLPReader.readList(_transaction);\\n\\n return EIP155Transaction({\\n nonce: Lib_RLPReader.readUint256(decoded[0]),\\n gasPrice: Lib_RLPReader.readUint256(decoded[1]),\\n gasLimit: Lib_RLPReader.readUint256(decoded[2]),\\n to: Lib_RLPReader.readAddress(decoded[3]),\\n value: Lib_RLPReader.readUint256(decoded[4]),\\n data: Lib_RLPReader.readBytes(decoded[5]),\\n chainId: Lib_RLPReader.readUint256(decoded[6])\\n });\\n }\\n }\\n\\n /**\\n * Decompresses a compressed EIP155 transaction.\\n * @param _transaction Compressed EIP155 transaction bytes.\\n * @return Transaction parsed into a struct.\\n */\\n function decompressEIP155Transaction(\\n bytes memory _transaction\\n )\\n internal\\n returns (\\n EIP155Transaction memory\\n )\\n {\\n return EIP155Transaction({\\n gasLimit: Lib_BytesUtils.toUint24(_transaction, 0),\\n gasPrice: uint256(Lib_BytesUtils.toUint24(_transaction, 3)) * 1000000,\\n nonce: Lib_BytesUtils.toUint24(_transaction, 6),\\n to: Lib_BytesUtils.toAddress(_transaction, 9),\\n data: Lib_BytesUtils.slice(_transaction, 29),\\n chainId: Lib_SafeExecutionManagerWrapper.safeCHAINID(),\\n value: 0\\n });\\n }\\n\\n /**\\n * Encodes an EOA transaction back into the original transaction.\\n * @param _transaction EIP155transaction to encode.\\n * @param _isEthSignedMessage Whether or not this was an eth signed message.\\n * @return Encoded transaction.\\n */\\n function encodeEIP155Transaction(\\n EIP155Transaction memory _transaction,\\n bool _isEthSignedMessage\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n if (_isEthSignedMessage) {\\n return abi.encode(\\n _transaction.nonce,\\n _transaction.gasLimit,\\n _transaction.gasPrice,\\n _transaction.chainId,\\n _transaction.to,\\n _transaction.data\\n );\\n } else {\\n bytes[] memory raw = new bytes[](9);\\n\\n raw[0] = Lib_RLPWriter.writeUint(_transaction.nonce);\\n raw[1] = Lib_RLPWriter.writeUint(_transaction.gasPrice);\\n raw[2] = Lib_RLPWriter.writeUint(_transaction.gasLimit);\\n if (_transaction.to == address(0)) {\\n raw[3] = Lib_RLPWriter.writeBytes('');\\n } else {\\n raw[3] = Lib_RLPWriter.writeAddress(_transaction.to);\\n }\\n raw[4] = Lib_RLPWriter.writeUint(0);\\n raw[5] = Lib_RLPWriter.writeBytes(_transaction.data);\\n raw[6] = Lib_RLPWriter.writeUint(_transaction.chainId);\\n raw[7] = Lib_RLPWriter.writeBytes(bytes(''));\\n raw[8] = Lib_RLPWriter.writeBytes(bytes(''));\\n\\n return Lib_RLPWriter.writeList(raw);\\n }\\n }\\n\\n /**\\n * Encodes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Encoded transaction bytes.\\n */\\n function encodeTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return abi.encodePacked(\\n _transaction.timestamp,\\n _transaction.blockNumber,\\n _transaction.l1QueueOrigin,\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n );\\n }\\n\\n /**\\n * Hashes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Hashed transaction\\n */\\n function hashTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(encodeTransaction(_transaction));\\n }\\n\\n /**\\n * Converts an OVM account to an EVM account.\\n * @param _in OVM account to convert.\\n * @return Converted EVM account.\\n */\\n function toEVMAccount(\\n Account memory _in\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n return EVMAccount({\\n nonce: _in.nonce,\\n balance: _in.balance,\\n storageRoot: _in.storageRoot,\\n codeHash: _in.codeHash\\n });\\n }\\n\\n /**\\n * @notice RLP-encodes an account state struct.\\n * @param _account Account state struct.\\n * @return RLP-encoded account state.\\n */\\n function encodeEVMAccount(\\n EVMAccount memory _account\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes[] memory raw = new bytes[](4);\\n\\n // Unfortunately we can't create this array outright because\\n // Lib_RLPWriter.writeList will reject fixed-size arrays. Assigning\\n // index-by-index circumvents this issue.\\n raw[0] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.nonce)\\n )\\n );\\n raw[1] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.balance)\\n )\\n );\\n raw[2] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.storageRoot));\\n raw[3] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.codeHash));\\n\\n return Lib_RLPWriter.writeList(raw);\\n }\\n\\n /**\\n * @notice Decodes an RLP-encoded account state into a useful struct.\\n * @param _encoded RLP-encoded account state.\\n * @return Account state struct.\\n */\\n function decodeEVMAccount(\\n bytes memory _encoded\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\\n\\n return EVMAccount({\\n nonce: Lib_RLPReader.readUint256(accountState[0]),\\n balance: Lib_RLPReader.readUint256(accountState[1]),\\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\\n });\\n }\\n\\n /**\\n * Calculates a hash for a given batch header.\\n * @param _batchHeader Header to hash.\\n * @return Hash of the header.\\n */\\n function hashBatchHeader(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(\\n abi.encode(\\n _batchHeader.batchRoot,\\n _batchHeader.batchSize,\\n _batchHeader.prevTotalElements,\\n _batchHeader.extraData\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0xe7e518ba7bba3fa28c532f8902576c1bb4dfc1ec4b62bed6da50623248ba17c3\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPReader.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_RLPReader\\n * @dev Adapted from \\\"RLPReader\\\" by Hamdi Allam (hamdi.allam97@gmail.com).\\n */\\nlibrary Lib_RLPReader {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 constant internal MAX_LIST_LENGTH = 32;\\n\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum RLPItemType {\\n DATA_ITEM,\\n LIST_ITEM\\n }\\n\\n \\n /***********\\n * Structs *\\n ***********/\\n\\n struct RLPItem {\\n uint256 length;\\n uint256 ptr;\\n }\\n \\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n \\n /**\\n * Converts bytes to a reference to memory position and length.\\n * @param _in Input bytes to convert.\\n * @return Output memory reference.\\n */\\n function toRLPItem(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem memory\\n )\\n {\\n uint256 ptr;\\n assembly {\\n ptr := add(_in, 32)\\n }\\n\\n return RLPItem({\\n length: _in.length,\\n ptr: ptr\\n });\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n (\\n uint256 listOffset,\\n ,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.LIST_ITEM,\\n \\\"Invalid RLP list value.\\\"\\n );\\n\\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\\n // writing to the length. Since we can't know the number of RLP items without looping over\\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\\n // simply set a reasonable maximum list length and decrease the size before we finish.\\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\\n\\n uint256 itemCount = 0;\\n uint256 offset = listOffset;\\n while (offset < _in.length) {\\n require(\\n itemCount < MAX_LIST_LENGTH,\\n \\\"Provided RLP list exceeds max list length.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n ) = _decodeLength(RLPItem({\\n length: _in.length - offset,\\n ptr: _in.ptr + offset\\n }));\\n\\n out[itemCount] = RLPItem({\\n length: itemLength + itemOffset,\\n ptr: _in.ptr + offset\\n });\\n\\n itemCount += 1;\\n offset += itemOffset + itemLength;\\n }\\n\\n // Decrease the array size to match the actual item count.\\n assembly {\\n mstore(out, itemCount)\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n return readList(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes value.\\\"\\n );\\n\\n return _copy(_in.ptr, itemOffset, itemLength);\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return readBytes(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return string(readBytes(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return readString(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n require(\\n _in.length <= 33,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr + itemOffset;\\n bytes32 out;\\n assembly {\\n out := mload(ptr)\\n\\n // Shift the bytes over to match the item size.\\n if lt(itemLength, 32) {\\n out := div(out, exp(256, sub(32, itemLength)))\\n }\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return readBytes32(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return uint256(readBytes32(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return readUint256(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n require(\\n _in.length == 1,\\n \\\"Invalid RLP boolean value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 out;\\n assembly {\\n out := byte(0, mload(ptr))\\n }\\n\\n require(\\n out == 0 || out == 1,\\n \\\"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\\\"\\n );\\n\\n return out != 0;\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return readBool(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n if (_in.length == 1) {\\n return address(0);\\n }\\n\\n require(\\n _in.length == 21,\\n \\\"Invalid RLP address value.\\\"\\n );\\n\\n return address(readUint256(_in));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return readAddress(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads the raw bytes of an RLP item.\\n * @param _in RLP item to read.\\n * @return Raw RLP bytes.\\n */\\n function readRawBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in);\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Decodes the length of an RLP item.\\n * @param _in RLP item to decode.\\n * @return Offset of the encoded data.\\n * @return Length of the encoded data.\\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\\n */\\n function _decodeLength(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n uint256,\\n uint256,\\n RLPItemType\\n )\\n {\\n require(\\n _in.length > 0,\\n \\\"RLP item cannot be null.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 prefix;\\n assembly {\\n prefix := byte(0, mload(ptr))\\n }\\n\\n if (prefix <= 0x7f) {\\n // Single byte.\\n\\n return (0, 1, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xb7) {\\n // Short string.\\n\\n uint256 strLen = prefix - 0x80;\\n \\n require(\\n _in.length > strLen,\\n \\\"Invalid RLP short string.\\\"\\n );\\n\\n return (1, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xbf) {\\n // Long string.\\n uint256 lenOfStrLen = prefix - 0xb7;\\n\\n require(\\n _in.length > lenOfStrLen,\\n \\\"Invalid RLP long string length.\\\"\\n );\\n\\n uint256 strLen;\\n assembly {\\n // Pick out the string length.\\n strLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfStrLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfStrLen + strLen,\\n \\\"Invalid RLP long string.\\\"\\n );\\n\\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xf7) {\\n // Short list.\\n uint256 listLen = prefix - 0xc0;\\n\\n require(\\n _in.length > listLen,\\n \\\"Invalid RLP short list.\\\"\\n );\\n\\n return (1, listLen, RLPItemType.LIST_ITEM);\\n } else {\\n // Long list.\\n uint256 lenOfListLen = prefix - 0xf7;\\n\\n require(\\n _in.length > lenOfListLen,\\n \\\"Invalid RLP long list length.\\\"\\n );\\n\\n uint256 listLen;\\n assembly {\\n // Pick out the list length.\\n listLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfListLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfListLen + listLen,\\n \\\"Invalid RLP long list.\\\"\\n );\\n\\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\\n }\\n }\\n\\n /**\\n * Copies the bytes from a memory location.\\n * @param _src Pointer to the location to read from.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Copied bytes.\\n */\\n function _copy(\\n uint256 _src,\\n uint256 _offset,\\n uint256 _length\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out = new bytes(_length);\\n if (out.length == 0) {\\n return out;\\n }\\n\\n uint256 src = _src + _offset;\\n uint256 dest;\\n assembly {\\n dest := add(out, 32)\\n }\\n\\n // Copy over as many complete words as we can.\\n for (uint256 i = 0; i < _length / 32; i++) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n\\n src += 32;\\n dest += 32;\\n }\\n\\n // Pick out the remaining bytes.\\n uint256 mask = 256 ** (32 - (_length % 32)) - 1;\\n assembly {\\n mstore(\\n dest,\\n or(\\n and(mload(src), not(mask)),\\n and(mload(dest), mask)\\n )\\n )\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Copies an RLP item into bytes.\\n * @param _in RLP item to copy.\\n * @return Copied bytes.\\n */\\n function _copy(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in.ptr, 0, _in.length);\\n }\\n}\\n\",\"keccak256\":\"0xbdb8fae0ca2483b4cc07607a5070fc25e33c54b4e4462b99e7c0b13aac48a09b\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPWriter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\n\\n/**\\n * @title Lib_RLPWriter\\n * @author Bakaoh (with modifications)\\n */\\nlibrary Lib_RLPWriter {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * RLP encodes a byte string.\\n * @param _in The byte string to encode.\\n * @return _out The RLP encoded string in bytes.\\n */\\n function writeBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n bytes memory encoded;\\n\\n if (_in.length == 1 && uint8(_in[0]) < 128) {\\n encoded = _in;\\n } else {\\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * RLP encodes a list of RLP encoded byte byte strings.\\n * @param _in The list of RLP encoded byte strings.\\n * @return _out The RLP encoded list of items in bytes.\\n */\\n function writeList(\\n bytes[] memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n bytes memory list = _flatten(_in);\\n return abi.encodePacked(_writeLength(list.length, 192), list);\\n }\\n\\n /**\\n * RLP encodes a string.\\n * @param _in The string to encode.\\n * @return _out The RLP encoded string in bytes.\\n */\\n function writeString(\\n string memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(bytes(_in));\\n }\\n\\n /**\\n * RLP encodes an address.\\n * @param _in The address to encode.\\n * @return _out The RLP encoded address in bytes.\\n */\\n function writeAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a uint.\\n * @param _in The uint256 to encode.\\n * @return _out The RLP encoded uint256 in bytes.\\n */\\n function writeUint(\\n uint256 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(_toBinary(_in));\\n }\\n\\n /**\\n * RLP encodes a bool.\\n * @param _in The bool to encode.\\n * @return _out The RLP encoded bool in bytes.\\n */\\n function writeBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n bytes memory encoded = new bytes(1);\\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\\n return encoded;\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\\n * @param _len The length of the string or the payload.\\n * @param _offset 128 if item is string, 192 if item is list.\\n * @return _encoded RLP encoded bytes.\\n */\\n function _writeLength(\\n uint256 _len,\\n uint256 _offset\\n )\\n private\\n pure\\n returns (\\n bytes memory _encoded\\n )\\n {\\n bytes memory encoded;\\n\\n if (_len < 56) {\\n encoded = new bytes(1);\\n encoded[0] = byte(uint8(_len) + uint8(_offset));\\n } else {\\n uint256 lenLen;\\n uint256 i = 1;\\n while (_len / i != 0) {\\n lenLen++;\\n i *= 256;\\n }\\n\\n encoded = new bytes(lenLen + 1);\\n encoded[0] = byte(uint8(lenLen) + uint8(_offset) + 55);\\n for(i = 1; i <= lenLen; i++) {\\n encoded[i] = byte(uint8((_len / (256**(lenLen-i))) % 256));\\n }\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * Encode integer in big endian binary form with no leading zeroes.\\n * @notice TODO: This should be optimized with assembly to save gas costs.\\n * @param _x The integer to encode.\\n * @return _binary RLP encoded bytes.\\n */\\n function _toBinary(\\n uint256 _x\\n )\\n private\\n pure\\n returns (\\n bytes memory _binary\\n )\\n {\\n bytes memory b = abi.encodePacked(_x);\\n\\n uint256 i = 0;\\n for (; i < 32; i++) {\\n if (b[i] != 0) {\\n break;\\n }\\n }\\n\\n bytes memory res = new bytes(32 - i);\\n for (uint256 j = 0; j < res.length; j++) {\\n res[j] = b[i++];\\n }\\n\\n return res;\\n }\\n\\n /**\\n * Copies a piece of memory to another location.\\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\\n * @param _dest Destination location.\\n * @param _src Source location.\\n * @param _len Length of memory to copy.\\n */\\n function _memcpy(\\n uint256 _dest,\\n uint256 _src,\\n uint256 _len\\n )\\n private\\n pure\\n {\\n uint256 dest = _dest;\\n uint256 src = _src;\\n uint256 len = _len;\\n\\n for(; len >= 32; len -= 32) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n dest += 32;\\n src += 32;\\n }\\n\\n uint256 mask = 256 ** (32 - len) - 1;\\n assembly {\\n let srcpart := and(mload(src), not(mask))\\n let destpart := and(mload(dest), mask)\\n mstore(dest, or(destpart, srcpart))\\n }\\n }\\n\\n /**\\n * Flattens a list of byte strings into one byte string.\\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\\n * @param _list List of byte strings to flatten.\\n * @return _flattened The flattened byte string.\\n */\\n function _flatten(\\n bytes[] memory _list\\n )\\n private\\n pure\\n returns (\\n bytes memory _flattened\\n )\\n {\\n if (_list.length == 0) {\\n return new bytes(0);\\n }\\n\\n uint256 len;\\n uint256 i = 0;\\n for (; i < _list.length; i++) {\\n len += _list[i].length;\\n }\\n\\n bytes memory flattened = new bytes(len);\\n uint256 flattenedPtr;\\n assembly { flattenedPtr := add(flattened, 0x20) }\\n\\n for(i = 0; i < _list.length; i++) {\\n bytes memory item = _list[i];\\n\\n uint256 listPtr;\\n assembly { listPtr := add(item, 0x20)}\\n\\n _memcpy(flattenedPtr, listPtr, item.length);\\n flattenedPtr += _list[i].length;\\n }\\n\\n return flattened;\\n }\\n}\",\"keccak256\":\"0xbcb24619c1758cb0d9f3fe5c79495950045a9087046a02b9ce01df46ae09ae5b\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_Bytes32Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_Byte32Utils\\n */\\nlibrary Lib_Bytes32Utils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \\\"true.\\\"\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as a boolean.\\n */\\n function toBool(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return _in != 0;\\n }\\n\\n /**\\n * Converts a boolean to a bytes32 value.\\n * @param _in Input boolean value.\\n * @return Boolean as a bytes32.\\n */\\n function fromBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in ? 1 : 0));\\n }\\n\\n /**\\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as an address.\\n */\\n function toAddress(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return address(uint160(uint256(_in)));\\n }\\n\\n /**\\n * Converts an address to a bytes32.\\n * @param _in Input address value.\\n * @return Address as a bytes32.\\n */\\n function fromAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in));\\n }\\n\\n /**\\n * Removes the leading zeros from a bytes32 value and returns a new (smaller) bytes value.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 without any leading zeros.\\n */\\n function removeLeadingZeros(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out;\\n\\n assembly {\\n // Figure out how many leading zero bytes to remove.\\n let shift := 0\\n for { let i := 0 } and(lt(i, 32), eq(byte(i, _in), 0)) { i := add(i, 1) } {\\n shift := add(shift, 1)\\n }\\n\\n // Reserve some space for our output and fix the free memory pointer.\\n out := mload(0x40)\\n mstore(0x40, add(out, 0x40))\\n\\n // Shift the value and store it into the output bytes.\\n mstore(add(out, 0x20), shl(mul(shift, 8), _in))\\n\\n // Store the new size (with leading zero bytes removed) in the output byte size.\\n mstore(out, sub(32, shift))\\n }\\n\\n return out;\\n }\\n}\\n\",\"keccak256\":\"0xfa2def593e3fc56a31852c3744aefdaa93cec74e721bfcfeb1e5d166c7c60b64\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_BytesUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_BytesUtils\\n */\\nlibrary Lib_BytesUtils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_start + _length >= _start, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n if (_bytes.length - _start == 0) {\\n return bytes('');\\n }\\n\\n return slice(_bytes, _start, _bytes.length - _start);\\n }\\n\\n function toBytes32PadLeft(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes32)\\n {\\n bytes32 ret;\\n uint256 len = _bytes.length <= 32 ? _bytes.length : 32;\\n assembly {\\n ret := shr(mul(sub(32, len), 8), mload(add(_bytes, 32)))\\n }\\n return ret;\\n }\\n\\n function toBytes32(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes32)\\n {\\n if (_bytes.length < 32) {\\n bytes32 ret;\\n assembly {\\n ret := mload(add(_bytes, 32))\\n }\\n return ret;\\n }\\n\\n return abi.decode(_bytes,(bytes32)); // will truncate if input length > 32 bytes\\n }\\n\\n function toUint256(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (uint256)\\n {\\n return uint256(toBytes32(_bytes));\\n }\\n\\n function toUint24(bytes memory _bytes, uint256 _start) internal pure returns (uint24) {\\n require(_start + 3 >= _start, \\\"toUint24_overflow\\\");\\n require(_bytes.length >= _start + 3 , \\\"toUint24_outOfBounds\\\");\\n uint24 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x3), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toUint8(bytes memory _bytes, uint256 _start) internal pure returns (uint8) {\\n require(_start + 1 >= _start, \\\"toUint8_overflow\\\");\\n require(_bytes.length >= _start + 1 , \\\"toUint8_outOfBounds\\\");\\n uint8 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x1), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toAddress(bytes memory _bytes, uint256 _start) internal pure returns (address) {\\n require(_start + 20 >= _start, \\\"toAddress_overflow\\\");\\n require(_bytes.length >= _start + 20, \\\"toAddress_outOfBounds\\\");\\n address tempAddress;\\n\\n assembly {\\n tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000)\\n }\\n\\n return tempAddress;\\n }\\n\\n function toNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n bytes memory nibbles = new bytes(_bytes.length * 2);\\n\\n for (uint256 i = 0; i < _bytes.length; i++) {\\n nibbles[i * 2] = _bytes[i] >> 4;\\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\\n }\\n\\n return nibbles;\\n }\\n\\n function fromNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n bytes memory ret = new bytes(_bytes.length / 2);\\n\\n for (uint256 i = 0; i < ret.length; i++) {\\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\\n }\\n\\n return ret;\\n }\\n\\n function equal(\\n bytes memory _bytes,\\n bytes memory _other\\n )\\n internal\\n pure\\n returns (bool)\\n {\\n return keccak256(_bytes) == keccak256(_other);\\n }\\n}\\n\",\"keccak256\":\"0x0adf22e1b22ba09911e859f64cb3b484e992be4f9fd3b09088e6225bf8d06ce0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_ErrorUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/**\\n * @title Lib_ErrorUtils\\n */\\nlibrary Lib_ErrorUtils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Encodes an error string into raw solidity-style revert data.\\n * (i.e. ascii bytes, prefixed with bytes4(keccak(\\\"Error(string))\\\"))\\n * Ref: https://docs.soliditylang.org/en/v0.8.2/control-structures.html?highlight=Error(string)#panic-via-assert-and-error-via-require\\n * @param _reason Reason for the reversion.\\n * @return Standard solidity revert data for the given reason.\\n */\\n function encodeRevertString(\\n string memory _reason\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return abi.encodeWithSignature(\\n \\\"Error(string)\\\",\\n _reason\\n );\\n }\\n}\\n\",\"keccak256\":\"0xfc64ec4a81fb50865b502a0004ed154e8598e1a313db77303fc95e41f536e6b7\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_ErrorUtils } from \\\"../utils/Lib_ErrorUtils.sol\\\";\\n\\n/**\\n * @title Lib_SafeExecutionManagerWrapper\\n * @dev The Safe Execution Manager Wrapper provides functions which facilitate writing OVM safe \\n * code using the standard solidity compiler, by routing all its operations through the Execution \\n * Manager.\\n * \\n * Compiler used: solc\\n * Runtime target: OVM\\n */\\nlibrary Lib_SafeExecutionManagerWrapper {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Performs a safe ovmCALL.\\n * @param _gasLimit Gas limit for the call.\\n * @param _target Address to call.\\n * @param _calldata Data to send to the call.\\n * @return _success Whether or not the call reverted.\\n * @return _returndata Data returned by the call.\\n */\\n function safeCALL(\\n uint256 _gasLimit,\\n address _target,\\n bytes memory _calldata\\n )\\n internal\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCALL(uint256,address,bytes)\\\",\\n _gasLimit,\\n _target,\\n _calldata\\n )\\n );\\n\\n return abi.decode(returndata, (bool, bytes));\\n }\\n\\n /**\\n * Performs a safe ovmDELEGATECALL.\\n * @param _gasLimit Gas limit for the call.\\n * @param _target Address to call.\\n * @param _calldata Data to send to the call.\\n * @return _success Whether or not the call reverted.\\n * @return _returndata Data returned by the call.\\n */\\n function safeDELEGATECALL(\\n uint256 _gasLimit,\\n address _target,\\n bytes memory _calldata\\n )\\n internal\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmDELEGATECALL(uint256,address,bytes)\\\",\\n _gasLimit,\\n _target,\\n _calldata\\n )\\n );\\n\\n return abi.decode(returndata, (bool, bytes));\\n }\\n\\n /**\\n * Performs a safe ovmCREATE call.\\n * @param _gasLimit Gas limit for the creation.\\n * @param _bytecode Code for the new contract.\\n * @return _contract Address of the created contract.\\n */\\n function safeCREATE(\\n uint256 _gasLimit,\\n bytes memory _bytecode\\n )\\n internal\\n returns (\\n address,\\n bytes memory\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n _gasLimit,\\n abi.encodeWithSignature(\\n \\\"ovmCREATE(bytes)\\\",\\n _bytecode\\n )\\n );\\n\\n return abi.decode(returndata, (address, bytes));\\n }\\n\\n /**\\n * Performs a safe ovmEXTCODESIZE call.\\n * @param _contract Address of the contract to query the size of.\\n * @return _EXTCODESIZE Size of the requested contract in bytes.\\n */\\n function safeEXTCODESIZE(\\n address _contract\\n )\\n internal\\n returns (\\n uint256 _EXTCODESIZE\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmEXTCODESIZE(address)\\\",\\n _contract\\n )\\n );\\n\\n return abi.decode(returndata, (uint256));\\n }\\n\\n /**\\n * Performs a safe ovmCHAINID call.\\n * @return _CHAINID Result of calling ovmCHAINID.\\n */\\n function safeCHAINID()\\n internal\\n returns (\\n uint256 _CHAINID\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCHAINID()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (uint256));\\n }\\n\\n /**\\n * Performs a safe ovmCALLER call.\\n * @return _CALLER Result of calling ovmCALLER.\\n */\\n function safeCALLER()\\n internal\\n returns (\\n address _CALLER\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCALLER()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (address));\\n }\\n\\n /**\\n * Performs a safe ovmADDRESS call.\\n * @return _ADDRESS Result of calling ovmADDRESS.\\n */\\n function safeADDRESS()\\n internal\\n returns (\\n address _ADDRESS\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmADDRESS()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (address));\\n }\\n\\n /**\\n * Performs a safe ovmGETNONCE call.\\n * @return _nonce Result of calling ovmGETNONCE.\\n */\\n function safeGETNONCE()\\n internal\\n returns (\\n uint256 _nonce\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmGETNONCE()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (uint256));\\n }\\n\\n /**\\n * Performs a safe ovmINCREMENTNONCE call.\\n */\\n function safeINCREMENTNONCE()\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmINCREMENTNONCE()\\\"\\n )\\n );\\n }\\n\\n /**\\n * Performs a safe ovmCREATEEOA call.\\n * @param _messageHash Message hash which was signed by EOA\\n * @param _v v value of signature (0 or 1)\\n * @param _r r value of signature\\n * @param _s s value of signature\\n */\\n function safeCREATEEOA(\\n bytes32 _messageHash,\\n uint8 _v,\\n bytes32 _r,\\n bytes32 _s\\n )\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCREATEEOA(bytes32,uint8,bytes32,bytes32)\\\",\\n _messageHash,\\n _v,\\n _r,\\n _s\\n )\\n );\\n }\\n\\n /**\\n * Performs a safe REVERT.\\n * @param _reason String revert reason to pass along with the REVERT.\\n */\\n function safeREVERT(\\n string memory _reason\\n )\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmREVERT(bytes)\\\",\\n Lib_ErrorUtils.encodeRevertString(\\n _reason\\n )\\n )\\n );\\n }\\n\\n /**\\n * Performs a safe \\\"require\\\".\\n * @param _condition Boolean condition that must be true or will revert.\\n * @param _reason String revert reason to pass along with the REVERT.\\n */\\n function safeREQUIRE(\\n bool _condition,\\n string memory _reason\\n )\\n internal\\n {\\n if (!_condition) {\\n safeREVERT(\\n _reason\\n );\\n }\\n }\\n\\n /**\\n * Performs a safe ovmSLOAD call.\\n */\\n function safeSLOAD(\\n bytes32 _key\\n )\\n internal\\n returns (\\n bytes32\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmSLOAD(bytes32)\\\",\\n _key\\n )\\n );\\n\\n return abi.decode(returndata, (bytes32));\\n }\\n\\n /**\\n * Performs a safe ovmSSTORE call.\\n */\\n function safeSSTORE(\\n bytes32 _key,\\n bytes32 _value\\n )\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmSSTORE(bytes32,bytes32)\\\",\\n _key,\\n _value\\n )\\n );\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Performs an ovm interaction and the necessary safety checks.\\n * @param _gasLimit Gas limit for the interaction.\\n * @param _calldata Data to send to the OVM_ExecutionManager (encoded with sighash).\\n * @return _returndata Data sent back by the OVM_ExecutionManager.\\n */\\n function _safeExecutionManagerInteraction(\\n uint256 _gasLimit,\\n bytes memory _calldata\\n )\\n private\\n returns (\\n bytes memory _returndata\\n )\\n {\\n address ovmExecutionManager = msg.sender;\\n (\\n bool success,\\n bytes memory returndata\\n ) = ovmExecutionManager.call{gas: _gasLimit}(_calldata);\\n\\n if (success == false) {\\n assembly {\\n revert(add(returndata, 0x20), mload(returndata))\\n }\\n } else if (returndata.length == 1) {\\n assembly {\\n return(0, 1)\\n }\\n } else {\\n return returndata;\\n }\\n }\\n\\n function _safeExecutionManagerInteraction(\\n bytes memory _calldata\\n )\\n private\\n returns (\\n bytes memory _returndata\\n )\\n {\\n return _safeExecutionManagerInteraction(\\n gasleft(),\\n _calldata\\n );\\n }\\n}\\n\",\"keccak256\":\"0x41e146e7912af794a17cd43c5a276674be956bfa8f3ca5b451bcb82d81e6f492\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x608060405234801561001057600080fd5b50611437806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c80639ed9331814610030575b600080fd5b6100566004803603602081101561004657600080fd5b50356001600160a01b0316610072565b604080516001600160a01b039092168252519081900360200190f35b600081604051610081906100b5565b6001600160a01b03909116815260405190819003602001906000f0801580156100ae573d6000803e3d6000fd5b5092915050565b61133f806100c38339019056fe608060405234801561001057600080fd5b5060405161133f38038061133f83398101604081905261002f91610054565b600080546001600160a01b0319166001600160a01b0392909216919091179055610082565b600060208284031215610065578081fd5b81516001600160a01b038116811461007b578182fd5b9392505050565b6112ae806100916000396000f3fe608060405234801561001057600080fd5b50600436106101f05760003560e01c80638f3b96471161010f578063d126199f116100a2578063e90abb8611610071578063e90abb86146103f9578063fb37b31c1461040c578063fbcbc0f11461041f578063fcf149a21461043f576101f0565b8063d126199f146103b8578063d15d4150146103cb578063d54414c8146103de578063d7bd4a2a146103f1576101f0565b8063c3fd9b25116100de578063c3fd9b2514610377578063c7650bf21461037f578063c8e40fbf14610392578063d0a215f2146103a5576101f0565b80638f3b96471461033657806399056ba914610349578063af37b86414610351578063af3dc01114610364576101f0565b806333f94305116101875780636f3c75af116101565780636f3c75af146102f55780637c8ee703146103085780637e86faa81461031b5780638da5cb5b1461032e576101f0565b806333f94305146102b25780635c17d629146102ba5780636b18e4e8146102cd5780636c87ad20146102e0576101f0565b8063167020d2116101c3578063167020d2146102595780631aaf392f1461026c5780631b208a5a1461028c57806326dc5b121461029f576101f0565b806307a12945146101f55780630ad226791461021e57806311b1f790146102315780631381ba4d14610244575b600080fd5b61020861020336600461101d565b610452565b60405161021591906111c4565b60405180910390f35b61020861022c366004611072565b6104ba565b61020861023f36600461101d565b610517565b61025761025236600461101d565b610573565b005b61020861026736600461101d565b6105d4565b61027f61027a366004611072565b610679565b60405161021591906111cf565b61020861029a36600461101d565b610727565b61027f6102ad36600461101d565b61075e565b61025761077d565b6102576102c836600461109b565b6107c7565b6102576102db36600461101d565b61089a565b6102e8610944565b60405161021591906111b0565b610208610303366004611072565b610953565b6102e861031636600461101d565b61098c565b610208610329366004611072565b6109ad565b6102e86109c3565b6102576103443660046110cd565b6109d2565b61027f610a88565b61020861035f366004611072565b610a8e565b610208610372366004611072565b610ae2565b610257610b2f565b61020861038d366004611072565b610b79565b6102086103a036600461101d565b610c20565b6102576103b3366004611037565b610c40565b61027f6103c636600461101d565b610cb9565b6102086103d936600461101d565b610cd4565b6102086103ec36600461101d565b610d01565b61027f610d16565b610257610407366004611072565b610d1c565b61020861041a36600461101d565b610d77565b61043261042d36600461101d565b610dc3565b604051610215919061122e565b61025761044d36600461101d565b610e37565b6001600160a01b0381166000908152600260205260408120600301547fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4701480156104b257506001600160a01b038216600090815260026020526040902054155b90505b919050565b6001600160a01b038216600090815260046020908152604080832084845290915281205460ff168061050e57506001600160a01b038316600090815260026020526040902060040154600160a01b900460ff165b90505b92915050565b600080546001600160a01b031633148061053b57506001546001600160a01b031633145b6105605760405162461bcd60e51b8152600401610557906111d8565b60405180910390fd5b6104b261056c83610ef8565b6002610f28565b6000546001600160a01b031633148061059657506001546001600160a01b031633145b6105b25760405162461bcd60e51b8152600401610557906111d8565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b600080546001600160a01b03163314806105f857506001546001600160a01b031633145b6106145760405162461bcd60e51b8152600401610557906111d8565b600061061f83610ef8565b9050600260008281526005602052604090205460ff16600381111561064057fe5b1461064f5760009150506104b5565b6000908152600560205260409020805460ff19166003179055505060068054600019019055600190565b6001600160a01b038216600090815260046020908152604080832084845290915281205460ff161580156106cf57506001600160a01b038316600090815260026020526040902060040154600160a01b900460ff165b156106dc57506000610511565b506001600160a01b0391909116600090815260036020908152604080832093835292905220547ffeedfacecafebeeffeedfacecafebeeffeedfacecafebeeffeedfacecafebeef1890565b60008061073383610ef8565b905060025b60008281526005602052604090205460ff16600381111561075557fe5b10159392505050565b6001600160a01b03166000908152600260208190526040909120015490565b6000546001600160a01b03163314806107a057506001546001600160a01b031633145b6107bc5760405162461bcd60e51b8152600401610557906111d8565b600680546001019055565b6000546001600160a01b03163314806107ea57506001546001600160a01b031633145b6108065760405162461bcd60e51b8152600401610557906111d8565b6001600160a01b038316600081815260036020908152604080832086845282528083207ffeedfacecafebeeffeedfacecafebeeffeedfacecafebeeffeedfacecafebeef86189055928252600481528282208583529052205460ff16610895576001600160a01b03831660009081526004602090815260408083208584529091529020805460ff191660011790555b505050565b6000546001600160a01b03163314806108bd57506001546001600160a01b031633145b6108d95760405162461bcd60e51b8152600401610557906111d8565b6001600160a01b031660009081526002602081905260409091207f56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421918101919091557fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470600390910155565b6001546001600160a01b031681565b6000806109608484610f8e565b905060025b60008281526005602052604090205460ff16600381111561098257fe5b1015949350505050565b6001600160a01b039081166000908152600260205260409020600401541690565b6000806109ba8484610f8e565b90506003610965565b6000546001600160a01b031681565b6000546001600160a01b03163314806109f557506001546001600160a01b031633145b610a115760405162461bcd60e51b8152600401610557906111d8565b6001600160a01b039182166000908152600260208181526040928390208451815590840151600182015591830151908201556060820151600382015560808201516004909101805460a0909301516001600160a01b0319909316919093161760ff60a01b1916600160a01b91151591909102179055565b60075490565b600080546001600160a01b0316331480610ab257506001546001600160a01b031633145b610ace5760405162461bcd60e51b8152600401610557906111d8565b61050e610adb8484610f8e565b6001610f28565b600080546001600160a01b0316331480610b0657506001546001600160a01b031633145b610b225760405162461bcd60e51b8152600401610557906111d8565b61050e61056c8484610f8e565b6000546001600160a01b0316331480610b5257506001546001600160a01b031633145b610b6e5760405162461bcd60e51b8152600401610557906111d8565b600780546001019055565b600080546001600160a01b0316331480610b9d57506001546001600160a01b031633145b610bb95760405162461bcd60e51b8152600401610557906111d8565b6000610bc58484610f8e565b9050600260008281526005602052604090205460ff166003811115610be657fe5b14610bf5576000915050610511565b6000908152600560205260409020805460ff1916600317905550506007805460001901905550600190565b6001600160a01b0316600090815260026020526040902060030154151590565b6000546001600160a01b0316331480610c6357506001546001600160a01b031633145b610c7f5760405162461bcd60e51b8152600401610557906111d8565b6001600160a01b0392831660009081526002602052604090206004810180546001600160a01b031916939094169290921790925560030155565b6001600160a01b031660009081526002602052604090205490565b600080546001600160a01b03838116911614806104b25750506001546001600160a01b0390811691161490565b600080610d0d83610ef8565b90506003610738565b60065490565b6000546001600160a01b0316331480610d3f57506001546001600160a01b031633145b610d5b5760405162461bcd60e51b8152600401610557906111d8565b6001600160a01b03909116600090815260026020526040902055565b600080546001600160a01b0316331480610d9b57506001546001600160a01b031633145b610db75760405162461bcd60e51b8152600401610557906111d8565b6104b2610adb83610ef8565b610dcb610fc1565b506001600160a01b03908116600090815260026020818152604092839020835160c08101855281548152600182015492810192909252918201549281019290925260038101546060830152600401549182166080820152600160a01b90910460ff16151560a082015290565b6000546001600160a01b0316331480610e5a57506001546001600160a01b031633145b610e765760405162461bcd60e51b8152600401610557906111d8565b6001600160a01b03166000908152600260208190526040909120600181557f56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421918101919091557fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4706003820155600401805460ff60a01b1916600160a01b179055565b600081604051602001610f0b9190611171565b604051602081830303815290604052805190602001209050919050565b600080826003811115610f3757fe5b60008581526005602052604090205460ff166003811115610f5457fe5b101590508061050e576000848152600560205260409020805484919060ff19166001836003811115610f8257fe5b02179055509392505050565b60008282604051602001610fa392919061118e565b60405160208183030381529060405280519060200120905092915050565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081019190915290565b80356001600160a01b03811681146104b557600080fd5b803580151581146104b557600080fd5b60006020828403121561102e578081fd5b61050e82610ff6565b60008060006060848603121561104b578182fd5b61105484610ff6565b925061106260208501610ff6565b9150604084013590509250925092565b60008060408385031215611084578182fd5b61108d83610ff6565b946020939093013593505050565b6000806000606084860312156110af578283fd5b6110b884610ff6565b95602085013595506040909401359392505050565b60008082840360e08112156110e0578283fd5b6110e984610ff6565b925060c0601f19820112156110fc578182fd5b5060405160c0810181811067ffffffffffffffff8211171561111a57fe5b80604052506020840135815260408401356020820152606084013560408201526080840135606082015261115060a08501610ff6565b608082015261116160c0850161100d565b60a0820152809150509250929050565b60609190911b6bffffffffffffffffffffffff1916815260140190565b60609290921b6bffffffffffffffffffffffff19168252601482015260340190565b6001600160a01b0391909116815260200190565b901515815260200190565b90815260200190565b60208082526036908201527f46756e6374696f6e2063616e206f6e6c792062652063616c6c65642062792061604082015275757468656e746963617465642061646472657373657360501b606082015260800190565b815181526020808301519082015260408083015190820152606080830151908201526080808301516001600160a01b03169082015260a09182015115159181019190915260c0019056fea264697066735822122083b0df275bbbfff784b77a9fa94e123f3da2a60b85318e74d616096c9b426ad864736f6c63430007060033a26469706673582212201f7b94a40e4144fe744c1d3b426dc07081fe4aaafd870fc014f35a31921bbaae64736f6c63430007060033", - "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061002b5760003560e01c80639ed9331814610030575b600080fd5b6100566004803603602081101561004657600080fd5b50356001600160a01b0316610072565b604080516001600160a01b039092168252519081900360200190f35b600081604051610081906100b5565b6001600160a01b03909116815260405190819003602001906000f0801580156100ae573d6000803e3d6000fd5b5092915050565b61133f806100c38339019056fe608060405234801561001057600080fd5b5060405161133f38038061133f83398101604081905261002f91610054565b600080546001600160a01b0319166001600160a01b0392909216919091179055610082565b600060208284031215610065578081fd5b81516001600160a01b038116811461007b578182fd5b9392505050565b6112ae806100916000396000f3fe608060405234801561001057600080fd5b50600436106101f05760003560e01c80638f3b96471161010f578063d126199f116100a2578063e90abb8611610071578063e90abb86146103f9578063fb37b31c1461040c578063fbcbc0f11461041f578063fcf149a21461043f576101f0565b8063d126199f146103b8578063d15d4150146103cb578063d54414c8146103de578063d7bd4a2a146103f1576101f0565b8063c3fd9b25116100de578063c3fd9b2514610377578063c7650bf21461037f578063c8e40fbf14610392578063d0a215f2146103a5576101f0565b80638f3b96471461033657806399056ba914610349578063af37b86414610351578063af3dc01114610364576101f0565b806333f94305116101875780636f3c75af116101565780636f3c75af146102f55780637c8ee703146103085780637e86faa81461031b5780638da5cb5b1461032e576101f0565b806333f94305146102b25780635c17d629146102ba5780636b18e4e8146102cd5780636c87ad20146102e0576101f0565b8063167020d2116101c3578063167020d2146102595780631aaf392f1461026c5780631b208a5a1461028c57806326dc5b121461029f576101f0565b806307a12945146101f55780630ad226791461021e57806311b1f790146102315780631381ba4d14610244575b600080fd5b61020861020336600461101d565b610452565b60405161021591906111c4565b60405180910390f35b61020861022c366004611072565b6104ba565b61020861023f36600461101d565b610517565b61025761025236600461101d565b610573565b005b61020861026736600461101d565b6105d4565b61027f61027a366004611072565b610679565b60405161021591906111cf565b61020861029a36600461101d565b610727565b61027f6102ad36600461101d565b61075e565b61025761077d565b6102576102c836600461109b565b6107c7565b6102576102db36600461101d565b61089a565b6102e8610944565b60405161021591906111b0565b610208610303366004611072565b610953565b6102e861031636600461101d565b61098c565b610208610329366004611072565b6109ad565b6102e86109c3565b6102576103443660046110cd565b6109d2565b61027f610a88565b61020861035f366004611072565b610a8e565b610208610372366004611072565b610ae2565b610257610b2f565b61020861038d366004611072565b610b79565b6102086103a036600461101d565b610c20565b6102576103b3366004611037565b610c40565b61027f6103c636600461101d565b610cb9565b6102086103d936600461101d565b610cd4565b6102086103ec36600461101d565b610d01565b61027f610d16565b610257610407366004611072565b610d1c565b61020861041a36600461101d565b610d77565b61043261042d36600461101d565b610dc3565b604051610215919061122e565b61025761044d36600461101d565b610e37565b6001600160a01b0381166000908152600260205260408120600301547fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4701480156104b257506001600160a01b038216600090815260026020526040902054155b90505b919050565b6001600160a01b038216600090815260046020908152604080832084845290915281205460ff168061050e57506001600160a01b038316600090815260026020526040902060040154600160a01b900460ff165b90505b92915050565b600080546001600160a01b031633148061053b57506001546001600160a01b031633145b6105605760405162461bcd60e51b8152600401610557906111d8565b60405180910390fd5b6104b261056c83610ef8565b6002610f28565b6000546001600160a01b031633148061059657506001546001600160a01b031633145b6105b25760405162461bcd60e51b8152600401610557906111d8565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b600080546001600160a01b03163314806105f857506001546001600160a01b031633145b6106145760405162461bcd60e51b8152600401610557906111d8565b600061061f83610ef8565b9050600260008281526005602052604090205460ff16600381111561064057fe5b1461064f5760009150506104b5565b6000908152600560205260409020805460ff19166003179055505060068054600019019055600190565b6001600160a01b038216600090815260046020908152604080832084845290915281205460ff161580156106cf57506001600160a01b038316600090815260026020526040902060040154600160a01b900460ff165b156106dc57506000610511565b506001600160a01b0391909116600090815260036020908152604080832093835292905220547ffeedfacecafebeeffeedfacecafebeeffeedfacecafebeeffeedfacecafebeef1890565b60008061073383610ef8565b905060025b60008281526005602052604090205460ff16600381111561075557fe5b10159392505050565b6001600160a01b03166000908152600260208190526040909120015490565b6000546001600160a01b03163314806107a057506001546001600160a01b031633145b6107bc5760405162461bcd60e51b8152600401610557906111d8565b600680546001019055565b6000546001600160a01b03163314806107ea57506001546001600160a01b031633145b6108065760405162461bcd60e51b8152600401610557906111d8565b6001600160a01b038316600081815260036020908152604080832086845282528083207ffeedfacecafebeeffeedfacecafebeeffeedfacecafebeeffeedfacecafebeef86189055928252600481528282208583529052205460ff16610895576001600160a01b03831660009081526004602090815260408083208584529091529020805460ff191660011790555b505050565b6000546001600160a01b03163314806108bd57506001546001600160a01b031633145b6108d95760405162461bcd60e51b8152600401610557906111d8565b6001600160a01b031660009081526002602081905260409091207f56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421918101919091557fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470600390910155565b6001546001600160a01b031681565b6000806109608484610f8e565b905060025b60008281526005602052604090205460ff16600381111561098257fe5b1015949350505050565b6001600160a01b039081166000908152600260205260409020600401541690565b6000806109ba8484610f8e565b90506003610965565b6000546001600160a01b031681565b6000546001600160a01b03163314806109f557506001546001600160a01b031633145b610a115760405162461bcd60e51b8152600401610557906111d8565b6001600160a01b039182166000908152600260208181526040928390208451815590840151600182015591830151908201556060820151600382015560808201516004909101805460a0909301516001600160a01b0319909316919093161760ff60a01b1916600160a01b91151591909102179055565b60075490565b600080546001600160a01b0316331480610ab257506001546001600160a01b031633145b610ace5760405162461bcd60e51b8152600401610557906111d8565b61050e610adb8484610f8e565b6001610f28565b600080546001600160a01b0316331480610b0657506001546001600160a01b031633145b610b225760405162461bcd60e51b8152600401610557906111d8565b61050e61056c8484610f8e565b6000546001600160a01b0316331480610b5257506001546001600160a01b031633145b610b6e5760405162461bcd60e51b8152600401610557906111d8565b600780546001019055565b600080546001600160a01b0316331480610b9d57506001546001600160a01b031633145b610bb95760405162461bcd60e51b8152600401610557906111d8565b6000610bc58484610f8e565b9050600260008281526005602052604090205460ff166003811115610be657fe5b14610bf5576000915050610511565b6000908152600560205260409020805460ff1916600317905550506007805460001901905550600190565b6001600160a01b0316600090815260026020526040902060030154151590565b6000546001600160a01b0316331480610c6357506001546001600160a01b031633145b610c7f5760405162461bcd60e51b8152600401610557906111d8565b6001600160a01b0392831660009081526002602052604090206004810180546001600160a01b031916939094169290921790925560030155565b6001600160a01b031660009081526002602052604090205490565b600080546001600160a01b03838116911614806104b25750506001546001600160a01b0390811691161490565b600080610d0d83610ef8565b90506003610738565b60065490565b6000546001600160a01b0316331480610d3f57506001546001600160a01b031633145b610d5b5760405162461bcd60e51b8152600401610557906111d8565b6001600160a01b03909116600090815260026020526040902055565b600080546001600160a01b0316331480610d9b57506001546001600160a01b031633145b610db75760405162461bcd60e51b8152600401610557906111d8565b6104b2610adb83610ef8565b610dcb610fc1565b506001600160a01b03908116600090815260026020818152604092839020835160c08101855281548152600182015492810192909252918201549281019290925260038101546060830152600401549182166080820152600160a01b90910460ff16151560a082015290565b6000546001600160a01b0316331480610e5a57506001546001600160a01b031633145b610e765760405162461bcd60e51b8152600401610557906111d8565b6001600160a01b03166000908152600260208190526040909120600181557f56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421918101919091557fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4706003820155600401805460ff60a01b1916600160a01b179055565b600081604051602001610f0b9190611171565b604051602081830303815290604052805190602001209050919050565b600080826003811115610f3757fe5b60008581526005602052604090205460ff166003811115610f5457fe5b101590508061050e576000848152600560205260409020805484919060ff19166001836003811115610f8257fe5b02179055509392505050565b60008282604051602001610fa392919061118e565b60405160208183030381529060405280519060200120905092915050565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081019190915290565b80356001600160a01b03811681146104b557600080fd5b803580151581146104b557600080fd5b60006020828403121561102e578081fd5b61050e82610ff6565b60008060006060848603121561104b578182fd5b61105484610ff6565b925061106260208501610ff6565b9150604084013590509250925092565b60008060408385031215611084578182fd5b61108d83610ff6565b946020939093013593505050565b6000806000606084860312156110af578283fd5b6110b884610ff6565b95602085013595506040909401359392505050565b60008082840360e08112156110e0578283fd5b6110e984610ff6565b925060c0601f19820112156110fc578182fd5b5060405160c0810181811067ffffffffffffffff8211171561111a57fe5b80604052506020840135815260408401356020820152606084013560408201526080840135606082015261115060a08501610ff6565b608082015261116160c0850161100d565b60a0820152809150509250929050565b60609190911b6bffffffffffffffffffffffff1916815260140190565b60609290921b6bffffffffffffffffffffffff19168252601482015260340190565b6001600160a01b0391909116815260200190565b901515815260200190565b90815260200190565b60208082526036908201527f46756e6374696f6e2063616e206f6e6c792062652063616c6c65642062792061604082015275757468656e746963617465642061646472657373657360501b606082015260800190565b815181526020808301519082015260408083015190820152606080830151908201526080808301516001600160a01b03169082015260a09182015115159181019190915260c0019056fea264697066735822122083b0df275bbbfff784b77a9fa94e123f3da2a60b85318e74d616096c9b426ad864736f6c63430007060033a26469706673582212201f7b94a40e4144fe744c1d3b426dc07081fe4aaafd870fc014f35a31921bbaae64736f6c63430007060033", - "devdoc": { - "details": "The State Manager Factory is called by a State Transitioner's init code, to create a new State Manager for use in the Fraud Verification process. Compiler used: solc Runtime target: EVM", - "kind": "dev", - "methods": { - "create(address)": { - "params": { - "_owner": "Owner of the created contract." - }, - "returns": { - "_0": "New OVM_StateManager instance." - } - } - }, - "title": "OVM_StateManagerFactory", - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": { - "create(address)": { - "notice": "Creates a new OVM_StateManager" - } - }, - "version": 1 - }, - "storageLayout": { - "storage": [], - "types": null - } -} \ No newline at end of file diff --git a/packages/contracts/deployments/goerli-v2/OVM_StateTransitionerFactory.json b/packages/contracts/deployments/goerli-v2/OVM_StateTransitionerFactory.json deleted file mode 100644 index e586bb28a89ed..0000000000000 --- a/packages/contracts/deployments/goerli-v2/OVM_StateTransitionerFactory.json +++ /dev/null @@ -1,163 +0,0 @@ -{ - "address": "0x28f8A0877c2DC85b3Aa269bD772CaCc6e92D7371", - "abi": [ - { - "inputs": [ - { - "internalType": "address", - "name": "_libAddressManager", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_libAddressManager", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_stateTransitionIndex", - "type": "uint256" - }, - { - "internalType": "bytes32", - "name": "_preStateRoot", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "_transactionHash", - "type": "bytes32" - } - ], - "name": "create", - "outputs": [ - { - "internalType": "contract iOVM_StateTransitioner", - "name": "", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "libAddressManager", - "outputs": [ - { - "internalType": "contract Lib_AddressManager", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "string", - "name": "_name", - "type": "string" - } - ], - "name": "resolve", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - } - ], - "transactionHash": "0x70f5e9fce191d9e4212b6daad5471fb3ad82113eb5978ef9cbb96d5849c9daa3", - "receipt": { - "to": null, - "from": "0x558ba9b8d78713fbf768c1f8a584485B4003f43F", - "contractAddress": "0x28f8A0877c2DC85b3Aa269bD772CaCc6e92D7371", - "transactionIndex": 39, - "gasUsed": "4095339", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0xd47e89b39cbca83fb8bba1f276101420fcfbbfe0d559d2d697fecacd4d7d251f", - "transactionHash": "0x70f5e9fce191d9e4212b6daad5471fb3ad82113eb5978ef9cbb96d5849c9daa3", - "logs": [], - "blockNumber": 4607721, - "cumulativeGasUsed": "6346077", - "status": 1, - "byzantium": true - }, - "args": [ - "0x9933d137bBF050Cf3D7555fE1beC91eF698814e5" - ], - "solcInputHash": "8aef3555d89ad9d3af2f5d28a85dc856", - "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_stateTransitionIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"_preStateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"_transactionHash\",\"type\":\"bytes32\"}],\"name\":\"create\",\"outputs\":[{\"internalType\":\"contract iOVM_StateTransitioner\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The State Transitioner Factory is used by the Fraud Verifier to create a new State Transitioner during the initialization of a fraud proof. Compiler used: solc Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"create(address,uint256,bytes32,bytes32)\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\",\"_preStateRoot\":\"State root before the transition was executed.\",\"_stateTransitionIndex\":\"Index of the state transition being verified.\",\"_transactionHash\":\"Hash of the executed transaction.\"},\"returns\":{\"_0\":\"New OVM_StateTransitioner instance.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}}},\"title\":\"OVM_StateTransitionerFactory\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"create(address,uint256,bytes32,bytes32)\":{\"notice\":\"Creates a new OVM_StateTransitioner\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/OVM/verification/OVM_StateTransitionerFactory.sol\":\"OVM_StateTransitionerFactory\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/optimistic-ethereum/OVM/verification/Abs_FraudContributor.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\nimport { iOVM_BondManager } from \\\"../../iOVM/verification/iOVM_BondManager.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/// Minimal contract to be inherited by contracts consumed by users that provide\\n/// data for fraud proofs\\nabstract contract Abs_FraudContributor is Lib_AddressResolver {\\n /// Decorate your functions with this modifier to store how much total gas was\\n /// consumed by the sender, to reward users fairly\\n modifier contributesToFraudProof(bytes32 preStateRoot, bytes32 txHash) {\\n uint256 startGas = gasleft();\\n _;\\n uint256 gasSpent = startGas - gasleft();\\n iOVM_BondManager(resolve('OVM_BondManager')).recordGasSpent(preStateRoot, txHash, msg.sender, gasSpent);\\n }\\n}\\n\",\"keccak256\":\"0x6c27d089a297103cb93b30f7649ab68691cc6b948c315f1037e5de1fe9bf5903\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/verification/OVM_StateTransitioner.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// @unsupported: ovm\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\nimport { Lib_EthUtils } from \\\"../../libraries/utils/Lib_EthUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../../libraries/utils/Lib_Bytes32Utils.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../../libraries/utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_SecureMerkleTrie } from \\\"../../libraries/trie/Lib_SecureMerkleTrie.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../../libraries/rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_RLPReader } from \\\"../../libraries/rlp/Lib_RLPReader.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_StateTransitioner } from \\\"../../iOVM/verification/iOVM_StateTransitioner.sol\\\";\\nimport { iOVM_BondManager } from \\\"../../iOVM/verification/iOVM_BondManager.sol\\\";\\nimport { iOVM_ExecutionManager } from \\\"../../iOVM/execution/iOVM_ExecutionManager.sol\\\";\\nimport { iOVM_StateManager } from \\\"../../iOVM/execution/iOVM_StateManager.sol\\\";\\nimport { iOVM_StateManagerFactory } from \\\"../../iOVM/execution/iOVM_StateManagerFactory.sol\\\";\\n\\n/* Contract Imports */\\nimport { Abs_FraudContributor } from \\\"./Abs_FraudContributor.sol\\\";\\n\\n/**\\n * @title OVM_StateTransitioner\\n * @dev The State Transitioner coordinates the execution of a state transition during the evaluation of a\\n * fraud proof. It feeds verified input to the Execution Manager's run(), and controls a State Manager (which is\\n * uniquely created for each fraud proof).\\n * Once a fraud proof has been initialized, this contract is provided with the pre-state root and verifies\\n * that the OVM storage slots committed to the State Mangager are contained in that state\\n * This contract controls the State Manager and Execution Manager, and uses them to calculate the\\n * post-state root by applying the transaction. The Fraud Verifier can then check for fraud by comparing\\n * the calculated post-state root with the proposed post-state root.\\n *\\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract OVM_StateTransitioner is Lib_AddressResolver, Abs_FraudContributor, iOVM_StateTransitioner {\\n\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n enum TransitionPhase {\\n PRE_EXECUTION,\\n POST_EXECUTION,\\n COMPLETE\\n }\\n\\n\\n /*******************************************\\n * Contract Variables: Contract References *\\n *******************************************/\\n\\n iOVM_StateManager public ovmStateManager;\\n\\n\\n /*******************************************\\n * Contract Variables: Internal Accounting *\\n *******************************************/\\n\\n bytes32 internal preStateRoot;\\n bytes32 internal postStateRoot;\\n TransitionPhase public phase;\\n uint256 internal stateTransitionIndex;\\n bytes32 internal transactionHash;\\n\\n\\n /*************\\n * Constants *\\n *************/\\n\\n bytes32 internal constant EMPTY_ACCOUNT_CODE_HASH = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;\\n bytes32 internal constant EMPTY_ACCOUNT_STORAGE_ROOT = 0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n * @param _stateTransitionIndex Index of the state transition being verified.\\n * @param _preStateRoot State root before the transition was executed.\\n * @param _transactionHash Hash of the executed transaction.\\n */\\n constructor(\\n address _libAddressManager,\\n uint256 _stateTransitionIndex,\\n bytes32 _preStateRoot,\\n bytes32 _transactionHash\\n )\\n Lib_AddressResolver(_libAddressManager)\\n {\\n stateTransitionIndex = _stateTransitionIndex;\\n preStateRoot = _preStateRoot;\\n postStateRoot = _preStateRoot;\\n transactionHash = _transactionHash;\\n\\n ovmStateManager = iOVM_StateManagerFactory(resolve(\\\"OVM_StateManagerFactory\\\")).create(address(this));\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n /**\\n * Checks that a function is only run during a specific phase.\\n * @param _phase Phase the function must run within.\\n */\\n modifier onlyDuringPhase(\\n TransitionPhase _phase\\n ) {\\n require(\\n phase == _phase,\\n \\\"Function must be called during the correct phase.\\\"\\n );\\n _;\\n }\\n\\n\\n /**********************************\\n * Public Functions: State Access *\\n **********************************/\\n\\n /**\\n * Retrieves the state root before execution.\\n * @return _preStateRoot State root before execution.\\n */\\n function getPreStateRoot()\\n override\\n public\\n view\\n returns (\\n bytes32 _preStateRoot\\n )\\n {\\n return preStateRoot;\\n }\\n\\n /**\\n * Retrieves the state root after execution.\\n * @return _postStateRoot State root after execution.\\n */\\n function getPostStateRoot()\\n override\\n public\\n view\\n returns (\\n bytes32 _postStateRoot\\n )\\n {\\n return postStateRoot;\\n }\\n\\n /**\\n * Checks whether the transitioner is complete.\\n * @return _complete Whether or not the transition process is finished.\\n */\\n function isComplete()\\n override\\n public\\n view\\n returns (\\n bool _complete\\n )\\n {\\n return phase == TransitionPhase.COMPLETE;\\n }\\n\\n\\n /***********************************\\n * Public Functions: Pre-Execution *\\n ***********************************/\\n\\n /**\\n * Allows a user to prove the initial state of a contract.\\n * @param _ovmContractAddress Address of the contract on the OVM.\\n * @param _ethContractAddress Address of the corresponding contract on L1.\\n * @param _stateTrieWitness Proof of the account state.\\n */\\n function proveContractState(\\n address _ovmContractAddress,\\n address _ethContractAddress,\\n bytes memory _stateTrieWitness\\n )\\n override\\n public\\n onlyDuringPhase(TransitionPhase.PRE_EXECUTION)\\n contributesToFraudProof(preStateRoot, transactionHash)\\n {\\n // Exit quickly to avoid unnecessary work.\\n require(\\n (\\n ovmStateManager.hasAccount(_ovmContractAddress) == false\\n && ovmStateManager.hasEmptyAccount(_ovmContractAddress) == false\\n ),\\n \\\"Account state has already been proven.\\\"\\n );\\n\\n // Function will fail if the proof is not a valid inclusion or exclusion proof.\\n (\\n bool exists,\\n bytes memory encodedAccount\\n ) = Lib_SecureMerkleTrie.get(\\n abi.encodePacked(_ovmContractAddress),\\n _stateTrieWitness,\\n preStateRoot\\n );\\n\\n if (exists == true) {\\n // Account exists, this was an inclusion proof.\\n Lib_OVMCodec.EVMAccount memory account = Lib_OVMCodec.decodeEVMAccount(\\n encodedAccount\\n );\\n\\n address ethContractAddress = _ethContractAddress;\\n if (account.codeHash == EMPTY_ACCOUNT_CODE_HASH) {\\n // Use a known empty contract to prevent an attack in which a user provides a\\n // contract address here and then later deploys code to it.\\n ethContractAddress = 0x0000000000000000000000000000000000000000;\\n } else {\\n // Otherwise, make sure that the code at the provided eth address matches the hash\\n // of the code stored on L2.\\n require(\\n Lib_EthUtils.getCodeHash(ethContractAddress) == account.codeHash,\\n \\\"OVM_StateTransitioner: Provided L1 contract code hash does not match L2 contract code hash.\\\"\\n );\\n }\\n\\n ovmStateManager.putAccount(\\n _ovmContractAddress,\\n Lib_OVMCodec.Account({\\n nonce: account.nonce,\\n balance: account.balance,\\n storageRoot: account.storageRoot,\\n codeHash: account.codeHash,\\n ethAddress: ethContractAddress,\\n isFresh: false\\n })\\n );\\n } else {\\n // Account does not exist, this was an exclusion proof.\\n ovmStateManager.putEmptyAccount(_ovmContractAddress);\\n }\\n }\\n\\n /**\\n * Allows a user to prove the initial state of a contract storage slot.\\n * @param _ovmContractAddress Address of the contract on the OVM.\\n * @param _key Claimed account slot key.\\n * @param _storageTrieWitness Proof of the storage slot.\\n */\\n function proveStorageSlot(\\n address _ovmContractAddress,\\n bytes32 _key,\\n bytes memory _storageTrieWitness\\n )\\n override\\n public\\n onlyDuringPhase(TransitionPhase.PRE_EXECUTION)\\n contributesToFraudProof(preStateRoot, transactionHash)\\n {\\n // Exit quickly to avoid unnecessary work.\\n require(\\n ovmStateManager.hasContractStorage(_ovmContractAddress, _key) == false,\\n \\\"Storage slot has already been proven.\\\"\\n );\\n\\n require(\\n ovmStateManager.hasAccount(_ovmContractAddress) == true,\\n \\\"Contract must be verified before proving a storage slot.\\\"\\n );\\n\\n bytes32 storageRoot = ovmStateManager.getAccountStorageRoot(_ovmContractAddress);\\n bytes32 value;\\n\\n if (storageRoot == EMPTY_ACCOUNT_STORAGE_ROOT) {\\n // Storage trie was empty, so the user is always allowed to insert zero-byte values.\\n value = bytes32(0);\\n } else {\\n // Function will fail if the proof is not a valid inclusion or exclusion proof.\\n (\\n bool exists,\\n bytes memory encodedValue\\n ) = Lib_SecureMerkleTrie.get(\\n abi.encodePacked(_key),\\n _storageTrieWitness,\\n storageRoot\\n );\\n\\n if (exists == true) {\\n // Inclusion proof.\\n // Stored values are RLP encoded, with leading zeros removed.\\n value = Lib_BytesUtils.toBytes32PadLeft(\\n Lib_RLPReader.readBytes(encodedValue)\\n );\\n } else {\\n // Exclusion proof, can only be zero bytes.\\n value = bytes32(0);\\n }\\n }\\n\\n ovmStateManager.putContractStorage(\\n _ovmContractAddress,\\n _key,\\n value\\n );\\n }\\n\\n\\n /*******************************\\n * Public Functions: Execution *\\n *******************************/\\n\\n /**\\n * Executes the state transition.\\n * @param _transaction OVM transaction to execute.\\n */\\n function applyTransaction(\\n Lib_OVMCodec.Transaction memory _transaction\\n )\\n override\\n public\\n onlyDuringPhase(TransitionPhase.PRE_EXECUTION)\\n contributesToFraudProof(preStateRoot, transactionHash)\\n {\\n require(\\n Lib_OVMCodec.hashTransaction(_transaction) == transactionHash,\\n \\\"Invalid transaction provided.\\\"\\n );\\n\\n // We require gas to complete the logic here in run() before/after execution,\\n // But must ensure the full _tx.gasLimit can be given to the ovmCALL (determinism)\\n // This includes 1/64 of the gas getting lost because of EIP-150 (lost twice--first\\n // going into EM, then going into the code contract).\\n require(\\n gasleft() >= 100000 + _transaction.gasLimit * 1032 / 1000, // 1032/1000 = 1.032 = (64/63)^2 rounded up\\n \\\"Not enough gas to execute transaction deterministically.\\\"\\n );\\n\\n iOVM_ExecutionManager ovmExecutionManager = iOVM_ExecutionManager(resolve(\\\"OVM_ExecutionManager\\\"));\\n\\n // We call `setExecutionManager` right before `run` (and not earlier) just in case the\\n // OVM_ExecutionManager address was updated between the time when this contract was created\\n // and when `applyTransaction` was called.\\n ovmStateManager.setExecutionManager(address(ovmExecutionManager));\\n\\n // `run` always succeeds *unless* the user hasn't provided enough gas to `applyTransaction`\\n // or an INVALID_STATE_ACCESS flag was triggered. Either way, we won't get beyond this line\\n // if that's the case.\\n ovmExecutionManager.run(_transaction, address(ovmStateManager));\\n\\n // Prevent the Execution Manager from calling this SM again.\\n ovmStateManager.setExecutionManager(address(0));\\n phase = TransitionPhase.POST_EXECUTION;\\n }\\n\\n\\n /************************************\\n * Public Functions: Post-Execution *\\n ************************************/\\n\\n /**\\n * Allows a user to commit the final state of a contract.\\n * @param _ovmContractAddress Address of the contract on the OVM.\\n * @param _stateTrieWitness Proof of the account state.\\n */\\n function commitContractState(\\n address _ovmContractAddress,\\n bytes memory _stateTrieWitness\\n )\\n override\\n public\\n onlyDuringPhase(TransitionPhase.POST_EXECUTION)\\n contributesToFraudProof(preStateRoot, transactionHash)\\n {\\n require(\\n ovmStateManager.getTotalUncommittedContractStorage() == 0,\\n \\\"All storage must be committed before committing account states.\\\"\\n );\\n\\n require (\\n ovmStateManager.commitAccount(_ovmContractAddress) == true,\\n \\\"Account state wasn't changed or has already been committed.\\\"\\n );\\n\\n Lib_OVMCodec.Account memory account = ovmStateManager.getAccount(_ovmContractAddress);\\n\\n postStateRoot = Lib_SecureMerkleTrie.update(\\n abi.encodePacked(_ovmContractAddress),\\n Lib_OVMCodec.encodeEVMAccount(\\n Lib_OVMCodec.toEVMAccount(account)\\n ),\\n _stateTrieWitness,\\n postStateRoot\\n );\\n\\n // Emit an event to help clients figure out the proof ordering.\\n emit AccountCommitted(\\n _ovmContractAddress\\n );\\n }\\n\\n /**\\n * Allows a user to commit the final state of a contract storage slot.\\n * @param _ovmContractAddress Address of the contract on the OVM.\\n * @param _key Claimed account slot key.\\n * @param _storageTrieWitness Proof of the storage slot.\\n */\\n function commitStorageSlot(\\n address _ovmContractAddress,\\n bytes32 _key,\\n bytes memory _storageTrieWitness\\n )\\n override\\n public\\n onlyDuringPhase(TransitionPhase.POST_EXECUTION)\\n contributesToFraudProof(preStateRoot, transactionHash)\\n {\\n require(\\n ovmStateManager.commitContractStorage(_ovmContractAddress, _key) == true,\\n \\\"Storage slot value wasn't changed or has already been committed.\\\"\\n );\\n\\n Lib_OVMCodec.Account memory account = ovmStateManager.getAccount(_ovmContractAddress);\\n bytes32 value = ovmStateManager.getContractStorage(_ovmContractAddress, _key);\\n\\n account.storageRoot = Lib_SecureMerkleTrie.update(\\n abi.encodePacked(_key),\\n Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(value)\\n ),\\n _storageTrieWitness,\\n account.storageRoot\\n );\\n\\n ovmStateManager.putAccount(_ovmContractAddress, account);\\n\\n // Emit an event to help clients figure out the proof ordering.\\n emit ContractStorageCommitted(\\n _ovmContractAddress,\\n _key\\n );\\n }\\n\\n\\n /**********************************\\n * Public Functions: Finalization *\\n **********************************/\\n\\n /**\\n * Finalizes the transition process.\\n */\\n function completeTransition()\\n override\\n public\\n onlyDuringPhase(TransitionPhase.POST_EXECUTION)\\n {\\n require(\\n ovmStateManager.getTotalUncommittedAccounts() == 0,\\n \\\"All accounts must be committed before completing a transition.\\\"\\n );\\n\\n require(\\n ovmStateManager.getTotalUncommittedContractStorage() == 0,\\n \\\"All storage must be committed before completing a transition.\\\"\\n );\\n\\n phase = TransitionPhase.COMPLETE;\\n }\\n}\\n\",\"keccak256\":\"0xc363807221625338a396c52a4bc3b7439e63972ac87521670c47745641e91fa6\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/verification/OVM_StateTransitionerFactory.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// @unsupported: ovm\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_StateTransitioner } from \\\"../../iOVM/verification/iOVM_StateTransitioner.sol\\\";\\nimport { iOVM_StateTransitionerFactory } from \\\"../../iOVM/verification/iOVM_StateTransitionerFactory.sol\\\";\\nimport { iOVM_FraudVerifier } from \\\"../../iOVM/verification/iOVM_FraudVerifier.sol\\\";\\n\\n/* Contract Imports */\\nimport { OVM_StateTransitioner } from \\\"./OVM_StateTransitioner.sol\\\";\\n\\n/**\\n * @title OVM_StateTransitionerFactory\\n * @dev The State Transitioner Factory is used by the Fraud Verifier to create a new State \\n * Transitioner during the initialization of a fraud proof.\\n * \\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract OVM_StateTransitionerFactory is iOVM_StateTransitionerFactory, Lib_AddressResolver {\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n constructor(\\n address _libAddressManager\\n )\\n Lib_AddressResolver(_libAddressManager)\\n {}\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Creates a new OVM_StateTransitioner\\n * @param _libAddressManager Address of the Address Manager.\\n * @param _stateTransitionIndex Index of the state transition being verified.\\n * @param _preStateRoot State root before the transition was executed.\\n * @param _transactionHash Hash of the executed transaction.\\n * @return New OVM_StateTransitioner instance.\\n */\\n function create(\\n address _libAddressManager,\\n uint256 _stateTransitionIndex,\\n bytes32 _preStateRoot,\\n bytes32 _transactionHash\\n )\\n override\\n public\\n returns (\\n iOVM_StateTransitioner\\n )\\n {\\n require(\\n msg.sender == resolve(\\\"OVM_FraudVerifier\\\"),\\n \\\"Create can only be done by the OVM_FraudVerifier.\\\"\\n );\\n\\n return new OVM_StateTransitioner(\\n _libAddressManager,\\n _stateTransitionIndex,\\n _preStateRoot,\\n _transactionHash\\n );\\n }\\n}\\n\",\"keccak256\":\"0xf9e4c100a38655d5198f13ae918b460244394f1cda29cddbd46b11b25aaafba5\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/execution/iOVM_ExecutionManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\ninterface iOVM_ExecutionManager {\\n /**********\\n * Enums *\\n *********/\\n\\n enum RevertFlag {\\n OUT_OF_GAS,\\n INTENTIONAL_REVERT,\\n EXCEEDS_NUISANCE_GAS,\\n INVALID_STATE_ACCESS,\\n UNSAFE_BYTECODE,\\n CREATE_COLLISION,\\n STATIC_VIOLATION,\\n CREATOR_NOT_ALLOWED\\n }\\n\\n enum GasMetadataKey {\\n CURRENT_EPOCH_START_TIMESTAMP,\\n CUMULATIVE_SEQUENCER_QUEUE_GAS,\\n CUMULATIVE_L1TOL2_QUEUE_GAS,\\n PREV_EPOCH_SEQUENCER_QUEUE_GAS,\\n PREV_EPOCH_L1TOL2_QUEUE_GAS\\n }\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct GasMeterConfig {\\n uint256 minTransactionGasLimit;\\n uint256 maxTransactionGasLimit;\\n uint256 maxGasPerQueuePerEpoch;\\n uint256 secondsPerEpoch;\\n }\\n\\n struct GlobalContext {\\n uint256 ovmCHAINID;\\n }\\n\\n struct TransactionContext {\\n Lib_OVMCodec.QueueOrigin ovmL1QUEUEORIGIN;\\n uint256 ovmTIMESTAMP;\\n uint256 ovmNUMBER;\\n uint256 ovmGASLIMIT;\\n uint256 ovmTXGASLIMIT;\\n address ovmL1TXORIGIN;\\n }\\n\\n struct TransactionRecord {\\n uint256 ovmGasRefund;\\n }\\n\\n struct MessageContext {\\n address ovmCALLER;\\n address ovmADDRESS;\\n bool isStatic;\\n }\\n\\n struct MessageRecord {\\n uint256 nuisanceGasLeft;\\n }\\n\\n\\n /************************************\\n * Transaction Execution Entrypoint *\\n ************************************/\\n\\n function run(\\n Lib_OVMCodec.Transaction calldata _transaction,\\n address _txStateManager\\n ) external;\\n\\n\\n /*******************\\n * Context Opcodes *\\n *******************/\\n\\n function ovmCALLER() external view returns (address _caller);\\n function ovmADDRESS() external view returns (address _address);\\n function ovmTIMESTAMP() external view returns (uint256 _timestamp);\\n function ovmNUMBER() external view returns (uint256 _number);\\n function ovmGASLIMIT() external view returns (uint256 _gasLimit);\\n function ovmCHAINID() external view returns (uint256 _chainId);\\n\\n\\n /**********************\\n * L2 Context Opcodes *\\n **********************/\\n\\n function ovmL1QUEUEORIGIN() external view returns (Lib_OVMCodec.QueueOrigin _queueOrigin);\\n function ovmL1TXORIGIN() external view returns (address _l1TxOrigin);\\n\\n\\n /*******************\\n * Halting Opcodes *\\n *******************/\\n\\n function ovmREVERT(bytes memory _data) external;\\n\\n\\n /*****************************\\n * Contract Creation Opcodes *\\n *****************************/\\n\\n function ovmCREATE(bytes memory _bytecode) external returns (address _contract, bytes memory _revertdata);\\n function ovmCREATE2(bytes memory _bytecode, bytes32 _salt) external returns (address _contract, bytes memory _revertdata);\\n\\n\\n /*******************************\\n * Account Abstraction Opcodes *\\n ******************************/\\n\\n function ovmGETNONCE() external returns (uint256 _nonce);\\n function ovmINCREMENTNONCE() external;\\n function ovmCREATEEOA(bytes32 _messageHash, uint8 _v, bytes32 _r, bytes32 _s) external;\\n\\n\\n /****************************\\n * Contract Calling Opcodes *\\n ****************************/\\n\\n function ovmCALL(uint256 _gasLimit, address _address, bytes memory _calldata) external returns (bool _success, bytes memory _returndata);\\n function ovmSTATICCALL(uint256 _gasLimit, address _address, bytes memory _calldata) external returns (bool _success, bytes memory _returndata);\\n function ovmDELEGATECALL(uint256 _gasLimit, address _address, bytes memory _calldata) external returns (bool _success, bytes memory _returndata);\\n\\n\\n /****************************\\n * Contract Storage Opcodes *\\n ****************************/\\n\\n function ovmSLOAD(bytes32 _key) external returns (bytes32 _value);\\n function ovmSSTORE(bytes32 _key, bytes32 _value) external;\\n\\n\\n /*************************\\n * Contract Code Opcodes *\\n *************************/\\n\\n function ovmEXTCODECOPY(address _contract, uint256 _offset, uint256 _length) external returns (bytes memory _code);\\n function ovmEXTCODESIZE(address _contract) external returns (uint256 _size);\\n function ovmEXTCODEHASH(address _contract) external returns (bytes32 _hash);\\n\\n\\n /***************************************\\n * Public Functions: Execution Context *\\n ***************************************/\\n\\n function getMaxTransactionGasLimit() external view returns (uint _maxTransactionGasLimit);\\n}\\n\",\"keccak256\":\"0xa613e2f578d56aa80f0916df538b487f8213a18933e78fdecb9efeedae02cf9c\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/execution/iOVM_StateManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title iOVM_StateManager\\n */\\ninterface iOVM_StateManager {\\n\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n enum ItemState {\\n ITEM_UNTOUCHED,\\n ITEM_LOADED,\\n ITEM_CHANGED,\\n ITEM_COMMITTED\\n }\\n\\n /***************************\\n * Public Functions: Misc *\\n ***************************/\\n\\n function isAuthenticated(address _address) external view returns (bool);\\n\\n /***************************\\n * Public Functions: Setup *\\n ***************************/\\n\\n function owner() external view returns (address _owner);\\n function ovmExecutionManager() external view returns (address _ovmExecutionManager);\\n function setExecutionManager(address _ovmExecutionManager) external;\\n\\n\\n /************************************\\n * Public Functions: Account Access *\\n ************************************/\\n\\n function putAccount(address _address, Lib_OVMCodec.Account memory _account) external;\\n function putEmptyAccount(address _address) external;\\n function getAccount(address _address) external view returns (Lib_OVMCodec.Account memory _account);\\n function hasAccount(address _address) external view returns (bool _exists);\\n function hasEmptyAccount(address _address) external view returns (bool _exists);\\n function setAccountNonce(address _address, uint256 _nonce) external;\\n function getAccountNonce(address _address) external view returns (uint256 _nonce);\\n function getAccountEthAddress(address _address) external view returns (address _ethAddress);\\n function getAccountStorageRoot(address _address) external view returns (bytes32 _storageRoot);\\n function initPendingAccount(address _address) external;\\n function commitPendingAccount(address _address, address _ethAddress, bytes32 _codeHash) external;\\n function testAndSetAccountLoaded(address _address) external returns (bool _wasAccountAlreadyLoaded);\\n function testAndSetAccountChanged(address _address) external returns (bool _wasAccountAlreadyChanged);\\n function commitAccount(address _address) external returns (bool _wasAccountCommitted);\\n function incrementTotalUncommittedAccounts() external;\\n function getTotalUncommittedAccounts() external view returns (uint256 _total);\\n function wasAccountChanged(address _address) external view returns (bool);\\n function wasAccountCommitted(address _address) external view returns (bool);\\n\\n\\n /************************************\\n * Public Functions: Storage Access *\\n ************************************/\\n\\n function putContractStorage(address _contract, bytes32 _key, bytes32 _value) external;\\n function getContractStorage(address _contract, bytes32 _key) external view returns (bytes32 _value);\\n function hasContractStorage(address _contract, bytes32 _key) external view returns (bool _exists);\\n function testAndSetContractStorageLoaded(address _contract, bytes32 _key) external returns (bool _wasContractStorageAlreadyLoaded);\\n function testAndSetContractStorageChanged(address _contract, bytes32 _key) external returns (bool _wasContractStorageAlreadyChanged);\\n function commitContractStorage(address _contract, bytes32 _key) external returns (bool _wasContractStorageCommitted);\\n function incrementTotalUncommittedContractStorage() external;\\n function getTotalUncommittedContractStorage() external view returns (uint256 _total);\\n function wasContractStorageChanged(address _contract, bytes32 _key) external view returns (bool);\\n function wasContractStorageCommitted(address _contract, bytes32 _key) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x7a11dbd1f61593ba34debe07e39eef59967307f7f372ba9855bee0953585d08d\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/execution/iOVM_StateManagerFactory.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Contract Imports */\\nimport { iOVM_StateManager } from \\\"./iOVM_StateManager.sol\\\";\\n\\n/**\\n * @title iOVM_StateManagerFactory\\n */\\ninterface iOVM_StateManagerFactory {\\n\\n /***************************************\\n * Public Functions: Contract Creation *\\n ***************************************/\\n\\n function create(\\n address _owner\\n )\\n external\\n returns (\\n iOVM_StateManager _ovmStateManager\\n );\\n}\\n\",\"keccak256\":\"0x27a90fc43889d0c7d1db50f37907ef7386d9b415d15a1e91a0a068cba59afd36\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/verification/iOVM_BondManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\ninterface ERC20 {\\n function transfer(address, uint256) external returns (bool);\\n function transferFrom(address, address, uint256) external returns (bool);\\n}\\n\\n/// All the errors which may be encountered on the bond manager\\nlibrary Errors {\\n string constant ERC20_ERR = \\\"BondManager: Could not post bond\\\";\\n string constant ALREADY_FINALIZED = \\\"BondManager: Fraud proof for this pre-state root has already been finalized\\\";\\n string constant SLASHED = \\\"BondManager: Cannot finalize withdrawal, you probably got slashed\\\";\\n string constant WRONG_STATE = \\\"BondManager: Wrong bond state for proposer\\\";\\n string constant CANNOT_CLAIM = \\\"BondManager: Cannot claim yet. Dispute must be finalized first\\\";\\n\\n string constant WITHDRAWAL_PENDING = \\\"BondManager: Withdrawal already pending\\\";\\n string constant TOO_EARLY = \\\"BondManager: Too early to finalize your withdrawal\\\";\\n\\n string constant ONLY_TRANSITIONER = \\\"BondManager: Only the transitioner for this pre-state root may call this function\\\";\\n string constant ONLY_FRAUD_VERIFIER = \\\"BondManager: Only the fraud verifier may call this function\\\";\\n string constant ONLY_STATE_COMMITMENT_CHAIN = \\\"BondManager: Only the state commitment chain may call this function\\\";\\n string constant WAIT_FOR_DISPUTES = \\\"BondManager: Wait for other potential disputes\\\";\\n}\\n\\n/**\\n * @title iOVM_BondManager\\n */\\ninterface iOVM_BondManager {\\n\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n /// The lifecycle of a proposer's bond\\n enum State {\\n // Before depositing or after getting slashed, a user is uncollateralized\\n NOT_COLLATERALIZED,\\n // After depositing, a user is collateralized\\n COLLATERALIZED,\\n // After a user has initiated a withdrawal\\n WITHDRAWING\\n }\\n\\n /// A bond posted by a proposer\\n struct Bond {\\n // The user's state\\n State state;\\n // The timestamp at which a proposer issued their withdrawal request\\n uint32 withdrawalTimestamp;\\n // The time when the first disputed was initiated for this bond\\n uint256 firstDisputeAt;\\n // The earliest observed state root for this bond which has had fraud\\n bytes32 earliestDisputedStateRoot;\\n // The state root's timestamp\\n uint256 earliestTimestamp;\\n }\\n\\n // Per pre-state root, store the number of state provisions that were made\\n // and how many of these calls were made by each user. Payouts will then be\\n // claimed by users proportionally for that dispute.\\n struct Rewards {\\n // Flag to check if rewards for a fraud proof are claimable\\n bool canClaim;\\n // Total number of `recordGasSpent` calls made\\n uint256 total;\\n // The gas spent by each user to provide witness data. The sum of all\\n // values inside this map MUST be equal to the value of `total`\\n mapping(address => uint256) gasSpent;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function recordGasSpent(\\n bytes32 _preStateRoot,\\n bytes32 _txHash,\\n address _who,\\n uint256 _gasSpent\\n ) external;\\n\\n function finalize(\\n bytes32 _preStateRoot,\\n address _publisher,\\n uint256 _timestamp\\n ) external;\\n\\n function deposit() external;\\n\\n function startWithdrawal() external;\\n\\n function finalizeWithdrawal() external;\\n\\n function claim(\\n address _who\\n ) external;\\n\\n function isCollateralized(\\n address _who\\n ) external view returns (bool);\\n\\n function getGasSpent(\\n bytes32 _preStateRoot,\\n address _who\\n ) external view returns (uint256);\\n}\\n\",\"keccak256\":\"0x3c2a8a399487857158649db1896749d86e39cba545a8aeb2e2bb0f3bdfa7a5b1\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/verification/iOVM_FraudVerifier.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_StateTransitioner } from \\\"./iOVM_StateTransitioner.sol\\\";\\n\\n/**\\n * @title iOVM_FraudVerifier\\n */\\ninterface iOVM_FraudVerifier {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event FraudProofInitialized(\\n bytes32 _preStateRoot,\\n uint256 _preStateRootIndex,\\n bytes32 _transactionHash,\\n address _who\\n );\\n\\n event FraudProofFinalized(\\n bytes32 _preStateRoot,\\n uint256 _preStateRootIndex,\\n bytes32 _transactionHash,\\n address _who\\n );\\n\\n\\n /***************************************\\n * Public Functions: Transition Status *\\n ***************************************/\\n\\n function getStateTransitioner(bytes32 _preStateRoot, bytes32 _txHash) external view returns (iOVM_StateTransitioner _transitioner);\\n\\n\\n /****************************************\\n * Public Functions: Fraud Verification *\\n ****************************************/\\n\\n function initializeFraudVerification(\\n bytes32 _preStateRoot,\\n Lib_OVMCodec.ChainBatchHeader calldata _preStateRootBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof calldata _preStateRootProof,\\n Lib_OVMCodec.Transaction calldata _transaction,\\n Lib_OVMCodec.TransactionChainElement calldata _txChainElement,\\n Lib_OVMCodec.ChainBatchHeader calldata _transactionBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof calldata _transactionProof\\n ) external;\\n\\n function finalizeFraudVerification(\\n bytes32 _preStateRoot,\\n Lib_OVMCodec.ChainBatchHeader calldata _preStateRootBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof calldata _preStateRootProof,\\n bytes32 _txHash,\\n bytes32 _postStateRoot,\\n Lib_OVMCodec.ChainBatchHeader calldata _postStateRootBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof calldata _postStateRootProof\\n ) external;\\n}\\n\",\"keccak256\":\"0x5efd7bb18164bbd3e9d58379e8203fbf2a7ee802b1a48dff3ceaaec1523b1751\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/verification/iOVM_StateTransitioner.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title iOVM_StateTransitioner\\n */\\ninterface iOVM_StateTransitioner {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AccountCommitted(\\n address _address\\n );\\n\\n event ContractStorageCommitted(\\n address _address,\\n bytes32 _key\\n );\\n\\n\\n /**********************************\\n * Public Functions: State Access *\\n **********************************/\\n\\n function getPreStateRoot() external view returns (bytes32 _preStateRoot);\\n function getPostStateRoot() external view returns (bytes32 _postStateRoot);\\n function isComplete() external view returns (bool _complete);\\n\\n\\n /***********************************\\n * Public Functions: Pre-Execution *\\n ***********************************/\\n\\n function proveContractState(\\n address _ovmContractAddress,\\n address _ethContractAddress,\\n bytes calldata _stateTrieWitness\\n ) external;\\n\\n function proveStorageSlot(\\n address _ovmContractAddress,\\n bytes32 _key,\\n bytes calldata _storageTrieWitness\\n ) external;\\n\\n\\n /*******************************\\n * Public Functions: Execution *\\n *******************************/\\n\\n function applyTransaction(\\n Lib_OVMCodec.Transaction calldata _transaction\\n ) external;\\n\\n\\n /************************************\\n * Public Functions: Post-Execution *\\n ************************************/\\n\\n function commitContractState(\\n address _ovmContractAddress,\\n bytes calldata _stateTrieWitness\\n ) external;\\n\\n function commitStorageSlot(\\n address _ovmContractAddress,\\n bytes32 _key,\\n bytes calldata _storageTrieWitness\\n ) external;\\n\\n\\n /**********************************\\n * Public Functions: Finalization *\\n **********************************/\\n\\n function completeTransition() external;\\n}\\n\",\"keccak256\":\"0x3d044ac0a3bb6ad3d529f904b3191117511f9c379678ca03010e1ebdfcb5c34b\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/verification/iOVM_StateTransitionerFactory.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Contract Imports */\\nimport { iOVM_StateTransitioner } from \\\"./iOVM_StateTransitioner.sol\\\";\\n\\n/**\\n * @title iOVM_StateTransitionerFactory\\n */\\ninterface iOVM_StateTransitionerFactory {\\n\\n /***************************************\\n * Public Functions: Contract Creation *\\n ***************************************/\\n\\n function create(\\n address _proxyManager,\\n uint256 _stateTransitionIndex,\\n bytes32 _preStateRoot,\\n bytes32 _transactionHash\\n )\\n external\\n returns (\\n iOVM_StateTransitioner _ovmStateTransitioner\\n );\\n}\\n\",\"keccak256\":\"0x60a0f0c104e4c0c7863268a93005762e8146d393f9cfddfdd6a2d6585c5911fc\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/codec/Lib_OVMCodec.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../utils/Lib_Bytes32Utils.sol\\\";\\nimport { Lib_SafeExecutionManagerWrapper } from \\\"../../libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\\\";\\n\\n/**\\n * @title Lib_OVMCodec\\n */\\nlibrary Lib_OVMCodec {\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum EOASignatureType {\\n EIP155_TRANSACTION,\\n ETH_SIGNED_MESSAGE\\n }\\n\\n enum QueueOrigin {\\n SEQUENCER_QUEUE,\\n L1TOL2_QUEUE\\n }\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Account {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n address ethAddress;\\n bool isFresh;\\n }\\n\\n struct EVMAccount {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n }\\n\\n struct ChainBatchHeader {\\n uint256 batchIndex;\\n bytes32 batchRoot;\\n uint256 batchSize;\\n uint256 prevTotalElements;\\n bytes extraData;\\n }\\n\\n struct ChainInclusionProof {\\n uint256 index;\\n bytes32[] siblings;\\n }\\n\\n struct Transaction {\\n uint256 timestamp;\\n uint256 blockNumber;\\n QueueOrigin l1QueueOrigin;\\n address l1TxOrigin;\\n address entrypoint;\\n uint256 gasLimit;\\n bytes data;\\n }\\n\\n struct TransactionChainElement {\\n bool isSequenced;\\n uint256 queueIndex; // QUEUED TX ONLY\\n uint256 timestamp; // SEQUENCER TX ONLY\\n uint256 blockNumber; // SEQUENCER TX ONLY\\n bytes txData; // SEQUENCER TX ONLY\\n }\\n\\n struct QueueElement {\\n bytes32 transactionHash;\\n uint40 timestamp;\\n uint40 blockNumber;\\n }\\n\\n struct EIP155Transaction {\\n uint256 nonce;\\n uint256 gasPrice;\\n uint256 gasLimit;\\n address to;\\n uint256 value;\\n bytes data;\\n uint256 chainId;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Decodes an EOA transaction (i.e., native Ethereum RLP encoding).\\n * @param _transaction Encoded EOA transaction.\\n * @return Transaction decoded into a struct.\\n */\\n function decodeEIP155Transaction(\\n bytes memory _transaction,\\n bool _isEthSignedMessage\\n )\\n internal\\n pure\\n returns (\\n EIP155Transaction memory\\n )\\n {\\n if (_isEthSignedMessage) {\\n (\\n uint256 _nonce,\\n uint256 _gasLimit,\\n uint256 _gasPrice,\\n uint256 _chainId,\\n address _to,\\n bytes memory _data\\n ) = abi.decode(\\n _transaction,\\n (uint256, uint256, uint256, uint256, address ,bytes)\\n );\\n return EIP155Transaction({\\n nonce: _nonce,\\n gasPrice: _gasPrice,\\n gasLimit: _gasLimit,\\n to: _to,\\n value: 0,\\n data: _data,\\n chainId: _chainId\\n });\\n } else {\\n Lib_RLPReader.RLPItem[] memory decoded = Lib_RLPReader.readList(_transaction);\\n\\n return EIP155Transaction({\\n nonce: Lib_RLPReader.readUint256(decoded[0]),\\n gasPrice: Lib_RLPReader.readUint256(decoded[1]),\\n gasLimit: Lib_RLPReader.readUint256(decoded[2]),\\n to: Lib_RLPReader.readAddress(decoded[3]),\\n value: Lib_RLPReader.readUint256(decoded[4]),\\n data: Lib_RLPReader.readBytes(decoded[5]),\\n chainId: Lib_RLPReader.readUint256(decoded[6])\\n });\\n }\\n }\\n\\n /**\\n * Decompresses a compressed EIP155 transaction.\\n * @param _transaction Compressed EIP155 transaction bytes.\\n * @return Transaction parsed into a struct.\\n */\\n function decompressEIP155Transaction(\\n bytes memory _transaction\\n )\\n internal\\n returns (\\n EIP155Transaction memory\\n )\\n {\\n return EIP155Transaction({\\n gasLimit: Lib_BytesUtils.toUint24(_transaction, 0),\\n gasPrice: uint256(Lib_BytesUtils.toUint24(_transaction, 3)) * 1000000,\\n nonce: Lib_BytesUtils.toUint24(_transaction, 6),\\n to: Lib_BytesUtils.toAddress(_transaction, 9),\\n data: Lib_BytesUtils.slice(_transaction, 29),\\n chainId: Lib_SafeExecutionManagerWrapper.safeCHAINID(),\\n value: 0\\n });\\n }\\n\\n /**\\n * Encodes an EOA transaction back into the original transaction.\\n * @param _transaction EIP155transaction to encode.\\n * @param _isEthSignedMessage Whether or not this was an eth signed message.\\n * @return Encoded transaction.\\n */\\n function encodeEIP155Transaction(\\n EIP155Transaction memory _transaction,\\n bool _isEthSignedMessage\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n if (_isEthSignedMessage) {\\n return abi.encode(\\n _transaction.nonce,\\n _transaction.gasLimit,\\n _transaction.gasPrice,\\n _transaction.chainId,\\n _transaction.to,\\n _transaction.data\\n );\\n } else {\\n bytes[] memory raw = new bytes[](9);\\n\\n raw[0] = Lib_RLPWriter.writeUint(_transaction.nonce);\\n raw[1] = Lib_RLPWriter.writeUint(_transaction.gasPrice);\\n raw[2] = Lib_RLPWriter.writeUint(_transaction.gasLimit);\\n if (_transaction.to == address(0)) {\\n raw[3] = Lib_RLPWriter.writeBytes('');\\n } else {\\n raw[3] = Lib_RLPWriter.writeAddress(_transaction.to);\\n }\\n raw[4] = Lib_RLPWriter.writeUint(0);\\n raw[5] = Lib_RLPWriter.writeBytes(_transaction.data);\\n raw[6] = Lib_RLPWriter.writeUint(_transaction.chainId);\\n raw[7] = Lib_RLPWriter.writeBytes(bytes(''));\\n raw[8] = Lib_RLPWriter.writeBytes(bytes(''));\\n\\n return Lib_RLPWriter.writeList(raw);\\n }\\n }\\n\\n /**\\n * Encodes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Encoded transaction bytes.\\n */\\n function encodeTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return abi.encodePacked(\\n _transaction.timestamp,\\n _transaction.blockNumber,\\n _transaction.l1QueueOrigin,\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n );\\n }\\n\\n /**\\n * Hashes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Hashed transaction\\n */\\n function hashTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(encodeTransaction(_transaction));\\n }\\n\\n /**\\n * Converts an OVM account to an EVM account.\\n * @param _in OVM account to convert.\\n * @return Converted EVM account.\\n */\\n function toEVMAccount(\\n Account memory _in\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n return EVMAccount({\\n nonce: _in.nonce,\\n balance: _in.balance,\\n storageRoot: _in.storageRoot,\\n codeHash: _in.codeHash\\n });\\n }\\n\\n /**\\n * @notice RLP-encodes an account state struct.\\n * @param _account Account state struct.\\n * @return RLP-encoded account state.\\n */\\n function encodeEVMAccount(\\n EVMAccount memory _account\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes[] memory raw = new bytes[](4);\\n\\n // Unfortunately we can't create this array outright because\\n // Lib_RLPWriter.writeList will reject fixed-size arrays. Assigning\\n // index-by-index circumvents this issue.\\n raw[0] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.nonce)\\n )\\n );\\n raw[1] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.balance)\\n )\\n );\\n raw[2] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.storageRoot));\\n raw[3] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.codeHash));\\n\\n return Lib_RLPWriter.writeList(raw);\\n }\\n\\n /**\\n * @notice Decodes an RLP-encoded account state into a useful struct.\\n * @param _encoded RLP-encoded account state.\\n * @return Account state struct.\\n */\\n function decodeEVMAccount(\\n bytes memory _encoded\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\\n\\n return EVMAccount({\\n nonce: Lib_RLPReader.readUint256(accountState[0]),\\n balance: Lib_RLPReader.readUint256(accountState[1]),\\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\\n });\\n }\\n\\n /**\\n * Calculates a hash for a given batch header.\\n * @param _batchHeader Header to hash.\\n * @return Hash of the header.\\n */\\n function hashBatchHeader(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(\\n abi.encode(\\n _batchHeader.batchRoot,\\n _batchHeader.batchSize,\\n _batchHeader.prevTotalElements,\\n _batchHeader.extraData\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0xe7e518ba7bba3fa28c532f8902576c1bb4dfc1ec4b62bed6da50623248ba17c3\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Contract Imports */\\nimport { Ownable } from \\\"./Lib_Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n public\\n onlyOwner\\n {\\n addresses[_getNameHash(_name)] = _address;\\n\\n emit AddressSet(\\n _name,\\n _address\\n );\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0x36473d229ce0ba9d1cac5f02f84be843d9dcc8008525590a1652a2c2636f95f2\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(\\n address _libAddressManager\\n ) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x65981feeabff6a81783ea97d44baf988a18a86c8cb374c46fdb71819cbacc7c0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Ownable\\n * @dev Adapted from https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol\\n */\\nabstract contract Ownable {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n address public owner;\\n\\n\\n /**********\\n * Events *\\n **********/\\n\\n event OwnershipTransferred(\\n address indexed previousOwner,\\n address indexed newOwner\\n );\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n constructor() {\\n owner = msg.sender;\\n emit OwnershipTransferred(address(0), owner);\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n owner == msg.sender,\\n \\\"Ownable: caller is not the owner\\\"\\n );\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the owner of this contract to the zero address, effectively renouncing ownership\\n * completely. Can only be called by the current owner of this contract.\\n */\\n function renounceOwnership()\\n public\\n virtual\\n onlyOwner\\n {\\n emit OwnershipTransferred(owner, address(0));\\n owner = address(0);\\n }\\n\\n /**\\n * Transfers ownership of this contract to a new address. Can only be called by the current\\n * owner of this contract.\\n * @param _newOwner Address of the new contract owner.\\n */\\n function transferOwnership(\\n address _newOwner\\n )\\n public\\n virtual\\n onlyOwner\\n {\\n require(\\n _newOwner != address(0),\\n \\\"Ownable: new owner cannot be the zero address\\\"\\n );\\n\\n emit OwnershipTransferred(owner, _newOwner);\\n owner = _newOwner;\\n }\\n}\\n\",\"keccak256\":\"0x83f9a6c4608b5929086429205b00f8211cdfcba83f3c84520f24d8aa64fe4b82\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPReader.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_RLPReader\\n * @dev Adapted from \\\"RLPReader\\\" by Hamdi Allam (hamdi.allam97@gmail.com).\\n */\\nlibrary Lib_RLPReader {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 constant internal MAX_LIST_LENGTH = 32;\\n\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum RLPItemType {\\n DATA_ITEM,\\n LIST_ITEM\\n }\\n\\n \\n /***********\\n * Structs *\\n ***********/\\n\\n struct RLPItem {\\n uint256 length;\\n uint256 ptr;\\n }\\n \\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n \\n /**\\n * Converts bytes to a reference to memory position and length.\\n * @param _in Input bytes to convert.\\n * @return Output memory reference.\\n */\\n function toRLPItem(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem memory\\n )\\n {\\n uint256 ptr;\\n assembly {\\n ptr := add(_in, 32)\\n }\\n\\n return RLPItem({\\n length: _in.length,\\n ptr: ptr\\n });\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n (\\n uint256 listOffset,\\n ,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.LIST_ITEM,\\n \\\"Invalid RLP list value.\\\"\\n );\\n\\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\\n // writing to the length. Since we can't know the number of RLP items without looping over\\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\\n // simply set a reasonable maximum list length and decrease the size before we finish.\\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\\n\\n uint256 itemCount = 0;\\n uint256 offset = listOffset;\\n while (offset < _in.length) {\\n require(\\n itemCount < MAX_LIST_LENGTH,\\n \\\"Provided RLP list exceeds max list length.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n ) = _decodeLength(RLPItem({\\n length: _in.length - offset,\\n ptr: _in.ptr + offset\\n }));\\n\\n out[itemCount] = RLPItem({\\n length: itemLength + itemOffset,\\n ptr: _in.ptr + offset\\n });\\n\\n itemCount += 1;\\n offset += itemOffset + itemLength;\\n }\\n\\n // Decrease the array size to match the actual item count.\\n assembly {\\n mstore(out, itemCount)\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n return readList(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes value.\\\"\\n );\\n\\n return _copy(_in.ptr, itemOffset, itemLength);\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return readBytes(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return string(readBytes(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return readString(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n require(\\n _in.length <= 33,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr + itemOffset;\\n bytes32 out;\\n assembly {\\n out := mload(ptr)\\n\\n // Shift the bytes over to match the item size.\\n if lt(itemLength, 32) {\\n out := div(out, exp(256, sub(32, itemLength)))\\n }\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return readBytes32(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return uint256(readBytes32(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return readUint256(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n require(\\n _in.length == 1,\\n \\\"Invalid RLP boolean value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 out;\\n assembly {\\n out := byte(0, mload(ptr))\\n }\\n\\n require(\\n out == 0 || out == 1,\\n \\\"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\\\"\\n );\\n\\n return out != 0;\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return readBool(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n if (_in.length == 1) {\\n return address(0);\\n }\\n\\n require(\\n _in.length == 21,\\n \\\"Invalid RLP address value.\\\"\\n );\\n\\n return address(readUint256(_in));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return readAddress(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads the raw bytes of an RLP item.\\n * @param _in RLP item to read.\\n * @return Raw RLP bytes.\\n */\\n function readRawBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in);\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Decodes the length of an RLP item.\\n * @param _in RLP item to decode.\\n * @return Offset of the encoded data.\\n * @return Length of the encoded data.\\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\\n */\\n function _decodeLength(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n uint256,\\n uint256,\\n RLPItemType\\n )\\n {\\n require(\\n _in.length > 0,\\n \\\"RLP item cannot be null.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 prefix;\\n assembly {\\n prefix := byte(0, mload(ptr))\\n }\\n\\n if (prefix <= 0x7f) {\\n // Single byte.\\n\\n return (0, 1, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xb7) {\\n // Short string.\\n\\n uint256 strLen = prefix - 0x80;\\n \\n require(\\n _in.length > strLen,\\n \\\"Invalid RLP short string.\\\"\\n );\\n\\n return (1, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xbf) {\\n // Long string.\\n uint256 lenOfStrLen = prefix - 0xb7;\\n\\n require(\\n _in.length > lenOfStrLen,\\n \\\"Invalid RLP long string length.\\\"\\n );\\n\\n uint256 strLen;\\n assembly {\\n // Pick out the string length.\\n strLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfStrLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfStrLen + strLen,\\n \\\"Invalid RLP long string.\\\"\\n );\\n\\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xf7) {\\n // Short list.\\n uint256 listLen = prefix - 0xc0;\\n\\n require(\\n _in.length > listLen,\\n \\\"Invalid RLP short list.\\\"\\n );\\n\\n return (1, listLen, RLPItemType.LIST_ITEM);\\n } else {\\n // Long list.\\n uint256 lenOfListLen = prefix - 0xf7;\\n\\n require(\\n _in.length > lenOfListLen,\\n \\\"Invalid RLP long list length.\\\"\\n );\\n\\n uint256 listLen;\\n assembly {\\n // Pick out the list length.\\n listLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfListLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfListLen + listLen,\\n \\\"Invalid RLP long list.\\\"\\n );\\n\\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\\n }\\n }\\n\\n /**\\n * Copies the bytes from a memory location.\\n * @param _src Pointer to the location to read from.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Copied bytes.\\n */\\n function _copy(\\n uint256 _src,\\n uint256 _offset,\\n uint256 _length\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out = new bytes(_length);\\n if (out.length == 0) {\\n return out;\\n }\\n\\n uint256 src = _src + _offset;\\n uint256 dest;\\n assembly {\\n dest := add(out, 32)\\n }\\n\\n // Copy over as many complete words as we can.\\n for (uint256 i = 0; i < _length / 32; i++) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n\\n src += 32;\\n dest += 32;\\n }\\n\\n // Pick out the remaining bytes.\\n uint256 mask = 256 ** (32 - (_length % 32)) - 1;\\n assembly {\\n mstore(\\n dest,\\n or(\\n and(mload(src), not(mask)),\\n and(mload(dest), mask)\\n )\\n )\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Copies an RLP item into bytes.\\n * @param _in RLP item to copy.\\n * @return Copied bytes.\\n */\\n function _copy(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in.ptr, 0, _in.length);\\n }\\n}\\n\",\"keccak256\":\"0xbdb8fae0ca2483b4cc07607a5070fc25e33c54b4e4462b99e7c0b13aac48a09b\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPWriter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\n\\n/**\\n * @title Lib_RLPWriter\\n * @author Bakaoh (with modifications)\\n */\\nlibrary Lib_RLPWriter {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * RLP encodes a byte string.\\n * @param _in The byte string to encode.\\n * @return _out The RLP encoded string in bytes.\\n */\\n function writeBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n bytes memory encoded;\\n\\n if (_in.length == 1 && uint8(_in[0]) < 128) {\\n encoded = _in;\\n } else {\\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * RLP encodes a list of RLP encoded byte byte strings.\\n * @param _in The list of RLP encoded byte strings.\\n * @return _out The RLP encoded list of items in bytes.\\n */\\n function writeList(\\n bytes[] memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n bytes memory list = _flatten(_in);\\n return abi.encodePacked(_writeLength(list.length, 192), list);\\n }\\n\\n /**\\n * RLP encodes a string.\\n * @param _in The string to encode.\\n * @return _out The RLP encoded string in bytes.\\n */\\n function writeString(\\n string memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(bytes(_in));\\n }\\n\\n /**\\n * RLP encodes an address.\\n * @param _in The address to encode.\\n * @return _out The RLP encoded address in bytes.\\n */\\n function writeAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a uint.\\n * @param _in The uint256 to encode.\\n * @return _out The RLP encoded uint256 in bytes.\\n */\\n function writeUint(\\n uint256 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(_toBinary(_in));\\n }\\n\\n /**\\n * RLP encodes a bool.\\n * @param _in The bool to encode.\\n * @return _out The RLP encoded bool in bytes.\\n */\\n function writeBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n bytes memory encoded = new bytes(1);\\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\\n return encoded;\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\\n * @param _len The length of the string or the payload.\\n * @param _offset 128 if item is string, 192 if item is list.\\n * @return _encoded RLP encoded bytes.\\n */\\n function _writeLength(\\n uint256 _len,\\n uint256 _offset\\n )\\n private\\n pure\\n returns (\\n bytes memory _encoded\\n )\\n {\\n bytes memory encoded;\\n\\n if (_len < 56) {\\n encoded = new bytes(1);\\n encoded[0] = byte(uint8(_len) + uint8(_offset));\\n } else {\\n uint256 lenLen;\\n uint256 i = 1;\\n while (_len / i != 0) {\\n lenLen++;\\n i *= 256;\\n }\\n\\n encoded = new bytes(lenLen + 1);\\n encoded[0] = byte(uint8(lenLen) + uint8(_offset) + 55);\\n for(i = 1; i <= lenLen; i++) {\\n encoded[i] = byte(uint8((_len / (256**(lenLen-i))) % 256));\\n }\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * Encode integer in big endian binary form with no leading zeroes.\\n * @notice TODO: This should be optimized with assembly to save gas costs.\\n * @param _x The integer to encode.\\n * @return _binary RLP encoded bytes.\\n */\\n function _toBinary(\\n uint256 _x\\n )\\n private\\n pure\\n returns (\\n bytes memory _binary\\n )\\n {\\n bytes memory b = abi.encodePacked(_x);\\n\\n uint256 i = 0;\\n for (; i < 32; i++) {\\n if (b[i] != 0) {\\n break;\\n }\\n }\\n\\n bytes memory res = new bytes(32 - i);\\n for (uint256 j = 0; j < res.length; j++) {\\n res[j] = b[i++];\\n }\\n\\n return res;\\n }\\n\\n /**\\n * Copies a piece of memory to another location.\\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\\n * @param _dest Destination location.\\n * @param _src Source location.\\n * @param _len Length of memory to copy.\\n */\\n function _memcpy(\\n uint256 _dest,\\n uint256 _src,\\n uint256 _len\\n )\\n private\\n pure\\n {\\n uint256 dest = _dest;\\n uint256 src = _src;\\n uint256 len = _len;\\n\\n for(; len >= 32; len -= 32) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n dest += 32;\\n src += 32;\\n }\\n\\n uint256 mask = 256 ** (32 - len) - 1;\\n assembly {\\n let srcpart := and(mload(src), not(mask))\\n let destpart := and(mload(dest), mask)\\n mstore(dest, or(destpart, srcpart))\\n }\\n }\\n\\n /**\\n * Flattens a list of byte strings into one byte string.\\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\\n * @param _list List of byte strings to flatten.\\n * @return _flattened The flattened byte string.\\n */\\n function _flatten(\\n bytes[] memory _list\\n )\\n private\\n pure\\n returns (\\n bytes memory _flattened\\n )\\n {\\n if (_list.length == 0) {\\n return new bytes(0);\\n }\\n\\n uint256 len;\\n uint256 i = 0;\\n for (; i < _list.length; i++) {\\n len += _list[i].length;\\n }\\n\\n bytes memory flattened = new bytes(len);\\n uint256 flattenedPtr;\\n assembly { flattenedPtr := add(flattened, 0x20) }\\n\\n for(i = 0; i < _list.length; i++) {\\n bytes memory item = _list[i];\\n\\n uint256 listPtr;\\n assembly { listPtr := add(item, 0x20)}\\n\\n _memcpy(flattenedPtr, listPtr, item.length);\\n flattenedPtr += _list[i].length;\\n }\\n\\n return flattened;\\n }\\n}\",\"keccak256\":\"0xbcb24619c1758cb0d9f3fe5c79495950045a9087046a02b9ce01df46ae09ae5b\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/trie/Lib_MerkleTrie.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\n\\n/**\\n * @title Lib_MerkleTrie\\n */\\nlibrary Lib_MerkleTrie {\\n\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n enum NodeType {\\n BranchNode,\\n ExtensionNode,\\n LeafNode\\n }\\n\\n struct TrieNode {\\n bytes encoded;\\n Lib_RLPReader.RLPItem[] decoded;\\n }\\n\\n\\n /**********************\\n * Contract Constants *\\n **********************/\\n\\n // TREE_RADIX determines the number of elements per branch node.\\n uint256 constant TREE_RADIX = 16;\\n // Branch nodes have TREE_RADIX elements plus an additional `value` slot.\\n uint256 constant BRANCH_NODE_LENGTH = TREE_RADIX + 1;\\n // Leaf nodes and extension nodes always have two elements, a `path` and a `value`.\\n uint256 constant LEAF_OR_EXTENSION_NODE_LENGTH = 2;\\n\\n // Prefixes are prepended to the `path` within a leaf or extension node and\\n // allow us to differentiate between the two node types. `ODD` or `EVEN` is\\n // determined by the number of nibbles within the unprefixed `path`. If the\\n // number of nibbles if even, we need to insert an extra padding nibble so\\n // the resulting prefixed `path` has an even number of nibbles.\\n uint8 constant PREFIX_EXTENSION_EVEN = 0;\\n uint8 constant PREFIX_EXTENSION_ODD = 1;\\n uint8 constant PREFIX_LEAF_EVEN = 2;\\n uint8 constant PREFIX_LEAF_ODD = 3;\\n\\n // Just a utility constant. RLP represents `NULL` as 0x80.\\n bytes1 constant RLP_NULL = bytes1(0x80);\\n bytes constant RLP_NULL_BYTES = hex'80';\\n bytes32 constant internal KECCAK256_RLP_NULL_BYTES = keccak256(RLP_NULL_BYTES);\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * @notice Verifies a proof that a given key/value pair is present in the\\n * Merkle trie.\\n * @param _key Key of the node to search for, as a hex string.\\n * @param _value Value of the node to search for, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the desired node. Unlike\\n * traditional Merkle trees, this proof is executed top-down and consists\\n * of a list of RLP-encoded nodes that make a path down to the target node.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _verified `true` if the k/v pair exists in the trie, `false` otherwise.\\n */\\n function verifyInclusionProof(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bool _verified\\n )\\n {\\n (\\n bool exists,\\n bytes memory value\\n ) = get(_key, _proof, _root);\\n\\n return (\\n exists && Lib_BytesUtils.equal(_value, value)\\n );\\n }\\n\\n /**\\n * @notice Verifies a proof that a given key is *not* present in\\n * the Merkle trie.\\n * @param _key Key of the node to search for, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\\n * target node.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _verified `true` if the key is absent in the trie, `false` otherwise.\\n */\\n function verifyExclusionProof(\\n bytes memory _key,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bool _verified\\n )\\n {\\n (\\n bool exists,\\n ) = get(_key, _proof, _root);\\n\\n return exists == false;\\n }\\n\\n /**\\n * @notice Updates a Merkle trie and returns a new root hash.\\n * @param _key Key of the node to update, as a hex string.\\n * @param _value Value of the node to update, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\\n * target node. If the key exists, we can simply update the value.\\n * Otherwise, we need to modify the trie to handle the new k/v pair.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _updatedRoot Root hash of the newly constructed trie.\\n */\\n function update(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bytes32 _updatedRoot\\n )\\n {\\n // Special case when inserting the very first node.\\n if (_root == KECCAK256_RLP_NULL_BYTES) {\\n return getSingleNodeRootHash(_key, _value);\\n }\\n\\n TrieNode[] memory proof = _parseProof(_proof);\\n (uint256 pathLength, bytes memory keyRemainder, ) = _walkNodePath(proof, _key, _root);\\n TrieNode[] memory newPath = _getNewPath(proof, pathLength, keyRemainder, _value);\\n\\n return _getUpdatedTrieRoot(newPath, _key);\\n }\\n\\n /**\\n * @notice Retrieves the value associated with a given key.\\n * @param _key Key to search for, as hex bytes.\\n * @param _proof Merkle trie inclusion proof for the key.\\n * @param _root Known root of the Merkle trie.\\n * @return _exists Whether or not the key exists.\\n * @return _value Value of the key if it exists.\\n */\\n function get(\\n bytes memory _key,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bool _exists,\\n bytes memory _value\\n )\\n {\\n TrieNode[] memory proof = _parseProof(_proof);\\n (uint256 pathLength, bytes memory keyRemainder, bool isFinalNode) = _walkNodePath(proof, _key, _root);\\n\\n bool exists = keyRemainder.length == 0;\\n\\n require(\\n exists || isFinalNode,\\n \\\"Provided proof is invalid.\\\"\\n );\\n\\n bytes memory value = exists ? _getNodeValue(proof[pathLength - 1]) : bytes('');\\n\\n return (\\n exists,\\n value\\n );\\n }\\n\\n /**\\n * Computes the root hash for a trie with a single node.\\n * @param _key Key for the single node.\\n * @param _value Value for the single node.\\n * @return _updatedRoot Hash of the trie.\\n */\\n function getSingleNodeRootHash(\\n bytes memory _key,\\n bytes memory _value\\n )\\n internal\\n pure\\n returns (\\n bytes32 _updatedRoot\\n )\\n {\\n return keccak256(_makeLeafNode(\\n Lib_BytesUtils.toNibbles(_key),\\n _value\\n ).encoded);\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * @notice Walks through a proof using a provided key.\\n * @param _proof Inclusion proof to walk through.\\n * @param _key Key to use for the walk.\\n * @param _root Known root of the trie.\\n * @return _pathLength Length of the final path\\n * @return _keyRemainder Portion of the key remaining after the walk.\\n * @return _isFinalNode Whether or not we've hit a dead end.\\n */\\n function _walkNodePath(\\n TrieNode[] memory _proof,\\n bytes memory _key,\\n bytes32 _root\\n )\\n private\\n pure\\n returns (\\n uint256 _pathLength,\\n bytes memory _keyRemainder,\\n bool _isFinalNode\\n )\\n {\\n uint256 pathLength = 0;\\n bytes memory key = Lib_BytesUtils.toNibbles(_key);\\n\\n bytes32 currentNodeID = _root;\\n uint256 currentKeyIndex = 0;\\n uint256 currentKeyIncrement = 0;\\n TrieNode memory currentNode;\\n\\n // Proof is top-down, so we start at the first element (root).\\n for (uint256 i = 0; i < _proof.length; i++) {\\n currentNode = _proof[i];\\n currentKeyIndex += currentKeyIncrement;\\n\\n // Keep track of the proof elements we actually need.\\n // It's expensive to resize arrays, so this simply reduces gas costs.\\n pathLength += 1;\\n\\n if (currentKeyIndex == 0) {\\n // First proof element is always the root node.\\n require(\\n keccak256(currentNode.encoded) == currentNodeID,\\n \\\"Invalid root hash\\\"\\n );\\n } else if (currentNode.encoded.length >= 32) {\\n // Nodes 32 bytes or larger are hashed inside branch nodes.\\n require(\\n keccak256(currentNode.encoded) == currentNodeID,\\n \\\"Invalid large internal hash\\\"\\n );\\n } else {\\n // Nodes smaller than 31 bytes aren't hashed.\\n require(\\n Lib_BytesUtils.toBytes32(currentNode.encoded) == currentNodeID,\\n \\\"Invalid internal node hash\\\"\\n );\\n }\\n\\n if (currentNode.decoded.length == BRANCH_NODE_LENGTH) {\\n if (currentKeyIndex == key.length) {\\n // We've hit the end of the key, meaning the value should be within this branch node.\\n break;\\n } else {\\n // We're not at the end of the key yet.\\n // Figure out what the next node ID should be and continue.\\n uint8 branchKey = uint8(key[currentKeyIndex]);\\n Lib_RLPReader.RLPItem memory nextNode = currentNode.decoded[branchKey];\\n currentNodeID = _getNodeID(nextNode);\\n currentKeyIncrement = 1;\\n continue;\\n }\\n } else if (currentNode.decoded.length == LEAF_OR_EXTENSION_NODE_LENGTH) {\\n bytes memory path = _getNodePath(currentNode);\\n uint8 prefix = uint8(path[0]);\\n uint8 offset = 2 - prefix % 2;\\n bytes memory pathRemainder = Lib_BytesUtils.slice(path, offset);\\n bytes memory keyRemainder = Lib_BytesUtils.slice(key, currentKeyIndex);\\n uint256 sharedNibbleLength = _getSharedNibbleLength(pathRemainder, keyRemainder);\\n\\n if (prefix == PREFIX_LEAF_EVEN || prefix == PREFIX_LEAF_ODD) {\\n if (\\n pathRemainder.length == sharedNibbleLength &&\\n keyRemainder.length == sharedNibbleLength\\n ) {\\n // The key within this leaf matches our key exactly.\\n // Increment the key index to reflect that we have no remainder.\\n currentKeyIndex += sharedNibbleLength;\\n }\\n\\n // We've hit a leaf node, so our next node should be NULL.\\n currentNodeID = bytes32(RLP_NULL);\\n break;\\n } else if (prefix == PREFIX_EXTENSION_EVEN || prefix == PREFIX_EXTENSION_ODD) {\\n if (sharedNibbleLength == 0) {\\n // Our extension node doesn't share any part of our key.\\n // We've hit the end of this path, updates will need to modify this extension.\\n currentNodeID = bytes32(RLP_NULL);\\n break;\\n } else {\\n // Our extension shares some nibbles.\\n // Carry on to the next node.\\n currentNodeID = _getNodeID(currentNode.decoded[1]);\\n currentKeyIncrement = sharedNibbleLength;\\n continue;\\n }\\n } else {\\n revert(\\\"Received a node with an unknown prefix\\\");\\n }\\n } else {\\n revert(\\\"Received an unparseable node.\\\");\\n }\\n }\\n\\n // If our node ID is NULL, then we're at a dead end.\\n bool isFinalNode = currentNodeID == bytes32(RLP_NULL);\\n return (pathLength, Lib_BytesUtils.slice(key, currentKeyIndex), isFinalNode);\\n }\\n\\n /**\\n * @notice Creates new nodes to support a k/v pair insertion into a given\\n * Merkle trie path.\\n * @param _path Path to the node nearest the k/v pair.\\n * @param _pathLength Length of the path. Necessary because the provided\\n * path may include additional nodes (e.g., it comes directly from a proof)\\n * and we can't resize in-memory arrays without costly duplication.\\n * @param _keyRemainder Portion of the initial key that must be inserted\\n * into the trie.\\n * @param _value Value to insert at the given key.\\n * @return _newPath A new path with the inserted k/v pair and extra supporting nodes.\\n */\\n function _getNewPath(\\n TrieNode[] memory _path,\\n uint256 _pathLength,\\n bytes memory _keyRemainder,\\n bytes memory _value\\n )\\n private\\n pure\\n returns (\\n TrieNode[] memory _newPath\\n )\\n {\\n bytes memory keyRemainder = _keyRemainder;\\n\\n // Most of our logic depends on the status of the last node in the path.\\n TrieNode memory lastNode = _path[_pathLength - 1];\\n NodeType lastNodeType = _getNodeType(lastNode);\\n\\n // Create an array for newly created nodes.\\n // We need up to three new nodes, depending on the contents of the last node.\\n // Since array resizing is expensive, we'll keep track of the size manually.\\n // We're using an explicit `totalNewNodes += 1` after insertions for clarity.\\n TrieNode[] memory newNodes = new TrieNode[](3);\\n uint256 totalNewNodes = 0;\\n\\n if (keyRemainder.length == 0 && lastNodeType == NodeType.LeafNode) {\\n // We've found a leaf node with the given key.\\n // Simply need to update the value of the node to match.\\n newNodes[totalNewNodes] = _makeLeafNode(_getNodeKey(lastNode), _value);\\n totalNewNodes += 1;\\n } else if (lastNodeType == NodeType.BranchNode) {\\n if (keyRemainder.length == 0) {\\n // We've found a branch node with the given key.\\n // Simply need to update the value of the node to match.\\n newNodes[totalNewNodes] = _editBranchValue(lastNode, _value);\\n totalNewNodes += 1;\\n } else {\\n // We've found a branch node, but it doesn't contain our key.\\n // Reinsert the old branch for now.\\n newNodes[totalNewNodes] = lastNode;\\n totalNewNodes += 1;\\n // Create a new leaf node, slicing our remainder since the first byte points\\n // to our branch node.\\n newNodes[totalNewNodes] = _makeLeafNode(Lib_BytesUtils.slice(keyRemainder, 1), _value);\\n totalNewNodes += 1;\\n }\\n } else {\\n // Our last node is either an extension node or a leaf node with a different key.\\n bytes memory lastNodeKey = _getNodeKey(lastNode);\\n uint256 sharedNibbleLength = _getSharedNibbleLength(lastNodeKey, keyRemainder);\\n\\n if (sharedNibbleLength != 0) {\\n // We've got some shared nibbles between the last node and our key remainder.\\n // We'll need to insert an extension node that covers these shared nibbles.\\n bytes memory nextNodeKey = Lib_BytesUtils.slice(lastNodeKey, 0, sharedNibbleLength);\\n newNodes[totalNewNodes] = _makeExtensionNode(nextNodeKey, _getNodeHash(_value));\\n totalNewNodes += 1;\\n\\n // Cut down the keys since we've just covered these shared nibbles.\\n lastNodeKey = Lib_BytesUtils.slice(lastNodeKey, sharedNibbleLength);\\n keyRemainder = Lib_BytesUtils.slice(keyRemainder, sharedNibbleLength);\\n }\\n\\n // Create an empty branch to fill in.\\n TrieNode memory newBranch = _makeEmptyBranchNode();\\n\\n if (lastNodeKey.length == 0) {\\n // Key remainder was larger than the key for our last node.\\n // The value within our last node is therefore going to be shifted into\\n // a branch value slot.\\n newBranch = _editBranchValue(newBranch, _getNodeValue(lastNode));\\n } else {\\n // Last node key was larger than the key remainder.\\n // We're going to modify some index of our branch.\\n uint8 branchKey = uint8(lastNodeKey[0]);\\n // Move on to the next nibble.\\n lastNodeKey = Lib_BytesUtils.slice(lastNodeKey, 1);\\n\\n if (lastNodeType == NodeType.LeafNode) {\\n // We're dealing with a leaf node.\\n // We'll modify the key and insert the old leaf node into the branch index.\\n TrieNode memory modifiedLastNode = _makeLeafNode(lastNodeKey, _getNodeValue(lastNode));\\n newBranch = _editBranchIndex(newBranch, branchKey, _getNodeHash(modifiedLastNode.encoded));\\n } else if (lastNodeKey.length != 0) {\\n // We're dealing with a shrinking extension node.\\n // We need to modify the node to decrease the size of the key.\\n TrieNode memory modifiedLastNode = _makeExtensionNode(lastNodeKey, _getNodeValue(lastNode));\\n newBranch = _editBranchIndex(newBranch, branchKey, _getNodeHash(modifiedLastNode.encoded));\\n } else {\\n // We're dealing with an unnecessary extension node.\\n // We're going to delete the node entirely.\\n // Simply insert its current value into the branch index.\\n newBranch = _editBranchIndex(newBranch, branchKey, _getNodeValue(lastNode));\\n }\\n }\\n\\n if (keyRemainder.length == 0) {\\n // We've got nothing left in the key remainder.\\n // Simply insert the value into the branch value slot.\\n newBranch = _editBranchValue(newBranch, _value);\\n // Push the branch into the list of new nodes.\\n newNodes[totalNewNodes] = newBranch;\\n totalNewNodes += 1;\\n } else {\\n // We've got some key remainder to work with.\\n // We'll be inserting a leaf node into the trie.\\n // First, move on to the next nibble.\\n keyRemainder = Lib_BytesUtils.slice(keyRemainder, 1);\\n // Push the branch into the list of new nodes.\\n newNodes[totalNewNodes] = newBranch;\\n totalNewNodes += 1;\\n // Push a new leaf node for our k/v pair.\\n newNodes[totalNewNodes] = _makeLeafNode(keyRemainder, _value);\\n totalNewNodes += 1;\\n }\\n }\\n\\n // Finally, join the old path with our newly created nodes.\\n // Since we're overwriting the last node in the path, we use `_pathLength - 1`.\\n return _joinNodeArrays(_path, _pathLength - 1, newNodes, totalNewNodes);\\n }\\n\\n /**\\n * @notice Computes the trie root from a given path.\\n * @param _nodes Path to some k/v pair.\\n * @param _key Key for the k/v pair.\\n * @return _updatedRoot Root hash for the updated trie.\\n */\\n function _getUpdatedTrieRoot(\\n TrieNode[] memory _nodes,\\n bytes memory _key\\n )\\n private\\n pure\\n returns (\\n bytes32 _updatedRoot\\n )\\n {\\n bytes memory key = Lib_BytesUtils.toNibbles(_key);\\n\\n // Some variables to keep track of during iteration.\\n TrieNode memory currentNode;\\n NodeType currentNodeType;\\n bytes memory previousNodeHash;\\n\\n // Run through the path backwards to rebuild our root hash.\\n for (uint256 i = _nodes.length; i > 0; i--) {\\n // Pick out the current node.\\n currentNode = _nodes[i - 1];\\n currentNodeType = _getNodeType(currentNode);\\n\\n if (currentNodeType == NodeType.LeafNode) {\\n // Leaf nodes are already correctly encoded.\\n // Shift the key over to account for the nodes key.\\n bytes memory nodeKey = _getNodeKey(currentNode);\\n key = Lib_BytesUtils.slice(key, 0, key.length - nodeKey.length);\\n } else if (currentNodeType == NodeType.ExtensionNode) {\\n // Shift the key over to account for the nodes key.\\n bytes memory nodeKey = _getNodeKey(currentNode);\\n key = Lib_BytesUtils.slice(key, 0, key.length - nodeKey.length);\\n\\n // If this node is the last element in the path, it'll be correctly encoded\\n // and we can skip this part.\\n if (previousNodeHash.length > 0) {\\n // Re-encode the node based on the previous node.\\n currentNode = _makeExtensionNode(nodeKey, previousNodeHash);\\n }\\n } else if (currentNodeType == NodeType.BranchNode) {\\n // If this node is the last element in the path, it'll be correctly encoded\\n // and we can skip this part.\\n if (previousNodeHash.length > 0) {\\n // Re-encode the node based on the previous node.\\n uint8 branchKey = uint8(key[key.length - 1]);\\n key = Lib_BytesUtils.slice(key, 0, key.length - 1);\\n currentNode = _editBranchIndex(currentNode, branchKey, previousNodeHash);\\n }\\n }\\n\\n // Compute the node hash for the next iteration.\\n previousNodeHash = _getNodeHash(currentNode.encoded);\\n }\\n\\n // Current node should be the root at this point.\\n // Simply return the hash of its encoding.\\n return keccak256(currentNode.encoded);\\n }\\n\\n /**\\n * @notice Parses an RLP-encoded proof into something more useful.\\n * @param _proof RLP-encoded proof to parse.\\n * @return _parsed Proof parsed into easily accessible structs.\\n */\\n function _parseProof(\\n bytes memory _proof\\n )\\n private\\n pure\\n returns (\\n TrieNode[] memory _parsed\\n )\\n {\\n Lib_RLPReader.RLPItem[] memory nodes = Lib_RLPReader.readList(_proof);\\n TrieNode[] memory proof = new TrieNode[](nodes.length);\\n\\n for (uint256 i = 0; i < nodes.length; i++) {\\n bytes memory encoded = Lib_RLPReader.readBytes(nodes[i]);\\n proof[i] = TrieNode({\\n encoded: encoded,\\n decoded: Lib_RLPReader.readList(encoded)\\n });\\n }\\n\\n return proof;\\n }\\n\\n /**\\n * @notice Picks out the ID for a node. Node ID is referred to as the\\n * \\\"hash\\\" within the specification, but nodes < 32 bytes are not actually\\n * hashed.\\n * @param _node Node to pull an ID for.\\n * @return _nodeID ID for the node, depending on the size of its contents.\\n */\\n function _getNodeID(\\n Lib_RLPReader.RLPItem memory _node\\n )\\n private\\n pure\\n returns (\\n bytes32 _nodeID\\n )\\n {\\n bytes memory nodeID;\\n\\n if (_node.length < 32) {\\n // Nodes smaller than 32 bytes are RLP encoded.\\n nodeID = Lib_RLPReader.readRawBytes(_node);\\n } else {\\n // Nodes 32 bytes or larger are hashed.\\n nodeID = Lib_RLPReader.readBytes(_node);\\n }\\n\\n return Lib_BytesUtils.toBytes32(nodeID);\\n }\\n\\n /**\\n * @notice Gets the path for a leaf or extension node.\\n * @param _node Node to get a path for.\\n * @return _path Node path, converted to an array of nibbles.\\n */\\n function _getNodePath(\\n TrieNode memory _node\\n )\\n private\\n pure\\n returns (\\n bytes memory _path\\n )\\n {\\n return Lib_BytesUtils.toNibbles(Lib_RLPReader.readBytes(_node.decoded[0]));\\n }\\n\\n /**\\n * @notice Gets the key for a leaf or extension node. Keys are essentially\\n * just paths without any prefix.\\n * @param _node Node to get a key for.\\n * @return _key Node key, converted to an array of nibbles.\\n */\\n function _getNodeKey(\\n TrieNode memory _node\\n )\\n private\\n pure\\n returns (\\n bytes memory _key\\n )\\n {\\n return _removeHexPrefix(_getNodePath(_node));\\n }\\n\\n /**\\n * @notice Gets the path for a node.\\n * @param _node Node to get a value for.\\n * @return _value Node value, as hex bytes.\\n */\\n function _getNodeValue(\\n TrieNode memory _node\\n )\\n private\\n pure\\n returns (\\n bytes memory _value\\n )\\n {\\n return Lib_RLPReader.readBytes(_node.decoded[_node.decoded.length - 1]);\\n }\\n\\n /**\\n * @notice Computes the node hash for an encoded node. Nodes < 32 bytes\\n * are not hashed, all others are keccak256 hashed.\\n * @param _encoded Encoded node to hash.\\n * @return _hash Hash of the encoded node. Simply the input if < 32 bytes.\\n */\\n function _getNodeHash(\\n bytes memory _encoded\\n )\\n private\\n pure\\n returns (\\n bytes memory _hash\\n )\\n {\\n if (_encoded.length < 32) {\\n return _encoded;\\n } else {\\n return abi.encodePacked(keccak256(_encoded));\\n }\\n }\\n\\n /**\\n * @notice Determines the type for a given node.\\n * @param _node Node to determine a type for.\\n * @return _type Type of the node; BranchNode/ExtensionNode/LeafNode.\\n */\\n function _getNodeType(\\n TrieNode memory _node\\n )\\n private\\n pure\\n returns (\\n NodeType _type\\n )\\n {\\n if (_node.decoded.length == BRANCH_NODE_LENGTH) {\\n return NodeType.BranchNode;\\n } else if (_node.decoded.length == LEAF_OR_EXTENSION_NODE_LENGTH) {\\n bytes memory path = _getNodePath(_node);\\n uint8 prefix = uint8(path[0]);\\n\\n if (prefix == PREFIX_LEAF_EVEN || prefix == PREFIX_LEAF_ODD) {\\n return NodeType.LeafNode;\\n } else if (prefix == PREFIX_EXTENSION_EVEN || prefix == PREFIX_EXTENSION_ODD) {\\n return NodeType.ExtensionNode;\\n }\\n }\\n\\n revert(\\\"Invalid node type\\\");\\n }\\n\\n /**\\n * @notice Utility; determines the number of nibbles shared between two\\n * nibble arrays.\\n * @param _a First nibble array.\\n * @param _b Second nibble array.\\n * @return _shared Number of shared nibbles.\\n */\\n function _getSharedNibbleLength(\\n bytes memory _a,\\n bytes memory _b\\n )\\n private\\n pure\\n returns (\\n uint256 _shared\\n )\\n {\\n uint256 i = 0;\\n while (_a.length > i && _b.length > i && _a[i] == _b[i]) {\\n i++;\\n }\\n return i;\\n }\\n\\n /**\\n * @notice Utility; converts an RLP-encoded node into our nice struct.\\n * @param _raw RLP-encoded node to convert.\\n * @return _node Node as a TrieNode struct.\\n */\\n function _makeNode(\\n bytes[] memory _raw\\n )\\n private\\n pure\\n returns (\\n TrieNode memory _node\\n )\\n {\\n bytes memory encoded = Lib_RLPWriter.writeList(_raw);\\n\\n return TrieNode({\\n encoded: encoded,\\n decoded: Lib_RLPReader.readList(encoded)\\n });\\n }\\n\\n /**\\n * @notice Utility; converts an RLP-decoded node into our nice struct.\\n * @param _items RLP-decoded node to convert.\\n * @return _node Node as a TrieNode struct.\\n */\\n function _makeNode(\\n Lib_RLPReader.RLPItem[] memory _items\\n )\\n private\\n pure\\n returns (\\n TrieNode memory _node\\n )\\n {\\n bytes[] memory raw = new bytes[](_items.length);\\n for (uint256 i = 0; i < _items.length; i++) {\\n raw[i] = Lib_RLPReader.readRawBytes(_items[i]);\\n }\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Creates a new extension node.\\n * @param _key Key for the extension node, unprefixed.\\n * @param _value Value for the extension node.\\n * @return _node New extension node with the given k/v pair.\\n */\\n function _makeExtensionNode(\\n bytes memory _key,\\n bytes memory _value\\n )\\n private\\n pure\\n returns (\\n TrieNode memory _node\\n )\\n {\\n bytes[] memory raw = new bytes[](2);\\n bytes memory key = _addHexPrefix(_key, false);\\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\\n raw[1] = Lib_RLPWriter.writeBytes(_value);\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Creates a new leaf node.\\n * @dev This function is essentially identical to `_makeExtensionNode`.\\n * Although we could route both to a single method with a flag, it's\\n * more gas efficient to keep them separate and duplicate the logic.\\n * @param _key Key for the leaf node, unprefixed.\\n * @param _value Value for the leaf node.\\n * @return _node New leaf node with the given k/v pair.\\n */\\n function _makeLeafNode(\\n bytes memory _key,\\n bytes memory _value\\n )\\n private\\n pure\\n returns (\\n TrieNode memory _node\\n )\\n {\\n bytes[] memory raw = new bytes[](2);\\n bytes memory key = _addHexPrefix(_key, true);\\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\\n raw[1] = Lib_RLPWriter.writeBytes(_value);\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Creates an empty branch node.\\n * @return _node Empty branch node as a TrieNode struct.\\n */\\n function _makeEmptyBranchNode()\\n private\\n pure\\n returns (\\n TrieNode memory _node\\n )\\n {\\n bytes[] memory raw = new bytes[](BRANCH_NODE_LENGTH);\\n for (uint256 i = 0; i < raw.length; i++) {\\n raw[i] = RLP_NULL_BYTES;\\n }\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Modifies the value slot for a given branch.\\n * @param _branch Branch node to modify.\\n * @param _value Value to insert into the branch.\\n * @return _updatedNode Modified branch node.\\n */\\n function _editBranchValue(\\n TrieNode memory _branch,\\n bytes memory _value\\n )\\n private\\n pure\\n returns (\\n TrieNode memory _updatedNode\\n )\\n {\\n bytes memory encoded = Lib_RLPWriter.writeBytes(_value);\\n _branch.decoded[_branch.decoded.length - 1] = Lib_RLPReader.toRLPItem(encoded);\\n return _makeNode(_branch.decoded);\\n }\\n\\n /**\\n * @notice Modifies a slot at an index for a given branch.\\n * @param _branch Branch node to modify.\\n * @param _index Slot index to modify.\\n * @param _value Value to insert into the slot.\\n * @return _updatedNode Modified branch node.\\n */\\n function _editBranchIndex(\\n TrieNode memory _branch,\\n uint8 _index,\\n bytes memory _value\\n )\\n private\\n pure\\n returns (\\n TrieNode memory _updatedNode\\n )\\n {\\n bytes memory encoded = _value.length < 32 ? _value : Lib_RLPWriter.writeBytes(_value);\\n _branch.decoded[_index] = Lib_RLPReader.toRLPItem(encoded);\\n return _makeNode(_branch.decoded);\\n }\\n\\n /**\\n * @notice Utility; adds a prefix to a key.\\n * @param _key Key to prefix.\\n * @param _isLeaf Whether or not the key belongs to a leaf.\\n * @return _prefixedKey Prefixed key.\\n */\\n function _addHexPrefix(\\n bytes memory _key,\\n bool _isLeaf\\n )\\n private\\n pure\\n returns (\\n bytes memory _prefixedKey\\n )\\n {\\n uint8 prefix = _isLeaf ? uint8(0x02) : uint8(0x00);\\n uint8 offset = uint8(_key.length % 2);\\n bytes memory prefixed = new bytes(2 - offset);\\n prefixed[0] = bytes1(prefix + offset);\\n return abi.encodePacked(prefixed, _key);\\n }\\n\\n /**\\n * @notice Utility; removes a prefix from a path.\\n * @param _path Path to remove the prefix from.\\n * @return _unprefixedKey Unprefixed key.\\n */\\n function _removeHexPrefix(\\n bytes memory _path\\n )\\n private\\n pure\\n returns (\\n bytes memory _unprefixedKey\\n )\\n {\\n if (uint8(_path[0]) % 2 == 0) {\\n return Lib_BytesUtils.slice(_path, 2);\\n } else {\\n return Lib_BytesUtils.slice(_path, 1);\\n }\\n }\\n\\n /**\\n * @notice Utility; combines two node arrays. Array lengths are required\\n * because the actual lengths may be longer than the filled lengths.\\n * Array resizing is extremely costly and should be avoided.\\n * @param _a First array to join.\\n * @param _aLength Length of the first array.\\n * @param _b Second array to join.\\n * @param _bLength Length of the second array.\\n * @return _joined Combined node array.\\n */\\n function _joinNodeArrays(\\n TrieNode[] memory _a,\\n uint256 _aLength,\\n TrieNode[] memory _b,\\n uint256 _bLength\\n )\\n private\\n pure\\n returns (\\n TrieNode[] memory _joined\\n )\\n {\\n TrieNode[] memory ret = new TrieNode[](_aLength + _bLength);\\n\\n // Copy elements from the first array.\\n for (uint256 i = 0; i < _aLength; i++) {\\n ret[i] = _a[i];\\n }\\n\\n // Copy elements from the second array.\\n for (uint256 i = 0; i < _bLength; i++) {\\n ret[i + _aLength] = _b[i];\\n }\\n\\n return ret;\\n }\\n}\\n\",\"keccak256\":\"0x161f65220b8c5cf295232f8c58c2744fbc898bf77da5f9d9c5b2dd673dafc6f6\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/trie/Lib_SecureMerkleTrie.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_MerkleTrie } from \\\"./Lib_MerkleTrie.sol\\\";\\n\\n/**\\n * @title Lib_SecureMerkleTrie\\n */\\nlibrary Lib_SecureMerkleTrie {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * @notice Verifies a proof that a given key/value pair is present in the\\n * Merkle trie.\\n * @param _key Key of the node to search for, as a hex string.\\n * @param _value Value of the node to search for, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the desired node. Unlike\\n * traditional Merkle trees, this proof is executed top-down and consists\\n * of a list of RLP-encoded nodes that make a path down to the target node.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _verified `true` if the k/v pair exists in the trie, `false` otherwise.\\n */\\n function verifyInclusionProof(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bool _verified\\n )\\n {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.verifyInclusionProof(key, _value, _proof, _root);\\n }\\n\\n /**\\n * @notice Verifies a proof that a given key is *not* present in\\n * the Merkle trie.\\n * @param _key Key of the node to search for, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\\n * target node.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _verified `true` if the key is not present in the trie, `false` otherwise.\\n */\\n function verifyExclusionProof(\\n bytes memory _key,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bool _verified\\n )\\n {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.verifyExclusionProof(key, _proof, _root);\\n }\\n\\n /**\\n * @notice Updates a Merkle trie and returns a new root hash.\\n * @param _key Key of the node to update, as a hex string.\\n * @param _value Value of the node to update, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\\n * target node. If the key exists, we can simply update the value.\\n * Otherwise, we need to modify the trie to handle the new k/v pair.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _updatedRoot Root hash of the newly constructed trie.\\n */\\n function update(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bytes32 _updatedRoot\\n )\\n {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.update(key, _value, _proof, _root);\\n }\\n\\n /**\\n * @notice Retrieves the value associated with a given key.\\n * @param _key Key to search for, as hex bytes.\\n * @param _proof Merkle trie inclusion proof for the key.\\n * @param _root Known root of the Merkle trie.\\n * @return _exists Whether or not the key exists.\\n * @return _value Value of the key if it exists.\\n */\\n function get(\\n bytes memory _key,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bool _exists,\\n bytes memory _value\\n )\\n {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.get(key, _proof, _root);\\n }\\n\\n /**\\n * Computes the root hash for a trie with a single node.\\n * @param _key Key for the single node.\\n * @param _value Value for the single node.\\n * @return _updatedRoot Hash of the trie.\\n */\\n function getSingleNodeRootHash(\\n bytes memory _key,\\n bytes memory _value\\n )\\n internal\\n pure\\n returns (\\n bytes32 _updatedRoot\\n )\\n {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.getSingleNodeRootHash(key, _value);\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Computes the secure counterpart to a key.\\n * @param _key Key to get a secure key from.\\n * @return _secureKey Secure version of the key.\\n */\\n function _getSecureKey(\\n bytes memory _key\\n )\\n private\\n pure\\n returns (\\n bytes memory _secureKey\\n )\\n {\\n return abi.encodePacked(keccak256(_key));\\n }\\n}\",\"keccak256\":\"0x79355346f74bb1eb9eeb733cb5d9677d50115c4f390307cbf608fe071a1ada0c\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_Bytes32Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_Byte32Utils\\n */\\nlibrary Lib_Bytes32Utils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \\\"true.\\\"\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as a boolean.\\n */\\n function toBool(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return _in != 0;\\n }\\n\\n /**\\n * Converts a boolean to a bytes32 value.\\n * @param _in Input boolean value.\\n * @return Boolean as a bytes32.\\n */\\n function fromBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in ? 1 : 0));\\n }\\n\\n /**\\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as an address.\\n */\\n function toAddress(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return address(uint160(uint256(_in)));\\n }\\n\\n /**\\n * Converts an address to a bytes32.\\n * @param _in Input address value.\\n * @return Address as a bytes32.\\n */\\n function fromAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in));\\n }\\n\\n /**\\n * Removes the leading zeros from a bytes32 value and returns a new (smaller) bytes value.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 without any leading zeros.\\n */\\n function removeLeadingZeros(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out;\\n\\n assembly {\\n // Figure out how many leading zero bytes to remove.\\n let shift := 0\\n for { let i := 0 } and(lt(i, 32), eq(byte(i, _in), 0)) { i := add(i, 1) } {\\n shift := add(shift, 1)\\n }\\n\\n // Reserve some space for our output and fix the free memory pointer.\\n out := mload(0x40)\\n mstore(0x40, add(out, 0x40))\\n\\n // Shift the value and store it into the output bytes.\\n mstore(add(out, 0x20), shl(mul(shift, 8), _in))\\n\\n // Store the new size (with leading zero bytes removed) in the output byte size.\\n mstore(out, sub(32, shift))\\n }\\n\\n return out;\\n }\\n}\\n\",\"keccak256\":\"0xfa2def593e3fc56a31852c3744aefdaa93cec74e721bfcfeb1e5d166c7c60b64\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_BytesUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_BytesUtils\\n */\\nlibrary Lib_BytesUtils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_start + _length >= _start, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n if (_bytes.length - _start == 0) {\\n return bytes('');\\n }\\n\\n return slice(_bytes, _start, _bytes.length - _start);\\n }\\n\\n function toBytes32PadLeft(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes32)\\n {\\n bytes32 ret;\\n uint256 len = _bytes.length <= 32 ? _bytes.length : 32;\\n assembly {\\n ret := shr(mul(sub(32, len), 8), mload(add(_bytes, 32)))\\n }\\n return ret;\\n }\\n\\n function toBytes32(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes32)\\n {\\n if (_bytes.length < 32) {\\n bytes32 ret;\\n assembly {\\n ret := mload(add(_bytes, 32))\\n }\\n return ret;\\n }\\n\\n return abi.decode(_bytes,(bytes32)); // will truncate if input length > 32 bytes\\n }\\n\\n function toUint256(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (uint256)\\n {\\n return uint256(toBytes32(_bytes));\\n }\\n\\n function toUint24(bytes memory _bytes, uint256 _start) internal pure returns (uint24) {\\n require(_start + 3 >= _start, \\\"toUint24_overflow\\\");\\n require(_bytes.length >= _start + 3 , \\\"toUint24_outOfBounds\\\");\\n uint24 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x3), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toUint8(bytes memory _bytes, uint256 _start) internal pure returns (uint8) {\\n require(_start + 1 >= _start, \\\"toUint8_overflow\\\");\\n require(_bytes.length >= _start + 1 , \\\"toUint8_outOfBounds\\\");\\n uint8 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x1), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toAddress(bytes memory _bytes, uint256 _start) internal pure returns (address) {\\n require(_start + 20 >= _start, \\\"toAddress_overflow\\\");\\n require(_bytes.length >= _start + 20, \\\"toAddress_outOfBounds\\\");\\n address tempAddress;\\n\\n assembly {\\n tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000)\\n }\\n\\n return tempAddress;\\n }\\n\\n function toNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n bytes memory nibbles = new bytes(_bytes.length * 2);\\n\\n for (uint256 i = 0; i < _bytes.length; i++) {\\n nibbles[i * 2] = _bytes[i] >> 4;\\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\\n }\\n\\n return nibbles;\\n }\\n\\n function fromNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n bytes memory ret = new bytes(_bytes.length / 2);\\n\\n for (uint256 i = 0; i < ret.length; i++) {\\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\\n }\\n\\n return ret;\\n }\\n\\n function equal(\\n bytes memory _bytes,\\n bytes memory _other\\n )\\n internal\\n pure\\n returns (bool)\\n {\\n return keccak256(_bytes) == keccak256(_other);\\n }\\n}\\n\",\"keccak256\":\"0x0adf22e1b22ba09911e859f64cb3b484e992be4f9fd3b09088e6225bf8d06ce0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_ErrorUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/**\\n * @title Lib_ErrorUtils\\n */\\nlibrary Lib_ErrorUtils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Encodes an error string into raw solidity-style revert data.\\n * (i.e. ascii bytes, prefixed with bytes4(keccak(\\\"Error(string))\\\"))\\n * Ref: https://docs.soliditylang.org/en/v0.8.2/control-structures.html?highlight=Error(string)#panic-via-assert-and-error-via-require\\n * @param _reason Reason for the reversion.\\n * @return Standard solidity revert data for the given reason.\\n */\\n function encodeRevertString(\\n string memory _reason\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return abi.encodeWithSignature(\\n \\\"Error(string)\\\",\\n _reason\\n );\\n }\\n}\\n\",\"keccak256\":\"0xfc64ec4a81fb50865b502a0004ed154e8598e1a313db77303fc95e41f536e6b7\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_EthUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// @unsupported: ovm\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"./Lib_Bytes32Utils.sol\\\";\\n\\n/**\\n * @title Lib_EthUtils\\n */\\nlibrary Lib_EthUtils {\\n\\n /***********************************\\n * Internal Functions: Code Access *\\n ***********************************/\\n\\n /**\\n * Gets the code for a given address.\\n * @param _address Address to get code for.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return _code Code read from the contract.\\n */\\n function getCode(\\n address _address,\\n uint256 _offset,\\n uint256 _length\\n )\\n internal\\n view\\n returns (\\n bytes memory _code\\n )\\n {\\n assembly {\\n _code := mload(0x40)\\n mstore(0x40, add(_code, add(_length, 0x20)))\\n mstore(_code, _length)\\n extcodecopy(_address, add(_code, 0x20), _offset, _length)\\n }\\n\\n return _code;\\n }\\n\\n /**\\n * Gets the full code for a given address.\\n * @param _address Address to get code for.\\n * @return _code Full code of the contract.\\n */\\n function getCode(\\n address _address\\n )\\n internal\\n view\\n returns (\\n bytes memory _code\\n )\\n {\\n return getCode(\\n _address,\\n 0,\\n getCodeSize(_address)\\n );\\n }\\n\\n /**\\n * Gets the size of a contract's code in bytes.\\n * @param _address Address to get code size for.\\n * @return _codeSize Size of the contract's code in bytes.\\n */\\n function getCodeSize(\\n address _address\\n )\\n internal\\n view\\n returns (\\n uint256 _codeSize\\n )\\n {\\n assembly {\\n _codeSize := extcodesize(_address)\\n }\\n\\n return _codeSize;\\n }\\n\\n /**\\n * Gets the hash of a contract's code.\\n * @param _address Address to get a code hash for.\\n * @return _codeHash Hash of the contract's code.\\n */\\n function getCodeHash(\\n address _address\\n )\\n internal\\n view\\n returns (\\n bytes32 _codeHash\\n )\\n {\\n assembly {\\n _codeHash := extcodehash(_address)\\n }\\n\\n return _codeHash;\\n }\\n\\n\\n /*****************************************\\n * Internal Functions: Contract Creation *\\n *****************************************/\\n\\n /**\\n * Creates a contract with some given initialization code.\\n * @param _code Contract initialization code.\\n * @return _created Address of the created contract.\\n */\\n function createContract(\\n bytes memory _code\\n )\\n internal\\n returns (\\n address _created\\n )\\n {\\n assembly {\\n _created := create(\\n 0,\\n add(_code, 0x20),\\n mload(_code)\\n )\\n }\\n\\n return _created;\\n }\\n\\n /**\\n * Computes the address that would be generated by CREATE.\\n * @param _creator Address creating the contract.\\n * @param _nonce Creator's nonce.\\n * @return _address Address to be generated by CREATE.\\n */\\n function getAddressForCREATE(\\n address _creator,\\n uint256 _nonce\\n )\\n internal\\n pure\\n returns (\\n address _address\\n )\\n {\\n bytes[] memory encoded = new bytes[](2);\\n encoded[0] = Lib_RLPWriter.writeAddress(_creator);\\n encoded[1] = Lib_RLPWriter.writeUint(_nonce);\\n\\n bytes memory encodedList = Lib_RLPWriter.writeList(encoded);\\n return Lib_Bytes32Utils.toAddress(keccak256(encodedList));\\n }\\n\\n /**\\n * Computes the address that would be generated by CREATE2.\\n * @param _creator Address creating the contract.\\n * @param _bytecode Bytecode of the contract to be created.\\n * @param _salt 32 byte salt value mixed into the hash.\\n * @return _address Address to be generated by CREATE2.\\n */\\n function getAddressForCREATE2(\\n address _creator,\\n bytes memory _bytecode,\\n bytes32 _salt\\n )\\n internal\\n pure\\n returns (address _address)\\n {\\n bytes32 hashedData = keccak256(abi.encodePacked(\\n byte(0xff),\\n _creator,\\n _salt,\\n keccak256(_bytecode)\\n ));\\n\\n return Lib_Bytes32Utils.toAddress(hashedData);\\n }\\n}\\n\",\"keccak256\":\"0x5fdf009da11f90cb5e99e5cd160d07bb744a5a2055774a646bdf277ad6910595\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_ErrorUtils } from \\\"../utils/Lib_ErrorUtils.sol\\\";\\n\\n/**\\n * @title Lib_SafeExecutionManagerWrapper\\n * @dev The Safe Execution Manager Wrapper provides functions which facilitate writing OVM safe \\n * code using the standard solidity compiler, by routing all its operations through the Execution \\n * Manager.\\n * \\n * Compiler used: solc\\n * Runtime target: OVM\\n */\\nlibrary Lib_SafeExecutionManagerWrapper {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Performs a safe ovmCALL.\\n * @param _gasLimit Gas limit for the call.\\n * @param _target Address to call.\\n * @param _calldata Data to send to the call.\\n * @return _success Whether or not the call reverted.\\n * @return _returndata Data returned by the call.\\n */\\n function safeCALL(\\n uint256 _gasLimit,\\n address _target,\\n bytes memory _calldata\\n )\\n internal\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCALL(uint256,address,bytes)\\\",\\n _gasLimit,\\n _target,\\n _calldata\\n )\\n );\\n\\n return abi.decode(returndata, (bool, bytes));\\n }\\n\\n /**\\n * Performs a safe ovmDELEGATECALL.\\n * @param _gasLimit Gas limit for the call.\\n * @param _target Address to call.\\n * @param _calldata Data to send to the call.\\n * @return _success Whether or not the call reverted.\\n * @return _returndata Data returned by the call.\\n */\\n function safeDELEGATECALL(\\n uint256 _gasLimit,\\n address _target,\\n bytes memory _calldata\\n )\\n internal\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmDELEGATECALL(uint256,address,bytes)\\\",\\n _gasLimit,\\n _target,\\n _calldata\\n )\\n );\\n\\n return abi.decode(returndata, (bool, bytes));\\n }\\n\\n /**\\n * Performs a safe ovmCREATE call.\\n * @param _gasLimit Gas limit for the creation.\\n * @param _bytecode Code for the new contract.\\n * @return _contract Address of the created contract.\\n */\\n function safeCREATE(\\n uint256 _gasLimit,\\n bytes memory _bytecode\\n )\\n internal\\n returns (\\n address,\\n bytes memory\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n _gasLimit,\\n abi.encodeWithSignature(\\n \\\"ovmCREATE(bytes)\\\",\\n _bytecode\\n )\\n );\\n\\n return abi.decode(returndata, (address, bytes));\\n }\\n\\n /**\\n * Performs a safe ovmEXTCODESIZE call.\\n * @param _contract Address of the contract to query the size of.\\n * @return _EXTCODESIZE Size of the requested contract in bytes.\\n */\\n function safeEXTCODESIZE(\\n address _contract\\n )\\n internal\\n returns (\\n uint256 _EXTCODESIZE\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmEXTCODESIZE(address)\\\",\\n _contract\\n )\\n );\\n\\n return abi.decode(returndata, (uint256));\\n }\\n\\n /**\\n * Performs a safe ovmCHAINID call.\\n * @return _CHAINID Result of calling ovmCHAINID.\\n */\\n function safeCHAINID()\\n internal\\n returns (\\n uint256 _CHAINID\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCHAINID()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (uint256));\\n }\\n\\n /**\\n * Performs a safe ovmCALLER call.\\n * @return _CALLER Result of calling ovmCALLER.\\n */\\n function safeCALLER()\\n internal\\n returns (\\n address _CALLER\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCALLER()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (address));\\n }\\n\\n /**\\n * Performs a safe ovmADDRESS call.\\n * @return _ADDRESS Result of calling ovmADDRESS.\\n */\\n function safeADDRESS()\\n internal\\n returns (\\n address _ADDRESS\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmADDRESS()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (address));\\n }\\n\\n /**\\n * Performs a safe ovmGETNONCE call.\\n * @return _nonce Result of calling ovmGETNONCE.\\n */\\n function safeGETNONCE()\\n internal\\n returns (\\n uint256 _nonce\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmGETNONCE()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (uint256));\\n }\\n\\n /**\\n * Performs a safe ovmINCREMENTNONCE call.\\n */\\n function safeINCREMENTNONCE()\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmINCREMENTNONCE()\\\"\\n )\\n );\\n }\\n\\n /**\\n * Performs a safe ovmCREATEEOA call.\\n * @param _messageHash Message hash which was signed by EOA\\n * @param _v v value of signature (0 or 1)\\n * @param _r r value of signature\\n * @param _s s value of signature\\n */\\n function safeCREATEEOA(\\n bytes32 _messageHash,\\n uint8 _v,\\n bytes32 _r,\\n bytes32 _s\\n )\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCREATEEOA(bytes32,uint8,bytes32,bytes32)\\\",\\n _messageHash,\\n _v,\\n _r,\\n _s\\n )\\n );\\n }\\n\\n /**\\n * Performs a safe REVERT.\\n * @param _reason String revert reason to pass along with the REVERT.\\n */\\n function safeREVERT(\\n string memory _reason\\n )\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmREVERT(bytes)\\\",\\n Lib_ErrorUtils.encodeRevertString(\\n _reason\\n )\\n )\\n );\\n }\\n\\n /**\\n * Performs a safe \\\"require\\\".\\n * @param _condition Boolean condition that must be true or will revert.\\n * @param _reason String revert reason to pass along with the REVERT.\\n */\\n function safeREQUIRE(\\n bool _condition,\\n string memory _reason\\n )\\n internal\\n {\\n if (!_condition) {\\n safeREVERT(\\n _reason\\n );\\n }\\n }\\n\\n /**\\n * Performs a safe ovmSLOAD call.\\n */\\n function safeSLOAD(\\n bytes32 _key\\n )\\n internal\\n returns (\\n bytes32\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmSLOAD(bytes32)\\\",\\n _key\\n )\\n );\\n\\n return abi.decode(returndata, (bytes32));\\n }\\n\\n /**\\n * Performs a safe ovmSSTORE call.\\n */\\n function safeSSTORE(\\n bytes32 _key,\\n bytes32 _value\\n )\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmSSTORE(bytes32,bytes32)\\\",\\n _key,\\n _value\\n )\\n );\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Performs an ovm interaction and the necessary safety checks.\\n * @param _gasLimit Gas limit for the interaction.\\n * @param _calldata Data to send to the OVM_ExecutionManager (encoded with sighash).\\n * @return _returndata Data sent back by the OVM_ExecutionManager.\\n */\\n function _safeExecutionManagerInteraction(\\n uint256 _gasLimit,\\n bytes memory _calldata\\n )\\n private\\n returns (\\n bytes memory _returndata\\n )\\n {\\n address ovmExecutionManager = msg.sender;\\n (\\n bool success,\\n bytes memory returndata\\n ) = ovmExecutionManager.call{gas: _gasLimit}(_calldata);\\n\\n if (success == false) {\\n assembly {\\n revert(add(returndata, 0x20), mload(returndata))\\n }\\n } else if (returndata.length == 1) {\\n assembly {\\n return(0, 1)\\n }\\n } else {\\n return returndata;\\n }\\n }\\n\\n function _safeExecutionManagerInteraction(\\n bytes memory _calldata\\n )\\n private\\n returns (\\n bytes memory _returndata\\n )\\n {\\n return _safeExecutionManagerInteraction(\\n gasleft(),\\n _calldata\\n );\\n }\\n}\\n\",\"keccak256\":\"0x41e146e7912af794a17cd43c5a276674be956bfa8f3ca5b451bcb82d81e6f492\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x608060405234801561001057600080fd5b5060405161491d38038061491d8339818101604052602081101561003357600080fd5b5051600080546001600160a01b039092166001600160a01b03199092169190911790556148b8806100656000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c806322d1470214610046578063299ca4781461009a578063461a4478146100a2575b600080fd5b61007e6004803603608081101561005c57600080fd5b506001600160a01b038135169060208101359060408101359060600135610148565b604080516001600160a01b039092168252519081900360200190f35b61007e610229565b61007e600480360360208110156100b857600080fd5b8101906020810181356401000000008111156100d357600080fd5b8201836020820111156100e557600080fd5b8035906020019184600183028401116401000000008311171561010757600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610238945050505050565b600061017c6040518060400160405280601181526020017027ab26afa33930bab22b32b934b334b2b960791b815250610238565b6001600160a01b0316336001600160a01b0316146101cb5760405162461bcd60e51b81526004018080602001828103825260318152602001806148526031913960400191505060405180910390fd5b848484846040516101db90610314565b80856001600160a01b03168152602001848152602001838152602001828152602001945050505050604051809103906000f08015801561021f573d6000803e3d6000fd5b5095945050505050565b6000546001600160a01b031681565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b83811015610298578181015183820152602001610280565b50505050905090810190601f1680156102c55780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b1580156102e257600080fd5b505afa1580156102f6573d6000803e3d6000fd5b505050506040513d602081101561030c57600080fd5b505192915050565b614530806103228339019056fe60806040523480156200001157600080fd5b506040516200453038038062004530833981016040819052620000349162000232565b600080546001600160a01b0319166001600160a01b038616179055600583905560028290556003829055600681905560408051808201909152601781527f4f564d5f53746174654d616e61676572466163746f72790000000000000000006020820152620000a29062000150565b6001600160a01b0316639ed93318306040518263ffffffff1660e01b8152600401620000cf919062000299565b602060405180830381600087803b158015620000ea57600080fd5b505af1158015620000ff573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000125919062000273565b600180546001600160a01b0319166001600160a01b039290921691909117905550620002c692505050565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b83811015620001b257818101518382015260200162000198565b50505050905090810190601f168015620001e05780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b158015620001fe57600080fd5b505afa15801562000213573d6000803e3d6000fd5b505050506040513d60208110156200022a57600080fd5b505192915050565b6000806000806080858703121562000248578384fd5b84516200025581620002ad565b60208601516040870151606090970151919890975090945092505050565b60006020828403121562000285578081fd5b81516200029281620002ad565b9392505050565b6001600160a01b0391909116815260200190565b6001600160a01b0381168114620002c357600080fd5b50565b61425a80620002d66000396000f3fe608060405234801561001057600080fd5b50600436106100cf5760003560e01c8063845fe7a31161008c578063b2fa1c9e11610066578063b2fa1c9e14610185578063b52805711461019a578063b9194310146101a2578063c1c618b8146101b5576100cf565b8063845fe7a314610155578063a244316a14610168578063b1c9fe6e14610170576100cf565b8063299ca478146100d45780632e1ac36c146100f25780632eb1375814610107578063461a44781461011a578063732f960b1461012d578063805e9d3014610140575b600080fd5b6100dc6101bd565b6040516100e99190613bf9565b60405180910390f35b6101056101003660046138be565b6101cc565b005b6101056101153660046138fe565b610565565b6100dc61012836600461397d565b6108a1565b61010561013b366004613a41565b61097f565b610148610c4a565b6040516100e99190613b52565b6101056101633660046138be565b610c50565b610105610f7c565b610178611103565b6040516100e99190613cab565b61018d61110c565b6040516100e99190613ca0565b6100dc611127565b6101056101b036600461385f565b611136565b610148611450565b6000546001600160a01b031681565b60018060045460ff1660028111156101e057fe5b146102065760405162461bcd60e51b81526004016101fd90613ffc565b60405180910390fd5b60025460065460005a6001546040516363b285f960e11b81529192506001600160a01b03169063c7650bf290610242908a908a90600401613c0d565b602060405180830381600087803b15801561025c57600080fd5b505af1158015610270573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610294919061394b565b15156001146102b55760405162461bcd60e51b81526004016101fd90613da7565b60015460405163fbcbc0f160e01b81526000916001600160a01b03169063fbcbc0f1906102e6908b90600401613bf9565b60c06040518083038186803b1580156102fe57600080fd5b505afa158015610312573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061033691906139c2565b600154604051631aaf392f60e01b81529192506000916001600160a01b0390911690631aaf392f9061036e908c908c90600401613c0d565b60206040518083038186803b15801561038657600080fd5b505afa15801561039a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103be9190613965565b90506103ff886040516020016103d49190613b52565b6040516020818303038152906040526103f46103ef84611456565b61149f565b898560400151611509565b6040808401919091526001549051638f3b964760e01b81526001600160a01b0390911690638f3b964790610439908c908690600401613c47565b600060405180830381600087803b15801561045357600080fd5b505af1158015610467573d6000803e3d6000fd5b505050507f3e3ed1a676a2754a041b49bf752e0f167c8753495e36c320fe01d1ef7476253c898960405161049c929190613c0d565b60405180910390a1505060005a820390506104dd6040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506108a1565b6001600160a01b0316631e16e92f858533856040518563ffffffff1660e01b815260040180858152602001848152602001836001600160a01b03168152602001828152602001945050505050600060405180830381600087803b15801561054357600080fd5b505af1158015610557573d6000803e3d6000fd5b505050505050505050505050565b60018060045460ff16600281111561057957fe5b146105965760405162461bcd60e51b81526004016101fd90613ffc565b60025460065460005a9050600160009054906101000a90046001600160a01b03166001600160a01b03166399056ba96040518163ffffffff1660e01b815260040160206040518083038186803b1580156105ef57600080fd5b505afa158015610603573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106279190613965565b156106445760405162461bcd60e51b81526004016101fd90613e88565b600154604051630b38106960e11b81526001600160a01b039091169063167020d290610674908990600401613bf9565b602060405180830381600087803b15801561068e57600080fd5b505af11580156106a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106c6919061394b565b15156001146106e75760405162461bcd60e51b81526004016101fd90613f42565b60015460405163fbcbc0f160e01b81526000916001600160a01b03169063fbcbc0f190610718908a90600401613bf9565b60c06040518083038186803b15801561073057600080fd5b505afa158015610744573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061076891906139c2565b90506107a78760405160200161077e9190613b35565b60405160208183030381529060405261079e6107998461152f565b61156f565b88600354611509565b6003556040517fcec9ef675d775706a02b43afe48af52c5019bc50f99582e3208c6ff55d59c008906107da908990613bf9565b60405180910390a15060005a8203905061081a6040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506108a1565b6001600160a01b0316631e16e92f858533856040518563ffffffff1660e01b815260040180858152602001848152602001836001600160a01b03168152602001828152602001945050505050600060405180830381600087803b15801561088057600080fd5b505af1158015610894573d6000803e3d6000fd5b5050505050505050505050565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b838110156109015781810151838201526020016108e9565b50505050905090810190601f16801561092e5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561094b57600080fd5b505afa15801561095f573d6000803e3d6000fd5b505050506040513d602081101561097557600080fd5b505190505b919050565b60008060045460ff16600281111561099357fe5b146109b05760405162461bcd60e51b81526004016101fd90613ffc565b60025460065460005a90506006546109c786611678565b146109e45760405162461bcd60e51b81526004016101fd9061404d565b6103e88560a0015161040802816109f757fe5b04620186a0015a1015610a1c5760405162461bcd60e51b81526004016101fd90613ee5565b6000610a536040518060400160405280601481526020017327ab26afa2bc32b1baba34b7b726b0b730b3b2b960611b8152506108a1565b600154604051631381ba4d60e01b81529192506001600160a01b031690631381ba4d90610a84908490600401613bf9565b600060405180830381600087803b158015610a9e57600080fd5b505af1158015610ab2573d6000803e3d6000fd5b5050600154604051639be3ad6760e01b81526001600160a01b038086169450639be3ad679350610ae9928b929116906004016140e1565b600060405180830381600087803b158015610b0357600080fd5b505af1158015610b17573d6000803e3d6000fd5b5050600154604051631381ba4d60e01b81526001600160a01b039091169250631381ba4d9150610b4c90600090600401613bf9565b600060405180830381600087803b158015610b6657600080fd5b505af1158015610b7a573d6000803e3d6000fd5b50506004805460ff191660011790555060009150505a82039050610bc46040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506108a1565b6001600160a01b0316631e16e92f858533856040518563ffffffff1660e01b815260040180858152602001848152602001836001600160a01b03168152602001828152602001945050505050600060405180830381600087803b158015610c2a57600080fd5b505af1158015610c3e573d6000803e3d6000fd5b50505050505050505050565b60025490565b60008060045460ff166002811115610c6457fe5b14610c815760405162461bcd60e51b81526004016101fd90613ffc565b60025460065460005a600154604051630ad2267960e01b81529192506001600160a01b031690630ad2267990610cbd908a908a90600401613c0d565b60206040518083038186803b158015610cd557600080fd5b505afa158015610ce9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d0d919061394b565b15610d2a5760405162461bcd60e51b81526004016101fd90613cbf565b60015460405163c8e40fbf60e01b81526001600160a01b039091169063c8e40fbf90610d5a908a90600401613bf9565b60206040518083038186803b158015610d7257600080fd5b505afa158015610d86573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610daa919061394b565b1515600114610dcb5760405162461bcd60e51b81526004016101fd90614084565b60015460405163136e2d8960e11b81526000916001600160a01b0316906326dc5b1290610dfc908b90600401613bf9565b60206040518083038186803b158015610e1457600080fd5b505afa158015610e28573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e4c9190613965565b905060007f56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421821415610e8057506000610edd565b600080610ead8a604051602001610e979190613b52565b6040516020818303038152906040528a86611691565b909250905060018215151415610ed557610ece610ec9826116ba565b6116cd565b9250610eda565b600092505b50505b600154604051635c17d62960e01b81526001600160a01b0390911690635c17d62990610f11908c908c908690600401613c26565b600060405180830381600087803b158015610f2b57600080fd5b505af1158015610f3f573d6000803e3d6000fd5b50505050505060005a820390506104dd6040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506108a1565b60018060045460ff166002811115610f9057fe5b14610fad5760405162461bcd60e51b81526004016101fd90613ffc565b600160009054906101000a90046001600160a01b03166001600160a01b031663d7bd4a2a6040518163ffffffff1660e01b815260040160206040518083038186803b158015610ffb57600080fd5b505afa15801561100f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110339190613965565b156110505760405162461bcd60e51b81526004016101fd90613d4a565b600160009054906101000a90046001600160a01b03166001600160a01b03166399056ba96040518163ffffffff1660e01b815260040160206040518083038186803b15801561109e57600080fd5b505afa1580156110b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110d69190613965565b156110f35760405162461bcd60e51b81526004016101fd90613f9f565b506004805460ff19166002179055565b60045460ff1681565b6000600260045460ff16600281111561112157fe5b14905090565b6001546001600160a01b031681565b60008060045460ff16600281111561114a57fe5b146111675760405162461bcd60e51b81526004016101fd90613ffc565b60025460065460005a60015460405163c8e40fbf60e01b81529192506001600160a01b03169063c8e40fbf906111a1908a90600401613bf9565b60206040518083038186803b1580156111b957600080fd5b505afa1580156111cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111f1919061394b565b15801561127b57506001546040516307a1294560e01b81526001600160a01b03909116906307a1294590611229908a90600401613bf9565b60206040518083038186803b15801561124157600080fd5b505afa158015611255573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611279919061394b565b155b6112975760405162461bcd60e51b81526004016101fd90613d04565b6000806112c6896040516020016112ae9190613b35565b60405160208183030381529060405288600254611691565b9092509050600182151514156113e75760006112e1826116fc565b606081015190915089907fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470141561131a57506000611345565b81606001516113288261178e565b146113455760405162461bcd60e51b81526004016101fd90613e05565b6001546040805160c08101825284518152602080860151908201528482015181830152606080860151908201526001600160a01b038481166080830152600060a08301529151638f3b964760e01b81529190921691638f3b9647916113ae918f91600401613c47565b600060405180830381600087803b1580156113c857600080fd5b505af11580156113dc573d6000803e3d6000fd5b505050505050611417565b600154604051630d631c9d60e31b81526001600160a01b0390911690636b18e4e890610f11908c90600401613bf9565b505060005a820390506104dd6040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506108a1565b60035490565b6060806000805b6020811085821a151615611477576001918201910161145d565b5060405191506040820160405283600882021b60208301528060200382525080915050919050565b606080825160011480156114c757506080836000815181106114bd57fe5b016020015160f81c105b156114d3575081611503565b6114df83516080611792565b836040516020016114f1929190613b5b565b60405160208183030381529060405290505b92915050565b600080611515866118e1565b905061152381868686611911565b9150505b949350505050565b61153761376a565b604051806080016040528083600001518152602001836020015181526020018360400151815260200183606001518152509050919050565b60408051600480825260a0820190925260609160009190816020015b606081526020019060019003908161158b57505083519091506115b1906103ef90611456565b816000815181106115be57fe5b60200260200101819052506115dc6103ef846020015160001b611456565b816001815181106115e957fe5b6020026020010181905250611620836040015160405160200161160c9190613b52565b60405160208183030381529060405261149f565b8160028151811061162d57fe5b6020026020010181905250611650836060015160405160200161160c9190613b52565b8160038151811061165d57fe5b6020026020010181905250611671816119ac565b9392505050565b6000611683826119f0565b805190602001209050919050565b6000606060006116a0866118e1565b90506116ad818686611a2b565b9250925050935093915050565b60606115036116c883611afe565b611b23565b60008060006020845111156116e35760206116e6565b83515b6020858101519190036008021c92505050919050565b61170461376a565b600061170f83611bb2565b905060405180608001604052806117398360008151811061172c57fe5b6020026020010151611bc5565b815260200161174e8360018151811061172c57fe5b81526020016117708360028151811061176357fe5b6020026020010151611bcc565b81526020016117858360038151811061176357fe5b90529392505050565b3f90565b60608060388410156117ec576040805160018082528183019092529060208201818036833701905050905082840160f81b816000815181106117d057fe5b60200101906001600160f81b031916908160001a905350611671565b600060015b8086816117fa57fe5b041561180f57600190910190610100026117f1565b816001016001600160401b038111801561182857600080fd5b506040519080825280601f01601f191660200182016040528015611853576020820181803683370190505b50925084820160370160f81b8360008151811061186c57fe5b60200101906001600160f81b031916908160001a905350600190505b8181116118d8576101008183036101000a87816118a157fe5b04816118a957fe5b0660f81b8382815181106118b957fe5b60200101906001600160f81b031916908160001a905350600101611888565b50509392505050565b606081805190602001206040516020016118fb9190613b52565b6040516020818303038152906040529050919050565b6040805180820190915260018152600160ff1b60209091015260007f56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b4218214156119655761195e8585611cc6565b9050611527565b600061197084611cea565b9050600080611980838987611dc0565b509150915060006119938484848b612163565b905061199f818a61247b565b9998505050505050505050565b606060006119b9836125d4565b90506119c7815160c0611792565b816040516020016119d9929190613b5b565b604051602081830303815290604052915050919050565b6060816000015182602001518360400151846060015185608001518660a001518760c001516040516020016118fb9796959493929190613b8a565b600060606000611a3a85611cea565b90506000806000611a4c848a89611dc0565b81519295509093509150158080611a605750815b611ab1576040805162461bcd60e51b815260206004820152601a60248201527f50726f76696465642070726f6f6620697320696e76616c69642e000000000000604482015290519081900360640190fd5b600081611acd5760405180602001604052806000815250611aec565b611aec866001870381518110611adf57fe5b60200260200101516126dd565b919b919a509098505050505050505050565b611b06613791565b506040805180820190915281518152602082810190820152919050565b60606000806000611b33856126f9565b919450925090506000816001811115611b4857fe5b14611b9a576040805162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c502062797465732076616c75652e0000000000000000604482015290519081900360640190fd5b611ba985602001518484612a22565b95945050505050565b6060611503611bc083611afe565b612acf565b6000611503825b6000602182600001511115611c28576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e000000000000604482015290519081900360640190fd5b6000806000611c36856126f9565b919450925090506000816001811115611c4b57fe5b14611c9d576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e000000000000604482015290519081900360640190fd5b602080860151840180519091841015611cbc5760208490036101000a90045b9695505050505050565b6000611cda611cd484612c45565b83612d41565b5180516020909101209392505050565b60606000611cf783611bb2565b9050600081516001600160401b0381118015611d1257600080fd5b50604051908082528060200260200182016040528015611d4c57816020015b611d396137ab565b815260200190600190039081611d315790505b50905060005b8251811015611db8576000611d79848381518110611d6c57fe5b6020026020010151611b23565b90506040518060400160405280828152602001611d9583611bb2565b815250838381518110611da457fe5b602090810291909101015250600101611d52565b509392505050565b60006060818080611dd087612c45565b905085600080611dde6137ab565b60005b8c5181101561213b578c8181518110611df657fe5b6020026020010151915082840193506001870196508360001415611e6a57815180516020909101208514611e65576040805162461bcd60e51b8152602060048201526011602482015270092dcecc2d8d2c840e4dedee840d0c2e6d607b1b604482015290519081900360640190fd5b611f31565b815151602011611ed157815180516020909101208514611e65576040805162461bcd60e51b815260206004820152601b60248201527f496e76616c6964206c6172676520696e7465726e616c20686173680000000000604482015290519081900360640190fd5b84611edf8360000151612dd5565b14611f31576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420696e7465726e616c206e6f64652068617368000000000000604482015290519081900360640190fd5b60208201515160111415611fa0578551841415611f4d5761213b565b6000868581518110611f5b57fe5b602001015160f81c60f81b60f81c9050600083602001518260ff1681518110611f8057fe5b60200260200101519050611f9381612e01565b9650600194505050612133565b600282602001515114156120e6576000611fb983612e37565b9050600081600081518110611fca57fe5b016020015160f81c9050600181166002036000611fea8460ff8416612e55565b90506000611ff88b8a612e55565b905060006120068383612e86565b905060ff85166002148061201d575060ff85166003145b1561204f578083511480156120325750808251145b1561203c57988901985b50600160ff1b995061213b945050505050565b60ff85161580612062575060ff85166001145b156120af578061207f5750600160ff1b995061213b945050505050565b6120a0886020015160018151811061209357fe5b6020026020010151612e01565b9a509750612133945050505050565b60405162461bcd60e51b81526004018080602001828103825260268152602001806141ff6026913960400191505060405180910390fd5b6040805162461bcd60e51b815260206004820152601d60248201527f526563656976656420616e20756e706172736561626c65206e6f64652e000000604482015290519081900360640190fd5b600101611de1565b50600160ff1b84148661214e8786612e55565b909e909d50909b509950505050505050505050565b60606000839050600086600187038151811061217b57fe5b60200260200101519050600061219082612eec565b6040805160038082526080820190925291925060009190816020015b6121b46137ab565b8152602001906001900390816121ac5790505090506000845160001480156121e7575060028360028111156121e557fe5b145b1561221d576121fe6121f885612fc2565b88612d41565b82828151811061220a57fe5b602090810291909101015260010161245e565b600083600281111561222b57fe5b1415612291578451612260576122418488612fd5565b82828151811061224d57fe5b602090810291909101015260010161228c565b8382828151811061226d57fe5b60200260200101819052506001810190506121fe6121f8866001612e55565b61245e565b600061229c85612fc2565b905060006122aa8288612e86565b9050801561230b5760006122c083600084613020565b90506122d4816122cf8c613170565b6131b1565b8585815181106122e057fe5b60200260200101819052506001840193506122fb8383612e55565b92506123078883612e55565b9750505b60006123156131f5565b905082516000141561233a576123338161232e896126dd565b612fd5565b90506123d2565b60008360008151811061234957fe5b016020015160f81c905061235e846001612e55565b9350600287600281111561236e57fe5b14156123a9576000612388856123838b6126dd565b612d41565b90506123a1838361239c8460000151613170565b613282565b9250506123d0565b8351156123bf576000612388856122cf8b6126dd565b6123cd828261239c8b6126dd565b91505b505b8751612407576123e2818b612fd5565b9050808585815181106123f157fe5b602002602001018190525060018401935061245a565b612412886001612e55565b97508085858151811061242157fe5b602002602001018190525060018401935061243c888b612d41565b85858151811061244857fe5b60200260200101819052506001840193505b5050505b61246d8a60018b0384846132db565b9a9950505050505050505050565b60008061248783612c45565b90506124916137ab565b84516000906060905b80156125bf578760018203815181106124af57fe5b602002602001015193506124c284612eec565b925060028360028111156124d257fe5b14156124fd5760006124e385612fc2565b90506124f58660008351895103613020565b9550506125a9565b600183600281111561250b57fe5b141561254b57600061251c85612fc2565b905061252e8660008351895103613020565b8351909650156125455761254281846131b1565b94505b506125a9565b600083600281111561255957fe5b14156125a9578151156125a95760008560018751038151811061257857fe5b602001015160f81c60f81b60f81c90506125988660006001895103613020565b95506125a5858285613282565b9450505b83516125b490613170565b91506000190161249a565b50509051805160209091012095945050505050565b60608151600014156125f5575060408051600081526020810190915261097a565b6000805b83518110156126285783818151811061260e57fe5b6020026020010151518201915080806001019150506125f9565b6000826001600160401b038111801561264057600080fd5b506040519080825280601f01601f19166020018201604052801561266b576020820181803683370190505b50600092509050602081015b85518310156126d457600086848151811061268e57fe5b6020026020010151905060006020820190506126ac838284516133bd565b8785815181106126b857fe5b6020026020010151518301925050508280600101935050612677565b50949350505050565b60208101518051606091611503916000198101908110611d6c57fe5b600080600080846000015111612756576040805162461bcd60e51b815260206004820152601860248201527f524c50206974656d2063616e6e6f74206265206e756c6c2e0000000000000000604482015290519081900360640190fd5b6020840151805160001a607f811161277b576000600160009450945094505050612a1b565b60b781116127f0578551607f1982019081106127de576040805162461bcd60e51b815260206004820152601960248201527f496e76616c696420524c502073686f727420737472696e672e00000000000000604482015290519081900360640190fd5b60019550935060009250612a1b915050565b60bf81116128d457855160b6198201908110612853576040805162461bcd60e51b815260206004820152601f60248201527f496e76616c696420524c50206c6f6e6720737472696e67206c656e6774682e00604482015290519081900360640190fd5b6000816020036101000a60018501510490508082018860000151116128bf576040805162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c50206c6f6e6720737472696e672e0000000000000000604482015290519081900360640190fd5b60019091019550935060009250612a1b915050565b60f7811161294857855160bf198201908110612937576040805162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c502073686f7274206c6973742e000000000000000000604482015290519081900360640190fd5b600195509350849250612a1b915050565b855160f61982019081106129a3576040805162461bcd60e51b815260206004820152601d60248201527f496e76616c696420524c50206c6f6e67206c697374206c656e6774682e000000604482015290519081900360640190fd5b6000816020036101000a6001850151049050808201886000015111612a08576040805162461bcd60e51b815260206004820152601660248201527524b73b30b634b210292628103637b733903634b9ba1760511b604482015290519081900360640190fd5b6001918201965094509250612a1b915050565b9193909250565b60606000826001600160401b0381118015612a3c57600080fd5b506040519080825280601f01601f191660200182016040528015612a67576020820181803683370190505b509050805160001415612a7b579050611671565b8484016020820160005b60208604811015612aa6578251825260209283019290910190600101612a85565b5080519151601f959095166020036101000a600019019182169119909416179092525092915050565b6060600080612add846126f9565b91935090915060019050816001811115612af357fe5b14612b45576040805162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c50206c6973742076616c75652e000000000000000000604482015290519081900360640190fd5b6040805160208082526104208201909252600091816020015b612b66613791565b815260200190600190039081612b5e5790505090506000835b8651811015612c3a5760208210612bc75760405162461bcd60e51b815260040180806020018281038252602a8152602001806141d5602a913960400191505060405180910390fd5b600080612bf36040518060400160405280858c60000151038152602001858c60200151018152506126f9565b509150915060405180604001604052808383018152602001848b6020015101815250858581518110612c2157fe5b6020908102919091010152600193909301920101612b7f565b508152949350505050565b6060600082516002026001600160401b0381118015612c6357600080fd5b506040519080825280601f01601f191660200182016040528015612c8e576020820181803683370190505b50905060005b8351811015612d3a576004848281518110612cab57fe5b602001015160f81c60f81b6001600160f81b031916901c828260020281518110612cd157fe5b60200101906001600160f81b031916908160001a9053506010848281518110612cf657fe5b016020015160f81c81612d0557fe5b0660f81b828260020260010181518110612d1b57fe5b60200101906001600160f81b031916908160001a905350600101612c94565b5092915050565b612d496137ab565b60408051600280825260608201909252600091816020015b6060815260200190600190039081612d615790505090506000612d85856001613401565b9050612d936103ef82613558565b82600081518110612da057fe5b6020026020010181905250612db48461149f565b82600181518110612dc157fe5b6020026020010181905250611ba982613628565b6000602082511015612dec5750602081015161097a565b81806020019051602081101561097557600080fd5b60006060602083600001511015612e2257612e1b83613657565b9050612e2e565b612e2b83611b23565b90505b61167181612dd5565b6060611503612e508360200151600081518110611d6c57fe5b612c45565b60608183510360001415612e785750604080516020810190915260008152611503565b611671838384865103613020565b6000805b808451118015612e9a5750808351115b8015612edf5750828181518110612ead57fe5b602001015160f81c60f81b6001600160f81b031916848281518110612ece57fe5b01602001516001600160f81b031916145b1561167157600101612e8a565b60208101515160009060111415612f055750600061097a565b60028260200151511415612f81576000612f1e83612e37565b9050600081600081518110612f2f57fe5b016020015160f81c90506002811480612f4b575060ff81166003145b15612f5b5760029250505061097a565b60ff81161580612f6e575060ff81166001145b15612f7e5760019250505061097a565b50505b6040805162461bcd60e51b8152602060048201526011602482015270496e76616c6964206e6f6465207479706560781b604482015290519081900360640190fd5b6060611503612fd083612e37565b613662565b612fdd6137ab565b6000612fe88361149f565b9050612ff381611afe565b60208501518051600019810190811061300857fe5b602002602001018190525061152784602001516136ab565b60608182601f01101561306b576040805162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b604482015290519081900360640190fd5b8282840110156130b3576040805162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b604482015290519081900360640190fd5b818301845110156130ff576040805162461bcd60e51b8152602060048201526011602482015270736c6963655f6f75744f66426f756e647360781b604482015290519081900360640190fd5b60608215801561311e57604051915060008252602082016040526126d4565b6040519150601f8416801560200281840101858101878315602002848b0101015b8183101561315757805183526020928301920161313f565b5050858452601f01601f19166040525050949350505050565b606060208251101561318357508061097a565b818051906020012060405160200180828152602001915050604051602081830303815290604052905061097a565b6131b96137ab565b60408051600280825260608201909252600091816020015b60608152602001906001900390816131d15790505090506000612d85856000613401565b6131fd6137ab565b6040805160118082526102408201909252600091816020015b606081526020019060019003908161321657905050905060005b815181101561327257604051806040016040528060018152602001600160ff1b81525082828151811061325f57fe5b6020908102919091010152600101613230565b5061327c81613628565b91505090565b61328a6137ab565b600060208351106132a35761329e8361149f565b6132a5565b825b90506132b081611afe565b85602001518560ff16815181106132c357fe5b6020026020010181905250611ba985602001516136ab565b606060008285016001600160401b03811180156132f757600080fd5b5060405190808252806020026020018201604052801561333157816020015b61331e6137ab565b8152602001906001900390816133165790505b50905060005b858110156133725786818151811061334b57fe5b602002602001015182828151811061335f57fe5b6020908102919091010152600101613337565b5060005b838110156133b35784818151811061338a57fe5b602002602001015182878301815181106133a057fe5b6020908102919091010152600101613376565b5095945050505050565b8282825b602081106133e0578151835260209283019290910190601f19016133c1565b905182516020929092036101000a6000190180199091169116179052505050565b6060600082613411576000613414565b60025b90506000600285518161342357fe5b06905060008160020360ff166001600160401b038111801561344457600080fd5b506040519080825280601f01601f19166020018201604052801561346f576020820181803683370190505b50905081830160f81b8160008151811061348557fe5b60200101906001600160f81b031916908160001a90535080866040516020018083805190602001908083835b602083106134d05780518252601f1990920191602091820191016134b1565b51815160209384036101000a600019018019909216911617905285519190930192850191508083835b602083106135185780518252601f1990920191602091820191016134f9565b6001836020036101000a03801982511681845116808217855250505050505090500192505050604051602081830303815290604052935050505092915050565b60606000600283518161356757fe5b046001600160401b038111801561357d57600080fd5b506040519080825280601f01601f1916602001820160405280156135a8576020820181803683370190505b50905060005b8151811015612d3a578381600202600101815181106135c957fe5b602001015160f81c60f81b60048583600202815181106135e557fe5b602001015160f81c60f81b6001600160f81b031916901b1782828151811061360957fe5b60200101906001600160f81b031916908160001a9053506001016135ae565b6136306137ab565b600061363b836119ac565b9050604051806040016040528082815260200161178583611bb2565b606061150382613754565b606060028260008151811061367357fe5b016020015160f81c8161368257fe5b0660ff16600014156136a057613699826002612e55565b905061097a565b613699826001612e55565b6136b36137ab565b600082516001600160401b03811180156136cc57600080fd5b5060405190808252806020026020018201604052801561370057816020015b60608152602001906001900390816136eb5790505b50905060005b835181101561374a5761372b84828151811061371e57fe5b6020026020010151613657565b82828151811061373757fe5b6020908102919091010152600101613706565b5061167181613628565b6060611503826020015160008460000151612a22565b60408051608081018252600080825260208201819052918101829052606081019190915290565b604051806040016040528060008152602001600081525090565b604051806040016040528060608152602001606081525090565b60006001600160401b038311156137d857fe5b6137eb601f8401601f1916602001614169565b90508281528383830111156137ff57600080fd5b828260208301376000602084830101529392505050565b803561097a816141bc565b8051801515811461097a57600080fd5b600082601f830112613841578081fd5b611671838335602085016137c5565b80356002811061097a57600080fd5b600080600060608486031215613873578283fd5b833561387e816141bc565b9250602084013561388e816141bc565b915060408401356001600160401b038111156138a8578182fd5b6138b486828701613831565b9150509250925092565b6000806000606084860312156138d2578283fd5b83356138dd816141bc565b92506020840135915060408401356001600160401b038111156138a8578182fd5b60008060408385031215613910578182fd5b823561391b816141bc565b915060208301356001600160401b03811115613935578182fd5b61394185828601613831565b9150509250929050565b60006020828403121561395c578081fd5b61167182613821565b600060208284031215613976578081fd5b5051919050565b60006020828403121561398e578081fd5b81356001600160401b038111156139a3578182fd5b8201601f810184136139b3578182fd5b611527848235602084016137c5565b600060c082840312156139d3578081fd5b60405160c081018181106001600160401b03821117156139ef57fe5b8060405250825181526020830151602082015260408301516040820152606083015160608201526080830151613a24816141bc565b6080820152613a3560a08401613821565b60a08201529392505050565b600060208284031215613a52578081fd5b81356001600160401b0380821115613a68578283fd5b9083019060e08286031215613a7b578283fd5b613a8560e0614169565b8235815260208301356020820152613a9f60408401613850565b6040820152613ab060608401613816565b6060820152613ac160808401613816565b608082015260a083013560a082015260c083013582811115613ae1578485fd5b613aed87828601613831565b60c08301525095945050505050565b6001600160a01b03169052565b60008151808452613b2181602086016020860161418c565b601f01601f19169290920160200192915050565b60609190911b6bffffffffffffffffffffffff1916815260140190565b90815260200190565b60008351613b6d81846020880161418c565b835190830190613b8181836020880161418c565b01949350505050565b600088825287602083015260028710613b9f57fe5b8660f81b60408301526bffffffffffffffffffffffff19808760601b166041840152808660601b166055840152508360698301528251613be681608985016020870161418c565b9190910160890198975050505050505050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039390931683526020830191909152604082015260600190565b600060e08201905060018060a01b038085168352835160208401526020840151604084015260408401516060840152606084015160808401528060808501511660a08401525060a0830151151560c08301529392505050565b901515815260200190565b6020810160038310613cb957fe5b91905290565b60208082526025908201527f53746f7261676520736c6f742068617320616c7265616479206265656e20707260408201526437bb32b71760d91b606082015260800190565b60208082526026908201527f4163636f756e742073746174652068617320616c7265616479206265656e20706040820152653937bb32b71760d11b606082015260800190565b6020808252603e908201527f416c6c206163636f756e7473206d75737420626520636f6d6d6974746564206260408201527f65666f726520636f6d706c6574696e672061207472616e736974696f6e2e0000606082015260800190565b602080825260409082018190527f53746f7261676520736c6f742076616c7565207761736e2774206368616e6765908201527f64206f722068617320616c7265616479206265656e20636f6d6d69747465642e606082015260800190565b6020808252605b908201527f4f564d5f53746174655472616e736974696f6e65723a2050726f76696465642060408201527f4c3120636f6e747261637420636f6465206861736820646f6573206e6f74206d60608201527f61746368204c3220636f6e747261637420636f646520686173682e0000000000608082015260a00190565b6020808252603f908201527f416c6c2073746f72616765206d75737420626520636f6d6d697474656420626560408201527f666f726520636f6d6d697474696e67206163636f756e74207374617465732e00606082015260800190565b60208082526038908201527f4e6f7420656e6f7567682067617320746f2065786563757465207472616e736160408201527f6374696f6e2064657465726d696e6973746963616c6c792e0000000000000000606082015260800190565b6020808252603b908201527f4163636f756e74207374617465207761736e2774206368616e676564206f722060408201527f68617320616c7265616479206265656e20636f6d6d69747465642e0000000000606082015260800190565b6020808252603d908201527f416c6c2073746f72616765206d75737420626520636f6d6d697474656420626560408201527f666f726520636f6d706c6574696e672061207472616e736974696f6e2e000000606082015260800190565b60208082526031908201527f46756e6374696f6e206d7573742062652063616c6c656420647572696e67207460408201527034329031b7b93932b1ba10383430b9b29760791b606082015260800190565b6020808252601d908201527f496e76616c6964207472616e73616374696f6e2070726f76696465642e000000604082015260600190565b60208082526038908201527f436f6e7472616374206d757374206265207665726966696564206265666f726560408201527f2070726f76696e6720612073746f7261676520736c6f742e0000000000000000606082015260800190565b600060408252835160408301526020840151606083015260408401516002811061410757fe5b60808381019190915260608501516001600160a01b031660a084015284015161413360c0840182613afc565b5060a084015160e083015260c084015160e0610100840152614159610120840182613b09565b9150506116716020830184613afc565b6040518181016001600160401b038111828210171561418457fe5b604052919050565b60005b838110156141a757818101518382015260200161418f565b838111156141b6576000848401525b50505050565b6001600160a01b03811681146141d157600080fd5b5056fe50726f766964656420524c50206c6973742065786365656473206d6178206c697374206c656e6774682e52656365697665642061206e6f6465207769746820616e20756e6b6e6f776e20707265666978a26469706673582212202ea403a24e5302242cc43b478b69dcfe008a1ab131eba5f1e506e3ceccf9c0da64736f6c634300070600334372656174652063616e206f6e6c7920626520646f6e6520627920746865204f564d5f467261756456657269666965722ea26469706673582212202fcbb6d0346de56d2d329d627d3c66381df840d9e199778d7938b3519fa8287464736f6c63430007060033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100415760003560e01c806322d1470214610046578063299ca4781461009a578063461a4478146100a2575b600080fd5b61007e6004803603608081101561005c57600080fd5b506001600160a01b038135169060208101359060408101359060600135610148565b604080516001600160a01b039092168252519081900360200190f35b61007e610229565b61007e600480360360208110156100b857600080fd5b8101906020810181356401000000008111156100d357600080fd5b8201836020820111156100e557600080fd5b8035906020019184600183028401116401000000008311171561010757600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610238945050505050565b600061017c6040518060400160405280601181526020017027ab26afa33930bab22b32b934b334b2b960791b815250610238565b6001600160a01b0316336001600160a01b0316146101cb5760405162461bcd60e51b81526004018080602001828103825260318152602001806148526031913960400191505060405180910390fd5b848484846040516101db90610314565b80856001600160a01b03168152602001848152602001838152602001828152602001945050505050604051809103906000f08015801561021f573d6000803e3d6000fd5b5095945050505050565b6000546001600160a01b031681565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b83811015610298578181015183820152602001610280565b50505050905090810190601f1680156102c55780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b1580156102e257600080fd5b505afa1580156102f6573d6000803e3d6000fd5b505050506040513d602081101561030c57600080fd5b505192915050565b614530806103228339019056fe60806040523480156200001157600080fd5b506040516200453038038062004530833981016040819052620000349162000232565b600080546001600160a01b0319166001600160a01b038616179055600583905560028290556003829055600681905560408051808201909152601781527f4f564d5f53746174654d616e61676572466163746f72790000000000000000006020820152620000a29062000150565b6001600160a01b0316639ed93318306040518263ffffffff1660e01b8152600401620000cf919062000299565b602060405180830381600087803b158015620000ea57600080fd5b505af1158015620000ff573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000125919062000273565b600180546001600160a01b0319166001600160a01b039290921691909117905550620002c692505050565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b83811015620001b257818101518382015260200162000198565b50505050905090810190601f168015620001e05780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b158015620001fe57600080fd5b505afa15801562000213573d6000803e3d6000fd5b505050506040513d60208110156200022a57600080fd5b505192915050565b6000806000806080858703121562000248578384fd5b84516200025581620002ad565b60208601516040870151606090970151919890975090945092505050565b60006020828403121562000285578081fd5b81516200029281620002ad565b9392505050565b6001600160a01b0391909116815260200190565b6001600160a01b0381168114620002c357600080fd5b50565b61425a80620002d66000396000f3fe608060405234801561001057600080fd5b50600436106100cf5760003560e01c8063845fe7a31161008c578063b2fa1c9e11610066578063b2fa1c9e14610185578063b52805711461019a578063b9194310146101a2578063c1c618b8146101b5576100cf565b8063845fe7a314610155578063a244316a14610168578063b1c9fe6e14610170576100cf565b8063299ca478146100d45780632e1ac36c146100f25780632eb1375814610107578063461a44781461011a578063732f960b1461012d578063805e9d3014610140575b600080fd5b6100dc6101bd565b6040516100e99190613bf9565b60405180910390f35b6101056101003660046138be565b6101cc565b005b6101056101153660046138fe565b610565565b6100dc61012836600461397d565b6108a1565b61010561013b366004613a41565b61097f565b610148610c4a565b6040516100e99190613b52565b6101056101633660046138be565b610c50565b610105610f7c565b610178611103565b6040516100e99190613cab565b61018d61110c565b6040516100e99190613ca0565b6100dc611127565b6101056101b036600461385f565b611136565b610148611450565b6000546001600160a01b031681565b60018060045460ff1660028111156101e057fe5b146102065760405162461bcd60e51b81526004016101fd90613ffc565b60405180910390fd5b60025460065460005a6001546040516363b285f960e11b81529192506001600160a01b03169063c7650bf290610242908a908a90600401613c0d565b602060405180830381600087803b15801561025c57600080fd5b505af1158015610270573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610294919061394b565b15156001146102b55760405162461bcd60e51b81526004016101fd90613da7565b60015460405163fbcbc0f160e01b81526000916001600160a01b03169063fbcbc0f1906102e6908b90600401613bf9565b60c06040518083038186803b1580156102fe57600080fd5b505afa158015610312573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061033691906139c2565b600154604051631aaf392f60e01b81529192506000916001600160a01b0390911690631aaf392f9061036e908c908c90600401613c0d565b60206040518083038186803b15801561038657600080fd5b505afa15801561039a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103be9190613965565b90506103ff886040516020016103d49190613b52565b6040516020818303038152906040526103f46103ef84611456565b61149f565b898560400151611509565b6040808401919091526001549051638f3b964760e01b81526001600160a01b0390911690638f3b964790610439908c908690600401613c47565b600060405180830381600087803b15801561045357600080fd5b505af1158015610467573d6000803e3d6000fd5b505050507f3e3ed1a676a2754a041b49bf752e0f167c8753495e36c320fe01d1ef7476253c898960405161049c929190613c0d565b60405180910390a1505060005a820390506104dd6040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506108a1565b6001600160a01b0316631e16e92f858533856040518563ffffffff1660e01b815260040180858152602001848152602001836001600160a01b03168152602001828152602001945050505050600060405180830381600087803b15801561054357600080fd5b505af1158015610557573d6000803e3d6000fd5b505050505050505050505050565b60018060045460ff16600281111561057957fe5b146105965760405162461bcd60e51b81526004016101fd90613ffc565b60025460065460005a9050600160009054906101000a90046001600160a01b03166001600160a01b03166399056ba96040518163ffffffff1660e01b815260040160206040518083038186803b1580156105ef57600080fd5b505afa158015610603573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106279190613965565b156106445760405162461bcd60e51b81526004016101fd90613e88565b600154604051630b38106960e11b81526001600160a01b039091169063167020d290610674908990600401613bf9565b602060405180830381600087803b15801561068e57600080fd5b505af11580156106a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106c6919061394b565b15156001146106e75760405162461bcd60e51b81526004016101fd90613f42565b60015460405163fbcbc0f160e01b81526000916001600160a01b03169063fbcbc0f190610718908a90600401613bf9565b60c06040518083038186803b15801561073057600080fd5b505afa158015610744573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061076891906139c2565b90506107a78760405160200161077e9190613b35565b60405160208183030381529060405261079e6107998461152f565b61156f565b88600354611509565b6003556040517fcec9ef675d775706a02b43afe48af52c5019bc50f99582e3208c6ff55d59c008906107da908990613bf9565b60405180910390a15060005a8203905061081a6040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506108a1565b6001600160a01b0316631e16e92f858533856040518563ffffffff1660e01b815260040180858152602001848152602001836001600160a01b03168152602001828152602001945050505050600060405180830381600087803b15801561088057600080fd5b505af1158015610894573d6000803e3d6000fd5b5050505050505050505050565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b838110156109015781810151838201526020016108e9565b50505050905090810190601f16801561092e5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561094b57600080fd5b505afa15801561095f573d6000803e3d6000fd5b505050506040513d602081101561097557600080fd5b505190505b919050565b60008060045460ff16600281111561099357fe5b146109b05760405162461bcd60e51b81526004016101fd90613ffc565b60025460065460005a90506006546109c786611678565b146109e45760405162461bcd60e51b81526004016101fd9061404d565b6103e88560a0015161040802816109f757fe5b04620186a0015a1015610a1c5760405162461bcd60e51b81526004016101fd90613ee5565b6000610a536040518060400160405280601481526020017327ab26afa2bc32b1baba34b7b726b0b730b3b2b960611b8152506108a1565b600154604051631381ba4d60e01b81529192506001600160a01b031690631381ba4d90610a84908490600401613bf9565b600060405180830381600087803b158015610a9e57600080fd5b505af1158015610ab2573d6000803e3d6000fd5b5050600154604051639be3ad6760e01b81526001600160a01b038086169450639be3ad679350610ae9928b929116906004016140e1565b600060405180830381600087803b158015610b0357600080fd5b505af1158015610b17573d6000803e3d6000fd5b5050600154604051631381ba4d60e01b81526001600160a01b039091169250631381ba4d9150610b4c90600090600401613bf9565b600060405180830381600087803b158015610b6657600080fd5b505af1158015610b7a573d6000803e3d6000fd5b50506004805460ff191660011790555060009150505a82039050610bc46040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506108a1565b6001600160a01b0316631e16e92f858533856040518563ffffffff1660e01b815260040180858152602001848152602001836001600160a01b03168152602001828152602001945050505050600060405180830381600087803b158015610c2a57600080fd5b505af1158015610c3e573d6000803e3d6000fd5b50505050505050505050565b60025490565b60008060045460ff166002811115610c6457fe5b14610c815760405162461bcd60e51b81526004016101fd90613ffc565b60025460065460005a600154604051630ad2267960e01b81529192506001600160a01b031690630ad2267990610cbd908a908a90600401613c0d565b60206040518083038186803b158015610cd557600080fd5b505afa158015610ce9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d0d919061394b565b15610d2a5760405162461bcd60e51b81526004016101fd90613cbf565b60015460405163c8e40fbf60e01b81526001600160a01b039091169063c8e40fbf90610d5a908a90600401613bf9565b60206040518083038186803b158015610d7257600080fd5b505afa158015610d86573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610daa919061394b565b1515600114610dcb5760405162461bcd60e51b81526004016101fd90614084565b60015460405163136e2d8960e11b81526000916001600160a01b0316906326dc5b1290610dfc908b90600401613bf9565b60206040518083038186803b158015610e1457600080fd5b505afa158015610e28573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e4c9190613965565b905060007f56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421821415610e8057506000610edd565b600080610ead8a604051602001610e979190613b52565b6040516020818303038152906040528a86611691565b909250905060018215151415610ed557610ece610ec9826116ba565b6116cd565b9250610eda565b600092505b50505b600154604051635c17d62960e01b81526001600160a01b0390911690635c17d62990610f11908c908c908690600401613c26565b600060405180830381600087803b158015610f2b57600080fd5b505af1158015610f3f573d6000803e3d6000fd5b50505050505060005a820390506104dd6040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506108a1565b60018060045460ff166002811115610f9057fe5b14610fad5760405162461bcd60e51b81526004016101fd90613ffc565b600160009054906101000a90046001600160a01b03166001600160a01b031663d7bd4a2a6040518163ffffffff1660e01b815260040160206040518083038186803b158015610ffb57600080fd5b505afa15801561100f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110339190613965565b156110505760405162461bcd60e51b81526004016101fd90613d4a565b600160009054906101000a90046001600160a01b03166001600160a01b03166399056ba96040518163ffffffff1660e01b815260040160206040518083038186803b15801561109e57600080fd5b505afa1580156110b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110d69190613965565b156110f35760405162461bcd60e51b81526004016101fd90613f9f565b506004805460ff19166002179055565b60045460ff1681565b6000600260045460ff16600281111561112157fe5b14905090565b6001546001600160a01b031681565b60008060045460ff16600281111561114a57fe5b146111675760405162461bcd60e51b81526004016101fd90613ffc565b60025460065460005a60015460405163c8e40fbf60e01b81529192506001600160a01b03169063c8e40fbf906111a1908a90600401613bf9565b60206040518083038186803b1580156111b957600080fd5b505afa1580156111cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111f1919061394b565b15801561127b57506001546040516307a1294560e01b81526001600160a01b03909116906307a1294590611229908a90600401613bf9565b60206040518083038186803b15801561124157600080fd5b505afa158015611255573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611279919061394b565b155b6112975760405162461bcd60e51b81526004016101fd90613d04565b6000806112c6896040516020016112ae9190613b35565b60405160208183030381529060405288600254611691565b9092509050600182151514156113e75760006112e1826116fc565b606081015190915089907fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470141561131a57506000611345565b81606001516113288261178e565b146113455760405162461bcd60e51b81526004016101fd90613e05565b6001546040805160c08101825284518152602080860151908201528482015181830152606080860151908201526001600160a01b038481166080830152600060a08301529151638f3b964760e01b81529190921691638f3b9647916113ae918f91600401613c47565b600060405180830381600087803b1580156113c857600080fd5b505af11580156113dc573d6000803e3d6000fd5b505050505050611417565b600154604051630d631c9d60e31b81526001600160a01b0390911690636b18e4e890610f11908c90600401613bf9565b505060005a820390506104dd6040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506108a1565b60035490565b6060806000805b6020811085821a151615611477576001918201910161145d565b5060405191506040820160405283600882021b60208301528060200382525080915050919050565b606080825160011480156114c757506080836000815181106114bd57fe5b016020015160f81c105b156114d3575081611503565b6114df83516080611792565b836040516020016114f1929190613b5b565b60405160208183030381529060405290505b92915050565b600080611515866118e1565b905061152381868686611911565b9150505b949350505050565b61153761376a565b604051806080016040528083600001518152602001836020015181526020018360400151815260200183606001518152509050919050565b60408051600480825260a0820190925260609160009190816020015b606081526020019060019003908161158b57505083519091506115b1906103ef90611456565b816000815181106115be57fe5b60200260200101819052506115dc6103ef846020015160001b611456565b816001815181106115e957fe5b6020026020010181905250611620836040015160405160200161160c9190613b52565b60405160208183030381529060405261149f565b8160028151811061162d57fe5b6020026020010181905250611650836060015160405160200161160c9190613b52565b8160038151811061165d57fe5b6020026020010181905250611671816119ac565b9392505050565b6000611683826119f0565b805190602001209050919050565b6000606060006116a0866118e1565b90506116ad818686611a2b565b9250925050935093915050565b60606115036116c883611afe565b611b23565b60008060006020845111156116e35760206116e6565b83515b6020858101519190036008021c92505050919050565b61170461376a565b600061170f83611bb2565b905060405180608001604052806117398360008151811061172c57fe5b6020026020010151611bc5565b815260200161174e8360018151811061172c57fe5b81526020016117708360028151811061176357fe5b6020026020010151611bcc565b81526020016117858360038151811061176357fe5b90529392505050565b3f90565b60608060388410156117ec576040805160018082528183019092529060208201818036833701905050905082840160f81b816000815181106117d057fe5b60200101906001600160f81b031916908160001a905350611671565b600060015b8086816117fa57fe5b041561180f57600190910190610100026117f1565b816001016001600160401b038111801561182857600080fd5b506040519080825280601f01601f191660200182016040528015611853576020820181803683370190505b50925084820160370160f81b8360008151811061186c57fe5b60200101906001600160f81b031916908160001a905350600190505b8181116118d8576101008183036101000a87816118a157fe5b04816118a957fe5b0660f81b8382815181106118b957fe5b60200101906001600160f81b031916908160001a905350600101611888565b50509392505050565b606081805190602001206040516020016118fb9190613b52565b6040516020818303038152906040529050919050565b6040805180820190915260018152600160ff1b60209091015260007f56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b4218214156119655761195e8585611cc6565b9050611527565b600061197084611cea565b9050600080611980838987611dc0565b509150915060006119938484848b612163565b905061199f818a61247b565b9998505050505050505050565b606060006119b9836125d4565b90506119c7815160c0611792565b816040516020016119d9929190613b5b565b604051602081830303815290604052915050919050565b6060816000015182602001518360400151846060015185608001518660a001518760c001516040516020016118fb9796959493929190613b8a565b600060606000611a3a85611cea565b90506000806000611a4c848a89611dc0565b81519295509093509150158080611a605750815b611ab1576040805162461bcd60e51b815260206004820152601a60248201527f50726f76696465642070726f6f6620697320696e76616c69642e000000000000604482015290519081900360640190fd5b600081611acd5760405180602001604052806000815250611aec565b611aec866001870381518110611adf57fe5b60200260200101516126dd565b919b919a509098505050505050505050565b611b06613791565b506040805180820190915281518152602082810190820152919050565b60606000806000611b33856126f9565b919450925090506000816001811115611b4857fe5b14611b9a576040805162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c502062797465732076616c75652e0000000000000000604482015290519081900360640190fd5b611ba985602001518484612a22565b95945050505050565b6060611503611bc083611afe565b612acf565b6000611503825b6000602182600001511115611c28576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e000000000000604482015290519081900360640190fd5b6000806000611c36856126f9565b919450925090506000816001811115611c4b57fe5b14611c9d576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e000000000000604482015290519081900360640190fd5b602080860151840180519091841015611cbc5760208490036101000a90045b9695505050505050565b6000611cda611cd484612c45565b83612d41565b5180516020909101209392505050565b60606000611cf783611bb2565b9050600081516001600160401b0381118015611d1257600080fd5b50604051908082528060200260200182016040528015611d4c57816020015b611d396137ab565b815260200190600190039081611d315790505b50905060005b8251811015611db8576000611d79848381518110611d6c57fe5b6020026020010151611b23565b90506040518060400160405280828152602001611d9583611bb2565b815250838381518110611da457fe5b602090810291909101015250600101611d52565b509392505050565b60006060818080611dd087612c45565b905085600080611dde6137ab565b60005b8c5181101561213b578c8181518110611df657fe5b6020026020010151915082840193506001870196508360001415611e6a57815180516020909101208514611e65576040805162461bcd60e51b8152602060048201526011602482015270092dcecc2d8d2c840e4dedee840d0c2e6d607b1b604482015290519081900360640190fd5b611f31565b815151602011611ed157815180516020909101208514611e65576040805162461bcd60e51b815260206004820152601b60248201527f496e76616c6964206c6172676520696e7465726e616c20686173680000000000604482015290519081900360640190fd5b84611edf8360000151612dd5565b14611f31576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420696e7465726e616c206e6f64652068617368000000000000604482015290519081900360640190fd5b60208201515160111415611fa0578551841415611f4d5761213b565b6000868581518110611f5b57fe5b602001015160f81c60f81b60f81c9050600083602001518260ff1681518110611f8057fe5b60200260200101519050611f9381612e01565b9650600194505050612133565b600282602001515114156120e6576000611fb983612e37565b9050600081600081518110611fca57fe5b016020015160f81c9050600181166002036000611fea8460ff8416612e55565b90506000611ff88b8a612e55565b905060006120068383612e86565b905060ff85166002148061201d575060ff85166003145b1561204f578083511480156120325750808251145b1561203c57988901985b50600160ff1b995061213b945050505050565b60ff85161580612062575060ff85166001145b156120af578061207f5750600160ff1b995061213b945050505050565b6120a0886020015160018151811061209357fe5b6020026020010151612e01565b9a509750612133945050505050565b60405162461bcd60e51b81526004018080602001828103825260268152602001806141ff6026913960400191505060405180910390fd5b6040805162461bcd60e51b815260206004820152601d60248201527f526563656976656420616e20756e706172736561626c65206e6f64652e000000604482015290519081900360640190fd5b600101611de1565b50600160ff1b84148661214e8786612e55565b909e909d50909b509950505050505050505050565b60606000839050600086600187038151811061217b57fe5b60200260200101519050600061219082612eec565b6040805160038082526080820190925291925060009190816020015b6121b46137ab565b8152602001906001900390816121ac5790505090506000845160001480156121e7575060028360028111156121e557fe5b145b1561221d576121fe6121f885612fc2565b88612d41565b82828151811061220a57fe5b602090810291909101015260010161245e565b600083600281111561222b57fe5b1415612291578451612260576122418488612fd5565b82828151811061224d57fe5b602090810291909101015260010161228c565b8382828151811061226d57fe5b60200260200101819052506001810190506121fe6121f8866001612e55565b61245e565b600061229c85612fc2565b905060006122aa8288612e86565b9050801561230b5760006122c083600084613020565b90506122d4816122cf8c613170565b6131b1565b8585815181106122e057fe5b60200260200101819052506001840193506122fb8383612e55565b92506123078883612e55565b9750505b60006123156131f5565b905082516000141561233a576123338161232e896126dd565b612fd5565b90506123d2565b60008360008151811061234957fe5b016020015160f81c905061235e846001612e55565b9350600287600281111561236e57fe5b14156123a9576000612388856123838b6126dd565b612d41565b90506123a1838361239c8460000151613170565b613282565b9250506123d0565b8351156123bf576000612388856122cf8b6126dd565b6123cd828261239c8b6126dd565b91505b505b8751612407576123e2818b612fd5565b9050808585815181106123f157fe5b602002602001018190525060018401935061245a565b612412886001612e55565b97508085858151811061242157fe5b602002602001018190525060018401935061243c888b612d41565b85858151811061244857fe5b60200260200101819052506001840193505b5050505b61246d8a60018b0384846132db565b9a9950505050505050505050565b60008061248783612c45565b90506124916137ab565b84516000906060905b80156125bf578760018203815181106124af57fe5b602002602001015193506124c284612eec565b925060028360028111156124d257fe5b14156124fd5760006124e385612fc2565b90506124f58660008351895103613020565b9550506125a9565b600183600281111561250b57fe5b141561254b57600061251c85612fc2565b905061252e8660008351895103613020565b8351909650156125455761254281846131b1565b94505b506125a9565b600083600281111561255957fe5b14156125a9578151156125a95760008560018751038151811061257857fe5b602001015160f81c60f81b60f81c90506125988660006001895103613020565b95506125a5858285613282565b9450505b83516125b490613170565b91506000190161249a565b50509051805160209091012095945050505050565b60608151600014156125f5575060408051600081526020810190915261097a565b6000805b83518110156126285783818151811061260e57fe5b6020026020010151518201915080806001019150506125f9565b6000826001600160401b038111801561264057600080fd5b506040519080825280601f01601f19166020018201604052801561266b576020820181803683370190505b50600092509050602081015b85518310156126d457600086848151811061268e57fe5b6020026020010151905060006020820190506126ac838284516133bd565b8785815181106126b857fe5b6020026020010151518301925050508280600101935050612677565b50949350505050565b60208101518051606091611503916000198101908110611d6c57fe5b600080600080846000015111612756576040805162461bcd60e51b815260206004820152601860248201527f524c50206974656d2063616e6e6f74206265206e756c6c2e0000000000000000604482015290519081900360640190fd5b6020840151805160001a607f811161277b576000600160009450945094505050612a1b565b60b781116127f0578551607f1982019081106127de576040805162461bcd60e51b815260206004820152601960248201527f496e76616c696420524c502073686f727420737472696e672e00000000000000604482015290519081900360640190fd5b60019550935060009250612a1b915050565b60bf81116128d457855160b6198201908110612853576040805162461bcd60e51b815260206004820152601f60248201527f496e76616c696420524c50206c6f6e6720737472696e67206c656e6774682e00604482015290519081900360640190fd5b6000816020036101000a60018501510490508082018860000151116128bf576040805162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c50206c6f6e6720737472696e672e0000000000000000604482015290519081900360640190fd5b60019091019550935060009250612a1b915050565b60f7811161294857855160bf198201908110612937576040805162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c502073686f7274206c6973742e000000000000000000604482015290519081900360640190fd5b600195509350849250612a1b915050565b855160f61982019081106129a3576040805162461bcd60e51b815260206004820152601d60248201527f496e76616c696420524c50206c6f6e67206c697374206c656e6774682e000000604482015290519081900360640190fd5b6000816020036101000a6001850151049050808201886000015111612a08576040805162461bcd60e51b815260206004820152601660248201527524b73b30b634b210292628103637b733903634b9ba1760511b604482015290519081900360640190fd5b6001918201965094509250612a1b915050565b9193909250565b60606000826001600160401b0381118015612a3c57600080fd5b506040519080825280601f01601f191660200182016040528015612a67576020820181803683370190505b509050805160001415612a7b579050611671565b8484016020820160005b60208604811015612aa6578251825260209283019290910190600101612a85565b5080519151601f959095166020036101000a600019019182169119909416179092525092915050565b6060600080612add846126f9565b91935090915060019050816001811115612af357fe5b14612b45576040805162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c50206c6973742076616c75652e000000000000000000604482015290519081900360640190fd5b6040805160208082526104208201909252600091816020015b612b66613791565b815260200190600190039081612b5e5790505090506000835b8651811015612c3a5760208210612bc75760405162461bcd60e51b815260040180806020018281038252602a8152602001806141d5602a913960400191505060405180910390fd5b600080612bf36040518060400160405280858c60000151038152602001858c60200151018152506126f9565b509150915060405180604001604052808383018152602001848b6020015101815250858581518110612c2157fe5b6020908102919091010152600193909301920101612b7f565b508152949350505050565b6060600082516002026001600160401b0381118015612c6357600080fd5b506040519080825280601f01601f191660200182016040528015612c8e576020820181803683370190505b50905060005b8351811015612d3a576004848281518110612cab57fe5b602001015160f81c60f81b6001600160f81b031916901c828260020281518110612cd157fe5b60200101906001600160f81b031916908160001a9053506010848281518110612cf657fe5b016020015160f81c81612d0557fe5b0660f81b828260020260010181518110612d1b57fe5b60200101906001600160f81b031916908160001a905350600101612c94565b5092915050565b612d496137ab565b60408051600280825260608201909252600091816020015b6060815260200190600190039081612d615790505090506000612d85856001613401565b9050612d936103ef82613558565b82600081518110612da057fe5b6020026020010181905250612db48461149f565b82600181518110612dc157fe5b6020026020010181905250611ba982613628565b6000602082511015612dec5750602081015161097a565b81806020019051602081101561097557600080fd5b60006060602083600001511015612e2257612e1b83613657565b9050612e2e565b612e2b83611b23565b90505b61167181612dd5565b6060611503612e508360200151600081518110611d6c57fe5b612c45565b60608183510360001415612e785750604080516020810190915260008152611503565b611671838384865103613020565b6000805b808451118015612e9a5750808351115b8015612edf5750828181518110612ead57fe5b602001015160f81c60f81b6001600160f81b031916848281518110612ece57fe5b01602001516001600160f81b031916145b1561167157600101612e8a565b60208101515160009060111415612f055750600061097a565b60028260200151511415612f81576000612f1e83612e37565b9050600081600081518110612f2f57fe5b016020015160f81c90506002811480612f4b575060ff81166003145b15612f5b5760029250505061097a565b60ff81161580612f6e575060ff81166001145b15612f7e5760019250505061097a565b50505b6040805162461bcd60e51b8152602060048201526011602482015270496e76616c6964206e6f6465207479706560781b604482015290519081900360640190fd5b6060611503612fd083612e37565b613662565b612fdd6137ab565b6000612fe88361149f565b9050612ff381611afe565b60208501518051600019810190811061300857fe5b602002602001018190525061152784602001516136ab565b60608182601f01101561306b576040805162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b604482015290519081900360640190fd5b8282840110156130b3576040805162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b604482015290519081900360640190fd5b818301845110156130ff576040805162461bcd60e51b8152602060048201526011602482015270736c6963655f6f75744f66426f756e647360781b604482015290519081900360640190fd5b60608215801561311e57604051915060008252602082016040526126d4565b6040519150601f8416801560200281840101858101878315602002848b0101015b8183101561315757805183526020928301920161313f565b5050858452601f01601f19166040525050949350505050565b606060208251101561318357508061097a565b818051906020012060405160200180828152602001915050604051602081830303815290604052905061097a565b6131b96137ab565b60408051600280825260608201909252600091816020015b60608152602001906001900390816131d15790505090506000612d85856000613401565b6131fd6137ab565b6040805160118082526102408201909252600091816020015b606081526020019060019003908161321657905050905060005b815181101561327257604051806040016040528060018152602001600160ff1b81525082828151811061325f57fe5b6020908102919091010152600101613230565b5061327c81613628565b91505090565b61328a6137ab565b600060208351106132a35761329e8361149f565b6132a5565b825b90506132b081611afe565b85602001518560ff16815181106132c357fe5b6020026020010181905250611ba985602001516136ab565b606060008285016001600160401b03811180156132f757600080fd5b5060405190808252806020026020018201604052801561333157816020015b61331e6137ab565b8152602001906001900390816133165790505b50905060005b858110156133725786818151811061334b57fe5b602002602001015182828151811061335f57fe5b6020908102919091010152600101613337565b5060005b838110156133b35784818151811061338a57fe5b602002602001015182878301815181106133a057fe5b6020908102919091010152600101613376565b5095945050505050565b8282825b602081106133e0578151835260209283019290910190601f19016133c1565b905182516020929092036101000a6000190180199091169116179052505050565b6060600082613411576000613414565b60025b90506000600285518161342357fe5b06905060008160020360ff166001600160401b038111801561344457600080fd5b506040519080825280601f01601f19166020018201604052801561346f576020820181803683370190505b50905081830160f81b8160008151811061348557fe5b60200101906001600160f81b031916908160001a90535080866040516020018083805190602001908083835b602083106134d05780518252601f1990920191602091820191016134b1565b51815160209384036101000a600019018019909216911617905285519190930192850191508083835b602083106135185780518252601f1990920191602091820191016134f9565b6001836020036101000a03801982511681845116808217855250505050505090500192505050604051602081830303815290604052935050505092915050565b60606000600283518161356757fe5b046001600160401b038111801561357d57600080fd5b506040519080825280601f01601f1916602001820160405280156135a8576020820181803683370190505b50905060005b8151811015612d3a578381600202600101815181106135c957fe5b602001015160f81c60f81b60048583600202815181106135e557fe5b602001015160f81c60f81b6001600160f81b031916901b1782828151811061360957fe5b60200101906001600160f81b031916908160001a9053506001016135ae565b6136306137ab565b600061363b836119ac565b9050604051806040016040528082815260200161178583611bb2565b606061150382613754565b606060028260008151811061367357fe5b016020015160f81c8161368257fe5b0660ff16600014156136a057613699826002612e55565b905061097a565b613699826001612e55565b6136b36137ab565b600082516001600160401b03811180156136cc57600080fd5b5060405190808252806020026020018201604052801561370057816020015b60608152602001906001900390816136eb5790505b50905060005b835181101561374a5761372b84828151811061371e57fe5b6020026020010151613657565b82828151811061373757fe5b6020908102919091010152600101613706565b5061167181613628565b6060611503826020015160008460000151612a22565b60408051608081018252600080825260208201819052918101829052606081019190915290565b604051806040016040528060008152602001600081525090565b604051806040016040528060608152602001606081525090565b60006001600160401b038311156137d857fe5b6137eb601f8401601f1916602001614169565b90508281528383830111156137ff57600080fd5b828260208301376000602084830101529392505050565b803561097a816141bc565b8051801515811461097a57600080fd5b600082601f830112613841578081fd5b611671838335602085016137c5565b80356002811061097a57600080fd5b600080600060608486031215613873578283fd5b833561387e816141bc565b9250602084013561388e816141bc565b915060408401356001600160401b038111156138a8578182fd5b6138b486828701613831565b9150509250925092565b6000806000606084860312156138d2578283fd5b83356138dd816141bc565b92506020840135915060408401356001600160401b038111156138a8578182fd5b60008060408385031215613910578182fd5b823561391b816141bc565b915060208301356001600160401b03811115613935578182fd5b61394185828601613831565b9150509250929050565b60006020828403121561395c578081fd5b61167182613821565b600060208284031215613976578081fd5b5051919050565b60006020828403121561398e578081fd5b81356001600160401b038111156139a3578182fd5b8201601f810184136139b3578182fd5b611527848235602084016137c5565b600060c082840312156139d3578081fd5b60405160c081018181106001600160401b03821117156139ef57fe5b8060405250825181526020830151602082015260408301516040820152606083015160608201526080830151613a24816141bc565b6080820152613a3560a08401613821565b60a08201529392505050565b600060208284031215613a52578081fd5b81356001600160401b0380821115613a68578283fd5b9083019060e08286031215613a7b578283fd5b613a8560e0614169565b8235815260208301356020820152613a9f60408401613850565b6040820152613ab060608401613816565b6060820152613ac160808401613816565b608082015260a083013560a082015260c083013582811115613ae1578485fd5b613aed87828601613831565b60c08301525095945050505050565b6001600160a01b03169052565b60008151808452613b2181602086016020860161418c565b601f01601f19169290920160200192915050565b60609190911b6bffffffffffffffffffffffff1916815260140190565b90815260200190565b60008351613b6d81846020880161418c565b835190830190613b8181836020880161418c565b01949350505050565b600088825287602083015260028710613b9f57fe5b8660f81b60408301526bffffffffffffffffffffffff19808760601b166041840152808660601b166055840152508360698301528251613be681608985016020870161418c565b9190910160890198975050505050505050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039390931683526020830191909152604082015260600190565b600060e08201905060018060a01b038085168352835160208401526020840151604084015260408401516060840152606084015160808401528060808501511660a08401525060a0830151151560c08301529392505050565b901515815260200190565b6020810160038310613cb957fe5b91905290565b60208082526025908201527f53746f7261676520736c6f742068617320616c7265616479206265656e20707260408201526437bb32b71760d91b606082015260800190565b60208082526026908201527f4163636f756e742073746174652068617320616c7265616479206265656e20706040820152653937bb32b71760d11b606082015260800190565b6020808252603e908201527f416c6c206163636f756e7473206d75737420626520636f6d6d6974746564206260408201527f65666f726520636f6d706c6574696e672061207472616e736974696f6e2e0000606082015260800190565b602080825260409082018190527f53746f7261676520736c6f742076616c7565207761736e2774206368616e6765908201527f64206f722068617320616c7265616479206265656e20636f6d6d69747465642e606082015260800190565b6020808252605b908201527f4f564d5f53746174655472616e736974696f6e65723a2050726f76696465642060408201527f4c3120636f6e747261637420636f6465206861736820646f6573206e6f74206d60608201527f61746368204c3220636f6e747261637420636f646520686173682e0000000000608082015260a00190565b6020808252603f908201527f416c6c2073746f72616765206d75737420626520636f6d6d697474656420626560408201527f666f726520636f6d6d697474696e67206163636f756e74207374617465732e00606082015260800190565b60208082526038908201527f4e6f7420656e6f7567682067617320746f2065786563757465207472616e736160408201527f6374696f6e2064657465726d696e6973746963616c6c792e0000000000000000606082015260800190565b6020808252603b908201527f4163636f756e74207374617465207761736e2774206368616e676564206f722060408201527f68617320616c7265616479206265656e20636f6d6d69747465642e0000000000606082015260800190565b6020808252603d908201527f416c6c2073746f72616765206d75737420626520636f6d6d697474656420626560408201527f666f726520636f6d706c6574696e672061207472616e736974696f6e2e000000606082015260800190565b60208082526031908201527f46756e6374696f6e206d7573742062652063616c6c656420647572696e67207460408201527034329031b7b93932b1ba10383430b9b29760791b606082015260800190565b6020808252601d908201527f496e76616c6964207472616e73616374696f6e2070726f76696465642e000000604082015260600190565b60208082526038908201527f436f6e7472616374206d757374206265207665726966696564206265666f726560408201527f2070726f76696e6720612073746f7261676520736c6f742e0000000000000000606082015260800190565b600060408252835160408301526020840151606083015260408401516002811061410757fe5b60808381019190915260608501516001600160a01b031660a084015284015161413360c0840182613afc565b5060a084015160e083015260c084015160e0610100840152614159610120840182613b09565b9150506116716020830184613afc565b6040518181016001600160401b038111828210171561418457fe5b604052919050565b60005b838110156141a757818101518382015260200161418f565b838111156141b6576000848401525b50505050565b6001600160a01b03811681146141d157600080fd5b5056fe50726f766964656420524c50206c6973742065786365656473206d6178206c697374206c656e6774682e52656365697665642061206e6f6465207769746820616e20756e6b6e6f776e20707265666978a26469706673582212202ea403a24e5302242cc43b478b69dcfe008a1ab131eba5f1e506e3ceccf9c0da64736f6c634300070600334372656174652063616e206f6e6c7920626520646f6e6520627920746865204f564d5f467261756456657269666965722ea26469706673582212202fcbb6d0346de56d2d329d627d3c66381df840d9e199778d7938b3519fa8287464736f6c63430007060033", - "devdoc": { - "details": "The State Transitioner Factory is used by the Fraud Verifier to create a new State Transitioner during the initialization of a fraud proof. Compiler used: solc Runtime target: EVM", - "kind": "dev", - "methods": { - "create(address,uint256,bytes32,bytes32)": { - "params": { - "_libAddressManager": "Address of the Address Manager.", - "_preStateRoot": "State root before the transition was executed.", - "_stateTransitionIndex": "Index of the state transition being verified.", - "_transactionHash": "Hash of the executed transaction." - }, - "returns": { - "_0": "New OVM_StateTransitioner instance." - } - }, - "resolve(string)": { - "params": { - "_name": "Name to resolve an address for." - }, - "returns": { - "_0": "Address associated with the given name." - } - } - }, - "title": "OVM_StateTransitionerFactory", - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": { - "create(address,uint256,bytes32,bytes32)": { - "notice": "Creates a new OVM_StateTransitioner" - }, - "resolve(string)": { - "notice": "Resolves the address associated with a given name." - } - }, - "version": 1 - }, - "storageLayout": { - "storage": [ - { - "astId": 12557, - "contract": "contracts/optimistic-ethereum/OVM/verification/OVM_StateTransitionerFactory.sol:OVM_StateTransitionerFactory", - "label": "libAddressManager", - "offset": 0, - "slot": "0", - "type": "t_contract(Lib_AddressManager)12550" - } - ], - "types": { - "t_contract(Lib_AddressManager)12550": { - "encoding": "inplace", - "label": "contract Lib_AddressManager", - "numberOfBytes": "20" - } - } - } -} \ No newline at end of file diff --git a/packages/contracts/deployments/goerli-v2/Proxy__OVM_L1CrossDomainMessenger.json b/packages/contracts/deployments/goerli-v2/Proxy__OVM_L1CrossDomainMessenger.json deleted file mode 100644 index 1ba20716a4d7c..0000000000000 --- a/packages/contracts/deployments/goerli-v2/Proxy__OVM_L1CrossDomainMessenger.json +++ /dev/null @@ -1,118 +0,0 @@ -{ - "address": "0x03F6221792451CAD23dF17fF4D702bF93978a9b3", - "abi": [ - { - "inputs": [ - { - "internalType": "address", - "name": "_libAddressManager", - "type": "address" - }, - { - "internalType": "string", - "name": "_implementationName", - "type": "string" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "stateMutability": "payable", - "type": "fallback" - } - ], - "transactionHash": "0x093773b948d6fdecb4b5c7747c9e2bba5b702ee84d9df0e3e4066862e8b31ef5", - "receipt": { - "to": null, - "from": "0x558ba9b8d78713fbf768c1f8a584485B4003f43F", - "contractAddress": "0x03F6221792451CAD23dF17fF4D702bF93978a9b3", - "transactionIndex": 30, - "gasUsed": "225024", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0x17df442314d9e6503db0df169dad3b0ca2bb986a5616cde0952cd4de99bf65c1", - "transactionHash": "0x093773b948d6fdecb4b5c7747c9e2bba5b702ee84d9df0e3e4066862e8b31ef5", - "logs": [], - "blockNumber": 4607710, - "cumulativeGasUsed": "2220470", - "status": 1, - "byzantium": true - }, - "args": [ - "0x9933d137bBF050Cf3D7555fE1beC91eF698814e5", - "OVM_L1CrossDomainMessenger" - ], - "solcInputHash": "8aef3555d89ad9d3af2f5d28a85dc856", - "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_implementationName\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"stateMutability\":\"payable\",\"type\":\"fallback\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_implementationName\":\"implementationName of the contract to proxy to.\",\"_libAddressManager\":\"Address of the Lib_AddressManager.\"}}},\"title\":\"Lib_ResolvedDelegateProxy\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/libraries/resolver/Lib_ResolvedDelegateProxy.sol\":\"Lib_ResolvedDelegateProxy\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Contract Imports */\\nimport { Ownable } from \\\"./Lib_Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n public\\n onlyOwner\\n {\\n addresses[_getNameHash(_name)] = _address;\\n\\n emit AddressSet(\\n _name,\\n _address\\n );\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0x36473d229ce0ba9d1cac5f02f84be843d9dcc8008525590a1652a2c2636f95f2\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Ownable\\n * @dev Adapted from https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol\\n */\\nabstract contract Ownable {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n address public owner;\\n\\n\\n /**********\\n * Events *\\n **********/\\n\\n event OwnershipTransferred(\\n address indexed previousOwner,\\n address indexed newOwner\\n );\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n constructor() {\\n owner = msg.sender;\\n emit OwnershipTransferred(address(0), owner);\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n owner == msg.sender,\\n \\\"Ownable: caller is not the owner\\\"\\n );\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the owner of this contract to the zero address, effectively renouncing ownership\\n * completely. Can only be called by the current owner of this contract.\\n */\\n function renounceOwnership()\\n public\\n virtual\\n onlyOwner\\n {\\n emit OwnershipTransferred(owner, address(0));\\n owner = address(0);\\n }\\n\\n /**\\n * Transfers ownership of this contract to a new address. Can only be called by the current\\n * owner of this contract.\\n * @param _newOwner Address of the new contract owner.\\n */\\n function transferOwnership(\\n address _newOwner\\n )\\n public\\n virtual\\n onlyOwner\\n {\\n require(\\n _newOwner != address(0),\\n \\\"Ownable: new owner cannot be the zero address\\\"\\n );\\n\\n emit OwnershipTransferred(owner, _newOwner);\\n owner = _newOwner;\\n }\\n}\\n\",\"keccak256\":\"0x83f9a6c4608b5929086429205b00f8211cdfcba83f3c84520f24d8aa64fe4b82\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_ResolvedDelegateProxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_ResolvedDelegateProxy\\n */\\ncontract Lib_ResolvedDelegateProxy {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n // Using mappings to store fields to avoid overwriting storage slots in the\\n // implementation contract. For example, instead of storing these fields at\\n // storage slot `0` & `1`, they are stored at `keccak256(key + slot)`.\\n // See: https://solidity.readthedocs.io/en/v0.7.0/internals/layout_in_storage.html\\n // NOTE: Do not use this code in your own contract system. \\n // There is a known flaw in this contract, and we will remove it from the repository\\n // in the near future. Due to the very limited way that we are using it, this flaw is\\n // not an issue in our system. \\n mapping (address => string) private implementationName;\\n mapping (address => Lib_AddressManager) private addressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n * @param _implementationName implementationName of the contract to proxy to.\\n */\\n constructor(\\n address _libAddressManager,\\n string memory _implementationName\\n )\\n {\\n addressManager[address(this)] = Lib_AddressManager(_libAddressManager);\\n implementationName[address(this)] = _implementationName;\\n }\\n\\n\\n /*********************\\n * Fallback Function *\\n *********************/\\n\\n fallback()\\n external\\n payable\\n {\\n address target = addressManager[address(this)].getAddress(\\n (implementationName[address(this)])\\n );\\n\\n require(\\n target != address(0),\\n \\\"Target address must be initialized.\\\"\\n );\\n\\n (bool success, bytes memory returndata) = target.delegatecall(msg.data);\\n\\n if (success == true) {\\n assembly {\\n return(add(returndata, 0x20), mload(returndata))\\n }\\n } else {\\n assembly {\\n revert(add(returndata, 0x20), mload(returndata))\\n }\\n }\\n }\\n}\\n\",\"keccak256\":\"0x48ec601665fb10424fc0afbf0b288e123be72eaf5faecb5c440609d176b645a7\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x608060405234801561001057600080fd5b506040516104083803806104088339818101604052604081101561003357600080fd5b81516020830180516040519294929383019291908464010000000082111561005a57600080fd5b90830190602082018581111561006f57600080fd5b825164010000000081118282018810171561008957600080fd5b82525081516020918201929091019080838360005b838110156100b657818101518382015260200161009e565b50505050905090810190601f1680156100e35780820380516001836020036101000a031916815260200191505b5060409081523060009081526001602090815282822080546001600160a01b0319166001600160a01b038a16179055818152919020855161012c95509093509085019150610134565b5050506101d5565b828054600181600116156101000203166002900490600052602060002090601f01602090048101928261016a57600085556101b0565b82601f1061018357805160ff19168380011785556101b0565b828001600101855582156101b0579182015b828111156101b0578251825591602001919060010190610195565b506101bc9291506101c0565b5090565b5b808211156101bc57600081556001016101c1565b610224806101e46000396000f3fe60806040818152306000908152600160208181528383205483825293832063bf40fac160e01b909552608490815284546002610100938216159390930260001901169190910460a481905291936001600160a01b039093169263bf40fac192909190819060c490849080156100b55780601f1061008a576101008083540402835291602001916100b5565b820191906000526020600020905b81548152906001019060200180831161009857829003601f168201915b50509250505060206040518083038186803b1580156100d357600080fd5b505afa1580156100e7573d6000803e3d6000fd5b505050506040513d60208110156100fd57600080fd5b505190506001600160a01b0381166101465760405162461bcd60e51b81526004018080602001828103825260238152602001806101cc6023913960400191505060405180910390fd5b600080826001600160a01b03166000366040518083838082843760405192019450600093509091505080830381855af49150503d80600081146101a5576040519150601f19603f3d011682016040523d82523d6000602084013e6101aa565b606091505b509092509050600182151514156101c357805160208201f35b805160208201fdfe5461726765742061646472657373206d75737420626520696e697469616c697a65642ea264697066735822122047711aaba20142a440a02e5574f0dc53d1bd38f0283dcfb518c3fdd1e925869364736f6c63430007060033", - "deployedBytecode": "0x60806040818152306000908152600160208181528383205483825293832063bf40fac160e01b909552608490815284546002610100938216159390930260001901169190910460a481905291936001600160a01b039093169263bf40fac192909190819060c490849080156100b55780601f1061008a576101008083540402835291602001916100b5565b820191906000526020600020905b81548152906001019060200180831161009857829003601f168201915b50509250505060206040518083038186803b1580156100d357600080fd5b505afa1580156100e7573d6000803e3d6000fd5b505050506040513d60208110156100fd57600080fd5b505190506001600160a01b0381166101465760405162461bcd60e51b81526004018080602001828103825260238152602001806101cc6023913960400191505060405180910390fd5b600080826001600160a01b03166000366040518083838082843760405192019450600093509091505080830381855af49150503d80600081146101a5576040519150601f19603f3d011682016040523d82523d6000602084013e6101aa565b606091505b509092509050600182151514156101c357805160208201f35b805160208201fdfe5461726765742061646472657373206d75737420626520696e697469616c697a65642ea264697066735822122047711aaba20142a440a02e5574f0dc53d1bd38f0283dcfb518c3fdd1e925869364736f6c63430007060033", - "devdoc": { - "kind": "dev", - "methods": { - "constructor": { - "params": { - "_implementationName": "implementationName of the contract to proxy to.", - "_libAddressManager": "Address of the Lib_AddressManager." - } - } - }, - "title": "Lib_ResolvedDelegateProxy", - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": {}, - "version": 1 - }, - "storageLayout": { - "storage": [ - { - "astId": 12685, - "contract": "contracts/optimistic-ethereum/libraries/resolver/Lib_ResolvedDelegateProxy.sol:Lib_ResolvedDelegateProxy", - "label": "implementationName", - "offset": 0, - "slot": "0", - "type": "t_mapping(t_address,t_string_storage)" - }, - { - "astId": 12689, - "contract": "contracts/optimistic-ethereum/libraries/resolver/Lib_ResolvedDelegateProxy.sol:Lib_ResolvedDelegateProxy", - "label": "addressManager", - "offset": 0, - "slot": "1", - "type": "t_mapping(t_address,t_contract(Lib_AddressManager)12550)" - } - ], - "types": { - "t_address": { - "encoding": "inplace", - "label": "address", - "numberOfBytes": "20" - }, - "t_contract(Lib_AddressManager)12550": { - "encoding": "inplace", - "label": "contract Lib_AddressManager", - "numberOfBytes": "20" - }, - "t_mapping(t_address,t_contract(Lib_AddressManager)12550)": { - "encoding": "mapping", - "key": "t_address", - "label": "mapping(address => contract Lib_AddressManager)", - "numberOfBytes": "32", - "value": "t_contract(Lib_AddressManager)12550" - }, - "t_mapping(t_address,t_string_storage)": { - "encoding": "mapping", - "key": "t_address", - "label": "mapping(address => string)", - "numberOfBytes": "32", - "value": "t_string_storage" - }, - "t_string_storage": { - "encoding": "bytes", - "label": "string", - "numberOfBytes": "32" - } - } - } -} \ No newline at end of file diff --git a/packages/contracts/deployments/goerli-v2/Proxy__OVM_L1ETHGateway.json b/packages/contracts/deployments/goerli-v2/Proxy__OVM_L1ETHGateway.json deleted file mode 100644 index 6845394f36870..0000000000000 --- a/packages/contracts/deployments/goerli-v2/Proxy__OVM_L1ETHGateway.json +++ /dev/null @@ -1,118 +0,0 @@ -{ - "address": "0x499223f87451F2dcC638c506ff7549838A3ee00e", - "abi": [ - { - "inputs": [ - { - "internalType": "address", - "name": "_libAddressManager", - "type": "address" - }, - { - "internalType": "string", - "name": "_implementationName", - "type": "string" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "stateMutability": "payable", - "type": "fallback" - } - ], - "transactionHash": "0x8848f064fdf1ca41f94eb31789c93dcea1b1d0b02cf55ab461b60f1d3c4bee32", - "receipt": { - "to": null, - "from": "0x558ba9b8d78713fbf768c1f8a584485B4003f43F", - "contractAddress": "0x499223f87451F2dcC638c506ff7549838A3ee00e", - "transactionIndex": 57, - "gasUsed": "224904", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0xf2add1bdd744c952a53b902e153e0635a4370d9eb1cfa28cf023299346c96702", - "transactionHash": "0x8848f064fdf1ca41f94eb31789c93dcea1b1d0b02cf55ab461b60f1d3c4bee32", - "logs": [], - "blockNumber": 4607747, - "cumulativeGasUsed": "6506741", - "status": 1, - "byzantium": true - }, - "args": [ - "0x9933d137bBF050Cf3D7555fE1beC91eF698814e5", - "OVM_L1ETHGateway" - ], - "solcInputHash": "8aef3555d89ad9d3af2f5d28a85dc856", - "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_implementationName\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"stateMutability\":\"payable\",\"type\":\"fallback\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_implementationName\":\"implementationName of the contract to proxy to.\",\"_libAddressManager\":\"Address of the Lib_AddressManager.\"}}},\"title\":\"Lib_ResolvedDelegateProxy\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/libraries/resolver/Lib_ResolvedDelegateProxy.sol\":\"Lib_ResolvedDelegateProxy\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Contract Imports */\\nimport { Ownable } from \\\"./Lib_Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n public\\n onlyOwner\\n {\\n addresses[_getNameHash(_name)] = _address;\\n\\n emit AddressSet(\\n _name,\\n _address\\n );\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0x36473d229ce0ba9d1cac5f02f84be843d9dcc8008525590a1652a2c2636f95f2\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Ownable\\n * @dev Adapted from https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol\\n */\\nabstract contract Ownable {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n address public owner;\\n\\n\\n /**********\\n * Events *\\n **********/\\n\\n event OwnershipTransferred(\\n address indexed previousOwner,\\n address indexed newOwner\\n );\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n constructor() {\\n owner = msg.sender;\\n emit OwnershipTransferred(address(0), owner);\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n owner == msg.sender,\\n \\\"Ownable: caller is not the owner\\\"\\n );\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the owner of this contract to the zero address, effectively renouncing ownership\\n * completely. Can only be called by the current owner of this contract.\\n */\\n function renounceOwnership()\\n public\\n virtual\\n onlyOwner\\n {\\n emit OwnershipTransferred(owner, address(0));\\n owner = address(0);\\n }\\n\\n /**\\n * Transfers ownership of this contract to a new address. Can only be called by the current\\n * owner of this contract.\\n * @param _newOwner Address of the new contract owner.\\n */\\n function transferOwnership(\\n address _newOwner\\n )\\n public\\n virtual\\n onlyOwner\\n {\\n require(\\n _newOwner != address(0),\\n \\\"Ownable: new owner cannot be the zero address\\\"\\n );\\n\\n emit OwnershipTransferred(owner, _newOwner);\\n owner = _newOwner;\\n }\\n}\\n\",\"keccak256\":\"0x83f9a6c4608b5929086429205b00f8211cdfcba83f3c84520f24d8aa64fe4b82\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_ResolvedDelegateProxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_ResolvedDelegateProxy\\n */\\ncontract Lib_ResolvedDelegateProxy {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n // Using mappings to store fields to avoid overwriting storage slots in the\\n // implementation contract. For example, instead of storing these fields at\\n // storage slot `0` & `1`, they are stored at `keccak256(key + slot)`.\\n // See: https://solidity.readthedocs.io/en/v0.7.0/internals/layout_in_storage.html\\n // NOTE: Do not use this code in your own contract system. \\n // There is a known flaw in this contract, and we will remove it from the repository\\n // in the near future. Due to the very limited way that we are using it, this flaw is\\n // not an issue in our system. \\n mapping (address => string) private implementationName;\\n mapping (address => Lib_AddressManager) private addressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n * @param _implementationName implementationName of the contract to proxy to.\\n */\\n constructor(\\n address _libAddressManager,\\n string memory _implementationName\\n )\\n {\\n addressManager[address(this)] = Lib_AddressManager(_libAddressManager);\\n implementationName[address(this)] = _implementationName;\\n }\\n\\n\\n /*********************\\n * Fallback Function *\\n *********************/\\n\\n fallback()\\n external\\n payable\\n {\\n address target = addressManager[address(this)].getAddress(\\n (implementationName[address(this)])\\n );\\n\\n require(\\n target != address(0),\\n \\\"Target address must be initialized.\\\"\\n );\\n\\n (bool success, bytes memory returndata) = target.delegatecall(msg.data);\\n\\n if (success == true) {\\n assembly {\\n return(add(returndata, 0x20), mload(returndata))\\n }\\n } else {\\n assembly {\\n revert(add(returndata, 0x20), mload(returndata))\\n }\\n }\\n }\\n}\\n\",\"keccak256\":\"0x48ec601665fb10424fc0afbf0b288e123be72eaf5faecb5c440609d176b645a7\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x608060405234801561001057600080fd5b506040516104083803806104088339818101604052604081101561003357600080fd5b81516020830180516040519294929383019291908464010000000082111561005a57600080fd5b90830190602082018581111561006f57600080fd5b825164010000000081118282018810171561008957600080fd5b82525081516020918201929091019080838360005b838110156100b657818101518382015260200161009e565b50505050905090810190601f1680156100e35780820380516001836020036101000a031916815260200191505b5060409081523060009081526001602090815282822080546001600160a01b0319166001600160a01b038a16179055818152919020855161012c95509093509085019150610134565b5050506101d5565b828054600181600116156101000203166002900490600052602060002090601f01602090048101928261016a57600085556101b0565b82601f1061018357805160ff19168380011785556101b0565b828001600101855582156101b0579182015b828111156101b0578251825591602001919060010190610195565b506101bc9291506101c0565b5090565b5b808211156101bc57600081556001016101c1565b610224806101e46000396000f3fe60806040818152306000908152600160208181528383205483825293832063bf40fac160e01b909552608490815284546002610100938216159390930260001901169190910460a481905291936001600160a01b039093169263bf40fac192909190819060c490849080156100b55780601f1061008a576101008083540402835291602001916100b5565b820191906000526020600020905b81548152906001019060200180831161009857829003601f168201915b50509250505060206040518083038186803b1580156100d357600080fd5b505afa1580156100e7573d6000803e3d6000fd5b505050506040513d60208110156100fd57600080fd5b505190506001600160a01b0381166101465760405162461bcd60e51b81526004018080602001828103825260238152602001806101cc6023913960400191505060405180910390fd5b600080826001600160a01b03166000366040518083838082843760405192019450600093509091505080830381855af49150503d80600081146101a5576040519150601f19603f3d011682016040523d82523d6000602084013e6101aa565b606091505b509092509050600182151514156101c357805160208201f35b805160208201fdfe5461726765742061646472657373206d75737420626520696e697469616c697a65642ea264697066735822122047711aaba20142a440a02e5574f0dc53d1bd38f0283dcfb518c3fdd1e925869364736f6c63430007060033", - "deployedBytecode": "0x60806040818152306000908152600160208181528383205483825293832063bf40fac160e01b909552608490815284546002610100938216159390930260001901169190910460a481905291936001600160a01b039093169263bf40fac192909190819060c490849080156100b55780601f1061008a576101008083540402835291602001916100b5565b820191906000526020600020905b81548152906001019060200180831161009857829003601f168201915b50509250505060206040518083038186803b1580156100d357600080fd5b505afa1580156100e7573d6000803e3d6000fd5b505050506040513d60208110156100fd57600080fd5b505190506001600160a01b0381166101465760405162461bcd60e51b81526004018080602001828103825260238152602001806101cc6023913960400191505060405180910390fd5b600080826001600160a01b03166000366040518083838082843760405192019450600093509091505080830381855af49150503d80600081146101a5576040519150601f19603f3d011682016040523d82523d6000602084013e6101aa565b606091505b509092509050600182151514156101c357805160208201f35b805160208201fdfe5461726765742061646472657373206d75737420626520696e697469616c697a65642ea264697066735822122047711aaba20142a440a02e5574f0dc53d1bd38f0283dcfb518c3fdd1e925869364736f6c63430007060033", - "devdoc": { - "kind": "dev", - "methods": { - "constructor": { - "params": { - "_implementationName": "implementationName of the contract to proxy to.", - "_libAddressManager": "Address of the Lib_AddressManager." - } - } - }, - "title": "Lib_ResolvedDelegateProxy", - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": {}, - "version": 1 - }, - "storageLayout": { - "storage": [ - { - "astId": 12685, - "contract": "contracts/optimistic-ethereum/libraries/resolver/Lib_ResolvedDelegateProxy.sol:Lib_ResolvedDelegateProxy", - "label": "implementationName", - "offset": 0, - "slot": "0", - "type": "t_mapping(t_address,t_string_storage)" - }, - { - "astId": 12689, - "contract": "contracts/optimistic-ethereum/libraries/resolver/Lib_ResolvedDelegateProxy.sol:Lib_ResolvedDelegateProxy", - "label": "addressManager", - "offset": 0, - "slot": "1", - "type": "t_mapping(t_address,t_contract(Lib_AddressManager)12550)" - } - ], - "types": { - "t_address": { - "encoding": "inplace", - "label": "address", - "numberOfBytes": "20" - }, - "t_contract(Lib_AddressManager)12550": { - "encoding": "inplace", - "label": "contract Lib_AddressManager", - "numberOfBytes": "20" - }, - "t_mapping(t_address,t_contract(Lib_AddressManager)12550)": { - "encoding": "mapping", - "key": "t_address", - "label": "mapping(address => contract Lib_AddressManager)", - "numberOfBytes": "32", - "value": "t_contract(Lib_AddressManager)12550" - }, - "t_mapping(t_address,t_string_storage)": { - "encoding": "mapping", - "key": "t_address", - "label": "mapping(address => string)", - "numberOfBytes": "32", - "value": "t_string_storage" - }, - "t_string_storage": { - "encoding": "bytes", - "label": "string", - "numberOfBytes": "32" - } - } - } -} \ No newline at end of file diff --git a/packages/contracts/deployments/goerli-v2/mockOVM_BondManager.json b/packages/contracts/deployments/goerli-v2/mockOVM_BondManager.json deleted file mode 100644 index e1294cc09306f..0000000000000 --- a/packages/contracts/deployments/goerli-v2/mockOVM_BondManager.json +++ /dev/null @@ -1,242 +0,0 @@ -{ - "address": "0x1e4f220d5CDD25e2C0E60e0B2f56a7CCC25719C1", - "abi": [ - { - "inputs": [ - { - "internalType": "address", - "name": "_libAddressManager", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_who", - "type": "address" - } - ], - "name": "claim", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "deposit", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "_preStateRoot", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "_publisher", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_timestamp", - "type": "uint256" - } - ], - "name": "finalize", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "finalizeWithdrawal", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "name": "getGasSpent", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "pure", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_who", - "type": "address" - } - ], - "name": "isCollateralized", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "libAddressManager", - "outputs": [ - { - "internalType": "contract Lib_AddressManager", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "_preStateRoot", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "_txHash", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "_who", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_gasSpent", - "type": "uint256" - } - ], - "name": "recordGasSpent", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "string", - "name": "_name", - "type": "string" - } - ], - "name": "resolve", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "startWithdrawal", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - } - ], - "transactionHash": "0xa54799a6b82060dddfc00a53abb61b99ef21f9876831ef3159ff075ee5b175ae", - "receipt": { - "to": null, - "from": "0x558ba9b8d78713fbf768c1f8a584485B4003f43F", - "contractAddress": "0x1e4f220d5CDD25e2C0E60e0B2f56a7CCC25719C1", - "transactionIndex": 32, - "gasUsed": "298498", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0x77879b9c49dc6bb644a719307fa63fbcbefaca9496c805a612f7dc637331d294", - "transactionHash": "0xa54799a6b82060dddfc00a53abb61b99ef21f9876831ef3159ff075ee5b175ae", - "logs": [], - "blockNumber": 4607703, - "cumulativeGasUsed": "4021639", - "status": 1, - "byzantium": true - }, - "args": [ - "0x9933d137bBF050Cf3D7555fE1beC91eF698814e5" - ], - "solcInputHash": "8aef3555d89ad9d3af2f5d28a85dc856", - "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_who\",\"type\":\"address\"}],\"name\":\"claim\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"deposit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_preStateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"_publisher\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_timestamp\",\"type\":\"uint256\"}],\"name\":\"finalize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"finalizeWithdrawal\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"getGasSpent\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_who\",\"type\":\"address\"}],\"name\":\"isCollateralized\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_preStateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"_txHash\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"_who\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_gasSpent\",\"type\":\"uint256\"}],\"name\":\"recordGasSpent\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"startWithdrawal\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}}},\"title\":\"mockOVM_BondManager\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/mockOVM/verification/mockOVM_BondManager.sol\":\"mockOVM_BondManager\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/optimistic-ethereum/iOVM/verification/iOVM_BondManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\ninterface ERC20 {\\n function transfer(address, uint256) external returns (bool);\\n function transferFrom(address, address, uint256) external returns (bool);\\n}\\n\\n/// All the errors which may be encountered on the bond manager\\nlibrary Errors {\\n string constant ERC20_ERR = \\\"BondManager: Could not post bond\\\";\\n string constant ALREADY_FINALIZED = \\\"BondManager: Fraud proof for this pre-state root has already been finalized\\\";\\n string constant SLASHED = \\\"BondManager: Cannot finalize withdrawal, you probably got slashed\\\";\\n string constant WRONG_STATE = \\\"BondManager: Wrong bond state for proposer\\\";\\n string constant CANNOT_CLAIM = \\\"BondManager: Cannot claim yet. Dispute must be finalized first\\\";\\n\\n string constant WITHDRAWAL_PENDING = \\\"BondManager: Withdrawal already pending\\\";\\n string constant TOO_EARLY = \\\"BondManager: Too early to finalize your withdrawal\\\";\\n\\n string constant ONLY_TRANSITIONER = \\\"BondManager: Only the transitioner for this pre-state root may call this function\\\";\\n string constant ONLY_FRAUD_VERIFIER = \\\"BondManager: Only the fraud verifier may call this function\\\";\\n string constant ONLY_STATE_COMMITMENT_CHAIN = \\\"BondManager: Only the state commitment chain may call this function\\\";\\n string constant WAIT_FOR_DISPUTES = \\\"BondManager: Wait for other potential disputes\\\";\\n}\\n\\n/**\\n * @title iOVM_BondManager\\n */\\ninterface iOVM_BondManager {\\n\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n /// The lifecycle of a proposer's bond\\n enum State {\\n // Before depositing or after getting slashed, a user is uncollateralized\\n NOT_COLLATERALIZED,\\n // After depositing, a user is collateralized\\n COLLATERALIZED,\\n // After a user has initiated a withdrawal\\n WITHDRAWING\\n }\\n\\n /// A bond posted by a proposer\\n struct Bond {\\n // The user's state\\n State state;\\n // The timestamp at which a proposer issued their withdrawal request\\n uint32 withdrawalTimestamp;\\n // The time when the first disputed was initiated for this bond\\n uint256 firstDisputeAt;\\n // The earliest observed state root for this bond which has had fraud\\n bytes32 earliestDisputedStateRoot;\\n // The state root's timestamp\\n uint256 earliestTimestamp;\\n }\\n\\n // Per pre-state root, store the number of state provisions that were made\\n // and how many of these calls were made by each user. Payouts will then be\\n // claimed by users proportionally for that dispute.\\n struct Rewards {\\n // Flag to check if rewards for a fraud proof are claimable\\n bool canClaim;\\n // Total number of `recordGasSpent` calls made\\n uint256 total;\\n // The gas spent by each user to provide witness data. The sum of all\\n // values inside this map MUST be equal to the value of `total`\\n mapping(address => uint256) gasSpent;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function recordGasSpent(\\n bytes32 _preStateRoot,\\n bytes32 _txHash,\\n address _who,\\n uint256 _gasSpent\\n ) external;\\n\\n function finalize(\\n bytes32 _preStateRoot,\\n address _publisher,\\n uint256 _timestamp\\n ) external;\\n\\n function deposit() external;\\n\\n function startWithdrawal() external;\\n\\n function finalizeWithdrawal() external;\\n\\n function claim(\\n address _who\\n ) external;\\n\\n function isCollateralized(\\n address _who\\n ) external view returns (bool);\\n\\n function getGasSpent(\\n bytes32 _preStateRoot,\\n address _who\\n ) external view returns (uint256);\\n}\\n\",\"keccak256\":\"0x3c2a8a399487857158649db1896749d86e39cba545a8aeb2e2bb0f3bdfa7a5b1\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Contract Imports */\\nimport { Ownable } from \\\"./Lib_Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n public\\n onlyOwner\\n {\\n addresses[_getNameHash(_name)] = _address;\\n\\n emit AddressSet(\\n _name,\\n _address\\n );\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0x36473d229ce0ba9d1cac5f02f84be843d9dcc8008525590a1652a2c2636f95f2\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(\\n address _libAddressManager\\n ) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x65981feeabff6a81783ea97d44baf988a18a86c8cb374c46fdb71819cbacc7c0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Ownable\\n * @dev Adapted from https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol\\n */\\nabstract contract Ownable {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n address public owner;\\n\\n\\n /**********\\n * Events *\\n **********/\\n\\n event OwnershipTransferred(\\n address indexed previousOwner,\\n address indexed newOwner\\n );\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n constructor() {\\n owner = msg.sender;\\n emit OwnershipTransferred(address(0), owner);\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n owner == msg.sender,\\n \\\"Ownable: caller is not the owner\\\"\\n );\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the owner of this contract to the zero address, effectively renouncing ownership\\n * completely. Can only be called by the current owner of this contract.\\n */\\n function renounceOwnership()\\n public\\n virtual\\n onlyOwner\\n {\\n emit OwnershipTransferred(owner, address(0));\\n owner = address(0);\\n }\\n\\n /**\\n * Transfers ownership of this contract to a new address. Can only be called by the current\\n * owner of this contract.\\n * @param _newOwner Address of the new contract owner.\\n */\\n function transferOwnership(\\n address _newOwner\\n )\\n public\\n virtual\\n onlyOwner\\n {\\n require(\\n _newOwner != address(0),\\n \\\"Ownable: new owner cannot be the zero address\\\"\\n );\\n\\n emit OwnershipTransferred(owner, _newOwner);\\n owner = _newOwner;\\n }\\n}\\n\",\"keccak256\":\"0x83f9a6c4608b5929086429205b00f8211cdfcba83f3c84520f24d8aa64fe4b82\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/mockOVM/verification/mockOVM_BondManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Interface Imports */\\nimport { iOVM_BondManager } from \\\"../../iOVM/verification/iOVM_BondManager.sol\\\";\\n\\n/* Contract Imports */\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/**\\n * @title mockOVM_BondManager\\n */\\ncontract mockOVM_BondManager is iOVM_BondManager, Lib_AddressResolver {\\n constructor(\\n address _libAddressManager\\n )\\n Lib_AddressResolver(_libAddressManager)\\n {}\\n\\n function recordGasSpent(\\n bytes32 _preStateRoot,\\n bytes32 _txHash,\\n address _who,\\n uint256 _gasSpent\\n )\\n override\\n public\\n {}\\n\\n function finalize(\\n bytes32 _preStateRoot,\\n address _publisher,\\n uint256 _timestamp\\n )\\n override\\n public\\n {}\\n\\n function deposit()\\n override\\n public\\n {}\\n\\n function startWithdrawal()\\n override\\n public\\n {}\\n\\n function finalizeWithdrawal()\\n override\\n public\\n {}\\n\\n function claim(\\n address _who\\n )\\n override\\n public\\n {}\\n\\n function isCollateralized(\\n address _who\\n )\\n override\\n public\\n view\\n returns (\\n bool\\n )\\n {\\n // Only authenticate sequencer to submit state root batches.\\n return _who == resolve(\\\"OVM_Proposer\\\");\\n }\\n\\n function getGasSpent(\\n bytes32, // _preStateRoot,\\n address // _who\\n )\\n override\\n public\\n pure \\n returns (\\n uint256\\n )\\n {\\n return 0;\\n }\\n}\\n\",\"keccak256\":\"0x7742f2892255ca236320217d067f846bbd8f17d1561fae97f492de390598c667\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x608060405234801561001057600080fd5b506040516104673803806104678339818101604052602081101561003357600080fd5b5051600080546001600160a01b039092166001600160a01b0319909216919091179055610402806100656000396000f3fe608060405234801561001057600080fd5b506004361061009e5760003560e01c8063abfbbe1311610066578063abfbbe1314610207578063bc2f8dd814610239578063c5b6aa2f14610239578063d0e30db014610239578063dc6453dc146102415761009e565b806302ad4d2a146100a35780631e16e92f146100dd5780631e83409a14610117578063299ca4781461013d578063461a447814610161575b600080fd5b6100c9600480360360208110156100b957600080fd5b50356001600160a01b031661027f565b604080519115158252519081900360200190f35b610115600480360360808110156100f357600080fd5b508035906020810135906001600160a01b0360408201351690606001356102c9565b005b6101156004803603602081101561012d57600080fd5b50356001600160a01b03166102cf565b6101456102d2565b604080516001600160a01b039092168252519081900360200190f35b6101456004803603602081101561017757600080fd5b81019060208101813564010000000081111561019257600080fd5b8201836020820111156101a457600080fd5b803590602001918460018302840111640100000000831117156101c657600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506102e1945050505050565b6101156004803603606081101561021d57600080fd5b508035906001600160a01b0360208201351690604001356103bd565b6101156103c2565b61026d6004803603604081101561025757600080fd5b50803590602001356001600160a01b03166103c4565b60408051918252519081900360200190f35b60006102ae6040518060400160405280600c81526020016b27ab26afa83937b837b9b2b960a11b8152506102e1565b6001600160a01b0316826001600160a01b0316149050919050565b50505050565b50565b6000546001600160a01b031681565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b83811015610341578181015183820152602001610329565b50505050905090810190601f16801561036e5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561038b57600080fd5b505afa15801561039f573d6000803e3d6000fd5b505050506040513d60208110156103b557600080fd5b505192915050565b505050565b565b60009291505056fea2646970667358221220e81b7b10b3718499ec37ea8158ce956d7b28d4eba947a23eb50254d80e53024464736f6c63430007060033", - "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061009e5760003560e01c8063abfbbe1311610066578063abfbbe1314610207578063bc2f8dd814610239578063c5b6aa2f14610239578063d0e30db014610239578063dc6453dc146102415761009e565b806302ad4d2a146100a35780631e16e92f146100dd5780631e83409a14610117578063299ca4781461013d578063461a447814610161575b600080fd5b6100c9600480360360208110156100b957600080fd5b50356001600160a01b031661027f565b604080519115158252519081900360200190f35b610115600480360360808110156100f357600080fd5b508035906020810135906001600160a01b0360408201351690606001356102c9565b005b6101156004803603602081101561012d57600080fd5b50356001600160a01b03166102cf565b6101456102d2565b604080516001600160a01b039092168252519081900360200190f35b6101456004803603602081101561017757600080fd5b81019060208101813564010000000081111561019257600080fd5b8201836020820111156101a457600080fd5b803590602001918460018302840111640100000000831117156101c657600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506102e1945050505050565b6101156004803603606081101561021d57600080fd5b508035906001600160a01b0360208201351690604001356103bd565b6101156103c2565b61026d6004803603604081101561025757600080fd5b50803590602001356001600160a01b03166103c4565b60408051918252519081900360200190f35b60006102ae6040518060400160405280600c81526020016b27ab26afa83937b837b9b2b960a11b8152506102e1565b6001600160a01b0316826001600160a01b0316149050919050565b50505050565b50565b6000546001600160a01b031681565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b83811015610341578181015183820152602001610329565b50505050905090810190601f16801561036e5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561038b57600080fd5b505afa15801561039f573d6000803e3d6000fd5b505050506040513d60208110156103b557600080fd5b505192915050565b505050565b565b60009291505056fea2646970667358221220e81b7b10b3718499ec37ea8158ce956d7b28d4eba947a23eb50254d80e53024464736f6c63430007060033", - "devdoc": { - "kind": "dev", - "methods": { - "resolve(string)": { - "params": { - "_name": "Name to resolve an address for." - }, - "returns": { - "_0": "Address associated with the given name." - } - } - }, - "title": "mockOVM_BondManager", - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": { - "resolve(string)": { - "notice": "Resolves the address associated with a given name." - } - }, - "version": 1 - }, - "storageLayout": { - "storage": [ - { - "astId": 12557, - "contract": "contracts/optimistic-ethereum/mockOVM/verification/mockOVM_BondManager.sol:mockOVM_BondManager", - "label": "libAddressManager", - "offset": 0, - "slot": "0", - "type": "t_contract(Lib_AddressManager)12550" - } - ], - "types": { - "t_contract(Lib_AddressManager)12550": { - "encoding": "inplace", - "label": "contract Lib_AddressManager", - "numberOfBytes": "20" - } - } - } -} \ No newline at end of file diff --git a/packages/contracts/deployments/goerli-v2/solcInputs/8aef3555d89ad9d3af2f5d28a85dc856.json b/packages/contracts/deployments/goerli-v2/solcInputs/8aef3555d89ad9d3af2f5d28a85dc856.json deleted file mode 100644 index 86e0ddc08ee58..0000000000000 --- a/packages/contracts/deployments/goerli-v2/solcInputs/8aef3555d89ad9d3af2f5d28a85dc856.json +++ /dev/null @@ -1,311 +0,0 @@ -{ - "language": "Solidity", - "sources": { - "contracts/optimistic-ethereum/iOVM/accounts/iOVM_ECDSAContractAccount.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/**\n * @title iOVM_ECDSAContractAccount\n */\ninterface iOVM_ECDSAContractAccount {\n\n /********************\n * Public Functions *\n ********************/\n\n function execute(\n bytes memory _transaction,\n Lib_OVMCodec.EOASignatureType _signatureType,\n uint8 _v,\n bytes32 _r,\n bytes32 _s\n ) external returns (bool _success, bytes memory _returndata);\n}\n" - }, - "contracts/optimistic-ethereum/libraries/codec/Lib_OVMCodec.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_RLPReader } from \"../rlp/Lib_RLPReader.sol\";\nimport { Lib_RLPWriter } from \"../rlp/Lib_RLPWriter.sol\";\nimport { Lib_BytesUtils } from \"../utils/Lib_BytesUtils.sol\";\nimport { Lib_Bytes32Utils } from \"../utils/Lib_Bytes32Utils.sol\";\nimport { Lib_SafeExecutionManagerWrapper } from \"../../libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\";\n\n/**\n * @title Lib_OVMCodec\n */\nlibrary Lib_OVMCodec {\n\n /*********\n * Enums *\n *********/\n\n enum EOASignatureType {\n EIP155_TRANSACTION,\n ETH_SIGNED_MESSAGE\n }\n\n enum QueueOrigin {\n SEQUENCER_QUEUE,\n L1TOL2_QUEUE\n }\n\n\n /***********\n * Structs *\n ***********/\n\n struct Account {\n uint256 nonce;\n uint256 balance;\n bytes32 storageRoot;\n bytes32 codeHash;\n address ethAddress;\n bool isFresh;\n }\n\n struct EVMAccount {\n uint256 nonce;\n uint256 balance;\n bytes32 storageRoot;\n bytes32 codeHash;\n }\n\n struct ChainBatchHeader {\n uint256 batchIndex;\n bytes32 batchRoot;\n uint256 batchSize;\n uint256 prevTotalElements;\n bytes extraData;\n }\n\n struct ChainInclusionProof {\n uint256 index;\n bytes32[] siblings;\n }\n\n struct Transaction {\n uint256 timestamp;\n uint256 blockNumber;\n QueueOrigin l1QueueOrigin;\n address l1TxOrigin;\n address entrypoint;\n uint256 gasLimit;\n bytes data;\n }\n\n struct TransactionChainElement {\n bool isSequenced;\n uint256 queueIndex; // QUEUED TX ONLY\n uint256 timestamp; // SEQUENCER TX ONLY\n uint256 blockNumber; // SEQUENCER TX ONLY\n bytes txData; // SEQUENCER TX ONLY\n }\n\n struct QueueElement {\n bytes32 transactionHash;\n uint40 timestamp;\n uint40 blockNumber;\n }\n\n struct EIP155Transaction {\n uint256 nonce;\n uint256 gasPrice;\n uint256 gasLimit;\n address to;\n uint256 value;\n bytes data;\n uint256 chainId;\n }\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Decodes an EOA transaction (i.e., native Ethereum RLP encoding).\n * @param _transaction Encoded EOA transaction.\n * @return Transaction decoded into a struct.\n */\n function decodeEIP155Transaction(\n bytes memory _transaction,\n bool _isEthSignedMessage\n )\n internal\n pure\n returns (\n EIP155Transaction memory\n )\n {\n if (_isEthSignedMessage) {\n (\n uint256 _nonce,\n uint256 _gasLimit,\n uint256 _gasPrice,\n uint256 _chainId,\n address _to,\n bytes memory _data\n ) = abi.decode(\n _transaction,\n (uint256, uint256, uint256, uint256, address ,bytes)\n );\n return EIP155Transaction({\n nonce: _nonce,\n gasPrice: _gasPrice,\n gasLimit: _gasLimit,\n to: _to,\n value: 0,\n data: _data,\n chainId: _chainId\n });\n } else {\n Lib_RLPReader.RLPItem[] memory decoded = Lib_RLPReader.readList(_transaction);\n\n return EIP155Transaction({\n nonce: Lib_RLPReader.readUint256(decoded[0]),\n gasPrice: Lib_RLPReader.readUint256(decoded[1]),\n gasLimit: Lib_RLPReader.readUint256(decoded[2]),\n to: Lib_RLPReader.readAddress(decoded[3]),\n value: Lib_RLPReader.readUint256(decoded[4]),\n data: Lib_RLPReader.readBytes(decoded[5]),\n chainId: Lib_RLPReader.readUint256(decoded[6])\n });\n }\n }\n\n /**\n * Decompresses a compressed EIP155 transaction.\n * @param _transaction Compressed EIP155 transaction bytes.\n * @return Transaction parsed into a struct.\n */\n function decompressEIP155Transaction(\n bytes memory _transaction\n )\n internal\n returns (\n EIP155Transaction memory\n )\n {\n return EIP155Transaction({\n gasLimit: Lib_BytesUtils.toUint24(_transaction, 0),\n gasPrice: uint256(Lib_BytesUtils.toUint24(_transaction, 3)) * 1000000,\n nonce: Lib_BytesUtils.toUint24(_transaction, 6),\n to: Lib_BytesUtils.toAddress(_transaction, 9),\n data: Lib_BytesUtils.slice(_transaction, 29),\n chainId: Lib_SafeExecutionManagerWrapper.safeCHAINID(),\n value: 0\n });\n }\n\n /**\n * Encodes an EOA transaction back into the original transaction.\n * @param _transaction EIP155transaction to encode.\n * @param _isEthSignedMessage Whether or not this was an eth signed message.\n * @return Encoded transaction.\n */\n function encodeEIP155Transaction(\n EIP155Transaction memory _transaction,\n bool _isEthSignedMessage\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n if (_isEthSignedMessage) {\n return abi.encode(\n _transaction.nonce,\n _transaction.gasLimit,\n _transaction.gasPrice,\n _transaction.chainId,\n _transaction.to,\n _transaction.data\n );\n } else {\n bytes[] memory raw = new bytes[](9);\n\n raw[0] = Lib_RLPWriter.writeUint(_transaction.nonce);\n raw[1] = Lib_RLPWriter.writeUint(_transaction.gasPrice);\n raw[2] = Lib_RLPWriter.writeUint(_transaction.gasLimit);\n if (_transaction.to == address(0)) {\n raw[3] = Lib_RLPWriter.writeBytes('');\n } else {\n raw[3] = Lib_RLPWriter.writeAddress(_transaction.to);\n }\n raw[4] = Lib_RLPWriter.writeUint(0);\n raw[5] = Lib_RLPWriter.writeBytes(_transaction.data);\n raw[6] = Lib_RLPWriter.writeUint(_transaction.chainId);\n raw[7] = Lib_RLPWriter.writeBytes(bytes(''));\n raw[8] = Lib_RLPWriter.writeBytes(bytes(''));\n\n return Lib_RLPWriter.writeList(raw);\n }\n }\n\n /**\n * Encodes a standard OVM transaction.\n * @param _transaction OVM transaction to encode.\n * @return Encoded transaction bytes.\n */\n function encodeTransaction(\n Transaction memory _transaction\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n return abi.encodePacked(\n _transaction.timestamp,\n _transaction.blockNumber,\n _transaction.l1QueueOrigin,\n _transaction.l1TxOrigin,\n _transaction.entrypoint,\n _transaction.gasLimit,\n _transaction.data\n );\n }\n\n /**\n * Hashes a standard OVM transaction.\n * @param _transaction OVM transaction to encode.\n * @return Hashed transaction\n */\n function hashTransaction(\n Transaction memory _transaction\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n return keccak256(encodeTransaction(_transaction));\n }\n\n /**\n * Converts an OVM account to an EVM account.\n * @param _in OVM account to convert.\n * @return Converted EVM account.\n */\n function toEVMAccount(\n Account memory _in\n )\n internal\n pure\n returns (\n EVMAccount memory\n )\n {\n return EVMAccount({\n nonce: _in.nonce,\n balance: _in.balance,\n storageRoot: _in.storageRoot,\n codeHash: _in.codeHash\n });\n }\n\n /**\n * @notice RLP-encodes an account state struct.\n * @param _account Account state struct.\n * @return RLP-encoded account state.\n */\n function encodeEVMAccount(\n EVMAccount memory _account\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n bytes[] memory raw = new bytes[](4);\n\n // Unfortunately we can't create this array outright because\n // Lib_RLPWriter.writeList will reject fixed-size arrays. Assigning\n // index-by-index circumvents this issue.\n raw[0] = Lib_RLPWriter.writeBytes(\n Lib_Bytes32Utils.removeLeadingZeros(\n bytes32(_account.nonce)\n )\n );\n raw[1] = Lib_RLPWriter.writeBytes(\n Lib_Bytes32Utils.removeLeadingZeros(\n bytes32(_account.balance)\n )\n );\n raw[2] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.storageRoot));\n raw[3] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.codeHash));\n\n return Lib_RLPWriter.writeList(raw);\n }\n\n /**\n * @notice Decodes an RLP-encoded account state into a useful struct.\n * @param _encoded RLP-encoded account state.\n * @return Account state struct.\n */\n function decodeEVMAccount(\n bytes memory _encoded\n )\n internal\n pure\n returns (\n EVMAccount memory\n )\n {\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\n\n return EVMAccount({\n nonce: Lib_RLPReader.readUint256(accountState[0]),\n balance: Lib_RLPReader.readUint256(accountState[1]),\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\n });\n }\n\n /**\n * Calculates a hash for a given batch header.\n * @param _batchHeader Header to hash.\n * @return Hash of the header.\n */\n function hashBatchHeader(\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n return keccak256(\n abi.encode(\n _batchHeader.batchRoot,\n _batchHeader.batchSize,\n _batchHeader.prevTotalElements,\n _batchHeader.extraData\n )\n );\n }\n}\n" - }, - "contracts/optimistic-ethereum/libraries/rlp/Lib_RLPReader.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/**\n * @title Lib_RLPReader\n * @dev Adapted from \"RLPReader\" by Hamdi Allam (hamdi.allam97@gmail.com).\n */\nlibrary Lib_RLPReader {\n\n /*************\n * Constants *\n *************/\n\n uint256 constant internal MAX_LIST_LENGTH = 32;\n\n\n /*********\n * Enums *\n *********/\n\n enum RLPItemType {\n DATA_ITEM,\n LIST_ITEM\n }\n\n \n /***********\n * Structs *\n ***********/\n\n struct RLPItem {\n uint256 length;\n uint256 ptr;\n }\n \n\n /**********************\n * Internal Functions *\n **********************/\n \n /**\n * Converts bytes to a reference to memory position and length.\n * @param _in Input bytes to convert.\n * @return Output memory reference.\n */\n function toRLPItem(\n bytes memory _in\n )\n internal\n pure\n returns (\n RLPItem memory\n )\n {\n uint256 ptr;\n assembly {\n ptr := add(_in, 32)\n }\n\n return RLPItem({\n length: _in.length,\n ptr: ptr\n });\n }\n\n /**\n * Reads an RLP list value into a list of RLP items.\n * @param _in RLP list value.\n * @return Decoded RLP list items.\n */\n function readList(\n RLPItem memory _in\n )\n internal\n pure\n returns (\n RLPItem[] memory\n )\n {\n (\n uint256 listOffset,\n ,\n RLPItemType itemType\n ) = _decodeLength(_in);\n\n require(\n itemType == RLPItemType.LIST_ITEM,\n \"Invalid RLP list value.\"\n );\n\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\n // writing to the length. Since we can't know the number of RLP items without looping over\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\n // simply set a reasonable maximum list length and decrease the size before we finish.\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\n\n uint256 itemCount = 0;\n uint256 offset = listOffset;\n while (offset < _in.length) {\n require(\n itemCount < MAX_LIST_LENGTH,\n \"Provided RLP list exceeds max list length.\"\n );\n\n (\n uint256 itemOffset,\n uint256 itemLength,\n ) = _decodeLength(RLPItem({\n length: _in.length - offset,\n ptr: _in.ptr + offset\n }));\n\n out[itemCount] = RLPItem({\n length: itemLength + itemOffset,\n ptr: _in.ptr + offset\n });\n\n itemCount += 1;\n offset += itemOffset + itemLength;\n }\n\n // Decrease the array size to match the actual item count.\n assembly {\n mstore(out, itemCount)\n }\n\n return out;\n }\n\n /**\n * Reads an RLP list value into a list of RLP items.\n * @param _in RLP list value.\n * @return Decoded RLP list items.\n */\n function readList(\n bytes memory _in\n )\n internal\n pure\n returns (\n RLPItem[] memory\n )\n {\n return readList(\n toRLPItem(_in)\n );\n }\n\n /**\n * Reads an RLP bytes value into bytes.\n * @param _in RLP bytes value.\n * @return Decoded bytes.\n */\n function readBytes(\n RLPItem memory _in\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n (\n uint256 itemOffset,\n uint256 itemLength,\n RLPItemType itemType\n ) = _decodeLength(_in);\n\n require(\n itemType == RLPItemType.DATA_ITEM,\n \"Invalid RLP bytes value.\"\n );\n\n return _copy(_in.ptr, itemOffset, itemLength);\n }\n\n /**\n * Reads an RLP bytes value into bytes.\n * @param _in RLP bytes value.\n * @return Decoded bytes.\n */\n function readBytes(\n bytes memory _in\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n return readBytes(\n toRLPItem(_in)\n );\n }\n\n /**\n * Reads an RLP string value into a string.\n * @param _in RLP string value.\n * @return Decoded string.\n */\n function readString(\n RLPItem memory _in\n )\n internal\n pure\n returns (\n string memory\n )\n {\n return string(readBytes(_in));\n }\n\n /**\n * Reads an RLP string value into a string.\n * @param _in RLP string value.\n * @return Decoded string.\n */\n function readString(\n bytes memory _in\n )\n internal\n pure\n returns (\n string memory\n )\n {\n return readString(\n toRLPItem(_in)\n );\n }\n\n /**\n * Reads an RLP bytes32 value into a bytes32.\n * @param _in RLP bytes32 value.\n * @return Decoded bytes32.\n */\n function readBytes32(\n RLPItem memory _in\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n require(\n _in.length <= 33,\n \"Invalid RLP bytes32 value.\"\n );\n\n (\n uint256 itemOffset,\n uint256 itemLength,\n RLPItemType itemType\n ) = _decodeLength(_in);\n\n require(\n itemType == RLPItemType.DATA_ITEM,\n \"Invalid RLP bytes32 value.\"\n );\n\n uint256 ptr = _in.ptr + itemOffset;\n bytes32 out;\n assembly {\n out := mload(ptr)\n\n // Shift the bytes over to match the item size.\n if lt(itemLength, 32) {\n out := div(out, exp(256, sub(32, itemLength)))\n }\n }\n\n return out;\n }\n\n /**\n * Reads an RLP bytes32 value into a bytes32.\n * @param _in RLP bytes32 value.\n * @return Decoded bytes32.\n */\n function readBytes32(\n bytes memory _in\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n return readBytes32(\n toRLPItem(_in)\n );\n }\n\n /**\n * Reads an RLP uint256 value into a uint256.\n * @param _in RLP uint256 value.\n * @return Decoded uint256.\n */\n function readUint256(\n RLPItem memory _in\n )\n internal\n pure\n returns (\n uint256\n )\n {\n return uint256(readBytes32(_in));\n }\n\n /**\n * Reads an RLP uint256 value into a uint256.\n * @param _in RLP uint256 value.\n * @return Decoded uint256.\n */\n function readUint256(\n bytes memory _in\n )\n internal\n pure\n returns (\n uint256\n )\n {\n return readUint256(\n toRLPItem(_in)\n );\n }\n\n /**\n * Reads an RLP bool value into a bool.\n * @param _in RLP bool value.\n * @return Decoded bool.\n */\n function readBool(\n RLPItem memory _in\n )\n internal\n pure\n returns (\n bool\n )\n {\n require(\n _in.length == 1,\n \"Invalid RLP boolean value.\"\n );\n\n uint256 ptr = _in.ptr;\n uint256 out;\n assembly {\n out := byte(0, mload(ptr))\n }\n\n require(\n out == 0 || out == 1,\n \"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\"\n );\n\n return out != 0;\n }\n\n /**\n * Reads an RLP bool value into a bool.\n * @param _in RLP bool value.\n * @return Decoded bool.\n */\n function readBool(\n bytes memory _in\n )\n internal\n pure\n returns (\n bool\n )\n {\n return readBool(\n toRLPItem(_in)\n );\n }\n\n /**\n * Reads an RLP address value into a address.\n * @param _in RLP address value.\n * @return Decoded address.\n */\n function readAddress(\n RLPItem memory _in\n )\n internal\n pure\n returns (\n address\n )\n {\n if (_in.length == 1) {\n return address(0);\n }\n\n require(\n _in.length == 21,\n \"Invalid RLP address value.\"\n );\n\n return address(readUint256(_in));\n }\n\n /**\n * Reads an RLP address value into a address.\n * @param _in RLP address value.\n * @return Decoded address.\n */\n function readAddress(\n bytes memory _in\n )\n internal\n pure\n returns (\n address\n )\n {\n return readAddress(\n toRLPItem(_in)\n );\n }\n\n /**\n * Reads the raw bytes of an RLP item.\n * @param _in RLP item to read.\n * @return Raw RLP bytes.\n */\n function readRawBytes(\n RLPItem memory _in\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n return _copy(_in);\n }\n\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * Decodes the length of an RLP item.\n * @param _in RLP item to decode.\n * @return Offset of the encoded data.\n * @return Length of the encoded data.\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\n */\n function _decodeLength(\n RLPItem memory _in\n )\n private\n pure\n returns (\n uint256,\n uint256,\n RLPItemType\n )\n {\n require(\n _in.length > 0,\n \"RLP item cannot be null.\"\n );\n\n uint256 ptr = _in.ptr;\n uint256 prefix;\n assembly {\n prefix := byte(0, mload(ptr))\n }\n\n if (prefix <= 0x7f) {\n // Single byte.\n\n return (0, 1, RLPItemType.DATA_ITEM);\n } else if (prefix <= 0xb7) {\n // Short string.\n\n uint256 strLen = prefix - 0x80;\n \n require(\n _in.length > strLen,\n \"Invalid RLP short string.\"\n );\n\n return (1, strLen, RLPItemType.DATA_ITEM);\n } else if (prefix <= 0xbf) {\n // Long string.\n uint256 lenOfStrLen = prefix - 0xb7;\n\n require(\n _in.length > lenOfStrLen,\n \"Invalid RLP long string length.\"\n );\n\n uint256 strLen;\n assembly {\n // Pick out the string length.\n strLen := div(\n mload(add(ptr, 1)),\n exp(256, sub(32, lenOfStrLen))\n )\n }\n\n require(\n _in.length > lenOfStrLen + strLen,\n \"Invalid RLP long string.\"\n );\n\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\n } else if (prefix <= 0xf7) {\n // Short list.\n uint256 listLen = prefix - 0xc0;\n\n require(\n _in.length > listLen,\n \"Invalid RLP short list.\"\n );\n\n return (1, listLen, RLPItemType.LIST_ITEM);\n } else {\n // Long list.\n uint256 lenOfListLen = prefix - 0xf7;\n\n require(\n _in.length > lenOfListLen,\n \"Invalid RLP long list length.\"\n );\n\n uint256 listLen;\n assembly {\n // Pick out the list length.\n listLen := div(\n mload(add(ptr, 1)),\n exp(256, sub(32, lenOfListLen))\n )\n }\n\n require(\n _in.length > lenOfListLen + listLen,\n \"Invalid RLP long list.\"\n );\n\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\n }\n }\n\n /**\n * Copies the bytes from a memory location.\n * @param _src Pointer to the location to read from.\n * @param _offset Offset to start reading from.\n * @param _length Number of bytes to read.\n * @return Copied bytes.\n */\n function _copy(\n uint256 _src,\n uint256 _offset,\n uint256 _length\n )\n private\n pure\n returns (\n bytes memory\n )\n {\n bytes memory out = new bytes(_length);\n if (out.length == 0) {\n return out;\n }\n\n uint256 src = _src + _offset;\n uint256 dest;\n assembly {\n dest := add(out, 32)\n }\n\n // Copy over as many complete words as we can.\n for (uint256 i = 0; i < _length / 32; i++) {\n assembly {\n mstore(dest, mload(src))\n }\n\n src += 32;\n dest += 32;\n }\n\n // Pick out the remaining bytes.\n uint256 mask = 256 ** (32 - (_length % 32)) - 1;\n assembly {\n mstore(\n dest,\n or(\n and(mload(src), not(mask)),\n and(mload(dest), mask)\n )\n )\n }\n\n return out;\n }\n\n /**\n * Copies an RLP item into bytes.\n * @param _in RLP item to copy.\n * @return Copied bytes.\n */\n function _copy(\n RLPItem memory _in\n )\n private\n pure\n returns (\n bytes memory\n )\n {\n return _copy(_in.ptr, 0, _in.length);\n }\n}\n" - }, - "contracts/optimistic-ethereum/libraries/rlp/Lib_RLPWriter.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_BytesUtils } from \"../utils/Lib_BytesUtils.sol\";\n\n/**\n * @title Lib_RLPWriter\n * @author Bakaoh (with modifications)\n */\nlibrary Lib_RLPWriter {\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * RLP encodes a byte string.\n * @param _in The byte string to encode.\n * @return _out The RLP encoded string in bytes.\n */\n function writeBytes(\n bytes memory _in\n )\n internal\n pure\n returns (\n bytes memory _out\n )\n {\n bytes memory encoded;\n\n if (_in.length == 1 && uint8(_in[0]) < 128) {\n encoded = _in;\n } else {\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\n }\n\n return encoded;\n }\n\n /**\n * RLP encodes a list of RLP encoded byte byte strings.\n * @param _in The list of RLP encoded byte strings.\n * @return _out The RLP encoded list of items in bytes.\n */\n function writeList(\n bytes[] memory _in\n )\n internal\n pure\n returns (\n bytes memory _out\n )\n {\n bytes memory list = _flatten(_in);\n return abi.encodePacked(_writeLength(list.length, 192), list);\n }\n\n /**\n * RLP encodes a string.\n * @param _in The string to encode.\n * @return _out The RLP encoded string in bytes.\n */\n function writeString(\n string memory _in\n )\n internal\n pure\n returns (\n bytes memory _out\n )\n {\n return writeBytes(bytes(_in));\n }\n\n /**\n * RLP encodes an address.\n * @param _in The address to encode.\n * @return _out The RLP encoded address in bytes.\n */\n function writeAddress(\n address _in\n )\n internal\n pure\n returns (\n bytes memory _out\n )\n {\n return writeBytes(abi.encodePacked(_in));\n }\n\n /**\n * RLP encodes a uint.\n * @param _in The uint256 to encode.\n * @return _out The RLP encoded uint256 in bytes.\n */\n function writeUint(\n uint256 _in\n )\n internal\n pure\n returns (\n bytes memory _out\n )\n {\n return writeBytes(_toBinary(_in));\n }\n\n /**\n * RLP encodes a bool.\n * @param _in The bool to encode.\n * @return _out The RLP encoded bool in bytes.\n */\n function writeBool(\n bool _in\n )\n internal\n pure\n returns (\n bytes memory _out\n )\n {\n bytes memory encoded = new bytes(1);\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\n return encoded;\n }\n\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\n * @param _len The length of the string or the payload.\n * @param _offset 128 if item is string, 192 if item is list.\n * @return _encoded RLP encoded bytes.\n */\n function _writeLength(\n uint256 _len,\n uint256 _offset\n )\n private\n pure\n returns (\n bytes memory _encoded\n )\n {\n bytes memory encoded;\n\n if (_len < 56) {\n encoded = new bytes(1);\n encoded[0] = byte(uint8(_len) + uint8(_offset));\n } else {\n uint256 lenLen;\n uint256 i = 1;\n while (_len / i != 0) {\n lenLen++;\n i *= 256;\n }\n\n encoded = new bytes(lenLen + 1);\n encoded[0] = byte(uint8(lenLen) + uint8(_offset) + 55);\n for(i = 1; i <= lenLen; i++) {\n encoded[i] = byte(uint8((_len / (256**(lenLen-i))) % 256));\n }\n }\n\n return encoded;\n }\n\n /**\n * Encode integer in big endian binary form with no leading zeroes.\n * @notice TODO: This should be optimized with assembly to save gas costs.\n * @param _x The integer to encode.\n * @return _binary RLP encoded bytes.\n */\n function _toBinary(\n uint256 _x\n )\n private\n pure\n returns (\n bytes memory _binary\n )\n {\n bytes memory b = abi.encodePacked(_x);\n\n uint256 i = 0;\n for (; i < 32; i++) {\n if (b[i] != 0) {\n break;\n }\n }\n\n bytes memory res = new bytes(32 - i);\n for (uint256 j = 0; j < res.length; j++) {\n res[j] = b[i++];\n }\n\n return res;\n }\n\n /**\n * Copies a piece of memory to another location.\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\n * @param _dest Destination location.\n * @param _src Source location.\n * @param _len Length of memory to copy.\n */\n function _memcpy(\n uint256 _dest,\n uint256 _src,\n uint256 _len\n )\n private\n pure\n {\n uint256 dest = _dest;\n uint256 src = _src;\n uint256 len = _len;\n\n for(; len >= 32; len -= 32) {\n assembly {\n mstore(dest, mload(src))\n }\n dest += 32;\n src += 32;\n }\n\n uint256 mask = 256 ** (32 - len) - 1;\n assembly {\n let srcpart := and(mload(src), not(mask))\n let destpart := and(mload(dest), mask)\n mstore(dest, or(destpart, srcpart))\n }\n }\n\n /**\n * Flattens a list of byte strings into one byte string.\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\n * @param _list List of byte strings to flatten.\n * @return _flattened The flattened byte string.\n */\n function _flatten(\n bytes[] memory _list\n )\n private\n pure\n returns (\n bytes memory _flattened\n )\n {\n if (_list.length == 0) {\n return new bytes(0);\n }\n\n uint256 len;\n uint256 i = 0;\n for (; i < _list.length; i++) {\n len += _list[i].length;\n }\n\n bytes memory flattened = new bytes(len);\n uint256 flattenedPtr;\n assembly { flattenedPtr := add(flattened, 0x20) }\n\n for(i = 0; i < _list.length; i++) {\n bytes memory item = _list[i];\n\n uint256 listPtr;\n assembly { listPtr := add(item, 0x20)}\n\n _memcpy(flattenedPtr, listPtr, item.length);\n flattenedPtr += _list[i].length;\n }\n\n return flattened;\n }\n}" - }, - "contracts/optimistic-ethereum/libraries/utils/Lib_BytesUtils.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/**\n * @title Lib_BytesUtils\n */\nlibrary Lib_BytesUtils {\n\n /**********************\n * Internal Functions *\n **********************/\n\n function slice(\n bytes memory _bytes,\n uint256 _start,\n uint256 _length\n )\n internal\n pure\n returns (bytes memory)\n {\n require(_length + 31 >= _length, \"slice_overflow\");\n require(_start + _length >= _start, \"slice_overflow\");\n require(_bytes.length >= _start + _length, \"slice_outOfBounds\");\n\n bytes memory tempBytes;\n\n assembly {\n switch iszero(_length)\n case 0 {\n // Get a location of some free memory and store it in tempBytes as\n // Solidity does for memory variables.\n tempBytes := mload(0x40)\n\n // The first word of the slice result is potentially a partial\n // word read from the original array. To read it, we calculate\n // the length of that partial word and start copying that many\n // bytes into the array. The first word we copy will start with\n // data we don't care about, but the last `lengthmod` bytes will\n // land at the beginning of the contents of the new array. When\n // we're done copying, we overwrite the full first word with\n // the actual length of the slice.\n let lengthmod := and(_length, 31)\n\n // The multiplication in the next line is necessary\n // because when slicing multiples of 32 bytes (lengthmod == 0)\n // the following copy loop was copying the origin's length\n // and then ending prematurely not copying everything it should.\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\n let end := add(mc, _length)\n\n for {\n // The multiplication in the next line has the same exact purpose\n // as the one above.\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\n } lt(mc, end) {\n mc := add(mc, 0x20)\n cc := add(cc, 0x20)\n } {\n mstore(mc, mload(cc))\n }\n\n mstore(tempBytes, _length)\n\n //update free-memory pointer\n //allocating the array padded to 32 bytes like the compiler does now\n mstore(0x40, and(add(mc, 31), not(31)))\n }\n //if we want a zero-length slice let's just return a zero-length array\n default {\n tempBytes := mload(0x40)\n\n //zero out the 32 bytes slice we are about to return\n //we need to do it because Solidity does not garbage collect\n mstore(tempBytes, 0)\n\n mstore(0x40, add(tempBytes, 0x20))\n }\n }\n\n return tempBytes;\n }\n\n function slice(\n bytes memory _bytes,\n uint256 _start\n )\n internal\n pure\n returns (bytes memory)\n {\n if (_bytes.length - _start == 0) {\n return bytes('');\n }\n\n return slice(_bytes, _start, _bytes.length - _start);\n }\n\n function toBytes32PadLeft(\n bytes memory _bytes\n )\n internal\n pure\n returns (bytes32)\n {\n bytes32 ret;\n uint256 len = _bytes.length <= 32 ? _bytes.length : 32;\n assembly {\n ret := shr(mul(sub(32, len), 8), mload(add(_bytes, 32)))\n }\n return ret;\n }\n\n function toBytes32(\n bytes memory _bytes\n )\n internal\n pure\n returns (bytes32)\n {\n if (_bytes.length < 32) {\n bytes32 ret;\n assembly {\n ret := mload(add(_bytes, 32))\n }\n return ret;\n }\n\n return abi.decode(_bytes,(bytes32)); // will truncate if input length > 32 bytes\n }\n\n function toUint256(\n bytes memory _bytes\n )\n internal\n pure\n returns (uint256)\n {\n return uint256(toBytes32(_bytes));\n }\n\n function toUint24(bytes memory _bytes, uint256 _start) internal pure returns (uint24) {\n require(_start + 3 >= _start, \"toUint24_overflow\");\n require(_bytes.length >= _start + 3 , \"toUint24_outOfBounds\");\n uint24 tempUint;\n\n assembly {\n tempUint := mload(add(add(_bytes, 0x3), _start))\n }\n\n return tempUint;\n }\n\n function toUint8(bytes memory _bytes, uint256 _start) internal pure returns (uint8) {\n require(_start + 1 >= _start, \"toUint8_overflow\");\n require(_bytes.length >= _start + 1 , \"toUint8_outOfBounds\");\n uint8 tempUint;\n\n assembly {\n tempUint := mload(add(add(_bytes, 0x1), _start))\n }\n\n return tempUint;\n }\n\n function toAddress(bytes memory _bytes, uint256 _start) internal pure returns (address) {\n require(_start + 20 >= _start, \"toAddress_overflow\");\n require(_bytes.length >= _start + 20, \"toAddress_outOfBounds\");\n address tempAddress;\n\n assembly {\n tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000)\n }\n\n return tempAddress;\n }\n\n function toNibbles(\n bytes memory _bytes\n )\n internal\n pure\n returns (bytes memory)\n {\n bytes memory nibbles = new bytes(_bytes.length * 2);\n\n for (uint256 i = 0; i < _bytes.length; i++) {\n nibbles[i * 2] = _bytes[i] >> 4;\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\n }\n\n return nibbles;\n }\n\n function fromNibbles(\n bytes memory _bytes\n )\n internal\n pure\n returns (bytes memory)\n {\n bytes memory ret = new bytes(_bytes.length / 2);\n\n for (uint256 i = 0; i < ret.length; i++) {\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\n }\n\n return ret;\n }\n\n function equal(\n bytes memory _bytes,\n bytes memory _other\n )\n internal\n pure\n returns (bool)\n {\n return keccak256(_bytes) == keccak256(_other);\n }\n}\n" - }, - "contracts/optimistic-ethereum/libraries/utils/Lib_Bytes32Utils.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/**\n * @title Lib_Byte32Utils\n */\nlibrary Lib_Bytes32Utils {\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \"true.\"\n * @param _in Input bytes32 value.\n * @return Bytes32 as a boolean.\n */\n function toBool(\n bytes32 _in\n )\n internal\n pure\n returns (\n bool\n )\n {\n return _in != 0;\n }\n\n /**\n * Converts a boolean to a bytes32 value.\n * @param _in Input boolean value.\n * @return Boolean as a bytes32.\n */\n function fromBool(\n bool _in\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n return bytes32(uint256(_in ? 1 : 0));\n }\n\n /**\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\n * @param _in Input bytes32 value.\n * @return Bytes32 as an address.\n */\n function toAddress(\n bytes32 _in\n )\n internal\n pure\n returns (\n address\n )\n {\n return address(uint160(uint256(_in)));\n }\n\n /**\n * Converts an address to a bytes32.\n * @param _in Input address value.\n * @return Address as a bytes32.\n */\n function fromAddress(\n address _in\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n return bytes32(uint256(_in));\n }\n\n /**\n * Removes the leading zeros from a bytes32 value and returns a new (smaller) bytes value.\n * @param _in Input bytes32 value.\n * @return Bytes32 without any leading zeros.\n */\n function removeLeadingZeros(\n bytes32 _in\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n bytes memory out;\n\n assembly {\n // Figure out how many leading zero bytes to remove.\n let shift := 0\n for { let i := 0 } and(lt(i, 32), eq(byte(i, _in), 0)) { i := add(i, 1) } {\n shift := add(shift, 1)\n }\n\n // Reserve some space for our output and fix the free memory pointer.\n out := mload(0x40)\n mstore(0x40, add(out, 0x40))\n\n // Shift the value and store it into the output bytes.\n mstore(add(out, 0x20), shl(mul(shift, 8), _in))\n\n // Store the new size (with leading zero bytes removed) in the output byte size.\n mstore(out, sub(32, shift))\n }\n\n return out;\n }\n}\n" - }, - "contracts/optimistic-ethereum/libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Library Imports */\nimport { Lib_ErrorUtils } from \"../utils/Lib_ErrorUtils.sol\";\n\n/**\n * @title Lib_SafeExecutionManagerWrapper\n * @dev The Safe Execution Manager Wrapper provides functions which facilitate writing OVM safe \n * code using the standard solidity compiler, by routing all its operations through the Execution \n * Manager.\n * \n * Compiler used: solc\n * Runtime target: OVM\n */\nlibrary Lib_SafeExecutionManagerWrapper {\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Performs a safe ovmCALL.\n * @param _gasLimit Gas limit for the call.\n * @param _target Address to call.\n * @param _calldata Data to send to the call.\n * @return _success Whether or not the call reverted.\n * @return _returndata Data returned by the call.\n */\n function safeCALL(\n uint256 _gasLimit,\n address _target,\n bytes memory _calldata\n )\n internal\n returns (\n bool _success,\n bytes memory _returndata\n )\n {\n bytes memory returndata = _safeExecutionManagerInteraction(\n abi.encodeWithSignature(\n \"ovmCALL(uint256,address,bytes)\",\n _gasLimit,\n _target,\n _calldata\n )\n );\n\n return abi.decode(returndata, (bool, bytes));\n }\n\n /**\n * Performs a safe ovmDELEGATECALL.\n * @param _gasLimit Gas limit for the call.\n * @param _target Address to call.\n * @param _calldata Data to send to the call.\n * @return _success Whether or not the call reverted.\n * @return _returndata Data returned by the call.\n */\n function safeDELEGATECALL(\n uint256 _gasLimit,\n address _target,\n bytes memory _calldata\n )\n internal\n returns (\n bool _success,\n bytes memory _returndata\n )\n {\n bytes memory returndata = _safeExecutionManagerInteraction(\n abi.encodeWithSignature(\n \"ovmDELEGATECALL(uint256,address,bytes)\",\n _gasLimit,\n _target,\n _calldata\n )\n );\n\n return abi.decode(returndata, (bool, bytes));\n }\n\n /**\n * Performs a safe ovmCREATE call.\n * @param _gasLimit Gas limit for the creation.\n * @param _bytecode Code for the new contract.\n * @return _contract Address of the created contract.\n */\n function safeCREATE(\n uint256 _gasLimit,\n bytes memory _bytecode\n )\n internal\n returns (\n address,\n bytes memory\n )\n {\n bytes memory returndata = _safeExecutionManagerInteraction(\n _gasLimit,\n abi.encodeWithSignature(\n \"ovmCREATE(bytes)\",\n _bytecode\n )\n );\n\n return abi.decode(returndata, (address, bytes));\n }\n\n /**\n * Performs a safe ovmEXTCODESIZE call.\n * @param _contract Address of the contract to query the size of.\n * @return _EXTCODESIZE Size of the requested contract in bytes.\n */\n function safeEXTCODESIZE(\n address _contract\n )\n internal\n returns (\n uint256 _EXTCODESIZE\n )\n {\n bytes memory returndata = _safeExecutionManagerInteraction(\n abi.encodeWithSignature(\n \"ovmEXTCODESIZE(address)\",\n _contract\n )\n );\n\n return abi.decode(returndata, (uint256));\n }\n\n /**\n * Performs a safe ovmCHAINID call.\n * @return _CHAINID Result of calling ovmCHAINID.\n */\n function safeCHAINID()\n internal\n returns (\n uint256 _CHAINID\n )\n {\n bytes memory returndata = _safeExecutionManagerInteraction(\n abi.encodeWithSignature(\n \"ovmCHAINID()\"\n )\n );\n\n return abi.decode(returndata, (uint256));\n }\n\n /**\n * Performs a safe ovmCALLER call.\n * @return _CALLER Result of calling ovmCALLER.\n */\n function safeCALLER()\n internal\n returns (\n address _CALLER\n )\n {\n bytes memory returndata = _safeExecutionManagerInteraction(\n abi.encodeWithSignature(\n \"ovmCALLER()\"\n )\n );\n\n return abi.decode(returndata, (address));\n }\n\n /**\n * Performs a safe ovmADDRESS call.\n * @return _ADDRESS Result of calling ovmADDRESS.\n */\n function safeADDRESS()\n internal\n returns (\n address _ADDRESS\n )\n {\n bytes memory returndata = _safeExecutionManagerInteraction(\n abi.encodeWithSignature(\n \"ovmADDRESS()\"\n )\n );\n\n return abi.decode(returndata, (address));\n }\n\n /**\n * Performs a safe ovmGETNONCE call.\n * @return _nonce Result of calling ovmGETNONCE.\n */\n function safeGETNONCE()\n internal\n returns (\n uint256 _nonce\n )\n {\n bytes memory returndata = _safeExecutionManagerInteraction(\n abi.encodeWithSignature(\n \"ovmGETNONCE()\"\n )\n );\n\n return abi.decode(returndata, (uint256));\n }\n\n /**\n * Performs a safe ovmINCREMENTNONCE call.\n */\n function safeINCREMENTNONCE()\n internal\n {\n _safeExecutionManagerInteraction(\n abi.encodeWithSignature(\n \"ovmINCREMENTNONCE()\"\n )\n );\n }\n\n /**\n * Performs a safe ovmCREATEEOA call.\n * @param _messageHash Message hash which was signed by EOA\n * @param _v v value of signature (0 or 1)\n * @param _r r value of signature\n * @param _s s value of signature\n */\n function safeCREATEEOA(\n bytes32 _messageHash,\n uint8 _v,\n bytes32 _r,\n bytes32 _s\n )\n internal\n {\n _safeExecutionManagerInteraction(\n abi.encodeWithSignature(\n \"ovmCREATEEOA(bytes32,uint8,bytes32,bytes32)\",\n _messageHash,\n _v,\n _r,\n _s\n )\n );\n }\n\n /**\n * Performs a safe REVERT.\n * @param _reason String revert reason to pass along with the REVERT.\n */\n function safeREVERT(\n string memory _reason\n )\n internal\n {\n _safeExecutionManagerInteraction(\n abi.encodeWithSignature(\n \"ovmREVERT(bytes)\",\n Lib_ErrorUtils.encodeRevertString(\n _reason\n )\n )\n );\n }\n\n /**\n * Performs a safe \"require\".\n * @param _condition Boolean condition that must be true or will revert.\n * @param _reason String revert reason to pass along with the REVERT.\n */\n function safeREQUIRE(\n bool _condition,\n string memory _reason\n )\n internal\n {\n if (!_condition) {\n safeREVERT(\n _reason\n );\n }\n }\n\n /**\n * Performs a safe ovmSLOAD call.\n */\n function safeSLOAD(\n bytes32 _key\n )\n internal\n returns (\n bytes32\n )\n {\n bytes memory returndata = _safeExecutionManagerInteraction(\n abi.encodeWithSignature(\n \"ovmSLOAD(bytes32)\",\n _key\n )\n );\n\n return abi.decode(returndata, (bytes32));\n }\n\n /**\n * Performs a safe ovmSSTORE call.\n */\n function safeSSTORE(\n bytes32 _key,\n bytes32 _value\n )\n internal\n {\n _safeExecutionManagerInteraction(\n abi.encodeWithSignature(\n \"ovmSSTORE(bytes32,bytes32)\",\n _key,\n _value\n )\n );\n }\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * Performs an ovm interaction and the necessary safety checks.\n * @param _gasLimit Gas limit for the interaction.\n * @param _calldata Data to send to the OVM_ExecutionManager (encoded with sighash).\n * @return _returndata Data sent back by the OVM_ExecutionManager.\n */\n function _safeExecutionManagerInteraction(\n uint256 _gasLimit,\n bytes memory _calldata\n )\n private\n returns (\n bytes memory _returndata\n )\n {\n address ovmExecutionManager = msg.sender;\n (\n bool success,\n bytes memory returndata\n ) = ovmExecutionManager.call{gas: _gasLimit}(_calldata);\n\n if (success == false) {\n assembly {\n revert(add(returndata, 0x20), mload(returndata))\n }\n } else if (returndata.length == 1) {\n assembly {\n return(0, 1)\n }\n } else {\n return returndata;\n }\n }\n\n function _safeExecutionManagerInteraction(\n bytes memory _calldata\n )\n private\n returns (\n bytes memory _returndata\n )\n {\n return _safeExecutionManagerInteraction(\n gasleft(),\n _calldata\n );\n }\n}\n" - }, - "contracts/optimistic-ethereum/libraries/utils/Lib_ErrorUtils.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/**\n * @title Lib_ErrorUtils\n */\nlibrary Lib_ErrorUtils {\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Encodes an error string into raw solidity-style revert data.\n * (i.e. ascii bytes, prefixed with bytes4(keccak(\"Error(string))\"))\n * Ref: https://docs.soliditylang.org/en/v0.8.2/control-structures.html?highlight=Error(string)#panic-via-assert-and-error-via-require\n * @param _reason Reason for the reversion.\n * @return Standard solidity revert data for the given reason.\n */\n function encodeRevertString(\n string memory _reason\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n return abi.encodeWithSignature(\n \"Error(string)\",\n _reason\n );\n }\n}\n" - }, - "contracts/optimistic-ethereum/OVM/accounts/OVM_ECDSAContractAccount.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Interface Imports */\nimport { iOVM_ECDSAContractAccount } from \"../../iOVM/accounts/iOVM_ECDSAContractAccount.sol\";\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_ECDSAUtils } from \"../../libraries/utils/Lib_ECDSAUtils.sol\";\nimport { Lib_SafeExecutionManagerWrapper } from \"../../libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\";\nimport { Lib_SafeMathWrapper } from \"../../libraries/wrappers/Lib_SafeMathWrapper.sol\";\n\n/**\n * @title OVM_ECDSAContractAccount\n * @dev The ECDSA Contract Account can be used as the implementation for a ProxyEOA deployed by the\n * ovmCREATEEOA operation. It enables backwards compatibility with Ethereum's Layer 1, by \n * providing eth_sign and EIP155 formatted transaction encodings.\n *\n * Compiler used: solc\n * Runtime target: OVM\n */\ncontract OVM_ECDSAContractAccount is iOVM_ECDSAContractAccount {\n\n /*************\n * Constants *\n *************/\n\n // TODO: should be the amount sufficient to cover the gas costs of all of the transactions up\n // to and including the CALL/CREATE which forms the entrypoint of the transaction.\n uint256 constant EXECUTION_VALIDATION_GAS_OVERHEAD = 25000;\n address constant ETH_ERC20_ADDRESS = 0x4200000000000000000000000000000000000006;\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Executes a signed transaction.\n * @param _transaction Signed EOA transaction.\n * @param _signatureType Hashing scheme used for the transaction (e.g., ETH signed message).\n * @param _v Signature `v` parameter.\n * @param _r Signature `r` parameter.\n * @param _s Signature `s` parameter.\n * @return Whether or not the call returned (rather than reverted).\n * @return Data returned by the call.\n */\n function execute(\n bytes memory _transaction,\n Lib_OVMCodec.EOASignatureType _signatureType,\n uint8 _v,\n bytes32 _r,\n bytes32 _s\n )\n override\n public\n returns (\n bool,\n bytes memory\n )\n {\n bool isEthSign = _signatureType == Lib_OVMCodec.EOASignatureType.ETH_SIGNED_MESSAGE;\n\n // Address of this contract within the ovm (ovmADDRESS) should be the same as the\n // recovered address of the user who signed this message. This is how we manage to shim\n // account abstraction even though the user isn't a contract.\n // Need to make sure that the transaction nonce is right and bump it if so.\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(\n Lib_ECDSAUtils.recover(\n _transaction,\n isEthSign,\n _v,\n _r,\n _s\n ) == Lib_SafeExecutionManagerWrapper.safeADDRESS(),\n \"Signature provided for EOA transaction execution is invalid.\"\n );\n\n Lib_OVMCodec.EIP155Transaction memory decodedTx = Lib_OVMCodec.decodeEIP155Transaction(_transaction, isEthSign);\n\n // Need to make sure that the transaction chainId is correct.\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(\n decodedTx.chainId == Lib_SafeExecutionManagerWrapper.safeCHAINID(),\n \"Transaction chainId does not match expected OVM chainId.\"\n );\n\n // Need to make sure that the transaction nonce is right.\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(\n decodedTx.nonce == Lib_SafeExecutionManagerWrapper.safeGETNONCE(),\n \"Transaction nonce does not match the expected nonce.\"\n );\n\n // TEMPORARY: Disable gas checks for mainnet.\n // // Need to make sure that the gas is sufficient to execute the transaction.\n // Lib_SafeExecutionManagerWrapper.safeREQUIRE(\n // gasleft() >= Lib_SafeMathWrapper.add(decodedTx.gasLimit, EXECUTION_VALIDATION_GAS_OVERHEAD),\n // \"Gas is not sufficient to execute the transaction.\"\n // );\n\n // Transfer fee to relayer.\n address relayer = Lib_SafeExecutionManagerWrapper.safeCALLER();\n uint256 fee = Lib_SafeMathWrapper.mul(decodedTx.gasLimit, decodedTx.gasPrice);\n (bool success, ) = Lib_SafeExecutionManagerWrapper.safeCALL(\n gasleft(),\n ETH_ERC20_ADDRESS,\n abi.encodeWithSignature(\"transfer(address,uint256)\", relayer, fee)\n );\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(\n success == true,\n \"Fee was not transferred to relayer.\"\n );\n\n // Contract creations are signalled by sending a transaction to the zero address.\n if (decodedTx.to == address(0)) {\n (address created, bytes memory revertData) = Lib_SafeExecutionManagerWrapper.safeCREATE(\n gasleft(),\n decodedTx.data\n );\n\n // Return true if the contract creation succeeded, false w/ revertData otherwise.\n if (created != address(0)) {\n return (true, abi.encode(created));\n } else {\n return (false, revertData);\n }\n } else {\n // We only want to bump the nonce for `ovmCALL` because `ovmCREATE` automatically bumps\n // the nonce of the calling account. Normally an EOA would bump the nonce for both\n // cases, but since this is a contract we'd end up bumping the nonce twice.\n Lib_SafeExecutionManagerWrapper.safeINCREMENTNONCE();\n\n return Lib_SafeExecutionManagerWrapper.safeCALL(\n gasleft(),\n decodedTx.to,\n decodedTx.data\n );\n }\n }\n}\n" - }, - "contracts/optimistic-ethereum/libraries/utils/Lib_ECDSAUtils.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/**\n * @title Lib_ECDSAUtils\n */\nlibrary Lib_ECDSAUtils {\n\n /**************************************\n * Internal Functions: ECDSA Recovery *\n **************************************/\n\n /**\n * Recovers a signed address given a message and signature.\n * @param _message Message that was originally signed.\n * @param _isEthSignedMessage Whether or not the user used the `Ethereum Signed Message` prefix.\n * @param _v Signature `v` parameter.\n * @param _r Signature `r` parameter.\n * @param _s Signature `s` parameter.\n * @return _sender Signer address.\n */\n function recover(\n bytes memory _message,\n bool _isEthSignedMessage,\n uint8 _v,\n bytes32 _r,\n bytes32 _s\n )\n internal\n pure\n returns (\n address _sender\n )\n {\n bytes32 messageHash = getMessageHash(_message, _isEthSignedMessage);\n\n return ecrecover(\n messageHash,\n _v + 27,\n _r,\n _s\n );\n }\n\n function getMessageHash(\n bytes memory _message,\n bool _isEthSignedMessage\n )\n internal\n pure\n returns (bytes32) {\n if (_isEthSignedMessage) {\n return getEthSignedMessageHash(_message);\n }\n return getNativeMessageHash(_message);\n }\n\n\n /*************************************\n * Private Functions: ECDSA Recovery *\n *************************************/\n\n /**\n * Gets the native message hash (simple keccak256) for a message.\n * @param _message Message to hash.\n * @return _messageHash Native message hash.\n */\n function getNativeMessageHash(\n bytes memory _message\n )\n private\n pure\n returns (\n bytes32 _messageHash\n )\n {\n return keccak256(_message);\n }\n\n /**\n * Gets the hash of a message with the `Ethereum Signed Message` prefix.\n * @param _message Message to hash.\n * @return _messageHash Prefixed message hash.\n */\n function getEthSignedMessageHash(\n bytes memory _message\n )\n private\n pure\n returns (\n bytes32 _messageHash\n )\n {\n bytes memory prefix = \"\\x19Ethereum Signed Message:\\n32\";\n bytes32 messageHash = keccak256(_message);\n return keccak256(abi.encodePacked(prefix, messageHash));\n }\n}" - }, - "contracts/optimistic-ethereum/libraries/wrappers/Lib_SafeMathWrapper.sol": { - "content": "// SPDX-License-Identifier: MIT\n// Pulled from @openzeppelin/contracts/math/SafeMath.sol\n// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Library Imports */\nimport { Lib_SafeExecutionManagerWrapper } from \"./Lib_SafeExecutionManagerWrapper.sol\";\n\n/**\n * @title Lib_SafeMathWrapper\n */\n\n/**\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\n * checks.\n *\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\n * in bugs, because programmers usually assume that an overflow raises an\n * error, which is the standard behavior in high level programming languages.\n * `SafeMath` restores this intuition by reverting the transaction when an\n * operation overflows.\n *\n * Using this library instead of the unchecked operations eliminates an entire\n * class of bugs, so it's recommended to use it always.\n */\n\nlibrary Lib_SafeMathWrapper {\n /**\n * @dev Returns the addition of two unsigned integers, reverting on\n * overflow.\n *\n * Counterpart to Solidity's `+` operator.\n *\n * Requirements:\n *\n * - Addition cannot overflow.\n */\n function add(uint256 a, uint256 b) internal returns (uint256) {\n uint256 c = a + b;\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(c >= a, \"Lib_SafeMathWrapper: addition overflow\");\n\n return c;\n }\n\n /**\n * @dev Returns the subtraction of two unsigned integers, reverting on\n * overflow (when the result is negative).\n *\n * Counterpart to Solidity's `-` operator.\n *\n * Requirements:\n *\n * - Subtraction cannot overflow.\n */\n function sub(uint256 a, uint256 b) internal returns (uint256) {\n return sub(a, b, \"Lib_SafeMathWrapper: subtraction overflow\");\n }\n\n /**\n * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\n * overflow (when the result is negative).\n *\n * Counterpart to Solidity's `-` operator.\n *\n * Requirements:\n *\n * - Subtraction cannot overflow.\n */\n function sub(uint256 a, uint256 b, string memory errorMessage) internal returns (uint256) {\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(b <= a, errorMessage);\n uint256 c = a - b;\n\n return c;\n }\n\n /**\n * @dev Returns the multiplication of two unsigned integers, reverting on\n * overflow.\n *\n * Counterpart to Solidity's `*` operator.\n *\n * Requirements:\n *\n * - Multiplication cannot overflow.\n */\n function mul(uint256 a, uint256 b) internal returns (uint256) {\n // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\n // benefit is lost if 'b' is also tested.\n // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\n if (a == 0) {\n return 0;\n }\n\n uint256 c = a * b;\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(c / a == b, \"Lib_SafeMathWrapper: multiplication overflow\");\n\n return c;\n }\n\n /**\n * @dev Returns the integer division of two unsigned integers. Reverts on\n * division by zero. The result is rounded towards zero.\n *\n * Counterpart to Solidity's `/` operator. Note: this function uses a\n * `revert` opcode (which leaves remaining gas untouched) while Solidity\n * uses an invalid opcode to revert (consuming all remaining gas).\n *\n * Requirements:\n *\n * - The divisor cannot be zero.\n */\n function div(uint256 a, uint256 b) internal returns (uint256) {\n return div(a, b, \"Lib_SafeMathWrapper: division by zero\");\n }\n\n /**\n * @dev Returns the integer division of two unsigned integers. Reverts with custom message on\n * division by zero. The result is rounded towards zero.\n *\n * Counterpart to Solidity's `/` operator. Note: this function uses a\n * `revert` opcode (which leaves remaining gas untouched) while Solidity\n * uses an invalid opcode to revert (consuming all remaining gas).\n *\n * Requirements:\n *\n * - The divisor cannot be zero.\n */\n function div(uint256 a, uint256 b, string memory errorMessage) internal returns (uint256) {\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(b > 0, errorMessage);\n uint256 c = a / b;\n // assert(a == b * c + a % b); // There is no case in which this doesn't hold\n\n return c;\n }\n\n /**\n * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\n * Reverts when dividing by zero.\n *\n * Counterpart to Solidity's `%` operator. This function uses a `revert`\n * opcode (which leaves remaining gas untouched) while Solidity uses an\n * invalid opcode to revert (consuming all remaining gas).\n *\n * Requirements:\n *\n * - The divisor cannot be zero.\n */\n function mod(uint256 a, uint256 b) internal returns (uint256) {\n return mod(a, b, \"Lib_SafeMathWrapper: modulo by zero\");\n }\n\n /**\n * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\n * Reverts with custom message when dividing by zero.\n *\n * Counterpart to Solidity's `%` operator. This function uses a `revert`\n * opcode (which leaves remaining gas untouched) while Solidity uses an\n * invalid opcode to revert (consuming all remaining gas).\n *\n * Requirements:\n *\n * - The divisor cannot be zero.\n */\n function mod(uint256 a, uint256 b, string memory errorMessage) internal returns (uint256) {\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(b != 0, errorMessage);\n return a % b;\n }\n}" - }, - "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol": { - "content": "// SPDX-License-Identifier: MIT\n// @unsupported: ovm\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\nimport { Lib_EthUtils } from \"../../libraries/utils/Lib_EthUtils.sol\";\nimport { Lib_ErrorUtils } from \"../../libraries/utils/Lib_ErrorUtils.sol\";\n\n/* Interface Imports */\nimport { iOVM_ExecutionManager } from \"../../iOVM/execution/iOVM_ExecutionManager.sol\";\nimport { iOVM_StateManager } from \"../../iOVM/execution/iOVM_StateManager.sol\";\nimport { iOVM_SafetyChecker } from \"../../iOVM/execution/iOVM_SafetyChecker.sol\";\n\n/* Contract Imports */\nimport { OVM_ECDSAContractAccount } from \"../accounts/OVM_ECDSAContractAccount.sol\";\nimport { OVM_ProxyEOA } from \"../accounts/OVM_ProxyEOA.sol\";\nimport { OVM_DeployerWhitelist } from \"../predeploys/OVM_DeployerWhitelist.sol\";\n\n/**\n * @title OVM_ExecutionManager\n * @dev The Execution Manager (EM) is the core of our OVM implementation, and provides a sandboxed\n * environment allowing us to execute OVM transactions deterministically on either Layer 1 or\n * Layer 2.\n * The EM's run() function is the first function called during the execution of any\n * transaction on L2.\n * For each context-dependent EVM operation the EM has a function which implements a corresponding\n * OVM operation, which will read state from the State Manager contract.\n * The EM relies on the Safety Checker to verify that code deployed to Layer 2 does not contain any\n * context-dependent operations.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract OVM_ExecutionManager is iOVM_ExecutionManager, Lib_AddressResolver {\n\n /********************************\n * External Contract References *\n ********************************/\n\n iOVM_SafetyChecker internal ovmSafetyChecker;\n iOVM_StateManager internal ovmStateManager;\n\n\n /*******************************\n * Execution Context Variables *\n *******************************/\n\n GasMeterConfig internal gasMeterConfig;\n GlobalContext internal globalContext;\n TransactionContext internal transactionContext;\n MessageContext internal messageContext;\n TransactionRecord internal transactionRecord;\n MessageRecord internal messageRecord;\n\n\n /**************************\n * Gas Metering Constants *\n **************************/\n\n address constant GAS_METADATA_ADDRESS = 0x06a506A506a506A506a506a506A506A506A506A5;\n uint256 constant NUISANCE_GAS_SLOAD = 20000;\n uint256 constant NUISANCE_GAS_SSTORE = 20000;\n uint256 constant MIN_NUISANCE_GAS_PER_CONTRACT = 30000;\n uint256 constant NUISANCE_GAS_PER_CONTRACT_BYTE = 100;\n uint256 constant MIN_GAS_FOR_INVALID_STATE_ACCESS = 30000;\n\n /**************************\n * Default Context Values *\n **************************/\n\n uint256 constant DEFAULT_UINT256 = 0xdefa017defa017defa017defa017defa017defa017defa017defa017defa017d;\n address constant DEFAULT_ADDRESS = 0xdEfa017defA017DeFA017DEfa017DeFA017DeFa0;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n constructor(\n address _libAddressManager,\n GasMeterConfig memory _gasMeterConfig,\n GlobalContext memory _globalContext\n )\n Lib_AddressResolver(_libAddressManager)\n {\n ovmSafetyChecker = iOVM_SafetyChecker(resolve(\"OVM_SafetyChecker\"));\n gasMeterConfig = _gasMeterConfig;\n globalContext = _globalContext;\n _resetContext();\n }\n\n\n /**********************\n * Function Modifiers *\n **********************/\n\n /**\n * Applies dynamically-sized refund to a transaction to account for the difference in execution\n * between L1 and L2, so that the overall cost of the ovmOPCODE is fixed.\n * @param _cost Desired gas cost for the function after the refund.\n */\n modifier netGasCost(\n uint256 _cost\n ) {\n uint256 gasProvided = gasleft();\n _;\n uint256 gasUsed = gasProvided - gasleft();\n\n // We want to refund everything *except* the specified cost.\n if (_cost < gasUsed) {\n transactionRecord.ovmGasRefund += gasUsed - _cost;\n }\n }\n\n /**\n * Applies a fixed-size gas refund to a transaction to account for the difference in execution\n * between L1 and L2, so that the overall cost of an ovmOPCODE can be lowered.\n * @param _discount Amount of gas cost to refund for the ovmOPCODE.\n */\n modifier fixedGasDiscount(\n uint256 _discount\n ) {\n uint256 gasProvided = gasleft();\n _;\n uint256 gasUsed = gasProvided - gasleft();\n\n // We want to refund the specified _discount, unless this risks underflow.\n if (_discount < gasUsed) {\n transactionRecord.ovmGasRefund += _discount;\n } else {\n // refund all we can without risking underflow.\n transactionRecord.ovmGasRefund += gasUsed;\n }\n }\n\n /**\n * Makes sure we're not inside a static context.\n */\n modifier notStatic() {\n if (messageContext.isStatic == true) {\n _revertWithFlag(RevertFlag.STATIC_VIOLATION);\n }\n _;\n }\n\n\n /************************************\n * Transaction Execution Entrypoint *\n ************************************/\n\n /**\n * Starts the execution of a transaction via the OVM_ExecutionManager.\n * @param _transaction Transaction data to be executed.\n * @param _ovmStateManager iOVM_StateManager implementation providing account state.\n */\n function run(\n Lib_OVMCodec.Transaction memory _transaction,\n address _ovmStateManager\n )\n override\n public\n {\n // Make sure that run() is not re-enterable. This condition should always be satisfied\n // Once run has been called once, due to the behavior of _isValidInput().\n if (transactionContext.ovmNUMBER != DEFAULT_UINT256) {\n return;\n }\n\n // Store our OVM_StateManager instance (significantly easier than attempting to pass the\n // address around in calldata).\n ovmStateManager = iOVM_StateManager(_ovmStateManager);\n\n // Make sure this function can't be called by anyone except the owner of the\n // OVM_StateManager (expected to be an OVM_StateTransitioner). We can revert here because\n // this would make the `run` itself invalid.\n require(\n // This method may return false during fraud proofs, but always returns true in L2 nodes' State Manager precompile.\n ovmStateManager.isAuthenticated(msg.sender),\n \"Only authenticated addresses in ovmStateManager can call this function\"\n );\n\n // Initialize the execution context, must be initialized before we perform any gas metering\n // or we'll throw a nuisance gas error.\n _initContext(_transaction);\n\n // TEMPORARY: Gas metering is disabled for minnet.\n // // Check whether we need to start a new epoch, do so if necessary.\n // _checkNeedsNewEpoch(_transaction.timestamp);\n\n // Make sure the transaction's gas limit is valid. We don't revert here because we reserve\n // reverts for INVALID_STATE_ACCESS.\n if (_isValidInput(_transaction) == false) {\n _resetContext();\n return;\n }\n\n // TEMPORARY: Gas metering is disabled for minnet.\n // // Check gas right before the call to get total gas consumed by OVM transaction.\n // uint256 gasProvided = gasleft();\n\n // Run the transaction, make sure to meter the gas usage.\n ovmCALL(\n _transaction.gasLimit - gasMeterConfig.minTransactionGasLimit,\n _transaction.entrypoint,\n _transaction.data\n );\n\n // TEMPORARY: Gas metering is disabled for minnet.\n // // Update the cumulative gas based on the amount of gas used.\n // uint256 gasUsed = gasProvided - gasleft();\n // _updateCumulativeGas(gasUsed, _transaction.l1QueueOrigin);\n\n // Wipe the execution context.\n _resetContext();\n }\n\n\n /******************************\n * Opcodes: Execution Context *\n ******************************/\n\n /**\n * @notice Overrides CALLER.\n * @return _CALLER Address of the CALLER within the current message context.\n */\n function ovmCALLER()\n override\n public\n view\n returns (\n address _CALLER\n )\n {\n return messageContext.ovmCALLER;\n }\n\n /**\n * @notice Overrides ADDRESS.\n * @return _ADDRESS Active ADDRESS within the current message context.\n */\n function ovmADDRESS()\n override\n public\n view\n returns (\n address _ADDRESS\n )\n {\n return messageContext.ovmADDRESS;\n }\n\n /**\n * @notice Overrides TIMESTAMP.\n * @return _TIMESTAMP Value of the TIMESTAMP within the transaction context.\n */\n function ovmTIMESTAMP()\n override\n public\n view\n returns (\n uint256 _TIMESTAMP\n )\n {\n return transactionContext.ovmTIMESTAMP;\n }\n\n /**\n * @notice Overrides NUMBER.\n * @return _NUMBER Value of the NUMBER within the transaction context.\n */\n function ovmNUMBER()\n override\n public\n view\n returns (\n uint256 _NUMBER\n )\n {\n return transactionContext.ovmNUMBER;\n }\n\n /**\n * @notice Overrides GASLIMIT.\n * @return _GASLIMIT Value of the block's GASLIMIT within the transaction context.\n */\n function ovmGASLIMIT()\n override\n public\n view\n returns (\n uint256 _GASLIMIT\n )\n {\n return transactionContext.ovmGASLIMIT;\n }\n\n /**\n * @notice Overrides CHAINID.\n * @return _CHAINID Value of the chain's CHAINID within the global context.\n */\n function ovmCHAINID()\n override\n public\n view\n returns (\n uint256 _CHAINID\n )\n {\n return globalContext.ovmCHAINID;\n }\n\n /*********************************\n * Opcodes: L2 Execution Context *\n *********************************/\n\n /**\n * @notice Specifies from which L1 rollup queue this transaction originated from.\n * @return _queueOrigin Address of the ovmL1QUEUEORIGIN within the current message context.\n */\n function ovmL1QUEUEORIGIN()\n override\n public\n view\n returns (\n Lib_OVMCodec.QueueOrigin _queueOrigin\n )\n {\n return transactionContext.ovmL1QUEUEORIGIN;\n }\n\n /**\n * @notice Specifies which L1 account, if any, sent this transaction by calling enqueue().\n * @return _l1TxOrigin Address of the account which sent the tx into L2 from L1.\n */\n function ovmL1TXORIGIN()\n override\n public\n view\n returns (\n address _l1TxOrigin\n )\n {\n return transactionContext.ovmL1TXORIGIN;\n }\n\n /********************\n * Opcodes: Halting *\n ********************/\n\n /**\n * @notice Overrides REVERT.\n * @param _data Bytes data to pass along with the REVERT.\n */\n function ovmREVERT(\n bytes memory _data\n )\n override\n public\n {\n _revertWithFlag(RevertFlag.INTENTIONAL_REVERT, _data);\n }\n\n\n /******************************\n * Opcodes: Contract Creation *\n ******************************/\n\n /**\n * @notice Overrides CREATE.\n * @param _bytecode Code to be used to CREATE a new contract.\n * @return Address of the created contract.\n * @return Revert data, if and only if the creation threw an exception.\n */\n function ovmCREATE(\n bytes memory _bytecode\n )\n override\n public\n notStatic\n fixedGasDiscount(40000)\n returns (\n address,\n bytes memory\n )\n {\n // Creator is always the current ADDRESS.\n address creator = ovmADDRESS();\n\n // Check that the deployer is whitelisted, or\n // that arbitrary contract deployment has been enabled.\n _checkDeployerAllowed(creator);\n\n // Generate the correct CREATE address.\n address contractAddress = Lib_EthUtils.getAddressForCREATE(\n creator,\n _getAccountNonce(creator)\n );\n\n return _createContract(\n contractAddress,\n _bytecode\n );\n }\n\n /**\n * @notice Overrides CREATE2.\n * @param _bytecode Code to be used to CREATE2 a new contract.\n * @param _salt Value used to determine the contract's address.\n * @return Address of the created contract.\n * @return Revert data, if and only if the creation threw an exception.\n */\n function ovmCREATE2(\n bytes memory _bytecode,\n bytes32 _salt\n )\n override\n public\n notStatic\n fixedGasDiscount(40000)\n returns (\n address,\n bytes memory\n )\n {\n // Creator is always the current ADDRESS.\n address creator = ovmADDRESS();\n\n // Check that the deployer is whitelisted, or\n // that arbitrary contract deployment has been enabled.\n _checkDeployerAllowed(creator);\n\n // Generate the correct CREATE2 address.\n address contractAddress = Lib_EthUtils.getAddressForCREATE2(\n creator,\n _bytecode,\n _salt\n );\n\n return _createContract(\n contractAddress,\n _bytecode\n );\n }\n\n\n /*******************************\n * Account Abstraction Opcodes *\n ******************************/\n\n /**\n * Retrieves the nonce of the current ovmADDRESS.\n * @return _nonce Nonce of the current contract.\n */\n function ovmGETNONCE()\n override\n public\n returns (\n uint256 _nonce\n )\n {\n return _getAccountNonce(ovmADDRESS());\n }\n\n /**\n * Bumps the nonce of the current ovmADDRESS by one.\n */\n function ovmINCREMENTNONCE()\n override\n public\n notStatic\n {\n address account = ovmADDRESS();\n uint256 nonce = _getAccountNonce(account);\n\n // Prevent overflow.\n if (nonce + 1 > nonce) {\n _setAccountNonce(account, nonce + 1);\n }\n }\n\n /**\n * Creates a new EOA contract account, for account abstraction.\n * @dev Essentially functions like ovmCREATE or ovmCREATE2, but we can bypass a lot of checks\n * because the contract we're creating is trusted (no need to do safety checking or to\n * handle unexpected reverts). Doesn't need to return an address because the address is\n * assumed to be the user's actual address.\n * @param _messageHash Hash of a message signed by some user, for verification.\n * @param _v Signature `v` parameter.\n * @param _r Signature `r` parameter.\n * @param _s Signature `s` parameter.\n */\n function ovmCREATEEOA(\n bytes32 _messageHash,\n uint8 _v,\n bytes32 _r,\n bytes32 _s\n )\n override\n public\n notStatic\n {\n // Recover the EOA address from the message hash and signature parameters. Since we do the\n // hashing in advance, we don't have handle different message hashing schemes. Even if this\n // function were to return the wrong address (rather than explicitly returning the zero\n // address), the rest of the transaction would simply fail (since there's no EOA account to\n // actually execute the transaction).\n address eoa = ecrecover(\n _messageHash,\n _v + 27,\n _r,\n _s\n );\n\n // Invalid signature is a case we proactively handle with a revert. We could alternatively\n // have this function return a `success` boolean, but this is just easier.\n if (eoa == address(0)) {\n ovmREVERT(bytes(\"Signature provided for EOA contract creation is invalid.\"));\n }\n\n // If the user already has an EOA account, then there's no need to perform this operation.\n if (_hasEmptyAccount(eoa) == false) {\n return;\n }\n\n // We always need to initialize the contract with the default account values.\n _initPendingAccount(eoa);\n\n // Temporarily set the current address so it's easier to access on L2.\n address prevADDRESS = messageContext.ovmADDRESS;\n messageContext.ovmADDRESS = eoa;\n\n // Now actually create the account and get its bytecode. We're not worried about reverts\n // (other than out of gas, which we can't capture anyway) because this contract is trusted.\n OVM_ProxyEOA proxyEOA = new OVM_ProxyEOA(0x4200000000000000000000000000000000000003);\n\n // Reset the address now that we're done deploying.\n messageContext.ovmADDRESS = prevADDRESS;\n\n // Commit the account with its final values.\n _commitPendingAccount(\n eoa,\n address(proxyEOA),\n keccak256(Lib_EthUtils.getCode(address(proxyEOA)))\n );\n\n _setAccountNonce(eoa, 0);\n }\n\n\n /*********************************\n * Opcodes: Contract Interaction *\n *********************************/\n\n /**\n * @notice Overrides CALL.\n * @param _gasLimit Amount of gas to be passed into this call.\n * @param _address Address of the contract to call.\n * @param _calldata Data to send along with the call.\n * @return _success Whether or not the call returned (rather than reverted).\n * @return _returndata Data returned by the call.\n */\n function ovmCALL(\n uint256 _gasLimit,\n address _address,\n bytes memory _calldata\n )\n override\n public\n fixedGasDiscount(100000)\n returns (\n bool _success,\n bytes memory _returndata\n )\n {\n // CALL updates the CALLER and ADDRESS.\n MessageContext memory nextMessageContext = messageContext;\n nextMessageContext.ovmCALLER = nextMessageContext.ovmADDRESS;\n nextMessageContext.ovmADDRESS = _address;\n\n return _callContract(\n nextMessageContext,\n _gasLimit,\n _address,\n _calldata\n );\n }\n\n /**\n * @notice Overrides STATICCALL.\n * @param _gasLimit Amount of gas to be passed into this call.\n * @param _address Address of the contract to call.\n * @param _calldata Data to send along with the call.\n * @return _success Whether or not the call returned (rather than reverted).\n * @return _returndata Data returned by the call.\n */\n function ovmSTATICCALL(\n uint256 _gasLimit,\n address _address,\n bytes memory _calldata\n )\n override\n public\n fixedGasDiscount(80000)\n returns (\n bool _success,\n bytes memory _returndata\n )\n {\n // STATICCALL updates the CALLER, updates the ADDRESS, and runs in a static context.\n MessageContext memory nextMessageContext = messageContext;\n nextMessageContext.ovmCALLER = nextMessageContext.ovmADDRESS;\n nextMessageContext.ovmADDRESS = _address;\n nextMessageContext.isStatic = true;\n\n return _callContract(\n nextMessageContext,\n _gasLimit,\n _address,\n _calldata\n );\n }\n\n /**\n * @notice Overrides DELEGATECALL.\n * @param _gasLimit Amount of gas to be passed into this call.\n * @param _address Address of the contract to call.\n * @param _calldata Data to send along with the call.\n * @return _success Whether or not the call returned (rather than reverted).\n * @return _returndata Data returned by the call.\n */\n function ovmDELEGATECALL(\n uint256 _gasLimit,\n address _address,\n bytes memory _calldata\n )\n override\n public\n fixedGasDiscount(40000)\n returns (\n bool _success,\n bytes memory _returndata\n )\n {\n // DELEGATECALL does not change anything about the message context.\n MessageContext memory nextMessageContext = messageContext;\n\n return _callContract(\n nextMessageContext,\n _gasLimit,\n _address,\n _calldata\n );\n }\n\n\n /************************************\n * Opcodes: Contract Storage Access *\n ************************************/\n\n /**\n * @notice Overrides SLOAD.\n * @param _key 32 byte key of the storage slot to load.\n * @return _value 32 byte value of the requested storage slot.\n */\n function ovmSLOAD(\n bytes32 _key\n )\n override\n public\n netGasCost(40000)\n returns (\n bytes32 _value\n )\n {\n // We always SLOAD from the storage of ADDRESS.\n address contractAddress = ovmADDRESS();\n\n return _getContractStorage(\n contractAddress,\n _key\n );\n }\n\n /**\n * @notice Overrides SSTORE.\n * @param _key 32 byte key of the storage slot to set.\n * @param _value 32 byte value for the storage slot.\n */\n function ovmSSTORE(\n bytes32 _key,\n bytes32 _value\n )\n override\n public\n notStatic\n netGasCost(60000)\n {\n // We always SSTORE to the storage of ADDRESS.\n address contractAddress = ovmADDRESS();\n\n _putContractStorage(\n contractAddress,\n _key,\n _value\n );\n }\n\n\n /*********************************\n * Opcodes: Contract Code Access *\n *********************************/\n\n /**\n * @notice Overrides EXTCODECOPY.\n * @param _contract Address of the contract to copy code from.\n * @param _offset Offset in bytes from the start of contract code to copy beyond.\n * @param _length Total number of bytes to copy from the contract's code.\n * @return _code Bytes of code copied from the requested contract.\n */\n function ovmEXTCODECOPY(\n address _contract,\n uint256 _offset,\n uint256 _length\n )\n override\n public\n returns (\n bytes memory _code\n )\n {\n // `ovmEXTCODECOPY` is the only overridden opcode capable of producing exactly one byte of\n // return data. By blocking reads of one byte, we're able to use the condition that an\n // OVM_ExecutionManager function return value having a length of exactly one byte indicates\n // an error without an explicit revert. If users were able to read a single byte, they\n // could forcibly trigger behavior that should only be available to this contract.\n uint256 length = _length == 1 ? 2 : _length;\n\n return Lib_EthUtils.getCode(\n _getAccountEthAddress(_contract),\n _offset,\n length\n );\n }\n\n /**\n * @notice Overrides EXTCODESIZE.\n * @param _contract Address of the contract to query the size of.\n * @return _EXTCODESIZE Size of the requested contract in bytes.\n */\n function ovmEXTCODESIZE(\n address _contract\n )\n override\n public\n returns (\n uint256 _EXTCODESIZE\n )\n {\n return Lib_EthUtils.getCodeSize(\n _getAccountEthAddress(_contract)\n );\n }\n\n /**\n * @notice Overrides EXTCODEHASH.\n * @param _contract Address of the contract to query the hash of.\n * @return _EXTCODEHASH Hash of the requested contract.\n */\n function ovmEXTCODEHASH(\n address _contract\n )\n override\n public\n returns (\n bytes32 _EXTCODEHASH\n )\n {\n return Lib_EthUtils.getCodeHash(\n _getAccountEthAddress(_contract)\n );\n }\n\n /***************************************\n * Public Functions: Execution Context *\n ***************************************/\n\n function getMaxTransactionGasLimit()\n external\n view\n override\n returns (\n uint256 _maxTransactionGasLimit\n )\n {\n return gasMeterConfig.maxTransactionGasLimit;\n }\n\n /********************************************\n * Public Functions: Deployment Whitelisting *\n ********************************************/\n\n /**\n * Checks whether the given address is on the whitelist to ovmCREATE/ovmCREATE2, and reverts if not.\n * @param _deployerAddress Address attempting to deploy a contract.\n */\n function _checkDeployerAllowed(\n address _deployerAddress\n )\n internal\n {\n // From an OVM semantics perspective, this will appear identical to\n // the deployer ovmCALLing the whitelist. This is fine--in a sense, we are forcing them to.\n (bool success, bytes memory data) = ovmCALL(\n gasleft(),\n 0x4200000000000000000000000000000000000002,\n abi.encodeWithSignature(\"isDeployerAllowed(address)\", _deployerAddress)\n );\n bool isAllowed = abi.decode(data, (bool));\n\n if (!isAllowed || !success) {\n _revertWithFlag(RevertFlag.CREATOR_NOT_ALLOWED);\n }\n }\n\n /********************************************\n * Internal Functions: Contract Interaction *\n ********************************************/\n\n /**\n * Creates a new contract and associates it with some contract address.\n * @param _contractAddress Address to associate the created contract with.\n * @param _bytecode Bytecode to be used to create the contract.\n * @return Final OVM contract address.\n * @return Revertdata, if and only if the creation threw an exception.\n */\n function _createContract(\n address _contractAddress,\n bytes memory _bytecode\n )\n internal\n returns (\n address,\n bytes memory\n )\n {\n // We always update the nonce of the creating account, even if the creation fails.\n _setAccountNonce(ovmADDRESS(), _getAccountNonce(ovmADDRESS()) + 1);\n\n // We're stepping into a CREATE or CREATE2, so we need to update ADDRESS to point\n // to the contract's associated address and CALLER to point to the previous ADDRESS.\n MessageContext memory nextMessageContext = messageContext;\n nextMessageContext.ovmCALLER = messageContext.ovmADDRESS;\n nextMessageContext.ovmADDRESS = _contractAddress;\n\n // Run the common logic which occurs between call-type and create-type messages,\n // passing in the creation bytecode and `true` to trigger create-specific logic.\n (bool success, bytes memory data) = _handleExternalMessage(\n nextMessageContext,\n gasleft(),\n _contractAddress,\n _bytecode,\n true\n );\n\n // Yellow paper requires that address returned is zero if the contract deployment fails.\n return (\n success ? _contractAddress : address(0),\n data\n );\n }\n\n /**\n * Calls the deployed contract associated with a given address.\n * @param _nextMessageContext Message context to be used for the call.\n * @param _gasLimit Amount of gas to be passed into this call.\n * @param _contract OVM address to be called.\n * @param _calldata Data to send along with the call.\n * @return _success Whether or not the call returned (rather than reverted).\n * @return _returndata Data returned by the call.\n */\n function _callContract(\n MessageContext memory _nextMessageContext,\n uint256 _gasLimit,\n address _contract,\n bytes memory _calldata\n )\n internal\n returns (\n bool _success,\n bytes memory _returndata\n )\n {\n // We reserve addresses of the form 0xdeaddeaddead...NNNN for the container contracts in L2 geth.\n // So, we block calls to these addresses since they are not safe to run as an OVM contract itself.\n if (\n (uint256(_contract) & uint256(0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000))\n == uint256(0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000)\n ) {\n // EVM does not return data in the success case, see: https://github.com/ethereum/go-ethereum/blob/aae7660410f0ef90279e14afaaf2f429fdc2a186/core/vm/instructions.go#L600-L604\n return (true, hex'');\n }\n\n // Both 0x0000... and the EVM precompiles have the same address on L1 and L2 --> no trie lookup needed.\n address codeContractAddress =\n uint(_contract) < 100\n ? _contract\n : _getAccountEthAddress(_contract);\n\n return _handleExternalMessage(\n _nextMessageContext,\n _gasLimit,\n codeContractAddress,\n _calldata,\n false\n );\n }\n\n /**\n * Handles all interactions which involve the execution manager calling out to untrusted code (both calls and creates).\n * Ensures that OVM-related measures are enforced, including L2 gas refunds, nuisance gas, and flagged reversions.\n *\n * @param _nextMessageContext Message context to be used for the external message.\n * @param _gasLimit Amount of gas to be passed into this message.\n * @param _contract OVM address being called or deployed to\n * @param _data Data for the message (either calldata or creation code)\n * @param _isCreate Whether this is a create-type message.\n * @return Whether or not the message (either a call or deployment) succeeded.\n * @return Data returned by the message.\n */\n function _handleExternalMessage(\n MessageContext memory _nextMessageContext,\n uint256 _gasLimit,\n address _contract,\n bytes memory _data,\n bool _isCreate\n )\n internal\n returns (\n bool,\n bytes memory\n )\n {\n // We need to switch over to our next message context for the duration of this call.\n MessageContext memory prevMessageContext = messageContext;\n _switchMessageContext(prevMessageContext, _nextMessageContext);\n\n // Nuisance gas is a system used to bound the ability for an attacker to make fraud proofs\n // expensive by touching a lot of different accounts or storage slots. Since most contracts\n // only use a few storage slots during any given transaction, this shouldn't be a limiting\n // factor.\n uint256 prevNuisanceGasLeft = messageRecord.nuisanceGasLeft;\n uint256 nuisanceGasLimit = _getNuisanceGasLimit(_gasLimit);\n messageRecord.nuisanceGasLeft = nuisanceGasLimit;\n\n // Make the call and make sure to pass in the gas limit. Another instance of hidden\n // complexity. `_contract` is guaranteed to be a safe contract, meaning its return/revert\n // behavior can be controlled. In particular, we enforce that flags are passed through\n // revert data as to retrieve execution metadata that would normally be reverted out of\n // existence.\n\n bool success;\n bytes memory returndata;\n if (_isCreate) {\n // safeCREATE() is a function which replicates a CREATE message, but uses return values\n // Which match that of CALL (i.e. bool, bytes). This allows many security checks to be\n // to be shared between untrusted call and create call frames.\n (success, returndata) = address(this).call(\n abi.encodeWithSelector(\n this.safeCREATE.selector,\n _gasLimit,\n _data,\n _contract\n )\n );\n } else {\n (success, returndata) = _contract.call{gas: _gasLimit}(_data);\n }\n\n // Switch back to the original message context now that we're out of the call.\n _switchMessageContext(_nextMessageContext, prevMessageContext);\n\n // Assuming there were no reverts, the message record should be accurate here. We'll update\n // this value in the case of a revert.\n uint256 nuisanceGasLeft = messageRecord.nuisanceGasLeft;\n\n // Reverts at this point are completely OK, but we need to make a few updates based on the\n // information passed through the revert.\n if (success == false) {\n (\n RevertFlag flag,\n uint256 nuisanceGasLeftPostRevert,\n uint256 ovmGasRefund,\n bytes memory returndataFromFlag\n ) = _decodeRevertData(returndata);\n\n // INVALID_STATE_ACCESS is the only flag that triggers an immediate abort of the\n // parent EVM message. This behavior is necessary because INVALID_STATE_ACCESS must\n // halt any further transaction execution that could impact the execution result.\n if (flag == RevertFlag.INVALID_STATE_ACCESS) {\n _revertWithFlag(flag);\n }\n\n // INTENTIONAL_REVERT, UNSAFE_BYTECODE, STATIC_VIOLATION, and CREATOR_NOT_ALLOWED aren't\n // dependent on the input state, so we can just handle them like standard reverts. Our only change here\n // is to record the gas refund reported by the call (enforced by safety checking).\n if (\n flag == RevertFlag.INTENTIONAL_REVERT\n || flag == RevertFlag.UNSAFE_BYTECODE\n || flag == RevertFlag.STATIC_VIOLATION\n || flag == RevertFlag.CREATOR_NOT_ALLOWED\n ) {\n transactionRecord.ovmGasRefund = ovmGasRefund;\n }\n\n // INTENTIONAL_REVERT needs to pass up the user-provided return data encoded into the\n // flag, *not* the full encoded flag. All other revert types return no data.\n if (\n flag == RevertFlag.INTENTIONAL_REVERT\n || _isCreate\n ) {\n returndata = returndataFromFlag;\n } else {\n returndata = hex'';\n }\n\n // Reverts mean we need to use up whatever \"nuisance gas\" was used by the call.\n // EXCEEDS_NUISANCE_GAS explicitly reduces the remaining nuisance gas for this message\n // to zero. OUT_OF_GAS is a \"pseudo\" flag given that messages return no data when they\n // run out of gas, so we have to treat this like EXCEEDS_NUISANCE_GAS. All other flags\n // will simply pass up the remaining nuisance gas.\n nuisanceGasLeft = nuisanceGasLeftPostRevert;\n }\n\n // We need to reset the nuisance gas back to its original value minus the amount used here.\n messageRecord.nuisanceGasLeft = prevNuisanceGasLeft - (nuisanceGasLimit - nuisanceGasLeft);\n\n return (\n success,\n returndata\n );\n }\n\n /**\n * Handles the creation-specific safety measures required for OVM contract deployment.\n * This function sanitizes the return types for creation messages to match calls (bool, bytes),\n * by being an external function which the EM can call, that mimics the success/fail case of the CREATE.\n * This allows for consistent handling of both types of messages in _handleExternalMessage().\n * Having this step occur as a separate call frame also allows us to easily revert the \n * contract deployment in the event that the code is unsafe.\n * \n * @param _gasLimit Amount of gas to be passed into this creation.\n * @param _creationCode Code to pass into CREATE for deployment.\n * @param _address OVM address being deployed to.\n */\n function safeCREATE(\n uint _gasLimit,\n bytes memory _creationCode,\n address _address\n )\n external\n {\n // The only way this should callable is from within _createContract(),\n // and it should DEFINITELY not be callable by a non-EM code contract.\n if (msg.sender != address(this)) {\n return;\n }\n // Check that there is not already code at this address.\n if (_hasEmptyAccount(_address) == false) {\n // Note: in the EVM, this case burns all allotted gas. For improved\n // developer experience, we do return the remaining gas.\n _revertWithFlag(\n RevertFlag.CREATE_COLLISION,\n Lib_ErrorUtils.encodeRevertString(\"A contract has already been deployed to this address\")\n );\n }\n\n // Check the creation bytecode against the OVM_SafetyChecker.\n if (ovmSafetyChecker.isBytecodeSafe(_creationCode) == false) {\n _revertWithFlag(\n RevertFlag.UNSAFE_BYTECODE,\n Lib_ErrorUtils.encodeRevertString(\"Contract creation code contains unsafe opcodes. Did you use the right compiler or pass an unsafe constructor argument?\")\n );\n }\n\n // We always need to initialize the contract with the default account values.\n _initPendingAccount(_address);\n\n // Actually execute the EVM create message.\n // NOTE: The inline assembly below means we can NOT make any evm calls between here and then.\n address ethAddress = Lib_EthUtils.createContract(_creationCode);\n\n if (ethAddress == address(0)) {\n // If the creation fails, the EVM lets us grab its revert data. This may contain a revert flag\n // to be used above in _handleExternalMessage, so we pass the revert data back up unmodified.\n assembly { \n returndatacopy(0,0,returndatasize())\n revert(0, returndatasize())\n }\n }\n\n // Again simply checking that the deployed code is safe too. Contracts can generate\n // arbitrary deployment code, so there's no easy way to analyze this beforehand.\n bytes memory deployedCode = Lib_EthUtils.getCode(ethAddress);\n if (ovmSafetyChecker.isBytecodeSafe(deployedCode) == false) {\n _revertWithFlag(\n RevertFlag.UNSAFE_BYTECODE,\n Lib_ErrorUtils.encodeRevertString(\"Constructor attempted to deploy unsafe bytecode.\")\n );\n }\n\n // Contract creation didn't need to be reverted and the bytecode is safe. We finish up by\n // associating the desired address with the newly created contract's code hash and address.\n _commitPendingAccount(\n _address,\n ethAddress,\n Lib_EthUtils.getCodeHash(ethAddress)\n );\n }\n\n /******************************************\n * Internal Functions: State Manipulation *\n ******************************************/\n\n /**\n * Checks whether an account exists within the OVM_StateManager.\n * @param _address Address of the account to check.\n * @return _exists Whether or not the account exists.\n */\n function _hasAccount(\n address _address\n )\n internal\n returns (\n bool _exists\n )\n {\n _checkAccountLoad(_address);\n return ovmStateManager.hasAccount(_address);\n }\n\n /**\n * Checks whether a known empty account exists within the OVM_StateManager.\n * @param _address Address of the account to check.\n * @return _exists Whether or not the account empty exists.\n */\n function _hasEmptyAccount(\n address _address\n )\n internal\n returns (\n bool _exists\n )\n {\n _checkAccountLoad(_address);\n return ovmStateManager.hasEmptyAccount(_address);\n }\n\n /**\n * Sets the nonce of an account.\n * @param _address Address of the account to modify.\n * @param _nonce New account nonce.\n */\n function _setAccountNonce(\n address _address,\n uint256 _nonce\n )\n internal\n {\n _checkAccountChange(_address);\n ovmStateManager.setAccountNonce(_address, _nonce);\n }\n\n /**\n * Gets the nonce of an account.\n * @param _address Address of the account to access.\n * @return _nonce Nonce of the account.\n */\n function _getAccountNonce(\n address _address\n )\n internal\n returns (\n uint256 _nonce\n )\n {\n _checkAccountLoad(_address);\n return ovmStateManager.getAccountNonce(_address);\n }\n\n /**\n * Retrieves the Ethereum address of an account.\n * @param _address Address of the account to access.\n * @return _ethAddress Corresponding Ethereum address.\n */\n function _getAccountEthAddress(\n address _address\n )\n internal\n returns (\n address _ethAddress\n )\n {\n _checkAccountLoad(_address);\n return ovmStateManager.getAccountEthAddress(_address);\n }\n\n /**\n * Creates the default account object for the given address.\n * @param _address Address of the account create.\n */\n function _initPendingAccount(\n address _address\n )\n internal\n {\n // Although it seems like `_checkAccountChange` would be more appropriate here, we don't\n // actually consider an account \"changed\" until it's inserted into the state (in this case\n // by `_commitPendingAccount`).\n _checkAccountLoad(_address);\n ovmStateManager.initPendingAccount(_address);\n }\n\n /**\n * Stores additional relevant data for a new account, thereby \"committing\" it to the state.\n * This function is only called during `ovmCREATE` and `ovmCREATE2` after a successful contract\n * creation.\n * @param _address Address of the account to commit.\n * @param _ethAddress Address of the associated deployed contract.\n * @param _codeHash Hash of the code stored at the address.\n */\n function _commitPendingAccount(\n address _address,\n address _ethAddress,\n bytes32 _codeHash\n )\n internal\n {\n _checkAccountChange(_address);\n ovmStateManager.commitPendingAccount(\n _address,\n _ethAddress,\n _codeHash\n );\n }\n\n /**\n * Retrieves the value of a storage slot.\n * @param _contract Address of the contract to query.\n * @param _key 32 byte key of the storage slot.\n * @return _value 32 byte storage slot value.\n */\n function _getContractStorage(\n address _contract,\n bytes32 _key\n )\n internal\n returns (\n bytes32 _value\n )\n {\n _checkContractStorageLoad(_contract, _key);\n return ovmStateManager.getContractStorage(_contract, _key);\n }\n\n /**\n * Sets the value of a storage slot.\n * @param _contract Address of the contract to modify.\n * @param _key 32 byte key of the storage slot.\n * @param _value 32 byte storage slot value.\n */\n function _putContractStorage(\n address _contract,\n bytes32 _key,\n bytes32 _value\n )\n internal\n {\n // We don't set storage if the value didn't change. Although this acts as a convenient\n // optimization, it's also necessary to avoid the case in which a contract with no storage\n // attempts to store the value \"0\" at any key. Putting this value (and therefore requiring\n // that the value be committed into the storage trie after execution) would incorrectly\n // modify the storage root.\n if (_getContractStorage(_contract, _key) == _value) {\n return;\n }\n\n _checkContractStorageChange(_contract, _key);\n ovmStateManager.putContractStorage(_contract, _key, _value);\n }\n\n /**\n * Validation whenever a contract needs to be loaded. Checks that the account exists, charges\n * nuisance gas if the account hasn't been loaded before.\n * @param _address Address of the account to load.\n */\n function _checkAccountLoad(\n address _address\n )\n internal\n {\n // See `_checkContractStorageLoad` for more information.\n if (gasleft() < MIN_GAS_FOR_INVALID_STATE_ACCESS) {\n _revertWithFlag(RevertFlag.OUT_OF_GAS);\n }\n\n // See `_checkContractStorageLoad` for more information.\n if (ovmStateManager.hasAccount(_address) == false) {\n _revertWithFlag(RevertFlag.INVALID_STATE_ACCESS);\n }\n\n // Check whether the account has been loaded before and mark it as loaded if not. We need\n // this because \"nuisance gas\" only applies to the first time that an account is loaded.\n (\n bool _wasAccountAlreadyLoaded\n ) = ovmStateManager.testAndSetAccountLoaded(_address);\n\n // If we hadn't already loaded the account, then we'll need to charge \"nuisance gas\" based\n // on the size of the contract code.\n if (_wasAccountAlreadyLoaded == false) {\n _useNuisanceGas(\n (Lib_EthUtils.getCodeSize(_getAccountEthAddress(_address)) * NUISANCE_GAS_PER_CONTRACT_BYTE) + MIN_NUISANCE_GAS_PER_CONTRACT\n );\n }\n }\n\n /**\n * Validation whenever a contract needs to be changed. Checks that the account exists, charges\n * nuisance gas if the account hasn't been changed before.\n * @param _address Address of the account to change.\n */\n function _checkAccountChange(\n address _address\n )\n internal\n {\n // Start by checking for a load as we only want to charge nuisance gas proportional to\n // contract size once.\n _checkAccountLoad(_address);\n\n // Check whether the account has been changed before and mark it as changed if not. We need\n // this because \"nuisance gas\" only applies to the first time that an account is changed.\n (\n bool _wasAccountAlreadyChanged\n ) = ovmStateManager.testAndSetAccountChanged(_address);\n\n // If we hadn't already loaded the account, then we'll need to charge \"nuisance gas\" based\n // on the size of the contract code.\n if (_wasAccountAlreadyChanged == false) {\n ovmStateManager.incrementTotalUncommittedAccounts();\n _useNuisanceGas(\n (Lib_EthUtils.getCodeSize(_getAccountEthAddress(_address)) * NUISANCE_GAS_PER_CONTRACT_BYTE) + MIN_NUISANCE_GAS_PER_CONTRACT\n );\n }\n }\n\n /**\n * Validation whenever a slot needs to be loaded. Checks that the account exists, charges\n * nuisance gas if the slot hasn't been loaded before.\n * @param _contract Address of the account to load from.\n * @param _key 32 byte key to load.\n */\n function _checkContractStorageLoad(\n address _contract,\n bytes32 _key\n )\n internal\n {\n // Another case of hidden complexity. If we didn't enforce this requirement, then a\n // contract could pass in just enough gas to cause the INVALID_STATE_ACCESS check to fail\n // on L1 but not on L2. A contract could use this behavior to prevent the\n // OVM_ExecutionManager from detecting an invalid state access. Reverting with OUT_OF_GAS\n // allows us to also charge for the full message nuisance gas, because you deserve that for\n // trying to break the contract in this way.\n if (gasleft() < MIN_GAS_FOR_INVALID_STATE_ACCESS) {\n _revertWithFlag(RevertFlag.OUT_OF_GAS);\n }\n\n // We need to make sure that the transaction isn't trying to access storage that hasn't\n // been provided to the OVM_StateManager. We'll immediately abort if this is the case.\n // We know that we have enough gas to do this check because of the above test.\n if (ovmStateManager.hasContractStorage(_contract, _key) == false) {\n _revertWithFlag(RevertFlag.INVALID_STATE_ACCESS);\n }\n\n // Check whether the slot has been loaded before and mark it as loaded if not. We need\n // this because \"nuisance gas\" only applies to the first time that a slot is loaded.\n (\n bool _wasContractStorageAlreadyLoaded\n ) = ovmStateManager.testAndSetContractStorageLoaded(_contract, _key);\n\n // If we hadn't already loaded the account, then we'll need to charge some fixed amount of\n // \"nuisance gas\".\n if (_wasContractStorageAlreadyLoaded == false) {\n _useNuisanceGas(NUISANCE_GAS_SLOAD);\n }\n }\n\n /**\n * Validation whenever a slot needs to be changed. Checks that the account exists, charges\n * nuisance gas if the slot hasn't been changed before.\n * @param _contract Address of the account to change.\n * @param _key 32 byte key to change.\n */\n function _checkContractStorageChange(\n address _contract,\n bytes32 _key\n )\n internal\n {\n // Start by checking for load to make sure we have the storage slot and that we charge the\n // \"nuisance gas\" necessary to prove the storage slot state.\n _checkContractStorageLoad(_contract, _key);\n\n // Check whether the slot has been changed before and mark it as changed if not. We need\n // this because \"nuisance gas\" only applies to the first time that a slot is changed.\n (\n bool _wasContractStorageAlreadyChanged\n ) = ovmStateManager.testAndSetContractStorageChanged(_contract, _key);\n\n // If we hadn't already changed the account, then we'll need to charge some fixed amount of\n // \"nuisance gas\".\n if (_wasContractStorageAlreadyChanged == false) {\n // Changing a storage slot means that we're also going to have to change the\n // corresponding account, so do an account change check.\n _checkAccountChange(_contract);\n\n ovmStateManager.incrementTotalUncommittedContractStorage();\n _useNuisanceGas(NUISANCE_GAS_SSTORE);\n }\n }\n\n\n /************************************\n * Internal Functions: Revert Logic *\n ************************************/\n\n /**\n * Simple encoding for revert data.\n * @param _flag Flag to revert with.\n * @param _data Additional user-provided revert data.\n * @return _revertdata Encoded revert data.\n */\n function _encodeRevertData(\n RevertFlag _flag,\n bytes memory _data\n )\n internal\n view\n returns (\n bytes memory _revertdata\n )\n {\n // Out of gas and create exceptions will fundamentally return no data, so simulating it shouldn't either.\n if (\n _flag == RevertFlag.OUT_OF_GAS\n ) {\n return bytes('');\n }\n\n // INVALID_STATE_ACCESS doesn't need to return any data other than the flag.\n if (_flag == RevertFlag.INVALID_STATE_ACCESS) {\n return abi.encode(\n _flag,\n 0,\n 0,\n bytes('')\n );\n }\n\n // Just ABI encode the rest of the parameters.\n return abi.encode(\n _flag,\n messageRecord.nuisanceGasLeft,\n transactionRecord.ovmGasRefund,\n _data\n );\n }\n\n /**\n * Simple decoding for revert data.\n * @param _revertdata Revert data to decode.\n * @return _flag Flag used to revert.\n * @return _nuisanceGasLeft Amount of nuisance gas unused by the message.\n * @return _ovmGasRefund Amount of gas refunded during the message.\n * @return _data Additional user-provided revert data.\n */\n function _decodeRevertData(\n bytes memory _revertdata\n )\n internal\n pure\n returns (\n RevertFlag _flag,\n uint256 _nuisanceGasLeft,\n uint256 _ovmGasRefund,\n bytes memory _data\n )\n {\n // A length of zero means the call ran out of gas, just return empty data.\n if (_revertdata.length == 0) {\n return (\n RevertFlag.OUT_OF_GAS,\n 0,\n 0,\n bytes('')\n );\n }\n\n // ABI decode the incoming data.\n return abi.decode(_revertdata, (RevertFlag, uint256, uint256, bytes));\n }\n\n /**\n * Causes a message to revert or abort.\n * @param _flag Flag to revert with.\n * @param _data Additional user-provided data.\n */\n function _revertWithFlag(\n RevertFlag _flag,\n bytes memory _data\n )\n internal\n view\n {\n bytes memory revertdata = _encodeRevertData(\n _flag,\n _data\n );\n\n assembly {\n revert(add(revertdata, 0x20), mload(revertdata))\n }\n }\n\n /**\n * Causes a message to revert or abort.\n * @param _flag Flag to revert with.\n */\n function _revertWithFlag(\n RevertFlag _flag\n )\n internal\n {\n _revertWithFlag(_flag, bytes(''));\n }\n\n\n /******************************************\n * Internal Functions: Nuisance Gas Logic *\n ******************************************/\n\n /**\n * Computes the nuisance gas limit from the gas limit.\n * @dev This function is currently using a naive implementation whereby the nuisance gas limit\n * is set to exactly equal the lesser of the gas limit or remaining gas. It's likely that\n * this implementation is perfectly fine, but we may change this formula later.\n * @param _gasLimit Gas limit to compute from.\n * @return _nuisanceGasLimit Computed nuisance gas limit.\n */\n function _getNuisanceGasLimit(\n uint256 _gasLimit\n )\n internal\n view\n returns (\n uint256 _nuisanceGasLimit\n )\n {\n return _gasLimit < gasleft() ? _gasLimit : gasleft();\n }\n\n /**\n * Uses a certain amount of nuisance gas.\n * @param _amount Amount of nuisance gas to use.\n */\n function _useNuisanceGas(\n uint256 _amount\n )\n internal\n {\n // Essentially the same as a standard OUT_OF_GAS, except we also retain a record of the gas\n // refund to be given at the end of the transaction.\n if (messageRecord.nuisanceGasLeft < _amount) {\n _revertWithFlag(RevertFlag.EXCEEDS_NUISANCE_GAS);\n }\n\n messageRecord.nuisanceGasLeft -= _amount;\n }\n\n\n /************************************\n * Internal Functions: Gas Metering *\n ************************************/\n\n /**\n * Checks whether a transaction needs to start a new epoch and does so if necessary.\n * @param _timestamp Transaction timestamp.\n */\n function _checkNeedsNewEpoch(\n uint256 _timestamp\n )\n internal\n {\n if (\n _timestamp >= (\n _getGasMetadata(GasMetadataKey.CURRENT_EPOCH_START_TIMESTAMP)\n + gasMeterConfig.secondsPerEpoch\n )\n ) {\n _putGasMetadata(\n GasMetadataKey.CURRENT_EPOCH_START_TIMESTAMP,\n _timestamp\n );\n\n _putGasMetadata(\n GasMetadataKey.PREV_EPOCH_SEQUENCER_QUEUE_GAS,\n _getGasMetadata(\n GasMetadataKey.CUMULATIVE_SEQUENCER_QUEUE_GAS\n )\n );\n\n _putGasMetadata(\n GasMetadataKey.PREV_EPOCH_L1TOL2_QUEUE_GAS,\n _getGasMetadata(\n GasMetadataKey.CUMULATIVE_L1TOL2_QUEUE_GAS\n )\n );\n }\n }\n\n /**\n * Validates the input values of a transaction.\n * @return _valid Whether or not the transaction data is valid.\n */\n function _isValidInput(\n Lib_OVMCodec.Transaction memory _transaction\n )\n view\n internal\n returns (\n bool\n )\n {\n // Prevent reentrancy to run():\n // This check prevents calling run with the default ovmNumber.\n // Combined with the first check in run():\n // if (transactionContext.ovmNUMBER != DEFAULT_UINT256) { return; }\n // It should be impossible to re-enter since run() returns before any other call frames are created.\n // Since this value is already being written to storage, we save much gas compared to\n // using the standard nonReentrant pattern.\n if (_transaction.blockNumber == DEFAULT_UINT256) {\n return false;\n }\n\n if (_isValidGasLimit(_transaction.gasLimit, _transaction.l1QueueOrigin) == false) {\n return false;\n }\n\n return true;\n }\n\n /**\n * Validates the gas limit for a given transaction.\n * @param _gasLimit Gas limit provided by the transaction.\n * param _queueOrigin Queue from which the transaction originated.\n * @return _valid Whether or not the gas limit is valid.\n */\n function _isValidGasLimit(\n uint256 _gasLimit,\n Lib_OVMCodec.QueueOrigin // _queueOrigin\n )\n view\n internal\n returns (\n bool _valid\n )\n {\n // Always have to be below the maximum gas limit.\n if (_gasLimit > gasMeterConfig.maxTransactionGasLimit) {\n return false;\n }\n\n // Always have to be above the minimum gas limit.\n if (_gasLimit < gasMeterConfig.minTransactionGasLimit) {\n return false;\n }\n\n // TEMPORARY: Gas metering is disabled for minnet.\n return true;\n // GasMetadataKey cumulativeGasKey;\n // GasMetadataKey prevEpochGasKey;\n // if (_queueOrigin == Lib_OVMCodec.QueueOrigin.SEQUENCER_QUEUE) {\n // cumulativeGasKey = GasMetadataKey.CUMULATIVE_SEQUENCER_QUEUE_GAS;\n // prevEpochGasKey = GasMetadataKey.PREV_EPOCH_SEQUENCER_QUEUE_GAS;\n // } else {\n // cumulativeGasKey = GasMetadataKey.CUMULATIVE_L1TOL2_QUEUE_GAS;\n // prevEpochGasKey = GasMetadataKey.PREV_EPOCH_L1TOL2_QUEUE_GAS;\n // }\n\n // return (\n // (\n // _getGasMetadata(cumulativeGasKey)\n // - _getGasMetadata(prevEpochGasKey)\n // + _gasLimit\n // ) < gasMeterConfig.maxGasPerQueuePerEpoch\n // );\n }\n\n /**\n * Updates the cumulative gas after a transaction.\n * @param _gasUsed Gas used by the transaction.\n * @param _queueOrigin Queue from which the transaction originated.\n */\n function _updateCumulativeGas(\n uint256 _gasUsed,\n Lib_OVMCodec.QueueOrigin _queueOrigin\n )\n internal\n {\n GasMetadataKey cumulativeGasKey;\n if (_queueOrigin == Lib_OVMCodec.QueueOrigin.SEQUENCER_QUEUE) {\n cumulativeGasKey = GasMetadataKey.CUMULATIVE_SEQUENCER_QUEUE_GAS;\n } else {\n cumulativeGasKey = GasMetadataKey.CUMULATIVE_L1TOL2_QUEUE_GAS;\n }\n\n _putGasMetadata(\n cumulativeGasKey,\n (\n _getGasMetadata(cumulativeGasKey)\n + gasMeterConfig.minTransactionGasLimit\n + _gasUsed\n - transactionRecord.ovmGasRefund\n )\n );\n }\n\n /**\n * Retrieves the value of a gas metadata key.\n * @param _key Gas metadata key to retrieve.\n * @return _value Value stored at the given key.\n */\n function _getGasMetadata(\n GasMetadataKey _key\n )\n internal\n returns (\n uint256 _value\n )\n {\n return uint256(_getContractStorage(\n GAS_METADATA_ADDRESS,\n bytes32(uint256(_key))\n ));\n }\n\n /**\n * Sets the value of a gas metadata key.\n * @param _key Gas metadata key to set.\n * @param _value Value to store at the given key.\n */\n function _putGasMetadata(\n GasMetadataKey _key,\n uint256 _value\n )\n internal\n {\n _putContractStorage(\n GAS_METADATA_ADDRESS,\n bytes32(uint256(_key)),\n bytes32(uint256(_value))\n );\n }\n\n\n /*****************************************\n * Internal Functions: Execution Context *\n *****************************************/\n\n /**\n * Swaps over to a new message context.\n * @param _prevMessageContext Context we're switching from.\n * @param _nextMessageContext Context we're switching to.\n */\n function _switchMessageContext(\n MessageContext memory _prevMessageContext,\n MessageContext memory _nextMessageContext\n )\n internal\n {\n // Avoid unnecessary the SSTORE.\n if (_prevMessageContext.ovmCALLER != _nextMessageContext.ovmCALLER) {\n messageContext.ovmCALLER = _nextMessageContext.ovmCALLER;\n }\n\n // Avoid unnecessary the SSTORE.\n if (_prevMessageContext.ovmADDRESS != _nextMessageContext.ovmADDRESS) {\n messageContext.ovmADDRESS = _nextMessageContext.ovmADDRESS;\n }\n\n // Avoid unnecessary the SSTORE.\n if (_prevMessageContext.isStatic != _nextMessageContext.isStatic) {\n messageContext.isStatic = _nextMessageContext.isStatic;\n }\n }\n\n /**\n * Initializes the execution context.\n * @param _transaction OVM transaction being executed.\n */\n function _initContext(\n Lib_OVMCodec.Transaction memory _transaction\n )\n internal\n {\n transactionContext.ovmTIMESTAMP = _transaction.timestamp;\n transactionContext.ovmNUMBER = _transaction.blockNumber;\n transactionContext.ovmTXGASLIMIT = _transaction.gasLimit;\n transactionContext.ovmL1QUEUEORIGIN = _transaction.l1QueueOrigin;\n transactionContext.ovmL1TXORIGIN = _transaction.l1TxOrigin;\n transactionContext.ovmGASLIMIT = gasMeterConfig.maxGasPerQueuePerEpoch;\n\n messageRecord.nuisanceGasLeft = _getNuisanceGasLimit(_transaction.gasLimit);\n }\n\n /**\n * Resets the transaction and message context.\n */\n function _resetContext()\n internal\n {\n transactionContext.ovmL1TXORIGIN = DEFAULT_ADDRESS;\n transactionContext.ovmTIMESTAMP = DEFAULT_UINT256;\n transactionContext.ovmNUMBER = DEFAULT_UINT256;\n transactionContext.ovmGASLIMIT = DEFAULT_UINT256;\n transactionContext.ovmTXGASLIMIT = DEFAULT_UINT256;\n transactionContext.ovmL1QUEUEORIGIN = Lib_OVMCodec.QueueOrigin.SEQUENCER_QUEUE;\n\n transactionRecord.ovmGasRefund = DEFAULT_UINT256;\n\n messageContext.ovmCALLER = DEFAULT_ADDRESS;\n messageContext.ovmADDRESS = DEFAULT_ADDRESS;\n messageContext.isStatic = false;\n\n messageRecord.nuisanceGasLeft = DEFAULT_UINT256;\n\n // Reset the ovmStateManager.\n ovmStateManager = iOVM_StateManager(address(0));\n }\n\n /*****************************\n * L2-only Helper Functions *\n *****************************/\n\n /**\n * Unreachable helper function for simulating eth_calls with an OVM message context.\n * This function will throw an exception in all cases other than when used as a custom entrypoint in L2 Geth to simulate eth_call.\n * @param _transaction the message transaction to simulate.\n * @param _from the OVM account the simulated call should be from.\n */\n function simulateMessage(\n Lib_OVMCodec.Transaction memory _transaction,\n address _from,\n iOVM_StateManager _ovmStateManager\n )\n external\n returns (\n bool,\n bytes memory\n )\n {\n // Prevent this call from having any effect unless in a custom-set VM frame\n require(msg.sender == address(0));\n\n ovmStateManager = _ovmStateManager;\n _initContext(_transaction);\n messageRecord.nuisanceGasLeft = uint(-1);\n\n messageContext.ovmADDRESS = _from;\n\n bool isCreate = _transaction.entrypoint == address(0);\n if (isCreate) {\n (address created, bytes memory revertData) = ovmCREATE(_transaction.data);\n if (created == address(0)) {\n return (false, revertData);\n } else {\n // The eth_call RPC endpoint for to = undefined will return the deployed bytecode\n // in the success case, differing from standard create messages.\n return (true, Lib_EthUtils.getCode(created));\n }\n } else {\n return ovmCALL(\n _transaction.gasLimit,\n _transaction.entrypoint,\n _transaction.data\n );\n }\n }\n}\n" - }, - "contracts/optimistic-ethereum/libraries/resolver/Lib_AddressResolver.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Library Imports */\nimport { Lib_AddressManager } from \"./Lib_AddressManager.sol\";\n\n/**\n * @title Lib_AddressResolver\n */\nabstract contract Lib_AddressResolver {\n\n /*************\n * Variables *\n *************/\n\n Lib_AddressManager public libAddressManager;\n\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Lib_AddressManager.\n */\n constructor(\n address _libAddressManager\n ) {\n libAddressManager = Lib_AddressManager(_libAddressManager);\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Resolves the address associated with a given name.\n * @param _name Name to resolve an address for.\n * @return Address associated with the given name.\n */\n function resolve(\n string memory _name\n )\n public\n view\n returns (\n address\n )\n {\n return libAddressManager.getAddress(_name);\n }\n}\n" - }, - "contracts/optimistic-ethereum/libraries/utils/Lib_EthUtils.sol": { - "content": "// SPDX-License-Identifier: MIT\n// @unsupported: ovm\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_RLPWriter } from \"../rlp/Lib_RLPWriter.sol\";\nimport { Lib_Bytes32Utils } from \"./Lib_Bytes32Utils.sol\";\n\n/**\n * @title Lib_EthUtils\n */\nlibrary Lib_EthUtils {\n\n /***********************************\n * Internal Functions: Code Access *\n ***********************************/\n\n /**\n * Gets the code for a given address.\n * @param _address Address to get code for.\n * @param _offset Offset to start reading from.\n * @param _length Number of bytes to read.\n * @return _code Code read from the contract.\n */\n function getCode(\n address _address,\n uint256 _offset,\n uint256 _length\n )\n internal\n view\n returns (\n bytes memory _code\n )\n {\n assembly {\n _code := mload(0x40)\n mstore(0x40, add(_code, add(_length, 0x20)))\n mstore(_code, _length)\n extcodecopy(_address, add(_code, 0x20), _offset, _length)\n }\n\n return _code;\n }\n\n /**\n * Gets the full code for a given address.\n * @param _address Address to get code for.\n * @return _code Full code of the contract.\n */\n function getCode(\n address _address\n )\n internal\n view\n returns (\n bytes memory _code\n )\n {\n return getCode(\n _address,\n 0,\n getCodeSize(_address)\n );\n }\n\n /**\n * Gets the size of a contract's code in bytes.\n * @param _address Address to get code size for.\n * @return _codeSize Size of the contract's code in bytes.\n */\n function getCodeSize(\n address _address\n )\n internal\n view\n returns (\n uint256 _codeSize\n )\n {\n assembly {\n _codeSize := extcodesize(_address)\n }\n\n return _codeSize;\n }\n\n /**\n * Gets the hash of a contract's code.\n * @param _address Address to get a code hash for.\n * @return _codeHash Hash of the contract's code.\n */\n function getCodeHash(\n address _address\n )\n internal\n view\n returns (\n bytes32 _codeHash\n )\n {\n assembly {\n _codeHash := extcodehash(_address)\n }\n\n return _codeHash;\n }\n\n\n /*****************************************\n * Internal Functions: Contract Creation *\n *****************************************/\n\n /**\n * Creates a contract with some given initialization code.\n * @param _code Contract initialization code.\n * @return _created Address of the created contract.\n */\n function createContract(\n bytes memory _code\n )\n internal\n returns (\n address _created\n )\n {\n assembly {\n _created := create(\n 0,\n add(_code, 0x20),\n mload(_code)\n )\n }\n\n return _created;\n }\n\n /**\n * Computes the address that would be generated by CREATE.\n * @param _creator Address creating the contract.\n * @param _nonce Creator's nonce.\n * @return _address Address to be generated by CREATE.\n */\n function getAddressForCREATE(\n address _creator,\n uint256 _nonce\n )\n internal\n pure\n returns (\n address _address\n )\n {\n bytes[] memory encoded = new bytes[](2);\n encoded[0] = Lib_RLPWriter.writeAddress(_creator);\n encoded[1] = Lib_RLPWriter.writeUint(_nonce);\n\n bytes memory encodedList = Lib_RLPWriter.writeList(encoded);\n return Lib_Bytes32Utils.toAddress(keccak256(encodedList));\n }\n\n /**\n * Computes the address that would be generated by CREATE2.\n * @param _creator Address creating the contract.\n * @param _bytecode Bytecode of the contract to be created.\n * @param _salt 32 byte salt value mixed into the hash.\n * @return _address Address to be generated by CREATE2.\n */\n function getAddressForCREATE2(\n address _creator,\n bytes memory _bytecode,\n bytes32 _salt\n )\n internal\n pure\n returns (address _address)\n {\n bytes32 hashedData = keccak256(abi.encodePacked(\n byte(0xff),\n _creator,\n _salt,\n keccak256(_bytecode)\n ));\n\n return Lib_Bytes32Utils.toAddress(hashedData);\n }\n}\n" - }, - "contracts/optimistic-ethereum/iOVM/execution/iOVM_ExecutionManager.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\ninterface iOVM_ExecutionManager {\n /**********\n * Enums *\n *********/\n\n enum RevertFlag {\n OUT_OF_GAS,\n INTENTIONAL_REVERT,\n EXCEEDS_NUISANCE_GAS,\n INVALID_STATE_ACCESS,\n UNSAFE_BYTECODE,\n CREATE_COLLISION,\n STATIC_VIOLATION,\n CREATOR_NOT_ALLOWED\n }\n\n enum GasMetadataKey {\n CURRENT_EPOCH_START_TIMESTAMP,\n CUMULATIVE_SEQUENCER_QUEUE_GAS,\n CUMULATIVE_L1TOL2_QUEUE_GAS,\n PREV_EPOCH_SEQUENCER_QUEUE_GAS,\n PREV_EPOCH_L1TOL2_QUEUE_GAS\n }\n\n /***********\n * Structs *\n ***********/\n\n struct GasMeterConfig {\n uint256 minTransactionGasLimit;\n uint256 maxTransactionGasLimit;\n uint256 maxGasPerQueuePerEpoch;\n uint256 secondsPerEpoch;\n }\n\n struct GlobalContext {\n uint256 ovmCHAINID;\n }\n\n struct TransactionContext {\n Lib_OVMCodec.QueueOrigin ovmL1QUEUEORIGIN;\n uint256 ovmTIMESTAMP;\n uint256 ovmNUMBER;\n uint256 ovmGASLIMIT;\n uint256 ovmTXGASLIMIT;\n address ovmL1TXORIGIN;\n }\n\n struct TransactionRecord {\n uint256 ovmGasRefund;\n }\n\n struct MessageContext {\n address ovmCALLER;\n address ovmADDRESS;\n bool isStatic;\n }\n\n struct MessageRecord {\n uint256 nuisanceGasLeft;\n }\n\n\n /************************************\n * Transaction Execution Entrypoint *\n ************************************/\n\n function run(\n Lib_OVMCodec.Transaction calldata _transaction,\n address _txStateManager\n ) external;\n\n\n /*******************\n * Context Opcodes *\n *******************/\n\n function ovmCALLER() external view returns (address _caller);\n function ovmADDRESS() external view returns (address _address);\n function ovmTIMESTAMP() external view returns (uint256 _timestamp);\n function ovmNUMBER() external view returns (uint256 _number);\n function ovmGASLIMIT() external view returns (uint256 _gasLimit);\n function ovmCHAINID() external view returns (uint256 _chainId);\n\n\n /**********************\n * L2 Context Opcodes *\n **********************/\n\n function ovmL1QUEUEORIGIN() external view returns (Lib_OVMCodec.QueueOrigin _queueOrigin);\n function ovmL1TXORIGIN() external view returns (address _l1TxOrigin);\n\n\n /*******************\n * Halting Opcodes *\n *******************/\n\n function ovmREVERT(bytes memory _data) external;\n\n\n /*****************************\n * Contract Creation Opcodes *\n *****************************/\n\n function ovmCREATE(bytes memory _bytecode) external returns (address _contract, bytes memory _revertdata);\n function ovmCREATE2(bytes memory _bytecode, bytes32 _salt) external returns (address _contract, bytes memory _revertdata);\n\n\n /*******************************\n * Account Abstraction Opcodes *\n ******************************/\n\n function ovmGETNONCE() external returns (uint256 _nonce);\n function ovmINCREMENTNONCE() external;\n function ovmCREATEEOA(bytes32 _messageHash, uint8 _v, bytes32 _r, bytes32 _s) external;\n\n\n /****************************\n * Contract Calling Opcodes *\n ****************************/\n\n function ovmCALL(uint256 _gasLimit, address _address, bytes memory _calldata) external returns (bool _success, bytes memory _returndata);\n function ovmSTATICCALL(uint256 _gasLimit, address _address, bytes memory _calldata) external returns (bool _success, bytes memory _returndata);\n function ovmDELEGATECALL(uint256 _gasLimit, address _address, bytes memory _calldata) external returns (bool _success, bytes memory _returndata);\n\n\n /****************************\n * Contract Storage Opcodes *\n ****************************/\n\n function ovmSLOAD(bytes32 _key) external returns (bytes32 _value);\n function ovmSSTORE(bytes32 _key, bytes32 _value) external;\n\n\n /*************************\n * Contract Code Opcodes *\n *************************/\n\n function ovmEXTCODECOPY(address _contract, uint256 _offset, uint256 _length) external returns (bytes memory _code);\n function ovmEXTCODESIZE(address _contract) external returns (uint256 _size);\n function ovmEXTCODEHASH(address _contract) external returns (bytes32 _hash);\n\n\n /***************************************\n * Public Functions: Execution Context *\n ***************************************/\n\n function getMaxTransactionGasLimit() external view returns (uint _maxTransactionGasLimit);\n}\n" - }, - "contracts/optimistic-ethereum/iOVM/execution/iOVM_StateManager.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/**\n * @title iOVM_StateManager\n */\ninterface iOVM_StateManager {\n\n /*******************\n * Data Structures *\n *******************/\n\n enum ItemState {\n ITEM_UNTOUCHED,\n ITEM_LOADED,\n ITEM_CHANGED,\n ITEM_COMMITTED\n }\n\n /***************************\n * Public Functions: Misc *\n ***************************/\n\n function isAuthenticated(address _address) external view returns (bool);\n\n /***************************\n * Public Functions: Setup *\n ***************************/\n\n function owner() external view returns (address _owner);\n function ovmExecutionManager() external view returns (address _ovmExecutionManager);\n function setExecutionManager(address _ovmExecutionManager) external;\n\n\n /************************************\n * Public Functions: Account Access *\n ************************************/\n\n function putAccount(address _address, Lib_OVMCodec.Account memory _account) external;\n function putEmptyAccount(address _address) external;\n function getAccount(address _address) external view returns (Lib_OVMCodec.Account memory _account);\n function hasAccount(address _address) external view returns (bool _exists);\n function hasEmptyAccount(address _address) external view returns (bool _exists);\n function setAccountNonce(address _address, uint256 _nonce) external;\n function getAccountNonce(address _address) external view returns (uint256 _nonce);\n function getAccountEthAddress(address _address) external view returns (address _ethAddress);\n function getAccountStorageRoot(address _address) external view returns (bytes32 _storageRoot);\n function initPendingAccount(address _address) external;\n function commitPendingAccount(address _address, address _ethAddress, bytes32 _codeHash) external;\n function testAndSetAccountLoaded(address _address) external returns (bool _wasAccountAlreadyLoaded);\n function testAndSetAccountChanged(address _address) external returns (bool _wasAccountAlreadyChanged);\n function commitAccount(address _address) external returns (bool _wasAccountCommitted);\n function incrementTotalUncommittedAccounts() external;\n function getTotalUncommittedAccounts() external view returns (uint256 _total);\n function wasAccountChanged(address _address) external view returns (bool);\n function wasAccountCommitted(address _address) external view returns (bool);\n\n\n /************************************\n * Public Functions: Storage Access *\n ************************************/\n\n function putContractStorage(address _contract, bytes32 _key, bytes32 _value) external;\n function getContractStorage(address _contract, bytes32 _key) external view returns (bytes32 _value);\n function hasContractStorage(address _contract, bytes32 _key) external view returns (bool _exists);\n function testAndSetContractStorageLoaded(address _contract, bytes32 _key) external returns (bool _wasContractStorageAlreadyLoaded);\n function testAndSetContractStorageChanged(address _contract, bytes32 _key) external returns (bool _wasContractStorageAlreadyChanged);\n function commitContractStorage(address _contract, bytes32 _key) external returns (bool _wasContractStorageCommitted);\n function incrementTotalUncommittedContractStorage() external;\n function getTotalUncommittedContractStorage() external view returns (uint256 _total);\n function wasContractStorageChanged(address _contract, bytes32 _key) external view returns (bool);\n function wasContractStorageCommitted(address _contract, bytes32 _key) external view returns (bool);\n}\n" - }, - "contracts/optimistic-ethereum/iOVM/execution/iOVM_SafetyChecker.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/**\n * @title iOVM_SafetyChecker\n */\ninterface iOVM_SafetyChecker {\n\n /********************\n * Public Functions *\n ********************/\n\n function isBytecodeSafe(bytes calldata _bytecode) external pure returns (bool);\n}\n" - }, - "contracts/optimistic-ethereum/OVM/accounts/OVM_ProxyEOA.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Library Imports */\nimport { Lib_Bytes32Utils } from \"../../libraries/utils/Lib_Bytes32Utils.sol\";\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_ECDSAUtils } from \"../../libraries/utils/Lib_ECDSAUtils.sol\";\nimport { Lib_SafeExecutionManagerWrapper } from \"../../libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\";\n\n/**\n * @title OVM_ProxyEOA\n * @dev The Proxy EOA contract uses a delegate call to execute the logic in an implementation contract.\n * In combination with the logic implemented in the ECDSA Contract Account, this enables a form of upgradable \n * 'account abstraction' on layer 2. \n * \n * Compiler used: solc\n * Runtime target: OVM\n */\ncontract OVM_ProxyEOA {\n\n /*************\n * Constants *\n *************/\n\n bytes32 constant IMPLEMENTATION_KEY = 0xdeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddead;\n\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _implementation Address of the initial implementation contract.\n */\n constructor(\n address _implementation\n )\n {\n _setImplementation(_implementation);\n }\n\n\n /*********************\n * Fallback Function *\n *********************/\n\n fallback()\n external\n {\n (bool success, bytes memory returndata) = Lib_SafeExecutionManagerWrapper.safeDELEGATECALL(\n gasleft(),\n getImplementation(),\n msg.data\n );\n\n if (success) {\n assembly {\n return(add(returndata, 0x20), mload(returndata))\n }\n } else {\n Lib_SafeExecutionManagerWrapper.safeREVERT(\n string(returndata)\n );\n }\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Changes the implementation address.\n * @param _implementation New implementation address.\n */\n function upgrade(\n address _implementation\n )\n external\n {\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(\n Lib_SafeExecutionManagerWrapper.safeADDRESS() == Lib_SafeExecutionManagerWrapper.safeCALLER(),\n \"EOAs can only upgrade their own EOA implementation\"\n );\n\n _setImplementation(_implementation);\n }\n\n /**\n * Gets the address of the current implementation.\n * @return Current implementation address.\n */\n function getImplementation()\n public\n returns (\n address\n )\n {\n return Lib_Bytes32Utils.toAddress(\n Lib_SafeExecutionManagerWrapper.safeSLOAD(\n IMPLEMENTATION_KEY\n )\n );\n }\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n function _setImplementation(\n address _implementation\n )\n internal\n {\n Lib_SafeExecutionManagerWrapper.safeSSTORE(\n IMPLEMENTATION_KEY,\n Lib_Bytes32Utils.fromAddress(_implementation)\n );\n }\n}\n" - }, - "contracts/optimistic-ethereum/OVM/predeploys/OVM_DeployerWhitelist.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Library Imports */\nimport { Lib_Bytes32Utils } from \"../../libraries/utils/Lib_Bytes32Utils.sol\";\n\n/* Interface Imports */\nimport { iOVM_DeployerWhitelist } from \"../../iOVM/predeploys/iOVM_DeployerWhitelist.sol\";\nimport { Lib_SafeExecutionManagerWrapper } from \"../../libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\";\n\n/**\n * @title OVM_DeployerWhitelist\n * @dev The Deployer Whitelist is a temporary predeploy used to provide additional safety during the\n * initial phases of our mainnet roll out. It is owned by the Optimism team, and defines accounts\n * which are allowed to deploy contracts on Layer2. The Execution Manager will only allow an \n * ovmCREATE or ovmCREATE2 operation to proceed if the deployer's address whitelisted.\n * \n * Compiler used: solc\n * Runtime target: OVM\n */\ncontract OVM_DeployerWhitelist is iOVM_DeployerWhitelist {\n\n /**********************\n * Contract Constants *\n **********************/\n\n bytes32 internal constant KEY_INITIALIZED = 0x0000000000000000000000000000000000000000000000000000000000000010;\n bytes32 internal constant KEY_OWNER = 0x0000000000000000000000000000000000000000000000000000000000000011;\n bytes32 internal constant KEY_ALLOW_ARBITRARY_DEPLOYMENT = 0x0000000000000000000000000000000000000000000000000000000000000012;\n\n\n /**********************\n * Function Modifiers *\n **********************/\n \n /**\n * Blocks functions to anyone except the contract owner.\n */\n modifier onlyOwner() {\n address owner = Lib_Bytes32Utils.toAddress(\n Lib_SafeExecutionManagerWrapper.safeSLOAD(\n KEY_OWNER\n )\n );\n\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(\n Lib_SafeExecutionManagerWrapper.safeCALLER() == owner,\n \"Function can only be called by the owner of this contract.\"\n );\n _;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n \n /**\n * Initializes the whitelist.\n * @param _owner Address of the owner for this contract.\n * @param _allowArbitraryDeployment Whether or not to allow arbitrary contract deployment.\n */\n function initialize(\n address _owner,\n bool _allowArbitraryDeployment\n )\n override\n public\n {\n bool initialized = Lib_Bytes32Utils.toBool(\n Lib_SafeExecutionManagerWrapper.safeSLOAD(KEY_INITIALIZED)\n );\n\n if (initialized == true) {\n return;\n }\n\n Lib_SafeExecutionManagerWrapper.safeSSTORE(\n KEY_INITIALIZED,\n Lib_Bytes32Utils.fromBool(true)\n );\n Lib_SafeExecutionManagerWrapper.safeSSTORE(\n KEY_OWNER,\n Lib_Bytes32Utils.fromAddress(_owner)\n );\n Lib_SafeExecutionManagerWrapper.safeSSTORE(\n KEY_ALLOW_ARBITRARY_DEPLOYMENT,\n Lib_Bytes32Utils.fromBool(_allowArbitraryDeployment)\n );\n }\n\n /**\n * Gets the owner of the whitelist.\n */\n function getOwner()\n override\n public\n returns(\n address\n )\n {\n return Lib_Bytes32Utils.toAddress(\n Lib_SafeExecutionManagerWrapper.safeSLOAD(\n KEY_OWNER\n )\n );\n }\n\n /**\n * Adds or removes an address from the deployment whitelist.\n * @param _deployer Address to update permissions for.\n * @param _isWhitelisted Whether or not the address is whitelisted.\n */\n function setWhitelistedDeployer(\n address _deployer,\n bool _isWhitelisted\n )\n override\n public\n onlyOwner\n {\n Lib_SafeExecutionManagerWrapper.safeSSTORE(\n Lib_Bytes32Utils.fromAddress(_deployer),\n Lib_Bytes32Utils.fromBool(_isWhitelisted)\n );\n }\n\n /**\n * Updates the owner of this contract.\n * @param _owner Address of the new owner.\n */\n function setOwner(\n address _owner\n )\n override\n public\n onlyOwner\n {\n Lib_SafeExecutionManagerWrapper.safeSSTORE(\n KEY_OWNER,\n Lib_Bytes32Utils.fromAddress(_owner)\n );\n }\n\n /**\n * Updates the arbitrary deployment flag.\n * @param _allowArbitraryDeployment Whether or not to allow arbitrary contract deployment.\n */\n function setAllowArbitraryDeployment(\n bool _allowArbitraryDeployment\n )\n override\n public\n onlyOwner\n {\n Lib_SafeExecutionManagerWrapper.safeSSTORE(\n KEY_ALLOW_ARBITRARY_DEPLOYMENT,\n Lib_Bytes32Utils.fromBool(_allowArbitraryDeployment)\n );\n }\n\n /**\n * Permanently enables arbitrary contract deployment and deletes the owner.\n */\n function enableArbitraryContractDeployment()\n override\n public\n onlyOwner\n {\n setAllowArbitraryDeployment(true);\n setOwner(address(0));\n }\n\n /**\n * Checks whether an address is allowed to deploy contracts.\n * @param _deployer Address to check.\n * @return _allowed Whether or not the address can deploy contracts.\n */\n function isDeployerAllowed(\n address _deployer\n )\n override\n public\n returns (\n bool _allowed\n )\n {\n bool initialized = Lib_Bytes32Utils.toBool(\n Lib_SafeExecutionManagerWrapper.safeSLOAD(KEY_INITIALIZED)\n );\n\n if (initialized == false) {\n return true;\n }\n\n bool allowArbitraryDeployment = Lib_Bytes32Utils.toBool(\n Lib_SafeExecutionManagerWrapper.safeSLOAD(KEY_ALLOW_ARBITRARY_DEPLOYMENT)\n );\n\n if (allowArbitraryDeployment == true) {\n return true;\n }\n\n bool isWhitelisted = Lib_Bytes32Utils.toBool(\n Lib_SafeExecutionManagerWrapper.safeSLOAD(\n Lib_Bytes32Utils.fromAddress(_deployer)\n )\n );\n\n return isWhitelisted; \n }\n}\n" - }, - "contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Contract Imports */\nimport { Ownable } from \"./Lib_Ownable.sol\";\n\n/**\n * @title Lib_AddressManager\n */\ncontract Lib_AddressManager is Ownable {\n\n /**********\n * Events *\n **********/\n\n event AddressSet(\n string _name,\n address _newAddress\n );\n\n\n /*************\n * Variables *\n *************/\n\n mapping (bytes32 => address) private addresses;\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Changes the address associated with a particular name.\n * @param _name String name to associate an address with.\n * @param _address Address to associate with the name.\n */\n function setAddress(\n string memory _name,\n address _address\n )\n public\n onlyOwner\n {\n addresses[_getNameHash(_name)] = _address;\n\n emit AddressSet(\n _name,\n _address\n );\n }\n\n /**\n * Retrieves the address associated with a given name.\n * @param _name Name to retrieve an address for.\n * @return Address associated with the given name.\n */\n function getAddress(\n string memory _name\n )\n public\n view\n returns (\n address\n )\n {\n return addresses[_getNameHash(_name)];\n }\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Computes the hash of a name.\n * @param _name Name to compute a hash for.\n * @return Hash of the given name.\n */\n function _getNameHash(\n string memory _name\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n return keccak256(abi.encodePacked(_name));\n }\n}\n" - }, - "contracts/optimistic-ethereum/libraries/resolver/Lib_Ownable.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/**\n * @title Ownable\n * @dev Adapted from https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol\n */\nabstract contract Ownable {\n\n /*************\n * Variables *\n *************/\n\n address public owner;\n\n\n /**********\n * Events *\n **********/\n\n event OwnershipTransferred(\n address indexed previousOwner,\n address indexed newOwner\n );\n\n\n /***************\n * Constructor *\n ***************/\n\n constructor() {\n owner = msg.sender;\n emit OwnershipTransferred(address(0), owner);\n }\n\n\n /**********************\n * Function Modifiers *\n **********************/\n\n modifier onlyOwner() {\n require(\n owner == msg.sender,\n \"Ownable: caller is not the owner\"\n );\n _;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Sets the owner of this contract to the zero address, effectively renouncing ownership\n * completely. Can only be called by the current owner of this contract.\n */\n function renounceOwnership()\n public\n virtual\n onlyOwner\n {\n emit OwnershipTransferred(owner, address(0));\n owner = address(0);\n }\n\n /**\n * Transfers ownership of this contract to a new address. Can only be called by the current\n * owner of this contract.\n * @param _newOwner Address of the new contract owner.\n */\n function transferOwnership(\n address _newOwner\n )\n public\n virtual\n onlyOwner\n {\n require(\n _newOwner != address(0),\n \"Ownable: new owner cannot be the zero address\"\n );\n\n emit OwnershipTransferred(owner, _newOwner);\n owner = _newOwner;\n }\n}\n" - }, - "contracts/optimistic-ethereum/iOVM/predeploys/iOVM_DeployerWhitelist.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/**\n * @title iOVM_DeployerWhitelist\n */\ninterface iOVM_DeployerWhitelist {\n\n /********************\n * Public Functions *\n ********************/\n\n function initialize(address _owner, bool _allowArbitraryDeployment) external;\n function getOwner() external returns (address _owner);\n function setWhitelistedDeployer(address _deployer, bool _isWhitelisted) external;\n function setOwner(address _newOwner) external;\n function setAllowArbitraryDeployment(bool _allowArbitraryDeployment) external;\n function enableArbitraryContractDeployment() external;\n function isDeployerAllowed(address _deployer) external returns (bool _allowed);\n}\n" - }, - "contracts/optimistic-ethereum/OVM/predeploys/OVM_SequencerEntrypoint.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Library Imports */\nimport { Lib_BytesUtils } from \"../../libraries/utils/Lib_BytesUtils.sol\";\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_ECDSAUtils } from \"../../libraries/utils/Lib_ECDSAUtils.sol\";\nimport { Lib_SafeExecutionManagerWrapper } from \"../../libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\";\n\n/**\n * @title OVM_SequencerEntrypoint\n * @dev The Sequencer Entrypoint is a predeploy which, despite its name, can in fact be called by \n * any account. It accepts a more efficient compressed calldata format, which it decompresses and \n * encodes to the standard EIP155 transaction format.\n * This contract is the implementation referenced by the Proxy Sequencer Entrypoint, thus enabling\n * the Optimism team to upgrade the decompression of calldata from the Sequencer.\n * \n * Compiler used: solc\n * Runtime target: OVM\n */\ncontract OVM_SequencerEntrypoint {\n\n /*********\n * Enums *\n *********/\n \n enum TransactionType {\n NATIVE_ETH_TRANSACTION,\n ETH_SIGNED_MESSAGE\n }\n\n\n /*********************\n * Fallback Function *\n *********************/\n\n /**\n * Uses a custom \"compressed\" format to save on calldata gas:\n * calldata[00:01]: transaction type (0 == EIP 155, 2 == Eth Sign Message)\n * calldata[01:33]: signature \"r\" parameter\n * calldata[33:65]: signature \"s\" parameter\n * calldata[65:66]: signature \"v\" parameter\n * calldata[66:69]: transaction gas limit\n * calldata[69:72]: transaction gas price\n * calldata[72:75]: transaction nonce\n * calldata[75:95]: transaction target address\n * calldata[95:XX]: transaction data\n */\n fallback()\n external\n {\n TransactionType transactionType = _getTransactionType(Lib_BytesUtils.toUint8(msg.data, 0));\n\n bytes32 r = Lib_BytesUtils.toBytes32(Lib_BytesUtils.slice(msg.data, 1, 32));\n bytes32 s = Lib_BytesUtils.toBytes32(Lib_BytesUtils.slice(msg.data, 33, 32));\n uint8 v = Lib_BytesUtils.toUint8(msg.data, 65);\n\n // Remainder is the transaction to execute.\n bytes memory compressedTx = Lib_BytesUtils.slice(msg.data, 66);\n bool isEthSignedMessage = transactionType == TransactionType.ETH_SIGNED_MESSAGE;\n\n // Need to decompress and then re-encode the transaction based on the original encoding.\n bytes memory encodedTx = Lib_OVMCodec.encodeEIP155Transaction(\n Lib_OVMCodec.decompressEIP155Transaction(compressedTx),\n isEthSignedMessage\n );\n\n address target = Lib_ECDSAUtils.recover(\n encodedTx,\n isEthSignedMessage,\n uint8(v),\n r,\n s\n );\n\n if (Lib_SafeExecutionManagerWrapper.safeEXTCODESIZE(target) == 0) {\n // ProxyEOA has not yet been deployed for this EOA.\n bytes32 messageHash = Lib_ECDSAUtils.getMessageHash(encodedTx, isEthSignedMessage);\n Lib_SafeExecutionManagerWrapper.safeCREATEEOA(messageHash, uint8(v), r, s);\n }\n\n // ProxyEOA has been deployed for this EOA, continue to CALL.\n bytes memory callbytes = abi.encodeWithSignature(\n \"execute(bytes,uint8,uint8,bytes32,bytes32)\",\n encodedTx,\n isEthSignedMessage,\n uint8(v),\n r,\n s\n );\n\n Lib_SafeExecutionManagerWrapper.safeCALL(\n gasleft(),\n target,\n callbytes\n );\n }\n \n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Converts a uint256 into a TransactionType enum.\n * @param _transactionType Transaction type index.\n * @return _txType Transaction type enum value.\n */\n function _getTransactionType(\n uint8 _transactionType\n )\n internal\n returns (\n TransactionType _txType\n )\n {\n if (_transactionType == 0) {\n return TransactionType.NATIVE_ETH_TRANSACTION;\n } if (_transactionType == 2) {\n return TransactionType.ETH_SIGNED_MESSAGE;\n } else {\n Lib_SafeExecutionManagerWrapper.safeREVERT(\n \"Transaction type must be 0 or 2\"\n );\n }\n }\n}\n" - }, - "contracts/test-libraries/utils/TestLib_ECDSAUtils.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Library Imports */\nimport { Lib_ECDSAUtils } from \"../../optimistic-ethereum/libraries/utils/Lib_ECDSAUtils.sol\";\n\n/**\n * @title TestLib_ECDSAUtils\n */\ncontract TestLib_ECDSAUtils {\n\n function recover(\n bytes memory _message,\n bool _isEthSignedMessage,\n uint8 _v,\n bytes32 _r,\n bytes32 _s\n )\n public\n pure\n returns (\n address _sender\n )\n {\n return Lib_ECDSAUtils.recover(\n _message,\n _isEthSignedMessage,\n _v,\n _r,\n _s\n );\n }\n}\n" - }, - "contracts/test-libraries/codec/TestLib_OVMCodec.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../optimistic-ethereum/libraries/codec/Lib_OVMCodec.sol\";\n\n/**\n * @title TestLib_OVMCodec\n */\ncontract TestLib_OVMCodec {\n\n function decodeEIP155Transaction(\n bytes memory _transaction,\n bool _isEthSignedMessage\n )\n public\n pure\n returns (\n Lib_OVMCodec.EIP155Transaction memory _decoded\n )\n {\n return Lib_OVMCodec.decodeEIP155Transaction(_transaction, _isEthSignedMessage);\n }\n\n function encodeTransaction(\n Lib_OVMCodec.Transaction memory _transaction\n )\n public\n pure\n returns (\n bytes memory _encoded\n )\n {\n return Lib_OVMCodec.encodeTransaction(_transaction);\n }\n\n function hashTransaction(\n Lib_OVMCodec.Transaction memory _transaction\n )\n public\n pure\n returns (\n bytes32 _hash\n )\n {\n return Lib_OVMCodec.hashTransaction(_transaction);\n }\n\n function decompressEIP155Transaction(\n bytes memory _transaction\n )\n public\n returns (\n Lib_OVMCodec.EIP155Transaction memory _decompressed\n )\n {\n return Lib_OVMCodec.decompressEIP155Transaction(_transaction);\n }\n}\n" - }, - "contracts/optimistic-ethereum/OVM/verification/OVM_StateTransitioner.sol": { - "content": "// SPDX-License-Identifier: MIT\n// @unsupported: ovm\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\nimport { Lib_EthUtils } from \"../../libraries/utils/Lib_EthUtils.sol\";\nimport { Lib_Bytes32Utils } from \"../../libraries/utils/Lib_Bytes32Utils.sol\";\nimport { Lib_BytesUtils } from \"../../libraries/utils/Lib_BytesUtils.sol\";\nimport { Lib_SecureMerkleTrie } from \"../../libraries/trie/Lib_SecureMerkleTrie.sol\";\nimport { Lib_RLPWriter } from \"../../libraries/rlp/Lib_RLPWriter.sol\";\nimport { Lib_RLPReader } from \"../../libraries/rlp/Lib_RLPReader.sol\";\n\n/* Interface Imports */\nimport { iOVM_StateTransitioner } from \"../../iOVM/verification/iOVM_StateTransitioner.sol\";\nimport { iOVM_BondManager } from \"../../iOVM/verification/iOVM_BondManager.sol\";\nimport { iOVM_ExecutionManager } from \"../../iOVM/execution/iOVM_ExecutionManager.sol\";\nimport { iOVM_StateManager } from \"../../iOVM/execution/iOVM_StateManager.sol\";\nimport { iOVM_StateManagerFactory } from \"../../iOVM/execution/iOVM_StateManagerFactory.sol\";\n\n/* Contract Imports */\nimport { Abs_FraudContributor } from \"./Abs_FraudContributor.sol\";\n\n/**\n * @title OVM_StateTransitioner\n * @dev The State Transitioner coordinates the execution of a state transition during the evaluation of a\n * fraud proof. It feeds verified input to the Execution Manager's run(), and controls a State Manager (which is\n * uniquely created for each fraud proof).\n * Once a fraud proof has been initialized, this contract is provided with the pre-state root and verifies\n * that the OVM storage slots committed to the State Mangager are contained in that state\n * This contract controls the State Manager and Execution Manager, and uses them to calculate the\n * post-state root by applying the transaction. The Fraud Verifier can then check for fraud by comparing\n * the calculated post-state root with the proposed post-state root.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract OVM_StateTransitioner is Lib_AddressResolver, Abs_FraudContributor, iOVM_StateTransitioner {\n\n /*******************\n * Data Structures *\n *******************/\n\n enum TransitionPhase {\n PRE_EXECUTION,\n POST_EXECUTION,\n COMPLETE\n }\n\n\n /*******************************************\n * Contract Variables: Contract References *\n *******************************************/\n\n iOVM_StateManager public ovmStateManager;\n\n\n /*******************************************\n * Contract Variables: Internal Accounting *\n *******************************************/\n\n bytes32 internal preStateRoot;\n bytes32 internal postStateRoot;\n TransitionPhase public phase;\n uint256 internal stateTransitionIndex;\n bytes32 internal transactionHash;\n\n\n /*************\n * Constants *\n *************/\n\n bytes32 internal constant EMPTY_ACCOUNT_CODE_HASH = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;\n bytes32 internal constant EMPTY_ACCOUNT_STORAGE_ROOT = 0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421;\n\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n * @param _stateTransitionIndex Index of the state transition being verified.\n * @param _preStateRoot State root before the transition was executed.\n * @param _transactionHash Hash of the executed transaction.\n */\n constructor(\n address _libAddressManager,\n uint256 _stateTransitionIndex,\n bytes32 _preStateRoot,\n bytes32 _transactionHash\n )\n Lib_AddressResolver(_libAddressManager)\n {\n stateTransitionIndex = _stateTransitionIndex;\n preStateRoot = _preStateRoot;\n postStateRoot = _preStateRoot;\n transactionHash = _transactionHash;\n\n ovmStateManager = iOVM_StateManagerFactory(resolve(\"OVM_StateManagerFactory\")).create(address(this));\n }\n\n\n /**********************\n * Function Modifiers *\n **********************/\n\n /**\n * Checks that a function is only run during a specific phase.\n * @param _phase Phase the function must run within.\n */\n modifier onlyDuringPhase(\n TransitionPhase _phase\n ) {\n require(\n phase == _phase,\n \"Function must be called during the correct phase.\"\n );\n _;\n }\n\n\n /**********************************\n * Public Functions: State Access *\n **********************************/\n\n /**\n * Retrieves the state root before execution.\n * @return _preStateRoot State root before execution.\n */\n function getPreStateRoot()\n override\n public\n view\n returns (\n bytes32 _preStateRoot\n )\n {\n return preStateRoot;\n }\n\n /**\n * Retrieves the state root after execution.\n * @return _postStateRoot State root after execution.\n */\n function getPostStateRoot()\n override\n public\n view\n returns (\n bytes32 _postStateRoot\n )\n {\n return postStateRoot;\n }\n\n /**\n * Checks whether the transitioner is complete.\n * @return _complete Whether or not the transition process is finished.\n */\n function isComplete()\n override\n public\n view\n returns (\n bool _complete\n )\n {\n return phase == TransitionPhase.COMPLETE;\n }\n\n\n /***********************************\n * Public Functions: Pre-Execution *\n ***********************************/\n\n /**\n * Allows a user to prove the initial state of a contract.\n * @param _ovmContractAddress Address of the contract on the OVM.\n * @param _ethContractAddress Address of the corresponding contract on L1.\n * @param _stateTrieWitness Proof of the account state.\n */\n function proveContractState(\n address _ovmContractAddress,\n address _ethContractAddress,\n bytes memory _stateTrieWitness\n )\n override\n public\n onlyDuringPhase(TransitionPhase.PRE_EXECUTION)\n contributesToFraudProof(preStateRoot, transactionHash)\n {\n // Exit quickly to avoid unnecessary work.\n require(\n (\n ovmStateManager.hasAccount(_ovmContractAddress) == false\n && ovmStateManager.hasEmptyAccount(_ovmContractAddress) == false\n ),\n \"Account state has already been proven.\"\n );\n\n // Function will fail if the proof is not a valid inclusion or exclusion proof.\n (\n bool exists,\n bytes memory encodedAccount\n ) = Lib_SecureMerkleTrie.get(\n abi.encodePacked(_ovmContractAddress),\n _stateTrieWitness,\n preStateRoot\n );\n\n if (exists == true) {\n // Account exists, this was an inclusion proof.\n Lib_OVMCodec.EVMAccount memory account = Lib_OVMCodec.decodeEVMAccount(\n encodedAccount\n );\n\n address ethContractAddress = _ethContractAddress;\n if (account.codeHash == EMPTY_ACCOUNT_CODE_HASH) {\n // Use a known empty contract to prevent an attack in which a user provides a\n // contract address here and then later deploys code to it.\n ethContractAddress = 0x0000000000000000000000000000000000000000;\n } else {\n // Otherwise, make sure that the code at the provided eth address matches the hash\n // of the code stored on L2.\n require(\n Lib_EthUtils.getCodeHash(ethContractAddress) == account.codeHash,\n \"OVM_StateTransitioner: Provided L1 contract code hash does not match L2 contract code hash.\"\n );\n }\n\n ovmStateManager.putAccount(\n _ovmContractAddress,\n Lib_OVMCodec.Account({\n nonce: account.nonce,\n balance: account.balance,\n storageRoot: account.storageRoot,\n codeHash: account.codeHash,\n ethAddress: ethContractAddress,\n isFresh: false\n })\n );\n } else {\n // Account does not exist, this was an exclusion proof.\n ovmStateManager.putEmptyAccount(_ovmContractAddress);\n }\n }\n\n /**\n * Allows a user to prove the initial state of a contract storage slot.\n * @param _ovmContractAddress Address of the contract on the OVM.\n * @param _key Claimed account slot key.\n * @param _storageTrieWitness Proof of the storage slot.\n */\n function proveStorageSlot(\n address _ovmContractAddress,\n bytes32 _key,\n bytes memory _storageTrieWitness\n )\n override\n public\n onlyDuringPhase(TransitionPhase.PRE_EXECUTION)\n contributesToFraudProof(preStateRoot, transactionHash)\n {\n // Exit quickly to avoid unnecessary work.\n require(\n ovmStateManager.hasContractStorage(_ovmContractAddress, _key) == false,\n \"Storage slot has already been proven.\"\n );\n\n require(\n ovmStateManager.hasAccount(_ovmContractAddress) == true,\n \"Contract must be verified before proving a storage slot.\"\n );\n\n bytes32 storageRoot = ovmStateManager.getAccountStorageRoot(_ovmContractAddress);\n bytes32 value;\n\n if (storageRoot == EMPTY_ACCOUNT_STORAGE_ROOT) {\n // Storage trie was empty, so the user is always allowed to insert zero-byte values.\n value = bytes32(0);\n } else {\n // Function will fail if the proof is not a valid inclusion or exclusion proof.\n (\n bool exists,\n bytes memory encodedValue\n ) = Lib_SecureMerkleTrie.get(\n abi.encodePacked(_key),\n _storageTrieWitness,\n storageRoot\n );\n\n if (exists == true) {\n // Inclusion proof.\n // Stored values are RLP encoded, with leading zeros removed.\n value = Lib_BytesUtils.toBytes32PadLeft(\n Lib_RLPReader.readBytes(encodedValue)\n );\n } else {\n // Exclusion proof, can only be zero bytes.\n value = bytes32(0);\n }\n }\n\n ovmStateManager.putContractStorage(\n _ovmContractAddress,\n _key,\n value\n );\n }\n\n\n /*******************************\n * Public Functions: Execution *\n *******************************/\n\n /**\n * Executes the state transition.\n * @param _transaction OVM transaction to execute.\n */\n function applyTransaction(\n Lib_OVMCodec.Transaction memory _transaction\n )\n override\n public\n onlyDuringPhase(TransitionPhase.PRE_EXECUTION)\n contributesToFraudProof(preStateRoot, transactionHash)\n {\n require(\n Lib_OVMCodec.hashTransaction(_transaction) == transactionHash,\n \"Invalid transaction provided.\"\n );\n\n // We require gas to complete the logic here in run() before/after execution,\n // But must ensure the full _tx.gasLimit can be given to the ovmCALL (determinism)\n // This includes 1/64 of the gas getting lost because of EIP-150 (lost twice--first\n // going into EM, then going into the code contract).\n require(\n gasleft() >= 100000 + _transaction.gasLimit * 1032 / 1000, // 1032/1000 = 1.032 = (64/63)^2 rounded up\n \"Not enough gas to execute transaction deterministically.\"\n );\n\n iOVM_ExecutionManager ovmExecutionManager = iOVM_ExecutionManager(resolve(\"OVM_ExecutionManager\"));\n\n // We call `setExecutionManager` right before `run` (and not earlier) just in case the\n // OVM_ExecutionManager address was updated between the time when this contract was created\n // and when `applyTransaction` was called.\n ovmStateManager.setExecutionManager(address(ovmExecutionManager));\n\n // `run` always succeeds *unless* the user hasn't provided enough gas to `applyTransaction`\n // or an INVALID_STATE_ACCESS flag was triggered. Either way, we won't get beyond this line\n // if that's the case.\n ovmExecutionManager.run(_transaction, address(ovmStateManager));\n\n // Prevent the Execution Manager from calling this SM again.\n ovmStateManager.setExecutionManager(address(0));\n phase = TransitionPhase.POST_EXECUTION;\n }\n\n\n /************************************\n * Public Functions: Post-Execution *\n ************************************/\n\n /**\n * Allows a user to commit the final state of a contract.\n * @param _ovmContractAddress Address of the contract on the OVM.\n * @param _stateTrieWitness Proof of the account state.\n */\n function commitContractState(\n address _ovmContractAddress,\n bytes memory _stateTrieWitness\n )\n override\n public\n onlyDuringPhase(TransitionPhase.POST_EXECUTION)\n contributesToFraudProof(preStateRoot, transactionHash)\n {\n require(\n ovmStateManager.getTotalUncommittedContractStorage() == 0,\n \"All storage must be committed before committing account states.\"\n );\n\n require (\n ovmStateManager.commitAccount(_ovmContractAddress) == true,\n \"Account state wasn't changed or has already been committed.\"\n );\n\n Lib_OVMCodec.Account memory account = ovmStateManager.getAccount(_ovmContractAddress);\n\n postStateRoot = Lib_SecureMerkleTrie.update(\n abi.encodePacked(_ovmContractAddress),\n Lib_OVMCodec.encodeEVMAccount(\n Lib_OVMCodec.toEVMAccount(account)\n ),\n _stateTrieWitness,\n postStateRoot\n );\n\n // Emit an event to help clients figure out the proof ordering.\n emit AccountCommitted(\n _ovmContractAddress\n );\n }\n\n /**\n * Allows a user to commit the final state of a contract storage slot.\n * @param _ovmContractAddress Address of the contract on the OVM.\n * @param _key Claimed account slot key.\n * @param _storageTrieWitness Proof of the storage slot.\n */\n function commitStorageSlot(\n address _ovmContractAddress,\n bytes32 _key,\n bytes memory _storageTrieWitness\n )\n override\n public\n onlyDuringPhase(TransitionPhase.POST_EXECUTION)\n contributesToFraudProof(preStateRoot, transactionHash)\n {\n require(\n ovmStateManager.commitContractStorage(_ovmContractAddress, _key) == true,\n \"Storage slot value wasn't changed or has already been committed.\"\n );\n\n Lib_OVMCodec.Account memory account = ovmStateManager.getAccount(_ovmContractAddress);\n bytes32 value = ovmStateManager.getContractStorage(_ovmContractAddress, _key);\n\n account.storageRoot = Lib_SecureMerkleTrie.update(\n abi.encodePacked(_key),\n Lib_RLPWriter.writeBytes(\n Lib_Bytes32Utils.removeLeadingZeros(value)\n ),\n _storageTrieWitness,\n account.storageRoot\n );\n\n ovmStateManager.putAccount(_ovmContractAddress, account);\n\n // Emit an event to help clients figure out the proof ordering.\n emit ContractStorageCommitted(\n _ovmContractAddress,\n _key\n );\n }\n\n\n /**********************************\n * Public Functions: Finalization *\n **********************************/\n\n /**\n * Finalizes the transition process.\n */\n function completeTransition()\n override\n public\n onlyDuringPhase(TransitionPhase.POST_EXECUTION)\n {\n require(\n ovmStateManager.getTotalUncommittedAccounts() == 0,\n \"All accounts must be committed before completing a transition.\"\n );\n\n require(\n ovmStateManager.getTotalUncommittedContractStorage() == 0,\n \"All storage must be committed before completing a transition.\"\n );\n\n phase = TransitionPhase.COMPLETE;\n }\n}\n" - }, - "contracts/optimistic-ethereum/libraries/trie/Lib_SecureMerkleTrie.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_MerkleTrie } from \"./Lib_MerkleTrie.sol\";\n\n/**\n * @title Lib_SecureMerkleTrie\n */\nlibrary Lib_SecureMerkleTrie {\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * @notice Verifies a proof that a given key/value pair is present in the\n * Merkle trie.\n * @param _key Key of the node to search for, as a hex string.\n * @param _value Value of the node to search for, as a hex string.\n * @param _proof Merkle trie inclusion proof for the desired node. Unlike\n * traditional Merkle trees, this proof is executed top-down and consists\n * of a list of RLP-encoded nodes that make a path down to the target node.\n * @param _root Known root of the Merkle trie. Used to verify that the\n * included proof is correctly constructed.\n * @return _verified `true` if the k/v pair exists in the trie, `false` otherwise.\n */\n function verifyInclusionProof(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n )\n internal\n pure\n returns (\n bool _verified\n )\n {\n bytes memory key = _getSecureKey(_key);\n return Lib_MerkleTrie.verifyInclusionProof(key, _value, _proof, _root);\n }\n\n /**\n * @notice Verifies a proof that a given key is *not* present in\n * the Merkle trie.\n * @param _key Key of the node to search for, as a hex string.\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\n * target node.\n * @param _root Known root of the Merkle trie. Used to verify that the\n * included proof is correctly constructed.\n * @return _verified `true` if the key is not present in the trie, `false` otherwise.\n */\n function verifyExclusionProof(\n bytes memory _key,\n bytes memory _proof,\n bytes32 _root\n )\n internal\n pure\n returns (\n bool _verified\n )\n {\n bytes memory key = _getSecureKey(_key);\n return Lib_MerkleTrie.verifyExclusionProof(key, _proof, _root);\n }\n\n /**\n * @notice Updates a Merkle trie and returns a new root hash.\n * @param _key Key of the node to update, as a hex string.\n * @param _value Value of the node to update, as a hex string.\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\n * target node. If the key exists, we can simply update the value.\n * Otherwise, we need to modify the trie to handle the new k/v pair.\n * @param _root Known root of the Merkle trie. Used to verify that the\n * included proof is correctly constructed.\n * @return _updatedRoot Root hash of the newly constructed trie.\n */\n function update(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n )\n internal\n pure\n returns (\n bytes32 _updatedRoot\n )\n {\n bytes memory key = _getSecureKey(_key);\n return Lib_MerkleTrie.update(key, _value, _proof, _root);\n }\n\n /**\n * @notice Retrieves the value associated with a given key.\n * @param _key Key to search for, as hex bytes.\n * @param _proof Merkle trie inclusion proof for the key.\n * @param _root Known root of the Merkle trie.\n * @return _exists Whether or not the key exists.\n * @return _value Value of the key if it exists.\n */\n function get(\n bytes memory _key,\n bytes memory _proof,\n bytes32 _root\n )\n internal\n pure\n returns (\n bool _exists,\n bytes memory _value\n )\n {\n bytes memory key = _getSecureKey(_key);\n return Lib_MerkleTrie.get(key, _proof, _root);\n }\n\n /**\n * Computes the root hash for a trie with a single node.\n * @param _key Key for the single node.\n * @param _value Value for the single node.\n * @return _updatedRoot Hash of the trie.\n */\n function getSingleNodeRootHash(\n bytes memory _key,\n bytes memory _value\n )\n internal\n pure\n returns (\n bytes32 _updatedRoot\n )\n {\n bytes memory key = _getSecureKey(_key);\n return Lib_MerkleTrie.getSingleNodeRootHash(key, _value);\n }\n\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * Computes the secure counterpart to a key.\n * @param _key Key to get a secure key from.\n * @return _secureKey Secure version of the key.\n */\n function _getSecureKey(\n bytes memory _key\n )\n private\n pure\n returns (\n bytes memory _secureKey\n )\n {\n return abi.encodePacked(keccak256(_key));\n }\n}" - }, - "contracts/optimistic-ethereum/iOVM/verification/iOVM_StateTransitioner.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/**\n * @title iOVM_StateTransitioner\n */\ninterface iOVM_StateTransitioner {\n\n /**********\n * Events *\n **********/\n\n event AccountCommitted(\n address _address\n );\n\n event ContractStorageCommitted(\n address _address,\n bytes32 _key\n );\n\n\n /**********************************\n * Public Functions: State Access *\n **********************************/\n\n function getPreStateRoot() external view returns (bytes32 _preStateRoot);\n function getPostStateRoot() external view returns (bytes32 _postStateRoot);\n function isComplete() external view returns (bool _complete);\n\n\n /***********************************\n * Public Functions: Pre-Execution *\n ***********************************/\n\n function proveContractState(\n address _ovmContractAddress,\n address _ethContractAddress,\n bytes calldata _stateTrieWitness\n ) external;\n\n function proveStorageSlot(\n address _ovmContractAddress,\n bytes32 _key,\n bytes calldata _storageTrieWitness\n ) external;\n\n\n /*******************************\n * Public Functions: Execution *\n *******************************/\n\n function applyTransaction(\n Lib_OVMCodec.Transaction calldata _transaction\n ) external;\n\n\n /************************************\n * Public Functions: Post-Execution *\n ************************************/\n\n function commitContractState(\n address _ovmContractAddress,\n bytes calldata _stateTrieWitness\n ) external;\n\n function commitStorageSlot(\n address _ovmContractAddress,\n bytes32 _key,\n bytes calldata _storageTrieWitness\n ) external;\n\n\n /**********************************\n * Public Functions: Finalization *\n **********************************/\n\n function completeTransition() external;\n}\n" - }, - "contracts/optimistic-ethereum/iOVM/verification/iOVM_BondManager.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\ninterface ERC20 {\n function transfer(address, uint256) external returns (bool);\n function transferFrom(address, address, uint256) external returns (bool);\n}\n\n/// All the errors which may be encountered on the bond manager\nlibrary Errors {\n string constant ERC20_ERR = \"BondManager: Could not post bond\";\n string constant ALREADY_FINALIZED = \"BondManager: Fraud proof for this pre-state root has already been finalized\";\n string constant SLASHED = \"BondManager: Cannot finalize withdrawal, you probably got slashed\";\n string constant WRONG_STATE = \"BondManager: Wrong bond state for proposer\";\n string constant CANNOT_CLAIM = \"BondManager: Cannot claim yet. Dispute must be finalized first\";\n\n string constant WITHDRAWAL_PENDING = \"BondManager: Withdrawal already pending\";\n string constant TOO_EARLY = \"BondManager: Too early to finalize your withdrawal\";\n\n string constant ONLY_TRANSITIONER = \"BondManager: Only the transitioner for this pre-state root may call this function\";\n string constant ONLY_FRAUD_VERIFIER = \"BondManager: Only the fraud verifier may call this function\";\n string constant ONLY_STATE_COMMITMENT_CHAIN = \"BondManager: Only the state commitment chain may call this function\";\n string constant WAIT_FOR_DISPUTES = \"BondManager: Wait for other potential disputes\";\n}\n\n/**\n * @title iOVM_BondManager\n */\ninterface iOVM_BondManager {\n\n /*******************\n * Data Structures *\n *******************/\n\n /// The lifecycle of a proposer's bond\n enum State {\n // Before depositing or after getting slashed, a user is uncollateralized\n NOT_COLLATERALIZED,\n // After depositing, a user is collateralized\n COLLATERALIZED,\n // After a user has initiated a withdrawal\n WITHDRAWING\n }\n\n /// A bond posted by a proposer\n struct Bond {\n // The user's state\n State state;\n // The timestamp at which a proposer issued their withdrawal request\n uint32 withdrawalTimestamp;\n // The time when the first disputed was initiated for this bond\n uint256 firstDisputeAt;\n // The earliest observed state root for this bond which has had fraud\n bytes32 earliestDisputedStateRoot;\n // The state root's timestamp\n uint256 earliestTimestamp;\n }\n\n // Per pre-state root, store the number of state provisions that were made\n // and how many of these calls were made by each user. Payouts will then be\n // claimed by users proportionally for that dispute.\n struct Rewards {\n // Flag to check if rewards for a fraud proof are claimable\n bool canClaim;\n // Total number of `recordGasSpent` calls made\n uint256 total;\n // The gas spent by each user to provide witness data. The sum of all\n // values inside this map MUST be equal to the value of `total`\n mapping(address => uint256) gasSpent;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n function recordGasSpent(\n bytes32 _preStateRoot,\n bytes32 _txHash,\n address _who,\n uint256 _gasSpent\n ) external;\n\n function finalize(\n bytes32 _preStateRoot,\n address _publisher,\n uint256 _timestamp\n ) external;\n\n function deposit() external;\n\n function startWithdrawal() external;\n\n function finalizeWithdrawal() external;\n\n function claim(\n address _who\n ) external;\n\n function isCollateralized(\n address _who\n ) external view returns (bool);\n\n function getGasSpent(\n bytes32 _preStateRoot,\n address _who\n ) external view returns (uint256);\n}\n" - }, - "contracts/optimistic-ethereum/iOVM/execution/iOVM_StateManagerFactory.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Contract Imports */\nimport { iOVM_StateManager } from \"./iOVM_StateManager.sol\";\n\n/**\n * @title iOVM_StateManagerFactory\n */\ninterface iOVM_StateManagerFactory {\n\n /***************************************\n * Public Functions: Contract Creation *\n ***************************************/\n\n function create(\n address _owner\n )\n external\n returns (\n iOVM_StateManager _ovmStateManager\n );\n}\n" - }, - "contracts/optimistic-ethereum/OVM/verification/Abs_FraudContributor.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\nimport { iOVM_BondManager } from \"../../iOVM/verification/iOVM_BondManager.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/// Minimal contract to be inherited by contracts consumed by users that provide\n/// data for fraud proofs\nabstract contract Abs_FraudContributor is Lib_AddressResolver {\n /// Decorate your functions with this modifier to store how much total gas was\n /// consumed by the sender, to reward users fairly\n modifier contributesToFraudProof(bytes32 preStateRoot, bytes32 txHash) {\n uint256 startGas = gasleft();\n _;\n uint256 gasSpent = startGas - gasleft();\n iOVM_BondManager(resolve('OVM_BondManager')).recordGasSpent(preStateRoot, txHash, msg.sender, gasSpent);\n }\n}\n" - }, - "contracts/optimistic-ethereum/libraries/trie/Lib_MerkleTrie.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Library Imports */\nimport { Lib_BytesUtils } from \"../utils/Lib_BytesUtils.sol\";\nimport { Lib_RLPReader } from \"../rlp/Lib_RLPReader.sol\";\nimport { Lib_RLPWriter } from \"../rlp/Lib_RLPWriter.sol\";\n\n/**\n * @title Lib_MerkleTrie\n */\nlibrary Lib_MerkleTrie {\n\n /*******************\n * Data Structures *\n *******************/\n\n enum NodeType {\n BranchNode,\n ExtensionNode,\n LeafNode\n }\n\n struct TrieNode {\n bytes encoded;\n Lib_RLPReader.RLPItem[] decoded;\n }\n\n\n /**********************\n * Contract Constants *\n **********************/\n\n // TREE_RADIX determines the number of elements per branch node.\n uint256 constant TREE_RADIX = 16;\n // Branch nodes have TREE_RADIX elements plus an additional `value` slot.\n uint256 constant BRANCH_NODE_LENGTH = TREE_RADIX + 1;\n // Leaf nodes and extension nodes always have two elements, a `path` and a `value`.\n uint256 constant LEAF_OR_EXTENSION_NODE_LENGTH = 2;\n\n // Prefixes are prepended to the `path` within a leaf or extension node and\n // allow us to differentiate between the two node types. `ODD` or `EVEN` is\n // determined by the number of nibbles within the unprefixed `path`. If the\n // number of nibbles if even, we need to insert an extra padding nibble so\n // the resulting prefixed `path` has an even number of nibbles.\n uint8 constant PREFIX_EXTENSION_EVEN = 0;\n uint8 constant PREFIX_EXTENSION_ODD = 1;\n uint8 constant PREFIX_LEAF_EVEN = 2;\n uint8 constant PREFIX_LEAF_ODD = 3;\n\n // Just a utility constant. RLP represents `NULL` as 0x80.\n bytes1 constant RLP_NULL = bytes1(0x80);\n bytes constant RLP_NULL_BYTES = hex'80';\n bytes32 constant internal KECCAK256_RLP_NULL_BYTES = keccak256(RLP_NULL_BYTES);\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * @notice Verifies a proof that a given key/value pair is present in the\n * Merkle trie.\n * @param _key Key of the node to search for, as a hex string.\n * @param _value Value of the node to search for, as a hex string.\n * @param _proof Merkle trie inclusion proof for the desired node. Unlike\n * traditional Merkle trees, this proof is executed top-down and consists\n * of a list of RLP-encoded nodes that make a path down to the target node.\n * @param _root Known root of the Merkle trie. Used to verify that the\n * included proof is correctly constructed.\n * @return _verified `true` if the k/v pair exists in the trie, `false` otherwise.\n */\n function verifyInclusionProof(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n )\n internal\n pure\n returns (\n bool _verified\n )\n {\n (\n bool exists,\n bytes memory value\n ) = get(_key, _proof, _root);\n\n return (\n exists && Lib_BytesUtils.equal(_value, value)\n );\n }\n\n /**\n * @notice Verifies a proof that a given key is *not* present in\n * the Merkle trie.\n * @param _key Key of the node to search for, as a hex string.\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\n * target node.\n * @param _root Known root of the Merkle trie. Used to verify that the\n * included proof is correctly constructed.\n * @return _verified `true` if the key is absent in the trie, `false` otherwise.\n */\n function verifyExclusionProof(\n bytes memory _key,\n bytes memory _proof,\n bytes32 _root\n )\n internal\n pure\n returns (\n bool _verified\n )\n {\n (\n bool exists,\n ) = get(_key, _proof, _root);\n\n return exists == false;\n }\n\n /**\n * @notice Updates a Merkle trie and returns a new root hash.\n * @param _key Key of the node to update, as a hex string.\n * @param _value Value of the node to update, as a hex string.\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\n * target node. If the key exists, we can simply update the value.\n * Otherwise, we need to modify the trie to handle the new k/v pair.\n * @param _root Known root of the Merkle trie. Used to verify that the\n * included proof is correctly constructed.\n * @return _updatedRoot Root hash of the newly constructed trie.\n */\n function update(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n )\n internal\n pure\n returns (\n bytes32 _updatedRoot\n )\n {\n // Special case when inserting the very first node.\n if (_root == KECCAK256_RLP_NULL_BYTES) {\n return getSingleNodeRootHash(_key, _value);\n }\n\n TrieNode[] memory proof = _parseProof(_proof);\n (uint256 pathLength, bytes memory keyRemainder, ) = _walkNodePath(proof, _key, _root);\n TrieNode[] memory newPath = _getNewPath(proof, pathLength, keyRemainder, _value);\n\n return _getUpdatedTrieRoot(newPath, _key);\n }\n\n /**\n * @notice Retrieves the value associated with a given key.\n * @param _key Key to search for, as hex bytes.\n * @param _proof Merkle trie inclusion proof for the key.\n * @param _root Known root of the Merkle trie.\n * @return _exists Whether or not the key exists.\n * @return _value Value of the key if it exists.\n */\n function get(\n bytes memory _key,\n bytes memory _proof,\n bytes32 _root\n )\n internal\n pure\n returns (\n bool _exists,\n bytes memory _value\n )\n {\n TrieNode[] memory proof = _parseProof(_proof);\n (uint256 pathLength, bytes memory keyRemainder, bool isFinalNode) = _walkNodePath(proof, _key, _root);\n\n bool exists = keyRemainder.length == 0;\n\n require(\n exists || isFinalNode,\n \"Provided proof is invalid.\"\n );\n\n bytes memory value = exists ? _getNodeValue(proof[pathLength - 1]) : bytes('');\n\n return (\n exists,\n value\n );\n }\n\n /**\n * Computes the root hash for a trie with a single node.\n * @param _key Key for the single node.\n * @param _value Value for the single node.\n * @return _updatedRoot Hash of the trie.\n */\n function getSingleNodeRootHash(\n bytes memory _key,\n bytes memory _value\n )\n internal\n pure\n returns (\n bytes32 _updatedRoot\n )\n {\n return keccak256(_makeLeafNode(\n Lib_BytesUtils.toNibbles(_key),\n _value\n ).encoded);\n }\n\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * @notice Walks through a proof using a provided key.\n * @param _proof Inclusion proof to walk through.\n * @param _key Key to use for the walk.\n * @param _root Known root of the trie.\n * @return _pathLength Length of the final path\n * @return _keyRemainder Portion of the key remaining after the walk.\n * @return _isFinalNode Whether or not we've hit a dead end.\n */\n function _walkNodePath(\n TrieNode[] memory _proof,\n bytes memory _key,\n bytes32 _root\n )\n private\n pure\n returns (\n uint256 _pathLength,\n bytes memory _keyRemainder,\n bool _isFinalNode\n )\n {\n uint256 pathLength = 0;\n bytes memory key = Lib_BytesUtils.toNibbles(_key);\n\n bytes32 currentNodeID = _root;\n uint256 currentKeyIndex = 0;\n uint256 currentKeyIncrement = 0;\n TrieNode memory currentNode;\n\n // Proof is top-down, so we start at the first element (root).\n for (uint256 i = 0; i < _proof.length; i++) {\n currentNode = _proof[i];\n currentKeyIndex += currentKeyIncrement;\n\n // Keep track of the proof elements we actually need.\n // It's expensive to resize arrays, so this simply reduces gas costs.\n pathLength += 1;\n\n if (currentKeyIndex == 0) {\n // First proof element is always the root node.\n require(\n keccak256(currentNode.encoded) == currentNodeID,\n \"Invalid root hash\"\n );\n } else if (currentNode.encoded.length >= 32) {\n // Nodes 32 bytes or larger are hashed inside branch nodes.\n require(\n keccak256(currentNode.encoded) == currentNodeID,\n \"Invalid large internal hash\"\n );\n } else {\n // Nodes smaller than 31 bytes aren't hashed.\n require(\n Lib_BytesUtils.toBytes32(currentNode.encoded) == currentNodeID,\n \"Invalid internal node hash\"\n );\n }\n\n if (currentNode.decoded.length == BRANCH_NODE_LENGTH) {\n if (currentKeyIndex == key.length) {\n // We've hit the end of the key, meaning the value should be within this branch node.\n break;\n } else {\n // We're not at the end of the key yet.\n // Figure out what the next node ID should be and continue.\n uint8 branchKey = uint8(key[currentKeyIndex]);\n Lib_RLPReader.RLPItem memory nextNode = currentNode.decoded[branchKey];\n currentNodeID = _getNodeID(nextNode);\n currentKeyIncrement = 1;\n continue;\n }\n } else if (currentNode.decoded.length == LEAF_OR_EXTENSION_NODE_LENGTH) {\n bytes memory path = _getNodePath(currentNode);\n uint8 prefix = uint8(path[0]);\n uint8 offset = 2 - prefix % 2;\n bytes memory pathRemainder = Lib_BytesUtils.slice(path, offset);\n bytes memory keyRemainder = Lib_BytesUtils.slice(key, currentKeyIndex);\n uint256 sharedNibbleLength = _getSharedNibbleLength(pathRemainder, keyRemainder);\n\n if (prefix == PREFIX_LEAF_EVEN || prefix == PREFIX_LEAF_ODD) {\n if (\n pathRemainder.length == sharedNibbleLength &&\n keyRemainder.length == sharedNibbleLength\n ) {\n // The key within this leaf matches our key exactly.\n // Increment the key index to reflect that we have no remainder.\n currentKeyIndex += sharedNibbleLength;\n }\n\n // We've hit a leaf node, so our next node should be NULL.\n currentNodeID = bytes32(RLP_NULL);\n break;\n } else if (prefix == PREFIX_EXTENSION_EVEN || prefix == PREFIX_EXTENSION_ODD) {\n if (sharedNibbleLength == 0) {\n // Our extension node doesn't share any part of our key.\n // We've hit the end of this path, updates will need to modify this extension.\n currentNodeID = bytes32(RLP_NULL);\n break;\n } else {\n // Our extension shares some nibbles.\n // Carry on to the next node.\n currentNodeID = _getNodeID(currentNode.decoded[1]);\n currentKeyIncrement = sharedNibbleLength;\n continue;\n }\n } else {\n revert(\"Received a node with an unknown prefix\");\n }\n } else {\n revert(\"Received an unparseable node.\");\n }\n }\n\n // If our node ID is NULL, then we're at a dead end.\n bool isFinalNode = currentNodeID == bytes32(RLP_NULL);\n return (pathLength, Lib_BytesUtils.slice(key, currentKeyIndex), isFinalNode);\n }\n\n /**\n * @notice Creates new nodes to support a k/v pair insertion into a given\n * Merkle trie path.\n * @param _path Path to the node nearest the k/v pair.\n * @param _pathLength Length of the path. Necessary because the provided\n * path may include additional nodes (e.g., it comes directly from a proof)\n * and we can't resize in-memory arrays without costly duplication.\n * @param _keyRemainder Portion of the initial key that must be inserted\n * into the trie.\n * @param _value Value to insert at the given key.\n * @return _newPath A new path with the inserted k/v pair and extra supporting nodes.\n */\n function _getNewPath(\n TrieNode[] memory _path,\n uint256 _pathLength,\n bytes memory _keyRemainder,\n bytes memory _value\n )\n private\n pure\n returns (\n TrieNode[] memory _newPath\n )\n {\n bytes memory keyRemainder = _keyRemainder;\n\n // Most of our logic depends on the status of the last node in the path.\n TrieNode memory lastNode = _path[_pathLength - 1];\n NodeType lastNodeType = _getNodeType(lastNode);\n\n // Create an array for newly created nodes.\n // We need up to three new nodes, depending on the contents of the last node.\n // Since array resizing is expensive, we'll keep track of the size manually.\n // We're using an explicit `totalNewNodes += 1` after insertions for clarity.\n TrieNode[] memory newNodes = new TrieNode[](3);\n uint256 totalNewNodes = 0;\n\n if (keyRemainder.length == 0 && lastNodeType == NodeType.LeafNode) {\n // We've found a leaf node with the given key.\n // Simply need to update the value of the node to match.\n newNodes[totalNewNodes] = _makeLeafNode(_getNodeKey(lastNode), _value);\n totalNewNodes += 1;\n } else if (lastNodeType == NodeType.BranchNode) {\n if (keyRemainder.length == 0) {\n // We've found a branch node with the given key.\n // Simply need to update the value of the node to match.\n newNodes[totalNewNodes] = _editBranchValue(lastNode, _value);\n totalNewNodes += 1;\n } else {\n // We've found a branch node, but it doesn't contain our key.\n // Reinsert the old branch for now.\n newNodes[totalNewNodes] = lastNode;\n totalNewNodes += 1;\n // Create a new leaf node, slicing our remainder since the first byte points\n // to our branch node.\n newNodes[totalNewNodes] = _makeLeafNode(Lib_BytesUtils.slice(keyRemainder, 1), _value);\n totalNewNodes += 1;\n }\n } else {\n // Our last node is either an extension node or a leaf node with a different key.\n bytes memory lastNodeKey = _getNodeKey(lastNode);\n uint256 sharedNibbleLength = _getSharedNibbleLength(lastNodeKey, keyRemainder);\n\n if (sharedNibbleLength != 0) {\n // We've got some shared nibbles between the last node and our key remainder.\n // We'll need to insert an extension node that covers these shared nibbles.\n bytes memory nextNodeKey = Lib_BytesUtils.slice(lastNodeKey, 0, sharedNibbleLength);\n newNodes[totalNewNodes] = _makeExtensionNode(nextNodeKey, _getNodeHash(_value));\n totalNewNodes += 1;\n\n // Cut down the keys since we've just covered these shared nibbles.\n lastNodeKey = Lib_BytesUtils.slice(lastNodeKey, sharedNibbleLength);\n keyRemainder = Lib_BytesUtils.slice(keyRemainder, sharedNibbleLength);\n }\n\n // Create an empty branch to fill in.\n TrieNode memory newBranch = _makeEmptyBranchNode();\n\n if (lastNodeKey.length == 0) {\n // Key remainder was larger than the key for our last node.\n // The value within our last node is therefore going to be shifted into\n // a branch value slot.\n newBranch = _editBranchValue(newBranch, _getNodeValue(lastNode));\n } else {\n // Last node key was larger than the key remainder.\n // We're going to modify some index of our branch.\n uint8 branchKey = uint8(lastNodeKey[0]);\n // Move on to the next nibble.\n lastNodeKey = Lib_BytesUtils.slice(lastNodeKey, 1);\n\n if (lastNodeType == NodeType.LeafNode) {\n // We're dealing with a leaf node.\n // We'll modify the key and insert the old leaf node into the branch index.\n TrieNode memory modifiedLastNode = _makeLeafNode(lastNodeKey, _getNodeValue(lastNode));\n newBranch = _editBranchIndex(newBranch, branchKey, _getNodeHash(modifiedLastNode.encoded));\n } else if (lastNodeKey.length != 0) {\n // We're dealing with a shrinking extension node.\n // We need to modify the node to decrease the size of the key.\n TrieNode memory modifiedLastNode = _makeExtensionNode(lastNodeKey, _getNodeValue(lastNode));\n newBranch = _editBranchIndex(newBranch, branchKey, _getNodeHash(modifiedLastNode.encoded));\n } else {\n // We're dealing with an unnecessary extension node.\n // We're going to delete the node entirely.\n // Simply insert its current value into the branch index.\n newBranch = _editBranchIndex(newBranch, branchKey, _getNodeValue(lastNode));\n }\n }\n\n if (keyRemainder.length == 0) {\n // We've got nothing left in the key remainder.\n // Simply insert the value into the branch value slot.\n newBranch = _editBranchValue(newBranch, _value);\n // Push the branch into the list of new nodes.\n newNodes[totalNewNodes] = newBranch;\n totalNewNodes += 1;\n } else {\n // We've got some key remainder to work with.\n // We'll be inserting a leaf node into the trie.\n // First, move on to the next nibble.\n keyRemainder = Lib_BytesUtils.slice(keyRemainder, 1);\n // Push the branch into the list of new nodes.\n newNodes[totalNewNodes] = newBranch;\n totalNewNodes += 1;\n // Push a new leaf node for our k/v pair.\n newNodes[totalNewNodes] = _makeLeafNode(keyRemainder, _value);\n totalNewNodes += 1;\n }\n }\n\n // Finally, join the old path with our newly created nodes.\n // Since we're overwriting the last node in the path, we use `_pathLength - 1`.\n return _joinNodeArrays(_path, _pathLength - 1, newNodes, totalNewNodes);\n }\n\n /**\n * @notice Computes the trie root from a given path.\n * @param _nodes Path to some k/v pair.\n * @param _key Key for the k/v pair.\n * @return _updatedRoot Root hash for the updated trie.\n */\n function _getUpdatedTrieRoot(\n TrieNode[] memory _nodes,\n bytes memory _key\n )\n private\n pure\n returns (\n bytes32 _updatedRoot\n )\n {\n bytes memory key = Lib_BytesUtils.toNibbles(_key);\n\n // Some variables to keep track of during iteration.\n TrieNode memory currentNode;\n NodeType currentNodeType;\n bytes memory previousNodeHash;\n\n // Run through the path backwards to rebuild our root hash.\n for (uint256 i = _nodes.length; i > 0; i--) {\n // Pick out the current node.\n currentNode = _nodes[i - 1];\n currentNodeType = _getNodeType(currentNode);\n\n if (currentNodeType == NodeType.LeafNode) {\n // Leaf nodes are already correctly encoded.\n // Shift the key over to account for the nodes key.\n bytes memory nodeKey = _getNodeKey(currentNode);\n key = Lib_BytesUtils.slice(key, 0, key.length - nodeKey.length);\n } else if (currentNodeType == NodeType.ExtensionNode) {\n // Shift the key over to account for the nodes key.\n bytes memory nodeKey = _getNodeKey(currentNode);\n key = Lib_BytesUtils.slice(key, 0, key.length - nodeKey.length);\n\n // If this node is the last element in the path, it'll be correctly encoded\n // and we can skip this part.\n if (previousNodeHash.length > 0) {\n // Re-encode the node based on the previous node.\n currentNode = _makeExtensionNode(nodeKey, previousNodeHash);\n }\n } else if (currentNodeType == NodeType.BranchNode) {\n // If this node is the last element in the path, it'll be correctly encoded\n // and we can skip this part.\n if (previousNodeHash.length > 0) {\n // Re-encode the node based on the previous node.\n uint8 branchKey = uint8(key[key.length - 1]);\n key = Lib_BytesUtils.slice(key, 0, key.length - 1);\n currentNode = _editBranchIndex(currentNode, branchKey, previousNodeHash);\n }\n }\n\n // Compute the node hash for the next iteration.\n previousNodeHash = _getNodeHash(currentNode.encoded);\n }\n\n // Current node should be the root at this point.\n // Simply return the hash of its encoding.\n return keccak256(currentNode.encoded);\n }\n\n /**\n * @notice Parses an RLP-encoded proof into something more useful.\n * @param _proof RLP-encoded proof to parse.\n * @return _parsed Proof parsed into easily accessible structs.\n */\n function _parseProof(\n bytes memory _proof\n )\n private\n pure\n returns (\n TrieNode[] memory _parsed\n )\n {\n Lib_RLPReader.RLPItem[] memory nodes = Lib_RLPReader.readList(_proof);\n TrieNode[] memory proof = new TrieNode[](nodes.length);\n\n for (uint256 i = 0; i < nodes.length; i++) {\n bytes memory encoded = Lib_RLPReader.readBytes(nodes[i]);\n proof[i] = TrieNode({\n encoded: encoded,\n decoded: Lib_RLPReader.readList(encoded)\n });\n }\n\n return proof;\n }\n\n /**\n * @notice Picks out the ID for a node. Node ID is referred to as the\n * \"hash\" within the specification, but nodes < 32 bytes are not actually\n * hashed.\n * @param _node Node to pull an ID for.\n * @return _nodeID ID for the node, depending on the size of its contents.\n */\n function _getNodeID(\n Lib_RLPReader.RLPItem memory _node\n )\n private\n pure\n returns (\n bytes32 _nodeID\n )\n {\n bytes memory nodeID;\n\n if (_node.length < 32) {\n // Nodes smaller than 32 bytes are RLP encoded.\n nodeID = Lib_RLPReader.readRawBytes(_node);\n } else {\n // Nodes 32 bytes or larger are hashed.\n nodeID = Lib_RLPReader.readBytes(_node);\n }\n\n return Lib_BytesUtils.toBytes32(nodeID);\n }\n\n /**\n * @notice Gets the path for a leaf or extension node.\n * @param _node Node to get a path for.\n * @return _path Node path, converted to an array of nibbles.\n */\n function _getNodePath(\n TrieNode memory _node\n )\n private\n pure\n returns (\n bytes memory _path\n )\n {\n return Lib_BytesUtils.toNibbles(Lib_RLPReader.readBytes(_node.decoded[0]));\n }\n\n /**\n * @notice Gets the key for a leaf or extension node. Keys are essentially\n * just paths without any prefix.\n * @param _node Node to get a key for.\n * @return _key Node key, converted to an array of nibbles.\n */\n function _getNodeKey(\n TrieNode memory _node\n )\n private\n pure\n returns (\n bytes memory _key\n )\n {\n return _removeHexPrefix(_getNodePath(_node));\n }\n\n /**\n * @notice Gets the path for a node.\n * @param _node Node to get a value for.\n * @return _value Node value, as hex bytes.\n */\n function _getNodeValue(\n TrieNode memory _node\n )\n private\n pure\n returns (\n bytes memory _value\n )\n {\n return Lib_RLPReader.readBytes(_node.decoded[_node.decoded.length - 1]);\n }\n\n /**\n * @notice Computes the node hash for an encoded node. Nodes < 32 bytes\n * are not hashed, all others are keccak256 hashed.\n * @param _encoded Encoded node to hash.\n * @return _hash Hash of the encoded node. Simply the input if < 32 bytes.\n */\n function _getNodeHash(\n bytes memory _encoded\n )\n private\n pure\n returns (\n bytes memory _hash\n )\n {\n if (_encoded.length < 32) {\n return _encoded;\n } else {\n return abi.encodePacked(keccak256(_encoded));\n }\n }\n\n /**\n * @notice Determines the type for a given node.\n * @param _node Node to determine a type for.\n * @return _type Type of the node; BranchNode/ExtensionNode/LeafNode.\n */\n function _getNodeType(\n TrieNode memory _node\n )\n private\n pure\n returns (\n NodeType _type\n )\n {\n if (_node.decoded.length == BRANCH_NODE_LENGTH) {\n return NodeType.BranchNode;\n } else if (_node.decoded.length == LEAF_OR_EXTENSION_NODE_LENGTH) {\n bytes memory path = _getNodePath(_node);\n uint8 prefix = uint8(path[0]);\n\n if (prefix == PREFIX_LEAF_EVEN || prefix == PREFIX_LEAF_ODD) {\n return NodeType.LeafNode;\n } else if (prefix == PREFIX_EXTENSION_EVEN || prefix == PREFIX_EXTENSION_ODD) {\n return NodeType.ExtensionNode;\n }\n }\n\n revert(\"Invalid node type\");\n }\n\n /**\n * @notice Utility; determines the number of nibbles shared between two\n * nibble arrays.\n * @param _a First nibble array.\n * @param _b Second nibble array.\n * @return _shared Number of shared nibbles.\n */\n function _getSharedNibbleLength(\n bytes memory _a,\n bytes memory _b\n )\n private\n pure\n returns (\n uint256 _shared\n )\n {\n uint256 i = 0;\n while (_a.length > i && _b.length > i && _a[i] == _b[i]) {\n i++;\n }\n return i;\n }\n\n /**\n * @notice Utility; converts an RLP-encoded node into our nice struct.\n * @param _raw RLP-encoded node to convert.\n * @return _node Node as a TrieNode struct.\n */\n function _makeNode(\n bytes[] memory _raw\n )\n private\n pure\n returns (\n TrieNode memory _node\n )\n {\n bytes memory encoded = Lib_RLPWriter.writeList(_raw);\n\n return TrieNode({\n encoded: encoded,\n decoded: Lib_RLPReader.readList(encoded)\n });\n }\n\n /**\n * @notice Utility; converts an RLP-decoded node into our nice struct.\n * @param _items RLP-decoded node to convert.\n * @return _node Node as a TrieNode struct.\n */\n function _makeNode(\n Lib_RLPReader.RLPItem[] memory _items\n )\n private\n pure\n returns (\n TrieNode memory _node\n )\n {\n bytes[] memory raw = new bytes[](_items.length);\n for (uint256 i = 0; i < _items.length; i++) {\n raw[i] = Lib_RLPReader.readRawBytes(_items[i]);\n }\n return _makeNode(raw);\n }\n\n /**\n * @notice Creates a new extension node.\n * @param _key Key for the extension node, unprefixed.\n * @param _value Value for the extension node.\n * @return _node New extension node with the given k/v pair.\n */\n function _makeExtensionNode(\n bytes memory _key,\n bytes memory _value\n )\n private\n pure\n returns (\n TrieNode memory _node\n )\n {\n bytes[] memory raw = new bytes[](2);\n bytes memory key = _addHexPrefix(_key, false);\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\n raw[1] = Lib_RLPWriter.writeBytes(_value);\n return _makeNode(raw);\n }\n\n /**\n * @notice Creates a new leaf node.\n * @dev This function is essentially identical to `_makeExtensionNode`.\n * Although we could route both to a single method with a flag, it's\n * more gas efficient to keep them separate and duplicate the logic.\n * @param _key Key for the leaf node, unprefixed.\n * @param _value Value for the leaf node.\n * @return _node New leaf node with the given k/v pair.\n */\n function _makeLeafNode(\n bytes memory _key,\n bytes memory _value\n )\n private\n pure\n returns (\n TrieNode memory _node\n )\n {\n bytes[] memory raw = new bytes[](2);\n bytes memory key = _addHexPrefix(_key, true);\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\n raw[1] = Lib_RLPWriter.writeBytes(_value);\n return _makeNode(raw);\n }\n\n /**\n * @notice Creates an empty branch node.\n * @return _node Empty branch node as a TrieNode struct.\n */\n function _makeEmptyBranchNode()\n private\n pure\n returns (\n TrieNode memory _node\n )\n {\n bytes[] memory raw = new bytes[](BRANCH_NODE_LENGTH);\n for (uint256 i = 0; i < raw.length; i++) {\n raw[i] = RLP_NULL_BYTES;\n }\n return _makeNode(raw);\n }\n\n /**\n * @notice Modifies the value slot for a given branch.\n * @param _branch Branch node to modify.\n * @param _value Value to insert into the branch.\n * @return _updatedNode Modified branch node.\n */\n function _editBranchValue(\n TrieNode memory _branch,\n bytes memory _value\n )\n private\n pure\n returns (\n TrieNode memory _updatedNode\n )\n {\n bytes memory encoded = Lib_RLPWriter.writeBytes(_value);\n _branch.decoded[_branch.decoded.length - 1] = Lib_RLPReader.toRLPItem(encoded);\n return _makeNode(_branch.decoded);\n }\n\n /**\n * @notice Modifies a slot at an index for a given branch.\n * @param _branch Branch node to modify.\n * @param _index Slot index to modify.\n * @param _value Value to insert into the slot.\n * @return _updatedNode Modified branch node.\n */\n function _editBranchIndex(\n TrieNode memory _branch,\n uint8 _index,\n bytes memory _value\n )\n private\n pure\n returns (\n TrieNode memory _updatedNode\n )\n {\n bytes memory encoded = _value.length < 32 ? _value : Lib_RLPWriter.writeBytes(_value);\n _branch.decoded[_index] = Lib_RLPReader.toRLPItem(encoded);\n return _makeNode(_branch.decoded);\n }\n\n /**\n * @notice Utility; adds a prefix to a key.\n * @param _key Key to prefix.\n * @param _isLeaf Whether or not the key belongs to a leaf.\n * @return _prefixedKey Prefixed key.\n */\n function _addHexPrefix(\n bytes memory _key,\n bool _isLeaf\n )\n private\n pure\n returns (\n bytes memory _prefixedKey\n )\n {\n uint8 prefix = _isLeaf ? uint8(0x02) : uint8(0x00);\n uint8 offset = uint8(_key.length % 2);\n bytes memory prefixed = new bytes(2 - offset);\n prefixed[0] = bytes1(prefix + offset);\n return abi.encodePacked(prefixed, _key);\n }\n\n /**\n * @notice Utility; removes a prefix from a path.\n * @param _path Path to remove the prefix from.\n * @return _unprefixedKey Unprefixed key.\n */\n function _removeHexPrefix(\n bytes memory _path\n )\n private\n pure\n returns (\n bytes memory _unprefixedKey\n )\n {\n if (uint8(_path[0]) % 2 == 0) {\n return Lib_BytesUtils.slice(_path, 2);\n } else {\n return Lib_BytesUtils.slice(_path, 1);\n }\n }\n\n /**\n * @notice Utility; combines two node arrays. Array lengths are required\n * because the actual lengths may be longer than the filled lengths.\n * Array resizing is extremely costly and should be avoided.\n * @param _a First array to join.\n * @param _aLength Length of the first array.\n * @param _b Second array to join.\n * @param _bLength Length of the second array.\n * @return _joined Combined node array.\n */\n function _joinNodeArrays(\n TrieNode[] memory _a,\n uint256 _aLength,\n TrieNode[] memory _b,\n uint256 _bLength\n )\n private\n pure\n returns (\n TrieNode[] memory _joined\n )\n {\n TrieNode[] memory ret = new TrieNode[](_aLength + _bLength);\n\n // Copy elements from the first array.\n for (uint256 i = 0; i < _aLength; i++) {\n ret[i] = _a[i];\n }\n\n // Copy elements from the second array.\n for (uint256 i = 0; i < _bLength; i++) {\n ret[i + _aLength] = _b[i];\n }\n\n return ret;\n }\n}\n" - }, - "contracts/optimistic-ethereum/OVM/verification/OVM_StateTransitionerFactory.sol": { - "content": "// SPDX-License-Identifier: MIT\n// @unsupported: ovm\npragma solidity >0.5.0 <0.8.0;\n\n/* Library Imports */\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/* Interface Imports */\nimport { iOVM_StateTransitioner } from \"../../iOVM/verification/iOVM_StateTransitioner.sol\";\nimport { iOVM_StateTransitionerFactory } from \"../../iOVM/verification/iOVM_StateTransitionerFactory.sol\";\nimport { iOVM_FraudVerifier } from \"../../iOVM/verification/iOVM_FraudVerifier.sol\";\n\n/* Contract Imports */\nimport { OVM_StateTransitioner } from \"./OVM_StateTransitioner.sol\";\n\n/**\n * @title OVM_StateTransitionerFactory\n * @dev The State Transitioner Factory is used by the Fraud Verifier to create a new State \n * Transitioner during the initialization of a fraud proof.\n * \n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract OVM_StateTransitionerFactory is iOVM_StateTransitionerFactory, Lib_AddressResolver {\n\n /***************\n * Constructor *\n ***************/\n\n constructor(\n address _libAddressManager\n )\n Lib_AddressResolver(_libAddressManager)\n {}\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Creates a new OVM_StateTransitioner\n * @param _libAddressManager Address of the Address Manager.\n * @param _stateTransitionIndex Index of the state transition being verified.\n * @param _preStateRoot State root before the transition was executed.\n * @param _transactionHash Hash of the executed transaction.\n * @return New OVM_StateTransitioner instance.\n */\n function create(\n address _libAddressManager,\n uint256 _stateTransitionIndex,\n bytes32 _preStateRoot,\n bytes32 _transactionHash\n )\n override\n public\n returns (\n iOVM_StateTransitioner\n )\n {\n require(\n msg.sender == resolve(\"OVM_FraudVerifier\"),\n \"Create can only be done by the OVM_FraudVerifier.\"\n );\n\n return new OVM_StateTransitioner(\n _libAddressManager,\n _stateTransitionIndex,\n _preStateRoot,\n _transactionHash\n );\n }\n}\n" - }, - "contracts/optimistic-ethereum/iOVM/verification/iOVM_StateTransitionerFactory.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Contract Imports */\nimport { iOVM_StateTransitioner } from \"./iOVM_StateTransitioner.sol\";\n\n/**\n * @title iOVM_StateTransitionerFactory\n */\ninterface iOVM_StateTransitionerFactory {\n\n /***************************************\n * Public Functions: Contract Creation *\n ***************************************/\n\n function create(\n address _proxyManager,\n uint256 _stateTransitionIndex,\n bytes32 _preStateRoot,\n bytes32 _transactionHash\n )\n external\n returns (\n iOVM_StateTransitioner _ovmStateTransitioner\n );\n}\n" - }, - "contracts/optimistic-ethereum/iOVM/verification/iOVM_FraudVerifier.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/* Interface Imports */\nimport { iOVM_StateTransitioner } from \"./iOVM_StateTransitioner.sol\";\n\n/**\n * @title iOVM_FraudVerifier\n */\ninterface iOVM_FraudVerifier {\n\n /**********\n * Events *\n **********/\n\n event FraudProofInitialized(\n bytes32 _preStateRoot,\n uint256 _preStateRootIndex,\n bytes32 _transactionHash,\n address _who\n );\n\n event FraudProofFinalized(\n bytes32 _preStateRoot,\n uint256 _preStateRootIndex,\n bytes32 _transactionHash,\n address _who\n );\n\n\n /***************************************\n * Public Functions: Transition Status *\n ***************************************/\n\n function getStateTransitioner(bytes32 _preStateRoot, bytes32 _txHash) external view returns (iOVM_StateTransitioner _transitioner);\n\n\n /****************************************\n * Public Functions: Fraud Verification *\n ****************************************/\n\n function initializeFraudVerification(\n bytes32 _preStateRoot,\n Lib_OVMCodec.ChainBatchHeader calldata _preStateRootBatchHeader,\n Lib_OVMCodec.ChainInclusionProof calldata _preStateRootProof,\n Lib_OVMCodec.Transaction calldata _transaction,\n Lib_OVMCodec.TransactionChainElement calldata _txChainElement,\n Lib_OVMCodec.ChainBatchHeader calldata _transactionBatchHeader,\n Lib_OVMCodec.ChainInclusionProof calldata _transactionProof\n ) external;\n\n function finalizeFraudVerification(\n bytes32 _preStateRoot,\n Lib_OVMCodec.ChainBatchHeader calldata _preStateRootBatchHeader,\n Lib_OVMCodec.ChainInclusionProof calldata _preStateRootProof,\n bytes32 _txHash,\n bytes32 _postStateRoot,\n Lib_OVMCodec.ChainBatchHeader calldata _postStateRootBatchHeader,\n Lib_OVMCodec.ChainInclusionProof calldata _postStateRootProof\n ) external;\n}\n" - }, - "contracts/optimistic-ethereum/OVM/verification/OVM_FraudVerifier.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/* Interface Imports */\nimport { iOVM_FraudVerifier } from \"../../iOVM/verification/iOVM_FraudVerifier.sol\";\nimport { iOVM_StateTransitioner } from \"../../iOVM/verification/iOVM_StateTransitioner.sol\";\nimport { iOVM_StateTransitionerFactory } from \"../../iOVM/verification/iOVM_StateTransitionerFactory.sol\";\nimport { iOVM_BondManager } from \"../../iOVM/verification/iOVM_BondManager.sol\";\nimport { iOVM_StateCommitmentChain } from \"../../iOVM/chain/iOVM_StateCommitmentChain.sol\";\nimport { iOVM_CanonicalTransactionChain } from \"../../iOVM/chain/iOVM_CanonicalTransactionChain.sol\";\n\n/* Contract Imports */\nimport { Abs_FraudContributor } from \"./Abs_FraudContributor.sol\";\n\n\n\n/**\n * @title OVM_FraudVerifier\n * @dev The Fraud Verifier contract coordinates the entire fraud proof verification process. \n * If the fraud proof was successful it prunes any state batches from State Commitment Chain\n * which were published after the fraudulent state root.\n * \n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract OVM_FraudVerifier is Lib_AddressResolver, Abs_FraudContributor, iOVM_FraudVerifier {\n\n /*******************************************\n * Contract Variables: Internal Accounting *\n *******************************************/\n\n mapping (bytes32 => iOVM_StateTransitioner) internal transitioners;\n\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n constructor(\n address _libAddressManager\n )\n Lib_AddressResolver(_libAddressManager)\n {}\n\n\n /***************************************\n * Public Functions: Transition Status *\n ***************************************/\n\n /**\n * Retrieves the state transitioner for a given root.\n * @param _preStateRoot State root to query a transitioner for.\n * @return _transitioner Corresponding state transitioner contract.\n */\n function getStateTransitioner(\n bytes32 _preStateRoot,\n bytes32 _txHash\n )\n override\n public\n view\n returns (\n iOVM_StateTransitioner _transitioner\n )\n {\n return transitioners[keccak256(abi.encodePacked(_preStateRoot, _txHash))];\n }\n\n\n /****************************************\n * Public Functions: Fraud Verification *\n ****************************************/\n\n /**\n * Begins the fraud verification process.\n * @param _preStateRoot State root before the fraudulent transaction.\n * @param _preStateRootBatchHeader Batch header for the provided pre-state root.\n * @param _preStateRootProof Inclusion proof for the provided pre-state root.\n * @param _transaction OVM transaction claimed to be fraudulent.\n * @param _txChainElement OVM transaction chain element.\n * @param _transactionBatchHeader Batch header for the provided transaction.\n * @param _transactionProof Inclusion proof for the provided transaction.\n */\n function initializeFraudVerification(\n bytes32 _preStateRoot,\n Lib_OVMCodec.ChainBatchHeader memory _preStateRootBatchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _preStateRootProof,\n Lib_OVMCodec.Transaction memory _transaction,\n Lib_OVMCodec.TransactionChainElement memory _txChainElement,\n Lib_OVMCodec.ChainBatchHeader memory _transactionBatchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _transactionProof\n )\n override\n public\n contributesToFraudProof(_preStateRoot, Lib_OVMCodec.hashTransaction(_transaction))\n {\n bytes32 _txHash = Lib_OVMCodec.hashTransaction(_transaction);\n\n if (_hasStateTransitioner(_preStateRoot, _txHash)) {\n return;\n }\n\n iOVM_StateCommitmentChain ovmStateCommitmentChain = iOVM_StateCommitmentChain(resolve(\"OVM_StateCommitmentChain\"));\n iOVM_CanonicalTransactionChain ovmCanonicalTransactionChain = iOVM_CanonicalTransactionChain(resolve(\"OVM_CanonicalTransactionChain\"));\n\n require(\n ovmStateCommitmentChain.verifyStateCommitment(\n _preStateRoot,\n _preStateRootBatchHeader,\n _preStateRootProof\n ),\n \"Invalid pre-state root inclusion proof.\"\n );\n\n require(\n ovmCanonicalTransactionChain.verifyTransaction(\n _transaction,\n _txChainElement,\n _transactionBatchHeader,\n _transactionProof\n ),\n \"Invalid transaction inclusion proof.\"\n );\n\n require (\n _preStateRootBatchHeader.prevTotalElements + _preStateRootProof.index + 1 == _transactionBatchHeader.prevTotalElements + _transactionProof.index,\n \"Pre-state root global index must equal to the transaction root global index.\"\n );\n\n _deployTransitioner(_preStateRoot, _txHash, _preStateRootProof.index);\n\n emit FraudProofInitialized(\n _preStateRoot,\n _preStateRootProof.index,\n _txHash,\n msg.sender\n );\n }\n\n /**\n * Finalizes the fraud verification process.\n * @param _preStateRoot State root before the fraudulent transaction.\n * @param _preStateRootBatchHeader Batch header for the provided pre-state root.\n * @param _preStateRootProof Inclusion proof for the provided pre-state root.\n * @param _txHash The transaction for the state root\n * @param _postStateRoot State root after the fraudulent transaction.\n * @param _postStateRootBatchHeader Batch header for the provided post-state root.\n * @param _postStateRootProof Inclusion proof for the provided post-state root.\n */\n function finalizeFraudVerification(\n bytes32 _preStateRoot,\n Lib_OVMCodec.ChainBatchHeader memory _preStateRootBatchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _preStateRootProof,\n bytes32 _txHash,\n bytes32 _postStateRoot,\n Lib_OVMCodec.ChainBatchHeader memory _postStateRootBatchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _postStateRootProof\n )\n override\n public\n contributesToFraudProof(_preStateRoot, _txHash)\n {\n iOVM_StateTransitioner transitioner = getStateTransitioner(_preStateRoot, _txHash);\n iOVM_StateCommitmentChain ovmStateCommitmentChain = iOVM_StateCommitmentChain(resolve(\"OVM_StateCommitmentChain\"));\n\n require(\n transitioner.isComplete() == true,\n \"State transition process must be completed prior to finalization.\"\n );\n\n require (\n _postStateRootBatchHeader.prevTotalElements + _postStateRootProof.index == _preStateRootBatchHeader.prevTotalElements + _preStateRootProof.index + 1,\n \"Post-state root global index must equal to the pre state root global index plus one.\"\n );\n\n require(\n ovmStateCommitmentChain.verifyStateCommitment(\n _preStateRoot,\n _preStateRootBatchHeader,\n _preStateRootProof\n ),\n \"Invalid pre-state root inclusion proof.\"\n );\n\n require(\n ovmStateCommitmentChain.verifyStateCommitment(\n _postStateRoot,\n _postStateRootBatchHeader,\n _postStateRootProof\n ),\n \"Invalid post-state root inclusion proof.\"\n );\n\n // If the post state root did not match, then there was fraud and we should delete the batch\n require(\n _postStateRoot != transitioner.getPostStateRoot(),\n \"State transition has not been proven fraudulent.\"\n );\n \n _cancelStateTransition(_postStateRootBatchHeader, _preStateRoot);\n\n // TEMPORARY: Remove the transitioner; for minnet.\n transitioners[keccak256(abi.encodePacked(_preStateRoot, _txHash))] = iOVM_StateTransitioner(0x0000000000000000000000000000000000000000);\n\n emit FraudProofFinalized(\n _preStateRoot,\n _preStateRootProof.index,\n _txHash,\n msg.sender\n );\n }\n\n\n /************************************\n * Internal Functions: Verification *\n ************************************/\n\n /**\n * Checks whether a transitioner already exists for a given pre-state root.\n * @param _preStateRoot Pre-state root to check.\n * @return _exists Whether or not we already have a transitioner for the root.\n */\n function _hasStateTransitioner(\n bytes32 _preStateRoot,\n bytes32 _txHash\n )\n internal\n view\n returns (\n bool _exists\n )\n {\n return address(getStateTransitioner(_preStateRoot, _txHash)) != address(0);\n }\n\n /**\n * Deploys a new state transitioner.\n * @param _preStateRoot Pre-state root to initialize the transitioner with.\n * @param _txHash Hash of the transaction this transitioner will execute.\n * @param _stateTransitionIndex Index of the transaction in the chain.\n */\n function _deployTransitioner(\n bytes32 _preStateRoot,\n bytes32 _txHash,\n uint256 _stateTransitionIndex\n )\n internal\n {\n transitioners[keccak256(abi.encodePacked(_preStateRoot, _txHash))] = iOVM_StateTransitionerFactory(\n resolve(\"OVM_StateTransitionerFactory\")\n ).create(\n address(libAddressManager),\n _stateTransitionIndex,\n _preStateRoot,\n _txHash\n );\n }\n\n /**\n * Removes a state transition from the state commitment chain.\n * @param _postStateRootBatchHeader Header for the post-state root.\n * @param _preStateRoot Pre-state root hash.\n */\n function _cancelStateTransition(\n Lib_OVMCodec.ChainBatchHeader memory _postStateRootBatchHeader,\n bytes32 _preStateRoot\n )\n internal\n {\n iOVM_StateCommitmentChain ovmStateCommitmentChain = iOVM_StateCommitmentChain(resolve(\"OVM_StateCommitmentChain\"));\n iOVM_BondManager ovmBondManager = iOVM_BondManager(resolve(\"OVM_BondManager\"));\n\n // Delete the state batch.\n ovmStateCommitmentChain.deleteStateBatch(\n _postStateRootBatchHeader\n );\n\n // Get the timestamp and publisher for that block.\n (uint256 timestamp, address publisher) = abi.decode(_postStateRootBatchHeader.extraData, (uint256, address));\n\n // Slash the bonds at the bond manager.\n ovmBondManager.finalize(\n _preStateRoot,\n publisher,\n timestamp\n );\n }\n}\n" - }, - "contracts/optimistic-ethereum/iOVM/chain/iOVM_StateCommitmentChain.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/**\n * @title iOVM_StateCommitmentChain\n */\ninterface iOVM_StateCommitmentChain {\n\n /**********\n * Events *\n **********/\n\n event StateBatchAppended(\n uint256 indexed _batchIndex,\n bytes32 _batchRoot,\n uint256 _batchSize,\n uint256 _prevTotalElements,\n bytes _extraData\n );\n\n event StateBatchDeleted(\n uint256 indexed _batchIndex,\n bytes32 _batchRoot\n );\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Retrieves the total number of elements submitted.\n * @return _totalElements Total submitted elements.\n */\n function getTotalElements()\n external\n view\n returns (\n uint256 _totalElements\n );\n\n /**\n * Retrieves the total number of batches submitted.\n * @return _totalBatches Total submitted batches.\n */\n function getTotalBatches()\n external\n view\n returns (\n uint256 _totalBatches\n );\n\n /**\n * Retrieves the timestamp of the last batch submitted by the sequencer.\n * @return _lastSequencerTimestamp Last sequencer batch timestamp.\n */\n function getLastSequencerTimestamp()\n external\n view\n returns (\n uint256 _lastSequencerTimestamp\n );\n\n /**\n * Appends a batch of state roots to the chain.\n * @param _batch Batch of state roots.\n * @param _shouldStartAtElement Index of the element at which this batch should start.\n */\n function appendStateBatch(\n bytes32[] calldata _batch,\n uint256 _shouldStartAtElement\n )\n external;\n\n /**\n * Deletes all state roots after (and including) a given batch.\n * @param _batchHeader Header of the batch to start deleting from.\n */\n function deleteStateBatch(\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\n )\n external;\n\n /**\n * Verifies a batch inclusion proof.\n * @param _element Hash of the element to verify a proof for.\n * @param _batchHeader Header of the batch in which the element was included.\n * @param _proof Merkle inclusion proof for the element.\n */\n function verifyStateCommitment(\n bytes32 _element,\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _proof\n )\n external\n view\n returns (\n bool _verified\n );\n\n /**\n * Checks whether a given batch is still inside its fraud proof window.\n * @param _batchHeader Header of the batch to check.\n * @return _inside Whether or not the batch is inside the fraud proof window.\n */\n function insideFraudProofWindow(\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\n )\n external\n view\n returns (\n bool _inside\n );\n}\n" - }, - "contracts/optimistic-ethereum/iOVM/chain/iOVM_CanonicalTransactionChain.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/* Interface Imports */\nimport { iOVM_ChainStorageContainer } from \"./iOVM_ChainStorageContainer.sol\";\n\n/**\n * @title iOVM_CanonicalTransactionChain\n */\ninterface iOVM_CanonicalTransactionChain {\n\n /**********\n * Events *\n **********/\n\n event TransactionEnqueued(\n address _l1TxOrigin,\n address _target,\n uint256 _gasLimit,\n bytes _data,\n uint256 _queueIndex,\n uint256 _timestamp\n );\n\n event QueueBatchAppended(\n uint256 _startingQueueIndex,\n uint256 _numQueueElements,\n uint256 _totalElements\n );\n\n event SequencerBatchAppended(\n uint256 _startingQueueIndex,\n uint256 _numQueueElements,\n uint256 _totalElements\n );\n\n event TransactionBatchAppended(\n uint256 indexed _batchIndex,\n bytes32 _batchRoot,\n uint256 _batchSize,\n uint256 _prevTotalElements,\n bytes _extraData\n );\n\n\n /***********\n * Structs *\n ***********/\n\n struct BatchContext {\n uint256 numSequencedTransactions;\n uint256 numSubsequentQueueTransactions;\n uint256 timestamp;\n uint256 blockNumber;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n\n /**\n * Accesses the batch storage container.\n * @return Reference to the batch storage container.\n */\n function batches()\n external\n view\n returns (\n iOVM_ChainStorageContainer\n );\n\n /**\n * Accesses the queue storage container.\n * @return Reference to the queue storage container.\n */\n function queue()\n external\n view\n returns (\n iOVM_ChainStorageContainer\n );\n\n /**\n * Retrieves the total number of elements submitted.\n * @return _totalElements Total submitted elements.\n */\n function getTotalElements()\n external\n view\n returns (\n uint256 _totalElements\n );\n\n /**\n * Retrieves the total number of batches submitted.\n * @return _totalBatches Total submitted batches.\n */\n function getTotalBatches()\n external\n view\n returns (\n uint256 _totalBatches\n );\n\n /**\n * Returns the index of the next element to be enqueued.\n * @return Index for the next queue element.\n */\n function getNextQueueIndex()\n external\n view\n returns (\n uint40\n );\n\n /**\n * Gets the queue element at a particular index.\n * @param _index Index of the queue element to access.\n * @return _element Queue element at the given index.\n */\n function getQueueElement(\n uint256 _index\n )\n external\n view\n returns (\n Lib_OVMCodec.QueueElement memory _element\n );\n\n /**\n * Returns the timestamp of the last transaction.\n * @return Timestamp for the last transaction.\n */\n function getLastTimestamp()\n external\n view\n returns (\n uint40\n );\n\n /**\n * Returns the blocknumber of the last transaction.\n * @return Blocknumber for the last transaction.\n */\n function getLastBlockNumber()\n external\n view\n returns (\n uint40\n );\n\n /**\n * Get the number of queue elements which have not yet been included.\n * @return Number of pending queue elements.\n */\n function getNumPendingQueueElements()\n external\n view\n returns (\n uint40\n );\n\n /**\n * Retrieves the length of the queue, including\n * both pending and canonical transactions.\n * @return Length of the queue.\n */\n function getQueueLength()\n external\n view\n returns (\n uint40\n );\n\n\n /**\n * Adds a transaction to the queue.\n * @param _target Target contract to send the transaction to.\n * @param _gasLimit Gas limit for the given transaction.\n * @param _data Transaction data.\n */\n function enqueue(\n address _target,\n uint256 _gasLimit,\n bytes memory _data\n )\n external;\n\n /**\n * Appends a given number of queued transactions as a single batch.\n * @param _numQueuedTransactions Number of transactions to append.\n */\n function appendQueueBatch(\n uint256 _numQueuedTransactions\n )\n external;\n\n /**\n * Allows the sequencer to append a batch of transactions.\n * @dev This function uses a custom encoding scheme for efficiency reasons.\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\n * .param _contexts Array of batch contexts.\n * .param _transactionDataFields Array of raw transaction data.\n */\n function appendSequencerBatch(\n // uint40 _shouldStartAtElement,\n // uint24 _totalElementsToAppend,\n // BatchContext[] _contexts,\n // bytes[] _transactionDataFields\n )\n external;\n\n /**\n * Verifies whether a transaction is included in the chain.\n * @param _transaction Transaction to verify.\n * @param _txChainElement Transaction chain element corresponding to the transaction.\n * @param _batchHeader Header of the batch the transaction was included in.\n * @param _inclusionProof Inclusion proof for the provided transaction chain element.\n * @return True if the transaction exists in the CTC, false if not.\n */\n function verifyTransaction(\n Lib_OVMCodec.Transaction memory _transaction,\n Lib_OVMCodec.TransactionChainElement memory _txChainElement,\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _inclusionProof\n )\n external\n view\n returns (\n bool\n );\n}\n" - }, - "contracts/optimistic-ethereum/iOVM/chain/iOVM_ChainStorageContainer.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/**\n * @title iOVM_ChainStorageContainer\n */\ninterface iOVM_ChainStorageContainer {\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\n * 27 bytes to store arbitrary data.\n * @param _globalMetadata New global metadata to set.\n */\n function setGlobalMetadata(\n bytes27 _globalMetadata\n )\n external;\n\n /**\n * Retrieves the container's global metadata field.\n * @return Container global metadata field.\n */\n function getGlobalMetadata()\n external\n view\n returns (\n bytes27\n );\n\n /**\n * Retrieves the number of objects stored in the container.\n * @return Number of objects in the container.\n */\n function length()\n external\n view\n returns (\n uint256\n );\n\n /**\n * Pushes an object into the container.\n * @param _object A 32 byte value to insert into the container.\n */\n function push(\n bytes32 _object\n )\n external;\n\n /**\n * Pushes an object into the container. Function allows setting the global metadata since\n * we'll need to touch the \"length\" storage slot anyway, which also contains the global\n * metadata (it's an optimization).\n * @param _object A 32 byte value to insert into the container.\n * @param _globalMetadata New global metadata for the container.\n */\n function push(\n bytes32 _object,\n bytes27 _globalMetadata\n )\n external;\n\n /**\n * Retrieves an object from the container.\n * @param _index Index of the particular object to access.\n * @return 32 byte object value.\n */\n function get(\n uint256 _index\n )\n external\n view\n returns (\n bytes32\n );\n\n /**\n * Removes all objects after and including a given index.\n * @param _index Object index to delete from.\n */\n function deleteElementsAfterInclusive(\n uint256 _index\n )\n external;\n\n /**\n * Removes all objects after and including a given index. Also allows setting the global\n * metadata field.\n * @param _index Object index to delete from.\n * @param _globalMetadata New global metadata for the container.\n */\n function deleteElementsAfterInclusive(\n uint256 _index,\n bytes27 _globalMetadata\n )\n external;\n\n /**\n * Marks an index as overwritable, meaing the underlying buffer can start to write values over\n * any objects before and including the given index.\n */\n function setNextOverwritableIndex(\n uint256 _index\n )\n external;\n}\n" - }, - "contracts/optimistic-ethereum/OVM/verification/OVM_BondManager.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Library Imports */\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/* Interface Imports */\nimport { iOVM_BondManager, Errors, ERC20 } from \"../../iOVM/verification/iOVM_BondManager.sol\";\nimport { iOVM_FraudVerifier } from \"../../iOVM/verification/iOVM_FraudVerifier.sol\";\n\n/**\n * @title OVM_BondManager\n * @dev The Bond Manager contract handles deposits in the form of an ERC20 token from bonded \n * Proposers. It also handles the accounting of gas costs spent by a Verifier during the course of a\n * fraud proof. In the event of a successful fraud proof, the fraudulent Proposer's bond is slashed, \n * and the Verifier's gas costs are refunded.\n * \n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract OVM_BondManager is iOVM_BondManager, Lib_AddressResolver {\n\n /****************************\n * Constants and Parameters *\n ****************************/\n\n /// The period to find the earliest fraud proof for a publisher\n uint256 public constant multiFraudProofPeriod = 7 days;\n\n /// The dispute period\n uint256 public constant disputePeriodSeconds = 7 days;\n\n /// The minimum collateral a sequencer must post\n uint256 public constant requiredCollateral = 1 ether;\n\n\n /*******************************************\n * Contract Variables: Contract References *\n *******************************************/\n\n /// The bond token\n ERC20 immutable public token;\n\n\n /********************************************\n * Contract Variables: Internal Accounting *\n *******************************************/\n\n /// The bonds posted by each proposer\n mapping(address => Bond) public bonds;\n\n /// For each pre-state root, there's an array of witnessProviders that must be rewarded\n /// for posting witnesses\n mapping(bytes32 => Rewards) public witnessProviders;\n\n\n /***************\n * Constructor *\n ***************/\n\n /// Initializes with a ERC20 token to be used for the fidelity bonds\n /// and with the Address Manager\n constructor(\n ERC20 _token,\n address _libAddressManager\n )\n Lib_AddressResolver(_libAddressManager)\n {\n token = _token;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n /// Adds `who` to the list of witnessProviders for the provided `preStateRoot`.\n function recordGasSpent(bytes32 _preStateRoot, bytes32 _txHash, address who, uint256 gasSpent) override public {\n // The sender must be the transitioner that corresponds to the claimed pre-state root\n address transitioner = address(iOVM_FraudVerifier(resolve(\"OVM_FraudVerifier\")).getStateTransitioner(_preStateRoot, _txHash));\n require(transitioner == msg.sender, Errors.ONLY_TRANSITIONER);\n\n witnessProviders[_preStateRoot].total += gasSpent;\n witnessProviders[_preStateRoot].gasSpent[who] += gasSpent;\n }\n\n /// Slashes + distributes rewards or frees up the sequencer's bond, only called by\n /// `FraudVerifier.finalizeFraudVerification`\n function finalize(bytes32 _preStateRoot, address publisher, uint256 timestamp) override public {\n require(msg.sender == resolve(\"OVM_FraudVerifier\"), Errors.ONLY_FRAUD_VERIFIER);\n require(witnessProviders[_preStateRoot].canClaim == false, Errors.ALREADY_FINALIZED);\n\n // allow users to claim from that state root's\n // pool of collateral (effectively slashing the sequencer)\n witnessProviders[_preStateRoot].canClaim = true;\n\n Bond storage bond = bonds[publisher];\n if (bond.firstDisputeAt == 0) {\n bond.firstDisputeAt = block.timestamp;\n bond.earliestDisputedStateRoot = _preStateRoot;\n bond.earliestTimestamp = timestamp;\n } else if (\n // only update the disputed state root for the publisher if it's within\n // the dispute period _and_ if it's before the previous one\n block.timestamp < bond.firstDisputeAt + multiFraudProofPeriod &&\n timestamp < bond.earliestTimestamp\n ) {\n bond.earliestDisputedStateRoot = _preStateRoot;\n bond.earliestTimestamp = timestamp;\n }\n\n // if the fraud proof's dispute period does not intersect with the \n // withdrawal's timestamp, then the user should not be slashed\n // e.g if a user at day 10 submits a withdrawal, and a fraud proof\n // from day 1 gets published, the user won't be slashed since day 8 (1d + 7d)\n // is before the user started their withdrawal. on the contrary, if the user\n // had started their withdrawal at, say, day 6, they would be slashed\n if (\n bond.withdrawalTimestamp != 0 && \n uint256(bond.withdrawalTimestamp) > timestamp + disputePeriodSeconds &&\n bond.state == State.WITHDRAWING\n ) {\n return;\n }\n\n // slash!\n bond.state = State.NOT_COLLATERALIZED;\n }\n\n /// Sequencers call this function to post collateral which will be used for\n /// the `appendBatch` call\n function deposit() override public {\n require(\n token.transferFrom(msg.sender, address(this), requiredCollateral),\n Errors.ERC20_ERR\n );\n\n // This cannot overflow\n bonds[msg.sender].state = State.COLLATERALIZED;\n }\n\n /// Starts the withdrawal for a publisher\n function startWithdrawal() override public {\n Bond storage bond = bonds[msg.sender];\n require(bond.withdrawalTimestamp == 0, Errors.WITHDRAWAL_PENDING);\n require(bond.state == State.COLLATERALIZED, Errors.WRONG_STATE);\n\n bond.state = State.WITHDRAWING;\n bond.withdrawalTimestamp = uint32(block.timestamp);\n }\n\n /// Finalizes a pending withdrawal from a publisher\n function finalizeWithdrawal() override public {\n Bond storage bond = bonds[msg.sender];\n\n require(\n block.timestamp >= uint256(bond.withdrawalTimestamp) + disputePeriodSeconds, \n Errors.TOO_EARLY\n );\n require(bond.state == State.WITHDRAWING, Errors.SLASHED);\n \n // refunds!\n bond.state = State.NOT_COLLATERALIZED;\n bond.withdrawalTimestamp = 0;\n \n require(\n token.transfer(msg.sender, requiredCollateral),\n Errors.ERC20_ERR\n );\n }\n\n /// Claims the user's reward for the witnesses they provided for the earliest\n /// disputed state root of the designated publisher\n function claim(address who) override public {\n Bond storage bond = bonds[who];\n require(\n block.timestamp >= bond.firstDisputeAt + multiFraudProofPeriod,\n Errors.WAIT_FOR_DISPUTES\n );\n\n // reward the earliest state root for this publisher\n bytes32 _preStateRoot = bond.earliestDisputedStateRoot;\n Rewards storage rewards = witnessProviders[_preStateRoot];\n\n // only allow claiming if fraud was proven in `finalize`\n require(rewards.canClaim, Errors.CANNOT_CLAIM);\n\n // proportional allocation - only reward 50% (rest gets locked in the\n // contract forever\n uint256 amount = (requiredCollateral * rewards.gasSpent[msg.sender]) / (2 * rewards.total);\n\n // reset the user's spent gas so they cannot double claim\n rewards.gasSpent[msg.sender] = 0;\n\n // transfer\n require(token.transfer(msg.sender, amount), Errors.ERC20_ERR);\n }\n\n /// Checks if the user is collateralized\n function isCollateralized(address who) override public view returns (bool) {\n return bonds[who].state == State.COLLATERALIZED;\n }\n\n /// Gets how many witnesses the user has provided for the state root\n function getGasSpent(bytes32 preStateRoot, address who) override public view returns (uint256) {\n return witnessProviders[preStateRoot].gasSpent[who];\n }\n}\n" - }, - "contracts/test-helpers/Mock_FraudVerifier.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\nimport { OVM_BondManager } from \"./../optimistic-ethereum/OVM/verification/OVM_BondManager.sol\";\n\ncontract Mock_FraudVerifier {\n OVM_BondManager bondManager;\n\n mapping (bytes32 => address) transitioners;\n\n function setBondManager(OVM_BondManager _bondManager) public {\n bondManager = _bondManager;\n }\n\n function setStateTransitioner(bytes32 preStateRoot, bytes32 txHash, address addr) public {\n transitioners[keccak256(abi.encodePacked(preStateRoot, txHash))] = addr;\n }\n\n function getStateTransitioner(\n bytes32 _preStateRoot,\n bytes32 _txHash\n )\n public\n view\n returns (\n address\n )\n {\n return transitioners[keccak256(abi.encodePacked(_preStateRoot, _txHash))];\n }\n\n function finalize(bytes32 _preStateRoot, address publisher, uint256 timestamp) public {\n bondManager.finalize(_preStateRoot, publisher, timestamp);\n }\n}\n" - }, - "contracts/optimistic-ethereum/OVM/chain/OVM_StateCommitmentChain.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\nimport { Lib_MerkleTree } from \"../../libraries/utils/Lib_MerkleTree.sol\";\n\n/* Interface Imports */\nimport { iOVM_FraudVerifier } from \"../../iOVM/verification/iOVM_FraudVerifier.sol\";\nimport { iOVM_StateCommitmentChain } from \"../../iOVM/chain/iOVM_StateCommitmentChain.sol\";\nimport { iOVM_CanonicalTransactionChain } from \"../../iOVM/chain/iOVM_CanonicalTransactionChain.sol\";\nimport { iOVM_BondManager } from \"../../iOVM/verification/iOVM_BondManager.sol\";\nimport { iOVM_ChainStorageContainer } from \"../../iOVM/chain/iOVM_ChainStorageContainer.sol\";\n\n/* External Imports */\nimport '@openzeppelin/contracts/math/SafeMath.sol';\n\n/**\n * @title OVM_StateCommitmentChain\n * @dev The State Commitment Chain (SCC) contract contains a list of proposed state roots which\n * Proposers assert to be a result of each transaction in the Canonical Transaction Chain (CTC).\n * Elements here have a 1:1 correspondence with transactions in the CTC, and should be the unique\n * state root calculated off-chain by applying the canonical transactions one by one.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract OVM_StateCommitmentChain is iOVM_StateCommitmentChain, Lib_AddressResolver {\n\n /*************\n * Constants *\n *************/\n\n uint256 public FRAUD_PROOF_WINDOW;\n uint256 public SEQUENCER_PUBLISH_WINDOW;\n\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n constructor(\n address _libAddressManager,\n uint256 _fraudProofWindow,\n uint256 _sequencerPublishWindow\n )\n Lib_AddressResolver(_libAddressManager)\n {\n FRAUD_PROOF_WINDOW = _fraudProofWindow;\n SEQUENCER_PUBLISH_WINDOW = _sequencerPublishWindow;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Accesses the batch storage container.\n * @return Reference to the batch storage container.\n */\n function batches()\n public\n view\n returns (\n iOVM_ChainStorageContainer\n )\n {\n return iOVM_ChainStorageContainer(\n resolve(\"OVM_ChainStorageContainer:SCC:batches\")\n );\n }\n\n /**\n * @inheritdoc iOVM_StateCommitmentChain\n */\n function getTotalElements()\n override\n public\n view\n returns (\n uint256 _totalElements\n )\n {\n (uint40 totalElements, ) = _getBatchExtraData();\n return uint256(totalElements);\n }\n\n /**\n * @inheritdoc iOVM_StateCommitmentChain\n */\n function getTotalBatches()\n override\n public\n view\n returns (\n uint256 _totalBatches\n )\n {\n return batches().length();\n }\n\n /**\n * @inheritdoc iOVM_StateCommitmentChain\n */\n function getLastSequencerTimestamp()\n override\n public\n view\n returns (\n uint256 _lastSequencerTimestamp\n )\n {\n (, uint40 lastSequencerTimestamp) = _getBatchExtraData();\n return uint256(lastSequencerTimestamp);\n }\n\n /**\n * @inheritdoc iOVM_StateCommitmentChain\n */\n function appendStateBatch(\n bytes32[] memory _batch,\n uint256 _shouldStartAtElement\n )\n override\n public\n {\n // Fail fast in to make sure our batch roots aren't accidentally made fraudulent by the\n // publication of batches by some other user.\n require(\n _shouldStartAtElement == getTotalElements(),\n \"Actual batch start index does not match expected start index.\"\n );\n\n // Proposers must have previously staked at the BondManager\n require(\n iOVM_BondManager(resolve(\"OVM_BondManager\")).isCollateralized(msg.sender),\n \"Proposer does not have enough collateral posted\"\n );\n\n require(\n _batch.length > 0,\n \"Cannot submit an empty state batch.\"\n );\n\n require(\n getTotalElements() + _batch.length <= iOVM_CanonicalTransactionChain(resolve(\"OVM_CanonicalTransactionChain\")).getTotalElements(),\n \"Number of state roots cannot exceed the number of canonical transactions.\"\n );\n\n // Pass the block's timestamp and the publisher of the data\n // to be used in the fraud proofs\n _appendBatch(\n _batch,\n abi.encode(block.timestamp, msg.sender)\n );\n }\n\n /**\n * @inheritdoc iOVM_StateCommitmentChain\n */\n function deleteStateBatch(\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\n )\n override\n public\n {\n require(\n msg.sender == resolve(\"OVM_FraudVerifier\"),\n \"State batches can only be deleted by the OVM_FraudVerifier.\"\n );\n\n require(\n _isValidBatchHeader(_batchHeader),\n \"Invalid batch header.\"\n );\n\n require(\n insideFraudProofWindow(_batchHeader),\n \"State batches can only be deleted within the fraud proof window.\"\n );\n\n _deleteBatch(_batchHeader);\n }\n\n /**\n * @inheritdoc iOVM_StateCommitmentChain\n */\n function verifyStateCommitment(\n bytes32 _element,\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _proof\n )\n override\n public\n view\n returns (\n bool\n )\n {\n require(\n _isValidBatchHeader(_batchHeader),\n \"Invalid batch header.\"\n );\n\n require(\n Lib_MerkleTree.verify(\n _batchHeader.batchRoot,\n _element,\n _proof.index,\n _proof.siblings,\n _batchHeader.batchSize\n ),\n \"Invalid inclusion proof.\"\n );\n\n return true;\n }\n\n /**\n * @inheritdoc iOVM_StateCommitmentChain\n */\n function insideFraudProofWindow(\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\n )\n override\n public\n view\n returns (\n bool _inside\n )\n {\n (uint256 timestamp,) = abi.decode(\n _batchHeader.extraData,\n (uint256, address)\n );\n\n require(\n timestamp != 0,\n \"Batch header timestamp cannot be zero\"\n );\n return SafeMath.add(timestamp, FRAUD_PROOF_WINDOW) > block.timestamp;\n }\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Parses the batch context from the extra data.\n * @return Total number of elements submitted.\n * @return Timestamp of the last batch submitted by the sequencer.\n */\n function _getBatchExtraData()\n internal\n view\n returns (\n uint40,\n uint40\n )\n {\n bytes27 extraData = batches().getGlobalMetadata();\n\n uint40 totalElements;\n uint40 lastSequencerTimestamp;\n assembly {\n extraData := shr(40, extraData)\n totalElements := and(extraData, 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF)\n lastSequencerTimestamp := shr(40, and(extraData, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000))\n }\n\n return (\n totalElements,\n lastSequencerTimestamp\n );\n }\n\n /**\n * Encodes the batch context for the extra data.\n * @param _totalElements Total number of elements submitted.\n * @param _lastSequencerTimestamp Timestamp of the last batch submitted by the sequencer.\n * @return Encoded batch context.\n */\n function _makeBatchExtraData(\n uint40 _totalElements,\n uint40 _lastSequencerTimestamp\n )\n internal\n pure\n returns (\n bytes27\n )\n {\n bytes27 extraData;\n assembly {\n extraData := _totalElements\n extraData := or(extraData, shl(40, _lastSequencerTimestamp))\n extraData := shl(40, extraData)\n }\n\n return extraData;\n }\n\n /**\n * Appends a batch to the chain.\n * @param _batch Elements within the batch.\n * @param _extraData Any extra data to append to the batch.\n */\n function _appendBatch(\n bytes32[] memory _batch,\n bytes memory _extraData\n )\n internal\n {\n address sequencer = resolve(\"OVM_Proposer\");\n (uint40 totalElements, uint40 lastSequencerTimestamp) = _getBatchExtraData();\n\n if (msg.sender == sequencer) {\n lastSequencerTimestamp = uint40(block.timestamp);\n } else {\n // We keep track of the last batch submitted by the sequencer so there's a window in\n // which only the sequencer can publish state roots. A window like this just reduces\n // the chance of \"system breaking\" state roots being published while we're still in\n // testing mode. This window should be removed or significantly reduced in the future.\n require(\n lastSequencerTimestamp + SEQUENCER_PUBLISH_WINDOW < block.timestamp,\n \"Cannot publish state roots within the sequencer publication window.\"\n );\n }\n\n // For efficiency reasons getMerkleRoot modifies the `_batch` argument in place\n // while calculating the root hash therefore any arguments passed to it must not\n // be used again afterwards\n Lib_OVMCodec.ChainBatchHeader memory batchHeader = Lib_OVMCodec.ChainBatchHeader({\n batchIndex: getTotalBatches(),\n batchRoot: Lib_MerkleTree.getMerkleRoot(_batch),\n batchSize: _batch.length,\n prevTotalElements: totalElements,\n extraData: _extraData\n });\n\n emit StateBatchAppended(\n batchHeader.batchIndex,\n batchHeader.batchRoot,\n batchHeader.batchSize,\n batchHeader.prevTotalElements,\n batchHeader.extraData\n );\n\n batches().push(\n Lib_OVMCodec.hashBatchHeader(batchHeader),\n _makeBatchExtraData(\n uint40(batchHeader.prevTotalElements + batchHeader.batchSize),\n lastSequencerTimestamp\n )\n );\n }\n\n /**\n * Removes a batch and all subsequent batches from the chain.\n * @param _batchHeader Header of the batch to remove.\n */\n function _deleteBatch(\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\n )\n internal\n {\n require(\n _batchHeader.batchIndex < batches().length(),\n \"Invalid batch index.\"\n );\n\n require(\n _isValidBatchHeader(_batchHeader),\n \"Invalid batch header.\"\n );\n\n batches().deleteElementsAfterInclusive(\n _batchHeader.batchIndex,\n _makeBatchExtraData(\n uint40(_batchHeader.prevTotalElements),\n 0\n )\n );\n\n emit StateBatchDeleted(\n _batchHeader.batchIndex,\n _batchHeader.batchRoot\n );\n }\n\n /**\n * Checks that a batch header matches the stored hash for the given index.\n * @param _batchHeader Batch header to validate.\n * @return Whether or not the header matches the stored one.\n */\n function _isValidBatchHeader(\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\n )\n internal\n view\n returns (\n bool\n )\n {\n return Lib_OVMCodec.hashBatchHeader(_batchHeader) == batches().get(_batchHeader.batchIndex);\n }\n}\n" - }, - "contracts/optimistic-ethereum/libraries/utils/Lib_MerkleTree.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/**\n * @title Lib_MerkleTree\n * @author River Keefer\n */\nlibrary Lib_MerkleTree {\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Calculates a merkle root for a list of 32-byte leaf hashes. WARNING: If the number\n * of leaves passed in is not a power of two, it pads out the tree with zero hashes.\n * If you do not know the original length of elements for the tree you are verifying,\n * then this may allow empty leaves past _elements.length to pass a verification check down the line.\n * Note that the _elements argument is modified, therefore it must not be used again afterwards\n * @param _elements Array of hashes from which to generate a merkle root.\n * @return Merkle root of the leaves, with zero hashes for non-powers-of-two (see above).\n */\n function getMerkleRoot(\n bytes32[] memory _elements\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n require(\n _elements.length > 0,\n \"Lib_MerkleTree: Must provide at least one leaf hash.\"\n );\n\n if (_elements.length == 1) {\n return _elements[0];\n }\n\n uint256[16] memory defaults = [\n 0x290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563,\n 0x633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d,\n 0x890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d,\n 0x3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd8,\n 0xecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da,\n 0xdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da5,\n 0x617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d7,\n 0x292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead,\n 0xe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e10,\n 0x7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f82,\n 0xe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e83636516,\n 0x3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c,\n 0xad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e,\n 0xa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab,\n 0x4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c862,\n 0x2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf10\n ];\n\n // Reserve memory space for our hashes.\n bytes memory buf = new bytes(64);\n\n // We'll need to keep track of left and right siblings.\n bytes32 leftSibling;\n bytes32 rightSibling;\n\n // Number of non-empty nodes at the current depth.\n uint256 rowSize = _elements.length;\n\n // Current depth, counting from 0 at the leaves\n uint256 depth = 0;\n\n // Common sub-expressions\n uint256 halfRowSize; // rowSize / 2\n bool rowSizeIsOdd; // rowSize % 2 == 1\n\n while (rowSize > 1) {\n halfRowSize = rowSize / 2;\n rowSizeIsOdd = rowSize % 2 == 1;\n\n for (uint256 i = 0; i < halfRowSize; i++) {\n leftSibling = _elements[(2 * i) ];\n rightSibling = _elements[(2 * i) + 1];\n assembly {\n mstore(add(buf, 32), leftSibling )\n mstore(add(buf, 64), rightSibling)\n }\n\n _elements[i] = keccak256(buf);\n }\n\n if (rowSizeIsOdd) {\n leftSibling = _elements[rowSize - 1];\n rightSibling = bytes32(defaults[depth]);\n assembly {\n mstore(add(buf, 32), leftSibling)\n mstore(add(buf, 64), rightSibling)\n }\n\n _elements[halfRowSize] = keccak256(buf);\n }\n\n rowSize = halfRowSize + (rowSizeIsOdd ? 1 : 0);\n depth++;\n }\n\n return _elements[0];\n }\n\n /**\n * Verifies a merkle branch for the given leaf hash. Assumes the original length\n * of leaves generated is a known, correct input, and does not return true for indices\n * extending past that index (even if _siblings would be otherwise valid.)\n * @param _root The Merkle root to verify against.\n * @param _leaf The leaf hash to verify inclusion of.\n * @param _index The index in the tree of this leaf.\n * @param _siblings Array of sibline nodes in the inclusion proof, starting from depth 0 (bottom of the tree).\n * @param _totalLeaves The total number of leaves originally passed into.\n * @return Whether or not the merkle branch and leaf passes verification.\n */\n function verify(\n bytes32 _root,\n bytes32 _leaf,\n uint256 _index,\n bytes32[] memory _siblings,\n uint256 _totalLeaves\n )\n internal\n pure\n returns (\n bool\n )\n {\n require(\n _totalLeaves > 0,\n \"Lib_MerkleTree: Total leaves must be greater than zero.\"\n );\n\n require(\n _index < _totalLeaves,\n \"Lib_MerkleTree: Index out of bounds.\"\n );\n\n require(\n _siblings.length == _ceilLog2(_totalLeaves),\n \"Lib_MerkleTree: Total siblings does not correctly correspond to total leaves.\"\n );\n\n bytes32 computedRoot = _leaf;\n\n for (uint256 i = 0; i < _siblings.length; i++) {\n if ((_index & 1) == 1) {\n computedRoot = keccak256(\n abi.encodePacked(\n _siblings[i],\n computedRoot\n )\n );\n } else {\n computedRoot = keccak256(\n abi.encodePacked(\n computedRoot,\n _siblings[i]\n )\n );\n }\n\n _index >>= 1;\n }\n\n return _root == computedRoot;\n }\n\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * Calculates the integer ceiling of the log base 2 of an input.\n * @param _in Unsigned input to calculate the log.\n * @return ceil(log_base_2(_in))\n */\n function _ceilLog2(\n uint256 _in\n )\n private\n pure\n returns (\n uint256\n )\n {\n require(\n _in > 0,\n \"Lib_MerkleTree: Cannot compute ceil(log_2) of 0.\"\n );\n\n if (_in == 1) {\n return 0;\n }\n\n // Find the highest set bit (will be floor(log_2)).\n // Borrowed with <3 from https://github.com/ethereum/solidity-examples\n uint256 val = _in;\n uint256 highest = 0;\n for (uint256 i = 128; i >= 1; i >>= 1) {\n if (val & (uint(1) << i) - 1 << i != 0) {\n highest += i;\n val >>= i;\n }\n }\n\n // Increment by one if this is not a perfect logarithm.\n if ((uint(1) << highest) != _in) {\n highest += 1;\n }\n\n return highest;\n }\n}\n" - }, - "@openzeppelin/contracts/math/SafeMath.sol": { - "content": "// SPDX-License-Identifier: MIT\n\npragma solidity >=0.6.0 <0.8.0;\n\n/**\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\n * checks.\n *\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\n * in bugs, because programmers usually assume that an overflow raises an\n * error, which is the standard behavior in high level programming languages.\n * `SafeMath` restores this intuition by reverting the transaction when an\n * operation overflows.\n *\n * Using this library instead of the unchecked operations eliminates an entire\n * class of bugs, so it's recommended to use it always.\n */\nlibrary SafeMath {\n /**\n * @dev Returns the addition of two unsigned integers, with an overflow flag.\n *\n * _Available since v3.4._\n */\n function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n uint256 c = a + b;\n if (c < a) return (false, 0);\n return (true, c);\n }\n\n /**\n * @dev Returns the substraction of two unsigned integers, with an overflow flag.\n *\n * _Available since v3.4._\n */\n function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n if (b > a) return (false, 0);\n return (true, a - b);\n }\n\n /**\n * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\n *\n * _Available since v3.4._\n */\n function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\n // benefit is lost if 'b' is also tested.\n // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\n if (a == 0) return (true, 0);\n uint256 c = a * b;\n if (c / a != b) return (false, 0);\n return (true, c);\n }\n\n /**\n * @dev Returns the division of two unsigned integers, with a division by zero flag.\n *\n * _Available since v3.4._\n */\n function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n if (b == 0) return (false, 0);\n return (true, a / b);\n }\n\n /**\n * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\n *\n * _Available since v3.4._\n */\n function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n if (b == 0) return (false, 0);\n return (true, a % b);\n }\n\n /**\n * @dev Returns the addition of two unsigned integers, reverting on\n * overflow.\n *\n * Counterpart to Solidity's `+` operator.\n *\n * Requirements:\n *\n * - Addition cannot overflow.\n */\n function add(uint256 a, uint256 b) internal pure returns (uint256) {\n uint256 c = a + b;\n require(c >= a, \"SafeMath: addition overflow\");\n return c;\n }\n\n /**\n * @dev Returns the subtraction of two unsigned integers, reverting on\n * overflow (when the result is negative).\n *\n * Counterpart to Solidity's `-` operator.\n *\n * Requirements:\n *\n * - Subtraction cannot overflow.\n */\n function sub(uint256 a, uint256 b) internal pure returns (uint256) {\n require(b <= a, \"SafeMath: subtraction overflow\");\n return a - b;\n }\n\n /**\n * @dev Returns the multiplication of two unsigned integers, reverting on\n * overflow.\n *\n * Counterpart to Solidity's `*` operator.\n *\n * Requirements:\n *\n * - Multiplication cannot overflow.\n */\n function mul(uint256 a, uint256 b) internal pure returns (uint256) {\n if (a == 0) return 0;\n uint256 c = a * b;\n require(c / a == b, \"SafeMath: multiplication overflow\");\n return c;\n }\n\n /**\n * @dev Returns the integer division of two unsigned integers, reverting on\n * division by zero. The result is rounded towards zero.\n *\n * Counterpart to Solidity's `/` operator. Note: this function uses a\n * `revert` opcode (which leaves remaining gas untouched) while Solidity\n * uses an invalid opcode to revert (consuming all remaining gas).\n *\n * Requirements:\n *\n * - The divisor cannot be zero.\n */\n function div(uint256 a, uint256 b) internal pure returns (uint256) {\n require(b > 0, \"SafeMath: division by zero\");\n return a / b;\n }\n\n /**\n * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\n * reverting when dividing by zero.\n *\n * Counterpart to Solidity's `%` operator. This function uses a `revert`\n * opcode (which leaves remaining gas untouched) while Solidity uses an\n * invalid opcode to revert (consuming all remaining gas).\n *\n * Requirements:\n *\n * - The divisor cannot be zero.\n */\n function mod(uint256 a, uint256 b) internal pure returns (uint256) {\n require(b > 0, \"SafeMath: modulo by zero\");\n return a % b;\n }\n\n /**\n * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\n * overflow (when the result is negative).\n *\n * CAUTION: This function is deprecated because it requires allocating memory for the error\n * message unnecessarily. For custom revert reasons use {trySub}.\n *\n * Counterpart to Solidity's `-` operator.\n *\n * Requirements:\n *\n * - Subtraction cannot overflow.\n */\n function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\n require(b <= a, errorMessage);\n return a - b;\n }\n\n /**\n * @dev Returns the integer division of two unsigned integers, reverting with custom message on\n * division by zero. The result is rounded towards zero.\n *\n * CAUTION: This function is deprecated because it requires allocating memory for the error\n * message unnecessarily. For custom revert reasons use {tryDiv}.\n *\n * Counterpart to Solidity's `/` operator. Note: this function uses a\n * `revert` opcode (which leaves remaining gas untouched) while Solidity\n * uses an invalid opcode to revert (consuming all remaining gas).\n *\n * Requirements:\n *\n * - The divisor cannot be zero.\n */\n function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\n require(b > 0, errorMessage);\n return a / b;\n }\n\n /**\n * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\n * reverting with custom message when dividing by zero.\n *\n * CAUTION: This function is deprecated because it requires allocating memory for the error\n * message unnecessarily. For custom revert reasons use {tryMod}.\n *\n * Counterpart to Solidity's `%` operator. This function uses a `revert`\n * opcode (which leaves remaining gas untouched) while Solidity uses an\n * invalid opcode to revert (consuming all remaining gas).\n *\n * Requirements:\n *\n * - The divisor cannot be zero.\n */\n function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\n require(b > 0, errorMessage);\n return a % b;\n }\n}\n" - }, - "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Library Imports */\nimport { Lib_RingBuffer } from \"../../libraries/utils/Lib_RingBuffer.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/* Interface Imports */\nimport { iOVM_ChainStorageContainer } from \"../../iOVM/chain/iOVM_ChainStorageContainer.sol\";\n\n/**\n * @title OVM_ChainStorageContainer\n * @dev The Chain Storage Container provides its owner contract with read, write and delete functionality.\n * This provides gas efficiency gains by enabling it to overwrite storage slots which can no longer be used\n * in a fraud proof due to the fraud window having passed, and the associated chain state or\n * transactions being finalized.\n * Three distinct Chain Storage Containers will be deployed on Layer 1:\n * 1. Stores transaction batches for the Canonical Transaction Chain\n * 2. Stores queued transactions for the Canonical Transaction Chain\n * 3. Stores chain state batches for the State Commitment Chain\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract OVM_ChainStorageContainer is iOVM_ChainStorageContainer, Lib_AddressResolver {\n\n /*************\n * Libraries *\n *************/\n\n using Lib_RingBuffer for Lib_RingBuffer.RingBuffer;\n\n\n /*************\n * Variables *\n *************/\n\n string public owner;\n Lib_RingBuffer.RingBuffer internal buffer;\n\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n * @param _owner Name of the contract that owns this container (will be resolved later).\n */\n constructor(\n address _libAddressManager,\n string memory _owner\n )\n Lib_AddressResolver(_libAddressManager)\n {\n owner = _owner;\n }\n\n\n /**********************\n * Function Modifiers *\n **********************/\n\n modifier onlyOwner() {\n require(\n msg.sender == resolve(owner),\n \"OVM_ChainStorageContainer: Function can only be called by the owner.\"\n );\n _;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @inheritdoc iOVM_ChainStorageContainer\n */\n function setGlobalMetadata(\n bytes27 _globalMetadata\n )\n override\n public\n onlyOwner\n {\n return buffer.setExtraData(_globalMetadata);\n }\n\n /**\n * @inheritdoc iOVM_ChainStorageContainer\n */\n function getGlobalMetadata()\n override\n public\n view\n returns (\n bytes27\n )\n {\n return buffer.getExtraData();\n }\n\n /**\n * @inheritdoc iOVM_ChainStorageContainer\n */\n function length()\n override\n public\n view\n returns (\n uint256\n )\n {\n return uint256(buffer.getLength());\n }\n\n /**\n * @inheritdoc iOVM_ChainStorageContainer\n */\n function push(\n bytes32 _object\n )\n override\n public\n onlyOwner\n {\n buffer.push(_object);\n }\n\n /**\n * @inheritdoc iOVM_ChainStorageContainer\n */\n function push(\n bytes32 _object,\n bytes27 _globalMetadata\n )\n override\n public\n onlyOwner\n {\n buffer.push(_object, _globalMetadata);\n }\n\n /**\n * @inheritdoc iOVM_ChainStorageContainer\n */\n function get(\n uint256 _index\n )\n override\n public\n view\n returns (\n bytes32\n )\n {\n return buffer.get(uint40(_index));\n }\n \n /**\n * @inheritdoc iOVM_ChainStorageContainer\n */\n function deleteElementsAfterInclusive(\n uint256 _index\n )\n override\n public\n onlyOwner\n {\n buffer.deleteElementsAfterInclusive(\n uint40(_index)\n );\n }\n\n /**\n * @inheritdoc iOVM_ChainStorageContainer\n */\n function deleteElementsAfterInclusive(\n uint256 _index,\n bytes27 _globalMetadata\n )\n override\n public\n onlyOwner\n {\n buffer.deleteElementsAfterInclusive(\n uint40(_index),\n _globalMetadata\n );\n }\n\n /**\n * @inheritdoc iOVM_ChainStorageContainer\n */\n function setNextOverwritableIndex(\n uint256 _index\n )\n override\n public\n onlyOwner\n {\n buffer.nextOverwritableIndex = _index;\n }\n}\n" - }, - "contracts/optimistic-ethereum/libraries/utils/Lib_RingBuffer.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\nlibrary Lib_RingBuffer {\n using Lib_RingBuffer for RingBuffer;\n\n /***********\n * Structs *\n ***********/\n\n struct Buffer {\n uint256 length;\n mapping (uint256 => bytes32) buf;\n }\n\n struct RingBuffer {\n bytes32 contextA;\n bytes32 contextB;\n Buffer bufferA;\n Buffer bufferB;\n uint256 nextOverwritableIndex;\n }\n\n struct RingBufferContext {\n // contextA\n uint40 globalIndex;\n bytes27 extraData;\n\n // contextB\n uint64 currBufferIndex;\n uint40 prevResetIndex;\n uint40 currResetIndex;\n }\n\n\n /*************\n * Constants *\n *************/\n\n uint256 constant MIN_CAPACITY = 16;\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Pushes a single element to the buffer.\n * @param _self Buffer to access.\n * @param _value Value to push to the buffer.\n * @param _extraData Optional global extra data.\n */\n function push(\n RingBuffer storage _self,\n bytes32 _value,\n bytes27 _extraData\n )\n internal\n {\n RingBufferContext memory ctx = _self.getContext();\n Buffer storage currBuffer = _self.getBuffer(ctx.currBufferIndex);\n\n // Set a minimum capacity.\n if (currBuffer.length == 0) {\n currBuffer.length = MIN_CAPACITY;\n }\n\n // Check if we need to expand the buffer.\n if (ctx.globalIndex - ctx.currResetIndex >= currBuffer.length) {\n if (ctx.currResetIndex < _self.nextOverwritableIndex) {\n // We're going to overwrite the inactive buffer.\n // Bump the buffer index, reset the delete offset, and set our reset indices.\n ctx.currBufferIndex++;\n ctx.prevResetIndex = ctx.currResetIndex;\n ctx.currResetIndex = ctx.globalIndex;\n\n // Swap over to the next buffer.\n currBuffer = _self.getBuffer(ctx.currBufferIndex);\n } else {\n // We're not overwriting yet, double the length of the current buffer.\n currBuffer.length *= 2;\n }\n }\n\n // Index to write to is the difference of the global and reset indices.\n uint256 writeHead = ctx.globalIndex - ctx.currResetIndex;\n currBuffer.buf[writeHead] = _value;\n\n // Bump the global index and insert our extra data, then save the context.\n ctx.globalIndex++;\n ctx.extraData = _extraData;\n _self.setContext(ctx);\n }\n\n /**\n * Pushes a single element to the buffer.\n * @param _self Buffer to access.\n * @param _value Value to push to the buffer.\n */\n function push(\n RingBuffer storage _self,\n bytes32 _value\n )\n internal\n {\n RingBufferContext memory ctx = _self.getContext();\n \n _self.push(\n _value,\n ctx.extraData\n );\n }\n\n /**\n * Retrieves an element from the buffer.\n * @param _self Buffer to access.\n * @param _index Element index to retrieve.\n * @return Value of the element at the given index.\n */\n function get(\n RingBuffer storage _self,\n uint256 _index\n )\n internal\n view\n returns (\n bytes32 \n )\n {\n RingBufferContext memory ctx = _self.getContext();\n\n require(\n _index < ctx.globalIndex,\n \"Index out of bounds.\"\n );\n\n Buffer storage currBuffer = _self.getBuffer(ctx.currBufferIndex);\n Buffer storage prevBuffer = _self.getBuffer(ctx.currBufferIndex + 1);\n\n if (_index >= ctx.currResetIndex) {\n // We're trying to load an element from the current buffer.\n // Relative index is just the difference from the reset index.\n uint256 relativeIndex = _index - ctx.currResetIndex;\n\n // Shouldn't happen but why not check.\n require(\n relativeIndex < currBuffer.length,\n \"Index out of bounds.\"\n );\n\n return currBuffer.buf[relativeIndex];\n } else {\n // We're trying to load an element from the previous buffer.\n // Relative index is the difference from the reset index in the other direction.\n uint256 relativeIndex = ctx.currResetIndex - _index;\n\n // Condition only fails in the case that we deleted and flipped buffers.\n require(\n ctx.currResetIndex > ctx.prevResetIndex,\n \"Index out of bounds.\"\n );\n\n // Make sure we're not trying to read beyond the array.\n require(\n relativeIndex <= prevBuffer.length,\n \"Index out of bounds.\"\n );\n\n return prevBuffer.buf[prevBuffer.length - relativeIndex];\n }\n }\n\n /**\n * Deletes all elements after (and including) a given index.\n * @param _self Buffer to access.\n * @param _index Index of the element to delete from (inclusive).\n * @param _extraData Optional global extra data.\n */\n function deleteElementsAfterInclusive(\n RingBuffer storage _self,\n uint40 _index,\n bytes27 _extraData\n )\n internal\n {\n RingBufferContext memory ctx = _self.getContext();\n\n require(\n _index < ctx.globalIndex && _index >= ctx.prevResetIndex,\n \"Index out of bounds.\"\n );\n\n if (_index < ctx.currResetIndex) {\n // We're switching back to the previous buffer.\n // Reduce the buffer index, set the current reset index back to match the previous one.\n // We use the equality of these two values to prevent reading beyond this buffer.\n ctx.currBufferIndex--;\n ctx.currResetIndex = ctx.prevResetIndex;\n }\n\n // Set our global index and extra data, save the context.\n ctx.globalIndex = _index;\n ctx.extraData = _extraData;\n _self.setContext(ctx);\n }\n\n /**\n * Deletes all elements after (and including) a given index.\n * @param _self Buffer to access.\n * @param _index Index of the element to delete from (inclusive).\n */\n function deleteElementsAfterInclusive(\n RingBuffer storage _self,\n uint40 _index\n )\n internal\n {\n RingBufferContext memory ctx = _self.getContext();\n _self.deleteElementsAfterInclusive(\n _index,\n ctx.extraData\n );\n }\n\n /**\n * Retrieves the current global index.\n * @param _self Buffer to access.\n * @return Current global index.\n */\n function getLength(\n RingBuffer storage _self\n )\n internal\n view\n returns (\n uint40\n )\n {\n RingBufferContext memory ctx = _self.getContext();\n return ctx.globalIndex;\n }\n\n /**\n * Changes current global extra data.\n * @param _self Buffer to access.\n * @param _extraData New global extra data.\n */\n function setExtraData(\n RingBuffer storage _self,\n bytes27 _extraData\n )\n internal\n {\n RingBufferContext memory ctx = _self.getContext();\n ctx.extraData = _extraData;\n _self.setContext(ctx);\n }\n\n /**\n * Retrieves the current global extra data.\n * @param _self Buffer to access.\n * @return Current global extra data.\n */\n function getExtraData(\n RingBuffer storage _self\n )\n internal\n view\n returns (\n bytes27\n )\n {\n RingBufferContext memory ctx = _self.getContext();\n return ctx.extraData;\n }\n\n /**\n * Sets the current ring buffer context.\n * @param _self Buffer to access.\n * @param _ctx Current ring buffer context.\n */\n function setContext(\n RingBuffer storage _self,\n RingBufferContext memory _ctx\n )\n internal\n {\n bytes32 contextA;\n bytes32 contextB;\n\n uint40 globalIndex = _ctx.globalIndex;\n bytes27 extraData = _ctx.extraData;\n assembly {\n contextA := globalIndex\n contextA := or(contextA, extraData)\n }\n\n uint64 currBufferIndex = _ctx.currBufferIndex;\n uint40 prevResetIndex = _ctx.prevResetIndex;\n uint40 currResetIndex = _ctx.currResetIndex;\n assembly {\n contextB := currBufferIndex\n contextB := or(contextB, shl(64, prevResetIndex))\n contextB := or(contextB, shl(104, currResetIndex))\n }\n\n if (_self.contextA != contextA) {\n _self.contextA = contextA;\n }\n\n if (_self.contextB != contextB) {\n _self.contextB = contextB;\n }\n }\n\n /**\n * Retrieves the current ring buffer context.\n * @param _self Buffer to access.\n * @return Current ring buffer context.\n */\n function getContext(\n RingBuffer storage _self\n )\n internal\n view\n returns (\n RingBufferContext memory\n )\n {\n bytes32 contextA = _self.contextA;\n bytes32 contextB = _self.contextB;\n\n uint40 globalIndex;\n bytes27 extraData;\n assembly {\n globalIndex := and(contextA, 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF)\n extraData := and(contextA, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000)\n }\n\n uint64 currBufferIndex;\n uint40 prevResetIndex;\n uint40 currResetIndex;\n assembly {\n currBufferIndex := and(contextB, 0x000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF)\n prevResetIndex := shr(64, and(contextB, 0x00000000000000000000000000000000000000FFFFFFFFFF0000000000000000))\n currResetIndex := shr(104, and(contextB, 0x0000000000000000000000000000FFFFFFFFFF00000000000000000000000000))\n }\n\n return RingBufferContext({\n globalIndex: globalIndex,\n extraData: extraData,\n currBufferIndex: currBufferIndex,\n prevResetIndex: prevResetIndex,\n currResetIndex: currResetIndex\n });\n }\n\n /**\n * Retrieves the a buffer from the ring buffer by index.\n * @param _self Buffer to access.\n * @param _which Index of the sub buffer to access.\n * @return Sub buffer for the index.\n */\n function getBuffer(\n RingBuffer storage _self,\n uint256 _which\n )\n internal\n view\n returns (\n Buffer storage\n )\n {\n return _which % 2 == 0 ? _self.bufferA : _self.bufferB;\n }\n}\n" - }, - "contracts/test-libraries/utils/TestLib_RingBuffer.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_RingBuffer } from \"../../optimistic-ethereum/libraries/utils/Lib_RingBuffer.sol\";\n\n/**\n * @title TestLib_RingBuffer\n */\ncontract TestLib_RingBuffer {\n using Lib_RingBuffer for Lib_RingBuffer.RingBuffer;\n \n Lib_RingBuffer.RingBuffer internal buf;\n\n function push(\n bytes32 _value,\n bytes27 _extraData\n )\n public\n {\n buf.push(\n _value,\n _extraData\n );\n }\n\n function get(\n uint256 _index\n )\n public\n view\n returns (\n bytes32 \n )\n {\n return buf.get(_index);\n }\n\n function deleteElementsAfterInclusive(\n uint40 _index,\n bytes27 _extraData\n )\n internal\n {\n return buf.deleteElementsAfterInclusive(\n _index,\n _extraData\n );\n }\n\n function getLength()\n internal\n view\n returns (\n uint40\n )\n {\n return buf.getLength();\n }\n\n function getExtraData()\n internal\n view\n returns (\n bytes27\n )\n {\n return buf.getExtraData();\n }\n}\n" - }, - "contracts/optimistic-ethereum/OVM/chain/OVM_CanonicalTransactionChain.sol": { - "content": "// SPDX-License-Identifier: MIT\n// @unsupported: ovm\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\nimport { Lib_MerkleTree } from \"../../libraries/utils/Lib_MerkleTree.sol\";\nimport { Lib_Math } from \"../../libraries/utils/Lib_Math.sol\";\n\n/* Interface Imports */\nimport { iOVM_CanonicalTransactionChain } from \"../../iOVM/chain/iOVM_CanonicalTransactionChain.sol\";\nimport { iOVM_ChainStorageContainer } from \"../../iOVM/chain/iOVM_ChainStorageContainer.sol\";\n\n/* Contract Imports */\nimport { OVM_ExecutionManager } from \"../execution/OVM_ExecutionManager.sol\";\n\n\n/**\n * @title OVM_CanonicalTransactionChain\n * @dev The Canonical Transaction Chain (CTC) contract is an append-only log of transactions\n * which must be applied to the rollup state. It defines the ordering of rollup transactions by\n * writing them to the 'CTC:batches' instance of the Chain Storage Container.\n * The CTC also allows any account to 'enqueue' an L2 transaction, which will require that the Sequencer\n * will eventually append it to the rollup state.\n * If the Sequencer does not include an enqueued transaction within the 'force inclusion period',\n * then any account may force it to be included by calling appendQueueBatch().\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract OVM_CanonicalTransactionChain is iOVM_CanonicalTransactionChain, Lib_AddressResolver {\n\n /*************\n * Constants *\n *************/\n\n // L2 tx gas-related\n uint256 constant public MIN_ROLLUP_TX_GAS = 100000;\n uint256 constant public MAX_ROLLUP_TX_SIZE = 50000;\n uint256 constant public L2_GAS_DISCOUNT_DIVISOR = 32;\n\n // Encoding-related (all in bytes)\n uint256 constant internal BATCH_CONTEXT_SIZE = 16;\n uint256 constant internal BATCH_CONTEXT_LENGTH_POS = 12;\n uint256 constant internal BATCH_CONTEXT_START_POS = 15;\n uint256 constant internal TX_DATA_HEADER_SIZE = 3;\n uint256 constant internal BYTES_TILL_TX_DATA = 65;\n\n\n /*************\n * Variables *\n *************/\n\n uint256 public forceInclusionPeriodSeconds;\n uint256 public forceInclusionPeriodBlocks;\n uint256 public maxTransactionGasLimit;\n\n\n /***************\n * Constructor *\n ***************/\n\n constructor(\n address _libAddressManager,\n uint256 _forceInclusionPeriodSeconds,\n uint256 _forceInclusionPeriodBlocks,\n uint256 _maxTransactionGasLimit\n )\n Lib_AddressResolver(_libAddressManager)\n {\n forceInclusionPeriodSeconds = _forceInclusionPeriodSeconds;\n forceInclusionPeriodBlocks = _forceInclusionPeriodBlocks;\n maxTransactionGasLimit = _maxTransactionGasLimit;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Accesses the batch storage container.\n * @return Reference to the batch storage container.\n */\n function batches()\n override\n public\n view\n returns (\n iOVM_ChainStorageContainer\n )\n {\n return iOVM_ChainStorageContainer(\n resolve(\"OVM_ChainStorageContainer:CTC:batches\")\n );\n }\n\n /**\n * Accesses the queue storage container.\n * @return Reference to the queue storage container.\n */\n function queue()\n override\n public\n view\n returns (\n iOVM_ChainStorageContainer\n )\n {\n return iOVM_ChainStorageContainer(\n resolve(\"OVM_ChainStorageContainer:CTC:queue\")\n );\n }\n\n /**\n * Retrieves the total number of elements submitted.\n * @return _totalElements Total submitted elements.\n */\n function getTotalElements()\n override\n public\n view\n returns (\n uint256 _totalElements\n )\n {\n (uint40 totalElements,,,) = _getBatchExtraData();\n return uint256(totalElements);\n }\n\n /**\n * Retrieves the total number of batches submitted.\n * @return _totalBatches Total submitted batches.\n */\n function getTotalBatches()\n override\n public\n view\n returns (\n uint256 _totalBatches\n )\n {\n return batches().length();\n }\n\n /**\n * Returns the index of the next element to be enqueued.\n * @return Index for the next queue element.\n */\n function getNextQueueIndex()\n override\n public\n view\n returns (\n uint40\n )\n {\n (,uint40 nextQueueIndex,,) = _getBatchExtraData();\n return nextQueueIndex;\n }\n\n /**\n * Returns the timestamp of the last transaction.\n * @return Timestamp for the last transaction.\n */\n function getLastTimestamp()\n override\n public\n view\n returns (\n uint40\n )\n {\n (,,uint40 lastTimestamp,) = _getBatchExtraData();\n return lastTimestamp;\n }\n\n /**\n * Returns the blocknumber of the last transaction.\n * @return Blocknumber for the last transaction.\n */\n function getLastBlockNumber()\n override\n public\n view\n returns (\n uint40\n )\n {\n (,,,uint40 lastBlockNumber) = _getBatchExtraData();\n return lastBlockNumber;\n }\n\n /**\n * Gets the queue element at a particular index.\n * @param _index Index of the queue element to access.\n * @return _element Queue element at the given index.\n */\n function getQueueElement(\n uint256 _index\n )\n override\n public\n view\n returns (\n Lib_OVMCodec.QueueElement memory _element\n )\n {\n return _getQueueElement(\n _index,\n queue()\n );\n }\n\n /**\n * Get the number of queue elements which have not yet been included.\n * @return Number of pending queue elements.\n */\n function getNumPendingQueueElements()\n override\n public\n view\n returns (\n uint40\n )\n {\n return getQueueLength() - getNextQueueIndex();\n }\n\n /**\n * Retrieves the length of the queue, including\n * both pending and canonical transactions.\n * @return Length of the queue.\n */\n function getQueueLength()\n override\n public\n view\n returns (\n uint40\n )\n {\n return _getQueueLength(\n queue()\n );\n }\n\n /**\n * Adds a transaction to the queue.\n * @param _target Target L2 contract to send the transaction to.\n * @param _gasLimit Gas limit for the enqueued L2 transaction.\n * @param _data Transaction data.\n */\n function enqueue(\n address _target,\n uint256 _gasLimit,\n bytes memory _data\n )\n override\n public\n {\n require(\n _data.length <= MAX_ROLLUP_TX_SIZE,\n \"Transaction data size exceeds maximum for rollup transaction.\"\n );\n\n require(\n _gasLimit <= maxTransactionGasLimit,\n \"Transaction gas limit exceeds maximum for rollup transaction.\"\n );\n\n require(\n _gasLimit >= MIN_ROLLUP_TX_GAS,\n \"Transaction gas limit too low to enqueue.\"\n );\n\n // We need to consume some amount of L1 gas in order to rate limit transactions going into\n // L2. However, L2 is cheaper than L1 so we only need to burn some small proportion of the\n // provided L1 gas.\n uint256 gasToConsume = _gasLimit/L2_GAS_DISCOUNT_DIVISOR;\n uint256 startingGas = gasleft();\n\n // Although this check is not necessary (burn below will run out of gas if not true), it\n // gives the user an explicit reason as to why the enqueue attempt failed.\n require(\n startingGas > gasToConsume,\n \"Insufficient gas for L2 rate limiting burn.\"\n );\n\n // Here we do some \"dumb\" work in order to burn gas, although we should probably replace\n // this with something like minting gas token later on.\n uint256 i;\n while(startingGas - gasleft() < gasToConsume) {\n i++;\n }\n\n bytes32 transactionHash = keccak256(\n abi.encode(\n msg.sender,\n _target,\n _gasLimit,\n _data\n )\n );\n\n bytes32 timestampAndBlockNumber;\n assembly {\n timestampAndBlockNumber := timestamp()\n timestampAndBlockNumber := or(timestampAndBlockNumber, shl(40, number()))\n }\n\n iOVM_ChainStorageContainer queueRef = queue();\n\n queueRef.push(transactionHash);\n queueRef.push(timestampAndBlockNumber);\n\n // The underlying queue data structure stores 2 elements\n // per insertion, so to get the real queue length we need\n // to divide by 2 and subtract 1.\n uint256 queueIndex = queueRef.length() / 2 - 1;\n emit TransactionEnqueued(\n msg.sender,\n _target,\n _gasLimit,\n _data,\n queueIndex,\n block.timestamp\n );\n }\n\n /**\n * Appends a given number of queued transactions as a single batch.\n * param _numQueuedTransactions Number of transactions to append.\n */\n function appendQueueBatch(\n uint256 // _numQueuedTransactions\n )\n override\n public\n pure\n {\n // TEMPORARY: Disable `appendQueueBatch` for minnet\n revert(\"appendQueueBatch is currently disabled.\");\n\n // _numQueuedTransactions = Lib_Math.min(_numQueuedTransactions, getNumPendingQueueElements());\n // require(\n // _numQueuedTransactions > 0,\n // \"Must append more than zero transactions.\"\n // );\n\n // bytes32[] memory leaves = new bytes32[](_numQueuedTransactions);\n // uint40 nextQueueIndex = getNextQueueIndex();\n\n // for (uint256 i = 0; i < _numQueuedTransactions; i++) {\n // if (msg.sender != resolve(\"OVM_Sequencer\")) {\n // Lib_OVMCodec.QueueElement memory el = getQueueElement(nextQueueIndex);\n // require(\n // el.timestamp + forceInclusionPeriodSeconds < block.timestamp,\n // \"Queue transactions cannot be submitted during the sequencer inclusion period.\"\n // );\n // }\n // leaves[i] = _getQueueLeafHash(nextQueueIndex);\n // nextQueueIndex++;\n // }\n\n // Lib_OVMCodec.QueueElement memory lastElement = getQueueElement(nextQueueIndex - 1);\n\n // _appendBatch(\n // Lib_MerkleTree.getMerkleRoot(leaves),\n // _numQueuedTransactions,\n // _numQueuedTransactions,\n // lastElement.timestamp,\n // lastElement.blockNumber\n // );\n\n // emit QueueBatchAppended(\n // nextQueueIndex - _numQueuedTransactions,\n // _numQueuedTransactions,\n // getTotalElements()\n // );\n }\n\n /**\n * Allows the sequencer to append a batch of transactions.\n * @dev This function uses a custom encoding scheme for efficiency reasons.\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\n * .param _contexts Array of batch contexts.\n * .param _transactionDataFields Array of raw transaction data.\n */\n function appendSequencerBatch()\n override\n public\n {\n uint40 shouldStartAtElement;\n uint24 totalElementsToAppend;\n uint24 numContexts;\n assembly {\n shouldStartAtElement := shr(216, calldataload(4))\n totalElementsToAppend := shr(232, calldataload(9))\n numContexts := shr(232, calldataload(12))\n }\n\n require(\n shouldStartAtElement == getTotalElements(),\n \"Actual batch start index does not match expected start index.\"\n );\n\n require(\n msg.sender == resolve(\"OVM_Sequencer\"),\n \"Function can only be called by the Sequencer.\"\n );\n\n require(\n numContexts > 0,\n \"Must provide at least one batch context.\"\n );\n\n require(\n totalElementsToAppend > 0,\n \"Must append at least one element.\"\n );\n\n uint40 nextTransactionPtr = uint40(BATCH_CONTEXT_START_POS + BATCH_CONTEXT_SIZE * numContexts);\n\n require(\n msg.data.length >= nextTransactionPtr,\n \"Not enough BatchContexts provided.\"\n );\n\n // Take a reference to the queue and its length so we don't have to keep resolving it.\n // Length isn't going to change during the course of execution, so it's fine to simply\n // resolve this once at the start. Saves gas.\n iOVM_ChainStorageContainer queueRef = queue();\n uint40 queueLength = _getQueueLength(queueRef);\n\n // Reserve some memory to save gas on hashing later on. This is a relatively safe estimate\n // for the average transaction size that will prevent having to resize this chunk of memory\n // later on. Saves gas.\n bytes memory hashMemory = new bytes((msg.data.length / totalElementsToAppend) * 2);\n\n // Initialize the array of canonical chain leaves that we will append.\n bytes32[] memory leaves = new bytes32[](totalElementsToAppend);\n\n // Each leaf index corresponds to a tx, either sequenced or enqueued.\n uint32 leafIndex = 0;\n\n // Counter for number of sequencer transactions appended so far.\n uint32 numSequencerTransactions = 0;\n\n // We will sequentially append leaves which are pointers to the queue.\n // The initial queue index is what is currently in storage.\n uint40 nextQueueIndex = getNextQueueIndex();\n\n BatchContext memory curContext;\n for (uint32 i = 0; i < numContexts; i++) {\n BatchContext memory nextContext = _getBatchContext(i);\n\n if (i == 0) {\n // Execute a special check for the first batch.\n _validateFirstBatchContext(nextContext);\n }\n\n // Execute this check on every single batch, including the first one.\n _validateNextBatchContext(\n curContext,\n nextContext,\n nextQueueIndex,\n queueRef\n );\n\n // Now we can update our current context.\n curContext = nextContext;\n\n // Process sequencer transactions first.\n for (uint32 j = 0; j < curContext.numSequencedTransactions; j++) {\n uint256 txDataLength;\n assembly {\n txDataLength := shr(232, calldataload(nextTransactionPtr))\n }\n require(\n txDataLength <= MAX_ROLLUP_TX_SIZE,\n \"Transaction data size exceeds maximum for rollup transaction.\"\n );\n\n leaves[leafIndex] = _getSequencerLeafHash(\n curContext,\n nextTransactionPtr,\n txDataLength,\n hashMemory\n );\n\n nextTransactionPtr += uint40(TX_DATA_HEADER_SIZE + txDataLength);\n numSequencerTransactions++;\n leafIndex++;\n }\n\n // Now process any subsequent queue transactions.\n for (uint32 j = 0; j < curContext.numSubsequentQueueTransactions; j++) {\n require(\n nextQueueIndex < queueLength,\n \"Not enough queued transactions to append.\"\n );\n\n leaves[leafIndex] = _getQueueLeafHash(nextQueueIndex);\n nextQueueIndex++;\n leafIndex++;\n }\n }\n\n _validateFinalBatchContext(\n curContext,\n nextQueueIndex,\n queueLength,\n queueRef\n );\n\n require(\n msg.data.length == nextTransactionPtr,\n \"Not all sequencer transactions were processed.\"\n );\n\n require(\n leafIndex == totalElementsToAppend,\n \"Actual transaction index does not match expected total elements to append.\"\n );\n\n // Generate the required metadata that we need to append this batch\n uint40 numQueuedTransactions = totalElementsToAppend - numSequencerTransactions;\n uint40 blockTimestamp;\n uint40 blockNumber;\n if (curContext.numSubsequentQueueTransactions == 0) {\n // The last element is a sequencer tx, therefore pull timestamp and block number from the last context.\n blockTimestamp = uint40(curContext.timestamp);\n blockNumber = uint40(curContext.blockNumber);\n } else {\n // The last element is a queue tx, therefore pull timestamp and block number from the queue element.\n // curContext.numSubsequentQueueTransactions > 0 which means that we've processed at least one queue element.\n // We increment nextQueueIndex after processing each queue element,\n // so the index of the last element we processed is nextQueueIndex - 1.\n Lib_OVMCodec.QueueElement memory lastElement = _getQueueElement(\n nextQueueIndex - 1,\n queueRef\n );\n\n blockTimestamp = lastElement.timestamp;\n blockNumber = lastElement.blockNumber;\n }\n\n // For efficiency reasons getMerkleRoot modifies the `leaves` argument in place\n // while calculating the root hash therefore any arguments passed to it must not\n // be used again afterwards\n _appendBatch(\n Lib_MerkleTree.getMerkleRoot(leaves),\n totalElementsToAppend,\n numQueuedTransactions,\n blockTimestamp,\n blockNumber\n );\n\n emit SequencerBatchAppended(\n nextQueueIndex - numQueuedTransactions,\n numQueuedTransactions,\n getTotalElements()\n );\n }\n\n /**\n * Verifies whether a transaction is included in the chain.\n * @param _transaction Transaction to verify.\n * @param _txChainElement Transaction chain element corresponding to the transaction.\n * @param _batchHeader Header of the batch the transaction was included in.\n * @param _inclusionProof Inclusion proof for the provided transaction chain element.\n * @return True if the transaction exists in the CTC, false if not.\n */\n function verifyTransaction(\n Lib_OVMCodec.Transaction memory _transaction,\n Lib_OVMCodec.TransactionChainElement memory _txChainElement,\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _inclusionProof\n )\n override\n public\n view\n returns (\n bool\n )\n {\n if (_txChainElement.isSequenced == true) {\n return _verifySequencerTransaction(\n _transaction,\n _txChainElement,\n _batchHeader,\n _inclusionProof\n );\n } else {\n return _verifyQueueTransaction(\n _transaction,\n _txChainElement.queueIndex,\n _batchHeader,\n _inclusionProof\n );\n }\n }\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Returns the BatchContext located at a particular index.\n * @param _index The index of the BatchContext\n * @return The BatchContext at the specified index.\n */\n function _getBatchContext(\n uint256 _index\n )\n internal\n pure\n returns (\n BatchContext memory\n )\n {\n uint256 contextPtr = 15 + _index * BATCH_CONTEXT_SIZE;\n uint256 numSequencedTransactions;\n uint256 numSubsequentQueueTransactions;\n uint256 ctxTimestamp;\n uint256 ctxBlockNumber;\n\n assembly {\n numSequencedTransactions := shr(232, calldataload(contextPtr))\n numSubsequentQueueTransactions := shr(232, calldataload(add(contextPtr, 3)))\n ctxTimestamp := shr(216, calldataload(add(contextPtr, 6)))\n ctxBlockNumber := shr(216, calldataload(add(contextPtr, 11)))\n }\n\n return BatchContext({\n numSequencedTransactions: numSequencedTransactions,\n numSubsequentQueueTransactions: numSubsequentQueueTransactions,\n timestamp: ctxTimestamp,\n blockNumber: ctxBlockNumber\n });\n }\n\n /**\n * Parses the batch context from the extra data.\n * @return Total number of elements submitted.\n * @return Index of the next queue element.\n */\n function _getBatchExtraData()\n internal\n view\n returns (\n uint40,\n uint40,\n uint40,\n uint40\n )\n {\n bytes27 extraData = batches().getGlobalMetadata();\n\n uint40 totalElements;\n uint40 nextQueueIndex;\n uint40 lastTimestamp;\n uint40 lastBlockNumber;\n assembly {\n extraData := shr(40, extraData)\n totalElements := and(extraData, 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF)\n nextQueueIndex := shr(40, and(extraData, 0x00000000000000000000000000000000000000000000FFFFFFFFFF0000000000))\n lastTimestamp := shr(80, and(extraData, 0x0000000000000000000000000000000000FFFFFFFFFF00000000000000000000))\n lastBlockNumber := shr(120, and(extraData, 0x000000000000000000000000FFFFFFFFFF000000000000000000000000000000))\n }\n\n return (\n totalElements,\n nextQueueIndex,\n lastTimestamp,\n lastBlockNumber\n );\n }\n\n /**\n * Encodes the batch context for the extra data.\n * @param _totalElements Total number of elements submitted.\n * @param _nextQueueIndex Index of the next queue element.\n * @param _timestamp Timestamp for the last batch.\n * @param _blockNumber Block number of the last batch.\n * @return Encoded batch context.\n */\n function _makeBatchExtraData(\n uint40 _totalElements,\n uint40 _nextQueueIndex,\n uint40 _timestamp,\n uint40 _blockNumber\n )\n internal\n pure\n returns (\n bytes27\n )\n {\n bytes27 extraData;\n assembly {\n extraData := _totalElements\n extraData := or(extraData, shl(40, _nextQueueIndex))\n extraData := or(extraData, shl(80, _timestamp))\n extraData := or(extraData, shl(120, _blockNumber))\n extraData := shl(40, extraData)\n }\n\n return extraData;\n }\n\n /**\n * Retrieves the hash of a queue element.\n * @param _index Index of the queue element to retrieve a hash for.\n * @return Hash of the queue element.\n */\n function _getQueueLeafHash(\n uint256 _index\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n return _hashTransactionChainElement(\n Lib_OVMCodec.TransactionChainElement({\n isSequenced: false,\n queueIndex: _index,\n timestamp: 0,\n blockNumber: 0,\n txData: hex\"\"\n })\n );\n }\n\n /**\n * Gets the queue element at a particular index.\n * @param _index Index of the queue element to access.\n * @return _element Queue element at the given index.\n */\n function _getQueueElement(\n uint256 _index,\n iOVM_ChainStorageContainer _queueRef\n )\n internal\n view\n returns (\n Lib_OVMCodec.QueueElement memory _element\n )\n {\n // The underlying queue data structure stores 2 elements\n // per insertion, so to get the actual desired queue index\n // we need to multiply by 2.\n uint40 trueIndex = uint40(_index * 2);\n bytes32 transactionHash = _queueRef.get(trueIndex);\n bytes32 timestampAndBlockNumber = _queueRef.get(trueIndex + 1);\n\n uint40 elementTimestamp;\n uint40 elementBlockNumber;\n assembly {\n elementTimestamp := and(timestampAndBlockNumber, 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF)\n elementBlockNumber := shr(40, and(timestampAndBlockNumber, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000))\n }\n\n return Lib_OVMCodec.QueueElement({\n transactionHash: transactionHash,\n timestamp: elementTimestamp,\n blockNumber: elementBlockNumber\n });\n }\n\n /**\n * Retrieves the length of the queue.\n * @return Length of the queue.\n */\n function _getQueueLength(\n iOVM_ChainStorageContainer _queueRef\n )\n internal\n view\n returns (\n uint40\n )\n {\n // The underlying queue data structure stores 2 elements\n // per insertion, so to get the real queue length we need\n // to divide by 2.\n return uint40(_queueRef.length() / 2);\n }\n\n /**\n * Retrieves the hash of a sequencer element.\n * @param _context Batch context for the given element.\n * @param _nextTransactionPtr Pointer to the next transaction in the calldata.\n * @param _txDataLength Length of the transaction item.\n * @return Hash of the sequencer element.\n */\n function _getSequencerLeafHash(\n BatchContext memory _context,\n uint256 _nextTransactionPtr,\n uint256 _txDataLength,\n bytes memory _hashMemory\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n // Only allocate more memory if we didn't reserve enough to begin with.\n if (BYTES_TILL_TX_DATA + _txDataLength > _hashMemory.length) {\n _hashMemory = new bytes(BYTES_TILL_TX_DATA + _txDataLength);\n }\n\n uint256 ctxTimestamp = _context.timestamp;\n uint256 ctxBlockNumber = _context.blockNumber;\n\n bytes32 leafHash;\n assembly {\n let chainElementStart := add(_hashMemory, 0x20)\n\n // Set the first byte equal to `1` to indicate this is a sequencer chain element.\n // This distinguishes sequencer ChainElements from queue ChainElements because\n // all queue ChainElements are ABI encoded and the first byte of ABI encoded\n // elements is always zero\n mstore8(chainElementStart, 1)\n\n mstore(add(chainElementStart, 1), ctxTimestamp)\n mstore(add(chainElementStart, 33), ctxBlockNumber)\n\n calldatacopy(add(chainElementStart, BYTES_TILL_TX_DATA), add(_nextTransactionPtr, 3), _txDataLength)\n\n leafHash := keccak256(chainElementStart, add(BYTES_TILL_TX_DATA, _txDataLength))\n }\n\n return leafHash;\n }\n\n /**\n * Retrieves the hash of a sequencer element.\n * @param _txChainElement The chain element which is hashed to calculate the leaf.\n * @return Hash of the sequencer element.\n */\n function _getSequencerLeafHash(\n Lib_OVMCodec.TransactionChainElement memory _txChainElement\n )\n internal\n view\n returns(\n bytes32\n )\n {\n bytes memory txData = _txChainElement.txData;\n uint256 txDataLength = _txChainElement.txData.length;\n\n bytes memory chainElement = new bytes(BYTES_TILL_TX_DATA + txDataLength);\n uint256 ctxTimestamp = _txChainElement.timestamp;\n uint256 ctxBlockNumber = _txChainElement.blockNumber;\n\n bytes32 leafHash;\n assembly {\n let chainElementStart := add(chainElement, 0x20)\n\n // Set the first byte equal to `1` to indicate this is a sequencer chain element.\n // This distinguishes sequencer ChainElements from queue ChainElements because\n // all queue ChainElements are ABI encoded and the first byte of ABI encoded\n // elements is always zero\n mstore8(chainElementStart, 1)\n\n mstore(add(chainElementStart, 1), ctxTimestamp)\n mstore(add(chainElementStart, 33), ctxBlockNumber)\n\n pop(staticcall(gas(), 0x04, add(txData, 0x20), txDataLength, add(chainElementStart, BYTES_TILL_TX_DATA), txDataLength))\n\n leafHash := keccak256(chainElementStart, add(BYTES_TILL_TX_DATA, txDataLength))\n }\n\n return leafHash;\n }\n\n /**\n * Inserts a batch into the chain of batches.\n * @param _transactionRoot Root of the transaction tree for this batch.\n * @param _batchSize Number of elements in the batch.\n * @param _numQueuedTransactions Number of queue transactions in the batch.\n * @param _timestamp The latest batch timestamp.\n * @param _blockNumber The latest batch blockNumber.\n */\n function _appendBatch(\n bytes32 _transactionRoot,\n uint256 _batchSize,\n uint256 _numQueuedTransactions,\n uint40 _timestamp,\n uint40 _blockNumber\n )\n internal\n {\n iOVM_ChainStorageContainer batchesRef = batches();\n (uint40 totalElements, uint40 nextQueueIndex,,) = _getBatchExtraData();\n\n Lib_OVMCodec.ChainBatchHeader memory header = Lib_OVMCodec.ChainBatchHeader({\n batchIndex: batchesRef.length(),\n batchRoot: _transactionRoot,\n batchSize: _batchSize,\n prevTotalElements: totalElements,\n extraData: hex\"\"\n });\n\n emit TransactionBatchAppended(\n header.batchIndex,\n header.batchRoot,\n header.batchSize,\n header.prevTotalElements,\n header.extraData\n );\n\n bytes32 batchHeaderHash = Lib_OVMCodec.hashBatchHeader(header);\n bytes27 latestBatchContext = _makeBatchExtraData(\n totalElements + uint40(header.batchSize),\n nextQueueIndex + uint40(_numQueuedTransactions),\n _timestamp,\n _blockNumber\n );\n\n batchesRef.push(batchHeaderHash, latestBatchContext);\n }\n\n /**\n * Checks that the first batch context in a sequencer submission is valid\n * @param _firstContext The batch context to validate.\n */\n function _validateFirstBatchContext(\n BatchContext memory _firstContext\n )\n internal\n view\n {\n // If there are existing elements, this batch must have the same context\n // or a later timestamp and block number.\n if (getTotalElements() > 0) {\n (,, uint40 lastTimestamp, uint40 lastBlockNumber) = _getBatchExtraData();\n\n require(\n _firstContext.blockNumber >= lastBlockNumber,\n \"Context block number is lower than last submitted.\"\n );\n\n require(\n _firstContext.timestamp >= lastTimestamp,\n \"Context timestamp is lower than last submitted.\"\n );\n }\n\n // Sequencer cannot submit contexts which are more than the force inclusion period old.\n require(\n _firstContext.timestamp + forceInclusionPeriodSeconds >= block.timestamp,\n \"Context timestamp too far in the past.\"\n );\n\n require(\n _firstContext.blockNumber + forceInclusionPeriodBlocks >= block.number,\n \"Context block number too far in the past.\"\n );\n }\n\n /**\n * Checks that a given batch context has a time context which is below a given que element\n * @param _context The batch context to validate has values lower.\n * @param _queueIndex Index of the queue element we are validating came later than the context.\n * @param _queueRef The storage container for the queue.\n */\n function _validateContextBeforeEnqueue(\n BatchContext memory _context,\n uint40 _queueIndex,\n iOVM_ChainStorageContainer _queueRef\n )\n internal\n view\n {\n Lib_OVMCodec.QueueElement memory nextQueueElement = _getQueueElement(\n _queueIndex,\n _queueRef\n );\n\n // If the force inclusion period has passed for an enqueued transaction, it MUST be the next chain element.\n require(\n block.timestamp < nextQueueElement.timestamp + forceInclusionPeriodSeconds,\n \"Previously enqueued batches have expired and must be appended before a new sequencer batch.\"\n );\n\n // Just like sequencer transaction times must be increasing relative to each other,\n // We also require that they be increasing relative to any interspersed queue elements.\n require(\n _context.timestamp <= nextQueueElement.timestamp,\n \"Sequencer transaction timestamp exceeds that of next queue element.\"\n );\n\n require(\n _context.blockNumber <= nextQueueElement.blockNumber,\n \"Sequencer transaction blockNumber exceeds that of next queue element.\"\n );\n }\n\n /**\n * Checks that a given batch context is valid based on its previous context, and the next queue elemtent.\n * @param _prevContext The previously validated batch context.\n * @param _nextContext The batch context to validate with this call.\n * @param _nextQueueIndex Index of the next queue element to process for the _nextContext's subsequentQueueElements.\n * @param _queueRef The storage container for the queue.\n */\n function _validateNextBatchContext(\n BatchContext memory _prevContext,\n BatchContext memory _nextContext,\n uint40 _nextQueueIndex,\n iOVM_ChainStorageContainer _queueRef\n )\n internal\n view\n {\n // All sequencer transactions' times must be greater than or equal to the previous ones.\n require(\n _nextContext.timestamp >= _prevContext.timestamp,\n \"Context timestamp values must monotonically increase.\"\n );\n\n require(\n _nextContext.blockNumber >= _prevContext.blockNumber,\n \"Context blockNumber values must monotonically increase.\"\n );\n\n // If there is going to be a queue element pulled in from this context:\n if (_nextContext.numSubsequentQueueTransactions > 0) {\n _validateContextBeforeEnqueue(\n _nextContext,\n _nextQueueIndex,\n _queueRef\n );\n }\n }\n\n /**\n * Checks that the final batch context in a sequencer submission is valid.\n * @param _finalContext The batch context to validate.\n * @param _queueLength The length of the queue at the start of the batchAppend call.\n * @param _nextQueueIndex The next element in the queue that will be pulled into the CTC.\n * @param _queueRef The storage container for the queue.\n */\n function _validateFinalBatchContext(\n BatchContext memory _finalContext,\n uint40 _nextQueueIndex,\n uint40 _queueLength,\n iOVM_ChainStorageContainer _queueRef\n )\n internal\n view\n {\n // If the queue is not now empty, check the mononoticity of whatever the next batch that will come in is.\n if (_queueLength - _nextQueueIndex > 0 && _finalContext.numSubsequentQueueTransactions == 0) {\n _validateContextBeforeEnqueue(\n _finalContext,\n _nextQueueIndex,\n _queueRef\n );\n }\n // Batches cannot be added from the future, or subsequent enqueue() contexts would violate monotonicity.\n require(_finalContext.timestamp <= block.timestamp, \"Context timestamp is from the future.\");\n require(_finalContext.blockNumber <= block.number, \"Context block number is from the future.\");\n }\n\n /**\n * Hashes a transaction chain element.\n * @param _element Chain element to hash.\n * @return Hash of the chain element.\n */\n function _hashTransactionChainElement(\n Lib_OVMCodec.TransactionChainElement memory _element\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n return keccak256(\n abi.encode(\n _element.isSequenced,\n _element.queueIndex,\n _element.timestamp,\n _element.blockNumber,\n _element.txData\n )\n );\n }\n\n /**\n * Verifies a sequencer transaction, returning true if it was indeed included in the CTC\n * @param _transaction The transaction we are verifying inclusion of.\n * @param _txChainElement The chain element that the transaction is claimed to be a part of.\n * @param _batchHeader Header of the batch the transaction was included in.\n * @param _inclusionProof An inclusion proof into the CTC at a particular index.\n * @return True if the transaction was included in the specified location, else false.\n */\n function _verifySequencerTransaction(\n Lib_OVMCodec.Transaction memory _transaction,\n Lib_OVMCodec.TransactionChainElement memory _txChainElement,\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _inclusionProof\n )\n internal\n view\n returns (\n bool\n )\n {\n OVM_ExecutionManager ovmExecutionManager = OVM_ExecutionManager(resolve(\"OVM_ExecutionManager\"));\n uint256 gasLimit = ovmExecutionManager.getMaxTransactionGasLimit();\n bytes32 leafHash = _getSequencerLeafHash(_txChainElement);\n\n require(\n _verifyElement(\n leafHash,\n _batchHeader,\n _inclusionProof\n ),\n \"Invalid Sequencer transaction inclusion proof.\"\n );\n\n require(\n _transaction.blockNumber == _txChainElement.blockNumber\n && _transaction.timestamp == _txChainElement.timestamp\n && _transaction.entrypoint == resolve(\"OVM_DecompressionPrecompileAddress\")\n && _transaction.gasLimit == gasLimit\n && _transaction.l1TxOrigin == address(0)\n && _transaction.l1QueueOrigin == Lib_OVMCodec.QueueOrigin.SEQUENCER_QUEUE\n && keccak256(_transaction.data) == keccak256(_txChainElement.txData),\n \"Invalid Sequencer transaction.\"\n );\n\n return true;\n }\n\n /**\n * Verifies a queue transaction, returning true if it was indeed included in the CTC\n * @param _transaction The transaction we are verifying inclusion of.\n * @param _queueIndex The queueIndex of the queued transaction.\n * @param _batchHeader Header of the batch the transaction was included in.\n * @param _inclusionProof An inclusion proof into the CTC at a particular index (should point to queue tx).\n * @return True if the transaction was included in the specified location, else false.\n */\n function _verifyQueueTransaction(\n Lib_OVMCodec.Transaction memory _transaction,\n uint256 _queueIndex,\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _inclusionProof\n )\n internal\n view\n returns (\n bool\n )\n {\n bytes32 leafHash = _getQueueLeafHash(_queueIndex);\n\n require(\n _verifyElement(\n leafHash,\n _batchHeader,\n _inclusionProof\n ),\n \"Invalid Queue transaction inclusion proof.\"\n );\n\n bytes32 transactionHash = keccak256(\n abi.encode(\n _transaction.l1TxOrigin,\n _transaction.entrypoint,\n _transaction.gasLimit,\n _transaction.data\n )\n );\n\n Lib_OVMCodec.QueueElement memory el = getQueueElement(_queueIndex);\n require(\n el.transactionHash == transactionHash\n && el.timestamp == _transaction.timestamp\n && el.blockNumber == _transaction.blockNumber,\n \"Invalid Queue transaction.\"\n );\n\n return true;\n }\n\n /**\n * Verifies a batch inclusion proof.\n * @param _element Hash of the element to verify a proof for.\n * @param _batchHeader Header of the batch in which the element was included.\n * @param _proof Merkle inclusion proof for the element.\n */\n function _verifyElement(\n bytes32 _element,\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _proof\n )\n internal\n view\n returns (\n bool\n )\n {\n require(\n Lib_OVMCodec.hashBatchHeader(_batchHeader) == batches().get(uint32(_batchHeader.batchIndex)),\n \"Invalid batch header.\"\n );\n\n require(\n Lib_MerkleTree.verify(\n _batchHeader.batchRoot,\n _element,\n _proof.index,\n _proof.siblings,\n _batchHeader.batchSize\n ),\n \"Invalid inclusion proof.\"\n );\n\n return true;\n }\n}\n" - }, - "contracts/optimistic-ethereum/libraries/utils/Lib_Math.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/**\n * @title Lib_Math\n */\nlibrary Lib_Math {\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Calculates the minumum of two numbers.\n * @param _x First number to compare.\n * @param _y Second number to compare.\n * @return Lesser of the two numbers.\n */\n function min(\n uint256 _x,\n uint256 _y\n )\n internal\n pure\n returns (\n uint256\n )\n {\n if (_x < _y) {\n return _x;\n }\n\n return _y;\n }\n}\n" - }, - "contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1CrossDomainMessenger.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_AddressResolver } from \"../../../libraries/resolver/Lib_AddressResolver.sol\";\nimport { Lib_AddressManager } from \"../../../libraries/resolver/Lib_AddressManager.sol\";\nimport { Lib_SecureMerkleTrie } from \"../../../libraries/trie/Lib_SecureMerkleTrie.sol\";\nimport { Lib_ReentrancyGuard } from \"../../../libraries/utils/Lib_ReentrancyGuard.sol\";\n\n/* Interface Imports */\nimport { iOVM_L1CrossDomainMessenger } from \"../../../iOVM/bridge/messaging/iOVM_L1CrossDomainMessenger.sol\";\nimport { iOVM_CanonicalTransactionChain } from \"../../../iOVM/chain/iOVM_CanonicalTransactionChain.sol\";\nimport { iOVM_StateCommitmentChain } from \"../../../iOVM/chain/iOVM_StateCommitmentChain.sol\";\n\n/* Contract Imports */\nimport { Abs_BaseCrossDomainMessenger } from \"./Abs_BaseCrossDomainMessenger.sol\";\n\n/**\n * @title OVM_L1CrossDomainMessenger\n * @dev The L1 Cross Domain Messenger contract sends messages from L1 to L2, and relays messages from L2 onto L1.\n * In the event that a message sent from L1 to L2 is rejected for exceeding the L2 epoch gas limit, it can be resubmitted\n * via this contract's replay function.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract OVM_L1CrossDomainMessenger is iOVM_L1CrossDomainMessenger, Abs_BaseCrossDomainMessenger, Lib_AddressResolver {\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * Pass a default zero address to the address resolver. This will be updated when initialized.\n */\n constructor()\n Lib_AddressResolver(address(0))\n {}\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n function initialize(\n address _libAddressManager\n )\n public\n {\n require(address(libAddressManager) == address(0), \"L1CrossDomainMessenger already intialized.\");\n libAddressManager = Lib_AddressManager(_libAddressManager);\n xDomainMsgSender = DEFAULT_XDOMAIN_SENDER;\n }\n\n\n /**********************\n * Function Modifiers *\n **********************/\n\n /**\n * Modifier to enforce that, if configured, only the OVM_L2MessageRelayer contract may successfully call a method.\n */\n modifier onlyRelayer() {\n address relayer = resolve(\"OVM_L2MessageRelayer\");\n if (relayer != address(0)) {\n require(\n msg.sender == relayer,\n \"Only OVM_L2MessageRelayer can relay L2-to-L1 messages.\"\n );\n }\n _;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Relays a cross domain message to a contract.\n * @inheritdoc iOVM_L1CrossDomainMessenger\n */\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce,\n L2MessageInclusionProof memory _proof\n )\n override\n public\n nonReentrant\n onlyRelayer()\n {\n bytes memory xDomainCalldata = _getXDomainCalldata(\n _target,\n _sender,\n _message,\n _messageNonce\n );\n\n require(\n _verifyXDomainMessage(\n xDomainCalldata,\n _proof\n ) == true,\n \"Provided message could not be verified.\"\n );\n\n bytes32 xDomainCalldataHash = keccak256(xDomainCalldata);\n\n require(\n successfulMessages[xDomainCalldataHash] == false,\n \"Provided message has already been received.\"\n );\n\n xDomainMsgSender = _sender;\n (bool success, ) = _target.call(_message);\n xDomainMsgSender = DEFAULT_XDOMAIN_SENDER;\n\n // Mark the message as received if the call was successful. Ensures that a message can be\n // relayed multiple times in the case that the call reverted.\n if (success == true) {\n successfulMessages[xDomainCalldataHash] = true;\n emit RelayedMessage(xDomainCalldataHash);\n }\n\n // Store an identifier that can be used to prove that the given message was relayed by some\n // user. Gives us an easy way to pay relayers for their work.\n bytes32 relayId = keccak256(\n abi.encodePacked(\n xDomainCalldata,\n msg.sender,\n block.number\n )\n );\n relayedMessages[relayId] = true;\n }\n\n /**\n * Replays a cross domain message to the target messenger.\n * @inheritdoc iOVM_L1CrossDomainMessenger\n */\n function replayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce,\n uint32 _gasLimit\n )\n override\n public\n {\n bytes memory xDomainCalldata = _getXDomainCalldata(\n _target,\n _sender,\n _message,\n _messageNonce\n );\n\n require(\n sentMessages[keccak256(xDomainCalldata)] == true,\n \"Provided message has not already been sent.\"\n );\n\n _sendXDomainMessage(xDomainCalldata, _gasLimit);\n }\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Verifies that the given message is valid.\n * @param _xDomainCalldata Calldata to verify.\n * @param _proof Inclusion proof for the message.\n * @return Whether or not the provided message is valid.\n */\n function _verifyXDomainMessage(\n bytes memory _xDomainCalldata,\n L2MessageInclusionProof memory _proof\n )\n internal\n view\n returns (\n bool\n )\n {\n return (\n _verifyStateRootProof(_proof)\n && _verifyStorageProof(_xDomainCalldata, _proof)\n );\n }\n\n /**\n * Verifies that the state root within an inclusion proof is valid.\n * @param _proof Message inclusion proof.\n * @return Whether or not the provided proof is valid.\n */\n function _verifyStateRootProof(\n L2MessageInclusionProof memory _proof\n )\n internal\n view\n returns (\n bool\n )\n {\n iOVM_StateCommitmentChain ovmStateCommitmentChain = iOVM_StateCommitmentChain(resolve(\"OVM_StateCommitmentChain\"));\n\n return (\n ovmStateCommitmentChain.insideFraudProofWindow(_proof.stateRootBatchHeader) == false\n && ovmStateCommitmentChain.verifyStateCommitment(\n _proof.stateRoot,\n _proof.stateRootBatchHeader,\n _proof.stateRootProof\n )\n );\n }\n\n /**\n * Verifies that the storage proof within an inclusion proof is valid.\n * @param _xDomainCalldata Encoded message calldata.\n * @param _proof Message inclusion proof.\n * @return Whether or not the provided proof is valid.\n */\n function _verifyStorageProof(\n bytes memory _xDomainCalldata,\n L2MessageInclusionProof memory _proof\n )\n internal\n view\n returns (\n bool\n )\n {\n bytes32 storageKey = keccak256(\n abi.encodePacked(\n keccak256(\n abi.encodePacked(\n _xDomainCalldata,\n resolve(\"OVM_L2CrossDomainMessenger\")\n )\n ),\n uint256(0)\n )\n );\n\n (\n bool exists,\n bytes memory encodedMessagePassingAccount\n ) = Lib_SecureMerkleTrie.get(\n abi.encodePacked(0x4200000000000000000000000000000000000000),\n _proof.stateTrieWitness,\n _proof.stateRoot\n );\n\n require(\n exists == true,\n \"Message passing predeploy has not been initialized or invalid proof provided.\"\n );\n\n Lib_OVMCodec.EVMAccount memory account = Lib_OVMCodec.decodeEVMAccount(\n encodedMessagePassingAccount\n );\n\n return Lib_SecureMerkleTrie.verifyInclusionProof(\n abi.encodePacked(storageKey),\n abi.encodePacked(uint8(1)),\n _proof.storageTrieWitness,\n account.storageRoot\n );\n }\n\n /**\n * Sends a cross domain message.\n * @param _message Message to send.\n * @param _gasLimit OVM gas limit for the message.\n */\n function _sendXDomainMessage(\n bytes memory _message,\n uint256 _gasLimit\n )\n override\n internal\n {\n iOVM_CanonicalTransactionChain(resolve(\"OVM_CanonicalTransactionChain\")).enqueue(\n resolve(\"OVM_L2CrossDomainMessenger\"),\n _gasLimit,\n _message\n );\n }\n}\n" - }, - "contracts/optimistic-ethereum/libraries/utils/Lib_ReentrancyGuard.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/**\n * @dev Contract module that helps prevent reentrant calls to a function.\n *\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\n * available, which can be applied to functions to make sure there are no nested\n * (reentrant) calls to them.\n *\n * Note that because there is a single `nonReentrant` guard, functions marked as\n * `nonReentrant` may not call one another. This can be worked around by making\n * those functions `private`, and then adding `external` `nonReentrant` entry\n * points to them.\n *\n * TIP: If you would like to learn more about reentrancy and alternative ways\n * to protect against it, check out our blog post\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\n */\nabstract contract Lib_ReentrancyGuard {\n // Booleans are more expensive than uint256 or any type that takes up a full\n // word because each write operation emits an extra SLOAD to first read the\n // slot's contents, replace the bits taken up by the boolean, and then write\n // back. This is the compiler's defense against contract upgrades and\n // pointer aliasing, and it cannot be disabled.\n\n // The values being non-zero value makes deployment a bit more expensive,\n // but in exchange the refund on every call to nonReentrant will be lower in\n // amount. Since refunds are capped to a percentage of the total\n // transaction's gas, it is best to keep them low in cases like this one, to\n // increase the likelihood of the full refund coming into effect.\n uint256 private constant _NOT_ENTERED = 1;\n uint256 private constant _ENTERED = 2;\n\n uint256 private _status;\n\n constructor () {\n _status = _NOT_ENTERED;\n }\n\n /**\n * @dev Prevents a contract from calling itself, directly or indirectly.\n * Calling a `nonReentrant` function from another `nonReentrant`\n * function is not supported. It is possible to prevent this from happening\n * by making the `nonReentrant` function external, and make it call a\n * `private` function that does the actual work.\n */\n modifier nonReentrant() {\n // On the first call to nonReentrant, _notEntered will be true\n require(_status != _ENTERED, \"ReentrancyGuard: reentrant call\");\n\n // Any calls to nonReentrant after this point will fail\n _status = _ENTERED;\n\n _;\n\n // By storing the original value once again, a refund is triggered (see\n // https://eips.ethereum.org/EIPS/eip-2200)\n _status = _NOT_ENTERED;\n }\n}\n" - }, - "contracts/optimistic-ethereum/iOVM/bridge/messaging/iOVM_L1CrossDomainMessenger.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../../libraries/codec/Lib_OVMCodec.sol\";\n\n/* Interface Imports */\nimport { iAbs_BaseCrossDomainMessenger } from \"./iAbs_BaseCrossDomainMessenger.sol\";\n\n/**\n * @title iOVM_L1CrossDomainMessenger\n */\ninterface iOVM_L1CrossDomainMessenger is iAbs_BaseCrossDomainMessenger {\n\n /*******************\n * Data Structures *\n *******************/\n\n struct L2MessageInclusionProof {\n bytes32 stateRoot;\n Lib_OVMCodec.ChainBatchHeader stateRootBatchHeader;\n Lib_OVMCodec.ChainInclusionProof stateRootProof;\n bytes stateTrieWitness;\n bytes storageTrieWitness;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Relays a cross domain message to a contract.\n * @param _target Target contract address.\n * @param _sender Message sender address.\n * @param _message Message to send to the target.\n * @param _messageNonce Nonce for the provided message.\n * @param _proof Inclusion proof for the given message.\n */\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce,\n L2MessageInclusionProof memory _proof\n ) external;\n\n /**\n * Replays a cross domain message to the target messenger.\n * @param _target Target contract address.\n * @param _sender Original sender address.\n * @param _message Message to send to the target.\n * @param _messageNonce Nonce for the provided message.\n * @param _gasLimit Gas limit for the provided message.\n */\n function replayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce,\n uint32 _gasLimit\n ) external;\n}\n" - }, - "contracts/optimistic-ethereum/OVM/bridge/messaging/Abs_BaseCrossDomainMessenger.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Interface Imports */\nimport { iAbs_BaseCrossDomainMessenger } from \"../../../iOVM/bridge/messaging/iAbs_BaseCrossDomainMessenger.sol\";\n\n/* Library Imports */\nimport { Lib_ReentrancyGuard } from \"../../../libraries/utils/Lib_ReentrancyGuard.sol\";\n\n/**\n * @title Abs_BaseCrossDomainMessenger\n * @dev The Base Cross Domain Messenger is an abstract contract providing the interface and common functionality used in the\n * L1 and L2 Cross Domain Messengers. It can also serve as a template for developers wishing to implement a custom bridge \n * contract to suit their needs.\n *\n * Compiler used: defined by child contract\n * Runtime target: defined by child contract\n */\nabstract contract Abs_BaseCrossDomainMessenger is iAbs_BaseCrossDomainMessenger, Lib_ReentrancyGuard {\n /**************\n * Constants *\n **************/\n\n // The default x-domain message sender being set to a non-zero value makes\n // deployment a bit more expensive, but in exchange the refund on every call to\n // `relayMessage` by the L1 and L2 messengers will be higher.\n address internal constant DEFAULT_XDOMAIN_SENDER = 0x000000000000000000000000000000000000dEaD;\n\n /**********************\n * Contract Variables *\n **********************/\n\n mapping (bytes32 => bool) public relayedMessages;\n mapping (bytes32 => bool) public successfulMessages;\n mapping (bytes32 => bool) public sentMessages;\n uint256 public messageNonce;\n address internal xDomainMsgSender = DEFAULT_XDOMAIN_SENDER;\n\n /********************\n * Public Functions *\n ********************/\n\n constructor() Lib_ReentrancyGuard() {}\n\n function xDomainMessageSender() public override view returns (address) {\n require(xDomainMsgSender != DEFAULT_XDOMAIN_SENDER, \"xDomainMessageSender is not set\");\n return xDomainMsgSender;\n }\n\n /**\n * Sends a cross domain message to the target messenger.\n * @param _target Target contract address.\n * @param _message Message to send to the target.\n * @param _gasLimit Gas limit for the provided message.\n */\n function sendMessage(\n address _target,\n bytes memory _message,\n uint32 _gasLimit\n )\n override\n public\n {\n bytes memory xDomainCalldata = _getXDomainCalldata(\n _target,\n msg.sender,\n _message,\n messageNonce\n );\n\n messageNonce += 1;\n sentMessages[keccak256(xDomainCalldata)] = true;\n\n _sendXDomainMessage(xDomainCalldata, _gasLimit);\n emit SentMessage(xDomainCalldata);\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Generates the correct cross domain calldata for a message.\n * @param _target Target contract address.\n * @param _sender Message sender address.\n * @param _message Message to send to the target.\n * @param _messageNonce Nonce for the provided message.\n * @return ABI encoded cross domain calldata.\n */\n function _getXDomainCalldata(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n return abi.encodeWithSignature(\n \"relayMessage(address,address,bytes,uint256)\",\n _target,\n _sender,\n _message,\n _messageNonce\n );\n }\n\n /**\n * Sends a cross domain message.\n * param // Message to send.\n * param // Gas limit for the provided message.\n */\n function _sendXDomainMessage(\n bytes memory, // _message,\n uint256 // _gasLimit\n )\n virtual\n internal\n {\n revert(\"Implement me in child contracts!\");\n }\n}\n" - }, - "contracts/optimistic-ethereum/iOVM/bridge/messaging/iAbs_BaseCrossDomainMessenger.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/**\n * @title iAbs_BaseCrossDomainMessenger\n */\ninterface iAbs_BaseCrossDomainMessenger {\n\n /**********\n * Events *\n **********/\n event SentMessage(bytes message);\n event RelayedMessage(bytes32 msgHash);\n\n /**********************\n * Contract Variables *\n **********************/\n function xDomainMessageSender() external view returns (address);\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Sends a cross domain message to the target messenger.\n * @param _target Target contract address.\n * @param _message Message to send to the target.\n * @param _gasLimit Gas limit for the provided message.\n */\n function sendMessage(\n address _target,\n bytes calldata _message,\n uint32 _gasLimit\n ) external;\n}\n" - }, - "contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L2CrossDomainMessenger.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_AddressResolver } from \"../../../libraries/resolver/Lib_AddressResolver.sol\";\nimport { Lib_ReentrancyGuard } from \"../../../libraries/utils/Lib_ReentrancyGuard.sol\";\n\n/* Interface Imports */\nimport { iOVM_L2CrossDomainMessenger } from \"../../../iOVM/bridge/messaging/iOVM_L2CrossDomainMessenger.sol\";\nimport { iOVM_L1MessageSender } from \"../../../iOVM/predeploys/iOVM_L1MessageSender.sol\";\nimport { iOVM_L2ToL1MessagePasser } from \"../../../iOVM/predeploys/iOVM_L2ToL1MessagePasser.sol\";\n\n/* Contract Imports */\nimport { Abs_BaseCrossDomainMessenger } from \"./Abs_BaseCrossDomainMessenger.sol\";\n\n/**\n * @title OVM_L2CrossDomainMessenger\n * @dev The L2 Cross Domain Messenger contract sends messages from L2 to L1, and is the entry point\n * for L2 messages sent via the L1 Cross Domain Messenger.\n *\n * Compiler used: optimistic-solc\n * Runtime target: OVM\n */\ncontract OVM_L2CrossDomainMessenger is iOVM_L2CrossDomainMessenger, Abs_BaseCrossDomainMessenger, Lib_AddressResolver {\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n constructor(\n address _libAddressManager\n )\n Lib_AddressResolver(_libAddressManager)\n {}\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Relays a cross domain message to a contract.\n * @inheritdoc iOVM_L2CrossDomainMessenger\n */\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce\n )\n override\n nonReentrant\n public\n {\n require(\n _verifyXDomainMessage() == true,\n \"Provided message could not be verified.\"\n );\n\n bytes memory xDomainCalldata = _getXDomainCalldata(\n _target,\n _sender,\n _message,\n _messageNonce\n );\n\n bytes32 xDomainCalldataHash = keccak256(xDomainCalldata);\n\n require(\n successfulMessages[xDomainCalldataHash] == false,\n \"Provided message has already been received.\"\n );\n\n // Prevent calls to OVM_L2ToL1MessagePasser, which would enable\n // an attacker to maliciously craft the _message to spoof\n // a call from any L2 account.\n if(_target == resolve(\"OVM_L2ToL1MessagePasser\")){\n // Write to the successfulMessages mapping and return immediately.\n successfulMessages[xDomainCalldataHash] = true;\n return;\n }\n\n xDomainMsgSender = _sender;\n (bool success, ) = _target.call(_message);\n xDomainMsgSender = DEFAULT_XDOMAIN_SENDER;\n\n // Mark the message as received if the call was successful. Ensures that a message can be\n // relayed multiple times in the case that the call reverted.\n if (success == true) {\n successfulMessages[xDomainCalldataHash] = true;\n emit RelayedMessage(xDomainCalldataHash);\n }\n\n // Store an identifier that can be used to prove that the given message was relayed by some\n // user. Gives us an easy way to pay relayers for their work.\n bytes32 relayId = keccak256(\n abi.encodePacked(\n xDomainCalldata,\n msg.sender,\n block.number\n )\n );\n relayedMessages[relayId] = true;\n }\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Verifies that a received cross domain message is valid.\n * @return _valid Whether or not the message is valid.\n */\n function _verifyXDomainMessage()\n view\n internal\n returns (\n bool _valid\n )\n {\n return (\n iOVM_L1MessageSender(resolve(\"OVM_L1MessageSender\")).getL1MessageSender() == resolve(\"OVM_L1CrossDomainMessenger\")\n );\n }\n\n /**\n * Sends a cross domain message.\n * @param _message Message to send.\n * param _gasLimit Gas limit for the provided message.\n */\n function _sendXDomainMessage(\n bytes memory _message,\n uint256 // _gasLimit\n )\n override\n internal\n {\n iOVM_L2ToL1MessagePasser(resolve(\"OVM_L2ToL1MessagePasser\")).passMessageToL1(_message);\n }\n}\n" - }, - "contracts/optimistic-ethereum/iOVM/bridge/messaging/iOVM_L2CrossDomainMessenger.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Interface Imports */\nimport { iAbs_BaseCrossDomainMessenger } from \"./iAbs_BaseCrossDomainMessenger.sol\";\n\n/**\n * @title iOVM_L2CrossDomainMessenger\n */\ninterface iOVM_L2CrossDomainMessenger is iAbs_BaseCrossDomainMessenger {\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Relays a cross domain message to a contract.\n * @param _target Target contract address.\n * @param _sender Message sender address.\n * @param _message Message to send to the target.\n * @param _messageNonce Nonce for the provided message.\n */\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce\n ) external;\n}\n" - }, - "contracts/optimistic-ethereum/iOVM/predeploys/iOVM_L1MessageSender.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/**\n * @title iOVM_L1MessageSender\n */\ninterface iOVM_L1MessageSender {\n\n /********************\n * Public Functions *\n ********************/\n\n function getL1MessageSender() external view returns (address _l1MessageSender);\n}\n" - }, - "contracts/optimistic-ethereum/iOVM/predeploys/iOVM_L2ToL1MessagePasser.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/**\n * @title iOVM_L2ToL1MessagePasser\n */\ninterface iOVM_L2ToL1MessagePasser {\n\n /**********\n * Events *\n **********/\n\n event L2ToL1Message(\n uint256 _nonce,\n address _sender,\n bytes _data\n );\n\n\n /********************\n * Public Functions *\n ********************/\n\n function passMessageToL1(bytes calldata _message) external;\n}\n" - }, - "contracts/optimistic-ethereum/OVM/predeploys/OVM_L2ToL1MessagePasser.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Interface Imports */\nimport { iOVM_L2ToL1MessagePasser } from \"../../iOVM/predeploys/iOVM_L2ToL1MessagePasser.sol\";\n\n/**\n * @title OVM_L2ToL1MessagePasser\n * @dev The L2 to L1 Message Passer is a utility contract which facilitate an L1 proof of the \n * of a message on L2. The L1 Cross Domain Messenger performs this proof in its\n * _verifyStorageProof function, which verifies the existence of the transaction hash in this \n * contract's `sentMessages` mapping.\n * \n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract OVM_L2ToL1MessagePasser is iOVM_L2ToL1MessagePasser {\n\n /**********************\n * Contract Variables *\n **********************/\n\n mapping (bytes32 => bool) public sentMessages;\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Passes a message to L1.\n * @param _message Message to pass to L1.\n */\n function passMessageToL1(\n bytes memory _message\n )\n override\n public\n {\n // Note: although this function is public, only messages sent from the OVM_L2CrossDomainMessenger \n // will be relayed by the OVM_L1CrossDomainMessenger. This is enforced by a check in \n // OVM_L1CrossDomainMessenger._verifyStorageProof().\n sentMessages[keccak256(\n abi.encodePacked(\n _message,\n msg.sender\n )\n )] = true;\n }\n}\n" - }, - "contracts/optimistic-ethereum/OVM/predeploys/OVM_L1MessageSender.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Interface Imports */\nimport { iOVM_L1MessageSender } from \"../../iOVM/predeploys/iOVM_L1MessageSender.sol\";\nimport { iOVM_ExecutionManager } from \"../../iOVM/execution/iOVM_ExecutionManager.sol\";\n\n/**\n * @title OVM_L1MessageSender\n * @dev The L1MessageSender is a predeploy contract running on L2. During the execution of cross \n * domain transaction from L1 to L2, it returns the address of the L1 account (either an EOA or\n * contract) which sent the message to L2 via the Canonical Transaction Chain's `enqueue()` \n * function.\n * \n * This contract exclusively serves as a getter for the ovmL1TXORIGIN operation. This is necessary \n * because there is no corresponding operation in the EVM which the the optimistic solidity compiler \n * can be replaced with a call to the ExecutionManager's ovmL1TXORIGIN() function.\n *\n * \n * Compiler used: solc\n * Runtime target: OVM\n */\ncontract OVM_L1MessageSender is iOVM_L1MessageSender {\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @return _l1MessageSender L1 message sender address (msg.sender).\n */\n function getL1MessageSender()\n override\n public\n view\n returns (\n address _l1MessageSender\n )\n {\n // Note that on L2 msg.sender (ie. evmCALLER) will always be the Execution Manager \n return iOVM_ExecutionManager(msg.sender).ovmL1TXORIGIN();\n }\n}\n" - }, - "contracts/optimistic-ethereum/mockOVM/bridge/mockOVM_CrossDomainMessenger.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Contract Imports */\nimport { iAbs_BaseCrossDomainMessenger } from \"../../iOVM/bridge/messaging/iAbs_BaseCrossDomainMessenger.sol\";\n\n/**\n * @title mockOVM_CrossDomainMessenger\n */\ncontract mockOVM_CrossDomainMessenger is iAbs_BaseCrossDomainMessenger {\n\n /***********\n * Structs *\n ***********/\n\n struct ReceivedMessage {\n uint256 timestamp;\n address target;\n address sender;\n bytes message;\n uint256 messageNonce;\n uint32 gasLimit;\n }\n\n\n /**********************\n * Contract Variables *\n **********************/\n\n ReceivedMessage[] internal fullReceivedMessages;\n address internal targetMessengerAddress;\n uint256 internal lastRelayedMessage;\n uint256 internal delay;\n uint256 public messageNonce;\n address override public xDomainMessageSender;\n\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _delay Time in seconds before a message can be relayed.\n */\n constructor(\n uint256 _delay\n )\n {\n delay = _delay;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Sets the target messenger address.\n * @dev Currently, this function is public and therefore allows anyone to modify the target\n * messenger for a given xdomain messenger contract. Obviously this shouldn't be allowed,\n * but we still need to determine an adequate mechanism for updating this address.\n * @param _targetMessengerAddress New messenger address.\n */\n function setTargetMessengerAddress(\n address _targetMessengerAddress\n )\n public\n {\n targetMessengerAddress = _targetMessengerAddress;\n }\n\n /**\n * Sends a message to another mock xdomain messenger.\n * @param _target Target for the message.\n * @param _message Message to send.\n * @param _gasLimit Amount of gas to send with the call.\n */\n function sendMessage(\n address _target,\n bytes memory _message,\n uint32 _gasLimit\n )\n override\n public\n {\n mockOVM_CrossDomainMessenger targetMessenger = mockOVM_CrossDomainMessenger(\n targetMessengerAddress\n );\n\n // Just send it over!\n targetMessenger.receiveMessage(ReceivedMessage({\n timestamp: block.timestamp,\n target: _target,\n sender: msg.sender,\n message: _message,\n messageNonce: messageNonce,\n gasLimit: _gasLimit\n }));\n\n messageNonce += 1;\n }\n\n /**\n * Receives a message to be sent later.\n * @param _message Message to send later.\n */\n function receiveMessage(\n ReceivedMessage memory _message\n )\n public\n {\n fullReceivedMessages.push(_message);\n }\n\n /**\n * Checks whether we have messages to relay.\n * @param _exists Whether or not we have more messages to relay.\n */\n function hasNextMessage()\n public\n view\n returns (\n bool _exists\n )\n {\n return fullReceivedMessages.length > lastRelayedMessage;\n }\n\n /**\n * Relays the last received message not yet relayed.\n */\n function relayNextMessage()\n public\n {\n require(hasNextMessage(), \"No pending messages to relay\");\n ReceivedMessage memory nextMessage = fullReceivedMessages[lastRelayedMessage];\n require(nextMessage.timestamp + delay < block.timestamp, \"Message is not ready to be relayed. The delay period is not up yet!\");\n\n xDomainMessageSender = nextMessage.sender;\n (bool success,) = nextMessage.target.call{gas: nextMessage.gasLimit}(nextMessage.message);\n require(success, \"Cross-domain message call reverted. Did you set your gas limit high enough?\");\n lastRelayedMessage += 1;\n }\n}\n" - }, - "contracts/optimistic-ethereum/libraries/bridge/OVM_CrossDomainEnabled.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n/* Interface Imports */\nimport { iAbs_BaseCrossDomainMessenger } from \"../../iOVM/bridge/messaging/iAbs_BaseCrossDomainMessenger.sol\";\n\n/**\n * @title OVM_CrossDomainEnabled\n * @dev Helper contract for contracts performing cross-domain communications\n *\n * Compiler used: defined by inheriting contract\n * Runtime target: defined by inheriting contract\n */\ncontract OVM_CrossDomainEnabled {\n // Messenger contract used to send and recieve messages from the other domain.\n address public messenger;\n\n /***************\n * Constructor *\n ***************/ \n constructor(\n address _messenger\n ) {\n messenger = _messenger;\n }\n\n /**********************\n * Function Modifiers *\n **********************/\n\n /**\n * @notice Enforces that the modified function is only callable by a specific cross-domain account.\n * @param _sourceDomainAccount The only account on the originating domain which is authenticated to call this function.\n */\n modifier onlyFromCrossDomainAccount(\n address _sourceDomainAccount\n ) {\n require(\n msg.sender == address(getCrossDomainMessenger()),\n \"OVM_XCHAIN: messenger contract unauthenticated\"\n );\n\n require(\n getCrossDomainMessenger().xDomainMessageSender() == _sourceDomainAccount,\n \"OVM_XCHAIN: wrong sender of cross-domain message\"\n );\n\n _;\n }\n \n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * @notice Gets the messenger, usually from storage. This function is exposed in case a child contract needs to override.\n * @return The address of the cross-domain messenger contract which should be used. \n */\n function getCrossDomainMessenger()\n internal\n virtual\n returns(\n iAbs_BaseCrossDomainMessenger\n )\n {\n return iAbs_BaseCrossDomainMessenger(messenger);\n }\n\n /**\n * @notice Sends a message to an account on another domain\n * @param _crossDomainTarget The intended recipient on the destination domain\n * @param _data The data to send to the target (usually calldata to a function with `onlyFromCrossDomainAccount()`)\n * @param _gasLimit The gasLimit for the receipt of the message on the target domain.\n */\n function sendCrossDomainMessage(\n address _crossDomainTarget,\n bytes memory _data,\n uint32 _gasLimit\n ) internal {\n getCrossDomainMessenger().sendMessage(_crossDomainTarget, _data, _gasLimit);\n }\n}\n" - }, - "contracts/optimistic-ethereum/OVM/bridge/tokens/OVM_L1ETHGateway.sol": { - "content": "// SPDX-License-Identifier: MIT\n// @unsupported: ovm\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Interface Imports */\nimport { iOVM_L1ETHGateway } from \"../../../iOVM/bridge/tokens/iOVM_L1ETHGateway.sol\";\nimport { iOVM_L2DepositedToken } from \"../../../iOVM/bridge/tokens/iOVM_L2DepositedToken.sol\";\n\n/* Library Imports */\nimport { OVM_CrossDomainEnabled } from \"../../../libraries/bridge/OVM_CrossDomainEnabled.sol\";\nimport { Lib_AddressResolver } from \"../../../libraries/resolver/Lib_AddressResolver.sol\";\nimport { Lib_AddressManager } from \"../../../libraries/resolver/Lib_AddressManager.sol\";\n\n/**\n * @title OVM_L1ETHGateway\n * @dev The L1 ETH Gateway is a contract which stores deposited ETH that is in use on L2.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract OVM_L1ETHGateway is iOVM_L1ETHGateway, OVM_CrossDomainEnabled, Lib_AddressResolver {\n\n /********************\n * Public Constants *\n ********************/\n\n uint32 public constant override getFinalizeDepositL2Gas = 1200000;\n\n /********************************\n * External Contract References *\n ********************************/\n\n address public ovmEth;\n\n /***************\n * Constructor *\n ***************/\n\n // This contract lives behind a proxy, so the constructor parameters will go unused.\n constructor()\n OVM_CrossDomainEnabled(address(0))\n Lib_AddressResolver(address(0))\n public\n {}\n\n /******************\n * Initialization *\n ******************/\n\n /**\n * @param _libAddressManager Address manager for this OE deployment\n * @param _ovmEth L2 OVM_ETH implementation of iOVM_DepositedToken\n */\n function initialize(\n address _libAddressManager,\n address _ovmEth\n )\n public\n {\n require(libAddressManager == Lib_AddressManager(0), \"Contract has already been initialized.\");\n libAddressManager = Lib_AddressManager(_libAddressManager);\n ovmEth = _ovmEth;\n messenger = resolve(\"Proxy__OVM_L1CrossDomainMessenger\");\n }\n\n /**************\n * Depositing *\n **************/\n\n receive()\n external\n payable\n {\n _initiateDeposit(msg.sender, msg.sender);\n }\n\n /**\n * @dev deposit an amount of the ETH to the caller's balance on L2\n */\n function deposit() \n external\n override\n payable\n {\n _initiateDeposit(msg.sender, msg.sender);\n }\n\n /**\n * @dev deposit an amount of ETH to a recipients's balance on L2\n * @param _to L2 address to credit the withdrawal to\n */\n function depositTo(\n address _to\n )\n external\n override\n payable\n {\n _initiateDeposit(msg.sender, _to);\n }\n\n /**\n * @dev Performs the logic for deposits by storing the ETH and informing the L2 ETH Gateway of the deposit.\n *\n * @param _from Account to pull the deposit from on L1\n * @param _to Account to give the deposit to on L2\n */\n function _initiateDeposit(\n address _from,\n address _to\n )\n internal\n {\n // Construct calldata for l2ETHGateway.finalizeDeposit(_to, _amount)\n bytes memory data =\n abi.encodeWithSelector(\n iOVM_L2DepositedToken.finalizeDeposit.selector,\n _to,\n msg.value\n );\n\n // Send calldata into L2\n sendCrossDomainMessage(\n ovmEth,\n data,\n getFinalizeDepositL2Gas\n );\n\n emit DepositInitiated(_from, _to, msg.value);\n }\n\n /*************************\n * Cross-chain Functions *\n *************************/\n\n /**\n * @dev Complete a withdrawal from L2 to L1, and credit funds to the recipient's balance of the\n * L1 ETH token.\n * Since only the xDomainMessenger can call this function, it will never be called before the withdrawal is finalized. \n *\n * @param _to L1 address to credit the withdrawal to\n * @param _amount Amount of the ETH to withdraw\n */\n function finalizeWithdrawal(\n address _to,\n uint256 _amount\n )\n external\n override\n onlyFromCrossDomainAccount(ovmEth)\n {\n _safeTransferETH(_to, _amount);\n\n emit WithdrawalFinalized(_to, _amount);\n }\n\n /**********************************\n * Internal Functions: Accounting *\n **********************************/\n\n /**\n * @dev Internal accounting function for moving around L1 ETH.\n *\n * @param _to L1 address to transfer ETH to\n * @param _value Amount of ETH to send to\n */\n function _safeTransferETH(\n address _to,\n uint256 _value\n )\n internal\n {\n (bool success, ) = _to.call{value: _value}(new bytes(0));\n require(success, 'TransferHelper::safeTransferETH: ETH transfer failed');\n }\n}\n" - }, - "contracts/optimistic-ethereum/iOVM/bridge/tokens/iOVM_L1ETHGateway.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0;\npragma experimental ABIEncoderV2;\n\n/**\n * @title iOVM_L1ETHGateway\n */\ninterface iOVM_L1ETHGateway {\n\n /**********\n * Events *\n **********/\n\n event DepositInitiated(\n address indexed _from,\n address _to,\n uint256 _amount\n );\n\n event WithdrawalFinalized(\n address indexed _to,\n uint256 _amount\n );\n\n /********************\n * Public Functions *\n ********************/\n\n function deposit()\n external\n payable;\n\n function depositTo(\n address _to\n )\n external\n payable;\n\n /*************************\n * Cross-chain Functions *\n *************************/\n\n function finalizeWithdrawal(\n address _to,\n uint _amount\n )\n external;\n\n function getFinalizeDepositL2Gas()\n external\n view\n returns(\n uint32\n );\n}\n" - }, - "contracts/optimistic-ethereum/iOVM/bridge/tokens/iOVM_L2DepositedToken.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0;\npragma experimental ABIEncoderV2;\n\n/**\n * @title iOVM_L2DepositedToken\n */\ninterface iOVM_L2DepositedToken {\n\n /**********\n * Events *\n **********/\n\n event WithdrawalInitiated(\n address indexed _from,\n address _to,\n uint256 _amount\n );\n\n event DepositFinalized(\n address indexed _to,\n uint256 _amount\n ); \n\n\n /********************\n * Public Functions *\n ********************/\n\n function withdraw(\n uint _amount\n )\n external;\n\n function withdrawTo(\n address _to,\n uint _amount\n )\n external;\n\n\n /*************************\n * Cross-chain Functions *\n *************************/\n\n function finalizeDeposit(\n address _to,\n uint _amount\n )\n external;\n}\n" - }, - "contracts/optimistic-ethereum/libraries/resolver/Lib_ResolvedDelegateProxy.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Library Imports */\nimport { Lib_AddressManager } from \"./Lib_AddressManager.sol\";\n\n/**\n * @title Lib_ResolvedDelegateProxy\n */\ncontract Lib_ResolvedDelegateProxy {\n\n /*************\n * Variables *\n *************/\n\n // Using mappings to store fields to avoid overwriting storage slots in the\n // implementation contract. For example, instead of storing these fields at\n // storage slot `0` & `1`, they are stored at `keccak256(key + slot)`.\n // See: https://solidity.readthedocs.io/en/v0.7.0/internals/layout_in_storage.html\n // NOTE: Do not use this code in your own contract system. \n // There is a known flaw in this contract, and we will remove it from the repository\n // in the near future. Due to the very limited way that we are using it, this flaw is\n // not an issue in our system. \n mapping (address => string) private implementationName;\n mapping (address => Lib_AddressManager) private addressManager;\n\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Lib_AddressManager.\n * @param _implementationName implementationName of the contract to proxy to.\n */\n constructor(\n address _libAddressManager,\n string memory _implementationName\n )\n {\n addressManager[address(this)] = Lib_AddressManager(_libAddressManager);\n implementationName[address(this)] = _implementationName;\n }\n\n\n /*********************\n * Fallback Function *\n *********************/\n\n fallback()\n external\n payable\n {\n address target = addressManager[address(this)].getAddress(\n (implementationName[address(this)])\n );\n\n require(\n target != address(0),\n \"Target address must be initialized.\"\n );\n\n (bool success, bytes memory returndata) = target.delegatecall(msg.data);\n\n if (success == true) {\n assembly {\n return(add(returndata, 0x20), mload(returndata))\n }\n } else {\n assembly {\n revert(add(returndata, 0x20), mload(returndata))\n }\n }\n }\n}\n" - }, - "contracts/optimistic-ethereum/OVM/bridge/tokens/Abs_L2DepositedToken.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Interface Imports */\nimport { iOVM_L2DepositedToken } from \"../../../iOVM/bridge/tokens/iOVM_L2DepositedToken.sol\";\nimport { iOVM_L1TokenGateway } from \"../../../iOVM/bridge/tokens/iOVM_L1TokenGateway.sol\";\n\n/* Library Imports */\nimport { OVM_CrossDomainEnabled } from \"../../../libraries/bridge/OVM_CrossDomainEnabled.sol\";\n\n/**\n * @title Abs_L2DepositedToken\n * @dev An L2 Deposited Token is an L2 representation of funds which were deposited from L1.\n * Usually contract mints new tokens when it hears about deposits into the L1 ERC20 gateway.\n * This contract also burns the tokens intended for withdrawal, informing the L1 gateway to release L1 funds.\n *\n * NOTE: This abstract contract gives all the core functionality of a deposited token implementation except for the\n * token's internal accounting itself. This gives developers an easy way to implement children with their own token code.\n *\n * Compiler used: optimistic-solc\n * Runtime target: OVM\n */\nabstract contract Abs_L2DepositedToken is iOVM_L2DepositedToken, OVM_CrossDomainEnabled {\n\n /*******************\n * Contract Events *\n *******************/\n\n event Initialized(iOVM_L1TokenGateway _l1TokenGateway);\n\n /********************************\n * External Contract References *\n ********************************/\n\n iOVM_L1TokenGateway public l1TokenGateway;\n\n /********************************\n * Constructor & Initialization *\n ********************************/\n\n /**\n * @param _l2CrossDomainMessenger L1 Messenger address being used for cross-chain communications.\n */\n constructor(\n address _l2CrossDomainMessenger\n )\n OVM_CrossDomainEnabled(_l2CrossDomainMessenger)\n {}\n\n /**\n * @dev Initialize this contract with the L1 token gateway address.\n * The flow: 1) this contract gets deployed on L2, 2) the L1\n * gateway is deployed with addr from (1), 3) L1 gateway address passed here.\n *\n * @param _l1TokenGateway Address of the corresponding L1 gateway deployed to the main chain\n */\n\n function init(\n iOVM_L1TokenGateway _l1TokenGateway\n )\n public\n {\n require(address(l1TokenGateway) == address(0), \"Contract has already been initialized\");\n\n l1TokenGateway = _l1TokenGateway;\n \n emit Initialized(l1TokenGateway);\n }\n\n /**********************\n * Function Modifiers *\n **********************/\n\n modifier onlyInitialized() {\n require(address(l1TokenGateway) != address(0), \"Contract has not yet been initialized\");\n _;\n }\n\n /********************************\n * Overridable Accounting logic *\n ********************************/\n\n // Default gas value which can be overridden if more complex logic runs on L2.\n uint32 constant DEFAULT_FINALIZE_WITHDRAWAL_L1_GAS = 100000;\n\n /**\n * @dev Core logic to be performed when a withdrawal from L2 is initialized.\n * In most cases, this will simply burn the withdrawn L2 funds.\n *\n * param _to Address being withdrawn to\n * param _amount Amount being withdrawn\n */\n\n function _handleInitiateWithdrawal(\n address, // _to,\n uint // _amount\n )\n internal\n virtual\n {\n revert(\"Accounting must be implemented by child contract.\");\n }\n\n /**\n * @dev Core logic to be performed when a deposit from L2 is finalized on L2.\n * In most cases, this will simply _mint() to credit L2 funds to the recipient.\n *\n * param _to Address being deposited to on L2\n * param _amount Amount which was deposited on L1\n */\n function _handleFinalizeDeposit(\n address, // _to\n uint // _amount\n )\n internal\n virtual\n {\n revert(\"Accounting must be implemented by child contract.\");\n }\n\n /**\n * @dev Overridable getter for the *L1* gas limit of settling the withdrawal, in the case it may be\n * dynamic, and the above public constant does not suffice.\n *\n */\n\n function getFinalizeWithdrawalL1Gas()\n public\n view\n virtual\n returns(\n uint32\n )\n {\n return DEFAULT_FINALIZE_WITHDRAWAL_L1_GAS;\n }\n\n\n /***************\n * Withdrawing *\n ***************/\n\n /**\n * @dev initiate a withdraw of some tokens to the caller's account on L1\n * @param _amount Amount of the token to withdraw\n */\n function withdraw(\n uint _amount\n )\n external\n override\n onlyInitialized()\n {\n _initiateWithdrawal(msg.sender, _amount);\n }\n\n /**\n * @dev initiate a withdraw of some token to a recipient's account on L1\n * @param _to L1 adress to credit the withdrawal to\n * @param _amount Amount of the token to withdraw\n */\n function withdrawTo(\n address _to,\n uint _amount\n )\n external\n override\n onlyInitialized()\n {\n _initiateWithdrawal(_to, _amount);\n }\n\n /**\n * @dev Performs the logic for deposits by storing the token and informing the L2 token Gateway of the deposit.\n *\n * @param _to Account to give the withdrawal to on L1\n * @param _amount Amount of the token to withdraw\n */\n function _initiateWithdrawal(\n address _to,\n uint _amount\n )\n internal\n {\n // Call our withdrawal accounting handler implemented by child contracts (usually a _burn)\n _handleInitiateWithdrawal(_to, _amount);\n\n // Construct calldata for l1TokenGateway.finalizeWithdrawal(_to, _amount)\n bytes memory data = abi.encodeWithSelector(\n iOVM_L1TokenGateway.finalizeWithdrawal.selector,\n _to,\n _amount\n );\n\n // Send message up to L1 gateway\n sendCrossDomainMessage(\n address(l1TokenGateway),\n data,\n getFinalizeWithdrawalL1Gas()\n );\n\n emit WithdrawalInitiated(msg.sender, _to, _amount);\n }\n\n /************************************\n * Cross-chain Function: Depositing *\n ************************************/\n\n /**\n * @dev Complete a deposit from L1 to L2, and credits funds to the recipient's balance of this \n * L2 token. \n * This call will fail if it did not originate from a corresponding deposit in OVM_l1TokenGateway. \n *\n * @param _to Address to receive the withdrawal at\n * @param _amount Amount of the token to withdraw\n */\n function finalizeDeposit(\n address _to,\n uint _amount\n )\n external\n override \n onlyInitialized()\n onlyFromCrossDomainAccount(address(l1TokenGateway))\n {\n _handleFinalizeDeposit(_to, _amount);\n emit DepositFinalized(_to, _amount);\n }\n}\n" - }, - "contracts/optimistic-ethereum/iOVM/bridge/tokens/iOVM_L1TokenGateway.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0;\npragma experimental ABIEncoderV2;\n\n/**\n * @title iOVM_L1TokenGateway\n */\ninterface iOVM_L1TokenGateway {\n\n /**********\n * Events *\n **********/\n\n event DepositInitiated(\n address indexed _from,\n address _to,\n uint256 _amount\n );\n \n event WithdrawalFinalized(\n address indexed _to,\n uint256 _amount\n );\n\n\n /********************\n * Public Functions *\n ********************/\n\n function deposit(\n uint _amount\n )\n external;\n\n function depositTo(\n address _to,\n uint _amount\n )\n external;\n\n\n /*************************\n * Cross-chain Functions *\n *************************/\n\n function finalizeWithdrawal(\n address _to,\n uint _amount\n )\n external;\n}\n" - }, - "contracts/optimistic-ethereum/OVM/bridge/tokens/OVM_L2DepositedERC20.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Interface Imports */\nimport { iOVM_L1TokenGateway } from \"../../../iOVM/bridge/tokens/iOVM_L1TokenGateway.sol\";\n\n/* Contract Imports */\nimport { UniswapV2ERC20 } from \"../../../libraries/standards/UniswapV2ERC20.sol\";\n\n/* Library Imports */\nimport { Abs_L2DepositedToken } from \"./Abs_L2DepositedToken.sol\";\n\n/**\n * @title OVM_L2DepositedERC20\n * @dev The L2 Deposited ERC20 is an ERC20 implementation which represents L1 assets deposited into L2.\n * This contract mints new tokens when it hears about deposits into the L1 ERC20 gateway.\n * This contract also burns the tokens intended for withdrawal, informing the L1 gateway to release L1 funds.\n *\n * NOTE: This contract implements the Abs_L2DepositedToken contract using Uniswap's ERC20 as the implementation.\n * Alternative implementations can be used in this similar manner.\n *\n * Compiler used: optimistic-solc\n * Runtime target: OVM\n */\ncontract OVM_L2DepositedERC20 is Abs_L2DepositedToken, UniswapV2ERC20 {\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _l2CrossDomainMessenger Cross-domain messenger used by this contract.\n * @param _name ERC20 name\n * @param _symbol ERC20 symbol\n */\n constructor(\n address _l2CrossDomainMessenger,\n string memory _name,\n string memory _symbol\n )\n Abs_L2DepositedToken(_l2CrossDomainMessenger)\n UniswapV2ERC20(_name, _symbol)\n {}\n\n // When a withdrawal is initiated, we burn the withdrawer's funds to prevent subsequent L2 usage.\n function _handleInitiateWithdrawal(\n address, // _to,\n uint _amount\n )\n internal\n override\n {\n _burn(msg.sender, _amount);\n }\n\n // When a deposit is finalized, we credit the account on L2 with the same amount of tokens.\n function _handleFinalizeDeposit(\n address _to,\n uint _amount\n )\n internal\n override\n {\n _mint(_to, _amount);\n }\n}\n" - }, - "contracts/optimistic-ethereum/libraries/standards/UniswapV2ERC20.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.5.16 <0.8.0;\n\nimport './IUniswapV2ERC20.sol';\nimport './UniSafeMath.sol';\n\ncontract UniswapV2ERC20 is IUniswapV2ERC20 {\n using UniSafeMath for uint;\n\n string public override name;\n string public override symbol;\n uint8 public constant override decimals = 18;\n uint public override totalSupply;\n mapping(address => uint) public override balanceOf;\n mapping(address => mapping(address => uint)) public override allowance;\n\n bytes32 public override DOMAIN_SEPARATOR;\n // keccak256(\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\");\n bytes32 public constant override PERMIT_TYPEHASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9;\n mapping(address => uint) public override nonces;\n\n constructor(\n string memory _name,\n string memory _symbol\n ) {\n name = _name;\n symbol = _symbol;\n\n uint chainId;\n assembly {\n chainId := chainid()\n }\n DOMAIN_SEPARATOR = keccak256(\n abi.encode(\n keccak256('EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)'),\n keccak256(bytes(name)),\n keccak256(bytes('1')),\n chainId,\n address(this)\n )\n );\n }\n\n function _mint(address to, uint value) internal {\n totalSupply = totalSupply.add(value);\n balanceOf[to] = balanceOf[to].add(value);\n emit Transfer(address(0), to, value);\n }\n\n function _burn(address from, uint value) internal {\n balanceOf[from] = balanceOf[from].sub(value);\n totalSupply = totalSupply.sub(value);\n emit Transfer(from, address(0), value);\n }\n\n function _approve(address owner, address spender, uint value) private {\n allowance[owner][spender] = value;\n emit Approval(owner, spender, value);\n }\n\n function _transfer(address from, address to, uint value) private {\n balanceOf[from] = balanceOf[from].sub(value);\n balanceOf[to] = balanceOf[to].add(value);\n emit Transfer(from, to, value);\n }\n\n function approve(address spender, uint value) external override returns (bool) {\n _approve(msg.sender, spender, value);\n return true;\n }\n\n function transfer(address to, uint value) external override returns (bool) {\n _transfer(msg.sender, to, value);\n return true;\n }\n\n function transferFrom(address from, address to, uint value) external override returns (bool) {\n if (allowance[from][msg.sender] != uint(-1)) {\n allowance[from][msg.sender] = allowance[from][msg.sender].sub(value);\n }\n _transfer(from, to, value);\n return true;\n }\n\n function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external override {\n require(deadline >= block.timestamp, 'UniswapV2: EXPIRED');\n bytes32 digest = keccak256(\n abi.encodePacked(\n '\\x19\\x01',\n DOMAIN_SEPARATOR,\n keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, value, nonces[owner]++, deadline))\n )\n );\n address recoveredAddress = ecrecover(digest, v, r, s);\n require(recoveredAddress != address(0) && recoveredAddress == owner, 'UniswapV2: INVALID_SIGNATURE');\n _approve(owner, spender, value);\n }\n}\n" - }, - "contracts/optimistic-ethereum/libraries/standards/IUniswapV2ERC20.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.5.16 <0.8.0;\n\ninterface IUniswapV2ERC20 {\n event Approval(address indexed owner, address indexed spender, uint value);\n event Transfer(address indexed from, address indexed to, uint value);\n\n function name() external view returns (string memory);\n function symbol() external view returns (string memory);\n function decimals() external view returns (uint8);\n function totalSupply() external view returns (uint);\n function balanceOf(address owner) external view returns (uint);\n function allowance(address owner, address spender) external view returns (uint);\n\n function approve(address spender, uint value) external returns (bool);\n function transfer(address to, uint value) external returns (bool);\n function transferFrom(address from, address to, uint value) external returns (bool);\n\n function DOMAIN_SEPARATOR() external view returns (bytes32);\n function PERMIT_TYPEHASH() external pure returns (bytes32);\n function nonces(address owner) external view returns (uint);\n\n function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;\n}\n" - }, - "contracts/optimistic-ethereum/libraries/standards/UniSafeMath.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.5.16 <0.8.0;\n\n// a library for performing overflow-safe math, courtesy of DappHub (https://github.com/dapphub/ds-math)\n\nlibrary UniSafeMath {\n function add(uint x, uint y) internal pure returns (uint z) {\n require((z = x + y) >= x, 'ds-math-add-overflow');\n }\n\n function sub(uint x, uint y) internal pure returns (uint z) {\n require((z = x - y) <= x, 'ds-math-sub-underflow');\n }\n\n function mul(uint x, uint y) internal pure returns (uint z) {\n require(y == 0 || (z = x * y) / y == x, 'ds-math-mul-overflow');\n }\n}\n" - }, - "contracts/optimistic-ethereum/OVM/predeploys/OVM_ETH.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Library Imports */\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/* Interface Imports */\nimport { iOVM_L1TokenGateway } from \"../../iOVM/bridge/tokens/iOVM_L1TokenGateway.sol\";\n\n/* Contract Imports */\nimport { OVM_L2DepositedERC20 } from \"../bridge/tokens/OVM_L2DepositedERC20.sol\";\n\n/**\n * @title OVM_ETH\n * @dev The ETH predeploy provides an ERC20 interface for ETH deposited to Layer 2. Note that \n * unlike on Layer 1, Layer 2 accounts do not have a balance field.\n * \n * Compiler used: optimistic-solc\n * Runtime target: OVM\n */\ncontract OVM_ETH is OVM_L2DepositedERC20 {\n constructor(\n address _l2CrossDomainMessenger,\n address _l1ETHGateway\n ) \n OVM_L2DepositedERC20(\n _l2CrossDomainMessenger,\n \"Ether\",\n \"ETH\"\n )\n {\n init(iOVM_L1TokenGateway(_l1ETHGateway));\n }\n}\n" - }, - "contracts/optimistic-ethereum/OVM/bridge/tokens/OVM_L1ERC20Gateway.sol": { - "content": "// SPDX-License-Identifier: MIT\n// @unsupported: ovm \npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Interface Imports */\nimport { iOVM_L1TokenGateway } from \"../../../iOVM/bridge/tokens/iOVM_L1TokenGateway.sol\";\nimport { Abs_L1TokenGateway } from \"./Abs_L1TokenGateway.sol\";\nimport { iOVM_ERC20 } from \"../../../iOVM/predeploys/iOVM_ERC20.sol\";\n\n/**\n * @title OVM_L1ERC20Gateway\n * @dev The L1 ERC20 Gateway is a contract which stores deposited L1 funds that are in use on L2.\n * It synchronizes a corresponding L2 ERC20 Gateway, informing it of deposits, and listening to it\n * for newly finalized withdrawals.\n *\n * NOTE: This contract extends Abs_L1TokenGateway, which is where we\n * takes care of most of the initialization and the cross-chain logic.\n * If you are looking to implement your own deposit/withdrawal contracts, you\n * may also want to extend the abstract contract in a similar manner.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract OVM_L1ERC20Gateway is Abs_L1TokenGateway {\n\n /********************************\n * External Contract References *\n ********************************/\n \n iOVM_ERC20 public l1ERC20;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _l1ERC20 L1 ERC20 address this contract stores deposits for\n * @param _l2DepositedERC20 L2 Gateway address on the chain being deposited into\n */\n constructor(\n iOVM_ERC20 _l1ERC20,\n address _l2DepositedERC20,\n address _l1messenger \n )\n Abs_L1TokenGateway(\n _l2DepositedERC20,\n _l1messenger\n )\n {\n l1ERC20 = _l1ERC20;\n }\n\n\n /**************\n * Accounting *\n **************/\n\n /**\n * @dev When a deposit is initiated on L1, the L1 Gateway\n * transfers the funds to itself for future withdrawals\n *\n * @param _from L1 address ETH is being deposited from\n * param _to L2 address that the ETH is being deposited to\n * @param _amount Amount of ERC20 to send\n */\n function _handleInitiateDeposit(\n address _from,\n address, // _to,\n uint256 _amount\n )\n internal\n override\n {\n // Hold on to the newly deposited funds\n l1ERC20.transferFrom(\n _from,\n address(this),\n _amount\n );\n }\n\n /**\n * @dev When a withdrawal is finalized on L1, the L1 Gateway\n * transfers the funds to the withdrawer\n *\n * @param _to L1 address that the ERC20 is being withdrawn to\n * @param _amount Amount of ERC20 to send\n */\n function _handleFinalizeWithdrawal(\n address _to,\n uint _amount\n )\n internal\n override\n {\n // Transfer withdrawn funds out to withdrawer\n l1ERC20.transfer(_to, _amount);\n }\n}\n" - }, - "contracts/optimistic-ethereum/OVM/bridge/tokens/Abs_L1TokenGateway.sol": { - "content": "// SPDX-License-Identifier: MIT\n// @unsupported: ovm \npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Interface Imports */\nimport { iOVM_L1TokenGateway } from \"../../../iOVM/bridge/tokens/iOVM_L1TokenGateway.sol\";\nimport { iOVM_L2DepositedToken } from \"../../../iOVM/bridge/tokens/iOVM_L2DepositedToken.sol\";\n\n/* Library Imports */\nimport { OVM_CrossDomainEnabled } from \"../../../libraries/bridge/OVM_CrossDomainEnabled.sol\";\n\n/**\n * @title Abs_L1TokenGateway\n * @dev An L1 Token Gateway is a contract which stores deposited L1 funds that are in use on L2.\n * It synchronizes a corresponding L2 representation of the \"deposited token\", informing it\n * of new deposits and releasing L1 funds when there are newly finalized withdrawals.\n *\n * NOTE: This abstract contract gives all the core functionality of an L1 token gateway, \n * but provides easy hooks in case developers need extensions in child contracts.\n * In many cases, the default OVM_L1ERC20Gateway will suffice.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\nabstract contract Abs_L1TokenGateway is iOVM_L1TokenGateway, OVM_CrossDomainEnabled {\n\n /********************************\n * External Contract References *\n ********************************/\n\n address public l2DepositedToken;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _l2DepositedToken iOVM_L2DepositedToken-compatible address on the chain being deposited into.\n * @param _l1messenger L1 Messenger address being used for cross-chain communications.\n */\n constructor(\n address _l2DepositedToken,\n address _l1messenger \n )\n OVM_CrossDomainEnabled(_l1messenger)\n {\n l2DepositedToken = _l2DepositedToken;\n }\n\n /********************************\n * Overridable Accounting logic *\n ********************************/\n\n // Default gas value which can be overridden if more complex logic runs on L2.\n uint32 public DEFAULT_FINALIZE_DEPOSIT_L2_GAS = 1200000;\n\n /**\n * @dev Core logic to be performed when a withdrawal is finalized on L1.\n * In most cases, this will simply send locked funds to the withdrawer.\n *\n * param _to Address being withdrawn to.\n * param _amount Amount being withdrawn.\n */\n function _handleFinalizeWithdrawal(\n address, // _to,\n uint256 // _amount\n )\n internal\n virtual\n {\n revert(\"Implement me in child contracts\");\n }\n\n /**\n * @dev Core logic to be performed when a deposit is initiated on L1.\n * In most cases, this will simply send locked funds to the withdrawer.\n *\n * param _from Address being deposited from on L1.\n * param _to Address being deposited into on L2.\n * param _amount Amount being deposited.\n */\n function _handleInitiateDeposit(\n address, // _from,\n address, // _to,\n uint256 // _amount\n )\n internal\n virtual\n {\n revert(\"Implement me in child contracts\");\n }\n\n /**\n * @dev Overridable getter for the L2 gas limit, in the case it may be\n * dynamic, and the above public constant does not suffice.\n *\n */\n\n function getFinalizeDepositL2Gas()\n public\n view\n returns(\n uint32\n )\n {\n return DEFAULT_FINALIZE_DEPOSIT_L2_GAS;\n }\n\n /**************\n * Depositing *\n **************/\n\n /**\n * @dev deposit an amount of the ERC20 to the caller's balance on L2\n * @param _amount Amount of the ERC20 to deposit\n */\n function deposit(\n uint _amount\n )\n public\n override\n {\n _initiateDeposit(msg.sender, msg.sender, _amount);\n }\n\n /**\n * @dev deposit an amount of ERC20 to a recipients's balance on L2\n * @param _to L2 address to credit the withdrawal to\n * @param _amount Amount of the ERC20 to deposit\n */\n function depositTo(\n address _to,\n uint _amount\n )\n public\n override\n {\n _initiateDeposit(msg.sender, _to, _amount);\n }\n\n /**\n * @dev Performs the logic for deposits by informing the L2 Deposited Token\n * contract of the deposit and calling a handler to lock the L1 funds. (e.g. transferFrom)\n *\n * @param _from Account to pull the deposit from on L1\n * @param _to Account to give the deposit to on L2\n * @param _amount Amount of the ERC20 to deposit.\n */\n function _initiateDeposit(\n address _from,\n address _to,\n uint _amount\n )\n internal\n {\n // Call our deposit accounting handler implemented by child contracts.\n _handleInitiateDeposit(\n _from,\n _to,\n _amount\n );\n\n // Construct calldata for l2DepositedToken.finalizeDeposit(_to, _amount)\n bytes memory data = abi.encodeWithSelector(\n iOVM_L2DepositedToken.finalizeDeposit.selector,\n _to,\n _amount\n );\n\n // Send calldata into L2\n sendCrossDomainMessage(\n l2DepositedToken,\n data,\n getFinalizeDepositL2Gas()\n );\n\n emit DepositInitiated(_from, _to, _amount);\n }\n\n /*************************\n * Cross-chain Functions *\n *************************/\n\n /**\n * @dev Complete a withdrawal from L2 to L1, and credit funds to the recipient's balance of the \n * L1 ERC20 token. \n * This call will fail if the initialized withdrawal from L2 has not been finalized. \n *\n * @param _to L1 address to credit the withdrawal to\n * @param _amount Amount of the ERC20 to withdraw\n */\n function finalizeWithdrawal(\n address _to,\n uint _amount\n )\n external\n override \n onlyFromCrossDomainAccount(l2DepositedToken)\n {\n // Call our withdrawal accounting handler implemented by child contracts.\n _handleFinalizeWithdrawal(\n _to,\n _amount\n );\n\n emit WithdrawalFinalized(_to, _amount);\n }\n}\n" - }, - "contracts/optimistic-ethereum/iOVM/predeploys/iOVM_ERC20.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/**\n * @title iOVM_ERC20\n */\ninterface iOVM_ERC20 {\n /* This is a slight change to the ERC20 base standard.\n function totalSupply() constant returns (uint256 supply);\n is replaced with:\n uint256 public totalSupply;\n This automatically creates a getter function for the totalSupply.\n This is moved to the base contract since public getter functions are not\n currently recognised as an implementation of the matching abstract\n function by the compiler.\n */\n /// total amount of tokens\n function totalSupply() external view returns (uint256);\n\n /// @param _owner The address from which the balance will be retrieved\n /// @return balance The balance\n function balanceOf(address _owner) external view returns (uint256 balance);\n\n /// @notice send `_value` token to `_to` from `msg.sender`\n /// @param _to The address of the recipient\n /// @param _value The amount of token to be transferred\n /// @return success Whether the transfer was successful or not\n function transfer(address _to, uint256 _value) external returns (bool success);\n\n /// @notice send `_value` token to `_to` from `_from` on the condition it is approved by `_from`\n /// @param _from The address of the sender\n /// @param _to The address of the recipient\n /// @param _value The amount of token to be transferred\n /// @return success Whether the transfer was successful or not\n function transferFrom(address _from, address _to, uint256 _value) external returns (bool success);\n\n /// @notice `msg.sender` approves `_spender` to spend `_value` tokens\n /// @param _spender The address of the account able to transfer the tokens\n /// @param _value The amount of tokens to be approved for transfer\n /// @return success Whether the approval was successful or not\n function approve(address _spender, uint256 _value) external returns (bool success);\n\n /// @param _owner The address of the account owning tokens\n /// @param _spender The address of the account able to transfer the tokens\n /// @return remaining Amount of remaining tokens allowed to spent\n function allowance(address _owner, address _spender) external view returns (uint256 remaining);\n\n // solhint-disable-next-line no-simple-event-func-name\n event Transfer(address indexed _from, address indexed _to, uint256 _value);\n event Approval(address indexed _owner, address indexed _spender, uint256 _value);\n event Mint(address indexed _account, uint256 _amount);\n event Burn(address indexed _account, uint256 _amount);\n}\n" - }, - "contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1MultiMessageRelayer.sol": { - "content": "// SPDX-License-Identifier: MIT\n// @unsupported: ovm\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n/* Interface Imports */\nimport { iOVM_L1CrossDomainMessenger } from \"../../../iOVM/bridge/messaging/iOVM_L1CrossDomainMessenger.sol\";\nimport { iOVM_L1MultiMessageRelayer } from \"../../../iOVM/bridge/messaging/iOVM_L1MultiMessageRelayer.sol\";\n\n/* Contract Imports */\nimport { Lib_AddressResolver } from \"../../../libraries/resolver/Lib_AddressResolver.sol\";\n\n\n/**\n * @title OVM_L1MultiMessageRelayer\n * @dev The L1 Multi-Message Relayer contract is a gas efficiency optimization which enables the \n * relayer to submit multiple messages in a single transaction to be relayed by the L1 Cross Domain\n * Message Sender.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract OVM_L1MultiMessageRelayer is iOVM_L1MultiMessageRelayer, Lib_AddressResolver {\n\n /***************\n * Constructor *\n ***************/\n constructor(\n address _libAddressManager\n ) \n Lib_AddressResolver(_libAddressManager)\n {}\n\n /**********************\n * Function Modifiers *\n **********************/\n\n modifier onlyBatchRelayer() {\n require(\n msg.sender == resolve(\"OVM_L2BatchMessageRelayer\"),\n \"OVM_L1MultiMessageRelayer: Function can only be called by the OVM_L2BatchMessageRelayer\"\n );\n _;\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @notice Forwards multiple cross domain messages to the L1 Cross Domain Messenger for relaying\n * @param _messages An array of L2 to L1 messages\n */\n function batchRelayMessages(L2ToL1Message[] calldata _messages) \n override\n external\n onlyBatchRelayer \n {\n iOVM_L1CrossDomainMessenger messenger = iOVM_L1CrossDomainMessenger(resolve(\"Proxy__OVM_L1CrossDomainMessenger\"));\n for (uint256 i = 0; i < _messages.length; i++) {\n L2ToL1Message memory message = _messages[i];\n messenger.relayMessage(\n message.target,\n message.sender,\n message.message,\n message.messageNonce,\n message.proof\n );\n }\n }\n}\n" - }, - "contracts/optimistic-ethereum/iOVM/bridge/messaging/iOVM_L1MultiMessageRelayer.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Interface Imports */\nimport { iOVM_L1CrossDomainMessenger } from \"../../../iOVM/bridge/messaging/iOVM_L1CrossDomainMessenger.sol\";\ninterface iOVM_L1MultiMessageRelayer {\n\n struct L2ToL1Message {\n address target;\n address sender;\n bytes message;\n uint256 messageNonce;\n iOVM_L1CrossDomainMessenger.L2MessageInclusionProof proof;\n }\n\n function batchRelayMessages(L2ToL1Message[] calldata _messages) external; \n}\n" - }, - "contracts/test-libraries/trie/TestLib_SecureMerkleTrie.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_SecureMerkleTrie } from \"../../optimistic-ethereum/libraries/trie/Lib_SecureMerkleTrie.sol\";\n\n/**\n * @title TestLib_SecureMerkleTrie\n */\ncontract TestLib_SecureMerkleTrie {\n\n function verifyInclusionProof(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n )\n public\n pure\n returns (\n bool\n )\n {\n return Lib_SecureMerkleTrie.verifyInclusionProof(\n _key,\n _value,\n _proof,\n _root\n );\n }\n\n function verifyExclusionProof(\n bytes memory _key,\n bytes memory _proof,\n bytes32 _root\n )\n public\n pure\n returns (\n bool\n )\n {\n return Lib_SecureMerkleTrie.verifyExclusionProof(\n _key,\n _proof,\n _root\n );\n }\n\n function update(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n )\n public\n pure\n returns (\n bytes32\n )\n {\n return Lib_SecureMerkleTrie.update(\n _key,\n _value,\n _proof,\n _root\n );\n }\n\n function get(\n bytes memory _key,\n bytes memory _proof,\n bytes32 _root\n )\n public\n pure\n returns (\n bool,\n bytes memory\n )\n {\n return Lib_SecureMerkleTrie.get(\n _key,\n _proof,\n _root\n );\n }\n\n function getSingleNodeRootHash(\n bytes memory _key,\n bytes memory _value\n )\n public\n pure\n returns (\n bytes32\n )\n {\n return Lib_SecureMerkleTrie.getSingleNodeRootHash(\n _key,\n _value\n );\n }\n}\n" - }, - "contracts/test-libraries/trie/TestLib_MerkleTrie.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Library Imports */\nimport { Lib_MerkleTrie } from \"../../optimistic-ethereum/libraries/trie/Lib_MerkleTrie.sol\";\n\n/**\n * @title TestLib_MerkleTrie\n */\ncontract TestLib_MerkleTrie {\n\n function verifyInclusionProof(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n )\n public\n pure\n returns (\n bool\n )\n {\n return Lib_MerkleTrie.verifyInclusionProof(\n _key,\n _value,\n _proof,\n _root\n );\n }\n\n function verifyExclusionProof(\n bytes memory _key,\n bytes memory _proof,\n bytes32 _root\n )\n public\n pure\n returns (\n bool\n )\n {\n return Lib_MerkleTrie.verifyExclusionProof(\n _key,\n _proof,\n _root\n );\n }\n\n function update(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n )\n public\n pure\n returns (\n bytes32\n )\n {\n return Lib_MerkleTrie.update(\n _key,\n _value,\n _proof,\n _root\n );\n }\n\n function get(\n bytes memory _key,\n bytes memory _proof,\n bytes32 _root\n )\n public\n pure\n returns (\n bool,\n bytes memory\n )\n {\n return Lib_MerkleTrie.get(\n _key,\n _proof,\n _root\n );\n }\n\n function getSingleNodeRootHash(\n bytes memory _key,\n bytes memory _value\n )\n public\n pure\n returns (\n bytes32\n )\n {\n return Lib_MerkleTrie.getSingleNodeRootHash(\n _key,\n _value\n );\n }\n}\n" - }, - "contracts/test-libraries/rlp/TestLib_RLPWriter.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_RLPWriter } from \"../../optimistic-ethereum/libraries/rlp/Lib_RLPWriter.sol\";\nimport { TestERC20 } from \"../../test-helpers/TestERC20.sol\";\n\n/**\n * @title TestLib_RLPWriter\n */\ncontract TestLib_RLPWriter {\n\n function writeBytes(\n bytes memory _in\n )\n public\n pure\n returns (\n bytes memory _out\n )\n {\n return Lib_RLPWriter.writeBytes(_in);\n }\n\n function writeList(\n bytes[] memory _in\n )\n public\n pure\n returns (\n bytes memory _out\n )\n {\n return Lib_RLPWriter.writeList(_in);\n }\n\n function writeString(\n string memory _in\n )\n public\n pure\n returns (\n bytes memory _out\n )\n {\n return Lib_RLPWriter.writeString(_in);\n }\n\n function writeAddress(\n address _in\n )\n public\n pure\n returns (\n bytes memory _out\n )\n {\n return Lib_RLPWriter.writeAddress(_in);\n }\n\n function writeUint(\n uint256 _in\n )\n public\n pure\n returns (\n bytes memory _out\n )\n {\n return Lib_RLPWriter.writeUint(_in);\n }\n\n function writeBool(\n bool _in\n )\n public\n pure\n returns (\n bytes memory _out\n )\n {\n return Lib_RLPWriter.writeBool(_in);\n }\n\n function writeAddressWithTaintedMemory(\n address _in\n )\n public\n returns (\n bytes memory _out\n )\n {\n new TestERC20();\n return Lib_RLPWriter.writeAddress(_in);\n }\n}\n" - }, - "contracts/test-helpers/TestERC20.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n// a test ERC20 token with an open mint function\ncontract TestERC20 {\n using SafeMath for uint;\n\n string public constant name = 'Test';\n string public constant symbol = 'TST';\n uint8 public constant decimals = 18;\n uint256 public totalSupply;\n mapping(address => uint) public balanceOf;\n mapping(address => mapping(address => uint)) public allowance;\n\n event Approval(address indexed owner, address indexed spender, uint256 value);\n event Transfer(address indexed from, address indexed to, uint256 value);\n\n constructor() {}\n\n function mint(address to, uint256 value) public {\n totalSupply = totalSupply.add(value);\n balanceOf[to] = balanceOf[to].add(value);\n emit Transfer(address(0), to, value);\n }\n\n function _approve(address owner, address spender, uint256 value) private {\n allowance[owner][spender] = value;\n emit Approval(owner, spender, value);\n }\n\n function _transfer(address from, address to, uint256 value) private {\n balanceOf[from] = balanceOf[from].sub(value);\n balanceOf[to] = balanceOf[to].add(value);\n emit Transfer(from, to, value);\n }\n\n function approve(address spender, uint256 value) external returns (bool) {\n _approve(msg.sender, spender, value);\n return true;\n }\n\n function transfer(address to, uint256 value) external returns (bool) {\n _transfer(msg.sender, to, value);\n return true;\n }\n\n function transferFrom(address from, address to, uint256 value) external returns (bool) {\n if (allowance[from][msg.sender] != uint(-1)) {\n allowance[from][msg.sender] = allowance[from][msg.sender].sub(value);\n }\n _transfer(from, to, value);\n return true;\n }\n}\n\nlibrary SafeMath {\n function add(uint256 x, uint256 y) internal pure returns (uint256 z) {\n require((z = x + y) >= x, 'ds-math-add-overflow');\n }\n\n function sub(uint256 x, uint256 y) internal pure returns (uint256 z) {\n require((z = x - y) <= x, 'ds-math-sub-underflow');\n }\n\n function mul(uint256 x, uint256 y) internal pure returns (uint256 z) {\n require(y == 0 || (z = x * y) / y == x, 'ds-math-mul-overflow');\n }\n}\n" - }, - "contracts/test-libraries/utils/TestLib_BytesUtils.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_BytesUtils } from \"../../optimistic-ethereum/libraries/utils/Lib_BytesUtils.sol\";\nimport { TestERC20 } from \"../../test-helpers/TestERC20.sol\";\n\n/**\n * @title TestLib_BytesUtils\n */\ncontract TestLib_BytesUtils {\n\n function concat(\n bytes memory _preBytes,\n bytes memory _postBytes\n )\n public\n pure\n returns (bytes memory)\n {\n return abi.encodePacked(\n _preBytes,\n _postBytes\n );\n }\n\n function slice(\n bytes memory _bytes,\n uint256 _start,\n uint256 _length\n )\n public\n pure\n returns (bytes memory)\n {\n return Lib_BytesUtils.slice(\n _bytes,\n _start,\n _length\n );\n }\n\n function toBytes32(\n bytes memory _bytes\n )\n public\n pure\n returns (bytes32)\n {\n return Lib_BytesUtils.toBytes32(\n _bytes\n );\n }\n\n function toUint256(\n bytes memory _bytes\n )\n public\n pure\n returns (uint256)\n {\n return Lib_BytesUtils.toUint256(\n _bytes\n );\n }\n\n function toNibbles(\n bytes memory _bytes\n )\n public\n pure\n returns (bytes memory)\n {\n return Lib_BytesUtils.toNibbles(\n _bytes\n );\n }\n\n function fromNibbles(\n bytes memory _bytes\n )\n public\n pure\n returns (bytes memory)\n {\n return Lib_BytesUtils.fromNibbles(\n _bytes\n );\n }\n\n function equal(\n bytes memory _bytes,\n bytes memory _other\n )\n public\n pure\n returns (bool)\n {\n return Lib_BytesUtils.equal(\n _bytes,\n _other\n );\n }\n\n function sliceWithTaintedMemory(\n bytes memory _bytes,\n uint256 _start,\n uint256 _length\n )\n public\n returns (bytes memory)\n {\n new TestERC20();\n return Lib_BytesUtils.slice(\n _bytes,\n _start,\n _length\n );\n }\n}\n" - }, - "contracts/test-libraries/utils/TestLib_EthUtils.sol": { - "content": "// SPDX-License-Identifier: MIT\n// @unsupported: ovm\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_EthUtils } from \"../../optimistic-ethereum/libraries/utils/Lib_EthUtils.sol\";\n\n/**\n * @title TestLib_EthUtils\n */\ncontract TestLib_EthUtils {\n\n function getCode(\n address _address,\n uint256 _offset,\n uint256 _length\n )\n public\n view\n returns (\n bytes memory _code\n )\n {\n return Lib_EthUtils.getCode(\n _address,\n _offset,\n _length\n );\n }\n\n function getCode(\n address _address\n )\n public\n view\n returns (\n bytes memory _code\n )\n {\n return Lib_EthUtils.getCode(\n _address\n );\n }\n\n function getCodeSize(\n address _address\n )\n public\n view\n returns (\n uint256 _codeSize\n )\n {\n return Lib_EthUtils.getCodeSize(\n _address\n );\n }\n\n function getCodeHash(\n address _address\n )\n public\n view\n returns (\n bytes32 _codeHash\n )\n {\n return Lib_EthUtils.getCodeHash(\n _address\n );\n }\n\n function createContract(\n bytes memory _code\n )\n public\n returns (\n address _created\n )\n {\n return Lib_EthUtils.createContract(\n _code\n );\n }\n\n function getAddressForCREATE(\n address _creator,\n uint256 _nonce\n )\n public\n pure\n returns (\n address _address\n )\n {\n return Lib_EthUtils.getAddressForCREATE(\n _creator,\n _nonce\n );\n }\n\n function getAddressForCREATE2(\n address _creator,\n bytes memory _bytecode,\n bytes32 _salt\n )\n public\n pure\n returns (address _address)\n {\n return Lib_EthUtils.getAddressForCREATE2(\n _creator,\n _bytecode,\n _salt\n );\n }\n}\n" - }, - "contracts/test-libraries/utils/TestLib_Bytes32Utils.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Library Imports */\nimport { Lib_Bytes32Utils } from \"../../optimistic-ethereum/libraries/utils/Lib_Bytes32Utils.sol\";\n\n/**\n * @title TestLib_Byte32Utils\n */\ncontract TestLib_Bytes32Utils {\n\n function toBool(\n bytes32 _in\n )\n public\n pure\n returns (\n bool _out\n )\n {\n return Lib_Bytes32Utils.toBool(_in);\n }\n\n function fromBool(\n bool _in\n )\n public\n pure\n returns (\n bytes32 _out\n )\n {\n return Lib_Bytes32Utils.fromBool(_in);\n }\n\n function toAddress(\n bytes32 _in\n )\n public\n pure\n returns (\n address _out\n )\n {\n return Lib_Bytes32Utils.toAddress(_in);\n }\n\n function fromAddress(\n address _in\n )\n public\n pure\n returns (\n bytes32 _out\n )\n {\n return Lib_Bytes32Utils.fromAddress(_in);\n }\n}\n" - }, - "contracts/test-libraries/rlp/TestLib_RLPReader.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_RLPReader } from \"../../optimistic-ethereum/libraries/rlp/Lib_RLPReader.sol\";\n\n/**\n * @title TestLib_RLPReader\n */\ncontract TestLib_RLPReader {\n\n function readList(\n bytes memory _in\n )\n public\n pure\n returns (\n bytes[] memory\n )\n {\n Lib_RLPReader.RLPItem[] memory decoded = Lib_RLPReader.readList(_in);\n bytes[] memory out = new bytes[](decoded.length);\n for (uint256 i = 0; i < out.length; i++) {\n out[i] = Lib_RLPReader.readRawBytes(decoded[i]);\n }\n return out;\n }\n\n function readString(\n bytes memory _in\n )\n public\n pure\n returns (\n string memory\n )\n {\n return Lib_RLPReader.readString(_in);\n }\n\n function readBytes(\n bytes memory _in\n )\n public\n pure\n returns (\n bytes memory\n )\n {\n return Lib_RLPReader.readBytes(_in);\n }\n\n function readBytes32(\n bytes memory _in\n )\n public\n pure\n returns (\n bytes32\n )\n {\n return Lib_RLPReader.readBytes32(_in);\n }\n\n function readUint256(\n bytes memory _in\n )\n public\n pure\n returns (\n uint256\n )\n {\n return Lib_RLPReader.readUint256(_in);\n }\n\n function readBool(\n bytes memory _in\n )\n public\n pure\n returns (\n bool\n )\n {\n return Lib_RLPReader.readBool(_in);\n }\n\n function readAddress(\n bytes memory _in\n )\n public\n pure\n returns (\n address\n )\n {\n return Lib_RLPReader.readAddress(_in);\n }\n}\n" - }, - "contracts/test-libraries/utils/TestLib_MerkleTree.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_MerkleTree } from \"../../optimistic-ethereum/libraries/utils/Lib_MerkleTree.sol\";\n\n/**\n * @title TestLib_MerkleTree\n */\ncontract TestLib_MerkleTree {\n\n function getMerkleRoot(\n bytes32[] memory _elements\n )\n public\n pure \n returns (\n bytes32\n )\n {\n return Lib_MerkleTree.getMerkleRoot(\n _elements\n );\n }\n\n function verify(\n bytes32 _root,\n bytes32 _leaf,\n uint256 _index,\n bytes32[] memory _siblings,\n uint256 _totalLeaves\n )\n public\n pure\n returns (\n bool\n )\n {\n return Lib_MerkleTree.verify(\n _root,\n _leaf,\n _index,\n _siblings,\n _totalLeaves\n );\n }\n}\n" - }, - "contracts/optimistic-ethereum/mockOVM/verification/mockOVM_BondManager.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Interface Imports */\nimport { iOVM_BondManager } from \"../../iOVM/verification/iOVM_BondManager.sol\";\n\n/* Contract Imports */\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/**\n * @title mockOVM_BondManager\n */\ncontract mockOVM_BondManager is iOVM_BondManager, Lib_AddressResolver {\n constructor(\n address _libAddressManager\n )\n Lib_AddressResolver(_libAddressManager)\n {}\n\n function recordGasSpent(\n bytes32 _preStateRoot,\n bytes32 _txHash,\n address _who,\n uint256 _gasSpent\n )\n override\n public\n {}\n\n function finalize(\n bytes32 _preStateRoot,\n address _publisher,\n uint256 _timestamp\n )\n override\n public\n {}\n\n function deposit()\n override\n public\n {}\n\n function startWithdrawal()\n override\n public\n {}\n\n function finalizeWithdrawal()\n override\n public\n {}\n\n function claim(\n address _who\n )\n override\n public\n {}\n\n function isCollateralized(\n address _who\n )\n override\n public\n view\n returns (\n bool\n )\n {\n // Only authenticate sequencer to submit state root batches.\n return _who == resolve(\"OVM_Proposer\");\n }\n\n function getGasSpent(\n bytes32, // _preStateRoot,\n address // _who\n )\n override\n public\n pure \n returns (\n uint256\n )\n {\n return 0;\n }\n}\n" - }, - "contracts/optimistic-ethereum/OVM/execution/OVM_StateManagerFactory.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Interface Imports */\nimport { iOVM_StateManager } from \"../../iOVM/execution/iOVM_StateManager.sol\";\nimport { iOVM_StateManagerFactory } from \"../../iOVM/execution/iOVM_StateManagerFactory.sol\";\n\n/* Contract Imports */\nimport { OVM_StateManager } from \"./OVM_StateManager.sol\";\n\n/**\n * @title OVM_StateManagerFactory\n * @dev The State Manager Factory is called by a State Transitioner's init code, to create a new\n * State Manager for use in the Fraud Verification process.\n * \n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract OVM_StateManagerFactory is iOVM_StateManagerFactory {\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Creates a new OVM_StateManager\n * @param _owner Owner of the created contract.\n * @return New OVM_StateManager instance.\n */\n function create(\n address _owner\n )\n override\n public\n returns (\n iOVM_StateManager\n )\n {\n return new OVM_StateManager(_owner);\n }\n}\n" - }, - "contracts/optimistic-ethereum/OVM/execution/OVM_StateManager.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/* Interface Imports */\nimport { iOVM_StateManager } from \"../../iOVM/execution/iOVM_StateManager.sol\";\n\n/**\n * @title OVM_StateManager\n * @dev The State Manager contract holds all storage values for contracts in the OVM. It can only be written to by the\n * the Execution Manager and State Transitioner. It runs on L1 during the setup and execution of a fraud proof.\n * The same logic runs on L2, but has been implemented as a precompile in the L2 go-ethereum client\n * (see https://github.com/ethereum-optimism/go-ethereum/blob/master/core/vm/ovm_state_manager.go).\n * \n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract OVM_StateManager is iOVM_StateManager {\n\n /*************\n * Constants *\n *************/\n\n bytes32 constant internal EMPTY_ACCOUNT_STORAGE_ROOT = 0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421;\n bytes32 constant internal EMPTY_ACCOUNT_CODE_HASH = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;\n bytes32 constant internal STORAGE_XOR_VALUE = 0xFEEDFACECAFEBEEFFEEDFACECAFEBEEFFEEDFACECAFEBEEFFEEDFACECAFEBEEF;\n\n\n /*************\n * Variables *\n *************/\n\n address override public owner;\n address override public ovmExecutionManager;\n mapping (address => Lib_OVMCodec.Account) internal accounts;\n mapping (address => mapping (bytes32 => bytes32)) internal contractStorage;\n mapping (address => mapping (bytes32 => bool)) internal verifiedContractStorage;\n mapping (bytes32 => ItemState) internal itemStates;\n uint256 internal totalUncommittedAccounts;\n uint256 internal totalUncommittedContractStorage;\n\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _owner Address of the owner of this contract.\n */\n constructor(\n address _owner\n )\n {\n owner = _owner;\n }\n\n\n /**********************\n * Function Modifiers *\n **********************/\n\n /**\n * Simple authentication, this contract should only be accessible to the owner (which is expected to be the State Transitioner during `PRE_EXECUTION` \n * or the OVM_ExecutionManager during transaction execution.\n */\n modifier authenticated() {\n // owner is the State Transitioner\n require(\n msg.sender == owner || msg.sender == ovmExecutionManager,\n \"Function can only be called by authenticated addresses\"\n );\n _;\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Checks whether a given address is allowed to modify this contract.\n * @param _address Address to check.\n * @return Whether or not the address can modify this contract.\n */\n function isAuthenticated(\n address _address\n )\n override\n public\n view\n returns (\n bool\n )\n {\n return (_address == owner || _address == ovmExecutionManager);\n }\n\n /**\n * Sets the address of the OVM_ExecutionManager.\n * @param _ovmExecutionManager Address of the OVM_ExecutionManager.\n */\n function setExecutionManager(\n address _ovmExecutionManager\n )\n override\n public\n authenticated\n {\n ovmExecutionManager = _ovmExecutionManager;\n }\n\n /**\n * Inserts an account into the state.\n * @param _address Address of the account to insert.\n * @param _account Account to insert for the given address.\n */\n function putAccount(\n address _address,\n Lib_OVMCodec.Account memory _account\n )\n override\n public\n authenticated\n {\n accounts[_address] = _account;\n }\n\n /**\n * Marks an account as empty.\n * @param _address Address of the account to mark.\n */\n function putEmptyAccount(\n address _address\n )\n override\n public\n authenticated\n {\n Lib_OVMCodec.Account storage account = accounts[_address];\n account.storageRoot = EMPTY_ACCOUNT_STORAGE_ROOT;\n account.codeHash = EMPTY_ACCOUNT_CODE_HASH;\n }\n\n /**\n * Retrieves an account from the state.\n * @param _address Address of the account to retrieve.\n * @return Account for the given address.\n */\n function getAccount(\n address _address\n )\n override\n public\n view\n returns (\n Lib_OVMCodec.Account memory\n )\n {\n return accounts[_address];\n }\n\n /**\n * Checks whether the state has a given account.\n * @param _address Address of the account to check.\n * @return Whether or not the state has the account.\n */\n function hasAccount(\n address _address\n )\n override\n public\n view\n returns (\n bool\n )\n {\n return accounts[_address].codeHash != bytes32(0);\n }\n\n /**\n * Checks whether the state has a given known empty account.\n * @param _address Address of the account to check.\n * @return Whether or not the state has the empty account.\n */\n function hasEmptyAccount(\n address _address\n )\n override\n public\n view\n returns (\n bool\n )\n {\n return (\n accounts[_address].codeHash == EMPTY_ACCOUNT_CODE_HASH\n && accounts[_address].nonce == 0\n );\n }\n\n /**\n * Sets the nonce of an account.\n * @param _address Address of the account to modify.\n * @param _nonce New account nonce.\n */\n function setAccountNonce(\n address _address,\n uint256 _nonce\n )\n override\n public\n authenticated\n {\n accounts[_address].nonce = _nonce;\n }\n\n /**\n * Gets the nonce of an account.\n * @param _address Address of the account to access.\n * @return Nonce of the account.\n */\n function getAccountNonce(\n address _address\n )\n override\n public\n view\n returns (\n uint256\n )\n {\n return accounts[_address].nonce;\n }\n\n /**\n * Retrieves the Ethereum address of an account.\n * @param _address Address of the account to access.\n * @return Corresponding Ethereum address.\n */\n function getAccountEthAddress(\n address _address\n )\n override\n public\n view\n returns (\n address\n )\n {\n return accounts[_address].ethAddress;\n }\n\n /**\n * Retrieves the storage root of an account.\n * @param _address Address of the account to access.\n * @return Corresponding storage root.\n */\n function getAccountStorageRoot(\n address _address\n )\n override\n public\n view\n returns (\n bytes32\n )\n {\n return accounts[_address].storageRoot;\n }\n\n /**\n * Initializes a pending account (during CREATE or CREATE2) with the default values.\n * @param _address Address of the account to initialize.\n */\n function initPendingAccount(\n address _address\n )\n override\n public\n authenticated\n {\n Lib_OVMCodec.Account storage account = accounts[_address];\n account.nonce = 1;\n account.storageRoot = EMPTY_ACCOUNT_STORAGE_ROOT;\n account.codeHash = EMPTY_ACCOUNT_CODE_HASH;\n account.isFresh = true;\n }\n\n /**\n * Finalizes the creation of a pending account (during CREATE or CREATE2).\n * @param _address Address of the account to finalize.\n * @param _ethAddress Address of the account's associated contract on Ethereum.\n * @param _codeHash Hash of the account's code.\n */\n function commitPendingAccount(\n address _address,\n address _ethAddress,\n bytes32 _codeHash\n )\n override\n public\n authenticated\n {\n Lib_OVMCodec.Account storage account = accounts[_address];\n account.ethAddress = _ethAddress;\n account.codeHash = _codeHash;\n }\n\n /**\n * Checks whether an account has already been retrieved, and marks it as retrieved if not.\n * @param _address Address of the account to check.\n * @return Whether or not the account was already loaded.\n */\n function testAndSetAccountLoaded(\n address _address\n )\n override\n public\n authenticated\n returns (\n bool\n )\n {\n return _testAndSetItemState(\n _getItemHash(_address),\n ItemState.ITEM_LOADED\n );\n }\n\n /**\n * Checks whether an account has already been modified, and marks it as modified if not.\n * @param _address Address of the account to check.\n * @return Whether or not the account was already modified.\n */\n function testAndSetAccountChanged(\n address _address\n )\n override\n public\n authenticated\n returns (\n bool\n )\n {\n return _testAndSetItemState(\n _getItemHash(_address),\n ItemState.ITEM_CHANGED\n );\n }\n\n /**\n * Attempts to mark an account as committed.\n * @param _address Address of the account to commit.\n * @return Whether or not the account was committed.\n */\n function commitAccount(\n address _address\n )\n override\n public\n authenticated\n returns (\n bool\n )\n {\n bytes32 item = _getItemHash(_address);\n if (itemStates[item] != ItemState.ITEM_CHANGED) {\n return false;\n }\n\n itemStates[item] = ItemState.ITEM_COMMITTED;\n totalUncommittedAccounts -= 1;\n\n return true;\n }\n\n /**\n * Increments the total number of uncommitted accounts.\n */\n function incrementTotalUncommittedAccounts()\n override\n public\n authenticated\n {\n totalUncommittedAccounts += 1;\n }\n\n /**\n * Gets the total number of uncommitted accounts.\n * @return Total uncommitted accounts.\n */\n function getTotalUncommittedAccounts()\n override\n public\n view\n returns (\n uint256\n )\n {\n return totalUncommittedAccounts;\n }\n\n /**\n * Checks whether a given account was changed during execution.\n * @param _address Address to check.\n * @return Whether or not the account was changed.\n */\n function wasAccountChanged(\n address _address\n )\n override\n public\n view\n returns (\n bool\n )\n {\n bytes32 item = _getItemHash(_address);\n return itemStates[item] >= ItemState.ITEM_CHANGED;\n }\n\n /**\n * Checks whether a given account was committed after execution.\n * @param _address Address to check.\n * @return Whether or not the account was committed.\n */\n function wasAccountCommitted(\n address _address\n )\n override\n public\n view\n returns (\n bool\n )\n {\n bytes32 item = _getItemHash(_address);\n return itemStates[item] >= ItemState.ITEM_COMMITTED;\n }\n\n\n /************************************\n * Public Functions: Storage Access *\n ************************************/\n\n /**\n * Changes a contract storage slot value.\n * @param _contract Address of the contract to modify.\n * @param _key 32 byte storage slot key.\n * @param _value 32 byte storage slot value.\n */\n function putContractStorage(\n address _contract,\n bytes32 _key,\n bytes32 _value\n )\n override\n public\n authenticated\n {\n // A hilarious optimization. `SSTORE`ing a value of `bytes32(0)` is common enough that it's\n // worth populating this with a non-zero value in advance (during the fraud proof\n // initialization phase) to cut the execution-time cost down to 5000 gas.\n contractStorage[_contract][_key] = _value ^ STORAGE_XOR_VALUE;\n\n // Only used when initially populating the contract storage. OVM_ExecutionManager will\n // perform a `hasContractStorage` INVALID_STATE_ACCESS check before putting any contract\n // storage because writing to zero when the actual value is nonzero causes a gas\n // discrepancy. Could be moved into a new `putVerifiedContractStorage` function, or\n // something along those lines.\n if (verifiedContractStorage[_contract][_key] == false) {\n verifiedContractStorage[_contract][_key] = true;\n }\n }\n\n /**\n * Retrieves a contract storage slot value.\n * @param _contract Address of the contract to access.\n * @param _key 32 byte storage slot key.\n * @return 32 byte storage slot value.\n */\n function getContractStorage(\n address _contract,\n bytes32 _key\n )\n override\n public\n view\n returns (\n bytes32\n )\n {\n // Storage XOR system doesn't work for newly created contracts that haven't set this\n // storage slot value yet.\n if (\n verifiedContractStorage[_contract][_key] == false\n && accounts[_contract].isFresh\n ) {\n return bytes32(0);\n }\n\n // See `putContractStorage` for more information about the XOR here.\n return contractStorage[_contract][_key] ^ STORAGE_XOR_VALUE;\n }\n\n /**\n * Checks whether a contract storage slot exists in the state.\n * @param _contract Address of the contract to access.\n * @param _key 32 byte storage slot key.\n * @return Whether or not the key was set in the state.\n */\n function hasContractStorage(\n address _contract,\n bytes32 _key\n )\n override\n public\n view\n returns (\n bool\n )\n {\n return verifiedContractStorage[_contract][_key] || accounts[_contract].isFresh;\n }\n\n /**\n * Checks whether a storage slot has already been retrieved, and marks it as retrieved if not.\n * @param _contract Address of the contract to check.\n * @param _key 32 byte storage slot key.\n * @return Whether or not the slot was already loaded.\n */\n function testAndSetContractStorageLoaded(\n address _contract,\n bytes32 _key\n )\n override\n public\n authenticated\n returns (\n bool\n )\n {\n return _testAndSetItemState(\n _getItemHash(_contract, _key),\n ItemState.ITEM_LOADED\n );\n }\n\n /**\n * Checks whether a storage slot has already been modified, and marks it as modified if not.\n * @param _contract Address of the contract to check.\n * @param _key 32 byte storage slot key.\n * @return Whether or not the slot was already modified.\n */\n function testAndSetContractStorageChanged(\n address _contract,\n bytes32 _key\n )\n override\n public\n authenticated\n returns (\n bool\n )\n {\n return _testAndSetItemState(\n _getItemHash(_contract, _key),\n ItemState.ITEM_CHANGED\n );\n }\n\n /**\n * Attempts to mark a storage slot as committed.\n * @param _contract Address of the account to commit.\n * @param _key 32 byte slot key to commit.\n * @return Whether or not the slot was committed.\n */\n function commitContractStorage(\n address _contract,\n bytes32 _key\n )\n override\n public\n authenticated\n returns (\n bool\n )\n {\n bytes32 item = _getItemHash(_contract, _key);\n if (itemStates[item] != ItemState.ITEM_CHANGED) {\n return false;\n }\n\n itemStates[item] = ItemState.ITEM_COMMITTED;\n totalUncommittedContractStorage -= 1;\n\n return true;\n }\n\n /**\n * Increments the total number of uncommitted storage slots.\n */\n function incrementTotalUncommittedContractStorage()\n override\n public\n authenticated\n {\n totalUncommittedContractStorage += 1;\n }\n\n /**\n * Gets the total number of uncommitted storage slots.\n * @return Total uncommitted storage slots.\n */\n function getTotalUncommittedContractStorage()\n override\n public\n view\n returns (\n uint256\n )\n {\n return totalUncommittedContractStorage;\n }\n\n /**\n * Checks whether a given storage slot was changed during execution.\n * @param _contract Address to check.\n * @param _key Key of the storage slot to check.\n * @return Whether or not the storage slot was changed.\n */\n function wasContractStorageChanged(\n address _contract,\n bytes32 _key\n )\n override\n public\n view\n returns (\n bool\n )\n {\n bytes32 item = _getItemHash(_contract, _key);\n return itemStates[item] >= ItemState.ITEM_CHANGED;\n }\n\n /**\n * Checks whether a given storage slot was committed after execution.\n * @param _contract Address to check.\n * @param _key Key of the storage slot to check.\n * @return Whether or not the storage slot was committed.\n */\n function wasContractStorageCommitted(\n address _contract,\n bytes32 _key\n )\n override\n public\n view\n returns (\n bool\n )\n {\n bytes32 item = _getItemHash(_contract, _key);\n return itemStates[item] >= ItemState.ITEM_COMMITTED;\n }\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Generates a unique hash for an address.\n * @param _address Address to generate a hash for.\n * @return Unique hash for the given address.\n */\n function _getItemHash(\n address _address\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n return keccak256(abi.encodePacked(_address));\n }\n\n /**\n * Generates a unique hash for an address/key pair.\n * @param _contract Address to generate a hash for.\n * @param _key Key to generate a hash for.\n * @return Unique hash for the given pair.\n */\n function _getItemHash(\n address _contract,\n bytes32 _key\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n return keccak256(abi.encodePacked(\n _contract,\n _key\n ));\n }\n\n /**\n * Checks whether an item is in a particular state (ITEM_LOADED or ITEM_CHANGED) and sets the\n * item to the provided state if not.\n * @param _item 32 byte item ID to check.\n * @param _minItemState Minimum state that must be satisfied by the item.\n * @return Whether or not the item was already in the state.\n */\n function _testAndSetItemState(\n bytes32 _item,\n ItemState _minItemState\n )\n internal\n returns (\n bool\n )\n {\n bool wasItemState = itemStates[_item] >= _minItemState;\n\n if (wasItemState == false) {\n itemStates[_item] = _minItemState;\n }\n\n return wasItemState;\n }\n}\n" - }, - "contracts/optimistic-ethereum/mockOVM/accounts/mockOVM_ECDSAContractAccount.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Interface Imports */\nimport { iOVM_ECDSAContractAccount } from \"../../iOVM/accounts/iOVM_ECDSAContractAccount.sol\";\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_ECDSAUtils } from \"../../libraries/utils/Lib_ECDSAUtils.sol\";\nimport { Lib_SafeExecutionManagerWrapper } from \"../../libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\";\n\n/**\n * @title mockOVM_ECDSAContractAccount\n */\ncontract mockOVM_ECDSAContractAccount is iOVM_ECDSAContractAccount {\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Executes a signed transaction.\n * @param _transaction Signed EOA transaction.\n * @param _signatureType Hashing scheme used for the transaction (e.g., ETH signed message).\n * param _v Signature `v` parameter.\n * param _r Signature `r` parameter.\n * param _s Signature `s` parameter.\n * @return _success Whether or not the call returned (rather than reverted).\n * @return _returndata Data returned by the call.\n */\n function execute(\n bytes memory _transaction,\n Lib_OVMCodec.EOASignatureType _signatureType,\n uint8, // _v,\n bytes32, // _r,\n bytes32 // _s\n )\n override\n public\n returns (\n bool _success,\n bytes memory _returndata\n )\n {\n bool isEthSign = _signatureType == Lib_OVMCodec.EOASignatureType.ETH_SIGNED_MESSAGE;\n Lib_OVMCodec.EIP155Transaction memory decodedTx = Lib_OVMCodec.decodeEIP155Transaction(_transaction, isEthSign);\n\n // Need to make sure that the transaction nonce is right.\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(\n decodedTx.nonce == Lib_SafeExecutionManagerWrapper.safeGETNONCE(),\n \"Transaction nonce does not match the expected nonce.\"\n );\n\n // Contract creations are signalled by sending a transaction to the zero address.\n if (decodedTx.to == address(0)) {\n (address created, ) = Lib_SafeExecutionManagerWrapper.safeCREATE(\n decodedTx.gasLimit,\n decodedTx.data\n );\n\n // If the created address is the ZERO_ADDRESS then we know the deployment failed, though not why\n return (created != address(0), abi.encode(created));\n } else {\n // We only want to bump the nonce for `ovmCALL` because `ovmCREATE` automatically bumps\n // the nonce of the calling account. Normally an EOA would bump the nonce for both\n // cases, but since this is a contract we'd end up bumping the nonce twice.\n Lib_SafeExecutionManagerWrapper.safeINCREMENTNONCE();\n\n return Lib_SafeExecutionManagerWrapper.safeCALL(\n decodedTx.gasLimit,\n decodedTx.to,\n decodedTx.data\n );\n }\n }\n\n function qall(\n uint256 _gasLimit,\n address _to,\n bytes memory _data\n )\n public\n returns (\n bool _success,\n bytes memory _returndata\n )\n {\n return Lib_SafeExecutionManagerWrapper.safeCALL(\n _gasLimit,\n _to,\n _data\n );\n }\n}\n" - }, - "contracts/optimistic-ethereum/OVM/predeploys/OVM_ProxySequencerEntrypoint.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Library Imports */\nimport { Lib_SafeExecutionManagerWrapper } from \"../../libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\";\n\n/**\n * @title OVM_ProxySequencerEntrypoint \n * @dev The Proxy Sequencer Entrypoint is a predeployed proxy to the implementation of the \n * Sequencer Entrypoint. This will enable the Optimism team to upgrade the Sequencer Entrypoint \n * contract.\n * \n * Compiler used: solc\n * Runtime target: OVM\n */\ncontract OVM_ProxySequencerEntrypoint {\n\n /*********************\n * Fallback Function *\n *********************/\n\n fallback()\n external\n {\n Lib_SafeExecutionManagerWrapper.safeDELEGATECALL(\n gasleft(),\n _getImplementation(),\n msg.data\n );\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n function init(\n address _implementation,\n address _owner\n )\n external\n {\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(\n _getOwner() == address(0),\n \"ProxySequencerEntrypoint has already been inited\"\n );\n _setOwner(_owner);\n _setImplementation(_implementation);\n }\n\n function upgrade(\n address _implementation\n )\n external\n {\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(\n _getOwner() == Lib_SafeExecutionManagerWrapper.safeCALLER(),\n \"Only owner can upgrade the Entrypoint\"\n );\n\n _setImplementation(_implementation);\n }\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n function _setImplementation(\n address _implementation\n )\n internal\n {\n Lib_SafeExecutionManagerWrapper.safeSSTORE(\n bytes32(uint256(0)),\n bytes32(uint256(uint160(_implementation)))\n );\n }\n\n function _getImplementation()\n internal\n returns (\n address _implementation\n )\n {\n return address(uint160(uint256(\n Lib_SafeExecutionManagerWrapper.safeSLOAD(\n bytes32(uint256(0))\n )\n )));\n }\n\n function _setOwner(\n address _owner\n )\n internal\n {\n Lib_SafeExecutionManagerWrapper.safeSSTORE(\n bytes32(uint256(1)),\n bytes32(uint256(uint160(_owner)))\n );\n }\n\n function _getOwner()\n internal\n returns (\n address _owner\n )\n {\n return address(uint160(uint256(\n Lib_SafeExecutionManagerWrapper.safeSLOAD(\n bytes32(uint256(1))\n )\n )));\n }\n}\n" - }, - "contracts/optimistic-ethereum/OVM/execution/OVM_SafetyChecker.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Interface Imports */\nimport { iOVM_SafetyChecker } from \"../../iOVM/execution/iOVM_SafetyChecker.sol\";\n\n/**\n * @title OVM_SafetyChecker\n * @dev The Safety Checker verifies that contracts deployed on L2 do not contain any\n * \"unsafe\" operations. An operation is considered unsafe if it would access state variables which\n * are specific to the environment (ie. L1 or L2) in which it is executed, as this could be used\n * to \"escape the sandbox\" of the OVM, resulting in non-deterministic fraud proofs. \n * That is, an attacker would be able to \"prove fraud\" on an honestly applied transaction.\n * Note that a \"safe\" contract requires opcodes to appear in a particular pattern;\n * omission of \"unsafe\" opcodes is necessary, but not sufficient.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract OVM_SafetyChecker is iOVM_SafetyChecker {\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Returns whether or not all of the provided bytecode is safe.\n * @param _bytecode The bytecode to safety check.\n * @return `true` if the bytecode is safe, `false` otherwise.\n */\n function isBytecodeSafe(\n bytes memory _bytecode\n )\n override\n external\n pure\n returns (\n bool\n )\n {\n // autogenerated by gen_safety_checker_constants.py\n // number of bytes to skip for each opcode\n uint256[8] memory opcodeSkippableBytes = [\n uint256(0x0001010101010101010101010000000001010101010101010101010101010000),\n uint256(0x0100000000000000000000000000000000000000010101010101000000010100),\n uint256(0x0000000000000000000000000000000001010101000000010101010100000000),\n uint256(0x0203040500000000000000000000000000000000000000000000000000000000),\n uint256(0x0101010101010101010101010101010101010101010101010101010101010101),\n uint256(0x0101010101000000000000000000000000000000000000000000000000000000),\n uint256(0x0000000000000000000000000000000000000000000000000000000000000000),\n uint256(0x0000000000000000000000000000000000000000000000000000000000000000)\n ];\n // Mask to gate opcode specific cases\n uint256 opcodeGateMask = ~uint256(0xffffffffffffffffffffffe000000000fffffffff070ffff9c0ffffec000f001);\n // Halting opcodes\n uint256 opcodeHaltingMask = ~uint256(0x4008000000000000000000000000000000000000004000000000000000000001);\n // PUSH opcodes\n uint256 opcodePushMask = ~uint256(0xffffffff000000000000000000000000);\n\n uint256 codeLength;\n uint256 _pc;\n assembly {\n _pc := add(_bytecode, 0x20)\n }\n codeLength = _pc + _bytecode.length;\n do {\n // current opcode: 0x00...0xff\n uint256 opNum;\n\n // inline assembly removes the extra add + bounds check\n assembly {\n let word := mload(_pc) //load the next 32 bytes at pc into word\n\n // Look up number of bytes to skip from opcodeSkippableBytes and then update indexInWord\n // E.g. the 02030405 in opcodeSkippableBytes is the number of bytes to skip for PUSH1->4\n // We repeat this 6 times, thus we can only skip bytes for up to PUSH4 ((1+4) * 6 = 30 < 32).\n // If we see an opcode that is listed as 0 skippable bytes e.g. PUSH5,\n // then we will get stuck on that indexInWord and then opNum will be set to the PUSH5 opcode.\n let indexInWord := byte(0, mload(add(opcodeSkippableBytes, byte(0, word))))\n indexInWord := add(indexInWord, byte(0, mload(add(opcodeSkippableBytes, byte(indexInWord, word)))))\n indexInWord := add(indexInWord, byte(0, mload(add(opcodeSkippableBytes, byte(indexInWord, word)))))\n indexInWord := add(indexInWord, byte(0, mload(add(opcodeSkippableBytes, byte(indexInWord, word)))))\n indexInWord := add(indexInWord, byte(0, mload(add(opcodeSkippableBytes, byte(indexInWord, word)))))\n indexInWord := add(indexInWord, byte(0, mload(add(opcodeSkippableBytes, byte(indexInWord, word)))))\n _pc := add(_pc, indexInWord)\n\n opNum := byte(indexInWord, word)\n }\n\n // + push opcodes\n // + stop opcodes [STOP(0x00),JUMP(0x56),RETURN(0xf3),INVALID(0xfe)]\n // + caller opcode CALLER(0x33)\n // + blacklisted opcodes\n uint256 opBit = 1 << opNum;\n if (opBit & opcodeGateMask == 0) {\n if (opBit & opcodePushMask == 0) {\n // all pushes are valid opcodes\n // subsequent bytes are not opcodes. Skip them.\n _pc += (opNum - 0x5e); // PUSH1 is 0x60, so opNum-0x5f = PUSHed bytes and we +1 to\n // skip the _pc++; line below in order to save gas ((-0x5f + 1) = -0x5e)\n continue;\n } else if (opBit & opcodeHaltingMask == 0) {\n // STOP or JUMP or RETURN or INVALID (Note: REVERT is blacklisted, so not included here)\n // We are now inside unreachable code until we hit a JUMPDEST!\n do {\n _pc++;\n assembly {\n opNum := byte(0, mload(_pc))\n }\n // encountered a JUMPDEST\n if (opNum == 0x5b) break;\n // skip PUSHed bytes\n if ((1 << opNum) & opcodePushMask == 0) _pc += (opNum - 0x5f); // opNum-0x5f = PUSHed bytes (PUSH1 is 0x60)\n } while (_pc < codeLength);\n // opNum is 0x5b, so we don't continue here since the pc++ is fine\n } else if (opNum == 0x33) { // Caller opcode\n uint256 firstOps; // next 32 bytes of bytecode\n uint256 secondOps; // following 32 bytes of bytecode\n\n assembly {\n firstOps := mload(_pc)\n // 37 bytes total, 5 left over --> 32 - 5 bytes = 27 bytes = 216 bits\n secondOps := shr(216, mload(add(_pc, 0x20)))\n }\n\n // Call identity precompile\n // CALLER POP PUSH1 0x00 PUSH1 0x04 GAS CALL\n // 32 - 8 bytes = 24 bytes = 192\n if ((firstOps >> 192) == 0x3350600060045af1) {\n _pc += 8;\n // Call EM and abort execution if instructed\n // CALLER PUSH1 0x00 SWAP1 GAS CALL PC PUSH1 0x0E ADD JUMPI RETURNDATASIZE PUSH1 0x00 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x00 REVERT JUMPDEST RETURNDATASIZE PUSH1 0x01 EQ ISZERO PC PUSH1 0x0a ADD JUMPI PUSH1 0x01 PUSH1 0x00 RETURN JUMPDEST \n } else if (firstOps == 0x336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a015760 && secondOps == 0x016000f35b) {\n _pc += 37;\n } else {\n return false;\n }\n continue;\n } else {\n // encountered a non-whitelisted opcode!\n return false;\n }\n }\n _pc++;\n } while (_pc < codeLength);\n return true;\n }\n}\n" - } - }, - "settings": { - "optimizer": { - "enabled": true, - "runs": 200 - }, - "outputSelection": { - "*": { - "*": [ - "storageLayout", - "abi", - "evm.bytecode", - "evm.deployedBytecode", - "evm.methodIdentifiers", - "metadata", - "devdoc", - "userdoc", - "evm.gasEstimates" - ], - "": [ - "ast" - ] - } - }, - "metadata": { - "useLiteralContent": true - } - } -} \ No newline at end of file diff --git a/packages/contracts/deployments/kovan-v1/Lib_AddressManager.json b/packages/contracts/deployments/kovan-v1/Lib_AddressManager.json deleted file mode 100644 index a990a6c1c81b4..0000000000000 --- a/packages/contracts/deployments/kovan-v1/Lib_AddressManager.json +++ /dev/null @@ -1,199 +0,0 @@ -{ - "address": "0x72e6F5244828C10737cbC9659378B207246D26B2", - "abi": [ - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "string", - "name": "_name", - "type": "string" - }, - { - "indexed": false, - "internalType": "address", - "name": "_newAddress", - "type": "address" - } - ], - "name": "AddressSet", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "previousOwner", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "newOwner", - "type": "address" - } - ], - "name": "OwnershipTransferred", - "type": "event" - }, - { - "inputs": [ - { - "internalType": "string", - "name": "_name", - "type": "string" - } - ], - "name": "getAddress", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "owner", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "renounceOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "string", - "name": "_name", - "type": "string" - }, - { - "internalType": "address", - "name": "_address", - "type": "address" - } - ], - "name": "setAddress", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_newOwner", - "type": "address" - } - ], - "name": "transferOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - } - ], - "transactionHash": "0x39342ffdce6e6c76b8fa6534d0e5f24ba0917ed09ab713ad0eef7eee73dd08ed", - "receipt": { - "to": null, - "from": "0x558ba9b8d78713fbf768c1f8a584485B4003f43F", - "contractAddress": "0xE630cdf302880783364334455C8352fE0aB5b748", - "transactionIndex": 3, - "gasUsed": "413938", - "logsBloom": "0x00000000000000000000000000000000000000000000000000800000000000000000000022000000000000000000000000000000000040000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000020000000000000000000800000000000000000000000000000000400040000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000001000000000000000000000000000000000000000000", - "blockHash": "0xf1c7969322d44cb9561c6af6b8499e1ee90e81c5e8e6409417454bf3d8bc598f", - "transactionHash": "0x39342ffdce6e6c76b8fa6534d0e5f24ba0917ed09ab713ad0eef7eee73dd08ed", - "logs": [ - { - "transactionIndex": 3, - "blockNumber": 4573376, - "transactionHash": "0x39342ffdce6e6c76b8fa6534d0e5f24ba0917ed09ab713ad0eef7eee73dd08ed", - "address": "0xE630cdf302880783364334455C8352fE0aB5b748", - "topics": [ - "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x000000000000000000000000558ba9b8d78713fbf768c1f8a584485b4003f43f" - ], - "data": "0x", - "logIndex": 9, - "blockHash": "0xf1c7969322d44cb9561c6af6b8499e1ee90e81c5e8e6409417454bf3d8bc598f" - } - ], - "blockNumber": 4573376, - "cumulativeGasUsed": "3107647", - "status": 1, - "byzantium": true - }, - "args": [], - "solcInputHash": "cebcb515c1a9c570d96e0b8f6fd237e2", - "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_newAddress\",\"type\":\"address\"}],\"name\":\"AddressSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"getAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"_address\",\"type\":\"address\"}],\"name\":\"setAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"title\":\"Lib_AddressManager\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":\"Lib_AddressManager\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// +build ovm\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Contract Imports */\\nimport { Ownable } from \\\"./Lib_Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n /*******************************************\\n * Contract Variables: Internal Accounting *\\n *******************************************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n public\\n onlyOwner\\n {\\n emit AddressSet(_name, _address);\\n addresses[_getNameHash(_name)] = _address;\\n }\\n\\n function getAddress(\\n string memory _name\\n )\\n public\\n view\\n returns (address)\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32 _hash\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xdf802e1cc6474df913626991e9fca3835c620a519f397afe04bf9c260e723257\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// +build ovm\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Ownable\\n * @dev Adapted from https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol\\n */\\nabstract contract Ownable {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n address public owner;\\n\\n\\n /**********\\n * Events *\\n **********/\\n\\n event OwnershipTransferred(\\n address indexed previousOwner,\\n address indexed newOwner\\n );\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n constructor() internal {\\n owner = msg.sender;\\n emit OwnershipTransferred(address(0), owner);\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n owner == msg.sender,\\n \\\"Ownable: caller is not the owner\\\"\\n );\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function renounceOwnership()\\n public\\n virtual\\n onlyOwner\\n {\\n emit OwnershipTransferred(owner, address(0));\\n owner = address(0);\\n }\\n\\n function transferOwnership(address _newOwner)\\n public\\n virtual\\n onlyOwner\\n {\\n require(\\n _newOwner != address(0),\\n \\\"Ownable: new owner cannot be the zero address\\\"\\n );\\n\\n emit OwnershipTransferred(owner, _newOwner);\\n owner = _newOwner;\\n }\\n}\\n\",\"keccak256\":\"0xe0409fbd236d16ca6be439d9d97dd36d0d9a0697ee0062d49588b9d29c248e47\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x608060405234801561001057600080fd5b50600080546001600160a01b03191633178082556040516001600160a01b039190911691907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3610614806100696000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c8063715018a61461005c5780638da5cb5b146100665780639b2ea4bd1461008a578063bf40fac11461013b578063f2fde38b146101e1575b600080fd5b610064610207565b005b61006e6102b0565b604080516001600160a01b039092168252519081900360200190f35b610064600480360360408110156100a057600080fd5b8101906020810181356401000000008111156100bb57600080fd5b8201836020820111156100cd57600080fd5b803590602001918460018302840111640100000000831117156100ef57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550505090356001600160a01b031691506102bf9050565b61006e6004803603602081101561015157600080fd5b81019060208101813564010000000081111561016c57600080fd5b82018360208201111561017e57600080fd5b803590602001918460018302840111640100000000831117156101a057600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061040c945050505050565b610064600480360360208110156101f757600080fd5b50356001600160a01b031661043b565b6000546001600160a01b03163314610266576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b031681565b6000546001600160a01b0316331461031e576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b7f188466739ff00cc68bfb2367d23ae4b855264264fe1624caa8884399af23454c82826040518080602001836001600160a01b03168152602001828103825284818151815260200191508051906020019080838360005b8381101561038d578181015183820152602001610375565b50505050905090810190601f1680156103ba5780820380516001836020036101000a031916815260200191505b50935050505060405180910390a180600160006103d68561053a565b815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b031602179055505050565b60006001600061041b8461053a565b81526020810191909152604001600020546001600160a01b031692915050565b6000546001600160a01b0316331461049a576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b0381166104df5760405162461bcd60e51b815260040180806020018281038252602d8152602001806105b2602d913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000816040516020018082805190602001908083835b6020831061056f5780518252601f199092019160209182019101610550565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120905091905056fe4f776e61626c653a206e6577206f776e65722063616e6e6f7420626520746865207a65726f2061646472657373a2646970667358221220304b86da0b56c0241601472f57374abec2a11900a97043845283952624e4512364736f6c63430007060033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100575760003560e01c8063715018a61461005c5780638da5cb5b146100665780639b2ea4bd1461008a578063bf40fac11461013b578063f2fde38b146101e1575b600080fd5b610064610207565b005b61006e6102b0565b604080516001600160a01b039092168252519081900360200190f35b610064600480360360408110156100a057600080fd5b8101906020810181356401000000008111156100bb57600080fd5b8201836020820111156100cd57600080fd5b803590602001918460018302840111640100000000831117156100ef57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550505090356001600160a01b031691506102bf9050565b61006e6004803603602081101561015157600080fd5b81019060208101813564010000000081111561016c57600080fd5b82018360208201111561017e57600080fd5b803590602001918460018302840111640100000000831117156101a057600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061040c945050505050565b610064600480360360208110156101f757600080fd5b50356001600160a01b031661043b565b6000546001600160a01b03163314610266576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b031681565b6000546001600160a01b0316331461031e576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b7f188466739ff00cc68bfb2367d23ae4b855264264fe1624caa8884399af23454c82826040518080602001836001600160a01b03168152602001828103825284818151815260200191508051906020019080838360005b8381101561038d578181015183820152602001610375565b50505050905090810190601f1680156103ba5780820380516001836020036101000a031916815260200191505b50935050505060405180910390a180600160006103d68561053a565b815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b031602179055505050565b60006001600061041b8461053a565b81526020810191909152604001600020546001600160a01b031692915050565b6000546001600160a01b0316331461049a576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b0381166104df5760405162461bcd60e51b815260040180806020018281038252602d8152602001806105b2602d913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000816040516020018082805190602001908083835b6020831061056f5780518252601f199092019160209182019101610550565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120905091905056fe4f776e61626c653a206e6577206f776e65722063616e6e6f7420626520746865207a65726f2061646472657373a2646970667358221220304b86da0b56c0241601472f57374abec2a11900a97043845283952624e4512364736f6c63430007060033", - "devdoc": { - "kind": "dev", - "methods": {}, - "title": "Lib_AddressManager", - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": {}, - "version": 1 - }, - "storageLayout": { - "storage": [ - { - "astId": 11739, - "contract": "contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol:Lib_AddressManager", - "label": "owner", - "offset": 0, - "slot": "0", - "type": "t_address" - }, - { - "astId": 11647, - "contract": "contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol:Lib_AddressManager", - "label": "addresses", - "offset": 0, - "slot": "1", - "type": "t_mapping(t_bytes32,t_address)" - } - ], - "types": { - "t_address": { - "encoding": "inplace", - "label": "address", - "numberOfBytes": "20" - }, - "t_bytes32": { - "encoding": "inplace", - "label": "bytes32", - "numberOfBytes": "32" - }, - "t_mapping(t_bytes32,t_address)": { - "encoding": "mapping", - "key": "t_bytes32", - "label": "mapping(bytes32 => address)", - "numberOfBytes": "32", - "value": "t_address" - } - } - } -} \ No newline at end of file diff --git a/packages/contracts/deployments/kovan-v1/OVM_CanonicalTransactionChain.json b/packages/contracts/deployments/kovan-v1/OVM_CanonicalTransactionChain.json deleted file mode 100644 index 83a2f82d35e05..0000000000000 --- a/packages/contracts/deployments/kovan-v1/OVM_CanonicalTransactionChain.json +++ /dev/null @@ -1,757 +0,0 @@ -{ - "address": "0x0ecB7253Aef93dD936E2a9BCEb49bc2fA683Ee65", - "abi": [ - { - "inputs": [ - { - "internalType": "address", - "name": "_libAddressManager", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_forceInclusionPeriodSeconds", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_forceInclusionPeriodBlocks", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_maxTransactionGasLimit", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint256", - "name": "_startingQueueIndex", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_numQueueElements", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_totalElements", - "type": "uint256" - } - ], - "name": "QueueBatchAppended", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint256", - "name": "_startingQueueIndex", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_numQueueElements", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_totalElements", - "type": "uint256" - } - ], - "name": "SequencerBatchAppended", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "_batchIndex", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "bytes32", - "name": "_batchRoot", - "type": "bytes32" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_batchSize", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_prevTotalElements", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "bytes", - "name": "_extraData", - "type": "bytes" - } - ], - "name": "TransactionBatchAppended", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "address", - "name": "_l1TxOrigin", - "type": "address" - }, - { - "indexed": false, - "internalType": "address", - "name": "_target", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_gasLimit", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "bytes", - "name": "_data", - "type": "bytes" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_queueIndex", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_timestamp", - "type": "uint256" - } - ], - "name": "TransactionEnqueued", - "type": "event" - }, - { - "inputs": [], - "name": "L2_GAS_DISCOUNT_DIVISOR", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "MAX_ROLLUP_TX_SIZE", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "MIN_ROLLUP_TX_GAS", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_numQueuedTransactions", - "type": "uint256" - } - ], - "name": "appendQueueBatch", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "appendSequencerBatch", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "batches", - "outputs": [ - { - "internalType": "contract iOVM_ChainStorageContainer", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_target", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_gasLimit", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "_data", - "type": "bytes" - } - ], - "name": "enqueue", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "forceInclusionPeriodBlocks", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "forceInclusionPeriodSeconds", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getNextQueueIndex", - "outputs": [ - { - "internalType": "uint40", - "name": "", - "type": "uint40" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getNumPendingQueueElements", - "outputs": [ - { - "internalType": "uint40", - "name": "", - "type": "uint40" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_index", - "type": "uint256" - } - ], - "name": "getQueueElement", - "outputs": [ - { - "components": [ - { - "internalType": "bytes32", - "name": "queueRoot", - "type": "bytes32" - }, - { - "internalType": "uint40", - "name": "timestamp", - "type": "uint40" - }, - { - "internalType": "uint40", - "name": "blockNumber", - "type": "uint40" - } - ], - "internalType": "struct Lib_OVMCodec.QueueElement", - "name": "_element", - "type": "tuple" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getQueueLength", - "outputs": [ - { - "internalType": "uint40", - "name": "", - "type": "uint40" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getTotalBatches", - "outputs": [ - { - "internalType": "uint256", - "name": "_totalBatches", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getTotalElements", - "outputs": [ - { - "internalType": "uint256", - "name": "_totalElements", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "maxTransactionGasLimit", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "queue", - "outputs": [ - { - "internalType": "contract iOVM_ChainStorageContainer", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "string", - "name": "_name", - "type": "string" - } - ], - "name": "resolve", - "outputs": [ - { - "internalType": "address", - "name": "_contract", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "components": [ - { - "internalType": "uint256", - "name": "timestamp", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "blockNumber", - "type": "uint256" - }, - { - "internalType": "enum Lib_OVMCodec.QueueOrigin", - "name": "l1QueueOrigin", - "type": "uint8" - }, - { - "internalType": "address", - "name": "l1TxOrigin", - "type": "address" - }, - { - "internalType": "address", - "name": "entrypoint", - "type": "address" - }, - { - "internalType": "uint256", - "name": "gasLimit", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "data", - "type": "bytes" - } - ], - "internalType": "struct Lib_OVMCodec.Transaction", - "name": "_transaction", - "type": "tuple" - }, - { - "components": [ - { - "internalType": "bool", - "name": "isSequenced", - "type": "bool" - }, - { - "internalType": "uint256", - "name": "queueIndex", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "timestamp", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "blockNumber", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "txData", - "type": "bytes" - } - ], - "internalType": "struct Lib_OVMCodec.TransactionChainElement", - "name": "_txChainElement", - "type": "tuple" - }, - { - "components": [ - { - "internalType": "uint256", - "name": "batchIndex", - "type": "uint256" - }, - { - "internalType": "bytes32", - "name": "batchRoot", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "batchSize", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "prevTotalElements", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "extraData", - "type": "bytes" - } - ], - "internalType": "struct Lib_OVMCodec.ChainBatchHeader", - "name": "_batchHeader", - "type": "tuple" - }, - { - "components": [ - { - "internalType": "uint256", - "name": "index", - "type": "uint256" - }, - { - "internalType": "bytes32[]", - "name": "siblings", - "type": "bytes32[]" - } - ], - "internalType": "struct Lib_OVMCodec.ChainInclusionProof", - "name": "_inclusionProof", - "type": "tuple" - } - ], - "name": "verifyTransaction", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - } - ], - "transactionHash": "0x46e0f66d5260cc1973f9cf40fa80ed213c1f7d58420d3560b47ff81b28902d4d", - "receipt": { - "to": null, - "from": "0x558ba9b8d78713fbf768c1f8a584485B4003f43F", - "contractAddress": "0xdFB7CdEfFdb717A2117E1577c187b8a8e25C5bEb", - "transactionIndex": 7, - "gasUsed": "2849481", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0xcbbf409c3afd072ebf97e09b1de817fa0641492dac602a0f6ad586fba93162d8", - "transactionHash": "0x46e0f66d5260cc1973f9cf40fa80ed213c1f7d58420d3560b47ff81b28902d4d", - "logs": [], - "blockNumber": 4573384, - "cumulativeGasUsed": "3318562", - "status": 1, - "byzantium": true - }, - "args": [ - "0x72e6F5244828C10737cbC9659378B207246D26B2", - 18000000, - 1200000, - 9000000 - ], - "solcInputHash": "cebcb515c1a9c570d96e0b8f6fd237e2", - "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_forceInclusionPeriodSeconds\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_forceInclusionPeriodBlocks\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_maxTransactionGasLimit\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_startingQueueIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_numQueueElements\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_totalElements\",\"type\":\"uint256\"}],\"name\":\"QueueBatchAppended\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_startingQueueIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_numQueueElements\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_totalElements\",\"type\":\"uint256\"}],\"name\":\"SequencerBatchAppended\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_batchIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"_batchRoot\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_batchSize\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_prevTotalElements\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"_extraData\",\"type\":\"bytes\"}],\"name\":\"TransactionBatchAppended\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_l1TxOrigin\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_queueIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_timestamp\",\"type\":\"uint256\"}],\"name\":\"TransactionEnqueued\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"L2_GAS_DISCOUNT_DIVISOR\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAX_ROLLUP_TX_SIZE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MIN_ROLLUP_TX_GAS\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_numQueuedTransactions\",\"type\":\"uint256\"}],\"name\":\"appendQueueBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"appendSequencerBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"batches\",\"outputs\":[{\"internalType\":\"contract iOVM_ChainStorageContainer\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"enqueue\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"forceInclusionPeriodBlocks\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"forceInclusionPeriodSeconds\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getNextQueueIndex\",\"outputs\":[{\"internalType\":\"uint40\",\"name\":\"\",\"type\":\"uint40\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getNumPendingQueueElements\",\"outputs\":[{\"internalType\":\"uint40\",\"name\":\"\",\"type\":\"uint40\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"getQueueElement\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"queueRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint40\",\"name\":\"timestamp\",\"type\":\"uint40\"},{\"internalType\":\"uint40\",\"name\":\"blockNumber\",\"type\":\"uint40\"}],\"internalType\":\"struct Lib_OVMCodec.QueueElement\",\"name\":\"_element\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getQueueLength\",\"outputs\":[{\"internalType\":\"uint40\",\"name\":\"\",\"type\":\"uint40\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTotalBatches\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_totalBatches\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTotalElements\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_totalElements\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maxTransactionGasLimit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"queue\",\"outputs\":[{\"internalType\":\"contract iOVM_ChainStorageContainer\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"_contract\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"enum Lib_OVMCodec.QueueOrigin\",\"name\":\"l1QueueOrigin\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"l1TxOrigin\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"entrypoint\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.Transaction\",\"name\":\"_transaction\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isSequenced\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"queueIndex\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"txData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.TransactionChainElement\",\"name\":\"_txChainElement\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"_batchHeader\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"siblings\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct Lib_OVMCodec.ChainInclusionProof\",\"name\":\"_inclusionProof\",\"type\":\"tuple\"}],\"name\":\"verifyTransaction\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"appendQueueBatch(uint256)\":{\"params\":{\"_numQueuedTransactions\":\"Number of transactions to append.\"}},\"appendSequencerBatch()\":{\"details\":\"This function uses a custom encoding scheme for efficiency reasons. .param _shouldStartAtElement Specific batch we expect to start appending to. .param _totalElementsToAppend Total number of batch elements we expect to append. .param _contexts Array of batch contexts. .param _transactionDataFields Array of raw transaction data.\"},\"batches()\":{\"returns\":{\"_0\":\"Reference to the batch storage container.\"}},\"enqueue(address,uint256,bytes)\":{\"params\":{\"_data\":\"Transaction data.\",\"_gasLimit\":\"Gas limit for the given transaction.\",\"_target\":\"Target contract to send the transaction to.\"}},\"getNextQueueIndex()\":{\"returns\":{\"_0\":\"Index for the next queue element.\"}},\"getNumPendingQueueElements()\":{\"returns\":{\"_0\":\"Length of the queue.\"}},\"getQueueElement(uint256)\":{\"params\":{\"_index\":\"Index of the queue element to access.\"},\"returns\":{\"_element\":\"Queue element at the given index.\"}},\"getQueueLength()\":{\"returns\":{\"_0\":\"Length of the queue.\"}},\"getTotalBatches()\":{\"returns\":{\"_totalBatches\":\"Total submitted batches.\"}},\"getTotalElements()\":{\"returns\":{\"_totalElements\":\"Total submitted elements.\"}},\"queue()\":{\"returns\":{\"_0\":\"Reference to the queue storage container.\"}},\"verifyTransaction((uint256,uint256,uint8,address,address,uint256,bytes),(bool,uint256,uint256,uint256,bytes),(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))\":{\"params\":{\"_batchHeader\":\"Header of the batch the transaction was included in.\",\"_inclusionProof\":\"Inclusion proof for the provided transaction chain element.\",\"_transaction\":\"Transaction to verify.\",\"_txChainElement\":\"Transaction chain element corresponding to the transaction.\"},\"returns\":{\"_0\":\"True if the transaction exists in the CTC, false if not.\"}}},\"title\":\"OVM_CanonicalTransactionChain\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"appendQueueBatch(uint256)\":{\"notice\":\"Appends a given number of queued transactions as a single batch.\"},\"appendSequencerBatch()\":{\"notice\":\"Allows the sequencer to append a batch of transactions.\"},\"batches()\":{\"notice\":\"Accesses the batch storage container.\"},\"enqueue(address,uint256,bytes)\":{\"notice\":\"Adds a transaction to the queue.\"},\"getNextQueueIndex()\":{\"notice\":\"Returns the index of the next element to be enqueued.\"},\"getNumPendingQueueElements()\":{\"notice\":\"Get the number of queue elements which have not yet been included.\"},\"getQueueElement(uint256)\":{\"notice\":\"Gets the queue element at a particular index.\"},\"getQueueLength()\":{\"notice\":\"Retrieves the length of the queue, including both pending and canonical transactions.\"},\"getTotalBatches()\":{\"notice\":\"Retrieves the total number of batches submitted.\"},\"getTotalElements()\":{\"notice\":\"Retrieves the total number of elements submitted.\"},\"queue()\":{\"notice\":\"Accesses the queue storage container.\"},\"verifyTransaction((uint256,uint256,uint8,address,address,uint256,bytes),(bool,uint256,uint256,uint256,bytes),(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))\":{\"notice\":\"Verifies whether a transaction is included in the chain.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/OVM/chain/OVM_CanonicalTransactionChain.sol\":\"OVM_CanonicalTransactionChain\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/optimistic-ethereum/OVM/accounts/OVM_ECDSAContractAccount.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.7.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Interface Imports */\\nimport { iOVM_ECDSAContractAccount } from \\\"../../iOVM/accounts/iOVM_ECDSAContractAccount.sol\\\";\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { Lib_ECDSAUtils } from \\\"../../libraries/utils/Lib_ECDSAUtils.sol\\\";\\nimport { Lib_SafeExecutionManagerWrapper } from \\\"../../libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\\\";\\nimport { Lib_SafeMathWrapper } from \\\"../../libraries/wrappers/Lib_SafeMathWrapper.sol\\\";\\n\\n/**\\n * @title OVM_ECDSAContractAccount\\n */\\ncontract OVM_ECDSAContractAccount is iOVM_ECDSAContractAccount {\\n\\n address constant ETH_ERC20_ADDRESS = 0x4200000000000000000000000000000000000006;\\n uint256 constant EXECUTION_VALIDATION_GAS_OVERHEAD = 25000; // TODO: should be the amount sufficient to cover the gas costs of all of the transactions up to and including the CALL/CREATE which forms the entrypoint of the transaction.\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Executes a signed transaction.\\n * @param _transaction Signed EOA transaction.\\n * @param _signatureType Hashing scheme used for the transaction (e.g., ETH signed message).\\n * @param _v Signature `v` parameter.\\n * @param _r Signature `r` parameter.\\n * @param _s Signature `s` parameter.\\n * @return _success Whether or not the call returned (rather than reverted).\\n * @return _returndata Data returned by the call.\\n */\\n function execute(\\n bytes memory _transaction,\\n Lib_OVMCodec.EOASignatureType _signatureType,\\n uint8 _v,\\n bytes32 _r,\\n bytes32 _s\\n )\\n override\\n public\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n bool isEthSign = _signatureType == Lib_OVMCodec.EOASignatureType.ETH_SIGNED_MESSAGE;\\n\\n // Address of this contract within the ovm (ovmADDRESS) should be the same as the\\n // recovered address of the user who signed this message. This is how we manage to shim\\n // account abstraction even though the user isn't a contract.\\n // Need to make sure that the transaction nonce is right and bump it if so.\\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(\\n Lib_ECDSAUtils.recover(\\n _transaction,\\n isEthSign,\\n _v,\\n _r,\\n _s\\n ) == Lib_SafeExecutionManagerWrapper.safeADDRESS(),\\n \\\"Signature provided for EOA transaction execution is invalid.\\\"\\n );\\n\\n Lib_OVMCodec.EIP155Transaction memory decodedTx = Lib_OVMCodec.decodeEIP155Transaction(_transaction, isEthSign);\\n\\n // Need to make sure that the transaction chainId is correct.\\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(\\n decodedTx.chainId == Lib_SafeExecutionManagerWrapper.safeCHAINID(),\\n \\\"Transaction chainId does not match expected OVM chainId.\\\"\\n );\\n\\n // Need to make sure that the transaction nonce is right.\\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(\\n decodedTx.nonce == Lib_SafeExecutionManagerWrapper.safeGETNONCE(),\\n \\\"Transaction nonce does not match the expected nonce.\\\"\\n );\\n\\n // TEMPORARY: Disable gas checks for minnet.\\n // // Need to make sure that the gas is sufficient to execute the transaction.\\n // Lib_SafeExecutionManagerWrapper.safeREQUIRE(\\n // gasleft() >= Lib_SafeMathWrapper.add(decodedTx.gasLimit, EXECUTION_VALIDATION_GAS_OVERHEAD),\\n // \\\"Gas is not sufficient to execute the transaction.\\\"\\n // );\\n\\n // Transfer fee to relayer.\\n address relayer = Lib_SafeExecutionManagerWrapper.safeCALLER();\\n uint256 fee = decodedTx.gasLimit * decodedTx.gasPrice;\\n (bool success, ) = Lib_SafeExecutionManagerWrapper.safeCALL(\\n gasleft(),\\n ETH_ERC20_ADDRESS,\\n abi.encodeWithSignature(\\\"transfer(address,uint256)\\\", relayer, fee)\\n );\\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(\\n success == true,\\n \\\"Fee was not transferred to relayer.\\\"\\n );\\n\\n // Contract creations are signalled by sending a transaction to the zero address.\\n if (decodedTx.to == address(0)) {\\n address created = Lib_SafeExecutionManagerWrapper.safeCREATE(\\n decodedTx.gasLimit,\\n decodedTx.data\\n );\\n\\n // EVM doesn't tell us whether a contract creation failed, even if it reverted during\\n // initialization. Always return `true` for our success value here.\\n return (true, abi.encode(created));\\n } else {\\n // We only want to bump the nonce for `ovmCALL` because `ovmCREATE` automatically bumps\\n // the nonce of the calling account. Normally an EOA would bump the nonce for both\\n // cases, but since this is a contract we'd end up bumping the nonce twice.\\n Lib_SafeExecutionManagerWrapper.safeSETNONCE(decodedTx.nonce + 1);\\n\\n return Lib_SafeExecutionManagerWrapper.safeCALL(\\n decodedTx.gasLimit,\\n decodedTx.to,\\n decodedTx.data\\n );\\n }\\n }\\n}\\n\",\"keccak256\":\"0x4cc167723233d14207aafc252b53f6abc8b788eac8e71abca6f1b0f257610dbd\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/accounts/OVM_ProxyEOA.sol\":{\"content\":\"pragma solidity ^0.7.0;\\n\\n/* Library Imports */\\nimport { Lib_BytesUtils } from \\\"../../libraries/utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { Lib_ECDSAUtils } from \\\"../../libraries/utils/Lib_ECDSAUtils.sol\\\";\\nimport { Lib_SafeExecutionManagerWrapper } from \\\"../../libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\\\";\\n\\n/**\\n * @title OVM_ProxyEOA\\n */\\ncontract OVM_ProxyEOA {\\n\\n bytes32 constant IMPLEMENTATION_KEY = 0xdeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddead;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n constructor(\\n address _implementation\\n ) {\\n _setImplementation(_implementation);\\n }\\n\\n\\n /*********************\\n * Fallback Function *\\n *********************/\\n\\n fallback()\\n external\\n {\\n (bool success, bytes memory returndata) = Lib_SafeExecutionManagerWrapper.safeDELEGATECALL(\\n gasleft(),\\n getImplementation(),\\n msg.data\\n );\\n\\n if (success) {\\n assembly {\\n return(add(returndata, 0x20), mload(returndata))\\n }\\n } else {\\n Lib_SafeExecutionManagerWrapper.safeREVERT(\\n string(returndata)\\n );\\n }\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function upgrade(\\n address _implementation\\n )\\n external\\n {\\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(\\n Lib_SafeExecutionManagerWrapper.safeADDRESS() == Lib_SafeExecutionManagerWrapper.safeCALLER(),\\n \\\"EOAs can only upgrade their own EOA implementation\\\"\\n );\\n\\n _setImplementation(_implementation);\\n }\\n\\n function getImplementation()\\n public\\n returns (\\n address _implementation\\n )\\n {\\n return address(uint160(uint256(\\n Lib_SafeExecutionManagerWrapper.safeSLOAD(\\n IMPLEMENTATION_KEY\\n )\\n )));\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function _setImplementation(\\n address _implementation\\n )\\n internal\\n {\\n Lib_SafeExecutionManagerWrapper.safeSSTORE(\\n IMPLEMENTATION_KEY,\\n bytes32(uint256(uint160(_implementation)))\\n );\\n }\\n}\",\"keccak256\":\"0x693349aff60b7b27db5a4625081bf64507ec4788c522f34bcee503b0325cd41f\"},\"contracts/optimistic-ethereum/OVM/chain/OVM_CanonicalTransactionChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.7.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\nimport { Lib_MerkleTree } from \\\"../../libraries/utils/Lib_MerkleTree.sol\\\";\\nimport { Lib_Math } from \\\"../../libraries/utils/Lib_Math.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_CanonicalTransactionChain } from \\\"../../iOVM/chain/iOVM_CanonicalTransactionChain.sol\\\";\\nimport { iOVM_ChainStorageContainer } from \\\"../../iOVM/chain/iOVM_ChainStorageContainer.sol\\\";\\n\\n/* Contract Imports */\\nimport { OVM_ExecutionManager } from \\\"../execution/OVM_ExecutionManager.sol\\\";\\n\\n\\n/**\\n * @title OVM_CanonicalTransactionChain\\n */\\ncontract OVM_CanonicalTransactionChain is iOVM_CanonicalTransactionChain, Lib_AddressResolver {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n // L2 tx gas-related\\n uint256 constant public MIN_ROLLUP_TX_GAS = 100000;\\n uint256 constant public MAX_ROLLUP_TX_SIZE = 10000;\\n uint256 constant public L2_GAS_DISCOUNT_DIVISOR = 32;\\n\\n // Encoding-related (all in bytes)\\n uint256 constant internal BATCH_CONTEXT_SIZE = 16;\\n uint256 constant internal BATCH_CONTEXT_LENGTH_POS = 12;\\n uint256 constant internal BATCH_CONTEXT_START_POS = 15;\\n uint256 constant internal TX_DATA_HEADER_SIZE = 3;\\n uint256 constant internal BYTES_TILL_TX_DATA = 65;\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n uint256 public forceInclusionPeriodSeconds;\\n uint256 public forceInclusionPeriodBlocks;\\n uint256 public maxTransactionGasLimit;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n constructor(\\n address _libAddressManager,\\n uint256 _forceInclusionPeriodSeconds,\\n uint256 _forceInclusionPeriodBlocks,\\n uint256 _maxTransactionGasLimit\\n )\\n Lib_AddressResolver(_libAddressManager)\\n {\\n forceInclusionPeriodSeconds = _forceInclusionPeriodSeconds;\\n forceInclusionPeriodBlocks = _forceInclusionPeriodBlocks;\\n maxTransactionGasLimit = _maxTransactionGasLimit;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Accesses the batch storage container.\\n * @return Reference to the batch storage container.\\n */\\n function batches()\\n public\\n view\\n returns (\\n iOVM_ChainStorageContainer\\n )\\n {\\n return iOVM_ChainStorageContainer(\\n resolve(\\\"OVM_ChainStorageContainer:CTC:batches\\\")\\n );\\n }\\n\\n /**\\n * Accesses the queue storage container.\\n * @return Reference to the queue storage container.\\n */\\n function queue()\\n public\\n view\\n returns (\\n iOVM_ChainStorageContainer\\n )\\n {\\n return iOVM_ChainStorageContainer(\\n resolve(\\\"OVM_ChainStorageContainer:CTC:queue\\\")\\n );\\n }\\n\\n /**\\n * @inheritdoc iOVM_CanonicalTransactionChain\\n */\\n function getTotalElements()\\n override\\n public\\n view\\n returns (\\n uint256 _totalElements\\n )\\n {\\n (uint40 totalElements,,,) = _getBatchExtraData();\\n return uint256(totalElements);\\n }\\n\\n /**\\n * @inheritdoc iOVM_CanonicalTransactionChain\\n */\\n function getTotalBatches()\\n override\\n public\\n view\\n returns (\\n uint256 _totalBatches\\n )\\n {\\n return batches().length();\\n }\\n\\n /**\\n * @inheritdoc iOVM_CanonicalTransactionChain\\n */\\n function getNextQueueIndex()\\n override\\n public\\n view\\n returns (\\n uint40\\n )\\n {\\n (, uint40 nextQueueIndex,,) = _getBatchExtraData();\\n return nextQueueIndex;\\n }\\n\\n /**\\n * @inheritdoc iOVM_CanonicalTransactionChain\\n */\\n function getQueueElement(\\n uint256 _index\\n )\\n override\\n public\\n view\\n returns (\\n Lib_OVMCodec.QueueElement memory _element\\n )\\n {\\n uint40 trueIndex = uint40(_index * 2);\\n bytes32 queueRoot = queue().get(trueIndex);\\n bytes32 timestampAndBlockNumber = queue().get(trueIndex + 1);\\n\\n uint40 elementTimestamp;\\n uint40 elementBlockNumber;\\n assembly {\\n elementTimestamp := and(timestampAndBlockNumber, 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF)\\n elementBlockNumber := shr(40, and(timestampAndBlockNumber, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000))\\n }\\n\\n return Lib_OVMCodec.QueueElement({\\n queueRoot: queueRoot,\\n timestamp: elementTimestamp,\\n blockNumber: elementBlockNumber\\n });\\n }\\n\\n /**\\n * @inheritdoc iOVM_CanonicalTransactionChain\\n */\\n function getNumPendingQueueElements()\\n override\\n public\\n view\\n returns (\\n uint40\\n )\\n {\\n return getQueueLength() - getNextQueueIndex();\\n }\\n\\n /**\\n * @inheritdoc iOVM_CanonicalTransactionChain\\n */\\n function getQueueLength()\\n override\\n public\\n view\\n returns (\\n uint40\\n )\\n {\\n // The underlying queue data structure stores 2 elements\\n // per insertion, so to get the real queue length we need\\n // to divide by 2. See the usage of `push2(..)`.\\n return uint40(queue().length() / 2);\\n }\\n\\n /**\\n * @inheritdoc iOVM_CanonicalTransactionChain\\n */\\n function enqueue(\\n address _target,\\n uint256 _gasLimit,\\n bytes memory _data\\n )\\n override\\n public\\n {\\n require(\\n _data.length <= MAX_ROLLUP_TX_SIZE,\\n \\\"Transaction data size exceeds maximum for rollup transaction.\\\"\\n );\\n\\n require(\\n _gasLimit <= maxTransactionGasLimit,\\n \\\"Transaction gas limit exceeds maximum for rollup transaction.\\\"\\n );\\n\\n require(\\n _gasLimit >= MIN_ROLLUP_TX_GAS,\\n \\\"Transaction gas limit too low to enqueue.\\\"\\n );\\n\\n // We need to consume some amount of L1 gas in order to rate limit transactions going into\\n // L2. However, L2 is cheaper than L1 so we only need to burn some small proportion of the\\n // provided L1 gas.\\n uint256 gasToConsume = _gasLimit/L2_GAS_DISCOUNT_DIVISOR;\\n uint256 startingGas = gasleft();\\n\\n // Although this check is not necessary (burn below will run out of gas if not true), it\\n // gives the user an explicit reason as to why the enqueue attempt failed.\\n require(\\n startingGas > gasToConsume,\\n \\\"Insufficient gas for L2 rate limiting burn.\\\"\\n );\\n\\n // Here we do some \\\"dumb\\\" work in order to burn gas, although we should probably replace\\n // this with something like minting gas token later on.\\n uint256 i;\\n while(startingGas - gasleft() < gasToConsume) {\\n i++;\\n }\\n\\n bytes32 transactionHash = keccak256(\\n abi.encode(\\n msg.sender,\\n _target,\\n _gasLimit,\\n _data\\n )\\n );\\n\\n bytes32 timestampAndBlockNumber;\\n assembly {\\n timestampAndBlockNumber := timestamp()\\n timestampAndBlockNumber := or(timestampAndBlockNumber, shl(40, number()))\\n }\\n\\n queue().push2(\\n transactionHash,\\n timestampAndBlockNumber\\n );\\n\\n uint256 queueIndex = queue().length() / 2;\\n emit TransactionEnqueued(\\n msg.sender,\\n _target,\\n _gasLimit,\\n _data,\\n queueIndex - 1,\\n block.timestamp\\n );\\n }\\n\\n /**\\n * @inheritdoc iOVM_CanonicalTransactionChain\\n */\\n function appendQueueBatch(\\n uint256 _numQueuedTransactions\\n )\\n override\\n public\\n {\\n // Disable `appendQueueBatch` for minnet\\n revert(\\\"appendQueueBatch is currently disabled.\\\");\\n\\n _numQueuedTransactions = Lib_Math.min(_numQueuedTransactions, getNumPendingQueueElements());\\n require(\\n _numQueuedTransactions > 0,\\n \\\"Must append more than zero transactions.\\\"\\n );\\n\\n bytes32[] memory leaves = new bytes32[](_numQueuedTransactions);\\n uint40 nextQueueIndex = getNextQueueIndex();\\n\\n for (uint256 i = 0; i < _numQueuedTransactions; i++) {\\n if (msg.sender != resolve(\\\"OVM_Sequencer\\\")) {\\n Lib_OVMCodec.QueueElement memory el = getQueueElement(nextQueueIndex);\\n require(\\n el.timestamp + forceInclusionPeriodSeconds < block.timestamp,\\n \\\"Queue transactions cannot be submitted during the sequencer inclusion period.\\\"\\n );\\n }\\n leaves[i] = _getQueueLeafHash(nextQueueIndex);\\n nextQueueIndex++;\\n }\\n\\n Lib_OVMCodec.QueueElement memory lastElement = getQueueElement(nextQueueIndex - 1);\\n\\n _appendBatch(\\n Lib_MerkleTree.getMerkleRoot(leaves),\\n _numQueuedTransactions,\\n _numQueuedTransactions,\\n lastElement.timestamp,\\n lastElement.blockNumber\\n );\\n\\n emit QueueBatchAppended(\\n nextQueueIndex - _numQueuedTransactions,\\n _numQueuedTransactions,\\n getTotalElements()\\n );\\n }\\n\\n /**\\n * @inheritdoc iOVM_CanonicalTransactionChain\\n */\\n function appendSequencerBatch()\\n override\\n public\\n {\\n uint40 shouldStartAtElement;\\n uint24 totalElementsToAppend;\\n uint24 numContexts;\\n assembly {\\n shouldStartAtElement := shr(216, calldataload(4))\\n totalElementsToAppend := shr(232, calldataload(9))\\n numContexts := shr(232, calldataload(12))\\n }\\n\\n require(\\n shouldStartAtElement == getTotalElements(),\\n \\\"Actual batch start index does not match expected start index.\\\"\\n );\\n\\n require(\\n msg.sender == resolve(\\\"OVM_Sequencer\\\"),\\n \\\"Function can only be called by the Sequencer.\\\"\\n );\\n\\n require(\\n numContexts > 0,\\n \\\"Must provide at least one batch context.\\\"\\n );\\n\\n require(\\n totalElementsToAppend > 0,\\n \\\"Must append at least one element.\\\"\\n );\\n\\n uint40 nextTransactionPtr = uint40(BATCH_CONTEXT_START_POS + BATCH_CONTEXT_SIZE * numContexts);\\n uint256 calldataSize;\\n assembly {\\n calldataSize := calldatasize()\\n }\\n\\n require(\\n calldataSize >= nextTransactionPtr,\\n \\\"Not enough BatchContexts provided.\\\"\\n );\\n\\n // Get queue length for future comparison/\\n uint40 queueLength = getQueueLength();\\n\\n // Initialize the array of canonical chain leaves that we will append.\\n bytes32[] memory leaves = new bytes32[](totalElementsToAppend);\\n // Each leaf index corresponds to a tx, either sequenced or enqueued.\\n uint32 leafIndex = 0;\\n // Counter for number of sequencer transactions appended so far.\\n uint32 numSequencerTransactions = 0;\\n // We will sequentially append leaves which are pointers to the queue.\\n // The initial queue index is what is currently in storage.\\n uint40 nextQueueIndex = getNextQueueIndex();\\n\\n BatchContext memory curContext;\\n\\n for (uint32 i = 0; i < numContexts; i++) {\\n BatchContext memory nextContext = _getBatchContext(i);\\n if (i == 0) {\\n _validateFirstBatchContext(nextContext);\\n }\\n _validateNextBatchContext(curContext, nextContext, nextQueueIndex);\\n\\n curContext = nextContext;\\n\\n for (uint32 j = 0; j < curContext.numSequencedTransactions; j++) {\\n uint256 txDataLength;\\n assembly {\\n txDataLength := shr(232, calldataload(nextTransactionPtr))\\n }\\n\\n leaves[leafIndex] = _getSequencerLeafHash(curContext, nextTransactionPtr, txDataLength);\\n nextTransactionPtr += uint40(TX_DATA_HEADER_SIZE + txDataLength);\\n numSequencerTransactions++;\\n leafIndex++;\\n }\\n\\n for (uint32 j = 0; j < curContext.numSubsequentQueueTransactions; j++) {\\n require(nextQueueIndex < queueLength, \\\"Not enough queued transactions to append.\\\");\\n leaves[leafIndex] = _getQueueLeafHash(nextQueueIndex);\\n nextQueueIndex++;\\n leafIndex++;\\n }\\n }\\n\\n _validateFinalBatchContext(curContext);\\n\\n require(\\n calldataSize == nextTransactionPtr,\\n \\\"Not all sequencer transactions were processed.\\\"\\n );\\n\\n require(\\n leafIndex == totalElementsToAppend,\\n \\\"Actual transaction index does not match expected total elements to append.\\\"\\n );\\n\\n // Generate the required metadata that we need to append this batch\\n uint40 numQueuedTransactions = totalElementsToAppend - numSequencerTransactions;\\n uint40 timestamp;\\n uint40 blockNumber;\\n if (curContext.numSubsequentQueueTransactions == 0) {\\n // The last element is a sequencer tx, therefore pull timestamp and block number from the last context.\\n timestamp = uint40(curContext.timestamp);\\n blockNumber = uint40(curContext.blockNumber);\\n } else {\\n // The last element is a queue tx, therefore pull timestamp and block number from the queue element.\\n Lib_OVMCodec.QueueElement memory lastElement = getQueueElement(nextQueueIndex - 1);\\n timestamp = lastElement.timestamp;\\n blockNumber = lastElement.blockNumber;\\n }\\n\\n _appendBatch(\\n Lib_MerkleTree.getMerkleRoot(leaves),\\n totalElementsToAppend,\\n numQueuedTransactions,\\n timestamp,\\n blockNumber\\n );\\n\\n emit SequencerBatchAppended(\\n nextQueueIndex - numQueuedTransactions,\\n numQueuedTransactions,\\n getTotalElements()\\n );\\n }\\n\\n /**\\n * @inheritdoc iOVM_CanonicalTransactionChain\\n */\\n function verifyTransaction(\\n Lib_OVMCodec.Transaction memory _transaction,\\n Lib_OVMCodec.TransactionChainElement memory _txChainElement,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _inclusionProof\\n )\\n override\\n public\\n view\\n returns (\\n bool\\n )\\n {\\n if (_txChainElement.isSequenced == true) {\\n return _verifySequencerTransaction(\\n _transaction,\\n _txChainElement,\\n _batchHeader,\\n _inclusionProof\\n );\\n } else {\\n return _verifyQueueTransaction(\\n _transaction,\\n _txChainElement.queueIndex,\\n _batchHeader,\\n _inclusionProof\\n );\\n }\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Returns the BatchContext located at a particular index.\\n * @param _index The index of the BatchContext\\n * @return The BatchContext at the specified index.\\n */\\n function _getBatchContext(\\n uint256 _index\\n )\\n internal\\n pure\\n returns (\\n BatchContext memory\\n )\\n {\\n uint256 contextPtr = 15 + _index * BATCH_CONTEXT_SIZE;\\n uint256 numSequencedTransactions;\\n uint256 numSubsequentQueueTransactions;\\n uint256 ctxTimestamp;\\n uint256 ctxBlockNumber;\\n\\n assembly {\\n numSequencedTransactions := shr(232, calldataload(contextPtr))\\n numSubsequentQueueTransactions := shr(232, calldataload(add(contextPtr, 3)))\\n ctxTimestamp := shr(216, calldataload(add(contextPtr, 6)))\\n ctxBlockNumber := shr(216, calldataload(add(contextPtr, 11)))\\n }\\n\\n return BatchContext({\\n numSequencedTransactions: numSequencedTransactions,\\n numSubsequentQueueTransactions: numSubsequentQueueTransactions,\\n timestamp: ctxTimestamp,\\n blockNumber: ctxBlockNumber\\n });\\n }\\n\\n /**\\n * Parses the batch context from the extra data.\\n * @return Total number of elements submitted.\\n * @return Index of the next queue element.\\n */\\n function _getBatchExtraData()\\n internal\\n view\\n returns (\\n uint40,\\n uint40,\\n uint40,\\n uint40\\n )\\n {\\n bytes27 extraData = batches().getGlobalMetadata();\\n\\n uint40 totalElements;\\n uint40 nextQueueIndex;\\n uint40 lastTimestamp;\\n uint40 lastBlockNumber;\\n assembly {\\n extraData := shr(40, extraData)\\n totalElements := and(extraData, 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF)\\n nextQueueIndex := shr(40, and(extraData, 0x00000000000000000000000000000000000000000000FFFFFFFFFF0000000000))\\n lastTimestamp := shr(80, and(extraData, 0x0000000000000000000000000000000000FFFFFFFFFF00000000000000000000))\\n lastBlockNumber := shr(120, and(extraData, 0x000000000000000000000000FFFFFFFFFF000000000000000000000000000000))\\n }\\n\\n return (\\n totalElements,\\n nextQueueIndex,\\n lastTimestamp,\\n lastBlockNumber\\n );\\n }\\n\\n /**\\n * Encodes the batch context for the extra data.\\n * @param _totalElements Total number of elements submitted.\\n * @param _nextQueueIndex Index of the next queue element.\\n * @param _timestamp Timestamp for the last batch.\\n * @param _blockNumber Block number of the last batch.\\n * @return Encoded batch context.\\n */\\n function _makeBatchExtraData(\\n uint40 _totalElements,\\n uint40 _nextQueueIndex,\\n uint40 _timestamp,\\n uint40 _blockNumber\\n )\\n internal\\n pure\\n returns (\\n bytes27\\n )\\n {\\n bytes27 extraData;\\n assembly {\\n extraData := _totalElements\\n extraData := or(extraData, shl(40, _nextQueueIndex))\\n extraData := or(extraData, shl(80, _timestamp))\\n extraData := or(extraData, shl(120, _blockNumber))\\n extraData := shl(40, extraData)\\n }\\n\\n return extraData;\\n }\\n\\n /**\\n * Retrieves the hash of a queue element.\\n * @param _index Index of the queue element to retrieve a hash for.\\n * @return Hash of the queue element.\\n */\\n function _getQueueLeafHash(\\n uint256 _index\\n )\\n internal\\n view\\n returns (\\n bytes32\\n )\\n {\\n return _hashTransactionChainElement(\\n Lib_OVMCodec.TransactionChainElement({\\n isSequenced: false,\\n queueIndex: _index,\\n timestamp: 0,\\n blockNumber: 0,\\n txData: hex\\\"\\\"\\n })\\n );\\n }\\n\\n /**\\n * Retrieves the length of the queue.\\n * @return Length of the queue.\\n */\\n function _getQueueLength()\\n internal\\n view\\n returns (\\n uint40\\n )\\n {\\n // The underlying queue data structure stores 2 elements\\n // per insertion, so to get the real queue length we need\\n // to divide by 2. See the usage of `push2(..)`.\\n return uint40(queue().length() / 2);\\n }\\n\\n /**\\n * Retrieves the hash of a sequencer element.\\n * @param _context Batch context for the given element.\\n * @param _nextTransactionPtr Pointer to the next transaction in the calldata.\\n * @param _txDataLength Length of the transaction item.\\n * @return Hash of the sequencer element.\\n */\\n function _getSequencerLeafHash(\\n BatchContext memory _context,\\n uint256 _nextTransactionPtr,\\n uint256 _txDataLength\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n\\n bytes memory chainElement = new bytes(BYTES_TILL_TX_DATA + _txDataLength);\\n uint256 ctxTimestamp = _context.timestamp;\\n uint256 ctxBlockNumber = _context.blockNumber;\\n\\n bytes32 leafHash;\\n assembly {\\n let chainElementStart := add(chainElement, 0x20)\\n\\n // Set the first byte equal to `1` to indicate this is a sequencer chain element.\\n // This distinguishes sequencer ChainElements from queue ChainElements because\\n // all queue ChainElements are ABI encoded and the first byte of ABI encoded\\n // elements is always zero\\n mstore8(chainElementStart, 1)\\n\\n mstore(add(chainElementStart, 1), ctxTimestamp)\\n mstore(add(chainElementStart, 33), ctxBlockNumber)\\n\\n calldatacopy(add(chainElementStart, BYTES_TILL_TX_DATA), add(_nextTransactionPtr, 3), _txDataLength)\\n\\n leafHash := keccak256(chainElementStart, add(BYTES_TILL_TX_DATA, _txDataLength))\\n }\\n\\n return leafHash;\\n }\\n\\n /**\\n * Retrieves the hash of a sequencer element.\\n * @param _txChainElement The chain element which is hashed to calculate the leaf.\\n * @return Hash of the sequencer element.\\n */\\n function _getSequencerLeafHash(\\n Lib_OVMCodec.TransactionChainElement memory _txChainElement\\n )\\n internal\\n view\\n returns(\\n bytes32\\n )\\n {\\n bytes memory txData = _txChainElement.txData;\\n uint256 txDataLength = _txChainElement.txData.length;\\n\\n bytes memory chainElement = new bytes(BYTES_TILL_TX_DATA + txDataLength);\\n uint256 ctxTimestamp = _txChainElement.timestamp;\\n uint256 ctxBlockNumber = _txChainElement.blockNumber;\\n\\n bytes32 leafHash;\\n assembly {\\n let chainElementStart := add(chainElement, 0x20)\\n\\n // Set the first byte equal to `1` to indicate this is a sequencer chain element.\\n // This distinguishes sequencer ChainElements from queue ChainElements because\\n // all queue ChainElements are ABI encoded and the first byte of ABI encoded\\n // elements is always zero\\n mstore8(chainElementStart, 1)\\n\\n mstore(add(chainElementStart, 1), ctxTimestamp)\\n mstore(add(chainElementStart, 33), ctxBlockNumber)\\n\\n pop(staticcall(gas(), 0x04, add(txData, 0x20), txDataLength, add(chainElementStart, BYTES_TILL_TX_DATA), txDataLength))\\n\\n leafHash := keccak256(chainElementStart, add(BYTES_TILL_TX_DATA, txDataLength))\\n }\\n\\n return leafHash;\\n }\\n\\n /**\\n * Inserts a batch into the chain of batches.\\n * @param _transactionRoot Root of the transaction tree for this batch.\\n * @param _batchSize Number of elements in the batch.\\n * @param _numQueuedTransactions Number of queue transactions in the batch.\\n * @param _timestamp The latest batch timestamp.\\n * @param _blockNumber The latest batch blockNumber.\\n */\\n function _appendBatch(\\n bytes32 _transactionRoot,\\n uint256 _batchSize,\\n uint256 _numQueuedTransactions,\\n uint40 _timestamp,\\n uint40 _blockNumber\\n )\\n internal\\n {\\n (uint40 totalElements, uint40 nextQueueIndex, uint40 lastTimestamp, uint40 lastBlockNumber) = _getBatchExtraData();\\n\\n Lib_OVMCodec.ChainBatchHeader memory header = Lib_OVMCodec.ChainBatchHeader({\\n batchIndex: batches().length(),\\n batchRoot: _transactionRoot,\\n batchSize: _batchSize,\\n prevTotalElements: totalElements,\\n extraData: hex\\\"\\\"\\n });\\n\\n emit TransactionBatchAppended(\\n header.batchIndex,\\n header.batchRoot,\\n header.batchSize,\\n header.prevTotalElements,\\n header.extraData\\n );\\n\\n bytes32 batchHeaderHash = Lib_OVMCodec.hashBatchHeader(header);\\n bytes27 latestBatchContext = _makeBatchExtraData(\\n totalElements + uint40(header.batchSize),\\n nextQueueIndex + uint40(_numQueuedTransactions),\\n _timestamp,\\n _blockNumber\\n );\\n\\n batches().push(batchHeaderHash, latestBatchContext);\\n }\\n\\n /**\\n * Checks that the first batch context in a sequencer submission is valid\\n * @param _firstContext The batch context to validate.\\n */\\n function _validateFirstBatchContext(\\n BatchContext memory _firstContext\\n )\\n internal\\n view\\n {\\n // If there are existing elements, this batch must come later.\\n if (getTotalElements() > 0) {\\n (,, uint40 lastTimestamp, uint40 lastBlockNumber) = _getBatchExtraData();\\n require(_firstContext.blockNumber >= lastBlockNumber, \\\"Context block number is lower than last submitted.\\\");\\n require(_firstContext.timestamp >= lastTimestamp, \\\"Context timestamp is lower than last submitted.\\\");\\n }\\n // Sequencer cannot submit contexts which are more than the force inclusion period old.\\n require(_firstContext.timestamp + forceInclusionPeriodSeconds >= block.timestamp, \\\"Context timestamp too far in the past.\\\");\\n require(_firstContext.blockNumber + forceInclusionPeriodBlocks >= block.number, \\\"Context block number too far in the past.\\\");\\n }\\n\\n /**\\n * Checks that a given batch context is valid based on its previous context, and the next queue elemtent.\\n * @param _prevContext The previously validated batch context.\\n * @param _nextContext The batch context to validate with this call.\\n * @param _nextQueueIndex Index of the next queue element to process for the _nextContext's subsequentQueueElements.\\n */\\n function _validateNextBatchContext(\\n BatchContext memory _prevContext,\\n BatchContext memory _nextContext,\\n uint40 _nextQueueIndex\\n )\\n internal\\n view\\n {\\n // All sequencer transactions' times must increase from the previous ones.\\n require(\\n _nextContext.timestamp >= _prevContext.timestamp,\\n \\\"Context timestamp values must monotonically increase.\\\"\\n );\\n\\n require(\\n _nextContext.blockNumber >= _prevContext.blockNumber,\\n \\\"Context blockNumber values must monotonically increase.\\\"\\n );\\n\\n // If there are some queue elements pending:\\n if (getQueueLength() - _nextQueueIndex > 0) {\\n Lib_OVMCodec.QueueElement memory nextQueueElement = getQueueElement(_nextQueueIndex);\\n\\n // If the force inclusion period has passed for an enqueued transaction, it MUST be the next chain element.\\n require(\\n block.timestamp < nextQueueElement.timestamp + forceInclusionPeriodSeconds,\\n \\\"Previously enqueued batches have expired and must be appended before a new sequencer batch.\\\"\\n );\\n\\n // Just like sequencer transaction times must be increasing relative to each other,\\n // We also require that they be increasing relative to any interspersed queue elements.\\n require(\\n _nextContext.timestamp <= nextQueueElement.timestamp,\\n \\\"Sequencer transaction timestamp exceeds that of next queue element.\\\"\\n );\\n\\n require(\\n _nextContext.blockNumber <= nextQueueElement.blockNumber,\\n \\\"Sequencer transaction blockNumber exceeds that of next queue element.\\\"\\n );\\n } \\n }\\n\\n /**\\n * Checks that the final batch context in a sequencer submission is valid.\\n * @param _finalContext The batch context to validate.\\n */\\n function _validateFinalBatchContext(\\n BatchContext memory _finalContext\\n )\\n internal\\n view\\n {\\n // Batches cannot be added from the future, or subsequent enqueue() contexts would violate monotonicity.\\n require(_finalContext.timestamp <= block.timestamp, \\\"Context timestamp is from the future.\\\");\\n require(_finalContext.blockNumber <= block.number, \\\"Context block number is from the future.\\\");\\n }\\n\\n /**\\n * Hashes a transaction chain element.\\n * @param _element Chain element to hash.\\n * @return Hash of the chain element.\\n */\\n function _hashTransactionChainElement(\\n Lib_OVMCodec.TransactionChainElement memory _element\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(\\n abi.encode(\\n _element.isSequenced,\\n _element.queueIndex,\\n _element.timestamp,\\n _element.blockNumber,\\n _element.txData\\n )\\n );\\n }\\n\\n /**\\n * Verifies a sequencer transaction, returning true if it was indeed included in the CTC\\n * @param _transaction The transaction we are verifying inclusion of.\\n * @param _txChainElement The chain element that the transaction is claimed to be a part of.\\n * @param _batchHeader Header of the batch the transaction was included in.\\n * @param _inclusionProof An inclusion proof into the CTC at a particular index.\\n * @return True if the transaction was included in the specified location, else false.\\n */\\n function _verifySequencerTransaction(\\n Lib_OVMCodec.Transaction memory _transaction,\\n Lib_OVMCodec.TransactionChainElement memory _txChainElement,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _inclusionProof\\n )\\n internal\\n view\\n returns (\\n bool\\n )\\n {\\n OVM_ExecutionManager ovmExecutionManager = OVM_ExecutionManager(resolve(\\\"OVM_ExecutionManager\\\"));\\n uint256 gasLimit = ovmExecutionManager.getMaxTransactionGasLimit();\\n bytes32 leafHash = _getSequencerLeafHash(_txChainElement);\\n\\n require(\\n _verifyElement(\\n leafHash,\\n _batchHeader,\\n _inclusionProof\\n ),\\n \\\"Invalid Sequencer transaction inclusion proof.\\\"\\n );\\n\\n require(\\n _transaction.blockNumber == _txChainElement.blockNumber\\n && _transaction.timestamp == _txChainElement.timestamp\\n && _transaction.entrypoint == resolve(\\\"OVM_DecompressionPrecompileAddress\\\")\\n && _transaction.gasLimit == gasLimit\\n && _transaction.l1TxOrigin == address(0)\\n && _transaction.l1QueueOrigin == Lib_OVMCodec.QueueOrigin.SEQUENCER_QUEUE\\n && keccak256(_transaction.data) == keccak256(_txChainElement.txData),\\n \\\"Invalid Sequencer transaction.\\\"\\n );\\n\\n return true;\\n }\\n\\n /**\\n * Verifies a queue transaction, returning true if it was indeed included in the CTC\\n * @param _transaction The transaction we are verifying inclusion of.\\n * @param _queueIndex The queueIndex of the queued transaction.\\n * @param _batchHeader Header of the batch the transaction was included in.\\n * @param _inclusionProof An inclusion proof into the CTC at a particular index (should point to queue tx).\\n * @return True if the transaction was included in the specified location, else false.\\n */\\n function _verifyQueueTransaction(\\n Lib_OVMCodec.Transaction memory _transaction,\\n uint256 _queueIndex,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _inclusionProof\\n )\\n internal\\n view\\n returns (\\n bool\\n )\\n {\\n bytes32 leafHash = _getQueueLeafHash(_queueIndex);\\n\\n require(\\n _verifyElement(\\n leafHash,\\n _batchHeader,\\n _inclusionProof\\n ),\\n \\\"Invalid Queue transaction inclusion proof.\\\"\\n );\\n\\n bytes32 transactionHash = keccak256(\\n abi.encode(\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n )\\n );\\n\\n Lib_OVMCodec.QueueElement memory el = getQueueElement(_queueIndex);\\n require(\\n el.queueRoot == transactionHash\\n && el.timestamp == _transaction.timestamp\\n && el.blockNumber == _transaction.blockNumber,\\n \\\"Invalid Queue transaction.\\\"\\n );\\n\\n return true;\\n }\\n\\n /**\\n * Verifies a batch inclusion proof.\\n * @param _element Hash of the element to verify a proof for.\\n * @param _batchHeader Header of the batch in which the element was included.\\n * @param _proof Merkle inclusion proof for the element.\\n */\\n function _verifyElement(\\n bytes32 _element,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _proof\\n )\\n internal\\n view\\n returns (\\n bool\\n )\\n {\\n require(\\n Lib_OVMCodec.hashBatchHeader(_batchHeader) == batches().get(uint32(_batchHeader.batchIndex)),\\n \\\"Invalid batch header.\\\"\\n );\\n\\n require(\\n Lib_MerkleTree.verify(\\n _batchHeader.batchRoot,\\n _element,\\n _proof.index,\\n _proof.siblings,\\n _batchHeader.batchSize\\n ),\\n \\\"Invalid inclusion proof.\\\"\\n );\\n\\n return true;\\n }\\n}\\n\",\"keccak256\":\"0x66d6fe12fd7d90474ebafd93d75ba57da93a339b38da22c29007e7823c456212\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.7.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\nimport { Lib_EthUtils } from \\\"../../libraries/utils/Lib_EthUtils.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_ExecutionManager } from \\\"../../iOVM/execution/iOVM_ExecutionManager.sol\\\";\\nimport { iOVM_StateManager } from \\\"../../iOVM/execution/iOVM_StateManager.sol\\\";\\nimport { iOVM_SafetyChecker } from \\\"../../iOVM/execution/iOVM_SafetyChecker.sol\\\";\\n\\n/* Contract Imports */\\nimport { OVM_ECDSAContractAccount } from \\\"../accounts/OVM_ECDSAContractAccount.sol\\\";\\nimport { OVM_ProxyEOA } from \\\"../accounts/OVM_ProxyEOA.sol\\\";\\nimport { OVM_DeployerWhitelist } from \\\"../precompiles/OVM_DeployerWhitelist.sol\\\";\\n\\n/**\\n * @title OVM_ExecutionManager\\n */\\ncontract OVM_ExecutionManager is iOVM_ExecutionManager, Lib_AddressResolver {\\n\\n /********************************\\n * External Contract References *\\n ********************************/\\n\\n iOVM_SafetyChecker internal ovmSafetyChecker;\\n iOVM_StateManager internal ovmStateManager;\\n\\n\\n /*******************************\\n * Execution Context Variables *\\n *******************************/\\n\\n GasMeterConfig internal gasMeterConfig;\\n GlobalContext internal globalContext;\\n TransactionContext internal transactionContext;\\n MessageContext internal messageContext;\\n TransactionRecord internal transactionRecord;\\n MessageRecord internal messageRecord;\\n\\n\\n /**************************\\n * Gas Metering Constants *\\n **************************/\\n\\n address constant GAS_METADATA_ADDRESS = 0x06a506A506a506A506a506a506A506A506A506A5;\\n uint256 constant NUISANCE_GAS_SLOAD = 20000;\\n uint256 constant NUISANCE_GAS_SSTORE = 20000;\\n uint256 constant MIN_NUISANCE_GAS_PER_CONTRACT = 30000;\\n uint256 constant NUISANCE_GAS_PER_CONTRACT_BYTE = 100;\\n uint256 constant MIN_GAS_FOR_INVALID_STATE_ACCESS = 30000;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n */\\n constructor(\\n address _libAddressManager,\\n GasMeterConfig memory _gasMeterConfig,\\n GlobalContext memory _globalContext\\n )\\n Lib_AddressResolver(_libAddressManager)\\n {\\n ovmSafetyChecker = iOVM_SafetyChecker(resolve(\\\"OVM_SafetyChecker\\\"));\\n gasMeterConfig = _gasMeterConfig;\\n globalContext = _globalContext;\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n /**\\n * Applies dynamically-sized refund to a transaction to account for the difference in execution\\n * between L1 and L2, so that the overall cost of the ovmOPCODE is fixed.\\n * @param _cost Desired gas cost for the function after the refund.\\n */\\n modifier netGasCost(\\n uint256 _cost\\n ) {\\n uint256 gasProvided = gasleft();\\n _;\\n uint256 gasUsed = gasProvided - gasleft();\\n\\n // We want to refund everything *except* the specified cost.\\n if (_cost < gasUsed) {\\n transactionRecord.ovmGasRefund += gasUsed - _cost;\\n }\\n }\\n\\n /**\\n * Applies a fixed-size gas refund to a transaction to account for the difference in execution\\n * between L1 and L2, so that the overall cost of an ovmOPCODE can be lowered.\\n * @param _discount Amount of gas cost to refund for the ovmOPCODE.\\n */\\n modifier fixedGasDiscount(\\n uint256 _discount\\n ) {\\n uint256 gasProvided = gasleft();\\n _;\\n uint256 gasUsed = gasProvided - gasleft();\\n\\n // We want to refund the specified _discount, unless this risks underflow.\\n if (_discount < gasUsed) {\\n transactionRecord.ovmGasRefund += _discount;\\n } else {\\n // refund all we can without risking underflow.\\n transactionRecord.ovmGasRefund += gasUsed;\\n }\\n }\\n\\n /**\\n * Makes sure we're not inside a static context.\\n */\\n modifier notStatic() {\\n if (messageContext.isStatic == true) {\\n _revertWithFlag(RevertFlag.STATIC_VIOLATION);\\n }\\n _;\\n }\\n\\n\\n /************************************\\n * Transaction Execution Entrypoint *\\n ************************************/\\n\\n /**\\n * Starts the execution of a transaction via the OVM_ExecutionManager.\\n * @param _transaction Transaction data to be executed.\\n * @param _ovmStateManager iOVM_StateManager implementation providing account state.\\n */\\n function run(\\n Lib_OVMCodec.Transaction memory _transaction,\\n address _ovmStateManager\\n )\\n override\\n public\\n {\\n require(transactionContext.ovmNUMBER == 0, \\\"Only be callable at the start of a transaction\\\");\\n // Store our OVM_StateManager instance (significantly easier than attempting to pass the\\n // address around in calldata).\\n ovmStateManager = iOVM_StateManager(_ovmStateManager);\\n\\n // Make sure this function can't be called by anyone except the owner of the\\n // OVM_StateManager (expected to be an OVM_StateTransitioner). We can revert here because\\n // this would make the `run` itself invalid.\\n require(\\n ovmStateManager.isAuthenticated(msg.sender),\\n \\\"Only authenticated addresses in ovmStateManager can call this function\\\"\\n );\\n\\n // Initialize the execution context, must be initialized before we perform any gas metering\\n // or we'll throw a nuisance gas error.\\n _initContext(_transaction);\\n\\n // TEMPORARY: Gas metering is disabled for minnet.\\n // // Check whether we need to start a new epoch, do so if necessary.\\n // _checkNeedsNewEpoch(_transaction.timestamp);\\n\\n // Make sure the transaction's gas limit is valid. We don't revert here because we reserve\\n // reverts for INVALID_STATE_ACCESS.\\n if (_isValidGasLimit(_transaction.gasLimit, _transaction.l1QueueOrigin) == false) {\\n return;\\n }\\n\\n // Check gas right before the call to get total gas consumed by OVM transaction.\\n uint256 gasProvided = gasleft();\\n\\n // Run the transaction, make sure to meter the gas usage.\\n ovmCALL(\\n _transaction.gasLimit - gasMeterConfig.minTransactionGasLimit,\\n _transaction.entrypoint,\\n _transaction.data\\n );\\n uint256 gasUsed = gasProvided - gasleft();\\n\\n // TEMPORARY: Gas metering is disabled for minnet.\\n // // Update the cumulative gas based on the amount of gas used.\\n // _updateCumulativeGas(gasUsed, _transaction.l1QueueOrigin);\\n\\n // Wipe the execution context.\\n _resetContext();\\n\\n // Reset the ovmStateManager.\\n ovmStateManager = iOVM_StateManager(address(0));\\n }\\n\\n\\n /******************************\\n * Opcodes: Execution Context *\\n ******************************/\\n\\n /**\\n * @notice Overrides CALLER.\\n * @return _CALLER Address of the CALLER within the current message context.\\n */\\n function ovmCALLER()\\n override\\n public\\n view\\n returns (\\n address _CALLER\\n )\\n {\\n return messageContext.ovmCALLER;\\n }\\n\\n /**\\n * @notice Overrides ADDRESS.\\n * @return _ADDRESS Active ADDRESS within the current message context.\\n */\\n function ovmADDRESS()\\n override\\n public\\n view\\n returns (\\n address _ADDRESS\\n )\\n {\\n return messageContext.ovmADDRESS;\\n }\\n\\n /**\\n * @notice Overrides TIMESTAMP.\\n * @return _TIMESTAMP Value of the TIMESTAMP within the transaction context.\\n */\\n function ovmTIMESTAMP()\\n override\\n public\\n view\\n returns (\\n uint256 _TIMESTAMP\\n )\\n {\\n return transactionContext.ovmTIMESTAMP;\\n }\\n\\n /**\\n * @notice Overrides NUMBER.\\n * @return _NUMBER Value of the NUMBER within the transaction context.\\n */\\n function ovmNUMBER()\\n override\\n public\\n view\\n returns (\\n uint256 _NUMBER\\n )\\n {\\n return transactionContext.ovmNUMBER;\\n }\\n\\n /**\\n * @notice Overrides GASLIMIT.\\n * @return _GASLIMIT Value of the block's GASLIMIT within the transaction context.\\n */\\n function ovmGASLIMIT()\\n override\\n public\\n view\\n returns (\\n uint256 _GASLIMIT\\n )\\n {\\n return transactionContext.ovmGASLIMIT;\\n }\\n\\n /**\\n * @notice Overrides CHAINID.\\n * @return _CHAINID Value of the chain's CHAINID within the global context.\\n */\\n function ovmCHAINID()\\n override\\n public\\n view\\n returns (\\n uint256 _CHAINID\\n )\\n {\\n return globalContext.ovmCHAINID;\\n }\\n\\n /*********************************\\n * Opcodes: L2 Execution Context *\\n *********************************/\\n\\n /**\\n * @notice Specifies from which L1 rollup queue this transaction originated from.\\n * @return _queueOrigin Address of the ovmL1QUEUEORIGIN within the current message context.\\n */\\n function ovmL1QUEUEORIGIN()\\n override\\n public\\n view\\n returns (\\n Lib_OVMCodec.QueueOrigin _queueOrigin\\n )\\n {\\n return transactionContext.ovmL1QUEUEORIGIN;\\n }\\n\\n /**\\n * @notice Specifies what L1 EOA, if any, sent this transaction.\\n * @return _l1TxOrigin Address of the EOA which send the tx into L2 from L1.\\n */\\n function ovmL1TXORIGIN()\\n override\\n public\\n view\\n returns (\\n address _l1TxOrigin\\n )\\n {\\n return transactionContext.ovmL1TXORIGIN;\\n }\\n\\n /********************\\n * Opcodes: Halting *\\n ********************/\\n\\n /**\\n * @notice Overrides REVERT.\\n * @param _data Bytes data to pass along with the REVERT.\\n */\\n function ovmREVERT(\\n bytes memory _data\\n )\\n override\\n public\\n {\\n _revertWithFlag(RevertFlag.INTENTIONAL_REVERT, _data);\\n }\\n\\n\\n /******************************\\n * Opcodes: Contract Creation *\\n ******************************/\\n\\n /**\\n * @notice Overrides CREATE.\\n * @param _bytecode Code to be used to CREATE a new contract.\\n * @return _contract Address of the created contract.\\n */\\n function ovmCREATE(\\n bytes memory _bytecode\\n )\\n override\\n public\\n notStatic\\n fixedGasDiscount(40000)\\n returns (\\n address _contract\\n )\\n {\\n // Creator is always the current ADDRESS.\\n address creator = ovmADDRESS();\\n\\n // Check that the deployer is whitelisted, or\\n // that arbitrary contract deployment has been enabled.\\n _checkDeployerAllowed(creator);\\n\\n // Generate the correct CREATE address.\\n address contractAddress = Lib_EthUtils.getAddressForCREATE(\\n creator,\\n _getAccountNonce(creator)\\n );\\n\\n return _createContract(\\n contractAddress,\\n _bytecode\\n );\\n }\\n\\n /**\\n * @notice Overrides CREATE2.\\n * @param _bytecode Code to be used to CREATE2 a new contract.\\n * @param _salt Value used to determine the contract's address.\\n * @return _contract Address of the created contract.\\n */\\n function ovmCREATE2(\\n bytes memory _bytecode,\\n bytes32 _salt\\n )\\n override\\n public\\n notStatic\\n fixedGasDiscount(40000)\\n returns (\\n address _contract\\n )\\n {\\n // Creator is always the current ADDRESS.\\n address creator = ovmADDRESS();\\n\\n // Check that the deployer is whitelisted, or\\n // that arbitrary contract deployment has been enabled.\\n _checkDeployerAllowed(creator);\\n\\n // Generate the correct CREATE2 address.\\n address contractAddress = Lib_EthUtils.getAddressForCREATE2(\\n creator,\\n _bytecode,\\n _salt\\n );\\n\\n return _createContract(\\n contractAddress,\\n _bytecode\\n );\\n }\\n\\n\\n /*******************************\\n * Account Abstraction Opcodes *\\n ******************************/\\n\\n /**\\n * Retrieves the nonce of the current ovmADDRESS.\\n * @return _nonce Nonce of the current contract.\\n */\\n function ovmGETNONCE()\\n override\\n public\\n returns (\\n uint256 _nonce\\n )\\n {\\n return _getAccountNonce(ovmADDRESS());\\n }\\n\\n /**\\n * Sets the nonce of the current ovmADDRESS.\\n * @param _nonce New nonce for the current contract.\\n */\\n function ovmSETNONCE(\\n uint256 _nonce\\n )\\n override\\n public\\n notStatic\\n {\\n _setAccountNonce(ovmADDRESS(), _nonce);\\n }\\n\\n /**\\n * Creates a new EOA contract account, for account abstraction.\\n * @dev Essentially functions like ovmCREATE or ovmCREATE2, but we can bypass a lot of checks\\n * because the contract we're creating is trusted (no need to do safety checking or to\\n * handle unexpected reverts). Doesn't need to return an address because the address is\\n * assumed to be the user's actual address.\\n * @param _messageHash Hash of a message signed by some user, for verification.\\n * @param _v Signature `v` parameter.\\n * @param _r Signature `r` parameter.\\n * @param _s Signature `s` parameter.\\n */\\n function ovmCREATEEOA(\\n bytes32 _messageHash,\\n uint8 _v,\\n bytes32 _r,\\n bytes32 _s\\n )\\n override\\n public\\n notStatic\\n {\\n // Recover the EOA address from the message hash and signature parameters. Since we do the\\n // hashing in advance, we don't have handle different message hashing schemes. Even if this\\n // function were to return the wrong address (rather than explicitly returning the zero\\n // address), the rest of the transaction would simply fail (since there's no EOA account to\\n // actually execute the transaction).\\n address eoa = ecrecover(\\n _messageHash,\\n _v + 27,\\n _r,\\n _s\\n );\\n\\n // Invalid signature is a case we proactively handle with a revert. We could alternatively\\n // have this function return a `success` boolean, but this is just easier.\\n if (eoa == address(0)) {\\n ovmREVERT(bytes(\\\"Signature provided for EOA contract creation is invalid.\\\"));\\n }\\n\\n // If the user already has an EOA account, then there's no need to perform this operation.\\n if (_hasEmptyAccount(eoa) == false) {\\n return;\\n }\\n\\n // We always need to initialize the contract with the default account values.\\n _initPendingAccount(eoa);\\n\\n // Temporarily set the current address so it's easier to access on L2.\\n address prevADDRESS = messageContext.ovmADDRESS;\\n messageContext.ovmADDRESS = eoa;\\n\\n // Now actually create the account and get its bytecode. We're not worried about reverts\\n // (other than out of gas, which we can't capture anyway) because this contract is trusted.\\n OVM_ProxyEOA proxyEOA = new OVM_ProxyEOA(0x4200000000000000000000000000000000000003);\\n\\n // Reset the address now that we're done deploying.\\n messageContext.ovmADDRESS = prevADDRESS;\\n\\n // Commit the account with its final values.\\n _commitPendingAccount(\\n eoa,\\n address(proxyEOA),\\n keccak256(Lib_EthUtils.getCode(address(proxyEOA)))\\n );\\n\\n _setAccountNonce(eoa, 0);\\n }\\n\\n\\n /*********************************\\n * Opcodes: Contract Interaction *\\n *********************************/\\n\\n /**\\n * @notice Overrides CALL.\\n * @param _gasLimit Amount of gas to be passed into this call.\\n * @param _address Address of the contract to call.\\n * @param _calldata Data to send along with the call.\\n * @return _success Whether or not the call returned (rather than reverted).\\n * @return _returndata Data returned by the call.\\n */\\n function ovmCALL(\\n uint256 _gasLimit,\\n address _address,\\n bytes memory _calldata\\n )\\n override\\n public\\n fixedGasDiscount(100000)\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n // CALL updates the CALLER and ADDRESS.\\n MessageContext memory nextMessageContext = messageContext;\\n nextMessageContext.ovmCALLER = nextMessageContext.ovmADDRESS;\\n nextMessageContext.ovmADDRESS = _address;\\n\\n return _callContract(\\n nextMessageContext,\\n _gasLimit,\\n _address,\\n _calldata\\n );\\n }\\n\\n /**\\n * @notice Overrides STATICCALL.\\n * @param _gasLimit Amount of gas to be passed into this call.\\n * @param _address Address of the contract to call.\\n * @param _calldata Data to send along with the call.\\n * @return _success Whether or not the call returned (rather than reverted).\\n * @return _returndata Data returned by the call.\\n */\\n function ovmSTATICCALL(\\n uint256 _gasLimit,\\n address _address,\\n bytes memory _calldata\\n )\\n override\\n public\\n fixedGasDiscount(80000)\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n // STATICCALL updates the CALLER, updates the ADDRESS, and runs in a static context.\\n MessageContext memory nextMessageContext = messageContext;\\n nextMessageContext.ovmCALLER = nextMessageContext.ovmADDRESS;\\n nextMessageContext.ovmADDRESS = _address;\\n nextMessageContext.isStatic = true;\\n\\n return _callContract(\\n nextMessageContext,\\n _gasLimit,\\n _address,\\n _calldata\\n );\\n }\\n\\n /**\\n * @notice Overrides DELEGATECALL.\\n * @param _gasLimit Amount of gas to be passed into this call.\\n * @param _address Address of the contract to call.\\n * @param _calldata Data to send along with the call.\\n * @return _success Whether or not the call returned (rather than reverted).\\n * @return _returndata Data returned by the call.\\n */\\n function ovmDELEGATECALL(\\n uint256 _gasLimit,\\n address _address,\\n bytes memory _calldata\\n )\\n override\\n public\\n fixedGasDiscount(40000)\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n // DELEGATECALL does not change anything about the message context.\\n MessageContext memory nextMessageContext = messageContext;\\n bool isStaticEntrypoint = false;\\n\\n return _callContract(\\n nextMessageContext,\\n _gasLimit,\\n _address,\\n _calldata\\n );\\n }\\n\\n\\n /************************************\\n * Opcodes: Contract Storage Access *\\n ************************************/\\n\\n /**\\n * @notice Overrides SLOAD.\\n * @param _key 32 byte key of the storage slot to load.\\n * @return _value 32 byte value of the requested storage slot.\\n */\\n function ovmSLOAD(\\n bytes32 _key\\n )\\n override\\n public\\n netGasCost(40000)\\n returns (\\n bytes32 _value\\n )\\n {\\n // We always SLOAD from the storage of ADDRESS.\\n address contractAddress = ovmADDRESS();\\n\\n return _getContractStorage(\\n contractAddress,\\n _key\\n );\\n }\\n\\n /**\\n * @notice Overrides SSTORE.\\n * @param _key 32 byte key of the storage slot to set.\\n * @param _value 32 byte value for the storage slot.\\n */\\n function ovmSSTORE(\\n bytes32 _key,\\n bytes32 _value\\n )\\n override\\n public\\n notStatic\\n netGasCost(60000)\\n {\\n // We always SSTORE to the storage of ADDRESS.\\n address contractAddress = ovmADDRESS();\\n\\n _putContractStorage(\\n contractAddress,\\n _key,\\n _value\\n );\\n }\\n\\n\\n /*********************************\\n * Opcodes: Contract Code Access *\\n *********************************/\\n\\n /**\\n * @notice Overrides EXTCODECOPY.\\n * @param _contract Address of the contract to copy code from.\\n * @param _offset Offset in bytes from the start of contract code to copy beyond.\\n * @param _length Total number of bytes to copy from the contract's code.\\n * @return _code Bytes of code copied from the requested contract.\\n */\\n function ovmEXTCODECOPY(\\n address _contract,\\n uint256 _offset,\\n uint256 _length\\n )\\n override\\n public\\n returns (\\n bytes memory _code\\n )\\n {\\n // `ovmEXTCODECOPY` is the only overridden opcode capable of producing exactly one byte of\\n // return data. By blocking reads of one byte, we're able to use the condition that an\\n // OVM_ExecutionManager function return value having a length of exactly one byte indicates\\n // an error without an explicit revert. If users were able to read a single byte, they\\n // could forcibly trigger behavior that should only be available to this contract.\\n uint256 length = _length == 1 ? 2 : _length;\\n\\n return Lib_EthUtils.getCode(\\n _getAccountEthAddress(_contract),\\n _offset,\\n length\\n );\\n }\\n\\n /**\\n * @notice Overrides EXTCODESIZE.\\n * @param _contract Address of the contract to query the size of.\\n * @return _EXTCODESIZE Size of the requested contract in bytes.\\n */\\n function ovmEXTCODESIZE(\\n address _contract\\n )\\n override\\n public\\n returns (\\n uint256 _EXTCODESIZE\\n )\\n {\\n return Lib_EthUtils.getCodeSize(\\n _getAccountEthAddress(_contract)\\n );\\n }\\n\\n /**\\n * @notice Overrides EXTCODEHASH.\\n * @param _contract Address of the contract to query the hash of.\\n * @return _EXTCODEHASH Hash of the requested contract.\\n */\\n function ovmEXTCODEHASH(\\n address _contract\\n )\\n override\\n public\\n returns (\\n bytes32 _EXTCODEHASH\\n )\\n {\\n return Lib_EthUtils.getCodeHash(\\n _getAccountEthAddress(_contract)\\n );\\n }\\n\\n\\n /**************************************\\n * Public Functions: Execution Safety *\\n **************************************/\\n\\n /**\\n * Performs the logic to create a contract and revert under various potential conditions.\\n * @dev This function is implemented as `public` because we need to be able to revert a\\n * contract creation without losing information about exactly *why* the contract reverted.\\n * In particular, we want to be sure that contracts cannot trigger an INVALID_STATE_ACCESS\\n * flag and then revert to reset the flag. We're able to do this by making an external\\n * call from `ovmCREATE` and `ovmCREATE2` to `safeCREATE`, which can capture and relay\\n * information before reverting.\\n * @param _address Address of the contract to associate with the one being created.\\n * @param _bytecode Code to be used to create the new contract.\\n */\\n function safeCREATE(\\n address _address,\\n bytes memory _bytecode\\n )\\n override\\n public\\n {\\n // Since this function is public, anyone can attempt to directly call it. We need to make\\n // sure that the OVM_ExecutionManager itself is the only party that can actually try to\\n // call this function.\\n if (msg.sender != address(this)) {\\n return;\\n }\\n\\n // We need to be sure that the user isn't trying to use a contract creation to overwrite\\n // some existing contract. On L1, users will prove that no contract exists at the address\\n // and the OVM_FraudVerifier will populate the code hash of this address with a special\\n // value that represents \\\"known to be an empty account.\\\"\\n if (_hasEmptyAccount(_address) == false) {\\n _revertWithFlag(RevertFlag.CREATE_COLLISION);\\n }\\n\\n // Check the creation bytecode against the OVM_SafetyChecker.\\n if (ovmSafetyChecker.isBytecodeSafe(_bytecode) == false) {\\n _revertWithFlag(RevertFlag.UNSAFE_BYTECODE);\\n }\\n\\n // We always need to initialize the contract with the default account values.\\n _initPendingAccount(_address);\\n\\n // Actually deploy the contract and retrieve its address. This step is hiding a lot of\\n // complexity because we need to ensure that contract creation *never* reverts by itself.\\n // We cover this partially by storing a revert flag and returning (instead of reverting)\\n // when we know that we're inside a contract's creation code.\\n address ethAddress = Lib_EthUtils.createContract(_bytecode);\\n\\n // Contract creation returns the zero address when it fails, which should only be possible\\n // if the user intentionally runs out of gas. However, we might still have a bit of gas\\n // left over since contract calls can only be passed 63/64ths of total gas, so we need to\\n // explicitly handle this case here.\\n if (ethAddress == address(0)) {\\n _revertWithFlag(RevertFlag.CREATE_EXCEPTION);\\n }\\n\\n // Here we pull out the revert flag that would've been set during creation code. Now that\\n // we're out of creation code again, we can just revert normally while passing the flag\\n // through the revert data.\\n if (messageRecord.revertFlag != RevertFlag.DID_NOT_REVERT) {\\n _revertWithFlag(messageRecord.revertFlag);\\n }\\n\\n // Again simply checking that the deployed code is safe too. Contracts can generate\\n // arbitrary deployment code, so there's no easy way to analyze this beforehand.\\n bytes memory deployedCode = Lib_EthUtils.getCode(ethAddress);\\n if (ovmSafetyChecker.isBytecodeSafe(deployedCode) == false) {\\n _revertWithFlag(RevertFlag.UNSAFE_BYTECODE);\\n }\\n\\n // Contract creation didn't need to be reverted and the bytecode is safe. We finish up by\\n // associating the desired address with the newly created contract's code hash and address.\\n _commitPendingAccount(\\n _address,\\n ethAddress,\\n Lib_EthUtils.getCodeHash(ethAddress)\\n );\\n }\\n\\n\\n /***************************************\\n * Public Functions: Execution Context *\\n ***************************************/\\n\\n function getMaxTransactionGasLimit()\\n external\\n view\\n override\\n returns (\\n uint256 _maxTransactionGasLimit\\n )\\n {\\n return gasMeterConfig.maxTransactionGasLimit;\\n }\\n\\n /********************************************\\n * Public Functions: Deployment Witelisting *\\n ********************************************/\\n\\n /**\\n * Checks whether the given address is on the whitelst to ovmCREATE/ovmCREATE2, and reverts if not.\\n * @param _deployerAddress Address attempting to deploy a contract.\\n */\\n function _checkDeployerAllowed(\\n address _deployerAddress\\n )\\n internal\\n {\\n // From an OVM semanitcs perspectibe, this will appear the identical to\\n // the deployer ovmCALLing the whitelist. This is fine--in a sense, we are forcing them to.\\n (bool success, bytes memory data) = ovmCALL(\\n gasleft(),\\n 0x4200000000000000000000000000000000000002,\\n abi.encodeWithSignature(\\\"isDeployerAllowed(address)\\\", _deployerAddress)\\n );\\n bool isAllowed = abi.decode(data, (bool));\\n\\n if (!isAllowed || !success) {\\n _revertWithFlag(RevertFlag.CREATOR_NOT_ALLOWED);\\n } \\n }\\n\\n /********************************************\\n * Internal Functions: Contract Interaction *\\n ********************************************/\\n\\n /**\\n * Creates a new contract and associates it with some contract address.\\n * @param _contractAddress Address to associate the created contract with.\\n * @param _bytecode Bytecode to be used to create the contract.\\n * @return _created Final OVM contract address.\\n */\\n function _createContract(\\n address _contractAddress,\\n bytes memory _bytecode\\n )\\n internal\\n returns (\\n address _created\\n )\\n {\\n // We always update the nonce of the creating account, even if the creation fails.\\n _setAccountNonce(ovmADDRESS(), _getAccountNonce(ovmADDRESS()) + 1);\\n\\n // We're stepping into a CREATE or CREATE2, so we need to update ADDRESS to point\\n // to the contract's associated address and CALLER to point to the previous ADDRESS.\\n MessageContext memory nextMessageContext = messageContext;\\n nextMessageContext.ovmCALLER = messageContext.ovmADDRESS;\\n nextMessageContext.ovmADDRESS = _contractAddress;\\n\\n // Run `safeCREATE` in a new EVM message so that our changes can be reflected even if\\n // `safeCREATE` reverts.\\n (bool _success, ) = _handleExternalInteraction(\\n nextMessageContext,\\n gasleft(),\\n address(this),\\n abi.encodeWithSignature(\\n \\\"safeCREATE(address,bytes)\\\",\\n _contractAddress,\\n _bytecode\\n )\\n );\\n\\n // Need to make sure that this flag is reset so that it isn't propagated to creations in\\n // some parent EVM message.\\n messageRecord.revertFlag = RevertFlag.DID_NOT_REVERT;\\n\\n // Yellow paper requires that address returned is zero if the contract deployment fails.\\n return _success ? _contractAddress : address(0);\\n }\\n\\n /**\\n * Calls the deployed contract associated with a given address.\\n * @param _nextMessageContext Message context to be used for the call.\\n * @param _gasLimit Amount of gas to be passed into this call.\\n * @param _contract OVM address to be called.\\n * @param _calldata Data to send along with the call.\\n * @return _success Whether or not the call returned (rather than reverted).\\n * @return _returndata Data returned by the call.\\n */\\n function _callContract(\\n MessageContext memory _nextMessageContext,\\n uint256 _gasLimit,\\n address _contract,\\n bytes memory _calldata\\n )\\n internal\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n // We reserve addresses of the form 0xdeaddeaddead...NNNN for the container contracts in L2 geth.\\n // So, we block calls to these addresses since they are not safe to run as an OVM contract itself.\\n if (\\n (uint256(_contract) & uint256(0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000)) \\n == uint256(0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000)\\n ) {\\n return (true, hex'');\\n }\\n\\n // Both 0x0000... and the EVM precompiles have the same address on L1 and L2 --> no trie lookup needed.\\n address codeContractAddress =\\n uint(_contract) < 100\\n ? _contract\\n : _getAccountEthAddress(_contract);\\n\\n return _handleExternalInteraction(\\n _nextMessageContext,\\n _gasLimit,\\n codeContractAddress,\\n _calldata\\n );\\n }\\n\\n /**\\n * Handles the logic of making an external call and parsing revert information.\\n * @param _nextMessageContext Message context to be used for the call.\\n * @param _gasLimit Amount of gas to be passed into this call.\\n * @param _target Address of the contract to call.\\n * @param _data Data to send along with the call.\\n * @return _success Whether or not the call returned (rather than reverted).\\n * @return _returndata Data returned by the call.\\n */\\n function _handleExternalInteraction(\\n MessageContext memory _nextMessageContext,\\n uint256 _gasLimit,\\n address _target,\\n bytes memory _data\\n )\\n internal\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n // We need to switch over to our next message context for the duration of this call.\\n MessageContext memory prevMessageContext = messageContext;\\n _switchMessageContext(prevMessageContext, _nextMessageContext);\\n\\n // Nuisance gas is a system used to bound the ability for an attacker to make fraud proofs\\n // expensive by touching a lot of different accounts or storage slots. Since most contracts\\n // only use a few storage slots during any given transaction, this shouldn't be a limiting\\n // factor.\\n uint256 prevNuisanceGasLeft = messageRecord.nuisanceGasLeft;\\n uint256 nuisanceGasLimit = _getNuisanceGasLimit(_gasLimit);\\n messageRecord.nuisanceGasLeft = nuisanceGasLimit;\\n\\n // Make the call and make sure to pass in the gas limit. Another instance of hidden\\n // complexity. `_target` is guaranteed to be a safe contract, meaning its return/revert\\n // behavior can be controlled. In particular, we enforce that flags are passed through\\n // revert data as to retrieve execution metadata that would normally be reverted out of\\n // existence.\\n (bool success, bytes memory returndata) = _target.call{gas: _gasLimit}(_data);\\n\\n // Switch back to the original message context now that we're out of the call.\\n _switchMessageContext(_nextMessageContext, prevMessageContext);\\n\\n // Assuming there were no reverts, the message record should be accurate here. We'll update\\n // this value in the case of a revert.\\n uint256 nuisanceGasLeft = messageRecord.nuisanceGasLeft;\\n\\n // Reverts at this point are completely OK, but we need to make a few updates based on the\\n // information passed through the revert.\\n if (success == false) {\\n (\\n RevertFlag flag,\\n uint256 nuisanceGasLeftPostRevert,\\n uint256 ovmGasRefund,\\n bytes memory returndataFromFlag\\n ) = _decodeRevertData(returndata);\\n\\n // INVALID_STATE_ACCESS is the only flag that triggers an immediate abort of the\\n // parent EVM message. This behavior is necessary because INVALID_STATE_ACCESS must\\n // halt any further transaction execution that could impact the execution result.\\n if (flag == RevertFlag.INVALID_STATE_ACCESS) {\\n _revertWithFlag(flag);\\n }\\n\\n // INTENTIONAL_REVERT, UNSAFE_BYTECODE, STATIC_VIOLATION, and CREATOR_NOT_ALLOWED aren't \\n // dependent on the input state, so we can just handle them like standard reverts. Our only change here\\n // is to record the gas refund reported by the call (enforced by safety checking).\\n if (\\n flag == RevertFlag.INTENTIONAL_REVERT\\n || flag == RevertFlag.UNSAFE_BYTECODE\\n || flag == RevertFlag.STATIC_VIOLATION\\n || flag == RevertFlag.CREATOR_NOT_ALLOWED\\n ) {\\n transactionRecord.ovmGasRefund = ovmGasRefund;\\n }\\n\\n // INTENTIONAL_REVERT needs to pass up the user-provided return data encoded into the\\n // flag, *not* the full encoded flag. All other revert types return no data.\\n if (flag == RevertFlag.INTENTIONAL_REVERT) {\\n returndata = returndataFromFlag;\\n } else {\\n returndata = hex'';\\n }\\n\\n // Reverts mean we need to use up whatever \\\"nuisance gas\\\" was used by the call.\\n // EXCEEDS_NUISANCE_GAS explicitly reduces the remaining nuisance gas for this message\\n // to zero. OUT_OF_GAS is a \\\"pseudo\\\" flag given that messages return no data when they\\n // run out of gas, so we have to treat this like EXCEEDS_NUISANCE_GAS. All other flags\\n // will simply pass up the remaining nuisance gas.\\n nuisanceGasLeft = nuisanceGasLeftPostRevert;\\n }\\n\\n // We need to reset the nuisance gas back to its original value minus the amount used here.\\n messageRecord.nuisanceGasLeft = prevNuisanceGasLeft - (nuisanceGasLimit - nuisanceGasLeft);\\n\\n return (\\n success,\\n returndata\\n );\\n }\\n\\n\\n /******************************************\\n * Internal Functions: State Manipulation *\\n ******************************************/\\n\\n /**\\n * Checks whether an account exists within the OVM_StateManager.\\n * @param _address Address of the account to check.\\n * @return _exists Whether or not the account exists.\\n */\\n function _hasAccount(\\n address _address\\n )\\n internal\\n returns (\\n bool _exists\\n )\\n {\\n _checkAccountLoad(_address);\\n return ovmStateManager.hasAccount(_address);\\n }\\n\\n /**\\n * Checks whether a known empty account exists within the OVM_StateManager.\\n * @param _address Address of the account to check.\\n * @return _exists Whether or not the account empty exists.\\n */\\n function _hasEmptyAccount(\\n address _address\\n )\\n internal\\n returns (\\n bool _exists\\n )\\n {\\n _checkAccountLoad(_address);\\n return ovmStateManager.hasEmptyAccount(_address);\\n }\\n\\n /**\\n * Sets the nonce of an account.\\n * @param _address Address of the account to modify.\\n * @param _nonce New account nonce.\\n */\\n function _setAccountNonce(\\n address _address,\\n uint256 _nonce\\n )\\n internal\\n {\\n _checkAccountChange(_address);\\n ovmStateManager.setAccountNonce(_address, _nonce);\\n }\\n\\n /**\\n * Gets the nonce of an account.\\n * @param _address Address of the account to access.\\n * @return _nonce Nonce of the account.\\n */\\n function _getAccountNonce(\\n address _address\\n )\\n internal\\n returns (\\n uint256 _nonce\\n )\\n {\\n _checkAccountLoad(_address);\\n return ovmStateManager.getAccountNonce(_address);\\n }\\n\\n /**\\n * Retrieves the Ethereum address of an account.\\n * @param _address Address of the account to access.\\n * @return _ethAddress Corresponding Ethereum address.\\n */\\n function _getAccountEthAddress(\\n address _address\\n )\\n internal\\n returns (\\n address _ethAddress\\n )\\n {\\n _checkAccountLoad(_address);\\n return ovmStateManager.getAccountEthAddress(_address);\\n }\\n\\n /**\\n * Creates the default account object for the given address.\\n * @param _address Address of the account create.\\n */\\n function _initPendingAccount(\\n address _address\\n )\\n internal\\n {\\n // Although it seems like `_checkAccountChange` would be more appropriate here, we don't\\n // actually consider an account \\\"changed\\\" until it's inserted into the state (in this case\\n // by `_commitPendingAccount`).\\n _checkAccountLoad(_address);\\n ovmStateManager.initPendingAccount(_address);\\n }\\n\\n /**\\n * Stores additional relevant data for a new account, thereby \\\"committing\\\" it to the state.\\n * This function is only called during `ovmCREATE` and `ovmCREATE2` after a successful contract\\n * creation.\\n * @param _address Address of the account to commit.\\n * @param _ethAddress Address of the associated deployed contract.\\n * @param _codeHash Hash of the code stored at the address.\\n */\\n function _commitPendingAccount(\\n address _address,\\n address _ethAddress,\\n bytes32 _codeHash\\n )\\n internal\\n {\\n _checkAccountChange(_address);\\n ovmStateManager.commitPendingAccount(\\n _address,\\n _ethAddress,\\n _codeHash\\n );\\n }\\n\\n /**\\n * Retrieves the value of a storage slot.\\n * @param _contract Address of the contract to query.\\n * @param _key 32 byte key of the storage slot.\\n * @return _value 32 byte storage slot value.\\n */\\n function _getContractStorage(\\n address _contract,\\n bytes32 _key\\n )\\n internal\\n returns (\\n bytes32 _value\\n )\\n {\\n _checkContractStorageLoad(_contract, _key);\\n return ovmStateManager.getContractStorage(_contract, _key);\\n }\\n\\n /**\\n * Sets the value of a storage slot.\\n * @param _contract Address of the contract to modify.\\n * @param _key 32 byte key of the storage slot.\\n * @param _value 32 byte storage slot value.\\n */\\n function _putContractStorage(\\n address _contract,\\n bytes32 _key,\\n bytes32 _value\\n )\\n internal\\n {\\n // We don't set storage if the value didn't change. Although this acts as a convenient\\n // optimization, it's also necessary to avoid the case in which a contract with no storage\\n // attempts to store the value \\\"0\\\" at any key. Putting this value (and therefore requiring\\n // that the value be committed into the storage trie after execution) would incorrectly\\n // modify the storage root.\\n if (_getContractStorage(_contract, _key) == _value) {\\n return;\\n }\\n\\n _checkContractStorageChange(_contract, _key);\\n ovmStateManager.putContractStorage(_contract, _key, _value);\\n }\\n\\n /**\\n * Validation whenever a contract needs to be loaded. Checks that the account exists, charges\\n * nuisance gas if the account hasn't been loaded before.\\n * @param _address Address of the account to load.\\n */\\n function _checkAccountLoad(\\n address _address\\n )\\n internal\\n {\\n // See `_checkContractStorageLoad` for more information.\\n if (gasleft() < MIN_GAS_FOR_INVALID_STATE_ACCESS) {\\n _revertWithFlag(RevertFlag.OUT_OF_GAS);\\n }\\n\\n // See `_checkContractStorageLoad` for more information.\\n if (ovmStateManager.hasAccount(_address) == false) {\\n _revertWithFlag(RevertFlag.INVALID_STATE_ACCESS);\\n }\\n\\n // Check whether the account has been loaded before and mark it as loaded if not. We need\\n // this because \\\"nuisance gas\\\" only applies to the first time that an account is loaded.\\n (\\n bool _wasAccountAlreadyLoaded\\n ) = ovmStateManager.testAndSetAccountLoaded(_address);\\n\\n // If we hadn't already loaded the account, then we'll need to charge \\\"nuisance gas\\\" based\\n // on the size of the contract code.\\n if (_wasAccountAlreadyLoaded == false) {\\n _useNuisanceGas(\\n (Lib_EthUtils.getCodeSize(_getAccountEthAddress(_address)) * NUISANCE_GAS_PER_CONTRACT_BYTE) + MIN_NUISANCE_GAS_PER_CONTRACT\\n );\\n }\\n }\\n\\n /**\\n * Validation whenever a contract needs to be changed. Checks that the account exists, charges\\n * nuisance gas if the account hasn't been changed before.\\n * @param _address Address of the account to change.\\n */\\n function _checkAccountChange(\\n address _address\\n )\\n internal\\n {\\n // Start by checking for a load as we only want to charge nuisance gas proportional to\\n // contract size once.\\n _checkAccountLoad(_address);\\n\\n // Check whether the account has been changed before and mark it as changed if not. We need\\n // this because \\\"nuisance gas\\\" only applies to the first time that an account is changed.\\n (\\n bool _wasAccountAlreadyChanged\\n ) = ovmStateManager.testAndSetAccountChanged(_address);\\n\\n // If we hadn't already loaded the account, then we'll need to charge \\\"nuisance gas\\\" based\\n // on the size of the contract code.\\n if (_wasAccountAlreadyChanged == false) {\\n ovmStateManager.incrementTotalUncommittedAccounts();\\n _useNuisanceGas(\\n (Lib_EthUtils.getCodeSize(_getAccountEthAddress(_address)) * NUISANCE_GAS_PER_CONTRACT_BYTE) + MIN_NUISANCE_GAS_PER_CONTRACT\\n );\\n }\\n }\\n\\n /**\\n * Validation whenever a slot needs to be loaded. Checks that the account exists, charges\\n * nuisance gas if the slot hasn't been loaded before.\\n * @param _contract Address of the account to load from.\\n * @param _key 32 byte key to load.\\n */\\n function _checkContractStorageLoad(\\n address _contract,\\n bytes32 _key\\n )\\n internal\\n {\\n // Another case of hidden complexity. If we didn't enforce this requirement, then a\\n // contract could pass in just enough gas to cause the INVALID_STATE_ACCESS check to fail\\n // on L1 but not on L2. A contract could use this behavior to prevent the\\n // OVM_ExecutionManager from detecting an invalid state access. Reverting with OUT_OF_GAS\\n // allows us to also charge for the full message nuisance gas, because you deserve that for\\n // trying to break the contract in this way.\\n if (gasleft() < MIN_GAS_FOR_INVALID_STATE_ACCESS) {\\n _revertWithFlag(RevertFlag.OUT_OF_GAS);\\n }\\n\\n // We need to make sure that the transaction isn't trying to access storage that hasn't\\n // been provided to the OVM_StateManager. We'll immediately abort if this is the case.\\n // We know that we have enough gas to do this check because of the above test.\\n if (ovmStateManager.hasContractStorage(_contract, _key) == false) {\\n _revertWithFlag(RevertFlag.INVALID_STATE_ACCESS);\\n }\\n\\n // Check whether the slot has been loaded before and mark it as loaded if not. We need\\n // this because \\\"nuisance gas\\\" only applies to the first time that a slot is loaded.\\n (\\n bool _wasContractStorageAlreadyLoaded\\n ) = ovmStateManager.testAndSetContractStorageLoaded(_contract, _key);\\n\\n // If we hadn't already loaded the account, then we'll need to charge some fixed amount of\\n // \\\"nuisance gas\\\".\\n if (_wasContractStorageAlreadyLoaded == false) {\\n _useNuisanceGas(NUISANCE_GAS_SLOAD);\\n }\\n }\\n\\n /**\\n * Validation whenever a slot needs to be changed. Checks that the account exists, charges\\n * nuisance gas if the slot hasn't been changed before.\\n * @param _contract Address of the account to change.\\n * @param _key 32 byte key to change.\\n */\\n function _checkContractStorageChange(\\n address _contract,\\n bytes32 _key\\n )\\n internal\\n {\\n // Start by checking for load to make sure we have the storage slot and that we charge the\\n // \\\"nuisance gas\\\" necessary to prove the storage slot state.\\n _checkContractStorageLoad(_contract, _key);\\n\\n // Check whether the slot has been changed before and mark it as changed if not. We need\\n // this because \\\"nuisance gas\\\" only applies to the first time that a slot is changed.\\n (\\n bool _wasContractStorageAlreadyChanged\\n ) = ovmStateManager.testAndSetContractStorageChanged(_contract, _key);\\n\\n // If we hadn't already changed the account, then we'll need to charge some fixed amount of\\n // \\\"nuisance gas\\\".\\n if (_wasContractStorageAlreadyChanged == false) {\\n // Changing a storage slot means that we're also going to have to change the\\n // corresponding account, so do an account change check.\\n _checkAccountChange(_contract);\\n\\n ovmStateManager.incrementTotalUncommittedContractStorage();\\n _useNuisanceGas(NUISANCE_GAS_SSTORE);\\n }\\n }\\n\\n\\n /************************************\\n * Internal Functions: Revert Logic *\\n ************************************/\\n\\n /**\\n * Simple encoding for revert data.\\n * @param _flag Flag to revert with.\\n * @param _data Additional user-provided revert data.\\n * @return _revertdata Encoded revert data.\\n */\\n function _encodeRevertData(\\n RevertFlag _flag,\\n bytes memory _data\\n )\\n internal\\n view\\n returns (\\n bytes memory _revertdata\\n )\\n {\\n // Out of gas and create exceptions will fundamentally return no data, so simulating it shouldn't either.\\n if (\\n _flag == RevertFlag.OUT_OF_GAS\\n || _flag == RevertFlag.CREATE_EXCEPTION\\n ) {\\n return bytes('');\\n }\\n\\n // INVALID_STATE_ACCESS doesn't need to return any data other than the flag.\\n if (_flag == RevertFlag.INVALID_STATE_ACCESS) {\\n return abi.encode(\\n _flag,\\n 0,\\n 0,\\n bytes('')\\n );\\n }\\n\\n // Just ABI encode the rest of the parameters.\\n return abi.encode(\\n _flag,\\n messageRecord.nuisanceGasLeft,\\n transactionRecord.ovmGasRefund,\\n _data\\n );\\n }\\n\\n /**\\n * Simple decoding for revert data.\\n * @param _revertdata Revert data to decode.\\n * @return _flag Flag used to revert.\\n * @return _nuisanceGasLeft Amount of nuisance gas unused by the message.\\n * @return _ovmGasRefund Amount of gas refunded during the message.\\n * @return _data Additional user-provided revert data.\\n */\\n function _decodeRevertData(\\n bytes memory _revertdata\\n )\\n internal\\n pure\\n returns (\\n RevertFlag _flag,\\n uint256 _nuisanceGasLeft,\\n uint256 _ovmGasRefund,\\n bytes memory _data\\n )\\n {\\n // A length of zero means the call ran out of gas, just return empty data.\\n if (_revertdata.length == 0) {\\n return (\\n RevertFlag.OUT_OF_GAS,\\n 0,\\n 0,\\n bytes('')\\n );\\n }\\n\\n // ABI decode the incoming data.\\n return abi.decode(_revertdata, (RevertFlag, uint256, uint256, bytes));\\n }\\n\\n /**\\n * Causes a message to revert or abort.\\n * @param _flag Flag to revert with.\\n * @param _data Additional user-provided data.\\n */\\n function _revertWithFlag(\\n RevertFlag _flag,\\n bytes memory _data\\n )\\n internal\\n {\\n // We don't want to revert when we're inside a CREATE or CREATE2, because those opcodes\\n // fail silently (we can't pass any data upwards). Instead, we set a flag and return a\\n // *single* byte, something the OVM_ExecutionManager will not return in any other case.\\n // We're thereby allowed to communicate failure without allowing contracts to trick us into\\n // thinking there was a failure.\\n bool isCreation;\\n assembly {\\n isCreation := eq(extcodesize(caller()), 0)\\n }\\n\\n if (isCreation) {\\n messageRecord.revertFlag = _flag;\\n\\n assembly {\\n return(0, 1)\\n }\\n }\\n\\n // If we're not inside a CREATE or CREATE2, we can simply encode the necessary data and\\n // revert normally.\\n bytes memory revertdata = _encodeRevertData(\\n _flag,\\n _data\\n );\\n\\n assembly {\\n revert(add(revertdata, 0x20), mload(revertdata))\\n }\\n }\\n\\n /**\\n * Causes a message to revert or abort.\\n * @param _flag Flag to revert with.\\n */\\n function _revertWithFlag(\\n RevertFlag _flag\\n )\\n internal\\n {\\n _revertWithFlag(_flag, bytes(''));\\n }\\n\\n\\n /******************************************\\n * Internal Functions: Nuisance Gas Logic *\\n ******************************************/\\n\\n /**\\n * Computes the nuisance gas limit from the gas limit.\\n * @dev This function is currently using a naive implementation whereby the nuisance gas limit\\n * is set to exactly equal the lesser of the gas limit or remaining gas. It's likely that\\n * this implementation is perfectly fine, but we may change this formula later.\\n * @param _gasLimit Gas limit to compute from.\\n * @return _nuisanceGasLimit Computed nuisance gas limit.\\n */\\n function _getNuisanceGasLimit(\\n uint256 _gasLimit\\n )\\n internal\\n view\\n returns (\\n uint256 _nuisanceGasLimit\\n )\\n {\\n return _gasLimit < gasleft() ? _gasLimit : gasleft();\\n }\\n\\n /**\\n * Uses a certain amount of nuisance gas.\\n * @param _amount Amount of nuisance gas to use.\\n */\\n function _useNuisanceGas(\\n uint256 _amount\\n )\\n internal\\n {\\n // Essentially the same as a standard OUT_OF_GAS, except we also retain a record of the gas\\n // refund to be given at the end of the transaction.\\n if (messageRecord.nuisanceGasLeft < _amount) {\\n _revertWithFlag(RevertFlag.EXCEEDS_NUISANCE_GAS);\\n }\\n\\n messageRecord.nuisanceGasLeft -= _amount;\\n }\\n\\n\\n /************************************\\n * Internal Functions: Gas Metering *\\n ************************************/\\n\\n /**\\n * Checks whether a transaction needs to start a new epoch and does so if necessary.\\n * @param _timestamp Transaction timestamp.\\n */\\n function _checkNeedsNewEpoch(\\n uint256 _timestamp\\n )\\n internal\\n {\\n if (\\n _timestamp >= (\\n _getGasMetadata(GasMetadataKey.CURRENT_EPOCH_START_TIMESTAMP)\\n + gasMeterConfig.secondsPerEpoch\\n )\\n ) {\\n _putGasMetadata(\\n GasMetadataKey.CURRENT_EPOCH_START_TIMESTAMP,\\n _timestamp\\n );\\n\\n _putGasMetadata(\\n GasMetadataKey.PREV_EPOCH_SEQUENCER_QUEUE_GAS,\\n _getGasMetadata(\\n GasMetadataKey.CUMULATIVE_SEQUENCER_QUEUE_GAS\\n )\\n );\\n\\n _putGasMetadata(\\n GasMetadataKey.PREV_EPOCH_L1TOL2_QUEUE_GAS,\\n _getGasMetadata(\\n GasMetadataKey.CUMULATIVE_L1TOL2_QUEUE_GAS\\n )\\n );\\n }\\n }\\n\\n /**\\n * Validates the gas limit for a given transaction.\\n * @param _gasLimit Gas limit provided by the transaction.\\n * @param _queueOrigin Queue from which the transaction originated.\\n * @return _valid Whether or not the gas limit is valid.\\n */\\n function _isValidGasLimit(\\n uint256 _gasLimit,\\n Lib_OVMCodec.QueueOrigin _queueOrigin\\n )\\n internal\\n returns (\\n bool _valid\\n )\\n {\\n // Always have to be below the maximum gas limit.\\n if (_gasLimit > gasMeterConfig.maxTransactionGasLimit) {\\n return false;\\n }\\n\\n // Always have to be above the minimum gas limit.\\n if (_gasLimit < gasMeterConfig.minTransactionGasLimit) {\\n return false;\\n }\\n\\n // TEMPORARY: Gas metering is disabled for minnet.\\n return true;\\n // GasMetadataKey cumulativeGasKey;\\n // GasMetadataKey prevEpochGasKey;\\n // if (_queueOrigin == Lib_OVMCodec.QueueOrigin.SEQUENCER_QUEUE) {\\n // cumulativeGasKey = GasMetadataKey.CUMULATIVE_SEQUENCER_QUEUE_GAS;\\n // prevEpochGasKey = GasMetadataKey.PREV_EPOCH_SEQUENCER_QUEUE_GAS;\\n // } else {\\n // cumulativeGasKey = GasMetadataKey.CUMULATIVE_L1TOL2_QUEUE_GAS;\\n // prevEpochGasKey = GasMetadataKey.PREV_EPOCH_L1TOL2_QUEUE_GAS;\\n // }\\n\\n // return (\\n // (\\n // _getGasMetadata(cumulativeGasKey)\\n // - _getGasMetadata(prevEpochGasKey)\\n // + _gasLimit\\n // ) < gasMeterConfig.maxGasPerQueuePerEpoch\\n // );\\n }\\n\\n /**\\n * Updates the cumulative gas after a transaction.\\n * @param _gasUsed Gas used by the transaction.\\n * @param _queueOrigin Queue from which the transaction originated.\\n */\\n function _updateCumulativeGas(\\n uint256 _gasUsed,\\n Lib_OVMCodec.QueueOrigin _queueOrigin\\n )\\n internal\\n {\\n GasMetadataKey cumulativeGasKey;\\n if (_queueOrigin == Lib_OVMCodec.QueueOrigin.SEQUENCER_QUEUE) {\\n cumulativeGasKey = GasMetadataKey.CUMULATIVE_SEQUENCER_QUEUE_GAS;\\n } else {\\n cumulativeGasKey = GasMetadataKey.CUMULATIVE_L1TOL2_QUEUE_GAS;\\n }\\n\\n _putGasMetadata(\\n cumulativeGasKey,\\n (\\n _getGasMetadata(cumulativeGasKey)\\n + gasMeterConfig.minTransactionGasLimit\\n + _gasUsed\\n - transactionRecord.ovmGasRefund\\n )\\n );\\n }\\n\\n /**\\n * Retrieves the value of a gas metadata key.\\n * @param _key Gas metadata key to retrieve.\\n * @return _value Value stored at the given key.\\n */\\n function _getGasMetadata(\\n GasMetadataKey _key\\n )\\n internal\\n returns (\\n uint256 _value\\n )\\n {\\n return uint256(_getContractStorage(\\n GAS_METADATA_ADDRESS,\\n bytes32(uint256(_key))\\n ));\\n }\\n\\n /**\\n * Sets the value of a gas metadata key.\\n * @param _key Gas metadata key to set.\\n * @param _value Value to store at the given key.\\n */\\n function _putGasMetadata(\\n GasMetadataKey _key,\\n uint256 _value\\n )\\n internal\\n {\\n _putContractStorage(\\n GAS_METADATA_ADDRESS,\\n bytes32(uint256(_key)),\\n bytes32(uint256(_value))\\n );\\n }\\n\\n\\n /*****************************************\\n * Internal Functions: Execution Context *\\n *****************************************/\\n\\n /**\\n * Swaps over to a new message context.\\n * @param _prevMessageContext Context we're switching from.\\n * @param _nextMessageContext Context we're switching to.\\n */\\n function _switchMessageContext(\\n MessageContext memory _prevMessageContext,\\n MessageContext memory _nextMessageContext\\n )\\n internal\\n {\\n // Avoid unnecessary the SSTORE.\\n if (_prevMessageContext.ovmCALLER != _nextMessageContext.ovmCALLER) {\\n messageContext.ovmCALLER = _nextMessageContext.ovmCALLER;\\n }\\n\\n // Avoid unnecessary the SSTORE.\\n if (_prevMessageContext.ovmADDRESS != _nextMessageContext.ovmADDRESS) {\\n messageContext.ovmADDRESS = _nextMessageContext.ovmADDRESS;\\n }\\n\\n // Avoid unnecessary the SSTORE.\\n if (_prevMessageContext.isStatic != _nextMessageContext.isStatic) {\\n messageContext.isStatic = _nextMessageContext.isStatic;\\n }\\n }\\n\\n /**\\n * Initializes the execution context.\\n * @param _transaction OVM transaction being executed.\\n */\\n function _initContext(\\n Lib_OVMCodec.Transaction memory _transaction\\n )\\n internal\\n {\\n transactionContext.ovmTIMESTAMP = _transaction.timestamp;\\n transactionContext.ovmNUMBER = _transaction.blockNumber;\\n transactionContext.ovmTXGASLIMIT = _transaction.gasLimit;\\n transactionContext.ovmL1QUEUEORIGIN = _transaction.l1QueueOrigin;\\n transactionContext.ovmL1TXORIGIN = _transaction.l1TxOrigin;\\n transactionContext.ovmGASLIMIT = gasMeterConfig.maxGasPerQueuePerEpoch;\\n\\n messageRecord.nuisanceGasLeft = _getNuisanceGasLimit(_transaction.gasLimit);\\n }\\n\\n /**\\n * Resets the transaction and message context.\\n */\\n function _resetContext()\\n internal\\n {\\n transactionContext.ovmL1TXORIGIN = address(0);\\n transactionContext.ovmTIMESTAMP = 0;\\n transactionContext.ovmNUMBER = 0;\\n transactionContext.ovmGASLIMIT = 0;\\n transactionContext.ovmTXGASLIMIT = 0;\\n transactionContext.ovmL1QUEUEORIGIN = Lib_OVMCodec.QueueOrigin.SEQUENCER_QUEUE;\\n\\n transactionRecord.ovmGasRefund = 0;\\n\\n messageContext.ovmCALLER = address(0);\\n messageContext.ovmADDRESS = address(0);\\n messageContext.isStatic = false;\\n\\n messageRecord.nuisanceGasLeft = 0;\\n messageRecord.revertFlag = RevertFlag.DID_NOT_REVERT;\\n }\\n}\\n\",\"keccak256\":\"0x691ade8b4e9ffe94822f300b00add6d709138dfbd31592c90c12db5512bf765c\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/precompiles/OVM_DeployerWhitelist.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.7.0;\\n\\n/* Library Imports */\\nimport { Lib_Bytes32Utils } from \\\"../../libraries/utils/Lib_Bytes32Utils.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_DeployerWhitelist } from \\\"../../iOVM/precompiles/iOVM_DeployerWhitelist.sol\\\";\\nimport { Lib_SafeExecutionManagerWrapper } from \\\"../../libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\\\";\\n\\n/**\\n * @title OVM_DeployerWhitelist\\n * @dev L2 CONTRACT (NOT COMPILED)\\n */\\ncontract OVM_DeployerWhitelist is iOVM_DeployerWhitelist {\\n\\n /**********************\\n * Contract Constants *\\n **********************/\\n\\n bytes32 internal constant KEY_INITIALIZED = 0x0000000000000000000000000000000000000000000000000000000000000010;\\n bytes32 internal constant KEY_OWNER = 0x0000000000000000000000000000000000000000000000000000000000000011;\\n bytes32 internal constant KEY_ALLOW_ARBITRARY_DEPLOYMENT = 0x0000000000000000000000000000000000000000000000000000000000000012;\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n \\n /**\\n * Blocks functions to anyone except the contract owner.\\n */\\n modifier onlyOwner() {\\n address owner = Lib_Bytes32Utils.toAddress(\\n Lib_SafeExecutionManagerWrapper.safeSLOAD(\\n KEY_OWNER\\n )\\n );\\n\\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(\\n Lib_SafeExecutionManagerWrapper.safeCALLER() == owner,\\n \\\"Function can only be called by the owner of this contract.\\\"\\n );\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n \\n /**\\n * Initializes the whitelist.\\n * @param _owner Address of the owner for this contract.\\n * @param _allowArbitraryDeployment Whether or not to allow arbitrary contract deployment.\\n */\\n function initialize(\\n address _owner,\\n bool _allowArbitraryDeployment\\n )\\n override\\n public\\n {\\n bool initialized = Lib_Bytes32Utils.toBool(\\n Lib_SafeExecutionManagerWrapper.safeSLOAD(KEY_INITIALIZED)\\n );\\n\\n if (initialized == true) {\\n return;\\n }\\n\\n Lib_SafeExecutionManagerWrapper.safeSSTORE(\\n KEY_INITIALIZED,\\n Lib_Bytes32Utils.fromBool(true)\\n );\\n Lib_SafeExecutionManagerWrapper.safeSSTORE(\\n KEY_OWNER,\\n Lib_Bytes32Utils.fromAddress(_owner)\\n );\\n Lib_SafeExecutionManagerWrapper.safeSSTORE(\\n KEY_ALLOW_ARBITRARY_DEPLOYMENT,\\n Lib_Bytes32Utils.fromBool(_allowArbitraryDeployment)\\n );\\n }\\n\\n /**\\n * Gets the owner of the whitelist.\\n */\\n function getOwner()\\n override\\n public\\n returns(\\n address\\n )\\n {\\n return Lib_Bytes32Utils.toAddress(\\n Lib_SafeExecutionManagerWrapper.safeSLOAD(\\n KEY_OWNER\\n )\\n );\\n }\\n\\n /**\\n * Adds or removes an address from the deployment whitelist.\\n * @param _deployer Address to update permissions for.\\n * @param _isWhitelisted Whether or not the address is whitelisted.\\n */\\n function setWhitelistedDeployer(\\n address _deployer,\\n bool _isWhitelisted\\n )\\n override\\n public\\n onlyOwner\\n {\\n Lib_SafeExecutionManagerWrapper.safeSSTORE(\\n Lib_Bytes32Utils.fromAddress(_deployer),\\n Lib_Bytes32Utils.fromBool(_isWhitelisted)\\n );\\n }\\n\\n /**\\n * Updates the owner of this contract.\\n * @param _owner Address of the new owner.\\n */\\n function setOwner(\\n address _owner\\n )\\n override\\n public\\n onlyOwner\\n {\\n Lib_SafeExecutionManagerWrapper.safeSSTORE(\\n KEY_OWNER,\\n Lib_Bytes32Utils.fromAddress(_owner)\\n );\\n }\\n\\n /**\\n * Updates the arbitrary deployment flag.\\n * @param _allowArbitraryDeployment Whether or not to allow arbitrary contract deployment.\\n */\\n function setAllowArbitraryDeployment(\\n bool _allowArbitraryDeployment\\n )\\n override\\n public\\n onlyOwner\\n {\\n Lib_SafeExecutionManagerWrapper.safeSSTORE(\\n KEY_ALLOW_ARBITRARY_DEPLOYMENT,\\n Lib_Bytes32Utils.fromBool(_allowArbitraryDeployment)\\n );\\n }\\n\\n /**\\n * Permanently enables arbitrary contract deployment and deletes the owner.\\n */\\n function enableArbitraryContractDeployment()\\n override\\n public\\n onlyOwner\\n {\\n setAllowArbitraryDeployment(true);\\n setOwner(address(0));\\n }\\n\\n /**\\n * Checks whether an address is allowed to deploy contracts.\\n * @param _deployer Address to check.\\n * @return _allowed Whether or not the address can deploy contracts.\\n */\\n function isDeployerAllowed(\\n address _deployer\\n )\\n override\\n public\\n returns (\\n bool _allowed\\n )\\n {\\n bool initialized = Lib_Bytes32Utils.toBool(\\n Lib_SafeExecutionManagerWrapper.safeSLOAD(KEY_INITIALIZED)\\n );\\n\\n if (initialized == false) {\\n return true;\\n }\\n\\n bool allowArbitraryDeployment = Lib_Bytes32Utils.toBool(\\n Lib_SafeExecutionManagerWrapper.safeSLOAD(KEY_ALLOW_ARBITRARY_DEPLOYMENT)\\n );\\n\\n if (allowArbitraryDeployment == true) {\\n return true;\\n }\\n\\n bool isWhitelisted = Lib_Bytes32Utils.toBool(\\n Lib_SafeExecutionManagerWrapper.safeSLOAD(\\n Lib_Bytes32Utils.fromAddress(_deployer)\\n )\\n );\\n\\n return isWhitelisted; \\n }\\n}\\n\",\"keccak256\":\"0x195ec68e19525110c89103602735662d3a534a559b5e4925a8cd4c2480825689\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/accounts/iOVM_ECDSAContractAccount.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title iOVM_ECDSAContractAccount\\n */\\ninterface iOVM_ECDSAContractAccount {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function execute(\\n bytes memory _transaction,\\n Lib_OVMCodec.EOASignatureType _signatureType,\\n uint8 _v,\\n bytes32 _r,\\n bytes32 _s\\n ) external returns (bool _success, bytes memory _returndata);\\n}\\n\",\"keccak256\":\"0x308729bc62dcffb11ff1d840781105cf1bf0dd4cbcfb1af704b800bb0cfe9b85\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_CanonicalTransactionChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title iOVM_CanonicalTransactionChain\\n */\\ninterface iOVM_CanonicalTransactionChain {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event TransactionEnqueued(\\n address _l1TxOrigin,\\n address _target,\\n uint256 _gasLimit,\\n bytes _data,\\n uint256 _queueIndex,\\n uint256 _timestamp\\n );\\n\\n event QueueBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event SequencerBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event TransactionBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct BatchContext {\\n uint256 numSequencedTransactions;\\n uint256 numSubsequentQueueTransactions;\\n uint256 timestamp;\\n uint256 blockNumber;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements()\\n external\\n view\\n returns (\\n uint256 _totalElements\\n );\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches()\\n external\\n view\\n returns (\\n uint256 _totalBatches\\n );\\n\\n /**\\n * Returns the index of the next element to be enqueued.\\n * @return Index for the next queue element.\\n */\\n function getNextQueueIndex()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Get the number of queue elements which have not yet been included.\\n * @return Length of the queue.\\n */\\n function getNumPendingQueueElements()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Retrieves the length of the queue, including\\n * both pending and canonical transactions.\\n * @return Length of the queue.\\n */\\n function getQueueLength()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Gets the queue element at a particular index.\\n * @param _index Index of the queue element to access.\\n * @return _element Queue element at the given index.\\n */\\n function getQueueElement(\\n uint256 _index\\n )\\n external\\n view\\n returns (\\n Lib_OVMCodec.QueueElement memory _element\\n );\\n\\n /**\\n * Adds a transaction to the queue.\\n * @param _target Target contract to send the transaction to.\\n * @param _gasLimit Gas limit for the given transaction.\\n * @param _data Transaction data.\\n */\\n function enqueue(\\n address _target,\\n uint256 _gasLimit,\\n bytes memory _data\\n )\\n external;\\n\\n /**\\n * Appends a given number of queued transactions as a single batch.\\n * @param _numQueuedTransactions Number of transactions to append.\\n */\\n function appendQueueBatch(\\n uint256 _numQueuedTransactions\\n )\\n external;\\n\\n /**\\n * Allows the sequencer to append a batch of transactions.\\n * @dev This function uses a custom encoding scheme for efficiency reasons.\\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\\n * .param _contexts Array of batch contexts.\\n * .param _transactionDataFields Array of raw transaction data.\\n */\\n function appendSequencerBatch(\\n // uint40 _shouldStartAtElement,\\n // uint24 _totalElementsToAppend,\\n // BatchContext[] _contexts,\\n // bytes[] _transactionDataFields\\n )\\n external;\\n\\n /**\\n * Verifies whether a transaction is included in the chain.\\n * @param _transaction Transaction to verify.\\n * @param _txChainElement Transaction chain element corresponding to the transaction.\\n * @param _batchHeader Header of the batch the transaction was included in.\\n * @param _inclusionProof Inclusion proof for the provided transaction chain element.\\n * @return True if the transaction exists in the CTC, false if not.\\n */\\n function verifyTransaction(\\n Lib_OVMCodec.Transaction memory _transaction,\\n Lib_OVMCodec.TransactionChainElement memory _txChainElement,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _inclusionProof\\n )\\n external\\n view\\n returns (\\n bool\\n );\\n}\\n\",\"keccak256\":\"0x82a4e62286c8bc5e2d3de33f66d9b707cb9636e553dca54b5e95277bd794a934\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_ChainStorageContainer.sol\":{\"content\":\"pragma solidity ^0.7.0;\\n\\n/**\\n * @title iOVM_ChainStorageContainer\\n */\\ninterface iOVM_ChainStorageContainer {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata()\\n external\\n view\\n returns (\\n bytes27\\n );\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length()\\n external\\n view\\n returns (\\n uint256\\n );\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(\\n bytes32 _object\\n )\\n external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(\\n bytes32 _object,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Pushes two objects into the container at the same time. A useful optimization.\\n * @param _objectA First 32 byte value to insert into the container.\\n * @param _objectB Second 32 byte value to insert into the container.\\n */\\n function push2(\\n bytes32 _objectA,\\n bytes32 _objectB\\n )\\n external;\\n\\n /**\\n * Pushes two objects into the container at the same time. Also allows setting the global\\n * metadata field.\\n * @param _objectA First 32 byte value to insert into the container.\\n * @param _objectB Second 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push2(\\n bytes32 _objectA,\\n bytes32 _objectB,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(\\n uint256 _index\\n )\\n external\\n view\\n returns (\\n bytes32\\n );\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index\\n )\\n external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Marks an index as overwritable, meaing the underlying buffer can start to write values over\\n * any objects before and including the given index.\\n */\\n function setNextOverwritableIndex(\\n uint256 _index\\n )\\n external;\\n}\\n\",\"keccak256\":\"0xcfca7da85b35d94c27581c2460b0d48fd0cc51fa72670cc7a2f7f760fb21a2f0\"},\"contracts/optimistic-ethereum/iOVM/execution/iOVM_ExecutionManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\ninterface iOVM_ExecutionManager {\\n /**********\\n * Enums *\\n *********/\\n\\n enum RevertFlag {\\n DID_NOT_REVERT,\\n OUT_OF_GAS,\\n INTENTIONAL_REVERT,\\n EXCEEDS_NUISANCE_GAS,\\n INVALID_STATE_ACCESS,\\n UNSAFE_BYTECODE,\\n CREATE_COLLISION,\\n STATIC_VIOLATION,\\n CREATE_EXCEPTION,\\n CREATOR_NOT_ALLOWED\\n }\\n\\n enum GasMetadataKey {\\n CURRENT_EPOCH_START_TIMESTAMP,\\n CUMULATIVE_SEQUENCER_QUEUE_GAS,\\n CUMULATIVE_L1TOL2_QUEUE_GAS,\\n PREV_EPOCH_SEQUENCER_QUEUE_GAS,\\n PREV_EPOCH_L1TOL2_QUEUE_GAS\\n }\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct GasMeterConfig {\\n uint256 minTransactionGasLimit;\\n uint256 maxTransactionGasLimit;\\n uint256 maxGasPerQueuePerEpoch;\\n uint256 secondsPerEpoch;\\n }\\n\\n struct GlobalContext {\\n uint256 ovmCHAINID;\\n }\\n\\n struct TransactionContext {\\n Lib_OVMCodec.QueueOrigin ovmL1QUEUEORIGIN;\\n uint256 ovmTIMESTAMP;\\n uint256 ovmNUMBER;\\n uint256 ovmGASLIMIT;\\n uint256 ovmTXGASLIMIT;\\n address ovmL1TXORIGIN;\\n }\\n\\n struct TransactionRecord {\\n uint256 ovmGasRefund;\\n }\\n\\n struct MessageContext {\\n address ovmCALLER;\\n address ovmADDRESS;\\n bool isStatic;\\n }\\n\\n struct MessageRecord {\\n uint256 nuisanceGasLeft;\\n RevertFlag revertFlag;\\n }\\n\\n\\n /************************************\\n * Transaction Execution Entrypoint *\\n ************************************/\\n\\n function run(\\n Lib_OVMCodec.Transaction calldata _transaction,\\n address _txStateManager\\n ) external;\\n\\n\\n /*******************\\n * Context Opcodes *\\n *******************/\\n\\n function ovmCALLER() external view returns (address _caller);\\n function ovmADDRESS() external view returns (address _address);\\n function ovmTIMESTAMP() external view returns (uint256 _timestamp);\\n function ovmNUMBER() external view returns (uint256 _number);\\n function ovmGASLIMIT() external view returns (uint256 _gasLimit);\\n function ovmCHAINID() external view returns (uint256 _chainId);\\n\\n\\n /**********************\\n * L2 Context Opcodes *\\n **********************/\\n\\n function ovmL1QUEUEORIGIN() external view returns (Lib_OVMCodec.QueueOrigin _queueOrigin);\\n function ovmL1TXORIGIN() external view returns (address _l1TxOrigin);\\n\\n\\n /*******************\\n * Halting Opcodes *\\n *******************/\\n\\n function ovmREVERT(bytes memory _data) external;\\n\\n\\n /*****************************\\n * Contract Creation Opcodes *\\n *****************************/\\n\\n function ovmCREATE(bytes memory _bytecode) external returns (address _contract);\\n function ovmCREATE2(bytes memory _bytecode, bytes32 _salt) external returns (address _contract);\\n\\n\\n /*******************************\\n * Account Abstraction Opcodes *\\n ******************************/\\n\\n function ovmGETNONCE() external returns (uint256 _nonce);\\n function ovmSETNONCE(uint256 _nonce) external;\\n function ovmCREATEEOA(bytes32 _messageHash, uint8 _v, bytes32 _r, bytes32 _s) external;\\n\\n\\n /****************************\\n * Contract Calling Opcodes *\\n ****************************/\\n\\n function ovmCALL(uint256 _gasLimit, address _address, bytes memory _calldata) external returns (bool _success, bytes memory _returndata);\\n function ovmSTATICCALL(uint256 _gasLimit, address _address, bytes memory _calldata) external returns (bool _success, bytes memory _returndata);\\n function ovmDELEGATECALL(uint256 _gasLimit, address _address, bytes memory _calldata) external returns (bool _success, bytes memory _returndata);\\n\\n\\n /****************************\\n * Contract Storage Opcodes *\\n ****************************/\\n\\n function ovmSLOAD(bytes32 _key) external returns (bytes32 _value);\\n function ovmSSTORE(bytes32 _key, bytes32 _value) external;\\n\\n\\n /*************************\\n * Contract Code Opcodes *\\n *************************/\\n\\n function ovmEXTCODECOPY(address _contract, uint256 _offset, uint256 _length) external returns (bytes memory _code);\\n function ovmEXTCODESIZE(address _contract) external returns (uint256 _size);\\n function ovmEXTCODEHASH(address _contract) external returns (bytes32 _hash);\\n\\n\\n /**************************************\\n * Public Functions: Execution Safety *\\n **************************************/\\n\\n function safeCREATE(address _address, bytes memory _bytecode) external;\\n\\n /***************************************\\n * Public Functions: Execution Context *\\n ***************************************/\\n\\n function getMaxTransactionGasLimit() external view returns (uint _maxTransactionGasLimit);\\n}\\n\",\"keccak256\":\"0xed2ea81fb87874b10ebd34339f0690107a841672941de37b405c2da2c285cff0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/execution/iOVM_SafetyChecker.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title iOVM_SafetyChecker\\n */\\ninterface iOVM_SafetyChecker {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function isBytecodeSafe(bytes calldata _bytecode) external view returns (bool);\\n}\\n\",\"keccak256\":\"0xc8a74aa7d179327dbc35b2dd8b805b76d7ea4dc031e043d957a73c2a136ff682\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/execution/iOVM_StateManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title iOVM_StateManager\\n */\\ninterface iOVM_StateManager {\\n\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n enum ItemState {\\n ITEM_UNTOUCHED,\\n ITEM_LOADED,\\n ITEM_CHANGED,\\n ITEM_COMMITTED\\n }\\n\\n /***************************\\n * Public Functions: Misc *\\n ***************************/\\n\\n function isAuthenticated(address _address) external view returns (bool);\\n\\n /***************************\\n * Public Functions: Setup *\\n ***************************/\\n\\n function owner() external view returns (address _owner);\\n function ovmExecutionManager() external view returns (address _ovmExecutionManager);\\n function setExecutionManager(address _ovmExecutionManager) external;\\n\\n\\n /************************************\\n * Public Functions: Account Access *\\n ************************************/\\n\\n function putAccount(address _address, Lib_OVMCodec.Account memory _account) external;\\n function putEmptyAccount(address _address) external;\\n function getAccount(address _address) external view returns (Lib_OVMCodec.Account memory _account);\\n function hasAccount(address _address) external view returns (bool _exists);\\n function hasEmptyAccount(address _address) external view returns (bool _exists);\\n function setAccountNonce(address _address, uint256 _nonce) external;\\n function getAccountNonce(address _address) external view returns (uint256 _nonce);\\n function getAccountEthAddress(address _address) external view returns (address _ethAddress);\\n function getAccountStorageRoot(address _address) external view returns (bytes32 _storageRoot);\\n function initPendingAccount(address _address) external;\\n function commitPendingAccount(address _address, address _ethAddress, bytes32 _codeHash) external;\\n function testAndSetAccountLoaded(address _address) external returns (bool _wasAccountAlreadyLoaded);\\n function testAndSetAccountChanged(address _address) external returns (bool _wasAccountAlreadyChanged);\\n function commitAccount(address _address) external returns (bool _wasAccountCommitted);\\n function incrementTotalUncommittedAccounts() external;\\n function getTotalUncommittedAccounts() external view returns (uint256 _total);\\n function wasAccountChanged(address _address) external view returns (bool);\\n function wasAccountCommitted(address _address) external view returns (bool);\\n\\n\\n /************************************\\n * Public Functions: Storage Access *\\n ************************************/\\n\\n function putContractStorage(address _contract, bytes32 _key, bytes32 _value) external;\\n function getContractStorage(address _contract, bytes32 _key) external view returns (bytes32 _value);\\n function hasContractStorage(address _contract, bytes32 _key) external returns (bool _exists);\\n function testAndSetContractStorageLoaded(address _contract, bytes32 _key) external returns (bool _wasContractStorageAlreadyLoaded);\\n function testAndSetContractStorageChanged(address _contract, bytes32 _key) external returns (bool _wasContractStorageAlreadyChanged);\\n function commitContractStorage(address _contract, bytes32 _key) external returns (bool _wasContractStorageCommitted);\\n function incrementTotalUncommittedContractStorage() external;\\n function getTotalUncommittedContractStorage() external view returns (uint256 _total);\\n function wasContractStorageChanged(address _contract, bytes32 _key) external view returns (bool);\\n function wasContractStorageCommitted(address _contract, bytes32 _key) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x18930f780c006c023ff13600917320286a56176724c45de6286a82ade19c0a5e\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/precompiles/iOVM_DeployerWhitelist.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title iOVM_DeployerWhitelist\\n */\\ninterface iOVM_DeployerWhitelist {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function initialize(address _owner, bool _allowArbitraryDeployment) external;\\n function getOwner() external returns (address _owner);\\n function setWhitelistedDeployer(address _deployer, bool _isWhitelisted) external;\\n function setOwner(address _newOwner) external;\\n function setAllowArbitraryDeployment(bool _allowArbitraryDeployment) external;\\n function enableArbitraryContractDeployment() external;\\n function isDeployerAllowed(address _deployer) external returns (bool _allowed);\\n}\\n\",\"keccak256\":\"0x969394371cacfc36493230150b6d629173ea72dfdf729330bede475b91d0f004\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/codec/Lib_OVMCodec.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../utils/Lib_Bytes32Utils.sol\\\";\\nimport { Lib_SafeExecutionManagerWrapper } from \\\"../../libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\\\";\\n\\n/**\\n * @title Lib_OVMCodec\\n */\\nlibrary Lib_OVMCodec {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n bytes constant internal RLP_NULL_BYTES = hex'80';\\n bytes constant internal NULL_BYTES = bytes('');\\n\\n // Ring buffer IDs\\n bytes32 constant internal RING_BUFFER_SCC_BATCHES = keccak256(\\\"RING_BUFFER_SCC_BATCHES\\\");\\n bytes32 constant internal RING_BUFFER_CTC_BATCHES = keccak256(\\\"RING_BUFFER_CTC_BATCHES\\\");\\n bytes32 constant internal RING_BUFFER_CTC_QUEUE = keccak256(\\\"RING_BUFFER_CTC_QUEUE\\\");\\n\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum EOASignatureType {\\n EIP155_TRANSACTON,\\n ETH_SIGNED_MESSAGE\\n }\\n\\n enum QueueOrigin {\\n SEQUENCER_QUEUE,\\n L1TOL2_QUEUE\\n }\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Account {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n address ethAddress;\\n bool isFresh;\\n }\\n\\n struct EVMAccount {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n }\\n\\n struct ChainBatchHeader {\\n uint256 batchIndex;\\n bytes32 batchRoot;\\n uint256 batchSize;\\n uint256 prevTotalElements;\\n bytes extraData;\\n }\\n\\n struct ChainInclusionProof {\\n uint256 index;\\n bytes32[] siblings;\\n }\\n\\n struct Transaction {\\n uint256 timestamp;\\n uint256 blockNumber;\\n QueueOrigin l1QueueOrigin;\\n address l1TxOrigin;\\n address entrypoint;\\n uint256 gasLimit;\\n bytes data;\\n }\\n\\n struct TransactionChainElement {\\n bool isSequenced;\\n uint256 queueIndex; // QUEUED TX ONLY\\n uint256 timestamp; // SEQUENCER TX ONLY\\n uint256 blockNumber; // SEQUENCER TX ONLY\\n bytes txData; // SEQUENCER TX ONLY\\n }\\n\\n struct QueueElement {\\n bytes32 queueRoot;\\n uint40 timestamp;\\n uint40 blockNumber;\\n }\\n\\n struct EIP155Transaction {\\n uint256 nonce;\\n uint256 gasPrice;\\n uint256 gasLimit;\\n address to;\\n uint256 value;\\n bytes data;\\n uint256 chainId;\\n }\\n\\n\\n /*********************************************\\n * Internal Functions: Encoding and Decoding *\\n *********************************************/\\n\\n /**\\n * Decodes an EOA transaction (i.e., native Ethereum RLP encoding).\\n * @param _transaction Encoded EOA transaction.\\n * @return _decoded Transaction decoded into a struct.\\n */\\n function decodeEIP155Transaction(\\n bytes memory _transaction,\\n bool _isEthSignedMessage\\n )\\n internal\\n pure\\n returns (\\n EIP155Transaction memory _decoded\\n )\\n {\\n if (_isEthSignedMessage) {\\n (\\n uint256 _nonce,\\n uint256 _gasLimit,\\n uint256 _gasPrice,\\n uint256 _chainId,\\n address _to,\\n bytes memory _data\\n ) = abi.decode(\\n _transaction,\\n (uint256, uint256, uint256, uint256, address ,bytes)\\n );\\n return EIP155Transaction({\\n nonce: _nonce,\\n gasPrice: _gasPrice,\\n gasLimit: _gasLimit,\\n to: _to,\\n value: 0,\\n data: _data,\\n chainId: _chainId\\n });\\n } else {\\n Lib_RLPReader.RLPItem[] memory decoded = Lib_RLPReader.readList(_transaction);\\n\\n return EIP155Transaction({\\n nonce: Lib_RLPReader.readUint256(decoded[0]),\\n gasPrice: Lib_RLPReader.readUint256(decoded[1]),\\n gasLimit: Lib_RLPReader.readUint256(decoded[2]),\\n to: Lib_RLPReader.readAddress(decoded[3]),\\n value: Lib_RLPReader.readUint256(decoded[4]),\\n data: Lib_RLPReader.readBytes(decoded[5]),\\n chainId: Lib_RLPReader.readUint256(decoded[6])\\n });\\n }\\n }\\n\\n function decompressEIP155Transaction(\\n bytes memory _transaction\\n )\\n internal\\n returns (\\n EIP155Transaction memory _decompressed\\n )\\n {\\n return EIP155Transaction({\\n gasLimit: Lib_BytesUtils.toUint24(_transaction, 0),\\n gasPrice: uint256(Lib_BytesUtils.toUint24(_transaction, 3)) * 1000000,\\n nonce: Lib_BytesUtils.toUint24(_transaction, 6),\\n to: Lib_BytesUtils.toAddress(_transaction, 9),\\n data: Lib_BytesUtils.slice(_transaction, 29),\\n chainId: Lib_SafeExecutionManagerWrapper.safeCHAINID(),\\n value: 0\\n });\\n }\\n\\n /**\\n * Encodes an EOA transaction back into the original transaction.\\n * @param _transaction EIP155transaction to encode.\\n * @param _isEthSignedMessage Whether or not this was an eth signed message.\\n * @return Encoded transaction.\\n */\\n function encodeEIP155Transaction(\\n EIP155Transaction memory _transaction,\\n bool _isEthSignedMessage\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n if (_isEthSignedMessage) {\\n return abi.encode(\\n _transaction.nonce,\\n _transaction.gasLimit,\\n _transaction.gasPrice,\\n _transaction.chainId,\\n _transaction.to,\\n _transaction.data\\n );\\n } else {\\n bytes[] memory raw = new bytes[](9);\\n\\n raw[0] = Lib_RLPWriter.writeUint(_transaction.nonce);\\n raw[1] = Lib_RLPWriter.writeUint(_transaction.gasPrice);\\n raw[2] = Lib_RLPWriter.writeUint(_transaction.gasLimit);\\n if (_transaction.to == address(0)) {\\n raw[3] = Lib_RLPWriter.writeBytes('');\\n } else {\\n raw[3] = Lib_RLPWriter.writeAddress(_transaction.to);\\n }\\n raw[4] = Lib_RLPWriter.writeUint(0);\\n raw[5] = Lib_RLPWriter.writeBytes(_transaction.data);\\n raw[6] = Lib_RLPWriter.writeUint(_transaction.chainId);\\n raw[7] = Lib_RLPWriter.writeBytes(bytes(''));\\n raw[8] = Lib_RLPWriter.writeBytes(bytes(''));\\n\\n return Lib_RLPWriter.writeList(raw);\\n }\\n }\\n\\n /**\\n * Encodes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return _encoded Encoded transaction bytes.\\n */\\n function encodeTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes memory _encoded\\n )\\n {\\n return abi.encodePacked(\\n _transaction.timestamp,\\n _transaction.blockNumber,\\n _transaction.l1QueueOrigin,\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n );\\n }\\n\\n /**\\n * Hashes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return _hash Hashed transaction\\n */\\n function hashTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes32 _hash\\n )\\n {\\n return keccak256(encodeTransaction(_transaction));\\n }\\n\\n /**\\n * Converts an OVM account to an EVM account.\\n * @param _in OVM account to convert.\\n * @return _out Converted EVM account.\\n */\\n function toEVMAccount(\\n Account memory _in\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory _out\\n )\\n {\\n return EVMAccount({\\n nonce: _in.nonce,\\n balance: _in.balance,\\n storageRoot: _in.storageRoot,\\n codeHash: _in.codeHash\\n });\\n }\\n\\n /**\\n * @notice RLP-encodes an account state struct.\\n * @param _account Account state struct.\\n * @return _encoded RLP-encoded account state.\\n */\\n function encodeEVMAccount(\\n EVMAccount memory _account\\n )\\n internal\\n pure\\n returns (\\n bytes memory _encoded\\n )\\n {\\n bytes[] memory raw = new bytes[](4);\\n\\n // Unfortunately we can't create this array outright because\\n // Lib_RLPWriter.writeList will reject fixed-size arrays. Assigning\\n // index-by-index circumvents this issue.\\n raw[0] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.nonce)\\n )\\n );\\n raw[1] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.balance)\\n )\\n );\\n raw[2] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.storageRoot));\\n raw[3] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.codeHash));\\n\\n return Lib_RLPWriter.writeList(raw);\\n }\\n\\n /**\\n * @notice Decodes an RLP-encoded account state into a useful struct.\\n * @param _encoded RLP-encoded account state.\\n * @return _account Account state struct.\\n */\\n function decodeEVMAccount(\\n bytes memory _encoded\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory _account\\n )\\n {\\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\\n\\n return EVMAccount({\\n nonce: Lib_RLPReader.readUint256(accountState[0]),\\n balance: Lib_RLPReader.readUint256(accountState[1]),\\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\\n });\\n }\\n\\n /**\\n * Calculates a hash for a given batch header.\\n * @param _batchHeader Header to hash.\\n * @return _hash Hash of the header.\\n */\\n function hashBatchHeader(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n internal\\n pure\\n returns (\\n bytes32 _hash\\n )\\n {\\n return keccak256(\\n abi.encode(\\n _batchHeader.batchRoot,\\n _batchHeader.batchSize,\\n _batchHeader.prevTotalElements,\\n _batchHeader.extraData\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0x19d78734777b4998f1544e235cf3934f20c5055cd76c2bd60bf0f6dacdd72b3a\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// +build ovm\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Contract Imports */\\nimport { Ownable } from \\\"./Lib_Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n /*******************************************\\n * Contract Variables: Internal Accounting *\\n *******************************************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n public\\n onlyOwner\\n {\\n emit AddressSet(_name, _address);\\n addresses[_getNameHash(_name)] = _address;\\n }\\n\\n function getAddress(\\n string memory _name\\n )\\n public\\n view\\n returns (address)\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32 _hash\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xdf802e1cc6474df913626991e9fca3835c620a519f397afe04bf9c260e723257\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// +build ovm\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\ncontract Lib_AddressResolver {\\n\\n /*******************************************\\n * Contract Variables: Contract References *\\n *******************************************/\\n\\n Lib_AddressManager internal libAddressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(\\n address _libAddressManager\\n ) public {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function resolve(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address _contract\\n )\\n {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0xf3b9d78b309ddeec259ce3e0e1cfdef3ca40938e9a81971b28ce2b8ea327f533\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// +build ovm\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Ownable\\n * @dev Adapted from https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol\\n */\\nabstract contract Ownable {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n address public owner;\\n\\n\\n /**********\\n * Events *\\n **********/\\n\\n event OwnershipTransferred(\\n address indexed previousOwner,\\n address indexed newOwner\\n );\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n constructor() internal {\\n owner = msg.sender;\\n emit OwnershipTransferred(address(0), owner);\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n owner == msg.sender,\\n \\\"Ownable: caller is not the owner\\\"\\n );\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function renounceOwnership()\\n public\\n virtual\\n onlyOwner\\n {\\n emit OwnershipTransferred(owner, address(0));\\n owner = address(0);\\n }\\n\\n function transferOwnership(address _newOwner)\\n public\\n virtual\\n onlyOwner\\n {\\n require(\\n _newOwner != address(0),\\n \\\"Ownable: new owner cannot be the zero address\\\"\\n );\\n\\n emit OwnershipTransferred(owner, _newOwner);\\n owner = _newOwner;\\n }\\n}\\n\",\"keccak256\":\"0xe0409fbd236d16ca6be439d9d97dd36d0d9a0697ee0062d49588b9d29c248e47\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPReader.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.7.0;\\n\\n/**\\n * @title Lib_RLPReader\\n * @dev Adapted from \\\"RLPReader\\\" by Hamdi Allam (hamdi.allam97@gmail.com).\\n */\\nlibrary Lib_RLPReader {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 constant internal MAX_LIST_LENGTH = 32;\\n\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum RLPItemType {\\n DATA_ITEM,\\n LIST_ITEM\\n }\\n\\n \\n /***********\\n * Structs *\\n ***********/\\n\\n struct RLPItem {\\n uint256 length;\\n uint256 ptr;\\n }\\n \\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n \\n /**\\n * Converts bytes to a reference to memory position and length.\\n * @param _in Input bytes to convert.\\n * @return Output memory reference.\\n */\\n function toRLPItem(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem memory\\n )\\n {\\n uint256 ptr;\\n assembly {\\n ptr := add(_in, 32)\\n }\\n\\n return RLPItem({\\n length: _in.length,\\n ptr: ptr\\n });\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n (\\n uint256 listOffset,\\n ,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.LIST_ITEM,\\n \\\"Invalid RLP list value.\\\"\\n );\\n\\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\\n // writing to the length. Since we can't know the number of RLP items without looping over\\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\\n // simply set a reasonable maximum list length and decrease the size before we finish.\\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\\n\\n uint256 itemCount = 0;\\n uint256 offset = listOffset;\\n while (offset < _in.length) {\\n require(\\n itemCount < MAX_LIST_LENGTH,\\n \\\"Provided RLP list exceeds max list length.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n ) = _decodeLength(RLPItem({\\n length: _in.length - offset,\\n ptr: _in.ptr + offset\\n }));\\n\\n out[itemCount] = RLPItem({\\n length: itemLength + itemOffset,\\n ptr: _in.ptr + offset\\n });\\n\\n itemCount += 1;\\n offset += itemOffset + itemLength;\\n }\\n\\n // Decrease the array size to match the actual item count.\\n assembly {\\n mstore(out, itemCount)\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n return readList(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes value.\\\"\\n );\\n\\n return _copy(_in.ptr, itemOffset, itemLength);\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return readBytes(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return string(readBytes(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return readString(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n require(\\n _in.length <= 33,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr + itemOffset;\\n bytes32 out;\\n assembly {\\n out := mload(ptr)\\n\\n // Shift the bytes over to match the item size.\\n if lt(itemLength, 32) {\\n out := div(out, exp(256, sub(32, itemLength)))\\n }\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return readBytes32(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return uint256(readBytes32(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return readUint256(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n require(\\n _in.length == 1,\\n \\\"Invalid RLP boolean value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 out;\\n assembly {\\n out := byte(0, mload(ptr))\\n }\\n\\n return out != 0;\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return readBool(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n if (_in.length == 1) {\\n return address(0);\\n }\\n\\n require(\\n _in.length == 21,\\n \\\"Invalid RLP address value.\\\"\\n );\\n\\n return address(readUint256(_in));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return readAddress(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads the raw bytes of an RLP item.\\n * @param _in RLP item to read.\\n * @return Raw RLP bytes.\\n */\\n function readRawBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in);\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Decodes the length of an RLP item.\\n * @param _in RLP item to decode.\\n * @return Offset of the encoded data.\\n * @return Length of the encoded data.\\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\\n */\\n function _decodeLength(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n uint256,\\n uint256,\\n RLPItemType\\n )\\n {\\n require(\\n _in.length > 0,\\n \\\"RLP item cannot be null.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 prefix;\\n assembly {\\n prefix := byte(0, mload(ptr))\\n }\\n\\n if (prefix <= 0x7f) {\\n // Single byte.\\n\\n return (0, 1, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xb7) {\\n // Short string.\\n\\n uint256 strLen = prefix - 0x80;\\n \\n require(\\n _in.length > strLen,\\n \\\"Invalid RLP short string.\\\"\\n );\\n\\n return (1, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xbf) {\\n // Long string.\\n uint256 lenOfStrLen = prefix - 0xb7;\\n\\n require(\\n _in.length > lenOfStrLen,\\n \\\"Invalid RLP long string length.\\\"\\n );\\n\\n uint256 strLen;\\n assembly {\\n // Pick out the string length.\\n strLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfStrLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfStrLen + strLen,\\n \\\"Invalid RLP long string.\\\"\\n );\\n\\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xf7) {\\n // Short list.\\n uint256 listLen = prefix - 0xc0;\\n\\n require(\\n _in.length > listLen,\\n \\\"Invalid RLP short list.\\\"\\n );\\n\\n return (1, listLen, RLPItemType.LIST_ITEM);\\n } else {\\n // Long list.\\n uint256 lenOfListLen = prefix - 0xf7;\\n\\n require(\\n _in.length > lenOfListLen,\\n \\\"Invalid RLP long list length.\\\"\\n );\\n\\n uint256 listLen;\\n assembly {\\n // Pick out the list length.\\n listLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfListLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfListLen + listLen,\\n \\\"Invalid RLP long list.\\\"\\n );\\n\\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\\n }\\n }\\n\\n /**\\n * Copies the bytes from a memory location.\\n * @param _src Pointer to the location to read from.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Copied bytes.\\n */\\n function _copy(\\n uint256 _src,\\n uint256 _offset,\\n uint256 _length\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out = new bytes(_length);\\n if (out.length == 0) {\\n return out;\\n }\\n\\n uint256 src = _src + _offset;\\n uint256 dest;\\n assembly {\\n dest := add(out, 32)\\n }\\n\\n // Copy over as many complete words as we can.\\n for (uint256 i = 0; i < _length / 32; i++) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n\\n src += 32;\\n dest += 32;\\n }\\n\\n // Pick out the remaining bytes.\\n uint256 mask = 256 ** (32 - (_length % 32)) - 1;\\n assembly {\\n mstore(\\n dest,\\n or(\\n and(mload(src), not(mask)),\\n and(mload(dest), mask)\\n )\\n )\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Copies an RLP item into bytes.\\n * @param _in RLP item to copy.\\n * @return Copied bytes.\\n */\\n function _copy(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in.ptr, 0, _in.length);\\n }\\n}\\n\",\"keccak256\":\"0x8338f7b6e5f0ded8fc36d9088fd127ee53ae4040ca3f4838eb6123f642d38c62\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPWriter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.7.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\n\\n/**\\n * @title Lib_RLPWriter\\n * @author Bakaoh (with modifications)\\n */\\nlibrary Lib_RLPWriter {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * RLP encodes a byte string.\\n * @param _in The byte string to encode.\\n * @return _out The RLP encoded string in bytes.\\n */\\n function writeBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n bytes memory encoded;\\n\\n if (_in.length == 1 && uint8(_in[0]) < 128) {\\n encoded = _in;\\n } else {\\n encoded = Lib_BytesUtils.concat(_writeLength(_in.length, 128), _in);\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * RLP encodes a list of RLP encoded byte byte strings.\\n * @param _in The list of RLP encoded byte strings.\\n * @return _out The RLP encoded list of items in bytes.\\n */\\n function writeList(\\n bytes[] memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n bytes memory list = _flatten(_in);\\n return Lib_BytesUtils.concat(_writeLength(list.length, 192), list);\\n }\\n\\n /**\\n * RLP encodes a string.\\n * @param _in The string to encode.\\n * @return _out The RLP encoded string in bytes.\\n */\\n function writeString(\\n string memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(bytes(_in));\\n }\\n\\n /**\\n * RLP encodes an address.\\n * @param _in The address to encode.\\n * @return _out The RLP encoded address in bytes.\\n */\\n function writeAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a uint.\\n * @param _in The uint256 to encode.\\n * @return _out The RLP encoded uint256 in bytes.\\n */\\n function writeUint(\\n uint256 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(_toBinary(_in));\\n }\\n\\n /**\\n * RLP encodes a bool.\\n * @param _in The bool to encode.\\n * @return _out The RLP encoded bool in bytes.\\n */\\n function writeBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n bytes memory encoded = new bytes(1);\\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\\n return encoded;\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\\n * @param _len The length of the string or the payload.\\n * @param _offset 128 if item is string, 192 if item is list.\\n * @return _encoded RLP encoded bytes.\\n */\\n function _writeLength(\\n uint256 _len,\\n uint256 _offset\\n )\\n private\\n pure\\n returns (\\n bytes memory _encoded\\n )\\n {\\n bytes memory encoded;\\n\\n if (_len < 56) {\\n encoded = new bytes(1);\\n encoded[0] = byte(uint8(_len) + uint8(_offset));\\n } else {\\n uint256 lenLen;\\n uint256 i = 1;\\n while (_len / i != 0) {\\n lenLen++;\\n i *= 256;\\n }\\n\\n encoded = new bytes(lenLen + 1);\\n encoded[0] = byte(uint8(lenLen) + uint8(_offset) + 55);\\n for(i = 1; i <= lenLen; i++) {\\n encoded[i] = byte(uint8((_len / (256**(lenLen-i))) % 256));\\n }\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * Encode integer in big endian binary form with no leading zeroes.\\n * @notice TODO: This should be optimized with assembly to save gas costs.\\n * @param _x The integer to encode.\\n * @return _binary RLP encoded bytes.\\n */\\n function _toBinary(\\n uint256 _x\\n )\\n private\\n pure\\n returns (\\n bytes memory _binary\\n )\\n {\\n bytes memory b = abi.encodePacked(_x);\\n\\n uint256 i = 0;\\n for (; i < 32; i++) {\\n if (b[i] != 0) {\\n break;\\n }\\n }\\n\\n bytes memory res = new bytes(32 - i);\\n for (uint256 j = 0; j < res.length; j++) {\\n res[j] = b[i++];\\n }\\n\\n return res;\\n }\\n\\n /**\\n * Copies a piece of memory to another location.\\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\\n * @param _dest Destination location.\\n * @param _src Source location.\\n * @param _len Length of memory to copy.\\n */\\n function _memcpy(\\n uint256 _dest,\\n uint256 _src,\\n uint256 _len\\n )\\n private\\n pure\\n {\\n uint256 dest = _dest;\\n uint256 src = _src;\\n uint256 len = _len;\\n\\n for(; len >= 32; len -= 32) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n dest += 32;\\n src += 32;\\n }\\n\\n uint256 mask = 256 ** (32 - len) - 1;\\n assembly {\\n let srcpart := and(mload(src), not(mask))\\n let destpart := and(mload(dest), mask)\\n mstore(dest, or(destpart, srcpart))\\n }\\n }\\n\\n /**\\n * Flattens a list of byte strings into one byte string.\\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\\n * @param _list List of byte strings to flatten.\\n * @return _flattened The flattened byte string.\\n */\\n function _flatten(\\n bytes[] memory _list\\n )\\n private\\n pure\\n returns (\\n bytes memory _flattened\\n )\\n {\\n if (_list.length == 0) {\\n return new bytes(0);\\n }\\n\\n uint256 len;\\n uint256 i = 0;\\n for (; i < _list.length; i++) {\\n len += _list[i].length;\\n }\\n\\n bytes memory flattened = new bytes(len);\\n uint256 flattenedPtr;\\n assembly { flattenedPtr := add(flattened, 0x20) }\\n\\n for(i = 0; i < _list.length; i++) {\\n bytes memory item = _list[i];\\n\\n uint256 listPtr;\\n assembly { listPtr := add(item, 0x20)}\\n\\n _memcpy(flattenedPtr, listPtr, item.length);\\n flattenedPtr += _list[i].length;\\n }\\n\\n return flattened;\\n }\\n}\",\"keccak256\":\"0x6d1aaef567f8a91bb965b95a95637f433a1f0ac4cf0bc1e209cdb1dd5b0f204b\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_Bytes32Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.7.0;\\n\\n/**\\n * @title Lib_Byte32Utils\\n */\\nlibrary Lib_Bytes32Utils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function toBool(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bool _out\\n )\\n {\\n return _in != 0;\\n }\\n\\n function fromBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes32 _out\\n )\\n {\\n return bytes32(uint256(_in ? 1 : 0));\\n }\\n\\n function toAddress(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n address _out\\n )\\n {\\n return address(uint160(uint256(_in)));\\n }\\n\\n function fromAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes32 _out\\n )\\n {\\n return bytes32(uint256(_in));\\n }\\n\\n function removeLeadingZeros(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n bytes memory out;\\n\\n assembly {\\n // Figure out how many leading zero bytes to remove.\\n let shift := 0\\n for { let i := 0 } and(lt(i, 32), eq(byte(i, _in), 0)) { i := add(i, 1) } {\\n shift := add(shift, 1)\\n }\\n\\n // Reserve some space for our output and fix the free memory pointer.\\n out := mload(0x40)\\n mstore(0x40, add(out, 0x40))\\n\\n // Shift the value and store it into the output bytes.\\n mstore(add(out, 0x20), shl(mul(shift, 8), _in))\\n\\n // Store the new size (with leading zero bytes removed) in the output byte size.\\n mstore(out, sub(32, shift))\\n }\\n\\n return out;\\n }\\n}\\n\",\"keccak256\":\"0x06f97590a80a01daa3bf6aa795449aea91a78684c646b4a6caeece8ef919c80c\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_BytesUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.7.0;\\n\\n/**\\n * @title Lib_BytesUtils\\n */\\nlibrary Lib_BytesUtils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function concat(\\n bytes memory _preBytes,\\n bytes memory _postBytes\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n bytes memory tempBytes;\\n\\n assembly {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // Store the length of the first bytes array at the beginning of\\n // the memory for tempBytes.\\n let length := mload(_preBytes)\\n mstore(tempBytes, length)\\n\\n // Maintain a memory counter for the current write location in the\\n // temp bytes array by adding the 32 bytes for the array length to\\n // the starting location.\\n let mc := add(tempBytes, 0x20)\\n // Stop copying when the memory counter reaches the length of the\\n // first bytes array.\\n let end := add(mc, length)\\n\\n for {\\n // Initialize a copy counter to the start of the _preBytes data,\\n // 32 bytes into its memory.\\n let cc := add(_preBytes, 0x20)\\n } lt(mc, end) {\\n // Increase both counters by 32 bytes each iteration.\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n // Write the _preBytes data into the tempBytes memory 32 bytes\\n // at a time.\\n mstore(mc, mload(cc))\\n }\\n\\n // Add the length of _postBytes to the current length of tempBytes\\n // and store it as the new length in the first 32 bytes of the\\n // tempBytes memory.\\n length := mload(_postBytes)\\n mstore(tempBytes, add(length, mload(tempBytes)))\\n\\n // Move the memory counter back from a multiple of 0x20 to the\\n // actual end of the _preBytes data.\\n mc := end\\n // Stop copying when the memory counter reaches the new combined\\n // length of the arrays.\\n end := add(mc, length)\\n\\n for {\\n let cc := add(_postBytes, 0x20)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n // Update the free-memory pointer by padding our last write location\\n // to 32 bytes: add 31 bytes to the end of tempBytes to move to the\\n // next 32 byte block, then round down to the nearest multiple of\\n // 32. If the sum of the length of the two arrays is zero then add\\n // one before rounding down to leave a blank 32 bytes (the length block with 0).\\n mstore(0x40, and(\\n add(add(end, iszero(add(length, mload(_preBytes)))), 31),\\n not(31) // Round down to the nearest 32 bytes.\\n ))\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_start + _length >= _start, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n if (_bytes.length - _start == 0) {\\n return bytes('');\\n }\\n\\n return slice(_bytes, _start, _bytes.length - _start);\\n }\\n\\n function toBytes32PadLeft(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes32)\\n {\\n bytes32 ret;\\n uint256 len = _bytes.length <= 32 ? _bytes.length : 32;\\n assembly {\\n ret := shr(mul(sub(32, len), 8), mload(add(_bytes, 32)))\\n }\\n return ret;\\n }\\n\\n function toBytes32(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes32)\\n {\\n if (_bytes.length < 32) {\\n bytes32 ret;\\n assembly {\\n ret := mload(add(_bytes, 32))\\n }\\n return ret;\\n }\\n\\n return abi.decode(_bytes,(bytes32)); // will truncate if input length > 32 bytes\\n }\\n\\n function toUint256(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (uint256)\\n {\\n return uint256(toBytes32(_bytes));\\n }\\n\\n function toUint24(bytes memory _bytes, uint256 _start) internal pure returns (uint24) {\\n require(_start + 3 >= _start, \\\"toUint24_overflow\\\");\\n require(_bytes.length >= _start + 3 , \\\"toUint24_outOfBounds\\\");\\n uint24 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x3), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toUint8(bytes memory _bytes, uint256 _start) internal pure returns (uint8) {\\n require(_start + 1 >= _start, \\\"toUint8_overflow\\\");\\n require(_bytes.length >= _start + 1 , \\\"toUint8_outOfBounds\\\");\\n uint8 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x1), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toAddress(bytes memory _bytes, uint256 _start) internal pure returns (address) {\\n require(_start + 20 >= _start, \\\"toAddress_overflow\\\");\\n require(_bytes.length >= _start + 20, \\\"toAddress_outOfBounds\\\");\\n address tempAddress;\\n\\n assembly {\\n tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000)\\n }\\n\\n return tempAddress;\\n }\\n\\n function toNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n bytes memory nibbles = new bytes(_bytes.length * 2);\\n\\n for (uint256 i = 0; i < _bytes.length; i++) {\\n nibbles[i * 2] = _bytes[i] >> 4;\\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\\n }\\n\\n return nibbles;\\n }\\n\\n function fromNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n bytes memory ret = new bytes(_bytes.length / 2);\\n\\n for (uint256 i = 0; i < ret.length; i++) {\\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\\n }\\n\\n return ret;\\n }\\n\\n function equal(\\n bytes memory _bytes,\\n bytes memory _other\\n )\\n internal\\n pure\\n returns (bool)\\n {\\n return keccak256(_bytes) == keccak256(_other);\\n }\\n}\\n\",\"keccak256\":\"0x849e4fedd81cd260e4c3b74b953f00636323574c60d363f36ab331e94aab9219\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_ECDSAUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.7.0;\\n\\n/**\\n * @title Lib_ECDSAUtils\\n */\\nlibrary Lib_ECDSAUtils {\\n\\n /**************************************\\n * Internal Functions: ECDSA Recovery *\\n **************************************/\\n\\n /**\\n * Recovers a signed address given a message and signature.\\n * @param _message Message that was originally signed.\\n * @param _isEthSignedMessage Whether or not the user used the `Ethereum Signed Message` prefix.\\n * @param _v Signature `v` parameter.\\n * @param _r Signature `r` parameter.\\n * @param _s Signature `s` parameter.\\n * @return _sender Signer address.\\n */\\n function recover(\\n bytes memory _message,\\n bool _isEthSignedMessage,\\n uint8 _v,\\n bytes32 _r,\\n bytes32 _s\\n )\\n internal\\n pure\\n returns (\\n address _sender\\n )\\n {\\n bytes32 messageHash = getMessageHash(_message, _isEthSignedMessage);\\n\\n return ecrecover(\\n messageHash,\\n _v + 27,\\n _r,\\n _s\\n );\\n }\\n\\n function getMessageHash(\\n bytes memory _message,\\n bool _isEthSignedMessage\\n )\\n internal\\n pure\\n returns (bytes32) {\\n if (_isEthSignedMessage) {\\n return getEthSignedMessageHash(_message);\\n }\\n return getNativeMessageHash(_message);\\n }\\n\\n\\n /*************************************\\n * Private Functions: ECDSA Recovery *\\n *************************************/\\n\\n /**\\n * Gets the native message hash (simple keccak256) for a message.\\n * @param _message Message to hash.\\n * @return _messageHash Native message hash.\\n */\\n function getNativeMessageHash(\\n bytes memory _message\\n )\\n private\\n pure\\n returns (\\n bytes32 _messageHash\\n )\\n {\\n return keccak256(_message);\\n }\\n\\n /**\\n * Gets the hash of a message with the `Ethereum Signed Message` prefix.\\n * @param _message Message to hash.\\n * @return _messageHash Prefixed message hash.\\n */\\n function getEthSignedMessageHash(\\n bytes memory _message\\n )\\n private\\n pure\\n returns (\\n bytes32 _messageHash\\n )\\n {\\n bytes memory prefix = \\\"\\\\x19Ethereum Signed Message:\\\\n32\\\";\\n bytes32 messageHash = keccak256(_message);\\n return keccak256(abi.encodePacked(prefix, messageHash));\\n }\\n}\",\"keccak256\":\"0x7d6a4cb0f462bfbd9fa703a8ab95156a5f066a15aeeb8e683c90c93fc71736f2\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_EthUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.7.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"./Lib_Bytes32Utils.sol\\\";\\n\\n/**\\n * @title Lib_EthUtils\\n */\\nlibrary Lib_EthUtils {\\n\\n /***********************************\\n * Internal Functions: Code Access *\\n ***********************************/\\n\\n /**\\n * Gets the code for a given address.\\n * @param _address Address to get code for.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return _code Code read from the contract.\\n */\\n function getCode(\\n address _address,\\n uint256 _offset,\\n uint256 _length\\n )\\n internal\\n view\\n returns (\\n bytes memory _code\\n )\\n {\\n assembly {\\n _code := mload(0x40)\\n mstore(0x40, add(_code, add(_length, 0x20)))\\n mstore(_code, _length)\\n extcodecopy(_address, add(_code, 0x20), _offset, _length)\\n }\\n\\n return _code;\\n }\\n\\n /**\\n * Gets the full code for a given address.\\n * @param _address Address to get code for.\\n * @return _code Full code of the contract.\\n */\\n function getCode(\\n address _address\\n )\\n internal\\n view\\n returns (\\n bytes memory _code\\n )\\n {\\n return getCode(\\n _address,\\n 0,\\n getCodeSize(_address)\\n );\\n }\\n\\n /**\\n * Gets the size of a contract's code in bytes.\\n * @param _address Address to get code size for.\\n * @return _codeSize Size of the contract's code in bytes.\\n */\\n function getCodeSize(\\n address _address\\n )\\n internal\\n view\\n returns (\\n uint256 _codeSize\\n )\\n {\\n assembly {\\n _codeSize := extcodesize(_address)\\n }\\n\\n return _codeSize;\\n }\\n\\n /**\\n * Gets the hash of a contract's code.\\n * @param _address Address to get a code hash for.\\n * @return _codeHash Hash of the contract's code.\\n */\\n function getCodeHash(\\n address _address\\n )\\n internal\\n view\\n returns (\\n bytes32 _codeHash\\n )\\n {\\n assembly {\\n _codeHash := extcodehash(_address)\\n }\\n\\n return _codeHash;\\n }\\n\\n\\n /*****************************************\\n * Internal Functions: Contract Creation *\\n *****************************************/\\n\\n /**\\n * Creates a contract with some given initialization code.\\n * @param _code Contract initialization code.\\n * @return _created Address of the created contract.\\n */\\n function createContract(\\n bytes memory _code\\n )\\n internal\\n returns (\\n address _created\\n )\\n {\\n assembly {\\n _created := create(\\n 0,\\n add(_code, 0x20),\\n mload(_code)\\n )\\n }\\n\\n return _created;\\n }\\n\\n /**\\n * Computes the address that would be generated by CREATE.\\n * @param _creator Address creating the contract.\\n * @param _nonce Creator's nonce.\\n * @return _address Address to be generated by CREATE.\\n */\\n function getAddressForCREATE(\\n address _creator,\\n uint256 _nonce\\n )\\n internal\\n pure\\n returns (\\n address _address\\n )\\n {\\n bytes[] memory encoded = new bytes[](2);\\n encoded[0] = Lib_RLPWriter.writeAddress(_creator);\\n encoded[1] = Lib_RLPWriter.writeUint(_nonce);\\n\\n bytes memory encodedList = Lib_RLPWriter.writeList(encoded);\\n return Lib_Bytes32Utils.toAddress(keccak256(encodedList));\\n }\\n\\n /**\\n * Computes the address that would be generated by CREATE2.\\n * @param _creator Address creating the contract.\\n * @param _bytecode Bytecode of the contract to be created.\\n * @param _salt 32 byte salt value mixed into the hash.\\n * @return _address Address to be generated by CREATE2.\\n */\\n function getAddressForCREATE2(\\n address _creator,\\n bytes memory _bytecode,\\n bytes32 _salt\\n )\\n internal\\n pure\\n returns (address _address)\\n {\\n bytes32 hashedData = keccak256(abi.encodePacked(\\n byte(0xff),\\n _creator,\\n _salt,\\n keccak256(_bytecode)\\n ));\\n\\n return Lib_Bytes32Utils.toAddress(hashedData);\\n }\\n}\\n\",\"keccak256\":\"0x9cc5440ff8fbe2fea9faf929a5a16a172bfaebedca26b8bafbf4ed459038f1e2\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.7.0;\\n\\n/**\\n * @title Lib_Math\\n */\\nlibrary Lib_Math {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Calculates the minumum of two numbers.\\n * @param _x First number to compare.\\n * @param _y Second number to compare.\\n * @return Lesser of the two numbers.\\n */\\n function min(\\n uint256 _x,\\n uint256 _y\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n if (_x < _y) {\\n return _x;\\n }\\n\\n return _y;\\n }\\n}\\n\",\"keccak256\":\"0x0f5a022dfc2b4dbbc330198c6045446fbcae8ef2171d4e3466eb5e510b368f14\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_MerkleTree.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.7.0;\\n\\n/**\\n * @title Lib_MerkleTree\\n * @author River Keefer\\n */\\nlibrary Lib_MerkleTree {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Calculates a merkle root for a list of 32-byte leaf hashes. WARNING: If the number\\n * of leaves passed in is not a power of two, it pads out the tree with zero hashes.\\n * If you do not know the original length of elements for the tree you are verifying,\\n * then this may allow empty leaves past _elements.length to pass a verification check down the line.\\n * @param _elements Array of hashes from which to generate a merkle root.\\n * @return Merkle root of the leaves, with zero hashes for non-powers-of-two (see above).\\n */\\n function getMerkleRoot(\\n bytes32[] memory _elements\\n )\\n internal\\n view\\n returns (\\n bytes32\\n )\\n {\\n require(\\n _elements.length > 0,\\n \\\"Lib_MerkleTree: Must provide at least one leaf hash.\\\"\\n );\\n\\n if (_elements.length == 0) {\\n return _elements[0];\\n }\\n\\n uint256[16] memory defaults = [\\n 0x290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563,\\n 0x633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d,\\n 0x890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d,\\n 0x3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd8,\\n 0xecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da,\\n 0xdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da5,\\n 0x617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d7,\\n 0x292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead,\\n 0xe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e10,\\n 0x7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f82,\\n 0xe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e83636516,\\n 0x3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c,\\n 0xad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e,\\n 0xa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab,\\n 0x4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c862,\\n 0x2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf10\\n ];\\n\\n // Reserve memory space for our hashes.\\n bytes memory buf = new bytes(64);\\n\\n // We'll need to keep track of left and right siblings.\\n bytes32 leftSibling;\\n bytes32 rightSibling;\\n\\n // Number of non-empty nodes at the current depth.\\n uint256 rowSize = _elements.length;\\n\\n // Current depth, counting from 0 at the leaves\\n uint256 depth = 0;\\n\\n // Common sub-expressions\\n uint256 halfRowSize; // rowSize / 2\\n bool rowSizeIsOdd; // rowSize % 2 == 1\\n\\n while (rowSize > 1) {\\n halfRowSize = rowSize / 2;\\n rowSizeIsOdd = rowSize % 2 == 1;\\n\\n for (uint256 i = 0; i < halfRowSize; i++) {\\n leftSibling = _elements[(2 * i) ];\\n rightSibling = _elements[(2 * i) + 1];\\n assembly {\\n mstore(add(buf, 32), leftSibling )\\n mstore(add(buf, 64), rightSibling)\\n }\\n\\n _elements[i] = keccak256(buf);\\n }\\n\\n if (rowSizeIsOdd) {\\n leftSibling = _elements[rowSize - 1];\\n rightSibling = bytes32(defaults[depth]);\\n assembly {\\n mstore(add(buf, 32), leftSibling)\\n mstore(add(buf, 64), rightSibling)\\n }\\n\\n _elements[halfRowSize] = keccak256(buf);\\n }\\n\\n rowSize = halfRowSize + (rowSizeIsOdd ? 1 : 0);\\n depth++;\\n }\\n\\n return _elements[0];\\n }\\n\\n /**\\n * Verifies a merkle branch for the given leaf hash. Assumes the original length\\n * of leaves generated is a known, correct input, and does not return true for indices \\n * extending past that index (even if _siblings would be otherwise valid.)\\n * @param _root The Merkle root to verify against.\\n * @param _leaf The leaf hash to verify inclusion of.\\n * @param _index The index in the tree of this leaf.\\n * @param _siblings Array of sibline nodes in the inclusion proof, starting from depth 0 (bottom of the tree). \\n * @param _totalLeaves The total number of leaves originally passed into.\\n * @return Whether or not the merkle branch and leaf passes verification.\\n */\\n function verify(\\n bytes32 _root,\\n bytes32 _leaf,\\n uint256 _index,\\n bytes32[] memory _siblings,\\n uint256 _totalLeaves\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n require(\\n _totalLeaves > 0,\\n \\\"Lib_MerkleTree: Total leaves must be greater than zero.\\\"\\n );\\n\\n require(\\n _index < _totalLeaves,\\n \\\"Lib_MerkleTree: Index out of bounds.\\\"\\n );\\n\\n require(\\n _siblings.length == _ceilLog2(_totalLeaves),\\n \\\"Lib_MerkleTree: Total siblings does not correctly correspond to total leaves.\\\"\\n );\\n\\n bytes32 computedRoot = _leaf;\\n\\n for (uint256 i = 0; i < _siblings.length; i++) {\\n if ((_index & 1) == 1) {\\n computedRoot = keccak256(\\n abi.encodePacked(\\n _siblings[i],\\n computedRoot\\n )\\n );\\n } else {\\n computedRoot = keccak256(\\n abi.encodePacked(\\n computedRoot,\\n _siblings[i]\\n )\\n );\\n }\\n\\n _index >>= 1;\\n }\\n\\n return _root == computedRoot;\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Calculates the integer ceiling of the log base 2 of an input.\\n * @param _in Unsigned input to calculate the log.\\n * @return ceil(log_base_2(_in))\\n */\\n function _ceilLog2(\\n uint256 _in\\n )\\n private\\n pure\\n returns (\\n uint256\\n )\\n { \\n require(\\n _in > 0,\\n \\\"Lib_MerkleTree: Cannot compute ceil(log_2) of 0.\\\"\\n );\\n\\n if (_in == 1) {\\n return 0;\\n }\\n\\n // Find the highest set bit (will be floor(log_2)).\\n // Borrowed with <3 from https://github.com/ethereum/solidity-examples\\n uint256 val = _in;\\n uint256 highest = 0;\\n for (uint8 i = 128; i >= 1; i >>= 1) {\\n if (val & (uint(1) << i) - 1 << i != 0) {\\n highest += i;\\n val >>= i;\\n }\\n }\\n\\n // Increment by one if this is not a perfect logarithm.\\n if ((uint(1) << highest) != _in) {\\n highest += 1;\\n }\\n\\n return highest;\\n }\\n}\\n\",\"keccak256\":\"0x5a859eccd3c4e7e31db90f3022069a725d5389e16fbcace3fe653d6b0acf80f6\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.7.0;\\n\\n/**\\n * @title Lib_SafeExecutionManagerWrapper\\n */\\nlibrary Lib_SafeExecutionManagerWrapper {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Makes an ovmCALL and performs all the necessary safety checks.\\n * @param _gasLimit Gas limit for the call.\\n * @param _target Address to call.\\n * @param _calldata Data to send to the call.\\n * @return _success Whether or not the call reverted.\\n * @return _returndata Data returned by the call.\\n */\\n function safeCALL(\\n uint256 _gasLimit,\\n address _target,\\n bytes memory _calldata\\n )\\n internal\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCALL(uint256,address,bytes)\\\",\\n _gasLimit,\\n _target,\\n _calldata\\n )\\n );\\n\\n return abi.decode(returndata, (bool, bytes));\\n }\\n\\n /**\\n * Makes an ovmCALL and performs all the necessary safety checks.\\n * @param _gasLimit Gas limit for the call.\\n * @param _target Address to call.\\n * @param _calldata Data to send to the call.\\n * @return _success Whether or not the call reverted.\\n * @return _returndata Data returned by the call.\\n */\\n function safeDELEGATECALL(\\n uint256 _gasLimit,\\n address _target,\\n bytes memory _calldata\\n )\\n internal\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmDELEGATECALL(uint256,address,bytes)\\\",\\n _gasLimit,\\n _target,\\n _calldata\\n )\\n );\\n\\n return abi.decode(returndata, (bool, bytes));\\n }\\n\\n /**\\n * Performs an ovmCREATE and the necessary safety checks.\\n * @param _gasLimit Gas limit for the creation.\\n * @param _bytecode Code for the new contract.\\n * @return _contract Address of the created contract.\\n */\\n function safeCREATE(\\n uint256 _gasLimit,\\n bytes memory _bytecode\\n )\\n internal\\n returns (\\n address _contract\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n _gasLimit,\\n abi.encodeWithSignature(\\n \\\"ovmCREATE(bytes)\\\",\\n _bytecode\\n )\\n );\\n\\n return abi.decode(returndata, (address));\\n }\\n\\n /**\\n * Performs an ovmEXTCODESIZE and the necessary safety checks.\\n * @param _contract Address of the contract to query the size of.\\n * @return _EXTCODESIZE Size of the requested contract in bytes.\\n */\\n function safeEXTCODESIZE(\\n address _contract\\n )\\n internal\\n returns (\\n uint256 _EXTCODESIZE\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmEXTCODESIZE(address)\\\",\\n _contract\\n )\\n );\\n\\n return abi.decode(returndata, (uint256));\\n }\\n\\n /**\\n * Performs a safe ovmCHAINID call.\\n * @return _CHAINID Result of calling ovmCHAINID.\\n */\\n function safeCHAINID()\\n internal\\n returns (\\n uint256 _CHAINID\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCHAINID()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (uint256));\\n }\\n\\n /**\\n * Performs a safe ovmCALLER call.\\n * @return _CALLER Result of calling ovmCALLER.\\n */\\n function safeCALLER()\\n internal\\n returns (\\n address _CALLER\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCALLER()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (address));\\n }\\n\\n /**\\n * Performs a safe ovmADDRESS call.\\n * @return _ADDRESS Result of calling ovmADDRESS.\\n */\\n function safeADDRESS()\\n internal\\n returns (\\n address _ADDRESS\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmADDRESS()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (address));\\n }\\n\\n /**\\n * Performs a safe ovmGETNONCE call.\\n * @return _nonce Result of calling ovmGETNONCE.\\n */\\n function safeGETNONCE()\\n internal\\n returns (\\n uint256 _nonce\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmGETNONCE()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (uint256));\\n }\\n\\n /**\\n * Performs a safe ovmSETNONCE call.\\n * @param _nonce New account nonce.\\n */\\n function safeSETNONCE(\\n uint256 _nonce\\n )\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmSETNONCE(uint256)\\\",\\n _nonce\\n )\\n );\\n }\\n\\n /**\\n * Performs a safe ovmCREATEEOA call.\\n * @param _messageHash Message hash which was signed by EOA\\n * @param _v v value of signature (0 or 1)\\n * @param _r r value of signature\\n * @param _s s value of signature\\n */\\n function safeCREATEEOA(\\n bytes32 _messageHash,\\n uint8 _v,\\n bytes32 _r,\\n bytes32 _s\\n )\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCREATEEOA(bytes32,uint8,bytes32,bytes32)\\\",\\n _messageHash,\\n _v,\\n _r,\\n _s\\n )\\n );\\n }\\n\\n /**\\n * Performs a safe REVERT.\\n * @param _reason String revert reason to pass along with the REVERT.\\n */\\n function safeREVERT(\\n string memory _reason\\n )\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmREVERT(bytes)\\\",\\n bytes(_reason)\\n )\\n );\\n }\\n\\n /**\\n * Performs a safe \\\"require\\\".\\n * @param _condition Boolean condition that must be true or will revert.\\n * @param _reason String revert reason to pass along with the REVERT.\\n */\\n function safeREQUIRE(\\n bool _condition,\\n string memory _reason\\n )\\n internal\\n {\\n if (!_condition) {\\n safeREVERT(\\n _reason\\n );\\n }\\n }\\n\\n /**\\n * Performs a safe ovmSLOAD call.\\n */\\n function safeSLOAD(\\n bytes32 _key\\n )\\n internal\\n returns (\\n bytes32\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmSLOAD(bytes32)\\\",\\n _key\\n )\\n );\\n\\n return abi.decode(returndata, (bytes32));\\n }\\n\\n /**\\n * Performs a safe ovmSSTORE call.\\n */\\n function safeSSTORE(\\n bytes32 _key,\\n bytes32 _value\\n )\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmSSTORE(bytes32,bytes32)\\\",\\n _key,\\n _value\\n )\\n );\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Performs an ovm interaction and the necessary safety checks.\\n * @param _gasLimit Gas limit for the interaction.\\n * @param _calldata Data to send to the OVM_ExecutionManager (encoded with sighash).\\n * @return _returndata Data sent back by the OVM_ExecutionManager.\\n */\\n function _safeExecutionManagerInteraction(\\n uint256 _gasLimit,\\n bytes memory _calldata\\n )\\n private\\n returns (\\n bytes memory _returndata\\n )\\n {\\n address ovmExecutionManager = msg.sender;\\n (\\n bool success,\\n bytes memory returndata\\n ) = ovmExecutionManager.call{gas: _gasLimit}(_calldata);\\n\\n if (success == false) {\\n assembly {\\n revert(add(returndata, 0x20), mload(returndata))\\n }\\n } else if (returndata.length == 1) {\\n assembly {\\n return(0, 1)\\n }\\n } else {\\n return returndata;\\n }\\n }\\n\\n function _safeExecutionManagerInteraction(\\n bytes memory _calldata\\n )\\n private\\n returns (\\n bytes memory _returndata\\n )\\n {\\n return _safeExecutionManagerInteraction(\\n gasleft(),\\n _calldata\\n );\\n }\\n}\\n\",\"keccak256\":\"0xdc30487ca1580f3498d4a1c4e26dc53158c00b44bd72da212a66267c22a139b0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/wrappers/Lib_SafeMathWrapper.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// Pulled from @openzeppelin/contracts/math/SafeMath.sol\\npragma solidity ^0.7.0;\\n\\n/* Library Imports */\\nimport { Lib_SafeExecutionManagerWrapper } from \\\"./Lib_SafeExecutionManagerWrapper.sol\\\";\\n\\n/**\\n * @title Lib_SafeMathWrapper\\n */\\n\\n/**\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\n * checks.\\n *\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\n * in bugs, because programmers usually assume that an overflow raises an\\n * error, which is the standard behavior in high level programming languages.\\n * `SafeMath` restores this intuition by reverting the transaction when an\\n * operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n */\\n\\nlibrary Lib_SafeMathWrapper {\\n /**\\n * @dev Returns the addition of two unsigned integers, reverting on\\n * overflow.\\n *\\n * Counterpart to Solidity's `+` operator.\\n *\\n * Requirements:\\n *\\n * - Addition cannot overflow.\\n */\\n function add(uint256 a, uint256 b) internal returns (uint256) {\\n uint256 c = a + b;\\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(c >= a, \\\"Lib_SafeMathWrapper: addition overflow\\\");\\n\\n return c;\\n }\\n\\n /**\\n * @dev Returns the subtraction of two unsigned integers, reverting on\\n * overflow (when the result is negative).\\n *\\n * Counterpart to Solidity's `-` operator.\\n *\\n * Requirements:\\n *\\n * - Subtraction cannot overflow.\\n */\\n function sub(uint256 a, uint256 b) internal returns (uint256) {\\n return sub(a, b, \\\"Lib_SafeMathWrapper: subtraction overflow\\\");\\n }\\n\\n /**\\n * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\n * overflow (when the result is negative).\\n *\\n * Counterpart to Solidity's `-` operator.\\n *\\n * Requirements:\\n *\\n * - Subtraction cannot overflow.\\n */\\n function sub(uint256 a, uint256 b, string memory errorMessage) internal returns (uint256) {\\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(b <= a, errorMessage);\\n uint256 c = a - b;\\n\\n return c;\\n }\\n\\n /**\\n * @dev Returns the multiplication of two unsigned integers, reverting on\\n * overflow.\\n *\\n * Counterpart to Solidity's `*` operator.\\n *\\n * Requirements:\\n *\\n * - Multiplication cannot overflow.\\n */\\n function mul(uint256 a, uint256 b) internal returns (uint256) {\\n // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\n // benefit is lost if 'b' is also tested.\\n // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\n if (a == 0) {\\n return 0;\\n }\\n\\n uint256 c = a * b;\\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(c / a == b, \\\"Lib_SafeMathWrapper: multiplication overflow\\\");\\n\\n return c;\\n }\\n\\n /**\\n * @dev Returns the integer division of two unsigned integers. Reverts on\\n * division by zero. The result is rounded towards zero.\\n *\\n * Counterpart to Solidity's `/` operator. Note: this function uses a\\n * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n * uses an invalid opcode to revert (consuming all remaining gas).\\n *\\n * Requirements:\\n *\\n * - The divisor cannot be zero.\\n */\\n function div(uint256 a, uint256 b) internal returns (uint256) {\\n return div(a, b, \\\"Lib_SafeMathWrapper: division by zero\\\");\\n }\\n\\n /**\\n * @dev Returns the integer division of two unsigned integers. Reverts with custom message on\\n * division by zero. The result is rounded towards zero.\\n *\\n * Counterpart to Solidity's `/` operator. Note: this function uses a\\n * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n * uses an invalid opcode to revert (consuming all remaining gas).\\n *\\n * Requirements:\\n *\\n * - The divisor cannot be zero.\\n */\\n function div(uint256 a, uint256 b, string memory errorMessage) internal returns (uint256) {\\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(b > 0, errorMessage);\\n uint256 c = a / b;\\n // assert(a == b * c + a % b); // There is no case in which this doesn't hold\\n\\n return c;\\n }\\n\\n /**\\n * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n * Reverts when dividing by zero.\\n *\\n * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n * opcode (which leaves remaining gas untouched) while Solidity uses an\\n * invalid opcode to revert (consuming all remaining gas).\\n *\\n * Requirements:\\n *\\n * - The divisor cannot be zero.\\n */\\n function mod(uint256 a, uint256 b) internal returns (uint256) {\\n return mod(a, b, \\\"Lib_SafeMathWrapper: modulo by zero\\\");\\n }\\n\\n /**\\n * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n * Reverts with custom message when dividing by zero.\\n *\\n * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n * opcode (which leaves remaining gas untouched) while Solidity uses an\\n * invalid opcode to revert (consuming all remaining gas).\\n *\\n * Requirements:\\n *\\n * - The divisor cannot be zero.\\n */\\n function mod(uint256 a, uint256 b, string memory errorMessage) internal returns (uint256) {\\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(b != 0, errorMessage);\\n return a % b;\\n }\\n}\",\"keccak256\":\"0x529f1ddb3002186d9240e20557495c8fb339a5d384552c1c05bd27641db2a7b2\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x60806040523480156200001157600080fd5b50604051620031a8380380620031a8833981016040819052620000349162000067565b600080546001600160a01b0319166001600160a01b039590951694909417909355600191909155600255600355620000b2565b600080600080608085870312156200007d578384fd5b84516001600160a01b038116811462000094578485fd5b60208601516040870151606090970151919890975090945092505050565b6130e680620000c26000396000f3fe608060405234801561001057600080fd5b50600436106101215760003560e01c80638d38c6c1116100ad578063d0f8934411610071578063d0f893441461020e578063e10d29ee14610216578063e561dddc1461021e578063f722b41a14610226578063facdc5da1461022e57610121565b80638d38c6c1146101e6578063b8f77005146101ee578063c139eb15146101f6578063c2cf696f146101fe578063cfdf677e1461020657610121565b80636fee07e0116100f45780636fee07e0146101a457806378f4b2f2146101b95780637a167a8a146101c15780637aa63a86146101d6578063876ed5cb146101de57610121565b8063138387a4146101265780632a7f18be14610144578063461a4478146101645780634de569ce14610184575b600080fd5b61012e610241565b60405161013b9190612eb2565b60405180910390f35b610157610152366004612346565b610247565b60405161013b9190612e84565b6101776101723660046121d9565b610394565b60405161013b91906123a9565b61019761019236600461221f565b610470565b60405161013b9190612442565b6101b76101b2366004612146565b6104aa565b005b61012e6106cd565b6101c96106d4565b60405161013b9190612ee2565b61012e6106e9565b61012e610704565b61012e61070a565b6101c9610710565b61012e610799565b61012e61079f565b6101776107a4565b6101b76107cc565b610177610bb3565b61012e610bd6565b6101c9610c50565b6101b761023c366004612346565b610c68565b60025481565b61024f611e97565b60028202600061025d610bb3565b6001600160a01b0316639507d39a836040518263ffffffff1660e01b81526004016102889190612ee2565b60206040518083038186803b1580156102a057600080fd5b505afa1580156102b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102d891906121c1565b905060006102e4610bb3565b6001600160a01b0316639507d39a846001016040518263ffffffff1660e01b81526004016103129190612ee2565b60206040518083038186803b15801561032a57600080fd5b505afa15801561033e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061036291906121c1565b6040805160608101825293845264ffffffffff808316602086015260289290921c90911690830152509150505b919050565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b838110156103f45781810151838201526020016103dc565b50505050905090810190601f1680156104215780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561043e57600080fd5b505afa158015610452573d6000803e3d6000fd5b505050506040513d602081101561046857600080fd5b505192915050565b82516000901515600114156104925761048b85858585610dcb565b90506104a2565b61048b8585602001518585610f96565b949350505050565b612710815111156104d65760405162461bcd60e51b81526004016104cd9061255e565b60405180910390fd5b6003548211156104f85760405162461bcd60e51b81526004016104cd90612764565b620186a082101561051b5760405162461bcd60e51b81526004016104cd90612946565b6020820460005a90508181116105435760405162461bcd60e51b81526004016104cd90612bc0565b60005b825a8303101561055857600101610546565b60003387878760405160200161057194939291906123bd565b60408051601f19818403018152919052805160209091012090504360281b4217610599610bb3565b6001600160a01b031663d41c021883836040518363ffffffff1660e01b81526004016105c692919061249b565b600060405180830381600087803b1580156105e057600080fd5b505af11580156105f4573d6000803e3d6000fd5b5050505060006002610604610bb3565b6001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b15801561063c57600080fd5b505afa158015610650573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061067491906121c1565b8161067b57fe5b0490507f4b388aecf9fa6cc92253704e5975a6129a4f735bdbd99567df4ed0094ee4ceb5338a8a8a60018603426040516106ba969594939291906123fa565b60405180910390a1505050505050505050565b620186a081565b6000806106df61106b565b5090935050505090565b6000806106f461106b565b50505064ffffffffff1692915050565b61271081565b60035481565b6000600261071c610bb3565b6001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b15801561075457600080fd5b505afa158015610768573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061078c91906121c1565b8161079357fe5b04905090565b60015481565b602081565b60006107c760405180606001604052806025815260200161305860259139610394565b905090565b60043560d81c60093560e890811c90600c35901c6107e86106e9565b8364ffffffffff161461080d5760405162461bcd60e51b81526004016104cd90612a6b565b61083b6040518060400160405280600d81526020016c27ab26afa9b2b8bab2b731b2b960991b815250610394565b6001600160a01b0316336001600160a01b03161461086b5760405162461bcd60e51b81526004016104cd90612ac8565b60008162ffffff16116108905760405162461bcd60e51b81526004016104cd906127c1565b60008262ffffff16116108b55760405162461bcd60e51b81526004016104cd90612d15565b600f601062ffffff831602013664ffffffffff82168110156108e95760405162461bcd60e51b81526004016104cd90612d9c565b60006108f3610710565b905060008562ffffff1667ffffffffffffffff8111801561091357600080fd5b5060405190808252806020026020018201604052801561093d578160200160208202803683370190505b509050600080600061094d6106d4565b9050610957611eb7565b60005b8962ffffff168163ffffffff161015610a8a57600061097e8263ffffffff16611119565b905063ffffffff82166109945761099481611169565b61099f838286611236565b80925060005b835163ffffffff82161015610a00578a3560e81c6109cb8564ffffffffff8e1683611346565b898963ffffffff16815181106109dd57fe5b60209081029190910101529a909a016003019960019687019695860195016109a5565b5060005b83602001518163ffffffff161015610a80578864ffffffffff168564ffffffffff1610610a435760405162461bcd60e51b81526004016104cd90612dde565b610a538564ffffffffff166113d0565b888863ffffffff1681518110610a6557fe5b60209081029190910101526001968701969485019401610a04565b505060010161095a565b50610a948161141b565b8764ffffffffff168714610aba5760405162461bcd60e51b81526004016104cd90612809565b8962ffffff168463ffffffff1614610ae45760405162461bcd60e51b81526004016104cd90612857565b6000838b62ffffff160363ffffffff169050600080836020015160001415610b1757505060408201516060830151610b3e565b6000610b2c6001870364ffffffffff16610247565b90508060200151925080604001519150505b610b5f610b4a89611463565b8e62ffffff168564ffffffffff168585611893565b7f602f1aeac0ca2e7a13e281a9ef0ad7838542712ce16780fa2ecffd351f05f89983860384610b8c6106e9565b604051610b9b93929190612ef4565b60405180910390a15050505050505050505050505050565b60006107c7604051806060016040528060238152602001612f3b60239139610394565b6000610be06107a4565b6001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b158015610c1857600080fd5b505afa158015610c2c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107c791906121c1565b6000610c5a6106d4565b610c62610710565b03905090565b60405162461bcd60e51b81526004016104cd906124ce565b83811015610d4557610cb66040518060400160405280600d81526020016c27ab26afa9b2b8bab2b731b2b960991b815250610394565b6001600160a01b0316336001600160a01b031614610d12576000610ce08364ffffffffff16610247565b905042600154826020015164ffffffffff160110610d105760405162461bcd60e51b81526004016104cd906129f8565b505b610d228264ffffffffff166113d0565b838281518110610d2e57fe5b602090810291909101015260019182019101610c80565b506000610d5b6001830364ffffffffff16610247565b9050610d7a610d6984611463565b858684602001518560400151611893565b7f64d7f508348c70dea42d5302a393987e4abc20e45954ab3f9d320207751956f0848364ffffffffff160385610dae6106e9565b604051610dbd93929190612ebb565b60405180910390a150505050565b600080610e036040518060400160405280601481526020017327ab26afa2bc32b1baba34b7b726b0b730b3b2b960611b815250610394565b90506000816001600160a01b0316631c4712a76040518163ffffffff1660e01b815260040160206040518083038186803b158015610e4057600080fd5b505afa158015610e54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e7891906121c1565b90506000610e8587611a4d565b9050610e92818787611ae6565b610eae5760405162461bcd60e51b81526004016104cd9061268d565b86606001518860200151148015610ec9575060408701518851145b8015610f0a5750610ef1604051806060016040528060228152602001612f5e60229139610394565b6001600160a01b031688608001516001600160a01b0316145b8015610f195750818860a00151145b8015610f30575060608801516001600160a01b0316155b8015610f4b5750600088604001516001811115610f4957fe5b145b8015610f6c57508660800151805190602001208860c0015180519060200120145b610f885760405162461bcd60e51b81526004016104cd9061272d565b506001979650505050505050565b600080610fa2856113d0565b9050610faf818585611ae6565b610fcb5760405162461bcd60e51b81526004016104cd90612c60565b6000866060015187608001518860a001518960c00151604051602001610ff494939291906123bd565b604051602081830303815290604052805190602001209050600061101787610247565b80519091508214801561103557508751602082015164ffffffffff16145b801561104f57508760200151816040015164ffffffffff16145b610f885760405162461bcd60e51b81526004016104cd90612b15565b600080600080600061107b6107a4565b6001600160a01b031663ccf8f9696040518163ffffffff1660e01b815260040160206040518083038186803b1580156110b357600080fd5b505afa1580156110c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110eb919061219b565b64ffffffffff602882901c811697605083901c82169750607883901c8216965060a09290921c169350915050565b611121611eb7565b5060408051608081018252601092909202600f81013560e890811c84526012820135901c6020840152601581013560d890811c92840192909252601a0135901c606082015290565b60006111736106e9565b11156111e35760008061118461106b565b9350935050508064ffffffffff16836060015110156111b55760405162461bcd60e51b81526004016104cd906126db565b8164ffffffffff16836040015110156111e05760405162461bcd60e51b81526004016104cd906125bb565b50505b42600154826040015101101561120b5760405162461bcd60e51b81526004016104cd90612d56565b4360025482606001510110156112335760405162461bcd60e51b81526004016104cd90612515565b50565b82604001518260400151101561125e5760405162461bcd60e51b81526004016104cd90612c0b565b8260600151826060015110156112865760405162461bcd60e51b81526004016104cd90612e27565b600081611291610710565b0364ffffffffff1611156113415760006112b18264ffffffffff16610247565b9050600154816020015164ffffffffff160142106112e15760405162461bcd60e51b81526004016104cd9061260a565b806020015164ffffffffff16836040015111156113105760405162461bcd60e51b81526004016104cd9061298f565b806040015164ffffffffff168360600151111561133f5760405162461bcd60e51b81526004016104cd90612caa565b505b505050565b6000808260410167ffffffffffffffff8111801561136357600080fd5b506040519080825280601f01601f19166020018201604052801561138e576020820181803683370190505b50604086015160608701519192509060006020840160018153836001820152826021820152866003890160418301376041870190209450505050509392505050565b60006114156040518060a00160405280600015158152602001848152602001600081526020016000815260200160405180602001604052806000815250815250611bd7565b92915050565b428160400151111561143f5760405162461bcd60e51b81526004016104cd90612b7b565b43816060015111156112335760405162461bcd60e51b81526004016104cd906128c7565b6000808251116114a45760405162461bcd60e51b815260040180806020018281038252603481526020018061307d6034913960400191505060405180910390fd5b81516114c657816000815181106114b757fe5b6020026020010151905061038f565b60408051610200810182527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56381527f633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d60208201527f890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d818301527f3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd86060808301919091527fecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da60808301527fdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da560a08301527f617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d760c08301527f292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead60e08301527fe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e106101008301527f7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f826101208301527fe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e836365166101408301527f3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c6101608301527fad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e6101808301527fa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab6101a08301527f4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c8626101c08301527f2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf106101e083015282518381529081018352909160009190602082018180368337505085519192506000918291508180805b600184111561186f5750506002820460018084161460005b828110156117eb578a816002028151811061179257fe5b602002602001015196508a81600202600101815181106117ae57fe5b6020026020010151955086602089015285604089015287805190602001208b82815181106117d857fe5b602090810291909101015260010161177b565b50801561184e5789600185038151811061180157fe5b6020026020010151955087836010811061181757fe5b602002015160001b945085602088015284604088015286805190602001208a838151811061184157fe5b6020026020010181815250505b8061185a57600061185d565b60015b60ff1682019350600190920191611763565b8960008151811061187c57fe5b602002602001015198505050505050505050919050565b6000806000806118a161106b565b935093509350935060006040518060a001604052806118be6107a4565b6001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b1580156118f657600080fd5b505afa15801561190a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061192e91906121c1565b81526020018b81526020018a81526020018664ffffffffff16815260200160405180602001604052806000815250815250905080600001517f127186556e7be68c7e31263195225b4de02820707889540969f62c05cf73525e82602001518360400151846060015185608001516040516119ab94939291906124a9565b60405180910390a260006119be82611c1f565b905060006119d6836040015188018b88018b8b611c48565b90506119e06107a4565b6001600160a01b0316632015276c83836040518363ffffffff1660e01b8152600401611a0d929190612485565b600060405180830381600087803b158015611a2757600080fd5b505af1158015611a3b573d6000803e3d6000fd5b50505050505050505050505050505050565b6080810151805160009190826041820167ffffffffffffffff81118015611a7357600080fd5b506040519080825280601f01601f191660200182016040528015611a9e576020820181803683370190505b5060408601516060870151919250906000602084016001815383600182015282602182015285604182018760208a0160045afa50604190950190942095505050505050919050565b6000611af06107a4565b8351604051634a83e9cd60e11b81526001600160a01b039290921691639507d39a91611b1e91600401612ed1565b60206040518083038186803b158015611b3657600080fd5b505afa158015611b4a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b6e91906121c1565b611b7784611c1f565b14611b945760405162461bcd60e51b81526004016104cd90612b4c565b611bb1836020015185846000015185602001518760400151611c67565b611bcd5760405162461bcd60e51b81526004016104cd9061290f565b5060019392505050565b8051602080830151604080850151606086015160808701519251600096611c0296909594910161244d565b604051602081830303815290604052805190602001209050919050565b60008160200151826040015183606001518460800151604051602001611c0294939291906124a9565b602892831b9390931760509190911b1760789290921b91909117901b90565b6000808211611ca75760405162461bcd60e51b8152600401808060200182810382526037815260200180612fd46037913960400191505060405180910390fd5b818410611ce55760405162461bcd60e51b8152600401808060200182810382526024815260200180612f806024913960400191505060405180910390fd5b611cee82611dec565b835114611d2c5760405162461bcd60e51b815260040180806020018281038252604d81526020018061300b604d913960600191505060405180910390fd5b8460005b8451811015611ddf578560011660011415611d8e57848181518110611d5157fe5b6020026020010151826040516020018083815260200182815260200192505050604051602081830303815290604052805190602001209150611dd3565b81858281518110611d9b57fe5b602002602001015160405160200180838152602001828152602001925050506040516020818303038152906040528051906020012091505b600195861c9501611d30565b5090951495945050505050565b6000808211611e2c5760405162461bcd60e51b8152600401808060200182810382526030815260200180612fa46030913960400191505060405180910390fd5b8160011415611e3d5750600061038f565b81600060805b60018160ff1610611e81578060ff1660018260ff166001901b03901b8316600014611e765760ff811692831c9291909101905b60011c607f16611e43565b506001811b8414611e90576001015b9392505050565b604080516060810182526000808252602082018190529181019190915290565b6040518060800160405280600081526020016000815260200160008152602001600081525090565b600067ffffffffffffffff831115611ef357fe5b611f06601f8401601f1916602001612f16565b9050828152838383011115611f1a57600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b038116811461038f57600080fd5b600082601f830112611f58578081fd5b611e9083833560208501611edf565b80356002811061038f57600080fd5b600060a08284031215611f87578081fd5b60405160a0810167ffffffffffffffff8282108183111715611fa557fe5b81604052829350843583526020850135602084015260408501356040840152606085013560608401526080850135915080821115611fe257600080fd5b50611fef85828601611f48565b6080830152505092915050565b60006040828403121561200d578081fd5b6040516040810167ffffffffffffffff828210818311171561202b57fe5b816040528293508435835260209150818501358181111561204b57600080fd5b8501601f8101871361205c57600080fd5b80358281111561206857fe5b8381029250612078848401612f16565b8181528481019083860185850187018b101561209357600080fd5b600095505b838610156120b6578035835260019590950194918601918601612098565b5080868801525050505050505092915050565b600060a082840312156120da578081fd5b60405160a0810167ffffffffffffffff82821081831117156120f857fe5b8160405282935084359150811515821461211157600080fd5b8183526020850135602084015260408501356040840152606085013560608401526080850135915080821115611fe257600080fd5b60008060006060848603121561215a578283fd5b61216384611f31565b925060208401359150604084013567ffffffffffffffff811115612185578182fd5b61219186828701611f48565b9150509250925092565b6000602082840312156121ac578081fd5b815164ffffffffff1981168114611e90578182fd5b6000602082840312156121d2578081fd5b5051919050565b6000602082840312156121ea578081fd5b813567ffffffffffffffff811115612200578182fd5b8201601f81018413612210578182fd5b6104a284823560208401611edf565b60008060008060808587031215612234578081fd5b843567ffffffffffffffff8082111561224b578283fd5b9086019060e0828903121561225e578283fd5b61226860e0612f16565b823581526020830135602082015261228260408401611f67565b604082015261229360608401611f31565b60608201526122a460808401611f31565b608082015260a083013560a082015260c0830135828111156122c4578485fd5b6122d08a828601611f48565b60c083015250955060208701359150808211156122eb578283fd5b6122f7888389016120c9565b9450604087013591508082111561230c578283fd5b61231888838901611f76565b9350606087013591508082111561232d578283fd5b5061233a87828801611ffc565b91505092959194509250565b600060208284031215612357578081fd5b5035919050565b60008151808452815b8181101561238357602081850181015186830182015201612367565b818111156123945782602083870101525b50601f01601f19169290920160200192915050565b6001600160a01b0391909116815260200190565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906123f09083018461235e565b9695505050505050565b6001600160a01b038781168252861660208201526040810185905260c06060820181905260009061242d9083018661235e565b60808301949094525060a00152949350505050565b901515815260200190565b6000861515825285602083015284604083015283606083015260a0608083015261247a60a083018461235e565b979650505050505050565b91825264ffffffffff1916602082015260400190565b918252602082015260400190565b6000858252846020830152836040830152608060608301526123f0608083018461235e565b60208082526027908201527f617070656e64517565756542617463682069732063757272656e746c7920646960408201526639b0b13632b21760c91b606082015260800190565b60208082526029908201527f436f6e7465787420626c6f636b206e756d62657220746f6f2066617220696e206040820152683a3432903830b9ba1760b91b606082015260800190565b6020808252603d908201527f5472616e73616374696f6e20646174612073697a652065786365656473206d6160408201527f78696d756d20666f7220726f6c6c7570207472616e73616374696f6e2e000000606082015260800190565b6020808252602f908201527f436f6e746578742074696d657374616d70206973206c6f776572207468616e2060408201526e3630b9ba1039bab136b4ba3a32b21760891b606082015260800190565b6020808252605b908201527f50726576696f75736c7920656e7175657565642062617463686573206861766560408201527f206578706972656420616e64206d75737420626520617070656e64656420626560608201527f666f72652061206e65772073657175656e6365722062617463682e0000000000608082015260a00190565b6020808252602e908201527f496e76616c69642053657175656e636572207472616e73616374696f6e20696e60408201526d31b63ab9b4b7b710383937b7b31760911b606082015260800190565b60208082526032908201527f436f6e7465787420626c6f636b206e756d626572206973206c6f77657220746860408201527130b7103630b9ba1039bab136b4ba3a32b21760711b606082015260800190565b6020808252601e908201527f496e76616c69642053657175656e636572207472616e73616374696f6e2e0000604082015260600190565b6020808252603d908201527f5472616e73616374696f6e20676173206c696d69742065786365656473206d6160408201527f78696d756d20666f7220726f6c6c7570207472616e73616374696f6e2e000000606082015260800190565b60208082526028908201527f4d7573742070726f76696465206174206c65617374206f6e652062617463682060408201526731b7b73a32bc3a1760c11b606082015260800190565b6020808252602e908201527f4e6f7420616c6c2073657175656e636572207472616e73616374696f6e73207760408201526d32b93290383937b1b2b9b9b2b21760911b606082015260800190565b6020808252604a908201527f41637475616c207472616e73616374696f6e20696e64657820646f6573206e6f60408201527f74206d6174636820657870656374656420746f74616c20656c656d656e7473206060820152693a379030b83832b7321760b11b608082015260a00190565b60208082526028908201527f436f6e7465787420626c6f636b206e756d6265722069732066726f6d2074686560408201526710333aba3ab9329760c11b606082015260800190565b60208082526018908201527f496e76616c696420696e636c7573696f6e2070726f6f662e0000000000000000604082015260600190565b60208082526029908201527f5472616e73616374696f6e20676173206c696d697420746f6f206c6f7720746f6040820152681032b738bab2bab29760b91b606082015260800190565b60208082526043908201527f53657175656e636572207472616e73616374696f6e2074696d657374616d702060408201527f657863656564732074686174206f66206e65787420717565756520656c656d65606082015262373a1760e91b608082015260a00190565b6020808252604d908201527f5175657565207472616e73616374696f6e732063616e6e6f742062652073756260408201527f6d697474656420647572696e67207468652073657175656e63657220696e636c60608201526c3ab9b4b7b7103832b934b7b21760991b608082015260a00190565b6020808252603d908201527f41637475616c20626174636820737461727420696e64657820646f6573206e6f60408201527f74206d6174636820657870656374656420737461727420696e6465782e000000606082015260800190565b6020808252602d908201527f46756e6374696f6e2063616e206f6e6c792062652063616c6c6564206279207460408201526c34329029b2b8bab2b731b2b91760991b606082015260800190565b6020808252601a908201527f496e76616c6964205175657565207472616e73616374696f6e2e000000000000604082015260600190565b60208082526015908201527424b73b30b634b2103130ba31b4103432b0b232b91760591b604082015260600190565b60208082526025908201527f436f6e746578742074696d657374616d702069732066726f6d207468652066756040820152643a3ab9329760d91b606082015260800190565b6020808252602b908201527f496e73756666696369656e742067617320666f72204c322072617465206c696d60408201526a34ba34b73390313ab9371760a91b606082015260800190565b60208082526035908201527f436f6e746578742074696d657374616d702076616c756573206d757374206d6f6040820152743737ba37b734b1b0b6363c9034b731b932b0b9b29760591b606082015260800190565b6020808252602a908201527f496e76616c6964205175657565207472616e73616374696f6e20696e636c757360408201526934b7b710383937b7b31760b11b606082015260800190565b60208082526045908201527f53657175656e636572207472616e73616374696f6e20626c6f636b4e756d626560408201527f7220657863656564732074686174206f66206e65787420717565756520656c6560608201526436b2b73a1760d91b608082015260a00190565b60208082526021908201527f4d75737420617070656e64206174206c65617374206f6e6520656c656d656e746040820152601760f91b606082015260800190565b60208082526026908201527f436f6e746578742074696d657374616d7020746f6f2066617220696e20746865604082015265103830b9ba1760d11b606082015260800190565b60208082526022908201527f4e6f7420656e6f756768204261746368436f6e74657874732070726f76696465604082015261321760f11b606082015260800190565b60208082526029908201527f4e6f7420656e6f75676820717565756564207472616e73616374696f6e732074604082015268379030b83832b7321760b91b606082015260800190565b60208082526037908201527f436f6e7465787420626c6f636b4e756d6265722076616c756573206d7573742060408201527f6d6f6e6f746f6e6963616c6c7920696e6372656173652e000000000000000000606082015260800190565b8151815260208083015164ffffffffff90811691830191909152604092830151169181019190915260600190565b90815260200190565b9283526020830191909152604082015260600190565b63ffffffff91909116815260200190565b64ffffffffff91909116815260200190565b64ffffffffff9384168152919092166020820152604081019190915260600190565b60405181810167ffffffffffffffff81118282101715612f3257fe5b60405291905056fe4f564d5f436861696e53746f72616765436f6e7461696e65723a4354433a71756575654f564d5f4465636f6d7072657373696f6e507265636f6d70696c65416464726573734c69625f4d65726b6c65547265653a20496e646578206f7574206f6620626f756e64732e4c69625f4d65726b6c65547265653a2043616e6e6f7420636f6d70757465206365696c286c6f675f3229206f6620302e4c69625f4d65726b6c65547265653a20546f74616c206c6561766573206d7573742062652067726561746572207468616e207a65726f2e4c69625f4d65726b6c65547265653a20546f74616c207369626c696e677320646f6573206e6f7420636f72726563746c7920636f72726573706f6e6420746f20746f74616c206c65617665732e4f564d5f436861696e53746f72616765436f6e7461696e65723a4354433a626174636865734c69625f4d65726b6c65547265653a204d7573742070726f76696465206174206c65617374206f6e65206c65616620686173682ea26469706673582212203512ca678bca74305bf6a879ce3d6142d5a90f38111948470b55a07a416cec5964736f6c63430007060033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101215760003560e01c80638d38c6c1116100ad578063d0f8934411610071578063d0f893441461020e578063e10d29ee14610216578063e561dddc1461021e578063f722b41a14610226578063facdc5da1461022e57610121565b80638d38c6c1146101e6578063b8f77005146101ee578063c139eb15146101f6578063c2cf696f146101fe578063cfdf677e1461020657610121565b80636fee07e0116100f45780636fee07e0146101a457806378f4b2f2146101b95780637a167a8a146101c15780637aa63a86146101d6578063876ed5cb146101de57610121565b8063138387a4146101265780632a7f18be14610144578063461a4478146101645780634de569ce14610184575b600080fd5b61012e610241565b60405161013b9190612eb2565b60405180910390f35b610157610152366004612346565b610247565b60405161013b9190612e84565b6101776101723660046121d9565b610394565b60405161013b91906123a9565b61019761019236600461221f565b610470565b60405161013b9190612442565b6101b76101b2366004612146565b6104aa565b005b61012e6106cd565b6101c96106d4565b60405161013b9190612ee2565b61012e6106e9565b61012e610704565b61012e61070a565b6101c9610710565b61012e610799565b61012e61079f565b6101776107a4565b6101b76107cc565b610177610bb3565b61012e610bd6565b6101c9610c50565b6101b761023c366004612346565b610c68565b60025481565b61024f611e97565b60028202600061025d610bb3565b6001600160a01b0316639507d39a836040518263ffffffff1660e01b81526004016102889190612ee2565b60206040518083038186803b1580156102a057600080fd5b505afa1580156102b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102d891906121c1565b905060006102e4610bb3565b6001600160a01b0316639507d39a846001016040518263ffffffff1660e01b81526004016103129190612ee2565b60206040518083038186803b15801561032a57600080fd5b505afa15801561033e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061036291906121c1565b6040805160608101825293845264ffffffffff808316602086015260289290921c90911690830152509150505b919050565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b838110156103f45781810151838201526020016103dc565b50505050905090810190601f1680156104215780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561043e57600080fd5b505afa158015610452573d6000803e3d6000fd5b505050506040513d602081101561046857600080fd5b505192915050565b82516000901515600114156104925761048b85858585610dcb565b90506104a2565b61048b8585602001518585610f96565b949350505050565b612710815111156104d65760405162461bcd60e51b81526004016104cd9061255e565b60405180910390fd5b6003548211156104f85760405162461bcd60e51b81526004016104cd90612764565b620186a082101561051b5760405162461bcd60e51b81526004016104cd90612946565b6020820460005a90508181116105435760405162461bcd60e51b81526004016104cd90612bc0565b60005b825a8303101561055857600101610546565b60003387878760405160200161057194939291906123bd565b60408051601f19818403018152919052805160209091012090504360281b4217610599610bb3565b6001600160a01b031663d41c021883836040518363ffffffff1660e01b81526004016105c692919061249b565b600060405180830381600087803b1580156105e057600080fd5b505af11580156105f4573d6000803e3d6000fd5b5050505060006002610604610bb3565b6001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b15801561063c57600080fd5b505afa158015610650573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061067491906121c1565b8161067b57fe5b0490507f4b388aecf9fa6cc92253704e5975a6129a4f735bdbd99567df4ed0094ee4ceb5338a8a8a60018603426040516106ba969594939291906123fa565b60405180910390a1505050505050505050565b620186a081565b6000806106df61106b565b5090935050505090565b6000806106f461106b565b50505064ffffffffff1692915050565b61271081565b60035481565b6000600261071c610bb3565b6001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b15801561075457600080fd5b505afa158015610768573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061078c91906121c1565b8161079357fe5b04905090565b60015481565b602081565b60006107c760405180606001604052806025815260200161305860259139610394565b905090565b60043560d81c60093560e890811c90600c35901c6107e86106e9565b8364ffffffffff161461080d5760405162461bcd60e51b81526004016104cd90612a6b565b61083b6040518060400160405280600d81526020016c27ab26afa9b2b8bab2b731b2b960991b815250610394565b6001600160a01b0316336001600160a01b03161461086b5760405162461bcd60e51b81526004016104cd90612ac8565b60008162ffffff16116108905760405162461bcd60e51b81526004016104cd906127c1565b60008262ffffff16116108b55760405162461bcd60e51b81526004016104cd90612d15565b600f601062ffffff831602013664ffffffffff82168110156108e95760405162461bcd60e51b81526004016104cd90612d9c565b60006108f3610710565b905060008562ffffff1667ffffffffffffffff8111801561091357600080fd5b5060405190808252806020026020018201604052801561093d578160200160208202803683370190505b509050600080600061094d6106d4565b9050610957611eb7565b60005b8962ffffff168163ffffffff161015610a8a57600061097e8263ffffffff16611119565b905063ffffffff82166109945761099481611169565b61099f838286611236565b80925060005b835163ffffffff82161015610a00578a3560e81c6109cb8564ffffffffff8e1683611346565b898963ffffffff16815181106109dd57fe5b60209081029190910101529a909a016003019960019687019695860195016109a5565b5060005b83602001518163ffffffff161015610a80578864ffffffffff168564ffffffffff1610610a435760405162461bcd60e51b81526004016104cd90612dde565b610a538564ffffffffff166113d0565b888863ffffffff1681518110610a6557fe5b60209081029190910101526001968701969485019401610a04565b505060010161095a565b50610a948161141b565b8764ffffffffff168714610aba5760405162461bcd60e51b81526004016104cd90612809565b8962ffffff168463ffffffff1614610ae45760405162461bcd60e51b81526004016104cd90612857565b6000838b62ffffff160363ffffffff169050600080836020015160001415610b1757505060408201516060830151610b3e565b6000610b2c6001870364ffffffffff16610247565b90508060200151925080604001519150505b610b5f610b4a89611463565b8e62ffffff168564ffffffffff168585611893565b7f602f1aeac0ca2e7a13e281a9ef0ad7838542712ce16780fa2ecffd351f05f89983860384610b8c6106e9565b604051610b9b93929190612ef4565b60405180910390a15050505050505050505050505050565b60006107c7604051806060016040528060238152602001612f3b60239139610394565b6000610be06107a4565b6001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b158015610c1857600080fd5b505afa158015610c2c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107c791906121c1565b6000610c5a6106d4565b610c62610710565b03905090565b60405162461bcd60e51b81526004016104cd906124ce565b83811015610d4557610cb66040518060400160405280600d81526020016c27ab26afa9b2b8bab2b731b2b960991b815250610394565b6001600160a01b0316336001600160a01b031614610d12576000610ce08364ffffffffff16610247565b905042600154826020015164ffffffffff160110610d105760405162461bcd60e51b81526004016104cd906129f8565b505b610d228264ffffffffff166113d0565b838281518110610d2e57fe5b602090810291909101015260019182019101610c80565b506000610d5b6001830364ffffffffff16610247565b9050610d7a610d6984611463565b858684602001518560400151611893565b7f64d7f508348c70dea42d5302a393987e4abc20e45954ab3f9d320207751956f0848364ffffffffff160385610dae6106e9565b604051610dbd93929190612ebb565b60405180910390a150505050565b600080610e036040518060400160405280601481526020017327ab26afa2bc32b1baba34b7b726b0b730b3b2b960611b815250610394565b90506000816001600160a01b0316631c4712a76040518163ffffffff1660e01b815260040160206040518083038186803b158015610e4057600080fd5b505afa158015610e54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e7891906121c1565b90506000610e8587611a4d565b9050610e92818787611ae6565b610eae5760405162461bcd60e51b81526004016104cd9061268d565b86606001518860200151148015610ec9575060408701518851145b8015610f0a5750610ef1604051806060016040528060228152602001612f5e60229139610394565b6001600160a01b031688608001516001600160a01b0316145b8015610f195750818860a00151145b8015610f30575060608801516001600160a01b0316155b8015610f4b5750600088604001516001811115610f4957fe5b145b8015610f6c57508660800151805190602001208860c0015180519060200120145b610f885760405162461bcd60e51b81526004016104cd9061272d565b506001979650505050505050565b600080610fa2856113d0565b9050610faf818585611ae6565b610fcb5760405162461bcd60e51b81526004016104cd90612c60565b6000866060015187608001518860a001518960c00151604051602001610ff494939291906123bd565b604051602081830303815290604052805190602001209050600061101787610247565b80519091508214801561103557508751602082015164ffffffffff16145b801561104f57508760200151816040015164ffffffffff16145b610f885760405162461bcd60e51b81526004016104cd90612b15565b600080600080600061107b6107a4565b6001600160a01b031663ccf8f9696040518163ffffffff1660e01b815260040160206040518083038186803b1580156110b357600080fd5b505afa1580156110c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110eb919061219b565b64ffffffffff602882901c811697605083901c82169750607883901c8216965060a09290921c169350915050565b611121611eb7565b5060408051608081018252601092909202600f81013560e890811c84526012820135901c6020840152601581013560d890811c92840192909252601a0135901c606082015290565b60006111736106e9565b11156111e35760008061118461106b565b9350935050508064ffffffffff16836060015110156111b55760405162461bcd60e51b81526004016104cd906126db565b8164ffffffffff16836040015110156111e05760405162461bcd60e51b81526004016104cd906125bb565b50505b42600154826040015101101561120b5760405162461bcd60e51b81526004016104cd90612d56565b4360025482606001510110156112335760405162461bcd60e51b81526004016104cd90612515565b50565b82604001518260400151101561125e5760405162461bcd60e51b81526004016104cd90612c0b565b8260600151826060015110156112865760405162461bcd60e51b81526004016104cd90612e27565b600081611291610710565b0364ffffffffff1611156113415760006112b18264ffffffffff16610247565b9050600154816020015164ffffffffff160142106112e15760405162461bcd60e51b81526004016104cd9061260a565b806020015164ffffffffff16836040015111156113105760405162461bcd60e51b81526004016104cd9061298f565b806040015164ffffffffff168360600151111561133f5760405162461bcd60e51b81526004016104cd90612caa565b505b505050565b6000808260410167ffffffffffffffff8111801561136357600080fd5b506040519080825280601f01601f19166020018201604052801561138e576020820181803683370190505b50604086015160608701519192509060006020840160018153836001820152826021820152866003890160418301376041870190209450505050509392505050565b60006114156040518060a00160405280600015158152602001848152602001600081526020016000815260200160405180602001604052806000815250815250611bd7565b92915050565b428160400151111561143f5760405162461bcd60e51b81526004016104cd90612b7b565b43816060015111156112335760405162461bcd60e51b81526004016104cd906128c7565b6000808251116114a45760405162461bcd60e51b815260040180806020018281038252603481526020018061307d6034913960400191505060405180910390fd5b81516114c657816000815181106114b757fe5b6020026020010151905061038f565b60408051610200810182527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56381527f633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d60208201527f890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d818301527f3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd86060808301919091527fecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da60808301527fdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da560a08301527f617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d760c08301527f292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead60e08301527fe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e106101008301527f7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f826101208301527fe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e836365166101408301527f3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c6101608301527fad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e6101808301527fa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab6101a08301527f4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c8626101c08301527f2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf106101e083015282518381529081018352909160009190602082018180368337505085519192506000918291508180805b600184111561186f5750506002820460018084161460005b828110156117eb578a816002028151811061179257fe5b602002602001015196508a81600202600101815181106117ae57fe5b6020026020010151955086602089015285604089015287805190602001208b82815181106117d857fe5b602090810291909101015260010161177b565b50801561184e5789600185038151811061180157fe5b6020026020010151955087836010811061181757fe5b602002015160001b945085602088015284604088015286805190602001208a838151811061184157fe5b6020026020010181815250505b8061185a57600061185d565b60015b60ff1682019350600190920191611763565b8960008151811061187c57fe5b602002602001015198505050505050505050919050565b6000806000806118a161106b565b935093509350935060006040518060a001604052806118be6107a4565b6001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b1580156118f657600080fd5b505afa15801561190a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061192e91906121c1565b81526020018b81526020018a81526020018664ffffffffff16815260200160405180602001604052806000815250815250905080600001517f127186556e7be68c7e31263195225b4de02820707889540969f62c05cf73525e82602001518360400151846060015185608001516040516119ab94939291906124a9565b60405180910390a260006119be82611c1f565b905060006119d6836040015188018b88018b8b611c48565b90506119e06107a4565b6001600160a01b0316632015276c83836040518363ffffffff1660e01b8152600401611a0d929190612485565b600060405180830381600087803b158015611a2757600080fd5b505af1158015611a3b573d6000803e3d6000fd5b50505050505050505050505050505050565b6080810151805160009190826041820167ffffffffffffffff81118015611a7357600080fd5b506040519080825280601f01601f191660200182016040528015611a9e576020820181803683370190505b5060408601516060870151919250906000602084016001815383600182015282602182015285604182018760208a0160045afa50604190950190942095505050505050919050565b6000611af06107a4565b8351604051634a83e9cd60e11b81526001600160a01b039290921691639507d39a91611b1e91600401612ed1565b60206040518083038186803b158015611b3657600080fd5b505afa158015611b4a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b6e91906121c1565b611b7784611c1f565b14611b945760405162461bcd60e51b81526004016104cd90612b4c565b611bb1836020015185846000015185602001518760400151611c67565b611bcd5760405162461bcd60e51b81526004016104cd9061290f565b5060019392505050565b8051602080830151604080850151606086015160808701519251600096611c0296909594910161244d565b604051602081830303815290604052805190602001209050919050565b60008160200151826040015183606001518460800151604051602001611c0294939291906124a9565b602892831b9390931760509190911b1760789290921b91909117901b90565b6000808211611ca75760405162461bcd60e51b8152600401808060200182810382526037815260200180612fd46037913960400191505060405180910390fd5b818410611ce55760405162461bcd60e51b8152600401808060200182810382526024815260200180612f806024913960400191505060405180910390fd5b611cee82611dec565b835114611d2c5760405162461bcd60e51b815260040180806020018281038252604d81526020018061300b604d913960600191505060405180910390fd5b8460005b8451811015611ddf578560011660011415611d8e57848181518110611d5157fe5b6020026020010151826040516020018083815260200182815260200192505050604051602081830303815290604052805190602001209150611dd3565b81858281518110611d9b57fe5b602002602001015160405160200180838152602001828152602001925050506040516020818303038152906040528051906020012091505b600195861c9501611d30565b5090951495945050505050565b6000808211611e2c5760405162461bcd60e51b8152600401808060200182810382526030815260200180612fa46030913960400191505060405180910390fd5b8160011415611e3d5750600061038f565b81600060805b60018160ff1610611e81578060ff1660018260ff166001901b03901b8316600014611e765760ff811692831c9291909101905b60011c607f16611e43565b506001811b8414611e90576001015b9392505050565b604080516060810182526000808252602082018190529181019190915290565b6040518060800160405280600081526020016000815260200160008152602001600081525090565b600067ffffffffffffffff831115611ef357fe5b611f06601f8401601f1916602001612f16565b9050828152838383011115611f1a57600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b038116811461038f57600080fd5b600082601f830112611f58578081fd5b611e9083833560208501611edf565b80356002811061038f57600080fd5b600060a08284031215611f87578081fd5b60405160a0810167ffffffffffffffff8282108183111715611fa557fe5b81604052829350843583526020850135602084015260408501356040840152606085013560608401526080850135915080821115611fe257600080fd5b50611fef85828601611f48565b6080830152505092915050565b60006040828403121561200d578081fd5b6040516040810167ffffffffffffffff828210818311171561202b57fe5b816040528293508435835260209150818501358181111561204b57600080fd5b8501601f8101871361205c57600080fd5b80358281111561206857fe5b8381029250612078848401612f16565b8181528481019083860185850187018b101561209357600080fd5b600095505b838610156120b6578035835260019590950194918601918601612098565b5080868801525050505050505092915050565b600060a082840312156120da578081fd5b60405160a0810167ffffffffffffffff82821081831117156120f857fe5b8160405282935084359150811515821461211157600080fd5b8183526020850135602084015260408501356040840152606085013560608401526080850135915080821115611fe257600080fd5b60008060006060848603121561215a578283fd5b61216384611f31565b925060208401359150604084013567ffffffffffffffff811115612185578182fd5b61219186828701611f48565b9150509250925092565b6000602082840312156121ac578081fd5b815164ffffffffff1981168114611e90578182fd5b6000602082840312156121d2578081fd5b5051919050565b6000602082840312156121ea578081fd5b813567ffffffffffffffff811115612200578182fd5b8201601f81018413612210578182fd5b6104a284823560208401611edf565b60008060008060808587031215612234578081fd5b843567ffffffffffffffff8082111561224b578283fd5b9086019060e0828903121561225e578283fd5b61226860e0612f16565b823581526020830135602082015261228260408401611f67565b604082015261229360608401611f31565b60608201526122a460808401611f31565b608082015260a083013560a082015260c0830135828111156122c4578485fd5b6122d08a828601611f48565b60c083015250955060208701359150808211156122eb578283fd5b6122f7888389016120c9565b9450604087013591508082111561230c578283fd5b61231888838901611f76565b9350606087013591508082111561232d578283fd5b5061233a87828801611ffc565b91505092959194509250565b600060208284031215612357578081fd5b5035919050565b60008151808452815b8181101561238357602081850181015186830182015201612367565b818111156123945782602083870101525b50601f01601f19169290920160200192915050565b6001600160a01b0391909116815260200190565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906123f09083018461235e565b9695505050505050565b6001600160a01b038781168252861660208201526040810185905260c06060820181905260009061242d9083018661235e565b60808301949094525060a00152949350505050565b901515815260200190565b6000861515825285602083015284604083015283606083015260a0608083015261247a60a083018461235e565b979650505050505050565b91825264ffffffffff1916602082015260400190565b918252602082015260400190565b6000858252846020830152836040830152608060608301526123f0608083018461235e565b60208082526027908201527f617070656e64517565756542617463682069732063757272656e746c7920646960408201526639b0b13632b21760c91b606082015260800190565b60208082526029908201527f436f6e7465787420626c6f636b206e756d62657220746f6f2066617220696e206040820152683a3432903830b9ba1760b91b606082015260800190565b6020808252603d908201527f5472616e73616374696f6e20646174612073697a652065786365656473206d6160408201527f78696d756d20666f7220726f6c6c7570207472616e73616374696f6e2e000000606082015260800190565b6020808252602f908201527f436f6e746578742074696d657374616d70206973206c6f776572207468616e2060408201526e3630b9ba1039bab136b4ba3a32b21760891b606082015260800190565b6020808252605b908201527f50726576696f75736c7920656e7175657565642062617463686573206861766560408201527f206578706972656420616e64206d75737420626520617070656e64656420626560608201527f666f72652061206e65772073657175656e6365722062617463682e0000000000608082015260a00190565b6020808252602e908201527f496e76616c69642053657175656e636572207472616e73616374696f6e20696e60408201526d31b63ab9b4b7b710383937b7b31760911b606082015260800190565b60208082526032908201527f436f6e7465787420626c6f636b206e756d626572206973206c6f77657220746860408201527130b7103630b9ba1039bab136b4ba3a32b21760711b606082015260800190565b6020808252601e908201527f496e76616c69642053657175656e636572207472616e73616374696f6e2e0000604082015260600190565b6020808252603d908201527f5472616e73616374696f6e20676173206c696d69742065786365656473206d6160408201527f78696d756d20666f7220726f6c6c7570207472616e73616374696f6e2e000000606082015260800190565b60208082526028908201527f4d7573742070726f76696465206174206c65617374206f6e652062617463682060408201526731b7b73a32bc3a1760c11b606082015260800190565b6020808252602e908201527f4e6f7420616c6c2073657175656e636572207472616e73616374696f6e73207760408201526d32b93290383937b1b2b9b9b2b21760911b606082015260800190565b6020808252604a908201527f41637475616c207472616e73616374696f6e20696e64657820646f6573206e6f60408201527f74206d6174636820657870656374656420746f74616c20656c656d656e7473206060820152693a379030b83832b7321760b11b608082015260a00190565b60208082526028908201527f436f6e7465787420626c6f636b206e756d6265722069732066726f6d2074686560408201526710333aba3ab9329760c11b606082015260800190565b60208082526018908201527f496e76616c696420696e636c7573696f6e2070726f6f662e0000000000000000604082015260600190565b60208082526029908201527f5472616e73616374696f6e20676173206c696d697420746f6f206c6f7720746f6040820152681032b738bab2bab29760b91b606082015260800190565b60208082526043908201527f53657175656e636572207472616e73616374696f6e2074696d657374616d702060408201527f657863656564732074686174206f66206e65787420717565756520656c656d65606082015262373a1760e91b608082015260a00190565b6020808252604d908201527f5175657565207472616e73616374696f6e732063616e6e6f742062652073756260408201527f6d697474656420647572696e67207468652073657175656e63657220696e636c60608201526c3ab9b4b7b7103832b934b7b21760991b608082015260a00190565b6020808252603d908201527f41637475616c20626174636820737461727420696e64657820646f6573206e6f60408201527f74206d6174636820657870656374656420737461727420696e6465782e000000606082015260800190565b6020808252602d908201527f46756e6374696f6e2063616e206f6e6c792062652063616c6c6564206279207460408201526c34329029b2b8bab2b731b2b91760991b606082015260800190565b6020808252601a908201527f496e76616c6964205175657565207472616e73616374696f6e2e000000000000604082015260600190565b60208082526015908201527424b73b30b634b2103130ba31b4103432b0b232b91760591b604082015260600190565b60208082526025908201527f436f6e746578742074696d657374616d702069732066726f6d207468652066756040820152643a3ab9329760d91b606082015260800190565b6020808252602b908201527f496e73756666696369656e742067617320666f72204c322072617465206c696d60408201526a34ba34b73390313ab9371760a91b606082015260800190565b60208082526035908201527f436f6e746578742074696d657374616d702076616c756573206d757374206d6f6040820152743737ba37b734b1b0b6363c9034b731b932b0b9b29760591b606082015260800190565b6020808252602a908201527f496e76616c6964205175657565207472616e73616374696f6e20696e636c757360408201526934b7b710383937b7b31760b11b606082015260800190565b60208082526045908201527f53657175656e636572207472616e73616374696f6e20626c6f636b4e756d626560408201527f7220657863656564732074686174206f66206e65787420717565756520656c6560608201526436b2b73a1760d91b608082015260a00190565b60208082526021908201527f4d75737420617070656e64206174206c65617374206f6e6520656c656d656e746040820152601760f91b606082015260800190565b60208082526026908201527f436f6e746578742074696d657374616d7020746f6f2066617220696e20746865604082015265103830b9ba1760d11b606082015260800190565b60208082526022908201527f4e6f7420656e6f756768204261746368436f6e74657874732070726f76696465604082015261321760f11b606082015260800190565b60208082526029908201527f4e6f7420656e6f75676820717565756564207472616e73616374696f6e732074604082015268379030b83832b7321760b91b606082015260800190565b60208082526037908201527f436f6e7465787420626c6f636b4e756d6265722076616c756573206d7573742060408201527f6d6f6e6f746f6e6963616c6c7920696e6372656173652e000000000000000000606082015260800190565b8151815260208083015164ffffffffff90811691830191909152604092830151169181019190915260600190565b90815260200190565b9283526020830191909152604082015260600190565b63ffffffff91909116815260200190565b64ffffffffff91909116815260200190565b64ffffffffff9384168152919092166020820152604081019190915260600190565b60405181810167ffffffffffffffff81118282101715612f3257fe5b60405291905056fe4f564d5f436861696e53746f72616765436f6e7461696e65723a4354433a71756575654f564d5f4465636f6d7072657373696f6e507265636f6d70696c65416464726573734c69625f4d65726b6c65547265653a20496e646578206f7574206f6620626f756e64732e4c69625f4d65726b6c65547265653a2043616e6e6f7420636f6d70757465206365696c286c6f675f3229206f6620302e4c69625f4d65726b6c65547265653a20546f74616c206c6561766573206d7573742062652067726561746572207468616e207a65726f2e4c69625f4d65726b6c65547265653a20546f74616c207369626c696e677320646f6573206e6f7420636f72726563746c7920636f72726573706f6e6420746f20746f74616c206c65617665732e4f564d5f436861696e53746f72616765436f6e7461696e65723a4354433a626174636865734c69625f4d65726b6c65547265653a204d7573742070726f76696465206174206c65617374206f6e65206c65616620686173682ea26469706673582212203512ca678bca74305bf6a879ce3d6142d5a90f38111948470b55a07a416cec5964736f6c63430007060033", - "devdoc": { - "kind": "dev", - "methods": { - "appendQueueBatch(uint256)": { - "params": { - "_numQueuedTransactions": "Number of transactions to append." - } - }, - "appendSequencerBatch()": { - "details": "This function uses a custom encoding scheme for efficiency reasons. .param _shouldStartAtElement Specific batch we expect to start appending to. .param _totalElementsToAppend Total number of batch elements we expect to append. .param _contexts Array of batch contexts. .param _transactionDataFields Array of raw transaction data." - }, - "batches()": { - "returns": { - "_0": "Reference to the batch storage container." - } - }, - "enqueue(address,uint256,bytes)": { - "params": { - "_data": "Transaction data.", - "_gasLimit": "Gas limit for the given transaction.", - "_target": "Target contract to send the transaction to." - } - }, - "getNextQueueIndex()": { - "returns": { - "_0": "Index for the next queue element." - } - }, - "getNumPendingQueueElements()": { - "returns": { - "_0": "Length of the queue." - } - }, - "getQueueElement(uint256)": { - "params": { - "_index": "Index of the queue element to access." - }, - "returns": { - "_element": "Queue element at the given index." - } - }, - "getQueueLength()": { - "returns": { - "_0": "Length of the queue." - } - }, - "getTotalBatches()": { - "returns": { - "_totalBatches": "Total submitted batches." - } - }, - "getTotalElements()": { - "returns": { - "_totalElements": "Total submitted elements." - } - }, - "queue()": { - "returns": { - "_0": "Reference to the queue storage container." - } - }, - "verifyTransaction((uint256,uint256,uint8,address,address,uint256,bytes),(bool,uint256,uint256,uint256,bytes),(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))": { - "params": { - "_batchHeader": "Header of the batch the transaction was included in.", - "_inclusionProof": "Inclusion proof for the provided transaction chain element.", - "_transaction": "Transaction to verify.", - "_txChainElement": "Transaction chain element corresponding to the transaction." - }, - "returns": { - "_0": "True if the transaction exists in the CTC, false if not." - } - } - }, - "title": "OVM_CanonicalTransactionChain", - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": { - "appendQueueBatch(uint256)": { - "notice": "Appends a given number of queued transactions as a single batch." - }, - "appendSequencerBatch()": { - "notice": "Allows the sequencer to append a batch of transactions." - }, - "batches()": { - "notice": "Accesses the batch storage container." - }, - "enqueue(address,uint256,bytes)": { - "notice": "Adds a transaction to the queue." - }, - "getNextQueueIndex()": { - "notice": "Returns the index of the next element to be enqueued." - }, - "getNumPendingQueueElements()": { - "notice": "Get the number of queue elements which have not yet been included." - }, - "getQueueElement(uint256)": { - "notice": "Gets the queue element at a particular index." - }, - "getQueueLength()": { - "notice": "Retrieves the length of the queue, including both pending and canonical transactions." - }, - "getTotalBatches()": { - "notice": "Retrieves the total number of batches submitted." - }, - "getTotalElements()": { - "notice": "Retrieves the total number of elements submitted." - }, - "queue()": { - "notice": "Accesses the queue storage container." - }, - "verifyTransaction((uint256,uint256,uint8,address,address,uint256,bytes),(bool,uint256,uint256,uint256,bytes),(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))": { - "notice": "Verifies whether a transaction is included in the chain." - } - }, - "version": 1 - }, - "storageLayout": { - "storage": [ - { - "astId": 11707, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_CanonicalTransactionChain.sol:OVM_CanonicalTransactionChain", - "label": "libAddressManager", - "offset": 0, - "slot": "0", - "type": "t_contract(Lib_AddressManager)11700" - }, - { - "astId": 1388, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_CanonicalTransactionChain.sol:OVM_CanonicalTransactionChain", - "label": "forceInclusionPeriodSeconds", - "offset": 0, - "slot": "1", - "type": "t_uint256" - }, - { - "astId": 1390, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_CanonicalTransactionChain.sol:OVM_CanonicalTransactionChain", - "label": "forceInclusionPeriodBlocks", - "offset": 0, - "slot": "2", - "type": "t_uint256" - }, - { - "astId": 1392, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_CanonicalTransactionChain.sol:OVM_CanonicalTransactionChain", - "label": "maxTransactionGasLimit", - "offset": 0, - "slot": "3", - "type": "t_uint256" - } - ], - "types": { - "t_contract(Lib_AddressManager)11700": { - "encoding": "inplace", - "label": "contract Lib_AddressManager", - "numberOfBytes": "20" - }, - "t_uint256": { - "encoding": "inplace", - "label": "uint256", - "numberOfBytes": "32" - } - } - } -} \ No newline at end of file diff --git a/packages/contracts/deployments/kovan-v1/OVM_ChainStorageContainer-CTC-batches.json b/packages/contracts/deployments/kovan-v1/OVM_ChainStorageContainer-CTC-batches.json deleted file mode 100644 index 61a72ae4b97bb..0000000000000 --- a/packages/contracts/deployments/kovan-v1/OVM_ChainStorageContainer-CTC-batches.json +++ /dev/null @@ -1,488 +0,0 @@ -{ - "address": "0x095744753D5353C1FC43EFb1ab81D06f3e2F4630", - "abi": [ - { - "inputs": [ - { - "internalType": "address", - "name": "_libAddressManager", - "type": "address" - }, - { - "internalType": "string", - "name": "_owner", - "type": "string" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_index", - "type": "uint256" - }, - { - "internalType": "bytes27", - "name": "_globalMetadata", - "type": "bytes27" - } - ], - "name": "deleteElementsAfterInclusive", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_index", - "type": "uint256" - } - ], - "name": "deleteElementsAfterInclusive", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_index", - "type": "uint256" - } - ], - "name": "get", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getGlobalMetadata", - "outputs": [ - { - "internalType": "bytes27", - "name": "", - "type": "bytes27" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "length", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "owner", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "_object", - "type": "bytes32" - }, - { - "internalType": "bytes27", - "name": "_globalMetadata", - "type": "bytes27" - } - ], - "name": "push", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "_object", - "type": "bytes32" - } - ], - "name": "push", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "_objectA", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "_objectB", - "type": "bytes32" - }, - { - "internalType": "bytes27", - "name": "_globalMetadata", - "type": "bytes27" - } - ], - "name": "push2", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "_objectA", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "_objectB", - "type": "bytes32" - } - ], - "name": "push2", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "string", - "name": "_name", - "type": "string" - } - ], - "name": "resolve", - "outputs": [ - { - "internalType": "address", - "name": "_contract", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes27", - "name": "_globalMetadata", - "type": "bytes27" - } - ], - "name": "setGlobalMetadata", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_index", - "type": "uint256" - } - ], - "name": "setNextOverwritableIndex", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - } - ], - "transactionHash": "0x86b9f5af9ce79ad3dca2a59ed521e75d88ed6d816f85e49b15232731cf1b16eb", - "receipt": { - "to": null, - "from": "0x558ba9b8d78713fbf768c1f8a584485B4003f43F", - "contractAddress": "0x4C4a482b6bE75FDce6E94Be10423363108f34fDf", - "transactionIndex": 1, - "gasUsed": "1103714", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0x7dc617150a7075769c500e7ebe66c4357400e4d7a81a26495e265d4949b2fdd6", - "transactionHash": "0x86b9f5af9ce79ad3dca2a59ed521e75d88ed6d816f85e49b15232731cf1b16eb", - "logs": [], - "blockNumber": 4573377, - "cumulativeGasUsed": "1155953", - "status": 1, - "byzantium": true - }, - "args": [ - "0x72e6F5244828C10737cbC9659378B207246D26B2", - "OVM_CanonicalTransactionChain" - ], - "solcInputHash": "cebcb515c1a9c570d96e0b8f6fd237e2", - "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_owner\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"get\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getGlobalMetadata\",\"outputs\":[{\"internalType\":\"bytes27\",\"name\":\"\",\"type\":\"bytes27\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"length\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_objectA\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"_objectB\",\"type\":\"bytes32\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"push2\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_objectA\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"_objectB\",\"type\":\"bytes32\"}],\"name\":\"push2\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"_contract\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"setGlobalMetadata\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"setNextOverwritableIndex\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\",\"_owner\":\"Name of the contract that owns this container (will be resolved later).\"}},\"deleteElementsAfterInclusive(uint256)\":{\"params\":{\"_index\":\"Object index to delete from.\"}},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_index\":\"Object index to delete from.\"}},\"get(uint256)\":{\"params\":{\"_index\":\"Index of the particular object to access.\"},\"returns\":{\"_0\":\"32 byte object value.\"}},\"getGlobalMetadata()\":{\"returns\":{\"_0\":\"Container global metadata field.\"}},\"length()\":{\"returns\":{\"_0\":\"Number of objects in the container.\"}},\"push(bytes32)\":{\"params\":{\"_object\":\"A 32 byte value to insert into the container.\"}},\"push(bytes32,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_object\":\"A 32 byte value to insert into the container.\"}},\"push2(bytes32,bytes32)\":{\"params\":{\"_objectA\":\"First 32 byte value to insert into the container.\",\"_objectB\":\"Second 32 byte value to insert into the container.\"}},\"push2(bytes32,bytes32,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_objectA\":\"First 32 byte value to insert into the container.\",\"_objectB\":\"Second 32 byte value to insert into the container.\"}},\"setGlobalMetadata(bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata to set.\"}}},\"title\":\"OVM_ChainStorageContainer\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"deleteElementsAfterInclusive(uint256)\":{\"notice\":\"Removes all objects after and including a given index.\"},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"notice\":\"Removes all objects after and including a given index. Also allows setting the global metadata field.\"},\"get(uint256)\":{\"notice\":\"Retrieves an object from the container.\"},\"getGlobalMetadata()\":{\"notice\":\"Retrieves the container's global metadata field.\"},\"length()\":{\"notice\":\"Retrieves the number of objects stored in the container.\"},\"push(bytes32)\":{\"notice\":\"Pushes an object into the container.\"},\"push(bytes32,bytes27)\":{\"notice\":\"Pushes an object into the container. Function allows setting the global metadata since we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global metadata (it's an optimization).\"},\"push2(bytes32,bytes32)\":{\"notice\":\"Pushes two objects into the container at the same time. A useful optimization.\"},\"push2(bytes32,bytes32,bytes27)\":{\"notice\":\"Pushes two objects into the container at the same time. Also allows setting the global metadata field.\"},\"setGlobalMetadata(bytes27)\":{\"notice\":\"Sets the container's global metadata field. We're using `bytes27` here because we use five bytes to maintain the length of the underlying data structure, meaning we have an extra 27 bytes to store arbitrary data.\"},\"setNextOverwritableIndex(uint256)\":{\"notice\":\"Marks an index as overwritable, meaing the underlying buffer can start to write values over any objects before and including the given index.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol\":\"OVM_ChainStorageContainer\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol\":{\"content\":\"pragma solidity ^0.7.0;\\n\\n/* Library Imports */\\nimport { Lib_RingBuffer } from \\\"../../libraries/utils/Lib_RingBuffer.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_ChainStorageContainer } from \\\"../../iOVM/chain/iOVM_ChainStorageContainer.sol\\\";\\n\\n/**\\n * @title OVM_ChainStorageContainer\\n */\\ncontract OVM_ChainStorageContainer is iOVM_ChainStorageContainer, Lib_AddressResolver {\\n\\n /*************\\n * Libraries *\\n *************/\\n\\n using Lib_RingBuffer for Lib_RingBuffer.RingBuffer;\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n string public owner;\\n Lib_RingBuffer.RingBuffer internal buffer;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n \\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n * @param _owner Name of the contract that owns this container (will be resolved later).\\n */\\n constructor(\\n address _libAddressManager,\\n string memory _owner\\n )\\n Lib_AddressResolver(_libAddressManager)\\n {\\n owner = _owner;\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n \\n modifier onlyOwner() {\\n require(\\n msg.sender == resolve(owner),\\n \\\"OVM_ChainStorageContainer: Function can only be called by the owner.\\\"\\n );\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function setGlobalMetadata(\\n bytes27 _globalMetadata\\n )\\n override\\n public\\n onlyOwner\\n {\\n return buffer.setExtraData(_globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function getGlobalMetadata()\\n override\\n public\\n view\\n returns (\\n bytes27\\n )\\n {\\n return buffer.getExtraData();\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function length()\\n override\\n public\\n view\\n returns (\\n uint256\\n )\\n {\\n return uint256(buffer.getLength());\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function push(\\n bytes32 _object\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.push(_object);\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function push(\\n bytes32 _object,\\n bytes27 _globalMetadata\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.push(_object, _globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function push2(\\n bytes32 _objectA,\\n bytes32 _objectB\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.push2(_objectA, _objectB);\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function push2(\\n bytes32 _objectA,\\n bytes32 _objectB,\\n bytes27 _globalMetadata\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.push2(_objectA, _objectB, _globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function get(\\n uint256 _index\\n )\\n override\\n public\\n view\\n returns (\\n bytes32\\n )\\n {\\n return buffer.get(uint40(_index));\\n }\\n \\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.deleteElementsAfterInclusive(\\n uint40(_index)\\n );\\n }\\n \\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index,\\n bytes27 _globalMetadata\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.deleteElementsAfterInclusive(\\n uint40(_index),\\n _globalMetadata\\n );\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function setNextOverwritableIndex(\\n uint256 _index\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.nextOverwritableIndex = _index;\\n }\\n}\\n\",\"keccak256\":\"0xc722e9528988810bd754002dfe3923bc9ac9252c1d981c4803fd5053603bfb11\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_ChainStorageContainer.sol\":{\"content\":\"pragma solidity ^0.7.0;\\n\\n/**\\n * @title iOVM_ChainStorageContainer\\n */\\ninterface iOVM_ChainStorageContainer {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata()\\n external\\n view\\n returns (\\n bytes27\\n );\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length()\\n external\\n view\\n returns (\\n uint256\\n );\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(\\n bytes32 _object\\n )\\n external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(\\n bytes32 _object,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Pushes two objects into the container at the same time. A useful optimization.\\n * @param _objectA First 32 byte value to insert into the container.\\n * @param _objectB Second 32 byte value to insert into the container.\\n */\\n function push2(\\n bytes32 _objectA,\\n bytes32 _objectB\\n )\\n external;\\n\\n /**\\n * Pushes two objects into the container at the same time. Also allows setting the global\\n * metadata field.\\n * @param _objectA First 32 byte value to insert into the container.\\n * @param _objectB Second 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push2(\\n bytes32 _objectA,\\n bytes32 _objectB,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(\\n uint256 _index\\n )\\n external\\n view\\n returns (\\n bytes32\\n );\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index\\n )\\n external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Marks an index as overwritable, meaing the underlying buffer can start to write values over\\n * any objects before and including the given index.\\n */\\n function setNextOverwritableIndex(\\n uint256 _index\\n )\\n external;\\n}\\n\",\"keccak256\":\"0xcfca7da85b35d94c27581c2460b0d48fd0cc51fa72670cc7a2f7f760fb21a2f0\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// +build ovm\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Contract Imports */\\nimport { Ownable } from \\\"./Lib_Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n /*******************************************\\n * Contract Variables: Internal Accounting *\\n *******************************************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n public\\n onlyOwner\\n {\\n emit AddressSet(_name, _address);\\n addresses[_getNameHash(_name)] = _address;\\n }\\n\\n function getAddress(\\n string memory _name\\n )\\n public\\n view\\n returns (address)\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32 _hash\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xdf802e1cc6474df913626991e9fca3835c620a519f397afe04bf9c260e723257\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// +build ovm\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\ncontract Lib_AddressResolver {\\n\\n /*******************************************\\n * Contract Variables: Contract References *\\n *******************************************/\\n\\n Lib_AddressManager internal libAddressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(\\n address _libAddressManager\\n ) public {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function resolve(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address _contract\\n )\\n {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0xf3b9d78b309ddeec259ce3e0e1cfdef3ca40938e9a81971b28ce2b8ea327f533\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// +build ovm\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Ownable\\n * @dev Adapted from https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol\\n */\\nabstract contract Ownable {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n address public owner;\\n\\n\\n /**********\\n * Events *\\n **********/\\n\\n event OwnershipTransferred(\\n address indexed previousOwner,\\n address indexed newOwner\\n );\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n constructor() internal {\\n owner = msg.sender;\\n emit OwnershipTransferred(address(0), owner);\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n owner == msg.sender,\\n \\\"Ownable: caller is not the owner\\\"\\n );\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function renounceOwnership()\\n public\\n virtual\\n onlyOwner\\n {\\n emit OwnershipTransferred(owner, address(0));\\n owner = address(0);\\n }\\n\\n function transferOwnership(address _newOwner)\\n public\\n virtual\\n onlyOwner\\n {\\n require(\\n _newOwner != address(0),\\n \\\"Ownable: new owner cannot be the zero address\\\"\\n );\\n\\n emit OwnershipTransferred(owner, _newOwner);\\n owner = _newOwner;\\n }\\n}\\n\",\"keccak256\":\"0xe0409fbd236d16ca6be439d9d97dd36d0d9a0697ee0062d49588b9d29c248e47\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_RingBuffer.sol\":{\"content\":\"pragma solidity ^0.7.0;\\n\\nlibrary Lib_RingBuffer {\\n using Lib_RingBuffer for RingBuffer;\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Buffer {\\n uint256 length;\\n mapping (uint256 => bytes32) buf;\\n }\\n\\n struct RingBuffer {\\n bytes32 contextA;\\n bytes32 contextB;\\n Buffer bufferA;\\n Buffer bufferB;\\n uint256 nextOverwritableIndex;\\n }\\n\\n struct RingBufferContext {\\n // contextA\\n uint40 globalIndex;\\n bytes27 extraData;\\n\\n // contextB\\n uint64 currBufferIndex;\\n uint40 prevResetIndex;\\n uint40 currResetIndex;\\n }\\n\\n\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 constant MIN_CAPACITY = 16;\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n * @param _extraData Optional global extra data.\\n */\\n function push(\\n RingBuffer storage _self,\\n bytes32 _value,\\n bytes27 _extraData\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n Buffer storage currBuffer = _self.getBuffer(ctx.currBufferIndex);\\n\\n // Set a minimum capacity.\\n if (currBuffer.length == 0) {\\n currBuffer.length = MIN_CAPACITY;\\n }\\n\\n // Check if we need to expand the buffer.\\n if (ctx.globalIndex - ctx.currResetIndex >= currBuffer.length) {\\n if (ctx.currResetIndex < _self.nextOverwritableIndex) {\\n // We're going to overwrite the inactive buffer.\\n // Bump the buffer index, reset the delete offset, and set our reset indices.\\n ctx.currBufferIndex++;\\n ctx.prevResetIndex = ctx.currResetIndex;\\n ctx.currResetIndex = ctx.globalIndex;\\n\\n // Swap over to the next buffer.\\n currBuffer = _self.getBuffer(ctx.currBufferIndex);\\n } else {\\n // We're not overwriting yet, double the length of the current buffer.\\n currBuffer.length *= 2;\\n }\\n }\\n\\n // Index to write to is the difference of the global and reset indices.\\n uint256 writeHead = ctx.globalIndex - ctx.currResetIndex;\\n currBuffer.buf[writeHead] = _value;\\n\\n // Bump the global index and insert our extra data, then save the context.\\n ctx.globalIndex++;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n */\\n function push(\\n RingBuffer storage _self,\\n bytes32 _value\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n \\n _self.push(\\n _value,\\n ctx.extraData\\n );\\n }\\n\\n /**\\n * Pushes a two elements to the buffer.\\n * @param _self Buffer to access.\\n * @param _valueA First value to push to the buffer.\\n * @param _valueA Second value to push to the buffer.\\n * @param _extraData Optional global extra data.\\n */\\n function push2(\\n RingBuffer storage _self,\\n bytes32 _valueA,\\n bytes32 _valueB,\\n bytes27 _extraData\\n )\\n internal\\n {\\n _self.push(_valueA, _extraData);\\n _self.push(_valueB, _extraData);\\n }\\n\\n /**\\n * Pushes a two elements to the buffer.\\n * @param _self Buffer to access.\\n * @param _valueA First value to push to the buffer.\\n * @param _valueA Second value to push to the buffer.\\n */\\n function push2(\\n RingBuffer storage _self,\\n bytes32 _valueA,\\n bytes32 _valueB\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n\\n _self.push2(\\n _valueA,\\n _valueB,\\n ctx.extraData\\n );\\n }\\n\\n /**\\n * Retrieves an element from the buffer.\\n * @param _self Buffer to access.\\n * @param _index Element index to retrieve.\\n * @return Value of the element at the given index.\\n */\\n function get(\\n RingBuffer storage _self,\\n uint256 _index\\n )\\n internal\\n view\\n returns (\\n bytes32 \\n )\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n\\n require(\\n _index < ctx.globalIndex,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n Buffer storage currBuffer = _self.getBuffer(ctx.currBufferIndex);\\n Buffer storage prevBuffer = _self.getBuffer(ctx.currBufferIndex + 1);\\n\\n if (_index >= ctx.currResetIndex) {\\n // We're trying to load an element from the current buffer.\\n // Relative index is just the difference from the reset index.\\n uint256 relativeIndex = _index - ctx.currResetIndex;\\n\\n // Shouldn't happen but why not check.\\n require(\\n relativeIndex < currBuffer.length,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n return currBuffer.buf[relativeIndex];\\n } else {\\n // We're trying to load an element from the previous buffer.\\n // Relative index is the difference from the reset index in the other direction.\\n uint256 relativeIndex = ctx.currResetIndex - _index;\\n\\n // Condition only fails in the case that we deleted and flipped buffers.\\n require(\\n ctx.currResetIndex > ctx.prevResetIndex,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n // Make sure we're not trying to read beyond the array.\\n require(\\n relativeIndex <= prevBuffer.length,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n return prevBuffer.buf[prevBuffer.length - relativeIndex];\\n }\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n * @param _extraData Optional global extra data.\\n */\\n function deleteElementsAfterInclusive(\\n RingBuffer storage _self,\\n uint40 _index,\\n bytes27 _extraData\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n\\n require(\\n _index < ctx.globalIndex && _index >= ctx.prevResetIndex,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n Buffer storage currBuffer = _self.getBuffer(ctx.currBufferIndex);\\n Buffer storage prevBuffer = _self.getBuffer(ctx.currBufferIndex + 1);\\n\\n if (_index < ctx.currResetIndex) {\\n // We're switching back to the previous buffer.\\n // Reduce the buffer index, set the current reset index back to match the previous one.\\n // We use the equality of these two values to prevent reading beyond this buffer.\\n ctx.currBufferIndex--;\\n ctx.currResetIndex = ctx.prevResetIndex;\\n }\\n\\n // Set our global index and extra data, save the context.\\n ctx.globalIndex = _index;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n */\\n function deleteElementsAfterInclusive(\\n RingBuffer storage _self,\\n uint40 _index\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n _self.deleteElementsAfterInclusive(\\n _index,\\n ctx.extraData\\n );\\n }\\n\\n /**\\n * Retrieves the current global index.\\n * @param _self Buffer to access.\\n * @return Current global index.\\n */\\n function getLength(\\n RingBuffer storage _self\\n )\\n internal\\n view\\n returns (\\n uint40\\n )\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n return ctx.globalIndex;\\n }\\n\\n /**\\n * Changes current global extra data.\\n * @param _self Buffer to access.\\n * @param _extraData New global extra data.\\n */\\n function setExtraData(\\n RingBuffer storage _self,\\n bytes27 _extraData\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Retrieves the current global extra data.\\n * @param _self Buffer to access.\\n * @return Current global extra data.\\n */\\n function getExtraData(\\n RingBuffer storage _self\\n )\\n internal\\n view\\n returns (\\n bytes27\\n )\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n return ctx.extraData;\\n }\\n\\n /**\\n * Sets the current ring buffer context.\\n * @param _self Buffer to access.\\n * @param _ctx Current ring buffer context.\\n */\\n function setContext(\\n RingBuffer storage _self,\\n RingBufferContext memory _ctx\\n )\\n internal\\n returns (\\n bytes32\\n )\\n {\\n bytes32 contextA;\\n bytes32 contextB;\\n\\n uint40 globalIndex = _ctx.globalIndex;\\n bytes27 extraData = _ctx.extraData;\\n assembly {\\n contextA := globalIndex\\n contextA := or(contextA, extraData)\\n }\\n\\n uint64 currBufferIndex = _ctx.currBufferIndex;\\n uint40 prevResetIndex = _ctx.prevResetIndex;\\n uint40 currResetIndex = _ctx.currResetIndex;\\n assembly {\\n contextB := currBufferIndex\\n contextB := or(contextB, shl(64, prevResetIndex))\\n contextB := or(contextB, shl(104, currResetIndex))\\n }\\n\\n if (_self.contextA != contextA) {\\n _self.contextA = contextA;\\n }\\n\\n if (_self.contextB != contextB) {\\n _self.contextB = contextB;\\n }\\n }\\n\\n /**\\n * Retrieves the current ring buffer context.\\n * @param _self Buffer to access.\\n * @return Current ring buffer context.\\n */\\n function getContext(\\n RingBuffer storage _self\\n )\\n internal\\n view\\n returns (\\n RingBufferContext memory\\n )\\n {\\n bytes32 contextA = _self.contextA;\\n bytes32 contextB = _self.contextB;\\n\\n uint40 globalIndex;\\n bytes27 extraData;\\n assembly {\\n globalIndex := and(contextA, 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF)\\n extraData := and(contextA, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000)\\n }\\n\\n uint64 currBufferIndex;\\n uint40 prevResetIndex;\\n uint40 currResetIndex;\\n assembly {\\n currBufferIndex := and(contextB, 0x000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF)\\n prevResetIndex := shr(64, and(contextB, 0x00000000000000000000000000000000000000FFFFFFFFFF0000000000000000))\\n currResetIndex := shr(104, and(contextB, 0x0000000000000000000000000000FFFFFFFFFF00000000000000000000000000))\\n }\\n\\n return RingBufferContext({\\n globalIndex: globalIndex,\\n extraData: extraData,\\n currBufferIndex: currBufferIndex,\\n prevResetIndex: prevResetIndex,\\n currResetIndex: currResetIndex\\n });\\n }\\n\\n /**\\n * Retrieves the a buffer from the ring buffer by index.\\n * @param _self Buffer to access.\\n * @param _which Index of the sub buffer to access.\\n * @return Sub buffer for the index.\\n */\\n function getBuffer(\\n RingBuffer storage _self,\\n uint256 _which\\n )\\n internal\\n view\\n returns (\\n Buffer storage\\n )\\n {\\n return _which % 2 == 0 ? _self.bufferA : _self.bufferB;\\n }\\n}\\n\",\"keccak256\":\"0x0c4bb53aba64441b2ec26e7a13de8f04f104bb654e550ccc30db500cac33d2a3\"}},\"version\":1}", - "bytecode": "0x60806040523480156200001157600080fd5b50604051620013f3380380620013f3833981810160405260408110156200003757600080fd5b8151602083018051604051929492938301929190846401000000008211156200005f57600080fd5b9083019060208201858111156200007557600080fd5b82516401000000008111828201881017156200009057600080fd5b82525081516020918201929091019080838360005b83811015620000bf578181015183820152602001620000a5565b50505050905090810190601f168015620000ed5780820380516001836020036101000a031916815260200191505b506040525050600080546001600160a01b0319166001600160a01b038516179055508051620001249060019060208401906200012d565b505050620001d9565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282620001655760008555620001b0565b82601f106200018057805160ff1916838001178555620001b0565b82800160010185558215620001b0579182015b82811115620001b057825182559160200191906001019062000193565b50620001be929150620001c2565b5090565b5b80821115620001be5760008155600101620001c3565b61120a80620001e96000396000f3fe608060405234801561001057600080fd5b50600436106100cf5760003560e01c80634651d91e1161008c578063b298e36b11610066578063b298e36b14610315578063ccf8f96914610332578063d41c021814610355578063fa9e936c14610378576100cf565b80634651d91e1461025e5780638da5cb5b1461027b5780639507d39a146102f8576100cf565b806314f22255146100d4578063167fd681146101075780631f7b6d32146101325780632015276c1461014c57806329061de214610177578063461a44781461019c575b600080fd5b610105600480360360608110156100ea57600080fd5b508035906020810135906040013564ffffffffff1916610395565b005b6101056004803603604081101561011d57600080fd5b508035906020013564ffffffffff191661048c565b61013a61054c565b60408051918252519081900360200190f35b6101056004803603604081101561016257600080fd5b508035906020013564ffffffffff1916610564565b6101056004803603602081101561018d57600080fd5b503564ffffffffff1916610620565b610242600480360360208110156101b257600080fd5b8101906020810181356401000000008111156101cd57600080fd5b8201836020820111156101df57600080fd5b8035906020019184600183028401116401000000008311171561020157600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506106de945050505050565b604080516001600160a01b039092168252519081900360200190f35b6101056004803603602081101561027457600080fd5b50356107ba565b610283610875565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102bd5781810151838201526020016102a5565b50505050905090810190601f1680156102ea5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61013a6004803603602081101561030e57600080fd5b5035610902565b6101056004803603602081101561032b57600080fd5b503561091c565b61033a6109d7565b6040805164ffffffffff199092168252519081900360200190f35b6101056004803603604081101561036b57600080fd5b50803590602001356109e8565b6101056004803603602081101561038e57600080fd5b5035610aa4565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261042b93909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b820191906000526020600020905b81548152906001019060200180831161040457829003601f168201915b50505050506106de565b6001600160a01b0316336001600160a01b03161461047a5760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b6104876002848484610b59565b505050565b60018054604080516020601f6002600019610100878916150201909516949094049384018190048102820181019092528281526104ed93909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b6001600160a01b0316336001600160a01b03161461053c5760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b61054860028383610b75565b5050565b60006105586002610cb7565b64ffffffffff16905090565b60018054604080516020601f6002600019610100878916150201909516949094049384018190048102820181019092528281526105c593909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b6001600160a01b0316336001600160a01b0316146106145760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b61054860028383610ccb565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261068193909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b6001600160a01b0316336001600160a01b0316146106d05760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b6106db600282610dca565b50565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b8381101561073e578181015183820152602001610726565b50505050905090810190601f16801561076b5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561078857600080fd5b505afa15801561079c573d6000803e3d6000fd5b505050506040513d60208110156107b257600080fd5b505192915050565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261081b93909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b6001600160a01b0316336001600160a01b03161461086a5760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b6106db600282610def565b60018054604080516020600284861615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156108fa5780601f106108cf576101008083540402835291602001916108fa565b820191906000526020600020905b8154815290600101906020018083116108dd57829003601f168201915b505050505081565b6000610916600264ffffffffff8416610e15565b92915050565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261097d93909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b6001600160a01b0316336001600160a01b0316146109cc5760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b6106db60028261101e565b60006109e36002611044565b905090565b60018054604080516020601f600260001961010087891615020190951694909404938401819004810282018101909252828152610a4993909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b6001600160a01b0316336001600160a01b031614610a985760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b6105486002838361105b565b60018054604080516020601f600260001961010087891615020190951694909404938401819004810282018101909252828152610b0593909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b6001600160a01b0316336001600160a01b031614610b545760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b600855565b610b64848483610ccb565b610b6f848383610ccb565b50505050565b6000610b8084611083565b9050806000015164ffffffffff168364ffffffffff16108015610bb55750806060015164ffffffffff168364ffffffffff1610155b610bfd576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b6000610c20826040015167ffffffffffffffff16866110e390919063ffffffff16565b90506000610c48836040015160010167ffffffffffffffff16876110e390919063ffffffff16565b9050826080015164ffffffffff168564ffffffffff161015610c8c576040830180516000190167ffffffffffffffff169052606083015164ffffffffff1660808401525b64ffffffffff8516835264ffffffffff1984166020840152610cae8684611103565b50505050505050565b600080610cc383611083565b519392505050565b6000610cd684611083565b90506000610cfb826040015167ffffffffffffffff16866110e390919063ffffffff16565b8054909150610d0957601081555b8054608083015183510364ffffffffff1610610d80578460060154826080015164ffffffffff161015610d785760408201805160010167ffffffffffffffff169081905260808301805164ffffffffff90811660608601528451169052610d719086906110e3565b9050610d80565b805460020281555b608082015182510364ffffffffff9081166000818152600184810160209081526040909220889055855101909216845264ffffffffff19851691840191909152610cae8684611103565b6000610dd583611083565b64ffffffffff19831660208201529050610b6f8382611103565b6000610dfa83611083565b905061048782826020015185610b759092919063ffffffff16565b600080610e2184611083565b805190915064ffffffffff168310610e77576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b6000610e9a826040015167ffffffffffffffff16866110e390919063ffffffff16565b90506000610ec2836040015160010167ffffffffffffffff16876110e390919063ffffffff16565b9050826080015164ffffffffff168510610f4f576080830151825464ffffffffff9091168603908110610f33576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b6000908152600190920160205250604090205491506109169050565b6080830151606084015164ffffffffff9182168781039290911610610fb2576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b8154811115610fff576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b8154036000908152600190910160205260409020549250610916915050565b600061102983611083565b905061048782826020015185610ccb9092919063ffffffff16565b60008061105083611083565b602001519392505050565b600061106684611083565b9050610b6f8383836020015187610b59909392919063ffffffff16565b61108b611162565b5080546001909101546040805160a08101825264ffffffffff808516825264ffffffffff19909416602082015267ffffffffffffffff8316818301529082901c8316606082015260689190911c909116608082015290565b600060028206156110f757826004016110fc565b826002015b9392505050565b80516020820151604080840151606085015160808601518754600096868117969584901b8517606884901b17959094909390929091871461114257868a555b858a60010154146111555760018a018690555b5050505050505092915050565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091529056fe4f564d5f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2063616e206f6e6c792062652063616c6c656420627920746865206f776e65722ea264697066735822122037f5f91f3a7302668798afaeee2c0c2d9aad06dfcc80e263efc2cd8f4842eebe64736f6c63430007060033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100cf5760003560e01c80634651d91e1161008c578063b298e36b11610066578063b298e36b14610315578063ccf8f96914610332578063d41c021814610355578063fa9e936c14610378576100cf565b80634651d91e1461025e5780638da5cb5b1461027b5780639507d39a146102f8576100cf565b806314f22255146100d4578063167fd681146101075780631f7b6d32146101325780632015276c1461014c57806329061de214610177578063461a44781461019c575b600080fd5b610105600480360360608110156100ea57600080fd5b508035906020810135906040013564ffffffffff1916610395565b005b6101056004803603604081101561011d57600080fd5b508035906020013564ffffffffff191661048c565b61013a61054c565b60408051918252519081900360200190f35b6101056004803603604081101561016257600080fd5b508035906020013564ffffffffff1916610564565b6101056004803603602081101561018d57600080fd5b503564ffffffffff1916610620565b610242600480360360208110156101b257600080fd5b8101906020810181356401000000008111156101cd57600080fd5b8201836020820111156101df57600080fd5b8035906020019184600183028401116401000000008311171561020157600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506106de945050505050565b604080516001600160a01b039092168252519081900360200190f35b6101056004803603602081101561027457600080fd5b50356107ba565b610283610875565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102bd5781810151838201526020016102a5565b50505050905090810190601f1680156102ea5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61013a6004803603602081101561030e57600080fd5b5035610902565b6101056004803603602081101561032b57600080fd5b503561091c565b61033a6109d7565b6040805164ffffffffff199092168252519081900360200190f35b6101056004803603604081101561036b57600080fd5b50803590602001356109e8565b6101056004803603602081101561038e57600080fd5b5035610aa4565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261042b93909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b820191906000526020600020905b81548152906001019060200180831161040457829003601f168201915b50505050506106de565b6001600160a01b0316336001600160a01b03161461047a5760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b6104876002848484610b59565b505050565b60018054604080516020601f6002600019610100878916150201909516949094049384018190048102820181019092528281526104ed93909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b6001600160a01b0316336001600160a01b03161461053c5760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b61054860028383610b75565b5050565b60006105586002610cb7565b64ffffffffff16905090565b60018054604080516020601f6002600019610100878916150201909516949094049384018190048102820181019092528281526105c593909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b6001600160a01b0316336001600160a01b0316146106145760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b61054860028383610ccb565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261068193909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b6001600160a01b0316336001600160a01b0316146106d05760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b6106db600282610dca565b50565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b8381101561073e578181015183820152602001610726565b50505050905090810190601f16801561076b5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561078857600080fd5b505afa15801561079c573d6000803e3d6000fd5b505050506040513d60208110156107b257600080fd5b505192915050565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261081b93909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b6001600160a01b0316336001600160a01b03161461086a5760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b6106db600282610def565b60018054604080516020600284861615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156108fa5780601f106108cf576101008083540402835291602001916108fa565b820191906000526020600020905b8154815290600101906020018083116108dd57829003601f168201915b505050505081565b6000610916600264ffffffffff8416610e15565b92915050565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261097d93909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b6001600160a01b0316336001600160a01b0316146109cc5760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b6106db60028261101e565b60006109e36002611044565b905090565b60018054604080516020601f600260001961010087891615020190951694909404938401819004810282018101909252828152610a4993909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b6001600160a01b0316336001600160a01b031614610a985760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b6105486002838361105b565b60018054604080516020601f600260001961010087891615020190951694909404938401819004810282018101909252828152610b0593909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b6001600160a01b0316336001600160a01b031614610b545760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b600855565b610b64848483610ccb565b610b6f848383610ccb565b50505050565b6000610b8084611083565b9050806000015164ffffffffff168364ffffffffff16108015610bb55750806060015164ffffffffff168364ffffffffff1610155b610bfd576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b6000610c20826040015167ffffffffffffffff16866110e390919063ffffffff16565b90506000610c48836040015160010167ffffffffffffffff16876110e390919063ffffffff16565b9050826080015164ffffffffff168564ffffffffff161015610c8c576040830180516000190167ffffffffffffffff169052606083015164ffffffffff1660808401525b64ffffffffff8516835264ffffffffff1984166020840152610cae8684611103565b50505050505050565b600080610cc383611083565b519392505050565b6000610cd684611083565b90506000610cfb826040015167ffffffffffffffff16866110e390919063ffffffff16565b8054909150610d0957601081555b8054608083015183510364ffffffffff1610610d80578460060154826080015164ffffffffff161015610d785760408201805160010167ffffffffffffffff169081905260808301805164ffffffffff90811660608601528451169052610d719086906110e3565b9050610d80565b805460020281555b608082015182510364ffffffffff9081166000818152600184810160209081526040909220889055855101909216845264ffffffffff19851691840191909152610cae8684611103565b6000610dd583611083565b64ffffffffff19831660208201529050610b6f8382611103565b6000610dfa83611083565b905061048782826020015185610b759092919063ffffffff16565b600080610e2184611083565b805190915064ffffffffff168310610e77576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b6000610e9a826040015167ffffffffffffffff16866110e390919063ffffffff16565b90506000610ec2836040015160010167ffffffffffffffff16876110e390919063ffffffff16565b9050826080015164ffffffffff168510610f4f576080830151825464ffffffffff9091168603908110610f33576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b6000908152600190920160205250604090205491506109169050565b6080830151606084015164ffffffffff9182168781039290911610610fb2576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b8154811115610fff576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b8154036000908152600190910160205260409020549250610916915050565b600061102983611083565b905061048782826020015185610ccb9092919063ffffffff16565b60008061105083611083565b602001519392505050565b600061106684611083565b9050610b6f8383836020015187610b59909392919063ffffffff16565b61108b611162565b5080546001909101546040805160a08101825264ffffffffff808516825264ffffffffff19909416602082015267ffffffffffffffff8316818301529082901c8316606082015260689190911c909116608082015290565b600060028206156110f757826004016110fc565b826002015b9392505050565b80516020820151604080840151606085015160808601518754600096868117969584901b8517606884901b17959094909390929091871461114257868a555b858a60010154146111555760018a018690555b5050505050505092915050565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091529056fe4f564d5f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2063616e206f6e6c792062652063616c6c656420627920746865206f776e65722ea264697066735822122037f5f91f3a7302668798afaeee2c0c2d9aad06dfcc80e263efc2cd8f4842eebe64736f6c63430007060033", - "devdoc": { - "kind": "dev", - "methods": { - "constructor": { - "params": { - "_libAddressManager": "Address of the Address Manager.", - "_owner": "Name of the contract that owns this container (will be resolved later)." - } - }, - "deleteElementsAfterInclusive(uint256)": { - "params": { - "_index": "Object index to delete from." - } - }, - "deleteElementsAfterInclusive(uint256,bytes27)": { - "params": { - "_globalMetadata": "New global metadata for the container.", - "_index": "Object index to delete from." - } - }, - "get(uint256)": { - "params": { - "_index": "Index of the particular object to access." - }, - "returns": { - "_0": "32 byte object value." - } - }, - "getGlobalMetadata()": { - "returns": { - "_0": "Container global metadata field." - } - }, - "length()": { - "returns": { - "_0": "Number of objects in the container." - } - }, - "push(bytes32)": { - "params": { - "_object": "A 32 byte value to insert into the container." - } - }, - "push(bytes32,bytes27)": { - "params": { - "_globalMetadata": "New global metadata for the container.", - "_object": "A 32 byte value to insert into the container." - } - }, - "push2(bytes32,bytes32)": { - "params": { - "_objectA": "First 32 byte value to insert into the container.", - "_objectB": "Second 32 byte value to insert into the container." - } - }, - "push2(bytes32,bytes32,bytes27)": { - "params": { - "_globalMetadata": "New global metadata for the container.", - "_objectA": "First 32 byte value to insert into the container.", - "_objectB": "Second 32 byte value to insert into the container." - } - }, - "setGlobalMetadata(bytes27)": { - "params": { - "_globalMetadata": "New global metadata to set." - } - } - }, - "title": "OVM_ChainStorageContainer", - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": { - "deleteElementsAfterInclusive(uint256)": { - "notice": "Removes all objects after and including a given index." - }, - "deleteElementsAfterInclusive(uint256,bytes27)": { - "notice": "Removes all objects after and including a given index. Also allows setting the global metadata field." - }, - "get(uint256)": { - "notice": "Retrieves an object from the container." - }, - "getGlobalMetadata()": { - "notice": "Retrieves the container's global metadata field." - }, - "length()": { - "notice": "Retrieves the number of objects stored in the container." - }, - "push(bytes32)": { - "notice": "Pushes an object into the container." - }, - "push(bytes32,bytes27)": { - "notice": "Pushes an object into the container. Function allows setting the global metadata since we'll need to touch the \"length\" storage slot anyway, which also contains the global metadata (it's an optimization)." - }, - "push2(bytes32,bytes32)": { - "notice": "Pushes two objects into the container at the same time. A useful optimization." - }, - "push2(bytes32,bytes32,bytes27)": { - "notice": "Pushes two objects into the container at the same time. Also allows setting the global metadata field." - }, - "setGlobalMetadata(bytes27)": { - "notice": "Sets the container's global metadata field. We're using `bytes27` here because we use five bytes to maintain the length of the underlying data structure, meaning we have an extra 27 bytes to store arbitrary data." - }, - "setNextOverwritableIndex(uint256)": { - "notice": "Marks an index as overwritable, meaing the underlying buffer can start to write values over any objects before and including the given index." - } - }, - "version": 1 - }, - "storageLayout": { - "storage": [ - { - "astId": 11707, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "libAddressManager", - "offset": 0, - "slot": "0", - "type": "t_contract(Lib_AddressManager)11700" - }, - { - "astId": 2888, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "owner", - "offset": 0, - "slot": "1", - "type": "t_string_storage" - }, - { - "astId": 2890, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "buffer", - "offset": 0, - "slot": "2", - "type": "t_struct(RingBuffer)16365_storage" - } - ], - "types": { - "t_bytes32": { - "encoding": "inplace", - "label": "bytes32", - "numberOfBytes": "32" - }, - "t_contract(Lib_AddressManager)11700": { - "encoding": "inplace", - "label": "contract Lib_AddressManager", - "numberOfBytes": "20" - }, - "t_mapping(t_uint256,t_bytes32)": { - "encoding": "mapping", - "key": "t_uint256", - "label": "mapping(uint256 => bytes32)", - "numberOfBytes": "32", - "value": "t_bytes32" - }, - "t_string_storage": { - "encoding": "bytes", - "label": "string", - "numberOfBytes": "32" - }, - "t_struct(Buffer)16354_storage": { - "encoding": "inplace", - "label": "struct Lib_RingBuffer.Buffer", - "members": [ - { - "astId": 16349, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "length", - "offset": 0, - "slot": "0", - "type": "t_uint256" - }, - { - "astId": 16353, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "buf", - "offset": 0, - "slot": "1", - "type": "t_mapping(t_uint256,t_bytes32)" - } - ], - "numberOfBytes": "64" - }, - "t_struct(RingBuffer)16365_storage": { - "encoding": "inplace", - "label": "struct Lib_RingBuffer.RingBuffer", - "members": [ - { - "astId": 16356, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "contextA", - "offset": 0, - "slot": "0", - "type": "t_bytes32" - }, - { - "astId": 16358, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "contextB", - "offset": 0, - "slot": "1", - "type": "t_bytes32" - }, - { - "astId": 16360, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "bufferA", - "offset": 0, - "slot": "2", - "type": "t_struct(Buffer)16354_storage" - }, - { - "astId": 16362, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "bufferB", - "offset": 0, - "slot": "4", - "type": "t_struct(Buffer)16354_storage" - }, - { - "astId": 16364, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "nextOverwritableIndex", - "offset": 0, - "slot": "6", - "type": "t_uint256" - } - ], - "numberOfBytes": "224" - }, - "t_uint256": { - "encoding": "inplace", - "label": "uint256", - "numberOfBytes": "32" - } - } - } -} \ No newline at end of file diff --git a/packages/contracts/deployments/kovan-v1/OVM_ChainStorageContainer-CTC-queue.json b/packages/contracts/deployments/kovan-v1/OVM_ChainStorageContainer-CTC-queue.json deleted file mode 100644 index 55a0d07ebbf14..0000000000000 --- a/packages/contracts/deployments/kovan-v1/OVM_ChainStorageContainer-CTC-queue.json +++ /dev/null @@ -1,488 +0,0 @@ -{ - "address": "0xFCE31EC2Bc82553FaA4A9a6DF36c9b0DFDAdD4B8", - "abi": [ - { - "inputs": [ - { - "internalType": "address", - "name": "_libAddressManager", - "type": "address" - }, - { - "internalType": "string", - "name": "_owner", - "type": "string" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_index", - "type": "uint256" - }, - { - "internalType": "bytes27", - "name": "_globalMetadata", - "type": "bytes27" - } - ], - "name": "deleteElementsAfterInclusive", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_index", - "type": "uint256" - } - ], - "name": "deleteElementsAfterInclusive", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_index", - "type": "uint256" - } - ], - "name": "get", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getGlobalMetadata", - "outputs": [ - { - "internalType": "bytes27", - "name": "", - "type": "bytes27" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "length", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "owner", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "_object", - "type": "bytes32" - }, - { - "internalType": "bytes27", - "name": "_globalMetadata", - "type": "bytes27" - } - ], - "name": "push", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "_object", - "type": "bytes32" - } - ], - "name": "push", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "_objectA", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "_objectB", - "type": "bytes32" - }, - { - "internalType": "bytes27", - "name": "_globalMetadata", - "type": "bytes27" - } - ], - "name": "push2", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "_objectA", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "_objectB", - "type": "bytes32" - } - ], - "name": "push2", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "string", - "name": "_name", - "type": "string" - } - ], - "name": "resolve", - "outputs": [ - { - "internalType": "address", - "name": "_contract", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes27", - "name": "_globalMetadata", - "type": "bytes27" - } - ], - "name": "setGlobalMetadata", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_index", - "type": "uint256" - } - ], - "name": "setNextOverwritableIndex", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - } - ], - "transactionHash": "0x99b89c2345373c5b66554e90da495293799b15988d76cbddc60ff7ab8e9cb996", - "receipt": { - "to": null, - "from": "0x558ba9b8d78713fbf768c1f8a584485B4003f43F", - "contractAddress": "0xC9DE904214A3496b23E54d7876e4A5CfD4584F49", - "transactionIndex": 0, - "gasUsed": "1103714", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0xc4de8bb6a3be0356605a754b0f0913dc2d1ce2a52dd31480cf90815785cd7e9e", - "transactionHash": "0x99b89c2345373c5b66554e90da495293799b15988d76cbddc60ff7ab8e9cb996", - "logs": [], - "blockNumber": 4573379, - "cumulativeGasUsed": "1103714", - "status": 1, - "byzantium": true - }, - "args": [ - "0x72e6F5244828C10737cbC9659378B207246D26B2", - "OVM_CanonicalTransactionChain" - ], - "solcInputHash": "cebcb515c1a9c570d96e0b8f6fd237e2", - "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_owner\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"get\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getGlobalMetadata\",\"outputs\":[{\"internalType\":\"bytes27\",\"name\":\"\",\"type\":\"bytes27\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"length\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_objectA\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"_objectB\",\"type\":\"bytes32\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"push2\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_objectA\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"_objectB\",\"type\":\"bytes32\"}],\"name\":\"push2\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"_contract\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"setGlobalMetadata\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"setNextOverwritableIndex\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\",\"_owner\":\"Name of the contract that owns this container (will be resolved later).\"}},\"deleteElementsAfterInclusive(uint256)\":{\"params\":{\"_index\":\"Object index to delete from.\"}},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_index\":\"Object index to delete from.\"}},\"get(uint256)\":{\"params\":{\"_index\":\"Index of the particular object to access.\"},\"returns\":{\"_0\":\"32 byte object value.\"}},\"getGlobalMetadata()\":{\"returns\":{\"_0\":\"Container global metadata field.\"}},\"length()\":{\"returns\":{\"_0\":\"Number of objects in the container.\"}},\"push(bytes32)\":{\"params\":{\"_object\":\"A 32 byte value to insert into the container.\"}},\"push(bytes32,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_object\":\"A 32 byte value to insert into the container.\"}},\"push2(bytes32,bytes32)\":{\"params\":{\"_objectA\":\"First 32 byte value to insert into the container.\",\"_objectB\":\"Second 32 byte value to insert into the container.\"}},\"push2(bytes32,bytes32,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_objectA\":\"First 32 byte value to insert into the container.\",\"_objectB\":\"Second 32 byte value to insert into the container.\"}},\"setGlobalMetadata(bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata to set.\"}}},\"title\":\"OVM_ChainStorageContainer\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"deleteElementsAfterInclusive(uint256)\":{\"notice\":\"Removes all objects after and including a given index.\"},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"notice\":\"Removes all objects after and including a given index. Also allows setting the global metadata field.\"},\"get(uint256)\":{\"notice\":\"Retrieves an object from the container.\"},\"getGlobalMetadata()\":{\"notice\":\"Retrieves the container's global metadata field.\"},\"length()\":{\"notice\":\"Retrieves the number of objects stored in the container.\"},\"push(bytes32)\":{\"notice\":\"Pushes an object into the container.\"},\"push(bytes32,bytes27)\":{\"notice\":\"Pushes an object into the container. Function allows setting the global metadata since we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global metadata (it's an optimization).\"},\"push2(bytes32,bytes32)\":{\"notice\":\"Pushes two objects into the container at the same time. A useful optimization.\"},\"push2(bytes32,bytes32,bytes27)\":{\"notice\":\"Pushes two objects into the container at the same time. Also allows setting the global metadata field.\"},\"setGlobalMetadata(bytes27)\":{\"notice\":\"Sets the container's global metadata field. We're using `bytes27` here because we use five bytes to maintain the length of the underlying data structure, meaning we have an extra 27 bytes to store arbitrary data.\"},\"setNextOverwritableIndex(uint256)\":{\"notice\":\"Marks an index as overwritable, meaing the underlying buffer can start to write values over any objects before and including the given index.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol\":\"OVM_ChainStorageContainer\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol\":{\"content\":\"pragma solidity ^0.7.0;\\n\\n/* Library Imports */\\nimport { Lib_RingBuffer } from \\\"../../libraries/utils/Lib_RingBuffer.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_ChainStorageContainer } from \\\"../../iOVM/chain/iOVM_ChainStorageContainer.sol\\\";\\n\\n/**\\n * @title OVM_ChainStorageContainer\\n */\\ncontract OVM_ChainStorageContainer is iOVM_ChainStorageContainer, Lib_AddressResolver {\\n\\n /*************\\n * Libraries *\\n *************/\\n\\n using Lib_RingBuffer for Lib_RingBuffer.RingBuffer;\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n string public owner;\\n Lib_RingBuffer.RingBuffer internal buffer;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n \\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n * @param _owner Name of the contract that owns this container (will be resolved later).\\n */\\n constructor(\\n address _libAddressManager,\\n string memory _owner\\n )\\n Lib_AddressResolver(_libAddressManager)\\n {\\n owner = _owner;\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n \\n modifier onlyOwner() {\\n require(\\n msg.sender == resolve(owner),\\n \\\"OVM_ChainStorageContainer: Function can only be called by the owner.\\\"\\n );\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function setGlobalMetadata(\\n bytes27 _globalMetadata\\n )\\n override\\n public\\n onlyOwner\\n {\\n return buffer.setExtraData(_globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function getGlobalMetadata()\\n override\\n public\\n view\\n returns (\\n bytes27\\n )\\n {\\n return buffer.getExtraData();\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function length()\\n override\\n public\\n view\\n returns (\\n uint256\\n )\\n {\\n return uint256(buffer.getLength());\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function push(\\n bytes32 _object\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.push(_object);\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function push(\\n bytes32 _object,\\n bytes27 _globalMetadata\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.push(_object, _globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function push2(\\n bytes32 _objectA,\\n bytes32 _objectB\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.push2(_objectA, _objectB);\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function push2(\\n bytes32 _objectA,\\n bytes32 _objectB,\\n bytes27 _globalMetadata\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.push2(_objectA, _objectB, _globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function get(\\n uint256 _index\\n )\\n override\\n public\\n view\\n returns (\\n bytes32\\n )\\n {\\n return buffer.get(uint40(_index));\\n }\\n \\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.deleteElementsAfterInclusive(\\n uint40(_index)\\n );\\n }\\n \\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index,\\n bytes27 _globalMetadata\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.deleteElementsAfterInclusive(\\n uint40(_index),\\n _globalMetadata\\n );\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function setNextOverwritableIndex(\\n uint256 _index\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.nextOverwritableIndex = _index;\\n }\\n}\\n\",\"keccak256\":\"0xc722e9528988810bd754002dfe3923bc9ac9252c1d981c4803fd5053603bfb11\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_ChainStorageContainer.sol\":{\"content\":\"pragma solidity ^0.7.0;\\n\\n/**\\n * @title iOVM_ChainStorageContainer\\n */\\ninterface iOVM_ChainStorageContainer {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata()\\n external\\n view\\n returns (\\n bytes27\\n );\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length()\\n external\\n view\\n returns (\\n uint256\\n );\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(\\n bytes32 _object\\n )\\n external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(\\n bytes32 _object,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Pushes two objects into the container at the same time. A useful optimization.\\n * @param _objectA First 32 byte value to insert into the container.\\n * @param _objectB Second 32 byte value to insert into the container.\\n */\\n function push2(\\n bytes32 _objectA,\\n bytes32 _objectB\\n )\\n external;\\n\\n /**\\n * Pushes two objects into the container at the same time. Also allows setting the global\\n * metadata field.\\n * @param _objectA First 32 byte value to insert into the container.\\n * @param _objectB Second 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push2(\\n bytes32 _objectA,\\n bytes32 _objectB,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(\\n uint256 _index\\n )\\n external\\n view\\n returns (\\n bytes32\\n );\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index\\n )\\n external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Marks an index as overwritable, meaing the underlying buffer can start to write values over\\n * any objects before and including the given index.\\n */\\n function setNextOverwritableIndex(\\n uint256 _index\\n )\\n external;\\n}\\n\",\"keccak256\":\"0xcfca7da85b35d94c27581c2460b0d48fd0cc51fa72670cc7a2f7f760fb21a2f0\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// +build ovm\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Contract Imports */\\nimport { Ownable } from \\\"./Lib_Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n /*******************************************\\n * Contract Variables: Internal Accounting *\\n *******************************************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n public\\n onlyOwner\\n {\\n emit AddressSet(_name, _address);\\n addresses[_getNameHash(_name)] = _address;\\n }\\n\\n function getAddress(\\n string memory _name\\n )\\n public\\n view\\n returns (address)\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32 _hash\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xdf802e1cc6474df913626991e9fca3835c620a519f397afe04bf9c260e723257\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// +build ovm\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\ncontract Lib_AddressResolver {\\n\\n /*******************************************\\n * Contract Variables: Contract References *\\n *******************************************/\\n\\n Lib_AddressManager internal libAddressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(\\n address _libAddressManager\\n ) public {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function resolve(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address _contract\\n )\\n {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0xf3b9d78b309ddeec259ce3e0e1cfdef3ca40938e9a81971b28ce2b8ea327f533\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// +build ovm\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Ownable\\n * @dev Adapted from https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol\\n */\\nabstract contract Ownable {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n address public owner;\\n\\n\\n /**********\\n * Events *\\n **********/\\n\\n event OwnershipTransferred(\\n address indexed previousOwner,\\n address indexed newOwner\\n );\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n constructor() internal {\\n owner = msg.sender;\\n emit OwnershipTransferred(address(0), owner);\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n owner == msg.sender,\\n \\\"Ownable: caller is not the owner\\\"\\n );\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function renounceOwnership()\\n public\\n virtual\\n onlyOwner\\n {\\n emit OwnershipTransferred(owner, address(0));\\n owner = address(0);\\n }\\n\\n function transferOwnership(address _newOwner)\\n public\\n virtual\\n onlyOwner\\n {\\n require(\\n _newOwner != address(0),\\n \\\"Ownable: new owner cannot be the zero address\\\"\\n );\\n\\n emit OwnershipTransferred(owner, _newOwner);\\n owner = _newOwner;\\n }\\n}\\n\",\"keccak256\":\"0xe0409fbd236d16ca6be439d9d97dd36d0d9a0697ee0062d49588b9d29c248e47\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_RingBuffer.sol\":{\"content\":\"pragma solidity ^0.7.0;\\n\\nlibrary Lib_RingBuffer {\\n using Lib_RingBuffer for RingBuffer;\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Buffer {\\n uint256 length;\\n mapping (uint256 => bytes32) buf;\\n }\\n\\n struct RingBuffer {\\n bytes32 contextA;\\n bytes32 contextB;\\n Buffer bufferA;\\n Buffer bufferB;\\n uint256 nextOverwritableIndex;\\n }\\n\\n struct RingBufferContext {\\n // contextA\\n uint40 globalIndex;\\n bytes27 extraData;\\n\\n // contextB\\n uint64 currBufferIndex;\\n uint40 prevResetIndex;\\n uint40 currResetIndex;\\n }\\n\\n\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 constant MIN_CAPACITY = 16;\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n * @param _extraData Optional global extra data.\\n */\\n function push(\\n RingBuffer storage _self,\\n bytes32 _value,\\n bytes27 _extraData\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n Buffer storage currBuffer = _self.getBuffer(ctx.currBufferIndex);\\n\\n // Set a minimum capacity.\\n if (currBuffer.length == 0) {\\n currBuffer.length = MIN_CAPACITY;\\n }\\n\\n // Check if we need to expand the buffer.\\n if (ctx.globalIndex - ctx.currResetIndex >= currBuffer.length) {\\n if (ctx.currResetIndex < _self.nextOverwritableIndex) {\\n // We're going to overwrite the inactive buffer.\\n // Bump the buffer index, reset the delete offset, and set our reset indices.\\n ctx.currBufferIndex++;\\n ctx.prevResetIndex = ctx.currResetIndex;\\n ctx.currResetIndex = ctx.globalIndex;\\n\\n // Swap over to the next buffer.\\n currBuffer = _self.getBuffer(ctx.currBufferIndex);\\n } else {\\n // We're not overwriting yet, double the length of the current buffer.\\n currBuffer.length *= 2;\\n }\\n }\\n\\n // Index to write to is the difference of the global and reset indices.\\n uint256 writeHead = ctx.globalIndex - ctx.currResetIndex;\\n currBuffer.buf[writeHead] = _value;\\n\\n // Bump the global index and insert our extra data, then save the context.\\n ctx.globalIndex++;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n */\\n function push(\\n RingBuffer storage _self,\\n bytes32 _value\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n \\n _self.push(\\n _value,\\n ctx.extraData\\n );\\n }\\n\\n /**\\n * Pushes a two elements to the buffer.\\n * @param _self Buffer to access.\\n * @param _valueA First value to push to the buffer.\\n * @param _valueA Second value to push to the buffer.\\n * @param _extraData Optional global extra data.\\n */\\n function push2(\\n RingBuffer storage _self,\\n bytes32 _valueA,\\n bytes32 _valueB,\\n bytes27 _extraData\\n )\\n internal\\n {\\n _self.push(_valueA, _extraData);\\n _self.push(_valueB, _extraData);\\n }\\n\\n /**\\n * Pushes a two elements to the buffer.\\n * @param _self Buffer to access.\\n * @param _valueA First value to push to the buffer.\\n * @param _valueA Second value to push to the buffer.\\n */\\n function push2(\\n RingBuffer storage _self,\\n bytes32 _valueA,\\n bytes32 _valueB\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n\\n _self.push2(\\n _valueA,\\n _valueB,\\n ctx.extraData\\n );\\n }\\n\\n /**\\n * Retrieves an element from the buffer.\\n * @param _self Buffer to access.\\n * @param _index Element index to retrieve.\\n * @return Value of the element at the given index.\\n */\\n function get(\\n RingBuffer storage _self,\\n uint256 _index\\n )\\n internal\\n view\\n returns (\\n bytes32 \\n )\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n\\n require(\\n _index < ctx.globalIndex,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n Buffer storage currBuffer = _self.getBuffer(ctx.currBufferIndex);\\n Buffer storage prevBuffer = _self.getBuffer(ctx.currBufferIndex + 1);\\n\\n if (_index >= ctx.currResetIndex) {\\n // We're trying to load an element from the current buffer.\\n // Relative index is just the difference from the reset index.\\n uint256 relativeIndex = _index - ctx.currResetIndex;\\n\\n // Shouldn't happen but why not check.\\n require(\\n relativeIndex < currBuffer.length,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n return currBuffer.buf[relativeIndex];\\n } else {\\n // We're trying to load an element from the previous buffer.\\n // Relative index is the difference from the reset index in the other direction.\\n uint256 relativeIndex = ctx.currResetIndex - _index;\\n\\n // Condition only fails in the case that we deleted and flipped buffers.\\n require(\\n ctx.currResetIndex > ctx.prevResetIndex,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n // Make sure we're not trying to read beyond the array.\\n require(\\n relativeIndex <= prevBuffer.length,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n return prevBuffer.buf[prevBuffer.length - relativeIndex];\\n }\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n * @param _extraData Optional global extra data.\\n */\\n function deleteElementsAfterInclusive(\\n RingBuffer storage _self,\\n uint40 _index,\\n bytes27 _extraData\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n\\n require(\\n _index < ctx.globalIndex && _index >= ctx.prevResetIndex,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n Buffer storage currBuffer = _self.getBuffer(ctx.currBufferIndex);\\n Buffer storage prevBuffer = _self.getBuffer(ctx.currBufferIndex + 1);\\n\\n if (_index < ctx.currResetIndex) {\\n // We're switching back to the previous buffer.\\n // Reduce the buffer index, set the current reset index back to match the previous one.\\n // We use the equality of these two values to prevent reading beyond this buffer.\\n ctx.currBufferIndex--;\\n ctx.currResetIndex = ctx.prevResetIndex;\\n }\\n\\n // Set our global index and extra data, save the context.\\n ctx.globalIndex = _index;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n */\\n function deleteElementsAfterInclusive(\\n RingBuffer storage _self,\\n uint40 _index\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n _self.deleteElementsAfterInclusive(\\n _index,\\n ctx.extraData\\n );\\n }\\n\\n /**\\n * Retrieves the current global index.\\n * @param _self Buffer to access.\\n * @return Current global index.\\n */\\n function getLength(\\n RingBuffer storage _self\\n )\\n internal\\n view\\n returns (\\n uint40\\n )\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n return ctx.globalIndex;\\n }\\n\\n /**\\n * Changes current global extra data.\\n * @param _self Buffer to access.\\n * @param _extraData New global extra data.\\n */\\n function setExtraData(\\n RingBuffer storage _self,\\n bytes27 _extraData\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Retrieves the current global extra data.\\n * @param _self Buffer to access.\\n * @return Current global extra data.\\n */\\n function getExtraData(\\n RingBuffer storage _self\\n )\\n internal\\n view\\n returns (\\n bytes27\\n )\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n return ctx.extraData;\\n }\\n\\n /**\\n * Sets the current ring buffer context.\\n * @param _self Buffer to access.\\n * @param _ctx Current ring buffer context.\\n */\\n function setContext(\\n RingBuffer storage _self,\\n RingBufferContext memory _ctx\\n )\\n internal\\n returns (\\n bytes32\\n )\\n {\\n bytes32 contextA;\\n bytes32 contextB;\\n\\n uint40 globalIndex = _ctx.globalIndex;\\n bytes27 extraData = _ctx.extraData;\\n assembly {\\n contextA := globalIndex\\n contextA := or(contextA, extraData)\\n }\\n\\n uint64 currBufferIndex = _ctx.currBufferIndex;\\n uint40 prevResetIndex = _ctx.prevResetIndex;\\n uint40 currResetIndex = _ctx.currResetIndex;\\n assembly {\\n contextB := currBufferIndex\\n contextB := or(contextB, shl(64, prevResetIndex))\\n contextB := or(contextB, shl(104, currResetIndex))\\n }\\n\\n if (_self.contextA != contextA) {\\n _self.contextA = contextA;\\n }\\n\\n if (_self.contextB != contextB) {\\n _self.contextB = contextB;\\n }\\n }\\n\\n /**\\n * Retrieves the current ring buffer context.\\n * @param _self Buffer to access.\\n * @return Current ring buffer context.\\n */\\n function getContext(\\n RingBuffer storage _self\\n )\\n internal\\n view\\n returns (\\n RingBufferContext memory\\n )\\n {\\n bytes32 contextA = _self.contextA;\\n bytes32 contextB = _self.contextB;\\n\\n uint40 globalIndex;\\n bytes27 extraData;\\n assembly {\\n globalIndex := and(contextA, 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF)\\n extraData := and(contextA, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000)\\n }\\n\\n uint64 currBufferIndex;\\n uint40 prevResetIndex;\\n uint40 currResetIndex;\\n assembly {\\n currBufferIndex := and(contextB, 0x000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF)\\n prevResetIndex := shr(64, and(contextB, 0x00000000000000000000000000000000000000FFFFFFFFFF0000000000000000))\\n currResetIndex := shr(104, and(contextB, 0x0000000000000000000000000000FFFFFFFFFF00000000000000000000000000))\\n }\\n\\n return RingBufferContext({\\n globalIndex: globalIndex,\\n extraData: extraData,\\n currBufferIndex: currBufferIndex,\\n prevResetIndex: prevResetIndex,\\n currResetIndex: currResetIndex\\n });\\n }\\n\\n /**\\n * Retrieves the a buffer from the ring buffer by index.\\n * @param _self Buffer to access.\\n * @param _which Index of the sub buffer to access.\\n * @return Sub buffer for the index.\\n */\\n function getBuffer(\\n RingBuffer storage _self,\\n uint256 _which\\n )\\n internal\\n view\\n returns (\\n Buffer storage\\n )\\n {\\n return _which % 2 == 0 ? _self.bufferA : _self.bufferB;\\n }\\n}\\n\",\"keccak256\":\"0x0c4bb53aba64441b2ec26e7a13de8f04f104bb654e550ccc30db500cac33d2a3\"}},\"version\":1}", - "bytecode": "0x60806040523480156200001157600080fd5b50604051620013f3380380620013f3833981810160405260408110156200003757600080fd5b8151602083018051604051929492938301929190846401000000008211156200005f57600080fd5b9083019060208201858111156200007557600080fd5b82516401000000008111828201881017156200009057600080fd5b82525081516020918201929091019080838360005b83811015620000bf578181015183820152602001620000a5565b50505050905090810190601f168015620000ed5780820380516001836020036101000a031916815260200191505b506040525050600080546001600160a01b0319166001600160a01b038516179055508051620001249060019060208401906200012d565b505050620001d9565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282620001655760008555620001b0565b82601f106200018057805160ff1916838001178555620001b0565b82800160010185558215620001b0579182015b82811115620001b057825182559160200191906001019062000193565b50620001be929150620001c2565b5090565b5b80821115620001be5760008155600101620001c3565b61120a80620001e96000396000f3fe608060405234801561001057600080fd5b50600436106100cf5760003560e01c80634651d91e1161008c578063b298e36b11610066578063b298e36b14610315578063ccf8f96914610332578063d41c021814610355578063fa9e936c14610378576100cf565b80634651d91e1461025e5780638da5cb5b1461027b5780639507d39a146102f8576100cf565b806314f22255146100d4578063167fd681146101075780631f7b6d32146101325780632015276c1461014c57806329061de214610177578063461a44781461019c575b600080fd5b610105600480360360608110156100ea57600080fd5b508035906020810135906040013564ffffffffff1916610395565b005b6101056004803603604081101561011d57600080fd5b508035906020013564ffffffffff191661048c565b61013a61054c565b60408051918252519081900360200190f35b6101056004803603604081101561016257600080fd5b508035906020013564ffffffffff1916610564565b6101056004803603602081101561018d57600080fd5b503564ffffffffff1916610620565b610242600480360360208110156101b257600080fd5b8101906020810181356401000000008111156101cd57600080fd5b8201836020820111156101df57600080fd5b8035906020019184600183028401116401000000008311171561020157600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506106de945050505050565b604080516001600160a01b039092168252519081900360200190f35b6101056004803603602081101561027457600080fd5b50356107ba565b610283610875565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102bd5781810151838201526020016102a5565b50505050905090810190601f1680156102ea5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61013a6004803603602081101561030e57600080fd5b5035610902565b6101056004803603602081101561032b57600080fd5b503561091c565b61033a6109d7565b6040805164ffffffffff199092168252519081900360200190f35b6101056004803603604081101561036b57600080fd5b50803590602001356109e8565b6101056004803603602081101561038e57600080fd5b5035610aa4565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261042b93909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b820191906000526020600020905b81548152906001019060200180831161040457829003601f168201915b50505050506106de565b6001600160a01b0316336001600160a01b03161461047a5760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b6104876002848484610b59565b505050565b60018054604080516020601f6002600019610100878916150201909516949094049384018190048102820181019092528281526104ed93909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b6001600160a01b0316336001600160a01b03161461053c5760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b61054860028383610b75565b5050565b60006105586002610cb7565b64ffffffffff16905090565b60018054604080516020601f6002600019610100878916150201909516949094049384018190048102820181019092528281526105c593909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b6001600160a01b0316336001600160a01b0316146106145760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b61054860028383610ccb565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261068193909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b6001600160a01b0316336001600160a01b0316146106d05760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b6106db600282610dca565b50565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b8381101561073e578181015183820152602001610726565b50505050905090810190601f16801561076b5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561078857600080fd5b505afa15801561079c573d6000803e3d6000fd5b505050506040513d60208110156107b257600080fd5b505192915050565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261081b93909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b6001600160a01b0316336001600160a01b03161461086a5760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b6106db600282610def565b60018054604080516020600284861615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156108fa5780601f106108cf576101008083540402835291602001916108fa565b820191906000526020600020905b8154815290600101906020018083116108dd57829003601f168201915b505050505081565b6000610916600264ffffffffff8416610e15565b92915050565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261097d93909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b6001600160a01b0316336001600160a01b0316146109cc5760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b6106db60028261101e565b60006109e36002611044565b905090565b60018054604080516020601f600260001961010087891615020190951694909404938401819004810282018101909252828152610a4993909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b6001600160a01b0316336001600160a01b031614610a985760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b6105486002838361105b565b60018054604080516020601f600260001961010087891615020190951694909404938401819004810282018101909252828152610b0593909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b6001600160a01b0316336001600160a01b031614610b545760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b600855565b610b64848483610ccb565b610b6f848383610ccb565b50505050565b6000610b8084611083565b9050806000015164ffffffffff168364ffffffffff16108015610bb55750806060015164ffffffffff168364ffffffffff1610155b610bfd576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b6000610c20826040015167ffffffffffffffff16866110e390919063ffffffff16565b90506000610c48836040015160010167ffffffffffffffff16876110e390919063ffffffff16565b9050826080015164ffffffffff168564ffffffffff161015610c8c576040830180516000190167ffffffffffffffff169052606083015164ffffffffff1660808401525b64ffffffffff8516835264ffffffffff1984166020840152610cae8684611103565b50505050505050565b600080610cc383611083565b519392505050565b6000610cd684611083565b90506000610cfb826040015167ffffffffffffffff16866110e390919063ffffffff16565b8054909150610d0957601081555b8054608083015183510364ffffffffff1610610d80578460060154826080015164ffffffffff161015610d785760408201805160010167ffffffffffffffff169081905260808301805164ffffffffff90811660608601528451169052610d719086906110e3565b9050610d80565b805460020281555b608082015182510364ffffffffff9081166000818152600184810160209081526040909220889055855101909216845264ffffffffff19851691840191909152610cae8684611103565b6000610dd583611083565b64ffffffffff19831660208201529050610b6f8382611103565b6000610dfa83611083565b905061048782826020015185610b759092919063ffffffff16565b600080610e2184611083565b805190915064ffffffffff168310610e77576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b6000610e9a826040015167ffffffffffffffff16866110e390919063ffffffff16565b90506000610ec2836040015160010167ffffffffffffffff16876110e390919063ffffffff16565b9050826080015164ffffffffff168510610f4f576080830151825464ffffffffff9091168603908110610f33576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b6000908152600190920160205250604090205491506109169050565b6080830151606084015164ffffffffff9182168781039290911610610fb2576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b8154811115610fff576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b8154036000908152600190910160205260409020549250610916915050565b600061102983611083565b905061048782826020015185610ccb9092919063ffffffff16565b60008061105083611083565b602001519392505050565b600061106684611083565b9050610b6f8383836020015187610b59909392919063ffffffff16565b61108b611162565b5080546001909101546040805160a08101825264ffffffffff808516825264ffffffffff19909416602082015267ffffffffffffffff8316818301529082901c8316606082015260689190911c909116608082015290565b600060028206156110f757826004016110fc565b826002015b9392505050565b80516020820151604080840151606085015160808601518754600096868117969584901b8517606884901b17959094909390929091871461114257868a555b858a60010154146111555760018a018690555b5050505050505092915050565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091529056fe4f564d5f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2063616e206f6e6c792062652063616c6c656420627920746865206f776e65722ea264697066735822122037f5f91f3a7302668798afaeee2c0c2d9aad06dfcc80e263efc2cd8f4842eebe64736f6c63430007060033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100cf5760003560e01c80634651d91e1161008c578063b298e36b11610066578063b298e36b14610315578063ccf8f96914610332578063d41c021814610355578063fa9e936c14610378576100cf565b80634651d91e1461025e5780638da5cb5b1461027b5780639507d39a146102f8576100cf565b806314f22255146100d4578063167fd681146101075780631f7b6d32146101325780632015276c1461014c57806329061de214610177578063461a44781461019c575b600080fd5b610105600480360360608110156100ea57600080fd5b508035906020810135906040013564ffffffffff1916610395565b005b6101056004803603604081101561011d57600080fd5b508035906020013564ffffffffff191661048c565b61013a61054c565b60408051918252519081900360200190f35b6101056004803603604081101561016257600080fd5b508035906020013564ffffffffff1916610564565b6101056004803603602081101561018d57600080fd5b503564ffffffffff1916610620565b610242600480360360208110156101b257600080fd5b8101906020810181356401000000008111156101cd57600080fd5b8201836020820111156101df57600080fd5b8035906020019184600183028401116401000000008311171561020157600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506106de945050505050565b604080516001600160a01b039092168252519081900360200190f35b6101056004803603602081101561027457600080fd5b50356107ba565b610283610875565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102bd5781810151838201526020016102a5565b50505050905090810190601f1680156102ea5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61013a6004803603602081101561030e57600080fd5b5035610902565b6101056004803603602081101561032b57600080fd5b503561091c565b61033a6109d7565b6040805164ffffffffff199092168252519081900360200190f35b6101056004803603604081101561036b57600080fd5b50803590602001356109e8565b6101056004803603602081101561038e57600080fd5b5035610aa4565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261042b93909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b820191906000526020600020905b81548152906001019060200180831161040457829003601f168201915b50505050506106de565b6001600160a01b0316336001600160a01b03161461047a5760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b6104876002848484610b59565b505050565b60018054604080516020601f6002600019610100878916150201909516949094049384018190048102820181019092528281526104ed93909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b6001600160a01b0316336001600160a01b03161461053c5760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b61054860028383610b75565b5050565b60006105586002610cb7565b64ffffffffff16905090565b60018054604080516020601f6002600019610100878916150201909516949094049384018190048102820181019092528281526105c593909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b6001600160a01b0316336001600160a01b0316146106145760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b61054860028383610ccb565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261068193909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b6001600160a01b0316336001600160a01b0316146106d05760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b6106db600282610dca565b50565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b8381101561073e578181015183820152602001610726565b50505050905090810190601f16801561076b5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561078857600080fd5b505afa15801561079c573d6000803e3d6000fd5b505050506040513d60208110156107b257600080fd5b505192915050565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261081b93909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b6001600160a01b0316336001600160a01b03161461086a5760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b6106db600282610def565b60018054604080516020600284861615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156108fa5780601f106108cf576101008083540402835291602001916108fa565b820191906000526020600020905b8154815290600101906020018083116108dd57829003601f168201915b505050505081565b6000610916600264ffffffffff8416610e15565b92915050565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261097d93909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b6001600160a01b0316336001600160a01b0316146109cc5760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b6106db60028261101e565b60006109e36002611044565b905090565b60018054604080516020601f600260001961010087891615020190951694909404938401819004810282018101909252828152610a4993909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b6001600160a01b0316336001600160a01b031614610a985760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b6105486002838361105b565b60018054604080516020601f600260001961010087891615020190951694909404938401819004810282018101909252828152610b0593909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b6001600160a01b0316336001600160a01b031614610b545760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b600855565b610b64848483610ccb565b610b6f848383610ccb565b50505050565b6000610b8084611083565b9050806000015164ffffffffff168364ffffffffff16108015610bb55750806060015164ffffffffff168364ffffffffff1610155b610bfd576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b6000610c20826040015167ffffffffffffffff16866110e390919063ffffffff16565b90506000610c48836040015160010167ffffffffffffffff16876110e390919063ffffffff16565b9050826080015164ffffffffff168564ffffffffff161015610c8c576040830180516000190167ffffffffffffffff169052606083015164ffffffffff1660808401525b64ffffffffff8516835264ffffffffff1984166020840152610cae8684611103565b50505050505050565b600080610cc383611083565b519392505050565b6000610cd684611083565b90506000610cfb826040015167ffffffffffffffff16866110e390919063ffffffff16565b8054909150610d0957601081555b8054608083015183510364ffffffffff1610610d80578460060154826080015164ffffffffff161015610d785760408201805160010167ffffffffffffffff169081905260808301805164ffffffffff90811660608601528451169052610d719086906110e3565b9050610d80565b805460020281555b608082015182510364ffffffffff9081166000818152600184810160209081526040909220889055855101909216845264ffffffffff19851691840191909152610cae8684611103565b6000610dd583611083565b64ffffffffff19831660208201529050610b6f8382611103565b6000610dfa83611083565b905061048782826020015185610b759092919063ffffffff16565b600080610e2184611083565b805190915064ffffffffff168310610e77576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b6000610e9a826040015167ffffffffffffffff16866110e390919063ffffffff16565b90506000610ec2836040015160010167ffffffffffffffff16876110e390919063ffffffff16565b9050826080015164ffffffffff168510610f4f576080830151825464ffffffffff9091168603908110610f33576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b6000908152600190920160205250604090205491506109169050565b6080830151606084015164ffffffffff9182168781039290911610610fb2576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b8154811115610fff576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b8154036000908152600190910160205260409020549250610916915050565b600061102983611083565b905061048782826020015185610ccb9092919063ffffffff16565b60008061105083611083565b602001519392505050565b600061106684611083565b9050610b6f8383836020015187610b59909392919063ffffffff16565b61108b611162565b5080546001909101546040805160a08101825264ffffffffff808516825264ffffffffff19909416602082015267ffffffffffffffff8316818301529082901c8316606082015260689190911c909116608082015290565b600060028206156110f757826004016110fc565b826002015b9392505050565b80516020820151604080840151606085015160808601518754600096868117969584901b8517606884901b17959094909390929091871461114257868a555b858a60010154146111555760018a018690555b5050505050505092915050565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091529056fe4f564d5f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2063616e206f6e6c792062652063616c6c656420627920746865206f776e65722ea264697066735822122037f5f91f3a7302668798afaeee2c0c2d9aad06dfcc80e263efc2cd8f4842eebe64736f6c63430007060033", - "devdoc": { - "kind": "dev", - "methods": { - "constructor": { - "params": { - "_libAddressManager": "Address of the Address Manager.", - "_owner": "Name of the contract that owns this container (will be resolved later)." - } - }, - "deleteElementsAfterInclusive(uint256)": { - "params": { - "_index": "Object index to delete from." - } - }, - "deleteElementsAfterInclusive(uint256,bytes27)": { - "params": { - "_globalMetadata": "New global metadata for the container.", - "_index": "Object index to delete from." - } - }, - "get(uint256)": { - "params": { - "_index": "Index of the particular object to access." - }, - "returns": { - "_0": "32 byte object value." - } - }, - "getGlobalMetadata()": { - "returns": { - "_0": "Container global metadata field." - } - }, - "length()": { - "returns": { - "_0": "Number of objects in the container." - } - }, - "push(bytes32)": { - "params": { - "_object": "A 32 byte value to insert into the container." - } - }, - "push(bytes32,bytes27)": { - "params": { - "_globalMetadata": "New global metadata for the container.", - "_object": "A 32 byte value to insert into the container." - } - }, - "push2(bytes32,bytes32)": { - "params": { - "_objectA": "First 32 byte value to insert into the container.", - "_objectB": "Second 32 byte value to insert into the container." - } - }, - "push2(bytes32,bytes32,bytes27)": { - "params": { - "_globalMetadata": "New global metadata for the container.", - "_objectA": "First 32 byte value to insert into the container.", - "_objectB": "Second 32 byte value to insert into the container." - } - }, - "setGlobalMetadata(bytes27)": { - "params": { - "_globalMetadata": "New global metadata to set." - } - } - }, - "title": "OVM_ChainStorageContainer", - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": { - "deleteElementsAfterInclusive(uint256)": { - "notice": "Removes all objects after and including a given index." - }, - "deleteElementsAfterInclusive(uint256,bytes27)": { - "notice": "Removes all objects after and including a given index. Also allows setting the global metadata field." - }, - "get(uint256)": { - "notice": "Retrieves an object from the container." - }, - "getGlobalMetadata()": { - "notice": "Retrieves the container's global metadata field." - }, - "length()": { - "notice": "Retrieves the number of objects stored in the container." - }, - "push(bytes32)": { - "notice": "Pushes an object into the container." - }, - "push(bytes32,bytes27)": { - "notice": "Pushes an object into the container. Function allows setting the global metadata since we'll need to touch the \"length\" storage slot anyway, which also contains the global metadata (it's an optimization)." - }, - "push2(bytes32,bytes32)": { - "notice": "Pushes two objects into the container at the same time. A useful optimization." - }, - "push2(bytes32,bytes32,bytes27)": { - "notice": "Pushes two objects into the container at the same time. Also allows setting the global metadata field." - }, - "setGlobalMetadata(bytes27)": { - "notice": "Sets the container's global metadata field. We're using `bytes27` here because we use five bytes to maintain the length of the underlying data structure, meaning we have an extra 27 bytes to store arbitrary data." - }, - "setNextOverwritableIndex(uint256)": { - "notice": "Marks an index as overwritable, meaing the underlying buffer can start to write values over any objects before and including the given index." - } - }, - "version": 1 - }, - "storageLayout": { - "storage": [ - { - "astId": 11707, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "libAddressManager", - "offset": 0, - "slot": "0", - "type": "t_contract(Lib_AddressManager)11700" - }, - { - "astId": 2888, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "owner", - "offset": 0, - "slot": "1", - "type": "t_string_storage" - }, - { - "astId": 2890, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "buffer", - "offset": 0, - "slot": "2", - "type": "t_struct(RingBuffer)16365_storage" - } - ], - "types": { - "t_bytes32": { - "encoding": "inplace", - "label": "bytes32", - "numberOfBytes": "32" - }, - "t_contract(Lib_AddressManager)11700": { - "encoding": "inplace", - "label": "contract Lib_AddressManager", - "numberOfBytes": "20" - }, - "t_mapping(t_uint256,t_bytes32)": { - "encoding": "mapping", - "key": "t_uint256", - "label": "mapping(uint256 => bytes32)", - "numberOfBytes": "32", - "value": "t_bytes32" - }, - "t_string_storage": { - "encoding": "bytes", - "label": "string", - "numberOfBytes": "32" - }, - "t_struct(Buffer)16354_storage": { - "encoding": "inplace", - "label": "struct Lib_RingBuffer.Buffer", - "members": [ - { - "astId": 16349, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "length", - "offset": 0, - "slot": "0", - "type": "t_uint256" - }, - { - "astId": 16353, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "buf", - "offset": 0, - "slot": "1", - "type": "t_mapping(t_uint256,t_bytes32)" - } - ], - "numberOfBytes": "64" - }, - "t_struct(RingBuffer)16365_storage": { - "encoding": "inplace", - "label": "struct Lib_RingBuffer.RingBuffer", - "members": [ - { - "astId": 16356, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "contextA", - "offset": 0, - "slot": "0", - "type": "t_bytes32" - }, - { - "astId": 16358, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "contextB", - "offset": 0, - "slot": "1", - "type": "t_bytes32" - }, - { - "astId": 16360, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "bufferA", - "offset": 0, - "slot": "2", - "type": "t_struct(Buffer)16354_storage" - }, - { - "astId": 16362, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "bufferB", - "offset": 0, - "slot": "4", - "type": "t_struct(Buffer)16354_storage" - }, - { - "astId": 16364, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "nextOverwritableIndex", - "offset": 0, - "slot": "6", - "type": "t_uint256" - } - ], - "numberOfBytes": "224" - }, - "t_uint256": { - "encoding": "inplace", - "label": "uint256", - "numberOfBytes": "32" - } - } - } -} \ No newline at end of file diff --git a/packages/contracts/deployments/kovan-v1/OVM_ChainStorageContainer-SCC-batches.json b/packages/contracts/deployments/kovan-v1/OVM_ChainStorageContainer-SCC-batches.json deleted file mode 100644 index 559df89333245..0000000000000 --- a/packages/contracts/deployments/kovan-v1/OVM_ChainStorageContainer-SCC-batches.json +++ /dev/null @@ -1,488 +0,0 @@ -{ - "address": "0xcFf7ed66bC3C1eA64c6394FEBb2408D16c6cBC5E", - "abi": [ - { - "inputs": [ - { - "internalType": "address", - "name": "_libAddressManager", - "type": "address" - }, - { - "internalType": "string", - "name": "_owner", - "type": "string" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_index", - "type": "uint256" - }, - { - "internalType": "bytes27", - "name": "_globalMetadata", - "type": "bytes27" - } - ], - "name": "deleteElementsAfterInclusive", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_index", - "type": "uint256" - } - ], - "name": "deleteElementsAfterInclusive", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_index", - "type": "uint256" - } - ], - "name": "get", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getGlobalMetadata", - "outputs": [ - { - "internalType": "bytes27", - "name": "", - "type": "bytes27" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "length", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "owner", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "_object", - "type": "bytes32" - }, - { - "internalType": "bytes27", - "name": "_globalMetadata", - "type": "bytes27" - } - ], - "name": "push", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "_object", - "type": "bytes32" - } - ], - "name": "push", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "_objectA", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "_objectB", - "type": "bytes32" - }, - { - "internalType": "bytes27", - "name": "_globalMetadata", - "type": "bytes27" - } - ], - "name": "push2", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "_objectA", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "_objectB", - "type": "bytes32" - } - ], - "name": "push2", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "string", - "name": "_name", - "type": "string" - } - ], - "name": "resolve", - "outputs": [ - { - "internalType": "address", - "name": "_contract", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes27", - "name": "_globalMetadata", - "type": "bytes27" - } - ], - "name": "setGlobalMetadata", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_index", - "type": "uint256" - } - ], - "name": "setNextOverwritableIndex", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - } - ], - "transactionHash": "0x5168f58ec0e907689b4729909da455ae3f39f09f6808faafde219c910e6ef404", - "receipt": { - "to": null, - "from": "0x558ba9b8d78713fbf768c1f8a584485B4003f43F", - "contractAddress": "0x02A1e0C8d29Bf76989F18D56cd502Eba0AC0D212", - "transactionIndex": 1, - "gasUsed": "1103654", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0x0a7b99f8dfb069836b98855e10f4febe0718604be13cfe614132e592cf0a134e", - "transactionHash": "0x5168f58ec0e907689b4729909da455ae3f39f09f6808faafde219c910e6ef404", - "logs": [], - "blockNumber": 4573381, - "cumulativeGasUsed": "1128075", - "status": 1, - "byzantium": true - }, - "args": [ - "0x72e6F5244828C10737cbC9659378B207246D26B2", - "OVM_StateCommitmentChain" - ], - "solcInputHash": "cebcb515c1a9c570d96e0b8f6fd237e2", - "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_owner\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"get\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getGlobalMetadata\",\"outputs\":[{\"internalType\":\"bytes27\",\"name\":\"\",\"type\":\"bytes27\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"length\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_objectA\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"_objectB\",\"type\":\"bytes32\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"push2\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_objectA\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"_objectB\",\"type\":\"bytes32\"}],\"name\":\"push2\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"_contract\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"setGlobalMetadata\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"setNextOverwritableIndex\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\",\"_owner\":\"Name of the contract that owns this container (will be resolved later).\"}},\"deleteElementsAfterInclusive(uint256)\":{\"params\":{\"_index\":\"Object index to delete from.\"}},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_index\":\"Object index to delete from.\"}},\"get(uint256)\":{\"params\":{\"_index\":\"Index of the particular object to access.\"},\"returns\":{\"_0\":\"32 byte object value.\"}},\"getGlobalMetadata()\":{\"returns\":{\"_0\":\"Container global metadata field.\"}},\"length()\":{\"returns\":{\"_0\":\"Number of objects in the container.\"}},\"push(bytes32)\":{\"params\":{\"_object\":\"A 32 byte value to insert into the container.\"}},\"push(bytes32,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_object\":\"A 32 byte value to insert into the container.\"}},\"push2(bytes32,bytes32)\":{\"params\":{\"_objectA\":\"First 32 byte value to insert into the container.\",\"_objectB\":\"Second 32 byte value to insert into the container.\"}},\"push2(bytes32,bytes32,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_objectA\":\"First 32 byte value to insert into the container.\",\"_objectB\":\"Second 32 byte value to insert into the container.\"}},\"setGlobalMetadata(bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata to set.\"}}},\"title\":\"OVM_ChainStorageContainer\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"deleteElementsAfterInclusive(uint256)\":{\"notice\":\"Removes all objects after and including a given index.\"},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"notice\":\"Removes all objects after and including a given index. Also allows setting the global metadata field.\"},\"get(uint256)\":{\"notice\":\"Retrieves an object from the container.\"},\"getGlobalMetadata()\":{\"notice\":\"Retrieves the container's global metadata field.\"},\"length()\":{\"notice\":\"Retrieves the number of objects stored in the container.\"},\"push(bytes32)\":{\"notice\":\"Pushes an object into the container.\"},\"push(bytes32,bytes27)\":{\"notice\":\"Pushes an object into the container. Function allows setting the global metadata since we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global metadata (it's an optimization).\"},\"push2(bytes32,bytes32)\":{\"notice\":\"Pushes two objects into the container at the same time. A useful optimization.\"},\"push2(bytes32,bytes32,bytes27)\":{\"notice\":\"Pushes two objects into the container at the same time. Also allows setting the global metadata field.\"},\"setGlobalMetadata(bytes27)\":{\"notice\":\"Sets the container's global metadata field. We're using `bytes27` here because we use five bytes to maintain the length of the underlying data structure, meaning we have an extra 27 bytes to store arbitrary data.\"},\"setNextOverwritableIndex(uint256)\":{\"notice\":\"Marks an index as overwritable, meaing the underlying buffer can start to write values over any objects before and including the given index.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol\":\"OVM_ChainStorageContainer\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol\":{\"content\":\"pragma solidity ^0.7.0;\\n\\n/* Library Imports */\\nimport { Lib_RingBuffer } from \\\"../../libraries/utils/Lib_RingBuffer.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_ChainStorageContainer } from \\\"../../iOVM/chain/iOVM_ChainStorageContainer.sol\\\";\\n\\n/**\\n * @title OVM_ChainStorageContainer\\n */\\ncontract OVM_ChainStorageContainer is iOVM_ChainStorageContainer, Lib_AddressResolver {\\n\\n /*************\\n * Libraries *\\n *************/\\n\\n using Lib_RingBuffer for Lib_RingBuffer.RingBuffer;\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n string public owner;\\n Lib_RingBuffer.RingBuffer internal buffer;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n \\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n * @param _owner Name of the contract that owns this container (will be resolved later).\\n */\\n constructor(\\n address _libAddressManager,\\n string memory _owner\\n )\\n Lib_AddressResolver(_libAddressManager)\\n {\\n owner = _owner;\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n \\n modifier onlyOwner() {\\n require(\\n msg.sender == resolve(owner),\\n \\\"OVM_ChainStorageContainer: Function can only be called by the owner.\\\"\\n );\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function setGlobalMetadata(\\n bytes27 _globalMetadata\\n )\\n override\\n public\\n onlyOwner\\n {\\n return buffer.setExtraData(_globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function getGlobalMetadata()\\n override\\n public\\n view\\n returns (\\n bytes27\\n )\\n {\\n return buffer.getExtraData();\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function length()\\n override\\n public\\n view\\n returns (\\n uint256\\n )\\n {\\n return uint256(buffer.getLength());\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function push(\\n bytes32 _object\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.push(_object);\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function push(\\n bytes32 _object,\\n bytes27 _globalMetadata\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.push(_object, _globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function push2(\\n bytes32 _objectA,\\n bytes32 _objectB\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.push2(_objectA, _objectB);\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function push2(\\n bytes32 _objectA,\\n bytes32 _objectB,\\n bytes27 _globalMetadata\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.push2(_objectA, _objectB, _globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function get(\\n uint256 _index\\n )\\n override\\n public\\n view\\n returns (\\n bytes32\\n )\\n {\\n return buffer.get(uint40(_index));\\n }\\n \\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.deleteElementsAfterInclusive(\\n uint40(_index)\\n );\\n }\\n \\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index,\\n bytes27 _globalMetadata\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.deleteElementsAfterInclusive(\\n uint40(_index),\\n _globalMetadata\\n );\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function setNextOverwritableIndex(\\n uint256 _index\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.nextOverwritableIndex = _index;\\n }\\n}\\n\",\"keccak256\":\"0xc722e9528988810bd754002dfe3923bc9ac9252c1d981c4803fd5053603bfb11\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_ChainStorageContainer.sol\":{\"content\":\"pragma solidity ^0.7.0;\\n\\n/**\\n * @title iOVM_ChainStorageContainer\\n */\\ninterface iOVM_ChainStorageContainer {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata()\\n external\\n view\\n returns (\\n bytes27\\n );\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length()\\n external\\n view\\n returns (\\n uint256\\n );\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(\\n bytes32 _object\\n )\\n external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(\\n bytes32 _object,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Pushes two objects into the container at the same time. A useful optimization.\\n * @param _objectA First 32 byte value to insert into the container.\\n * @param _objectB Second 32 byte value to insert into the container.\\n */\\n function push2(\\n bytes32 _objectA,\\n bytes32 _objectB\\n )\\n external;\\n\\n /**\\n * Pushes two objects into the container at the same time. Also allows setting the global\\n * metadata field.\\n * @param _objectA First 32 byte value to insert into the container.\\n * @param _objectB Second 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push2(\\n bytes32 _objectA,\\n bytes32 _objectB,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(\\n uint256 _index\\n )\\n external\\n view\\n returns (\\n bytes32\\n );\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index\\n )\\n external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Marks an index as overwritable, meaing the underlying buffer can start to write values over\\n * any objects before and including the given index.\\n */\\n function setNextOverwritableIndex(\\n uint256 _index\\n )\\n external;\\n}\\n\",\"keccak256\":\"0xcfca7da85b35d94c27581c2460b0d48fd0cc51fa72670cc7a2f7f760fb21a2f0\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// +build ovm\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Contract Imports */\\nimport { Ownable } from \\\"./Lib_Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n /*******************************************\\n * Contract Variables: Internal Accounting *\\n *******************************************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n public\\n onlyOwner\\n {\\n emit AddressSet(_name, _address);\\n addresses[_getNameHash(_name)] = _address;\\n }\\n\\n function getAddress(\\n string memory _name\\n )\\n public\\n view\\n returns (address)\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32 _hash\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xdf802e1cc6474df913626991e9fca3835c620a519f397afe04bf9c260e723257\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// +build ovm\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\ncontract Lib_AddressResolver {\\n\\n /*******************************************\\n * Contract Variables: Contract References *\\n *******************************************/\\n\\n Lib_AddressManager internal libAddressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(\\n address _libAddressManager\\n ) public {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function resolve(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address _contract\\n )\\n {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0xf3b9d78b309ddeec259ce3e0e1cfdef3ca40938e9a81971b28ce2b8ea327f533\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// +build ovm\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Ownable\\n * @dev Adapted from https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol\\n */\\nabstract contract Ownable {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n address public owner;\\n\\n\\n /**********\\n * Events *\\n **********/\\n\\n event OwnershipTransferred(\\n address indexed previousOwner,\\n address indexed newOwner\\n );\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n constructor() internal {\\n owner = msg.sender;\\n emit OwnershipTransferred(address(0), owner);\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n owner == msg.sender,\\n \\\"Ownable: caller is not the owner\\\"\\n );\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function renounceOwnership()\\n public\\n virtual\\n onlyOwner\\n {\\n emit OwnershipTransferred(owner, address(0));\\n owner = address(0);\\n }\\n\\n function transferOwnership(address _newOwner)\\n public\\n virtual\\n onlyOwner\\n {\\n require(\\n _newOwner != address(0),\\n \\\"Ownable: new owner cannot be the zero address\\\"\\n );\\n\\n emit OwnershipTransferred(owner, _newOwner);\\n owner = _newOwner;\\n }\\n}\\n\",\"keccak256\":\"0xe0409fbd236d16ca6be439d9d97dd36d0d9a0697ee0062d49588b9d29c248e47\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_RingBuffer.sol\":{\"content\":\"pragma solidity ^0.7.0;\\n\\nlibrary Lib_RingBuffer {\\n using Lib_RingBuffer for RingBuffer;\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Buffer {\\n uint256 length;\\n mapping (uint256 => bytes32) buf;\\n }\\n\\n struct RingBuffer {\\n bytes32 contextA;\\n bytes32 contextB;\\n Buffer bufferA;\\n Buffer bufferB;\\n uint256 nextOverwritableIndex;\\n }\\n\\n struct RingBufferContext {\\n // contextA\\n uint40 globalIndex;\\n bytes27 extraData;\\n\\n // contextB\\n uint64 currBufferIndex;\\n uint40 prevResetIndex;\\n uint40 currResetIndex;\\n }\\n\\n\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 constant MIN_CAPACITY = 16;\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n * @param _extraData Optional global extra data.\\n */\\n function push(\\n RingBuffer storage _self,\\n bytes32 _value,\\n bytes27 _extraData\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n Buffer storage currBuffer = _self.getBuffer(ctx.currBufferIndex);\\n\\n // Set a minimum capacity.\\n if (currBuffer.length == 0) {\\n currBuffer.length = MIN_CAPACITY;\\n }\\n\\n // Check if we need to expand the buffer.\\n if (ctx.globalIndex - ctx.currResetIndex >= currBuffer.length) {\\n if (ctx.currResetIndex < _self.nextOverwritableIndex) {\\n // We're going to overwrite the inactive buffer.\\n // Bump the buffer index, reset the delete offset, and set our reset indices.\\n ctx.currBufferIndex++;\\n ctx.prevResetIndex = ctx.currResetIndex;\\n ctx.currResetIndex = ctx.globalIndex;\\n\\n // Swap over to the next buffer.\\n currBuffer = _self.getBuffer(ctx.currBufferIndex);\\n } else {\\n // We're not overwriting yet, double the length of the current buffer.\\n currBuffer.length *= 2;\\n }\\n }\\n\\n // Index to write to is the difference of the global and reset indices.\\n uint256 writeHead = ctx.globalIndex - ctx.currResetIndex;\\n currBuffer.buf[writeHead] = _value;\\n\\n // Bump the global index and insert our extra data, then save the context.\\n ctx.globalIndex++;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n */\\n function push(\\n RingBuffer storage _self,\\n bytes32 _value\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n \\n _self.push(\\n _value,\\n ctx.extraData\\n );\\n }\\n\\n /**\\n * Pushes a two elements to the buffer.\\n * @param _self Buffer to access.\\n * @param _valueA First value to push to the buffer.\\n * @param _valueA Second value to push to the buffer.\\n * @param _extraData Optional global extra data.\\n */\\n function push2(\\n RingBuffer storage _self,\\n bytes32 _valueA,\\n bytes32 _valueB,\\n bytes27 _extraData\\n )\\n internal\\n {\\n _self.push(_valueA, _extraData);\\n _self.push(_valueB, _extraData);\\n }\\n\\n /**\\n * Pushes a two elements to the buffer.\\n * @param _self Buffer to access.\\n * @param _valueA First value to push to the buffer.\\n * @param _valueA Second value to push to the buffer.\\n */\\n function push2(\\n RingBuffer storage _self,\\n bytes32 _valueA,\\n bytes32 _valueB\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n\\n _self.push2(\\n _valueA,\\n _valueB,\\n ctx.extraData\\n );\\n }\\n\\n /**\\n * Retrieves an element from the buffer.\\n * @param _self Buffer to access.\\n * @param _index Element index to retrieve.\\n * @return Value of the element at the given index.\\n */\\n function get(\\n RingBuffer storage _self,\\n uint256 _index\\n )\\n internal\\n view\\n returns (\\n bytes32 \\n )\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n\\n require(\\n _index < ctx.globalIndex,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n Buffer storage currBuffer = _self.getBuffer(ctx.currBufferIndex);\\n Buffer storage prevBuffer = _self.getBuffer(ctx.currBufferIndex + 1);\\n\\n if (_index >= ctx.currResetIndex) {\\n // We're trying to load an element from the current buffer.\\n // Relative index is just the difference from the reset index.\\n uint256 relativeIndex = _index - ctx.currResetIndex;\\n\\n // Shouldn't happen but why not check.\\n require(\\n relativeIndex < currBuffer.length,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n return currBuffer.buf[relativeIndex];\\n } else {\\n // We're trying to load an element from the previous buffer.\\n // Relative index is the difference from the reset index in the other direction.\\n uint256 relativeIndex = ctx.currResetIndex - _index;\\n\\n // Condition only fails in the case that we deleted and flipped buffers.\\n require(\\n ctx.currResetIndex > ctx.prevResetIndex,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n // Make sure we're not trying to read beyond the array.\\n require(\\n relativeIndex <= prevBuffer.length,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n return prevBuffer.buf[prevBuffer.length - relativeIndex];\\n }\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n * @param _extraData Optional global extra data.\\n */\\n function deleteElementsAfterInclusive(\\n RingBuffer storage _self,\\n uint40 _index,\\n bytes27 _extraData\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n\\n require(\\n _index < ctx.globalIndex && _index >= ctx.prevResetIndex,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n Buffer storage currBuffer = _self.getBuffer(ctx.currBufferIndex);\\n Buffer storage prevBuffer = _self.getBuffer(ctx.currBufferIndex + 1);\\n\\n if (_index < ctx.currResetIndex) {\\n // We're switching back to the previous buffer.\\n // Reduce the buffer index, set the current reset index back to match the previous one.\\n // We use the equality of these two values to prevent reading beyond this buffer.\\n ctx.currBufferIndex--;\\n ctx.currResetIndex = ctx.prevResetIndex;\\n }\\n\\n // Set our global index and extra data, save the context.\\n ctx.globalIndex = _index;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n */\\n function deleteElementsAfterInclusive(\\n RingBuffer storage _self,\\n uint40 _index\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n _self.deleteElementsAfterInclusive(\\n _index,\\n ctx.extraData\\n );\\n }\\n\\n /**\\n * Retrieves the current global index.\\n * @param _self Buffer to access.\\n * @return Current global index.\\n */\\n function getLength(\\n RingBuffer storage _self\\n )\\n internal\\n view\\n returns (\\n uint40\\n )\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n return ctx.globalIndex;\\n }\\n\\n /**\\n * Changes current global extra data.\\n * @param _self Buffer to access.\\n * @param _extraData New global extra data.\\n */\\n function setExtraData(\\n RingBuffer storage _self,\\n bytes27 _extraData\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Retrieves the current global extra data.\\n * @param _self Buffer to access.\\n * @return Current global extra data.\\n */\\n function getExtraData(\\n RingBuffer storage _self\\n )\\n internal\\n view\\n returns (\\n bytes27\\n )\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n return ctx.extraData;\\n }\\n\\n /**\\n * Sets the current ring buffer context.\\n * @param _self Buffer to access.\\n * @param _ctx Current ring buffer context.\\n */\\n function setContext(\\n RingBuffer storage _self,\\n RingBufferContext memory _ctx\\n )\\n internal\\n returns (\\n bytes32\\n )\\n {\\n bytes32 contextA;\\n bytes32 contextB;\\n\\n uint40 globalIndex = _ctx.globalIndex;\\n bytes27 extraData = _ctx.extraData;\\n assembly {\\n contextA := globalIndex\\n contextA := or(contextA, extraData)\\n }\\n\\n uint64 currBufferIndex = _ctx.currBufferIndex;\\n uint40 prevResetIndex = _ctx.prevResetIndex;\\n uint40 currResetIndex = _ctx.currResetIndex;\\n assembly {\\n contextB := currBufferIndex\\n contextB := or(contextB, shl(64, prevResetIndex))\\n contextB := or(contextB, shl(104, currResetIndex))\\n }\\n\\n if (_self.contextA != contextA) {\\n _self.contextA = contextA;\\n }\\n\\n if (_self.contextB != contextB) {\\n _self.contextB = contextB;\\n }\\n }\\n\\n /**\\n * Retrieves the current ring buffer context.\\n * @param _self Buffer to access.\\n * @return Current ring buffer context.\\n */\\n function getContext(\\n RingBuffer storage _self\\n )\\n internal\\n view\\n returns (\\n RingBufferContext memory\\n )\\n {\\n bytes32 contextA = _self.contextA;\\n bytes32 contextB = _self.contextB;\\n\\n uint40 globalIndex;\\n bytes27 extraData;\\n assembly {\\n globalIndex := and(contextA, 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF)\\n extraData := and(contextA, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000)\\n }\\n\\n uint64 currBufferIndex;\\n uint40 prevResetIndex;\\n uint40 currResetIndex;\\n assembly {\\n currBufferIndex := and(contextB, 0x000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF)\\n prevResetIndex := shr(64, and(contextB, 0x00000000000000000000000000000000000000FFFFFFFFFF0000000000000000))\\n currResetIndex := shr(104, and(contextB, 0x0000000000000000000000000000FFFFFFFFFF00000000000000000000000000))\\n }\\n\\n return RingBufferContext({\\n globalIndex: globalIndex,\\n extraData: extraData,\\n currBufferIndex: currBufferIndex,\\n prevResetIndex: prevResetIndex,\\n currResetIndex: currResetIndex\\n });\\n }\\n\\n /**\\n * Retrieves the a buffer from the ring buffer by index.\\n * @param _self Buffer to access.\\n * @param _which Index of the sub buffer to access.\\n * @return Sub buffer for the index.\\n */\\n function getBuffer(\\n RingBuffer storage _self,\\n uint256 _which\\n )\\n internal\\n view\\n returns (\\n Buffer storage\\n )\\n {\\n return _which % 2 == 0 ? _self.bufferA : _self.bufferB;\\n }\\n}\\n\",\"keccak256\":\"0x0c4bb53aba64441b2ec26e7a13de8f04f104bb654e550ccc30db500cac33d2a3\"}},\"version\":1}", - "bytecode": "0x60806040523480156200001157600080fd5b50604051620013f3380380620013f3833981810160405260408110156200003757600080fd5b8151602083018051604051929492938301929190846401000000008211156200005f57600080fd5b9083019060208201858111156200007557600080fd5b82516401000000008111828201881017156200009057600080fd5b82525081516020918201929091019080838360005b83811015620000bf578181015183820152602001620000a5565b50505050905090810190601f168015620000ed5780820380516001836020036101000a031916815260200191505b506040525050600080546001600160a01b0319166001600160a01b038516179055508051620001249060019060208401906200012d565b505050620001d9565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282620001655760008555620001b0565b82601f106200018057805160ff1916838001178555620001b0565b82800160010185558215620001b0579182015b82811115620001b057825182559160200191906001019062000193565b50620001be929150620001c2565b5090565b5b80821115620001be5760008155600101620001c3565b61120a80620001e96000396000f3fe608060405234801561001057600080fd5b50600436106100cf5760003560e01c80634651d91e1161008c578063b298e36b11610066578063b298e36b14610315578063ccf8f96914610332578063d41c021814610355578063fa9e936c14610378576100cf565b80634651d91e1461025e5780638da5cb5b1461027b5780639507d39a146102f8576100cf565b806314f22255146100d4578063167fd681146101075780631f7b6d32146101325780632015276c1461014c57806329061de214610177578063461a44781461019c575b600080fd5b610105600480360360608110156100ea57600080fd5b508035906020810135906040013564ffffffffff1916610395565b005b6101056004803603604081101561011d57600080fd5b508035906020013564ffffffffff191661048c565b61013a61054c565b60408051918252519081900360200190f35b6101056004803603604081101561016257600080fd5b508035906020013564ffffffffff1916610564565b6101056004803603602081101561018d57600080fd5b503564ffffffffff1916610620565b610242600480360360208110156101b257600080fd5b8101906020810181356401000000008111156101cd57600080fd5b8201836020820111156101df57600080fd5b8035906020019184600183028401116401000000008311171561020157600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506106de945050505050565b604080516001600160a01b039092168252519081900360200190f35b6101056004803603602081101561027457600080fd5b50356107ba565b610283610875565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102bd5781810151838201526020016102a5565b50505050905090810190601f1680156102ea5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61013a6004803603602081101561030e57600080fd5b5035610902565b6101056004803603602081101561032b57600080fd5b503561091c565b61033a6109d7565b6040805164ffffffffff199092168252519081900360200190f35b6101056004803603604081101561036b57600080fd5b50803590602001356109e8565b6101056004803603602081101561038e57600080fd5b5035610aa4565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261042b93909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b820191906000526020600020905b81548152906001019060200180831161040457829003601f168201915b50505050506106de565b6001600160a01b0316336001600160a01b03161461047a5760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b6104876002848484610b59565b505050565b60018054604080516020601f6002600019610100878916150201909516949094049384018190048102820181019092528281526104ed93909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b6001600160a01b0316336001600160a01b03161461053c5760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b61054860028383610b75565b5050565b60006105586002610cb7565b64ffffffffff16905090565b60018054604080516020601f6002600019610100878916150201909516949094049384018190048102820181019092528281526105c593909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b6001600160a01b0316336001600160a01b0316146106145760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b61054860028383610ccb565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261068193909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b6001600160a01b0316336001600160a01b0316146106d05760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b6106db600282610dca565b50565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b8381101561073e578181015183820152602001610726565b50505050905090810190601f16801561076b5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561078857600080fd5b505afa15801561079c573d6000803e3d6000fd5b505050506040513d60208110156107b257600080fd5b505192915050565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261081b93909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b6001600160a01b0316336001600160a01b03161461086a5760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b6106db600282610def565b60018054604080516020600284861615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156108fa5780601f106108cf576101008083540402835291602001916108fa565b820191906000526020600020905b8154815290600101906020018083116108dd57829003601f168201915b505050505081565b6000610916600264ffffffffff8416610e15565b92915050565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261097d93909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b6001600160a01b0316336001600160a01b0316146109cc5760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b6106db60028261101e565b60006109e36002611044565b905090565b60018054604080516020601f600260001961010087891615020190951694909404938401819004810282018101909252828152610a4993909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b6001600160a01b0316336001600160a01b031614610a985760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b6105486002838361105b565b60018054604080516020601f600260001961010087891615020190951694909404938401819004810282018101909252828152610b0593909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b6001600160a01b0316336001600160a01b031614610b545760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b600855565b610b64848483610ccb565b610b6f848383610ccb565b50505050565b6000610b8084611083565b9050806000015164ffffffffff168364ffffffffff16108015610bb55750806060015164ffffffffff168364ffffffffff1610155b610bfd576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b6000610c20826040015167ffffffffffffffff16866110e390919063ffffffff16565b90506000610c48836040015160010167ffffffffffffffff16876110e390919063ffffffff16565b9050826080015164ffffffffff168564ffffffffff161015610c8c576040830180516000190167ffffffffffffffff169052606083015164ffffffffff1660808401525b64ffffffffff8516835264ffffffffff1984166020840152610cae8684611103565b50505050505050565b600080610cc383611083565b519392505050565b6000610cd684611083565b90506000610cfb826040015167ffffffffffffffff16866110e390919063ffffffff16565b8054909150610d0957601081555b8054608083015183510364ffffffffff1610610d80578460060154826080015164ffffffffff161015610d785760408201805160010167ffffffffffffffff169081905260808301805164ffffffffff90811660608601528451169052610d719086906110e3565b9050610d80565b805460020281555b608082015182510364ffffffffff9081166000818152600184810160209081526040909220889055855101909216845264ffffffffff19851691840191909152610cae8684611103565b6000610dd583611083565b64ffffffffff19831660208201529050610b6f8382611103565b6000610dfa83611083565b905061048782826020015185610b759092919063ffffffff16565b600080610e2184611083565b805190915064ffffffffff168310610e77576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b6000610e9a826040015167ffffffffffffffff16866110e390919063ffffffff16565b90506000610ec2836040015160010167ffffffffffffffff16876110e390919063ffffffff16565b9050826080015164ffffffffff168510610f4f576080830151825464ffffffffff9091168603908110610f33576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b6000908152600190920160205250604090205491506109169050565b6080830151606084015164ffffffffff9182168781039290911610610fb2576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b8154811115610fff576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b8154036000908152600190910160205260409020549250610916915050565b600061102983611083565b905061048782826020015185610ccb9092919063ffffffff16565b60008061105083611083565b602001519392505050565b600061106684611083565b9050610b6f8383836020015187610b59909392919063ffffffff16565b61108b611162565b5080546001909101546040805160a08101825264ffffffffff808516825264ffffffffff19909416602082015267ffffffffffffffff8316818301529082901c8316606082015260689190911c909116608082015290565b600060028206156110f757826004016110fc565b826002015b9392505050565b80516020820151604080840151606085015160808601518754600096868117969584901b8517606884901b17959094909390929091871461114257868a555b858a60010154146111555760018a018690555b5050505050505092915050565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091529056fe4f564d5f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2063616e206f6e6c792062652063616c6c656420627920746865206f776e65722ea264697066735822122037f5f91f3a7302668798afaeee2c0c2d9aad06dfcc80e263efc2cd8f4842eebe64736f6c63430007060033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100cf5760003560e01c80634651d91e1161008c578063b298e36b11610066578063b298e36b14610315578063ccf8f96914610332578063d41c021814610355578063fa9e936c14610378576100cf565b80634651d91e1461025e5780638da5cb5b1461027b5780639507d39a146102f8576100cf565b806314f22255146100d4578063167fd681146101075780631f7b6d32146101325780632015276c1461014c57806329061de214610177578063461a44781461019c575b600080fd5b610105600480360360608110156100ea57600080fd5b508035906020810135906040013564ffffffffff1916610395565b005b6101056004803603604081101561011d57600080fd5b508035906020013564ffffffffff191661048c565b61013a61054c565b60408051918252519081900360200190f35b6101056004803603604081101561016257600080fd5b508035906020013564ffffffffff1916610564565b6101056004803603602081101561018d57600080fd5b503564ffffffffff1916610620565b610242600480360360208110156101b257600080fd5b8101906020810181356401000000008111156101cd57600080fd5b8201836020820111156101df57600080fd5b8035906020019184600183028401116401000000008311171561020157600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506106de945050505050565b604080516001600160a01b039092168252519081900360200190f35b6101056004803603602081101561027457600080fd5b50356107ba565b610283610875565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102bd5781810151838201526020016102a5565b50505050905090810190601f1680156102ea5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61013a6004803603602081101561030e57600080fd5b5035610902565b6101056004803603602081101561032b57600080fd5b503561091c565b61033a6109d7565b6040805164ffffffffff199092168252519081900360200190f35b6101056004803603604081101561036b57600080fd5b50803590602001356109e8565b6101056004803603602081101561038e57600080fd5b5035610aa4565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261042b93909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b820191906000526020600020905b81548152906001019060200180831161040457829003601f168201915b50505050506106de565b6001600160a01b0316336001600160a01b03161461047a5760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b6104876002848484610b59565b505050565b60018054604080516020601f6002600019610100878916150201909516949094049384018190048102820181019092528281526104ed93909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b6001600160a01b0316336001600160a01b03161461053c5760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b61054860028383610b75565b5050565b60006105586002610cb7565b64ffffffffff16905090565b60018054604080516020601f6002600019610100878916150201909516949094049384018190048102820181019092528281526105c593909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b6001600160a01b0316336001600160a01b0316146106145760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b61054860028383610ccb565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261068193909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b6001600160a01b0316336001600160a01b0316146106d05760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b6106db600282610dca565b50565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b8381101561073e578181015183820152602001610726565b50505050905090810190601f16801561076b5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561078857600080fd5b505afa15801561079c573d6000803e3d6000fd5b505050506040513d60208110156107b257600080fd5b505192915050565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261081b93909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b6001600160a01b0316336001600160a01b03161461086a5760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b6106db600282610def565b60018054604080516020600284861615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156108fa5780601f106108cf576101008083540402835291602001916108fa565b820191906000526020600020905b8154815290600101906020018083116108dd57829003601f168201915b505050505081565b6000610916600264ffffffffff8416610e15565b92915050565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261097d93909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b6001600160a01b0316336001600160a01b0316146109cc5760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b6106db60028261101e565b60006109e36002611044565b905090565b60018054604080516020601f600260001961010087891615020190951694909404938401819004810282018101909252828152610a4993909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b6001600160a01b0316336001600160a01b031614610a985760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b6105486002838361105b565b60018054604080516020601f600260001961010087891615020190951694909404938401819004810282018101909252828152610b0593909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b6001600160a01b0316336001600160a01b031614610b545760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b600855565b610b64848483610ccb565b610b6f848383610ccb565b50505050565b6000610b8084611083565b9050806000015164ffffffffff168364ffffffffff16108015610bb55750806060015164ffffffffff168364ffffffffff1610155b610bfd576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b6000610c20826040015167ffffffffffffffff16866110e390919063ffffffff16565b90506000610c48836040015160010167ffffffffffffffff16876110e390919063ffffffff16565b9050826080015164ffffffffff168564ffffffffff161015610c8c576040830180516000190167ffffffffffffffff169052606083015164ffffffffff1660808401525b64ffffffffff8516835264ffffffffff1984166020840152610cae8684611103565b50505050505050565b600080610cc383611083565b519392505050565b6000610cd684611083565b90506000610cfb826040015167ffffffffffffffff16866110e390919063ffffffff16565b8054909150610d0957601081555b8054608083015183510364ffffffffff1610610d80578460060154826080015164ffffffffff161015610d785760408201805160010167ffffffffffffffff169081905260808301805164ffffffffff90811660608601528451169052610d719086906110e3565b9050610d80565b805460020281555b608082015182510364ffffffffff9081166000818152600184810160209081526040909220889055855101909216845264ffffffffff19851691840191909152610cae8684611103565b6000610dd583611083565b64ffffffffff19831660208201529050610b6f8382611103565b6000610dfa83611083565b905061048782826020015185610b759092919063ffffffff16565b600080610e2184611083565b805190915064ffffffffff168310610e77576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b6000610e9a826040015167ffffffffffffffff16866110e390919063ffffffff16565b90506000610ec2836040015160010167ffffffffffffffff16876110e390919063ffffffff16565b9050826080015164ffffffffff168510610f4f576080830151825464ffffffffff9091168603908110610f33576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b6000908152600190920160205250604090205491506109169050565b6080830151606084015164ffffffffff9182168781039290911610610fb2576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b8154811115610fff576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b8154036000908152600190910160205260409020549250610916915050565b600061102983611083565b905061048782826020015185610ccb9092919063ffffffff16565b60008061105083611083565b602001519392505050565b600061106684611083565b9050610b6f8383836020015187610b59909392919063ffffffff16565b61108b611162565b5080546001909101546040805160a08101825264ffffffffff808516825264ffffffffff19909416602082015267ffffffffffffffff8316818301529082901c8316606082015260689190911c909116608082015290565b600060028206156110f757826004016110fc565b826002015b9392505050565b80516020820151604080840151606085015160808601518754600096868117969584901b8517606884901b17959094909390929091871461114257868a555b858a60010154146111555760018a018690555b5050505050505092915050565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091529056fe4f564d5f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2063616e206f6e6c792062652063616c6c656420627920746865206f776e65722ea264697066735822122037f5f91f3a7302668798afaeee2c0c2d9aad06dfcc80e263efc2cd8f4842eebe64736f6c63430007060033", - "devdoc": { - "kind": "dev", - "methods": { - "constructor": { - "params": { - "_libAddressManager": "Address of the Address Manager.", - "_owner": "Name of the contract that owns this container (will be resolved later)." - } - }, - "deleteElementsAfterInclusive(uint256)": { - "params": { - "_index": "Object index to delete from." - } - }, - "deleteElementsAfterInclusive(uint256,bytes27)": { - "params": { - "_globalMetadata": "New global metadata for the container.", - "_index": "Object index to delete from." - } - }, - "get(uint256)": { - "params": { - "_index": "Index of the particular object to access." - }, - "returns": { - "_0": "32 byte object value." - } - }, - "getGlobalMetadata()": { - "returns": { - "_0": "Container global metadata field." - } - }, - "length()": { - "returns": { - "_0": "Number of objects in the container." - } - }, - "push(bytes32)": { - "params": { - "_object": "A 32 byte value to insert into the container." - } - }, - "push(bytes32,bytes27)": { - "params": { - "_globalMetadata": "New global metadata for the container.", - "_object": "A 32 byte value to insert into the container." - } - }, - "push2(bytes32,bytes32)": { - "params": { - "_objectA": "First 32 byte value to insert into the container.", - "_objectB": "Second 32 byte value to insert into the container." - } - }, - "push2(bytes32,bytes32,bytes27)": { - "params": { - "_globalMetadata": "New global metadata for the container.", - "_objectA": "First 32 byte value to insert into the container.", - "_objectB": "Second 32 byte value to insert into the container." - } - }, - "setGlobalMetadata(bytes27)": { - "params": { - "_globalMetadata": "New global metadata to set." - } - } - }, - "title": "OVM_ChainStorageContainer", - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": { - "deleteElementsAfterInclusive(uint256)": { - "notice": "Removes all objects after and including a given index." - }, - "deleteElementsAfterInclusive(uint256,bytes27)": { - "notice": "Removes all objects after and including a given index. Also allows setting the global metadata field." - }, - "get(uint256)": { - "notice": "Retrieves an object from the container." - }, - "getGlobalMetadata()": { - "notice": "Retrieves the container's global metadata field." - }, - "length()": { - "notice": "Retrieves the number of objects stored in the container." - }, - "push(bytes32)": { - "notice": "Pushes an object into the container." - }, - "push(bytes32,bytes27)": { - "notice": "Pushes an object into the container. Function allows setting the global metadata since we'll need to touch the \"length\" storage slot anyway, which also contains the global metadata (it's an optimization)." - }, - "push2(bytes32,bytes32)": { - "notice": "Pushes two objects into the container at the same time. A useful optimization." - }, - "push2(bytes32,bytes32,bytes27)": { - "notice": "Pushes two objects into the container at the same time. Also allows setting the global metadata field." - }, - "setGlobalMetadata(bytes27)": { - "notice": "Sets the container's global metadata field. We're using `bytes27` here because we use five bytes to maintain the length of the underlying data structure, meaning we have an extra 27 bytes to store arbitrary data." - }, - "setNextOverwritableIndex(uint256)": { - "notice": "Marks an index as overwritable, meaing the underlying buffer can start to write values over any objects before and including the given index." - } - }, - "version": 1 - }, - "storageLayout": { - "storage": [ - { - "astId": 11707, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "libAddressManager", - "offset": 0, - "slot": "0", - "type": "t_contract(Lib_AddressManager)11700" - }, - { - "astId": 2888, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "owner", - "offset": 0, - "slot": "1", - "type": "t_string_storage" - }, - { - "astId": 2890, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "buffer", - "offset": 0, - "slot": "2", - "type": "t_struct(RingBuffer)16365_storage" - } - ], - "types": { - "t_bytes32": { - "encoding": "inplace", - "label": "bytes32", - "numberOfBytes": "32" - }, - "t_contract(Lib_AddressManager)11700": { - "encoding": "inplace", - "label": "contract Lib_AddressManager", - "numberOfBytes": "20" - }, - "t_mapping(t_uint256,t_bytes32)": { - "encoding": "mapping", - "key": "t_uint256", - "label": "mapping(uint256 => bytes32)", - "numberOfBytes": "32", - "value": "t_bytes32" - }, - "t_string_storage": { - "encoding": "bytes", - "label": "string", - "numberOfBytes": "32" - }, - "t_struct(Buffer)16354_storage": { - "encoding": "inplace", - "label": "struct Lib_RingBuffer.Buffer", - "members": [ - { - "astId": 16349, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "length", - "offset": 0, - "slot": "0", - "type": "t_uint256" - }, - { - "astId": 16353, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "buf", - "offset": 0, - "slot": "1", - "type": "t_mapping(t_uint256,t_bytes32)" - } - ], - "numberOfBytes": "64" - }, - "t_struct(RingBuffer)16365_storage": { - "encoding": "inplace", - "label": "struct Lib_RingBuffer.RingBuffer", - "members": [ - { - "astId": 16356, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "contextA", - "offset": 0, - "slot": "0", - "type": "t_bytes32" - }, - { - "astId": 16358, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "contextB", - "offset": 0, - "slot": "1", - "type": "t_bytes32" - }, - { - "astId": 16360, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "bufferA", - "offset": 0, - "slot": "2", - "type": "t_struct(Buffer)16354_storage" - }, - { - "astId": 16362, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "bufferB", - "offset": 0, - "slot": "4", - "type": "t_struct(Buffer)16354_storage" - }, - { - "astId": 16364, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "nextOverwritableIndex", - "offset": 0, - "slot": "6", - "type": "t_uint256" - } - ], - "numberOfBytes": "224" - }, - "t_uint256": { - "encoding": "inplace", - "label": "uint256", - "numberOfBytes": "32" - } - } - } -} \ No newline at end of file diff --git a/packages/contracts/deployments/kovan-v1/OVM_L1CrossDomainMessenger.json b/packages/contracts/deployments/kovan-v1/OVM_L1CrossDomainMessenger.json deleted file mode 100644 index 8c9218cf320d9..0000000000000 --- a/packages/contracts/deployments/kovan-v1/OVM_L1CrossDomainMessenger.json +++ /dev/null @@ -1,477 +0,0 @@ -{ - "address": "0x19da6C4945f18F5E720054FECC50D6b5E015bd40", - "abi": [ - { - "inputs": [], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "bytes32", - "name": "msgHash", - "type": "bytes32" - } - ], - "name": "RelayedMessage", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "bytes", - "name": "message", - "type": "bytes" - } - ], - "name": "SentMessage", - "type": "event" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_libAddressManager", - "type": "address" - } - ], - "name": "initialize", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "messageNonce", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_target", - "type": "address" - }, - { - "internalType": "address", - "name": "_sender", - "type": "address" - }, - { - "internalType": "bytes", - "name": "_message", - "type": "bytes" - }, - { - "internalType": "uint256", - "name": "_messageNonce", - "type": "uint256" - }, - { - "components": [ - { - "internalType": "bytes32", - "name": "stateRoot", - "type": "bytes32" - }, - { - "components": [ - { - "internalType": "uint256", - "name": "batchIndex", - "type": "uint256" - }, - { - "internalType": "bytes32", - "name": "batchRoot", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "batchSize", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "prevTotalElements", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "extraData", - "type": "bytes" - } - ], - "internalType": "struct Lib_OVMCodec.ChainBatchHeader", - "name": "stateRootBatchHeader", - "type": "tuple" - }, - { - "components": [ - { - "internalType": "uint256", - "name": "index", - "type": "uint256" - }, - { - "internalType": "bytes32[]", - "name": "siblings", - "type": "bytes32[]" - } - ], - "internalType": "struct Lib_OVMCodec.ChainInclusionProof", - "name": "stateRootProof", - "type": "tuple" - }, - { - "internalType": "bytes", - "name": "stateTrieWitness", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "storageTrieWitness", - "type": "bytes" - } - ], - "internalType": "struct iOVM_L1CrossDomainMessenger.L2MessageInclusionProof", - "name": "_proof", - "type": "tuple" - } - ], - "name": "relayMessage", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "name": "relayedMessages", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_target", - "type": "address" - }, - { - "internalType": "address", - "name": "_sender", - "type": "address" - }, - { - "internalType": "bytes", - "name": "_message", - "type": "bytes" - }, - { - "internalType": "uint256", - "name": "_messageNonce", - "type": "uint256" - }, - { - "internalType": "uint32", - "name": "_gasLimit", - "type": "uint32" - } - ], - "name": "replayMessage", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "string", - "name": "_name", - "type": "string" - } - ], - "name": "resolve", - "outputs": [ - { - "internalType": "address", - "name": "_contract", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_target", - "type": "address" - }, - { - "internalType": "bytes", - "name": "_message", - "type": "bytes" - }, - { - "internalType": "uint32", - "name": "_gasLimit", - "type": "uint32" - } - ], - "name": "sendMessage", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "name": "sentMessages", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "name": "successfulMessages", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "xDomainMessageSender", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - } - ], - "transactionHash": "0x58185415b9f46e832c94156c7ff7c404e0bd4e41bf72422cd4da96647cd75f9e", - "receipt": { - "to": null, - "from": "0x558ba9b8d78713fbf768c1f8a584485B4003f43F", - "contractAddress": "0x2c299baBfF749D06abd68653769Dc1119C401bFF", - "transactionIndex": 3, - "gasUsed": "2165184", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0xa32e80c913e7a984d2d98e55cedf5835a409847785ddedfca99c7c17cf0f7add", - "transactionHash": "0x58185415b9f46e832c94156c7ff7c404e0bd4e41bf72422cd4da96647cd75f9e", - "logs": [], - "blockNumber": 4573442, - "cumulativeGasUsed": "2405923", - "status": 1, - "byzantium": true - }, - "args": [], - "solcInputHash": "cebcb515c1a9c570d96e0b8f6fd237e2", - "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"msgHash\",\"type\":\"bytes32\"}],\"name\":\"RelayedMessage\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"}],\"name\":\"SentMessage\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"messageNonce\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_sender\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_message\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"_messageNonce\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"stateRootBatchHeader\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"siblings\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct Lib_OVMCodec.ChainInclusionProof\",\"name\":\"stateRootProof\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"stateTrieWitness\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"storageTrieWitness\",\"type\":\"bytes\"}],\"internalType\":\"struct iOVM_L1CrossDomainMessenger.L2MessageInclusionProof\",\"name\":\"_proof\",\"type\":\"tuple\"}],\"name\":\"relayMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"relayedMessages\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_sender\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_message\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"_messageNonce\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"_gasLimit\",\"type\":\"uint32\"}],\"name\":\"replayMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"_contract\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_message\",\"type\":\"bytes\"},{\"internalType\":\"uint32\",\"name\":\"_gasLimit\",\"type\":\"uint32\"}],\"name\":\"sendMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"sentMessages\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"successfulMessages\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"xDomainMessageSender\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This contract lives on L1. It sends L1->L2 messages into L2, and relays L2->L1 messages from L2 to their target on L1.\",\"kind\":\"dev\",\"methods\":{\"initialize(address)\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\"}},\"relayMessage(address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))\":{\"params\":{\"_message\":\"Message to send to the target.\",\"_messageNonce\":\"Nonce for the provided message.\",\"_proof\":\"Inclusion proof for the given message.\",\"_sender\":\"Message sender address.\",\"_target\":\"Target contract address.\"}},\"replayMessage(address,address,bytes,uint256,uint32)\":{\"params\":{\"_gasLimit\":\"Gas limit for the provided message.\",\"_message\":\"Message to send to the target.\",\"_messageNonce\":\"Nonce for the provided message.\",\"_sender\":\"Original sender address.\",\"_target\":\"Target contract address.\"}},\"sendMessage(address,bytes,uint32)\":{\"params\":{\"_gasLimit\":\"Gas limit for the provided message.\",\"_message\":\"Message to send to the target.\",\"_target\":\"Target contract address.\"}}},\"title\":\"OVM_L1CrossDomainMessenger\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"constructor\":{\"notice\":\"Pass a default zero address to the address resolver. This will be updated when initialized.\"},\"relayMessage(address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))\":{\"notice\":\"Relays a cross domain message to a contract.\"},\"replayMessage(address,address,bytes,uint256,uint32)\":{\"notice\":\"Replays a cross domain message to the target messenger.\"},\"sendMessage(address,bytes,uint32)\":{\"notice\":\"Sends a cross domain message to the target messenger.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/OVM/bridge/OVM_L1CrossDomainMessenger.sol\":\"OVM_L1CrossDomainMessenger\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/optimistic-ethereum/OVM/bridge/OVM_BaseCrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// +build ovm\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Interface Imports */\\nimport { iOVM_BaseCrossDomainMessenger } from \\\"../../iOVM/bridge/iOVM_BaseCrossDomainMessenger.sol\\\";\\n\\n/* Library Imports */\\nimport { Lib_ReentrancyGuard } from \\\"../../libraries/utils/Lib_ReentrancyGuard.sol\\\";\\n\\n/**\\n * @title OVM_BaseCrossDomainMessenger\\n */\\nabstract contract OVM_BaseCrossDomainMessenger is iOVM_BaseCrossDomainMessenger, Lib_ReentrancyGuard {\\n\\n /**********************\\n * Contract Variables *\\n **********************/\\n\\n mapping (bytes32 => bool) public relayedMessages;\\n mapping (bytes32 => bool) public successfulMessages;\\n mapping (bytes32 => bool) public sentMessages;\\n uint256 public messageNonce;\\n address override public xDomainMessageSender;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n constructor() Lib_ReentrancyGuard() internal {}\\n\\n /**\\n * Sends a cross domain message to the target messenger.\\n * @param _target Target contract address.\\n * @param _message Message to send to the target.\\n * @param _gasLimit Gas limit for the provided message.\\n */\\n function sendMessage(\\n address _target,\\n bytes memory _message,\\n uint32 _gasLimit\\n )\\n override\\n public\\n {\\n bytes memory xDomainCalldata = _getXDomainCalldata(\\n _target,\\n msg.sender,\\n _message,\\n messageNonce\\n );\\n\\n messageNonce += 1;\\n sentMessages[keccak256(xDomainCalldata)] = true;\\n\\n _sendXDomainMessage(xDomainCalldata, _gasLimit);\\n emit SentMessage(xDomainCalldata);\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Generates the correct cross domain calldata for a message.\\n * @param _target Target contract address.\\n * @param _sender Message sender address.\\n * @param _message Message to send to the target.\\n * @param _messageNonce Nonce for the provided message.\\n * @return ABI encoded cross domain calldata.\\n */\\n function _getXDomainCalldata(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _messageNonce\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return abi.encodeWithSignature(\\n \\\"relayMessage(address,address,bytes,uint256)\\\",\\n _target,\\n _sender,\\n _message,\\n _messageNonce\\n );\\n }\\n\\n /**\\n * Sends a cross domain message.\\n * @param _message Message to send.\\n * @param _gasLimit Gas limit for the provided message.\\n */\\n function _sendXDomainMessage(\\n bytes memory _message,\\n uint256 _gasLimit\\n )\\n virtual\\n internal\\n {\\n revert(\\\"Implement me in child contracts!\\\");\\n }\\n}\\n\",\"keccak256\":\"0x25c5521fb5cd66f91aa927b7c199cd2006ba6a2c3857b17e53e2d0727334ea2c\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/bridge/OVM_L1CrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\nimport { Lib_AddressManager } from \\\"../../libraries/resolver/Lib_AddressManager.sol\\\";\\nimport { Lib_SecureMerkleTrie } from \\\"../../libraries/trie/Lib_SecureMerkleTrie.sol\\\";\\nimport { Lib_ReentrancyGuard } from \\\"../../libraries/utils/Lib_ReentrancyGuard.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_L1CrossDomainMessenger } from \\\"../../iOVM/bridge/iOVM_L1CrossDomainMessenger.sol\\\";\\nimport { iOVM_CanonicalTransactionChain } from \\\"../../iOVM/chain/iOVM_CanonicalTransactionChain.sol\\\";\\nimport { iOVM_StateCommitmentChain } from \\\"../../iOVM/chain/iOVM_StateCommitmentChain.sol\\\";\\n\\n/* Contract Imports */\\nimport { OVM_BaseCrossDomainMessenger } from \\\"./OVM_BaseCrossDomainMessenger.sol\\\";\\n\\n/**\\n * @title OVM_L1CrossDomainMessenger\\n * @dev This contract lives on L1. It sends L1->L2 messages into L2, and relays L2->L1 messages from L2 to their target on L1.\\n */\\ncontract OVM_L1CrossDomainMessenger is iOVM_L1CrossDomainMessenger, OVM_BaseCrossDomainMessenger, Lib_AddressResolver {\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * Pass a default zero address to the address resolver. This will be updated when initialized.\\n */\\n constructor()\\n Lib_AddressResolver(address(0))\\n {}\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n */\\n function initialize(\\n address _libAddressManager\\n )\\n public\\n {\\n require(address(libAddressManager) == address(0), \\\"L1CrossDomainMessenger already intialized.\\\");\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n /**\\n * Modifier to enforce that, if configured, only the OVM_L2MessageRelayer contract may successfully call a method.\\n */\\n modifier onlyRelayer() {\\n address relayer = resolve(\\\"OVM_L2MessageRelayer\\\");\\n if (relayer != address(0)) {\\n require(\\n msg.sender == relayer,\\n \\\"Only OVM_L2MessageRelayer can relay L2-to-L1 messages.\\\"\\n );\\n }\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Relays a cross domain message to a contract.\\n * @inheritdoc iOVM_L1CrossDomainMessenger\\n */\\n function relayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _messageNonce,\\n L2MessageInclusionProof memory _proof\\n )\\n override\\n public\\n nonReentrant\\n onlyRelayer()\\n {\\n bytes memory xDomainCalldata = _getXDomainCalldata(\\n _target,\\n _sender,\\n _message,\\n _messageNonce\\n );\\n\\n require(\\n _verifyXDomainMessage(\\n xDomainCalldata,\\n _proof\\n ) == true,\\n \\\"Provided message could not be verified.\\\"\\n );\\n\\n bytes32 xDomainCalldataHash = keccak256(xDomainCalldata);\\n\\n require(\\n successfulMessages[xDomainCalldataHash] == false,\\n \\\"Provided message has already been received.\\\"\\n );\\n\\n xDomainMessageSender = _sender;\\n (bool success, ) = _target.call(_message);\\n\\n // Mark the message as received if the call was successful. Ensures that a message can be\\n // relayed multiple times in the case that the call reverted.\\n if (success == true) {\\n successfulMessages[xDomainCalldataHash] = true;\\n emit RelayedMessage(xDomainCalldataHash);\\n }\\n\\n // Store an identifier that can be used to prove that the given message was relayed by some\\n // user. Gives us an easy way to pay relayers for their work.\\n bytes32 relayId = keccak256(\\n abi.encodePacked(\\n xDomainCalldata,\\n msg.sender,\\n block.number\\n )\\n );\\n relayedMessages[relayId] = true;\\n }\\n\\n /**\\n * Replays a cross domain message to the target messenger.\\n * @inheritdoc iOVM_L1CrossDomainMessenger\\n */\\n function replayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _messageNonce,\\n uint32 _gasLimit\\n )\\n override\\n public\\n {\\n bytes memory xDomainCalldata = _getXDomainCalldata(\\n _target,\\n _sender,\\n _message,\\n _messageNonce\\n );\\n\\n require(\\n sentMessages[keccak256(xDomainCalldata)] == true,\\n \\\"Provided message has not already been sent.\\\"\\n );\\n\\n _sendXDomainMessage(xDomainCalldata, _gasLimit);\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Verifies that the given message is valid.\\n * @param _xDomainCalldata Calldata to verify.\\n * @param _proof Inclusion proof for the message.\\n * @return Whether or not the provided message is valid.\\n */\\n function _verifyXDomainMessage(\\n bytes memory _xDomainCalldata,\\n L2MessageInclusionProof memory _proof\\n )\\n internal\\n view\\n returns (\\n bool\\n )\\n {\\n return (\\n _verifyStateRootProof(_proof)\\n && _verifyStorageProof(_xDomainCalldata, _proof)\\n );\\n }\\n\\n /**\\n * Verifies that the state root within an inclusion proof is valid.\\n * @param _proof Message inclusion proof.\\n * @return Whether or not the provided proof is valid.\\n */\\n function _verifyStateRootProof(\\n L2MessageInclusionProof memory _proof\\n )\\n internal\\n view\\n returns (\\n bool\\n )\\n {\\n iOVM_StateCommitmentChain ovmStateCommitmentChain = iOVM_StateCommitmentChain(resolve(\\\"OVM_StateCommitmentChain\\\"));\\n\\n return (\\n ovmStateCommitmentChain.insideFraudProofWindow(_proof.stateRootBatchHeader) == false\\n && ovmStateCommitmentChain.verifyStateCommitment(\\n _proof.stateRoot,\\n _proof.stateRootBatchHeader,\\n _proof.stateRootProof\\n )\\n );\\n }\\n\\n /**\\n * Verifies that the storage proof within an inclusion proof is valid.\\n * @param _xDomainCalldata Encoded message calldata.\\n * @param _proof Message inclusion proof.\\n * @return Whether or not the provided proof is valid.\\n */\\n function _verifyStorageProof(\\n bytes memory _xDomainCalldata,\\n L2MessageInclusionProof memory _proof\\n )\\n internal\\n view\\n returns (\\n bool\\n )\\n {\\n bytes32 storageKey = keccak256(\\n abi.encodePacked(\\n keccak256(\\n abi.encodePacked(\\n _xDomainCalldata,\\n resolve(\\\"OVM_L2CrossDomainMessenger\\\")\\n )\\n ),\\n uint256(0)\\n )\\n );\\n\\n (\\n bool exists,\\n bytes memory encodedMessagePassingAccount\\n ) = Lib_SecureMerkleTrie.get(\\n abi.encodePacked(0x4200000000000000000000000000000000000000),\\n _proof.stateTrieWitness,\\n _proof.stateRoot\\n );\\n\\n require(\\n exists == true,\\n \\\"Message passing precompile has not been initialized or invalid proof provided.\\\"\\n );\\n\\n Lib_OVMCodec.EVMAccount memory account = Lib_OVMCodec.decodeEVMAccount(\\n encodedMessagePassingAccount\\n );\\n\\n return Lib_SecureMerkleTrie.verifyInclusionProof(\\n abi.encodePacked(storageKey),\\n abi.encodePacked(uint8(1)),\\n _proof.storageTrieWitness,\\n account.storageRoot\\n );\\n }\\n\\n /**\\n * Sends a cross domain message.\\n * @param _message Message to send.\\n * @param _gasLimit OVM gas limit for the message.\\n */\\n function _sendXDomainMessage(\\n bytes memory _message,\\n uint256 _gasLimit\\n )\\n override\\n internal\\n {\\n iOVM_CanonicalTransactionChain(resolve(\\\"OVM_CanonicalTransactionChain\\\")).enqueue(\\n resolve(\\\"OVM_L2CrossDomainMessenger\\\"),\\n _gasLimit,\\n _message\\n );\\n }\\n}\\n\",\"keccak256\":\"0x62ead80db43d27db3da44f44b9edc1ecfd041134f8422036ddfb499fc324cfe4\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/bridge/iOVM_BaseCrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// +build ovm\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/**\\n * @title iOVM_BaseCrossDomainMessenger\\n */\\ninterface iOVM_BaseCrossDomainMessenger {\\n\\n /**********\\n * Events *\\n **********/\\n event SentMessage(bytes message);\\n event RelayedMessage(bytes32 msgHash);\\n\\n /**********************\\n * Contract Variables *\\n **********************/\\n function xDomainMessageSender() external view returns (address);\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sends a cross domain message to the target messenger.\\n * @param _target Target contract address.\\n * @param _message Message to send to the target.\\n * @param _gasLimit Gas limit for the provided message.\\n */\\n function sendMessage(\\n address _target,\\n bytes calldata _message,\\n uint32 _gasLimit\\n ) external;\\n}\\n\",\"keccak256\":\"0x5da9f0957057d97fb45e514c6d247724e645d8f05c1c2b958cb360ecd9dbce50\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/bridge/iOVM_L1CrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_BaseCrossDomainMessenger } from \\\"./iOVM_BaseCrossDomainMessenger.sol\\\";\\n\\n/**\\n * @title iOVM_L1CrossDomainMessenger\\n */\\ninterface iOVM_L1CrossDomainMessenger is iOVM_BaseCrossDomainMessenger {\\n\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n struct L2MessageInclusionProof {\\n bytes32 stateRoot;\\n Lib_OVMCodec.ChainBatchHeader stateRootBatchHeader;\\n Lib_OVMCodec.ChainInclusionProof stateRootProof;\\n bytes stateTrieWitness;\\n bytes storageTrieWitness;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Relays a cross domain message to a contract.\\n * @param _target Target contract address.\\n * @param _sender Message sender address.\\n * @param _message Message to send to the target.\\n * @param _messageNonce Nonce for the provided message.\\n * @param _proof Inclusion proof for the given message.\\n */\\n function relayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _messageNonce,\\n L2MessageInclusionProof memory _proof\\n ) external;\\n\\n /**\\n * Replays a cross domain message to the target messenger.\\n * @param _target Target contract address.\\n * @param _sender Original sender address.\\n * @param _message Message to send to the target.\\n * @param _messageNonce Nonce for the provided message.\\n * @param _gasLimit Gas limit for the provided message.\\n */\\n function replayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _messageNonce,\\n uint32 _gasLimit\\n ) external;\\n}\\n\",\"keccak256\":\"0x51fb52c2a5ed1d3491a68431eb034aebe17f261c6dce7c7b4631a4f01b0b8bb8\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_CanonicalTransactionChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title iOVM_CanonicalTransactionChain\\n */\\ninterface iOVM_CanonicalTransactionChain {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event TransactionEnqueued(\\n address _l1TxOrigin,\\n address _target,\\n uint256 _gasLimit,\\n bytes _data,\\n uint256 _queueIndex,\\n uint256 _timestamp\\n );\\n\\n event QueueBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event SequencerBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event TransactionBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct BatchContext {\\n uint256 numSequencedTransactions;\\n uint256 numSubsequentQueueTransactions;\\n uint256 timestamp;\\n uint256 blockNumber;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements()\\n external\\n view\\n returns (\\n uint256 _totalElements\\n );\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches()\\n external\\n view\\n returns (\\n uint256 _totalBatches\\n );\\n\\n /**\\n * Returns the index of the next element to be enqueued.\\n * @return Index for the next queue element.\\n */\\n function getNextQueueIndex()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Get the number of queue elements which have not yet been included.\\n * @return Length of the queue.\\n */\\n function getNumPendingQueueElements()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Retrieves the length of the queue, including\\n * both pending and canonical transactions.\\n * @return Length of the queue.\\n */\\n function getQueueLength()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Gets the queue element at a particular index.\\n * @param _index Index of the queue element to access.\\n * @return _element Queue element at the given index.\\n */\\n function getQueueElement(\\n uint256 _index\\n )\\n external\\n view\\n returns (\\n Lib_OVMCodec.QueueElement memory _element\\n );\\n\\n /**\\n * Adds a transaction to the queue.\\n * @param _target Target contract to send the transaction to.\\n * @param _gasLimit Gas limit for the given transaction.\\n * @param _data Transaction data.\\n */\\n function enqueue(\\n address _target,\\n uint256 _gasLimit,\\n bytes memory _data\\n )\\n external;\\n\\n /**\\n * Appends a given number of queued transactions as a single batch.\\n * @param _numQueuedTransactions Number of transactions to append.\\n */\\n function appendQueueBatch(\\n uint256 _numQueuedTransactions\\n )\\n external;\\n\\n /**\\n * Allows the sequencer to append a batch of transactions.\\n * @dev This function uses a custom encoding scheme for efficiency reasons.\\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\\n * .param _contexts Array of batch contexts.\\n * .param _transactionDataFields Array of raw transaction data.\\n */\\n function appendSequencerBatch(\\n // uint40 _shouldStartAtElement,\\n // uint24 _totalElementsToAppend,\\n // BatchContext[] _contexts,\\n // bytes[] _transactionDataFields\\n )\\n external;\\n\\n /**\\n * Verifies whether a transaction is included in the chain.\\n * @param _transaction Transaction to verify.\\n * @param _txChainElement Transaction chain element corresponding to the transaction.\\n * @param _batchHeader Header of the batch the transaction was included in.\\n * @param _inclusionProof Inclusion proof for the provided transaction chain element.\\n * @return True if the transaction exists in the CTC, false if not.\\n */\\n function verifyTransaction(\\n Lib_OVMCodec.Transaction memory _transaction,\\n Lib_OVMCodec.TransactionChainElement memory _txChainElement,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _inclusionProof\\n )\\n external\\n view\\n returns (\\n bool\\n );\\n}\\n\",\"keccak256\":\"0x82a4e62286c8bc5e2d3de33f66d9b707cb9636e553dca54b5e95277bd794a934\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_StateCommitmentChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title iOVM_StateCommitmentChain\\n */\\ninterface iOVM_StateCommitmentChain {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event StateBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n event StateBatchDeleted(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot\\n );\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements()\\n external\\n view\\n returns (\\n uint256 _totalElements\\n );\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches()\\n external\\n view\\n returns (\\n uint256 _totalBatches\\n );\\n\\n /**\\n * Retrieves the timestamp of the last batch submitted by the sequencer.\\n * @return _lastSequencerTimestamp Last sequencer batch timestamp.\\n */\\n function getLastSequencerTimestamp()\\n external\\n view\\n returns (\\n uint256 _lastSequencerTimestamp\\n );\\n\\n /**\\n * Appends a batch of state roots to the chain.\\n * @param _batch Batch of state roots.\\n * @param _shouldStartAtElement Index of the element at which this batch should start.\\n */\\n function appendStateBatch(\\n bytes32[] calldata _batch,\\n uint256 _shouldStartAtElement\\n )\\n external;\\n\\n /**\\n * Deletes all state roots after (and including) a given batch.\\n * @param _batchHeader Header of the batch to start deleting from.\\n */\\n function deleteStateBatch(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n external;\\n\\n /**\\n * Verifies a batch inclusion proof.\\n * @param _element Hash of the element to verify a proof for.\\n * @param _batchHeader Header of the batch in which the element was included.\\n * @param _proof Merkle inclusion proof for the element.\\n */\\n function verifyStateCommitment(\\n bytes32 _element,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _proof\\n )\\n external\\n view\\n returns (\\n bool _verified\\n );\\n\\n /**\\n * Checks whether a given batch is still inside its fraud proof window.\\n * @param _batchHeader Header of the batch to check.\\n * @return _inside Whether or not the batch is inside the fraud proof window.\\n */\\n function insideFraudProofWindow(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n external\\n view\\n returns (\\n bool _inside\\n );\\n}\\n\",\"keccak256\":\"0x6646d6ff392b81aab52a7a277e91540819464751de0af5afd1962094b2e92448\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/codec/Lib_OVMCodec.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../utils/Lib_Bytes32Utils.sol\\\";\\nimport { Lib_SafeExecutionManagerWrapper } from \\\"../../libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\\\";\\n\\n/**\\n * @title Lib_OVMCodec\\n */\\nlibrary Lib_OVMCodec {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n bytes constant internal RLP_NULL_BYTES = hex'80';\\n bytes constant internal NULL_BYTES = bytes('');\\n\\n // Ring buffer IDs\\n bytes32 constant internal RING_BUFFER_SCC_BATCHES = keccak256(\\\"RING_BUFFER_SCC_BATCHES\\\");\\n bytes32 constant internal RING_BUFFER_CTC_BATCHES = keccak256(\\\"RING_BUFFER_CTC_BATCHES\\\");\\n bytes32 constant internal RING_BUFFER_CTC_QUEUE = keccak256(\\\"RING_BUFFER_CTC_QUEUE\\\");\\n\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum EOASignatureType {\\n EIP155_TRANSACTON,\\n ETH_SIGNED_MESSAGE\\n }\\n\\n enum QueueOrigin {\\n SEQUENCER_QUEUE,\\n L1TOL2_QUEUE\\n }\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Account {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n address ethAddress;\\n bool isFresh;\\n }\\n\\n struct EVMAccount {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n }\\n\\n struct ChainBatchHeader {\\n uint256 batchIndex;\\n bytes32 batchRoot;\\n uint256 batchSize;\\n uint256 prevTotalElements;\\n bytes extraData;\\n }\\n\\n struct ChainInclusionProof {\\n uint256 index;\\n bytes32[] siblings;\\n }\\n\\n struct Transaction {\\n uint256 timestamp;\\n uint256 blockNumber;\\n QueueOrigin l1QueueOrigin;\\n address l1TxOrigin;\\n address entrypoint;\\n uint256 gasLimit;\\n bytes data;\\n }\\n\\n struct TransactionChainElement {\\n bool isSequenced;\\n uint256 queueIndex; // QUEUED TX ONLY\\n uint256 timestamp; // SEQUENCER TX ONLY\\n uint256 blockNumber; // SEQUENCER TX ONLY\\n bytes txData; // SEQUENCER TX ONLY\\n }\\n\\n struct QueueElement {\\n bytes32 queueRoot;\\n uint40 timestamp;\\n uint40 blockNumber;\\n }\\n\\n struct EIP155Transaction {\\n uint256 nonce;\\n uint256 gasPrice;\\n uint256 gasLimit;\\n address to;\\n uint256 value;\\n bytes data;\\n uint256 chainId;\\n }\\n\\n\\n /*********************************************\\n * Internal Functions: Encoding and Decoding *\\n *********************************************/\\n\\n /**\\n * Decodes an EOA transaction (i.e., native Ethereum RLP encoding).\\n * @param _transaction Encoded EOA transaction.\\n * @return _decoded Transaction decoded into a struct.\\n */\\n function decodeEIP155Transaction(\\n bytes memory _transaction,\\n bool _isEthSignedMessage\\n )\\n internal\\n pure\\n returns (\\n EIP155Transaction memory _decoded\\n )\\n {\\n if (_isEthSignedMessage) {\\n (\\n uint256 _nonce,\\n uint256 _gasLimit,\\n uint256 _gasPrice,\\n uint256 _chainId,\\n address _to,\\n bytes memory _data\\n ) = abi.decode(\\n _transaction,\\n (uint256, uint256, uint256, uint256, address ,bytes)\\n );\\n return EIP155Transaction({\\n nonce: _nonce,\\n gasPrice: _gasPrice,\\n gasLimit: _gasLimit,\\n to: _to,\\n value: 0,\\n data: _data,\\n chainId: _chainId\\n });\\n } else {\\n Lib_RLPReader.RLPItem[] memory decoded = Lib_RLPReader.readList(_transaction);\\n\\n return EIP155Transaction({\\n nonce: Lib_RLPReader.readUint256(decoded[0]),\\n gasPrice: Lib_RLPReader.readUint256(decoded[1]),\\n gasLimit: Lib_RLPReader.readUint256(decoded[2]),\\n to: Lib_RLPReader.readAddress(decoded[3]),\\n value: Lib_RLPReader.readUint256(decoded[4]),\\n data: Lib_RLPReader.readBytes(decoded[5]),\\n chainId: Lib_RLPReader.readUint256(decoded[6])\\n });\\n }\\n }\\n\\n function decompressEIP155Transaction(\\n bytes memory _transaction\\n )\\n internal\\n returns (\\n EIP155Transaction memory _decompressed\\n )\\n {\\n return EIP155Transaction({\\n gasLimit: Lib_BytesUtils.toUint24(_transaction, 0),\\n gasPrice: uint256(Lib_BytesUtils.toUint24(_transaction, 3)) * 1000000,\\n nonce: Lib_BytesUtils.toUint24(_transaction, 6),\\n to: Lib_BytesUtils.toAddress(_transaction, 9),\\n data: Lib_BytesUtils.slice(_transaction, 29),\\n chainId: Lib_SafeExecutionManagerWrapper.safeCHAINID(),\\n value: 0\\n });\\n }\\n\\n /**\\n * Encodes an EOA transaction back into the original transaction.\\n * @param _transaction EIP155transaction to encode.\\n * @param _isEthSignedMessage Whether or not this was an eth signed message.\\n * @return Encoded transaction.\\n */\\n function encodeEIP155Transaction(\\n EIP155Transaction memory _transaction,\\n bool _isEthSignedMessage\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n if (_isEthSignedMessage) {\\n return abi.encode(\\n _transaction.nonce,\\n _transaction.gasLimit,\\n _transaction.gasPrice,\\n _transaction.chainId,\\n _transaction.to,\\n _transaction.data\\n );\\n } else {\\n bytes[] memory raw = new bytes[](9);\\n\\n raw[0] = Lib_RLPWriter.writeUint(_transaction.nonce);\\n raw[1] = Lib_RLPWriter.writeUint(_transaction.gasPrice);\\n raw[2] = Lib_RLPWriter.writeUint(_transaction.gasLimit);\\n if (_transaction.to == address(0)) {\\n raw[3] = Lib_RLPWriter.writeBytes('');\\n } else {\\n raw[3] = Lib_RLPWriter.writeAddress(_transaction.to);\\n }\\n raw[4] = Lib_RLPWriter.writeUint(0);\\n raw[5] = Lib_RLPWriter.writeBytes(_transaction.data);\\n raw[6] = Lib_RLPWriter.writeUint(_transaction.chainId);\\n raw[7] = Lib_RLPWriter.writeBytes(bytes(''));\\n raw[8] = Lib_RLPWriter.writeBytes(bytes(''));\\n\\n return Lib_RLPWriter.writeList(raw);\\n }\\n }\\n\\n /**\\n * Encodes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return _encoded Encoded transaction bytes.\\n */\\n function encodeTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes memory _encoded\\n )\\n {\\n return abi.encodePacked(\\n _transaction.timestamp,\\n _transaction.blockNumber,\\n _transaction.l1QueueOrigin,\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n );\\n }\\n\\n /**\\n * Hashes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return _hash Hashed transaction\\n */\\n function hashTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes32 _hash\\n )\\n {\\n return keccak256(encodeTransaction(_transaction));\\n }\\n\\n /**\\n * Converts an OVM account to an EVM account.\\n * @param _in OVM account to convert.\\n * @return _out Converted EVM account.\\n */\\n function toEVMAccount(\\n Account memory _in\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory _out\\n )\\n {\\n return EVMAccount({\\n nonce: _in.nonce,\\n balance: _in.balance,\\n storageRoot: _in.storageRoot,\\n codeHash: _in.codeHash\\n });\\n }\\n\\n /**\\n * @notice RLP-encodes an account state struct.\\n * @param _account Account state struct.\\n * @return _encoded RLP-encoded account state.\\n */\\n function encodeEVMAccount(\\n EVMAccount memory _account\\n )\\n internal\\n pure\\n returns (\\n bytes memory _encoded\\n )\\n {\\n bytes[] memory raw = new bytes[](4);\\n\\n // Unfortunately we can't create this array outright because\\n // Lib_RLPWriter.writeList will reject fixed-size arrays. Assigning\\n // index-by-index circumvents this issue.\\n raw[0] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.nonce)\\n )\\n );\\n raw[1] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.balance)\\n )\\n );\\n raw[2] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.storageRoot));\\n raw[3] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.codeHash));\\n\\n return Lib_RLPWriter.writeList(raw);\\n }\\n\\n /**\\n * @notice Decodes an RLP-encoded account state into a useful struct.\\n * @param _encoded RLP-encoded account state.\\n * @return _account Account state struct.\\n */\\n function decodeEVMAccount(\\n bytes memory _encoded\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory _account\\n )\\n {\\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\\n\\n return EVMAccount({\\n nonce: Lib_RLPReader.readUint256(accountState[0]),\\n balance: Lib_RLPReader.readUint256(accountState[1]),\\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\\n });\\n }\\n\\n /**\\n * Calculates a hash for a given batch header.\\n * @param _batchHeader Header to hash.\\n * @return _hash Hash of the header.\\n */\\n function hashBatchHeader(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n internal\\n pure\\n returns (\\n bytes32 _hash\\n )\\n {\\n return keccak256(\\n abi.encode(\\n _batchHeader.batchRoot,\\n _batchHeader.batchSize,\\n _batchHeader.prevTotalElements,\\n _batchHeader.extraData\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0x19d78734777b4998f1544e235cf3934f20c5055cd76c2bd60bf0f6dacdd72b3a\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// +build ovm\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Contract Imports */\\nimport { Ownable } from \\\"./Lib_Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n /*******************************************\\n * Contract Variables: Internal Accounting *\\n *******************************************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n public\\n onlyOwner\\n {\\n emit AddressSet(_name, _address);\\n addresses[_getNameHash(_name)] = _address;\\n }\\n\\n function getAddress(\\n string memory _name\\n )\\n public\\n view\\n returns (address)\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32 _hash\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xdf802e1cc6474df913626991e9fca3835c620a519f397afe04bf9c260e723257\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// +build ovm\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\ncontract Lib_AddressResolver {\\n\\n /*******************************************\\n * Contract Variables: Contract References *\\n *******************************************/\\n\\n Lib_AddressManager internal libAddressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(\\n address _libAddressManager\\n ) public {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function resolve(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address _contract\\n )\\n {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0xf3b9d78b309ddeec259ce3e0e1cfdef3ca40938e9a81971b28ce2b8ea327f533\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// +build ovm\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Ownable\\n * @dev Adapted from https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol\\n */\\nabstract contract Ownable {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n address public owner;\\n\\n\\n /**********\\n * Events *\\n **********/\\n\\n event OwnershipTransferred(\\n address indexed previousOwner,\\n address indexed newOwner\\n );\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n constructor() internal {\\n owner = msg.sender;\\n emit OwnershipTransferred(address(0), owner);\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n owner == msg.sender,\\n \\\"Ownable: caller is not the owner\\\"\\n );\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function renounceOwnership()\\n public\\n virtual\\n onlyOwner\\n {\\n emit OwnershipTransferred(owner, address(0));\\n owner = address(0);\\n }\\n\\n function transferOwnership(address _newOwner)\\n public\\n virtual\\n onlyOwner\\n {\\n require(\\n _newOwner != address(0),\\n \\\"Ownable: new owner cannot be the zero address\\\"\\n );\\n\\n emit OwnershipTransferred(owner, _newOwner);\\n owner = _newOwner;\\n }\\n}\\n\",\"keccak256\":\"0xe0409fbd236d16ca6be439d9d97dd36d0d9a0697ee0062d49588b9d29c248e47\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPReader.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.7.0;\\n\\n/**\\n * @title Lib_RLPReader\\n * @dev Adapted from \\\"RLPReader\\\" by Hamdi Allam (hamdi.allam97@gmail.com).\\n */\\nlibrary Lib_RLPReader {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 constant internal MAX_LIST_LENGTH = 32;\\n\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum RLPItemType {\\n DATA_ITEM,\\n LIST_ITEM\\n }\\n\\n \\n /***********\\n * Structs *\\n ***********/\\n\\n struct RLPItem {\\n uint256 length;\\n uint256 ptr;\\n }\\n \\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n \\n /**\\n * Converts bytes to a reference to memory position and length.\\n * @param _in Input bytes to convert.\\n * @return Output memory reference.\\n */\\n function toRLPItem(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem memory\\n )\\n {\\n uint256 ptr;\\n assembly {\\n ptr := add(_in, 32)\\n }\\n\\n return RLPItem({\\n length: _in.length,\\n ptr: ptr\\n });\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n (\\n uint256 listOffset,\\n ,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.LIST_ITEM,\\n \\\"Invalid RLP list value.\\\"\\n );\\n\\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\\n // writing to the length. Since we can't know the number of RLP items without looping over\\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\\n // simply set a reasonable maximum list length and decrease the size before we finish.\\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\\n\\n uint256 itemCount = 0;\\n uint256 offset = listOffset;\\n while (offset < _in.length) {\\n require(\\n itemCount < MAX_LIST_LENGTH,\\n \\\"Provided RLP list exceeds max list length.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n ) = _decodeLength(RLPItem({\\n length: _in.length - offset,\\n ptr: _in.ptr + offset\\n }));\\n\\n out[itemCount] = RLPItem({\\n length: itemLength + itemOffset,\\n ptr: _in.ptr + offset\\n });\\n\\n itemCount += 1;\\n offset += itemOffset + itemLength;\\n }\\n\\n // Decrease the array size to match the actual item count.\\n assembly {\\n mstore(out, itemCount)\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n return readList(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes value.\\\"\\n );\\n\\n return _copy(_in.ptr, itemOffset, itemLength);\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return readBytes(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return string(readBytes(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return readString(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n require(\\n _in.length <= 33,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr + itemOffset;\\n bytes32 out;\\n assembly {\\n out := mload(ptr)\\n\\n // Shift the bytes over to match the item size.\\n if lt(itemLength, 32) {\\n out := div(out, exp(256, sub(32, itemLength)))\\n }\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return readBytes32(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return uint256(readBytes32(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return readUint256(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n require(\\n _in.length == 1,\\n \\\"Invalid RLP boolean value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 out;\\n assembly {\\n out := byte(0, mload(ptr))\\n }\\n\\n return out != 0;\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return readBool(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n if (_in.length == 1) {\\n return address(0);\\n }\\n\\n require(\\n _in.length == 21,\\n \\\"Invalid RLP address value.\\\"\\n );\\n\\n return address(readUint256(_in));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return readAddress(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads the raw bytes of an RLP item.\\n * @param _in RLP item to read.\\n * @return Raw RLP bytes.\\n */\\n function readRawBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in);\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Decodes the length of an RLP item.\\n * @param _in RLP item to decode.\\n * @return Offset of the encoded data.\\n * @return Length of the encoded data.\\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\\n */\\n function _decodeLength(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n uint256,\\n uint256,\\n RLPItemType\\n )\\n {\\n require(\\n _in.length > 0,\\n \\\"RLP item cannot be null.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 prefix;\\n assembly {\\n prefix := byte(0, mload(ptr))\\n }\\n\\n if (prefix <= 0x7f) {\\n // Single byte.\\n\\n return (0, 1, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xb7) {\\n // Short string.\\n\\n uint256 strLen = prefix - 0x80;\\n \\n require(\\n _in.length > strLen,\\n \\\"Invalid RLP short string.\\\"\\n );\\n\\n return (1, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xbf) {\\n // Long string.\\n uint256 lenOfStrLen = prefix - 0xb7;\\n\\n require(\\n _in.length > lenOfStrLen,\\n \\\"Invalid RLP long string length.\\\"\\n );\\n\\n uint256 strLen;\\n assembly {\\n // Pick out the string length.\\n strLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfStrLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfStrLen + strLen,\\n \\\"Invalid RLP long string.\\\"\\n );\\n\\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xf7) {\\n // Short list.\\n uint256 listLen = prefix - 0xc0;\\n\\n require(\\n _in.length > listLen,\\n \\\"Invalid RLP short list.\\\"\\n );\\n\\n return (1, listLen, RLPItemType.LIST_ITEM);\\n } else {\\n // Long list.\\n uint256 lenOfListLen = prefix - 0xf7;\\n\\n require(\\n _in.length > lenOfListLen,\\n \\\"Invalid RLP long list length.\\\"\\n );\\n\\n uint256 listLen;\\n assembly {\\n // Pick out the list length.\\n listLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfListLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfListLen + listLen,\\n \\\"Invalid RLP long list.\\\"\\n );\\n\\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\\n }\\n }\\n\\n /**\\n * Copies the bytes from a memory location.\\n * @param _src Pointer to the location to read from.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Copied bytes.\\n */\\n function _copy(\\n uint256 _src,\\n uint256 _offset,\\n uint256 _length\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out = new bytes(_length);\\n if (out.length == 0) {\\n return out;\\n }\\n\\n uint256 src = _src + _offset;\\n uint256 dest;\\n assembly {\\n dest := add(out, 32)\\n }\\n\\n // Copy over as many complete words as we can.\\n for (uint256 i = 0; i < _length / 32; i++) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n\\n src += 32;\\n dest += 32;\\n }\\n\\n // Pick out the remaining bytes.\\n uint256 mask = 256 ** (32 - (_length % 32)) - 1;\\n assembly {\\n mstore(\\n dest,\\n or(\\n and(mload(src), not(mask)),\\n and(mload(dest), mask)\\n )\\n )\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Copies an RLP item into bytes.\\n * @param _in RLP item to copy.\\n * @return Copied bytes.\\n */\\n function _copy(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in.ptr, 0, _in.length);\\n }\\n}\\n\",\"keccak256\":\"0x8338f7b6e5f0ded8fc36d9088fd127ee53ae4040ca3f4838eb6123f642d38c62\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPWriter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.7.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\n\\n/**\\n * @title Lib_RLPWriter\\n * @author Bakaoh (with modifications)\\n */\\nlibrary Lib_RLPWriter {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * RLP encodes a byte string.\\n * @param _in The byte string to encode.\\n * @return _out The RLP encoded string in bytes.\\n */\\n function writeBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n bytes memory encoded;\\n\\n if (_in.length == 1 && uint8(_in[0]) < 128) {\\n encoded = _in;\\n } else {\\n encoded = Lib_BytesUtils.concat(_writeLength(_in.length, 128), _in);\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * RLP encodes a list of RLP encoded byte byte strings.\\n * @param _in The list of RLP encoded byte strings.\\n * @return _out The RLP encoded list of items in bytes.\\n */\\n function writeList(\\n bytes[] memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n bytes memory list = _flatten(_in);\\n return Lib_BytesUtils.concat(_writeLength(list.length, 192), list);\\n }\\n\\n /**\\n * RLP encodes a string.\\n * @param _in The string to encode.\\n * @return _out The RLP encoded string in bytes.\\n */\\n function writeString(\\n string memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(bytes(_in));\\n }\\n\\n /**\\n * RLP encodes an address.\\n * @param _in The address to encode.\\n * @return _out The RLP encoded address in bytes.\\n */\\n function writeAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a uint.\\n * @param _in The uint256 to encode.\\n * @return _out The RLP encoded uint256 in bytes.\\n */\\n function writeUint(\\n uint256 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(_toBinary(_in));\\n }\\n\\n /**\\n * RLP encodes a bool.\\n * @param _in The bool to encode.\\n * @return _out The RLP encoded bool in bytes.\\n */\\n function writeBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n bytes memory encoded = new bytes(1);\\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\\n return encoded;\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\\n * @param _len The length of the string or the payload.\\n * @param _offset 128 if item is string, 192 if item is list.\\n * @return _encoded RLP encoded bytes.\\n */\\n function _writeLength(\\n uint256 _len,\\n uint256 _offset\\n )\\n private\\n pure\\n returns (\\n bytes memory _encoded\\n )\\n {\\n bytes memory encoded;\\n\\n if (_len < 56) {\\n encoded = new bytes(1);\\n encoded[0] = byte(uint8(_len) + uint8(_offset));\\n } else {\\n uint256 lenLen;\\n uint256 i = 1;\\n while (_len / i != 0) {\\n lenLen++;\\n i *= 256;\\n }\\n\\n encoded = new bytes(lenLen + 1);\\n encoded[0] = byte(uint8(lenLen) + uint8(_offset) + 55);\\n for(i = 1; i <= lenLen; i++) {\\n encoded[i] = byte(uint8((_len / (256**(lenLen-i))) % 256));\\n }\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * Encode integer in big endian binary form with no leading zeroes.\\n * @notice TODO: This should be optimized with assembly to save gas costs.\\n * @param _x The integer to encode.\\n * @return _binary RLP encoded bytes.\\n */\\n function _toBinary(\\n uint256 _x\\n )\\n private\\n pure\\n returns (\\n bytes memory _binary\\n )\\n {\\n bytes memory b = abi.encodePacked(_x);\\n\\n uint256 i = 0;\\n for (; i < 32; i++) {\\n if (b[i] != 0) {\\n break;\\n }\\n }\\n\\n bytes memory res = new bytes(32 - i);\\n for (uint256 j = 0; j < res.length; j++) {\\n res[j] = b[i++];\\n }\\n\\n return res;\\n }\\n\\n /**\\n * Copies a piece of memory to another location.\\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\\n * @param _dest Destination location.\\n * @param _src Source location.\\n * @param _len Length of memory to copy.\\n */\\n function _memcpy(\\n uint256 _dest,\\n uint256 _src,\\n uint256 _len\\n )\\n private\\n pure\\n {\\n uint256 dest = _dest;\\n uint256 src = _src;\\n uint256 len = _len;\\n\\n for(; len >= 32; len -= 32) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n dest += 32;\\n src += 32;\\n }\\n\\n uint256 mask = 256 ** (32 - len) - 1;\\n assembly {\\n let srcpart := and(mload(src), not(mask))\\n let destpart := and(mload(dest), mask)\\n mstore(dest, or(destpart, srcpart))\\n }\\n }\\n\\n /**\\n * Flattens a list of byte strings into one byte string.\\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\\n * @param _list List of byte strings to flatten.\\n * @return _flattened The flattened byte string.\\n */\\n function _flatten(\\n bytes[] memory _list\\n )\\n private\\n pure\\n returns (\\n bytes memory _flattened\\n )\\n {\\n if (_list.length == 0) {\\n return new bytes(0);\\n }\\n\\n uint256 len;\\n uint256 i = 0;\\n for (; i < _list.length; i++) {\\n len += _list[i].length;\\n }\\n\\n bytes memory flattened = new bytes(len);\\n uint256 flattenedPtr;\\n assembly { flattenedPtr := add(flattened, 0x20) }\\n\\n for(i = 0; i < _list.length; i++) {\\n bytes memory item = _list[i];\\n\\n uint256 listPtr;\\n assembly { listPtr := add(item, 0x20)}\\n\\n _memcpy(flattenedPtr, listPtr, item.length);\\n flattenedPtr += _list[i].length;\\n }\\n\\n return flattened;\\n }\\n}\",\"keccak256\":\"0x6d1aaef567f8a91bb965b95a95637f433a1f0ac4cf0bc1e209cdb1dd5b0f204b\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/trie/Lib_MerkleTrie.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.7.0;\\n\\n/* Library Imports */\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\n\\n/**\\n * @title Lib_MerkleTrie\\n */\\nlibrary Lib_MerkleTrie {\\n\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n enum NodeType {\\n BranchNode,\\n ExtensionNode,\\n LeafNode\\n }\\n\\n struct TrieNode {\\n bytes encoded;\\n Lib_RLPReader.RLPItem[] decoded;\\n }\\n\\n\\n /**********************\\n * Contract Constants *\\n **********************/\\n\\n // TREE_RADIX determines the number of elements per branch node.\\n uint256 constant TREE_RADIX = 16;\\n // Branch nodes have TREE_RADIX elements plus an additional `value` slot.\\n uint256 constant BRANCH_NODE_LENGTH = TREE_RADIX + 1;\\n // Leaf nodes and extension nodes always have two elements, a `path` and a `value`.\\n uint256 constant LEAF_OR_EXTENSION_NODE_LENGTH = 2;\\n\\n // Prefixes are prepended to the `path` within a leaf or extension node and\\n // allow us to differentiate between the two node types. `ODD` or `EVEN` is\\n // determined by the number of nibbles within the unprefixed `path`. If the\\n // number of nibbles if even, we need to insert an extra padding nibble so\\n // the resulting prefixed `path` has an even number of nibbles.\\n uint8 constant PREFIX_EXTENSION_EVEN = 0;\\n uint8 constant PREFIX_EXTENSION_ODD = 1;\\n uint8 constant PREFIX_LEAF_EVEN = 2;\\n uint8 constant PREFIX_LEAF_ODD = 3;\\n\\n // Just a utility constant. RLP represents `NULL` as 0x80.\\n bytes1 constant RLP_NULL = bytes1(0x80);\\n bytes constant RLP_NULL_BYTES = hex'80';\\n bytes32 constant internal KECCAK256_RLP_NULL_BYTES = keccak256(RLP_NULL_BYTES);\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * @notice Verifies a proof that a given key/value pair is present in the\\n * Merkle trie.\\n * @param _key Key of the node to search for, as a hex string.\\n * @param _value Value of the node to search for, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the desired node. Unlike\\n * traditional Merkle trees, this proof is executed top-down and consists\\n * of a list of RLP-encoded nodes that make a path down to the target node.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _verified `true` if the k/v pair exists in the trie, `false` otherwise.\\n */\\n function verifyInclusionProof(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bool _verified\\n )\\n {\\n (\\n bool exists,\\n bytes memory value\\n ) = get(_key, _proof, _root);\\n\\n return (\\n exists && Lib_BytesUtils.equal(_value, value)\\n );\\n }\\n\\n /**\\n * @notice Verifies a proof that a given key is *not* present in\\n * the Merkle trie.\\n * @param _key Key of the node to search for, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\\n * target node.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _verified `true` if the key is absent in the trie, `false` otherwise.\\n */\\n function verifyExclusionProof(\\n bytes memory _key,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bool _verified\\n )\\n {\\n (\\n bool exists,\\n ) = get(_key, _proof, _root);\\n\\n return exists == false;\\n }\\n\\n /**\\n * @notice Updates a Merkle trie and returns a new root hash.\\n * @param _key Key of the node to update, as a hex string.\\n * @param _value Value of the node to update, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\\n * target node. If the key exists, we can simply update the value.\\n * Otherwise, we need to modify the trie to handle the new k/v pair.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _updatedRoot Root hash of the newly constructed trie.\\n */\\n function update(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bytes32 _updatedRoot\\n )\\n {\\n // Special case when inserting the very first node.\\n if (_root == KECCAK256_RLP_NULL_BYTES) {\\n return getSingleNodeRootHash(_key, _value);\\n }\\n\\n TrieNode[] memory proof = _parseProof(_proof);\\n (uint256 pathLength, bytes memory keyRemainder, ) = _walkNodePath(proof, _key, _root);\\n TrieNode[] memory newPath = _getNewPath(proof, pathLength, keyRemainder, _value);\\n\\n return _getUpdatedTrieRoot(newPath, _key);\\n }\\n\\n /**\\n * @notice Retrieves the value associated with a given key.\\n * @param _key Key to search for, as hex bytes.\\n * @param _proof Merkle trie inclusion proof for the key.\\n * @param _root Known root of the Merkle trie.\\n * @return _exists Whether or not the key exists.\\n * @return _value Value of the key if it exists.\\n */\\n function get(\\n bytes memory _key,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bool _exists,\\n bytes memory _value\\n )\\n {\\n TrieNode[] memory proof = _parseProof(_proof);\\n (uint256 pathLength, bytes memory keyRemainder, bool isFinalNode) = _walkNodePath(proof, _key, _root);\\n\\n bool exists = keyRemainder.length == 0;\\n\\n require(\\n exists || isFinalNode,\\n \\\"Provided proof is invalid.\\\"\\n );\\n\\n bytes memory value = exists ? _getNodeValue(proof[pathLength - 1]) : bytes('');\\n\\n return (\\n exists,\\n value\\n );\\n }\\n\\n /**\\n * Computes the root hash for a trie with a single node.\\n * @param _key Key for the single node.\\n * @param _value Value for the single node.\\n * @return _updatedRoot Hash of the trie.\\n */\\n function getSingleNodeRootHash(\\n bytes memory _key,\\n bytes memory _value\\n )\\n internal\\n pure\\n returns (\\n bytes32 _updatedRoot\\n )\\n {\\n return keccak256(_makeLeafNode(\\n Lib_BytesUtils.toNibbles(_key),\\n _value\\n ).encoded);\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * @notice Walks through a proof using a provided key.\\n * @param _proof Inclusion proof to walk through.\\n * @param _key Key to use for the walk.\\n * @param _root Known root of the trie.\\n * @return _pathLength Length of the final path\\n * @return _keyRemainder Portion of the key remaining after the walk.\\n * @return _isFinalNode Whether or not we've hit a dead end.\\n */\\n function _walkNodePath(\\n TrieNode[] memory _proof,\\n bytes memory _key,\\n bytes32 _root\\n )\\n private\\n pure\\n returns (\\n uint256 _pathLength,\\n bytes memory _keyRemainder,\\n bool _isFinalNode\\n )\\n {\\n uint256 pathLength = 0;\\n bytes memory key = Lib_BytesUtils.toNibbles(_key);\\n\\n bytes32 currentNodeID = _root;\\n uint256 currentKeyIndex = 0;\\n uint256 currentKeyIncrement = 0;\\n TrieNode memory currentNode;\\n\\n // Proof is top-down, so we start at the first element (root).\\n for (uint256 i = 0; i < _proof.length; i++) {\\n currentNode = _proof[i];\\n currentKeyIndex += currentKeyIncrement;\\n\\n // Keep track of the proof elements we actually need.\\n // It's expensive to resize arrays, so this simply reduces gas costs.\\n pathLength += 1;\\n\\n if (currentKeyIndex == 0) {\\n // First proof element is always the root node.\\n require(\\n keccak256(currentNode.encoded) == currentNodeID,\\n \\\"Invalid root hash\\\"\\n );\\n } else if (currentNode.encoded.length >= 32) {\\n // Nodes 32 bytes or larger are hashed inside branch nodes.\\n require(\\n keccak256(currentNode.encoded) == currentNodeID,\\n \\\"Invalid large internal hash\\\"\\n );\\n } else {\\n // Nodes smaller than 31 bytes aren't hashed.\\n require(\\n Lib_BytesUtils.toBytes32(currentNode.encoded) == currentNodeID,\\n \\\"Invalid internal node hash\\\"\\n );\\n }\\n\\n if (currentNode.decoded.length == BRANCH_NODE_LENGTH) {\\n if (currentKeyIndex == key.length) {\\n // We've hit the end of the key, meaning the value should be within this branch node.\\n break;\\n } else {\\n // We're not at the end of the key yet.\\n // Figure out what the next node ID should be and continue.\\n uint8 branchKey = uint8(key[currentKeyIndex]);\\n Lib_RLPReader.RLPItem memory nextNode = currentNode.decoded[branchKey];\\n currentNodeID = _getNodeID(nextNode);\\n currentKeyIncrement = 1;\\n continue;\\n }\\n } else if (currentNode.decoded.length == LEAF_OR_EXTENSION_NODE_LENGTH) {\\n bytes memory path = _getNodePath(currentNode);\\n uint8 prefix = uint8(path[0]);\\n uint8 offset = 2 - prefix % 2;\\n bytes memory pathRemainder = Lib_BytesUtils.slice(path, offset);\\n bytes memory keyRemainder = Lib_BytesUtils.slice(key, currentKeyIndex);\\n uint256 sharedNibbleLength = _getSharedNibbleLength(pathRemainder, keyRemainder);\\n\\n if (prefix == PREFIX_LEAF_EVEN || prefix == PREFIX_LEAF_ODD) {\\n if (\\n pathRemainder.length == sharedNibbleLength &&\\n keyRemainder.length == sharedNibbleLength\\n ) {\\n // The key within this leaf matches our key exactly.\\n // Increment the key index to reflect that we have no remainder.\\n currentKeyIndex += sharedNibbleLength;\\n }\\n\\n // We've hit a leaf node, so our next node should be NULL.\\n currentNodeID = bytes32(RLP_NULL);\\n break;\\n } else if (prefix == PREFIX_EXTENSION_EVEN || prefix == PREFIX_EXTENSION_ODD) {\\n if (sharedNibbleLength == 0) {\\n // Our extension node doesn't share any part of our key.\\n // We've hit the end of this path, updates will need to modify this extension.\\n currentNodeID = bytes32(RLP_NULL);\\n break;\\n } else {\\n // Our extension shares some nibbles.\\n // Carry on to the next node.\\n currentNodeID = _getNodeID(currentNode.decoded[1]);\\n currentKeyIncrement = sharedNibbleLength;\\n continue;\\n }\\n } else {\\n revert(\\\"Received a node with an unknown prefix\\\");\\n }\\n } else {\\n revert(\\\"Received an unparseable node.\\\");\\n }\\n }\\n\\n // If our node ID is NULL, then we're at a dead end.\\n bool isFinalNode = currentNodeID == bytes32(RLP_NULL);\\n return (pathLength, Lib_BytesUtils.slice(key, currentKeyIndex), isFinalNode);\\n }\\n\\n /**\\n * @notice Creates new nodes to support a k/v pair insertion into a given\\n * Merkle trie path.\\n * @param _path Path to the node nearest the k/v pair.\\n * @param _pathLength Length of the path. Necessary because the provided\\n * path may include additional nodes (e.g., it comes directly from a proof)\\n * and we can't resize in-memory arrays without costly duplication.\\n * @param _keyRemainder Portion of the initial key that must be inserted\\n * into the trie.\\n * @param _value Value to insert at the given key.\\n * @return _newPath A new path with the inserted k/v pair and extra supporting nodes.\\n */\\n function _getNewPath(\\n TrieNode[] memory _path,\\n uint256 _pathLength,\\n bytes memory _keyRemainder,\\n bytes memory _value\\n )\\n private\\n pure\\n returns (\\n TrieNode[] memory _newPath\\n )\\n {\\n bytes memory keyRemainder = _keyRemainder;\\n\\n // Most of our logic depends on the status of the last node in the path.\\n TrieNode memory lastNode = _path[_pathLength - 1];\\n NodeType lastNodeType = _getNodeType(lastNode);\\n\\n // Create an array for newly created nodes.\\n // We need up to three new nodes, depending on the contents of the last node.\\n // Since array resizing is expensive, we'll keep track of the size manually.\\n // We're using an explicit `totalNewNodes += 1` after insertions for clarity.\\n TrieNode[] memory newNodes = new TrieNode[](3);\\n uint256 totalNewNodes = 0;\\n\\n if (keyRemainder.length == 0 && lastNodeType == NodeType.LeafNode) {\\n // We've found a leaf node with the given key.\\n // Simply need to update the value of the node to match.\\n newNodes[totalNewNodes] = _makeLeafNode(_getNodeKey(lastNode), _value);\\n totalNewNodes += 1;\\n } else if (lastNodeType == NodeType.BranchNode) {\\n if (keyRemainder.length == 0) {\\n // We've found a branch node with the given key.\\n // Simply need to update the value of the node to match.\\n newNodes[totalNewNodes] = _editBranchValue(lastNode, _value);\\n totalNewNodes += 1;\\n } else {\\n // We've found a branch node, but it doesn't contain our key.\\n // Reinsert the old branch for now.\\n newNodes[totalNewNodes] = lastNode;\\n totalNewNodes += 1;\\n // Create a new leaf node, slicing our remainder since the first byte points\\n // to our branch node.\\n newNodes[totalNewNodes] = _makeLeafNode(Lib_BytesUtils.slice(keyRemainder, 1), _value);\\n totalNewNodes += 1;\\n }\\n } else {\\n // Our last node is either an extension node or a leaf node with a different key.\\n bytes memory lastNodeKey = _getNodeKey(lastNode);\\n uint256 sharedNibbleLength = _getSharedNibbleLength(lastNodeKey, keyRemainder);\\n\\n if (sharedNibbleLength != 0) {\\n // We've got some shared nibbles between the last node and our key remainder.\\n // We'll need to insert an extension node that covers these shared nibbles.\\n bytes memory nextNodeKey = Lib_BytesUtils.slice(lastNodeKey, 0, sharedNibbleLength);\\n newNodes[totalNewNodes] = _makeExtensionNode(nextNodeKey, _getNodeHash(_value));\\n totalNewNodes += 1;\\n\\n // Cut down the keys since we've just covered these shared nibbles.\\n lastNodeKey = Lib_BytesUtils.slice(lastNodeKey, sharedNibbleLength);\\n keyRemainder = Lib_BytesUtils.slice(keyRemainder, sharedNibbleLength);\\n }\\n\\n // Create an empty branch to fill in.\\n TrieNode memory newBranch = _makeEmptyBranchNode();\\n\\n if (lastNodeKey.length == 0) {\\n // Key remainder was larger than the key for our last node.\\n // The value within our last node is therefore going to be shifted into\\n // a branch value slot.\\n newBranch = _editBranchValue(newBranch, _getNodeValue(lastNode));\\n } else {\\n // Last node key was larger than the key remainder.\\n // We're going to modify some index of our branch.\\n uint8 branchKey = uint8(lastNodeKey[0]);\\n // Move on to the next nibble.\\n lastNodeKey = Lib_BytesUtils.slice(lastNodeKey, 1);\\n\\n if (lastNodeType == NodeType.LeafNode) {\\n // We're dealing with a leaf node.\\n // We'll modify the key and insert the old leaf node into the branch index.\\n TrieNode memory modifiedLastNode = _makeLeafNode(lastNodeKey, _getNodeValue(lastNode));\\n newBranch = _editBranchIndex(newBranch, branchKey, _getNodeHash(modifiedLastNode.encoded));\\n } else if (lastNodeKey.length != 0) {\\n // We're dealing with a shrinking extension node.\\n // We need to modify the node to decrease the size of the key.\\n TrieNode memory modifiedLastNode = _makeExtensionNode(lastNodeKey, _getNodeValue(lastNode));\\n newBranch = _editBranchIndex(newBranch, branchKey, _getNodeHash(modifiedLastNode.encoded));\\n } else {\\n // We're dealing with an unnecessary extension node.\\n // We're going to delete the node entirely.\\n // Simply insert its current value into the branch index.\\n newBranch = _editBranchIndex(newBranch, branchKey, _getNodeValue(lastNode));\\n }\\n }\\n\\n if (keyRemainder.length == 0) {\\n // We've got nothing left in the key remainder.\\n // Simply insert the value into the branch value slot.\\n newBranch = _editBranchValue(newBranch, _value);\\n // Push the branch into the list of new nodes.\\n newNodes[totalNewNodes] = newBranch;\\n totalNewNodes += 1;\\n } else {\\n // We've got some key remainder to work with.\\n // We'll be inserting a leaf node into the trie.\\n // First, move on to the next nibble.\\n keyRemainder = Lib_BytesUtils.slice(keyRemainder, 1);\\n // Push the branch into the list of new nodes.\\n newNodes[totalNewNodes] = newBranch;\\n totalNewNodes += 1;\\n // Push a new leaf node for our k/v pair.\\n newNodes[totalNewNodes] = _makeLeafNode(keyRemainder, _value);\\n totalNewNodes += 1;\\n }\\n }\\n\\n // Finally, join the old path with our newly created nodes.\\n // Since we're overwriting the last node in the path, we use `_pathLength - 1`.\\n return _joinNodeArrays(_path, _pathLength - 1, newNodes, totalNewNodes);\\n }\\n\\n /**\\n * @notice Computes the trie root from a given path.\\n * @param _nodes Path to some k/v pair.\\n * @param _key Key for the k/v pair.\\n * @return _updatedRoot Root hash for the updated trie.\\n */\\n function _getUpdatedTrieRoot(\\n TrieNode[] memory _nodes,\\n bytes memory _key\\n )\\n private\\n pure\\n returns (\\n bytes32 _updatedRoot\\n )\\n {\\n bytes memory key = Lib_BytesUtils.toNibbles(_key);\\n\\n // Some variables to keep track of during iteration.\\n TrieNode memory currentNode;\\n NodeType currentNodeType;\\n bytes memory previousNodeHash;\\n\\n // Run through the path backwards to rebuild our root hash.\\n for (uint256 i = _nodes.length; i > 0; i--) {\\n // Pick out the current node.\\n currentNode = _nodes[i - 1];\\n currentNodeType = _getNodeType(currentNode);\\n\\n if (currentNodeType == NodeType.LeafNode) {\\n // Leaf nodes are already correctly encoded.\\n // Shift the key over to account for the nodes key.\\n bytes memory nodeKey = _getNodeKey(currentNode);\\n key = Lib_BytesUtils.slice(key, 0, key.length - nodeKey.length);\\n } else if (currentNodeType == NodeType.ExtensionNode) {\\n // Shift the key over to account for the nodes key.\\n bytes memory nodeKey = _getNodeKey(currentNode);\\n key = Lib_BytesUtils.slice(key, 0, key.length - nodeKey.length);\\n\\n // If this node is the last element in the path, it'll be correctly encoded\\n // and we can skip this part.\\n if (previousNodeHash.length > 0) {\\n // Re-encode the node based on the previous node.\\n currentNode = _makeExtensionNode(nodeKey, previousNodeHash);\\n }\\n } else if (currentNodeType == NodeType.BranchNode) {\\n // If this node is the last element in the path, it'll be correctly encoded\\n // and we can skip this part.\\n if (previousNodeHash.length > 0) {\\n // Re-encode the node based on the previous node.\\n uint8 branchKey = uint8(key[key.length - 1]);\\n key = Lib_BytesUtils.slice(key, 0, key.length - 1);\\n currentNode = _editBranchIndex(currentNode, branchKey, previousNodeHash);\\n }\\n }\\n\\n // Compute the node hash for the next iteration.\\n previousNodeHash = _getNodeHash(currentNode.encoded);\\n }\\n\\n // Current node should be the root at this point.\\n // Simply return the hash of its encoding.\\n return keccak256(currentNode.encoded);\\n }\\n\\n /**\\n * @notice Parses an RLP-encoded proof into something more useful.\\n * @param _proof RLP-encoded proof to parse.\\n * @return _parsed Proof parsed into easily accessible structs.\\n */\\n function _parseProof(\\n bytes memory _proof\\n )\\n private\\n pure\\n returns (\\n TrieNode[] memory _parsed\\n )\\n {\\n Lib_RLPReader.RLPItem[] memory nodes = Lib_RLPReader.readList(_proof);\\n TrieNode[] memory proof = new TrieNode[](nodes.length);\\n\\n for (uint256 i = 0; i < nodes.length; i++) {\\n bytes memory encoded = Lib_RLPReader.readBytes(nodes[i]);\\n proof[i] = TrieNode({\\n encoded: encoded,\\n decoded: Lib_RLPReader.readList(encoded)\\n });\\n }\\n\\n return proof;\\n }\\n\\n /**\\n * @notice Picks out the ID for a node. Node ID is referred to as the\\n * \\\"hash\\\" within the specification, but nodes < 32 bytes are not actually\\n * hashed.\\n * @param _node Node to pull an ID for.\\n * @return _nodeID ID for the node, depending on the size of its contents.\\n */\\n function _getNodeID(\\n Lib_RLPReader.RLPItem memory _node\\n )\\n private\\n pure\\n returns (\\n bytes32 _nodeID\\n )\\n {\\n bytes memory nodeID;\\n\\n if (_node.length < 32) {\\n // Nodes smaller than 32 bytes are RLP encoded.\\n nodeID = Lib_RLPReader.readRawBytes(_node);\\n } else {\\n // Nodes 32 bytes or larger are hashed.\\n nodeID = Lib_RLPReader.readBytes(_node);\\n }\\n\\n return Lib_BytesUtils.toBytes32(nodeID);\\n }\\n\\n /**\\n * @notice Gets the path for a leaf or extension node.\\n * @param _node Node to get a path for.\\n * @return _path Node path, converted to an array of nibbles.\\n */\\n function _getNodePath(\\n TrieNode memory _node\\n )\\n private\\n pure\\n returns (\\n bytes memory _path\\n )\\n {\\n return Lib_BytesUtils.toNibbles(Lib_RLPReader.readBytes(_node.decoded[0]));\\n }\\n\\n /**\\n * @notice Gets the key for a leaf or extension node. Keys are essentially\\n * just paths without any prefix.\\n * @param _node Node to get a key for.\\n * @return _key Node key, converted to an array of nibbles.\\n */\\n function _getNodeKey(\\n TrieNode memory _node\\n )\\n private\\n pure\\n returns (\\n bytes memory _key\\n )\\n {\\n return _removeHexPrefix(_getNodePath(_node));\\n }\\n\\n /**\\n * @notice Gets the path for a node.\\n * @param _node Node to get a value for.\\n * @return _value Node value, as hex bytes.\\n */\\n function _getNodeValue(\\n TrieNode memory _node\\n )\\n private\\n pure\\n returns (\\n bytes memory _value\\n )\\n {\\n return Lib_RLPReader.readBytes(_node.decoded[_node.decoded.length - 1]);\\n }\\n\\n /**\\n * @notice Computes the node hash for an encoded node. Nodes < 32 bytes\\n * are not hashed, all others are keccak256 hashed.\\n * @param _encoded Encoded node to hash.\\n * @return _hash Hash of the encoded node. Simply the input if < 32 bytes.\\n */\\n function _getNodeHash(\\n bytes memory _encoded\\n )\\n private\\n pure\\n returns (\\n bytes memory _hash\\n )\\n {\\n if (_encoded.length < 32) {\\n return _encoded;\\n } else {\\n return abi.encodePacked(keccak256(_encoded));\\n }\\n }\\n\\n /**\\n * @notice Determines the type for a given node.\\n * @param _node Node to determine a type for.\\n * @return _type Type of the node; BranchNode/ExtensionNode/LeafNode.\\n */\\n function _getNodeType(\\n TrieNode memory _node\\n )\\n private\\n pure\\n returns (\\n NodeType _type\\n )\\n {\\n if (_node.decoded.length == BRANCH_NODE_LENGTH) {\\n return NodeType.BranchNode;\\n } else if (_node.decoded.length == LEAF_OR_EXTENSION_NODE_LENGTH) {\\n bytes memory path = _getNodePath(_node);\\n uint8 prefix = uint8(path[0]);\\n\\n if (prefix == PREFIX_LEAF_EVEN || prefix == PREFIX_LEAF_ODD) {\\n return NodeType.LeafNode;\\n } else if (prefix == PREFIX_EXTENSION_EVEN || prefix == PREFIX_EXTENSION_ODD) {\\n return NodeType.ExtensionNode;\\n }\\n }\\n\\n revert(\\\"Invalid node type\\\");\\n }\\n\\n /**\\n * @notice Utility; determines the number of nibbles shared between two\\n * nibble arrays.\\n * @param _a First nibble array.\\n * @param _b Second nibble array.\\n * @return _shared Number of shared nibbles.\\n */\\n function _getSharedNibbleLength(\\n bytes memory _a,\\n bytes memory _b\\n )\\n private\\n pure\\n returns (\\n uint256 _shared\\n )\\n {\\n uint256 i = 0;\\n while (_a.length > i && _b.length > i && _a[i] == _b[i]) {\\n i++;\\n }\\n return i;\\n }\\n\\n /**\\n * @notice Utility; converts an RLP-encoded node into our nice struct.\\n * @param _raw RLP-encoded node to convert.\\n * @return _node Node as a TrieNode struct.\\n */\\n function _makeNode(\\n bytes[] memory _raw\\n )\\n private\\n pure\\n returns (\\n TrieNode memory _node\\n )\\n {\\n bytes memory encoded = Lib_RLPWriter.writeList(_raw);\\n\\n return TrieNode({\\n encoded: encoded,\\n decoded: Lib_RLPReader.readList(encoded)\\n });\\n }\\n\\n /**\\n * @notice Utility; converts an RLP-decoded node into our nice struct.\\n * @param _items RLP-decoded node to convert.\\n * @return _node Node as a TrieNode struct.\\n */\\n function _makeNode(\\n Lib_RLPReader.RLPItem[] memory _items\\n )\\n private\\n pure\\n returns (\\n TrieNode memory _node\\n )\\n {\\n bytes[] memory raw = new bytes[](_items.length);\\n for (uint256 i = 0; i < _items.length; i++) {\\n raw[i] = Lib_RLPReader.readRawBytes(_items[i]);\\n }\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Creates a new extension node.\\n * @param _key Key for the extension node, unprefixed.\\n * @param _value Value for the extension node.\\n * @return _node New extension node with the given k/v pair.\\n */\\n function _makeExtensionNode(\\n bytes memory _key,\\n bytes memory _value\\n )\\n private\\n pure\\n returns (\\n TrieNode memory _node\\n )\\n {\\n bytes[] memory raw = new bytes[](2);\\n bytes memory key = _addHexPrefix(_key, false);\\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\\n raw[1] = Lib_RLPWriter.writeBytes(_value);\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Creates a new leaf node.\\n * @dev This function is essentially identical to `_makeExtensionNode`.\\n * Although we could route both to a single method with a flag, it's\\n * more gas efficient to keep them separate and duplicate the logic.\\n * @param _key Key for the leaf node, unprefixed.\\n * @param _value Value for the leaf node.\\n * @return _node New leaf node with the given k/v pair.\\n */\\n function _makeLeafNode(\\n bytes memory _key,\\n bytes memory _value\\n )\\n private\\n pure\\n returns (\\n TrieNode memory _node\\n )\\n {\\n bytes[] memory raw = new bytes[](2);\\n bytes memory key = _addHexPrefix(_key, true);\\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\\n raw[1] = Lib_RLPWriter.writeBytes(_value);\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Creates an empty branch node.\\n * @return _node Empty branch node as a TrieNode struct.\\n */\\n function _makeEmptyBranchNode()\\n private\\n pure\\n returns (\\n TrieNode memory _node\\n )\\n {\\n bytes[] memory raw = new bytes[](BRANCH_NODE_LENGTH);\\n for (uint256 i = 0; i < raw.length; i++) {\\n raw[i] = RLP_NULL_BYTES;\\n }\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Modifies the value slot for a given branch.\\n * @param _branch Branch node to modify.\\n * @param _value Value to insert into the branch.\\n * @return _updatedNode Modified branch node.\\n */\\n function _editBranchValue(\\n TrieNode memory _branch,\\n bytes memory _value\\n )\\n private\\n pure\\n returns (\\n TrieNode memory _updatedNode\\n )\\n {\\n bytes memory encoded = Lib_RLPWriter.writeBytes(_value);\\n _branch.decoded[_branch.decoded.length - 1] = Lib_RLPReader.toRLPItem(encoded);\\n return _makeNode(_branch.decoded);\\n }\\n\\n /**\\n * @notice Modifies a slot at an index for a given branch.\\n * @param _branch Branch node to modify.\\n * @param _index Slot index to modify.\\n * @param _value Value to insert into the slot.\\n * @return _updatedNode Modified branch node.\\n */\\n function _editBranchIndex(\\n TrieNode memory _branch,\\n uint8 _index,\\n bytes memory _value\\n )\\n private\\n pure\\n returns (\\n TrieNode memory _updatedNode\\n )\\n {\\n bytes memory encoded = _value.length < 32 ? _value : Lib_RLPWriter.writeBytes(_value);\\n _branch.decoded[_index] = Lib_RLPReader.toRLPItem(encoded);\\n return _makeNode(_branch.decoded);\\n }\\n\\n /**\\n * @notice Utility; adds a prefix to a key.\\n * @param _key Key to prefix.\\n * @param _isLeaf Whether or not the key belongs to a leaf.\\n * @return _prefixedKey Prefixed key.\\n */\\n function _addHexPrefix(\\n bytes memory _key,\\n bool _isLeaf\\n )\\n private\\n pure\\n returns (\\n bytes memory _prefixedKey\\n )\\n {\\n uint8 prefix = _isLeaf ? uint8(0x02) : uint8(0x00);\\n uint8 offset = uint8(_key.length % 2);\\n bytes memory prefixed = new bytes(2 - offset);\\n prefixed[0] = bytes1(prefix + offset);\\n return Lib_BytesUtils.concat(prefixed, _key);\\n }\\n\\n /**\\n * @notice Utility; removes a prefix from a path.\\n * @param _path Path to remove the prefix from.\\n * @return _unprefixedKey Unprefixed key.\\n */\\n function _removeHexPrefix(\\n bytes memory _path\\n )\\n private\\n pure\\n returns (\\n bytes memory _unprefixedKey\\n )\\n {\\n if (uint8(_path[0]) % 2 == 0) {\\n return Lib_BytesUtils.slice(_path, 2);\\n } else {\\n return Lib_BytesUtils.slice(_path, 1);\\n }\\n }\\n\\n /**\\n * @notice Utility; combines two node arrays. Array lengths are required\\n * because the actual lengths may be longer than the filled lengths.\\n * Array resizing is extremely costly and should be avoided.\\n * @param _a First array to join.\\n * @param _aLength Length of the first array.\\n * @param _b Second array to join.\\n * @param _bLength Length of the second array.\\n * @return _joined Combined node array.\\n */\\n function _joinNodeArrays(\\n TrieNode[] memory _a,\\n uint256 _aLength,\\n TrieNode[] memory _b,\\n uint256 _bLength\\n )\\n private\\n pure\\n returns (\\n TrieNode[] memory _joined\\n )\\n {\\n TrieNode[] memory ret = new TrieNode[](_aLength + _bLength);\\n\\n // Copy elements from the first array.\\n for (uint256 i = 0; i < _aLength; i++) {\\n ret[i] = _a[i];\\n }\\n\\n // Copy elements from the second array.\\n for (uint256 i = 0; i < _bLength; i++) {\\n ret[i + _aLength] = _b[i];\\n }\\n\\n return ret;\\n }\\n}\\n\",\"keccak256\":\"0xe84d904dcf0c03d5ebd0792c3aee70bf32e94513f3d3ac3636b53937116efd49\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/trie/Lib_SecureMerkleTrie.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_MerkleTrie } from \\\"./Lib_MerkleTrie.sol\\\";\\n\\n/**\\n * @title Lib_SecureMerkleTrie\\n */\\nlibrary Lib_SecureMerkleTrie {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * @notice Verifies a proof that a given key/value pair is present in the\\n * Merkle trie.\\n * @param _key Key of the node to search for, as a hex string.\\n * @param _value Value of the node to search for, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the desired node. Unlike\\n * traditional Merkle trees, this proof is executed top-down and consists\\n * of a list of RLP-encoded nodes that make a path down to the target node.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _verified `true` if the k/v pair exists in the trie, `false` otherwise.\\n */\\n function verifyInclusionProof(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bool _verified\\n )\\n {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.verifyInclusionProof(key, _value, _proof, _root);\\n }\\n\\n /**\\n * @notice Verifies a proof that a given key is *not* present in\\n * the Merkle trie.\\n * @param _key Key of the node to search for, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\\n * target node.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _verified `true` if the key is not present in the trie, `false` otherwise.\\n */\\n function verifyExclusionProof(\\n bytes memory _key,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bool _verified\\n )\\n {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.verifyExclusionProof(key, _proof, _root);\\n }\\n\\n /**\\n * @notice Updates a Merkle trie and returns a new root hash.\\n * @param _key Key of the node to update, as a hex string.\\n * @param _value Value of the node to update, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\\n * target node. If the key exists, we can simply update the value.\\n * Otherwise, we need to modify the trie to handle the new k/v pair.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _updatedRoot Root hash of the newly constructed trie.\\n */\\n function update(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bytes32 _updatedRoot\\n )\\n {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.update(key, _value, _proof, _root);\\n }\\n\\n /**\\n * @notice Retrieves the value associated with a given key.\\n * @param _key Key to search for, as hex bytes.\\n * @param _proof Merkle trie inclusion proof for the key.\\n * @param _root Known root of the Merkle trie.\\n * @return _exists Whether or not the key exists.\\n * @return _value Value of the key if it exists.\\n */\\n function get(\\n bytes memory _key,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bool _exists,\\n bytes memory _value\\n )\\n {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.get(key, _proof, _root);\\n }\\n\\n /**\\n * Computes the root hash for a trie with a single node.\\n * @param _key Key for the single node.\\n * @param _value Value for the single node.\\n * @return _updatedRoot Hash of the trie.\\n */\\n function getSingleNodeRootHash(\\n bytes memory _key,\\n bytes memory _value\\n )\\n internal\\n pure\\n returns (\\n bytes32 _updatedRoot\\n )\\n {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.getSingleNodeRootHash(key, _value);\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Computes the secure counterpart to a key.\\n * @param _key Key to get a secure key from.\\n * @return _secureKey Secure version of the key.\\n */\\n function _getSecureKey(\\n bytes memory _key\\n )\\n private\\n pure\\n returns (\\n bytes memory _secureKey\\n )\\n {\\n return abi.encodePacked(keccak256(_key));\\n }\\n}\",\"keccak256\":\"0x79355346f74bb1eb9eeb733cb5d9677d50115c4f390307cbf608fe071a1ada0c\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_Bytes32Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.7.0;\\n\\n/**\\n * @title Lib_Byte32Utils\\n */\\nlibrary Lib_Bytes32Utils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function toBool(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bool _out\\n )\\n {\\n return _in != 0;\\n }\\n\\n function fromBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes32 _out\\n )\\n {\\n return bytes32(uint256(_in ? 1 : 0));\\n }\\n\\n function toAddress(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n address _out\\n )\\n {\\n return address(uint160(uint256(_in)));\\n }\\n\\n function fromAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes32 _out\\n )\\n {\\n return bytes32(uint256(_in));\\n }\\n\\n function removeLeadingZeros(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n bytes memory out;\\n\\n assembly {\\n // Figure out how many leading zero bytes to remove.\\n let shift := 0\\n for { let i := 0 } and(lt(i, 32), eq(byte(i, _in), 0)) { i := add(i, 1) } {\\n shift := add(shift, 1)\\n }\\n\\n // Reserve some space for our output and fix the free memory pointer.\\n out := mload(0x40)\\n mstore(0x40, add(out, 0x40))\\n\\n // Shift the value and store it into the output bytes.\\n mstore(add(out, 0x20), shl(mul(shift, 8), _in))\\n\\n // Store the new size (with leading zero bytes removed) in the output byte size.\\n mstore(out, sub(32, shift))\\n }\\n\\n return out;\\n }\\n}\\n\",\"keccak256\":\"0x06f97590a80a01daa3bf6aa795449aea91a78684c646b4a6caeece8ef919c80c\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_BytesUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.7.0;\\n\\n/**\\n * @title Lib_BytesUtils\\n */\\nlibrary Lib_BytesUtils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function concat(\\n bytes memory _preBytes,\\n bytes memory _postBytes\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n bytes memory tempBytes;\\n\\n assembly {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // Store the length of the first bytes array at the beginning of\\n // the memory for tempBytes.\\n let length := mload(_preBytes)\\n mstore(tempBytes, length)\\n\\n // Maintain a memory counter for the current write location in the\\n // temp bytes array by adding the 32 bytes for the array length to\\n // the starting location.\\n let mc := add(tempBytes, 0x20)\\n // Stop copying when the memory counter reaches the length of the\\n // first bytes array.\\n let end := add(mc, length)\\n\\n for {\\n // Initialize a copy counter to the start of the _preBytes data,\\n // 32 bytes into its memory.\\n let cc := add(_preBytes, 0x20)\\n } lt(mc, end) {\\n // Increase both counters by 32 bytes each iteration.\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n // Write the _preBytes data into the tempBytes memory 32 bytes\\n // at a time.\\n mstore(mc, mload(cc))\\n }\\n\\n // Add the length of _postBytes to the current length of tempBytes\\n // and store it as the new length in the first 32 bytes of the\\n // tempBytes memory.\\n length := mload(_postBytes)\\n mstore(tempBytes, add(length, mload(tempBytes)))\\n\\n // Move the memory counter back from a multiple of 0x20 to the\\n // actual end of the _preBytes data.\\n mc := end\\n // Stop copying when the memory counter reaches the new combined\\n // length of the arrays.\\n end := add(mc, length)\\n\\n for {\\n let cc := add(_postBytes, 0x20)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n // Update the free-memory pointer by padding our last write location\\n // to 32 bytes: add 31 bytes to the end of tempBytes to move to the\\n // next 32 byte block, then round down to the nearest multiple of\\n // 32. If the sum of the length of the two arrays is zero then add\\n // one before rounding down to leave a blank 32 bytes (the length block with 0).\\n mstore(0x40, and(\\n add(add(end, iszero(add(length, mload(_preBytes)))), 31),\\n not(31) // Round down to the nearest 32 bytes.\\n ))\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_start + _length >= _start, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n if (_bytes.length - _start == 0) {\\n return bytes('');\\n }\\n\\n return slice(_bytes, _start, _bytes.length - _start);\\n }\\n\\n function toBytes32PadLeft(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes32)\\n {\\n bytes32 ret;\\n uint256 len = _bytes.length <= 32 ? _bytes.length : 32;\\n assembly {\\n ret := shr(mul(sub(32, len), 8), mload(add(_bytes, 32)))\\n }\\n return ret;\\n }\\n\\n function toBytes32(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes32)\\n {\\n if (_bytes.length < 32) {\\n bytes32 ret;\\n assembly {\\n ret := mload(add(_bytes, 32))\\n }\\n return ret;\\n }\\n\\n return abi.decode(_bytes,(bytes32)); // will truncate if input length > 32 bytes\\n }\\n\\n function toUint256(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (uint256)\\n {\\n return uint256(toBytes32(_bytes));\\n }\\n\\n function toUint24(bytes memory _bytes, uint256 _start) internal pure returns (uint24) {\\n require(_start + 3 >= _start, \\\"toUint24_overflow\\\");\\n require(_bytes.length >= _start + 3 , \\\"toUint24_outOfBounds\\\");\\n uint24 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x3), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toUint8(bytes memory _bytes, uint256 _start) internal pure returns (uint8) {\\n require(_start + 1 >= _start, \\\"toUint8_overflow\\\");\\n require(_bytes.length >= _start + 1 , \\\"toUint8_outOfBounds\\\");\\n uint8 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x1), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toAddress(bytes memory _bytes, uint256 _start) internal pure returns (address) {\\n require(_start + 20 >= _start, \\\"toAddress_overflow\\\");\\n require(_bytes.length >= _start + 20, \\\"toAddress_outOfBounds\\\");\\n address tempAddress;\\n\\n assembly {\\n tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000)\\n }\\n\\n return tempAddress;\\n }\\n\\n function toNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n bytes memory nibbles = new bytes(_bytes.length * 2);\\n\\n for (uint256 i = 0; i < _bytes.length; i++) {\\n nibbles[i * 2] = _bytes[i] >> 4;\\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\\n }\\n\\n return nibbles;\\n }\\n\\n function fromNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n bytes memory ret = new bytes(_bytes.length / 2);\\n\\n for (uint256 i = 0; i < ret.length; i++) {\\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\\n }\\n\\n return ret;\\n }\\n\\n function equal(\\n bytes memory _bytes,\\n bytes memory _other\\n )\\n internal\\n pure\\n returns (bool)\\n {\\n return keccak256(_bytes) == keccak256(_other);\\n }\\n}\\n\",\"keccak256\":\"0x849e4fedd81cd260e4c3b74b953f00636323574c60d363f36ab331e94aab9219\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_ReentrancyGuard.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// +build ovm\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @dev Contract module that helps prevent reentrant calls to a function.\\n *\\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\\n * available, which can be applied to functions to make sure there are no nested\\n * (reentrant) calls to them.\\n *\\n * Note that because there is a single `nonReentrant` guard, functions marked as\\n * `nonReentrant` may not call one another. This can be worked around by making\\n * those functions `private`, and then adding `external` `nonReentrant` entry\\n * points to them.\\n *\\n * TIP: If you would like to learn more about reentrancy and alternative ways\\n * to protect against it, check out our blog post\\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\\n */\\nabstract contract Lib_ReentrancyGuard {\\n // Booleans are more expensive than uint256 or any type that takes up a full\\n // word because each write operation emits an extra SLOAD to first read the\\n // slot's contents, replace the bits taken up by the boolean, and then write\\n // back. This is the compiler's defense against contract upgrades and\\n // pointer aliasing, and it cannot be disabled.\\n\\n // The values being non-zero value makes deployment a bit more expensive,\\n // but in exchange the refund on every call to nonReentrant will be lower in\\n // amount. Since refunds are capped to a percentage of the total\\n // transaction's gas, it is best to keep them low in cases like this one, to\\n // increase the likelihood of the full refund coming into effect.\\n uint256 private constant _NOT_ENTERED = 1;\\n uint256 private constant _ENTERED = 2;\\n\\n uint256 private _status;\\n\\n constructor () internal {\\n _status = _NOT_ENTERED;\\n }\\n\\n /**\\n * @dev Prevents a contract from calling itself, directly or indirectly.\\n * Calling a `nonReentrant` function from another `nonReentrant`\\n * function is not supported. It is possible to prevent this from happening\\n * by making the `nonReentrant` function external, and make it call a\\n * `private` function that does the actual work.\\n */\\n modifier nonReentrant() {\\n // On the first call to nonReentrant, _notEntered will be true\\n require(_status != _ENTERED, \\\"ReentrancyGuard: reentrant call\\\");\\n\\n // Any calls to nonReentrant after this point will fail\\n _status = _ENTERED;\\n\\n _;\\n\\n // By storing the original value once again, a refund is triggered (see\\n // https://eips.ethereum.org/EIPS/eip-2200)\\n _status = _NOT_ENTERED;\\n }\\n}\\n\",\"keccak256\":\"0x8cb909f4039d8d9770578c6c469e8f3cfcbb6088c209ce663742c023920af9c1\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.7.0;\\n\\n/**\\n * @title Lib_SafeExecutionManagerWrapper\\n */\\nlibrary Lib_SafeExecutionManagerWrapper {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Makes an ovmCALL and performs all the necessary safety checks.\\n * @param _gasLimit Gas limit for the call.\\n * @param _target Address to call.\\n * @param _calldata Data to send to the call.\\n * @return _success Whether or not the call reverted.\\n * @return _returndata Data returned by the call.\\n */\\n function safeCALL(\\n uint256 _gasLimit,\\n address _target,\\n bytes memory _calldata\\n )\\n internal\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCALL(uint256,address,bytes)\\\",\\n _gasLimit,\\n _target,\\n _calldata\\n )\\n );\\n\\n return abi.decode(returndata, (bool, bytes));\\n }\\n\\n /**\\n * Makes an ovmCALL and performs all the necessary safety checks.\\n * @param _gasLimit Gas limit for the call.\\n * @param _target Address to call.\\n * @param _calldata Data to send to the call.\\n * @return _success Whether or not the call reverted.\\n * @return _returndata Data returned by the call.\\n */\\n function safeDELEGATECALL(\\n uint256 _gasLimit,\\n address _target,\\n bytes memory _calldata\\n )\\n internal\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmDELEGATECALL(uint256,address,bytes)\\\",\\n _gasLimit,\\n _target,\\n _calldata\\n )\\n );\\n\\n return abi.decode(returndata, (bool, bytes));\\n }\\n\\n /**\\n * Performs an ovmCREATE and the necessary safety checks.\\n * @param _gasLimit Gas limit for the creation.\\n * @param _bytecode Code for the new contract.\\n * @return _contract Address of the created contract.\\n */\\n function safeCREATE(\\n uint256 _gasLimit,\\n bytes memory _bytecode\\n )\\n internal\\n returns (\\n address _contract\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n _gasLimit,\\n abi.encodeWithSignature(\\n \\\"ovmCREATE(bytes)\\\",\\n _bytecode\\n )\\n );\\n\\n return abi.decode(returndata, (address));\\n }\\n\\n /**\\n * Performs an ovmEXTCODESIZE and the necessary safety checks.\\n * @param _contract Address of the contract to query the size of.\\n * @return _EXTCODESIZE Size of the requested contract in bytes.\\n */\\n function safeEXTCODESIZE(\\n address _contract\\n )\\n internal\\n returns (\\n uint256 _EXTCODESIZE\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmEXTCODESIZE(address)\\\",\\n _contract\\n )\\n );\\n\\n return abi.decode(returndata, (uint256));\\n }\\n\\n /**\\n * Performs a safe ovmCHAINID call.\\n * @return _CHAINID Result of calling ovmCHAINID.\\n */\\n function safeCHAINID()\\n internal\\n returns (\\n uint256 _CHAINID\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCHAINID()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (uint256));\\n }\\n\\n /**\\n * Performs a safe ovmCALLER call.\\n * @return _CALLER Result of calling ovmCALLER.\\n */\\n function safeCALLER()\\n internal\\n returns (\\n address _CALLER\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCALLER()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (address));\\n }\\n\\n /**\\n * Performs a safe ovmADDRESS call.\\n * @return _ADDRESS Result of calling ovmADDRESS.\\n */\\n function safeADDRESS()\\n internal\\n returns (\\n address _ADDRESS\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmADDRESS()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (address));\\n }\\n\\n /**\\n * Performs a safe ovmGETNONCE call.\\n * @return _nonce Result of calling ovmGETNONCE.\\n */\\n function safeGETNONCE()\\n internal\\n returns (\\n uint256 _nonce\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmGETNONCE()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (uint256));\\n }\\n\\n /**\\n * Performs a safe ovmSETNONCE call.\\n * @param _nonce New account nonce.\\n */\\n function safeSETNONCE(\\n uint256 _nonce\\n )\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmSETNONCE(uint256)\\\",\\n _nonce\\n )\\n );\\n }\\n\\n /**\\n * Performs a safe ovmCREATEEOA call.\\n * @param _messageHash Message hash which was signed by EOA\\n * @param _v v value of signature (0 or 1)\\n * @param _r r value of signature\\n * @param _s s value of signature\\n */\\n function safeCREATEEOA(\\n bytes32 _messageHash,\\n uint8 _v,\\n bytes32 _r,\\n bytes32 _s\\n )\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCREATEEOA(bytes32,uint8,bytes32,bytes32)\\\",\\n _messageHash,\\n _v,\\n _r,\\n _s\\n )\\n );\\n }\\n\\n /**\\n * Performs a safe REVERT.\\n * @param _reason String revert reason to pass along with the REVERT.\\n */\\n function safeREVERT(\\n string memory _reason\\n )\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmREVERT(bytes)\\\",\\n bytes(_reason)\\n )\\n );\\n }\\n\\n /**\\n * Performs a safe \\\"require\\\".\\n * @param _condition Boolean condition that must be true or will revert.\\n * @param _reason String revert reason to pass along with the REVERT.\\n */\\n function safeREQUIRE(\\n bool _condition,\\n string memory _reason\\n )\\n internal\\n {\\n if (!_condition) {\\n safeREVERT(\\n _reason\\n );\\n }\\n }\\n\\n /**\\n * Performs a safe ovmSLOAD call.\\n */\\n function safeSLOAD(\\n bytes32 _key\\n )\\n internal\\n returns (\\n bytes32\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmSLOAD(bytes32)\\\",\\n _key\\n )\\n );\\n\\n return abi.decode(returndata, (bytes32));\\n }\\n\\n /**\\n * Performs a safe ovmSSTORE call.\\n */\\n function safeSSTORE(\\n bytes32 _key,\\n bytes32 _value\\n )\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmSSTORE(bytes32,bytes32)\\\",\\n _key,\\n _value\\n )\\n );\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Performs an ovm interaction and the necessary safety checks.\\n * @param _gasLimit Gas limit for the interaction.\\n * @param _calldata Data to send to the OVM_ExecutionManager (encoded with sighash).\\n * @return _returndata Data sent back by the OVM_ExecutionManager.\\n */\\n function _safeExecutionManagerInteraction(\\n uint256 _gasLimit,\\n bytes memory _calldata\\n )\\n private\\n returns (\\n bytes memory _returndata\\n )\\n {\\n address ovmExecutionManager = msg.sender;\\n (\\n bool success,\\n bytes memory returndata\\n ) = ovmExecutionManager.call{gas: _gasLimit}(_calldata);\\n\\n if (success == false) {\\n assembly {\\n revert(add(returndata, 0x20), mload(returndata))\\n }\\n } else if (returndata.length == 1) {\\n assembly {\\n return(0, 1)\\n }\\n } else {\\n return returndata;\\n }\\n }\\n\\n function _safeExecutionManagerInteraction(\\n bytes memory _calldata\\n )\\n private\\n returns (\\n bytes memory _returndata\\n )\\n {\\n return _safeExecutionManagerInteraction(\\n gasleft(),\\n _calldata\\n );\\n }\\n}\\n\",\"keccak256\":\"0xdc30487ca1580f3498d4a1c4e26dc53158c00b44bd72da212a66267c22a139b0\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x608060405234801561001057600080fd5b506001600055600680546001600160a01b03191690556125c6806100356000396000f3fe608060405234801561001057600080fd5b506004361061009e5760003560e01c806382e3702d1161006657806382e3702d1461011c578063b1b1b2091461012f578063c4d66de814610142578063d7fd19dd14610155578063ecc70428146101685761009e565b806321d800ec146100a35780633dbb202b146100cc578063461a4478146100e15780636e296e4514610101578063706ceab614610109575b600080fd5b6100b66100b136600461203d565b61017d565b6040516100c39190612253565b60405180910390f35b6100df6100da366004611fc1565b610192565b005b6100f46100ef366004612055565b610221565b6040516100c391906121db565b6100f46102fd565b6100df610117366004611f4a565b61030c565b6100b661012a36600461203d565b61037c565b6100b661013d36600461203d565b610391565b6100df610150366004611e01565b6103a6565b6100df610163366004611e1b565b6103f1565b61017061065f565b6040516100c39190612124565b60016020526000908152604090205460ff1681565b60006101a2843385600454610665565b60048054600190810190915581516020808401919091206000908152600390915260409020805460ff1916909117905590506101e48163ffffffff84166106b2565b7f0ee9ffdb2334d78de97ffb066b23a352a4d35180cefb36589d663fbb1eb6f3268160405161021391906122d5565b60405180910390a150505050565b60065460405163bf40fac160e01b81526020600482018181528451602484015284516000946001600160a01b03169363bf40fac1938793928392604401918501908083838b5b8381101561027f578181015183820152602001610267565b50505050905090810190601f1680156102ac5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b1580156102c957600080fd5b505afa1580156102dd573d6000803e3d6000fd5b505050506040513d60208110156102f357600080fd5b505190505b919050565b6005546001600160a01b031681565b600061031a86868686610665565b805160208083019190912060009081526003909152604090205490915060ff1615156001146103645760405162461bcd60e51b815260040161035b90612333565b60405180910390fd5b610374818363ffffffff166106b2565b505050505050565b60036020526000908152604090205460ff1681565b60026020526000908152604090205460ff1681565b6006546001600160a01b0316156103cf5760405162461bcd60e51b815260040161035b9061241b565b600680546001600160a01b0319166001600160a01b0392909216919091179055565b60026000541415610449576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6002600090815560408051808201909152601481527327ab26afa61926b2b9b9b0b3b2a932b630bcb2b960611b602082015261048490610221565b90506001600160a01b038116156104bd57336001600160a01b038216146104bd5760405162461bcd60e51b815260040161035b9061237e565b60006104cb87878787610665565b90506104d7818461078a565b15156001146104f85760405162461bcd60e51b815260040161035b906123d4565b80516020808301919091206000818152600290925260409091205460ff16156105335760405162461bcd60e51b815260040161035b906122e8565b600580546001600160a01b0319166001600160a01b03898116919091179091556040516000918a169061056790899061213b565b6000604051808303816000865af19150503d80600081146105a4576040519150601f19603f3d011682016040523d82523d6000602084013e6105a9565b606091505b50909150506001811515141561060b5760008281526002602052604090819020805460ff19166001179055517f4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c90610602908490612124565b60405180910390a15b600083334360405160200161062293929190612189565b60408051601f1981840301815291815281516020928301206000908152600192839052908120805460ff1916831790555550505050505050505050565b60045481565b60608484848460405160240161067e94939291906121ef565b60408051601f198184030181529190526020810180516001600160e01b031663cbd4ece960e01b1790529050949350505050565b6106f06040518060400160405280601d81526020017f4f564d5f43616e6f6e6963616c5472616e73616374696f6e436861696e000000815250610221565b6001600160a01b0316636fee07e061073c6040518060400160405280601a81526020017f4f564d5f4c3243726f7373446f6d61696e4d657373656e676572000000000000815250610221565b83856040518463ffffffff1660e01b815260040161075c9392919061222c565b600060405180830381600087803b15801561077657600080fd5b505af1158015610374573d6000803e3d6000fd5b6000610795826107af565b80156107a657506107a6838361090c565b90505b92915050565b6000806107f06040518060400160405280601881526020017f4f564d5f5374617465436f6d6d69746d656e74436861696e0000000000000000815250610221565b6020840151604051639418bddd60e01b81529192506001600160a01b03831691639418bddd91610822916004016124d9565b60206040518083038186803b15801561083a57600080fd5b505afa15801561084e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610872919061201d565b1580156109055750825160208401516040808601519051634d69ee5760e01b81526001600160a01b03851693634d69ee57936108b593919290919060040161225e565b60206040518083038186803b1580156108cd57600080fd5b505afa1580156108e1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610905919061201d565b9392505050565b6000808361094e6040518060400160405280601a81526020017f4f564d5f4c3243726f7373446f6d61696e4d657373656e676572000000000000815250610221565b60405160200161095f929190612157565b60405160208183030381529060405280519060200120600060405160200161098892919061212d565b6040516020818303038152906040528051906020012090506000806109d7602160991b6040516020016109bb919061210c565b60408051601f1981840301815291905260608701518751610a69565b90925090506001821515146109fe5760405162461bcd60e51b815260040161035b90612465565b6000610a0982610a92565b9050610a5e84604051602001610a1f9190612124565b6040516020818303038152906040526001604051602001610a4091906121c3565b60405160208183030381529060405288608001518460400151610b24565b979650505050505050565b600060606000610a7886610b48565b9050610a85818686610b78565b9250925050935093915050565b610a9a611bb7565b6000610aa583610c4b565b90506040518060800160405280610acf83600081518110610ac257fe5b6020026020010151610c5e565b8152602001610ae483600181518110610ac257fe5b8152602001610b0683600281518110610af957fe5b6020026020010151610c65565b8152602001610b1b83600381518110610af957fe5b90529392505050565b600080610b3086610b48565b9050610b3e81868686610d5e565b9695505050505050565b60608180519060200120604051602001610b629190612124565b6040516020818303038152906040529050919050565b600060606000610b8785610d84565b90506000806000610b99848a89610e5b565b81519295509093509150158080610bad5750815b610bfe576040805162461bcd60e51b815260206004820152601a60248201527f50726f76696465642070726f6f6620697320696e76616c69642e000000000000604482015290519081900360640190fd5b600081610c1a5760405180602001604052806000815250610c39565b610c39866001870381518110610c2c57fe5b60200260200101516111fe565b919b919a509098505050505050505050565b60606107a9610c598361121a565b61123f565b60006107a9825b6000602182600001511115610cc1576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e000000000000604482015290519081900360640190fd5b6000806000610ccf856113b5565b919450925090506000816001811115610ce457fe5b14610d36576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e000000000000604482015290519081900360640190fd5b602080860151840180519091841015610b3e5760208490036101000a90049695505050505050565b6000806000610d6e878686610b78565b91509150818015610a5e5750610a5e86826116de565b60606000610d9183610c4b565b90506000815167ffffffffffffffff81118015610dad57600080fd5b50604051908082528060200260200182016040528015610de757816020015b610dd4611bde565b815260200190600190039081610dcc5790505b50905060005b8251811015610e53576000610e14848381518110610e0757fe5b60200260200101516116f4565b90506040518060400160405280828152602001610e3083610c4b565b815250838381518110610e3f57fe5b602090810291909101015250600101610ded565b509392505050565b60006060818080610e6b87611783565b905085600080610e79611bde565b60005b8c518110156111d6578c8181518110610e9157fe5b6020026020010151915082840193506001870196508360001415610f0557815180516020909101208514610f00576040805162461bcd60e51b8152602060048201526011602482015270092dcecc2d8d2c840e4dedee840d0c2e6d607b1b604482015290519081900360640190fd5b610fcc565b815151602011610f6c57815180516020909101208514610f00576040805162461bcd60e51b815260206004820152601b60248201527f496e76616c6964206c6172676520696e7465726e616c20686173680000000000604482015290519081900360640190fd5b84610f7a8360000151611880565b14610fcc576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420696e7465726e616c206e6f64652068617368000000000000604482015290519081900360640190fd5b6020820151516011141561103b578551841415610fe8576111d6565b6000868581518110610ff657fe5b602001015160f81c60f81b60f81c9050600083602001518260ff168151811061101b57fe5b6020026020010151905061102e816118ac565b96506001945050506111ce565b60028260200151511415611181576000611054836118e2565b905060008160008151811061106557fe5b016020015160f81c90506001811660020360006110858460ff8416611900565b905060006110938b8a611900565b905060006110a18383611931565b905060ff8516600214806110b8575060ff85166003145b156110ea578083511480156110cd5750808251145b156110d757988901985b50600160ff1b99506111d6945050505050565b60ff851615806110fd575060ff85166001145b1561114a578061111a5750600160ff1b99506111d6945050505050565b61113b886020015160018151811061112e57fe5b60200260200101516118ac565b9a5097506111ce945050505050565b60405162461bcd60e51b815260040180806020018281038252602681526020018061256b6026913960400191505060405180910390fd5b6040805162461bcd60e51b815260206004820152601d60248201527f526563656976656420616e20756e706172736561626c65206e6f64652e000000604482015290519081900360640190fd5b600101610e7c565b50600160ff1b8414866111e98786611900565b909e909d50909b509950505050505050505050565b602081015180516060916107a9916000198101908110610e0757fe5b611222611bf8565b506040805180820190915281518152602082810190820152919050565b606060008061124d846113b5565b9193509091506001905081600181111561126357fe5b146112b5576040805162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c50206c6973742076616c75652e000000000000000000604482015290519081900360640190fd5b6040805160208082526104208201909252600091816020015b6112d6611bf8565b8152602001906001900390816112ce5790505090506000835b86518110156113aa57602082106113375760405162461bcd60e51b815260040180806020018281038252602a815260200180612541602a913960400191505060405180910390fd5b6000806113636040518060400160405280858c60000151038152602001858c60200151018152506113b5565b509150915060405180604001604052808383018152602001848b602001510181525085858151811061139157fe5b60209081029190910101526001939093019201016112ef565b508152949350505050565b600080600080846000015111611412576040805162461bcd60e51b815260206004820152601860248201527f524c50206974656d2063616e6e6f74206265206e756c6c2e0000000000000000604482015290519081900360640190fd5b6020840151805160001a607f81116114375760006001600094509450945050506116d7565b60b781116114ac578551607f19820190811061149a576040805162461bcd60e51b815260206004820152601960248201527f496e76616c696420524c502073686f727420737472696e672e00000000000000604482015290519081900360640190fd5b600195509350600092506116d7915050565b60bf811161159057855160b619820190811061150f576040805162461bcd60e51b815260206004820152601f60248201527f496e76616c696420524c50206c6f6e6720737472696e67206c656e6774682e00604482015290519081900360640190fd5b6000816020036101000a600185015104905080820188600001511161157b576040805162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c50206c6f6e6720737472696e672e0000000000000000604482015290519081900360640190fd5b600190910195509350600092506116d7915050565b60f7811161160457855160bf1982019081106115f3576040805162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c502073686f7274206c6973742e000000000000000000604482015290519081900360640190fd5b6001955093508492506116d7915050565b855160f619820190811061165f576040805162461bcd60e51b815260206004820152601d60248201527f496e76616c696420524c50206c6f6e67206c697374206c656e6774682e000000604482015290519081900360640190fd5b6000816020036101000a60018501510490508082018860000151116116c4576040805162461bcd60e51b815260206004820152601660248201527524b73b30b634b210292628103637b733903634b9ba1760511b604482015290519081900360640190fd5b60019182019650945092506116d7915050565b9193909250565b8051602091820120825192909101919091201490565b60606000806000611704856113b5565b91945092509050600081600181111561171957fe5b1461176b576040805162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c502062797465732076616c75652e0000000000000000604482015290519081900360640190fd5b61177a85602001518484611997565b95945050505050565b60606000825160020267ffffffffffffffff811180156117a257600080fd5b506040519080825280601f01601f1916602001820160405280156117cd576020820181803683370190505b50905060005b83518110156118795760048482815181106117ea57fe5b602001015160f81c60f81b6001600160f81b031916901c82826002028151811061181057fe5b60200101906001600160f81b031916908160001a905350601084828151811061183557fe5b016020015160f81c8161184457fe5b0660f81b82826002026001018151811061185a57fe5b60200101906001600160f81b031916908160001a9053506001016117d3565b5092915050565b6000602082511015611897575060208101516102f8565b8180602001905160208110156102f357600080fd5b600060606020836000015110156118cd576118c683611a45565b90506118d9565b6118d6836116f4565b90505b61090581611880565b60606107a96118fb8360200151600081518110610e0757fe5b611783565b6060818351036000141561192357506040805160208101909152600081526107a9565b6107a6838384865103611a50565b6000805b8084511180156119455750808351115b801561198a575082818151811061195857fe5b602001015160f81c60f81b6001600160f81b03191684828151811061197957fe5b01602001516001600160f81b031916145b156107a657600101611935565b606060008267ffffffffffffffff811180156119b257600080fd5b506040519080825280601f01601f1916602001820160405280156119dd576020820181803683370190505b5090508051600014156119f1579050610905565b8484016020820160005b60208604811015611a1c5782518252602092830192909101906001016119fb565b5080519151601f959095166020036101000a600019019182169119909416179092525092915050565b60606107a982611ba1565b60608182601f011015611a9b576040805162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b604482015290519081900360640190fd5b828284011015611ae3576040805162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b604482015290519081900360640190fd5b81830184511015611b2f576040805162461bcd60e51b8152602060048201526011602482015270736c6963655f6f75744f66426f756e647360781b604482015290519081900360640190fd5b606082158015611b4e5760405191506000825260208201604052611b98565b6040519150601f8416801560200281840101858101878315602002848b0101015b81831015611b87578051835260209283019201611b6f565b5050858452601f01601f1916604052505b50949350505050565b60606107a9826020015160008460000151611997565b60408051608081018252600080825260208201819052918101829052606081019190915290565b604051806040016040528060608152602001606081525090565b604051806040016040528060008152602001600081525090565b600067ffffffffffffffff831115611c2657fe5b611c39601f8401601f19166020016124ec565b9050828152838383011115611c4d57600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b03811681146102f857600080fd5b600082601f830112611c8b578081fd5b6107a683833560208501611c12565b600060a08284031215611cab578081fd5b60405160a0810167ffffffffffffffff8282108183111715611cc957fe5b81604052829350843583526020850135602084015260408501356040840152606085013560608401526080850135915080821115611d0657600080fd5b50611d1385828601611c7b565b6080830152505092915050565b600060408284031215611d31578081fd5b6040516040810167ffffffffffffffff8282108183111715611d4f57fe5b8160405282935084358352602091508185013581811115611d6f57600080fd5b8501601f81018713611d8057600080fd5b803582811115611d8c57fe5b8381029250611d9c8484016124ec565b8181528481019083860185850187018b1015611db757600080fd5b600095505b83861015611dda578035835260019590950194918601918601611dbc565b5080868801525050505050505092915050565b803563ffffffff811681146102f857600080fd5b600060208284031215611e12578081fd5b6107a682611c64565b600080600080600060a08688031215611e32578081fd5b611e3b86611c64565b9450611e4960208701611c64565b9350604086013567ffffffffffffffff80821115611e65578283fd5b611e7189838a01611c7b565b9450606088013593506080880135915080821115611e8d578283fd5b9087019060a0828a031215611ea0578283fd5b611eaa60a06124ec565b82358152602083013582811115611ebf578485fd5b611ecb8b828601611c9a565b602083015250604083013582811115611ee2578485fd5b611eee8b828601611d20565b604083015250606083013582811115611f05578485fd5b611f118b828601611c7b565b606083015250608083013582811115611f28578485fd5b611f348b828601611c7b565b6080830152508093505050509295509295909350565b600080600080600060a08688031215611f61578081fd5b611f6a86611c64565b9450611f7860208701611c64565b9350604086013567ffffffffffffffff811115611f93578182fd5b611f9f88828901611c7b565b93505060608601359150611fb560808701611ded565b90509295509295909350565b600080600060608486031215611fd5578283fd5b611fde84611c64565b9250602084013567ffffffffffffffff811115611ff9578283fd5b61200586828701611c7b565b92505061201460408501611ded565b90509250925092565b60006020828403121561202e578081fd5b815180151581146107a6578182fd5b60006020828403121561204e578081fd5b5035919050565b600060208284031215612066578081fd5b813567ffffffffffffffff81111561207c578182fd5b8201601f8101841361208c578182fd5b61209b84823560208401611c12565b949350505050565b600081518084526120bb816020860160208601612510565b601f01601f19169290920160200192915050565b600081518352602082015160208401526040820151604084015260608201516060840152608082015160a0608085015261209b60a08501826120a3565b60609190911b6001600160601b031916815260140190565b90815260200190565b918252602082015260400190565b6000825161214d818460208701612510565b9190910192915050565b60008351612169818460208801612510565b60609390931b6001600160601b0319169190920190815260140192915050565b6000845161219b818460208901612510565b60609490941b6001600160601b03191691909301908152601481019190915260340192915050565b60f89190911b6001600160f81b031916815260010190565b6001600160a01b0391909116815260200190565b6001600160a01b0385811682528416602082015260806040820181905260009061221b908301856120a3565b905082606083015295945050505050565b600060018060a01b03851682528360208301526060604083015261177a60608301846120a3565b901515815260200190565b6000848252602060608184015261227860608401866120cf565b838103604085015260408101855182528286015160408484015281815180845260608501915085830194508693505b808410156122c757845182529385019360019390930192908501906122a7565b509998505050505050505050565b6000602082526107a660208301846120a3565b6020808252602b908201527f50726f7669646564206d6573736167652068617320616c72656164792062656560408201526a37103932b1b2b4bb32b21760a91b606082015260800190565b6020808252602b908201527f50726f7669646564206d65737361676520686173206e6f7420616c726561647960408201526a103132b2b71039b2b73a1760a91b606082015260800190565b60208082526036908201527f4f6e6c79204f564d5f4c324d65737361676552656c617965722063616e2072656040820152753630bc90261916ba3796a6189036b2b9b9b0b3b2b99760511b606082015260800190565b60208082526027908201527f50726f7669646564206d65737361676520636f756c64206e6f742062652076656040820152663934b334b2b21760c91b606082015260800190565b6020808252602a908201527f4c3143726f7373446f6d61696e4d657373656e67657220616c72656164792069604082015269373a34b0b634bd32b21760b11b606082015260800190565b6020808252604e908201527f4d6573736167652070617373696e6720707265636f6d70696c6520686173206e60408201527f6f74206265656e20696e697469616c697a6564206f7220696e76616c6964207060608201526d3937b7b310383937bb34b232b21760911b608082015260a00190565b6000602082526107a660208301846120cf565b60405181810167ffffffffffffffff8111828210171561250857fe5b604052919050565b60005b8381101561252b578181015183820152602001612513565b8381111561253a576000848401525b5050505056fe50726f766964656420524c50206c6973742065786365656473206d6178206c697374206c656e6774682e52656365697665642061206e6f6465207769746820616e20756e6b6e6f776e20707265666978a2646970667358221220ae7749addc98d54af4f2ee40764425eeab8281fa56632aa683ab7fadbe10912764736f6c63430007060033", - "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061009e5760003560e01c806382e3702d1161006657806382e3702d1461011c578063b1b1b2091461012f578063c4d66de814610142578063d7fd19dd14610155578063ecc70428146101685761009e565b806321d800ec146100a35780633dbb202b146100cc578063461a4478146100e15780636e296e4514610101578063706ceab614610109575b600080fd5b6100b66100b136600461203d565b61017d565b6040516100c39190612253565b60405180910390f35b6100df6100da366004611fc1565b610192565b005b6100f46100ef366004612055565b610221565b6040516100c391906121db565b6100f46102fd565b6100df610117366004611f4a565b61030c565b6100b661012a36600461203d565b61037c565b6100b661013d36600461203d565b610391565b6100df610150366004611e01565b6103a6565b6100df610163366004611e1b565b6103f1565b61017061065f565b6040516100c39190612124565b60016020526000908152604090205460ff1681565b60006101a2843385600454610665565b60048054600190810190915581516020808401919091206000908152600390915260409020805460ff1916909117905590506101e48163ffffffff84166106b2565b7f0ee9ffdb2334d78de97ffb066b23a352a4d35180cefb36589d663fbb1eb6f3268160405161021391906122d5565b60405180910390a150505050565b60065460405163bf40fac160e01b81526020600482018181528451602484015284516000946001600160a01b03169363bf40fac1938793928392604401918501908083838b5b8381101561027f578181015183820152602001610267565b50505050905090810190601f1680156102ac5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b1580156102c957600080fd5b505afa1580156102dd573d6000803e3d6000fd5b505050506040513d60208110156102f357600080fd5b505190505b919050565b6005546001600160a01b031681565b600061031a86868686610665565b805160208083019190912060009081526003909152604090205490915060ff1615156001146103645760405162461bcd60e51b815260040161035b90612333565b60405180910390fd5b610374818363ffffffff166106b2565b505050505050565b60036020526000908152604090205460ff1681565b60026020526000908152604090205460ff1681565b6006546001600160a01b0316156103cf5760405162461bcd60e51b815260040161035b9061241b565b600680546001600160a01b0319166001600160a01b0392909216919091179055565b60026000541415610449576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6002600090815560408051808201909152601481527327ab26afa61926b2b9b9b0b3b2a932b630bcb2b960611b602082015261048490610221565b90506001600160a01b038116156104bd57336001600160a01b038216146104bd5760405162461bcd60e51b815260040161035b9061237e565b60006104cb87878787610665565b90506104d7818461078a565b15156001146104f85760405162461bcd60e51b815260040161035b906123d4565b80516020808301919091206000818152600290925260409091205460ff16156105335760405162461bcd60e51b815260040161035b906122e8565b600580546001600160a01b0319166001600160a01b03898116919091179091556040516000918a169061056790899061213b565b6000604051808303816000865af19150503d80600081146105a4576040519150601f19603f3d011682016040523d82523d6000602084013e6105a9565b606091505b50909150506001811515141561060b5760008281526002602052604090819020805460ff19166001179055517f4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c90610602908490612124565b60405180910390a15b600083334360405160200161062293929190612189565b60408051601f1981840301815291815281516020928301206000908152600192839052908120805460ff1916831790555550505050505050505050565b60045481565b60608484848460405160240161067e94939291906121ef565b60408051601f198184030181529190526020810180516001600160e01b031663cbd4ece960e01b1790529050949350505050565b6106f06040518060400160405280601d81526020017f4f564d5f43616e6f6e6963616c5472616e73616374696f6e436861696e000000815250610221565b6001600160a01b0316636fee07e061073c6040518060400160405280601a81526020017f4f564d5f4c3243726f7373446f6d61696e4d657373656e676572000000000000815250610221565b83856040518463ffffffff1660e01b815260040161075c9392919061222c565b600060405180830381600087803b15801561077657600080fd5b505af1158015610374573d6000803e3d6000fd5b6000610795826107af565b80156107a657506107a6838361090c565b90505b92915050565b6000806107f06040518060400160405280601881526020017f4f564d5f5374617465436f6d6d69746d656e74436861696e0000000000000000815250610221565b6020840151604051639418bddd60e01b81529192506001600160a01b03831691639418bddd91610822916004016124d9565b60206040518083038186803b15801561083a57600080fd5b505afa15801561084e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610872919061201d565b1580156109055750825160208401516040808601519051634d69ee5760e01b81526001600160a01b03851693634d69ee57936108b593919290919060040161225e565b60206040518083038186803b1580156108cd57600080fd5b505afa1580156108e1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610905919061201d565b9392505050565b6000808361094e6040518060400160405280601a81526020017f4f564d5f4c3243726f7373446f6d61696e4d657373656e676572000000000000815250610221565b60405160200161095f929190612157565b60405160208183030381529060405280519060200120600060405160200161098892919061212d565b6040516020818303038152906040528051906020012090506000806109d7602160991b6040516020016109bb919061210c565b60408051601f1981840301815291905260608701518751610a69565b90925090506001821515146109fe5760405162461bcd60e51b815260040161035b90612465565b6000610a0982610a92565b9050610a5e84604051602001610a1f9190612124565b6040516020818303038152906040526001604051602001610a4091906121c3565b60405160208183030381529060405288608001518460400151610b24565b979650505050505050565b600060606000610a7886610b48565b9050610a85818686610b78565b9250925050935093915050565b610a9a611bb7565b6000610aa583610c4b565b90506040518060800160405280610acf83600081518110610ac257fe5b6020026020010151610c5e565b8152602001610ae483600181518110610ac257fe5b8152602001610b0683600281518110610af957fe5b6020026020010151610c65565b8152602001610b1b83600381518110610af957fe5b90529392505050565b600080610b3086610b48565b9050610b3e81868686610d5e565b9695505050505050565b60608180519060200120604051602001610b629190612124565b6040516020818303038152906040529050919050565b600060606000610b8785610d84565b90506000806000610b99848a89610e5b565b81519295509093509150158080610bad5750815b610bfe576040805162461bcd60e51b815260206004820152601a60248201527f50726f76696465642070726f6f6620697320696e76616c69642e000000000000604482015290519081900360640190fd5b600081610c1a5760405180602001604052806000815250610c39565b610c39866001870381518110610c2c57fe5b60200260200101516111fe565b919b919a509098505050505050505050565b60606107a9610c598361121a565b61123f565b60006107a9825b6000602182600001511115610cc1576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e000000000000604482015290519081900360640190fd5b6000806000610ccf856113b5565b919450925090506000816001811115610ce457fe5b14610d36576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e000000000000604482015290519081900360640190fd5b602080860151840180519091841015610b3e5760208490036101000a90049695505050505050565b6000806000610d6e878686610b78565b91509150818015610a5e5750610a5e86826116de565b60606000610d9183610c4b565b90506000815167ffffffffffffffff81118015610dad57600080fd5b50604051908082528060200260200182016040528015610de757816020015b610dd4611bde565b815260200190600190039081610dcc5790505b50905060005b8251811015610e53576000610e14848381518110610e0757fe5b60200260200101516116f4565b90506040518060400160405280828152602001610e3083610c4b565b815250838381518110610e3f57fe5b602090810291909101015250600101610ded565b509392505050565b60006060818080610e6b87611783565b905085600080610e79611bde565b60005b8c518110156111d6578c8181518110610e9157fe5b6020026020010151915082840193506001870196508360001415610f0557815180516020909101208514610f00576040805162461bcd60e51b8152602060048201526011602482015270092dcecc2d8d2c840e4dedee840d0c2e6d607b1b604482015290519081900360640190fd5b610fcc565b815151602011610f6c57815180516020909101208514610f00576040805162461bcd60e51b815260206004820152601b60248201527f496e76616c6964206c6172676520696e7465726e616c20686173680000000000604482015290519081900360640190fd5b84610f7a8360000151611880565b14610fcc576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420696e7465726e616c206e6f64652068617368000000000000604482015290519081900360640190fd5b6020820151516011141561103b578551841415610fe8576111d6565b6000868581518110610ff657fe5b602001015160f81c60f81b60f81c9050600083602001518260ff168151811061101b57fe5b6020026020010151905061102e816118ac565b96506001945050506111ce565b60028260200151511415611181576000611054836118e2565b905060008160008151811061106557fe5b016020015160f81c90506001811660020360006110858460ff8416611900565b905060006110938b8a611900565b905060006110a18383611931565b905060ff8516600214806110b8575060ff85166003145b156110ea578083511480156110cd5750808251145b156110d757988901985b50600160ff1b99506111d6945050505050565b60ff851615806110fd575060ff85166001145b1561114a578061111a5750600160ff1b99506111d6945050505050565b61113b886020015160018151811061112e57fe5b60200260200101516118ac565b9a5097506111ce945050505050565b60405162461bcd60e51b815260040180806020018281038252602681526020018061256b6026913960400191505060405180910390fd5b6040805162461bcd60e51b815260206004820152601d60248201527f526563656976656420616e20756e706172736561626c65206e6f64652e000000604482015290519081900360640190fd5b600101610e7c565b50600160ff1b8414866111e98786611900565b909e909d50909b509950505050505050505050565b602081015180516060916107a9916000198101908110610e0757fe5b611222611bf8565b506040805180820190915281518152602082810190820152919050565b606060008061124d846113b5565b9193509091506001905081600181111561126357fe5b146112b5576040805162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c50206c6973742076616c75652e000000000000000000604482015290519081900360640190fd5b6040805160208082526104208201909252600091816020015b6112d6611bf8565b8152602001906001900390816112ce5790505090506000835b86518110156113aa57602082106113375760405162461bcd60e51b815260040180806020018281038252602a815260200180612541602a913960400191505060405180910390fd5b6000806113636040518060400160405280858c60000151038152602001858c60200151018152506113b5565b509150915060405180604001604052808383018152602001848b602001510181525085858151811061139157fe5b60209081029190910101526001939093019201016112ef565b508152949350505050565b600080600080846000015111611412576040805162461bcd60e51b815260206004820152601860248201527f524c50206974656d2063616e6e6f74206265206e756c6c2e0000000000000000604482015290519081900360640190fd5b6020840151805160001a607f81116114375760006001600094509450945050506116d7565b60b781116114ac578551607f19820190811061149a576040805162461bcd60e51b815260206004820152601960248201527f496e76616c696420524c502073686f727420737472696e672e00000000000000604482015290519081900360640190fd5b600195509350600092506116d7915050565b60bf811161159057855160b619820190811061150f576040805162461bcd60e51b815260206004820152601f60248201527f496e76616c696420524c50206c6f6e6720737472696e67206c656e6774682e00604482015290519081900360640190fd5b6000816020036101000a600185015104905080820188600001511161157b576040805162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c50206c6f6e6720737472696e672e0000000000000000604482015290519081900360640190fd5b600190910195509350600092506116d7915050565b60f7811161160457855160bf1982019081106115f3576040805162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c502073686f7274206c6973742e000000000000000000604482015290519081900360640190fd5b6001955093508492506116d7915050565b855160f619820190811061165f576040805162461bcd60e51b815260206004820152601d60248201527f496e76616c696420524c50206c6f6e67206c697374206c656e6774682e000000604482015290519081900360640190fd5b6000816020036101000a60018501510490508082018860000151116116c4576040805162461bcd60e51b815260206004820152601660248201527524b73b30b634b210292628103637b733903634b9ba1760511b604482015290519081900360640190fd5b60019182019650945092506116d7915050565b9193909250565b8051602091820120825192909101919091201490565b60606000806000611704856113b5565b91945092509050600081600181111561171957fe5b1461176b576040805162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c502062797465732076616c75652e0000000000000000604482015290519081900360640190fd5b61177a85602001518484611997565b95945050505050565b60606000825160020267ffffffffffffffff811180156117a257600080fd5b506040519080825280601f01601f1916602001820160405280156117cd576020820181803683370190505b50905060005b83518110156118795760048482815181106117ea57fe5b602001015160f81c60f81b6001600160f81b031916901c82826002028151811061181057fe5b60200101906001600160f81b031916908160001a905350601084828151811061183557fe5b016020015160f81c8161184457fe5b0660f81b82826002026001018151811061185a57fe5b60200101906001600160f81b031916908160001a9053506001016117d3565b5092915050565b6000602082511015611897575060208101516102f8565b8180602001905160208110156102f357600080fd5b600060606020836000015110156118cd576118c683611a45565b90506118d9565b6118d6836116f4565b90505b61090581611880565b60606107a96118fb8360200151600081518110610e0757fe5b611783565b6060818351036000141561192357506040805160208101909152600081526107a9565b6107a6838384865103611a50565b6000805b8084511180156119455750808351115b801561198a575082818151811061195857fe5b602001015160f81c60f81b6001600160f81b03191684828151811061197957fe5b01602001516001600160f81b031916145b156107a657600101611935565b606060008267ffffffffffffffff811180156119b257600080fd5b506040519080825280601f01601f1916602001820160405280156119dd576020820181803683370190505b5090508051600014156119f1579050610905565b8484016020820160005b60208604811015611a1c5782518252602092830192909101906001016119fb565b5080519151601f959095166020036101000a600019019182169119909416179092525092915050565b60606107a982611ba1565b60608182601f011015611a9b576040805162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b604482015290519081900360640190fd5b828284011015611ae3576040805162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b604482015290519081900360640190fd5b81830184511015611b2f576040805162461bcd60e51b8152602060048201526011602482015270736c6963655f6f75744f66426f756e647360781b604482015290519081900360640190fd5b606082158015611b4e5760405191506000825260208201604052611b98565b6040519150601f8416801560200281840101858101878315602002848b0101015b81831015611b87578051835260209283019201611b6f565b5050858452601f01601f1916604052505b50949350505050565b60606107a9826020015160008460000151611997565b60408051608081018252600080825260208201819052918101829052606081019190915290565b604051806040016040528060608152602001606081525090565b604051806040016040528060008152602001600081525090565b600067ffffffffffffffff831115611c2657fe5b611c39601f8401601f19166020016124ec565b9050828152838383011115611c4d57600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b03811681146102f857600080fd5b600082601f830112611c8b578081fd5b6107a683833560208501611c12565b600060a08284031215611cab578081fd5b60405160a0810167ffffffffffffffff8282108183111715611cc957fe5b81604052829350843583526020850135602084015260408501356040840152606085013560608401526080850135915080821115611d0657600080fd5b50611d1385828601611c7b565b6080830152505092915050565b600060408284031215611d31578081fd5b6040516040810167ffffffffffffffff8282108183111715611d4f57fe5b8160405282935084358352602091508185013581811115611d6f57600080fd5b8501601f81018713611d8057600080fd5b803582811115611d8c57fe5b8381029250611d9c8484016124ec565b8181528481019083860185850187018b1015611db757600080fd5b600095505b83861015611dda578035835260019590950194918601918601611dbc565b5080868801525050505050505092915050565b803563ffffffff811681146102f857600080fd5b600060208284031215611e12578081fd5b6107a682611c64565b600080600080600060a08688031215611e32578081fd5b611e3b86611c64565b9450611e4960208701611c64565b9350604086013567ffffffffffffffff80821115611e65578283fd5b611e7189838a01611c7b565b9450606088013593506080880135915080821115611e8d578283fd5b9087019060a0828a031215611ea0578283fd5b611eaa60a06124ec565b82358152602083013582811115611ebf578485fd5b611ecb8b828601611c9a565b602083015250604083013582811115611ee2578485fd5b611eee8b828601611d20565b604083015250606083013582811115611f05578485fd5b611f118b828601611c7b565b606083015250608083013582811115611f28578485fd5b611f348b828601611c7b565b6080830152508093505050509295509295909350565b600080600080600060a08688031215611f61578081fd5b611f6a86611c64565b9450611f7860208701611c64565b9350604086013567ffffffffffffffff811115611f93578182fd5b611f9f88828901611c7b565b93505060608601359150611fb560808701611ded565b90509295509295909350565b600080600060608486031215611fd5578283fd5b611fde84611c64565b9250602084013567ffffffffffffffff811115611ff9578283fd5b61200586828701611c7b565b92505061201460408501611ded565b90509250925092565b60006020828403121561202e578081fd5b815180151581146107a6578182fd5b60006020828403121561204e578081fd5b5035919050565b600060208284031215612066578081fd5b813567ffffffffffffffff81111561207c578182fd5b8201601f8101841361208c578182fd5b61209b84823560208401611c12565b949350505050565b600081518084526120bb816020860160208601612510565b601f01601f19169290920160200192915050565b600081518352602082015160208401526040820151604084015260608201516060840152608082015160a0608085015261209b60a08501826120a3565b60609190911b6001600160601b031916815260140190565b90815260200190565b918252602082015260400190565b6000825161214d818460208701612510565b9190910192915050565b60008351612169818460208801612510565b60609390931b6001600160601b0319169190920190815260140192915050565b6000845161219b818460208901612510565b60609490941b6001600160601b03191691909301908152601481019190915260340192915050565b60f89190911b6001600160f81b031916815260010190565b6001600160a01b0391909116815260200190565b6001600160a01b0385811682528416602082015260806040820181905260009061221b908301856120a3565b905082606083015295945050505050565b600060018060a01b03851682528360208301526060604083015261177a60608301846120a3565b901515815260200190565b6000848252602060608184015261227860608401866120cf565b838103604085015260408101855182528286015160408484015281815180845260608501915085830194508693505b808410156122c757845182529385019360019390930192908501906122a7565b509998505050505050505050565b6000602082526107a660208301846120a3565b6020808252602b908201527f50726f7669646564206d6573736167652068617320616c72656164792062656560408201526a37103932b1b2b4bb32b21760a91b606082015260800190565b6020808252602b908201527f50726f7669646564206d65737361676520686173206e6f7420616c726561647960408201526a103132b2b71039b2b73a1760a91b606082015260800190565b60208082526036908201527f4f6e6c79204f564d5f4c324d65737361676552656c617965722063616e2072656040820152753630bc90261916ba3796a6189036b2b9b9b0b3b2b99760511b606082015260800190565b60208082526027908201527f50726f7669646564206d65737361676520636f756c64206e6f742062652076656040820152663934b334b2b21760c91b606082015260800190565b6020808252602a908201527f4c3143726f7373446f6d61696e4d657373656e67657220616c72656164792069604082015269373a34b0b634bd32b21760b11b606082015260800190565b6020808252604e908201527f4d6573736167652070617373696e6720707265636f6d70696c6520686173206e60408201527f6f74206265656e20696e697469616c697a6564206f7220696e76616c6964207060608201526d3937b7b310383937bb34b232b21760911b608082015260a00190565b6000602082526107a660208301846120cf565b60405181810167ffffffffffffffff8111828210171561250857fe5b604052919050565b60005b8381101561252b578181015183820152602001612513565b8381111561253a576000848401525b5050505056fe50726f766964656420524c50206c6973742065786365656473206d6178206c697374206c656e6774682e52656365697665642061206e6f6465207769746820616e20756e6b6e6f776e20707265666978a2646970667358221220ae7749addc98d54af4f2ee40764425eeab8281fa56632aa683ab7fadbe10912764736f6c63430007060033", - "devdoc": { - "details": "This contract lives on L1. It sends L1->L2 messages into L2, and relays L2->L1 messages from L2 to their target on L1.", - "kind": "dev", - "methods": { - "initialize(address)": { - "params": { - "_libAddressManager": "Address of the Address Manager." - } - }, - "relayMessage(address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))": { - "params": { - "_message": "Message to send to the target.", - "_messageNonce": "Nonce for the provided message.", - "_proof": "Inclusion proof for the given message.", - "_sender": "Message sender address.", - "_target": "Target contract address." - } - }, - "replayMessage(address,address,bytes,uint256,uint32)": { - "params": { - "_gasLimit": "Gas limit for the provided message.", - "_message": "Message to send to the target.", - "_messageNonce": "Nonce for the provided message.", - "_sender": "Original sender address.", - "_target": "Target contract address." - } - }, - "sendMessage(address,bytes,uint32)": { - "params": { - "_gasLimit": "Gas limit for the provided message.", - "_message": "Message to send to the target.", - "_target": "Target contract address." - } - } - }, - "title": "OVM_L1CrossDomainMessenger", - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": { - "constructor": { - "notice": "Pass a default zero address to the address resolver. This will be updated when initialized." - }, - "relayMessage(address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))": { - "notice": "Relays a cross domain message to a contract." - }, - "replayMessage(address,address,bytes,uint256,uint32)": { - "notice": "Replays a cross domain message to the target messenger." - }, - "sendMessage(address,bytes,uint32)": { - "notice": "Sends a cross domain message to the target messenger." - } - }, - "version": 1 - }, - "storageLayout": { - "storage": [ - { - "astId": 16313, - "contract": "contracts/optimistic-ethereum/OVM/bridge/OVM_L1CrossDomainMessenger.sol:OVM_L1CrossDomainMessenger", - "label": "_status", - "offset": 0, - "slot": "0", - "type": "t_uint256" - }, - { - "astId": 679, - "contract": "contracts/optimistic-ethereum/OVM/bridge/OVM_L1CrossDomainMessenger.sol:OVM_L1CrossDomainMessenger", - "label": "relayedMessages", - "offset": 0, - "slot": "1", - "type": "t_mapping(t_bytes32,t_bool)" - }, - { - "astId": 683, - "contract": "contracts/optimistic-ethereum/OVM/bridge/OVM_L1CrossDomainMessenger.sol:OVM_L1CrossDomainMessenger", - "label": "successfulMessages", - "offset": 0, - "slot": "2", - "type": "t_mapping(t_bytes32,t_bool)" - }, - { - "astId": 687, - "contract": "contracts/optimistic-ethereum/OVM/bridge/OVM_L1CrossDomainMessenger.sol:OVM_L1CrossDomainMessenger", - "label": "sentMessages", - "offset": 0, - "slot": "3", - "type": "t_mapping(t_bytes32,t_bool)" - }, - { - "astId": 689, - "contract": "contracts/optimistic-ethereum/OVM/bridge/OVM_L1CrossDomainMessenger.sol:OVM_L1CrossDomainMessenger", - "label": "messageNonce", - "offset": 0, - "slot": "4", - "type": "t_uint256" - }, - { - "astId": 692, - "contract": "contracts/optimistic-ethereum/OVM/bridge/OVM_L1CrossDomainMessenger.sol:OVM_L1CrossDomainMessenger", - "label": "xDomainMessageSender", - "offset": 0, - "slot": "5", - "type": "t_address" - }, - { - "astId": 11707, - "contract": "contracts/optimistic-ethereum/OVM/bridge/OVM_L1CrossDomainMessenger.sol:OVM_L1CrossDomainMessenger", - "label": "libAddressManager", - "offset": 0, - "slot": "6", - "type": "t_contract(Lib_AddressManager)11700" - } - ], - "types": { - "t_address": { - "encoding": "inplace", - "label": "address", - "numberOfBytes": "20" - }, - "t_bool": { - "encoding": "inplace", - "label": "bool", - "numberOfBytes": "1" - }, - "t_bytes32": { - "encoding": "inplace", - "label": "bytes32", - "numberOfBytes": "32" - }, - "t_contract(Lib_AddressManager)11700": { - "encoding": "inplace", - "label": "contract Lib_AddressManager", - "numberOfBytes": "20" - }, - "t_mapping(t_bytes32,t_bool)": { - "encoding": "mapping", - "key": "t_bytes32", - "label": "mapping(bytes32 => bool)", - "numberOfBytes": "32", - "value": "t_bool" - }, - "t_uint256": { - "encoding": "inplace", - "label": "uint256", - "numberOfBytes": "32" - } - } - } -} \ No newline at end of file diff --git a/packages/contracts/deployments/kovan-v1/OVM_StateCommitmentChain.json b/packages/contracts/deployments/kovan-v1/OVM_StateCommitmentChain.json deleted file mode 100644 index 98e08264598e6..0000000000000 --- a/packages/contracts/deployments/kovan-v1/OVM_StateCommitmentChain.json +++ /dev/null @@ -1,504 +0,0 @@ -{ - "address": "0x2AAbAf6799822Efc77865401E05CE02897ecf520", - "abi": [ - { - "inputs": [ - { - "internalType": "address", - "name": "_libAddressManager", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_fraudProofWindow", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_sequencerPublishWindow", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "_batchIndex", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "bytes32", - "name": "_batchRoot", - "type": "bytes32" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_batchSize", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_prevTotalElements", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "bytes", - "name": "_extraData", - "type": "bytes" - } - ], - "name": "StateBatchAppended", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "_batchIndex", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "bytes32", - "name": "_batchRoot", - "type": "bytes32" - } - ], - "name": "StateBatchDeleted", - "type": "event" - }, - { - "inputs": [], - "name": "FRAUD_PROOF_WINDOW", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "SEQUENCER_PUBLISH_WINDOW", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32[]", - "name": "_batch", - "type": "bytes32[]" - }, - { - "internalType": "uint256", - "name": "_shouldStartAtElement", - "type": "uint256" - } - ], - "name": "appendStateBatch", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "batches", - "outputs": [ - { - "internalType": "contract iOVM_ChainStorageContainer", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "components": [ - { - "internalType": "uint256", - "name": "batchIndex", - "type": "uint256" - }, - { - "internalType": "bytes32", - "name": "batchRoot", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "batchSize", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "prevTotalElements", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "extraData", - "type": "bytes" - } - ], - "internalType": "struct Lib_OVMCodec.ChainBatchHeader", - "name": "_batchHeader", - "type": "tuple" - } - ], - "name": "deleteStateBatch", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "getLastSequencerTimestamp", - "outputs": [ - { - "internalType": "uint256", - "name": "_lastSequencerTimestamp", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getTotalBatches", - "outputs": [ - { - "internalType": "uint256", - "name": "_totalBatches", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getTotalElements", - "outputs": [ - { - "internalType": "uint256", - "name": "_totalElements", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "components": [ - { - "internalType": "uint256", - "name": "batchIndex", - "type": "uint256" - }, - { - "internalType": "bytes32", - "name": "batchRoot", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "batchSize", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "prevTotalElements", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "extraData", - "type": "bytes" - } - ], - "internalType": "struct Lib_OVMCodec.ChainBatchHeader", - "name": "_batchHeader", - "type": "tuple" - } - ], - "name": "insideFraudProofWindow", - "outputs": [ - { - "internalType": "bool", - "name": "_inside", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "string", - "name": "_name", - "type": "string" - } - ], - "name": "resolve", - "outputs": [ - { - "internalType": "address", - "name": "_contract", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "_element", - "type": "bytes32" - }, - { - "components": [ - { - "internalType": "uint256", - "name": "batchIndex", - "type": "uint256" - }, - { - "internalType": "bytes32", - "name": "batchRoot", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "batchSize", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "prevTotalElements", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "extraData", - "type": "bytes" - } - ], - "internalType": "struct Lib_OVMCodec.ChainBatchHeader", - "name": "_batchHeader", - "type": "tuple" - }, - { - "components": [ - { - "internalType": "uint256", - "name": "index", - "type": "uint256" - }, - { - "internalType": "bytes32[]", - "name": "siblings", - "type": "bytes32[]" - } - ], - "internalType": "struct Lib_OVMCodec.ChainInclusionProof", - "name": "_proof", - "type": "tuple" - } - ], - "name": "verifyStateCommitment", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - } - ], - "transactionHash": "0xb39654f6dfba167749e5ed12a67f10721f84abd56328a468a2a0ec665eeef725", - "receipt": { - "to": null, - "from": "0x558ba9b8d78713fbf768c1f8a584485B4003f43F", - "contractAddress": "0xE1A99Ff67B5c92502bA94b5337576de3624cb512", - "transactionIndex": 0, - "gasUsed": "1626450", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0xdcbf3bbc2709ed51ce548a98413a3f341a8fc245c4a435e7570e9aee5d2d95f3", - "transactionHash": "0xb39654f6dfba167749e5ed12a67f10721f84abd56328a468a2a0ec665eeef725", - "logs": [], - "blockNumber": 4573386, - "cumulativeGasUsed": "1626450", - "status": 1, - "byzantium": true - }, - "args": [ - "0x72e6F5244828C10737cbC9659378B207246D26B2", - 60, - 18000000 - ], - "solcInputHash": "cebcb515c1a9c570d96e0b8f6fd237e2", - "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_fraudProofWindow\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_sequencerPublishWindow\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_batchIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"_batchRoot\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_batchSize\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_prevTotalElements\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"_extraData\",\"type\":\"bytes\"}],\"name\":\"StateBatchAppended\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_batchIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"_batchRoot\",\"type\":\"bytes32\"}],\"name\":\"StateBatchDeleted\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"FRAUD_PROOF_WINDOW\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"SEQUENCER_PUBLISH_WINDOW\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"_batch\",\"type\":\"bytes32[]\"},{\"internalType\":\"uint256\",\"name\":\"_shouldStartAtElement\",\"type\":\"uint256\"}],\"name\":\"appendStateBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"batches\",\"outputs\":[{\"internalType\":\"contract iOVM_ChainStorageContainer\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"_batchHeader\",\"type\":\"tuple\"}],\"name\":\"deleteStateBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLastSequencerTimestamp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_lastSequencerTimestamp\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTotalBatches\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_totalBatches\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTotalElements\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_totalElements\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"_batchHeader\",\"type\":\"tuple\"}],\"name\":\"insideFraudProofWindow\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"_inside\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"_contract\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_element\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"_batchHeader\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"siblings\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct Lib_OVMCodec.ChainInclusionProof\",\"name\":\"_proof\",\"type\":\"tuple\"}],\"name\":\"verifyStateCommitment\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"appendStateBatch(bytes32[],uint256)\":{\"params\":{\"_batch\":\"Batch of state roots.\",\"_shouldStartAtElement\":\"Index of the element at which this batch should start.\"}},\"batches()\":{\"returns\":{\"_0\":\"Reference to the batch storage container.\"}},\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\"}},\"deleteStateBatch((uint256,bytes32,uint256,uint256,bytes))\":{\"params\":{\"_batchHeader\":\"Header of the batch to start deleting from.\"}},\"getLastSequencerTimestamp()\":{\"returns\":{\"_lastSequencerTimestamp\":\"Last sequencer batch timestamp.\"}},\"getTotalBatches()\":{\"returns\":{\"_totalBatches\":\"Total submitted batches.\"}},\"getTotalElements()\":{\"returns\":{\"_totalElements\":\"Total submitted elements.\"}},\"insideFraudProofWindow((uint256,bytes32,uint256,uint256,bytes))\":{\"params\":{\"_batchHeader\":\"Header of the batch to check.\"},\"returns\":{\"_inside\":\"Whether or not the batch is inside the fraud proof window.\"}},\"verifyStateCommitment(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))\":{\"params\":{\"_batchHeader\":\"Header of the batch in which the element was included.\",\"_element\":\"Hash of the element to verify a proof for.\",\"_proof\":\"Merkle inclusion proof for the element.\"}}},\"title\":\"OVM_StateCommitmentChain\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"appendStateBatch(bytes32[],uint256)\":{\"notice\":\"Appends a batch of state roots to the chain.\"},\"batches()\":{\"notice\":\"Accesses the batch storage container.\"},\"deleteStateBatch((uint256,bytes32,uint256,uint256,bytes))\":{\"notice\":\"Deletes all state roots after (and including) a given batch.\"},\"getLastSequencerTimestamp()\":{\"notice\":\"Retrieves the timestamp of the last batch submitted by the sequencer.\"},\"getTotalBatches()\":{\"notice\":\"Retrieves the total number of batches submitted.\"},\"getTotalElements()\":{\"notice\":\"Retrieves the total number of elements submitted.\"},\"insideFraudProofWindow((uint256,bytes32,uint256,uint256,bytes))\":{\"notice\":\"Checks whether a given batch is still inside its fraud proof window.\"},\"verifyStateCommitment(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))\":{\"notice\":\"Verifies a batch inclusion proof.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/OVM/chain/OVM_StateCommitmentChain.sol\":\"OVM_StateCommitmentChain\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/math/SafeMath.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\n * checks.\\n *\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\n * in bugs, because programmers usually assume that an overflow raises an\\n * error, which is the standard behavior in high level programming languages.\\n * `SafeMath` restores this intuition by reverting the transaction when an\\n * operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n */\\nlibrary SafeMath {\\n /**\\n * @dev Returns the addition of two unsigned integers, with an overflow flag.\\n *\\n * _Available since v3.4._\\n */\\n function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n uint256 c = a + b;\\n if (c < a) return (false, 0);\\n return (true, c);\\n }\\n\\n /**\\n * @dev Returns the substraction of two unsigned integers, with an overflow flag.\\n *\\n * _Available since v3.4._\\n */\\n function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n if (b > a) return (false, 0);\\n return (true, a - b);\\n }\\n\\n /**\\n * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\\n *\\n * _Available since v3.4._\\n */\\n function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\n // benefit is lost if 'b' is also tested.\\n // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\n if (a == 0) return (true, 0);\\n uint256 c = a * b;\\n if (c / a != b) return (false, 0);\\n return (true, c);\\n }\\n\\n /**\\n * @dev Returns the division of two unsigned integers, with a division by zero flag.\\n *\\n * _Available since v3.4._\\n */\\n function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n if (b == 0) return (false, 0);\\n return (true, a / b);\\n }\\n\\n /**\\n * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\\n *\\n * _Available since v3.4._\\n */\\n function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n if (b == 0) return (false, 0);\\n return (true, a % b);\\n }\\n\\n /**\\n * @dev Returns the addition of two unsigned integers, reverting on\\n * overflow.\\n *\\n * Counterpart to Solidity's `+` operator.\\n *\\n * Requirements:\\n *\\n * - Addition cannot overflow.\\n */\\n function add(uint256 a, uint256 b) internal pure returns (uint256) {\\n uint256 c = a + b;\\n require(c >= a, \\\"SafeMath: addition overflow\\\");\\n return c;\\n }\\n\\n /**\\n * @dev Returns the subtraction of two unsigned integers, reverting on\\n * overflow (when the result is negative).\\n *\\n * Counterpart to Solidity's `-` operator.\\n *\\n * Requirements:\\n *\\n * - Subtraction cannot overflow.\\n */\\n function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\n require(b <= a, \\\"SafeMath: subtraction overflow\\\");\\n return a - b;\\n }\\n\\n /**\\n * @dev Returns the multiplication of two unsigned integers, reverting on\\n * overflow.\\n *\\n * Counterpart to Solidity's `*` operator.\\n *\\n * Requirements:\\n *\\n * - Multiplication cannot overflow.\\n */\\n function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\n if (a == 0) return 0;\\n uint256 c = a * b;\\n require(c / a == b, \\\"SafeMath: multiplication overflow\\\");\\n return c;\\n }\\n\\n /**\\n * @dev Returns the integer division of two unsigned integers, reverting on\\n * division by zero. The result is rounded towards zero.\\n *\\n * Counterpart to Solidity's `/` operator. Note: this function uses a\\n * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n * uses an invalid opcode to revert (consuming all remaining gas).\\n *\\n * Requirements:\\n *\\n * - The divisor cannot be zero.\\n */\\n function div(uint256 a, uint256 b) internal pure returns (uint256) {\\n require(b > 0, \\\"SafeMath: division by zero\\\");\\n return a / b;\\n }\\n\\n /**\\n * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n * reverting when dividing by zero.\\n *\\n * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n * opcode (which leaves remaining gas untouched) while Solidity uses an\\n * invalid opcode to revert (consuming all remaining gas).\\n *\\n * Requirements:\\n *\\n * - The divisor cannot be zero.\\n */\\n function mod(uint256 a, uint256 b) internal pure returns (uint256) {\\n require(b > 0, \\\"SafeMath: modulo by zero\\\");\\n return a % b;\\n }\\n\\n /**\\n * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\n * overflow (when the result is negative).\\n *\\n * CAUTION: This function is deprecated because it requires allocating memory for the error\\n * message unnecessarily. For custom revert reasons use {trySub}.\\n *\\n * Counterpart to Solidity's `-` operator.\\n *\\n * Requirements:\\n *\\n * - Subtraction cannot overflow.\\n */\\n function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n require(b <= a, errorMessage);\\n return a - b;\\n }\\n\\n /**\\n * @dev Returns the integer division of two unsigned integers, reverting with custom message on\\n * division by zero. The result is rounded towards zero.\\n *\\n * CAUTION: This function is deprecated because it requires allocating memory for the error\\n * message unnecessarily. For custom revert reasons use {tryDiv}.\\n *\\n * Counterpart to Solidity's `/` operator. Note: this function uses a\\n * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n * uses an invalid opcode to revert (consuming all remaining gas).\\n *\\n * Requirements:\\n *\\n * - The divisor cannot be zero.\\n */\\n function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n require(b > 0, errorMessage);\\n return a / b;\\n }\\n\\n /**\\n * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n * reverting with custom message when dividing by zero.\\n *\\n * CAUTION: This function is deprecated because it requires allocating memory for the error\\n * message unnecessarily. For custom revert reasons use {tryMod}.\\n *\\n * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n * opcode (which leaves remaining gas untouched) while Solidity uses an\\n * invalid opcode to revert (consuming all remaining gas).\\n *\\n * Requirements:\\n *\\n * - The divisor cannot be zero.\\n */\\n function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n require(b > 0, errorMessage);\\n return a % b;\\n }\\n}\\n\",\"keccak256\":\"0xcc78a17dd88fa5a2edc60c8489e2f405c0913b377216a5b26b35656b2d0dab52\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/chain/OVM_StateCommitmentChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.7.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\nimport { Lib_MerkleTree } from \\\"../../libraries/utils/Lib_MerkleTree.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_FraudVerifier } from \\\"../../iOVM/verification/iOVM_FraudVerifier.sol\\\";\\nimport { iOVM_StateCommitmentChain } from \\\"../../iOVM/chain/iOVM_StateCommitmentChain.sol\\\";\\nimport { iOVM_CanonicalTransactionChain } from \\\"../../iOVM/chain/iOVM_CanonicalTransactionChain.sol\\\";\\nimport { iOVM_BondManager } from \\\"../../iOVM/verification/iOVM_BondManager.sol\\\";\\nimport { iOVM_ChainStorageContainer } from \\\"../../iOVM/chain/iOVM_ChainStorageContainer.sol\\\";\\n\\n/* External Imports */\\nimport '@openzeppelin/contracts/math/SafeMath.sol';\\n\\n/**\\n * @title OVM_StateCommitmentChain\\n */\\ncontract OVM_StateCommitmentChain is iOVM_StateCommitmentChain, Lib_AddressResolver {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 public FRAUD_PROOF_WINDOW;\\n uint256 public SEQUENCER_PUBLISH_WINDOW;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n */\\n constructor(\\n address _libAddressManager,\\n uint256 _fraudProofWindow,\\n uint256 _sequencerPublishWindow\\n )\\n Lib_AddressResolver(_libAddressManager)\\n {\\n FRAUD_PROOF_WINDOW = _fraudProofWindow;\\n SEQUENCER_PUBLISH_WINDOW = _sequencerPublishWindow;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Accesses the batch storage container.\\n * @return Reference to the batch storage container.\\n */\\n function batches()\\n public\\n view\\n returns (\\n iOVM_ChainStorageContainer\\n )\\n {\\n return iOVM_ChainStorageContainer(\\n resolve(\\\"OVM_ChainStorageContainer:SCC:batches\\\")\\n );\\n }\\n\\n /**\\n * @inheritdoc iOVM_StateCommitmentChain\\n */\\n function getTotalElements()\\n override\\n public\\n view\\n returns (\\n uint256 _totalElements\\n )\\n {\\n (uint40 totalElements, ) = _getBatchExtraData();\\n return uint256(totalElements);\\n }\\n\\n /**\\n * @inheritdoc iOVM_StateCommitmentChain\\n */\\n function getTotalBatches()\\n override\\n public\\n view\\n returns (\\n uint256 _totalBatches\\n )\\n {\\n return batches().length();\\n }\\n\\n /**\\n * @inheritdoc iOVM_StateCommitmentChain\\n */\\n function getLastSequencerTimestamp()\\n override\\n public\\n view\\n returns (\\n uint256 _lastSequencerTimestamp\\n )\\n {\\n (, uint40 lastSequencerTimestamp) = _getBatchExtraData();\\n return uint256(lastSequencerTimestamp);\\n }\\n\\n /**\\n * @inheritdoc iOVM_StateCommitmentChain\\n */\\n function appendStateBatch(\\n bytes32[] memory _batch,\\n uint256 _shouldStartAtElement\\n )\\n override\\n public\\n {\\n // Fail fast in to make sure our batch roots aren't accidentally made fraudulent by the\\n // publication of batches by some other user.\\n require(\\n _shouldStartAtElement == getTotalElements(),\\n \\\"Actual batch start index does not match expected start index.\\\"\\n );\\n\\n // Proposers must have previously staked at the BondManager\\n require(\\n iOVM_BondManager(resolve(\\\"OVM_BondManager\\\")).isCollateralized(msg.sender),\\n \\\"Proposer does not have enough collateral posted\\\"\\n );\\n\\n require(\\n _batch.length > 0,\\n \\\"Cannot submit an empty state batch.\\\"\\n );\\n\\n require(\\n getTotalElements() + _batch.length <= iOVM_CanonicalTransactionChain(resolve(\\\"OVM_CanonicalTransactionChain\\\")).getTotalElements(),\\n \\\"Number of state roots cannot exceed the number of canonical transactions.\\\"\\n );\\n\\n // Pass the block's timestamp and the publisher of the data\\n // to be used in the fraud proofs\\n _appendBatch(\\n _batch,\\n abi.encode(block.timestamp, msg.sender)\\n );\\n }\\n\\n /**\\n * @inheritdoc iOVM_StateCommitmentChain\\n */\\n function deleteStateBatch(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n override\\n public\\n {\\n require(\\n msg.sender == resolve(\\\"OVM_FraudVerifier\\\"),\\n \\\"State batches can only be deleted by the OVM_FraudVerifier.\\\"\\n );\\n\\n require(\\n _isValidBatchHeader(_batchHeader),\\n \\\"Invalid batch header.\\\"\\n );\\n\\n require(\\n insideFraudProofWindow(_batchHeader),\\n \\\"State batches can only be deleted within the fraud proof window.\\\"\\n );\\n\\n _deleteBatch(_batchHeader);\\n }\\n\\n /**\\n * @inheritdoc iOVM_StateCommitmentChain\\n */\\n function verifyStateCommitment(\\n bytes32 _element,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _proof\\n )\\n override\\n public\\n view\\n returns (\\n bool\\n )\\n {\\n require(\\n _isValidBatchHeader(_batchHeader),\\n \\\"Invalid batch header.\\\"\\n );\\n\\n require(\\n Lib_MerkleTree.verify(\\n _batchHeader.batchRoot,\\n _element,\\n _proof.index,\\n _proof.siblings,\\n _batchHeader.batchSize\\n ),\\n \\\"Invalid inclusion proof.\\\"\\n );\\n\\n return true;\\n }\\n\\n /**\\n * @inheritdoc iOVM_StateCommitmentChain\\n */\\n function insideFraudProofWindow(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n override\\n public\\n view\\n returns (\\n bool _inside\\n )\\n {\\n (uint256 timestamp,) = abi.decode(\\n _batchHeader.extraData,\\n (uint256, address)\\n );\\n\\n require(\\n timestamp != 0,\\n \\\"Batch header timestamp cannot be zero\\\"\\n );\\n return SafeMath.add(timestamp, FRAUD_PROOF_WINDOW) > block.timestamp;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Parses the batch context from the extra data.\\n * @return Total number of elements submitted.\\n * @return Timestamp of the last batch submitted by the sequencer.\\n */\\n function _getBatchExtraData()\\n internal\\n view\\n returns (\\n uint40,\\n uint40\\n )\\n {\\n bytes27 extraData = batches().getGlobalMetadata();\\n\\n uint40 totalElements;\\n uint40 lastSequencerTimestamp;\\n assembly {\\n extraData := shr(40, extraData)\\n totalElements := and(extraData, 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF)\\n lastSequencerTimestamp := shr(40, and(extraData, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000))\\n }\\n\\n return (\\n totalElements,\\n lastSequencerTimestamp\\n );\\n }\\n\\n /**\\n * Encodes the batch context for the extra data.\\n * @param _totalElements Total number of elements submitted.\\n * @param _lastSequencerTimestamp Timestamp of the last batch submitted by the sequencer.\\n * @return Encoded batch context.\\n */\\n function _makeBatchExtraData(\\n uint40 _totalElements,\\n uint40 _lastSequencerTimestamp\\n )\\n internal\\n pure\\n returns (\\n bytes27\\n )\\n {\\n bytes27 extraData;\\n assembly {\\n extraData := _totalElements\\n extraData := or(extraData, shl(40, _lastSequencerTimestamp))\\n extraData := shl(40, extraData)\\n }\\n\\n return extraData;\\n }\\n\\n /**\\n * Appends a batch to the chain.\\n * @param _batch Elements within the batch.\\n * @param _extraData Any extra data to append to the batch.\\n */\\n function _appendBatch(\\n bytes32[] memory _batch,\\n bytes memory _extraData\\n )\\n internal\\n {\\n address sequencer = resolve(\\\"OVM_Sequencer\\\");\\n (uint40 totalElements, uint40 lastSequencerTimestamp) = _getBatchExtraData();\\n\\n if (msg.sender == sequencer) {\\n lastSequencerTimestamp = uint40(block.timestamp);\\n } else {\\n // We keep track of the last batch submitted by the sequencer so there's a window in\\n // which only the sequencer can publish state roots. A window like this just reduces\\n // the chance of \\\"system breaking\\\" state roots being published while we're still in\\n // testing mode. This window should be removed or significantly reduced in the future.\\n require(\\n lastSequencerTimestamp + SEQUENCER_PUBLISH_WINDOW < block.timestamp,\\n \\\"Cannot publish state roots within the sequencer publication window.\\\"\\n );\\n }\\n\\n Lib_OVMCodec.ChainBatchHeader memory batchHeader = Lib_OVMCodec.ChainBatchHeader({\\n batchIndex: getTotalBatches(),\\n batchRoot: Lib_MerkleTree.getMerkleRoot(_batch),\\n batchSize: _batch.length,\\n prevTotalElements: totalElements,\\n extraData: _extraData\\n });\\n\\n emit StateBatchAppended(\\n batchHeader.batchIndex,\\n batchHeader.batchRoot,\\n batchHeader.batchSize,\\n batchHeader.prevTotalElements,\\n batchHeader.extraData\\n );\\n\\n batches().push(\\n Lib_OVMCodec.hashBatchHeader(batchHeader),\\n _makeBatchExtraData(\\n uint40(batchHeader.prevTotalElements + batchHeader.batchSize),\\n lastSequencerTimestamp\\n )\\n );\\n }\\n\\n /**\\n * Removes a batch and all subsequent batches from the chain.\\n * @param _batchHeader Header of the batch to remove.\\n */\\n function _deleteBatch(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n internal\\n {\\n require(\\n _batchHeader.batchIndex < batches().length(),\\n \\\"Invalid batch index.\\\"\\n );\\n\\n require(\\n _isValidBatchHeader(_batchHeader),\\n \\\"Invalid batch header.\\\"\\n );\\n\\n batches().deleteElementsAfterInclusive(\\n _batchHeader.batchIndex,\\n _makeBatchExtraData(\\n uint40(_batchHeader.prevTotalElements),\\n 0\\n )\\n );\\n\\n emit StateBatchDeleted(\\n _batchHeader.batchIndex,\\n _batchHeader.batchRoot\\n );\\n }\\n\\n /**\\n * Checks that a batch header matches the stored hash for the given index.\\n * @param _batchHeader Batch header to validate.\\n * @return Whether or not the header matches the stored one.\\n */\\n function _isValidBatchHeader(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n internal\\n view\\n returns (\\n bool\\n )\\n {\\n return Lib_OVMCodec.hashBatchHeader(_batchHeader) == batches().get(_batchHeader.batchIndex);\\n }\\n}\\n\",\"keccak256\":\"0xb93198fb1ea4469f21deb7329f5f0e1e3a826cd14a959fa4b8ffdd2cd325a715\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_CanonicalTransactionChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title iOVM_CanonicalTransactionChain\\n */\\ninterface iOVM_CanonicalTransactionChain {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event TransactionEnqueued(\\n address _l1TxOrigin,\\n address _target,\\n uint256 _gasLimit,\\n bytes _data,\\n uint256 _queueIndex,\\n uint256 _timestamp\\n );\\n\\n event QueueBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event SequencerBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event TransactionBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct BatchContext {\\n uint256 numSequencedTransactions;\\n uint256 numSubsequentQueueTransactions;\\n uint256 timestamp;\\n uint256 blockNumber;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements()\\n external\\n view\\n returns (\\n uint256 _totalElements\\n );\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches()\\n external\\n view\\n returns (\\n uint256 _totalBatches\\n );\\n\\n /**\\n * Returns the index of the next element to be enqueued.\\n * @return Index for the next queue element.\\n */\\n function getNextQueueIndex()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Get the number of queue elements which have not yet been included.\\n * @return Length of the queue.\\n */\\n function getNumPendingQueueElements()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Retrieves the length of the queue, including\\n * both pending and canonical transactions.\\n * @return Length of the queue.\\n */\\n function getQueueLength()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Gets the queue element at a particular index.\\n * @param _index Index of the queue element to access.\\n * @return _element Queue element at the given index.\\n */\\n function getQueueElement(\\n uint256 _index\\n )\\n external\\n view\\n returns (\\n Lib_OVMCodec.QueueElement memory _element\\n );\\n\\n /**\\n * Adds a transaction to the queue.\\n * @param _target Target contract to send the transaction to.\\n * @param _gasLimit Gas limit for the given transaction.\\n * @param _data Transaction data.\\n */\\n function enqueue(\\n address _target,\\n uint256 _gasLimit,\\n bytes memory _data\\n )\\n external;\\n\\n /**\\n * Appends a given number of queued transactions as a single batch.\\n * @param _numQueuedTransactions Number of transactions to append.\\n */\\n function appendQueueBatch(\\n uint256 _numQueuedTransactions\\n )\\n external;\\n\\n /**\\n * Allows the sequencer to append a batch of transactions.\\n * @dev This function uses a custom encoding scheme for efficiency reasons.\\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\\n * .param _contexts Array of batch contexts.\\n * .param _transactionDataFields Array of raw transaction data.\\n */\\n function appendSequencerBatch(\\n // uint40 _shouldStartAtElement,\\n // uint24 _totalElementsToAppend,\\n // BatchContext[] _contexts,\\n // bytes[] _transactionDataFields\\n )\\n external;\\n\\n /**\\n * Verifies whether a transaction is included in the chain.\\n * @param _transaction Transaction to verify.\\n * @param _txChainElement Transaction chain element corresponding to the transaction.\\n * @param _batchHeader Header of the batch the transaction was included in.\\n * @param _inclusionProof Inclusion proof for the provided transaction chain element.\\n * @return True if the transaction exists in the CTC, false if not.\\n */\\n function verifyTransaction(\\n Lib_OVMCodec.Transaction memory _transaction,\\n Lib_OVMCodec.TransactionChainElement memory _txChainElement,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _inclusionProof\\n )\\n external\\n view\\n returns (\\n bool\\n );\\n}\\n\",\"keccak256\":\"0x82a4e62286c8bc5e2d3de33f66d9b707cb9636e553dca54b5e95277bd794a934\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_ChainStorageContainer.sol\":{\"content\":\"pragma solidity ^0.7.0;\\n\\n/**\\n * @title iOVM_ChainStorageContainer\\n */\\ninterface iOVM_ChainStorageContainer {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata()\\n external\\n view\\n returns (\\n bytes27\\n );\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length()\\n external\\n view\\n returns (\\n uint256\\n );\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(\\n bytes32 _object\\n )\\n external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(\\n bytes32 _object,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Pushes two objects into the container at the same time. A useful optimization.\\n * @param _objectA First 32 byte value to insert into the container.\\n * @param _objectB Second 32 byte value to insert into the container.\\n */\\n function push2(\\n bytes32 _objectA,\\n bytes32 _objectB\\n )\\n external;\\n\\n /**\\n * Pushes two objects into the container at the same time. Also allows setting the global\\n * metadata field.\\n * @param _objectA First 32 byte value to insert into the container.\\n * @param _objectB Second 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push2(\\n bytes32 _objectA,\\n bytes32 _objectB,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(\\n uint256 _index\\n )\\n external\\n view\\n returns (\\n bytes32\\n );\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index\\n )\\n external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Marks an index as overwritable, meaing the underlying buffer can start to write values over\\n * any objects before and including the given index.\\n */\\n function setNextOverwritableIndex(\\n uint256 _index\\n )\\n external;\\n}\\n\",\"keccak256\":\"0xcfca7da85b35d94c27581c2460b0d48fd0cc51fa72670cc7a2f7f760fb21a2f0\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_StateCommitmentChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title iOVM_StateCommitmentChain\\n */\\ninterface iOVM_StateCommitmentChain {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event StateBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n event StateBatchDeleted(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot\\n );\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements()\\n external\\n view\\n returns (\\n uint256 _totalElements\\n );\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches()\\n external\\n view\\n returns (\\n uint256 _totalBatches\\n );\\n\\n /**\\n * Retrieves the timestamp of the last batch submitted by the sequencer.\\n * @return _lastSequencerTimestamp Last sequencer batch timestamp.\\n */\\n function getLastSequencerTimestamp()\\n external\\n view\\n returns (\\n uint256 _lastSequencerTimestamp\\n );\\n\\n /**\\n * Appends a batch of state roots to the chain.\\n * @param _batch Batch of state roots.\\n * @param _shouldStartAtElement Index of the element at which this batch should start.\\n */\\n function appendStateBatch(\\n bytes32[] calldata _batch,\\n uint256 _shouldStartAtElement\\n )\\n external;\\n\\n /**\\n * Deletes all state roots after (and including) a given batch.\\n * @param _batchHeader Header of the batch to start deleting from.\\n */\\n function deleteStateBatch(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n external;\\n\\n /**\\n * Verifies a batch inclusion proof.\\n * @param _element Hash of the element to verify a proof for.\\n * @param _batchHeader Header of the batch in which the element was included.\\n * @param _proof Merkle inclusion proof for the element.\\n */\\n function verifyStateCommitment(\\n bytes32 _element,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _proof\\n )\\n external\\n view\\n returns (\\n bool _verified\\n );\\n\\n /**\\n * Checks whether a given batch is still inside its fraud proof window.\\n * @param _batchHeader Header of the batch to check.\\n * @return _inside Whether or not the batch is inside the fraud proof window.\\n */\\n function insideFraudProofWindow(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n external\\n view\\n returns (\\n bool _inside\\n );\\n}\\n\",\"keccak256\":\"0x6646d6ff392b81aab52a7a277e91540819464751de0af5afd1962094b2e92448\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/verification/iOVM_BondManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\ninterface ERC20 {\\n function transfer(address, uint256) external returns (bool);\\n function transferFrom(address, address, uint256) external returns (bool);\\n}\\n\\n/// All the errors which may be encountered on the bond manager\\nlibrary Errors {\\n string constant ERC20_ERR = \\\"BondManager: Could not post bond\\\";\\n string constant ALREADY_FINALIZED = \\\"BondManager: Fraud proof for this pre-state root has already been finalized\\\";\\n string constant SLASHED = \\\"BondManager: Cannot finalize withdrawal, you probably got slashed\\\";\\n string constant WRONG_STATE = \\\"BondManager: Wrong bond state for proposer\\\";\\n string constant CANNOT_CLAIM = \\\"BondManager: Cannot claim yet. Dispute must be finalized first\\\";\\n\\n string constant WITHDRAWAL_PENDING = \\\"BondManager: Withdrawal already pending\\\";\\n string constant TOO_EARLY = \\\"BondManager: Too early to finalize your withdrawal\\\";\\n\\n string constant ONLY_TRANSITIONER = \\\"BondManager: Only the transitioner for this pre-state root may call this function\\\";\\n string constant ONLY_FRAUD_VERIFIER = \\\"BondManager: Only the fraud verifier may call this function\\\";\\n string constant ONLY_STATE_COMMITMENT_CHAIN = \\\"BondManager: Only the state commitment chain may call this function\\\";\\n string constant WAIT_FOR_DISPUTES = \\\"BondManager: Wait for other potential disputes\\\";\\n}\\n\\n/**\\n * @title iOVM_BondManager\\n */\\ninterface iOVM_BondManager {\\n\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n /// The lifecycle of a proposer's bond\\n enum State {\\n // Before depositing or after getting slashed, a user is uncollateralized\\n NOT_COLLATERALIZED,\\n // After depositing, a user is collateralized\\n COLLATERALIZED,\\n // After a user has initiated a withdrawal\\n WITHDRAWING\\n }\\n\\n /// A bond posted by a proposer\\n struct Bond {\\n // The user's state\\n State state;\\n // The timestamp at which a proposer issued their withdrawal request\\n uint32 withdrawalTimestamp;\\n // The time when the first disputed was initiated for this bond\\n uint256 firstDisputeAt;\\n // The earliest observed state root for this bond which has had fraud\\n bytes32 earliestDisputedStateRoot;\\n // The state root's timestamp\\n uint256 earliestTimestamp;\\n }\\n\\n // Per pre-state root, store the number of state provisions that were made\\n // and how many of these calls were made by each user. Payouts will then be\\n // claimed by users proportionally for that dispute.\\n struct Rewards {\\n // Flag to check if rewards for a fraud proof are claimable\\n bool canClaim;\\n // Total number of `recordGasSpent` calls made\\n uint256 total;\\n // The gas spent by each user to provide witness data. The sum of all\\n // values inside this map MUST be equal to the value of `total`\\n mapping(address => uint256) gasSpent;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function recordGasSpent(\\n bytes32 _preStateRoot,\\n bytes32 _txHash,\\n address _who,\\n uint256 _gasSpent\\n ) external;\\n\\n function finalize(\\n bytes32 _preStateRoot,\\n address _publisher,\\n uint256 _timestamp\\n ) external;\\n\\n function deposit() external;\\n\\n function startWithdrawal() external;\\n\\n function finalizeWithdrawal() external;\\n\\n function claim(\\n address _who\\n ) external;\\n\\n function isCollateralized(\\n address _who\\n ) external view returns (bool);\\n\\n function getGasSpent(\\n bytes32 _preStateRoot,\\n address _who\\n ) external view returns (uint256);\\n}\\n\",\"keccak256\":\"0x3c2a8a399487857158649db1896749d86e39cba545a8aeb2e2bb0f3bdfa7a5b1\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/verification/iOVM_FraudVerifier.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_StateTransitioner } from \\\"./iOVM_StateTransitioner.sol\\\";\\n\\n/**\\n * @title iOVM_FraudVerifier\\n */\\ninterface iOVM_FraudVerifier {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event FraudProofInitialized(\\n bytes32 _preStateRoot,\\n uint256 _preStateRootIndex,\\n bytes32 _transactionHash,\\n address _who\\n );\\n\\n event FraudProofFinalized(\\n bytes32 _preStateRoot,\\n uint256 _preStateRootIndex,\\n bytes32 _transactionHash,\\n address _who\\n );\\n\\n\\n /***************************************\\n * Public Functions: Transition Status *\\n ***************************************/\\n\\n function getStateTransitioner(bytes32 _preStateRoot, bytes32 _txHash) external view returns (iOVM_StateTransitioner _transitioner);\\n\\n\\n /****************************************\\n * Public Functions: Fraud Verification *\\n ****************************************/\\n\\n function initializeFraudVerification(\\n bytes32 _preStateRoot,\\n Lib_OVMCodec.ChainBatchHeader calldata _preStateRootBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof calldata _preStateRootProof,\\n Lib_OVMCodec.Transaction calldata _transaction,\\n Lib_OVMCodec.TransactionChainElement calldata _txChainElement,\\n Lib_OVMCodec.ChainBatchHeader calldata _transactionBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof calldata _transactionProof\\n ) external;\\n\\n function finalizeFraudVerification(\\n bytes32 _preStateRoot,\\n Lib_OVMCodec.ChainBatchHeader calldata _preStateRootBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof calldata _preStateRootProof,\\n bytes32 _txHash,\\n bytes32 _postStateRoot,\\n Lib_OVMCodec.ChainBatchHeader calldata _postStateRootBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof calldata _postStateRootProof\\n ) external;\\n}\\n\",\"keccak256\":\"0x5efd7bb18164bbd3e9d58379e8203fbf2a7ee802b1a48dff3ceaaec1523b1751\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/verification/iOVM_StateTransitioner.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title iOVM_StateTransitioner\\n */\\ninterface iOVM_StateTransitioner {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AccountCommitted(\\n address _address\\n );\\n\\n event ContractStorageCommitted(\\n address _address,\\n bytes32 _key\\n );\\n\\n\\n /**********************************\\n * Public Functions: State Access *\\n **********************************/\\n\\n function getPreStateRoot() external view returns (bytes32 _preStateRoot);\\n function getPostStateRoot() external view returns (bytes32 _postStateRoot);\\n function isComplete() external view returns (bool _complete);\\n\\n\\n /***********************************\\n * Public Functions: Pre-Execution *\\n ***********************************/\\n\\n function proveContractState(\\n address _ovmContractAddress,\\n address _ethContractAddress,\\n bytes calldata _stateTrieWitness\\n ) external;\\n\\n function proveStorageSlot(\\n address _ovmContractAddress,\\n bytes32 _key,\\n bytes calldata _storageTrieWitness\\n ) external;\\n\\n\\n /*******************************\\n * Public Functions: Execution *\\n *******************************/\\n\\n function applyTransaction(\\n Lib_OVMCodec.Transaction calldata _transaction\\n ) external;\\n\\n\\n /************************************\\n * Public Functions: Post-Execution *\\n ************************************/\\n\\n function commitContractState(\\n address _ovmContractAddress,\\n bytes calldata _stateTrieWitness\\n ) external;\\n\\n function commitStorageSlot(\\n address _ovmContractAddress,\\n bytes32 _key,\\n bytes calldata _storageTrieWitness\\n ) external;\\n\\n\\n /**********************************\\n * Public Functions: Finalization *\\n **********************************/\\n\\n function completeTransition() external;\\n}\\n\",\"keccak256\":\"0x3d044ac0a3bb6ad3d529f904b3191117511f9c379678ca03010e1ebdfcb5c34b\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/codec/Lib_OVMCodec.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../utils/Lib_Bytes32Utils.sol\\\";\\nimport { Lib_SafeExecutionManagerWrapper } from \\\"../../libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\\\";\\n\\n/**\\n * @title Lib_OVMCodec\\n */\\nlibrary Lib_OVMCodec {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n bytes constant internal RLP_NULL_BYTES = hex'80';\\n bytes constant internal NULL_BYTES = bytes('');\\n\\n // Ring buffer IDs\\n bytes32 constant internal RING_BUFFER_SCC_BATCHES = keccak256(\\\"RING_BUFFER_SCC_BATCHES\\\");\\n bytes32 constant internal RING_BUFFER_CTC_BATCHES = keccak256(\\\"RING_BUFFER_CTC_BATCHES\\\");\\n bytes32 constant internal RING_BUFFER_CTC_QUEUE = keccak256(\\\"RING_BUFFER_CTC_QUEUE\\\");\\n\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum EOASignatureType {\\n EIP155_TRANSACTON,\\n ETH_SIGNED_MESSAGE\\n }\\n\\n enum QueueOrigin {\\n SEQUENCER_QUEUE,\\n L1TOL2_QUEUE\\n }\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Account {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n address ethAddress;\\n bool isFresh;\\n }\\n\\n struct EVMAccount {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n }\\n\\n struct ChainBatchHeader {\\n uint256 batchIndex;\\n bytes32 batchRoot;\\n uint256 batchSize;\\n uint256 prevTotalElements;\\n bytes extraData;\\n }\\n\\n struct ChainInclusionProof {\\n uint256 index;\\n bytes32[] siblings;\\n }\\n\\n struct Transaction {\\n uint256 timestamp;\\n uint256 blockNumber;\\n QueueOrigin l1QueueOrigin;\\n address l1TxOrigin;\\n address entrypoint;\\n uint256 gasLimit;\\n bytes data;\\n }\\n\\n struct TransactionChainElement {\\n bool isSequenced;\\n uint256 queueIndex; // QUEUED TX ONLY\\n uint256 timestamp; // SEQUENCER TX ONLY\\n uint256 blockNumber; // SEQUENCER TX ONLY\\n bytes txData; // SEQUENCER TX ONLY\\n }\\n\\n struct QueueElement {\\n bytes32 queueRoot;\\n uint40 timestamp;\\n uint40 blockNumber;\\n }\\n\\n struct EIP155Transaction {\\n uint256 nonce;\\n uint256 gasPrice;\\n uint256 gasLimit;\\n address to;\\n uint256 value;\\n bytes data;\\n uint256 chainId;\\n }\\n\\n\\n /*********************************************\\n * Internal Functions: Encoding and Decoding *\\n *********************************************/\\n\\n /**\\n * Decodes an EOA transaction (i.e., native Ethereum RLP encoding).\\n * @param _transaction Encoded EOA transaction.\\n * @return _decoded Transaction decoded into a struct.\\n */\\n function decodeEIP155Transaction(\\n bytes memory _transaction,\\n bool _isEthSignedMessage\\n )\\n internal\\n pure\\n returns (\\n EIP155Transaction memory _decoded\\n )\\n {\\n if (_isEthSignedMessage) {\\n (\\n uint256 _nonce,\\n uint256 _gasLimit,\\n uint256 _gasPrice,\\n uint256 _chainId,\\n address _to,\\n bytes memory _data\\n ) = abi.decode(\\n _transaction,\\n (uint256, uint256, uint256, uint256, address ,bytes)\\n );\\n return EIP155Transaction({\\n nonce: _nonce,\\n gasPrice: _gasPrice,\\n gasLimit: _gasLimit,\\n to: _to,\\n value: 0,\\n data: _data,\\n chainId: _chainId\\n });\\n } else {\\n Lib_RLPReader.RLPItem[] memory decoded = Lib_RLPReader.readList(_transaction);\\n\\n return EIP155Transaction({\\n nonce: Lib_RLPReader.readUint256(decoded[0]),\\n gasPrice: Lib_RLPReader.readUint256(decoded[1]),\\n gasLimit: Lib_RLPReader.readUint256(decoded[2]),\\n to: Lib_RLPReader.readAddress(decoded[3]),\\n value: Lib_RLPReader.readUint256(decoded[4]),\\n data: Lib_RLPReader.readBytes(decoded[5]),\\n chainId: Lib_RLPReader.readUint256(decoded[6])\\n });\\n }\\n }\\n\\n function decompressEIP155Transaction(\\n bytes memory _transaction\\n )\\n internal\\n returns (\\n EIP155Transaction memory _decompressed\\n )\\n {\\n return EIP155Transaction({\\n gasLimit: Lib_BytesUtils.toUint24(_transaction, 0),\\n gasPrice: uint256(Lib_BytesUtils.toUint24(_transaction, 3)) * 1000000,\\n nonce: Lib_BytesUtils.toUint24(_transaction, 6),\\n to: Lib_BytesUtils.toAddress(_transaction, 9),\\n data: Lib_BytesUtils.slice(_transaction, 29),\\n chainId: Lib_SafeExecutionManagerWrapper.safeCHAINID(),\\n value: 0\\n });\\n }\\n\\n /**\\n * Encodes an EOA transaction back into the original transaction.\\n * @param _transaction EIP155transaction to encode.\\n * @param _isEthSignedMessage Whether or not this was an eth signed message.\\n * @return Encoded transaction.\\n */\\n function encodeEIP155Transaction(\\n EIP155Transaction memory _transaction,\\n bool _isEthSignedMessage\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n if (_isEthSignedMessage) {\\n return abi.encode(\\n _transaction.nonce,\\n _transaction.gasLimit,\\n _transaction.gasPrice,\\n _transaction.chainId,\\n _transaction.to,\\n _transaction.data\\n );\\n } else {\\n bytes[] memory raw = new bytes[](9);\\n\\n raw[0] = Lib_RLPWriter.writeUint(_transaction.nonce);\\n raw[1] = Lib_RLPWriter.writeUint(_transaction.gasPrice);\\n raw[2] = Lib_RLPWriter.writeUint(_transaction.gasLimit);\\n if (_transaction.to == address(0)) {\\n raw[3] = Lib_RLPWriter.writeBytes('');\\n } else {\\n raw[3] = Lib_RLPWriter.writeAddress(_transaction.to);\\n }\\n raw[4] = Lib_RLPWriter.writeUint(0);\\n raw[5] = Lib_RLPWriter.writeBytes(_transaction.data);\\n raw[6] = Lib_RLPWriter.writeUint(_transaction.chainId);\\n raw[7] = Lib_RLPWriter.writeBytes(bytes(''));\\n raw[8] = Lib_RLPWriter.writeBytes(bytes(''));\\n\\n return Lib_RLPWriter.writeList(raw);\\n }\\n }\\n\\n /**\\n * Encodes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return _encoded Encoded transaction bytes.\\n */\\n function encodeTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes memory _encoded\\n )\\n {\\n return abi.encodePacked(\\n _transaction.timestamp,\\n _transaction.blockNumber,\\n _transaction.l1QueueOrigin,\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n );\\n }\\n\\n /**\\n * Hashes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return _hash Hashed transaction\\n */\\n function hashTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes32 _hash\\n )\\n {\\n return keccak256(encodeTransaction(_transaction));\\n }\\n\\n /**\\n * Converts an OVM account to an EVM account.\\n * @param _in OVM account to convert.\\n * @return _out Converted EVM account.\\n */\\n function toEVMAccount(\\n Account memory _in\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory _out\\n )\\n {\\n return EVMAccount({\\n nonce: _in.nonce,\\n balance: _in.balance,\\n storageRoot: _in.storageRoot,\\n codeHash: _in.codeHash\\n });\\n }\\n\\n /**\\n * @notice RLP-encodes an account state struct.\\n * @param _account Account state struct.\\n * @return _encoded RLP-encoded account state.\\n */\\n function encodeEVMAccount(\\n EVMAccount memory _account\\n )\\n internal\\n pure\\n returns (\\n bytes memory _encoded\\n )\\n {\\n bytes[] memory raw = new bytes[](4);\\n\\n // Unfortunately we can't create this array outright because\\n // Lib_RLPWriter.writeList will reject fixed-size arrays. Assigning\\n // index-by-index circumvents this issue.\\n raw[0] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.nonce)\\n )\\n );\\n raw[1] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.balance)\\n )\\n );\\n raw[2] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.storageRoot));\\n raw[3] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.codeHash));\\n\\n return Lib_RLPWriter.writeList(raw);\\n }\\n\\n /**\\n * @notice Decodes an RLP-encoded account state into a useful struct.\\n * @param _encoded RLP-encoded account state.\\n * @return _account Account state struct.\\n */\\n function decodeEVMAccount(\\n bytes memory _encoded\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory _account\\n )\\n {\\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\\n\\n return EVMAccount({\\n nonce: Lib_RLPReader.readUint256(accountState[0]),\\n balance: Lib_RLPReader.readUint256(accountState[1]),\\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\\n });\\n }\\n\\n /**\\n * Calculates a hash for a given batch header.\\n * @param _batchHeader Header to hash.\\n * @return _hash Hash of the header.\\n */\\n function hashBatchHeader(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n internal\\n pure\\n returns (\\n bytes32 _hash\\n )\\n {\\n return keccak256(\\n abi.encode(\\n _batchHeader.batchRoot,\\n _batchHeader.batchSize,\\n _batchHeader.prevTotalElements,\\n _batchHeader.extraData\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0x19d78734777b4998f1544e235cf3934f20c5055cd76c2bd60bf0f6dacdd72b3a\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// +build ovm\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Contract Imports */\\nimport { Ownable } from \\\"./Lib_Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n /*******************************************\\n * Contract Variables: Internal Accounting *\\n *******************************************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n public\\n onlyOwner\\n {\\n emit AddressSet(_name, _address);\\n addresses[_getNameHash(_name)] = _address;\\n }\\n\\n function getAddress(\\n string memory _name\\n )\\n public\\n view\\n returns (address)\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32 _hash\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xdf802e1cc6474df913626991e9fca3835c620a519f397afe04bf9c260e723257\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// +build ovm\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\ncontract Lib_AddressResolver {\\n\\n /*******************************************\\n * Contract Variables: Contract References *\\n *******************************************/\\n\\n Lib_AddressManager internal libAddressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(\\n address _libAddressManager\\n ) public {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function resolve(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address _contract\\n )\\n {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0xf3b9d78b309ddeec259ce3e0e1cfdef3ca40938e9a81971b28ce2b8ea327f533\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// +build ovm\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Ownable\\n * @dev Adapted from https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol\\n */\\nabstract contract Ownable {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n address public owner;\\n\\n\\n /**********\\n * Events *\\n **********/\\n\\n event OwnershipTransferred(\\n address indexed previousOwner,\\n address indexed newOwner\\n );\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n constructor() internal {\\n owner = msg.sender;\\n emit OwnershipTransferred(address(0), owner);\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n owner == msg.sender,\\n \\\"Ownable: caller is not the owner\\\"\\n );\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function renounceOwnership()\\n public\\n virtual\\n onlyOwner\\n {\\n emit OwnershipTransferred(owner, address(0));\\n owner = address(0);\\n }\\n\\n function transferOwnership(address _newOwner)\\n public\\n virtual\\n onlyOwner\\n {\\n require(\\n _newOwner != address(0),\\n \\\"Ownable: new owner cannot be the zero address\\\"\\n );\\n\\n emit OwnershipTransferred(owner, _newOwner);\\n owner = _newOwner;\\n }\\n}\\n\",\"keccak256\":\"0xe0409fbd236d16ca6be439d9d97dd36d0d9a0697ee0062d49588b9d29c248e47\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPReader.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.7.0;\\n\\n/**\\n * @title Lib_RLPReader\\n * @dev Adapted from \\\"RLPReader\\\" by Hamdi Allam (hamdi.allam97@gmail.com).\\n */\\nlibrary Lib_RLPReader {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 constant internal MAX_LIST_LENGTH = 32;\\n\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum RLPItemType {\\n DATA_ITEM,\\n LIST_ITEM\\n }\\n\\n \\n /***********\\n * Structs *\\n ***********/\\n\\n struct RLPItem {\\n uint256 length;\\n uint256 ptr;\\n }\\n \\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n \\n /**\\n * Converts bytes to a reference to memory position and length.\\n * @param _in Input bytes to convert.\\n * @return Output memory reference.\\n */\\n function toRLPItem(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem memory\\n )\\n {\\n uint256 ptr;\\n assembly {\\n ptr := add(_in, 32)\\n }\\n\\n return RLPItem({\\n length: _in.length,\\n ptr: ptr\\n });\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n (\\n uint256 listOffset,\\n ,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.LIST_ITEM,\\n \\\"Invalid RLP list value.\\\"\\n );\\n\\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\\n // writing to the length. Since we can't know the number of RLP items without looping over\\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\\n // simply set a reasonable maximum list length and decrease the size before we finish.\\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\\n\\n uint256 itemCount = 0;\\n uint256 offset = listOffset;\\n while (offset < _in.length) {\\n require(\\n itemCount < MAX_LIST_LENGTH,\\n \\\"Provided RLP list exceeds max list length.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n ) = _decodeLength(RLPItem({\\n length: _in.length - offset,\\n ptr: _in.ptr + offset\\n }));\\n\\n out[itemCount] = RLPItem({\\n length: itemLength + itemOffset,\\n ptr: _in.ptr + offset\\n });\\n\\n itemCount += 1;\\n offset += itemOffset + itemLength;\\n }\\n\\n // Decrease the array size to match the actual item count.\\n assembly {\\n mstore(out, itemCount)\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n return readList(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes value.\\\"\\n );\\n\\n return _copy(_in.ptr, itemOffset, itemLength);\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return readBytes(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return string(readBytes(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return readString(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n require(\\n _in.length <= 33,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr + itemOffset;\\n bytes32 out;\\n assembly {\\n out := mload(ptr)\\n\\n // Shift the bytes over to match the item size.\\n if lt(itemLength, 32) {\\n out := div(out, exp(256, sub(32, itemLength)))\\n }\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return readBytes32(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return uint256(readBytes32(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return readUint256(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n require(\\n _in.length == 1,\\n \\\"Invalid RLP boolean value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 out;\\n assembly {\\n out := byte(0, mload(ptr))\\n }\\n\\n return out != 0;\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return readBool(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n if (_in.length == 1) {\\n return address(0);\\n }\\n\\n require(\\n _in.length == 21,\\n \\\"Invalid RLP address value.\\\"\\n );\\n\\n return address(readUint256(_in));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return readAddress(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads the raw bytes of an RLP item.\\n * @param _in RLP item to read.\\n * @return Raw RLP bytes.\\n */\\n function readRawBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in);\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Decodes the length of an RLP item.\\n * @param _in RLP item to decode.\\n * @return Offset of the encoded data.\\n * @return Length of the encoded data.\\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\\n */\\n function _decodeLength(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n uint256,\\n uint256,\\n RLPItemType\\n )\\n {\\n require(\\n _in.length > 0,\\n \\\"RLP item cannot be null.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 prefix;\\n assembly {\\n prefix := byte(0, mload(ptr))\\n }\\n\\n if (prefix <= 0x7f) {\\n // Single byte.\\n\\n return (0, 1, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xb7) {\\n // Short string.\\n\\n uint256 strLen = prefix - 0x80;\\n \\n require(\\n _in.length > strLen,\\n \\\"Invalid RLP short string.\\\"\\n );\\n\\n return (1, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xbf) {\\n // Long string.\\n uint256 lenOfStrLen = prefix - 0xb7;\\n\\n require(\\n _in.length > lenOfStrLen,\\n \\\"Invalid RLP long string length.\\\"\\n );\\n\\n uint256 strLen;\\n assembly {\\n // Pick out the string length.\\n strLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfStrLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfStrLen + strLen,\\n \\\"Invalid RLP long string.\\\"\\n );\\n\\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xf7) {\\n // Short list.\\n uint256 listLen = prefix - 0xc0;\\n\\n require(\\n _in.length > listLen,\\n \\\"Invalid RLP short list.\\\"\\n );\\n\\n return (1, listLen, RLPItemType.LIST_ITEM);\\n } else {\\n // Long list.\\n uint256 lenOfListLen = prefix - 0xf7;\\n\\n require(\\n _in.length > lenOfListLen,\\n \\\"Invalid RLP long list length.\\\"\\n );\\n\\n uint256 listLen;\\n assembly {\\n // Pick out the list length.\\n listLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfListLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfListLen + listLen,\\n \\\"Invalid RLP long list.\\\"\\n );\\n\\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\\n }\\n }\\n\\n /**\\n * Copies the bytes from a memory location.\\n * @param _src Pointer to the location to read from.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Copied bytes.\\n */\\n function _copy(\\n uint256 _src,\\n uint256 _offset,\\n uint256 _length\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out = new bytes(_length);\\n if (out.length == 0) {\\n return out;\\n }\\n\\n uint256 src = _src + _offset;\\n uint256 dest;\\n assembly {\\n dest := add(out, 32)\\n }\\n\\n // Copy over as many complete words as we can.\\n for (uint256 i = 0; i < _length / 32; i++) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n\\n src += 32;\\n dest += 32;\\n }\\n\\n // Pick out the remaining bytes.\\n uint256 mask = 256 ** (32 - (_length % 32)) - 1;\\n assembly {\\n mstore(\\n dest,\\n or(\\n and(mload(src), not(mask)),\\n and(mload(dest), mask)\\n )\\n )\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Copies an RLP item into bytes.\\n * @param _in RLP item to copy.\\n * @return Copied bytes.\\n */\\n function _copy(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in.ptr, 0, _in.length);\\n }\\n}\\n\",\"keccak256\":\"0x8338f7b6e5f0ded8fc36d9088fd127ee53ae4040ca3f4838eb6123f642d38c62\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPWriter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.7.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\n\\n/**\\n * @title Lib_RLPWriter\\n * @author Bakaoh (with modifications)\\n */\\nlibrary Lib_RLPWriter {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * RLP encodes a byte string.\\n * @param _in The byte string to encode.\\n * @return _out The RLP encoded string in bytes.\\n */\\n function writeBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n bytes memory encoded;\\n\\n if (_in.length == 1 && uint8(_in[0]) < 128) {\\n encoded = _in;\\n } else {\\n encoded = Lib_BytesUtils.concat(_writeLength(_in.length, 128), _in);\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * RLP encodes a list of RLP encoded byte byte strings.\\n * @param _in The list of RLP encoded byte strings.\\n * @return _out The RLP encoded list of items in bytes.\\n */\\n function writeList(\\n bytes[] memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n bytes memory list = _flatten(_in);\\n return Lib_BytesUtils.concat(_writeLength(list.length, 192), list);\\n }\\n\\n /**\\n * RLP encodes a string.\\n * @param _in The string to encode.\\n * @return _out The RLP encoded string in bytes.\\n */\\n function writeString(\\n string memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(bytes(_in));\\n }\\n\\n /**\\n * RLP encodes an address.\\n * @param _in The address to encode.\\n * @return _out The RLP encoded address in bytes.\\n */\\n function writeAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a uint.\\n * @param _in The uint256 to encode.\\n * @return _out The RLP encoded uint256 in bytes.\\n */\\n function writeUint(\\n uint256 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(_toBinary(_in));\\n }\\n\\n /**\\n * RLP encodes a bool.\\n * @param _in The bool to encode.\\n * @return _out The RLP encoded bool in bytes.\\n */\\n function writeBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n bytes memory encoded = new bytes(1);\\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\\n return encoded;\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\\n * @param _len The length of the string or the payload.\\n * @param _offset 128 if item is string, 192 if item is list.\\n * @return _encoded RLP encoded bytes.\\n */\\n function _writeLength(\\n uint256 _len,\\n uint256 _offset\\n )\\n private\\n pure\\n returns (\\n bytes memory _encoded\\n )\\n {\\n bytes memory encoded;\\n\\n if (_len < 56) {\\n encoded = new bytes(1);\\n encoded[0] = byte(uint8(_len) + uint8(_offset));\\n } else {\\n uint256 lenLen;\\n uint256 i = 1;\\n while (_len / i != 0) {\\n lenLen++;\\n i *= 256;\\n }\\n\\n encoded = new bytes(lenLen + 1);\\n encoded[0] = byte(uint8(lenLen) + uint8(_offset) + 55);\\n for(i = 1; i <= lenLen; i++) {\\n encoded[i] = byte(uint8((_len / (256**(lenLen-i))) % 256));\\n }\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * Encode integer in big endian binary form with no leading zeroes.\\n * @notice TODO: This should be optimized with assembly to save gas costs.\\n * @param _x The integer to encode.\\n * @return _binary RLP encoded bytes.\\n */\\n function _toBinary(\\n uint256 _x\\n )\\n private\\n pure\\n returns (\\n bytes memory _binary\\n )\\n {\\n bytes memory b = abi.encodePacked(_x);\\n\\n uint256 i = 0;\\n for (; i < 32; i++) {\\n if (b[i] != 0) {\\n break;\\n }\\n }\\n\\n bytes memory res = new bytes(32 - i);\\n for (uint256 j = 0; j < res.length; j++) {\\n res[j] = b[i++];\\n }\\n\\n return res;\\n }\\n\\n /**\\n * Copies a piece of memory to another location.\\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\\n * @param _dest Destination location.\\n * @param _src Source location.\\n * @param _len Length of memory to copy.\\n */\\n function _memcpy(\\n uint256 _dest,\\n uint256 _src,\\n uint256 _len\\n )\\n private\\n pure\\n {\\n uint256 dest = _dest;\\n uint256 src = _src;\\n uint256 len = _len;\\n\\n for(; len >= 32; len -= 32) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n dest += 32;\\n src += 32;\\n }\\n\\n uint256 mask = 256 ** (32 - len) - 1;\\n assembly {\\n let srcpart := and(mload(src), not(mask))\\n let destpart := and(mload(dest), mask)\\n mstore(dest, or(destpart, srcpart))\\n }\\n }\\n\\n /**\\n * Flattens a list of byte strings into one byte string.\\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\\n * @param _list List of byte strings to flatten.\\n * @return _flattened The flattened byte string.\\n */\\n function _flatten(\\n bytes[] memory _list\\n )\\n private\\n pure\\n returns (\\n bytes memory _flattened\\n )\\n {\\n if (_list.length == 0) {\\n return new bytes(0);\\n }\\n\\n uint256 len;\\n uint256 i = 0;\\n for (; i < _list.length; i++) {\\n len += _list[i].length;\\n }\\n\\n bytes memory flattened = new bytes(len);\\n uint256 flattenedPtr;\\n assembly { flattenedPtr := add(flattened, 0x20) }\\n\\n for(i = 0; i < _list.length; i++) {\\n bytes memory item = _list[i];\\n\\n uint256 listPtr;\\n assembly { listPtr := add(item, 0x20)}\\n\\n _memcpy(flattenedPtr, listPtr, item.length);\\n flattenedPtr += _list[i].length;\\n }\\n\\n return flattened;\\n }\\n}\",\"keccak256\":\"0x6d1aaef567f8a91bb965b95a95637f433a1f0ac4cf0bc1e209cdb1dd5b0f204b\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_Bytes32Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.7.0;\\n\\n/**\\n * @title Lib_Byte32Utils\\n */\\nlibrary Lib_Bytes32Utils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function toBool(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bool _out\\n )\\n {\\n return _in != 0;\\n }\\n\\n function fromBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes32 _out\\n )\\n {\\n return bytes32(uint256(_in ? 1 : 0));\\n }\\n\\n function toAddress(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n address _out\\n )\\n {\\n return address(uint160(uint256(_in)));\\n }\\n\\n function fromAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes32 _out\\n )\\n {\\n return bytes32(uint256(_in));\\n }\\n\\n function removeLeadingZeros(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n bytes memory out;\\n\\n assembly {\\n // Figure out how many leading zero bytes to remove.\\n let shift := 0\\n for { let i := 0 } and(lt(i, 32), eq(byte(i, _in), 0)) { i := add(i, 1) } {\\n shift := add(shift, 1)\\n }\\n\\n // Reserve some space for our output and fix the free memory pointer.\\n out := mload(0x40)\\n mstore(0x40, add(out, 0x40))\\n\\n // Shift the value and store it into the output bytes.\\n mstore(add(out, 0x20), shl(mul(shift, 8), _in))\\n\\n // Store the new size (with leading zero bytes removed) in the output byte size.\\n mstore(out, sub(32, shift))\\n }\\n\\n return out;\\n }\\n}\\n\",\"keccak256\":\"0x06f97590a80a01daa3bf6aa795449aea91a78684c646b4a6caeece8ef919c80c\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_BytesUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.7.0;\\n\\n/**\\n * @title Lib_BytesUtils\\n */\\nlibrary Lib_BytesUtils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function concat(\\n bytes memory _preBytes,\\n bytes memory _postBytes\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n bytes memory tempBytes;\\n\\n assembly {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // Store the length of the first bytes array at the beginning of\\n // the memory for tempBytes.\\n let length := mload(_preBytes)\\n mstore(tempBytes, length)\\n\\n // Maintain a memory counter for the current write location in the\\n // temp bytes array by adding the 32 bytes for the array length to\\n // the starting location.\\n let mc := add(tempBytes, 0x20)\\n // Stop copying when the memory counter reaches the length of the\\n // first bytes array.\\n let end := add(mc, length)\\n\\n for {\\n // Initialize a copy counter to the start of the _preBytes data,\\n // 32 bytes into its memory.\\n let cc := add(_preBytes, 0x20)\\n } lt(mc, end) {\\n // Increase both counters by 32 bytes each iteration.\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n // Write the _preBytes data into the tempBytes memory 32 bytes\\n // at a time.\\n mstore(mc, mload(cc))\\n }\\n\\n // Add the length of _postBytes to the current length of tempBytes\\n // and store it as the new length in the first 32 bytes of the\\n // tempBytes memory.\\n length := mload(_postBytes)\\n mstore(tempBytes, add(length, mload(tempBytes)))\\n\\n // Move the memory counter back from a multiple of 0x20 to the\\n // actual end of the _preBytes data.\\n mc := end\\n // Stop copying when the memory counter reaches the new combined\\n // length of the arrays.\\n end := add(mc, length)\\n\\n for {\\n let cc := add(_postBytes, 0x20)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n // Update the free-memory pointer by padding our last write location\\n // to 32 bytes: add 31 bytes to the end of tempBytes to move to the\\n // next 32 byte block, then round down to the nearest multiple of\\n // 32. If the sum of the length of the two arrays is zero then add\\n // one before rounding down to leave a blank 32 bytes (the length block with 0).\\n mstore(0x40, and(\\n add(add(end, iszero(add(length, mload(_preBytes)))), 31),\\n not(31) // Round down to the nearest 32 bytes.\\n ))\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_start + _length >= _start, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n if (_bytes.length - _start == 0) {\\n return bytes('');\\n }\\n\\n return slice(_bytes, _start, _bytes.length - _start);\\n }\\n\\n function toBytes32PadLeft(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes32)\\n {\\n bytes32 ret;\\n uint256 len = _bytes.length <= 32 ? _bytes.length : 32;\\n assembly {\\n ret := shr(mul(sub(32, len), 8), mload(add(_bytes, 32)))\\n }\\n return ret;\\n }\\n\\n function toBytes32(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes32)\\n {\\n if (_bytes.length < 32) {\\n bytes32 ret;\\n assembly {\\n ret := mload(add(_bytes, 32))\\n }\\n return ret;\\n }\\n\\n return abi.decode(_bytes,(bytes32)); // will truncate if input length > 32 bytes\\n }\\n\\n function toUint256(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (uint256)\\n {\\n return uint256(toBytes32(_bytes));\\n }\\n\\n function toUint24(bytes memory _bytes, uint256 _start) internal pure returns (uint24) {\\n require(_start + 3 >= _start, \\\"toUint24_overflow\\\");\\n require(_bytes.length >= _start + 3 , \\\"toUint24_outOfBounds\\\");\\n uint24 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x3), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toUint8(bytes memory _bytes, uint256 _start) internal pure returns (uint8) {\\n require(_start + 1 >= _start, \\\"toUint8_overflow\\\");\\n require(_bytes.length >= _start + 1 , \\\"toUint8_outOfBounds\\\");\\n uint8 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x1), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toAddress(bytes memory _bytes, uint256 _start) internal pure returns (address) {\\n require(_start + 20 >= _start, \\\"toAddress_overflow\\\");\\n require(_bytes.length >= _start + 20, \\\"toAddress_outOfBounds\\\");\\n address tempAddress;\\n\\n assembly {\\n tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000)\\n }\\n\\n return tempAddress;\\n }\\n\\n function toNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n bytes memory nibbles = new bytes(_bytes.length * 2);\\n\\n for (uint256 i = 0; i < _bytes.length; i++) {\\n nibbles[i * 2] = _bytes[i] >> 4;\\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\\n }\\n\\n return nibbles;\\n }\\n\\n function fromNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n bytes memory ret = new bytes(_bytes.length / 2);\\n\\n for (uint256 i = 0; i < ret.length; i++) {\\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\\n }\\n\\n return ret;\\n }\\n\\n function equal(\\n bytes memory _bytes,\\n bytes memory _other\\n )\\n internal\\n pure\\n returns (bool)\\n {\\n return keccak256(_bytes) == keccak256(_other);\\n }\\n}\\n\",\"keccak256\":\"0x849e4fedd81cd260e4c3b74b953f00636323574c60d363f36ab331e94aab9219\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_MerkleTree.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.7.0;\\n\\n/**\\n * @title Lib_MerkleTree\\n * @author River Keefer\\n */\\nlibrary Lib_MerkleTree {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Calculates a merkle root for a list of 32-byte leaf hashes. WARNING: If the number\\n * of leaves passed in is not a power of two, it pads out the tree with zero hashes.\\n * If you do not know the original length of elements for the tree you are verifying,\\n * then this may allow empty leaves past _elements.length to pass a verification check down the line.\\n * @param _elements Array of hashes from which to generate a merkle root.\\n * @return Merkle root of the leaves, with zero hashes for non-powers-of-two (see above).\\n */\\n function getMerkleRoot(\\n bytes32[] memory _elements\\n )\\n internal\\n view\\n returns (\\n bytes32\\n )\\n {\\n require(\\n _elements.length > 0,\\n \\\"Lib_MerkleTree: Must provide at least one leaf hash.\\\"\\n );\\n\\n if (_elements.length == 0) {\\n return _elements[0];\\n }\\n\\n uint256[16] memory defaults = [\\n 0x290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563,\\n 0x633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d,\\n 0x890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d,\\n 0x3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd8,\\n 0xecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da,\\n 0xdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da5,\\n 0x617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d7,\\n 0x292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead,\\n 0xe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e10,\\n 0x7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f82,\\n 0xe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e83636516,\\n 0x3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c,\\n 0xad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e,\\n 0xa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab,\\n 0x4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c862,\\n 0x2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf10\\n ];\\n\\n // Reserve memory space for our hashes.\\n bytes memory buf = new bytes(64);\\n\\n // We'll need to keep track of left and right siblings.\\n bytes32 leftSibling;\\n bytes32 rightSibling;\\n\\n // Number of non-empty nodes at the current depth.\\n uint256 rowSize = _elements.length;\\n\\n // Current depth, counting from 0 at the leaves\\n uint256 depth = 0;\\n\\n // Common sub-expressions\\n uint256 halfRowSize; // rowSize / 2\\n bool rowSizeIsOdd; // rowSize % 2 == 1\\n\\n while (rowSize > 1) {\\n halfRowSize = rowSize / 2;\\n rowSizeIsOdd = rowSize % 2 == 1;\\n\\n for (uint256 i = 0; i < halfRowSize; i++) {\\n leftSibling = _elements[(2 * i) ];\\n rightSibling = _elements[(2 * i) + 1];\\n assembly {\\n mstore(add(buf, 32), leftSibling )\\n mstore(add(buf, 64), rightSibling)\\n }\\n\\n _elements[i] = keccak256(buf);\\n }\\n\\n if (rowSizeIsOdd) {\\n leftSibling = _elements[rowSize - 1];\\n rightSibling = bytes32(defaults[depth]);\\n assembly {\\n mstore(add(buf, 32), leftSibling)\\n mstore(add(buf, 64), rightSibling)\\n }\\n\\n _elements[halfRowSize] = keccak256(buf);\\n }\\n\\n rowSize = halfRowSize + (rowSizeIsOdd ? 1 : 0);\\n depth++;\\n }\\n\\n return _elements[0];\\n }\\n\\n /**\\n * Verifies a merkle branch for the given leaf hash. Assumes the original length\\n * of leaves generated is a known, correct input, and does not return true for indices \\n * extending past that index (even if _siblings would be otherwise valid.)\\n * @param _root The Merkle root to verify against.\\n * @param _leaf The leaf hash to verify inclusion of.\\n * @param _index The index in the tree of this leaf.\\n * @param _siblings Array of sibline nodes in the inclusion proof, starting from depth 0 (bottom of the tree). \\n * @param _totalLeaves The total number of leaves originally passed into.\\n * @return Whether or not the merkle branch and leaf passes verification.\\n */\\n function verify(\\n bytes32 _root,\\n bytes32 _leaf,\\n uint256 _index,\\n bytes32[] memory _siblings,\\n uint256 _totalLeaves\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n require(\\n _totalLeaves > 0,\\n \\\"Lib_MerkleTree: Total leaves must be greater than zero.\\\"\\n );\\n\\n require(\\n _index < _totalLeaves,\\n \\\"Lib_MerkleTree: Index out of bounds.\\\"\\n );\\n\\n require(\\n _siblings.length == _ceilLog2(_totalLeaves),\\n \\\"Lib_MerkleTree: Total siblings does not correctly correspond to total leaves.\\\"\\n );\\n\\n bytes32 computedRoot = _leaf;\\n\\n for (uint256 i = 0; i < _siblings.length; i++) {\\n if ((_index & 1) == 1) {\\n computedRoot = keccak256(\\n abi.encodePacked(\\n _siblings[i],\\n computedRoot\\n )\\n );\\n } else {\\n computedRoot = keccak256(\\n abi.encodePacked(\\n computedRoot,\\n _siblings[i]\\n )\\n );\\n }\\n\\n _index >>= 1;\\n }\\n\\n return _root == computedRoot;\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Calculates the integer ceiling of the log base 2 of an input.\\n * @param _in Unsigned input to calculate the log.\\n * @return ceil(log_base_2(_in))\\n */\\n function _ceilLog2(\\n uint256 _in\\n )\\n private\\n pure\\n returns (\\n uint256\\n )\\n { \\n require(\\n _in > 0,\\n \\\"Lib_MerkleTree: Cannot compute ceil(log_2) of 0.\\\"\\n );\\n\\n if (_in == 1) {\\n return 0;\\n }\\n\\n // Find the highest set bit (will be floor(log_2)).\\n // Borrowed with <3 from https://github.com/ethereum/solidity-examples\\n uint256 val = _in;\\n uint256 highest = 0;\\n for (uint8 i = 128; i >= 1; i >>= 1) {\\n if (val & (uint(1) << i) - 1 << i != 0) {\\n highest += i;\\n val >>= i;\\n }\\n }\\n\\n // Increment by one if this is not a perfect logarithm.\\n if ((uint(1) << highest) != _in) {\\n highest += 1;\\n }\\n\\n return highest;\\n }\\n}\\n\",\"keccak256\":\"0x5a859eccd3c4e7e31db90f3022069a725d5389e16fbcace3fe653d6b0acf80f6\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.7.0;\\n\\n/**\\n * @title Lib_SafeExecutionManagerWrapper\\n */\\nlibrary Lib_SafeExecutionManagerWrapper {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Makes an ovmCALL and performs all the necessary safety checks.\\n * @param _gasLimit Gas limit for the call.\\n * @param _target Address to call.\\n * @param _calldata Data to send to the call.\\n * @return _success Whether or not the call reverted.\\n * @return _returndata Data returned by the call.\\n */\\n function safeCALL(\\n uint256 _gasLimit,\\n address _target,\\n bytes memory _calldata\\n )\\n internal\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCALL(uint256,address,bytes)\\\",\\n _gasLimit,\\n _target,\\n _calldata\\n )\\n );\\n\\n return abi.decode(returndata, (bool, bytes));\\n }\\n\\n /**\\n * Makes an ovmCALL and performs all the necessary safety checks.\\n * @param _gasLimit Gas limit for the call.\\n * @param _target Address to call.\\n * @param _calldata Data to send to the call.\\n * @return _success Whether or not the call reverted.\\n * @return _returndata Data returned by the call.\\n */\\n function safeDELEGATECALL(\\n uint256 _gasLimit,\\n address _target,\\n bytes memory _calldata\\n )\\n internal\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmDELEGATECALL(uint256,address,bytes)\\\",\\n _gasLimit,\\n _target,\\n _calldata\\n )\\n );\\n\\n return abi.decode(returndata, (bool, bytes));\\n }\\n\\n /**\\n * Performs an ovmCREATE and the necessary safety checks.\\n * @param _gasLimit Gas limit for the creation.\\n * @param _bytecode Code for the new contract.\\n * @return _contract Address of the created contract.\\n */\\n function safeCREATE(\\n uint256 _gasLimit,\\n bytes memory _bytecode\\n )\\n internal\\n returns (\\n address _contract\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n _gasLimit,\\n abi.encodeWithSignature(\\n \\\"ovmCREATE(bytes)\\\",\\n _bytecode\\n )\\n );\\n\\n return abi.decode(returndata, (address));\\n }\\n\\n /**\\n * Performs an ovmEXTCODESIZE and the necessary safety checks.\\n * @param _contract Address of the contract to query the size of.\\n * @return _EXTCODESIZE Size of the requested contract in bytes.\\n */\\n function safeEXTCODESIZE(\\n address _contract\\n )\\n internal\\n returns (\\n uint256 _EXTCODESIZE\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmEXTCODESIZE(address)\\\",\\n _contract\\n )\\n );\\n\\n return abi.decode(returndata, (uint256));\\n }\\n\\n /**\\n * Performs a safe ovmCHAINID call.\\n * @return _CHAINID Result of calling ovmCHAINID.\\n */\\n function safeCHAINID()\\n internal\\n returns (\\n uint256 _CHAINID\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCHAINID()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (uint256));\\n }\\n\\n /**\\n * Performs a safe ovmCALLER call.\\n * @return _CALLER Result of calling ovmCALLER.\\n */\\n function safeCALLER()\\n internal\\n returns (\\n address _CALLER\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCALLER()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (address));\\n }\\n\\n /**\\n * Performs a safe ovmADDRESS call.\\n * @return _ADDRESS Result of calling ovmADDRESS.\\n */\\n function safeADDRESS()\\n internal\\n returns (\\n address _ADDRESS\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmADDRESS()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (address));\\n }\\n\\n /**\\n * Performs a safe ovmGETNONCE call.\\n * @return _nonce Result of calling ovmGETNONCE.\\n */\\n function safeGETNONCE()\\n internal\\n returns (\\n uint256 _nonce\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmGETNONCE()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (uint256));\\n }\\n\\n /**\\n * Performs a safe ovmSETNONCE call.\\n * @param _nonce New account nonce.\\n */\\n function safeSETNONCE(\\n uint256 _nonce\\n )\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmSETNONCE(uint256)\\\",\\n _nonce\\n )\\n );\\n }\\n\\n /**\\n * Performs a safe ovmCREATEEOA call.\\n * @param _messageHash Message hash which was signed by EOA\\n * @param _v v value of signature (0 or 1)\\n * @param _r r value of signature\\n * @param _s s value of signature\\n */\\n function safeCREATEEOA(\\n bytes32 _messageHash,\\n uint8 _v,\\n bytes32 _r,\\n bytes32 _s\\n )\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCREATEEOA(bytes32,uint8,bytes32,bytes32)\\\",\\n _messageHash,\\n _v,\\n _r,\\n _s\\n )\\n );\\n }\\n\\n /**\\n * Performs a safe REVERT.\\n * @param _reason String revert reason to pass along with the REVERT.\\n */\\n function safeREVERT(\\n string memory _reason\\n )\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmREVERT(bytes)\\\",\\n bytes(_reason)\\n )\\n );\\n }\\n\\n /**\\n * Performs a safe \\\"require\\\".\\n * @param _condition Boolean condition that must be true or will revert.\\n * @param _reason String revert reason to pass along with the REVERT.\\n */\\n function safeREQUIRE(\\n bool _condition,\\n string memory _reason\\n )\\n internal\\n {\\n if (!_condition) {\\n safeREVERT(\\n _reason\\n );\\n }\\n }\\n\\n /**\\n * Performs a safe ovmSLOAD call.\\n */\\n function safeSLOAD(\\n bytes32 _key\\n )\\n internal\\n returns (\\n bytes32\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmSLOAD(bytes32)\\\",\\n _key\\n )\\n );\\n\\n return abi.decode(returndata, (bytes32));\\n }\\n\\n /**\\n * Performs a safe ovmSSTORE call.\\n */\\n function safeSSTORE(\\n bytes32 _key,\\n bytes32 _value\\n )\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmSSTORE(bytes32,bytes32)\\\",\\n _key,\\n _value\\n )\\n );\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Performs an ovm interaction and the necessary safety checks.\\n * @param _gasLimit Gas limit for the interaction.\\n * @param _calldata Data to send to the OVM_ExecutionManager (encoded with sighash).\\n * @return _returndata Data sent back by the OVM_ExecutionManager.\\n */\\n function _safeExecutionManagerInteraction(\\n uint256 _gasLimit,\\n bytes memory _calldata\\n )\\n private\\n returns (\\n bytes memory _returndata\\n )\\n {\\n address ovmExecutionManager = msg.sender;\\n (\\n bool success,\\n bytes memory returndata\\n ) = ovmExecutionManager.call{gas: _gasLimit}(_calldata);\\n\\n if (success == false) {\\n assembly {\\n revert(add(returndata, 0x20), mload(returndata))\\n }\\n } else if (returndata.length == 1) {\\n assembly {\\n return(0, 1)\\n }\\n } else {\\n return returndata;\\n }\\n }\\n\\n function _safeExecutionManagerInteraction(\\n bytes memory _calldata\\n )\\n private\\n returns (\\n bytes memory _returndata\\n )\\n {\\n return _safeExecutionManagerInteraction(\\n gasleft(),\\n _calldata\\n );\\n }\\n}\\n\",\"keccak256\":\"0xdc30487ca1580f3498d4a1c4e26dc53158c00b44bd72da212a66267c22a139b0\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x608060405234801561001057600080fd5b50604051611bdd380380611bdd83398101604081905261002f9161005b565b600080546001600160a01b0319166001600160a01b03949094169390931790925560015560025561009c565b60008060006060848603121561006f578283fd5b83516001600160a01b0381168114610085578384fd5b602085015160409095015190969495509392505050565b611b32806100ab6000396000f3fe608060405234801561001057600080fd5b50600436106100a95760003560e01c80638ca5cbb9116100715780638ca5cbb91461011c5780639418bddd14610131578063b8e189ac14610144578063c17b291b14610157578063cfdf677e1461015f578063e561dddc14610167576100a9565b8063461a4478146100ae5780634d69ee57146100d75780637aa63a86146100f75780637ad168a01461010c57806381eb62ef14610114575b600080fd5b6100c16100bc3660046114d2565b61016f565b6040516100ce919061158e565b60405180910390f35b6100ea6100e5366004611420565b61024d565b6040516100ce91906115a2565b6100ff6102c0565b6040516100ce91906115ad565b6100ff6102d9565b6100ff6102f2565b61012f61012a36600461137f565b6102f8565b005b6100ea61013f366004611520565b61050c565b61012f610152366004611520565b61055c565b6100ff610614565b6100c161061a565b6100ff610642565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b838110156101cf5781810151838201526020016101b7565b50505050905090810190601f1680156101fc5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561021957600080fd5b505afa15801561022d573d6000803e3d6000fd5b505050506040513d602081101561024357600080fd5b505190505b919050565b6000610258836106bc565b61027d5760405162461bcd60e51b815260040161027490611738565b60405180910390fd5b61029a836020015185846000015185602001518760400151610754565b6102b65760405162461bcd60e51b8152600401610274906116a4565b5060019392505050565b6000806102cb6108d9565b5064ffffffffff1691505090565b6000806102e46108d9565b64ffffffffff169250505090565b60025481565b6103006102c0565b811461031e5760405162461bcd60e51b8152600401610274906116db565b61034e6040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b81525061016f565b6001600160a01b03166302ad4d2a336040518263ffffffff1660e01b8152600401610379919061158e565b60206040518083038186803b15801561039157600080fd5b505afa1580156103a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103c991906113c2565b6103e55760405162461bcd60e51b8152600401610274906118aa565b60008251116104065760405162461bcd60e51b815260040161027490611867565b6104446040518060400160405280601d81526020017f4f564d5f43616e6f6e6963616c5472616e73616374696f6e436861696e00000081525061016f565b6001600160a01b0316637aa63a866040518163ffffffff1660e01b815260040160206040518083038186803b15801561047c57600080fd5b505afa158015610490573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104b49190611408565b82516104be6102c0565b0111156104dd5760405162461bcd60e51b815260040161027490611635565b6105088242336040516020016104f4929190611990565b60405160208183030381529060405261096e565b5050565b60008082608001518060200190518101906105279190611553565b509050806105475760405162461bcd60e51b815260040161027490611822565b4261055482600154610b10565b119392505050565b61058e6040518060400160405280601181526020017027ab26afa33930bab22b32b934b334b2b960791b81525061016f565b6001600160a01b0316336001600160a01b0316146105be5760405162461bcd60e51b8152600401610274906117c5565b6105c7816106bc565b6105e35760405162461bcd60e51b815260040161027490611738565b6105ec8161050c565b6106085760405162461bcd60e51b815260040161027490611767565b61061181610b71565b50565b60015481565b600061063d604051806060016040528060258152602001611aa46025913961016f565b905090565b600061064c61061a565b6001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b15801561068457600080fd5b505afa158015610698573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061063d9190611408565b60006106c661061a565b8251604051634a83e9cd60e11b81526001600160a01b039290921691639507d39a916106f4916004016115ad565b60206040518083038186803b15801561070c57600080fd5b505afa158015610720573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107449190611408565b61074d83610ce9565b1492915050565b60008082116107945760405162461bcd60e51b8152600401808060200182810382526037815260200180611a206037913960400191505060405180910390fd5b8184106107d25760405162461bcd60e51b81526004018080602001828103825260248152602001806119cc6024913960400191505060405180910390fd5b6107db82610d2f565b8351146108195760405162461bcd60e51b815260040180806020018281038252604d815260200180611a57604d913960600191505060405180910390fd5b8460005b84518110156108cc57856001166001141561087b5784818151811061083e57fe5b60200260200101518260405160200180838152602001828152602001925050506040516020818303038152906040528051906020012091506108c0565b8185828151811061088857fe5b602002602001015160405160200180838152602001828152602001925050506040516020818303038152906040528051906020012091505b600195861c950161081d565b5090951495945050505050565b60008060006108e661061a565b6001600160a01b031663ccf8f9696040518163ffffffff1660e01b815260040160206040518083038186803b15801561091e57600080fd5b505afa158015610932573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061095691906113e2565b64ffffffffff602882901c16935060501c9150509091565b600061099e6040518060400160405280600d81526020016c27ab26afa9b2b8bab2b731b2b960991b81525061016f565b90506000806109ab6108d9565b9092509050336001600160a01b03841614156109c85750426109f2565b426002548264ffffffffff1601106109f25760405162461bcd60e51b8152600401610274906118f9565b60006040518060a00160405280610a07610642565b8152602001610a1588610dd9565b8152602001875181526020018464ffffffffff16815260200186815250905080600001517f16be4c5129a4e03cf3350262e181dc02ddfb4a6008d925368c0899fcd97ca9c58260200151836040015184606001518560800151604051610a7e94939291906115cc565b60405180910390a2610a8e61061a565b6001600160a01b0316632015276c610aa583610ce9565b610ab9846040015185606001510186611209565b6040518363ffffffff1660e01b8152600401610ad69291906115b6565b600060405180830381600087803b158015610af057600080fd5b505af1158015610b04573d6000803e3d6000fd5b50505050505050505050565b600082820183811015610b6a576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b610b7961061a565b6001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b158015610bb157600080fd5b505afa158015610bc5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610be99190611408565b815110610c085760405162461bcd60e51b815260040161027490611962565b610c11816106bc565b610c2d5760405162461bcd60e51b815260040161027490611738565b610c3561061a565b6001600160a01b031663167fd6818260000151610c5784606001516000611209565b6040518363ffffffff1660e01b8152600401610c749291906115b6565b600060405180830381600087803b158015610c8e57600080fd5b505af1158015610ca2573d6000803e3d6000fd5b5050505080600001517f8747b69ce8fdb31c3b9b0a67bd8049ad8c1a69ea417b69b12174068abd9cbd648260200151604051610cde91906115ad565b60405180910390a250565b60008160200151826040015183606001518460800151604051602001610d1294939291906115cc565b604051602081830303815290604052805190602001209050919050565b6000808211610d6f5760405162461bcd60e51b81526004018080602001828103825260308152602001806119f06030913960400191505060405180910390fd5b8160011415610d8057506000610248565b81600060805b60018160ff1610610dc4578060ff1660018260ff166001901b03901b8316600014610db95760ff811692831c9291909101905b60011c607f16610d86565b506001811b8414610b6a576001019392505050565b600080825111610e1a5760405162461bcd60e51b8152600401808060200182810382526034815260200180611ac96034913960400191505060405180910390fd5b8151610e3c5781600081518110610e2d57fe5b60200260200101519050610248565b60408051610200810182527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56381527f633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d60208201527f890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d818301527f3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd86060808301919091527fecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da60808301527fdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da560a08301527f617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d760c08301527f292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead60e08301527fe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e106101008301527f7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f826101208301527fe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e836365166101408301527f3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c6101608301527fad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e6101808301527fa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab6101a08301527f4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c8626101c08301527f2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf106101e083015282518381529081018352909160009190602082018180368337505085519192506000918291508180805b60018411156111e55750506002820460018084161460005b82811015611161578a816002028151811061110857fe5b602002602001015196508a816002026001018151811061112457fe5b6020026020010151955086602089015285604089015287805190602001208b828151811061114e57fe5b60209081029190910101526001016110f1565b5080156111c45789600185038151811061117757fe5b6020026020010151955087836010811061118d57fe5b602002015160001b945085602088015284604088015286805190602001208a83815181106111b757fe5b6020026020010181815250505b806111d05760006111d3565b60015b60ff16820193506001909201916110d9565b896000815181106111f257fe5b602002602001015198505050505050505050919050565b602890811b91909117901b90565b600067ffffffffffffffff83111561122b57fe5b61123e601f8401601f19166020016119a7565b905082815283838301111561125257600080fd5b828260208301376000602084830101529392505050565b600082601f830112611279578081fd5b8135602067ffffffffffffffff82111561128f57fe5b80820261129d8282016119a7565b8381528281019086840183880185018910156112b7578687fd5b8693505b858410156112d95780358352600193909301929184019184016112bb565b50979650505050505050565b600060a082840312156112f6578081fd5b60405160a0810167ffffffffffffffff828210818311171561131457fe5b8160405282935084358352602085013560208401526040850135604084015260608501356060840152608085013591508082111561135157600080fd5b508301601f8101851361136357600080fd5b61137285823560208401611217565b6080830152505092915050565b60008060408385031215611391578182fd5b823567ffffffffffffffff8111156113a7578283fd5b6113b385828601611269565b95602094909401359450505050565b6000602082840312156113d3578081fd5b81518015158114610b6a578182fd5b6000602082840312156113f3578081fd5b815164ffffffffff1981168114610b6a578182fd5b600060208284031215611419578081fd5b5051919050565b600080600060608486031215611434578081fd5b83359250602084013567ffffffffffffffff80821115611452578283fd5b61145e878388016112e5565b93506040860135915080821115611473578283fd5b9085019060408288031215611486578283fd5b60405160408101818110838211171561149b57fe5b604052823581526020830135828111156114b3578485fd5b6114bf89828601611269565b6020830152508093505050509250925092565b6000602082840312156114e3578081fd5b813567ffffffffffffffff8111156114f9578182fd5b8201601f81018413611509578182fd5b61151884823560208401611217565b949350505050565b600060208284031215611531578081fd5b813567ffffffffffffffff811115611547578182fd5b611518848285016112e5565b60008060408385031215611565578182fd5b825160208401519092506001600160a01b0381168114611583578182fd5b809150509250929050565b6001600160a01b0391909116815260200190565b901515815260200190565b90815260200190565b91825264ffffffffff1916602082015260400190565b600085825260208581840152846040840152608060608401528351806080850152825b8181101561160b5785810183015185820160a0015282016115ef565b8181111561161c578360a083870101525b50601f01601f19169290920160a0019695505050505050565b60208082526049908201527f4e756d626572206f6620737461746520726f6f74732063616e6e6f742065786360408201527f65656420746865206e756d626572206f662063616e6f6e6963616c207472616e60608201526839b0b1ba34b7b7399760b91b608082015260a00190565b60208082526018908201527f496e76616c696420696e636c7573696f6e2070726f6f662e0000000000000000604082015260600190565b6020808252603d908201527f41637475616c20626174636820737461727420696e64657820646f6573206e6f60408201527f74206d6174636820657870656374656420737461727420696e6465782e000000606082015260800190565b60208082526015908201527424b73b30b634b2103130ba31b4103432b0b232b91760591b604082015260600190565b602080825260409082018190527f537461746520626174636865732063616e206f6e6c792062652064656c657465908201527f642077697468696e207468652066726175642070726f6f662077696e646f772e606082015260800190565b6020808252603b908201527f537461746520626174636865732063616e206f6e6c792062652064656c65746560408201527f6420627920746865204f564d5f467261756456657269666965722e0000000000606082015260800190565b60208082526025908201527f4261746368206865616465722074696d657374616d702063616e6e6f74206265604082015264207a65726f60d81b606082015260800190565b60208082526023908201527f43616e6e6f74207375626d697420616e20656d7074792073746174652062617460408201526231b41760e91b606082015260800190565b6020808252602f908201527f50726f706f73657220646f6573206e6f74206861766520656e6f75676820636f60408201526e1b1b185d195c985b081c1bdcdd1959608a1b606082015260800190565b60208082526043908201527f43616e6e6f74207075626c69736820737461746520726f6f747320776974686960408201527f6e207468652073657175656e636572207075626c69636174696f6e2077696e6460608201526237bb9760e91b608082015260a00190565b60208082526014908201527324b73b30b634b2103130ba31b41034b73232bc1760611b604082015260600190565b9182526001600160a01b0316602082015260400190565b60405181810167ffffffffffffffff811182821017156119c357fe5b60405291905056fe4c69625f4d65726b6c65547265653a20496e646578206f7574206f6620626f756e64732e4c69625f4d65726b6c65547265653a2043616e6e6f7420636f6d70757465206365696c286c6f675f3229206f6620302e4c69625f4d65726b6c65547265653a20546f74616c206c6561766573206d7573742062652067726561746572207468616e207a65726f2e4c69625f4d65726b6c65547265653a20546f74616c207369626c696e677320646f6573206e6f7420636f72726563746c7920636f72726573706f6e6420746f20746f74616c206c65617665732e4f564d5f436861696e53746f72616765436f6e7461696e65723a5343433a626174636865734c69625f4d65726b6c65547265653a204d7573742070726f76696465206174206c65617374206f6e65206c65616620686173682ea2646970667358221220bb0e5c642953ed51fb237282bb9f6a364967e5a947393d6d7113e72272758ff864736f6c63430007060033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100a95760003560e01c80638ca5cbb9116100715780638ca5cbb91461011c5780639418bddd14610131578063b8e189ac14610144578063c17b291b14610157578063cfdf677e1461015f578063e561dddc14610167576100a9565b8063461a4478146100ae5780634d69ee57146100d75780637aa63a86146100f75780637ad168a01461010c57806381eb62ef14610114575b600080fd5b6100c16100bc3660046114d2565b61016f565b6040516100ce919061158e565b60405180910390f35b6100ea6100e5366004611420565b61024d565b6040516100ce91906115a2565b6100ff6102c0565b6040516100ce91906115ad565b6100ff6102d9565b6100ff6102f2565b61012f61012a36600461137f565b6102f8565b005b6100ea61013f366004611520565b61050c565b61012f610152366004611520565b61055c565b6100ff610614565b6100c161061a565b6100ff610642565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b838110156101cf5781810151838201526020016101b7565b50505050905090810190601f1680156101fc5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561021957600080fd5b505afa15801561022d573d6000803e3d6000fd5b505050506040513d602081101561024357600080fd5b505190505b919050565b6000610258836106bc565b61027d5760405162461bcd60e51b815260040161027490611738565b60405180910390fd5b61029a836020015185846000015185602001518760400151610754565b6102b65760405162461bcd60e51b8152600401610274906116a4565b5060019392505050565b6000806102cb6108d9565b5064ffffffffff1691505090565b6000806102e46108d9565b64ffffffffff169250505090565b60025481565b6103006102c0565b811461031e5760405162461bcd60e51b8152600401610274906116db565b61034e6040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b81525061016f565b6001600160a01b03166302ad4d2a336040518263ffffffff1660e01b8152600401610379919061158e565b60206040518083038186803b15801561039157600080fd5b505afa1580156103a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103c991906113c2565b6103e55760405162461bcd60e51b8152600401610274906118aa565b60008251116104065760405162461bcd60e51b815260040161027490611867565b6104446040518060400160405280601d81526020017f4f564d5f43616e6f6e6963616c5472616e73616374696f6e436861696e00000081525061016f565b6001600160a01b0316637aa63a866040518163ffffffff1660e01b815260040160206040518083038186803b15801561047c57600080fd5b505afa158015610490573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104b49190611408565b82516104be6102c0565b0111156104dd5760405162461bcd60e51b815260040161027490611635565b6105088242336040516020016104f4929190611990565b60405160208183030381529060405261096e565b5050565b60008082608001518060200190518101906105279190611553565b509050806105475760405162461bcd60e51b815260040161027490611822565b4261055482600154610b10565b119392505050565b61058e6040518060400160405280601181526020017027ab26afa33930bab22b32b934b334b2b960791b81525061016f565b6001600160a01b0316336001600160a01b0316146105be5760405162461bcd60e51b8152600401610274906117c5565b6105c7816106bc565b6105e35760405162461bcd60e51b815260040161027490611738565b6105ec8161050c565b6106085760405162461bcd60e51b815260040161027490611767565b61061181610b71565b50565b60015481565b600061063d604051806060016040528060258152602001611aa46025913961016f565b905090565b600061064c61061a565b6001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b15801561068457600080fd5b505afa158015610698573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061063d9190611408565b60006106c661061a565b8251604051634a83e9cd60e11b81526001600160a01b039290921691639507d39a916106f4916004016115ad565b60206040518083038186803b15801561070c57600080fd5b505afa158015610720573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107449190611408565b61074d83610ce9565b1492915050565b60008082116107945760405162461bcd60e51b8152600401808060200182810382526037815260200180611a206037913960400191505060405180910390fd5b8184106107d25760405162461bcd60e51b81526004018080602001828103825260248152602001806119cc6024913960400191505060405180910390fd5b6107db82610d2f565b8351146108195760405162461bcd60e51b815260040180806020018281038252604d815260200180611a57604d913960600191505060405180910390fd5b8460005b84518110156108cc57856001166001141561087b5784818151811061083e57fe5b60200260200101518260405160200180838152602001828152602001925050506040516020818303038152906040528051906020012091506108c0565b8185828151811061088857fe5b602002602001015160405160200180838152602001828152602001925050506040516020818303038152906040528051906020012091505b600195861c950161081d565b5090951495945050505050565b60008060006108e661061a565b6001600160a01b031663ccf8f9696040518163ffffffff1660e01b815260040160206040518083038186803b15801561091e57600080fd5b505afa158015610932573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061095691906113e2565b64ffffffffff602882901c16935060501c9150509091565b600061099e6040518060400160405280600d81526020016c27ab26afa9b2b8bab2b731b2b960991b81525061016f565b90506000806109ab6108d9565b9092509050336001600160a01b03841614156109c85750426109f2565b426002548264ffffffffff1601106109f25760405162461bcd60e51b8152600401610274906118f9565b60006040518060a00160405280610a07610642565b8152602001610a1588610dd9565b8152602001875181526020018464ffffffffff16815260200186815250905080600001517f16be4c5129a4e03cf3350262e181dc02ddfb4a6008d925368c0899fcd97ca9c58260200151836040015184606001518560800151604051610a7e94939291906115cc565b60405180910390a2610a8e61061a565b6001600160a01b0316632015276c610aa583610ce9565b610ab9846040015185606001510186611209565b6040518363ffffffff1660e01b8152600401610ad69291906115b6565b600060405180830381600087803b158015610af057600080fd5b505af1158015610b04573d6000803e3d6000fd5b50505050505050505050565b600082820183811015610b6a576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b610b7961061a565b6001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b158015610bb157600080fd5b505afa158015610bc5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610be99190611408565b815110610c085760405162461bcd60e51b815260040161027490611962565b610c11816106bc565b610c2d5760405162461bcd60e51b815260040161027490611738565b610c3561061a565b6001600160a01b031663167fd6818260000151610c5784606001516000611209565b6040518363ffffffff1660e01b8152600401610c749291906115b6565b600060405180830381600087803b158015610c8e57600080fd5b505af1158015610ca2573d6000803e3d6000fd5b5050505080600001517f8747b69ce8fdb31c3b9b0a67bd8049ad8c1a69ea417b69b12174068abd9cbd648260200151604051610cde91906115ad565b60405180910390a250565b60008160200151826040015183606001518460800151604051602001610d1294939291906115cc565b604051602081830303815290604052805190602001209050919050565b6000808211610d6f5760405162461bcd60e51b81526004018080602001828103825260308152602001806119f06030913960400191505060405180910390fd5b8160011415610d8057506000610248565b81600060805b60018160ff1610610dc4578060ff1660018260ff166001901b03901b8316600014610db95760ff811692831c9291909101905b60011c607f16610d86565b506001811b8414610b6a576001019392505050565b600080825111610e1a5760405162461bcd60e51b8152600401808060200182810382526034815260200180611ac96034913960400191505060405180910390fd5b8151610e3c5781600081518110610e2d57fe5b60200260200101519050610248565b60408051610200810182527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56381527f633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d60208201527f890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d818301527f3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd86060808301919091527fecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da60808301527fdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da560a08301527f617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d760c08301527f292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead60e08301527fe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e106101008301527f7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f826101208301527fe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e836365166101408301527f3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c6101608301527fad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e6101808301527fa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab6101a08301527f4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c8626101c08301527f2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf106101e083015282518381529081018352909160009190602082018180368337505085519192506000918291508180805b60018411156111e55750506002820460018084161460005b82811015611161578a816002028151811061110857fe5b602002602001015196508a816002026001018151811061112457fe5b6020026020010151955086602089015285604089015287805190602001208b828151811061114e57fe5b60209081029190910101526001016110f1565b5080156111c45789600185038151811061117757fe5b6020026020010151955087836010811061118d57fe5b602002015160001b945085602088015284604088015286805190602001208a83815181106111b757fe5b6020026020010181815250505b806111d05760006111d3565b60015b60ff16820193506001909201916110d9565b896000815181106111f257fe5b602002602001015198505050505050505050919050565b602890811b91909117901b90565b600067ffffffffffffffff83111561122b57fe5b61123e601f8401601f19166020016119a7565b905082815283838301111561125257600080fd5b828260208301376000602084830101529392505050565b600082601f830112611279578081fd5b8135602067ffffffffffffffff82111561128f57fe5b80820261129d8282016119a7565b8381528281019086840183880185018910156112b7578687fd5b8693505b858410156112d95780358352600193909301929184019184016112bb565b50979650505050505050565b600060a082840312156112f6578081fd5b60405160a0810167ffffffffffffffff828210818311171561131457fe5b8160405282935084358352602085013560208401526040850135604084015260608501356060840152608085013591508082111561135157600080fd5b508301601f8101851361136357600080fd5b61137285823560208401611217565b6080830152505092915050565b60008060408385031215611391578182fd5b823567ffffffffffffffff8111156113a7578283fd5b6113b385828601611269565b95602094909401359450505050565b6000602082840312156113d3578081fd5b81518015158114610b6a578182fd5b6000602082840312156113f3578081fd5b815164ffffffffff1981168114610b6a578182fd5b600060208284031215611419578081fd5b5051919050565b600080600060608486031215611434578081fd5b83359250602084013567ffffffffffffffff80821115611452578283fd5b61145e878388016112e5565b93506040860135915080821115611473578283fd5b9085019060408288031215611486578283fd5b60405160408101818110838211171561149b57fe5b604052823581526020830135828111156114b3578485fd5b6114bf89828601611269565b6020830152508093505050509250925092565b6000602082840312156114e3578081fd5b813567ffffffffffffffff8111156114f9578182fd5b8201601f81018413611509578182fd5b61151884823560208401611217565b949350505050565b600060208284031215611531578081fd5b813567ffffffffffffffff811115611547578182fd5b611518848285016112e5565b60008060408385031215611565578182fd5b825160208401519092506001600160a01b0381168114611583578182fd5b809150509250929050565b6001600160a01b0391909116815260200190565b901515815260200190565b90815260200190565b91825264ffffffffff1916602082015260400190565b600085825260208581840152846040840152608060608401528351806080850152825b8181101561160b5785810183015185820160a0015282016115ef565b8181111561161c578360a083870101525b50601f01601f19169290920160a0019695505050505050565b60208082526049908201527f4e756d626572206f6620737461746520726f6f74732063616e6e6f742065786360408201527f65656420746865206e756d626572206f662063616e6f6e6963616c207472616e60608201526839b0b1ba34b7b7399760b91b608082015260a00190565b60208082526018908201527f496e76616c696420696e636c7573696f6e2070726f6f662e0000000000000000604082015260600190565b6020808252603d908201527f41637475616c20626174636820737461727420696e64657820646f6573206e6f60408201527f74206d6174636820657870656374656420737461727420696e6465782e000000606082015260800190565b60208082526015908201527424b73b30b634b2103130ba31b4103432b0b232b91760591b604082015260600190565b602080825260409082018190527f537461746520626174636865732063616e206f6e6c792062652064656c657465908201527f642077697468696e207468652066726175642070726f6f662077696e646f772e606082015260800190565b6020808252603b908201527f537461746520626174636865732063616e206f6e6c792062652064656c65746560408201527f6420627920746865204f564d5f467261756456657269666965722e0000000000606082015260800190565b60208082526025908201527f4261746368206865616465722074696d657374616d702063616e6e6f74206265604082015264207a65726f60d81b606082015260800190565b60208082526023908201527f43616e6e6f74207375626d697420616e20656d7074792073746174652062617460408201526231b41760e91b606082015260800190565b6020808252602f908201527f50726f706f73657220646f6573206e6f74206861766520656e6f75676820636f60408201526e1b1b185d195c985b081c1bdcdd1959608a1b606082015260800190565b60208082526043908201527f43616e6e6f74207075626c69736820737461746520726f6f747320776974686960408201527f6e207468652073657175656e636572207075626c69636174696f6e2077696e6460608201526237bb9760e91b608082015260a00190565b60208082526014908201527324b73b30b634b2103130ba31b41034b73232bc1760611b604082015260600190565b9182526001600160a01b0316602082015260400190565b60405181810167ffffffffffffffff811182821017156119c357fe5b60405291905056fe4c69625f4d65726b6c65547265653a20496e646578206f7574206f6620626f756e64732e4c69625f4d65726b6c65547265653a2043616e6e6f7420636f6d70757465206365696c286c6f675f3229206f6620302e4c69625f4d65726b6c65547265653a20546f74616c206c6561766573206d7573742062652067726561746572207468616e207a65726f2e4c69625f4d65726b6c65547265653a20546f74616c207369626c696e677320646f6573206e6f7420636f72726563746c7920636f72726573706f6e6420746f20746f74616c206c65617665732e4f564d5f436861696e53746f72616765436f6e7461696e65723a5343433a626174636865734c69625f4d65726b6c65547265653a204d7573742070726f76696465206174206c65617374206f6e65206c65616620686173682ea2646970667358221220bb0e5c642953ed51fb237282bb9f6a364967e5a947393d6d7113e72272758ff864736f6c63430007060033", - "devdoc": { - "kind": "dev", - "methods": { - "appendStateBatch(bytes32[],uint256)": { - "params": { - "_batch": "Batch of state roots.", - "_shouldStartAtElement": "Index of the element at which this batch should start." - } - }, - "batches()": { - "returns": { - "_0": "Reference to the batch storage container." - } - }, - "constructor": { - "params": { - "_libAddressManager": "Address of the Address Manager." - } - }, - "deleteStateBatch((uint256,bytes32,uint256,uint256,bytes))": { - "params": { - "_batchHeader": "Header of the batch to start deleting from." - } - }, - "getLastSequencerTimestamp()": { - "returns": { - "_lastSequencerTimestamp": "Last sequencer batch timestamp." - } - }, - "getTotalBatches()": { - "returns": { - "_totalBatches": "Total submitted batches." - } - }, - "getTotalElements()": { - "returns": { - "_totalElements": "Total submitted elements." - } - }, - "insideFraudProofWindow((uint256,bytes32,uint256,uint256,bytes))": { - "params": { - "_batchHeader": "Header of the batch to check." - }, - "returns": { - "_inside": "Whether or not the batch is inside the fraud proof window." - } - }, - "verifyStateCommitment(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))": { - "params": { - "_batchHeader": "Header of the batch in which the element was included.", - "_element": "Hash of the element to verify a proof for.", - "_proof": "Merkle inclusion proof for the element." - } - } - }, - "title": "OVM_StateCommitmentChain", - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": { - "appendStateBatch(bytes32[],uint256)": { - "notice": "Appends a batch of state roots to the chain." - }, - "batches()": { - "notice": "Accesses the batch storage container." - }, - "deleteStateBatch((uint256,bytes32,uint256,uint256,bytes))": { - "notice": "Deletes all state roots after (and including) a given batch." - }, - "getLastSequencerTimestamp()": { - "notice": "Retrieves the timestamp of the last batch submitted by the sequencer." - }, - "getTotalBatches()": { - "notice": "Retrieves the total number of batches submitted." - }, - "getTotalElements()": { - "notice": "Retrieves the total number of elements submitted." - }, - "insideFraudProofWindow((uint256,bytes32,uint256,uint256,bytes))": { - "notice": "Checks whether a given batch is still inside its fraud proof window." - }, - "verifyStateCommitment(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))": { - "notice": "Verifies a batch inclusion proof." - } - }, - "version": 1 - }, - "storageLayout": { - "storage": [ - { - "astId": 11707, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_StateCommitmentChain.sol:OVM_StateCommitmentChain", - "label": "libAddressManager", - "offset": 0, - "slot": "0", - "type": "t_contract(Lib_AddressManager)11700" - }, - { - "astId": 3141, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_StateCommitmentChain.sol:OVM_StateCommitmentChain", - "label": "FRAUD_PROOF_WINDOW", - "offset": 0, - "slot": "1", - "type": "t_uint256" - }, - { - "astId": 3143, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_StateCommitmentChain.sol:OVM_StateCommitmentChain", - "label": "SEQUENCER_PUBLISH_WINDOW", - "offset": 0, - "slot": "2", - "type": "t_uint256" - } - ], - "types": { - "t_contract(Lib_AddressManager)11700": { - "encoding": "inplace", - "label": "contract Lib_AddressManager", - "numberOfBytes": "20" - }, - "t_uint256": { - "encoding": "inplace", - "label": "uint256", - "numberOfBytes": "32" - } - } - } -} \ No newline at end of file diff --git a/packages/contracts/deployments/kovan-v1/Proxy__OVM_L1CrossDomainMessenger.json b/packages/contracts/deployments/kovan-v1/Proxy__OVM_L1CrossDomainMessenger.json deleted file mode 100644 index 0c1ea1a18e38b..0000000000000 --- a/packages/contracts/deployments/kovan-v1/Proxy__OVM_L1CrossDomainMessenger.json +++ /dev/null @@ -1,118 +0,0 @@ -{ - "address": "0xb89065D5eB05Cac554FDB11fC764C679b4202322", - "abi": [ - { - "inputs": [ - { - "internalType": "address", - "name": "_libAddressManager", - "type": "address" - }, - { - "internalType": "string", - "name": "_implementationName", - "type": "string" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "stateMutability": "nonpayable", - "type": "fallback" - } - ], - "transactionHash": "0xf56350f6788ffb9ebfa35403412369a4fac3147ab5a612956ea8146fe14308ed", - "receipt": { - "to": null, - "from": "0x558ba9b8d78713fbf768c1f8a584485B4003f43F", - "contractAddress": "0x40C6cA6dDdd27E9B4d50da1E393B82b71B1C5D45", - "transactionIndex": 15, - "gasUsed": "228252", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0x255fee49c39936345b0004796d61db7b0953cc70f0a9081d86d3447b23b491a2", - "transactionHash": "0xf56350f6788ffb9ebfa35403412369a4fac3147ab5a612956ea8146fe14308ed", - "logs": [], - "blockNumber": 4573449, - "cumulativeGasUsed": "1727110", - "status": 1, - "byzantium": true - }, - "args": [ - "0x72e6F5244828C10737cbC9659378B207246D26B2", - "OVM_L1CrossDomainMessenger" - ], - "solcInputHash": "cebcb515c1a9c570d96e0b8f6fd237e2", - "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_implementationName\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"stateMutability\":\"nonpayable\",\"type\":\"fallback\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_implementationName\":\"implementationName of the contract to proxy to.\",\"_libAddressManager\":\"Address of the Lib_AddressManager.\"}}},\"title\":\"Lib_ResolvedDelegateProxy\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/libraries/resolver/Lib_ResolvedDelegateProxy.sol\":\"Lib_ResolvedDelegateProxy\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// +build ovm\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Contract Imports */\\nimport { Ownable } from \\\"./Lib_Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n /*******************************************\\n * Contract Variables: Internal Accounting *\\n *******************************************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n public\\n onlyOwner\\n {\\n emit AddressSet(_name, _address);\\n addresses[_getNameHash(_name)] = _address;\\n }\\n\\n function getAddress(\\n string memory _name\\n )\\n public\\n view\\n returns (address)\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32 _hash\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xdf802e1cc6474df913626991e9fca3835c620a519f397afe04bf9c260e723257\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// +build ovm\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Ownable\\n * @dev Adapted from https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol\\n */\\nabstract contract Ownable {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n address public owner;\\n\\n\\n /**********\\n * Events *\\n **********/\\n\\n event OwnershipTransferred(\\n address indexed previousOwner,\\n address indexed newOwner\\n );\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n constructor() internal {\\n owner = msg.sender;\\n emit OwnershipTransferred(address(0), owner);\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n owner == msg.sender,\\n \\\"Ownable: caller is not the owner\\\"\\n );\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function renounceOwnership()\\n public\\n virtual\\n onlyOwner\\n {\\n emit OwnershipTransferred(owner, address(0));\\n owner = address(0);\\n }\\n\\n function transferOwnership(address _newOwner)\\n public\\n virtual\\n onlyOwner\\n {\\n require(\\n _newOwner != address(0),\\n \\\"Ownable: new owner cannot be the zero address\\\"\\n );\\n\\n emit OwnershipTransferred(owner, _newOwner);\\n owner = _newOwner;\\n }\\n}\\n\",\"keccak256\":\"0xe0409fbd236d16ca6be439d9d97dd36d0d9a0697ee0062d49588b9d29c248e47\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_ResolvedDelegateProxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.7.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_ResolvedDelegateProxy\\n */\\ncontract Lib_ResolvedDelegateProxy {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n // Using mappings to store fields to avoid overwriting storage slots in the\\n // implementation contract. For example, instead of storing these fields at\\n // storage slot `0` & `1`, they are stored at `hash(${FIELD_NAME} + address(this))`\\n // See: https://solidity.readthedocs.io/en/v0.7.0/internals/layout_in_storage.html\\n mapping(address=>string) private implementationName;\\n mapping(address=>Lib_AddressManager) private addressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n * @param _implementationName implementationName of the contract to proxy to.\\n */\\n constructor(\\n address _libAddressManager,\\n string memory _implementationName\\n )\\n {\\n addressManager[address(this)] = Lib_AddressManager(_libAddressManager);\\n implementationName[address(this)] = _implementationName;\\n }\\n\\n\\n /*********************\\n * Fallback Function *\\n *********************/\\n\\n fallback()\\n external\\n {\\n address target = addressManager[address(this)].getAddress((implementationName[address(this)]));\\n require(\\n target != address(0),\\n \\\"Target address must be initialized.\\\"\\n );\\n\\n (bool success, bytes memory returndata) = target.delegatecall(msg.data);\\n\\n if (success == true) {\\n assembly {\\n return(add(returndata, 0x20), mload(returndata))\\n }\\n } else {\\n assembly {\\n revert(add(returndata, 0x20), mload(returndata))\\n }\\n }\\n }\\n}\\n\",\"keccak256\":\"0x7b94d77f1ceef7bf89687de3a9c574d994d531e4b98007b106fbac54bab7e8ea\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x608060405234801561001057600080fd5b506040516104173803806104178339818101604052604081101561003357600080fd5b81516020830180516040519294929383019291908464010000000082111561005a57600080fd5b90830190602082018581111561006f57600080fd5b825164010000000081118282018810171561008957600080fd5b82525081516020918201929091019080838360005b838110156100b657818101518382015260200161009e565b50505050905090810190601f1680156100e35780820380516001836020036101000a031916815260200191505b5060409081523060009081526001602090815282822080546001600160a01b0319166001600160a01b038a16179055818152919020855161012c95509093509085019150610134565b5050506101d5565b828054600181600116156101000203166002900490600052602060002090601f01602090048101928261016a57600085556101b0565b82601f1061018357805160ff19168380011785556101b0565b828001600101855582156101b0579182015b828111156101b0578251825591602001919060010190610195565b506101bc9291506101c0565b5090565b5b808211156101bc57600081556001016101c1565b610233806101e46000396000f3fe608060405234801561001057600080fd5b5030600090815260016020818152604080842054848352818520915163bf40fac160e01b815260048101938452825460026101009682161596909602600019011694909404602485018190526001600160a01b039091169363bf40fac19391829160440190849080156100c45780601f10610099576101008083540402835291602001916100c4565b820191906000526020600020905b8154815290600101906020018083116100a757829003601f168201915b50509250505060206040518083038186803b1580156100e257600080fd5b505afa1580156100f6573d6000803e3d6000fd5b505050506040513d602081101561010c57600080fd5b505190506001600160a01b0381166101555760405162461bcd60e51b81526004018080602001828103825260238152602001806101db6023913960400191505060405180910390fd5b600080826001600160a01b03166000366040518083838082843760405192019450600093509091505080830381855af49150503d80600081146101b4576040519150601f19603f3d011682016040523d82523d6000602084013e6101b9565b606091505b509092509050600182151514156101d257805160208201f35b805160208201fdfe5461726765742061646472657373206d75737420626520696e697469616c697a65642ea264697066735822122022cf2e6b66b75ae0d7a780704aa9d326dd541b72493bb1a405188ed67fed0b5964736f6c63430007060033", - "deployedBytecode": "0x608060405234801561001057600080fd5b5030600090815260016020818152604080842054848352818520915163bf40fac160e01b815260048101938452825460026101009682161596909602600019011694909404602485018190526001600160a01b039091169363bf40fac19391829160440190849080156100c45780601f10610099576101008083540402835291602001916100c4565b820191906000526020600020905b8154815290600101906020018083116100a757829003601f168201915b50509250505060206040518083038186803b1580156100e257600080fd5b505afa1580156100f6573d6000803e3d6000fd5b505050506040513d602081101561010c57600080fd5b505190506001600160a01b0381166101555760405162461bcd60e51b81526004018080602001828103825260238152602001806101db6023913960400191505060405180910390fd5b600080826001600160a01b03166000366040518083838082843760405192019450600093509091505080830381855af49150503d80600081146101b4576040519150601f19603f3d011682016040523d82523d6000602084013e6101b9565b606091505b509092509050600182151514156101d257805160208201f35b805160208201fdfe5461726765742061646472657373206d75737420626520696e697469616c697a65642ea264697066735822122022cf2e6b66b75ae0d7a780704aa9d326dd541b72493bb1a405188ed67fed0b5964736f6c63430007060033", - "devdoc": { - "kind": "dev", - "methods": { - "constructor": { - "params": { - "_implementationName": "implementationName of the contract to proxy to.", - "_libAddressManager": "Address of the Lib_AddressManager." - } - } - }, - "title": "Lib_ResolvedDelegateProxy", - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": {}, - "version": 1 - }, - "storageLayout": { - "storage": [ - { - "astId": 11832, - "contract": "contracts/optimistic-ethereum/libraries/resolver/Lib_ResolvedDelegateProxy.sol:Lib_ResolvedDelegateProxy", - "label": "implementationName", - "offset": 0, - "slot": "0", - "type": "t_mapping(t_address,t_string_storage)" - }, - { - "astId": 11836, - "contract": "contracts/optimistic-ethereum/libraries/resolver/Lib_ResolvedDelegateProxy.sol:Lib_ResolvedDelegateProxy", - "label": "addressManager", - "offset": 0, - "slot": "1", - "type": "t_mapping(t_address,t_contract(Lib_AddressManager)11700)" - } - ], - "types": { - "t_address": { - "encoding": "inplace", - "label": "address", - "numberOfBytes": "20" - }, - "t_contract(Lib_AddressManager)11700": { - "encoding": "inplace", - "label": "contract Lib_AddressManager", - "numberOfBytes": "20" - }, - "t_mapping(t_address,t_contract(Lib_AddressManager)11700)": { - "encoding": "mapping", - "key": "t_address", - "label": "mapping(address => contract Lib_AddressManager)", - "numberOfBytes": "32", - "value": "t_contract(Lib_AddressManager)11700" - }, - "t_mapping(t_address,t_string_storage)": { - "encoding": "mapping", - "key": "t_address", - "label": "mapping(address => string)", - "numberOfBytes": "32", - "value": "t_string_storage" - }, - "t_string_storage": { - "encoding": "bytes", - "label": "string", - "numberOfBytes": "32" - } - } - } -} \ No newline at end of file diff --git a/packages/contracts/deployments/kovan-v1/mockOVM_BondManager.json b/packages/contracts/deployments/kovan-v1/mockOVM_BondManager.json deleted file mode 100644 index 54fb9061e379d..0000000000000 --- a/packages/contracts/deployments/kovan-v1/mockOVM_BondManager.json +++ /dev/null @@ -1,216 +0,0 @@ -{ - "address": "0x3Ff73EBc1d916a1A976521160ad92dFDF6a06d1f", - "abi": [ - { - "inputs": [ - { - "internalType": "address", - "name": "_libAddressManager", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_who", - "type": "address" - } - ], - "name": "claim", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "deposit", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "_preStateRoot", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "_publisher", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_timestamp", - "type": "uint256" - } - ], - "name": "finalize", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "finalizeWithdrawal", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "_preStateRoot", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "_who", - "type": "address" - } - ], - "name": "getGasSpent", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_who", - "type": "address" - } - ], - "name": "isCollateralized", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "_preStateRoot", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "_txHash", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "_who", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_gasSpent", - "type": "uint256" - } - ], - "name": "recordGasSpent", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "string", - "name": "_name", - "type": "string" - } - ], - "name": "resolve", - "outputs": [ - { - "internalType": "address", - "name": "_contract", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "startWithdrawal", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - } - ], - "transactionHash": "0xef2081df685c50aab54d3c8925d756ac3d5a8e3e8205ace17b9b9887a4181567", - "receipt": { - "to": null, - "from": "0x558ba9b8d78713fbf768c1f8a584485B4003f43F", - "contractAddress": "0x0C4BFBfB44090E1c1AB4a648366456ccFCF9bfA1", - "transactionIndex": 4, - "gasUsed": "291376", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0xc98e11cb9072c6fda982fe6445382fa34298a9a83d3bdfedc88fded88680fe97", - "transactionHash": "0xef2081df685c50aab54d3c8925d756ac3d5a8e3e8205ace17b9b9887a4181567", - "logs": [], - "blockNumber": 4573388, - "cumulativeGasUsed": "864063", - "status": 1, - "byzantium": true - }, - "args": [ - "0x72e6F5244828C10737cbC9659378B207246D26B2" - ], - "solcInputHash": "cebcb515c1a9c570d96e0b8f6fd237e2", - "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_who\",\"type\":\"address\"}],\"name\":\"claim\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"deposit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_preStateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"_publisher\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_timestamp\",\"type\":\"uint256\"}],\"name\":\"finalize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"finalizeWithdrawal\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_preStateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"_who\",\"type\":\"address\"}],\"name\":\"getGasSpent\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_who\",\"type\":\"address\"}],\"name\":\"isCollateralized\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_preStateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"_txHash\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"_who\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_gasSpent\",\"type\":\"uint256\"}],\"name\":\"recordGasSpent\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"_contract\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"startWithdrawal\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"title\":\"mockOVM_BondManager\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/mockOVM/verification/mockOVM_BondManager.sol\":\"mockOVM_BondManager\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/optimistic-ethereum/iOVM/verification/iOVM_BondManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\ninterface ERC20 {\\n function transfer(address, uint256) external returns (bool);\\n function transferFrom(address, address, uint256) external returns (bool);\\n}\\n\\n/// All the errors which may be encountered on the bond manager\\nlibrary Errors {\\n string constant ERC20_ERR = \\\"BondManager: Could not post bond\\\";\\n string constant ALREADY_FINALIZED = \\\"BondManager: Fraud proof for this pre-state root has already been finalized\\\";\\n string constant SLASHED = \\\"BondManager: Cannot finalize withdrawal, you probably got slashed\\\";\\n string constant WRONG_STATE = \\\"BondManager: Wrong bond state for proposer\\\";\\n string constant CANNOT_CLAIM = \\\"BondManager: Cannot claim yet. Dispute must be finalized first\\\";\\n\\n string constant WITHDRAWAL_PENDING = \\\"BondManager: Withdrawal already pending\\\";\\n string constant TOO_EARLY = \\\"BondManager: Too early to finalize your withdrawal\\\";\\n\\n string constant ONLY_TRANSITIONER = \\\"BondManager: Only the transitioner for this pre-state root may call this function\\\";\\n string constant ONLY_FRAUD_VERIFIER = \\\"BondManager: Only the fraud verifier may call this function\\\";\\n string constant ONLY_STATE_COMMITMENT_CHAIN = \\\"BondManager: Only the state commitment chain may call this function\\\";\\n string constant WAIT_FOR_DISPUTES = \\\"BondManager: Wait for other potential disputes\\\";\\n}\\n\\n/**\\n * @title iOVM_BondManager\\n */\\ninterface iOVM_BondManager {\\n\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n /// The lifecycle of a proposer's bond\\n enum State {\\n // Before depositing or after getting slashed, a user is uncollateralized\\n NOT_COLLATERALIZED,\\n // After depositing, a user is collateralized\\n COLLATERALIZED,\\n // After a user has initiated a withdrawal\\n WITHDRAWING\\n }\\n\\n /// A bond posted by a proposer\\n struct Bond {\\n // The user's state\\n State state;\\n // The timestamp at which a proposer issued their withdrawal request\\n uint32 withdrawalTimestamp;\\n // The time when the first disputed was initiated for this bond\\n uint256 firstDisputeAt;\\n // The earliest observed state root for this bond which has had fraud\\n bytes32 earliestDisputedStateRoot;\\n // The state root's timestamp\\n uint256 earliestTimestamp;\\n }\\n\\n // Per pre-state root, store the number of state provisions that were made\\n // and how many of these calls were made by each user. Payouts will then be\\n // claimed by users proportionally for that dispute.\\n struct Rewards {\\n // Flag to check if rewards for a fraud proof are claimable\\n bool canClaim;\\n // Total number of `recordGasSpent` calls made\\n uint256 total;\\n // The gas spent by each user to provide witness data. The sum of all\\n // values inside this map MUST be equal to the value of `total`\\n mapping(address => uint256) gasSpent;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function recordGasSpent(\\n bytes32 _preStateRoot,\\n bytes32 _txHash,\\n address _who,\\n uint256 _gasSpent\\n ) external;\\n\\n function finalize(\\n bytes32 _preStateRoot,\\n address _publisher,\\n uint256 _timestamp\\n ) external;\\n\\n function deposit() external;\\n\\n function startWithdrawal() external;\\n\\n function finalizeWithdrawal() external;\\n\\n function claim(\\n address _who\\n ) external;\\n\\n function isCollateralized(\\n address _who\\n ) external view returns (bool);\\n\\n function getGasSpent(\\n bytes32 _preStateRoot,\\n address _who\\n ) external view returns (uint256);\\n}\\n\",\"keccak256\":\"0x3c2a8a399487857158649db1896749d86e39cba545a8aeb2e2bb0f3bdfa7a5b1\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// +build ovm\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Contract Imports */\\nimport { Ownable } from \\\"./Lib_Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n /*******************************************\\n * Contract Variables: Internal Accounting *\\n *******************************************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n public\\n onlyOwner\\n {\\n emit AddressSet(_name, _address);\\n addresses[_getNameHash(_name)] = _address;\\n }\\n\\n function getAddress(\\n string memory _name\\n )\\n public\\n view\\n returns (address)\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32 _hash\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xdf802e1cc6474df913626991e9fca3835c620a519f397afe04bf9c260e723257\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// +build ovm\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\ncontract Lib_AddressResolver {\\n\\n /*******************************************\\n * Contract Variables: Contract References *\\n *******************************************/\\n\\n Lib_AddressManager internal libAddressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(\\n address _libAddressManager\\n ) public {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function resolve(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address _contract\\n )\\n {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0xf3b9d78b309ddeec259ce3e0e1cfdef3ca40938e9a81971b28ce2b8ea327f533\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// +build ovm\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Ownable\\n * @dev Adapted from https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol\\n */\\nabstract contract Ownable {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n address public owner;\\n\\n\\n /**********\\n * Events *\\n **********/\\n\\n event OwnershipTransferred(\\n address indexed previousOwner,\\n address indexed newOwner\\n );\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n constructor() internal {\\n owner = msg.sender;\\n emit OwnershipTransferred(address(0), owner);\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n owner == msg.sender,\\n \\\"Ownable: caller is not the owner\\\"\\n );\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function renounceOwnership()\\n public\\n virtual\\n onlyOwner\\n {\\n emit OwnershipTransferred(owner, address(0));\\n owner = address(0);\\n }\\n\\n function transferOwnership(address _newOwner)\\n public\\n virtual\\n onlyOwner\\n {\\n require(\\n _newOwner != address(0),\\n \\\"Ownable: new owner cannot be the zero address\\\"\\n );\\n\\n emit OwnershipTransferred(owner, _newOwner);\\n owner = _newOwner;\\n }\\n}\\n\",\"keccak256\":\"0xe0409fbd236d16ca6be439d9d97dd36d0d9a0697ee0062d49588b9d29c248e47\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/mockOVM/verification/mockOVM_BondManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.7.0;\\n\\n/* Interface Imports */\\nimport { iOVM_BondManager } from \\\"../../iOVM/verification/iOVM_BondManager.sol\\\";\\n\\n/* Contract Imports */\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/**\\n * @title mockOVM_BondManager\\n */\\ncontract mockOVM_BondManager is iOVM_BondManager, Lib_AddressResolver {\\n constructor(\\n address _libAddressManager\\n )\\n Lib_AddressResolver(_libAddressManager)\\n {}\\n\\n function recordGasSpent(\\n bytes32 _preStateRoot,\\n bytes32 _txHash,\\n address _who,\\n uint256 _gasSpent\\n )\\n override\\n public\\n {}\\n\\n function finalize(\\n bytes32 _preStateRoot,\\n address _publisher,\\n uint256 _timestamp\\n )\\n override\\n public\\n {}\\n\\n function deposit()\\n override\\n public\\n {}\\n\\n function startWithdrawal()\\n override\\n public\\n {}\\n\\n function finalizeWithdrawal()\\n override\\n public\\n {}\\n\\n function claim(\\n address _who\\n )\\n override\\n public\\n {}\\n\\n function isCollateralized(\\n address _who\\n )\\n override\\n public\\n view\\n returns (\\n bool\\n )\\n {\\n // Only authenticate sequencer to submit state root batches.\\n return _who == resolve(\\\"OVM_Sequencer\\\");\\n }\\n\\n function getGasSpent(\\n bytes32 _preStateRoot,\\n address _who\\n )\\n override\\n public\\n view\\n returns (\\n uint256\\n )\\n {\\n return 0;\\n }\\n}\\n\",\"keccak256\":\"0x03c283c91205609fbc19856d9c7fb15da972c3499e00ed049453654723bfaa4c\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x608060405234801561001057600080fd5b506040516104463803806104468339818101604052602081101561003357600080fd5b5051600080546001600160a01b039092166001600160a01b03199092169190911790556103e1806100656000396000f3fe608060405234801561001057600080fd5b50600436106100935760003560e01c8063abfbbe1311610066578063abfbbe13146101f4578063bc2f8dd814610226578063c5b6aa2f14610226578063d0e30db014610226578063dc6453dc1461022e57610093565b806302ad4d2a146100985780631e16e92f146100d25780631e83409a1461010c578063461a447814610132575b600080fd5b6100be600480360360208110156100ae57600080fd5b50356001600160a01b031661026c565b604080519115158252519081900360200190f35b61010a600480360360808110156100e857600080fd5b508035906020810135906001600160a01b0360408201351690606001356102b7565b005b61010a6004803603602081101561012257600080fd5b50356001600160a01b03166102bd565b6101d86004803603602081101561014857600080fd5b81019060208101813564010000000081111561016357600080fd5b82018360208201111561017557600080fd5b8035906020019184600183028401116401000000008311171561019757600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506102c0945050505050565b604080516001600160a01b039092168252519081900360200190f35b61010a6004803603606081101561020a57600080fd5b508035906001600160a01b03602082013516906040013561039c565b61010a6103a1565b61025a6004803603604081101561024457600080fd5b50803590602001356001600160a01b03166103a3565b60408051918252519081900360200190f35b600061029c6040518060400160405280600d81526020016c27ab26afa9b2b8bab2b731b2b960991b8152506102c0565b6001600160a01b0316826001600160a01b0316149050919050565b50505050565b50565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b83811015610320578181015183820152602001610308565b50505050905090810190601f16801561034d5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561036a57600080fd5b505afa15801561037e573d6000803e3d6000fd5b505050506040513d602081101561039457600080fd5b505192915050565b505050565b565b60009291505056fea26469706673582212203f0728d2ffd5e87f3b2f160e5704cc5c07ae231349c1c6286f6360e26317c39b64736f6c63430007060033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100935760003560e01c8063abfbbe1311610066578063abfbbe13146101f4578063bc2f8dd814610226578063c5b6aa2f14610226578063d0e30db014610226578063dc6453dc1461022e57610093565b806302ad4d2a146100985780631e16e92f146100d25780631e83409a1461010c578063461a447814610132575b600080fd5b6100be600480360360208110156100ae57600080fd5b50356001600160a01b031661026c565b604080519115158252519081900360200190f35b61010a600480360360808110156100e857600080fd5b508035906020810135906001600160a01b0360408201351690606001356102b7565b005b61010a6004803603602081101561012257600080fd5b50356001600160a01b03166102bd565b6101d86004803603602081101561014857600080fd5b81019060208101813564010000000081111561016357600080fd5b82018360208201111561017557600080fd5b8035906020019184600183028401116401000000008311171561019757600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506102c0945050505050565b604080516001600160a01b039092168252519081900360200190f35b61010a6004803603606081101561020a57600080fd5b508035906001600160a01b03602082013516906040013561039c565b61010a6103a1565b61025a6004803603604081101561024457600080fd5b50803590602001356001600160a01b03166103a3565b60408051918252519081900360200190f35b600061029c6040518060400160405280600d81526020016c27ab26afa9b2b8bab2b731b2b960991b8152506102c0565b6001600160a01b0316826001600160a01b0316149050919050565b50505050565b50565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b83811015610320578181015183820152602001610308565b50505050905090810190601f16801561034d5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561036a57600080fd5b505afa15801561037e573d6000803e3d6000fd5b505050506040513d602081101561039457600080fd5b505192915050565b505050565b565b60009291505056fea26469706673582212203f0728d2ffd5e87f3b2f160e5704cc5c07ae231349c1c6286f6360e26317c39b64736f6c63430007060033", - "devdoc": { - "kind": "dev", - "methods": {}, - "title": "mockOVM_BondManager", - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": {}, - "version": 1 - }, - "storageLayout": { - "storage": [ - { - "astId": 11707, - "contract": "contracts/optimistic-ethereum/mockOVM/verification/mockOVM_BondManager.sol:mockOVM_BondManager", - "label": "libAddressManager", - "offset": 0, - "slot": "0", - "type": "t_contract(Lib_AddressManager)11700" - } - ], - "types": { - "t_contract(Lib_AddressManager)11700": { - "encoding": "inplace", - "label": "contract Lib_AddressManager", - "numberOfBytes": "20" - } - } - } -} \ No newline at end of file diff --git a/packages/contracts/deployments/kovan-v1/solcInputs/cebcb515c1a9c570d96e0b8f6fd237e2.json b/packages/contracts/deployments/kovan-v1/solcInputs/cebcb515c1a9c570d96e0b8f6fd237e2.json deleted file mode 100644 index 2481f94bd54d4..0000000000000 --- a/packages/contracts/deployments/kovan-v1/solcInputs/cebcb515c1a9c570d96e0b8f6fd237e2.json +++ /dev/null @@ -1,266 +0,0 @@ -{ - "language": "Solidity", - "sources": { - "contracts/optimistic-ethereum/iOVM/accounts/iOVM_ECDSAContractAccount.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/**\n * @title iOVM_ECDSAContractAccount\n */\ninterface iOVM_ECDSAContractAccount {\n\n /********************\n * Public Functions *\n ********************/\n\n function execute(\n bytes memory _transaction,\n Lib_OVMCodec.EOASignatureType _signatureType,\n uint8 _v,\n bytes32 _r,\n bytes32 _s\n ) external returns (bool _success, bytes memory _returndata);\n}\n" - }, - "contracts/optimistic-ethereum/libraries/codec/Lib_OVMCodec.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_RLPReader } from \"../rlp/Lib_RLPReader.sol\";\nimport { Lib_RLPWriter } from \"../rlp/Lib_RLPWriter.sol\";\nimport { Lib_BytesUtils } from \"../utils/Lib_BytesUtils.sol\";\nimport { Lib_Bytes32Utils } from \"../utils/Lib_Bytes32Utils.sol\";\nimport { Lib_SafeExecutionManagerWrapper } from \"../../libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\";\n\n/**\n * @title Lib_OVMCodec\n */\nlibrary Lib_OVMCodec {\n\n /*************\n * Constants *\n *************/\n\n bytes constant internal RLP_NULL_BYTES = hex'80';\n bytes constant internal NULL_BYTES = bytes('');\n\n // Ring buffer IDs\n bytes32 constant internal RING_BUFFER_SCC_BATCHES = keccak256(\"RING_BUFFER_SCC_BATCHES\");\n bytes32 constant internal RING_BUFFER_CTC_BATCHES = keccak256(\"RING_BUFFER_CTC_BATCHES\");\n bytes32 constant internal RING_BUFFER_CTC_QUEUE = keccak256(\"RING_BUFFER_CTC_QUEUE\");\n\n\n /*********\n * Enums *\n *********/\n\n enum EOASignatureType {\n EIP155_TRANSACTON,\n ETH_SIGNED_MESSAGE\n }\n\n enum QueueOrigin {\n SEQUENCER_QUEUE,\n L1TOL2_QUEUE\n }\n\n\n /***********\n * Structs *\n ***********/\n\n struct Account {\n uint256 nonce;\n uint256 balance;\n bytes32 storageRoot;\n bytes32 codeHash;\n address ethAddress;\n bool isFresh;\n }\n\n struct EVMAccount {\n uint256 nonce;\n uint256 balance;\n bytes32 storageRoot;\n bytes32 codeHash;\n }\n\n struct ChainBatchHeader {\n uint256 batchIndex;\n bytes32 batchRoot;\n uint256 batchSize;\n uint256 prevTotalElements;\n bytes extraData;\n }\n\n struct ChainInclusionProof {\n uint256 index;\n bytes32[] siblings;\n }\n\n struct Transaction {\n uint256 timestamp;\n uint256 blockNumber;\n QueueOrigin l1QueueOrigin;\n address l1TxOrigin;\n address entrypoint;\n uint256 gasLimit;\n bytes data;\n }\n\n struct TransactionChainElement {\n bool isSequenced;\n uint256 queueIndex; // QUEUED TX ONLY\n uint256 timestamp; // SEQUENCER TX ONLY\n uint256 blockNumber; // SEQUENCER TX ONLY\n bytes txData; // SEQUENCER TX ONLY\n }\n\n struct QueueElement {\n bytes32 queueRoot;\n uint40 timestamp;\n uint40 blockNumber;\n }\n\n struct EIP155Transaction {\n uint256 nonce;\n uint256 gasPrice;\n uint256 gasLimit;\n address to;\n uint256 value;\n bytes data;\n uint256 chainId;\n }\n\n\n /*********************************************\n * Internal Functions: Encoding and Decoding *\n *********************************************/\n\n /**\n * Decodes an EOA transaction (i.e., native Ethereum RLP encoding).\n * @param _transaction Encoded EOA transaction.\n * @return _decoded Transaction decoded into a struct.\n */\n function decodeEIP155Transaction(\n bytes memory _transaction,\n bool _isEthSignedMessage\n )\n internal\n pure\n returns (\n EIP155Transaction memory _decoded\n )\n {\n if (_isEthSignedMessage) {\n (\n uint256 _nonce,\n uint256 _gasLimit,\n uint256 _gasPrice,\n uint256 _chainId,\n address _to,\n bytes memory _data\n ) = abi.decode(\n _transaction,\n (uint256, uint256, uint256, uint256, address ,bytes)\n );\n return EIP155Transaction({\n nonce: _nonce,\n gasPrice: _gasPrice,\n gasLimit: _gasLimit,\n to: _to,\n value: 0,\n data: _data,\n chainId: _chainId\n });\n } else {\n Lib_RLPReader.RLPItem[] memory decoded = Lib_RLPReader.readList(_transaction);\n\n return EIP155Transaction({\n nonce: Lib_RLPReader.readUint256(decoded[0]),\n gasPrice: Lib_RLPReader.readUint256(decoded[1]),\n gasLimit: Lib_RLPReader.readUint256(decoded[2]),\n to: Lib_RLPReader.readAddress(decoded[3]),\n value: Lib_RLPReader.readUint256(decoded[4]),\n data: Lib_RLPReader.readBytes(decoded[5]),\n chainId: Lib_RLPReader.readUint256(decoded[6])\n });\n }\n }\n\n function decompressEIP155Transaction(\n bytes memory _transaction\n )\n internal\n returns (\n EIP155Transaction memory _decompressed\n )\n {\n return EIP155Transaction({\n gasLimit: Lib_BytesUtils.toUint24(_transaction, 0),\n gasPrice: uint256(Lib_BytesUtils.toUint24(_transaction, 3)) * 1000000,\n nonce: Lib_BytesUtils.toUint24(_transaction, 6),\n to: Lib_BytesUtils.toAddress(_transaction, 9),\n data: Lib_BytesUtils.slice(_transaction, 29),\n chainId: Lib_SafeExecutionManagerWrapper.safeCHAINID(),\n value: 0\n });\n }\n\n /**\n * Encodes an EOA transaction back into the original transaction.\n * @param _transaction EIP155transaction to encode.\n * @param _isEthSignedMessage Whether or not this was an eth signed message.\n * @return Encoded transaction.\n */\n function encodeEIP155Transaction(\n EIP155Transaction memory _transaction,\n bool _isEthSignedMessage\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n if (_isEthSignedMessage) {\n return abi.encode(\n _transaction.nonce,\n _transaction.gasLimit,\n _transaction.gasPrice,\n _transaction.chainId,\n _transaction.to,\n _transaction.data\n );\n } else {\n bytes[] memory raw = new bytes[](9);\n\n raw[0] = Lib_RLPWriter.writeUint(_transaction.nonce);\n raw[1] = Lib_RLPWriter.writeUint(_transaction.gasPrice);\n raw[2] = Lib_RLPWriter.writeUint(_transaction.gasLimit);\n if (_transaction.to == address(0)) {\n raw[3] = Lib_RLPWriter.writeBytes('');\n } else {\n raw[3] = Lib_RLPWriter.writeAddress(_transaction.to);\n }\n raw[4] = Lib_RLPWriter.writeUint(0);\n raw[5] = Lib_RLPWriter.writeBytes(_transaction.data);\n raw[6] = Lib_RLPWriter.writeUint(_transaction.chainId);\n raw[7] = Lib_RLPWriter.writeBytes(bytes(''));\n raw[8] = Lib_RLPWriter.writeBytes(bytes(''));\n\n return Lib_RLPWriter.writeList(raw);\n }\n }\n\n /**\n * Encodes a standard OVM transaction.\n * @param _transaction OVM transaction to encode.\n * @return _encoded Encoded transaction bytes.\n */\n function encodeTransaction(\n Transaction memory _transaction\n )\n internal\n pure\n returns (\n bytes memory _encoded\n )\n {\n return abi.encodePacked(\n _transaction.timestamp,\n _transaction.blockNumber,\n _transaction.l1QueueOrigin,\n _transaction.l1TxOrigin,\n _transaction.entrypoint,\n _transaction.gasLimit,\n _transaction.data\n );\n }\n\n /**\n * Hashes a standard OVM transaction.\n * @param _transaction OVM transaction to encode.\n * @return _hash Hashed transaction\n */\n function hashTransaction(\n Transaction memory _transaction\n )\n internal\n pure\n returns (\n bytes32 _hash\n )\n {\n return keccak256(encodeTransaction(_transaction));\n }\n\n /**\n * Converts an OVM account to an EVM account.\n * @param _in OVM account to convert.\n * @return _out Converted EVM account.\n */\n function toEVMAccount(\n Account memory _in\n )\n internal\n pure\n returns (\n EVMAccount memory _out\n )\n {\n return EVMAccount({\n nonce: _in.nonce,\n balance: _in.balance,\n storageRoot: _in.storageRoot,\n codeHash: _in.codeHash\n });\n }\n\n /**\n * @notice RLP-encodes an account state struct.\n * @param _account Account state struct.\n * @return _encoded RLP-encoded account state.\n */\n function encodeEVMAccount(\n EVMAccount memory _account\n )\n internal\n pure\n returns (\n bytes memory _encoded\n )\n {\n bytes[] memory raw = new bytes[](4);\n\n // Unfortunately we can't create this array outright because\n // Lib_RLPWriter.writeList will reject fixed-size arrays. Assigning\n // index-by-index circumvents this issue.\n raw[0] = Lib_RLPWriter.writeBytes(\n Lib_Bytes32Utils.removeLeadingZeros(\n bytes32(_account.nonce)\n )\n );\n raw[1] = Lib_RLPWriter.writeBytes(\n Lib_Bytes32Utils.removeLeadingZeros(\n bytes32(_account.balance)\n )\n );\n raw[2] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.storageRoot));\n raw[3] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.codeHash));\n\n return Lib_RLPWriter.writeList(raw);\n }\n\n /**\n * @notice Decodes an RLP-encoded account state into a useful struct.\n * @param _encoded RLP-encoded account state.\n * @return _account Account state struct.\n */\n function decodeEVMAccount(\n bytes memory _encoded\n )\n internal\n pure\n returns (\n EVMAccount memory _account\n )\n {\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\n\n return EVMAccount({\n nonce: Lib_RLPReader.readUint256(accountState[0]),\n balance: Lib_RLPReader.readUint256(accountState[1]),\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\n });\n }\n\n /**\n * Calculates a hash for a given batch header.\n * @param _batchHeader Header to hash.\n * @return _hash Hash of the header.\n */\n function hashBatchHeader(\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\n )\n internal\n pure\n returns (\n bytes32 _hash\n )\n {\n return keccak256(\n abi.encode(\n _batchHeader.batchRoot,\n _batchHeader.batchSize,\n _batchHeader.prevTotalElements,\n _batchHeader.extraData\n )\n );\n }\n}\n" - }, - "contracts/optimistic-ethereum/libraries/rlp/Lib_RLPReader.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.7.0;\n\n/**\n * @title Lib_RLPReader\n * @dev Adapted from \"RLPReader\" by Hamdi Allam (hamdi.allam97@gmail.com).\n */\nlibrary Lib_RLPReader {\n\n /*************\n * Constants *\n *************/\n\n uint256 constant internal MAX_LIST_LENGTH = 32;\n\n\n /*********\n * Enums *\n *********/\n\n enum RLPItemType {\n DATA_ITEM,\n LIST_ITEM\n }\n\n \n /***********\n * Structs *\n ***********/\n\n struct RLPItem {\n uint256 length;\n uint256 ptr;\n }\n \n\n /**********************\n * Internal Functions *\n **********************/\n \n /**\n * Converts bytes to a reference to memory position and length.\n * @param _in Input bytes to convert.\n * @return Output memory reference.\n */\n function toRLPItem(\n bytes memory _in\n )\n internal\n pure\n returns (\n RLPItem memory\n )\n {\n uint256 ptr;\n assembly {\n ptr := add(_in, 32)\n }\n\n return RLPItem({\n length: _in.length,\n ptr: ptr\n });\n }\n\n /**\n * Reads an RLP list value into a list of RLP items.\n * @param _in RLP list value.\n * @return Decoded RLP list items.\n */\n function readList(\n RLPItem memory _in\n )\n internal\n pure\n returns (\n RLPItem[] memory\n )\n {\n (\n uint256 listOffset,\n ,\n RLPItemType itemType\n ) = _decodeLength(_in);\n\n require(\n itemType == RLPItemType.LIST_ITEM,\n \"Invalid RLP list value.\"\n );\n\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\n // writing to the length. Since we can't know the number of RLP items without looping over\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\n // simply set a reasonable maximum list length and decrease the size before we finish.\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\n\n uint256 itemCount = 0;\n uint256 offset = listOffset;\n while (offset < _in.length) {\n require(\n itemCount < MAX_LIST_LENGTH,\n \"Provided RLP list exceeds max list length.\"\n );\n\n (\n uint256 itemOffset,\n uint256 itemLength,\n ) = _decodeLength(RLPItem({\n length: _in.length - offset,\n ptr: _in.ptr + offset\n }));\n\n out[itemCount] = RLPItem({\n length: itemLength + itemOffset,\n ptr: _in.ptr + offset\n });\n\n itemCount += 1;\n offset += itemOffset + itemLength;\n }\n\n // Decrease the array size to match the actual item count.\n assembly {\n mstore(out, itemCount)\n }\n\n return out;\n }\n\n /**\n * Reads an RLP list value into a list of RLP items.\n * @param _in RLP list value.\n * @return Decoded RLP list items.\n */\n function readList(\n bytes memory _in\n )\n internal\n pure\n returns (\n RLPItem[] memory\n )\n {\n return readList(\n toRLPItem(_in)\n );\n }\n\n /**\n * Reads an RLP bytes value into bytes.\n * @param _in RLP bytes value.\n * @return Decoded bytes.\n */\n function readBytes(\n RLPItem memory _in\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n (\n uint256 itemOffset,\n uint256 itemLength,\n RLPItemType itemType\n ) = _decodeLength(_in);\n\n require(\n itemType == RLPItemType.DATA_ITEM,\n \"Invalid RLP bytes value.\"\n );\n\n return _copy(_in.ptr, itemOffset, itemLength);\n }\n\n /**\n * Reads an RLP bytes value into bytes.\n * @param _in RLP bytes value.\n * @return Decoded bytes.\n */\n function readBytes(\n bytes memory _in\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n return readBytes(\n toRLPItem(_in)\n );\n }\n\n /**\n * Reads an RLP string value into a string.\n * @param _in RLP string value.\n * @return Decoded string.\n */\n function readString(\n RLPItem memory _in\n )\n internal\n pure\n returns (\n string memory\n )\n {\n return string(readBytes(_in));\n }\n\n /**\n * Reads an RLP string value into a string.\n * @param _in RLP string value.\n * @return Decoded string.\n */\n function readString(\n bytes memory _in\n )\n internal\n pure\n returns (\n string memory\n )\n {\n return readString(\n toRLPItem(_in)\n );\n }\n\n /**\n * Reads an RLP bytes32 value into a bytes32.\n * @param _in RLP bytes32 value.\n * @return Decoded bytes32.\n */\n function readBytes32(\n RLPItem memory _in\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n require(\n _in.length <= 33,\n \"Invalid RLP bytes32 value.\"\n );\n\n (\n uint256 itemOffset,\n uint256 itemLength,\n RLPItemType itemType\n ) = _decodeLength(_in);\n\n require(\n itemType == RLPItemType.DATA_ITEM,\n \"Invalid RLP bytes32 value.\"\n );\n\n uint256 ptr = _in.ptr + itemOffset;\n bytes32 out;\n assembly {\n out := mload(ptr)\n\n // Shift the bytes over to match the item size.\n if lt(itemLength, 32) {\n out := div(out, exp(256, sub(32, itemLength)))\n }\n }\n\n return out;\n }\n\n /**\n * Reads an RLP bytes32 value into a bytes32.\n * @param _in RLP bytes32 value.\n * @return Decoded bytes32.\n */\n function readBytes32(\n bytes memory _in\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n return readBytes32(\n toRLPItem(_in)\n );\n }\n\n /**\n * Reads an RLP uint256 value into a uint256.\n * @param _in RLP uint256 value.\n * @return Decoded uint256.\n */\n function readUint256(\n RLPItem memory _in\n )\n internal\n pure\n returns (\n uint256\n )\n {\n return uint256(readBytes32(_in));\n }\n\n /**\n * Reads an RLP uint256 value into a uint256.\n * @param _in RLP uint256 value.\n * @return Decoded uint256.\n */\n function readUint256(\n bytes memory _in\n )\n internal\n pure\n returns (\n uint256\n )\n {\n return readUint256(\n toRLPItem(_in)\n );\n }\n\n /**\n * Reads an RLP bool value into a bool.\n * @param _in RLP bool value.\n * @return Decoded bool.\n */\n function readBool(\n RLPItem memory _in\n )\n internal\n pure\n returns (\n bool\n )\n {\n require(\n _in.length == 1,\n \"Invalid RLP boolean value.\"\n );\n\n uint256 ptr = _in.ptr;\n uint256 out;\n assembly {\n out := byte(0, mload(ptr))\n }\n\n return out != 0;\n }\n\n /**\n * Reads an RLP bool value into a bool.\n * @param _in RLP bool value.\n * @return Decoded bool.\n */\n function readBool(\n bytes memory _in\n )\n internal\n pure\n returns (\n bool\n )\n {\n return readBool(\n toRLPItem(_in)\n );\n }\n\n /**\n * Reads an RLP address value into a address.\n * @param _in RLP address value.\n * @return Decoded address.\n */\n function readAddress(\n RLPItem memory _in\n )\n internal\n pure\n returns (\n address\n )\n {\n if (_in.length == 1) {\n return address(0);\n }\n\n require(\n _in.length == 21,\n \"Invalid RLP address value.\"\n );\n\n return address(readUint256(_in));\n }\n\n /**\n * Reads an RLP address value into a address.\n * @param _in RLP address value.\n * @return Decoded address.\n */\n function readAddress(\n bytes memory _in\n )\n internal\n pure\n returns (\n address\n )\n {\n return readAddress(\n toRLPItem(_in)\n );\n }\n\n /**\n * Reads the raw bytes of an RLP item.\n * @param _in RLP item to read.\n * @return Raw RLP bytes.\n */\n function readRawBytes(\n RLPItem memory _in\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n return _copy(_in);\n }\n\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * Decodes the length of an RLP item.\n * @param _in RLP item to decode.\n * @return Offset of the encoded data.\n * @return Length of the encoded data.\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\n */\n function _decodeLength(\n RLPItem memory _in\n )\n private\n pure\n returns (\n uint256,\n uint256,\n RLPItemType\n )\n {\n require(\n _in.length > 0,\n \"RLP item cannot be null.\"\n );\n\n uint256 ptr = _in.ptr;\n uint256 prefix;\n assembly {\n prefix := byte(0, mload(ptr))\n }\n\n if (prefix <= 0x7f) {\n // Single byte.\n\n return (0, 1, RLPItemType.DATA_ITEM);\n } else if (prefix <= 0xb7) {\n // Short string.\n\n uint256 strLen = prefix - 0x80;\n \n require(\n _in.length > strLen,\n \"Invalid RLP short string.\"\n );\n\n return (1, strLen, RLPItemType.DATA_ITEM);\n } else if (prefix <= 0xbf) {\n // Long string.\n uint256 lenOfStrLen = prefix - 0xb7;\n\n require(\n _in.length > lenOfStrLen,\n \"Invalid RLP long string length.\"\n );\n\n uint256 strLen;\n assembly {\n // Pick out the string length.\n strLen := div(\n mload(add(ptr, 1)),\n exp(256, sub(32, lenOfStrLen))\n )\n }\n\n require(\n _in.length > lenOfStrLen + strLen,\n \"Invalid RLP long string.\"\n );\n\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\n } else if (prefix <= 0xf7) {\n // Short list.\n uint256 listLen = prefix - 0xc0;\n\n require(\n _in.length > listLen,\n \"Invalid RLP short list.\"\n );\n\n return (1, listLen, RLPItemType.LIST_ITEM);\n } else {\n // Long list.\n uint256 lenOfListLen = prefix - 0xf7;\n\n require(\n _in.length > lenOfListLen,\n \"Invalid RLP long list length.\"\n );\n\n uint256 listLen;\n assembly {\n // Pick out the list length.\n listLen := div(\n mload(add(ptr, 1)),\n exp(256, sub(32, lenOfListLen))\n )\n }\n\n require(\n _in.length > lenOfListLen + listLen,\n \"Invalid RLP long list.\"\n );\n\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\n }\n }\n\n /**\n * Copies the bytes from a memory location.\n * @param _src Pointer to the location to read from.\n * @param _offset Offset to start reading from.\n * @param _length Number of bytes to read.\n * @return Copied bytes.\n */\n function _copy(\n uint256 _src,\n uint256 _offset,\n uint256 _length\n )\n private\n pure\n returns (\n bytes memory\n )\n {\n bytes memory out = new bytes(_length);\n if (out.length == 0) {\n return out;\n }\n\n uint256 src = _src + _offset;\n uint256 dest;\n assembly {\n dest := add(out, 32)\n }\n\n // Copy over as many complete words as we can.\n for (uint256 i = 0; i < _length / 32; i++) {\n assembly {\n mstore(dest, mload(src))\n }\n\n src += 32;\n dest += 32;\n }\n\n // Pick out the remaining bytes.\n uint256 mask = 256 ** (32 - (_length % 32)) - 1;\n assembly {\n mstore(\n dest,\n or(\n and(mload(src), not(mask)),\n and(mload(dest), mask)\n )\n )\n }\n\n return out;\n }\n\n /**\n * Copies an RLP item into bytes.\n * @param _in RLP item to copy.\n * @return Copied bytes.\n */\n function _copy(\n RLPItem memory _in\n )\n private\n pure\n returns (\n bytes memory\n )\n {\n return _copy(_in.ptr, 0, _in.length);\n }\n}\n" - }, - "contracts/optimistic-ethereum/libraries/rlp/Lib_RLPWriter.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.7.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_BytesUtils } from \"../utils/Lib_BytesUtils.sol\";\n\n/**\n * @title Lib_RLPWriter\n * @author Bakaoh (with modifications)\n */\nlibrary Lib_RLPWriter {\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * RLP encodes a byte string.\n * @param _in The byte string to encode.\n * @return _out The RLP encoded string in bytes.\n */\n function writeBytes(\n bytes memory _in\n )\n internal\n pure\n returns (\n bytes memory _out\n )\n {\n bytes memory encoded;\n\n if (_in.length == 1 && uint8(_in[0]) < 128) {\n encoded = _in;\n } else {\n encoded = Lib_BytesUtils.concat(_writeLength(_in.length, 128), _in);\n }\n\n return encoded;\n }\n\n /**\n * RLP encodes a list of RLP encoded byte byte strings.\n * @param _in The list of RLP encoded byte strings.\n * @return _out The RLP encoded list of items in bytes.\n */\n function writeList(\n bytes[] memory _in\n )\n internal\n pure\n returns (\n bytes memory _out\n )\n {\n bytes memory list = _flatten(_in);\n return Lib_BytesUtils.concat(_writeLength(list.length, 192), list);\n }\n\n /**\n * RLP encodes a string.\n * @param _in The string to encode.\n * @return _out The RLP encoded string in bytes.\n */\n function writeString(\n string memory _in\n )\n internal\n pure\n returns (\n bytes memory _out\n )\n {\n return writeBytes(bytes(_in));\n }\n\n /**\n * RLP encodes an address.\n * @param _in The address to encode.\n * @return _out The RLP encoded address in bytes.\n */\n function writeAddress(\n address _in\n )\n internal\n pure\n returns (\n bytes memory _out\n )\n {\n return writeBytes(abi.encodePacked(_in));\n }\n\n /**\n * RLP encodes a uint.\n * @param _in The uint256 to encode.\n * @return _out The RLP encoded uint256 in bytes.\n */\n function writeUint(\n uint256 _in\n )\n internal\n pure\n returns (\n bytes memory _out\n )\n {\n return writeBytes(_toBinary(_in));\n }\n\n /**\n * RLP encodes a bool.\n * @param _in The bool to encode.\n * @return _out The RLP encoded bool in bytes.\n */\n function writeBool(\n bool _in\n )\n internal\n pure\n returns (\n bytes memory _out\n )\n {\n bytes memory encoded = new bytes(1);\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\n return encoded;\n }\n\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\n * @param _len The length of the string or the payload.\n * @param _offset 128 if item is string, 192 if item is list.\n * @return _encoded RLP encoded bytes.\n */\n function _writeLength(\n uint256 _len,\n uint256 _offset\n )\n private\n pure\n returns (\n bytes memory _encoded\n )\n {\n bytes memory encoded;\n\n if (_len < 56) {\n encoded = new bytes(1);\n encoded[0] = byte(uint8(_len) + uint8(_offset));\n } else {\n uint256 lenLen;\n uint256 i = 1;\n while (_len / i != 0) {\n lenLen++;\n i *= 256;\n }\n\n encoded = new bytes(lenLen + 1);\n encoded[0] = byte(uint8(lenLen) + uint8(_offset) + 55);\n for(i = 1; i <= lenLen; i++) {\n encoded[i] = byte(uint8((_len / (256**(lenLen-i))) % 256));\n }\n }\n\n return encoded;\n }\n\n /**\n * Encode integer in big endian binary form with no leading zeroes.\n * @notice TODO: This should be optimized with assembly to save gas costs.\n * @param _x The integer to encode.\n * @return _binary RLP encoded bytes.\n */\n function _toBinary(\n uint256 _x\n )\n private\n pure\n returns (\n bytes memory _binary\n )\n {\n bytes memory b = abi.encodePacked(_x);\n\n uint256 i = 0;\n for (; i < 32; i++) {\n if (b[i] != 0) {\n break;\n }\n }\n\n bytes memory res = new bytes(32 - i);\n for (uint256 j = 0; j < res.length; j++) {\n res[j] = b[i++];\n }\n\n return res;\n }\n\n /**\n * Copies a piece of memory to another location.\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\n * @param _dest Destination location.\n * @param _src Source location.\n * @param _len Length of memory to copy.\n */\n function _memcpy(\n uint256 _dest,\n uint256 _src,\n uint256 _len\n )\n private\n pure\n {\n uint256 dest = _dest;\n uint256 src = _src;\n uint256 len = _len;\n\n for(; len >= 32; len -= 32) {\n assembly {\n mstore(dest, mload(src))\n }\n dest += 32;\n src += 32;\n }\n\n uint256 mask = 256 ** (32 - len) - 1;\n assembly {\n let srcpart := and(mload(src), not(mask))\n let destpart := and(mload(dest), mask)\n mstore(dest, or(destpart, srcpart))\n }\n }\n\n /**\n * Flattens a list of byte strings into one byte string.\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\n * @param _list List of byte strings to flatten.\n * @return _flattened The flattened byte string.\n */\n function _flatten(\n bytes[] memory _list\n )\n private\n pure\n returns (\n bytes memory _flattened\n )\n {\n if (_list.length == 0) {\n return new bytes(0);\n }\n\n uint256 len;\n uint256 i = 0;\n for (; i < _list.length; i++) {\n len += _list[i].length;\n }\n\n bytes memory flattened = new bytes(len);\n uint256 flattenedPtr;\n assembly { flattenedPtr := add(flattened, 0x20) }\n\n for(i = 0; i < _list.length; i++) {\n bytes memory item = _list[i];\n\n uint256 listPtr;\n assembly { listPtr := add(item, 0x20)}\n\n _memcpy(flattenedPtr, listPtr, item.length);\n flattenedPtr += _list[i].length;\n }\n\n return flattened;\n }\n}" - }, - "contracts/optimistic-ethereum/libraries/utils/Lib_BytesUtils.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.7.0;\n\n/**\n * @title Lib_BytesUtils\n */\nlibrary Lib_BytesUtils {\n\n /**********************\n * Internal Functions *\n **********************/\n\n function concat(\n bytes memory _preBytes,\n bytes memory _postBytes\n )\n internal\n pure\n returns (bytes memory)\n {\n bytes memory tempBytes;\n\n assembly {\n // Get a location of some free memory and store it in tempBytes as\n // Solidity does for memory variables.\n tempBytes := mload(0x40)\n\n // Store the length of the first bytes array at the beginning of\n // the memory for tempBytes.\n let length := mload(_preBytes)\n mstore(tempBytes, length)\n\n // Maintain a memory counter for the current write location in the\n // temp bytes array by adding the 32 bytes for the array length to\n // the starting location.\n let mc := add(tempBytes, 0x20)\n // Stop copying when the memory counter reaches the length of the\n // first bytes array.\n let end := add(mc, length)\n\n for {\n // Initialize a copy counter to the start of the _preBytes data,\n // 32 bytes into its memory.\n let cc := add(_preBytes, 0x20)\n } lt(mc, end) {\n // Increase both counters by 32 bytes each iteration.\n mc := add(mc, 0x20)\n cc := add(cc, 0x20)\n } {\n // Write the _preBytes data into the tempBytes memory 32 bytes\n // at a time.\n mstore(mc, mload(cc))\n }\n\n // Add the length of _postBytes to the current length of tempBytes\n // and store it as the new length in the first 32 bytes of the\n // tempBytes memory.\n length := mload(_postBytes)\n mstore(tempBytes, add(length, mload(tempBytes)))\n\n // Move the memory counter back from a multiple of 0x20 to the\n // actual end of the _preBytes data.\n mc := end\n // Stop copying when the memory counter reaches the new combined\n // length of the arrays.\n end := add(mc, length)\n\n for {\n let cc := add(_postBytes, 0x20)\n } lt(mc, end) {\n mc := add(mc, 0x20)\n cc := add(cc, 0x20)\n } {\n mstore(mc, mload(cc))\n }\n\n // Update the free-memory pointer by padding our last write location\n // to 32 bytes: add 31 bytes to the end of tempBytes to move to the\n // next 32 byte block, then round down to the nearest multiple of\n // 32. If the sum of the length of the two arrays is zero then add\n // one before rounding down to leave a blank 32 bytes (the length block with 0).\n mstore(0x40, and(\n add(add(end, iszero(add(length, mload(_preBytes)))), 31),\n not(31) // Round down to the nearest 32 bytes.\n ))\n }\n\n return tempBytes;\n }\n\n function slice(\n bytes memory _bytes,\n uint256 _start,\n uint256 _length\n )\n internal\n pure\n returns (bytes memory)\n {\n require(_length + 31 >= _length, \"slice_overflow\");\n require(_start + _length >= _start, \"slice_overflow\");\n require(_bytes.length >= _start + _length, \"slice_outOfBounds\");\n\n bytes memory tempBytes;\n\n assembly {\n switch iszero(_length)\n case 0 {\n // Get a location of some free memory and store it in tempBytes as\n // Solidity does for memory variables.\n tempBytes := mload(0x40)\n\n // The first word of the slice result is potentially a partial\n // word read from the original array. To read it, we calculate\n // the length of that partial word and start copying that many\n // bytes into the array. The first word we copy will start with\n // data we don't care about, but the last `lengthmod` bytes will\n // land at the beginning of the contents of the new array. When\n // we're done copying, we overwrite the full first word with\n // the actual length of the slice.\n let lengthmod := and(_length, 31)\n\n // The multiplication in the next line is necessary\n // because when slicing multiples of 32 bytes (lengthmod == 0)\n // the following copy loop was copying the origin's length\n // and then ending prematurely not copying everything it should.\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\n let end := add(mc, _length)\n\n for {\n // The multiplication in the next line has the same exact purpose\n // as the one above.\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\n } lt(mc, end) {\n mc := add(mc, 0x20)\n cc := add(cc, 0x20)\n } {\n mstore(mc, mload(cc))\n }\n\n mstore(tempBytes, _length)\n\n //update free-memory pointer\n //allocating the array padded to 32 bytes like the compiler does now\n mstore(0x40, and(add(mc, 31), not(31)))\n }\n //if we want a zero-length slice let's just return a zero-length array\n default {\n tempBytes := mload(0x40)\n\n //zero out the 32 bytes slice we are about to return\n //we need to do it because Solidity does not garbage collect\n mstore(tempBytes, 0)\n\n mstore(0x40, add(tempBytes, 0x20))\n }\n }\n\n return tempBytes;\n }\n\n function slice(\n bytes memory _bytes,\n uint256 _start\n )\n internal\n pure\n returns (bytes memory)\n {\n if (_bytes.length - _start == 0) {\n return bytes('');\n }\n\n return slice(_bytes, _start, _bytes.length - _start);\n }\n\n function toBytes32PadLeft(\n bytes memory _bytes\n )\n internal\n pure\n returns (bytes32)\n {\n bytes32 ret;\n uint256 len = _bytes.length <= 32 ? _bytes.length : 32;\n assembly {\n ret := shr(mul(sub(32, len), 8), mload(add(_bytes, 32)))\n }\n return ret;\n }\n\n function toBytes32(\n bytes memory _bytes\n )\n internal\n pure\n returns (bytes32)\n {\n if (_bytes.length < 32) {\n bytes32 ret;\n assembly {\n ret := mload(add(_bytes, 32))\n }\n return ret;\n }\n\n return abi.decode(_bytes,(bytes32)); // will truncate if input length > 32 bytes\n }\n\n function toUint256(\n bytes memory _bytes\n )\n internal\n pure\n returns (uint256)\n {\n return uint256(toBytes32(_bytes));\n }\n\n function toUint24(bytes memory _bytes, uint256 _start) internal pure returns (uint24) {\n require(_start + 3 >= _start, \"toUint24_overflow\");\n require(_bytes.length >= _start + 3 , \"toUint24_outOfBounds\");\n uint24 tempUint;\n\n assembly {\n tempUint := mload(add(add(_bytes, 0x3), _start))\n }\n\n return tempUint;\n }\n\n function toUint8(bytes memory _bytes, uint256 _start) internal pure returns (uint8) {\n require(_start + 1 >= _start, \"toUint8_overflow\");\n require(_bytes.length >= _start + 1 , \"toUint8_outOfBounds\");\n uint8 tempUint;\n\n assembly {\n tempUint := mload(add(add(_bytes, 0x1), _start))\n }\n\n return tempUint;\n }\n\n function toAddress(bytes memory _bytes, uint256 _start) internal pure returns (address) {\n require(_start + 20 >= _start, \"toAddress_overflow\");\n require(_bytes.length >= _start + 20, \"toAddress_outOfBounds\");\n address tempAddress;\n\n assembly {\n tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000)\n }\n\n return tempAddress;\n }\n\n function toNibbles(\n bytes memory _bytes\n )\n internal\n pure\n returns (bytes memory)\n {\n bytes memory nibbles = new bytes(_bytes.length * 2);\n\n for (uint256 i = 0; i < _bytes.length; i++) {\n nibbles[i * 2] = _bytes[i] >> 4;\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\n }\n\n return nibbles;\n }\n\n function fromNibbles(\n bytes memory _bytes\n )\n internal\n pure\n returns (bytes memory)\n {\n bytes memory ret = new bytes(_bytes.length / 2);\n\n for (uint256 i = 0; i < ret.length; i++) {\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\n }\n\n return ret;\n }\n\n function equal(\n bytes memory _bytes,\n bytes memory _other\n )\n internal\n pure\n returns (bool)\n {\n return keccak256(_bytes) == keccak256(_other);\n }\n}\n" - }, - "contracts/optimistic-ethereum/libraries/utils/Lib_Bytes32Utils.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.7.0;\n\n/**\n * @title Lib_Byte32Utils\n */\nlibrary Lib_Bytes32Utils {\n\n /**********************\n * Internal Functions *\n **********************/\n\n function toBool(\n bytes32 _in\n )\n internal\n pure\n returns (\n bool _out\n )\n {\n return _in != 0;\n }\n\n function fromBool(\n bool _in\n )\n internal\n pure\n returns (\n bytes32 _out\n )\n {\n return bytes32(uint256(_in ? 1 : 0));\n }\n\n function toAddress(\n bytes32 _in\n )\n internal\n pure\n returns (\n address _out\n )\n {\n return address(uint160(uint256(_in)));\n }\n\n function fromAddress(\n address _in\n )\n internal\n pure\n returns (\n bytes32 _out\n )\n {\n return bytes32(uint256(_in));\n }\n\n function removeLeadingZeros(\n bytes32 _in\n )\n internal\n pure\n returns (\n bytes memory _out\n )\n {\n bytes memory out;\n\n assembly {\n // Figure out how many leading zero bytes to remove.\n let shift := 0\n for { let i := 0 } and(lt(i, 32), eq(byte(i, _in), 0)) { i := add(i, 1) } {\n shift := add(shift, 1)\n }\n\n // Reserve some space for our output and fix the free memory pointer.\n out := mload(0x40)\n mstore(0x40, add(out, 0x40))\n\n // Shift the value and store it into the output bytes.\n mstore(add(out, 0x20), shl(mul(shift, 8), _in))\n\n // Store the new size (with leading zero bytes removed) in the output byte size.\n mstore(out, sub(32, shift))\n }\n\n return out;\n }\n}\n" - }, - "contracts/optimistic-ethereum/libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.7.0;\n\n/**\n * @title Lib_SafeExecutionManagerWrapper\n */\nlibrary Lib_SafeExecutionManagerWrapper {\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Makes an ovmCALL and performs all the necessary safety checks.\n * @param _gasLimit Gas limit for the call.\n * @param _target Address to call.\n * @param _calldata Data to send to the call.\n * @return _success Whether or not the call reverted.\n * @return _returndata Data returned by the call.\n */\n function safeCALL(\n uint256 _gasLimit,\n address _target,\n bytes memory _calldata\n )\n internal\n returns (\n bool _success,\n bytes memory _returndata\n )\n {\n bytes memory returndata = _safeExecutionManagerInteraction(\n abi.encodeWithSignature(\n \"ovmCALL(uint256,address,bytes)\",\n _gasLimit,\n _target,\n _calldata\n )\n );\n\n return abi.decode(returndata, (bool, bytes));\n }\n\n /**\n * Makes an ovmCALL and performs all the necessary safety checks.\n * @param _gasLimit Gas limit for the call.\n * @param _target Address to call.\n * @param _calldata Data to send to the call.\n * @return _success Whether or not the call reverted.\n * @return _returndata Data returned by the call.\n */\n function safeDELEGATECALL(\n uint256 _gasLimit,\n address _target,\n bytes memory _calldata\n )\n internal\n returns (\n bool _success,\n bytes memory _returndata\n )\n {\n bytes memory returndata = _safeExecutionManagerInteraction(\n abi.encodeWithSignature(\n \"ovmDELEGATECALL(uint256,address,bytes)\",\n _gasLimit,\n _target,\n _calldata\n )\n );\n\n return abi.decode(returndata, (bool, bytes));\n }\n\n /**\n * Performs an ovmCREATE and the necessary safety checks.\n * @param _gasLimit Gas limit for the creation.\n * @param _bytecode Code for the new contract.\n * @return _contract Address of the created contract.\n */\n function safeCREATE(\n uint256 _gasLimit,\n bytes memory _bytecode\n )\n internal\n returns (\n address _contract\n )\n {\n bytes memory returndata = _safeExecutionManagerInteraction(\n _gasLimit,\n abi.encodeWithSignature(\n \"ovmCREATE(bytes)\",\n _bytecode\n )\n );\n\n return abi.decode(returndata, (address));\n }\n\n /**\n * Performs an ovmEXTCODESIZE and the necessary safety checks.\n * @param _contract Address of the contract to query the size of.\n * @return _EXTCODESIZE Size of the requested contract in bytes.\n */\n function safeEXTCODESIZE(\n address _contract\n )\n internal\n returns (\n uint256 _EXTCODESIZE\n )\n {\n bytes memory returndata = _safeExecutionManagerInteraction(\n abi.encodeWithSignature(\n \"ovmEXTCODESIZE(address)\",\n _contract\n )\n );\n\n return abi.decode(returndata, (uint256));\n }\n\n /**\n * Performs a safe ovmCHAINID call.\n * @return _CHAINID Result of calling ovmCHAINID.\n */\n function safeCHAINID()\n internal\n returns (\n uint256 _CHAINID\n )\n {\n bytes memory returndata = _safeExecutionManagerInteraction(\n abi.encodeWithSignature(\n \"ovmCHAINID()\"\n )\n );\n\n return abi.decode(returndata, (uint256));\n }\n\n /**\n * Performs a safe ovmCALLER call.\n * @return _CALLER Result of calling ovmCALLER.\n */\n function safeCALLER()\n internal\n returns (\n address _CALLER\n )\n {\n bytes memory returndata = _safeExecutionManagerInteraction(\n abi.encodeWithSignature(\n \"ovmCALLER()\"\n )\n );\n\n return abi.decode(returndata, (address));\n }\n\n /**\n * Performs a safe ovmADDRESS call.\n * @return _ADDRESS Result of calling ovmADDRESS.\n */\n function safeADDRESS()\n internal\n returns (\n address _ADDRESS\n )\n {\n bytes memory returndata = _safeExecutionManagerInteraction(\n abi.encodeWithSignature(\n \"ovmADDRESS()\"\n )\n );\n\n return abi.decode(returndata, (address));\n }\n\n /**\n * Performs a safe ovmGETNONCE call.\n * @return _nonce Result of calling ovmGETNONCE.\n */\n function safeGETNONCE()\n internal\n returns (\n uint256 _nonce\n )\n {\n bytes memory returndata = _safeExecutionManagerInteraction(\n abi.encodeWithSignature(\n \"ovmGETNONCE()\"\n )\n );\n\n return abi.decode(returndata, (uint256));\n }\n\n /**\n * Performs a safe ovmSETNONCE call.\n * @param _nonce New account nonce.\n */\n function safeSETNONCE(\n uint256 _nonce\n )\n internal\n {\n _safeExecutionManagerInteraction(\n abi.encodeWithSignature(\n \"ovmSETNONCE(uint256)\",\n _nonce\n )\n );\n }\n\n /**\n * Performs a safe ovmCREATEEOA call.\n * @param _messageHash Message hash which was signed by EOA\n * @param _v v value of signature (0 or 1)\n * @param _r r value of signature\n * @param _s s value of signature\n */\n function safeCREATEEOA(\n bytes32 _messageHash,\n uint8 _v,\n bytes32 _r,\n bytes32 _s\n )\n internal\n {\n _safeExecutionManagerInteraction(\n abi.encodeWithSignature(\n \"ovmCREATEEOA(bytes32,uint8,bytes32,bytes32)\",\n _messageHash,\n _v,\n _r,\n _s\n )\n );\n }\n\n /**\n * Performs a safe REVERT.\n * @param _reason String revert reason to pass along with the REVERT.\n */\n function safeREVERT(\n string memory _reason\n )\n internal\n {\n _safeExecutionManagerInteraction(\n abi.encodeWithSignature(\n \"ovmREVERT(bytes)\",\n bytes(_reason)\n )\n );\n }\n\n /**\n * Performs a safe \"require\".\n * @param _condition Boolean condition that must be true or will revert.\n * @param _reason String revert reason to pass along with the REVERT.\n */\n function safeREQUIRE(\n bool _condition,\n string memory _reason\n )\n internal\n {\n if (!_condition) {\n safeREVERT(\n _reason\n );\n }\n }\n\n /**\n * Performs a safe ovmSLOAD call.\n */\n function safeSLOAD(\n bytes32 _key\n )\n internal\n returns (\n bytes32\n )\n {\n bytes memory returndata = _safeExecutionManagerInteraction(\n abi.encodeWithSignature(\n \"ovmSLOAD(bytes32)\",\n _key\n )\n );\n\n return abi.decode(returndata, (bytes32));\n }\n\n /**\n * Performs a safe ovmSSTORE call.\n */\n function safeSSTORE(\n bytes32 _key,\n bytes32 _value\n )\n internal\n {\n _safeExecutionManagerInteraction(\n abi.encodeWithSignature(\n \"ovmSSTORE(bytes32,bytes32)\",\n _key,\n _value\n )\n );\n }\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * Performs an ovm interaction and the necessary safety checks.\n * @param _gasLimit Gas limit for the interaction.\n * @param _calldata Data to send to the OVM_ExecutionManager (encoded with sighash).\n * @return _returndata Data sent back by the OVM_ExecutionManager.\n */\n function _safeExecutionManagerInteraction(\n uint256 _gasLimit,\n bytes memory _calldata\n )\n private\n returns (\n bytes memory _returndata\n )\n {\n address ovmExecutionManager = msg.sender;\n (\n bool success,\n bytes memory returndata\n ) = ovmExecutionManager.call{gas: _gasLimit}(_calldata);\n\n if (success == false) {\n assembly {\n revert(add(returndata, 0x20), mload(returndata))\n }\n } else if (returndata.length == 1) {\n assembly {\n return(0, 1)\n }\n } else {\n return returndata;\n }\n }\n\n function _safeExecutionManagerInteraction(\n bytes memory _calldata\n )\n private\n returns (\n bytes memory _returndata\n )\n {\n return _safeExecutionManagerInteraction(\n gasleft(),\n _calldata\n );\n }\n}\n" - }, - "contracts/optimistic-ethereum/OVM/accounts/OVM_ECDSAContractAccount.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.7.0;\npragma experimental ABIEncoderV2;\n\n/* Interface Imports */\nimport { iOVM_ECDSAContractAccount } from \"../../iOVM/accounts/iOVM_ECDSAContractAccount.sol\";\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_ECDSAUtils } from \"../../libraries/utils/Lib_ECDSAUtils.sol\";\nimport { Lib_SafeExecutionManagerWrapper } from \"../../libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\";\nimport { Lib_SafeMathWrapper } from \"../../libraries/wrappers/Lib_SafeMathWrapper.sol\";\n\n/**\n * @title OVM_ECDSAContractAccount\n */\ncontract OVM_ECDSAContractAccount is iOVM_ECDSAContractAccount {\n\n address constant ETH_ERC20_ADDRESS = 0x4200000000000000000000000000000000000006;\n uint256 constant EXECUTION_VALIDATION_GAS_OVERHEAD = 25000; // TODO: should be the amount sufficient to cover the gas costs of all of the transactions up to and including the CALL/CREATE which forms the entrypoint of the transaction.\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Executes a signed transaction.\n * @param _transaction Signed EOA transaction.\n * @param _signatureType Hashing scheme used for the transaction (e.g., ETH signed message).\n * @param _v Signature `v` parameter.\n * @param _r Signature `r` parameter.\n * @param _s Signature `s` parameter.\n * @return _success Whether or not the call returned (rather than reverted).\n * @return _returndata Data returned by the call.\n */\n function execute(\n bytes memory _transaction,\n Lib_OVMCodec.EOASignatureType _signatureType,\n uint8 _v,\n bytes32 _r,\n bytes32 _s\n )\n override\n public\n returns (\n bool _success,\n bytes memory _returndata\n )\n {\n bool isEthSign = _signatureType == Lib_OVMCodec.EOASignatureType.ETH_SIGNED_MESSAGE;\n\n // Address of this contract within the ovm (ovmADDRESS) should be the same as the\n // recovered address of the user who signed this message. This is how we manage to shim\n // account abstraction even though the user isn't a contract.\n // Need to make sure that the transaction nonce is right and bump it if so.\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(\n Lib_ECDSAUtils.recover(\n _transaction,\n isEthSign,\n _v,\n _r,\n _s\n ) == Lib_SafeExecutionManagerWrapper.safeADDRESS(),\n \"Signature provided for EOA transaction execution is invalid.\"\n );\n\n Lib_OVMCodec.EIP155Transaction memory decodedTx = Lib_OVMCodec.decodeEIP155Transaction(_transaction, isEthSign);\n\n // Need to make sure that the transaction chainId is correct.\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(\n decodedTx.chainId == Lib_SafeExecutionManagerWrapper.safeCHAINID(),\n \"Transaction chainId does not match expected OVM chainId.\"\n );\n\n // Need to make sure that the transaction nonce is right.\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(\n decodedTx.nonce == Lib_SafeExecutionManagerWrapper.safeGETNONCE(),\n \"Transaction nonce does not match the expected nonce.\"\n );\n\n // TEMPORARY: Disable gas checks for minnet.\n // // Need to make sure that the gas is sufficient to execute the transaction.\n // Lib_SafeExecutionManagerWrapper.safeREQUIRE(\n // gasleft() >= Lib_SafeMathWrapper.add(decodedTx.gasLimit, EXECUTION_VALIDATION_GAS_OVERHEAD),\n // \"Gas is not sufficient to execute the transaction.\"\n // );\n\n // Transfer fee to relayer.\n address relayer = Lib_SafeExecutionManagerWrapper.safeCALLER();\n uint256 fee = decodedTx.gasLimit * decodedTx.gasPrice;\n (bool success, ) = Lib_SafeExecutionManagerWrapper.safeCALL(\n gasleft(),\n ETH_ERC20_ADDRESS,\n abi.encodeWithSignature(\"transfer(address,uint256)\", relayer, fee)\n );\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(\n success == true,\n \"Fee was not transferred to relayer.\"\n );\n\n // Contract creations are signalled by sending a transaction to the zero address.\n if (decodedTx.to == address(0)) {\n address created = Lib_SafeExecutionManagerWrapper.safeCREATE(\n decodedTx.gasLimit,\n decodedTx.data\n );\n\n // EVM doesn't tell us whether a contract creation failed, even if it reverted during\n // initialization. Always return `true` for our success value here.\n return (true, abi.encode(created));\n } else {\n // We only want to bump the nonce for `ovmCALL` because `ovmCREATE` automatically bumps\n // the nonce of the calling account. Normally an EOA would bump the nonce for both\n // cases, but since this is a contract we'd end up bumping the nonce twice.\n Lib_SafeExecutionManagerWrapper.safeSETNONCE(decodedTx.nonce + 1);\n\n return Lib_SafeExecutionManagerWrapper.safeCALL(\n decodedTx.gasLimit,\n decodedTx.to,\n decodedTx.data\n );\n }\n }\n}\n" - }, - "contracts/optimistic-ethereum/libraries/utils/Lib_ECDSAUtils.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.7.0;\n\n/**\n * @title Lib_ECDSAUtils\n */\nlibrary Lib_ECDSAUtils {\n\n /**************************************\n * Internal Functions: ECDSA Recovery *\n **************************************/\n\n /**\n * Recovers a signed address given a message and signature.\n * @param _message Message that was originally signed.\n * @param _isEthSignedMessage Whether or not the user used the `Ethereum Signed Message` prefix.\n * @param _v Signature `v` parameter.\n * @param _r Signature `r` parameter.\n * @param _s Signature `s` parameter.\n * @return _sender Signer address.\n */\n function recover(\n bytes memory _message,\n bool _isEthSignedMessage,\n uint8 _v,\n bytes32 _r,\n bytes32 _s\n )\n internal\n pure\n returns (\n address _sender\n )\n {\n bytes32 messageHash = getMessageHash(_message, _isEthSignedMessage);\n\n return ecrecover(\n messageHash,\n _v + 27,\n _r,\n _s\n );\n }\n\n function getMessageHash(\n bytes memory _message,\n bool _isEthSignedMessage\n )\n internal\n pure\n returns (bytes32) {\n if (_isEthSignedMessage) {\n return getEthSignedMessageHash(_message);\n }\n return getNativeMessageHash(_message);\n }\n\n\n /*************************************\n * Private Functions: ECDSA Recovery *\n *************************************/\n\n /**\n * Gets the native message hash (simple keccak256) for a message.\n * @param _message Message to hash.\n * @return _messageHash Native message hash.\n */\n function getNativeMessageHash(\n bytes memory _message\n )\n private\n pure\n returns (\n bytes32 _messageHash\n )\n {\n return keccak256(_message);\n }\n\n /**\n * Gets the hash of a message with the `Ethereum Signed Message` prefix.\n * @param _message Message to hash.\n * @return _messageHash Prefixed message hash.\n */\n function getEthSignedMessageHash(\n bytes memory _message\n )\n private\n pure\n returns (\n bytes32 _messageHash\n )\n {\n bytes memory prefix = \"\\x19Ethereum Signed Message:\\n32\";\n bytes32 messageHash = keccak256(_message);\n return keccak256(abi.encodePacked(prefix, messageHash));\n }\n}" - }, - "contracts/optimistic-ethereum/libraries/wrappers/Lib_SafeMathWrapper.sol": { - "content": "// SPDX-License-Identifier: MIT\n// Pulled from @openzeppelin/contracts/math/SafeMath.sol\npragma solidity ^0.7.0;\n\n/* Library Imports */\nimport { Lib_SafeExecutionManagerWrapper } from \"./Lib_SafeExecutionManagerWrapper.sol\";\n\n/**\n * @title Lib_SafeMathWrapper\n */\n\n/**\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\n * checks.\n *\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\n * in bugs, because programmers usually assume that an overflow raises an\n * error, which is the standard behavior in high level programming languages.\n * `SafeMath` restores this intuition by reverting the transaction when an\n * operation overflows.\n *\n * Using this library instead of the unchecked operations eliminates an entire\n * class of bugs, so it's recommended to use it always.\n */\n\nlibrary Lib_SafeMathWrapper {\n /**\n * @dev Returns the addition of two unsigned integers, reverting on\n * overflow.\n *\n * Counterpart to Solidity's `+` operator.\n *\n * Requirements:\n *\n * - Addition cannot overflow.\n */\n function add(uint256 a, uint256 b) internal returns (uint256) {\n uint256 c = a + b;\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(c >= a, \"Lib_SafeMathWrapper: addition overflow\");\n\n return c;\n }\n\n /**\n * @dev Returns the subtraction of two unsigned integers, reverting on\n * overflow (when the result is negative).\n *\n * Counterpart to Solidity's `-` operator.\n *\n * Requirements:\n *\n * - Subtraction cannot overflow.\n */\n function sub(uint256 a, uint256 b) internal returns (uint256) {\n return sub(a, b, \"Lib_SafeMathWrapper: subtraction overflow\");\n }\n\n /**\n * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\n * overflow (when the result is negative).\n *\n * Counterpart to Solidity's `-` operator.\n *\n * Requirements:\n *\n * - Subtraction cannot overflow.\n */\n function sub(uint256 a, uint256 b, string memory errorMessage) internal returns (uint256) {\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(b <= a, errorMessage);\n uint256 c = a - b;\n\n return c;\n }\n\n /**\n * @dev Returns the multiplication of two unsigned integers, reverting on\n * overflow.\n *\n * Counterpart to Solidity's `*` operator.\n *\n * Requirements:\n *\n * - Multiplication cannot overflow.\n */\n function mul(uint256 a, uint256 b) internal returns (uint256) {\n // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\n // benefit is lost if 'b' is also tested.\n // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\n if (a == 0) {\n return 0;\n }\n\n uint256 c = a * b;\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(c / a == b, \"Lib_SafeMathWrapper: multiplication overflow\");\n\n return c;\n }\n\n /**\n * @dev Returns the integer division of two unsigned integers. Reverts on\n * division by zero. The result is rounded towards zero.\n *\n * Counterpart to Solidity's `/` operator. Note: this function uses a\n * `revert` opcode (which leaves remaining gas untouched) while Solidity\n * uses an invalid opcode to revert (consuming all remaining gas).\n *\n * Requirements:\n *\n * - The divisor cannot be zero.\n */\n function div(uint256 a, uint256 b) internal returns (uint256) {\n return div(a, b, \"Lib_SafeMathWrapper: division by zero\");\n }\n\n /**\n * @dev Returns the integer division of two unsigned integers. Reverts with custom message on\n * division by zero. The result is rounded towards zero.\n *\n * Counterpart to Solidity's `/` operator. Note: this function uses a\n * `revert` opcode (which leaves remaining gas untouched) while Solidity\n * uses an invalid opcode to revert (consuming all remaining gas).\n *\n * Requirements:\n *\n * - The divisor cannot be zero.\n */\n function div(uint256 a, uint256 b, string memory errorMessage) internal returns (uint256) {\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(b > 0, errorMessage);\n uint256 c = a / b;\n // assert(a == b * c + a % b); // There is no case in which this doesn't hold\n\n return c;\n }\n\n /**\n * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\n * Reverts when dividing by zero.\n *\n * Counterpart to Solidity's `%` operator. This function uses a `revert`\n * opcode (which leaves remaining gas untouched) while Solidity uses an\n * invalid opcode to revert (consuming all remaining gas).\n *\n * Requirements:\n *\n * - The divisor cannot be zero.\n */\n function mod(uint256 a, uint256 b) internal returns (uint256) {\n return mod(a, b, \"Lib_SafeMathWrapper: modulo by zero\");\n }\n\n /**\n * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\n * Reverts with custom message when dividing by zero.\n *\n * Counterpart to Solidity's `%` operator. This function uses a `revert`\n * opcode (which leaves remaining gas untouched) while Solidity uses an\n * invalid opcode to revert (consuming all remaining gas).\n *\n * Requirements:\n *\n * - The divisor cannot be zero.\n */\n function mod(uint256 a, uint256 b, string memory errorMessage) internal returns (uint256) {\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(b != 0, errorMessage);\n return a % b;\n }\n}" - }, - "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.7.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\nimport { Lib_EthUtils } from \"../../libraries/utils/Lib_EthUtils.sol\";\n\n/* Interface Imports */\nimport { iOVM_ExecutionManager } from \"../../iOVM/execution/iOVM_ExecutionManager.sol\";\nimport { iOVM_StateManager } from \"../../iOVM/execution/iOVM_StateManager.sol\";\nimport { iOVM_SafetyChecker } from \"../../iOVM/execution/iOVM_SafetyChecker.sol\";\n\n/* Contract Imports */\nimport { OVM_ECDSAContractAccount } from \"../accounts/OVM_ECDSAContractAccount.sol\";\nimport { OVM_ProxyEOA } from \"../accounts/OVM_ProxyEOA.sol\";\nimport { OVM_DeployerWhitelist } from \"../precompiles/OVM_DeployerWhitelist.sol\";\n\n/**\n * @title OVM_ExecutionManager\n */\ncontract OVM_ExecutionManager is iOVM_ExecutionManager, Lib_AddressResolver {\n\n /********************************\n * External Contract References *\n ********************************/\n\n iOVM_SafetyChecker internal ovmSafetyChecker;\n iOVM_StateManager internal ovmStateManager;\n\n\n /*******************************\n * Execution Context Variables *\n *******************************/\n\n GasMeterConfig internal gasMeterConfig;\n GlobalContext internal globalContext;\n TransactionContext internal transactionContext;\n MessageContext internal messageContext;\n TransactionRecord internal transactionRecord;\n MessageRecord internal messageRecord;\n\n\n /**************************\n * Gas Metering Constants *\n **************************/\n\n address constant GAS_METADATA_ADDRESS = 0x06a506A506a506A506a506a506A506A506A506A5;\n uint256 constant NUISANCE_GAS_SLOAD = 20000;\n uint256 constant NUISANCE_GAS_SSTORE = 20000;\n uint256 constant MIN_NUISANCE_GAS_PER_CONTRACT = 30000;\n uint256 constant NUISANCE_GAS_PER_CONTRACT_BYTE = 100;\n uint256 constant MIN_GAS_FOR_INVALID_STATE_ACCESS = 30000;\n\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n constructor(\n address _libAddressManager,\n GasMeterConfig memory _gasMeterConfig,\n GlobalContext memory _globalContext\n )\n Lib_AddressResolver(_libAddressManager)\n {\n ovmSafetyChecker = iOVM_SafetyChecker(resolve(\"OVM_SafetyChecker\"));\n gasMeterConfig = _gasMeterConfig;\n globalContext = _globalContext;\n }\n\n\n /**********************\n * Function Modifiers *\n **********************/\n\n /**\n * Applies dynamically-sized refund to a transaction to account for the difference in execution\n * between L1 and L2, so that the overall cost of the ovmOPCODE is fixed.\n * @param _cost Desired gas cost for the function after the refund.\n */\n modifier netGasCost(\n uint256 _cost\n ) {\n uint256 gasProvided = gasleft();\n _;\n uint256 gasUsed = gasProvided - gasleft();\n\n // We want to refund everything *except* the specified cost.\n if (_cost < gasUsed) {\n transactionRecord.ovmGasRefund += gasUsed - _cost;\n }\n }\n\n /**\n * Applies a fixed-size gas refund to a transaction to account for the difference in execution\n * between L1 and L2, so that the overall cost of an ovmOPCODE can be lowered.\n * @param _discount Amount of gas cost to refund for the ovmOPCODE.\n */\n modifier fixedGasDiscount(\n uint256 _discount\n ) {\n uint256 gasProvided = gasleft();\n _;\n uint256 gasUsed = gasProvided - gasleft();\n\n // We want to refund the specified _discount, unless this risks underflow.\n if (_discount < gasUsed) {\n transactionRecord.ovmGasRefund += _discount;\n } else {\n // refund all we can without risking underflow.\n transactionRecord.ovmGasRefund += gasUsed;\n }\n }\n\n /**\n * Makes sure we're not inside a static context.\n */\n modifier notStatic() {\n if (messageContext.isStatic == true) {\n _revertWithFlag(RevertFlag.STATIC_VIOLATION);\n }\n _;\n }\n\n\n /************************************\n * Transaction Execution Entrypoint *\n ************************************/\n\n /**\n * Starts the execution of a transaction via the OVM_ExecutionManager.\n * @param _transaction Transaction data to be executed.\n * @param _ovmStateManager iOVM_StateManager implementation providing account state.\n */\n function run(\n Lib_OVMCodec.Transaction memory _transaction,\n address _ovmStateManager\n )\n override\n public\n {\n require(transactionContext.ovmNUMBER == 0, \"Only be callable at the start of a transaction\");\n // Store our OVM_StateManager instance (significantly easier than attempting to pass the\n // address around in calldata).\n ovmStateManager = iOVM_StateManager(_ovmStateManager);\n\n // Make sure this function can't be called by anyone except the owner of the\n // OVM_StateManager (expected to be an OVM_StateTransitioner). We can revert here because\n // this would make the `run` itself invalid.\n require(\n ovmStateManager.isAuthenticated(msg.sender),\n \"Only authenticated addresses in ovmStateManager can call this function\"\n );\n\n // Initialize the execution context, must be initialized before we perform any gas metering\n // or we'll throw a nuisance gas error.\n _initContext(_transaction);\n\n // TEMPORARY: Gas metering is disabled for minnet.\n // // Check whether we need to start a new epoch, do so if necessary.\n // _checkNeedsNewEpoch(_transaction.timestamp);\n\n // Make sure the transaction's gas limit is valid. We don't revert here because we reserve\n // reverts for INVALID_STATE_ACCESS.\n if (_isValidGasLimit(_transaction.gasLimit, _transaction.l1QueueOrigin) == false) {\n return;\n }\n\n // Check gas right before the call to get total gas consumed by OVM transaction.\n uint256 gasProvided = gasleft();\n\n // Run the transaction, make sure to meter the gas usage.\n ovmCALL(\n _transaction.gasLimit - gasMeterConfig.minTransactionGasLimit,\n _transaction.entrypoint,\n _transaction.data\n );\n uint256 gasUsed = gasProvided - gasleft();\n\n // TEMPORARY: Gas metering is disabled for minnet.\n // // Update the cumulative gas based on the amount of gas used.\n // _updateCumulativeGas(gasUsed, _transaction.l1QueueOrigin);\n\n // Wipe the execution context.\n _resetContext();\n\n // Reset the ovmStateManager.\n ovmStateManager = iOVM_StateManager(address(0));\n }\n\n\n /******************************\n * Opcodes: Execution Context *\n ******************************/\n\n /**\n * @notice Overrides CALLER.\n * @return _CALLER Address of the CALLER within the current message context.\n */\n function ovmCALLER()\n override\n public\n view\n returns (\n address _CALLER\n )\n {\n return messageContext.ovmCALLER;\n }\n\n /**\n * @notice Overrides ADDRESS.\n * @return _ADDRESS Active ADDRESS within the current message context.\n */\n function ovmADDRESS()\n override\n public\n view\n returns (\n address _ADDRESS\n )\n {\n return messageContext.ovmADDRESS;\n }\n\n /**\n * @notice Overrides TIMESTAMP.\n * @return _TIMESTAMP Value of the TIMESTAMP within the transaction context.\n */\n function ovmTIMESTAMP()\n override\n public\n view\n returns (\n uint256 _TIMESTAMP\n )\n {\n return transactionContext.ovmTIMESTAMP;\n }\n\n /**\n * @notice Overrides NUMBER.\n * @return _NUMBER Value of the NUMBER within the transaction context.\n */\n function ovmNUMBER()\n override\n public\n view\n returns (\n uint256 _NUMBER\n )\n {\n return transactionContext.ovmNUMBER;\n }\n\n /**\n * @notice Overrides GASLIMIT.\n * @return _GASLIMIT Value of the block's GASLIMIT within the transaction context.\n */\n function ovmGASLIMIT()\n override\n public\n view\n returns (\n uint256 _GASLIMIT\n )\n {\n return transactionContext.ovmGASLIMIT;\n }\n\n /**\n * @notice Overrides CHAINID.\n * @return _CHAINID Value of the chain's CHAINID within the global context.\n */\n function ovmCHAINID()\n override\n public\n view\n returns (\n uint256 _CHAINID\n )\n {\n return globalContext.ovmCHAINID;\n }\n\n /*********************************\n * Opcodes: L2 Execution Context *\n *********************************/\n\n /**\n * @notice Specifies from which L1 rollup queue this transaction originated from.\n * @return _queueOrigin Address of the ovmL1QUEUEORIGIN within the current message context.\n */\n function ovmL1QUEUEORIGIN()\n override\n public\n view\n returns (\n Lib_OVMCodec.QueueOrigin _queueOrigin\n )\n {\n return transactionContext.ovmL1QUEUEORIGIN;\n }\n\n /**\n * @notice Specifies what L1 EOA, if any, sent this transaction.\n * @return _l1TxOrigin Address of the EOA which send the tx into L2 from L1.\n */\n function ovmL1TXORIGIN()\n override\n public\n view\n returns (\n address _l1TxOrigin\n )\n {\n return transactionContext.ovmL1TXORIGIN;\n }\n\n /********************\n * Opcodes: Halting *\n ********************/\n\n /**\n * @notice Overrides REVERT.\n * @param _data Bytes data to pass along with the REVERT.\n */\n function ovmREVERT(\n bytes memory _data\n )\n override\n public\n {\n _revertWithFlag(RevertFlag.INTENTIONAL_REVERT, _data);\n }\n\n\n /******************************\n * Opcodes: Contract Creation *\n ******************************/\n\n /**\n * @notice Overrides CREATE.\n * @param _bytecode Code to be used to CREATE a new contract.\n * @return _contract Address of the created contract.\n */\n function ovmCREATE(\n bytes memory _bytecode\n )\n override\n public\n notStatic\n fixedGasDiscount(40000)\n returns (\n address _contract\n )\n {\n // Creator is always the current ADDRESS.\n address creator = ovmADDRESS();\n\n // Check that the deployer is whitelisted, or\n // that arbitrary contract deployment has been enabled.\n _checkDeployerAllowed(creator);\n\n // Generate the correct CREATE address.\n address contractAddress = Lib_EthUtils.getAddressForCREATE(\n creator,\n _getAccountNonce(creator)\n );\n\n return _createContract(\n contractAddress,\n _bytecode\n );\n }\n\n /**\n * @notice Overrides CREATE2.\n * @param _bytecode Code to be used to CREATE2 a new contract.\n * @param _salt Value used to determine the contract's address.\n * @return _contract Address of the created contract.\n */\n function ovmCREATE2(\n bytes memory _bytecode,\n bytes32 _salt\n )\n override\n public\n notStatic\n fixedGasDiscount(40000)\n returns (\n address _contract\n )\n {\n // Creator is always the current ADDRESS.\n address creator = ovmADDRESS();\n\n // Check that the deployer is whitelisted, or\n // that arbitrary contract deployment has been enabled.\n _checkDeployerAllowed(creator);\n\n // Generate the correct CREATE2 address.\n address contractAddress = Lib_EthUtils.getAddressForCREATE2(\n creator,\n _bytecode,\n _salt\n );\n\n return _createContract(\n contractAddress,\n _bytecode\n );\n }\n\n\n /*******************************\n * Account Abstraction Opcodes *\n ******************************/\n\n /**\n * Retrieves the nonce of the current ovmADDRESS.\n * @return _nonce Nonce of the current contract.\n */\n function ovmGETNONCE()\n override\n public\n returns (\n uint256 _nonce\n )\n {\n return _getAccountNonce(ovmADDRESS());\n }\n\n /**\n * Sets the nonce of the current ovmADDRESS.\n * @param _nonce New nonce for the current contract.\n */\n function ovmSETNONCE(\n uint256 _nonce\n )\n override\n public\n notStatic\n {\n _setAccountNonce(ovmADDRESS(), _nonce);\n }\n\n /**\n * Creates a new EOA contract account, for account abstraction.\n * @dev Essentially functions like ovmCREATE or ovmCREATE2, but we can bypass a lot of checks\n * because the contract we're creating is trusted (no need to do safety checking or to\n * handle unexpected reverts). Doesn't need to return an address because the address is\n * assumed to be the user's actual address.\n * @param _messageHash Hash of a message signed by some user, for verification.\n * @param _v Signature `v` parameter.\n * @param _r Signature `r` parameter.\n * @param _s Signature `s` parameter.\n */\n function ovmCREATEEOA(\n bytes32 _messageHash,\n uint8 _v,\n bytes32 _r,\n bytes32 _s\n )\n override\n public\n notStatic\n {\n // Recover the EOA address from the message hash and signature parameters. Since we do the\n // hashing in advance, we don't have handle different message hashing schemes. Even if this\n // function were to return the wrong address (rather than explicitly returning the zero\n // address), the rest of the transaction would simply fail (since there's no EOA account to\n // actually execute the transaction).\n address eoa = ecrecover(\n _messageHash,\n _v + 27,\n _r,\n _s\n );\n\n // Invalid signature is a case we proactively handle with a revert. We could alternatively\n // have this function return a `success` boolean, but this is just easier.\n if (eoa == address(0)) {\n ovmREVERT(bytes(\"Signature provided for EOA contract creation is invalid.\"));\n }\n\n // If the user already has an EOA account, then there's no need to perform this operation.\n if (_hasEmptyAccount(eoa) == false) {\n return;\n }\n\n // We always need to initialize the contract with the default account values.\n _initPendingAccount(eoa);\n\n // Temporarily set the current address so it's easier to access on L2.\n address prevADDRESS = messageContext.ovmADDRESS;\n messageContext.ovmADDRESS = eoa;\n\n // Now actually create the account and get its bytecode. We're not worried about reverts\n // (other than out of gas, which we can't capture anyway) because this contract is trusted.\n OVM_ProxyEOA proxyEOA = new OVM_ProxyEOA(0x4200000000000000000000000000000000000003);\n\n // Reset the address now that we're done deploying.\n messageContext.ovmADDRESS = prevADDRESS;\n\n // Commit the account with its final values.\n _commitPendingAccount(\n eoa,\n address(proxyEOA),\n keccak256(Lib_EthUtils.getCode(address(proxyEOA)))\n );\n\n _setAccountNonce(eoa, 0);\n }\n\n\n /*********************************\n * Opcodes: Contract Interaction *\n *********************************/\n\n /**\n * @notice Overrides CALL.\n * @param _gasLimit Amount of gas to be passed into this call.\n * @param _address Address of the contract to call.\n * @param _calldata Data to send along with the call.\n * @return _success Whether or not the call returned (rather than reverted).\n * @return _returndata Data returned by the call.\n */\n function ovmCALL(\n uint256 _gasLimit,\n address _address,\n bytes memory _calldata\n )\n override\n public\n fixedGasDiscount(100000)\n returns (\n bool _success,\n bytes memory _returndata\n )\n {\n // CALL updates the CALLER and ADDRESS.\n MessageContext memory nextMessageContext = messageContext;\n nextMessageContext.ovmCALLER = nextMessageContext.ovmADDRESS;\n nextMessageContext.ovmADDRESS = _address;\n\n return _callContract(\n nextMessageContext,\n _gasLimit,\n _address,\n _calldata\n );\n }\n\n /**\n * @notice Overrides STATICCALL.\n * @param _gasLimit Amount of gas to be passed into this call.\n * @param _address Address of the contract to call.\n * @param _calldata Data to send along with the call.\n * @return _success Whether or not the call returned (rather than reverted).\n * @return _returndata Data returned by the call.\n */\n function ovmSTATICCALL(\n uint256 _gasLimit,\n address _address,\n bytes memory _calldata\n )\n override\n public\n fixedGasDiscount(80000)\n returns (\n bool _success,\n bytes memory _returndata\n )\n {\n // STATICCALL updates the CALLER, updates the ADDRESS, and runs in a static context.\n MessageContext memory nextMessageContext = messageContext;\n nextMessageContext.ovmCALLER = nextMessageContext.ovmADDRESS;\n nextMessageContext.ovmADDRESS = _address;\n nextMessageContext.isStatic = true;\n\n return _callContract(\n nextMessageContext,\n _gasLimit,\n _address,\n _calldata\n );\n }\n\n /**\n * @notice Overrides DELEGATECALL.\n * @param _gasLimit Amount of gas to be passed into this call.\n * @param _address Address of the contract to call.\n * @param _calldata Data to send along with the call.\n * @return _success Whether or not the call returned (rather than reverted).\n * @return _returndata Data returned by the call.\n */\n function ovmDELEGATECALL(\n uint256 _gasLimit,\n address _address,\n bytes memory _calldata\n )\n override\n public\n fixedGasDiscount(40000)\n returns (\n bool _success,\n bytes memory _returndata\n )\n {\n // DELEGATECALL does not change anything about the message context.\n MessageContext memory nextMessageContext = messageContext;\n bool isStaticEntrypoint = false;\n\n return _callContract(\n nextMessageContext,\n _gasLimit,\n _address,\n _calldata\n );\n }\n\n\n /************************************\n * Opcodes: Contract Storage Access *\n ************************************/\n\n /**\n * @notice Overrides SLOAD.\n * @param _key 32 byte key of the storage slot to load.\n * @return _value 32 byte value of the requested storage slot.\n */\n function ovmSLOAD(\n bytes32 _key\n )\n override\n public\n netGasCost(40000)\n returns (\n bytes32 _value\n )\n {\n // We always SLOAD from the storage of ADDRESS.\n address contractAddress = ovmADDRESS();\n\n return _getContractStorage(\n contractAddress,\n _key\n );\n }\n\n /**\n * @notice Overrides SSTORE.\n * @param _key 32 byte key of the storage slot to set.\n * @param _value 32 byte value for the storage slot.\n */\n function ovmSSTORE(\n bytes32 _key,\n bytes32 _value\n )\n override\n public\n notStatic\n netGasCost(60000)\n {\n // We always SSTORE to the storage of ADDRESS.\n address contractAddress = ovmADDRESS();\n\n _putContractStorage(\n contractAddress,\n _key,\n _value\n );\n }\n\n\n /*********************************\n * Opcodes: Contract Code Access *\n *********************************/\n\n /**\n * @notice Overrides EXTCODECOPY.\n * @param _contract Address of the contract to copy code from.\n * @param _offset Offset in bytes from the start of contract code to copy beyond.\n * @param _length Total number of bytes to copy from the contract's code.\n * @return _code Bytes of code copied from the requested contract.\n */\n function ovmEXTCODECOPY(\n address _contract,\n uint256 _offset,\n uint256 _length\n )\n override\n public\n returns (\n bytes memory _code\n )\n {\n // `ovmEXTCODECOPY` is the only overridden opcode capable of producing exactly one byte of\n // return data. By blocking reads of one byte, we're able to use the condition that an\n // OVM_ExecutionManager function return value having a length of exactly one byte indicates\n // an error without an explicit revert. If users were able to read a single byte, they\n // could forcibly trigger behavior that should only be available to this contract.\n uint256 length = _length == 1 ? 2 : _length;\n\n return Lib_EthUtils.getCode(\n _getAccountEthAddress(_contract),\n _offset,\n length\n );\n }\n\n /**\n * @notice Overrides EXTCODESIZE.\n * @param _contract Address of the contract to query the size of.\n * @return _EXTCODESIZE Size of the requested contract in bytes.\n */\n function ovmEXTCODESIZE(\n address _contract\n )\n override\n public\n returns (\n uint256 _EXTCODESIZE\n )\n {\n return Lib_EthUtils.getCodeSize(\n _getAccountEthAddress(_contract)\n );\n }\n\n /**\n * @notice Overrides EXTCODEHASH.\n * @param _contract Address of the contract to query the hash of.\n * @return _EXTCODEHASH Hash of the requested contract.\n */\n function ovmEXTCODEHASH(\n address _contract\n )\n override\n public\n returns (\n bytes32 _EXTCODEHASH\n )\n {\n return Lib_EthUtils.getCodeHash(\n _getAccountEthAddress(_contract)\n );\n }\n\n\n /**************************************\n * Public Functions: Execution Safety *\n **************************************/\n\n /**\n * Performs the logic to create a contract and revert under various potential conditions.\n * @dev This function is implemented as `public` because we need to be able to revert a\n * contract creation without losing information about exactly *why* the contract reverted.\n * In particular, we want to be sure that contracts cannot trigger an INVALID_STATE_ACCESS\n * flag and then revert to reset the flag. We're able to do this by making an external\n * call from `ovmCREATE` and `ovmCREATE2` to `safeCREATE`, which can capture and relay\n * information before reverting.\n * @param _address Address of the contract to associate with the one being created.\n * @param _bytecode Code to be used to create the new contract.\n */\n function safeCREATE(\n address _address,\n bytes memory _bytecode\n )\n override\n public\n {\n // Since this function is public, anyone can attempt to directly call it. We need to make\n // sure that the OVM_ExecutionManager itself is the only party that can actually try to\n // call this function.\n if (msg.sender != address(this)) {\n return;\n }\n\n // We need to be sure that the user isn't trying to use a contract creation to overwrite\n // some existing contract. On L1, users will prove that no contract exists at the address\n // and the OVM_FraudVerifier will populate the code hash of this address with a special\n // value that represents \"known to be an empty account.\"\n if (_hasEmptyAccount(_address) == false) {\n _revertWithFlag(RevertFlag.CREATE_COLLISION);\n }\n\n // Check the creation bytecode against the OVM_SafetyChecker.\n if (ovmSafetyChecker.isBytecodeSafe(_bytecode) == false) {\n _revertWithFlag(RevertFlag.UNSAFE_BYTECODE);\n }\n\n // We always need to initialize the contract with the default account values.\n _initPendingAccount(_address);\n\n // Actually deploy the contract and retrieve its address. This step is hiding a lot of\n // complexity because we need to ensure that contract creation *never* reverts by itself.\n // We cover this partially by storing a revert flag and returning (instead of reverting)\n // when we know that we're inside a contract's creation code.\n address ethAddress = Lib_EthUtils.createContract(_bytecode);\n\n // Contract creation returns the zero address when it fails, which should only be possible\n // if the user intentionally runs out of gas. However, we might still have a bit of gas\n // left over since contract calls can only be passed 63/64ths of total gas, so we need to\n // explicitly handle this case here.\n if (ethAddress == address(0)) {\n _revertWithFlag(RevertFlag.CREATE_EXCEPTION);\n }\n\n // Here we pull out the revert flag that would've been set during creation code. Now that\n // we're out of creation code again, we can just revert normally while passing the flag\n // through the revert data.\n if (messageRecord.revertFlag != RevertFlag.DID_NOT_REVERT) {\n _revertWithFlag(messageRecord.revertFlag);\n }\n\n // Again simply checking that the deployed code is safe too. Contracts can generate\n // arbitrary deployment code, so there's no easy way to analyze this beforehand.\n bytes memory deployedCode = Lib_EthUtils.getCode(ethAddress);\n if (ovmSafetyChecker.isBytecodeSafe(deployedCode) == false) {\n _revertWithFlag(RevertFlag.UNSAFE_BYTECODE);\n }\n\n // Contract creation didn't need to be reverted and the bytecode is safe. We finish up by\n // associating the desired address with the newly created contract's code hash and address.\n _commitPendingAccount(\n _address,\n ethAddress,\n Lib_EthUtils.getCodeHash(ethAddress)\n );\n }\n\n\n /***************************************\n * Public Functions: Execution Context *\n ***************************************/\n\n function getMaxTransactionGasLimit()\n external\n view\n override\n returns (\n uint256 _maxTransactionGasLimit\n )\n {\n return gasMeterConfig.maxTransactionGasLimit;\n }\n\n /********************************************\n * Public Functions: Deployment Witelisting *\n ********************************************/\n\n /**\n * Checks whether the given address is on the whitelst to ovmCREATE/ovmCREATE2, and reverts if not.\n * @param _deployerAddress Address attempting to deploy a contract.\n */\n function _checkDeployerAllowed(\n address _deployerAddress\n )\n internal\n {\n // From an OVM semanitcs perspectibe, this will appear the identical to\n // the deployer ovmCALLing the whitelist. This is fine--in a sense, we are forcing them to.\n (bool success, bytes memory data) = ovmCALL(\n gasleft(),\n 0x4200000000000000000000000000000000000002,\n abi.encodeWithSignature(\"isDeployerAllowed(address)\", _deployerAddress)\n );\n bool isAllowed = abi.decode(data, (bool));\n\n if (!isAllowed || !success) {\n _revertWithFlag(RevertFlag.CREATOR_NOT_ALLOWED);\n } \n }\n\n /********************************************\n * Internal Functions: Contract Interaction *\n ********************************************/\n\n /**\n * Creates a new contract and associates it with some contract address.\n * @param _contractAddress Address to associate the created contract with.\n * @param _bytecode Bytecode to be used to create the contract.\n * @return _created Final OVM contract address.\n */\n function _createContract(\n address _contractAddress,\n bytes memory _bytecode\n )\n internal\n returns (\n address _created\n )\n {\n // We always update the nonce of the creating account, even if the creation fails.\n _setAccountNonce(ovmADDRESS(), _getAccountNonce(ovmADDRESS()) + 1);\n\n // We're stepping into a CREATE or CREATE2, so we need to update ADDRESS to point\n // to the contract's associated address and CALLER to point to the previous ADDRESS.\n MessageContext memory nextMessageContext = messageContext;\n nextMessageContext.ovmCALLER = messageContext.ovmADDRESS;\n nextMessageContext.ovmADDRESS = _contractAddress;\n\n // Run `safeCREATE` in a new EVM message so that our changes can be reflected even if\n // `safeCREATE` reverts.\n (bool _success, ) = _handleExternalInteraction(\n nextMessageContext,\n gasleft(),\n address(this),\n abi.encodeWithSignature(\n \"safeCREATE(address,bytes)\",\n _contractAddress,\n _bytecode\n )\n );\n\n // Need to make sure that this flag is reset so that it isn't propagated to creations in\n // some parent EVM message.\n messageRecord.revertFlag = RevertFlag.DID_NOT_REVERT;\n\n // Yellow paper requires that address returned is zero if the contract deployment fails.\n return _success ? _contractAddress : address(0);\n }\n\n /**\n * Calls the deployed contract associated with a given address.\n * @param _nextMessageContext Message context to be used for the call.\n * @param _gasLimit Amount of gas to be passed into this call.\n * @param _contract OVM address to be called.\n * @param _calldata Data to send along with the call.\n * @return _success Whether or not the call returned (rather than reverted).\n * @return _returndata Data returned by the call.\n */\n function _callContract(\n MessageContext memory _nextMessageContext,\n uint256 _gasLimit,\n address _contract,\n bytes memory _calldata\n )\n internal\n returns (\n bool _success,\n bytes memory _returndata\n )\n {\n // We reserve addresses of the form 0xdeaddeaddead...NNNN for the container contracts in L2 geth.\n // So, we block calls to these addresses since they are not safe to run as an OVM contract itself.\n if (\n (uint256(_contract) & uint256(0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000)) \n == uint256(0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000)\n ) {\n return (true, hex'');\n }\n\n // Both 0x0000... and the EVM precompiles have the same address on L1 and L2 --> no trie lookup needed.\n address codeContractAddress =\n uint(_contract) < 100\n ? _contract\n : _getAccountEthAddress(_contract);\n\n return _handleExternalInteraction(\n _nextMessageContext,\n _gasLimit,\n codeContractAddress,\n _calldata\n );\n }\n\n /**\n * Handles the logic of making an external call and parsing revert information.\n * @param _nextMessageContext Message context to be used for the call.\n * @param _gasLimit Amount of gas to be passed into this call.\n * @param _target Address of the contract to call.\n * @param _data Data to send along with the call.\n * @return _success Whether or not the call returned (rather than reverted).\n * @return _returndata Data returned by the call.\n */\n function _handleExternalInteraction(\n MessageContext memory _nextMessageContext,\n uint256 _gasLimit,\n address _target,\n bytes memory _data\n )\n internal\n returns (\n bool _success,\n bytes memory _returndata\n )\n {\n // We need to switch over to our next message context for the duration of this call.\n MessageContext memory prevMessageContext = messageContext;\n _switchMessageContext(prevMessageContext, _nextMessageContext);\n\n // Nuisance gas is a system used to bound the ability for an attacker to make fraud proofs\n // expensive by touching a lot of different accounts or storage slots. Since most contracts\n // only use a few storage slots during any given transaction, this shouldn't be a limiting\n // factor.\n uint256 prevNuisanceGasLeft = messageRecord.nuisanceGasLeft;\n uint256 nuisanceGasLimit = _getNuisanceGasLimit(_gasLimit);\n messageRecord.nuisanceGasLeft = nuisanceGasLimit;\n\n // Make the call and make sure to pass in the gas limit. Another instance of hidden\n // complexity. `_target` is guaranteed to be a safe contract, meaning its return/revert\n // behavior can be controlled. In particular, we enforce that flags are passed through\n // revert data as to retrieve execution metadata that would normally be reverted out of\n // existence.\n (bool success, bytes memory returndata) = _target.call{gas: _gasLimit}(_data);\n\n // Switch back to the original message context now that we're out of the call.\n _switchMessageContext(_nextMessageContext, prevMessageContext);\n\n // Assuming there were no reverts, the message record should be accurate here. We'll update\n // this value in the case of a revert.\n uint256 nuisanceGasLeft = messageRecord.nuisanceGasLeft;\n\n // Reverts at this point are completely OK, but we need to make a few updates based on the\n // information passed through the revert.\n if (success == false) {\n (\n RevertFlag flag,\n uint256 nuisanceGasLeftPostRevert,\n uint256 ovmGasRefund,\n bytes memory returndataFromFlag\n ) = _decodeRevertData(returndata);\n\n // INVALID_STATE_ACCESS is the only flag that triggers an immediate abort of the\n // parent EVM message. This behavior is necessary because INVALID_STATE_ACCESS must\n // halt any further transaction execution that could impact the execution result.\n if (flag == RevertFlag.INVALID_STATE_ACCESS) {\n _revertWithFlag(flag);\n }\n\n // INTENTIONAL_REVERT, UNSAFE_BYTECODE, STATIC_VIOLATION, and CREATOR_NOT_ALLOWED aren't \n // dependent on the input state, so we can just handle them like standard reverts. Our only change here\n // is to record the gas refund reported by the call (enforced by safety checking).\n if (\n flag == RevertFlag.INTENTIONAL_REVERT\n || flag == RevertFlag.UNSAFE_BYTECODE\n || flag == RevertFlag.STATIC_VIOLATION\n || flag == RevertFlag.CREATOR_NOT_ALLOWED\n ) {\n transactionRecord.ovmGasRefund = ovmGasRefund;\n }\n\n // INTENTIONAL_REVERT needs to pass up the user-provided return data encoded into the\n // flag, *not* the full encoded flag. All other revert types return no data.\n if (flag == RevertFlag.INTENTIONAL_REVERT) {\n returndata = returndataFromFlag;\n } else {\n returndata = hex'';\n }\n\n // Reverts mean we need to use up whatever \"nuisance gas\" was used by the call.\n // EXCEEDS_NUISANCE_GAS explicitly reduces the remaining nuisance gas for this message\n // to zero. OUT_OF_GAS is a \"pseudo\" flag given that messages return no data when they\n // run out of gas, so we have to treat this like EXCEEDS_NUISANCE_GAS. All other flags\n // will simply pass up the remaining nuisance gas.\n nuisanceGasLeft = nuisanceGasLeftPostRevert;\n }\n\n // We need to reset the nuisance gas back to its original value minus the amount used here.\n messageRecord.nuisanceGasLeft = prevNuisanceGasLeft - (nuisanceGasLimit - nuisanceGasLeft);\n\n return (\n success,\n returndata\n );\n }\n\n\n /******************************************\n * Internal Functions: State Manipulation *\n ******************************************/\n\n /**\n * Checks whether an account exists within the OVM_StateManager.\n * @param _address Address of the account to check.\n * @return _exists Whether or not the account exists.\n */\n function _hasAccount(\n address _address\n )\n internal\n returns (\n bool _exists\n )\n {\n _checkAccountLoad(_address);\n return ovmStateManager.hasAccount(_address);\n }\n\n /**\n * Checks whether a known empty account exists within the OVM_StateManager.\n * @param _address Address of the account to check.\n * @return _exists Whether or not the account empty exists.\n */\n function _hasEmptyAccount(\n address _address\n )\n internal\n returns (\n bool _exists\n )\n {\n _checkAccountLoad(_address);\n return ovmStateManager.hasEmptyAccount(_address);\n }\n\n /**\n * Sets the nonce of an account.\n * @param _address Address of the account to modify.\n * @param _nonce New account nonce.\n */\n function _setAccountNonce(\n address _address,\n uint256 _nonce\n )\n internal\n {\n _checkAccountChange(_address);\n ovmStateManager.setAccountNonce(_address, _nonce);\n }\n\n /**\n * Gets the nonce of an account.\n * @param _address Address of the account to access.\n * @return _nonce Nonce of the account.\n */\n function _getAccountNonce(\n address _address\n )\n internal\n returns (\n uint256 _nonce\n )\n {\n _checkAccountLoad(_address);\n return ovmStateManager.getAccountNonce(_address);\n }\n\n /**\n * Retrieves the Ethereum address of an account.\n * @param _address Address of the account to access.\n * @return _ethAddress Corresponding Ethereum address.\n */\n function _getAccountEthAddress(\n address _address\n )\n internal\n returns (\n address _ethAddress\n )\n {\n _checkAccountLoad(_address);\n return ovmStateManager.getAccountEthAddress(_address);\n }\n\n /**\n * Creates the default account object for the given address.\n * @param _address Address of the account create.\n */\n function _initPendingAccount(\n address _address\n )\n internal\n {\n // Although it seems like `_checkAccountChange` would be more appropriate here, we don't\n // actually consider an account \"changed\" until it's inserted into the state (in this case\n // by `_commitPendingAccount`).\n _checkAccountLoad(_address);\n ovmStateManager.initPendingAccount(_address);\n }\n\n /**\n * Stores additional relevant data for a new account, thereby \"committing\" it to the state.\n * This function is only called during `ovmCREATE` and `ovmCREATE2` after a successful contract\n * creation.\n * @param _address Address of the account to commit.\n * @param _ethAddress Address of the associated deployed contract.\n * @param _codeHash Hash of the code stored at the address.\n */\n function _commitPendingAccount(\n address _address,\n address _ethAddress,\n bytes32 _codeHash\n )\n internal\n {\n _checkAccountChange(_address);\n ovmStateManager.commitPendingAccount(\n _address,\n _ethAddress,\n _codeHash\n );\n }\n\n /**\n * Retrieves the value of a storage slot.\n * @param _contract Address of the contract to query.\n * @param _key 32 byte key of the storage slot.\n * @return _value 32 byte storage slot value.\n */\n function _getContractStorage(\n address _contract,\n bytes32 _key\n )\n internal\n returns (\n bytes32 _value\n )\n {\n _checkContractStorageLoad(_contract, _key);\n return ovmStateManager.getContractStorage(_contract, _key);\n }\n\n /**\n * Sets the value of a storage slot.\n * @param _contract Address of the contract to modify.\n * @param _key 32 byte key of the storage slot.\n * @param _value 32 byte storage slot value.\n */\n function _putContractStorage(\n address _contract,\n bytes32 _key,\n bytes32 _value\n )\n internal\n {\n // We don't set storage if the value didn't change. Although this acts as a convenient\n // optimization, it's also necessary to avoid the case in which a contract with no storage\n // attempts to store the value \"0\" at any key. Putting this value (and therefore requiring\n // that the value be committed into the storage trie after execution) would incorrectly\n // modify the storage root.\n if (_getContractStorage(_contract, _key) == _value) {\n return;\n }\n\n _checkContractStorageChange(_contract, _key);\n ovmStateManager.putContractStorage(_contract, _key, _value);\n }\n\n /**\n * Validation whenever a contract needs to be loaded. Checks that the account exists, charges\n * nuisance gas if the account hasn't been loaded before.\n * @param _address Address of the account to load.\n */\n function _checkAccountLoad(\n address _address\n )\n internal\n {\n // See `_checkContractStorageLoad` for more information.\n if (gasleft() < MIN_GAS_FOR_INVALID_STATE_ACCESS) {\n _revertWithFlag(RevertFlag.OUT_OF_GAS);\n }\n\n // See `_checkContractStorageLoad` for more information.\n if (ovmStateManager.hasAccount(_address) == false) {\n _revertWithFlag(RevertFlag.INVALID_STATE_ACCESS);\n }\n\n // Check whether the account has been loaded before and mark it as loaded if not. We need\n // this because \"nuisance gas\" only applies to the first time that an account is loaded.\n (\n bool _wasAccountAlreadyLoaded\n ) = ovmStateManager.testAndSetAccountLoaded(_address);\n\n // If we hadn't already loaded the account, then we'll need to charge \"nuisance gas\" based\n // on the size of the contract code.\n if (_wasAccountAlreadyLoaded == false) {\n _useNuisanceGas(\n (Lib_EthUtils.getCodeSize(_getAccountEthAddress(_address)) * NUISANCE_GAS_PER_CONTRACT_BYTE) + MIN_NUISANCE_GAS_PER_CONTRACT\n );\n }\n }\n\n /**\n * Validation whenever a contract needs to be changed. Checks that the account exists, charges\n * nuisance gas if the account hasn't been changed before.\n * @param _address Address of the account to change.\n */\n function _checkAccountChange(\n address _address\n )\n internal\n {\n // Start by checking for a load as we only want to charge nuisance gas proportional to\n // contract size once.\n _checkAccountLoad(_address);\n\n // Check whether the account has been changed before and mark it as changed if not. We need\n // this because \"nuisance gas\" only applies to the first time that an account is changed.\n (\n bool _wasAccountAlreadyChanged\n ) = ovmStateManager.testAndSetAccountChanged(_address);\n\n // If we hadn't already loaded the account, then we'll need to charge \"nuisance gas\" based\n // on the size of the contract code.\n if (_wasAccountAlreadyChanged == false) {\n ovmStateManager.incrementTotalUncommittedAccounts();\n _useNuisanceGas(\n (Lib_EthUtils.getCodeSize(_getAccountEthAddress(_address)) * NUISANCE_GAS_PER_CONTRACT_BYTE) + MIN_NUISANCE_GAS_PER_CONTRACT\n );\n }\n }\n\n /**\n * Validation whenever a slot needs to be loaded. Checks that the account exists, charges\n * nuisance gas if the slot hasn't been loaded before.\n * @param _contract Address of the account to load from.\n * @param _key 32 byte key to load.\n */\n function _checkContractStorageLoad(\n address _contract,\n bytes32 _key\n )\n internal\n {\n // Another case of hidden complexity. If we didn't enforce this requirement, then a\n // contract could pass in just enough gas to cause the INVALID_STATE_ACCESS check to fail\n // on L1 but not on L2. A contract could use this behavior to prevent the\n // OVM_ExecutionManager from detecting an invalid state access. Reverting with OUT_OF_GAS\n // allows us to also charge for the full message nuisance gas, because you deserve that for\n // trying to break the contract in this way.\n if (gasleft() < MIN_GAS_FOR_INVALID_STATE_ACCESS) {\n _revertWithFlag(RevertFlag.OUT_OF_GAS);\n }\n\n // We need to make sure that the transaction isn't trying to access storage that hasn't\n // been provided to the OVM_StateManager. We'll immediately abort if this is the case.\n // We know that we have enough gas to do this check because of the above test.\n if (ovmStateManager.hasContractStorage(_contract, _key) == false) {\n _revertWithFlag(RevertFlag.INVALID_STATE_ACCESS);\n }\n\n // Check whether the slot has been loaded before and mark it as loaded if not. We need\n // this because \"nuisance gas\" only applies to the first time that a slot is loaded.\n (\n bool _wasContractStorageAlreadyLoaded\n ) = ovmStateManager.testAndSetContractStorageLoaded(_contract, _key);\n\n // If we hadn't already loaded the account, then we'll need to charge some fixed amount of\n // \"nuisance gas\".\n if (_wasContractStorageAlreadyLoaded == false) {\n _useNuisanceGas(NUISANCE_GAS_SLOAD);\n }\n }\n\n /**\n * Validation whenever a slot needs to be changed. Checks that the account exists, charges\n * nuisance gas if the slot hasn't been changed before.\n * @param _contract Address of the account to change.\n * @param _key 32 byte key to change.\n */\n function _checkContractStorageChange(\n address _contract,\n bytes32 _key\n )\n internal\n {\n // Start by checking for load to make sure we have the storage slot and that we charge the\n // \"nuisance gas\" necessary to prove the storage slot state.\n _checkContractStorageLoad(_contract, _key);\n\n // Check whether the slot has been changed before and mark it as changed if not. We need\n // this because \"nuisance gas\" only applies to the first time that a slot is changed.\n (\n bool _wasContractStorageAlreadyChanged\n ) = ovmStateManager.testAndSetContractStorageChanged(_contract, _key);\n\n // If we hadn't already changed the account, then we'll need to charge some fixed amount of\n // \"nuisance gas\".\n if (_wasContractStorageAlreadyChanged == false) {\n // Changing a storage slot means that we're also going to have to change the\n // corresponding account, so do an account change check.\n _checkAccountChange(_contract);\n\n ovmStateManager.incrementTotalUncommittedContractStorage();\n _useNuisanceGas(NUISANCE_GAS_SSTORE);\n }\n }\n\n\n /************************************\n * Internal Functions: Revert Logic *\n ************************************/\n\n /**\n * Simple encoding for revert data.\n * @param _flag Flag to revert with.\n * @param _data Additional user-provided revert data.\n * @return _revertdata Encoded revert data.\n */\n function _encodeRevertData(\n RevertFlag _flag,\n bytes memory _data\n )\n internal\n view\n returns (\n bytes memory _revertdata\n )\n {\n // Out of gas and create exceptions will fundamentally return no data, so simulating it shouldn't either.\n if (\n _flag == RevertFlag.OUT_OF_GAS\n || _flag == RevertFlag.CREATE_EXCEPTION\n ) {\n return bytes('');\n }\n\n // INVALID_STATE_ACCESS doesn't need to return any data other than the flag.\n if (_flag == RevertFlag.INVALID_STATE_ACCESS) {\n return abi.encode(\n _flag,\n 0,\n 0,\n bytes('')\n );\n }\n\n // Just ABI encode the rest of the parameters.\n return abi.encode(\n _flag,\n messageRecord.nuisanceGasLeft,\n transactionRecord.ovmGasRefund,\n _data\n );\n }\n\n /**\n * Simple decoding for revert data.\n * @param _revertdata Revert data to decode.\n * @return _flag Flag used to revert.\n * @return _nuisanceGasLeft Amount of nuisance gas unused by the message.\n * @return _ovmGasRefund Amount of gas refunded during the message.\n * @return _data Additional user-provided revert data.\n */\n function _decodeRevertData(\n bytes memory _revertdata\n )\n internal\n pure\n returns (\n RevertFlag _flag,\n uint256 _nuisanceGasLeft,\n uint256 _ovmGasRefund,\n bytes memory _data\n )\n {\n // A length of zero means the call ran out of gas, just return empty data.\n if (_revertdata.length == 0) {\n return (\n RevertFlag.OUT_OF_GAS,\n 0,\n 0,\n bytes('')\n );\n }\n\n // ABI decode the incoming data.\n return abi.decode(_revertdata, (RevertFlag, uint256, uint256, bytes));\n }\n\n /**\n * Causes a message to revert or abort.\n * @param _flag Flag to revert with.\n * @param _data Additional user-provided data.\n */\n function _revertWithFlag(\n RevertFlag _flag,\n bytes memory _data\n )\n internal\n {\n // We don't want to revert when we're inside a CREATE or CREATE2, because those opcodes\n // fail silently (we can't pass any data upwards). Instead, we set a flag and return a\n // *single* byte, something the OVM_ExecutionManager will not return in any other case.\n // We're thereby allowed to communicate failure without allowing contracts to trick us into\n // thinking there was a failure.\n bool isCreation;\n assembly {\n isCreation := eq(extcodesize(caller()), 0)\n }\n\n if (isCreation) {\n messageRecord.revertFlag = _flag;\n\n assembly {\n return(0, 1)\n }\n }\n\n // If we're not inside a CREATE or CREATE2, we can simply encode the necessary data and\n // revert normally.\n bytes memory revertdata = _encodeRevertData(\n _flag,\n _data\n );\n\n assembly {\n revert(add(revertdata, 0x20), mload(revertdata))\n }\n }\n\n /**\n * Causes a message to revert or abort.\n * @param _flag Flag to revert with.\n */\n function _revertWithFlag(\n RevertFlag _flag\n )\n internal\n {\n _revertWithFlag(_flag, bytes(''));\n }\n\n\n /******************************************\n * Internal Functions: Nuisance Gas Logic *\n ******************************************/\n\n /**\n * Computes the nuisance gas limit from the gas limit.\n * @dev This function is currently using a naive implementation whereby the nuisance gas limit\n * is set to exactly equal the lesser of the gas limit or remaining gas. It's likely that\n * this implementation is perfectly fine, but we may change this formula later.\n * @param _gasLimit Gas limit to compute from.\n * @return _nuisanceGasLimit Computed nuisance gas limit.\n */\n function _getNuisanceGasLimit(\n uint256 _gasLimit\n )\n internal\n view\n returns (\n uint256 _nuisanceGasLimit\n )\n {\n return _gasLimit < gasleft() ? _gasLimit : gasleft();\n }\n\n /**\n * Uses a certain amount of nuisance gas.\n * @param _amount Amount of nuisance gas to use.\n */\n function _useNuisanceGas(\n uint256 _amount\n )\n internal\n {\n // Essentially the same as a standard OUT_OF_GAS, except we also retain a record of the gas\n // refund to be given at the end of the transaction.\n if (messageRecord.nuisanceGasLeft < _amount) {\n _revertWithFlag(RevertFlag.EXCEEDS_NUISANCE_GAS);\n }\n\n messageRecord.nuisanceGasLeft -= _amount;\n }\n\n\n /************************************\n * Internal Functions: Gas Metering *\n ************************************/\n\n /**\n * Checks whether a transaction needs to start a new epoch and does so if necessary.\n * @param _timestamp Transaction timestamp.\n */\n function _checkNeedsNewEpoch(\n uint256 _timestamp\n )\n internal\n {\n if (\n _timestamp >= (\n _getGasMetadata(GasMetadataKey.CURRENT_EPOCH_START_TIMESTAMP)\n + gasMeterConfig.secondsPerEpoch\n )\n ) {\n _putGasMetadata(\n GasMetadataKey.CURRENT_EPOCH_START_TIMESTAMP,\n _timestamp\n );\n\n _putGasMetadata(\n GasMetadataKey.PREV_EPOCH_SEQUENCER_QUEUE_GAS,\n _getGasMetadata(\n GasMetadataKey.CUMULATIVE_SEQUENCER_QUEUE_GAS\n )\n );\n\n _putGasMetadata(\n GasMetadataKey.PREV_EPOCH_L1TOL2_QUEUE_GAS,\n _getGasMetadata(\n GasMetadataKey.CUMULATIVE_L1TOL2_QUEUE_GAS\n )\n );\n }\n }\n\n /**\n * Validates the gas limit for a given transaction.\n * @param _gasLimit Gas limit provided by the transaction.\n * @param _queueOrigin Queue from which the transaction originated.\n * @return _valid Whether or not the gas limit is valid.\n */\n function _isValidGasLimit(\n uint256 _gasLimit,\n Lib_OVMCodec.QueueOrigin _queueOrigin\n )\n internal\n returns (\n bool _valid\n )\n {\n // Always have to be below the maximum gas limit.\n if (_gasLimit > gasMeterConfig.maxTransactionGasLimit) {\n return false;\n }\n\n // Always have to be above the minimum gas limit.\n if (_gasLimit < gasMeterConfig.minTransactionGasLimit) {\n return false;\n }\n\n // TEMPORARY: Gas metering is disabled for minnet.\n return true;\n // GasMetadataKey cumulativeGasKey;\n // GasMetadataKey prevEpochGasKey;\n // if (_queueOrigin == Lib_OVMCodec.QueueOrigin.SEQUENCER_QUEUE) {\n // cumulativeGasKey = GasMetadataKey.CUMULATIVE_SEQUENCER_QUEUE_GAS;\n // prevEpochGasKey = GasMetadataKey.PREV_EPOCH_SEQUENCER_QUEUE_GAS;\n // } else {\n // cumulativeGasKey = GasMetadataKey.CUMULATIVE_L1TOL2_QUEUE_GAS;\n // prevEpochGasKey = GasMetadataKey.PREV_EPOCH_L1TOL2_QUEUE_GAS;\n // }\n\n // return (\n // (\n // _getGasMetadata(cumulativeGasKey)\n // - _getGasMetadata(prevEpochGasKey)\n // + _gasLimit\n // ) < gasMeterConfig.maxGasPerQueuePerEpoch\n // );\n }\n\n /**\n * Updates the cumulative gas after a transaction.\n * @param _gasUsed Gas used by the transaction.\n * @param _queueOrigin Queue from which the transaction originated.\n */\n function _updateCumulativeGas(\n uint256 _gasUsed,\n Lib_OVMCodec.QueueOrigin _queueOrigin\n )\n internal\n {\n GasMetadataKey cumulativeGasKey;\n if (_queueOrigin == Lib_OVMCodec.QueueOrigin.SEQUENCER_QUEUE) {\n cumulativeGasKey = GasMetadataKey.CUMULATIVE_SEQUENCER_QUEUE_GAS;\n } else {\n cumulativeGasKey = GasMetadataKey.CUMULATIVE_L1TOL2_QUEUE_GAS;\n }\n\n _putGasMetadata(\n cumulativeGasKey,\n (\n _getGasMetadata(cumulativeGasKey)\n + gasMeterConfig.minTransactionGasLimit\n + _gasUsed\n - transactionRecord.ovmGasRefund\n )\n );\n }\n\n /**\n * Retrieves the value of a gas metadata key.\n * @param _key Gas metadata key to retrieve.\n * @return _value Value stored at the given key.\n */\n function _getGasMetadata(\n GasMetadataKey _key\n )\n internal\n returns (\n uint256 _value\n )\n {\n return uint256(_getContractStorage(\n GAS_METADATA_ADDRESS,\n bytes32(uint256(_key))\n ));\n }\n\n /**\n * Sets the value of a gas metadata key.\n * @param _key Gas metadata key to set.\n * @param _value Value to store at the given key.\n */\n function _putGasMetadata(\n GasMetadataKey _key,\n uint256 _value\n )\n internal\n {\n _putContractStorage(\n GAS_METADATA_ADDRESS,\n bytes32(uint256(_key)),\n bytes32(uint256(_value))\n );\n }\n\n\n /*****************************************\n * Internal Functions: Execution Context *\n *****************************************/\n\n /**\n * Swaps over to a new message context.\n * @param _prevMessageContext Context we're switching from.\n * @param _nextMessageContext Context we're switching to.\n */\n function _switchMessageContext(\n MessageContext memory _prevMessageContext,\n MessageContext memory _nextMessageContext\n )\n internal\n {\n // Avoid unnecessary the SSTORE.\n if (_prevMessageContext.ovmCALLER != _nextMessageContext.ovmCALLER) {\n messageContext.ovmCALLER = _nextMessageContext.ovmCALLER;\n }\n\n // Avoid unnecessary the SSTORE.\n if (_prevMessageContext.ovmADDRESS != _nextMessageContext.ovmADDRESS) {\n messageContext.ovmADDRESS = _nextMessageContext.ovmADDRESS;\n }\n\n // Avoid unnecessary the SSTORE.\n if (_prevMessageContext.isStatic != _nextMessageContext.isStatic) {\n messageContext.isStatic = _nextMessageContext.isStatic;\n }\n }\n\n /**\n * Initializes the execution context.\n * @param _transaction OVM transaction being executed.\n */\n function _initContext(\n Lib_OVMCodec.Transaction memory _transaction\n )\n internal\n {\n transactionContext.ovmTIMESTAMP = _transaction.timestamp;\n transactionContext.ovmNUMBER = _transaction.blockNumber;\n transactionContext.ovmTXGASLIMIT = _transaction.gasLimit;\n transactionContext.ovmL1QUEUEORIGIN = _transaction.l1QueueOrigin;\n transactionContext.ovmL1TXORIGIN = _transaction.l1TxOrigin;\n transactionContext.ovmGASLIMIT = gasMeterConfig.maxGasPerQueuePerEpoch;\n\n messageRecord.nuisanceGasLeft = _getNuisanceGasLimit(_transaction.gasLimit);\n }\n\n /**\n * Resets the transaction and message context.\n */\n function _resetContext()\n internal\n {\n transactionContext.ovmL1TXORIGIN = address(0);\n transactionContext.ovmTIMESTAMP = 0;\n transactionContext.ovmNUMBER = 0;\n transactionContext.ovmGASLIMIT = 0;\n transactionContext.ovmTXGASLIMIT = 0;\n transactionContext.ovmL1QUEUEORIGIN = Lib_OVMCodec.QueueOrigin.SEQUENCER_QUEUE;\n\n transactionRecord.ovmGasRefund = 0;\n\n messageContext.ovmCALLER = address(0);\n messageContext.ovmADDRESS = address(0);\n messageContext.isStatic = false;\n\n messageRecord.nuisanceGasLeft = 0;\n messageRecord.revertFlag = RevertFlag.DID_NOT_REVERT;\n }\n}\n" - }, - "contracts/optimistic-ethereum/libraries/resolver/Lib_AddressResolver.sol": { - "content": "// SPDX-License-Identifier: MIT\n// +build ovm\npragma solidity >0.5.0 <0.8.0;\n\n/* Library Imports */\nimport { Lib_AddressManager } from \"./Lib_AddressManager.sol\";\n\n/**\n * @title Lib_AddressResolver\n */\ncontract Lib_AddressResolver {\n\n /*******************************************\n * Contract Variables: Contract References *\n *******************************************/\n\n Lib_AddressManager internal libAddressManager;\n\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Lib_AddressManager.\n */\n constructor(\n address _libAddressManager\n ) public {\n libAddressManager = Lib_AddressManager(_libAddressManager);\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n function resolve(\n string memory _name\n )\n public\n view\n returns (\n address _contract\n )\n {\n return libAddressManager.getAddress(_name);\n }\n}\n" - }, - "contracts/optimistic-ethereum/libraries/utils/Lib_EthUtils.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.7.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_RLPWriter } from \"../rlp/Lib_RLPWriter.sol\";\nimport { Lib_Bytes32Utils } from \"./Lib_Bytes32Utils.sol\";\n\n/**\n * @title Lib_EthUtils\n */\nlibrary Lib_EthUtils {\n\n /***********************************\n * Internal Functions: Code Access *\n ***********************************/\n\n /**\n * Gets the code for a given address.\n * @param _address Address to get code for.\n * @param _offset Offset to start reading from.\n * @param _length Number of bytes to read.\n * @return _code Code read from the contract.\n */\n function getCode(\n address _address,\n uint256 _offset,\n uint256 _length\n )\n internal\n view\n returns (\n bytes memory _code\n )\n {\n assembly {\n _code := mload(0x40)\n mstore(0x40, add(_code, add(_length, 0x20)))\n mstore(_code, _length)\n extcodecopy(_address, add(_code, 0x20), _offset, _length)\n }\n\n return _code;\n }\n\n /**\n * Gets the full code for a given address.\n * @param _address Address to get code for.\n * @return _code Full code of the contract.\n */\n function getCode(\n address _address\n )\n internal\n view\n returns (\n bytes memory _code\n )\n {\n return getCode(\n _address,\n 0,\n getCodeSize(_address)\n );\n }\n\n /**\n * Gets the size of a contract's code in bytes.\n * @param _address Address to get code size for.\n * @return _codeSize Size of the contract's code in bytes.\n */\n function getCodeSize(\n address _address\n )\n internal\n view\n returns (\n uint256 _codeSize\n )\n {\n assembly {\n _codeSize := extcodesize(_address)\n }\n\n return _codeSize;\n }\n\n /**\n * Gets the hash of a contract's code.\n * @param _address Address to get a code hash for.\n * @return _codeHash Hash of the contract's code.\n */\n function getCodeHash(\n address _address\n )\n internal\n view\n returns (\n bytes32 _codeHash\n )\n {\n assembly {\n _codeHash := extcodehash(_address)\n }\n\n return _codeHash;\n }\n\n\n /*****************************************\n * Internal Functions: Contract Creation *\n *****************************************/\n\n /**\n * Creates a contract with some given initialization code.\n * @param _code Contract initialization code.\n * @return _created Address of the created contract.\n */\n function createContract(\n bytes memory _code\n )\n internal\n returns (\n address _created\n )\n {\n assembly {\n _created := create(\n 0,\n add(_code, 0x20),\n mload(_code)\n )\n }\n\n return _created;\n }\n\n /**\n * Computes the address that would be generated by CREATE.\n * @param _creator Address creating the contract.\n * @param _nonce Creator's nonce.\n * @return _address Address to be generated by CREATE.\n */\n function getAddressForCREATE(\n address _creator,\n uint256 _nonce\n )\n internal\n pure\n returns (\n address _address\n )\n {\n bytes[] memory encoded = new bytes[](2);\n encoded[0] = Lib_RLPWriter.writeAddress(_creator);\n encoded[1] = Lib_RLPWriter.writeUint(_nonce);\n\n bytes memory encodedList = Lib_RLPWriter.writeList(encoded);\n return Lib_Bytes32Utils.toAddress(keccak256(encodedList));\n }\n\n /**\n * Computes the address that would be generated by CREATE2.\n * @param _creator Address creating the contract.\n * @param _bytecode Bytecode of the contract to be created.\n * @param _salt 32 byte salt value mixed into the hash.\n * @return _address Address to be generated by CREATE2.\n */\n function getAddressForCREATE2(\n address _creator,\n bytes memory _bytecode,\n bytes32 _salt\n )\n internal\n pure\n returns (address _address)\n {\n bytes32 hashedData = keccak256(abi.encodePacked(\n byte(0xff),\n _creator,\n _salt,\n keccak256(_bytecode)\n ));\n\n return Lib_Bytes32Utils.toAddress(hashedData);\n }\n}\n" - }, - "contracts/optimistic-ethereum/iOVM/execution/iOVM_ExecutionManager.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\ninterface iOVM_ExecutionManager {\n /**********\n * Enums *\n *********/\n\n enum RevertFlag {\n DID_NOT_REVERT,\n OUT_OF_GAS,\n INTENTIONAL_REVERT,\n EXCEEDS_NUISANCE_GAS,\n INVALID_STATE_ACCESS,\n UNSAFE_BYTECODE,\n CREATE_COLLISION,\n STATIC_VIOLATION,\n CREATE_EXCEPTION,\n CREATOR_NOT_ALLOWED\n }\n\n enum GasMetadataKey {\n CURRENT_EPOCH_START_TIMESTAMP,\n CUMULATIVE_SEQUENCER_QUEUE_GAS,\n CUMULATIVE_L1TOL2_QUEUE_GAS,\n PREV_EPOCH_SEQUENCER_QUEUE_GAS,\n PREV_EPOCH_L1TOL2_QUEUE_GAS\n }\n\n /***********\n * Structs *\n ***********/\n\n struct GasMeterConfig {\n uint256 minTransactionGasLimit;\n uint256 maxTransactionGasLimit;\n uint256 maxGasPerQueuePerEpoch;\n uint256 secondsPerEpoch;\n }\n\n struct GlobalContext {\n uint256 ovmCHAINID;\n }\n\n struct TransactionContext {\n Lib_OVMCodec.QueueOrigin ovmL1QUEUEORIGIN;\n uint256 ovmTIMESTAMP;\n uint256 ovmNUMBER;\n uint256 ovmGASLIMIT;\n uint256 ovmTXGASLIMIT;\n address ovmL1TXORIGIN;\n }\n\n struct TransactionRecord {\n uint256 ovmGasRefund;\n }\n\n struct MessageContext {\n address ovmCALLER;\n address ovmADDRESS;\n bool isStatic;\n }\n\n struct MessageRecord {\n uint256 nuisanceGasLeft;\n RevertFlag revertFlag;\n }\n\n\n /************************************\n * Transaction Execution Entrypoint *\n ************************************/\n\n function run(\n Lib_OVMCodec.Transaction calldata _transaction,\n address _txStateManager\n ) external;\n\n\n /*******************\n * Context Opcodes *\n *******************/\n\n function ovmCALLER() external view returns (address _caller);\n function ovmADDRESS() external view returns (address _address);\n function ovmTIMESTAMP() external view returns (uint256 _timestamp);\n function ovmNUMBER() external view returns (uint256 _number);\n function ovmGASLIMIT() external view returns (uint256 _gasLimit);\n function ovmCHAINID() external view returns (uint256 _chainId);\n\n\n /**********************\n * L2 Context Opcodes *\n **********************/\n\n function ovmL1QUEUEORIGIN() external view returns (Lib_OVMCodec.QueueOrigin _queueOrigin);\n function ovmL1TXORIGIN() external view returns (address _l1TxOrigin);\n\n\n /*******************\n * Halting Opcodes *\n *******************/\n\n function ovmREVERT(bytes memory _data) external;\n\n\n /*****************************\n * Contract Creation Opcodes *\n *****************************/\n\n function ovmCREATE(bytes memory _bytecode) external returns (address _contract);\n function ovmCREATE2(bytes memory _bytecode, bytes32 _salt) external returns (address _contract);\n\n\n /*******************************\n * Account Abstraction Opcodes *\n ******************************/\n\n function ovmGETNONCE() external returns (uint256 _nonce);\n function ovmSETNONCE(uint256 _nonce) external;\n function ovmCREATEEOA(bytes32 _messageHash, uint8 _v, bytes32 _r, bytes32 _s) external;\n\n\n /****************************\n * Contract Calling Opcodes *\n ****************************/\n\n function ovmCALL(uint256 _gasLimit, address _address, bytes memory _calldata) external returns (bool _success, bytes memory _returndata);\n function ovmSTATICCALL(uint256 _gasLimit, address _address, bytes memory _calldata) external returns (bool _success, bytes memory _returndata);\n function ovmDELEGATECALL(uint256 _gasLimit, address _address, bytes memory _calldata) external returns (bool _success, bytes memory _returndata);\n\n\n /****************************\n * Contract Storage Opcodes *\n ****************************/\n\n function ovmSLOAD(bytes32 _key) external returns (bytes32 _value);\n function ovmSSTORE(bytes32 _key, bytes32 _value) external;\n\n\n /*************************\n * Contract Code Opcodes *\n *************************/\n\n function ovmEXTCODECOPY(address _contract, uint256 _offset, uint256 _length) external returns (bytes memory _code);\n function ovmEXTCODESIZE(address _contract) external returns (uint256 _size);\n function ovmEXTCODEHASH(address _contract) external returns (bytes32 _hash);\n\n\n /**************************************\n * Public Functions: Execution Safety *\n **************************************/\n\n function safeCREATE(address _address, bytes memory _bytecode) external;\n\n /***************************************\n * Public Functions: Execution Context *\n ***************************************/\n\n function getMaxTransactionGasLimit() external view returns (uint _maxTransactionGasLimit);\n}\n" - }, - "contracts/optimistic-ethereum/iOVM/execution/iOVM_StateManager.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/**\n * @title iOVM_StateManager\n */\ninterface iOVM_StateManager {\n\n /*******************\n * Data Structures *\n *******************/\n\n enum ItemState {\n ITEM_UNTOUCHED,\n ITEM_LOADED,\n ITEM_CHANGED,\n ITEM_COMMITTED\n }\n\n /***************************\n * Public Functions: Misc *\n ***************************/\n\n function isAuthenticated(address _address) external view returns (bool);\n\n /***************************\n * Public Functions: Setup *\n ***************************/\n\n function owner() external view returns (address _owner);\n function ovmExecutionManager() external view returns (address _ovmExecutionManager);\n function setExecutionManager(address _ovmExecutionManager) external;\n\n\n /************************************\n * Public Functions: Account Access *\n ************************************/\n\n function putAccount(address _address, Lib_OVMCodec.Account memory _account) external;\n function putEmptyAccount(address _address) external;\n function getAccount(address _address) external view returns (Lib_OVMCodec.Account memory _account);\n function hasAccount(address _address) external view returns (bool _exists);\n function hasEmptyAccount(address _address) external view returns (bool _exists);\n function setAccountNonce(address _address, uint256 _nonce) external;\n function getAccountNonce(address _address) external view returns (uint256 _nonce);\n function getAccountEthAddress(address _address) external view returns (address _ethAddress);\n function getAccountStorageRoot(address _address) external view returns (bytes32 _storageRoot);\n function initPendingAccount(address _address) external;\n function commitPendingAccount(address _address, address _ethAddress, bytes32 _codeHash) external;\n function testAndSetAccountLoaded(address _address) external returns (bool _wasAccountAlreadyLoaded);\n function testAndSetAccountChanged(address _address) external returns (bool _wasAccountAlreadyChanged);\n function commitAccount(address _address) external returns (bool _wasAccountCommitted);\n function incrementTotalUncommittedAccounts() external;\n function getTotalUncommittedAccounts() external view returns (uint256 _total);\n function wasAccountChanged(address _address) external view returns (bool);\n function wasAccountCommitted(address _address) external view returns (bool);\n\n\n /************************************\n * Public Functions: Storage Access *\n ************************************/\n\n function putContractStorage(address _contract, bytes32 _key, bytes32 _value) external;\n function getContractStorage(address _contract, bytes32 _key) external view returns (bytes32 _value);\n function hasContractStorage(address _contract, bytes32 _key) external returns (bool _exists);\n function testAndSetContractStorageLoaded(address _contract, bytes32 _key) external returns (bool _wasContractStorageAlreadyLoaded);\n function testAndSetContractStorageChanged(address _contract, bytes32 _key) external returns (bool _wasContractStorageAlreadyChanged);\n function commitContractStorage(address _contract, bytes32 _key) external returns (bool _wasContractStorageCommitted);\n function incrementTotalUncommittedContractStorage() external;\n function getTotalUncommittedContractStorage() external view returns (uint256 _total);\n function wasContractStorageChanged(address _contract, bytes32 _key) external view returns (bool);\n function wasContractStorageCommitted(address _contract, bytes32 _key) external view returns (bool);\n}\n" - }, - "contracts/optimistic-ethereum/iOVM/execution/iOVM_SafetyChecker.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/**\n * @title iOVM_SafetyChecker\n */\ninterface iOVM_SafetyChecker {\n\n /********************\n * Public Functions *\n ********************/\n\n function isBytecodeSafe(bytes calldata _bytecode) external view returns (bool);\n}\n" - }, - "contracts/optimistic-ethereum/OVM/accounts/OVM_ProxyEOA.sol": { - "content": "pragma solidity ^0.7.0;\n\n/* Library Imports */\nimport { Lib_BytesUtils } from \"../../libraries/utils/Lib_BytesUtils.sol\";\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_ECDSAUtils } from \"../../libraries/utils/Lib_ECDSAUtils.sol\";\nimport { Lib_SafeExecutionManagerWrapper } from \"../../libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\";\n\n/**\n * @title OVM_ProxyEOA\n */\ncontract OVM_ProxyEOA {\n\n bytes32 constant IMPLEMENTATION_KEY = 0xdeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddead;\n\n /***************\n * Constructor *\n ***************/\n\n constructor(\n address _implementation\n ) {\n _setImplementation(_implementation);\n }\n\n\n /*********************\n * Fallback Function *\n *********************/\n\n fallback()\n external\n {\n (bool success, bytes memory returndata) = Lib_SafeExecutionManagerWrapper.safeDELEGATECALL(\n gasleft(),\n getImplementation(),\n msg.data\n );\n\n if (success) {\n assembly {\n return(add(returndata, 0x20), mload(returndata))\n }\n } else {\n Lib_SafeExecutionManagerWrapper.safeREVERT(\n string(returndata)\n );\n }\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n function upgrade(\n address _implementation\n )\n external\n {\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(\n Lib_SafeExecutionManagerWrapper.safeADDRESS() == Lib_SafeExecutionManagerWrapper.safeCALLER(),\n \"EOAs can only upgrade their own EOA implementation\"\n );\n\n _setImplementation(_implementation);\n }\n\n function getImplementation()\n public\n returns (\n address _implementation\n )\n {\n return address(uint160(uint256(\n Lib_SafeExecutionManagerWrapper.safeSLOAD(\n IMPLEMENTATION_KEY\n )\n )));\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n function _setImplementation(\n address _implementation\n )\n internal\n {\n Lib_SafeExecutionManagerWrapper.safeSSTORE(\n IMPLEMENTATION_KEY,\n bytes32(uint256(uint160(_implementation)))\n );\n }\n}" - }, - "contracts/optimistic-ethereum/OVM/precompiles/OVM_DeployerWhitelist.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.7.0;\n\n/* Library Imports */\nimport { Lib_Bytes32Utils } from \"../../libraries/utils/Lib_Bytes32Utils.sol\";\n\n/* Interface Imports */\nimport { iOVM_DeployerWhitelist } from \"../../iOVM/precompiles/iOVM_DeployerWhitelist.sol\";\nimport { Lib_SafeExecutionManagerWrapper } from \"../../libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\";\n\n/**\n * @title OVM_DeployerWhitelist\n * @dev L2 CONTRACT (NOT COMPILED)\n */\ncontract OVM_DeployerWhitelist is iOVM_DeployerWhitelist {\n\n /**********************\n * Contract Constants *\n **********************/\n\n bytes32 internal constant KEY_INITIALIZED = 0x0000000000000000000000000000000000000000000000000000000000000010;\n bytes32 internal constant KEY_OWNER = 0x0000000000000000000000000000000000000000000000000000000000000011;\n bytes32 internal constant KEY_ALLOW_ARBITRARY_DEPLOYMENT = 0x0000000000000000000000000000000000000000000000000000000000000012;\n\n\n /**********************\n * Function Modifiers *\n **********************/\n \n /**\n * Blocks functions to anyone except the contract owner.\n */\n modifier onlyOwner() {\n address owner = Lib_Bytes32Utils.toAddress(\n Lib_SafeExecutionManagerWrapper.safeSLOAD(\n KEY_OWNER\n )\n );\n\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(\n Lib_SafeExecutionManagerWrapper.safeCALLER() == owner,\n \"Function can only be called by the owner of this contract.\"\n );\n _;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n \n /**\n * Initializes the whitelist.\n * @param _owner Address of the owner for this contract.\n * @param _allowArbitraryDeployment Whether or not to allow arbitrary contract deployment.\n */\n function initialize(\n address _owner,\n bool _allowArbitraryDeployment\n )\n override\n public\n {\n bool initialized = Lib_Bytes32Utils.toBool(\n Lib_SafeExecutionManagerWrapper.safeSLOAD(KEY_INITIALIZED)\n );\n\n if (initialized == true) {\n return;\n }\n\n Lib_SafeExecutionManagerWrapper.safeSSTORE(\n KEY_INITIALIZED,\n Lib_Bytes32Utils.fromBool(true)\n );\n Lib_SafeExecutionManagerWrapper.safeSSTORE(\n KEY_OWNER,\n Lib_Bytes32Utils.fromAddress(_owner)\n );\n Lib_SafeExecutionManagerWrapper.safeSSTORE(\n KEY_ALLOW_ARBITRARY_DEPLOYMENT,\n Lib_Bytes32Utils.fromBool(_allowArbitraryDeployment)\n );\n }\n\n /**\n * Gets the owner of the whitelist.\n */\n function getOwner()\n override\n public\n returns(\n address\n )\n {\n return Lib_Bytes32Utils.toAddress(\n Lib_SafeExecutionManagerWrapper.safeSLOAD(\n KEY_OWNER\n )\n );\n }\n\n /**\n * Adds or removes an address from the deployment whitelist.\n * @param _deployer Address to update permissions for.\n * @param _isWhitelisted Whether or not the address is whitelisted.\n */\n function setWhitelistedDeployer(\n address _deployer,\n bool _isWhitelisted\n )\n override\n public\n onlyOwner\n {\n Lib_SafeExecutionManagerWrapper.safeSSTORE(\n Lib_Bytes32Utils.fromAddress(_deployer),\n Lib_Bytes32Utils.fromBool(_isWhitelisted)\n );\n }\n\n /**\n * Updates the owner of this contract.\n * @param _owner Address of the new owner.\n */\n function setOwner(\n address _owner\n )\n override\n public\n onlyOwner\n {\n Lib_SafeExecutionManagerWrapper.safeSSTORE(\n KEY_OWNER,\n Lib_Bytes32Utils.fromAddress(_owner)\n );\n }\n\n /**\n * Updates the arbitrary deployment flag.\n * @param _allowArbitraryDeployment Whether or not to allow arbitrary contract deployment.\n */\n function setAllowArbitraryDeployment(\n bool _allowArbitraryDeployment\n )\n override\n public\n onlyOwner\n {\n Lib_SafeExecutionManagerWrapper.safeSSTORE(\n KEY_ALLOW_ARBITRARY_DEPLOYMENT,\n Lib_Bytes32Utils.fromBool(_allowArbitraryDeployment)\n );\n }\n\n /**\n * Permanently enables arbitrary contract deployment and deletes the owner.\n */\n function enableArbitraryContractDeployment()\n override\n public\n onlyOwner\n {\n setAllowArbitraryDeployment(true);\n setOwner(address(0));\n }\n\n /**\n * Checks whether an address is allowed to deploy contracts.\n * @param _deployer Address to check.\n * @return _allowed Whether or not the address can deploy contracts.\n */\n function isDeployerAllowed(\n address _deployer\n )\n override\n public\n returns (\n bool _allowed\n )\n {\n bool initialized = Lib_Bytes32Utils.toBool(\n Lib_SafeExecutionManagerWrapper.safeSLOAD(KEY_INITIALIZED)\n );\n\n if (initialized == false) {\n return true;\n }\n\n bool allowArbitraryDeployment = Lib_Bytes32Utils.toBool(\n Lib_SafeExecutionManagerWrapper.safeSLOAD(KEY_ALLOW_ARBITRARY_DEPLOYMENT)\n );\n\n if (allowArbitraryDeployment == true) {\n return true;\n }\n\n bool isWhitelisted = Lib_Bytes32Utils.toBool(\n Lib_SafeExecutionManagerWrapper.safeSLOAD(\n Lib_Bytes32Utils.fromAddress(_deployer)\n )\n );\n\n return isWhitelisted; \n }\n}\n" - }, - "contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol": { - "content": "// SPDX-License-Identifier: MIT\n// +build ovm\npragma solidity >0.5.0 <0.8.0;\n\n/* Contract Imports */\nimport { Ownable } from \"./Lib_Ownable.sol\";\n\n/**\n * @title Lib_AddressManager\n */\ncontract Lib_AddressManager is Ownable {\n\n /**********\n * Events *\n **********/\n\n event AddressSet(\n string _name,\n address _newAddress\n );\n\n /*******************************************\n * Contract Variables: Internal Accounting *\n *******************************************/\n\n mapping (bytes32 => address) private addresses;\n\n\n /********************\n * Public Functions *\n ********************/\n\n function setAddress(\n string memory _name,\n address _address\n )\n public\n onlyOwner\n {\n emit AddressSet(_name, _address);\n addresses[_getNameHash(_name)] = _address;\n }\n\n function getAddress(\n string memory _name\n )\n public\n view\n returns (address)\n {\n return addresses[_getNameHash(_name)];\n }\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n function _getNameHash(\n string memory _name\n )\n internal\n pure\n returns (\n bytes32 _hash\n )\n {\n return keccak256(abi.encodePacked(_name));\n }\n}\n" - }, - "contracts/optimistic-ethereum/libraries/resolver/Lib_Ownable.sol": { - "content": "// SPDX-License-Identifier: MIT\n// +build ovm\npragma solidity >0.5.0 <0.8.0;\n\n/**\n * @title Ownable\n * @dev Adapted from https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol\n */\nabstract contract Ownable {\n\n /*************\n * Variables *\n *************/\n\n address public owner;\n\n\n /**********\n * Events *\n **********/\n\n event OwnershipTransferred(\n address indexed previousOwner,\n address indexed newOwner\n );\n\n\n /***************\n * Constructor *\n ***************/\n\n constructor() internal {\n owner = msg.sender;\n emit OwnershipTransferred(address(0), owner);\n }\n\n\n /**********************\n * Function Modifiers *\n **********************/\n\n modifier onlyOwner() {\n require(\n owner == msg.sender,\n \"Ownable: caller is not the owner\"\n );\n _;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n function renounceOwnership()\n public\n virtual\n onlyOwner\n {\n emit OwnershipTransferred(owner, address(0));\n owner = address(0);\n }\n\n function transferOwnership(address _newOwner)\n public\n virtual\n onlyOwner\n {\n require(\n _newOwner != address(0),\n \"Ownable: new owner cannot be the zero address\"\n );\n\n emit OwnershipTransferred(owner, _newOwner);\n owner = _newOwner;\n }\n}\n" - }, - "contracts/optimistic-ethereum/iOVM/precompiles/iOVM_DeployerWhitelist.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/**\n * @title iOVM_DeployerWhitelist\n */\ninterface iOVM_DeployerWhitelist {\n\n /********************\n * Public Functions *\n ********************/\n\n function initialize(address _owner, bool _allowArbitraryDeployment) external;\n function getOwner() external returns (address _owner);\n function setWhitelistedDeployer(address _deployer, bool _isWhitelisted) external;\n function setOwner(address _newOwner) external;\n function setAllowArbitraryDeployment(bool _allowArbitraryDeployment) external;\n function enableArbitraryContractDeployment() external;\n function isDeployerAllowed(address _deployer) external returns (bool _allowed);\n}\n" - }, - "contracts/optimistic-ethereum/OVM/precompiles/OVM_SequencerEntrypoint.sol": { - "content": "pragma solidity ^0.7.0;\n\n/* Library Imports */\nimport { Lib_BytesUtils } from \"../../libraries/utils/Lib_BytesUtils.sol\";\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_ECDSAUtils } from \"../../libraries/utils/Lib_ECDSAUtils.sol\";\nimport { Lib_SafeExecutionManagerWrapper } from \"../../libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\";\n\n/**\n * @title OVM_SequencerEntrypoint\n */\ncontract OVM_SequencerEntrypoint {\n\n /*********\n * Enums *\n *********/\n \n enum TransactionType {\n NATIVE_ETH_TRANSACTION,\n ETH_SIGNED_MESSAGE\n }\n\n\n /*********************\n * Fallback Function *\n *********************/\n\n /**\n * Uses a custom \"compressed\" format to save on calldata gas:\n * calldata[00:01]: transaction type (0 == EIP 155, 2 == Eth Sign Message)\n * calldata[01:33]: signature \"r\" parameter\n * calldata[33:65]: signature \"s\" parameter\n * calldata[66:69]: transaction gas limit\n * calldata[69:72]: transaction gas price\n * calldata[72:75]: transaction nonce\n * calldata[75:95]: transaction target address\n * calldata[95:XX]: transaction data\n */\n fallback()\n external\n {\n TransactionType transactionType = _getTransactionType(Lib_BytesUtils.toUint8(msg.data, 0));\n\n bytes32 r = Lib_BytesUtils.toBytes32(Lib_BytesUtils.slice(msg.data, 1, 32));\n bytes32 s = Lib_BytesUtils.toBytes32(Lib_BytesUtils.slice(msg.data, 33, 32));\n uint8 v = Lib_BytesUtils.toUint8(msg.data, 65);\n\n // Remainder is the transaction to execute.\n bytes memory compressedTx = Lib_BytesUtils.slice(msg.data, 66);\n bool isEthSignedMessage = transactionType == TransactionType.ETH_SIGNED_MESSAGE;\n\n // Need to decompress and then re-encode the transaction based on the original encoding.\n bytes memory encodedTx = Lib_OVMCodec.encodeEIP155Transaction(\n Lib_OVMCodec.decompressEIP155Transaction(compressedTx),\n isEthSignedMessage\n );\n\n address target = Lib_ECDSAUtils.recover(\n encodedTx,\n isEthSignedMessage,\n uint8(v),\n r,\n s\n );\n\n if (Lib_SafeExecutionManagerWrapper.safeEXTCODESIZE(target) == 0) {\n // ProxyEOA has not yet been deployed for this EOA.\n bytes32 messageHash = Lib_ECDSAUtils.getMessageHash(encodedTx, isEthSignedMessage);\n Lib_SafeExecutionManagerWrapper.safeCREATEEOA(messageHash, uint8(v), r, s);\n }\n\n // ProxyEOA has been deployed for this EOA, continue to CALL.\n bytes memory callbytes = abi.encodeWithSignature(\n \"execute(bytes,uint8,uint8,bytes32,bytes32)\",\n encodedTx,\n isEthSignedMessage,\n uint8(v),\n r,\n s\n );\n\n Lib_SafeExecutionManagerWrapper.safeCALL(\n gasleft(),\n target,\n callbytes\n );\n }\n \n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Converts a uint256 into a TransactionType enum.\n * @param _transactionType Transaction type index.\n * @return Transaction type enum value.\n */\n function _getTransactionType(\n uint8 _transactionType\n )\n internal\n returns (\n TransactionType\n )\n {\n if (_transactionType == 0) {\n return TransactionType.NATIVE_ETH_TRANSACTION;\n } if (_transactionType == 2) {\n return TransactionType.ETH_SIGNED_MESSAGE;\n } else {\n Lib_SafeExecutionManagerWrapper.safeREVERT(\n \"Transaction type must be 0 or 2\"\n );\n }\n }\n}\n" - }, - "contracts/test-libraries/utils/TestLib_ECDSAUtils.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.7.0;\n\n/* Library Imports */\nimport { Lib_ECDSAUtils } from \"../../optimistic-ethereum/libraries/utils/Lib_ECDSAUtils.sol\";\n\n/**\n * @title TestLib_ECDSAUtils\n */\ncontract TestLib_ECDSAUtils {\n\n function recover(\n bytes memory _message,\n bool _isEthSignedMessage,\n uint8 _v,\n bytes32 _r,\n bytes32 _s\n )\n public\n pure\n returns (\n address _sender\n )\n {\n return Lib_ECDSAUtils.recover(\n _message,\n _isEthSignedMessage,\n _v,\n _r,\n _s\n );\n }\n}\n" - }, - "contracts/test-libraries/codec/TestLib_OVMCodec.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.7.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../optimistic-ethereum/libraries/codec/Lib_OVMCodec.sol\";\n\n/**\n * @title TestLib_OVMCodec\n */\ncontract TestLib_OVMCodec {\n\n function decodeEIP155Transaction(\n bytes memory _transaction,\n bool _isEthSignedMessage\n )\n public\n pure\n returns (\n Lib_OVMCodec.EIP155Transaction memory _decoded\n )\n {\n return Lib_OVMCodec.decodeEIP155Transaction(_transaction, _isEthSignedMessage);\n }\n\n function encodeTransaction(\n Lib_OVMCodec.Transaction memory _transaction\n )\n public\n pure\n returns (\n bytes memory _encoded\n )\n {\n return Lib_OVMCodec.encodeTransaction(_transaction);\n }\n\n function hashTransaction(\n Lib_OVMCodec.Transaction memory _transaction\n )\n public\n pure\n returns (\n bytes32 _hash\n )\n {\n return Lib_OVMCodec.hashTransaction(_transaction);\n }\n\n function decompressEIP155Transaction(\n bytes memory _transaction\n )\n public\n returns (\n Lib_OVMCodec.EIP155Transaction memory _decompressed\n )\n {\n return Lib_OVMCodec.decompressEIP155Transaction(_transaction);\n }\n}\n" - }, - "contracts/optimistic-ethereum/OVM/verification/OVM_StateTransitioner.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.7.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\nimport { Lib_EthUtils } from \"../../libraries/utils/Lib_EthUtils.sol\";\nimport { Lib_Bytes32Utils } from \"../../libraries/utils/Lib_Bytes32Utils.sol\";\nimport { Lib_BytesUtils } from \"../../libraries/utils/Lib_BytesUtils.sol\";\nimport { Lib_SecureMerkleTrie } from \"../../libraries/trie/Lib_SecureMerkleTrie.sol\";\nimport { Lib_RLPWriter } from \"../../libraries/rlp/Lib_RLPWriter.sol\";\nimport { Lib_RLPReader } from \"../../libraries/rlp/Lib_RLPReader.sol\";\n\n/* Interface Imports */\nimport { iOVM_StateTransitioner } from \"../../iOVM/verification/iOVM_StateTransitioner.sol\";\nimport { iOVM_BondManager } from \"../../iOVM/verification/iOVM_BondManager.sol\";\nimport { iOVM_ExecutionManager } from \"../../iOVM/execution/iOVM_ExecutionManager.sol\";\nimport { iOVM_StateManager } from \"../../iOVM/execution/iOVM_StateManager.sol\";\nimport { iOVM_StateManagerFactory } from \"../../iOVM/execution/iOVM_StateManagerFactory.sol\";\n\n/* Contract Imports */\nimport { OVM_FraudContributor } from \"./OVM_FraudContributor.sol\";\n\n/**\n * @title OVM_StateTransitioner\n */\ncontract OVM_StateTransitioner is Lib_AddressResolver, OVM_FraudContributor, iOVM_StateTransitioner {\n\n /*******************\n * Data Structures *\n *******************/\n\n enum TransitionPhase {\n PRE_EXECUTION,\n POST_EXECUTION,\n COMPLETE\n }\n\n\n /*******************************************\n * Contract Variables: Contract References *\n *******************************************/\n\n iOVM_StateManager public ovmStateManager;\n\n\n /*******************************************\n * Contract Variables: Internal Accounting *\n *******************************************/\n\n bytes32 internal preStateRoot;\n bytes32 internal postStateRoot;\n TransitionPhase public phase;\n uint256 internal stateTransitionIndex;\n bytes32 internal transactionHash;\n\n\n /*************\n * Constants *\n *************/\n\n bytes32 internal constant EMPTY_ACCOUNT_CODE_HASH = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;\n bytes32 internal constant EMPTY_ACCOUNT_STORAGE_ROOT = 0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421;\n\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n * @param _stateTransitionIndex Index of the state transition being verified.\n * @param _preStateRoot State root before the transition was executed.\n * @param _transactionHash Hash of the executed transaction.\n */\n constructor(\n address _libAddressManager,\n uint256 _stateTransitionIndex,\n bytes32 _preStateRoot,\n bytes32 _transactionHash\n )\n Lib_AddressResolver(_libAddressManager)\n {\n stateTransitionIndex = _stateTransitionIndex;\n preStateRoot = _preStateRoot;\n postStateRoot = _preStateRoot;\n transactionHash = _transactionHash;\n\n ovmStateManager = iOVM_StateManagerFactory(resolve(\"OVM_StateManagerFactory\")).create(address(this));\n }\n\n\n /**********************\n * Function Modifiers *\n **********************/\n\n /**\n * Checks that a function is only run during a specific phase.\n * @param _phase Phase the function must run within.\n */\n modifier onlyDuringPhase(\n TransitionPhase _phase\n ) {\n require(\n phase == _phase,\n \"Function must be called during the correct phase.\"\n );\n _;\n }\n\n\n /**********************************\n * Public Functions: State Access *\n **********************************/\n\n /**\n * Retrieves the state root before execution.\n * @return _preStateRoot State root before execution.\n */\n function getPreStateRoot()\n override\n public\n view\n returns (\n bytes32 _preStateRoot\n )\n {\n return preStateRoot;\n }\n\n /**\n * Retrieves the state root after execution.\n * @return _postStateRoot State root after execution.\n */\n function getPostStateRoot()\n override\n public\n view\n returns (\n bytes32 _postStateRoot\n )\n {\n return postStateRoot;\n }\n\n /**\n * Checks whether the transitioner is complete.\n * @return _complete Whether or not the transition process is finished.\n */\n function isComplete()\n override\n public\n view\n returns (\n bool _complete\n )\n {\n return phase == TransitionPhase.COMPLETE;\n }\n \n\n /***********************************\n * Public Functions: Pre-Execution *\n ***********************************/\n\n /**\n * Allows a user to prove the initial state of a contract.\n * @param _ovmContractAddress Address of the contract on the OVM.\n * @param _ethContractAddress Address of the corresponding contract on L1.\n * @param _stateTrieWitness Proof of the account state.\n */\n function proveContractState(\n address _ovmContractAddress,\n address _ethContractAddress,\n bytes memory _stateTrieWitness\n )\n override\n public\n onlyDuringPhase(TransitionPhase.PRE_EXECUTION)\n contributesToFraudProof(preStateRoot, transactionHash)\n {\n // Exit quickly to avoid unnecessary work.\n require(\n (\n ovmStateManager.hasAccount(_ovmContractAddress) == false\n && ovmStateManager.hasEmptyAccount(_ovmContractAddress) == false\n ),\n \"Account state has already been proven.\"\n );\n\n // Function will fail if the proof is not a valid inclusion or exclusion proof.\n (\n bool exists,\n bytes memory encodedAccount\n ) = Lib_SecureMerkleTrie.get(\n abi.encodePacked(_ovmContractAddress),\n _stateTrieWitness,\n preStateRoot\n );\n\n if (exists == true) {\n // Account exists, this was an inclusion proof.\n Lib_OVMCodec.EVMAccount memory account = Lib_OVMCodec.decodeEVMAccount(\n encodedAccount\n );\n\n address ethContractAddress = _ethContractAddress;\n if (account.codeHash == EMPTY_ACCOUNT_CODE_HASH) {\n // Use a known empty contract to prevent an attack in which a user provides a\n // contract address here and then later deploys code to it.\n ethContractAddress = 0x0000000000000000000000000000000000000000;\n } else {\n // Otherwise, make sure that the code at the provided eth address matches the hash\n // of the code stored on L2.\n require(\n Lib_EthUtils.getCodeHash(ethContractAddress) == account.codeHash,\n \"OVM_StateTransitioner: Provided L1 contract code hash does not match L2 contract code hash.\"\n );\n }\n\n ovmStateManager.putAccount(\n _ovmContractAddress,\n Lib_OVMCodec.Account({\n nonce: account.nonce,\n balance: account.balance,\n storageRoot: account.storageRoot,\n codeHash: account.codeHash,\n ethAddress: ethContractAddress,\n isFresh: false\n })\n );\n } else {\n // Account does not exist, this was an exclusion proof.\n ovmStateManager.putEmptyAccount(_ovmContractAddress);\n }\n }\n\n /**\n * Allows a user to prove the initial state of a contract storage slot.\n * @param _ovmContractAddress Address of the contract on the OVM.\n * @param _key Claimed account slot key.\n * @param _storageTrieWitness Proof of the storage slot.\n */\n function proveStorageSlot(\n address _ovmContractAddress,\n bytes32 _key,\n bytes memory _storageTrieWitness\n )\n override\n public\n onlyDuringPhase(TransitionPhase.PRE_EXECUTION)\n contributesToFraudProof(preStateRoot, transactionHash)\n {\n // Exit quickly to avoid unnecessary work.\n require(\n ovmStateManager.hasContractStorage(_ovmContractAddress, _key) == false,\n \"Storage slot has already been proven.\"\n );\n\n require(\n ovmStateManager.hasAccount(_ovmContractAddress) == true,\n \"Contract must be verified before proving a storage slot.\"\n );\n\n bytes32 storageRoot = ovmStateManager.getAccountStorageRoot(_ovmContractAddress);\n bytes32 value;\n\n if (storageRoot == EMPTY_ACCOUNT_STORAGE_ROOT) {\n // Storage trie was empty, so the user is always allowed to insert zero-byte values.\n value = bytes32(0);\n } else {\n // Function will fail if the proof is not a valid inclusion or exclusion proof.\n (\n bool exists,\n bytes memory encodedValue\n ) = Lib_SecureMerkleTrie.get(\n abi.encodePacked(_key),\n _storageTrieWitness,\n storageRoot\n );\n\n if (exists == true) {\n // Inclusion proof.\n // Stored values are RLP encoded, with leading zeros removed.\n value = Lib_BytesUtils.toBytes32PadLeft(\n Lib_RLPReader.readBytes(encodedValue)\n );\n } else {\n // Exclusion proof, can only be zero bytes.\n value = bytes32(0);\n }\n }\n\n ovmStateManager.putContractStorage(\n _ovmContractAddress,\n _key,\n value\n );\n }\n\n\n /*******************************\n * Public Functions: Execution *\n *******************************/\n\n /**\n * Executes the state transition.\n * @param _transaction OVM transaction to execute.\n */\n function applyTransaction(\n Lib_OVMCodec.Transaction memory _transaction\n )\n override\n public\n onlyDuringPhase(TransitionPhase.PRE_EXECUTION)\n contributesToFraudProof(preStateRoot, transactionHash)\n {\n require(\n Lib_OVMCodec.hashTransaction(_transaction) == transactionHash,\n \"Invalid transaction provided.\"\n );\n\n // We require gas to complete the logic here in run() before/after execution,\n // But must ensure the full _tx.gasLimit can be given to the ovmCALL (determinism)\n // This includes 1/64 of the gas getting lost because of EIP-150 (lost twice--first \n // going into EM, then going into the code contract).\n require(\n gasleft() >= 100000 + _transaction.gasLimit * 1032 / 1000, // 1032/1000 = 1.032 = (64/63)^2 rounded up\n \"Not enough gas to execute transaction deterministically.\"\n );\n\n iOVM_ExecutionManager ovmExecutionManager = iOVM_ExecutionManager(resolve(\"OVM_ExecutionManager\"));\n\n // We call `setExecutionManager` right before `run` (and not earlier) just in case the\n // OVM_ExecutionManager address was updated between the time when this contract was created\n // and when `applyTransaction` was called.\n ovmStateManager.setExecutionManager(address(ovmExecutionManager));\n\n // `run` always succeeds *unless* the user hasn't provided enough gas to `applyTransaction`\n // or an INVALID_STATE_ACCESS flag was triggered. Either way, we won't get beyond this line\n // if that's the case.\n ovmExecutionManager.run(_transaction, address(ovmStateManager));\n\n phase = TransitionPhase.POST_EXECUTION;\n }\n\n\n /************************************\n * Public Functions: Post-Execution *\n ************************************/\n\n /**\n * Allows a user to commit the final state of a contract.\n * @param _ovmContractAddress Address of the contract on the OVM.\n * @param _stateTrieWitness Proof of the account state.\n */\n function commitContractState(\n address _ovmContractAddress,\n bytes memory _stateTrieWitness\n )\n override\n public\n onlyDuringPhase(TransitionPhase.POST_EXECUTION)\n contributesToFraudProof(preStateRoot, transactionHash)\n {\n require(\n ovmStateManager.getTotalUncommittedContractStorage() == 0,\n \"All storage must be committed before committing account states.\"\n );\n\n require (\n ovmStateManager.commitAccount(_ovmContractAddress) == true,\n \"Account state wasn't changed or has already been committed.\"\n );\n\n Lib_OVMCodec.Account memory account = ovmStateManager.getAccount(_ovmContractAddress);\n\n postStateRoot = Lib_SecureMerkleTrie.update(\n abi.encodePacked(_ovmContractAddress),\n Lib_OVMCodec.encodeEVMAccount(\n Lib_OVMCodec.toEVMAccount(account)\n ),\n _stateTrieWitness,\n postStateRoot\n );\n\n // Emit an event to help clients figure out the proof ordering.\n emit AccountCommitted(\n _ovmContractAddress\n );\n }\n\n /**\n * Allows a user to commit the final state of a contract storage slot.\n * @param _ovmContractAddress Address of the contract on the OVM.\n * @param _key Claimed account slot key.\n * @param _storageTrieWitness Proof of the storage slot.\n */\n function commitStorageSlot(\n address _ovmContractAddress,\n bytes32 _key,\n bytes memory _storageTrieWitness\n )\n override\n public\n onlyDuringPhase(TransitionPhase.POST_EXECUTION)\n contributesToFraudProof(preStateRoot, transactionHash)\n {\n require(\n ovmStateManager.commitContractStorage(_ovmContractAddress, _key) == true,\n \"Storage slot value wasn't changed or has already been committed.\"\n );\n\n Lib_OVMCodec.Account memory account = ovmStateManager.getAccount(_ovmContractAddress);\n bytes32 value = ovmStateManager.getContractStorage(_ovmContractAddress, _key);\n\n account.storageRoot = Lib_SecureMerkleTrie.update(\n abi.encodePacked(_key),\n Lib_RLPWriter.writeBytes(\n Lib_Bytes32Utils.removeLeadingZeros(value)\n ),\n _storageTrieWitness,\n account.storageRoot\n );\n\n ovmStateManager.putAccount(_ovmContractAddress, account);\n\n // Emit an event to help clients figure out the proof ordering.\n emit ContractStorageCommitted(\n _ovmContractAddress,\n _key\n );\n }\n\n\n /**********************************\n * Public Functions: Finalization *\n **********************************/\n\n /**\n * Finalizes the transition process.\n */\n function completeTransition()\n override\n public\n onlyDuringPhase(TransitionPhase.POST_EXECUTION)\n {\n require(\n ovmStateManager.getTotalUncommittedAccounts() == 0,\n \"All accounts must be committed before completing a transition.\"\n );\n\n require(\n ovmStateManager.getTotalUncommittedContractStorage() == 0,\n \"All storage must be committed before completing a transition.\"\n );\n\n phase = TransitionPhase.COMPLETE;\n }\n}\n" - }, - "contracts/optimistic-ethereum/libraries/trie/Lib_SecureMerkleTrie.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_MerkleTrie } from \"./Lib_MerkleTrie.sol\";\n\n/**\n * @title Lib_SecureMerkleTrie\n */\nlibrary Lib_SecureMerkleTrie {\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * @notice Verifies a proof that a given key/value pair is present in the\n * Merkle trie.\n * @param _key Key of the node to search for, as a hex string.\n * @param _value Value of the node to search for, as a hex string.\n * @param _proof Merkle trie inclusion proof for the desired node. Unlike\n * traditional Merkle trees, this proof is executed top-down and consists\n * of a list of RLP-encoded nodes that make a path down to the target node.\n * @param _root Known root of the Merkle trie. Used to verify that the\n * included proof is correctly constructed.\n * @return _verified `true` if the k/v pair exists in the trie, `false` otherwise.\n */\n function verifyInclusionProof(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n )\n internal\n pure\n returns (\n bool _verified\n )\n {\n bytes memory key = _getSecureKey(_key);\n return Lib_MerkleTrie.verifyInclusionProof(key, _value, _proof, _root);\n }\n\n /**\n * @notice Verifies a proof that a given key is *not* present in\n * the Merkle trie.\n * @param _key Key of the node to search for, as a hex string.\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\n * target node.\n * @param _root Known root of the Merkle trie. Used to verify that the\n * included proof is correctly constructed.\n * @return _verified `true` if the key is not present in the trie, `false` otherwise.\n */\n function verifyExclusionProof(\n bytes memory _key,\n bytes memory _proof,\n bytes32 _root\n )\n internal\n pure\n returns (\n bool _verified\n )\n {\n bytes memory key = _getSecureKey(_key);\n return Lib_MerkleTrie.verifyExclusionProof(key, _proof, _root);\n }\n\n /**\n * @notice Updates a Merkle trie and returns a new root hash.\n * @param _key Key of the node to update, as a hex string.\n * @param _value Value of the node to update, as a hex string.\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\n * target node. If the key exists, we can simply update the value.\n * Otherwise, we need to modify the trie to handle the new k/v pair.\n * @param _root Known root of the Merkle trie. Used to verify that the\n * included proof is correctly constructed.\n * @return _updatedRoot Root hash of the newly constructed trie.\n */\n function update(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n )\n internal\n pure\n returns (\n bytes32 _updatedRoot\n )\n {\n bytes memory key = _getSecureKey(_key);\n return Lib_MerkleTrie.update(key, _value, _proof, _root);\n }\n\n /**\n * @notice Retrieves the value associated with a given key.\n * @param _key Key to search for, as hex bytes.\n * @param _proof Merkle trie inclusion proof for the key.\n * @param _root Known root of the Merkle trie.\n * @return _exists Whether or not the key exists.\n * @return _value Value of the key if it exists.\n */\n function get(\n bytes memory _key,\n bytes memory _proof,\n bytes32 _root\n )\n internal\n pure\n returns (\n bool _exists,\n bytes memory _value\n )\n {\n bytes memory key = _getSecureKey(_key);\n return Lib_MerkleTrie.get(key, _proof, _root);\n }\n\n /**\n * Computes the root hash for a trie with a single node.\n * @param _key Key for the single node.\n * @param _value Value for the single node.\n * @return _updatedRoot Hash of the trie.\n */\n function getSingleNodeRootHash(\n bytes memory _key,\n bytes memory _value\n )\n internal\n pure\n returns (\n bytes32 _updatedRoot\n )\n {\n bytes memory key = _getSecureKey(_key);\n return Lib_MerkleTrie.getSingleNodeRootHash(key, _value);\n }\n\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * Computes the secure counterpart to a key.\n * @param _key Key to get a secure key from.\n * @return _secureKey Secure version of the key.\n */\n function _getSecureKey(\n bytes memory _key\n )\n private\n pure\n returns (\n bytes memory _secureKey\n )\n {\n return abi.encodePacked(keccak256(_key));\n }\n}" - }, - "contracts/optimistic-ethereum/iOVM/verification/iOVM_StateTransitioner.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/**\n * @title iOVM_StateTransitioner\n */\ninterface iOVM_StateTransitioner {\n\n /**********\n * Events *\n **********/\n\n event AccountCommitted(\n address _address\n );\n\n event ContractStorageCommitted(\n address _address,\n bytes32 _key\n );\n\n\n /**********************************\n * Public Functions: State Access *\n **********************************/\n\n function getPreStateRoot() external view returns (bytes32 _preStateRoot);\n function getPostStateRoot() external view returns (bytes32 _postStateRoot);\n function isComplete() external view returns (bool _complete);\n\n\n /***********************************\n * Public Functions: Pre-Execution *\n ***********************************/\n\n function proveContractState(\n address _ovmContractAddress,\n address _ethContractAddress,\n bytes calldata _stateTrieWitness\n ) external;\n\n function proveStorageSlot(\n address _ovmContractAddress,\n bytes32 _key,\n bytes calldata _storageTrieWitness\n ) external;\n\n\n /*******************************\n * Public Functions: Execution *\n *******************************/\n\n function applyTransaction(\n Lib_OVMCodec.Transaction calldata _transaction\n ) external;\n\n\n /************************************\n * Public Functions: Post-Execution *\n ************************************/\n\n function commitContractState(\n address _ovmContractAddress,\n bytes calldata _stateTrieWitness\n ) external;\n\n function commitStorageSlot(\n address _ovmContractAddress,\n bytes32 _key,\n bytes calldata _storageTrieWitness\n ) external;\n\n\n /**********************************\n * Public Functions: Finalization *\n **********************************/\n\n function completeTransition() external;\n}\n" - }, - "contracts/optimistic-ethereum/iOVM/verification/iOVM_BondManager.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\ninterface ERC20 {\n function transfer(address, uint256) external returns (bool);\n function transferFrom(address, address, uint256) external returns (bool);\n}\n\n/// All the errors which may be encountered on the bond manager\nlibrary Errors {\n string constant ERC20_ERR = \"BondManager: Could not post bond\";\n string constant ALREADY_FINALIZED = \"BondManager: Fraud proof for this pre-state root has already been finalized\";\n string constant SLASHED = \"BondManager: Cannot finalize withdrawal, you probably got slashed\";\n string constant WRONG_STATE = \"BondManager: Wrong bond state for proposer\";\n string constant CANNOT_CLAIM = \"BondManager: Cannot claim yet. Dispute must be finalized first\";\n\n string constant WITHDRAWAL_PENDING = \"BondManager: Withdrawal already pending\";\n string constant TOO_EARLY = \"BondManager: Too early to finalize your withdrawal\";\n\n string constant ONLY_TRANSITIONER = \"BondManager: Only the transitioner for this pre-state root may call this function\";\n string constant ONLY_FRAUD_VERIFIER = \"BondManager: Only the fraud verifier may call this function\";\n string constant ONLY_STATE_COMMITMENT_CHAIN = \"BondManager: Only the state commitment chain may call this function\";\n string constant WAIT_FOR_DISPUTES = \"BondManager: Wait for other potential disputes\";\n}\n\n/**\n * @title iOVM_BondManager\n */\ninterface iOVM_BondManager {\n\n /*******************\n * Data Structures *\n *******************/\n\n /// The lifecycle of a proposer's bond\n enum State {\n // Before depositing or after getting slashed, a user is uncollateralized\n NOT_COLLATERALIZED,\n // After depositing, a user is collateralized\n COLLATERALIZED,\n // After a user has initiated a withdrawal\n WITHDRAWING\n }\n\n /// A bond posted by a proposer\n struct Bond {\n // The user's state\n State state;\n // The timestamp at which a proposer issued their withdrawal request\n uint32 withdrawalTimestamp;\n // The time when the first disputed was initiated for this bond\n uint256 firstDisputeAt;\n // The earliest observed state root for this bond which has had fraud\n bytes32 earliestDisputedStateRoot;\n // The state root's timestamp\n uint256 earliestTimestamp;\n }\n\n // Per pre-state root, store the number of state provisions that were made\n // and how many of these calls were made by each user. Payouts will then be\n // claimed by users proportionally for that dispute.\n struct Rewards {\n // Flag to check if rewards for a fraud proof are claimable\n bool canClaim;\n // Total number of `recordGasSpent` calls made\n uint256 total;\n // The gas spent by each user to provide witness data. The sum of all\n // values inside this map MUST be equal to the value of `total`\n mapping(address => uint256) gasSpent;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n function recordGasSpent(\n bytes32 _preStateRoot,\n bytes32 _txHash,\n address _who,\n uint256 _gasSpent\n ) external;\n\n function finalize(\n bytes32 _preStateRoot,\n address _publisher,\n uint256 _timestamp\n ) external;\n\n function deposit() external;\n\n function startWithdrawal() external;\n\n function finalizeWithdrawal() external;\n\n function claim(\n address _who\n ) external;\n\n function isCollateralized(\n address _who\n ) external view returns (bool);\n\n function getGasSpent(\n bytes32 _preStateRoot,\n address _who\n ) external view returns (uint256);\n}\n" - }, - "contracts/optimistic-ethereum/iOVM/execution/iOVM_StateManagerFactory.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Contract Imports */\nimport { iOVM_StateManager } from \"./iOVM_StateManager.sol\";\n\n/**\n * @title iOVM_StateManagerFactory\n */\ninterface iOVM_StateManagerFactory {\n\n /***************************************\n * Public Functions: Contract Creation *\n ***************************************/\n\n function create(\n address _owner\n )\n external\n returns (\n iOVM_StateManager _ovmStateManager\n );\n}\n" - }, - "contracts/optimistic-ethereum/OVM/verification/OVM_FraudContributor.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.7.0;\n\nimport { iOVM_BondManager } from \"../../iOVM/verification/iOVM_BondManager.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/// Minimal contract to be inherited by contracts consumed by users that provide\n/// data for fraud proofs\nabstract contract OVM_FraudContributor is Lib_AddressResolver {\n /// Decorate your functions with this modifier to store how much total gas was\n /// consumed by the sender, to reward users fairly\n modifier contributesToFraudProof(bytes32 preStateRoot, bytes32 txHash) {\n uint256 startGas = gasleft();\n _;\n uint256 gasSpent = startGas - gasleft();\n iOVM_BondManager(resolve('OVM_BondManager')).recordGasSpent(preStateRoot, txHash, msg.sender, gasSpent);\n }\n}\n" - }, - "contracts/optimistic-ethereum/libraries/trie/Lib_MerkleTrie.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.7.0;\n\n/* Library Imports */\nimport { Lib_BytesUtils } from \"../utils/Lib_BytesUtils.sol\";\nimport { Lib_RLPReader } from \"../rlp/Lib_RLPReader.sol\";\nimport { Lib_RLPWriter } from \"../rlp/Lib_RLPWriter.sol\";\n\n/**\n * @title Lib_MerkleTrie\n */\nlibrary Lib_MerkleTrie {\n\n /*******************\n * Data Structures *\n *******************/\n\n enum NodeType {\n BranchNode,\n ExtensionNode,\n LeafNode\n }\n\n struct TrieNode {\n bytes encoded;\n Lib_RLPReader.RLPItem[] decoded;\n }\n\n\n /**********************\n * Contract Constants *\n **********************/\n\n // TREE_RADIX determines the number of elements per branch node.\n uint256 constant TREE_RADIX = 16;\n // Branch nodes have TREE_RADIX elements plus an additional `value` slot.\n uint256 constant BRANCH_NODE_LENGTH = TREE_RADIX + 1;\n // Leaf nodes and extension nodes always have two elements, a `path` and a `value`.\n uint256 constant LEAF_OR_EXTENSION_NODE_LENGTH = 2;\n\n // Prefixes are prepended to the `path` within a leaf or extension node and\n // allow us to differentiate between the two node types. `ODD` or `EVEN` is\n // determined by the number of nibbles within the unprefixed `path`. If the\n // number of nibbles if even, we need to insert an extra padding nibble so\n // the resulting prefixed `path` has an even number of nibbles.\n uint8 constant PREFIX_EXTENSION_EVEN = 0;\n uint8 constant PREFIX_EXTENSION_ODD = 1;\n uint8 constant PREFIX_LEAF_EVEN = 2;\n uint8 constant PREFIX_LEAF_ODD = 3;\n\n // Just a utility constant. RLP represents `NULL` as 0x80.\n bytes1 constant RLP_NULL = bytes1(0x80);\n bytes constant RLP_NULL_BYTES = hex'80';\n bytes32 constant internal KECCAK256_RLP_NULL_BYTES = keccak256(RLP_NULL_BYTES);\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * @notice Verifies a proof that a given key/value pair is present in the\n * Merkle trie.\n * @param _key Key of the node to search for, as a hex string.\n * @param _value Value of the node to search for, as a hex string.\n * @param _proof Merkle trie inclusion proof for the desired node. Unlike\n * traditional Merkle trees, this proof is executed top-down and consists\n * of a list of RLP-encoded nodes that make a path down to the target node.\n * @param _root Known root of the Merkle trie. Used to verify that the\n * included proof is correctly constructed.\n * @return _verified `true` if the k/v pair exists in the trie, `false` otherwise.\n */\n function verifyInclusionProof(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n )\n internal\n pure\n returns (\n bool _verified\n )\n {\n (\n bool exists,\n bytes memory value\n ) = get(_key, _proof, _root);\n\n return (\n exists && Lib_BytesUtils.equal(_value, value)\n );\n }\n\n /**\n * @notice Verifies a proof that a given key is *not* present in\n * the Merkle trie.\n * @param _key Key of the node to search for, as a hex string.\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\n * target node.\n * @param _root Known root of the Merkle trie. Used to verify that the\n * included proof is correctly constructed.\n * @return _verified `true` if the key is absent in the trie, `false` otherwise.\n */\n function verifyExclusionProof(\n bytes memory _key,\n bytes memory _proof,\n bytes32 _root\n )\n internal\n pure\n returns (\n bool _verified\n )\n {\n (\n bool exists,\n ) = get(_key, _proof, _root);\n\n return exists == false;\n }\n\n /**\n * @notice Updates a Merkle trie and returns a new root hash.\n * @param _key Key of the node to update, as a hex string.\n * @param _value Value of the node to update, as a hex string.\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\n * target node. If the key exists, we can simply update the value.\n * Otherwise, we need to modify the trie to handle the new k/v pair.\n * @param _root Known root of the Merkle trie. Used to verify that the\n * included proof is correctly constructed.\n * @return _updatedRoot Root hash of the newly constructed trie.\n */\n function update(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n )\n internal\n pure\n returns (\n bytes32 _updatedRoot\n )\n {\n // Special case when inserting the very first node.\n if (_root == KECCAK256_RLP_NULL_BYTES) {\n return getSingleNodeRootHash(_key, _value);\n }\n\n TrieNode[] memory proof = _parseProof(_proof);\n (uint256 pathLength, bytes memory keyRemainder, ) = _walkNodePath(proof, _key, _root);\n TrieNode[] memory newPath = _getNewPath(proof, pathLength, keyRemainder, _value);\n\n return _getUpdatedTrieRoot(newPath, _key);\n }\n\n /**\n * @notice Retrieves the value associated with a given key.\n * @param _key Key to search for, as hex bytes.\n * @param _proof Merkle trie inclusion proof for the key.\n * @param _root Known root of the Merkle trie.\n * @return _exists Whether or not the key exists.\n * @return _value Value of the key if it exists.\n */\n function get(\n bytes memory _key,\n bytes memory _proof,\n bytes32 _root\n )\n internal\n pure\n returns (\n bool _exists,\n bytes memory _value\n )\n {\n TrieNode[] memory proof = _parseProof(_proof);\n (uint256 pathLength, bytes memory keyRemainder, bool isFinalNode) = _walkNodePath(proof, _key, _root);\n\n bool exists = keyRemainder.length == 0;\n\n require(\n exists || isFinalNode,\n \"Provided proof is invalid.\"\n );\n\n bytes memory value = exists ? _getNodeValue(proof[pathLength - 1]) : bytes('');\n\n return (\n exists,\n value\n );\n }\n\n /**\n * Computes the root hash for a trie with a single node.\n * @param _key Key for the single node.\n * @param _value Value for the single node.\n * @return _updatedRoot Hash of the trie.\n */\n function getSingleNodeRootHash(\n bytes memory _key,\n bytes memory _value\n )\n internal\n pure\n returns (\n bytes32 _updatedRoot\n )\n {\n return keccak256(_makeLeafNode(\n Lib_BytesUtils.toNibbles(_key),\n _value\n ).encoded);\n }\n\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * @notice Walks through a proof using a provided key.\n * @param _proof Inclusion proof to walk through.\n * @param _key Key to use for the walk.\n * @param _root Known root of the trie.\n * @return _pathLength Length of the final path\n * @return _keyRemainder Portion of the key remaining after the walk.\n * @return _isFinalNode Whether or not we've hit a dead end.\n */\n function _walkNodePath(\n TrieNode[] memory _proof,\n bytes memory _key,\n bytes32 _root\n )\n private\n pure\n returns (\n uint256 _pathLength,\n bytes memory _keyRemainder,\n bool _isFinalNode\n )\n {\n uint256 pathLength = 0;\n bytes memory key = Lib_BytesUtils.toNibbles(_key);\n\n bytes32 currentNodeID = _root;\n uint256 currentKeyIndex = 0;\n uint256 currentKeyIncrement = 0;\n TrieNode memory currentNode;\n\n // Proof is top-down, so we start at the first element (root).\n for (uint256 i = 0; i < _proof.length; i++) {\n currentNode = _proof[i];\n currentKeyIndex += currentKeyIncrement;\n\n // Keep track of the proof elements we actually need.\n // It's expensive to resize arrays, so this simply reduces gas costs.\n pathLength += 1;\n\n if (currentKeyIndex == 0) {\n // First proof element is always the root node.\n require(\n keccak256(currentNode.encoded) == currentNodeID,\n \"Invalid root hash\"\n );\n } else if (currentNode.encoded.length >= 32) {\n // Nodes 32 bytes or larger are hashed inside branch nodes.\n require(\n keccak256(currentNode.encoded) == currentNodeID,\n \"Invalid large internal hash\"\n );\n } else {\n // Nodes smaller than 31 bytes aren't hashed.\n require(\n Lib_BytesUtils.toBytes32(currentNode.encoded) == currentNodeID,\n \"Invalid internal node hash\"\n );\n }\n\n if (currentNode.decoded.length == BRANCH_NODE_LENGTH) {\n if (currentKeyIndex == key.length) {\n // We've hit the end of the key, meaning the value should be within this branch node.\n break;\n } else {\n // We're not at the end of the key yet.\n // Figure out what the next node ID should be and continue.\n uint8 branchKey = uint8(key[currentKeyIndex]);\n Lib_RLPReader.RLPItem memory nextNode = currentNode.decoded[branchKey];\n currentNodeID = _getNodeID(nextNode);\n currentKeyIncrement = 1;\n continue;\n }\n } else if (currentNode.decoded.length == LEAF_OR_EXTENSION_NODE_LENGTH) {\n bytes memory path = _getNodePath(currentNode);\n uint8 prefix = uint8(path[0]);\n uint8 offset = 2 - prefix % 2;\n bytes memory pathRemainder = Lib_BytesUtils.slice(path, offset);\n bytes memory keyRemainder = Lib_BytesUtils.slice(key, currentKeyIndex);\n uint256 sharedNibbleLength = _getSharedNibbleLength(pathRemainder, keyRemainder);\n\n if (prefix == PREFIX_LEAF_EVEN || prefix == PREFIX_LEAF_ODD) {\n if (\n pathRemainder.length == sharedNibbleLength &&\n keyRemainder.length == sharedNibbleLength\n ) {\n // The key within this leaf matches our key exactly.\n // Increment the key index to reflect that we have no remainder.\n currentKeyIndex += sharedNibbleLength;\n }\n\n // We've hit a leaf node, so our next node should be NULL.\n currentNodeID = bytes32(RLP_NULL);\n break;\n } else if (prefix == PREFIX_EXTENSION_EVEN || prefix == PREFIX_EXTENSION_ODD) {\n if (sharedNibbleLength == 0) {\n // Our extension node doesn't share any part of our key.\n // We've hit the end of this path, updates will need to modify this extension.\n currentNodeID = bytes32(RLP_NULL);\n break;\n } else {\n // Our extension shares some nibbles.\n // Carry on to the next node.\n currentNodeID = _getNodeID(currentNode.decoded[1]);\n currentKeyIncrement = sharedNibbleLength;\n continue;\n }\n } else {\n revert(\"Received a node with an unknown prefix\");\n }\n } else {\n revert(\"Received an unparseable node.\");\n }\n }\n\n // If our node ID is NULL, then we're at a dead end.\n bool isFinalNode = currentNodeID == bytes32(RLP_NULL);\n return (pathLength, Lib_BytesUtils.slice(key, currentKeyIndex), isFinalNode);\n }\n\n /**\n * @notice Creates new nodes to support a k/v pair insertion into a given\n * Merkle trie path.\n * @param _path Path to the node nearest the k/v pair.\n * @param _pathLength Length of the path. Necessary because the provided\n * path may include additional nodes (e.g., it comes directly from a proof)\n * and we can't resize in-memory arrays without costly duplication.\n * @param _keyRemainder Portion of the initial key that must be inserted\n * into the trie.\n * @param _value Value to insert at the given key.\n * @return _newPath A new path with the inserted k/v pair and extra supporting nodes.\n */\n function _getNewPath(\n TrieNode[] memory _path,\n uint256 _pathLength,\n bytes memory _keyRemainder,\n bytes memory _value\n )\n private\n pure\n returns (\n TrieNode[] memory _newPath\n )\n {\n bytes memory keyRemainder = _keyRemainder;\n\n // Most of our logic depends on the status of the last node in the path.\n TrieNode memory lastNode = _path[_pathLength - 1];\n NodeType lastNodeType = _getNodeType(lastNode);\n\n // Create an array for newly created nodes.\n // We need up to three new nodes, depending on the contents of the last node.\n // Since array resizing is expensive, we'll keep track of the size manually.\n // We're using an explicit `totalNewNodes += 1` after insertions for clarity.\n TrieNode[] memory newNodes = new TrieNode[](3);\n uint256 totalNewNodes = 0;\n\n if (keyRemainder.length == 0 && lastNodeType == NodeType.LeafNode) {\n // We've found a leaf node with the given key.\n // Simply need to update the value of the node to match.\n newNodes[totalNewNodes] = _makeLeafNode(_getNodeKey(lastNode), _value);\n totalNewNodes += 1;\n } else if (lastNodeType == NodeType.BranchNode) {\n if (keyRemainder.length == 0) {\n // We've found a branch node with the given key.\n // Simply need to update the value of the node to match.\n newNodes[totalNewNodes] = _editBranchValue(lastNode, _value);\n totalNewNodes += 1;\n } else {\n // We've found a branch node, but it doesn't contain our key.\n // Reinsert the old branch for now.\n newNodes[totalNewNodes] = lastNode;\n totalNewNodes += 1;\n // Create a new leaf node, slicing our remainder since the first byte points\n // to our branch node.\n newNodes[totalNewNodes] = _makeLeafNode(Lib_BytesUtils.slice(keyRemainder, 1), _value);\n totalNewNodes += 1;\n }\n } else {\n // Our last node is either an extension node or a leaf node with a different key.\n bytes memory lastNodeKey = _getNodeKey(lastNode);\n uint256 sharedNibbleLength = _getSharedNibbleLength(lastNodeKey, keyRemainder);\n\n if (sharedNibbleLength != 0) {\n // We've got some shared nibbles between the last node and our key remainder.\n // We'll need to insert an extension node that covers these shared nibbles.\n bytes memory nextNodeKey = Lib_BytesUtils.slice(lastNodeKey, 0, sharedNibbleLength);\n newNodes[totalNewNodes] = _makeExtensionNode(nextNodeKey, _getNodeHash(_value));\n totalNewNodes += 1;\n\n // Cut down the keys since we've just covered these shared nibbles.\n lastNodeKey = Lib_BytesUtils.slice(lastNodeKey, sharedNibbleLength);\n keyRemainder = Lib_BytesUtils.slice(keyRemainder, sharedNibbleLength);\n }\n\n // Create an empty branch to fill in.\n TrieNode memory newBranch = _makeEmptyBranchNode();\n\n if (lastNodeKey.length == 0) {\n // Key remainder was larger than the key for our last node.\n // The value within our last node is therefore going to be shifted into\n // a branch value slot.\n newBranch = _editBranchValue(newBranch, _getNodeValue(lastNode));\n } else {\n // Last node key was larger than the key remainder.\n // We're going to modify some index of our branch.\n uint8 branchKey = uint8(lastNodeKey[0]);\n // Move on to the next nibble.\n lastNodeKey = Lib_BytesUtils.slice(lastNodeKey, 1);\n\n if (lastNodeType == NodeType.LeafNode) {\n // We're dealing with a leaf node.\n // We'll modify the key and insert the old leaf node into the branch index.\n TrieNode memory modifiedLastNode = _makeLeafNode(lastNodeKey, _getNodeValue(lastNode));\n newBranch = _editBranchIndex(newBranch, branchKey, _getNodeHash(modifiedLastNode.encoded));\n } else if (lastNodeKey.length != 0) {\n // We're dealing with a shrinking extension node.\n // We need to modify the node to decrease the size of the key.\n TrieNode memory modifiedLastNode = _makeExtensionNode(lastNodeKey, _getNodeValue(lastNode));\n newBranch = _editBranchIndex(newBranch, branchKey, _getNodeHash(modifiedLastNode.encoded));\n } else {\n // We're dealing with an unnecessary extension node.\n // We're going to delete the node entirely.\n // Simply insert its current value into the branch index.\n newBranch = _editBranchIndex(newBranch, branchKey, _getNodeValue(lastNode));\n }\n }\n\n if (keyRemainder.length == 0) {\n // We've got nothing left in the key remainder.\n // Simply insert the value into the branch value slot.\n newBranch = _editBranchValue(newBranch, _value);\n // Push the branch into the list of new nodes.\n newNodes[totalNewNodes] = newBranch;\n totalNewNodes += 1;\n } else {\n // We've got some key remainder to work with.\n // We'll be inserting a leaf node into the trie.\n // First, move on to the next nibble.\n keyRemainder = Lib_BytesUtils.slice(keyRemainder, 1);\n // Push the branch into the list of new nodes.\n newNodes[totalNewNodes] = newBranch;\n totalNewNodes += 1;\n // Push a new leaf node for our k/v pair.\n newNodes[totalNewNodes] = _makeLeafNode(keyRemainder, _value);\n totalNewNodes += 1;\n }\n }\n\n // Finally, join the old path with our newly created nodes.\n // Since we're overwriting the last node in the path, we use `_pathLength - 1`.\n return _joinNodeArrays(_path, _pathLength - 1, newNodes, totalNewNodes);\n }\n\n /**\n * @notice Computes the trie root from a given path.\n * @param _nodes Path to some k/v pair.\n * @param _key Key for the k/v pair.\n * @return _updatedRoot Root hash for the updated trie.\n */\n function _getUpdatedTrieRoot(\n TrieNode[] memory _nodes,\n bytes memory _key\n )\n private\n pure\n returns (\n bytes32 _updatedRoot\n )\n {\n bytes memory key = Lib_BytesUtils.toNibbles(_key);\n\n // Some variables to keep track of during iteration.\n TrieNode memory currentNode;\n NodeType currentNodeType;\n bytes memory previousNodeHash;\n\n // Run through the path backwards to rebuild our root hash.\n for (uint256 i = _nodes.length; i > 0; i--) {\n // Pick out the current node.\n currentNode = _nodes[i - 1];\n currentNodeType = _getNodeType(currentNode);\n\n if (currentNodeType == NodeType.LeafNode) {\n // Leaf nodes are already correctly encoded.\n // Shift the key over to account for the nodes key.\n bytes memory nodeKey = _getNodeKey(currentNode);\n key = Lib_BytesUtils.slice(key, 0, key.length - nodeKey.length);\n } else if (currentNodeType == NodeType.ExtensionNode) {\n // Shift the key over to account for the nodes key.\n bytes memory nodeKey = _getNodeKey(currentNode);\n key = Lib_BytesUtils.slice(key, 0, key.length - nodeKey.length);\n\n // If this node is the last element in the path, it'll be correctly encoded\n // and we can skip this part.\n if (previousNodeHash.length > 0) {\n // Re-encode the node based on the previous node.\n currentNode = _makeExtensionNode(nodeKey, previousNodeHash);\n }\n } else if (currentNodeType == NodeType.BranchNode) {\n // If this node is the last element in the path, it'll be correctly encoded\n // and we can skip this part.\n if (previousNodeHash.length > 0) {\n // Re-encode the node based on the previous node.\n uint8 branchKey = uint8(key[key.length - 1]);\n key = Lib_BytesUtils.slice(key, 0, key.length - 1);\n currentNode = _editBranchIndex(currentNode, branchKey, previousNodeHash);\n }\n }\n\n // Compute the node hash for the next iteration.\n previousNodeHash = _getNodeHash(currentNode.encoded);\n }\n\n // Current node should be the root at this point.\n // Simply return the hash of its encoding.\n return keccak256(currentNode.encoded);\n }\n\n /**\n * @notice Parses an RLP-encoded proof into something more useful.\n * @param _proof RLP-encoded proof to parse.\n * @return _parsed Proof parsed into easily accessible structs.\n */\n function _parseProof(\n bytes memory _proof\n )\n private\n pure\n returns (\n TrieNode[] memory _parsed\n )\n {\n Lib_RLPReader.RLPItem[] memory nodes = Lib_RLPReader.readList(_proof);\n TrieNode[] memory proof = new TrieNode[](nodes.length);\n\n for (uint256 i = 0; i < nodes.length; i++) {\n bytes memory encoded = Lib_RLPReader.readBytes(nodes[i]);\n proof[i] = TrieNode({\n encoded: encoded,\n decoded: Lib_RLPReader.readList(encoded)\n });\n }\n\n return proof;\n }\n\n /**\n * @notice Picks out the ID for a node. Node ID is referred to as the\n * \"hash\" within the specification, but nodes < 32 bytes are not actually\n * hashed.\n * @param _node Node to pull an ID for.\n * @return _nodeID ID for the node, depending on the size of its contents.\n */\n function _getNodeID(\n Lib_RLPReader.RLPItem memory _node\n )\n private\n pure\n returns (\n bytes32 _nodeID\n )\n {\n bytes memory nodeID;\n\n if (_node.length < 32) {\n // Nodes smaller than 32 bytes are RLP encoded.\n nodeID = Lib_RLPReader.readRawBytes(_node);\n } else {\n // Nodes 32 bytes or larger are hashed.\n nodeID = Lib_RLPReader.readBytes(_node);\n }\n\n return Lib_BytesUtils.toBytes32(nodeID);\n }\n\n /**\n * @notice Gets the path for a leaf or extension node.\n * @param _node Node to get a path for.\n * @return _path Node path, converted to an array of nibbles.\n */\n function _getNodePath(\n TrieNode memory _node\n )\n private\n pure\n returns (\n bytes memory _path\n )\n {\n return Lib_BytesUtils.toNibbles(Lib_RLPReader.readBytes(_node.decoded[0]));\n }\n\n /**\n * @notice Gets the key for a leaf or extension node. Keys are essentially\n * just paths without any prefix.\n * @param _node Node to get a key for.\n * @return _key Node key, converted to an array of nibbles.\n */\n function _getNodeKey(\n TrieNode memory _node\n )\n private\n pure\n returns (\n bytes memory _key\n )\n {\n return _removeHexPrefix(_getNodePath(_node));\n }\n\n /**\n * @notice Gets the path for a node.\n * @param _node Node to get a value for.\n * @return _value Node value, as hex bytes.\n */\n function _getNodeValue(\n TrieNode memory _node\n )\n private\n pure\n returns (\n bytes memory _value\n )\n {\n return Lib_RLPReader.readBytes(_node.decoded[_node.decoded.length - 1]);\n }\n\n /**\n * @notice Computes the node hash for an encoded node. Nodes < 32 bytes\n * are not hashed, all others are keccak256 hashed.\n * @param _encoded Encoded node to hash.\n * @return _hash Hash of the encoded node. Simply the input if < 32 bytes.\n */\n function _getNodeHash(\n bytes memory _encoded\n )\n private\n pure\n returns (\n bytes memory _hash\n )\n {\n if (_encoded.length < 32) {\n return _encoded;\n } else {\n return abi.encodePacked(keccak256(_encoded));\n }\n }\n\n /**\n * @notice Determines the type for a given node.\n * @param _node Node to determine a type for.\n * @return _type Type of the node; BranchNode/ExtensionNode/LeafNode.\n */\n function _getNodeType(\n TrieNode memory _node\n )\n private\n pure\n returns (\n NodeType _type\n )\n {\n if (_node.decoded.length == BRANCH_NODE_LENGTH) {\n return NodeType.BranchNode;\n } else if (_node.decoded.length == LEAF_OR_EXTENSION_NODE_LENGTH) {\n bytes memory path = _getNodePath(_node);\n uint8 prefix = uint8(path[0]);\n\n if (prefix == PREFIX_LEAF_EVEN || prefix == PREFIX_LEAF_ODD) {\n return NodeType.LeafNode;\n } else if (prefix == PREFIX_EXTENSION_EVEN || prefix == PREFIX_EXTENSION_ODD) {\n return NodeType.ExtensionNode;\n }\n }\n\n revert(\"Invalid node type\");\n }\n\n /**\n * @notice Utility; determines the number of nibbles shared between two\n * nibble arrays.\n * @param _a First nibble array.\n * @param _b Second nibble array.\n * @return _shared Number of shared nibbles.\n */\n function _getSharedNibbleLength(\n bytes memory _a,\n bytes memory _b\n )\n private\n pure\n returns (\n uint256 _shared\n )\n {\n uint256 i = 0;\n while (_a.length > i && _b.length > i && _a[i] == _b[i]) {\n i++;\n }\n return i;\n }\n\n /**\n * @notice Utility; converts an RLP-encoded node into our nice struct.\n * @param _raw RLP-encoded node to convert.\n * @return _node Node as a TrieNode struct.\n */\n function _makeNode(\n bytes[] memory _raw\n )\n private\n pure\n returns (\n TrieNode memory _node\n )\n {\n bytes memory encoded = Lib_RLPWriter.writeList(_raw);\n\n return TrieNode({\n encoded: encoded,\n decoded: Lib_RLPReader.readList(encoded)\n });\n }\n\n /**\n * @notice Utility; converts an RLP-decoded node into our nice struct.\n * @param _items RLP-decoded node to convert.\n * @return _node Node as a TrieNode struct.\n */\n function _makeNode(\n Lib_RLPReader.RLPItem[] memory _items\n )\n private\n pure\n returns (\n TrieNode memory _node\n )\n {\n bytes[] memory raw = new bytes[](_items.length);\n for (uint256 i = 0; i < _items.length; i++) {\n raw[i] = Lib_RLPReader.readRawBytes(_items[i]);\n }\n return _makeNode(raw);\n }\n\n /**\n * @notice Creates a new extension node.\n * @param _key Key for the extension node, unprefixed.\n * @param _value Value for the extension node.\n * @return _node New extension node with the given k/v pair.\n */\n function _makeExtensionNode(\n bytes memory _key,\n bytes memory _value\n )\n private\n pure\n returns (\n TrieNode memory _node\n )\n {\n bytes[] memory raw = new bytes[](2);\n bytes memory key = _addHexPrefix(_key, false);\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\n raw[1] = Lib_RLPWriter.writeBytes(_value);\n return _makeNode(raw);\n }\n\n /**\n * @notice Creates a new leaf node.\n * @dev This function is essentially identical to `_makeExtensionNode`.\n * Although we could route both to a single method with a flag, it's\n * more gas efficient to keep them separate and duplicate the logic.\n * @param _key Key for the leaf node, unprefixed.\n * @param _value Value for the leaf node.\n * @return _node New leaf node with the given k/v pair.\n */\n function _makeLeafNode(\n bytes memory _key,\n bytes memory _value\n )\n private\n pure\n returns (\n TrieNode memory _node\n )\n {\n bytes[] memory raw = new bytes[](2);\n bytes memory key = _addHexPrefix(_key, true);\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\n raw[1] = Lib_RLPWriter.writeBytes(_value);\n return _makeNode(raw);\n }\n\n /**\n * @notice Creates an empty branch node.\n * @return _node Empty branch node as a TrieNode struct.\n */\n function _makeEmptyBranchNode()\n private\n pure\n returns (\n TrieNode memory _node\n )\n {\n bytes[] memory raw = new bytes[](BRANCH_NODE_LENGTH);\n for (uint256 i = 0; i < raw.length; i++) {\n raw[i] = RLP_NULL_BYTES;\n }\n return _makeNode(raw);\n }\n\n /**\n * @notice Modifies the value slot for a given branch.\n * @param _branch Branch node to modify.\n * @param _value Value to insert into the branch.\n * @return _updatedNode Modified branch node.\n */\n function _editBranchValue(\n TrieNode memory _branch,\n bytes memory _value\n )\n private\n pure\n returns (\n TrieNode memory _updatedNode\n )\n {\n bytes memory encoded = Lib_RLPWriter.writeBytes(_value);\n _branch.decoded[_branch.decoded.length - 1] = Lib_RLPReader.toRLPItem(encoded);\n return _makeNode(_branch.decoded);\n }\n\n /**\n * @notice Modifies a slot at an index for a given branch.\n * @param _branch Branch node to modify.\n * @param _index Slot index to modify.\n * @param _value Value to insert into the slot.\n * @return _updatedNode Modified branch node.\n */\n function _editBranchIndex(\n TrieNode memory _branch,\n uint8 _index,\n bytes memory _value\n )\n private\n pure\n returns (\n TrieNode memory _updatedNode\n )\n {\n bytes memory encoded = _value.length < 32 ? _value : Lib_RLPWriter.writeBytes(_value);\n _branch.decoded[_index] = Lib_RLPReader.toRLPItem(encoded);\n return _makeNode(_branch.decoded);\n }\n\n /**\n * @notice Utility; adds a prefix to a key.\n * @param _key Key to prefix.\n * @param _isLeaf Whether or not the key belongs to a leaf.\n * @return _prefixedKey Prefixed key.\n */\n function _addHexPrefix(\n bytes memory _key,\n bool _isLeaf\n )\n private\n pure\n returns (\n bytes memory _prefixedKey\n )\n {\n uint8 prefix = _isLeaf ? uint8(0x02) : uint8(0x00);\n uint8 offset = uint8(_key.length % 2);\n bytes memory prefixed = new bytes(2 - offset);\n prefixed[0] = bytes1(prefix + offset);\n return Lib_BytesUtils.concat(prefixed, _key);\n }\n\n /**\n * @notice Utility; removes a prefix from a path.\n * @param _path Path to remove the prefix from.\n * @return _unprefixedKey Unprefixed key.\n */\n function _removeHexPrefix(\n bytes memory _path\n )\n private\n pure\n returns (\n bytes memory _unprefixedKey\n )\n {\n if (uint8(_path[0]) % 2 == 0) {\n return Lib_BytesUtils.slice(_path, 2);\n } else {\n return Lib_BytesUtils.slice(_path, 1);\n }\n }\n\n /**\n * @notice Utility; combines two node arrays. Array lengths are required\n * because the actual lengths may be longer than the filled lengths.\n * Array resizing is extremely costly and should be avoided.\n * @param _a First array to join.\n * @param _aLength Length of the first array.\n * @param _b Second array to join.\n * @param _bLength Length of the second array.\n * @return _joined Combined node array.\n */\n function _joinNodeArrays(\n TrieNode[] memory _a,\n uint256 _aLength,\n TrieNode[] memory _b,\n uint256 _bLength\n )\n private\n pure\n returns (\n TrieNode[] memory _joined\n )\n {\n TrieNode[] memory ret = new TrieNode[](_aLength + _bLength);\n\n // Copy elements from the first array.\n for (uint256 i = 0; i < _aLength; i++) {\n ret[i] = _a[i];\n }\n\n // Copy elements from the second array.\n for (uint256 i = 0; i < _bLength; i++) {\n ret[i + _aLength] = _b[i];\n }\n\n return ret;\n }\n}\n" - }, - "contracts/optimistic-ethereum/OVM/verification/OVM_StateTransitionerFactory.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.7.0;\n\n/* Library Imports */\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/* Interface Imports */\nimport { iOVM_StateTransitioner } from \"../../iOVM/verification/iOVM_StateTransitioner.sol\";\nimport { iOVM_StateTransitionerFactory } from \"../../iOVM/verification/iOVM_StateTransitionerFactory.sol\";\nimport { iOVM_FraudVerifier } from \"../../iOVM/verification/iOVM_FraudVerifier.sol\";\n\n/* Contract Imports */\nimport { OVM_StateTransitioner } from \"./OVM_StateTransitioner.sol\";\n\n/**\n * @title OVM_StateTransitionerFactory\n */\ncontract OVM_StateTransitionerFactory is iOVM_StateTransitionerFactory, Lib_AddressResolver {\n\n constructor( address _libAddressManager)\n Lib_AddressResolver(_libAddressManager){}\n\n /***************************************\n * Public Functions: Contract Creation *\n ***************************************/\n\n /**\n * Creates a new OVM_StateTransitioner\n * @param _libAddressManager Address of the Address Manager.\n * @param _stateTransitionIndex Index of the state transition being verified.\n * @param _preStateRoot State root before the transition was executed.\n * @param _transactionHash Hash of the executed transaction.\n * @return _ovmStateTransitioner New OVM_StateTransitioner instance.\n */\n function create(\n address _libAddressManager,\n uint256 _stateTransitionIndex,\n bytes32 _preStateRoot,\n bytes32 _transactionHash\n )\n override\n public\n returns (\n iOVM_StateTransitioner _ovmStateTransitioner\n )\n {\n require(\n msg.sender == resolve(\"OVM_FraudVerifier\"),\n \"Create can only be done by the OVM_FraudVerifier.\"\n );\n return new OVM_StateTransitioner(\n _libAddressManager,\n _stateTransitionIndex,\n _preStateRoot,\n _transactionHash\n );\n }\n}\n" - }, - "contracts/optimistic-ethereum/iOVM/verification/iOVM_StateTransitionerFactory.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Contract Imports */\nimport { iOVM_StateTransitioner } from \"./iOVM_StateTransitioner.sol\";\n\n/**\n * @title iOVM_StateTransitionerFactory\n */\ninterface iOVM_StateTransitionerFactory {\n\n /***************************************\n * Public Functions: Contract Creation *\n ***************************************/\n\n function create(\n address _proxyManager,\n uint256 _stateTransitionIndex,\n bytes32 _preStateRoot,\n bytes32 _transactionHash\n )\n external\n returns (\n iOVM_StateTransitioner _ovmStateTransitioner\n );\n}\n" - }, - "contracts/optimistic-ethereum/iOVM/verification/iOVM_FraudVerifier.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/* Interface Imports */\nimport { iOVM_StateTransitioner } from \"./iOVM_StateTransitioner.sol\";\n\n/**\n * @title iOVM_FraudVerifier\n */\ninterface iOVM_FraudVerifier {\n\n /**********\n * Events *\n **********/\n\n event FraudProofInitialized(\n bytes32 _preStateRoot,\n uint256 _preStateRootIndex,\n bytes32 _transactionHash,\n address _who\n );\n\n event FraudProofFinalized(\n bytes32 _preStateRoot,\n uint256 _preStateRootIndex,\n bytes32 _transactionHash,\n address _who\n );\n\n\n /***************************************\n * Public Functions: Transition Status *\n ***************************************/\n\n function getStateTransitioner(bytes32 _preStateRoot, bytes32 _txHash) external view returns (iOVM_StateTransitioner _transitioner);\n\n\n /****************************************\n * Public Functions: Fraud Verification *\n ****************************************/\n\n function initializeFraudVerification(\n bytes32 _preStateRoot,\n Lib_OVMCodec.ChainBatchHeader calldata _preStateRootBatchHeader,\n Lib_OVMCodec.ChainInclusionProof calldata _preStateRootProof,\n Lib_OVMCodec.Transaction calldata _transaction,\n Lib_OVMCodec.TransactionChainElement calldata _txChainElement,\n Lib_OVMCodec.ChainBatchHeader calldata _transactionBatchHeader,\n Lib_OVMCodec.ChainInclusionProof calldata _transactionProof\n ) external;\n\n function finalizeFraudVerification(\n bytes32 _preStateRoot,\n Lib_OVMCodec.ChainBatchHeader calldata _preStateRootBatchHeader,\n Lib_OVMCodec.ChainInclusionProof calldata _preStateRootProof,\n bytes32 _txHash,\n bytes32 _postStateRoot,\n Lib_OVMCodec.ChainBatchHeader calldata _postStateRootBatchHeader,\n Lib_OVMCodec.ChainInclusionProof calldata _postStateRootProof\n ) external;\n}\n" - }, - "contracts/optimistic-ethereum/OVM/verification/OVM_FraudVerifier.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.7.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/* Interface Imports */\nimport { iOVM_FraudVerifier } from \"../../iOVM/verification/iOVM_FraudVerifier.sol\";\nimport { iOVM_StateTransitioner } from \"../../iOVM/verification/iOVM_StateTransitioner.sol\";\nimport { iOVM_StateTransitionerFactory } from \"../../iOVM/verification/iOVM_StateTransitionerFactory.sol\";\nimport { iOVM_BondManager } from \"../../iOVM/verification/iOVM_BondManager.sol\";\nimport { iOVM_StateCommitmentChain } from \"../../iOVM/chain/iOVM_StateCommitmentChain.sol\";\nimport { iOVM_CanonicalTransactionChain } from \"../../iOVM/chain/iOVM_CanonicalTransactionChain.sol\";\n\n/* Contract Imports */\nimport { OVM_FraudContributor } from \"./OVM_FraudContributor.sol\";\n\ncontract OVM_FraudVerifier is Lib_AddressResolver, OVM_FraudContributor, iOVM_FraudVerifier {\n\n /*******************************************\n * Contract Variables: Internal Accounting *\n *******************************************/\n\n mapping (bytes32 => iOVM_StateTransitioner) internal transitioners;\n\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n constructor(\n address _libAddressManager\n )\n Lib_AddressResolver(_libAddressManager)\n {}\n\n\n /***************************************\n * Public Functions: Transition Status *\n ***************************************/\n\n /**\n * Retrieves the state transitioner for a given root.\n * @param _preStateRoot State root to query a transitioner for.\n * @return _transitioner Corresponding state transitioner contract.\n */\n function getStateTransitioner(\n bytes32 _preStateRoot,\n bytes32 _txHash\n )\n override\n public\n view\n returns (\n iOVM_StateTransitioner _transitioner\n )\n {\n return transitioners[keccak256(abi.encodePacked(_preStateRoot, _txHash))];\n }\n\n\n /****************************************\n * Public Functions: Fraud Verification *\n ****************************************/\n\n /**\n * Begins the fraud verification process.\n * @param _preStateRoot State root before the fraudulent transaction.\n * @param _preStateRootBatchHeader Batch header for the provided pre-state root.\n * @param _preStateRootProof Inclusion proof for the provided pre-state root.\n * @param _transaction OVM transaction claimed to be fraudulent.\n * @param _txChainElement OVM transaction chain element.\n * @param _transactionBatchHeader Batch header for the provided transaction.\n * @param _transactionProof Inclusion proof for the provided transaction.\n */\n function initializeFraudVerification(\n bytes32 _preStateRoot,\n Lib_OVMCodec.ChainBatchHeader memory _preStateRootBatchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _preStateRootProof,\n Lib_OVMCodec.Transaction memory _transaction,\n Lib_OVMCodec.TransactionChainElement memory _txChainElement,\n Lib_OVMCodec.ChainBatchHeader memory _transactionBatchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _transactionProof\n )\n override\n public\n contributesToFraudProof(_preStateRoot, Lib_OVMCodec.hashTransaction(_transaction))\n {\n bytes32 _txHash = Lib_OVMCodec.hashTransaction(_transaction);\n\n if (_hasStateTransitioner(_preStateRoot, _txHash)) {\n return;\n }\n\n iOVM_StateCommitmentChain ovmStateCommitmentChain = iOVM_StateCommitmentChain(resolve(\"OVM_StateCommitmentChain\"));\n iOVM_CanonicalTransactionChain ovmCanonicalTransactionChain = iOVM_CanonicalTransactionChain(resolve(\"OVM_CanonicalTransactionChain\"));\n\n require(\n ovmStateCommitmentChain.verifyStateCommitment(\n _preStateRoot,\n _preStateRootBatchHeader,\n _preStateRootProof\n ),\n \"Invalid pre-state root inclusion proof.\"\n );\n\n require(\n ovmCanonicalTransactionChain.verifyTransaction(\n _transaction,\n _txChainElement,\n _transactionBatchHeader,\n _transactionProof\n ),\n \"Invalid transaction inclusion proof.\"\n );\n\n require (\n _preStateRootBatchHeader.prevTotalElements + _preStateRootProof.index + 1 == _transactionBatchHeader.prevTotalElements + _transactionProof.index,\n \"Pre-state root global index must equal to the transaction root global index.\"\n );\n\n _deployTransitioner(_preStateRoot, _txHash, _preStateRootProof.index);\n\n emit FraudProofInitialized(\n _preStateRoot,\n _preStateRootProof.index,\n _txHash,\n msg.sender\n );\n }\n\n /**\n * Finalizes the fraud verification process.\n * @param _preStateRoot State root before the fraudulent transaction.\n * @param _preStateRootBatchHeader Batch header for the provided pre-state root.\n * @param _preStateRootProof Inclusion proof for the provided pre-state root.\n * @param _txHash The transaction for the state root\n * @param _postStateRoot State root after the fraudulent transaction.\n * @param _postStateRootBatchHeader Batch header for the provided post-state root.\n * @param _postStateRootProof Inclusion proof for the provided post-state root.\n */\n function finalizeFraudVerification(\n bytes32 _preStateRoot,\n Lib_OVMCodec.ChainBatchHeader memory _preStateRootBatchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _preStateRootProof,\n bytes32 _txHash,\n bytes32 _postStateRoot,\n Lib_OVMCodec.ChainBatchHeader memory _postStateRootBatchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _postStateRootProof\n )\n override\n public\n contributesToFraudProof(_preStateRoot, _txHash)\n {\n iOVM_StateTransitioner transitioner = getStateTransitioner(_preStateRoot, _txHash);\n iOVM_StateCommitmentChain ovmStateCommitmentChain = iOVM_StateCommitmentChain(resolve(\"OVM_StateCommitmentChain\"));\n iOVM_BondManager ovmBondManager = iOVM_BondManager(resolve(\"OVM_BondManager\"));\n\n require(\n transitioner.isComplete() == true,\n \"State transition process must be completed prior to finalization.\"\n );\n\n require (\n _postStateRootBatchHeader.prevTotalElements + _postStateRootProof.index == _preStateRootBatchHeader.prevTotalElements + _preStateRootProof.index + 1,\n \"Post-state root global index must equal to the pre state root global index plus one.\"\n );\n\n require(\n ovmStateCommitmentChain.verifyStateCommitment(\n _preStateRoot,\n _preStateRootBatchHeader,\n _preStateRootProof\n ),\n \"Invalid pre-state root inclusion proof.\"\n );\n\n require(\n ovmStateCommitmentChain.verifyStateCommitment(\n _postStateRoot,\n _postStateRootBatchHeader,\n _postStateRootProof\n ),\n \"Invalid post-state root inclusion proof.\"\n );\n\n // If the post state root did not match, then there was fraud and we should delete the batch\n require(\n _postStateRoot != transitioner.getPostStateRoot(),\n \"State transition has not been proven fraudulent.\"\n );\n \n _cancelStateTransition(_postStateRootBatchHeader, _preStateRoot);\n\n // TEMPORARY: Remove the transitioner; for minnet.\n transitioners[keccak256(abi.encodePacked(_preStateRoot, _txHash))] = iOVM_StateTransitioner(0x0000000000000000000000000000000000000000);\n\n emit FraudProofFinalized(\n _preStateRoot,\n _preStateRootProof.index,\n _txHash,\n msg.sender\n );\n }\n\n\n /************************************\n * Internal Functions: Verification *\n ************************************/\n\n /**\n * Checks whether a transitioner already exists for a given pre-state root.\n * @param _preStateRoot Pre-state root to check.\n * @return _exists Whether or not we already have a transitioner for the root.\n */\n function _hasStateTransitioner(\n bytes32 _preStateRoot,\n bytes32 _txHash\n )\n internal\n view\n returns (\n bool _exists\n )\n {\n return address(getStateTransitioner(_preStateRoot, _txHash)) != address(0);\n }\n\n /**\n * Deploys a new state transitioner.\n * @param _preStateRoot Pre-state root to initialize the transitioner with.\n * @param _txHash Hash of the transaction this transitioner will execute.\n * @param _stateTransitionIndex Index of the transaction in the chain.\n */\n function _deployTransitioner(\n bytes32 _preStateRoot,\n bytes32 _txHash,\n uint256 _stateTransitionIndex\n )\n internal\n {\n transitioners[keccak256(abi.encodePacked(_preStateRoot, _txHash))] = iOVM_StateTransitionerFactory(\n resolve(\"OVM_StateTransitionerFactory\")\n ).create(\n address(libAddressManager),\n _stateTransitionIndex,\n _preStateRoot,\n _txHash\n );\n }\n\n /**\n * Removes a state transition from the state commitment chain.\n * @param _postStateRootBatchHeader Header for the post-state root.\n * @param _preStateRoot Pre-state root hash.\n */\n function _cancelStateTransition(\n Lib_OVMCodec.ChainBatchHeader memory _postStateRootBatchHeader,\n bytes32 _preStateRoot\n )\n internal\n {\n iOVM_StateCommitmentChain ovmStateCommitmentChain = iOVM_StateCommitmentChain(resolve(\"OVM_StateCommitmentChain\"));\n iOVM_BondManager ovmBondManager = iOVM_BondManager(resolve(\"OVM_BondManager\"));\n\n // Delete the state batch.\n ovmStateCommitmentChain.deleteStateBatch(\n _postStateRootBatchHeader\n );\n\n // Get the timestamp and publisher for that block.\n (uint256 timestamp, address publisher) = abi.decode(_postStateRootBatchHeader.extraData, (uint256, address));\n\n // Slash the bonds at the bond manager.\n ovmBondManager.finalize(\n _preStateRoot,\n publisher,\n timestamp\n );\n }\n}\n" - }, - "contracts/optimistic-ethereum/iOVM/chain/iOVM_StateCommitmentChain.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/**\n * @title iOVM_StateCommitmentChain\n */\ninterface iOVM_StateCommitmentChain {\n\n /**********\n * Events *\n **********/\n\n event StateBatchAppended(\n uint256 indexed _batchIndex,\n bytes32 _batchRoot,\n uint256 _batchSize,\n uint256 _prevTotalElements,\n bytes _extraData\n );\n\n event StateBatchDeleted(\n uint256 indexed _batchIndex,\n bytes32 _batchRoot\n );\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Retrieves the total number of elements submitted.\n * @return _totalElements Total submitted elements.\n */\n function getTotalElements()\n external\n view\n returns (\n uint256 _totalElements\n );\n\n /**\n * Retrieves the total number of batches submitted.\n * @return _totalBatches Total submitted batches.\n */\n function getTotalBatches()\n external\n view\n returns (\n uint256 _totalBatches\n );\n\n /**\n * Retrieves the timestamp of the last batch submitted by the sequencer.\n * @return _lastSequencerTimestamp Last sequencer batch timestamp.\n */\n function getLastSequencerTimestamp()\n external\n view\n returns (\n uint256 _lastSequencerTimestamp\n );\n\n /**\n * Appends a batch of state roots to the chain.\n * @param _batch Batch of state roots.\n * @param _shouldStartAtElement Index of the element at which this batch should start.\n */\n function appendStateBatch(\n bytes32[] calldata _batch,\n uint256 _shouldStartAtElement\n )\n external;\n\n /**\n * Deletes all state roots after (and including) a given batch.\n * @param _batchHeader Header of the batch to start deleting from.\n */\n function deleteStateBatch(\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\n )\n external;\n\n /**\n * Verifies a batch inclusion proof.\n * @param _element Hash of the element to verify a proof for.\n * @param _batchHeader Header of the batch in which the element was included.\n * @param _proof Merkle inclusion proof for the element.\n */\n function verifyStateCommitment(\n bytes32 _element,\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _proof\n )\n external\n view\n returns (\n bool _verified\n );\n\n /**\n * Checks whether a given batch is still inside its fraud proof window.\n * @param _batchHeader Header of the batch to check.\n * @return _inside Whether or not the batch is inside the fraud proof window.\n */\n function insideFraudProofWindow(\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\n )\n external\n view\n returns (\n bool _inside\n );\n}\n" - }, - "contracts/optimistic-ethereum/iOVM/chain/iOVM_CanonicalTransactionChain.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/**\n * @title iOVM_CanonicalTransactionChain\n */\ninterface iOVM_CanonicalTransactionChain {\n\n /**********\n * Events *\n **********/\n\n event TransactionEnqueued(\n address _l1TxOrigin,\n address _target,\n uint256 _gasLimit,\n bytes _data,\n uint256 _queueIndex,\n uint256 _timestamp\n );\n\n event QueueBatchAppended(\n uint256 _startingQueueIndex,\n uint256 _numQueueElements,\n uint256 _totalElements\n );\n\n event SequencerBatchAppended(\n uint256 _startingQueueIndex,\n uint256 _numQueueElements,\n uint256 _totalElements\n );\n\n event TransactionBatchAppended(\n uint256 indexed _batchIndex,\n bytes32 _batchRoot,\n uint256 _batchSize,\n uint256 _prevTotalElements,\n bytes _extraData\n );\n\n\n /***********\n * Structs *\n ***********/\n\n struct BatchContext {\n uint256 numSequencedTransactions;\n uint256 numSubsequentQueueTransactions;\n uint256 timestamp;\n uint256 blockNumber;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Retrieves the total number of elements submitted.\n * @return _totalElements Total submitted elements.\n */\n function getTotalElements()\n external\n view\n returns (\n uint256 _totalElements\n );\n\n /**\n * Retrieves the total number of batches submitted.\n * @return _totalBatches Total submitted batches.\n */\n function getTotalBatches()\n external\n view\n returns (\n uint256 _totalBatches\n );\n\n /**\n * Returns the index of the next element to be enqueued.\n * @return Index for the next queue element.\n */\n function getNextQueueIndex()\n external\n view\n returns (\n uint40\n );\n\n /**\n * Get the number of queue elements which have not yet been included.\n * @return Length of the queue.\n */\n function getNumPendingQueueElements()\n external\n view\n returns (\n uint40\n );\n\n /**\n * Retrieves the length of the queue, including\n * both pending and canonical transactions.\n * @return Length of the queue.\n */\n function getQueueLength()\n external\n view\n returns (\n uint40\n );\n\n /**\n * Gets the queue element at a particular index.\n * @param _index Index of the queue element to access.\n * @return _element Queue element at the given index.\n */\n function getQueueElement(\n uint256 _index\n )\n external\n view\n returns (\n Lib_OVMCodec.QueueElement memory _element\n );\n\n /**\n * Adds a transaction to the queue.\n * @param _target Target contract to send the transaction to.\n * @param _gasLimit Gas limit for the given transaction.\n * @param _data Transaction data.\n */\n function enqueue(\n address _target,\n uint256 _gasLimit,\n bytes memory _data\n )\n external;\n\n /**\n * Appends a given number of queued transactions as a single batch.\n * @param _numQueuedTransactions Number of transactions to append.\n */\n function appendQueueBatch(\n uint256 _numQueuedTransactions\n )\n external;\n\n /**\n * Allows the sequencer to append a batch of transactions.\n * @dev This function uses a custom encoding scheme for efficiency reasons.\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\n * .param _contexts Array of batch contexts.\n * .param _transactionDataFields Array of raw transaction data.\n */\n function appendSequencerBatch(\n // uint40 _shouldStartAtElement,\n // uint24 _totalElementsToAppend,\n // BatchContext[] _contexts,\n // bytes[] _transactionDataFields\n )\n external;\n\n /**\n * Verifies whether a transaction is included in the chain.\n * @param _transaction Transaction to verify.\n * @param _txChainElement Transaction chain element corresponding to the transaction.\n * @param _batchHeader Header of the batch the transaction was included in.\n * @param _inclusionProof Inclusion proof for the provided transaction chain element.\n * @return True if the transaction exists in the CTC, false if not.\n */\n function verifyTransaction(\n Lib_OVMCodec.Transaction memory _transaction,\n Lib_OVMCodec.TransactionChainElement memory _txChainElement,\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _inclusionProof\n )\n external\n view\n returns (\n bool\n );\n}\n" - }, - "contracts/optimistic-ethereum/OVM/verification/OVM_BondManager.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.7.0;\n\n/* Library Imports */\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/* Interface Imports */\nimport { iOVM_BondManager, Errors, ERC20 } from \"../../iOVM/verification/iOVM_BondManager.sol\";\nimport { iOVM_FraudVerifier } from \"../../iOVM/verification/iOVM_FraudVerifier.sol\";\n\n/**\n * @title OVM_BondManager\n */\ncontract OVM_BondManager is iOVM_BondManager, Lib_AddressResolver {\n\n /****************************\n * Constants and Parameters *\n ****************************/\n\n /// The period to find the earliest fraud proof for a publisher\n uint256 public constant multiFraudProofPeriod = 7 days;\n\n /// The dispute period\n uint256 public constant disputePeriodSeconds = 7 days;\n\n /// The minimum collateral a sequencer must post\n uint256 public constant requiredCollateral = 1 ether;\n\n\n /*******************************************\n * Contract Variables: Contract References *\n *******************************************/\n\n /// The bond token\n ERC20 immutable public token;\n\n\n /********************************************\n * Contract Variables: Internal Accounting *\n *******************************************/\n\n /// The bonds posted by each proposer\n mapping(address => Bond) public bonds;\n\n /// For each pre-state root, there's an array of witnessProviders that must be rewarded\n /// for posting witnesses\n mapping(bytes32 => Rewards) public witnessProviders;\n\n\n /***************\n * Constructor *\n ***************/\n\n /// Initializes with a ERC20 token to be used for the fidelity bonds\n /// and with the Address Manager\n constructor(ERC20 _token, address _libAddressManager)\n Lib_AddressResolver(_libAddressManager)\n {\n token = _token;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n /// Adds `who` to the list of witnessProviders for the provided `preStateRoot`.\n function recordGasSpent(bytes32 _preStateRoot, bytes32 _txHash, address who, uint256 gasSpent) override public {\n // The sender must be the transitioner that corresponds to the claimed pre-state root\n address transitioner = address(iOVM_FraudVerifier(resolve(\"OVM_FraudVerifier\")).getStateTransitioner(_preStateRoot, _txHash));\n require(transitioner == msg.sender, Errors.ONLY_TRANSITIONER);\n\n witnessProviders[_preStateRoot].total += gasSpent;\n witnessProviders[_preStateRoot].gasSpent[who] += gasSpent;\n }\n\n /// Slashes + distributes rewards or frees up the sequencer's bond, only called by\n /// `FraudVerifier.finalizeFraudVerification`\n function finalize(bytes32 _preStateRoot, address publisher, uint256 timestamp) override public {\n require(msg.sender == resolve(\"OVM_FraudVerifier\"), Errors.ONLY_FRAUD_VERIFIER);\n require(witnessProviders[_preStateRoot].canClaim == false, Errors.ALREADY_FINALIZED);\n\n // allow users to claim from that state root's\n // pool of collateral (effectively slashing the sequencer)\n witnessProviders[_preStateRoot].canClaim = true;\n\n Bond storage bond = bonds[publisher];\n if (bond.firstDisputeAt == 0) {\n bond.firstDisputeAt = block.timestamp;\n bond.earliestDisputedStateRoot = _preStateRoot;\n bond.earliestTimestamp = timestamp;\n } else if (\n // only update the disputed state root for the publisher if it's within\n // the dispute period _and_ if it's before the previous one\n block.timestamp < bond.firstDisputeAt + multiFraudProofPeriod &&\n timestamp < bond.earliestTimestamp\n ) {\n bond.earliestDisputedStateRoot = _preStateRoot;\n bond.earliestTimestamp = timestamp;\n }\n\n // if the fraud proof's dispute period does not intersect with the \n // withdrawal's timestamp, then the user should not be slashed\n // e.g if a user at day 10 submits a withdrawal, and a fraud proof\n // from day 1 gets published, the user won't be slashed since day 8 (1d + 7d)\n // is before the user started their withdrawal. on the contrary, if the user\n // had started their withdrawal at, say, day 6, they would be slashed\n if (\n bond.withdrawalTimestamp != 0 && \n uint256(bond.withdrawalTimestamp) > timestamp + disputePeriodSeconds &&\n bond.state == State.WITHDRAWING\n ) {\n return;\n }\n\n // slash!\n bond.state = State.NOT_COLLATERALIZED;\n }\n\n /// Sequencers call this function to post collateral which will be used for\n /// the `appendBatch` call\n function deposit() override public {\n require(\n token.transferFrom(msg.sender, address(this), requiredCollateral),\n Errors.ERC20_ERR\n );\n\n // This cannot overflow\n bonds[msg.sender].state = State.COLLATERALIZED;\n }\n\n /// Starts the withdrawal for a publisher\n function startWithdrawal() override public {\n Bond storage bond = bonds[msg.sender];\n require(bond.withdrawalTimestamp == 0, Errors.WITHDRAWAL_PENDING);\n require(bond.state == State.COLLATERALIZED, Errors.WRONG_STATE);\n\n bond.state = State.WITHDRAWING;\n bond.withdrawalTimestamp = uint32(block.timestamp);\n }\n\n /// Finalizes a pending withdrawal from a publisher\n function finalizeWithdrawal() override public {\n Bond storage bond = bonds[msg.sender];\n\n require(\n block.timestamp >= uint256(bond.withdrawalTimestamp) + disputePeriodSeconds, \n Errors.TOO_EARLY\n );\n require(bond.state == State.WITHDRAWING, Errors.SLASHED);\n \n // refunds!\n bond.state = State.NOT_COLLATERALIZED;\n bond.withdrawalTimestamp = 0;\n \n require(\n token.transfer(msg.sender, requiredCollateral),\n Errors.ERC20_ERR\n );\n }\n\n /// Claims the user's reward for the witnesses they provided for the earliest\n /// disputed state root of the designated publisher\n function claim(address who) override public {\n Bond storage bond = bonds[who];\n require(\n block.timestamp >= bond.firstDisputeAt + multiFraudProofPeriod,\n Errors.WAIT_FOR_DISPUTES\n );\n\n // reward the earliest state root for this publisher\n bytes32 _preStateRoot = bond.earliestDisputedStateRoot;\n Rewards storage rewards = witnessProviders[_preStateRoot];\n\n // only allow claiming if fraud was proven in `finalize`\n require(rewards.canClaim, Errors.CANNOT_CLAIM);\n\n // proportional allocation - only reward 50% (rest gets locked in the\n // contract forever\n uint256 amount = (requiredCollateral * rewards.gasSpent[msg.sender]) / (2 * rewards.total);\n\n // reset the user's spent gas so they cannot double claim\n rewards.gasSpent[msg.sender] = 0;\n\n // transfer\n require(token.transfer(msg.sender, amount), Errors.ERC20_ERR);\n }\n\n /// Checks if the user is collateralized\n function isCollateralized(address who) override public view returns (bool) {\n return bonds[who].state == State.COLLATERALIZED;\n }\n\n /// Gets how many witnesses the user has provided for the state root\n function getGasSpent(bytes32 preStateRoot, address who) override public view returns (uint256) {\n return witnessProviders[preStateRoot].gasSpent[who];\n }\n}\n" - }, - "contracts/test-helpers/Mock_FraudVerifier.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.7.0;\n\nimport { OVM_BondManager } from \"./../optimistic-ethereum/OVM/verification/OVM_BondManager.sol\";\n\ncontract Mock_FraudVerifier {\n OVM_BondManager bondManager;\n\n mapping (bytes32 => address) transitioners;\n\n function setBondManager(OVM_BondManager _bondManager) public {\n bondManager = _bondManager;\n }\n\n function setStateTransitioner(bytes32 preStateRoot, bytes32 txHash, address addr) public {\n transitioners[keccak256(abi.encodePacked(preStateRoot, txHash))] = addr;\n }\n\n function getStateTransitioner(\n bytes32 _preStateRoot,\n bytes32 _txHash\n )\n public\n view\n returns (\n address\n )\n {\n return transitioners[keccak256(abi.encodePacked(_preStateRoot, _txHash))];\n }\n\n function finalize(bytes32 _preStateRoot, address publisher, uint256 timestamp) public {\n bondManager.finalize(_preStateRoot, publisher, timestamp);\n }\n}\n" - }, - "contracts/optimistic-ethereum/OVM/chain/OVM_StateCommitmentChain.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.7.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\nimport { Lib_MerkleTree } from \"../../libraries/utils/Lib_MerkleTree.sol\";\n\n/* Interface Imports */\nimport { iOVM_FraudVerifier } from \"../../iOVM/verification/iOVM_FraudVerifier.sol\";\nimport { iOVM_StateCommitmentChain } from \"../../iOVM/chain/iOVM_StateCommitmentChain.sol\";\nimport { iOVM_CanonicalTransactionChain } from \"../../iOVM/chain/iOVM_CanonicalTransactionChain.sol\";\nimport { iOVM_BondManager } from \"../../iOVM/verification/iOVM_BondManager.sol\";\nimport { iOVM_ChainStorageContainer } from \"../../iOVM/chain/iOVM_ChainStorageContainer.sol\";\n\n/* External Imports */\nimport '@openzeppelin/contracts/math/SafeMath.sol';\n\n/**\n * @title OVM_StateCommitmentChain\n */\ncontract OVM_StateCommitmentChain is iOVM_StateCommitmentChain, Lib_AddressResolver {\n\n /*************\n * Constants *\n *************/\n\n uint256 public FRAUD_PROOF_WINDOW;\n uint256 public SEQUENCER_PUBLISH_WINDOW;\n\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n constructor(\n address _libAddressManager,\n uint256 _fraudProofWindow,\n uint256 _sequencerPublishWindow\n )\n Lib_AddressResolver(_libAddressManager)\n {\n FRAUD_PROOF_WINDOW = _fraudProofWindow;\n SEQUENCER_PUBLISH_WINDOW = _sequencerPublishWindow;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Accesses the batch storage container.\n * @return Reference to the batch storage container.\n */\n function batches()\n public\n view\n returns (\n iOVM_ChainStorageContainer\n )\n {\n return iOVM_ChainStorageContainer(\n resolve(\"OVM_ChainStorageContainer:SCC:batches\")\n );\n }\n\n /**\n * @inheritdoc iOVM_StateCommitmentChain\n */\n function getTotalElements()\n override\n public\n view\n returns (\n uint256 _totalElements\n )\n {\n (uint40 totalElements, ) = _getBatchExtraData();\n return uint256(totalElements);\n }\n\n /**\n * @inheritdoc iOVM_StateCommitmentChain\n */\n function getTotalBatches()\n override\n public\n view\n returns (\n uint256 _totalBatches\n )\n {\n return batches().length();\n }\n\n /**\n * @inheritdoc iOVM_StateCommitmentChain\n */\n function getLastSequencerTimestamp()\n override\n public\n view\n returns (\n uint256 _lastSequencerTimestamp\n )\n {\n (, uint40 lastSequencerTimestamp) = _getBatchExtraData();\n return uint256(lastSequencerTimestamp);\n }\n\n /**\n * @inheritdoc iOVM_StateCommitmentChain\n */\n function appendStateBatch(\n bytes32[] memory _batch,\n uint256 _shouldStartAtElement\n )\n override\n public\n {\n // Fail fast in to make sure our batch roots aren't accidentally made fraudulent by the\n // publication of batches by some other user.\n require(\n _shouldStartAtElement == getTotalElements(),\n \"Actual batch start index does not match expected start index.\"\n );\n\n // Proposers must have previously staked at the BondManager\n require(\n iOVM_BondManager(resolve(\"OVM_BondManager\")).isCollateralized(msg.sender),\n \"Proposer does not have enough collateral posted\"\n );\n\n require(\n _batch.length > 0,\n \"Cannot submit an empty state batch.\"\n );\n\n require(\n getTotalElements() + _batch.length <= iOVM_CanonicalTransactionChain(resolve(\"OVM_CanonicalTransactionChain\")).getTotalElements(),\n \"Number of state roots cannot exceed the number of canonical transactions.\"\n );\n\n // Pass the block's timestamp and the publisher of the data\n // to be used in the fraud proofs\n _appendBatch(\n _batch,\n abi.encode(block.timestamp, msg.sender)\n );\n }\n\n /**\n * @inheritdoc iOVM_StateCommitmentChain\n */\n function deleteStateBatch(\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\n )\n override\n public\n {\n require(\n msg.sender == resolve(\"OVM_FraudVerifier\"),\n \"State batches can only be deleted by the OVM_FraudVerifier.\"\n );\n\n require(\n _isValidBatchHeader(_batchHeader),\n \"Invalid batch header.\"\n );\n\n require(\n insideFraudProofWindow(_batchHeader),\n \"State batches can only be deleted within the fraud proof window.\"\n );\n\n _deleteBatch(_batchHeader);\n }\n\n /**\n * @inheritdoc iOVM_StateCommitmentChain\n */\n function verifyStateCommitment(\n bytes32 _element,\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _proof\n )\n override\n public\n view\n returns (\n bool\n )\n {\n require(\n _isValidBatchHeader(_batchHeader),\n \"Invalid batch header.\"\n );\n\n require(\n Lib_MerkleTree.verify(\n _batchHeader.batchRoot,\n _element,\n _proof.index,\n _proof.siblings,\n _batchHeader.batchSize\n ),\n \"Invalid inclusion proof.\"\n );\n\n return true;\n }\n\n /**\n * @inheritdoc iOVM_StateCommitmentChain\n */\n function insideFraudProofWindow(\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\n )\n override\n public\n view\n returns (\n bool _inside\n )\n {\n (uint256 timestamp,) = abi.decode(\n _batchHeader.extraData,\n (uint256, address)\n );\n\n require(\n timestamp != 0,\n \"Batch header timestamp cannot be zero\"\n );\n return SafeMath.add(timestamp, FRAUD_PROOF_WINDOW) > block.timestamp;\n }\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Parses the batch context from the extra data.\n * @return Total number of elements submitted.\n * @return Timestamp of the last batch submitted by the sequencer.\n */\n function _getBatchExtraData()\n internal\n view\n returns (\n uint40,\n uint40\n )\n {\n bytes27 extraData = batches().getGlobalMetadata();\n\n uint40 totalElements;\n uint40 lastSequencerTimestamp;\n assembly {\n extraData := shr(40, extraData)\n totalElements := and(extraData, 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF)\n lastSequencerTimestamp := shr(40, and(extraData, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000))\n }\n\n return (\n totalElements,\n lastSequencerTimestamp\n );\n }\n\n /**\n * Encodes the batch context for the extra data.\n * @param _totalElements Total number of elements submitted.\n * @param _lastSequencerTimestamp Timestamp of the last batch submitted by the sequencer.\n * @return Encoded batch context.\n */\n function _makeBatchExtraData(\n uint40 _totalElements,\n uint40 _lastSequencerTimestamp\n )\n internal\n pure\n returns (\n bytes27\n )\n {\n bytes27 extraData;\n assembly {\n extraData := _totalElements\n extraData := or(extraData, shl(40, _lastSequencerTimestamp))\n extraData := shl(40, extraData)\n }\n\n return extraData;\n }\n\n /**\n * Appends a batch to the chain.\n * @param _batch Elements within the batch.\n * @param _extraData Any extra data to append to the batch.\n */\n function _appendBatch(\n bytes32[] memory _batch,\n bytes memory _extraData\n )\n internal\n {\n address sequencer = resolve(\"OVM_Sequencer\");\n (uint40 totalElements, uint40 lastSequencerTimestamp) = _getBatchExtraData();\n\n if (msg.sender == sequencer) {\n lastSequencerTimestamp = uint40(block.timestamp);\n } else {\n // We keep track of the last batch submitted by the sequencer so there's a window in\n // which only the sequencer can publish state roots. A window like this just reduces\n // the chance of \"system breaking\" state roots being published while we're still in\n // testing mode. This window should be removed or significantly reduced in the future.\n require(\n lastSequencerTimestamp + SEQUENCER_PUBLISH_WINDOW < block.timestamp,\n \"Cannot publish state roots within the sequencer publication window.\"\n );\n }\n\n Lib_OVMCodec.ChainBatchHeader memory batchHeader = Lib_OVMCodec.ChainBatchHeader({\n batchIndex: getTotalBatches(),\n batchRoot: Lib_MerkleTree.getMerkleRoot(_batch),\n batchSize: _batch.length,\n prevTotalElements: totalElements,\n extraData: _extraData\n });\n\n emit StateBatchAppended(\n batchHeader.batchIndex,\n batchHeader.batchRoot,\n batchHeader.batchSize,\n batchHeader.prevTotalElements,\n batchHeader.extraData\n );\n\n batches().push(\n Lib_OVMCodec.hashBatchHeader(batchHeader),\n _makeBatchExtraData(\n uint40(batchHeader.prevTotalElements + batchHeader.batchSize),\n lastSequencerTimestamp\n )\n );\n }\n\n /**\n * Removes a batch and all subsequent batches from the chain.\n * @param _batchHeader Header of the batch to remove.\n */\n function _deleteBatch(\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\n )\n internal\n {\n require(\n _batchHeader.batchIndex < batches().length(),\n \"Invalid batch index.\"\n );\n\n require(\n _isValidBatchHeader(_batchHeader),\n \"Invalid batch header.\"\n );\n\n batches().deleteElementsAfterInclusive(\n _batchHeader.batchIndex,\n _makeBatchExtraData(\n uint40(_batchHeader.prevTotalElements),\n 0\n )\n );\n\n emit StateBatchDeleted(\n _batchHeader.batchIndex,\n _batchHeader.batchRoot\n );\n }\n\n /**\n * Checks that a batch header matches the stored hash for the given index.\n * @param _batchHeader Batch header to validate.\n * @return Whether or not the header matches the stored one.\n */\n function _isValidBatchHeader(\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\n )\n internal\n view\n returns (\n bool\n )\n {\n return Lib_OVMCodec.hashBatchHeader(_batchHeader) == batches().get(_batchHeader.batchIndex);\n }\n}\n" - }, - "contracts/optimistic-ethereum/libraries/utils/Lib_MerkleTree.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.7.0;\n\n/**\n * @title Lib_MerkleTree\n * @author River Keefer\n */\nlibrary Lib_MerkleTree {\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Calculates a merkle root for a list of 32-byte leaf hashes. WARNING: If the number\n * of leaves passed in is not a power of two, it pads out the tree with zero hashes.\n * If you do not know the original length of elements for the tree you are verifying,\n * then this may allow empty leaves past _elements.length to pass a verification check down the line.\n * @param _elements Array of hashes from which to generate a merkle root.\n * @return Merkle root of the leaves, with zero hashes for non-powers-of-two (see above).\n */\n function getMerkleRoot(\n bytes32[] memory _elements\n )\n internal\n view\n returns (\n bytes32\n )\n {\n require(\n _elements.length > 0,\n \"Lib_MerkleTree: Must provide at least one leaf hash.\"\n );\n\n if (_elements.length == 0) {\n return _elements[0];\n }\n\n uint256[16] memory defaults = [\n 0x290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563,\n 0x633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d,\n 0x890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d,\n 0x3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd8,\n 0xecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da,\n 0xdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da5,\n 0x617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d7,\n 0x292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead,\n 0xe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e10,\n 0x7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f82,\n 0xe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e83636516,\n 0x3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c,\n 0xad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e,\n 0xa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab,\n 0x4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c862,\n 0x2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf10\n ];\n\n // Reserve memory space for our hashes.\n bytes memory buf = new bytes(64);\n\n // We'll need to keep track of left and right siblings.\n bytes32 leftSibling;\n bytes32 rightSibling;\n\n // Number of non-empty nodes at the current depth.\n uint256 rowSize = _elements.length;\n\n // Current depth, counting from 0 at the leaves\n uint256 depth = 0;\n\n // Common sub-expressions\n uint256 halfRowSize; // rowSize / 2\n bool rowSizeIsOdd; // rowSize % 2 == 1\n\n while (rowSize > 1) {\n halfRowSize = rowSize / 2;\n rowSizeIsOdd = rowSize % 2 == 1;\n\n for (uint256 i = 0; i < halfRowSize; i++) {\n leftSibling = _elements[(2 * i) ];\n rightSibling = _elements[(2 * i) + 1];\n assembly {\n mstore(add(buf, 32), leftSibling )\n mstore(add(buf, 64), rightSibling)\n }\n\n _elements[i] = keccak256(buf);\n }\n\n if (rowSizeIsOdd) {\n leftSibling = _elements[rowSize - 1];\n rightSibling = bytes32(defaults[depth]);\n assembly {\n mstore(add(buf, 32), leftSibling)\n mstore(add(buf, 64), rightSibling)\n }\n\n _elements[halfRowSize] = keccak256(buf);\n }\n\n rowSize = halfRowSize + (rowSizeIsOdd ? 1 : 0);\n depth++;\n }\n\n return _elements[0];\n }\n\n /**\n * Verifies a merkle branch for the given leaf hash. Assumes the original length\n * of leaves generated is a known, correct input, and does not return true for indices \n * extending past that index (even if _siblings would be otherwise valid.)\n * @param _root The Merkle root to verify against.\n * @param _leaf The leaf hash to verify inclusion of.\n * @param _index The index in the tree of this leaf.\n * @param _siblings Array of sibline nodes in the inclusion proof, starting from depth 0 (bottom of the tree). \n * @param _totalLeaves The total number of leaves originally passed into.\n * @return Whether or not the merkle branch and leaf passes verification.\n */\n function verify(\n bytes32 _root,\n bytes32 _leaf,\n uint256 _index,\n bytes32[] memory _siblings,\n uint256 _totalLeaves\n )\n internal\n pure\n returns (\n bool\n )\n {\n require(\n _totalLeaves > 0,\n \"Lib_MerkleTree: Total leaves must be greater than zero.\"\n );\n\n require(\n _index < _totalLeaves,\n \"Lib_MerkleTree: Index out of bounds.\"\n );\n\n require(\n _siblings.length == _ceilLog2(_totalLeaves),\n \"Lib_MerkleTree: Total siblings does not correctly correspond to total leaves.\"\n );\n\n bytes32 computedRoot = _leaf;\n\n for (uint256 i = 0; i < _siblings.length; i++) {\n if ((_index & 1) == 1) {\n computedRoot = keccak256(\n abi.encodePacked(\n _siblings[i],\n computedRoot\n )\n );\n } else {\n computedRoot = keccak256(\n abi.encodePacked(\n computedRoot,\n _siblings[i]\n )\n );\n }\n\n _index >>= 1;\n }\n\n return _root == computedRoot;\n }\n\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * Calculates the integer ceiling of the log base 2 of an input.\n * @param _in Unsigned input to calculate the log.\n * @return ceil(log_base_2(_in))\n */\n function _ceilLog2(\n uint256 _in\n )\n private\n pure\n returns (\n uint256\n )\n { \n require(\n _in > 0,\n \"Lib_MerkleTree: Cannot compute ceil(log_2) of 0.\"\n );\n\n if (_in == 1) {\n return 0;\n }\n\n // Find the highest set bit (will be floor(log_2)).\n // Borrowed with <3 from https://github.com/ethereum/solidity-examples\n uint256 val = _in;\n uint256 highest = 0;\n for (uint8 i = 128; i >= 1; i >>= 1) {\n if (val & (uint(1) << i) - 1 << i != 0) {\n highest += i;\n val >>= i;\n }\n }\n\n // Increment by one if this is not a perfect logarithm.\n if ((uint(1) << highest) != _in) {\n highest += 1;\n }\n\n return highest;\n }\n}\n" - }, - "contracts/optimistic-ethereum/iOVM/chain/iOVM_ChainStorageContainer.sol": { - "content": "pragma solidity ^0.7.0;\n\n/**\n * @title iOVM_ChainStorageContainer\n */\ninterface iOVM_ChainStorageContainer {\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\n * 27 bytes to store arbitrary data.\n * @param _globalMetadata New global metadata to set.\n */\n function setGlobalMetadata(\n bytes27 _globalMetadata\n )\n external;\n\n /**\n * Retrieves the container's global metadata field.\n * @return Container global metadata field.\n */\n function getGlobalMetadata()\n external\n view\n returns (\n bytes27\n );\n\n /**\n * Retrieves the number of objects stored in the container.\n * @return Number of objects in the container.\n */\n function length()\n external\n view\n returns (\n uint256\n );\n\n /**\n * Pushes an object into the container.\n * @param _object A 32 byte value to insert into the container.\n */\n function push(\n bytes32 _object\n )\n external;\n\n /**\n * Pushes an object into the container. Function allows setting the global metadata since\n * we'll need to touch the \"length\" storage slot anyway, which also contains the global\n * metadata (it's an optimization).\n * @param _object A 32 byte value to insert into the container.\n * @param _globalMetadata New global metadata for the container.\n */\n function push(\n bytes32 _object,\n bytes27 _globalMetadata\n )\n external;\n\n /**\n * Pushes two objects into the container at the same time. A useful optimization.\n * @param _objectA First 32 byte value to insert into the container.\n * @param _objectB Second 32 byte value to insert into the container.\n */\n function push2(\n bytes32 _objectA,\n bytes32 _objectB\n )\n external;\n\n /**\n * Pushes two objects into the container at the same time. Also allows setting the global\n * metadata field.\n * @param _objectA First 32 byte value to insert into the container.\n * @param _objectB Second 32 byte value to insert into the container.\n * @param _globalMetadata New global metadata for the container.\n */\n function push2(\n bytes32 _objectA,\n bytes32 _objectB,\n bytes27 _globalMetadata\n )\n external;\n\n /**\n * Retrieves an object from the container.\n * @param _index Index of the particular object to access.\n * @return 32 byte object value.\n */\n function get(\n uint256 _index\n )\n external\n view\n returns (\n bytes32\n );\n\n /**\n * Removes all objects after and including a given index.\n * @param _index Object index to delete from.\n */\n function deleteElementsAfterInclusive(\n uint256 _index\n )\n external;\n\n /**\n * Removes all objects after and including a given index. Also allows setting the global\n * metadata field.\n * @param _index Object index to delete from.\n * @param _globalMetadata New global metadata for the container.\n */\n function deleteElementsAfterInclusive(\n uint256 _index,\n bytes27 _globalMetadata\n )\n external;\n\n /**\n * Marks an index as overwritable, meaing the underlying buffer can start to write values over\n * any objects before and including the given index.\n */\n function setNextOverwritableIndex(\n uint256 _index\n )\n external;\n}\n" - }, - "@openzeppelin/contracts/math/SafeMath.sol": { - "content": "// SPDX-License-Identifier: MIT\n\npragma solidity >=0.6.0 <0.8.0;\n\n/**\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\n * checks.\n *\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\n * in bugs, because programmers usually assume that an overflow raises an\n * error, which is the standard behavior in high level programming languages.\n * `SafeMath` restores this intuition by reverting the transaction when an\n * operation overflows.\n *\n * Using this library instead of the unchecked operations eliminates an entire\n * class of bugs, so it's recommended to use it always.\n */\nlibrary SafeMath {\n /**\n * @dev Returns the addition of two unsigned integers, with an overflow flag.\n *\n * _Available since v3.4._\n */\n function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n uint256 c = a + b;\n if (c < a) return (false, 0);\n return (true, c);\n }\n\n /**\n * @dev Returns the substraction of two unsigned integers, with an overflow flag.\n *\n * _Available since v3.4._\n */\n function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n if (b > a) return (false, 0);\n return (true, a - b);\n }\n\n /**\n * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\n *\n * _Available since v3.4._\n */\n function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\n // benefit is lost if 'b' is also tested.\n // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\n if (a == 0) return (true, 0);\n uint256 c = a * b;\n if (c / a != b) return (false, 0);\n return (true, c);\n }\n\n /**\n * @dev Returns the division of two unsigned integers, with a division by zero flag.\n *\n * _Available since v3.4._\n */\n function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n if (b == 0) return (false, 0);\n return (true, a / b);\n }\n\n /**\n * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\n *\n * _Available since v3.4._\n */\n function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n if (b == 0) return (false, 0);\n return (true, a % b);\n }\n\n /**\n * @dev Returns the addition of two unsigned integers, reverting on\n * overflow.\n *\n * Counterpart to Solidity's `+` operator.\n *\n * Requirements:\n *\n * - Addition cannot overflow.\n */\n function add(uint256 a, uint256 b) internal pure returns (uint256) {\n uint256 c = a + b;\n require(c >= a, \"SafeMath: addition overflow\");\n return c;\n }\n\n /**\n * @dev Returns the subtraction of two unsigned integers, reverting on\n * overflow (when the result is negative).\n *\n * Counterpart to Solidity's `-` operator.\n *\n * Requirements:\n *\n * - Subtraction cannot overflow.\n */\n function sub(uint256 a, uint256 b) internal pure returns (uint256) {\n require(b <= a, \"SafeMath: subtraction overflow\");\n return a - b;\n }\n\n /**\n * @dev Returns the multiplication of two unsigned integers, reverting on\n * overflow.\n *\n * Counterpart to Solidity's `*` operator.\n *\n * Requirements:\n *\n * - Multiplication cannot overflow.\n */\n function mul(uint256 a, uint256 b) internal pure returns (uint256) {\n if (a == 0) return 0;\n uint256 c = a * b;\n require(c / a == b, \"SafeMath: multiplication overflow\");\n return c;\n }\n\n /**\n * @dev Returns the integer division of two unsigned integers, reverting on\n * division by zero. The result is rounded towards zero.\n *\n * Counterpart to Solidity's `/` operator. Note: this function uses a\n * `revert` opcode (which leaves remaining gas untouched) while Solidity\n * uses an invalid opcode to revert (consuming all remaining gas).\n *\n * Requirements:\n *\n * - The divisor cannot be zero.\n */\n function div(uint256 a, uint256 b) internal pure returns (uint256) {\n require(b > 0, \"SafeMath: division by zero\");\n return a / b;\n }\n\n /**\n * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\n * reverting when dividing by zero.\n *\n * Counterpart to Solidity's `%` operator. This function uses a `revert`\n * opcode (which leaves remaining gas untouched) while Solidity uses an\n * invalid opcode to revert (consuming all remaining gas).\n *\n * Requirements:\n *\n * - The divisor cannot be zero.\n */\n function mod(uint256 a, uint256 b) internal pure returns (uint256) {\n require(b > 0, \"SafeMath: modulo by zero\");\n return a % b;\n }\n\n /**\n * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\n * overflow (when the result is negative).\n *\n * CAUTION: This function is deprecated because it requires allocating memory for the error\n * message unnecessarily. For custom revert reasons use {trySub}.\n *\n * Counterpart to Solidity's `-` operator.\n *\n * Requirements:\n *\n * - Subtraction cannot overflow.\n */\n function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\n require(b <= a, errorMessage);\n return a - b;\n }\n\n /**\n * @dev Returns the integer division of two unsigned integers, reverting with custom message on\n * division by zero. The result is rounded towards zero.\n *\n * CAUTION: This function is deprecated because it requires allocating memory for the error\n * message unnecessarily. For custom revert reasons use {tryDiv}.\n *\n * Counterpart to Solidity's `/` operator. Note: this function uses a\n * `revert` opcode (which leaves remaining gas untouched) while Solidity\n * uses an invalid opcode to revert (consuming all remaining gas).\n *\n * Requirements:\n *\n * - The divisor cannot be zero.\n */\n function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\n require(b > 0, errorMessage);\n return a / b;\n }\n\n /**\n * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\n * reverting with custom message when dividing by zero.\n *\n * CAUTION: This function is deprecated because it requires allocating memory for the error\n * message unnecessarily. For custom revert reasons use {tryMod}.\n *\n * Counterpart to Solidity's `%` operator. This function uses a `revert`\n * opcode (which leaves remaining gas untouched) while Solidity uses an\n * invalid opcode to revert (consuming all remaining gas).\n *\n * Requirements:\n *\n * - The divisor cannot be zero.\n */\n function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\n require(b > 0, errorMessage);\n return a % b;\n }\n}\n" - }, - "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol": { - "content": "pragma solidity ^0.7.0;\n\n/* Library Imports */\nimport { Lib_RingBuffer } from \"../../libraries/utils/Lib_RingBuffer.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/* Interface Imports */\nimport { iOVM_ChainStorageContainer } from \"../../iOVM/chain/iOVM_ChainStorageContainer.sol\";\n\n/**\n * @title OVM_ChainStorageContainer\n */\ncontract OVM_ChainStorageContainer is iOVM_ChainStorageContainer, Lib_AddressResolver {\n\n /*************\n * Libraries *\n *************/\n\n using Lib_RingBuffer for Lib_RingBuffer.RingBuffer;\n\n\n /*************\n * Variables *\n *************/\n\n string public owner;\n Lib_RingBuffer.RingBuffer internal buffer;\n\n\n /***************\n * Constructor *\n ***************/\n \n /**\n * @param _libAddressManager Address of the Address Manager.\n * @param _owner Name of the contract that owns this container (will be resolved later).\n */\n constructor(\n address _libAddressManager,\n string memory _owner\n )\n Lib_AddressResolver(_libAddressManager)\n {\n owner = _owner;\n }\n\n\n /**********************\n * Function Modifiers *\n **********************/\n \n modifier onlyOwner() {\n require(\n msg.sender == resolve(owner),\n \"OVM_ChainStorageContainer: Function can only be called by the owner.\"\n );\n _;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @inheritdoc iOVM_ChainStorageContainer\n */\n function setGlobalMetadata(\n bytes27 _globalMetadata\n )\n override\n public\n onlyOwner\n {\n return buffer.setExtraData(_globalMetadata);\n }\n\n /**\n * @inheritdoc iOVM_ChainStorageContainer\n */\n function getGlobalMetadata()\n override\n public\n view\n returns (\n bytes27\n )\n {\n return buffer.getExtraData();\n }\n\n /**\n * @inheritdoc iOVM_ChainStorageContainer\n */\n function length()\n override\n public\n view\n returns (\n uint256\n )\n {\n return uint256(buffer.getLength());\n }\n\n /**\n * @inheritdoc iOVM_ChainStorageContainer\n */\n function push(\n bytes32 _object\n )\n override\n public\n onlyOwner\n {\n buffer.push(_object);\n }\n\n /**\n * @inheritdoc iOVM_ChainStorageContainer\n */\n function push(\n bytes32 _object,\n bytes27 _globalMetadata\n )\n override\n public\n onlyOwner\n {\n buffer.push(_object, _globalMetadata);\n }\n\n /**\n * @inheritdoc iOVM_ChainStorageContainer\n */\n function push2(\n bytes32 _objectA,\n bytes32 _objectB\n )\n override\n public\n onlyOwner\n {\n buffer.push2(_objectA, _objectB);\n }\n\n /**\n * @inheritdoc iOVM_ChainStorageContainer\n */\n function push2(\n bytes32 _objectA,\n bytes32 _objectB,\n bytes27 _globalMetadata\n )\n override\n public\n onlyOwner\n {\n buffer.push2(_objectA, _objectB, _globalMetadata);\n }\n\n /**\n * @inheritdoc iOVM_ChainStorageContainer\n */\n function get(\n uint256 _index\n )\n override\n public\n view\n returns (\n bytes32\n )\n {\n return buffer.get(uint40(_index));\n }\n \n /**\n * @inheritdoc iOVM_ChainStorageContainer\n */\n function deleteElementsAfterInclusive(\n uint256 _index\n )\n override\n public\n onlyOwner\n {\n buffer.deleteElementsAfterInclusive(\n uint40(_index)\n );\n }\n \n /**\n * @inheritdoc iOVM_ChainStorageContainer\n */\n function deleteElementsAfterInclusive(\n uint256 _index,\n bytes27 _globalMetadata\n )\n override\n public\n onlyOwner\n {\n buffer.deleteElementsAfterInclusive(\n uint40(_index),\n _globalMetadata\n );\n }\n\n /**\n * @inheritdoc iOVM_ChainStorageContainer\n */\n function setNextOverwritableIndex(\n uint256 _index\n )\n override\n public\n onlyOwner\n {\n buffer.nextOverwritableIndex = _index;\n }\n}\n" - }, - "contracts/optimistic-ethereum/libraries/utils/Lib_RingBuffer.sol": { - "content": "pragma solidity ^0.7.0;\n\nlibrary Lib_RingBuffer {\n using Lib_RingBuffer for RingBuffer;\n\n /***********\n * Structs *\n ***********/\n\n struct Buffer {\n uint256 length;\n mapping (uint256 => bytes32) buf;\n }\n\n struct RingBuffer {\n bytes32 contextA;\n bytes32 contextB;\n Buffer bufferA;\n Buffer bufferB;\n uint256 nextOverwritableIndex;\n }\n\n struct RingBufferContext {\n // contextA\n uint40 globalIndex;\n bytes27 extraData;\n\n // contextB\n uint64 currBufferIndex;\n uint40 prevResetIndex;\n uint40 currResetIndex;\n }\n\n\n /*************\n * Constants *\n *************/\n\n uint256 constant MIN_CAPACITY = 16;\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Pushes a single element to the buffer.\n * @param _self Buffer to access.\n * @param _value Value to push to the buffer.\n * @param _extraData Optional global extra data.\n */\n function push(\n RingBuffer storage _self,\n bytes32 _value,\n bytes27 _extraData\n )\n internal\n {\n RingBufferContext memory ctx = _self.getContext();\n Buffer storage currBuffer = _self.getBuffer(ctx.currBufferIndex);\n\n // Set a minimum capacity.\n if (currBuffer.length == 0) {\n currBuffer.length = MIN_CAPACITY;\n }\n\n // Check if we need to expand the buffer.\n if (ctx.globalIndex - ctx.currResetIndex >= currBuffer.length) {\n if (ctx.currResetIndex < _self.nextOverwritableIndex) {\n // We're going to overwrite the inactive buffer.\n // Bump the buffer index, reset the delete offset, and set our reset indices.\n ctx.currBufferIndex++;\n ctx.prevResetIndex = ctx.currResetIndex;\n ctx.currResetIndex = ctx.globalIndex;\n\n // Swap over to the next buffer.\n currBuffer = _self.getBuffer(ctx.currBufferIndex);\n } else {\n // We're not overwriting yet, double the length of the current buffer.\n currBuffer.length *= 2;\n }\n }\n\n // Index to write to is the difference of the global and reset indices.\n uint256 writeHead = ctx.globalIndex - ctx.currResetIndex;\n currBuffer.buf[writeHead] = _value;\n\n // Bump the global index and insert our extra data, then save the context.\n ctx.globalIndex++;\n ctx.extraData = _extraData;\n _self.setContext(ctx);\n }\n\n /**\n * Pushes a single element to the buffer.\n * @param _self Buffer to access.\n * @param _value Value to push to the buffer.\n */\n function push(\n RingBuffer storage _self,\n bytes32 _value\n )\n internal\n {\n RingBufferContext memory ctx = _self.getContext();\n \n _self.push(\n _value,\n ctx.extraData\n );\n }\n\n /**\n * Pushes a two elements to the buffer.\n * @param _self Buffer to access.\n * @param _valueA First value to push to the buffer.\n * @param _valueA Second value to push to the buffer.\n * @param _extraData Optional global extra data.\n */\n function push2(\n RingBuffer storage _self,\n bytes32 _valueA,\n bytes32 _valueB,\n bytes27 _extraData\n )\n internal\n {\n _self.push(_valueA, _extraData);\n _self.push(_valueB, _extraData);\n }\n\n /**\n * Pushes a two elements to the buffer.\n * @param _self Buffer to access.\n * @param _valueA First value to push to the buffer.\n * @param _valueA Second value to push to the buffer.\n */\n function push2(\n RingBuffer storage _self,\n bytes32 _valueA,\n bytes32 _valueB\n )\n internal\n {\n RingBufferContext memory ctx = _self.getContext();\n\n _self.push2(\n _valueA,\n _valueB,\n ctx.extraData\n );\n }\n\n /**\n * Retrieves an element from the buffer.\n * @param _self Buffer to access.\n * @param _index Element index to retrieve.\n * @return Value of the element at the given index.\n */\n function get(\n RingBuffer storage _self,\n uint256 _index\n )\n internal\n view\n returns (\n bytes32 \n )\n {\n RingBufferContext memory ctx = _self.getContext();\n\n require(\n _index < ctx.globalIndex,\n \"Index out of bounds.\"\n );\n\n Buffer storage currBuffer = _self.getBuffer(ctx.currBufferIndex);\n Buffer storage prevBuffer = _self.getBuffer(ctx.currBufferIndex + 1);\n\n if (_index >= ctx.currResetIndex) {\n // We're trying to load an element from the current buffer.\n // Relative index is just the difference from the reset index.\n uint256 relativeIndex = _index - ctx.currResetIndex;\n\n // Shouldn't happen but why not check.\n require(\n relativeIndex < currBuffer.length,\n \"Index out of bounds.\"\n );\n\n return currBuffer.buf[relativeIndex];\n } else {\n // We're trying to load an element from the previous buffer.\n // Relative index is the difference from the reset index in the other direction.\n uint256 relativeIndex = ctx.currResetIndex - _index;\n\n // Condition only fails in the case that we deleted and flipped buffers.\n require(\n ctx.currResetIndex > ctx.prevResetIndex,\n \"Index out of bounds.\"\n );\n\n // Make sure we're not trying to read beyond the array.\n require(\n relativeIndex <= prevBuffer.length,\n \"Index out of bounds.\"\n );\n\n return prevBuffer.buf[prevBuffer.length - relativeIndex];\n }\n }\n\n /**\n * Deletes all elements after (and including) a given index.\n * @param _self Buffer to access.\n * @param _index Index of the element to delete from (inclusive).\n * @param _extraData Optional global extra data.\n */\n function deleteElementsAfterInclusive(\n RingBuffer storage _self,\n uint40 _index,\n bytes27 _extraData\n )\n internal\n {\n RingBufferContext memory ctx = _self.getContext();\n\n require(\n _index < ctx.globalIndex && _index >= ctx.prevResetIndex,\n \"Index out of bounds.\"\n );\n\n Buffer storage currBuffer = _self.getBuffer(ctx.currBufferIndex);\n Buffer storage prevBuffer = _self.getBuffer(ctx.currBufferIndex + 1);\n\n if (_index < ctx.currResetIndex) {\n // We're switching back to the previous buffer.\n // Reduce the buffer index, set the current reset index back to match the previous one.\n // We use the equality of these two values to prevent reading beyond this buffer.\n ctx.currBufferIndex--;\n ctx.currResetIndex = ctx.prevResetIndex;\n }\n\n // Set our global index and extra data, save the context.\n ctx.globalIndex = _index;\n ctx.extraData = _extraData;\n _self.setContext(ctx);\n }\n\n /**\n * Deletes all elements after (and including) a given index.\n * @param _self Buffer to access.\n * @param _index Index of the element to delete from (inclusive).\n */\n function deleteElementsAfterInclusive(\n RingBuffer storage _self,\n uint40 _index\n )\n internal\n {\n RingBufferContext memory ctx = _self.getContext();\n _self.deleteElementsAfterInclusive(\n _index,\n ctx.extraData\n );\n }\n\n /**\n * Retrieves the current global index.\n * @param _self Buffer to access.\n * @return Current global index.\n */\n function getLength(\n RingBuffer storage _self\n )\n internal\n view\n returns (\n uint40\n )\n {\n RingBufferContext memory ctx = _self.getContext();\n return ctx.globalIndex;\n }\n\n /**\n * Changes current global extra data.\n * @param _self Buffer to access.\n * @param _extraData New global extra data.\n */\n function setExtraData(\n RingBuffer storage _self,\n bytes27 _extraData\n )\n internal\n {\n RingBufferContext memory ctx = _self.getContext();\n ctx.extraData = _extraData;\n _self.setContext(ctx);\n }\n\n /**\n * Retrieves the current global extra data.\n * @param _self Buffer to access.\n * @return Current global extra data.\n */\n function getExtraData(\n RingBuffer storage _self\n )\n internal\n view\n returns (\n bytes27\n )\n {\n RingBufferContext memory ctx = _self.getContext();\n return ctx.extraData;\n }\n\n /**\n * Sets the current ring buffer context.\n * @param _self Buffer to access.\n * @param _ctx Current ring buffer context.\n */\n function setContext(\n RingBuffer storage _self,\n RingBufferContext memory _ctx\n )\n internal\n returns (\n bytes32\n )\n {\n bytes32 contextA;\n bytes32 contextB;\n\n uint40 globalIndex = _ctx.globalIndex;\n bytes27 extraData = _ctx.extraData;\n assembly {\n contextA := globalIndex\n contextA := or(contextA, extraData)\n }\n\n uint64 currBufferIndex = _ctx.currBufferIndex;\n uint40 prevResetIndex = _ctx.prevResetIndex;\n uint40 currResetIndex = _ctx.currResetIndex;\n assembly {\n contextB := currBufferIndex\n contextB := or(contextB, shl(64, prevResetIndex))\n contextB := or(contextB, shl(104, currResetIndex))\n }\n\n if (_self.contextA != contextA) {\n _self.contextA = contextA;\n }\n\n if (_self.contextB != contextB) {\n _self.contextB = contextB;\n }\n }\n\n /**\n * Retrieves the current ring buffer context.\n * @param _self Buffer to access.\n * @return Current ring buffer context.\n */\n function getContext(\n RingBuffer storage _self\n )\n internal\n view\n returns (\n RingBufferContext memory\n )\n {\n bytes32 contextA = _self.contextA;\n bytes32 contextB = _self.contextB;\n\n uint40 globalIndex;\n bytes27 extraData;\n assembly {\n globalIndex := and(contextA, 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF)\n extraData := and(contextA, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000)\n }\n\n uint64 currBufferIndex;\n uint40 prevResetIndex;\n uint40 currResetIndex;\n assembly {\n currBufferIndex := and(contextB, 0x000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF)\n prevResetIndex := shr(64, and(contextB, 0x00000000000000000000000000000000000000FFFFFFFFFF0000000000000000))\n currResetIndex := shr(104, and(contextB, 0x0000000000000000000000000000FFFFFFFFFF00000000000000000000000000))\n }\n\n return RingBufferContext({\n globalIndex: globalIndex,\n extraData: extraData,\n currBufferIndex: currBufferIndex,\n prevResetIndex: prevResetIndex,\n currResetIndex: currResetIndex\n });\n }\n\n /**\n * Retrieves the a buffer from the ring buffer by index.\n * @param _self Buffer to access.\n * @param _which Index of the sub buffer to access.\n * @return Sub buffer for the index.\n */\n function getBuffer(\n RingBuffer storage _self,\n uint256 _which\n )\n internal\n view\n returns (\n Buffer storage\n )\n {\n return _which % 2 == 0 ? _self.bufferA : _self.bufferB;\n }\n}\n" - }, - "contracts/test-libraries/utils/TestLib_RingBuffer.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.7.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_RingBuffer } from \"../../optimistic-ethereum/libraries/utils/Lib_RingBuffer.sol\";\n\n/**\n * @title TestLib_RingBuffer\n */\ncontract TestLib_RingBuffer {\n using Lib_RingBuffer for Lib_RingBuffer.RingBuffer;\n \n Lib_RingBuffer.RingBuffer internal buf;\n\n function push(\n bytes32 _value,\n bytes27 _extraData\n )\n public\n {\n buf.push(\n _value,\n _extraData\n );\n }\n\n function push2(\n bytes32 _valueA,\n bytes32 _valueB,\n bytes27 _extraData\n )\n public\n {\n buf.push2(\n _valueA,\n _valueB,\n _extraData\n );\n }\n\n function get(\n uint256 _index\n )\n public\n view\n returns (\n bytes32 \n )\n {\n return buf.get(_index);\n }\n\n function deleteElementsAfterInclusive(\n uint40 _index,\n bytes27 _extraData\n )\n internal\n {\n return buf.deleteElementsAfterInclusive(\n _index,\n _extraData\n );\n }\n\n function getLength()\n internal\n view\n returns (\n uint40\n )\n {\n return buf.getLength();\n }\n\n function getExtraData()\n internal\n view\n returns (\n bytes27\n )\n {\n return buf.getExtraData();\n }\n}\n" - }, - "contracts/optimistic-ethereum/OVM/chain/OVM_CanonicalTransactionChain.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.7.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\nimport { Lib_MerkleTree } from \"../../libraries/utils/Lib_MerkleTree.sol\";\nimport { Lib_Math } from \"../../libraries/utils/Lib_Math.sol\";\n\n/* Interface Imports */\nimport { iOVM_CanonicalTransactionChain } from \"../../iOVM/chain/iOVM_CanonicalTransactionChain.sol\";\nimport { iOVM_ChainStorageContainer } from \"../../iOVM/chain/iOVM_ChainStorageContainer.sol\";\n\n/* Contract Imports */\nimport { OVM_ExecutionManager } from \"../execution/OVM_ExecutionManager.sol\";\n\n\n/**\n * @title OVM_CanonicalTransactionChain\n */\ncontract OVM_CanonicalTransactionChain is iOVM_CanonicalTransactionChain, Lib_AddressResolver {\n\n /*************\n * Constants *\n *************/\n\n // L2 tx gas-related\n uint256 constant public MIN_ROLLUP_TX_GAS = 100000;\n uint256 constant public MAX_ROLLUP_TX_SIZE = 10000;\n uint256 constant public L2_GAS_DISCOUNT_DIVISOR = 32;\n\n // Encoding-related (all in bytes)\n uint256 constant internal BATCH_CONTEXT_SIZE = 16;\n uint256 constant internal BATCH_CONTEXT_LENGTH_POS = 12;\n uint256 constant internal BATCH_CONTEXT_START_POS = 15;\n uint256 constant internal TX_DATA_HEADER_SIZE = 3;\n uint256 constant internal BYTES_TILL_TX_DATA = 65;\n\n\n /*************\n * Variables *\n *************/\n\n uint256 public forceInclusionPeriodSeconds;\n uint256 public forceInclusionPeriodBlocks;\n uint256 public maxTransactionGasLimit;\n\n\n /***************\n * Constructor *\n ***************/\n\n constructor(\n address _libAddressManager,\n uint256 _forceInclusionPeriodSeconds,\n uint256 _forceInclusionPeriodBlocks,\n uint256 _maxTransactionGasLimit\n )\n Lib_AddressResolver(_libAddressManager)\n {\n forceInclusionPeriodSeconds = _forceInclusionPeriodSeconds;\n forceInclusionPeriodBlocks = _forceInclusionPeriodBlocks;\n maxTransactionGasLimit = _maxTransactionGasLimit;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Accesses the batch storage container.\n * @return Reference to the batch storage container.\n */\n function batches()\n public\n view\n returns (\n iOVM_ChainStorageContainer\n )\n {\n return iOVM_ChainStorageContainer(\n resolve(\"OVM_ChainStorageContainer:CTC:batches\")\n );\n }\n\n /**\n * Accesses the queue storage container.\n * @return Reference to the queue storage container.\n */\n function queue()\n public\n view\n returns (\n iOVM_ChainStorageContainer\n )\n {\n return iOVM_ChainStorageContainer(\n resolve(\"OVM_ChainStorageContainer:CTC:queue\")\n );\n }\n\n /**\n * @inheritdoc iOVM_CanonicalTransactionChain\n */\n function getTotalElements()\n override\n public\n view\n returns (\n uint256 _totalElements\n )\n {\n (uint40 totalElements,,,) = _getBatchExtraData();\n return uint256(totalElements);\n }\n\n /**\n * @inheritdoc iOVM_CanonicalTransactionChain\n */\n function getTotalBatches()\n override\n public\n view\n returns (\n uint256 _totalBatches\n )\n {\n return batches().length();\n }\n\n /**\n * @inheritdoc iOVM_CanonicalTransactionChain\n */\n function getNextQueueIndex()\n override\n public\n view\n returns (\n uint40\n )\n {\n (, uint40 nextQueueIndex,,) = _getBatchExtraData();\n return nextQueueIndex;\n }\n\n /**\n * @inheritdoc iOVM_CanonicalTransactionChain\n */\n function getQueueElement(\n uint256 _index\n )\n override\n public\n view\n returns (\n Lib_OVMCodec.QueueElement memory _element\n )\n {\n uint40 trueIndex = uint40(_index * 2);\n bytes32 queueRoot = queue().get(trueIndex);\n bytes32 timestampAndBlockNumber = queue().get(trueIndex + 1);\n\n uint40 elementTimestamp;\n uint40 elementBlockNumber;\n assembly {\n elementTimestamp := and(timestampAndBlockNumber, 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF)\n elementBlockNumber := shr(40, and(timestampAndBlockNumber, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000))\n }\n\n return Lib_OVMCodec.QueueElement({\n queueRoot: queueRoot,\n timestamp: elementTimestamp,\n blockNumber: elementBlockNumber\n });\n }\n\n /**\n * @inheritdoc iOVM_CanonicalTransactionChain\n */\n function getNumPendingQueueElements()\n override\n public\n view\n returns (\n uint40\n )\n {\n return getQueueLength() - getNextQueueIndex();\n }\n\n /**\n * @inheritdoc iOVM_CanonicalTransactionChain\n */\n function getQueueLength()\n override\n public\n view\n returns (\n uint40\n )\n {\n // The underlying queue data structure stores 2 elements\n // per insertion, so to get the real queue length we need\n // to divide by 2. See the usage of `push2(..)`.\n return uint40(queue().length() / 2);\n }\n\n /**\n * @inheritdoc iOVM_CanonicalTransactionChain\n */\n function enqueue(\n address _target,\n uint256 _gasLimit,\n bytes memory _data\n )\n override\n public\n {\n require(\n _data.length <= MAX_ROLLUP_TX_SIZE,\n \"Transaction data size exceeds maximum for rollup transaction.\"\n );\n\n require(\n _gasLimit <= maxTransactionGasLimit,\n \"Transaction gas limit exceeds maximum for rollup transaction.\"\n );\n\n require(\n _gasLimit >= MIN_ROLLUP_TX_GAS,\n \"Transaction gas limit too low to enqueue.\"\n );\n\n // We need to consume some amount of L1 gas in order to rate limit transactions going into\n // L2. However, L2 is cheaper than L1 so we only need to burn some small proportion of the\n // provided L1 gas.\n uint256 gasToConsume = _gasLimit/L2_GAS_DISCOUNT_DIVISOR;\n uint256 startingGas = gasleft();\n\n // Although this check is not necessary (burn below will run out of gas if not true), it\n // gives the user an explicit reason as to why the enqueue attempt failed.\n require(\n startingGas > gasToConsume,\n \"Insufficient gas for L2 rate limiting burn.\"\n );\n\n // Here we do some \"dumb\" work in order to burn gas, although we should probably replace\n // this with something like minting gas token later on.\n uint256 i;\n while(startingGas - gasleft() < gasToConsume) {\n i++;\n }\n\n bytes32 transactionHash = keccak256(\n abi.encode(\n msg.sender,\n _target,\n _gasLimit,\n _data\n )\n );\n\n bytes32 timestampAndBlockNumber;\n assembly {\n timestampAndBlockNumber := timestamp()\n timestampAndBlockNumber := or(timestampAndBlockNumber, shl(40, number()))\n }\n\n queue().push2(\n transactionHash,\n timestampAndBlockNumber\n );\n\n uint256 queueIndex = queue().length() / 2;\n emit TransactionEnqueued(\n msg.sender,\n _target,\n _gasLimit,\n _data,\n queueIndex - 1,\n block.timestamp\n );\n }\n\n /**\n * @inheritdoc iOVM_CanonicalTransactionChain\n */\n function appendQueueBatch(\n uint256 _numQueuedTransactions\n )\n override\n public\n {\n // Disable `appendQueueBatch` for minnet\n revert(\"appendQueueBatch is currently disabled.\");\n\n _numQueuedTransactions = Lib_Math.min(_numQueuedTransactions, getNumPendingQueueElements());\n require(\n _numQueuedTransactions > 0,\n \"Must append more than zero transactions.\"\n );\n\n bytes32[] memory leaves = new bytes32[](_numQueuedTransactions);\n uint40 nextQueueIndex = getNextQueueIndex();\n\n for (uint256 i = 0; i < _numQueuedTransactions; i++) {\n if (msg.sender != resolve(\"OVM_Sequencer\")) {\n Lib_OVMCodec.QueueElement memory el = getQueueElement(nextQueueIndex);\n require(\n el.timestamp + forceInclusionPeriodSeconds < block.timestamp,\n \"Queue transactions cannot be submitted during the sequencer inclusion period.\"\n );\n }\n leaves[i] = _getQueueLeafHash(nextQueueIndex);\n nextQueueIndex++;\n }\n\n Lib_OVMCodec.QueueElement memory lastElement = getQueueElement(nextQueueIndex - 1);\n\n _appendBatch(\n Lib_MerkleTree.getMerkleRoot(leaves),\n _numQueuedTransactions,\n _numQueuedTransactions,\n lastElement.timestamp,\n lastElement.blockNumber\n );\n\n emit QueueBatchAppended(\n nextQueueIndex - _numQueuedTransactions,\n _numQueuedTransactions,\n getTotalElements()\n );\n }\n\n /**\n * @inheritdoc iOVM_CanonicalTransactionChain\n */\n function appendSequencerBatch()\n override\n public\n {\n uint40 shouldStartAtElement;\n uint24 totalElementsToAppend;\n uint24 numContexts;\n assembly {\n shouldStartAtElement := shr(216, calldataload(4))\n totalElementsToAppend := shr(232, calldataload(9))\n numContexts := shr(232, calldataload(12))\n }\n\n require(\n shouldStartAtElement == getTotalElements(),\n \"Actual batch start index does not match expected start index.\"\n );\n\n require(\n msg.sender == resolve(\"OVM_Sequencer\"),\n \"Function can only be called by the Sequencer.\"\n );\n\n require(\n numContexts > 0,\n \"Must provide at least one batch context.\"\n );\n\n require(\n totalElementsToAppend > 0,\n \"Must append at least one element.\"\n );\n\n uint40 nextTransactionPtr = uint40(BATCH_CONTEXT_START_POS + BATCH_CONTEXT_SIZE * numContexts);\n uint256 calldataSize;\n assembly {\n calldataSize := calldatasize()\n }\n\n require(\n calldataSize >= nextTransactionPtr,\n \"Not enough BatchContexts provided.\"\n );\n\n // Get queue length for future comparison/\n uint40 queueLength = getQueueLength();\n\n // Initialize the array of canonical chain leaves that we will append.\n bytes32[] memory leaves = new bytes32[](totalElementsToAppend);\n // Each leaf index corresponds to a tx, either sequenced or enqueued.\n uint32 leafIndex = 0;\n // Counter for number of sequencer transactions appended so far.\n uint32 numSequencerTransactions = 0;\n // We will sequentially append leaves which are pointers to the queue.\n // The initial queue index is what is currently in storage.\n uint40 nextQueueIndex = getNextQueueIndex();\n\n BatchContext memory curContext;\n\n for (uint32 i = 0; i < numContexts; i++) {\n BatchContext memory nextContext = _getBatchContext(i);\n if (i == 0) {\n _validateFirstBatchContext(nextContext);\n }\n _validateNextBatchContext(curContext, nextContext, nextQueueIndex);\n\n curContext = nextContext;\n\n for (uint32 j = 0; j < curContext.numSequencedTransactions; j++) {\n uint256 txDataLength;\n assembly {\n txDataLength := shr(232, calldataload(nextTransactionPtr))\n }\n\n leaves[leafIndex] = _getSequencerLeafHash(curContext, nextTransactionPtr, txDataLength);\n nextTransactionPtr += uint40(TX_DATA_HEADER_SIZE + txDataLength);\n numSequencerTransactions++;\n leafIndex++;\n }\n\n for (uint32 j = 0; j < curContext.numSubsequentQueueTransactions; j++) {\n require(nextQueueIndex < queueLength, \"Not enough queued transactions to append.\");\n leaves[leafIndex] = _getQueueLeafHash(nextQueueIndex);\n nextQueueIndex++;\n leafIndex++;\n }\n }\n\n _validateFinalBatchContext(curContext);\n\n require(\n calldataSize == nextTransactionPtr,\n \"Not all sequencer transactions were processed.\"\n );\n\n require(\n leafIndex == totalElementsToAppend,\n \"Actual transaction index does not match expected total elements to append.\"\n );\n\n // Generate the required metadata that we need to append this batch\n uint40 numQueuedTransactions = totalElementsToAppend - numSequencerTransactions;\n uint40 timestamp;\n uint40 blockNumber;\n if (curContext.numSubsequentQueueTransactions == 0) {\n // The last element is a sequencer tx, therefore pull timestamp and block number from the last context.\n timestamp = uint40(curContext.timestamp);\n blockNumber = uint40(curContext.blockNumber);\n } else {\n // The last element is a queue tx, therefore pull timestamp and block number from the queue element.\n Lib_OVMCodec.QueueElement memory lastElement = getQueueElement(nextQueueIndex - 1);\n timestamp = lastElement.timestamp;\n blockNumber = lastElement.blockNumber;\n }\n\n _appendBatch(\n Lib_MerkleTree.getMerkleRoot(leaves),\n totalElementsToAppend,\n numQueuedTransactions,\n timestamp,\n blockNumber\n );\n\n emit SequencerBatchAppended(\n nextQueueIndex - numQueuedTransactions,\n numQueuedTransactions,\n getTotalElements()\n );\n }\n\n /**\n * @inheritdoc iOVM_CanonicalTransactionChain\n */\n function verifyTransaction(\n Lib_OVMCodec.Transaction memory _transaction,\n Lib_OVMCodec.TransactionChainElement memory _txChainElement,\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _inclusionProof\n )\n override\n public\n view\n returns (\n bool\n )\n {\n if (_txChainElement.isSequenced == true) {\n return _verifySequencerTransaction(\n _transaction,\n _txChainElement,\n _batchHeader,\n _inclusionProof\n );\n } else {\n return _verifyQueueTransaction(\n _transaction,\n _txChainElement.queueIndex,\n _batchHeader,\n _inclusionProof\n );\n }\n }\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Returns the BatchContext located at a particular index.\n * @param _index The index of the BatchContext\n * @return The BatchContext at the specified index.\n */\n function _getBatchContext(\n uint256 _index\n )\n internal\n pure\n returns (\n BatchContext memory\n )\n {\n uint256 contextPtr = 15 + _index * BATCH_CONTEXT_SIZE;\n uint256 numSequencedTransactions;\n uint256 numSubsequentQueueTransactions;\n uint256 ctxTimestamp;\n uint256 ctxBlockNumber;\n\n assembly {\n numSequencedTransactions := shr(232, calldataload(contextPtr))\n numSubsequentQueueTransactions := shr(232, calldataload(add(contextPtr, 3)))\n ctxTimestamp := shr(216, calldataload(add(contextPtr, 6)))\n ctxBlockNumber := shr(216, calldataload(add(contextPtr, 11)))\n }\n\n return BatchContext({\n numSequencedTransactions: numSequencedTransactions,\n numSubsequentQueueTransactions: numSubsequentQueueTransactions,\n timestamp: ctxTimestamp,\n blockNumber: ctxBlockNumber\n });\n }\n\n /**\n * Parses the batch context from the extra data.\n * @return Total number of elements submitted.\n * @return Index of the next queue element.\n */\n function _getBatchExtraData()\n internal\n view\n returns (\n uint40,\n uint40,\n uint40,\n uint40\n )\n {\n bytes27 extraData = batches().getGlobalMetadata();\n\n uint40 totalElements;\n uint40 nextQueueIndex;\n uint40 lastTimestamp;\n uint40 lastBlockNumber;\n assembly {\n extraData := shr(40, extraData)\n totalElements := and(extraData, 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF)\n nextQueueIndex := shr(40, and(extraData, 0x00000000000000000000000000000000000000000000FFFFFFFFFF0000000000))\n lastTimestamp := shr(80, and(extraData, 0x0000000000000000000000000000000000FFFFFFFFFF00000000000000000000))\n lastBlockNumber := shr(120, and(extraData, 0x000000000000000000000000FFFFFFFFFF000000000000000000000000000000))\n }\n\n return (\n totalElements,\n nextQueueIndex,\n lastTimestamp,\n lastBlockNumber\n );\n }\n\n /**\n * Encodes the batch context for the extra data.\n * @param _totalElements Total number of elements submitted.\n * @param _nextQueueIndex Index of the next queue element.\n * @param _timestamp Timestamp for the last batch.\n * @param _blockNumber Block number of the last batch.\n * @return Encoded batch context.\n */\n function _makeBatchExtraData(\n uint40 _totalElements,\n uint40 _nextQueueIndex,\n uint40 _timestamp,\n uint40 _blockNumber\n )\n internal\n pure\n returns (\n bytes27\n )\n {\n bytes27 extraData;\n assembly {\n extraData := _totalElements\n extraData := or(extraData, shl(40, _nextQueueIndex))\n extraData := or(extraData, shl(80, _timestamp))\n extraData := or(extraData, shl(120, _blockNumber))\n extraData := shl(40, extraData)\n }\n\n return extraData;\n }\n\n /**\n * Retrieves the hash of a queue element.\n * @param _index Index of the queue element to retrieve a hash for.\n * @return Hash of the queue element.\n */\n function _getQueueLeafHash(\n uint256 _index\n )\n internal\n view\n returns (\n bytes32\n )\n {\n return _hashTransactionChainElement(\n Lib_OVMCodec.TransactionChainElement({\n isSequenced: false,\n queueIndex: _index,\n timestamp: 0,\n blockNumber: 0,\n txData: hex\"\"\n })\n );\n }\n\n /**\n * Retrieves the length of the queue.\n * @return Length of the queue.\n */\n function _getQueueLength()\n internal\n view\n returns (\n uint40\n )\n {\n // The underlying queue data structure stores 2 elements\n // per insertion, so to get the real queue length we need\n // to divide by 2. See the usage of `push2(..)`.\n return uint40(queue().length() / 2);\n }\n\n /**\n * Retrieves the hash of a sequencer element.\n * @param _context Batch context for the given element.\n * @param _nextTransactionPtr Pointer to the next transaction in the calldata.\n * @param _txDataLength Length of the transaction item.\n * @return Hash of the sequencer element.\n */\n function _getSequencerLeafHash(\n BatchContext memory _context,\n uint256 _nextTransactionPtr,\n uint256 _txDataLength\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n\n bytes memory chainElement = new bytes(BYTES_TILL_TX_DATA + _txDataLength);\n uint256 ctxTimestamp = _context.timestamp;\n uint256 ctxBlockNumber = _context.blockNumber;\n\n bytes32 leafHash;\n assembly {\n let chainElementStart := add(chainElement, 0x20)\n\n // Set the first byte equal to `1` to indicate this is a sequencer chain element.\n // This distinguishes sequencer ChainElements from queue ChainElements because\n // all queue ChainElements are ABI encoded and the first byte of ABI encoded\n // elements is always zero\n mstore8(chainElementStart, 1)\n\n mstore(add(chainElementStart, 1), ctxTimestamp)\n mstore(add(chainElementStart, 33), ctxBlockNumber)\n\n calldatacopy(add(chainElementStart, BYTES_TILL_TX_DATA), add(_nextTransactionPtr, 3), _txDataLength)\n\n leafHash := keccak256(chainElementStart, add(BYTES_TILL_TX_DATA, _txDataLength))\n }\n\n return leafHash;\n }\n\n /**\n * Retrieves the hash of a sequencer element.\n * @param _txChainElement The chain element which is hashed to calculate the leaf.\n * @return Hash of the sequencer element.\n */\n function _getSequencerLeafHash(\n Lib_OVMCodec.TransactionChainElement memory _txChainElement\n )\n internal\n view\n returns(\n bytes32\n )\n {\n bytes memory txData = _txChainElement.txData;\n uint256 txDataLength = _txChainElement.txData.length;\n\n bytes memory chainElement = new bytes(BYTES_TILL_TX_DATA + txDataLength);\n uint256 ctxTimestamp = _txChainElement.timestamp;\n uint256 ctxBlockNumber = _txChainElement.blockNumber;\n\n bytes32 leafHash;\n assembly {\n let chainElementStart := add(chainElement, 0x20)\n\n // Set the first byte equal to `1` to indicate this is a sequencer chain element.\n // This distinguishes sequencer ChainElements from queue ChainElements because\n // all queue ChainElements are ABI encoded and the first byte of ABI encoded\n // elements is always zero\n mstore8(chainElementStart, 1)\n\n mstore(add(chainElementStart, 1), ctxTimestamp)\n mstore(add(chainElementStart, 33), ctxBlockNumber)\n\n pop(staticcall(gas(), 0x04, add(txData, 0x20), txDataLength, add(chainElementStart, BYTES_TILL_TX_DATA), txDataLength))\n\n leafHash := keccak256(chainElementStart, add(BYTES_TILL_TX_DATA, txDataLength))\n }\n\n return leafHash;\n }\n\n /**\n * Inserts a batch into the chain of batches.\n * @param _transactionRoot Root of the transaction tree for this batch.\n * @param _batchSize Number of elements in the batch.\n * @param _numQueuedTransactions Number of queue transactions in the batch.\n * @param _timestamp The latest batch timestamp.\n * @param _blockNumber The latest batch blockNumber.\n */\n function _appendBatch(\n bytes32 _transactionRoot,\n uint256 _batchSize,\n uint256 _numQueuedTransactions,\n uint40 _timestamp,\n uint40 _blockNumber\n )\n internal\n {\n (uint40 totalElements, uint40 nextQueueIndex, uint40 lastTimestamp, uint40 lastBlockNumber) = _getBatchExtraData();\n\n Lib_OVMCodec.ChainBatchHeader memory header = Lib_OVMCodec.ChainBatchHeader({\n batchIndex: batches().length(),\n batchRoot: _transactionRoot,\n batchSize: _batchSize,\n prevTotalElements: totalElements,\n extraData: hex\"\"\n });\n\n emit TransactionBatchAppended(\n header.batchIndex,\n header.batchRoot,\n header.batchSize,\n header.prevTotalElements,\n header.extraData\n );\n\n bytes32 batchHeaderHash = Lib_OVMCodec.hashBatchHeader(header);\n bytes27 latestBatchContext = _makeBatchExtraData(\n totalElements + uint40(header.batchSize),\n nextQueueIndex + uint40(_numQueuedTransactions),\n _timestamp,\n _blockNumber\n );\n\n batches().push(batchHeaderHash, latestBatchContext);\n }\n\n /**\n * Checks that the first batch context in a sequencer submission is valid\n * @param _firstContext The batch context to validate.\n */\n function _validateFirstBatchContext(\n BatchContext memory _firstContext\n )\n internal\n view\n {\n // If there are existing elements, this batch must come later.\n if (getTotalElements() > 0) {\n (,, uint40 lastTimestamp, uint40 lastBlockNumber) = _getBatchExtraData();\n require(_firstContext.blockNumber >= lastBlockNumber, \"Context block number is lower than last submitted.\");\n require(_firstContext.timestamp >= lastTimestamp, \"Context timestamp is lower than last submitted.\");\n }\n // Sequencer cannot submit contexts which are more than the force inclusion period old.\n require(_firstContext.timestamp + forceInclusionPeriodSeconds >= block.timestamp, \"Context timestamp too far in the past.\");\n require(_firstContext.blockNumber + forceInclusionPeriodBlocks >= block.number, \"Context block number too far in the past.\");\n }\n\n /**\n * Checks that a given batch context is valid based on its previous context, and the next queue elemtent.\n * @param _prevContext The previously validated batch context.\n * @param _nextContext The batch context to validate with this call.\n * @param _nextQueueIndex Index of the next queue element to process for the _nextContext's subsequentQueueElements.\n */\n function _validateNextBatchContext(\n BatchContext memory _prevContext,\n BatchContext memory _nextContext,\n uint40 _nextQueueIndex\n )\n internal\n view\n {\n // All sequencer transactions' times must increase from the previous ones.\n require(\n _nextContext.timestamp >= _prevContext.timestamp,\n \"Context timestamp values must monotonically increase.\"\n );\n\n require(\n _nextContext.blockNumber >= _prevContext.blockNumber,\n \"Context blockNumber values must monotonically increase.\"\n );\n\n // If there are some queue elements pending:\n if (getQueueLength() - _nextQueueIndex > 0) {\n Lib_OVMCodec.QueueElement memory nextQueueElement = getQueueElement(_nextQueueIndex);\n\n // If the force inclusion period has passed for an enqueued transaction, it MUST be the next chain element.\n require(\n block.timestamp < nextQueueElement.timestamp + forceInclusionPeriodSeconds,\n \"Previously enqueued batches have expired and must be appended before a new sequencer batch.\"\n );\n\n // Just like sequencer transaction times must be increasing relative to each other,\n // We also require that they be increasing relative to any interspersed queue elements.\n require(\n _nextContext.timestamp <= nextQueueElement.timestamp,\n \"Sequencer transaction timestamp exceeds that of next queue element.\"\n );\n\n require(\n _nextContext.blockNumber <= nextQueueElement.blockNumber,\n \"Sequencer transaction blockNumber exceeds that of next queue element.\"\n );\n } \n }\n\n /**\n * Checks that the final batch context in a sequencer submission is valid.\n * @param _finalContext The batch context to validate.\n */\n function _validateFinalBatchContext(\n BatchContext memory _finalContext\n )\n internal\n view\n {\n // Batches cannot be added from the future, or subsequent enqueue() contexts would violate monotonicity.\n require(_finalContext.timestamp <= block.timestamp, \"Context timestamp is from the future.\");\n require(_finalContext.blockNumber <= block.number, \"Context block number is from the future.\");\n }\n\n /**\n * Hashes a transaction chain element.\n * @param _element Chain element to hash.\n * @return Hash of the chain element.\n */\n function _hashTransactionChainElement(\n Lib_OVMCodec.TransactionChainElement memory _element\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n return keccak256(\n abi.encode(\n _element.isSequenced,\n _element.queueIndex,\n _element.timestamp,\n _element.blockNumber,\n _element.txData\n )\n );\n }\n\n /**\n * Verifies a sequencer transaction, returning true if it was indeed included in the CTC\n * @param _transaction The transaction we are verifying inclusion of.\n * @param _txChainElement The chain element that the transaction is claimed to be a part of.\n * @param _batchHeader Header of the batch the transaction was included in.\n * @param _inclusionProof An inclusion proof into the CTC at a particular index.\n * @return True if the transaction was included in the specified location, else false.\n */\n function _verifySequencerTransaction(\n Lib_OVMCodec.Transaction memory _transaction,\n Lib_OVMCodec.TransactionChainElement memory _txChainElement,\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _inclusionProof\n )\n internal\n view\n returns (\n bool\n )\n {\n OVM_ExecutionManager ovmExecutionManager = OVM_ExecutionManager(resolve(\"OVM_ExecutionManager\"));\n uint256 gasLimit = ovmExecutionManager.getMaxTransactionGasLimit();\n bytes32 leafHash = _getSequencerLeafHash(_txChainElement);\n\n require(\n _verifyElement(\n leafHash,\n _batchHeader,\n _inclusionProof\n ),\n \"Invalid Sequencer transaction inclusion proof.\"\n );\n\n require(\n _transaction.blockNumber == _txChainElement.blockNumber\n && _transaction.timestamp == _txChainElement.timestamp\n && _transaction.entrypoint == resolve(\"OVM_DecompressionPrecompileAddress\")\n && _transaction.gasLimit == gasLimit\n && _transaction.l1TxOrigin == address(0)\n && _transaction.l1QueueOrigin == Lib_OVMCodec.QueueOrigin.SEQUENCER_QUEUE\n && keccak256(_transaction.data) == keccak256(_txChainElement.txData),\n \"Invalid Sequencer transaction.\"\n );\n\n return true;\n }\n\n /**\n * Verifies a queue transaction, returning true if it was indeed included in the CTC\n * @param _transaction The transaction we are verifying inclusion of.\n * @param _queueIndex The queueIndex of the queued transaction.\n * @param _batchHeader Header of the batch the transaction was included in.\n * @param _inclusionProof An inclusion proof into the CTC at a particular index (should point to queue tx).\n * @return True if the transaction was included in the specified location, else false.\n */\n function _verifyQueueTransaction(\n Lib_OVMCodec.Transaction memory _transaction,\n uint256 _queueIndex,\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _inclusionProof\n )\n internal\n view\n returns (\n bool\n )\n {\n bytes32 leafHash = _getQueueLeafHash(_queueIndex);\n\n require(\n _verifyElement(\n leafHash,\n _batchHeader,\n _inclusionProof\n ),\n \"Invalid Queue transaction inclusion proof.\"\n );\n\n bytes32 transactionHash = keccak256(\n abi.encode(\n _transaction.l1TxOrigin,\n _transaction.entrypoint,\n _transaction.gasLimit,\n _transaction.data\n )\n );\n\n Lib_OVMCodec.QueueElement memory el = getQueueElement(_queueIndex);\n require(\n el.queueRoot == transactionHash\n && el.timestamp == _transaction.timestamp\n && el.blockNumber == _transaction.blockNumber,\n \"Invalid Queue transaction.\"\n );\n\n return true;\n }\n\n /**\n * Verifies a batch inclusion proof.\n * @param _element Hash of the element to verify a proof for.\n * @param _batchHeader Header of the batch in which the element was included.\n * @param _proof Merkle inclusion proof for the element.\n */\n function _verifyElement(\n bytes32 _element,\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _proof\n )\n internal\n view\n returns (\n bool\n )\n {\n require(\n Lib_OVMCodec.hashBatchHeader(_batchHeader) == batches().get(uint32(_batchHeader.batchIndex)),\n \"Invalid batch header.\"\n );\n\n require(\n Lib_MerkleTree.verify(\n _batchHeader.batchRoot,\n _element,\n _proof.index,\n _proof.siblings,\n _batchHeader.batchSize\n ),\n \"Invalid inclusion proof.\"\n );\n\n return true;\n }\n}\n" - }, - "contracts/optimistic-ethereum/libraries/utils/Lib_Math.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.7.0;\n\n/**\n * @title Lib_Math\n */\nlibrary Lib_Math {\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Calculates the minumum of two numbers.\n * @param _x First number to compare.\n * @param _y Second number to compare.\n * @return Lesser of the two numbers.\n */\n function min(\n uint256 _x,\n uint256 _y\n )\n internal\n pure\n returns (\n uint256\n )\n {\n if (_x < _y) {\n return _x;\n }\n\n return _y;\n }\n}\n" - }, - "contracts/optimistic-ethereum/OVM/bridge/OVM_L1CrossDomainMessenger.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\nimport { Lib_AddressManager } from \"../../libraries/resolver/Lib_AddressManager.sol\";\nimport { Lib_SecureMerkleTrie } from \"../../libraries/trie/Lib_SecureMerkleTrie.sol\";\nimport { Lib_ReentrancyGuard } from \"../../libraries/utils/Lib_ReentrancyGuard.sol\";\n\n/* Interface Imports */\nimport { iOVM_L1CrossDomainMessenger } from \"../../iOVM/bridge/iOVM_L1CrossDomainMessenger.sol\";\nimport { iOVM_CanonicalTransactionChain } from \"../../iOVM/chain/iOVM_CanonicalTransactionChain.sol\";\nimport { iOVM_StateCommitmentChain } from \"../../iOVM/chain/iOVM_StateCommitmentChain.sol\";\n\n/* Contract Imports */\nimport { OVM_BaseCrossDomainMessenger } from \"./OVM_BaseCrossDomainMessenger.sol\";\n\n/**\n * @title OVM_L1CrossDomainMessenger\n * @dev This contract lives on L1. It sends L1->L2 messages into L2, and relays L2->L1 messages from L2 to their target on L1.\n */\ncontract OVM_L1CrossDomainMessenger is iOVM_L1CrossDomainMessenger, OVM_BaseCrossDomainMessenger, Lib_AddressResolver {\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * Pass a default zero address to the address resolver. This will be updated when initialized.\n */\n constructor()\n Lib_AddressResolver(address(0))\n {}\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n function initialize(\n address _libAddressManager\n )\n public\n {\n require(address(libAddressManager) == address(0), \"L1CrossDomainMessenger already intialized.\");\n libAddressManager = Lib_AddressManager(_libAddressManager);\n }\n\n\n /**********************\n * Function Modifiers *\n **********************/\n\n /**\n * Modifier to enforce that, if configured, only the OVM_L2MessageRelayer contract may successfully call a method.\n */\n modifier onlyRelayer() {\n address relayer = resolve(\"OVM_L2MessageRelayer\");\n if (relayer != address(0)) {\n require(\n msg.sender == relayer,\n \"Only OVM_L2MessageRelayer can relay L2-to-L1 messages.\"\n );\n }\n _;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Relays a cross domain message to a contract.\n * @inheritdoc iOVM_L1CrossDomainMessenger\n */\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce,\n L2MessageInclusionProof memory _proof\n )\n override\n public\n nonReentrant\n onlyRelayer()\n {\n bytes memory xDomainCalldata = _getXDomainCalldata(\n _target,\n _sender,\n _message,\n _messageNonce\n );\n\n require(\n _verifyXDomainMessage(\n xDomainCalldata,\n _proof\n ) == true,\n \"Provided message could not be verified.\"\n );\n\n bytes32 xDomainCalldataHash = keccak256(xDomainCalldata);\n\n require(\n successfulMessages[xDomainCalldataHash] == false,\n \"Provided message has already been received.\"\n );\n\n xDomainMessageSender = _sender;\n (bool success, ) = _target.call(_message);\n\n // Mark the message as received if the call was successful. Ensures that a message can be\n // relayed multiple times in the case that the call reverted.\n if (success == true) {\n successfulMessages[xDomainCalldataHash] = true;\n emit RelayedMessage(xDomainCalldataHash);\n }\n\n // Store an identifier that can be used to prove that the given message was relayed by some\n // user. Gives us an easy way to pay relayers for their work.\n bytes32 relayId = keccak256(\n abi.encodePacked(\n xDomainCalldata,\n msg.sender,\n block.number\n )\n );\n relayedMessages[relayId] = true;\n }\n\n /**\n * Replays a cross domain message to the target messenger.\n * @inheritdoc iOVM_L1CrossDomainMessenger\n */\n function replayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce,\n uint32 _gasLimit\n )\n override\n public\n {\n bytes memory xDomainCalldata = _getXDomainCalldata(\n _target,\n _sender,\n _message,\n _messageNonce\n );\n\n require(\n sentMessages[keccak256(xDomainCalldata)] == true,\n \"Provided message has not already been sent.\"\n );\n\n _sendXDomainMessage(xDomainCalldata, _gasLimit);\n }\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Verifies that the given message is valid.\n * @param _xDomainCalldata Calldata to verify.\n * @param _proof Inclusion proof for the message.\n * @return Whether or not the provided message is valid.\n */\n function _verifyXDomainMessage(\n bytes memory _xDomainCalldata,\n L2MessageInclusionProof memory _proof\n )\n internal\n view\n returns (\n bool\n )\n {\n return (\n _verifyStateRootProof(_proof)\n && _verifyStorageProof(_xDomainCalldata, _proof)\n );\n }\n\n /**\n * Verifies that the state root within an inclusion proof is valid.\n * @param _proof Message inclusion proof.\n * @return Whether or not the provided proof is valid.\n */\n function _verifyStateRootProof(\n L2MessageInclusionProof memory _proof\n )\n internal\n view\n returns (\n bool\n )\n {\n iOVM_StateCommitmentChain ovmStateCommitmentChain = iOVM_StateCommitmentChain(resolve(\"OVM_StateCommitmentChain\"));\n\n return (\n ovmStateCommitmentChain.insideFraudProofWindow(_proof.stateRootBatchHeader) == false\n && ovmStateCommitmentChain.verifyStateCommitment(\n _proof.stateRoot,\n _proof.stateRootBatchHeader,\n _proof.stateRootProof\n )\n );\n }\n\n /**\n * Verifies that the storage proof within an inclusion proof is valid.\n * @param _xDomainCalldata Encoded message calldata.\n * @param _proof Message inclusion proof.\n * @return Whether or not the provided proof is valid.\n */\n function _verifyStorageProof(\n bytes memory _xDomainCalldata,\n L2MessageInclusionProof memory _proof\n )\n internal\n view\n returns (\n bool\n )\n {\n bytes32 storageKey = keccak256(\n abi.encodePacked(\n keccak256(\n abi.encodePacked(\n _xDomainCalldata,\n resolve(\"OVM_L2CrossDomainMessenger\")\n )\n ),\n uint256(0)\n )\n );\n\n (\n bool exists,\n bytes memory encodedMessagePassingAccount\n ) = Lib_SecureMerkleTrie.get(\n abi.encodePacked(0x4200000000000000000000000000000000000000),\n _proof.stateTrieWitness,\n _proof.stateRoot\n );\n\n require(\n exists == true,\n \"Message passing precompile has not been initialized or invalid proof provided.\"\n );\n\n Lib_OVMCodec.EVMAccount memory account = Lib_OVMCodec.decodeEVMAccount(\n encodedMessagePassingAccount\n );\n\n return Lib_SecureMerkleTrie.verifyInclusionProof(\n abi.encodePacked(storageKey),\n abi.encodePacked(uint8(1)),\n _proof.storageTrieWitness,\n account.storageRoot\n );\n }\n\n /**\n * Sends a cross domain message.\n * @param _message Message to send.\n * @param _gasLimit OVM gas limit for the message.\n */\n function _sendXDomainMessage(\n bytes memory _message,\n uint256 _gasLimit\n )\n override\n internal\n {\n iOVM_CanonicalTransactionChain(resolve(\"OVM_CanonicalTransactionChain\")).enqueue(\n resolve(\"OVM_L2CrossDomainMessenger\"),\n _gasLimit,\n _message\n );\n }\n}\n" - }, - "contracts/optimistic-ethereum/libraries/utils/Lib_ReentrancyGuard.sol": { - "content": "// SPDX-License-Identifier: MIT\n// +build ovm\npragma solidity >0.5.0 <0.8.0;\n\n/**\n * @dev Contract module that helps prevent reentrant calls to a function.\n *\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\n * available, which can be applied to functions to make sure there are no nested\n * (reentrant) calls to them.\n *\n * Note that because there is a single `nonReentrant` guard, functions marked as\n * `nonReentrant` may not call one another. This can be worked around by making\n * those functions `private`, and then adding `external` `nonReentrant` entry\n * points to them.\n *\n * TIP: If you would like to learn more about reentrancy and alternative ways\n * to protect against it, check out our blog post\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\n */\nabstract contract Lib_ReentrancyGuard {\n // Booleans are more expensive than uint256 or any type that takes up a full\n // word because each write operation emits an extra SLOAD to first read the\n // slot's contents, replace the bits taken up by the boolean, and then write\n // back. This is the compiler's defense against contract upgrades and\n // pointer aliasing, and it cannot be disabled.\n\n // The values being non-zero value makes deployment a bit more expensive,\n // but in exchange the refund on every call to nonReentrant will be lower in\n // amount. Since refunds are capped to a percentage of the total\n // transaction's gas, it is best to keep them low in cases like this one, to\n // increase the likelihood of the full refund coming into effect.\n uint256 private constant _NOT_ENTERED = 1;\n uint256 private constant _ENTERED = 2;\n\n uint256 private _status;\n\n constructor () internal {\n _status = _NOT_ENTERED;\n }\n\n /**\n * @dev Prevents a contract from calling itself, directly or indirectly.\n * Calling a `nonReentrant` function from another `nonReentrant`\n * function is not supported. It is possible to prevent this from happening\n * by making the `nonReentrant` function external, and make it call a\n * `private` function that does the actual work.\n */\n modifier nonReentrant() {\n // On the first call to nonReentrant, _notEntered will be true\n require(_status != _ENTERED, \"ReentrancyGuard: reentrant call\");\n\n // Any calls to nonReentrant after this point will fail\n _status = _ENTERED;\n\n _;\n\n // By storing the original value once again, a refund is triggered (see\n // https://eips.ethereum.org/EIPS/eip-2200)\n _status = _NOT_ENTERED;\n }\n}\n" - }, - "contracts/optimistic-ethereum/iOVM/bridge/iOVM_L1CrossDomainMessenger.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/* Interface Imports */\nimport { iOVM_BaseCrossDomainMessenger } from \"./iOVM_BaseCrossDomainMessenger.sol\";\n\n/**\n * @title iOVM_L1CrossDomainMessenger\n */\ninterface iOVM_L1CrossDomainMessenger is iOVM_BaseCrossDomainMessenger {\n\n /*******************\n * Data Structures *\n *******************/\n\n struct L2MessageInclusionProof {\n bytes32 stateRoot;\n Lib_OVMCodec.ChainBatchHeader stateRootBatchHeader;\n Lib_OVMCodec.ChainInclusionProof stateRootProof;\n bytes stateTrieWitness;\n bytes storageTrieWitness;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Relays a cross domain message to a contract.\n * @param _target Target contract address.\n * @param _sender Message sender address.\n * @param _message Message to send to the target.\n * @param _messageNonce Nonce for the provided message.\n * @param _proof Inclusion proof for the given message.\n */\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce,\n L2MessageInclusionProof memory _proof\n ) external;\n\n /**\n * Replays a cross domain message to the target messenger.\n * @param _target Target contract address.\n * @param _sender Original sender address.\n * @param _message Message to send to the target.\n * @param _messageNonce Nonce for the provided message.\n * @param _gasLimit Gas limit for the provided message.\n */\n function replayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce,\n uint32 _gasLimit\n ) external;\n}\n" - }, - "contracts/optimistic-ethereum/OVM/bridge/OVM_BaseCrossDomainMessenger.sol": { - "content": "// SPDX-License-Identifier: MIT\n// +build ovm\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Interface Imports */\nimport { iOVM_BaseCrossDomainMessenger } from \"../../iOVM/bridge/iOVM_BaseCrossDomainMessenger.sol\";\n\n/* Library Imports */\nimport { Lib_ReentrancyGuard } from \"../../libraries/utils/Lib_ReentrancyGuard.sol\";\n\n/**\n * @title OVM_BaseCrossDomainMessenger\n */\nabstract contract OVM_BaseCrossDomainMessenger is iOVM_BaseCrossDomainMessenger, Lib_ReentrancyGuard {\n\n /**********************\n * Contract Variables *\n **********************/\n\n mapping (bytes32 => bool) public relayedMessages;\n mapping (bytes32 => bool) public successfulMessages;\n mapping (bytes32 => bool) public sentMessages;\n uint256 public messageNonce;\n address override public xDomainMessageSender;\n\n /********************\n * Public Functions *\n ********************/\n\n constructor() Lib_ReentrancyGuard() internal {}\n\n /**\n * Sends a cross domain message to the target messenger.\n * @param _target Target contract address.\n * @param _message Message to send to the target.\n * @param _gasLimit Gas limit for the provided message.\n */\n function sendMessage(\n address _target,\n bytes memory _message,\n uint32 _gasLimit\n )\n override\n public\n {\n bytes memory xDomainCalldata = _getXDomainCalldata(\n _target,\n msg.sender,\n _message,\n messageNonce\n );\n\n messageNonce += 1;\n sentMessages[keccak256(xDomainCalldata)] = true;\n\n _sendXDomainMessage(xDomainCalldata, _gasLimit);\n emit SentMessage(xDomainCalldata);\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Generates the correct cross domain calldata for a message.\n * @param _target Target contract address.\n * @param _sender Message sender address.\n * @param _message Message to send to the target.\n * @param _messageNonce Nonce for the provided message.\n * @return ABI encoded cross domain calldata.\n */\n function _getXDomainCalldata(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n return abi.encodeWithSignature(\n \"relayMessage(address,address,bytes,uint256)\",\n _target,\n _sender,\n _message,\n _messageNonce\n );\n }\n\n /**\n * Sends a cross domain message.\n * @param _message Message to send.\n * @param _gasLimit Gas limit for the provided message.\n */\n function _sendXDomainMessage(\n bytes memory _message,\n uint256 _gasLimit\n )\n virtual\n internal\n {\n revert(\"Implement me in child contracts!\");\n }\n}\n" - }, - "contracts/optimistic-ethereum/iOVM/bridge/iOVM_BaseCrossDomainMessenger.sol": { - "content": "// SPDX-License-Identifier: MIT\n// +build ovm\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/**\n * @title iOVM_BaseCrossDomainMessenger\n */\ninterface iOVM_BaseCrossDomainMessenger {\n\n /**********\n * Events *\n **********/\n event SentMessage(bytes message);\n event RelayedMessage(bytes32 msgHash);\n\n /**********************\n * Contract Variables *\n **********************/\n function xDomainMessageSender() external view returns (address);\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Sends a cross domain message to the target messenger.\n * @param _target Target contract address.\n * @param _message Message to send to the target.\n * @param _gasLimit Gas limit for the provided message.\n */\n function sendMessage(\n address _target,\n bytes calldata _message,\n uint32 _gasLimit\n ) external;\n}\n" - }, - "contracts/optimistic-ethereum/OVM/bridge/OVM_L2CrossDomainMessenger.sol": { - "content": "// SPDX-License-Identifier: MIT\n// +build ovm\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\nimport { Lib_ReentrancyGuard } from \"../../libraries/utils/Lib_ReentrancyGuard.sol\";\n\n/* Interface Imports */\nimport { iOVM_L2CrossDomainMessenger } from \"../../iOVM/bridge/iOVM_L2CrossDomainMessenger.sol\";\nimport { iOVM_L1MessageSender } from \"../../iOVM/precompiles/iOVM_L1MessageSender.sol\";\nimport { iOVM_L2ToL1MessagePasser } from \"../../iOVM/precompiles/iOVM_L2ToL1MessagePasser.sol\";\n\n/* Contract Imports */\nimport { OVM_BaseCrossDomainMessenger } from \"./OVM_BaseCrossDomainMessenger.sol\";\n\n/**\n * @title OVM_L2CrossDomainMessenger\n * @dev L2 CONTRACT (COMPILED)\n * This contract lives on L2. It sends messages to L1, and relays them from L1.\n */\ncontract OVM_L2CrossDomainMessenger is iOVM_L2CrossDomainMessenger, OVM_BaseCrossDomainMessenger, Lib_AddressResolver {\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n constructor(\n address _libAddressManager\n )\n public\n Lib_AddressResolver(_libAddressManager)\n {}\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Relays a cross domain message to a contract.\n * @inheritdoc iOVM_L2CrossDomainMessenger\n */\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce\n )\n override\n nonReentrant\n public\n {\n require(\n _verifyXDomainMessage() == true,\n \"Provided message could not be verified.\"\n );\n\n bytes memory xDomainCalldata = _getXDomainCalldata(\n _target,\n _sender,\n _message,\n _messageNonce\n );\n\n bytes32 xDomainCalldataHash = keccak256(xDomainCalldata);\n\n require(\n successfulMessages[xDomainCalldataHash] == false,\n \"Provided message has already been received.\"\n );\n\n xDomainMessageSender = _sender;\n (bool success, ) = _target.call(_message);\n\n // Mark the message as received if the call was successful. Ensures that a message can be\n // relayed multiple times in the case that the call reverted.\n if (success == true) {\n successfulMessages[xDomainCalldataHash] = true;\n emit RelayedMessage(xDomainCalldataHash);\n }\n\n // Store an identifier that can be used to prove that the given message was relayed by some\n // user. Gives us an easy way to pay relayers for their work.\n bytes32 relayId = keccak256(\n abi.encodePacked(\n xDomainCalldata,\n msg.sender,\n block.number\n )\n );\n relayedMessages[relayId] = true;\n }\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Verifies that a received cross domain message is valid.\n * @return _valid Whether or not the message is valid.\n */\n function _verifyXDomainMessage()\n internal\n returns (\n bool _valid\n )\n {\n return (\n iOVM_L1MessageSender(resolve(\"OVM_L1MessageSender\")).getL1MessageSender() == resolve(\"OVM_L1CrossDomainMessenger\")\n );\n }\n\n /**\n * Sends a cross domain message.\n * @param _message Message to send.\n * @param _gasLimit Gas limit for the provided message.\n */\n function _sendXDomainMessage(\n bytes memory _message,\n uint256 _gasLimit\n )\n override\n internal\n {\n iOVM_L2ToL1MessagePasser(resolve(\"OVM_L2ToL1MessagePasser\")).passMessageToL1(_message);\n }\n}\n" - }, - "contracts/optimistic-ethereum/iOVM/bridge/iOVM_L2CrossDomainMessenger.sol": { - "content": "// SPDX-License-Identifier: MIT\n// +build ovm\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Interface Imports */\nimport { iOVM_BaseCrossDomainMessenger } from \"./iOVM_BaseCrossDomainMessenger.sol\";\n\n/**\n * @title iOVM_L2CrossDomainMessenger\n */\ninterface iOVM_L2CrossDomainMessenger is iOVM_BaseCrossDomainMessenger {\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Relays a cross domain message to a contract.\n * @param _target Target contract address.\n * @param _sender Message sender address.\n * @param _message Message to send to the target.\n * @param _messageNonce Nonce for the provided message.\n */\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce\n ) external;\n}\n" - }, - "contracts/optimistic-ethereum/iOVM/precompiles/iOVM_L1MessageSender.sol": { - "content": "// SPDX-License-Identifier: MIT\n// +build ovm\npragma solidity >0.5.0 <0.8.0;\n\n/**\n * @title iOVM_L1MessageSender\n */\ninterface iOVM_L1MessageSender {\n\n /********************\n * Public Functions *\n ********************/\n\n function getL1MessageSender() external returns (address _l1MessageSender);\n}\n" - }, - "contracts/optimistic-ethereum/iOVM/precompiles/iOVM_L2ToL1MessagePasser.sol": { - "content": "// SPDX-License-Identifier: MIT\n// +build ovm\npragma solidity >0.5.0 <0.8.0;\n\n/**\n * @title iOVM_L2ToL1MessagePasser\n */\ninterface iOVM_L2ToL1MessagePasser {\n\n /**********\n * Events *\n **********/\n\n event L2ToL1Message(\n uint256 _nonce,\n address _sender,\n bytes _data\n );\n\n\n /********************\n * Public Functions *\n ********************/\n\n function passMessageToL1(bytes calldata _message) external;\n}\n" - }, - "contracts/optimistic-ethereum/OVM/precompiles/OVM_L2ToL1MessagePasser.sol": { - "content": "// SPDX-License-Identifier: MIT\n// +build ovm\npragma solidity >0.5.0 <0.8.0;\n\n/* Interface Imports */\nimport { iOVM_L2ToL1MessagePasser } from \"../../iOVM/precompiles/iOVM_L2ToL1MessagePasser.sol\";\n\n/**\n * @title OVM_L2ToL1MessagePasser\n * @dev L2 CONTRACT (COMPILED)\n */\ncontract OVM_L2ToL1MessagePasser is iOVM_L2ToL1MessagePasser {\n\n /**********************\n * Contract Variables *\n **********************/\n\n mapping (bytes32 => bool) public sentMessages;\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Passes a message to L1.\n * @param _message Message to pass to L1.\n */\n function passMessageToL1(\n bytes memory _message\n )\n override\n public\n {\n sentMessages[keccak256(\n abi.encodePacked(\n _message,\n msg.sender\n )\n )] = true;\n }\n}\n" - }, - "contracts/optimistic-ethereum/OVM/precompiles/OVM_L1MessageSender.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.7.0;\n\n/* Interface Imports */\nimport { iOVM_L1MessageSender } from \"../../iOVM/precompiles/iOVM_L1MessageSender.sol\";\nimport { iOVM_ExecutionManager } from \"../../iOVM/execution/iOVM_ExecutionManager.sol\";\n\n/**\n * @title OVM_L1MessageSender\n * @dev L2 CONTRACT (NOT COMPILED)\n */\ncontract OVM_L1MessageSender is iOVM_L1MessageSender {\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @return _l1MessageSender L1 message sender address (msg.sender).\n */\n function getL1MessageSender()\n override\n public\n view\n returns (\n address _l1MessageSender\n )\n {\n return iOVM_ExecutionManager(msg.sender).ovmL1TXORIGIN();\n }\n}\n" - }, - "contracts/optimistic-ethereum/OVM/precompiles/OVM_ETH.sol": { - "content": "// SPDX-License-Identifier: MIT\n// +build ovm\npragma solidity >0.5.0 <0.8.0;\n\n/* Library Imports */\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/* Interface Imports */\nimport { iOVM_ERC20 } from \"../../iOVM/precompiles/iOVM_ERC20.sol\";\nimport { iOVM_BaseCrossDomainMessenger } from \"../../iOVM/bridge/iOVM_BaseCrossDomainMessenger.sol\";\n\n/**\n * @title OVM_ETH\n * @dev L2 CONTRACT (COMPILED)\n */\ncontract OVM_ETH is iOVM_ERC20, Lib_AddressResolver {\n\n uint256 constant private MAX_UINT256 = 2**256 - 1;\n mapping (address => uint256) public balances;\n mapping (address => mapping (address => uint256)) public allowed;\n /*\n NOTE:\n The following variables are OPTIONAL vanities. One does not have to include them.\n They allow one to customise the token contract & in no way influences the core functionality.\n Some wallets/interfaces might not even bother to look at this information.\n */\n string public name; //fancy name: eg OVM Coin\n uint8 public decimals; //How many decimals to show.\n string public symbol; //An identifier: eg OVM\n uint256 public override totalSupply;\n\n constructor(\n address _libAddressManager,\n uint256 _initialAmount,\n string memory _tokenName,\n uint8 _decimalUnits,\n string memory _tokenSymbol\n )\n public\n Lib_AddressResolver(_libAddressManager)\n {\n balances[msg.sender] = _initialAmount; // Give the creator all initial tokens\n totalSupply = _initialAmount; // Update total supply\n name = _tokenName; // Set the name for display purposes\n decimals = _decimalUnits; // Amount of decimals for display purposes\n symbol = _tokenSymbol; // Set the symbol for display purposes\n }\n\n modifier onlyOVMETHBridge() {\n address bridgeOnL2 = resolve(\"OVM_L2ETHBridge\");\n require(bridgeOnL2 != address(0), \"OVM_L2ETHBridge is not yet initialized.\");\n require(msg.sender == bridgeOnL2, \"Only callable by OVM ETH Deposit/Withdrawal contract\");\n _;\n }\n\n function transfer(address _to, uint256 _value) external override returns (bool success) {\n require(balances[msg.sender] >= _value);\n balances[msg.sender] -= _value;\n balances[_to] += _value;\n emit Transfer(msg.sender, _to, _value);\n return true;\n }\n\n function transferFrom(address _from, address _to, uint256 _value) external override returns (bool success) {\n uint256 allowance = allowed[_from][msg.sender];\n require(balances[_from] >= _value && allowance >= _value);\n balances[_to] += _value;\n balances[_from] -= _value;\n if (allowance < MAX_UINT256) {\n allowed[_from][msg.sender] -= _value;\n }\n emit Transfer(_from, _to, _value);\n return true;\n }\n\n function balanceOf(address _owner) external view override returns (uint256 balance) {\n return balances[_owner];\n }\n\n function approve(address _spender, uint256 _value) external override returns (bool success) {\n allowed[msg.sender][_spender] = _value;\n emit Approval(msg.sender, _spender, _value);\n return true;\n }\n\n function allowance(address _owner, address _spender) external view override returns (uint256 remaining) {\n return allowed[_owner][_spender];\n }\n\n function mint(address _account, uint256 _amount) external onlyOVMETHBridge returns (bool success) {\n uint256 newTotalSupply = totalSupply + _amount;\n require(newTotalSupply >= totalSupply, \"SafeMath: addition overflow\");\n totalSupply = newTotalSupply;\n balances[_account] += _amount;\n\n emit Mint(_account, _amount);\n return true;\n }\n\n function burn(address _account, uint256 _amount) external onlyOVMETHBridge returns (bool success) {\n require(balances[_account] >= _amount, \"Unable to burn due to insufficient balance\");\n balances[_account] -= _amount;\n totalSupply -= _amount;\n\n emit Burn(_account, _amount);\n return true;\n }\n}\n" - }, - "contracts/optimistic-ethereum/iOVM/precompiles/iOVM_ERC20.sol": { - "content": "// SPDX-License-Identifier: MIT\n// +build ovm\npragma solidity >0.5.0 <0.8.0;\n\n/**\n * @title iOVM_ERC20\n */\ninterface iOVM_ERC20 {\n /* This is a slight change to the ERC20 base standard.\n function totalSupply() constant returns (uint256 supply);\n is replaced with:\n uint256 public totalSupply;\n This automatically creates a getter function for the totalSupply.\n This is moved to the base contract since public getter functions are not\n currently recognised as an implementation of the matching abstract\n function by the compiler.\n */\n /// total amount of tokens\n function totalSupply() external view returns (uint256);\n\n /// @param _owner The address from which the balance will be retrieved\n /// @return balance The balance\n function balanceOf(address _owner) external view returns (uint256 balance);\n\n /// @notice send `_value` token to `_to` from `msg.sender`\n /// @param _to The address of the recipient\n /// @param _value The amount of token to be transferred\n /// @return success Whether the transfer was successful or not\n function transfer(address _to, uint256 _value) external returns (bool success);\n\n /// @notice send `_value` token to `_to` from `_from` on the condition it is approved by `_from`\n /// @param _from The address of the sender\n /// @param _to The address of the recipient\n /// @param _value The amount of token to be transferred\n /// @return success Whether the transfer was successful or not\n function transferFrom(address _from, address _to, uint256 _value) external returns (bool success);\n\n /// @notice `msg.sender` approves `_spender` to spend `_value` tokens\n /// @param _spender The address of the account able to transfer the tokens\n /// @param _value The amount of tokens to be approved for transfer\n /// @return success Whether the approval was successful or not\n function approve(address _spender, uint256 _value) external returns (bool success);\n\n /// @param _owner The address of the account owning tokens\n /// @param _spender The address of the account able to transfer the tokens\n /// @return remaining Amount of remaining tokens allowed to spent\n function allowance(address _owner, address _spender) external view returns (uint256 remaining);\n\n // solhint-disable-next-line no-simple-event-func-name\n event Transfer(address indexed _from, address indexed _to, uint256 _value);\n event Approval(address indexed _owner, address indexed _spender, uint256 _value);\n event Mint(address indexed _account, uint256 _amount);\n event Burn(address indexed _account, uint256 _amount);\n}\n" - }, - "contracts/optimistic-ethereum/mockOVM/bridge/mockOVM_CrossDomainMessenger.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.7.0;\npragma experimental ABIEncoderV2;\n\n/* Contract Imports */\nimport { iOVM_BaseCrossDomainMessenger } from \"../../iOVM/bridge/iOVM_BaseCrossDomainMessenger.sol\";\n\n/**\n * @title mockOVM_CrossDomainMessenger\n */\ncontract mockOVM_CrossDomainMessenger is iOVM_BaseCrossDomainMessenger {\n\n /***********\n * Structs *\n ***********/\n\n struct ReceivedMessage {\n uint256 timestamp;\n address target;\n address sender;\n bytes message;\n uint256 messageNonce;\n uint32 gasLimit;\n }\n\n\n /**********************\n * Contract Variables *\n **********************/\n\n ReceivedMessage[] internal fullReceivedMessages;\n address internal targetMessengerAddress;\n uint256 internal lastRelayedMessage;\n uint256 internal delay;\n uint256 public messageNonce;\n address override public xDomainMessageSender;\n\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _delay Time in seconds before a message can be relayed.\n */\n constructor(\n uint256 _delay\n ) {\n delay = _delay;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Sets the target messenger address.\n * @dev Currently, this function is public and therefore allows anyone to modify the target\n * messenger for a given xdomain messenger contract. Obviously this shouldn't be allowed,\n * but we still need to determine an adequate mechanism for updating this address.\n * @param _targetMessengerAddress New messenger address.\n */\n function setTargetMessengerAddress(\n address _targetMessengerAddress\n )\n public\n {\n targetMessengerAddress = _targetMessengerAddress;\n }\n\n /**\n * Sends a message to another mock xdomain messenger.\n * @param _target Target for the message.\n * @param _message Message to send.\n * @param _gasLimit Amount of gas to send with the call.\n */\n function sendMessage(\n address _target,\n bytes memory _message,\n uint32 _gasLimit\n )\n override\n public\n {\n mockOVM_CrossDomainMessenger targetMessenger = mockOVM_CrossDomainMessenger(\n targetMessengerAddress\n );\n\n // Just send it over!\n targetMessenger.receiveMessage(ReceivedMessage({\n timestamp: block.timestamp,\n target: _target,\n sender: msg.sender,\n message: _message,\n messageNonce: messageNonce,\n gasLimit: _gasLimit\n }));\n\n messageNonce += 1;\n }\n\n /**\n * Receives a message to be sent later.\n * @param _message Message to send later.\n */\n function receiveMessage(\n ReceivedMessage memory _message\n )\n public\n {\n fullReceivedMessages.push(_message);\n }\n\n /**\n * Checks whether we have messages to relay.\n * @param _exists Whether or not we have more messages to relay.\n */\n function hasNextMessage()\n public\n view\n returns (\n bool _exists\n )\n {\n return fullReceivedMessages.length > lastRelayedMessage;\n }\n\n /**\n * Relays the last received message not yet relayed.\n */\n function relayNextMessage()\n public\n {\n require(hasNextMessage(), \"No pending messages to relay\");\n ReceivedMessage memory nextMessage = fullReceivedMessages[lastRelayedMessage];\n require(nextMessage.timestamp + delay < block.timestamp, \"Message is not ready to be relayed. The delay period is not up yet!\");\n\n xDomainMessageSender = nextMessage.sender;\n (bool success,) = nextMessage.target.call{gas: nextMessage.gasLimit}(nextMessage.message);\n require(success, \"Cross-domain message call reverted. Did you set your gas limit high enough?\");\n lastRelayedMessage += 1;\n }\n}\n" - }, - "contracts/test-libraries/trie/TestLib_SecureMerkleTrie.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.7.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_SecureMerkleTrie } from \"../../optimistic-ethereum/libraries/trie/Lib_SecureMerkleTrie.sol\";\n\n/**\n * @title TestLib_SecureMerkleTrie\n */\ncontract TestLib_SecureMerkleTrie {\n\n function verifyInclusionProof(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n )\n public\n pure\n returns (\n bool\n )\n {\n return Lib_SecureMerkleTrie.verifyInclusionProof(\n _key,\n _value,\n _proof,\n _root\n );\n }\n\n function verifyExclusionProof(\n bytes memory _key,\n bytes memory _proof,\n bytes32 _root\n )\n public\n pure\n returns (\n bool\n )\n {\n return Lib_SecureMerkleTrie.verifyExclusionProof(\n _key,\n _proof,\n _root\n );\n }\n\n function update(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n )\n public\n pure\n returns (\n bytes32\n )\n {\n return Lib_SecureMerkleTrie.update(\n _key,\n _value,\n _proof,\n _root\n );\n }\n\n function get(\n bytes memory _key,\n bytes memory _proof,\n bytes32 _root\n )\n public\n pure\n returns (\n bool,\n bytes memory\n )\n {\n return Lib_SecureMerkleTrie.get(\n _key,\n _proof,\n _root\n );\n }\n\n function getSingleNodeRootHash(\n bytes memory _key,\n bytes memory _value\n )\n public\n pure\n returns (\n bytes32\n )\n {\n return Lib_SecureMerkleTrie.getSingleNodeRootHash(\n _key,\n _value\n );\n }\n}\n" - }, - "contracts/test-libraries/trie/TestLib_MerkleTrie.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.7.0;\n\n/* Library Imports */\nimport { Lib_MerkleTrie } from \"../../optimistic-ethereum/libraries/trie/Lib_MerkleTrie.sol\";\n\n/**\n * @title TestLib_MerkleTrie\n */\ncontract TestLib_MerkleTrie {\n\n function verifyInclusionProof(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n )\n public\n pure\n returns (\n bool\n )\n {\n return Lib_MerkleTrie.verifyInclusionProof(\n _key,\n _value,\n _proof,\n _root\n );\n }\n\n function verifyExclusionProof(\n bytes memory _key,\n bytes memory _proof,\n bytes32 _root\n )\n public\n pure\n returns (\n bool\n )\n {\n return Lib_MerkleTrie.verifyExclusionProof(\n _key,\n _proof,\n _root\n );\n }\n\n function update(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n )\n public\n pure\n returns (\n bytes32\n )\n {\n return Lib_MerkleTrie.update(\n _key,\n _value,\n _proof,\n _root\n );\n }\n\n function get(\n bytes memory _key,\n bytes memory _proof,\n bytes32 _root\n )\n public\n pure\n returns (\n bool,\n bytes memory\n )\n {\n return Lib_MerkleTrie.get(\n _key,\n _proof,\n _root\n );\n }\n\n function getSingleNodeRootHash(\n bytes memory _key,\n bytes memory _value\n )\n public\n pure\n returns (\n bytes32\n )\n {\n return Lib_MerkleTrie.getSingleNodeRootHash(\n _key,\n _value\n );\n }\n}\n" - }, - "contracts/test-libraries/rlp/TestLib_RLPWriter.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.7.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_RLPWriter } from \"../../optimistic-ethereum/libraries/rlp/Lib_RLPWriter.sol\";\nimport { TestERC20 } from \"../../test-helpers/TestERC20.sol\";\n\n/**\n * @title TestLib_RLPWriter\n */\ncontract TestLib_RLPWriter {\n\n function writeBytes(\n bytes memory _in\n )\n public\n pure\n returns (\n bytes memory _out\n )\n {\n return Lib_RLPWriter.writeBytes(_in);\n }\n\n function writeList(\n bytes[] memory _in\n )\n public\n pure\n returns (\n bytes memory _out\n )\n {\n return Lib_RLPWriter.writeList(_in);\n }\n\n function writeString(\n string memory _in\n )\n public\n pure\n returns (\n bytes memory _out\n )\n {\n return Lib_RLPWriter.writeString(_in);\n }\n\n function writeAddress(\n address _in\n )\n public\n pure\n returns (\n bytes memory _out\n )\n {\n return Lib_RLPWriter.writeAddress(_in);\n }\n\n function writeUint(\n uint256 _in\n )\n public\n pure\n returns (\n bytes memory _out\n )\n {\n return Lib_RLPWriter.writeUint(_in);\n }\n\n function writeBool(\n bool _in\n )\n public\n pure\n returns (\n bytes memory _out\n )\n {\n return Lib_RLPWriter.writeBool(_in);\n }\n\n function writeAddressWithTaintedMemory(\n address _in\n )\n public\n returns (\n bytes memory _out\n )\n {\n new TestERC20();\n return Lib_RLPWriter.writeAddress(_in);\n }\n}\n" - }, - "contracts/test-helpers/TestERC20.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.7.0;\n\n// a test ERC20 token with an open mint function\ncontract TestERC20 {\n using SafeMath for uint;\n\n string public constant name = 'Test';\n string public constant symbol = 'TST';\n uint8 public constant decimals = 18;\n uint256 public totalSupply;\n mapping(address => uint) public balanceOf;\n mapping(address => mapping(address => uint)) public allowance;\n\n event Approval(address indexed owner, address indexed spender, uint256 value);\n event Transfer(address indexed from, address indexed to, uint256 value);\n\n constructor() public {}\n\n function mint(address to, uint256 value) public {\n totalSupply = totalSupply.add(value);\n balanceOf[to] = balanceOf[to].add(value);\n emit Transfer(address(0), to, value);\n }\n\n function _approve(address owner, address spender, uint256 value) private {\n allowance[owner][spender] = value;\n emit Approval(owner, spender, value);\n }\n\n function _transfer(address from, address to, uint256 value) private {\n balanceOf[from] = balanceOf[from].sub(value);\n balanceOf[to] = balanceOf[to].add(value);\n emit Transfer(from, to, value);\n }\n\n function approve(address spender, uint256 value) external returns (bool) {\n _approve(msg.sender, spender, value);\n return true;\n }\n\n function transfer(address to, uint256 value) external returns (bool) {\n _transfer(msg.sender, to, value);\n return true;\n }\n\n function transferFrom(address from, address to, uint256 value) external returns (bool) {\n if (allowance[from][msg.sender] != uint(-1)) {\n allowance[from][msg.sender] = allowance[from][msg.sender].sub(value);\n }\n _transfer(from, to, value);\n return true;\n }\n}\n\nlibrary SafeMath {\n function add(uint256 x, uint256 y) internal pure returns (uint256 z) {\n require((z = x + y) >= x, 'ds-math-add-overflow');\n }\n\n function sub(uint256 x, uint256 y) internal pure returns (uint256 z) {\n require((z = x - y) <= x, 'ds-math-sub-underflow');\n }\n\n function mul(uint256 x, uint256 y) internal pure returns (uint256 z) {\n require(y == 0 || (z = x * y) / y == x, 'ds-math-mul-overflow');\n }\n}\n" - }, - "contracts/test-libraries/utils/TestLib_BytesUtils.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.7.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_BytesUtils } from \"../../optimistic-ethereum/libraries/utils/Lib_BytesUtils.sol\";\nimport { TestERC20 } from \"../../test-helpers/TestERC20.sol\";\n\n/**\n * @title TestLib_BytesUtils\n */\ncontract TestLib_BytesUtils {\n\n function concat(\n bytes memory _preBytes,\n bytes memory _postBytes\n )\n public\n pure\n returns (bytes memory)\n {\n return Lib_BytesUtils.concat(\n _preBytes,\n _postBytes\n );\n }\n\n function slice(\n bytes memory _bytes,\n uint256 _start,\n uint256 _length\n )\n public\n pure\n returns (bytes memory)\n {\n return Lib_BytesUtils.slice(\n _bytes,\n _start,\n _length\n );\n }\n\n function toBytes32(\n bytes memory _bytes\n )\n public\n pure\n returns (bytes32)\n {\n return Lib_BytesUtils.toBytes32(\n _bytes\n );\n }\n\n function toUint256(\n bytes memory _bytes\n )\n public\n pure\n returns (uint256)\n {\n return Lib_BytesUtils.toUint256(\n _bytes\n );\n }\n\n function toNibbles(\n bytes memory _bytes\n )\n public\n pure\n returns (bytes memory)\n {\n return Lib_BytesUtils.toNibbles(\n _bytes\n );\n }\n\n function fromNibbles(\n bytes memory _bytes\n )\n public\n pure\n returns (bytes memory)\n {\n return Lib_BytesUtils.fromNibbles(\n _bytes\n );\n }\n\n function equal(\n bytes memory _bytes,\n bytes memory _other\n )\n public\n pure\n returns (bool)\n {\n return Lib_BytesUtils.equal(\n _bytes,\n _other\n );\n }\n\n function sliceWithTaintedMemory(\n bytes memory _bytes,\n uint256 _start,\n uint256 _length\n )\n public\n returns (bytes memory)\n {\n new TestERC20();\n return Lib_BytesUtils.slice(\n _bytes,\n _start,\n _length\n );\n }\n}\n" - }, - "contracts/test-libraries/utils/TestLib_EthUtils.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.7.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_EthUtils } from \"../../optimistic-ethereum/libraries/utils/Lib_EthUtils.sol\";\n\n/**\n * @title TestLib_EthUtils\n */\ncontract TestLib_EthUtils {\n\n function getCode(\n address _address,\n uint256 _offset,\n uint256 _length\n )\n public\n view\n returns (\n bytes memory _code\n )\n {\n return Lib_EthUtils.getCode(\n _address,\n _offset,\n _length\n );\n }\n\n function getCode(\n address _address\n )\n public\n view\n returns (\n bytes memory _code\n )\n {\n return Lib_EthUtils.getCode(\n _address\n );\n }\n\n function getCodeSize(\n address _address\n )\n public\n view\n returns (\n uint256 _codeSize\n )\n {\n return Lib_EthUtils.getCodeSize(\n _address\n );\n }\n\n function getCodeHash(\n address _address\n )\n public\n view\n returns (\n bytes32 _codeHash\n )\n {\n return Lib_EthUtils.getCodeHash(\n _address\n );\n }\n\n function createContract(\n bytes memory _code\n )\n public\n returns (\n address _created\n )\n {\n return Lib_EthUtils.createContract(\n _code\n );\n }\n\n function getAddressForCREATE(\n address _creator,\n uint256 _nonce\n )\n public\n pure\n returns (\n address _address\n )\n {\n return Lib_EthUtils.getAddressForCREATE(\n _creator,\n _nonce\n );\n }\n\n function getAddressForCREATE2(\n address _creator,\n bytes memory _bytecode,\n bytes32 _salt\n )\n public\n pure\n returns (address _address)\n {\n return Lib_EthUtils.getAddressForCREATE2(\n _creator,\n _bytecode,\n _salt\n );\n }\n}\n" - }, - "contracts/test-libraries/utils/TestLib_Bytes32Utils.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.7.0;\n\n/* Library Imports */\nimport { Lib_Bytes32Utils } from \"../../optimistic-ethereum/libraries/utils/Lib_Bytes32Utils.sol\";\n\n/**\n * @title TestLib_Byte32Utils\n */\ncontract TestLib_Bytes32Utils {\n\n function toBool(\n bytes32 _in\n )\n public\n pure\n returns (\n bool _out\n )\n {\n return Lib_Bytes32Utils.toBool(_in);\n }\n\n function fromBool(\n bool _in\n )\n public\n pure\n returns (\n bytes32 _out\n )\n {\n return Lib_Bytes32Utils.fromBool(_in);\n }\n\n function toAddress(\n bytes32 _in\n )\n public\n pure\n returns (\n address _out\n )\n {\n return Lib_Bytes32Utils.toAddress(_in);\n }\n\n function fromAddress(\n address _in\n )\n public\n pure\n returns (\n bytes32 _out\n )\n {\n return Lib_Bytes32Utils.fromAddress(_in);\n }\n}\n" - }, - "contracts/test-libraries/rlp/TestLib_RLPReader.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.7.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_RLPReader } from \"../../optimistic-ethereum/libraries/rlp/Lib_RLPReader.sol\";\n\n/**\n * @title TestLib_RLPReader\n */\ncontract TestLib_RLPReader {\n\n function readList(\n bytes memory _in\n )\n public\n pure\n returns (\n bytes[] memory\n )\n {\n Lib_RLPReader.RLPItem[] memory decoded = Lib_RLPReader.readList(_in);\n bytes[] memory out = new bytes[](decoded.length);\n for (uint256 i = 0; i < out.length; i++) {\n out[i] = Lib_RLPReader.readRawBytes(decoded[i]);\n }\n return out;\n }\n\n function readString(\n bytes memory _in\n )\n public\n pure\n returns (\n string memory\n )\n {\n return Lib_RLPReader.readString(_in);\n }\n\n function readBytes(\n bytes memory _in\n )\n public\n pure\n returns (\n bytes memory\n )\n {\n return Lib_RLPReader.readBytes(_in);\n }\n\n function readBytes32(\n bytes memory _in\n )\n public\n pure\n returns (\n bytes32\n )\n {\n return Lib_RLPReader.readBytes32(_in);\n }\n\n function readUint256(\n bytes memory _in\n )\n public\n pure\n returns (\n uint256\n )\n {\n return Lib_RLPReader.readUint256(_in);\n }\n\n function readBool(\n bytes memory _in\n )\n public\n pure\n returns (\n bool\n )\n {\n return Lib_RLPReader.readBool(_in);\n }\n\n function readAddress(\n bytes memory _in\n )\n public\n pure\n returns (\n address\n )\n {\n return Lib_RLPReader.readAddress(_in);\n }\n}\n" - }, - "contracts/optimistic-ethereum/libraries/resolver/Lib_ResolvedDelegateProxy.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.7.0;\n\n/* Library Imports */\nimport { Lib_AddressManager } from \"./Lib_AddressManager.sol\";\n\n/**\n * @title Lib_ResolvedDelegateProxy\n */\ncontract Lib_ResolvedDelegateProxy {\n\n /*************\n * Variables *\n *************/\n\n // Using mappings to store fields to avoid overwriting storage slots in the\n // implementation contract. For example, instead of storing these fields at\n // storage slot `0` & `1`, they are stored at `hash(${FIELD_NAME} + address(this))`\n // See: https://solidity.readthedocs.io/en/v0.7.0/internals/layout_in_storage.html\n mapping(address=>string) private implementationName;\n mapping(address=>Lib_AddressManager) private addressManager;\n\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Lib_AddressManager.\n * @param _implementationName implementationName of the contract to proxy to.\n */\n constructor(\n address _libAddressManager,\n string memory _implementationName\n )\n {\n addressManager[address(this)] = Lib_AddressManager(_libAddressManager);\n implementationName[address(this)] = _implementationName;\n }\n\n\n /*********************\n * Fallback Function *\n *********************/\n\n fallback()\n external\n {\n address target = addressManager[address(this)].getAddress((implementationName[address(this)]));\n require(\n target != address(0),\n \"Target address must be initialized.\"\n );\n\n (bool success, bytes memory returndata) = target.delegatecall(msg.data);\n\n if (success == true) {\n assembly {\n return(add(returndata, 0x20), mload(returndata))\n }\n } else {\n assembly {\n revert(add(returndata, 0x20), mload(returndata))\n }\n }\n }\n}\n" - }, - "contracts/test-libraries/utils/TestLib_MerkleTree.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.7.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_MerkleTree } from \"../../optimistic-ethereum/libraries/utils/Lib_MerkleTree.sol\";\n\n/**\n * @title TestLib_MerkleTree\n */\ncontract TestLib_MerkleTree {\n\n function getMerkleRoot(\n bytes32[] memory _elements\n )\n public\n view\n returns (\n bytes32\n )\n {\n return Lib_MerkleTree.getMerkleRoot(\n _elements\n );\n }\n\n function verify(\n bytes32 _root,\n bytes32 _leaf,\n uint256 _index,\n bytes32[] memory _siblings,\n uint256 _totalLeaves\n )\n public\n pure\n returns (\n bool\n )\n {\n return Lib_MerkleTree.verify(\n _root,\n _leaf,\n _index,\n _siblings,\n _totalLeaves\n );\n }\n}\n" - }, - "contracts/optimistic-ethereum/mockOVM/verification/mockOVM_BondManager.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.7.0;\n\n/* Interface Imports */\nimport { iOVM_BondManager } from \"../../iOVM/verification/iOVM_BondManager.sol\";\n\n/* Contract Imports */\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/**\n * @title mockOVM_BondManager\n */\ncontract mockOVM_BondManager is iOVM_BondManager, Lib_AddressResolver {\n constructor(\n address _libAddressManager\n )\n Lib_AddressResolver(_libAddressManager)\n {}\n\n function recordGasSpent(\n bytes32 _preStateRoot,\n bytes32 _txHash,\n address _who,\n uint256 _gasSpent\n )\n override\n public\n {}\n\n function finalize(\n bytes32 _preStateRoot,\n address _publisher,\n uint256 _timestamp\n )\n override\n public\n {}\n\n function deposit()\n override\n public\n {}\n\n function startWithdrawal()\n override\n public\n {}\n\n function finalizeWithdrawal()\n override\n public\n {}\n\n function claim(\n address _who\n )\n override\n public\n {}\n\n function isCollateralized(\n address _who\n )\n override\n public\n view\n returns (\n bool\n )\n {\n // Only authenticate sequencer to submit state root batches.\n return _who == resolve(\"OVM_Sequencer\");\n }\n\n function getGasSpent(\n bytes32 _preStateRoot,\n address _who\n )\n override\n public\n view\n returns (\n uint256\n )\n {\n return 0;\n }\n}\n" - }, - "contracts/optimistic-ethereum/OVM/execution/OVM_StateManagerFactory.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.7.0;\n\n/* Interface Imports */\nimport { iOVM_StateManager } from \"../../iOVM/execution/iOVM_StateManager.sol\";\nimport { iOVM_StateManagerFactory } from \"../../iOVM/execution/iOVM_StateManagerFactory.sol\";\n\n/* Contract Imports */\nimport { OVM_StateManager } from \"./OVM_StateManager.sol\";\n\n/**\n * @title OVM_StateManagerFactory\n */\ncontract OVM_StateManagerFactory is iOVM_StateManagerFactory {\n\n /***************************************\n * Public Functions: Contract Creation *\n ***************************************/\n\n /**\n * Creates a new OVM_StateManager\n * @param _owner Owner of the created contract.\n * @return _ovmStateManager New OVM_StateManager instance.\n */\n function create(\n address _owner\n )\n override\n public\n returns (\n iOVM_StateManager _ovmStateManager\n )\n {\n return new OVM_StateManager(_owner);\n }\n}\n" - }, - "contracts/optimistic-ethereum/OVM/execution/OVM_StateManager.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.7.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/* Interface Imports */\nimport { iOVM_StateManager } from \"../../iOVM/execution/iOVM_StateManager.sol\";\n\n/**\n * @title OVM_StateManager\n */\ncontract OVM_StateManager is iOVM_StateManager {\n\n /**********************\n * Contract Constants *\n **********************/\n\n bytes32 constant internal EMPTY_ACCOUNT_STORAGE_ROOT = 0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421;\n bytes32 constant internal EMPTY_ACCOUNT_CODE_HASH = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;\n bytes32 constant internal STORAGE_XOR_VALUE = 0xFEEDFACECAFEBEEFFEEDFACECAFEBEEFFEEDFACECAFEBEEFFEEDFACECAFEBEEF;\n\n\n /*******************************************\n * Contract Variables: Contract References *\n *******************************************/\n\n address override public owner;\n address override public ovmExecutionManager;\n\n\n /****************************************\n * Contract Variables: Internal Storage *\n ****************************************/\n\n mapping (address => Lib_OVMCodec.Account) internal accounts;\n mapping (address => mapping (bytes32 => bytes32)) internal contractStorage;\n mapping (address => mapping (bytes32 => bool)) internal verifiedContractStorage;\n mapping (bytes32 => ItemState) internal itemStates;\n uint256 internal totalUncommittedAccounts;\n uint256 internal totalUncommittedContractStorage;\n\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _owner Address of the owner of this contract.\n */\n constructor(\n address _owner\n ) {\n owner = _owner;\n }\n\n\n /**********************\n * Function Modifiers *\n **********************/\n\n /**\n * Simple authentication, this contract should only be accessible to the owner or to the\n * OVM_ExecutionManager during the transaction execution process.\n */\n modifier authenticated() {\n require(\n msg.sender == owner || msg.sender == ovmExecutionManager,\n \"Function can only be called by authenticated addresses\"\n );\n _;\n }\n\n /***************************\n * Public Functions: Misc *\n ***************************/\n\n\n function isAuthenticated(\n address _address\n )\n override\n public\n view\n returns (bool)\n {\n return (_address == owner || _address == ovmExecutionManager);\n }\n\n /***************************\n * Public Functions: Setup *\n ***************************/\n\n /**\n * Sets the address of the OVM_ExecutionManager.\n * @param _ovmExecutionManager Address of the OVM_ExecutionManager.\n */\n function setExecutionManager(\n address _ovmExecutionManager\n )\n override\n public\n authenticated\n {\n ovmExecutionManager = _ovmExecutionManager;\n }\n\n\n /************************************\n * Public Functions: Account Access *\n ************************************/\n\n /**\n * Inserts an account into the state.\n * @param _address Address of the account to insert.\n * @param _account Account to insert for the given address.\n */\n function putAccount(\n address _address,\n Lib_OVMCodec.Account memory _account\n )\n override\n public\n authenticated\n {\n accounts[_address] = _account;\n }\n\n /**\n * Marks an account as empty.\n * @param _address Address of the account to mark.\n */\n function putEmptyAccount(\n address _address\n )\n override\n public\n authenticated\n {\n Lib_OVMCodec.Account storage account = accounts[_address];\n account.storageRoot = EMPTY_ACCOUNT_STORAGE_ROOT;\n account.codeHash = EMPTY_ACCOUNT_CODE_HASH;\n }\n\n /**\n * Retrieves an account from the state.\n * @param _address Address of the account to retrieve.\n * @return _account Account for the given address.\n */\n function getAccount(address _address)\n override\n public\n view\n returns (\n Lib_OVMCodec.Account memory _account\n )\n {\n return accounts[_address];\n }\n\n /**\n * Checks whether the state has a given account.\n * @param _address Address of the account to check.\n * @return _exists Whether or not the state has the account.\n */\n function hasAccount(\n address _address\n )\n override\n public\n view\n returns (\n bool _exists\n )\n {\n return accounts[_address].codeHash != bytes32(0);\n }\n\n /**\n * Checks whether the state has a given known empty account.\n * @param _address Address of the account to check.\n * @return _exists Whether or not the state has the empty account.\n */\n function hasEmptyAccount(\n address _address\n )\n override\n public\n view\n returns (\n bool _exists\n )\n {\n return (\n accounts[_address].codeHash == EMPTY_ACCOUNT_CODE_HASH\n && accounts[_address].nonce == 0\n );\n }\n\n /**\n * Sets the nonce of an account.\n * @param _address Address of the account to modify.\n * @param _nonce New account nonce.\n */\n function setAccountNonce(\n address _address,\n uint256 _nonce\n )\n override\n public\n authenticated\n {\n accounts[_address].nonce = _nonce;\n }\n\n /**\n * Gets the nonce of an account.\n * @param _address Address of the account to access.\n * @return _nonce Nonce of the account.\n */\n function getAccountNonce(\n address _address\n )\n override\n public\n view\n returns (\n uint256 _nonce\n )\n {\n return accounts[_address].nonce;\n }\n\n /**\n * Retrieves the Ethereum address of an account.\n * @param _address Address of the account to access.\n * @return _ethAddress Corresponding Ethereum address.\n */\n function getAccountEthAddress(\n address _address\n )\n override\n public\n view\n returns (\n address _ethAddress\n )\n {\n return accounts[_address].ethAddress;\n }\n\n /**\n * Retrieves the storage root of an account.\n * @param _address Address of the account to access.\n * @return _storageRoot Corresponding storage root.\n */\n function getAccountStorageRoot(\n address _address\n )\n override\n public\n view\n returns (\n bytes32 _storageRoot\n )\n {\n return accounts[_address].storageRoot;\n }\n\n /**\n * Initializes a pending account (during CREATE or CREATE2) with the default values.\n * @param _address Address of the account to initialize.\n */\n function initPendingAccount(\n address _address\n )\n override\n public\n authenticated\n {\n Lib_OVMCodec.Account storage account = accounts[_address];\n account.nonce = 1;\n account.storageRoot = EMPTY_ACCOUNT_STORAGE_ROOT;\n account.codeHash = EMPTY_ACCOUNT_CODE_HASH;\n account.isFresh = true;\n }\n\n /**\n * Finalizes the creation of a pending account (during CREATE or CREATE2).\n * @param _address Address of the account to finalize.\n * @param _ethAddress Address of the account's associated contract on Ethereum.\n * @param _codeHash Hash of the account's code.\n */\n function commitPendingAccount(\n address _address,\n address _ethAddress,\n bytes32 _codeHash\n )\n override\n public\n authenticated\n {\n Lib_OVMCodec.Account storage account = accounts[_address];\n account.ethAddress = _ethAddress;\n account.codeHash = _codeHash;\n }\n\n /**\n * Checks whether an account has already been retrieved, and marks it as retrieved if not.\n * @param _address Address of the account to check.\n * @return _wasAccountAlreadyLoaded Whether or not the account was already loaded.\n */\n function testAndSetAccountLoaded(\n address _address\n )\n override\n public\n authenticated\n returns (\n bool _wasAccountAlreadyLoaded\n )\n {\n return _testAndSetItemState(\n _getItemHash(_address),\n ItemState.ITEM_LOADED\n );\n }\n\n /**\n * Checks whether an account has already been modified, and marks it as modified if not.\n * @param _address Address of the account to check.\n * @return _wasAccountAlreadyChanged Whether or not the account was already modified.\n */\n function testAndSetAccountChanged(\n address _address\n )\n override\n public\n authenticated\n returns (\n bool _wasAccountAlreadyChanged\n )\n {\n return _testAndSetItemState(\n _getItemHash(_address),\n ItemState.ITEM_CHANGED\n );\n }\n\n /**\n * Attempts to mark an account as committed.\n * @param _address Address of the account to commit.\n * @return _wasAccountCommitted Whether or not the account was committed.\n */\n function commitAccount(\n address _address\n )\n override\n public\n authenticated\n returns (\n bool _wasAccountCommitted\n )\n {\n bytes32 item = _getItemHash(_address);\n if (itemStates[item] != ItemState.ITEM_CHANGED) {\n return false;\n }\n\n itemStates[item] = ItemState.ITEM_COMMITTED;\n totalUncommittedAccounts -= 1;\n\n return true;\n }\n\n /**\n * Increments the total number of uncommitted accounts.\n */\n function incrementTotalUncommittedAccounts()\n override\n public\n authenticated\n {\n totalUncommittedAccounts += 1;\n }\n\n /**\n * Gets the total number of uncommitted accounts.\n * @return _total Total uncommitted accounts.\n */\n function getTotalUncommittedAccounts()\n override\n public\n view\n returns (\n uint256 _total\n )\n {\n return totalUncommittedAccounts;\n }\n\n /**\n * Checks whether a given account was changed during execution.\n * @param _address Address to check.\n * @return Whether or not the account was changed.\n */\n function wasAccountChanged(\n address _address\n )\n override\n public\n view\n returns (\n bool\n )\n {\n bytes32 item = _getItemHash(_address);\n return itemStates[item] >= ItemState.ITEM_CHANGED;\n }\n\n /**\n * Checks whether a given account was committed after execution.\n * @param _address Address to check.\n * @return Whether or not the account was committed.\n */\n function wasAccountCommitted(\n address _address\n )\n override\n public\n view\n returns (\n bool\n )\n {\n bytes32 item = _getItemHash(_address);\n return itemStates[item] >= ItemState.ITEM_COMMITTED;\n }\n\n\n /************************************\n * Public Functions: Storage Access *\n ************************************/\n\n /**\n * Changes a contract storage slot value.\n * @param _contract Address of the contract to modify.\n * @param _key 32 byte storage slot key.\n * @param _value 32 byte storage slot value.\n */\n function putContractStorage(\n address _contract,\n bytes32 _key,\n bytes32 _value\n )\n override\n public\n authenticated\n {\n // A hilarious optimization. `SSTORE`ing a value of `bytes32(0)` is common enough that it's\n // worth populating this with a non-zero value in advance (during the fraud proof\n // initialization phase) to cut the execution-time cost down to 5000 gas.\n contractStorage[_contract][_key] = _value ^ STORAGE_XOR_VALUE;\n\n // Only used when initially populating the contract storage. OVM_ExecutionManager will\n // perform a `hasContractStorage` INVALID_STATE_ACCESS check before putting any contract\n // storage because writing to zero when the actual value is nonzero causes a gas\n // discrepancy. Could be moved into a new `putVerifiedContractStorage` function, or\n // something along those lines.\n if (verifiedContractStorage[_contract][_key] == false) {\n verifiedContractStorage[_contract][_key] = true;\n }\n }\n\n /**\n * Retrieves a contract storage slot value.\n * @param _contract Address of the contract to access.\n * @param _key 32 byte storage slot key.\n * @return _value 32 byte storage slot value.\n */\n function getContractStorage(\n address _contract,\n bytes32 _key\n )\n override\n public\n view\n returns (\n bytes32 _value\n )\n {\n // Storage XOR system doesn't work for newly created contracts that haven't set this\n // storage slot value yet.\n if (\n verifiedContractStorage[_contract][_key] == false\n && accounts[_contract].isFresh\n ) {\n return bytes32(0);\n }\n\n // See `putContractStorage` for more information about the XOR here.\n return contractStorage[_contract][_key] ^ STORAGE_XOR_VALUE;\n }\n\n /**\n * Checks whether a contract storage slot exists in the state.\n * @param _contract Address of the contract to access.\n * @param _key 32 byte storage slot key.\n * @return _exists Whether or not the key was set in the state.\n */\n function hasContractStorage(\n address _contract,\n bytes32 _key\n )\n override\n public\n view\n returns (\n bool _exists\n )\n {\n return verifiedContractStorage[_contract][_key] || accounts[_contract].isFresh;\n }\n\n /**\n * Checks whether a storage slot has already been retrieved, and marks it as retrieved if not.\n * @param _contract Address of the contract to check.\n * @param _key 32 byte storage slot key.\n * @return _wasContractStorageAlreadyLoaded Whether or not the slot was already loaded.\n */\n function testAndSetContractStorageLoaded(\n address _contract,\n bytes32 _key\n )\n override\n public\n authenticated\n returns (\n bool _wasContractStorageAlreadyLoaded\n )\n {\n return _testAndSetItemState(\n _getItemHash(_contract, _key),\n ItemState.ITEM_LOADED\n );\n }\n\n /**\n * Checks whether a storage slot has already been modified, and marks it as modified if not.\n * @param _contract Address of the contract to check.\n * @param _key 32 byte storage slot key.\n * @return _wasContractStorageAlreadyChanged Whether or not the slot was already modified.\n */\n function testAndSetContractStorageChanged(\n address _contract,\n bytes32 _key\n )\n override\n public\n authenticated\n returns (\n bool _wasContractStorageAlreadyChanged\n )\n {\n return _testAndSetItemState(\n _getItemHash(_contract, _key),\n ItemState.ITEM_CHANGED\n );\n }\n\n /**\n * Attempts to mark a storage slot as committed.\n * @param _contract Address of the account to commit.\n * @param _key 32 byte slot key to commit.\n * @return _wasContractStorageCommitted Whether or not the slot was committed.\n */\n function commitContractStorage(\n address _contract,\n bytes32 _key\n )\n override\n public\n authenticated\n returns (\n bool _wasContractStorageCommitted\n )\n {\n bytes32 item = _getItemHash(_contract, _key);\n if (itemStates[item] != ItemState.ITEM_CHANGED) {\n return false;\n }\n\n itemStates[item] = ItemState.ITEM_COMMITTED;\n totalUncommittedContractStorage -= 1;\n\n return true;\n }\n\n /**\n * Increments the total number of uncommitted storage slots.\n */\n function incrementTotalUncommittedContractStorage()\n override\n public\n authenticated\n {\n totalUncommittedContractStorage += 1;\n }\n\n /**\n * Gets the total number of uncommitted storage slots.\n * @return _total Total uncommitted storage slots.\n */\n function getTotalUncommittedContractStorage()\n override\n public\n view\n returns (\n uint256 _total\n )\n {\n return totalUncommittedContractStorage;\n }\n\n /**\n * Checks whether a given storage slot was changed during execution.\n * @param _contract Address to check.\n * @param _key Key of the storage slot to check.\n * @return Whether or not the storage slot was changed.\n */\n function wasContractStorageChanged(\n address _contract,\n bytes32 _key\n )\n override\n public\n view\n returns (\n bool\n )\n {\n bytes32 item = _getItemHash(_contract, _key);\n return itemStates[item] >= ItemState.ITEM_CHANGED;\n }\n\n /**\n * Checks whether a given storage slot was committed after execution.\n * @param _contract Address to check.\n * @param _key Key of the storage slot to check.\n * @return Whether or not the storage slot was committed.\n */\n function wasContractStorageCommitted(\n address _contract,\n bytes32 _key\n )\n override\n public\n view\n returns (\n bool\n )\n {\n bytes32 item = _getItemHash(_contract, _key);\n return itemStates[item] >= ItemState.ITEM_COMMITTED;\n }\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Generates a unique hash for an address.\n * @param _address Address to generate a hash for.\n * @return Unique hash for the given address.\n */\n function _getItemHash(\n address _address\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n return keccak256(abi.encodePacked(_address));\n }\n\n /**\n * Generates a unique hash for an address/key pair.\n * @param _contract Address to generate a hash for.\n * @param _key Key to generate a hash for.\n * @return Unique hash for the given pair.\n */\n function _getItemHash(\n address _contract,\n bytes32 _key\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n return keccak256(abi.encodePacked(\n _contract,\n _key\n ));\n }\n\n /**\n * Checks whether an item is in a particular state (ITEM_LOADED or ITEM_CHANGED) and sets the\n * item to the provided state if not.\n * @param _item 32 byte item ID to check.\n * @param _minItemState Minimum state that must be satisfied by the item.\n * @return _wasItemState Whether or not the item was already in the state.\n */\n function _testAndSetItemState(\n bytes32 _item,\n ItemState _minItemState\n )\n internal\n returns (\n bool _wasItemState\n )\n {\n bool wasItemState = itemStates[_item] >= _minItemState;\n\n if (wasItemState == false) {\n itemStates[_item] = _minItemState;\n }\n\n return wasItemState;\n }\n}\n" - }, - "contracts/optimistic-ethereum/mockOVM/accounts/mockOVM_ECDSAContractAccount.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.7.0;\npragma experimental ABIEncoderV2;\n\n/* Interface Imports */\nimport { iOVM_ECDSAContractAccount } from \"../../iOVM/accounts/iOVM_ECDSAContractAccount.sol\";\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_ECDSAUtils } from \"../../libraries/utils/Lib_ECDSAUtils.sol\";\nimport { Lib_SafeExecutionManagerWrapper } from \"../../libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\";\n\n/**\n * @title mockOVM_ECDSAContractAccount\n */\ncontract mockOVM_ECDSAContractAccount is iOVM_ECDSAContractAccount {\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Executes a signed transaction.\n * @param _transaction Signed EOA transaction.\n * @param _signatureType Hashing scheme used for the transaction (e.g., ETH signed message).\n * @param _v Signature `v` parameter.\n * @param _r Signature `r` parameter.\n * @param _s Signature `s` parameter.\n * @return _success Whether or not the call returned (rather than reverted).\n * @return _returndata Data returned by the call.\n */\n function execute(\n bytes memory _transaction,\n Lib_OVMCodec.EOASignatureType _signatureType,\n uint8 _v,\n bytes32 _r,\n bytes32 _s\n )\n override\n public\n returns (\n bool _success,\n bytes memory _returndata\n )\n {\n bool isEthSign = _signatureType == Lib_OVMCodec.EOASignatureType.ETH_SIGNED_MESSAGE;\n Lib_OVMCodec.EIP155Transaction memory decodedTx = Lib_OVMCodec.decodeEIP155Transaction(_transaction, isEthSign);\n\n // Need to make sure that the transaction nonce is right.\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(\n decodedTx.nonce == Lib_SafeExecutionManagerWrapper.safeGETNONCE(),\n \"Transaction nonce does not match the expected nonce.\"\n );\n\n // Contract creations are signalled by sending a transaction to the zero address.\n if (decodedTx.to == address(0)) {\n address created = Lib_SafeExecutionManagerWrapper.safeCREATE(\n decodedTx.gasLimit,\n decodedTx.data\n );\n\n // If the created address is the ZERO_ADDRESS then we know the deployment failed, though not why\n return (created != address(0), abi.encode(created));\n } else {\n // We only want to bump the nonce for `ovmCALL` because `ovmCREATE` automatically bumps\n // the nonce of the calling account. Normally an EOA would bump the nonce for both\n // cases, but since this is a contract we'd end up bumping the nonce twice.\n Lib_SafeExecutionManagerWrapper.safeSETNONCE(decodedTx.nonce + 1);\n\n return Lib_SafeExecutionManagerWrapper.safeCALL(\n decodedTx.gasLimit,\n decodedTx.to,\n decodedTx.data\n );\n }\n }\n\n function qall(\n uint256 _gasLimit,\n address _to,\n bytes memory _data\n )\n public\n returns (\n bool _success,\n bytes memory _returndata\n )\n {\n return Lib_SafeExecutionManagerWrapper.safeCALL(\n _gasLimit,\n _to,\n _data\n );\n }\n}\n" - }, - "contracts/optimistic-ethereum/OVM/precompiles/OVM_ProxySequencerEntrypoint.sol": { - "content": "pragma solidity ^0.7.0;\n\n/* Library Imports */\nimport { Lib_SafeExecutionManagerWrapper } from \"../../libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\";\n\n/**\n * @title OVM_ProxySequencerEntrypoint\n */\ncontract OVM_ProxySequencerEntrypoint {\n\n /*********************\n * Fallback Function *\n *********************/\n\n fallback()\n external\n {\n Lib_SafeExecutionManagerWrapper.safeDELEGATECALL(\n gasleft(),\n _getImplementation(),\n msg.data\n );\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n function init(\n address _implementation,\n address _owner\n )\n external\n {\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(\n _getOwner() == address(0),\n \"ProxySequencerEntrypoint has already been inited\"\n );\n _setOwner(_owner);\n _setImplementation(_implementation);\n }\n\n function upgrade(\n address _implementation\n )\n external\n {\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(\n _getOwner() == Lib_SafeExecutionManagerWrapper.safeCALLER(),\n \"Only owner can upgrade the Entrypoint\"\n );\n\n _setImplementation(_implementation);\n }\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n function _setImplementation(\n address _implementation\n )\n internal\n {\n Lib_SafeExecutionManagerWrapper.safeSSTORE(\n bytes32(uint256(0)),\n bytes32(uint256(uint160(_implementation)))\n );\n }\n\n function _getImplementation()\n internal\n returns (\n address _implementation\n )\n {\n return address(uint160(uint256(\n Lib_SafeExecutionManagerWrapper.safeSLOAD(\n bytes32(uint256(0))\n )\n )));\n }\n\n function _setOwner(\n address _owner\n )\n internal\n {\n Lib_SafeExecutionManagerWrapper.safeSSTORE(\n bytes32(uint256(1)),\n bytes32(uint256(uint160(_owner)))\n );\n }\n\n function _getOwner()\n internal\n returns (\n address _owner\n )\n {\n return address(uint160(uint256(\n Lib_SafeExecutionManagerWrapper.safeSLOAD(\n bytes32(uint256(1))\n )\n )));\n }\n}\n" - }, - "contracts/optimistic-ethereum/OVM/execution/OVM_SafetyChecker.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.7.0;\n\n/* Interface Imports */\nimport { iOVM_SafetyChecker } from \"../../iOVM/execution/iOVM_SafetyChecker.sol\";\n\n/**\n * @title OVM_SafetyChecker\n */\ncontract OVM_SafetyChecker is iOVM_SafetyChecker {\n\n /********************\n * Public Functions *\n ********************/\n /**\n * Returns whether or not all of the provided bytecode is safe.\n * @param _bytecode The bytecode to safety check.\n * @return `true` if the bytecode is safe, `false` otherwise.\n */\n function isBytecodeSafe(\n bytes memory _bytecode\n )\n override\n external\n pure\n returns (bool)\n {\n // autogenerated by gen_safety_checker_constants.py\n // number of bytes to skip for each opcode\n uint256[8] memory opcodeSkippableBytes = [\n uint256(0x0001010101010101010101010000000001010101010101010101010101010000),\n uint256(0x0100000000000000000000000000000000000000010101010101000000010100),\n uint256(0x0000000000000000000000000000000001010101000000010101010100000000),\n uint256(0x0203040500000000000000000000000000000000000000000000000000000000),\n uint256(0x0101010101010101010101010101010101010101010101010101010101010101),\n uint256(0x0101010101000000000000000000000000000000000000000000000000000000),\n uint256(0x0000000000000000000000000000000000000000000000000000000000000000),\n uint256(0x0000000000000000000000000000000000000000000000000000000000000000)\n ];\n // Mask to gate opcode specific cases\n uint256 opcodeGateMask = ~uint256(0xffffffffffffffffffffffe000000000fffffffff070ffff9c0ffffec000f001);\n // Halting opcodes\n uint256 opcodeHaltingMask = ~uint256(0x4008000000000000000000000000000000000000004000000000000000000001);\n // PUSH opcodes\n uint256 opcodePushMask = ~uint256(0xffffffff000000000000000000000000);\n\n uint256 codeLength;\n uint256 _pc;\n assembly {\n _pc := add(_bytecode, 0x20)\n }\n codeLength = _pc + _bytecode.length;\n do {\n // current opcode: 0x00...0xff\n uint256 opNum;\n\n // inline assembly removes the extra add + bounds check\n assembly {\n let word := mload(_pc) //load the next 32 bytes at pc into word\n\n // Look up number of bytes to skip from opcodeSkippableBytes and then update indexInWord\n // E.g. the 02030405 in opcodeSkippableBytes is the number of bytes to skip for PUSH1->4\n // We repeat this 6 times, thus we can only skip bytes for up to PUSH4 ((1+4) * 6 = 30 < 32).\n // If we see an opcode that is listed as 0 skippable bytes e.g. PUSH5,\n // then we will get stuck on that indexInWord and then opNum will be set to the PUSH5 opcode.\n let indexInWord := byte(0, mload(add(opcodeSkippableBytes, byte(0, word))))\n indexInWord := add(indexInWord, byte(0, mload(add(opcodeSkippableBytes, byte(indexInWord, word)))))\n indexInWord := add(indexInWord, byte(0, mload(add(opcodeSkippableBytes, byte(indexInWord, word)))))\n indexInWord := add(indexInWord, byte(0, mload(add(opcodeSkippableBytes, byte(indexInWord, word)))))\n indexInWord := add(indexInWord, byte(0, mload(add(opcodeSkippableBytes, byte(indexInWord, word)))))\n indexInWord := add(indexInWord, byte(0, mload(add(opcodeSkippableBytes, byte(indexInWord, word)))))\n _pc := add(_pc, indexInWord)\n\n opNum := byte(indexInWord, word)\n }\n\n // + push opcodes\n // + stop opcodes [STOP(0x00),JUMP(0x56),RETURN(0xf3),INVALID(0xfe)]\n // + caller opcode CALLER(0x33)\n // + blacklisted opcodes\n uint256 opBit = 1 << opNum;\n if (opBit & opcodeGateMask == 0) {\n if (opBit & opcodePushMask == 0) {\n // all pushes are valid opcodes\n // subsequent bytes are not opcodes. Skip them.\n _pc += (opNum - 0x5e); // PUSH1 is 0x60, so opNum-0x5f = PUSHed bytes and we +1 to\n // skip the _pc++; line below in order to save gas ((-0x5f + 1) = -0x5e)\n continue;\n } else if (opBit & opcodeHaltingMask == 0) {\n // STOP or JUMP or RETURN or INVALID (Note: REVERT is blacklisted, so not included here)\n // We are now inside unreachable code until we hit a JUMPDEST!\n do {\n _pc++;\n assembly {\n opNum := byte(0, mload(_pc))\n }\n // encountered a JUMPDEST\n if (opNum == 0x5b) break;\n // skip PUSHed bytes\n if ((1 << opNum) & opcodePushMask == 0) _pc += (opNum - 0x5f); // opNum-0x5f = PUSHed bytes (PUSH1 is 0x60)\n } while (_pc < codeLength);\n // opNum is 0x5b, so we don't continue here since the pc++ is fine\n } else if (opNum == 0x33) { // Caller opcode\n uint256 firstOps; // next 32 bytes of bytecode\n uint256 secondOps; // following 32 bytes of bytecode\n\n assembly {\n firstOps := mload(_pc)\n // 37 bytes total, 5 left over --> 32 - 5 bytes = 27 bytes = 216 bits\n secondOps := shr(216, mload(add(_pc, 0x20)))\n }\n\n // Call identity precompile\n // CALLER POP PUSH1 0x00 PUSH1 0x04 GAS CALL\n // 32 - 8 bytes = 24 bytes = 192\n if ((firstOps >> 192) == 0x3350600060045af1) {\n _pc += 8;\n // Call EM and abort execution if instructed\n // CALLER PUSH1 0x00 SWAP1 GAS CALL PC PUSH1 0x0E ADD JUMPI RETURNDATASIZE PUSH1 0x00 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x00 REVERT JUMPDEST RETURNDATASIZE PUSH1 0x01 EQ ISZERO PC PUSH1 0x0a ADD JUMPI PUSH1 0x01 PUSH1 0x00 RETURN JUMPDEST \n } else if (firstOps == 0x336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a015760 && secondOps == 0x016000f35b) {\n _pc += 37;\n } else {\n return false;\n }\n continue;\n } else {\n // encountered a non-whitelisted opcode!\n return false;\n }\n }\n _pc++;\n } while (_pc < codeLength);\n return true;\n }\n}\n" - } - }, - "settings": { - "optimizer": { - "enabled": true, - "runs": 200 - }, - "outputSelection": { - "*": { - "*": [ - "storageLayout", - "abi", - "evm.bytecode", - "evm.deployedBytecode", - "evm.methodIdentifiers", - "metadata", - "devdoc", - "userdoc", - "evm.gasEstimates" - ], - "": [ - "ast" - ] - } - }, - "metadata": { - "useLiteralContent": true - } - } -} \ No newline at end of file diff --git a/packages/contracts/deployments/kovan-v2/.chainId b/packages/contracts/deployments/kovan-v2/.chainId deleted file mode 100644 index f70d7bba4ae1f..0000000000000 --- a/packages/contracts/deployments/kovan-v2/.chainId +++ /dev/null @@ -1 +0,0 @@ -42 \ No newline at end of file diff --git a/packages/contracts/deployments/kovan-v1/.chainId b/packages/contracts/deployments/kovan/.chainId similarity index 100% rename from packages/contracts/deployments/kovan-v1/.chainId rename to packages/contracts/deployments/kovan/.chainId diff --git a/packages/contracts/deployments/kovan-v2/Lib_AddressManager.json b/packages/contracts/deployments/kovan/Lib_AddressManager.json similarity index 100% rename from packages/contracts/deployments/kovan-v2/Lib_AddressManager.json rename to packages/contracts/deployments/kovan/Lib_AddressManager.json diff --git a/packages/contracts/deployments/kovan-v2/OVM_CanonicalTransactionChain.json b/packages/contracts/deployments/kovan/OVM_CanonicalTransactionChain.json similarity index 100% rename from packages/contracts/deployments/kovan-v2/OVM_CanonicalTransactionChain.json rename to packages/contracts/deployments/kovan/OVM_CanonicalTransactionChain.json diff --git a/packages/contracts/deployments/kovan-v2/OVM_ChainStorageContainer-CTC-batches.json b/packages/contracts/deployments/kovan/OVM_ChainStorageContainer-CTC-batches.json similarity index 100% rename from packages/contracts/deployments/kovan-v2/OVM_ChainStorageContainer-CTC-batches.json rename to packages/contracts/deployments/kovan/OVM_ChainStorageContainer-CTC-batches.json diff --git a/packages/contracts/deployments/kovan-v2/OVM_ChainStorageContainer-CTC-queue.json b/packages/contracts/deployments/kovan/OVM_ChainStorageContainer-CTC-queue.json similarity index 100% rename from packages/contracts/deployments/kovan-v2/OVM_ChainStorageContainer-CTC-queue.json rename to packages/contracts/deployments/kovan/OVM_ChainStorageContainer-CTC-queue.json diff --git a/packages/contracts/deployments/kovan-v2/OVM_ChainStorageContainer-SCC-batches.json b/packages/contracts/deployments/kovan/OVM_ChainStorageContainer-SCC-batches.json similarity index 100% rename from packages/contracts/deployments/kovan-v2/OVM_ChainStorageContainer-SCC-batches.json rename to packages/contracts/deployments/kovan/OVM_ChainStorageContainer-SCC-batches.json diff --git a/packages/contracts/deployments/kovan-v2/OVM_ExecutionManager.json b/packages/contracts/deployments/kovan/OVM_ExecutionManager.json similarity index 100% rename from packages/contracts/deployments/kovan-v2/OVM_ExecutionManager.json rename to packages/contracts/deployments/kovan/OVM_ExecutionManager.json diff --git a/packages/contracts/deployments/kovan-v2/OVM_FraudVerifier.json b/packages/contracts/deployments/kovan/OVM_FraudVerifier.json similarity index 100% rename from packages/contracts/deployments/kovan-v2/OVM_FraudVerifier.json rename to packages/contracts/deployments/kovan/OVM_FraudVerifier.json diff --git a/packages/contracts/deployments/kovan-v2/OVM_L1CrossDomainMessenger.json b/packages/contracts/deployments/kovan/OVM_L1CrossDomainMessenger.json similarity index 100% rename from packages/contracts/deployments/kovan-v2/OVM_L1CrossDomainMessenger.json rename to packages/contracts/deployments/kovan/OVM_L1CrossDomainMessenger.json diff --git a/packages/contracts/deployments/kovan-v2/OVM_L1ETHGateway.json b/packages/contracts/deployments/kovan/OVM_L1ETHGateway.json similarity index 100% rename from packages/contracts/deployments/kovan-v2/OVM_L1ETHGateway.json rename to packages/contracts/deployments/kovan/OVM_L1ETHGateway.json diff --git a/packages/contracts/deployments/kovan-v2/OVM_L1MultiMessageRelayer.json b/packages/contracts/deployments/kovan/OVM_L1MultiMessageRelayer.json similarity index 100% rename from packages/contracts/deployments/kovan-v2/OVM_L1MultiMessageRelayer.json rename to packages/contracts/deployments/kovan/OVM_L1MultiMessageRelayer.json diff --git a/packages/contracts/deployments/kovan-v2/OVM_SafetyChecker.json b/packages/contracts/deployments/kovan/OVM_SafetyChecker.json similarity index 100% rename from packages/contracts/deployments/kovan-v2/OVM_SafetyChecker.json rename to packages/contracts/deployments/kovan/OVM_SafetyChecker.json diff --git a/packages/contracts/deployments/kovan-v2/OVM_StateCommitmentChain.json b/packages/contracts/deployments/kovan/OVM_StateCommitmentChain.json similarity index 100% rename from packages/contracts/deployments/kovan-v2/OVM_StateCommitmentChain.json rename to packages/contracts/deployments/kovan/OVM_StateCommitmentChain.json diff --git a/packages/contracts/deployments/kovan-v2/OVM_StateManagerFactory.json b/packages/contracts/deployments/kovan/OVM_StateManagerFactory.json similarity index 100% rename from packages/contracts/deployments/kovan-v2/OVM_StateManagerFactory.json rename to packages/contracts/deployments/kovan/OVM_StateManagerFactory.json diff --git a/packages/contracts/deployments/kovan-v2/OVM_StateTransitionerFactory.json b/packages/contracts/deployments/kovan/OVM_StateTransitionerFactory.json similarity index 100% rename from packages/contracts/deployments/kovan-v2/OVM_StateTransitionerFactory.json rename to packages/contracts/deployments/kovan/OVM_StateTransitionerFactory.json diff --git a/packages/contracts/deployments/kovan-v2/Proxy__OVM_L1CrossDomainMessenger.json b/packages/contracts/deployments/kovan/Proxy__OVM_L1CrossDomainMessenger.json similarity index 100% rename from packages/contracts/deployments/kovan-v2/Proxy__OVM_L1CrossDomainMessenger.json rename to packages/contracts/deployments/kovan/Proxy__OVM_L1CrossDomainMessenger.json diff --git a/packages/contracts/deployments/kovan-v2/Proxy__OVM_L1ETHGateway.json b/packages/contracts/deployments/kovan/Proxy__OVM_L1ETHGateway.json similarity index 100% rename from packages/contracts/deployments/kovan-v2/Proxy__OVM_L1ETHGateway.json rename to packages/contracts/deployments/kovan/Proxy__OVM_L1ETHGateway.json diff --git a/packages/contracts/deployments/kovan-v2/mockOVM_BondManager.json b/packages/contracts/deployments/kovan/mockOVM_BondManager.json similarity index 100% rename from packages/contracts/deployments/kovan-v2/mockOVM_BondManager.json rename to packages/contracts/deployments/kovan/mockOVM_BondManager.json diff --git a/packages/contracts/deployments/kovan-v2/solcInputs/03aed03b958b1d37f90bd88d0f56dd85.json b/packages/contracts/deployments/kovan/solcInputs/03aed03b958b1d37f90bd88d0f56dd85.json similarity index 100% rename from packages/contracts/deployments/kovan-v2/solcInputs/03aed03b958b1d37f90bd88d0f56dd85.json rename to packages/contracts/deployments/kovan/solcInputs/03aed03b958b1d37f90bd88d0f56dd85.json diff --git a/packages/contracts/deployments/mainnet-v1/Lib_AddressManager.json b/packages/contracts/deployments/mainnet-v1/Lib_AddressManager.json deleted file mode 100644 index 3f4daf303f8c1..0000000000000 --- a/packages/contracts/deployments/mainnet-v1/Lib_AddressManager.json +++ /dev/null @@ -1,199 +0,0 @@ -{ - "address": "0x1De8CFD4C1A486200286073aE91DE6e8099519f1", - "abi": [ - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "string", - "name": "_name", - "type": "string" - }, - { - "indexed": false, - "internalType": "address", - "name": "_newAddress", - "type": "address" - } - ], - "name": "AddressSet", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "previousOwner", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "newOwner", - "type": "address" - } - ], - "name": "OwnershipTransferred", - "type": "event" - }, - { - "inputs": [ - { - "internalType": "string", - "name": "_name", - "type": "string" - } - ], - "name": "getAddress", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "owner", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "renounceOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "string", - "name": "_name", - "type": "string" - }, - { - "internalType": "address", - "name": "_address", - "type": "address" - } - ], - "name": "setAddress", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_newOwner", - "type": "address" - } - ], - "name": "transferOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - } - ], - "transactionHash": "0x39342ffdce6e6c76b8fa6534d0e5f24ba0917ed09ab713ad0eef7eee73dd08ed", - "receipt": { - "to": null, - "from": "0x558ba9b8d78713fbf768c1f8a584485B4003f43F", - "contractAddress": "0xE630cdf302880783364334455C8352fE0aB5b748", - "transactionIndex": 3, - "gasUsed": "413938", - "logsBloom": "0x00000000000000000000000000000000000000000000000000800000000000000000000022000000000000000000000000000000000040000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000020000000000000000000800000000000000000000000000000000400040000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000001000000000000000000000000000000000000000000", - "blockHash": "0xf1c7969322d44cb9561c6af6b8499e1ee90e81c5e8e6409417454bf3d8bc598f", - "transactionHash": "0x39342ffdce6e6c76b8fa6534d0e5f24ba0917ed09ab713ad0eef7eee73dd08ed", - "logs": [ - { - "transactionIndex": 3, - "blockNumber": 4573376, - "transactionHash": "0x39342ffdce6e6c76b8fa6534d0e5f24ba0917ed09ab713ad0eef7eee73dd08ed", - "address": "0xE630cdf302880783364334455C8352fE0aB5b748", - "topics": [ - "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x000000000000000000000000558ba9b8d78713fbf768c1f8a584485b4003f43f" - ], - "data": "0x", - "logIndex": 9, - "blockHash": "0xf1c7969322d44cb9561c6af6b8499e1ee90e81c5e8e6409417454bf3d8bc598f" - } - ], - "blockNumber": 4573376, - "cumulativeGasUsed": "3107647", - "status": 1, - "byzantium": true - }, - "args": [], - "solcInputHash": "cebcb515c1a9c570d96e0b8f6fd237e2", - "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_newAddress\",\"type\":\"address\"}],\"name\":\"AddressSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"getAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"_address\",\"type\":\"address\"}],\"name\":\"setAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"title\":\"Lib_AddressManager\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":\"Lib_AddressManager\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// +build ovm\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Contract Imports */\\nimport { Ownable } from \\\"./Lib_Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n /*******************************************\\n * Contract Variables: Internal Accounting *\\n *******************************************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n public\\n onlyOwner\\n {\\n emit AddressSet(_name, _address);\\n addresses[_getNameHash(_name)] = _address;\\n }\\n\\n function getAddress(\\n string memory _name\\n )\\n public\\n view\\n returns (address)\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32 _hash\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xdf802e1cc6474df913626991e9fca3835c620a519f397afe04bf9c260e723257\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// +build ovm\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Ownable\\n * @dev Adapted from https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol\\n */\\nabstract contract Ownable {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n address public owner;\\n\\n\\n /**********\\n * Events *\\n **********/\\n\\n event OwnershipTransferred(\\n address indexed previousOwner,\\n address indexed newOwner\\n );\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n constructor() internal {\\n owner = msg.sender;\\n emit OwnershipTransferred(address(0), owner);\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n owner == msg.sender,\\n \\\"Ownable: caller is not the owner\\\"\\n );\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function renounceOwnership()\\n public\\n virtual\\n onlyOwner\\n {\\n emit OwnershipTransferred(owner, address(0));\\n owner = address(0);\\n }\\n\\n function transferOwnership(address _newOwner)\\n public\\n virtual\\n onlyOwner\\n {\\n require(\\n _newOwner != address(0),\\n \\\"Ownable: new owner cannot be the zero address\\\"\\n );\\n\\n emit OwnershipTransferred(owner, _newOwner);\\n owner = _newOwner;\\n }\\n}\\n\",\"keccak256\":\"0xe0409fbd236d16ca6be439d9d97dd36d0d9a0697ee0062d49588b9d29c248e47\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x608060405234801561001057600080fd5b50600080546001600160a01b03191633178082556040516001600160a01b039190911691907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3610614806100696000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c8063715018a61461005c5780638da5cb5b146100665780639b2ea4bd1461008a578063bf40fac11461013b578063f2fde38b146101e1575b600080fd5b610064610207565b005b61006e6102b0565b604080516001600160a01b039092168252519081900360200190f35b610064600480360360408110156100a057600080fd5b8101906020810181356401000000008111156100bb57600080fd5b8201836020820111156100cd57600080fd5b803590602001918460018302840111640100000000831117156100ef57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550505090356001600160a01b031691506102bf9050565b61006e6004803603602081101561015157600080fd5b81019060208101813564010000000081111561016c57600080fd5b82018360208201111561017e57600080fd5b803590602001918460018302840111640100000000831117156101a057600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061040c945050505050565b610064600480360360208110156101f757600080fd5b50356001600160a01b031661043b565b6000546001600160a01b03163314610266576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b031681565b6000546001600160a01b0316331461031e576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b7f188466739ff00cc68bfb2367d23ae4b855264264fe1624caa8884399af23454c82826040518080602001836001600160a01b03168152602001828103825284818151815260200191508051906020019080838360005b8381101561038d578181015183820152602001610375565b50505050905090810190601f1680156103ba5780820380516001836020036101000a031916815260200191505b50935050505060405180910390a180600160006103d68561053a565b815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b031602179055505050565b60006001600061041b8461053a565b81526020810191909152604001600020546001600160a01b031692915050565b6000546001600160a01b0316331461049a576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b0381166104df5760405162461bcd60e51b815260040180806020018281038252602d8152602001806105b2602d913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000816040516020018082805190602001908083835b6020831061056f5780518252601f199092019160209182019101610550565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120905091905056fe4f776e61626c653a206e6577206f776e65722063616e6e6f7420626520746865207a65726f2061646472657373a2646970667358221220304b86da0b56c0241601472f57374abec2a11900a97043845283952624e4512364736f6c63430007060033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100575760003560e01c8063715018a61461005c5780638da5cb5b146100665780639b2ea4bd1461008a578063bf40fac11461013b578063f2fde38b146101e1575b600080fd5b610064610207565b005b61006e6102b0565b604080516001600160a01b039092168252519081900360200190f35b610064600480360360408110156100a057600080fd5b8101906020810181356401000000008111156100bb57600080fd5b8201836020820111156100cd57600080fd5b803590602001918460018302840111640100000000831117156100ef57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550505090356001600160a01b031691506102bf9050565b61006e6004803603602081101561015157600080fd5b81019060208101813564010000000081111561016c57600080fd5b82018360208201111561017e57600080fd5b803590602001918460018302840111640100000000831117156101a057600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061040c945050505050565b610064600480360360208110156101f757600080fd5b50356001600160a01b031661043b565b6000546001600160a01b03163314610266576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b031681565b6000546001600160a01b0316331461031e576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b7f188466739ff00cc68bfb2367d23ae4b855264264fe1624caa8884399af23454c82826040518080602001836001600160a01b03168152602001828103825284818151815260200191508051906020019080838360005b8381101561038d578181015183820152602001610375565b50505050905090810190601f1680156103ba5780820380516001836020036101000a031916815260200191505b50935050505060405180910390a180600160006103d68561053a565b815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b031602179055505050565b60006001600061041b8461053a565b81526020810191909152604001600020546001600160a01b031692915050565b6000546001600160a01b0316331461049a576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b0381166104df5760405162461bcd60e51b815260040180806020018281038252602d8152602001806105b2602d913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000816040516020018082805190602001908083835b6020831061056f5780518252601f199092019160209182019101610550565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120905091905056fe4f776e61626c653a206e6577206f776e65722063616e6e6f7420626520746865207a65726f2061646472657373a2646970667358221220304b86da0b56c0241601472f57374abec2a11900a97043845283952624e4512364736f6c63430007060033", - "devdoc": { - "kind": "dev", - "methods": {}, - "title": "Lib_AddressManager", - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": {}, - "version": 1 - }, - "storageLayout": { - "storage": [ - { - "astId": 11739, - "contract": "contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol:Lib_AddressManager", - "label": "owner", - "offset": 0, - "slot": "0", - "type": "t_address" - }, - { - "astId": 11647, - "contract": "contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol:Lib_AddressManager", - "label": "addresses", - "offset": 0, - "slot": "1", - "type": "t_mapping(t_bytes32,t_address)" - } - ], - "types": { - "t_address": { - "encoding": "inplace", - "label": "address", - "numberOfBytes": "20" - }, - "t_bytes32": { - "encoding": "inplace", - "label": "bytes32", - "numberOfBytes": "32" - }, - "t_mapping(t_bytes32,t_address)": { - "encoding": "mapping", - "key": "t_bytes32", - "label": "mapping(bytes32 => address)", - "numberOfBytes": "32", - "value": "t_address" - } - } - } -} \ No newline at end of file diff --git a/packages/contracts/deployments/mainnet-v1/OVM_CanonicalTransactionChain.json b/packages/contracts/deployments/mainnet-v1/OVM_CanonicalTransactionChain.json deleted file mode 100644 index f2f5909de3028..0000000000000 --- a/packages/contracts/deployments/mainnet-v1/OVM_CanonicalTransactionChain.json +++ /dev/null @@ -1,757 +0,0 @@ -{ - "address": "0xed2701f7135eab0D7ca02e6Ab634AD6CbE159Ffb", - "abi": [ - { - "inputs": [ - { - "internalType": "address", - "name": "_libAddressManager", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_forceInclusionPeriodSeconds", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_forceInclusionPeriodBlocks", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_maxTransactionGasLimit", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint256", - "name": "_startingQueueIndex", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_numQueueElements", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_totalElements", - "type": "uint256" - } - ], - "name": "QueueBatchAppended", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint256", - "name": "_startingQueueIndex", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_numQueueElements", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_totalElements", - "type": "uint256" - } - ], - "name": "SequencerBatchAppended", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "_batchIndex", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "bytes32", - "name": "_batchRoot", - "type": "bytes32" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_batchSize", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_prevTotalElements", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "bytes", - "name": "_extraData", - "type": "bytes" - } - ], - "name": "TransactionBatchAppended", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "address", - "name": "_l1TxOrigin", - "type": "address" - }, - { - "indexed": false, - "internalType": "address", - "name": "_target", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_gasLimit", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "bytes", - "name": "_data", - "type": "bytes" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_queueIndex", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_timestamp", - "type": "uint256" - } - ], - "name": "TransactionEnqueued", - "type": "event" - }, - { - "inputs": [], - "name": "L2_GAS_DISCOUNT_DIVISOR", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "MAX_ROLLUP_TX_SIZE", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "MIN_ROLLUP_TX_GAS", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_numQueuedTransactions", - "type": "uint256" - } - ], - "name": "appendQueueBatch", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "appendSequencerBatch", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "batches", - "outputs": [ - { - "internalType": "contract iOVM_ChainStorageContainer", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_target", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_gasLimit", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "_data", - "type": "bytes" - } - ], - "name": "enqueue", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "forceInclusionPeriodBlocks", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "forceInclusionPeriodSeconds", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getNextQueueIndex", - "outputs": [ - { - "internalType": "uint40", - "name": "", - "type": "uint40" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getNumPendingQueueElements", - "outputs": [ - { - "internalType": "uint40", - "name": "", - "type": "uint40" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_index", - "type": "uint256" - } - ], - "name": "getQueueElement", - "outputs": [ - { - "components": [ - { - "internalType": "bytes32", - "name": "queueRoot", - "type": "bytes32" - }, - { - "internalType": "uint40", - "name": "timestamp", - "type": "uint40" - }, - { - "internalType": "uint40", - "name": "blockNumber", - "type": "uint40" - } - ], - "internalType": "struct Lib_OVMCodec.QueueElement", - "name": "_element", - "type": "tuple" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getQueueLength", - "outputs": [ - { - "internalType": "uint40", - "name": "", - "type": "uint40" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getTotalBatches", - "outputs": [ - { - "internalType": "uint256", - "name": "_totalBatches", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getTotalElements", - "outputs": [ - { - "internalType": "uint256", - "name": "_totalElements", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "maxTransactionGasLimit", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "queue", - "outputs": [ - { - "internalType": "contract iOVM_ChainStorageContainer", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "string", - "name": "_name", - "type": "string" - } - ], - "name": "resolve", - "outputs": [ - { - "internalType": "address", - "name": "_contract", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "components": [ - { - "internalType": "uint256", - "name": "timestamp", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "blockNumber", - "type": "uint256" - }, - { - "internalType": "enum Lib_OVMCodec.QueueOrigin", - "name": "l1QueueOrigin", - "type": "uint8" - }, - { - "internalType": "address", - "name": "l1TxOrigin", - "type": "address" - }, - { - "internalType": "address", - "name": "entrypoint", - "type": "address" - }, - { - "internalType": "uint256", - "name": "gasLimit", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "data", - "type": "bytes" - } - ], - "internalType": "struct Lib_OVMCodec.Transaction", - "name": "_transaction", - "type": "tuple" - }, - { - "components": [ - { - "internalType": "bool", - "name": "isSequenced", - "type": "bool" - }, - { - "internalType": "uint256", - "name": "queueIndex", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "timestamp", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "blockNumber", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "txData", - "type": "bytes" - } - ], - "internalType": "struct Lib_OVMCodec.TransactionChainElement", - "name": "_txChainElement", - "type": "tuple" - }, - { - "components": [ - { - "internalType": "uint256", - "name": "batchIndex", - "type": "uint256" - }, - { - "internalType": "bytes32", - "name": "batchRoot", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "batchSize", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "prevTotalElements", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "extraData", - "type": "bytes" - } - ], - "internalType": "struct Lib_OVMCodec.ChainBatchHeader", - "name": "_batchHeader", - "type": "tuple" - }, - { - "components": [ - { - "internalType": "uint256", - "name": "index", - "type": "uint256" - }, - { - "internalType": "bytes32[]", - "name": "siblings", - "type": "bytes32[]" - } - ], - "internalType": "struct Lib_OVMCodec.ChainInclusionProof", - "name": "_inclusionProof", - "type": "tuple" - } - ], - "name": "verifyTransaction", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - } - ], - "transactionHash": "0x46e0f66d5260cc1973f9cf40fa80ed213c1f7d58420d3560b47ff81b28902d4d", - "receipt": { - "to": null, - "from": "0x558ba9b8d78713fbf768c1f8a584485B4003f43F", - "contractAddress": "0xdFB7CdEfFdb717A2117E1577c187b8a8e25C5bEb", - "transactionIndex": 7, - "gasUsed": "2849481", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0xcbbf409c3afd072ebf97e09b1de817fa0641492dac602a0f6ad586fba93162d8", - "transactionHash": "0x46e0f66d5260cc1973f9cf40fa80ed213c1f7d58420d3560b47ff81b28902d4d", - "logs": [], - "blockNumber": 4573384, - "cumulativeGasUsed": "3318562", - "status": 1, - "byzantium": true - }, - "args": [ - "0x1De8CFD4C1A486200286073aE91DE6e8099519f1", - 18000000, - 1200000, - 9000000 - ], - "solcInputHash": "cebcb515c1a9c570d96e0b8f6fd237e2", - "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_forceInclusionPeriodSeconds\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_forceInclusionPeriodBlocks\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_maxTransactionGasLimit\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_startingQueueIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_numQueueElements\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_totalElements\",\"type\":\"uint256\"}],\"name\":\"QueueBatchAppended\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_startingQueueIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_numQueueElements\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_totalElements\",\"type\":\"uint256\"}],\"name\":\"SequencerBatchAppended\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_batchIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"_batchRoot\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_batchSize\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_prevTotalElements\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"_extraData\",\"type\":\"bytes\"}],\"name\":\"TransactionBatchAppended\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_l1TxOrigin\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_queueIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_timestamp\",\"type\":\"uint256\"}],\"name\":\"TransactionEnqueued\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"L2_GAS_DISCOUNT_DIVISOR\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAX_ROLLUP_TX_SIZE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MIN_ROLLUP_TX_GAS\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_numQueuedTransactions\",\"type\":\"uint256\"}],\"name\":\"appendQueueBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"appendSequencerBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"batches\",\"outputs\":[{\"internalType\":\"contract iOVM_ChainStorageContainer\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"enqueue\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"forceInclusionPeriodBlocks\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"forceInclusionPeriodSeconds\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getNextQueueIndex\",\"outputs\":[{\"internalType\":\"uint40\",\"name\":\"\",\"type\":\"uint40\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getNumPendingQueueElements\",\"outputs\":[{\"internalType\":\"uint40\",\"name\":\"\",\"type\":\"uint40\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"getQueueElement\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"queueRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint40\",\"name\":\"timestamp\",\"type\":\"uint40\"},{\"internalType\":\"uint40\",\"name\":\"blockNumber\",\"type\":\"uint40\"}],\"internalType\":\"struct Lib_OVMCodec.QueueElement\",\"name\":\"_element\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getQueueLength\",\"outputs\":[{\"internalType\":\"uint40\",\"name\":\"\",\"type\":\"uint40\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTotalBatches\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_totalBatches\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTotalElements\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_totalElements\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maxTransactionGasLimit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"queue\",\"outputs\":[{\"internalType\":\"contract iOVM_ChainStorageContainer\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"_contract\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"enum Lib_OVMCodec.QueueOrigin\",\"name\":\"l1QueueOrigin\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"l1TxOrigin\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"entrypoint\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.Transaction\",\"name\":\"_transaction\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isSequenced\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"queueIndex\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"txData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.TransactionChainElement\",\"name\":\"_txChainElement\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"_batchHeader\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"siblings\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct Lib_OVMCodec.ChainInclusionProof\",\"name\":\"_inclusionProof\",\"type\":\"tuple\"}],\"name\":\"verifyTransaction\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"appendQueueBatch(uint256)\":{\"params\":{\"_numQueuedTransactions\":\"Number of transactions to append.\"}},\"appendSequencerBatch()\":{\"details\":\"This function uses a custom encoding scheme for efficiency reasons. .param _shouldStartAtElement Specific batch we expect to start appending to. .param _totalElementsToAppend Total number of batch elements we expect to append. .param _contexts Array of batch contexts. .param _transactionDataFields Array of raw transaction data.\"},\"batches()\":{\"returns\":{\"_0\":\"Reference to the batch storage container.\"}},\"enqueue(address,uint256,bytes)\":{\"params\":{\"_data\":\"Transaction data.\",\"_gasLimit\":\"Gas limit for the given transaction.\",\"_target\":\"Target contract to send the transaction to.\"}},\"getNextQueueIndex()\":{\"returns\":{\"_0\":\"Index for the next queue element.\"}},\"getNumPendingQueueElements()\":{\"returns\":{\"_0\":\"Length of the queue.\"}},\"getQueueElement(uint256)\":{\"params\":{\"_index\":\"Index of the queue element to access.\"},\"returns\":{\"_element\":\"Queue element at the given index.\"}},\"getQueueLength()\":{\"returns\":{\"_0\":\"Length of the queue.\"}},\"getTotalBatches()\":{\"returns\":{\"_totalBatches\":\"Total submitted batches.\"}},\"getTotalElements()\":{\"returns\":{\"_totalElements\":\"Total submitted elements.\"}},\"queue()\":{\"returns\":{\"_0\":\"Reference to the queue storage container.\"}},\"verifyTransaction((uint256,uint256,uint8,address,address,uint256,bytes),(bool,uint256,uint256,uint256,bytes),(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))\":{\"params\":{\"_batchHeader\":\"Header of the batch the transaction was included in.\",\"_inclusionProof\":\"Inclusion proof for the provided transaction chain element.\",\"_transaction\":\"Transaction to verify.\",\"_txChainElement\":\"Transaction chain element corresponding to the transaction.\"},\"returns\":{\"_0\":\"True if the transaction exists in the CTC, false if not.\"}}},\"title\":\"OVM_CanonicalTransactionChain\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"appendQueueBatch(uint256)\":{\"notice\":\"Appends a given number of queued transactions as a single batch.\"},\"appendSequencerBatch()\":{\"notice\":\"Allows the sequencer to append a batch of transactions.\"},\"batches()\":{\"notice\":\"Accesses the batch storage container.\"},\"enqueue(address,uint256,bytes)\":{\"notice\":\"Adds a transaction to the queue.\"},\"getNextQueueIndex()\":{\"notice\":\"Returns the index of the next element to be enqueued.\"},\"getNumPendingQueueElements()\":{\"notice\":\"Get the number of queue elements which have not yet been included.\"},\"getQueueElement(uint256)\":{\"notice\":\"Gets the queue element at a particular index.\"},\"getQueueLength()\":{\"notice\":\"Retrieves the length of the queue, including both pending and canonical transactions.\"},\"getTotalBatches()\":{\"notice\":\"Retrieves the total number of batches submitted.\"},\"getTotalElements()\":{\"notice\":\"Retrieves the total number of elements submitted.\"},\"queue()\":{\"notice\":\"Accesses the queue storage container.\"},\"verifyTransaction((uint256,uint256,uint8,address,address,uint256,bytes),(bool,uint256,uint256,uint256,bytes),(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))\":{\"notice\":\"Verifies whether a transaction is included in the chain.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/OVM/chain/OVM_CanonicalTransactionChain.sol\":\"OVM_CanonicalTransactionChain\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/optimistic-ethereum/OVM/accounts/OVM_ECDSAContractAccount.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.7.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Interface Imports */\\nimport { iOVM_ECDSAContractAccount } from \\\"../../iOVM/accounts/iOVM_ECDSAContractAccount.sol\\\";\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { Lib_ECDSAUtils } from \\\"../../libraries/utils/Lib_ECDSAUtils.sol\\\";\\nimport { Lib_SafeExecutionManagerWrapper } from \\\"../../libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\\\";\\nimport { Lib_SafeMathWrapper } from \\\"../../libraries/wrappers/Lib_SafeMathWrapper.sol\\\";\\n\\n/**\\n * @title OVM_ECDSAContractAccount\\n */\\ncontract OVM_ECDSAContractAccount is iOVM_ECDSAContractAccount {\\n\\n address constant ETH_ERC20_ADDRESS = 0x4200000000000000000000000000000000000006;\\n uint256 constant EXECUTION_VALIDATION_GAS_OVERHEAD = 25000; // TODO: should be the amount sufficient to cover the gas costs of all of the transactions up to and including the CALL/CREATE which forms the entrypoint of the transaction.\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Executes a signed transaction.\\n * @param _transaction Signed EOA transaction.\\n * @param _signatureType Hashing scheme used for the transaction (e.g., ETH signed message).\\n * @param _v Signature `v` parameter.\\n * @param _r Signature `r` parameter.\\n * @param _s Signature `s` parameter.\\n * @return _success Whether or not the call returned (rather than reverted).\\n * @return _returndata Data returned by the call.\\n */\\n function execute(\\n bytes memory _transaction,\\n Lib_OVMCodec.EOASignatureType _signatureType,\\n uint8 _v,\\n bytes32 _r,\\n bytes32 _s\\n )\\n override\\n public\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n bool isEthSign = _signatureType == Lib_OVMCodec.EOASignatureType.ETH_SIGNED_MESSAGE;\\n\\n // Address of this contract within the ovm (ovmADDRESS) should be the same as the\\n // recovered address of the user who signed this message. This is how we manage to shim\\n // account abstraction even though the user isn't a contract.\\n // Need to make sure that the transaction nonce is right and bump it if so.\\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(\\n Lib_ECDSAUtils.recover(\\n _transaction,\\n isEthSign,\\n _v,\\n _r,\\n _s\\n ) == Lib_SafeExecutionManagerWrapper.safeADDRESS(),\\n \\\"Signature provided for EOA transaction execution is invalid.\\\"\\n );\\n\\n Lib_OVMCodec.EIP155Transaction memory decodedTx = Lib_OVMCodec.decodeEIP155Transaction(_transaction, isEthSign);\\n\\n // Need to make sure that the transaction chainId is correct.\\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(\\n decodedTx.chainId == Lib_SafeExecutionManagerWrapper.safeCHAINID(),\\n \\\"Transaction chainId does not match expected OVM chainId.\\\"\\n );\\n\\n // Need to make sure that the transaction nonce is right.\\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(\\n decodedTx.nonce == Lib_SafeExecutionManagerWrapper.safeGETNONCE(),\\n \\\"Transaction nonce does not match the expected nonce.\\\"\\n );\\n\\n // TEMPORARY: Disable gas checks for minnet.\\n // // Need to make sure that the gas is sufficient to execute the transaction.\\n // Lib_SafeExecutionManagerWrapper.safeREQUIRE(\\n // gasleft() >= Lib_SafeMathWrapper.add(decodedTx.gasLimit, EXECUTION_VALIDATION_GAS_OVERHEAD),\\n // \\\"Gas is not sufficient to execute the transaction.\\\"\\n // );\\n\\n // Transfer fee to relayer.\\n address relayer = Lib_SafeExecutionManagerWrapper.safeCALLER();\\n uint256 fee = decodedTx.gasLimit * decodedTx.gasPrice;\\n (bool success, ) = Lib_SafeExecutionManagerWrapper.safeCALL(\\n gasleft(),\\n ETH_ERC20_ADDRESS,\\n abi.encodeWithSignature(\\\"transfer(address,uint256)\\\", relayer, fee)\\n );\\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(\\n success == true,\\n \\\"Fee was not transferred to relayer.\\\"\\n );\\n\\n // Contract creations are signalled by sending a transaction to the zero address.\\n if (decodedTx.to == address(0)) {\\n address created = Lib_SafeExecutionManagerWrapper.safeCREATE(\\n decodedTx.gasLimit,\\n decodedTx.data\\n );\\n\\n // EVM doesn't tell us whether a contract creation failed, even if it reverted during\\n // initialization. Always return `true` for our success value here.\\n return (true, abi.encode(created));\\n } else {\\n // We only want to bump the nonce for `ovmCALL` because `ovmCREATE` automatically bumps\\n // the nonce of the calling account. Normally an EOA would bump the nonce for both\\n // cases, but since this is a contract we'd end up bumping the nonce twice.\\n Lib_SafeExecutionManagerWrapper.safeSETNONCE(decodedTx.nonce + 1);\\n\\n return Lib_SafeExecutionManagerWrapper.safeCALL(\\n decodedTx.gasLimit,\\n decodedTx.to,\\n decodedTx.data\\n );\\n }\\n }\\n}\\n\",\"keccak256\":\"0x4cc167723233d14207aafc252b53f6abc8b788eac8e71abca6f1b0f257610dbd\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/accounts/OVM_ProxyEOA.sol\":{\"content\":\"pragma solidity ^0.7.0;\\n\\n/* Library Imports */\\nimport { Lib_BytesUtils } from \\\"../../libraries/utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { Lib_ECDSAUtils } from \\\"../../libraries/utils/Lib_ECDSAUtils.sol\\\";\\nimport { Lib_SafeExecutionManagerWrapper } from \\\"../../libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\\\";\\n\\n/**\\n * @title OVM_ProxyEOA\\n */\\ncontract OVM_ProxyEOA {\\n\\n bytes32 constant IMPLEMENTATION_KEY = 0xdeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddead;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n constructor(\\n address _implementation\\n ) {\\n _setImplementation(_implementation);\\n }\\n\\n\\n /*********************\\n * Fallback Function *\\n *********************/\\n\\n fallback()\\n external\\n {\\n (bool success, bytes memory returndata) = Lib_SafeExecutionManagerWrapper.safeDELEGATECALL(\\n gasleft(),\\n getImplementation(),\\n msg.data\\n );\\n\\n if (success) {\\n assembly {\\n return(add(returndata, 0x20), mload(returndata))\\n }\\n } else {\\n Lib_SafeExecutionManagerWrapper.safeREVERT(\\n string(returndata)\\n );\\n }\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function upgrade(\\n address _implementation\\n )\\n external\\n {\\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(\\n Lib_SafeExecutionManagerWrapper.safeADDRESS() == Lib_SafeExecutionManagerWrapper.safeCALLER(),\\n \\\"EOAs can only upgrade their own EOA implementation\\\"\\n );\\n\\n _setImplementation(_implementation);\\n }\\n\\n function getImplementation()\\n public\\n returns (\\n address _implementation\\n )\\n {\\n return address(uint160(uint256(\\n Lib_SafeExecutionManagerWrapper.safeSLOAD(\\n IMPLEMENTATION_KEY\\n )\\n )));\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function _setImplementation(\\n address _implementation\\n )\\n internal\\n {\\n Lib_SafeExecutionManagerWrapper.safeSSTORE(\\n IMPLEMENTATION_KEY,\\n bytes32(uint256(uint160(_implementation)))\\n );\\n }\\n}\",\"keccak256\":\"0x693349aff60b7b27db5a4625081bf64507ec4788c522f34bcee503b0325cd41f\"},\"contracts/optimistic-ethereum/OVM/chain/OVM_CanonicalTransactionChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.7.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\nimport { Lib_MerkleTree } from \\\"../../libraries/utils/Lib_MerkleTree.sol\\\";\\nimport { Lib_Math } from \\\"../../libraries/utils/Lib_Math.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_CanonicalTransactionChain } from \\\"../../iOVM/chain/iOVM_CanonicalTransactionChain.sol\\\";\\nimport { iOVM_ChainStorageContainer } from \\\"../../iOVM/chain/iOVM_ChainStorageContainer.sol\\\";\\n\\n/* Contract Imports */\\nimport { OVM_ExecutionManager } from \\\"../execution/OVM_ExecutionManager.sol\\\";\\n\\n\\n/**\\n * @title OVM_CanonicalTransactionChain\\n */\\ncontract OVM_CanonicalTransactionChain is iOVM_CanonicalTransactionChain, Lib_AddressResolver {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n // L2 tx gas-related\\n uint256 constant public MIN_ROLLUP_TX_GAS = 100000;\\n uint256 constant public MAX_ROLLUP_TX_SIZE = 10000;\\n uint256 constant public L2_GAS_DISCOUNT_DIVISOR = 32;\\n\\n // Encoding-related (all in bytes)\\n uint256 constant internal BATCH_CONTEXT_SIZE = 16;\\n uint256 constant internal BATCH_CONTEXT_LENGTH_POS = 12;\\n uint256 constant internal BATCH_CONTEXT_START_POS = 15;\\n uint256 constant internal TX_DATA_HEADER_SIZE = 3;\\n uint256 constant internal BYTES_TILL_TX_DATA = 65;\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n uint256 public forceInclusionPeriodSeconds;\\n uint256 public forceInclusionPeriodBlocks;\\n uint256 public maxTransactionGasLimit;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n constructor(\\n address _libAddressManager,\\n uint256 _forceInclusionPeriodSeconds,\\n uint256 _forceInclusionPeriodBlocks,\\n uint256 _maxTransactionGasLimit\\n )\\n Lib_AddressResolver(_libAddressManager)\\n {\\n forceInclusionPeriodSeconds = _forceInclusionPeriodSeconds;\\n forceInclusionPeriodBlocks = _forceInclusionPeriodBlocks;\\n maxTransactionGasLimit = _maxTransactionGasLimit;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Accesses the batch storage container.\\n * @return Reference to the batch storage container.\\n */\\n function batches()\\n public\\n view\\n returns (\\n iOVM_ChainStorageContainer\\n )\\n {\\n return iOVM_ChainStorageContainer(\\n resolve(\\\"OVM_ChainStorageContainer:CTC:batches\\\")\\n );\\n }\\n\\n /**\\n * Accesses the queue storage container.\\n * @return Reference to the queue storage container.\\n */\\n function queue()\\n public\\n view\\n returns (\\n iOVM_ChainStorageContainer\\n )\\n {\\n return iOVM_ChainStorageContainer(\\n resolve(\\\"OVM_ChainStorageContainer:CTC:queue\\\")\\n );\\n }\\n\\n /**\\n * @inheritdoc iOVM_CanonicalTransactionChain\\n */\\n function getTotalElements()\\n override\\n public\\n view\\n returns (\\n uint256 _totalElements\\n )\\n {\\n (uint40 totalElements,,,) = _getBatchExtraData();\\n return uint256(totalElements);\\n }\\n\\n /**\\n * @inheritdoc iOVM_CanonicalTransactionChain\\n */\\n function getTotalBatches()\\n override\\n public\\n view\\n returns (\\n uint256 _totalBatches\\n )\\n {\\n return batches().length();\\n }\\n\\n /**\\n * @inheritdoc iOVM_CanonicalTransactionChain\\n */\\n function getNextQueueIndex()\\n override\\n public\\n view\\n returns (\\n uint40\\n )\\n {\\n (, uint40 nextQueueIndex,,) = _getBatchExtraData();\\n return nextQueueIndex;\\n }\\n\\n /**\\n * @inheritdoc iOVM_CanonicalTransactionChain\\n */\\n function getQueueElement(\\n uint256 _index\\n )\\n override\\n public\\n view\\n returns (\\n Lib_OVMCodec.QueueElement memory _element\\n )\\n {\\n uint40 trueIndex = uint40(_index * 2);\\n bytes32 queueRoot = queue().get(trueIndex);\\n bytes32 timestampAndBlockNumber = queue().get(trueIndex + 1);\\n\\n uint40 elementTimestamp;\\n uint40 elementBlockNumber;\\n assembly {\\n elementTimestamp := and(timestampAndBlockNumber, 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF)\\n elementBlockNumber := shr(40, and(timestampAndBlockNumber, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000))\\n }\\n\\n return Lib_OVMCodec.QueueElement({\\n queueRoot: queueRoot,\\n timestamp: elementTimestamp,\\n blockNumber: elementBlockNumber\\n });\\n }\\n\\n /**\\n * @inheritdoc iOVM_CanonicalTransactionChain\\n */\\n function getNumPendingQueueElements()\\n override\\n public\\n view\\n returns (\\n uint40\\n )\\n {\\n return getQueueLength() - getNextQueueIndex();\\n }\\n\\n /**\\n * @inheritdoc iOVM_CanonicalTransactionChain\\n */\\n function getQueueLength()\\n override\\n public\\n view\\n returns (\\n uint40\\n )\\n {\\n // The underlying queue data structure stores 2 elements\\n // per insertion, so to get the real queue length we need\\n // to divide by 2. See the usage of `push2(..)`.\\n return uint40(queue().length() / 2);\\n }\\n\\n /**\\n * @inheritdoc iOVM_CanonicalTransactionChain\\n */\\n function enqueue(\\n address _target,\\n uint256 _gasLimit,\\n bytes memory _data\\n )\\n override\\n public\\n {\\n require(\\n _data.length <= MAX_ROLLUP_TX_SIZE,\\n \\\"Transaction data size exceeds maximum for rollup transaction.\\\"\\n );\\n\\n require(\\n _gasLimit <= maxTransactionGasLimit,\\n \\\"Transaction gas limit exceeds maximum for rollup transaction.\\\"\\n );\\n\\n require(\\n _gasLimit >= MIN_ROLLUP_TX_GAS,\\n \\\"Transaction gas limit too low to enqueue.\\\"\\n );\\n\\n // We need to consume some amount of L1 gas in order to rate limit transactions going into\\n // L2. However, L2 is cheaper than L1 so we only need to burn some small proportion of the\\n // provided L1 gas.\\n uint256 gasToConsume = _gasLimit/L2_GAS_DISCOUNT_DIVISOR;\\n uint256 startingGas = gasleft();\\n\\n // Although this check is not necessary (burn below will run out of gas if not true), it\\n // gives the user an explicit reason as to why the enqueue attempt failed.\\n require(\\n startingGas > gasToConsume,\\n \\\"Insufficient gas for L2 rate limiting burn.\\\"\\n );\\n\\n // Here we do some \\\"dumb\\\" work in order to burn gas, although we should probably replace\\n // this with something like minting gas token later on.\\n uint256 i;\\n while(startingGas - gasleft() < gasToConsume) {\\n i++;\\n }\\n\\n bytes32 transactionHash = keccak256(\\n abi.encode(\\n msg.sender,\\n _target,\\n _gasLimit,\\n _data\\n )\\n );\\n\\n bytes32 timestampAndBlockNumber;\\n assembly {\\n timestampAndBlockNumber := timestamp()\\n timestampAndBlockNumber := or(timestampAndBlockNumber, shl(40, number()))\\n }\\n\\n queue().push2(\\n transactionHash,\\n timestampAndBlockNumber\\n );\\n\\n uint256 queueIndex = queue().length() / 2;\\n emit TransactionEnqueued(\\n msg.sender,\\n _target,\\n _gasLimit,\\n _data,\\n queueIndex - 1,\\n block.timestamp\\n );\\n }\\n\\n /**\\n * @inheritdoc iOVM_CanonicalTransactionChain\\n */\\n function appendQueueBatch(\\n uint256 _numQueuedTransactions\\n )\\n override\\n public\\n {\\n // Disable `appendQueueBatch` for minnet\\n revert(\\\"appendQueueBatch is currently disabled.\\\");\\n\\n _numQueuedTransactions = Lib_Math.min(_numQueuedTransactions, getNumPendingQueueElements());\\n require(\\n _numQueuedTransactions > 0,\\n \\\"Must append more than zero transactions.\\\"\\n );\\n\\n bytes32[] memory leaves = new bytes32[](_numQueuedTransactions);\\n uint40 nextQueueIndex = getNextQueueIndex();\\n\\n for (uint256 i = 0; i < _numQueuedTransactions; i++) {\\n if (msg.sender != resolve(\\\"OVM_Sequencer\\\")) {\\n Lib_OVMCodec.QueueElement memory el = getQueueElement(nextQueueIndex);\\n require(\\n el.timestamp + forceInclusionPeriodSeconds < block.timestamp,\\n \\\"Queue transactions cannot be submitted during the sequencer inclusion period.\\\"\\n );\\n }\\n leaves[i] = _getQueueLeafHash(nextQueueIndex);\\n nextQueueIndex++;\\n }\\n\\n Lib_OVMCodec.QueueElement memory lastElement = getQueueElement(nextQueueIndex - 1);\\n\\n _appendBatch(\\n Lib_MerkleTree.getMerkleRoot(leaves),\\n _numQueuedTransactions,\\n _numQueuedTransactions,\\n lastElement.timestamp,\\n lastElement.blockNumber\\n );\\n\\n emit QueueBatchAppended(\\n nextQueueIndex - _numQueuedTransactions,\\n _numQueuedTransactions,\\n getTotalElements()\\n );\\n }\\n\\n /**\\n * @inheritdoc iOVM_CanonicalTransactionChain\\n */\\n function appendSequencerBatch()\\n override\\n public\\n {\\n uint40 shouldStartAtElement;\\n uint24 totalElementsToAppend;\\n uint24 numContexts;\\n assembly {\\n shouldStartAtElement := shr(216, calldataload(4))\\n totalElementsToAppend := shr(232, calldataload(9))\\n numContexts := shr(232, calldataload(12))\\n }\\n\\n require(\\n shouldStartAtElement == getTotalElements(),\\n \\\"Actual batch start index does not match expected start index.\\\"\\n );\\n\\n require(\\n msg.sender == resolve(\\\"OVM_Sequencer\\\"),\\n \\\"Function can only be called by the Sequencer.\\\"\\n );\\n\\n require(\\n numContexts > 0,\\n \\\"Must provide at least one batch context.\\\"\\n );\\n\\n require(\\n totalElementsToAppend > 0,\\n \\\"Must append at least one element.\\\"\\n );\\n\\n uint40 nextTransactionPtr = uint40(BATCH_CONTEXT_START_POS + BATCH_CONTEXT_SIZE * numContexts);\\n uint256 calldataSize;\\n assembly {\\n calldataSize := calldatasize()\\n }\\n\\n require(\\n calldataSize >= nextTransactionPtr,\\n \\\"Not enough BatchContexts provided.\\\"\\n );\\n\\n // Get queue length for future comparison/\\n uint40 queueLength = getQueueLength();\\n\\n // Initialize the array of canonical chain leaves that we will append.\\n bytes32[] memory leaves = new bytes32[](totalElementsToAppend);\\n // Each leaf index corresponds to a tx, either sequenced or enqueued.\\n uint32 leafIndex = 0;\\n // Counter for number of sequencer transactions appended so far.\\n uint32 numSequencerTransactions = 0;\\n // We will sequentially append leaves which are pointers to the queue.\\n // The initial queue index is what is currently in storage.\\n uint40 nextQueueIndex = getNextQueueIndex();\\n\\n BatchContext memory curContext;\\n\\n for (uint32 i = 0; i < numContexts; i++) {\\n BatchContext memory nextContext = _getBatchContext(i);\\n if (i == 0) {\\n _validateFirstBatchContext(nextContext);\\n }\\n _validateNextBatchContext(curContext, nextContext, nextQueueIndex);\\n\\n curContext = nextContext;\\n\\n for (uint32 j = 0; j < curContext.numSequencedTransactions; j++) {\\n uint256 txDataLength;\\n assembly {\\n txDataLength := shr(232, calldataload(nextTransactionPtr))\\n }\\n\\n leaves[leafIndex] = _getSequencerLeafHash(curContext, nextTransactionPtr, txDataLength);\\n nextTransactionPtr += uint40(TX_DATA_HEADER_SIZE + txDataLength);\\n numSequencerTransactions++;\\n leafIndex++;\\n }\\n\\n for (uint32 j = 0; j < curContext.numSubsequentQueueTransactions; j++) {\\n require(nextQueueIndex < queueLength, \\\"Not enough queued transactions to append.\\\");\\n leaves[leafIndex] = _getQueueLeafHash(nextQueueIndex);\\n nextQueueIndex++;\\n leafIndex++;\\n }\\n }\\n\\n _validateFinalBatchContext(curContext);\\n\\n require(\\n calldataSize == nextTransactionPtr,\\n \\\"Not all sequencer transactions were processed.\\\"\\n );\\n\\n require(\\n leafIndex == totalElementsToAppend,\\n \\\"Actual transaction index does not match expected total elements to append.\\\"\\n );\\n\\n // Generate the required metadata that we need to append this batch\\n uint40 numQueuedTransactions = totalElementsToAppend - numSequencerTransactions;\\n uint40 timestamp;\\n uint40 blockNumber;\\n if (curContext.numSubsequentQueueTransactions == 0) {\\n // The last element is a sequencer tx, therefore pull timestamp and block number from the last context.\\n timestamp = uint40(curContext.timestamp);\\n blockNumber = uint40(curContext.blockNumber);\\n } else {\\n // The last element is a queue tx, therefore pull timestamp and block number from the queue element.\\n Lib_OVMCodec.QueueElement memory lastElement = getQueueElement(nextQueueIndex - 1);\\n timestamp = lastElement.timestamp;\\n blockNumber = lastElement.blockNumber;\\n }\\n\\n _appendBatch(\\n Lib_MerkleTree.getMerkleRoot(leaves),\\n totalElementsToAppend,\\n numQueuedTransactions,\\n timestamp,\\n blockNumber\\n );\\n\\n emit SequencerBatchAppended(\\n nextQueueIndex - numQueuedTransactions,\\n numQueuedTransactions,\\n getTotalElements()\\n );\\n }\\n\\n /**\\n * @inheritdoc iOVM_CanonicalTransactionChain\\n */\\n function verifyTransaction(\\n Lib_OVMCodec.Transaction memory _transaction,\\n Lib_OVMCodec.TransactionChainElement memory _txChainElement,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _inclusionProof\\n )\\n override\\n public\\n view\\n returns (\\n bool\\n )\\n {\\n if (_txChainElement.isSequenced == true) {\\n return _verifySequencerTransaction(\\n _transaction,\\n _txChainElement,\\n _batchHeader,\\n _inclusionProof\\n );\\n } else {\\n return _verifyQueueTransaction(\\n _transaction,\\n _txChainElement.queueIndex,\\n _batchHeader,\\n _inclusionProof\\n );\\n }\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Returns the BatchContext located at a particular index.\\n * @param _index The index of the BatchContext\\n * @return The BatchContext at the specified index.\\n */\\n function _getBatchContext(\\n uint256 _index\\n )\\n internal\\n pure\\n returns (\\n BatchContext memory\\n )\\n {\\n uint256 contextPtr = 15 + _index * BATCH_CONTEXT_SIZE;\\n uint256 numSequencedTransactions;\\n uint256 numSubsequentQueueTransactions;\\n uint256 ctxTimestamp;\\n uint256 ctxBlockNumber;\\n\\n assembly {\\n numSequencedTransactions := shr(232, calldataload(contextPtr))\\n numSubsequentQueueTransactions := shr(232, calldataload(add(contextPtr, 3)))\\n ctxTimestamp := shr(216, calldataload(add(contextPtr, 6)))\\n ctxBlockNumber := shr(216, calldataload(add(contextPtr, 11)))\\n }\\n\\n return BatchContext({\\n numSequencedTransactions: numSequencedTransactions,\\n numSubsequentQueueTransactions: numSubsequentQueueTransactions,\\n timestamp: ctxTimestamp,\\n blockNumber: ctxBlockNumber\\n });\\n }\\n\\n /**\\n * Parses the batch context from the extra data.\\n * @return Total number of elements submitted.\\n * @return Index of the next queue element.\\n */\\n function _getBatchExtraData()\\n internal\\n view\\n returns (\\n uint40,\\n uint40,\\n uint40,\\n uint40\\n )\\n {\\n bytes27 extraData = batches().getGlobalMetadata();\\n\\n uint40 totalElements;\\n uint40 nextQueueIndex;\\n uint40 lastTimestamp;\\n uint40 lastBlockNumber;\\n assembly {\\n extraData := shr(40, extraData)\\n totalElements := and(extraData, 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF)\\n nextQueueIndex := shr(40, and(extraData, 0x00000000000000000000000000000000000000000000FFFFFFFFFF0000000000))\\n lastTimestamp := shr(80, and(extraData, 0x0000000000000000000000000000000000FFFFFFFFFF00000000000000000000))\\n lastBlockNumber := shr(120, and(extraData, 0x000000000000000000000000FFFFFFFFFF000000000000000000000000000000))\\n }\\n\\n return (\\n totalElements,\\n nextQueueIndex,\\n lastTimestamp,\\n lastBlockNumber\\n );\\n }\\n\\n /**\\n * Encodes the batch context for the extra data.\\n * @param _totalElements Total number of elements submitted.\\n * @param _nextQueueIndex Index of the next queue element.\\n * @param _timestamp Timestamp for the last batch.\\n * @param _blockNumber Block number of the last batch.\\n * @return Encoded batch context.\\n */\\n function _makeBatchExtraData(\\n uint40 _totalElements,\\n uint40 _nextQueueIndex,\\n uint40 _timestamp,\\n uint40 _blockNumber\\n )\\n internal\\n pure\\n returns (\\n bytes27\\n )\\n {\\n bytes27 extraData;\\n assembly {\\n extraData := _totalElements\\n extraData := or(extraData, shl(40, _nextQueueIndex))\\n extraData := or(extraData, shl(80, _timestamp))\\n extraData := or(extraData, shl(120, _blockNumber))\\n extraData := shl(40, extraData)\\n }\\n\\n return extraData;\\n }\\n\\n /**\\n * Retrieves the hash of a queue element.\\n * @param _index Index of the queue element to retrieve a hash for.\\n * @return Hash of the queue element.\\n */\\n function _getQueueLeafHash(\\n uint256 _index\\n )\\n internal\\n view\\n returns (\\n bytes32\\n )\\n {\\n return _hashTransactionChainElement(\\n Lib_OVMCodec.TransactionChainElement({\\n isSequenced: false,\\n queueIndex: _index,\\n timestamp: 0,\\n blockNumber: 0,\\n txData: hex\\\"\\\"\\n })\\n );\\n }\\n\\n /**\\n * Retrieves the length of the queue.\\n * @return Length of the queue.\\n */\\n function _getQueueLength()\\n internal\\n view\\n returns (\\n uint40\\n )\\n {\\n // The underlying queue data structure stores 2 elements\\n // per insertion, so to get the real queue length we need\\n // to divide by 2. See the usage of `push2(..)`.\\n return uint40(queue().length() / 2);\\n }\\n\\n /**\\n * Retrieves the hash of a sequencer element.\\n * @param _context Batch context for the given element.\\n * @param _nextTransactionPtr Pointer to the next transaction in the calldata.\\n * @param _txDataLength Length of the transaction item.\\n * @return Hash of the sequencer element.\\n */\\n function _getSequencerLeafHash(\\n BatchContext memory _context,\\n uint256 _nextTransactionPtr,\\n uint256 _txDataLength\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n\\n bytes memory chainElement = new bytes(BYTES_TILL_TX_DATA + _txDataLength);\\n uint256 ctxTimestamp = _context.timestamp;\\n uint256 ctxBlockNumber = _context.blockNumber;\\n\\n bytes32 leafHash;\\n assembly {\\n let chainElementStart := add(chainElement, 0x20)\\n\\n // Set the first byte equal to `1` to indicate this is a sequencer chain element.\\n // This distinguishes sequencer ChainElements from queue ChainElements because\\n // all queue ChainElements are ABI encoded and the first byte of ABI encoded\\n // elements is always zero\\n mstore8(chainElementStart, 1)\\n\\n mstore(add(chainElementStart, 1), ctxTimestamp)\\n mstore(add(chainElementStart, 33), ctxBlockNumber)\\n\\n calldatacopy(add(chainElementStart, BYTES_TILL_TX_DATA), add(_nextTransactionPtr, 3), _txDataLength)\\n\\n leafHash := keccak256(chainElementStart, add(BYTES_TILL_TX_DATA, _txDataLength))\\n }\\n\\n return leafHash;\\n }\\n\\n /**\\n * Retrieves the hash of a sequencer element.\\n * @param _txChainElement The chain element which is hashed to calculate the leaf.\\n * @return Hash of the sequencer element.\\n */\\n function _getSequencerLeafHash(\\n Lib_OVMCodec.TransactionChainElement memory _txChainElement\\n )\\n internal\\n view\\n returns(\\n bytes32\\n )\\n {\\n bytes memory txData = _txChainElement.txData;\\n uint256 txDataLength = _txChainElement.txData.length;\\n\\n bytes memory chainElement = new bytes(BYTES_TILL_TX_DATA + txDataLength);\\n uint256 ctxTimestamp = _txChainElement.timestamp;\\n uint256 ctxBlockNumber = _txChainElement.blockNumber;\\n\\n bytes32 leafHash;\\n assembly {\\n let chainElementStart := add(chainElement, 0x20)\\n\\n // Set the first byte equal to `1` to indicate this is a sequencer chain element.\\n // This distinguishes sequencer ChainElements from queue ChainElements because\\n // all queue ChainElements are ABI encoded and the first byte of ABI encoded\\n // elements is always zero\\n mstore8(chainElementStart, 1)\\n\\n mstore(add(chainElementStart, 1), ctxTimestamp)\\n mstore(add(chainElementStart, 33), ctxBlockNumber)\\n\\n pop(staticcall(gas(), 0x04, add(txData, 0x20), txDataLength, add(chainElementStart, BYTES_TILL_TX_DATA), txDataLength))\\n\\n leafHash := keccak256(chainElementStart, add(BYTES_TILL_TX_DATA, txDataLength))\\n }\\n\\n return leafHash;\\n }\\n\\n /**\\n * Inserts a batch into the chain of batches.\\n * @param _transactionRoot Root of the transaction tree for this batch.\\n * @param _batchSize Number of elements in the batch.\\n * @param _numQueuedTransactions Number of queue transactions in the batch.\\n * @param _timestamp The latest batch timestamp.\\n * @param _blockNumber The latest batch blockNumber.\\n */\\n function _appendBatch(\\n bytes32 _transactionRoot,\\n uint256 _batchSize,\\n uint256 _numQueuedTransactions,\\n uint40 _timestamp,\\n uint40 _blockNumber\\n )\\n internal\\n {\\n (uint40 totalElements, uint40 nextQueueIndex, uint40 lastTimestamp, uint40 lastBlockNumber) = _getBatchExtraData();\\n\\n Lib_OVMCodec.ChainBatchHeader memory header = Lib_OVMCodec.ChainBatchHeader({\\n batchIndex: batches().length(),\\n batchRoot: _transactionRoot,\\n batchSize: _batchSize,\\n prevTotalElements: totalElements,\\n extraData: hex\\\"\\\"\\n });\\n\\n emit TransactionBatchAppended(\\n header.batchIndex,\\n header.batchRoot,\\n header.batchSize,\\n header.prevTotalElements,\\n header.extraData\\n );\\n\\n bytes32 batchHeaderHash = Lib_OVMCodec.hashBatchHeader(header);\\n bytes27 latestBatchContext = _makeBatchExtraData(\\n totalElements + uint40(header.batchSize),\\n nextQueueIndex + uint40(_numQueuedTransactions),\\n _timestamp,\\n _blockNumber\\n );\\n\\n batches().push(batchHeaderHash, latestBatchContext);\\n }\\n\\n /**\\n * Checks that the first batch context in a sequencer submission is valid\\n * @param _firstContext The batch context to validate.\\n */\\n function _validateFirstBatchContext(\\n BatchContext memory _firstContext\\n )\\n internal\\n view\\n {\\n // If there are existing elements, this batch must come later.\\n if (getTotalElements() > 0) {\\n (,, uint40 lastTimestamp, uint40 lastBlockNumber) = _getBatchExtraData();\\n require(_firstContext.blockNumber >= lastBlockNumber, \\\"Context block number is lower than last submitted.\\\");\\n require(_firstContext.timestamp >= lastTimestamp, \\\"Context timestamp is lower than last submitted.\\\");\\n }\\n // Sequencer cannot submit contexts which are more than the force inclusion period old.\\n require(_firstContext.timestamp + forceInclusionPeriodSeconds >= block.timestamp, \\\"Context timestamp too far in the past.\\\");\\n require(_firstContext.blockNumber + forceInclusionPeriodBlocks >= block.number, \\\"Context block number too far in the past.\\\");\\n }\\n\\n /**\\n * Checks that a given batch context is valid based on its previous context, and the next queue elemtent.\\n * @param _prevContext The previously validated batch context.\\n * @param _nextContext The batch context to validate with this call.\\n * @param _nextQueueIndex Index of the next queue element to process for the _nextContext's subsequentQueueElements.\\n */\\n function _validateNextBatchContext(\\n BatchContext memory _prevContext,\\n BatchContext memory _nextContext,\\n uint40 _nextQueueIndex\\n )\\n internal\\n view\\n {\\n // All sequencer transactions' times must increase from the previous ones.\\n require(\\n _nextContext.timestamp >= _prevContext.timestamp,\\n \\\"Context timestamp values must monotonically increase.\\\"\\n );\\n\\n require(\\n _nextContext.blockNumber >= _prevContext.blockNumber,\\n \\\"Context blockNumber values must monotonically increase.\\\"\\n );\\n\\n // If there are some queue elements pending:\\n if (getQueueLength() - _nextQueueIndex > 0) {\\n Lib_OVMCodec.QueueElement memory nextQueueElement = getQueueElement(_nextQueueIndex);\\n\\n // If the force inclusion period has passed for an enqueued transaction, it MUST be the next chain element.\\n require(\\n block.timestamp < nextQueueElement.timestamp + forceInclusionPeriodSeconds,\\n \\\"Previously enqueued batches have expired and must be appended before a new sequencer batch.\\\"\\n );\\n\\n // Just like sequencer transaction times must be increasing relative to each other,\\n // We also require that they be increasing relative to any interspersed queue elements.\\n require(\\n _nextContext.timestamp <= nextQueueElement.timestamp,\\n \\\"Sequencer transaction timestamp exceeds that of next queue element.\\\"\\n );\\n\\n require(\\n _nextContext.blockNumber <= nextQueueElement.blockNumber,\\n \\\"Sequencer transaction blockNumber exceeds that of next queue element.\\\"\\n );\\n } \\n }\\n\\n /**\\n * Checks that the final batch context in a sequencer submission is valid.\\n * @param _finalContext The batch context to validate.\\n */\\n function _validateFinalBatchContext(\\n BatchContext memory _finalContext\\n )\\n internal\\n view\\n {\\n // Batches cannot be added from the future, or subsequent enqueue() contexts would violate monotonicity.\\n require(_finalContext.timestamp <= block.timestamp, \\\"Context timestamp is from the future.\\\");\\n require(_finalContext.blockNumber <= block.number, \\\"Context block number is from the future.\\\");\\n }\\n\\n /**\\n * Hashes a transaction chain element.\\n * @param _element Chain element to hash.\\n * @return Hash of the chain element.\\n */\\n function _hashTransactionChainElement(\\n Lib_OVMCodec.TransactionChainElement memory _element\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(\\n abi.encode(\\n _element.isSequenced,\\n _element.queueIndex,\\n _element.timestamp,\\n _element.blockNumber,\\n _element.txData\\n )\\n );\\n }\\n\\n /**\\n * Verifies a sequencer transaction, returning true if it was indeed included in the CTC\\n * @param _transaction The transaction we are verifying inclusion of.\\n * @param _txChainElement The chain element that the transaction is claimed to be a part of.\\n * @param _batchHeader Header of the batch the transaction was included in.\\n * @param _inclusionProof An inclusion proof into the CTC at a particular index.\\n * @return True if the transaction was included in the specified location, else false.\\n */\\n function _verifySequencerTransaction(\\n Lib_OVMCodec.Transaction memory _transaction,\\n Lib_OVMCodec.TransactionChainElement memory _txChainElement,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _inclusionProof\\n )\\n internal\\n view\\n returns (\\n bool\\n )\\n {\\n OVM_ExecutionManager ovmExecutionManager = OVM_ExecutionManager(resolve(\\\"OVM_ExecutionManager\\\"));\\n uint256 gasLimit = ovmExecutionManager.getMaxTransactionGasLimit();\\n bytes32 leafHash = _getSequencerLeafHash(_txChainElement);\\n\\n require(\\n _verifyElement(\\n leafHash,\\n _batchHeader,\\n _inclusionProof\\n ),\\n \\\"Invalid Sequencer transaction inclusion proof.\\\"\\n );\\n\\n require(\\n _transaction.blockNumber == _txChainElement.blockNumber\\n && _transaction.timestamp == _txChainElement.timestamp\\n && _transaction.entrypoint == resolve(\\\"OVM_DecompressionPrecompileAddress\\\")\\n && _transaction.gasLimit == gasLimit\\n && _transaction.l1TxOrigin == address(0)\\n && _transaction.l1QueueOrigin == Lib_OVMCodec.QueueOrigin.SEQUENCER_QUEUE\\n && keccak256(_transaction.data) == keccak256(_txChainElement.txData),\\n \\\"Invalid Sequencer transaction.\\\"\\n );\\n\\n return true;\\n }\\n\\n /**\\n * Verifies a queue transaction, returning true if it was indeed included in the CTC\\n * @param _transaction The transaction we are verifying inclusion of.\\n * @param _queueIndex The queueIndex of the queued transaction.\\n * @param _batchHeader Header of the batch the transaction was included in.\\n * @param _inclusionProof An inclusion proof into the CTC at a particular index (should point to queue tx).\\n * @return True if the transaction was included in the specified location, else false.\\n */\\n function _verifyQueueTransaction(\\n Lib_OVMCodec.Transaction memory _transaction,\\n uint256 _queueIndex,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _inclusionProof\\n )\\n internal\\n view\\n returns (\\n bool\\n )\\n {\\n bytes32 leafHash = _getQueueLeafHash(_queueIndex);\\n\\n require(\\n _verifyElement(\\n leafHash,\\n _batchHeader,\\n _inclusionProof\\n ),\\n \\\"Invalid Queue transaction inclusion proof.\\\"\\n );\\n\\n bytes32 transactionHash = keccak256(\\n abi.encode(\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n )\\n );\\n\\n Lib_OVMCodec.QueueElement memory el = getQueueElement(_queueIndex);\\n require(\\n el.queueRoot == transactionHash\\n && el.timestamp == _transaction.timestamp\\n && el.blockNumber == _transaction.blockNumber,\\n \\\"Invalid Queue transaction.\\\"\\n );\\n\\n return true;\\n }\\n\\n /**\\n * Verifies a batch inclusion proof.\\n * @param _element Hash of the element to verify a proof for.\\n * @param _batchHeader Header of the batch in which the element was included.\\n * @param _proof Merkle inclusion proof for the element.\\n */\\n function _verifyElement(\\n bytes32 _element,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _proof\\n )\\n internal\\n view\\n returns (\\n bool\\n )\\n {\\n require(\\n Lib_OVMCodec.hashBatchHeader(_batchHeader) == batches().get(uint32(_batchHeader.batchIndex)),\\n \\\"Invalid batch header.\\\"\\n );\\n\\n require(\\n Lib_MerkleTree.verify(\\n _batchHeader.batchRoot,\\n _element,\\n _proof.index,\\n _proof.siblings,\\n _batchHeader.batchSize\\n ),\\n \\\"Invalid inclusion proof.\\\"\\n );\\n\\n return true;\\n }\\n}\\n\",\"keccak256\":\"0x66d6fe12fd7d90474ebafd93d75ba57da93a339b38da22c29007e7823c456212\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.7.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\nimport { Lib_EthUtils } from \\\"../../libraries/utils/Lib_EthUtils.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_ExecutionManager } from \\\"../../iOVM/execution/iOVM_ExecutionManager.sol\\\";\\nimport { iOVM_StateManager } from \\\"../../iOVM/execution/iOVM_StateManager.sol\\\";\\nimport { iOVM_SafetyChecker } from \\\"../../iOVM/execution/iOVM_SafetyChecker.sol\\\";\\n\\n/* Contract Imports */\\nimport { OVM_ECDSAContractAccount } from \\\"../accounts/OVM_ECDSAContractAccount.sol\\\";\\nimport { OVM_ProxyEOA } from \\\"../accounts/OVM_ProxyEOA.sol\\\";\\nimport { OVM_DeployerWhitelist } from \\\"../precompiles/OVM_DeployerWhitelist.sol\\\";\\n\\n/**\\n * @title OVM_ExecutionManager\\n */\\ncontract OVM_ExecutionManager is iOVM_ExecutionManager, Lib_AddressResolver {\\n\\n /********************************\\n * External Contract References *\\n ********************************/\\n\\n iOVM_SafetyChecker internal ovmSafetyChecker;\\n iOVM_StateManager internal ovmStateManager;\\n\\n\\n /*******************************\\n * Execution Context Variables *\\n *******************************/\\n\\n GasMeterConfig internal gasMeterConfig;\\n GlobalContext internal globalContext;\\n TransactionContext internal transactionContext;\\n MessageContext internal messageContext;\\n TransactionRecord internal transactionRecord;\\n MessageRecord internal messageRecord;\\n\\n\\n /**************************\\n * Gas Metering Constants *\\n **************************/\\n\\n address constant GAS_METADATA_ADDRESS = 0x06a506A506a506A506a506a506A506A506A506A5;\\n uint256 constant NUISANCE_GAS_SLOAD = 20000;\\n uint256 constant NUISANCE_GAS_SSTORE = 20000;\\n uint256 constant MIN_NUISANCE_GAS_PER_CONTRACT = 30000;\\n uint256 constant NUISANCE_GAS_PER_CONTRACT_BYTE = 100;\\n uint256 constant MIN_GAS_FOR_INVALID_STATE_ACCESS = 30000;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n */\\n constructor(\\n address _libAddressManager,\\n GasMeterConfig memory _gasMeterConfig,\\n GlobalContext memory _globalContext\\n )\\n Lib_AddressResolver(_libAddressManager)\\n {\\n ovmSafetyChecker = iOVM_SafetyChecker(resolve(\\\"OVM_SafetyChecker\\\"));\\n gasMeterConfig = _gasMeterConfig;\\n globalContext = _globalContext;\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n /**\\n * Applies dynamically-sized refund to a transaction to account for the difference in execution\\n * between L1 and L2, so that the overall cost of the ovmOPCODE is fixed.\\n * @param _cost Desired gas cost for the function after the refund.\\n */\\n modifier netGasCost(\\n uint256 _cost\\n ) {\\n uint256 gasProvided = gasleft();\\n _;\\n uint256 gasUsed = gasProvided - gasleft();\\n\\n // We want to refund everything *except* the specified cost.\\n if (_cost < gasUsed) {\\n transactionRecord.ovmGasRefund += gasUsed - _cost;\\n }\\n }\\n\\n /**\\n * Applies a fixed-size gas refund to a transaction to account for the difference in execution\\n * between L1 and L2, so that the overall cost of an ovmOPCODE can be lowered.\\n * @param _discount Amount of gas cost to refund for the ovmOPCODE.\\n */\\n modifier fixedGasDiscount(\\n uint256 _discount\\n ) {\\n uint256 gasProvided = gasleft();\\n _;\\n uint256 gasUsed = gasProvided - gasleft();\\n\\n // We want to refund the specified _discount, unless this risks underflow.\\n if (_discount < gasUsed) {\\n transactionRecord.ovmGasRefund += _discount;\\n } else {\\n // refund all we can without risking underflow.\\n transactionRecord.ovmGasRefund += gasUsed;\\n }\\n }\\n\\n /**\\n * Makes sure we're not inside a static context.\\n */\\n modifier notStatic() {\\n if (messageContext.isStatic == true) {\\n _revertWithFlag(RevertFlag.STATIC_VIOLATION);\\n }\\n _;\\n }\\n\\n\\n /************************************\\n * Transaction Execution Entrypoint *\\n ************************************/\\n\\n /**\\n * Starts the execution of a transaction via the OVM_ExecutionManager.\\n * @param _transaction Transaction data to be executed.\\n * @param _ovmStateManager iOVM_StateManager implementation providing account state.\\n */\\n function run(\\n Lib_OVMCodec.Transaction memory _transaction,\\n address _ovmStateManager\\n )\\n override\\n public\\n {\\n require(transactionContext.ovmNUMBER == 0, \\\"Only be callable at the start of a transaction\\\");\\n // Store our OVM_StateManager instance (significantly easier than attempting to pass the\\n // address around in calldata).\\n ovmStateManager = iOVM_StateManager(_ovmStateManager);\\n\\n // Make sure this function can't be called by anyone except the owner of the\\n // OVM_StateManager (expected to be an OVM_StateTransitioner). We can revert here because\\n // this would make the `run` itself invalid.\\n require(\\n ovmStateManager.isAuthenticated(msg.sender),\\n \\\"Only authenticated addresses in ovmStateManager can call this function\\\"\\n );\\n\\n // Initialize the execution context, must be initialized before we perform any gas metering\\n // or we'll throw a nuisance gas error.\\n _initContext(_transaction);\\n\\n // TEMPORARY: Gas metering is disabled for minnet.\\n // // Check whether we need to start a new epoch, do so if necessary.\\n // _checkNeedsNewEpoch(_transaction.timestamp);\\n\\n // Make sure the transaction's gas limit is valid. We don't revert here because we reserve\\n // reverts for INVALID_STATE_ACCESS.\\n if (_isValidGasLimit(_transaction.gasLimit, _transaction.l1QueueOrigin) == false) {\\n return;\\n }\\n\\n // Check gas right before the call to get total gas consumed by OVM transaction.\\n uint256 gasProvided = gasleft();\\n\\n // Run the transaction, make sure to meter the gas usage.\\n ovmCALL(\\n _transaction.gasLimit - gasMeterConfig.minTransactionGasLimit,\\n _transaction.entrypoint,\\n _transaction.data\\n );\\n uint256 gasUsed = gasProvided - gasleft();\\n\\n // TEMPORARY: Gas metering is disabled for minnet.\\n // // Update the cumulative gas based on the amount of gas used.\\n // _updateCumulativeGas(gasUsed, _transaction.l1QueueOrigin);\\n\\n // Wipe the execution context.\\n _resetContext();\\n\\n // Reset the ovmStateManager.\\n ovmStateManager = iOVM_StateManager(address(0));\\n }\\n\\n\\n /******************************\\n * Opcodes: Execution Context *\\n ******************************/\\n\\n /**\\n * @notice Overrides CALLER.\\n * @return _CALLER Address of the CALLER within the current message context.\\n */\\n function ovmCALLER()\\n override\\n public\\n view\\n returns (\\n address _CALLER\\n )\\n {\\n return messageContext.ovmCALLER;\\n }\\n\\n /**\\n * @notice Overrides ADDRESS.\\n * @return _ADDRESS Active ADDRESS within the current message context.\\n */\\n function ovmADDRESS()\\n override\\n public\\n view\\n returns (\\n address _ADDRESS\\n )\\n {\\n return messageContext.ovmADDRESS;\\n }\\n\\n /**\\n * @notice Overrides TIMESTAMP.\\n * @return _TIMESTAMP Value of the TIMESTAMP within the transaction context.\\n */\\n function ovmTIMESTAMP()\\n override\\n public\\n view\\n returns (\\n uint256 _TIMESTAMP\\n )\\n {\\n return transactionContext.ovmTIMESTAMP;\\n }\\n\\n /**\\n * @notice Overrides NUMBER.\\n * @return _NUMBER Value of the NUMBER within the transaction context.\\n */\\n function ovmNUMBER()\\n override\\n public\\n view\\n returns (\\n uint256 _NUMBER\\n )\\n {\\n return transactionContext.ovmNUMBER;\\n }\\n\\n /**\\n * @notice Overrides GASLIMIT.\\n * @return _GASLIMIT Value of the block's GASLIMIT within the transaction context.\\n */\\n function ovmGASLIMIT()\\n override\\n public\\n view\\n returns (\\n uint256 _GASLIMIT\\n )\\n {\\n return transactionContext.ovmGASLIMIT;\\n }\\n\\n /**\\n * @notice Overrides CHAINID.\\n * @return _CHAINID Value of the chain's CHAINID within the global context.\\n */\\n function ovmCHAINID()\\n override\\n public\\n view\\n returns (\\n uint256 _CHAINID\\n )\\n {\\n return globalContext.ovmCHAINID;\\n }\\n\\n /*********************************\\n * Opcodes: L2 Execution Context *\\n *********************************/\\n\\n /**\\n * @notice Specifies from which L1 rollup queue this transaction originated from.\\n * @return _queueOrigin Address of the ovmL1QUEUEORIGIN within the current message context.\\n */\\n function ovmL1QUEUEORIGIN()\\n override\\n public\\n view\\n returns (\\n Lib_OVMCodec.QueueOrigin _queueOrigin\\n )\\n {\\n return transactionContext.ovmL1QUEUEORIGIN;\\n }\\n\\n /**\\n * @notice Specifies what L1 EOA, if any, sent this transaction.\\n * @return _l1TxOrigin Address of the EOA which send the tx into L2 from L1.\\n */\\n function ovmL1TXORIGIN()\\n override\\n public\\n view\\n returns (\\n address _l1TxOrigin\\n )\\n {\\n return transactionContext.ovmL1TXORIGIN;\\n }\\n\\n /********************\\n * Opcodes: Halting *\\n ********************/\\n\\n /**\\n * @notice Overrides REVERT.\\n * @param _data Bytes data to pass along with the REVERT.\\n */\\n function ovmREVERT(\\n bytes memory _data\\n )\\n override\\n public\\n {\\n _revertWithFlag(RevertFlag.INTENTIONAL_REVERT, _data);\\n }\\n\\n\\n /******************************\\n * Opcodes: Contract Creation *\\n ******************************/\\n\\n /**\\n * @notice Overrides CREATE.\\n * @param _bytecode Code to be used to CREATE a new contract.\\n * @return _contract Address of the created contract.\\n */\\n function ovmCREATE(\\n bytes memory _bytecode\\n )\\n override\\n public\\n notStatic\\n fixedGasDiscount(40000)\\n returns (\\n address _contract\\n )\\n {\\n // Creator is always the current ADDRESS.\\n address creator = ovmADDRESS();\\n\\n // Check that the deployer is whitelisted, or\\n // that arbitrary contract deployment has been enabled.\\n _checkDeployerAllowed(creator);\\n\\n // Generate the correct CREATE address.\\n address contractAddress = Lib_EthUtils.getAddressForCREATE(\\n creator,\\n _getAccountNonce(creator)\\n );\\n\\n return _createContract(\\n contractAddress,\\n _bytecode\\n );\\n }\\n\\n /**\\n * @notice Overrides CREATE2.\\n * @param _bytecode Code to be used to CREATE2 a new contract.\\n * @param _salt Value used to determine the contract's address.\\n * @return _contract Address of the created contract.\\n */\\n function ovmCREATE2(\\n bytes memory _bytecode,\\n bytes32 _salt\\n )\\n override\\n public\\n notStatic\\n fixedGasDiscount(40000)\\n returns (\\n address _contract\\n )\\n {\\n // Creator is always the current ADDRESS.\\n address creator = ovmADDRESS();\\n\\n // Check that the deployer is whitelisted, or\\n // that arbitrary contract deployment has been enabled.\\n _checkDeployerAllowed(creator);\\n\\n // Generate the correct CREATE2 address.\\n address contractAddress = Lib_EthUtils.getAddressForCREATE2(\\n creator,\\n _bytecode,\\n _salt\\n );\\n\\n return _createContract(\\n contractAddress,\\n _bytecode\\n );\\n }\\n\\n\\n /*******************************\\n * Account Abstraction Opcodes *\\n ******************************/\\n\\n /**\\n * Retrieves the nonce of the current ovmADDRESS.\\n * @return _nonce Nonce of the current contract.\\n */\\n function ovmGETNONCE()\\n override\\n public\\n returns (\\n uint256 _nonce\\n )\\n {\\n return _getAccountNonce(ovmADDRESS());\\n }\\n\\n /**\\n * Sets the nonce of the current ovmADDRESS.\\n * @param _nonce New nonce for the current contract.\\n */\\n function ovmSETNONCE(\\n uint256 _nonce\\n )\\n override\\n public\\n notStatic\\n {\\n _setAccountNonce(ovmADDRESS(), _nonce);\\n }\\n\\n /**\\n * Creates a new EOA contract account, for account abstraction.\\n * @dev Essentially functions like ovmCREATE or ovmCREATE2, but we can bypass a lot of checks\\n * because the contract we're creating is trusted (no need to do safety checking or to\\n * handle unexpected reverts). Doesn't need to return an address because the address is\\n * assumed to be the user's actual address.\\n * @param _messageHash Hash of a message signed by some user, for verification.\\n * @param _v Signature `v` parameter.\\n * @param _r Signature `r` parameter.\\n * @param _s Signature `s` parameter.\\n */\\n function ovmCREATEEOA(\\n bytes32 _messageHash,\\n uint8 _v,\\n bytes32 _r,\\n bytes32 _s\\n )\\n override\\n public\\n notStatic\\n {\\n // Recover the EOA address from the message hash and signature parameters. Since we do the\\n // hashing in advance, we don't have handle different message hashing schemes. Even if this\\n // function were to return the wrong address (rather than explicitly returning the zero\\n // address), the rest of the transaction would simply fail (since there's no EOA account to\\n // actually execute the transaction).\\n address eoa = ecrecover(\\n _messageHash,\\n _v + 27,\\n _r,\\n _s\\n );\\n\\n // Invalid signature is a case we proactively handle with a revert. We could alternatively\\n // have this function return a `success` boolean, but this is just easier.\\n if (eoa == address(0)) {\\n ovmREVERT(bytes(\\\"Signature provided for EOA contract creation is invalid.\\\"));\\n }\\n\\n // If the user already has an EOA account, then there's no need to perform this operation.\\n if (_hasEmptyAccount(eoa) == false) {\\n return;\\n }\\n\\n // We always need to initialize the contract with the default account values.\\n _initPendingAccount(eoa);\\n\\n // Temporarily set the current address so it's easier to access on L2.\\n address prevADDRESS = messageContext.ovmADDRESS;\\n messageContext.ovmADDRESS = eoa;\\n\\n // Now actually create the account and get its bytecode. We're not worried about reverts\\n // (other than out of gas, which we can't capture anyway) because this contract is trusted.\\n OVM_ProxyEOA proxyEOA = new OVM_ProxyEOA(0x4200000000000000000000000000000000000003);\\n\\n // Reset the address now that we're done deploying.\\n messageContext.ovmADDRESS = prevADDRESS;\\n\\n // Commit the account with its final values.\\n _commitPendingAccount(\\n eoa,\\n address(proxyEOA),\\n keccak256(Lib_EthUtils.getCode(address(proxyEOA)))\\n );\\n\\n _setAccountNonce(eoa, 0);\\n }\\n\\n\\n /*********************************\\n * Opcodes: Contract Interaction *\\n *********************************/\\n\\n /**\\n * @notice Overrides CALL.\\n * @param _gasLimit Amount of gas to be passed into this call.\\n * @param _address Address of the contract to call.\\n * @param _calldata Data to send along with the call.\\n * @return _success Whether or not the call returned (rather than reverted).\\n * @return _returndata Data returned by the call.\\n */\\n function ovmCALL(\\n uint256 _gasLimit,\\n address _address,\\n bytes memory _calldata\\n )\\n override\\n public\\n fixedGasDiscount(100000)\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n // CALL updates the CALLER and ADDRESS.\\n MessageContext memory nextMessageContext = messageContext;\\n nextMessageContext.ovmCALLER = nextMessageContext.ovmADDRESS;\\n nextMessageContext.ovmADDRESS = _address;\\n\\n return _callContract(\\n nextMessageContext,\\n _gasLimit,\\n _address,\\n _calldata\\n );\\n }\\n\\n /**\\n * @notice Overrides STATICCALL.\\n * @param _gasLimit Amount of gas to be passed into this call.\\n * @param _address Address of the contract to call.\\n * @param _calldata Data to send along with the call.\\n * @return _success Whether or not the call returned (rather than reverted).\\n * @return _returndata Data returned by the call.\\n */\\n function ovmSTATICCALL(\\n uint256 _gasLimit,\\n address _address,\\n bytes memory _calldata\\n )\\n override\\n public\\n fixedGasDiscount(80000)\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n // STATICCALL updates the CALLER, updates the ADDRESS, and runs in a static context.\\n MessageContext memory nextMessageContext = messageContext;\\n nextMessageContext.ovmCALLER = nextMessageContext.ovmADDRESS;\\n nextMessageContext.ovmADDRESS = _address;\\n nextMessageContext.isStatic = true;\\n\\n return _callContract(\\n nextMessageContext,\\n _gasLimit,\\n _address,\\n _calldata\\n );\\n }\\n\\n /**\\n * @notice Overrides DELEGATECALL.\\n * @param _gasLimit Amount of gas to be passed into this call.\\n * @param _address Address of the contract to call.\\n * @param _calldata Data to send along with the call.\\n * @return _success Whether or not the call returned (rather than reverted).\\n * @return _returndata Data returned by the call.\\n */\\n function ovmDELEGATECALL(\\n uint256 _gasLimit,\\n address _address,\\n bytes memory _calldata\\n )\\n override\\n public\\n fixedGasDiscount(40000)\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n // DELEGATECALL does not change anything about the message context.\\n MessageContext memory nextMessageContext = messageContext;\\n bool isStaticEntrypoint = false;\\n\\n return _callContract(\\n nextMessageContext,\\n _gasLimit,\\n _address,\\n _calldata\\n );\\n }\\n\\n\\n /************************************\\n * Opcodes: Contract Storage Access *\\n ************************************/\\n\\n /**\\n * @notice Overrides SLOAD.\\n * @param _key 32 byte key of the storage slot to load.\\n * @return _value 32 byte value of the requested storage slot.\\n */\\n function ovmSLOAD(\\n bytes32 _key\\n )\\n override\\n public\\n netGasCost(40000)\\n returns (\\n bytes32 _value\\n )\\n {\\n // We always SLOAD from the storage of ADDRESS.\\n address contractAddress = ovmADDRESS();\\n\\n return _getContractStorage(\\n contractAddress,\\n _key\\n );\\n }\\n\\n /**\\n * @notice Overrides SSTORE.\\n * @param _key 32 byte key of the storage slot to set.\\n * @param _value 32 byte value for the storage slot.\\n */\\n function ovmSSTORE(\\n bytes32 _key,\\n bytes32 _value\\n )\\n override\\n public\\n notStatic\\n netGasCost(60000)\\n {\\n // We always SSTORE to the storage of ADDRESS.\\n address contractAddress = ovmADDRESS();\\n\\n _putContractStorage(\\n contractAddress,\\n _key,\\n _value\\n );\\n }\\n\\n\\n /*********************************\\n * Opcodes: Contract Code Access *\\n *********************************/\\n\\n /**\\n * @notice Overrides EXTCODECOPY.\\n * @param _contract Address of the contract to copy code from.\\n * @param _offset Offset in bytes from the start of contract code to copy beyond.\\n * @param _length Total number of bytes to copy from the contract's code.\\n * @return _code Bytes of code copied from the requested contract.\\n */\\n function ovmEXTCODECOPY(\\n address _contract,\\n uint256 _offset,\\n uint256 _length\\n )\\n override\\n public\\n returns (\\n bytes memory _code\\n )\\n {\\n // `ovmEXTCODECOPY` is the only overridden opcode capable of producing exactly one byte of\\n // return data. By blocking reads of one byte, we're able to use the condition that an\\n // OVM_ExecutionManager function return value having a length of exactly one byte indicates\\n // an error without an explicit revert. If users were able to read a single byte, they\\n // could forcibly trigger behavior that should only be available to this contract.\\n uint256 length = _length == 1 ? 2 : _length;\\n\\n return Lib_EthUtils.getCode(\\n _getAccountEthAddress(_contract),\\n _offset,\\n length\\n );\\n }\\n\\n /**\\n * @notice Overrides EXTCODESIZE.\\n * @param _contract Address of the contract to query the size of.\\n * @return _EXTCODESIZE Size of the requested contract in bytes.\\n */\\n function ovmEXTCODESIZE(\\n address _contract\\n )\\n override\\n public\\n returns (\\n uint256 _EXTCODESIZE\\n )\\n {\\n return Lib_EthUtils.getCodeSize(\\n _getAccountEthAddress(_contract)\\n );\\n }\\n\\n /**\\n * @notice Overrides EXTCODEHASH.\\n * @param _contract Address of the contract to query the hash of.\\n * @return _EXTCODEHASH Hash of the requested contract.\\n */\\n function ovmEXTCODEHASH(\\n address _contract\\n )\\n override\\n public\\n returns (\\n bytes32 _EXTCODEHASH\\n )\\n {\\n return Lib_EthUtils.getCodeHash(\\n _getAccountEthAddress(_contract)\\n );\\n }\\n\\n\\n /**************************************\\n * Public Functions: Execution Safety *\\n **************************************/\\n\\n /**\\n * Performs the logic to create a contract and revert under various potential conditions.\\n * @dev This function is implemented as `public` because we need to be able to revert a\\n * contract creation without losing information about exactly *why* the contract reverted.\\n * In particular, we want to be sure that contracts cannot trigger an INVALID_STATE_ACCESS\\n * flag and then revert to reset the flag. We're able to do this by making an external\\n * call from `ovmCREATE` and `ovmCREATE2` to `safeCREATE`, which can capture and relay\\n * information before reverting.\\n * @param _address Address of the contract to associate with the one being created.\\n * @param _bytecode Code to be used to create the new contract.\\n */\\n function safeCREATE(\\n address _address,\\n bytes memory _bytecode\\n )\\n override\\n public\\n {\\n // Since this function is public, anyone can attempt to directly call it. We need to make\\n // sure that the OVM_ExecutionManager itself is the only party that can actually try to\\n // call this function.\\n if (msg.sender != address(this)) {\\n return;\\n }\\n\\n // We need to be sure that the user isn't trying to use a contract creation to overwrite\\n // some existing contract. On L1, users will prove that no contract exists at the address\\n // and the OVM_FraudVerifier will populate the code hash of this address with a special\\n // value that represents \\\"known to be an empty account.\\\"\\n if (_hasEmptyAccount(_address) == false) {\\n _revertWithFlag(RevertFlag.CREATE_COLLISION);\\n }\\n\\n // Check the creation bytecode against the OVM_SafetyChecker.\\n if (ovmSafetyChecker.isBytecodeSafe(_bytecode) == false) {\\n _revertWithFlag(RevertFlag.UNSAFE_BYTECODE);\\n }\\n\\n // We always need to initialize the contract with the default account values.\\n _initPendingAccount(_address);\\n\\n // Actually deploy the contract and retrieve its address. This step is hiding a lot of\\n // complexity because we need to ensure that contract creation *never* reverts by itself.\\n // We cover this partially by storing a revert flag and returning (instead of reverting)\\n // when we know that we're inside a contract's creation code.\\n address ethAddress = Lib_EthUtils.createContract(_bytecode);\\n\\n // Contract creation returns the zero address when it fails, which should only be possible\\n // if the user intentionally runs out of gas. However, we might still have a bit of gas\\n // left over since contract calls can only be passed 63/64ths of total gas, so we need to\\n // explicitly handle this case here.\\n if (ethAddress == address(0)) {\\n _revertWithFlag(RevertFlag.CREATE_EXCEPTION);\\n }\\n\\n // Here we pull out the revert flag that would've been set during creation code. Now that\\n // we're out of creation code again, we can just revert normally while passing the flag\\n // through the revert data.\\n if (messageRecord.revertFlag != RevertFlag.DID_NOT_REVERT) {\\n _revertWithFlag(messageRecord.revertFlag);\\n }\\n\\n // Again simply checking that the deployed code is safe too. Contracts can generate\\n // arbitrary deployment code, so there's no easy way to analyze this beforehand.\\n bytes memory deployedCode = Lib_EthUtils.getCode(ethAddress);\\n if (ovmSafetyChecker.isBytecodeSafe(deployedCode) == false) {\\n _revertWithFlag(RevertFlag.UNSAFE_BYTECODE);\\n }\\n\\n // Contract creation didn't need to be reverted and the bytecode is safe. We finish up by\\n // associating the desired address with the newly created contract's code hash and address.\\n _commitPendingAccount(\\n _address,\\n ethAddress,\\n Lib_EthUtils.getCodeHash(ethAddress)\\n );\\n }\\n\\n\\n /***************************************\\n * Public Functions: Execution Context *\\n ***************************************/\\n\\n function getMaxTransactionGasLimit()\\n external\\n view\\n override\\n returns (\\n uint256 _maxTransactionGasLimit\\n )\\n {\\n return gasMeterConfig.maxTransactionGasLimit;\\n }\\n\\n /********************************************\\n * Public Functions: Deployment Witelisting *\\n ********************************************/\\n\\n /**\\n * Checks whether the given address is on the whitelst to ovmCREATE/ovmCREATE2, and reverts if not.\\n * @param _deployerAddress Address attempting to deploy a contract.\\n */\\n function _checkDeployerAllowed(\\n address _deployerAddress\\n )\\n internal\\n {\\n // From an OVM semanitcs perspectibe, this will appear the identical to\\n // the deployer ovmCALLing the whitelist. This is fine--in a sense, we are forcing them to.\\n (bool success, bytes memory data) = ovmCALL(\\n gasleft(),\\n 0x4200000000000000000000000000000000000002,\\n abi.encodeWithSignature(\\\"isDeployerAllowed(address)\\\", _deployerAddress)\\n );\\n bool isAllowed = abi.decode(data, (bool));\\n\\n if (!isAllowed || !success) {\\n _revertWithFlag(RevertFlag.CREATOR_NOT_ALLOWED);\\n } \\n }\\n\\n /********************************************\\n * Internal Functions: Contract Interaction *\\n ********************************************/\\n\\n /**\\n * Creates a new contract and associates it with some contract address.\\n * @param _contractAddress Address to associate the created contract with.\\n * @param _bytecode Bytecode to be used to create the contract.\\n * @return _created Final OVM contract address.\\n */\\n function _createContract(\\n address _contractAddress,\\n bytes memory _bytecode\\n )\\n internal\\n returns (\\n address _created\\n )\\n {\\n // We always update the nonce of the creating account, even if the creation fails.\\n _setAccountNonce(ovmADDRESS(), _getAccountNonce(ovmADDRESS()) + 1);\\n\\n // We're stepping into a CREATE or CREATE2, so we need to update ADDRESS to point\\n // to the contract's associated address and CALLER to point to the previous ADDRESS.\\n MessageContext memory nextMessageContext = messageContext;\\n nextMessageContext.ovmCALLER = messageContext.ovmADDRESS;\\n nextMessageContext.ovmADDRESS = _contractAddress;\\n\\n // Run `safeCREATE` in a new EVM message so that our changes can be reflected even if\\n // `safeCREATE` reverts.\\n (bool _success, ) = _handleExternalInteraction(\\n nextMessageContext,\\n gasleft(),\\n address(this),\\n abi.encodeWithSignature(\\n \\\"safeCREATE(address,bytes)\\\",\\n _contractAddress,\\n _bytecode\\n )\\n );\\n\\n // Need to make sure that this flag is reset so that it isn't propagated to creations in\\n // some parent EVM message.\\n messageRecord.revertFlag = RevertFlag.DID_NOT_REVERT;\\n\\n // Yellow paper requires that address returned is zero if the contract deployment fails.\\n return _success ? _contractAddress : address(0);\\n }\\n\\n /**\\n * Calls the deployed contract associated with a given address.\\n * @param _nextMessageContext Message context to be used for the call.\\n * @param _gasLimit Amount of gas to be passed into this call.\\n * @param _contract OVM address to be called.\\n * @param _calldata Data to send along with the call.\\n * @return _success Whether or not the call returned (rather than reverted).\\n * @return _returndata Data returned by the call.\\n */\\n function _callContract(\\n MessageContext memory _nextMessageContext,\\n uint256 _gasLimit,\\n address _contract,\\n bytes memory _calldata\\n )\\n internal\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n // We reserve addresses of the form 0xdeaddeaddead...NNNN for the container contracts in L2 geth.\\n // So, we block calls to these addresses since they are not safe to run as an OVM contract itself.\\n if (\\n (uint256(_contract) & uint256(0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000)) \\n == uint256(0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000)\\n ) {\\n return (true, hex'');\\n }\\n\\n // Both 0x0000... and the EVM precompiles have the same address on L1 and L2 --> no trie lookup needed.\\n address codeContractAddress =\\n uint(_contract) < 100\\n ? _contract\\n : _getAccountEthAddress(_contract);\\n\\n return _handleExternalInteraction(\\n _nextMessageContext,\\n _gasLimit,\\n codeContractAddress,\\n _calldata\\n );\\n }\\n\\n /**\\n * Handles the logic of making an external call and parsing revert information.\\n * @param _nextMessageContext Message context to be used for the call.\\n * @param _gasLimit Amount of gas to be passed into this call.\\n * @param _target Address of the contract to call.\\n * @param _data Data to send along with the call.\\n * @return _success Whether or not the call returned (rather than reverted).\\n * @return _returndata Data returned by the call.\\n */\\n function _handleExternalInteraction(\\n MessageContext memory _nextMessageContext,\\n uint256 _gasLimit,\\n address _target,\\n bytes memory _data\\n )\\n internal\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n // We need to switch over to our next message context for the duration of this call.\\n MessageContext memory prevMessageContext = messageContext;\\n _switchMessageContext(prevMessageContext, _nextMessageContext);\\n\\n // Nuisance gas is a system used to bound the ability for an attacker to make fraud proofs\\n // expensive by touching a lot of different accounts or storage slots. Since most contracts\\n // only use a few storage slots during any given transaction, this shouldn't be a limiting\\n // factor.\\n uint256 prevNuisanceGasLeft = messageRecord.nuisanceGasLeft;\\n uint256 nuisanceGasLimit = _getNuisanceGasLimit(_gasLimit);\\n messageRecord.nuisanceGasLeft = nuisanceGasLimit;\\n\\n // Make the call and make sure to pass in the gas limit. Another instance of hidden\\n // complexity. `_target` is guaranteed to be a safe contract, meaning its return/revert\\n // behavior can be controlled. In particular, we enforce that flags are passed through\\n // revert data as to retrieve execution metadata that would normally be reverted out of\\n // existence.\\n (bool success, bytes memory returndata) = _target.call{gas: _gasLimit}(_data);\\n\\n // Switch back to the original message context now that we're out of the call.\\n _switchMessageContext(_nextMessageContext, prevMessageContext);\\n\\n // Assuming there were no reverts, the message record should be accurate here. We'll update\\n // this value in the case of a revert.\\n uint256 nuisanceGasLeft = messageRecord.nuisanceGasLeft;\\n\\n // Reverts at this point are completely OK, but we need to make a few updates based on the\\n // information passed through the revert.\\n if (success == false) {\\n (\\n RevertFlag flag,\\n uint256 nuisanceGasLeftPostRevert,\\n uint256 ovmGasRefund,\\n bytes memory returndataFromFlag\\n ) = _decodeRevertData(returndata);\\n\\n // INVALID_STATE_ACCESS is the only flag that triggers an immediate abort of the\\n // parent EVM message. This behavior is necessary because INVALID_STATE_ACCESS must\\n // halt any further transaction execution that could impact the execution result.\\n if (flag == RevertFlag.INVALID_STATE_ACCESS) {\\n _revertWithFlag(flag);\\n }\\n\\n // INTENTIONAL_REVERT, UNSAFE_BYTECODE, STATIC_VIOLATION, and CREATOR_NOT_ALLOWED aren't \\n // dependent on the input state, so we can just handle them like standard reverts. Our only change here\\n // is to record the gas refund reported by the call (enforced by safety checking).\\n if (\\n flag == RevertFlag.INTENTIONAL_REVERT\\n || flag == RevertFlag.UNSAFE_BYTECODE\\n || flag == RevertFlag.STATIC_VIOLATION\\n || flag == RevertFlag.CREATOR_NOT_ALLOWED\\n ) {\\n transactionRecord.ovmGasRefund = ovmGasRefund;\\n }\\n\\n // INTENTIONAL_REVERT needs to pass up the user-provided return data encoded into the\\n // flag, *not* the full encoded flag. All other revert types return no data.\\n if (flag == RevertFlag.INTENTIONAL_REVERT) {\\n returndata = returndataFromFlag;\\n } else {\\n returndata = hex'';\\n }\\n\\n // Reverts mean we need to use up whatever \\\"nuisance gas\\\" was used by the call.\\n // EXCEEDS_NUISANCE_GAS explicitly reduces the remaining nuisance gas for this message\\n // to zero. OUT_OF_GAS is a \\\"pseudo\\\" flag given that messages return no data when they\\n // run out of gas, so we have to treat this like EXCEEDS_NUISANCE_GAS. All other flags\\n // will simply pass up the remaining nuisance gas.\\n nuisanceGasLeft = nuisanceGasLeftPostRevert;\\n }\\n\\n // We need to reset the nuisance gas back to its original value minus the amount used here.\\n messageRecord.nuisanceGasLeft = prevNuisanceGasLeft - (nuisanceGasLimit - nuisanceGasLeft);\\n\\n return (\\n success,\\n returndata\\n );\\n }\\n\\n\\n /******************************************\\n * Internal Functions: State Manipulation *\\n ******************************************/\\n\\n /**\\n * Checks whether an account exists within the OVM_StateManager.\\n * @param _address Address of the account to check.\\n * @return _exists Whether or not the account exists.\\n */\\n function _hasAccount(\\n address _address\\n )\\n internal\\n returns (\\n bool _exists\\n )\\n {\\n _checkAccountLoad(_address);\\n return ovmStateManager.hasAccount(_address);\\n }\\n\\n /**\\n * Checks whether a known empty account exists within the OVM_StateManager.\\n * @param _address Address of the account to check.\\n * @return _exists Whether or not the account empty exists.\\n */\\n function _hasEmptyAccount(\\n address _address\\n )\\n internal\\n returns (\\n bool _exists\\n )\\n {\\n _checkAccountLoad(_address);\\n return ovmStateManager.hasEmptyAccount(_address);\\n }\\n\\n /**\\n * Sets the nonce of an account.\\n * @param _address Address of the account to modify.\\n * @param _nonce New account nonce.\\n */\\n function _setAccountNonce(\\n address _address,\\n uint256 _nonce\\n )\\n internal\\n {\\n _checkAccountChange(_address);\\n ovmStateManager.setAccountNonce(_address, _nonce);\\n }\\n\\n /**\\n * Gets the nonce of an account.\\n * @param _address Address of the account to access.\\n * @return _nonce Nonce of the account.\\n */\\n function _getAccountNonce(\\n address _address\\n )\\n internal\\n returns (\\n uint256 _nonce\\n )\\n {\\n _checkAccountLoad(_address);\\n return ovmStateManager.getAccountNonce(_address);\\n }\\n\\n /**\\n * Retrieves the Ethereum address of an account.\\n * @param _address Address of the account to access.\\n * @return _ethAddress Corresponding Ethereum address.\\n */\\n function _getAccountEthAddress(\\n address _address\\n )\\n internal\\n returns (\\n address _ethAddress\\n )\\n {\\n _checkAccountLoad(_address);\\n return ovmStateManager.getAccountEthAddress(_address);\\n }\\n\\n /**\\n * Creates the default account object for the given address.\\n * @param _address Address of the account create.\\n */\\n function _initPendingAccount(\\n address _address\\n )\\n internal\\n {\\n // Although it seems like `_checkAccountChange` would be more appropriate here, we don't\\n // actually consider an account \\\"changed\\\" until it's inserted into the state (in this case\\n // by `_commitPendingAccount`).\\n _checkAccountLoad(_address);\\n ovmStateManager.initPendingAccount(_address);\\n }\\n\\n /**\\n * Stores additional relevant data for a new account, thereby \\\"committing\\\" it to the state.\\n * This function is only called during `ovmCREATE` and `ovmCREATE2` after a successful contract\\n * creation.\\n * @param _address Address of the account to commit.\\n * @param _ethAddress Address of the associated deployed contract.\\n * @param _codeHash Hash of the code stored at the address.\\n */\\n function _commitPendingAccount(\\n address _address,\\n address _ethAddress,\\n bytes32 _codeHash\\n )\\n internal\\n {\\n _checkAccountChange(_address);\\n ovmStateManager.commitPendingAccount(\\n _address,\\n _ethAddress,\\n _codeHash\\n );\\n }\\n\\n /**\\n * Retrieves the value of a storage slot.\\n * @param _contract Address of the contract to query.\\n * @param _key 32 byte key of the storage slot.\\n * @return _value 32 byte storage slot value.\\n */\\n function _getContractStorage(\\n address _contract,\\n bytes32 _key\\n )\\n internal\\n returns (\\n bytes32 _value\\n )\\n {\\n _checkContractStorageLoad(_contract, _key);\\n return ovmStateManager.getContractStorage(_contract, _key);\\n }\\n\\n /**\\n * Sets the value of a storage slot.\\n * @param _contract Address of the contract to modify.\\n * @param _key 32 byte key of the storage slot.\\n * @param _value 32 byte storage slot value.\\n */\\n function _putContractStorage(\\n address _contract,\\n bytes32 _key,\\n bytes32 _value\\n )\\n internal\\n {\\n // We don't set storage if the value didn't change. Although this acts as a convenient\\n // optimization, it's also necessary to avoid the case in which a contract with no storage\\n // attempts to store the value \\\"0\\\" at any key. Putting this value (and therefore requiring\\n // that the value be committed into the storage trie after execution) would incorrectly\\n // modify the storage root.\\n if (_getContractStorage(_contract, _key) == _value) {\\n return;\\n }\\n\\n _checkContractStorageChange(_contract, _key);\\n ovmStateManager.putContractStorage(_contract, _key, _value);\\n }\\n\\n /**\\n * Validation whenever a contract needs to be loaded. Checks that the account exists, charges\\n * nuisance gas if the account hasn't been loaded before.\\n * @param _address Address of the account to load.\\n */\\n function _checkAccountLoad(\\n address _address\\n )\\n internal\\n {\\n // See `_checkContractStorageLoad` for more information.\\n if (gasleft() < MIN_GAS_FOR_INVALID_STATE_ACCESS) {\\n _revertWithFlag(RevertFlag.OUT_OF_GAS);\\n }\\n\\n // See `_checkContractStorageLoad` for more information.\\n if (ovmStateManager.hasAccount(_address) == false) {\\n _revertWithFlag(RevertFlag.INVALID_STATE_ACCESS);\\n }\\n\\n // Check whether the account has been loaded before and mark it as loaded if not. We need\\n // this because \\\"nuisance gas\\\" only applies to the first time that an account is loaded.\\n (\\n bool _wasAccountAlreadyLoaded\\n ) = ovmStateManager.testAndSetAccountLoaded(_address);\\n\\n // If we hadn't already loaded the account, then we'll need to charge \\\"nuisance gas\\\" based\\n // on the size of the contract code.\\n if (_wasAccountAlreadyLoaded == false) {\\n _useNuisanceGas(\\n (Lib_EthUtils.getCodeSize(_getAccountEthAddress(_address)) * NUISANCE_GAS_PER_CONTRACT_BYTE) + MIN_NUISANCE_GAS_PER_CONTRACT\\n );\\n }\\n }\\n\\n /**\\n * Validation whenever a contract needs to be changed. Checks that the account exists, charges\\n * nuisance gas if the account hasn't been changed before.\\n * @param _address Address of the account to change.\\n */\\n function _checkAccountChange(\\n address _address\\n )\\n internal\\n {\\n // Start by checking for a load as we only want to charge nuisance gas proportional to\\n // contract size once.\\n _checkAccountLoad(_address);\\n\\n // Check whether the account has been changed before and mark it as changed if not. We need\\n // this because \\\"nuisance gas\\\" only applies to the first time that an account is changed.\\n (\\n bool _wasAccountAlreadyChanged\\n ) = ovmStateManager.testAndSetAccountChanged(_address);\\n\\n // If we hadn't already loaded the account, then we'll need to charge \\\"nuisance gas\\\" based\\n // on the size of the contract code.\\n if (_wasAccountAlreadyChanged == false) {\\n ovmStateManager.incrementTotalUncommittedAccounts();\\n _useNuisanceGas(\\n (Lib_EthUtils.getCodeSize(_getAccountEthAddress(_address)) * NUISANCE_GAS_PER_CONTRACT_BYTE) + MIN_NUISANCE_GAS_PER_CONTRACT\\n );\\n }\\n }\\n\\n /**\\n * Validation whenever a slot needs to be loaded. Checks that the account exists, charges\\n * nuisance gas if the slot hasn't been loaded before.\\n * @param _contract Address of the account to load from.\\n * @param _key 32 byte key to load.\\n */\\n function _checkContractStorageLoad(\\n address _contract,\\n bytes32 _key\\n )\\n internal\\n {\\n // Another case of hidden complexity. If we didn't enforce this requirement, then a\\n // contract could pass in just enough gas to cause the INVALID_STATE_ACCESS check to fail\\n // on L1 but not on L2. A contract could use this behavior to prevent the\\n // OVM_ExecutionManager from detecting an invalid state access. Reverting with OUT_OF_GAS\\n // allows us to also charge for the full message nuisance gas, because you deserve that for\\n // trying to break the contract in this way.\\n if (gasleft() < MIN_GAS_FOR_INVALID_STATE_ACCESS) {\\n _revertWithFlag(RevertFlag.OUT_OF_GAS);\\n }\\n\\n // We need to make sure that the transaction isn't trying to access storage that hasn't\\n // been provided to the OVM_StateManager. We'll immediately abort if this is the case.\\n // We know that we have enough gas to do this check because of the above test.\\n if (ovmStateManager.hasContractStorage(_contract, _key) == false) {\\n _revertWithFlag(RevertFlag.INVALID_STATE_ACCESS);\\n }\\n\\n // Check whether the slot has been loaded before and mark it as loaded if not. We need\\n // this because \\\"nuisance gas\\\" only applies to the first time that a slot is loaded.\\n (\\n bool _wasContractStorageAlreadyLoaded\\n ) = ovmStateManager.testAndSetContractStorageLoaded(_contract, _key);\\n\\n // If we hadn't already loaded the account, then we'll need to charge some fixed amount of\\n // \\\"nuisance gas\\\".\\n if (_wasContractStorageAlreadyLoaded == false) {\\n _useNuisanceGas(NUISANCE_GAS_SLOAD);\\n }\\n }\\n\\n /**\\n * Validation whenever a slot needs to be changed. Checks that the account exists, charges\\n * nuisance gas if the slot hasn't been changed before.\\n * @param _contract Address of the account to change.\\n * @param _key 32 byte key to change.\\n */\\n function _checkContractStorageChange(\\n address _contract,\\n bytes32 _key\\n )\\n internal\\n {\\n // Start by checking for load to make sure we have the storage slot and that we charge the\\n // \\\"nuisance gas\\\" necessary to prove the storage slot state.\\n _checkContractStorageLoad(_contract, _key);\\n\\n // Check whether the slot has been changed before and mark it as changed if not. We need\\n // this because \\\"nuisance gas\\\" only applies to the first time that a slot is changed.\\n (\\n bool _wasContractStorageAlreadyChanged\\n ) = ovmStateManager.testAndSetContractStorageChanged(_contract, _key);\\n\\n // If we hadn't already changed the account, then we'll need to charge some fixed amount of\\n // \\\"nuisance gas\\\".\\n if (_wasContractStorageAlreadyChanged == false) {\\n // Changing a storage slot means that we're also going to have to change the\\n // corresponding account, so do an account change check.\\n _checkAccountChange(_contract);\\n\\n ovmStateManager.incrementTotalUncommittedContractStorage();\\n _useNuisanceGas(NUISANCE_GAS_SSTORE);\\n }\\n }\\n\\n\\n /************************************\\n * Internal Functions: Revert Logic *\\n ************************************/\\n\\n /**\\n * Simple encoding for revert data.\\n * @param _flag Flag to revert with.\\n * @param _data Additional user-provided revert data.\\n * @return _revertdata Encoded revert data.\\n */\\n function _encodeRevertData(\\n RevertFlag _flag,\\n bytes memory _data\\n )\\n internal\\n view\\n returns (\\n bytes memory _revertdata\\n )\\n {\\n // Out of gas and create exceptions will fundamentally return no data, so simulating it shouldn't either.\\n if (\\n _flag == RevertFlag.OUT_OF_GAS\\n || _flag == RevertFlag.CREATE_EXCEPTION\\n ) {\\n return bytes('');\\n }\\n\\n // INVALID_STATE_ACCESS doesn't need to return any data other than the flag.\\n if (_flag == RevertFlag.INVALID_STATE_ACCESS) {\\n return abi.encode(\\n _flag,\\n 0,\\n 0,\\n bytes('')\\n );\\n }\\n\\n // Just ABI encode the rest of the parameters.\\n return abi.encode(\\n _flag,\\n messageRecord.nuisanceGasLeft,\\n transactionRecord.ovmGasRefund,\\n _data\\n );\\n }\\n\\n /**\\n * Simple decoding for revert data.\\n * @param _revertdata Revert data to decode.\\n * @return _flag Flag used to revert.\\n * @return _nuisanceGasLeft Amount of nuisance gas unused by the message.\\n * @return _ovmGasRefund Amount of gas refunded during the message.\\n * @return _data Additional user-provided revert data.\\n */\\n function _decodeRevertData(\\n bytes memory _revertdata\\n )\\n internal\\n pure\\n returns (\\n RevertFlag _flag,\\n uint256 _nuisanceGasLeft,\\n uint256 _ovmGasRefund,\\n bytes memory _data\\n )\\n {\\n // A length of zero means the call ran out of gas, just return empty data.\\n if (_revertdata.length == 0) {\\n return (\\n RevertFlag.OUT_OF_GAS,\\n 0,\\n 0,\\n bytes('')\\n );\\n }\\n\\n // ABI decode the incoming data.\\n return abi.decode(_revertdata, (RevertFlag, uint256, uint256, bytes));\\n }\\n\\n /**\\n * Causes a message to revert or abort.\\n * @param _flag Flag to revert with.\\n * @param _data Additional user-provided data.\\n */\\n function _revertWithFlag(\\n RevertFlag _flag,\\n bytes memory _data\\n )\\n internal\\n {\\n // We don't want to revert when we're inside a CREATE or CREATE2, because those opcodes\\n // fail silently (we can't pass any data upwards). Instead, we set a flag and return a\\n // *single* byte, something the OVM_ExecutionManager will not return in any other case.\\n // We're thereby allowed to communicate failure without allowing contracts to trick us into\\n // thinking there was a failure.\\n bool isCreation;\\n assembly {\\n isCreation := eq(extcodesize(caller()), 0)\\n }\\n\\n if (isCreation) {\\n messageRecord.revertFlag = _flag;\\n\\n assembly {\\n return(0, 1)\\n }\\n }\\n\\n // If we're not inside a CREATE or CREATE2, we can simply encode the necessary data and\\n // revert normally.\\n bytes memory revertdata = _encodeRevertData(\\n _flag,\\n _data\\n );\\n\\n assembly {\\n revert(add(revertdata, 0x20), mload(revertdata))\\n }\\n }\\n\\n /**\\n * Causes a message to revert or abort.\\n * @param _flag Flag to revert with.\\n */\\n function _revertWithFlag(\\n RevertFlag _flag\\n )\\n internal\\n {\\n _revertWithFlag(_flag, bytes(''));\\n }\\n\\n\\n /******************************************\\n * Internal Functions: Nuisance Gas Logic *\\n ******************************************/\\n\\n /**\\n * Computes the nuisance gas limit from the gas limit.\\n * @dev This function is currently using a naive implementation whereby the nuisance gas limit\\n * is set to exactly equal the lesser of the gas limit or remaining gas. It's likely that\\n * this implementation is perfectly fine, but we may change this formula later.\\n * @param _gasLimit Gas limit to compute from.\\n * @return _nuisanceGasLimit Computed nuisance gas limit.\\n */\\n function _getNuisanceGasLimit(\\n uint256 _gasLimit\\n )\\n internal\\n view\\n returns (\\n uint256 _nuisanceGasLimit\\n )\\n {\\n return _gasLimit < gasleft() ? _gasLimit : gasleft();\\n }\\n\\n /**\\n * Uses a certain amount of nuisance gas.\\n * @param _amount Amount of nuisance gas to use.\\n */\\n function _useNuisanceGas(\\n uint256 _amount\\n )\\n internal\\n {\\n // Essentially the same as a standard OUT_OF_GAS, except we also retain a record of the gas\\n // refund to be given at the end of the transaction.\\n if (messageRecord.nuisanceGasLeft < _amount) {\\n _revertWithFlag(RevertFlag.EXCEEDS_NUISANCE_GAS);\\n }\\n\\n messageRecord.nuisanceGasLeft -= _amount;\\n }\\n\\n\\n /************************************\\n * Internal Functions: Gas Metering *\\n ************************************/\\n\\n /**\\n * Checks whether a transaction needs to start a new epoch and does so if necessary.\\n * @param _timestamp Transaction timestamp.\\n */\\n function _checkNeedsNewEpoch(\\n uint256 _timestamp\\n )\\n internal\\n {\\n if (\\n _timestamp >= (\\n _getGasMetadata(GasMetadataKey.CURRENT_EPOCH_START_TIMESTAMP)\\n + gasMeterConfig.secondsPerEpoch\\n )\\n ) {\\n _putGasMetadata(\\n GasMetadataKey.CURRENT_EPOCH_START_TIMESTAMP,\\n _timestamp\\n );\\n\\n _putGasMetadata(\\n GasMetadataKey.PREV_EPOCH_SEQUENCER_QUEUE_GAS,\\n _getGasMetadata(\\n GasMetadataKey.CUMULATIVE_SEQUENCER_QUEUE_GAS\\n )\\n );\\n\\n _putGasMetadata(\\n GasMetadataKey.PREV_EPOCH_L1TOL2_QUEUE_GAS,\\n _getGasMetadata(\\n GasMetadataKey.CUMULATIVE_L1TOL2_QUEUE_GAS\\n )\\n );\\n }\\n }\\n\\n /**\\n * Validates the gas limit for a given transaction.\\n * @param _gasLimit Gas limit provided by the transaction.\\n * @param _queueOrigin Queue from which the transaction originated.\\n * @return _valid Whether or not the gas limit is valid.\\n */\\n function _isValidGasLimit(\\n uint256 _gasLimit,\\n Lib_OVMCodec.QueueOrigin _queueOrigin\\n )\\n internal\\n returns (\\n bool _valid\\n )\\n {\\n // Always have to be below the maximum gas limit.\\n if (_gasLimit > gasMeterConfig.maxTransactionGasLimit) {\\n return false;\\n }\\n\\n // Always have to be above the minimum gas limit.\\n if (_gasLimit < gasMeterConfig.minTransactionGasLimit) {\\n return false;\\n }\\n\\n // TEMPORARY: Gas metering is disabled for minnet.\\n return true;\\n // GasMetadataKey cumulativeGasKey;\\n // GasMetadataKey prevEpochGasKey;\\n // if (_queueOrigin == Lib_OVMCodec.QueueOrigin.SEQUENCER_QUEUE) {\\n // cumulativeGasKey = GasMetadataKey.CUMULATIVE_SEQUENCER_QUEUE_GAS;\\n // prevEpochGasKey = GasMetadataKey.PREV_EPOCH_SEQUENCER_QUEUE_GAS;\\n // } else {\\n // cumulativeGasKey = GasMetadataKey.CUMULATIVE_L1TOL2_QUEUE_GAS;\\n // prevEpochGasKey = GasMetadataKey.PREV_EPOCH_L1TOL2_QUEUE_GAS;\\n // }\\n\\n // return (\\n // (\\n // _getGasMetadata(cumulativeGasKey)\\n // - _getGasMetadata(prevEpochGasKey)\\n // + _gasLimit\\n // ) < gasMeterConfig.maxGasPerQueuePerEpoch\\n // );\\n }\\n\\n /**\\n * Updates the cumulative gas after a transaction.\\n * @param _gasUsed Gas used by the transaction.\\n * @param _queueOrigin Queue from which the transaction originated.\\n */\\n function _updateCumulativeGas(\\n uint256 _gasUsed,\\n Lib_OVMCodec.QueueOrigin _queueOrigin\\n )\\n internal\\n {\\n GasMetadataKey cumulativeGasKey;\\n if (_queueOrigin == Lib_OVMCodec.QueueOrigin.SEQUENCER_QUEUE) {\\n cumulativeGasKey = GasMetadataKey.CUMULATIVE_SEQUENCER_QUEUE_GAS;\\n } else {\\n cumulativeGasKey = GasMetadataKey.CUMULATIVE_L1TOL2_QUEUE_GAS;\\n }\\n\\n _putGasMetadata(\\n cumulativeGasKey,\\n (\\n _getGasMetadata(cumulativeGasKey)\\n + gasMeterConfig.minTransactionGasLimit\\n + _gasUsed\\n - transactionRecord.ovmGasRefund\\n )\\n );\\n }\\n\\n /**\\n * Retrieves the value of a gas metadata key.\\n * @param _key Gas metadata key to retrieve.\\n * @return _value Value stored at the given key.\\n */\\n function _getGasMetadata(\\n GasMetadataKey _key\\n )\\n internal\\n returns (\\n uint256 _value\\n )\\n {\\n return uint256(_getContractStorage(\\n GAS_METADATA_ADDRESS,\\n bytes32(uint256(_key))\\n ));\\n }\\n\\n /**\\n * Sets the value of a gas metadata key.\\n * @param _key Gas metadata key to set.\\n * @param _value Value to store at the given key.\\n */\\n function _putGasMetadata(\\n GasMetadataKey _key,\\n uint256 _value\\n )\\n internal\\n {\\n _putContractStorage(\\n GAS_METADATA_ADDRESS,\\n bytes32(uint256(_key)),\\n bytes32(uint256(_value))\\n );\\n }\\n\\n\\n /*****************************************\\n * Internal Functions: Execution Context *\\n *****************************************/\\n\\n /**\\n * Swaps over to a new message context.\\n * @param _prevMessageContext Context we're switching from.\\n * @param _nextMessageContext Context we're switching to.\\n */\\n function _switchMessageContext(\\n MessageContext memory _prevMessageContext,\\n MessageContext memory _nextMessageContext\\n )\\n internal\\n {\\n // Avoid unnecessary the SSTORE.\\n if (_prevMessageContext.ovmCALLER != _nextMessageContext.ovmCALLER) {\\n messageContext.ovmCALLER = _nextMessageContext.ovmCALLER;\\n }\\n\\n // Avoid unnecessary the SSTORE.\\n if (_prevMessageContext.ovmADDRESS != _nextMessageContext.ovmADDRESS) {\\n messageContext.ovmADDRESS = _nextMessageContext.ovmADDRESS;\\n }\\n\\n // Avoid unnecessary the SSTORE.\\n if (_prevMessageContext.isStatic != _nextMessageContext.isStatic) {\\n messageContext.isStatic = _nextMessageContext.isStatic;\\n }\\n }\\n\\n /**\\n * Initializes the execution context.\\n * @param _transaction OVM transaction being executed.\\n */\\n function _initContext(\\n Lib_OVMCodec.Transaction memory _transaction\\n )\\n internal\\n {\\n transactionContext.ovmTIMESTAMP = _transaction.timestamp;\\n transactionContext.ovmNUMBER = _transaction.blockNumber;\\n transactionContext.ovmTXGASLIMIT = _transaction.gasLimit;\\n transactionContext.ovmL1QUEUEORIGIN = _transaction.l1QueueOrigin;\\n transactionContext.ovmL1TXORIGIN = _transaction.l1TxOrigin;\\n transactionContext.ovmGASLIMIT = gasMeterConfig.maxGasPerQueuePerEpoch;\\n\\n messageRecord.nuisanceGasLeft = _getNuisanceGasLimit(_transaction.gasLimit);\\n }\\n\\n /**\\n * Resets the transaction and message context.\\n */\\n function _resetContext()\\n internal\\n {\\n transactionContext.ovmL1TXORIGIN = address(0);\\n transactionContext.ovmTIMESTAMP = 0;\\n transactionContext.ovmNUMBER = 0;\\n transactionContext.ovmGASLIMIT = 0;\\n transactionContext.ovmTXGASLIMIT = 0;\\n transactionContext.ovmL1QUEUEORIGIN = Lib_OVMCodec.QueueOrigin.SEQUENCER_QUEUE;\\n\\n transactionRecord.ovmGasRefund = 0;\\n\\n messageContext.ovmCALLER = address(0);\\n messageContext.ovmADDRESS = address(0);\\n messageContext.isStatic = false;\\n\\n messageRecord.nuisanceGasLeft = 0;\\n messageRecord.revertFlag = RevertFlag.DID_NOT_REVERT;\\n }\\n}\\n\",\"keccak256\":\"0x691ade8b4e9ffe94822f300b00add6d709138dfbd31592c90c12db5512bf765c\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/precompiles/OVM_DeployerWhitelist.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.7.0;\\n\\n/* Library Imports */\\nimport { Lib_Bytes32Utils } from \\\"../../libraries/utils/Lib_Bytes32Utils.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_DeployerWhitelist } from \\\"../../iOVM/precompiles/iOVM_DeployerWhitelist.sol\\\";\\nimport { Lib_SafeExecutionManagerWrapper } from \\\"../../libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\\\";\\n\\n/**\\n * @title OVM_DeployerWhitelist\\n * @dev L2 CONTRACT (NOT COMPILED)\\n */\\ncontract OVM_DeployerWhitelist is iOVM_DeployerWhitelist {\\n\\n /**********************\\n * Contract Constants *\\n **********************/\\n\\n bytes32 internal constant KEY_INITIALIZED = 0x0000000000000000000000000000000000000000000000000000000000000010;\\n bytes32 internal constant KEY_OWNER = 0x0000000000000000000000000000000000000000000000000000000000000011;\\n bytes32 internal constant KEY_ALLOW_ARBITRARY_DEPLOYMENT = 0x0000000000000000000000000000000000000000000000000000000000000012;\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n \\n /**\\n * Blocks functions to anyone except the contract owner.\\n */\\n modifier onlyOwner() {\\n address owner = Lib_Bytes32Utils.toAddress(\\n Lib_SafeExecutionManagerWrapper.safeSLOAD(\\n KEY_OWNER\\n )\\n );\\n\\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(\\n Lib_SafeExecutionManagerWrapper.safeCALLER() == owner,\\n \\\"Function can only be called by the owner of this contract.\\\"\\n );\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n \\n /**\\n * Initializes the whitelist.\\n * @param _owner Address of the owner for this contract.\\n * @param _allowArbitraryDeployment Whether or not to allow arbitrary contract deployment.\\n */\\n function initialize(\\n address _owner,\\n bool _allowArbitraryDeployment\\n )\\n override\\n public\\n {\\n bool initialized = Lib_Bytes32Utils.toBool(\\n Lib_SafeExecutionManagerWrapper.safeSLOAD(KEY_INITIALIZED)\\n );\\n\\n if (initialized == true) {\\n return;\\n }\\n\\n Lib_SafeExecutionManagerWrapper.safeSSTORE(\\n KEY_INITIALIZED,\\n Lib_Bytes32Utils.fromBool(true)\\n );\\n Lib_SafeExecutionManagerWrapper.safeSSTORE(\\n KEY_OWNER,\\n Lib_Bytes32Utils.fromAddress(_owner)\\n );\\n Lib_SafeExecutionManagerWrapper.safeSSTORE(\\n KEY_ALLOW_ARBITRARY_DEPLOYMENT,\\n Lib_Bytes32Utils.fromBool(_allowArbitraryDeployment)\\n );\\n }\\n\\n /**\\n * Gets the owner of the whitelist.\\n */\\n function getOwner()\\n override\\n public\\n returns(\\n address\\n )\\n {\\n return Lib_Bytes32Utils.toAddress(\\n Lib_SafeExecutionManagerWrapper.safeSLOAD(\\n KEY_OWNER\\n )\\n );\\n }\\n\\n /**\\n * Adds or removes an address from the deployment whitelist.\\n * @param _deployer Address to update permissions for.\\n * @param _isWhitelisted Whether or not the address is whitelisted.\\n */\\n function setWhitelistedDeployer(\\n address _deployer,\\n bool _isWhitelisted\\n )\\n override\\n public\\n onlyOwner\\n {\\n Lib_SafeExecutionManagerWrapper.safeSSTORE(\\n Lib_Bytes32Utils.fromAddress(_deployer),\\n Lib_Bytes32Utils.fromBool(_isWhitelisted)\\n );\\n }\\n\\n /**\\n * Updates the owner of this contract.\\n * @param _owner Address of the new owner.\\n */\\n function setOwner(\\n address _owner\\n )\\n override\\n public\\n onlyOwner\\n {\\n Lib_SafeExecutionManagerWrapper.safeSSTORE(\\n KEY_OWNER,\\n Lib_Bytes32Utils.fromAddress(_owner)\\n );\\n }\\n\\n /**\\n * Updates the arbitrary deployment flag.\\n * @param _allowArbitraryDeployment Whether or not to allow arbitrary contract deployment.\\n */\\n function setAllowArbitraryDeployment(\\n bool _allowArbitraryDeployment\\n )\\n override\\n public\\n onlyOwner\\n {\\n Lib_SafeExecutionManagerWrapper.safeSSTORE(\\n KEY_ALLOW_ARBITRARY_DEPLOYMENT,\\n Lib_Bytes32Utils.fromBool(_allowArbitraryDeployment)\\n );\\n }\\n\\n /**\\n * Permanently enables arbitrary contract deployment and deletes the owner.\\n */\\n function enableArbitraryContractDeployment()\\n override\\n public\\n onlyOwner\\n {\\n setAllowArbitraryDeployment(true);\\n setOwner(address(0));\\n }\\n\\n /**\\n * Checks whether an address is allowed to deploy contracts.\\n * @param _deployer Address to check.\\n * @return _allowed Whether or not the address can deploy contracts.\\n */\\n function isDeployerAllowed(\\n address _deployer\\n )\\n override\\n public\\n returns (\\n bool _allowed\\n )\\n {\\n bool initialized = Lib_Bytes32Utils.toBool(\\n Lib_SafeExecutionManagerWrapper.safeSLOAD(KEY_INITIALIZED)\\n );\\n\\n if (initialized == false) {\\n return true;\\n }\\n\\n bool allowArbitraryDeployment = Lib_Bytes32Utils.toBool(\\n Lib_SafeExecutionManagerWrapper.safeSLOAD(KEY_ALLOW_ARBITRARY_DEPLOYMENT)\\n );\\n\\n if (allowArbitraryDeployment == true) {\\n return true;\\n }\\n\\n bool isWhitelisted = Lib_Bytes32Utils.toBool(\\n Lib_SafeExecutionManagerWrapper.safeSLOAD(\\n Lib_Bytes32Utils.fromAddress(_deployer)\\n )\\n );\\n\\n return isWhitelisted; \\n }\\n}\\n\",\"keccak256\":\"0x195ec68e19525110c89103602735662d3a534a559b5e4925a8cd4c2480825689\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/accounts/iOVM_ECDSAContractAccount.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title iOVM_ECDSAContractAccount\\n */\\ninterface iOVM_ECDSAContractAccount {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function execute(\\n bytes memory _transaction,\\n Lib_OVMCodec.EOASignatureType _signatureType,\\n uint8 _v,\\n bytes32 _r,\\n bytes32 _s\\n ) external returns (bool _success, bytes memory _returndata);\\n}\\n\",\"keccak256\":\"0x308729bc62dcffb11ff1d840781105cf1bf0dd4cbcfb1af704b800bb0cfe9b85\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_CanonicalTransactionChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title iOVM_CanonicalTransactionChain\\n */\\ninterface iOVM_CanonicalTransactionChain {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event TransactionEnqueued(\\n address _l1TxOrigin,\\n address _target,\\n uint256 _gasLimit,\\n bytes _data,\\n uint256 _queueIndex,\\n uint256 _timestamp\\n );\\n\\n event QueueBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event SequencerBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event TransactionBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct BatchContext {\\n uint256 numSequencedTransactions;\\n uint256 numSubsequentQueueTransactions;\\n uint256 timestamp;\\n uint256 blockNumber;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements()\\n external\\n view\\n returns (\\n uint256 _totalElements\\n );\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches()\\n external\\n view\\n returns (\\n uint256 _totalBatches\\n );\\n\\n /**\\n * Returns the index of the next element to be enqueued.\\n * @return Index for the next queue element.\\n */\\n function getNextQueueIndex()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Get the number of queue elements which have not yet been included.\\n * @return Length of the queue.\\n */\\n function getNumPendingQueueElements()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Retrieves the length of the queue, including\\n * both pending and canonical transactions.\\n * @return Length of the queue.\\n */\\n function getQueueLength()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Gets the queue element at a particular index.\\n * @param _index Index of the queue element to access.\\n * @return _element Queue element at the given index.\\n */\\n function getQueueElement(\\n uint256 _index\\n )\\n external\\n view\\n returns (\\n Lib_OVMCodec.QueueElement memory _element\\n );\\n\\n /**\\n * Adds a transaction to the queue.\\n * @param _target Target contract to send the transaction to.\\n * @param _gasLimit Gas limit for the given transaction.\\n * @param _data Transaction data.\\n */\\n function enqueue(\\n address _target,\\n uint256 _gasLimit,\\n bytes memory _data\\n )\\n external;\\n\\n /**\\n * Appends a given number of queued transactions as a single batch.\\n * @param _numQueuedTransactions Number of transactions to append.\\n */\\n function appendQueueBatch(\\n uint256 _numQueuedTransactions\\n )\\n external;\\n\\n /**\\n * Allows the sequencer to append a batch of transactions.\\n * @dev This function uses a custom encoding scheme for efficiency reasons.\\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\\n * .param _contexts Array of batch contexts.\\n * .param _transactionDataFields Array of raw transaction data.\\n */\\n function appendSequencerBatch(\\n // uint40 _shouldStartAtElement,\\n // uint24 _totalElementsToAppend,\\n // BatchContext[] _contexts,\\n // bytes[] _transactionDataFields\\n )\\n external;\\n\\n /**\\n * Verifies whether a transaction is included in the chain.\\n * @param _transaction Transaction to verify.\\n * @param _txChainElement Transaction chain element corresponding to the transaction.\\n * @param _batchHeader Header of the batch the transaction was included in.\\n * @param _inclusionProof Inclusion proof for the provided transaction chain element.\\n * @return True if the transaction exists in the CTC, false if not.\\n */\\n function verifyTransaction(\\n Lib_OVMCodec.Transaction memory _transaction,\\n Lib_OVMCodec.TransactionChainElement memory _txChainElement,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _inclusionProof\\n )\\n external\\n view\\n returns (\\n bool\\n );\\n}\\n\",\"keccak256\":\"0x82a4e62286c8bc5e2d3de33f66d9b707cb9636e553dca54b5e95277bd794a934\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_ChainStorageContainer.sol\":{\"content\":\"pragma solidity ^0.7.0;\\n\\n/**\\n * @title iOVM_ChainStorageContainer\\n */\\ninterface iOVM_ChainStorageContainer {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata()\\n external\\n view\\n returns (\\n bytes27\\n );\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length()\\n external\\n view\\n returns (\\n uint256\\n );\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(\\n bytes32 _object\\n )\\n external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(\\n bytes32 _object,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Pushes two objects into the container at the same time. A useful optimization.\\n * @param _objectA First 32 byte value to insert into the container.\\n * @param _objectB Second 32 byte value to insert into the container.\\n */\\n function push2(\\n bytes32 _objectA,\\n bytes32 _objectB\\n )\\n external;\\n\\n /**\\n * Pushes two objects into the container at the same time. Also allows setting the global\\n * metadata field.\\n * @param _objectA First 32 byte value to insert into the container.\\n * @param _objectB Second 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push2(\\n bytes32 _objectA,\\n bytes32 _objectB,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(\\n uint256 _index\\n )\\n external\\n view\\n returns (\\n bytes32\\n );\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index\\n )\\n external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Marks an index as overwritable, meaing the underlying buffer can start to write values over\\n * any objects before and including the given index.\\n */\\n function setNextOverwritableIndex(\\n uint256 _index\\n )\\n external;\\n}\\n\",\"keccak256\":\"0xcfca7da85b35d94c27581c2460b0d48fd0cc51fa72670cc7a2f7f760fb21a2f0\"},\"contracts/optimistic-ethereum/iOVM/execution/iOVM_ExecutionManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\ninterface iOVM_ExecutionManager {\\n /**********\\n * Enums *\\n *********/\\n\\n enum RevertFlag {\\n DID_NOT_REVERT,\\n OUT_OF_GAS,\\n INTENTIONAL_REVERT,\\n EXCEEDS_NUISANCE_GAS,\\n INVALID_STATE_ACCESS,\\n UNSAFE_BYTECODE,\\n CREATE_COLLISION,\\n STATIC_VIOLATION,\\n CREATE_EXCEPTION,\\n CREATOR_NOT_ALLOWED\\n }\\n\\n enum GasMetadataKey {\\n CURRENT_EPOCH_START_TIMESTAMP,\\n CUMULATIVE_SEQUENCER_QUEUE_GAS,\\n CUMULATIVE_L1TOL2_QUEUE_GAS,\\n PREV_EPOCH_SEQUENCER_QUEUE_GAS,\\n PREV_EPOCH_L1TOL2_QUEUE_GAS\\n }\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct GasMeterConfig {\\n uint256 minTransactionGasLimit;\\n uint256 maxTransactionGasLimit;\\n uint256 maxGasPerQueuePerEpoch;\\n uint256 secondsPerEpoch;\\n }\\n\\n struct GlobalContext {\\n uint256 ovmCHAINID;\\n }\\n\\n struct TransactionContext {\\n Lib_OVMCodec.QueueOrigin ovmL1QUEUEORIGIN;\\n uint256 ovmTIMESTAMP;\\n uint256 ovmNUMBER;\\n uint256 ovmGASLIMIT;\\n uint256 ovmTXGASLIMIT;\\n address ovmL1TXORIGIN;\\n }\\n\\n struct TransactionRecord {\\n uint256 ovmGasRefund;\\n }\\n\\n struct MessageContext {\\n address ovmCALLER;\\n address ovmADDRESS;\\n bool isStatic;\\n }\\n\\n struct MessageRecord {\\n uint256 nuisanceGasLeft;\\n RevertFlag revertFlag;\\n }\\n\\n\\n /************************************\\n * Transaction Execution Entrypoint *\\n ************************************/\\n\\n function run(\\n Lib_OVMCodec.Transaction calldata _transaction,\\n address _txStateManager\\n ) external;\\n\\n\\n /*******************\\n * Context Opcodes *\\n *******************/\\n\\n function ovmCALLER() external view returns (address _caller);\\n function ovmADDRESS() external view returns (address _address);\\n function ovmTIMESTAMP() external view returns (uint256 _timestamp);\\n function ovmNUMBER() external view returns (uint256 _number);\\n function ovmGASLIMIT() external view returns (uint256 _gasLimit);\\n function ovmCHAINID() external view returns (uint256 _chainId);\\n\\n\\n /**********************\\n * L2 Context Opcodes *\\n **********************/\\n\\n function ovmL1QUEUEORIGIN() external view returns (Lib_OVMCodec.QueueOrigin _queueOrigin);\\n function ovmL1TXORIGIN() external view returns (address _l1TxOrigin);\\n\\n\\n /*******************\\n * Halting Opcodes *\\n *******************/\\n\\n function ovmREVERT(bytes memory _data) external;\\n\\n\\n /*****************************\\n * Contract Creation Opcodes *\\n *****************************/\\n\\n function ovmCREATE(bytes memory _bytecode) external returns (address _contract);\\n function ovmCREATE2(bytes memory _bytecode, bytes32 _salt) external returns (address _contract);\\n\\n\\n /*******************************\\n * Account Abstraction Opcodes *\\n ******************************/\\n\\n function ovmGETNONCE() external returns (uint256 _nonce);\\n function ovmSETNONCE(uint256 _nonce) external;\\n function ovmCREATEEOA(bytes32 _messageHash, uint8 _v, bytes32 _r, bytes32 _s) external;\\n\\n\\n /****************************\\n * Contract Calling Opcodes *\\n ****************************/\\n\\n function ovmCALL(uint256 _gasLimit, address _address, bytes memory _calldata) external returns (bool _success, bytes memory _returndata);\\n function ovmSTATICCALL(uint256 _gasLimit, address _address, bytes memory _calldata) external returns (bool _success, bytes memory _returndata);\\n function ovmDELEGATECALL(uint256 _gasLimit, address _address, bytes memory _calldata) external returns (bool _success, bytes memory _returndata);\\n\\n\\n /****************************\\n * Contract Storage Opcodes *\\n ****************************/\\n\\n function ovmSLOAD(bytes32 _key) external returns (bytes32 _value);\\n function ovmSSTORE(bytes32 _key, bytes32 _value) external;\\n\\n\\n /*************************\\n * Contract Code Opcodes *\\n *************************/\\n\\n function ovmEXTCODECOPY(address _contract, uint256 _offset, uint256 _length) external returns (bytes memory _code);\\n function ovmEXTCODESIZE(address _contract) external returns (uint256 _size);\\n function ovmEXTCODEHASH(address _contract) external returns (bytes32 _hash);\\n\\n\\n /**************************************\\n * Public Functions: Execution Safety *\\n **************************************/\\n\\n function safeCREATE(address _address, bytes memory _bytecode) external;\\n\\n /***************************************\\n * Public Functions: Execution Context *\\n ***************************************/\\n\\n function getMaxTransactionGasLimit() external view returns (uint _maxTransactionGasLimit);\\n}\\n\",\"keccak256\":\"0xed2ea81fb87874b10ebd34339f0690107a841672941de37b405c2da2c285cff0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/execution/iOVM_SafetyChecker.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title iOVM_SafetyChecker\\n */\\ninterface iOVM_SafetyChecker {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function isBytecodeSafe(bytes calldata _bytecode) external view returns (bool);\\n}\\n\",\"keccak256\":\"0xc8a74aa7d179327dbc35b2dd8b805b76d7ea4dc031e043d957a73c2a136ff682\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/execution/iOVM_StateManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title iOVM_StateManager\\n */\\ninterface iOVM_StateManager {\\n\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n enum ItemState {\\n ITEM_UNTOUCHED,\\n ITEM_LOADED,\\n ITEM_CHANGED,\\n ITEM_COMMITTED\\n }\\n\\n /***************************\\n * Public Functions: Misc *\\n ***************************/\\n\\n function isAuthenticated(address _address) external view returns (bool);\\n\\n /***************************\\n * Public Functions: Setup *\\n ***************************/\\n\\n function owner() external view returns (address _owner);\\n function ovmExecutionManager() external view returns (address _ovmExecutionManager);\\n function setExecutionManager(address _ovmExecutionManager) external;\\n\\n\\n /************************************\\n * Public Functions: Account Access *\\n ************************************/\\n\\n function putAccount(address _address, Lib_OVMCodec.Account memory _account) external;\\n function putEmptyAccount(address _address) external;\\n function getAccount(address _address) external view returns (Lib_OVMCodec.Account memory _account);\\n function hasAccount(address _address) external view returns (bool _exists);\\n function hasEmptyAccount(address _address) external view returns (bool _exists);\\n function setAccountNonce(address _address, uint256 _nonce) external;\\n function getAccountNonce(address _address) external view returns (uint256 _nonce);\\n function getAccountEthAddress(address _address) external view returns (address _ethAddress);\\n function getAccountStorageRoot(address _address) external view returns (bytes32 _storageRoot);\\n function initPendingAccount(address _address) external;\\n function commitPendingAccount(address _address, address _ethAddress, bytes32 _codeHash) external;\\n function testAndSetAccountLoaded(address _address) external returns (bool _wasAccountAlreadyLoaded);\\n function testAndSetAccountChanged(address _address) external returns (bool _wasAccountAlreadyChanged);\\n function commitAccount(address _address) external returns (bool _wasAccountCommitted);\\n function incrementTotalUncommittedAccounts() external;\\n function getTotalUncommittedAccounts() external view returns (uint256 _total);\\n function wasAccountChanged(address _address) external view returns (bool);\\n function wasAccountCommitted(address _address) external view returns (bool);\\n\\n\\n /************************************\\n * Public Functions: Storage Access *\\n ************************************/\\n\\n function putContractStorage(address _contract, bytes32 _key, bytes32 _value) external;\\n function getContractStorage(address _contract, bytes32 _key) external view returns (bytes32 _value);\\n function hasContractStorage(address _contract, bytes32 _key) external returns (bool _exists);\\n function testAndSetContractStorageLoaded(address _contract, bytes32 _key) external returns (bool _wasContractStorageAlreadyLoaded);\\n function testAndSetContractStorageChanged(address _contract, bytes32 _key) external returns (bool _wasContractStorageAlreadyChanged);\\n function commitContractStorage(address _contract, bytes32 _key) external returns (bool _wasContractStorageCommitted);\\n function incrementTotalUncommittedContractStorage() external;\\n function getTotalUncommittedContractStorage() external view returns (uint256 _total);\\n function wasContractStorageChanged(address _contract, bytes32 _key) external view returns (bool);\\n function wasContractStorageCommitted(address _contract, bytes32 _key) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x18930f780c006c023ff13600917320286a56176724c45de6286a82ade19c0a5e\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/precompiles/iOVM_DeployerWhitelist.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title iOVM_DeployerWhitelist\\n */\\ninterface iOVM_DeployerWhitelist {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function initialize(address _owner, bool _allowArbitraryDeployment) external;\\n function getOwner() external returns (address _owner);\\n function setWhitelistedDeployer(address _deployer, bool _isWhitelisted) external;\\n function setOwner(address _newOwner) external;\\n function setAllowArbitraryDeployment(bool _allowArbitraryDeployment) external;\\n function enableArbitraryContractDeployment() external;\\n function isDeployerAllowed(address _deployer) external returns (bool _allowed);\\n}\\n\",\"keccak256\":\"0x969394371cacfc36493230150b6d629173ea72dfdf729330bede475b91d0f004\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/codec/Lib_OVMCodec.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../utils/Lib_Bytes32Utils.sol\\\";\\nimport { Lib_SafeExecutionManagerWrapper } from \\\"../../libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\\\";\\n\\n/**\\n * @title Lib_OVMCodec\\n */\\nlibrary Lib_OVMCodec {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n bytes constant internal RLP_NULL_BYTES = hex'80';\\n bytes constant internal NULL_BYTES = bytes('');\\n\\n // Ring buffer IDs\\n bytes32 constant internal RING_BUFFER_SCC_BATCHES = keccak256(\\\"RING_BUFFER_SCC_BATCHES\\\");\\n bytes32 constant internal RING_BUFFER_CTC_BATCHES = keccak256(\\\"RING_BUFFER_CTC_BATCHES\\\");\\n bytes32 constant internal RING_BUFFER_CTC_QUEUE = keccak256(\\\"RING_BUFFER_CTC_QUEUE\\\");\\n\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum EOASignatureType {\\n EIP155_TRANSACTON,\\n ETH_SIGNED_MESSAGE\\n }\\n\\n enum QueueOrigin {\\n SEQUENCER_QUEUE,\\n L1TOL2_QUEUE\\n }\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Account {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n address ethAddress;\\n bool isFresh;\\n }\\n\\n struct EVMAccount {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n }\\n\\n struct ChainBatchHeader {\\n uint256 batchIndex;\\n bytes32 batchRoot;\\n uint256 batchSize;\\n uint256 prevTotalElements;\\n bytes extraData;\\n }\\n\\n struct ChainInclusionProof {\\n uint256 index;\\n bytes32[] siblings;\\n }\\n\\n struct Transaction {\\n uint256 timestamp;\\n uint256 blockNumber;\\n QueueOrigin l1QueueOrigin;\\n address l1TxOrigin;\\n address entrypoint;\\n uint256 gasLimit;\\n bytes data;\\n }\\n\\n struct TransactionChainElement {\\n bool isSequenced;\\n uint256 queueIndex; // QUEUED TX ONLY\\n uint256 timestamp; // SEQUENCER TX ONLY\\n uint256 blockNumber; // SEQUENCER TX ONLY\\n bytes txData; // SEQUENCER TX ONLY\\n }\\n\\n struct QueueElement {\\n bytes32 queueRoot;\\n uint40 timestamp;\\n uint40 blockNumber;\\n }\\n\\n struct EIP155Transaction {\\n uint256 nonce;\\n uint256 gasPrice;\\n uint256 gasLimit;\\n address to;\\n uint256 value;\\n bytes data;\\n uint256 chainId;\\n }\\n\\n\\n /*********************************************\\n * Internal Functions: Encoding and Decoding *\\n *********************************************/\\n\\n /**\\n * Decodes an EOA transaction (i.e., native Ethereum RLP encoding).\\n * @param _transaction Encoded EOA transaction.\\n * @return _decoded Transaction decoded into a struct.\\n */\\n function decodeEIP155Transaction(\\n bytes memory _transaction,\\n bool _isEthSignedMessage\\n )\\n internal\\n pure\\n returns (\\n EIP155Transaction memory _decoded\\n )\\n {\\n if (_isEthSignedMessage) {\\n (\\n uint256 _nonce,\\n uint256 _gasLimit,\\n uint256 _gasPrice,\\n uint256 _chainId,\\n address _to,\\n bytes memory _data\\n ) = abi.decode(\\n _transaction,\\n (uint256, uint256, uint256, uint256, address ,bytes)\\n );\\n return EIP155Transaction({\\n nonce: _nonce,\\n gasPrice: _gasPrice,\\n gasLimit: _gasLimit,\\n to: _to,\\n value: 0,\\n data: _data,\\n chainId: _chainId\\n });\\n } else {\\n Lib_RLPReader.RLPItem[] memory decoded = Lib_RLPReader.readList(_transaction);\\n\\n return EIP155Transaction({\\n nonce: Lib_RLPReader.readUint256(decoded[0]),\\n gasPrice: Lib_RLPReader.readUint256(decoded[1]),\\n gasLimit: Lib_RLPReader.readUint256(decoded[2]),\\n to: Lib_RLPReader.readAddress(decoded[3]),\\n value: Lib_RLPReader.readUint256(decoded[4]),\\n data: Lib_RLPReader.readBytes(decoded[5]),\\n chainId: Lib_RLPReader.readUint256(decoded[6])\\n });\\n }\\n }\\n\\n function decompressEIP155Transaction(\\n bytes memory _transaction\\n )\\n internal\\n returns (\\n EIP155Transaction memory _decompressed\\n )\\n {\\n return EIP155Transaction({\\n gasLimit: Lib_BytesUtils.toUint24(_transaction, 0),\\n gasPrice: uint256(Lib_BytesUtils.toUint24(_transaction, 3)) * 1000000,\\n nonce: Lib_BytesUtils.toUint24(_transaction, 6),\\n to: Lib_BytesUtils.toAddress(_transaction, 9),\\n data: Lib_BytesUtils.slice(_transaction, 29),\\n chainId: Lib_SafeExecutionManagerWrapper.safeCHAINID(),\\n value: 0\\n });\\n }\\n\\n /**\\n * Encodes an EOA transaction back into the original transaction.\\n * @param _transaction EIP155transaction to encode.\\n * @param _isEthSignedMessage Whether or not this was an eth signed message.\\n * @return Encoded transaction.\\n */\\n function encodeEIP155Transaction(\\n EIP155Transaction memory _transaction,\\n bool _isEthSignedMessage\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n if (_isEthSignedMessage) {\\n return abi.encode(\\n _transaction.nonce,\\n _transaction.gasLimit,\\n _transaction.gasPrice,\\n _transaction.chainId,\\n _transaction.to,\\n _transaction.data\\n );\\n } else {\\n bytes[] memory raw = new bytes[](9);\\n\\n raw[0] = Lib_RLPWriter.writeUint(_transaction.nonce);\\n raw[1] = Lib_RLPWriter.writeUint(_transaction.gasPrice);\\n raw[2] = Lib_RLPWriter.writeUint(_transaction.gasLimit);\\n if (_transaction.to == address(0)) {\\n raw[3] = Lib_RLPWriter.writeBytes('');\\n } else {\\n raw[3] = Lib_RLPWriter.writeAddress(_transaction.to);\\n }\\n raw[4] = Lib_RLPWriter.writeUint(0);\\n raw[5] = Lib_RLPWriter.writeBytes(_transaction.data);\\n raw[6] = Lib_RLPWriter.writeUint(_transaction.chainId);\\n raw[7] = Lib_RLPWriter.writeBytes(bytes(''));\\n raw[8] = Lib_RLPWriter.writeBytes(bytes(''));\\n\\n return Lib_RLPWriter.writeList(raw);\\n }\\n }\\n\\n /**\\n * Encodes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return _encoded Encoded transaction bytes.\\n */\\n function encodeTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes memory _encoded\\n )\\n {\\n return abi.encodePacked(\\n _transaction.timestamp,\\n _transaction.blockNumber,\\n _transaction.l1QueueOrigin,\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n );\\n }\\n\\n /**\\n * Hashes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return _hash Hashed transaction\\n */\\n function hashTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes32 _hash\\n )\\n {\\n return keccak256(encodeTransaction(_transaction));\\n }\\n\\n /**\\n * Converts an OVM account to an EVM account.\\n * @param _in OVM account to convert.\\n * @return _out Converted EVM account.\\n */\\n function toEVMAccount(\\n Account memory _in\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory _out\\n )\\n {\\n return EVMAccount({\\n nonce: _in.nonce,\\n balance: _in.balance,\\n storageRoot: _in.storageRoot,\\n codeHash: _in.codeHash\\n });\\n }\\n\\n /**\\n * @notice RLP-encodes an account state struct.\\n * @param _account Account state struct.\\n * @return _encoded RLP-encoded account state.\\n */\\n function encodeEVMAccount(\\n EVMAccount memory _account\\n )\\n internal\\n pure\\n returns (\\n bytes memory _encoded\\n )\\n {\\n bytes[] memory raw = new bytes[](4);\\n\\n // Unfortunately we can't create this array outright because\\n // Lib_RLPWriter.writeList will reject fixed-size arrays. Assigning\\n // index-by-index circumvents this issue.\\n raw[0] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.nonce)\\n )\\n );\\n raw[1] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.balance)\\n )\\n );\\n raw[2] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.storageRoot));\\n raw[3] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.codeHash));\\n\\n return Lib_RLPWriter.writeList(raw);\\n }\\n\\n /**\\n * @notice Decodes an RLP-encoded account state into a useful struct.\\n * @param _encoded RLP-encoded account state.\\n * @return _account Account state struct.\\n */\\n function decodeEVMAccount(\\n bytes memory _encoded\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory _account\\n )\\n {\\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\\n\\n return EVMAccount({\\n nonce: Lib_RLPReader.readUint256(accountState[0]),\\n balance: Lib_RLPReader.readUint256(accountState[1]),\\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\\n });\\n }\\n\\n /**\\n * Calculates a hash for a given batch header.\\n * @param _batchHeader Header to hash.\\n * @return _hash Hash of the header.\\n */\\n function hashBatchHeader(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n internal\\n pure\\n returns (\\n bytes32 _hash\\n )\\n {\\n return keccak256(\\n abi.encode(\\n _batchHeader.batchRoot,\\n _batchHeader.batchSize,\\n _batchHeader.prevTotalElements,\\n _batchHeader.extraData\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0x19d78734777b4998f1544e235cf3934f20c5055cd76c2bd60bf0f6dacdd72b3a\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// +build ovm\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Contract Imports */\\nimport { Ownable } from \\\"./Lib_Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n /*******************************************\\n * Contract Variables: Internal Accounting *\\n *******************************************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n public\\n onlyOwner\\n {\\n emit AddressSet(_name, _address);\\n addresses[_getNameHash(_name)] = _address;\\n }\\n\\n function getAddress(\\n string memory _name\\n )\\n public\\n view\\n returns (address)\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32 _hash\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xdf802e1cc6474df913626991e9fca3835c620a519f397afe04bf9c260e723257\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// +build ovm\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\ncontract Lib_AddressResolver {\\n\\n /*******************************************\\n * Contract Variables: Contract References *\\n *******************************************/\\n\\n Lib_AddressManager internal libAddressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(\\n address _libAddressManager\\n ) public {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function resolve(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address _contract\\n )\\n {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0xf3b9d78b309ddeec259ce3e0e1cfdef3ca40938e9a81971b28ce2b8ea327f533\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// +build ovm\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Ownable\\n * @dev Adapted from https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol\\n */\\nabstract contract Ownable {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n address public owner;\\n\\n\\n /**********\\n * Events *\\n **********/\\n\\n event OwnershipTransferred(\\n address indexed previousOwner,\\n address indexed newOwner\\n );\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n constructor() internal {\\n owner = msg.sender;\\n emit OwnershipTransferred(address(0), owner);\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n owner == msg.sender,\\n \\\"Ownable: caller is not the owner\\\"\\n );\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function renounceOwnership()\\n public\\n virtual\\n onlyOwner\\n {\\n emit OwnershipTransferred(owner, address(0));\\n owner = address(0);\\n }\\n\\n function transferOwnership(address _newOwner)\\n public\\n virtual\\n onlyOwner\\n {\\n require(\\n _newOwner != address(0),\\n \\\"Ownable: new owner cannot be the zero address\\\"\\n );\\n\\n emit OwnershipTransferred(owner, _newOwner);\\n owner = _newOwner;\\n }\\n}\\n\",\"keccak256\":\"0xe0409fbd236d16ca6be439d9d97dd36d0d9a0697ee0062d49588b9d29c248e47\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPReader.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.7.0;\\n\\n/**\\n * @title Lib_RLPReader\\n * @dev Adapted from \\\"RLPReader\\\" by Hamdi Allam (hamdi.allam97@gmail.com).\\n */\\nlibrary Lib_RLPReader {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 constant internal MAX_LIST_LENGTH = 32;\\n\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum RLPItemType {\\n DATA_ITEM,\\n LIST_ITEM\\n }\\n\\n \\n /***********\\n * Structs *\\n ***********/\\n\\n struct RLPItem {\\n uint256 length;\\n uint256 ptr;\\n }\\n \\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n \\n /**\\n * Converts bytes to a reference to memory position and length.\\n * @param _in Input bytes to convert.\\n * @return Output memory reference.\\n */\\n function toRLPItem(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem memory\\n )\\n {\\n uint256 ptr;\\n assembly {\\n ptr := add(_in, 32)\\n }\\n\\n return RLPItem({\\n length: _in.length,\\n ptr: ptr\\n });\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n (\\n uint256 listOffset,\\n ,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.LIST_ITEM,\\n \\\"Invalid RLP list value.\\\"\\n );\\n\\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\\n // writing to the length. Since we can't know the number of RLP items without looping over\\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\\n // simply set a reasonable maximum list length and decrease the size before we finish.\\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\\n\\n uint256 itemCount = 0;\\n uint256 offset = listOffset;\\n while (offset < _in.length) {\\n require(\\n itemCount < MAX_LIST_LENGTH,\\n \\\"Provided RLP list exceeds max list length.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n ) = _decodeLength(RLPItem({\\n length: _in.length - offset,\\n ptr: _in.ptr + offset\\n }));\\n\\n out[itemCount] = RLPItem({\\n length: itemLength + itemOffset,\\n ptr: _in.ptr + offset\\n });\\n\\n itemCount += 1;\\n offset += itemOffset + itemLength;\\n }\\n\\n // Decrease the array size to match the actual item count.\\n assembly {\\n mstore(out, itemCount)\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n return readList(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes value.\\\"\\n );\\n\\n return _copy(_in.ptr, itemOffset, itemLength);\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return readBytes(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return string(readBytes(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return readString(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n require(\\n _in.length <= 33,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr + itemOffset;\\n bytes32 out;\\n assembly {\\n out := mload(ptr)\\n\\n // Shift the bytes over to match the item size.\\n if lt(itemLength, 32) {\\n out := div(out, exp(256, sub(32, itemLength)))\\n }\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return readBytes32(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return uint256(readBytes32(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return readUint256(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n require(\\n _in.length == 1,\\n \\\"Invalid RLP boolean value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 out;\\n assembly {\\n out := byte(0, mload(ptr))\\n }\\n\\n return out != 0;\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return readBool(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n if (_in.length == 1) {\\n return address(0);\\n }\\n\\n require(\\n _in.length == 21,\\n \\\"Invalid RLP address value.\\\"\\n );\\n\\n return address(readUint256(_in));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return readAddress(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads the raw bytes of an RLP item.\\n * @param _in RLP item to read.\\n * @return Raw RLP bytes.\\n */\\n function readRawBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in);\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Decodes the length of an RLP item.\\n * @param _in RLP item to decode.\\n * @return Offset of the encoded data.\\n * @return Length of the encoded data.\\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\\n */\\n function _decodeLength(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n uint256,\\n uint256,\\n RLPItemType\\n )\\n {\\n require(\\n _in.length > 0,\\n \\\"RLP item cannot be null.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 prefix;\\n assembly {\\n prefix := byte(0, mload(ptr))\\n }\\n\\n if (prefix <= 0x7f) {\\n // Single byte.\\n\\n return (0, 1, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xb7) {\\n // Short string.\\n\\n uint256 strLen = prefix - 0x80;\\n \\n require(\\n _in.length > strLen,\\n \\\"Invalid RLP short string.\\\"\\n );\\n\\n return (1, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xbf) {\\n // Long string.\\n uint256 lenOfStrLen = prefix - 0xb7;\\n\\n require(\\n _in.length > lenOfStrLen,\\n \\\"Invalid RLP long string length.\\\"\\n );\\n\\n uint256 strLen;\\n assembly {\\n // Pick out the string length.\\n strLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfStrLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfStrLen + strLen,\\n \\\"Invalid RLP long string.\\\"\\n );\\n\\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xf7) {\\n // Short list.\\n uint256 listLen = prefix - 0xc0;\\n\\n require(\\n _in.length > listLen,\\n \\\"Invalid RLP short list.\\\"\\n );\\n\\n return (1, listLen, RLPItemType.LIST_ITEM);\\n } else {\\n // Long list.\\n uint256 lenOfListLen = prefix - 0xf7;\\n\\n require(\\n _in.length > lenOfListLen,\\n \\\"Invalid RLP long list length.\\\"\\n );\\n\\n uint256 listLen;\\n assembly {\\n // Pick out the list length.\\n listLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfListLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfListLen + listLen,\\n \\\"Invalid RLP long list.\\\"\\n );\\n\\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\\n }\\n }\\n\\n /**\\n * Copies the bytes from a memory location.\\n * @param _src Pointer to the location to read from.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Copied bytes.\\n */\\n function _copy(\\n uint256 _src,\\n uint256 _offset,\\n uint256 _length\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out = new bytes(_length);\\n if (out.length == 0) {\\n return out;\\n }\\n\\n uint256 src = _src + _offset;\\n uint256 dest;\\n assembly {\\n dest := add(out, 32)\\n }\\n\\n // Copy over as many complete words as we can.\\n for (uint256 i = 0; i < _length / 32; i++) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n\\n src += 32;\\n dest += 32;\\n }\\n\\n // Pick out the remaining bytes.\\n uint256 mask = 256 ** (32 - (_length % 32)) - 1;\\n assembly {\\n mstore(\\n dest,\\n or(\\n and(mload(src), not(mask)),\\n and(mload(dest), mask)\\n )\\n )\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Copies an RLP item into bytes.\\n * @param _in RLP item to copy.\\n * @return Copied bytes.\\n */\\n function _copy(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in.ptr, 0, _in.length);\\n }\\n}\\n\",\"keccak256\":\"0x8338f7b6e5f0ded8fc36d9088fd127ee53ae4040ca3f4838eb6123f642d38c62\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPWriter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.7.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\n\\n/**\\n * @title Lib_RLPWriter\\n * @author Bakaoh (with modifications)\\n */\\nlibrary Lib_RLPWriter {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * RLP encodes a byte string.\\n * @param _in The byte string to encode.\\n * @return _out The RLP encoded string in bytes.\\n */\\n function writeBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n bytes memory encoded;\\n\\n if (_in.length == 1 && uint8(_in[0]) < 128) {\\n encoded = _in;\\n } else {\\n encoded = Lib_BytesUtils.concat(_writeLength(_in.length, 128), _in);\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * RLP encodes a list of RLP encoded byte byte strings.\\n * @param _in The list of RLP encoded byte strings.\\n * @return _out The RLP encoded list of items in bytes.\\n */\\n function writeList(\\n bytes[] memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n bytes memory list = _flatten(_in);\\n return Lib_BytesUtils.concat(_writeLength(list.length, 192), list);\\n }\\n\\n /**\\n * RLP encodes a string.\\n * @param _in The string to encode.\\n * @return _out The RLP encoded string in bytes.\\n */\\n function writeString(\\n string memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(bytes(_in));\\n }\\n\\n /**\\n * RLP encodes an address.\\n * @param _in The address to encode.\\n * @return _out The RLP encoded address in bytes.\\n */\\n function writeAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a uint.\\n * @param _in The uint256 to encode.\\n * @return _out The RLP encoded uint256 in bytes.\\n */\\n function writeUint(\\n uint256 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(_toBinary(_in));\\n }\\n\\n /**\\n * RLP encodes a bool.\\n * @param _in The bool to encode.\\n * @return _out The RLP encoded bool in bytes.\\n */\\n function writeBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n bytes memory encoded = new bytes(1);\\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\\n return encoded;\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\\n * @param _len The length of the string or the payload.\\n * @param _offset 128 if item is string, 192 if item is list.\\n * @return _encoded RLP encoded bytes.\\n */\\n function _writeLength(\\n uint256 _len,\\n uint256 _offset\\n )\\n private\\n pure\\n returns (\\n bytes memory _encoded\\n )\\n {\\n bytes memory encoded;\\n\\n if (_len < 56) {\\n encoded = new bytes(1);\\n encoded[0] = byte(uint8(_len) + uint8(_offset));\\n } else {\\n uint256 lenLen;\\n uint256 i = 1;\\n while (_len / i != 0) {\\n lenLen++;\\n i *= 256;\\n }\\n\\n encoded = new bytes(lenLen + 1);\\n encoded[0] = byte(uint8(lenLen) + uint8(_offset) + 55);\\n for(i = 1; i <= lenLen; i++) {\\n encoded[i] = byte(uint8((_len / (256**(lenLen-i))) % 256));\\n }\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * Encode integer in big endian binary form with no leading zeroes.\\n * @notice TODO: This should be optimized with assembly to save gas costs.\\n * @param _x The integer to encode.\\n * @return _binary RLP encoded bytes.\\n */\\n function _toBinary(\\n uint256 _x\\n )\\n private\\n pure\\n returns (\\n bytes memory _binary\\n )\\n {\\n bytes memory b = abi.encodePacked(_x);\\n\\n uint256 i = 0;\\n for (; i < 32; i++) {\\n if (b[i] != 0) {\\n break;\\n }\\n }\\n\\n bytes memory res = new bytes(32 - i);\\n for (uint256 j = 0; j < res.length; j++) {\\n res[j] = b[i++];\\n }\\n\\n return res;\\n }\\n\\n /**\\n * Copies a piece of memory to another location.\\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\\n * @param _dest Destination location.\\n * @param _src Source location.\\n * @param _len Length of memory to copy.\\n */\\n function _memcpy(\\n uint256 _dest,\\n uint256 _src,\\n uint256 _len\\n )\\n private\\n pure\\n {\\n uint256 dest = _dest;\\n uint256 src = _src;\\n uint256 len = _len;\\n\\n for(; len >= 32; len -= 32) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n dest += 32;\\n src += 32;\\n }\\n\\n uint256 mask = 256 ** (32 - len) - 1;\\n assembly {\\n let srcpart := and(mload(src), not(mask))\\n let destpart := and(mload(dest), mask)\\n mstore(dest, or(destpart, srcpart))\\n }\\n }\\n\\n /**\\n * Flattens a list of byte strings into one byte string.\\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\\n * @param _list List of byte strings to flatten.\\n * @return _flattened The flattened byte string.\\n */\\n function _flatten(\\n bytes[] memory _list\\n )\\n private\\n pure\\n returns (\\n bytes memory _flattened\\n )\\n {\\n if (_list.length == 0) {\\n return new bytes(0);\\n }\\n\\n uint256 len;\\n uint256 i = 0;\\n for (; i < _list.length; i++) {\\n len += _list[i].length;\\n }\\n\\n bytes memory flattened = new bytes(len);\\n uint256 flattenedPtr;\\n assembly { flattenedPtr := add(flattened, 0x20) }\\n\\n for(i = 0; i < _list.length; i++) {\\n bytes memory item = _list[i];\\n\\n uint256 listPtr;\\n assembly { listPtr := add(item, 0x20)}\\n\\n _memcpy(flattenedPtr, listPtr, item.length);\\n flattenedPtr += _list[i].length;\\n }\\n\\n return flattened;\\n }\\n}\",\"keccak256\":\"0x6d1aaef567f8a91bb965b95a95637f433a1f0ac4cf0bc1e209cdb1dd5b0f204b\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_Bytes32Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.7.0;\\n\\n/**\\n * @title Lib_Byte32Utils\\n */\\nlibrary Lib_Bytes32Utils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function toBool(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bool _out\\n )\\n {\\n return _in != 0;\\n }\\n\\n function fromBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes32 _out\\n )\\n {\\n return bytes32(uint256(_in ? 1 : 0));\\n }\\n\\n function toAddress(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n address _out\\n )\\n {\\n return address(uint160(uint256(_in)));\\n }\\n\\n function fromAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes32 _out\\n )\\n {\\n return bytes32(uint256(_in));\\n }\\n\\n function removeLeadingZeros(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n bytes memory out;\\n\\n assembly {\\n // Figure out how many leading zero bytes to remove.\\n let shift := 0\\n for { let i := 0 } and(lt(i, 32), eq(byte(i, _in), 0)) { i := add(i, 1) } {\\n shift := add(shift, 1)\\n }\\n\\n // Reserve some space for our output and fix the free memory pointer.\\n out := mload(0x40)\\n mstore(0x40, add(out, 0x40))\\n\\n // Shift the value and store it into the output bytes.\\n mstore(add(out, 0x20), shl(mul(shift, 8), _in))\\n\\n // Store the new size (with leading zero bytes removed) in the output byte size.\\n mstore(out, sub(32, shift))\\n }\\n\\n return out;\\n }\\n}\\n\",\"keccak256\":\"0x06f97590a80a01daa3bf6aa795449aea91a78684c646b4a6caeece8ef919c80c\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_BytesUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.7.0;\\n\\n/**\\n * @title Lib_BytesUtils\\n */\\nlibrary Lib_BytesUtils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function concat(\\n bytes memory _preBytes,\\n bytes memory _postBytes\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n bytes memory tempBytes;\\n\\n assembly {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // Store the length of the first bytes array at the beginning of\\n // the memory for tempBytes.\\n let length := mload(_preBytes)\\n mstore(tempBytes, length)\\n\\n // Maintain a memory counter for the current write location in the\\n // temp bytes array by adding the 32 bytes for the array length to\\n // the starting location.\\n let mc := add(tempBytes, 0x20)\\n // Stop copying when the memory counter reaches the length of the\\n // first bytes array.\\n let end := add(mc, length)\\n\\n for {\\n // Initialize a copy counter to the start of the _preBytes data,\\n // 32 bytes into its memory.\\n let cc := add(_preBytes, 0x20)\\n } lt(mc, end) {\\n // Increase both counters by 32 bytes each iteration.\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n // Write the _preBytes data into the tempBytes memory 32 bytes\\n // at a time.\\n mstore(mc, mload(cc))\\n }\\n\\n // Add the length of _postBytes to the current length of tempBytes\\n // and store it as the new length in the first 32 bytes of the\\n // tempBytes memory.\\n length := mload(_postBytes)\\n mstore(tempBytes, add(length, mload(tempBytes)))\\n\\n // Move the memory counter back from a multiple of 0x20 to the\\n // actual end of the _preBytes data.\\n mc := end\\n // Stop copying when the memory counter reaches the new combined\\n // length of the arrays.\\n end := add(mc, length)\\n\\n for {\\n let cc := add(_postBytes, 0x20)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n // Update the free-memory pointer by padding our last write location\\n // to 32 bytes: add 31 bytes to the end of tempBytes to move to the\\n // next 32 byte block, then round down to the nearest multiple of\\n // 32. If the sum of the length of the two arrays is zero then add\\n // one before rounding down to leave a blank 32 bytes (the length block with 0).\\n mstore(0x40, and(\\n add(add(end, iszero(add(length, mload(_preBytes)))), 31),\\n not(31) // Round down to the nearest 32 bytes.\\n ))\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_start + _length >= _start, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n if (_bytes.length - _start == 0) {\\n return bytes('');\\n }\\n\\n return slice(_bytes, _start, _bytes.length - _start);\\n }\\n\\n function toBytes32PadLeft(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes32)\\n {\\n bytes32 ret;\\n uint256 len = _bytes.length <= 32 ? _bytes.length : 32;\\n assembly {\\n ret := shr(mul(sub(32, len), 8), mload(add(_bytes, 32)))\\n }\\n return ret;\\n }\\n\\n function toBytes32(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes32)\\n {\\n if (_bytes.length < 32) {\\n bytes32 ret;\\n assembly {\\n ret := mload(add(_bytes, 32))\\n }\\n return ret;\\n }\\n\\n return abi.decode(_bytes,(bytes32)); // will truncate if input length > 32 bytes\\n }\\n\\n function toUint256(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (uint256)\\n {\\n return uint256(toBytes32(_bytes));\\n }\\n\\n function toUint24(bytes memory _bytes, uint256 _start) internal pure returns (uint24) {\\n require(_start + 3 >= _start, \\\"toUint24_overflow\\\");\\n require(_bytes.length >= _start + 3 , \\\"toUint24_outOfBounds\\\");\\n uint24 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x3), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toUint8(bytes memory _bytes, uint256 _start) internal pure returns (uint8) {\\n require(_start + 1 >= _start, \\\"toUint8_overflow\\\");\\n require(_bytes.length >= _start + 1 , \\\"toUint8_outOfBounds\\\");\\n uint8 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x1), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toAddress(bytes memory _bytes, uint256 _start) internal pure returns (address) {\\n require(_start + 20 >= _start, \\\"toAddress_overflow\\\");\\n require(_bytes.length >= _start + 20, \\\"toAddress_outOfBounds\\\");\\n address tempAddress;\\n\\n assembly {\\n tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000)\\n }\\n\\n return tempAddress;\\n }\\n\\n function toNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n bytes memory nibbles = new bytes(_bytes.length * 2);\\n\\n for (uint256 i = 0; i < _bytes.length; i++) {\\n nibbles[i * 2] = _bytes[i] >> 4;\\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\\n }\\n\\n return nibbles;\\n }\\n\\n function fromNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n bytes memory ret = new bytes(_bytes.length / 2);\\n\\n for (uint256 i = 0; i < ret.length; i++) {\\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\\n }\\n\\n return ret;\\n }\\n\\n function equal(\\n bytes memory _bytes,\\n bytes memory _other\\n )\\n internal\\n pure\\n returns (bool)\\n {\\n return keccak256(_bytes) == keccak256(_other);\\n }\\n}\\n\",\"keccak256\":\"0x849e4fedd81cd260e4c3b74b953f00636323574c60d363f36ab331e94aab9219\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_ECDSAUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.7.0;\\n\\n/**\\n * @title Lib_ECDSAUtils\\n */\\nlibrary Lib_ECDSAUtils {\\n\\n /**************************************\\n * Internal Functions: ECDSA Recovery *\\n **************************************/\\n\\n /**\\n * Recovers a signed address given a message and signature.\\n * @param _message Message that was originally signed.\\n * @param _isEthSignedMessage Whether or not the user used the `Ethereum Signed Message` prefix.\\n * @param _v Signature `v` parameter.\\n * @param _r Signature `r` parameter.\\n * @param _s Signature `s` parameter.\\n * @return _sender Signer address.\\n */\\n function recover(\\n bytes memory _message,\\n bool _isEthSignedMessage,\\n uint8 _v,\\n bytes32 _r,\\n bytes32 _s\\n )\\n internal\\n pure\\n returns (\\n address _sender\\n )\\n {\\n bytes32 messageHash = getMessageHash(_message, _isEthSignedMessage);\\n\\n return ecrecover(\\n messageHash,\\n _v + 27,\\n _r,\\n _s\\n );\\n }\\n\\n function getMessageHash(\\n bytes memory _message,\\n bool _isEthSignedMessage\\n )\\n internal\\n pure\\n returns (bytes32) {\\n if (_isEthSignedMessage) {\\n return getEthSignedMessageHash(_message);\\n }\\n return getNativeMessageHash(_message);\\n }\\n\\n\\n /*************************************\\n * Private Functions: ECDSA Recovery *\\n *************************************/\\n\\n /**\\n * Gets the native message hash (simple keccak256) for a message.\\n * @param _message Message to hash.\\n * @return _messageHash Native message hash.\\n */\\n function getNativeMessageHash(\\n bytes memory _message\\n )\\n private\\n pure\\n returns (\\n bytes32 _messageHash\\n )\\n {\\n return keccak256(_message);\\n }\\n\\n /**\\n * Gets the hash of a message with the `Ethereum Signed Message` prefix.\\n * @param _message Message to hash.\\n * @return _messageHash Prefixed message hash.\\n */\\n function getEthSignedMessageHash(\\n bytes memory _message\\n )\\n private\\n pure\\n returns (\\n bytes32 _messageHash\\n )\\n {\\n bytes memory prefix = \\\"\\\\x19Ethereum Signed Message:\\\\n32\\\";\\n bytes32 messageHash = keccak256(_message);\\n return keccak256(abi.encodePacked(prefix, messageHash));\\n }\\n}\",\"keccak256\":\"0x7d6a4cb0f462bfbd9fa703a8ab95156a5f066a15aeeb8e683c90c93fc71736f2\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_EthUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.7.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"./Lib_Bytes32Utils.sol\\\";\\n\\n/**\\n * @title Lib_EthUtils\\n */\\nlibrary Lib_EthUtils {\\n\\n /***********************************\\n * Internal Functions: Code Access *\\n ***********************************/\\n\\n /**\\n * Gets the code for a given address.\\n * @param _address Address to get code for.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return _code Code read from the contract.\\n */\\n function getCode(\\n address _address,\\n uint256 _offset,\\n uint256 _length\\n )\\n internal\\n view\\n returns (\\n bytes memory _code\\n )\\n {\\n assembly {\\n _code := mload(0x40)\\n mstore(0x40, add(_code, add(_length, 0x20)))\\n mstore(_code, _length)\\n extcodecopy(_address, add(_code, 0x20), _offset, _length)\\n }\\n\\n return _code;\\n }\\n\\n /**\\n * Gets the full code for a given address.\\n * @param _address Address to get code for.\\n * @return _code Full code of the contract.\\n */\\n function getCode(\\n address _address\\n )\\n internal\\n view\\n returns (\\n bytes memory _code\\n )\\n {\\n return getCode(\\n _address,\\n 0,\\n getCodeSize(_address)\\n );\\n }\\n\\n /**\\n * Gets the size of a contract's code in bytes.\\n * @param _address Address to get code size for.\\n * @return _codeSize Size of the contract's code in bytes.\\n */\\n function getCodeSize(\\n address _address\\n )\\n internal\\n view\\n returns (\\n uint256 _codeSize\\n )\\n {\\n assembly {\\n _codeSize := extcodesize(_address)\\n }\\n\\n return _codeSize;\\n }\\n\\n /**\\n * Gets the hash of a contract's code.\\n * @param _address Address to get a code hash for.\\n * @return _codeHash Hash of the contract's code.\\n */\\n function getCodeHash(\\n address _address\\n )\\n internal\\n view\\n returns (\\n bytes32 _codeHash\\n )\\n {\\n assembly {\\n _codeHash := extcodehash(_address)\\n }\\n\\n return _codeHash;\\n }\\n\\n\\n /*****************************************\\n * Internal Functions: Contract Creation *\\n *****************************************/\\n\\n /**\\n * Creates a contract with some given initialization code.\\n * @param _code Contract initialization code.\\n * @return _created Address of the created contract.\\n */\\n function createContract(\\n bytes memory _code\\n )\\n internal\\n returns (\\n address _created\\n )\\n {\\n assembly {\\n _created := create(\\n 0,\\n add(_code, 0x20),\\n mload(_code)\\n )\\n }\\n\\n return _created;\\n }\\n\\n /**\\n * Computes the address that would be generated by CREATE.\\n * @param _creator Address creating the contract.\\n * @param _nonce Creator's nonce.\\n * @return _address Address to be generated by CREATE.\\n */\\n function getAddressForCREATE(\\n address _creator,\\n uint256 _nonce\\n )\\n internal\\n pure\\n returns (\\n address _address\\n )\\n {\\n bytes[] memory encoded = new bytes[](2);\\n encoded[0] = Lib_RLPWriter.writeAddress(_creator);\\n encoded[1] = Lib_RLPWriter.writeUint(_nonce);\\n\\n bytes memory encodedList = Lib_RLPWriter.writeList(encoded);\\n return Lib_Bytes32Utils.toAddress(keccak256(encodedList));\\n }\\n\\n /**\\n * Computes the address that would be generated by CREATE2.\\n * @param _creator Address creating the contract.\\n * @param _bytecode Bytecode of the contract to be created.\\n * @param _salt 32 byte salt value mixed into the hash.\\n * @return _address Address to be generated by CREATE2.\\n */\\n function getAddressForCREATE2(\\n address _creator,\\n bytes memory _bytecode,\\n bytes32 _salt\\n )\\n internal\\n pure\\n returns (address _address)\\n {\\n bytes32 hashedData = keccak256(abi.encodePacked(\\n byte(0xff),\\n _creator,\\n _salt,\\n keccak256(_bytecode)\\n ));\\n\\n return Lib_Bytes32Utils.toAddress(hashedData);\\n }\\n}\\n\",\"keccak256\":\"0x9cc5440ff8fbe2fea9faf929a5a16a172bfaebedca26b8bafbf4ed459038f1e2\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.7.0;\\n\\n/**\\n * @title Lib_Math\\n */\\nlibrary Lib_Math {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Calculates the minumum of two numbers.\\n * @param _x First number to compare.\\n * @param _y Second number to compare.\\n * @return Lesser of the two numbers.\\n */\\n function min(\\n uint256 _x,\\n uint256 _y\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n if (_x < _y) {\\n return _x;\\n }\\n\\n return _y;\\n }\\n}\\n\",\"keccak256\":\"0x0f5a022dfc2b4dbbc330198c6045446fbcae8ef2171d4e3466eb5e510b368f14\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_MerkleTree.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.7.0;\\n\\n/**\\n * @title Lib_MerkleTree\\n * @author River Keefer\\n */\\nlibrary Lib_MerkleTree {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Calculates a merkle root for a list of 32-byte leaf hashes. WARNING: If the number\\n * of leaves passed in is not a power of two, it pads out the tree with zero hashes.\\n * If you do not know the original length of elements for the tree you are verifying,\\n * then this may allow empty leaves past _elements.length to pass a verification check down the line.\\n * @param _elements Array of hashes from which to generate a merkle root.\\n * @return Merkle root of the leaves, with zero hashes for non-powers-of-two (see above).\\n */\\n function getMerkleRoot(\\n bytes32[] memory _elements\\n )\\n internal\\n view\\n returns (\\n bytes32\\n )\\n {\\n require(\\n _elements.length > 0,\\n \\\"Lib_MerkleTree: Must provide at least one leaf hash.\\\"\\n );\\n\\n if (_elements.length == 0) {\\n return _elements[0];\\n }\\n\\n uint256[16] memory defaults = [\\n 0x290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563,\\n 0x633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d,\\n 0x890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d,\\n 0x3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd8,\\n 0xecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da,\\n 0xdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da5,\\n 0x617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d7,\\n 0x292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead,\\n 0xe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e10,\\n 0x7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f82,\\n 0xe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e83636516,\\n 0x3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c,\\n 0xad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e,\\n 0xa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab,\\n 0x4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c862,\\n 0x2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf10\\n ];\\n\\n // Reserve memory space for our hashes.\\n bytes memory buf = new bytes(64);\\n\\n // We'll need to keep track of left and right siblings.\\n bytes32 leftSibling;\\n bytes32 rightSibling;\\n\\n // Number of non-empty nodes at the current depth.\\n uint256 rowSize = _elements.length;\\n\\n // Current depth, counting from 0 at the leaves\\n uint256 depth = 0;\\n\\n // Common sub-expressions\\n uint256 halfRowSize; // rowSize / 2\\n bool rowSizeIsOdd; // rowSize % 2 == 1\\n\\n while (rowSize > 1) {\\n halfRowSize = rowSize / 2;\\n rowSizeIsOdd = rowSize % 2 == 1;\\n\\n for (uint256 i = 0; i < halfRowSize; i++) {\\n leftSibling = _elements[(2 * i) ];\\n rightSibling = _elements[(2 * i) + 1];\\n assembly {\\n mstore(add(buf, 32), leftSibling )\\n mstore(add(buf, 64), rightSibling)\\n }\\n\\n _elements[i] = keccak256(buf);\\n }\\n\\n if (rowSizeIsOdd) {\\n leftSibling = _elements[rowSize - 1];\\n rightSibling = bytes32(defaults[depth]);\\n assembly {\\n mstore(add(buf, 32), leftSibling)\\n mstore(add(buf, 64), rightSibling)\\n }\\n\\n _elements[halfRowSize] = keccak256(buf);\\n }\\n\\n rowSize = halfRowSize + (rowSizeIsOdd ? 1 : 0);\\n depth++;\\n }\\n\\n return _elements[0];\\n }\\n\\n /**\\n * Verifies a merkle branch for the given leaf hash. Assumes the original length\\n * of leaves generated is a known, correct input, and does not return true for indices \\n * extending past that index (even if _siblings would be otherwise valid.)\\n * @param _root The Merkle root to verify against.\\n * @param _leaf The leaf hash to verify inclusion of.\\n * @param _index The index in the tree of this leaf.\\n * @param _siblings Array of sibline nodes in the inclusion proof, starting from depth 0 (bottom of the tree). \\n * @param _totalLeaves The total number of leaves originally passed into.\\n * @return Whether or not the merkle branch and leaf passes verification.\\n */\\n function verify(\\n bytes32 _root,\\n bytes32 _leaf,\\n uint256 _index,\\n bytes32[] memory _siblings,\\n uint256 _totalLeaves\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n require(\\n _totalLeaves > 0,\\n \\\"Lib_MerkleTree: Total leaves must be greater than zero.\\\"\\n );\\n\\n require(\\n _index < _totalLeaves,\\n \\\"Lib_MerkleTree: Index out of bounds.\\\"\\n );\\n\\n require(\\n _siblings.length == _ceilLog2(_totalLeaves),\\n \\\"Lib_MerkleTree: Total siblings does not correctly correspond to total leaves.\\\"\\n );\\n\\n bytes32 computedRoot = _leaf;\\n\\n for (uint256 i = 0; i < _siblings.length; i++) {\\n if ((_index & 1) == 1) {\\n computedRoot = keccak256(\\n abi.encodePacked(\\n _siblings[i],\\n computedRoot\\n )\\n );\\n } else {\\n computedRoot = keccak256(\\n abi.encodePacked(\\n computedRoot,\\n _siblings[i]\\n )\\n );\\n }\\n\\n _index >>= 1;\\n }\\n\\n return _root == computedRoot;\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Calculates the integer ceiling of the log base 2 of an input.\\n * @param _in Unsigned input to calculate the log.\\n * @return ceil(log_base_2(_in))\\n */\\n function _ceilLog2(\\n uint256 _in\\n )\\n private\\n pure\\n returns (\\n uint256\\n )\\n { \\n require(\\n _in > 0,\\n \\\"Lib_MerkleTree: Cannot compute ceil(log_2) of 0.\\\"\\n );\\n\\n if (_in == 1) {\\n return 0;\\n }\\n\\n // Find the highest set bit (will be floor(log_2)).\\n // Borrowed with <3 from https://github.com/ethereum/solidity-examples\\n uint256 val = _in;\\n uint256 highest = 0;\\n for (uint8 i = 128; i >= 1; i >>= 1) {\\n if (val & (uint(1) << i) - 1 << i != 0) {\\n highest += i;\\n val >>= i;\\n }\\n }\\n\\n // Increment by one if this is not a perfect logarithm.\\n if ((uint(1) << highest) != _in) {\\n highest += 1;\\n }\\n\\n return highest;\\n }\\n}\\n\",\"keccak256\":\"0x5a859eccd3c4e7e31db90f3022069a725d5389e16fbcace3fe653d6b0acf80f6\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.7.0;\\n\\n/**\\n * @title Lib_SafeExecutionManagerWrapper\\n */\\nlibrary Lib_SafeExecutionManagerWrapper {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Makes an ovmCALL and performs all the necessary safety checks.\\n * @param _gasLimit Gas limit for the call.\\n * @param _target Address to call.\\n * @param _calldata Data to send to the call.\\n * @return _success Whether or not the call reverted.\\n * @return _returndata Data returned by the call.\\n */\\n function safeCALL(\\n uint256 _gasLimit,\\n address _target,\\n bytes memory _calldata\\n )\\n internal\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCALL(uint256,address,bytes)\\\",\\n _gasLimit,\\n _target,\\n _calldata\\n )\\n );\\n\\n return abi.decode(returndata, (bool, bytes));\\n }\\n\\n /**\\n * Makes an ovmCALL and performs all the necessary safety checks.\\n * @param _gasLimit Gas limit for the call.\\n * @param _target Address to call.\\n * @param _calldata Data to send to the call.\\n * @return _success Whether or not the call reverted.\\n * @return _returndata Data returned by the call.\\n */\\n function safeDELEGATECALL(\\n uint256 _gasLimit,\\n address _target,\\n bytes memory _calldata\\n )\\n internal\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmDELEGATECALL(uint256,address,bytes)\\\",\\n _gasLimit,\\n _target,\\n _calldata\\n )\\n );\\n\\n return abi.decode(returndata, (bool, bytes));\\n }\\n\\n /**\\n * Performs an ovmCREATE and the necessary safety checks.\\n * @param _gasLimit Gas limit for the creation.\\n * @param _bytecode Code for the new contract.\\n * @return _contract Address of the created contract.\\n */\\n function safeCREATE(\\n uint256 _gasLimit,\\n bytes memory _bytecode\\n )\\n internal\\n returns (\\n address _contract\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n _gasLimit,\\n abi.encodeWithSignature(\\n \\\"ovmCREATE(bytes)\\\",\\n _bytecode\\n )\\n );\\n\\n return abi.decode(returndata, (address));\\n }\\n\\n /**\\n * Performs an ovmEXTCODESIZE and the necessary safety checks.\\n * @param _contract Address of the contract to query the size of.\\n * @return _EXTCODESIZE Size of the requested contract in bytes.\\n */\\n function safeEXTCODESIZE(\\n address _contract\\n )\\n internal\\n returns (\\n uint256 _EXTCODESIZE\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmEXTCODESIZE(address)\\\",\\n _contract\\n )\\n );\\n\\n return abi.decode(returndata, (uint256));\\n }\\n\\n /**\\n * Performs a safe ovmCHAINID call.\\n * @return _CHAINID Result of calling ovmCHAINID.\\n */\\n function safeCHAINID()\\n internal\\n returns (\\n uint256 _CHAINID\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCHAINID()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (uint256));\\n }\\n\\n /**\\n * Performs a safe ovmCALLER call.\\n * @return _CALLER Result of calling ovmCALLER.\\n */\\n function safeCALLER()\\n internal\\n returns (\\n address _CALLER\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCALLER()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (address));\\n }\\n\\n /**\\n * Performs a safe ovmADDRESS call.\\n * @return _ADDRESS Result of calling ovmADDRESS.\\n */\\n function safeADDRESS()\\n internal\\n returns (\\n address _ADDRESS\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmADDRESS()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (address));\\n }\\n\\n /**\\n * Performs a safe ovmGETNONCE call.\\n * @return _nonce Result of calling ovmGETNONCE.\\n */\\n function safeGETNONCE()\\n internal\\n returns (\\n uint256 _nonce\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmGETNONCE()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (uint256));\\n }\\n\\n /**\\n * Performs a safe ovmSETNONCE call.\\n * @param _nonce New account nonce.\\n */\\n function safeSETNONCE(\\n uint256 _nonce\\n )\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmSETNONCE(uint256)\\\",\\n _nonce\\n )\\n );\\n }\\n\\n /**\\n * Performs a safe ovmCREATEEOA call.\\n * @param _messageHash Message hash which was signed by EOA\\n * @param _v v value of signature (0 or 1)\\n * @param _r r value of signature\\n * @param _s s value of signature\\n */\\n function safeCREATEEOA(\\n bytes32 _messageHash,\\n uint8 _v,\\n bytes32 _r,\\n bytes32 _s\\n )\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCREATEEOA(bytes32,uint8,bytes32,bytes32)\\\",\\n _messageHash,\\n _v,\\n _r,\\n _s\\n )\\n );\\n }\\n\\n /**\\n * Performs a safe REVERT.\\n * @param _reason String revert reason to pass along with the REVERT.\\n */\\n function safeREVERT(\\n string memory _reason\\n )\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmREVERT(bytes)\\\",\\n bytes(_reason)\\n )\\n );\\n }\\n\\n /**\\n * Performs a safe \\\"require\\\".\\n * @param _condition Boolean condition that must be true or will revert.\\n * @param _reason String revert reason to pass along with the REVERT.\\n */\\n function safeREQUIRE(\\n bool _condition,\\n string memory _reason\\n )\\n internal\\n {\\n if (!_condition) {\\n safeREVERT(\\n _reason\\n );\\n }\\n }\\n\\n /**\\n * Performs a safe ovmSLOAD call.\\n */\\n function safeSLOAD(\\n bytes32 _key\\n )\\n internal\\n returns (\\n bytes32\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmSLOAD(bytes32)\\\",\\n _key\\n )\\n );\\n\\n return abi.decode(returndata, (bytes32));\\n }\\n\\n /**\\n * Performs a safe ovmSSTORE call.\\n */\\n function safeSSTORE(\\n bytes32 _key,\\n bytes32 _value\\n )\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmSSTORE(bytes32,bytes32)\\\",\\n _key,\\n _value\\n )\\n );\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Performs an ovm interaction and the necessary safety checks.\\n * @param _gasLimit Gas limit for the interaction.\\n * @param _calldata Data to send to the OVM_ExecutionManager (encoded with sighash).\\n * @return _returndata Data sent back by the OVM_ExecutionManager.\\n */\\n function _safeExecutionManagerInteraction(\\n uint256 _gasLimit,\\n bytes memory _calldata\\n )\\n private\\n returns (\\n bytes memory _returndata\\n )\\n {\\n address ovmExecutionManager = msg.sender;\\n (\\n bool success,\\n bytes memory returndata\\n ) = ovmExecutionManager.call{gas: _gasLimit}(_calldata);\\n\\n if (success == false) {\\n assembly {\\n revert(add(returndata, 0x20), mload(returndata))\\n }\\n } else if (returndata.length == 1) {\\n assembly {\\n return(0, 1)\\n }\\n } else {\\n return returndata;\\n }\\n }\\n\\n function _safeExecutionManagerInteraction(\\n bytes memory _calldata\\n )\\n private\\n returns (\\n bytes memory _returndata\\n )\\n {\\n return _safeExecutionManagerInteraction(\\n gasleft(),\\n _calldata\\n );\\n }\\n}\\n\",\"keccak256\":\"0xdc30487ca1580f3498d4a1c4e26dc53158c00b44bd72da212a66267c22a139b0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/wrappers/Lib_SafeMathWrapper.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// Pulled from @openzeppelin/contracts/math/SafeMath.sol\\npragma solidity ^0.7.0;\\n\\n/* Library Imports */\\nimport { Lib_SafeExecutionManagerWrapper } from \\\"./Lib_SafeExecutionManagerWrapper.sol\\\";\\n\\n/**\\n * @title Lib_SafeMathWrapper\\n */\\n\\n/**\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\n * checks.\\n *\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\n * in bugs, because programmers usually assume that an overflow raises an\\n * error, which is the standard behavior in high level programming languages.\\n * `SafeMath` restores this intuition by reverting the transaction when an\\n * operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n */\\n\\nlibrary Lib_SafeMathWrapper {\\n /**\\n * @dev Returns the addition of two unsigned integers, reverting on\\n * overflow.\\n *\\n * Counterpart to Solidity's `+` operator.\\n *\\n * Requirements:\\n *\\n * - Addition cannot overflow.\\n */\\n function add(uint256 a, uint256 b) internal returns (uint256) {\\n uint256 c = a + b;\\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(c >= a, \\\"Lib_SafeMathWrapper: addition overflow\\\");\\n\\n return c;\\n }\\n\\n /**\\n * @dev Returns the subtraction of two unsigned integers, reverting on\\n * overflow (when the result is negative).\\n *\\n * Counterpart to Solidity's `-` operator.\\n *\\n * Requirements:\\n *\\n * - Subtraction cannot overflow.\\n */\\n function sub(uint256 a, uint256 b) internal returns (uint256) {\\n return sub(a, b, \\\"Lib_SafeMathWrapper: subtraction overflow\\\");\\n }\\n\\n /**\\n * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\n * overflow (when the result is negative).\\n *\\n * Counterpart to Solidity's `-` operator.\\n *\\n * Requirements:\\n *\\n * - Subtraction cannot overflow.\\n */\\n function sub(uint256 a, uint256 b, string memory errorMessage) internal returns (uint256) {\\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(b <= a, errorMessage);\\n uint256 c = a - b;\\n\\n return c;\\n }\\n\\n /**\\n * @dev Returns the multiplication of two unsigned integers, reverting on\\n * overflow.\\n *\\n * Counterpart to Solidity's `*` operator.\\n *\\n * Requirements:\\n *\\n * - Multiplication cannot overflow.\\n */\\n function mul(uint256 a, uint256 b) internal returns (uint256) {\\n // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\n // benefit is lost if 'b' is also tested.\\n // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\n if (a == 0) {\\n return 0;\\n }\\n\\n uint256 c = a * b;\\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(c / a == b, \\\"Lib_SafeMathWrapper: multiplication overflow\\\");\\n\\n return c;\\n }\\n\\n /**\\n * @dev Returns the integer division of two unsigned integers. Reverts on\\n * division by zero. The result is rounded towards zero.\\n *\\n * Counterpart to Solidity's `/` operator. Note: this function uses a\\n * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n * uses an invalid opcode to revert (consuming all remaining gas).\\n *\\n * Requirements:\\n *\\n * - The divisor cannot be zero.\\n */\\n function div(uint256 a, uint256 b) internal returns (uint256) {\\n return div(a, b, \\\"Lib_SafeMathWrapper: division by zero\\\");\\n }\\n\\n /**\\n * @dev Returns the integer division of two unsigned integers. Reverts with custom message on\\n * division by zero. The result is rounded towards zero.\\n *\\n * Counterpart to Solidity's `/` operator. Note: this function uses a\\n * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n * uses an invalid opcode to revert (consuming all remaining gas).\\n *\\n * Requirements:\\n *\\n * - The divisor cannot be zero.\\n */\\n function div(uint256 a, uint256 b, string memory errorMessage) internal returns (uint256) {\\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(b > 0, errorMessage);\\n uint256 c = a / b;\\n // assert(a == b * c + a % b); // There is no case in which this doesn't hold\\n\\n return c;\\n }\\n\\n /**\\n * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n * Reverts when dividing by zero.\\n *\\n * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n * opcode (which leaves remaining gas untouched) while Solidity uses an\\n * invalid opcode to revert (consuming all remaining gas).\\n *\\n * Requirements:\\n *\\n * - The divisor cannot be zero.\\n */\\n function mod(uint256 a, uint256 b) internal returns (uint256) {\\n return mod(a, b, \\\"Lib_SafeMathWrapper: modulo by zero\\\");\\n }\\n\\n /**\\n * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n * Reverts with custom message when dividing by zero.\\n *\\n * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n * opcode (which leaves remaining gas untouched) while Solidity uses an\\n * invalid opcode to revert (consuming all remaining gas).\\n *\\n * Requirements:\\n *\\n * - The divisor cannot be zero.\\n */\\n function mod(uint256 a, uint256 b, string memory errorMessage) internal returns (uint256) {\\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(b != 0, errorMessage);\\n return a % b;\\n }\\n}\",\"keccak256\":\"0x529f1ddb3002186d9240e20557495c8fb339a5d384552c1c05bd27641db2a7b2\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x60806040523480156200001157600080fd5b50604051620031a8380380620031a8833981016040819052620000349162000067565b600080546001600160a01b0319166001600160a01b039590951694909417909355600191909155600255600355620000b2565b600080600080608085870312156200007d578384fd5b84516001600160a01b038116811462000094578485fd5b60208601516040870151606090970151919890975090945092505050565b6130e680620000c26000396000f3fe608060405234801561001057600080fd5b50600436106101215760003560e01c80638d38c6c1116100ad578063d0f8934411610071578063d0f893441461020e578063e10d29ee14610216578063e561dddc1461021e578063f722b41a14610226578063facdc5da1461022e57610121565b80638d38c6c1146101e6578063b8f77005146101ee578063c139eb15146101f6578063c2cf696f146101fe578063cfdf677e1461020657610121565b80636fee07e0116100f45780636fee07e0146101a457806378f4b2f2146101b95780637a167a8a146101c15780637aa63a86146101d6578063876ed5cb146101de57610121565b8063138387a4146101265780632a7f18be14610144578063461a4478146101645780634de569ce14610184575b600080fd5b61012e610241565b60405161013b9190612eb2565b60405180910390f35b610157610152366004612346565b610247565b60405161013b9190612e84565b6101776101723660046121d9565b610394565b60405161013b91906123a9565b61019761019236600461221f565b610470565b60405161013b9190612442565b6101b76101b2366004612146565b6104aa565b005b61012e6106cd565b6101c96106d4565b60405161013b9190612ee2565b61012e6106e9565b61012e610704565b61012e61070a565b6101c9610710565b61012e610799565b61012e61079f565b6101776107a4565b6101b76107cc565b610177610bb3565b61012e610bd6565b6101c9610c50565b6101b761023c366004612346565b610c68565b60025481565b61024f611e97565b60028202600061025d610bb3565b6001600160a01b0316639507d39a836040518263ffffffff1660e01b81526004016102889190612ee2565b60206040518083038186803b1580156102a057600080fd5b505afa1580156102b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102d891906121c1565b905060006102e4610bb3565b6001600160a01b0316639507d39a846001016040518263ffffffff1660e01b81526004016103129190612ee2565b60206040518083038186803b15801561032a57600080fd5b505afa15801561033e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061036291906121c1565b6040805160608101825293845264ffffffffff808316602086015260289290921c90911690830152509150505b919050565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b838110156103f45781810151838201526020016103dc565b50505050905090810190601f1680156104215780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561043e57600080fd5b505afa158015610452573d6000803e3d6000fd5b505050506040513d602081101561046857600080fd5b505192915050565b82516000901515600114156104925761048b85858585610dcb565b90506104a2565b61048b8585602001518585610f96565b949350505050565b612710815111156104d65760405162461bcd60e51b81526004016104cd9061255e565b60405180910390fd5b6003548211156104f85760405162461bcd60e51b81526004016104cd90612764565b620186a082101561051b5760405162461bcd60e51b81526004016104cd90612946565b6020820460005a90508181116105435760405162461bcd60e51b81526004016104cd90612bc0565b60005b825a8303101561055857600101610546565b60003387878760405160200161057194939291906123bd565b60408051601f19818403018152919052805160209091012090504360281b4217610599610bb3565b6001600160a01b031663d41c021883836040518363ffffffff1660e01b81526004016105c692919061249b565b600060405180830381600087803b1580156105e057600080fd5b505af11580156105f4573d6000803e3d6000fd5b5050505060006002610604610bb3565b6001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b15801561063c57600080fd5b505afa158015610650573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061067491906121c1565b8161067b57fe5b0490507f4b388aecf9fa6cc92253704e5975a6129a4f735bdbd99567df4ed0094ee4ceb5338a8a8a60018603426040516106ba969594939291906123fa565b60405180910390a1505050505050505050565b620186a081565b6000806106df61106b565b5090935050505090565b6000806106f461106b565b50505064ffffffffff1692915050565b61271081565b60035481565b6000600261071c610bb3565b6001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b15801561075457600080fd5b505afa158015610768573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061078c91906121c1565b8161079357fe5b04905090565b60015481565b602081565b60006107c760405180606001604052806025815260200161305860259139610394565b905090565b60043560d81c60093560e890811c90600c35901c6107e86106e9565b8364ffffffffff161461080d5760405162461bcd60e51b81526004016104cd90612a6b565b61083b6040518060400160405280600d81526020016c27ab26afa9b2b8bab2b731b2b960991b815250610394565b6001600160a01b0316336001600160a01b03161461086b5760405162461bcd60e51b81526004016104cd90612ac8565b60008162ffffff16116108905760405162461bcd60e51b81526004016104cd906127c1565b60008262ffffff16116108b55760405162461bcd60e51b81526004016104cd90612d15565b600f601062ffffff831602013664ffffffffff82168110156108e95760405162461bcd60e51b81526004016104cd90612d9c565b60006108f3610710565b905060008562ffffff1667ffffffffffffffff8111801561091357600080fd5b5060405190808252806020026020018201604052801561093d578160200160208202803683370190505b509050600080600061094d6106d4565b9050610957611eb7565b60005b8962ffffff168163ffffffff161015610a8a57600061097e8263ffffffff16611119565b905063ffffffff82166109945761099481611169565b61099f838286611236565b80925060005b835163ffffffff82161015610a00578a3560e81c6109cb8564ffffffffff8e1683611346565b898963ffffffff16815181106109dd57fe5b60209081029190910101529a909a016003019960019687019695860195016109a5565b5060005b83602001518163ffffffff161015610a80578864ffffffffff168564ffffffffff1610610a435760405162461bcd60e51b81526004016104cd90612dde565b610a538564ffffffffff166113d0565b888863ffffffff1681518110610a6557fe5b60209081029190910101526001968701969485019401610a04565b505060010161095a565b50610a948161141b565b8764ffffffffff168714610aba5760405162461bcd60e51b81526004016104cd90612809565b8962ffffff168463ffffffff1614610ae45760405162461bcd60e51b81526004016104cd90612857565b6000838b62ffffff160363ffffffff169050600080836020015160001415610b1757505060408201516060830151610b3e565b6000610b2c6001870364ffffffffff16610247565b90508060200151925080604001519150505b610b5f610b4a89611463565b8e62ffffff168564ffffffffff168585611893565b7f602f1aeac0ca2e7a13e281a9ef0ad7838542712ce16780fa2ecffd351f05f89983860384610b8c6106e9565b604051610b9b93929190612ef4565b60405180910390a15050505050505050505050505050565b60006107c7604051806060016040528060238152602001612f3b60239139610394565b6000610be06107a4565b6001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b158015610c1857600080fd5b505afa158015610c2c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107c791906121c1565b6000610c5a6106d4565b610c62610710565b03905090565b60405162461bcd60e51b81526004016104cd906124ce565b83811015610d4557610cb66040518060400160405280600d81526020016c27ab26afa9b2b8bab2b731b2b960991b815250610394565b6001600160a01b0316336001600160a01b031614610d12576000610ce08364ffffffffff16610247565b905042600154826020015164ffffffffff160110610d105760405162461bcd60e51b81526004016104cd906129f8565b505b610d228264ffffffffff166113d0565b838281518110610d2e57fe5b602090810291909101015260019182019101610c80565b506000610d5b6001830364ffffffffff16610247565b9050610d7a610d6984611463565b858684602001518560400151611893565b7f64d7f508348c70dea42d5302a393987e4abc20e45954ab3f9d320207751956f0848364ffffffffff160385610dae6106e9565b604051610dbd93929190612ebb565b60405180910390a150505050565b600080610e036040518060400160405280601481526020017327ab26afa2bc32b1baba34b7b726b0b730b3b2b960611b815250610394565b90506000816001600160a01b0316631c4712a76040518163ffffffff1660e01b815260040160206040518083038186803b158015610e4057600080fd5b505afa158015610e54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e7891906121c1565b90506000610e8587611a4d565b9050610e92818787611ae6565b610eae5760405162461bcd60e51b81526004016104cd9061268d565b86606001518860200151148015610ec9575060408701518851145b8015610f0a5750610ef1604051806060016040528060228152602001612f5e60229139610394565b6001600160a01b031688608001516001600160a01b0316145b8015610f195750818860a00151145b8015610f30575060608801516001600160a01b0316155b8015610f4b5750600088604001516001811115610f4957fe5b145b8015610f6c57508660800151805190602001208860c0015180519060200120145b610f885760405162461bcd60e51b81526004016104cd9061272d565b506001979650505050505050565b600080610fa2856113d0565b9050610faf818585611ae6565b610fcb5760405162461bcd60e51b81526004016104cd90612c60565b6000866060015187608001518860a001518960c00151604051602001610ff494939291906123bd565b604051602081830303815290604052805190602001209050600061101787610247565b80519091508214801561103557508751602082015164ffffffffff16145b801561104f57508760200151816040015164ffffffffff16145b610f885760405162461bcd60e51b81526004016104cd90612b15565b600080600080600061107b6107a4565b6001600160a01b031663ccf8f9696040518163ffffffff1660e01b815260040160206040518083038186803b1580156110b357600080fd5b505afa1580156110c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110eb919061219b565b64ffffffffff602882901c811697605083901c82169750607883901c8216965060a09290921c169350915050565b611121611eb7565b5060408051608081018252601092909202600f81013560e890811c84526012820135901c6020840152601581013560d890811c92840192909252601a0135901c606082015290565b60006111736106e9565b11156111e35760008061118461106b565b9350935050508064ffffffffff16836060015110156111b55760405162461bcd60e51b81526004016104cd906126db565b8164ffffffffff16836040015110156111e05760405162461bcd60e51b81526004016104cd906125bb565b50505b42600154826040015101101561120b5760405162461bcd60e51b81526004016104cd90612d56565b4360025482606001510110156112335760405162461bcd60e51b81526004016104cd90612515565b50565b82604001518260400151101561125e5760405162461bcd60e51b81526004016104cd90612c0b565b8260600151826060015110156112865760405162461bcd60e51b81526004016104cd90612e27565b600081611291610710565b0364ffffffffff1611156113415760006112b18264ffffffffff16610247565b9050600154816020015164ffffffffff160142106112e15760405162461bcd60e51b81526004016104cd9061260a565b806020015164ffffffffff16836040015111156113105760405162461bcd60e51b81526004016104cd9061298f565b806040015164ffffffffff168360600151111561133f5760405162461bcd60e51b81526004016104cd90612caa565b505b505050565b6000808260410167ffffffffffffffff8111801561136357600080fd5b506040519080825280601f01601f19166020018201604052801561138e576020820181803683370190505b50604086015160608701519192509060006020840160018153836001820152826021820152866003890160418301376041870190209450505050509392505050565b60006114156040518060a00160405280600015158152602001848152602001600081526020016000815260200160405180602001604052806000815250815250611bd7565b92915050565b428160400151111561143f5760405162461bcd60e51b81526004016104cd90612b7b565b43816060015111156112335760405162461bcd60e51b81526004016104cd906128c7565b6000808251116114a45760405162461bcd60e51b815260040180806020018281038252603481526020018061307d6034913960400191505060405180910390fd5b81516114c657816000815181106114b757fe5b6020026020010151905061038f565b60408051610200810182527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56381527f633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d60208201527f890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d818301527f3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd86060808301919091527fecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da60808301527fdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da560a08301527f617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d760c08301527f292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead60e08301527fe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e106101008301527f7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f826101208301527fe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e836365166101408301527f3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c6101608301527fad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e6101808301527fa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab6101a08301527f4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c8626101c08301527f2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf106101e083015282518381529081018352909160009190602082018180368337505085519192506000918291508180805b600184111561186f5750506002820460018084161460005b828110156117eb578a816002028151811061179257fe5b602002602001015196508a81600202600101815181106117ae57fe5b6020026020010151955086602089015285604089015287805190602001208b82815181106117d857fe5b602090810291909101015260010161177b565b50801561184e5789600185038151811061180157fe5b6020026020010151955087836010811061181757fe5b602002015160001b945085602088015284604088015286805190602001208a838151811061184157fe5b6020026020010181815250505b8061185a57600061185d565b60015b60ff1682019350600190920191611763565b8960008151811061187c57fe5b602002602001015198505050505050505050919050565b6000806000806118a161106b565b935093509350935060006040518060a001604052806118be6107a4565b6001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b1580156118f657600080fd5b505afa15801561190a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061192e91906121c1565b81526020018b81526020018a81526020018664ffffffffff16815260200160405180602001604052806000815250815250905080600001517f127186556e7be68c7e31263195225b4de02820707889540969f62c05cf73525e82602001518360400151846060015185608001516040516119ab94939291906124a9565b60405180910390a260006119be82611c1f565b905060006119d6836040015188018b88018b8b611c48565b90506119e06107a4565b6001600160a01b0316632015276c83836040518363ffffffff1660e01b8152600401611a0d929190612485565b600060405180830381600087803b158015611a2757600080fd5b505af1158015611a3b573d6000803e3d6000fd5b50505050505050505050505050505050565b6080810151805160009190826041820167ffffffffffffffff81118015611a7357600080fd5b506040519080825280601f01601f191660200182016040528015611a9e576020820181803683370190505b5060408601516060870151919250906000602084016001815383600182015282602182015285604182018760208a0160045afa50604190950190942095505050505050919050565b6000611af06107a4565b8351604051634a83e9cd60e11b81526001600160a01b039290921691639507d39a91611b1e91600401612ed1565b60206040518083038186803b158015611b3657600080fd5b505afa158015611b4a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b6e91906121c1565b611b7784611c1f565b14611b945760405162461bcd60e51b81526004016104cd90612b4c565b611bb1836020015185846000015185602001518760400151611c67565b611bcd5760405162461bcd60e51b81526004016104cd9061290f565b5060019392505050565b8051602080830151604080850151606086015160808701519251600096611c0296909594910161244d565b604051602081830303815290604052805190602001209050919050565b60008160200151826040015183606001518460800151604051602001611c0294939291906124a9565b602892831b9390931760509190911b1760789290921b91909117901b90565b6000808211611ca75760405162461bcd60e51b8152600401808060200182810382526037815260200180612fd46037913960400191505060405180910390fd5b818410611ce55760405162461bcd60e51b8152600401808060200182810382526024815260200180612f806024913960400191505060405180910390fd5b611cee82611dec565b835114611d2c5760405162461bcd60e51b815260040180806020018281038252604d81526020018061300b604d913960600191505060405180910390fd5b8460005b8451811015611ddf578560011660011415611d8e57848181518110611d5157fe5b6020026020010151826040516020018083815260200182815260200192505050604051602081830303815290604052805190602001209150611dd3565b81858281518110611d9b57fe5b602002602001015160405160200180838152602001828152602001925050506040516020818303038152906040528051906020012091505b600195861c9501611d30565b5090951495945050505050565b6000808211611e2c5760405162461bcd60e51b8152600401808060200182810382526030815260200180612fa46030913960400191505060405180910390fd5b8160011415611e3d5750600061038f565b81600060805b60018160ff1610611e81578060ff1660018260ff166001901b03901b8316600014611e765760ff811692831c9291909101905b60011c607f16611e43565b506001811b8414611e90576001015b9392505050565b604080516060810182526000808252602082018190529181019190915290565b6040518060800160405280600081526020016000815260200160008152602001600081525090565b600067ffffffffffffffff831115611ef357fe5b611f06601f8401601f1916602001612f16565b9050828152838383011115611f1a57600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b038116811461038f57600080fd5b600082601f830112611f58578081fd5b611e9083833560208501611edf565b80356002811061038f57600080fd5b600060a08284031215611f87578081fd5b60405160a0810167ffffffffffffffff8282108183111715611fa557fe5b81604052829350843583526020850135602084015260408501356040840152606085013560608401526080850135915080821115611fe257600080fd5b50611fef85828601611f48565b6080830152505092915050565b60006040828403121561200d578081fd5b6040516040810167ffffffffffffffff828210818311171561202b57fe5b816040528293508435835260209150818501358181111561204b57600080fd5b8501601f8101871361205c57600080fd5b80358281111561206857fe5b8381029250612078848401612f16565b8181528481019083860185850187018b101561209357600080fd5b600095505b838610156120b6578035835260019590950194918601918601612098565b5080868801525050505050505092915050565b600060a082840312156120da578081fd5b60405160a0810167ffffffffffffffff82821081831117156120f857fe5b8160405282935084359150811515821461211157600080fd5b8183526020850135602084015260408501356040840152606085013560608401526080850135915080821115611fe257600080fd5b60008060006060848603121561215a578283fd5b61216384611f31565b925060208401359150604084013567ffffffffffffffff811115612185578182fd5b61219186828701611f48565b9150509250925092565b6000602082840312156121ac578081fd5b815164ffffffffff1981168114611e90578182fd5b6000602082840312156121d2578081fd5b5051919050565b6000602082840312156121ea578081fd5b813567ffffffffffffffff811115612200578182fd5b8201601f81018413612210578182fd5b6104a284823560208401611edf565b60008060008060808587031215612234578081fd5b843567ffffffffffffffff8082111561224b578283fd5b9086019060e0828903121561225e578283fd5b61226860e0612f16565b823581526020830135602082015261228260408401611f67565b604082015261229360608401611f31565b60608201526122a460808401611f31565b608082015260a083013560a082015260c0830135828111156122c4578485fd5b6122d08a828601611f48565b60c083015250955060208701359150808211156122eb578283fd5b6122f7888389016120c9565b9450604087013591508082111561230c578283fd5b61231888838901611f76565b9350606087013591508082111561232d578283fd5b5061233a87828801611ffc565b91505092959194509250565b600060208284031215612357578081fd5b5035919050565b60008151808452815b8181101561238357602081850181015186830182015201612367565b818111156123945782602083870101525b50601f01601f19169290920160200192915050565b6001600160a01b0391909116815260200190565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906123f09083018461235e565b9695505050505050565b6001600160a01b038781168252861660208201526040810185905260c06060820181905260009061242d9083018661235e565b60808301949094525060a00152949350505050565b901515815260200190565b6000861515825285602083015284604083015283606083015260a0608083015261247a60a083018461235e565b979650505050505050565b91825264ffffffffff1916602082015260400190565b918252602082015260400190565b6000858252846020830152836040830152608060608301526123f0608083018461235e565b60208082526027908201527f617070656e64517565756542617463682069732063757272656e746c7920646960408201526639b0b13632b21760c91b606082015260800190565b60208082526029908201527f436f6e7465787420626c6f636b206e756d62657220746f6f2066617220696e206040820152683a3432903830b9ba1760b91b606082015260800190565b6020808252603d908201527f5472616e73616374696f6e20646174612073697a652065786365656473206d6160408201527f78696d756d20666f7220726f6c6c7570207472616e73616374696f6e2e000000606082015260800190565b6020808252602f908201527f436f6e746578742074696d657374616d70206973206c6f776572207468616e2060408201526e3630b9ba1039bab136b4ba3a32b21760891b606082015260800190565b6020808252605b908201527f50726576696f75736c7920656e7175657565642062617463686573206861766560408201527f206578706972656420616e64206d75737420626520617070656e64656420626560608201527f666f72652061206e65772073657175656e6365722062617463682e0000000000608082015260a00190565b6020808252602e908201527f496e76616c69642053657175656e636572207472616e73616374696f6e20696e60408201526d31b63ab9b4b7b710383937b7b31760911b606082015260800190565b60208082526032908201527f436f6e7465787420626c6f636b206e756d626572206973206c6f77657220746860408201527130b7103630b9ba1039bab136b4ba3a32b21760711b606082015260800190565b6020808252601e908201527f496e76616c69642053657175656e636572207472616e73616374696f6e2e0000604082015260600190565b6020808252603d908201527f5472616e73616374696f6e20676173206c696d69742065786365656473206d6160408201527f78696d756d20666f7220726f6c6c7570207472616e73616374696f6e2e000000606082015260800190565b60208082526028908201527f4d7573742070726f76696465206174206c65617374206f6e652062617463682060408201526731b7b73a32bc3a1760c11b606082015260800190565b6020808252602e908201527f4e6f7420616c6c2073657175656e636572207472616e73616374696f6e73207760408201526d32b93290383937b1b2b9b9b2b21760911b606082015260800190565b6020808252604a908201527f41637475616c207472616e73616374696f6e20696e64657820646f6573206e6f60408201527f74206d6174636820657870656374656420746f74616c20656c656d656e7473206060820152693a379030b83832b7321760b11b608082015260a00190565b60208082526028908201527f436f6e7465787420626c6f636b206e756d6265722069732066726f6d2074686560408201526710333aba3ab9329760c11b606082015260800190565b60208082526018908201527f496e76616c696420696e636c7573696f6e2070726f6f662e0000000000000000604082015260600190565b60208082526029908201527f5472616e73616374696f6e20676173206c696d697420746f6f206c6f7720746f6040820152681032b738bab2bab29760b91b606082015260800190565b60208082526043908201527f53657175656e636572207472616e73616374696f6e2074696d657374616d702060408201527f657863656564732074686174206f66206e65787420717565756520656c656d65606082015262373a1760e91b608082015260a00190565b6020808252604d908201527f5175657565207472616e73616374696f6e732063616e6e6f742062652073756260408201527f6d697474656420647572696e67207468652073657175656e63657220696e636c60608201526c3ab9b4b7b7103832b934b7b21760991b608082015260a00190565b6020808252603d908201527f41637475616c20626174636820737461727420696e64657820646f6573206e6f60408201527f74206d6174636820657870656374656420737461727420696e6465782e000000606082015260800190565b6020808252602d908201527f46756e6374696f6e2063616e206f6e6c792062652063616c6c6564206279207460408201526c34329029b2b8bab2b731b2b91760991b606082015260800190565b6020808252601a908201527f496e76616c6964205175657565207472616e73616374696f6e2e000000000000604082015260600190565b60208082526015908201527424b73b30b634b2103130ba31b4103432b0b232b91760591b604082015260600190565b60208082526025908201527f436f6e746578742074696d657374616d702069732066726f6d207468652066756040820152643a3ab9329760d91b606082015260800190565b6020808252602b908201527f496e73756666696369656e742067617320666f72204c322072617465206c696d60408201526a34ba34b73390313ab9371760a91b606082015260800190565b60208082526035908201527f436f6e746578742074696d657374616d702076616c756573206d757374206d6f6040820152743737ba37b734b1b0b6363c9034b731b932b0b9b29760591b606082015260800190565b6020808252602a908201527f496e76616c6964205175657565207472616e73616374696f6e20696e636c757360408201526934b7b710383937b7b31760b11b606082015260800190565b60208082526045908201527f53657175656e636572207472616e73616374696f6e20626c6f636b4e756d626560408201527f7220657863656564732074686174206f66206e65787420717565756520656c6560608201526436b2b73a1760d91b608082015260a00190565b60208082526021908201527f4d75737420617070656e64206174206c65617374206f6e6520656c656d656e746040820152601760f91b606082015260800190565b60208082526026908201527f436f6e746578742074696d657374616d7020746f6f2066617220696e20746865604082015265103830b9ba1760d11b606082015260800190565b60208082526022908201527f4e6f7420656e6f756768204261746368436f6e74657874732070726f76696465604082015261321760f11b606082015260800190565b60208082526029908201527f4e6f7420656e6f75676820717565756564207472616e73616374696f6e732074604082015268379030b83832b7321760b91b606082015260800190565b60208082526037908201527f436f6e7465787420626c6f636b4e756d6265722076616c756573206d7573742060408201527f6d6f6e6f746f6e6963616c6c7920696e6372656173652e000000000000000000606082015260800190565b8151815260208083015164ffffffffff90811691830191909152604092830151169181019190915260600190565b90815260200190565b9283526020830191909152604082015260600190565b63ffffffff91909116815260200190565b64ffffffffff91909116815260200190565b64ffffffffff9384168152919092166020820152604081019190915260600190565b60405181810167ffffffffffffffff81118282101715612f3257fe5b60405291905056fe4f564d5f436861696e53746f72616765436f6e7461696e65723a4354433a71756575654f564d5f4465636f6d7072657373696f6e507265636f6d70696c65416464726573734c69625f4d65726b6c65547265653a20496e646578206f7574206f6620626f756e64732e4c69625f4d65726b6c65547265653a2043616e6e6f7420636f6d70757465206365696c286c6f675f3229206f6620302e4c69625f4d65726b6c65547265653a20546f74616c206c6561766573206d7573742062652067726561746572207468616e207a65726f2e4c69625f4d65726b6c65547265653a20546f74616c207369626c696e677320646f6573206e6f7420636f72726563746c7920636f72726573706f6e6420746f20746f74616c206c65617665732e4f564d5f436861696e53746f72616765436f6e7461696e65723a4354433a626174636865734c69625f4d65726b6c65547265653a204d7573742070726f76696465206174206c65617374206f6e65206c65616620686173682ea26469706673582212203512ca678bca74305bf6a879ce3d6142d5a90f38111948470b55a07a416cec5964736f6c63430007060033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101215760003560e01c80638d38c6c1116100ad578063d0f8934411610071578063d0f893441461020e578063e10d29ee14610216578063e561dddc1461021e578063f722b41a14610226578063facdc5da1461022e57610121565b80638d38c6c1146101e6578063b8f77005146101ee578063c139eb15146101f6578063c2cf696f146101fe578063cfdf677e1461020657610121565b80636fee07e0116100f45780636fee07e0146101a457806378f4b2f2146101b95780637a167a8a146101c15780637aa63a86146101d6578063876ed5cb146101de57610121565b8063138387a4146101265780632a7f18be14610144578063461a4478146101645780634de569ce14610184575b600080fd5b61012e610241565b60405161013b9190612eb2565b60405180910390f35b610157610152366004612346565b610247565b60405161013b9190612e84565b6101776101723660046121d9565b610394565b60405161013b91906123a9565b61019761019236600461221f565b610470565b60405161013b9190612442565b6101b76101b2366004612146565b6104aa565b005b61012e6106cd565b6101c96106d4565b60405161013b9190612ee2565b61012e6106e9565b61012e610704565b61012e61070a565b6101c9610710565b61012e610799565b61012e61079f565b6101776107a4565b6101b76107cc565b610177610bb3565b61012e610bd6565b6101c9610c50565b6101b761023c366004612346565b610c68565b60025481565b61024f611e97565b60028202600061025d610bb3565b6001600160a01b0316639507d39a836040518263ffffffff1660e01b81526004016102889190612ee2565b60206040518083038186803b1580156102a057600080fd5b505afa1580156102b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102d891906121c1565b905060006102e4610bb3565b6001600160a01b0316639507d39a846001016040518263ffffffff1660e01b81526004016103129190612ee2565b60206040518083038186803b15801561032a57600080fd5b505afa15801561033e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061036291906121c1565b6040805160608101825293845264ffffffffff808316602086015260289290921c90911690830152509150505b919050565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b838110156103f45781810151838201526020016103dc565b50505050905090810190601f1680156104215780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561043e57600080fd5b505afa158015610452573d6000803e3d6000fd5b505050506040513d602081101561046857600080fd5b505192915050565b82516000901515600114156104925761048b85858585610dcb565b90506104a2565b61048b8585602001518585610f96565b949350505050565b612710815111156104d65760405162461bcd60e51b81526004016104cd9061255e565b60405180910390fd5b6003548211156104f85760405162461bcd60e51b81526004016104cd90612764565b620186a082101561051b5760405162461bcd60e51b81526004016104cd90612946565b6020820460005a90508181116105435760405162461bcd60e51b81526004016104cd90612bc0565b60005b825a8303101561055857600101610546565b60003387878760405160200161057194939291906123bd565b60408051601f19818403018152919052805160209091012090504360281b4217610599610bb3565b6001600160a01b031663d41c021883836040518363ffffffff1660e01b81526004016105c692919061249b565b600060405180830381600087803b1580156105e057600080fd5b505af11580156105f4573d6000803e3d6000fd5b5050505060006002610604610bb3565b6001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b15801561063c57600080fd5b505afa158015610650573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061067491906121c1565b8161067b57fe5b0490507f4b388aecf9fa6cc92253704e5975a6129a4f735bdbd99567df4ed0094ee4ceb5338a8a8a60018603426040516106ba969594939291906123fa565b60405180910390a1505050505050505050565b620186a081565b6000806106df61106b565b5090935050505090565b6000806106f461106b565b50505064ffffffffff1692915050565b61271081565b60035481565b6000600261071c610bb3565b6001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b15801561075457600080fd5b505afa158015610768573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061078c91906121c1565b8161079357fe5b04905090565b60015481565b602081565b60006107c760405180606001604052806025815260200161305860259139610394565b905090565b60043560d81c60093560e890811c90600c35901c6107e86106e9565b8364ffffffffff161461080d5760405162461bcd60e51b81526004016104cd90612a6b565b61083b6040518060400160405280600d81526020016c27ab26afa9b2b8bab2b731b2b960991b815250610394565b6001600160a01b0316336001600160a01b03161461086b5760405162461bcd60e51b81526004016104cd90612ac8565b60008162ffffff16116108905760405162461bcd60e51b81526004016104cd906127c1565b60008262ffffff16116108b55760405162461bcd60e51b81526004016104cd90612d15565b600f601062ffffff831602013664ffffffffff82168110156108e95760405162461bcd60e51b81526004016104cd90612d9c565b60006108f3610710565b905060008562ffffff1667ffffffffffffffff8111801561091357600080fd5b5060405190808252806020026020018201604052801561093d578160200160208202803683370190505b509050600080600061094d6106d4565b9050610957611eb7565b60005b8962ffffff168163ffffffff161015610a8a57600061097e8263ffffffff16611119565b905063ffffffff82166109945761099481611169565b61099f838286611236565b80925060005b835163ffffffff82161015610a00578a3560e81c6109cb8564ffffffffff8e1683611346565b898963ffffffff16815181106109dd57fe5b60209081029190910101529a909a016003019960019687019695860195016109a5565b5060005b83602001518163ffffffff161015610a80578864ffffffffff168564ffffffffff1610610a435760405162461bcd60e51b81526004016104cd90612dde565b610a538564ffffffffff166113d0565b888863ffffffff1681518110610a6557fe5b60209081029190910101526001968701969485019401610a04565b505060010161095a565b50610a948161141b565b8764ffffffffff168714610aba5760405162461bcd60e51b81526004016104cd90612809565b8962ffffff168463ffffffff1614610ae45760405162461bcd60e51b81526004016104cd90612857565b6000838b62ffffff160363ffffffff169050600080836020015160001415610b1757505060408201516060830151610b3e565b6000610b2c6001870364ffffffffff16610247565b90508060200151925080604001519150505b610b5f610b4a89611463565b8e62ffffff168564ffffffffff168585611893565b7f602f1aeac0ca2e7a13e281a9ef0ad7838542712ce16780fa2ecffd351f05f89983860384610b8c6106e9565b604051610b9b93929190612ef4565b60405180910390a15050505050505050505050505050565b60006107c7604051806060016040528060238152602001612f3b60239139610394565b6000610be06107a4565b6001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b158015610c1857600080fd5b505afa158015610c2c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107c791906121c1565b6000610c5a6106d4565b610c62610710565b03905090565b60405162461bcd60e51b81526004016104cd906124ce565b83811015610d4557610cb66040518060400160405280600d81526020016c27ab26afa9b2b8bab2b731b2b960991b815250610394565b6001600160a01b0316336001600160a01b031614610d12576000610ce08364ffffffffff16610247565b905042600154826020015164ffffffffff160110610d105760405162461bcd60e51b81526004016104cd906129f8565b505b610d228264ffffffffff166113d0565b838281518110610d2e57fe5b602090810291909101015260019182019101610c80565b506000610d5b6001830364ffffffffff16610247565b9050610d7a610d6984611463565b858684602001518560400151611893565b7f64d7f508348c70dea42d5302a393987e4abc20e45954ab3f9d320207751956f0848364ffffffffff160385610dae6106e9565b604051610dbd93929190612ebb565b60405180910390a150505050565b600080610e036040518060400160405280601481526020017327ab26afa2bc32b1baba34b7b726b0b730b3b2b960611b815250610394565b90506000816001600160a01b0316631c4712a76040518163ffffffff1660e01b815260040160206040518083038186803b158015610e4057600080fd5b505afa158015610e54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e7891906121c1565b90506000610e8587611a4d565b9050610e92818787611ae6565b610eae5760405162461bcd60e51b81526004016104cd9061268d565b86606001518860200151148015610ec9575060408701518851145b8015610f0a5750610ef1604051806060016040528060228152602001612f5e60229139610394565b6001600160a01b031688608001516001600160a01b0316145b8015610f195750818860a00151145b8015610f30575060608801516001600160a01b0316155b8015610f4b5750600088604001516001811115610f4957fe5b145b8015610f6c57508660800151805190602001208860c0015180519060200120145b610f885760405162461bcd60e51b81526004016104cd9061272d565b506001979650505050505050565b600080610fa2856113d0565b9050610faf818585611ae6565b610fcb5760405162461bcd60e51b81526004016104cd90612c60565b6000866060015187608001518860a001518960c00151604051602001610ff494939291906123bd565b604051602081830303815290604052805190602001209050600061101787610247565b80519091508214801561103557508751602082015164ffffffffff16145b801561104f57508760200151816040015164ffffffffff16145b610f885760405162461bcd60e51b81526004016104cd90612b15565b600080600080600061107b6107a4565b6001600160a01b031663ccf8f9696040518163ffffffff1660e01b815260040160206040518083038186803b1580156110b357600080fd5b505afa1580156110c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110eb919061219b565b64ffffffffff602882901c811697605083901c82169750607883901c8216965060a09290921c169350915050565b611121611eb7565b5060408051608081018252601092909202600f81013560e890811c84526012820135901c6020840152601581013560d890811c92840192909252601a0135901c606082015290565b60006111736106e9565b11156111e35760008061118461106b565b9350935050508064ffffffffff16836060015110156111b55760405162461bcd60e51b81526004016104cd906126db565b8164ffffffffff16836040015110156111e05760405162461bcd60e51b81526004016104cd906125bb565b50505b42600154826040015101101561120b5760405162461bcd60e51b81526004016104cd90612d56565b4360025482606001510110156112335760405162461bcd60e51b81526004016104cd90612515565b50565b82604001518260400151101561125e5760405162461bcd60e51b81526004016104cd90612c0b565b8260600151826060015110156112865760405162461bcd60e51b81526004016104cd90612e27565b600081611291610710565b0364ffffffffff1611156113415760006112b18264ffffffffff16610247565b9050600154816020015164ffffffffff160142106112e15760405162461bcd60e51b81526004016104cd9061260a565b806020015164ffffffffff16836040015111156113105760405162461bcd60e51b81526004016104cd9061298f565b806040015164ffffffffff168360600151111561133f5760405162461bcd60e51b81526004016104cd90612caa565b505b505050565b6000808260410167ffffffffffffffff8111801561136357600080fd5b506040519080825280601f01601f19166020018201604052801561138e576020820181803683370190505b50604086015160608701519192509060006020840160018153836001820152826021820152866003890160418301376041870190209450505050509392505050565b60006114156040518060a00160405280600015158152602001848152602001600081526020016000815260200160405180602001604052806000815250815250611bd7565b92915050565b428160400151111561143f5760405162461bcd60e51b81526004016104cd90612b7b565b43816060015111156112335760405162461bcd60e51b81526004016104cd906128c7565b6000808251116114a45760405162461bcd60e51b815260040180806020018281038252603481526020018061307d6034913960400191505060405180910390fd5b81516114c657816000815181106114b757fe5b6020026020010151905061038f565b60408051610200810182527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56381527f633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d60208201527f890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d818301527f3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd86060808301919091527fecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da60808301527fdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da560a08301527f617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d760c08301527f292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead60e08301527fe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e106101008301527f7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f826101208301527fe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e836365166101408301527f3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c6101608301527fad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e6101808301527fa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab6101a08301527f4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c8626101c08301527f2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf106101e083015282518381529081018352909160009190602082018180368337505085519192506000918291508180805b600184111561186f5750506002820460018084161460005b828110156117eb578a816002028151811061179257fe5b602002602001015196508a81600202600101815181106117ae57fe5b6020026020010151955086602089015285604089015287805190602001208b82815181106117d857fe5b602090810291909101015260010161177b565b50801561184e5789600185038151811061180157fe5b6020026020010151955087836010811061181757fe5b602002015160001b945085602088015284604088015286805190602001208a838151811061184157fe5b6020026020010181815250505b8061185a57600061185d565b60015b60ff1682019350600190920191611763565b8960008151811061187c57fe5b602002602001015198505050505050505050919050565b6000806000806118a161106b565b935093509350935060006040518060a001604052806118be6107a4565b6001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b1580156118f657600080fd5b505afa15801561190a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061192e91906121c1565b81526020018b81526020018a81526020018664ffffffffff16815260200160405180602001604052806000815250815250905080600001517f127186556e7be68c7e31263195225b4de02820707889540969f62c05cf73525e82602001518360400151846060015185608001516040516119ab94939291906124a9565b60405180910390a260006119be82611c1f565b905060006119d6836040015188018b88018b8b611c48565b90506119e06107a4565b6001600160a01b0316632015276c83836040518363ffffffff1660e01b8152600401611a0d929190612485565b600060405180830381600087803b158015611a2757600080fd5b505af1158015611a3b573d6000803e3d6000fd5b50505050505050505050505050505050565b6080810151805160009190826041820167ffffffffffffffff81118015611a7357600080fd5b506040519080825280601f01601f191660200182016040528015611a9e576020820181803683370190505b5060408601516060870151919250906000602084016001815383600182015282602182015285604182018760208a0160045afa50604190950190942095505050505050919050565b6000611af06107a4565b8351604051634a83e9cd60e11b81526001600160a01b039290921691639507d39a91611b1e91600401612ed1565b60206040518083038186803b158015611b3657600080fd5b505afa158015611b4a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b6e91906121c1565b611b7784611c1f565b14611b945760405162461bcd60e51b81526004016104cd90612b4c565b611bb1836020015185846000015185602001518760400151611c67565b611bcd5760405162461bcd60e51b81526004016104cd9061290f565b5060019392505050565b8051602080830151604080850151606086015160808701519251600096611c0296909594910161244d565b604051602081830303815290604052805190602001209050919050565b60008160200151826040015183606001518460800151604051602001611c0294939291906124a9565b602892831b9390931760509190911b1760789290921b91909117901b90565b6000808211611ca75760405162461bcd60e51b8152600401808060200182810382526037815260200180612fd46037913960400191505060405180910390fd5b818410611ce55760405162461bcd60e51b8152600401808060200182810382526024815260200180612f806024913960400191505060405180910390fd5b611cee82611dec565b835114611d2c5760405162461bcd60e51b815260040180806020018281038252604d81526020018061300b604d913960600191505060405180910390fd5b8460005b8451811015611ddf578560011660011415611d8e57848181518110611d5157fe5b6020026020010151826040516020018083815260200182815260200192505050604051602081830303815290604052805190602001209150611dd3565b81858281518110611d9b57fe5b602002602001015160405160200180838152602001828152602001925050506040516020818303038152906040528051906020012091505b600195861c9501611d30565b5090951495945050505050565b6000808211611e2c5760405162461bcd60e51b8152600401808060200182810382526030815260200180612fa46030913960400191505060405180910390fd5b8160011415611e3d5750600061038f565b81600060805b60018160ff1610611e81578060ff1660018260ff166001901b03901b8316600014611e765760ff811692831c9291909101905b60011c607f16611e43565b506001811b8414611e90576001015b9392505050565b604080516060810182526000808252602082018190529181019190915290565b6040518060800160405280600081526020016000815260200160008152602001600081525090565b600067ffffffffffffffff831115611ef357fe5b611f06601f8401601f1916602001612f16565b9050828152838383011115611f1a57600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b038116811461038f57600080fd5b600082601f830112611f58578081fd5b611e9083833560208501611edf565b80356002811061038f57600080fd5b600060a08284031215611f87578081fd5b60405160a0810167ffffffffffffffff8282108183111715611fa557fe5b81604052829350843583526020850135602084015260408501356040840152606085013560608401526080850135915080821115611fe257600080fd5b50611fef85828601611f48565b6080830152505092915050565b60006040828403121561200d578081fd5b6040516040810167ffffffffffffffff828210818311171561202b57fe5b816040528293508435835260209150818501358181111561204b57600080fd5b8501601f8101871361205c57600080fd5b80358281111561206857fe5b8381029250612078848401612f16565b8181528481019083860185850187018b101561209357600080fd5b600095505b838610156120b6578035835260019590950194918601918601612098565b5080868801525050505050505092915050565b600060a082840312156120da578081fd5b60405160a0810167ffffffffffffffff82821081831117156120f857fe5b8160405282935084359150811515821461211157600080fd5b8183526020850135602084015260408501356040840152606085013560608401526080850135915080821115611fe257600080fd5b60008060006060848603121561215a578283fd5b61216384611f31565b925060208401359150604084013567ffffffffffffffff811115612185578182fd5b61219186828701611f48565b9150509250925092565b6000602082840312156121ac578081fd5b815164ffffffffff1981168114611e90578182fd5b6000602082840312156121d2578081fd5b5051919050565b6000602082840312156121ea578081fd5b813567ffffffffffffffff811115612200578182fd5b8201601f81018413612210578182fd5b6104a284823560208401611edf565b60008060008060808587031215612234578081fd5b843567ffffffffffffffff8082111561224b578283fd5b9086019060e0828903121561225e578283fd5b61226860e0612f16565b823581526020830135602082015261228260408401611f67565b604082015261229360608401611f31565b60608201526122a460808401611f31565b608082015260a083013560a082015260c0830135828111156122c4578485fd5b6122d08a828601611f48565b60c083015250955060208701359150808211156122eb578283fd5b6122f7888389016120c9565b9450604087013591508082111561230c578283fd5b61231888838901611f76565b9350606087013591508082111561232d578283fd5b5061233a87828801611ffc565b91505092959194509250565b600060208284031215612357578081fd5b5035919050565b60008151808452815b8181101561238357602081850181015186830182015201612367565b818111156123945782602083870101525b50601f01601f19169290920160200192915050565b6001600160a01b0391909116815260200190565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906123f09083018461235e565b9695505050505050565b6001600160a01b038781168252861660208201526040810185905260c06060820181905260009061242d9083018661235e565b60808301949094525060a00152949350505050565b901515815260200190565b6000861515825285602083015284604083015283606083015260a0608083015261247a60a083018461235e565b979650505050505050565b91825264ffffffffff1916602082015260400190565b918252602082015260400190565b6000858252846020830152836040830152608060608301526123f0608083018461235e565b60208082526027908201527f617070656e64517565756542617463682069732063757272656e746c7920646960408201526639b0b13632b21760c91b606082015260800190565b60208082526029908201527f436f6e7465787420626c6f636b206e756d62657220746f6f2066617220696e206040820152683a3432903830b9ba1760b91b606082015260800190565b6020808252603d908201527f5472616e73616374696f6e20646174612073697a652065786365656473206d6160408201527f78696d756d20666f7220726f6c6c7570207472616e73616374696f6e2e000000606082015260800190565b6020808252602f908201527f436f6e746578742074696d657374616d70206973206c6f776572207468616e2060408201526e3630b9ba1039bab136b4ba3a32b21760891b606082015260800190565b6020808252605b908201527f50726576696f75736c7920656e7175657565642062617463686573206861766560408201527f206578706972656420616e64206d75737420626520617070656e64656420626560608201527f666f72652061206e65772073657175656e6365722062617463682e0000000000608082015260a00190565b6020808252602e908201527f496e76616c69642053657175656e636572207472616e73616374696f6e20696e60408201526d31b63ab9b4b7b710383937b7b31760911b606082015260800190565b60208082526032908201527f436f6e7465787420626c6f636b206e756d626572206973206c6f77657220746860408201527130b7103630b9ba1039bab136b4ba3a32b21760711b606082015260800190565b6020808252601e908201527f496e76616c69642053657175656e636572207472616e73616374696f6e2e0000604082015260600190565b6020808252603d908201527f5472616e73616374696f6e20676173206c696d69742065786365656473206d6160408201527f78696d756d20666f7220726f6c6c7570207472616e73616374696f6e2e000000606082015260800190565b60208082526028908201527f4d7573742070726f76696465206174206c65617374206f6e652062617463682060408201526731b7b73a32bc3a1760c11b606082015260800190565b6020808252602e908201527f4e6f7420616c6c2073657175656e636572207472616e73616374696f6e73207760408201526d32b93290383937b1b2b9b9b2b21760911b606082015260800190565b6020808252604a908201527f41637475616c207472616e73616374696f6e20696e64657820646f6573206e6f60408201527f74206d6174636820657870656374656420746f74616c20656c656d656e7473206060820152693a379030b83832b7321760b11b608082015260a00190565b60208082526028908201527f436f6e7465787420626c6f636b206e756d6265722069732066726f6d2074686560408201526710333aba3ab9329760c11b606082015260800190565b60208082526018908201527f496e76616c696420696e636c7573696f6e2070726f6f662e0000000000000000604082015260600190565b60208082526029908201527f5472616e73616374696f6e20676173206c696d697420746f6f206c6f7720746f6040820152681032b738bab2bab29760b91b606082015260800190565b60208082526043908201527f53657175656e636572207472616e73616374696f6e2074696d657374616d702060408201527f657863656564732074686174206f66206e65787420717565756520656c656d65606082015262373a1760e91b608082015260a00190565b6020808252604d908201527f5175657565207472616e73616374696f6e732063616e6e6f742062652073756260408201527f6d697474656420647572696e67207468652073657175656e63657220696e636c60608201526c3ab9b4b7b7103832b934b7b21760991b608082015260a00190565b6020808252603d908201527f41637475616c20626174636820737461727420696e64657820646f6573206e6f60408201527f74206d6174636820657870656374656420737461727420696e6465782e000000606082015260800190565b6020808252602d908201527f46756e6374696f6e2063616e206f6e6c792062652063616c6c6564206279207460408201526c34329029b2b8bab2b731b2b91760991b606082015260800190565b6020808252601a908201527f496e76616c6964205175657565207472616e73616374696f6e2e000000000000604082015260600190565b60208082526015908201527424b73b30b634b2103130ba31b4103432b0b232b91760591b604082015260600190565b60208082526025908201527f436f6e746578742074696d657374616d702069732066726f6d207468652066756040820152643a3ab9329760d91b606082015260800190565b6020808252602b908201527f496e73756666696369656e742067617320666f72204c322072617465206c696d60408201526a34ba34b73390313ab9371760a91b606082015260800190565b60208082526035908201527f436f6e746578742074696d657374616d702076616c756573206d757374206d6f6040820152743737ba37b734b1b0b6363c9034b731b932b0b9b29760591b606082015260800190565b6020808252602a908201527f496e76616c6964205175657565207472616e73616374696f6e20696e636c757360408201526934b7b710383937b7b31760b11b606082015260800190565b60208082526045908201527f53657175656e636572207472616e73616374696f6e20626c6f636b4e756d626560408201527f7220657863656564732074686174206f66206e65787420717565756520656c6560608201526436b2b73a1760d91b608082015260a00190565b60208082526021908201527f4d75737420617070656e64206174206c65617374206f6e6520656c656d656e746040820152601760f91b606082015260800190565b60208082526026908201527f436f6e746578742074696d657374616d7020746f6f2066617220696e20746865604082015265103830b9ba1760d11b606082015260800190565b60208082526022908201527f4e6f7420656e6f756768204261746368436f6e74657874732070726f76696465604082015261321760f11b606082015260800190565b60208082526029908201527f4e6f7420656e6f75676820717565756564207472616e73616374696f6e732074604082015268379030b83832b7321760b91b606082015260800190565b60208082526037908201527f436f6e7465787420626c6f636b4e756d6265722076616c756573206d7573742060408201527f6d6f6e6f746f6e6963616c6c7920696e6372656173652e000000000000000000606082015260800190565b8151815260208083015164ffffffffff90811691830191909152604092830151169181019190915260600190565b90815260200190565b9283526020830191909152604082015260600190565b63ffffffff91909116815260200190565b64ffffffffff91909116815260200190565b64ffffffffff9384168152919092166020820152604081019190915260600190565b60405181810167ffffffffffffffff81118282101715612f3257fe5b60405291905056fe4f564d5f436861696e53746f72616765436f6e7461696e65723a4354433a71756575654f564d5f4465636f6d7072657373696f6e507265636f6d70696c65416464726573734c69625f4d65726b6c65547265653a20496e646578206f7574206f6620626f756e64732e4c69625f4d65726b6c65547265653a2043616e6e6f7420636f6d70757465206365696c286c6f675f3229206f6620302e4c69625f4d65726b6c65547265653a20546f74616c206c6561766573206d7573742062652067726561746572207468616e207a65726f2e4c69625f4d65726b6c65547265653a20546f74616c207369626c696e677320646f6573206e6f7420636f72726563746c7920636f72726573706f6e6420746f20746f74616c206c65617665732e4f564d5f436861696e53746f72616765436f6e7461696e65723a4354433a626174636865734c69625f4d65726b6c65547265653a204d7573742070726f76696465206174206c65617374206f6e65206c65616620686173682ea26469706673582212203512ca678bca74305bf6a879ce3d6142d5a90f38111948470b55a07a416cec5964736f6c63430007060033", - "devdoc": { - "kind": "dev", - "methods": { - "appendQueueBatch(uint256)": { - "params": { - "_numQueuedTransactions": "Number of transactions to append." - } - }, - "appendSequencerBatch()": { - "details": "This function uses a custom encoding scheme for efficiency reasons. .param _shouldStartAtElement Specific batch we expect to start appending to. .param _totalElementsToAppend Total number of batch elements we expect to append. .param _contexts Array of batch contexts. .param _transactionDataFields Array of raw transaction data." - }, - "batches()": { - "returns": { - "_0": "Reference to the batch storage container." - } - }, - "enqueue(address,uint256,bytes)": { - "params": { - "_data": "Transaction data.", - "_gasLimit": "Gas limit for the given transaction.", - "_target": "Target contract to send the transaction to." - } - }, - "getNextQueueIndex()": { - "returns": { - "_0": "Index for the next queue element." - } - }, - "getNumPendingQueueElements()": { - "returns": { - "_0": "Length of the queue." - } - }, - "getQueueElement(uint256)": { - "params": { - "_index": "Index of the queue element to access." - }, - "returns": { - "_element": "Queue element at the given index." - } - }, - "getQueueLength()": { - "returns": { - "_0": "Length of the queue." - } - }, - "getTotalBatches()": { - "returns": { - "_totalBatches": "Total submitted batches." - } - }, - "getTotalElements()": { - "returns": { - "_totalElements": "Total submitted elements." - } - }, - "queue()": { - "returns": { - "_0": "Reference to the queue storage container." - } - }, - "verifyTransaction((uint256,uint256,uint8,address,address,uint256,bytes),(bool,uint256,uint256,uint256,bytes),(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))": { - "params": { - "_batchHeader": "Header of the batch the transaction was included in.", - "_inclusionProof": "Inclusion proof for the provided transaction chain element.", - "_transaction": "Transaction to verify.", - "_txChainElement": "Transaction chain element corresponding to the transaction." - }, - "returns": { - "_0": "True if the transaction exists in the CTC, false if not." - } - } - }, - "title": "OVM_CanonicalTransactionChain", - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": { - "appendQueueBatch(uint256)": { - "notice": "Appends a given number of queued transactions as a single batch." - }, - "appendSequencerBatch()": { - "notice": "Allows the sequencer to append a batch of transactions." - }, - "batches()": { - "notice": "Accesses the batch storage container." - }, - "enqueue(address,uint256,bytes)": { - "notice": "Adds a transaction to the queue." - }, - "getNextQueueIndex()": { - "notice": "Returns the index of the next element to be enqueued." - }, - "getNumPendingQueueElements()": { - "notice": "Get the number of queue elements which have not yet been included." - }, - "getQueueElement(uint256)": { - "notice": "Gets the queue element at a particular index." - }, - "getQueueLength()": { - "notice": "Retrieves the length of the queue, including both pending and canonical transactions." - }, - "getTotalBatches()": { - "notice": "Retrieves the total number of batches submitted." - }, - "getTotalElements()": { - "notice": "Retrieves the total number of elements submitted." - }, - "queue()": { - "notice": "Accesses the queue storage container." - }, - "verifyTransaction((uint256,uint256,uint8,address,address,uint256,bytes),(bool,uint256,uint256,uint256,bytes),(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))": { - "notice": "Verifies whether a transaction is included in the chain." - } - }, - "version": 1 - }, - "storageLayout": { - "storage": [ - { - "astId": 11707, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_CanonicalTransactionChain.sol:OVM_CanonicalTransactionChain", - "label": "libAddressManager", - "offset": 0, - "slot": "0", - "type": "t_contract(Lib_AddressManager)11700" - }, - { - "astId": 1388, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_CanonicalTransactionChain.sol:OVM_CanonicalTransactionChain", - "label": "forceInclusionPeriodSeconds", - "offset": 0, - "slot": "1", - "type": "t_uint256" - }, - { - "astId": 1390, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_CanonicalTransactionChain.sol:OVM_CanonicalTransactionChain", - "label": "forceInclusionPeriodBlocks", - "offset": 0, - "slot": "2", - "type": "t_uint256" - }, - { - "astId": 1392, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_CanonicalTransactionChain.sol:OVM_CanonicalTransactionChain", - "label": "maxTransactionGasLimit", - "offset": 0, - "slot": "3", - "type": "t_uint256" - } - ], - "types": { - "t_contract(Lib_AddressManager)11700": { - "encoding": "inplace", - "label": "contract Lib_AddressManager", - "numberOfBytes": "20" - }, - "t_uint256": { - "encoding": "inplace", - "label": "uint256", - "numberOfBytes": "32" - } - } - } -} \ No newline at end of file diff --git a/packages/contracts/deployments/mainnet-v1/OVM_ChainStorageContainer-CTC-batches.json b/packages/contracts/deployments/mainnet-v1/OVM_ChainStorageContainer-CTC-batches.json deleted file mode 100644 index cf9111f218dd1..0000000000000 --- a/packages/contracts/deployments/mainnet-v1/OVM_ChainStorageContainer-CTC-batches.json +++ /dev/null @@ -1,488 +0,0 @@ -{ - "address": "0x7Cb043e523F6B5D492E0d2221e45062d3878599c", - "abi": [ - { - "inputs": [ - { - "internalType": "address", - "name": "_libAddressManager", - "type": "address" - }, - { - "internalType": "string", - "name": "_owner", - "type": "string" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_index", - "type": "uint256" - }, - { - "internalType": "bytes27", - "name": "_globalMetadata", - "type": "bytes27" - } - ], - "name": "deleteElementsAfterInclusive", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_index", - "type": "uint256" - } - ], - "name": "deleteElementsAfterInclusive", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_index", - "type": "uint256" - } - ], - "name": "get", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getGlobalMetadata", - "outputs": [ - { - "internalType": "bytes27", - "name": "", - "type": "bytes27" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "length", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "owner", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "_object", - "type": "bytes32" - }, - { - "internalType": "bytes27", - "name": "_globalMetadata", - "type": "bytes27" - } - ], - "name": "push", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "_object", - "type": "bytes32" - } - ], - "name": "push", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "_objectA", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "_objectB", - "type": "bytes32" - }, - { - "internalType": "bytes27", - "name": "_globalMetadata", - "type": "bytes27" - } - ], - "name": "push2", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "_objectA", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "_objectB", - "type": "bytes32" - } - ], - "name": "push2", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "string", - "name": "_name", - "type": "string" - } - ], - "name": "resolve", - "outputs": [ - { - "internalType": "address", - "name": "_contract", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes27", - "name": "_globalMetadata", - "type": "bytes27" - } - ], - "name": "setGlobalMetadata", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_index", - "type": "uint256" - } - ], - "name": "setNextOverwritableIndex", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - } - ], - "transactionHash": "0x86b9f5af9ce79ad3dca2a59ed521e75d88ed6d816f85e49b15232731cf1b16eb", - "receipt": { - "to": null, - "from": "0x558ba9b8d78713fbf768c1f8a584485B4003f43F", - "contractAddress": "0x4C4a482b6bE75FDce6E94Be10423363108f34fDf", - "transactionIndex": 1, - "gasUsed": "1103714", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0x7dc617150a7075769c500e7ebe66c4357400e4d7a81a26495e265d4949b2fdd6", - "transactionHash": "0x86b9f5af9ce79ad3dca2a59ed521e75d88ed6d816f85e49b15232731cf1b16eb", - "logs": [], - "blockNumber": 4573377, - "cumulativeGasUsed": "1155953", - "status": 1, - "byzantium": true - }, - "args": [ - "0x1De8CFD4C1A486200286073aE91DE6e8099519f1", - "OVM_CanonicalTransactionChain" - ], - "solcInputHash": "cebcb515c1a9c570d96e0b8f6fd237e2", - "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_owner\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"get\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getGlobalMetadata\",\"outputs\":[{\"internalType\":\"bytes27\",\"name\":\"\",\"type\":\"bytes27\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"length\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_objectA\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"_objectB\",\"type\":\"bytes32\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"push2\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_objectA\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"_objectB\",\"type\":\"bytes32\"}],\"name\":\"push2\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"_contract\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"setGlobalMetadata\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"setNextOverwritableIndex\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\",\"_owner\":\"Name of the contract that owns this container (will be resolved later).\"}},\"deleteElementsAfterInclusive(uint256)\":{\"params\":{\"_index\":\"Object index to delete from.\"}},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_index\":\"Object index to delete from.\"}},\"get(uint256)\":{\"params\":{\"_index\":\"Index of the particular object to access.\"},\"returns\":{\"_0\":\"32 byte object value.\"}},\"getGlobalMetadata()\":{\"returns\":{\"_0\":\"Container global metadata field.\"}},\"length()\":{\"returns\":{\"_0\":\"Number of objects in the container.\"}},\"push(bytes32)\":{\"params\":{\"_object\":\"A 32 byte value to insert into the container.\"}},\"push(bytes32,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_object\":\"A 32 byte value to insert into the container.\"}},\"push2(bytes32,bytes32)\":{\"params\":{\"_objectA\":\"First 32 byte value to insert into the container.\",\"_objectB\":\"Second 32 byte value to insert into the container.\"}},\"push2(bytes32,bytes32,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_objectA\":\"First 32 byte value to insert into the container.\",\"_objectB\":\"Second 32 byte value to insert into the container.\"}},\"setGlobalMetadata(bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata to set.\"}}},\"title\":\"OVM_ChainStorageContainer\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"deleteElementsAfterInclusive(uint256)\":{\"notice\":\"Removes all objects after and including a given index.\"},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"notice\":\"Removes all objects after and including a given index. Also allows setting the global metadata field.\"},\"get(uint256)\":{\"notice\":\"Retrieves an object from the container.\"},\"getGlobalMetadata()\":{\"notice\":\"Retrieves the container's global metadata field.\"},\"length()\":{\"notice\":\"Retrieves the number of objects stored in the container.\"},\"push(bytes32)\":{\"notice\":\"Pushes an object into the container.\"},\"push(bytes32,bytes27)\":{\"notice\":\"Pushes an object into the container. Function allows setting the global metadata since we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global metadata (it's an optimization).\"},\"push2(bytes32,bytes32)\":{\"notice\":\"Pushes two objects into the container at the same time. A useful optimization.\"},\"push2(bytes32,bytes32,bytes27)\":{\"notice\":\"Pushes two objects into the container at the same time. Also allows setting the global metadata field.\"},\"setGlobalMetadata(bytes27)\":{\"notice\":\"Sets the container's global metadata field. We're using `bytes27` here because we use five bytes to maintain the length of the underlying data structure, meaning we have an extra 27 bytes to store arbitrary data.\"},\"setNextOverwritableIndex(uint256)\":{\"notice\":\"Marks an index as overwritable, meaing the underlying buffer can start to write values over any objects before and including the given index.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol\":\"OVM_ChainStorageContainer\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol\":{\"content\":\"pragma solidity ^0.7.0;\\n\\n/* Library Imports */\\nimport { Lib_RingBuffer } from \\\"../../libraries/utils/Lib_RingBuffer.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_ChainStorageContainer } from \\\"../../iOVM/chain/iOVM_ChainStorageContainer.sol\\\";\\n\\n/**\\n * @title OVM_ChainStorageContainer\\n */\\ncontract OVM_ChainStorageContainer is iOVM_ChainStorageContainer, Lib_AddressResolver {\\n\\n /*************\\n * Libraries *\\n *************/\\n\\n using Lib_RingBuffer for Lib_RingBuffer.RingBuffer;\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n string public owner;\\n Lib_RingBuffer.RingBuffer internal buffer;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n \\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n * @param _owner Name of the contract that owns this container (will be resolved later).\\n */\\n constructor(\\n address _libAddressManager,\\n string memory _owner\\n )\\n Lib_AddressResolver(_libAddressManager)\\n {\\n owner = _owner;\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n \\n modifier onlyOwner() {\\n require(\\n msg.sender == resolve(owner),\\n \\\"OVM_ChainStorageContainer: Function can only be called by the owner.\\\"\\n );\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function setGlobalMetadata(\\n bytes27 _globalMetadata\\n )\\n override\\n public\\n onlyOwner\\n {\\n return buffer.setExtraData(_globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function getGlobalMetadata()\\n override\\n public\\n view\\n returns (\\n bytes27\\n )\\n {\\n return buffer.getExtraData();\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function length()\\n override\\n public\\n view\\n returns (\\n uint256\\n )\\n {\\n return uint256(buffer.getLength());\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function push(\\n bytes32 _object\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.push(_object);\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function push(\\n bytes32 _object,\\n bytes27 _globalMetadata\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.push(_object, _globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function push2(\\n bytes32 _objectA,\\n bytes32 _objectB\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.push2(_objectA, _objectB);\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function push2(\\n bytes32 _objectA,\\n bytes32 _objectB,\\n bytes27 _globalMetadata\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.push2(_objectA, _objectB, _globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function get(\\n uint256 _index\\n )\\n override\\n public\\n view\\n returns (\\n bytes32\\n )\\n {\\n return buffer.get(uint40(_index));\\n }\\n \\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.deleteElementsAfterInclusive(\\n uint40(_index)\\n );\\n }\\n \\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index,\\n bytes27 _globalMetadata\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.deleteElementsAfterInclusive(\\n uint40(_index),\\n _globalMetadata\\n );\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function setNextOverwritableIndex(\\n uint256 _index\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.nextOverwritableIndex = _index;\\n }\\n}\\n\",\"keccak256\":\"0xc722e9528988810bd754002dfe3923bc9ac9252c1d981c4803fd5053603bfb11\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_ChainStorageContainer.sol\":{\"content\":\"pragma solidity ^0.7.0;\\n\\n/**\\n * @title iOVM_ChainStorageContainer\\n */\\ninterface iOVM_ChainStorageContainer {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata()\\n external\\n view\\n returns (\\n bytes27\\n );\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length()\\n external\\n view\\n returns (\\n uint256\\n );\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(\\n bytes32 _object\\n )\\n external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(\\n bytes32 _object,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Pushes two objects into the container at the same time. A useful optimization.\\n * @param _objectA First 32 byte value to insert into the container.\\n * @param _objectB Second 32 byte value to insert into the container.\\n */\\n function push2(\\n bytes32 _objectA,\\n bytes32 _objectB\\n )\\n external;\\n\\n /**\\n * Pushes two objects into the container at the same time. Also allows setting the global\\n * metadata field.\\n * @param _objectA First 32 byte value to insert into the container.\\n * @param _objectB Second 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push2(\\n bytes32 _objectA,\\n bytes32 _objectB,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(\\n uint256 _index\\n )\\n external\\n view\\n returns (\\n bytes32\\n );\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index\\n )\\n external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Marks an index as overwritable, meaing the underlying buffer can start to write values over\\n * any objects before and including the given index.\\n */\\n function setNextOverwritableIndex(\\n uint256 _index\\n )\\n external;\\n}\\n\",\"keccak256\":\"0xcfca7da85b35d94c27581c2460b0d48fd0cc51fa72670cc7a2f7f760fb21a2f0\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// +build ovm\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Contract Imports */\\nimport { Ownable } from \\\"./Lib_Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n /*******************************************\\n * Contract Variables: Internal Accounting *\\n *******************************************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n public\\n onlyOwner\\n {\\n emit AddressSet(_name, _address);\\n addresses[_getNameHash(_name)] = _address;\\n }\\n\\n function getAddress(\\n string memory _name\\n )\\n public\\n view\\n returns (address)\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32 _hash\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xdf802e1cc6474df913626991e9fca3835c620a519f397afe04bf9c260e723257\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// +build ovm\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\ncontract Lib_AddressResolver {\\n\\n /*******************************************\\n * Contract Variables: Contract References *\\n *******************************************/\\n\\n Lib_AddressManager internal libAddressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(\\n address _libAddressManager\\n ) public {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function resolve(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address _contract\\n )\\n {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0xf3b9d78b309ddeec259ce3e0e1cfdef3ca40938e9a81971b28ce2b8ea327f533\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// +build ovm\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Ownable\\n * @dev Adapted from https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol\\n */\\nabstract contract Ownable {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n address public owner;\\n\\n\\n /**********\\n * Events *\\n **********/\\n\\n event OwnershipTransferred(\\n address indexed previousOwner,\\n address indexed newOwner\\n );\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n constructor() internal {\\n owner = msg.sender;\\n emit OwnershipTransferred(address(0), owner);\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n owner == msg.sender,\\n \\\"Ownable: caller is not the owner\\\"\\n );\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function renounceOwnership()\\n public\\n virtual\\n onlyOwner\\n {\\n emit OwnershipTransferred(owner, address(0));\\n owner = address(0);\\n }\\n\\n function transferOwnership(address _newOwner)\\n public\\n virtual\\n onlyOwner\\n {\\n require(\\n _newOwner != address(0),\\n \\\"Ownable: new owner cannot be the zero address\\\"\\n );\\n\\n emit OwnershipTransferred(owner, _newOwner);\\n owner = _newOwner;\\n }\\n}\\n\",\"keccak256\":\"0xe0409fbd236d16ca6be439d9d97dd36d0d9a0697ee0062d49588b9d29c248e47\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_RingBuffer.sol\":{\"content\":\"pragma solidity ^0.7.0;\\n\\nlibrary Lib_RingBuffer {\\n using Lib_RingBuffer for RingBuffer;\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Buffer {\\n uint256 length;\\n mapping (uint256 => bytes32) buf;\\n }\\n\\n struct RingBuffer {\\n bytes32 contextA;\\n bytes32 contextB;\\n Buffer bufferA;\\n Buffer bufferB;\\n uint256 nextOverwritableIndex;\\n }\\n\\n struct RingBufferContext {\\n // contextA\\n uint40 globalIndex;\\n bytes27 extraData;\\n\\n // contextB\\n uint64 currBufferIndex;\\n uint40 prevResetIndex;\\n uint40 currResetIndex;\\n }\\n\\n\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 constant MIN_CAPACITY = 16;\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n * @param _extraData Optional global extra data.\\n */\\n function push(\\n RingBuffer storage _self,\\n bytes32 _value,\\n bytes27 _extraData\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n Buffer storage currBuffer = _self.getBuffer(ctx.currBufferIndex);\\n\\n // Set a minimum capacity.\\n if (currBuffer.length == 0) {\\n currBuffer.length = MIN_CAPACITY;\\n }\\n\\n // Check if we need to expand the buffer.\\n if (ctx.globalIndex - ctx.currResetIndex >= currBuffer.length) {\\n if (ctx.currResetIndex < _self.nextOverwritableIndex) {\\n // We're going to overwrite the inactive buffer.\\n // Bump the buffer index, reset the delete offset, and set our reset indices.\\n ctx.currBufferIndex++;\\n ctx.prevResetIndex = ctx.currResetIndex;\\n ctx.currResetIndex = ctx.globalIndex;\\n\\n // Swap over to the next buffer.\\n currBuffer = _self.getBuffer(ctx.currBufferIndex);\\n } else {\\n // We're not overwriting yet, double the length of the current buffer.\\n currBuffer.length *= 2;\\n }\\n }\\n\\n // Index to write to is the difference of the global and reset indices.\\n uint256 writeHead = ctx.globalIndex - ctx.currResetIndex;\\n currBuffer.buf[writeHead] = _value;\\n\\n // Bump the global index and insert our extra data, then save the context.\\n ctx.globalIndex++;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n */\\n function push(\\n RingBuffer storage _self,\\n bytes32 _value\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n \\n _self.push(\\n _value,\\n ctx.extraData\\n );\\n }\\n\\n /**\\n * Pushes a two elements to the buffer.\\n * @param _self Buffer to access.\\n * @param _valueA First value to push to the buffer.\\n * @param _valueA Second value to push to the buffer.\\n * @param _extraData Optional global extra data.\\n */\\n function push2(\\n RingBuffer storage _self,\\n bytes32 _valueA,\\n bytes32 _valueB,\\n bytes27 _extraData\\n )\\n internal\\n {\\n _self.push(_valueA, _extraData);\\n _self.push(_valueB, _extraData);\\n }\\n\\n /**\\n * Pushes a two elements to the buffer.\\n * @param _self Buffer to access.\\n * @param _valueA First value to push to the buffer.\\n * @param _valueA Second value to push to the buffer.\\n */\\n function push2(\\n RingBuffer storage _self,\\n bytes32 _valueA,\\n bytes32 _valueB\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n\\n _self.push2(\\n _valueA,\\n _valueB,\\n ctx.extraData\\n );\\n }\\n\\n /**\\n * Retrieves an element from the buffer.\\n * @param _self Buffer to access.\\n * @param _index Element index to retrieve.\\n * @return Value of the element at the given index.\\n */\\n function get(\\n RingBuffer storage _self,\\n uint256 _index\\n )\\n internal\\n view\\n returns (\\n bytes32 \\n )\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n\\n require(\\n _index < ctx.globalIndex,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n Buffer storage currBuffer = _self.getBuffer(ctx.currBufferIndex);\\n Buffer storage prevBuffer = _self.getBuffer(ctx.currBufferIndex + 1);\\n\\n if (_index >= ctx.currResetIndex) {\\n // We're trying to load an element from the current buffer.\\n // Relative index is just the difference from the reset index.\\n uint256 relativeIndex = _index - ctx.currResetIndex;\\n\\n // Shouldn't happen but why not check.\\n require(\\n relativeIndex < currBuffer.length,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n return currBuffer.buf[relativeIndex];\\n } else {\\n // We're trying to load an element from the previous buffer.\\n // Relative index is the difference from the reset index in the other direction.\\n uint256 relativeIndex = ctx.currResetIndex - _index;\\n\\n // Condition only fails in the case that we deleted and flipped buffers.\\n require(\\n ctx.currResetIndex > ctx.prevResetIndex,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n // Make sure we're not trying to read beyond the array.\\n require(\\n relativeIndex <= prevBuffer.length,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n return prevBuffer.buf[prevBuffer.length - relativeIndex];\\n }\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n * @param _extraData Optional global extra data.\\n */\\n function deleteElementsAfterInclusive(\\n RingBuffer storage _self,\\n uint40 _index,\\n bytes27 _extraData\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n\\n require(\\n _index < ctx.globalIndex && _index >= ctx.prevResetIndex,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n Buffer storage currBuffer = _self.getBuffer(ctx.currBufferIndex);\\n Buffer storage prevBuffer = _self.getBuffer(ctx.currBufferIndex + 1);\\n\\n if (_index < ctx.currResetIndex) {\\n // We're switching back to the previous buffer.\\n // Reduce the buffer index, set the current reset index back to match the previous one.\\n // We use the equality of these two values to prevent reading beyond this buffer.\\n ctx.currBufferIndex--;\\n ctx.currResetIndex = ctx.prevResetIndex;\\n }\\n\\n // Set our global index and extra data, save the context.\\n ctx.globalIndex = _index;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n */\\n function deleteElementsAfterInclusive(\\n RingBuffer storage _self,\\n uint40 _index\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n _self.deleteElementsAfterInclusive(\\n _index,\\n ctx.extraData\\n );\\n }\\n\\n /**\\n * Retrieves the current global index.\\n * @param _self Buffer to access.\\n * @return Current global index.\\n */\\n function getLength(\\n RingBuffer storage _self\\n )\\n internal\\n view\\n returns (\\n uint40\\n )\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n return ctx.globalIndex;\\n }\\n\\n /**\\n * Changes current global extra data.\\n * @param _self Buffer to access.\\n * @param _extraData New global extra data.\\n */\\n function setExtraData(\\n RingBuffer storage _self,\\n bytes27 _extraData\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Retrieves the current global extra data.\\n * @param _self Buffer to access.\\n * @return Current global extra data.\\n */\\n function getExtraData(\\n RingBuffer storage _self\\n )\\n internal\\n view\\n returns (\\n bytes27\\n )\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n return ctx.extraData;\\n }\\n\\n /**\\n * Sets the current ring buffer context.\\n * @param _self Buffer to access.\\n * @param _ctx Current ring buffer context.\\n */\\n function setContext(\\n RingBuffer storage _self,\\n RingBufferContext memory _ctx\\n )\\n internal\\n returns (\\n bytes32\\n )\\n {\\n bytes32 contextA;\\n bytes32 contextB;\\n\\n uint40 globalIndex = _ctx.globalIndex;\\n bytes27 extraData = _ctx.extraData;\\n assembly {\\n contextA := globalIndex\\n contextA := or(contextA, extraData)\\n }\\n\\n uint64 currBufferIndex = _ctx.currBufferIndex;\\n uint40 prevResetIndex = _ctx.prevResetIndex;\\n uint40 currResetIndex = _ctx.currResetIndex;\\n assembly {\\n contextB := currBufferIndex\\n contextB := or(contextB, shl(64, prevResetIndex))\\n contextB := or(contextB, shl(104, currResetIndex))\\n }\\n\\n if (_self.contextA != contextA) {\\n _self.contextA = contextA;\\n }\\n\\n if (_self.contextB != contextB) {\\n _self.contextB = contextB;\\n }\\n }\\n\\n /**\\n * Retrieves the current ring buffer context.\\n * @param _self Buffer to access.\\n * @return Current ring buffer context.\\n */\\n function getContext(\\n RingBuffer storage _self\\n )\\n internal\\n view\\n returns (\\n RingBufferContext memory\\n )\\n {\\n bytes32 contextA = _self.contextA;\\n bytes32 contextB = _self.contextB;\\n\\n uint40 globalIndex;\\n bytes27 extraData;\\n assembly {\\n globalIndex := and(contextA, 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF)\\n extraData := and(contextA, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000)\\n }\\n\\n uint64 currBufferIndex;\\n uint40 prevResetIndex;\\n uint40 currResetIndex;\\n assembly {\\n currBufferIndex := and(contextB, 0x000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF)\\n prevResetIndex := shr(64, and(contextB, 0x00000000000000000000000000000000000000FFFFFFFFFF0000000000000000))\\n currResetIndex := shr(104, and(contextB, 0x0000000000000000000000000000FFFFFFFFFF00000000000000000000000000))\\n }\\n\\n return RingBufferContext({\\n globalIndex: globalIndex,\\n extraData: extraData,\\n currBufferIndex: currBufferIndex,\\n prevResetIndex: prevResetIndex,\\n currResetIndex: currResetIndex\\n });\\n }\\n\\n /**\\n * Retrieves the a buffer from the ring buffer by index.\\n * @param _self Buffer to access.\\n * @param _which Index of the sub buffer to access.\\n * @return Sub buffer for the index.\\n */\\n function getBuffer(\\n RingBuffer storage _self,\\n uint256 _which\\n )\\n internal\\n view\\n returns (\\n Buffer storage\\n )\\n {\\n return _which % 2 == 0 ? _self.bufferA : _self.bufferB;\\n }\\n}\\n\",\"keccak256\":\"0x0c4bb53aba64441b2ec26e7a13de8f04f104bb654e550ccc30db500cac33d2a3\"}},\"version\":1}", - "bytecode": "0x60806040523480156200001157600080fd5b50604051620013f3380380620013f3833981810160405260408110156200003757600080fd5b8151602083018051604051929492938301929190846401000000008211156200005f57600080fd5b9083019060208201858111156200007557600080fd5b82516401000000008111828201881017156200009057600080fd5b82525081516020918201929091019080838360005b83811015620000bf578181015183820152602001620000a5565b50505050905090810190601f168015620000ed5780820380516001836020036101000a031916815260200191505b506040525050600080546001600160a01b0319166001600160a01b038516179055508051620001249060019060208401906200012d565b505050620001d9565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282620001655760008555620001b0565b82601f106200018057805160ff1916838001178555620001b0565b82800160010185558215620001b0579182015b82811115620001b057825182559160200191906001019062000193565b50620001be929150620001c2565b5090565b5b80821115620001be5760008155600101620001c3565b61120a80620001e96000396000f3fe608060405234801561001057600080fd5b50600436106100cf5760003560e01c80634651d91e1161008c578063b298e36b11610066578063b298e36b14610315578063ccf8f96914610332578063d41c021814610355578063fa9e936c14610378576100cf565b80634651d91e1461025e5780638da5cb5b1461027b5780639507d39a146102f8576100cf565b806314f22255146100d4578063167fd681146101075780631f7b6d32146101325780632015276c1461014c57806329061de214610177578063461a44781461019c575b600080fd5b610105600480360360608110156100ea57600080fd5b508035906020810135906040013564ffffffffff1916610395565b005b6101056004803603604081101561011d57600080fd5b508035906020013564ffffffffff191661048c565b61013a61054c565b60408051918252519081900360200190f35b6101056004803603604081101561016257600080fd5b508035906020013564ffffffffff1916610564565b6101056004803603602081101561018d57600080fd5b503564ffffffffff1916610620565b610242600480360360208110156101b257600080fd5b8101906020810181356401000000008111156101cd57600080fd5b8201836020820111156101df57600080fd5b8035906020019184600183028401116401000000008311171561020157600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506106de945050505050565b604080516001600160a01b039092168252519081900360200190f35b6101056004803603602081101561027457600080fd5b50356107ba565b610283610875565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102bd5781810151838201526020016102a5565b50505050905090810190601f1680156102ea5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61013a6004803603602081101561030e57600080fd5b5035610902565b6101056004803603602081101561032b57600080fd5b503561091c565b61033a6109d7565b6040805164ffffffffff199092168252519081900360200190f35b6101056004803603604081101561036b57600080fd5b50803590602001356109e8565b6101056004803603602081101561038e57600080fd5b5035610aa4565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261042b93909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b820191906000526020600020905b81548152906001019060200180831161040457829003601f168201915b50505050506106de565b6001600160a01b0316336001600160a01b03161461047a5760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b6104876002848484610b59565b505050565b60018054604080516020601f6002600019610100878916150201909516949094049384018190048102820181019092528281526104ed93909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b6001600160a01b0316336001600160a01b03161461053c5760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b61054860028383610b75565b5050565b60006105586002610cb7565b64ffffffffff16905090565b60018054604080516020601f6002600019610100878916150201909516949094049384018190048102820181019092528281526105c593909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b6001600160a01b0316336001600160a01b0316146106145760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b61054860028383610ccb565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261068193909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b6001600160a01b0316336001600160a01b0316146106d05760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b6106db600282610dca565b50565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b8381101561073e578181015183820152602001610726565b50505050905090810190601f16801561076b5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561078857600080fd5b505afa15801561079c573d6000803e3d6000fd5b505050506040513d60208110156107b257600080fd5b505192915050565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261081b93909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b6001600160a01b0316336001600160a01b03161461086a5760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b6106db600282610def565b60018054604080516020600284861615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156108fa5780601f106108cf576101008083540402835291602001916108fa565b820191906000526020600020905b8154815290600101906020018083116108dd57829003601f168201915b505050505081565b6000610916600264ffffffffff8416610e15565b92915050565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261097d93909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b6001600160a01b0316336001600160a01b0316146109cc5760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b6106db60028261101e565b60006109e36002611044565b905090565b60018054604080516020601f600260001961010087891615020190951694909404938401819004810282018101909252828152610a4993909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b6001600160a01b0316336001600160a01b031614610a985760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b6105486002838361105b565b60018054604080516020601f600260001961010087891615020190951694909404938401819004810282018101909252828152610b0593909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b6001600160a01b0316336001600160a01b031614610b545760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b600855565b610b64848483610ccb565b610b6f848383610ccb565b50505050565b6000610b8084611083565b9050806000015164ffffffffff168364ffffffffff16108015610bb55750806060015164ffffffffff168364ffffffffff1610155b610bfd576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b6000610c20826040015167ffffffffffffffff16866110e390919063ffffffff16565b90506000610c48836040015160010167ffffffffffffffff16876110e390919063ffffffff16565b9050826080015164ffffffffff168564ffffffffff161015610c8c576040830180516000190167ffffffffffffffff169052606083015164ffffffffff1660808401525b64ffffffffff8516835264ffffffffff1984166020840152610cae8684611103565b50505050505050565b600080610cc383611083565b519392505050565b6000610cd684611083565b90506000610cfb826040015167ffffffffffffffff16866110e390919063ffffffff16565b8054909150610d0957601081555b8054608083015183510364ffffffffff1610610d80578460060154826080015164ffffffffff161015610d785760408201805160010167ffffffffffffffff169081905260808301805164ffffffffff90811660608601528451169052610d719086906110e3565b9050610d80565b805460020281555b608082015182510364ffffffffff9081166000818152600184810160209081526040909220889055855101909216845264ffffffffff19851691840191909152610cae8684611103565b6000610dd583611083565b64ffffffffff19831660208201529050610b6f8382611103565b6000610dfa83611083565b905061048782826020015185610b759092919063ffffffff16565b600080610e2184611083565b805190915064ffffffffff168310610e77576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b6000610e9a826040015167ffffffffffffffff16866110e390919063ffffffff16565b90506000610ec2836040015160010167ffffffffffffffff16876110e390919063ffffffff16565b9050826080015164ffffffffff168510610f4f576080830151825464ffffffffff9091168603908110610f33576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b6000908152600190920160205250604090205491506109169050565b6080830151606084015164ffffffffff9182168781039290911610610fb2576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b8154811115610fff576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b8154036000908152600190910160205260409020549250610916915050565b600061102983611083565b905061048782826020015185610ccb9092919063ffffffff16565b60008061105083611083565b602001519392505050565b600061106684611083565b9050610b6f8383836020015187610b59909392919063ffffffff16565b61108b611162565b5080546001909101546040805160a08101825264ffffffffff808516825264ffffffffff19909416602082015267ffffffffffffffff8316818301529082901c8316606082015260689190911c909116608082015290565b600060028206156110f757826004016110fc565b826002015b9392505050565b80516020820151604080840151606085015160808601518754600096868117969584901b8517606884901b17959094909390929091871461114257868a555b858a60010154146111555760018a018690555b5050505050505092915050565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091529056fe4f564d5f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2063616e206f6e6c792062652063616c6c656420627920746865206f776e65722ea264697066735822122037f5f91f3a7302668798afaeee2c0c2d9aad06dfcc80e263efc2cd8f4842eebe64736f6c63430007060033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100cf5760003560e01c80634651d91e1161008c578063b298e36b11610066578063b298e36b14610315578063ccf8f96914610332578063d41c021814610355578063fa9e936c14610378576100cf565b80634651d91e1461025e5780638da5cb5b1461027b5780639507d39a146102f8576100cf565b806314f22255146100d4578063167fd681146101075780631f7b6d32146101325780632015276c1461014c57806329061de214610177578063461a44781461019c575b600080fd5b610105600480360360608110156100ea57600080fd5b508035906020810135906040013564ffffffffff1916610395565b005b6101056004803603604081101561011d57600080fd5b508035906020013564ffffffffff191661048c565b61013a61054c565b60408051918252519081900360200190f35b6101056004803603604081101561016257600080fd5b508035906020013564ffffffffff1916610564565b6101056004803603602081101561018d57600080fd5b503564ffffffffff1916610620565b610242600480360360208110156101b257600080fd5b8101906020810181356401000000008111156101cd57600080fd5b8201836020820111156101df57600080fd5b8035906020019184600183028401116401000000008311171561020157600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506106de945050505050565b604080516001600160a01b039092168252519081900360200190f35b6101056004803603602081101561027457600080fd5b50356107ba565b610283610875565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102bd5781810151838201526020016102a5565b50505050905090810190601f1680156102ea5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61013a6004803603602081101561030e57600080fd5b5035610902565b6101056004803603602081101561032b57600080fd5b503561091c565b61033a6109d7565b6040805164ffffffffff199092168252519081900360200190f35b6101056004803603604081101561036b57600080fd5b50803590602001356109e8565b6101056004803603602081101561038e57600080fd5b5035610aa4565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261042b93909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b820191906000526020600020905b81548152906001019060200180831161040457829003601f168201915b50505050506106de565b6001600160a01b0316336001600160a01b03161461047a5760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b6104876002848484610b59565b505050565b60018054604080516020601f6002600019610100878916150201909516949094049384018190048102820181019092528281526104ed93909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b6001600160a01b0316336001600160a01b03161461053c5760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b61054860028383610b75565b5050565b60006105586002610cb7565b64ffffffffff16905090565b60018054604080516020601f6002600019610100878916150201909516949094049384018190048102820181019092528281526105c593909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b6001600160a01b0316336001600160a01b0316146106145760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b61054860028383610ccb565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261068193909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b6001600160a01b0316336001600160a01b0316146106d05760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b6106db600282610dca565b50565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b8381101561073e578181015183820152602001610726565b50505050905090810190601f16801561076b5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561078857600080fd5b505afa15801561079c573d6000803e3d6000fd5b505050506040513d60208110156107b257600080fd5b505192915050565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261081b93909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b6001600160a01b0316336001600160a01b03161461086a5760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b6106db600282610def565b60018054604080516020600284861615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156108fa5780601f106108cf576101008083540402835291602001916108fa565b820191906000526020600020905b8154815290600101906020018083116108dd57829003601f168201915b505050505081565b6000610916600264ffffffffff8416610e15565b92915050565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261097d93909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b6001600160a01b0316336001600160a01b0316146109cc5760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b6106db60028261101e565b60006109e36002611044565b905090565b60018054604080516020601f600260001961010087891615020190951694909404938401819004810282018101909252828152610a4993909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b6001600160a01b0316336001600160a01b031614610a985760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b6105486002838361105b565b60018054604080516020601f600260001961010087891615020190951694909404938401819004810282018101909252828152610b0593909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b6001600160a01b0316336001600160a01b031614610b545760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b600855565b610b64848483610ccb565b610b6f848383610ccb565b50505050565b6000610b8084611083565b9050806000015164ffffffffff168364ffffffffff16108015610bb55750806060015164ffffffffff168364ffffffffff1610155b610bfd576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b6000610c20826040015167ffffffffffffffff16866110e390919063ffffffff16565b90506000610c48836040015160010167ffffffffffffffff16876110e390919063ffffffff16565b9050826080015164ffffffffff168564ffffffffff161015610c8c576040830180516000190167ffffffffffffffff169052606083015164ffffffffff1660808401525b64ffffffffff8516835264ffffffffff1984166020840152610cae8684611103565b50505050505050565b600080610cc383611083565b519392505050565b6000610cd684611083565b90506000610cfb826040015167ffffffffffffffff16866110e390919063ffffffff16565b8054909150610d0957601081555b8054608083015183510364ffffffffff1610610d80578460060154826080015164ffffffffff161015610d785760408201805160010167ffffffffffffffff169081905260808301805164ffffffffff90811660608601528451169052610d719086906110e3565b9050610d80565b805460020281555b608082015182510364ffffffffff9081166000818152600184810160209081526040909220889055855101909216845264ffffffffff19851691840191909152610cae8684611103565b6000610dd583611083565b64ffffffffff19831660208201529050610b6f8382611103565b6000610dfa83611083565b905061048782826020015185610b759092919063ffffffff16565b600080610e2184611083565b805190915064ffffffffff168310610e77576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b6000610e9a826040015167ffffffffffffffff16866110e390919063ffffffff16565b90506000610ec2836040015160010167ffffffffffffffff16876110e390919063ffffffff16565b9050826080015164ffffffffff168510610f4f576080830151825464ffffffffff9091168603908110610f33576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b6000908152600190920160205250604090205491506109169050565b6080830151606084015164ffffffffff9182168781039290911610610fb2576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b8154811115610fff576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b8154036000908152600190910160205260409020549250610916915050565b600061102983611083565b905061048782826020015185610ccb9092919063ffffffff16565b60008061105083611083565b602001519392505050565b600061106684611083565b9050610b6f8383836020015187610b59909392919063ffffffff16565b61108b611162565b5080546001909101546040805160a08101825264ffffffffff808516825264ffffffffff19909416602082015267ffffffffffffffff8316818301529082901c8316606082015260689190911c909116608082015290565b600060028206156110f757826004016110fc565b826002015b9392505050565b80516020820151604080840151606085015160808601518754600096868117969584901b8517606884901b17959094909390929091871461114257868a555b858a60010154146111555760018a018690555b5050505050505092915050565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091529056fe4f564d5f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2063616e206f6e6c792062652063616c6c656420627920746865206f776e65722ea264697066735822122037f5f91f3a7302668798afaeee2c0c2d9aad06dfcc80e263efc2cd8f4842eebe64736f6c63430007060033", - "devdoc": { - "kind": "dev", - "methods": { - "constructor": { - "params": { - "_libAddressManager": "Address of the Address Manager.", - "_owner": "Name of the contract that owns this container (will be resolved later)." - } - }, - "deleteElementsAfterInclusive(uint256)": { - "params": { - "_index": "Object index to delete from." - } - }, - "deleteElementsAfterInclusive(uint256,bytes27)": { - "params": { - "_globalMetadata": "New global metadata for the container.", - "_index": "Object index to delete from." - } - }, - "get(uint256)": { - "params": { - "_index": "Index of the particular object to access." - }, - "returns": { - "_0": "32 byte object value." - } - }, - "getGlobalMetadata()": { - "returns": { - "_0": "Container global metadata field." - } - }, - "length()": { - "returns": { - "_0": "Number of objects in the container." - } - }, - "push(bytes32)": { - "params": { - "_object": "A 32 byte value to insert into the container." - } - }, - "push(bytes32,bytes27)": { - "params": { - "_globalMetadata": "New global metadata for the container.", - "_object": "A 32 byte value to insert into the container." - } - }, - "push2(bytes32,bytes32)": { - "params": { - "_objectA": "First 32 byte value to insert into the container.", - "_objectB": "Second 32 byte value to insert into the container." - } - }, - "push2(bytes32,bytes32,bytes27)": { - "params": { - "_globalMetadata": "New global metadata for the container.", - "_objectA": "First 32 byte value to insert into the container.", - "_objectB": "Second 32 byte value to insert into the container." - } - }, - "setGlobalMetadata(bytes27)": { - "params": { - "_globalMetadata": "New global metadata to set." - } - } - }, - "title": "OVM_ChainStorageContainer", - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": { - "deleteElementsAfterInclusive(uint256)": { - "notice": "Removes all objects after and including a given index." - }, - "deleteElementsAfterInclusive(uint256,bytes27)": { - "notice": "Removes all objects after and including a given index. Also allows setting the global metadata field." - }, - "get(uint256)": { - "notice": "Retrieves an object from the container." - }, - "getGlobalMetadata()": { - "notice": "Retrieves the container's global metadata field." - }, - "length()": { - "notice": "Retrieves the number of objects stored in the container." - }, - "push(bytes32)": { - "notice": "Pushes an object into the container." - }, - "push(bytes32,bytes27)": { - "notice": "Pushes an object into the container. Function allows setting the global metadata since we'll need to touch the \"length\" storage slot anyway, which also contains the global metadata (it's an optimization)." - }, - "push2(bytes32,bytes32)": { - "notice": "Pushes two objects into the container at the same time. A useful optimization." - }, - "push2(bytes32,bytes32,bytes27)": { - "notice": "Pushes two objects into the container at the same time. Also allows setting the global metadata field." - }, - "setGlobalMetadata(bytes27)": { - "notice": "Sets the container's global metadata field. We're using `bytes27` here because we use five bytes to maintain the length of the underlying data structure, meaning we have an extra 27 bytes to store arbitrary data." - }, - "setNextOverwritableIndex(uint256)": { - "notice": "Marks an index as overwritable, meaing the underlying buffer can start to write values over any objects before and including the given index." - } - }, - "version": 1 - }, - "storageLayout": { - "storage": [ - { - "astId": 11707, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "libAddressManager", - "offset": 0, - "slot": "0", - "type": "t_contract(Lib_AddressManager)11700" - }, - { - "astId": 2888, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "owner", - "offset": 0, - "slot": "1", - "type": "t_string_storage" - }, - { - "astId": 2890, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "buffer", - "offset": 0, - "slot": "2", - "type": "t_struct(RingBuffer)16365_storage" - } - ], - "types": { - "t_bytes32": { - "encoding": "inplace", - "label": "bytes32", - "numberOfBytes": "32" - }, - "t_contract(Lib_AddressManager)11700": { - "encoding": "inplace", - "label": "contract Lib_AddressManager", - "numberOfBytes": "20" - }, - "t_mapping(t_uint256,t_bytes32)": { - "encoding": "mapping", - "key": "t_uint256", - "label": "mapping(uint256 => bytes32)", - "numberOfBytes": "32", - "value": "t_bytes32" - }, - "t_string_storage": { - "encoding": "bytes", - "label": "string", - "numberOfBytes": "32" - }, - "t_struct(Buffer)16354_storage": { - "encoding": "inplace", - "label": "struct Lib_RingBuffer.Buffer", - "members": [ - { - "astId": 16349, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "length", - "offset": 0, - "slot": "0", - "type": "t_uint256" - }, - { - "astId": 16353, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "buf", - "offset": 0, - "slot": "1", - "type": "t_mapping(t_uint256,t_bytes32)" - } - ], - "numberOfBytes": "64" - }, - "t_struct(RingBuffer)16365_storage": { - "encoding": "inplace", - "label": "struct Lib_RingBuffer.RingBuffer", - "members": [ - { - "astId": 16356, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "contextA", - "offset": 0, - "slot": "0", - "type": "t_bytes32" - }, - { - "astId": 16358, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "contextB", - "offset": 0, - "slot": "1", - "type": "t_bytes32" - }, - { - "astId": 16360, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "bufferA", - "offset": 0, - "slot": "2", - "type": "t_struct(Buffer)16354_storage" - }, - { - "astId": 16362, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "bufferB", - "offset": 0, - "slot": "4", - "type": "t_struct(Buffer)16354_storage" - }, - { - "astId": 16364, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "nextOverwritableIndex", - "offset": 0, - "slot": "6", - "type": "t_uint256" - } - ], - "numberOfBytes": "224" - }, - "t_uint256": { - "encoding": "inplace", - "label": "uint256", - "numberOfBytes": "32" - } - } - } -} \ No newline at end of file diff --git a/packages/contracts/deployments/mainnet-v1/OVM_ChainStorageContainer-CTC-queue.json b/packages/contracts/deployments/mainnet-v1/OVM_ChainStorageContainer-CTC-queue.json deleted file mode 100644 index 5d50dd94572c1..0000000000000 --- a/packages/contracts/deployments/mainnet-v1/OVM_ChainStorageContainer-CTC-queue.json +++ /dev/null @@ -1,488 +0,0 @@ -{ - "address": "0x62De49fe8215DFF88b9C1a2ea573E1471fF61f83", - "abi": [ - { - "inputs": [ - { - "internalType": "address", - "name": "_libAddressManager", - "type": "address" - }, - { - "internalType": "string", - "name": "_owner", - "type": "string" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_index", - "type": "uint256" - }, - { - "internalType": "bytes27", - "name": "_globalMetadata", - "type": "bytes27" - } - ], - "name": "deleteElementsAfterInclusive", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_index", - "type": "uint256" - } - ], - "name": "deleteElementsAfterInclusive", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_index", - "type": "uint256" - } - ], - "name": "get", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getGlobalMetadata", - "outputs": [ - { - "internalType": "bytes27", - "name": "", - "type": "bytes27" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "length", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "owner", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "_object", - "type": "bytes32" - }, - { - "internalType": "bytes27", - "name": "_globalMetadata", - "type": "bytes27" - } - ], - "name": "push", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "_object", - "type": "bytes32" - } - ], - "name": "push", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "_objectA", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "_objectB", - "type": "bytes32" - }, - { - "internalType": "bytes27", - "name": "_globalMetadata", - "type": "bytes27" - } - ], - "name": "push2", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "_objectA", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "_objectB", - "type": "bytes32" - } - ], - "name": "push2", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "string", - "name": "_name", - "type": "string" - } - ], - "name": "resolve", - "outputs": [ - { - "internalType": "address", - "name": "_contract", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes27", - "name": "_globalMetadata", - "type": "bytes27" - } - ], - "name": "setGlobalMetadata", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_index", - "type": "uint256" - } - ], - "name": "setNextOverwritableIndex", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - } - ], - "transactionHash": "0x99b89c2345373c5b66554e90da495293799b15988d76cbddc60ff7ab8e9cb996", - "receipt": { - "to": null, - "from": "0x558ba9b8d78713fbf768c1f8a584485B4003f43F", - "contractAddress": "0xC9DE904214A3496b23E54d7876e4A5CfD4584F49", - "transactionIndex": 0, - "gasUsed": "1103714", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0xc4de8bb6a3be0356605a754b0f0913dc2d1ce2a52dd31480cf90815785cd7e9e", - "transactionHash": "0x99b89c2345373c5b66554e90da495293799b15988d76cbddc60ff7ab8e9cb996", - "logs": [], - "blockNumber": 4573379, - "cumulativeGasUsed": "1103714", - "status": 1, - "byzantium": true - }, - "args": [ - "0x1De8CFD4C1A486200286073aE91DE6e8099519f1", - "OVM_CanonicalTransactionChain" - ], - "solcInputHash": "cebcb515c1a9c570d96e0b8f6fd237e2", - "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_owner\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"get\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getGlobalMetadata\",\"outputs\":[{\"internalType\":\"bytes27\",\"name\":\"\",\"type\":\"bytes27\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"length\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_objectA\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"_objectB\",\"type\":\"bytes32\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"push2\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_objectA\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"_objectB\",\"type\":\"bytes32\"}],\"name\":\"push2\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"_contract\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"setGlobalMetadata\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"setNextOverwritableIndex\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\",\"_owner\":\"Name of the contract that owns this container (will be resolved later).\"}},\"deleteElementsAfterInclusive(uint256)\":{\"params\":{\"_index\":\"Object index to delete from.\"}},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_index\":\"Object index to delete from.\"}},\"get(uint256)\":{\"params\":{\"_index\":\"Index of the particular object to access.\"},\"returns\":{\"_0\":\"32 byte object value.\"}},\"getGlobalMetadata()\":{\"returns\":{\"_0\":\"Container global metadata field.\"}},\"length()\":{\"returns\":{\"_0\":\"Number of objects in the container.\"}},\"push(bytes32)\":{\"params\":{\"_object\":\"A 32 byte value to insert into the container.\"}},\"push(bytes32,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_object\":\"A 32 byte value to insert into the container.\"}},\"push2(bytes32,bytes32)\":{\"params\":{\"_objectA\":\"First 32 byte value to insert into the container.\",\"_objectB\":\"Second 32 byte value to insert into the container.\"}},\"push2(bytes32,bytes32,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_objectA\":\"First 32 byte value to insert into the container.\",\"_objectB\":\"Second 32 byte value to insert into the container.\"}},\"setGlobalMetadata(bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata to set.\"}}},\"title\":\"OVM_ChainStorageContainer\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"deleteElementsAfterInclusive(uint256)\":{\"notice\":\"Removes all objects after and including a given index.\"},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"notice\":\"Removes all objects after and including a given index. Also allows setting the global metadata field.\"},\"get(uint256)\":{\"notice\":\"Retrieves an object from the container.\"},\"getGlobalMetadata()\":{\"notice\":\"Retrieves the container's global metadata field.\"},\"length()\":{\"notice\":\"Retrieves the number of objects stored in the container.\"},\"push(bytes32)\":{\"notice\":\"Pushes an object into the container.\"},\"push(bytes32,bytes27)\":{\"notice\":\"Pushes an object into the container. Function allows setting the global metadata since we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global metadata (it's an optimization).\"},\"push2(bytes32,bytes32)\":{\"notice\":\"Pushes two objects into the container at the same time. A useful optimization.\"},\"push2(bytes32,bytes32,bytes27)\":{\"notice\":\"Pushes two objects into the container at the same time. Also allows setting the global metadata field.\"},\"setGlobalMetadata(bytes27)\":{\"notice\":\"Sets the container's global metadata field. We're using `bytes27` here because we use five bytes to maintain the length of the underlying data structure, meaning we have an extra 27 bytes to store arbitrary data.\"},\"setNextOverwritableIndex(uint256)\":{\"notice\":\"Marks an index as overwritable, meaing the underlying buffer can start to write values over any objects before and including the given index.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol\":\"OVM_ChainStorageContainer\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol\":{\"content\":\"pragma solidity ^0.7.0;\\n\\n/* Library Imports */\\nimport { Lib_RingBuffer } from \\\"../../libraries/utils/Lib_RingBuffer.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_ChainStorageContainer } from \\\"../../iOVM/chain/iOVM_ChainStorageContainer.sol\\\";\\n\\n/**\\n * @title OVM_ChainStorageContainer\\n */\\ncontract OVM_ChainStorageContainer is iOVM_ChainStorageContainer, Lib_AddressResolver {\\n\\n /*************\\n * Libraries *\\n *************/\\n\\n using Lib_RingBuffer for Lib_RingBuffer.RingBuffer;\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n string public owner;\\n Lib_RingBuffer.RingBuffer internal buffer;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n \\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n * @param _owner Name of the contract that owns this container (will be resolved later).\\n */\\n constructor(\\n address _libAddressManager,\\n string memory _owner\\n )\\n Lib_AddressResolver(_libAddressManager)\\n {\\n owner = _owner;\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n \\n modifier onlyOwner() {\\n require(\\n msg.sender == resolve(owner),\\n \\\"OVM_ChainStorageContainer: Function can only be called by the owner.\\\"\\n );\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function setGlobalMetadata(\\n bytes27 _globalMetadata\\n )\\n override\\n public\\n onlyOwner\\n {\\n return buffer.setExtraData(_globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function getGlobalMetadata()\\n override\\n public\\n view\\n returns (\\n bytes27\\n )\\n {\\n return buffer.getExtraData();\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function length()\\n override\\n public\\n view\\n returns (\\n uint256\\n )\\n {\\n return uint256(buffer.getLength());\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function push(\\n bytes32 _object\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.push(_object);\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function push(\\n bytes32 _object,\\n bytes27 _globalMetadata\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.push(_object, _globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function push2(\\n bytes32 _objectA,\\n bytes32 _objectB\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.push2(_objectA, _objectB);\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function push2(\\n bytes32 _objectA,\\n bytes32 _objectB,\\n bytes27 _globalMetadata\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.push2(_objectA, _objectB, _globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function get(\\n uint256 _index\\n )\\n override\\n public\\n view\\n returns (\\n bytes32\\n )\\n {\\n return buffer.get(uint40(_index));\\n }\\n \\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.deleteElementsAfterInclusive(\\n uint40(_index)\\n );\\n }\\n \\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index,\\n bytes27 _globalMetadata\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.deleteElementsAfterInclusive(\\n uint40(_index),\\n _globalMetadata\\n );\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function setNextOverwritableIndex(\\n uint256 _index\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.nextOverwritableIndex = _index;\\n }\\n}\\n\",\"keccak256\":\"0xc722e9528988810bd754002dfe3923bc9ac9252c1d981c4803fd5053603bfb11\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_ChainStorageContainer.sol\":{\"content\":\"pragma solidity ^0.7.0;\\n\\n/**\\n * @title iOVM_ChainStorageContainer\\n */\\ninterface iOVM_ChainStorageContainer {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata()\\n external\\n view\\n returns (\\n bytes27\\n );\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length()\\n external\\n view\\n returns (\\n uint256\\n );\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(\\n bytes32 _object\\n )\\n external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(\\n bytes32 _object,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Pushes two objects into the container at the same time. A useful optimization.\\n * @param _objectA First 32 byte value to insert into the container.\\n * @param _objectB Second 32 byte value to insert into the container.\\n */\\n function push2(\\n bytes32 _objectA,\\n bytes32 _objectB\\n )\\n external;\\n\\n /**\\n * Pushes two objects into the container at the same time. Also allows setting the global\\n * metadata field.\\n * @param _objectA First 32 byte value to insert into the container.\\n * @param _objectB Second 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push2(\\n bytes32 _objectA,\\n bytes32 _objectB,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(\\n uint256 _index\\n )\\n external\\n view\\n returns (\\n bytes32\\n );\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index\\n )\\n external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Marks an index as overwritable, meaing the underlying buffer can start to write values over\\n * any objects before and including the given index.\\n */\\n function setNextOverwritableIndex(\\n uint256 _index\\n )\\n external;\\n}\\n\",\"keccak256\":\"0xcfca7da85b35d94c27581c2460b0d48fd0cc51fa72670cc7a2f7f760fb21a2f0\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// +build ovm\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Contract Imports */\\nimport { Ownable } from \\\"./Lib_Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n /*******************************************\\n * Contract Variables: Internal Accounting *\\n *******************************************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n public\\n onlyOwner\\n {\\n emit AddressSet(_name, _address);\\n addresses[_getNameHash(_name)] = _address;\\n }\\n\\n function getAddress(\\n string memory _name\\n )\\n public\\n view\\n returns (address)\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32 _hash\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xdf802e1cc6474df913626991e9fca3835c620a519f397afe04bf9c260e723257\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// +build ovm\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\ncontract Lib_AddressResolver {\\n\\n /*******************************************\\n * Contract Variables: Contract References *\\n *******************************************/\\n\\n Lib_AddressManager internal libAddressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(\\n address _libAddressManager\\n ) public {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function resolve(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address _contract\\n )\\n {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0xf3b9d78b309ddeec259ce3e0e1cfdef3ca40938e9a81971b28ce2b8ea327f533\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// +build ovm\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Ownable\\n * @dev Adapted from https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol\\n */\\nabstract contract Ownable {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n address public owner;\\n\\n\\n /**********\\n * Events *\\n **********/\\n\\n event OwnershipTransferred(\\n address indexed previousOwner,\\n address indexed newOwner\\n );\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n constructor() internal {\\n owner = msg.sender;\\n emit OwnershipTransferred(address(0), owner);\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n owner == msg.sender,\\n \\\"Ownable: caller is not the owner\\\"\\n );\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function renounceOwnership()\\n public\\n virtual\\n onlyOwner\\n {\\n emit OwnershipTransferred(owner, address(0));\\n owner = address(0);\\n }\\n\\n function transferOwnership(address _newOwner)\\n public\\n virtual\\n onlyOwner\\n {\\n require(\\n _newOwner != address(0),\\n \\\"Ownable: new owner cannot be the zero address\\\"\\n );\\n\\n emit OwnershipTransferred(owner, _newOwner);\\n owner = _newOwner;\\n }\\n}\\n\",\"keccak256\":\"0xe0409fbd236d16ca6be439d9d97dd36d0d9a0697ee0062d49588b9d29c248e47\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_RingBuffer.sol\":{\"content\":\"pragma solidity ^0.7.0;\\n\\nlibrary Lib_RingBuffer {\\n using Lib_RingBuffer for RingBuffer;\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Buffer {\\n uint256 length;\\n mapping (uint256 => bytes32) buf;\\n }\\n\\n struct RingBuffer {\\n bytes32 contextA;\\n bytes32 contextB;\\n Buffer bufferA;\\n Buffer bufferB;\\n uint256 nextOverwritableIndex;\\n }\\n\\n struct RingBufferContext {\\n // contextA\\n uint40 globalIndex;\\n bytes27 extraData;\\n\\n // contextB\\n uint64 currBufferIndex;\\n uint40 prevResetIndex;\\n uint40 currResetIndex;\\n }\\n\\n\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 constant MIN_CAPACITY = 16;\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n * @param _extraData Optional global extra data.\\n */\\n function push(\\n RingBuffer storage _self,\\n bytes32 _value,\\n bytes27 _extraData\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n Buffer storage currBuffer = _self.getBuffer(ctx.currBufferIndex);\\n\\n // Set a minimum capacity.\\n if (currBuffer.length == 0) {\\n currBuffer.length = MIN_CAPACITY;\\n }\\n\\n // Check if we need to expand the buffer.\\n if (ctx.globalIndex - ctx.currResetIndex >= currBuffer.length) {\\n if (ctx.currResetIndex < _self.nextOverwritableIndex) {\\n // We're going to overwrite the inactive buffer.\\n // Bump the buffer index, reset the delete offset, and set our reset indices.\\n ctx.currBufferIndex++;\\n ctx.prevResetIndex = ctx.currResetIndex;\\n ctx.currResetIndex = ctx.globalIndex;\\n\\n // Swap over to the next buffer.\\n currBuffer = _self.getBuffer(ctx.currBufferIndex);\\n } else {\\n // We're not overwriting yet, double the length of the current buffer.\\n currBuffer.length *= 2;\\n }\\n }\\n\\n // Index to write to is the difference of the global and reset indices.\\n uint256 writeHead = ctx.globalIndex - ctx.currResetIndex;\\n currBuffer.buf[writeHead] = _value;\\n\\n // Bump the global index and insert our extra data, then save the context.\\n ctx.globalIndex++;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n */\\n function push(\\n RingBuffer storage _self,\\n bytes32 _value\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n \\n _self.push(\\n _value,\\n ctx.extraData\\n );\\n }\\n\\n /**\\n * Pushes a two elements to the buffer.\\n * @param _self Buffer to access.\\n * @param _valueA First value to push to the buffer.\\n * @param _valueA Second value to push to the buffer.\\n * @param _extraData Optional global extra data.\\n */\\n function push2(\\n RingBuffer storage _self,\\n bytes32 _valueA,\\n bytes32 _valueB,\\n bytes27 _extraData\\n )\\n internal\\n {\\n _self.push(_valueA, _extraData);\\n _self.push(_valueB, _extraData);\\n }\\n\\n /**\\n * Pushes a two elements to the buffer.\\n * @param _self Buffer to access.\\n * @param _valueA First value to push to the buffer.\\n * @param _valueA Second value to push to the buffer.\\n */\\n function push2(\\n RingBuffer storage _self,\\n bytes32 _valueA,\\n bytes32 _valueB\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n\\n _self.push2(\\n _valueA,\\n _valueB,\\n ctx.extraData\\n );\\n }\\n\\n /**\\n * Retrieves an element from the buffer.\\n * @param _self Buffer to access.\\n * @param _index Element index to retrieve.\\n * @return Value of the element at the given index.\\n */\\n function get(\\n RingBuffer storage _self,\\n uint256 _index\\n )\\n internal\\n view\\n returns (\\n bytes32 \\n )\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n\\n require(\\n _index < ctx.globalIndex,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n Buffer storage currBuffer = _self.getBuffer(ctx.currBufferIndex);\\n Buffer storage prevBuffer = _self.getBuffer(ctx.currBufferIndex + 1);\\n\\n if (_index >= ctx.currResetIndex) {\\n // We're trying to load an element from the current buffer.\\n // Relative index is just the difference from the reset index.\\n uint256 relativeIndex = _index - ctx.currResetIndex;\\n\\n // Shouldn't happen but why not check.\\n require(\\n relativeIndex < currBuffer.length,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n return currBuffer.buf[relativeIndex];\\n } else {\\n // We're trying to load an element from the previous buffer.\\n // Relative index is the difference from the reset index in the other direction.\\n uint256 relativeIndex = ctx.currResetIndex - _index;\\n\\n // Condition only fails in the case that we deleted and flipped buffers.\\n require(\\n ctx.currResetIndex > ctx.prevResetIndex,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n // Make sure we're not trying to read beyond the array.\\n require(\\n relativeIndex <= prevBuffer.length,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n return prevBuffer.buf[prevBuffer.length - relativeIndex];\\n }\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n * @param _extraData Optional global extra data.\\n */\\n function deleteElementsAfterInclusive(\\n RingBuffer storage _self,\\n uint40 _index,\\n bytes27 _extraData\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n\\n require(\\n _index < ctx.globalIndex && _index >= ctx.prevResetIndex,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n Buffer storage currBuffer = _self.getBuffer(ctx.currBufferIndex);\\n Buffer storage prevBuffer = _self.getBuffer(ctx.currBufferIndex + 1);\\n\\n if (_index < ctx.currResetIndex) {\\n // We're switching back to the previous buffer.\\n // Reduce the buffer index, set the current reset index back to match the previous one.\\n // We use the equality of these two values to prevent reading beyond this buffer.\\n ctx.currBufferIndex--;\\n ctx.currResetIndex = ctx.prevResetIndex;\\n }\\n\\n // Set our global index and extra data, save the context.\\n ctx.globalIndex = _index;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n */\\n function deleteElementsAfterInclusive(\\n RingBuffer storage _self,\\n uint40 _index\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n _self.deleteElementsAfterInclusive(\\n _index,\\n ctx.extraData\\n );\\n }\\n\\n /**\\n * Retrieves the current global index.\\n * @param _self Buffer to access.\\n * @return Current global index.\\n */\\n function getLength(\\n RingBuffer storage _self\\n )\\n internal\\n view\\n returns (\\n uint40\\n )\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n return ctx.globalIndex;\\n }\\n\\n /**\\n * Changes current global extra data.\\n * @param _self Buffer to access.\\n * @param _extraData New global extra data.\\n */\\n function setExtraData(\\n RingBuffer storage _self,\\n bytes27 _extraData\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Retrieves the current global extra data.\\n * @param _self Buffer to access.\\n * @return Current global extra data.\\n */\\n function getExtraData(\\n RingBuffer storage _self\\n )\\n internal\\n view\\n returns (\\n bytes27\\n )\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n return ctx.extraData;\\n }\\n\\n /**\\n * Sets the current ring buffer context.\\n * @param _self Buffer to access.\\n * @param _ctx Current ring buffer context.\\n */\\n function setContext(\\n RingBuffer storage _self,\\n RingBufferContext memory _ctx\\n )\\n internal\\n returns (\\n bytes32\\n )\\n {\\n bytes32 contextA;\\n bytes32 contextB;\\n\\n uint40 globalIndex = _ctx.globalIndex;\\n bytes27 extraData = _ctx.extraData;\\n assembly {\\n contextA := globalIndex\\n contextA := or(contextA, extraData)\\n }\\n\\n uint64 currBufferIndex = _ctx.currBufferIndex;\\n uint40 prevResetIndex = _ctx.prevResetIndex;\\n uint40 currResetIndex = _ctx.currResetIndex;\\n assembly {\\n contextB := currBufferIndex\\n contextB := or(contextB, shl(64, prevResetIndex))\\n contextB := or(contextB, shl(104, currResetIndex))\\n }\\n\\n if (_self.contextA != contextA) {\\n _self.contextA = contextA;\\n }\\n\\n if (_self.contextB != contextB) {\\n _self.contextB = contextB;\\n }\\n }\\n\\n /**\\n * Retrieves the current ring buffer context.\\n * @param _self Buffer to access.\\n * @return Current ring buffer context.\\n */\\n function getContext(\\n RingBuffer storage _self\\n )\\n internal\\n view\\n returns (\\n RingBufferContext memory\\n )\\n {\\n bytes32 contextA = _self.contextA;\\n bytes32 contextB = _self.contextB;\\n\\n uint40 globalIndex;\\n bytes27 extraData;\\n assembly {\\n globalIndex := and(contextA, 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF)\\n extraData := and(contextA, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000)\\n }\\n\\n uint64 currBufferIndex;\\n uint40 prevResetIndex;\\n uint40 currResetIndex;\\n assembly {\\n currBufferIndex := and(contextB, 0x000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF)\\n prevResetIndex := shr(64, and(contextB, 0x00000000000000000000000000000000000000FFFFFFFFFF0000000000000000))\\n currResetIndex := shr(104, and(contextB, 0x0000000000000000000000000000FFFFFFFFFF00000000000000000000000000))\\n }\\n\\n return RingBufferContext({\\n globalIndex: globalIndex,\\n extraData: extraData,\\n currBufferIndex: currBufferIndex,\\n prevResetIndex: prevResetIndex,\\n currResetIndex: currResetIndex\\n });\\n }\\n\\n /**\\n * Retrieves the a buffer from the ring buffer by index.\\n * @param _self Buffer to access.\\n * @param _which Index of the sub buffer to access.\\n * @return Sub buffer for the index.\\n */\\n function getBuffer(\\n RingBuffer storage _self,\\n uint256 _which\\n )\\n internal\\n view\\n returns (\\n Buffer storage\\n )\\n {\\n return _which % 2 == 0 ? _self.bufferA : _self.bufferB;\\n }\\n}\\n\",\"keccak256\":\"0x0c4bb53aba64441b2ec26e7a13de8f04f104bb654e550ccc30db500cac33d2a3\"}},\"version\":1}", - "bytecode": "0x60806040523480156200001157600080fd5b50604051620013f3380380620013f3833981810160405260408110156200003757600080fd5b8151602083018051604051929492938301929190846401000000008211156200005f57600080fd5b9083019060208201858111156200007557600080fd5b82516401000000008111828201881017156200009057600080fd5b82525081516020918201929091019080838360005b83811015620000bf578181015183820152602001620000a5565b50505050905090810190601f168015620000ed5780820380516001836020036101000a031916815260200191505b506040525050600080546001600160a01b0319166001600160a01b038516179055508051620001249060019060208401906200012d565b505050620001d9565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282620001655760008555620001b0565b82601f106200018057805160ff1916838001178555620001b0565b82800160010185558215620001b0579182015b82811115620001b057825182559160200191906001019062000193565b50620001be929150620001c2565b5090565b5b80821115620001be5760008155600101620001c3565b61120a80620001e96000396000f3fe608060405234801561001057600080fd5b50600436106100cf5760003560e01c80634651d91e1161008c578063b298e36b11610066578063b298e36b14610315578063ccf8f96914610332578063d41c021814610355578063fa9e936c14610378576100cf565b80634651d91e1461025e5780638da5cb5b1461027b5780639507d39a146102f8576100cf565b806314f22255146100d4578063167fd681146101075780631f7b6d32146101325780632015276c1461014c57806329061de214610177578063461a44781461019c575b600080fd5b610105600480360360608110156100ea57600080fd5b508035906020810135906040013564ffffffffff1916610395565b005b6101056004803603604081101561011d57600080fd5b508035906020013564ffffffffff191661048c565b61013a61054c565b60408051918252519081900360200190f35b6101056004803603604081101561016257600080fd5b508035906020013564ffffffffff1916610564565b6101056004803603602081101561018d57600080fd5b503564ffffffffff1916610620565b610242600480360360208110156101b257600080fd5b8101906020810181356401000000008111156101cd57600080fd5b8201836020820111156101df57600080fd5b8035906020019184600183028401116401000000008311171561020157600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506106de945050505050565b604080516001600160a01b039092168252519081900360200190f35b6101056004803603602081101561027457600080fd5b50356107ba565b610283610875565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102bd5781810151838201526020016102a5565b50505050905090810190601f1680156102ea5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61013a6004803603602081101561030e57600080fd5b5035610902565b6101056004803603602081101561032b57600080fd5b503561091c565b61033a6109d7565b6040805164ffffffffff199092168252519081900360200190f35b6101056004803603604081101561036b57600080fd5b50803590602001356109e8565b6101056004803603602081101561038e57600080fd5b5035610aa4565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261042b93909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b820191906000526020600020905b81548152906001019060200180831161040457829003601f168201915b50505050506106de565b6001600160a01b0316336001600160a01b03161461047a5760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b6104876002848484610b59565b505050565b60018054604080516020601f6002600019610100878916150201909516949094049384018190048102820181019092528281526104ed93909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b6001600160a01b0316336001600160a01b03161461053c5760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b61054860028383610b75565b5050565b60006105586002610cb7565b64ffffffffff16905090565b60018054604080516020601f6002600019610100878916150201909516949094049384018190048102820181019092528281526105c593909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b6001600160a01b0316336001600160a01b0316146106145760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b61054860028383610ccb565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261068193909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b6001600160a01b0316336001600160a01b0316146106d05760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b6106db600282610dca565b50565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b8381101561073e578181015183820152602001610726565b50505050905090810190601f16801561076b5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561078857600080fd5b505afa15801561079c573d6000803e3d6000fd5b505050506040513d60208110156107b257600080fd5b505192915050565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261081b93909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b6001600160a01b0316336001600160a01b03161461086a5760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b6106db600282610def565b60018054604080516020600284861615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156108fa5780601f106108cf576101008083540402835291602001916108fa565b820191906000526020600020905b8154815290600101906020018083116108dd57829003601f168201915b505050505081565b6000610916600264ffffffffff8416610e15565b92915050565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261097d93909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b6001600160a01b0316336001600160a01b0316146109cc5760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b6106db60028261101e565b60006109e36002611044565b905090565b60018054604080516020601f600260001961010087891615020190951694909404938401819004810282018101909252828152610a4993909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b6001600160a01b0316336001600160a01b031614610a985760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b6105486002838361105b565b60018054604080516020601f600260001961010087891615020190951694909404938401819004810282018101909252828152610b0593909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b6001600160a01b0316336001600160a01b031614610b545760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b600855565b610b64848483610ccb565b610b6f848383610ccb565b50505050565b6000610b8084611083565b9050806000015164ffffffffff168364ffffffffff16108015610bb55750806060015164ffffffffff168364ffffffffff1610155b610bfd576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b6000610c20826040015167ffffffffffffffff16866110e390919063ffffffff16565b90506000610c48836040015160010167ffffffffffffffff16876110e390919063ffffffff16565b9050826080015164ffffffffff168564ffffffffff161015610c8c576040830180516000190167ffffffffffffffff169052606083015164ffffffffff1660808401525b64ffffffffff8516835264ffffffffff1984166020840152610cae8684611103565b50505050505050565b600080610cc383611083565b519392505050565b6000610cd684611083565b90506000610cfb826040015167ffffffffffffffff16866110e390919063ffffffff16565b8054909150610d0957601081555b8054608083015183510364ffffffffff1610610d80578460060154826080015164ffffffffff161015610d785760408201805160010167ffffffffffffffff169081905260808301805164ffffffffff90811660608601528451169052610d719086906110e3565b9050610d80565b805460020281555b608082015182510364ffffffffff9081166000818152600184810160209081526040909220889055855101909216845264ffffffffff19851691840191909152610cae8684611103565b6000610dd583611083565b64ffffffffff19831660208201529050610b6f8382611103565b6000610dfa83611083565b905061048782826020015185610b759092919063ffffffff16565b600080610e2184611083565b805190915064ffffffffff168310610e77576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b6000610e9a826040015167ffffffffffffffff16866110e390919063ffffffff16565b90506000610ec2836040015160010167ffffffffffffffff16876110e390919063ffffffff16565b9050826080015164ffffffffff168510610f4f576080830151825464ffffffffff9091168603908110610f33576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b6000908152600190920160205250604090205491506109169050565b6080830151606084015164ffffffffff9182168781039290911610610fb2576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b8154811115610fff576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b8154036000908152600190910160205260409020549250610916915050565b600061102983611083565b905061048782826020015185610ccb9092919063ffffffff16565b60008061105083611083565b602001519392505050565b600061106684611083565b9050610b6f8383836020015187610b59909392919063ffffffff16565b61108b611162565b5080546001909101546040805160a08101825264ffffffffff808516825264ffffffffff19909416602082015267ffffffffffffffff8316818301529082901c8316606082015260689190911c909116608082015290565b600060028206156110f757826004016110fc565b826002015b9392505050565b80516020820151604080840151606085015160808601518754600096868117969584901b8517606884901b17959094909390929091871461114257868a555b858a60010154146111555760018a018690555b5050505050505092915050565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091529056fe4f564d5f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2063616e206f6e6c792062652063616c6c656420627920746865206f776e65722ea264697066735822122037f5f91f3a7302668798afaeee2c0c2d9aad06dfcc80e263efc2cd8f4842eebe64736f6c63430007060033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100cf5760003560e01c80634651d91e1161008c578063b298e36b11610066578063b298e36b14610315578063ccf8f96914610332578063d41c021814610355578063fa9e936c14610378576100cf565b80634651d91e1461025e5780638da5cb5b1461027b5780639507d39a146102f8576100cf565b806314f22255146100d4578063167fd681146101075780631f7b6d32146101325780632015276c1461014c57806329061de214610177578063461a44781461019c575b600080fd5b610105600480360360608110156100ea57600080fd5b508035906020810135906040013564ffffffffff1916610395565b005b6101056004803603604081101561011d57600080fd5b508035906020013564ffffffffff191661048c565b61013a61054c565b60408051918252519081900360200190f35b6101056004803603604081101561016257600080fd5b508035906020013564ffffffffff1916610564565b6101056004803603602081101561018d57600080fd5b503564ffffffffff1916610620565b610242600480360360208110156101b257600080fd5b8101906020810181356401000000008111156101cd57600080fd5b8201836020820111156101df57600080fd5b8035906020019184600183028401116401000000008311171561020157600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506106de945050505050565b604080516001600160a01b039092168252519081900360200190f35b6101056004803603602081101561027457600080fd5b50356107ba565b610283610875565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102bd5781810151838201526020016102a5565b50505050905090810190601f1680156102ea5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61013a6004803603602081101561030e57600080fd5b5035610902565b6101056004803603602081101561032b57600080fd5b503561091c565b61033a6109d7565b6040805164ffffffffff199092168252519081900360200190f35b6101056004803603604081101561036b57600080fd5b50803590602001356109e8565b6101056004803603602081101561038e57600080fd5b5035610aa4565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261042b93909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b820191906000526020600020905b81548152906001019060200180831161040457829003601f168201915b50505050506106de565b6001600160a01b0316336001600160a01b03161461047a5760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b6104876002848484610b59565b505050565b60018054604080516020601f6002600019610100878916150201909516949094049384018190048102820181019092528281526104ed93909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b6001600160a01b0316336001600160a01b03161461053c5760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b61054860028383610b75565b5050565b60006105586002610cb7565b64ffffffffff16905090565b60018054604080516020601f6002600019610100878916150201909516949094049384018190048102820181019092528281526105c593909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b6001600160a01b0316336001600160a01b0316146106145760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b61054860028383610ccb565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261068193909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b6001600160a01b0316336001600160a01b0316146106d05760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b6106db600282610dca565b50565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b8381101561073e578181015183820152602001610726565b50505050905090810190601f16801561076b5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561078857600080fd5b505afa15801561079c573d6000803e3d6000fd5b505050506040513d60208110156107b257600080fd5b505192915050565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261081b93909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b6001600160a01b0316336001600160a01b03161461086a5760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b6106db600282610def565b60018054604080516020600284861615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156108fa5780601f106108cf576101008083540402835291602001916108fa565b820191906000526020600020905b8154815290600101906020018083116108dd57829003601f168201915b505050505081565b6000610916600264ffffffffff8416610e15565b92915050565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261097d93909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b6001600160a01b0316336001600160a01b0316146109cc5760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b6106db60028261101e565b60006109e36002611044565b905090565b60018054604080516020601f600260001961010087891615020190951694909404938401819004810282018101909252828152610a4993909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b6001600160a01b0316336001600160a01b031614610a985760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b6105486002838361105b565b60018054604080516020601f600260001961010087891615020190951694909404938401819004810282018101909252828152610b0593909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b6001600160a01b0316336001600160a01b031614610b545760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b600855565b610b64848483610ccb565b610b6f848383610ccb565b50505050565b6000610b8084611083565b9050806000015164ffffffffff168364ffffffffff16108015610bb55750806060015164ffffffffff168364ffffffffff1610155b610bfd576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b6000610c20826040015167ffffffffffffffff16866110e390919063ffffffff16565b90506000610c48836040015160010167ffffffffffffffff16876110e390919063ffffffff16565b9050826080015164ffffffffff168564ffffffffff161015610c8c576040830180516000190167ffffffffffffffff169052606083015164ffffffffff1660808401525b64ffffffffff8516835264ffffffffff1984166020840152610cae8684611103565b50505050505050565b600080610cc383611083565b519392505050565b6000610cd684611083565b90506000610cfb826040015167ffffffffffffffff16866110e390919063ffffffff16565b8054909150610d0957601081555b8054608083015183510364ffffffffff1610610d80578460060154826080015164ffffffffff161015610d785760408201805160010167ffffffffffffffff169081905260808301805164ffffffffff90811660608601528451169052610d719086906110e3565b9050610d80565b805460020281555b608082015182510364ffffffffff9081166000818152600184810160209081526040909220889055855101909216845264ffffffffff19851691840191909152610cae8684611103565b6000610dd583611083565b64ffffffffff19831660208201529050610b6f8382611103565b6000610dfa83611083565b905061048782826020015185610b759092919063ffffffff16565b600080610e2184611083565b805190915064ffffffffff168310610e77576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b6000610e9a826040015167ffffffffffffffff16866110e390919063ffffffff16565b90506000610ec2836040015160010167ffffffffffffffff16876110e390919063ffffffff16565b9050826080015164ffffffffff168510610f4f576080830151825464ffffffffff9091168603908110610f33576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b6000908152600190920160205250604090205491506109169050565b6080830151606084015164ffffffffff9182168781039290911610610fb2576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b8154811115610fff576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b8154036000908152600190910160205260409020549250610916915050565b600061102983611083565b905061048782826020015185610ccb9092919063ffffffff16565b60008061105083611083565b602001519392505050565b600061106684611083565b9050610b6f8383836020015187610b59909392919063ffffffff16565b61108b611162565b5080546001909101546040805160a08101825264ffffffffff808516825264ffffffffff19909416602082015267ffffffffffffffff8316818301529082901c8316606082015260689190911c909116608082015290565b600060028206156110f757826004016110fc565b826002015b9392505050565b80516020820151604080840151606085015160808601518754600096868117969584901b8517606884901b17959094909390929091871461114257868a555b858a60010154146111555760018a018690555b5050505050505092915050565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091529056fe4f564d5f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2063616e206f6e6c792062652063616c6c656420627920746865206f776e65722ea264697066735822122037f5f91f3a7302668798afaeee2c0c2d9aad06dfcc80e263efc2cd8f4842eebe64736f6c63430007060033", - "devdoc": { - "kind": "dev", - "methods": { - "constructor": { - "params": { - "_libAddressManager": "Address of the Address Manager.", - "_owner": "Name of the contract that owns this container (will be resolved later)." - } - }, - "deleteElementsAfterInclusive(uint256)": { - "params": { - "_index": "Object index to delete from." - } - }, - "deleteElementsAfterInclusive(uint256,bytes27)": { - "params": { - "_globalMetadata": "New global metadata for the container.", - "_index": "Object index to delete from." - } - }, - "get(uint256)": { - "params": { - "_index": "Index of the particular object to access." - }, - "returns": { - "_0": "32 byte object value." - } - }, - "getGlobalMetadata()": { - "returns": { - "_0": "Container global metadata field." - } - }, - "length()": { - "returns": { - "_0": "Number of objects in the container." - } - }, - "push(bytes32)": { - "params": { - "_object": "A 32 byte value to insert into the container." - } - }, - "push(bytes32,bytes27)": { - "params": { - "_globalMetadata": "New global metadata for the container.", - "_object": "A 32 byte value to insert into the container." - } - }, - "push2(bytes32,bytes32)": { - "params": { - "_objectA": "First 32 byte value to insert into the container.", - "_objectB": "Second 32 byte value to insert into the container." - } - }, - "push2(bytes32,bytes32,bytes27)": { - "params": { - "_globalMetadata": "New global metadata for the container.", - "_objectA": "First 32 byte value to insert into the container.", - "_objectB": "Second 32 byte value to insert into the container." - } - }, - "setGlobalMetadata(bytes27)": { - "params": { - "_globalMetadata": "New global metadata to set." - } - } - }, - "title": "OVM_ChainStorageContainer", - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": { - "deleteElementsAfterInclusive(uint256)": { - "notice": "Removes all objects after and including a given index." - }, - "deleteElementsAfterInclusive(uint256,bytes27)": { - "notice": "Removes all objects after and including a given index. Also allows setting the global metadata field." - }, - "get(uint256)": { - "notice": "Retrieves an object from the container." - }, - "getGlobalMetadata()": { - "notice": "Retrieves the container's global metadata field." - }, - "length()": { - "notice": "Retrieves the number of objects stored in the container." - }, - "push(bytes32)": { - "notice": "Pushes an object into the container." - }, - "push(bytes32,bytes27)": { - "notice": "Pushes an object into the container. Function allows setting the global metadata since we'll need to touch the \"length\" storage slot anyway, which also contains the global metadata (it's an optimization)." - }, - "push2(bytes32,bytes32)": { - "notice": "Pushes two objects into the container at the same time. A useful optimization." - }, - "push2(bytes32,bytes32,bytes27)": { - "notice": "Pushes two objects into the container at the same time. Also allows setting the global metadata field." - }, - "setGlobalMetadata(bytes27)": { - "notice": "Sets the container's global metadata field. We're using `bytes27` here because we use five bytes to maintain the length of the underlying data structure, meaning we have an extra 27 bytes to store arbitrary data." - }, - "setNextOverwritableIndex(uint256)": { - "notice": "Marks an index as overwritable, meaing the underlying buffer can start to write values over any objects before and including the given index." - } - }, - "version": 1 - }, - "storageLayout": { - "storage": [ - { - "astId": 11707, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "libAddressManager", - "offset": 0, - "slot": "0", - "type": "t_contract(Lib_AddressManager)11700" - }, - { - "astId": 2888, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "owner", - "offset": 0, - "slot": "1", - "type": "t_string_storage" - }, - { - "astId": 2890, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "buffer", - "offset": 0, - "slot": "2", - "type": "t_struct(RingBuffer)16365_storage" - } - ], - "types": { - "t_bytes32": { - "encoding": "inplace", - "label": "bytes32", - "numberOfBytes": "32" - }, - "t_contract(Lib_AddressManager)11700": { - "encoding": "inplace", - "label": "contract Lib_AddressManager", - "numberOfBytes": "20" - }, - "t_mapping(t_uint256,t_bytes32)": { - "encoding": "mapping", - "key": "t_uint256", - "label": "mapping(uint256 => bytes32)", - "numberOfBytes": "32", - "value": "t_bytes32" - }, - "t_string_storage": { - "encoding": "bytes", - "label": "string", - "numberOfBytes": "32" - }, - "t_struct(Buffer)16354_storage": { - "encoding": "inplace", - "label": "struct Lib_RingBuffer.Buffer", - "members": [ - { - "astId": 16349, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "length", - "offset": 0, - "slot": "0", - "type": "t_uint256" - }, - { - "astId": 16353, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "buf", - "offset": 0, - "slot": "1", - "type": "t_mapping(t_uint256,t_bytes32)" - } - ], - "numberOfBytes": "64" - }, - "t_struct(RingBuffer)16365_storage": { - "encoding": "inplace", - "label": "struct Lib_RingBuffer.RingBuffer", - "members": [ - { - "astId": 16356, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "contextA", - "offset": 0, - "slot": "0", - "type": "t_bytes32" - }, - { - "astId": 16358, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "contextB", - "offset": 0, - "slot": "1", - "type": "t_bytes32" - }, - { - "astId": 16360, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "bufferA", - "offset": 0, - "slot": "2", - "type": "t_struct(Buffer)16354_storage" - }, - { - "astId": 16362, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "bufferB", - "offset": 0, - "slot": "4", - "type": "t_struct(Buffer)16354_storage" - }, - { - "astId": 16364, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "nextOverwritableIndex", - "offset": 0, - "slot": "6", - "type": "t_uint256" - } - ], - "numberOfBytes": "224" - }, - "t_uint256": { - "encoding": "inplace", - "label": "uint256", - "numberOfBytes": "32" - } - } - } -} \ No newline at end of file diff --git a/packages/contracts/deployments/mainnet-v1/OVM_ChainStorageContainer-SCC-batches.json b/packages/contracts/deployments/mainnet-v1/OVM_ChainStorageContainer-SCC-batches.json deleted file mode 100644 index 138a54524a209..0000000000000 --- a/packages/contracts/deployments/mainnet-v1/OVM_ChainStorageContainer-SCC-batches.json +++ /dev/null @@ -1,488 +0,0 @@ -{ - "address": "0x7C3e67e5E885556cEF01866CB7bdB5A254D35698", - "abi": [ - { - "inputs": [ - { - "internalType": "address", - "name": "_libAddressManager", - "type": "address" - }, - { - "internalType": "string", - "name": "_owner", - "type": "string" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_index", - "type": "uint256" - }, - { - "internalType": "bytes27", - "name": "_globalMetadata", - "type": "bytes27" - } - ], - "name": "deleteElementsAfterInclusive", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_index", - "type": "uint256" - } - ], - "name": "deleteElementsAfterInclusive", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_index", - "type": "uint256" - } - ], - "name": "get", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getGlobalMetadata", - "outputs": [ - { - "internalType": "bytes27", - "name": "", - "type": "bytes27" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "length", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "owner", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "_object", - "type": "bytes32" - }, - { - "internalType": "bytes27", - "name": "_globalMetadata", - "type": "bytes27" - } - ], - "name": "push", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "_object", - "type": "bytes32" - } - ], - "name": "push", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "_objectA", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "_objectB", - "type": "bytes32" - }, - { - "internalType": "bytes27", - "name": "_globalMetadata", - "type": "bytes27" - } - ], - "name": "push2", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "_objectA", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "_objectB", - "type": "bytes32" - } - ], - "name": "push2", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "string", - "name": "_name", - "type": "string" - } - ], - "name": "resolve", - "outputs": [ - { - "internalType": "address", - "name": "_contract", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes27", - "name": "_globalMetadata", - "type": "bytes27" - } - ], - "name": "setGlobalMetadata", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_index", - "type": "uint256" - } - ], - "name": "setNextOverwritableIndex", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - } - ], - "transactionHash": "0x5168f58ec0e907689b4729909da455ae3f39f09f6808faafde219c910e6ef404", - "receipt": { - "to": null, - "from": "0x558ba9b8d78713fbf768c1f8a584485B4003f43F", - "contractAddress": "0x02A1e0C8d29Bf76989F18D56cd502Eba0AC0D212", - "transactionIndex": 1, - "gasUsed": "1103654", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0x0a7b99f8dfb069836b98855e10f4febe0718604be13cfe614132e592cf0a134e", - "transactionHash": "0x5168f58ec0e907689b4729909da455ae3f39f09f6808faafde219c910e6ef404", - "logs": [], - "blockNumber": 4573381, - "cumulativeGasUsed": "1128075", - "status": 1, - "byzantium": true - }, - "args": [ - "0x1De8CFD4C1A486200286073aE91DE6e8099519f1", - "OVM_StateCommitmentChain" - ], - "solcInputHash": "cebcb515c1a9c570d96e0b8f6fd237e2", - "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_owner\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"get\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getGlobalMetadata\",\"outputs\":[{\"internalType\":\"bytes27\",\"name\":\"\",\"type\":\"bytes27\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"length\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_objectA\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"_objectB\",\"type\":\"bytes32\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"push2\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_objectA\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"_objectB\",\"type\":\"bytes32\"}],\"name\":\"push2\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"_contract\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"setGlobalMetadata\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"setNextOverwritableIndex\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\",\"_owner\":\"Name of the contract that owns this container (will be resolved later).\"}},\"deleteElementsAfterInclusive(uint256)\":{\"params\":{\"_index\":\"Object index to delete from.\"}},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_index\":\"Object index to delete from.\"}},\"get(uint256)\":{\"params\":{\"_index\":\"Index of the particular object to access.\"},\"returns\":{\"_0\":\"32 byte object value.\"}},\"getGlobalMetadata()\":{\"returns\":{\"_0\":\"Container global metadata field.\"}},\"length()\":{\"returns\":{\"_0\":\"Number of objects in the container.\"}},\"push(bytes32)\":{\"params\":{\"_object\":\"A 32 byte value to insert into the container.\"}},\"push(bytes32,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_object\":\"A 32 byte value to insert into the container.\"}},\"push2(bytes32,bytes32)\":{\"params\":{\"_objectA\":\"First 32 byte value to insert into the container.\",\"_objectB\":\"Second 32 byte value to insert into the container.\"}},\"push2(bytes32,bytes32,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_objectA\":\"First 32 byte value to insert into the container.\",\"_objectB\":\"Second 32 byte value to insert into the container.\"}},\"setGlobalMetadata(bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata to set.\"}}},\"title\":\"OVM_ChainStorageContainer\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"deleteElementsAfterInclusive(uint256)\":{\"notice\":\"Removes all objects after and including a given index.\"},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"notice\":\"Removes all objects after and including a given index. Also allows setting the global metadata field.\"},\"get(uint256)\":{\"notice\":\"Retrieves an object from the container.\"},\"getGlobalMetadata()\":{\"notice\":\"Retrieves the container's global metadata field.\"},\"length()\":{\"notice\":\"Retrieves the number of objects stored in the container.\"},\"push(bytes32)\":{\"notice\":\"Pushes an object into the container.\"},\"push(bytes32,bytes27)\":{\"notice\":\"Pushes an object into the container. Function allows setting the global metadata since we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global metadata (it's an optimization).\"},\"push2(bytes32,bytes32)\":{\"notice\":\"Pushes two objects into the container at the same time. A useful optimization.\"},\"push2(bytes32,bytes32,bytes27)\":{\"notice\":\"Pushes two objects into the container at the same time. Also allows setting the global metadata field.\"},\"setGlobalMetadata(bytes27)\":{\"notice\":\"Sets the container's global metadata field. We're using `bytes27` here because we use five bytes to maintain the length of the underlying data structure, meaning we have an extra 27 bytes to store arbitrary data.\"},\"setNextOverwritableIndex(uint256)\":{\"notice\":\"Marks an index as overwritable, meaing the underlying buffer can start to write values over any objects before and including the given index.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol\":\"OVM_ChainStorageContainer\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol\":{\"content\":\"pragma solidity ^0.7.0;\\n\\n/* Library Imports */\\nimport { Lib_RingBuffer } from \\\"../../libraries/utils/Lib_RingBuffer.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_ChainStorageContainer } from \\\"../../iOVM/chain/iOVM_ChainStorageContainer.sol\\\";\\n\\n/**\\n * @title OVM_ChainStorageContainer\\n */\\ncontract OVM_ChainStorageContainer is iOVM_ChainStorageContainer, Lib_AddressResolver {\\n\\n /*************\\n * Libraries *\\n *************/\\n\\n using Lib_RingBuffer for Lib_RingBuffer.RingBuffer;\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n string public owner;\\n Lib_RingBuffer.RingBuffer internal buffer;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n \\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n * @param _owner Name of the contract that owns this container (will be resolved later).\\n */\\n constructor(\\n address _libAddressManager,\\n string memory _owner\\n )\\n Lib_AddressResolver(_libAddressManager)\\n {\\n owner = _owner;\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n \\n modifier onlyOwner() {\\n require(\\n msg.sender == resolve(owner),\\n \\\"OVM_ChainStorageContainer: Function can only be called by the owner.\\\"\\n );\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function setGlobalMetadata(\\n bytes27 _globalMetadata\\n )\\n override\\n public\\n onlyOwner\\n {\\n return buffer.setExtraData(_globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function getGlobalMetadata()\\n override\\n public\\n view\\n returns (\\n bytes27\\n )\\n {\\n return buffer.getExtraData();\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function length()\\n override\\n public\\n view\\n returns (\\n uint256\\n )\\n {\\n return uint256(buffer.getLength());\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function push(\\n bytes32 _object\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.push(_object);\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function push(\\n bytes32 _object,\\n bytes27 _globalMetadata\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.push(_object, _globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function push2(\\n bytes32 _objectA,\\n bytes32 _objectB\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.push2(_objectA, _objectB);\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function push2(\\n bytes32 _objectA,\\n bytes32 _objectB,\\n bytes27 _globalMetadata\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.push2(_objectA, _objectB, _globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function get(\\n uint256 _index\\n )\\n override\\n public\\n view\\n returns (\\n bytes32\\n )\\n {\\n return buffer.get(uint40(_index));\\n }\\n \\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.deleteElementsAfterInclusive(\\n uint40(_index)\\n );\\n }\\n \\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index,\\n bytes27 _globalMetadata\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.deleteElementsAfterInclusive(\\n uint40(_index),\\n _globalMetadata\\n );\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function setNextOverwritableIndex(\\n uint256 _index\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.nextOverwritableIndex = _index;\\n }\\n}\\n\",\"keccak256\":\"0xc722e9528988810bd754002dfe3923bc9ac9252c1d981c4803fd5053603bfb11\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_ChainStorageContainer.sol\":{\"content\":\"pragma solidity ^0.7.0;\\n\\n/**\\n * @title iOVM_ChainStorageContainer\\n */\\ninterface iOVM_ChainStorageContainer {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata()\\n external\\n view\\n returns (\\n bytes27\\n );\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length()\\n external\\n view\\n returns (\\n uint256\\n );\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(\\n bytes32 _object\\n )\\n external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(\\n bytes32 _object,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Pushes two objects into the container at the same time. A useful optimization.\\n * @param _objectA First 32 byte value to insert into the container.\\n * @param _objectB Second 32 byte value to insert into the container.\\n */\\n function push2(\\n bytes32 _objectA,\\n bytes32 _objectB\\n )\\n external;\\n\\n /**\\n * Pushes two objects into the container at the same time. Also allows setting the global\\n * metadata field.\\n * @param _objectA First 32 byte value to insert into the container.\\n * @param _objectB Second 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push2(\\n bytes32 _objectA,\\n bytes32 _objectB,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(\\n uint256 _index\\n )\\n external\\n view\\n returns (\\n bytes32\\n );\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index\\n )\\n external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Marks an index as overwritable, meaing the underlying buffer can start to write values over\\n * any objects before and including the given index.\\n */\\n function setNextOverwritableIndex(\\n uint256 _index\\n )\\n external;\\n}\\n\",\"keccak256\":\"0xcfca7da85b35d94c27581c2460b0d48fd0cc51fa72670cc7a2f7f760fb21a2f0\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// +build ovm\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Contract Imports */\\nimport { Ownable } from \\\"./Lib_Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n /*******************************************\\n * Contract Variables: Internal Accounting *\\n *******************************************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n public\\n onlyOwner\\n {\\n emit AddressSet(_name, _address);\\n addresses[_getNameHash(_name)] = _address;\\n }\\n\\n function getAddress(\\n string memory _name\\n )\\n public\\n view\\n returns (address)\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32 _hash\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xdf802e1cc6474df913626991e9fca3835c620a519f397afe04bf9c260e723257\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// +build ovm\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\ncontract Lib_AddressResolver {\\n\\n /*******************************************\\n * Contract Variables: Contract References *\\n *******************************************/\\n\\n Lib_AddressManager internal libAddressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(\\n address _libAddressManager\\n ) public {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function resolve(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address _contract\\n )\\n {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0xf3b9d78b309ddeec259ce3e0e1cfdef3ca40938e9a81971b28ce2b8ea327f533\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// +build ovm\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Ownable\\n * @dev Adapted from https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol\\n */\\nabstract contract Ownable {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n address public owner;\\n\\n\\n /**********\\n * Events *\\n **********/\\n\\n event OwnershipTransferred(\\n address indexed previousOwner,\\n address indexed newOwner\\n );\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n constructor() internal {\\n owner = msg.sender;\\n emit OwnershipTransferred(address(0), owner);\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n owner == msg.sender,\\n \\\"Ownable: caller is not the owner\\\"\\n );\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function renounceOwnership()\\n public\\n virtual\\n onlyOwner\\n {\\n emit OwnershipTransferred(owner, address(0));\\n owner = address(0);\\n }\\n\\n function transferOwnership(address _newOwner)\\n public\\n virtual\\n onlyOwner\\n {\\n require(\\n _newOwner != address(0),\\n \\\"Ownable: new owner cannot be the zero address\\\"\\n );\\n\\n emit OwnershipTransferred(owner, _newOwner);\\n owner = _newOwner;\\n }\\n}\\n\",\"keccak256\":\"0xe0409fbd236d16ca6be439d9d97dd36d0d9a0697ee0062d49588b9d29c248e47\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_RingBuffer.sol\":{\"content\":\"pragma solidity ^0.7.0;\\n\\nlibrary Lib_RingBuffer {\\n using Lib_RingBuffer for RingBuffer;\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Buffer {\\n uint256 length;\\n mapping (uint256 => bytes32) buf;\\n }\\n\\n struct RingBuffer {\\n bytes32 contextA;\\n bytes32 contextB;\\n Buffer bufferA;\\n Buffer bufferB;\\n uint256 nextOverwritableIndex;\\n }\\n\\n struct RingBufferContext {\\n // contextA\\n uint40 globalIndex;\\n bytes27 extraData;\\n\\n // contextB\\n uint64 currBufferIndex;\\n uint40 prevResetIndex;\\n uint40 currResetIndex;\\n }\\n\\n\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 constant MIN_CAPACITY = 16;\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n * @param _extraData Optional global extra data.\\n */\\n function push(\\n RingBuffer storage _self,\\n bytes32 _value,\\n bytes27 _extraData\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n Buffer storage currBuffer = _self.getBuffer(ctx.currBufferIndex);\\n\\n // Set a minimum capacity.\\n if (currBuffer.length == 0) {\\n currBuffer.length = MIN_CAPACITY;\\n }\\n\\n // Check if we need to expand the buffer.\\n if (ctx.globalIndex - ctx.currResetIndex >= currBuffer.length) {\\n if (ctx.currResetIndex < _self.nextOverwritableIndex) {\\n // We're going to overwrite the inactive buffer.\\n // Bump the buffer index, reset the delete offset, and set our reset indices.\\n ctx.currBufferIndex++;\\n ctx.prevResetIndex = ctx.currResetIndex;\\n ctx.currResetIndex = ctx.globalIndex;\\n\\n // Swap over to the next buffer.\\n currBuffer = _self.getBuffer(ctx.currBufferIndex);\\n } else {\\n // We're not overwriting yet, double the length of the current buffer.\\n currBuffer.length *= 2;\\n }\\n }\\n\\n // Index to write to is the difference of the global and reset indices.\\n uint256 writeHead = ctx.globalIndex - ctx.currResetIndex;\\n currBuffer.buf[writeHead] = _value;\\n\\n // Bump the global index and insert our extra data, then save the context.\\n ctx.globalIndex++;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n */\\n function push(\\n RingBuffer storage _self,\\n bytes32 _value\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n \\n _self.push(\\n _value,\\n ctx.extraData\\n );\\n }\\n\\n /**\\n * Pushes a two elements to the buffer.\\n * @param _self Buffer to access.\\n * @param _valueA First value to push to the buffer.\\n * @param _valueA Second value to push to the buffer.\\n * @param _extraData Optional global extra data.\\n */\\n function push2(\\n RingBuffer storage _self,\\n bytes32 _valueA,\\n bytes32 _valueB,\\n bytes27 _extraData\\n )\\n internal\\n {\\n _self.push(_valueA, _extraData);\\n _self.push(_valueB, _extraData);\\n }\\n\\n /**\\n * Pushes a two elements to the buffer.\\n * @param _self Buffer to access.\\n * @param _valueA First value to push to the buffer.\\n * @param _valueA Second value to push to the buffer.\\n */\\n function push2(\\n RingBuffer storage _self,\\n bytes32 _valueA,\\n bytes32 _valueB\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n\\n _self.push2(\\n _valueA,\\n _valueB,\\n ctx.extraData\\n );\\n }\\n\\n /**\\n * Retrieves an element from the buffer.\\n * @param _self Buffer to access.\\n * @param _index Element index to retrieve.\\n * @return Value of the element at the given index.\\n */\\n function get(\\n RingBuffer storage _self,\\n uint256 _index\\n )\\n internal\\n view\\n returns (\\n bytes32 \\n )\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n\\n require(\\n _index < ctx.globalIndex,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n Buffer storage currBuffer = _self.getBuffer(ctx.currBufferIndex);\\n Buffer storage prevBuffer = _self.getBuffer(ctx.currBufferIndex + 1);\\n\\n if (_index >= ctx.currResetIndex) {\\n // We're trying to load an element from the current buffer.\\n // Relative index is just the difference from the reset index.\\n uint256 relativeIndex = _index - ctx.currResetIndex;\\n\\n // Shouldn't happen but why not check.\\n require(\\n relativeIndex < currBuffer.length,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n return currBuffer.buf[relativeIndex];\\n } else {\\n // We're trying to load an element from the previous buffer.\\n // Relative index is the difference from the reset index in the other direction.\\n uint256 relativeIndex = ctx.currResetIndex - _index;\\n\\n // Condition only fails in the case that we deleted and flipped buffers.\\n require(\\n ctx.currResetIndex > ctx.prevResetIndex,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n // Make sure we're not trying to read beyond the array.\\n require(\\n relativeIndex <= prevBuffer.length,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n return prevBuffer.buf[prevBuffer.length - relativeIndex];\\n }\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n * @param _extraData Optional global extra data.\\n */\\n function deleteElementsAfterInclusive(\\n RingBuffer storage _self,\\n uint40 _index,\\n bytes27 _extraData\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n\\n require(\\n _index < ctx.globalIndex && _index >= ctx.prevResetIndex,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n Buffer storage currBuffer = _self.getBuffer(ctx.currBufferIndex);\\n Buffer storage prevBuffer = _self.getBuffer(ctx.currBufferIndex + 1);\\n\\n if (_index < ctx.currResetIndex) {\\n // We're switching back to the previous buffer.\\n // Reduce the buffer index, set the current reset index back to match the previous one.\\n // We use the equality of these two values to prevent reading beyond this buffer.\\n ctx.currBufferIndex--;\\n ctx.currResetIndex = ctx.prevResetIndex;\\n }\\n\\n // Set our global index and extra data, save the context.\\n ctx.globalIndex = _index;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n */\\n function deleteElementsAfterInclusive(\\n RingBuffer storage _self,\\n uint40 _index\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n _self.deleteElementsAfterInclusive(\\n _index,\\n ctx.extraData\\n );\\n }\\n\\n /**\\n * Retrieves the current global index.\\n * @param _self Buffer to access.\\n * @return Current global index.\\n */\\n function getLength(\\n RingBuffer storage _self\\n )\\n internal\\n view\\n returns (\\n uint40\\n )\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n return ctx.globalIndex;\\n }\\n\\n /**\\n * Changes current global extra data.\\n * @param _self Buffer to access.\\n * @param _extraData New global extra data.\\n */\\n function setExtraData(\\n RingBuffer storage _self,\\n bytes27 _extraData\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Retrieves the current global extra data.\\n * @param _self Buffer to access.\\n * @return Current global extra data.\\n */\\n function getExtraData(\\n RingBuffer storage _self\\n )\\n internal\\n view\\n returns (\\n bytes27\\n )\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n return ctx.extraData;\\n }\\n\\n /**\\n * Sets the current ring buffer context.\\n * @param _self Buffer to access.\\n * @param _ctx Current ring buffer context.\\n */\\n function setContext(\\n RingBuffer storage _self,\\n RingBufferContext memory _ctx\\n )\\n internal\\n returns (\\n bytes32\\n )\\n {\\n bytes32 contextA;\\n bytes32 contextB;\\n\\n uint40 globalIndex = _ctx.globalIndex;\\n bytes27 extraData = _ctx.extraData;\\n assembly {\\n contextA := globalIndex\\n contextA := or(contextA, extraData)\\n }\\n\\n uint64 currBufferIndex = _ctx.currBufferIndex;\\n uint40 prevResetIndex = _ctx.prevResetIndex;\\n uint40 currResetIndex = _ctx.currResetIndex;\\n assembly {\\n contextB := currBufferIndex\\n contextB := or(contextB, shl(64, prevResetIndex))\\n contextB := or(contextB, shl(104, currResetIndex))\\n }\\n\\n if (_self.contextA != contextA) {\\n _self.contextA = contextA;\\n }\\n\\n if (_self.contextB != contextB) {\\n _self.contextB = contextB;\\n }\\n }\\n\\n /**\\n * Retrieves the current ring buffer context.\\n * @param _self Buffer to access.\\n * @return Current ring buffer context.\\n */\\n function getContext(\\n RingBuffer storage _self\\n )\\n internal\\n view\\n returns (\\n RingBufferContext memory\\n )\\n {\\n bytes32 contextA = _self.contextA;\\n bytes32 contextB = _self.contextB;\\n\\n uint40 globalIndex;\\n bytes27 extraData;\\n assembly {\\n globalIndex := and(contextA, 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF)\\n extraData := and(contextA, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000)\\n }\\n\\n uint64 currBufferIndex;\\n uint40 prevResetIndex;\\n uint40 currResetIndex;\\n assembly {\\n currBufferIndex := and(contextB, 0x000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF)\\n prevResetIndex := shr(64, and(contextB, 0x00000000000000000000000000000000000000FFFFFFFFFF0000000000000000))\\n currResetIndex := shr(104, and(contextB, 0x0000000000000000000000000000FFFFFFFFFF00000000000000000000000000))\\n }\\n\\n return RingBufferContext({\\n globalIndex: globalIndex,\\n extraData: extraData,\\n currBufferIndex: currBufferIndex,\\n prevResetIndex: prevResetIndex,\\n currResetIndex: currResetIndex\\n });\\n }\\n\\n /**\\n * Retrieves the a buffer from the ring buffer by index.\\n * @param _self Buffer to access.\\n * @param _which Index of the sub buffer to access.\\n * @return Sub buffer for the index.\\n */\\n function getBuffer(\\n RingBuffer storage _self,\\n uint256 _which\\n )\\n internal\\n view\\n returns (\\n Buffer storage\\n )\\n {\\n return _which % 2 == 0 ? _self.bufferA : _self.bufferB;\\n }\\n}\\n\",\"keccak256\":\"0x0c4bb53aba64441b2ec26e7a13de8f04f104bb654e550ccc30db500cac33d2a3\"}},\"version\":1}", - "bytecode": "0x60806040523480156200001157600080fd5b50604051620013f3380380620013f3833981810160405260408110156200003757600080fd5b8151602083018051604051929492938301929190846401000000008211156200005f57600080fd5b9083019060208201858111156200007557600080fd5b82516401000000008111828201881017156200009057600080fd5b82525081516020918201929091019080838360005b83811015620000bf578181015183820152602001620000a5565b50505050905090810190601f168015620000ed5780820380516001836020036101000a031916815260200191505b506040525050600080546001600160a01b0319166001600160a01b038516179055508051620001249060019060208401906200012d565b505050620001d9565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282620001655760008555620001b0565b82601f106200018057805160ff1916838001178555620001b0565b82800160010185558215620001b0579182015b82811115620001b057825182559160200191906001019062000193565b50620001be929150620001c2565b5090565b5b80821115620001be5760008155600101620001c3565b61120a80620001e96000396000f3fe608060405234801561001057600080fd5b50600436106100cf5760003560e01c80634651d91e1161008c578063b298e36b11610066578063b298e36b14610315578063ccf8f96914610332578063d41c021814610355578063fa9e936c14610378576100cf565b80634651d91e1461025e5780638da5cb5b1461027b5780639507d39a146102f8576100cf565b806314f22255146100d4578063167fd681146101075780631f7b6d32146101325780632015276c1461014c57806329061de214610177578063461a44781461019c575b600080fd5b610105600480360360608110156100ea57600080fd5b508035906020810135906040013564ffffffffff1916610395565b005b6101056004803603604081101561011d57600080fd5b508035906020013564ffffffffff191661048c565b61013a61054c565b60408051918252519081900360200190f35b6101056004803603604081101561016257600080fd5b508035906020013564ffffffffff1916610564565b6101056004803603602081101561018d57600080fd5b503564ffffffffff1916610620565b610242600480360360208110156101b257600080fd5b8101906020810181356401000000008111156101cd57600080fd5b8201836020820111156101df57600080fd5b8035906020019184600183028401116401000000008311171561020157600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506106de945050505050565b604080516001600160a01b039092168252519081900360200190f35b6101056004803603602081101561027457600080fd5b50356107ba565b610283610875565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102bd5781810151838201526020016102a5565b50505050905090810190601f1680156102ea5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61013a6004803603602081101561030e57600080fd5b5035610902565b6101056004803603602081101561032b57600080fd5b503561091c565b61033a6109d7565b6040805164ffffffffff199092168252519081900360200190f35b6101056004803603604081101561036b57600080fd5b50803590602001356109e8565b6101056004803603602081101561038e57600080fd5b5035610aa4565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261042b93909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b820191906000526020600020905b81548152906001019060200180831161040457829003601f168201915b50505050506106de565b6001600160a01b0316336001600160a01b03161461047a5760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b6104876002848484610b59565b505050565b60018054604080516020601f6002600019610100878916150201909516949094049384018190048102820181019092528281526104ed93909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b6001600160a01b0316336001600160a01b03161461053c5760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b61054860028383610b75565b5050565b60006105586002610cb7565b64ffffffffff16905090565b60018054604080516020601f6002600019610100878916150201909516949094049384018190048102820181019092528281526105c593909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b6001600160a01b0316336001600160a01b0316146106145760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b61054860028383610ccb565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261068193909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b6001600160a01b0316336001600160a01b0316146106d05760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b6106db600282610dca565b50565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b8381101561073e578181015183820152602001610726565b50505050905090810190601f16801561076b5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561078857600080fd5b505afa15801561079c573d6000803e3d6000fd5b505050506040513d60208110156107b257600080fd5b505192915050565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261081b93909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b6001600160a01b0316336001600160a01b03161461086a5760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b6106db600282610def565b60018054604080516020600284861615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156108fa5780601f106108cf576101008083540402835291602001916108fa565b820191906000526020600020905b8154815290600101906020018083116108dd57829003601f168201915b505050505081565b6000610916600264ffffffffff8416610e15565b92915050565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261097d93909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b6001600160a01b0316336001600160a01b0316146109cc5760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b6106db60028261101e565b60006109e36002611044565b905090565b60018054604080516020601f600260001961010087891615020190951694909404938401819004810282018101909252828152610a4993909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b6001600160a01b0316336001600160a01b031614610a985760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b6105486002838361105b565b60018054604080516020601f600260001961010087891615020190951694909404938401819004810282018101909252828152610b0593909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b6001600160a01b0316336001600160a01b031614610b545760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b600855565b610b64848483610ccb565b610b6f848383610ccb565b50505050565b6000610b8084611083565b9050806000015164ffffffffff168364ffffffffff16108015610bb55750806060015164ffffffffff168364ffffffffff1610155b610bfd576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b6000610c20826040015167ffffffffffffffff16866110e390919063ffffffff16565b90506000610c48836040015160010167ffffffffffffffff16876110e390919063ffffffff16565b9050826080015164ffffffffff168564ffffffffff161015610c8c576040830180516000190167ffffffffffffffff169052606083015164ffffffffff1660808401525b64ffffffffff8516835264ffffffffff1984166020840152610cae8684611103565b50505050505050565b600080610cc383611083565b519392505050565b6000610cd684611083565b90506000610cfb826040015167ffffffffffffffff16866110e390919063ffffffff16565b8054909150610d0957601081555b8054608083015183510364ffffffffff1610610d80578460060154826080015164ffffffffff161015610d785760408201805160010167ffffffffffffffff169081905260808301805164ffffffffff90811660608601528451169052610d719086906110e3565b9050610d80565b805460020281555b608082015182510364ffffffffff9081166000818152600184810160209081526040909220889055855101909216845264ffffffffff19851691840191909152610cae8684611103565b6000610dd583611083565b64ffffffffff19831660208201529050610b6f8382611103565b6000610dfa83611083565b905061048782826020015185610b759092919063ffffffff16565b600080610e2184611083565b805190915064ffffffffff168310610e77576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b6000610e9a826040015167ffffffffffffffff16866110e390919063ffffffff16565b90506000610ec2836040015160010167ffffffffffffffff16876110e390919063ffffffff16565b9050826080015164ffffffffff168510610f4f576080830151825464ffffffffff9091168603908110610f33576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b6000908152600190920160205250604090205491506109169050565b6080830151606084015164ffffffffff9182168781039290911610610fb2576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b8154811115610fff576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b8154036000908152600190910160205260409020549250610916915050565b600061102983611083565b905061048782826020015185610ccb9092919063ffffffff16565b60008061105083611083565b602001519392505050565b600061106684611083565b9050610b6f8383836020015187610b59909392919063ffffffff16565b61108b611162565b5080546001909101546040805160a08101825264ffffffffff808516825264ffffffffff19909416602082015267ffffffffffffffff8316818301529082901c8316606082015260689190911c909116608082015290565b600060028206156110f757826004016110fc565b826002015b9392505050565b80516020820151604080840151606085015160808601518754600096868117969584901b8517606884901b17959094909390929091871461114257868a555b858a60010154146111555760018a018690555b5050505050505092915050565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091529056fe4f564d5f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2063616e206f6e6c792062652063616c6c656420627920746865206f776e65722ea264697066735822122037f5f91f3a7302668798afaeee2c0c2d9aad06dfcc80e263efc2cd8f4842eebe64736f6c63430007060033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100cf5760003560e01c80634651d91e1161008c578063b298e36b11610066578063b298e36b14610315578063ccf8f96914610332578063d41c021814610355578063fa9e936c14610378576100cf565b80634651d91e1461025e5780638da5cb5b1461027b5780639507d39a146102f8576100cf565b806314f22255146100d4578063167fd681146101075780631f7b6d32146101325780632015276c1461014c57806329061de214610177578063461a44781461019c575b600080fd5b610105600480360360608110156100ea57600080fd5b508035906020810135906040013564ffffffffff1916610395565b005b6101056004803603604081101561011d57600080fd5b508035906020013564ffffffffff191661048c565b61013a61054c565b60408051918252519081900360200190f35b6101056004803603604081101561016257600080fd5b508035906020013564ffffffffff1916610564565b6101056004803603602081101561018d57600080fd5b503564ffffffffff1916610620565b610242600480360360208110156101b257600080fd5b8101906020810181356401000000008111156101cd57600080fd5b8201836020820111156101df57600080fd5b8035906020019184600183028401116401000000008311171561020157600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506106de945050505050565b604080516001600160a01b039092168252519081900360200190f35b6101056004803603602081101561027457600080fd5b50356107ba565b610283610875565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102bd5781810151838201526020016102a5565b50505050905090810190601f1680156102ea5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61013a6004803603602081101561030e57600080fd5b5035610902565b6101056004803603602081101561032b57600080fd5b503561091c565b61033a6109d7565b6040805164ffffffffff199092168252519081900360200190f35b6101056004803603604081101561036b57600080fd5b50803590602001356109e8565b6101056004803603602081101561038e57600080fd5b5035610aa4565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261042b93909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b820191906000526020600020905b81548152906001019060200180831161040457829003601f168201915b50505050506106de565b6001600160a01b0316336001600160a01b03161461047a5760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b6104876002848484610b59565b505050565b60018054604080516020601f6002600019610100878916150201909516949094049384018190048102820181019092528281526104ed93909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b6001600160a01b0316336001600160a01b03161461053c5760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b61054860028383610b75565b5050565b60006105586002610cb7565b64ffffffffff16905090565b60018054604080516020601f6002600019610100878916150201909516949094049384018190048102820181019092528281526105c593909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b6001600160a01b0316336001600160a01b0316146106145760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b61054860028383610ccb565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261068193909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b6001600160a01b0316336001600160a01b0316146106d05760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b6106db600282610dca565b50565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b8381101561073e578181015183820152602001610726565b50505050905090810190601f16801561076b5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561078857600080fd5b505afa15801561079c573d6000803e3d6000fd5b505050506040513d60208110156107b257600080fd5b505192915050565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261081b93909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b6001600160a01b0316336001600160a01b03161461086a5760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b6106db600282610def565b60018054604080516020600284861615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156108fa5780601f106108cf576101008083540402835291602001916108fa565b820191906000526020600020905b8154815290600101906020018083116108dd57829003601f168201915b505050505081565b6000610916600264ffffffffff8416610e15565b92915050565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261097d93909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b6001600160a01b0316336001600160a01b0316146109cc5760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b6106db60028261101e565b60006109e36002611044565b905090565b60018054604080516020601f600260001961010087891615020190951694909404938401819004810282018101909252828152610a4993909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b6001600160a01b0316336001600160a01b031614610a985760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b6105486002838361105b565b60018054604080516020601f600260001961010087891615020190951694909404938401819004810282018101909252828152610b0593909290918301828280156104215780601f106103f657610100808354040283529160200191610421565b6001600160a01b0316336001600160a01b031614610b545760405162461bcd60e51b81526004018080602001828103825260448152602001806111916044913960600191505060405180910390fd5b600855565b610b64848483610ccb565b610b6f848383610ccb565b50505050565b6000610b8084611083565b9050806000015164ffffffffff168364ffffffffff16108015610bb55750806060015164ffffffffff168364ffffffffff1610155b610bfd576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b6000610c20826040015167ffffffffffffffff16866110e390919063ffffffff16565b90506000610c48836040015160010167ffffffffffffffff16876110e390919063ffffffff16565b9050826080015164ffffffffff168564ffffffffff161015610c8c576040830180516000190167ffffffffffffffff169052606083015164ffffffffff1660808401525b64ffffffffff8516835264ffffffffff1984166020840152610cae8684611103565b50505050505050565b600080610cc383611083565b519392505050565b6000610cd684611083565b90506000610cfb826040015167ffffffffffffffff16866110e390919063ffffffff16565b8054909150610d0957601081555b8054608083015183510364ffffffffff1610610d80578460060154826080015164ffffffffff161015610d785760408201805160010167ffffffffffffffff169081905260808301805164ffffffffff90811660608601528451169052610d719086906110e3565b9050610d80565b805460020281555b608082015182510364ffffffffff9081166000818152600184810160209081526040909220889055855101909216845264ffffffffff19851691840191909152610cae8684611103565b6000610dd583611083565b64ffffffffff19831660208201529050610b6f8382611103565b6000610dfa83611083565b905061048782826020015185610b759092919063ffffffff16565b600080610e2184611083565b805190915064ffffffffff168310610e77576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b6000610e9a826040015167ffffffffffffffff16866110e390919063ffffffff16565b90506000610ec2836040015160010167ffffffffffffffff16876110e390919063ffffffff16565b9050826080015164ffffffffff168510610f4f576080830151825464ffffffffff9091168603908110610f33576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b6000908152600190920160205250604090205491506109169050565b6080830151606084015164ffffffffff9182168781039290911610610fb2576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b8154811115610fff576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b8154036000908152600190910160205260409020549250610916915050565b600061102983611083565b905061048782826020015185610ccb9092919063ffffffff16565b60008061105083611083565b602001519392505050565b600061106684611083565b9050610b6f8383836020015187610b59909392919063ffffffff16565b61108b611162565b5080546001909101546040805160a08101825264ffffffffff808516825264ffffffffff19909416602082015267ffffffffffffffff8316818301529082901c8316606082015260689190911c909116608082015290565b600060028206156110f757826004016110fc565b826002015b9392505050565b80516020820151604080840151606085015160808601518754600096868117969584901b8517606884901b17959094909390929091871461114257868a555b858a60010154146111555760018a018690555b5050505050505092915050565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091529056fe4f564d5f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2063616e206f6e6c792062652063616c6c656420627920746865206f776e65722ea264697066735822122037f5f91f3a7302668798afaeee2c0c2d9aad06dfcc80e263efc2cd8f4842eebe64736f6c63430007060033", - "devdoc": { - "kind": "dev", - "methods": { - "constructor": { - "params": { - "_libAddressManager": "Address of the Address Manager.", - "_owner": "Name of the contract that owns this container (will be resolved later)." - } - }, - "deleteElementsAfterInclusive(uint256)": { - "params": { - "_index": "Object index to delete from." - } - }, - "deleteElementsAfterInclusive(uint256,bytes27)": { - "params": { - "_globalMetadata": "New global metadata for the container.", - "_index": "Object index to delete from." - } - }, - "get(uint256)": { - "params": { - "_index": "Index of the particular object to access." - }, - "returns": { - "_0": "32 byte object value." - } - }, - "getGlobalMetadata()": { - "returns": { - "_0": "Container global metadata field." - } - }, - "length()": { - "returns": { - "_0": "Number of objects in the container." - } - }, - "push(bytes32)": { - "params": { - "_object": "A 32 byte value to insert into the container." - } - }, - "push(bytes32,bytes27)": { - "params": { - "_globalMetadata": "New global metadata for the container.", - "_object": "A 32 byte value to insert into the container." - } - }, - "push2(bytes32,bytes32)": { - "params": { - "_objectA": "First 32 byte value to insert into the container.", - "_objectB": "Second 32 byte value to insert into the container." - } - }, - "push2(bytes32,bytes32,bytes27)": { - "params": { - "_globalMetadata": "New global metadata for the container.", - "_objectA": "First 32 byte value to insert into the container.", - "_objectB": "Second 32 byte value to insert into the container." - } - }, - "setGlobalMetadata(bytes27)": { - "params": { - "_globalMetadata": "New global metadata to set." - } - } - }, - "title": "OVM_ChainStorageContainer", - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": { - "deleteElementsAfterInclusive(uint256)": { - "notice": "Removes all objects after and including a given index." - }, - "deleteElementsAfterInclusive(uint256,bytes27)": { - "notice": "Removes all objects after and including a given index. Also allows setting the global metadata field." - }, - "get(uint256)": { - "notice": "Retrieves an object from the container." - }, - "getGlobalMetadata()": { - "notice": "Retrieves the container's global metadata field." - }, - "length()": { - "notice": "Retrieves the number of objects stored in the container." - }, - "push(bytes32)": { - "notice": "Pushes an object into the container." - }, - "push(bytes32,bytes27)": { - "notice": "Pushes an object into the container. Function allows setting the global metadata since we'll need to touch the \"length\" storage slot anyway, which also contains the global metadata (it's an optimization)." - }, - "push2(bytes32,bytes32)": { - "notice": "Pushes two objects into the container at the same time. A useful optimization." - }, - "push2(bytes32,bytes32,bytes27)": { - "notice": "Pushes two objects into the container at the same time. Also allows setting the global metadata field." - }, - "setGlobalMetadata(bytes27)": { - "notice": "Sets the container's global metadata field. We're using `bytes27` here because we use five bytes to maintain the length of the underlying data structure, meaning we have an extra 27 bytes to store arbitrary data." - }, - "setNextOverwritableIndex(uint256)": { - "notice": "Marks an index as overwritable, meaing the underlying buffer can start to write values over any objects before and including the given index." - } - }, - "version": 1 - }, - "storageLayout": { - "storage": [ - { - "astId": 11707, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "libAddressManager", - "offset": 0, - "slot": "0", - "type": "t_contract(Lib_AddressManager)11700" - }, - { - "astId": 2888, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "owner", - "offset": 0, - "slot": "1", - "type": "t_string_storage" - }, - { - "astId": 2890, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "buffer", - "offset": 0, - "slot": "2", - "type": "t_struct(RingBuffer)16365_storage" - } - ], - "types": { - "t_bytes32": { - "encoding": "inplace", - "label": "bytes32", - "numberOfBytes": "32" - }, - "t_contract(Lib_AddressManager)11700": { - "encoding": "inplace", - "label": "contract Lib_AddressManager", - "numberOfBytes": "20" - }, - "t_mapping(t_uint256,t_bytes32)": { - "encoding": "mapping", - "key": "t_uint256", - "label": "mapping(uint256 => bytes32)", - "numberOfBytes": "32", - "value": "t_bytes32" - }, - "t_string_storage": { - "encoding": "bytes", - "label": "string", - "numberOfBytes": "32" - }, - "t_struct(Buffer)16354_storage": { - "encoding": "inplace", - "label": "struct Lib_RingBuffer.Buffer", - "members": [ - { - "astId": 16349, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "length", - "offset": 0, - "slot": "0", - "type": "t_uint256" - }, - { - "astId": 16353, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "buf", - "offset": 0, - "slot": "1", - "type": "t_mapping(t_uint256,t_bytes32)" - } - ], - "numberOfBytes": "64" - }, - "t_struct(RingBuffer)16365_storage": { - "encoding": "inplace", - "label": "struct Lib_RingBuffer.RingBuffer", - "members": [ - { - "astId": 16356, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "contextA", - "offset": 0, - "slot": "0", - "type": "t_bytes32" - }, - { - "astId": 16358, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "contextB", - "offset": 0, - "slot": "1", - "type": "t_bytes32" - }, - { - "astId": 16360, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "bufferA", - "offset": 0, - "slot": "2", - "type": "t_struct(Buffer)16354_storage" - }, - { - "astId": 16362, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "bufferB", - "offset": 0, - "slot": "4", - "type": "t_struct(Buffer)16354_storage" - }, - { - "astId": 16364, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "nextOverwritableIndex", - "offset": 0, - "slot": "6", - "type": "t_uint256" - } - ], - "numberOfBytes": "224" - }, - "t_uint256": { - "encoding": "inplace", - "label": "uint256", - "numberOfBytes": "32" - } - } - } -} \ No newline at end of file diff --git a/packages/contracts/deployments/mainnet-v1/OVM_L1CrossDomainMessenger.json b/packages/contracts/deployments/mainnet-v1/OVM_L1CrossDomainMessenger.json deleted file mode 100644 index f817e1b775418..0000000000000 --- a/packages/contracts/deployments/mainnet-v1/OVM_L1CrossDomainMessenger.json +++ /dev/null @@ -1,477 +0,0 @@ -{ - "address": "0xE8F1bD5e5629F4adac6fd63A39F4b4cB76c5E7B2", - "abi": [ - { - "inputs": [], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "bytes32", - "name": "msgHash", - "type": "bytes32" - } - ], - "name": "RelayedMessage", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "bytes", - "name": "message", - "type": "bytes" - } - ], - "name": "SentMessage", - "type": "event" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_libAddressManager", - "type": "address" - } - ], - "name": "initialize", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "messageNonce", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_target", - "type": "address" - }, - { - "internalType": "address", - "name": "_sender", - "type": "address" - }, - { - "internalType": "bytes", - "name": "_message", - "type": "bytes" - }, - { - "internalType": "uint256", - "name": "_messageNonce", - "type": "uint256" - }, - { - "components": [ - { - "internalType": "bytes32", - "name": "stateRoot", - "type": "bytes32" - }, - { - "components": [ - { - "internalType": "uint256", - "name": "batchIndex", - "type": "uint256" - }, - { - "internalType": "bytes32", - "name": "batchRoot", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "batchSize", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "prevTotalElements", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "extraData", - "type": "bytes" - } - ], - "internalType": "struct Lib_OVMCodec.ChainBatchHeader", - "name": "stateRootBatchHeader", - "type": "tuple" - }, - { - "components": [ - { - "internalType": "uint256", - "name": "index", - "type": "uint256" - }, - { - "internalType": "bytes32[]", - "name": "siblings", - "type": "bytes32[]" - } - ], - "internalType": "struct Lib_OVMCodec.ChainInclusionProof", - "name": "stateRootProof", - "type": "tuple" - }, - { - "internalType": "bytes", - "name": "stateTrieWitness", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "storageTrieWitness", - "type": "bytes" - } - ], - "internalType": "struct iOVM_L1CrossDomainMessenger.L2MessageInclusionProof", - "name": "_proof", - "type": "tuple" - } - ], - "name": "relayMessage", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "name": "relayedMessages", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_target", - "type": "address" - }, - { - "internalType": "address", - "name": "_sender", - "type": "address" - }, - { - "internalType": "bytes", - "name": "_message", - "type": "bytes" - }, - { - "internalType": "uint256", - "name": "_messageNonce", - "type": "uint256" - }, - { - "internalType": "uint32", - "name": "_gasLimit", - "type": "uint32" - } - ], - "name": "replayMessage", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "string", - "name": "_name", - "type": "string" - } - ], - "name": "resolve", - "outputs": [ - { - "internalType": "address", - "name": "_contract", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_target", - "type": "address" - }, - { - "internalType": "bytes", - "name": "_message", - "type": "bytes" - }, - { - "internalType": "uint32", - "name": "_gasLimit", - "type": "uint32" - } - ], - "name": "sendMessage", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "name": "sentMessages", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "name": "successfulMessages", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "xDomainMessageSender", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - } - ], - "transactionHash": "0x58185415b9f46e832c94156c7ff7c404e0bd4e41bf72422cd4da96647cd75f9e", - "receipt": { - "to": null, - "from": "0x558ba9b8d78713fbf768c1f8a584485B4003f43F", - "contractAddress": "0x2c299baBfF749D06abd68653769Dc1119C401bFF", - "transactionIndex": 3, - "gasUsed": "2165184", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0xa32e80c913e7a984d2d98e55cedf5835a409847785ddedfca99c7c17cf0f7add", - "transactionHash": "0x58185415b9f46e832c94156c7ff7c404e0bd4e41bf72422cd4da96647cd75f9e", - "logs": [], - "blockNumber": 4573442, - "cumulativeGasUsed": "2405923", - "status": 1, - "byzantium": true - }, - "args": [], - "solcInputHash": "cebcb515c1a9c570d96e0b8f6fd237e2", - "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"msgHash\",\"type\":\"bytes32\"}],\"name\":\"RelayedMessage\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"}],\"name\":\"SentMessage\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"messageNonce\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_sender\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_message\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"_messageNonce\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"stateRootBatchHeader\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"siblings\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct Lib_OVMCodec.ChainInclusionProof\",\"name\":\"stateRootProof\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"stateTrieWitness\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"storageTrieWitness\",\"type\":\"bytes\"}],\"internalType\":\"struct iOVM_L1CrossDomainMessenger.L2MessageInclusionProof\",\"name\":\"_proof\",\"type\":\"tuple\"}],\"name\":\"relayMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"relayedMessages\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_sender\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_message\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"_messageNonce\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"_gasLimit\",\"type\":\"uint32\"}],\"name\":\"replayMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"_contract\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_message\",\"type\":\"bytes\"},{\"internalType\":\"uint32\",\"name\":\"_gasLimit\",\"type\":\"uint32\"}],\"name\":\"sendMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"sentMessages\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"successfulMessages\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"xDomainMessageSender\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This contract lives on L1. It sends L1->L2 messages into L2, and relays L2->L1 messages from L2 to their target on L1.\",\"kind\":\"dev\",\"methods\":{\"initialize(address)\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\"}},\"relayMessage(address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))\":{\"params\":{\"_message\":\"Message to send to the target.\",\"_messageNonce\":\"Nonce for the provided message.\",\"_proof\":\"Inclusion proof for the given message.\",\"_sender\":\"Message sender address.\",\"_target\":\"Target contract address.\"}},\"replayMessage(address,address,bytes,uint256,uint32)\":{\"params\":{\"_gasLimit\":\"Gas limit for the provided message.\",\"_message\":\"Message to send to the target.\",\"_messageNonce\":\"Nonce for the provided message.\",\"_sender\":\"Original sender address.\",\"_target\":\"Target contract address.\"}},\"sendMessage(address,bytes,uint32)\":{\"params\":{\"_gasLimit\":\"Gas limit for the provided message.\",\"_message\":\"Message to send to the target.\",\"_target\":\"Target contract address.\"}}},\"title\":\"OVM_L1CrossDomainMessenger\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"constructor\":{\"notice\":\"Pass a default zero address to the address resolver. This will be updated when initialized.\"},\"relayMessage(address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))\":{\"notice\":\"Relays a cross domain message to a contract.\"},\"replayMessage(address,address,bytes,uint256,uint32)\":{\"notice\":\"Replays a cross domain message to the target messenger.\"},\"sendMessage(address,bytes,uint32)\":{\"notice\":\"Sends a cross domain message to the target messenger.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/OVM/bridge/OVM_L1CrossDomainMessenger.sol\":\"OVM_L1CrossDomainMessenger\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/optimistic-ethereum/OVM/bridge/OVM_BaseCrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// +build ovm\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Interface Imports */\\nimport { iOVM_BaseCrossDomainMessenger } from \\\"../../iOVM/bridge/iOVM_BaseCrossDomainMessenger.sol\\\";\\n\\n/* Library Imports */\\nimport { Lib_ReentrancyGuard } from \\\"../../libraries/utils/Lib_ReentrancyGuard.sol\\\";\\n\\n/**\\n * @title OVM_BaseCrossDomainMessenger\\n */\\nabstract contract OVM_BaseCrossDomainMessenger is iOVM_BaseCrossDomainMessenger, Lib_ReentrancyGuard {\\n\\n /**********************\\n * Contract Variables *\\n **********************/\\n\\n mapping (bytes32 => bool) public relayedMessages;\\n mapping (bytes32 => bool) public successfulMessages;\\n mapping (bytes32 => bool) public sentMessages;\\n uint256 public messageNonce;\\n address override public xDomainMessageSender;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n constructor() Lib_ReentrancyGuard() internal {}\\n\\n /**\\n * Sends a cross domain message to the target messenger.\\n * @param _target Target contract address.\\n * @param _message Message to send to the target.\\n * @param _gasLimit Gas limit for the provided message.\\n */\\n function sendMessage(\\n address _target,\\n bytes memory _message,\\n uint32 _gasLimit\\n )\\n override\\n public\\n {\\n bytes memory xDomainCalldata = _getXDomainCalldata(\\n _target,\\n msg.sender,\\n _message,\\n messageNonce\\n );\\n\\n messageNonce += 1;\\n sentMessages[keccak256(xDomainCalldata)] = true;\\n\\n _sendXDomainMessage(xDomainCalldata, _gasLimit);\\n emit SentMessage(xDomainCalldata);\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Generates the correct cross domain calldata for a message.\\n * @param _target Target contract address.\\n * @param _sender Message sender address.\\n * @param _message Message to send to the target.\\n * @param _messageNonce Nonce for the provided message.\\n * @return ABI encoded cross domain calldata.\\n */\\n function _getXDomainCalldata(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _messageNonce\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return abi.encodeWithSignature(\\n \\\"relayMessage(address,address,bytes,uint256)\\\",\\n _target,\\n _sender,\\n _message,\\n _messageNonce\\n );\\n }\\n\\n /**\\n * Sends a cross domain message.\\n * @param _message Message to send.\\n * @param _gasLimit Gas limit for the provided message.\\n */\\n function _sendXDomainMessage(\\n bytes memory _message,\\n uint256 _gasLimit\\n )\\n virtual\\n internal\\n {\\n revert(\\\"Implement me in child contracts!\\\");\\n }\\n}\\n\",\"keccak256\":\"0x25c5521fb5cd66f91aa927b7c199cd2006ba6a2c3857b17e53e2d0727334ea2c\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/bridge/OVM_L1CrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\nimport { Lib_AddressManager } from \\\"../../libraries/resolver/Lib_AddressManager.sol\\\";\\nimport { Lib_SecureMerkleTrie } from \\\"../../libraries/trie/Lib_SecureMerkleTrie.sol\\\";\\nimport { Lib_ReentrancyGuard } from \\\"../../libraries/utils/Lib_ReentrancyGuard.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_L1CrossDomainMessenger } from \\\"../../iOVM/bridge/iOVM_L1CrossDomainMessenger.sol\\\";\\nimport { iOVM_CanonicalTransactionChain } from \\\"../../iOVM/chain/iOVM_CanonicalTransactionChain.sol\\\";\\nimport { iOVM_StateCommitmentChain } from \\\"../../iOVM/chain/iOVM_StateCommitmentChain.sol\\\";\\n\\n/* Contract Imports */\\nimport { OVM_BaseCrossDomainMessenger } from \\\"./OVM_BaseCrossDomainMessenger.sol\\\";\\n\\n/**\\n * @title OVM_L1CrossDomainMessenger\\n * @dev This contract lives on L1. It sends L1->L2 messages into L2, and relays L2->L1 messages from L2 to their target on L1.\\n */\\ncontract OVM_L1CrossDomainMessenger is iOVM_L1CrossDomainMessenger, OVM_BaseCrossDomainMessenger, Lib_AddressResolver {\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * Pass a default zero address to the address resolver. This will be updated when initialized.\\n */\\n constructor()\\n Lib_AddressResolver(address(0))\\n {}\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n */\\n function initialize(\\n address _libAddressManager\\n )\\n public\\n {\\n require(address(libAddressManager) == address(0), \\\"L1CrossDomainMessenger already intialized.\\\");\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n /**\\n * Modifier to enforce that, if configured, only the OVM_L2MessageRelayer contract may successfully call a method.\\n */\\n modifier onlyRelayer() {\\n address relayer = resolve(\\\"OVM_L2MessageRelayer\\\");\\n if (relayer != address(0)) {\\n require(\\n msg.sender == relayer,\\n \\\"Only OVM_L2MessageRelayer can relay L2-to-L1 messages.\\\"\\n );\\n }\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Relays a cross domain message to a contract.\\n * @inheritdoc iOVM_L1CrossDomainMessenger\\n */\\n function relayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _messageNonce,\\n L2MessageInclusionProof memory _proof\\n )\\n override\\n public\\n nonReentrant\\n onlyRelayer()\\n {\\n bytes memory xDomainCalldata = _getXDomainCalldata(\\n _target,\\n _sender,\\n _message,\\n _messageNonce\\n );\\n\\n require(\\n _verifyXDomainMessage(\\n xDomainCalldata,\\n _proof\\n ) == true,\\n \\\"Provided message could not be verified.\\\"\\n );\\n\\n bytes32 xDomainCalldataHash = keccak256(xDomainCalldata);\\n\\n require(\\n successfulMessages[xDomainCalldataHash] == false,\\n \\\"Provided message has already been received.\\\"\\n );\\n\\n xDomainMessageSender = _sender;\\n (bool success, ) = _target.call(_message);\\n\\n // Mark the message as received if the call was successful. Ensures that a message can be\\n // relayed multiple times in the case that the call reverted.\\n if (success == true) {\\n successfulMessages[xDomainCalldataHash] = true;\\n emit RelayedMessage(xDomainCalldataHash);\\n }\\n\\n // Store an identifier that can be used to prove that the given message was relayed by some\\n // user. Gives us an easy way to pay relayers for their work.\\n bytes32 relayId = keccak256(\\n abi.encodePacked(\\n xDomainCalldata,\\n msg.sender,\\n block.number\\n )\\n );\\n relayedMessages[relayId] = true;\\n }\\n\\n /**\\n * Replays a cross domain message to the target messenger.\\n * @inheritdoc iOVM_L1CrossDomainMessenger\\n */\\n function replayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _messageNonce,\\n uint32 _gasLimit\\n )\\n override\\n public\\n {\\n bytes memory xDomainCalldata = _getXDomainCalldata(\\n _target,\\n _sender,\\n _message,\\n _messageNonce\\n );\\n\\n require(\\n sentMessages[keccak256(xDomainCalldata)] == true,\\n \\\"Provided message has not already been sent.\\\"\\n );\\n\\n _sendXDomainMessage(xDomainCalldata, _gasLimit);\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Verifies that the given message is valid.\\n * @param _xDomainCalldata Calldata to verify.\\n * @param _proof Inclusion proof for the message.\\n * @return Whether or not the provided message is valid.\\n */\\n function _verifyXDomainMessage(\\n bytes memory _xDomainCalldata,\\n L2MessageInclusionProof memory _proof\\n )\\n internal\\n view\\n returns (\\n bool\\n )\\n {\\n return (\\n _verifyStateRootProof(_proof)\\n && _verifyStorageProof(_xDomainCalldata, _proof)\\n );\\n }\\n\\n /**\\n * Verifies that the state root within an inclusion proof is valid.\\n * @param _proof Message inclusion proof.\\n * @return Whether or not the provided proof is valid.\\n */\\n function _verifyStateRootProof(\\n L2MessageInclusionProof memory _proof\\n )\\n internal\\n view\\n returns (\\n bool\\n )\\n {\\n iOVM_StateCommitmentChain ovmStateCommitmentChain = iOVM_StateCommitmentChain(resolve(\\\"OVM_StateCommitmentChain\\\"));\\n\\n return (\\n ovmStateCommitmentChain.insideFraudProofWindow(_proof.stateRootBatchHeader) == false\\n && ovmStateCommitmentChain.verifyStateCommitment(\\n _proof.stateRoot,\\n _proof.stateRootBatchHeader,\\n _proof.stateRootProof\\n )\\n );\\n }\\n\\n /**\\n * Verifies that the storage proof within an inclusion proof is valid.\\n * @param _xDomainCalldata Encoded message calldata.\\n * @param _proof Message inclusion proof.\\n * @return Whether or not the provided proof is valid.\\n */\\n function _verifyStorageProof(\\n bytes memory _xDomainCalldata,\\n L2MessageInclusionProof memory _proof\\n )\\n internal\\n view\\n returns (\\n bool\\n )\\n {\\n bytes32 storageKey = keccak256(\\n abi.encodePacked(\\n keccak256(\\n abi.encodePacked(\\n _xDomainCalldata,\\n resolve(\\\"OVM_L2CrossDomainMessenger\\\")\\n )\\n ),\\n uint256(0)\\n )\\n );\\n\\n (\\n bool exists,\\n bytes memory encodedMessagePassingAccount\\n ) = Lib_SecureMerkleTrie.get(\\n abi.encodePacked(0x4200000000000000000000000000000000000000),\\n _proof.stateTrieWitness,\\n _proof.stateRoot\\n );\\n\\n require(\\n exists == true,\\n \\\"Message passing precompile has not been initialized or invalid proof provided.\\\"\\n );\\n\\n Lib_OVMCodec.EVMAccount memory account = Lib_OVMCodec.decodeEVMAccount(\\n encodedMessagePassingAccount\\n );\\n\\n return Lib_SecureMerkleTrie.verifyInclusionProof(\\n abi.encodePacked(storageKey),\\n abi.encodePacked(uint8(1)),\\n _proof.storageTrieWitness,\\n account.storageRoot\\n );\\n }\\n\\n /**\\n * Sends a cross domain message.\\n * @param _message Message to send.\\n * @param _gasLimit OVM gas limit for the message.\\n */\\n function _sendXDomainMessage(\\n bytes memory _message,\\n uint256 _gasLimit\\n )\\n override\\n internal\\n {\\n iOVM_CanonicalTransactionChain(resolve(\\\"OVM_CanonicalTransactionChain\\\")).enqueue(\\n resolve(\\\"OVM_L2CrossDomainMessenger\\\"),\\n _gasLimit,\\n _message\\n );\\n }\\n}\\n\",\"keccak256\":\"0x62ead80db43d27db3da44f44b9edc1ecfd041134f8422036ddfb499fc324cfe4\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/bridge/iOVM_BaseCrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// +build ovm\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/**\\n * @title iOVM_BaseCrossDomainMessenger\\n */\\ninterface iOVM_BaseCrossDomainMessenger {\\n\\n /**********\\n * Events *\\n **********/\\n event SentMessage(bytes message);\\n event RelayedMessage(bytes32 msgHash);\\n\\n /**********************\\n * Contract Variables *\\n **********************/\\n function xDomainMessageSender() external view returns (address);\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sends a cross domain message to the target messenger.\\n * @param _target Target contract address.\\n * @param _message Message to send to the target.\\n * @param _gasLimit Gas limit for the provided message.\\n */\\n function sendMessage(\\n address _target,\\n bytes calldata _message,\\n uint32 _gasLimit\\n ) external;\\n}\\n\",\"keccak256\":\"0x5da9f0957057d97fb45e514c6d247724e645d8f05c1c2b958cb360ecd9dbce50\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/bridge/iOVM_L1CrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_BaseCrossDomainMessenger } from \\\"./iOVM_BaseCrossDomainMessenger.sol\\\";\\n\\n/**\\n * @title iOVM_L1CrossDomainMessenger\\n */\\ninterface iOVM_L1CrossDomainMessenger is iOVM_BaseCrossDomainMessenger {\\n\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n struct L2MessageInclusionProof {\\n bytes32 stateRoot;\\n Lib_OVMCodec.ChainBatchHeader stateRootBatchHeader;\\n Lib_OVMCodec.ChainInclusionProof stateRootProof;\\n bytes stateTrieWitness;\\n bytes storageTrieWitness;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Relays a cross domain message to a contract.\\n * @param _target Target contract address.\\n * @param _sender Message sender address.\\n * @param _message Message to send to the target.\\n * @param _messageNonce Nonce for the provided message.\\n * @param _proof Inclusion proof for the given message.\\n */\\n function relayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _messageNonce,\\n L2MessageInclusionProof memory _proof\\n ) external;\\n\\n /**\\n * Replays a cross domain message to the target messenger.\\n * @param _target Target contract address.\\n * @param _sender Original sender address.\\n * @param _message Message to send to the target.\\n * @param _messageNonce Nonce for the provided message.\\n * @param _gasLimit Gas limit for the provided message.\\n */\\n function replayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _messageNonce,\\n uint32 _gasLimit\\n ) external;\\n}\\n\",\"keccak256\":\"0x51fb52c2a5ed1d3491a68431eb034aebe17f261c6dce7c7b4631a4f01b0b8bb8\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_CanonicalTransactionChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title iOVM_CanonicalTransactionChain\\n */\\ninterface iOVM_CanonicalTransactionChain {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event TransactionEnqueued(\\n address _l1TxOrigin,\\n address _target,\\n uint256 _gasLimit,\\n bytes _data,\\n uint256 _queueIndex,\\n uint256 _timestamp\\n );\\n\\n event QueueBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event SequencerBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event TransactionBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct BatchContext {\\n uint256 numSequencedTransactions;\\n uint256 numSubsequentQueueTransactions;\\n uint256 timestamp;\\n uint256 blockNumber;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements()\\n external\\n view\\n returns (\\n uint256 _totalElements\\n );\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches()\\n external\\n view\\n returns (\\n uint256 _totalBatches\\n );\\n\\n /**\\n * Returns the index of the next element to be enqueued.\\n * @return Index for the next queue element.\\n */\\n function getNextQueueIndex()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Get the number of queue elements which have not yet been included.\\n * @return Length of the queue.\\n */\\n function getNumPendingQueueElements()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Retrieves the length of the queue, including\\n * both pending and canonical transactions.\\n * @return Length of the queue.\\n */\\n function getQueueLength()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Gets the queue element at a particular index.\\n * @param _index Index of the queue element to access.\\n * @return _element Queue element at the given index.\\n */\\n function getQueueElement(\\n uint256 _index\\n )\\n external\\n view\\n returns (\\n Lib_OVMCodec.QueueElement memory _element\\n );\\n\\n /**\\n * Adds a transaction to the queue.\\n * @param _target Target contract to send the transaction to.\\n * @param _gasLimit Gas limit for the given transaction.\\n * @param _data Transaction data.\\n */\\n function enqueue(\\n address _target,\\n uint256 _gasLimit,\\n bytes memory _data\\n )\\n external;\\n\\n /**\\n * Appends a given number of queued transactions as a single batch.\\n * @param _numQueuedTransactions Number of transactions to append.\\n */\\n function appendQueueBatch(\\n uint256 _numQueuedTransactions\\n )\\n external;\\n\\n /**\\n * Allows the sequencer to append a batch of transactions.\\n * @dev This function uses a custom encoding scheme for efficiency reasons.\\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\\n * .param _contexts Array of batch contexts.\\n * .param _transactionDataFields Array of raw transaction data.\\n */\\n function appendSequencerBatch(\\n // uint40 _shouldStartAtElement,\\n // uint24 _totalElementsToAppend,\\n // BatchContext[] _contexts,\\n // bytes[] _transactionDataFields\\n )\\n external;\\n\\n /**\\n * Verifies whether a transaction is included in the chain.\\n * @param _transaction Transaction to verify.\\n * @param _txChainElement Transaction chain element corresponding to the transaction.\\n * @param _batchHeader Header of the batch the transaction was included in.\\n * @param _inclusionProof Inclusion proof for the provided transaction chain element.\\n * @return True if the transaction exists in the CTC, false if not.\\n */\\n function verifyTransaction(\\n Lib_OVMCodec.Transaction memory _transaction,\\n Lib_OVMCodec.TransactionChainElement memory _txChainElement,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _inclusionProof\\n )\\n external\\n view\\n returns (\\n bool\\n );\\n}\\n\",\"keccak256\":\"0x82a4e62286c8bc5e2d3de33f66d9b707cb9636e553dca54b5e95277bd794a934\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_StateCommitmentChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title iOVM_StateCommitmentChain\\n */\\ninterface iOVM_StateCommitmentChain {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event StateBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n event StateBatchDeleted(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot\\n );\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements()\\n external\\n view\\n returns (\\n uint256 _totalElements\\n );\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches()\\n external\\n view\\n returns (\\n uint256 _totalBatches\\n );\\n\\n /**\\n * Retrieves the timestamp of the last batch submitted by the sequencer.\\n * @return _lastSequencerTimestamp Last sequencer batch timestamp.\\n */\\n function getLastSequencerTimestamp()\\n external\\n view\\n returns (\\n uint256 _lastSequencerTimestamp\\n );\\n\\n /**\\n * Appends a batch of state roots to the chain.\\n * @param _batch Batch of state roots.\\n * @param _shouldStartAtElement Index of the element at which this batch should start.\\n */\\n function appendStateBatch(\\n bytes32[] calldata _batch,\\n uint256 _shouldStartAtElement\\n )\\n external;\\n\\n /**\\n * Deletes all state roots after (and including) a given batch.\\n * @param _batchHeader Header of the batch to start deleting from.\\n */\\n function deleteStateBatch(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n external;\\n\\n /**\\n * Verifies a batch inclusion proof.\\n * @param _element Hash of the element to verify a proof for.\\n * @param _batchHeader Header of the batch in which the element was included.\\n * @param _proof Merkle inclusion proof for the element.\\n */\\n function verifyStateCommitment(\\n bytes32 _element,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _proof\\n )\\n external\\n view\\n returns (\\n bool _verified\\n );\\n\\n /**\\n * Checks whether a given batch is still inside its fraud proof window.\\n * @param _batchHeader Header of the batch to check.\\n * @return _inside Whether or not the batch is inside the fraud proof window.\\n */\\n function insideFraudProofWindow(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n external\\n view\\n returns (\\n bool _inside\\n );\\n}\\n\",\"keccak256\":\"0x6646d6ff392b81aab52a7a277e91540819464751de0af5afd1962094b2e92448\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/codec/Lib_OVMCodec.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../utils/Lib_Bytes32Utils.sol\\\";\\nimport { Lib_SafeExecutionManagerWrapper } from \\\"../../libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\\\";\\n\\n/**\\n * @title Lib_OVMCodec\\n */\\nlibrary Lib_OVMCodec {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n bytes constant internal RLP_NULL_BYTES = hex'80';\\n bytes constant internal NULL_BYTES = bytes('');\\n\\n // Ring buffer IDs\\n bytes32 constant internal RING_BUFFER_SCC_BATCHES = keccak256(\\\"RING_BUFFER_SCC_BATCHES\\\");\\n bytes32 constant internal RING_BUFFER_CTC_BATCHES = keccak256(\\\"RING_BUFFER_CTC_BATCHES\\\");\\n bytes32 constant internal RING_BUFFER_CTC_QUEUE = keccak256(\\\"RING_BUFFER_CTC_QUEUE\\\");\\n\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum EOASignatureType {\\n EIP155_TRANSACTON,\\n ETH_SIGNED_MESSAGE\\n }\\n\\n enum QueueOrigin {\\n SEQUENCER_QUEUE,\\n L1TOL2_QUEUE\\n }\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Account {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n address ethAddress;\\n bool isFresh;\\n }\\n\\n struct EVMAccount {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n }\\n\\n struct ChainBatchHeader {\\n uint256 batchIndex;\\n bytes32 batchRoot;\\n uint256 batchSize;\\n uint256 prevTotalElements;\\n bytes extraData;\\n }\\n\\n struct ChainInclusionProof {\\n uint256 index;\\n bytes32[] siblings;\\n }\\n\\n struct Transaction {\\n uint256 timestamp;\\n uint256 blockNumber;\\n QueueOrigin l1QueueOrigin;\\n address l1TxOrigin;\\n address entrypoint;\\n uint256 gasLimit;\\n bytes data;\\n }\\n\\n struct TransactionChainElement {\\n bool isSequenced;\\n uint256 queueIndex; // QUEUED TX ONLY\\n uint256 timestamp; // SEQUENCER TX ONLY\\n uint256 blockNumber; // SEQUENCER TX ONLY\\n bytes txData; // SEQUENCER TX ONLY\\n }\\n\\n struct QueueElement {\\n bytes32 queueRoot;\\n uint40 timestamp;\\n uint40 blockNumber;\\n }\\n\\n struct EIP155Transaction {\\n uint256 nonce;\\n uint256 gasPrice;\\n uint256 gasLimit;\\n address to;\\n uint256 value;\\n bytes data;\\n uint256 chainId;\\n }\\n\\n\\n /*********************************************\\n * Internal Functions: Encoding and Decoding *\\n *********************************************/\\n\\n /**\\n * Decodes an EOA transaction (i.e., native Ethereum RLP encoding).\\n * @param _transaction Encoded EOA transaction.\\n * @return _decoded Transaction decoded into a struct.\\n */\\n function decodeEIP155Transaction(\\n bytes memory _transaction,\\n bool _isEthSignedMessage\\n )\\n internal\\n pure\\n returns (\\n EIP155Transaction memory _decoded\\n )\\n {\\n if (_isEthSignedMessage) {\\n (\\n uint256 _nonce,\\n uint256 _gasLimit,\\n uint256 _gasPrice,\\n uint256 _chainId,\\n address _to,\\n bytes memory _data\\n ) = abi.decode(\\n _transaction,\\n (uint256, uint256, uint256, uint256, address ,bytes)\\n );\\n return EIP155Transaction({\\n nonce: _nonce,\\n gasPrice: _gasPrice,\\n gasLimit: _gasLimit,\\n to: _to,\\n value: 0,\\n data: _data,\\n chainId: _chainId\\n });\\n } else {\\n Lib_RLPReader.RLPItem[] memory decoded = Lib_RLPReader.readList(_transaction);\\n\\n return EIP155Transaction({\\n nonce: Lib_RLPReader.readUint256(decoded[0]),\\n gasPrice: Lib_RLPReader.readUint256(decoded[1]),\\n gasLimit: Lib_RLPReader.readUint256(decoded[2]),\\n to: Lib_RLPReader.readAddress(decoded[3]),\\n value: Lib_RLPReader.readUint256(decoded[4]),\\n data: Lib_RLPReader.readBytes(decoded[5]),\\n chainId: Lib_RLPReader.readUint256(decoded[6])\\n });\\n }\\n }\\n\\n function decompressEIP155Transaction(\\n bytes memory _transaction\\n )\\n internal\\n returns (\\n EIP155Transaction memory _decompressed\\n )\\n {\\n return EIP155Transaction({\\n gasLimit: Lib_BytesUtils.toUint24(_transaction, 0),\\n gasPrice: uint256(Lib_BytesUtils.toUint24(_transaction, 3)) * 1000000,\\n nonce: Lib_BytesUtils.toUint24(_transaction, 6),\\n to: Lib_BytesUtils.toAddress(_transaction, 9),\\n data: Lib_BytesUtils.slice(_transaction, 29),\\n chainId: Lib_SafeExecutionManagerWrapper.safeCHAINID(),\\n value: 0\\n });\\n }\\n\\n /**\\n * Encodes an EOA transaction back into the original transaction.\\n * @param _transaction EIP155transaction to encode.\\n * @param _isEthSignedMessage Whether or not this was an eth signed message.\\n * @return Encoded transaction.\\n */\\n function encodeEIP155Transaction(\\n EIP155Transaction memory _transaction,\\n bool _isEthSignedMessage\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n if (_isEthSignedMessage) {\\n return abi.encode(\\n _transaction.nonce,\\n _transaction.gasLimit,\\n _transaction.gasPrice,\\n _transaction.chainId,\\n _transaction.to,\\n _transaction.data\\n );\\n } else {\\n bytes[] memory raw = new bytes[](9);\\n\\n raw[0] = Lib_RLPWriter.writeUint(_transaction.nonce);\\n raw[1] = Lib_RLPWriter.writeUint(_transaction.gasPrice);\\n raw[2] = Lib_RLPWriter.writeUint(_transaction.gasLimit);\\n if (_transaction.to == address(0)) {\\n raw[3] = Lib_RLPWriter.writeBytes('');\\n } else {\\n raw[3] = Lib_RLPWriter.writeAddress(_transaction.to);\\n }\\n raw[4] = Lib_RLPWriter.writeUint(0);\\n raw[5] = Lib_RLPWriter.writeBytes(_transaction.data);\\n raw[6] = Lib_RLPWriter.writeUint(_transaction.chainId);\\n raw[7] = Lib_RLPWriter.writeBytes(bytes(''));\\n raw[8] = Lib_RLPWriter.writeBytes(bytes(''));\\n\\n return Lib_RLPWriter.writeList(raw);\\n }\\n }\\n\\n /**\\n * Encodes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return _encoded Encoded transaction bytes.\\n */\\n function encodeTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes memory _encoded\\n )\\n {\\n return abi.encodePacked(\\n _transaction.timestamp,\\n _transaction.blockNumber,\\n _transaction.l1QueueOrigin,\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n );\\n }\\n\\n /**\\n * Hashes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return _hash Hashed transaction\\n */\\n function hashTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes32 _hash\\n )\\n {\\n return keccak256(encodeTransaction(_transaction));\\n }\\n\\n /**\\n * Converts an OVM account to an EVM account.\\n * @param _in OVM account to convert.\\n * @return _out Converted EVM account.\\n */\\n function toEVMAccount(\\n Account memory _in\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory _out\\n )\\n {\\n return EVMAccount({\\n nonce: _in.nonce,\\n balance: _in.balance,\\n storageRoot: _in.storageRoot,\\n codeHash: _in.codeHash\\n });\\n }\\n\\n /**\\n * @notice RLP-encodes an account state struct.\\n * @param _account Account state struct.\\n * @return _encoded RLP-encoded account state.\\n */\\n function encodeEVMAccount(\\n EVMAccount memory _account\\n )\\n internal\\n pure\\n returns (\\n bytes memory _encoded\\n )\\n {\\n bytes[] memory raw = new bytes[](4);\\n\\n // Unfortunately we can't create this array outright because\\n // Lib_RLPWriter.writeList will reject fixed-size arrays. Assigning\\n // index-by-index circumvents this issue.\\n raw[0] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.nonce)\\n )\\n );\\n raw[1] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.balance)\\n )\\n );\\n raw[2] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.storageRoot));\\n raw[3] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.codeHash));\\n\\n return Lib_RLPWriter.writeList(raw);\\n }\\n\\n /**\\n * @notice Decodes an RLP-encoded account state into a useful struct.\\n * @param _encoded RLP-encoded account state.\\n * @return _account Account state struct.\\n */\\n function decodeEVMAccount(\\n bytes memory _encoded\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory _account\\n )\\n {\\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\\n\\n return EVMAccount({\\n nonce: Lib_RLPReader.readUint256(accountState[0]),\\n balance: Lib_RLPReader.readUint256(accountState[1]),\\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\\n });\\n }\\n\\n /**\\n * Calculates a hash for a given batch header.\\n * @param _batchHeader Header to hash.\\n * @return _hash Hash of the header.\\n */\\n function hashBatchHeader(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n internal\\n pure\\n returns (\\n bytes32 _hash\\n )\\n {\\n return keccak256(\\n abi.encode(\\n _batchHeader.batchRoot,\\n _batchHeader.batchSize,\\n _batchHeader.prevTotalElements,\\n _batchHeader.extraData\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0x19d78734777b4998f1544e235cf3934f20c5055cd76c2bd60bf0f6dacdd72b3a\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// +build ovm\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Contract Imports */\\nimport { Ownable } from \\\"./Lib_Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n /*******************************************\\n * Contract Variables: Internal Accounting *\\n *******************************************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n public\\n onlyOwner\\n {\\n emit AddressSet(_name, _address);\\n addresses[_getNameHash(_name)] = _address;\\n }\\n\\n function getAddress(\\n string memory _name\\n )\\n public\\n view\\n returns (address)\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32 _hash\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xdf802e1cc6474df913626991e9fca3835c620a519f397afe04bf9c260e723257\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// +build ovm\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\ncontract Lib_AddressResolver {\\n\\n /*******************************************\\n * Contract Variables: Contract References *\\n *******************************************/\\n\\n Lib_AddressManager internal libAddressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(\\n address _libAddressManager\\n ) public {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function resolve(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address _contract\\n )\\n {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0xf3b9d78b309ddeec259ce3e0e1cfdef3ca40938e9a81971b28ce2b8ea327f533\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// +build ovm\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Ownable\\n * @dev Adapted from https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol\\n */\\nabstract contract Ownable {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n address public owner;\\n\\n\\n /**********\\n * Events *\\n **********/\\n\\n event OwnershipTransferred(\\n address indexed previousOwner,\\n address indexed newOwner\\n );\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n constructor() internal {\\n owner = msg.sender;\\n emit OwnershipTransferred(address(0), owner);\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n owner == msg.sender,\\n \\\"Ownable: caller is not the owner\\\"\\n );\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function renounceOwnership()\\n public\\n virtual\\n onlyOwner\\n {\\n emit OwnershipTransferred(owner, address(0));\\n owner = address(0);\\n }\\n\\n function transferOwnership(address _newOwner)\\n public\\n virtual\\n onlyOwner\\n {\\n require(\\n _newOwner != address(0),\\n \\\"Ownable: new owner cannot be the zero address\\\"\\n );\\n\\n emit OwnershipTransferred(owner, _newOwner);\\n owner = _newOwner;\\n }\\n}\\n\",\"keccak256\":\"0xe0409fbd236d16ca6be439d9d97dd36d0d9a0697ee0062d49588b9d29c248e47\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPReader.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.7.0;\\n\\n/**\\n * @title Lib_RLPReader\\n * @dev Adapted from \\\"RLPReader\\\" by Hamdi Allam (hamdi.allam97@gmail.com).\\n */\\nlibrary Lib_RLPReader {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 constant internal MAX_LIST_LENGTH = 32;\\n\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum RLPItemType {\\n DATA_ITEM,\\n LIST_ITEM\\n }\\n\\n \\n /***********\\n * Structs *\\n ***********/\\n\\n struct RLPItem {\\n uint256 length;\\n uint256 ptr;\\n }\\n \\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n \\n /**\\n * Converts bytes to a reference to memory position and length.\\n * @param _in Input bytes to convert.\\n * @return Output memory reference.\\n */\\n function toRLPItem(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem memory\\n )\\n {\\n uint256 ptr;\\n assembly {\\n ptr := add(_in, 32)\\n }\\n\\n return RLPItem({\\n length: _in.length,\\n ptr: ptr\\n });\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n (\\n uint256 listOffset,\\n ,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.LIST_ITEM,\\n \\\"Invalid RLP list value.\\\"\\n );\\n\\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\\n // writing to the length. Since we can't know the number of RLP items without looping over\\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\\n // simply set a reasonable maximum list length and decrease the size before we finish.\\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\\n\\n uint256 itemCount = 0;\\n uint256 offset = listOffset;\\n while (offset < _in.length) {\\n require(\\n itemCount < MAX_LIST_LENGTH,\\n \\\"Provided RLP list exceeds max list length.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n ) = _decodeLength(RLPItem({\\n length: _in.length - offset,\\n ptr: _in.ptr + offset\\n }));\\n\\n out[itemCount] = RLPItem({\\n length: itemLength + itemOffset,\\n ptr: _in.ptr + offset\\n });\\n\\n itemCount += 1;\\n offset += itemOffset + itemLength;\\n }\\n\\n // Decrease the array size to match the actual item count.\\n assembly {\\n mstore(out, itemCount)\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n return readList(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes value.\\\"\\n );\\n\\n return _copy(_in.ptr, itemOffset, itemLength);\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return readBytes(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return string(readBytes(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return readString(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n require(\\n _in.length <= 33,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr + itemOffset;\\n bytes32 out;\\n assembly {\\n out := mload(ptr)\\n\\n // Shift the bytes over to match the item size.\\n if lt(itemLength, 32) {\\n out := div(out, exp(256, sub(32, itemLength)))\\n }\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return readBytes32(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return uint256(readBytes32(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return readUint256(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n require(\\n _in.length == 1,\\n \\\"Invalid RLP boolean value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 out;\\n assembly {\\n out := byte(0, mload(ptr))\\n }\\n\\n return out != 0;\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return readBool(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n if (_in.length == 1) {\\n return address(0);\\n }\\n\\n require(\\n _in.length == 21,\\n \\\"Invalid RLP address value.\\\"\\n );\\n\\n return address(readUint256(_in));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return readAddress(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads the raw bytes of an RLP item.\\n * @param _in RLP item to read.\\n * @return Raw RLP bytes.\\n */\\n function readRawBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in);\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Decodes the length of an RLP item.\\n * @param _in RLP item to decode.\\n * @return Offset of the encoded data.\\n * @return Length of the encoded data.\\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\\n */\\n function _decodeLength(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n uint256,\\n uint256,\\n RLPItemType\\n )\\n {\\n require(\\n _in.length > 0,\\n \\\"RLP item cannot be null.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 prefix;\\n assembly {\\n prefix := byte(0, mload(ptr))\\n }\\n\\n if (prefix <= 0x7f) {\\n // Single byte.\\n\\n return (0, 1, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xb7) {\\n // Short string.\\n\\n uint256 strLen = prefix - 0x80;\\n \\n require(\\n _in.length > strLen,\\n \\\"Invalid RLP short string.\\\"\\n );\\n\\n return (1, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xbf) {\\n // Long string.\\n uint256 lenOfStrLen = prefix - 0xb7;\\n\\n require(\\n _in.length > lenOfStrLen,\\n \\\"Invalid RLP long string length.\\\"\\n );\\n\\n uint256 strLen;\\n assembly {\\n // Pick out the string length.\\n strLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfStrLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfStrLen + strLen,\\n \\\"Invalid RLP long string.\\\"\\n );\\n\\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xf7) {\\n // Short list.\\n uint256 listLen = prefix - 0xc0;\\n\\n require(\\n _in.length > listLen,\\n \\\"Invalid RLP short list.\\\"\\n );\\n\\n return (1, listLen, RLPItemType.LIST_ITEM);\\n } else {\\n // Long list.\\n uint256 lenOfListLen = prefix - 0xf7;\\n\\n require(\\n _in.length > lenOfListLen,\\n \\\"Invalid RLP long list length.\\\"\\n );\\n\\n uint256 listLen;\\n assembly {\\n // Pick out the list length.\\n listLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfListLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfListLen + listLen,\\n \\\"Invalid RLP long list.\\\"\\n );\\n\\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\\n }\\n }\\n\\n /**\\n * Copies the bytes from a memory location.\\n * @param _src Pointer to the location to read from.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Copied bytes.\\n */\\n function _copy(\\n uint256 _src,\\n uint256 _offset,\\n uint256 _length\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out = new bytes(_length);\\n if (out.length == 0) {\\n return out;\\n }\\n\\n uint256 src = _src + _offset;\\n uint256 dest;\\n assembly {\\n dest := add(out, 32)\\n }\\n\\n // Copy over as many complete words as we can.\\n for (uint256 i = 0; i < _length / 32; i++) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n\\n src += 32;\\n dest += 32;\\n }\\n\\n // Pick out the remaining bytes.\\n uint256 mask = 256 ** (32 - (_length % 32)) - 1;\\n assembly {\\n mstore(\\n dest,\\n or(\\n and(mload(src), not(mask)),\\n and(mload(dest), mask)\\n )\\n )\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Copies an RLP item into bytes.\\n * @param _in RLP item to copy.\\n * @return Copied bytes.\\n */\\n function _copy(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in.ptr, 0, _in.length);\\n }\\n}\\n\",\"keccak256\":\"0x8338f7b6e5f0ded8fc36d9088fd127ee53ae4040ca3f4838eb6123f642d38c62\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPWriter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.7.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\n\\n/**\\n * @title Lib_RLPWriter\\n * @author Bakaoh (with modifications)\\n */\\nlibrary Lib_RLPWriter {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * RLP encodes a byte string.\\n * @param _in The byte string to encode.\\n * @return _out The RLP encoded string in bytes.\\n */\\n function writeBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n bytes memory encoded;\\n\\n if (_in.length == 1 && uint8(_in[0]) < 128) {\\n encoded = _in;\\n } else {\\n encoded = Lib_BytesUtils.concat(_writeLength(_in.length, 128), _in);\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * RLP encodes a list of RLP encoded byte byte strings.\\n * @param _in The list of RLP encoded byte strings.\\n * @return _out The RLP encoded list of items in bytes.\\n */\\n function writeList(\\n bytes[] memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n bytes memory list = _flatten(_in);\\n return Lib_BytesUtils.concat(_writeLength(list.length, 192), list);\\n }\\n\\n /**\\n * RLP encodes a string.\\n * @param _in The string to encode.\\n * @return _out The RLP encoded string in bytes.\\n */\\n function writeString(\\n string memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(bytes(_in));\\n }\\n\\n /**\\n * RLP encodes an address.\\n * @param _in The address to encode.\\n * @return _out The RLP encoded address in bytes.\\n */\\n function writeAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a uint.\\n * @param _in The uint256 to encode.\\n * @return _out The RLP encoded uint256 in bytes.\\n */\\n function writeUint(\\n uint256 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(_toBinary(_in));\\n }\\n\\n /**\\n * RLP encodes a bool.\\n * @param _in The bool to encode.\\n * @return _out The RLP encoded bool in bytes.\\n */\\n function writeBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n bytes memory encoded = new bytes(1);\\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\\n return encoded;\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\\n * @param _len The length of the string or the payload.\\n * @param _offset 128 if item is string, 192 if item is list.\\n * @return _encoded RLP encoded bytes.\\n */\\n function _writeLength(\\n uint256 _len,\\n uint256 _offset\\n )\\n private\\n pure\\n returns (\\n bytes memory _encoded\\n )\\n {\\n bytes memory encoded;\\n\\n if (_len < 56) {\\n encoded = new bytes(1);\\n encoded[0] = byte(uint8(_len) + uint8(_offset));\\n } else {\\n uint256 lenLen;\\n uint256 i = 1;\\n while (_len / i != 0) {\\n lenLen++;\\n i *= 256;\\n }\\n\\n encoded = new bytes(lenLen + 1);\\n encoded[0] = byte(uint8(lenLen) + uint8(_offset) + 55);\\n for(i = 1; i <= lenLen; i++) {\\n encoded[i] = byte(uint8((_len / (256**(lenLen-i))) % 256));\\n }\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * Encode integer in big endian binary form with no leading zeroes.\\n * @notice TODO: This should be optimized with assembly to save gas costs.\\n * @param _x The integer to encode.\\n * @return _binary RLP encoded bytes.\\n */\\n function _toBinary(\\n uint256 _x\\n )\\n private\\n pure\\n returns (\\n bytes memory _binary\\n )\\n {\\n bytes memory b = abi.encodePacked(_x);\\n\\n uint256 i = 0;\\n for (; i < 32; i++) {\\n if (b[i] != 0) {\\n break;\\n }\\n }\\n\\n bytes memory res = new bytes(32 - i);\\n for (uint256 j = 0; j < res.length; j++) {\\n res[j] = b[i++];\\n }\\n\\n return res;\\n }\\n\\n /**\\n * Copies a piece of memory to another location.\\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\\n * @param _dest Destination location.\\n * @param _src Source location.\\n * @param _len Length of memory to copy.\\n */\\n function _memcpy(\\n uint256 _dest,\\n uint256 _src,\\n uint256 _len\\n )\\n private\\n pure\\n {\\n uint256 dest = _dest;\\n uint256 src = _src;\\n uint256 len = _len;\\n\\n for(; len >= 32; len -= 32) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n dest += 32;\\n src += 32;\\n }\\n\\n uint256 mask = 256 ** (32 - len) - 1;\\n assembly {\\n let srcpart := and(mload(src), not(mask))\\n let destpart := and(mload(dest), mask)\\n mstore(dest, or(destpart, srcpart))\\n }\\n }\\n\\n /**\\n * Flattens a list of byte strings into one byte string.\\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\\n * @param _list List of byte strings to flatten.\\n * @return _flattened The flattened byte string.\\n */\\n function _flatten(\\n bytes[] memory _list\\n )\\n private\\n pure\\n returns (\\n bytes memory _flattened\\n )\\n {\\n if (_list.length == 0) {\\n return new bytes(0);\\n }\\n\\n uint256 len;\\n uint256 i = 0;\\n for (; i < _list.length; i++) {\\n len += _list[i].length;\\n }\\n\\n bytes memory flattened = new bytes(len);\\n uint256 flattenedPtr;\\n assembly { flattenedPtr := add(flattened, 0x20) }\\n\\n for(i = 0; i < _list.length; i++) {\\n bytes memory item = _list[i];\\n\\n uint256 listPtr;\\n assembly { listPtr := add(item, 0x20)}\\n\\n _memcpy(flattenedPtr, listPtr, item.length);\\n flattenedPtr += _list[i].length;\\n }\\n\\n return flattened;\\n }\\n}\",\"keccak256\":\"0x6d1aaef567f8a91bb965b95a95637f433a1f0ac4cf0bc1e209cdb1dd5b0f204b\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/trie/Lib_MerkleTrie.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.7.0;\\n\\n/* Library Imports */\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\n\\n/**\\n * @title Lib_MerkleTrie\\n */\\nlibrary Lib_MerkleTrie {\\n\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n enum NodeType {\\n BranchNode,\\n ExtensionNode,\\n LeafNode\\n }\\n\\n struct TrieNode {\\n bytes encoded;\\n Lib_RLPReader.RLPItem[] decoded;\\n }\\n\\n\\n /**********************\\n * Contract Constants *\\n **********************/\\n\\n // TREE_RADIX determines the number of elements per branch node.\\n uint256 constant TREE_RADIX = 16;\\n // Branch nodes have TREE_RADIX elements plus an additional `value` slot.\\n uint256 constant BRANCH_NODE_LENGTH = TREE_RADIX + 1;\\n // Leaf nodes and extension nodes always have two elements, a `path` and a `value`.\\n uint256 constant LEAF_OR_EXTENSION_NODE_LENGTH = 2;\\n\\n // Prefixes are prepended to the `path` within a leaf or extension node and\\n // allow us to differentiate between the two node types. `ODD` or `EVEN` is\\n // determined by the number of nibbles within the unprefixed `path`. If the\\n // number of nibbles if even, we need to insert an extra padding nibble so\\n // the resulting prefixed `path` has an even number of nibbles.\\n uint8 constant PREFIX_EXTENSION_EVEN = 0;\\n uint8 constant PREFIX_EXTENSION_ODD = 1;\\n uint8 constant PREFIX_LEAF_EVEN = 2;\\n uint8 constant PREFIX_LEAF_ODD = 3;\\n\\n // Just a utility constant. RLP represents `NULL` as 0x80.\\n bytes1 constant RLP_NULL = bytes1(0x80);\\n bytes constant RLP_NULL_BYTES = hex'80';\\n bytes32 constant internal KECCAK256_RLP_NULL_BYTES = keccak256(RLP_NULL_BYTES);\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * @notice Verifies a proof that a given key/value pair is present in the\\n * Merkle trie.\\n * @param _key Key of the node to search for, as a hex string.\\n * @param _value Value of the node to search for, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the desired node. Unlike\\n * traditional Merkle trees, this proof is executed top-down and consists\\n * of a list of RLP-encoded nodes that make a path down to the target node.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _verified `true` if the k/v pair exists in the trie, `false` otherwise.\\n */\\n function verifyInclusionProof(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bool _verified\\n )\\n {\\n (\\n bool exists,\\n bytes memory value\\n ) = get(_key, _proof, _root);\\n\\n return (\\n exists && Lib_BytesUtils.equal(_value, value)\\n );\\n }\\n\\n /**\\n * @notice Verifies a proof that a given key is *not* present in\\n * the Merkle trie.\\n * @param _key Key of the node to search for, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\\n * target node.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _verified `true` if the key is absent in the trie, `false` otherwise.\\n */\\n function verifyExclusionProof(\\n bytes memory _key,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bool _verified\\n )\\n {\\n (\\n bool exists,\\n ) = get(_key, _proof, _root);\\n\\n return exists == false;\\n }\\n\\n /**\\n * @notice Updates a Merkle trie and returns a new root hash.\\n * @param _key Key of the node to update, as a hex string.\\n * @param _value Value of the node to update, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\\n * target node. If the key exists, we can simply update the value.\\n * Otherwise, we need to modify the trie to handle the new k/v pair.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _updatedRoot Root hash of the newly constructed trie.\\n */\\n function update(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bytes32 _updatedRoot\\n )\\n {\\n // Special case when inserting the very first node.\\n if (_root == KECCAK256_RLP_NULL_BYTES) {\\n return getSingleNodeRootHash(_key, _value);\\n }\\n\\n TrieNode[] memory proof = _parseProof(_proof);\\n (uint256 pathLength, bytes memory keyRemainder, ) = _walkNodePath(proof, _key, _root);\\n TrieNode[] memory newPath = _getNewPath(proof, pathLength, keyRemainder, _value);\\n\\n return _getUpdatedTrieRoot(newPath, _key);\\n }\\n\\n /**\\n * @notice Retrieves the value associated with a given key.\\n * @param _key Key to search for, as hex bytes.\\n * @param _proof Merkle trie inclusion proof for the key.\\n * @param _root Known root of the Merkle trie.\\n * @return _exists Whether or not the key exists.\\n * @return _value Value of the key if it exists.\\n */\\n function get(\\n bytes memory _key,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bool _exists,\\n bytes memory _value\\n )\\n {\\n TrieNode[] memory proof = _parseProof(_proof);\\n (uint256 pathLength, bytes memory keyRemainder, bool isFinalNode) = _walkNodePath(proof, _key, _root);\\n\\n bool exists = keyRemainder.length == 0;\\n\\n require(\\n exists || isFinalNode,\\n \\\"Provided proof is invalid.\\\"\\n );\\n\\n bytes memory value = exists ? _getNodeValue(proof[pathLength - 1]) : bytes('');\\n\\n return (\\n exists,\\n value\\n );\\n }\\n\\n /**\\n * Computes the root hash for a trie with a single node.\\n * @param _key Key for the single node.\\n * @param _value Value for the single node.\\n * @return _updatedRoot Hash of the trie.\\n */\\n function getSingleNodeRootHash(\\n bytes memory _key,\\n bytes memory _value\\n )\\n internal\\n pure\\n returns (\\n bytes32 _updatedRoot\\n )\\n {\\n return keccak256(_makeLeafNode(\\n Lib_BytesUtils.toNibbles(_key),\\n _value\\n ).encoded);\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * @notice Walks through a proof using a provided key.\\n * @param _proof Inclusion proof to walk through.\\n * @param _key Key to use for the walk.\\n * @param _root Known root of the trie.\\n * @return _pathLength Length of the final path\\n * @return _keyRemainder Portion of the key remaining after the walk.\\n * @return _isFinalNode Whether or not we've hit a dead end.\\n */\\n function _walkNodePath(\\n TrieNode[] memory _proof,\\n bytes memory _key,\\n bytes32 _root\\n )\\n private\\n pure\\n returns (\\n uint256 _pathLength,\\n bytes memory _keyRemainder,\\n bool _isFinalNode\\n )\\n {\\n uint256 pathLength = 0;\\n bytes memory key = Lib_BytesUtils.toNibbles(_key);\\n\\n bytes32 currentNodeID = _root;\\n uint256 currentKeyIndex = 0;\\n uint256 currentKeyIncrement = 0;\\n TrieNode memory currentNode;\\n\\n // Proof is top-down, so we start at the first element (root).\\n for (uint256 i = 0; i < _proof.length; i++) {\\n currentNode = _proof[i];\\n currentKeyIndex += currentKeyIncrement;\\n\\n // Keep track of the proof elements we actually need.\\n // It's expensive to resize arrays, so this simply reduces gas costs.\\n pathLength += 1;\\n\\n if (currentKeyIndex == 0) {\\n // First proof element is always the root node.\\n require(\\n keccak256(currentNode.encoded) == currentNodeID,\\n \\\"Invalid root hash\\\"\\n );\\n } else if (currentNode.encoded.length >= 32) {\\n // Nodes 32 bytes or larger are hashed inside branch nodes.\\n require(\\n keccak256(currentNode.encoded) == currentNodeID,\\n \\\"Invalid large internal hash\\\"\\n );\\n } else {\\n // Nodes smaller than 31 bytes aren't hashed.\\n require(\\n Lib_BytesUtils.toBytes32(currentNode.encoded) == currentNodeID,\\n \\\"Invalid internal node hash\\\"\\n );\\n }\\n\\n if (currentNode.decoded.length == BRANCH_NODE_LENGTH) {\\n if (currentKeyIndex == key.length) {\\n // We've hit the end of the key, meaning the value should be within this branch node.\\n break;\\n } else {\\n // We're not at the end of the key yet.\\n // Figure out what the next node ID should be and continue.\\n uint8 branchKey = uint8(key[currentKeyIndex]);\\n Lib_RLPReader.RLPItem memory nextNode = currentNode.decoded[branchKey];\\n currentNodeID = _getNodeID(nextNode);\\n currentKeyIncrement = 1;\\n continue;\\n }\\n } else if (currentNode.decoded.length == LEAF_OR_EXTENSION_NODE_LENGTH) {\\n bytes memory path = _getNodePath(currentNode);\\n uint8 prefix = uint8(path[0]);\\n uint8 offset = 2 - prefix % 2;\\n bytes memory pathRemainder = Lib_BytesUtils.slice(path, offset);\\n bytes memory keyRemainder = Lib_BytesUtils.slice(key, currentKeyIndex);\\n uint256 sharedNibbleLength = _getSharedNibbleLength(pathRemainder, keyRemainder);\\n\\n if (prefix == PREFIX_LEAF_EVEN || prefix == PREFIX_LEAF_ODD) {\\n if (\\n pathRemainder.length == sharedNibbleLength &&\\n keyRemainder.length == sharedNibbleLength\\n ) {\\n // The key within this leaf matches our key exactly.\\n // Increment the key index to reflect that we have no remainder.\\n currentKeyIndex += sharedNibbleLength;\\n }\\n\\n // We've hit a leaf node, so our next node should be NULL.\\n currentNodeID = bytes32(RLP_NULL);\\n break;\\n } else if (prefix == PREFIX_EXTENSION_EVEN || prefix == PREFIX_EXTENSION_ODD) {\\n if (sharedNibbleLength == 0) {\\n // Our extension node doesn't share any part of our key.\\n // We've hit the end of this path, updates will need to modify this extension.\\n currentNodeID = bytes32(RLP_NULL);\\n break;\\n } else {\\n // Our extension shares some nibbles.\\n // Carry on to the next node.\\n currentNodeID = _getNodeID(currentNode.decoded[1]);\\n currentKeyIncrement = sharedNibbleLength;\\n continue;\\n }\\n } else {\\n revert(\\\"Received a node with an unknown prefix\\\");\\n }\\n } else {\\n revert(\\\"Received an unparseable node.\\\");\\n }\\n }\\n\\n // If our node ID is NULL, then we're at a dead end.\\n bool isFinalNode = currentNodeID == bytes32(RLP_NULL);\\n return (pathLength, Lib_BytesUtils.slice(key, currentKeyIndex), isFinalNode);\\n }\\n\\n /**\\n * @notice Creates new nodes to support a k/v pair insertion into a given\\n * Merkle trie path.\\n * @param _path Path to the node nearest the k/v pair.\\n * @param _pathLength Length of the path. Necessary because the provided\\n * path may include additional nodes (e.g., it comes directly from a proof)\\n * and we can't resize in-memory arrays without costly duplication.\\n * @param _keyRemainder Portion of the initial key that must be inserted\\n * into the trie.\\n * @param _value Value to insert at the given key.\\n * @return _newPath A new path with the inserted k/v pair and extra supporting nodes.\\n */\\n function _getNewPath(\\n TrieNode[] memory _path,\\n uint256 _pathLength,\\n bytes memory _keyRemainder,\\n bytes memory _value\\n )\\n private\\n pure\\n returns (\\n TrieNode[] memory _newPath\\n )\\n {\\n bytes memory keyRemainder = _keyRemainder;\\n\\n // Most of our logic depends on the status of the last node in the path.\\n TrieNode memory lastNode = _path[_pathLength - 1];\\n NodeType lastNodeType = _getNodeType(lastNode);\\n\\n // Create an array for newly created nodes.\\n // We need up to three new nodes, depending on the contents of the last node.\\n // Since array resizing is expensive, we'll keep track of the size manually.\\n // We're using an explicit `totalNewNodes += 1` after insertions for clarity.\\n TrieNode[] memory newNodes = new TrieNode[](3);\\n uint256 totalNewNodes = 0;\\n\\n if (keyRemainder.length == 0 && lastNodeType == NodeType.LeafNode) {\\n // We've found a leaf node with the given key.\\n // Simply need to update the value of the node to match.\\n newNodes[totalNewNodes] = _makeLeafNode(_getNodeKey(lastNode), _value);\\n totalNewNodes += 1;\\n } else if (lastNodeType == NodeType.BranchNode) {\\n if (keyRemainder.length == 0) {\\n // We've found a branch node with the given key.\\n // Simply need to update the value of the node to match.\\n newNodes[totalNewNodes] = _editBranchValue(lastNode, _value);\\n totalNewNodes += 1;\\n } else {\\n // We've found a branch node, but it doesn't contain our key.\\n // Reinsert the old branch for now.\\n newNodes[totalNewNodes] = lastNode;\\n totalNewNodes += 1;\\n // Create a new leaf node, slicing our remainder since the first byte points\\n // to our branch node.\\n newNodes[totalNewNodes] = _makeLeafNode(Lib_BytesUtils.slice(keyRemainder, 1), _value);\\n totalNewNodes += 1;\\n }\\n } else {\\n // Our last node is either an extension node or a leaf node with a different key.\\n bytes memory lastNodeKey = _getNodeKey(lastNode);\\n uint256 sharedNibbleLength = _getSharedNibbleLength(lastNodeKey, keyRemainder);\\n\\n if (sharedNibbleLength != 0) {\\n // We've got some shared nibbles between the last node and our key remainder.\\n // We'll need to insert an extension node that covers these shared nibbles.\\n bytes memory nextNodeKey = Lib_BytesUtils.slice(lastNodeKey, 0, sharedNibbleLength);\\n newNodes[totalNewNodes] = _makeExtensionNode(nextNodeKey, _getNodeHash(_value));\\n totalNewNodes += 1;\\n\\n // Cut down the keys since we've just covered these shared nibbles.\\n lastNodeKey = Lib_BytesUtils.slice(lastNodeKey, sharedNibbleLength);\\n keyRemainder = Lib_BytesUtils.slice(keyRemainder, sharedNibbleLength);\\n }\\n\\n // Create an empty branch to fill in.\\n TrieNode memory newBranch = _makeEmptyBranchNode();\\n\\n if (lastNodeKey.length == 0) {\\n // Key remainder was larger than the key for our last node.\\n // The value within our last node is therefore going to be shifted into\\n // a branch value slot.\\n newBranch = _editBranchValue(newBranch, _getNodeValue(lastNode));\\n } else {\\n // Last node key was larger than the key remainder.\\n // We're going to modify some index of our branch.\\n uint8 branchKey = uint8(lastNodeKey[0]);\\n // Move on to the next nibble.\\n lastNodeKey = Lib_BytesUtils.slice(lastNodeKey, 1);\\n\\n if (lastNodeType == NodeType.LeafNode) {\\n // We're dealing with a leaf node.\\n // We'll modify the key and insert the old leaf node into the branch index.\\n TrieNode memory modifiedLastNode = _makeLeafNode(lastNodeKey, _getNodeValue(lastNode));\\n newBranch = _editBranchIndex(newBranch, branchKey, _getNodeHash(modifiedLastNode.encoded));\\n } else if (lastNodeKey.length != 0) {\\n // We're dealing with a shrinking extension node.\\n // We need to modify the node to decrease the size of the key.\\n TrieNode memory modifiedLastNode = _makeExtensionNode(lastNodeKey, _getNodeValue(lastNode));\\n newBranch = _editBranchIndex(newBranch, branchKey, _getNodeHash(modifiedLastNode.encoded));\\n } else {\\n // We're dealing with an unnecessary extension node.\\n // We're going to delete the node entirely.\\n // Simply insert its current value into the branch index.\\n newBranch = _editBranchIndex(newBranch, branchKey, _getNodeValue(lastNode));\\n }\\n }\\n\\n if (keyRemainder.length == 0) {\\n // We've got nothing left in the key remainder.\\n // Simply insert the value into the branch value slot.\\n newBranch = _editBranchValue(newBranch, _value);\\n // Push the branch into the list of new nodes.\\n newNodes[totalNewNodes] = newBranch;\\n totalNewNodes += 1;\\n } else {\\n // We've got some key remainder to work with.\\n // We'll be inserting a leaf node into the trie.\\n // First, move on to the next nibble.\\n keyRemainder = Lib_BytesUtils.slice(keyRemainder, 1);\\n // Push the branch into the list of new nodes.\\n newNodes[totalNewNodes] = newBranch;\\n totalNewNodes += 1;\\n // Push a new leaf node for our k/v pair.\\n newNodes[totalNewNodes] = _makeLeafNode(keyRemainder, _value);\\n totalNewNodes += 1;\\n }\\n }\\n\\n // Finally, join the old path with our newly created nodes.\\n // Since we're overwriting the last node in the path, we use `_pathLength - 1`.\\n return _joinNodeArrays(_path, _pathLength - 1, newNodes, totalNewNodes);\\n }\\n\\n /**\\n * @notice Computes the trie root from a given path.\\n * @param _nodes Path to some k/v pair.\\n * @param _key Key for the k/v pair.\\n * @return _updatedRoot Root hash for the updated trie.\\n */\\n function _getUpdatedTrieRoot(\\n TrieNode[] memory _nodes,\\n bytes memory _key\\n )\\n private\\n pure\\n returns (\\n bytes32 _updatedRoot\\n )\\n {\\n bytes memory key = Lib_BytesUtils.toNibbles(_key);\\n\\n // Some variables to keep track of during iteration.\\n TrieNode memory currentNode;\\n NodeType currentNodeType;\\n bytes memory previousNodeHash;\\n\\n // Run through the path backwards to rebuild our root hash.\\n for (uint256 i = _nodes.length; i > 0; i--) {\\n // Pick out the current node.\\n currentNode = _nodes[i - 1];\\n currentNodeType = _getNodeType(currentNode);\\n\\n if (currentNodeType == NodeType.LeafNode) {\\n // Leaf nodes are already correctly encoded.\\n // Shift the key over to account for the nodes key.\\n bytes memory nodeKey = _getNodeKey(currentNode);\\n key = Lib_BytesUtils.slice(key, 0, key.length - nodeKey.length);\\n } else if (currentNodeType == NodeType.ExtensionNode) {\\n // Shift the key over to account for the nodes key.\\n bytes memory nodeKey = _getNodeKey(currentNode);\\n key = Lib_BytesUtils.slice(key, 0, key.length - nodeKey.length);\\n\\n // If this node is the last element in the path, it'll be correctly encoded\\n // and we can skip this part.\\n if (previousNodeHash.length > 0) {\\n // Re-encode the node based on the previous node.\\n currentNode = _makeExtensionNode(nodeKey, previousNodeHash);\\n }\\n } else if (currentNodeType == NodeType.BranchNode) {\\n // If this node is the last element in the path, it'll be correctly encoded\\n // and we can skip this part.\\n if (previousNodeHash.length > 0) {\\n // Re-encode the node based on the previous node.\\n uint8 branchKey = uint8(key[key.length - 1]);\\n key = Lib_BytesUtils.slice(key, 0, key.length - 1);\\n currentNode = _editBranchIndex(currentNode, branchKey, previousNodeHash);\\n }\\n }\\n\\n // Compute the node hash for the next iteration.\\n previousNodeHash = _getNodeHash(currentNode.encoded);\\n }\\n\\n // Current node should be the root at this point.\\n // Simply return the hash of its encoding.\\n return keccak256(currentNode.encoded);\\n }\\n\\n /**\\n * @notice Parses an RLP-encoded proof into something more useful.\\n * @param _proof RLP-encoded proof to parse.\\n * @return _parsed Proof parsed into easily accessible structs.\\n */\\n function _parseProof(\\n bytes memory _proof\\n )\\n private\\n pure\\n returns (\\n TrieNode[] memory _parsed\\n )\\n {\\n Lib_RLPReader.RLPItem[] memory nodes = Lib_RLPReader.readList(_proof);\\n TrieNode[] memory proof = new TrieNode[](nodes.length);\\n\\n for (uint256 i = 0; i < nodes.length; i++) {\\n bytes memory encoded = Lib_RLPReader.readBytes(nodes[i]);\\n proof[i] = TrieNode({\\n encoded: encoded,\\n decoded: Lib_RLPReader.readList(encoded)\\n });\\n }\\n\\n return proof;\\n }\\n\\n /**\\n * @notice Picks out the ID for a node. Node ID is referred to as the\\n * \\\"hash\\\" within the specification, but nodes < 32 bytes are not actually\\n * hashed.\\n * @param _node Node to pull an ID for.\\n * @return _nodeID ID for the node, depending on the size of its contents.\\n */\\n function _getNodeID(\\n Lib_RLPReader.RLPItem memory _node\\n )\\n private\\n pure\\n returns (\\n bytes32 _nodeID\\n )\\n {\\n bytes memory nodeID;\\n\\n if (_node.length < 32) {\\n // Nodes smaller than 32 bytes are RLP encoded.\\n nodeID = Lib_RLPReader.readRawBytes(_node);\\n } else {\\n // Nodes 32 bytes or larger are hashed.\\n nodeID = Lib_RLPReader.readBytes(_node);\\n }\\n\\n return Lib_BytesUtils.toBytes32(nodeID);\\n }\\n\\n /**\\n * @notice Gets the path for a leaf or extension node.\\n * @param _node Node to get a path for.\\n * @return _path Node path, converted to an array of nibbles.\\n */\\n function _getNodePath(\\n TrieNode memory _node\\n )\\n private\\n pure\\n returns (\\n bytes memory _path\\n )\\n {\\n return Lib_BytesUtils.toNibbles(Lib_RLPReader.readBytes(_node.decoded[0]));\\n }\\n\\n /**\\n * @notice Gets the key for a leaf or extension node. Keys are essentially\\n * just paths without any prefix.\\n * @param _node Node to get a key for.\\n * @return _key Node key, converted to an array of nibbles.\\n */\\n function _getNodeKey(\\n TrieNode memory _node\\n )\\n private\\n pure\\n returns (\\n bytes memory _key\\n )\\n {\\n return _removeHexPrefix(_getNodePath(_node));\\n }\\n\\n /**\\n * @notice Gets the path for a node.\\n * @param _node Node to get a value for.\\n * @return _value Node value, as hex bytes.\\n */\\n function _getNodeValue(\\n TrieNode memory _node\\n )\\n private\\n pure\\n returns (\\n bytes memory _value\\n )\\n {\\n return Lib_RLPReader.readBytes(_node.decoded[_node.decoded.length - 1]);\\n }\\n\\n /**\\n * @notice Computes the node hash for an encoded node. Nodes < 32 bytes\\n * are not hashed, all others are keccak256 hashed.\\n * @param _encoded Encoded node to hash.\\n * @return _hash Hash of the encoded node. Simply the input if < 32 bytes.\\n */\\n function _getNodeHash(\\n bytes memory _encoded\\n )\\n private\\n pure\\n returns (\\n bytes memory _hash\\n )\\n {\\n if (_encoded.length < 32) {\\n return _encoded;\\n } else {\\n return abi.encodePacked(keccak256(_encoded));\\n }\\n }\\n\\n /**\\n * @notice Determines the type for a given node.\\n * @param _node Node to determine a type for.\\n * @return _type Type of the node; BranchNode/ExtensionNode/LeafNode.\\n */\\n function _getNodeType(\\n TrieNode memory _node\\n )\\n private\\n pure\\n returns (\\n NodeType _type\\n )\\n {\\n if (_node.decoded.length == BRANCH_NODE_LENGTH) {\\n return NodeType.BranchNode;\\n } else if (_node.decoded.length == LEAF_OR_EXTENSION_NODE_LENGTH) {\\n bytes memory path = _getNodePath(_node);\\n uint8 prefix = uint8(path[0]);\\n\\n if (prefix == PREFIX_LEAF_EVEN || prefix == PREFIX_LEAF_ODD) {\\n return NodeType.LeafNode;\\n } else if (prefix == PREFIX_EXTENSION_EVEN || prefix == PREFIX_EXTENSION_ODD) {\\n return NodeType.ExtensionNode;\\n }\\n }\\n\\n revert(\\\"Invalid node type\\\");\\n }\\n\\n /**\\n * @notice Utility; determines the number of nibbles shared between two\\n * nibble arrays.\\n * @param _a First nibble array.\\n * @param _b Second nibble array.\\n * @return _shared Number of shared nibbles.\\n */\\n function _getSharedNibbleLength(\\n bytes memory _a,\\n bytes memory _b\\n )\\n private\\n pure\\n returns (\\n uint256 _shared\\n )\\n {\\n uint256 i = 0;\\n while (_a.length > i && _b.length > i && _a[i] == _b[i]) {\\n i++;\\n }\\n return i;\\n }\\n\\n /**\\n * @notice Utility; converts an RLP-encoded node into our nice struct.\\n * @param _raw RLP-encoded node to convert.\\n * @return _node Node as a TrieNode struct.\\n */\\n function _makeNode(\\n bytes[] memory _raw\\n )\\n private\\n pure\\n returns (\\n TrieNode memory _node\\n )\\n {\\n bytes memory encoded = Lib_RLPWriter.writeList(_raw);\\n\\n return TrieNode({\\n encoded: encoded,\\n decoded: Lib_RLPReader.readList(encoded)\\n });\\n }\\n\\n /**\\n * @notice Utility; converts an RLP-decoded node into our nice struct.\\n * @param _items RLP-decoded node to convert.\\n * @return _node Node as a TrieNode struct.\\n */\\n function _makeNode(\\n Lib_RLPReader.RLPItem[] memory _items\\n )\\n private\\n pure\\n returns (\\n TrieNode memory _node\\n )\\n {\\n bytes[] memory raw = new bytes[](_items.length);\\n for (uint256 i = 0; i < _items.length; i++) {\\n raw[i] = Lib_RLPReader.readRawBytes(_items[i]);\\n }\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Creates a new extension node.\\n * @param _key Key for the extension node, unprefixed.\\n * @param _value Value for the extension node.\\n * @return _node New extension node with the given k/v pair.\\n */\\n function _makeExtensionNode(\\n bytes memory _key,\\n bytes memory _value\\n )\\n private\\n pure\\n returns (\\n TrieNode memory _node\\n )\\n {\\n bytes[] memory raw = new bytes[](2);\\n bytes memory key = _addHexPrefix(_key, false);\\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\\n raw[1] = Lib_RLPWriter.writeBytes(_value);\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Creates a new leaf node.\\n * @dev This function is essentially identical to `_makeExtensionNode`.\\n * Although we could route both to a single method with a flag, it's\\n * more gas efficient to keep them separate and duplicate the logic.\\n * @param _key Key for the leaf node, unprefixed.\\n * @param _value Value for the leaf node.\\n * @return _node New leaf node with the given k/v pair.\\n */\\n function _makeLeafNode(\\n bytes memory _key,\\n bytes memory _value\\n )\\n private\\n pure\\n returns (\\n TrieNode memory _node\\n )\\n {\\n bytes[] memory raw = new bytes[](2);\\n bytes memory key = _addHexPrefix(_key, true);\\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\\n raw[1] = Lib_RLPWriter.writeBytes(_value);\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Creates an empty branch node.\\n * @return _node Empty branch node as a TrieNode struct.\\n */\\n function _makeEmptyBranchNode()\\n private\\n pure\\n returns (\\n TrieNode memory _node\\n )\\n {\\n bytes[] memory raw = new bytes[](BRANCH_NODE_LENGTH);\\n for (uint256 i = 0; i < raw.length; i++) {\\n raw[i] = RLP_NULL_BYTES;\\n }\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Modifies the value slot for a given branch.\\n * @param _branch Branch node to modify.\\n * @param _value Value to insert into the branch.\\n * @return _updatedNode Modified branch node.\\n */\\n function _editBranchValue(\\n TrieNode memory _branch,\\n bytes memory _value\\n )\\n private\\n pure\\n returns (\\n TrieNode memory _updatedNode\\n )\\n {\\n bytes memory encoded = Lib_RLPWriter.writeBytes(_value);\\n _branch.decoded[_branch.decoded.length - 1] = Lib_RLPReader.toRLPItem(encoded);\\n return _makeNode(_branch.decoded);\\n }\\n\\n /**\\n * @notice Modifies a slot at an index for a given branch.\\n * @param _branch Branch node to modify.\\n * @param _index Slot index to modify.\\n * @param _value Value to insert into the slot.\\n * @return _updatedNode Modified branch node.\\n */\\n function _editBranchIndex(\\n TrieNode memory _branch,\\n uint8 _index,\\n bytes memory _value\\n )\\n private\\n pure\\n returns (\\n TrieNode memory _updatedNode\\n )\\n {\\n bytes memory encoded = _value.length < 32 ? _value : Lib_RLPWriter.writeBytes(_value);\\n _branch.decoded[_index] = Lib_RLPReader.toRLPItem(encoded);\\n return _makeNode(_branch.decoded);\\n }\\n\\n /**\\n * @notice Utility; adds a prefix to a key.\\n * @param _key Key to prefix.\\n * @param _isLeaf Whether or not the key belongs to a leaf.\\n * @return _prefixedKey Prefixed key.\\n */\\n function _addHexPrefix(\\n bytes memory _key,\\n bool _isLeaf\\n )\\n private\\n pure\\n returns (\\n bytes memory _prefixedKey\\n )\\n {\\n uint8 prefix = _isLeaf ? uint8(0x02) : uint8(0x00);\\n uint8 offset = uint8(_key.length % 2);\\n bytes memory prefixed = new bytes(2 - offset);\\n prefixed[0] = bytes1(prefix + offset);\\n return Lib_BytesUtils.concat(prefixed, _key);\\n }\\n\\n /**\\n * @notice Utility; removes a prefix from a path.\\n * @param _path Path to remove the prefix from.\\n * @return _unprefixedKey Unprefixed key.\\n */\\n function _removeHexPrefix(\\n bytes memory _path\\n )\\n private\\n pure\\n returns (\\n bytes memory _unprefixedKey\\n )\\n {\\n if (uint8(_path[0]) % 2 == 0) {\\n return Lib_BytesUtils.slice(_path, 2);\\n } else {\\n return Lib_BytesUtils.slice(_path, 1);\\n }\\n }\\n\\n /**\\n * @notice Utility; combines two node arrays. Array lengths are required\\n * because the actual lengths may be longer than the filled lengths.\\n * Array resizing is extremely costly and should be avoided.\\n * @param _a First array to join.\\n * @param _aLength Length of the first array.\\n * @param _b Second array to join.\\n * @param _bLength Length of the second array.\\n * @return _joined Combined node array.\\n */\\n function _joinNodeArrays(\\n TrieNode[] memory _a,\\n uint256 _aLength,\\n TrieNode[] memory _b,\\n uint256 _bLength\\n )\\n private\\n pure\\n returns (\\n TrieNode[] memory _joined\\n )\\n {\\n TrieNode[] memory ret = new TrieNode[](_aLength + _bLength);\\n\\n // Copy elements from the first array.\\n for (uint256 i = 0; i < _aLength; i++) {\\n ret[i] = _a[i];\\n }\\n\\n // Copy elements from the second array.\\n for (uint256 i = 0; i < _bLength; i++) {\\n ret[i + _aLength] = _b[i];\\n }\\n\\n return ret;\\n }\\n}\\n\",\"keccak256\":\"0xe84d904dcf0c03d5ebd0792c3aee70bf32e94513f3d3ac3636b53937116efd49\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/trie/Lib_SecureMerkleTrie.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_MerkleTrie } from \\\"./Lib_MerkleTrie.sol\\\";\\n\\n/**\\n * @title Lib_SecureMerkleTrie\\n */\\nlibrary Lib_SecureMerkleTrie {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * @notice Verifies a proof that a given key/value pair is present in the\\n * Merkle trie.\\n * @param _key Key of the node to search for, as a hex string.\\n * @param _value Value of the node to search for, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the desired node. Unlike\\n * traditional Merkle trees, this proof is executed top-down and consists\\n * of a list of RLP-encoded nodes that make a path down to the target node.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _verified `true` if the k/v pair exists in the trie, `false` otherwise.\\n */\\n function verifyInclusionProof(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bool _verified\\n )\\n {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.verifyInclusionProof(key, _value, _proof, _root);\\n }\\n\\n /**\\n * @notice Verifies a proof that a given key is *not* present in\\n * the Merkle trie.\\n * @param _key Key of the node to search for, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\\n * target node.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _verified `true` if the key is not present in the trie, `false` otherwise.\\n */\\n function verifyExclusionProof(\\n bytes memory _key,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bool _verified\\n )\\n {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.verifyExclusionProof(key, _proof, _root);\\n }\\n\\n /**\\n * @notice Updates a Merkle trie and returns a new root hash.\\n * @param _key Key of the node to update, as a hex string.\\n * @param _value Value of the node to update, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\\n * target node. If the key exists, we can simply update the value.\\n * Otherwise, we need to modify the trie to handle the new k/v pair.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _updatedRoot Root hash of the newly constructed trie.\\n */\\n function update(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bytes32 _updatedRoot\\n )\\n {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.update(key, _value, _proof, _root);\\n }\\n\\n /**\\n * @notice Retrieves the value associated with a given key.\\n * @param _key Key to search for, as hex bytes.\\n * @param _proof Merkle trie inclusion proof for the key.\\n * @param _root Known root of the Merkle trie.\\n * @return _exists Whether or not the key exists.\\n * @return _value Value of the key if it exists.\\n */\\n function get(\\n bytes memory _key,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bool _exists,\\n bytes memory _value\\n )\\n {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.get(key, _proof, _root);\\n }\\n\\n /**\\n * Computes the root hash for a trie with a single node.\\n * @param _key Key for the single node.\\n * @param _value Value for the single node.\\n * @return _updatedRoot Hash of the trie.\\n */\\n function getSingleNodeRootHash(\\n bytes memory _key,\\n bytes memory _value\\n )\\n internal\\n pure\\n returns (\\n bytes32 _updatedRoot\\n )\\n {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.getSingleNodeRootHash(key, _value);\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Computes the secure counterpart to a key.\\n * @param _key Key to get a secure key from.\\n * @return _secureKey Secure version of the key.\\n */\\n function _getSecureKey(\\n bytes memory _key\\n )\\n private\\n pure\\n returns (\\n bytes memory _secureKey\\n )\\n {\\n return abi.encodePacked(keccak256(_key));\\n }\\n}\",\"keccak256\":\"0x79355346f74bb1eb9eeb733cb5d9677d50115c4f390307cbf608fe071a1ada0c\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_Bytes32Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.7.0;\\n\\n/**\\n * @title Lib_Byte32Utils\\n */\\nlibrary Lib_Bytes32Utils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function toBool(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bool _out\\n )\\n {\\n return _in != 0;\\n }\\n\\n function fromBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes32 _out\\n )\\n {\\n return bytes32(uint256(_in ? 1 : 0));\\n }\\n\\n function toAddress(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n address _out\\n )\\n {\\n return address(uint160(uint256(_in)));\\n }\\n\\n function fromAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes32 _out\\n )\\n {\\n return bytes32(uint256(_in));\\n }\\n\\n function removeLeadingZeros(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n bytes memory out;\\n\\n assembly {\\n // Figure out how many leading zero bytes to remove.\\n let shift := 0\\n for { let i := 0 } and(lt(i, 32), eq(byte(i, _in), 0)) { i := add(i, 1) } {\\n shift := add(shift, 1)\\n }\\n\\n // Reserve some space for our output and fix the free memory pointer.\\n out := mload(0x40)\\n mstore(0x40, add(out, 0x40))\\n\\n // Shift the value and store it into the output bytes.\\n mstore(add(out, 0x20), shl(mul(shift, 8), _in))\\n\\n // Store the new size (with leading zero bytes removed) in the output byte size.\\n mstore(out, sub(32, shift))\\n }\\n\\n return out;\\n }\\n}\\n\",\"keccak256\":\"0x06f97590a80a01daa3bf6aa795449aea91a78684c646b4a6caeece8ef919c80c\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_BytesUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.7.0;\\n\\n/**\\n * @title Lib_BytesUtils\\n */\\nlibrary Lib_BytesUtils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function concat(\\n bytes memory _preBytes,\\n bytes memory _postBytes\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n bytes memory tempBytes;\\n\\n assembly {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // Store the length of the first bytes array at the beginning of\\n // the memory for tempBytes.\\n let length := mload(_preBytes)\\n mstore(tempBytes, length)\\n\\n // Maintain a memory counter for the current write location in the\\n // temp bytes array by adding the 32 bytes for the array length to\\n // the starting location.\\n let mc := add(tempBytes, 0x20)\\n // Stop copying when the memory counter reaches the length of the\\n // first bytes array.\\n let end := add(mc, length)\\n\\n for {\\n // Initialize a copy counter to the start of the _preBytes data,\\n // 32 bytes into its memory.\\n let cc := add(_preBytes, 0x20)\\n } lt(mc, end) {\\n // Increase both counters by 32 bytes each iteration.\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n // Write the _preBytes data into the tempBytes memory 32 bytes\\n // at a time.\\n mstore(mc, mload(cc))\\n }\\n\\n // Add the length of _postBytes to the current length of tempBytes\\n // and store it as the new length in the first 32 bytes of the\\n // tempBytes memory.\\n length := mload(_postBytes)\\n mstore(tempBytes, add(length, mload(tempBytes)))\\n\\n // Move the memory counter back from a multiple of 0x20 to the\\n // actual end of the _preBytes data.\\n mc := end\\n // Stop copying when the memory counter reaches the new combined\\n // length of the arrays.\\n end := add(mc, length)\\n\\n for {\\n let cc := add(_postBytes, 0x20)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n // Update the free-memory pointer by padding our last write location\\n // to 32 bytes: add 31 bytes to the end of tempBytes to move to the\\n // next 32 byte block, then round down to the nearest multiple of\\n // 32. If the sum of the length of the two arrays is zero then add\\n // one before rounding down to leave a blank 32 bytes (the length block with 0).\\n mstore(0x40, and(\\n add(add(end, iszero(add(length, mload(_preBytes)))), 31),\\n not(31) // Round down to the nearest 32 bytes.\\n ))\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_start + _length >= _start, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n if (_bytes.length - _start == 0) {\\n return bytes('');\\n }\\n\\n return slice(_bytes, _start, _bytes.length - _start);\\n }\\n\\n function toBytes32PadLeft(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes32)\\n {\\n bytes32 ret;\\n uint256 len = _bytes.length <= 32 ? _bytes.length : 32;\\n assembly {\\n ret := shr(mul(sub(32, len), 8), mload(add(_bytes, 32)))\\n }\\n return ret;\\n }\\n\\n function toBytes32(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes32)\\n {\\n if (_bytes.length < 32) {\\n bytes32 ret;\\n assembly {\\n ret := mload(add(_bytes, 32))\\n }\\n return ret;\\n }\\n\\n return abi.decode(_bytes,(bytes32)); // will truncate if input length > 32 bytes\\n }\\n\\n function toUint256(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (uint256)\\n {\\n return uint256(toBytes32(_bytes));\\n }\\n\\n function toUint24(bytes memory _bytes, uint256 _start) internal pure returns (uint24) {\\n require(_start + 3 >= _start, \\\"toUint24_overflow\\\");\\n require(_bytes.length >= _start + 3 , \\\"toUint24_outOfBounds\\\");\\n uint24 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x3), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toUint8(bytes memory _bytes, uint256 _start) internal pure returns (uint8) {\\n require(_start + 1 >= _start, \\\"toUint8_overflow\\\");\\n require(_bytes.length >= _start + 1 , \\\"toUint8_outOfBounds\\\");\\n uint8 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x1), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toAddress(bytes memory _bytes, uint256 _start) internal pure returns (address) {\\n require(_start + 20 >= _start, \\\"toAddress_overflow\\\");\\n require(_bytes.length >= _start + 20, \\\"toAddress_outOfBounds\\\");\\n address tempAddress;\\n\\n assembly {\\n tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000)\\n }\\n\\n return tempAddress;\\n }\\n\\n function toNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n bytes memory nibbles = new bytes(_bytes.length * 2);\\n\\n for (uint256 i = 0; i < _bytes.length; i++) {\\n nibbles[i * 2] = _bytes[i] >> 4;\\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\\n }\\n\\n return nibbles;\\n }\\n\\n function fromNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n bytes memory ret = new bytes(_bytes.length / 2);\\n\\n for (uint256 i = 0; i < ret.length; i++) {\\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\\n }\\n\\n return ret;\\n }\\n\\n function equal(\\n bytes memory _bytes,\\n bytes memory _other\\n )\\n internal\\n pure\\n returns (bool)\\n {\\n return keccak256(_bytes) == keccak256(_other);\\n }\\n}\\n\",\"keccak256\":\"0x849e4fedd81cd260e4c3b74b953f00636323574c60d363f36ab331e94aab9219\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_ReentrancyGuard.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// +build ovm\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @dev Contract module that helps prevent reentrant calls to a function.\\n *\\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\\n * available, which can be applied to functions to make sure there are no nested\\n * (reentrant) calls to them.\\n *\\n * Note that because there is a single `nonReentrant` guard, functions marked as\\n * `nonReentrant` may not call one another. This can be worked around by making\\n * those functions `private`, and then adding `external` `nonReentrant` entry\\n * points to them.\\n *\\n * TIP: If you would like to learn more about reentrancy and alternative ways\\n * to protect against it, check out our blog post\\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\\n */\\nabstract contract Lib_ReentrancyGuard {\\n // Booleans are more expensive than uint256 or any type that takes up a full\\n // word because each write operation emits an extra SLOAD to first read the\\n // slot's contents, replace the bits taken up by the boolean, and then write\\n // back. This is the compiler's defense against contract upgrades and\\n // pointer aliasing, and it cannot be disabled.\\n\\n // The values being non-zero value makes deployment a bit more expensive,\\n // but in exchange the refund on every call to nonReentrant will be lower in\\n // amount. Since refunds are capped to a percentage of the total\\n // transaction's gas, it is best to keep them low in cases like this one, to\\n // increase the likelihood of the full refund coming into effect.\\n uint256 private constant _NOT_ENTERED = 1;\\n uint256 private constant _ENTERED = 2;\\n\\n uint256 private _status;\\n\\n constructor () internal {\\n _status = _NOT_ENTERED;\\n }\\n\\n /**\\n * @dev Prevents a contract from calling itself, directly or indirectly.\\n * Calling a `nonReentrant` function from another `nonReentrant`\\n * function is not supported. It is possible to prevent this from happening\\n * by making the `nonReentrant` function external, and make it call a\\n * `private` function that does the actual work.\\n */\\n modifier nonReentrant() {\\n // On the first call to nonReentrant, _notEntered will be true\\n require(_status != _ENTERED, \\\"ReentrancyGuard: reentrant call\\\");\\n\\n // Any calls to nonReentrant after this point will fail\\n _status = _ENTERED;\\n\\n _;\\n\\n // By storing the original value once again, a refund is triggered (see\\n // https://eips.ethereum.org/EIPS/eip-2200)\\n _status = _NOT_ENTERED;\\n }\\n}\\n\",\"keccak256\":\"0x8cb909f4039d8d9770578c6c469e8f3cfcbb6088c209ce663742c023920af9c1\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.7.0;\\n\\n/**\\n * @title Lib_SafeExecutionManagerWrapper\\n */\\nlibrary Lib_SafeExecutionManagerWrapper {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Makes an ovmCALL and performs all the necessary safety checks.\\n * @param _gasLimit Gas limit for the call.\\n * @param _target Address to call.\\n * @param _calldata Data to send to the call.\\n * @return _success Whether or not the call reverted.\\n * @return _returndata Data returned by the call.\\n */\\n function safeCALL(\\n uint256 _gasLimit,\\n address _target,\\n bytes memory _calldata\\n )\\n internal\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCALL(uint256,address,bytes)\\\",\\n _gasLimit,\\n _target,\\n _calldata\\n )\\n );\\n\\n return abi.decode(returndata, (bool, bytes));\\n }\\n\\n /**\\n * Makes an ovmCALL and performs all the necessary safety checks.\\n * @param _gasLimit Gas limit for the call.\\n * @param _target Address to call.\\n * @param _calldata Data to send to the call.\\n * @return _success Whether or not the call reverted.\\n * @return _returndata Data returned by the call.\\n */\\n function safeDELEGATECALL(\\n uint256 _gasLimit,\\n address _target,\\n bytes memory _calldata\\n )\\n internal\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmDELEGATECALL(uint256,address,bytes)\\\",\\n _gasLimit,\\n _target,\\n _calldata\\n )\\n );\\n\\n return abi.decode(returndata, (bool, bytes));\\n }\\n\\n /**\\n * Performs an ovmCREATE and the necessary safety checks.\\n * @param _gasLimit Gas limit for the creation.\\n * @param _bytecode Code for the new contract.\\n * @return _contract Address of the created contract.\\n */\\n function safeCREATE(\\n uint256 _gasLimit,\\n bytes memory _bytecode\\n )\\n internal\\n returns (\\n address _contract\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n _gasLimit,\\n abi.encodeWithSignature(\\n \\\"ovmCREATE(bytes)\\\",\\n _bytecode\\n )\\n );\\n\\n return abi.decode(returndata, (address));\\n }\\n\\n /**\\n * Performs an ovmEXTCODESIZE and the necessary safety checks.\\n * @param _contract Address of the contract to query the size of.\\n * @return _EXTCODESIZE Size of the requested contract in bytes.\\n */\\n function safeEXTCODESIZE(\\n address _contract\\n )\\n internal\\n returns (\\n uint256 _EXTCODESIZE\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmEXTCODESIZE(address)\\\",\\n _contract\\n )\\n );\\n\\n return abi.decode(returndata, (uint256));\\n }\\n\\n /**\\n * Performs a safe ovmCHAINID call.\\n * @return _CHAINID Result of calling ovmCHAINID.\\n */\\n function safeCHAINID()\\n internal\\n returns (\\n uint256 _CHAINID\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCHAINID()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (uint256));\\n }\\n\\n /**\\n * Performs a safe ovmCALLER call.\\n * @return _CALLER Result of calling ovmCALLER.\\n */\\n function safeCALLER()\\n internal\\n returns (\\n address _CALLER\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCALLER()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (address));\\n }\\n\\n /**\\n * Performs a safe ovmADDRESS call.\\n * @return _ADDRESS Result of calling ovmADDRESS.\\n */\\n function safeADDRESS()\\n internal\\n returns (\\n address _ADDRESS\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmADDRESS()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (address));\\n }\\n\\n /**\\n * Performs a safe ovmGETNONCE call.\\n * @return _nonce Result of calling ovmGETNONCE.\\n */\\n function safeGETNONCE()\\n internal\\n returns (\\n uint256 _nonce\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmGETNONCE()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (uint256));\\n }\\n\\n /**\\n * Performs a safe ovmSETNONCE call.\\n * @param _nonce New account nonce.\\n */\\n function safeSETNONCE(\\n uint256 _nonce\\n )\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmSETNONCE(uint256)\\\",\\n _nonce\\n )\\n );\\n }\\n\\n /**\\n * Performs a safe ovmCREATEEOA call.\\n * @param _messageHash Message hash which was signed by EOA\\n * @param _v v value of signature (0 or 1)\\n * @param _r r value of signature\\n * @param _s s value of signature\\n */\\n function safeCREATEEOA(\\n bytes32 _messageHash,\\n uint8 _v,\\n bytes32 _r,\\n bytes32 _s\\n )\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCREATEEOA(bytes32,uint8,bytes32,bytes32)\\\",\\n _messageHash,\\n _v,\\n _r,\\n _s\\n )\\n );\\n }\\n\\n /**\\n * Performs a safe REVERT.\\n * @param _reason String revert reason to pass along with the REVERT.\\n */\\n function safeREVERT(\\n string memory _reason\\n )\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmREVERT(bytes)\\\",\\n bytes(_reason)\\n )\\n );\\n }\\n\\n /**\\n * Performs a safe \\\"require\\\".\\n * @param _condition Boolean condition that must be true or will revert.\\n * @param _reason String revert reason to pass along with the REVERT.\\n */\\n function safeREQUIRE(\\n bool _condition,\\n string memory _reason\\n )\\n internal\\n {\\n if (!_condition) {\\n safeREVERT(\\n _reason\\n );\\n }\\n }\\n\\n /**\\n * Performs a safe ovmSLOAD call.\\n */\\n function safeSLOAD(\\n bytes32 _key\\n )\\n internal\\n returns (\\n bytes32\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmSLOAD(bytes32)\\\",\\n _key\\n )\\n );\\n\\n return abi.decode(returndata, (bytes32));\\n }\\n\\n /**\\n * Performs a safe ovmSSTORE call.\\n */\\n function safeSSTORE(\\n bytes32 _key,\\n bytes32 _value\\n )\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmSSTORE(bytes32,bytes32)\\\",\\n _key,\\n _value\\n )\\n );\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Performs an ovm interaction and the necessary safety checks.\\n * @param _gasLimit Gas limit for the interaction.\\n * @param _calldata Data to send to the OVM_ExecutionManager (encoded with sighash).\\n * @return _returndata Data sent back by the OVM_ExecutionManager.\\n */\\n function _safeExecutionManagerInteraction(\\n uint256 _gasLimit,\\n bytes memory _calldata\\n )\\n private\\n returns (\\n bytes memory _returndata\\n )\\n {\\n address ovmExecutionManager = msg.sender;\\n (\\n bool success,\\n bytes memory returndata\\n ) = ovmExecutionManager.call{gas: _gasLimit}(_calldata);\\n\\n if (success == false) {\\n assembly {\\n revert(add(returndata, 0x20), mload(returndata))\\n }\\n } else if (returndata.length == 1) {\\n assembly {\\n return(0, 1)\\n }\\n } else {\\n return returndata;\\n }\\n }\\n\\n function _safeExecutionManagerInteraction(\\n bytes memory _calldata\\n )\\n private\\n returns (\\n bytes memory _returndata\\n )\\n {\\n return _safeExecutionManagerInteraction(\\n gasleft(),\\n _calldata\\n );\\n }\\n}\\n\",\"keccak256\":\"0xdc30487ca1580f3498d4a1c4e26dc53158c00b44bd72da212a66267c22a139b0\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x608060405234801561001057600080fd5b506001600055600680546001600160a01b03191690556125c6806100356000396000f3fe608060405234801561001057600080fd5b506004361061009e5760003560e01c806382e3702d1161006657806382e3702d1461011c578063b1b1b2091461012f578063c4d66de814610142578063d7fd19dd14610155578063ecc70428146101685761009e565b806321d800ec146100a35780633dbb202b146100cc578063461a4478146100e15780636e296e4514610101578063706ceab614610109575b600080fd5b6100b66100b136600461203d565b61017d565b6040516100c39190612253565b60405180910390f35b6100df6100da366004611fc1565b610192565b005b6100f46100ef366004612055565b610221565b6040516100c391906121db565b6100f46102fd565b6100df610117366004611f4a565b61030c565b6100b661012a36600461203d565b61037c565b6100b661013d36600461203d565b610391565b6100df610150366004611e01565b6103a6565b6100df610163366004611e1b565b6103f1565b61017061065f565b6040516100c39190612124565b60016020526000908152604090205460ff1681565b60006101a2843385600454610665565b60048054600190810190915581516020808401919091206000908152600390915260409020805460ff1916909117905590506101e48163ffffffff84166106b2565b7f0ee9ffdb2334d78de97ffb066b23a352a4d35180cefb36589d663fbb1eb6f3268160405161021391906122d5565b60405180910390a150505050565b60065460405163bf40fac160e01b81526020600482018181528451602484015284516000946001600160a01b03169363bf40fac1938793928392604401918501908083838b5b8381101561027f578181015183820152602001610267565b50505050905090810190601f1680156102ac5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b1580156102c957600080fd5b505afa1580156102dd573d6000803e3d6000fd5b505050506040513d60208110156102f357600080fd5b505190505b919050565b6005546001600160a01b031681565b600061031a86868686610665565b805160208083019190912060009081526003909152604090205490915060ff1615156001146103645760405162461bcd60e51b815260040161035b90612333565b60405180910390fd5b610374818363ffffffff166106b2565b505050505050565b60036020526000908152604090205460ff1681565b60026020526000908152604090205460ff1681565b6006546001600160a01b0316156103cf5760405162461bcd60e51b815260040161035b9061241b565b600680546001600160a01b0319166001600160a01b0392909216919091179055565b60026000541415610449576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6002600090815560408051808201909152601481527327ab26afa61926b2b9b9b0b3b2a932b630bcb2b960611b602082015261048490610221565b90506001600160a01b038116156104bd57336001600160a01b038216146104bd5760405162461bcd60e51b815260040161035b9061237e565b60006104cb87878787610665565b90506104d7818461078a565b15156001146104f85760405162461bcd60e51b815260040161035b906123d4565b80516020808301919091206000818152600290925260409091205460ff16156105335760405162461bcd60e51b815260040161035b906122e8565b600580546001600160a01b0319166001600160a01b03898116919091179091556040516000918a169061056790899061213b565b6000604051808303816000865af19150503d80600081146105a4576040519150601f19603f3d011682016040523d82523d6000602084013e6105a9565b606091505b50909150506001811515141561060b5760008281526002602052604090819020805460ff19166001179055517f4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c90610602908490612124565b60405180910390a15b600083334360405160200161062293929190612189565b60408051601f1981840301815291815281516020928301206000908152600192839052908120805460ff1916831790555550505050505050505050565b60045481565b60608484848460405160240161067e94939291906121ef565b60408051601f198184030181529190526020810180516001600160e01b031663cbd4ece960e01b1790529050949350505050565b6106f06040518060400160405280601d81526020017f4f564d5f43616e6f6e6963616c5472616e73616374696f6e436861696e000000815250610221565b6001600160a01b0316636fee07e061073c6040518060400160405280601a81526020017f4f564d5f4c3243726f7373446f6d61696e4d657373656e676572000000000000815250610221565b83856040518463ffffffff1660e01b815260040161075c9392919061222c565b600060405180830381600087803b15801561077657600080fd5b505af1158015610374573d6000803e3d6000fd5b6000610795826107af565b80156107a657506107a6838361090c565b90505b92915050565b6000806107f06040518060400160405280601881526020017f4f564d5f5374617465436f6d6d69746d656e74436861696e0000000000000000815250610221565b6020840151604051639418bddd60e01b81529192506001600160a01b03831691639418bddd91610822916004016124d9565b60206040518083038186803b15801561083a57600080fd5b505afa15801561084e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610872919061201d565b1580156109055750825160208401516040808601519051634d69ee5760e01b81526001600160a01b03851693634d69ee57936108b593919290919060040161225e565b60206040518083038186803b1580156108cd57600080fd5b505afa1580156108e1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610905919061201d565b9392505050565b6000808361094e6040518060400160405280601a81526020017f4f564d5f4c3243726f7373446f6d61696e4d657373656e676572000000000000815250610221565b60405160200161095f929190612157565b60405160208183030381529060405280519060200120600060405160200161098892919061212d565b6040516020818303038152906040528051906020012090506000806109d7602160991b6040516020016109bb919061210c565b60408051601f1981840301815291905260608701518751610a69565b90925090506001821515146109fe5760405162461bcd60e51b815260040161035b90612465565b6000610a0982610a92565b9050610a5e84604051602001610a1f9190612124565b6040516020818303038152906040526001604051602001610a4091906121c3565b60405160208183030381529060405288608001518460400151610b24565b979650505050505050565b600060606000610a7886610b48565b9050610a85818686610b78565b9250925050935093915050565b610a9a611bb7565b6000610aa583610c4b565b90506040518060800160405280610acf83600081518110610ac257fe5b6020026020010151610c5e565b8152602001610ae483600181518110610ac257fe5b8152602001610b0683600281518110610af957fe5b6020026020010151610c65565b8152602001610b1b83600381518110610af957fe5b90529392505050565b600080610b3086610b48565b9050610b3e81868686610d5e565b9695505050505050565b60608180519060200120604051602001610b629190612124565b6040516020818303038152906040529050919050565b600060606000610b8785610d84565b90506000806000610b99848a89610e5b565b81519295509093509150158080610bad5750815b610bfe576040805162461bcd60e51b815260206004820152601a60248201527f50726f76696465642070726f6f6620697320696e76616c69642e000000000000604482015290519081900360640190fd5b600081610c1a5760405180602001604052806000815250610c39565b610c39866001870381518110610c2c57fe5b60200260200101516111fe565b919b919a509098505050505050505050565b60606107a9610c598361121a565b61123f565b60006107a9825b6000602182600001511115610cc1576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e000000000000604482015290519081900360640190fd5b6000806000610ccf856113b5565b919450925090506000816001811115610ce457fe5b14610d36576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e000000000000604482015290519081900360640190fd5b602080860151840180519091841015610b3e5760208490036101000a90049695505050505050565b6000806000610d6e878686610b78565b91509150818015610a5e5750610a5e86826116de565b60606000610d9183610c4b565b90506000815167ffffffffffffffff81118015610dad57600080fd5b50604051908082528060200260200182016040528015610de757816020015b610dd4611bde565b815260200190600190039081610dcc5790505b50905060005b8251811015610e53576000610e14848381518110610e0757fe5b60200260200101516116f4565b90506040518060400160405280828152602001610e3083610c4b565b815250838381518110610e3f57fe5b602090810291909101015250600101610ded565b509392505050565b60006060818080610e6b87611783565b905085600080610e79611bde565b60005b8c518110156111d6578c8181518110610e9157fe5b6020026020010151915082840193506001870196508360001415610f0557815180516020909101208514610f00576040805162461bcd60e51b8152602060048201526011602482015270092dcecc2d8d2c840e4dedee840d0c2e6d607b1b604482015290519081900360640190fd5b610fcc565b815151602011610f6c57815180516020909101208514610f00576040805162461bcd60e51b815260206004820152601b60248201527f496e76616c6964206c6172676520696e7465726e616c20686173680000000000604482015290519081900360640190fd5b84610f7a8360000151611880565b14610fcc576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420696e7465726e616c206e6f64652068617368000000000000604482015290519081900360640190fd5b6020820151516011141561103b578551841415610fe8576111d6565b6000868581518110610ff657fe5b602001015160f81c60f81b60f81c9050600083602001518260ff168151811061101b57fe5b6020026020010151905061102e816118ac565b96506001945050506111ce565b60028260200151511415611181576000611054836118e2565b905060008160008151811061106557fe5b016020015160f81c90506001811660020360006110858460ff8416611900565b905060006110938b8a611900565b905060006110a18383611931565b905060ff8516600214806110b8575060ff85166003145b156110ea578083511480156110cd5750808251145b156110d757988901985b50600160ff1b99506111d6945050505050565b60ff851615806110fd575060ff85166001145b1561114a578061111a5750600160ff1b99506111d6945050505050565b61113b886020015160018151811061112e57fe5b60200260200101516118ac565b9a5097506111ce945050505050565b60405162461bcd60e51b815260040180806020018281038252602681526020018061256b6026913960400191505060405180910390fd5b6040805162461bcd60e51b815260206004820152601d60248201527f526563656976656420616e20756e706172736561626c65206e6f64652e000000604482015290519081900360640190fd5b600101610e7c565b50600160ff1b8414866111e98786611900565b909e909d50909b509950505050505050505050565b602081015180516060916107a9916000198101908110610e0757fe5b611222611bf8565b506040805180820190915281518152602082810190820152919050565b606060008061124d846113b5565b9193509091506001905081600181111561126357fe5b146112b5576040805162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c50206c6973742076616c75652e000000000000000000604482015290519081900360640190fd5b6040805160208082526104208201909252600091816020015b6112d6611bf8565b8152602001906001900390816112ce5790505090506000835b86518110156113aa57602082106113375760405162461bcd60e51b815260040180806020018281038252602a815260200180612541602a913960400191505060405180910390fd5b6000806113636040518060400160405280858c60000151038152602001858c60200151018152506113b5565b509150915060405180604001604052808383018152602001848b602001510181525085858151811061139157fe5b60209081029190910101526001939093019201016112ef565b508152949350505050565b600080600080846000015111611412576040805162461bcd60e51b815260206004820152601860248201527f524c50206974656d2063616e6e6f74206265206e756c6c2e0000000000000000604482015290519081900360640190fd5b6020840151805160001a607f81116114375760006001600094509450945050506116d7565b60b781116114ac578551607f19820190811061149a576040805162461bcd60e51b815260206004820152601960248201527f496e76616c696420524c502073686f727420737472696e672e00000000000000604482015290519081900360640190fd5b600195509350600092506116d7915050565b60bf811161159057855160b619820190811061150f576040805162461bcd60e51b815260206004820152601f60248201527f496e76616c696420524c50206c6f6e6720737472696e67206c656e6774682e00604482015290519081900360640190fd5b6000816020036101000a600185015104905080820188600001511161157b576040805162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c50206c6f6e6720737472696e672e0000000000000000604482015290519081900360640190fd5b600190910195509350600092506116d7915050565b60f7811161160457855160bf1982019081106115f3576040805162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c502073686f7274206c6973742e000000000000000000604482015290519081900360640190fd5b6001955093508492506116d7915050565b855160f619820190811061165f576040805162461bcd60e51b815260206004820152601d60248201527f496e76616c696420524c50206c6f6e67206c697374206c656e6774682e000000604482015290519081900360640190fd5b6000816020036101000a60018501510490508082018860000151116116c4576040805162461bcd60e51b815260206004820152601660248201527524b73b30b634b210292628103637b733903634b9ba1760511b604482015290519081900360640190fd5b60019182019650945092506116d7915050565b9193909250565b8051602091820120825192909101919091201490565b60606000806000611704856113b5565b91945092509050600081600181111561171957fe5b1461176b576040805162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c502062797465732076616c75652e0000000000000000604482015290519081900360640190fd5b61177a85602001518484611997565b95945050505050565b60606000825160020267ffffffffffffffff811180156117a257600080fd5b506040519080825280601f01601f1916602001820160405280156117cd576020820181803683370190505b50905060005b83518110156118795760048482815181106117ea57fe5b602001015160f81c60f81b6001600160f81b031916901c82826002028151811061181057fe5b60200101906001600160f81b031916908160001a905350601084828151811061183557fe5b016020015160f81c8161184457fe5b0660f81b82826002026001018151811061185a57fe5b60200101906001600160f81b031916908160001a9053506001016117d3565b5092915050565b6000602082511015611897575060208101516102f8565b8180602001905160208110156102f357600080fd5b600060606020836000015110156118cd576118c683611a45565b90506118d9565b6118d6836116f4565b90505b61090581611880565b60606107a96118fb8360200151600081518110610e0757fe5b611783565b6060818351036000141561192357506040805160208101909152600081526107a9565b6107a6838384865103611a50565b6000805b8084511180156119455750808351115b801561198a575082818151811061195857fe5b602001015160f81c60f81b6001600160f81b03191684828151811061197957fe5b01602001516001600160f81b031916145b156107a657600101611935565b606060008267ffffffffffffffff811180156119b257600080fd5b506040519080825280601f01601f1916602001820160405280156119dd576020820181803683370190505b5090508051600014156119f1579050610905565b8484016020820160005b60208604811015611a1c5782518252602092830192909101906001016119fb565b5080519151601f959095166020036101000a600019019182169119909416179092525092915050565b60606107a982611ba1565b60608182601f011015611a9b576040805162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b604482015290519081900360640190fd5b828284011015611ae3576040805162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b604482015290519081900360640190fd5b81830184511015611b2f576040805162461bcd60e51b8152602060048201526011602482015270736c6963655f6f75744f66426f756e647360781b604482015290519081900360640190fd5b606082158015611b4e5760405191506000825260208201604052611b98565b6040519150601f8416801560200281840101858101878315602002848b0101015b81831015611b87578051835260209283019201611b6f565b5050858452601f01601f1916604052505b50949350505050565b60606107a9826020015160008460000151611997565b60408051608081018252600080825260208201819052918101829052606081019190915290565b604051806040016040528060608152602001606081525090565b604051806040016040528060008152602001600081525090565b600067ffffffffffffffff831115611c2657fe5b611c39601f8401601f19166020016124ec565b9050828152838383011115611c4d57600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b03811681146102f857600080fd5b600082601f830112611c8b578081fd5b6107a683833560208501611c12565b600060a08284031215611cab578081fd5b60405160a0810167ffffffffffffffff8282108183111715611cc957fe5b81604052829350843583526020850135602084015260408501356040840152606085013560608401526080850135915080821115611d0657600080fd5b50611d1385828601611c7b565b6080830152505092915050565b600060408284031215611d31578081fd5b6040516040810167ffffffffffffffff8282108183111715611d4f57fe5b8160405282935084358352602091508185013581811115611d6f57600080fd5b8501601f81018713611d8057600080fd5b803582811115611d8c57fe5b8381029250611d9c8484016124ec565b8181528481019083860185850187018b1015611db757600080fd5b600095505b83861015611dda578035835260019590950194918601918601611dbc565b5080868801525050505050505092915050565b803563ffffffff811681146102f857600080fd5b600060208284031215611e12578081fd5b6107a682611c64565b600080600080600060a08688031215611e32578081fd5b611e3b86611c64565b9450611e4960208701611c64565b9350604086013567ffffffffffffffff80821115611e65578283fd5b611e7189838a01611c7b565b9450606088013593506080880135915080821115611e8d578283fd5b9087019060a0828a031215611ea0578283fd5b611eaa60a06124ec565b82358152602083013582811115611ebf578485fd5b611ecb8b828601611c9a565b602083015250604083013582811115611ee2578485fd5b611eee8b828601611d20565b604083015250606083013582811115611f05578485fd5b611f118b828601611c7b565b606083015250608083013582811115611f28578485fd5b611f348b828601611c7b565b6080830152508093505050509295509295909350565b600080600080600060a08688031215611f61578081fd5b611f6a86611c64565b9450611f7860208701611c64565b9350604086013567ffffffffffffffff811115611f93578182fd5b611f9f88828901611c7b565b93505060608601359150611fb560808701611ded565b90509295509295909350565b600080600060608486031215611fd5578283fd5b611fde84611c64565b9250602084013567ffffffffffffffff811115611ff9578283fd5b61200586828701611c7b565b92505061201460408501611ded565b90509250925092565b60006020828403121561202e578081fd5b815180151581146107a6578182fd5b60006020828403121561204e578081fd5b5035919050565b600060208284031215612066578081fd5b813567ffffffffffffffff81111561207c578182fd5b8201601f8101841361208c578182fd5b61209b84823560208401611c12565b949350505050565b600081518084526120bb816020860160208601612510565b601f01601f19169290920160200192915050565b600081518352602082015160208401526040820151604084015260608201516060840152608082015160a0608085015261209b60a08501826120a3565b60609190911b6001600160601b031916815260140190565b90815260200190565b918252602082015260400190565b6000825161214d818460208701612510565b9190910192915050565b60008351612169818460208801612510565b60609390931b6001600160601b0319169190920190815260140192915050565b6000845161219b818460208901612510565b60609490941b6001600160601b03191691909301908152601481019190915260340192915050565b60f89190911b6001600160f81b031916815260010190565b6001600160a01b0391909116815260200190565b6001600160a01b0385811682528416602082015260806040820181905260009061221b908301856120a3565b905082606083015295945050505050565b600060018060a01b03851682528360208301526060604083015261177a60608301846120a3565b901515815260200190565b6000848252602060608184015261227860608401866120cf565b838103604085015260408101855182528286015160408484015281815180845260608501915085830194508693505b808410156122c757845182529385019360019390930192908501906122a7565b509998505050505050505050565b6000602082526107a660208301846120a3565b6020808252602b908201527f50726f7669646564206d6573736167652068617320616c72656164792062656560408201526a37103932b1b2b4bb32b21760a91b606082015260800190565b6020808252602b908201527f50726f7669646564206d65737361676520686173206e6f7420616c726561647960408201526a103132b2b71039b2b73a1760a91b606082015260800190565b60208082526036908201527f4f6e6c79204f564d5f4c324d65737361676552656c617965722063616e2072656040820152753630bc90261916ba3796a6189036b2b9b9b0b3b2b99760511b606082015260800190565b60208082526027908201527f50726f7669646564206d65737361676520636f756c64206e6f742062652076656040820152663934b334b2b21760c91b606082015260800190565b6020808252602a908201527f4c3143726f7373446f6d61696e4d657373656e67657220616c72656164792069604082015269373a34b0b634bd32b21760b11b606082015260800190565b6020808252604e908201527f4d6573736167652070617373696e6720707265636f6d70696c6520686173206e60408201527f6f74206265656e20696e697469616c697a6564206f7220696e76616c6964207060608201526d3937b7b310383937bb34b232b21760911b608082015260a00190565b6000602082526107a660208301846120cf565b60405181810167ffffffffffffffff8111828210171561250857fe5b604052919050565b60005b8381101561252b578181015183820152602001612513565b8381111561253a576000848401525b5050505056fe50726f766964656420524c50206c6973742065786365656473206d6178206c697374206c656e6774682e52656365697665642061206e6f6465207769746820616e20756e6b6e6f776e20707265666978a2646970667358221220ae7749addc98d54af4f2ee40764425eeab8281fa56632aa683ab7fadbe10912764736f6c63430007060033", - "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061009e5760003560e01c806382e3702d1161006657806382e3702d1461011c578063b1b1b2091461012f578063c4d66de814610142578063d7fd19dd14610155578063ecc70428146101685761009e565b806321d800ec146100a35780633dbb202b146100cc578063461a4478146100e15780636e296e4514610101578063706ceab614610109575b600080fd5b6100b66100b136600461203d565b61017d565b6040516100c39190612253565b60405180910390f35b6100df6100da366004611fc1565b610192565b005b6100f46100ef366004612055565b610221565b6040516100c391906121db565b6100f46102fd565b6100df610117366004611f4a565b61030c565b6100b661012a36600461203d565b61037c565b6100b661013d36600461203d565b610391565b6100df610150366004611e01565b6103a6565b6100df610163366004611e1b565b6103f1565b61017061065f565b6040516100c39190612124565b60016020526000908152604090205460ff1681565b60006101a2843385600454610665565b60048054600190810190915581516020808401919091206000908152600390915260409020805460ff1916909117905590506101e48163ffffffff84166106b2565b7f0ee9ffdb2334d78de97ffb066b23a352a4d35180cefb36589d663fbb1eb6f3268160405161021391906122d5565b60405180910390a150505050565b60065460405163bf40fac160e01b81526020600482018181528451602484015284516000946001600160a01b03169363bf40fac1938793928392604401918501908083838b5b8381101561027f578181015183820152602001610267565b50505050905090810190601f1680156102ac5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b1580156102c957600080fd5b505afa1580156102dd573d6000803e3d6000fd5b505050506040513d60208110156102f357600080fd5b505190505b919050565b6005546001600160a01b031681565b600061031a86868686610665565b805160208083019190912060009081526003909152604090205490915060ff1615156001146103645760405162461bcd60e51b815260040161035b90612333565b60405180910390fd5b610374818363ffffffff166106b2565b505050505050565b60036020526000908152604090205460ff1681565b60026020526000908152604090205460ff1681565b6006546001600160a01b0316156103cf5760405162461bcd60e51b815260040161035b9061241b565b600680546001600160a01b0319166001600160a01b0392909216919091179055565b60026000541415610449576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6002600090815560408051808201909152601481527327ab26afa61926b2b9b9b0b3b2a932b630bcb2b960611b602082015261048490610221565b90506001600160a01b038116156104bd57336001600160a01b038216146104bd5760405162461bcd60e51b815260040161035b9061237e565b60006104cb87878787610665565b90506104d7818461078a565b15156001146104f85760405162461bcd60e51b815260040161035b906123d4565b80516020808301919091206000818152600290925260409091205460ff16156105335760405162461bcd60e51b815260040161035b906122e8565b600580546001600160a01b0319166001600160a01b03898116919091179091556040516000918a169061056790899061213b565b6000604051808303816000865af19150503d80600081146105a4576040519150601f19603f3d011682016040523d82523d6000602084013e6105a9565b606091505b50909150506001811515141561060b5760008281526002602052604090819020805460ff19166001179055517f4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c90610602908490612124565b60405180910390a15b600083334360405160200161062293929190612189565b60408051601f1981840301815291815281516020928301206000908152600192839052908120805460ff1916831790555550505050505050505050565b60045481565b60608484848460405160240161067e94939291906121ef565b60408051601f198184030181529190526020810180516001600160e01b031663cbd4ece960e01b1790529050949350505050565b6106f06040518060400160405280601d81526020017f4f564d5f43616e6f6e6963616c5472616e73616374696f6e436861696e000000815250610221565b6001600160a01b0316636fee07e061073c6040518060400160405280601a81526020017f4f564d5f4c3243726f7373446f6d61696e4d657373656e676572000000000000815250610221565b83856040518463ffffffff1660e01b815260040161075c9392919061222c565b600060405180830381600087803b15801561077657600080fd5b505af1158015610374573d6000803e3d6000fd5b6000610795826107af565b80156107a657506107a6838361090c565b90505b92915050565b6000806107f06040518060400160405280601881526020017f4f564d5f5374617465436f6d6d69746d656e74436861696e0000000000000000815250610221565b6020840151604051639418bddd60e01b81529192506001600160a01b03831691639418bddd91610822916004016124d9565b60206040518083038186803b15801561083a57600080fd5b505afa15801561084e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610872919061201d565b1580156109055750825160208401516040808601519051634d69ee5760e01b81526001600160a01b03851693634d69ee57936108b593919290919060040161225e565b60206040518083038186803b1580156108cd57600080fd5b505afa1580156108e1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610905919061201d565b9392505050565b6000808361094e6040518060400160405280601a81526020017f4f564d5f4c3243726f7373446f6d61696e4d657373656e676572000000000000815250610221565b60405160200161095f929190612157565b60405160208183030381529060405280519060200120600060405160200161098892919061212d565b6040516020818303038152906040528051906020012090506000806109d7602160991b6040516020016109bb919061210c565b60408051601f1981840301815291905260608701518751610a69565b90925090506001821515146109fe5760405162461bcd60e51b815260040161035b90612465565b6000610a0982610a92565b9050610a5e84604051602001610a1f9190612124565b6040516020818303038152906040526001604051602001610a4091906121c3565b60405160208183030381529060405288608001518460400151610b24565b979650505050505050565b600060606000610a7886610b48565b9050610a85818686610b78565b9250925050935093915050565b610a9a611bb7565b6000610aa583610c4b565b90506040518060800160405280610acf83600081518110610ac257fe5b6020026020010151610c5e565b8152602001610ae483600181518110610ac257fe5b8152602001610b0683600281518110610af957fe5b6020026020010151610c65565b8152602001610b1b83600381518110610af957fe5b90529392505050565b600080610b3086610b48565b9050610b3e81868686610d5e565b9695505050505050565b60608180519060200120604051602001610b629190612124565b6040516020818303038152906040529050919050565b600060606000610b8785610d84565b90506000806000610b99848a89610e5b565b81519295509093509150158080610bad5750815b610bfe576040805162461bcd60e51b815260206004820152601a60248201527f50726f76696465642070726f6f6620697320696e76616c69642e000000000000604482015290519081900360640190fd5b600081610c1a5760405180602001604052806000815250610c39565b610c39866001870381518110610c2c57fe5b60200260200101516111fe565b919b919a509098505050505050505050565b60606107a9610c598361121a565b61123f565b60006107a9825b6000602182600001511115610cc1576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e000000000000604482015290519081900360640190fd5b6000806000610ccf856113b5565b919450925090506000816001811115610ce457fe5b14610d36576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e000000000000604482015290519081900360640190fd5b602080860151840180519091841015610b3e5760208490036101000a90049695505050505050565b6000806000610d6e878686610b78565b91509150818015610a5e5750610a5e86826116de565b60606000610d9183610c4b565b90506000815167ffffffffffffffff81118015610dad57600080fd5b50604051908082528060200260200182016040528015610de757816020015b610dd4611bde565b815260200190600190039081610dcc5790505b50905060005b8251811015610e53576000610e14848381518110610e0757fe5b60200260200101516116f4565b90506040518060400160405280828152602001610e3083610c4b565b815250838381518110610e3f57fe5b602090810291909101015250600101610ded565b509392505050565b60006060818080610e6b87611783565b905085600080610e79611bde565b60005b8c518110156111d6578c8181518110610e9157fe5b6020026020010151915082840193506001870196508360001415610f0557815180516020909101208514610f00576040805162461bcd60e51b8152602060048201526011602482015270092dcecc2d8d2c840e4dedee840d0c2e6d607b1b604482015290519081900360640190fd5b610fcc565b815151602011610f6c57815180516020909101208514610f00576040805162461bcd60e51b815260206004820152601b60248201527f496e76616c6964206c6172676520696e7465726e616c20686173680000000000604482015290519081900360640190fd5b84610f7a8360000151611880565b14610fcc576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420696e7465726e616c206e6f64652068617368000000000000604482015290519081900360640190fd5b6020820151516011141561103b578551841415610fe8576111d6565b6000868581518110610ff657fe5b602001015160f81c60f81b60f81c9050600083602001518260ff168151811061101b57fe5b6020026020010151905061102e816118ac565b96506001945050506111ce565b60028260200151511415611181576000611054836118e2565b905060008160008151811061106557fe5b016020015160f81c90506001811660020360006110858460ff8416611900565b905060006110938b8a611900565b905060006110a18383611931565b905060ff8516600214806110b8575060ff85166003145b156110ea578083511480156110cd5750808251145b156110d757988901985b50600160ff1b99506111d6945050505050565b60ff851615806110fd575060ff85166001145b1561114a578061111a5750600160ff1b99506111d6945050505050565b61113b886020015160018151811061112e57fe5b60200260200101516118ac565b9a5097506111ce945050505050565b60405162461bcd60e51b815260040180806020018281038252602681526020018061256b6026913960400191505060405180910390fd5b6040805162461bcd60e51b815260206004820152601d60248201527f526563656976656420616e20756e706172736561626c65206e6f64652e000000604482015290519081900360640190fd5b600101610e7c565b50600160ff1b8414866111e98786611900565b909e909d50909b509950505050505050505050565b602081015180516060916107a9916000198101908110610e0757fe5b611222611bf8565b506040805180820190915281518152602082810190820152919050565b606060008061124d846113b5565b9193509091506001905081600181111561126357fe5b146112b5576040805162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c50206c6973742076616c75652e000000000000000000604482015290519081900360640190fd5b6040805160208082526104208201909252600091816020015b6112d6611bf8565b8152602001906001900390816112ce5790505090506000835b86518110156113aa57602082106113375760405162461bcd60e51b815260040180806020018281038252602a815260200180612541602a913960400191505060405180910390fd5b6000806113636040518060400160405280858c60000151038152602001858c60200151018152506113b5565b509150915060405180604001604052808383018152602001848b602001510181525085858151811061139157fe5b60209081029190910101526001939093019201016112ef565b508152949350505050565b600080600080846000015111611412576040805162461bcd60e51b815260206004820152601860248201527f524c50206974656d2063616e6e6f74206265206e756c6c2e0000000000000000604482015290519081900360640190fd5b6020840151805160001a607f81116114375760006001600094509450945050506116d7565b60b781116114ac578551607f19820190811061149a576040805162461bcd60e51b815260206004820152601960248201527f496e76616c696420524c502073686f727420737472696e672e00000000000000604482015290519081900360640190fd5b600195509350600092506116d7915050565b60bf811161159057855160b619820190811061150f576040805162461bcd60e51b815260206004820152601f60248201527f496e76616c696420524c50206c6f6e6720737472696e67206c656e6774682e00604482015290519081900360640190fd5b6000816020036101000a600185015104905080820188600001511161157b576040805162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c50206c6f6e6720737472696e672e0000000000000000604482015290519081900360640190fd5b600190910195509350600092506116d7915050565b60f7811161160457855160bf1982019081106115f3576040805162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c502073686f7274206c6973742e000000000000000000604482015290519081900360640190fd5b6001955093508492506116d7915050565b855160f619820190811061165f576040805162461bcd60e51b815260206004820152601d60248201527f496e76616c696420524c50206c6f6e67206c697374206c656e6774682e000000604482015290519081900360640190fd5b6000816020036101000a60018501510490508082018860000151116116c4576040805162461bcd60e51b815260206004820152601660248201527524b73b30b634b210292628103637b733903634b9ba1760511b604482015290519081900360640190fd5b60019182019650945092506116d7915050565b9193909250565b8051602091820120825192909101919091201490565b60606000806000611704856113b5565b91945092509050600081600181111561171957fe5b1461176b576040805162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c502062797465732076616c75652e0000000000000000604482015290519081900360640190fd5b61177a85602001518484611997565b95945050505050565b60606000825160020267ffffffffffffffff811180156117a257600080fd5b506040519080825280601f01601f1916602001820160405280156117cd576020820181803683370190505b50905060005b83518110156118795760048482815181106117ea57fe5b602001015160f81c60f81b6001600160f81b031916901c82826002028151811061181057fe5b60200101906001600160f81b031916908160001a905350601084828151811061183557fe5b016020015160f81c8161184457fe5b0660f81b82826002026001018151811061185a57fe5b60200101906001600160f81b031916908160001a9053506001016117d3565b5092915050565b6000602082511015611897575060208101516102f8565b8180602001905160208110156102f357600080fd5b600060606020836000015110156118cd576118c683611a45565b90506118d9565b6118d6836116f4565b90505b61090581611880565b60606107a96118fb8360200151600081518110610e0757fe5b611783565b6060818351036000141561192357506040805160208101909152600081526107a9565b6107a6838384865103611a50565b6000805b8084511180156119455750808351115b801561198a575082818151811061195857fe5b602001015160f81c60f81b6001600160f81b03191684828151811061197957fe5b01602001516001600160f81b031916145b156107a657600101611935565b606060008267ffffffffffffffff811180156119b257600080fd5b506040519080825280601f01601f1916602001820160405280156119dd576020820181803683370190505b5090508051600014156119f1579050610905565b8484016020820160005b60208604811015611a1c5782518252602092830192909101906001016119fb565b5080519151601f959095166020036101000a600019019182169119909416179092525092915050565b60606107a982611ba1565b60608182601f011015611a9b576040805162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b604482015290519081900360640190fd5b828284011015611ae3576040805162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b604482015290519081900360640190fd5b81830184511015611b2f576040805162461bcd60e51b8152602060048201526011602482015270736c6963655f6f75744f66426f756e647360781b604482015290519081900360640190fd5b606082158015611b4e5760405191506000825260208201604052611b98565b6040519150601f8416801560200281840101858101878315602002848b0101015b81831015611b87578051835260209283019201611b6f565b5050858452601f01601f1916604052505b50949350505050565b60606107a9826020015160008460000151611997565b60408051608081018252600080825260208201819052918101829052606081019190915290565b604051806040016040528060608152602001606081525090565b604051806040016040528060008152602001600081525090565b600067ffffffffffffffff831115611c2657fe5b611c39601f8401601f19166020016124ec565b9050828152838383011115611c4d57600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b03811681146102f857600080fd5b600082601f830112611c8b578081fd5b6107a683833560208501611c12565b600060a08284031215611cab578081fd5b60405160a0810167ffffffffffffffff8282108183111715611cc957fe5b81604052829350843583526020850135602084015260408501356040840152606085013560608401526080850135915080821115611d0657600080fd5b50611d1385828601611c7b565b6080830152505092915050565b600060408284031215611d31578081fd5b6040516040810167ffffffffffffffff8282108183111715611d4f57fe5b8160405282935084358352602091508185013581811115611d6f57600080fd5b8501601f81018713611d8057600080fd5b803582811115611d8c57fe5b8381029250611d9c8484016124ec565b8181528481019083860185850187018b1015611db757600080fd5b600095505b83861015611dda578035835260019590950194918601918601611dbc565b5080868801525050505050505092915050565b803563ffffffff811681146102f857600080fd5b600060208284031215611e12578081fd5b6107a682611c64565b600080600080600060a08688031215611e32578081fd5b611e3b86611c64565b9450611e4960208701611c64565b9350604086013567ffffffffffffffff80821115611e65578283fd5b611e7189838a01611c7b565b9450606088013593506080880135915080821115611e8d578283fd5b9087019060a0828a031215611ea0578283fd5b611eaa60a06124ec565b82358152602083013582811115611ebf578485fd5b611ecb8b828601611c9a565b602083015250604083013582811115611ee2578485fd5b611eee8b828601611d20565b604083015250606083013582811115611f05578485fd5b611f118b828601611c7b565b606083015250608083013582811115611f28578485fd5b611f348b828601611c7b565b6080830152508093505050509295509295909350565b600080600080600060a08688031215611f61578081fd5b611f6a86611c64565b9450611f7860208701611c64565b9350604086013567ffffffffffffffff811115611f93578182fd5b611f9f88828901611c7b565b93505060608601359150611fb560808701611ded565b90509295509295909350565b600080600060608486031215611fd5578283fd5b611fde84611c64565b9250602084013567ffffffffffffffff811115611ff9578283fd5b61200586828701611c7b565b92505061201460408501611ded565b90509250925092565b60006020828403121561202e578081fd5b815180151581146107a6578182fd5b60006020828403121561204e578081fd5b5035919050565b600060208284031215612066578081fd5b813567ffffffffffffffff81111561207c578182fd5b8201601f8101841361208c578182fd5b61209b84823560208401611c12565b949350505050565b600081518084526120bb816020860160208601612510565b601f01601f19169290920160200192915050565b600081518352602082015160208401526040820151604084015260608201516060840152608082015160a0608085015261209b60a08501826120a3565b60609190911b6001600160601b031916815260140190565b90815260200190565b918252602082015260400190565b6000825161214d818460208701612510565b9190910192915050565b60008351612169818460208801612510565b60609390931b6001600160601b0319169190920190815260140192915050565b6000845161219b818460208901612510565b60609490941b6001600160601b03191691909301908152601481019190915260340192915050565b60f89190911b6001600160f81b031916815260010190565b6001600160a01b0391909116815260200190565b6001600160a01b0385811682528416602082015260806040820181905260009061221b908301856120a3565b905082606083015295945050505050565b600060018060a01b03851682528360208301526060604083015261177a60608301846120a3565b901515815260200190565b6000848252602060608184015261227860608401866120cf565b838103604085015260408101855182528286015160408484015281815180845260608501915085830194508693505b808410156122c757845182529385019360019390930192908501906122a7565b509998505050505050505050565b6000602082526107a660208301846120a3565b6020808252602b908201527f50726f7669646564206d6573736167652068617320616c72656164792062656560408201526a37103932b1b2b4bb32b21760a91b606082015260800190565b6020808252602b908201527f50726f7669646564206d65737361676520686173206e6f7420616c726561647960408201526a103132b2b71039b2b73a1760a91b606082015260800190565b60208082526036908201527f4f6e6c79204f564d5f4c324d65737361676552656c617965722063616e2072656040820152753630bc90261916ba3796a6189036b2b9b9b0b3b2b99760511b606082015260800190565b60208082526027908201527f50726f7669646564206d65737361676520636f756c64206e6f742062652076656040820152663934b334b2b21760c91b606082015260800190565b6020808252602a908201527f4c3143726f7373446f6d61696e4d657373656e67657220616c72656164792069604082015269373a34b0b634bd32b21760b11b606082015260800190565b6020808252604e908201527f4d6573736167652070617373696e6720707265636f6d70696c6520686173206e60408201527f6f74206265656e20696e697469616c697a6564206f7220696e76616c6964207060608201526d3937b7b310383937bb34b232b21760911b608082015260a00190565b6000602082526107a660208301846120cf565b60405181810167ffffffffffffffff8111828210171561250857fe5b604052919050565b60005b8381101561252b578181015183820152602001612513565b8381111561253a576000848401525b5050505056fe50726f766964656420524c50206c6973742065786365656473206d6178206c697374206c656e6774682e52656365697665642061206e6f6465207769746820616e20756e6b6e6f776e20707265666978a2646970667358221220ae7749addc98d54af4f2ee40764425eeab8281fa56632aa683ab7fadbe10912764736f6c63430007060033", - "devdoc": { - "details": "This contract lives on L1. It sends L1->L2 messages into L2, and relays L2->L1 messages from L2 to their target on L1.", - "kind": "dev", - "methods": { - "initialize(address)": { - "params": { - "_libAddressManager": "Address of the Address Manager." - } - }, - "relayMessage(address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))": { - "params": { - "_message": "Message to send to the target.", - "_messageNonce": "Nonce for the provided message.", - "_proof": "Inclusion proof for the given message.", - "_sender": "Message sender address.", - "_target": "Target contract address." - } - }, - "replayMessage(address,address,bytes,uint256,uint32)": { - "params": { - "_gasLimit": "Gas limit for the provided message.", - "_message": "Message to send to the target.", - "_messageNonce": "Nonce for the provided message.", - "_sender": "Original sender address.", - "_target": "Target contract address." - } - }, - "sendMessage(address,bytes,uint32)": { - "params": { - "_gasLimit": "Gas limit for the provided message.", - "_message": "Message to send to the target.", - "_target": "Target contract address." - } - } - }, - "title": "OVM_L1CrossDomainMessenger", - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": { - "constructor": { - "notice": "Pass a default zero address to the address resolver. This will be updated when initialized." - }, - "relayMessage(address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))": { - "notice": "Relays a cross domain message to a contract." - }, - "replayMessage(address,address,bytes,uint256,uint32)": { - "notice": "Replays a cross domain message to the target messenger." - }, - "sendMessage(address,bytes,uint32)": { - "notice": "Sends a cross domain message to the target messenger." - } - }, - "version": 1 - }, - "storageLayout": { - "storage": [ - { - "astId": 16313, - "contract": "contracts/optimistic-ethereum/OVM/bridge/OVM_L1CrossDomainMessenger.sol:OVM_L1CrossDomainMessenger", - "label": "_status", - "offset": 0, - "slot": "0", - "type": "t_uint256" - }, - { - "astId": 679, - "contract": "contracts/optimistic-ethereum/OVM/bridge/OVM_L1CrossDomainMessenger.sol:OVM_L1CrossDomainMessenger", - "label": "relayedMessages", - "offset": 0, - "slot": "1", - "type": "t_mapping(t_bytes32,t_bool)" - }, - { - "astId": 683, - "contract": "contracts/optimistic-ethereum/OVM/bridge/OVM_L1CrossDomainMessenger.sol:OVM_L1CrossDomainMessenger", - "label": "successfulMessages", - "offset": 0, - "slot": "2", - "type": "t_mapping(t_bytes32,t_bool)" - }, - { - "astId": 687, - "contract": "contracts/optimistic-ethereum/OVM/bridge/OVM_L1CrossDomainMessenger.sol:OVM_L1CrossDomainMessenger", - "label": "sentMessages", - "offset": 0, - "slot": "3", - "type": "t_mapping(t_bytes32,t_bool)" - }, - { - "astId": 689, - "contract": "contracts/optimistic-ethereum/OVM/bridge/OVM_L1CrossDomainMessenger.sol:OVM_L1CrossDomainMessenger", - "label": "messageNonce", - "offset": 0, - "slot": "4", - "type": "t_uint256" - }, - { - "astId": 692, - "contract": "contracts/optimistic-ethereum/OVM/bridge/OVM_L1CrossDomainMessenger.sol:OVM_L1CrossDomainMessenger", - "label": "xDomainMessageSender", - "offset": 0, - "slot": "5", - "type": "t_address" - }, - { - "astId": 11707, - "contract": "contracts/optimistic-ethereum/OVM/bridge/OVM_L1CrossDomainMessenger.sol:OVM_L1CrossDomainMessenger", - "label": "libAddressManager", - "offset": 0, - "slot": "6", - "type": "t_contract(Lib_AddressManager)11700" - } - ], - "types": { - "t_address": { - "encoding": "inplace", - "label": "address", - "numberOfBytes": "20" - }, - "t_bool": { - "encoding": "inplace", - "label": "bool", - "numberOfBytes": "1" - }, - "t_bytes32": { - "encoding": "inplace", - "label": "bytes32", - "numberOfBytes": "32" - }, - "t_contract(Lib_AddressManager)11700": { - "encoding": "inplace", - "label": "contract Lib_AddressManager", - "numberOfBytes": "20" - }, - "t_mapping(t_bytes32,t_bool)": { - "encoding": "mapping", - "key": "t_bytes32", - "label": "mapping(bytes32 => bool)", - "numberOfBytes": "32", - "value": "t_bool" - }, - "t_uint256": { - "encoding": "inplace", - "label": "uint256", - "numberOfBytes": "32" - } - } - } -} \ No newline at end of file diff --git a/packages/contracts/deployments/mainnet-v1/OVM_StateCommitmentChain.json b/packages/contracts/deployments/mainnet-v1/OVM_StateCommitmentChain.json deleted file mode 100644 index af54a09c8d814..0000000000000 --- a/packages/contracts/deployments/mainnet-v1/OVM_StateCommitmentChain.json +++ /dev/null @@ -1,504 +0,0 @@ -{ - "address": "0x901a629a72A5daF200fc359657f070b34bBfdd18", - "abi": [ - { - "inputs": [ - { - "internalType": "address", - "name": "_libAddressManager", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_fraudProofWindow", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_sequencerPublishWindow", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "_batchIndex", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "bytes32", - "name": "_batchRoot", - "type": "bytes32" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_batchSize", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_prevTotalElements", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "bytes", - "name": "_extraData", - "type": "bytes" - } - ], - "name": "StateBatchAppended", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "_batchIndex", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "bytes32", - "name": "_batchRoot", - "type": "bytes32" - } - ], - "name": "StateBatchDeleted", - "type": "event" - }, - { - "inputs": [], - "name": "FRAUD_PROOF_WINDOW", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "SEQUENCER_PUBLISH_WINDOW", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32[]", - "name": "_batch", - "type": "bytes32[]" - }, - { - "internalType": "uint256", - "name": "_shouldStartAtElement", - "type": "uint256" - } - ], - "name": "appendStateBatch", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "batches", - "outputs": [ - { - "internalType": "contract iOVM_ChainStorageContainer", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "components": [ - { - "internalType": "uint256", - "name": "batchIndex", - "type": "uint256" - }, - { - "internalType": "bytes32", - "name": "batchRoot", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "batchSize", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "prevTotalElements", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "extraData", - "type": "bytes" - } - ], - "internalType": "struct Lib_OVMCodec.ChainBatchHeader", - "name": "_batchHeader", - "type": "tuple" - } - ], - "name": "deleteStateBatch", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "getLastSequencerTimestamp", - "outputs": [ - { - "internalType": "uint256", - "name": "_lastSequencerTimestamp", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getTotalBatches", - "outputs": [ - { - "internalType": "uint256", - "name": "_totalBatches", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getTotalElements", - "outputs": [ - { - "internalType": "uint256", - "name": "_totalElements", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "components": [ - { - "internalType": "uint256", - "name": "batchIndex", - "type": "uint256" - }, - { - "internalType": "bytes32", - "name": "batchRoot", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "batchSize", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "prevTotalElements", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "extraData", - "type": "bytes" - } - ], - "internalType": "struct Lib_OVMCodec.ChainBatchHeader", - "name": "_batchHeader", - "type": "tuple" - } - ], - "name": "insideFraudProofWindow", - "outputs": [ - { - "internalType": "bool", - "name": "_inside", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "string", - "name": "_name", - "type": "string" - } - ], - "name": "resolve", - "outputs": [ - { - "internalType": "address", - "name": "_contract", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "_element", - "type": "bytes32" - }, - { - "components": [ - { - "internalType": "uint256", - "name": "batchIndex", - "type": "uint256" - }, - { - "internalType": "bytes32", - "name": "batchRoot", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "batchSize", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "prevTotalElements", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "extraData", - "type": "bytes" - } - ], - "internalType": "struct Lib_OVMCodec.ChainBatchHeader", - "name": "_batchHeader", - "type": "tuple" - }, - { - "components": [ - { - "internalType": "uint256", - "name": "index", - "type": "uint256" - }, - { - "internalType": "bytes32[]", - "name": "siblings", - "type": "bytes32[]" - } - ], - "internalType": "struct Lib_OVMCodec.ChainInclusionProof", - "name": "_proof", - "type": "tuple" - } - ], - "name": "verifyStateCommitment", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - } - ], - "transactionHash": "0xb39654f6dfba167749e5ed12a67f10721f84abd56328a468a2a0ec665eeef725", - "receipt": { - "to": null, - "from": "0x558ba9b8d78713fbf768c1f8a584485B4003f43F", - "contractAddress": "0xE1A99Ff67B5c92502bA94b5337576de3624cb512", - "transactionIndex": 0, - "gasUsed": "1626450", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0xdcbf3bbc2709ed51ce548a98413a3f341a8fc245c4a435e7570e9aee5d2d95f3", - "transactionHash": "0xb39654f6dfba167749e5ed12a67f10721f84abd56328a468a2a0ec665eeef725", - "logs": [], - "blockNumber": 4573386, - "cumulativeGasUsed": "1626450", - "status": 1, - "byzantium": true - }, - "args": [ - "0x1De8CFD4C1A486200286073aE91DE6e8099519f1", - 604800, - 18000000 - ], - "solcInputHash": "cebcb515c1a9c570d96e0b8f6fd237e2", - "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_fraudProofWindow\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_sequencerPublishWindow\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_batchIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"_batchRoot\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_batchSize\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_prevTotalElements\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"_extraData\",\"type\":\"bytes\"}],\"name\":\"StateBatchAppended\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_batchIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"_batchRoot\",\"type\":\"bytes32\"}],\"name\":\"StateBatchDeleted\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"FRAUD_PROOF_WINDOW\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"SEQUENCER_PUBLISH_WINDOW\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"_batch\",\"type\":\"bytes32[]\"},{\"internalType\":\"uint256\",\"name\":\"_shouldStartAtElement\",\"type\":\"uint256\"}],\"name\":\"appendStateBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"batches\",\"outputs\":[{\"internalType\":\"contract iOVM_ChainStorageContainer\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"_batchHeader\",\"type\":\"tuple\"}],\"name\":\"deleteStateBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLastSequencerTimestamp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_lastSequencerTimestamp\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTotalBatches\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_totalBatches\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTotalElements\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_totalElements\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"_batchHeader\",\"type\":\"tuple\"}],\"name\":\"insideFraudProofWindow\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"_inside\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"_contract\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_element\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"_batchHeader\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"siblings\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct Lib_OVMCodec.ChainInclusionProof\",\"name\":\"_proof\",\"type\":\"tuple\"}],\"name\":\"verifyStateCommitment\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"appendStateBatch(bytes32[],uint256)\":{\"params\":{\"_batch\":\"Batch of state roots.\",\"_shouldStartAtElement\":\"Index of the element at which this batch should start.\"}},\"batches()\":{\"returns\":{\"_0\":\"Reference to the batch storage container.\"}},\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\"}},\"deleteStateBatch((uint256,bytes32,uint256,uint256,bytes))\":{\"params\":{\"_batchHeader\":\"Header of the batch to start deleting from.\"}},\"getLastSequencerTimestamp()\":{\"returns\":{\"_lastSequencerTimestamp\":\"Last sequencer batch timestamp.\"}},\"getTotalBatches()\":{\"returns\":{\"_totalBatches\":\"Total submitted batches.\"}},\"getTotalElements()\":{\"returns\":{\"_totalElements\":\"Total submitted elements.\"}},\"insideFraudProofWindow((uint256,bytes32,uint256,uint256,bytes))\":{\"params\":{\"_batchHeader\":\"Header of the batch to check.\"},\"returns\":{\"_inside\":\"Whether or not the batch is inside the fraud proof window.\"}},\"verifyStateCommitment(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))\":{\"params\":{\"_batchHeader\":\"Header of the batch in which the element was included.\",\"_element\":\"Hash of the element to verify a proof for.\",\"_proof\":\"Merkle inclusion proof for the element.\"}}},\"title\":\"OVM_StateCommitmentChain\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"appendStateBatch(bytes32[],uint256)\":{\"notice\":\"Appends a batch of state roots to the chain.\"},\"batches()\":{\"notice\":\"Accesses the batch storage container.\"},\"deleteStateBatch((uint256,bytes32,uint256,uint256,bytes))\":{\"notice\":\"Deletes all state roots after (and including) a given batch.\"},\"getLastSequencerTimestamp()\":{\"notice\":\"Retrieves the timestamp of the last batch submitted by the sequencer.\"},\"getTotalBatches()\":{\"notice\":\"Retrieves the total number of batches submitted.\"},\"getTotalElements()\":{\"notice\":\"Retrieves the total number of elements submitted.\"},\"insideFraudProofWindow((uint256,bytes32,uint256,uint256,bytes))\":{\"notice\":\"Checks whether a given batch is still inside its fraud proof window.\"},\"verifyStateCommitment(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))\":{\"notice\":\"Verifies a batch inclusion proof.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/OVM/chain/OVM_StateCommitmentChain.sol\":\"OVM_StateCommitmentChain\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/math/SafeMath.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\n * checks.\\n *\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\n * in bugs, because programmers usually assume that an overflow raises an\\n * error, which is the standard behavior in high level programming languages.\\n * `SafeMath` restores this intuition by reverting the transaction when an\\n * operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n */\\nlibrary SafeMath {\\n /**\\n * @dev Returns the addition of two unsigned integers, with an overflow flag.\\n *\\n * _Available since v3.4._\\n */\\n function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n uint256 c = a + b;\\n if (c < a) return (false, 0);\\n return (true, c);\\n }\\n\\n /**\\n * @dev Returns the substraction of two unsigned integers, with an overflow flag.\\n *\\n * _Available since v3.4._\\n */\\n function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n if (b > a) return (false, 0);\\n return (true, a - b);\\n }\\n\\n /**\\n * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\\n *\\n * _Available since v3.4._\\n */\\n function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\n // benefit is lost if 'b' is also tested.\\n // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\n if (a == 0) return (true, 0);\\n uint256 c = a * b;\\n if (c / a != b) return (false, 0);\\n return (true, c);\\n }\\n\\n /**\\n * @dev Returns the division of two unsigned integers, with a division by zero flag.\\n *\\n * _Available since v3.4._\\n */\\n function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n if (b == 0) return (false, 0);\\n return (true, a / b);\\n }\\n\\n /**\\n * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\\n *\\n * _Available since v3.4._\\n */\\n function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n if (b == 0) return (false, 0);\\n return (true, a % b);\\n }\\n\\n /**\\n * @dev Returns the addition of two unsigned integers, reverting on\\n * overflow.\\n *\\n * Counterpart to Solidity's `+` operator.\\n *\\n * Requirements:\\n *\\n * - Addition cannot overflow.\\n */\\n function add(uint256 a, uint256 b) internal pure returns (uint256) {\\n uint256 c = a + b;\\n require(c >= a, \\\"SafeMath: addition overflow\\\");\\n return c;\\n }\\n\\n /**\\n * @dev Returns the subtraction of two unsigned integers, reverting on\\n * overflow (when the result is negative).\\n *\\n * Counterpart to Solidity's `-` operator.\\n *\\n * Requirements:\\n *\\n * - Subtraction cannot overflow.\\n */\\n function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\n require(b <= a, \\\"SafeMath: subtraction overflow\\\");\\n return a - b;\\n }\\n\\n /**\\n * @dev Returns the multiplication of two unsigned integers, reverting on\\n * overflow.\\n *\\n * Counterpart to Solidity's `*` operator.\\n *\\n * Requirements:\\n *\\n * - Multiplication cannot overflow.\\n */\\n function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\n if (a == 0) return 0;\\n uint256 c = a * b;\\n require(c / a == b, \\\"SafeMath: multiplication overflow\\\");\\n return c;\\n }\\n\\n /**\\n * @dev Returns the integer division of two unsigned integers, reverting on\\n * division by zero. The result is rounded towards zero.\\n *\\n * Counterpart to Solidity's `/` operator. Note: this function uses a\\n * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n * uses an invalid opcode to revert (consuming all remaining gas).\\n *\\n * Requirements:\\n *\\n * - The divisor cannot be zero.\\n */\\n function div(uint256 a, uint256 b) internal pure returns (uint256) {\\n require(b > 0, \\\"SafeMath: division by zero\\\");\\n return a / b;\\n }\\n\\n /**\\n * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n * reverting when dividing by zero.\\n *\\n * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n * opcode (which leaves remaining gas untouched) while Solidity uses an\\n * invalid opcode to revert (consuming all remaining gas).\\n *\\n * Requirements:\\n *\\n * - The divisor cannot be zero.\\n */\\n function mod(uint256 a, uint256 b) internal pure returns (uint256) {\\n require(b > 0, \\\"SafeMath: modulo by zero\\\");\\n return a % b;\\n }\\n\\n /**\\n * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\n * overflow (when the result is negative).\\n *\\n * CAUTION: This function is deprecated because it requires allocating memory for the error\\n * message unnecessarily. For custom revert reasons use {trySub}.\\n *\\n * Counterpart to Solidity's `-` operator.\\n *\\n * Requirements:\\n *\\n * - Subtraction cannot overflow.\\n */\\n function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n require(b <= a, errorMessage);\\n return a - b;\\n }\\n\\n /**\\n * @dev Returns the integer division of two unsigned integers, reverting with custom message on\\n * division by zero. The result is rounded towards zero.\\n *\\n * CAUTION: This function is deprecated because it requires allocating memory for the error\\n * message unnecessarily. For custom revert reasons use {tryDiv}.\\n *\\n * Counterpart to Solidity's `/` operator. Note: this function uses a\\n * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n * uses an invalid opcode to revert (consuming all remaining gas).\\n *\\n * Requirements:\\n *\\n * - The divisor cannot be zero.\\n */\\n function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n require(b > 0, errorMessage);\\n return a / b;\\n }\\n\\n /**\\n * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n * reverting with custom message when dividing by zero.\\n *\\n * CAUTION: This function is deprecated because it requires allocating memory for the error\\n * message unnecessarily. For custom revert reasons use {tryMod}.\\n *\\n * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n * opcode (which leaves remaining gas untouched) while Solidity uses an\\n * invalid opcode to revert (consuming all remaining gas).\\n *\\n * Requirements:\\n *\\n * - The divisor cannot be zero.\\n */\\n function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n require(b > 0, errorMessage);\\n return a % b;\\n }\\n}\\n\",\"keccak256\":\"0xcc78a17dd88fa5a2edc60c8489e2f405c0913b377216a5b26b35656b2d0dab52\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/chain/OVM_StateCommitmentChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.7.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\nimport { Lib_MerkleTree } from \\\"../../libraries/utils/Lib_MerkleTree.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_FraudVerifier } from \\\"../../iOVM/verification/iOVM_FraudVerifier.sol\\\";\\nimport { iOVM_StateCommitmentChain } from \\\"../../iOVM/chain/iOVM_StateCommitmentChain.sol\\\";\\nimport { iOVM_CanonicalTransactionChain } from \\\"../../iOVM/chain/iOVM_CanonicalTransactionChain.sol\\\";\\nimport { iOVM_BondManager } from \\\"../../iOVM/verification/iOVM_BondManager.sol\\\";\\nimport { iOVM_ChainStorageContainer } from \\\"../../iOVM/chain/iOVM_ChainStorageContainer.sol\\\";\\n\\n/* External Imports */\\nimport '@openzeppelin/contracts/math/SafeMath.sol';\\n\\n/**\\n * @title OVM_StateCommitmentChain\\n */\\ncontract OVM_StateCommitmentChain is iOVM_StateCommitmentChain, Lib_AddressResolver {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 public FRAUD_PROOF_WINDOW;\\n uint256 public SEQUENCER_PUBLISH_WINDOW;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n */\\n constructor(\\n address _libAddressManager,\\n uint256 _fraudProofWindow,\\n uint256 _sequencerPublishWindow\\n )\\n Lib_AddressResolver(_libAddressManager)\\n {\\n FRAUD_PROOF_WINDOW = _fraudProofWindow;\\n SEQUENCER_PUBLISH_WINDOW = _sequencerPublishWindow;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Accesses the batch storage container.\\n * @return Reference to the batch storage container.\\n */\\n function batches()\\n public\\n view\\n returns (\\n iOVM_ChainStorageContainer\\n )\\n {\\n return iOVM_ChainStorageContainer(\\n resolve(\\\"OVM_ChainStorageContainer:SCC:batches\\\")\\n );\\n }\\n\\n /**\\n * @inheritdoc iOVM_StateCommitmentChain\\n */\\n function getTotalElements()\\n override\\n public\\n view\\n returns (\\n uint256 _totalElements\\n )\\n {\\n (uint40 totalElements, ) = _getBatchExtraData();\\n return uint256(totalElements);\\n }\\n\\n /**\\n * @inheritdoc iOVM_StateCommitmentChain\\n */\\n function getTotalBatches()\\n override\\n public\\n view\\n returns (\\n uint256 _totalBatches\\n )\\n {\\n return batches().length();\\n }\\n\\n /**\\n * @inheritdoc iOVM_StateCommitmentChain\\n */\\n function getLastSequencerTimestamp()\\n override\\n public\\n view\\n returns (\\n uint256 _lastSequencerTimestamp\\n )\\n {\\n (, uint40 lastSequencerTimestamp) = _getBatchExtraData();\\n return uint256(lastSequencerTimestamp);\\n }\\n\\n /**\\n * @inheritdoc iOVM_StateCommitmentChain\\n */\\n function appendStateBatch(\\n bytes32[] memory _batch,\\n uint256 _shouldStartAtElement\\n )\\n override\\n public\\n {\\n // Fail fast in to make sure our batch roots aren't accidentally made fraudulent by the\\n // publication of batches by some other user.\\n require(\\n _shouldStartAtElement == getTotalElements(),\\n \\\"Actual batch start index does not match expected start index.\\\"\\n );\\n\\n // Proposers must have previously staked at the BondManager\\n require(\\n iOVM_BondManager(resolve(\\\"OVM_BondManager\\\")).isCollateralized(msg.sender),\\n \\\"Proposer does not have enough collateral posted\\\"\\n );\\n\\n require(\\n _batch.length > 0,\\n \\\"Cannot submit an empty state batch.\\\"\\n );\\n\\n require(\\n getTotalElements() + _batch.length <= iOVM_CanonicalTransactionChain(resolve(\\\"OVM_CanonicalTransactionChain\\\")).getTotalElements(),\\n \\\"Number of state roots cannot exceed the number of canonical transactions.\\\"\\n );\\n\\n // Pass the block's timestamp and the publisher of the data\\n // to be used in the fraud proofs\\n _appendBatch(\\n _batch,\\n abi.encode(block.timestamp, msg.sender)\\n );\\n }\\n\\n /**\\n * @inheritdoc iOVM_StateCommitmentChain\\n */\\n function deleteStateBatch(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n override\\n public\\n {\\n require(\\n msg.sender == resolve(\\\"OVM_FraudVerifier\\\"),\\n \\\"State batches can only be deleted by the OVM_FraudVerifier.\\\"\\n );\\n\\n require(\\n _isValidBatchHeader(_batchHeader),\\n \\\"Invalid batch header.\\\"\\n );\\n\\n require(\\n insideFraudProofWindow(_batchHeader),\\n \\\"State batches can only be deleted within the fraud proof window.\\\"\\n );\\n\\n _deleteBatch(_batchHeader);\\n }\\n\\n /**\\n * @inheritdoc iOVM_StateCommitmentChain\\n */\\n function verifyStateCommitment(\\n bytes32 _element,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _proof\\n )\\n override\\n public\\n view\\n returns (\\n bool\\n )\\n {\\n require(\\n _isValidBatchHeader(_batchHeader),\\n \\\"Invalid batch header.\\\"\\n );\\n\\n require(\\n Lib_MerkleTree.verify(\\n _batchHeader.batchRoot,\\n _element,\\n _proof.index,\\n _proof.siblings,\\n _batchHeader.batchSize\\n ),\\n \\\"Invalid inclusion proof.\\\"\\n );\\n\\n return true;\\n }\\n\\n /**\\n * @inheritdoc iOVM_StateCommitmentChain\\n */\\n function insideFraudProofWindow(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n override\\n public\\n view\\n returns (\\n bool _inside\\n )\\n {\\n (uint256 timestamp,) = abi.decode(\\n _batchHeader.extraData,\\n (uint256, address)\\n );\\n\\n require(\\n timestamp != 0,\\n \\\"Batch header timestamp cannot be zero\\\"\\n );\\n return SafeMath.add(timestamp, FRAUD_PROOF_WINDOW) > block.timestamp;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Parses the batch context from the extra data.\\n * @return Total number of elements submitted.\\n * @return Timestamp of the last batch submitted by the sequencer.\\n */\\n function _getBatchExtraData()\\n internal\\n view\\n returns (\\n uint40,\\n uint40\\n )\\n {\\n bytes27 extraData = batches().getGlobalMetadata();\\n\\n uint40 totalElements;\\n uint40 lastSequencerTimestamp;\\n assembly {\\n extraData := shr(40, extraData)\\n totalElements := and(extraData, 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF)\\n lastSequencerTimestamp := shr(40, and(extraData, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000))\\n }\\n\\n return (\\n totalElements,\\n lastSequencerTimestamp\\n );\\n }\\n\\n /**\\n * Encodes the batch context for the extra data.\\n * @param _totalElements Total number of elements submitted.\\n * @param _lastSequencerTimestamp Timestamp of the last batch submitted by the sequencer.\\n * @return Encoded batch context.\\n */\\n function _makeBatchExtraData(\\n uint40 _totalElements,\\n uint40 _lastSequencerTimestamp\\n )\\n internal\\n pure\\n returns (\\n bytes27\\n )\\n {\\n bytes27 extraData;\\n assembly {\\n extraData := _totalElements\\n extraData := or(extraData, shl(40, _lastSequencerTimestamp))\\n extraData := shl(40, extraData)\\n }\\n\\n return extraData;\\n }\\n\\n /**\\n * Appends a batch to the chain.\\n * @param _batch Elements within the batch.\\n * @param _extraData Any extra data to append to the batch.\\n */\\n function _appendBatch(\\n bytes32[] memory _batch,\\n bytes memory _extraData\\n )\\n internal\\n {\\n address sequencer = resolve(\\\"OVM_Sequencer\\\");\\n (uint40 totalElements, uint40 lastSequencerTimestamp) = _getBatchExtraData();\\n\\n if (msg.sender == sequencer) {\\n lastSequencerTimestamp = uint40(block.timestamp);\\n } else {\\n // We keep track of the last batch submitted by the sequencer so there's a window in\\n // which only the sequencer can publish state roots. A window like this just reduces\\n // the chance of \\\"system breaking\\\" state roots being published while we're still in\\n // testing mode. This window should be removed or significantly reduced in the future.\\n require(\\n lastSequencerTimestamp + SEQUENCER_PUBLISH_WINDOW < block.timestamp,\\n \\\"Cannot publish state roots within the sequencer publication window.\\\"\\n );\\n }\\n\\n Lib_OVMCodec.ChainBatchHeader memory batchHeader = Lib_OVMCodec.ChainBatchHeader({\\n batchIndex: getTotalBatches(),\\n batchRoot: Lib_MerkleTree.getMerkleRoot(_batch),\\n batchSize: _batch.length,\\n prevTotalElements: totalElements,\\n extraData: _extraData\\n });\\n\\n emit StateBatchAppended(\\n batchHeader.batchIndex,\\n batchHeader.batchRoot,\\n batchHeader.batchSize,\\n batchHeader.prevTotalElements,\\n batchHeader.extraData\\n );\\n\\n batches().push(\\n Lib_OVMCodec.hashBatchHeader(batchHeader),\\n _makeBatchExtraData(\\n uint40(batchHeader.prevTotalElements + batchHeader.batchSize),\\n lastSequencerTimestamp\\n )\\n );\\n }\\n\\n /**\\n * Removes a batch and all subsequent batches from the chain.\\n * @param _batchHeader Header of the batch to remove.\\n */\\n function _deleteBatch(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n internal\\n {\\n require(\\n _batchHeader.batchIndex < batches().length(),\\n \\\"Invalid batch index.\\\"\\n );\\n\\n require(\\n _isValidBatchHeader(_batchHeader),\\n \\\"Invalid batch header.\\\"\\n );\\n\\n batches().deleteElementsAfterInclusive(\\n _batchHeader.batchIndex,\\n _makeBatchExtraData(\\n uint40(_batchHeader.prevTotalElements),\\n 0\\n )\\n );\\n\\n emit StateBatchDeleted(\\n _batchHeader.batchIndex,\\n _batchHeader.batchRoot\\n );\\n }\\n\\n /**\\n * Checks that a batch header matches the stored hash for the given index.\\n * @param _batchHeader Batch header to validate.\\n * @return Whether or not the header matches the stored one.\\n */\\n function _isValidBatchHeader(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n internal\\n view\\n returns (\\n bool\\n )\\n {\\n return Lib_OVMCodec.hashBatchHeader(_batchHeader) == batches().get(_batchHeader.batchIndex);\\n }\\n}\\n\",\"keccak256\":\"0xb93198fb1ea4469f21deb7329f5f0e1e3a826cd14a959fa4b8ffdd2cd325a715\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_CanonicalTransactionChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title iOVM_CanonicalTransactionChain\\n */\\ninterface iOVM_CanonicalTransactionChain {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event TransactionEnqueued(\\n address _l1TxOrigin,\\n address _target,\\n uint256 _gasLimit,\\n bytes _data,\\n uint256 _queueIndex,\\n uint256 _timestamp\\n );\\n\\n event QueueBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event SequencerBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event TransactionBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct BatchContext {\\n uint256 numSequencedTransactions;\\n uint256 numSubsequentQueueTransactions;\\n uint256 timestamp;\\n uint256 blockNumber;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements()\\n external\\n view\\n returns (\\n uint256 _totalElements\\n );\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches()\\n external\\n view\\n returns (\\n uint256 _totalBatches\\n );\\n\\n /**\\n * Returns the index of the next element to be enqueued.\\n * @return Index for the next queue element.\\n */\\n function getNextQueueIndex()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Get the number of queue elements which have not yet been included.\\n * @return Length of the queue.\\n */\\n function getNumPendingQueueElements()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Retrieves the length of the queue, including\\n * both pending and canonical transactions.\\n * @return Length of the queue.\\n */\\n function getQueueLength()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Gets the queue element at a particular index.\\n * @param _index Index of the queue element to access.\\n * @return _element Queue element at the given index.\\n */\\n function getQueueElement(\\n uint256 _index\\n )\\n external\\n view\\n returns (\\n Lib_OVMCodec.QueueElement memory _element\\n );\\n\\n /**\\n * Adds a transaction to the queue.\\n * @param _target Target contract to send the transaction to.\\n * @param _gasLimit Gas limit for the given transaction.\\n * @param _data Transaction data.\\n */\\n function enqueue(\\n address _target,\\n uint256 _gasLimit,\\n bytes memory _data\\n )\\n external;\\n\\n /**\\n * Appends a given number of queued transactions as a single batch.\\n * @param _numQueuedTransactions Number of transactions to append.\\n */\\n function appendQueueBatch(\\n uint256 _numQueuedTransactions\\n )\\n external;\\n\\n /**\\n * Allows the sequencer to append a batch of transactions.\\n * @dev This function uses a custom encoding scheme for efficiency reasons.\\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\\n * .param _contexts Array of batch contexts.\\n * .param _transactionDataFields Array of raw transaction data.\\n */\\n function appendSequencerBatch(\\n // uint40 _shouldStartAtElement,\\n // uint24 _totalElementsToAppend,\\n // BatchContext[] _contexts,\\n // bytes[] _transactionDataFields\\n )\\n external;\\n\\n /**\\n * Verifies whether a transaction is included in the chain.\\n * @param _transaction Transaction to verify.\\n * @param _txChainElement Transaction chain element corresponding to the transaction.\\n * @param _batchHeader Header of the batch the transaction was included in.\\n * @param _inclusionProof Inclusion proof for the provided transaction chain element.\\n * @return True if the transaction exists in the CTC, false if not.\\n */\\n function verifyTransaction(\\n Lib_OVMCodec.Transaction memory _transaction,\\n Lib_OVMCodec.TransactionChainElement memory _txChainElement,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _inclusionProof\\n )\\n external\\n view\\n returns (\\n bool\\n );\\n}\\n\",\"keccak256\":\"0x82a4e62286c8bc5e2d3de33f66d9b707cb9636e553dca54b5e95277bd794a934\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_ChainStorageContainer.sol\":{\"content\":\"pragma solidity ^0.7.0;\\n\\n/**\\n * @title iOVM_ChainStorageContainer\\n */\\ninterface iOVM_ChainStorageContainer {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata()\\n external\\n view\\n returns (\\n bytes27\\n );\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length()\\n external\\n view\\n returns (\\n uint256\\n );\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(\\n bytes32 _object\\n )\\n external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(\\n bytes32 _object,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Pushes two objects into the container at the same time. A useful optimization.\\n * @param _objectA First 32 byte value to insert into the container.\\n * @param _objectB Second 32 byte value to insert into the container.\\n */\\n function push2(\\n bytes32 _objectA,\\n bytes32 _objectB\\n )\\n external;\\n\\n /**\\n * Pushes two objects into the container at the same time. Also allows setting the global\\n * metadata field.\\n * @param _objectA First 32 byte value to insert into the container.\\n * @param _objectB Second 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push2(\\n bytes32 _objectA,\\n bytes32 _objectB,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(\\n uint256 _index\\n )\\n external\\n view\\n returns (\\n bytes32\\n );\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index\\n )\\n external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Marks an index as overwritable, meaing the underlying buffer can start to write values over\\n * any objects before and including the given index.\\n */\\n function setNextOverwritableIndex(\\n uint256 _index\\n )\\n external;\\n}\\n\",\"keccak256\":\"0xcfca7da85b35d94c27581c2460b0d48fd0cc51fa72670cc7a2f7f760fb21a2f0\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_StateCommitmentChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title iOVM_StateCommitmentChain\\n */\\ninterface iOVM_StateCommitmentChain {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event StateBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n event StateBatchDeleted(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot\\n );\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements()\\n external\\n view\\n returns (\\n uint256 _totalElements\\n );\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches()\\n external\\n view\\n returns (\\n uint256 _totalBatches\\n );\\n\\n /**\\n * Retrieves the timestamp of the last batch submitted by the sequencer.\\n * @return _lastSequencerTimestamp Last sequencer batch timestamp.\\n */\\n function getLastSequencerTimestamp()\\n external\\n view\\n returns (\\n uint256 _lastSequencerTimestamp\\n );\\n\\n /**\\n * Appends a batch of state roots to the chain.\\n * @param _batch Batch of state roots.\\n * @param _shouldStartAtElement Index of the element at which this batch should start.\\n */\\n function appendStateBatch(\\n bytes32[] calldata _batch,\\n uint256 _shouldStartAtElement\\n )\\n external;\\n\\n /**\\n * Deletes all state roots after (and including) a given batch.\\n * @param _batchHeader Header of the batch to start deleting from.\\n */\\n function deleteStateBatch(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n external;\\n\\n /**\\n * Verifies a batch inclusion proof.\\n * @param _element Hash of the element to verify a proof for.\\n * @param _batchHeader Header of the batch in which the element was included.\\n * @param _proof Merkle inclusion proof for the element.\\n */\\n function verifyStateCommitment(\\n bytes32 _element,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _proof\\n )\\n external\\n view\\n returns (\\n bool _verified\\n );\\n\\n /**\\n * Checks whether a given batch is still inside its fraud proof window.\\n * @param _batchHeader Header of the batch to check.\\n * @return _inside Whether or not the batch is inside the fraud proof window.\\n */\\n function insideFraudProofWindow(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n external\\n view\\n returns (\\n bool _inside\\n );\\n}\\n\",\"keccak256\":\"0x6646d6ff392b81aab52a7a277e91540819464751de0af5afd1962094b2e92448\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/verification/iOVM_BondManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\ninterface ERC20 {\\n function transfer(address, uint256) external returns (bool);\\n function transferFrom(address, address, uint256) external returns (bool);\\n}\\n\\n/// All the errors which may be encountered on the bond manager\\nlibrary Errors {\\n string constant ERC20_ERR = \\\"BondManager: Could not post bond\\\";\\n string constant ALREADY_FINALIZED = \\\"BondManager: Fraud proof for this pre-state root has already been finalized\\\";\\n string constant SLASHED = \\\"BondManager: Cannot finalize withdrawal, you probably got slashed\\\";\\n string constant WRONG_STATE = \\\"BondManager: Wrong bond state for proposer\\\";\\n string constant CANNOT_CLAIM = \\\"BondManager: Cannot claim yet. Dispute must be finalized first\\\";\\n\\n string constant WITHDRAWAL_PENDING = \\\"BondManager: Withdrawal already pending\\\";\\n string constant TOO_EARLY = \\\"BondManager: Too early to finalize your withdrawal\\\";\\n\\n string constant ONLY_TRANSITIONER = \\\"BondManager: Only the transitioner for this pre-state root may call this function\\\";\\n string constant ONLY_FRAUD_VERIFIER = \\\"BondManager: Only the fraud verifier may call this function\\\";\\n string constant ONLY_STATE_COMMITMENT_CHAIN = \\\"BondManager: Only the state commitment chain may call this function\\\";\\n string constant WAIT_FOR_DISPUTES = \\\"BondManager: Wait for other potential disputes\\\";\\n}\\n\\n/**\\n * @title iOVM_BondManager\\n */\\ninterface iOVM_BondManager {\\n\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n /// The lifecycle of a proposer's bond\\n enum State {\\n // Before depositing or after getting slashed, a user is uncollateralized\\n NOT_COLLATERALIZED,\\n // After depositing, a user is collateralized\\n COLLATERALIZED,\\n // After a user has initiated a withdrawal\\n WITHDRAWING\\n }\\n\\n /// A bond posted by a proposer\\n struct Bond {\\n // The user's state\\n State state;\\n // The timestamp at which a proposer issued their withdrawal request\\n uint32 withdrawalTimestamp;\\n // The time when the first disputed was initiated for this bond\\n uint256 firstDisputeAt;\\n // The earliest observed state root for this bond which has had fraud\\n bytes32 earliestDisputedStateRoot;\\n // The state root's timestamp\\n uint256 earliestTimestamp;\\n }\\n\\n // Per pre-state root, store the number of state provisions that were made\\n // and how many of these calls were made by each user. Payouts will then be\\n // claimed by users proportionally for that dispute.\\n struct Rewards {\\n // Flag to check if rewards for a fraud proof are claimable\\n bool canClaim;\\n // Total number of `recordGasSpent` calls made\\n uint256 total;\\n // The gas spent by each user to provide witness data. The sum of all\\n // values inside this map MUST be equal to the value of `total`\\n mapping(address => uint256) gasSpent;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function recordGasSpent(\\n bytes32 _preStateRoot,\\n bytes32 _txHash,\\n address _who,\\n uint256 _gasSpent\\n ) external;\\n\\n function finalize(\\n bytes32 _preStateRoot,\\n address _publisher,\\n uint256 _timestamp\\n ) external;\\n\\n function deposit() external;\\n\\n function startWithdrawal() external;\\n\\n function finalizeWithdrawal() external;\\n\\n function claim(\\n address _who\\n ) external;\\n\\n function isCollateralized(\\n address _who\\n ) external view returns (bool);\\n\\n function getGasSpent(\\n bytes32 _preStateRoot,\\n address _who\\n ) external view returns (uint256);\\n}\\n\",\"keccak256\":\"0x3c2a8a399487857158649db1896749d86e39cba545a8aeb2e2bb0f3bdfa7a5b1\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/verification/iOVM_FraudVerifier.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_StateTransitioner } from \\\"./iOVM_StateTransitioner.sol\\\";\\n\\n/**\\n * @title iOVM_FraudVerifier\\n */\\ninterface iOVM_FraudVerifier {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event FraudProofInitialized(\\n bytes32 _preStateRoot,\\n uint256 _preStateRootIndex,\\n bytes32 _transactionHash,\\n address _who\\n );\\n\\n event FraudProofFinalized(\\n bytes32 _preStateRoot,\\n uint256 _preStateRootIndex,\\n bytes32 _transactionHash,\\n address _who\\n );\\n\\n\\n /***************************************\\n * Public Functions: Transition Status *\\n ***************************************/\\n\\n function getStateTransitioner(bytes32 _preStateRoot, bytes32 _txHash) external view returns (iOVM_StateTransitioner _transitioner);\\n\\n\\n /****************************************\\n * Public Functions: Fraud Verification *\\n ****************************************/\\n\\n function initializeFraudVerification(\\n bytes32 _preStateRoot,\\n Lib_OVMCodec.ChainBatchHeader calldata _preStateRootBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof calldata _preStateRootProof,\\n Lib_OVMCodec.Transaction calldata _transaction,\\n Lib_OVMCodec.TransactionChainElement calldata _txChainElement,\\n Lib_OVMCodec.ChainBatchHeader calldata _transactionBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof calldata _transactionProof\\n ) external;\\n\\n function finalizeFraudVerification(\\n bytes32 _preStateRoot,\\n Lib_OVMCodec.ChainBatchHeader calldata _preStateRootBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof calldata _preStateRootProof,\\n bytes32 _txHash,\\n bytes32 _postStateRoot,\\n Lib_OVMCodec.ChainBatchHeader calldata _postStateRootBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof calldata _postStateRootProof\\n ) external;\\n}\\n\",\"keccak256\":\"0x5efd7bb18164bbd3e9d58379e8203fbf2a7ee802b1a48dff3ceaaec1523b1751\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/verification/iOVM_StateTransitioner.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title iOVM_StateTransitioner\\n */\\ninterface iOVM_StateTransitioner {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AccountCommitted(\\n address _address\\n );\\n\\n event ContractStorageCommitted(\\n address _address,\\n bytes32 _key\\n );\\n\\n\\n /**********************************\\n * Public Functions: State Access *\\n **********************************/\\n\\n function getPreStateRoot() external view returns (bytes32 _preStateRoot);\\n function getPostStateRoot() external view returns (bytes32 _postStateRoot);\\n function isComplete() external view returns (bool _complete);\\n\\n\\n /***********************************\\n * Public Functions: Pre-Execution *\\n ***********************************/\\n\\n function proveContractState(\\n address _ovmContractAddress,\\n address _ethContractAddress,\\n bytes calldata _stateTrieWitness\\n ) external;\\n\\n function proveStorageSlot(\\n address _ovmContractAddress,\\n bytes32 _key,\\n bytes calldata _storageTrieWitness\\n ) external;\\n\\n\\n /*******************************\\n * Public Functions: Execution *\\n *******************************/\\n\\n function applyTransaction(\\n Lib_OVMCodec.Transaction calldata _transaction\\n ) external;\\n\\n\\n /************************************\\n * Public Functions: Post-Execution *\\n ************************************/\\n\\n function commitContractState(\\n address _ovmContractAddress,\\n bytes calldata _stateTrieWitness\\n ) external;\\n\\n function commitStorageSlot(\\n address _ovmContractAddress,\\n bytes32 _key,\\n bytes calldata _storageTrieWitness\\n ) external;\\n\\n\\n /**********************************\\n * Public Functions: Finalization *\\n **********************************/\\n\\n function completeTransition() external;\\n}\\n\",\"keccak256\":\"0x3d044ac0a3bb6ad3d529f904b3191117511f9c379678ca03010e1ebdfcb5c34b\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/codec/Lib_OVMCodec.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../utils/Lib_Bytes32Utils.sol\\\";\\nimport { Lib_SafeExecutionManagerWrapper } from \\\"../../libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\\\";\\n\\n/**\\n * @title Lib_OVMCodec\\n */\\nlibrary Lib_OVMCodec {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n bytes constant internal RLP_NULL_BYTES = hex'80';\\n bytes constant internal NULL_BYTES = bytes('');\\n\\n // Ring buffer IDs\\n bytes32 constant internal RING_BUFFER_SCC_BATCHES = keccak256(\\\"RING_BUFFER_SCC_BATCHES\\\");\\n bytes32 constant internal RING_BUFFER_CTC_BATCHES = keccak256(\\\"RING_BUFFER_CTC_BATCHES\\\");\\n bytes32 constant internal RING_BUFFER_CTC_QUEUE = keccak256(\\\"RING_BUFFER_CTC_QUEUE\\\");\\n\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum EOASignatureType {\\n EIP155_TRANSACTON,\\n ETH_SIGNED_MESSAGE\\n }\\n\\n enum QueueOrigin {\\n SEQUENCER_QUEUE,\\n L1TOL2_QUEUE\\n }\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Account {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n address ethAddress;\\n bool isFresh;\\n }\\n\\n struct EVMAccount {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n }\\n\\n struct ChainBatchHeader {\\n uint256 batchIndex;\\n bytes32 batchRoot;\\n uint256 batchSize;\\n uint256 prevTotalElements;\\n bytes extraData;\\n }\\n\\n struct ChainInclusionProof {\\n uint256 index;\\n bytes32[] siblings;\\n }\\n\\n struct Transaction {\\n uint256 timestamp;\\n uint256 blockNumber;\\n QueueOrigin l1QueueOrigin;\\n address l1TxOrigin;\\n address entrypoint;\\n uint256 gasLimit;\\n bytes data;\\n }\\n\\n struct TransactionChainElement {\\n bool isSequenced;\\n uint256 queueIndex; // QUEUED TX ONLY\\n uint256 timestamp; // SEQUENCER TX ONLY\\n uint256 blockNumber; // SEQUENCER TX ONLY\\n bytes txData; // SEQUENCER TX ONLY\\n }\\n\\n struct QueueElement {\\n bytes32 queueRoot;\\n uint40 timestamp;\\n uint40 blockNumber;\\n }\\n\\n struct EIP155Transaction {\\n uint256 nonce;\\n uint256 gasPrice;\\n uint256 gasLimit;\\n address to;\\n uint256 value;\\n bytes data;\\n uint256 chainId;\\n }\\n\\n\\n /*********************************************\\n * Internal Functions: Encoding and Decoding *\\n *********************************************/\\n\\n /**\\n * Decodes an EOA transaction (i.e., native Ethereum RLP encoding).\\n * @param _transaction Encoded EOA transaction.\\n * @return _decoded Transaction decoded into a struct.\\n */\\n function decodeEIP155Transaction(\\n bytes memory _transaction,\\n bool _isEthSignedMessage\\n )\\n internal\\n pure\\n returns (\\n EIP155Transaction memory _decoded\\n )\\n {\\n if (_isEthSignedMessage) {\\n (\\n uint256 _nonce,\\n uint256 _gasLimit,\\n uint256 _gasPrice,\\n uint256 _chainId,\\n address _to,\\n bytes memory _data\\n ) = abi.decode(\\n _transaction,\\n (uint256, uint256, uint256, uint256, address ,bytes)\\n );\\n return EIP155Transaction({\\n nonce: _nonce,\\n gasPrice: _gasPrice,\\n gasLimit: _gasLimit,\\n to: _to,\\n value: 0,\\n data: _data,\\n chainId: _chainId\\n });\\n } else {\\n Lib_RLPReader.RLPItem[] memory decoded = Lib_RLPReader.readList(_transaction);\\n\\n return EIP155Transaction({\\n nonce: Lib_RLPReader.readUint256(decoded[0]),\\n gasPrice: Lib_RLPReader.readUint256(decoded[1]),\\n gasLimit: Lib_RLPReader.readUint256(decoded[2]),\\n to: Lib_RLPReader.readAddress(decoded[3]),\\n value: Lib_RLPReader.readUint256(decoded[4]),\\n data: Lib_RLPReader.readBytes(decoded[5]),\\n chainId: Lib_RLPReader.readUint256(decoded[6])\\n });\\n }\\n }\\n\\n function decompressEIP155Transaction(\\n bytes memory _transaction\\n )\\n internal\\n returns (\\n EIP155Transaction memory _decompressed\\n )\\n {\\n return EIP155Transaction({\\n gasLimit: Lib_BytesUtils.toUint24(_transaction, 0),\\n gasPrice: uint256(Lib_BytesUtils.toUint24(_transaction, 3)) * 1000000,\\n nonce: Lib_BytesUtils.toUint24(_transaction, 6),\\n to: Lib_BytesUtils.toAddress(_transaction, 9),\\n data: Lib_BytesUtils.slice(_transaction, 29),\\n chainId: Lib_SafeExecutionManagerWrapper.safeCHAINID(),\\n value: 0\\n });\\n }\\n\\n /**\\n * Encodes an EOA transaction back into the original transaction.\\n * @param _transaction EIP155transaction to encode.\\n * @param _isEthSignedMessage Whether or not this was an eth signed message.\\n * @return Encoded transaction.\\n */\\n function encodeEIP155Transaction(\\n EIP155Transaction memory _transaction,\\n bool _isEthSignedMessage\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n if (_isEthSignedMessage) {\\n return abi.encode(\\n _transaction.nonce,\\n _transaction.gasLimit,\\n _transaction.gasPrice,\\n _transaction.chainId,\\n _transaction.to,\\n _transaction.data\\n );\\n } else {\\n bytes[] memory raw = new bytes[](9);\\n\\n raw[0] = Lib_RLPWriter.writeUint(_transaction.nonce);\\n raw[1] = Lib_RLPWriter.writeUint(_transaction.gasPrice);\\n raw[2] = Lib_RLPWriter.writeUint(_transaction.gasLimit);\\n if (_transaction.to == address(0)) {\\n raw[3] = Lib_RLPWriter.writeBytes('');\\n } else {\\n raw[3] = Lib_RLPWriter.writeAddress(_transaction.to);\\n }\\n raw[4] = Lib_RLPWriter.writeUint(0);\\n raw[5] = Lib_RLPWriter.writeBytes(_transaction.data);\\n raw[6] = Lib_RLPWriter.writeUint(_transaction.chainId);\\n raw[7] = Lib_RLPWriter.writeBytes(bytes(''));\\n raw[8] = Lib_RLPWriter.writeBytes(bytes(''));\\n\\n return Lib_RLPWriter.writeList(raw);\\n }\\n }\\n\\n /**\\n * Encodes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return _encoded Encoded transaction bytes.\\n */\\n function encodeTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes memory _encoded\\n )\\n {\\n return abi.encodePacked(\\n _transaction.timestamp,\\n _transaction.blockNumber,\\n _transaction.l1QueueOrigin,\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n );\\n }\\n\\n /**\\n * Hashes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return _hash Hashed transaction\\n */\\n function hashTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes32 _hash\\n )\\n {\\n return keccak256(encodeTransaction(_transaction));\\n }\\n\\n /**\\n * Converts an OVM account to an EVM account.\\n * @param _in OVM account to convert.\\n * @return _out Converted EVM account.\\n */\\n function toEVMAccount(\\n Account memory _in\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory _out\\n )\\n {\\n return EVMAccount({\\n nonce: _in.nonce,\\n balance: _in.balance,\\n storageRoot: _in.storageRoot,\\n codeHash: _in.codeHash\\n });\\n }\\n\\n /**\\n * @notice RLP-encodes an account state struct.\\n * @param _account Account state struct.\\n * @return _encoded RLP-encoded account state.\\n */\\n function encodeEVMAccount(\\n EVMAccount memory _account\\n )\\n internal\\n pure\\n returns (\\n bytes memory _encoded\\n )\\n {\\n bytes[] memory raw = new bytes[](4);\\n\\n // Unfortunately we can't create this array outright because\\n // Lib_RLPWriter.writeList will reject fixed-size arrays. Assigning\\n // index-by-index circumvents this issue.\\n raw[0] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.nonce)\\n )\\n );\\n raw[1] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.balance)\\n )\\n );\\n raw[2] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.storageRoot));\\n raw[3] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.codeHash));\\n\\n return Lib_RLPWriter.writeList(raw);\\n }\\n\\n /**\\n * @notice Decodes an RLP-encoded account state into a useful struct.\\n * @param _encoded RLP-encoded account state.\\n * @return _account Account state struct.\\n */\\n function decodeEVMAccount(\\n bytes memory _encoded\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory _account\\n )\\n {\\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\\n\\n return EVMAccount({\\n nonce: Lib_RLPReader.readUint256(accountState[0]),\\n balance: Lib_RLPReader.readUint256(accountState[1]),\\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\\n });\\n }\\n\\n /**\\n * Calculates a hash for a given batch header.\\n * @param _batchHeader Header to hash.\\n * @return _hash Hash of the header.\\n */\\n function hashBatchHeader(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n internal\\n pure\\n returns (\\n bytes32 _hash\\n )\\n {\\n return keccak256(\\n abi.encode(\\n _batchHeader.batchRoot,\\n _batchHeader.batchSize,\\n _batchHeader.prevTotalElements,\\n _batchHeader.extraData\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0x19d78734777b4998f1544e235cf3934f20c5055cd76c2bd60bf0f6dacdd72b3a\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// +build ovm\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Contract Imports */\\nimport { Ownable } from \\\"./Lib_Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n /*******************************************\\n * Contract Variables: Internal Accounting *\\n *******************************************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n public\\n onlyOwner\\n {\\n emit AddressSet(_name, _address);\\n addresses[_getNameHash(_name)] = _address;\\n }\\n\\n function getAddress(\\n string memory _name\\n )\\n public\\n view\\n returns (address)\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32 _hash\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xdf802e1cc6474df913626991e9fca3835c620a519f397afe04bf9c260e723257\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// +build ovm\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\ncontract Lib_AddressResolver {\\n\\n /*******************************************\\n * Contract Variables: Contract References *\\n *******************************************/\\n\\n Lib_AddressManager internal libAddressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(\\n address _libAddressManager\\n ) public {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function resolve(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address _contract\\n )\\n {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0xf3b9d78b309ddeec259ce3e0e1cfdef3ca40938e9a81971b28ce2b8ea327f533\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// +build ovm\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Ownable\\n * @dev Adapted from https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol\\n */\\nabstract contract Ownable {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n address public owner;\\n\\n\\n /**********\\n * Events *\\n **********/\\n\\n event OwnershipTransferred(\\n address indexed previousOwner,\\n address indexed newOwner\\n );\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n constructor() internal {\\n owner = msg.sender;\\n emit OwnershipTransferred(address(0), owner);\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n owner == msg.sender,\\n \\\"Ownable: caller is not the owner\\\"\\n );\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function renounceOwnership()\\n public\\n virtual\\n onlyOwner\\n {\\n emit OwnershipTransferred(owner, address(0));\\n owner = address(0);\\n }\\n\\n function transferOwnership(address _newOwner)\\n public\\n virtual\\n onlyOwner\\n {\\n require(\\n _newOwner != address(0),\\n \\\"Ownable: new owner cannot be the zero address\\\"\\n );\\n\\n emit OwnershipTransferred(owner, _newOwner);\\n owner = _newOwner;\\n }\\n}\\n\",\"keccak256\":\"0xe0409fbd236d16ca6be439d9d97dd36d0d9a0697ee0062d49588b9d29c248e47\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPReader.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.7.0;\\n\\n/**\\n * @title Lib_RLPReader\\n * @dev Adapted from \\\"RLPReader\\\" by Hamdi Allam (hamdi.allam97@gmail.com).\\n */\\nlibrary Lib_RLPReader {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 constant internal MAX_LIST_LENGTH = 32;\\n\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum RLPItemType {\\n DATA_ITEM,\\n LIST_ITEM\\n }\\n\\n \\n /***********\\n * Structs *\\n ***********/\\n\\n struct RLPItem {\\n uint256 length;\\n uint256 ptr;\\n }\\n \\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n \\n /**\\n * Converts bytes to a reference to memory position and length.\\n * @param _in Input bytes to convert.\\n * @return Output memory reference.\\n */\\n function toRLPItem(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem memory\\n )\\n {\\n uint256 ptr;\\n assembly {\\n ptr := add(_in, 32)\\n }\\n\\n return RLPItem({\\n length: _in.length,\\n ptr: ptr\\n });\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n (\\n uint256 listOffset,\\n ,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.LIST_ITEM,\\n \\\"Invalid RLP list value.\\\"\\n );\\n\\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\\n // writing to the length. Since we can't know the number of RLP items without looping over\\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\\n // simply set a reasonable maximum list length and decrease the size before we finish.\\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\\n\\n uint256 itemCount = 0;\\n uint256 offset = listOffset;\\n while (offset < _in.length) {\\n require(\\n itemCount < MAX_LIST_LENGTH,\\n \\\"Provided RLP list exceeds max list length.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n ) = _decodeLength(RLPItem({\\n length: _in.length - offset,\\n ptr: _in.ptr + offset\\n }));\\n\\n out[itemCount] = RLPItem({\\n length: itemLength + itemOffset,\\n ptr: _in.ptr + offset\\n });\\n\\n itemCount += 1;\\n offset += itemOffset + itemLength;\\n }\\n\\n // Decrease the array size to match the actual item count.\\n assembly {\\n mstore(out, itemCount)\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n return readList(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes value.\\\"\\n );\\n\\n return _copy(_in.ptr, itemOffset, itemLength);\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return readBytes(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return string(readBytes(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return readString(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n require(\\n _in.length <= 33,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr + itemOffset;\\n bytes32 out;\\n assembly {\\n out := mload(ptr)\\n\\n // Shift the bytes over to match the item size.\\n if lt(itemLength, 32) {\\n out := div(out, exp(256, sub(32, itemLength)))\\n }\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return readBytes32(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return uint256(readBytes32(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return readUint256(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n require(\\n _in.length == 1,\\n \\\"Invalid RLP boolean value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 out;\\n assembly {\\n out := byte(0, mload(ptr))\\n }\\n\\n return out != 0;\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return readBool(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n if (_in.length == 1) {\\n return address(0);\\n }\\n\\n require(\\n _in.length == 21,\\n \\\"Invalid RLP address value.\\\"\\n );\\n\\n return address(readUint256(_in));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return readAddress(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads the raw bytes of an RLP item.\\n * @param _in RLP item to read.\\n * @return Raw RLP bytes.\\n */\\n function readRawBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in);\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Decodes the length of an RLP item.\\n * @param _in RLP item to decode.\\n * @return Offset of the encoded data.\\n * @return Length of the encoded data.\\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\\n */\\n function _decodeLength(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n uint256,\\n uint256,\\n RLPItemType\\n )\\n {\\n require(\\n _in.length > 0,\\n \\\"RLP item cannot be null.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 prefix;\\n assembly {\\n prefix := byte(0, mload(ptr))\\n }\\n\\n if (prefix <= 0x7f) {\\n // Single byte.\\n\\n return (0, 1, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xb7) {\\n // Short string.\\n\\n uint256 strLen = prefix - 0x80;\\n \\n require(\\n _in.length > strLen,\\n \\\"Invalid RLP short string.\\\"\\n );\\n\\n return (1, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xbf) {\\n // Long string.\\n uint256 lenOfStrLen = prefix - 0xb7;\\n\\n require(\\n _in.length > lenOfStrLen,\\n \\\"Invalid RLP long string length.\\\"\\n );\\n\\n uint256 strLen;\\n assembly {\\n // Pick out the string length.\\n strLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfStrLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfStrLen + strLen,\\n \\\"Invalid RLP long string.\\\"\\n );\\n\\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xf7) {\\n // Short list.\\n uint256 listLen = prefix - 0xc0;\\n\\n require(\\n _in.length > listLen,\\n \\\"Invalid RLP short list.\\\"\\n );\\n\\n return (1, listLen, RLPItemType.LIST_ITEM);\\n } else {\\n // Long list.\\n uint256 lenOfListLen = prefix - 0xf7;\\n\\n require(\\n _in.length > lenOfListLen,\\n \\\"Invalid RLP long list length.\\\"\\n );\\n\\n uint256 listLen;\\n assembly {\\n // Pick out the list length.\\n listLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfListLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfListLen + listLen,\\n \\\"Invalid RLP long list.\\\"\\n );\\n\\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\\n }\\n }\\n\\n /**\\n * Copies the bytes from a memory location.\\n * @param _src Pointer to the location to read from.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Copied bytes.\\n */\\n function _copy(\\n uint256 _src,\\n uint256 _offset,\\n uint256 _length\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out = new bytes(_length);\\n if (out.length == 0) {\\n return out;\\n }\\n\\n uint256 src = _src + _offset;\\n uint256 dest;\\n assembly {\\n dest := add(out, 32)\\n }\\n\\n // Copy over as many complete words as we can.\\n for (uint256 i = 0; i < _length / 32; i++) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n\\n src += 32;\\n dest += 32;\\n }\\n\\n // Pick out the remaining bytes.\\n uint256 mask = 256 ** (32 - (_length % 32)) - 1;\\n assembly {\\n mstore(\\n dest,\\n or(\\n and(mload(src), not(mask)),\\n and(mload(dest), mask)\\n )\\n )\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Copies an RLP item into bytes.\\n * @param _in RLP item to copy.\\n * @return Copied bytes.\\n */\\n function _copy(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in.ptr, 0, _in.length);\\n }\\n}\\n\",\"keccak256\":\"0x8338f7b6e5f0ded8fc36d9088fd127ee53ae4040ca3f4838eb6123f642d38c62\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPWriter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.7.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\n\\n/**\\n * @title Lib_RLPWriter\\n * @author Bakaoh (with modifications)\\n */\\nlibrary Lib_RLPWriter {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * RLP encodes a byte string.\\n * @param _in The byte string to encode.\\n * @return _out The RLP encoded string in bytes.\\n */\\n function writeBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n bytes memory encoded;\\n\\n if (_in.length == 1 && uint8(_in[0]) < 128) {\\n encoded = _in;\\n } else {\\n encoded = Lib_BytesUtils.concat(_writeLength(_in.length, 128), _in);\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * RLP encodes a list of RLP encoded byte byte strings.\\n * @param _in The list of RLP encoded byte strings.\\n * @return _out The RLP encoded list of items in bytes.\\n */\\n function writeList(\\n bytes[] memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n bytes memory list = _flatten(_in);\\n return Lib_BytesUtils.concat(_writeLength(list.length, 192), list);\\n }\\n\\n /**\\n * RLP encodes a string.\\n * @param _in The string to encode.\\n * @return _out The RLP encoded string in bytes.\\n */\\n function writeString(\\n string memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(bytes(_in));\\n }\\n\\n /**\\n * RLP encodes an address.\\n * @param _in The address to encode.\\n * @return _out The RLP encoded address in bytes.\\n */\\n function writeAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a uint.\\n * @param _in The uint256 to encode.\\n * @return _out The RLP encoded uint256 in bytes.\\n */\\n function writeUint(\\n uint256 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(_toBinary(_in));\\n }\\n\\n /**\\n * RLP encodes a bool.\\n * @param _in The bool to encode.\\n * @return _out The RLP encoded bool in bytes.\\n */\\n function writeBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n bytes memory encoded = new bytes(1);\\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\\n return encoded;\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\\n * @param _len The length of the string or the payload.\\n * @param _offset 128 if item is string, 192 if item is list.\\n * @return _encoded RLP encoded bytes.\\n */\\n function _writeLength(\\n uint256 _len,\\n uint256 _offset\\n )\\n private\\n pure\\n returns (\\n bytes memory _encoded\\n )\\n {\\n bytes memory encoded;\\n\\n if (_len < 56) {\\n encoded = new bytes(1);\\n encoded[0] = byte(uint8(_len) + uint8(_offset));\\n } else {\\n uint256 lenLen;\\n uint256 i = 1;\\n while (_len / i != 0) {\\n lenLen++;\\n i *= 256;\\n }\\n\\n encoded = new bytes(lenLen + 1);\\n encoded[0] = byte(uint8(lenLen) + uint8(_offset) + 55);\\n for(i = 1; i <= lenLen; i++) {\\n encoded[i] = byte(uint8((_len / (256**(lenLen-i))) % 256));\\n }\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * Encode integer in big endian binary form with no leading zeroes.\\n * @notice TODO: This should be optimized with assembly to save gas costs.\\n * @param _x The integer to encode.\\n * @return _binary RLP encoded bytes.\\n */\\n function _toBinary(\\n uint256 _x\\n )\\n private\\n pure\\n returns (\\n bytes memory _binary\\n )\\n {\\n bytes memory b = abi.encodePacked(_x);\\n\\n uint256 i = 0;\\n for (; i < 32; i++) {\\n if (b[i] != 0) {\\n break;\\n }\\n }\\n\\n bytes memory res = new bytes(32 - i);\\n for (uint256 j = 0; j < res.length; j++) {\\n res[j] = b[i++];\\n }\\n\\n return res;\\n }\\n\\n /**\\n * Copies a piece of memory to another location.\\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\\n * @param _dest Destination location.\\n * @param _src Source location.\\n * @param _len Length of memory to copy.\\n */\\n function _memcpy(\\n uint256 _dest,\\n uint256 _src,\\n uint256 _len\\n )\\n private\\n pure\\n {\\n uint256 dest = _dest;\\n uint256 src = _src;\\n uint256 len = _len;\\n\\n for(; len >= 32; len -= 32) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n dest += 32;\\n src += 32;\\n }\\n\\n uint256 mask = 256 ** (32 - len) - 1;\\n assembly {\\n let srcpart := and(mload(src), not(mask))\\n let destpart := and(mload(dest), mask)\\n mstore(dest, or(destpart, srcpart))\\n }\\n }\\n\\n /**\\n * Flattens a list of byte strings into one byte string.\\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\\n * @param _list List of byte strings to flatten.\\n * @return _flattened The flattened byte string.\\n */\\n function _flatten(\\n bytes[] memory _list\\n )\\n private\\n pure\\n returns (\\n bytes memory _flattened\\n )\\n {\\n if (_list.length == 0) {\\n return new bytes(0);\\n }\\n\\n uint256 len;\\n uint256 i = 0;\\n for (; i < _list.length; i++) {\\n len += _list[i].length;\\n }\\n\\n bytes memory flattened = new bytes(len);\\n uint256 flattenedPtr;\\n assembly { flattenedPtr := add(flattened, 0x20) }\\n\\n for(i = 0; i < _list.length; i++) {\\n bytes memory item = _list[i];\\n\\n uint256 listPtr;\\n assembly { listPtr := add(item, 0x20)}\\n\\n _memcpy(flattenedPtr, listPtr, item.length);\\n flattenedPtr += _list[i].length;\\n }\\n\\n return flattened;\\n }\\n}\",\"keccak256\":\"0x6d1aaef567f8a91bb965b95a95637f433a1f0ac4cf0bc1e209cdb1dd5b0f204b\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_Bytes32Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.7.0;\\n\\n/**\\n * @title Lib_Byte32Utils\\n */\\nlibrary Lib_Bytes32Utils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function toBool(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bool _out\\n )\\n {\\n return _in != 0;\\n }\\n\\n function fromBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes32 _out\\n )\\n {\\n return bytes32(uint256(_in ? 1 : 0));\\n }\\n\\n function toAddress(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n address _out\\n )\\n {\\n return address(uint160(uint256(_in)));\\n }\\n\\n function fromAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes32 _out\\n )\\n {\\n return bytes32(uint256(_in));\\n }\\n\\n function removeLeadingZeros(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n bytes memory out;\\n\\n assembly {\\n // Figure out how many leading zero bytes to remove.\\n let shift := 0\\n for { let i := 0 } and(lt(i, 32), eq(byte(i, _in), 0)) { i := add(i, 1) } {\\n shift := add(shift, 1)\\n }\\n\\n // Reserve some space for our output and fix the free memory pointer.\\n out := mload(0x40)\\n mstore(0x40, add(out, 0x40))\\n\\n // Shift the value and store it into the output bytes.\\n mstore(add(out, 0x20), shl(mul(shift, 8), _in))\\n\\n // Store the new size (with leading zero bytes removed) in the output byte size.\\n mstore(out, sub(32, shift))\\n }\\n\\n return out;\\n }\\n}\\n\",\"keccak256\":\"0x06f97590a80a01daa3bf6aa795449aea91a78684c646b4a6caeece8ef919c80c\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_BytesUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.7.0;\\n\\n/**\\n * @title Lib_BytesUtils\\n */\\nlibrary Lib_BytesUtils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function concat(\\n bytes memory _preBytes,\\n bytes memory _postBytes\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n bytes memory tempBytes;\\n\\n assembly {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // Store the length of the first bytes array at the beginning of\\n // the memory for tempBytes.\\n let length := mload(_preBytes)\\n mstore(tempBytes, length)\\n\\n // Maintain a memory counter for the current write location in the\\n // temp bytes array by adding the 32 bytes for the array length to\\n // the starting location.\\n let mc := add(tempBytes, 0x20)\\n // Stop copying when the memory counter reaches the length of the\\n // first bytes array.\\n let end := add(mc, length)\\n\\n for {\\n // Initialize a copy counter to the start of the _preBytes data,\\n // 32 bytes into its memory.\\n let cc := add(_preBytes, 0x20)\\n } lt(mc, end) {\\n // Increase both counters by 32 bytes each iteration.\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n // Write the _preBytes data into the tempBytes memory 32 bytes\\n // at a time.\\n mstore(mc, mload(cc))\\n }\\n\\n // Add the length of _postBytes to the current length of tempBytes\\n // and store it as the new length in the first 32 bytes of the\\n // tempBytes memory.\\n length := mload(_postBytes)\\n mstore(tempBytes, add(length, mload(tempBytes)))\\n\\n // Move the memory counter back from a multiple of 0x20 to the\\n // actual end of the _preBytes data.\\n mc := end\\n // Stop copying when the memory counter reaches the new combined\\n // length of the arrays.\\n end := add(mc, length)\\n\\n for {\\n let cc := add(_postBytes, 0x20)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n // Update the free-memory pointer by padding our last write location\\n // to 32 bytes: add 31 bytes to the end of tempBytes to move to the\\n // next 32 byte block, then round down to the nearest multiple of\\n // 32. If the sum of the length of the two arrays is zero then add\\n // one before rounding down to leave a blank 32 bytes (the length block with 0).\\n mstore(0x40, and(\\n add(add(end, iszero(add(length, mload(_preBytes)))), 31),\\n not(31) // Round down to the nearest 32 bytes.\\n ))\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_start + _length >= _start, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n if (_bytes.length - _start == 0) {\\n return bytes('');\\n }\\n\\n return slice(_bytes, _start, _bytes.length - _start);\\n }\\n\\n function toBytes32PadLeft(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes32)\\n {\\n bytes32 ret;\\n uint256 len = _bytes.length <= 32 ? _bytes.length : 32;\\n assembly {\\n ret := shr(mul(sub(32, len), 8), mload(add(_bytes, 32)))\\n }\\n return ret;\\n }\\n\\n function toBytes32(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes32)\\n {\\n if (_bytes.length < 32) {\\n bytes32 ret;\\n assembly {\\n ret := mload(add(_bytes, 32))\\n }\\n return ret;\\n }\\n\\n return abi.decode(_bytes,(bytes32)); // will truncate if input length > 32 bytes\\n }\\n\\n function toUint256(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (uint256)\\n {\\n return uint256(toBytes32(_bytes));\\n }\\n\\n function toUint24(bytes memory _bytes, uint256 _start) internal pure returns (uint24) {\\n require(_start + 3 >= _start, \\\"toUint24_overflow\\\");\\n require(_bytes.length >= _start + 3 , \\\"toUint24_outOfBounds\\\");\\n uint24 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x3), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toUint8(bytes memory _bytes, uint256 _start) internal pure returns (uint8) {\\n require(_start + 1 >= _start, \\\"toUint8_overflow\\\");\\n require(_bytes.length >= _start + 1 , \\\"toUint8_outOfBounds\\\");\\n uint8 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x1), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toAddress(bytes memory _bytes, uint256 _start) internal pure returns (address) {\\n require(_start + 20 >= _start, \\\"toAddress_overflow\\\");\\n require(_bytes.length >= _start + 20, \\\"toAddress_outOfBounds\\\");\\n address tempAddress;\\n\\n assembly {\\n tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000)\\n }\\n\\n return tempAddress;\\n }\\n\\n function toNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n bytes memory nibbles = new bytes(_bytes.length * 2);\\n\\n for (uint256 i = 0; i < _bytes.length; i++) {\\n nibbles[i * 2] = _bytes[i] >> 4;\\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\\n }\\n\\n return nibbles;\\n }\\n\\n function fromNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n bytes memory ret = new bytes(_bytes.length / 2);\\n\\n for (uint256 i = 0; i < ret.length; i++) {\\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\\n }\\n\\n return ret;\\n }\\n\\n function equal(\\n bytes memory _bytes,\\n bytes memory _other\\n )\\n internal\\n pure\\n returns (bool)\\n {\\n return keccak256(_bytes) == keccak256(_other);\\n }\\n}\\n\",\"keccak256\":\"0x849e4fedd81cd260e4c3b74b953f00636323574c60d363f36ab331e94aab9219\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_MerkleTree.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.7.0;\\n\\n/**\\n * @title Lib_MerkleTree\\n * @author River Keefer\\n */\\nlibrary Lib_MerkleTree {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Calculates a merkle root for a list of 32-byte leaf hashes. WARNING: If the number\\n * of leaves passed in is not a power of two, it pads out the tree with zero hashes.\\n * If you do not know the original length of elements for the tree you are verifying,\\n * then this may allow empty leaves past _elements.length to pass a verification check down the line.\\n * @param _elements Array of hashes from which to generate a merkle root.\\n * @return Merkle root of the leaves, with zero hashes for non-powers-of-two (see above).\\n */\\n function getMerkleRoot(\\n bytes32[] memory _elements\\n )\\n internal\\n view\\n returns (\\n bytes32\\n )\\n {\\n require(\\n _elements.length > 0,\\n \\\"Lib_MerkleTree: Must provide at least one leaf hash.\\\"\\n );\\n\\n if (_elements.length == 0) {\\n return _elements[0];\\n }\\n\\n uint256[16] memory defaults = [\\n 0x290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563,\\n 0x633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d,\\n 0x890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d,\\n 0x3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd8,\\n 0xecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da,\\n 0xdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da5,\\n 0x617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d7,\\n 0x292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead,\\n 0xe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e10,\\n 0x7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f82,\\n 0xe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e83636516,\\n 0x3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c,\\n 0xad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e,\\n 0xa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab,\\n 0x4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c862,\\n 0x2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf10\\n ];\\n\\n // Reserve memory space for our hashes.\\n bytes memory buf = new bytes(64);\\n\\n // We'll need to keep track of left and right siblings.\\n bytes32 leftSibling;\\n bytes32 rightSibling;\\n\\n // Number of non-empty nodes at the current depth.\\n uint256 rowSize = _elements.length;\\n\\n // Current depth, counting from 0 at the leaves\\n uint256 depth = 0;\\n\\n // Common sub-expressions\\n uint256 halfRowSize; // rowSize / 2\\n bool rowSizeIsOdd; // rowSize % 2 == 1\\n\\n while (rowSize > 1) {\\n halfRowSize = rowSize / 2;\\n rowSizeIsOdd = rowSize % 2 == 1;\\n\\n for (uint256 i = 0; i < halfRowSize; i++) {\\n leftSibling = _elements[(2 * i) ];\\n rightSibling = _elements[(2 * i) + 1];\\n assembly {\\n mstore(add(buf, 32), leftSibling )\\n mstore(add(buf, 64), rightSibling)\\n }\\n\\n _elements[i] = keccak256(buf);\\n }\\n\\n if (rowSizeIsOdd) {\\n leftSibling = _elements[rowSize - 1];\\n rightSibling = bytes32(defaults[depth]);\\n assembly {\\n mstore(add(buf, 32), leftSibling)\\n mstore(add(buf, 64), rightSibling)\\n }\\n\\n _elements[halfRowSize] = keccak256(buf);\\n }\\n\\n rowSize = halfRowSize + (rowSizeIsOdd ? 1 : 0);\\n depth++;\\n }\\n\\n return _elements[0];\\n }\\n\\n /**\\n * Verifies a merkle branch for the given leaf hash. Assumes the original length\\n * of leaves generated is a known, correct input, and does not return true for indices \\n * extending past that index (even if _siblings would be otherwise valid.)\\n * @param _root The Merkle root to verify against.\\n * @param _leaf The leaf hash to verify inclusion of.\\n * @param _index The index in the tree of this leaf.\\n * @param _siblings Array of sibline nodes in the inclusion proof, starting from depth 0 (bottom of the tree). \\n * @param _totalLeaves The total number of leaves originally passed into.\\n * @return Whether or not the merkle branch and leaf passes verification.\\n */\\n function verify(\\n bytes32 _root,\\n bytes32 _leaf,\\n uint256 _index,\\n bytes32[] memory _siblings,\\n uint256 _totalLeaves\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n require(\\n _totalLeaves > 0,\\n \\\"Lib_MerkleTree: Total leaves must be greater than zero.\\\"\\n );\\n\\n require(\\n _index < _totalLeaves,\\n \\\"Lib_MerkleTree: Index out of bounds.\\\"\\n );\\n\\n require(\\n _siblings.length == _ceilLog2(_totalLeaves),\\n \\\"Lib_MerkleTree: Total siblings does not correctly correspond to total leaves.\\\"\\n );\\n\\n bytes32 computedRoot = _leaf;\\n\\n for (uint256 i = 0; i < _siblings.length; i++) {\\n if ((_index & 1) == 1) {\\n computedRoot = keccak256(\\n abi.encodePacked(\\n _siblings[i],\\n computedRoot\\n )\\n );\\n } else {\\n computedRoot = keccak256(\\n abi.encodePacked(\\n computedRoot,\\n _siblings[i]\\n )\\n );\\n }\\n\\n _index >>= 1;\\n }\\n\\n return _root == computedRoot;\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Calculates the integer ceiling of the log base 2 of an input.\\n * @param _in Unsigned input to calculate the log.\\n * @return ceil(log_base_2(_in))\\n */\\n function _ceilLog2(\\n uint256 _in\\n )\\n private\\n pure\\n returns (\\n uint256\\n )\\n { \\n require(\\n _in > 0,\\n \\\"Lib_MerkleTree: Cannot compute ceil(log_2) of 0.\\\"\\n );\\n\\n if (_in == 1) {\\n return 0;\\n }\\n\\n // Find the highest set bit (will be floor(log_2)).\\n // Borrowed with <3 from https://github.com/ethereum/solidity-examples\\n uint256 val = _in;\\n uint256 highest = 0;\\n for (uint8 i = 128; i >= 1; i >>= 1) {\\n if (val & (uint(1) << i) - 1 << i != 0) {\\n highest += i;\\n val >>= i;\\n }\\n }\\n\\n // Increment by one if this is not a perfect logarithm.\\n if ((uint(1) << highest) != _in) {\\n highest += 1;\\n }\\n\\n return highest;\\n }\\n}\\n\",\"keccak256\":\"0x5a859eccd3c4e7e31db90f3022069a725d5389e16fbcace3fe653d6b0acf80f6\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.7.0;\\n\\n/**\\n * @title Lib_SafeExecutionManagerWrapper\\n */\\nlibrary Lib_SafeExecutionManagerWrapper {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Makes an ovmCALL and performs all the necessary safety checks.\\n * @param _gasLimit Gas limit for the call.\\n * @param _target Address to call.\\n * @param _calldata Data to send to the call.\\n * @return _success Whether or not the call reverted.\\n * @return _returndata Data returned by the call.\\n */\\n function safeCALL(\\n uint256 _gasLimit,\\n address _target,\\n bytes memory _calldata\\n )\\n internal\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCALL(uint256,address,bytes)\\\",\\n _gasLimit,\\n _target,\\n _calldata\\n )\\n );\\n\\n return abi.decode(returndata, (bool, bytes));\\n }\\n\\n /**\\n * Makes an ovmCALL and performs all the necessary safety checks.\\n * @param _gasLimit Gas limit for the call.\\n * @param _target Address to call.\\n * @param _calldata Data to send to the call.\\n * @return _success Whether or not the call reverted.\\n * @return _returndata Data returned by the call.\\n */\\n function safeDELEGATECALL(\\n uint256 _gasLimit,\\n address _target,\\n bytes memory _calldata\\n )\\n internal\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmDELEGATECALL(uint256,address,bytes)\\\",\\n _gasLimit,\\n _target,\\n _calldata\\n )\\n );\\n\\n return abi.decode(returndata, (bool, bytes));\\n }\\n\\n /**\\n * Performs an ovmCREATE and the necessary safety checks.\\n * @param _gasLimit Gas limit for the creation.\\n * @param _bytecode Code for the new contract.\\n * @return _contract Address of the created contract.\\n */\\n function safeCREATE(\\n uint256 _gasLimit,\\n bytes memory _bytecode\\n )\\n internal\\n returns (\\n address _contract\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n _gasLimit,\\n abi.encodeWithSignature(\\n \\\"ovmCREATE(bytes)\\\",\\n _bytecode\\n )\\n );\\n\\n return abi.decode(returndata, (address));\\n }\\n\\n /**\\n * Performs an ovmEXTCODESIZE and the necessary safety checks.\\n * @param _contract Address of the contract to query the size of.\\n * @return _EXTCODESIZE Size of the requested contract in bytes.\\n */\\n function safeEXTCODESIZE(\\n address _contract\\n )\\n internal\\n returns (\\n uint256 _EXTCODESIZE\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmEXTCODESIZE(address)\\\",\\n _contract\\n )\\n );\\n\\n return abi.decode(returndata, (uint256));\\n }\\n\\n /**\\n * Performs a safe ovmCHAINID call.\\n * @return _CHAINID Result of calling ovmCHAINID.\\n */\\n function safeCHAINID()\\n internal\\n returns (\\n uint256 _CHAINID\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCHAINID()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (uint256));\\n }\\n\\n /**\\n * Performs a safe ovmCALLER call.\\n * @return _CALLER Result of calling ovmCALLER.\\n */\\n function safeCALLER()\\n internal\\n returns (\\n address _CALLER\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCALLER()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (address));\\n }\\n\\n /**\\n * Performs a safe ovmADDRESS call.\\n * @return _ADDRESS Result of calling ovmADDRESS.\\n */\\n function safeADDRESS()\\n internal\\n returns (\\n address _ADDRESS\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmADDRESS()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (address));\\n }\\n\\n /**\\n * Performs a safe ovmGETNONCE call.\\n * @return _nonce Result of calling ovmGETNONCE.\\n */\\n function safeGETNONCE()\\n internal\\n returns (\\n uint256 _nonce\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmGETNONCE()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (uint256));\\n }\\n\\n /**\\n * Performs a safe ovmSETNONCE call.\\n * @param _nonce New account nonce.\\n */\\n function safeSETNONCE(\\n uint256 _nonce\\n )\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmSETNONCE(uint256)\\\",\\n _nonce\\n )\\n );\\n }\\n\\n /**\\n * Performs a safe ovmCREATEEOA call.\\n * @param _messageHash Message hash which was signed by EOA\\n * @param _v v value of signature (0 or 1)\\n * @param _r r value of signature\\n * @param _s s value of signature\\n */\\n function safeCREATEEOA(\\n bytes32 _messageHash,\\n uint8 _v,\\n bytes32 _r,\\n bytes32 _s\\n )\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCREATEEOA(bytes32,uint8,bytes32,bytes32)\\\",\\n _messageHash,\\n _v,\\n _r,\\n _s\\n )\\n );\\n }\\n\\n /**\\n * Performs a safe REVERT.\\n * @param _reason String revert reason to pass along with the REVERT.\\n */\\n function safeREVERT(\\n string memory _reason\\n )\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmREVERT(bytes)\\\",\\n bytes(_reason)\\n )\\n );\\n }\\n\\n /**\\n * Performs a safe \\\"require\\\".\\n * @param _condition Boolean condition that must be true or will revert.\\n * @param _reason String revert reason to pass along with the REVERT.\\n */\\n function safeREQUIRE(\\n bool _condition,\\n string memory _reason\\n )\\n internal\\n {\\n if (!_condition) {\\n safeREVERT(\\n _reason\\n );\\n }\\n }\\n\\n /**\\n * Performs a safe ovmSLOAD call.\\n */\\n function safeSLOAD(\\n bytes32 _key\\n )\\n internal\\n returns (\\n bytes32\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmSLOAD(bytes32)\\\",\\n _key\\n )\\n );\\n\\n return abi.decode(returndata, (bytes32));\\n }\\n\\n /**\\n * Performs a safe ovmSSTORE call.\\n */\\n function safeSSTORE(\\n bytes32 _key,\\n bytes32 _value\\n )\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmSSTORE(bytes32,bytes32)\\\",\\n _key,\\n _value\\n )\\n );\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Performs an ovm interaction and the necessary safety checks.\\n * @param _gasLimit Gas limit for the interaction.\\n * @param _calldata Data to send to the OVM_ExecutionManager (encoded with sighash).\\n * @return _returndata Data sent back by the OVM_ExecutionManager.\\n */\\n function _safeExecutionManagerInteraction(\\n uint256 _gasLimit,\\n bytes memory _calldata\\n )\\n private\\n returns (\\n bytes memory _returndata\\n )\\n {\\n address ovmExecutionManager = msg.sender;\\n (\\n bool success,\\n bytes memory returndata\\n ) = ovmExecutionManager.call{gas: _gasLimit}(_calldata);\\n\\n if (success == false) {\\n assembly {\\n revert(add(returndata, 0x20), mload(returndata))\\n }\\n } else if (returndata.length == 1) {\\n assembly {\\n return(0, 1)\\n }\\n } else {\\n return returndata;\\n }\\n }\\n\\n function _safeExecutionManagerInteraction(\\n bytes memory _calldata\\n )\\n private\\n returns (\\n bytes memory _returndata\\n )\\n {\\n return _safeExecutionManagerInteraction(\\n gasleft(),\\n _calldata\\n );\\n }\\n}\\n\",\"keccak256\":\"0xdc30487ca1580f3498d4a1c4e26dc53158c00b44bd72da212a66267c22a139b0\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x608060405234801561001057600080fd5b50604051611bdd380380611bdd83398101604081905261002f9161005b565b600080546001600160a01b0319166001600160a01b03949094169390931790925560015560025561009c565b60008060006060848603121561006f578283fd5b83516001600160a01b0381168114610085578384fd5b602085015160409095015190969495509392505050565b611b32806100ab6000396000f3fe608060405234801561001057600080fd5b50600436106100a95760003560e01c80638ca5cbb9116100715780638ca5cbb91461011c5780639418bddd14610131578063b8e189ac14610144578063c17b291b14610157578063cfdf677e1461015f578063e561dddc14610167576100a9565b8063461a4478146100ae5780634d69ee57146100d75780637aa63a86146100f75780637ad168a01461010c57806381eb62ef14610114575b600080fd5b6100c16100bc3660046114d2565b61016f565b6040516100ce919061158e565b60405180910390f35b6100ea6100e5366004611420565b61024d565b6040516100ce91906115a2565b6100ff6102c0565b6040516100ce91906115ad565b6100ff6102d9565b6100ff6102f2565b61012f61012a36600461137f565b6102f8565b005b6100ea61013f366004611520565b61050c565b61012f610152366004611520565b61055c565b6100ff610614565b6100c161061a565b6100ff610642565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b838110156101cf5781810151838201526020016101b7565b50505050905090810190601f1680156101fc5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561021957600080fd5b505afa15801561022d573d6000803e3d6000fd5b505050506040513d602081101561024357600080fd5b505190505b919050565b6000610258836106bc565b61027d5760405162461bcd60e51b815260040161027490611738565b60405180910390fd5b61029a836020015185846000015185602001518760400151610754565b6102b65760405162461bcd60e51b8152600401610274906116a4565b5060019392505050565b6000806102cb6108d9565b5064ffffffffff1691505090565b6000806102e46108d9565b64ffffffffff169250505090565b60025481565b6103006102c0565b811461031e5760405162461bcd60e51b8152600401610274906116db565b61034e6040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b81525061016f565b6001600160a01b03166302ad4d2a336040518263ffffffff1660e01b8152600401610379919061158e565b60206040518083038186803b15801561039157600080fd5b505afa1580156103a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103c991906113c2565b6103e55760405162461bcd60e51b8152600401610274906118aa565b60008251116104065760405162461bcd60e51b815260040161027490611867565b6104446040518060400160405280601d81526020017f4f564d5f43616e6f6e6963616c5472616e73616374696f6e436861696e00000081525061016f565b6001600160a01b0316637aa63a866040518163ffffffff1660e01b815260040160206040518083038186803b15801561047c57600080fd5b505afa158015610490573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104b49190611408565b82516104be6102c0565b0111156104dd5760405162461bcd60e51b815260040161027490611635565b6105088242336040516020016104f4929190611990565b60405160208183030381529060405261096e565b5050565b60008082608001518060200190518101906105279190611553565b509050806105475760405162461bcd60e51b815260040161027490611822565b4261055482600154610b10565b119392505050565b61058e6040518060400160405280601181526020017027ab26afa33930bab22b32b934b334b2b960791b81525061016f565b6001600160a01b0316336001600160a01b0316146105be5760405162461bcd60e51b8152600401610274906117c5565b6105c7816106bc565b6105e35760405162461bcd60e51b815260040161027490611738565b6105ec8161050c565b6106085760405162461bcd60e51b815260040161027490611767565b61061181610b71565b50565b60015481565b600061063d604051806060016040528060258152602001611aa46025913961016f565b905090565b600061064c61061a565b6001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b15801561068457600080fd5b505afa158015610698573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061063d9190611408565b60006106c661061a565b8251604051634a83e9cd60e11b81526001600160a01b039290921691639507d39a916106f4916004016115ad565b60206040518083038186803b15801561070c57600080fd5b505afa158015610720573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107449190611408565b61074d83610ce9565b1492915050565b60008082116107945760405162461bcd60e51b8152600401808060200182810382526037815260200180611a206037913960400191505060405180910390fd5b8184106107d25760405162461bcd60e51b81526004018080602001828103825260248152602001806119cc6024913960400191505060405180910390fd5b6107db82610d2f565b8351146108195760405162461bcd60e51b815260040180806020018281038252604d815260200180611a57604d913960600191505060405180910390fd5b8460005b84518110156108cc57856001166001141561087b5784818151811061083e57fe5b60200260200101518260405160200180838152602001828152602001925050506040516020818303038152906040528051906020012091506108c0565b8185828151811061088857fe5b602002602001015160405160200180838152602001828152602001925050506040516020818303038152906040528051906020012091505b600195861c950161081d565b5090951495945050505050565b60008060006108e661061a565b6001600160a01b031663ccf8f9696040518163ffffffff1660e01b815260040160206040518083038186803b15801561091e57600080fd5b505afa158015610932573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061095691906113e2565b64ffffffffff602882901c16935060501c9150509091565b600061099e6040518060400160405280600d81526020016c27ab26afa9b2b8bab2b731b2b960991b81525061016f565b90506000806109ab6108d9565b9092509050336001600160a01b03841614156109c85750426109f2565b426002548264ffffffffff1601106109f25760405162461bcd60e51b8152600401610274906118f9565b60006040518060a00160405280610a07610642565b8152602001610a1588610dd9565b8152602001875181526020018464ffffffffff16815260200186815250905080600001517f16be4c5129a4e03cf3350262e181dc02ddfb4a6008d925368c0899fcd97ca9c58260200151836040015184606001518560800151604051610a7e94939291906115cc565b60405180910390a2610a8e61061a565b6001600160a01b0316632015276c610aa583610ce9565b610ab9846040015185606001510186611209565b6040518363ffffffff1660e01b8152600401610ad69291906115b6565b600060405180830381600087803b158015610af057600080fd5b505af1158015610b04573d6000803e3d6000fd5b50505050505050505050565b600082820183811015610b6a576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b610b7961061a565b6001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b158015610bb157600080fd5b505afa158015610bc5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610be99190611408565b815110610c085760405162461bcd60e51b815260040161027490611962565b610c11816106bc565b610c2d5760405162461bcd60e51b815260040161027490611738565b610c3561061a565b6001600160a01b031663167fd6818260000151610c5784606001516000611209565b6040518363ffffffff1660e01b8152600401610c749291906115b6565b600060405180830381600087803b158015610c8e57600080fd5b505af1158015610ca2573d6000803e3d6000fd5b5050505080600001517f8747b69ce8fdb31c3b9b0a67bd8049ad8c1a69ea417b69b12174068abd9cbd648260200151604051610cde91906115ad565b60405180910390a250565b60008160200151826040015183606001518460800151604051602001610d1294939291906115cc565b604051602081830303815290604052805190602001209050919050565b6000808211610d6f5760405162461bcd60e51b81526004018080602001828103825260308152602001806119f06030913960400191505060405180910390fd5b8160011415610d8057506000610248565b81600060805b60018160ff1610610dc4578060ff1660018260ff166001901b03901b8316600014610db95760ff811692831c9291909101905b60011c607f16610d86565b506001811b8414610b6a576001019392505050565b600080825111610e1a5760405162461bcd60e51b8152600401808060200182810382526034815260200180611ac96034913960400191505060405180910390fd5b8151610e3c5781600081518110610e2d57fe5b60200260200101519050610248565b60408051610200810182527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56381527f633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d60208201527f890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d818301527f3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd86060808301919091527fecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da60808301527fdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da560a08301527f617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d760c08301527f292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead60e08301527fe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e106101008301527f7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f826101208301527fe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e836365166101408301527f3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c6101608301527fad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e6101808301527fa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab6101a08301527f4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c8626101c08301527f2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf106101e083015282518381529081018352909160009190602082018180368337505085519192506000918291508180805b60018411156111e55750506002820460018084161460005b82811015611161578a816002028151811061110857fe5b602002602001015196508a816002026001018151811061112457fe5b6020026020010151955086602089015285604089015287805190602001208b828151811061114e57fe5b60209081029190910101526001016110f1565b5080156111c45789600185038151811061117757fe5b6020026020010151955087836010811061118d57fe5b602002015160001b945085602088015284604088015286805190602001208a83815181106111b757fe5b6020026020010181815250505b806111d05760006111d3565b60015b60ff16820193506001909201916110d9565b896000815181106111f257fe5b602002602001015198505050505050505050919050565b602890811b91909117901b90565b600067ffffffffffffffff83111561122b57fe5b61123e601f8401601f19166020016119a7565b905082815283838301111561125257600080fd5b828260208301376000602084830101529392505050565b600082601f830112611279578081fd5b8135602067ffffffffffffffff82111561128f57fe5b80820261129d8282016119a7565b8381528281019086840183880185018910156112b7578687fd5b8693505b858410156112d95780358352600193909301929184019184016112bb565b50979650505050505050565b600060a082840312156112f6578081fd5b60405160a0810167ffffffffffffffff828210818311171561131457fe5b8160405282935084358352602085013560208401526040850135604084015260608501356060840152608085013591508082111561135157600080fd5b508301601f8101851361136357600080fd5b61137285823560208401611217565b6080830152505092915050565b60008060408385031215611391578182fd5b823567ffffffffffffffff8111156113a7578283fd5b6113b385828601611269565b95602094909401359450505050565b6000602082840312156113d3578081fd5b81518015158114610b6a578182fd5b6000602082840312156113f3578081fd5b815164ffffffffff1981168114610b6a578182fd5b600060208284031215611419578081fd5b5051919050565b600080600060608486031215611434578081fd5b83359250602084013567ffffffffffffffff80821115611452578283fd5b61145e878388016112e5565b93506040860135915080821115611473578283fd5b9085019060408288031215611486578283fd5b60405160408101818110838211171561149b57fe5b604052823581526020830135828111156114b3578485fd5b6114bf89828601611269565b6020830152508093505050509250925092565b6000602082840312156114e3578081fd5b813567ffffffffffffffff8111156114f9578182fd5b8201601f81018413611509578182fd5b61151884823560208401611217565b949350505050565b600060208284031215611531578081fd5b813567ffffffffffffffff811115611547578182fd5b611518848285016112e5565b60008060408385031215611565578182fd5b825160208401519092506001600160a01b0381168114611583578182fd5b809150509250929050565b6001600160a01b0391909116815260200190565b901515815260200190565b90815260200190565b91825264ffffffffff1916602082015260400190565b600085825260208581840152846040840152608060608401528351806080850152825b8181101561160b5785810183015185820160a0015282016115ef565b8181111561161c578360a083870101525b50601f01601f19169290920160a0019695505050505050565b60208082526049908201527f4e756d626572206f6620737461746520726f6f74732063616e6e6f742065786360408201527f65656420746865206e756d626572206f662063616e6f6e6963616c207472616e60608201526839b0b1ba34b7b7399760b91b608082015260a00190565b60208082526018908201527f496e76616c696420696e636c7573696f6e2070726f6f662e0000000000000000604082015260600190565b6020808252603d908201527f41637475616c20626174636820737461727420696e64657820646f6573206e6f60408201527f74206d6174636820657870656374656420737461727420696e6465782e000000606082015260800190565b60208082526015908201527424b73b30b634b2103130ba31b4103432b0b232b91760591b604082015260600190565b602080825260409082018190527f537461746520626174636865732063616e206f6e6c792062652064656c657465908201527f642077697468696e207468652066726175642070726f6f662077696e646f772e606082015260800190565b6020808252603b908201527f537461746520626174636865732063616e206f6e6c792062652064656c65746560408201527f6420627920746865204f564d5f467261756456657269666965722e0000000000606082015260800190565b60208082526025908201527f4261746368206865616465722074696d657374616d702063616e6e6f74206265604082015264207a65726f60d81b606082015260800190565b60208082526023908201527f43616e6e6f74207375626d697420616e20656d7074792073746174652062617460408201526231b41760e91b606082015260800190565b6020808252602f908201527f50726f706f73657220646f6573206e6f74206861766520656e6f75676820636f60408201526e1b1b185d195c985b081c1bdcdd1959608a1b606082015260800190565b60208082526043908201527f43616e6e6f74207075626c69736820737461746520726f6f747320776974686960408201527f6e207468652073657175656e636572207075626c69636174696f6e2077696e6460608201526237bb9760e91b608082015260a00190565b60208082526014908201527324b73b30b634b2103130ba31b41034b73232bc1760611b604082015260600190565b9182526001600160a01b0316602082015260400190565b60405181810167ffffffffffffffff811182821017156119c357fe5b60405291905056fe4c69625f4d65726b6c65547265653a20496e646578206f7574206f6620626f756e64732e4c69625f4d65726b6c65547265653a2043616e6e6f7420636f6d70757465206365696c286c6f675f3229206f6620302e4c69625f4d65726b6c65547265653a20546f74616c206c6561766573206d7573742062652067726561746572207468616e207a65726f2e4c69625f4d65726b6c65547265653a20546f74616c207369626c696e677320646f6573206e6f7420636f72726563746c7920636f72726573706f6e6420746f20746f74616c206c65617665732e4f564d5f436861696e53746f72616765436f6e7461696e65723a5343433a626174636865734c69625f4d65726b6c65547265653a204d7573742070726f76696465206174206c65617374206f6e65206c65616620686173682ea2646970667358221220bb0e5c642953ed51fb237282bb9f6a364967e5a947393d6d7113e72272758ff864736f6c63430007060033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100a95760003560e01c80638ca5cbb9116100715780638ca5cbb91461011c5780639418bddd14610131578063b8e189ac14610144578063c17b291b14610157578063cfdf677e1461015f578063e561dddc14610167576100a9565b8063461a4478146100ae5780634d69ee57146100d75780637aa63a86146100f75780637ad168a01461010c57806381eb62ef14610114575b600080fd5b6100c16100bc3660046114d2565b61016f565b6040516100ce919061158e565b60405180910390f35b6100ea6100e5366004611420565b61024d565b6040516100ce91906115a2565b6100ff6102c0565b6040516100ce91906115ad565b6100ff6102d9565b6100ff6102f2565b61012f61012a36600461137f565b6102f8565b005b6100ea61013f366004611520565b61050c565b61012f610152366004611520565b61055c565b6100ff610614565b6100c161061a565b6100ff610642565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b838110156101cf5781810151838201526020016101b7565b50505050905090810190601f1680156101fc5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561021957600080fd5b505afa15801561022d573d6000803e3d6000fd5b505050506040513d602081101561024357600080fd5b505190505b919050565b6000610258836106bc565b61027d5760405162461bcd60e51b815260040161027490611738565b60405180910390fd5b61029a836020015185846000015185602001518760400151610754565b6102b65760405162461bcd60e51b8152600401610274906116a4565b5060019392505050565b6000806102cb6108d9565b5064ffffffffff1691505090565b6000806102e46108d9565b64ffffffffff169250505090565b60025481565b6103006102c0565b811461031e5760405162461bcd60e51b8152600401610274906116db565b61034e6040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b81525061016f565b6001600160a01b03166302ad4d2a336040518263ffffffff1660e01b8152600401610379919061158e565b60206040518083038186803b15801561039157600080fd5b505afa1580156103a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103c991906113c2565b6103e55760405162461bcd60e51b8152600401610274906118aa565b60008251116104065760405162461bcd60e51b815260040161027490611867565b6104446040518060400160405280601d81526020017f4f564d5f43616e6f6e6963616c5472616e73616374696f6e436861696e00000081525061016f565b6001600160a01b0316637aa63a866040518163ffffffff1660e01b815260040160206040518083038186803b15801561047c57600080fd5b505afa158015610490573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104b49190611408565b82516104be6102c0565b0111156104dd5760405162461bcd60e51b815260040161027490611635565b6105088242336040516020016104f4929190611990565b60405160208183030381529060405261096e565b5050565b60008082608001518060200190518101906105279190611553565b509050806105475760405162461bcd60e51b815260040161027490611822565b4261055482600154610b10565b119392505050565b61058e6040518060400160405280601181526020017027ab26afa33930bab22b32b934b334b2b960791b81525061016f565b6001600160a01b0316336001600160a01b0316146105be5760405162461bcd60e51b8152600401610274906117c5565b6105c7816106bc565b6105e35760405162461bcd60e51b815260040161027490611738565b6105ec8161050c565b6106085760405162461bcd60e51b815260040161027490611767565b61061181610b71565b50565b60015481565b600061063d604051806060016040528060258152602001611aa46025913961016f565b905090565b600061064c61061a565b6001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b15801561068457600080fd5b505afa158015610698573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061063d9190611408565b60006106c661061a565b8251604051634a83e9cd60e11b81526001600160a01b039290921691639507d39a916106f4916004016115ad565b60206040518083038186803b15801561070c57600080fd5b505afa158015610720573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107449190611408565b61074d83610ce9565b1492915050565b60008082116107945760405162461bcd60e51b8152600401808060200182810382526037815260200180611a206037913960400191505060405180910390fd5b8184106107d25760405162461bcd60e51b81526004018080602001828103825260248152602001806119cc6024913960400191505060405180910390fd5b6107db82610d2f565b8351146108195760405162461bcd60e51b815260040180806020018281038252604d815260200180611a57604d913960600191505060405180910390fd5b8460005b84518110156108cc57856001166001141561087b5784818151811061083e57fe5b60200260200101518260405160200180838152602001828152602001925050506040516020818303038152906040528051906020012091506108c0565b8185828151811061088857fe5b602002602001015160405160200180838152602001828152602001925050506040516020818303038152906040528051906020012091505b600195861c950161081d565b5090951495945050505050565b60008060006108e661061a565b6001600160a01b031663ccf8f9696040518163ffffffff1660e01b815260040160206040518083038186803b15801561091e57600080fd5b505afa158015610932573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061095691906113e2565b64ffffffffff602882901c16935060501c9150509091565b600061099e6040518060400160405280600d81526020016c27ab26afa9b2b8bab2b731b2b960991b81525061016f565b90506000806109ab6108d9565b9092509050336001600160a01b03841614156109c85750426109f2565b426002548264ffffffffff1601106109f25760405162461bcd60e51b8152600401610274906118f9565b60006040518060a00160405280610a07610642565b8152602001610a1588610dd9565b8152602001875181526020018464ffffffffff16815260200186815250905080600001517f16be4c5129a4e03cf3350262e181dc02ddfb4a6008d925368c0899fcd97ca9c58260200151836040015184606001518560800151604051610a7e94939291906115cc565b60405180910390a2610a8e61061a565b6001600160a01b0316632015276c610aa583610ce9565b610ab9846040015185606001510186611209565b6040518363ffffffff1660e01b8152600401610ad69291906115b6565b600060405180830381600087803b158015610af057600080fd5b505af1158015610b04573d6000803e3d6000fd5b50505050505050505050565b600082820183811015610b6a576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b610b7961061a565b6001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b158015610bb157600080fd5b505afa158015610bc5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610be99190611408565b815110610c085760405162461bcd60e51b815260040161027490611962565b610c11816106bc565b610c2d5760405162461bcd60e51b815260040161027490611738565b610c3561061a565b6001600160a01b031663167fd6818260000151610c5784606001516000611209565b6040518363ffffffff1660e01b8152600401610c749291906115b6565b600060405180830381600087803b158015610c8e57600080fd5b505af1158015610ca2573d6000803e3d6000fd5b5050505080600001517f8747b69ce8fdb31c3b9b0a67bd8049ad8c1a69ea417b69b12174068abd9cbd648260200151604051610cde91906115ad565b60405180910390a250565b60008160200151826040015183606001518460800151604051602001610d1294939291906115cc565b604051602081830303815290604052805190602001209050919050565b6000808211610d6f5760405162461bcd60e51b81526004018080602001828103825260308152602001806119f06030913960400191505060405180910390fd5b8160011415610d8057506000610248565b81600060805b60018160ff1610610dc4578060ff1660018260ff166001901b03901b8316600014610db95760ff811692831c9291909101905b60011c607f16610d86565b506001811b8414610b6a576001019392505050565b600080825111610e1a5760405162461bcd60e51b8152600401808060200182810382526034815260200180611ac96034913960400191505060405180910390fd5b8151610e3c5781600081518110610e2d57fe5b60200260200101519050610248565b60408051610200810182527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56381527f633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d60208201527f890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d818301527f3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd86060808301919091527fecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da60808301527fdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da560a08301527f617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d760c08301527f292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead60e08301527fe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e106101008301527f7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f826101208301527fe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e836365166101408301527f3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c6101608301527fad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e6101808301527fa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab6101a08301527f4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c8626101c08301527f2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf106101e083015282518381529081018352909160009190602082018180368337505085519192506000918291508180805b60018411156111e55750506002820460018084161460005b82811015611161578a816002028151811061110857fe5b602002602001015196508a816002026001018151811061112457fe5b6020026020010151955086602089015285604089015287805190602001208b828151811061114e57fe5b60209081029190910101526001016110f1565b5080156111c45789600185038151811061117757fe5b6020026020010151955087836010811061118d57fe5b602002015160001b945085602088015284604088015286805190602001208a83815181106111b757fe5b6020026020010181815250505b806111d05760006111d3565b60015b60ff16820193506001909201916110d9565b896000815181106111f257fe5b602002602001015198505050505050505050919050565b602890811b91909117901b90565b600067ffffffffffffffff83111561122b57fe5b61123e601f8401601f19166020016119a7565b905082815283838301111561125257600080fd5b828260208301376000602084830101529392505050565b600082601f830112611279578081fd5b8135602067ffffffffffffffff82111561128f57fe5b80820261129d8282016119a7565b8381528281019086840183880185018910156112b7578687fd5b8693505b858410156112d95780358352600193909301929184019184016112bb565b50979650505050505050565b600060a082840312156112f6578081fd5b60405160a0810167ffffffffffffffff828210818311171561131457fe5b8160405282935084358352602085013560208401526040850135604084015260608501356060840152608085013591508082111561135157600080fd5b508301601f8101851361136357600080fd5b61137285823560208401611217565b6080830152505092915050565b60008060408385031215611391578182fd5b823567ffffffffffffffff8111156113a7578283fd5b6113b385828601611269565b95602094909401359450505050565b6000602082840312156113d3578081fd5b81518015158114610b6a578182fd5b6000602082840312156113f3578081fd5b815164ffffffffff1981168114610b6a578182fd5b600060208284031215611419578081fd5b5051919050565b600080600060608486031215611434578081fd5b83359250602084013567ffffffffffffffff80821115611452578283fd5b61145e878388016112e5565b93506040860135915080821115611473578283fd5b9085019060408288031215611486578283fd5b60405160408101818110838211171561149b57fe5b604052823581526020830135828111156114b3578485fd5b6114bf89828601611269565b6020830152508093505050509250925092565b6000602082840312156114e3578081fd5b813567ffffffffffffffff8111156114f9578182fd5b8201601f81018413611509578182fd5b61151884823560208401611217565b949350505050565b600060208284031215611531578081fd5b813567ffffffffffffffff811115611547578182fd5b611518848285016112e5565b60008060408385031215611565578182fd5b825160208401519092506001600160a01b0381168114611583578182fd5b809150509250929050565b6001600160a01b0391909116815260200190565b901515815260200190565b90815260200190565b91825264ffffffffff1916602082015260400190565b600085825260208581840152846040840152608060608401528351806080850152825b8181101561160b5785810183015185820160a0015282016115ef565b8181111561161c578360a083870101525b50601f01601f19169290920160a0019695505050505050565b60208082526049908201527f4e756d626572206f6620737461746520726f6f74732063616e6e6f742065786360408201527f65656420746865206e756d626572206f662063616e6f6e6963616c207472616e60608201526839b0b1ba34b7b7399760b91b608082015260a00190565b60208082526018908201527f496e76616c696420696e636c7573696f6e2070726f6f662e0000000000000000604082015260600190565b6020808252603d908201527f41637475616c20626174636820737461727420696e64657820646f6573206e6f60408201527f74206d6174636820657870656374656420737461727420696e6465782e000000606082015260800190565b60208082526015908201527424b73b30b634b2103130ba31b4103432b0b232b91760591b604082015260600190565b602080825260409082018190527f537461746520626174636865732063616e206f6e6c792062652064656c657465908201527f642077697468696e207468652066726175642070726f6f662077696e646f772e606082015260800190565b6020808252603b908201527f537461746520626174636865732063616e206f6e6c792062652064656c65746560408201527f6420627920746865204f564d5f467261756456657269666965722e0000000000606082015260800190565b60208082526025908201527f4261746368206865616465722074696d657374616d702063616e6e6f74206265604082015264207a65726f60d81b606082015260800190565b60208082526023908201527f43616e6e6f74207375626d697420616e20656d7074792073746174652062617460408201526231b41760e91b606082015260800190565b6020808252602f908201527f50726f706f73657220646f6573206e6f74206861766520656e6f75676820636f60408201526e1b1b185d195c985b081c1bdcdd1959608a1b606082015260800190565b60208082526043908201527f43616e6e6f74207075626c69736820737461746520726f6f747320776974686960408201527f6e207468652073657175656e636572207075626c69636174696f6e2077696e6460608201526237bb9760e91b608082015260a00190565b60208082526014908201527324b73b30b634b2103130ba31b41034b73232bc1760611b604082015260600190565b9182526001600160a01b0316602082015260400190565b60405181810167ffffffffffffffff811182821017156119c357fe5b60405291905056fe4c69625f4d65726b6c65547265653a20496e646578206f7574206f6620626f756e64732e4c69625f4d65726b6c65547265653a2043616e6e6f7420636f6d70757465206365696c286c6f675f3229206f6620302e4c69625f4d65726b6c65547265653a20546f74616c206c6561766573206d7573742062652067726561746572207468616e207a65726f2e4c69625f4d65726b6c65547265653a20546f74616c207369626c696e677320646f6573206e6f7420636f72726563746c7920636f72726573706f6e6420746f20746f74616c206c65617665732e4f564d5f436861696e53746f72616765436f6e7461696e65723a5343433a626174636865734c69625f4d65726b6c65547265653a204d7573742070726f76696465206174206c65617374206f6e65206c65616620686173682ea2646970667358221220bb0e5c642953ed51fb237282bb9f6a364967e5a947393d6d7113e72272758ff864736f6c63430007060033", - "devdoc": { - "kind": "dev", - "methods": { - "appendStateBatch(bytes32[],uint256)": { - "params": { - "_batch": "Batch of state roots.", - "_shouldStartAtElement": "Index of the element at which this batch should start." - } - }, - "batches()": { - "returns": { - "_0": "Reference to the batch storage container." - } - }, - "constructor": { - "params": { - "_libAddressManager": "Address of the Address Manager." - } - }, - "deleteStateBatch((uint256,bytes32,uint256,uint256,bytes))": { - "params": { - "_batchHeader": "Header of the batch to start deleting from." - } - }, - "getLastSequencerTimestamp()": { - "returns": { - "_lastSequencerTimestamp": "Last sequencer batch timestamp." - } - }, - "getTotalBatches()": { - "returns": { - "_totalBatches": "Total submitted batches." - } - }, - "getTotalElements()": { - "returns": { - "_totalElements": "Total submitted elements." - } - }, - "insideFraudProofWindow((uint256,bytes32,uint256,uint256,bytes))": { - "params": { - "_batchHeader": "Header of the batch to check." - }, - "returns": { - "_inside": "Whether or not the batch is inside the fraud proof window." - } - }, - "verifyStateCommitment(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))": { - "params": { - "_batchHeader": "Header of the batch in which the element was included.", - "_element": "Hash of the element to verify a proof for.", - "_proof": "Merkle inclusion proof for the element." - } - } - }, - "title": "OVM_StateCommitmentChain", - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": { - "appendStateBatch(bytes32[],uint256)": { - "notice": "Appends a batch of state roots to the chain." - }, - "batches()": { - "notice": "Accesses the batch storage container." - }, - "deleteStateBatch((uint256,bytes32,uint256,uint256,bytes))": { - "notice": "Deletes all state roots after (and including) a given batch." - }, - "getLastSequencerTimestamp()": { - "notice": "Retrieves the timestamp of the last batch submitted by the sequencer." - }, - "getTotalBatches()": { - "notice": "Retrieves the total number of batches submitted." - }, - "getTotalElements()": { - "notice": "Retrieves the total number of elements submitted." - }, - "insideFraudProofWindow((uint256,bytes32,uint256,uint256,bytes))": { - "notice": "Checks whether a given batch is still inside its fraud proof window." - }, - "verifyStateCommitment(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))": { - "notice": "Verifies a batch inclusion proof." - } - }, - "version": 1 - }, - "storageLayout": { - "storage": [ - { - "astId": 11707, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_StateCommitmentChain.sol:OVM_StateCommitmentChain", - "label": "libAddressManager", - "offset": 0, - "slot": "0", - "type": "t_contract(Lib_AddressManager)11700" - }, - { - "astId": 3141, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_StateCommitmentChain.sol:OVM_StateCommitmentChain", - "label": "FRAUD_PROOF_WINDOW", - "offset": 0, - "slot": "1", - "type": "t_uint256" - }, - { - "astId": 3143, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_StateCommitmentChain.sol:OVM_StateCommitmentChain", - "label": "SEQUENCER_PUBLISH_WINDOW", - "offset": 0, - "slot": "2", - "type": "t_uint256" - } - ], - "types": { - "t_contract(Lib_AddressManager)11700": { - "encoding": "inplace", - "label": "contract Lib_AddressManager", - "numberOfBytes": "20" - }, - "t_uint256": { - "encoding": "inplace", - "label": "uint256", - "numberOfBytes": "32" - } - } - } -} \ No newline at end of file diff --git a/packages/contracts/deployments/mainnet-v1/Proxy__OVM_L1CrossDomainMessenger.json b/packages/contracts/deployments/mainnet-v1/Proxy__OVM_L1CrossDomainMessenger.json deleted file mode 100644 index 5413844866e1d..0000000000000 --- a/packages/contracts/deployments/mainnet-v1/Proxy__OVM_L1CrossDomainMessenger.json +++ /dev/null @@ -1,118 +0,0 @@ -{ - "address": "0xfBE93ba0a2Df92A8e8D40cE00acCF9248a6Fc812", - "abi": [ - { - "inputs": [ - { - "internalType": "address", - "name": "_libAddressManager", - "type": "address" - }, - { - "internalType": "string", - "name": "_implementationName", - "type": "string" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "stateMutability": "nonpayable", - "type": "fallback" - } - ], - "transactionHash": "0xf56350f6788ffb9ebfa35403412369a4fac3147ab5a612956ea8146fe14308ed", - "receipt": { - "to": null, - "from": "0x558ba9b8d78713fbf768c1f8a584485B4003f43F", - "contractAddress": "0x40C6cA6dDdd27E9B4d50da1E393B82b71B1C5D45", - "transactionIndex": 15, - "gasUsed": "228252", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0x255fee49c39936345b0004796d61db7b0953cc70f0a9081d86d3447b23b491a2", - "transactionHash": "0xf56350f6788ffb9ebfa35403412369a4fac3147ab5a612956ea8146fe14308ed", - "logs": [], - "blockNumber": 4573449, - "cumulativeGasUsed": "1727110", - "status": 1, - "byzantium": true - }, - "args": [ - "0x1De8CFD4C1A486200286073aE91DE6e8099519f1", - "OVM_L1CrossDomainMessenger" - ], - "solcInputHash": "cebcb515c1a9c570d96e0b8f6fd237e2", - "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_implementationName\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"stateMutability\":\"nonpayable\",\"type\":\"fallback\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_implementationName\":\"implementationName of the contract to proxy to.\",\"_libAddressManager\":\"Address of the Lib_AddressManager.\"}}},\"title\":\"Lib_ResolvedDelegateProxy\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/libraries/resolver/Lib_ResolvedDelegateProxy.sol\":\"Lib_ResolvedDelegateProxy\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// +build ovm\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Contract Imports */\\nimport { Ownable } from \\\"./Lib_Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n /*******************************************\\n * Contract Variables: Internal Accounting *\\n *******************************************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n public\\n onlyOwner\\n {\\n emit AddressSet(_name, _address);\\n addresses[_getNameHash(_name)] = _address;\\n }\\n\\n function getAddress(\\n string memory _name\\n )\\n public\\n view\\n returns (address)\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32 _hash\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xdf802e1cc6474df913626991e9fca3835c620a519f397afe04bf9c260e723257\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// +build ovm\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Ownable\\n * @dev Adapted from https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol\\n */\\nabstract contract Ownable {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n address public owner;\\n\\n\\n /**********\\n * Events *\\n **********/\\n\\n event OwnershipTransferred(\\n address indexed previousOwner,\\n address indexed newOwner\\n );\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n constructor() internal {\\n owner = msg.sender;\\n emit OwnershipTransferred(address(0), owner);\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n owner == msg.sender,\\n \\\"Ownable: caller is not the owner\\\"\\n );\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function renounceOwnership()\\n public\\n virtual\\n onlyOwner\\n {\\n emit OwnershipTransferred(owner, address(0));\\n owner = address(0);\\n }\\n\\n function transferOwnership(address _newOwner)\\n public\\n virtual\\n onlyOwner\\n {\\n require(\\n _newOwner != address(0),\\n \\\"Ownable: new owner cannot be the zero address\\\"\\n );\\n\\n emit OwnershipTransferred(owner, _newOwner);\\n owner = _newOwner;\\n }\\n}\\n\",\"keccak256\":\"0xe0409fbd236d16ca6be439d9d97dd36d0d9a0697ee0062d49588b9d29c248e47\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_ResolvedDelegateProxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.7.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_ResolvedDelegateProxy\\n */\\ncontract Lib_ResolvedDelegateProxy {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n // Using mappings to store fields to avoid overwriting storage slots in the\\n // implementation contract. For example, instead of storing these fields at\\n // storage slot `0` & `1`, they are stored at `hash(${FIELD_NAME} + address(this))`\\n // See: https://solidity.readthedocs.io/en/v0.7.0/internals/layout_in_storage.html\\n mapping(address=>string) private implementationName;\\n mapping(address=>Lib_AddressManager) private addressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n * @param _implementationName implementationName of the contract to proxy to.\\n */\\n constructor(\\n address _libAddressManager,\\n string memory _implementationName\\n )\\n {\\n addressManager[address(this)] = Lib_AddressManager(_libAddressManager);\\n implementationName[address(this)] = _implementationName;\\n }\\n\\n\\n /*********************\\n * Fallback Function *\\n *********************/\\n\\n fallback()\\n external\\n {\\n address target = addressManager[address(this)].getAddress((implementationName[address(this)]));\\n require(\\n target != address(0),\\n \\\"Target address must be initialized.\\\"\\n );\\n\\n (bool success, bytes memory returndata) = target.delegatecall(msg.data);\\n\\n if (success == true) {\\n assembly {\\n return(add(returndata, 0x20), mload(returndata))\\n }\\n } else {\\n assembly {\\n revert(add(returndata, 0x20), mload(returndata))\\n }\\n }\\n }\\n}\\n\",\"keccak256\":\"0x7b94d77f1ceef7bf89687de3a9c574d994d531e4b98007b106fbac54bab7e8ea\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x608060405234801561001057600080fd5b506040516104173803806104178339818101604052604081101561003357600080fd5b81516020830180516040519294929383019291908464010000000082111561005a57600080fd5b90830190602082018581111561006f57600080fd5b825164010000000081118282018810171561008957600080fd5b82525081516020918201929091019080838360005b838110156100b657818101518382015260200161009e565b50505050905090810190601f1680156100e35780820380516001836020036101000a031916815260200191505b5060409081523060009081526001602090815282822080546001600160a01b0319166001600160a01b038a16179055818152919020855161012c95509093509085019150610134565b5050506101d5565b828054600181600116156101000203166002900490600052602060002090601f01602090048101928261016a57600085556101b0565b82601f1061018357805160ff19168380011785556101b0565b828001600101855582156101b0579182015b828111156101b0578251825591602001919060010190610195565b506101bc9291506101c0565b5090565b5b808211156101bc57600081556001016101c1565b610233806101e46000396000f3fe608060405234801561001057600080fd5b5030600090815260016020818152604080842054848352818520915163bf40fac160e01b815260048101938452825460026101009682161596909602600019011694909404602485018190526001600160a01b039091169363bf40fac19391829160440190849080156100c45780601f10610099576101008083540402835291602001916100c4565b820191906000526020600020905b8154815290600101906020018083116100a757829003601f168201915b50509250505060206040518083038186803b1580156100e257600080fd5b505afa1580156100f6573d6000803e3d6000fd5b505050506040513d602081101561010c57600080fd5b505190506001600160a01b0381166101555760405162461bcd60e51b81526004018080602001828103825260238152602001806101db6023913960400191505060405180910390fd5b600080826001600160a01b03166000366040518083838082843760405192019450600093509091505080830381855af49150503d80600081146101b4576040519150601f19603f3d011682016040523d82523d6000602084013e6101b9565b606091505b509092509050600182151514156101d257805160208201f35b805160208201fdfe5461726765742061646472657373206d75737420626520696e697469616c697a65642ea264697066735822122022cf2e6b66b75ae0d7a780704aa9d326dd541b72493bb1a405188ed67fed0b5964736f6c63430007060033", - "deployedBytecode": "0x608060405234801561001057600080fd5b5030600090815260016020818152604080842054848352818520915163bf40fac160e01b815260048101938452825460026101009682161596909602600019011694909404602485018190526001600160a01b039091169363bf40fac19391829160440190849080156100c45780601f10610099576101008083540402835291602001916100c4565b820191906000526020600020905b8154815290600101906020018083116100a757829003601f168201915b50509250505060206040518083038186803b1580156100e257600080fd5b505afa1580156100f6573d6000803e3d6000fd5b505050506040513d602081101561010c57600080fd5b505190506001600160a01b0381166101555760405162461bcd60e51b81526004018080602001828103825260238152602001806101db6023913960400191505060405180910390fd5b600080826001600160a01b03166000366040518083838082843760405192019450600093509091505080830381855af49150503d80600081146101b4576040519150601f19603f3d011682016040523d82523d6000602084013e6101b9565b606091505b509092509050600182151514156101d257805160208201f35b805160208201fdfe5461726765742061646472657373206d75737420626520696e697469616c697a65642ea264697066735822122022cf2e6b66b75ae0d7a780704aa9d326dd541b72493bb1a405188ed67fed0b5964736f6c63430007060033", - "devdoc": { - "kind": "dev", - "methods": { - "constructor": { - "params": { - "_implementationName": "implementationName of the contract to proxy to.", - "_libAddressManager": "Address of the Lib_AddressManager." - } - } - }, - "title": "Lib_ResolvedDelegateProxy", - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": {}, - "version": 1 - }, - "storageLayout": { - "storage": [ - { - "astId": 11832, - "contract": "contracts/optimistic-ethereum/libraries/resolver/Lib_ResolvedDelegateProxy.sol:Lib_ResolvedDelegateProxy", - "label": "implementationName", - "offset": 0, - "slot": "0", - "type": "t_mapping(t_address,t_string_storage)" - }, - { - "astId": 11836, - "contract": "contracts/optimistic-ethereum/libraries/resolver/Lib_ResolvedDelegateProxy.sol:Lib_ResolvedDelegateProxy", - "label": "addressManager", - "offset": 0, - "slot": "1", - "type": "t_mapping(t_address,t_contract(Lib_AddressManager)11700)" - } - ], - "types": { - "t_address": { - "encoding": "inplace", - "label": "address", - "numberOfBytes": "20" - }, - "t_contract(Lib_AddressManager)11700": { - "encoding": "inplace", - "label": "contract Lib_AddressManager", - "numberOfBytes": "20" - }, - "t_mapping(t_address,t_contract(Lib_AddressManager)11700)": { - "encoding": "mapping", - "key": "t_address", - "label": "mapping(address => contract Lib_AddressManager)", - "numberOfBytes": "32", - "value": "t_contract(Lib_AddressManager)11700" - }, - "t_mapping(t_address,t_string_storage)": { - "encoding": "mapping", - "key": "t_address", - "label": "mapping(address => string)", - "numberOfBytes": "32", - "value": "t_string_storage" - }, - "t_string_storage": { - "encoding": "bytes", - "label": "string", - "numberOfBytes": "32" - } - } - } -} \ No newline at end of file diff --git a/packages/contracts/deployments/mainnet-v1/mockOVM_BondManager.json b/packages/contracts/deployments/mainnet-v1/mockOVM_BondManager.json deleted file mode 100644 index 56c1fa1cee98e..0000000000000 --- a/packages/contracts/deployments/mainnet-v1/mockOVM_BondManager.json +++ /dev/null @@ -1,216 +0,0 @@ -{ - "address": "0x64cfd73BE445F6Aa4ee9F4f7B1d068008a9DAc06", - "abi": [ - { - "inputs": [ - { - "internalType": "address", - "name": "_libAddressManager", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_who", - "type": "address" - } - ], - "name": "claim", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "deposit", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "_preStateRoot", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "_publisher", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_timestamp", - "type": "uint256" - } - ], - "name": "finalize", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "finalizeWithdrawal", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "_preStateRoot", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "_who", - "type": "address" - } - ], - "name": "getGasSpent", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_who", - "type": "address" - } - ], - "name": "isCollateralized", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "_preStateRoot", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "_txHash", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "_who", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_gasSpent", - "type": "uint256" - } - ], - "name": "recordGasSpent", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "string", - "name": "_name", - "type": "string" - } - ], - "name": "resolve", - "outputs": [ - { - "internalType": "address", - "name": "_contract", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "startWithdrawal", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - } - ], - "transactionHash": "0xef2081df685c50aab54d3c8925d756ac3d5a8e3e8205ace17b9b9887a4181567", - "receipt": { - "to": null, - "from": "0x558ba9b8d78713fbf768c1f8a584485B4003f43F", - "contractAddress": "0x0C4BFBfB44090E1c1AB4a648366456ccFCF9bfA1", - "transactionIndex": 4, - "gasUsed": "291376", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0xc98e11cb9072c6fda982fe6445382fa34298a9a83d3bdfedc88fded88680fe97", - "transactionHash": "0xef2081df685c50aab54d3c8925d756ac3d5a8e3e8205ace17b9b9887a4181567", - "logs": [], - "blockNumber": 4573388, - "cumulativeGasUsed": "864063", - "status": 1, - "byzantium": true - }, - "args": [ - "0x1De8CFD4C1A486200286073aE91DE6e8099519f1" - ], - "solcInputHash": "cebcb515c1a9c570d96e0b8f6fd237e2", - "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_who\",\"type\":\"address\"}],\"name\":\"claim\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"deposit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_preStateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"_publisher\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_timestamp\",\"type\":\"uint256\"}],\"name\":\"finalize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"finalizeWithdrawal\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_preStateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"_who\",\"type\":\"address\"}],\"name\":\"getGasSpent\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_who\",\"type\":\"address\"}],\"name\":\"isCollateralized\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_preStateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"_txHash\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"_who\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_gasSpent\",\"type\":\"uint256\"}],\"name\":\"recordGasSpent\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"_contract\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"startWithdrawal\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"title\":\"mockOVM_BondManager\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/mockOVM/verification/mockOVM_BondManager.sol\":\"mockOVM_BondManager\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/optimistic-ethereum/iOVM/verification/iOVM_BondManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\ninterface ERC20 {\\n function transfer(address, uint256) external returns (bool);\\n function transferFrom(address, address, uint256) external returns (bool);\\n}\\n\\n/// All the errors which may be encountered on the bond manager\\nlibrary Errors {\\n string constant ERC20_ERR = \\\"BondManager: Could not post bond\\\";\\n string constant ALREADY_FINALIZED = \\\"BondManager: Fraud proof for this pre-state root has already been finalized\\\";\\n string constant SLASHED = \\\"BondManager: Cannot finalize withdrawal, you probably got slashed\\\";\\n string constant WRONG_STATE = \\\"BondManager: Wrong bond state for proposer\\\";\\n string constant CANNOT_CLAIM = \\\"BondManager: Cannot claim yet. Dispute must be finalized first\\\";\\n\\n string constant WITHDRAWAL_PENDING = \\\"BondManager: Withdrawal already pending\\\";\\n string constant TOO_EARLY = \\\"BondManager: Too early to finalize your withdrawal\\\";\\n\\n string constant ONLY_TRANSITIONER = \\\"BondManager: Only the transitioner for this pre-state root may call this function\\\";\\n string constant ONLY_FRAUD_VERIFIER = \\\"BondManager: Only the fraud verifier may call this function\\\";\\n string constant ONLY_STATE_COMMITMENT_CHAIN = \\\"BondManager: Only the state commitment chain may call this function\\\";\\n string constant WAIT_FOR_DISPUTES = \\\"BondManager: Wait for other potential disputes\\\";\\n}\\n\\n/**\\n * @title iOVM_BondManager\\n */\\ninterface iOVM_BondManager {\\n\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n /// The lifecycle of a proposer's bond\\n enum State {\\n // Before depositing or after getting slashed, a user is uncollateralized\\n NOT_COLLATERALIZED,\\n // After depositing, a user is collateralized\\n COLLATERALIZED,\\n // After a user has initiated a withdrawal\\n WITHDRAWING\\n }\\n\\n /// A bond posted by a proposer\\n struct Bond {\\n // The user's state\\n State state;\\n // The timestamp at which a proposer issued their withdrawal request\\n uint32 withdrawalTimestamp;\\n // The time when the first disputed was initiated for this bond\\n uint256 firstDisputeAt;\\n // The earliest observed state root for this bond which has had fraud\\n bytes32 earliestDisputedStateRoot;\\n // The state root's timestamp\\n uint256 earliestTimestamp;\\n }\\n\\n // Per pre-state root, store the number of state provisions that were made\\n // and how many of these calls were made by each user. Payouts will then be\\n // claimed by users proportionally for that dispute.\\n struct Rewards {\\n // Flag to check if rewards for a fraud proof are claimable\\n bool canClaim;\\n // Total number of `recordGasSpent` calls made\\n uint256 total;\\n // The gas spent by each user to provide witness data. The sum of all\\n // values inside this map MUST be equal to the value of `total`\\n mapping(address => uint256) gasSpent;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function recordGasSpent(\\n bytes32 _preStateRoot,\\n bytes32 _txHash,\\n address _who,\\n uint256 _gasSpent\\n ) external;\\n\\n function finalize(\\n bytes32 _preStateRoot,\\n address _publisher,\\n uint256 _timestamp\\n ) external;\\n\\n function deposit() external;\\n\\n function startWithdrawal() external;\\n\\n function finalizeWithdrawal() external;\\n\\n function claim(\\n address _who\\n ) external;\\n\\n function isCollateralized(\\n address _who\\n ) external view returns (bool);\\n\\n function getGasSpent(\\n bytes32 _preStateRoot,\\n address _who\\n ) external view returns (uint256);\\n}\\n\",\"keccak256\":\"0x3c2a8a399487857158649db1896749d86e39cba545a8aeb2e2bb0f3bdfa7a5b1\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// +build ovm\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Contract Imports */\\nimport { Ownable } from \\\"./Lib_Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n /*******************************************\\n * Contract Variables: Internal Accounting *\\n *******************************************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n public\\n onlyOwner\\n {\\n emit AddressSet(_name, _address);\\n addresses[_getNameHash(_name)] = _address;\\n }\\n\\n function getAddress(\\n string memory _name\\n )\\n public\\n view\\n returns (address)\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32 _hash\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xdf802e1cc6474df913626991e9fca3835c620a519f397afe04bf9c260e723257\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// +build ovm\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\ncontract Lib_AddressResolver {\\n\\n /*******************************************\\n * Contract Variables: Contract References *\\n *******************************************/\\n\\n Lib_AddressManager internal libAddressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(\\n address _libAddressManager\\n ) public {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function resolve(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address _contract\\n )\\n {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0xf3b9d78b309ddeec259ce3e0e1cfdef3ca40938e9a81971b28ce2b8ea327f533\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// +build ovm\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Ownable\\n * @dev Adapted from https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol\\n */\\nabstract contract Ownable {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n address public owner;\\n\\n\\n /**********\\n * Events *\\n **********/\\n\\n event OwnershipTransferred(\\n address indexed previousOwner,\\n address indexed newOwner\\n );\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n constructor() internal {\\n owner = msg.sender;\\n emit OwnershipTransferred(address(0), owner);\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n owner == msg.sender,\\n \\\"Ownable: caller is not the owner\\\"\\n );\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function renounceOwnership()\\n public\\n virtual\\n onlyOwner\\n {\\n emit OwnershipTransferred(owner, address(0));\\n owner = address(0);\\n }\\n\\n function transferOwnership(address _newOwner)\\n public\\n virtual\\n onlyOwner\\n {\\n require(\\n _newOwner != address(0),\\n \\\"Ownable: new owner cannot be the zero address\\\"\\n );\\n\\n emit OwnershipTransferred(owner, _newOwner);\\n owner = _newOwner;\\n }\\n}\\n\",\"keccak256\":\"0xe0409fbd236d16ca6be439d9d97dd36d0d9a0697ee0062d49588b9d29c248e47\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/mockOVM/verification/mockOVM_BondManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.7.0;\\n\\n/* Interface Imports */\\nimport { iOVM_BondManager } from \\\"../../iOVM/verification/iOVM_BondManager.sol\\\";\\n\\n/* Contract Imports */\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/**\\n * @title mockOVM_BondManager\\n */\\ncontract mockOVM_BondManager is iOVM_BondManager, Lib_AddressResolver {\\n constructor(\\n address _libAddressManager\\n )\\n Lib_AddressResolver(_libAddressManager)\\n {}\\n\\n function recordGasSpent(\\n bytes32 _preStateRoot,\\n bytes32 _txHash,\\n address _who,\\n uint256 _gasSpent\\n )\\n override\\n public\\n {}\\n\\n function finalize(\\n bytes32 _preStateRoot,\\n address _publisher,\\n uint256 _timestamp\\n )\\n override\\n public\\n {}\\n\\n function deposit()\\n override\\n public\\n {}\\n\\n function startWithdrawal()\\n override\\n public\\n {}\\n\\n function finalizeWithdrawal()\\n override\\n public\\n {}\\n\\n function claim(\\n address _who\\n )\\n override\\n public\\n {}\\n\\n function isCollateralized(\\n address _who\\n )\\n override\\n public\\n view\\n returns (\\n bool\\n )\\n {\\n // Only authenticate sequencer to submit state root batches.\\n return _who == resolve(\\\"OVM_Sequencer\\\");\\n }\\n\\n function getGasSpent(\\n bytes32 _preStateRoot,\\n address _who\\n )\\n override\\n public\\n view\\n returns (\\n uint256\\n )\\n {\\n return 0;\\n }\\n}\\n\",\"keccak256\":\"0x03c283c91205609fbc19856d9c7fb15da972c3499e00ed049453654723bfaa4c\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x608060405234801561001057600080fd5b506040516104463803806104468339818101604052602081101561003357600080fd5b5051600080546001600160a01b039092166001600160a01b03199092169190911790556103e1806100656000396000f3fe608060405234801561001057600080fd5b50600436106100935760003560e01c8063abfbbe1311610066578063abfbbe13146101f4578063bc2f8dd814610226578063c5b6aa2f14610226578063d0e30db014610226578063dc6453dc1461022e57610093565b806302ad4d2a146100985780631e16e92f146100d25780631e83409a1461010c578063461a447814610132575b600080fd5b6100be600480360360208110156100ae57600080fd5b50356001600160a01b031661026c565b604080519115158252519081900360200190f35b61010a600480360360808110156100e857600080fd5b508035906020810135906001600160a01b0360408201351690606001356102b7565b005b61010a6004803603602081101561012257600080fd5b50356001600160a01b03166102bd565b6101d86004803603602081101561014857600080fd5b81019060208101813564010000000081111561016357600080fd5b82018360208201111561017557600080fd5b8035906020019184600183028401116401000000008311171561019757600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506102c0945050505050565b604080516001600160a01b039092168252519081900360200190f35b61010a6004803603606081101561020a57600080fd5b508035906001600160a01b03602082013516906040013561039c565b61010a6103a1565b61025a6004803603604081101561024457600080fd5b50803590602001356001600160a01b03166103a3565b60408051918252519081900360200190f35b600061029c6040518060400160405280600d81526020016c27ab26afa9b2b8bab2b731b2b960991b8152506102c0565b6001600160a01b0316826001600160a01b0316149050919050565b50505050565b50565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b83811015610320578181015183820152602001610308565b50505050905090810190601f16801561034d5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561036a57600080fd5b505afa15801561037e573d6000803e3d6000fd5b505050506040513d602081101561039457600080fd5b505192915050565b505050565b565b60009291505056fea26469706673582212203f0728d2ffd5e87f3b2f160e5704cc5c07ae231349c1c6286f6360e26317c39b64736f6c63430007060033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100935760003560e01c8063abfbbe1311610066578063abfbbe13146101f4578063bc2f8dd814610226578063c5b6aa2f14610226578063d0e30db014610226578063dc6453dc1461022e57610093565b806302ad4d2a146100985780631e16e92f146100d25780631e83409a1461010c578063461a447814610132575b600080fd5b6100be600480360360208110156100ae57600080fd5b50356001600160a01b031661026c565b604080519115158252519081900360200190f35b61010a600480360360808110156100e857600080fd5b508035906020810135906001600160a01b0360408201351690606001356102b7565b005b61010a6004803603602081101561012257600080fd5b50356001600160a01b03166102bd565b6101d86004803603602081101561014857600080fd5b81019060208101813564010000000081111561016357600080fd5b82018360208201111561017557600080fd5b8035906020019184600183028401116401000000008311171561019757600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506102c0945050505050565b604080516001600160a01b039092168252519081900360200190f35b61010a6004803603606081101561020a57600080fd5b508035906001600160a01b03602082013516906040013561039c565b61010a6103a1565b61025a6004803603604081101561024457600080fd5b50803590602001356001600160a01b03166103a3565b60408051918252519081900360200190f35b600061029c6040518060400160405280600d81526020016c27ab26afa9b2b8bab2b731b2b960991b8152506102c0565b6001600160a01b0316826001600160a01b0316149050919050565b50505050565b50565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b83811015610320578181015183820152602001610308565b50505050905090810190601f16801561034d5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561036a57600080fd5b505afa15801561037e573d6000803e3d6000fd5b505050506040513d602081101561039457600080fd5b505192915050565b505050565b565b60009291505056fea26469706673582212203f0728d2ffd5e87f3b2f160e5704cc5c07ae231349c1c6286f6360e26317c39b64736f6c63430007060033", - "devdoc": { - "kind": "dev", - "methods": {}, - "title": "mockOVM_BondManager", - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": {}, - "version": 1 - }, - "storageLayout": { - "storage": [ - { - "astId": 11707, - "contract": "contracts/optimistic-ethereum/mockOVM/verification/mockOVM_BondManager.sol:mockOVM_BondManager", - "label": "libAddressManager", - "offset": 0, - "slot": "0", - "type": "t_contract(Lib_AddressManager)11700" - } - ], - "types": { - "t_contract(Lib_AddressManager)11700": { - "encoding": "inplace", - "label": "contract Lib_AddressManager", - "numberOfBytes": "20" - } - } - } -} \ No newline at end of file diff --git a/packages/contracts/deployments/mainnet-v1/solcInputs/cebcb515c1a9c570d96e0b8f6fd237e2.json b/packages/contracts/deployments/mainnet-v1/solcInputs/cebcb515c1a9c570d96e0b8f6fd237e2.json deleted file mode 100644 index 2481f94bd54d4..0000000000000 --- a/packages/contracts/deployments/mainnet-v1/solcInputs/cebcb515c1a9c570d96e0b8f6fd237e2.json +++ /dev/null @@ -1,266 +0,0 @@ -{ - "language": "Solidity", - "sources": { - "contracts/optimistic-ethereum/iOVM/accounts/iOVM_ECDSAContractAccount.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/**\n * @title iOVM_ECDSAContractAccount\n */\ninterface iOVM_ECDSAContractAccount {\n\n /********************\n * Public Functions *\n ********************/\n\n function execute(\n bytes memory _transaction,\n Lib_OVMCodec.EOASignatureType _signatureType,\n uint8 _v,\n bytes32 _r,\n bytes32 _s\n ) external returns (bool _success, bytes memory _returndata);\n}\n" - }, - "contracts/optimistic-ethereum/libraries/codec/Lib_OVMCodec.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_RLPReader } from \"../rlp/Lib_RLPReader.sol\";\nimport { Lib_RLPWriter } from \"../rlp/Lib_RLPWriter.sol\";\nimport { Lib_BytesUtils } from \"../utils/Lib_BytesUtils.sol\";\nimport { Lib_Bytes32Utils } from \"../utils/Lib_Bytes32Utils.sol\";\nimport { Lib_SafeExecutionManagerWrapper } from \"../../libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\";\n\n/**\n * @title Lib_OVMCodec\n */\nlibrary Lib_OVMCodec {\n\n /*************\n * Constants *\n *************/\n\n bytes constant internal RLP_NULL_BYTES = hex'80';\n bytes constant internal NULL_BYTES = bytes('');\n\n // Ring buffer IDs\n bytes32 constant internal RING_BUFFER_SCC_BATCHES = keccak256(\"RING_BUFFER_SCC_BATCHES\");\n bytes32 constant internal RING_BUFFER_CTC_BATCHES = keccak256(\"RING_BUFFER_CTC_BATCHES\");\n bytes32 constant internal RING_BUFFER_CTC_QUEUE = keccak256(\"RING_BUFFER_CTC_QUEUE\");\n\n\n /*********\n * Enums *\n *********/\n\n enum EOASignatureType {\n EIP155_TRANSACTON,\n ETH_SIGNED_MESSAGE\n }\n\n enum QueueOrigin {\n SEQUENCER_QUEUE,\n L1TOL2_QUEUE\n }\n\n\n /***********\n * Structs *\n ***********/\n\n struct Account {\n uint256 nonce;\n uint256 balance;\n bytes32 storageRoot;\n bytes32 codeHash;\n address ethAddress;\n bool isFresh;\n }\n\n struct EVMAccount {\n uint256 nonce;\n uint256 balance;\n bytes32 storageRoot;\n bytes32 codeHash;\n }\n\n struct ChainBatchHeader {\n uint256 batchIndex;\n bytes32 batchRoot;\n uint256 batchSize;\n uint256 prevTotalElements;\n bytes extraData;\n }\n\n struct ChainInclusionProof {\n uint256 index;\n bytes32[] siblings;\n }\n\n struct Transaction {\n uint256 timestamp;\n uint256 blockNumber;\n QueueOrigin l1QueueOrigin;\n address l1TxOrigin;\n address entrypoint;\n uint256 gasLimit;\n bytes data;\n }\n\n struct TransactionChainElement {\n bool isSequenced;\n uint256 queueIndex; // QUEUED TX ONLY\n uint256 timestamp; // SEQUENCER TX ONLY\n uint256 blockNumber; // SEQUENCER TX ONLY\n bytes txData; // SEQUENCER TX ONLY\n }\n\n struct QueueElement {\n bytes32 queueRoot;\n uint40 timestamp;\n uint40 blockNumber;\n }\n\n struct EIP155Transaction {\n uint256 nonce;\n uint256 gasPrice;\n uint256 gasLimit;\n address to;\n uint256 value;\n bytes data;\n uint256 chainId;\n }\n\n\n /*********************************************\n * Internal Functions: Encoding and Decoding *\n *********************************************/\n\n /**\n * Decodes an EOA transaction (i.e., native Ethereum RLP encoding).\n * @param _transaction Encoded EOA transaction.\n * @return _decoded Transaction decoded into a struct.\n */\n function decodeEIP155Transaction(\n bytes memory _transaction,\n bool _isEthSignedMessage\n )\n internal\n pure\n returns (\n EIP155Transaction memory _decoded\n )\n {\n if (_isEthSignedMessage) {\n (\n uint256 _nonce,\n uint256 _gasLimit,\n uint256 _gasPrice,\n uint256 _chainId,\n address _to,\n bytes memory _data\n ) = abi.decode(\n _transaction,\n (uint256, uint256, uint256, uint256, address ,bytes)\n );\n return EIP155Transaction({\n nonce: _nonce,\n gasPrice: _gasPrice,\n gasLimit: _gasLimit,\n to: _to,\n value: 0,\n data: _data,\n chainId: _chainId\n });\n } else {\n Lib_RLPReader.RLPItem[] memory decoded = Lib_RLPReader.readList(_transaction);\n\n return EIP155Transaction({\n nonce: Lib_RLPReader.readUint256(decoded[0]),\n gasPrice: Lib_RLPReader.readUint256(decoded[1]),\n gasLimit: Lib_RLPReader.readUint256(decoded[2]),\n to: Lib_RLPReader.readAddress(decoded[3]),\n value: Lib_RLPReader.readUint256(decoded[4]),\n data: Lib_RLPReader.readBytes(decoded[5]),\n chainId: Lib_RLPReader.readUint256(decoded[6])\n });\n }\n }\n\n function decompressEIP155Transaction(\n bytes memory _transaction\n )\n internal\n returns (\n EIP155Transaction memory _decompressed\n )\n {\n return EIP155Transaction({\n gasLimit: Lib_BytesUtils.toUint24(_transaction, 0),\n gasPrice: uint256(Lib_BytesUtils.toUint24(_transaction, 3)) * 1000000,\n nonce: Lib_BytesUtils.toUint24(_transaction, 6),\n to: Lib_BytesUtils.toAddress(_transaction, 9),\n data: Lib_BytesUtils.slice(_transaction, 29),\n chainId: Lib_SafeExecutionManagerWrapper.safeCHAINID(),\n value: 0\n });\n }\n\n /**\n * Encodes an EOA transaction back into the original transaction.\n * @param _transaction EIP155transaction to encode.\n * @param _isEthSignedMessage Whether or not this was an eth signed message.\n * @return Encoded transaction.\n */\n function encodeEIP155Transaction(\n EIP155Transaction memory _transaction,\n bool _isEthSignedMessage\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n if (_isEthSignedMessage) {\n return abi.encode(\n _transaction.nonce,\n _transaction.gasLimit,\n _transaction.gasPrice,\n _transaction.chainId,\n _transaction.to,\n _transaction.data\n );\n } else {\n bytes[] memory raw = new bytes[](9);\n\n raw[0] = Lib_RLPWriter.writeUint(_transaction.nonce);\n raw[1] = Lib_RLPWriter.writeUint(_transaction.gasPrice);\n raw[2] = Lib_RLPWriter.writeUint(_transaction.gasLimit);\n if (_transaction.to == address(0)) {\n raw[3] = Lib_RLPWriter.writeBytes('');\n } else {\n raw[3] = Lib_RLPWriter.writeAddress(_transaction.to);\n }\n raw[4] = Lib_RLPWriter.writeUint(0);\n raw[5] = Lib_RLPWriter.writeBytes(_transaction.data);\n raw[6] = Lib_RLPWriter.writeUint(_transaction.chainId);\n raw[7] = Lib_RLPWriter.writeBytes(bytes(''));\n raw[8] = Lib_RLPWriter.writeBytes(bytes(''));\n\n return Lib_RLPWriter.writeList(raw);\n }\n }\n\n /**\n * Encodes a standard OVM transaction.\n * @param _transaction OVM transaction to encode.\n * @return _encoded Encoded transaction bytes.\n */\n function encodeTransaction(\n Transaction memory _transaction\n )\n internal\n pure\n returns (\n bytes memory _encoded\n )\n {\n return abi.encodePacked(\n _transaction.timestamp,\n _transaction.blockNumber,\n _transaction.l1QueueOrigin,\n _transaction.l1TxOrigin,\n _transaction.entrypoint,\n _transaction.gasLimit,\n _transaction.data\n );\n }\n\n /**\n * Hashes a standard OVM transaction.\n * @param _transaction OVM transaction to encode.\n * @return _hash Hashed transaction\n */\n function hashTransaction(\n Transaction memory _transaction\n )\n internal\n pure\n returns (\n bytes32 _hash\n )\n {\n return keccak256(encodeTransaction(_transaction));\n }\n\n /**\n * Converts an OVM account to an EVM account.\n * @param _in OVM account to convert.\n * @return _out Converted EVM account.\n */\n function toEVMAccount(\n Account memory _in\n )\n internal\n pure\n returns (\n EVMAccount memory _out\n )\n {\n return EVMAccount({\n nonce: _in.nonce,\n balance: _in.balance,\n storageRoot: _in.storageRoot,\n codeHash: _in.codeHash\n });\n }\n\n /**\n * @notice RLP-encodes an account state struct.\n * @param _account Account state struct.\n * @return _encoded RLP-encoded account state.\n */\n function encodeEVMAccount(\n EVMAccount memory _account\n )\n internal\n pure\n returns (\n bytes memory _encoded\n )\n {\n bytes[] memory raw = new bytes[](4);\n\n // Unfortunately we can't create this array outright because\n // Lib_RLPWriter.writeList will reject fixed-size arrays. Assigning\n // index-by-index circumvents this issue.\n raw[0] = Lib_RLPWriter.writeBytes(\n Lib_Bytes32Utils.removeLeadingZeros(\n bytes32(_account.nonce)\n )\n );\n raw[1] = Lib_RLPWriter.writeBytes(\n Lib_Bytes32Utils.removeLeadingZeros(\n bytes32(_account.balance)\n )\n );\n raw[2] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.storageRoot));\n raw[3] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.codeHash));\n\n return Lib_RLPWriter.writeList(raw);\n }\n\n /**\n * @notice Decodes an RLP-encoded account state into a useful struct.\n * @param _encoded RLP-encoded account state.\n * @return _account Account state struct.\n */\n function decodeEVMAccount(\n bytes memory _encoded\n )\n internal\n pure\n returns (\n EVMAccount memory _account\n )\n {\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\n\n return EVMAccount({\n nonce: Lib_RLPReader.readUint256(accountState[0]),\n balance: Lib_RLPReader.readUint256(accountState[1]),\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\n });\n }\n\n /**\n * Calculates a hash for a given batch header.\n * @param _batchHeader Header to hash.\n * @return _hash Hash of the header.\n */\n function hashBatchHeader(\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\n )\n internal\n pure\n returns (\n bytes32 _hash\n )\n {\n return keccak256(\n abi.encode(\n _batchHeader.batchRoot,\n _batchHeader.batchSize,\n _batchHeader.prevTotalElements,\n _batchHeader.extraData\n )\n );\n }\n}\n" - }, - "contracts/optimistic-ethereum/libraries/rlp/Lib_RLPReader.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.7.0;\n\n/**\n * @title Lib_RLPReader\n * @dev Adapted from \"RLPReader\" by Hamdi Allam (hamdi.allam97@gmail.com).\n */\nlibrary Lib_RLPReader {\n\n /*************\n * Constants *\n *************/\n\n uint256 constant internal MAX_LIST_LENGTH = 32;\n\n\n /*********\n * Enums *\n *********/\n\n enum RLPItemType {\n DATA_ITEM,\n LIST_ITEM\n }\n\n \n /***********\n * Structs *\n ***********/\n\n struct RLPItem {\n uint256 length;\n uint256 ptr;\n }\n \n\n /**********************\n * Internal Functions *\n **********************/\n \n /**\n * Converts bytes to a reference to memory position and length.\n * @param _in Input bytes to convert.\n * @return Output memory reference.\n */\n function toRLPItem(\n bytes memory _in\n )\n internal\n pure\n returns (\n RLPItem memory\n )\n {\n uint256 ptr;\n assembly {\n ptr := add(_in, 32)\n }\n\n return RLPItem({\n length: _in.length,\n ptr: ptr\n });\n }\n\n /**\n * Reads an RLP list value into a list of RLP items.\n * @param _in RLP list value.\n * @return Decoded RLP list items.\n */\n function readList(\n RLPItem memory _in\n )\n internal\n pure\n returns (\n RLPItem[] memory\n )\n {\n (\n uint256 listOffset,\n ,\n RLPItemType itemType\n ) = _decodeLength(_in);\n\n require(\n itemType == RLPItemType.LIST_ITEM,\n \"Invalid RLP list value.\"\n );\n\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\n // writing to the length. Since we can't know the number of RLP items without looping over\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\n // simply set a reasonable maximum list length and decrease the size before we finish.\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\n\n uint256 itemCount = 0;\n uint256 offset = listOffset;\n while (offset < _in.length) {\n require(\n itemCount < MAX_LIST_LENGTH,\n \"Provided RLP list exceeds max list length.\"\n );\n\n (\n uint256 itemOffset,\n uint256 itemLength,\n ) = _decodeLength(RLPItem({\n length: _in.length - offset,\n ptr: _in.ptr + offset\n }));\n\n out[itemCount] = RLPItem({\n length: itemLength + itemOffset,\n ptr: _in.ptr + offset\n });\n\n itemCount += 1;\n offset += itemOffset + itemLength;\n }\n\n // Decrease the array size to match the actual item count.\n assembly {\n mstore(out, itemCount)\n }\n\n return out;\n }\n\n /**\n * Reads an RLP list value into a list of RLP items.\n * @param _in RLP list value.\n * @return Decoded RLP list items.\n */\n function readList(\n bytes memory _in\n )\n internal\n pure\n returns (\n RLPItem[] memory\n )\n {\n return readList(\n toRLPItem(_in)\n );\n }\n\n /**\n * Reads an RLP bytes value into bytes.\n * @param _in RLP bytes value.\n * @return Decoded bytes.\n */\n function readBytes(\n RLPItem memory _in\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n (\n uint256 itemOffset,\n uint256 itemLength,\n RLPItemType itemType\n ) = _decodeLength(_in);\n\n require(\n itemType == RLPItemType.DATA_ITEM,\n \"Invalid RLP bytes value.\"\n );\n\n return _copy(_in.ptr, itemOffset, itemLength);\n }\n\n /**\n * Reads an RLP bytes value into bytes.\n * @param _in RLP bytes value.\n * @return Decoded bytes.\n */\n function readBytes(\n bytes memory _in\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n return readBytes(\n toRLPItem(_in)\n );\n }\n\n /**\n * Reads an RLP string value into a string.\n * @param _in RLP string value.\n * @return Decoded string.\n */\n function readString(\n RLPItem memory _in\n )\n internal\n pure\n returns (\n string memory\n )\n {\n return string(readBytes(_in));\n }\n\n /**\n * Reads an RLP string value into a string.\n * @param _in RLP string value.\n * @return Decoded string.\n */\n function readString(\n bytes memory _in\n )\n internal\n pure\n returns (\n string memory\n )\n {\n return readString(\n toRLPItem(_in)\n );\n }\n\n /**\n * Reads an RLP bytes32 value into a bytes32.\n * @param _in RLP bytes32 value.\n * @return Decoded bytes32.\n */\n function readBytes32(\n RLPItem memory _in\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n require(\n _in.length <= 33,\n \"Invalid RLP bytes32 value.\"\n );\n\n (\n uint256 itemOffset,\n uint256 itemLength,\n RLPItemType itemType\n ) = _decodeLength(_in);\n\n require(\n itemType == RLPItemType.DATA_ITEM,\n \"Invalid RLP bytes32 value.\"\n );\n\n uint256 ptr = _in.ptr + itemOffset;\n bytes32 out;\n assembly {\n out := mload(ptr)\n\n // Shift the bytes over to match the item size.\n if lt(itemLength, 32) {\n out := div(out, exp(256, sub(32, itemLength)))\n }\n }\n\n return out;\n }\n\n /**\n * Reads an RLP bytes32 value into a bytes32.\n * @param _in RLP bytes32 value.\n * @return Decoded bytes32.\n */\n function readBytes32(\n bytes memory _in\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n return readBytes32(\n toRLPItem(_in)\n );\n }\n\n /**\n * Reads an RLP uint256 value into a uint256.\n * @param _in RLP uint256 value.\n * @return Decoded uint256.\n */\n function readUint256(\n RLPItem memory _in\n )\n internal\n pure\n returns (\n uint256\n )\n {\n return uint256(readBytes32(_in));\n }\n\n /**\n * Reads an RLP uint256 value into a uint256.\n * @param _in RLP uint256 value.\n * @return Decoded uint256.\n */\n function readUint256(\n bytes memory _in\n )\n internal\n pure\n returns (\n uint256\n )\n {\n return readUint256(\n toRLPItem(_in)\n );\n }\n\n /**\n * Reads an RLP bool value into a bool.\n * @param _in RLP bool value.\n * @return Decoded bool.\n */\n function readBool(\n RLPItem memory _in\n )\n internal\n pure\n returns (\n bool\n )\n {\n require(\n _in.length == 1,\n \"Invalid RLP boolean value.\"\n );\n\n uint256 ptr = _in.ptr;\n uint256 out;\n assembly {\n out := byte(0, mload(ptr))\n }\n\n return out != 0;\n }\n\n /**\n * Reads an RLP bool value into a bool.\n * @param _in RLP bool value.\n * @return Decoded bool.\n */\n function readBool(\n bytes memory _in\n )\n internal\n pure\n returns (\n bool\n )\n {\n return readBool(\n toRLPItem(_in)\n );\n }\n\n /**\n * Reads an RLP address value into a address.\n * @param _in RLP address value.\n * @return Decoded address.\n */\n function readAddress(\n RLPItem memory _in\n )\n internal\n pure\n returns (\n address\n )\n {\n if (_in.length == 1) {\n return address(0);\n }\n\n require(\n _in.length == 21,\n \"Invalid RLP address value.\"\n );\n\n return address(readUint256(_in));\n }\n\n /**\n * Reads an RLP address value into a address.\n * @param _in RLP address value.\n * @return Decoded address.\n */\n function readAddress(\n bytes memory _in\n )\n internal\n pure\n returns (\n address\n )\n {\n return readAddress(\n toRLPItem(_in)\n );\n }\n\n /**\n * Reads the raw bytes of an RLP item.\n * @param _in RLP item to read.\n * @return Raw RLP bytes.\n */\n function readRawBytes(\n RLPItem memory _in\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n return _copy(_in);\n }\n\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * Decodes the length of an RLP item.\n * @param _in RLP item to decode.\n * @return Offset of the encoded data.\n * @return Length of the encoded data.\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\n */\n function _decodeLength(\n RLPItem memory _in\n )\n private\n pure\n returns (\n uint256,\n uint256,\n RLPItemType\n )\n {\n require(\n _in.length > 0,\n \"RLP item cannot be null.\"\n );\n\n uint256 ptr = _in.ptr;\n uint256 prefix;\n assembly {\n prefix := byte(0, mload(ptr))\n }\n\n if (prefix <= 0x7f) {\n // Single byte.\n\n return (0, 1, RLPItemType.DATA_ITEM);\n } else if (prefix <= 0xb7) {\n // Short string.\n\n uint256 strLen = prefix - 0x80;\n \n require(\n _in.length > strLen,\n \"Invalid RLP short string.\"\n );\n\n return (1, strLen, RLPItemType.DATA_ITEM);\n } else if (prefix <= 0xbf) {\n // Long string.\n uint256 lenOfStrLen = prefix - 0xb7;\n\n require(\n _in.length > lenOfStrLen,\n \"Invalid RLP long string length.\"\n );\n\n uint256 strLen;\n assembly {\n // Pick out the string length.\n strLen := div(\n mload(add(ptr, 1)),\n exp(256, sub(32, lenOfStrLen))\n )\n }\n\n require(\n _in.length > lenOfStrLen + strLen,\n \"Invalid RLP long string.\"\n );\n\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\n } else if (prefix <= 0xf7) {\n // Short list.\n uint256 listLen = prefix - 0xc0;\n\n require(\n _in.length > listLen,\n \"Invalid RLP short list.\"\n );\n\n return (1, listLen, RLPItemType.LIST_ITEM);\n } else {\n // Long list.\n uint256 lenOfListLen = prefix - 0xf7;\n\n require(\n _in.length > lenOfListLen,\n \"Invalid RLP long list length.\"\n );\n\n uint256 listLen;\n assembly {\n // Pick out the list length.\n listLen := div(\n mload(add(ptr, 1)),\n exp(256, sub(32, lenOfListLen))\n )\n }\n\n require(\n _in.length > lenOfListLen + listLen,\n \"Invalid RLP long list.\"\n );\n\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\n }\n }\n\n /**\n * Copies the bytes from a memory location.\n * @param _src Pointer to the location to read from.\n * @param _offset Offset to start reading from.\n * @param _length Number of bytes to read.\n * @return Copied bytes.\n */\n function _copy(\n uint256 _src,\n uint256 _offset,\n uint256 _length\n )\n private\n pure\n returns (\n bytes memory\n )\n {\n bytes memory out = new bytes(_length);\n if (out.length == 0) {\n return out;\n }\n\n uint256 src = _src + _offset;\n uint256 dest;\n assembly {\n dest := add(out, 32)\n }\n\n // Copy over as many complete words as we can.\n for (uint256 i = 0; i < _length / 32; i++) {\n assembly {\n mstore(dest, mload(src))\n }\n\n src += 32;\n dest += 32;\n }\n\n // Pick out the remaining bytes.\n uint256 mask = 256 ** (32 - (_length % 32)) - 1;\n assembly {\n mstore(\n dest,\n or(\n and(mload(src), not(mask)),\n and(mload(dest), mask)\n )\n )\n }\n\n return out;\n }\n\n /**\n * Copies an RLP item into bytes.\n * @param _in RLP item to copy.\n * @return Copied bytes.\n */\n function _copy(\n RLPItem memory _in\n )\n private\n pure\n returns (\n bytes memory\n )\n {\n return _copy(_in.ptr, 0, _in.length);\n }\n}\n" - }, - "contracts/optimistic-ethereum/libraries/rlp/Lib_RLPWriter.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.7.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_BytesUtils } from \"../utils/Lib_BytesUtils.sol\";\n\n/**\n * @title Lib_RLPWriter\n * @author Bakaoh (with modifications)\n */\nlibrary Lib_RLPWriter {\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * RLP encodes a byte string.\n * @param _in The byte string to encode.\n * @return _out The RLP encoded string in bytes.\n */\n function writeBytes(\n bytes memory _in\n )\n internal\n pure\n returns (\n bytes memory _out\n )\n {\n bytes memory encoded;\n\n if (_in.length == 1 && uint8(_in[0]) < 128) {\n encoded = _in;\n } else {\n encoded = Lib_BytesUtils.concat(_writeLength(_in.length, 128), _in);\n }\n\n return encoded;\n }\n\n /**\n * RLP encodes a list of RLP encoded byte byte strings.\n * @param _in The list of RLP encoded byte strings.\n * @return _out The RLP encoded list of items in bytes.\n */\n function writeList(\n bytes[] memory _in\n )\n internal\n pure\n returns (\n bytes memory _out\n )\n {\n bytes memory list = _flatten(_in);\n return Lib_BytesUtils.concat(_writeLength(list.length, 192), list);\n }\n\n /**\n * RLP encodes a string.\n * @param _in The string to encode.\n * @return _out The RLP encoded string in bytes.\n */\n function writeString(\n string memory _in\n )\n internal\n pure\n returns (\n bytes memory _out\n )\n {\n return writeBytes(bytes(_in));\n }\n\n /**\n * RLP encodes an address.\n * @param _in The address to encode.\n * @return _out The RLP encoded address in bytes.\n */\n function writeAddress(\n address _in\n )\n internal\n pure\n returns (\n bytes memory _out\n )\n {\n return writeBytes(abi.encodePacked(_in));\n }\n\n /**\n * RLP encodes a uint.\n * @param _in The uint256 to encode.\n * @return _out The RLP encoded uint256 in bytes.\n */\n function writeUint(\n uint256 _in\n )\n internal\n pure\n returns (\n bytes memory _out\n )\n {\n return writeBytes(_toBinary(_in));\n }\n\n /**\n * RLP encodes a bool.\n * @param _in The bool to encode.\n * @return _out The RLP encoded bool in bytes.\n */\n function writeBool(\n bool _in\n )\n internal\n pure\n returns (\n bytes memory _out\n )\n {\n bytes memory encoded = new bytes(1);\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\n return encoded;\n }\n\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\n * @param _len The length of the string or the payload.\n * @param _offset 128 if item is string, 192 if item is list.\n * @return _encoded RLP encoded bytes.\n */\n function _writeLength(\n uint256 _len,\n uint256 _offset\n )\n private\n pure\n returns (\n bytes memory _encoded\n )\n {\n bytes memory encoded;\n\n if (_len < 56) {\n encoded = new bytes(1);\n encoded[0] = byte(uint8(_len) + uint8(_offset));\n } else {\n uint256 lenLen;\n uint256 i = 1;\n while (_len / i != 0) {\n lenLen++;\n i *= 256;\n }\n\n encoded = new bytes(lenLen + 1);\n encoded[0] = byte(uint8(lenLen) + uint8(_offset) + 55);\n for(i = 1; i <= lenLen; i++) {\n encoded[i] = byte(uint8((_len / (256**(lenLen-i))) % 256));\n }\n }\n\n return encoded;\n }\n\n /**\n * Encode integer in big endian binary form with no leading zeroes.\n * @notice TODO: This should be optimized with assembly to save gas costs.\n * @param _x The integer to encode.\n * @return _binary RLP encoded bytes.\n */\n function _toBinary(\n uint256 _x\n )\n private\n pure\n returns (\n bytes memory _binary\n )\n {\n bytes memory b = abi.encodePacked(_x);\n\n uint256 i = 0;\n for (; i < 32; i++) {\n if (b[i] != 0) {\n break;\n }\n }\n\n bytes memory res = new bytes(32 - i);\n for (uint256 j = 0; j < res.length; j++) {\n res[j] = b[i++];\n }\n\n return res;\n }\n\n /**\n * Copies a piece of memory to another location.\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\n * @param _dest Destination location.\n * @param _src Source location.\n * @param _len Length of memory to copy.\n */\n function _memcpy(\n uint256 _dest,\n uint256 _src,\n uint256 _len\n )\n private\n pure\n {\n uint256 dest = _dest;\n uint256 src = _src;\n uint256 len = _len;\n\n for(; len >= 32; len -= 32) {\n assembly {\n mstore(dest, mload(src))\n }\n dest += 32;\n src += 32;\n }\n\n uint256 mask = 256 ** (32 - len) - 1;\n assembly {\n let srcpart := and(mload(src), not(mask))\n let destpart := and(mload(dest), mask)\n mstore(dest, or(destpart, srcpart))\n }\n }\n\n /**\n * Flattens a list of byte strings into one byte string.\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\n * @param _list List of byte strings to flatten.\n * @return _flattened The flattened byte string.\n */\n function _flatten(\n bytes[] memory _list\n )\n private\n pure\n returns (\n bytes memory _flattened\n )\n {\n if (_list.length == 0) {\n return new bytes(0);\n }\n\n uint256 len;\n uint256 i = 0;\n for (; i < _list.length; i++) {\n len += _list[i].length;\n }\n\n bytes memory flattened = new bytes(len);\n uint256 flattenedPtr;\n assembly { flattenedPtr := add(flattened, 0x20) }\n\n for(i = 0; i < _list.length; i++) {\n bytes memory item = _list[i];\n\n uint256 listPtr;\n assembly { listPtr := add(item, 0x20)}\n\n _memcpy(flattenedPtr, listPtr, item.length);\n flattenedPtr += _list[i].length;\n }\n\n return flattened;\n }\n}" - }, - "contracts/optimistic-ethereum/libraries/utils/Lib_BytesUtils.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.7.0;\n\n/**\n * @title Lib_BytesUtils\n */\nlibrary Lib_BytesUtils {\n\n /**********************\n * Internal Functions *\n **********************/\n\n function concat(\n bytes memory _preBytes,\n bytes memory _postBytes\n )\n internal\n pure\n returns (bytes memory)\n {\n bytes memory tempBytes;\n\n assembly {\n // Get a location of some free memory and store it in tempBytes as\n // Solidity does for memory variables.\n tempBytes := mload(0x40)\n\n // Store the length of the first bytes array at the beginning of\n // the memory for tempBytes.\n let length := mload(_preBytes)\n mstore(tempBytes, length)\n\n // Maintain a memory counter for the current write location in the\n // temp bytes array by adding the 32 bytes for the array length to\n // the starting location.\n let mc := add(tempBytes, 0x20)\n // Stop copying when the memory counter reaches the length of the\n // first bytes array.\n let end := add(mc, length)\n\n for {\n // Initialize a copy counter to the start of the _preBytes data,\n // 32 bytes into its memory.\n let cc := add(_preBytes, 0x20)\n } lt(mc, end) {\n // Increase both counters by 32 bytes each iteration.\n mc := add(mc, 0x20)\n cc := add(cc, 0x20)\n } {\n // Write the _preBytes data into the tempBytes memory 32 bytes\n // at a time.\n mstore(mc, mload(cc))\n }\n\n // Add the length of _postBytes to the current length of tempBytes\n // and store it as the new length in the first 32 bytes of the\n // tempBytes memory.\n length := mload(_postBytes)\n mstore(tempBytes, add(length, mload(tempBytes)))\n\n // Move the memory counter back from a multiple of 0x20 to the\n // actual end of the _preBytes data.\n mc := end\n // Stop copying when the memory counter reaches the new combined\n // length of the arrays.\n end := add(mc, length)\n\n for {\n let cc := add(_postBytes, 0x20)\n } lt(mc, end) {\n mc := add(mc, 0x20)\n cc := add(cc, 0x20)\n } {\n mstore(mc, mload(cc))\n }\n\n // Update the free-memory pointer by padding our last write location\n // to 32 bytes: add 31 bytes to the end of tempBytes to move to the\n // next 32 byte block, then round down to the nearest multiple of\n // 32. If the sum of the length of the two arrays is zero then add\n // one before rounding down to leave a blank 32 bytes (the length block with 0).\n mstore(0x40, and(\n add(add(end, iszero(add(length, mload(_preBytes)))), 31),\n not(31) // Round down to the nearest 32 bytes.\n ))\n }\n\n return tempBytes;\n }\n\n function slice(\n bytes memory _bytes,\n uint256 _start,\n uint256 _length\n )\n internal\n pure\n returns (bytes memory)\n {\n require(_length + 31 >= _length, \"slice_overflow\");\n require(_start + _length >= _start, \"slice_overflow\");\n require(_bytes.length >= _start + _length, \"slice_outOfBounds\");\n\n bytes memory tempBytes;\n\n assembly {\n switch iszero(_length)\n case 0 {\n // Get a location of some free memory and store it in tempBytes as\n // Solidity does for memory variables.\n tempBytes := mload(0x40)\n\n // The first word of the slice result is potentially a partial\n // word read from the original array. To read it, we calculate\n // the length of that partial word and start copying that many\n // bytes into the array. The first word we copy will start with\n // data we don't care about, but the last `lengthmod` bytes will\n // land at the beginning of the contents of the new array. When\n // we're done copying, we overwrite the full first word with\n // the actual length of the slice.\n let lengthmod := and(_length, 31)\n\n // The multiplication in the next line is necessary\n // because when slicing multiples of 32 bytes (lengthmod == 0)\n // the following copy loop was copying the origin's length\n // and then ending prematurely not copying everything it should.\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\n let end := add(mc, _length)\n\n for {\n // The multiplication in the next line has the same exact purpose\n // as the one above.\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\n } lt(mc, end) {\n mc := add(mc, 0x20)\n cc := add(cc, 0x20)\n } {\n mstore(mc, mload(cc))\n }\n\n mstore(tempBytes, _length)\n\n //update free-memory pointer\n //allocating the array padded to 32 bytes like the compiler does now\n mstore(0x40, and(add(mc, 31), not(31)))\n }\n //if we want a zero-length slice let's just return a zero-length array\n default {\n tempBytes := mload(0x40)\n\n //zero out the 32 bytes slice we are about to return\n //we need to do it because Solidity does not garbage collect\n mstore(tempBytes, 0)\n\n mstore(0x40, add(tempBytes, 0x20))\n }\n }\n\n return tempBytes;\n }\n\n function slice(\n bytes memory _bytes,\n uint256 _start\n )\n internal\n pure\n returns (bytes memory)\n {\n if (_bytes.length - _start == 0) {\n return bytes('');\n }\n\n return slice(_bytes, _start, _bytes.length - _start);\n }\n\n function toBytes32PadLeft(\n bytes memory _bytes\n )\n internal\n pure\n returns (bytes32)\n {\n bytes32 ret;\n uint256 len = _bytes.length <= 32 ? _bytes.length : 32;\n assembly {\n ret := shr(mul(sub(32, len), 8), mload(add(_bytes, 32)))\n }\n return ret;\n }\n\n function toBytes32(\n bytes memory _bytes\n )\n internal\n pure\n returns (bytes32)\n {\n if (_bytes.length < 32) {\n bytes32 ret;\n assembly {\n ret := mload(add(_bytes, 32))\n }\n return ret;\n }\n\n return abi.decode(_bytes,(bytes32)); // will truncate if input length > 32 bytes\n }\n\n function toUint256(\n bytes memory _bytes\n )\n internal\n pure\n returns (uint256)\n {\n return uint256(toBytes32(_bytes));\n }\n\n function toUint24(bytes memory _bytes, uint256 _start) internal pure returns (uint24) {\n require(_start + 3 >= _start, \"toUint24_overflow\");\n require(_bytes.length >= _start + 3 , \"toUint24_outOfBounds\");\n uint24 tempUint;\n\n assembly {\n tempUint := mload(add(add(_bytes, 0x3), _start))\n }\n\n return tempUint;\n }\n\n function toUint8(bytes memory _bytes, uint256 _start) internal pure returns (uint8) {\n require(_start + 1 >= _start, \"toUint8_overflow\");\n require(_bytes.length >= _start + 1 , \"toUint8_outOfBounds\");\n uint8 tempUint;\n\n assembly {\n tempUint := mload(add(add(_bytes, 0x1), _start))\n }\n\n return tempUint;\n }\n\n function toAddress(bytes memory _bytes, uint256 _start) internal pure returns (address) {\n require(_start + 20 >= _start, \"toAddress_overflow\");\n require(_bytes.length >= _start + 20, \"toAddress_outOfBounds\");\n address tempAddress;\n\n assembly {\n tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000)\n }\n\n return tempAddress;\n }\n\n function toNibbles(\n bytes memory _bytes\n )\n internal\n pure\n returns (bytes memory)\n {\n bytes memory nibbles = new bytes(_bytes.length * 2);\n\n for (uint256 i = 0; i < _bytes.length; i++) {\n nibbles[i * 2] = _bytes[i] >> 4;\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\n }\n\n return nibbles;\n }\n\n function fromNibbles(\n bytes memory _bytes\n )\n internal\n pure\n returns (bytes memory)\n {\n bytes memory ret = new bytes(_bytes.length / 2);\n\n for (uint256 i = 0; i < ret.length; i++) {\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\n }\n\n return ret;\n }\n\n function equal(\n bytes memory _bytes,\n bytes memory _other\n )\n internal\n pure\n returns (bool)\n {\n return keccak256(_bytes) == keccak256(_other);\n }\n}\n" - }, - "contracts/optimistic-ethereum/libraries/utils/Lib_Bytes32Utils.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.7.0;\n\n/**\n * @title Lib_Byte32Utils\n */\nlibrary Lib_Bytes32Utils {\n\n /**********************\n * Internal Functions *\n **********************/\n\n function toBool(\n bytes32 _in\n )\n internal\n pure\n returns (\n bool _out\n )\n {\n return _in != 0;\n }\n\n function fromBool(\n bool _in\n )\n internal\n pure\n returns (\n bytes32 _out\n )\n {\n return bytes32(uint256(_in ? 1 : 0));\n }\n\n function toAddress(\n bytes32 _in\n )\n internal\n pure\n returns (\n address _out\n )\n {\n return address(uint160(uint256(_in)));\n }\n\n function fromAddress(\n address _in\n )\n internal\n pure\n returns (\n bytes32 _out\n )\n {\n return bytes32(uint256(_in));\n }\n\n function removeLeadingZeros(\n bytes32 _in\n )\n internal\n pure\n returns (\n bytes memory _out\n )\n {\n bytes memory out;\n\n assembly {\n // Figure out how many leading zero bytes to remove.\n let shift := 0\n for { let i := 0 } and(lt(i, 32), eq(byte(i, _in), 0)) { i := add(i, 1) } {\n shift := add(shift, 1)\n }\n\n // Reserve some space for our output and fix the free memory pointer.\n out := mload(0x40)\n mstore(0x40, add(out, 0x40))\n\n // Shift the value and store it into the output bytes.\n mstore(add(out, 0x20), shl(mul(shift, 8), _in))\n\n // Store the new size (with leading zero bytes removed) in the output byte size.\n mstore(out, sub(32, shift))\n }\n\n return out;\n }\n}\n" - }, - "contracts/optimistic-ethereum/libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.7.0;\n\n/**\n * @title Lib_SafeExecutionManagerWrapper\n */\nlibrary Lib_SafeExecutionManagerWrapper {\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Makes an ovmCALL and performs all the necessary safety checks.\n * @param _gasLimit Gas limit for the call.\n * @param _target Address to call.\n * @param _calldata Data to send to the call.\n * @return _success Whether or not the call reverted.\n * @return _returndata Data returned by the call.\n */\n function safeCALL(\n uint256 _gasLimit,\n address _target,\n bytes memory _calldata\n )\n internal\n returns (\n bool _success,\n bytes memory _returndata\n )\n {\n bytes memory returndata = _safeExecutionManagerInteraction(\n abi.encodeWithSignature(\n \"ovmCALL(uint256,address,bytes)\",\n _gasLimit,\n _target,\n _calldata\n )\n );\n\n return abi.decode(returndata, (bool, bytes));\n }\n\n /**\n * Makes an ovmCALL and performs all the necessary safety checks.\n * @param _gasLimit Gas limit for the call.\n * @param _target Address to call.\n * @param _calldata Data to send to the call.\n * @return _success Whether or not the call reverted.\n * @return _returndata Data returned by the call.\n */\n function safeDELEGATECALL(\n uint256 _gasLimit,\n address _target,\n bytes memory _calldata\n )\n internal\n returns (\n bool _success,\n bytes memory _returndata\n )\n {\n bytes memory returndata = _safeExecutionManagerInteraction(\n abi.encodeWithSignature(\n \"ovmDELEGATECALL(uint256,address,bytes)\",\n _gasLimit,\n _target,\n _calldata\n )\n );\n\n return abi.decode(returndata, (bool, bytes));\n }\n\n /**\n * Performs an ovmCREATE and the necessary safety checks.\n * @param _gasLimit Gas limit for the creation.\n * @param _bytecode Code for the new contract.\n * @return _contract Address of the created contract.\n */\n function safeCREATE(\n uint256 _gasLimit,\n bytes memory _bytecode\n )\n internal\n returns (\n address _contract\n )\n {\n bytes memory returndata = _safeExecutionManagerInteraction(\n _gasLimit,\n abi.encodeWithSignature(\n \"ovmCREATE(bytes)\",\n _bytecode\n )\n );\n\n return abi.decode(returndata, (address));\n }\n\n /**\n * Performs an ovmEXTCODESIZE and the necessary safety checks.\n * @param _contract Address of the contract to query the size of.\n * @return _EXTCODESIZE Size of the requested contract in bytes.\n */\n function safeEXTCODESIZE(\n address _contract\n )\n internal\n returns (\n uint256 _EXTCODESIZE\n )\n {\n bytes memory returndata = _safeExecutionManagerInteraction(\n abi.encodeWithSignature(\n \"ovmEXTCODESIZE(address)\",\n _contract\n )\n );\n\n return abi.decode(returndata, (uint256));\n }\n\n /**\n * Performs a safe ovmCHAINID call.\n * @return _CHAINID Result of calling ovmCHAINID.\n */\n function safeCHAINID()\n internal\n returns (\n uint256 _CHAINID\n )\n {\n bytes memory returndata = _safeExecutionManagerInteraction(\n abi.encodeWithSignature(\n \"ovmCHAINID()\"\n )\n );\n\n return abi.decode(returndata, (uint256));\n }\n\n /**\n * Performs a safe ovmCALLER call.\n * @return _CALLER Result of calling ovmCALLER.\n */\n function safeCALLER()\n internal\n returns (\n address _CALLER\n )\n {\n bytes memory returndata = _safeExecutionManagerInteraction(\n abi.encodeWithSignature(\n \"ovmCALLER()\"\n )\n );\n\n return abi.decode(returndata, (address));\n }\n\n /**\n * Performs a safe ovmADDRESS call.\n * @return _ADDRESS Result of calling ovmADDRESS.\n */\n function safeADDRESS()\n internal\n returns (\n address _ADDRESS\n )\n {\n bytes memory returndata = _safeExecutionManagerInteraction(\n abi.encodeWithSignature(\n \"ovmADDRESS()\"\n )\n );\n\n return abi.decode(returndata, (address));\n }\n\n /**\n * Performs a safe ovmGETNONCE call.\n * @return _nonce Result of calling ovmGETNONCE.\n */\n function safeGETNONCE()\n internal\n returns (\n uint256 _nonce\n )\n {\n bytes memory returndata = _safeExecutionManagerInteraction(\n abi.encodeWithSignature(\n \"ovmGETNONCE()\"\n )\n );\n\n return abi.decode(returndata, (uint256));\n }\n\n /**\n * Performs a safe ovmSETNONCE call.\n * @param _nonce New account nonce.\n */\n function safeSETNONCE(\n uint256 _nonce\n )\n internal\n {\n _safeExecutionManagerInteraction(\n abi.encodeWithSignature(\n \"ovmSETNONCE(uint256)\",\n _nonce\n )\n );\n }\n\n /**\n * Performs a safe ovmCREATEEOA call.\n * @param _messageHash Message hash which was signed by EOA\n * @param _v v value of signature (0 or 1)\n * @param _r r value of signature\n * @param _s s value of signature\n */\n function safeCREATEEOA(\n bytes32 _messageHash,\n uint8 _v,\n bytes32 _r,\n bytes32 _s\n )\n internal\n {\n _safeExecutionManagerInteraction(\n abi.encodeWithSignature(\n \"ovmCREATEEOA(bytes32,uint8,bytes32,bytes32)\",\n _messageHash,\n _v,\n _r,\n _s\n )\n );\n }\n\n /**\n * Performs a safe REVERT.\n * @param _reason String revert reason to pass along with the REVERT.\n */\n function safeREVERT(\n string memory _reason\n )\n internal\n {\n _safeExecutionManagerInteraction(\n abi.encodeWithSignature(\n \"ovmREVERT(bytes)\",\n bytes(_reason)\n )\n );\n }\n\n /**\n * Performs a safe \"require\".\n * @param _condition Boolean condition that must be true or will revert.\n * @param _reason String revert reason to pass along with the REVERT.\n */\n function safeREQUIRE(\n bool _condition,\n string memory _reason\n )\n internal\n {\n if (!_condition) {\n safeREVERT(\n _reason\n );\n }\n }\n\n /**\n * Performs a safe ovmSLOAD call.\n */\n function safeSLOAD(\n bytes32 _key\n )\n internal\n returns (\n bytes32\n )\n {\n bytes memory returndata = _safeExecutionManagerInteraction(\n abi.encodeWithSignature(\n \"ovmSLOAD(bytes32)\",\n _key\n )\n );\n\n return abi.decode(returndata, (bytes32));\n }\n\n /**\n * Performs a safe ovmSSTORE call.\n */\n function safeSSTORE(\n bytes32 _key,\n bytes32 _value\n )\n internal\n {\n _safeExecutionManagerInteraction(\n abi.encodeWithSignature(\n \"ovmSSTORE(bytes32,bytes32)\",\n _key,\n _value\n )\n );\n }\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * Performs an ovm interaction and the necessary safety checks.\n * @param _gasLimit Gas limit for the interaction.\n * @param _calldata Data to send to the OVM_ExecutionManager (encoded with sighash).\n * @return _returndata Data sent back by the OVM_ExecutionManager.\n */\n function _safeExecutionManagerInteraction(\n uint256 _gasLimit,\n bytes memory _calldata\n )\n private\n returns (\n bytes memory _returndata\n )\n {\n address ovmExecutionManager = msg.sender;\n (\n bool success,\n bytes memory returndata\n ) = ovmExecutionManager.call{gas: _gasLimit}(_calldata);\n\n if (success == false) {\n assembly {\n revert(add(returndata, 0x20), mload(returndata))\n }\n } else if (returndata.length == 1) {\n assembly {\n return(0, 1)\n }\n } else {\n return returndata;\n }\n }\n\n function _safeExecutionManagerInteraction(\n bytes memory _calldata\n )\n private\n returns (\n bytes memory _returndata\n )\n {\n return _safeExecutionManagerInteraction(\n gasleft(),\n _calldata\n );\n }\n}\n" - }, - "contracts/optimistic-ethereum/OVM/accounts/OVM_ECDSAContractAccount.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.7.0;\npragma experimental ABIEncoderV2;\n\n/* Interface Imports */\nimport { iOVM_ECDSAContractAccount } from \"../../iOVM/accounts/iOVM_ECDSAContractAccount.sol\";\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_ECDSAUtils } from \"../../libraries/utils/Lib_ECDSAUtils.sol\";\nimport { Lib_SafeExecutionManagerWrapper } from \"../../libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\";\nimport { Lib_SafeMathWrapper } from \"../../libraries/wrappers/Lib_SafeMathWrapper.sol\";\n\n/**\n * @title OVM_ECDSAContractAccount\n */\ncontract OVM_ECDSAContractAccount is iOVM_ECDSAContractAccount {\n\n address constant ETH_ERC20_ADDRESS = 0x4200000000000000000000000000000000000006;\n uint256 constant EXECUTION_VALIDATION_GAS_OVERHEAD = 25000; // TODO: should be the amount sufficient to cover the gas costs of all of the transactions up to and including the CALL/CREATE which forms the entrypoint of the transaction.\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Executes a signed transaction.\n * @param _transaction Signed EOA transaction.\n * @param _signatureType Hashing scheme used for the transaction (e.g., ETH signed message).\n * @param _v Signature `v` parameter.\n * @param _r Signature `r` parameter.\n * @param _s Signature `s` parameter.\n * @return _success Whether or not the call returned (rather than reverted).\n * @return _returndata Data returned by the call.\n */\n function execute(\n bytes memory _transaction,\n Lib_OVMCodec.EOASignatureType _signatureType,\n uint8 _v,\n bytes32 _r,\n bytes32 _s\n )\n override\n public\n returns (\n bool _success,\n bytes memory _returndata\n )\n {\n bool isEthSign = _signatureType == Lib_OVMCodec.EOASignatureType.ETH_SIGNED_MESSAGE;\n\n // Address of this contract within the ovm (ovmADDRESS) should be the same as the\n // recovered address of the user who signed this message. This is how we manage to shim\n // account abstraction even though the user isn't a contract.\n // Need to make sure that the transaction nonce is right and bump it if so.\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(\n Lib_ECDSAUtils.recover(\n _transaction,\n isEthSign,\n _v,\n _r,\n _s\n ) == Lib_SafeExecutionManagerWrapper.safeADDRESS(),\n \"Signature provided for EOA transaction execution is invalid.\"\n );\n\n Lib_OVMCodec.EIP155Transaction memory decodedTx = Lib_OVMCodec.decodeEIP155Transaction(_transaction, isEthSign);\n\n // Need to make sure that the transaction chainId is correct.\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(\n decodedTx.chainId == Lib_SafeExecutionManagerWrapper.safeCHAINID(),\n \"Transaction chainId does not match expected OVM chainId.\"\n );\n\n // Need to make sure that the transaction nonce is right.\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(\n decodedTx.nonce == Lib_SafeExecutionManagerWrapper.safeGETNONCE(),\n \"Transaction nonce does not match the expected nonce.\"\n );\n\n // TEMPORARY: Disable gas checks for minnet.\n // // Need to make sure that the gas is sufficient to execute the transaction.\n // Lib_SafeExecutionManagerWrapper.safeREQUIRE(\n // gasleft() >= Lib_SafeMathWrapper.add(decodedTx.gasLimit, EXECUTION_VALIDATION_GAS_OVERHEAD),\n // \"Gas is not sufficient to execute the transaction.\"\n // );\n\n // Transfer fee to relayer.\n address relayer = Lib_SafeExecutionManagerWrapper.safeCALLER();\n uint256 fee = decodedTx.gasLimit * decodedTx.gasPrice;\n (bool success, ) = Lib_SafeExecutionManagerWrapper.safeCALL(\n gasleft(),\n ETH_ERC20_ADDRESS,\n abi.encodeWithSignature(\"transfer(address,uint256)\", relayer, fee)\n );\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(\n success == true,\n \"Fee was not transferred to relayer.\"\n );\n\n // Contract creations are signalled by sending a transaction to the zero address.\n if (decodedTx.to == address(0)) {\n address created = Lib_SafeExecutionManagerWrapper.safeCREATE(\n decodedTx.gasLimit,\n decodedTx.data\n );\n\n // EVM doesn't tell us whether a contract creation failed, even if it reverted during\n // initialization. Always return `true` for our success value here.\n return (true, abi.encode(created));\n } else {\n // We only want to bump the nonce for `ovmCALL` because `ovmCREATE` automatically bumps\n // the nonce of the calling account. Normally an EOA would bump the nonce for both\n // cases, but since this is a contract we'd end up bumping the nonce twice.\n Lib_SafeExecutionManagerWrapper.safeSETNONCE(decodedTx.nonce + 1);\n\n return Lib_SafeExecutionManagerWrapper.safeCALL(\n decodedTx.gasLimit,\n decodedTx.to,\n decodedTx.data\n );\n }\n }\n}\n" - }, - "contracts/optimistic-ethereum/libraries/utils/Lib_ECDSAUtils.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.7.0;\n\n/**\n * @title Lib_ECDSAUtils\n */\nlibrary Lib_ECDSAUtils {\n\n /**************************************\n * Internal Functions: ECDSA Recovery *\n **************************************/\n\n /**\n * Recovers a signed address given a message and signature.\n * @param _message Message that was originally signed.\n * @param _isEthSignedMessage Whether or not the user used the `Ethereum Signed Message` prefix.\n * @param _v Signature `v` parameter.\n * @param _r Signature `r` parameter.\n * @param _s Signature `s` parameter.\n * @return _sender Signer address.\n */\n function recover(\n bytes memory _message,\n bool _isEthSignedMessage,\n uint8 _v,\n bytes32 _r,\n bytes32 _s\n )\n internal\n pure\n returns (\n address _sender\n )\n {\n bytes32 messageHash = getMessageHash(_message, _isEthSignedMessage);\n\n return ecrecover(\n messageHash,\n _v + 27,\n _r,\n _s\n );\n }\n\n function getMessageHash(\n bytes memory _message,\n bool _isEthSignedMessage\n )\n internal\n pure\n returns (bytes32) {\n if (_isEthSignedMessage) {\n return getEthSignedMessageHash(_message);\n }\n return getNativeMessageHash(_message);\n }\n\n\n /*************************************\n * Private Functions: ECDSA Recovery *\n *************************************/\n\n /**\n * Gets the native message hash (simple keccak256) for a message.\n * @param _message Message to hash.\n * @return _messageHash Native message hash.\n */\n function getNativeMessageHash(\n bytes memory _message\n )\n private\n pure\n returns (\n bytes32 _messageHash\n )\n {\n return keccak256(_message);\n }\n\n /**\n * Gets the hash of a message with the `Ethereum Signed Message` prefix.\n * @param _message Message to hash.\n * @return _messageHash Prefixed message hash.\n */\n function getEthSignedMessageHash(\n bytes memory _message\n )\n private\n pure\n returns (\n bytes32 _messageHash\n )\n {\n bytes memory prefix = \"\\x19Ethereum Signed Message:\\n32\";\n bytes32 messageHash = keccak256(_message);\n return keccak256(abi.encodePacked(prefix, messageHash));\n }\n}" - }, - "contracts/optimistic-ethereum/libraries/wrappers/Lib_SafeMathWrapper.sol": { - "content": "// SPDX-License-Identifier: MIT\n// Pulled from @openzeppelin/contracts/math/SafeMath.sol\npragma solidity ^0.7.0;\n\n/* Library Imports */\nimport { Lib_SafeExecutionManagerWrapper } from \"./Lib_SafeExecutionManagerWrapper.sol\";\n\n/**\n * @title Lib_SafeMathWrapper\n */\n\n/**\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\n * checks.\n *\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\n * in bugs, because programmers usually assume that an overflow raises an\n * error, which is the standard behavior in high level programming languages.\n * `SafeMath` restores this intuition by reverting the transaction when an\n * operation overflows.\n *\n * Using this library instead of the unchecked operations eliminates an entire\n * class of bugs, so it's recommended to use it always.\n */\n\nlibrary Lib_SafeMathWrapper {\n /**\n * @dev Returns the addition of two unsigned integers, reverting on\n * overflow.\n *\n * Counterpart to Solidity's `+` operator.\n *\n * Requirements:\n *\n * - Addition cannot overflow.\n */\n function add(uint256 a, uint256 b) internal returns (uint256) {\n uint256 c = a + b;\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(c >= a, \"Lib_SafeMathWrapper: addition overflow\");\n\n return c;\n }\n\n /**\n * @dev Returns the subtraction of two unsigned integers, reverting on\n * overflow (when the result is negative).\n *\n * Counterpart to Solidity's `-` operator.\n *\n * Requirements:\n *\n * - Subtraction cannot overflow.\n */\n function sub(uint256 a, uint256 b) internal returns (uint256) {\n return sub(a, b, \"Lib_SafeMathWrapper: subtraction overflow\");\n }\n\n /**\n * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\n * overflow (when the result is negative).\n *\n * Counterpart to Solidity's `-` operator.\n *\n * Requirements:\n *\n * - Subtraction cannot overflow.\n */\n function sub(uint256 a, uint256 b, string memory errorMessage) internal returns (uint256) {\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(b <= a, errorMessage);\n uint256 c = a - b;\n\n return c;\n }\n\n /**\n * @dev Returns the multiplication of two unsigned integers, reverting on\n * overflow.\n *\n * Counterpart to Solidity's `*` operator.\n *\n * Requirements:\n *\n * - Multiplication cannot overflow.\n */\n function mul(uint256 a, uint256 b) internal returns (uint256) {\n // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\n // benefit is lost if 'b' is also tested.\n // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\n if (a == 0) {\n return 0;\n }\n\n uint256 c = a * b;\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(c / a == b, \"Lib_SafeMathWrapper: multiplication overflow\");\n\n return c;\n }\n\n /**\n * @dev Returns the integer division of two unsigned integers. Reverts on\n * division by zero. The result is rounded towards zero.\n *\n * Counterpart to Solidity's `/` operator. Note: this function uses a\n * `revert` opcode (which leaves remaining gas untouched) while Solidity\n * uses an invalid opcode to revert (consuming all remaining gas).\n *\n * Requirements:\n *\n * - The divisor cannot be zero.\n */\n function div(uint256 a, uint256 b) internal returns (uint256) {\n return div(a, b, \"Lib_SafeMathWrapper: division by zero\");\n }\n\n /**\n * @dev Returns the integer division of two unsigned integers. Reverts with custom message on\n * division by zero. The result is rounded towards zero.\n *\n * Counterpart to Solidity's `/` operator. Note: this function uses a\n * `revert` opcode (which leaves remaining gas untouched) while Solidity\n * uses an invalid opcode to revert (consuming all remaining gas).\n *\n * Requirements:\n *\n * - The divisor cannot be zero.\n */\n function div(uint256 a, uint256 b, string memory errorMessage) internal returns (uint256) {\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(b > 0, errorMessage);\n uint256 c = a / b;\n // assert(a == b * c + a % b); // There is no case in which this doesn't hold\n\n return c;\n }\n\n /**\n * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\n * Reverts when dividing by zero.\n *\n * Counterpart to Solidity's `%` operator. This function uses a `revert`\n * opcode (which leaves remaining gas untouched) while Solidity uses an\n * invalid opcode to revert (consuming all remaining gas).\n *\n * Requirements:\n *\n * - The divisor cannot be zero.\n */\n function mod(uint256 a, uint256 b) internal returns (uint256) {\n return mod(a, b, \"Lib_SafeMathWrapper: modulo by zero\");\n }\n\n /**\n * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\n * Reverts with custom message when dividing by zero.\n *\n * Counterpart to Solidity's `%` operator. This function uses a `revert`\n * opcode (which leaves remaining gas untouched) while Solidity uses an\n * invalid opcode to revert (consuming all remaining gas).\n *\n * Requirements:\n *\n * - The divisor cannot be zero.\n */\n function mod(uint256 a, uint256 b, string memory errorMessage) internal returns (uint256) {\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(b != 0, errorMessage);\n return a % b;\n }\n}" - }, - "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.7.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\nimport { Lib_EthUtils } from \"../../libraries/utils/Lib_EthUtils.sol\";\n\n/* Interface Imports */\nimport { iOVM_ExecutionManager } from \"../../iOVM/execution/iOVM_ExecutionManager.sol\";\nimport { iOVM_StateManager } from \"../../iOVM/execution/iOVM_StateManager.sol\";\nimport { iOVM_SafetyChecker } from \"../../iOVM/execution/iOVM_SafetyChecker.sol\";\n\n/* Contract Imports */\nimport { OVM_ECDSAContractAccount } from \"../accounts/OVM_ECDSAContractAccount.sol\";\nimport { OVM_ProxyEOA } from \"../accounts/OVM_ProxyEOA.sol\";\nimport { OVM_DeployerWhitelist } from \"../precompiles/OVM_DeployerWhitelist.sol\";\n\n/**\n * @title OVM_ExecutionManager\n */\ncontract OVM_ExecutionManager is iOVM_ExecutionManager, Lib_AddressResolver {\n\n /********************************\n * External Contract References *\n ********************************/\n\n iOVM_SafetyChecker internal ovmSafetyChecker;\n iOVM_StateManager internal ovmStateManager;\n\n\n /*******************************\n * Execution Context Variables *\n *******************************/\n\n GasMeterConfig internal gasMeterConfig;\n GlobalContext internal globalContext;\n TransactionContext internal transactionContext;\n MessageContext internal messageContext;\n TransactionRecord internal transactionRecord;\n MessageRecord internal messageRecord;\n\n\n /**************************\n * Gas Metering Constants *\n **************************/\n\n address constant GAS_METADATA_ADDRESS = 0x06a506A506a506A506a506a506A506A506A506A5;\n uint256 constant NUISANCE_GAS_SLOAD = 20000;\n uint256 constant NUISANCE_GAS_SSTORE = 20000;\n uint256 constant MIN_NUISANCE_GAS_PER_CONTRACT = 30000;\n uint256 constant NUISANCE_GAS_PER_CONTRACT_BYTE = 100;\n uint256 constant MIN_GAS_FOR_INVALID_STATE_ACCESS = 30000;\n\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n constructor(\n address _libAddressManager,\n GasMeterConfig memory _gasMeterConfig,\n GlobalContext memory _globalContext\n )\n Lib_AddressResolver(_libAddressManager)\n {\n ovmSafetyChecker = iOVM_SafetyChecker(resolve(\"OVM_SafetyChecker\"));\n gasMeterConfig = _gasMeterConfig;\n globalContext = _globalContext;\n }\n\n\n /**********************\n * Function Modifiers *\n **********************/\n\n /**\n * Applies dynamically-sized refund to a transaction to account for the difference in execution\n * between L1 and L2, so that the overall cost of the ovmOPCODE is fixed.\n * @param _cost Desired gas cost for the function after the refund.\n */\n modifier netGasCost(\n uint256 _cost\n ) {\n uint256 gasProvided = gasleft();\n _;\n uint256 gasUsed = gasProvided - gasleft();\n\n // We want to refund everything *except* the specified cost.\n if (_cost < gasUsed) {\n transactionRecord.ovmGasRefund += gasUsed - _cost;\n }\n }\n\n /**\n * Applies a fixed-size gas refund to a transaction to account for the difference in execution\n * between L1 and L2, so that the overall cost of an ovmOPCODE can be lowered.\n * @param _discount Amount of gas cost to refund for the ovmOPCODE.\n */\n modifier fixedGasDiscount(\n uint256 _discount\n ) {\n uint256 gasProvided = gasleft();\n _;\n uint256 gasUsed = gasProvided - gasleft();\n\n // We want to refund the specified _discount, unless this risks underflow.\n if (_discount < gasUsed) {\n transactionRecord.ovmGasRefund += _discount;\n } else {\n // refund all we can without risking underflow.\n transactionRecord.ovmGasRefund += gasUsed;\n }\n }\n\n /**\n * Makes sure we're not inside a static context.\n */\n modifier notStatic() {\n if (messageContext.isStatic == true) {\n _revertWithFlag(RevertFlag.STATIC_VIOLATION);\n }\n _;\n }\n\n\n /************************************\n * Transaction Execution Entrypoint *\n ************************************/\n\n /**\n * Starts the execution of a transaction via the OVM_ExecutionManager.\n * @param _transaction Transaction data to be executed.\n * @param _ovmStateManager iOVM_StateManager implementation providing account state.\n */\n function run(\n Lib_OVMCodec.Transaction memory _transaction,\n address _ovmStateManager\n )\n override\n public\n {\n require(transactionContext.ovmNUMBER == 0, \"Only be callable at the start of a transaction\");\n // Store our OVM_StateManager instance (significantly easier than attempting to pass the\n // address around in calldata).\n ovmStateManager = iOVM_StateManager(_ovmStateManager);\n\n // Make sure this function can't be called by anyone except the owner of the\n // OVM_StateManager (expected to be an OVM_StateTransitioner). We can revert here because\n // this would make the `run` itself invalid.\n require(\n ovmStateManager.isAuthenticated(msg.sender),\n \"Only authenticated addresses in ovmStateManager can call this function\"\n );\n\n // Initialize the execution context, must be initialized before we perform any gas metering\n // or we'll throw a nuisance gas error.\n _initContext(_transaction);\n\n // TEMPORARY: Gas metering is disabled for minnet.\n // // Check whether we need to start a new epoch, do so if necessary.\n // _checkNeedsNewEpoch(_transaction.timestamp);\n\n // Make sure the transaction's gas limit is valid. We don't revert here because we reserve\n // reverts for INVALID_STATE_ACCESS.\n if (_isValidGasLimit(_transaction.gasLimit, _transaction.l1QueueOrigin) == false) {\n return;\n }\n\n // Check gas right before the call to get total gas consumed by OVM transaction.\n uint256 gasProvided = gasleft();\n\n // Run the transaction, make sure to meter the gas usage.\n ovmCALL(\n _transaction.gasLimit - gasMeterConfig.minTransactionGasLimit,\n _transaction.entrypoint,\n _transaction.data\n );\n uint256 gasUsed = gasProvided - gasleft();\n\n // TEMPORARY: Gas metering is disabled for minnet.\n // // Update the cumulative gas based on the amount of gas used.\n // _updateCumulativeGas(gasUsed, _transaction.l1QueueOrigin);\n\n // Wipe the execution context.\n _resetContext();\n\n // Reset the ovmStateManager.\n ovmStateManager = iOVM_StateManager(address(0));\n }\n\n\n /******************************\n * Opcodes: Execution Context *\n ******************************/\n\n /**\n * @notice Overrides CALLER.\n * @return _CALLER Address of the CALLER within the current message context.\n */\n function ovmCALLER()\n override\n public\n view\n returns (\n address _CALLER\n )\n {\n return messageContext.ovmCALLER;\n }\n\n /**\n * @notice Overrides ADDRESS.\n * @return _ADDRESS Active ADDRESS within the current message context.\n */\n function ovmADDRESS()\n override\n public\n view\n returns (\n address _ADDRESS\n )\n {\n return messageContext.ovmADDRESS;\n }\n\n /**\n * @notice Overrides TIMESTAMP.\n * @return _TIMESTAMP Value of the TIMESTAMP within the transaction context.\n */\n function ovmTIMESTAMP()\n override\n public\n view\n returns (\n uint256 _TIMESTAMP\n )\n {\n return transactionContext.ovmTIMESTAMP;\n }\n\n /**\n * @notice Overrides NUMBER.\n * @return _NUMBER Value of the NUMBER within the transaction context.\n */\n function ovmNUMBER()\n override\n public\n view\n returns (\n uint256 _NUMBER\n )\n {\n return transactionContext.ovmNUMBER;\n }\n\n /**\n * @notice Overrides GASLIMIT.\n * @return _GASLIMIT Value of the block's GASLIMIT within the transaction context.\n */\n function ovmGASLIMIT()\n override\n public\n view\n returns (\n uint256 _GASLIMIT\n )\n {\n return transactionContext.ovmGASLIMIT;\n }\n\n /**\n * @notice Overrides CHAINID.\n * @return _CHAINID Value of the chain's CHAINID within the global context.\n */\n function ovmCHAINID()\n override\n public\n view\n returns (\n uint256 _CHAINID\n )\n {\n return globalContext.ovmCHAINID;\n }\n\n /*********************************\n * Opcodes: L2 Execution Context *\n *********************************/\n\n /**\n * @notice Specifies from which L1 rollup queue this transaction originated from.\n * @return _queueOrigin Address of the ovmL1QUEUEORIGIN within the current message context.\n */\n function ovmL1QUEUEORIGIN()\n override\n public\n view\n returns (\n Lib_OVMCodec.QueueOrigin _queueOrigin\n )\n {\n return transactionContext.ovmL1QUEUEORIGIN;\n }\n\n /**\n * @notice Specifies what L1 EOA, if any, sent this transaction.\n * @return _l1TxOrigin Address of the EOA which send the tx into L2 from L1.\n */\n function ovmL1TXORIGIN()\n override\n public\n view\n returns (\n address _l1TxOrigin\n )\n {\n return transactionContext.ovmL1TXORIGIN;\n }\n\n /********************\n * Opcodes: Halting *\n ********************/\n\n /**\n * @notice Overrides REVERT.\n * @param _data Bytes data to pass along with the REVERT.\n */\n function ovmREVERT(\n bytes memory _data\n )\n override\n public\n {\n _revertWithFlag(RevertFlag.INTENTIONAL_REVERT, _data);\n }\n\n\n /******************************\n * Opcodes: Contract Creation *\n ******************************/\n\n /**\n * @notice Overrides CREATE.\n * @param _bytecode Code to be used to CREATE a new contract.\n * @return _contract Address of the created contract.\n */\n function ovmCREATE(\n bytes memory _bytecode\n )\n override\n public\n notStatic\n fixedGasDiscount(40000)\n returns (\n address _contract\n )\n {\n // Creator is always the current ADDRESS.\n address creator = ovmADDRESS();\n\n // Check that the deployer is whitelisted, or\n // that arbitrary contract deployment has been enabled.\n _checkDeployerAllowed(creator);\n\n // Generate the correct CREATE address.\n address contractAddress = Lib_EthUtils.getAddressForCREATE(\n creator,\n _getAccountNonce(creator)\n );\n\n return _createContract(\n contractAddress,\n _bytecode\n );\n }\n\n /**\n * @notice Overrides CREATE2.\n * @param _bytecode Code to be used to CREATE2 a new contract.\n * @param _salt Value used to determine the contract's address.\n * @return _contract Address of the created contract.\n */\n function ovmCREATE2(\n bytes memory _bytecode,\n bytes32 _salt\n )\n override\n public\n notStatic\n fixedGasDiscount(40000)\n returns (\n address _contract\n )\n {\n // Creator is always the current ADDRESS.\n address creator = ovmADDRESS();\n\n // Check that the deployer is whitelisted, or\n // that arbitrary contract deployment has been enabled.\n _checkDeployerAllowed(creator);\n\n // Generate the correct CREATE2 address.\n address contractAddress = Lib_EthUtils.getAddressForCREATE2(\n creator,\n _bytecode,\n _salt\n );\n\n return _createContract(\n contractAddress,\n _bytecode\n );\n }\n\n\n /*******************************\n * Account Abstraction Opcodes *\n ******************************/\n\n /**\n * Retrieves the nonce of the current ovmADDRESS.\n * @return _nonce Nonce of the current contract.\n */\n function ovmGETNONCE()\n override\n public\n returns (\n uint256 _nonce\n )\n {\n return _getAccountNonce(ovmADDRESS());\n }\n\n /**\n * Sets the nonce of the current ovmADDRESS.\n * @param _nonce New nonce for the current contract.\n */\n function ovmSETNONCE(\n uint256 _nonce\n )\n override\n public\n notStatic\n {\n _setAccountNonce(ovmADDRESS(), _nonce);\n }\n\n /**\n * Creates a new EOA contract account, for account abstraction.\n * @dev Essentially functions like ovmCREATE or ovmCREATE2, but we can bypass a lot of checks\n * because the contract we're creating is trusted (no need to do safety checking or to\n * handle unexpected reverts). Doesn't need to return an address because the address is\n * assumed to be the user's actual address.\n * @param _messageHash Hash of a message signed by some user, for verification.\n * @param _v Signature `v` parameter.\n * @param _r Signature `r` parameter.\n * @param _s Signature `s` parameter.\n */\n function ovmCREATEEOA(\n bytes32 _messageHash,\n uint8 _v,\n bytes32 _r,\n bytes32 _s\n )\n override\n public\n notStatic\n {\n // Recover the EOA address from the message hash and signature parameters. Since we do the\n // hashing in advance, we don't have handle different message hashing schemes. Even if this\n // function were to return the wrong address (rather than explicitly returning the zero\n // address), the rest of the transaction would simply fail (since there's no EOA account to\n // actually execute the transaction).\n address eoa = ecrecover(\n _messageHash,\n _v + 27,\n _r,\n _s\n );\n\n // Invalid signature is a case we proactively handle with a revert. We could alternatively\n // have this function return a `success` boolean, but this is just easier.\n if (eoa == address(0)) {\n ovmREVERT(bytes(\"Signature provided for EOA contract creation is invalid.\"));\n }\n\n // If the user already has an EOA account, then there's no need to perform this operation.\n if (_hasEmptyAccount(eoa) == false) {\n return;\n }\n\n // We always need to initialize the contract with the default account values.\n _initPendingAccount(eoa);\n\n // Temporarily set the current address so it's easier to access on L2.\n address prevADDRESS = messageContext.ovmADDRESS;\n messageContext.ovmADDRESS = eoa;\n\n // Now actually create the account and get its bytecode. We're not worried about reverts\n // (other than out of gas, which we can't capture anyway) because this contract is trusted.\n OVM_ProxyEOA proxyEOA = new OVM_ProxyEOA(0x4200000000000000000000000000000000000003);\n\n // Reset the address now that we're done deploying.\n messageContext.ovmADDRESS = prevADDRESS;\n\n // Commit the account with its final values.\n _commitPendingAccount(\n eoa,\n address(proxyEOA),\n keccak256(Lib_EthUtils.getCode(address(proxyEOA)))\n );\n\n _setAccountNonce(eoa, 0);\n }\n\n\n /*********************************\n * Opcodes: Contract Interaction *\n *********************************/\n\n /**\n * @notice Overrides CALL.\n * @param _gasLimit Amount of gas to be passed into this call.\n * @param _address Address of the contract to call.\n * @param _calldata Data to send along with the call.\n * @return _success Whether or not the call returned (rather than reverted).\n * @return _returndata Data returned by the call.\n */\n function ovmCALL(\n uint256 _gasLimit,\n address _address,\n bytes memory _calldata\n )\n override\n public\n fixedGasDiscount(100000)\n returns (\n bool _success,\n bytes memory _returndata\n )\n {\n // CALL updates the CALLER and ADDRESS.\n MessageContext memory nextMessageContext = messageContext;\n nextMessageContext.ovmCALLER = nextMessageContext.ovmADDRESS;\n nextMessageContext.ovmADDRESS = _address;\n\n return _callContract(\n nextMessageContext,\n _gasLimit,\n _address,\n _calldata\n );\n }\n\n /**\n * @notice Overrides STATICCALL.\n * @param _gasLimit Amount of gas to be passed into this call.\n * @param _address Address of the contract to call.\n * @param _calldata Data to send along with the call.\n * @return _success Whether or not the call returned (rather than reverted).\n * @return _returndata Data returned by the call.\n */\n function ovmSTATICCALL(\n uint256 _gasLimit,\n address _address,\n bytes memory _calldata\n )\n override\n public\n fixedGasDiscount(80000)\n returns (\n bool _success,\n bytes memory _returndata\n )\n {\n // STATICCALL updates the CALLER, updates the ADDRESS, and runs in a static context.\n MessageContext memory nextMessageContext = messageContext;\n nextMessageContext.ovmCALLER = nextMessageContext.ovmADDRESS;\n nextMessageContext.ovmADDRESS = _address;\n nextMessageContext.isStatic = true;\n\n return _callContract(\n nextMessageContext,\n _gasLimit,\n _address,\n _calldata\n );\n }\n\n /**\n * @notice Overrides DELEGATECALL.\n * @param _gasLimit Amount of gas to be passed into this call.\n * @param _address Address of the contract to call.\n * @param _calldata Data to send along with the call.\n * @return _success Whether or not the call returned (rather than reverted).\n * @return _returndata Data returned by the call.\n */\n function ovmDELEGATECALL(\n uint256 _gasLimit,\n address _address,\n bytes memory _calldata\n )\n override\n public\n fixedGasDiscount(40000)\n returns (\n bool _success,\n bytes memory _returndata\n )\n {\n // DELEGATECALL does not change anything about the message context.\n MessageContext memory nextMessageContext = messageContext;\n bool isStaticEntrypoint = false;\n\n return _callContract(\n nextMessageContext,\n _gasLimit,\n _address,\n _calldata\n );\n }\n\n\n /************************************\n * Opcodes: Contract Storage Access *\n ************************************/\n\n /**\n * @notice Overrides SLOAD.\n * @param _key 32 byte key of the storage slot to load.\n * @return _value 32 byte value of the requested storage slot.\n */\n function ovmSLOAD(\n bytes32 _key\n )\n override\n public\n netGasCost(40000)\n returns (\n bytes32 _value\n )\n {\n // We always SLOAD from the storage of ADDRESS.\n address contractAddress = ovmADDRESS();\n\n return _getContractStorage(\n contractAddress,\n _key\n );\n }\n\n /**\n * @notice Overrides SSTORE.\n * @param _key 32 byte key of the storage slot to set.\n * @param _value 32 byte value for the storage slot.\n */\n function ovmSSTORE(\n bytes32 _key,\n bytes32 _value\n )\n override\n public\n notStatic\n netGasCost(60000)\n {\n // We always SSTORE to the storage of ADDRESS.\n address contractAddress = ovmADDRESS();\n\n _putContractStorage(\n contractAddress,\n _key,\n _value\n );\n }\n\n\n /*********************************\n * Opcodes: Contract Code Access *\n *********************************/\n\n /**\n * @notice Overrides EXTCODECOPY.\n * @param _contract Address of the contract to copy code from.\n * @param _offset Offset in bytes from the start of contract code to copy beyond.\n * @param _length Total number of bytes to copy from the contract's code.\n * @return _code Bytes of code copied from the requested contract.\n */\n function ovmEXTCODECOPY(\n address _contract,\n uint256 _offset,\n uint256 _length\n )\n override\n public\n returns (\n bytes memory _code\n )\n {\n // `ovmEXTCODECOPY` is the only overridden opcode capable of producing exactly one byte of\n // return data. By blocking reads of one byte, we're able to use the condition that an\n // OVM_ExecutionManager function return value having a length of exactly one byte indicates\n // an error without an explicit revert. If users were able to read a single byte, they\n // could forcibly trigger behavior that should only be available to this contract.\n uint256 length = _length == 1 ? 2 : _length;\n\n return Lib_EthUtils.getCode(\n _getAccountEthAddress(_contract),\n _offset,\n length\n );\n }\n\n /**\n * @notice Overrides EXTCODESIZE.\n * @param _contract Address of the contract to query the size of.\n * @return _EXTCODESIZE Size of the requested contract in bytes.\n */\n function ovmEXTCODESIZE(\n address _contract\n )\n override\n public\n returns (\n uint256 _EXTCODESIZE\n )\n {\n return Lib_EthUtils.getCodeSize(\n _getAccountEthAddress(_contract)\n );\n }\n\n /**\n * @notice Overrides EXTCODEHASH.\n * @param _contract Address of the contract to query the hash of.\n * @return _EXTCODEHASH Hash of the requested contract.\n */\n function ovmEXTCODEHASH(\n address _contract\n )\n override\n public\n returns (\n bytes32 _EXTCODEHASH\n )\n {\n return Lib_EthUtils.getCodeHash(\n _getAccountEthAddress(_contract)\n );\n }\n\n\n /**************************************\n * Public Functions: Execution Safety *\n **************************************/\n\n /**\n * Performs the logic to create a contract and revert under various potential conditions.\n * @dev This function is implemented as `public` because we need to be able to revert a\n * contract creation without losing information about exactly *why* the contract reverted.\n * In particular, we want to be sure that contracts cannot trigger an INVALID_STATE_ACCESS\n * flag and then revert to reset the flag. We're able to do this by making an external\n * call from `ovmCREATE` and `ovmCREATE2` to `safeCREATE`, which can capture and relay\n * information before reverting.\n * @param _address Address of the contract to associate with the one being created.\n * @param _bytecode Code to be used to create the new contract.\n */\n function safeCREATE(\n address _address,\n bytes memory _bytecode\n )\n override\n public\n {\n // Since this function is public, anyone can attempt to directly call it. We need to make\n // sure that the OVM_ExecutionManager itself is the only party that can actually try to\n // call this function.\n if (msg.sender != address(this)) {\n return;\n }\n\n // We need to be sure that the user isn't trying to use a contract creation to overwrite\n // some existing contract. On L1, users will prove that no contract exists at the address\n // and the OVM_FraudVerifier will populate the code hash of this address with a special\n // value that represents \"known to be an empty account.\"\n if (_hasEmptyAccount(_address) == false) {\n _revertWithFlag(RevertFlag.CREATE_COLLISION);\n }\n\n // Check the creation bytecode against the OVM_SafetyChecker.\n if (ovmSafetyChecker.isBytecodeSafe(_bytecode) == false) {\n _revertWithFlag(RevertFlag.UNSAFE_BYTECODE);\n }\n\n // We always need to initialize the contract with the default account values.\n _initPendingAccount(_address);\n\n // Actually deploy the contract and retrieve its address. This step is hiding a lot of\n // complexity because we need to ensure that contract creation *never* reverts by itself.\n // We cover this partially by storing a revert flag and returning (instead of reverting)\n // when we know that we're inside a contract's creation code.\n address ethAddress = Lib_EthUtils.createContract(_bytecode);\n\n // Contract creation returns the zero address when it fails, which should only be possible\n // if the user intentionally runs out of gas. However, we might still have a bit of gas\n // left over since contract calls can only be passed 63/64ths of total gas, so we need to\n // explicitly handle this case here.\n if (ethAddress == address(0)) {\n _revertWithFlag(RevertFlag.CREATE_EXCEPTION);\n }\n\n // Here we pull out the revert flag that would've been set during creation code. Now that\n // we're out of creation code again, we can just revert normally while passing the flag\n // through the revert data.\n if (messageRecord.revertFlag != RevertFlag.DID_NOT_REVERT) {\n _revertWithFlag(messageRecord.revertFlag);\n }\n\n // Again simply checking that the deployed code is safe too. Contracts can generate\n // arbitrary deployment code, so there's no easy way to analyze this beforehand.\n bytes memory deployedCode = Lib_EthUtils.getCode(ethAddress);\n if (ovmSafetyChecker.isBytecodeSafe(deployedCode) == false) {\n _revertWithFlag(RevertFlag.UNSAFE_BYTECODE);\n }\n\n // Contract creation didn't need to be reverted and the bytecode is safe. We finish up by\n // associating the desired address with the newly created contract's code hash and address.\n _commitPendingAccount(\n _address,\n ethAddress,\n Lib_EthUtils.getCodeHash(ethAddress)\n );\n }\n\n\n /***************************************\n * Public Functions: Execution Context *\n ***************************************/\n\n function getMaxTransactionGasLimit()\n external\n view\n override\n returns (\n uint256 _maxTransactionGasLimit\n )\n {\n return gasMeterConfig.maxTransactionGasLimit;\n }\n\n /********************************************\n * Public Functions: Deployment Witelisting *\n ********************************************/\n\n /**\n * Checks whether the given address is on the whitelst to ovmCREATE/ovmCREATE2, and reverts if not.\n * @param _deployerAddress Address attempting to deploy a contract.\n */\n function _checkDeployerAllowed(\n address _deployerAddress\n )\n internal\n {\n // From an OVM semanitcs perspectibe, this will appear the identical to\n // the deployer ovmCALLing the whitelist. This is fine--in a sense, we are forcing them to.\n (bool success, bytes memory data) = ovmCALL(\n gasleft(),\n 0x4200000000000000000000000000000000000002,\n abi.encodeWithSignature(\"isDeployerAllowed(address)\", _deployerAddress)\n );\n bool isAllowed = abi.decode(data, (bool));\n\n if (!isAllowed || !success) {\n _revertWithFlag(RevertFlag.CREATOR_NOT_ALLOWED);\n } \n }\n\n /********************************************\n * Internal Functions: Contract Interaction *\n ********************************************/\n\n /**\n * Creates a new contract and associates it with some contract address.\n * @param _contractAddress Address to associate the created contract with.\n * @param _bytecode Bytecode to be used to create the contract.\n * @return _created Final OVM contract address.\n */\n function _createContract(\n address _contractAddress,\n bytes memory _bytecode\n )\n internal\n returns (\n address _created\n )\n {\n // We always update the nonce of the creating account, even if the creation fails.\n _setAccountNonce(ovmADDRESS(), _getAccountNonce(ovmADDRESS()) + 1);\n\n // We're stepping into a CREATE or CREATE2, so we need to update ADDRESS to point\n // to the contract's associated address and CALLER to point to the previous ADDRESS.\n MessageContext memory nextMessageContext = messageContext;\n nextMessageContext.ovmCALLER = messageContext.ovmADDRESS;\n nextMessageContext.ovmADDRESS = _contractAddress;\n\n // Run `safeCREATE` in a new EVM message so that our changes can be reflected even if\n // `safeCREATE` reverts.\n (bool _success, ) = _handleExternalInteraction(\n nextMessageContext,\n gasleft(),\n address(this),\n abi.encodeWithSignature(\n \"safeCREATE(address,bytes)\",\n _contractAddress,\n _bytecode\n )\n );\n\n // Need to make sure that this flag is reset so that it isn't propagated to creations in\n // some parent EVM message.\n messageRecord.revertFlag = RevertFlag.DID_NOT_REVERT;\n\n // Yellow paper requires that address returned is zero if the contract deployment fails.\n return _success ? _contractAddress : address(0);\n }\n\n /**\n * Calls the deployed contract associated with a given address.\n * @param _nextMessageContext Message context to be used for the call.\n * @param _gasLimit Amount of gas to be passed into this call.\n * @param _contract OVM address to be called.\n * @param _calldata Data to send along with the call.\n * @return _success Whether or not the call returned (rather than reverted).\n * @return _returndata Data returned by the call.\n */\n function _callContract(\n MessageContext memory _nextMessageContext,\n uint256 _gasLimit,\n address _contract,\n bytes memory _calldata\n )\n internal\n returns (\n bool _success,\n bytes memory _returndata\n )\n {\n // We reserve addresses of the form 0xdeaddeaddead...NNNN for the container contracts in L2 geth.\n // So, we block calls to these addresses since they are not safe to run as an OVM contract itself.\n if (\n (uint256(_contract) & uint256(0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000)) \n == uint256(0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000)\n ) {\n return (true, hex'');\n }\n\n // Both 0x0000... and the EVM precompiles have the same address on L1 and L2 --> no trie lookup needed.\n address codeContractAddress =\n uint(_contract) < 100\n ? _contract\n : _getAccountEthAddress(_contract);\n\n return _handleExternalInteraction(\n _nextMessageContext,\n _gasLimit,\n codeContractAddress,\n _calldata\n );\n }\n\n /**\n * Handles the logic of making an external call and parsing revert information.\n * @param _nextMessageContext Message context to be used for the call.\n * @param _gasLimit Amount of gas to be passed into this call.\n * @param _target Address of the contract to call.\n * @param _data Data to send along with the call.\n * @return _success Whether or not the call returned (rather than reverted).\n * @return _returndata Data returned by the call.\n */\n function _handleExternalInteraction(\n MessageContext memory _nextMessageContext,\n uint256 _gasLimit,\n address _target,\n bytes memory _data\n )\n internal\n returns (\n bool _success,\n bytes memory _returndata\n )\n {\n // We need to switch over to our next message context for the duration of this call.\n MessageContext memory prevMessageContext = messageContext;\n _switchMessageContext(prevMessageContext, _nextMessageContext);\n\n // Nuisance gas is a system used to bound the ability for an attacker to make fraud proofs\n // expensive by touching a lot of different accounts or storage slots. Since most contracts\n // only use a few storage slots during any given transaction, this shouldn't be a limiting\n // factor.\n uint256 prevNuisanceGasLeft = messageRecord.nuisanceGasLeft;\n uint256 nuisanceGasLimit = _getNuisanceGasLimit(_gasLimit);\n messageRecord.nuisanceGasLeft = nuisanceGasLimit;\n\n // Make the call and make sure to pass in the gas limit. Another instance of hidden\n // complexity. `_target` is guaranteed to be a safe contract, meaning its return/revert\n // behavior can be controlled. In particular, we enforce that flags are passed through\n // revert data as to retrieve execution metadata that would normally be reverted out of\n // existence.\n (bool success, bytes memory returndata) = _target.call{gas: _gasLimit}(_data);\n\n // Switch back to the original message context now that we're out of the call.\n _switchMessageContext(_nextMessageContext, prevMessageContext);\n\n // Assuming there were no reverts, the message record should be accurate here. We'll update\n // this value in the case of a revert.\n uint256 nuisanceGasLeft = messageRecord.nuisanceGasLeft;\n\n // Reverts at this point are completely OK, but we need to make a few updates based on the\n // information passed through the revert.\n if (success == false) {\n (\n RevertFlag flag,\n uint256 nuisanceGasLeftPostRevert,\n uint256 ovmGasRefund,\n bytes memory returndataFromFlag\n ) = _decodeRevertData(returndata);\n\n // INVALID_STATE_ACCESS is the only flag that triggers an immediate abort of the\n // parent EVM message. This behavior is necessary because INVALID_STATE_ACCESS must\n // halt any further transaction execution that could impact the execution result.\n if (flag == RevertFlag.INVALID_STATE_ACCESS) {\n _revertWithFlag(flag);\n }\n\n // INTENTIONAL_REVERT, UNSAFE_BYTECODE, STATIC_VIOLATION, and CREATOR_NOT_ALLOWED aren't \n // dependent on the input state, so we can just handle them like standard reverts. Our only change here\n // is to record the gas refund reported by the call (enforced by safety checking).\n if (\n flag == RevertFlag.INTENTIONAL_REVERT\n || flag == RevertFlag.UNSAFE_BYTECODE\n || flag == RevertFlag.STATIC_VIOLATION\n || flag == RevertFlag.CREATOR_NOT_ALLOWED\n ) {\n transactionRecord.ovmGasRefund = ovmGasRefund;\n }\n\n // INTENTIONAL_REVERT needs to pass up the user-provided return data encoded into the\n // flag, *not* the full encoded flag. All other revert types return no data.\n if (flag == RevertFlag.INTENTIONAL_REVERT) {\n returndata = returndataFromFlag;\n } else {\n returndata = hex'';\n }\n\n // Reverts mean we need to use up whatever \"nuisance gas\" was used by the call.\n // EXCEEDS_NUISANCE_GAS explicitly reduces the remaining nuisance gas for this message\n // to zero. OUT_OF_GAS is a \"pseudo\" flag given that messages return no data when they\n // run out of gas, so we have to treat this like EXCEEDS_NUISANCE_GAS. All other flags\n // will simply pass up the remaining nuisance gas.\n nuisanceGasLeft = nuisanceGasLeftPostRevert;\n }\n\n // We need to reset the nuisance gas back to its original value minus the amount used here.\n messageRecord.nuisanceGasLeft = prevNuisanceGasLeft - (nuisanceGasLimit - nuisanceGasLeft);\n\n return (\n success,\n returndata\n );\n }\n\n\n /******************************************\n * Internal Functions: State Manipulation *\n ******************************************/\n\n /**\n * Checks whether an account exists within the OVM_StateManager.\n * @param _address Address of the account to check.\n * @return _exists Whether or not the account exists.\n */\n function _hasAccount(\n address _address\n )\n internal\n returns (\n bool _exists\n )\n {\n _checkAccountLoad(_address);\n return ovmStateManager.hasAccount(_address);\n }\n\n /**\n * Checks whether a known empty account exists within the OVM_StateManager.\n * @param _address Address of the account to check.\n * @return _exists Whether or not the account empty exists.\n */\n function _hasEmptyAccount(\n address _address\n )\n internal\n returns (\n bool _exists\n )\n {\n _checkAccountLoad(_address);\n return ovmStateManager.hasEmptyAccount(_address);\n }\n\n /**\n * Sets the nonce of an account.\n * @param _address Address of the account to modify.\n * @param _nonce New account nonce.\n */\n function _setAccountNonce(\n address _address,\n uint256 _nonce\n )\n internal\n {\n _checkAccountChange(_address);\n ovmStateManager.setAccountNonce(_address, _nonce);\n }\n\n /**\n * Gets the nonce of an account.\n * @param _address Address of the account to access.\n * @return _nonce Nonce of the account.\n */\n function _getAccountNonce(\n address _address\n )\n internal\n returns (\n uint256 _nonce\n )\n {\n _checkAccountLoad(_address);\n return ovmStateManager.getAccountNonce(_address);\n }\n\n /**\n * Retrieves the Ethereum address of an account.\n * @param _address Address of the account to access.\n * @return _ethAddress Corresponding Ethereum address.\n */\n function _getAccountEthAddress(\n address _address\n )\n internal\n returns (\n address _ethAddress\n )\n {\n _checkAccountLoad(_address);\n return ovmStateManager.getAccountEthAddress(_address);\n }\n\n /**\n * Creates the default account object for the given address.\n * @param _address Address of the account create.\n */\n function _initPendingAccount(\n address _address\n )\n internal\n {\n // Although it seems like `_checkAccountChange` would be more appropriate here, we don't\n // actually consider an account \"changed\" until it's inserted into the state (in this case\n // by `_commitPendingAccount`).\n _checkAccountLoad(_address);\n ovmStateManager.initPendingAccount(_address);\n }\n\n /**\n * Stores additional relevant data for a new account, thereby \"committing\" it to the state.\n * This function is only called during `ovmCREATE` and `ovmCREATE2` after a successful contract\n * creation.\n * @param _address Address of the account to commit.\n * @param _ethAddress Address of the associated deployed contract.\n * @param _codeHash Hash of the code stored at the address.\n */\n function _commitPendingAccount(\n address _address,\n address _ethAddress,\n bytes32 _codeHash\n )\n internal\n {\n _checkAccountChange(_address);\n ovmStateManager.commitPendingAccount(\n _address,\n _ethAddress,\n _codeHash\n );\n }\n\n /**\n * Retrieves the value of a storage slot.\n * @param _contract Address of the contract to query.\n * @param _key 32 byte key of the storage slot.\n * @return _value 32 byte storage slot value.\n */\n function _getContractStorage(\n address _contract,\n bytes32 _key\n )\n internal\n returns (\n bytes32 _value\n )\n {\n _checkContractStorageLoad(_contract, _key);\n return ovmStateManager.getContractStorage(_contract, _key);\n }\n\n /**\n * Sets the value of a storage slot.\n * @param _contract Address of the contract to modify.\n * @param _key 32 byte key of the storage slot.\n * @param _value 32 byte storage slot value.\n */\n function _putContractStorage(\n address _contract,\n bytes32 _key,\n bytes32 _value\n )\n internal\n {\n // We don't set storage if the value didn't change. Although this acts as a convenient\n // optimization, it's also necessary to avoid the case in which a contract with no storage\n // attempts to store the value \"0\" at any key. Putting this value (and therefore requiring\n // that the value be committed into the storage trie after execution) would incorrectly\n // modify the storage root.\n if (_getContractStorage(_contract, _key) == _value) {\n return;\n }\n\n _checkContractStorageChange(_contract, _key);\n ovmStateManager.putContractStorage(_contract, _key, _value);\n }\n\n /**\n * Validation whenever a contract needs to be loaded. Checks that the account exists, charges\n * nuisance gas if the account hasn't been loaded before.\n * @param _address Address of the account to load.\n */\n function _checkAccountLoad(\n address _address\n )\n internal\n {\n // See `_checkContractStorageLoad` for more information.\n if (gasleft() < MIN_GAS_FOR_INVALID_STATE_ACCESS) {\n _revertWithFlag(RevertFlag.OUT_OF_GAS);\n }\n\n // See `_checkContractStorageLoad` for more information.\n if (ovmStateManager.hasAccount(_address) == false) {\n _revertWithFlag(RevertFlag.INVALID_STATE_ACCESS);\n }\n\n // Check whether the account has been loaded before and mark it as loaded if not. We need\n // this because \"nuisance gas\" only applies to the first time that an account is loaded.\n (\n bool _wasAccountAlreadyLoaded\n ) = ovmStateManager.testAndSetAccountLoaded(_address);\n\n // If we hadn't already loaded the account, then we'll need to charge \"nuisance gas\" based\n // on the size of the contract code.\n if (_wasAccountAlreadyLoaded == false) {\n _useNuisanceGas(\n (Lib_EthUtils.getCodeSize(_getAccountEthAddress(_address)) * NUISANCE_GAS_PER_CONTRACT_BYTE) + MIN_NUISANCE_GAS_PER_CONTRACT\n );\n }\n }\n\n /**\n * Validation whenever a contract needs to be changed. Checks that the account exists, charges\n * nuisance gas if the account hasn't been changed before.\n * @param _address Address of the account to change.\n */\n function _checkAccountChange(\n address _address\n )\n internal\n {\n // Start by checking for a load as we only want to charge nuisance gas proportional to\n // contract size once.\n _checkAccountLoad(_address);\n\n // Check whether the account has been changed before and mark it as changed if not. We need\n // this because \"nuisance gas\" only applies to the first time that an account is changed.\n (\n bool _wasAccountAlreadyChanged\n ) = ovmStateManager.testAndSetAccountChanged(_address);\n\n // If we hadn't already loaded the account, then we'll need to charge \"nuisance gas\" based\n // on the size of the contract code.\n if (_wasAccountAlreadyChanged == false) {\n ovmStateManager.incrementTotalUncommittedAccounts();\n _useNuisanceGas(\n (Lib_EthUtils.getCodeSize(_getAccountEthAddress(_address)) * NUISANCE_GAS_PER_CONTRACT_BYTE) + MIN_NUISANCE_GAS_PER_CONTRACT\n );\n }\n }\n\n /**\n * Validation whenever a slot needs to be loaded. Checks that the account exists, charges\n * nuisance gas if the slot hasn't been loaded before.\n * @param _contract Address of the account to load from.\n * @param _key 32 byte key to load.\n */\n function _checkContractStorageLoad(\n address _contract,\n bytes32 _key\n )\n internal\n {\n // Another case of hidden complexity. If we didn't enforce this requirement, then a\n // contract could pass in just enough gas to cause the INVALID_STATE_ACCESS check to fail\n // on L1 but not on L2. A contract could use this behavior to prevent the\n // OVM_ExecutionManager from detecting an invalid state access. Reverting with OUT_OF_GAS\n // allows us to also charge for the full message nuisance gas, because you deserve that for\n // trying to break the contract in this way.\n if (gasleft() < MIN_GAS_FOR_INVALID_STATE_ACCESS) {\n _revertWithFlag(RevertFlag.OUT_OF_GAS);\n }\n\n // We need to make sure that the transaction isn't trying to access storage that hasn't\n // been provided to the OVM_StateManager. We'll immediately abort if this is the case.\n // We know that we have enough gas to do this check because of the above test.\n if (ovmStateManager.hasContractStorage(_contract, _key) == false) {\n _revertWithFlag(RevertFlag.INVALID_STATE_ACCESS);\n }\n\n // Check whether the slot has been loaded before and mark it as loaded if not. We need\n // this because \"nuisance gas\" only applies to the first time that a slot is loaded.\n (\n bool _wasContractStorageAlreadyLoaded\n ) = ovmStateManager.testAndSetContractStorageLoaded(_contract, _key);\n\n // If we hadn't already loaded the account, then we'll need to charge some fixed amount of\n // \"nuisance gas\".\n if (_wasContractStorageAlreadyLoaded == false) {\n _useNuisanceGas(NUISANCE_GAS_SLOAD);\n }\n }\n\n /**\n * Validation whenever a slot needs to be changed. Checks that the account exists, charges\n * nuisance gas if the slot hasn't been changed before.\n * @param _contract Address of the account to change.\n * @param _key 32 byte key to change.\n */\n function _checkContractStorageChange(\n address _contract,\n bytes32 _key\n )\n internal\n {\n // Start by checking for load to make sure we have the storage slot and that we charge the\n // \"nuisance gas\" necessary to prove the storage slot state.\n _checkContractStorageLoad(_contract, _key);\n\n // Check whether the slot has been changed before and mark it as changed if not. We need\n // this because \"nuisance gas\" only applies to the first time that a slot is changed.\n (\n bool _wasContractStorageAlreadyChanged\n ) = ovmStateManager.testAndSetContractStorageChanged(_contract, _key);\n\n // If we hadn't already changed the account, then we'll need to charge some fixed amount of\n // \"nuisance gas\".\n if (_wasContractStorageAlreadyChanged == false) {\n // Changing a storage slot means that we're also going to have to change the\n // corresponding account, so do an account change check.\n _checkAccountChange(_contract);\n\n ovmStateManager.incrementTotalUncommittedContractStorage();\n _useNuisanceGas(NUISANCE_GAS_SSTORE);\n }\n }\n\n\n /************************************\n * Internal Functions: Revert Logic *\n ************************************/\n\n /**\n * Simple encoding for revert data.\n * @param _flag Flag to revert with.\n * @param _data Additional user-provided revert data.\n * @return _revertdata Encoded revert data.\n */\n function _encodeRevertData(\n RevertFlag _flag,\n bytes memory _data\n )\n internal\n view\n returns (\n bytes memory _revertdata\n )\n {\n // Out of gas and create exceptions will fundamentally return no data, so simulating it shouldn't either.\n if (\n _flag == RevertFlag.OUT_OF_GAS\n || _flag == RevertFlag.CREATE_EXCEPTION\n ) {\n return bytes('');\n }\n\n // INVALID_STATE_ACCESS doesn't need to return any data other than the flag.\n if (_flag == RevertFlag.INVALID_STATE_ACCESS) {\n return abi.encode(\n _flag,\n 0,\n 0,\n bytes('')\n );\n }\n\n // Just ABI encode the rest of the parameters.\n return abi.encode(\n _flag,\n messageRecord.nuisanceGasLeft,\n transactionRecord.ovmGasRefund,\n _data\n );\n }\n\n /**\n * Simple decoding for revert data.\n * @param _revertdata Revert data to decode.\n * @return _flag Flag used to revert.\n * @return _nuisanceGasLeft Amount of nuisance gas unused by the message.\n * @return _ovmGasRefund Amount of gas refunded during the message.\n * @return _data Additional user-provided revert data.\n */\n function _decodeRevertData(\n bytes memory _revertdata\n )\n internal\n pure\n returns (\n RevertFlag _flag,\n uint256 _nuisanceGasLeft,\n uint256 _ovmGasRefund,\n bytes memory _data\n )\n {\n // A length of zero means the call ran out of gas, just return empty data.\n if (_revertdata.length == 0) {\n return (\n RevertFlag.OUT_OF_GAS,\n 0,\n 0,\n bytes('')\n );\n }\n\n // ABI decode the incoming data.\n return abi.decode(_revertdata, (RevertFlag, uint256, uint256, bytes));\n }\n\n /**\n * Causes a message to revert or abort.\n * @param _flag Flag to revert with.\n * @param _data Additional user-provided data.\n */\n function _revertWithFlag(\n RevertFlag _flag,\n bytes memory _data\n )\n internal\n {\n // We don't want to revert when we're inside a CREATE or CREATE2, because those opcodes\n // fail silently (we can't pass any data upwards). Instead, we set a flag and return a\n // *single* byte, something the OVM_ExecutionManager will not return in any other case.\n // We're thereby allowed to communicate failure without allowing contracts to trick us into\n // thinking there was a failure.\n bool isCreation;\n assembly {\n isCreation := eq(extcodesize(caller()), 0)\n }\n\n if (isCreation) {\n messageRecord.revertFlag = _flag;\n\n assembly {\n return(0, 1)\n }\n }\n\n // If we're not inside a CREATE or CREATE2, we can simply encode the necessary data and\n // revert normally.\n bytes memory revertdata = _encodeRevertData(\n _flag,\n _data\n );\n\n assembly {\n revert(add(revertdata, 0x20), mload(revertdata))\n }\n }\n\n /**\n * Causes a message to revert or abort.\n * @param _flag Flag to revert with.\n */\n function _revertWithFlag(\n RevertFlag _flag\n )\n internal\n {\n _revertWithFlag(_flag, bytes(''));\n }\n\n\n /******************************************\n * Internal Functions: Nuisance Gas Logic *\n ******************************************/\n\n /**\n * Computes the nuisance gas limit from the gas limit.\n * @dev This function is currently using a naive implementation whereby the nuisance gas limit\n * is set to exactly equal the lesser of the gas limit or remaining gas. It's likely that\n * this implementation is perfectly fine, but we may change this formula later.\n * @param _gasLimit Gas limit to compute from.\n * @return _nuisanceGasLimit Computed nuisance gas limit.\n */\n function _getNuisanceGasLimit(\n uint256 _gasLimit\n )\n internal\n view\n returns (\n uint256 _nuisanceGasLimit\n )\n {\n return _gasLimit < gasleft() ? _gasLimit : gasleft();\n }\n\n /**\n * Uses a certain amount of nuisance gas.\n * @param _amount Amount of nuisance gas to use.\n */\n function _useNuisanceGas(\n uint256 _amount\n )\n internal\n {\n // Essentially the same as a standard OUT_OF_GAS, except we also retain a record of the gas\n // refund to be given at the end of the transaction.\n if (messageRecord.nuisanceGasLeft < _amount) {\n _revertWithFlag(RevertFlag.EXCEEDS_NUISANCE_GAS);\n }\n\n messageRecord.nuisanceGasLeft -= _amount;\n }\n\n\n /************************************\n * Internal Functions: Gas Metering *\n ************************************/\n\n /**\n * Checks whether a transaction needs to start a new epoch and does so if necessary.\n * @param _timestamp Transaction timestamp.\n */\n function _checkNeedsNewEpoch(\n uint256 _timestamp\n )\n internal\n {\n if (\n _timestamp >= (\n _getGasMetadata(GasMetadataKey.CURRENT_EPOCH_START_TIMESTAMP)\n + gasMeterConfig.secondsPerEpoch\n )\n ) {\n _putGasMetadata(\n GasMetadataKey.CURRENT_EPOCH_START_TIMESTAMP,\n _timestamp\n );\n\n _putGasMetadata(\n GasMetadataKey.PREV_EPOCH_SEQUENCER_QUEUE_GAS,\n _getGasMetadata(\n GasMetadataKey.CUMULATIVE_SEQUENCER_QUEUE_GAS\n )\n );\n\n _putGasMetadata(\n GasMetadataKey.PREV_EPOCH_L1TOL2_QUEUE_GAS,\n _getGasMetadata(\n GasMetadataKey.CUMULATIVE_L1TOL2_QUEUE_GAS\n )\n );\n }\n }\n\n /**\n * Validates the gas limit for a given transaction.\n * @param _gasLimit Gas limit provided by the transaction.\n * @param _queueOrigin Queue from which the transaction originated.\n * @return _valid Whether or not the gas limit is valid.\n */\n function _isValidGasLimit(\n uint256 _gasLimit,\n Lib_OVMCodec.QueueOrigin _queueOrigin\n )\n internal\n returns (\n bool _valid\n )\n {\n // Always have to be below the maximum gas limit.\n if (_gasLimit > gasMeterConfig.maxTransactionGasLimit) {\n return false;\n }\n\n // Always have to be above the minimum gas limit.\n if (_gasLimit < gasMeterConfig.minTransactionGasLimit) {\n return false;\n }\n\n // TEMPORARY: Gas metering is disabled for minnet.\n return true;\n // GasMetadataKey cumulativeGasKey;\n // GasMetadataKey prevEpochGasKey;\n // if (_queueOrigin == Lib_OVMCodec.QueueOrigin.SEQUENCER_QUEUE) {\n // cumulativeGasKey = GasMetadataKey.CUMULATIVE_SEQUENCER_QUEUE_GAS;\n // prevEpochGasKey = GasMetadataKey.PREV_EPOCH_SEQUENCER_QUEUE_GAS;\n // } else {\n // cumulativeGasKey = GasMetadataKey.CUMULATIVE_L1TOL2_QUEUE_GAS;\n // prevEpochGasKey = GasMetadataKey.PREV_EPOCH_L1TOL2_QUEUE_GAS;\n // }\n\n // return (\n // (\n // _getGasMetadata(cumulativeGasKey)\n // - _getGasMetadata(prevEpochGasKey)\n // + _gasLimit\n // ) < gasMeterConfig.maxGasPerQueuePerEpoch\n // );\n }\n\n /**\n * Updates the cumulative gas after a transaction.\n * @param _gasUsed Gas used by the transaction.\n * @param _queueOrigin Queue from which the transaction originated.\n */\n function _updateCumulativeGas(\n uint256 _gasUsed,\n Lib_OVMCodec.QueueOrigin _queueOrigin\n )\n internal\n {\n GasMetadataKey cumulativeGasKey;\n if (_queueOrigin == Lib_OVMCodec.QueueOrigin.SEQUENCER_QUEUE) {\n cumulativeGasKey = GasMetadataKey.CUMULATIVE_SEQUENCER_QUEUE_GAS;\n } else {\n cumulativeGasKey = GasMetadataKey.CUMULATIVE_L1TOL2_QUEUE_GAS;\n }\n\n _putGasMetadata(\n cumulativeGasKey,\n (\n _getGasMetadata(cumulativeGasKey)\n + gasMeterConfig.minTransactionGasLimit\n + _gasUsed\n - transactionRecord.ovmGasRefund\n )\n );\n }\n\n /**\n * Retrieves the value of a gas metadata key.\n * @param _key Gas metadata key to retrieve.\n * @return _value Value stored at the given key.\n */\n function _getGasMetadata(\n GasMetadataKey _key\n )\n internal\n returns (\n uint256 _value\n )\n {\n return uint256(_getContractStorage(\n GAS_METADATA_ADDRESS,\n bytes32(uint256(_key))\n ));\n }\n\n /**\n * Sets the value of a gas metadata key.\n * @param _key Gas metadata key to set.\n * @param _value Value to store at the given key.\n */\n function _putGasMetadata(\n GasMetadataKey _key,\n uint256 _value\n )\n internal\n {\n _putContractStorage(\n GAS_METADATA_ADDRESS,\n bytes32(uint256(_key)),\n bytes32(uint256(_value))\n );\n }\n\n\n /*****************************************\n * Internal Functions: Execution Context *\n *****************************************/\n\n /**\n * Swaps over to a new message context.\n * @param _prevMessageContext Context we're switching from.\n * @param _nextMessageContext Context we're switching to.\n */\n function _switchMessageContext(\n MessageContext memory _prevMessageContext,\n MessageContext memory _nextMessageContext\n )\n internal\n {\n // Avoid unnecessary the SSTORE.\n if (_prevMessageContext.ovmCALLER != _nextMessageContext.ovmCALLER) {\n messageContext.ovmCALLER = _nextMessageContext.ovmCALLER;\n }\n\n // Avoid unnecessary the SSTORE.\n if (_prevMessageContext.ovmADDRESS != _nextMessageContext.ovmADDRESS) {\n messageContext.ovmADDRESS = _nextMessageContext.ovmADDRESS;\n }\n\n // Avoid unnecessary the SSTORE.\n if (_prevMessageContext.isStatic != _nextMessageContext.isStatic) {\n messageContext.isStatic = _nextMessageContext.isStatic;\n }\n }\n\n /**\n * Initializes the execution context.\n * @param _transaction OVM transaction being executed.\n */\n function _initContext(\n Lib_OVMCodec.Transaction memory _transaction\n )\n internal\n {\n transactionContext.ovmTIMESTAMP = _transaction.timestamp;\n transactionContext.ovmNUMBER = _transaction.blockNumber;\n transactionContext.ovmTXGASLIMIT = _transaction.gasLimit;\n transactionContext.ovmL1QUEUEORIGIN = _transaction.l1QueueOrigin;\n transactionContext.ovmL1TXORIGIN = _transaction.l1TxOrigin;\n transactionContext.ovmGASLIMIT = gasMeterConfig.maxGasPerQueuePerEpoch;\n\n messageRecord.nuisanceGasLeft = _getNuisanceGasLimit(_transaction.gasLimit);\n }\n\n /**\n * Resets the transaction and message context.\n */\n function _resetContext()\n internal\n {\n transactionContext.ovmL1TXORIGIN = address(0);\n transactionContext.ovmTIMESTAMP = 0;\n transactionContext.ovmNUMBER = 0;\n transactionContext.ovmGASLIMIT = 0;\n transactionContext.ovmTXGASLIMIT = 0;\n transactionContext.ovmL1QUEUEORIGIN = Lib_OVMCodec.QueueOrigin.SEQUENCER_QUEUE;\n\n transactionRecord.ovmGasRefund = 0;\n\n messageContext.ovmCALLER = address(0);\n messageContext.ovmADDRESS = address(0);\n messageContext.isStatic = false;\n\n messageRecord.nuisanceGasLeft = 0;\n messageRecord.revertFlag = RevertFlag.DID_NOT_REVERT;\n }\n}\n" - }, - "contracts/optimistic-ethereum/libraries/resolver/Lib_AddressResolver.sol": { - "content": "// SPDX-License-Identifier: MIT\n// +build ovm\npragma solidity >0.5.0 <0.8.0;\n\n/* Library Imports */\nimport { Lib_AddressManager } from \"./Lib_AddressManager.sol\";\n\n/**\n * @title Lib_AddressResolver\n */\ncontract Lib_AddressResolver {\n\n /*******************************************\n * Contract Variables: Contract References *\n *******************************************/\n\n Lib_AddressManager internal libAddressManager;\n\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Lib_AddressManager.\n */\n constructor(\n address _libAddressManager\n ) public {\n libAddressManager = Lib_AddressManager(_libAddressManager);\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n function resolve(\n string memory _name\n )\n public\n view\n returns (\n address _contract\n )\n {\n return libAddressManager.getAddress(_name);\n }\n}\n" - }, - "contracts/optimistic-ethereum/libraries/utils/Lib_EthUtils.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.7.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_RLPWriter } from \"../rlp/Lib_RLPWriter.sol\";\nimport { Lib_Bytes32Utils } from \"./Lib_Bytes32Utils.sol\";\n\n/**\n * @title Lib_EthUtils\n */\nlibrary Lib_EthUtils {\n\n /***********************************\n * Internal Functions: Code Access *\n ***********************************/\n\n /**\n * Gets the code for a given address.\n * @param _address Address to get code for.\n * @param _offset Offset to start reading from.\n * @param _length Number of bytes to read.\n * @return _code Code read from the contract.\n */\n function getCode(\n address _address,\n uint256 _offset,\n uint256 _length\n )\n internal\n view\n returns (\n bytes memory _code\n )\n {\n assembly {\n _code := mload(0x40)\n mstore(0x40, add(_code, add(_length, 0x20)))\n mstore(_code, _length)\n extcodecopy(_address, add(_code, 0x20), _offset, _length)\n }\n\n return _code;\n }\n\n /**\n * Gets the full code for a given address.\n * @param _address Address to get code for.\n * @return _code Full code of the contract.\n */\n function getCode(\n address _address\n )\n internal\n view\n returns (\n bytes memory _code\n )\n {\n return getCode(\n _address,\n 0,\n getCodeSize(_address)\n );\n }\n\n /**\n * Gets the size of a contract's code in bytes.\n * @param _address Address to get code size for.\n * @return _codeSize Size of the contract's code in bytes.\n */\n function getCodeSize(\n address _address\n )\n internal\n view\n returns (\n uint256 _codeSize\n )\n {\n assembly {\n _codeSize := extcodesize(_address)\n }\n\n return _codeSize;\n }\n\n /**\n * Gets the hash of a contract's code.\n * @param _address Address to get a code hash for.\n * @return _codeHash Hash of the contract's code.\n */\n function getCodeHash(\n address _address\n )\n internal\n view\n returns (\n bytes32 _codeHash\n )\n {\n assembly {\n _codeHash := extcodehash(_address)\n }\n\n return _codeHash;\n }\n\n\n /*****************************************\n * Internal Functions: Contract Creation *\n *****************************************/\n\n /**\n * Creates a contract with some given initialization code.\n * @param _code Contract initialization code.\n * @return _created Address of the created contract.\n */\n function createContract(\n bytes memory _code\n )\n internal\n returns (\n address _created\n )\n {\n assembly {\n _created := create(\n 0,\n add(_code, 0x20),\n mload(_code)\n )\n }\n\n return _created;\n }\n\n /**\n * Computes the address that would be generated by CREATE.\n * @param _creator Address creating the contract.\n * @param _nonce Creator's nonce.\n * @return _address Address to be generated by CREATE.\n */\n function getAddressForCREATE(\n address _creator,\n uint256 _nonce\n )\n internal\n pure\n returns (\n address _address\n )\n {\n bytes[] memory encoded = new bytes[](2);\n encoded[0] = Lib_RLPWriter.writeAddress(_creator);\n encoded[1] = Lib_RLPWriter.writeUint(_nonce);\n\n bytes memory encodedList = Lib_RLPWriter.writeList(encoded);\n return Lib_Bytes32Utils.toAddress(keccak256(encodedList));\n }\n\n /**\n * Computes the address that would be generated by CREATE2.\n * @param _creator Address creating the contract.\n * @param _bytecode Bytecode of the contract to be created.\n * @param _salt 32 byte salt value mixed into the hash.\n * @return _address Address to be generated by CREATE2.\n */\n function getAddressForCREATE2(\n address _creator,\n bytes memory _bytecode,\n bytes32 _salt\n )\n internal\n pure\n returns (address _address)\n {\n bytes32 hashedData = keccak256(abi.encodePacked(\n byte(0xff),\n _creator,\n _salt,\n keccak256(_bytecode)\n ));\n\n return Lib_Bytes32Utils.toAddress(hashedData);\n }\n}\n" - }, - "contracts/optimistic-ethereum/iOVM/execution/iOVM_ExecutionManager.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\ninterface iOVM_ExecutionManager {\n /**********\n * Enums *\n *********/\n\n enum RevertFlag {\n DID_NOT_REVERT,\n OUT_OF_GAS,\n INTENTIONAL_REVERT,\n EXCEEDS_NUISANCE_GAS,\n INVALID_STATE_ACCESS,\n UNSAFE_BYTECODE,\n CREATE_COLLISION,\n STATIC_VIOLATION,\n CREATE_EXCEPTION,\n CREATOR_NOT_ALLOWED\n }\n\n enum GasMetadataKey {\n CURRENT_EPOCH_START_TIMESTAMP,\n CUMULATIVE_SEQUENCER_QUEUE_GAS,\n CUMULATIVE_L1TOL2_QUEUE_GAS,\n PREV_EPOCH_SEQUENCER_QUEUE_GAS,\n PREV_EPOCH_L1TOL2_QUEUE_GAS\n }\n\n /***********\n * Structs *\n ***********/\n\n struct GasMeterConfig {\n uint256 minTransactionGasLimit;\n uint256 maxTransactionGasLimit;\n uint256 maxGasPerQueuePerEpoch;\n uint256 secondsPerEpoch;\n }\n\n struct GlobalContext {\n uint256 ovmCHAINID;\n }\n\n struct TransactionContext {\n Lib_OVMCodec.QueueOrigin ovmL1QUEUEORIGIN;\n uint256 ovmTIMESTAMP;\n uint256 ovmNUMBER;\n uint256 ovmGASLIMIT;\n uint256 ovmTXGASLIMIT;\n address ovmL1TXORIGIN;\n }\n\n struct TransactionRecord {\n uint256 ovmGasRefund;\n }\n\n struct MessageContext {\n address ovmCALLER;\n address ovmADDRESS;\n bool isStatic;\n }\n\n struct MessageRecord {\n uint256 nuisanceGasLeft;\n RevertFlag revertFlag;\n }\n\n\n /************************************\n * Transaction Execution Entrypoint *\n ************************************/\n\n function run(\n Lib_OVMCodec.Transaction calldata _transaction,\n address _txStateManager\n ) external;\n\n\n /*******************\n * Context Opcodes *\n *******************/\n\n function ovmCALLER() external view returns (address _caller);\n function ovmADDRESS() external view returns (address _address);\n function ovmTIMESTAMP() external view returns (uint256 _timestamp);\n function ovmNUMBER() external view returns (uint256 _number);\n function ovmGASLIMIT() external view returns (uint256 _gasLimit);\n function ovmCHAINID() external view returns (uint256 _chainId);\n\n\n /**********************\n * L2 Context Opcodes *\n **********************/\n\n function ovmL1QUEUEORIGIN() external view returns (Lib_OVMCodec.QueueOrigin _queueOrigin);\n function ovmL1TXORIGIN() external view returns (address _l1TxOrigin);\n\n\n /*******************\n * Halting Opcodes *\n *******************/\n\n function ovmREVERT(bytes memory _data) external;\n\n\n /*****************************\n * Contract Creation Opcodes *\n *****************************/\n\n function ovmCREATE(bytes memory _bytecode) external returns (address _contract);\n function ovmCREATE2(bytes memory _bytecode, bytes32 _salt) external returns (address _contract);\n\n\n /*******************************\n * Account Abstraction Opcodes *\n ******************************/\n\n function ovmGETNONCE() external returns (uint256 _nonce);\n function ovmSETNONCE(uint256 _nonce) external;\n function ovmCREATEEOA(bytes32 _messageHash, uint8 _v, bytes32 _r, bytes32 _s) external;\n\n\n /****************************\n * Contract Calling Opcodes *\n ****************************/\n\n function ovmCALL(uint256 _gasLimit, address _address, bytes memory _calldata) external returns (bool _success, bytes memory _returndata);\n function ovmSTATICCALL(uint256 _gasLimit, address _address, bytes memory _calldata) external returns (bool _success, bytes memory _returndata);\n function ovmDELEGATECALL(uint256 _gasLimit, address _address, bytes memory _calldata) external returns (bool _success, bytes memory _returndata);\n\n\n /****************************\n * Contract Storage Opcodes *\n ****************************/\n\n function ovmSLOAD(bytes32 _key) external returns (bytes32 _value);\n function ovmSSTORE(bytes32 _key, bytes32 _value) external;\n\n\n /*************************\n * Contract Code Opcodes *\n *************************/\n\n function ovmEXTCODECOPY(address _contract, uint256 _offset, uint256 _length) external returns (bytes memory _code);\n function ovmEXTCODESIZE(address _contract) external returns (uint256 _size);\n function ovmEXTCODEHASH(address _contract) external returns (bytes32 _hash);\n\n\n /**************************************\n * Public Functions: Execution Safety *\n **************************************/\n\n function safeCREATE(address _address, bytes memory _bytecode) external;\n\n /***************************************\n * Public Functions: Execution Context *\n ***************************************/\n\n function getMaxTransactionGasLimit() external view returns (uint _maxTransactionGasLimit);\n}\n" - }, - "contracts/optimistic-ethereum/iOVM/execution/iOVM_StateManager.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/**\n * @title iOVM_StateManager\n */\ninterface iOVM_StateManager {\n\n /*******************\n * Data Structures *\n *******************/\n\n enum ItemState {\n ITEM_UNTOUCHED,\n ITEM_LOADED,\n ITEM_CHANGED,\n ITEM_COMMITTED\n }\n\n /***************************\n * Public Functions: Misc *\n ***************************/\n\n function isAuthenticated(address _address) external view returns (bool);\n\n /***************************\n * Public Functions: Setup *\n ***************************/\n\n function owner() external view returns (address _owner);\n function ovmExecutionManager() external view returns (address _ovmExecutionManager);\n function setExecutionManager(address _ovmExecutionManager) external;\n\n\n /************************************\n * Public Functions: Account Access *\n ************************************/\n\n function putAccount(address _address, Lib_OVMCodec.Account memory _account) external;\n function putEmptyAccount(address _address) external;\n function getAccount(address _address) external view returns (Lib_OVMCodec.Account memory _account);\n function hasAccount(address _address) external view returns (bool _exists);\n function hasEmptyAccount(address _address) external view returns (bool _exists);\n function setAccountNonce(address _address, uint256 _nonce) external;\n function getAccountNonce(address _address) external view returns (uint256 _nonce);\n function getAccountEthAddress(address _address) external view returns (address _ethAddress);\n function getAccountStorageRoot(address _address) external view returns (bytes32 _storageRoot);\n function initPendingAccount(address _address) external;\n function commitPendingAccount(address _address, address _ethAddress, bytes32 _codeHash) external;\n function testAndSetAccountLoaded(address _address) external returns (bool _wasAccountAlreadyLoaded);\n function testAndSetAccountChanged(address _address) external returns (bool _wasAccountAlreadyChanged);\n function commitAccount(address _address) external returns (bool _wasAccountCommitted);\n function incrementTotalUncommittedAccounts() external;\n function getTotalUncommittedAccounts() external view returns (uint256 _total);\n function wasAccountChanged(address _address) external view returns (bool);\n function wasAccountCommitted(address _address) external view returns (bool);\n\n\n /************************************\n * Public Functions: Storage Access *\n ************************************/\n\n function putContractStorage(address _contract, bytes32 _key, bytes32 _value) external;\n function getContractStorage(address _contract, bytes32 _key) external view returns (bytes32 _value);\n function hasContractStorage(address _contract, bytes32 _key) external returns (bool _exists);\n function testAndSetContractStorageLoaded(address _contract, bytes32 _key) external returns (bool _wasContractStorageAlreadyLoaded);\n function testAndSetContractStorageChanged(address _contract, bytes32 _key) external returns (bool _wasContractStorageAlreadyChanged);\n function commitContractStorage(address _contract, bytes32 _key) external returns (bool _wasContractStorageCommitted);\n function incrementTotalUncommittedContractStorage() external;\n function getTotalUncommittedContractStorage() external view returns (uint256 _total);\n function wasContractStorageChanged(address _contract, bytes32 _key) external view returns (bool);\n function wasContractStorageCommitted(address _contract, bytes32 _key) external view returns (bool);\n}\n" - }, - "contracts/optimistic-ethereum/iOVM/execution/iOVM_SafetyChecker.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/**\n * @title iOVM_SafetyChecker\n */\ninterface iOVM_SafetyChecker {\n\n /********************\n * Public Functions *\n ********************/\n\n function isBytecodeSafe(bytes calldata _bytecode) external view returns (bool);\n}\n" - }, - "contracts/optimistic-ethereum/OVM/accounts/OVM_ProxyEOA.sol": { - "content": "pragma solidity ^0.7.0;\n\n/* Library Imports */\nimport { Lib_BytesUtils } from \"../../libraries/utils/Lib_BytesUtils.sol\";\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_ECDSAUtils } from \"../../libraries/utils/Lib_ECDSAUtils.sol\";\nimport { Lib_SafeExecutionManagerWrapper } from \"../../libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\";\n\n/**\n * @title OVM_ProxyEOA\n */\ncontract OVM_ProxyEOA {\n\n bytes32 constant IMPLEMENTATION_KEY = 0xdeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddead;\n\n /***************\n * Constructor *\n ***************/\n\n constructor(\n address _implementation\n ) {\n _setImplementation(_implementation);\n }\n\n\n /*********************\n * Fallback Function *\n *********************/\n\n fallback()\n external\n {\n (bool success, bytes memory returndata) = Lib_SafeExecutionManagerWrapper.safeDELEGATECALL(\n gasleft(),\n getImplementation(),\n msg.data\n );\n\n if (success) {\n assembly {\n return(add(returndata, 0x20), mload(returndata))\n }\n } else {\n Lib_SafeExecutionManagerWrapper.safeREVERT(\n string(returndata)\n );\n }\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n function upgrade(\n address _implementation\n )\n external\n {\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(\n Lib_SafeExecutionManagerWrapper.safeADDRESS() == Lib_SafeExecutionManagerWrapper.safeCALLER(),\n \"EOAs can only upgrade their own EOA implementation\"\n );\n\n _setImplementation(_implementation);\n }\n\n function getImplementation()\n public\n returns (\n address _implementation\n )\n {\n return address(uint160(uint256(\n Lib_SafeExecutionManagerWrapper.safeSLOAD(\n IMPLEMENTATION_KEY\n )\n )));\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n function _setImplementation(\n address _implementation\n )\n internal\n {\n Lib_SafeExecutionManagerWrapper.safeSSTORE(\n IMPLEMENTATION_KEY,\n bytes32(uint256(uint160(_implementation)))\n );\n }\n}" - }, - "contracts/optimistic-ethereum/OVM/precompiles/OVM_DeployerWhitelist.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.7.0;\n\n/* Library Imports */\nimport { Lib_Bytes32Utils } from \"../../libraries/utils/Lib_Bytes32Utils.sol\";\n\n/* Interface Imports */\nimport { iOVM_DeployerWhitelist } from \"../../iOVM/precompiles/iOVM_DeployerWhitelist.sol\";\nimport { Lib_SafeExecutionManagerWrapper } from \"../../libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\";\n\n/**\n * @title OVM_DeployerWhitelist\n * @dev L2 CONTRACT (NOT COMPILED)\n */\ncontract OVM_DeployerWhitelist is iOVM_DeployerWhitelist {\n\n /**********************\n * Contract Constants *\n **********************/\n\n bytes32 internal constant KEY_INITIALIZED = 0x0000000000000000000000000000000000000000000000000000000000000010;\n bytes32 internal constant KEY_OWNER = 0x0000000000000000000000000000000000000000000000000000000000000011;\n bytes32 internal constant KEY_ALLOW_ARBITRARY_DEPLOYMENT = 0x0000000000000000000000000000000000000000000000000000000000000012;\n\n\n /**********************\n * Function Modifiers *\n **********************/\n \n /**\n * Blocks functions to anyone except the contract owner.\n */\n modifier onlyOwner() {\n address owner = Lib_Bytes32Utils.toAddress(\n Lib_SafeExecutionManagerWrapper.safeSLOAD(\n KEY_OWNER\n )\n );\n\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(\n Lib_SafeExecutionManagerWrapper.safeCALLER() == owner,\n \"Function can only be called by the owner of this contract.\"\n );\n _;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n \n /**\n * Initializes the whitelist.\n * @param _owner Address of the owner for this contract.\n * @param _allowArbitraryDeployment Whether or not to allow arbitrary contract deployment.\n */\n function initialize(\n address _owner,\n bool _allowArbitraryDeployment\n )\n override\n public\n {\n bool initialized = Lib_Bytes32Utils.toBool(\n Lib_SafeExecutionManagerWrapper.safeSLOAD(KEY_INITIALIZED)\n );\n\n if (initialized == true) {\n return;\n }\n\n Lib_SafeExecutionManagerWrapper.safeSSTORE(\n KEY_INITIALIZED,\n Lib_Bytes32Utils.fromBool(true)\n );\n Lib_SafeExecutionManagerWrapper.safeSSTORE(\n KEY_OWNER,\n Lib_Bytes32Utils.fromAddress(_owner)\n );\n Lib_SafeExecutionManagerWrapper.safeSSTORE(\n KEY_ALLOW_ARBITRARY_DEPLOYMENT,\n Lib_Bytes32Utils.fromBool(_allowArbitraryDeployment)\n );\n }\n\n /**\n * Gets the owner of the whitelist.\n */\n function getOwner()\n override\n public\n returns(\n address\n )\n {\n return Lib_Bytes32Utils.toAddress(\n Lib_SafeExecutionManagerWrapper.safeSLOAD(\n KEY_OWNER\n )\n );\n }\n\n /**\n * Adds or removes an address from the deployment whitelist.\n * @param _deployer Address to update permissions for.\n * @param _isWhitelisted Whether or not the address is whitelisted.\n */\n function setWhitelistedDeployer(\n address _deployer,\n bool _isWhitelisted\n )\n override\n public\n onlyOwner\n {\n Lib_SafeExecutionManagerWrapper.safeSSTORE(\n Lib_Bytes32Utils.fromAddress(_deployer),\n Lib_Bytes32Utils.fromBool(_isWhitelisted)\n );\n }\n\n /**\n * Updates the owner of this contract.\n * @param _owner Address of the new owner.\n */\n function setOwner(\n address _owner\n )\n override\n public\n onlyOwner\n {\n Lib_SafeExecutionManagerWrapper.safeSSTORE(\n KEY_OWNER,\n Lib_Bytes32Utils.fromAddress(_owner)\n );\n }\n\n /**\n * Updates the arbitrary deployment flag.\n * @param _allowArbitraryDeployment Whether or not to allow arbitrary contract deployment.\n */\n function setAllowArbitraryDeployment(\n bool _allowArbitraryDeployment\n )\n override\n public\n onlyOwner\n {\n Lib_SafeExecutionManagerWrapper.safeSSTORE(\n KEY_ALLOW_ARBITRARY_DEPLOYMENT,\n Lib_Bytes32Utils.fromBool(_allowArbitraryDeployment)\n );\n }\n\n /**\n * Permanently enables arbitrary contract deployment and deletes the owner.\n */\n function enableArbitraryContractDeployment()\n override\n public\n onlyOwner\n {\n setAllowArbitraryDeployment(true);\n setOwner(address(0));\n }\n\n /**\n * Checks whether an address is allowed to deploy contracts.\n * @param _deployer Address to check.\n * @return _allowed Whether or not the address can deploy contracts.\n */\n function isDeployerAllowed(\n address _deployer\n )\n override\n public\n returns (\n bool _allowed\n )\n {\n bool initialized = Lib_Bytes32Utils.toBool(\n Lib_SafeExecutionManagerWrapper.safeSLOAD(KEY_INITIALIZED)\n );\n\n if (initialized == false) {\n return true;\n }\n\n bool allowArbitraryDeployment = Lib_Bytes32Utils.toBool(\n Lib_SafeExecutionManagerWrapper.safeSLOAD(KEY_ALLOW_ARBITRARY_DEPLOYMENT)\n );\n\n if (allowArbitraryDeployment == true) {\n return true;\n }\n\n bool isWhitelisted = Lib_Bytes32Utils.toBool(\n Lib_SafeExecutionManagerWrapper.safeSLOAD(\n Lib_Bytes32Utils.fromAddress(_deployer)\n )\n );\n\n return isWhitelisted; \n }\n}\n" - }, - "contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol": { - "content": "// SPDX-License-Identifier: MIT\n// +build ovm\npragma solidity >0.5.0 <0.8.0;\n\n/* Contract Imports */\nimport { Ownable } from \"./Lib_Ownable.sol\";\n\n/**\n * @title Lib_AddressManager\n */\ncontract Lib_AddressManager is Ownable {\n\n /**********\n * Events *\n **********/\n\n event AddressSet(\n string _name,\n address _newAddress\n );\n\n /*******************************************\n * Contract Variables: Internal Accounting *\n *******************************************/\n\n mapping (bytes32 => address) private addresses;\n\n\n /********************\n * Public Functions *\n ********************/\n\n function setAddress(\n string memory _name,\n address _address\n )\n public\n onlyOwner\n {\n emit AddressSet(_name, _address);\n addresses[_getNameHash(_name)] = _address;\n }\n\n function getAddress(\n string memory _name\n )\n public\n view\n returns (address)\n {\n return addresses[_getNameHash(_name)];\n }\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n function _getNameHash(\n string memory _name\n )\n internal\n pure\n returns (\n bytes32 _hash\n )\n {\n return keccak256(abi.encodePacked(_name));\n }\n}\n" - }, - "contracts/optimistic-ethereum/libraries/resolver/Lib_Ownable.sol": { - "content": "// SPDX-License-Identifier: MIT\n// +build ovm\npragma solidity >0.5.0 <0.8.0;\n\n/**\n * @title Ownable\n * @dev Adapted from https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol\n */\nabstract contract Ownable {\n\n /*************\n * Variables *\n *************/\n\n address public owner;\n\n\n /**********\n * Events *\n **********/\n\n event OwnershipTransferred(\n address indexed previousOwner,\n address indexed newOwner\n );\n\n\n /***************\n * Constructor *\n ***************/\n\n constructor() internal {\n owner = msg.sender;\n emit OwnershipTransferred(address(0), owner);\n }\n\n\n /**********************\n * Function Modifiers *\n **********************/\n\n modifier onlyOwner() {\n require(\n owner == msg.sender,\n \"Ownable: caller is not the owner\"\n );\n _;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n function renounceOwnership()\n public\n virtual\n onlyOwner\n {\n emit OwnershipTransferred(owner, address(0));\n owner = address(0);\n }\n\n function transferOwnership(address _newOwner)\n public\n virtual\n onlyOwner\n {\n require(\n _newOwner != address(0),\n \"Ownable: new owner cannot be the zero address\"\n );\n\n emit OwnershipTransferred(owner, _newOwner);\n owner = _newOwner;\n }\n}\n" - }, - "contracts/optimistic-ethereum/iOVM/precompiles/iOVM_DeployerWhitelist.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/**\n * @title iOVM_DeployerWhitelist\n */\ninterface iOVM_DeployerWhitelist {\n\n /********************\n * Public Functions *\n ********************/\n\n function initialize(address _owner, bool _allowArbitraryDeployment) external;\n function getOwner() external returns (address _owner);\n function setWhitelistedDeployer(address _deployer, bool _isWhitelisted) external;\n function setOwner(address _newOwner) external;\n function setAllowArbitraryDeployment(bool _allowArbitraryDeployment) external;\n function enableArbitraryContractDeployment() external;\n function isDeployerAllowed(address _deployer) external returns (bool _allowed);\n}\n" - }, - "contracts/optimistic-ethereum/OVM/precompiles/OVM_SequencerEntrypoint.sol": { - "content": "pragma solidity ^0.7.0;\n\n/* Library Imports */\nimport { Lib_BytesUtils } from \"../../libraries/utils/Lib_BytesUtils.sol\";\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_ECDSAUtils } from \"../../libraries/utils/Lib_ECDSAUtils.sol\";\nimport { Lib_SafeExecutionManagerWrapper } from \"../../libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\";\n\n/**\n * @title OVM_SequencerEntrypoint\n */\ncontract OVM_SequencerEntrypoint {\n\n /*********\n * Enums *\n *********/\n \n enum TransactionType {\n NATIVE_ETH_TRANSACTION,\n ETH_SIGNED_MESSAGE\n }\n\n\n /*********************\n * Fallback Function *\n *********************/\n\n /**\n * Uses a custom \"compressed\" format to save on calldata gas:\n * calldata[00:01]: transaction type (0 == EIP 155, 2 == Eth Sign Message)\n * calldata[01:33]: signature \"r\" parameter\n * calldata[33:65]: signature \"s\" parameter\n * calldata[66:69]: transaction gas limit\n * calldata[69:72]: transaction gas price\n * calldata[72:75]: transaction nonce\n * calldata[75:95]: transaction target address\n * calldata[95:XX]: transaction data\n */\n fallback()\n external\n {\n TransactionType transactionType = _getTransactionType(Lib_BytesUtils.toUint8(msg.data, 0));\n\n bytes32 r = Lib_BytesUtils.toBytes32(Lib_BytesUtils.slice(msg.data, 1, 32));\n bytes32 s = Lib_BytesUtils.toBytes32(Lib_BytesUtils.slice(msg.data, 33, 32));\n uint8 v = Lib_BytesUtils.toUint8(msg.data, 65);\n\n // Remainder is the transaction to execute.\n bytes memory compressedTx = Lib_BytesUtils.slice(msg.data, 66);\n bool isEthSignedMessage = transactionType == TransactionType.ETH_SIGNED_MESSAGE;\n\n // Need to decompress and then re-encode the transaction based on the original encoding.\n bytes memory encodedTx = Lib_OVMCodec.encodeEIP155Transaction(\n Lib_OVMCodec.decompressEIP155Transaction(compressedTx),\n isEthSignedMessage\n );\n\n address target = Lib_ECDSAUtils.recover(\n encodedTx,\n isEthSignedMessage,\n uint8(v),\n r,\n s\n );\n\n if (Lib_SafeExecutionManagerWrapper.safeEXTCODESIZE(target) == 0) {\n // ProxyEOA has not yet been deployed for this EOA.\n bytes32 messageHash = Lib_ECDSAUtils.getMessageHash(encodedTx, isEthSignedMessage);\n Lib_SafeExecutionManagerWrapper.safeCREATEEOA(messageHash, uint8(v), r, s);\n }\n\n // ProxyEOA has been deployed for this EOA, continue to CALL.\n bytes memory callbytes = abi.encodeWithSignature(\n \"execute(bytes,uint8,uint8,bytes32,bytes32)\",\n encodedTx,\n isEthSignedMessage,\n uint8(v),\n r,\n s\n );\n\n Lib_SafeExecutionManagerWrapper.safeCALL(\n gasleft(),\n target,\n callbytes\n );\n }\n \n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Converts a uint256 into a TransactionType enum.\n * @param _transactionType Transaction type index.\n * @return Transaction type enum value.\n */\n function _getTransactionType(\n uint8 _transactionType\n )\n internal\n returns (\n TransactionType\n )\n {\n if (_transactionType == 0) {\n return TransactionType.NATIVE_ETH_TRANSACTION;\n } if (_transactionType == 2) {\n return TransactionType.ETH_SIGNED_MESSAGE;\n } else {\n Lib_SafeExecutionManagerWrapper.safeREVERT(\n \"Transaction type must be 0 or 2\"\n );\n }\n }\n}\n" - }, - "contracts/test-libraries/utils/TestLib_ECDSAUtils.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.7.0;\n\n/* Library Imports */\nimport { Lib_ECDSAUtils } from \"../../optimistic-ethereum/libraries/utils/Lib_ECDSAUtils.sol\";\n\n/**\n * @title TestLib_ECDSAUtils\n */\ncontract TestLib_ECDSAUtils {\n\n function recover(\n bytes memory _message,\n bool _isEthSignedMessage,\n uint8 _v,\n bytes32 _r,\n bytes32 _s\n )\n public\n pure\n returns (\n address _sender\n )\n {\n return Lib_ECDSAUtils.recover(\n _message,\n _isEthSignedMessage,\n _v,\n _r,\n _s\n );\n }\n}\n" - }, - "contracts/test-libraries/codec/TestLib_OVMCodec.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.7.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../optimistic-ethereum/libraries/codec/Lib_OVMCodec.sol\";\n\n/**\n * @title TestLib_OVMCodec\n */\ncontract TestLib_OVMCodec {\n\n function decodeEIP155Transaction(\n bytes memory _transaction,\n bool _isEthSignedMessage\n )\n public\n pure\n returns (\n Lib_OVMCodec.EIP155Transaction memory _decoded\n )\n {\n return Lib_OVMCodec.decodeEIP155Transaction(_transaction, _isEthSignedMessage);\n }\n\n function encodeTransaction(\n Lib_OVMCodec.Transaction memory _transaction\n )\n public\n pure\n returns (\n bytes memory _encoded\n )\n {\n return Lib_OVMCodec.encodeTransaction(_transaction);\n }\n\n function hashTransaction(\n Lib_OVMCodec.Transaction memory _transaction\n )\n public\n pure\n returns (\n bytes32 _hash\n )\n {\n return Lib_OVMCodec.hashTransaction(_transaction);\n }\n\n function decompressEIP155Transaction(\n bytes memory _transaction\n )\n public\n returns (\n Lib_OVMCodec.EIP155Transaction memory _decompressed\n )\n {\n return Lib_OVMCodec.decompressEIP155Transaction(_transaction);\n }\n}\n" - }, - "contracts/optimistic-ethereum/OVM/verification/OVM_StateTransitioner.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.7.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\nimport { Lib_EthUtils } from \"../../libraries/utils/Lib_EthUtils.sol\";\nimport { Lib_Bytes32Utils } from \"../../libraries/utils/Lib_Bytes32Utils.sol\";\nimport { Lib_BytesUtils } from \"../../libraries/utils/Lib_BytesUtils.sol\";\nimport { Lib_SecureMerkleTrie } from \"../../libraries/trie/Lib_SecureMerkleTrie.sol\";\nimport { Lib_RLPWriter } from \"../../libraries/rlp/Lib_RLPWriter.sol\";\nimport { Lib_RLPReader } from \"../../libraries/rlp/Lib_RLPReader.sol\";\n\n/* Interface Imports */\nimport { iOVM_StateTransitioner } from \"../../iOVM/verification/iOVM_StateTransitioner.sol\";\nimport { iOVM_BondManager } from \"../../iOVM/verification/iOVM_BondManager.sol\";\nimport { iOVM_ExecutionManager } from \"../../iOVM/execution/iOVM_ExecutionManager.sol\";\nimport { iOVM_StateManager } from \"../../iOVM/execution/iOVM_StateManager.sol\";\nimport { iOVM_StateManagerFactory } from \"../../iOVM/execution/iOVM_StateManagerFactory.sol\";\n\n/* Contract Imports */\nimport { OVM_FraudContributor } from \"./OVM_FraudContributor.sol\";\n\n/**\n * @title OVM_StateTransitioner\n */\ncontract OVM_StateTransitioner is Lib_AddressResolver, OVM_FraudContributor, iOVM_StateTransitioner {\n\n /*******************\n * Data Structures *\n *******************/\n\n enum TransitionPhase {\n PRE_EXECUTION,\n POST_EXECUTION,\n COMPLETE\n }\n\n\n /*******************************************\n * Contract Variables: Contract References *\n *******************************************/\n\n iOVM_StateManager public ovmStateManager;\n\n\n /*******************************************\n * Contract Variables: Internal Accounting *\n *******************************************/\n\n bytes32 internal preStateRoot;\n bytes32 internal postStateRoot;\n TransitionPhase public phase;\n uint256 internal stateTransitionIndex;\n bytes32 internal transactionHash;\n\n\n /*************\n * Constants *\n *************/\n\n bytes32 internal constant EMPTY_ACCOUNT_CODE_HASH = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;\n bytes32 internal constant EMPTY_ACCOUNT_STORAGE_ROOT = 0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421;\n\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n * @param _stateTransitionIndex Index of the state transition being verified.\n * @param _preStateRoot State root before the transition was executed.\n * @param _transactionHash Hash of the executed transaction.\n */\n constructor(\n address _libAddressManager,\n uint256 _stateTransitionIndex,\n bytes32 _preStateRoot,\n bytes32 _transactionHash\n )\n Lib_AddressResolver(_libAddressManager)\n {\n stateTransitionIndex = _stateTransitionIndex;\n preStateRoot = _preStateRoot;\n postStateRoot = _preStateRoot;\n transactionHash = _transactionHash;\n\n ovmStateManager = iOVM_StateManagerFactory(resolve(\"OVM_StateManagerFactory\")).create(address(this));\n }\n\n\n /**********************\n * Function Modifiers *\n **********************/\n\n /**\n * Checks that a function is only run during a specific phase.\n * @param _phase Phase the function must run within.\n */\n modifier onlyDuringPhase(\n TransitionPhase _phase\n ) {\n require(\n phase == _phase,\n \"Function must be called during the correct phase.\"\n );\n _;\n }\n\n\n /**********************************\n * Public Functions: State Access *\n **********************************/\n\n /**\n * Retrieves the state root before execution.\n * @return _preStateRoot State root before execution.\n */\n function getPreStateRoot()\n override\n public\n view\n returns (\n bytes32 _preStateRoot\n )\n {\n return preStateRoot;\n }\n\n /**\n * Retrieves the state root after execution.\n * @return _postStateRoot State root after execution.\n */\n function getPostStateRoot()\n override\n public\n view\n returns (\n bytes32 _postStateRoot\n )\n {\n return postStateRoot;\n }\n\n /**\n * Checks whether the transitioner is complete.\n * @return _complete Whether or not the transition process is finished.\n */\n function isComplete()\n override\n public\n view\n returns (\n bool _complete\n )\n {\n return phase == TransitionPhase.COMPLETE;\n }\n \n\n /***********************************\n * Public Functions: Pre-Execution *\n ***********************************/\n\n /**\n * Allows a user to prove the initial state of a contract.\n * @param _ovmContractAddress Address of the contract on the OVM.\n * @param _ethContractAddress Address of the corresponding contract on L1.\n * @param _stateTrieWitness Proof of the account state.\n */\n function proveContractState(\n address _ovmContractAddress,\n address _ethContractAddress,\n bytes memory _stateTrieWitness\n )\n override\n public\n onlyDuringPhase(TransitionPhase.PRE_EXECUTION)\n contributesToFraudProof(preStateRoot, transactionHash)\n {\n // Exit quickly to avoid unnecessary work.\n require(\n (\n ovmStateManager.hasAccount(_ovmContractAddress) == false\n && ovmStateManager.hasEmptyAccount(_ovmContractAddress) == false\n ),\n \"Account state has already been proven.\"\n );\n\n // Function will fail if the proof is not a valid inclusion or exclusion proof.\n (\n bool exists,\n bytes memory encodedAccount\n ) = Lib_SecureMerkleTrie.get(\n abi.encodePacked(_ovmContractAddress),\n _stateTrieWitness,\n preStateRoot\n );\n\n if (exists == true) {\n // Account exists, this was an inclusion proof.\n Lib_OVMCodec.EVMAccount memory account = Lib_OVMCodec.decodeEVMAccount(\n encodedAccount\n );\n\n address ethContractAddress = _ethContractAddress;\n if (account.codeHash == EMPTY_ACCOUNT_CODE_HASH) {\n // Use a known empty contract to prevent an attack in which a user provides a\n // contract address here and then later deploys code to it.\n ethContractAddress = 0x0000000000000000000000000000000000000000;\n } else {\n // Otherwise, make sure that the code at the provided eth address matches the hash\n // of the code stored on L2.\n require(\n Lib_EthUtils.getCodeHash(ethContractAddress) == account.codeHash,\n \"OVM_StateTransitioner: Provided L1 contract code hash does not match L2 contract code hash.\"\n );\n }\n\n ovmStateManager.putAccount(\n _ovmContractAddress,\n Lib_OVMCodec.Account({\n nonce: account.nonce,\n balance: account.balance,\n storageRoot: account.storageRoot,\n codeHash: account.codeHash,\n ethAddress: ethContractAddress,\n isFresh: false\n })\n );\n } else {\n // Account does not exist, this was an exclusion proof.\n ovmStateManager.putEmptyAccount(_ovmContractAddress);\n }\n }\n\n /**\n * Allows a user to prove the initial state of a contract storage slot.\n * @param _ovmContractAddress Address of the contract on the OVM.\n * @param _key Claimed account slot key.\n * @param _storageTrieWitness Proof of the storage slot.\n */\n function proveStorageSlot(\n address _ovmContractAddress,\n bytes32 _key,\n bytes memory _storageTrieWitness\n )\n override\n public\n onlyDuringPhase(TransitionPhase.PRE_EXECUTION)\n contributesToFraudProof(preStateRoot, transactionHash)\n {\n // Exit quickly to avoid unnecessary work.\n require(\n ovmStateManager.hasContractStorage(_ovmContractAddress, _key) == false,\n \"Storage slot has already been proven.\"\n );\n\n require(\n ovmStateManager.hasAccount(_ovmContractAddress) == true,\n \"Contract must be verified before proving a storage slot.\"\n );\n\n bytes32 storageRoot = ovmStateManager.getAccountStorageRoot(_ovmContractAddress);\n bytes32 value;\n\n if (storageRoot == EMPTY_ACCOUNT_STORAGE_ROOT) {\n // Storage trie was empty, so the user is always allowed to insert zero-byte values.\n value = bytes32(0);\n } else {\n // Function will fail if the proof is not a valid inclusion or exclusion proof.\n (\n bool exists,\n bytes memory encodedValue\n ) = Lib_SecureMerkleTrie.get(\n abi.encodePacked(_key),\n _storageTrieWitness,\n storageRoot\n );\n\n if (exists == true) {\n // Inclusion proof.\n // Stored values are RLP encoded, with leading zeros removed.\n value = Lib_BytesUtils.toBytes32PadLeft(\n Lib_RLPReader.readBytes(encodedValue)\n );\n } else {\n // Exclusion proof, can only be zero bytes.\n value = bytes32(0);\n }\n }\n\n ovmStateManager.putContractStorage(\n _ovmContractAddress,\n _key,\n value\n );\n }\n\n\n /*******************************\n * Public Functions: Execution *\n *******************************/\n\n /**\n * Executes the state transition.\n * @param _transaction OVM transaction to execute.\n */\n function applyTransaction(\n Lib_OVMCodec.Transaction memory _transaction\n )\n override\n public\n onlyDuringPhase(TransitionPhase.PRE_EXECUTION)\n contributesToFraudProof(preStateRoot, transactionHash)\n {\n require(\n Lib_OVMCodec.hashTransaction(_transaction) == transactionHash,\n \"Invalid transaction provided.\"\n );\n\n // We require gas to complete the logic here in run() before/after execution,\n // But must ensure the full _tx.gasLimit can be given to the ovmCALL (determinism)\n // This includes 1/64 of the gas getting lost because of EIP-150 (lost twice--first \n // going into EM, then going into the code contract).\n require(\n gasleft() >= 100000 + _transaction.gasLimit * 1032 / 1000, // 1032/1000 = 1.032 = (64/63)^2 rounded up\n \"Not enough gas to execute transaction deterministically.\"\n );\n\n iOVM_ExecutionManager ovmExecutionManager = iOVM_ExecutionManager(resolve(\"OVM_ExecutionManager\"));\n\n // We call `setExecutionManager` right before `run` (and not earlier) just in case the\n // OVM_ExecutionManager address was updated between the time when this contract was created\n // and when `applyTransaction` was called.\n ovmStateManager.setExecutionManager(address(ovmExecutionManager));\n\n // `run` always succeeds *unless* the user hasn't provided enough gas to `applyTransaction`\n // or an INVALID_STATE_ACCESS flag was triggered. Either way, we won't get beyond this line\n // if that's the case.\n ovmExecutionManager.run(_transaction, address(ovmStateManager));\n\n phase = TransitionPhase.POST_EXECUTION;\n }\n\n\n /************************************\n * Public Functions: Post-Execution *\n ************************************/\n\n /**\n * Allows a user to commit the final state of a contract.\n * @param _ovmContractAddress Address of the contract on the OVM.\n * @param _stateTrieWitness Proof of the account state.\n */\n function commitContractState(\n address _ovmContractAddress,\n bytes memory _stateTrieWitness\n )\n override\n public\n onlyDuringPhase(TransitionPhase.POST_EXECUTION)\n contributesToFraudProof(preStateRoot, transactionHash)\n {\n require(\n ovmStateManager.getTotalUncommittedContractStorage() == 0,\n \"All storage must be committed before committing account states.\"\n );\n\n require (\n ovmStateManager.commitAccount(_ovmContractAddress) == true,\n \"Account state wasn't changed or has already been committed.\"\n );\n\n Lib_OVMCodec.Account memory account = ovmStateManager.getAccount(_ovmContractAddress);\n\n postStateRoot = Lib_SecureMerkleTrie.update(\n abi.encodePacked(_ovmContractAddress),\n Lib_OVMCodec.encodeEVMAccount(\n Lib_OVMCodec.toEVMAccount(account)\n ),\n _stateTrieWitness,\n postStateRoot\n );\n\n // Emit an event to help clients figure out the proof ordering.\n emit AccountCommitted(\n _ovmContractAddress\n );\n }\n\n /**\n * Allows a user to commit the final state of a contract storage slot.\n * @param _ovmContractAddress Address of the contract on the OVM.\n * @param _key Claimed account slot key.\n * @param _storageTrieWitness Proof of the storage slot.\n */\n function commitStorageSlot(\n address _ovmContractAddress,\n bytes32 _key,\n bytes memory _storageTrieWitness\n )\n override\n public\n onlyDuringPhase(TransitionPhase.POST_EXECUTION)\n contributesToFraudProof(preStateRoot, transactionHash)\n {\n require(\n ovmStateManager.commitContractStorage(_ovmContractAddress, _key) == true,\n \"Storage slot value wasn't changed or has already been committed.\"\n );\n\n Lib_OVMCodec.Account memory account = ovmStateManager.getAccount(_ovmContractAddress);\n bytes32 value = ovmStateManager.getContractStorage(_ovmContractAddress, _key);\n\n account.storageRoot = Lib_SecureMerkleTrie.update(\n abi.encodePacked(_key),\n Lib_RLPWriter.writeBytes(\n Lib_Bytes32Utils.removeLeadingZeros(value)\n ),\n _storageTrieWitness,\n account.storageRoot\n );\n\n ovmStateManager.putAccount(_ovmContractAddress, account);\n\n // Emit an event to help clients figure out the proof ordering.\n emit ContractStorageCommitted(\n _ovmContractAddress,\n _key\n );\n }\n\n\n /**********************************\n * Public Functions: Finalization *\n **********************************/\n\n /**\n * Finalizes the transition process.\n */\n function completeTransition()\n override\n public\n onlyDuringPhase(TransitionPhase.POST_EXECUTION)\n {\n require(\n ovmStateManager.getTotalUncommittedAccounts() == 0,\n \"All accounts must be committed before completing a transition.\"\n );\n\n require(\n ovmStateManager.getTotalUncommittedContractStorage() == 0,\n \"All storage must be committed before completing a transition.\"\n );\n\n phase = TransitionPhase.COMPLETE;\n }\n}\n" - }, - "contracts/optimistic-ethereum/libraries/trie/Lib_SecureMerkleTrie.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_MerkleTrie } from \"./Lib_MerkleTrie.sol\";\n\n/**\n * @title Lib_SecureMerkleTrie\n */\nlibrary Lib_SecureMerkleTrie {\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * @notice Verifies a proof that a given key/value pair is present in the\n * Merkle trie.\n * @param _key Key of the node to search for, as a hex string.\n * @param _value Value of the node to search for, as a hex string.\n * @param _proof Merkle trie inclusion proof for the desired node. Unlike\n * traditional Merkle trees, this proof is executed top-down and consists\n * of a list of RLP-encoded nodes that make a path down to the target node.\n * @param _root Known root of the Merkle trie. Used to verify that the\n * included proof is correctly constructed.\n * @return _verified `true` if the k/v pair exists in the trie, `false` otherwise.\n */\n function verifyInclusionProof(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n )\n internal\n pure\n returns (\n bool _verified\n )\n {\n bytes memory key = _getSecureKey(_key);\n return Lib_MerkleTrie.verifyInclusionProof(key, _value, _proof, _root);\n }\n\n /**\n * @notice Verifies a proof that a given key is *not* present in\n * the Merkle trie.\n * @param _key Key of the node to search for, as a hex string.\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\n * target node.\n * @param _root Known root of the Merkle trie. Used to verify that the\n * included proof is correctly constructed.\n * @return _verified `true` if the key is not present in the trie, `false` otherwise.\n */\n function verifyExclusionProof(\n bytes memory _key,\n bytes memory _proof,\n bytes32 _root\n )\n internal\n pure\n returns (\n bool _verified\n )\n {\n bytes memory key = _getSecureKey(_key);\n return Lib_MerkleTrie.verifyExclusionProof(key, _proof, _root);\n }\n\n /**\n * @notice Updates a Merkle trie and returns a new root hash.\n * @param _key Key of the node to update, as a hex string.\n * @param _value Value of the node to update, as a hex string.\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\n * target node. If the key exists, we can simply update the value.\n * Otherwise, we need to modify the trie to handle the new k/v pair.\n * @param _root Known root of the Merkle trie. Used to verify that the\n * included proof is correctly constructed.\n * @return _updatedRoot Root hash of the newly constructed trie.\n */\n function update(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n )\n internal\n pure\n returns (\n bytes32 _updatedRoot\n )\n {\n bytes memory key = _getSecureKey(_key);\n return Lib_MerkleTrie.update(key, _value, _proof, _root);\n }\n\n /**\n * @notice Retrieves the value associated with a given key.\n * @param _key Key to search for, as hex bytes.\n * @param _proof Merkle trie inclusion proof for the key.\n * @param _root Known root of the Merkle trie.\n * @return _exists Whether or not the key exists.\n * @return _value Value of the key if it exists.\n */\n function get(\n bytes memory _key,\n bytes memory _proof,\n bytes32 _root\n )\n internal\n pure\n returns (\n bool _exists,\n bytes memory _value\n )\n {\n bytes memory key = _getSecureKey(_key);\n return Lib_MerkleTrie.get(key, _proof, _root);\n }\n\n /**\n * Computes the root hash for a trie with a single node.\n * @param _key Key for the single node.\n * @param _value Value for the single node.\n * @return _updatedRoot Hash of the trie.\n */\n function getSingleNodeRootHash(\n bytes memory _key,\n bytes memory _value\n )\n internal\n pure\n returns (\n bytes32 _updatedRoot\n )\n {\n bytes memory key = _getSecureKey(_key);\n return Lib_MerkleTrie.getSingleNodeRootHash(key, _value);\n }\n\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * Computes the secure counterpart to a key.\n * @param _key Key to get a secure key from.\n * @return _secureKey Secure version of the key.\n */\n function _getSecureKey(\n bytes memory _key\n )\n private\n pure\n returns (\n bytes memory _secureKey\n )\n {\n return abi.encodePacked(keccak256(_key));\n }\n}" - }, - "contracts/optimistic-ethereum/iOVM/verification/iOVM_StateTransitioner.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/**\n * @title iOVM_StateTransitioner\n */\ninterface iOVM_StateTransitioner {\n\n /**********\n * Events *\n **********/\n\n event AccountCommitted(\n address _address\n );\n\n event ContractStorageCommitted(\n address _address,\n bytes32 _key\n );\n\n\n /**********************************\n * Public Functions: State Access *\n **********************************/\n\n function getPreStateRoot() external view returns (bytes32 _preStateRoot);\n function getPostStateRoot() external view returns (bytes32 _postStateRoot);\n function isComplete() external view returns (bool _complete);\n\n\n /***********************************\n * Public Functions: Pre-Execution *\n ***********************************/\n\n function proveContractState(\n address _ovmContractAddress,\n address _ethContractAddress,\n bytes calldata _stateTrieWitness\n ) external;\n\n function proveStorageSlot(\n address _ovmContractAddress,\n bytes32 _key,\n bytes calldata _storageTrieWitness\n ) external;\n\n\n /*******************************\n * Public Functions: Execution *\n *******************************/\n\n function applyTransaction(\n Lib_OVMCodec.Transaction calldata _transaction\n ) external;\n\n\n /************************************\n * Public Functions: Post-Execution *\n ************************************/\n\n function commitContractState(\n address _ovmContractAddress,\n bytes calldata _stateTrieWitness\n ) external;\n\n function commitStorageSlot(\n address _ovmContractAddress,\n bytes32 _key,\n bytes calldata _storageTrieWitness\n ) external;\n\n\n /**********************************\n * Public Functions: Finalization *\n **********************************/\n\n function completeTransition() external;\n}\n" - }, - "contracts/optimistic-ethereum/iOVM/verification/iOVM_BondManager.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\ninterface ERC20 {\n function transfer(address, uint256) external returns (bool);\n function transferFrom(address, address, uint256) external returns (bool);\n}\n\n/// All the errors which may be encountered on the bond manager\nlibrary Errors {\n string constant ERC20_ERR = \"BondManager: Could not post bond\";\n string constant ALREADY_FINALIZED = \"BondManager: Fraud proof for this pre-state root has already been finalized\";\n string constant SLASHED = \"BondManager: Cannot finalize withdrawal, you probably got slashed\";\n string constant WRONG_STATE = \"BondManager: Wrong bond state for proposer\";\n string constant CANNOT_CLAIM = \"BondManager: Cannot claim yet. Dispute must be finalized first\";\n\n string constant WITHDRAWAL_PENDING = \"BondManager: Withdrawal already pending\";\n string constant TOO_EARLY = \"BondManager: Too early to finalize your withdrawal\";\n\n string constant ONLY_TRANSITIONER = \"BondManager: Only the transitioner for this pre-state root may call this function\";\n string constant ONLY_FRAUD_VERIFIER = \"BondManager: Only the fraud verifier may call this function\";\n string constant ONLY_STATE_COMMITMENT_CHAIN = \"BondManager: Only the state commitment chain may call this function\";\n string constant WAIT_FOR_DISPUTES = \"BondManager: Wait for other potential disputes\";\n}\n\n/**\n * @title iOVM_BondManager\n */\ninterface iOVM_BondManager {\n\n /*******************\n * Data Structures *\n *******************/\n\n /// The lifecycle of a proposer's bond\n enum State {\n // Before depositing or after getting slashed, a user is uncollateralized\n NOT_COLLATERALIZED,\n // After depositing, a user is collateralized\n COLLATERALIZED,\n // After a user has initiated a withdrawal\n WITHDRAWING\n }\n\n /// A bond posted by a proposer\n struct Bond {\n // The user's state\n State state;\n // The timestamp at which a proposer issued their withdrawal request\n uint32 withdrawalTimestamp;\n // The time when the first disputed was initiated for this bond\n uint256 firstDisputeAt;\n // The earliest observed state root for this bond which has had fraud\n bytes32 earliestDisputedStateRoot;\n // The state root's timestamp\n uint256 earliestTimestamp;\n }\n\n // Per pre-state root, store the number of state provisions that were made\n // and how many of these calls were made by each user. Payouts will then be\n // claimed by users proportionally for that dispute.\n struct Rewards {\n // Flag to check if rewards for a fraud proof are claimable\n bool canClaim;\n // Total number of `recordGasSpent` calls made\n uint256 total;\n // The gas spent by each user to provide witness data. The sum of all\n // values inside this map MUST be equal to the value of `total`\n mapping(address => uint256) gasSpent;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n function recordGasSpent(\n bytes32 _preStateRoot,\n bytes32 _txHash,\n address _who,\n uint256 _gasSpent\n ) external;\n\n function finalize(\n bytes32 _preStateRoot,\n address _publisher,\n uint256 _timestamp\n ) external;\n\n function deposit() external;\n\n function startWithdrawal() external;\n\n function finalizeWithdrawal() external;\n\n function claim(\n address _who\n ) external;\n\n function isCollateralized(\n address _who\n ) external view returns (bool);\n\n function getGasSpent(\n bytes32 _preStateRoot,\n address _who\n ) external view returns (uint256);\n}\n" - }, - "contracts/optimistic-ethereum/iOVM/execution/iOVM_StateManagerFactory.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Contract Imports */\nimport { iOVM_StateManager } from \"./iOVM_StateManager.sol\";\n\n/**\n * @title iOVM_StateManagerFactory\n */\ninterface iOVM_StateManagerFactory {\n\n /***************************************\n * Public Functions: Contract Creation *\n ***************************************/\n\n function create(\n address _owner\n )\n external\n returns (\n iOVM_StateManager _ovmStateManager\n );\n}\n" - }, - "contracts/optimistic-ethereum/OVM/verification/OVM_FraudContributor.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.7.0;\n\nimport { iOVM_BondManager } from \"../../iOVM/verification/iOVM_BondManager.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/// Minimal contract to be inherited by contracts consumed by users that provide\n/// data for fraud proofs\nabstract contract OVM_FraudContributor is Lib_AddressResolver {\n /// Decorate your functions with this modifier to store how much total gas was\n /// consumed by the sender, to reward users fairly\n modifier contributesToFraudProof(bytes32 preStateRoot, bytes32 txHash) {\n uint256 startGas = gasleft();\n _;\n uint256 gasSpent = startGas - gasleft();\n iOVM_BondManager(resolve('OVM_BondManager')).recordGasSpent(preStateRoot, txHash, msg.sender, gasSpent);\n }\n}\n" - }, - "contracts/optimistic-ethereum/libraries/trie/Lib_MerkleTrie.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.7.0;\n\n/* Library Imports */\nimport { Lib_BytesUtils } from \"../utils/Lib_BytesUtils.sol\";\nimport { Lib_RLPReader } from \"../rlp/Lib_RLPReader.sol\";\nimport { Lib_RLPWriter } from \"../rlp/Lib_RLPWriter.sol\";\n\n/**\n * @title Lib_MerkleTrie\n */\nlibrary Lib_MerkleTrie {\n\n /*******************\n * Data Structures *\n *******************/\n\n enum NodeType {\n BranchNode,\n ExtensionNode,\n LeafNode\n }\n\n struct TrieNode {\n bytes encoded;\n Lib_RLPReader.RLPItem[] decoded;\n }\n\n\n /**********************\n * Contract Constants *\n **********************/\n\n // TREE_RADIX determines the number of elements per branch node.\n uint256 constant TREE_RADIX = 16;\n // Branch nodes have TREE_RADIX elements plus an additional `value` slot.\n uint256 constant BRANCH_NODE_LENGTH = TREE_RADIX + 1;\n // Leaf nodes and extension nodes always have two elements, a `path` and a `value`.\n uint256 constant LEAF_OR_EXTENSION_NODE_LENGTH = 2;\n\n // Prefixes are prepended to the `path` within a leaf or extension node and\n // allow us to differentiate between the two node types. `ODD` or `EVEN` is\n // determined by the number of nibbles within the unprefixed `path`. If the\n // number of nibbles if even, we need to insert an extra padding nibble so\n // the resulting prefixed `path` has an even number of nibbles.\n uint8 constant PREFIX_EXTENSION_EVEN = 0;\n uint8 constant PREFIX_EXTENSION_ODD = 1;\n uint8 constant PREFIX_LEAF_EVEN = 2;\n uint8 constant PREFIX_LEAF_ODD = 3;\n\n // Just a utility constant. RLP represents `NULL` as 0x80.\n bytes1 constant RLP_NULL = bytes1(0x80);\n bytes constant RLP_NULL_BYTES = hex'80';\n bytes32 constant internal KECCAK256_RLP_NULL_BYTES = keccak256(RLP_NULL_BYTES);\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * @notice Verifies a proof that a given key/value pair is present in the\n * Merkle trie.\n * @param _key Key of the node to search for, as a hex string.\n * @param _value Value of the node to search for, as a hex string.\n * @param _proof Merkle trie inclusion proof for the desired node. Unlike\n * traditional Merkle trees, this proof is executed top-down and consists\n * of a list of RLP-encoded nodes that make a path down to the target node.\n * @param _root Known root of the Merkle trie. Used to verify that the\n * included proof is correctly constructed.\n * @return _verified `true` if the k/v pair exists in the trie, `false` otherwise.\n */\n function verifyInclusionProof(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n )\n internal\n pure\n returns (\n bool _verified\n )\n {\n (\n bool exists,\n bytes memory value\n ) = get(_key, _proof, _root);\n\n return (\n exists && Lib_BytesUtils.equal(_value, value)\n );\n }\n\n /**\n * @notice Verifies a proof that a given key is *not* present in\n * the Merkle trie.\n * @param _key Key of the node to search for, as a hex string.\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\n * target node.\n * @param _root Known root of the Merkle trie. Used to verify that the\n * included proof is correctly constructed.\n * @return _verified `true` if the key is absent in the trie, `false` otherwise.\n */\n function verifyExclusionProof(\n bytes memory _key,\n bytes memory _proof,\n bytes32 _root\n )\n internal\n pure\n returns (\n bool _verified\n )\n {\n (\n bool exists,\n ) = get(_key, _proof, _root);\n\n return exists == false;\n }\n\n /**\n * @notice Updates a Merkle trie and returns a new root hash.\n * @param _key Key of the node to update, as a hex string.\n * @param _value Value of the node to update, as a hex string.\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\n * target node. If the key exists, we can simply update the value.\n * Otherwise, we need to modify the trie to handle the new k/v pair.\n * @param _root Known root of the Merkle trie. Used to verify that the\n * included proof is correctly constructed.\n * @return _updatedRoot Root hash of the newly constructed trie.\n */\n function update(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n )\n internal\n pure\n returns (\n bytes32 _updatedRoot\n )\n {\n // Special case when inserting the very first node.\n if (_root == KECCAK256_RLP_NULL_BYTES) {\n return getSingleNodeRootHash(_key, _value);\n }\n\n TrieNode[] memory proof = _parseProof(_proof);\n (uint256 pathLength, bytes memory keyRemainder, ) = _walkNodePath(proof, _key, _root);\n TrieNode[] memory newPath = _getNewPath(proof, pathLength, keyRemainder, _value);\n\n return _getUpdatedTrieRoot(newPath, _key);\n }\n\n /**\n * @notice Retrieves the value associated with a given key.\n * @param _key Key to search for, as hex bytes.\n * @param _proof Merkle trie inclusion proof for the key.\n * @param _root Known root of the Merkle trie.\n * @return _exists Whether or not the key exists.\n * @return _value Value of the key if it exists.\n */\n function get(\n bytes memory _key,\n bytes memory _proof,\n bytes32 _root\n )\n internal\n pure\n returns (\n bool _exists,\n bytes memory _value\n )\n {\n TrieNode[] memory proof = _parseProof(_proof);\n (uint256 pathLength, bytes memory keyRemainder, bool isFinalNode) = _walkNodePath(proof, _key, _root);\n\n bool exists = keyRemainder.length == 0;\n\n require(\n exists || isFinalNode,\n \"Provided proof is invalid.\"\n );\n\n bytes memory value = exists ? _getNodeValue(proof[pathLength - 1]) : bytes('');\n\n return (\n exists,\n value\n );\n }\n\n /**\n * Computes the root hash for a trie with a single node.\n * @param _key Key for the single node.\n * @param _value Value for the single node.\n * @return _updatedRoot Hash of the trie.\n */\n function getSingleNodeRootHash(\n bytes memory _key,\n bytes memory _value\n )\n internal\n pure\n returns (\n bytes32 _updatedRoot\n )\n {\n return keccak256(_makeLeafNode(\n Lib_BytesUtils.toNibbles(_key),\n _value\n ).encoded);\n }\n\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * @notice Walks through a proof using a provided key.\n * @param _proof Inclusion proof to walk through.\n * @param _key Key to use for the walk.\n * @param _root Known root of the trie.\n * @return _pathLength Length of the final path\n * @return _keyRemainder Portion of the key remaining after the walk.\n * @return _isFinalNode Whether or not we've hit a dead end.\n */\n function _walkNodePath(\n TrieNode[] memory _proof,\n bytes memory _key,\n bytes32 _root\n )\n private\n pure\n returns (\n uint256 _pathLength,\n bytes memory _keyRemainder,\n bool _isFinalNode\n )\n {\n uint256 pathLength = 0;\n bytes memory key = Lib_BytesUtils.toNibbles(_key);\n\n bytes32 currentNodeID = _root;\n uint256 currentKeyIndex = 0;\n uint256 currentKeyIncrement = 0;\n TrieNode memory currentNode;\n\n // Proof is top-down, so we start at the first element (root).\n for (uint256 i = 0; i < _proof.length; i++) {\n currentNode = _proof[i];\n currentKeyIndex += currentKeyIncrement;\n\n // Keep track of the proof elements we actually need.\n // It's expensive to resize arrays, so this simply reduces gas costs.\n pathLength += 1;\n\n if (currentKeyIndex == 0) {\n // First proof element is always the root node.\n require(\n keccak256(currentNode.encoded) == currentNodeID,\n \"Invalid root hash\"\n );\n } else if (currentNode.encoded.length >= 32) {\n // Nodes 32 bytes or larger are hashed inside branch nodes.\n require(\n keccak256(currentNode.encoded) == currentNodeID,\n \"Invalid large internal hash\"\n );\n } else {\n // Nodes smaller than 31 bytes aren't hashed.\n require(\n Lib_BytesUtils.toBytes32(currentNode.encoded) == currentNodeID,\n \"Invalid internal node hash\"\n );\n }\n\n if (currentNode.decoded.length == BRANCH_NODE_LENGTH) {\n if (currentKeyIndex == key.length) {\n // We've hit the end of the key, meaning the value should be within this branch node.\n break;\n } else {\n // We're not at the end of the key yet.\n // Figure out what the next node ID should be and continue.\n uint8 branchKey = uint8(key[currentKeyIndex]);\n Lib_RLPReader.RLPItem memory nextNode = currentNode.decoded[branchKey];\n currentNodeID = _getNodeID(nextNode);\n currentKeyIncrement = 1;\n continue;\n }\n } else if (currentNode.decoded.length == LEAF_OR_EXTENSION_NODE_LENGTH) {\n bytes memory path = _getNodePath(currentNode);\n uint8 prefix = uint8(path[0]);\n uint8 offset = 2 - prefix % 2;\n bytes memory pathRemainder = Lib_BytesUtils.slice(path, offset);\n bytes memory keyRemainder = Lib_BytesUtils.slice(key, currentKeyIndex);\n uint256 sharedNibbleLength = _getSharedNibbleLength(pathRemainder, keyRemainder);\n\n if (prefix == PREFIX_LEAF_EVEN || prefix == PREFIX_LEAF_ODD) {\n if (\n pathRemainder.length == sharedNibbleLength &&\n keyRemainder.length == sharedNibbleLength\n ) {\n // The key within this leaf matches our key exactly.\n // Increment the key index to reflect that we have no remainder.\n currentKeyIndex += sharedNibbleLength;\n }\n\n // We've hit a leaf node, so our next node should be NULL.\n currentNodeID = bytes32(RLP_NULL);\n break;\n } else if (prefix == PREFIX_EXTENSION_EVEN || prefix == PREFIX_EXTENSION_ODD) {\n if (sharedNibbleLength == 0) {\n // Our extension node doesn't share any part of our key.\n // We've hit the end of this path, updates will need to modify this extension.\n currentNodeID = bytes32(RLP_NULL);\n break;\n } else {\n // Our extension shares some nibbles.\n // Carry on to the next node.\n currentNodeID = _getNodeID(currentNode.decoded[1]);\n currentKeyIncrement = sharedNibbleLength;\n continue;\n }\n } else {\n revert(\"Received a node with an unknown prefix\");\n }\n } else {\n revert(\"Received an unparseable node.\");\n }\n }\n\n // If our node ID is NULL, then we're at a dead end.\n bool isFinalNode = currentNodeID == bytes32(RLP_NULL);\n return (pathLength, Lib_BytesUtils.slice(key, currentKeyIndex), isFinalNode);\n }\n\n /**\n * @notice Creates new nodes to support a k/v pair insertion into a given\n * Merkle trie path.\n * @param _path Path to the node nearest the k/v pair.\n * @param _pathLength Length of the path. Necessary because the provided\n * path may include additional nodes (e.g., it comes directly from a proof)\n * and we can't resize in-memory arrays without costly duplication.\n * @param _keyRemainder Portion of the initial key that must be inserted\n * into the trie.\n * @param _value Value to insert at the given key.\n * @return _newPath A new path with the inserted k/v pair and extra supporting nodes.\n */\n function _getNewPath(\n TrieNode[] memory _path,\n uint256 _pathLength,\n bytes memory _keyRemainder,\n bytes memory _value\n )\n private\n pure\n returns (\n TrieNode[] memory _newPath\n )\n {\n bytes memory keyRemainder = _keyRemainder;\n\n // Most of our logic depends on the status of the last node in the path.\n TrieNode memory lastNode = _path[_pathLength - 1];\n NodeType lastNodeType = _getNodeType(lastNode);\n\n // Create an array for newly created nodes.\n // We need up to three new nodes, depending on the contents of the last node.\n // Since array resizing is expensive, we'll keep track of the size manually.\n // We're using an explicit `totalNewNodes += 1` after insertions for clarity.\n TrieNode[] memory newNodes = new TrieNode[](3);\n uint256 totalNewNodes = 0;\n\n if (keyRemainder.length == 0 && lastNodeType == NodeType.LeafNode) {\n // We've found a leaf node with the given key.\n // Simply need to update the value of the node to match.\n newNodes[totalNewNodes] = _makeLeafNode(_getNodeKey(lastNode), _value);\n totalNewNodes += 1;\n } else if (lastNodeType == NodeType.BranchNode) {\n if (keyRemainder.length == 0) {\n // We've found a branch node with the given key.\n // Simply need to update the value of the node to match.\n newNodes[totalNewNodes] = _editBranchValue(lastNode, _value);\n totalNewNodes += 1;\n } else {\n // We've found a branch node, but it doesn't contain our key.\n // Reinsert the old branch for now.\n newNodes[totalNewNodes] = lastNode;\n totalNewNodes += 1;\n // Create a new leaf node, slicing our remainder since the first byte points\n // to our branch node.\n newNodes[totalNewNodes] = _makeLeafNode(Lib_BytesUtils.slice(keyRemainder, 1), _value);\n totalNewNodes += 1;\n }\n } else {\n // Our last node is either an extension node or a leaf node with a different key.\n bytes memory lastNodeKey = _getNodeKey(lastNode);\n uint256 sharedNibbleLength = _getSharedNibbleLength(lastNodeKey, keyRemainder);\n\n if (sharedNibbleLength != 0) {\n // We've got some shared nibbles between the last node and our key remainder.\n // We'll need to insert an extension node that covers these shared nibbles.\n bytes memory nextNodeKey = Lib_BytesUtils.slice(lastNodeKey, 0, sharedNibbleLength);\n newNodes[totalNewNodes] = _makeExtensionNode(nextNodeKey, _getNodeHash(_value));\n totalNewNodes += 1;\n\n // Cut down the keys since we've just covered these shared nibbles.\n lastNodeKey = Lib_BytesUtils.slice(lastNodeKey, sharedNibbleLength);\n keyRemainder = Lib_BytesUtils.slice(keyRemainder, sharedNibbleLength);\n }\n\n // Create an empty branch to fill in.\n TrieNode memory newBranch = _makeEmptyBranchNode();\n\n if (lastNodeKey.length == 0) {\n // Key remainder was larger than the key for our last node.\n // The value within our last node is therefore going to be shifted into\n // a branch value slot.\n newBranch = _editBranchValue(newBranch, _getNodeValue(lastNode));\n } else {\n // Last node key was larger than the key remainder.\n // We're going to modify some index of our branch.\n uint8 branchKey = uint8(lastNodeKey[0]);\n // Move on to the next nibble.\n lastNodeKey = Lib_BytesUtils.slice(lastNodeKey, 1);\n\n if (lastNodeType == NodeType.LeafNode) {\n // We're dealing with a leaf node.\n // We'll modify the key and insert the old leaf node into the branch index.\n TrieNode memory modifiedLastNode = _makeLeafNode(lastNodeKey, _getNodeValue(lastNode));\n newBranch = _editBranchIndex(newBranch, branchKey, _getNodeHash(modifiedLastNode.encoded));\n } else if (lastNodeKey.length != 0) {\n // We're dealing with a shrinking extension node.\n // We need to modify the node to decrease the size of the key.\n TrieNode memory modifiedLastNode = _makeExtensionNode(lastNodeKey, _getNodeValue(lastNode));\n newBranch = _editBranchIndex(newBranch, branchKey, _getNodeHash(modifiedLastNode.encoded));\n } else {\n // We're dealing with an unnecessary extension node.\n // We're going to delete the node entirely.\n // Simply insert its current value into the branch index.\n newBranch = _editBranchIndex(newBranch, branchKey, _getNodeValue(lastNode));\n }\n }\n\n if (keyRemainder.length == 0) {\n // We've got nothing left in the key remainder.\n // Simply insert the value into the branch value slot.\n newBranch = _editBranchValue(newBranch, _value);\n // Push the branch into the list of new nodes.\n newNodes[totalNewNodes] = newBranch;\n totalNewNodes += 1;\n } else {\n // We've got some key remainder to work with.\n // We'll be inserting a leaf node into the trie.\n // First, move on to the next nibble.\n keyRemainder = Lib_BytesUtils.slice(keyRemainder, 1);\n // Push the branch into the list of new nodes.\n newNodes[totalNewNodes] = newBranch;\n totalNewNodes += 1;\n // Push a new leaf node for our k/v pair.\n newNodes[totalNewNodes] = _makeLeafNode(keyRemainder, _value);\n totalNewNodes += 1;\n }\n }\n\n // Finally, join the old path with our newly created nodes.\n // Since we're overwriting the last node in the path, we use `_pathLength - 1`.\n return _joinNodeArrays(_path, _pathLength - 1, newNodes, totalNewNodes);\n }\n\n /**\n * @notice Computes the trie root from a given path.\n * @param _nodes Path to some k/v pair.\n * @param _key Key for the k/v pair.\n * @return _updatedRoot Root hash for the updated trie.\n */\n function _getUpdatedTrieRoot(\n TrieNode[] memory _nodes,\n bytes memory _key\n )\n private\n pure\n returns (\n bytes32 _updatedRoot\n )\n {\n bytes memory key = Lib_BytesUtils.toNibbles(_key);\n\n // Some variables to keep track of during iteration.\n TrieNode memory currentNode;\n NodeType currentNodeType;\n bytes memory previousNodeHash;\n\n // Run through the path backwards to rebuild our root hash.\n for (uint256 i = _nodes.length; i > 0; i--) {\n // Pick out the current node.\n currentNode = _nodes[i - 1];\n currentNodeType = _getNodeType(currentNode);\n\n if (currentNodeType == NodeType.LeafNode) {\n // Leaf nodes are already correctly encoded.\n // Shift the key over to account for the nodes key.\n bytes memory nodeKey = _getNodeKey(currentNode);\n key = Lib_BytesUtils.slice(key, 0, key.length - nodeKey.length);\n } else if (currentNodeType == NodeType.ExtensionNode) {\n // Shift the key over to account for the nodes key.\n bytes memory nodeKey = _getNodeKey(currentNode);\n key = Lib_BytesUtils.slice(key, 0, key.length - nodeKey.length);\n\n // If this node is the last element in the path, it'll be correctly encoded\n // and we can skip this part.\n if (previousNodeHash.length > 0) {\n // Re-encode the node based on the previous node.\n currentNode = _makeExtensionNode(nodeKey, previousNodeHash);\n }\n } else if (currentNodeType == NodeType.BranchNode) {\n // If this node is the last element in the path, it'll be correctly encoded\n // and we can skip this part.\n if (previousNodeHash.length > 0) {\n // Re-encode the node based on the previous node.\n uint8 branchKey = uint8(key[key.length - 1]);\n key = Lib_BytesUtils.slice(key, 0, key.length - 1);\n currentNode = _editBranchIndex(currentNode, branchKey, previousNodeHash);\n }\n }\n\n // Compute the node hash for the next iteration.\n previousNodeHash = _getNodeHash(currentNode.encoded);\n }\n\n // Current node should be the root at this point.\n // Simply return the hash of its encoding.\n return keccak256(currentNode.encoded);\n }\n\n /**\n * @notice Parses an RLP-encoded proof into something more useful.\n * @param _proof RLP-encoded proof to parse.\n * @return _parsed Proof parsed into easily accessible structs.\n */\n function _parseProof(\n bytes memory _proof\n )\n private\n pure\n returns (\n TrieNode[] memory _parsed\n )\n {\n Lib_RLPReader.RLPItem[] memory nodes = Lib_RLPReader.readList(_proof);\n TrieNode[] memory proof = new TrieNode[](nodes.length);\n\n for (uint256 i = 0; i < nodes.length; i++) {\n bytes memory encoded = Lib_RLPReader.readBytes(nodes[i]);\n proof[i] = TrieNode({\n encoded: encoded,\n decoded: Lib_RLPReader.readList(encoded)\n });\n }\n\n return proof;\n }\n\n /**\n * @notice Picks out the ID for a node. Node ID is referred to as the\n * \"hash\" within the specification, but nodes < 32 bytes are not actually\n * hashed.\n * @param _node Node to pull an ID for.\n * @return _nodeID ID for the node, depending on the size of its contents.\n */\n function _getNodeID(\n Lib_RLPReader.RLPItem memory _node\n )\n private\n pure\n returns (\n bytes32 _nodeID\n )\n {\n bytes memory nodeID;\n\n if (_node.length < 32) {\n // Nodes smaller than 32 bytes are RLP encoded.\n nodeID = Lib_RLPReader.readRawBytes(_node);\n } else {\n // Nodes 32 bytes or larger are hashed.\n nodeID = Lib_RLPReader.readBytes(_node);\n }\n\n return Lib_BytesUtils.toBytes32(nodeID);\n }\n\n /**\n * @notice Gets the path for a leaf or extension node.\n * @param _node Node to get a path for.\n * @return _path Node path, converted to an array of nibbles.\n */\n function _getNodePath(\n TrieNode memory _node\n )\n private\n pure\n returns (\n bytes memory _path\n )\n {\n return Lib_BytesUtils.toNibbles(Lib_RLPReader.readBytes(_node.decoded[0]));\n }\n\n /**\n * @notice Gets the key for a leaf or extension node. Keys are essentially\n * just paths without any prefix.\n * @param _node Node to get a key for.\n * @return _key Node key, converted to an array of nibbles.\n */\n function _getNodeKey(\n TrieNode memory _node\n )\n private\n pure\n returns (\n bytes memory _key\n )\n {\n return _removeHexPrefix(_getNodePath(_node));\n }\n\n /**\n * @notice Gets the path for a node.\n * @param _node Node to get a value for.\n * @return _value Node value, as hex bytes.\n */\n function _getNodeValue(\n TrieNode memory _node\n )\n private\n pure\n returns (\n bytes memory _value\n )\n {\n return Lib_RLPReader.readBytes(_node.decoded[_node.decoded.length - 1]);\n }\n\n /**\n * @notice Computes the node hash for an encoded node. Nodes < 32 bytes\n * are not hashed, all others are keccak256 hashed.\n * @param _encoded Encoded node to hash.\n * @return _hash Hash of the encoded node. Simply the input if < 32 bytes.\n */\n function _getNodeHash(\n bytes memory _encoded\n )\n private\n pure\n returns (\n bytes memory _hash\n )\n {\n if (_encoded.length < 32) {\n return _encoded;\n } else {\n return abi.encodePacked(keccak256(_encoded));\n }\n }\n\n /**\n * @notice Determines the type for a given node.\n * @param _node Node to determine a type for.\n * @return _type Type of the node; BranchNode/ExtensionNode/LeafNode.\n */\n function _getNodeType(\n TrieNode memory _node\n )\n private\n pure\n returns (\n NodeType _type\n )\n {\n if (_node.decoded.length == BRANCH_NODE_LENGTH) {\n return NodeType.BranchNode;\n } else if (_node.decoded.length == LEAF_OR_EXTENSION_NODE_LENGTH) {\n bytes memory path = _getNodePath(_node);\n uint8 prefix = uint8(path[0]);\n\n if (prefix == PREFIX_LEAF_EVEN || prefix == PREFIX_LEAF_ODD) {\n return NodeType.LeafNode;\n } else if (prefix == PREFIX_EXTENSION_EVEN || prefix == PREFIX_EXTENSION_ODD) {\n return NodeType.ExtensionNode;\n }\n }\n\n revert(\"Invalid node type\");\n }\n\n /**\n * @notice Utility; determines the number of nibbles shared between two\n * nibble arrays.\n * @param _a First nibble array.\n * @param _b Second nibble array.\n * @return _shared Number of shared nibbles.\n */\n function _getSharedNibbleLength(\n bytes memory _a,\n bytes memory _b\n )\n private\n pure\n returns (\n uint256 _shared\n )\n {\n uint256 i = 0;\n while (_a.length > i && _b.length > i && _a[i] == _b[i]) {\n i++;\n }\n return i;\n }\n\n /**\n * @notice Utility; converts an RLP-encoded node into our nice struct.\n * @param _raw RLP-encoded node to convert.\n * @return _node Node as a TrieNode struct.\n */\n function _makeNode(\n bytes[] memory _raw\n )\n private\n pure\n returns (\n TrieNode memory _node\n )\n {\n bytes memory encoded = Lib_RLPWriter.writeList(_raw);\n\n return TrieNode({\n encoded: encoded,\n decoded: Lib_RLPReader.readList(encoded)\n });\n }\n\n /**\n * @notice Utility; converts an RLP-decoded node into our nice struct.\n * @param _items RLP-decoded node to convert.\n * @return _node Node as a TrieNode struct.\n */\n function _makeNode(\n Lib_RLPReader.RLPItem[] memory _items\n )\n private\n pure\n returns (\n TrieNode memory _node\n )\n {\n bytes[] memory raw = new bytes[](_items.length);\n for (uint256 i = 0; i < _items.length; i++) {\n raw[i] = Lib_RLPReader.readRawBytes(_items[i]);\n }\n return _makeNode(raw);\n }\n\n /**\n * @notice Creates a new extension node.\n * @param _key Key for the extension node, unprefixed.\n * @param _value Value for the extension node.\n * @return _node New extension node with the given k/v pair.\n */\n function _makeExtensionNode(\n bytes memory _key,\n bytes memory _value\n )\n private\n pure\n returns (\n TrieNode memory _node\n )\n {\n bytes[] memory raw = new bytes[](2);\n bytes memory key = _addHexPrefix(_key, false);\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\n raw[1] = Lib_RLPWriter.writeBytes(_value);\n return _makeNode(raw);\n }\n\n /**\n * @notice Creates a new leaf node.\n * @dev This function is essentially identical to `_makeExtensionNode`.\n * Although we could route both to a single method with a flag, it's\n * more gas efficient to keep them separate and duplicate the logic.\n * @param _key Key for the leaf node, unprefixed.\n * @param _value Value for the leaf node.\n * @return _node New leaf node with the given k/v pair.\n */\n function _makeLeafNode(\n bytes memory _key,\n bytes memory _value\n )\n private\n pure\n returns (\n TrieNode memory _node\n )\n {\n bytes[] memory raw = new bytes[](2);\n bytes memory key = _addHexPrefix(_key, true);\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\n raw[1] = Lib_RLPWriter.writeBytes(_value);\n return _makeNode(raw);\n }\n\n /**\n * @notice Creates an empty branch node.\n * @return _node Empty branch node as a TrieNode struct.\n */\n function _makeEmptyBranchNode()\n private\n pure\n returns (\n TrieNode memory _node\n )\n {\n bytes[] memory raw = new bytes[](BRANCH_NODE_LENGTH);\n for (uint256 i = 0; i < raw.length; i++) {\n raw[i] = RLP_NULL_BYTES;\n }\n return _makeNode(raw);\n }\n\n /**\n * @notice Modifies the value slot for a given branch.\n * @param _branch Branch node to modify.\n * @param _value Value to insert into the branch.\n * @return _updatedNode Modified branch node.\n */\n function _editBranchValue(\n TrieNode memory _branch,\n bytes memory _value\n )\n private\n pure\n returns (\n TrieNode memory _updatedNode\n )\n {\n bytes memory encoded = Lib_RLPWriter.writeBytes(_value);\n _branch.decoded[_branch.decoded.length - 1] = Lib_RLPReader.toRLPItem(encoded);\n return _makeNode(_branch.decoded);\n }\n\n /**\n * @notice Modifies a slot at an index for a given branch.\n * @param _branch Branch node to modify.\n * @param _index Slot index to modify.\n * @param _value Value to insert into the slot.\n * @return _updatedNode Modified branch node.\n */\n function _editBranchIndex(\n TrieNode memory _branch,\n uint8 _index,\n bytes memory _value\n )\n private\n pure\n returns (\n TrieNode memory _updatedNode\n )\n {\n bytes memory encoded = _value.length < 32 ? _value : Lib_RLPWriter.writeBytes(_value);\n _branch.decoded[_index] = Lib_RLPReader.toRLPItem(encoded);\n return _makeNode(_branch.decoded);\n }\n\n /**\n * @notice Utility; adds a prefix to a key.\n * @param _key Key to prefix.\n * @param _isLeaf Whether or not the key belongs to a leaf.\n * @return _prefixedKey Prefixed key.\n */\n function _addHexPrefix(\n bytes memory _key,\n bool _isLeaf\n )\n private\n pure\n returns (\n bytes memory _prefixedKey\n )\n {\n uint8 prefix = _isLeaf ? uint8(0x02) : uint8(0x00);\n uint8 offset = uint8(_key.length % 2);\n bytes memory prefixed = new bytes(2 - offset);\n prefixed[0] = bytes1(prefix + offset);\n return Lib_BytesUtils.concat(prefixed, _key);\n }\n\n /**\n * @notice Utility; removes a prefix from a path.\n * @param _path Path to remove the prefix from.\n * @return _unprefixedKey Unprefixed key.\n */\n function _removeHexPrefix(\n bytes memory _path\n )\n private\n pure\n returns (\n bytes memory _unprefixedKey\n )\n {\n if (uint8(_path[0]) % 2 == 0) {\n return Lib_BytesUtils.slice(_path, 2);\n } else {\n return Lib_BytesUtils.slice(_path, 1);\n }\n }\n\n /**\n * @notice Utility; combines two node arrays. Array lengths are required\n * because the actual lengths may be longer than the filled lengths.\n * Array resizing is extremely costly and should be avoided.\n * @param _a First array to join.\n * @param _aLength Length of the first array.\n * @param _b Second array to join.\n * @param _bLength Length of the second array.\n * @return _joined Combined node array.\n */\n function _joinNodeArrays(\n TrieNode[] memory _a,\n uint256 _aLength,\n TrieNode[] memory _b,\n uint256 _bLength\n )\n private\n pure\n returns (\n TrieNode[] memory _joined\n )\n {\n TrieNode[] memory ret = new TrieNode[](_aLength + _bLength);\n\n // Copy elements from the first array.\n for (uint256 i = 0; i < _aLength; i++) {\n ret[i] = _a[i];\n }\n\n // Copy elements from the second array.\n for (uint256 i = 0; i < _bLength; i++) {\n ret[i + _aLength] = _b[i];\n }\n\n return ret;\n }\n}\n" - }, - "contracts/optimistic-ethereum/OVM/verification/OVM_StateTransitionerFactory.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.7.0;\n\n/* Library Imports */\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/* Interface Imports */\nimport { iOVM_StateTransitioner } from \"../../iOVM/verification/iOVM_StateTransitioner.sol\";\nimport { iOVM_StateTransitionerFactory } from \"../../iOVM/verification/iOVM_StateTransitionerFactory.sol\";\nimport { iOVM_FraudVerifier } from \"../../iOVM/verification/iOVM_FraudVerifier.sol\";\n\n/* Contract Imports */\nimport { OVM_StateTransitioner } from \"./OVM_StateTransitioner.sol\";\n\n/**\n * @title OVM_StateTransitionerFactory\n */\ncontract OVM_StateTransitionerFactory is iOVM_StateTransitionerFactory, Lib_AddressResolver {\n\n constructor( address _libAddressManager)\n Lib_AddressResolver(_libAddressManager){}\n\n /***************************************\n * Public Functions: Contract Creation *\n ***************************************/\n\n /**\n * Creates a new OVM_StateTransitioner\n * @param _libAddressManager Address of the Address Manager.\n * @param _stateTransitionIndex Index of the state transition being verified.\n * @param _preStateRoot State root before the transition was executed.\n * @param _transactionHash Hash of the executed transaction.\n * @return _ovmStateTransitioner New OVM_StateTransitioner instance.\n */\n function create(\n address _libAddressManager,\n uint256 _stateTransitionIndex,\n bytes32 _preStateRoot,\n bytes32 _transactionHash\n )\n override\n public\n returns (\n iOVM_StateTransitioner _ovmStateTransitioner\n )\n {\n require(\n msg.sender == resolve(\"OVM_FraudVerifier\"),\n \"Create can only be done by the OVM_FraudVerifier.\"\n );\n return new OVM_StateTransitioner(\n _libAddressManager,\n _stateTransitionIndex,\n _preStateRoot,\n _transactionHash\n );\n }\n}\n" - }, - "contracts/optimistic-ethereum/iOVM/verification/iOVM_StateTransitionerFactory.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Contract Imports */\nimport { iOVM_StateTransitioner } from \"./iOVM_StateTransitioner.sol\";\n\n/**\n * @title iOVM_StateTransitionerFactory\n */\ninterface iOVM_StateTransitionerFactory {\n\n /***************************************\n * Public Functions: Contract Creation *\n ***************************************/\n\n function create(\n address _proxyManager,\n uint256 _stateTransitionIndex,\n bytes32 _preStateRoot,\n bytes32 _transactionHash\n )\n external\n returns (\n iOVM_StateTransitioner _ovmStateTransitioner\n );\n}\n" - }, - "contracts/optimistic-ethereum/iOVM/verification/iOVM_FraudVerifier.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/* Interface Imports */\nimport { iOVM_StateTransitioner } from \"./iOVM_StateTransitioner.sol\";\n\n/**\n * @title iOVM_FraudVerifier\n */\ninterface iOVM_FraudVerifier {\n\n /**********\n * Events *\n **********/\n\n event FraudProofInitialized(\n bytes32 _preStateRoot,\n uint256 _preStateRootIndex,\n bytes32 _transactionHash,\n address _who\n );\n\n event FraudProofFinalized(\n bytes32 _preStateRoot,\n uint256 _preStateRootIndex,\n bytes32 _transactionHash,\n address _who\n );\n\n\n /***************************************\n * Public Functions: Transition Status *\n ***************************************/\n\n function getStateTransitioner(bytes32 _preStateRoot, bytes32 _txHash) external view returns (iOVM_StateTransitioner _transitioner);\n\n\n /****************************************\n * Public Functions: Fraud Verification *\n ****************************************/\n\n function initializeFraudVerification(\n bytes32 _preStateRoot,\n Lib_OVMCodec.ChainBatchHeader calldata _preStateRootBatchHeader,\n Lib_OVMCodec.ChainInclusionProof calldata _preStateRootProof,\n Lib_OVMCodec.Transaction calldata _transaction,\n Lib_OVMCodec.TransactionChainElement calldata _txChainElement,\n Lib_OVMCodec.ChainBatchHeader calldata _transactionBatchHeader,\n Lib_OVMCodec.ChainInclusionProof calldata _transactionProof\n ) external;\n\n function finalizeFraudVerification(\n bytes32 _preStateRoot,\n Lib_OVMCodec.ChainBatchHeader calldata _preStateRootBatchHeader,\n Lib_OVMCodec.ChainInclusionProof calldata _preStateRootProof,\n bytes32 _txHash,\n bytes32 _postStateRoot,\n Lib_OVMCodec.ChainBatchHeader calldata _postStateRootBatchHeader,\n Lib_OVMCodec.ChainInclusionProof calldata _postStateRootProof\n ) external;\n}\n" - }, - "contracts/optimistic-ethereum/OVM/verification/OVM_FraudVerifier.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.7.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/* Interface Imports */\nimport { iOVM_FraudVerifier } from \"../../iOVM/verification/iOVM_FraudVerifier.sol\";\nimport { iOVM_StateTransitioner } from \"../../iOVM/verification/iOVM_StateTransitioner.sol\";\nimport { iOVM_StateTransitionerFactory } from \"../../iOVM/verification/iOVM_StateTransitionerFactory.sol\";\nimport { iOVM_BondManager } from \"../../iOVM/verification/iOVM_BondManager.sol\";\nimport { iOVM_StateCommitmentChain } from \"../../iOVM/chain/iOVM_StateCommitmentChain.sol\";\nimport { iOVM_CanonicalTransactionChain } from \"../../iOVM/chain/iOVM_CanonicalTransactionChain.sol\";\n\n/* Contract Imports */\nimport { OVM_FraudContributor } from \"./OVM_FraudContributor.sol\";\n\ncontract OVM_FraudVerifier is Lib_AddressResolver, OVM_FraudContributor, iOVM_FraudVerifier {\n\n /*******************************************\n * Contract Variables: Internal Accounting *\n *******************************************/\n\n mapping (bytes32 => iOVM_StateTransitioner) internal transitioners;\n\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n constructor(\n address _libAddressManager\n )\n Lib_AddressResolver(_libAddressManager)\n {}\n\n\n /***************************************\n * Public Functions: Transition Status *\n ***************************************/\n\n /**\n * Retrieves the state transitioner for a given root.\n * @param _preStateRoot State root to query a transitioner for.\n * @return _transitioner Corresponding state transitioner contract.\n */\n function getStateTransitioner(\n bytes32 _preStateRoot,\n bytes32 _txHash\n )\n override\n public\n view\n returns (\n iOVM_StateTransitioner _transitioner\n )\n {\n return transitioners[keccak256(abi.encodePacked(_preStateRoot, _txHash))];\n }\n\n\n /****************************************\n * Public Functions: Fraud Verification *\n ****************************************/\n\n /**\n * Begins the fraud verification process.\n * @param _preStateRoot State root before the fraudulent transaction.\n * @param _preStateRootBatchHeader Batch header for the provided pre-state root.\n * @param _preStateRootProof Inclusion proof for the provided pre-state root.\n * @param _transaction OVM transaction claimed to be fraudulent.\n * @param _txChainElement OVM transaction chain element.\n * @param _transactionBatchHeader Batch header for the provided transaction.\n * @param _transactionProof Inclusion proof for the provided transaction.\n */\n function initializeFraudVerification(\n bytes32 _preStateRoot,\n Lib_OVMCodec.ChainBatchHeader memory _preStateRootBatchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _preStateRootProof,\n Lib_OVMCodec.Transaction memory _transaction,\n Lib_OVMCodec.TransactionChainElement memory _txChainElement,\n Lib_OVMCodec.ChainBatchHeader memory _transactionBatchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _transactionProof\n )\n override\n public\n contributesToFraudProof(_preStateRoot, Lib_OVMCodec.hashTransaction(_transaction))\n {\n bytes32 _txHash = Lib_OVMCodec.hashTransaction(_transaction);\n\n if (_hasStateTransitioner(_preStateRoot, _txHash)) {\n return;\n }\n\n iOVM_StateCommitmentChain ovmStateCommitmentChain = iOVM_StateCommitmentChain(resolve(\"OVM_StateCommitmentChain\"));\n iOVM_CanonicalTransactionChain ovmCanonicalTransactionChain = iOVM_CanonicalTransactionChain(resolve(\"OVM_CanonicalTransactionChain\"));\n\n require(\n ovmStateCommitmentChain.verifyStateCommitment(\n _preStateRoot,\n _preStateRootBatchHeader,\n _preStateRootProof\n ),\n \"Invalid pre-state root inclusion proof.\"\n );\n\n require(\n ovmCanonicalTransactionChain.verifyTransaction(\n _transaction,\n _txChainElement,\n _transactionBatchHeader,\n _transactionProof\n ),\n \"Invalid transaction inclusion proof.\"\n );\n\n require (\n _preStateRootBatchHeader.prevTotalElements + _preStateRootProof.index + 1 == _transactionBatchHeader.prevTotalElements + _transactionProof.index,\n \"Pre-state root global index must equal to the transaction root global index.\"\n );\n\n _deployTransitioner(_preStateRoot, _txHash, _preStateRootProof.index);\n\n emit FraudProofInitialized(\n _preStateRoot,\n _preStateRootProof.index,\n _txHash,\n msg.sender\n );\n }\n\n /**\n * Finalizes the fraud verification process.\n * @param _preStateRoot State root before the fraudulent transaction.\n * @param _preStateRootBatchHeader Batch header for the provided pre-state root.\n * @param _preStateRootProof Inclusion proof for the provided pre-state root.\n * @param _txHash The transaction for the state root\n * @param _postStateRoot State root after the fraudulent transaction.\n * @param _postStateRootBatchHeader Batch header for the provided post-state root.\n * @param _postStateRootProof Inclusion proof for the provided post-state root.\n */\n function finalizeFraudVerification(\n bytes32 _preStateRoot,\n Lib_OVMCodec.ChainBatchHeader memory _preStateRootBatchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _preStateRootProof,\n bytes32 _txHash,\n bytes32 _postStateRoot,\n Lib_OVMCodec.ChainBatchHeader memory _postStateRootBatchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _postStateRootProof\n )\n override\n public\n contributesToFraudProof(_preStateRoot, _txHash)\n {\n iOVM_StateTransitioner transitioner = getStateTransitioner(_preStateRoot, _txHash);\n iOVM_StateCommitmentChain ovmStateCommitmentChain = iOVM_StateCommitmentChain(resolve(\"OVM_StateCommitmentChain\"));\n iOVM_BondManager ovmBondManager = iOVM_BondManager(resolve(\"OVM_BondManager\"));\n\n require(\n transitioner.isComplete() == true,\n \"State transition process must be completed prior to finalization.\"\n );\n\n require (\n _postStateRootBatchHeader.prevTotalElements + _postStateRootProof.index == _preStateRootBatchHeader.prevTotalElements + _preStateRootProof.index + 1,\n \"Post-state root global index must equal to the pre state root global index plus one.\"\n );\n\n require(\n ovmStateCommitmentChain.verifyStateCommitment(\n _preStateRoot,\n _preStateRootBatchHeader,\n _preStateRootProof\n ),\n \"Invalid pre-state root inclusion proof.\"\n );\n\n require(\n ovmStateCommitmentChain.verifyStateCommitment(\n _postStateRoot,\n _postStateRootBatchHeader,\n _postStateRootProof\n ),\n \"Invalid post-state root inclusion proof.\"\n );\n\n // If the post state root did not match, then there was fraud and we should delete the batch\n require(\n _postStateRoot != transitioner.getPostStateRoot(),\n \"State transition has not been proven fraudulent.\"\n );\n \n _cancelStateTransition(_postStateRootBatchHeader, _preStateRoot);\n\n // TEMPORARY: Remove the transitioner; for minnet.\n transitioners[keccak256(abi.encodePacked(_preStateRoot, _txHash))] = iOVM_StateTransitioner(0x0000000000000000000000000000000000000000);\n\n emit FraudProofFinalized(\n _preStateRoot,\n _preStateRootProof.index,\n _txHash,\n msg.sender\n );\n }\n\n\n /************************************\n * Internal Functions: Verification *\n ************************************/\n\n /**\n * Checks whether a transitioner already exists for a given pre-state root.\n * @param _preStateRoot Pre-state root to check.\n * @return _exists Whether or not we already have a transitioner for the root.\n */\n function _hasStateTransitioner(\n bytes32 _preStateRoot,\n bytes32 _txHash\n )\n internal\n view\n returns (\n bool _exists\n )\n {\n return address(getStateTransitioner(_preStateRoot, _txHash)) != address(0);\n }\n\n /**\n * Deploys a new state transitioner.\n * @param _preStateRoot Pre-state root to initialize the transitioner with.\n * @param _txHash Hash of the transaction this transitioner will execute.\n * @param _stateTransitionIndex Index of the transaction in the chain.\n */\n function _deployTransitioner(\n bytes32 _preStateRoot,\n bytes32 _txHash,\n uint256 _stateTransitionIndex\n )\n internal\n {\n transitioners[keccak256(abi.encodePacked(_preStateRoot, _txHash))] = iOVM_StateTransitionerFactory(\n resolve(\"OVM_StateTransitionerFactory\")\n ).create(\n address(libAddressManager),\n _stateTransitionIndex,\n _preStateRoot,\n _txHash\n );\n }\n\n /**\n * Removes a state transition from the state commitment chain.\n * @param _postStateRootBatchHeader Header for the post-state root.\n * @param _preStateRoot Pre-state root hash.\n */\n function _cancelStateTransition(\n Lib_OVMCodec.ChainBatchHeader memory _postStateRootBatchHeader,\n bytes32 _preStateRoot\n )\n internal\n {\n iOVM_StateCommitmentChain ovmStateCommitmentChain = iOVM_StateCommitmentChain(resolve(\"OVM_StateCommitmentChain\"));\n iOVM_BondManager ovmBondManager = iOVM_BondManager(resolve(\"OVM_BondManager\"));\n\n // Delete the state batch.\n ovmStateCommitmentChain.deleteStateBatch(\n _postStateRootBatchHeader\n );\n\n // Get the timestamp and publisher for that block.\n (uint256 timestamp, address publisher) = abi.decode(_postStateRootBatchHeader.extraData, (uint256, address));\n\n // Slash the bonds at the bond manager.\n ovmBondManager.finalize(\n _preStateRoot,\n publisher,\n timestamp\n );\n }\n}\n" - }, - "contracts/optimistic-ethereum/iOVM/chain/iOVM_StateCommitmentChain.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/**\n * @title iOVM_StateCommitmentChain\n */\ninterface iOVM_StateCommitmentChain {\n\n /**********\n * Events *\n **********/\n\n event StateBatchAppended(\n uint256 indexed _batchIndex,\n bytes32 _batchRoot,\n uint256 _batchSize,\n uint256 _prevTotalElements,\n bytes _extraData\n );\n\n event StateBatchDeleted(\n uint256 indexed _batchIndex,\n bytes32 _batchRoot\n );\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Retrieves the total number of elements submitted.\n * @return _totalElements Total submitted elements.\n */\n function getTotalElements()\n external\n view\n returns (\n uint256 _totalElements\n );\n\n /**\n * Retrieves the total number of batches submitted.\n * @return _totalBatches Total submitted batches.\n */\n function getTotalBatches()\n external\n view\n returns (\n uint256 _totalBatches\n );\n\n /**\n * Retrieves the timestamp of the last batch submitted by the sequencer.\n * @return _lastSequencerTimestamp Last sequencer batch timestamp.\n */\n function getLastSequencerTimestamp()\n external\n view\n returns (\n uint256 _lastSequencerTimestamp\n );\n\n /**\n * Appends a batch of state roots to the chain.\n * @param _batch Batch of state roots.\n * @param _shouldStartAtElement Index of the element at which this batch should start.\n */\n function appendStateBatch(\n bytes32[] calldata _batch,\n uint256 _shouldStartAtElement\n )\n external;\n\n /**\n * Deletes all state roots after (and including) a given batch.\n * @param _batchHeader Header of the batch to start deleting from.\n */\n function deleteStateBatch(\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\n )\n external;\n\n /**\n * Verifies a batch inclusion proof.\n * @param _element Hash of the element to verify a proof for.\n * @param _batchHeader Header of the batch in which the element was included.\n * @param _proof Merkle inclusion proof for the element.\n */\n function verifyStateCommitment(\n bytes32 _element,\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _proof\n )\n external\n view\n returns (\n bool _verified\n );\n\n /**\n * Checks whether a given batch is still inside its fraud proof window.\n * @param _batchHeader Header of the batch to check.\n * @return _inside Whether or not the batch is inside the fraud proof window.\n */\n function insideFraudProofWindow(\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\n )\n external\n view\n returns (\n bool _inside\n );\n}\n" - }, - "contracts/optimistic-ethereum/iOVM/chain/iOVM_CanonicalTransactionChain.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/**\n * @title iOVM_CanonicalTransactionChain\n */\ninterface iOVM_CanonicalTransactionChain {\n\n /**********\n * Events *\n **********/\n\n event TransactionEnqueued(\n address _l1TxOrigin,\n address _target,\n uint256 _gasLimit,\n bytes _data,\n uint256 _queueIndex,\n uint256 _timestamp\n );\n\n event QueueBatchAppended(\n uint256 _startingQueueIndex,\n uint256 _numQueueElements,\n uint256 _totalElements\n );\n\n event SequencerBatchAppended(\n uint256 _startingQueueIndex,\n uint256 _numQueueElements,\n uint256 _totalElements\n );\n\n event TransactionBatchAppended(\n uint256 indexed _batchIndex,\n bytes32 _batchRoot,\n uint256 _batchSize,\n uint256 _prevTotalElements,\n bytes _extraData\n );\n\n\n /***********\n * Structs *\n ***********/\n\n struct BatchContext {\n uint256 numSequencedTransactions;\n uint256 numSubsequentQueueTransactions;\n uint256 timestamp;\n uint256 blockNumber;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Retrieves the total number of elements submitted.\n * @return _totalElements Total submitted elements.\n */\n function getTotalElements()\n external\n view\n returns (\n uint256 _totalElements\n );\n\n /**\n * Retrieves the total number of batches submitted.\n * @return _totalBatches Total submitted batches.\n */\n function getTotalBatches()\n external\n view\n returns (\n uint256 _totalBatches\n );\n\n /**\n * Returns the index of the next element to be enqueued.\n * @return Index for the next queue element.\n */\n function getNextQueueIndex()\n external\n view\n returns (\n uint40\n );\n\n /**\n * Get the number of queue elements which have not yet been included.\n * @return Length of the queue.\n */\n function getNumPendingQueueElements()\n external\n view\n returns (\n uint40\n );\n\n /**\n * Retrieves the length of the queue, including\n * both pending and canonical transactions.\n * @return Length of the queue.\n */\n function getQueueLength()\n external\n view\n returns (\n uint40\n );\n\n /**\n * Gets the queue element at a particular index.\n * @param _index Index of the queue element to access.\n * @return _element Queue element at the given index.\n */\n function getQueueElement(\n uint256 _index\n )\n external\n view\n returns (\n Lib_OVMCodec.QueueElement memory _element\n );\n\n /**\n * Adds a transaction to the queue.\n * @param _target Target contract to send the transaction to.\n * @param _gasLimit Gas limit for the given transaction.\n * @param _data Transaction data.\n */\n function enqueue(\n address _target,\n uint256 _gasLimit,\n bytes memory _data\n )\n external;\n\n /**\n * Appends a given number of queued transactions as a single batch.\n * @param _numQueuedTransactions Number of transactions to append.\n */\n function appendQueueBatch(\n uint256 _numQueuedTransactions\n )\n external;\n\n /**\n * Allows the sequencer to append a batch of transactions.\n * @dev This function uses a custom encoding scheme for efficiency reasons.\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\n * .param _contexts Array of batch contexts.\n * .param _transactionDataFields Array of raw transaction data.\n */\n function appendSequencerBatch(\n // uint40 _shouldStartAtElement,\n // uint24 _totalElementsToAppend,\n // BatchContext[] _contexts,\n // bytes[] _transactionDataFields\n )\n external;\n\n /**\n * Verifies whether a transaction is included in the chain.\n * @param _transaction Transaction to verify.\n * @param _txChainElement Transaction chain element corresponding to the transaction.\n * @param _batchHeader Header of the batch the transaction was included in.\n * @param _inclusionProof Inclusion proof for the provided transaction chain element.\n * @return True if the transaction exists in the CTC, false if not.\n */\n function verifyTransaction(\n Lib_OVMCodec.Transaction memory _transaction,\n Lib_OVMCodec.TransactionChainElement memory _txChainElement,\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _inclusionProof\n )\n external\n view\n returns (\n bool\n );\n}\n" - }, - "contracts/optimistic-ethereum/OVM/verification/OVM_BondManager.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.7.0;\n\n/* Library Imports */\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/* Interface Imports */\nimport { iOVM_BondManager, Errors, ERC20 } from \"../../iOVM/verification/iOVM_BondManager.sol\";\nimport { iOVM_FraudVerifier } from \"../../iOVM/verification/iOVM_FraudVerifier.sol\";\n\n/**\n * @title OVM_BondManager\n */\ncontract OVM_BondManager is iOVM_BondManager, Lib_AddressResolver {\n\n /****************************\n * Constants and Parameters *\n ****************************/\n\n /// The period to find the earliest fraud proof for a publisher\n uint256 public constant multiFraudProofPeriod = 7 days;\n\n /// The dispute period\n uint256 public constant disputePeriodSeconds = 7 days;\n\n /// The minimum collateral a sequencer must post\n uint256 public constant requiredCollateral = 1 ether;\n\n\n /*******************************************\n * Contract Variables: Contract References *\n *******************************************/\n\n /// The bond token\n ERC20 immutable public token;\n\n\n /********************************************\n * Contract Variables: Internal Accounting *\n *******************************************/\n\n /// The bonds posted by each proposer\n mapping(address => Bond) public bonds;\n\n /// For each pre-state root, there's an array of witnessProviders that must be rewarded\n /// for posting witnesses\n mapping(bytes32 => Rewards) public witnessProviders;\n\n\n /***************\n * Constructor *\n ***************/\n\n /// Initializes with a ERC20 token to be used for the fidelity bonds\n /// and with the Address Manager\n constructor(ERC20 _token, address _libAddressManager)\n Lib_AddressResolver(_libAddressManager)\n {\n token = _token;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n /// Adds `who` to the list of witnessProviders for the provided `preStateRoot`.\n function recordGasSpent(bytes32 _preStateRoot, bytes32 _txHash, address who, uint256 gasSpent) override public {\n // The sender must be the transitioner that corresponds to the claimed pre-state root\n address transitioner = address(iOVM_FraudVerifier(resolve(\"OVM_FraudVerifier\")).getStateTransitioner(_preStateRoot, _txHash));\n require(transitioner == msg.sender, Errors.ONLY_TRANSITIONER);\n\n witnessProviders[_preStateRoot].total += gasSpent;\n witnessProviders[_preStateRoot].gasSpent[who] += gasSpent;\n }\n\n /// Slashes + distributes rewards or frees up the sequencer's bond, only called by\n /// `FraudVerifier.finalizeFraudVerification`\n function finalize(bytes32 _preStateRoot, address publisher, uint256 timestamp) override public {\n require(msg.sender == resolve(\"OVM_FraudVerifier\"), Errors.ONLY_FRAUD_VERIFIER);\n require(witnessProviders[_preStateRoot].canClaim == false, Errors.ALREADY_FINALIZED);\n\n // allow users to claim from that state root's\n // pool of collateral (effectively slashing the sequencer)\n witnessProviders[_preStateRoot].canClaim = true;\n\n Bond storage bond = bonds[publisher];\n if (bond.firstDisputeAt == 0) {\n bond.firstDisputeAt = block.timestamp;\n bond.earliestDisputedStateRoot = _preStateRoot;\n bond.earliestTimestamp = timestamp;\n } else if (\n // only update the disputed state root for the publisher if it's within\n // the dispute period _and_ if it's before the previous one\n block.timestamp < bond.firstDisputeAt + multiFraudProofPeriod &&\n timestamp < bond.earliestTimestamp\n ) {\n bond.earliestDisputedStateRoot = _preStateRoot;\n bond.earliestTimestamp = timestamp;\n }\n\n // if the fraud proof's dispute period does not intersect with the \n // withdrawal's timestamp, then the user should not be slashed\n // e.g if a user at day 10 submits a withdrawal, and a fraud proof\n // from day 1 gets published, the user won't be slashed since day 8 (1d + 7d)\n // is before the user started their withdrawal. on the contrary, if the user\n // had started their withdrawal at, say, day 6, they would be slashed\n if (\n bond.withdrawalTimestamp != 0 && \n uint256(bond.withdrawalTimestamp) > timestamp + disputePeriodSeconds &&\n bond.state == State.WITHDRAWING\n ) {\n return;\n }\n\n // slash!\n bond.state = State.NOT_COLLATERALIZED;\n }\n\n /// Sequencers call this function to post collateral which will be used for\n /// the `appendBatch` call\n function deposit() override public {\n require(\n token.transferFrom(msg.sender, address(this), requiredCollateral),\n Errors.ERC20_ERR\n );\n\n // This cannot overflow\n bonds[msg.sender].state = State.COLLATERALIZED;\n }\n\n /// Starts the withdrawal for a publisher\n function startWithdrawal() override public {\n Bond storage bond = bonds[msg.sender];\n require(bond.withdrawalTimestamp == 0, Errors.WITHDRAWAL_PENDING);\n require(bond.state == State.COLLATERALIZED, Errors.WRONG_STATE);\n\n bond.state = State.WITHDRAWING;\n bond.withdrawalTimestamp = uint32(block.timestamp);\n }\n\n /// Finalizes a pending withdrawal from a publisher\n function finalizeWithdrawal() override public {\n Bond storage bond = bonds[msg.sender];\n\n require(\n block.timestamp >= uint256(bond.withdrawalTimestamp) + disputePeriodSeconds, \n Errors.TOO_EARLY\n );\n require(bond.state == State.WITHDRAWING, Errors.SLASHED);\n \n // refunds!\n bond.state = State.NOT_COLLATERALIZED;\n bond.withdrawalTimestamp = 0;\n \n require(\n token.transfer(msg.sender, requiredCollateral),\n Errors.ERC20_ERR\n );\n }\n\n /// Claims the user's reward for the witnesses they provided for the earliest\n /// disputed state root of the designated publisher\n function claim(address who) override public {\n Bond storage bond = bonds[who];\n require(\n block.timestamp >= bond.firstDisputeAt + multiFraudProofPeriod,\n Errors.WAIT_FOR_DISPUTES\n );\n\n // reward the earliest state root for this publisher\n bytes32 _preStateRoot = bond.earliestDisputedStateRoot;\n Rewards storage rewards = witnessProviders[_preStateRoot];\n\n // only allow claiming if fraud was proven in `finalize`\n require(rewards.canClaim, Errors.CANNOT_CLAIM);\n\n // proportional allocation - only reward 50% (rest gets locked in the\n // contract forever\n uint256 amount = (requiredCollateral * rewards.gasSpent[msg.sender]) / (2 * rewards.total);\n\n // reset the user's spent gas so they cannot double claim\n rewards.gasSpent[msg.sender] = 0;\n\n // transfer\n require(token.transfer(msg.sender, amount), Errors.ERC20_ERR);\n }\n\n /// Checks if the user is collateralized\n function isCollateralized(address who) override public view returns (bool) {\n return bonds[who].state == State.COLLATERALIZED;\n }\n\n /// Gets how many witnesses the user has provided for the state root\n function getGasSpent(bytes32 preStateRoot, address who) override public view returns (uint256) {\n return witnessProviders[preStateRoot].gasSpent[who];\n }\n}\n" - }, - "contracts/test-helpers/Mock_FraudVerifier.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.7.0;\n\nimport { OVM_BondManager } from \"./../optimistic-ethereum/OVM/verification/OVM_BondManager.sol\";\n\ncontract Mock_FraudVerifier {\n OVM_BondManager bondManager;\n\n mapping (bytes32 => address) transitioners;\n\n function setBondManager(OVM_BondManager _bondManager) public {\n bondManager = _bondManager;\n }\n\n function setStateTransitioner(bytes32 preStateRoot, bytes32 txHash, address addr) public {\n transitioners[keccak256(abi.encodePacked(preStateRoot, txHash))] = addr;\n }\n\n function getStateTransitioner(\n bytes32 _preStateRoot,\n bytes32 _txHash\n )\n public\n view\n returns (\n address\n )\n {\n return transitioners[keccak256(abi.encodePacked(_preStateRoot, _txHash))];\n }\n\n function finalize(bytes32 _preStateRoot, address publisher, uint256 timestamp) public {\n bondManager.finalize(_preStateRoot, publisher, timestamp);\n }\n}\n" - }, - "contracts/optimistic-ethereum/OVM/chain/OVM_StateCommitmentChain.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.7.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\nimport { Lib_MerkleTree } from \"../../libraries/utils/Lib_MerkleTree.sol\";\n\n/* Interface Imports */\nimport { iOVM_FraudVerifier } from \"../../iOVM/verification/iOVM_FraudVerifier.sol\";\nimport { iOVM_StateCommitmentChain } from \"../../iOVM/chain/iOVM_StateCommitmentChain.sol\";\nimport { iOVM_CanonicalTransactionChain } from \"../../iOVM/chain/iOVM_CanonicalTransactionChain.sol\";\nimport { iOVM_BondManager } from \"../../iOVM/verification/iOVM_BondManager.sol\";\nimport { iOVM_ChainStorageContainer } from \"../../iOVM/chain/iOVM_ChainStorageContainer.sol\";\n\n/* External Imports */\nimport '@openzeppelin/contracts/math/SafeMath.sol';\n\n/**\n * @title OVM_StateCommitmentChain\n */\ncontract OVM_StateCommitmentChain is iOVM_StateCommitmentChain, Lib_AddressResolver {\n\n /*************\n * Constants *\n *************/\n\n uint256 public FRAUD_PROOF_WINDOW;\n uint256 public SEQUENCER_PUBLISH_WINDOW;\n\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n constructor(\n address _libAddressManager,\n uint256 _fraudProofWindow,\n uint256 _sequencerPublishWindow\n )\n Lib_AddressResolver(_libAddressManager)\n {\n FRAUD_PROOF_WINDOW = _fraudProofWindow;\n SEQUENCER_PUBLISH_WINDOW = _sequencerPublishWindow;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Accesses the batch storage container.\n * @return Reference to the batch storage container.\n */\n function batches()\n public\n view\n returns (\n iOVM_ChainStorageContainer\n )\n {\n return iOVM_ChainStorageContainer(\n resolve(\"OVM_ChainStorageContainer:SCC:batches\")\n );\n }\n\n /**\n * @inheritdoc iOVM_StateCommitmentChain\n */\n function getTotalElements()\n override\n public\n view\n returns (\n uint256 _totalElements\n )\n {\n (uint40 totalElements, ) = _getBatchExtraData();\n return uint256(totalElements);\n }\n\n /**\n * @inheritdoc iOVM_StateCommitmentChain\n */\n function getTotalBatches()\n override\n public\n view\n returns (\n uint256 _totalBatches\n )\n {\n return batches().length();\n }\n\n /**\n * @inheritdoc iOVM_StateCommitmentChain\n */\n function getLastSequencerTimestamp()\n override\n public\n view\n returns (\n uint256 _lastSequencerTimestamp\n )\n {\n (, uint40 lastSequencerTimestamp) = _getBatchExtraData();\n return uint256(lastSequencerTimestamp);\n }\n\n /**\n * @inheritdoc iOVM_StateCommitmentChain\n */\n function appendStateBatch(\n bytes32[] memory _batch,\n uint256 _shouldStartAtElement\n )\n override\n public\n {\n // Fail fast in to make sure our batch roots aren't accidentally made fraudulent by the\n // publication of batches by some other user.\n require(\n _shouldStartAtElement == getTotalElements(),\n \"Actual batch start index does not match expected start index.\"\n );\n\n // Proposers must have previously staked at the BondManager\n require(\n iOVM_BondManager(resolve(\"OVM_BondManager\")).isCollateralized(msg.sender),\n \"Proposer does not have enough collateral posted\"\n );\n\n require(\n _batch.length > 0,\n \"Cannot submit an empty state batch.\"\n );\n\n require(\n getTotalElements() + _batch.length <= iOVM_CanonicalTransactionChain(resolve(\"OVM_CanonicalTransactionChain\")).getTotalElements(),\n \"Number of state roots cannot exceed the number of canonical transactions.\"\n );\n\n // Pass the block's timestamp and the publisher of the data\n // to be used in the fraud proofs\n _appendBatch(\n _batch,\n abi.encode(block.timestamp, msg.sender)\n );\n }\n\n /**\n * @inheritdoc iOVM_StateCommitmentChain\n */\n function deleteStateBatch(\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\n )\n override\n public\n {\n require(\n msg.sender == resolve(\"OVM_FraudVerifier\"),\n \"State batches can only be deleted by the OVM_FraudVerifier.\"\n );\n\n require(\n _isValidBatchHeader(_batchHeader),\n \"Invalid batch header.\"\n );\n\n require(\n insideFraudProofWindow(_batchHeader),\n \"State batches can only be deleted within the fraud proof window.\"\n );\n\n _deleteBatch(_batchHeader);\n }\n\n /**\n * @inheritdoc iOVM_StateCommitmentChain\n */\n function verifyStateCommitment(\n bytes32 _element,\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _proof\n )\n override\n public\n view\n returns (\n bool\n )\n {\n require(\n _isValidBatchHeader(_batchHeader),\n \"Invalid batch header.\"\n );\n\n require(\n Lib_MerkleTree.verify(\n _batchHeader.batchRoot,\n _element,\n _proof.index,\n _proof.siblings,\n _batchHeader.batchSize\n ),\n \"Invalid inclusion proof.\"\n );\n\n return true;\n }\n\n /**\n * @inheritdoc iOVM_StateCommitmentChain\n */\n function insideFraudProofWindow(\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\n )\n override\n public\n view\n returns (\n bool _inside\n )\n {\n (uint256 timestamp,) = abi.decode(\n _batchHeader.extraData,\n (uint256, address)\n );\n\n require(\n timestamp != 0,\n \"Batch header timestamp cannot be zero\"\n );\n return SafeMath.add(timestamp, FRAUD_PROOF_WINDOW) > block.timestamp;\n }\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Parses the batch context from the extra data.\n * @return Total number of elements submitted.\n * @return Timestamp of the last batch submitted by the sequencer.\n */\n function _getBatchExtraData()\n internal\n view\n returns (\n uint40,\n uint40\n )\n {\n bytes27 extraData = batches().getGlobalMetadata();\n\n uint40 totalElements;\n uint40 lastSequencerTimestamp;\n assembly {\n extraData := shr(40, extraData)\n totalElements := and(extraData, 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF)\n lastSequencerTimestamp := shr(40, and(extraData, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000))\n }\n\n return (\n totalElements,\n lastSequencerTimestamp\n );\n }\n\n /**\n * Encodes the batch context for the extra data.\n * @param _totalElements Total number of elements submitted.\n * @param _lastSequencerTimestamp Timestamp of the last batch submitted by the sequencer.\n * @return Encoded batch context.\n */\n function _makeBatchExtraData(\n uint40 _totalElements,\n uint40 _lastSequencerTimestamp\n )\n internal\n pure\n returns (\n bytes27\n )\n {\n bytes27 extraData;\n assembly {\n extraData := _totalElements\n extraData := or(extraData, shl(40, _lastSequencerTimestamp))\n extraData := shl(40, extraData)\n }\n\n return extraData;\n }\n\n /**\n * Appends a batch to the chain.\n * @param _batch Elements within the batch.\n * @param _extraData Any extra data to append to the batch.\n */\n function _appendBatch(\n bytes32[] memory _batch,\n bytes memory _extraData\n )\n internal\n {\n address sequencer = resolve(\"OVM_Sequencer\");\n (uint40 totalElements, uint40 lastSequencerTimestamp) = _getBatchExtraData();\n\n if (msg.sender == sequencer) {\n lastSequencerTimestamp = uint40(block.timestamp);\n } else {\n // We keep track of the last batch submitted by the sequencer so there's a window in\n // which only the sequencer can publish state roots. A window like this just reduces\n // the chance of \"system breaking\" state roots being published while we're still in\n // testing mode. This window should be removed or significantly reduced in the future.\n require(\n lastSequencerTimestamp + SEQUENCER_PUBLISH_WINDOW < block.timestamp,\n \"Cannot publish state roots within the sequencer publication window.\"\n );\n }\n\n Lib_OVMCodec.ChainBatchHeader memory batchHeader = Lib_OVMCodec.ChainBatchHeader({\n batchIndex: getTotalBatches(),\n batchRoot: Lib_MerkleTree.getMerkleRoot(_batch),\n batchSize: _batch.length,\n prevTotalElements: totalElements,\n extraData: _extraData\n });\n\n emit StateBatchAppended(\n batchHeader.batchIndex,\n batchHeader.batchRoot,\n batchHeader.batchSize,\n batchHeader.prevTotalElements,\n batchHeader.extraData\n );\n\n batches().push(\n Lib_OVMCodec.hashBatchHeader(batchHeader),\n _makeBatchExtraData(\n uint40(batchHeader.prevTotalElements + batchHeader.batchSize),\n lastSequencerTimestamp\n )\n );\n }\n\n /**\n * Removes a batch and all subsequent batches from the chain.\n * @param _batchHeader Header of the batch to remove.\n */\n function _deleteBatch(\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\n )\n internal\n {\n require(\n _batchHeader.batchIndex < batches().length(),\n \"Invalid batch index.\"\n );\n\n require(\n _isValidBatchHeader(_batchHeader),\n \"Invalid batch header.\"\n );\n\n batches().deleteElementsAfterInclusive(\n _batchHeader.batchIndex,\n _makeBatchExtraData(\n uint40(_batchHeader.prevTotalElements),\n 0\n )\n );\n\n emit StateBatchDeleted(\n _batchHeader.batchIndex,\n _batchHeader.batchRoot\n );\n }\n\n /**\n * Checks that a batch header matches the stored hash for the given index.\n * @param _batchHeader Batch header to validate.\n * @return Whether or not the header matches the stored one.\n */\n function _isValidBatchHeader(\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\n )\n internal\n view\n returns (\n bool\n )\n {\n return Lib_OVMCodec.hashBatchHeader(_batchHeader) == batches().get(_batchHeader.batchIndex);\n }\n}\n" - }, - "contracts/optimistic-ethereum/libraries/utils/Lib_MerkleTree.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.7.0;\n\n/**\n * @title Lib_MerkleTree\n * @author River Keefer\n */\nlibrary Lib_MerkleTree {\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Calculates a merkle root for a list of 32-byte leaf hashes. WARNING: If the number\n * of leaves passed in is not a power of two, it pads out the tree with zero hashes.\n * If you do not know the original length of elements for the tree you are verifying,\n * then this may allow empty leaves past _elements.length to pass a verification check down the line.\n * @param _elements Array of hashes from which to generate a merkle root.\n * @return Merkle root of the leaves, with zero hashes for non-powers-of-two (see above).\n */\n function getMerkleRoot(\n bytes32[] memory _elements\n )\n internal\n view\n returns (\n bytes32\n )\n {\n require(\n _elements.length > 0,\n \"Lib_MerkleTree: Must provide at least one leaf hash.\"\n );\n\n if (_elements.length == 0) {\n return _elements[0];\n }\n\n uint256[16] memory defaults = [\n 0x290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563,\n 0x633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d,\n 0x890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d,\n 0x3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd8,\n 0xecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da,\n 0xdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da5,\n 0x617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d7,\n 0x292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead,\n 0xe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e10,\n 0x7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f82,\n 0xe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e83636516,\n 0x3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c,\n 0xad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e,\n 0xa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab,\n 0x4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c862,\n 0x2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf10\n ];\n\n // Reserve memory space for our hashes.\n bytes memory buf = new bytes(64);\n\n // We'll need to keep track of left and right siblings.\n bytes32 leftSibling;\n bytes32 rightSibling;\n\n // Number of non-empty nodes at the current depth.\n uint256 rowSize = _elements.length;\n\n // Current depth, counting from 0 at the leaves\n uint256 depth = 0;\n\n // Common sub-expressions\n uint256 halfRowSize; // rowSize / 2\n bool rowSizeIsOdd; // rowSize % 2 == 1\n\n while (rowSize > 1) {\n halfRowSize = rowSize / 2;\n rowSizeIsOdd = rowSize % 2 == 1;\n\n for (uint256 i = 0; i < halfRowSize; i++) {\n leftSibling = _elements[(2 * i) ];\n rightSibling = _elements[(2 * i) + 1];\n assembly {\n mstore(add(buf, 32), leftSibling )\n mstore(add(buf, 64), rightSibling)\n }\n\n _elements[i] = keccak256(buf);\n }\n\n if (rowSizeIsOdd) {\n leftSibling = _elements[rowSize - 1];\n rightSibling = bytes32(defaults[depth]);\n assembly {\n mstore(add(buf, 32), leftSibling)\n mstore(add(buf, 64), rightSibling)\n }\n\n _elements[halfRowSize] = keccak256(buf);\n }\n\n rowSize = halfRowSize + (rowSizeIsOdd ? 1 : 0);\n depth++;\n }\n\n return _elements[0];\n }\n\n /**\n * Verifies a merkle branch for the given leaf hash. Assumes the original length\n * of leaves generated is a known, correct input, and does not return true for indices \n * extending past that index (even if _siblings would be otherwise valid.)\n * @param _root The Merkle root to verify against.\n * @param _leaf The leaf hash to verify inclusion of.\n * @param _index The index in the tree of this leaf.\n * @param _siblings Array of sibline nodes in the inclusion proof, starting from depth 0 (bottom of the tree). \n * @param _totalLeaves The total number of leaves originally passed into.\n * @return Whether or not the merkle branch and leaf passes verification.\n */\n function verify(\n bytes32 _root,\n bytes32 _leaf,\n uint256 _index,\n bytes32[] memory _siblings,\n uint256 _totalLeaves\n )\n internal\n pure\n returns (\n bool\n )\n {\n require(\n _totalLeaves > 0,\n \"Lib_MerkleTree: Total leaves must be greater than zero.\"\n );\n\n require(\n _index < _totalLeaves,\n \"Lib_MerkleTree: Index out of bounds.\"\n );\n\n require(\n _siblings.length == _ceilLog2(_totalLeaves),\n \"Lib_MerkleTree: Total siblings does not correctly correspond to total leaves.\"\n );\n\n bytes32 computedRoot = _leaf;\n\n for (uint256 i = 0; i < _siblings.length; i++) {\n if ((_index & 1) == 1) {\n computedRoot = keccak256(\n abi.encodePacked(\n _siblings[i],\n computedRoot\n )\n );\n } else {\n computedRoot = keccak256(\n abi.encodePacked(\n computedRoot,\n _siblings[i]\n )\n );\n }\n\n _index >>= 1;\n }\n\n return _root == computedRoot;\n }\n\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * Calculates the integer ceiling of the log base 2 of an input.\n * @param _in Unsigned input to calculate the log.\n * @return ceil(log_base_2(_in))\n */\n function _ceilLog2(\n uint256 _in\n )\n private\n pure\n returns (\n uint256\n )\n { \n require(\n _in > 0,\n \"Lib_MerkleTree: Cannot compute ceil(log_2) of 0.\"\n );\n\n if (_in == 1) {\n return 0;\n }\n\n // Find the highest set bit (will be floor(log_2)).\n // Borrowed with <3 from https://github.com/ethereum/solidity-examples\n uint256 val = _in;\n uint256 highest = 0;\n for (uint8 i = 128; i >= 1; i >>= 1) {\n if (val & (uint(1) << i) - 1 << i != 0) {\n highest += i;\n val >>= i;\n }\n }\n\n // Increment by one if this is not a perfect logarithm.\n if ((uint(1) << highest) != _in) {\n highest += 1;\n }\n\n return highest;\n }\n}\n" - }, - "contracts/optimistic-ethereum/iOVM/chain/iOVM_ChainStorageContainer.sol": { - "content": "pragma solidity ^0.7.0;\n\n/**\n * @title iOVM_ChainStorageContainer\n */\ninterface iOVM_ChainStorageContainer {\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\n * 27 bytes to store arbitrary data.\n * @param _globalMetadata New global metadata to set.\n */\n function setGlobalMetadata(\n bytes27 _globalMetadata\n )\n external;\n\n /**\n * Retrieves the container's global metadata field.\n * @return Container global metadata field.\n */\n function getGlobalMetadata()\n external\n view\n returns (\n bytes27\n );\n\n /**\n * Retrieves the number of objects stored in the container.\n * @return Number of objects in the container.\n */\n function length()\n external\n view\n returns (\n uint256\n );\n\n /**\n * Pushes an object into the container.\n * @param _object A 32 byte value to insert into the container.\n */\n function push(\n bytes32 _object\n )\n external;\n\n /**\n * Pushes an object into the container. Function allows setting the global metadata since\n * we'll need to touch the \"length\" storage slot anyway, which also contains the global\n * metadata (it's an optimization).\n * @param _object A 32 byte value to insert into the container.\n * @param _globalMetadata New global metadata for the container.\n */\n function push(\n bytes32 _object,\n bytes27 _globalMetadata\n )\n external;\n\n /**\n * Pushes two objects into the container at the same time. A useful optimization.\n * @param _objectA First 32 byte value to insert into the container.\n * @param _objectB Second 32 byte value to insert into the container.\n */\n function push2(\n bytes32 _objectA,\n bytes32 _objectB\n )\n external;\n\n /**\n * Pushes two objects into the container at the same time. Also allows setting the global\n * metadata field.\n * @param _objectA First 32 byte value to insert into the container.\n * @param _objectB Second 32 byte value to insert into the container.\n * @param _globalMetadata New global metadata for the container.\n */\n function push2(\n bytes32 _objectA,\n bytes32 _objectB,\n bytes27 _globalMetadata\n )\n external;\n\n /**\n * Retrieves an object from the container.\n * @param _index Index of the particular object to access.\n * @return 32 byte object value.\n */\n function get(\n uint256 _index\n )\n external\n view\n returns (\n bytes32\n );\n\n /**\n * Removes all objects after and including a given index.\n * @param _index Object index to delete from.\n */\n function deleteElementsAfterInclusive(\n uint256 _index\n )\n external;\n\n /**\n * Removes all objects after and including a given index. Also allows setting the global\n * metadata field.\n * @param _index Object index to delete from.\n * @param _globalMetadata New global metadata for the container.\n */\n function deleteElementsAfterInclusive(\n uint256 _index,\n bytes27 _globalMetadata\n )\n external;\n\n /**\n * Marks an index as overwritable, meaing the underlying buffer can start to write values over\n * any objects before and including the given index.\n */\n function setNextOverwritableIndex(\n uint256 _index\n )\n external;\n}\n" - }, - "@openzeppelin/contracts/math/SafeMath.sol": { - "content": "// SPDX-License-Identifier: MIT\n\npragma solidity >=0.6.0 <0.8.0;\n\n/**\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\n * checks.\n *\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\n * in bugs, because programmers usually assume that an overflow raises an\n * error, which is the standard behavior in high level programming languages.\n * `SafeMath` restores this intuition by reverting the transaction when an\n * operation overflows.\n *\n * Using this library instead of the unchecked operations eliminates an entire\n * class of bugs, so it's recommended to use it always.\n */\nlibrary SafeMath {\n /**\n * @dev Returns the addition of two unsigned integers, with an overflow flag.\n *\n * _Available since v3.4._\n */\n function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n uint256 c = a + b;\n if (c < a) return (false, 0);\n return (true, c);\n }\n\n /**\n * @dev Returns the substraction of two unsigned integers, with an overflow flag.\n *\n * _Available since v3.4._\n */\n function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n if (b > a) return (false, 0);\n return (true, a - b);\n }\n\n /**\n * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\n *\n * _Available since v3.4._\n */\n function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\n // benefit is lost if 'b' is also tested.\n // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\n if (a == 0) return (true, 0);\n uint256 c = a * b;\n if (c / a != b) return (false, 0);\n return (true, c);\n }\n\n /**\n * @dev Returns the division of two unsigned integers, with a division by zero flag.\n *\n * _Available since v3.4._\n */\n function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n if (b == 0) return (false, 0);\n return (true, a / b);\n }\n\n /**\n * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\n *\n * _Available since v3.4._\n */\n function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n if (b == 0) return (false, 0);\n return (true, a % b);\n }\n\n /**\n * @dev Returns the addition of two unsigned integers, reverting on\n * overflow.\n *\n * Counterpart to Solidity's `+` operator.\n *\n * Requirements:\n *\n * - Addition cannot overflow.\n */\n function add(uint256 a, uint256 b) internal pure returns (uint256) {\n uint256 c = a + b;\n require(c >= a, \"SafeMath: addition overflow\");\n return c;\n }\n\n /**\n * @dev Returns the subtraction of two unsigned integers, reverting on\n * overflow (when the result is negative).\n *\n * Counterpart to Solidity's `-` operator.\n *\n * Requirements:\n *\n * - Subtraction cannot overflow.\n */\n function sub(uint256 a, uint256 b) internal pure returns (uint256) {\n require(b <= a, \"SafeMath: subtraction overflow\");\n return a - b;\n }\n\n /**\n * @dev Returns the multiplication of two unsigned integers, reverting on\n * overflow.\n *\n * Counterpart to Solidity's `*` operator.\n *\n * Requirements:\n *\n * - Multiplication cannot overflow.\n */\n function mul(uint256 a, uint256 b) internal pure returns (uint256) {\n if (a == 0) return 0;\n uint256 c = a * b;\n require(c / a == b, \"SafeMath: multiplication overflow\");\n return c;\n }\n\n /**\n * @dev Returns the integer division of two unsigned integers, reverting on\n * division by zero. The result is rounded towards zero.\n *\n * Counterpart to Solidity's `/` operator. Note: this function uses a\n * `revert` opcode (which leaves remaining gas untouched) while Solidity\n * uses an invalid opcode to revert (consuming all remaining gas).\n *\n * Requirements:\n *\n * - The divisor cannot be zero.\n */\n function div(uint256 a, uint256 b) internal pure returns (uint256) {\n require(b > 0, \"SafeMath: division by zero\");\n return a / b;\n }\n\n /**\n * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\n * reverting when dividing by zero.\n *\n * Counterpart to Solidity's `%` operator. This function uses a `revert`\n * opcode (which leaves remaining gas untouched) while Solidity uses an\n * invalid opcode to revert (consuming all remaining gas).\n *\n * Requirements:\n *\n * - The divisor cannot be zero.\n */\n function mod(uint256 a, uint256 b) internal pure returns (uint256) {\n require(b > 0, \"SafeMath: modulo by zero\");\n return a % b;\n }\n\n /**\n * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\n * overflow (when the result is negative).\n *\n * CAUTION: This function is deprecated because it requires allocating memory for the error\n * message unnecessarily. For custom revert reasons use {trySub}.\n *\n * Counterpart to Solidity's `-` operator.\n *\n * Requirements:\n *\n * - Subtraction cannot overflow.\n */\n function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\n require(b <= a, errorMessage);\n return a - b;\n }\n\n /**\n * @dev Returns the integer division of two unsigned integers, reverting with custom message on\n * division by zero. The result is rounded towards zero.\n *\n * CAUTION: This function is deprecated because it requires allocating memory for the error\n * message unnecessarily. For custom revert reasons use {tryDiv}.\n *\n * Counterpart to Solidity's `/` operator. Note: this function uses a\n * `revert` opcode (which leaves remaining gas untouched) while Solidity\n * uses an invalid opcode to revert (consuming all remaining gas).\n *\n * Requirements:\n *\n * - The divisor cannot be zero.\n */\n function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\n require(b > 0, errorMessage);\n return a / b;\n }\n\n /**\n * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\n * reverting with custom message when dividing by zero.\n *\n * CAUTION: This function is deprecated because it requires allocating memory for the error\n * message unnecessarily. For custom revert reasons use {tryMod}.\n *\n * Counterpart to Solidity's `%` operator. This function uses a `revert`\n * opcode (which leaves remaining gas untouched) while Solidity uses an\n * invalid opcode to revert (consuming all remaining gas).\n *\n * Requirements:\n *\n * - The divisor cannot be zero.\n */\n function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\n require(b > 0, errorMessage);\n return a % b;\n }\n}\n" - }, - "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol": { - "content": "pragma solidity ^0.7.0;\n\n/* Library Imports */\nimport { Lib_RingBuffer } from \"../../libraries/utils/Lib_RingBuffer.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/* Interface Imports */\nimport { iOVM_ChainStorageContainer } from \"../../iOVM/chain/iOVM_ChainStorageContainer.sol\";\n\n/**\n * @title OVM_ChainStorageContainer\n */\ncontract OVM_ChainStorageContainer is iOVM_ChainStorageContainer, Lib_AddressResolver {\n\n /*************\n * Libraries *\n *************/\n\n using Lib_RingBuffer for Lib_RingBuffer.RingBuffer;\n\n\n /*************\n * Variables *\n *************/\n\n string public owner;\n Lib_RingBuffer.RingBuffer internal buffer;\n\n\n /***************\n * Constructor *\n ***************/\n \n /**\n * @param _libAddressManager Address of the Address Manager.\n * @param _owner Name of the contract that owns this container (will be resolved later).\n */\n constructor(\n address _libAddressManager,\n string memory _owner\n )\n Lib_AddressResolver(_libAddressManager)\n {\n owner = _owner;\n }\n\n\n /**********************\n * Function Modifiers *\n **********************/\n \n modifier onlyOwner() {\n require(\n msg.sender == resolve(owner),\n \"OVM_ChainStorageContainer: Function can only be called by the owner.\"\n );\n _;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @inheritdoc iOVM_ChainStorageContainer\n */\n function setGlobalMetadata(\n bytes27 _globalMetadata\n )\n override\n public\n onlyOwner\n {\n return buffer.setExtraData(_globalMetadata);\n }\n\n /**\n * @inheritdoc iOVM_ChainStorageContainer\n */\n function getGlobalMetadata()\n override\n public\n view\n returns (\n bytes27\n )\n {\n return buffer.getExtraData();\n }\n\n /**\n * @inheritdoc iOVM_ChainStorageContainer\n */\n function length()\n override\n public\n view\n returns (\n uint256\n )\n {\n return uint256(buffer.getLength());\n }\n\n /**\n * @inheritdoc iOVM_ChainStorageContainer\n */\n function push(\n bytes32 _object\n )\n override\n public\n onlyOwner\n {\n buffer.push(_object);\n }\n\n /**\n * @inheritdoc iOVM_ChainStorageContainer\n */\n function push(\n bytes32 _object,\n bytes27 _globalMetadata\n )\n override\n public\n onlyOwner\n {\n buffer.push(_object, _globalMetadata);\n }\n\n /**\n * @inheritdoc iOVM_ChainStorageContainer\n */\n function push2(\n bytes32 _objectA,\n bytes32 _objectB\n )\n override\n public\n onlyOwner\n {\n buffer.push2(_objectA, _objectB);\n }\n\n /**\n * @inheritdoc iOVM_ChainStorageContainer\n */\n function push2(\n bytes32 _objectA,\n bytes32 _objectB,\n bytes27 _globalMetadata\n )\n override\n public\n onlyOwner\n {\n buffer.push2(_objectA, _objectB, _globalMetadata);\n }\n\n /**\n * @inheritdoc iOVM_ChainStorageContainer\n */\n function get(\n uint256 _index\n )\n override\n public\n view\n returns (\n bytes32\n )\n {\n return buffer.get(uint40(_index));\n }\n \n /**\n * @inheritdoc iOVM_ChainStorageContainer\n */\n function deleteElementsAfterInclusive(\n uint256 _index\n )\n override\n public\n onlyOwner\n {\n buffer.deleteElementsAfterInclusive(\n uint40(_index)\n );\n }\n \n /**\n * @inheritdoc iOVM_ChainStorageContainer\n */\n function deleteElementsAfterInclusive(\n uint256 _index,\n bytes27 _globalMetadata\n )\n override\n public\n onlyOwner\n {\n buffer.deleteElementsAfterInclusive(\n uint40(_index),\n _globalMetadata\n );\n }\n\n /**\n * @inheritdoc iOVM_ChainStorageContainer\n */\n function setNextOverwritableIndex(\n uint256 _index\n )\n override\n public\n onlyOwner\n {\n buffer.nextOverwritableIndex = _index;\n }\n}\n" - }, - "contracts/optimistic-ethereum/libraries/utils/Lib_RingBuffer.sol": { - "content": "pragma solidity ^0.7.0;\n\nlibrary Lib_RingBuffer {\n using Lib_RingBuffer for RingBuffer;\n\n /***********\n * Structs *\n ***********/\n\n struct Buffer {\n uint256 length;\n mapping (uint256 => bytes32) buf;\n }\n\n struct RingBuffer {\n bytes32 contextA;\n bytes32 contextB;\n Buffer bufferA;\n Buffer bufferB;\n uint256 nextOverwritableIndex;\n }\n\n struct RingBufferContext {\n // contextA\n uint40 globalIndex;\n bytes27 extraData;\n\n // contextB\n uint64 currBufferIndex;\n uint40 prevResetIndex;\n uint40 currResetIndex;\n }\n\n\n /*************\n * Constants *\n *************/\n\n uint256 constant MIN_CAPACITY = 16;\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Pushes a single element to the buffer.\n * @param _self Buffer to access.\n * @param _value Value to push to the buffer.\n * @param _extraData Optional global extra data.\n */\n function push(\n RingBuffer storage _self,\n bytes32 _value,\n bytes27 _extraData\n )\n internal\n {\n RingBufferContext memory ctx = _self.getContext();\n Buffer storage currBuffer = _self.getBuffer(ctx.currBufferIndex);\n\n // Set a minimum capacity.\n if (currBuffer.length == 0) {\n currBuffer.length = MIN_CAPACITY;\n }\n\n // Check if we need to expand the buffer.\n if (ctx.globalIndex - ctx.currResetIndex >= currBuffer.length) {\n if (ctx.currResetIndex < _self.nextOverwritableIndex) {\n // We're going to overwrite the inactive buffer.\n // Bump the buffer index, reset the delete offset, and set our reset indices.\n ctx.currBufferIndex++;\n ctx.prevResetIndex = ctx.currResetIndex;\n ctx.currResetIndex = ctx.globalIndex;\n\n // Swap over to the next buffer.\n currBuffer = _self.getBuffer(ctx.currBufferIndex);\n } else {\n // We're not overwriting yet, double the length of the current buffer.\n currBuffer.length *= 2;\n }\n }\n\n // Index to write to is the difference of the global and reset indices.\n uint256 writeHead = ctx.globalIndex - ctx.currResetIndex;\n currBuffer.buf[writeHead] = _value;\n\n // Bump the global index and insert our extra data, then save the context.\n ctx.globalIndex++;\n ctx.extraData = _extraData;\n _self.setContext(ctx);\n }\n\n /**\n * Pushes a single element to the buffer.\n * @param _self Buffer to access.\n * @param _value Value to push to the buffer.\n */\n function push(\n RingBuffer storage _self,\n bytes32 _value\n )\n internal\n {\n RingBufferContext memory ctx = _self.getContext();\n \n _self.push(\n _value,\n ctx.extraData\n );\n }\n\n /**\n * Pushes a two elements to the buffer.\n * @param _self Buffer to access.\n * @param _valueA First value to push to the buffer.\n * @param _valueA Second value to push to the buffer.\n * @param _extraData Optional global extra data.\n */\n function push2(\n RingBuffer storage _self,\n bytes32 _valueA,\n bytes32 _valueB,\n bytes27 _extraData\n )\n internal\n {\n _self.push(_valueA, _extraData);\n _self.push(_valueB, _extraData);\n }\n\n /**\n * Pushes a two elements to the buffer.\n * @param _self Buffer to access.\n * @param _valueA First value to push to the buffer.\n * @param _valueA Second value to push to the buffer.\n */\n function push2(\n RingBuffer storage _self,\n bytes32 _valueA,\n bytes32 _valueB\n )\n internal\n {\n RingBufferContext memory ctx = _self.getContext();\n\n _self.push2(\n _valueA,\n _valueB,\n ctx.extraData\n );\n }\n\n /**\n * Retrieves an element from the buffer.\n * @param _self Buffer to access.\n * @param _index Element index to retrieve.\n * @return Value of the element at the given index.\n */\n function get(\n RingBuffer storage _self,\n uint256 _index\n )\n internal\n view\n returns (\n bytes32 \n )\n {\n RingBufferContext memory ctx = _self.getContext();\n\n require(\n _index < ctx.globalIndex,\n \"Index out of bounds.\"\n );\n\n Buffer storage currBuffer = _self.getBuffer(ctx.currBufferIndex);\n Buffer storage prevBuffer = _self.getBuffer(ctx.currBufferIndex + 1);\n\n if (_index >= ctx.currResetIndex) {\n // We're trying to load an element from the current buffer.\n // Relative index is just the difference from the reset index.\n uint256 relativeIndex = _index - ctx.currResetIndex;\n\n // Shouldn't happen but why not check.\n require(\n relativeIndex < currBuffer.length,\n \"Index out of bounds.\"\n );\n\n return currBuffer.buf[relativeIndex];\n } else {\n // We're trying to load an element from the previous buffer.\n // Relative index is the difference from the reset index in the other direction.\n uint256 relativeIndex = ctx.currResetIndex - _index;\n\n // Condition only fails in the case that we deleted and flipped buffers.\n require(\n ctx.currResetIndex > ctx.prevResetIndex,\n \"Index out of bounds.\"\n );\n\n // Make sure we're not trying to read beyond the array.\n require(\n relativeIndex <= prevBuffer.length,\n \"Index out of bounds.\"\n );\n\n return prevBuffer.buf[prevBuffer.length - relativeIndex];\n }\n }\n\n /**\n * Deletes all elements after (and including) a given index.\n * @param _self Buffer to access.\n * @param _index Index of the element to delete from (inclusive).\n * @param _extraData Optional global extra data.\n */\n function deleteElementsAfterInclusive(\n RingBuffer storage _self,\n uint40 _index,\n bytes27 _extraData\n )\n internal\n {\n RingBufferContext memory ctx = _self.getContext();\n\n require(\n _index < ctx.globalIndex && _index >= ctx.prevResetIndex,\n \"Index out of bounds.\"\n );\n\n Buffer storage currBuffer = _self.getBuffer(ctx.currBufferIndex);\n Buffer storage prevBuffer = _self.getBuffer(ctx.currBufferIndex + 1);\n\n if (_index < ctx.currResetIndex) {\n // We're switching back to the previous buffer.\n // Reduce the buffer index, set the current reset index back to match the previous one.\n // We use the equality of these two values to prevent reading beyond this buffer.\n ctx.currBufferIndex--;\n ctx.currResetIndex = ctx.prevResetIndex;\n }\n\n // Set our global index and extra data, save the context.\n ctx.globalIndex = _index;\n ctx.extraData = _extraData;\n _self.setContext(ctx);\n }\n\n /**\n * Deletes all elements after (and including) a given index.\n * @param _self Buffer to access.\n * @param _index Index of the element to delete from (inclusive).\n */\n function deleteElementsAfterInclusive(\n RingBuffer storage _self,\n uint40 _index\n )\n internal\n {\n RingBufferContext memory ctx = _self.getContext();\n _self.deleteElementsAfterInclusive(\n _index,\n ctx.extraData\n );\n }\n\n /**\n * Retrieves the current global index.\n * @param _self Buffer to access.\n * @return Current global index.\n */\n function getLength(\n RingBuffer storage _self\n )\n internal\n view\n returns (\n uint40\n )\n {\n RingBufferContext memory ctx = _self.getContext();\n return ctx.globalIndex;\n }\n\n /**\n * Changes current global extra data.\n * @param _self Buffer to access.\n * @param _extraData New global extra data.\n */\n function setExtraData(\n RingBuffer storage _self,\n bytes27 _extraData\n )\n internal\n {\n RingBufferContext memory ctx = _self.getContext();\n ctx.extraData = _extraData;\n _self.setContext(ctx);\n }\n\n /**\n * Retrieves the current global extra data.\n * @param _self Buffer to access.\n * @return Current global extra data.\n */\n function getExtraData(\n RingBuffer storage _self\n )\n internal\n view\n returns (\n bytes27\n )\n {\n RingBufferContext memory ctx = _self.getContext();\n return ctx.extraData;\n }\n\n /**\n * Sets the current ring buffer context.\n * @param _self Buffer to access.\n * @param _ctx Current ring buffer context.\n */\n function setContext(\n RingBuffer storage _self,\n RingBufferContext memory _ctx\n )\n internal\n returns (\n bytes32\n )\n {\n bytes32 contextA;\n bytes32 contextB;\n\n uint40 globalIndex = _ctx.globalIndex;\n bytes27 extraData = _ctx.extraData;\n assembly {\n contextA := globalIndex\n contextA := or(contextA, extraData)\n }\n\n uint64 currBufferIndex = _ctx.currBufferIndex;\n uint40 prevResetIndex = _ctx.prevResetIndex;\n uint40 currResetIndex = _ctx.currResetIndex;\n assembly {\n contextB := currBufferIndex\n contextB := or(contextB, shl(64, prevResetIndex))\n contextB := or(contextB, shl(104, currResetIndex))\n }\n\n if (_self.contextA != contextA) {\n _self.contextA = contextA;\n }\n\n if (_self.contextB != contextB) {\n _self.contextB = contextB;\n }\n }\n\n /**\n * Retrieves the current ring buffer context.\n * @param _self Buffer to access.\n * @return Current ring buffer context.\n */\n function getContext(\n RingBuffer storage _self\n )\n internal\n view\n returns (\n RingBufferContext memory\n )\n {\n bytes32 contextA = _self.contextA;\n bytes32 contextB = _self.contextB;\n\n uint40 globalIndex;\n bytes27 extraData;\n assembly {\n globalIndex := and(contextA, 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF)\n extraData := and(contextA, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000)\n }\n\n uint64 currBufferIndex;\n uint40 prevResetIndex;\n uint40 currResetIndex;\n assembly {\n currBufferIndex := and(contextB, 0x000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF)\n prevResetIndex := shr(64, and(contextB, 0x00000000000000000000000000000000000000FFFFFFFFFF0000000000000000))\n currResetIndex := shr(104, and(contextB, 0x0000000000000000000000000000FFFFFFFFFF00000000000000000000000000))\n }\n\n return RingBufferContext({\n globalIndex: globalIndex,\n extraData: extraData,\n currBufferIndex: currBufferIndex,\n prevResetIndex: prevResetIndex,\n currResetIndex: currResetIndex\n });\n }\n\n /**\n * Retrieves the a buffer from the ring buffer by index.\n * @param _self Buffer to access.\n * @param _which Index of the sub buffer to access.\n * @return Sub buffer for the index.\n */\n function getBuffer(\n RingBuffer storage _self,\n uint256 _which\n )\n internal\n view\n returns (\n Buffer storage\n )\n {\n return _which % 2 == 0 ? _self.bufferA : _self.bufferB;\n }\n}\n" - }, - "contracts/test-libraries/utils/TestLib_RingBuffer.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.7.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_RingBuffer } from \"../../optimistic-ethereum/libraries/utils/Lib_RingBuffer.sol\";\n\n/**\n * @title TestLib_RingBuffer\n */\ncontract TestLib_RingBuffer {\n using Lib_RingBuffer for Lib_RingBuffer.RingBuffer;\n \n Lib_RingBuffer.RingBuffer internal buf;\n\n function push(\n bytes32 _value,\n bytes27 _extraData\n )\n public\n {\n buf.push(\n _value,\n _extraData\n );\n }\n\n function push2(\n bytes32 _valueA,\n bytes32 _valueB,\n bytes27 _extraData\n )\n public\n {\n buf.push2(\n _valueA,\n _valueB,\n _extraData\n );\n }\n\n function get(\n uint256 _index\n )\n public\n view\n returns (\n bytes32 \n )\n {\n return buf.get(_index);\n }\n\n function deleteElementsAfterInclusive(\n uint40 _index,\n bytes27 _extraData\n )\n internal\n {\n return buf.deleteElementsAfterInclusive(\n _index,\n _extraData\n );\n }\n\n function getLength()\n internal\n view\n returns (\n uint40\n )\n {\n return buf.getLength();\n }\n\n function getExtraData()\n internal\n view\n returns (\n bytes27\n )\n {\n return buf.getExtraData();\n }\n}\n" - }, - "contracts/optimistic-ethereum/OVM/chain/OVM_CanonicalTransactionChain.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.7.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\nimport { Lib_MerkleTree } from \"../../libraries/utils/Lib_MerkleTree.sol\";\nimport { Lib_Math } from \"../../libraries/utils/Lib_Math.sol\";\n\n/* Interface Imports */\nimport { iOVM_CanonicalTransactionChain } from \"../../iOVM/chain/iOVM_CanonicalTransactionChain.sol\";\nimport { iOVM_ChainStorageContainer } from \"../../iOVM/chain/iOVM_ChainStorageContainer.sol\";\n\n/* Contract Imports */\nimport { OVM_ExecutionManager } from \"../execution/OVM_ExecutionManager.sol\";\n\n\n/**\n * @title OVM_CanonicalTransactionChain\n */\ncontract OVM_CanonicalTransactionChain is iOVM_CanonicalTransactionChain, Lib_AddressResolver {\n\n /*************\n * Constants *\n *************/\n\n // L2 tx gas-related\n uint256 constant public MIN_ROLLUP_TX_GAS = 100000;\n uint256 constant public MAX_ROLLUP_TX_SIZE = 10000;\n uint256 constant public L2_GAS_DISCOUNT_DIVISOR = 32;\n\n // Encoding-related (all in bytes)\n uint256 constant internal BATCH_CONTEXT_SIZE = 16;\n uint256 constant internal BATCH_CONTEXT_LENGTH_POS = 12;\n uint256 constant internal BATCH_CONTEXT_START_POS = 15;\n uint256 constant internal TX_DATA_HEADER_SIZE = 3;\n uint256 constant internal BYTES_TILL_TX_DATA = 65;\n\n\n /*************\n * Variables *\n *************/\n\n uint256 public forceInclusionPeriodSeconds;\n uint256 public forceInclusionPeriodBlocks;\n uint256 public maxTransactionGasLimit;\n\n\n /***************\n * Constructor *\n ***************/\n\n constructor(\n address _libAddressManager,\n uint256 _forceInclusionPeriodSeconds,\n uint256 _forceInclusionPeriodBlocks,\n uint256 _maxTransactionGasLimit\n )\n Lib_AddressResolver(_libAddressManager)\n {\n forceInclusionPeriodSeconds = _forceInclusionPeriodSeconds;\n forceInclusionPeriodBlocks = _forceInclusionPeriodBlocks;\n maxTransactionGasLimit = _maxTransactionGasLimit;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Accesses the batch storage container.\n * @return Reference to the batch storage container.\n */\n function batches()\n public\n view\n returns (\n iOVM_ChainStorageContainer\n )\n {\n return iOVM_ChainStorageContainer(\n resolve(\"OVM_ChainStorageContainer:CTC:batches\")\n );\n }\n\n /**\n * Accesses the queue storage container.\n * @return Reference to the queue storage container.\n */\n function queue()\n public\n view\n returns (\n iOVM_ChainStorageContainer\n )\n {\n return iOVM_ChainStorageContainer(\n resolve(\"OVM_ChainStorageContainer:CTC:queue\")\n );\n }\n\n /**\n * @inheritdoc iOVM_CanonicalTransactionChain\n */\n function getTotalElements()\n override\n public\n view\n returns (\n uint256 _totalElements\n )\n {\n (uint40 totalElements,,,) = _getBatchExtraData();\n return uint256(totalElements);\n }\n\n /**\n * @inheritdoc iOVM_CanonicalTransactionChain\n */\n function getTotalBatches()\n override\n public\n view\n returns (\n uint256 _totalBatches\n )\n {\n return batches().length();\n }\n\n /**\n * @inheritdoc iOVM_CanonicalTransactionChain\n */\n function getNextQueueIndex()\n override\n public\n view\n returns (\n uint40\n )\n {\n (, uint40 nextQueueIndex,,) = _getBatchExtraData();\n return nextQueueIndex;\n }\n\n /**\n * @inheritdoc iOVM_CanonicalTransactionChain\n */\n function getQueueElement(\n uint256 _index\n )\n override\n public\n view\n returns (\n Lib_OVMCodec.QueueElement memory _element\n )\n {\n uint40 trueIndex = uint40(_index * 2);\n bytes32 queueRoot = queue().get(trueIndex);\n bytes32 timestampAndBlockNumber = queue().get(trueIndex + 1);\n\n uint40 elementTimestamp;\n uint40 elementBlockNumber;\n assembly {\n elementTimestamp := and(timestampAndBlockNumber, 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF)\n elementBlockNumber := shr(40, and(timestampAndBlockNumber, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000))\n }\n\n return Lib_OVMCodec.QueueElement({\n queueRoot: queueRoot,\n timestamp: elementTimestamp,\n blockNumber: elementBlockNumber\n });\n }\n\n /**\n * @inheritdoc iOVM_CanonicalTransactionChain\n */\n function getNumPendingQueueElements()\n override\n public\n view\n returns (\n uint40\n )\n {\n return getQueueLength() - getNextQueueIndex();\n }\n\n /**\n * @inheritdoc iOVM_CanonicalTransactionChain\n */\n function getQueueLength()\n override\n public\n view\n returns (\n uint40\n )\n {\n // The underlying queue data structure stores 2 elements\n // per insertion, so to get the real queue length we need\n // to divide by 2. See the usage of `push2(..)`.\n return uint40(queue().length() / 2);\n }\n\n /**\n * @inheritdoc iOVM_CanonicalTransactionChain\n */\n function enqueue(\n address _target,\n uint256 _gasLimit,\n bytes memory _data\n )\n override\n public\n {\n require(\n _data.length <= MAX_ROLLUP_TX_SIZE,\n \"Transaction data size exceeds maximum for rollup transaction.\"\n );\n\n require(\n _gasLimit <= maxTransactionGasLimit,\n \"Transaction gas limit exceeds maximum for rollup transaction.\"\n );\n\n require(\n _gasLimit >= MIN_ROLLUP_TX_GAS,\n \"Transaction gas limit too low to enqueue.\"\n );\n\n // We need to consume some amount of L1 gas in order to rate limit transactions going into\n // L2. However, L2 is cheaper than L1 so we only need to burn some small proportion of the\n // provided L1 gas.\n uint256 gasToConsume = _gasLimit/L2_GAS_DISCOUNT_DIVISOR;\n uint256 startingGas = gasleft();\n\n // Although this check is not necessary (burn below will run out of gas if not true), it\n // gives the user an explicit reason as to why the enqueue attempt failed.\n require(\n startingGas > gasToConsume,\n \"Insufficient gas for L2 rate limiting burn.\"\n );\n\n // Here we do some \"dumb\" work in order to burn gas, although we should probably replace\n // this with something like minting gas token later on.\n uint256 i;\n while(startingGas - gasleft() < gasToConsume) {\n i++;\n }\n\n bytes32 transactionHash = keccak256(\n abi.encode(\n msg.sender,\n _target,\n _gasLimit,\n _data\n )\n );\n\n bytes32 timestampAndBlockNumber;\n assembly {\n timestampAndBlockNumber := timestamp()\n timestampAndBlockNumber := or(timestampAndBlockNumber, shl(40, number()))\n }\n\n queue().push2(\n transactionHash,\n timestampAndBlockNumber\n );\n\n uint256 queueIndex = queue().length() / 2;\n emit TransactionEnqueued(\n msg.sender,\n _target,\n _gasLimit,\n _data,\n queueIndex - 1,\n block.timestamp\n );\n }\n\n /**\n * @inheritdoc iOVM_CanonicalTransactionChain\n */\n function appendQueueBatch(\n uint256 _numQueuedTransactions\n )\n override\n public\n {\n // Disable `appendQueueBatch` for minnet\n revert(\"appendQueueBatch is currently disabled.\");\n\n _numQueuedTransactions = Lib_Math.min(_numQueuedTransactions, getNumPendingQueueElements());\n require(\n _numQueuedTransactions > 0,\n \"Must append more than zero transactions.\"\n );\n\n bytes32[] memory leaves = new bytes32[](_numQueuedTransactions);\n uint40 nextQueueIndex = getNextQueueIndex();\n\n for (uint256 i = 0; i < _numQueuedTransactions; i++) {\n if (msg.sender != resolve(\"OVM_Sequencer\")) {\n Lib_OVMCodec.QueueElement memory el = getQueueElement(nextQueueIndex);\n require(\n el.timestamp + forceInclusionPeriodSeconds < block.timestamp,\n \"Queue transactions cannot be submitted during the sequencer inclusion period.\"\n );\n }\n leaves[i] = _getQueueLeafHash(nextQueueIndex);\n nextQueueIndex++;\n }\n\n Lib_OVMCodec.QueueElement memory lastElement = getQueueElement(nextQueueIndex - 1);\n\n _appendBatch(\n Lib_MerkleTree.getMerkleRoot(leaves),\n _numQueuedTransactions,\n _numQueuedTransactions,\n lastElement.timestamp,\n lastElement.blockNumber\n );\n\n emit QueueBatchAppended(\n nextQueueIndex - _numQueuedTransactions,\n _numQueuedTransactions,\n getTotalElements()\n );\n }\n\n /**\n * @inheritdoc iOVM_CanonicalTransactionChain\n */\n function appendSequencerBatch()\n override\n public\n {\n uint40 shouldStartAtElement;\n uint24 totalElementsToAppend;\n uint24 numContexts;\n assembly {\n shouldStartAtElement := shr(216, calldataload(4))\n totalElementsToAppend := shr(232, calldataload(9))\n numContexts := shr(232, calldataload(12))\n }\n\n require(\n shouldStartAtElement == getTotalElements(),\n \"Actual batch start index does not match expected start index.\"\n );\n\n require(\n msg.sender == resolve(\"OVM_Sequencer\"),\n \"Function can only be called by the Sequencer.\"\n );\n\n require(\n numContexts > 0,\n \"Must provide at least one batch context.\"\n );\n\n require(\n totalElementsToAppend > 0,\n \"Must append at least one element.\"\n );\n\n uint40 nextTransactionPtr = uint40(BATCH_CONTEXT_START_POS + BATCH_CONTEXT_SIZE * numContexts);\n uint256 calldataSize;\n assembly {\n calldataSize := calldatasize()\n }\n\n require(\n calldataSize >= nextTransactionPtr,\n \"Not enough BatchContexts provided.\"\n );\n\n // Get queue length for future comparison/\n uint40 queueLength = getQueueLength();\n\n // Initialize the array of canonical chain leaves that we will append.\n bytes32[] memory leaves = new bytes32[](totalElementsToAppend);\n // Each leaf index corresponds to a tx, either sequenced or enqueued.\n uint32 leafIndex = 0;\n // Counter for number of sequencer transactions appended so far.\n uint32 numSequencerTransactions = 0;\n // We will sequentially append leaves which are pointers to the queue.\n // The initial queue index is what is currently in storage.\n uint40 nextQueueIndex = getNextQueueIndex();\n\n BatchContext memory curContext;\n\n for (uint32 i = 0; i < numContexts; i++) {\n BatchContext memory nextContext = _getBatchContext(i);\n if (i == 0) {\n _validateFirstBatchContext(nextContext);\n }\n _validateNextBatchContext(curContext, nextContext, nextQueueIndex);\n\n curContext = nextContext;\n\n for (uint32 j = 0; j < curContext.numSequencedTransactions; j++) {\n uint256 txDataLength;\n assembly {\n txDataLength := shr(232, calldataload(nextTransactionPtr))\n }\n\n leaves[leafIndex] = _getSequencerLeafHash(curContext, nextTransactionPtr, txDataLength);\n nextTransactionPtr += uint40(TX_DATA_HEADER_SIZE + txDataLength);\n numSequencerTransactions++;\n leafIndex++;\n }\n\n for (uint32 j = 0; j < curContext.numSubsequentQueueTransactions; j++) {\n require(nextQueueIndex < queueLength, \"Not enough queued transactions to append.\");\n leaves[leafIndex] = _getQueueLeafHash(nextQueueIndex);\n nextQueueIndex++;\n leafIndex++;\n }\n }\n\n _validateFinalBatchContext(curContext);\n\n require(\n calldataSize == nextTransactionPtr,\n \"Not all sequencer transactions were processed.\"\n );\n\n require(\n leafIndex == totalElementsToAppend,\n \"Actual transaction index does not match expected total elements to append.\"\n );\n\n // Generate the required metadata that we need to append this batch\n uint40 numQueuedTransactions = totalElementsToAppend - numSequencerTransactions;\n uint40 timestamp;\n uint40 blockNumber;\n if (curContext.numSubsequentQueueTransactions == 0) {\n // The last element is a sequencer tx, therefore pull timestamp and block number from the last context.\n timestamp = uint40(curContext.timestamp);\n blockNumber = uint40(curContext.blockNumber);\n } else {\n // The last element is a queue tx, therefore pull timestamp and block number from the queue element.\n Lib_OVMCodec.QueueElement memory lastElement = getQueueElement(nextQueueIndex - 1);\n timestamp = lastElement.timestamp;\n blockNumber = lastElement.blockNumber;\n }\n\n _appendBatch(\n Lib_MerkleTree.getMerkleRoot(leaves),\n totalElementsToAppend,\n numQueuedTransactions,\n timestamp,\n blockNumber\n );\n\n emit SequencerBatchAppended(\n nextQueueIndex - numQueuedTransactions,\n numQueuedTransactions,\n getTotalElements()\n );\n }\n\n /**\n * @inheritdoc iOVM_CanonicalTransactionChain\n */\n function verifyTransaction(\n Lib_OVMCodec.Transaction memory _transaction,\n Lib_OVMCodec.TransactionChainElement memory _txChainElement,\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _inclusionProof\n )\n override\n public\n view\n returns (\n bool\n )\n {\n if (_txChainElement.isSequenced == true) {\n return _verifySequencerTransaction(\n _transaction,\n _txChainElement,\n _batchHeader,\n _inclusionProof\n );\n } else {\n return _verifyQueueTransaction(\n _transaction,\n _txChainElement.queueIndex,\n _batchHeader,\n _inclusionProof\n );\n }\n }\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Returns the BatchContext located at a particular index.\n * @param _index The index of the BatchContext\n * @return The BatchContext at the specified index.\n */\n function _getBatchContext(\n uint256 _index\n )\n internal\n pure\n returns (\n BatchContext memory\n )\n {\n uint256 contextPtr = 15 + _index * BATCH_CONTEXT_SIZE;\n uint256 numSequencedTransactions;\n uint256 numSubsequentQueueTransactions;\n uint256 ctxTimestamp;\n uint256 ctxBlockNumber;\n\n assembly {\n numSequencedTransactions := shr(232, calldataload(contextPtr))\n numSubsequentQueueTransactions := shr(232, calldataload(add(contextPtr, 3)))\n ctxTimestamp := shr(216, calldataload(add(contextPtr, 6)))\n ctxBlockNumber := shr(216, calldataload(add(contextPtr, 11)))\n }\n\n return BatchContext({\n numSequencedTransactions: numSequencedTransactions,\n numSubsequentQueueTransactions: numSubsequentQueueTransactions,\n timestamp: ctxTimestamp,\n blockNumber: ctxBlockNumber\n });\n }\n\n /**\n * Parses the batch context from the extra data.\n * @return Total number of elements submitted.\n * @return Index of the next queue element.\n */\n function _getBatchExtraData()\n internal\n view\n returns (\n uint40,\n uint40,\n uint40,\n uint40\n )\n {\n bytes27 extraData = batches().getGlobalMetadata();\n\n uint40 totalElements;\n uint40 nextQueueIndex;\n uint40 lastTimestamp;\n uint40 lastBlockNumber;\n assembly {\n extraData := shr(40, extraData)\n totalElements := and(extraData, 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF)\n nextQueueIndex := shr(40, and(extraData, 0x00000000000000000000000000000000000000000000FFFFFFFFFF0000000000))\n lastTimestamp := shr(80, and(extraData, 0x0000000000000000000000000000000000FFFFFFFFFF00000000000000000000))\n lastBlockNumber := shr(120, and(extraData, 0x000000000000000000000000FFFFFFFFFF000000000000000000000000000000))\n }\n\n return (\n totalElements,\n nextQueueIndex,\n lastTimestamp,\n lastBlockNumber\n );\n }\n\n /**\n * Encodes the batch context for the extra data.\n * @param _totalElements Total number of elements submitted.\n * @param _nextQueueIndex Index of the next queue element.\n * @param _timestamp Timestamp for the last batch.\n * @param _blockNumber Block number of the last batch.\n * @return Encoded batch context.\n */\n function _makeBatchExtraData(\n uint40 _totalElements,\n uint40 _nextQueueIndex,\n uint40 _timestamp,\n uint40 _blockNumber\n )\n internal\n pure\n returns (\n bytes27\n )\n {\n bytes27 extraData;\n assembly {\n extraData := _totalElements\n extraData := or(extraData, shl(40, _nextQueueIndex))\n extraData := or(extraData, shl(80, _timestamp))\n extraData := or(extraData, shl(120, _blockNumber))\n extraData := shl(40, extraData)\n }\n\n return extraData;\n }\n\n /**\n * Retrieves the hash of a queue element.\n * @param _index Index of the queue element to retrieve a hash for.\n * @return Hash of the queue element.\n */\n function _getQueueLeafHash(\n uint256 _index\n )\n internal\n view\n returns (\n bytes32\n )\n {\n return _hashTransactionChainElement(\n Lib_OVMCodec.TransactionChainElement({\n isSequenced: false,\n queueIndex: _index,\n timestamp: 0,\n blockNumber: 0,\n txData: hex\"\"\n })\n );\n }\n\n /**\n * Retrieves the length of the queue.\n * @return Length of the queue.\n */\n function _getQueueLength()\n internal\n view\n returns (\n uint40\n )\n {\n // The underlying queue data structure stores 2 elements\n // per insertion, so to get the real queue length we need\n // to divide by 2. See the usage of `push2(..)`.\n return uint40(queue().length() / 2);\n }\n\n /**\n * Retrieves the hash of a sequencer element.\n * @param _context Batch context for the given element.\n * @param _nextTransactionPtr Pointer to the next transaction in the calldata.\n * @param _txDataLength Length of the transaction item.\n * @return Hash of the sequencer element.\n */\n function _getSequencerLeafHash(\n BatchContext memory _context,\n uint256 _nextTransactionPtr,\n uint256 _txDataLength\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n\n bytes memory chainElement = new bytes(BYTES_TILL_TX_DATA + _txDataLength);\n uint256 ctxTimestamp = _context.timestamp;\n uint256 ctxBlockNumber = _context.blockNumber;\n\n bytes32 leafHash;\n assembly {\n let chainElementStart := add(chainElement, 0x20)\n\n // Set the first byte equal to `1` to indicate this is a sequencer chain element.\n // This distinguishes sequencer ChainElements from queue ChainElements because\n // all queue ChainElements are ABI encoded and the first byte of ABI encoded\n // elements is always zero\n mstore8(chainElementStart, 1)\n\n mstore(add(chainElementStart, 1), ctxTimestamp)\n mstore(add(chainElementStart, 33), ctxBlockNumber)\n\n calldatacopy(add(chainElementStart, BYTES_TILL_TX_DATA), add(_nextTransactionPtr, 3), _txDataLength)\n\n leafHash := keccak256(chainElementStart, add(BYTES_TILL_TX_DATA, _txDataLength))\n }\n\n return leafHash;\n }\n\n /**\n * Retrieves the hash of a sequencer element.\n * @param _txChainElement The chain element which is hashed to calculate the leaf.\n * @return Hash of the sequencer element.\n */\n function _getSequencerLeafHash(\n Lib_OVMCodec.TransactionChainElement memory _txChainElement\n )\n internal\n view\n returns(\n bytes32\n )\n {\n bytes memory txData = _txChainElement.txData;\n uint256 txDataLength = _txChainElement.txData.length;\n\n bytes memory chainElement = new bytes(BYTES_TILL_TX_DATA + txDataLength);\n uint256 ctxTimestamp = _txChainElement.timestamp;\n uint256 ctxBlockNumber = _txChainElement.blockNumber;\n\n bytes32 leafHash;\n assembly {\n let chainElementStart := add(chainElement, 0x20)\n\n // Set the first byte equal to `1` to indicate this is a sequencer chain element.\n // This distinguishes sequencer ChainElements from queue ChainElements because\n // all queue ChainElements are ABI encoded and the first byte of ABI encoded\n // elements is always zero\n mstore8(chainElementStart, 1)\n\n mstore(add(chainElementStart, 1), ctxTimestamp)\n mstore(add(chainElementStart, 33), ctxBlockNumber)\n\n pop(staticcall(gas(), 0x04, add(txData, 0x20), txDataLength, add(chainElementStart, BYTES_TILL_TX_DATA), txDataLength))\n\n leafHash := keccak256(chainElementStart, add(BYTES_TILL_TX_DATA, txDataLength))\n }\n\n return leafHash;\n }\n\n /**\n * Inserts a batch into the chain of batches.\n * @param _transactionRoot Root of the transaction tree for this batch.\n * @param _batchSize Number of elements in the batch.\n * @param _numQueuedTransactions Number of queue transactions in the batch.\n * @param _timestamp The latest batch timestamp.\n * @param _blockNumber The latest batch blockNumber.\n */\n function _appendBatch(\n bytes32 _transactionRoot,\n uint256 _batchSize,\n uint256 _numQueuedTransactions,\n uint40 _timestamp,\n uint40 _blockNumber\n )\n internal\n {\n (uint40 totalElements, uint40 nextQueueIndex, uint40 lastTimestamp, uint40 lastBlockNumber) = _getBatchExtraData();\n\n Lib_OVMCodec.ChainBatchHeader memory header = Lib_OVMCodec.ChainBatchHeader({\n batchIndex: batches().length(),\n batchRoot: _transactionRoot,\n batchSize: _batchSize,\n prevTotalElements: totalElements,\n extraData: hex\"\"\n });\n\n emit TransactionBatchAppended(\n header.batchIndex,\n header.batchRoot,\n header.batchSize,\n header.prevTotalElements,\n header.extraData\n );\n\n bytes32 batchHeaderHash = Lib_OVMCodec.hashBatchHeader(header);\n bytes27 latestBatchContext = _makeBatchExtraData(\n totalElements + uint40(header.batchSize),\n nextQueueIndex + uint40(_numQueuedTransactions),\n _timestamp,\n _blockNumber\n );\n\n batches().push(batchHeaderHash, latestBatchContext);\n }\n\n /**\n * Checks that the first batch context in a sequencer submission is valid\n * @param _firstContext The batch context to validate.\n */\n function _validateFirstBatchContext(\n BatchContext memory _firstContext\n )\n internal\n view\n {\n // If there are existing elements, this batch must come later.\n if (getTotalElements() > 0) {\n (,, uint40 lastTimestamp, uint40 lastBlockNumber) = _getBatchExtraData();\n require(_firstContext.blockNumber >= lastBlockNumber, \"Context block number is lower than last submitted.\");\n require(_firstContext.timestamp >= lastTimestamp, \"Context timestamp is lower than last submitted.\");\n }\n // Sequencer cannot submit contexts which are more than the force inclusion period old.\n require(_firstContext.timestamp + forceInclusionPeriodSeconds >= block.timestamp, \"Context timestamp too far in the past.\");\n require(_firstContext.blockNumber + forceInclusionPeriodBlocks >= block.number, \"Context block number too far in the past.\");\n }\n\n /**\n * Checks that a given batch context is valid based on its previous context, and the next queue elemtent.\n * @param _prevContext The previously validated batch context.\n * @param _nextContext The batch context to validate with this call.\n * @param _nextQueueIndex Index of the next queue element to process for the _nextContext's subsequentQueueElements.\n */\n function _validateNextBatchContext(\n BatchContext memory _prevContext,\n BatchContext memory _nextContext,\n uint40 _nextQueueIndex\n )\n internal\n view\n {\n // All sequencer transactions' times must increase from the previous ones.\n require(\n _nextContext.timestamp >= _prevContext.timestamp,\n \"Context timestamp values must monotonically increase.\"\n );\n\n require(\n _nextContext.blockNumber >= _prevContext.blockNumber,\n \"Context blockNumber values must monotonically increase.\"\n );\n\n // If there are some queue elements pending:\n if (getQueueLength() - _nextQueueIndex > 0) {\n Lib_OVMCodec.QueueElement memory nextQueueElement = getQueueElement(_nextQueueIndex);\n\n // If the force inclusion period has passed for an enqueued transaction, it MUST be the next chain element.\n require(\n block.timestamp < nextQueueElement.timestamp + forceInclusionPeriodSeconds,\n \"Previously enqueued batches have expired and must be appended before a new sequencer batch.\"\n );\n\n // Just like sequencer transaction times must be increasing relative to each other,\n // We also require that they be increasing relative to any interspersed queue elements.\n require(\n _nextContext.timestamp <= nextQueueElement.timestamp,\n \"Sequencer transaction timestamp exceeds that of next queue element.\"\n );\n\n require(\n _nextContext.blockNumber <= nextQueueElement.blockNumber,\n \"Sequencer transaction blockNumber exceeds that of next queue element.\"\n );\n } \n }\n\n /**\n * Checks that the final batch context in a sequencer submission is valid.\n * @param _finalContext The batch context to validate.\n */\n function _validateFinalBatchContext(\n BatchContext memory _finalContext\n )\n internal\n view\n {\n // Batches cannot be added from the future, or subsequent enqueue() contexts would violate monotonicity.\n require(_finalContext.timestamp <= block.timestamp, \"Context timestamp is from the future.\");\n require(_finalContext.blockNumber <= block.number, \"Context block number is from the future.\");\n }\n\n /**\n * Hashes a transaction chain element.\n * @param _element Chain element to hash.\n * @return Hash of the chain element.\n */\n function _hashTransactionChainElement(\n Lib_OVMCodec.TransactionChainElement memory _element\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n return keccak256(\n abi.encode(\n _element.isSequenced,\n _element.queueIndex,\n _element.timestamp,\n _element.blockNumber,\n _element.txData\n )\n );\n }\n\n /**\n * Verifies a sequencer transaction, returning true if it was indeed included in the CTC\n * @param _transaction The transaction we are verifying inclusion of.\n * @param _txChainElement The chain element that the transaction is claimed to be a part of.\n * @param _batchHeader Header of the batch the transaction was included in.\n * @param _inclusionProof An inclusion proof into the CTC at a particular index.\n * @return True if the transaction was included in the specified location, else false.\n */\n function _verifySequencerTransaction(\n Lib_OVMCodec.Transaction memory _transaction,\n Lib_OVMCodec.TransactionChainElement memory _txChainElement,\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _inclusionProof\n )\n internal\n view\n returns (\n bool\n )\n {\n OVM_ExecutionManager ovmExecutionManager = OVM_ExecutionManager(resolve(\"OVM_ExecutionManager\"));\n uint256 gasLimit = ovmExecutionManager.getMaxTransactionGasLimit();\n bytes32 leafHash = _getSequencerLeafHash(_txChainElement);\n\n require(\n _verifyElement(\n leafHash,\n _batchHeader,\n _inclusionProof\n ),\n \"Invalid Sequencer transaction inclusion proof.\"\n );\n\n require(\n _transaction.blockNumber == _txChainElement.blockNumber\n && _transaction.timestamp == _txChainElement.timestamp\n && _transaction.entrypoint == resolve(\"OVM_DecompressionPrecompileAddress\")\n && _transaction.gasLimit == gasLimit\n && _transaction.l1TxOrigin == address(0)\n && _transaction.l1QueueOrigin == Lib_OVMCodec.QueueOrigin.SEQUENCER_QUEUE\n && keccak256(_transaction.data) == keccak256(_txChainElement.txData),\n \"Invalid Sequencer transaction.\"\n );\n\n return true;\n }\n\n /**\n * Verifies a queue transaction, returning true if it was indeed included in the CTC\n * @param _transaction The transaction we are verifying inclusion of.\n * @param _queueIndex The queueIndex of the queued transaction.\n * @param _batchHeader Header of the batch the transaction was included in.\n * @param _inclusionProof An inclusion proof into the CTC at a particular index (should point to queue tx).\n * @return True if the transaction was included in the specified location, else false.\n */\n function _verifyQueueTransaction(\n Lib_OVMCodec.Transaction memory _transaction,\n uint256 _queueIndex,\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _inclusionProof\n )\n internal\n view\n returns (\n bool\n )\n {\n bytes32 leafHash = _getQueueLeafHash(_queueIndex);\n\n require(\n _verifyElement(\n leafHash,\n _batchHeader,\n _inclusionProof\n ),\n \"Invalid Queue transaction inclusion proof.\"\n );\n\n bytes32 transactionHash = keccak256(\n abi.encode(\n _transaction.l1TxOrigin,\n _transaction.entrypoint,\n _transaction.gasLimit,\n _transaction.data\n )\n );\n\n Lib_OVMCodec.QueueElement memory el = getQueueElement(_queueIndex);\n require(\n el.queueRoot == transactionHash\n && el.timestamp == _transaction.timestamp\n && el.blockNumber == _transaction.blockNumber,\n \"Invalid Queue transaction.\"\n );\n\n return true;\n }\n\n /**\n * Verifies a batch inclusion proof.\n * @param _element Hash of the element to verify a proof for.\n * @param _batchHeader Header of the batch in which the element was included.\n * @param _proof Merkle inclusion proof for the element.\n */\n function _verifyElement(\n bytes32 _element,\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _proof\n )\n internal\n view\n returns (\n bool\n )\n {\n require(\n Lib_OVMCodec.hashBatchHeader(_batchHeader) == batches().get(uint32(_batchHeader.batchIndex)),\n \"Invalid batch header.\"\n );\n\n require(\n Lib_MerkleTree.verify(\n _batchHeader.batchRoot,\n _element,\n _proof.index,\n _proof.siblings,\n _batchHeader.batchSize\n ),\n \"Invalid inclusion proof.\"\n );\n\n return true;\n }\n}\n" - }, - "contracts/optimistic-ethereum/libraries/utils/Lib_Math.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.7.0;\n\n/**\n * @title Lib_Math\n */\nlibrary Lib_Math {\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Calculates the minumum of two numbers.\n * @param _x First number to compare.\n * @param _y Second number to compare.\n * @return Lesser of the two numbers.\n */\n function min(\n uint256 _x,\n uint256 _y\n )\n internal\n pure\n returns (\n uint256\n )\n {\n if (_x < _y) {\n return _x;\n }\n\n return _y;\n }\n}\n" - }, - "contracts/optimistic-ethereum/OVM/bridge/OVM_L1CrossDomainMessenger.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\nimport { Lib_AddressManager } from \"../../libraries/resolver/Lib_AddressManager.sol\";\nimport { Lib_SecureMerkleTrie } from \"../../libraries/trie/Lib_SecureMerkleTrie.sol\";\nimport { Lib_ReentrancyGuard } from \"../../libraries/utils/Lib_ReentrancyGuard.sol\";\n\n/* Interface Imports */\nimport { iOVM_L1CrossDomainMessenger } from \"../../iOVM/bridge/iOVM_L1CrossDomainMessenger.sol\";\nimport { iOVM_CanonicalTransactionChain } from \"../../iOVM/chain/iOVM_CanonicalTransactionChain.sol\";\nimport { iOVM_StateCommitmentChain } from \"../../iOVM/chain/iOVM_StateCommitmentChain.sol\";\n\n/* Contract Imports */\nimport { OVM_BaseCrossDomainMessenger } from \"./OVM_BaseCrossDomainMessenger.sol\";\n\n/**\n * @title OVM_L1CrossDomainMessenger\n * @dev This contract lives on L1. It sends L1->L2 messages into L2, and relays L2->L1 messages from L2 to their target on L1.\n */\ncontract OVM_L1CrossDomainMessenger is iOVM_L1CrossDomainMessenger, OVM_BaseCrossDomainMessenger, Lib_AddressResolver {\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * Pass a default zero address to the address resolver. This will be updated when initialized.\n */\n constructor()\n Lib_AddressResolver(address(0))\n {}\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n function initialize(\n address _libAddressManager\n )\n public\n {\n require(address(libAddressManager) == address(0), \"L1CrossDomainMessenger already intialized.\");\n libAddressManager = Lib_AddressManager(_libAddressManager);\n }\n\n\n /**********************\n * Function Modifiers *\n **********************/\n\n /**\n * Modifier to enforce that, if configured, only the OVM_L2MessageRelayer contract may successfully call a method.\n */\n modifier onlyRelayer() {\n address relayer = resolve(\"OVM_L2MessageRelayer\");\n if (relayer != address(0)) {\n require(\n msg.sender == relayer,\n \"Only OVM_L2MessageRelayer can relay L2-to-L1 messages.\"\n );\n }\n _;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Relays a cross domain message to a contract.\n * @inheritdoc iOVM_L1CrossDomainMessenger\n */\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce,\n L2MessageInclusionProof memory _proof\n )\n override\n public\n nonReentrant\n onlyRelayer()\n {\n bytes memory xDomainCalldata = _getXDomainCalldata(\n _target,\n _sender,\n _message,\n _messageNonce\n );\n\n require(\n _verifyXDomainMessage(\n xDomainCalldata,\n _proof\n ) == true,\n \"Provided message could not be verified.\"\n );\n\n bytes32 xDomainCalldataHash = keccak256(xDomainCalldata);\n\n require(\n successfulMessages[xDomainCalldataHash] == false,\n \"Provided message has already been received.\"\n );\n\n xDomainMessageSender = _sender;\n (bool success, ) = _target.call(_message);\n\n // Mark the message as received if the call was successful. Ensures that a message can be\n // relayed multiple times in the case that the call reverted.\n if (success == true) {\n successfulMessages[xDomainCalldataHash] = true;\n emit RelayedMessage(xDomainCalldataHash);\n }\n\n // Store an identifier that can be used to prove that the given message was relayed by some\n // user. Gives us an easy way to pay relayers for their work.\n bytes32 relayId = keccak256(\n abi.encodePacked(\n xDomainCalldata,\n msg.sender,\n block.number\n )\n );\n relayedMessages[relayId] = true;\n }\n\n /**\n * Replays a cross domain message to the target messenger.\n * @inheritdoc iOVM_L1CrossDomainMessenger\n */\n function replayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce,\n uint32 _gasLimit\n )\n override\n public\n {\n bytes memory xDomainCalldata = _getXDomainCalldata(\n _target,\n _sender,\n _message,\n _messageNonce\n );\n\n require(\n sentMessages[keccak256(xDomainCalldata)] == true,\n \"Provided message has not already been sent.\"\n );\n\n _sendXDomainMessage(xDomainCalldata, _gasLimit);\n }\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Verifies that the given message is valid.\n * @param _xDomainCalldata Calldata to verify.\n * @param _proof Inclusion proof for the message.\n * @return Whether or not the provided message is valid.\n */\n function _verifyXDomainMessage(\n bytes memory _xDomainCalldata,\n L2MessageInclusionProof memory _proof\n )\n internal\n view\n returns (\n bool\n )\n {\n return (\n _verifyStateRootProof(_proof)\n && _verifyStorageProof(_xDomainCalldata, _proof)\n );\n }\n\n /**\n * Verifies that the state root within an inclusion proof is valid.\n * @param _proof Message inclusion proof.\n * @return Whether or not the provided proof is valid.\n */\n function _verifyStateRootProof(\n L2MessageInclusionProof memory _proof\n )\n internal\n view\n returns (\n bool\n )\n {\n iOVM_StateCommitmentChain ovmStateCommitmentChain = iOVM_StateCommitmentChain(resolve(\"OVM_StateCommitmentChain\"));\n\n return (\n ovmStateCommitmentChain.insideFraudProofWindow(_proof.stateRootBatchHeader) == false\n && ovmStateCommitmentChain.verifyStateCommitment(\n _proof.stateRoot,\n _proof.stateRootBatchHeader,\n _proof.stateRootProof\n )\n );\n }\n\n /**\n * Verifies that the storage proof within an inclusion proof is valid.\n * @param _xDomainCalldata Encoded message calldata.\n * @param _proof Message inclusion proof.\n * @return Whether or not the provided proof is valid.\n */\n function _verifyStorageProof(\n bytes memory _xDomainCalldata,\n L2MessageInclusionProof memory _proof\n )\n internal\n view\n returns (\n bool\n )\n {\n bytes32 storageKey = keccak256(\n abi.encodePacked(\n keccak256(\n abi.encodePacked(\n _xDomainCalldata,\n resolve(\"OVM_L2CrossDomainMessenger\")\n )\n ),\n uint256(0)\n )\n );\n\n (\n bool exists,\n bytes memory encodedMessagePassingAccount\n ) = Lib_SecureMerkleTrie.get(\n abi.encodePacked(0x4200000000000000000000000000000000000000),\n _proof.stateTrieWitness,\n _proof.stateRoot\n );\n\n require(\n exists == true,\n \"Message passing precompile has not been initialized or invalid proof provided.\"\n );\n\n Lib_OVMCodec.EVMAccount memory account = Lib_OVMCodec.decodeEVMAccount(\n encodedMessagePassingAccount\n );\n\n return Lib_SecureMerkleTrie.verifyInclusionProof(\n abi.encodePacked(storageKey),\n abi.encodePacked(uint8(1)),\n _proof.storageTrieWitness,\n account.storageRoot\n );\n }\n\n /**\n * Sends a cross domain message.\n * @param _message Message to send.\n * @param _gasLimit OVM gas limit for the message.\n */\n function _sendXDomainMessage(\n bytes memory _message,\n uint256 _gasLimit\n )\n override\n internal\n {\n iOVM_CanonicalTransactionChain(resolve(\"OVM_CanonicalTransactionChain\")).enqueue(\n resolve(\"OVM_L2CrossDomainMessenger\"),\n _gasLimit,\n _message\n );\n }\n}\n" - }, - "contracts/optimistic-ethereum/libraries/utils/Lib_ReentrancyGuard.sol": { - "content": "// SPDX-License-Identifier: MIT\n// +build ovm\npragma solidity >0.5.0 <0.8.0;\n\n/**\n * @dev Contract module that helps prevent reentrant calls to a function.\n *\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\n * available, which can be applied to functions to make sure there are no nested\n * (reentrant) calls to them.\n *\n * Note that because there is a single `nonReentrant` guard, functions marked as\n * `nonReentrant` may not call one another. This can be worked around by making\n * those functions `private`, and then adding `external` `nonReentrant` entry\n * points to them.\n *\n * TIP: If you would like to learn more about reentrancy and alternative ways\n * to protect against it, check out our blog post\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\n */\nabstract contract Lib_ReentrancyGuard {\n // Booleans are more expensive than uint256 or any type that takes up a full\n // word because each write operation emits an extra SLOAD to first read the\n // slot's contents, replace the bits taken up by the boolean, and then write\n // back. This is the compiler's defense against contract upgrades and\n // pointer aliasing, and it cannot be disabled.\n\n // The values being non-zero value makes deployment a bit more expensive,\n // but in exchange the refund on every call to nonReentrant will be lower in\n // amount. Since refunds are capped to a percentage of the total\n // transaction's gas, it is best to keep them low in cases like this one, to\n // increase the likelihood of the full refund coming into effect.\n uint256 private constant _NOT_ENTERED = 1;\n uint256 private constant _ENTERED = 2;\n\n uint256 private _status;\n\n constructor () internal {\n _status = _NOT_ENTERED;\n }\n\n /**\n * @dev Prevents a contract from calling itself, directly or indirectly.\n * Calling a `nonReentrant` function from another `nonReentrant`\n * function is not supported. It is possible to prevent this from happening\n * by making the `nonReentrant` function external, and make it call a\n * `private` function that does the actual work.\n */\n modifier nonReentrant() {\n // On the first call to nonReentrant, _notEntered will be true\n require(_status != _ENTERED, \"ReentrancyGuard: reentrant call\");\n\n // Any calls to nonReentrant after this point will fail\n _status = _ENTERED;\n\n _;\n\n // By storing the original value once again, a refund is triggered (see\n // https://eips.ethereum.org/EIPS/eip-2200)\n _status = _NOT_ENTERED;\n }\n}\n" - }, - "contracts/optimistic-ethereum/iOVM/bridge/iOVM_L1CrossDomainMessenger.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/* Interface Imports */\nimport { iOVM_BaseCrossDomainMessenger } from \"./iOVM_BaseCrossDomainMessenger.sol\";\n\n/**\n * @title iOVM_L1CrossDomainMessenger\n */\ninterface iOVM_L1CrossDomainMessenger is iOVM_BaseCrossDomainMessenger {\n\n /*******************\n * Data Structures *\n *******************/\n\n struct L2MessageInclusionProof {\n bytes32 stateRoot;\n Lib_OVMCodec.ChainBatchHeader stateRootBatchHeader;\n Lib_OVMCodec.ChainInclusionProof stateRootProof;\n bytes stateTrieWitness;\n bytes storageTrieWitness;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Relays a cross domain message to a contract.\n * @param _target Target contract address.\n * @param _sender Message sender address.\n * @param _message Message to send to the target.\n * @param _messageNonce Nonce for the provided message.\n * @param _proof Inclusion proof for the given message.\n */\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce,\n L2MessageInclusionProof memory _proof\n ) external;\n\n /**\n * Replays a cross domain message to the target messenger.\n * @param _target Target contract address.\n * @param _sender Original sender address.\n * @param _message Message to send to the target.\n * @param _messageNonce Nonce for the provided message.\n * @param _gasLimit Gas limit for the provided message.\n */\n function replayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce,\n uint32 _gasLimit\n ) external;\n}\n" - }, - "contracts/optimistic-ethereum/OVM/bridge/OVM_BaseCrossDomainMessenger.sol": { - "content": "// SPDX-License-Identifier: MIT\n// +build ovm\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Interface Imports */\nimport { iOVM_BaseCrossDomainMessenger } from \"../../iOVM/bridge/iOVM_BaseCrossDomainMessenger.sol\";\n\n/* Library Imports */\nimport { Lib_ReentrancyGuard } from \"../../libraries/utils/Lib_ReentrancyGuard.sol\";\n\n/**\n * @title OVM_BaseCrossDomainMessenger\n */\nabstract contract OVM_BaseCrossDomainMessenger is iOVM_BaseCrossDomainMessenger, Lib_ReentrancyGuard {\n\n /**********************\n * Contract Variables *\n **********************/\n\n mapping (bytes32 => bool) public relayedMessages;\n mapping (bytes32 => bool) public successfulMessages;\n mapping (bytes32 => bool) public sentMessages;\n uint256 public messageNonce;\n address override public xDomainMessageSender;\n\n /********************\n * Public Functions *\n ********************/\n\n constructor() Lib_ReentrancyGuard() internal {}\n\n /**\n * Sends a cross domain message to the target messenger.\n * @param _target Target contract address.\n * @param _message Message to send to the target.\n * @param _gasLimit Gas limit for the provided message.\n */\n function sendMessage(\n address _target,\n bytes memory _message,\n uint32 _gasLimit\n )\n override\n public\n {\n bytes memory xDomainCalldata = _getXDomainCalldata(\n _target,\n msg.sender,\n _message,\n messageNonce\n );\n\n messageNonce += 1;\n sentMessages[keccak256(xDomainCalldata)] = true;\n\n _sendXDomainMessage(xDomainCalldata, _gasLimit);\n emit SentMessage(xDomainCalldata);\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Generates the correct cross domain calldata for a message.\n * @param _target Target contract address.\n * @param _sender Message sender address.\n * @param _message Message to send to the target.\n * @param _messageNonce Nonce for the provided message.\n * @return ABI encoded cross domain calldata.\n */\n function _getXDomainCalldata(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n return abi.encodeWithSignature(\n \"relayMessage(address,address,bytes,uint256)\",\n _target,\n _sender,\n _message,\n _messageNonce\n );\n }\n\n /**\n * Sends a cross domain message.\n * @param _message Message to send.\n * @param _gasLimit Gas limit for the provided message.\n */\n function _sendXDomainMessage(\n bytes memory _message,\n uint256 _gasLimit\n )\n virtual\n internal\n {\n revert(\"Implement me in child contracts!\");\n }\n}\n" - }, - "contracts/optimistic-ethereum/iOVM/bridge/iOVM_BaseCrossDomainMessenger.sol": { - "content": "// SPDX-License-Identifier: MIT\n// +build ovm\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/**\n * @title iOVM_BaseCrossDomainMessenger\n */\ninterface iOVM_BaseCrossDomainMessenger {\n\n /**********\n * Events *\n **********/\n event SentMessage(bytes message);\n event RelayedMessage(bytes32 msgHash);\n\n /**********************\n * Contract Variables *\n **********************/\n function xDomainMessageSender() external view returns (address);\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Sends a cross domain message to the target messenger.\n * @param _target Target contract address.\n * @param _message Message to send to the target.\n * @param _gasLimit Gas limit for the provided message.\n */\n function sendMessage(\n address _target,\n bytes calldata _message,\n uint32 _gasLimit\n ) external;\n}\n" - }, - "contracts/optimistic-ethereum/OVM/bridge/OVM_L2CrossDomainMessenger.sol": { - "content": "// SPDX-License-Identifier: MIT\n// +build ovm\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\nimport { Lib_ReentrancyGuard } from \"../../libraries/utils/Lib_ReentrancyGuard.sol\";\n\n/* Interface Imports */\nimport { iOVM_L2CrossDomainMessenger } from \"../../iOVM/bridge/iOVM_L2CrossDomainMessenger.sol\";\nimport { iOVM_L1MessageSender } from \"../../iOVM/precompiles/iOVM_L1MessageSender.sol\";\nimport { iOVM_L2ToL1MessagePasser } from \"../../iOVM/precompiles/iOVM_L2ToL1MessagePasser.sol\";\n\n/* Contract Imports */\nimport { OVM_BaseCrossDomainMessenger } from \"./OVM_BaseCrossDomainMessenger.sol\";\n\n/**\n * @title OVM_L2CrossDomainMessenger\n * @dev L2 CONTRACT (COMPILED)\n * This contract lives on L2. It sends messages to L1, and relays them from L1.\n */\ncontract OVM_L2CrossDomainMessenger is iOVM_L2CrossDomainMessenger, OVM_BaseCrossDomainMessenger, Lib_AddressResolver {\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n constructor(\n address _libAddressManager\n )\n public\n Lib_AddressResolver(_libAddressManager)\n {}\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Relays a cross domain message to a contract.\n * @inheritdoc iOVM_L2CrossDomainMessenger\n */\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce\n )\n override\n nonReentrant\n public\n {\n require(\n _verifyXDomainMessage() == true,\n \"Provided message could not be verified.\"\n );\n\n bytes memory xDomainCalldata = _getXDomainCalldata(\n _target,\n _sender,\n _message,\n _messageNonce\n );\n\n bytes32 xDomainCalldataHash = keccak256(xDomainCalldata);\n\n require(\n successfulMessages[xDomainCalldataHash] == false,\n \"Provided message has already been received.\"\n );\n\n xDomainMessageSender = _sender;\n (bool success, ) = _target.call(_message);\n\n // Mark the message as received if the call was successful. Ensures that a message can be\n // relayed multiple times in the case that the call reverted.\n if (success == true) {\n successfulMessages[xDomainCalldataHash] = true;\n emit RelayedMessage(xDomainCalldataHash);\n }\n\n // Store an identifier that can be used to prove that the given message was relayed by some\n // user. Gives us an easy way to pay relayers for their work.\n bytes32 relayId = keccak256(\n abi.encodePacked(\n xDomainCalldata,\n msg.sender,\n block.number\n )\n );\n relayedMessages[relayId] = true;\n }\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Verifies that a received cross domain message is valid.\n * @return _valid Whether or not the message is valid.\n */\n function _verifyXDomainMessage()\n internal\n returns (\n bool _valid\n )\n {\n return (\n iOVM_L1MessageSender(resolve(\"OVM_L1MessageSender\")).getL1MessageSender() == resolve(\"OVM_L1CrossDomainMessenger\")\n );\n }\n\n /**\n * Sends a cross domain message.\n * @param _message Message to send.\n * @param _gasLimit Gas limit for the provided message.\n */\n function _sendXDomainMessage(\n bytes memory _message,\n uint256 _gasLimit\n )\n override\n internal\n {\n iOVM_L2ToL1MessagePasser(resolve(\"OVM_L2ToL1MessagePasser\")).passMessageToL1(_message);\n }\n}\n" - }, - "contracts/optimistic-ethereum/iOVM/bridge/iOVM_L2CrossDomainMessenger.sol": { - "content": "// SPDX-License-Identifier: MIT\n// +build ovm\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Interface Imports */\nimport { iOVM_BaseCrossDomainMessenger } from \"./iOVM_BaseCrossDomainMessenger.sol\";\n\n/**\n * @title iOVM_L2CrossDomainMessenger\n */\ninterface iOVM_L2CrossDomainMessenger is iOVM_BaseCrossDomainMessenger {\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Relays a cross domain message to a contract.\n * @param _target Target contract address.\n * @param _sender Message sender address.\n * @param _message Message to send to the target.\n * @param _messageNonce Nonce for the provided message.\n */\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce\n ) external;\n}\n" - }, - "contracts/optimistic-ethereum/iOVM/precompiles/iOVM_L1MessageSender.sol": { - "content": "// SPDX-License-Identifier: MIT\n// +build ovm\npragma solidity >0.5.0 <0.8.0;\n\n/**\n * @title iOVM_L1MessageSender\n */\ninterface iOVM_L1MessageSender {\n\n /********************\n * Public Functions *\n ********************/\n\n function getL1MessageSender() external returns (address _l1MessageSender);\n}\n" - }, - "contracts/optimistic-ethereum/iOVM/precompiles/iOVM_L2ToL1MessagePasser.sol": { - "content": "// SPDX-License-Identifier: MIT\n// +build ovm\npragma solidity >0.5.0 <0.8.0;\n\n/**\n * @title iOVM_L2ToL1MessagePasser\n */\ninterface iOVM_L2ToL1MessagePasser {\n\n /**********\n * Events *\n **********/\n\n event L2ToL1Message(\n uint256 _nonce,\n address _sender,\n bytes _data\n );\n\n\n /********************\n * Public Functions *\n ********************/\n\n function passMessageToL1(bytes calldata _message) external;\n}\n" - }, - "contracts/optimistic-ethereum/OVM/precompiles/OVM_L2ToL1MessagePasser.sol": { - "content": "// SPDX-License-Identifier: MIT\n// +build ovm\npragma solidity >0.5.0 <0.8.0;\n\n/* Interface Imports */\nimport { iOVM_L2ToL1MessagePasser } from \"../../iOVM/precompiles/iOVM_L2ToL1MessagePasser.sol\";\n\n/**\n * @title OVM_L2ToL1MessagePasser\n * @dev L2 CONTRACT (COMPILED)\n */\ncontract OVM_L2ToL1MessagePasser is iOVM_L2ToL1MessagePasser {\n\n /**********************\n * Contract Variables *\n **********************/\n\n mapping (bytes32 => bool) public sentMessages;\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Passes a message to L1.\n * @param _message Message to pass to L1.\n */\n function passMessageToL1(\n bytes memory _message\n )\n override\n public\n {\n sentMessages[keccak256(\n abi.encodePacked(\n _message,\n msg.sender\n )\n )] = true;\n }\n}\n" - }, - "contracts/optimistic-ethereum/OVM/precompiles/OVM_L1MessageSender.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.7.0;\n\n/* Interface Imports */\nimport { iOVM_L1MessageSender } from \"../../iOVM/precompiles/iOVM_L1MessageSender.sol\";\nimport { iOVM_ExecutionManager } from \"../../iOVM/execution/iOVM_ExecutionManager.sol\";\n\n/**\n * @title OVM_L1MessageSender\n * @dev L2 CONTRACT (NOT COMPILED)\n */\ncontract OVM_L1MessageSender is iOVM_L1MessageSender {\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @return _l1MessageSender L1 message sender address (msg.sender).\n */\n function getL1MessageSender()\n override\n public\n view\n returns (\n address _l1MessageSender\n )\n {\n return iOVM_ExecutionManager(msg.sender).ovmL1TXORIGIN();\n }\n}\n" - }, - "contracts/optimistic-ethereum/OVM/precompiles/OVM_ETH.sol": { - "content": "// SPDX-License-Identifier: MIT\n// +build ovm\npragma solidity >0.5.0 <0.8.0;\n\n/* Library Imports */\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/* Interface Imports */\nimport { iOVM_ERC20 } from \"../../iOVM/precompiles/iOVM_ERC20.sol\";\nimport { iOVM_BaseCrossDomainMessenger } from \"../../iOVM/bridge/iOVM_BaseCrossDomainMessenger.sol\";\n\n/**\n * @title OVM_ETH\n * @dev L2 CONTRACT (COMPILED)\n */\ncontract OVM_ETH is iOVM_ERC20, Lib_AddressResolver {\n\n uint256 constant private MAX_UINT256 = 2**256 - 1;\n mapping (address => uint256) public balances;\n mapping (address => mapping (address => uint256)) public allowed;\n /*\n NOTE:\n The following variables are OPTIONAL vanities. One does not have to include them.\n They allow one to customise the token contract & in no way influences the core functionality.\n Some wallets/interfaces might not even bother to look at this information.\n */\n string public name; //fancy name: eg OVM Coin\n uint8 public decimals; //How many decimals to show.\n string public symbol; //An identifier: eg OVM\n uint256 public override totalSupply;\n\n constructor(\n address _libAddressManager,\n uint256 _initialAmount,\n string memory _tokenName,\n uint8 _decimalUnits,\n string memory _tokenSymbol\n )\n public\n Lib_AddressResolver(_libAddressManager)\n {\n balances[msg.sender] = _initialAmount; // Give the creator all initial tokens\n totalSupply = _initialAmount; // Update total supply\n name = _tokenName; // Set the name for display purposes\n decimals = _decimalUnits; // Amount of decimals for display purposes\n symbol = _tokenSymbol; // Set the symbol for display purposes\n }\n\n modifier onlyOVMETHBridge() {\n address bridgeOnL2 = resolve(\"OVM_L2ETHBridge\");\n require(bridgeOnL2 != address(0), \"OVM_L2ETHBridge is not yet initialized.\");\n require(msg.sender == bridgeOnL2, \"Only callable by OVM ETH Deposit/Withdrawal contract\");\n _;\n }\n\n function transfer(address _to, uint256 _value) external override returns (bool success) {\n require(balances[msg.sender] >= _value);\n balances[msg.sender] -= _value;\n balances[_to] += _value;\n emit Transfer(msg.sender, _to, _value);\n return true;\n }\n\n function transferFrom(address _from, address _to, uint256 _value) external override returns (bool success) {\n uint256 allowance = allowed[_from][msg.sender];\n require(balances[_from] >= _value && allowance >= _value);\n balances[_to] += _value;\n balances[_from] -= _value;\n if (allowance < MAX_UINT256) {\n allowed[_from][msg.sender] -= _value;\n }\n emit Transfer(_from, _to, _value);\n return true;\n }\n\n function balanceOf(address _owner) external view override returns (uint256 balance) {\n return balances[_owner];\n }\n\n function approve(address _spender, uint256 _value) external override returns (bool success) {\n allowed[msg.sender][_spender] = _value;\n emit Approval(msg.sender, _spender, _value);\n return true;\n }\n\n function allowance(address _owner, address _spender) external view override returns (uint256 remaining) {\n return allowed[_owner][_spender];\n }\n\n function mint(address _account, uint256 _amount) external onlyOVMETHBridge returns (bool success) {\n uint256 newTotalSupply = totalSupply + _amount;\n require(newTotalSupply >= totalSupply, \"SafeMath: addition overflow\");\n totalSupply = newTotalSupply;\n balances[_account] += _amount;\n\n emit Mint(_account, _amount);\n return true;\n }\n\n function burn(address _account, uint256 _amount) external onlyOVMETHBridge returns (bool success) {\n require(balances[_account] >= _amount, \"Unable to burn due to insufficient balance\");\n balances[_account] -= _amount;\n totalSupply -= _amount;\n\n emit Burn(_account, _amount);\n return true;\n }\n}\n" - }, - "contracts/optimistic-ethereum/iOVM/precompiles/iOVM_ERC20.sol": { - "content": "// SPDX-License-Identifier: MIT\n// +build ovm\npragma solidity >0.5.0 <0.8.0;\n\n/**\n * @title iOVM_ERC20\n */\ninterface iOVM_ERC20 {\n /* This is a slight change to the ERC20 base standard.\n function totalSupply() constant returns (uint256 supply);\n is replaced with:\n uint256 public totalSupply;\n This automatically creates a getter function for the totalSupply.\n This is moved to the base contract since public getter functions are not\n currently recognised as an implementation of the matching abstract\n function by the compiler.\n */\n /// total amount of tokens\n function totalSupply() external view returns (uint256);\n\n /// @param _owner The address from which the balance will be retrieved\n /// @return balance The balance\n function balanceOf(address _owner) external view returns (uint256 balance);\n\n /// @notice send `_value` token to `_to` from `msg.sender`\n /// @param _to The address of the recipient\n /// @param _value The amount of token to be transferred\n /// @return success Whether the transfer was successful or not\n function transfer(address _to, uint256 _value) external returns (bool success);\n\n /// @notice send `_value` token to `_to` from `_from` on the condition it is approved by `_from`\n /// @param _from The address of the sender\n /// @param _to The address of the recipient\n /// @param _value The amount of token to be transferred\n /// @return success Whether the transfer was successful or not\n function transferFrom(address _from, address _to, uint256 _value) external returns (bool success);\n\n /// @notice `msg.sender` approves `_spender` to spend `_value` tokens\n /// @param _spender The address of the account able to transfer the tokens\n /// @param _value The amount of tokens to be approved for transfer\n /// @return success Whether the approval was successful or not\n function approve(address _spender, uint256 _value) external returns (bool success);\n\n /// @param _owner The address of the account owning tokens\n /// @param _spender The address of the account able to transfer the tokens\n /// @return remaining Amount of remaining tokens allowed to spent\n function allowance(address _owner, address _spender) external view returns (uint256 remaining);\n\n // solhint-disable-next-line no-simple-event-func-name\n event Transfer(address indexed _from, address indexed _to, uint256 _value);\n event Approval(address indexed _owner, address indexed _spender, uint256 _value);\n event Mint(address indexed _account, uint256 _amount);\n event Burn(address indexed _account, uint256 _amount);\n}\n" - }, - "contracts/optimistic-ethereum/mockOVM/bridge/mockOVM_CrossDomainMessenger.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.7.0;\npragma experimental ABIEncoderV2;\n\n/* Contract Imports */\nimport { iOVM_BaseCrossDomainMessenger } from \"../../iOVM/bridge/iOVM_BaseCrossDomainMessenger.sol\";\n\n/**\n * @title mockOVM_CrossDomainMessenger\n */\ncontract mockOVM_CrossDomainMessenger is iOVM_BaseCrossDomainMessenger {\n\n /***********\n * Structs *\n ***********/\n\n struct ReceivedMessage {\n uint256 timestamp;\n address target;\n address sender;\n bytes message;\n uint256 messageNonce;\n uint32 gasLimit;\n }\n\n\n /**********************\n * Contract Variables *\n **********************/\n\n ReceivedMessage[] internal fullReceivedMessages;\n address internal targetMessengerAddress;\n uint256 internal lastRelayedMessage;\n uint256 internal delay;\n uint256 public messageNonce;\n address override public xDomainMessageSender;\n\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _delay Time in seconds before a message can be relayed.\n */\n constructor(\n uint256 _delay\n ) {\n delay = _delay;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Sets the target messenger address.\n * @dev Currently, this function is public and therefore allows anyone to modify the target\n * messenger for a given xdomain messenger contract. Obviously this shouldn't be allowed,\n * but we still need to determine an adequate mechanism for updating this address.\n * @param _targetMessengerAddress New messenger address.\n */\n function setTargetMessengerAddress(\n address _targetMessengerAddress\n )\n public\n {\n targetMessengerAddress = _targetMessengerAddress;\n }\n\n /**\n * Sends a message to another mock xdomain messenger.\n * @param _target Target for the message.\n * @param _message Message to send.\n * @param _gasLimit Amount of gas to send with the call.\n */\n function sendMessage(\n address _target,\n bytes memory _message,\n uint32 _gasLimit\n )\n override\n public\n {\n mockOVM_CrossDomainMessenger targetMessenger = mockOVM_CrossDomainMessenger(\n targetMessengerAddress\n );\n\n // Just send it over!\n targetMessenger.receiveMessage(ReceivedMessage({\n timestamp: block.timestamp,\n target: _target,\n sender: msg.sender,\n message: _message,\n messageNonce: messageNonce,\n gasLimit: _gasLimit\n }));\n\n messageNonce += 1;\n }\n\n /**\n * Receives a message to be sent later.\n * @param _message Message to send later.\n */\n function receiveMessage(\n ReceivedMessage memory _message\n )\n public\n {\n fullReceivedMessages.push(_message);\n }\n\n /**\n * Checks whether we have messages to relay.\n * @param _exists Whether or not we have more messages to relay.\n */\n function hasNextMessage()\n public\n view\n returns (\n bool _exists\n )\n {\n return fullReceivedMessages.length > lastRelayedMessage;\n }\n\n /**\n * Relays the last received message not yet relayed.\n */\n function relayNextMessage()\n public\n {\n require(hasNextMessage(), \"No pending messages to relay\");\n ReceivedMessage memory nextMessage = fullReceivedMessages[lastRelayedMessage];\n require(nextMessage.timestamp + delay < block.timestamp, \"Message is not ready to be relayed. The delay period is not up yet!\");\n\n xDomainMessageSender = nextMessage.sender;\n (bool success,) = nextMessage.target.call{gas: nextMessage.gasLimit}(nextMessage.message);\n require(success, \"Cross-domain message call reverted. Did you set your gas limit high enough?\");\n lastRelayedMessage += 1;\n }\n}\n" - }, - "contracts/test-libraries/trie/TestLib_SecureMerkleTrie.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.7.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_SecureMerkleTrie } from \"../../optimistic-ethereum/libraries/trie/Lib_SecureMerkleTrie.sol\";\n\n/**\n * @title TestLib_SecureMerkleTrie\n */\ncontract TestLib_SecureMerkleTrie {\n\n function verifyInclusionProof(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n )\n public\n pure\n returns (\n bool\n )\n {\n return Lib_SecureMerkleTrie.verifyInclusionProof(\n _key,\n _value,\n _proof,\n _root\n );\n }\n\n function verifyExclusionProof(\n bytes memory _key,\n bytes memory _proof,\n bytes32 _root\n )\n public\n pure\n returns (\n bool\n )\n {\n return Lib_SecureMerkleTrie.verifyExclusionProof(\n _key,\n _proof,\n _root\n );\n }\n\n function update(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n )\n public\n pure\n returns (\n bytes32\n )\n {\n return Lib_SecureMerkleTrie.update(\n _key,\n _value,\n _proof,\n _root\n );\n }\n\n function get(\n bytes memory _key,\n bytes memory _proof,\n bytes32 _root\n )\n public\n pure\n returns (\n bool,\n bytes memory\n )\n {\n return Lib_SecureMerkleTrie.get(\n _key,\n _proof,\n _root\n );\n }\n\n function getSingleNodeRootHash(\n bytes memory _key,\n bytes memory _value\n )\n public\n pure\n returns (\n bytes32\n )\n {\n return Lib_SecureMerkleTrie.getSingleNodeRootHash(\n _key,\n _value\n );\n }\n}\n" - }, - "contracts/test-libraries/trie/TestLib_MerkleTrie.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.7.0;\n\n/* Library Imports */\nimport { Lib_MerkleTrie } from \"../../optimistic-ethereum/libraries/trie/Lib_MerkleTrie.sol\";\n\n/**\n * @title TestLib_MerkleTrie\n */\ncontract TestLib_MerkleTrie {\n\n function verifyInclusionProof(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n )\n public\n pure\n returns (\n bool\n )\n {\n return Lib_MerkleTrie.verifyInclusionProof(\n _key,\n _value,\n _proof,\n _root\n );\n }\n\n function verifyExclusionProof(\n bytes memory _key,\n bytes memory _proof,\n bytes32 _root\n )\n public\n pure\n returns (\n bool\n )\n {\n return Lib_MerkleTrie.verifyExclusionProof(\n _key,\n _proof,\n _root\n );\n }\n\n function update(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n )\n public\n pure\n returns (\n bytes32\n )\n {\n return Lib_MerkleTrie.update(\n _key,\n _value,\n _proof,\n _root\n );\n }\n\n function get(\n bytes memory _key,\n bytes memory _proof,\n bytes32 _root\n )\n public\n pure\n returns (\n bool,\n bytes memory\n )\n {\n return Lib_MerkleTrie.get(\n _key,\n _proof,\n _root\n );\n }\n\n function getSingleNodeRootHash(\n bytes memory _key,\n bytes memory _value\n )\n public\n pure\n returns (\n bytes32\n )\n {\n return Lib_MerkleTrie.getSingleNodeRootHash(\n _key,\n _value\n );\n }\n}\n" - }, - "contracts/test-libraries/rlp/TestLib_RLPWriter.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.7.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_RLPWriter } from \"../../optimistic-ethereum/libraries/rlp/Lib_RLPWriter.sol\";\nimport { TestERC20 } from \"../../test-helpers/TestERC20.sol\";\n\n/**\n * @title TestLib_RLPWriter\n */\ncontract TestLib_RLPWriter {\n\n function writeBytes(\n bytes memory _in\n )\n public\n pure\n returns (\n bytes memory _out\n )\n {\n return Lib_RLPWriter.writeBytes(_in);\n }\n\n function writeList(\n bytes[] memory _in\n )\n public\n pure\n returns (\n bytes memory _out\n )\n {\n return Lib_RLPWriter.writeList(_in);\n }\n\n function writeString(\n string memory _in\n )\n public\n pure\n returns (\n bytes memory _out\n )\n {\n return Lib_RLPWriter.writeString(_in);\n }\n\n function writeAddress(\n address _in\n )\n public\n pure\n returns (\n bytes memory _out\n )\n {\n return Lib_RLPWriter.writeAddress(_in);\n }\n\n function writeUint(\n uint256 _in\n )\n public\n pure\n returns (\n bytes memory _out\n )\n {\n return Lib_RLPWriter.writeUint(_in);\n }\n\n function writeBool(\n bool _in\n )\n public\n pure\n returns (\n bytes memory _out\n )\n {\n return Lib_RLPWriter.writeBool(_in);\n }\n\n function writeAddressWithTaintedMemory(\n address _in\n )\n public\n returns (\n bytes memory _out\n )\n {\n new TestERC20();\n return Lib_RLPWriter.writeAddress(_in);\n }\n}\n" - }, - "contracts/test-helpers/TestERC20.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.7.0;\n\n// a test ERC20 token with an open mint function\ncontract TestERC20 {\n using SafeMath for uint;\n\n string public constant name = 'Test';\n string public constant symbol = 'TST';\n uint8 public constant decimals = 18;\n uint256 public totalSupply;\n mapping(address => uint) public balanceOf;\n mapping(address => mapping(address => uint)) public allowance;\n\n event Approval(address indexed owner, address indexed spender, uint256 value);\n event Transfer(address indexed from, address indexed to, uint256 value);\n\n constructor() public {}\n\n function mint(address to, uint256 value) public {\n totalSupply = totalSupply.add(value);\n balanceOf[to] = balanceOf[to].add(value);\n emit Transfer(address(0), to, value);\n }\n\n function _approve(address owner, address spender, uint256 value) private {\n allowance[owner][spender] = value;\n emit Approval(owner, spender, value);\n }\n\n function _transfer(address from, address to, uint256 value) private {\n balanceOf[from] = balanceOf[from].sub(value);\n balanceOf[to] = balanceOf[to].add(value);\n emit Transfer(from, to, value);\n }\n\n function approve(address spender, uint256 value) external returns (bool) {\n _approve(msg.sender, spender, value);\n return true;\n }\n\n function transfer(address to, uint256 value) external returns (bool) {\n _transfer(msg.sender, to, value);\n return true;\n }\n\n function transferFrom(address from, address to, uint256 value) external returns (bool) {\n if (allowance[from][msg.sender] != uint(-1)) {\n allowance[from][msg.sender] = allowance[from][msg.sender].sub(value);\n }\n _transfer(from, to, value);\n return true;\n }\n}\n\nlibrary SafeMath {\n function add(uint256 x, uint256 y) internal pure returns (uint256 z) {\n require((z = x + y) >= x, 'ds-math-add-overflow');\n }\n\n function sub(uint256 x, uint256 y) internal pure returns (uint256 z) {\n require((z = x - y) <= x, 'ds-math-sub-underflow');\n }\n\n function mul(uint256 x, uint256 y) internal pure returns (uint256 z) {\n require(y == 0 || (z = x * y) / y == x, 'ds-math-mul-overflow');\n }\n}\n" - }, - "contracts/test-libraries/utils/TestLib_BytesUtils.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.7.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_BytesUtils } from \"../../optimistic-ethereum/libraries/utils/Lib_BytesUtils.sol\";\nimport { TestERC20 } from \"../../test-helpers/TestERC20.sol\";\n\n/**\n * @title TestLib_BytesUtils\n */\ncontract TestLib_BytesUtils {\n\n function concat(\n bytes memory _preBytes,\n bytes memory _postBytes\n )\n public\n pure\n returns (bytes memory)\n {\n return Lib_BytesUtils.concat(\n _preBytes,\n _postBytes\n );\n }\n\n function slice(\n bytes memory _bytes,\n uint256 _start,\n uint256 _length\n )\n public\n pure\n returns (bytes memory)\n {\n return Lib_BytesUtils.slice(\n _bytes,\n _start,\n _length\n );\n }\n\n function toBytes32(\n bytes memory _bytes\n )\n public\n pure\n returns (bytes32)\n {\n return Lib_BytesUtils.toBytes32(\n _bytes\n );\n }\n\n function toUint256(\n bytes memory _bytes\n )\n public\n pure\n returns (uint256)\n {\n return Lib_BytesUtils.toUint256(\n _bytes\n );\n }\n\n function toNibbles(\n bytes memory _bytes\n )\n public\n pure\n returns (bytes memory)\n {\n return Lib_BytesUtils.toNibbles(\n _bytes\n );\n }\n\n function fromNibbles(\n bytes memory _bytes\n )\n public\n pure\n returns (bytes memory)\n {\n return Lib_BytesUtils.fromNibbles(\n _bytes\n );\n }\n\n function equal(\n bytes memory _bytes,\n bytes memory _other\n )\n public\n pure\n returns (bool)\n {\n return Lib_BytesUtils.equal(\n _bytes,\n _other\n );\n }\n\n function sliceWithTaintedMemory(\n bytes memory _bytes,\n uint256 _start,\n uint256 _length\n )\n public\n returns (bytes memory)\n {\n new TestERC20();\n return Lib_BytesUtils.slice(\n _bytes,\n _start,\n _length\n );\n }\n}\n" - }, - "contracts/test-libraries/utils/TestLib_EthUtils.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.7.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_EthUtils } from \"../../optimistic-ethereum/libraries/utils/Lib_EthUtils.sol\";\n\n/**\n * @title TestLib_EthUtils\n */\ncontract TestLib_EthUtils {\n\n function getCode(\n address _address,\n uint256 _offset,\n uint256 _length\n )\n public\n view\n returns (\n bytes memory _code\n )\n {\n return Lib_EthUtils.getCode(\n _address,\n _offset,\n _length\n );\n }\n\n function getCode(\n address _address\n )\n public\n view\n returns (\n bytes memory _code\n )\n {\n return Lib_EthUtils.getCode(\n _address\n );\n }\n\n function getCodeSize(\n address _address\n )\n public\n view\n returns (\n uint256 _codeSize\n )\n {\n return Lib_EthUtils.getCodeSize(\n _address\n );\n }\n\n function getCodeHash(\n address _address\n )\n public\n view\n returns (\n bytes32 _codeHash\n )\n {\n return Lib_EthUtils.getCodeHash(\n _address\n );\n }\n\n function createContract(\n bytes memory _code\n )\n public\n returns (\n address _created\n )\n {\n return Lib_EthUtils.createContract(\n _code\n );\n }\n\n function getAddressForCREATE(\n address _creator,\n uint256 _nonce\n )\n public\n pure\n returns (\n address _address\n )\n {\n return Lib_EthUtils.getAddressForCREATE(\n _creator,\n _nonce\n );\n }\n\n function getAddressForCREATE2(\n address _creator,\n bytes memory _bytecode,\n bytes32 _salt\n )\n public\n pure\n returns (address _address)\n {\n return Lib_EthUtils.getAddressForCREATE2(\n _creator,\n _bytecode,\n _salt\n );\n }\n}\n" - }, - "contracts/test-libraries/utils/TestLib_Bytes32Utils.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.7.0;\n\n/* Library Imports */\nimport { Lib_Bytes32Utils } from \"../../optimistic-ethereum/libraries/utils/Lib_Bytes32Utils.sol\";\n\n/**\n * @title TestLib_Byte32Utils\n */\ncontract TestLib_Bytes32Utils {\n\n function toBool(\n bytes32 _in\n )\n public\n pure\n returns (\n bool _out\n )\n {\n return Lib_Bytes32Utils.toBool(_in);\n }\n\n function fromBool(\n bool _in\n )\n public\n pure\n returns (\n bytes32 _out\n )\n {\n return Lib_Bytes32Utils.fromBool(_in);\n }\n\n function toAddress(\n bytes32 _in\n )\n public\n pure\n returns (\n address _out\n )\n {\n return Lib_Bytes32Utils.toAddress(_in);\n }\n\n function fromAddress(\n address _in\n )\n public\n pure\n returns (\n bytes32 _out\n )\n {\n return Lib_Bytes32Utils.fromAddress(_in);\n }\n}\n" - }, - "contracts/test-libraries/rlp/TestLib_RLPReader.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.7.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_RLPReader } from \"../../optimistic-ethereum/libraries/rlp/Lib_RLPReader.sol\";\n\n/**\n * @title TestLib_RLPReader\n */\ncontract TestLib_RLPReader {\n\n function readList(\n bytes memory _in\n )\n public\n pure\n returns (\n bytes[] memory\n )\n {\n Lib_RLPReader.RLPItem[] memory decoded = Lib_RLPReader.readList(_in);\n bytes[] memory out = new bytes[](decoded.length);\n for (uint256 i = 0; i < out.length; i++) {\n out[i] = Lib_RLPReader.readRawBytes(decoded[i]);\n }\n return out;\n }\n\n function readString(\n bytes memory _in\n )\n public\n pure\n returns (\n string memory\n )\n {\n return Lib_RLPReader.readString(_in);\n }\n\n function readBytes(\n bytes memory _in\n )\n public\n pure\n returns (\n bytes memory\n )\n {\n return Lib_RLPReader.readBytes(_in);\n }\n\n function readBytes32(\n bytes memory _in\n )\n public\n pure\n returns (\n bytes32\n )\n {\n return Lib_RLPReader.readBytes32(_in);\n }\n\n function readUint256(\n bytes memory _in\n )\n public\n pure\n returns (\n uint256\n )\n {\n return Lib_RLPReader.readUint256(_in);\n }\n\n function readBool(\n bytes memory _in\n )\n public\n pure\n returns (\n bool\n )\n {\n return Lib_RLPReader.readBool(_in);\n }\n\n function readAddress(\n bytes memory _in\n )\n public\n pure\n returns (\n address\n )\n {\n return Lib_RLPReader.readAddress(_in);\n }\n}\n" - }, - "contracts/optimistic-ethereum/libraries/resolver/Lib_ResolvedDelegateProxy.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.7.0;\n\n/* Library Imports */\nimport { Lib_AddressManager } from \"./Lib_AddressManager.sol\";\n\n/**\n * @title Lib_ResolvedDelegateProxy\n */\ncontract Lib_ResolvedDelegateProxy {\n\n /*************\n * Variables *\n *************/\n\n // Using mappings to store fields to avoid overwriting storage slots in the\n // implementation contract. For example, instead of storing these fields at\n // storage slot `0` & `1`, they are stored at `hash(${FIELD_NAME} + address(this))`\n // See: https://solidity.readthedocs.io/en/v0.7.0/internals/layout_in_storage.html\n mapping(address=>string) private implementationName;\n mapping(address=>Lib_AddressManager) private addressManager;\n\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Lib_AddressManager.\n * @param _implementationName implementationName of the contract to proxy to.\n */\n constructor(\n address _libAddressManager,\n string memory _implementationName\n )\n {\n addressManager[address(this)] = Lib_AddressManager(_libAddressManager);\n implementationName[address(this)] = _implementationName;\n }\n\n\n /*********************\n * Fallback Function *\n *********************/\n\n fallback()\n external\n {\n address target = addressManager[address(this)].getAddress((implementationName[address(this)]));\n require(\n target != address(0),\n \"Target address must be initialized.\"\n );\n\n (bool success, bytes memory returndata) = target.delegatecall(msg.data);\n\n if (success == true) {\n assembly {\n return(add(returndata, 0x20), mload(returndata))\n }\n } else {\n assembly {\n revert(add(returndata, 0x20), mload(returndata))\n }\n }\n }\n}\n" - }, - "contracts/test-libraries/utils/TestLib_MerkleTree.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.7.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_MerkleTree } from \"../../optimistic-ethereum/libraries/utils/Lib_MerkleTree.sol\";\n\n/**\n * @title TestLib_MerkleTree\n */\ncontract TestLib_MerkleTree {\n\n function getMerkleRoot(\n bytes32[] memory _elements\n )\n public\n view\n returns (\n bytes32\n )\n {\n return Lib_MerkleTree.getMerkleRoot(\n _elements\n );\n }\n\n function verify(\n bytes32 _root,\n bytes32 _leaf,\n uint256 _index,\n bytes32[] memory _siblings,\n uint256 _totalLeaves\n )\n public\n pure\n returns (\n bool\n )\n {\n return Lib_MerkleTree.verify(\n _root,\n _leaf,\n _index,\n _siblings,\n _totalLeaves\n );\n }\n}\n" - }, - "contracts/optimistic-ethereum/mockOVM/verification/mockOVM_BondManager.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.7.0;\n\n/* Interface Imports */\nimport { iOVM_BondManager } from \"../../iOVM/verification/iOVM_BondManager.sol\";\n\n/* Contract Imports */\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/**\n * @title mockOVM_BondManager\n */\ncontract mockOVM_BondManager is iOVM_BondManager, Lib_AddressResolver {\n constructor(\n address _libAddressManager\n )\n Lib_AddressResolver(_libAddressManager)\n {}\n\n function recordGasSpent(\n bytes32 _preStateRoot,\n bytes32 _txHash,\n address _who,\n uint256 _gasSpent\n )\n override\n public\n {}\n\n function finalize(\n bytes32 _preStateRoot,\n address _publisher,\n uint256 _timestamp\n )\n override\n public\n {}\n\n function deposit()\n override\n public\n {}\n\n function startWithdrawal()\n override\n public\n {}\n\n function finalizeWithdrawal()\n override\n public\n {}\n\n function claim(\n address _who\n )\n override\n public\n {}\n\n function isCollateralized(\n address _who\n )\n override\n public\n view\n returns (\n bool\n )\n {\n // Only authenticate sequencer to submit state root batches.\n return _who == resolve(\"OVM_Sequencer\");\n }\n\n function getGasSpent(\n bytes32 _preStateRoot,\n address _who\n )\n override\n public\n view\n returns (\n uint256\n )\n {\n return 0;\n }\n}\n" - }, - "contracts/optimistic-ethereum/OVM/execution/OVM_StateManagerFactory.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.7.0;\n\n/* Interface Imports */\nimport { iOVM_StateManager } from \"../../iOVM/execution/iOVM_StateManager.sol\";\nimport { iOVM_StateManagerFactory } from \"../../iOVM/execution/iOVM_StateManagerFactory.sol\";\n\n/* Contract Imports */\nimport { OVM_StateManager } from \"./OVM_StateManager.sol\";\n\n/**\n * @title OVM_StateManagerFactory\n */\ncontract OVM_StateManagerFactory is iOVM_StateManagerFactory {\n\n /***************************************\n * Public Functions: Contract Creation *\n ***************************************/\n\n /**\n * Creates a new OVM_StateManager\n * @param _owner Owner of the created contract.\n * @return _ovmStateManager New OVM_StateManager instance.\n */\n function create(\n address _owner\n )\n override\n public\n returns (\n iOVM_StateManager _ovmStateManager\n )\n {\n return new OVM_StateManager(_owner);\n }\n}\n" - }, - "contracts/optimistic-ethereum/OVM/execution/OVM_StateManager.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.7.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/* Interface Imports */\nimport { iOVM_StateManager } from \"../../iOVM/execution/iOVM_StateManager.sol\";\n\n/**\n * @title OVM_StateManager\n */\ncontract OVM_StateManager is iOVM_StateManager {\n\n /**********************\n * Contract Constants *\n **********************/\n\n bytes32 constant internal EMPTY_ACCOUNT_STORAGE_ROOT = 0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421;\n bytes32 constant internal EMPTY_ACCOUNT_CODE_HASH = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;\n bytes32 constant internal STORAGE_XOR_VALUE = 0xFEEDFACECAFEBEEFFEEDFACECAFEBEEFFEEDFACECAFEBEEFFEEDFACECAFEBEEF;\n\n\n /*******************************************\n * Contract Variables: Contract References *\n *******************************************/\n\n address override public owner;\n address override public ovmExecutionManager;\n\n\n /****************************************\n * Contract Variables: Internal Storage *\n ****************************************/\n\n mapping (address => Lib_OVMCodec.Account) internal accounts;\n mapping (address => mapping (bytes32 => bytes32)) internal contractStorage;\n mapping (address => mapping (bytes32 => bool)) internal verifiedContractStorage;\n mapping (bytes32 => ItemState) internal itemStates;\n uint256 internal totalUncommittedAccounts;\n uint256 internal totalUncommittedContractStorage;\n\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _owner Address of the owner of this contract.\n */\n constructor(\n address _owner\n ) {\n owner = _owner;\n }\n\n\n /**********************\n * Function Modifiers *\n **********************/\n\n /**\n * Simple authentication, this contract should only be accessible to the owner or to the\n * OVM_ExecutionManager during the transaction execution process.\n */\n modifier authenticated() {\n require(\n msg.sender == owner || msg.sender == ovmExecutionManager,\n \"Function can only be called by authenticated addresses\"\n );\n _;\n }\n\n /***************************\n * Public Functions: Misc *\n ***************************/\n\n\n function isAuthenticated(\n address _address\n )\n override\n public\n view\n returns (bool)\n {\n return (_address == owner || _address == ovmExecutionManager);\n }\n\n /***************************\n * Public Functions: Setup *\n ***************************/\n\n /**\n * Sets the address of the OVM_ExecutionManager.\n * @param _ovmExecutionManager Address of the OVM_ExecutionManager.\n */\n function setExecutionManager(\n address _ovmExecutionManager\n )\n override\n public\n authenticated\n {\n ovmExecutionManager = _ovmExecutionManager;\n }\n\n\n /************************************\n * Public Functions: Account Access *\n ************************************/\n\n /**\n * Inserts an account into the state.\n * @param _address Address of the account to insert.\n * @param _account Account to insert for the given address.\n */\n function putAccount(\n address _address,\n Lib_OVMCodec.Account memory _account\n )\n override\n public\n authenticated\n {\n accounts[_address] = _account;\n }\n\n /**\n * Marks an account as empty.\n * @param _address Address of the account to mark.\n */\n function putEmptyAccount(\n address _address\n )\n override\n public\n authenticated\n {\n Lib_OVMCodec.Account storage account = accounts[_address];\n account.storageRoot = EMPTY_ACCOUNT_STORAGE_ROOT;\n account.codeHash = EMPTY_ACCOUNT_CODE_HASH;\n }\n\n /**\n * Retrieves an account from the state.\n * @param _address Address of the account to retrieve.\n * @return _account Account for the given address.\n */\n function getAccount(address _address)\n override\n public\n view\n returns (\n Lib_OVMCodec.Account memory _account\n )\n {\n return accounts[_address];\n }\n\n /**\n * Checks whether the state has a given account.\n * @param _address Address of the account to check.\n * @return _exists Whether or not the state has the account.\n */\n function hasAccount(\n address _address\n )\n override\n public\n view\n returns (\n bool _exists\n )\n {\n return accounts[_address].codeHash != bytes32(0);\n }\n\n /**\n * Checks whether the state has a given known empty account.\n * @param _address Address of the account to check.\n * @return _exists Whether or not the state has the empty account.\n */\n function hasEmptyAccount(\n address _address\n )\n override\n public\n view\n returns (\n bool _exists\n )\n {\n return (\n accounts[_address].codeHash == EMPTY_ACCOUNT_CODE_HASH\n && accounts[_address].nonce == 0\n );\n }\n\n /**\n * Sets the nonce of an account.\n * @param _address Address of the account to modify.\n * @param _nonce New account nonce.\n */\n function setAccountNonce(\n address _address,\n uint256 _nonce\n )\n override\n public\n authenticated\n {\n accounts[_address].nonce = _nonce;\n }\n\n /**\n * Gets the nonce of an account.\n * @param _address Address of the account to access.\n * @return _nonce Nonce of the account.\n */\n function getAccountNonce(\n address _address\n )\n override\n public\n view\n returns (\n uint256 _nonce\n )\n {\n return accounts[_address].nonce;\n }\n\n /**\n * Retrieves the Ethereum address of an account.\n * @param _address Address of the account to access.\n * @return _ethAddress Corresponding Ethereum address.\n */\n function getAccountEthAddress(\n address _address\n )\n override\n public\n view\n returns (\n address _ethAddress\n )\n {\n return accounts[_address].ethAddress;\n }\n\n /**\n * Retrieves the storage root of an account.\n * @param _address Address of the account to access.\n * @return _storageRoot Corresponding storage root.\n */\n function getAccountStorageRoot(\n address _address\n )\n override\n public\n view\n returns (\n bytes32 _storageRoot\n )\n {\n return accounts[_address].storageRoot;\n }\n\n /**\n * Initializes a pending account (during CREATE or CREATE2) with the default values.\n * @param _address Address of the account to initialize.\n */\n function initPendingAccount(\n address _address\n )\n override\n public\n authenticated\n {\n Lib_OVMCodec.Account storage account = accounts[_address];\n account.nonce = 1;\n account.storageRoot = EMPTY_ACCOUNT_STORAGE_ROOT;\n account.codeHash = EMPTY_ACCOUNT_CODE_HASH;\n account.isFresh = true;\n }\n\n /**\n * Finalizes the creation of a pending account (during CREATE or CREATE2).\n * @param _address Address of the account to finalize.\n * @param _ethAddress Address of the account's associated contract on Ethereum.\n * @param _codeHash Hash of the account's code.\n */\n function commitPendingAccount(\n address _address,\n address _ethAddress,\n bytes32 _codeHash\n )\n override\n public\n authenticated\n {\n Lib_OVMCodec.Account storage account = accounts[_address];\n account.ethAddress = _ethAddress;\n account.codeHash = _codeHash;\n }\n\n /**\n * Checks whether an account has already been retrieved, and marks it as retrieved if not.\n * @param _address Address of the account to check.\n * @return _wasAccountAlreadyLoaded Whether or not the account was already loaded.\n */\n function testAndSetAccountLoaded(\n address _address\n )\n override\n public\n authenticated\n returns (\n bool _wasAccountAlreadyLoaded\n )\n {\n return _testAndSetItemState(\n _getItemHash(_address),\n ItemState.ITEM_LOADED\n );\n }\n\n /**\n * Checks whether an account has already been modified, and marks it as modified if not.\n * @param _address Address of the account to check.\n * @return _wasAccountAlreadyChanged Whether or not the account was already modified.\n */\n function testAndSetAccountChanged(\n address _address\n )\n override\n public\n authenticated\n returns (\n bool _wasAccountAlreadyChanged\n )\n {\n return _testAndSetItemState(\n _getItemHash(_address),\n ItemState.ITEM_CHANGED\n );\n }\n\n /**\n * Attempts to mark an account as committed.\n * @param _address Address of the account to commit.\n * @return _wasAccountCommitted Whether or not the account was committed.\n */\n function commitAccount(\n address _address\n )\n override\n public\n authenticated\n returns (\n bool _wasAccountCommitted\n )\n {\n bytes32 item = _getItemHash(_address);\n if (itemStates[item] != ItemState.ITEM_CHANGED) {\n return false;\n }\n\n itemStates[item] = ItemState.ITEM_COMMITTED;\n totalUncommittedAccounts -= 1;\n\n return true;\n }\n\n /**\n * Increments the total number of uncommitted accounts.\n */\n function incrementTotalUncommittedAccounts()\n override\n public\n authenticated\n {\n totalUncommittedAccounts += 1;\n }\n\n /**\n * Gets the total number of uncommitted accounts.\n * @return _total Total uncommitted accounts.\n */\n function getTotalUncommittedAccounts()\n override\n public\n view\n returns (\n uint256 _total\n )\n {\n return totalUncommittedAccounts;\n }\n\n /**\n * Checks whether a given account was changed during execution.\n * @param _address Address to check.\n * @return Whether or not the account was changed.\n */\n function wasAccountChanged(\n address _address\n )\n override\n public\n view\n returns (\n bool\n )\n {\n bytes32 item = _getItemHash(_address);\n return itemStates[item] >= ItemState.ITEM_CHANGED;\n }\n\n /**\n * Checks whether a given account was committed after execution.\n * @param _address Address to check.\n * @return Whether or not the account was committed.\n */\n function wasAccountCommitted(\n address _address\n )\n override\n public\n view\n returns (\n bool\n )\n {\n bytes32 item = _getItemHash(_address);\n return itemStates[item] >= ItemState.ITEM_COMMITTED;\n }\n\n\n /************************************\n * Public Functions: Storage Access *\n ************************************/\n\n /**\n * Changes a contract storage slot value.\n * @param _contract Address of the contract to modify.\n * @param _key 32 byte storage slot key.\n * @param _value 32 byte storage slot value.\n */\n function putContractStorage(\n address _contract,\n bytes32 _key,\n bytes32 _value\n )\n override\n public\n authenticated\n {\n // A hilarious optimization. `SSTORE`ing a value of `bytes32(0)` is common enough that it's\n // worth populating this with a non-zero value in advance (during the fraud proof\n // initialization phase) to cut the execution-time cost down to 5000 gas.\n contractStorage[_contract][_key] = _value ^ STORAGE_XOR_VALUE;\n\n // Only used when initially populating the contract storage. OVM_ExecutionManager will\n // perform a `hasContractStorage` INVALID_STATE_ACCESS check before putting any contract\n // storage because writing to zero when the actual value is nonzero causes a gas\n // discrepancy. Could be moved into a new `putVerifiedContractStorage` function, or\n // something along those lines.\n if (verifiedContractStorage[_contract][_key] == false) {\n verifiedContractStorage[_contract][_key] = true;\n }\n }\n\n /**\n * Retrieves a contract storage slot value.\n * @param _contract Address of the contract to access.\n * @param _key 32 byte storage slot key.\n * @return _value 32 byte storage slot value.\n */\n function getContractStorage(\n address _contract,\n bytes32 _key\n )\n override\n public\n view\n returns (\n bytes32 _value\n )\n {\n // Storage XOR system doesn't work for newly created contracts that haven't set this\n // storage slot value yet.\n if (\n verifiedContractStorage[_contract][_key] == false\n && accounts[_contract].isFresh\n ) {\n return bytes32(0);\n }\n\n // See `putContractStorage` for more information about the XOR here.\n return contractStorage[_contract][_key] ^ STORAGE_XOR_VALUE;\n }\n\n /**\n * Checks whether a contract storage slot exists in the state.\n * @param _contract Address of the contract to access.\n * @param _key 32 byte storage slot key.\n * @return _exists Whether or not the key was set in the state.\n */\n function hasContractStorage(\n address _contract,\n bytes32 _key\n )\n override\n public\n view\n returns (\n bool _exists\n )\n {\n return verifiedContractStorage[_contract][_key] || accounts[_contract].isFresh;\n }\n\n /**\n * Checks whether a storage slot has already been retrieved, and marks it as retrieved if not.\n * @param _contract Address of the contract to check.\n * @param _key 32 byte storage slot key.\n * @return _wasContractStorageAlreadyLoaded Whether or not the slot was already loaded.\n */\n function testAndSetContractStorageLoaded(\n address _contract,\n bytes32 _key\n )\n override\n public\n authenticated\n returns (\n bool _wasContractStorageAlreadyLoaded\n )\n {\n return _testAndSetItemState(\n _getItemHash(_contract, _key),\n ItemState.ITEM_LOADED\n );\n }\n\n /**\n * Checks whether a storage slot has already been modified, and marks it as modified if not.\n * @param _contract Address of the contract to check.\n * @param _key 32 byte storage slot key.\n * @return _wasContractStorageAlreadyChanged Whether or not the slot was already modified.\n */\n function testAndSetContractStorageChanged(\n address _contract,\n bytes32 _key\n )\n override\n public\n authenticated\n returns (\n bool _wasContractStorageAlreadyChanged\n )\n {\n return _testAndSetItemState(\n _getItemHash(_contract, _key),\n ItemState.ITEM_CHANGED\n );\n }\n\n /**\n * Attempts to mark a storage slot as committed.\n * @param _contract Address of the account to commit.\n * @param _key 32 byte slot key to commit.\n * @return _wasContractStorageCommitted Whether or not the slot was committed.\n */\n function commitContractStorage(\n address _contract,\n bytes32 _key\n )\n override\n public\n authenticated\n returns (\n bool _wasContractStorageCommitted\n )\n {\n bytes32 item = _getItemHash(_contract, _key);\n if (itemStates[item] != ItemState.ITEM_CHANGED) {\n return false;\n }\n\n itemStates[item] = ItemState.ITEM_COMMITTED;\n totalUncommittedContractStorage -= 1;\n\n return true;\n }\n\n /**\n * Increments the total number of uncommitted storage slots.\n */\n function incrementTotalUncommittedContractStorage()\n override\n public\n authenticated\n {\n totalUncommittedContractStorage += 1;\n }\n\n /**\n * Gets the total number of uncommitted storage slots.\n * @return _total Total uncommitted storage slots.\n */\n function getTotalUncommittedContractStorage()\n override\n public\n view\n returns (\n uint256 _total\n )\n {\n return totalUncommittedContractStorage;\n }\n\n /**\n * Checks whether a given storage slot was changed during execution.\n * @param _contract Address to check.\n * @param _key Key of the storage slot to check.\n * @return Whether or not the storage slot was changed.\n */\n function wasContractStorageChanged(\n address _contract,\n bytes32 _key\n )\n override\n public\n view\n returns (\n bool\n )\n {\n bytes32 item = _getItemHash(_contract, _key);\n return itemStates[item] >= ItemState.ITEM_CHANGED;\n }\n\n /**\n * Checks whether a given storage slot was committed after execution.\n * @param _contract Address to check.\n * @param _key Key of the storage slot to check.\n * @return Whether or not the storage slot was committed.\n */\n function wasContractStorageCommitted(\n address _contract,\n bytes32 _key\n )\n override\n public\n view\n returns (\n bool\n )\n {\n bytes32 item = _getItemHash(_contract, _key);\n return itemStates[item] >= ItemState.ITEM_COMMITTED;\n }\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Generates a unique hash for an address.\n * @param _address Address to generate a hash for.\n * @return Unique hash for the given address.\n */\n function _getItemHash(\n address _address\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n return keccak256(abi.encodePacked(_address));\n }\n\n /**\n * Generates a unique hash for an address/key pair.\n * @param _contract Address to generate a hash for.\n * @param _key Key to generate a hash for.\n * @return Unique hash for the given pair.\n */\n function _getItemHash(\n address _contract,\n bytes32 _key\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n return keccak256(abi.encodePacked(\n _contract,\n _key\n ));\n }\n\n /**\n * Checks whether an item is in a particular state (ITEM_LOADED or ITEM_CHANGED) and sets the\n * item to the provided state if not.\n * @param _item 32 byte item ID to check.\n * @param _minItemState Minimum state that must be satisfied by the item.\n * @return _wasItemState Whether or not the item was already in the state.\n */\n function _testAndSetItemState(\n bytes32 _item,\n ItemState _minItemState\n )\n internal\n returns (\n bool _wasItemState\n )\n {\n bool wasItemState = itemStates[_item] >= _minItemState;\n\n if (wasItemState == false) {\n itemStates[_item] = _minItemState;\n }\n\n return wasItemState;\n }\n}\n" - }, - "contracts/optimistic-ethereum/mockOVM/accounts/mockOVM_ECDSAContractAccount.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.7.0;\npragma experimental ABIEncoderV2;\n\n/* Interface Imports */\nimport { iOVM_ECDSAContractAccount } from \"../../iOVM/accounts/iOVM_ECDSAContractAccount.sol\";\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_ECDSAUtils } from \"../../libraries/utils/Lib_ECDSAUtils.sol\";\nimport { Lib_SafeExecutionManagerWrapper } from \"../../libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\";\n\n/**\n * @title mockOVM_ECDSAContractAccount\n */\ncontract mockOVM_ECDSAContractAccount is iOVM_ECDSAContractAccount {\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Executes a signed transaction.\n * @param _transaction Signed EOA transaction.\n * @param _signatureType Hashing scheme used for the transaction (e.g., ETH signed message).\n * @param _v Signature `v` parameter.\n * @param _r Signature `r` parameter.\n * @param _s Signature `s` parameter.\n * @return _success Whether or not the call returned (rather than reverted).\n * @return _returndata Data returned by the call.\n */\n function execute(\n bytes memory _transaction,\n Lib_OVMCodec.EOASignatureType _signatureType,\n uint8 _v,\n bytes32 _r,\n bytes32 _s\n )\n override\n public\n returns (\n bool _success,\n bytes memory _returndata\n )\n {\n bool isEthSign = _signatureType == Lib_OVMCodec.EOASignatureType.ETH_SIGNED_MESSAGE;\n Lib_OVMCodec.EIP155Transaction memory decodedTx = Lib_OVMCodec.decodeEIP155Transaction(_transaction, isEthSign);\n\n // Need to make sure that the transaction nonce is right.\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(\n decodedTx.nonce == Lib_SafeExecutionManagerWrapper.safeGETNONCE(),\n \"Transaction nonce does not match the expected nonce.\"\n );\n\n // Contract creations are signalled by sending a transaction to the zero address.\n if (decodedTx.to == address(0)) {\n address created = Lib_SafeExecutionManagerWrapper.safeCREATE(\n decodedTx.gasLimit,\n decodedTx.data\n );\n\n // If the created address is the ZERO_ADDRESS then we know the deployment failed, though not why\n return (created != address(0), abi.encode(created));\n } else {\n // We only want to bump the nonce for `ovmCALL` because `ovmCREATE` automatically bumps\n // the nonce of the calling account. Normally an EOA would bump the nonce for both\n // cases, but since this is a contract we'd end up bumping the nonce twice.\n Lib_SafeExecutionManagerWrapper.safeSETNONCE(decodedTx.nonce + 1);\n\n return Lib_SafeExecutionManagerWrapper.safeCALL(\n decodedTx.gasLimit,\n decodedTx.to,\n decodedTx.data\n );\n }\n }\n\n function qall(\n uint256 _gasLimit,\n address _to,\n bytes memory _data\n )\n public\n returns (\n bool _success,\n bytes memory _returndata\n )\n {\n return Lib_SafeExecutionManagerWrapper.safeCALL(\n _gasLimit,\n _to,\n _data\n );\n }\n}\n" - }, - "contracts/optimistic-ethereum/OVM/precompiles/OVM_ProxySequencerEntrypoint.sol": { - "content": "pragma solidity ^0.7.0;\n\n/* Library Imports */\nimport { Lib_SafeExecutionManagerWrapper } from \"../../libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\";\n\n/**\n * @title OVM_ProxySequencerEntrypoint\n */\ncontract OVM_ProxySequencerEntrypoint {\n\n /*********************\n * Fallback Function *\n *********************/\n\n fallback()\n external\n {\n Lib_SafeExecutionManagerWrapper.safeDELEGATECALL(\n gasleft(),\n _getImplementation(),\n msg.data\n );\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n function init(\n address _implementation,\n address _owner\n )\n external\n {\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(\n _getOwner() == address(0),\n \"ProxySequencerEntrypoint has already been inited\"\n );\n _setOwner(_owner);\n _setImplementation(_implementation);\n }\n\n function upgrade(\n address _implementation\n )\n external\n {\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(\n _getOwner() == Lib_SafeExecutionManagerWrapper.safeCALLER(),\n \"Only owner can upgrade the Entrypoint\"\n );\n\n _setImplementation(_implementation);\n }\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n function _setImplementation(\n address _implementation\n )\n internal\n {\n Lib_SafeExecutionManagerWrapper.safeSSTORE(\n bytes32(uint256(0)),\n bytes32(uint256(uint160(_implementation)))\n );\n }\n\n function _getImplementation()\n internal\n returns (\n address _implementation\n )\n {\n return address(uint160(uint256(\n Lib_SafeExecutionManagerWrapper.safeSLOAD(\n bytes32(uint256(0))\n )\n )));\n }\n\n function _setOwner(\n address _owner\n )\n internal\n {\n Lib_SafeExecutionManagerWrapper.safeSSTORE(\n bytes32(uint256(1)),\n bytes32(uint256(uint160(_owner)))\n );\n }\n\n function _getOwner()\n internal\n returns (\n address _owner\n )\n {\n return address(uint160(uint256(\n Lib_SafeExecutionManagerWrapper.safeSLOAD(\n bytes32(uint256(1))\n )\n )));\n }\n}\n" - }, - "contracts/optimistic-ethereum/OVM/execution/OVM_SafetyChecker.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.7.0;\n\n/* Interface Imports */\nimport { iOVM_SafetyChecker } from \"../../iOVM/execution/iOVM_SafetyChecker.sol\";\n\n/**\n * @title OVM_SafetyChecker\n */\ncontract OVM_SafetyChecker is iOVM_SafetyChecker {\n\n /********************\n * Public Functions *\n ********************/\n /**\n * Returns whether or not all of the provided bytecode is safe.\n * @param _bytecode The bytecode to safety check.\n * @return `true` if the bytecode is safe, `false` otherwise.\n */\n function isBytecodeSafe(\n bytes memory _bytecode\n )\n override\n external\n pure\n returns (bool)\n {\n // autogenerated by gen_safety_checker_constants.py\n // number of bytes to skip for each opcode\n uint256[8] memory opcodeSkippableBytes = [\n uint256(0x0001010101010101010101010000000001010101010101010101010101010000),\n uint256(0x0100000000000000000000000000000000000000010101010101000000010100),\n uint256(0x0000000000000000000000000000000001010101000000010101010100000000),\n uint256(0x0203040500000000000000000000000000000000000000000000000000000000),\n uint256(0x0101010101010101010101010101010101010101010101010101010101010101),\n uint256(0x0101010101000000000000000000000000000000000000000000000000000000),\n uint256(0x0000000000000000000000000000000000000000000000000000000000000000),\n uint256(0x0000000000000000000000000000000000000000000000000000000000000000)\n ];\n // Mask to gate opcode specific cases\n uint256 opcodeGateMask = ~uint256(0xffffffffffffffffffffffe000000000fffffffff070ffff9c0ffffec000f001);\n // Halting opcodes\n uint256 opcodeHaltingMask = ~uint256(0x4008000000000000000000000000000000000000004000000000000000000001);\n // PUSH opcodes\n uint256 opcodePushMask = ~uint256(0xffffffff000000000000000000000000);\n\n uint256 codeLength;\n uint256 _pc;\n assembly {\n _pc := add(_bytecode, 0x20)\n }\n codeLength = _pc + _bytecode.length;\n do {\n // current opcode: 0x00...0xff\n uint256 opNum;\n\n // inline assembly removes the extra add + bounds check\n assembly {\n let word := mload(_pc) //load the next 32 bytes at pc into word\n\n // Look up number of bytes to skip from opcodeSkippableBytes and then update indexInWord\n // E.g. the 02030405 in opcodeSkippableBytes is the number of bytes to skip for PUSH1->4\n // We repeat this 6 times, thus we can only skip bytes for up to PUSH4 ((1+4) * 6 = 30 < 32).\n // If we see an opcode that is listed as 0 skippable bytes e.g. PUSH5,\n // then we will get stuck on that indexInWord and then opNum will be set to the PUSH5 opcode.\n let indexInWord := byte(0, mload(add(opcodeSkippableBytes, byte(0, word))))\n indexInWord := add(indexInWord, byte(0, mload(add(opcodeSkippableBytes, byte(indexInWord, word)))))\n indexInWord := add(indexInWord, byte(0, mload(add(opcodeSkippableBytes, byte(indexInWord, word)))))\n indexInWord := add(indexInWord, byte(0, mload(add(opcodeSkippableBytes, byte(indexInWord, word)))))\n indexInWord := add(indexInWord, byte(0, mload(add(opcodeSkippableBytes, byte(indexInWord, word)))))\n indexInWord := add(indexInWord, byte(0, mload(add(opcodeSkippableBytes, byte(indexInWord, word)))))\n _pc := add(_pc, indexInWord)\n\n opNum := byte(indexInWord, word)\n }\n\n // + push opcodes\n // + stop opcodes [STOP(0x00),JUMP(0x56),RETURN(0xf3),INVALID(0xfe)]\n // + caller opcode CALLER(0x33)\n // + blacklisted opcodes\n uint256 opBit = 1 << opNum;\n if (opBit & opcodeGateMask == 0) {\n if (opBit & opcodePushMask == 0) {\n // all pushes are valid opcodes\n // subsequent bytes are not opcodes. Skip them.\n _pc += (opNum - 0x5e); // PUSH1 is 0x60, so opNum-0x5f = PUSHed bytes and we +1 to\n // skip the _pc++; line below in order to save gas ((-0x5f + 1) = -0x5e)\n continue;\n } else if (opBit & opcodeHaltingMask == 0) {\n // STOP or JUMP or RETURN or INVALID (Note: REVERT is blacklisted, so not included here)\n // We are now inside unreachable code until we hit a JUMPDEST!\n do {\n _pc++;\n assembly {\n opNum := byte(0, mload(_pc))\n }\n // encountered a JUMPDEST\n if (opNum == 0x5b) break;\n // skip PUSHed bytes\n if ((1 << opNum) & opcodePushMask == 0) _pc += (opNum - 0x5f); // opNum-0x5f = PUSHed bytes (PUSH1 is 0x60)\n } while (_pc < codeLength);\n // opNum is 0x5b, so we don't continue here since the pc++ is fine\n } else if (opNum == 0x33) { // Caller opcode\n uint256 firstOps; // next 32 bytes of bytecode\n uint256 secondOps; // following 32 bytes of bytecode\n\n assembly {\n firstOps := mload(_pc)\n // 37 bytes total, 5 left over --> 32 - 5 bytes = 27 bytes = 216 bits\n secondOps := shr(216, mload(add(_pc, 0x20)))\n }\n\n // Call identity precompile\n // CALLER POP PUSH1 0x00 PUSH1 0x04 GAS CALL\n // 32 - 8 bytes = 24 bytes = 192\n if ((firstOps >> 192) == 0x3350600060045af1) {\n _pc += 8;\n // Call EM and abort execution if instructed\n // CALLER PUSH1 0x00 SWAP1 GAS CALL PC PUSH1 0x0E ADD JUMPI RETURNDATASIZE PUSH1 0x00 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x00 REVERT JUMPDEST RETURNDATASIZE PUSH1 0x01 EQ ISZERO PC PUSH1 0x0a ADD JUMPI PUSH1 0x01 PUSH1 0x00 RETURN JUMPDEST \n } else if (firstOps == 0x336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a015760 && secondOps == 0x016000f35b) {\n _pc += 37;\n } else {\n return false;\n }\n continue;\n } else {\n // encountered a non-whitelisted opcode!\n return false;\n }\n }\n _pc++;\n } while (_pc < codeLength);\n return true;\n }\n}\n" - } - }, - "settings": { - "optimizer": { - "enabled": true, - "runs": 200 - }, - "outputSelection": { - "*": { - "*": [ - "storageLayout", - "abi", - "evm.bytecode", - "evm.deployedBytecode", - "evm.methodIdentifiers", - "metadata", - "devdoc", - "userdoc", - "evm.gasEstimates" - ], - "": [ - "ast" - ] - } - }, - "metadata": { - "useLiteralContent": true - } - } -} \ No newline at end of file diff --git a/packages/contracts/deployments/mainnet-v2/.chainId b/packages/contracts/deployments/mainnet-v2/.chainId deleted file mode 100644 index 56a6051ca2b02..0000000000000 --- a/packages/contracts/deployments/mainnet-v2/.chainId +++ /dev/null @@ -1 +0,0 @@ -1 \ No newline at end of file diff --git a/packages/contracts/deployments/mainnet-v1/.chainId b/packages/contracts/deployments/mainnet/.chainId similarity index 100% rename from packages/contracts/deployments/mainnet-v1/.chainId rename to packages/contracts/deployments/mainnet/.chainId diff --git a/packages/contracts/deployments/mainnet-v2/Lib_AddressManager.json b/packages/contracts/deployments/mainnet/Lib_AddressManager.json similarity index 100% rename from packages/contracts/deployments/mainnet-v2/Lib_AddressManager.json rename to packages/contracts/deployments/mainnet/Lib_AddressManager.json diff --git a/packages/contracts/deployments/mainnet-v2/OVM_CanonicalTransactionChain.json b/packages/contracts/deployments/mainnet/OVM_CanonicalTransactionChain.json similarity index 100% rename from packages/contracts/deployments/mainnet-v2/OVM_CanonicalTransactionChain.json rename to packages/contracts/deployments/mainnet/OVM_CanonicalTransactionChain.json diff --git a/packages/contracts/deployments/mainnet-v2/OVM_ChainStorageContainer-CTC-batches.json b/packages/contracts/deployments/mainnet/OVM_ChainStorageContainer-CTC-batches.json similarity index 100% rename from packages/contracts/deployments/mainnet-v2/OVM_ChainStorageContainer-CTC-batches.json rename to packages/contracts/deployments/mainnet/OVM_ChainStorageContainer-CTC-batches.json diff --git a/packages/contracts/deployments/mainnet-v2/OVM_ChainStorageContainer-CTC-queue.json b/packages/contracts/deployments/mainnet/OVM_ChainStorageContainer-CTC-queue.json similarity index 100% rename from packages/contracts/deployments/mainnet-v2/OVM_ChainStorageContainer-CTC-queue.json rename to packages/contracts/deployments/mainnet/OVM_ChainStorageContainer-CTC-queue.json diff --git a/packages/contracts/deployments/mainnet-v2/OVM_ChainStorageContainer-SCC-batches.json b/packages/contracts/deployments/mainnet/OVM_ChainStorageContainer-SCC-batches.json similarity index 100% rename from packages/contracts/deployments/mainnet-v2/OVM_ChainStorageContainer-SCC-batches.json rename to packages/contracts/deployments/mainnet/OVM_ChainStorageContainer-SCC-batches.json diff --git a/packages/contracts/deployments/mainnet-v2/OVM_ExecutionManager.json b/packages/contracts/deployments/mainnet/OVM_ExecutionManager.json similarity index 100% rename from packages/contracts/deployments/mainnet-v2/OVM_ExecutionManager.json rename to packages/contracts/deployments/mainnet/OVM_ExecutionManager.json diff --git a/packages/contracts/deployments/mainnet-v2/OVM_FraudVerifier.json b/packages/contracts/deployments/mainnet/OVM_FraudVerifier.json similarity index 100% rename from packages/contracts/deployments/mainnet-v2/OVM_FraudVerifier.json rename to packages/contracts/deployments/mainnet/OVM_FraudVerifier.json diff --git a/packages/contracts/deployments/mainnet-v2/OVM_L1CrossDomainMessenger.json b/packages/contracts/deployments/mainnet/OVM_L1CrossDomainMessenger.json similarity index 100% rename from packages/contracts/deployments/mainnet-v2/OVM_L1CrossDomainMessenger.json rename to packages/contracts/deployments/mainnet/OVM_L1CrossDomainMessenger.json diff --git a/packages/contracts/deployments/mainnet-v2/OVM_L1ETHGateway.json b/packages/contracts/deployments/mainnet/OVM_L1ETHGateway.json similarity index 100% rename from packages/contracts/deployments/mainnet-v2/OVM_L1ETHGateway.json rename to packages/contracts/deployments/mainnet/OVM_L1ETHGateway.json diff --git a/packages/contracts/deployments/mainnet-v2/OVM_L1MultiMessageRelayer.json b/packages/contracts/deployments/mainnet/OVM_L1MultiMessageRelayer.json similarity index 100% rename from packages/contracts/deployments/mainnet-v2/OVM_L1MultiMessageRelayer.json rename to packages/contracts/deployments/mainnet/OVM_L1MultiMessageRelayer.json diff --git a/packages/contracts/deployments/mainnet-v2/OVM_SafetyChecker.json b/packages/contracts/deployments/mainnet/OVM_SafetyChecker.json similarity index 100% rename from packages/contracts/deployments/mainnet-v2/OVM_SafetyChecker.json rename to packages/contracts/deployments/mainnet/OVM_SafetyChecker.json diff --git a/packages/contracts/deployments/mainnet-v2/OVM_StateCommitmentChain.json b/packages/contracts/deployments/mainnet/OVM_StateCommitmentChain.json similarity index 100% rename from packages/contracts/deployments/mainnet-v2/OVM_StateCommitmentChain.json rename to packages/contracts/deployments/mainnet/OVM_StateCommitmentChain.json diff --git a/packages/contracts/deployments/mainnet-v2/OVM_StateManagerFactory.json b/packages/contracts/deployments/mainnet/OVM_StateManagerFactory.json similarity index 100% rename from packages/contracts/deployments/mainnet-v2/OVM_StateManagerFactory.json rename to packages/contracts/deployments/mainnet/OVM_StateManagerFactory.json diff --git a/packages/contracts/deployments/mainnet-v2/OVM_StateTransitionerFactory.json b/packages/contracts/deployments/mainnet/OVM_StateTransitionerFactory.json similarity index 100% rename from packages/contracts/deployments/mainnet-v2/OVM_StateTransitionerFactory.json rename to packages/contracts/deployments/mainnet/OVM_StateTransitionerFactory.json diff --git a/packages/contracts/deployments/mainnet-v2/Proxy__OVM_L1CrossDomainMessenger.json b/packages/contracts/deployments/mainnet/Proxy__OVM_L1CrossDomainMessenger.json similarity index 100% rename from packages/contracts/deployments/mainnet-v2/Proxy__OVM_L1CrossDomainMessenger.json rename to packages/contracts/deployments/mainnet/Proxy__OVM_L1CrossDomainMessenger.json diff --git a/packages/contracts/deployments/mainnet-v2/Proxy__OVM_L1ETHGateway.json b/packages/contracts/deployments/mainnet/Proxy__OVM_L1ETHGateway.json similarity index 100% rename from packages/contracts/deployments/mainnet-v2/Proxy__OVM_L1ETHGateway.json rename to packages/contracts/deployments/mainnet/Proxy__OVM_L1ETHGateway.json diff --git a/packages/contracts/deployments/mainnet-v2/mockOVM_BondManager.json b/packages/contracts/deployments/mainnet/mockOVM_BondManager.json similarity index 100% rename from packages/contracts/deployments/mainnet-v2/mockOVM_BondManager.json rename to packages/contracts/deployments/mainnet/mockOVM_BondManager.json diff --git a/packages/contracts/deployments/mainnet-v2/solcInputs/43ee6bb8ef92595aa6d0e22a6c464dff.json b/packages/contracts/deployments/mainnet/solcInputs/43ee6bb8ef92595aa6d0e22a6c464dff.json similarity index 100% rename from packages/contracts/deployments/mainnet-v2/solcInputs/43ee6bb8ef92595aa6d0e22a6c464dff.json rename to packages/contracts/deployments/mainnet/solcInputs/43ee6bb8ef92595aa6d0e22a6c464dff.json From 596746ad3cbc6b43cf8281be1b7a05422c6311d4 Mon Sep 17 00:00:00 2001 From: Georgios Konstantopoulos Date: Mon, 10 May 2021 21:50:02 +0300 Subject: [PATCH 54/81] chore: update deployments readme (#829) --- packages/contracts/deployments/README.md | 88 +++--------------------- 1 file changed, 8 insertions(+), 80 deletions(-) diff --git a/packages/contracts/deployments/README.md b/packages/contracts/deployments/README.md index 4a53078abce23..d7916ccf4249f 100644 --- a/packages/contracts/deployments/README.md +++ b/packages/contracts/deployments/README.md @@ -25,7 +25,7 @@ ## LAYER 1 -## MAINNET-V2 +## MAINNET Network : __mainnet (chain id: 1)__ @@ -33,9 +33,9 @@ Network : __mainnet (chain id: 1)__ |--|--| |Lib_AddressManager|[0xd3EeD86464Ff13B4BFD81a3bB1e753b7ceBA3A39](https://etherscan.io/address/0xd3EeD86464Ff13B4BFD81a3bB1e753b7ceBA3A39)| |OVM_CanonicalTransactionChain|[0x405B4008Da75C48F4E54AA39607378967Ae62338](https://etherscan.io/address/0x405B4008Da75C48F4E54AA39607378967Ae62338)| -|OVM_ChainStorageContainer:CTC:batches|[0x65E921eE201E4a0881FF84ea462baB744bB2fbf0](https://etherscan.io/address/0x65E921eE201E4a0881FF84ea462baB744bB2fbf0)| -|OVM_ChainStorageContainer:CTC:queue|[0x03004C447722d207B0355529A6d0dA0696BF6ec6](https://etherscan.io/address/0x03004C447722d207B0355529A6d0dA0696BF6ec6)| -|OVM_ChainStorageContainer:SCC:batches|[0x6B7Fce2C4FD1934a2d251F8b0930ac82DdDAD804](https://etherscan.io/address/0x6B7Fce2C4FD1934a2d251F8b0930ac82DdDAD804)| +|OVM_ChainStorageContainer-CTC-batches|[0x65E921eE201E4a0881FF84ea462baB744bB2fbf0](https://etherscan.io/address/0x65E921eE201E4a0881FF84ea462baB744bB2fbf0)| +|OVM_ChainStorageContainer-CTC-queue|[0x03004C447722d207B0355529A6d0dA0696BF6ec6](https://etherscan.io/address/0x03004C447722d207B0355529A6d0dA0696BF6ec6)| +|OVM_ChainStorageContainer-SCC-batches|[0x6B7Fce2C4FD1934a2d251F8b0930ac82DdDAD804](https://etherscan.io/address/0x6B7Fce2C4FD1934a2d251F8b0930ac82DdDAD804)| |OVM_ExecutionManager|[0xEd93C5c21c502bB52b4D77240fA9a5d38472304d](https://etherscan.io/address/0xEd93C5c21c502bB52b4D77240fA9a5d38472304d)| |OVM_FraudVerifier|[0xF7C64A47A557D2944798801C08771e15455c56c4](https://etherscan.io/address/0xF7C64A47A557D2944798801C08771e15455c56c4)| |OVM_L1CrossDomainMessenger|[0xeec700E5a793e28B068537c7dd95d632B603440A](https://etherscan.io/address/0xeec700E5a793e28B068537c7dd95d632B603440A)| @@ -49,23 +49,7 @@ Network : __mainnet (chain id: 1)__ |Proxy__OVM_L1ETHGateway|[0xF20C38fCdDF0C790319Fd7431d17ea0c2bC9959c](https://etherscan.io/address/0xF20C38fCdDF0C790319Fd7431d17ea0c2bC9959c)| |mockOVM_BondManager|[0x99EDa8472E93Aa28E5470eEDEc6e32081E14DaFC](https://etherscan.io/address/0x99EDa8472E93Aa28E5470eEDEc6e32081E14DaFC)| --- -## MAINNET-V1 - -Network : __mainnet (chain id: 1)__ - -|Contract|Address| -|--|--| -|Lib_AddressManager|[0x1De8CFD4C1A486200286073aE91DE6e8099519f1](https://etherscan.io/address/0x1De8CFD4C1A486200286073aE91DE6e8099519f1)| -|OVM_CanonicalTransactionChain|[0xed2701f7135eab0D7ca02e6Ab634AD6CbE159Ffb](https://etherscan.io/address/0xed2701f7135eab0D7ca02e6Ab634AD6CbE159Ffb)| -|OVM_ChainStorageContainer:CTC:batches|[0x7Cb043e523F6B5D492E0d2221e45062d3878599c](https://etherscan.io/address/0x7Cb043e523F6B5D492E0d2221e45062d3878599c)| -|OVM_ChainStorageContainer:CTC:queue|[0x62De49fe8215DFF88b9C1a2ea573E1471fF61f83](https://etherscan.io/address/0x62De49fe8215DFF88b9C1a2ea573E1471fF61f83)| -|OVM_ChainStorageContainer:SCC:batches|[0x7C3e67e5E885556cEF01866CB7bdB5A254D35698](https://etherscan.io/address/0x7C3e67e5E885556cEF01866CB7bdB5A254D35698)| -|OVM_L1CrossDomainMessenger|[0xE8F1bD5e5629F4adac6fd63A39F4b4cB76c5E7B2](https://etherscan.io/address/0xE8F1bD5e5629F4adac6fd63A39F4b4cB76c5E7B2)| -|OVM_StateCommitmentChain|[0x901a629a72A5daF200fc359657f070b34bBfdd18](https://etherscan.io/address/0x901a629a72A5daF200fc359657f070b34bBfdd18)| -|Proxy__OVM_L1CrossDomainMessenger|[0xfBE93ba0a2Df92A8e8D40cE00acCF9248a6Fc812](https://etherscan.io/address/0xfBE93ba0a2Df92A8e8D40cE00acCF9248a6Fc812)| -|mockOVM_BondManager|[0x64cfd73BE445F6Aa4ee9F4f7B1d068008a9DAc06](https://etherscan.io/address/0x64cfd73BE445F6Aa4ee9F4f7B1d068008a9DAc06)| ---- -## KOVAN-V2 +## KOVAN Network : __kovan (chain id: 42)__ @@ -73,9 +57,9 @@ Network : __kovan (chain id: 42)__ |--|--| |Lib_AddressManager|[0xFaf27b24ba54C6910C12CFF5C9453C0e8D634e05](https://kovan.etherscan.io/address/0xFaf27b24ba54C6910C12CFF5C9453C0e8D634e05)| |OVM_CanonicalTransactionChain|[0xeBD8F6ACF629f27AC7dDDD0603df3359a4f063E3](https://kovan.etherscan.io/address/0xeBD8F6ACF629f27AC7dDDD0603df3359a4f063E3)| -|OVM_ChainStorageContainer:CTC:batches|[0x18bA855471f10B74851C0e133db597075Dff128d](https://kovan.etherscan.io/address/0x18bA855471f10B74851C0e133db597075Dff128d)| -|OVM_ChainStorageContainer:CTC:queue|[0xf388A98F640baB14e5Cd343B1c27817811aDd682](https://kovan.etherscan.io/address/0xf388A98F640baB14e5Cd343B1c27817811aDd682)| -|OVM_ChainStorageContainer:SCC:batches|[0xDC1f37ec1eeBF9fe5087c24f889E15AB228FDD22](https://kovan.etherscan.io/address/0xDC1f37ec1eeBF9fe5087c24f889E15AB228FDD22)| +|OVM_ChainStorageContainer-CTC-batches|[0x18bA855471f10B74851C0e133db597075Dff128d](https://kovan.etherscan.io/address/0x18bA855471f10B74851C0e133db597075Dff128d)| +|OVM_ChainStorageContainer-CTC-queue|[0xf388A98F640baB14e5Cd343B1c27817811aDd682](https://kovan.etherscan.io/address/0xf388A98F640baB14e5Cd343B1c27817811aDd682)| +|OVM_ChainStorageContainer-SCC-batches|[0xDC1f37ec1eeBF9fe5087c24f889E15AB228FDD22](https://kovan.etherscan.io/address/0xDC1f37ec1eeBF9fe5087c24f889E15AB228FDD22)| |OVM_ExecutionManager|[0x1e9d3f68422b50d3Fc413cb6a79C4144089cf64A](https://kovan.etherscan.io/address/0x1e9d3f68422b50d3Fc413cb6a79C4144089cf64A)| |OVM_FraudVerifier|[0x139D12963897129D48C99402Cc481e8C0E8FD0BC](https://kovan.etherscan.io/address/0x139D12963897129D48C99402Cc481e8C0E8FD0BC)| |OVM_L1CrossDomainMessenger|[0xDBafb4AB19eafE27aF30Dd9C811a1BF4F64b603b](https://kovan.etherscan.io/address/0xDBafb4AB19eafE27aF30Dd9C811a1BF4F64b603b)| @@ -89,59 +73,3 @@ Network : __kovan (chain id: 42)__ |Proxy__OVM_L1ETHGateway|[0xf3902e50dA095bD2e954AB320E8eafDA6152dFDa](https://kovan.etherscan.io/address/0xf3902e50dA095bD2e954AB320E8eafDA6152dFDa)| |mockOVM_BondManager|[0x77e244ec49014cFb9c4572453568eCC3AbB70A2d](https://kovan.etherscan.io/address/0x77e244ec49014cFb9c4572453568eCC3AbB70A2d)| --- -## KOVAN-V1 - -Network : __kovan (chain id: 42)__ - -|Contract|Address| -|--|--| -|Lib_AddressManager|[0x72e6F5244828C10737cbC9659378B207246D26B2](https://kovan.etherscan.io/address/0x72e6F5244828C10737cbC9659378B207246D26B2)| -|OVM_CanonicalTransactionChain|[0x0ecB7253Aef93dD936E2a9BCEb49bc2fA683Ee65](https://kovan.etherscan.io/address/0x0ecB7253Aef93dD936E2a9BCEb49bc2fA683Ee65)| -|OVM_ChainStorageContainer:CTC:batches|[0x095744753D5353C1FC43EFb1ab81D06f3e2F4630](https://kovan.etherscan.io/address/0x095744753D5353C1FC43EFb1ab81D06f3e2F4630)| -|OVM_ChainStorageContainer:CTC:queue|[0xFCE31EC2Bc82553FaA4A9a6DF36c9b0DFDAdD4B8](https://kovan.etherscan.io/address/0xFCE31EC2Bc82553FaA4A9a6DF36c9b0DFDAdD4B8)| -|OVM_ChainStorageContainer:SCC:batches|[0xcFf7ed66bC3C1eA64c6394FEBb2408D16c6cBC5E](https://kovan.etherscan.io/address/0xcFf7ed66bC3C1eA64c6394FEBb2408D16c6cBC5E)| -|OVM_L1CrossDomainMessenger|[0x19da6C4945f18F5E720054FECC50D6b5E015bd40](https://kovan.etherscan.io/address/0x19da6C4945f18F5E720054FECC50D6b5E015bd40)| -|OVM_StateCommitmentChain|[0x2AAbAf6799822Efc77865401E05CE02897ecf520](https://kovan.etherscan.io/address/0x2AAbAf6799822Efc77865401E05CE02897ecf520)| -|Proxy__OVM_L1CrossDomainMessenger|[0xb89065D5eB05Cac554FDB11fC764C679b4202322](https://kovan.etherscan.io/address/0xb89065D5eB05Cac554FDB11fC764C679b4202322)| -|mockOVM_BondManager|[0x3Ff73EBc1d916a1A976521160ad92dFDF6a06d1f](https://kovan.etherscan.io/address/0x3Ff73EBc1d916a1A976521160ad92dFDF6a06d1f)| ---- -## GOERLI-V2 - -Network : __goerli (chain id: 5)__ - -|Contract|Address| -|--|--| -|Lib_AddressManager|[0x9933d137bBF050Cf3D7555fE1beC91eF698814e5](https://goerli.etherscan.io/address/0x9933d137bBF050Cf3D7555fE1beC91eF698814e5)| -|OVM_CanonicalTransactionChain|[0x557057458Ba57F03e3191ddA69118DFe42a7295d](https://goerli.etherscan.io/address/0x557057458Ba57F03e3191ddA69118DFe42a7295d)| -|OVM_ChainStorageContainer:CTC:batches|[0x648D625eCa2A2491547d2D702e21070675518E4a](https://goerli.etherscan.io/address/0x648D625eCa2A2491547d2D702e21070675518E4a)| -|OVM_ChainStorageContainer:CTC:queue|[0xe7C69bfEC244EC659871E5685fc17D86eaFB8305](https://goerli.etherscan.io/address/0xe7C69bfEC244EC659871E5685fc17D86eaFB8305)| -|OVM_ChainStorageContainer:SCC:batches|[0x96bD3A792Cc288C51C55A33BC8089026c7009bfd](https://goerli.etherscan.io/address/0x96bD3A792Cc288C51C55A33BC8089026c7009bfd)| -|OVM_ExecutionManager|[0x3212027673655d3047c13139e3233ccd4A78417c](https://goerli.etherscan.io/address/0x3212027673655d3047c13139e3233ccd4A78417c)| -|OVM_FraudVerifier|[0x08BB26333Ed18CcF632e2d68DdC9B5aFfb2EE687](https://goerli.etherscan.io/address/0x08BB26333Ed18CcF632e2d68DdC9B5aFfb2EE687)| -|OVM_L1CrossDomainMessenger|[0x7910D57c49fAE4F7c896A6cd185aB1e6196D8161](https://goerli.etherscan.io/address/0x7910D57c49fAE4F7c896A6cd185aB1e6196D8161)| -|OVM_L1ETHGateway|[0x2C9573A5c0d94075601dB745255645FE5D2e5f7C](https://goerli.etherscan.io/address/0x2C9573A5c0d94075601dB745255645FE5D2e5f7C)| -|OVM_L1MultiMessageRelayer|[0x120b44cC54e9b7E79b3583BE6B797D36DF9fD90a](https://goerli.etherscan.io/address/0x120b44cC54e9b7E79b3583BE6B797D36DF9fD90a)| -|OVM_SafetyChecker|[0x97203a63AC85D811b75575bc5F7Ddc414548B287](https://goerli.etherscan.io/address/0x97203a63AC85D811b75575bc5F7Ddc414548B287)| -|OVM_StateCommitmentChain|[0xc983d52292DCBBEE53a0730C6A3EEb61c6F19129](https://goerli.etherscan.io/address/0xc983d52292DCBBEE53a0730C6A3EEb61c6F19129)| -|OVM_StateManagerFactory|[0x625Ee9D6a8486FDc0c70b1793F37d368f4698014](https://goerli.etherscan.io/address/0x625Ee9D6a8486FDc0c70b1793F37d368f4698014)| -|OVM_StateTransitionerFactory|[0x28f8A0877c2DC85b3Aa269bD772CaCc6e92D7371](https://goerli.etherscan.io/address/0x28f8A0877c2DC85b3Aa269bD772CaCc6e92D7371)| -|Proxy__OVM_L1CrossDomainMessenger|[0x03F6221792451CAD23dF17fF4D702bF93978a9b3](https://goerli.etherscan.io/address/0x03F6221792451CAD23dF17fF4D702bF93978a9b3)| -|Proxy__OVM_L1ETHGateway|[0x499223f87451F2dcC638c506ff7549838A3ee00e](https://goerli.etherscan.io/address/0x499223f87451F2dcC638c506ff7549838A3ee00e)| -|mockOVM_BondManager|[0x1e4f220d5CDD25e2C0E60e0B2f56a7CCC25719C1](https://goerli.etherscan.io/address/0x1e4f220d5CDD25e2C0E60e0B2f56a7CCC25719C1)| ---- -## GOERLI-V1 - -Network : __goerli (chain id: 5)__ - -|Contract|Address| -|--|--| -|Lib_AddressManager|[0x5011A092e66B2c89e2d09dfb9E418B4bCFb24C80](https://goerli.etherscan.io/address/0x5011A092e66B2c89e2d09dfb9E418B4bCFb24C80)| -|OVM_CanonicalTransactionChain|[0x8468e3B58Cc7B34ab07ca5b80CB234e271435120](https://goerli.etherscan.io/address/0x8468e3B58Cc7B34ab07ca5b80CB234e271435120)| -|OVM_ChainStorageContainer:CTC:batches|[0xe0992cB281cfb66cC53A98B7d32B0305d37F723D](https://goerli.etherscan.io/address/0xe0992cB281cfb66cC53A98B7d32B0305d37F723D)| -|OVM_ChainStorageContainer:CTC:queue|[0x85f5bDc9C0269D32154fa1CCdbf697B46AF37273](https://goerli.etherscan.io/address/0x85f5bDc9C0269D32154fa1CCdbf697B46AF37273)| -|OVM_ChainStorageContainer:SCC:batches|[0x2c68C92992c516b7Bdd816cc471938025672fd7a](https://goerli.etherscan.io/address/0x2c68C92992c516b7Bdd816cc471938025672fd7a)| -|OVM_L1CrossDomainMessenger|[0x1c15fcA66a14eB2de5cDCf0BF1f45580b58ca5AC](https://goerli.etherscan.io/address/0x1c15fcA66a14eB2de5cDCf0BF1f45580b58ca5AC)| -|OVM_StateCommitmentChain|[0xAE493AD1fFCD654E6e4b78a66be3c9780a6ca89d](https://goerli.etherscan.io/address/0xAE493AD1fFCD654E6e4b78a66be3c9780a6ca89d)| -|Proxy__OVM_L1CrossDomainMessenger|[0x0f94dA8E27A6116E341c5C807aD32c62EBc90eB6](https://goerli.etherscan.io/address/0x0f94dA8E27A6116E341c5C807aD32c62EBc90eB6)| -|mockOVM_BondManager|[0x1F5AbC065D4B3F3dc127CA8B0042bD4Fcaf79EFC](https://goerli.etherscan.io/address/0x1F5AbC065D4B3F3dc127CA8B0042bD4Fcaf79EFC)| ---- From 6132e7ab81a0c2c964be034ff0baff4db8646276 Mon Sep 17 00:00:00 2001 From: smartcontracts Date: Mon, 10 May 2021 14:50:52 -0400 Subject: [PATCH 55/81] maintenance[contracts]: move various deps to dev deps (#818) * maintenance: move various deps to dev deps * chore: add changeset --- .changeset/kind-bears-think.md | 5 +++++ packages/contracts/package.json | 11 +++++------ 2 files changed, 10 insertions(+), 6 deletions(-) create mode 100644 .changeset/kind-bears-think.md diff --git a/.changeset/kind-bears-think.md b/.changeset/kind-bears-think.md new file mode 100644 index 0000000000000..6c23951cc055d --- /dev/null +++ b/.changeset/kind-bears-think.md @@ -0,0 +1,5 @@ +--- +'@eth-optimism/contracts': patch +--- + +Move various dependencies from primary deps to dev deps diff --git a/packages/contracts/package.json b/packages/contracts/package.json index d1936869480d2..5b6b7451bd667 100644 --- a/packages/contracts/package.json +++ b/packages/contracts/package.json @@ -48,12 +48,7 @@ "@eth-optimism/core-utils": "^0.4.1", "@ethersproject/abstract-provider": "^5.0.8", "@ethersproject/contracts": "^5.0.5", - "@openzeppelin/contracts": "^3.3.0", - "@openzeppelin/contracts-upgradeable": "^3.3.0", - "@typechain/hardhat": "^1.0.1", - "ganache-core": "^2.13.2", - "glob": "^7.1.6", - "solidity-coverage": "^0.7.16" + "glob": "^7.1.6" }, "devDependencies": { "@codechecks/client": "0.1.10-beta", @@ -63,6 +58,9 @@ "@nomiclabs/hardhat-waffle": "^2.0.1", "@typechain/ethers-v5": "1.0.0", "@types/buffer-xor": "^2.0.0", + "@typechain/hardhat": "^1.0.1", + "@openzeppelin/contracts": "^3.3.0", + "@openzeppelin/contracts-upgradeable": "^3.3.0", "@types/chai": "^4.2.17", "@types/copyfiles": "^2.4.0", "@types/glob": "^7.1.3", @@ -71,6 +69,7 @@ "@types/mocha": "^8.2.2", "@types/yargs": "^16.0.1", "buffer-xor": "^2.0.2", + "ganache-core": "^2.13.2", "chai": "^4.3.1", "copyfiles": "^2.3.0", "directory-tree": "^2.2.7", From 20747fd56f95d5f303395a6d58a2af177c7b6470 Mon Sep 17 00:00:00 2001 From: smartcontracts Date: Mon, 10 May 2021 15:30:36 -0400 Subject: [PATCH 56/81] feat[contracts]: have hardhat-deploy register L1MultiMessageRelayer on mainnet (#828) * feat[contracts]: have deploy register multi message relayer on L1 * chore: add changeset * fix: minor typo in comment * fix: remove unnecessary changes --- .changeset/tender-rings-deliver.md | 5 +++++ .../014-OVM_L1MultiMessageRelayer.deploy.ts | 15 +++++++++++++++ 2 files changed, 20 insertions(+) create mode 100644 .changeset/tender-rings-deliver.md diff --git a/.changeset/tender-rings-deliver.md b/.changeset/tender-rings-deliver.md new file mode 100644 index 0000000000000..cd2d9b95bb19d --- /dev/null +++ b/.changeset/tender-rings-deliver.md @@ -0,0 +1,5 @@ +--- +'@eth-optimism/contracts': patch +--- + +Set L2MessageRelayer name to L1MultiMessageRelayer when deploying to mainnet diff --git a/packages/contracts/deploy/014-OVM_L1MultiMessageRelayer.deploy.ts b/packages/contracts/deploy/014-OVM_L1MultiMessageRelayer.deploy.ts index 8b74aefa3fdf9..21040b0bf6dbb 100644 --- a/packages/contracts/deploy/014-OVM_L1MultiMessageRelayer.deploy.ts +++ b/packages/contracts/deploy/014-OVM_L1MultiMessageRelayer.deploy.ts @@ -5,6 +5,7 @@ import { DeployFunction } from 'hardhat-deploy/dist/types' import { deployAndRegister, getDeployedContract, + registerAddress, } from '../src/hardhat-deploy-ethers' const deployFn: DeployFunction = async (hre) => { @@ -18,6 +19,20 @@ const deployFn: DeployFunction = async (hre) => { name: 'OVM_L1MultiMessageRelayer', args: [Lib_AddressManager.address], }) + + // OVM_L2MessageRelayer *must* be set to multi message relayer address on mainnet. + if (hre.network.name.includes('mainnet')) { + const OVM_L1MultiMessageRelayer = await getDeployedContract( + hre, + 'OVM_L1MultiMessageRelayer' + ) + + await registerAddress({ + hre, + name: 'OVM_L2MessageRelayer', + address: OVM_L1MultiMessageRelayer.address + }) + } } deployFn.dependencies = ['Lib_AddressManager'] From b799caab202889f1fb2c9a7f8db4261e67accd29 Mon Sep 17 00:00:00 2001 From: Karl Floersch Date: Mon, 10 May 2021 14:43:02 -0700 Subject: [PATCH 57/81] feat: v0.3.0 release candidate (#603) * feat: Attempt to decode txs as RLP first (#563) Co-authored-by: smartcontracts * l2geth: remove eth_sendRawEthSignTransaction endpoint (#589) * feat[contracts]: Use standard RLP transaction format (#566) * feat[contracts]: Use standard RLP transaction format * fix[l2geth]: Encode transaction as RLP * fix: Correct gas estimation in integration tests * fix: Correct gas estimation in integration tests * Update packages/contracts/contracts/optimistic-ethereum/OVM/predeploys/OVM_SequencerEntrypoint.sol Co-authored-by: ben-chain * fix[contracts]: Use isCreate instead of checking target address * fix[contracts]: Minor optimization in SequencerEntrypoint * fix[contracts]: Pass max gas to contract call in EOA contract Co-authored-by: ben-chain * feat[contracts]: Make ProxyEOA compatible with eip1967 (#592) * feat[contracts]: Make ProxyEOA compatible with eip1967 * fix[contracts]: Fix bug introduced by indirect constant * chore[contracts]: Add changeset * Update .changeset/old-cycles-invite.md Co-authored-by: Georgios Konstantopoulos * l2geth: remove ovmsigner (#591) * l2geth: remove ovmsigner Also reduce the diff Co-authored-by: smartcontracts * l2geth: add changeset * l2geth: set rlp encoded tx in txmeta in RPC layer (#644) * l2geth: set rlp encoded tx in txmeta in RPC layer * l2geth: remove extra setter of txmeta * chore: add changeset * feat: Have ExecutionManager pass data upwards (#643) * feat[contracts]: Make ExecutionManager return data * fix[l2geth]: fix linting error * fix[contracts]: Fix build error * fix[contracts]: fix failing unit tests * Add changeset Co-authored-by: Karl Floersch * rpc: only allow txs with no calldata when there is value (#645) * l2geth: api checks for 0 value * chore: add changeset * l2geth: remove check for specific gasprice * feat[contracts]: Add value transfer support to ECDSAContractAccount (#619) * feat[contracts]: Use standard RLP transaction format (#566) * feat[contracts]: Use standard RLP transaction format * fix[l2geth]: Encode transaction as RLP * fix: Correct gas estimation in integration tests * fix: Correct gas estimation in integration tests * Update packages/contracts/contracts/optimistic-ethereum/OVM/predeploys/OVM_SequencerEntrypoint.sol Co-authored-by: ben-chain * fix[contracts]: Use isCreate instead of checking target address * fix[contracts]: Minor optimization in SequencerEntrypoint * fix[contracts]: Pass max gas to contract call in EOA contract Co-authored-by: ben-chain * feat[contracts]: Add value transfer to contract account * fix[contracts]: Tweak transfer logic and add tests * fix[geth]: Remove logic that rejects value gt 0 txs * fix: nonce issue in rpc tests * fix: use correct wallet in rpc value tests * Update rpc.spec.ts * cleanup: remove double definition * chore: add changeset * chore: add changeset * tests: delete dead test * l2geth: log the tx value * l2geth: pass through zero value at top level * test: receipt passes * test: more specifically set balance Co-authored-by: ben-chain Co-authored-by: Mark Tyneway * dtl: remove legacy encoding (#618) * dtl: remove legacy decoding * tests: remove dead test * chore: add changeset * Add Goerli v3 deployment (#651) * Add Goerli v3 deployment * Add Goerli v3 to README * dtlL fix syncing off by one (#687) * dtl: syncing off by one error * chore: add changeset * dtl: index the value field (#686) * chore: add changeset * chore: add changeset * dtl: pass through value field * core-utils: update and test toRpcString * lint: fix * l2geth: parse value fields * chore: add changeset * rpc: gas fixes (#695) * l2geth: prevent fees lower than 21000 * l2geth: remove old check for too high tx gaslimit * tests: update to use new min gas estimated value * chore: add changeset * test: update expected values * test: remove dead test * examples: fix waffle example + gas changes in tests (#724) * examples: fix waffle example * tests: update gas price in assertion * chore: add changeset * l2geth: estimate gas assertion in decimal * test: use configurable key * ops: delete extra whitespace (#731) * fix: prevent eth sendtransaction (#725) * api: prevent unsafe calls * api: fill in txmeta * chore: add changeset * chore: add changeset * l2geth + contracts: standard interface for systems contracts and userland contracts (#721) * l2geth: fix call returndata parsing * contracts: standardize simulateMessage and run to return bytes * chore: add changeset * chore: add changeset * l2geth: more simple decoding * contracts: remove named arguments * chore: fix linter errors * Add contract deployment to Kovan (#715) * fix: remove type check in rollup client (#750) * l2geth: remove tx type check in client * chore: add changeset * dtl: prevent null reference in L1 handler (#757) * dtl: prevent reference of null value * chore: add changeset * test: eth_call exceptions (#800) * feat[l2geth]: Pass up contract revert reasons during DoEstimateGas (#774) * wip: Starting work on geth revert reasons during estimate gas fix: error in comment fix: I got things backwards fix: Use UnpackValues instead of Unpack Update l2geth/accounts/abi/abi.go Co-authored-by: Georgios Konstantopoulos * Add integration test for reverts fix: build error * chore: Add changeset Co-authored-by: Georgios Konstantopoulos * chore: add changeset (#831) * Migrate ETH between gateways (#778) * add migrate ETH functionality * contracts: add eth gateway docstring (#832) Co-authored-by: Mark Tyneway Co-authored-by: smartcontracts Co-authored-by: Mark Tyneway Co-authored-by: smartcontracts Co-authored-by: ben-chain Co-authored-by: Georgios Konstantopoulos Co-authored-by: Maurelian Co-authored-by: Kevin Ho --- .changeset/beige-keys-hammer.md | 5 + .changeset/blue-needles-clap.md | 5 + .changeset/brown-bananas-deny.md | 5 + .changeset/chilly-grapes-greet.md | 5 + .changeset/curly-pumas-wait.md | 5 + .changeset/early-hats-sell.md | 6 + .changeset/eight-beers-prove.md | 6 + .changeset/fuzzy-gorillas-accept.md | 7 + .changeset/good-poets-march.md | 5 + .changeset/great-clouds-call.md | 5 + .changeset/grumpy-bananas-brush.md | 5 + .changeset/kind-plants-tickle.md | 5 + .changeset/light-needles-brush.md | 5 + .changeset/mean-comics-rush.md | 6 + .changeset/old-cycles-invite.md | 5 + .changeset/sharp-flowers-fail.md | 5 + .changeset/six-ties-invent.md | 10 + .changeset/ten-keys-share.md | 5 + .changeset/thirty-radios-sniff.md | 5 + .changeset/tough-lamps-hammer.md | 5 + .changeset/violet-comics-reflect.md | 5 + .changeset/weak-suits-burn.md | 5 + examples/waffle/test/erc20.spec.js | 64 +- .../contracts/ConstructorReverter.sol | 10 + integration-tests/contracts/ERC20.sol | 2 +- integration-tests/contracts/Reverter.sol | 10 + integration-tests/hardhat.config.ts | 1 + integration-tests/package.json | 1 + integration-tests/test/erc20.spec.ts | 11 +- integration-tests/test/fee-payment.spec.ts | 9 - integration-tests/test/native-eth.spec.ts | 4 +- integration-tests/test/rpc.spec.ts | 177 ++- integration-tests/test/shared/utils.ts | 8 +- l2geth/accounts/abi/abi.go | 24 + l2geth/core/state_transition.go | 2 +- l2geth/core/state_transition_ovm.go | 2 +- l2geth/core/types/transaction_signing.go | 153 +- l2geth/core/types/transaction_signing_test.go | 97 -- l2geth/core/types/transaction_test.go | 2 +- l2geth/core/vm/evm.go | 171 +-- l2geth/eth/api_backend.go | 17 +- l2geth/eth/api_backend_test.go | 41 - l2geth/internal/ethapi/api.go | 95 +- l2geth/miner/worker.go | 2 +- l2geth/rollup/client.go | 21 +- l2geth/rollup/sync_service.go | 112 -- ops/docker-compose.yml | 4 +- .../OVM/accounts/OVM_ECDSAContractAccount.sol | 94 +- .../OVM/accounts/OVM_ProxyEOA.sol | 12 +- .../OVM/bridge/tokens/OVM_L1ETHGateway.sol | 21 + .../OVM/execution/OVM_ExecutionManager.sol | 19 +- .../predeploys/OVM_SequencerEntrypoint.sol | 131 +- .../accounts/iOVM_ECDSAContractAccount.sol | 13 +- .../iOVM/execution/iOVM_ExecutionManager.sol | 2 +- .../libraries/codec/Lib_EIP155Tx.sol | 203 +++ .../libraries/codec/Lib_OVMCodec.sol | 138 -- .../libraries/rlp/Lib_RLPWriter.sol | 17 + .../libraries/utils/Lib_ECDSAUtils.sol | 98 -- .../wrappers/Lib_ExecutionManagerWrapper.sol | 19 + .../test-libraries/codec/TestLib_EIP155Tx.sol | 71 + .../test-libraries/codec/TestLib_OVMCodec.sol | 29 - .../utils/TestLib_ECDSAUtils.sol | 33 - packages/contracts/deployments/README.md | 2 +- .../contracts/deployments/goerli-v3/.chainId | 1 + .../goerli-v3/Lib_AddressManager.json | 230 +++ .../OVM_CanonicalTransactionChain.json | 819 +++++++++++ ...OVM_ChainStorageContainer:CTC:batches.json | 453 ++++++ .../OVM_ChainStorageContainer:CTC:queue.json | 453 ++++++ ...OVM_ChainStorageContainer:SCC:batches.json | 453 ++++++ .../goerli-v3/OVM_ExecutionManager.json | 1269 +++++++++++++++++ .../goerli-v3/OVM_FraudVerifier.json | 576 ++++++++ .../goerli-v3/OVM_L1CrossDomainMessenger.json | 514 +++++++ .../goerli-v3/OVM_L1ETHGateway.json | 293 ++++ .../goerli-v3/OVM_L1MultiMessageRelayer.json | 234 +++ .../goerli-v3/OVM_SafetyChecker.json | 74 + .../goerli-v3/OVM_StateCommitmentChain.json | 529 +++++++ .../goerli-v3/OVM_StateManagerFactory.json | 74 + .../OVM_StateTransitionerFactory.json | 163 +++ .../Proxy__OVM_L1CrossDomainMessenger.json | 118 ++ .../goerli-v3/Proxy__OVM_L1ETHGateway.json | 118 ++ .../goerli-v3/mockOVM_BondManager.json | 242 ++++ .../dde656dd41f49cad9eac9bc7065fd6a7.json | 290 ++++ .../contracts/deployments/kovan-v3/.chainId | 1 + .../kovan-v3/Lib_AddressManager.json | 230 +++ .../OVM_CanonicalTransactionChain.json | 819 +++++++++++ ...OVM_ChainStorageContainer:CTC:batches.json | 453 ++++++ .../OVM_ChainStorageContainer:CTC:queue.json | 453 ++++++ ...OVM_ChainStorageContainer:SCC:batches.json | 453 ++++++ .../kovan-v3/OVM_ExecutionManager.json | 1269 +++++++++++++++++ .../kovan-v3/OVM_FraudVerifier.json | 576 ++++++++ .../kovan-v3/OVM_L1CrossDomainMessenger.json | 798 +++++++++++ .../kovan-v3/OVM_L1ETHGateway.json | 293 ++++ .../kovan-v3/OVM_L1MultiMessageRelayer.json | 234 +++ .../kovan-v3/OVM_SafetyChecker.json | 74 + .../kovan-v3/OVM_StateCommitmentChain.json | 529 +++++++ .../kovan-v3/OVM_StateManagerFactory.json | 74 + .../OVM_StateTransitionerFactory.json | 163 +++ .../Proxy__OVM_L1CrossDomainMessenger.json | 118 ++ .../kovan-v3/Proxy__OVM_L1ETHGateway.json | 118 ++ .../kovan-v3/mockOVM_BondManager.json | 242 ++++ .../5ee8e508e2c54cb5ac6783b4855b1558.json | 308 ++++ .../accounts/OVM_ECDSAContractAccount.spec.ts | 265 ++-- .../OVM/accounts/OVM_ProxyEOA.spec.ts | 2 +- .../bridge/assets/OVM_L1ETHGateway.spec.ts | 43 +- .../OVM_ExecutionManager.gas-spec.ts | 2 +- .../OVM_SequencerEntrypoint.spec.ts | 145 +- .../libraries/codec/Lib_EIP155Tx.spec.ts | 15 + .../libraries/utils/Lib_ECDSAUtils.spec.ts | 9 - packages/contracts/test/data/index.ts | 2 +- .../libraries/codec/Lib_EIP155Tx.test.json | 725 ++++++++++ .../libraries/codec/Lib_OVMCodec.test.json | 19 - .../libraries/utils/Lib_ECDSAUtils.test.json | 126 -- .../contracts/test/helpers/codec/encoding.ts | 112 -- .../helpers/test-runner/json-test-runner.ts | 8 +- .../handlers/sequencer-batch-appended.ts | 49 +- .../src/services/server/service.ts | 3 +- .../handlers/sequencer-batch-appended.spec.ts | 59 - 117 files changed, 16099 insertions(+), 1655 deletions(-) create mode 100644 .changeset/beige-keys-hammer.md create mode 100644 .changeset/blue-needles-clap.md create mode 100644 .changeset/brown-bananas-deny.md create mode 100644 .changeset/chilly-grapes-greet.md create mode 100644 .changeset/curly-pumas-wait.md create mode 100644 .changeset/early-hats-sell.md create mode 100644 .changeset/eight-beers-prove.md create mode 100644 .changeset/fuzzy-gorillas-accept.md create mode 100644 .changeset/good-poets-march.md create mode 100644 .changeset/great-clouds-call.md create mode 100644 .changeset/grumpy-bananas-brush.md create mode 100644 .changeset/kind-plants-tickle.md create mode 100644 .changeset/light-needles-brush.md create mode 100644 .changeset/mean-comics-rush.md create mode 100644 .changeset/old-cycles-invite.md create mode 100644 .changeset/sharp-flowers-fail.md create mode 100644 .changeset/six-ties-invent.md create mode 100644 .changeset/ten-keys-share.md create mode 100644 .changeset/thirty-radios-sniff.md create mode 100644 .changeset/tough-lamps-hammer.md create mode 100644 .changeset/violet-comics-reflect.md create mode 100644 .changeset/weak-suits-burn.md create mode 100644 integration-tests/contracts/ConstructorReverter.sol create mode 100644 integration-tests/contracts/Reverter.sol delete mode 100644 l2geth/eth/api_backend_test.go create mode 100644 packages/contracts/contracts/optimistic-ethereum/libraries/codec/Lib_EIP155Tx.sol delete mode 100644 packages/contracts/contracts/optimistic-ethereum/libraries/utils/Lib_ECDSAUtils.sol create mode 100644 packages/contracts/contracts/test-libraries/codec/TestLib_EIP155Tx.sol delete mode 100644 packages/contracts/contracts/test-libraries/utils/TestLib_ECDSAUtils.sol create mode 100644 packages/contracts/deployments/goerli-v3/.chainId create mode 100644 packages/contracts/deployments/goerli-v3/Lib_AddressManager.json create mode 100644 packages/contracts/deployments/goerli-v3/OVM_CanonicalTransactionChain.json create mode 100644 packages/contracts/deployments/goerli-v3/OVM_ChainStorageContainer:CTC:batches.json create mode 100644 packages/contracts/deployments/goerli-v3/OVM_ChainStorageContainer:CTC:queue.json create mode 100644 packages/contracts/deployments/goerli-v3/OVM_ChainStorageContainer:SCC:batches.json create mode 100644 packages/contracts/deployments/goerli-v3/OVM_ExecutionManager.json create mode 100644 packages/contracts/deployments/goerli-v3/OVM_FraudVerifier.json create mode 100644 packages/contracts/deployments/goerli-v3/OVM_L1CrossDomainMessenger.json create mode 100644 packages/contracts/deployments/goerli-v3/OVM_L1ETHGateway.json create mode 100644 packages/contracts/deployments/goerli-v3/OVM_L1MultiMessageRelayer.json create mode 100644 packages/contracts/deployments/goerli-v3/OVM_SafetyChecker.json create mode 100644 packages/contracts/deployments/goerli-v3/OVM_StateCommitmentChain.json create mode 100644 packages/contracts/deployments/goerli-v3/OVM_StateManagerFactory.json create mode 100644 packages/contracts/deployments/goerli-v3/OVM_StateTransitionerFactory.json create mode 100644 packages/contracts/deployments/goerli-v3/Proxy__OVM_L1CrossDomainMessenger.json create mode 100644 packages/contracts/deployments/goerli-v3/Proxy__OVM_L1ETHGateway.json create mode 100644 packages/contracts/deployments/goerli-v3/mockOVM_BondManager.json create mode 100644 packages/contracts/deployments/goerli-v3/solcInputs/dde656dd41f49cad9eac9bc7065fd6a7.json create mode 100644 packages/contracts/deployments/kovan-v3/.chainId create mode 100644 packages/contracts/deployments/kovan-v3/Lib_AddressManager.json create mode 100644 packages/contracts/deployments/kovan-v3/OVM_CanonicalTransactionChain.json create mode 100644 packages/contracts/deployments/kovan-v3/OVM_ChainStorageContainer:CTC:batches.json create mode 100644 packages/contracts/deployments/kovan-v3/OVM_ChainStorageContainer:CTC:queue.json create mode 100644 packages/contracts/deployments/kovan-v3/OVM_ChainStorageContainer:SCC:batches.json create mode 100644 packages/contracts/deployments/kovan-v3/OVM_ExecutionManager.json create mode 100644 packages/contracts/deployments/kovan-v3/OVM_FraudVerifier.json create mode 100644 packages/contracts/deployments/kovan-v3/OVM_L1CrossDomainMessenger.json create mode 100644 packages/contracts/deployments/kovan-v3/OVM_L1ETHGateway.json create mode 100644 packages/contracts/deployments/kovan-v3/OVM_L1MultiMessageRelayer.json create mode 100644 packages/contracts/deployments/kovan-v3/OVM_SafetyChecker.json create mode 100644 packages/contracts/deployments/kovan-v3/OVM_StateCommitmentChain.json create mode 100644 packages/contracts/deployments/kovan-v3/OVM_StateManagerFactory.json create mode 100644 packages/contracts/deployments/kovan-v3/OVM_StateTransitionerFactory.json create mode 100644 packages/contracts/deployments/kovan-v3/Proxy__OVM_L1CrossDomainMessenger.json create mode 100644 packages/contracts/deployments/kovan-v3/Proxy__OVM_L1ETHGateway.json create mode 100644 packages/contracts/deployments/kovan-v3/mockOVM_BondManager.json create mode 100644 packages/contracts/deployments/kovan-v3/solcInputs/5ee8e508e2c54cb5ac6783b4855b1558.json create mode 100644 packages/contracts/test/contracts/libraries/codec/Lib_EIP155Tx.spec.ts delete mode 100644 packages/contracts/test/contracts/libraries/utils/Lib_ECDSAUtils.spec.ts create mode 100644 packages/contracts/test/data/json/libraries/codec/Lib_EIP155Tx.test.json delete mode 100644 packages/contracts/test/data/json/libraries/utils/Lib_ECDSAUtils.test.json diff --git a/.changeset/beige-keys-hammer.md b/.changeset/beige-keys-hammer.md new file mode 100644 index 0000000000000..c7f737b878627 --- /dev/null +++ b/.changeset/beige-keys-hammer.md @@ -0,0 +1,5 @@ +--- +"@eth-optimism/data-transport-layer": patch +--- + +Parse and index the value field in the data transport layer diff --git a/.changeset/blue-needles-clap.md b/.changeset/blue-needles-clap.md new file mode 100644 index 0000000000000..fccbfa51e50c8 --- /dev/null +++ b/.changeset/blue-needles-clap.md @@ -0,0 +1,5 @@ +--- +"@eth-optimism/data-transport-layer": patch +--- + +Account for the off by one with regards to the l2geth block number and the CTC index diff --git a/.changeset/brown-bananas-deny.md b/.changeset/brown-bananas-deny.md new file mode 100644 index 0000000000000..0f8c2ca18e103 --- /dev/null +++ b/.changeset/brown-bananas-deny.md @@ -0,0 +1,5 @@ +--- +"@eth-optimism/l2geth": patch +--- + +Add value parsing to the rollup client diff --git a/.changeset/chilly-grapes-greet.md b/.changeset/chilly-grapes-greet.md new file mode 100644 index 0000000000000..71ca9dbc8974d --- /dev/null +++ b/.changeset/chilly-grapes-greet.md @@ -0,0 +1,5 @@ +--- +"@eth-optimism/l2geth": patch +--- + +Removes the extra setting of the txmeta in the syncservice and instead sets the raw tx in the txmeta at the rpc layer diff --git a/.changeset/curly-pumas-wait.md b/.changeset/curly-pumas-wait.md new file mode 100644 index 0000000000000..897732aaa67cc --- /dev/null +++ b/.changeset/curly-pumas-wait.md @@ -0,0 +1,5 @@ +--- +'@eth-optimism/l2geth': patch +--- + +Fill in the raw transaction into the txmeta in the `eth_sendTransaction` codepath diff --git a/.changeset/early-hats-sell.md b/.changeset/early-hats-sell.md new file mode 100644 index 0000000000000..9dc4ac0b0247f --- /dev/null +++ b/.changeset/early-hats-sell.md @@ -0,0 +1,6 @@ +--- +'@eth-optimism/integration-tests': patch +'@eth-optimism/l2geth': patch +--- + +Add support for parsed revert reasons in DoEstimateGas diff --git a/.changeset/eight-beers-prove.md b/.changeset/eight-beers-prove.md new file mode 100644 index 0000000000000..c6d68aec6c29c --- /dev/null +++ b/.changeset/eight-beers-prove.md @@ -0,0 +1,6 @@ +--- +"@eth-optimism/integration-tests": patch +"@eth-optimism/l2geth": patch +--- + +Update minimum response from estimate gas diff --git a/.changeset/fuzzy-gorillas-accept.md b/.changeset/fuzzy-gorillas-accept.md new file mode 100644 index 0000000000000..3bede02b3aaf2 --- /dev/null +++ b/.changeset/fuzzy-gorillas-accept.md @@ -0,0 +1,7 @@ +--- +"@eth-optimism/integration-tests": patch +"@eth-optimism/l2geth": patch +"@eth-optimism/contracts": patch +--- + +Add value transfer support to ECDSAContractAccount diff --git a/.changeset/good-poets-march.md b/.changeset/good-poets-march.md new file mode 100644 index 0000000000000..9473af129b13e --- /dev/null +++ b/.changeset/good-poets-march.md @@ -0,0 +1,5 @@ +--- +'@eth-optimism/l2geth': patch +--- + +Ignore the deprecated type field in the API diff --git a/.changeset/great-clouds-call.md b/.changeset/great-clouds-call.md new file mode 100644 index 0000000000000..2afa4f4c80322 --- /dev/null +++ b/.changeset/great-clouds-call.md @@ -0,0 +1,5 @@ +--- +"@eth-optimism/l2geth": patch +--- + +Return bytes from both ExecutionManager.run and ExecutionManager.simulateMessage and be sure to properly ABI decode the return values and the nested (bool, returndata) diff --git a/.changeset/grumpy-bananas-brush.md b/.changeset/grumpy-bananas-brush.md new file mode 100644 index 0000000000000..d0ce1dfe421d5 --- /dev/null +++ b/.changeset/grumpy-bananas-brush.md @@ -0,0 +1,5 @@ +--- +"@eth-optimism/data-transport-layer": patch +--- + +Remove legacy transaction deserialization to support RLP batch encoding diff --git a/.changeset/kind-plants-tickle.md b/.changeset/kind-plants-tickle.md new file mode 100644 index 0000000000000..818beff88b520 --- /dev/null +++ b/.changeset/kind-plants-tickle.md @@ -0,0 +1,5 @@ +--- +'@eth-optimism/l2geth': patch +--- + +Block access to RPCs related to signing transactions diff --git a/.changeset/light-needles-brush.md b/.changeset/light-needles-brush.md new file mode 100644 index 0000000000000..8e66a47dbb77b --- /dev/null +++ b/.changeset/light-needles-brush.md @@ -0,0 +1,5 @@ +--- +'@eth-optimism/integration-tests': patch +--- + +Update expected gas prices based on minimum of 21k value diff --git a/.changeset/mean-comics-rush.md b/.changeset/mean-comics-rush.md new file mode 100644 index 0000000000000..c255f1fec8f16 --- /dev/null +++ b/.changeset/mean-comics-rush.md @@ -0,0 +1,6 @@ +--- +"@eth-optimism/l2geth": patch +"@eth-optimism/contracts": patch +--- + +Add ExecutionManager return data & RLP encoding diff --git a/.changeset/old-cycles-invite.md b/.changeset/old-cycles-invite.md new file mode 100644 index 0000000000000..d05596e7bedf7 --- /dev/null +++ b/.changeset/old-cycles-invite.md @@ -0,0 +1,5 @@ +--- +"@eth-optimism/contracts": patch +--- + +Makes ProxyEOA compatible with EIP1967, not backwards compatible since the storage slot changes. diff --git a/.changeset/sharp-flowers-fail.md b/.changeset/sharp-flowers-fail.md new file mode 100644 index 0000000000000..ebc8482578a8a --- /dev/null +++ b/.changeset/sharp-flowers-fail.md @@ -0,0 +1,5 @@ +--- +"@eth-optimism/l2geth": patch +--- + +Update gas related things in the RPC to allow transactions with high gas limits and prevent gas estimations from being too small diff --git a/.changeset/six-ties-invent.md b/.changeset/six-ties-invent.md new file mode 100644 index 0000000000000..95cf982039726 --- /dev/null +++ b/.changeset/six-ties-invent.md @@ -0,0 +1,10 @@ +--- +'@eth-optimism/l2geth': minor +'@eth-optimism/contracts': minor +'@eth-optimism/data-transport-layer': minor +'@eth-optimism/batch-submitter': minor +'@eth-optimism/hardhat-ovm': minor +'@eth-optimism/message-relayer': minor +--- + +Updates to use RLP encoded transactions in batches for the `v0.3.0` release diff --git a/.changeset/ten-keys-share.md b/.changeset/ten-keys-share.md new file mode 100644 index 0000000000000..05727782102ed --- /dev/null +++ b/.changeset/ten-keys-share.md @@ -0,0 +1,5 @@ +--- +"@eth-optimism/l2geth": patch +--- + +Remove the OVMSigner diff --git a/.changeset/thirty-radios-sniff.md b/.changeset/thirty-radios-sniff.md new file mode 100644 index 0000000000000..3340bc37e2366 --- /dev/null +++ b/.changeset/thirty-radios-sniff.md @@ -0,0 +1,5 @@ +--- +"@eth-optimism/l2geth": patch +--- + +Prevent 0 value transactions with calldata via RPC diff --git a/.changeset/tough-lamps-hammer.md b/.changeset/tough-lamps-hammer.md new file mode 100644 index 0000000000000..204262b71f8ff --- /dev/null +++ b/.changeset/tough-lamps-hammer.md @@ -0,0 +1,5 @@ +--- +"@eth-optimism/core-utils": patch +--- + +Update toRpcHexString to accept ethers.BigNumber and add tests diff --git a/.changeset/violet-comics-reflect.md b/.changeset/violet-comics-reflect.md new file mode 100644 index 0000000000000..8f52dda5c2b98 --- /dev/null +++ b/.changeset/violet-comics-reflect.md @@ -0,0 +1,5 @@ +--- +'@eth-optimism/data-transport-layer': patch +--- + +Prevent access of null value in L1 transaction deserialization diff --git a/.changeset/weak-suits-burn.md b/.changeset/weak-suits-burn.md new file mode 100644 index 0000000000000..77d40acef164a --- /dev/null +++ b/.changeset/weak-suits-burn.md @@ -0,0 +1,5 @@ +--- +"@eth-optimism/contracts": patch +--- + +Update ABI of simulateMessage to match run diff --git a/examples/waffle/test/erc20.spec.js b/examples/waffle/test/erc20.spec.js index 6d71783a3543a..78469492111a8 100644 --- a/examples/waffle/test/erc20.spec.js +++ b/examples/waffle/test/erc20.spec.js @@ -9,30 +9,26 @@ const { getArtifact } = require('./getArtifact') use(solidity) +const config = { + l2Url: process.env.L2_URL || 'http://127.0.0.1:8545', + l1Url: process.env.L1_URL || 'http://127.0.0.1:9545', + useL2: process.env.TARGET === 'OVM', + privateKey: process.env.PRIVATE_KEY || '0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80' +} + describe('ERC20 smart contract', () => { let ERC20, - provider, - wallet, - walletTo, - walletEmpty, - walletAddress, - walletToAddress, - walletEmptyAddress - - const privateKey = ethers.Wallet.createRandom().privateKey - const privateKeyEmpty = ethers.Wallet.createRandom().privateKey - const useL2 = process.env.TARGET === 'OVM' - - if (useL2 == true) { - provider = new ethers.providers.JsonRpcProvider('http://127.0.0.1:8545') + provider + + if (config.useL2) { + provider = new ethers.providers.JsonRpcProvider(config.l2Url) provider.pollingInterval = 100 provider.getGasPrice = async () => ethers.BigNumber.from(0) } else { - provider = new ethers.providers.JsonRpcProvider('http://127.0.0.1:9545') + provider = new ethers.providers.JsonRpcProvider(config.l1Url) } - walletTo = new ethers.Wallet(privateKey, provider) - walletEmpty = new ethers.Wallet(privateKeyEmpty, provider) + const wallet = new ethers.Wallet(config.privateKey).connect(provider) // parameters to use for our test coin const COIN_NAME = 'OVM Test Coin' @@ -41,12 +37,7 @@ describe('ERC20 smart contract', () => { describe('when using a deployed contract instance', () => { before(async () => { - wallet = await provider.getSigner(0) - walletAddress = await wallet.getAddress() - walletToAddress = await walletTo.getAddress() - walletEmptyAddress = await walletEmpty.getAddress() - - const Artifact__ERC20 = getArtifact(useL2) + const Artifact__ERC20 = getArtifact(config.useL2) const Factory__ERC20 = new ethers.ContractFactory( Artifact__ERC20.abi, Artifact__ERC20.bytecode, @@ -64,7 +55,8 @@ describe('ERC20 smart contract', () => { }) it('should assigns initial balance', async () => { - expect(await ERC20.balanceOf(walletAddress)).to.equal(1000) + const address = await wallet.getAddress() + expect(await ERC20.balanceOf(address)).to.equal(1000) }) it('should correctly set vanity information', async () => { @@ -79,29 +71,35 @@ describe('ERC20 smart contract', () => { }) it('should transfer amount to destination account', async () => { - const tx = await ERC20.connect(wallet).transfer(walletToAddress, 7) + const freshWallet = ethers.Wallet.createRandom() + const destination = await freshWallet.getAddress() + const tx = await ERC20.connect(wallet).transfer(destination, 7) await tx.wait() - const walletToBalance = await ERC20.balanceOf(walletToAddress) + const walletToBalance = await ERC20.balanceOf(destination) expect(walletToBalance.toString()).to.equal('7') }) it('should emit Transfer event', async () => { - const tx = ERC20.connect(wallet).transfer(walletToAddress, 7) + const address = await wallet.getAddress() + const tx = ERC20.connect(wallet).transfer(address, 7) await expect(tx) .to.emit(ERC20, 'Transfer') - .withArgs(walletAddress, walletToAddress, 7) + .withArgs(address, address, 7) }) it('should not transfer above the amount', async () => { - const walletToBalanceBefore = await ERC20.balanceOf(walletToAddress) - await expect(ERC20.transfer(walletToAddress, 1007)).to.be.reverted - const walletToBalanceAfter = await ERC20.balanceOf(walletToAddress) + const address = await wallet.getAddress() + const walletToBalanceBefore = await ERC20.balanceOf(address) + await expect(ERC20.transfer(address, 1007)).to.be.reverted + const walletToBalanceAfter = await ERC20.balanceOf(address) expect(walletToBalanceBefore).to.eq(walletToBalanceAfter) }) it('should not transfer from empty account', async () => { - const ERC20FromOtherWallet = ERC20.connect(walletEmpty) - await expect(ERC20FromOtherWallet.transfer(walletEmptyAddress, 1)).to.be + const emptyWallet = ethers.Wallet.createRandom() + const address = await emptyWallet.getAddress() + const ERC20FromOtherWallet = ERC20.connect(emptyWallet) + await expect(ERC20FromOtherWallet.transfer(address, 1)).to.be .reverted }) }) diff --git a/integration-tests/contracts/ConstructorReverter.sol b/integration-tests/contracts/ConstructorReverter.sol new file mode 100644 index 0000000000000..e8a2840140103 --- /dev/null +++ b/integration-tests/contracts/ConstructorReverter.sol @@ -0,0 +1,10 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.7.0; + +import { Reverter } from './Reverter.sol'; + +contract ConstructorReverter is Reverter { + constructor() { + doRevert(); + } +} diff --git a/integration-tests/contracts/ERC20.sol b/integration-tests/contracts/ERC20.sol index d000f71722b6b..610ea5d83480f 100644 --- a/integration-tests/contracts/ERC20.sol +++ b/integration-tests/contracts/ERC20.sol @@ -33,7 +33,7 @@ contract ERC20 { } function transfer(address _to, uint256 _value) public returns (bool success) { - require(balances[msg.sender] >= _value); + require(balances[msg.sender] >= _value, "insufficient balance"); balances[msg.sender] -= _value; balances[_to] += _value; emit Transfer(msg.sender, _to, _value); diff --git a/integration-tests/contracts/Reverter.sol b/integration-tests/contracts/Reverter.sol new file mode 100644 index 0000000000000..d2d3921386dfd --- /dev/null +++ b/integration-tests/contracts/Reverter.sol @@ -0,0 +1,10 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.7.0; + +contract Reverter { + string constant public revertMessage = "This is a simple reversion."; + + function doRevert() public pure { + revert(revertMessage); + } +} diff --git a/integration-tests/hardhat.config.ts b/integration-tests/hardhat.config.ts index 722e35e9604b3..b68e8646ba7bc 100644 --- a/integration-tests/hardhat.config.ts +++ b/integration-tests/hardhat.config.ts @@ -2,6 +2,7 @@ import { HardhatUserConfig } from 'hardhat/types' // Hardhat plugins import '@nomiclabs/hardhat-ethers' +import '@nomiclabs/hardhat-waffle' import '@eth-optimism/hardhat-ovm' import 'hardhat-gas-reporter' diff --git a/integration-tests/package.json b/integration-tests/package.json index 712cff307d89a..3293fe305aaa8 100644 --- a/integration-tests/package.json +++ b/integration-tests/package.json @@ -21,6 +21,7 @@ "@eth-optimism/hardhat-ovm": "^0.1.1", "@ethersproject/providers": "^5.0.24", "@nomiclabs/hardhat-ethers": "^2.0.2", + "@nomiclabs/hardhat-waffle": "^2.0.1", "@types/chai-as-promised": "^7.1.3", "@types/chai": "^4.2.17", "@types/mocha": "^8.2.2", diff --git a/integration-tests/test/erc20.spec.ts b/integration-tests/test/erc20.spec.ts index 9eb7105ee0dea..0dd99ed41ccb2 100644 --- a/integration-tests/test/erc20.spec.ts +++ b/integration-tests/test/erc20.spec.ts @@ -1,8 +1,11 @@ import { Contract, ContractFactory, Wallet } from 'ethers' import { ethers } from 'hardhat' -import { expect } from 'chai' +import chai, { expect } from 'chai' import { GWEI } from './shared/utils' import { OptimismEnv } from './shared/env' +import { solidity } from 'ethereum-waffle' + +chai.use(solidity) describe('Basic ERC20 interactions', async () => { const initialAmount = 1000 @@ -79,4 +82,10 @@ describe('Basic ERC20 interactions', async () => { expect(receiverBalance.toNumber()).to.equal(100) expect(senderBalance.toNumber()).to.equal(900) }) + + it('should revert if trying to transfer too much', async () => { + await expect( + ERC20.transfer(other.address, initialAmount * 2) + ).to.be.revertedWith('insufficient balance') + }) }) diff --git a/integration-tests/test/fee-payment.spec.ts b/integration-tests/test/fee-payment.spec.ts index 2005c57513c29..5b94edb1afd55 100644 --- a/integration-tests/test/fee-payment.spec.ts +++ b/integration-tests/test/fee-payment.spec.ts @@ -25,13 +25,4 @@ describe('Fee Payment Integration Tests', async () => { tx.gasPrice.mul(tx.gasLimit).add(amount) ) }) - - it('sequencer rejects transaction with a non-multiple-of-1M gasPrice', async () => { - const gasPrice = BigNumber.from(1_000_000 - 1) - await expect( - env.ovmEth.transfer(other, 0, { gasPrice }) - ).to.be.eventually.rejectedWith( - 'Gas price must be a multiple of 1,000,000 wei' - ) - }) }) diff --git a/integration-tests/test/native-eth.spec.ts b/integration-tests/test/native-eth.spec.ts index 716749141c121..fe2364cfa5609 100644 --- a/integration-tests/test/native-eth.spec.ts +++ b/integration-tests/test/native-eth.spec.ts @@ -45,13 +45,13 @@ describe('Native ETH Integration Tests', async () => { const amount = utils.parseEther('0.5') const addr = '0x' + '1234'.repeat(10) const gas = await env.ovmEth.estimateGas.transfer(addr, amount) - expect(gas).to.be.deep.eq(BigNumber.from(17344)) + expect(gas).to.be.deep.eq(BigNumber.from(21000)) }) it('Should estimate gas for ETH withdraw', async () => { const amount = utils.parseEther('0.5') const gas = await env.ovmEth.estimateGas.withdraw(amount) - expect(gas).to.be.deep.eq(BigNumber.from(14400)) + expect(gas).to.be.deep.eq(BigNumber.from(21000)) }) }) diff --git a/integration-tests/test/rpc.spec.ts b/integration-tests/test/rpc.spec.ts index fa8b4c6620d46..66f3cfa23a5b7 100644 --- a/integration-tests/test/rpc.spec.ts +++ b/integration-tests/test/rpc.spec.ts @@ -1,13 +1,26 @@ import { injectL2Context } from '@eth-optimism/core-utils' -import { Wallet, BigNumber } from 'ethers' +import { Wallet, BigNumber, Contract } from 'ethers' +import { ethers } from 'hardhat' import chai, { expect } from 'chai' -import { sleep, l2Provider, GWEI } from './shared/utils' +import { + sleep, + l2Provider, + GWEI, + encodeSolidityRevertMessage, +} from './shared/utils' import chaiAsPromised from 'chai-as-promised' import { OptimismEnv } from './shared/env' +import { + TransactionReceipt, + TransactionRequest, +} from '@ethersproject/providers' +import { solidity } from 'ethereum-waffle' chai.use(chaiAsPromised) +chai.use(solidity) describe('Basic RPC tests', () => { let env: OptimismEnv + let wallet: Wallet const DEFAULT_TRANSACTION = { to: '0x' + '1234'.repeat(10), @@ -18,10 +31,33 @@ describe('Basic RPC tests', () => { } const provider = injectL2Context(l2Provider) - const wallet = Wallet.createRandom().connect(provider) + + let Reverter: Contract + let revertMessage: string + let revertingTx: TransactionRequest + let revertingDeployTx: TransactionRequest before(async () => { env = await OptimismEnv.new() + wallet = env.l2Wallet + const Factory__Reverter = await ethers.getContractFactory( + 'Reverter', + wallet + ) + Reverter = await Factory__Reverter.connect(env.l2Wallet).deploy() + await Reverter.deployTransaction.wait() + revertMessage = await Reverter.revertMessage() + revertingTx = { + to: Reverter.address, + data: Reverter.interface.encodeFunctionData('doRevert'), + } + const Factory__ConstructorReverter = await ethers.getContractFactory( + 'ConstructorReverter', + wallet + ) + revertingDeployTx = { + data: Factory__ConstructorReverter.bytecode, + } }) describe('eth_sendRawTransaction', () => { @@ -59,20 +95,124 @@ describe('Basic RPC tests', () => { ).to.be.rejectedWith('Cannot submit unprotected transaction') }) - it('should not accept a transaction with a value', async () => { + it('should accept a transaction with a value', async () => { const tx = { ...DEFAULT_TRANSACTION, - chainId: await wallet.getChainId(), - value: 100, + chainId: await env.l2Wallet.getChainId(), + data: '0x', + value: ethers.utils.parseEther('5'), } - await expect( - provider.sendTransaction(await wallet.signTransaction(tx)) - ).to.be.rejectedWith( - 'Cannot send transaction with non-zero value. Use WETH.transfer()' + + const balanceBefore = await provider.getBalance(env.l2Wallet.address) + const result = await env.l2Wallet.sendTransaction(tx) + const receipt = await result.wait() + expect(receipt.status).to.deep.equal(1) + + expect(await provider.getBalance(env.l2Wallet.address)).to.deep.equal( + balanceBefore.sub(ethers.utils.parseEther('5')) + ) + }) + + it('should reject a transaction with higher value than user balance', async () => { + const balance = await env.l2Wallet.getBalance() + const tx = { + ...DEFAULT_TRANSACTION, + chainId: await env.l2Wallet.getChainId(), + data: '0x', + value: balance.add(ethers.utils.parseEther('1')), + } + + await expect(env.l2Wallet.sendTransaction(tx)).to.be.rejectedWith( + 'invalid transaction: insufficient funds for gas * price + value' ) }) }) + describe('eth_call', () => { + let expectedReverterRevertData: string + + before(async () => { + expectedReverterRevertData = encodeSolidityRevertMessage(revertMessage) + }) + + it('should correctly return solidity revert data from a call', async () => { + const revertData = await provider.call(revertingTx) + const expectedRevertData = encodeSolidityRevertMessage(revertMessage) + expect(revertData).to.eq(expectedRevertData) + }) + + it('should produce error when called from ethers', async () => { + await expect(Reverter.doRevert()).to.be.revertedWith(revertMessage) + }) + + it('should correctly return revert data from contract creation', async () => { + const revertData = await provider.call(revertingDeployTx) + + expect(revertData).to.eq(expectedReverterRevertData) + }) + + it('should return the correct error message when attempting to deploy unsafe initcode', async () => { + // PUSH1 0x00 PUSH1 0x00 SSTORE + const unsafeCode = '0x6000600055' + const tx: TransactionRequest = { + data: unsafeCode, + } + const result = await provider.call(tx) + const expected = encodeSolidityRevertMessage( + 'Contract creation code contains unsafe opcodes. Did you use the right compiler or pass an unsafe constructor argument?' + ) + expect(result).to.eq(expected) + }) + }) + + describe('eth_getTransactionReceipt', () => { + it('correctly exposes revert data for contract calls', async () => { + const req: TransactionRequest = { + ...revertingTx, + gasLimit: 8_999_999, // override gas estimation + } + + const tx = await wallet.sendTransaction(req) + + let errored = false + try { + await tx.wait() + } catch (e) { + errored = true + } + expect(errored).to.be.true + + const receipt: TransactionReceipt = await provider.getTransactionReceipt( + tx.hash + ) + + expect(receipt.status).to.eq(0) + }) + + it('correctly exposes revert data for contract creations', async () => { + const req: TransactionRequest = { + ...revertingDeployTx, + gasLimit: 8_999_999, // override gas estimation + } + + const tx = await wallet.sendTransaction(req) + + let errored = false + try { + await tx.wait() + } catch (e) { + errored = true + } + expect(errored).to.be.true + + const receipt: TransactionReceipt = await provider.getTransactionReceipt( + tx.hash + ) + + expect(receipt.status).to.eq(0) + }) + }) + describe('eth_getTransactionByHash', () => { it('should be able to get all relevant l1/l2 transaction data', async () => { const tx = DEFAULT_TRANSACTION @@ -168,10 +308,23 @@ describe('Basic RPC tests', () => { // we normalize by gwei here because the RPC does it as well, since the // user provides a 1gwei gas price when submitting txs via the eth_gasPrice - // rpc call - const expected = expectedCost[i].mul(l1GasPrice).div(GWEI) + // rpc call. The smallest possible value for the expected cost is 21000 + let expected = expectedCost[i].mul(l1GasPrice).div(GWEI) + if (expected.lt(BigNumber.from(21000))) { + expected = BigNumber.from(21000) + } expect(estimate).to.be.deep.eq(expected) } }) + + it('should fail for a reverting call transaction', async () => { + await expect(provider.send('eth_estimateGas', [revertingTx])).to.be + .reverted + }) + + it('should fail for a reverting deploy transaction', async () => { + await expect(provider.send('eth_estimateGas', [revertingDeployTx])).to.be + .reverted + }) }) }) diff --git a/integration-tests/test/shared/utils.ts b/integration-tests/test/shared/utils.ts index 48ca55a5c41b5..170a4013710c4 100644 --- a/integration-tests/test/shared/utils.ts +++ b/integration-tests/test/shared/utils.ts @@ -4,7 +4,7 @@ import { getContractFactory, getContractInterface, } from '@eth-optimism/contracts' -import { Watcher } from '@eth-optimism/core-utils' +import { remove0x, Watcher } from '@eth-optimism/core-utils' import { Contract, Wallet, @@ -12,6 +12,7 @@ import { providers, BigNumberish, BigNumber, + utils, } from 'ethers' import { cleanEnv, str, num } from 'envalid' @@ -100,3 +101,8 @@ export const fundUser = async ( } export const sleep = (ms: number) => new Promise((r) => setTimeout(r, ms)) + +const abiCoder = new utils.AbiCoder() +export const encodeSolidityRevertMessage = (_reason: string): string => { + return '0x08c379a0' + remove0x(abiCoder.encode(['string'], [_reason])) +} diff --git a/l2geth/accounts/abi/abi.go b/l2geth/accounts/abi/abi.go index 194df46af5c2b..2febc38261f2a 100644 --- a/l2geth/accounts/abi/abi.go +++ b/l2geth/accounts/abi/abi.go @@ -19,10 +19,12 @@ package abi import ( "bytes" "encoding/json" + "errors" "fmt" "io" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" ) // The ABI holds information about a contract's context and available @@ -192,3 +194,25 @@ func (abi *ABI) EventByID(topic common.Hash) (*Event, error) { } return nil, fmt.Errorf("no event with id: %#x", topic.Hex()) } + +// RevertSelector is a special function selector for revert reason unpacking. +var RevertSelector = crypto.Keccak256([]byte("Error(string)"))[:4] + +// UnpackRevert resolves the abi-encoded revert reason. According to the solidity +// docs https://docs.soliditylang.org/en/v0.8.4/control-structures.html#revert, +// the provided revert reason is abi-encoded as if it were a call to a function +// `Error(string)`. So it's a special tool for it. +func UnpackRevert(data []byte) (string, error) { + if len(data) < 4 { + return "", errors.New("invalid data for unpacking") + } + if !bytes.Equal(data[:4], RevertSelector) { + return "", errors.New("invalid data for unpacking") + } + typ, _ := NewType("string", "", nil) + unpacked, err := (Arguments{{Type: typ}}).UnpackValues(data[4:]) + if err != nil { + return "", err + } + return unpacked[0].(string), nil +} diff --git a/l2geth/core/state_transition.go b/l2geth/core/state_transition.go index d0106680f52c1..d5e839a757dcf 100644 --- a/l2geth/core/state_transition.go +++ b/l2geth/core/state_transition.go @@ -252,7 +252,7 @@ func (st *StateTransition) TransitionDb() (ret []byte, usedGas uint64, failed bo l1MessageSender = msg.L1MessageSender().Hex() } if st.evm.EthCallSender == nil { - log.Debug("Applying transaction", "ID", st.evm.Id, "from", sender.Address().Hex(), "to", to, "nonce", msg.Nonce(), "gasPrice", msg.GasPrice().Uint64(), "gasLimit", msg.Gas(), "l1MessageSender", l1MessageSender, "data", hexutil.Encode(msg.Data())) + log.Debug("Applying transaction", "ID", st.evm.Id, "from", sender.Address().Hex(), "to", to, "nonce", msg.Nonce(), "gasPrice", msg.GasPrice().Uint64(), "gasLimit", msg.Gas(), "value", msg.Value().Uint64(), "l1MessageSender", l1MessageSender, "data", hexutil.Encode(msg.Data())) } } diff --git a/l2geth/core/state_transition_ovm.go b/l2geth/core/state_transition_ovm.go index 0f7b698d6b57a..adba0fb257dfd 100644 --- a/l2geth/core/state_transition_ovm.go +++ b/l2geth/core/state_transition_ovm.go @@ -148,7 +148,7 @@ func modMessage( from, to, msg.Nonce(), - msg.Value(), + common.Big0, gasLimit, msg.GasPrice(), data, diff --git a/l2geth/core/types/transaction_signing.go b/l2geth/core/types/transaction_signing.go index a22e7fd99a9b5..842fedbd03d61 100644 --- a/l2geth/core/types/transaction_signing.go +++ b/l2geth/core/types/transaction_signing.go @@ -17,67 +17,16 @@ package types import ( - "bytes" "crypto/ecdsa" - "encoding/binary" "errors" "fmt" "math/big" - "strings" - "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/params" - "golang.org/x/crypto/sha3" ) -var codec abi.ABI - -func init() { - const abidata = ` - [ - { - "type": "function", - "name": "encode", - "constant": true, - "inputs": [ - { - "name": "nonce", - "type": "uint256" - }, - { - "name": "gasLimit", - "type": "uint256" - }, - { - "name": "gasPrice", - "type": "uint256" - }, - { - "name": "chainId", - "type": "uint256" - }, - { - "name": "to", - "type": "address" - }, - { - "name": "data", - "type": "bytes" - } - ] - } - ] - ` - - var err error - codec, err = abi.JSON(strings.NewReader(abidata)) - if err != nil { - panic(fmt.Errorf("unable to create Eth Sign abi reader: %v", err)) - } -} - var ( ErrInvalidChainId = errors.New("invalid chain id for signer") ) @@ -91,7 +40,16 @@ type sigCache struct { // MakeSigner returns a Signer based on the given chain config and block number. func MakeSigner(config *params.ChainConfig, blockNumber *big.Int) Signer { - return NewOVMSigner(config.ChainID) + var signer Signer + switch { + case config.IsEIP155(blockNumber): + signer = NewEIP155Signer(config.ChainID) + case config.IsHomestead(blockNumber): + signer = HomesteadSigner{} + default: + signer = FrontierSigner{} + } + return signer } // SignTx signs the transaction using the given signer and private key @@ -144,97 +102,6 @@ type Signer interface { Equal(Signer) bool } -// OVMSigner implements Signers using the EIP155 rules along with a new -// `eth_sign` based signature hash. -type OVMSigner struct { - EIP155Signer -} - -func NewOVMSigner(chainId *big.Int) OVMSigner { - signer := NewEIP155Signer(chainId) - return OVMSigner{signer} -} - -func (s OVMSigner) Equal(s2 Signer) bool { - ovm, ok := s2.(OVMSigner) - return ok && ovm.chainId.Cmp(s.chainId) == 0 -} - -// Hash returns the hash to be signed by the sender. -// It does not uniquely identify the transaction. -func (s OVMSigner) Hash(tx *Transaction) common.Hash { - if tx.IsEthSignSighash() { - msg := s.OVMSignerTemplateSighashPreimage(tx) - - hasher := sha3.NewLegacyKeccak256() - hasher.Write(msg[:]) - digest := hasher.Sum(nil) - - return common.BytesToHash(digest) - } - - return rlpHash([]interface{}{ - tx.data.AccountNonce, - tx.data.Price, - tx.data.GasLimit, - tx.data.Recipient, - tx.data.Amount, - tx.data.Payload, - s.chainId, uint(0), uint(0), - }) -} - -// Sender will ecrecover the public key that created the signature -// and then hash the public key to create an address. In the -// case of L1ToL2 transactions, Layer One did the authentication -// for us so there is no signature involved. The concept of a "from" -// is only required for bookkeeping within this codebase -func (s OVMSigner) Sender(tx *Transaction) (common.Address, error) { - qo := tx.QueueOrigin() - if qo != nil && qo.Uint64() == uint64(QueueOriginL1ToL2) { - return common.Address{}, nil - } - if !tx.Protected() { - return HomesteadSigner{}.Sender(tx) - } - if tx.ChainId().Cmp(s.chainId) != 0 { - return common.Address{}, ErrInvalidChainId - } - V := new(big.Int).Sub(tx.data.V, s.chainIdMul) - V.Sub(V, big8) - return recoverPlain(s.Hash(tx), tx.data.R, tx.data.S, V, true) -} - -// OVMSignerTemplateSighashPreimage creates the preimage for the `eth_sign` like -// signature hash. The transaction is `ABI.encodePacked`. -func (s OVMSigner) OVMSignerTemplateSighashPreimage(tx *Transaction) []byte { - data := []interface{}{ - big.NewInt(int64(tx.data.AccountNonce)), - big.NewInt(int64(tx.data.GasLimit)), - tx.data.Price, - s.chainId, - *tx.data.Recipient, - tx.data.Payload, - } - - ret, err := codec.Pack("encode", data...) - if err != nil { - panic(fmt.Errorf("unable to pack Eth Sign data: %v", err)) - } - - hasher := sha3.NewLegacyKeccak256() - // Slice off the function selector before hashing - hasher.Write(ret[4:]) - digest := hasher.Sum(nil) - - preimage := new(bytes.Buffer) - prefix := []byte("\x19Ethereum Signed Message:\n32") - binary.Write(preimage, binary.BigEndian, prefix) - binary.Write(preimage, binary.BigEndian, digest) - - return preimage.Bytes() -} - // EIP155Transaction implements Signer using the EIP155 rules. type EIP155Signer struct { chainId, chainIdMul *big.Int diff --git a/l2geth/core/types/transaction_signing_test.go b/l2geth/core/types/transaction_signing_test.go index f0102710b1329..689fc38a9b660 100644 --- a/l2geth/core/types/transaction_signing_test.go +++ b/l2geth/core/types/transaction_signing_test.go @@ -136,100 +136,3 @@ func TestChainId(t *testing.T) { t.Error("expected no error") } } - -func TestOVMSigner(t *testing.T) { - key, _ := defaultTestKey() - - tx := NewTransaction(0, common.Address{}, new(big.Int), 0, new(big.Int), nil) - txMeta := NewTransactionMeta(nil, 0, nil, SighashEthSign, QueueOriginSequencer, nil, nil, nil) - tx.SetTransactionMeta(txMeta) - - var err error - tx, err = SignTx(tx, NewOVMSigner(big.NewInt(1)), key) - if err != nil { - t.Fatal(err) - } - - _, err = Sender(NewOVMSigner(big.NewInt(2)), tx) - if err != ErrInvalidChainId { - t.Error("expected error:", ErrInvalidChainId) - } - - _, err = Sender(NewOVMSigner(big.NewInt(1)), tx) - if err != nil { - t.Error("expected no error") - } -} - -func TestOVMSignerHash(t *testing.T) { - signer := NewOVMSigner(big.NewInt(1)) - - txNil := NewTransaction(0, common.Address{}, new(big.Int), 0, new(big.Int), nil) - txEIP155 := NewTransaction(0, common.Address{}, new(big.Int), 0, new(big.Int), nil) - - hashNil := signer.Hash(txNil) - hashEIP155 := signer.Hash(txEIP155) - if hashNil != hashEIP155 { - t.Errorf("Signature hashes should be equal: %s != %s", hashNil.Hex(), hashEIP155.Hex()) - } - - // The signature hash should be different when using `SighashEthSign` - txEthSign := NewTransaction(0, common.Address{}, new(big.Int), 0, new(big.Int), nil) - txMeta := NewTransactionMeta(nil, 0, nil, SighashEthSign, QueueOriginSequencer, nil, nil, nil) - txEthSign.SetTransactionMeta(txMeta) - - hashEthSign := signer.Hash(txEthSign) - if hashEIP155 == hashEthSign { - t.Errorf("Signature hashes should not be equal: %s == %s", hashEIP155.Hex(), hashEthSign.Hex()) - } -} - -func TestOVMSignerSender(t *testing.T) { - // Create a keypair to sign transactions with and the corresponding address - // from the public key. - key, _ := crypto.GenerateKey() - addr := crypto.PubkeyToAddress(key.PublicKey) - - // This test makes sure that both the EIP155 and EthSign signature hash - // codepaths work when using the OVMSigner. - signer := NewOVMSigner(big.NewInt(1)) - var err error - - // Create a transaction with EIP155 signature hash, sign the transaction, - // recover the address and assert that the address matches the key. - txEIP155 := NewTransaction(0, addr, new(big.Int), 0, new(big.Int), nil) - - txEIP155, err = SignTx(txEIP155, signer, key) - if err != nil { - t.Errorf("No error expected") - } - - recEIP155, err := signer.Sender(txEIP155) - if err != nil { - t.Errorf("No error expected") - } - - if addr != recEIP155 { - t.Errorf("Recovered address doesn't match. Got %s, expected %s", recEIP155.Hex(), addr.Hex()) - } - - // Create a transaction with EthSign signature hash, sign the transaction, - // recover the address and assert that the address matches the key. - txEthSign := NewTransaction(0, addr, new(big.Int), 0, new(big.Int), nil) - txMeta := NewTransactionMeta(nil, 0, nil, SighashEthSign, QueueOriginSequencer, nil, nil, nil) - txEthSign.SetTransactionMeta(txMeta) - - txEthSign, err = SignTx(txEthSign, signer, key) - if err != nil { - t.Errorf("No error expected") - } - - recEthSign, err := signer.Sender(txEthSign) - if err != nil { - t.Errorf("No error expected") - } - - if addr != recEthSign { - t.Errorf("Recovered address doesn't match. Got %s, expected %s", recEthSign.Hex(), addr.Hex()) - } -} diff --git a/l2geth/core/types/transaction_test.go b/l2geth/core/types/transaction_test.go index 8ed4da8204c81..f7d108379b677 100644 --- a/l2geth/core/types/transaction_test.go +++ b/l2geth/core/types/transaction_test.go @@ -208,7 +208,7 @@ func TestTransactionJSON(t *testing.T) { if err != nil { t.Fatalf("could not generate key: %v", err) } - signer := NewOVMSigner(common.Big1) + signer := NewEIP155Signer(common.Big1) transactions := make([]*Transaction, 0, 50) for i := uint64(0); i < 25; i++ { diff --git a/l2geth/core/vm/evm.go b/l2geth/core/vm/evm.go index d7811e6b660ca..aacf774db1cb5 100644 --- a/l2geth/core/vm/evm.go +++ b/l2geth/core/vm/evm.go @@ -17,13 +17,15 @@ package vm import ( - "bytes" "crypto/rand" "encoding/hex" + "fmt" "math/big" + "strings" "sync/atomic" "time" + "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/crypto" @@ -32,10 +34,66 @@ import ( "github.com/ethereum/go-ethereum/rollup/dump" ) +// codec is a decoder for the return values of the execution manager. It decodes +// (bool, bytes) from the bytes that are returned from both +// `ExecutionManager.run()` and `ExecutionManager.simulateMessage()` +var codec abi.ABI + +// innerData represents the results returned from the ExecutionManager +// that are wrapped in `bytes` +type innerData struct { + Success bool `abi:"_success"` + ReturnData []byte `abi:"_returndata"` +} + +// runReturnData represents the actual return data of the ExecutionManager. +// It wraps (bool, bytes) in an ABI encoded bytes +type runReturnData struct { + ReturnData []byte `abi:"_returndata"` +} + // Will be removed when we update EM to return data in `run`. var deadPrefix, fortyTwoPrefix, zeroPrefix []byte func init() { + const abidata = ` + [ + { + "type": "function", + "name": "call", + "constant": true, + "inputs": [], + "outputs": [ + { + "name": "_success", + "type": "bool" + }, + { + "name": "_returndata", + "type": "bytes" + } + ] + }, + { + "type": "function", + "name": "blob", + "constant": true, + "inputs": [], + "outputs": [ + { + "name": "_returndata", + "type": "bytes" + } + ] + } + ] +` + + var err error + codec, err = abi.JSON(strings.NewReader(abidata)) + if err != nil { + panic(fmt.Errorf("unable to create abi decoder: %v", err)) + } deadPrefix = hexutil.MustDecode("0xdeaddeaddeaddeaddeaddeaddeaddeaddead") zeroPrefix = hexutil.MustDecode("0x000000000000000000000000000000000000") fortyTwoPrefix = hexutil.MustDecode("0x420000000000000000000000000000000000") @@ -133,13 +191,10 @@ type Context struct { Difficulty *big.Int // Provides information for DIFFICULTY // OVM_ADDITION - EthCallSender *common.Address - OriginalTargetAddress *common.Address - OriginalTargetResult []byte - OriginalTargetReached bool - OvmExecutionManager dump.OvmDumpAccount - OvmStateManager dump.OvmDumpAccount - OvmSafetyChecker dump.OvmDumpAccount + EthCallSender *common.Address + OvmExecutionManager dump.OvmDumpAccount + OvmStateManager dump.OvmDumpAccount + OvmSafetyChecker dump.OvmDumpAccount } // EVM is the Ethereum Virtual Machine base object and provides @@ -251,34 +306,6 @@ func (evm *EVM) Interpreter() Interpreter { // the necessary steps to create accounts and reverses the state in case of an // execution error or failed value transfer. func (evm *EVM) Call(caller ContractRef, addr common.Address, input []byte, gas uint64, value *big.Int) (ret []byte, leftOverGas uint64, err error) { - var isTarget = false - if UsingOVM { - // OVM_ENABLED - if evm.depth == 0 { - // We're inside a new transaction, so make sure to wipe these variables beforehand. - evm.Context.OriginalTargetAddress = nil - evm.Context.OriginalTargetResult = []byte("00") - evm.Context.OriginalTargetReached = false - } - - if caller.Address() == evm.Context.OvmExecutionManager.Address && - !bytes.HasPrefix(addr.Bytes(), deadPrefix) && - !bytes.HasPrefix(addr.Bytes(), zeroPrefix) && - !bytes.HasPrefix(addr.Bytes(), fortyTwoPrefix) && - evm.Context.OriginalTargetAddress == nil { - // Whew. Okay, so: we consider ourselves to be at a "target" as long as we were called - // by the execution manager, and we're not a precompile or "dead" address. - evm.Context.OriginalTargetAddress = &addr - evm.Context.OriginalTargetReached = true - isTarget = true - } - // Handle eth_call - if evm.Context.EthCallSender != nil && (caller.Address() == common.Address{}) { - evm.Context.OriginalTargetReached = true - isTarget = true - } - } - if evm.vmConfig.NoRecursion && evm.depth > 0 { return nil, gas, nil } @@ -356,61 +383,39 @@ func (evm *EVM) Call(caller ContractRef, addr common.Address, input []byte, gas if UsingOVM { // OVM_ENABLED - - if isTarget { - // If this was our target contract, store the result so that it can be later re-inserted - // into the user-facing return data (as seen below). - evm.Context.OriginalTargetResult = ret - } - if evm.depth == 0 { // We're back at the root-level message call, so we'll need to modify the return data // sent to us by the OVM_ExecutionManager to instead be the intended return data. - if !evm.Context.OriginalTargetReached { - // If we didn't get to the target contract, then our execution somehow failed - // (perhaps due to insufficient gas). Just return an error that represents this. - ret = common.FromHex("0x") - err = ErrOvmExecutionFailed - } else if len(evm.Context.OriginalTargetResult) >= 96 { - // We expect that EOA contracts return at least 96 bytes of data, where the first - // 32 bytes are the boolean success value and the next 64 bytes are unnecessary - // ABI encoding data. The actual return data starts at the 96th byte and can be - // empty. - success := evm.Context.OriginalTargetResult[:32] - ret = evm.Context.OriginalTargetResult[96:] - - if !bytes.Equal(success, AbiBytesTrue) && !bytes.Equal(success, AbiBytesFalse) { - // If the first 32 bytes not either are the ABI encoding of "true" or "false", - // then the user hasn't correctly ABI encoded the result. We return the null - // hex string as a default here (an annoying default that would convince most - // people to just use the standard form). - ret = common.FromHex("0x") - } else if bytes.Equal(success, AbiBytesFalse) { - // If the first 32 bytes are the ABI encoding of "false", then we need to add an - // artificial error that represents the revert. - err = errExecutionReverted + // Attempt to decode the returndata as as ExecutionManager.run when + // it is not an `eth_call` and as ExecutionManager.simulateMessage + // when it is an `eth_call`. If the data is not decodable as ABI + // encoded bytes, then return nothing. If the data is able to be + // decoded as bytes, then attempt to decode as (bool, bytes) + isDecodable := true + returnData := runReturnData{} + if err := codec.Unpack(&returnData, "blob", ret); err != nil { + isDecodable = false + } - // We also currently need to add an extra four empty bytes to the return data - // to appease ethers.js. Our return correctly inserts the four specific bytes - // that represent a "string error" to clients, but somehow the returndata size - // is a multiple of 32 (when we expect size % 32 == 4). ethers.js checks that - // [size % 32 == 4] before trying to decode a string error result. Adding these - // four empty bytes tricks ethers into correctly decoding the error string. - // ovmTODO: Figure out how to actually deal with this. - // ovmTODO: This may actually be completely broken if the first four bytes of - // the return data are **not** the specific "string error" bytes. - ret = append(ret, make([]byte, 4)...) + switch isDecodable { + case true: + inner := innerData{} + // If this fails to decode, the nil values will be set in + // `inner`, meaning that it will be interpreted as reverted + // execution with empty returndata + _ = codec.Unpack(&inner, "call", returnData.ReturnData) + if !inner.Success { + err = errExecutionReverted } - } else { - // User hasn't conformed the standard format, just return "null" for the success - // (with no return data) to convince them to use the standard. - ret = common.FromHex("0x") + ret = inner.ReturnData + case false: + ret = []byte{} } + } - if evm.Context.EthCallSender == nil { - log.Debug("Reached the end of an OVM execution", "ID", evm.Id, "Return Data", hexutil.Encode(ret), "Error", err) - } + if evm.Context.EthCallSender == nil { + log.Debug("Reached the end of an OVM execution", "ID", evm.Id, "Return Data", hexutil.Encode(ret), "Error", err) } } diff --git a/l2geth/eth/api_backend.go b/l2geth/eth/api_backend.go index 1f1b0ae6ac841..a9b07a7cc5620 100644 --- a/l2geth/eth/api_backend.go +++ b/l2geth/eth/api_backend.go @@ -297,20 +297,11 @@ func (b *EthAPIBackend) SubscribeLogsEvent(ch chan<- []*types.Log) event.Subscri // a lock can be used around the remotes for when the sequencer is reorganizing. func (b *EthAPIBackend) SendTx(ctx context.Context, signedTx *types.Transaction) error { if b.UsingOVM { - // The value field is not rolled up so it must be set to 0 - if signedTx.Value().Cmp(new(big.Int)) != 0 { - return fmt.Errorf("Cannot send transaction with non-zero value. Use WETH.transfer()") - } - to := signedTx.To() if to != nil { if *to == (common.Address{}) { return errors.New("Cannot send transaction to zero address") } - // Prevent transactions from being submitted if the gas limit too high - if signedTx.Gas() >= b.gasLimit { - return fmt.Errorf("Transaction gasLimit (%d) is greater than max gasLimit (%d)", signedTx.Gas(), b.gasLimit) - } // Prevent QueueOriginSequencer transactions that are too large to // be included in a batch. The `MaxCallDataSize` should be set to // the layer one consensus max transaction size in bytes minus the @@ -320,6 +311,14 @@ func (b *EthAPIBackend) SendTx(ctx context.Context, signedTx *types.Transaction) if len(signedTx.Data()) > b.MaxCallDataSize { return fmt.Errorf("Calldata cannot be larger than %d, sent %d", b.MaxCallDataSize, len(signedTx.Data())) } + // If there is a value field set then reject transactions that + // contain calldata. The feature of sending transactions with value + // and calldata will be added in the future. + if signedTx.Value().Cmp(common.Big0) != 0 { + if len(signedTx.Data()) > 0 { + return errors.New("Cannot send transactions with value and calldata") + } + } } return b.eth.syncService.ApplyTransaction(signedTx) } diff --git a/l2geth/eth/api_backend_test.go b/l2geth/eth/api_backend_test.go deleted file mode 100644 index 7f84758c6c86f..0000000000000 --- a/l2geth/eth/api_backend_test.go +++ /dev/null @@ -1,41 +0,0 @@ -package eth - -import ( - "context" - "fmt" - "math/big" - "testing" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/types" -) - -func TestGasLimit(t *testing.T) { - backend := &EthAPIBackend{ - extRPCEnabled: false, - eth: nil, - gpo: nil, - verifier: false, - gasLimit: 0, - UsingOVM: true, - } - - nonce := uint64(0) - to := common.HexToAddress("0x5A0b54D5dc17e0AadC383d2db43B0a0D3E029c4c") - value := big.NewInt(0) - gasPrice := big.NewInt(0) - data := []byte{} - - // Set the gas limit to 1 so that the transaction will not be - // able to be added. - gasLimit := uint64(1) - tx := types.NewTransaction(nonce, to, value, gasLimit, gasPrice, data) - - err := backend.SendTx(context.Background(), tx) - if err == nil { - t.Fatal("Transaction with too large of gas limit accepted") - } - if err.Error() != fmt.Sprintf("Transaction gasLimit (%d) is greater than max gasLimit (%d)", gasLimit, backend.GasLimit()) { - t.Fatalf("Unexpected error type: %s", err) - } -} diff --git a/l2geth/internal/ethapi/api.go b/l2geth/internal/ethapi/api.go index 2f3f9940e082a..64dc1b9d3814b 100644 --- a/l2geth/internal/ethapi/api.go +++ b/l2geth/internal/ethapi/api.go @@ -27,6 +27,7 @@ import ( "github.com/davecgh/go-spew/spew" "github.com/ethereum/go-ethereum/accounts" + "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/accounts/keystore" "github.com/ethereum/go-ethereum/accounts/scwallet" "github.com/ethereum/go-ethereum/common" @@ -52,6 +53,8 @@ const ( defaultGasPrice = params.GWei ) +var errOVMUnsupported = errors.New("OVM: Unsupported RPC Method") + // PublicEthereumAPI provides an API to access Ethereum related information. // It offers only methods that operate on public data that is freely available to anyone. type PublicEthereumAPI struct { @@ -1043,6 +1046,9 @@ func DoEstimateGas(ctx context.Context, b Backend, args CallArgs, blockNrOrHash // 3. calculate the fee and normalize by the default gas price fee := core.CalculateRollupFee(*args.Data, uint64(gasUsed), dataPrice, executionPrice).Uint64() / defaultGasPrice + if fee < 21000 { + fee = 21000 + } return (hexutil.Uint64)(fee), nil } @@ -1082,19 +1088,21 @@ func legacyDoEstimateGas(ctx context.Context, b Backend, args CallArgs, blockNrO args.From = &common.Address{} } // Create a helper to check if a gas allowance results in an executable transaction - executable := func(gas uint64) bool { + executable := func(gas uint64) (bool, []byte) { args.Gas = (*hexutil.Uint64)(&gas) - _, _, failed, err := DoCall(ctx, b, args, blockNrOrHash, nil, vm.Config{}, 0, gasCap) + res, _, failed, err := DoCall(ctx, b, args, blockNrOrHash, nil, vm.Config{}, 0, gasCap) if err != nil || failed { - return false + return false, res } - return true + return true, res } // Execute the binary search and hone in on an executable gas limit for lo+1 < hi { mid := (hi + lo) / 2 - if !executable(mid) { + ok, _ := executable(mid) + + if !ok { lo = mid } else { hi = mid @@ -1102,7 +1110,16 @@ func legacyDoEstimateGas(ctx context.Context, b Backend, args CallArgs, blockNrO } // Reject the transaction as invalid if it still fails at the highest allowance if hi == cap { - if !executable(hi) { + ok, res := executable(hi) + if !ok { + if len(res) >= 4 && bytes.Equal(res[:4], abi.RevertSelector) { + reason, errUnpack := abi.UnpackRevert(res) + err := errors.New("execution reverted") + if errUnpack == nil { + err = fmt.Errorf("execution reverted: %v", reason) + } + return 0, err + } return 0, fmt.Errorf("gas required exceeds allowance (%d) or always failing transaction", cap) } } @@ -1286,7 +1303,10 @@ type RPCTransaction struct { // newRPCTransaction returns a transaction that will serialize to the RPC // representation, with the given location metadata set (if available). func newRPCTransaction(tx *types.Transaction, blockHash common.Hash, blockNumber uint64, index uint64) *RPCTransaction { - var signer types.Signer = types.NewOVMSigner(tx.ChainId()) + var signer types.Signer = types.FrontierSigner{} + if tx.Protected() { + signer = types.NewEIP155Signer(tx.ChainId()) + } from, _ := types.Sender(signer, tx) v, r, s := tx.RawSignatureValues() @@ -1514,7 +1534,7 @@ func (s *PublicTransactionPoolAPI) GetTransactionReceipt(ctx context.Context, ha var signer types.Signer = types.FrontierSigner{} if tx.Protected() { - signer = types.NewOVMSigner(tx.ChainId()) + signer = types.NewEIP155Signer(tx.ChainId()) } from, _ := types.Sender(signer, tx) @@ -1648,12 +1668,14 @@ func (args *SendTxArgs) toTransaction() *types.Transaction { } if args.To == nil { tx := types.NewContractCreation(uint64(*args.Nonce), (*big.Int)(args.Value), uint64(*args.Gas), (*big.Int)(args.GasPrice), input) - txMeta := types.NewTransactionMeta(args.L1BlockNumber, 0, nil, types.SighashEIP155, types.QueueOriginSequencer, nil, nil, nil) + raw, _ := rlp.EncodeToBytes(tx) + txMeta := types.NewTransactionMeta(args.L1BlockNumber, 0, nil, types.SighashEIP155, types.QueueOriginSequencer, nil, nil, raw) tx.SetTransactionMeta(txMeta) return tx } tx := types.NewTransaction(uint64(*args.Nonce), *args.To, (*big.Int)(args.Value), uint64(*args.Gas), (*big.Int)(args.GasPrice), input) - txMeta := types.NewTransactionMeta(args.L1BlockNumber, 0, args.L1MessageSender, args.SignatureHashType, types.QueueOriginSequencer, nil, nil, nil) + raw, _ := rlp.EncodeToBytes(tx) + txMeta := types.NewTransactionMeta(args.L1BlockNumber, 0, args.L1MessageSender, args.SignatureHashType, types.QueueOriginSequencer, nil, nil, raw) tx.SetTransactionMeta(txMeta) return tx } @@ -1683,10 +1705,9 @@ func SubmitTransaction(ctx context.Context, b Backend, tx *types.Transaction) (c // SendTransaction creates a transaction for the given argument, sign it and submit it to the // transaction pool. func (s *PublicTransactionPoolAPI) SendTransaction(ctx context.Context, args SendTxArgs) (common.Hash, error) { - if s.b.IsVerifier() { - return common.Hash{}, errors.New("Cannot send transaction in verifier mode") + if vm.UsingOVM { + return common.Hash{}, errOVMUnsupported } - // Look up the wallet containing the requested signer account := accounts.Account{Address: args.From} @@ -1719,6 +1740,9 @@ func (s *PublicTransactionPoolAPI) SendTransaction(ctx context.Context, args Sen // FillTransaction fills the defaults (nonce, gas, gasPrice) on a given unsigned transaction, // and returns it to the caller for further processing (signing + broadcast) func (s *PublicTransactionPoolAPI) FillTransaction(ctx context.Context, args SendTxArgs) (*SignTransactionResult, error) { + if vm.UsingOVM { + return nil, errOVMUnsupported + } // Set some sanity defaults and terminate on failure if err := args.setDefaults(ctx, s.b); err != nil { return nil, err @@ -1747,39 +1771,8 @@ func (s *PublicTransactionPoolAPI) SendRawTransaction(ctx context.Context, encod if err := rlp.DecodeBytes(encodedTx, tx); err != nil { return common.Hash{}, err } - - if new(big.Int).Mod(tx.GasPrice(), big.NewInt(1000000)).Cmp(big.NewInt(0)) != 0 { - return common.Hash{}, errors.New("Gas price must be a multiple of 1,000,000 wei") - } - // L1Timestamp and L1BlockNumber will be set by the miner - txMeta := types.NewTransactionMeta(nil, 0, nil, types.SighashEIP155, types.QueueOriginSequencer, nil, nil, nil) - tx.SetTransactionMeta(txMeta) - return SubmitTransaction(ctx, s.b, tx) -} - -// SendRawEthSignTransaction will add the signed transaction to the mempool. -// The signature hash was computed with `eth_sign`, meaning that the -// `abi.encodedPacked` transaction was prefixed with the string -// "Ethereum Signed Message". -func (s *PublicTransactionPoolAPI) SendRawEthSignTransaction(ctx context.Context, encodedTx hexutil.Bytes) (common.Hash, error) { - if s.b.IsVerifier() { - return common.Hash{}, errors.New("Cannot send raw ethsign transaction in verifier mode") - } - - if s.b.IsSyncing() { - return common.Hash{}, errors.New("Cannot send raw transaction while syncing") - } - - tx := new(types.Transaction) - if err := rlp.DecodeBytes(encodedTx, tx); err != nil { - return common.Hash{}, err - } - - if new(big.Int).Mod(tx.GasPrice(), big.NewInt(1000000)).Cmp(big.NewInt(0)) != 0 { - return common.Hash{}, errors.New("Gas price must be a multiple of 1,000,000 wei") - } - // L1Timestamp and L1BlockNumber will be set by the miner - txMeta := types.NewTransactionMeta(nil, 0, nil, types.SighashEthSign, types.QueueOriginSequencer, nil, nil, nil) + // L1Timestamp and L1BlockNumber will be set right before execution + txMeta := types.NewTransactionMeta(nil, 0, nil, types.SighashEIP155, types.QueueOriginSequencer, nil, nil, encodedTx) tx.SetTransactionMeta(txMeta) return SubmitTransaction(ctx, s.b, tx) } @@ -1794,6 +1787,9 @@ func (s *PublicTransactionPoolAPI) SendRawEthSignTransaction(ctx context.Context // // https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_sign func (s *PublicTransactionPoolAPI) Sign(addr common.Address, data hexutil.Bytes) (hexutil.Bytes, error) { + if vm.UsingOVM { + return nil, errOVMUnsupported + } // Look up the wallet containing the requested signer account := accounts.Account{Address: addr} @@ -1819,6 +1815,9 @@ type SignTransactionResult struct { // The node needs to have the private key of the account corresponding with // the given from address and it needs to be unlocked. func (s *PublicTransactionPoolAPI) SignTransaction(ctx context.Context, args SendTxArgs) (*SignTransactionResult, error) { + if vm.UsingOVM { + return nil, errOVMUnsupported + } if args.Gas == nil { return nil, fmt.Errorf("gas not specified") } @@ -1859,7 +1858,7 @@ func (s *PublicTransactionPoolAPI) PendingTransactions() ([]*RPCTransaction, err for _, tx := range pending { var signer types.Signer = types.HomesteadSigner{} if tx.Protected() { - signer = types.NewOVMSigner(tx.ChainId()) + signer = types.NewEIP155Signer(tx.ChainId()) } from, _ := types.Sender(signer, tx) if _, exists := accounts[from]; exists { @@ -1887,7 +1886,7 @@ func (s *PublicTransactionPoolAPI) Resend(ctx context.Context, sendArgs SendTxAr for _, p := range pending { var signer types.Signer = types.HomesteadSigner{} if p.Protected() { - signer = types.NewOVMSigner(p.ChainId()) + signer = types.NewEIP155Signer(p.ChainId()) } wantSigHash := signer.Hash(matchTx) diff --git a/l2geth/miner/worker.go b/l2geth/miner/worker.go index 3ebc34e9d8245..d152367f4d1e5 100644 --- a/l2geth/miner/worker.go +++ b/l2geth/miner/worker.go @@ -646,7 +646,7 @@ func (w *worker) makeCurrent(parent *types.Block, header *types.Header) error { return err } env := &environment{ - signer: types.NewOVMSigner(w.chainConfig.ChainID), + signer: types.NewEIP155Signer(w.chainConfig.ChainID), state: state, ancestors: mapset.NewSet(), family: mapset.NewSet(), diff --git a/l2geth/rollup/client.go b/l2geth/rollup/client.go index 795c8d39453cb..729848017bda8 100644 --- a/l2geth/rollup/client.go +++ b/l2geth/rollup/client.go @@ -132,7 +132,7 @@ type RollupClient interface { // Client is an HTTP based RollupClient type Client struct { client *resty.Client - signer *types.OVMSigner + signer *types.EIP155Signer } // TransactionResponse represents the response from the remote server when @@ -154,7 +154,7 @@ func NewClient(url string, chainID *big.Int) *Client { client := resty.New() client.SetHostURL(url) client.SetHeader("User-Agent", "sequencer") - signer := types.NewOVMSigner(chainID) + signer := types.NewEIP155Signer(chainID) return &Client{ client: client, @@ -274,7 +274,7 @@ func (c *Client) GetLatestEnqueue() (*types.Transaction, error) { // batchedTransactionToTransaction converts a transaction into a // types.Transaction that can be consumed by the SyncService -func batchedTransactionToTransaction(res *transaction, signer *types.OVMSigner) (*types.Transaction, error) { +func batchedTransactionToTransaction(res *transaction, signer *types.EIP155Signer) (*types.Transaction, error) { // `nil` transactions are not found if res == nil { return nil, errElementNotFound @@ -289,18 +289,7 @@ func batchedTransactionToTransaction(res *transaction, signer *types.OVMSigner) } else { return nil, fmt.Errorf("Unknown queue origin: %s", res.QueueOrigin) } - // The transaction type must be EIP155 or EthSign. Throughout this - // codebase, it is referred to as "sighash type" but it could actually - // be generalized to transaction type. Right now the only different - // types use a different signature hashing scheme. - var sighashType types.SignatureHashType - if res.Type == EIP155 { - sighashType = types.SighashEIP155 - } else if res.Type == ETH_SIGN { - sighashType = types.SighashEthSign - } else { - return nil, fmt.Errorf("Unknown transaction type: %s", res.Type) - } + sighashType := types.SighashEIP155 // Transactions that have been decoded are // Queue Origin Sequencer transactions if res.Decoded != nil { @@ -542,7 +531,7 @@ func (c *Client) GetTransactionBatch(index uint64) (*Batch, []*types.Transaction // parseTransactionBatchResponse will turn a TransactionBatchResponse into a // Batch and its corresponding types.Transactions -func parseTransactionBatchResponse(txBatch *TransactionBatchResponse, signer *types.OVMSigner) (*Batch, []*types.Transaction, error) { +func parseTransactionBatchResponse(txBatch *TransactionBatchResponse, signer *types.EIP155Signer) (*Batch, []*types.Transaction, error) { if txBatch == nil { return nil, nil, nil } diff --git a/l2geth/rollup/sync_service.go b/l2geth/rollup/sync_service.go index d9b31237bb12b..affd6f4dbeb83 100644 --- a/l2geth/rollup/sync_service.go +++ b/l2geth/rollup/sync_service.go @@ -1,7 +1,6 @@ package rollup import ( - "bytes" "context" "errors" "fmt" @@ -11,7 +10,6 @@ import ( "sync/atomic" "time" - "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/ethdb" "github.com/ethereum/go-ethereum/event" @@ -707,7 +705,6 @@ func (s *SyncService) maybeApplyTransaction(tx *types.Transaction) error { // Lower level API used to apply a transaction, must only be used with // transactions that came from L1. func (s *SyncService) applyTransaction(tx *types.Transaction) error { - tx = fixType(tx) txs := types.Transactions{tx} s.txFeed.Send(core.NewTxsEvent{Txs: txs}) return nil @@ -745,114 +742,5 @@ func (s *SyncService) ApplyTransaction(tx *types.Transaction) error { tx.SetL1Timestamp(ts) tx.SetL1BlockNumber(bn) } - - // Set the raw transaction data in the meta - txRaw, err := getRawTransaction(tx) - if err != nil { - return fmt.Errorf("invalid transaction: %w", err) - } - meta := tx.GetMeta() - newMeta := types.NewTransactionMeta( - meta.L1BlockNumber, - meta.L1Timestamp, - meta.L1MessageSender, - meta.SignatureHashType, - types.QueueOrigin(meta.QueueOrigin.Uint64()), - meta.Index, - meta.QueueIndex, - txRaw, - ) - tx.SetTransactionMeta(newMeta) - return s.applyTransaction(tx) } - -func getRawTransaction(tx *types.Transaction) ([]byte, error) { - if tx == nil { - return nil, errors.New("Cannot process nil transaction") - } - v, r, s := tx.RawSignatureValues() - - // V parameter here will include the chain ID, so we need to recover the original V. If the V - // does not equal zero or one, we have an invalid parameter and need to throw an error. - // This is technically a duplicate check because it happens inside of - // `tx.AsMessage` as well. - v = new(big.Int).SetUint64(v.Uint64() - 35 - 2*tx.ChainId().Uint64()) - if v.Uint64() != 0 && v.Uint64() != 1 { - return nil, fmt.Errorf("invalid signature v parameter: %d", v.Uint64()) - } - - // Since we use a fixed encoding, we need to insert some placeholder address to represent that - // the user wants to create a contract (in this case, the zero address). - var target common.Address - if tx.To() == nil { - target = common.Address{} - } else { - target = *tx.To() - } - - // Divide the gas price by one million to compress it - // before it is send to the sequencer entrypoint. This is to save - // space on calldata. - gasPrice := new(big.Int).Div(tx.GasPrice(), new(big.Int).SetUint64(1000000)) - - // Sequencer uses a custom encoding structure -- - // We originally receive sequencer transactions encoded in this way, but we decode them before - // inserting into Geth so we can make transactions easily parseable. However, this means that - // we need to re-encode the transactions before executing them. - var data = new(bytes.Buffer) - data.WriteByte(getSignatureType(tx)) // 1 byte: 00 == EIP 155, 02 == ETH Sign Message - data.Write(fillBytes(r, 32)) // 32 bytes: Signature `r` parameter - data.Write(fillBytes(s, 32)) // 32 bytes: Signature `s` parameter - data.Write(fillBytes(v, 1)) // 1 byte: Signature `v` parameter - data.Write(fillBytes(new(big.Int).SetUint64(tx.Gas()), 3)) // 3 bytes: Gas limit - data.Write(fillBytes(gasPrice, 3)) // 3 bytes: Gas price - data.Write(fillBytes(new(big.Int).SetUint64(tx.Nonce()), 3)) // 3 bytes: Nonce - data.Write(target.Bytes()) // 20 bytes: Target address - data.Write(tx.Data()) - - return data.Bytes(), nil -} - -func fillBytes(x *big.Int, size int) []byte { - b := x.Bytes() - switch { - case len(b) > size: - panic("math/big: value won't fit requested size") - case len(b) == size: - return b - default: - buf := make([]byte, size) - copy(buf[size-len(b):], b) - return buf - } -} - -func getSignatureType(tx *types.Transaction) uint8 { - if tx.SignatureHashType() == 0 { - return 0 - } else if tx.SignatureHashType() == 1 { - return 2 - } else { - return 1 - } -} - -// This is a temporary fix to patch the enums being used in the raw data -func fixType(tx *types.Transaction) *types.Transaction { - meta := tx.GetMeta() - raw := meta.RawTransaction - if len(raw) == 0 { - log.Error("Transaction with no raw detected") - return tx - } - if raw[0] == 0x00 { - return tx - } else if raw[0] == 0x01 { - raw[0] = 0x02 - } - queueOrigin := types.QueueOrigin(meta.QueueOrigin.Uint64()) - fixed := types.NewTransactionMeta(meta.L1BlockNumber, meta.L1Timestamp, meta.L1MessageSender, meta.SignatureHashType, queueOrigin, meta.Index, meta.QueueIndex, raw) - tx.SetTransactionMeta(fixed) - return tx -} diff --git a/ops/docker-compose.yml b/ops/docker-compose.yml index 2ca1b5e648900..940069375bec7 100644 --- a/ops/docker-compose.yml +++ b/ops/docker-compose.yml @@ -21,7 +21,7 @@ services: - ${L1CHAIN_HTTP_PORT:-9545}:8545 deployer: - depends_on: + depends_on: - l1_chain image: ethereumoptimism/deployer build: @@ -42,7 +42,7 @@ services: - ${DEPLOYER_PORT:-8080}:8081 dtl: - depends_on: + depends_on: - l1_chain - deployer - l2geth diff --git a/packages/contracts/contracts/optimistic-ethereum/OVM/accounts/OVM_ECDSAContractAccount.sol b/packages/contracts/contracts/optimistic-ethereum/OVM/accounts/OVM_ECDSAContractAccount.sol index 58b546953248e..74816818683d4 100644 --- a/packages/contracts/contracts/optimistic-ethereum/OVM/accounts/OVM_ECDSAContractAccount.sol +++ b/packages/contracts/contracts/optimistic-ethereum/OVM/accounts/OVM_ECDSAContractAccount.sol @@ -7,8 +7,7 @@ pragma experimental ABIEncoderV2; import { iOVM_ECDSAContractAccount } from "../../iOVM/accounts/iOVM_ECDSAContractAccount.sol"; /* Library Imports */ -import { Lib_OVMCodec } from "../../libraries/codec/Lib_OVMCodec.sol"; -import { Lib_ECDSAUtils } from "../../libraries/utils/Lib_ECDSAUtils.sol"; +import { Lib_EIP155Tx } from "../../libraries/codec/Lib_EIP155Tx.sol"; import { Lib_ExecutionManagerWrapper } from "../../libraries/wrappers/Lib_ExecutionManagerWrapper.sol"; /* Contract Imports */ @@ -20,14 +19,21 @@ import { SafeMath } from "@openzeppelin/contracts/math/SafeMath.sol"; /** * @title OVM_ECDSAContractAccount * @dev The ECDSA Contract Account can be used as the implementation for a ProxyEOA deployed by the - * ovmCREATEEOA operation. It enables backwards compatibility with Ethereum's Layer 1, by - * providing eth_sign and EIP155 formatted transaction encodings. + * ovmCREATEEOA operation. It enables backwards compatibility with Ethereum's Layer 1, by + * providing EIP155 formatted transaction encodings. * * Compiler used: optimistic-solc * Runtime target: OVM */ contract OVM_ECDSAContractAccount is iOVM_ECDSAContractAccount { + /************* + * Libraries * + *************/ + + using Lib_EIP155Tx for Lib_EIP155Tx.EIP155Tx; + + /************* * Constants * *************/ @@ -44,20 +50,12 @@ contract OVM_ECDSAContractAccount is iOVM_ECDSAContractAccount { /** * Executes a signed transaction. - * @param _transaction Signed EOA transaction. - * @param _signatureType Hashing scheme used for the transaction (e.g., ETH signed message). - * @param _v Signature `v` parameter. - * @param _r Signature `r` parameter. - * @param _s Signature `s` parameter. + * @param _encodedTransaction Signed EIP155 transaction. * @return Whether or not the call returned (rather than reverted). * @return Data returned by the call. */ function execute( - bytes memory _transaction, - Lib_OVMCodec.EOASignatureType _signatureType, - uint8 _v, - bytes32 _r, - bytes32 _s + bytes memory _encodedTransaction ) override public @@ -66,50 +64,30 @@ contract OVM_ECDSAContractAccount is iOVM_ECDSAContractAccount { bytes memory ) { - bool isEthSign = _signatureType == Lib_OVMCodec.EOASignatureType.ETH_SIGNED_MESSAGE; + // Attempt to decode the transaction. + Lib_EIP155Tx.EIP155Tx memory transaction = Lib_EIP155Tx.decode( + _encodedTransaction, + Lib_ExecutionManagerWrapper.ovmCHAINID() + ); // Address of this contract within the ovm (ovmADDRESS) should be the same as the // recovered address of the user who signed this message. This is how we manage to shim // account abstraction even though the user isn't a contract. - // Need to make sure that the transaction nonce is right and bump it if so. require( - Lib_ECDSAUtils.recover( - _transaction, - isEthSign, - _v, - _r, - _s - ) == address(this), + transaction.sender() == address(this), "Signature provided for EOA transaction execution is invalid." ); - Lib_OVMCodec.EIP155Transaction memory decodedTx = Lib_OVMCodec.decodeEIP155Transaction( - _transaction, - isEthSign - ); - - // Grab the chain ID of the current network. - uint256 chainId; - assembly { - chainId := chainid() - } - - // Need to make sure that the transaction chainId is correct. - require( - decodedTx.chainId == chainId, - "Transaction chainId does not match expected OVM chainId." - ); - // Need to make sure that the transaction nonce is right. require( - decodedTx.nonce == Lib_ExecutionManagerWrapper.ovmGETNONCE(), + transaction.nonce == Lib_ExecutionManagerWrapper.ovmGETNONCE(), "Transaction nonce does not match the expected nonce." ); // TEMPORARY: Disable gas checks for mainnet. // // Need to make sure that the gas is sufficient to execute the transaction. // require( - // gasleft() >= SafeMath.add(decodedTx.gasLimit, EXECUTION_VALIDATION_GAS_OVERHEAD), + // gasleft() >= SafeMath.add(transaction.gasLimit, EXECUTION_VALIDATION_GAS_OVERHEAD), // "Gas is not sufficient to execute the transaction." // ); @@ -117,15 +95,21 @@ contract OVM_ECDSAContractAccount is iOVM_ECDSAContractAccount { require( ovmETH.transfer( msg.sender, - SafeMath.mul(decodedTx.gasLimit, decodedTx.gasPrice) + SafeMath.mul(transaction.gasLimit, transaction.gasPrice) ), "Fee was not transferred to relayer." ); // Contract creations are signalled by sending a transaction to the zero address. - if (decodedTx.to == address(0)) { + if (transaction.isCreate) { + // TEMPORARY: Disable value transfer for contract creations. + require( + transaction.value == 0, + "Value transfer in contract creation not supported." + ); + (address created, bytes memory revertdata) = Lib_ExecutionManagerWrapper.ovmCREATE( - decodedTx.data + transaction.data ); // Return true if the contract creation succeeded, false w/ revertdata otherwise. @@ -140,7 +124,25 @@ contract OVM_ECDSAContractAccount is iOVM_ECDSAContractAccount { // cases, but since this is a contract we'd end up bumping the nonce twice. Lib_ExecutionManagerWrapper.ovmINCREMENTNONCE(); - return decodedTx.to.call(decodedTx.data); + // Value transfer currently only supported for CALL but not for CREATE. + if (transaction.value > 0) { + // TEMPORARY: Block value transfer if the transaction has input data. + require( + transaction.data.length == 0, + "Value is nonzero but input data was provided." + ); + + require( + ovmETH.transfer( + transaction.to, + transaction.value + ), + "Value could not be transferred to recipient." + ); + return (true, bytes("")); + } else { + return transaction.to.call(transaction.data); + } } } } diff --git a/packages/contracts/contracts/optimistic-ethereum/OVM/accounts/OVM_ProxyEOA.sol b/packages/contracts/contracts/optimistic-ethereum/OVM/accounts/OVM_ProxyEOA.sol index 02d809b717a6e..d158d15d5b4e5 100644 --- a/packages/contracts/contracts/optimistic-ethereum/OVM/accounts/OVM_ProxyEOA.sol +++ b/packages/contracts/contracts/optimistic-ethereum/OVM/accounts/OVM_ProxyEOA.sol @@ -16,12 +16,21 @@ import { Lib_Bytes32Utils } from "../../libraries/utils/Lib_Bytes32Utils.sol"; */ contract OVM_ProxyEOA { + /********** + * Events * + **********/ + + event Upgraded( + address indexed implementation + ); + + /************* * Constants * *************/ address constant DEFAULT_IMPLEMENTATION = 0x4200000000000000000000000000000000000003; - bytes32 constant IMPLEMENTATION_KEY = 0xdeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddead; + bytes32 constant IMPLEMENTATION_KEY = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; //bytes32(uint256(keccak256('eip1967.proxy.implementation')) - 1); /********************* @@ -68,6 +77,7 @@ contract OVM_ProxyEOA { ); _setImplementation(_implementation); + emit Upgraded(_implementation); } /** diff --git a/packages/contracts/contracts/optimistic-ethereum/OVM/bridge/tokens/OVM_L1ETHGateway.sol b/packages/contracts/contracts/optimistic-ethereum/OVM/bridge/tokens/OVM_L1ETHGateway.sol index 8039a895fe5a1..1080e56918953 100644 --- a/packages/contracts/contracts/optimistic-ethereum/OVM/bridge/tokens/OVM_L1ETHGateway.sol +++ b/packages/contracts/contracts/optimistic-ethereum/OVM/bridge/tokens/OVM_L1ETHGateway.sol @@ -174,4 +174,25 @@ contract OVM_L1ETHGateway is iOVM_L1ETHGateway, OVM_CrossDomainEnabled, Lib_Addr (bool success, ) = _to.call{value: _value}(new bytes(0)); require(success, 'TransferHelper::safeTransferETH: ETH transfer failed'); } + + /***************************** + * Temporary - Migrating ETH * + *****************************/ + + /** + * @dev Migrates entire ETH balance to another gateway + * @param _to Gateway Proxy address to migrate ETH to + */ + function migrateEth(address payable _to) external { + address owner = Lib_AddressManager(libAddressManager).owner(); + require(msg.sender == owner, "Only the owner can migrate ETH"); + uint256 balance = address(this).balance; + OVM_L1ETHGateway(_to).donateETH{value:balance}(); + } + + /** + * @dev Adds ETH balance to the account. This is meant to allow for ETH + * to be migrated from an old gateway to a new gateway + */ + function donateETH() external payable {} } diff --git a/packages/contracts/contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol b/packages/contracts/contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol index 14a55abf5d646..7fdfdfa1f9441 100644 --- a/packages/contracts/contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol +++ b/packages/contracts/contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol @@ -162,11 +162,14 @@ contract OVM_ExecutionManager is iOVM_ExecutionManager, Lib_AddressResolver { ) override external + returns ( + bytes memory + ) { // Make sure that run() is not re-enterable. This condition should always be satisfied // Once run has been called once, due to the behavior of _isValidInput(). if (transactionContext.ovmNUMBER != DEFAULT_UINT256) { - return; + return bytes(""); } // Store our OVM_StateManager instance (significantly easier than attempting to pass the @@ -194,7 +197,7 @@ contract OVM_ExecutionManager is iOVM_ExecutionManager, Lib_AddressResolver { // reverts for INVALID_STATE_ACCESS. if (_isValidInput(_transaction) == false) { _resetContext(); - return; + return bytes(""); } // TEMPORARY: Gas metering is disabled for minnet. @@ -202,7 +205,7 @@ contract OVM_ExecutionManager is iOVM_ExecutionManager, Lib_AddressResolver { // uint256 gasProvided = gasleft(); // Run the transaction, make sure to meter the gas usage. - ovmCALL( + (, bytes memory returndata) = ovmCALL( _transaction.gasLimit - gasMeterConfig.minTransactionGasLimit, _transaction.entrypoint, _transaction.data @@ -215,6 +218,8 @@ contract OVM_ExecutionManager is iOVM_ExecutionManager, Lib_AddressResolver { // Wipe the execution context. _resetContext(); + + return returndata; } @@ -1877,7 +1882,6 @@ contract OVM_ExecutionManager is iOVM_ExecutionManager, Lib_AddressResolver { ) external returns ( - bool, bytes memory ) { @@ -1894,18 +1898,19 @@ contract OVM_ExecutionManager is iOVM_ExecutionManager, Lib_AddressResolver { if (isCreate) { (address created, bytes memory revertData) = ovmCREATE(_transaction.data); if (created == address(0)) { - return (false, revertData); + return abi.encode(false, revertData); } else { // The eth_call RPC endpoint for to = undefined will return the deployed bytecode // in the success case, differing from standard create messages. - return (true, Lib_EthUtils.getCode(created)); + return abi.encode(true, Lib_EthUtils.getCode(created)); } } else { - return ovmCALL( + (bool success, bytes memory returndata) = ovmCALL( _transaction.gasLimit, _transaction.entrypoint, _transaction.data ); + return abi.encode(success, returndata); } } } diff --git a/packages/contracts/contracts/optimistic-ethereum/OVM/predeploys/OVM_SequencerEntrypoint.sol b/packages/contracts/contracts/optimistic-ethereum/OVM/predeploys/OVM_SequencerEntrypoint.sol index f02ea17ac6683..0be33bd2b98a0 100644 --- a/packages/contracts/contracts/optimistic-ethereum/OVM/predeploys/OVM_SequencerEntrypoint.sol +++ b/packages/contracts/contracts/optimistic-ethereum/OVM/predeploys/OVM_SequencerEntrypoint.sol @@ -2,13 +2,8 @@ // @unsupported: evm pragma solidity >0.5.0 <0.8.0; -/* Interface Imports */ -import { iOVM_ECDSAContractAccount } from "../../iOVM/accounts/iOVM_ECDSAContractAccount.sol"; - /* Library Imports */ -import { Lib_BytesUtils } from "../../libraries/utils/Lib_BytesUtils.sol"; -import { Lib_OVMCodec } from "../../libraries/codec/Lib_OVMCodec.sol"; -import { Lib_ECDSAUtils } from "../../libraries/utils/Lib_ECDSAUtils.sol"; +import { Lib_EIP155Tx } from "../../libraries/codec/Lib_EIP155Tx.sol"; import { Lib_ExecutionManagerWrapper } from "../../libraries/wrappers/Lib_ExecutionManagerWrapper.sol"; /** @@ -16,22 +11,16 @@ import { Lib_ExecutionManagerWrapper } from "../../libraries/wrappers/Lib_Execut * @dev The Sequencer Entrypoint is a predeploy which, despite its name, can in fact be called by * any account. It accepts a more efficient compressed calldata format, which it decompresses and * encodes to the standard EIP155 transaction format. - * This contract is the implementation referenced by the Proxy Sequencer Entrypoint, thus enabling - * the Optimism team to upgrade the decompression of calldata from the Sequencer. - * * Compiler used: optimistic-solc * Runtime target: OVM */ contract OVM_SequencerEntrypoint { - /********* - * Enums * - *********/ + /************* + * Libraries * + *************/ - enum TransactionType { - NATIVE_ETH_TRANSACTION, - ETH_SIGNED_MESSAGE - } + using Lib_EIP155Tx for Lib_EIP155Tx.EIP155Tx; /********************* @@ -39,104 +28,56 @@ contract OVM_SequencerEntrypoint { *********************/ /** - * Uses a custom "compressed" format to save on calldata gas: - * calldata[00:01]: transaction type (0 == EIP 155, 2 == Eth Sign Message) - * calldata[01:33]: signature "r" parameter - * calldata[33:65]: signature "s" parameter - * calldata[65:66]: signature "v" parameter - * calldata[66:69]: transaction gas limit - * calldata[69:72]: transaction gas price - * calldata[72:75]: transaction nonce - * calldata[75:95]: transaction target address - * calldata[95:XX]: transaction data + * Expects an RLP-encoded EIP155 transaction as input. See the EIP for a more detailed + * description of this transaction format: + * https://github.com/ethereum/EIPs/blob/master/EIPS/eip-155.md */ fallback() external { - TransactionType transactionType = _getTransactionType(Lib_BytesUtils.toUint8(msg.data, 0)); - - bytes32 r = Lib_BytesUtils.toBytes32(Lib_BytesUtils.slice(msg.data, 1, 32)); - bytes32 s = Lib_BytesUtils.toBytes32(Lib_BytesUtils.slice(msg.data, 33, 32)); - uint8 v = Lib_BytesUtils.toUint8(msg.data, 65); - - // Remainder is the transaction to execute. - bytes memory compressedTx = Lib_BytesUtils.slice(msg.data, 66); - bool isEthSignedMessage = transactionType == TransactionType.ETH_SIGNED_MESSAGE; - - // Grab the chain ID for the current network. - uint256 chainId; - assembly { - chainId := chainid() - } + // We use this twice, so it's more gas efficient to store a copy of it (barely). + bytes memory encodedTx = msg.data; - // Need to decompress and then re-encode the transaction based on the original encoding. - bytes memory encodedTx = Lib_OVMCodec.encodeEIP155Transaction( - Lib_OVMCodec.decompressEIP155Transaction( - compressedTx, - chainId - ), - isEthSignedMessage - ); - - address target = Lib_ECDSAUtils.recover( + // Decode the tx with the correct chain ID. + Lib_EIP155Tx.EIP155Tx memory transaction = Lib_EIP155Tx.decode( encodedTx, - isEthSignedMessage, - v, - r, - s + Lib_ExecutionManagerWrapper.ovmCHAINID() ); + // Value is computed on the fly. Keep it in the stack to save some gas. + address target = transaction.sender(); + bool isEmptyContract; assembly { isEmptyContract := iszero(extcodesize(target)) } + // If the account is empty, deploy the default EOA to that address. if (isEmptyContract) { - // ProxyEOA has not yet been deployed for this EOA. - bytes32 messageHash = Lib_ECDSAUtils.getMessageHash(encodedTx, isEthSignedMessage); - Lib_ExecutionManagerWrapper.ovmCREATEEOA(messageHash, v, r, s); + Lib_ExecutionManagerWrapper.ovmCREATEEOA( + transaction.hash(), + transaction.recoveryParam, + transaction.r, + transaction.s + ); } - Lib_OVMCodec.EOASignatureType sigtype; - if (isEthSignedMessage) { - sigtype = Lib_OVMCodec.EOASignatureType.ETH_SIGNED_MESSAGE; - } else { - sigtype = Lib_OVMCodec.EOASignatureType.EIP155_TRANSACTION; - } - - iOVM_ECDSAContractAccount(target).execute( - encodedTx, - sigtype, - v, - r, - s + // Forward the transaction over to the EOA. + (bool success, bytes memory returndata) = target.call( + abi.encodeWithSignature( + "execute(bytes)", + encodedTx + ) ); - } - - /********************** - * Internal Functions * - **********************/ - - /** - * Converts a uint256 into a TransactionType enum. - * @param _transactionType Transaction type index. - * @return _txType Transaction type enum value. - */ - function _getTransactionType( - uint8 _transactionType - ) - internal - returns ( - TransactionType _txType - ) - { - if (_transactionType == 0) { - return TransactionType.NATIVE_ETH_TRANSACTION; - } if (_transactionType == 2) { - return TransactionType.ETH_SIGNED_MESSAGE; + if (success) { + assembly { + return(add(returndata, 0x20), mload(returndata)) + } } else { - revert("Transaction type must be 0 or 2"); + assembly { + revert(add(returndata, 0x20), mload(returndata)) + } } } } diff --git a/packages/contracts/contracts/optimistic-ethereum/iOVM/accounts/iOVM_ECDSAContractAccount.sol b/packages/contracts/contracts/optimistic-ethereum/iOVM/accounts/iOVM_ECDSAContractAccount.sol index 16c956580f855..2b2830577ccfa 100644 --- a/packages/contracts/contracts/optimistic-ethereum/iOVM/accounts/iOVM_ECDSAContractAccount.sol +++ b/packages/contracts/contracts/optimistic-ethereum/iOVM/accounts/iOVM_ECDSAContractAccount.sol @@ -15,10 +15,11 @@ interface iOVM_ECDSAContractAccount { ********************/ function execute( - bytes memory _transaction, - Lib_OVMCodec.EOASignatureType _signatureType, - uint8 _v, - bytes32 _r, - bytes32 _s - ) external returns (bool _success, bytes memory _returndata); + bytes memory _encodedTransaction + ) + external + returns ( + bool, + bytes memory + ); } diff --git a/packages/contracts/contracts/optimistic-ethereum/iOVM/execution/iOVM_ExecutionManager.sol b/packages/contracts/contracts/optimistic-ethereum/iOVM/execution/iOVM_ExecutionManager.sol index 9be045cfc7481..0ecbc2274bf6b 100644 --- a/packages/contracts/contracts/optimistic-ethereum/iOVM/execution/iOVM_ExecutionManager.sol +++ b/packages/contracts/contracts/optimistic-ethereum/iOVM/execution/iOVM_ExecutionManager.sol @@ -75,7 +75,7 @@ interface iOVM_ExecutionManager { function run( Lib_OVMCodec.Transaction calldata _transaction, address _txStateManager - ) external; + ) external returns (bytes memory); /******************* diff --git a/packages/contracts/contracts/optimistic-ethereum/libraries/codec/Lib_EIP155Tx.sol b/packages/contracts/contracts/optimistic-ethereum/libraries/codec/Lib_EIP155Tx.sol new file mode 100644 index 0000000000000..d1f64819199e4 --- /dev/null +++ b/packages/contracts/contracts/optimistic-ethereum/libraries/codec/Lib_EIP155Tx.sol @@ -0,0 +1,203 @@ +// SPDX-License-Identifier: MIT +pragma solidity >0.5.0 <0.8.0; +pragma experimental ABIEncoderV2; + +/* Library Imports */ +import { Lib_RLPReader } from "../rlp/Lib_RLPReader.sol"; +import { Lib_RLPWriter } from "../rlp/Lib_RLPWriter.sol"; + +/** + * @title Lib_EIP155Tx + * @dev A simple library for dealing with the transaction type defined by EIP155: + * https://github.com/ethereum/EIPs/blob/master/EIPS/eip-155.md + */ +library Lib_EIP155Tx { + + /*********** + * Structs * + ***********/ + + // Struct representing an EIP155 transaction. See EIP link above for more information. + struct EIP155Tx { + // These fields correspond to the actual RLP-encoded fields specified by EIP155. + uint256 nonce; + uint256 gasPrice; + uint256 gasLimit; + address to; + uint256 value; + bytes data; + uint8 v; + bytes32 r; + bytes32 s; + + // Chain ID to associate this transaction with. Used all over the place, seemed easier to + // set this once when we create the transaction rather than providing it as an input to + // each function. I don't see a strong need to have a transaction with a mutable chain ID. + uint256 chainId; + + // The ECDSA "recovery parameter," should always be 0 or 1. EIP155 specifies that: + // `v = {0,1} + CHAIN_ID * 2 + 35` + // Where `{0,1}` is a stand in for our `recovery_parameter`. Now computing our formula for + // the recovery parameter: + // 1. `v = {0,1} + CHAIN_ID * 2 + 35` + // 2. `v = recovery_parameter + CHAIN_ID * 2 + 35` + // 3. `v - CHAIN_ID * 2 - 35 = recovery_parameter` + // So we're left with the final formula: + // `recovery_parameter = v - CHAIN_ID * 2 - 35` + // NOTE: This variable is a uint8 because `v` is inherently limited to a uint8. If we + // didn't use a uint8, then recovery_parameter would always be a negative number for chain + // IDs greater than 110 (`255 - 110 * 2 - 35 = 0`). So we need to wrap around to support + // anything larger. + uint8 recoveryParam; + + // Whether or not the transaction is a creation. Necessary because we can't make an address + // "nil". Using the zero address creates a potential conflict if the user did actually + // intend to send a transaction to the zero address. + bool isCreate; + } + + // Lets us use nicer syntax. + using Lib_EIP155Tx for EIP155Tx; + + + /********************** + * Internal Functions * + **********************/ + + /** + * Decodes an EIP155 transaction and attaches a given Chain ID. + * Transaction *must* be RLP-encoded. + * @param _encoded RLP-encoded EIP155 transaction. + * @param _chainId Chain ID to assocaite with this transaction. + * @return Parsed transaction. + */ + function decode( + bytes memory _encoded, + uint256 _chainId + ) + internal + pure + returns ( + EIP155Tx memory + ) + { + Lib_RLPReader.RLPItem[] memory decoded = Lib_RLPReader.readList(_encoded); + + // Note formula above about how recoveryParam is computed. + uint8 v = uint8(Lib_RLPReader.readUint256(decoded[6])); + uint8 recoveryParam = uint8(v - 2 * _chainId - 35); + + // Recovery param being anything other than 0 or 1 indicates that we have the wrong chain + // ID. + require( + recoveryParam < 2, + "Lib_EIP155Tx: Transaction signed with wrong chain ID" + ); + + // Creations can be detected by looking at the byte length here. + bool isCreate = Lib_RLPReader.readBytes(decoded[3]).length == 0; + + return EIP155Tx({ + nonce: Lib_RLPReader.readUint256(decoded[0]), + gasPrice: Lib_RLPReader.readUint256(decoded[1]), + gasLimit: Lib_RLPReader.readUint256(decoded[2]), + to: Lib_RLPReader.readAddress(decoded[3]), + value: Lib_RLPReader.readUint256(decoded[4]), + data: Lib_RLPReader.readBytes(decoded[5]), + v: v, + r: Lib_RLPReader.readBytes32(decoded[7]), + s: Lib_RLPReader.readBytes32(decoded[8]), + chainId: _chainId, + recoveryParam: recoveryParam, + isCreate: isCreate + }); + } + + /** + * Encodes an EIP155 transaction into RLP. + * @param _transaction EIP155 transaction to encode. + * @param _includeSignature Whether or not to encode the signature. + * @return RLP-encoded transaction. + */ + function encode( + EIP155Tx memory _transaction, + bool _includeSignature + ) + internal + pure + returns ( + bytes memory + ) + { + bytes[] memory raw = new bytes[](9); + + raw[0] = Lib_RLPWriter.writeUint(_transaction.nonce); + raw[1] = Lib_RLPWriter.writeUint(_transaction.gasPrice); + raw[2] = Lib_RLPWriter.writeUint(_transaction.gasLimit); + + // We write the encoding of empty bytes when the transaction is a creation, *not* the zero + // address as one might assume. + if (_transaction.isCreate) { + raw[3] = Lib_RLPWriter.writeBytes(''); + } else { + raw[3] = Lib_RLPWriter.writeAddress(_transaction.to); + } + + raw[4] = Lib_RLPWriter.writeUint(_transaction.value); + raw[5] = Lib_RLPWriter.writeBytes(_transaction.data); + + if (_includeSignature) { + raw[6] = Lib_RLPWriter.writeUint(_transaction.v); + raw[7] = Lib_RLPWriter.writeBytes32(_transaction.r); + raw[8] = Lib_RLPWriter.writeBytes32(_transaction.s); + } else { + // Chain ID *is* included in the unsigned transaction. + raw[6] = Lib_RLPWriter.writeUint(_transaction.chainId); + raw[7] = Lib_RLPWriter.writeBytes(''); + raw[8] = Lib_RLPWriter.writeBytes(''); + } + + return Lib_RLPWriter.writeList(raw); + } + + /** + * Computes the hash of an EIP155 transaction. Assumes that you don't want to include the + * signature in this hash because that's a very uncommon usecase. If you really want to include + * the signature, just encode with the signature and take the hash yourself. + */ + function hash( + EIP155Tx memory _transaction + ) + internal + pure + returns ( + bytes32 + ) + { + return keccak256( + _transaction.encode(false) + ); + } + + /** + * Computes the sender of an EIP155 transaction. + * @param _transaction EIP155 transaction to get a sender for. + * @return Address corresponding to the private key that signed this transaction. + */ + function sender( + EIP155Tx memory _transaction + ) + internal + pure + returns ( + address + ) + { + return ecrecover( + _transaction.hash(), + _transaction.recoveryParam + 27, + _transaction.r, + _transaction.s + ); + } +} diff --git a/packages/contracts/contracts/optimistic-ethereum/libraries/codec/Lib_OVMCodec.sol b/packages/contracts/contracts/optimistic-ethereum/libraries/codec/Lib_OVMCodec.sol index f52cf1d88967d..cea8f8c6d0b29 100644 --- a/packages/contracts/contracts/optimistic-ethereum/libraries/codec/Lib_OVMCodec.sol +++ b/packages/contracts/contracts/optimistic-ethereum/libraries/codec/Lib_OVMCodec.sol @@ -17,11 +17,6 @@ library Lib_OVMCodec { * Enums * *********/ - enum EOASignatureType { - EIP155_TRANSACTION, - ETH_SIGNED_MESSAGE - } - enum QueueOrigin { SEQUENCER_QUEUE, L1TOL2_QUEUE @@ -85,144 +80,11 @@ library Lib_OVMCodec { uint40 blockNumber; } - struct EIP155Transaction { - uint256 nonce; - uint256 gasPrice; - uint256 gasLimit; - address to; - uint256 value; - bytes data; - uint256 chainId; - } - /********************** * Internal Functions * **********************/ - /** - * Decodes an EOA transaction (i.e., native Ethereum RLP encoding). - * @param _transaction Encoded EOA transaction. - * @return Transaction decoded into a struct. - */ - function decodeEIP155Transaction( - bytes memory _transaction, - bool _isEthSignedMessage - ) - internal - pure - returns ( - EIP155Transaction memory - ) - { - if (_isEthSignedMessage) { - ( - uint256 _nonce, - uint256 _gasLimit, - uint256 _gasPrice, - uint256 _chainId, - address _to, - bytes memory _data - ) = abi.decode( - _transaction, - (uint256, uint256, uint256, uint256, address ,bytes) - ); - return EIP155Transaction({ - nonce: _nonce, - gasPrice: _gasPrice, - gasLimit: _gasLimit, - to: _to, - value: 0, - data: _data, - chainId: _chainId - }); - } else { - Lib_RLPReader.RLPItem[] memory decoded = Lib_RLPReader.readList(_transaction); - - return EIP155Transaction({ - nonce: Lib_RLPReader.readUint256(decoded[0]), - gasPrice: Lib_RLPReader.readUint256(decoded[1]), - gasLimit: Lib_RLPReader.readUint256(decoded[2]), - to: Lib_RLPReader.readAddress(decoded[3]), - value: Lib_RLPReader.readUint256(decoded[4]), - data: Lib_RLPReader.readBytes(decoded[5]), - chainId: Lib_RLPReader.readUint256(decoded[6]) - }); - } - } - - /** - * Decompresses a compressed EIP155 transaction. - * @param _transaction Compressed EIP155 transaction bytes. - * @param _chainId Chain ID this transaction was signed with. - * @return Transaction parsed into a struct. - */ - function decompressEIP155Transaction( - bytes memory _transaction, - uint256 _chainId - ) - internal - returns ( - EIP155Transaction memory - ) - { - return EIP155Transaction({ - gasLimit: Lib_BytesUtils.toUint24(_transaction, 0), - gasPrice: uint256(Lib_BytesUtils.toUint24(_transaction, 3)) * 1000000, - nonce: Lib_BytesUtils.toUint24(_transaction, 6), - to: Lib_BytesUtils.toAddress(_transaction, 9), - data: Lib_BytesUtils.slice(_transaction, 29), - chainId: _chainId, - value: 0 - }); - } - - /** - * Encodes an EOA transaction back into the original transaction. - * @param _transaction EIP155transaction to encode. - * @param _isEthSignedMessage Whether or not this was an eth signed message. - * @return Encoded transaction. - */ - function encodeEIP155Transaction( - EIP155Transaction memory _transaction, - bool _isEthSignedMessage - ) - internal - pure - returns ( - bytes memory - ) - { - if (_isEthSignedMessage) { - return abi.encode( - _transaction.nonce, - _transaction.gasLimit, - _transaction.gasPrice, - _transaction.chainId, - _transaction.to, - _transaction.data - ); - } else { - bytes[] memory raw = new bytes[](9); - - raw[0] = Lib_RLPWriter.writeUint(_transaction.nonce); - raw[1] = Lib_RLPWriter.writeUint(_transaction.gasPrice); - raw[2] = Lib_RLPWriter.writeUint(_transaction.gasLimit); - if (_transaction.to == address(0)) { - raw[3] = Lib_RLPWriter.writeBytes(''); - } else { - raw[3] = Lib_RLPWriter.writeAddress(_transaction.to); - } - raw[4] = Lib_RLPWriter.writeUint(0); - raw[5] = Lib_RLPWriter.writeBytes(_transaction.data); - raw[6] = Lib_RLPWriter.writeUint(_transaction.chainId); - raw[7] = Lib_RLPWriter.writeBytes(bytes('')); - raw[8] = Lib_RLPWriter.writeBytes(bytes('')); - - return Lib_RLPWriter.writeList(raw); - } - } - /** * Encodes a standard OVM transaction. * @param _transaction OVM transaction to encode. diff --git a/packages/contracts/contracts/optimistic-ethereum/libraries/rlp/Lib_RLPWriter.sol b/packages/contracts/contracts/optimistic-ethereum/libraries/rlp/Lib_RLPWriter.sol index c4f3e26dc9fc8..694f256cbbc0b 100644 --- a/packages/contracts/contracts/optimistic-ethereum/libraries/rlp/Lib_RLPWriter.sol +++ b/packages/contracts/contracts/optimistic-ethereum/libraries/rlp/Lib_RLPWriter.sol @@ -89,6 +89,23 @@ library Lib_RLPWriter { return writeBytes(abi.encodePacked(_in)); } + /** + * RLP encodes a bytes32 value. + * @param _in The bytes32 to encode. + * @return _out The RLP encoded bytes32 in bytes. + */ + function writeBytes32( + bytes32 _in + ) + internal + pure + returns ( + bytes memory _out + ) + { + return writeBytes(abi.encodePacked(_in)); + } + /** * RLP encodes a uint. * @param _in The uint256 to encode. diff --git a/packages/contracts/contracts/optimistic-ethereum/libraries/utils/Lib_ECDSAUtils.sol b/packages/contracts/contracts/optimistic-ethereum/libraries/utils/Lib_ECDSAUtils.sol deleted file mode 100644 index 9d973758b920c..0000000000000 --- a/packages/contracts/contracts/optimistic-ethereum/libraries/utils/Lib_ECDSAUtils.sol +++ /dev/null @@ -1,98 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity >0.5.0 <0.8.0; - -/** - * @title Lib_ECDSAUtils - */ -library Lib_ECDSAUtils { - - /************************************** - * Internal Functions: ECDSA Recovery * - **************************************/ - - /** - * Recovers a signed address given a message and signature. - * @param _message Message that was originally signed. - * @param _isEthSignedMessage Whether or not the user used the `Ethereum Signed Message` prefix. - * @param _v Signature `v` parameter. - * @param _r Signature `r` parameter. - * @param _s Signature `s` parameter. - * @return _sender Signer address. - */ - function recover( - bytes memory _message, - bool _isEthSignedMessage, - uint8 _v, - bytes32 _r, - bytes32 _s - ) - internal - pure - returns ( - address _sender - ) - { - bytes32 messageHash = getMessageHash(_message, _isEthSignedMessage); - - return ecrecover( - messageHash, - _v + 27, - _r, - _s - ); - } - - function getMessageHash( - bytes memory _message, - bool _isEthSignedMessage - ) - internal - pure - returns (bytes32) { - if (_isEthSignedMessage) { - return getEthSignedMessageHash(_message); - } - return getNativeMessageHash(_message); - } - - - /************************************* - * Private Functions: ECDSA Recovery * - *************************************/ - - /** - * Gets the native message hash (simple keccak256) for a message. - * @param _message Message to hash. - * @return _messageHash Native message hash. - */ - function getNativeMessageHash( - bytes memory _message - ) - private - pure - returns ( - bytes32 _messageHash - ) - { - return keccak256(_message); - } - - /** - * Gets the hash of a message with the `Ethereum Signed Message` prefix. - * @param _message Message to hash. - * @return _messageHash Prefixed message hash. - */ - function getEthSignedMessageHash( - bytes memory _message - ) - private - pure - returns ( - bytes32 _messageHash - ) - { - bytes memory prefix = "\x19Ethereum Signed Message:\n32"; - bytes32 messageHash = keccak256(_message); - return keccak256(abi.encodePacked(prefix, messageHash)); - } -} \ No newline at end of file diff --git a/packages/contracts/contracts/optimistic-ethereum/libraries/wrappers/Lib_ExecutionManagerWrapper.sol b/packages/contracts/contracts/optimistic-ethereum/libraries/wrappers/Lib_ExecutionManagerWrapper.sol index 4ac7b377b7e9b..80fa0a86d8513 100644 --- a/packages/contracts/contracts/optimistic-ethereum/libraries/wrappers/Lib_ExecutionManagerWrapper.sol +++ b/packages/contracts/contracts/optimistic-ethereum/libraries/wrappers/Lib_ExecutionManagerWrapper.sol @@ -118,6 +118,25 @@ library Lib_ExecutionManagerWrapper { return abi.decode(returndata, (address)); } + /** + * Calls the ovmCHAINID opcode. + * @return Chain ID of the current network. + */ + function ovmCHAINID() + internal + returns ( + uint256 + ) + { + bytes memory returndata = _safeExecutionManagerInteraction( + abi.encodeWithSignature( + "ovmCHAINID()" + ) + ); + + return abi.decode(returndata, (uint256)); + } + /********************* * Private Functions * diff --git a/packages/contracts/contracts/test-libraries/codec/TestLib_EIP155Tx.sol b/packages/contracts/contracts/test-libraries/codec/TestLib_EIP155Tx.sol new file mode 100644 index 0000000000000..6019b8695f8c5 --- /dev/null +++ b/packages/contracts/contracts/test-libraries/codec/TestLib_EIP155Tx.sol @@ -0,0 +1,71 @@ +// SPDX-License-Identifier: MIT +pragma solidity >0.5.0 <0.8.0; +pragma experimental ABIEncoderV2; + +/* Library Imports */ +import { Lib_EIP155Tx } from "../../optimistic-ethereum/libraries/codec/Lib_EIP155Tx.sol"; + +/** + * @title TestLib_EIP155Tx + */ +contract TestLib_EIP155Tx { + function decode( + bytes memory _encoded, + uint256 _chainId + ) + public + pure + returns ( + Lib_EIP155Tx.EIP155Tx memory + ) + { + return Lib_EIP155Tx.decode( + _encoded, + _chainId + ); + } + + function encode( + Lib_EIP155Tx.EIP155Tx memory _transaction, + bool _includeSignature + ) + public + pure + returns ( + bytes memory + ) + { + return Lib_EIP155Tx.encode( + _transaction, + _includeSignature + ); + } + + function hash( + Lib_EIP155Tx.EIP155Tx memory _transaction + ) + public + pure + returns ( + bytes32 + ) + { + return Lib_EIP155Tx.hash( + _transaction + ); + } + + function sender( + Lib_EIP155Tx.EIP155Tx memory _transaction + ) + public + pure + returns ( + address + ) + { + return Lib_EIP155Tx.sender( + _transaction + ); + } +} diff --git a/packages/contracts/contracts/test-libraries/codec/TestLib_OVMCodec.sol b/packages/contracts/contracts/test-libraries/codec/TestLib_OVMCodec.sol index d162c1216e0e0..04c4e5879ca5d 100644 --- a/packages/contracts/contracts/test-libraries/codec/TestLib_OVMCodec.sol +++ b/packages/contracts/contracts/test-libraries/codec/TestLib_OVMCodec.sol @@ -9,20 +9,6 @@ import { Lib_OVMCodec } from "../../optimistic-ethereum/libraries/codec/Lib_OVMC * @title TestLib_OVMCodec */ contract TestLib_OVMCodec { - - function decodeEIP155Transaction( - bytes memory _transaction, - bool _isEthSignedMessage - ) - public - pure - returns ( - Lib_OVMCodec.EIP155Transaction memory _decoded - ) - { - return Lib_OVMCodec.decodeEIP155Transaction(_transaction, _isEthSignedMessage); - } - function encodeTransaction( Lib_OVMCodec.Transaction memory _transaction ) @@ -46,19 +32,4 @@ contract TestLib_OVMCodec { { return Lib_OVMCodec.hashTransaction(_transaction); } - - function decompressEIP155Transaction( - bytes memory _transaction, - uint256 _chainId - ) - public - returns ( - Lib_OVMCodec.EIP155Transaction memory _decompressed - ) - { - return Lib_OVMCodec.decompressEIP155Transaction( - _transaction, - _chainId - ); - } } diff --git a/packages/contracts/contracts/test-libraries/utils/TestLib_ECDSAUtils.sol b/packages/contracts/contracts/test-libraries/utils/TestLib_ECDSAUtils.sol deleted file mode 100644 index 4b66bf7f0ec8e..0000000000000 --- a/packages/contracts/contracts/test-libraries/utils/TestLib_ECDSAUtils.sol +++ /dev/null @@ -1,33 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity >0.5.0 <0.8.0; - -/* Library Imports */ -import { Lib_ECDSAUtils } from "../../optimistic-ethereum/libraries/utils/Lib_ECDSAUtils.sol"; - -/** - * @title TestLib_ECDSAUtils - */ -contract TestLib_ECDSAUtils { - - function recover( - bytes memory _message, - bool _isEthSignedMessage, - uint8 _v, - bytes32 _r, - bytes32 _s - ) - public - pure - returns ( - address _sender - ) - { - return Lib_ECDSAUtils.recover( - _message, - _isEthSignedMessage, - _v, - _r, - _s - ); - } -} diff --git a/packages/contracts/deployments/README.md b/packages/contracts/deployments/README.md index d7916ccf4249f..616ac2fcacb8a 100644 --- a/packages/contracts/deployments/README.md +++ b/packages/contracts/deployments/README.md @@ -49,6 +49,7 @@ Network : __mainnet (chain id: 1)__ |Proxy__OVM_L1ETHGateway|[0xF20C38fCdDF0C790319Fd7431d17ea0c2bC9959c](https://etherscan.io/address/0xF20C38fCdDF0C790319Fd7431d17ea0c2bC9959c)| |mockOVM_BondManager|[0x99EDa8472E93Aa28E5470eEDEc6e32081E14DaFC](https://etherscan.io/address/0x99EDa8472E93Aa28E5470eEDEc6e32081E14DaFC)| --- + ## KOVAN Network : __kovan (chain id: 42)__ @@ -72,4 +73,3 @@ Network : __kovan (chain id: 42)__ |Proxy__OVM_L1CrossDomainMessenger|[0x48062eD9b6488EC41c4CfbF2f568D7773819d8C9](https://kovan.etherscan.io/address/0x48062eD9b6488EC41c4CfbF2f568D7773819d8C9)| |Proxy__OVM_L1ETHGateway|[0xf3902e50dA095bD2e954AB320E8eafDA6152dFDa](https://kovan.etherscan.io/address/0xf3902e50dA095bD2e954AB320E8eafDA6152dFDa)| |mockOVM_BondManager|[0x77e244ec49014cFb9c4572453568eCC3AbB70A2d](https://kovan.etherscan.io/address/0x77e244ec49014cFb9c4572453568eCC3AbB70A2d)| ---- diff --git a/packages/contracts/deployments/goerli-v3/.chainId b/packages/contracts/deployments/goerli-v3/.chainId new file mode 100644 index 0000000000000..7813681f5b41c --- /dev/null +++ b/packages/contracts/deployments/goerli-v3/.chainId @@ -0,0 +1 @@ +5 \ No newline at end of file diff --git a/packages/contracts/deployments/goerli-v3/Lib_AddressManager.json b/packages/contracts/deployments/goerli-v3/Lib_AddressManager.json new file mode 100644 index 0000000000000..dcffd711c9def --- /dev/null +++ b/packages/contracts/deployments/goerli-v3/Lib_AddressManager.json @@ -0,0 +1,230 @@ +{ + "address": "0xE3d08F0D900A2D53cB794cf82d7127764BcC3092", + "abi": [ + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "string", + "name": "_name", + "type": "string" + }, + { + "indexed": false, + "internalType": "address", + "name": "_newAddress", + "type": "address" + } + ], + "name": "AddressSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "_name", + "type": "string" + } + ], + "name": "getAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "_name", + "type": "string" + }, + { + "internalType": "address", + "name": "_address", + "type": "address" + } + ], + "name": "setAddress", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "transactionHash": "0x8449a49f743929a260b94925095e1a7a33d42a5a58a92910e6ac9aa7b309ec67", + "receipt": { + "to": null, + "from": "0x4107438C1b1579f258AF9d1AC06194C4a0F55040", + "contractAddress": "0xE3d08F0D900A2D53cB794cf82d7127764BcC3092", + "transactionIndex": 14, + "gasUsed": "427277", + "logsBloom": "0x00000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000010000000000000000000000000002000000000000000000000000000001000000000100000000000000000000000000020000000000000000000800000000000000000000000000000000400000000000000000000000000100000000000000000000000000000000000000000000000000000000000010000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0x8afc36c046678b1417a5f68af6d0c5ea406e27e7d485ebfd00a47420d00ab9fe", + "transactionHash": "0x8449a49f743929a260b94925095e1a7a33d42a5a58a92910e6ac9aa7b309ec67", + "logs": [ + { + "transactionIndex": 14, + "blockNumber": 4694083, + "transactionHash": "0x8449a49f743929a260b94925095e1a7a33d42a5a58a92910e6ac9aa7b309ec67", + "address": "0xE3d08F0D900A2D53cB794cf82d7127764BcC3092", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000004107438c1b1579f258af9d1ac06194c4a0f55040" + ], + "data": "0x", + "logIndex": 19, + "blockHash": "0x8afc36c046678b1417a5f68af6d0c5ea406e27e7d485ebfd00a47420d00ab9fe" + } + ], + "blockNumber": 4694083, + "cumulativeGasUsed": "1932419", + "status": 1, + "byzantium": true + }, + "args": [], + "solcInputHash": "dde656dd41f49cad9eac9bc7065fd6a7", + "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_newAddress\",\"type\":\"address\"}],\"name\":\"AddressSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"getAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"_address\",\"type\":\"address\"}],\"name\":\"setAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"getAddress(string)\":{\"params\":{\"_name\":\"Name to retrieve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner.\"},\"setAddress(string,address)\":{\"params\":{\"_address\":\"Address to associate with the name.\",\"_name\":\"String name to associate an address with.\"}},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"}},\"title\":\"Lib_AddressManager\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"getAddress(string)\":{\"notice\":\"Retrieves the address associated with a given name.\"},\"setAddress(string,address)\":{\"notice\":\"Changes the address associated with a particular name.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":\"Lib_AddressManager\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor () internal {\\n address msgSender = _msgSender();\\n _owner = msgSender;\\n emit OwnershipTransferred(address(0), msgSender);\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n emit OwnershipTransferred(_owner, address(0));\\n _owner = address(0);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n emit OwnershipTransferred(_owner, newOwner);\\n _owner = newOwner;\\n }\\n}\\n\",\"keccak256\":\"0x15e2d5bd4c28a88548074c54d220e8086f638a71ed07e6b3ba5a70066fcf458d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with GSN meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address payable) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes memory) {\\n this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x8d3cb350f04ff49cfb10aef08d87f19dcbaecc8027b0bed12f3275cd12f38cf0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n public\\n onlyOwner\\n {\\n addresses[_getNameHash(_name)] = _address;\\n\\n emit AddressSet(\\n _name,\\n _address\\n );\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0x2ce671a0e004df88b136bea5a3c59d0732cea8887c8496da1d509e0200b03d7d\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x608060405234801561001057600080fd5b50600061001b61006a565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35061006e565b3390565b6106508061007d6000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c8063715018a61461005c5780638da5cb5b146100665780639b2ea4bd1461008a578063bf40fac11461013b578063f2fde38b146101e1575b600080fd5b610064610207565b005b61006e6102c5565b604080516001600160a01b039092168252519081900360200190f35b610064600480360360408110156100a057600080fd5b8101906020810181356401000000008111156100bb57600080fd5b8201836020820111156100cd57600080fd5b803590602001918460018302840111640100000000831117156100ef57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550505090356001600160a01b031691506102d49050565b61006e6004803603602081101561015157600080fd5b81019060208101813564010000000081111561016c57600080fd5b82018360208201111561017e57600080fd5b803590602001918460018302840111640100000000831117156101a057600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610436945050505050565b610064600480360360208110156101f757600080fd5b50356001600160a01b0316610465565b61020f610579565b6001600160a01b03166102206102c5565b6001600160a01b03161461027b576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b031690565b6102dc610579565b6001600160a01b03166102ed6102c5565b6001600160a01b031614610348576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b80600160006103568561057d565b815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b031602179055507f188466739ff00cc68bfb2367d23ae4b855264264fe1624caa8884399af23454c82826040518080602001836001600160a01b03168152602001828103825284818151815260200191508051906020019080838360005b838110156103f75781810151838201526020016103df565b50505050905090810190601f1680156104245780820380516001836020036101000a031916815260200191505b50935050505060405180910390a15050565b6000600160006104458461057d565b81526020810191909152604001600020546001600160a01b031692915050565b61046d610579565b6001600160a01b031661047e6102c5565b6001600160a01b0316146104d9576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b03811661051e5760405162461bcd60e51b81526004018080602001828103825260268152602001806105f56026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b3390565b6000816040516020018082805190602001908083835b602083106105b25780518252601f199092019160209182019101610593565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120905091905056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373a26469706673582212209107a301dfba06b8649cc1baf4f5d6df1fb45110fdd8dc25d143490e81f3587e64736f6c63430007060033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100575760003560e01c8063715018a61461005c5780638da5cb5b146100665780639b2ea4bd1461008a578063bf40fac11461013b578063f2fde38b146101e1575b600080fd5b610064610207565b005b61006e6102c5565b604080516001600160a01b039092168252519081900360200190f35b610064600480360360408110156100a057600080fd5b8101906020810181356401000000008111156100bb57600080fd5b8201836020820111156100cd57600080fd5b803590602001918460018302840111640100000000831117156100ef57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550505090356001600160a01b031691506102d49050565b61006e6004803603602081101561015157600080fd5b81019060208101813564010000000081111561016c57600080fd5b82018360208201111561017e57600080fd5b803590602001918460018302840111640100000000831117156101a057600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610436945050505050565b610064600480360360208110156101f757600080fd5b50356001600160a01b0316610465565b61020f610579565b6001600160a01b03166102206102c5565b6001600160a01b03161461027b576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b031690565b6102dc610579565b6001600160a01b03166102ed6102c5565b6001600160a01b031614610348576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b80600160006103568561057d565b815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b031602179055507f188466739ff00cc68bfb2367d23ae4b855264264fe1624caa8884399af23454c82826040518080602001836001600160a01b03168152602001828103825284818151815260200191508051906020019080838360005b838110156103f75781810151838201526020016103df565b50505050905090810190601f1680156104245780820380516001836020036101000a031916815260200191505b50935050505060405180910390a15050565b6000600160006104458461057d565b81526020810191909152604001600020546001600160a01b031692915050565b61046d610579565b6001600160a01b031661047e6102c5565b6001600160a01b0316146104d9576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b03811661051e5760405162461bcd60e51b81526004018080602001828103825260268152602001806105f56026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b3390565b6000816040516020018082805190602001908083835b602083106105b25780518252601f199092019160209182019101610593565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120905091905056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373a26469706673582212209107a301dfba06b8649cc1baf4f5d6df1fb45110fdd8dc25d143490e81f3587e64736f6c63430007060033", + "devdoc": { + "kind": "dev", + "methods": { + "getAddress(string)": { + "params": { + "_name": "Name to retrieve an address for." + }, + "returns": { + "_0": "Address associated with the given name." + } + }, + "owner()": { + "details": "Returns the address of the current owner." + }, + "renounceOwnership()": { + "details": "Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner." + }, + "setAddress(string,address)": { + "params": { + "_address": "Address to associate with the name.", + "_name": "String name to associate an address with." + } + }, + "transferOwnership(address)": { + "details": "Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner." + } + }, + "title": "Lib_AddressManager", + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": { + "getAddress(string)": { + "notice": "Retrieves the address associated with a given name." + }, + "setAddress(string,address)": { + "notice": "Changes the address associated with a particular name." + } + }, + "version": 1 + }, + "storageLayout": { + "storage": [ + { + "astId": 7, + "contract": "contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol:Lib_AddressManager", + "label": "_owner", + "offset": 0, + "slot": "0", + "type": "t_address" + }, + { + "astId": 11992, + "contract": "contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol:Lib_AddressManager", + "label": "addresses", + "offset": 0, + "slot": "1", + "type": "t_mapping(t_bytes32,t_address)" + } + ], + "types": { + "t_address": { + "encoding": "inplace", + "label": "address", + "numberOfBytes": "20" + }, + "t_bytes32": { + "encoding": "inplace", + "label": "bytes32", + "numberOfBytes": "32" + }, + "t_mapping(t_bytes32,t_address)": { + "encoding": "mapping", + "key": "t_bytes32", + "label": "mapping(bytes32 => address)", + "numberOfBytes": "32", + "value": "t_address" + } + } + } +} \ No newline at end of file diff --git a/packages/contracts/deployments/goerli-v3/OVM_CanonicalTransactionChain.json b/packages/contracts/deployments/goerli-v3/OVM_CanonicalTransactionChain.json new file mode 100644 index 0000000000000..281829c73d047 --- /dev/null +++ b/packages/contracts/deployments/goerli-v3/OVM_CanonicalTransactionChain.json @@ -0,0 +1,819 @@ +{ + "address": "0x266534680e632Ce9425d8E5a991C43B3531C7818", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_libAddressManager", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_forceInclusionPeriodSeconds", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_forceInclusionPeriodBlocks", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_maxTransactionGasLimit", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "_startingQueueIndex", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_numQueueElements", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_totalElements", + "type": "uint256" + } + ], + "name": "QueueBatchAppended", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "_startingQueueIndex", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_numQueueElements", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_totalElements", + "type": "uint256" + } + ], + "name": "SequencerBatchAppended", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "_batchIndex", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "_batchRoot", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_batchSize", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_prevTotalElements", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "_extraData", + "type": "bytes" + } + ], + "name": "TransactionBatchAppended", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "_l1TxOrigin", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "_target", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_gasLimit", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "_data", + "type": "bytes" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_queueIndex", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_timestamp", + "type": "uint256" + } + ], + "name": "TransactionEnqueued", + "type": "event" + }, + { + "inputs": [], + "name": "L2_GAS_DISCOUNT_DIVISOR", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MAX_ROLLUP_TX_SIZE", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MIN_ROLLUP_TX_GAS", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "appendQueueBatch", + "outputs": [], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [], + "name": "appendSequencerBatch", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "batches", + "outputs": [ + { + "internalType": "contract iOVM_ChainStorageContainer", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_target", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_gasLimit", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "_data", + "type": "bytes" + } + ], + "name": "enqueue", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "forceInclusionPeriodBlocks", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "forceInclusionPeriodSeconds", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getLastBlockNumber", + "outputs": [ + { + "internalType": "uint40", + "name": "", + "type": "uint40" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getLastTimestamp", + "outputs": [ + { + "internalType": "uint40", + "name": "", + "type": "uint40" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getNextQueueIndex", + "outputs": [ + { + "internalType": "uint40", + "name": "", + "type": "uint40" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getNumPendingQueueElements", + "outputs": [ + { + "internalType": "uint40", + "name": "", + "type": "uint40" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_index", + "type": "uint256" + } + ], + "name": "getQueueElement", + "outputs": [ + { + "components": [ + { + "internalType": "bytes32", + "name": "transactionHash", + "type": "bytes32" + }, + { + "internalType": "uint40", + "name": "timestamp", + "type": "uint40" + }, + { + "internalType": "uint40", + "name": "blockNumber", + "type": "uint40" + } + ], + "internalType": "struct Lib_OVMCodec.QueueElement", + "name": "_element", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getQueueLength", + "outputs": [ + { + "internalType": "uint40", + "name": "", + "type": "uint40" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getTotalBatches", + "outputs": [ + { + "internalType": "uint256", + "name": "_totalBatches", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getTotalElements", + "outputs": [ + { + "internalType": "uint256", + "name": "_totalElements", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "libAddressManager", + "outputs": [ + { + "internalType": "contract Lib_AddressManager", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "maxTransactionGasLimit", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "queue", + "outputs": [ + { + "internalType": "contract iOVM_ChainStorageContainer", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "_name", + "type": "string" + } + ], + "name": "resolve", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "timestamp", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "blockNumber", + "type": "uint256" + }, + { + "internalType": "enum Lib_OVMCodec.QueueOrigin", + "name": "l1QueueOrigin", + "type": "uint8" + }, + { + "internalType": "address", + "name": "l1TxOrigin", + "type": "address" + }, + { + "internalType": "address", + "name": "entrypoint", + "type": "address" + }, + { + "internalType": "uint256", + "name": "gasLimit", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "internalType": "struct Lib_OVMCodec.Transaction", + "name": "_transaction", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "bool", + "name": "isSequenced", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "queueIndex", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "timestamp", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "blockNumber", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "txData", + "type": "bytes" + } + ], + "internalType": "struct Lib_OVMCodec.TransactionChainElement", + "name": "_txChainElement", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "batchIndex", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "batchRoot", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "batchSize", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "prevTotalElements", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "extraData", + "type": "bytes" + } + ], + "internalType": "struct Lib_OVMCodec.ChainBatchHeader", + "name": "_batchHeader", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + }, + { + "internalType": "bytes32[]", + "name": "siblings", + "type": "bytes32[]" + } + ], + "internalType": "struct Lib_OVMCodec.ChainInclusionProof", + "name": "_inclusionProof", + "type": "tuple" + } + ], + "name": "verifyTransaction", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "transactionHash": "0xa941e4eaa556a63515c59c7d42dd116f55905a41650c676535d6c70bd1d4f891", + "receipt": { + "to": null, + "from": "0x4107438C1b1579f258AF9d1AC06194C4a0F55040", + "contractAddress": "0x266534680e632Ce9425d8E5a991C43B3531C7818", + "transactionIndex": 2, + "gasUsed": "2831002", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0xd7a64d9499678352843045d842ca0ed199d25bcb576e34c7fd3c3cf8989ce836", + "transactionHash": "0xa941e4eaa556a63515c59c7d42dd116f55905a41650c676535d6c70bd1d4f891", + "logs": [], + "blockNumber": 4694099, + "cumulativeGasUsed": "3503418", + "status": 1, + "byzantium": true + }, + "args": [ + "0xE3d08F0D900A2D53cB794cf82d7127764BcC3092", + 2592000, + 172800, + 9000000 + ], + "solcInputHash": "dde656dd41f49cad9eac9bc7065fd6a7", + "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_forceInclusionPeriodSeconds\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_forceInclusionPeriodBlocks\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_maxTransactionGasLimit\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_startingQueueIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_numQueueElements\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_totalElements\",\"type\":\"uint256\"}],\"name\":\"QueueBatchAppended\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_startingQueueIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_numQueueElements\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_totalElements\",\"type\":\"uint256\"}],\"name\":\"SequencerBatchAppended\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_batchIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"_batchRoot\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_batchSize\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_prevTotalElements\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"_extraData\",\"type\":\"bytes\"}],\"name\":\"TransactionBatchAppended\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_l1TxOrigin\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_queueIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_timestamp\",\"type\":\"uint256\"}],\"name\":\"TransactionEnqueued\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"L2_GAS_DISCOUNT_DIVISOR\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAX_ROLLUP_TX_SIZE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MIN_ROLLUP_TX_GAS\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"appendQueueBatch\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"appendSequencerBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"batches\",\"outputs\":[{\"internalType\":\"contract iOVM_ChainStorageContainer\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"enqueue\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"forceInclusionPeriodBlocks\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"forceInclusionPeriodSeconds\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLastBlockNumber\",\"outputs\":[{\"internalType\":\"uint40\",\"name\":\"\",\"type\":\"uint40\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLastTimestamp\",\"outputs\":[{\"internalType\":\"uint40\",\"name\":\"\",\"type\":\"uint40\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getNextQueueIndex\",\"outputs\":[{\"internalType\":\"uint40\",\"name\":\"\",\"type\":\"uint40\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getNumPendingQueueElements\",\"outputs\":[{\"internalType\":\"uint40\",\"name\":\"\",\"type\":\"uint40\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"getQueueElement\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"transactionHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint40\",\"name\":\"timestamp\",\"type\":\"uint40\"},{\"internalType\":\"uint40\",\"name\":\"blockNumber\",\"type\":\"uint40\"}],\"internalType\":\"struct Lib_OVMCodec.QueueElement\",\"name\":\"_element\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getQueueLength\",\"outputs\":[{\"internalType\":\"uint40\",\"name\":\"\",\"type\":\"uint40\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTotalBatches\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_totalBatches\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTotalElements\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_totalElements\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maxTransactionGasLimit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"queue\",\"outputs\":[{\"internalType\":\"contract iOVM_ChainStorageContainer\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"enum Lib_OVMCodec.QueueOrigin\",\"name\":\"l1QueueOrigin\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"l1TxOrigin\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"entrypoint\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.Transaction\",\"name\":\"_transaction\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isSequenced\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"queueIndex\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"txData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.TransactionChainElement\",\"name\":\"_txChainElement\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"_batchHeader\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"siblings\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct Lib_OVMCodec.ChainInclusionProof\",\"name\":\"_inclusionProof\",\"type\":\"tuple\"}],\"name\":\"verifyTransaction\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The Canonical Transaction Chain (CTC) contract is an append-only log of transactions which must be applied to the rollup state. It defines the ordering of rollup transactions by writing them to the 'CTC:batches' instance of the Chain Storage Container. The CTC also allows any account to 'enqueue' an L2 transaction, which will require that the Sequencer will eventually append it to the rollup state. If the Sequencer does not include an enqueued transaction within the 'force inclusion period', then any account may force it to be included by calling appendQueueBatch(). Compiler used: solc Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"appendSequencerBatch()\":{\"details\":\"This function uses a custom encoding scheme for efficiency reasons. .param _shouldStartAtElement Specific batch we expect to start appending to. .param _totalElementsToAppend Total number of batch elements we expect to append. .param _contexts Array of batch contexts. .param _transactionDataFields Array of raw transaction data.\"},\"batches()\":{\"returns\":{\"_0\":\"Reference to the batch storage container.\"}},\"enqueue(address,uint256,bytes)\":{\"params\":{\"_data\":\"Transaction data.\",\"_gasLimit\":\"Gas limit for the enqueued L2 transaction.\",\"_target\":\"Target L2 contract to send the transaction to.\"}},\"getLastBlockNumber()\":{\"returns\":{\"_0\":\"Blocknumber for the last transaction.\"}},\"getLastTimestamp()\":{\"returns\":{\"_0\":\"Timestamp for the last transaction.\"}},\"getNextQueueIndex()\":{\"returns\":{\"_0\":\"Index for the next queue element.\"}},\"getNumPendingQueueElements()\":{\"returns\":{\"_0\":\"Number of pending queue elements.\"}},\"getQueueElement(uint256)\":{\"params\":{\"_index\":\"Index of the queue element to access.\"},\"returns\":{\"_element\":\"Queue element at the given index.\"}},\"getQueueLength()\":{\"returns\":{\"_0\":\"Length of the queue.\"}},\"getTotalBatches()\":{\"returns\":{\"_totalBatches\":\"Total submitted batches.\"}},\"getTotalElements()\":{\"returns\":{\"_totalElements\":\"Total submitted elements.\"}},\"queue()\":{\"returns\":{\"_0\":\"Reference to the queue storage container.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}},\"verifyTransaction((uint256,uint256,uint8,address,address,uint256,bytes),(bool,uint256,uint256,uint256,bytes),(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))\":{\"params\":{\"_batchHeader\":\"Header of the batch the transaction was included in.\",\"_inclusionProof\":\"Inclusion proof for the provided transaction chain element.\",\"_transaction\":\"Transaction to verify.\",\"_txChainElement\":\"Transaction chain element corresponding to the transaction.\"},\"returns\":{\"_0\":\"True if the transaction exists in the CTC, false if not.\"}}},\"title\":\"OVM_CanonicalTransactionChain\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"appendQueueBatch(uint256)\":{\"notice\":\"Appends a given number of queued transactions as a single batch. param _numQueuedTransactions Number of transactions to append.\"},\"appendSequencerBatch()\":{\"notice\":\"Allows the sequencer to append a batch of transactions.\"},\"batches()\":{\"notice\":\"Accesses the batch storage container.\"},\"enqueue(address,uint256,bytes)\":{\"notice\":\"Adds a transaction to the queue.\"},\"getLastBlockNumber()\":{\"notice\":\"Returns the blocknumber of the last transaction.\"},\"getLastTimestamp()\":{\"notice\":\"Returns the timestamp of the last transaction.\"},\"getNextQueueIndex()\":{\"notice\":\"Returns the index of the next element to be enqueued.\"},\"getNumPendingQueueElements()\":{\"notice\":\"Get the number of queue elements which have not yet been included.\"},\"getQueueElement(uint256)\":{\"notice\":\"Gets the queue element at a particular index.\"},\"getQueueLength()\":{\"notice\":\"Retrieves the length of the queue, including both pending and canonical transactions.\"},\"getTotalBatches()\":{\"notice\":\"Retrieves the total number of batches submitted.\"},\"getTotalElements()\":{\"notice\":\"Retrieves the total number of elements submitted.\"},\"queue()\":{\"notice\":\"Accesses the queue storage container.\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"},\"verifyTransaction((uint256,uint256,uint8,address,address,uint256,bytes),(bool,uint256,uint256,uint256,bytes),(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))\":{\"notice\":\"Verifies whether a transaction is included in the chain.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/OVM/chain/OVM_CanonicalTransactionChain.sol\":\"OVM_CanonicalTransactionChain\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor () internal {\\n address msgSender = _msgSender();\\n _owner = msgSender;\\n emit OwnershipTransferred(address(0), msgSender);\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n emit OwnershipTransferred(_owner, address(0));\\n _owner = address(0);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n emit OwnershipTransferred(_owner, newOwner);\\n _owner = newOwner;\\n }\\n}\\n\",\"keccak256\":\"0x15e2d5bd4c28a88548074c54d220e8086f638a71ed07e6b3ba5a70066fcf458d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a >= b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two numbers.\\n */\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two numbers. The result is rounded towards\\n * zero.\\n */\\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b) / 2 can overflow, so we distribute\\n return (a / 2) + (b / 2) + ((a % 2 + b % 2) / 2);\\n }\\n}\\n\",\"keccak256\":\"0x363bd3b45201f07c9b71c2edc96533468cf14a3d029fabd82fddceb1eb3ebd9c\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with GSN meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address payable) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes memory) {\\n this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x8d3cb350f04ff49cfb10aef08d87f19dcbaecc8027b0bed12f3275cd12f38cf0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/chain/OVM_CanonicalTransactionChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// @unsupported: ovm\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\nimport { Lib_MerkleTree } from \\\"../../libraries/utils/Lib_MerkleTree.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_CanonicalTransactionChain } from \\\"../../iOVM/chain/iOVM_CanonicalTransactionChain.sol\\\";\\nimport { iOVM_ChainStorageContainer } from \\\"../../iOVM/chain/iOVM_ChainStorageContainer.sol\\\";\\n\\n/* Contract Imports */\\nimport { OVM_ExecutionManager } from \\\"../execution/OVM_ExecutionManager.sol\\\";\\n\\n/* External Imports */\\nimport { Math } from \\\"@openzeppelin/contracts/math/Math.sol\\\";\\n\\n/**\\n * @title OVM_CanonicalTransactionChain\\n * @dev The Canonical Transaction Chain (CTC) contract is an append-only log of transactions\\n * which must be applied to the rollup state. It defines the ordering of rollup transactions by\\n * writing them to the 'CTC:batches' instance of the Chain Storage Container.\\n * The CTC also allows any account to 'enqueue' an L2 transaction, which will require that the Sequencer\\n * will eventually append it to the rollup state.\\n * If the Sequencer does not include an enqueued transaction within the 'force inclusion period',\\n * then any account may force it to be included by calling appendQueueBatch().\\n *\\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract OVM_CanonicalTransactionChain is iOVM_CanonicalTransactionChain, Lib_AddressResolver {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n // L2 tx gas-related\\n uint256 constant public MIN_ROLLUP_TX_GAS = 100000;\\n uint256 constant public MAX_ROLLUP_TX_SIZE = 50000;\\n uint256 constant public L2_GAS_DISCOUNT_DIVISOR = 32;\\n\\n // Encoding-related (all in bytes)\\n uint256 constant internal BATCH_CONTEXT_SIZE = 16;\\n uint256 constant internal BATCH_CONTEXT_LENGTH_POS = 12;\\n uint256 constant internal BATCH_CONTEXT_START_POS = 15;\\n uint256 constant internal TX_DATA_HEADER_SIZE = 3;\\n uint256 constant internal BYTES_TILL_TX_DATA = 65;\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n uint256 public forceInclusionPeriodSeconds;\\n uint256 public forceInclusionPeriodBlocks;\\n uint256 public maxTransactionGasLimit;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n constructor(\\n address _libAddressManager,\\n uint256 _forceInclusionPeriodSeconds,\\n uint256 _forceInclusionPeriodBlocks,\\n uint256 _maxTransactionGasLimit\\n )\\n Lib_AddressResolver(_libAddressManager)\\n {\\n forceInclusionPeriodSeconds = _forceInclusionPeriodSeconds;\\n forceInclusionPeriodBlocks = _forceInclusionPeriodBlocks;\\n maxTransactionGasLimit = _maxTransactionGasLimit;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Accesses the batch storage container.\\n * @return Reference to the batch storage container.\\n */\\n function batches()\\n override\\n public\\n view\\n returns (\\n iOVM_ChainStorageContainer\\n )\\n {\\n return iOVM_ChainStorageContainer(\\n resolve(\\\"OVM_ChainStorageContainer:CTC:batches\\\")\\n );\\n }\\n\\n /**\\n * Accesses the queue storage container.\\n * @return Reference to the queue storage container.\\n */\\n function queue()\\n override\\n public\\n view\\n returns (\\n iOVM_ChainStorageContainer\\n )\\n {\\n return iOVM_ChainStorageContainer(\\n resolve(\\\"OVM_ChainStorageContainer:CTC:queue\\\")\\n );\\n }\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements()\\n override\\n public\\n view\\n returns (\\n uint256 _totalElements\\n )\\n {\\n (uint40 totalElements,,,) = _getBatchExtraData();\\n return uint256(totalElements);\\n }\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches()\\n override\\n public\\n view\\n returns (\\n uint256 _totalBatches\\n )\\n {\\n return batches().length();\\n }\\n\\n /**\\n * Returns the index of the next element to be enqueued.\\n * @return Index for the next queue element.\\n */\\n function getNextQueueIndex()\\n override\\n public\\n view\\n returns (\\n uint40\\n )\\n {\\n (,uint40 nextQueueIndex,,) = _getBatchExtraData();\\n return nextQueueIndex;\\n }\\n\\n /**\\n * Returns the timestamp of the last transaction.\\n * @return Timestamp for the last transaction.\\n */\\n function getLastTimestamp()\\n override\\n public\\n view\\n returns (\\n uint40\\n )\\n {\\n (,,uint40 lastTimestamp,) = _getBatchExtraData();\\n return lastTimestamp;\\n }\\n\\n /**\\n * Returns the blocknumber of the last transaction.\\n * @return Blocknumber for the last transaction.\\n */\\n function getLastBlockNumber()\\n override\\n public\\n view\\n returns (\\n uint40\\n )\\n {\\n (,,,uint40 lastBlockNumber) = _getBatchExtraData();\\n return lastBlockNumber;\\n }\\n\\n /**\\n * Gets the queue element at a particular index.\\n * @param _index Index of the queue element to access.\\n * @return _element Queue element at the given index.\\n */\\n function getQueueElement(\\n uint256 _index\\n )\\n override\\n public\\n view\\n returns (\\n Lib_OVMCodec.QueueElement memory _element\\n )\\n {\\n return _getQueueElement(\\n _index,\\n queue()\\n );\\n }\\n\\n /**\\n * Get the number of queue elements which have not yet been included.\\n * @return Number of pending queue elements.\\n */\\n function getNumPendingQueueElements()\\n override\\n public\\n view\\n returns (\\n uint40\\n )\\n {\\n return getQueueLength() - getNextQueueIndex();\\n }\\n\\n /**\\n * Retrieves the length of the queue, including\\n * both pending and canonical transactions.\\n * @return Length of the queue.\\n */\\n function getQueueLength()\\n override\\n public\\n view\\n returns (\\n uint40\\n )\\n {\\n return _getQueueLength(\\n queue()\\n );\\n }\\n\\n /**\\n * Adds a transaction to the queue.\\n * @param _target Target L2 contract to send the transaction to.\\n * @param _gasLimit Gas limit for the enqueued L2 transaction.\\n * @param _data Transaction data.\\n */\\n function enqueue(\\n address _target,\\n uint256 _gasLimit,\\n bytes memory _data\\n )\\n override\\n public\\n {\\n require(\\n _data.length <= MAX_ROLLUP_TX_SIZE,\\n \\\"Transaction data size exceeds maximum for rollup transaction.\\\"\\n );\\n\\n require(\\n _gasLimit <= maxTransactionGasLimit,\\n \\\"Transaction gas limit exceeds maximum for rollup transaction.\\\"\\n );\\n\\n require(\\n _gasLimit >= MIN_ROLLUP_TX_GAS,\\n \\\"Transaction gas limit too low to enqueue.\\\"\\n );\\n\\n // We need to consume some amount of L1 gas in order to rate limit transactions going into\\n // L2. However, L2 is cheaper than L1 so we only need to burn some small proportion of the\\n // provided L1 gas.\\n uint256 gasToConsume = _gasLimit/L2_GAS_DISCOUNT_DIVISOR;\\n uint256 startingGas = gasleft();\\n\\n // Although this check is not necessary (burn below will run out of gas if not true), it\\n // gives the user an explicit reason as to why the enqueue attempt failed.\\n require(\\n startingGas > gasToConsume,\\n \\\"Insufficient gas for L2 rate limiting burn.\\\"\\n );\\n\\n // Here we do some \\\"dumb\\\" work in order to burn gas, although we should probably replace\\n // this with something like minting gas token later on.\\n uint256 i;\\n while(startingGas - gasleft() < gasToConsume) {\\n i++;\\n }\\n\\n bytes32 transactionHash = keccak256(\\n abi.encode(\\n msg.sender,\\n _target,\\n _gasLimit,\\n _data\\n )\\n );\\n\\n bytes32 timestampAndBlockNumber;\\n assembly {\\n timestampAndBlockNumber := timestamp()\\n timestampAndBlockNumber := or(timestampAndBlockNumber, shl(40, number()))\\n }\\n\\n iOVM_ChainStorageContainer queueRef = queue();\\n\\n queueRef.push(transactionHash);\\n queueRef.push(timestampAndBlockNumber);\\n\\n // The underlying queue data structure stores 2 elements\\n // per insertion, so to get the real queue length we need\\n // to divide by 2 and subtract 1.\\n uint256 queueIndex = queueRef.length() / 2 - 1;\\n emit TransactionEnqueued(\\n msg.sender,\\n _target,\\n _gasLimit,\\n _data,\\n queueIndex,\\n block.timestamp\\n );\\n }\\n\\n /**\\n * Appends a given number of queued transactions as a single batch.\\n * param _numQueuedTransactions Number of transactions to append.\\n */\\n function appendQueueBatch(\\n uint256 // _numQueuedTransactions\\n )\\n override\\n public\\n pure\\n {\\n // TEMPORARY: Disable `appendQueueBatch` for minnet\\n revert(\\\"appendQueueBatch is currently disabled.\\\");\\n\\n // _numQueuedTransactions = Math.min(_numQueuedTransactions, getNumPendingQueueElements());\\n // require(\\n // _numQueuedTransactions > 0,\\n // \\\"Must append more than zero transactions.\\\"\\n // );\\n\\n // bytes32[] memory leaves = new bytes32[](_numQueuedTransactions);\\n // uint40 nextQueueIndex = getNextQueueIndex();\\n\\n // for (uint256 i = 0; i < _numQueuedTransactions; i++) {\\n // if (msg.sender != resolve(\\\"OVM_Sequencer\\\")) {\\n // Lib_OVMCodec.QueueElement memory el = getQueueElement(nextQueueIndex);\\n // require(\\n // el.timestamp + forceInclusionPeriodSeconds < block.timestamp,\\n // \\\"Queue transactions cannot be submitted during the sequencer inclusion period.\\\"\\n // );\\n // }\\n // leaves[i] = _getQueueLeafHash(nextQueueIndex);\\n // nextQueueIndex++;\\n // }\\n\\n // Lib_OVMCodec.QueueElement memory lastElement = getQueueElement(nextQueueIndex - 1);\\n\\n // _appendBatch(\\n // Lib_MerkleTree.getMerkleRoot(leaves),\\n // _numQueuedTransactions,\\n // _numQueuedTransactions,\\n // lastElement.timestamp,\\n // lastElement.blockNumber\\n // );\\n\\n // emit QueueBatchAppended(\\n // nextQueueIndex - _numQueuedTransactions,\\n // _numQueuedTransactions,\\n // getTotalElements()\\n // );\\n }\\n\\n /**\\n * Allows the sequencer to append a batch of transactions.\\n * @dev This function uses a custom encoding scheme for efficiency reasons.\\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\\n * .param _contexts Array of batch contexts.\\n * .param _transactionDataFields Array of raw transaction data.\\n */\\n function appendSequencerBatch()\\n override\\n public\\n {\\n uint40 shouldStartAtElement;\\n uint24 totalElementsToAppend;\\n uint24 numContexts;\\n assembly {\\n shouldStartAtElement := shr(216, calldataload(4))\\n totalElementsToAppend := shr(232, calldataload(9))\\n numContexts := shr(232, calldataload(12))\\n }\\n\\n require(\\n shouldStartAtElement == getTotalElements(),\\n \\\"Actual batch start index does not match expected start index.\\\"\\n );\\n\\n require(\\n msg.sender == resolve(\\\"OVM_Sequencer\\\"),\\n \\\"Function can only be called by the Sequencer.\\\"\\n );\\n\\n require(\\n numContexts > 0,\\n \\\"Must provide at least one batch context.\\\"\\n );\\n\\n require(\\n totalElementsToAppend > 0,\\n \\\"Must append at least one element.\\\"\\n );\\n\\n uint40 nextTransactionPtr = uint40(BATCH_CONTEXT_START_POS + BATCH_CONTEXT_SIZE * numContexts);\\n\\n require(\\n msg.data.length >= nextTransactionPtr,\\n \\\"Not enough BatchContexts provided.\\\"\\n );\\n\\n // Take a reference to the queue and its length so we don't have to keep resolving it.\\n // Length isn't going to change during the course of execution, so it's fine to simply\\n // resolve this once at the start. Saves gas.\\n iOVM_ChainStorageContainer queueRef = queue();\\n uint40 queueLength = _getQueueLength(queueRef);\\n\\n // Reserve some memory to save gas on hashing later on. This is a relatively safe estimate\\n // for the average transaction size that will prevent having to resize this chunk of memory\\n // later on. Saves gas.\\n bytes memory hashMemory = new bytes((msg.data.length / totalElementsToAppend) * 2);\\n\\n // Initialize the array of canonical chain leaves that we will append.\\n bytes32[] memory leaves = new bytes32[](totalElementsToAppend);\\n\\n // Each leaf index corresponds to a tx, either sequenced or enqueued.\\n uint32 leafIndex = 0;\\n\\n // Counter for number of sequencer transactions appended so far.\\n uint32 numSequencerTransactions = 0;\\n\\n // We will sequentially append leaves which are pointers to the queue.\\n // The initial queue index is what is currently in storage.\\n uint40 nextQueueIndex = getNextQueueIndex();\\n\\n BatchContext memory curContext;\\n for (uint32 i = 0; i < numContexts; i++) {\\n BatchContext memory nextContext = _getBatchContext(i);\\n\\n if (i == 0) {\\n // Execute a special check for the first batch.\\n _validateFirstBatchContext(nextContext);\\n }\\n\\n // Execute this check on every single batch, including the first one.\\n _validateNextBatchContext(\\n curContext,\\n nextContext,\\n nextQueueIndex,\\n queueRef\\n );\\n\\n // Now we can update our current context.\\n curContext = nextContext;\\n\\n // Process sequencer transactions first.\\n for (uint32 j = 0; j < curContext.numSequencedTransactions; j++) {\\n uint256 txDataLength;\\n assembly {\\n txDataLength := shr(232, calldataload(nextTransactionPtr))\\n }\\n require(\\n txDataLength <= MAX_ROLLUP_TX_SIZE,\\n \\\"Transaction data size exceeds maximum for rollup transaction.\\\"\\n );\\n\\n leaves[leafIndex] = _getSequencerLeafHash(\\n curContext,\\n nextTransactionPtr,\\n txDataLength,\\n hashMemory\\n );\\n\\n nextTransactionPtr += uint40(TX_DATA_HEADER_SIZE + txDataLength);\\n numSequencerTransactions++;\\n leafIndex++;\\n }\\n\\n // Now process any subsequent queue transactions.\\n for (uint32 j = 0; j < curContext.numSubsequentQueueTransactions; j++) {\\n require(\\n nextQueueIndex < queueLength,\\n \\\"Not enough queued transactions to append.\\\"\\n );\\n\\n leaves[leafIndex] = _getQueueLeafHash(nextQueueIndex);\\n nextQueueIndex++;\\n leafIndex++;\\n }\\n }\\n\\n _validateFinalBatchContext(\\n curContext,\\n nextQueueIndex,\\n queueLength,\\n queueRef\\n );\\n\\n require(\\n msg.data.length == nextTransactionPtr,\\n \\\"Not all sequencer transactions were processed.\\\"\\n );\\n\\n require(\\n leafIndex == totalElementsToAppend,\\n \\\"Actual transaction index does not match expected total elements to append.\\\"\\n );\\n\\n // Generate the required metadata that we need to append this batch\\n uint40 numQueuedTransactions = totalElementsToAppend - numSequencerTransactions;\\n uint40 blockTimestamp;\\n uint40 blockNumber;\\n if (curContext.numSubsequentQueueTransactions == 0) {\\n // The last element is a sequencer tx, therefore pull timestamp and block number from the last context.\\n blockTimestamp = uint40(curContext.timestamp);\\n blockNumber = uint40(curContext.blockNumber);\\n } else {\\n // The last element is a queue tx, therefore pull timestamp and block number from the queue element.\\n // curContext.numSubsequentQueueTransactions > 0 which means that we've processed at least one queue element.\\n // We increment nextQueueIndex after processing each queue element,\\n // so the index of the last element we processed is nextQueueIndex - 1.\\n Lib_OVMCodec.QueueElement memory lastElement = _getQueueElement(\\n nextQueueIndex - 1,\\n queueRef\\n );\\n\\n blockTimestamp = lastElement.timestamp;\\n blockNumber = lastElement.blockNumber;\\n }\\n\\n // For efficiency reasons getMerkleRoot modifies the `leaves` argument in place\\n // while calculating the root hash therefore any arguments passed to it must not\\n // be used again afterwards\\n _appendBatch(\\n Lib_MerkleTree.getMerkleRoot(leaves),\\n totalElementsToAppend,\\n numQueuedTransactions,\\n blockTimestamp,\\n blockNumber\\n );\\n\\n emit SequencerBatchAppended(\\n nextQueueIndex - numQueuedTransactions,\\n numQueuedTransactions,\\n getTotalElements()\\n );\\n }\\n\\n /**\\n * Verifies whether a transaction is included in the chain.\\n * @param _transaction Transaction to verify.\\n * @param _txChainElement Transaction chain element corresponding to the transaction.\\n * @param _batchHeader Header of the batch the transaction was included in.\\n * @param _inclusionProof Inclusion proof for the provided transaction chain element.\\n * @return True if the transaction exists in the CTC, false if not.\\n */\\n function verifyTransaction(\\n Lib_OVMCodec.Transaction memory _transaction,\\n Lib_OVMCodec.TransactionChainElement memory _txChainElement,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _inclusionProof\\n )\\n override\\n public\\n view\\n returns (\\n bool\\n )\\n {\\n if (_txChainElement.isSequenced == true) {\\n return _verifySequencerTransaction(\\n _transaction,\\n _txChainElement,\\n _batchHeader,\\n _inclusionProof\\n );\\n } else {\\n return _verifyQueueTransaction(\\n _transaction,\\n _txChainElement.queueIndex,\\n _batchHeader,\\n _inclusionProof\\n );\\n }\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Returns the BatchContext located at a particular index.\\n * @param _index The index of the BatchContext\\n * @return The BatchContext at the specified index.\\n */\\n function _getBatchContext(\\n uint256 _index\\n )\\n internal\\n pure\\n returns (\\n BatchContext memory\\n )\\n {\\n uint256 contextPtr = 15 + _index * BATCH_CONTEXT_SIZE;\\n uint256 numSequencedTransactions;\\n uint256 numSubsequentQueueTransactions;\\n uint256 ctxTimestamp;\\n uint256 ctxBlockNumber;\\n\\n assembly {\\n numSequencedTransactions := shr(232, calldataload(contextPtr))\\n numSubsequentQueueTransactions := shr(232, calldataload(add(contextPtr, 3)))\\n ctxTimestamp := shr(216, calldataload(add(contextPtr, 6)))\\n ctxBlockNumber := shr(216, calldataload(add(contextPtr, 11)))\\n }\\n\\n return BatchContext({\\n numSequencedTransactions: numSequencedTransactions,\\n numSubsequentQueueTransactions: numSubsequentQueueTransactions,\\n timestamp: ctxTimestamp,\\n blockNumber: ctxBlockNumber\\n });\\n }\\n\\n /**\\n * Parses the batch context from the extra data.\\n * @return Total number of elements submitted.\\n * @return Index of the next queue element.\\n */\\n function _getBatchExtraData()\\n internal\\n view\\n returns (\\n uint40,\\n uint40,\\n uint40,\\n uint40\\n )\\n {\\n bytes27 extraData = batches().getGlobalMetadata();\\n\\n uint40 totalElements;\\n uint40 nextQueueIndex;\\n uint40 lastTimestamp;\\n uint40 lastBlockNumber;\\n assembly {\\n extraData := shr(40, extraData)\\n totalElements := and(extraData, 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF)\\n nextQueueIndex := shr(40, and(extraData, 0x00000000000000000000000000000000000000000000FFFFFFFFFF0000000000))\\n lastTimestamp := shr(80, and(extraData, 0x0000000000000000000000000000000000FFFFFFFFFF00000000000000000000))\\n lastBlockNumber := shr(120, and(extraData, 0x000000000000000000000000FFFFFFFFFF000000000000000000000000000000))\\n }\\n\\n return (\\n totalElements,\\n nextQueueIndex,\\n lastTimestamp,\\n lastBlockNumber\\n );\\n }\\n\\n /**\\n * Encodes the batch context for the extra data.\\n * @param _totalElements Total number of elements submitted.\\n * @param _nextQueueIndex Index of the next queue element.\\n * @param _timestamp Timestamp for the last batch.\\n * @param _blockNumber Block number of the last batch.\\n * @return Encoded batch context.\\n */\\n function _makeBatchExtraData(\\n uint40 _totalElements,\\n uint40 _nextQueueIndex,\\n uint40 _timestamp,\\n uint40 _blockNumber\\n )\\n internal\\n pure\\n returns (\\n bytes27\\n )\\n {\\n bytes27 extraData;\\n assembly {\\n extraData := _totalElements\\n extraData := or(extraData, shl(40, _nextQueueIndex))\\n extraData := or(extraData, shl(80, _timestamp))\\n extraData := or(extraData, shl(120, _blockNumber))\\n extraData := shl(40, extraData)\\n }\\n\\n return extraData;\\n }\\n\\n /**\\n * Retrieves the hash of a queue element.\\n * @param _index Index of the queue element to retrieve a hash for.\\n * @return Hash of the queue element.\\n */\\n function _getQueueLeafHash(\\n uint256 _index\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return _hashTransactionChainElement(\\n Lib_OVMCodec.TransactionChainElement({\\n isSequenced: false,\\n queueIndex: _index,\\n timestamp: 0,\\n blockNumber: 0,\\n txData: hex\\\"\\\"\\n })\\n );\\n }\\n\\n /**\\n * Gets the queue element at a particular index.\\n * @param _index Index of the queue element to access.\\n * @return _element Queue element at the given index.\\n */\\n function _getQueueElement(\\n uint256 _index,\\n iOVM_ChainStorageContainer _queueRef\\n )\\n internal\\n view\\n returns (\\n Lib_OVMCodec.QueueElement memory _element\\n )\\n {\\n // The underlying queue data structure stores 2 elements\\n // per insertion, so to get the actual desired queue index\\n // we need to multiply by 2.\\n uint40 trueIndex = uint40(_index * 2);\\n bytes32 transactionHash = _queueRef.get(trueIndex);\\n bytes32 timestampAndBlockNumber = _queueRef.get(trueIndex + 1);\\n\\n uint40 elementTimestamp;\\n uint40 elementBlockNumber;\\n assembly {\\n elementTimestamp := and(timestampAndBlockNumber, 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF)\\n elementBlockNumber := shr(40, and(timestampAndBlockNumber, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000))\\n }\\n\\n return Lib_OVMCodec.QueueElement({\\n transactionHash: transactionHash,\\n timestamp: elementTimestamp,\\n blockNumber: elementBlockNumber\\n });\\n }\\n\\n /**\\n * Retrieves the length of the queue.\\n * @return Length of the queue.\\n */\\n function _getQueueLength(\\n iOVM_ChainStorageContainer _queueRef\\n )\\n internal\\n view\\n returns (\\n uint40\\n )\\n {\\n // The underlying queue data structure stores 2 elements\\n // per insertion, so to get the real queue length we need\\n // to divide by 2.\\n return uint40(_queueRef.length() / 2);\\n }\\n\\n /**\\n * Retrieves the hash of a sequencer element.\\n * @param _context Batch context for the given element.\\n * @param _nextTransactionPtr Pointer to the next transaction in the calldata.\\n * @param _txDataLength Length of the transaction item.\\n * @return Hash of the sequencer element.\\n */\\n function _getSequencerLeafHash(\\n BatchContext memory _context,\\n uint256 _nextTransactionPtr,\\n uint256 _txDataLength,\\n bytes memory _hashMemory\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n // Only allocate more memory if we didn't reserve enough to begin with.\\n if (BYTES_TILL_TX_DATA + _txDataLength > _hashMemory.length) {\\n _hashMemory = new bytes(BYTES_TILL_TX_DATA + _txDataLength);\\n }\\n\\n uint256 ctxTimestamp = _context.timestamp;\\n uint256 ctxBlockNumber = _context.blockNumber;\\n\\n bytes32 leafHash;\\n assembly {\\n let chainElementStart := add(_hashMemory, 0x20)\\n\\n // Set the first byte equal to `1` to indicate this is a sequencer chain element.\\n // This distinguishes sequencer ChainElements from queue ChainElements because\\n // all queue ChainElements are ABI encoded and the first byte of ABI encoded\\n // elements is always zero\\n mstore8(chainElementStart, 1)\\n\\n mstore(add(chainElementStart, 1), ctxTimestamp)\\n mstore(add(chainElementStart, 33), ctxBlockNumber)\\n\\n calldatacopy(add(chainElementStart, BYTES_TILL_TX_DATA), add(_nextTransactionPtr, 3), _txDataLength)\\n\\n leafHash := keccak256(chainElementStart, add(BYTES_TILL_TX_DATA, _txDataLength))\\n }\\n\\n return leafHash;\\n }\\n\\n /**\\n * Retrieves the hash of a sequencer element.\\n * @param _txChainElement The chain element which is hashed to calculate the leaf.\\n * @return Hash of the sequencer element.\\n */\\n function _getSequencerLeafHash(\\n Lib_OVMCodec.TransactionChainElement memory _txChainElement\\n )\\n internal\\n view\\n returns(\\n bytes32\\n )\\n {\\n bytes memory txData = _txChainElement.txData;\\n uint256 txDataLength = _txChainElement.txData.length;\\n\\n bytes memory chainElement = new bytes(BYTES_TILL_TX_DATA + txDataLength);\\n uint256 ctxTimestamp = _txChainElement.timestamp;\\n uint256 ctxBlockNumber = _txChainElement.blockNumber;\\n\\n bytes32 leafHash;\\n assembly {\\n let chainElementStart := add(chainElement, 0x20)\\n\\n // Set the first byte equal to `1` to indicate this is a sequencer chain element.\\n // This distinguishes sequencer ChainElements from queue ChainElements because\\n // all queue ChainElements are ABI encoded and the first byte of ABI encoded\\n // elements is always zero\\n mstore8(chainElementStart, 1)\\n\\n mstore(add(chainElementStart, 1), ctxTimestamp)\\n mstore(add(chainElementStart, 33), ctxBlockNumber)\\n\\n pop(staticcall(gas(), 0x04, add(txData, 0x20), txDataLength, add(chainElementStart, BYTES_TILL_TX_DATA), txDataLength))\\n\\n leafHash := keccak256(chainElementStart, add(BYTES_TILL_TX_DATA, txDataLength))\\n }\\n\\n return leafHash;\\n }\\n\\n /**\\n * Inserts a batch into the chain of batches.\\n * @param _transactionRoot Root of the transaction tree for this batch.\\n * @param _batchSize Number of elements in the batch.\\n * @param _numQueuedTransactions Number of queue transactions in the batch.\\n * @param _timestamp The latest batch timestamp.\\n * @param _blockNumber The latest batch blockNumber.\\n */\\n function _appendBatch(\\n bytes32 _transactionRoot,\\n uint256 _batchSize,\\n uint256 _numQueuedTransactions,\\n uint40 _timestamp,\\n uint40 _blockNumber\\n )\\n internal\\n {\\n iOVM_ChainStorageContainer batchesRef = batches();\\n (uint40 totalElements, uint40 nextQueueIndex,,) = _getBatchExtraData();\\n\\n Lib_OVMCodec.ChainBatchHeader memory header = Lib_OVMCodec.ChainBatchHeader({\\n batchIndex: batchesRef.length(),\\n batchRoot: _transactionRoot,\\n batchSize: _batchSize,\\n prevTotalElements: totalElements,\\n extraData: hex\\\"\\\"\\n });\\n\\n emit TransactionBatchAppended(\\n header.batchIndex,\\n header.batchRoot,\\n header.batchSize,\\n header.prevTotalElements,\\n header.extraData\\n );\\n\\n bytes32 batchHeaderHash = Lib_OVMCodec.hashBatchHeader(header);\\n bytes27 latestBatchContext = _makeBatchExtraData(\\n totalElements + uint40(header.batchSize),\\n nextQueueIndex + uint40(_numQueuedTransactions),\\n _timestamp,\\n _blockNumber\\n );\\n\\n batchesRef.push(batchHeaderHash, latestBatchContext);\\n }\\n\\n /**\\n * Checks that the first batch context in a sequencer submission is valid\\n * @param _firstContext The batch context to validate.\\n */\\n function _validateFirstBatchContext(\\n BatchContext memory _firstContext\\n )\\n internal\\n view\\n {\\n // If there are existing elements, this batch must have the same context\\n // or a later timestamp and block number.\\n if (getTotalElements() > 0) {\\n (,, uint40 lastTimestamp, uint40 lastBlockNumber) = _getBatchExtraData();\\n\\n require(\\n _firstContext.blockNumber >= lastBlockNumber,\\n \\\"Context block number is lower than last submitted.\\\"\\n );\\n\\n require(\\n _firstContext.timestamp >= lastTimestamp,\\n \\\"Context timestamp is lower than last submitted.\\\"\\n );\\n }\\n\\n // Sequencer cannot submit contexts which are more than the force inclusion period old.\\n require(\\n _firstContext.timestamp + forceInclusionPeriodSeconds >= block.timestamp,\\n \\\"Context timestamp too far in the past.\\\"\\n );\\n\\n require(\\n _firstContext.blockNumber + forceInclusionPeriodBlocks >= block.number,\\n \\\"Context block number too far in the past.\\\"\\n );\\n }\\n\\n /**\\n * Checks that a given batch context has a time context which is below a given que element\\n * @param _context The batch context to validate has values lower.\\n * @param _queueIndex Index of the queue element we are validating came later than the context.\\n * @param _queueRef The storage container for the queue.\\n */\\n function _validateContextBeforeEnqueue(\\n BatchContext memory _context,\\n uint40 _queueIndex,\\n iOVM_ChainStorageContainer _queueRef\\n )\\n internal\\n view\\n {\\n Lib_OVMCodec.QueueElement memory nextQueueElement = _getQueueElement(\\n _queueIndex,\\n _queueRef\\n );\\n\\n // If the force inclusion period has passed for an enqueued transaction, it MUST be the next chain element.\\n require(\\n block.timestamp < nextQueueElement.timestamp + forceInclusionPeriodSeconds,\\n \\\"Previously enqueued batches have expired and must be appended before a new sequencer batch.\\\"\\n );\\n\\n // Just like sequencer transaction times must be increasing relative to each other,\\n // We also require that they be increasing relative to any interspersed queue elements.\\n require(\\n _context.timestamp <= nextQueueElement.timestamp,\\n \\\"Sequencer transaction timestamp exceeds that of next queue element.\\\"\\n );\\n\\n require(\\n _context.blockNumber <= nextQueueElement.blockNumber,\\n \\\"Sequencer transaction blockNumber exceeds that of next queue element.\\\"\\n );\\n }\\n\\n /**\\n * Checks that a given batch context is valid based on its previous context, and the next queue elemtent.\\n * @param _prevContext The previously validated batch context.\\n * @param _nextContext The batch context to validate with this call.\\n * @param _nextQueueIndex Index of the next queue element to process for the _nextContext's subsequentQueueElements.\\n * @param _queueRef The storage container for the queue.\\n */\\n function _validateNextBatchContext(\\n BatchContext memory _prevContext,\\n BatchContext memory _nextContext,\\n uint40 _nextQueueIndex,\\n iOVM_ChainStorageContainer _queueRef\\n )\\n internal\\n view\\n {\\n // All sequencer transactions' times must be greater than or equal to the previous ones.\\n require(\\n _nextContext.timestamp >= _prevContext.timestamp,\\n \\\"Context timestamp values must monotonically increase.\\\"\\n );\\n\\n require(\\n _nextContext.blockNumber >= _prevContext.blockNumber,\\n \\\"Context blockNumber values must monotonically increase.\\\"\\n );\\n\\n // If there is going to be a queue element pulled in from this context:\\n if (_nextContext.numSubsequentQueueTransactions > 0) {\\n _validateContextBeforeEnqueue(\\n _nextContext,\\n _nextQueueIndex,\\n _queueRef\\n );\\n }\\n }\\n\\n /**\\n * Checks that the final batch context in a sequencer submission is valid.\\n * @param _finalContext The batch context to validate.\\n * @param _queueLength The length of the queue at the start of the batchAppend call.\\n * @param _nextQueueIndex The next element in the queue that will be pulled into the CTC.\\n * @param _queueRef The storage container for the queue.\\n */\\n function _validateFinalBatchContext(\\n BatchContext memory _finalContext,\\n uint40 _nextQueueIndex,\\n uint40 _queueLength,\\n iOVM_ChainStorageContainer _queueRef\\n )\\n internal\\n view\\n {\\n // If the queue is not now empty, check the mononoticity of whatever the next batch that will come in is.\\n if (_queueLength - _nextQueueIndex > 0 && _finalContext.numSubsequentQueueTransactions == 0) {\\n _validateContextBeforeEnqueue(\\n _finalContext,\\n _nextQueueIndex,\\n _queueRef\\n );\\n }\\n // Batches cannot be added from the future, or subsequent enqueue() contexts would violate monotonicity.\\n require(_finalContext.timestamp <= block.timestamp, \\\"Context timestamp is from the future.\\\");\\n require(_finalContext.blockNumber <= block.number, \\\"Context block number is from the future.\\\");\\n }\\n\\n /**\\n * Hashes a transaction chain element.\\n * @param _element Chain element to hash.\\n * @return Hash of the chain element.\\n */\\n function _hashTransactionChainElement(\\n Lib_OVMCodec.TransactionChainElement memory _element\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(\\n abi.encode(\\n _element.isSequenced,\\n _element.queueIndex,\\n _element.timestamp,\\n _element.blockNumber,\\n _element.txData\\n )\\n );\\n }\\n\\n /**\\n * Verifies a sequencer transaction, returning true if it was indeed included in the CTC\\n * @param _transaction The transaction we are verifying inclusion of.\\n * @param _txChainElement The chain element that the transaction is claimed to be a part of.\\n * @param _batchHeader Header of the batch the transaction was included in.\\n * @param _inclusionProof An inclusion proof into the CTC at a particular index.\\n * @return True if the transaction was included in the specified location, else false.\\n */\\n function _verifySequencerTransaction(\\n Lib_OVMCodec.Transaction memory _transaction,\\n Lib_OVMCodec.TransactionChainElement memory _txChainElement,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _inclusionProof\\n )\\n internal\\n view\\n returns (\\n bool\\n )\\n {\\n OVM_ExecutionManager ovmExecutionManager = OVM_ExecutionManager(resolve(\\\"OVM_ExecutionManager\\\"));\\n uint256 gasLimit = ovmExecutionManager.getMaxTransactionGasLimit();\\n bytes32 leafHash = _getSequencerLeafHash(_txChainElement);\\n\\n require(\\n _verifyElement(\\n leafHash,\\n _batchHeader,\\n _inclusionProof\\n ),\\n \\\"Invalid Sequencer transaction inclusion proof.\\\"\\n );\\n\\n require(\\n _transaction.blockNumber == _txChainElement.blockNumber\\n && _transaction.timestamp == _txChainElement.timestamp\\n && _transaction.entrypoint == resolve(\\\"OVM_DecompressionPrecompileAddress\\\")\\n && _transaction.gasLimit == gasLimit\\n && _transaction.l1TxOrigin == address(0)\\n && _transaction.l1QueueOrigin == Lib_OVMCodec.QueueOrigin.SEQUENCER_QUEUE\\n && keccak256(_transaction.data) == keccak256(_txChainElement.txData),\\n \\\"Invalid Sequencer transaction.\\\"\\n );\\n\\n return true;\\n }\\n\\n /**\\n * Verifies a queue transaction, returning true if it was indeed included in the CTC\\n * @param _transaction The transaction we are verifying inclusion of.\\n * @param _queueIndex The queueIndex of the queued transaction.\\n * @param _batchHeader Header of the batch the transaction was included in.\\n * @param _inclusionProof An inclusion proof into the CTC at a particular index (should point to queue tx).\\n * @return True if the transaction was included in the specified location, else false.\\n */\\n function _verifyQueueTransaction(\\n Lib_OVMCodec.Transaction memory _transaction,\\n uint256 _queueIndex,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _inclusionProof\\n )\\n internal\\n view\\n returns (\\n bool\\n )\\n {\\n bytes32 leafHash = _getQueueLeafHash(_queueIndex);\\n\\n require(\\n _verifyElement(\\n leafHash,\\n _batchHeader,\\n _inclusionProof\\n ),\\n \\\"Invalid Queue transaction inclusion proof.\\\"\\n );\\n\\n bytes32 transactionHash = keccak256(\\n abi.encode(\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n )\\n );\\n\\n Lib_OVMCodec.QueueElement memory el = getQueueElement(_queueIndex);\\n require(\\n el.transactionHash == transactionHash\\n && el.timestamp == _transaction.timestamp\\n && el.blockNumber == _transaction.blockNumber,\\n \\\"Invalid Queue transaction.\\\"\\n );\\n\\n return true;\\n }\\n\\n /**\\n * Verifies a batch inclusion proof.\\n * @param _element Hash of the element to verify a proof for.\\n * @param _batchHeader Header of the batch in which the element was included.\\n * @param _proof Merkle inclusion proof for the element.\\n */\\n function _verifyElement(\\n bytes32 _element,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _proof\\n )\\n internal\\n view\\n returns (\\n bool\\n )\\n {\\n require(\\n Lib_OVMCodec.hashBatchHeader(_batchHeader) == batches().get(uint32(_batchHeader.batchIndex)),\\n \\\"Invalid batch header.\\\"\\n );\\n\\n require(\\n Lib_MerkleTree.verify(\\n _batchHeader.batchRoot,\\n _element,\\n _proof.index,\\n _proof.siblings,\\n _batchHeader.batchSize\\n ),\\n \\\"Invalid inclusion proof.\\\"\\n );\\n\\n return true;\\n }\\n}\\n\",\"keccak256\":\"0xdc5f311b6840476027f597b9b6ff6c7673988cfed9c9ace625c705175b27abe3\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// @unsupported: ovm\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\nimport { Lib_EthUtils } from \\\"../../libraries/utils/Lib_EthUtils.sol\\\";\\nimport { Lib_ErrorUtils } from \\\"../../libraries/utils/Lib_ErrorUtils.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_ExecutionManager } from \\\"../../iOVM/execution/iOVM_ExecutionManager.sol\\\";\\nimport { iOVM_StateManager } from \\\"../../iOVM/execution/iOVM_StateManager.sol\\\";\\nimport { iOVM_SafetyChecker } from \\\"../../iOVM/execution/iOVM_SafetyChecker.sol\\\";\\n\\n/* Contract Imports */\\nimport { OVM_DeployerWhitelist } from \\\"../predeploys/OVM_DeployerWhitelist.sol\\\";\\n\\n/**\\n * @title OVM_ExecutionManager\\n * @dev The Execution Manager (EM) is the core of our OVM implementation, and provides a sandboxed\\n * environment allowing us to execute OVM transactions deterministically on either Layer 1 or\\n * Layer 2.\\n * The EM's run() function is the first function called during the execution of any\\n * transaction on L2.\\n * For each context-dependent EVM operation the EM has a function which implements a corresponding\\n * OVM operation, which will read state from the State Manager contract.\\n * The EM relies on the Safety Checker to verify that code deployed to Layer 2 does not contain any\\n * context-dependent operations.\\n *\\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract OVM_ExecutionManager is iOVM_ExecutionManager, Lib_AddressResolver {\\n\\n /********************************\\n * External Contract References *\\n ********************************/\\n\\n iOVM_SafetyChecker internal ovmSafetyChecker;\\n iOVM_StateManager internal ovmStateManager;\\n\\n\\n /*******************************\\n * Execution Context Variables *\\n *******************************/\\n\\n GasMeterConfig internal gasMeterConfig;\\n GlobalContext internal globalContext;\\n TransactionContext internal transactionContext;\\n MessageContext internal messageContext;\\n TransactionRecord internal transactionRecord;\\n MessageRecord internal messageRecord;\\n\\n\\n /**************************\\n * Gas Metering Constants *\\n **************************/\\n\\n address constant GAS_METADATA_ADDRESS = 0x06a506A506a506A506a506a506A506A506A506A5;\\n uint256 constant NUISANCE_GAS_SLOAD = 20000;\\n uint256 constant NUISANCE_GAS_SSTORE = 20000;\\n uint256 constant MIN_NUISANCE_GAS_PER_CONTRACT = 30000;\\n uint256 constant NUISANCE_GAS_PER_CONTRACT_BYTE = 100;\\n uint256 constant MIN_GAS_FOR_INVALID_STATE_ACCESS = 30000;\\n\\n /**************************\\n * Default Context Values *\\n **************************/\\n\\n uint256 constant DEFAULT_UINT256 = 0xdefa017defa017defa017defa017defa017defa017defa017defa017defa017d;\\n address constant DEFAULT_ADDRESS = 0xdEfa017defA017DeFA017DEfa017DeFA017DeFa0;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n */\\n constructor(\\n address _libAddressManager,\\n GasMeterConfig memory _gasMeterConfig,\\n GlobalContext memory _globalContext\\n )\\n Lib_AddressResolver(_libAddressManager)\\n {\\n ovmSafetyChecker = iOVM_SafetyChecker(resolve(\\\"OVM_SafetyChecker\\\"));\\n gasMeterConfig = _gasMeterConfig;\\n globalContext = _globalContext;\\n _resetContext();\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n /**\\n * Applies dynamically-sized refund to a transaction to account for the difference in execution\\n * between L1 and L2, so that the overall cost of the ovmOPCODE is fixed.\\n * @param _cost Desired gas cost for the function after the refund.\\n */\\n modifier netGasCost(\\n uint256 _cost\\n ) {\\n uint256 gasProvided = gasleft();\\n _;\\n uint256 gasUsed = gasProvided - gasleft();\\n\\n // We want to refund everything *except* the specified cost.\\n if (_cost < gasUsed) {\\n transactionRecord.ovmGasRefund += gasUsed - _cost;\\n }\\n }\\n\\n /**\\n * Applies a fixed-size gas refund to a transaction to account for the difference in execution\\n * between L1 and L2, so that the overall cost of an ovmOPCODE can be lowered.\\n * @param _discount Amount of gas cost to refund for the ovmOPCODE.\\n */\\n modifier fixedGasDiscount(\\n uint256 _discount\\n ) {\\n uint256 gasProvided = gasleft();\\n _;\\n uint256 gasUsed = gasProvided - gasleft();\\n\\n // We want to refund the specified _discount, unless this risks underflow.\\n if (_discount < gasUsed) {\\n transactionRecord.ovmGasRefund += _discount;\\n } else {\\n // refund all we can without risking underflow.\\n transactionRecord.ovmGasRefund += gasUsed;\\n }\\n }\\n\\n /**\\n * Makes sure we're not inside a static context.\\n */\\n modifier notStatic() {\\n if (messageContext.isStatic == true) {\\n _revertWithFlag(RevertFlag.STATIC_VIOLATION);\\n }\\n _;\\n }\\n\\n\\n /************************************\\n * Transaction Execution Entrypoint *\\n ************************************/\\n\\n /**\\n * Starts the execution of a transaction via the OVM_ExecutionManager.\\n * @param _transaction Transaction data to be executed.\\n * @param _ovmStateManager iOVM_StateManager implementation providing account state.\\n */\\n function run(\\n Lib_OVMCodec.Transaction memory _transaction,\\n address _ovmStateManager\\n )\\n override\\n public\\n returns (\\n bytes memory\\n )\\n {\\n // Make sure that run() is not re-enterable. This condition should always be satisfied\\n // Once run has been called once, due to the behavior of _isValidInput().\\n if (transactionContext.ovmNUMBER != DEFAULT_UINT256) {\\n return bytes(\\\"\\\");\\n }\\n\\n // Store our OVM_StateManager instance (significantly easier than attempting to pass the\\n // address around in calldata).\\n ovmStateManager = iOVM_StateManager(_ovmStateManager);\\n\\n // Make sure this function can't be called by anyone except the owner of the\\n // OVM_StateManager (expected to be an OVM_StateTransitioner). We can revert here because\\n // this would make the `run` itself invalid.\\n require(\\n // This method may return false during fraud proofs, but always returns true in L2 nodes' State Manager precompile.\\n ovmStateManager.isAuthenticated(msg.sender),\\n \\\"Only authenticated addresses in ovmStateManager can call this function\\\"\\n );\\n\\n // Initialize the execution context, must be initialized before we perform any gas metering\\n // or we'll throw a nuisance gas error.\\n _initContext(_transaction);\\n\\n // TEMPORARY: Gas metering is disabled for minnet.\\n // // Check whether we need to start a new epoch, do so if necessary.\\n // _checkNeedsNewEpoch(_transaction.timestamp);\\n\\n // Make sure the transaction's gas limit is valid. We don't revert here because we reserve\\n // reverts for INVALID_STATE_ACCESS.\\n if (_isValidInput(_transaction) == false) {\\n _resetContext();\\n return bytes(\\\"\\\");\\n }\\n\\n // TEMPORARY: Gas metering is disabled for minnet.\\n // // Check gas right before the call to get total gas consumed by OVM transaction.\\n // uint256 gasProvided = gasleft();\\n\\n // Run the transaction, make sure to meter the gas usage.\\n (, bytes memory returndata) = ovmCALL(\\n _transaction.gasLimit - gasMeterConfig.minTransactionGasLimit,\\n _transaction.entrypoint,\\n _transaction.data\\n );\\n\\n // TEMPORARY: Gas metering is disabled for minnet.\\n // // Update the cumulative gas based on the amount of gas used.\\n // uint256 gasUsed = gasProvided - gasleft();\\n // _updateCumulativeGas(gasUsed, _transaction.l1QueueOrigin);\\n\\n // Wipe the execution context.\\n _resetContext();\\n\\n return returndata;\\n }\\n\\n\\n /******************************\\n * Opcodes: Execution Context *\\n ******************************/\\n\\n /**\\n * @notice Overrides CALLER.\\n * @return _CALLER Address of the CALLER within the current message context.\\n */\\n function ovmCALLER()\\n override\\n public\\n view\\n returns (\\n address _CALLER\\n )\\n {\\n return messageContext.ovmCALLER;\\n }\\n\\n /**\\n * @notice Overrides ADDRESS.\\n * @return _ADDRESS Active ADDRESS within the current message context.\\n */\\n function ovmADDRESS()\\n override\\n public\\n view\\n returns (\\n address _ADDRESS\\n )\\n {\\n return messageContext.ovmADDRESS;\\n }\\n\\n /**\\n * @notice Overrides TIMESTAMP.\\n * @return _TIMESTAMP Value of the TIMESTAMP within the transaction context.\\n */\\n function ovmTIMESTAMP()\\n override\\n public\\n view\\n returns (\\n uint256 _TIMESTAMP\\n )\\n {\\n return transactionContext.ovmTIMESTAMP;\\n }\\n\\n /**\\n * @notice Overrides NUMBER.\\n * @return _NUMBER Value of the NUMBER within the transaction context.\\n */\\n function ovmNUMBER()\\n override\\n public\\n view\\n returns (\\n uint256 _NUMBER\\n )\\n {\\n return transactionContext.ovmNUMBER;\\n }\\n\\n /**\\n * @notice Overrides GASLIMIT.\\n * @return _GASLIMIT Value of the block's GASLIMIT within the transaction context.\\n */\\n function ovmGASLIMIT()\\n override\\n public\\n view\\n returns (\\n uint256 _GASLIMIT\\n )\\n {\\n return transactionContext.ovmGASLIMIT;\\n }\\n\\n /**\\n * @notice Overrides CHAINID.\\n * @return _CHAINID Value of the chain's CHAINID within the global context.\\n */\\n function ovmCHAINID()\\n override\\n public\\n view\\n returns (\\n uint256 _CHAINID\\n )\\n {\\n return globalContext.ovmCHAINID;\\n }\\n\\n /*********************************\\n * Opcodes: L2 Execution Context *\\n *********************************/\\n\\n /**\\n * @notice Specifies from which source (Sequencer or Queue) this transaction originated from.\\n * @return _queueOrigin Enum indicating the ovmL1QUEUEORIGIN within the current message context.\\n */\\n function ovmL1QUEUEORIGIN()\\n override\\n public\\n view\\n returns (\\n Lib_OVMCodec.QueueOrigin _queueOrigin\\n )\\n {\\n return transactionContext.ovmL1QUEUEORIGIN;\\n }\\n\\n /**\\n * @notice Specifies which L1 account, if any, sent this transaction by calling enqueue().\\n * @return _l1TxOrigin Address of the account which sent the tx into L2 from L1.\\n */\\n function ovmL1TXORIGIN()\\n override\\n public\\n view\\n returns (\\n address _l1TxOrigin\\n )\\n {\\n return transactionContext.ovmL1TXORIGIN;\\n }\\n\\n /********************\\n * Opcodes: Halting *\\n ********************/\\n\\n /**\\n * @notice Overrides REVERT.\\n * @param _data Bytes data to pass along with the REVERT.\\n */\\n function ovmREVERT(\\n bytes memory _data\\n )\\n override\\n public\\n {\\n _revertWithFlag(RevertFlag.INTENTIONAL_REVERT, _data);\\n }\\n\\n\\n /******************************\\n * Opcodes: Contract Creation *\\n ******************************/\\n\\n /**\\n * @notice Overrides CREATE.\\n * @param _bytecode Code to be used to CREATE a new contract.\\n * @return Address of the created contract.\\n * @return Revert data, if and only if the creation threw an exception.\\n */\\n function ovmCREATE(\\n bytes memory _bytecode\\n )\\n override\\n public\\n notStatic\\n fixedGasDiscount(40000)\\n returns (\\n address,\\n bytes memory\\n )\\n {\\n // Creator is always the current ADDRESS.\\n address creator = ovmADDRESS();\\n\\n // Check that the deployer is whitelisted, or\\n // that arbitrary contract deployment has been enabled.\\n _checkDeployerAllowed(creator);\\n\\n // Generate the correct CREATE address.\\n address contractAddress = Lib_EthUtils.getAddressForCREATE(\\n creator,\\n _getAccountNonce(creator)\\n );\\n\\n return _createContract(\\n contractAddress,\\n _bytecode\\n );\\n }\\n\\n /**\\n * @notice Overrides CREATE2.\\n * @param _bytecode Code to be used to CREATE2 a new contract.\\n * @param _salt Value used to determine the contract's address.\\n * @return Address of the created contract.\\n * @return Revert data, if and only if the creation threw an exception.\\n */\\n function ovmCREATE2(\\n bytes memory _bytecode,\\n bytes32 _salt\\n )\\n override\\n public\\n notStatic\\n fixedGasDiscount(40000)\\n returns (\\n address,\\n bytes memory\\n )\\n {\\n // Creator is always the current ADDRESS.\\n address creator = ovmADDRESS();\\n\\n // Check that the deployer is whitelisted, or\\n // that arbitrary contract deployment has been enabled.\\n _checkDeployerAllowed(creator);\\n\\n // Generate the correct CREATE2 address.\\n address contractAddress = Lib_EthUtils.getAddressForCREATE2(\\n creator,\\n _bytecode,\\n _salt\\n );\\n\\n return _createContract(\\n contractAddress,\\n _bytecode\\n );\\n }\\n\\n\\n /*******************************\\n * Account Abstraction Opcodes *\\n ******************************/\\n\\n /**\\n * Retrieves the nonce of the current ovmADDRESS.\\n * @return _nonce Nonce of the current contract.\\n */\\n function ovmGETNONCE()\\n override\\n public\\n returns (\\n uint256 _nonce\\n )\\n {\\n return _getAccountNonce(ovmADDRESS());\\n }\\n\\n /**\\n * Bumps the nonce of the current ovmADDRESS by one.\\n */\\n function ovmINCREMENTNONCE()\\n override\\n public\\n notStatic\\n {\\n address account = ovmADDRESS();\\n uint256 nonce = _getAccountNonce(account);\\n\\n // Prevent overflow.\\n if (nonce + 1 > nonce) {\\n _setAccountNonce(account, nonce + 1);\\n }\\n }\\n\\n /**\\n * Creates a new EOA contract account, for account abstraction.\\n * @dev Essentially functions like ovmCREATE or ovmCREATE2, but we can bypass a lot of checks\\n * because the contract we're creating is trusted (no need to do safety checking or to\\n * handle unexpected reverts). Doesn't need to return an address because the address is\\n * assumed to be the user's actual address.\\n * @param _messageHash Hash of a message signed by some user, for verification.\\n * @param _v Signature `v` parameter.\\n * @param _r Signature `r` parameter.\\n * @param _s Signature `s` parameter.\\n */\\n function ovmCREATEEOA(\\n bytes32 _messageHash,\\n uint8 _v,\\n bytes32 _r,\\n bytes32 _s\\n )\\n override\\n public\\n notStatic\\n {\\n // Recover the EOA address from the message hash and signature parameters. Since we do the\\n // hashing in advance, we don't have handle different message hashing schemes. Even if this\\n // function were to return the wrong address (rather than explicitly returning the zero\\n // address), the rest of the transaction would simply fail (since there's no EOA account to\\n // actually execute the transaction).\\n address eoa = ecrecover(\\n _messageHash,\\n _v + 27,\\n _r,\\n _s\\n );\\n\\n // Invalid signature is a case we proactively handle with a revert. We could alternatively\\n // have this function return a `success` boolean, but this is just easier.\\n if (eoa == address(0)) {\\n ovmREVERT(bytes(\\\"Signature provided for EOA contract creation is invalid.\\\"));\\n }\\n\\n // If the user already has an EOA account, then there's no need to perform this operation.\\n if (_hasEmptyAccount(eoa) == false) {\\n return;\\n }\\n\\n // We always need to initialize the contract with the default account values.\\n _initPendingAccount(eoa);\\n\\n // Temporarily set the current address so it's easier to access on L2.\\n address prevADDRESS = messageContext.ovmADDRESS;\\n messageContext.ovmADDRESS = eoa;\\n\\n // Creates a duplicate of the OVM_ProxyEOA located at 0x42....09. Uses the following\\n // \\\"magic\\\" prefix to deploy an exact copy of the code:\\n // PUSH1 0x0D # size of this prefix in bytes\\n // CODESIZE\\n // SUB # subtract prefix size from codesize\\n // DUP1\\n // PUSH1 0x0D\\n // PUSH1 0x00\\n // CODECOPY # copy everything after prefix into memory at pos 0\\n // PUSH1 0x00\\n // RETURN # return the copied code\\n address proxyEOA = Lib_EthUtils.createContract(abi.encodePacked(\\n hex\\\"600D380380600D6000396000f3\\\",\\n ovmEXTCODECOPY(\\n 0x4200000000000000000000000000000000000009,\\n 0,\\n ovmEXTCODESIZE(0x4200000000000000000000000000000000000009)\\n )\\n ));\\n\\n // Reset the address now that we're done deploying.\\n messageContext.ovmADDRESS = prevADDRESS;\\n\\n // Commit the account with its final values.\\n _commitPendingAccount(\\n eoa,\\n address(proxyEOA),\\n keccak256(Lib_EthUtils.getCode(address(proxyEOA)))\\n );\\n\\n _setAccountNonce(eoa, 0);\\n }\\n\\n\\n /*********************************\\n * Opcodes: Contract Interaction *\\n *********************************/\\n\\n /**\\n * @notice Overrides CALL.\\n * @param _gasLimit Amount of gas to be passed into this call.\\n * @param _address Address of the contract to call.\\n * @param _calldata Data to send along with the call.\\n * @return _success Whether or not the call returned (rather than reverted).\\n * @return _returndata Data returned by the call.\\n */\\n function ovmCALL(\\n uint256 _gasLimit,\\n address _address,\\n bytes memory _calldata\\n )\\n override\\n public\\n fixedGasDiscount(100000)\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n // CALL updates the CALLER and ADDRESS.\\n MessageContext memory nextMessageContext = messageContext;\\n nextMessageContext.ovmCALLER = nextMessageContext.ovmADDRESS;\\n nextMessageContext.ovmADDRESS = _address;\\n\\n return _callContract(\\n nextMessageContext,\\n _gasLimit,\\n _address,\\n _calldata\\n );\\n }\\n\\n /**\\n * @notice Overrides STATICCALL.\\n * @param _gasLimit Amount of gas to be passed into this call.\\n * @param _address Address of the contract to call.\\n * @param _calldata Data to send along with the call.\\n * @return _success Whether or not the call returned (rather than reverted).\\n * @return _returndata Data returned by the call.\\n */\\n function ovmSTATICCALL(\\n uint256 _gasLimit,\\n address _address,\\n bytes memory _calldata\\n )\\n override\\n public\\n fixedGasDiscount(80000)\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n // STATICCALL updates the CALLER, updates the ADDRESS, and runs in a static context.\\n MessageContext memory nextMessageContext = messageContext;\\n nextMessageContext.ovmCALLER = nextMessageContext.ovmADDRESS;\\n nextMessageContext.ovmADDRESS = _address;\\n nextMessageContext.isStatic = true;\\n\\n return _callContract(\\n nextMessageContext,\\n _gasLimit,\\n _address,\\n _calldata\\n );\\n }\\n\\n /**\\n * @notice Overrides DELEGATECALL.\\n * @param _gasLimit Amount of gas to be passed into this call.\\n * @param _address Address of the contract to call.\\n * @param _calldata Data to send along with the call.\\n * @return _success Whether or not the call returned (rather than reverted).\\n * @return _returndata Data returned by the call.\\n */\\n function ovmDELEGATECALL(\\n uint256 _gasLimit,\\n address _address,\\n bytes memory _calldata\\n )\\n override\\n public\\n fixedGasDiscount(40000)\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n // DELEGATECALL does not change anything about the message context.\\n MessageContext memory nextMessageContext = messageContext;\\n\\n return _callContract(\\n nextMessageContext,\\n _gasLimit,\\n _address,\\n _calldata\\n );\\n }\\n\\n\\n /************************************\\n * Opcodes: Contract Storage Access *\\n ************************************/\\n\\n /**\\n * @notice Overrides SLOAD.\\n * @param _key 32 byte key of the storage slot to load.\\n * @return _value 32 byte value of the requested storage slot.\\n */\\n function ovmSLOAD(\\n bytes32 _key\\n )\\n override\\n public\\n netGasCost(40000)\\n returns (\\n bytes32 _value\\n )\\n {\\n // We always SLOAD from the storage of ADDRESS.\\n address contractAddress = ovmADDRESS();\\n\\n return _getContractStorage(\\n contractAddress,\\n _key\\n );\\n }\\n\\n /**\\n * @notice Overrides SSTORE.\\n * @param _key 32 byte key of the storage slot to set.\\n * @param _value 32 byte value for the storage slot.\\n */\\n function ovmSSTORE(\\n bytes32 _key,\\n bytes32 _value\\n )\\n override\\n public\\n notStatic\\n netGasCost(60000)\\n {\\n // We always SSTORE to the storage of ADDRESS.\\n address contractAddress = ovmADDRESS();\\n\\n _putContractStorage(\\n contractAddress,\\n _key,\\n _value\\n );\\n }\\n\\n\\n /*********************************\\n * Opcodes: Contract Code Access *\\n *********************************/\\n\\n /**\\n * @notice Overrides EXTCODECOPY.\\n * @param _contract Address of the contract to copy code from.\\n * @param _offset Offset in bytes from the start of contract code to copy beyond.\\n * @param _length Total number of bytes to copy from the contract's code.\\n * @return _code Bytes of code copied from the requested contract.\\n */\\n function ovmEXTCODECOPY(\\n address _contract,\\n uint256 _offset,\\n uint256 _length\\n )\\n override\\n public\\n returns (\\n bytes memory _code\\n )\\n {\\n // `ovmEXTCODECOPY` is the only overridden opcode capable of producing exactly one byte of\\n // return data. By blocking reads of one byte, we're able to use the condition that an\\n // OVM_ExecutionManager function return value having a length of exactly one byte indicates\\n // an error without an explicit revert. If users were able to read a single byte, they\\n // could forcibly trigger behavior that should only be available to this contract.\\n uint256 length = _length == 1 ? 2 : _length;\\n\\n return Lib_EthUtils.getCode(\\n _getAccountEthAddress(_contract),\\n _offset,\\n length\\n );\\n }\\n\\n /**\\n * @notice Overrides EXTCODESIZE.\\n * @param _contract Address of the contract to query the size of.\\n * @return _EXTCODESIZE Size of the requested contract in bytes.\\n */\\n function ovmEXTCODESIZE(\\n address _contract\\n )\\n override\\n public\\n returns (\\n uint256 _EXTCODESIZE\\n )\\n {\\n return Lib_EthUtils.getCodeSize(\\n _getAccountEthAddress(_contract)\\n );\\n }\\n\\n /**\\n * @notice Overrides EXTCODEHASH.\\n * @param _contract Address of the contract to query the hash of.\\n * @return _EXTCODEHASH Hash of the requested contract.\\n */\\n function ovmEXTCODEHASH(\\n address _contract\\n )\\n override\\n public\\n returns (\\n bytes32 _EXTCODEHASH\\n )\\n {\\n return Lib_EthUtils.getCodeHash(\\n _getAccountEthAddress(_contract)\\n );\\n }\\n\\n /***************************************\\n * Public Functions: Execution Context *\\n ***************************************/\\n\\n function getMaxTransactionGasLimit()\\n external\\n view\\n override\\n returns (\\n uint256 _maxTransactionGasLimit\\n )\\n {\\n return gasMeterConfig.maxTransactionGasLimit;\\n }\\n\\n /********************************************\\n * Public Functions: Deployment Whitelisting *\\n ********************************************/\\n\\n /**\\n * Checks whether the given address is on the whitelist to ovmCREATE/ovmCREATE2, and reverts if not.\\n * @param _deployerAddress Address attempting to deploy a contract.\\n */\\n function _checkDeployerAllowed(\\n address _deployerAddress\\n )\\n internal\\n {\\n // From an OVM semantics perspective, this will appear identical to\\n // the deployer ovmCALLing the whitelist. This is fine--in a sense, we are forcing them to.\\n (bool success, bytes memory data) = ovmCALL(\\n gasleft(),\\n 0x4200000000000000000000000000000000000002,\\n abi.encodeWithSignature(\\\"isDeployerAllowed(address)\\\", _deployerAddress)\\n );\\n bool isAllowed = abi.decode(data, (bool));\\n\\n if (!isAllowed || !success) {\\n _revertWithFlag(RevertFlag.CREATOR_NOT_ALLOWED);\\n }\\n }\\n\\n /********************************************\\n * Internal Functions: Contract Interaction *\\n ********************************************/\\n\\n /**\\n * Creates a new contract and associates it with some contract address.\\n * @param _contractAddress Address to associate the created contract with.\\n * @param _bytecode Bytecode to be used to create the contract.\\n * @return Final OVM contract address.\\n * @return Revertdata, if and only if the creation threw an exception.\\n */\\n function _createContract(\\n address _contractAddress,\\n bytes memory _bytecode\\n )\\n internal\\n returns (\\n address,\\n bytes memory\\n )\\n {\\n // We always update the nonce of the creating account, even if the creation fails.\\n _setAccountNonce(ovmADDRESS(), _getAccountNonce(ovmADDRESS()) + 1);\\n\\n // We're stepping into a CREATE or CREATE2, so we need to update ADDRESS to point\\n // to the contract's associated address and CALLER to point to the previous ADDRESS.\\n MessageContext memory nextMessageContext = messageContext;\\n nextMessageContext.ovmCALLER = messageContext.ovmADDRESS;\\n nextMessageContext.ovmADDRESS = _contractAddress;\\n\\n // Run the common logic which occurs between call-type and create-type messages,\\n // passing in the creation bytecode and `true` to trigger create-specific logic.\\n (bool success, bytes memory data) = _handleExternalMessage(\\n nextMessageContext,\\n gasleft(),\\n _contractAddress,\\n _bytecode,\\n true\\n );\\n\\n // Yellow paper requires that address returned is zero if the contract deployment fails.\\n return (\\n success ? _contractAddress : address(0),\\n data\\n );\\n }\\n\\n /**\\n * Calls the deployed contract associated with a given address.\\n * @param _nextMessageContext Message context to be used for the call.\\n * @param _gasLimit Amount of gas to be passed into this call.\\n * @param _contract OVM address to be called.\\n * @param _calldata Data to send along with the call.\\n * @return _success Whether or not the call returned (rather than reverted).\\n * @return _returndata Data returned by the call.\\n */\\n function _callContract(\\n MessageContext memory _nextMessageContext,\\n uint256 _gasLimit,\\n address _contract,\\n bytes memory _calldata\\n )\\n internal\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n // We reserve addresses of the form 0xdeaddeaddead...NNNN for the container contracts in L2 geth.\\n // So, we block calls to these addresses since they are not safe to run as an OVM contract itself.\\n if (\\n (uint256(_contract) & uint256(0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000))\\n == uint256(0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000)\\n ) {\\n // EVM does not return data in the success case, see: https://github.com/ethereum/go-ethereum/blob/aae7660410f0ef90279e14afaaf2f429fdc2a186/core/vm/instructions.go#L600-L604\\n return (true, hex'');\\n }\\n\\n // Both 0x0000... and the EVM precompiles have the same address on L1 and L2 --> no trie lookup needed.\\n address codeContractAddress =\\n uint(_contract) < 100\\n ? _contract\\n : _getAccountEthAddress(_contract);\\n\\n return _handleExternalMessage(\\n _nextMessageContext,\\n _gasLimit,\\n codeContractAddress,\\n _calldata,\\n false\\n );\\n }\\n\\n /**\\n * Handles all interactions which involve the execution manager calling out to untrusted code (both calls and creates).\\n * Ensures that OVM-related measures are enforced, including L2 gas refunds, nuisance gas, and flagged reversions.\\n *\\n * @param _nextMessageContext Message context to be used for the external message.\\n * @param _gasLimit Amount of gas to be passed into this message.\\n * @param _contract OVM address being called or deployed to\\n * @param _data Data for the message (either calldata or creation code)\\n * @param _isCreate Whether this is a create-type message.\\n * @return Whether or not the message (either a call or deployment) succeeded.\\n * @return Data returned by the message.\\n */\\n function _handleExternalMessage(\\n MessageContext memory _nextMessageContext,\\n uint256 _gasLimit,\\n address _contract,\\n bytes memory _data,\\n bool _isCreate\\n )\\n internal\\n returns (\\n bool,\\n bytes memory\\n )\\n {\\n // We need to switch over to our next message context for the duration of this call.\\n MessageContext memory prevMessageContext = messageContext;\\n _switchMessageContext(prevMessageContext, _nextMessageContext);\\n\\n // Nuisance gas is a system used to bound the ability for an attacker to make fraud proofs\\n // expensive by touching a lot of different accounts or storage slots. Since most contracts\\n // only use a few storage slots during any given transaction, this shouldn't be a limiting\\n // factor.\\n uint256 prevNuisanceGasLeft = messageRecord.nuisanceGasLeft;\\n uint256 nuisanceGasLimit = _getNuisanceGasLimit(_gasLimit);\\n messageRecord.nuisanceGasLeft = nuisanceGasLimit;\\n\\n // Make the call and make sure to pass in the gas limit. Another instance of hidden\\n // complexity. `_contract` is guaranteed to be a safe contract, meaning its return/revert\\n // behavior can be controlled. In particular, we enforce that flags are passed through\\n // revert data as to retrieve execution metadata that would normally be reverted out of\\n // existence.\\n\\n bool success;\\n bytes memory returndata;\\n if (_isCreate) {\\n // safeCREATE() is a function which replicates a CREATE message, but uses return values\\n // Which match that of CALL (i.e. bool, bytes). This allows many security checks to be\\n // to be shared between untrusted call and create call frames.\\n (success, returndata) = address(this).call(\\n abi.encodeWithSelector(\\n this.safeCREATE.selector,\\n _gasLimit,\\n _data,\\n _contract\\n )\\n );\\n } else {\\n (success, returndata) = _contract.call{gas: _gasLimit}(_data);\\n }\\n\\n // Switch back to the original message context now that we're out of the call.\\n _switchMessageContext(_nextMessageContext, prevMessageContext);\\n\\n // Assuming there were no reverts, the message record should be accurate here. We'll update\\n // this value in the case of a revert.\\n uint256 nuisanceGasLeft = messageRecord.nuisanceGasLeft;\\n\\n // Reverts at this point are completely OK, but we need to make a few updates based on the\\n // information passed through the revert.\\n if (success == false) {\\n (\\n RevertFlag flag,\\n uint256 nuisanceGasLeftPostRevert,\\n uint256 ovmGasRefund,\\n bytes memory returndataFromFlag\\n ) = _decodeRevertData(returndata);\\n\\n // INVALID_STATE_ACCESS is the only flag that triggers an immediate abort of the\\n // parent EVM message. This behavior is necessary because INVALID_STATE_ACCESS must\\n // halt any further transaction execution that could impact the execution result.\\n if (flag == RevertFlag.INVALID_STATE_ACCESS) {\\n _revertWithFlag(flag);\\n }\\n\\n // INTENTIONAL_REVERT, UNSAFE_BYTECODE, STATIC_VIOLATION, and CREATOR_NOT_ALLOWED aren't\\n // dependent on the input state, so we can just handle them like standard reverts. Our only change here\\n // is to record the gas refund reported by the call (enforced by safety checking).\\n if (\\n flag == RevertFlag.INTENTIONAL_REVERT\\n || flag == RevertFlag.UNSAFE_BYTECODE\\n || flag == RevertFlag.STATIC_VIOLATION\\n || flag == RevertFlag.CREATOR_NOT_ALLOWED\\n ) {\\n transactionRecord.ovmGasRefund = ovmGasRefund;\\n }\\n\\n // INTENTIONAL_REVERT needs to pass up the user-provided return data encoded into the\\n // flag, *not* the full encoded flag. All other revert types return no data.\\n if (\\n flag == RevertFlag.INTENTIONAL_REVERT\\n || _isCreate\\n ) {\\n returndata = returndataFromFlag;\\n } else {\\n returndata = hex'';\\n }\\n\\n // Reverts mean we need to use up whatever \\\"nuisance gas\\\" was used by the call.\\n // EXCEEDS_NUISANCE_GAS explicitly reduces the remaining nuisance gas for this message\\n // to zero. OUT_OF_GAS is a \\\"pseudo\\\" flag given that messages return no data when they\\n // run out of gas, so we have to treat this like EXCEEDS_NUISANCE_GAS. All other flags\\n // will simply pass up the remaining nuisance gas.\\n nuisanceGasLeft = nuisanceGasLeftPostRevert;\\n }\\n\\n // We need to reset the nuisance gas back to its original value minus the amount used here.\\n messageRecord.nuisanceGasLeft = prevNuisanceGasLeft - (nuisanceGasLimit - nuisanceGasLeft);\\n\\n return (\\n success,\\n returndata\\n );\\n }\\n\\n /**\\n * Handles the creation-specific safety measures required for OVM contract deployment.\\n * This function sanitizes the return types for creation messages to match calls (bool, bytes),\\n * by being an external function which the EM can call, that mimics the success/fail case of the CREATE.\\n * This allows for consistent handling of both types of messages in _handleExternalMessage().\\n * Having this step occur as a separate call frame also allows us to easily revert the\\n * contract deployment in the event that the code is unsafe.\\n *\\n * @param _gasLimit Amount of gas to be passed into this creation.\\n * @param _creationCode Code to pass into CREATE for deployment.\\n * @param _address OVM address being deployed to.\\n */\\n function safeCREATE(\\n uint _gasLimit,\\n bytes memory _creationCode,\\n address _address\\n )\\n external\\n {\\n // The only way this should callable is from within _createContract(),\\n // and it should DEFINITELY not be callable by a non-EM code contract.\\n if (msg.sender != address(this)) {\\n return;\\n }\\n // Check that there is not already code at this address.\\n if (_hasEmptyAccount(_address) == false) {\\n // Note: in the EVM, this case burns all allotted gas. For improved\\n // developer experience, we do return the remaining gas.\\n _revertWithFlag(\\n RevertFlag.CREATE_COLLISION,\\n Lib_ErrorUtils.encodeRevertString(\\\"A contract has already been deployed to this address\\\")\\n );\\n }\\n\\n // Check the creation bytecode against the OVM_SafetyChecker.\\n if (ovmSafetyChecker.isBytecodeSafe(_creationCode) == false) {\\n _revertWithFlag(\\n RevertFlag.UNSAFE_BYTECODE,\\n Lib_ErrorUtils.encodeRevertString(\\\"Contract creation code contains unsafe opcodes. Did you use the right compiler or pass an unsafe constructor argument?\\\")\\n );\\n }\\n\\n // We always need to initialize the contract with the default account values.\\n _initPendingAccount(_address);\\n\\n // Actually execute the EVM create message.\\n // NOTE: The inline assembly below means we can NOT make any evm calls between here and then.\\n address ethAddress = Lib_EthUtils.createContract(_creationCode);\\n\\n if (ethAddress == address(0)) {\\n // If the creation fails, the EVM lets us grab its revert data. This may contain a revert flag\\n // to be used above in _handleExternalMessage, so we pass the revert data back up unmodified.\\n assembly {\\n returndatacopy(0,0,returndatasize())\\n revert(0, returndatasize())\\n }\\n }\\n\\n // Again simply checking that the deployed code is safe too. Contracts can generate\\n // arbitrary deployment code, so there's no easy way to analyze this beforehand.\\n bytes memory deployedCode = Lib_EthUtils.getCode(ethAddress);\\n if (ovmSafetyChecker.isBytecodeSafe(deployedCode) == false) {\\n _revertWithFlag(\\n RevertFlag.UNSAFE_BYTECODE,\\n Lib_ErrorUtils.encodeRevertString(\\\"Constructor attempted to deploy unsafe bytecode.\\\")\\n );\\n }\\n\\n // Contract creation didn't need to be reverted and the bytecode is safe. We finish up by\\n // associating the desired address with the newly created contract's code hash and address.\\n _commitPendingAccount(\\n _address,\\n ethAddress,\\n Lib_EthUtils.getCodeHash(ethAddress)\\n );\\n }\\n\\n /******************************************\\n * Internal Functions: State Manipulation *\\n ******************************************/\\n\\n /**\\n * Checks whether an account exists within the OVM_StateManager.\\n * @param _address Address of the account to check.\\n * @return _exists Whether or not the account exists.\\n */\\n function _hasAccount(\\n address _address\\n )\\n internal\\n returns (\\n bool _exists\\n )\\n {\\n _checkAccountLoad(_address);\\n return ovmStateManager.hasAccount(_address);\\n }\\n\\n /**\\n * Checks whether a known empty account exists within the OVM_StateManager.\\n * @param _address Address of the account to check.\\n * @return _exists Whether or not the account empty exists.\\n */\\n function _hasEmptyAccount(\\n address _address\\n )\\n internal\\n returns (\\n bool _exists\\n )\\n {\\n _checkAccountLoad(_address);\\n return ovmStateManager.hasEmptyAccount(_address);\\n }\\n\\n /**\\n * Sets the nonce of an account.\\n * @param _address Address of the account to modify.\\n * @param _nonce New account nonce.\\n */\\n function _setAccountNonce(\\n address _address,\\n uint256 _nonce\\n )\\n internal\\n {\\n _checkAccountChange(_address);\\n ovmStateManager.setAccountNonce(_address, _nonce);\\n }\\n\\n /**\\n * Gets the nonce of an account.\\n * @param _address Address of the account to access.\\n * @return _nonce Nonce of the account.\\n */\\n function _getAccountNonce(\\n address _address\\n )\\n internal\\n returns (\\n uint256 _nonce\\n )\\n {\\n _checkAccountLoad(_address);\\n return ovmStateManager.getAccountNonce(_address);\\n }\\n\\n /**\\n * Retrieves the Ethereum address of an account.\\n * @param _address Address of the account to access.\\n * @return _ethAddress Corresponding Ethereum address.\\n */\\n function _getAccountEthAddress(\\n address _address\\n )\\n internal\\n returns (\\n address _ethAddress\\n )\\n {\\n _checkAccountLoad(_address);\\n return ovmStateManager.getAccountEthAddress(_address);\\n }\\n\\n /**\\n * Creates the default account object for the given address.\\n * @param _address Address of the account create.\\n */\\n function _initPendingAccount(\\n address _address\\n )\\n internal\\n {\\n // Although it seems like `_checkAccountChange` would be more appropriate here, we don't\\n // actually consider an account \\\"changed\\\" until it's inserted into the state (in this case\\n // by `_commitPendingAccount`).\\n _checkAccountLoad(_address);\\n ovmStateManager.initPendingAccount(_address);\\n }\\n\\n /**\\n * Stores additional relevant data for a new account, thereby \\\"committing\\\" it to the state.\\n * This function is only called during `ovmCREATE` and `ovmCREATE2` after a successful contract\\n * creation.\\n * @param _address Address of the account to commit.\\n * @param _ethAddress Address of the associated deployed contract.\\n * @param _codeHash Hash of the code stored at the address.\\n */\\n function _commitPendingAccount(\\n address _address,\\n address _ethAddress,\\n bytes32 _codeHash\\n )\\n internal\\n {\\n _checkAccountChange(_address);\\n ovmStateManager.commitPendingAccount(\\n _address,\\n _ethAddress,\\n _codeHash\\n );\\n }\\n\\n /**\\n * Retrieves the value of a storage slot.\\n * @param _contract Address of the contract to query.\\n * @param _key 32 byte key of the storage slot.\\n * @return _value 32 byte storage slot value.\\n */\\n function _getContractStorage(\\n address _contract,\\n bytes32 _key\\n )\\n internal\\n returns (\\n bytes32 _value\\n )\\n {\\n _checkContractStorageLoad(_contract, _key);\\n return ovmStateManager.getContractStorage(_contract, _key);\\n }\\n\\n /**\\n * Sets the value of a storage slot.\\n * @param _contract Address of the contract to modify.\\n * @param _key 32 byte key of the storage slot.\\n * @param _value 32 byte storage slot value.\\n */\\n function _putContractStorage(\\n address _contract,\\n bytes32 _key,\\n bytes32 _value\\n )\\n internal\\n {\\n // We don't set storage if the value didn't change. Although this acts as a convenient\\n // optimization, it's also necessary to avoid the case in which a contract with no storage\\n // attempts to store the value \\\"0\\\" at any key. Putting this value (and therefore requiring\\n // that the value be committed into the storage trie after execution) would incorrectly\\n // modify the storage root.\\n if (_getContractStorage(_contract, _key) == _value) {\\n return;\\n }\\n\\n _checkContractStorageChange(_contract, _key);\\n ovmStateManager.putContractStorage(_contract, _key, _value);\\n }\\n\\n /**\\n * Validation whenever a contract needs to be loaded. Checks that the account exists, charges\\n * nuisance gas if the account hasn't been loaded before.\\n * @param _address Address of the account to load.\\n */\\n function _checkAccountLoad(\\n address _address\\n )\\n internal\\n {\\n // See `_checkContractStorageLoad` for more information.\\n if (gasleft() < MIN_GAS_FOR_INVALID_STATE_ACCESS) {\\n _revertWithFlag(RevertFlag.OUT_OF_GAS);\\n }\\n\\n // See `_checkContractStorageLoad` for more information.\\n if (ovmStateManager.hasAccount(_address) == false) {\\n _revertWithFlag(RevertFlag.INVALID_STATE_ACCESS);\\n }\\n\\n // Check whether the account has been loaded before and mark it as loaded if not. We need\\n // this because \\\"nuisance gas\\\" only applies to the first time that an account is loaded.\\n (\\n bool _wasAccountAlreadyLoaded\\n ) = ovmStateManager.testAndSetAccountLoaded(_address);\\n\\n // If we hadn't already loaded the account, then we'll need to charge \\\"nuisance gas\\\" based\\n // on the size of the contract code.\\n if (_wasAccountAlreadyLoaded == false) {\\n _useNuisanceGas(\\n (Lib_EthUtils.getCodeSize(_getAccountEthAddress(_address)) * NUISANCE_GAS_PER_CONTRACT_BYTE) + MIN_NUISANCE_GAS_PER_CONTRACT\\n );\\n }\\n }\\n\\n /**\\n * Validation whenever a contract needs to be changed. Checks that the account exists, charges\\n * nuisance gas if the account hasn't been changed before.\\n * @param _address Address of the account to change.\\n */\\n function _checkAccountChange(\\n address _address\\n )\\n internal\\n {\\n // Start by checking for a load as we only want to charge nuisance gas proportional to\\n // contract size once.\\n _checkAccountLoad(_address);\\n\\n // Check whether the account has been changed before and mark it as changed if not. We need\\n // this because \\\"nuisance gas\\\" only applies to the first time that an account is changed.\\n (\\n bool _wasAccountAlreadyChanged\\n ) = ovmStateManager.testAndSetAccountChanged(_address);\\n\\n // If we hadn't already loaded the account, then we'll need to charge \\\"nuisance gas\\\" based\\n // on the size of the contract code.\\n if (_wasAccountAlreadyChanged == false) {\\n ovmStateManager.incrementTotalUncommittedAccounts();\\n _useNuisanceGas(\\n (Lib_EthUtils.getCodeSize(_getAccountEthAddress(_address)) * NUISANCE_GAS_PER_CONTRACT_BYTE) + MIN_NUISANCE_GAS_PER_CONTRACT\\n );\\n }\\n }\\n\\n /**\\n * Validation whenever a slot needs to be loaded. Checks that the account exists, charges\\n * nuisance gas if the slot hasn't been loaded before.\\n * @param _contract Address of the account to load from.\\n * @param _key 32 byte key to load.\\n */\\n function _checkContractStorageLoad(\\n address _contract,\\n bytes32 _key\\n )\\n internal\\n {\\n // Another case of hidden complexity. If we didn't enforce this requirement, then a\\n // contract could pass in just enough gas to cause the INVALID_STATE_ACCESS check to fail\\n // on L1 but not on L2. A contract could use this behavior to prevent the\\n // OVM_ExecutionManager from detecting an invalid state access. Reverting with OUT_OF_GAS\\n // allows us to also charge for the full message nuisance gas, because you deserve that for\\n // trying to break the contract in this way.\\n if (gasleft() < MIN_GAS_FOR_INVALID_STATE_ACCESS) {\\n _revertWithFlag(RevertFlag.OUT_OF_GAS);\\n }\\n\\n // We need to make sure that the transaction isn't trying to access storage that hasn't\\n // been provided to the OVM_StateManager. We'll immediately abort if this is the case.\\n // We know that we have enough gas to do this check because of the above test.\\n if (ovmStateManager.hasContractStorage(_contract, _key) == false) {\\n _revertWithFlag(RevertFlag.INVALID_STATE_ACCESS);\\n }\\n\\n // Check whether the slot has been loaded before and mark it as loaded if not. We need\\n // this because \\\"nuisance gas\\\" only applies to the first time that a slot is loaded.\\n (\\n bool _wasContractStorageAlreadyLoaded\\n ) = ovmStateManager.testAndSetContractStorageLoaded(_contract, _key);\\n\\n // If we hadn't already loaded the account, then we'll need to charge some fixed amount of\\n // \\\"nuisance gas\\\".\\n if (_wasContractStorageAlreadyLoaded == false) {\\n _useNuisanceGas(NUISANCE_GAS_SLOAD);\\n }\\n }\\n\\n /**\\n * Validation whenever a slot needs to be changed. Checks that the account exists, charges\\n * nuisance gas if the slot hasn't been changed before.\\n * @param _contract Address of the account to change.\\n * @param _key 32 byte key to change.\\n */\\n function _checkContractStorageChange(\\n address _contract,\\n bytes32 _key\\n )\\n internal\\n {\\n // Start by checking for load to make sure we have the storage slot and that we charge the\\n // \\\"nuisance gas\\\" necessary to prove the storage slot state.\\n _checkContractStorageLoad(_contract, _key);\\n\\n // Check whether the slot has been changed before and mark it as changed if not. We need\\n // this because \\\"nuisance gas\\\" only applies to the first time that a slot is changed.\\n (\\n bool _wasContractStorageAlreadyChanged\\n ) = ovmStateManager.testAndSetContractStorageChanged(_contract, _key);\\n\\n // If we hadn't already changed the account, then we'll need to charge some fixed amount of\\n // \\\"nuisance gas\\\".\\n if (_wasContractStorageAlreadyChanged == false) {\\n // Changing a storage slot means that we're also going to have to change the\\n // corresponding account, so do an account change check.\\n _checkAccountChange(_contract);\\n\\n ovmStateManager.incrementTotalUncommittedContractStorage();\\n _useNuisanceGas(NUISANCE_GAS_SSTORE);\\n }\\n }\\n\\n\\n /************************************\\n * Internal Functions: Revert Logic *\\n ************************************/\\n\\n /**\\n * Simple encoding for revert data.\\n * @param _flag Flag to revert with.\\n * @param _data Additional user-provided revert data.\\n * @return _revertdata Encoded revert data.\\n */\\n function _encodeRevertData(\\n RevertFlag _flag,\\n bytes memory _data\\n )\\n internal\\n view\\n returns (\\n bytes memory _revertdata\\n )\\n {\\n // Out of gas and create exceptions will fundamentally return no data, so simulating it shouldn't either.\\n if (\\n _flag == RevertFlag.OUT_OF_GAS\\n ) {\\n return bytes('');\\n }\\n\\n // INVALID_STATE_ACCESS doesn't need to return any data other than the flag.\\n if (_flag == RevertFlag.INVALID_STATE_ACCESS) {\\n return abi.encode(\\n _flag,\\n 0,\\n 0,\\n bytes('')\\n );\\n }\\n\\n // Just ABI encode the rest of the parameters.\\n return abi.encode(\\n _flag,\\n messageRecord.nuisanceGasLeft,\\n transactionRecord.ovmGasRefund,\\n _data\\n );\\n }\\n\\n /**\\n * Simple decoding for revert data.\\n * @param _revertdata Revert data to decode.\\n * @return _flag Flag used to revert.\\n * @return _nuisanceGasLeft Amount of nuisance gas unused by the message.\\n * @return _ovmGasRefund Amount of gas refunded during the message.\\n * @return _data Additional user-provided revert data.\\n */\\n function _decodeRevertData(\\n bytes memory _revertdata\\n )\\n internal\\n pure\\n returns (\\n RevertFlag _flag,\\n uint256 _nuisanceGasLeft,\\n uint256 _ovmGasRefund,\\n bytes memory _data\\n )\\n {\\n // A length of zero means the call ran out of gas, just return empty data.\\n if (_revertdata.length == 0) {\\n return (\\n RevertFlag.OUT_OF_GAS,\\n 0,\\n 0,\\n bytes('')\\n );\\n }\\n\\n // ABI decode the incoming data.\\n return abi.decode(_revertdata, (RevertFlag, uint256, uint256, bytes));\\n }\\n\\n /**\\n * Causes a message to revert or abort.\\n * @param _flag Flag to revert with.\\n * @param _data Additional user-provided data.\\n */\\n function _revertWithFlag(\\n RevertFlag _flag,\\n bytes memory _data\\n )\\n internal\\n view\\n {\\n bytes memory revertdata = _encodeRevertData(\\n _flag,\\n _data\\n );\\n\\n assembly {\\n revert(add(revertdata, 0x20), mload(revertdata))\\n }\\n }\\n\\n /**\\n * Causes a message to revert or abort.\\n * @param _flag Flag to revert with.\\n */\\n function _revertWithFlag(\\n RevertFlag _flag\\n )\\n internal\\n {\\n _revertWithFlag(_flag, bytes(''));\\n }\\n\\n\\n /******************************************\\n * Internal Functions: Nuisance Gas Logic *\\n ******************************************/\\n\\n /**\\n * Computes the nuisance gas limit from the gas limit.\\n * @dev This function is currently using a naive implementation whereby the nuisance gas limit\\n * is set to exactly equal the lesser of the gas limit or remaining gas. It's likely that\\n * this implementation is perfectly fine, but we may change this formula later.\\n * @param _gasLimit Gas limit to compute from.\\n * @return _nuisanceGasLimit Computed nuisance gas limit.\\n */\\n function _getNuisanceGasLimit(\\n uint256 _gasLimit\\n )\\n internal\\n view\\n returns (\\n uint256 _nuisanceGasLimit\\n )\\n {\\n return _gasLimit < gasleft() ? _gasLimit : gasleft();\\n }\\n\\n /**\\n * Uses a certain amount of nuisance gas.\\n * @param _amount Amount of nuisance gas to use.\\n */\\n function _useNuisanceGas(\\n uint256 _amount\\n )\\n internal\\n {\\n // Essentially the same as a standard OUT_OF_GAS, except we also retain a record of the gas\\n // refund to be given at the end of the transaction.\\n if (messageRecord.nuisanceGasLeft < _amount) {\\n _revertWithFlag(RevertFlag.EXCEEDS_NUISANCE_GAS);\\n }\\n\\n messageRecord.nuisanceGasLeft -= _amount;\\n }\\n\\n\\n /************************************\\n * Internal Functions: Gas Metering *\\n ************************************/\\n\\n /**\\n * Checks whether a transaction needs to start a new epoch and does so if necessary.\\n * @param _timestamp Transaction timestamp.\\n */\\n function _checkNeedsNewEpoch(\\n uint256 _timestamp\\n )\\n internal\\n {\\n if (\\n _timestamp >= (\\n _getGasMetadata(GasMetadataKey.CURRENT_EPOCH_START_TIMESTAMP)\\n + gasMeterConfig.secondsPerEpoch\\n )\\n ) {\\n _putGasMetadata(\\n GasMetadataKey.CURRENT_EPOCH_START_TIMESTAMP,\\n _timestamp\\n );\\n\\n _putGasMetadata(\\n GasMetadataKey.PREV_EPOCH_SEQUENCER_QUEUE_GAS,\\n _getGasMetadata(\\n GasMetadataKey.CUMULATIVE_SEQUENCER_QUEUE_GAS\\n )\\n );\\n\\n _putGasMetadata(\\n GasMetadataKey.PREV_EPOCH_L1TOL2_QUEUE_GAS,\\n _getGasMetadata(\\n GasMetadataKey.CUMULATIVE_L1TOL2_QUEUE_GAS\\n )\\n );\\n }\\n }\\n\\n /**\\n * Validates the input values of a transaction.\\n * @return _valid Whether or not the transaction data is valid.\\n */\\n function _isValidInput(\\n Lib_OVMCodec.Transaction memory _transaction\\n )\\n view\\n internal\\n returns (\\n bool\\n )\\n {\\n // Prevent reentrancy to run():\\n // This check prevents calling run with the default ovmNumber.\\n // Combined with the first check in run():\\n // if (transactionContext.ovmNUMBER != DEFAULT_UINT256) { return; }\\n // It should be impossible to re-enter since run() returns before any other call frames are created.\\n // Since this value is already being written to storage, we save much gas compared to\\n // using the standard nonReentrant pattern.\\n if (_transaction.blockNumber == DEFAULT_UINT256) {\\n return false;\\n }\\n\\n if (_isValidGasLimit(_transaction.gasLimit, _transaction.l1QueueOrigin) == false) {\\n return false;\\n }\\n\\n return true;\\n }\\n\\n /**\\n * Validates the gas limit for a given transaction.\\n * @param _gasLimit Gas limit provided by the transaction.\\n * param _queueOrigin Queue from which the transaction originated.\\n * @return _valid Whether or not the gas limit is valid.\\n */\\n function _isValidGasLimit(\\n uint256 _gasLimit,\\n Lib_OVMCodec.QueueOrigin // _queueOrigin\\n )\\n view\\n internal\\n returns (\\n bool _valid\\n )\\n {\\n // Always have to be below the maximum gas limit.\\n if (_gasLimit > gasMeterConfig.maxTransactionGasLimit) {\\n return false;\\n }\\n\\n // Always have to be above the minimum gas limit.\\n if (_gasLimit < gasMeterConfig.minTransactionGasLimit) {\\n return false;\\n }\\n\\n // TEMPORARY: Gas metering is disabled for minnet.\\n return true;\\n // GasMetadataKey cumulativeGasKey;\\n // GasMetadataKey prevEpochGasKey;\\n // if (_queueOrigin == Lib_OVMCodec.QueueOrigin.SEQUENCER_QUEUE) {\\n // cumulativeGasKey = GasMetadataKey.CUMULATIVE_SEQUENCER_QUEUE_GAS;\\n // prevEpochGasKey = GasMetadataKey.PREV_EPOCH_SEQUENCER_QUEUE_GAS;\\n // } else {\\n // cumulativeGasKey = GasMetadataKey.CUMULATIVE_L1TOL2_QUEUE_GAS;\\n // prevEpochGasKey = GasMetadataKey.PREV_EPOCH_L1TOL2_QUEUE_GAS;\\n // }\\n\\n // return (\\n // (\\n // _getGasMetadata(cumulativeGasKey)\\n // - _getGasMetadata(prevEpochGasKey)\\n // + _gasLimit\\n // ) < gasMeterConfig.maxGasPerQueuePerEpoch\\n // );\\n }\\n\\n /**\\n * Updates the cumulative gas after a transaction.\\n * @param _gasUsed Gas used by the transaction.\\n * @param _queueOrigin Queue from which the transaction originated.\\n */\\n function _updateCumulativeGas(\\n uint256 _gasUsed,\\n Lib_OVMCodec.QueueOrigin _queueOrigin\\n )\\n internal\\n {\\n GasMetadataKey cumulativeGasKey;\\n if (_queueOrigin == Lib_OVMCodec.QueueOrigin.SEQUENCER_QUEUE) {\\n cumulativeGasKey = GasMetadataKey.CUMULATIVE_SEQUENCER_QUEUE_GAS;\\n } else {\\n cumulativeGasKey = GasMetadataKey.CUMULATIVE_L1TOL2_QUEUE_GAS;\\n }\\n\\n _putGasMetadata(\\n cumulativeGasKey,\\n (\\n _getGasMetadata(cumulativeGasKey)\\n + gasMeterConfig.minTransactionGasLimit\\n + _gasUsed\\n - transactionRecord.ovmGasRefund\\n )\\n );\\n }\\n\\n /**\\n * Retrieves the value of a gas metadata key.\\n * @param _key Gas metadata key to retrieve.\\n * @return _value Value stored at the given key.\\n */\\n function _getGasMetadata(\\n GasMetadataKey _key\\n )\\n internal\\n returns (\\n uint256 _value\\n )\\n {\\n return uint256(_getContractStorage(\\n GAS_METADATA_ADDRESS,\\n bytes32(uint256(_key))\\n ));\\n }\\n\\n /**\\n * Sets the value of a gas metadata key.\\n * @param _key Gas metadata key to set.\\n * @param _value Value to store at the given key.\\n */\\n function _putGasMetadata(\\n GasMetadataKey _key,\\n uint256 _value\\n )\\n internal\\n {\\n _putContractStorage(\\n GAS_METADATA_ADDRESS,\\n bytes32(uint256(_key)),\\n bytes32(uint256(_value))\\n );\\n }\\n\\n\\n /*****************************************\\n * Internal Functions: Execution Context *\\n *****************************************/\\n\\n /**\\n * Swaps over to a new message context.\\n * @param _prevMessageContext Context we're switching from.\\n * @param _nextMessageContext Context we're switching to.\\n */\\n function _switchMessageContext(\\n MessageContext memory _prevMessageContext,\\n MessageContext memory _nextMessageContext\\n )\\n internal\\n {\\n // Avoid unnecessary the SSTORE.\\n if (_prevMessageContext.ovmCALLER != _nextMessageContext.ovmCALLER) {\\n messageContext.ovmCALLER = _nextMessageContext.ovmCALLER;\\n }\\n\\n // Avoid unnecessary the SSTORE.\\n if (_prevMessageContext.ovmADDRESS != _nextMessageContext.ovmADDRESS) {\\n messageContext.ovmADDRESS = _nextMessageContext.ovmADDRESS;\\n }\\n\\n // Avoid unnecessary the SSTORE.\\n if (_prevMessageContext.isStatic != _nextMessageContext.isStatic) {\\n messageContext.isStatic = _nextMessageContext.isStatic;\\n }\\n }\\n\\n /**\\n * Initializes the execution context.\\n * @param _transaction OVM transaction being executed.\\n */\\n function _initContext(\\n Lib_OVMCodec.Transaction memory _transaction\\n )\\n internal\\n {\\n transactionContext.ovmTIMESTAMP = _transaction.timestamp;\\n transactionContext.ovmNUMBER = _transaction.blockNumber;\\n transactionContext.ovmTXGASLIMIT = _transaction.gasLimit;\\n transactionContext.ovmL1QUEUEORIGIN = _transaction.l1QueueOrigin;\\n transactionContext.ovmL1TXORIGIN = _transaction.l1TxOrigin;\\n transactionContext.ovmGASLIMIT = gasMeterConfig.maxGasPerQueuePerEpoch;\\n\\n messageRecord.nuisanceGasLeft = _getNuisanceGasLimit(_transaction.gasLimit);\\n }\\n\\n /**\\n * Resets the transaction and message context.\\n */\\n function _resetContext()\\n internal\\n {\\n transactionContext.ovmL1TXORIGIN = DEFAULT_ADDRESS;\\n transactionContext.ovmTIMESTAMP = DEFAULT_UINT256;\\n transactionContext.ovmNUMBER = DEFAULT_UINT256;\\n transactionContext.ovmGASLIMIT = DEFAULT_UINT256;\\n transactionContext.ovmTXGASLIMIT = DEFAULT_UINT256;\\n transactionContext.ovmL1QUEUEORIGIN = Lib_OVMCodec.QueueOrigin.SEQUENCER_QUEUE;\\n\\n transactionRecord.ovmGasRefund = DEFAULT_UINT256;\\n\\n messageContext.ovmCALLER = DEFAULT_ADDRESS;\\n messageContext.ovmADDRESS = DEFAULT_ADDRESS;\\n messageContext.isStatic = false;\\n\\n messageRecord.nuisanceGasLeft = DEFAULT_UINT256;\\n\\n // Reset the ovmStateManager.\\n ovmStateManager = iOVM_StateManager(address(0));\\n }\\n\\n /*****************************\\n * L2-only Helper Functions *\\n *****************************/\\n\\n /**\\n * Unreachable helper function for simulating eth_calls with an OVM message context.\\n * This function will throw an exception in all cases other than when used as a custom entrypoint in L2 Geth to simulate eth_call.\\n * @param _transaction the message transaction to simulate.\\n * @param _from the OVM account the simulated call should be from.\\n */\\n function simulateMessage(\\n Lib_OVMCodec.Transaction memory _transaction,\\n address _from,\\n iOVM_StateManager _ovmStateManager\\n )\\n external\\n returns (\\n bool,\\n bytes memory\\n )\\n {\\n // Prevent this call from having any effect unless in a custom-set VM frame\\n require(msg.sender == address(0));\\n\\n ovmStateManager = _ovmStateManager;\\n _initContext(_transaction);\\n messageRecord.nuisanceGasLeft = uint(-1);\\n\\n messageContext.ovmADDRESS = _from;\\n\\n bool isCreate = _transaction.entrypoint == address(0);\\n if (isCreate) {\\n (address created, bytes memory revertData) = ovmCREATE(_transaction.data);\\n if (created == address(0)) {\\n return (false, revertData);\\n } else {\\n // The eth_call RPC endpoint for to = undefined will return the deployed bytecode\\n // in the success case, differing from standard create messages.\\n return (true, Lib_EthUtils.getCode(created));\\n }\\n } else {\\n return ovmCALL(\\n _transaction.gasLimit,\\n _transaction.entrypoint,\\n _transaction.data\\n );\\n }\\n }\\n}\\n\",\"keccak256\":\"0x6d2f2c75fd5e494c53573b90cd1a06f3382a6fac3ea5bcbd1082acea2b0762c4\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/predeploys/OVM_DeployerWhitelist.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Interface Imports */\\nimport { iOVM_DeployerWhitelist } from \\\"../../iOVM/predeploys/iOVM_DeployerWhitelist.sol\\\";\\n\\n/**\\n * @title OVM_DeployerWhitelist\\n * @dev The Deployer Whitelist is a temporary predeploy used to provide additional safety during the\\n * initial phases of our mainnet roll out. It is owned by the Optimism team, and defines accounts\\n * which are allowed to deploy contracts on Layer2. The Execution Manager will only allow an\\n * ovmCREATE or ovmCREATE2 operation to proceed if the deployer's address whitelisted.\\n *\\n * Compiler used: optimistic-solc\\n * Runtime target: OVM\\n */\\ncontract OVM_DeployerWhitelist is iOVM_DeployerWhitelist {\\n\\n /**********************\\n * Contract Constants *\\n **********************/\\n\\n bool public initialized;\\n bool public allowArbitraryDeployment;\\n address override public owner;\\n mapping (address => bool) public whitelist;\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n /**\\n * Blocks functions to anyone except the contract owner.\\n */\\n modifier onlyOwner() {\\n require(\\n msg.sender == owner,\\n \\\"Function can only be called by the owner of this contract.\\\"\\n );\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Initializes the whitelist.\\n * @param _owner Address of the owner for this contract.\\n * @param _allowArbitraryDeployment Whether or not to allow arbitrary contract deployment.\\n */\\n function initialize(\\n address _owner,\\n bool _allowArbitraryDeployment\\n )\\n override\\n public\\n {\\n if (initialized == true) {\\n return;\\n }\\n\\n initialized = true;\\n allowArbitraryDeployment = _allowArbitraryDeployment;\\n owner = _owner;\\n }\\n\\n /**\\n * Adds or removes an address from the deployment whitelist.\\n * @param _deployer Address to update permissions for.\\n * @param _isWhitelisted Whether or not the address is whitelisted.\\n */\\n function setWhitelistedDeployer(\\n address _deployer,\\n bool _isWhitelisted\\n )\\n override\\n public\\n onlyOwner\\n {\\n whitelist[_deployer] = _isWhitelisted;\\n }\\n\\n /**\\n * Updates the owner of this contract.\\n * @param _owner Address of the new owner.\\n */\\n function setOwner(\\n address _owner\\n )\\n override\\n public\\n onlyOwner\\n {\\n owner = _owner;\\n }\\n\\n /**\\n * Updates the arbitrary deployment flag.\\n * @param _allowArbitraryDeployment Whether or not to allow arbitrary contract deployment.\\n */\\n function setAllowArbitraryDeployment(\\n bool _allowArbitraryDeployment\\n )\\n override\\n public\\n onlyOwner\\n {\\n allowArbitraryDeployment = _allowArbitraryDeployment;\\n }\\n\\n /**\\n * Permanently enables arbitrary contract deployment and deletes the owner.\\n */\\n function enableArbitraryContractDeployment()\\n override\\n public\\n onlyOwner\\n {\\n setAllowArbitraryDeployment(true);\\n setOwner(address(0));\\n }\\n\\n /**\\n * Checks whether an address is allowed to deploy contracts.\\n * @param _deployer Address to check.\\n * @return _allowed Whether or not the address can deploy contracts.\\n */\\n function isDeployerAllowed(\\n address _deployer\\n )\\n override\\n public\\n returns (\\n bool\\n )\\n {\\n return (\\n initialized == false\\n || allowArbitraryDeployment == true\\n || whitelist[_deployer]\\n );\\n }\\n}\\n\",\"keccak256\":\"0x371e3d3ca1dd4177738b55eead9ad6f8278280e568694df6b42ee01f5558ccb2\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_CanonicalTransactionChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_ChainStorageContainer } from \\\"./iOVM_ChainStorageContainer.sol\\\";\\n\\n/**\\n * @title iOVM_CanonicalTransactionChain\\n */\\ninterface iOVM_CanonicalTransactionChain {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event TransactionEnqueued(\\n address _l1TxOrigin,\\n address _target,\\n uint256 _gasLimit,\\n bytes _data,\\n uint256 _queueIndex,\\n uint256 _timestamp\\n );\\n\\n event QueueBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event SequencerBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event TransactionBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct BatchContext {\\n uint256 numSequencedTransactions;\\n uint256 numSubsequentQueueTransactions;\\n uint256 timestamp;\\n uint256 blockNumber;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n\\n /**\\n * Accesses the batch storage container.\\n * @return Reference to the batch storage container.\\n */\\n function batches()\\n external\\n view\\n returns (\\n iOVM_ChainStorageContainer\\n );\\n\\n /**\\n * Accesses the queue storage container.\\n * @return Reference to the queue storage container.\\n */\\n function queue()\\n external\\n view\\n returns (\\n iOVM_ChainStorageContainer\\n );\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements()\\n external\\n view\\n returns (\\n uint256 _totalElements\\n );\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches()\\n external\\n view\\n returns (\\n uint256 _totalBatches\\n );\\n\\n /**\\n * Returns the index of the next element to be enqueued.\\n * @return Index for the next queue element.\\n */\\n function getNextQueueIndex()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Gets the queue element at a particular index.\\n * @param _index Index of the queue element to access.\\n * @return _element Queue element at the given index.\\n */\\n function getQueueElement(\\n uint256 _index\\n )\\n external\\n view\\n returns (\\n Lib_OVMCodec.QueueElement memory _element\\n );\\n\\n /**\\n * Returns the timestamp of the last transaction.\\n * @return Timestamp for the last transaction.\\n */\\n function getLastTimestamp()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Returns the blocknumber of the last transaction.\\n * @return Blocknumber for the last transaction.\\n */\\n function getLastBlockNumber()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Get the number of queue elements which have not yet been included.\\n * @return Number of pending queue elements.\\n */\\n function getNumPendingQueueElements()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Retrieves the length of the queue, including\\n * both pending and canonical transactions.\\n * @return Length of the queue.\\n */\\n function getQueueLength()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n\\n /**\\n * Adds a transaction to the queue.\\n * @param _target Target contract to send the transaction to.\\n * @param _gasLimit Gas limit for the given transaction.\\n * @param _data Transaction data.\\n */\\n function enqueue(\\n address _target,\\n uint256 _gasLimit,\\n bytes memory _data\\n )\\n external;\\n\\n /**\\n * Appends a given number of queued transactions as a single batch.\\n * @param _numQueuedTransactions Number of transactions to append.\\n */\\n function appendQueueBatch(\\n uint256 _numQueuedTransactions\\n )\\n external;\\n\\n /**\\n * Allows the sequencer to append a batch of transactions.\\n * @dev This function uses a custom encoding scheme for efficiency reasons.\\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\\n * .param _contexts Array of batch contexts.\\n * .param _transactionDataFields Array of raw transaction data.\\n */\\n function appendSequencerBatch(\\n // uint40 _shouldStartAtElement,\\n // uint24 _totalElementsToAppend,\\n // BatchContext[] _contexts,\\n // bytes[] _transactionDataFields\\n )\\n external;\\n\\n /**\\n * Verifies whether a transaction is included in the chain.\\n * @param _transaction Transaction to verify.\\n * @param _txChainElement Transaction chain element corresponding to the transaction.\\n * @param _batchHeader Header of the batch the transaction was included in.\\n * @param _inclusionProof Inclusion proof for the provided transaction chain element.\\n * @return True if the transaction exists in the CTC, false if not.\\n */\\n function verifyTransaction(\\n Lib_OVMCodec.Transaction memory _transaction,\\n Lib_OVMCodec.TransactionChainElement memory _txChainElement,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _inclusionProof\\n )\\n external\\n view\\n returns (\\n bool\\n );\\n}\\n\",\"keccak256\":\"0xb5e55488a1982841c07cdf5ff475da4789596f111dd48f01b1918ee4c775cf3a\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_ChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title iOVM_ChainStorageContainer\\n */\\ninterface iOVM_ChainStorageContainer {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata()\\n external\\n view\\n returns (\\n bytes27\\n );\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length()\\n external\\n view\\n returns (\\n uint256\\n );\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(\\n bytes32 _object\\n )\\n external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(\\n bytes32 _object,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(\\n uint256 _index\\n )\\n external\\n view\\n returns (\\n bytes32\\n );\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index\\n )\\n external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Marks an index as overwritable, meaing the underlying buffer can start to write values over\\n * any objects before and including the given index.\\n */\\n function setNextOverwritableIndex(\\n uint256 _index\\n )\\n external;\\n}\\n\",\"keccak256\":\"0x2d7973a0ad84c23ec62624d3f1e3aeb198cc72686ff1e6cfa17155556b320c94\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/execution/iOVM_ExecutionManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\ninterface iOVM_ExecutionManager {\\n /**********\\n * Enums *\\n *********/\\n\\n enum RevertFlag {\\n OUT_OF_GAS,\\n INTENTIONAL_REVERT,\\n EXCEEDS_NUISANCE_GAS,\\n INVALID_STATE_ACCESS,\\n UNSAFE_BYTECODE,\\n CREATE_COLLISION,\\n STATIC_VIOLATION,\\n CREATOR_NOT_ALLOWED\\n }\\n\\n enum GasMetadataKey {\\n CURRENT_EPOCH_START_TIMESTAMP,\\n CUMULATIVE_SEQUENCER_QUEUE_GAS,\\n CUMULATIVE_L1TOL2_QUEUE_GAS,\\n PREV_EPOCH_SEQUENCER_QUEUE_GAS,\\n PREV_EPOCH_L1TOL2_QUEUE_GAS\\n }\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct GasMeterConfig {\\n uint256 minTransactionGasLimit;\\n uint256 maxTransactionGasLimit;\\n uint256 maxGasPerQueuePerEpoch;\\n uint256 secondsPerEpoch;\\n }\\n\\n struct GlobalContext {\\n uint256 ovmCHAINID;\\n }\\n\\n struct TransactionContext {\\n Lib_OVMCodec.QueueOrigin ovmL1QUEUEORIGIN;\\n uint256 ovmTIMESTAMP;\\n uint256 ovmNUMBER;\\n uint256 ovmGASLIMIT;\\n uint256 ovmTXGASLIMIT;\\n address ovmL1TXORIGIN;\\n }\\n\\n struct TransactionRecord {\\n uint256 ovmGasRefund;\\n }\\n\\n struct MessageContext {\\n address ovmCALLER;\\n address ovmADDRESS;\\n bool isStatic;\\n }\\n\\n struct MessageRecord {\\n uint256 nuisanceGasLeft;\\n }\\n\\n\\n /************************************\\n * Transaction Execution Entrypoint *\\n ************************************/\\n\\n function run(\\n Lib_OVMCodec.Transaction calldata _transaction,\\n address _txStateManager\\n ) external returns (bytes memory);\\n\\n\\n /*******************\\n * Context Opcodes *\\n *******************/\\n\\n function ovmCALLER() external view returns (address _caller);\\n function ovmADDRESS() external view returns (address _address);\\n function ovmTIMESTAMP() external view returns (uint256 _timestamp);\\n function ovmNUMBER() external view returns (uint256 _number);\\n function ovmGASLIMIT() external view returns (uint256 _gasLimit);\\n function ovmCHAINID() external view returns (uint256 _chainId);\\n\\n\\n /**********************\\n * L2 Context Opcodes *\\n **********************/\\n\\n function ovmL1QUEUEORIGIN() external view returns (Lib_OVMCodec.QueueOrigin _queueOrigin);\\n function ovmL1TXORIGIN() external view returns (address _l1TxOrigin);\\n\\n\\n /*******************\\n * Halting Opcodes *\\n *******************/\\n\\n function ovmREVERT(bytes memory _data) external;\\n\\n\\n /*****************************\\n * Contract Creation Opcodes *\\n *****************************/\\n\\n function ovmCREATE(bytes memory _bytecode) external returns (address _contract, bytes memory _revertdata);\\n function ovmCREATE2(bytes memory _bytecode, bytes32 _salt) external returns (address _contract, bytes memory _revertdata);\\n\\n\\n /*******************************\\n * Account Abstraction Opcodes *\\n ******************************/\\n\\n function ovmGETNONCE() external returns (uint256 _nonce);\\n function ovmINCREMENTNONCE() external;\\n function ovmCREATEEOA(bytes32 _messageHash, uint8 _v, bytes32 _r, bytes32 _s) external;\\n\\n\\n /****************************\\n * Contract Calling Opcodes *\\n ****************************/\\n\\n function ovmCALL(uint256 _gasLimit, address _address, bytes memory _calldata) external returns (bool _success, bytes memory _returndata);\\n function ovmSTATICCALL(uint256 _gasLimit, address _address, bytes memory _calldata) external returns (bool _success, bytes memory _returndata);\\n function ovmDELEGATECALL(uint256 _gasLimit, address _address, bytes memory _calldata) external returns (bool _success, bytes memory _returndata);\\n\\n\\n /****************************\\n * Contract Storage Opcodes *\\n ****************************/\\n\\n function ovmSLOAD(bytes32 _key) external returns (bytes32 _value);\\n function ovmSSTORE(bytes32 _key, bytes32 _value) external;\\n\\n\\n /*************************\\n * Contract Code Opcodes *\\n *************************/\\n\\n function ovmEXTCODECOPY(address _contract, uint256 _offset, uint256 _length) external returns (bytes memory _code);\\n function ovmEXTCODESIZE(address _contract) external returns (uint256 _size);\\n function ovmEXTCODEHASH(address _contract) external returns (bytes32 _hash);\\n\\n\\n /***************************************\\n * Public Functions: Execution Context *\\n ***************************************/\\n\\n function getMaxTransactionGasLimit() external view returns (uint _maxTransactionGasLimit);\\n}\\n\",\"keccak256\":\"0xf023d5d6fc6a03bd52f7a57af6e21076de77e8925d065bb79db062e73e43b684\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/execution/iOVM_SafetyChecker.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title iOVM_SafetyChecker\\n */\\ninterface iOVM_SafetyChecker {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function isBytecodeSafe(bytes calldata _bytecode) external pure returns (bool);\\n}\\n\",\"keccak256\":\"0xde6639676d4ec4f77297652d5ede2429bc93e74e11fefd9e9de4bc92dd784878\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/execution/iOVM_StateManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title iOVM_StateManager\\n */\\ninterface iOVM_StateManager {\\n\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n enum ItemState {\\n ITEM_UNTOUCHED,\\n ITEM_LOADED,\\n ITEM_CHANGED,\\n ITEM_COMMITTED\\n }\\n\\n /***************************\\n * Public Functions: Misc *\\n ***************************/\\n\\n function isAuthenticated(address _address) external view returns (bool);\\n\\n /***************************\\n * Public Functions: Setup *\\n ***************************/\\n\\n function owner() external view returns (address _owner);\\n function ovmExecutionManager() external view returns (address _ovmExecutionManager);\\n function setExecutionManager(address _ovmExecutionManager) external;\\n\\n\\n /************************************\\n * Public Functions: Account Access *\\n ************************************/\\n\\n function putAccount(address _address, Lib_OVMCodec.Account memory _account) external;\\n function putEmptyAccount(address _address) external;\\n function getAccount(address _address) external view returns (Lib_OVMCodec.Account memory _account);\\n function hasAccount(address _address) external view returns (bool _exists);\\n function hasEmptyAccount(address _address) external view returns (bool _exists);\\n function setAccountNonce(address _address, uint256 _nonce) external;\\n function getAccountNonce(address _address) external view returns (uint256 _nonce);\\n function getAccountEthAddress(address _address) external view returns (address _ethAddress);\\n function getAccountStorageRoot(address _address) external view returns (bytes32 _storageRoot);\\n function initPendingAccount(address _address) external;\\n function commitPendingAccount(address _address, address _ethAddress, bytes32 _codeHash) external;\\n function testAndSetAccountLoaded(address _address) external returns (bool _wasAccountAlreadyLoaded);\\n function testAndSetAccountChanged(address _address) external returns (bool _wasAccountAlreadyChanged);\\n function commitAccount(address _address) external returns (bool _wasAccountCommitted);\\n function incrementTotalUncommittedAccounts() external;\\n function getTotalUncommittedAccounts() external view returns (uint256 _total);\\n function wasAccountChanged(address _address) external view returns (bool);\\n function wasAccountCommitted(address _address) external view returns (bool);\\n\\n\\n /************************************\\n * Public Functions: Storage Access *\\n ************************************/\\n\\n function putContractStorage(address _contract, bytes32 _key, bytes32 _value) external;\\n function getContractStorage(address _contract, bytes32 _key) external view returns (bytes32 _value);\\n function hasContractStorage(address _contract, bytes32 _key) external view returns (bool _exists);\\n function testAndSetContractStorageLoaded(address _contract, bytes32 _key) external returns (bool _wasContractStorageAlreadyLoaded);\\n function testAndSetContractStorageChanged(address _contract, bytes32 _key) external returns (bool _wasContractStorageAlreadyChanged);\\n function commitContractStorage(address _contract, bytes32 _key) external returns (bool _wasContractStorageCommitted);\\n function incrementTotalUncommittedContractStorage() external;\\n function getTotalUncommittedContractStorage() external view returns (uint256 _total);\\n function wasContractStorageChanged(address _contract, bytes32 _key) external view returns (bool);\\n function wasContractStorageCommitted(address _contract, bytes32 _key) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x7a11dbd1f61593ba34debe07e39eef59967307f7f372ba9855bee0953585d08d\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/predeploys/iOVM_DeployerWhitelist.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title iOVM_DeployerWhitelist\\n */\\ninterface iOVM_DeployerWhitelist {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function initialize(address _owner, bool _allowArbitraryDeployment) external;\\n function owner() external returns (address _owner);\\n function setWhitelistedDeployer(address _deployer, bool _isWhitelisted) external;\\n function setOwner(address _newOwner) external;\\n function setAllowArbitraryDeployment(bool _allowArbitraryDeployment) external;\\n function enableArbitraryContractDeployment() external;\\n function isDeployerAllowed(address _deployer) external returns (bool _allowed);\\n}\\n\",\"keccak256\":\"0xdf1f27faf0d26d416bf6d408d146a16de32b4e1772a292c65d39eb7ec2b53ceb\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/codec/Lib_OVMCodec.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../utils/Lib_Bytes32Utils.sol\\\";\\n\\n/**\\n * @title Lib_OVMCodec\\n */\\nlibrary Lib_OVMCodec {\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum QueueOrigin {\\n SEQUENCER_QUEUE,\\n L1TOL2_QUEUE\\n }\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Account {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n address ethAddress;\\n bool isFresh;\\n }\\n\\n struct EVMAccount {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n }\\n\\n struct ChainBatchHeader {\\n uint256 batchIndex;\\n bytes32 batchRoot;\\n uint256 batchSize;\\n uint256 prevTotalElements;\\n bytes extraData;\\n }\\n\\n struct ChainInclusionProof {\\n uint256 index;\\n bytes32[] siblings;\\n }\\n\\n struct Transaction {\\n uint256 timestamp;\\n uint256 blockNumber;\\n QueueOrigin l1QueueOrigin;\\n address l1TxOrigin;\\n address entrypoint;\\n uint256 gasLimit;\\n bytes data;\\n }\\n\\n struct TransactionChainElement {\\n bool isSequenced;\\n uint256 queueIndex; // QUEUED TX ONLY\\n uint256 timestamp; // SEQUENCER TX ONLY\\n uint256 blockNumber; // SEQUENCER TX ONLY\\n bytes txData; // SEQUENCER TX ONLY\\n }\\n\\n struct QueueElement {\\n bytes32 transactionHash;\\n uint40 timestamp;\\n uint40 blockNumber;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Encodes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Encoded transaction bytes.\\n */\\n function encodeTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return abi.encodePacked(\\n _transaction.timestamp,\\n _transaction.blockNumber,\\n _transaction.l1QueueOrigin,\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n );\\n }\\n\\n /**\\n * Hashes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Hashed transaction\\n */\\n function hashTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(encodeTransaction(_transaction));\\n }\\n\\n /**\\n * Converts an OVM account to an EVM account.\\n * @param _in OVM account to convert.\\n * @return Converted EVM account.\\n */\\n function toEVMAccount(\\n Account memory _in\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n return EVMAccount({\\n nonce: _in.nonce,\\n balance: _in.balance,\\n storageRoot: _in.storageRoot,\\n codeHash: _in.codeHash\\n });\\n }\\n\\n /**\\n * @notice RLP-encodes an account state struct.\\n * @param _account Account state struct.\\n * @return RLP-encoded account state.\\n */\\n function encodeEVMAccount(\\n EVMAccount memory _account\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes[] memory raw = new bytes[](4);\\n\\n // Unfortunately we can't create this array outright because\\n // Lib_RLPWriter.writeList will reject fixed-size arrays. Assigning\\n // index-by-index circumvents this issue.\\n raw[0] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.nonce)\\n )\\n );\\n raw[1] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.balance)\\n )\\n );\\n raw[2] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.storageRoot));\\n raw[3] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.codeHash));\\n\\n return Lib_RLPWriter.writeList(raw);\\n }\\n\\n /**\\n * @notice Decodes an RLP-encoded account state into a useful struct.\\n * @param _encoded RLP-encoded account state.\\n * @return Account state struct.\\n */\\n function decodeEVMAccount(\\n bytes memory _encoded\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\\n\\n return EVMAccount({\\n nonce: Lib_RLPReader.readUint256(accountState[0]),\\n balance: Lib_RLPReader.readUint256(accountState[1]),\\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\\n });\\n }\\n\\n /**\\n * Calculates a hash for a given batch header.\\n * @param _batchHeader Header to hash.\\n * @return Hash of the header.\\n */\\n function hashBatchHeader(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(\\n abi.encode(\\n _batchHeader.batchRoot,\\n _batchHeader.batchSize,\\n _batchHeader.prevTotalElements,\\n _batchHeader.extraData\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0xd85ba2066057a2677926f484b938c7c2ef33ff3853f3b71cda252f4a54f30e05\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n public\\n onlyOwner\\n {\\n addresses[_getNameHash(_name)] = _address;\\n\\n emit AddressSet(\\n _name,\\n _address\\n );\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0x2ce671a0e004df88b136bea5a3c59d0732cea8887c8496da1d509e0200b03d7d\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(\\n address _libAddressManager\\n ) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x65981feeabff6a81783ea97d44baf988a18a86c8cb374c46fdb71819cbacc7c0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPReader.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_RLPReader\\n * @dev Adapted from \\\"RLPReader\\\" by Hamdi Allam (hamdi.allam97@gmail.com).\\n */\\nlibrary Lib_RLPReader {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 constant internal MAX_LIST_LENGTH = 32;\\n\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum RLPItemType {\\n DATA_ITEM,\\n LIST_ITEM\\n }\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct RLPItem {\\n uint256 length;\\n uint256 ptr;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts bytes to a reference to memory position and length.\\n * @param _in Input bytes to convert.\\n * @return Output memory reference.\\n */\\n function toRLPItem(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem memory\\n )\\n {\\n uint256 ptr;\\n assembly {\\n ptr := add(_in, 32)\\n }\\n\\n return RLPItem({\\n length: _in.length,\\n ptr: ptr\\n });\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n (\\n uint256 listOffset,\\n ,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.LIST_ITEM,\\n \\\"Invalid RLP list value.\\\"\\n );\\n\\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\\n // writing to the length. Since we can't know the number of RLP items without looping over\\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\\n // simply set a reasonable maximum list length and decrease the size before we finish.\\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\\n\\n uint256 itemCount = 0;\\n uint256 offset = listOffset;\\n while (offset < _in.length) {\\n require(\\n itemCount < MAX_LIST_LENGTH,\\n \\\"Provided RLP list exceeds max list length.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n ) = _decodeLength(RLPItem({\\n length: _in.length - offset,\\n ptr: _in.ptr + offset\\n }));\\n\\n out[itemCount] = RLPItem({\\n length: itemLength + itemOffset,\\n ptr: _in.ptr + offset\\n });\\n\\n itemCount += 1;\\n offset += itemOffset + itemLength;\\n }\\n\\n // Decrease the array size to match the actual item count.\\n assembly {\\n mstore(out, itemCount)\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n return readList(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes value.\\\"\\n );\\n\\n return _copy(_in.ptr, itemOffset, itemLength);\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return readBytes(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return string(readBytes(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return readString(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n require(\\n _in.length <= 33,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr + itemOffset;\\n bytes32 out;\\n assembly {\\n out := mload(ptr)\\n\\n // Shift the bytes over to match the item size.\\n if lt(itemLength, 32) {\\n out := div(out, exp(256, sub(32, itemLength)))\\n }\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return readBytes32(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return uint256(readBytes32(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return readUint256(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n require(\\n _in.length == 1,\\n \\\"Invalid RLP boolean value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 out;\\n assembly {\\n out := byte(0, mload(ptr))\\n }\\n\\n require(\\n out == 0 || out == 1,\\n \\\"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\\\"\\n );\\n\\n return out != 0;\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return readBool(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n if (_in.length == 1) {\\n return address(0);\\n }\\n\\n require(\\n _in.length == 21,\\n \\\"Invalid RLP address value.\\\"\\n );\\n\\n return address(readUint256(_in));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return readAddress(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads the raw bytes of an RLP item.\\n * @param _in RLP item to read.\\n * @return Raw RLP bytes.\\n */\\n function readRawBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in);\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Decodes the length of an RLP item.\\n * @param _in RLP item to decode.\\n * @return Offset of the encoded data.\\n * @return Length of the encoded data.\\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\\n */\\n function _decodeLength(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n uint256,\\n uint256,\\n RLPItemType\\n )\\n {\\n require(\\n _in.length > 0,\\n \\\"RLP item cannot be null.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 prefix;\\n assembly {\\n prefix := byte(0, mload(ptr))\\n }\\n\\n if (prefix <= 0x7f) {\\n // Single byte.\\n\\n return (0, 1, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xb7) {\\n // Short string.\\n\\n uint256 strLen = prefix - 0x80;\\n\\n require(\\n _in.length > strLen,\\n \\\"Invalid RLP short string.\\\"\\n );\\n\\n return (1, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xbf) {\\n // Long string.\\n uint256 lenOfStrLen = prefix - 0xb7;\\n\\n require(\\n _in.length > lenOfStrLen,\\n \\\"Invalid RLP long string length.\\\"\\n );\\n\\n uint256 strLen;\\n assembly {\\n // Pick out the string length.\\n strLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfStrLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfStrLen + strLen,\\n \\\"Invalid RLP long string.\\\"\\n );\\n\\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xf7) {\\n // Short list.\\n uint256 listLen = prefix - 0xc0;\\n\\n require(\\n _in.length > listLen,\\n \\\"Invalid RLP short list.\\\"\\n );\\n\\n return (1, listLen, RLPItemType.LIST_ITEM);\\n } else {\\n // Long list.\\n uint256 lenOfListLen = prefix - 0xf7;\\n\\n require(\\n _in.length > lenOfListLen,\\n \\\"Invalid RLP long list length.\\\"\\n );\\n\\n uint256 listLen;\\n assembly {\\n // Pick out the list length.\\n listLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfListLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfListLen + listLen,\\n \\\"Invalid RLP long list.\\\"\\n );\\n\\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\\n }\\n }\\n\\n /**\\n * Copies the bytes from a memory location.\\n * @param _src Pointer to the location to read from.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Copied bytes.\\n */\\n function _copy(\\n uint256 _src,\\n uint256 _offset,\\n uint256 _length\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out = new bytes(_length);\\n if (out.length == 0) {\\n return out;\\n }\\n\\n uint256 src = _src + _offset;\\n uint256 dest;\\n assembly {\\n dest := add(out, 32)\\n }\\n\\n // Copy over as many complete words as we can.\\n for (uint256 i = 0; i < _length / 32; i++) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n\\n src += 32;\\n dest += 32;\\n }\\n\\n // Pick out the remaining bytes.\\n uint256 mask = 256 ** (32 - (_length % 32)) - 1;\\n assembly {\\n mstore(\\n dest,\\n or(\\n and(mload(src), not(mask)),\\n and(mload(dest), mask)\\n )\\n )\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Copies an RLP item into bytes.\\n * @param _in RLP item to copy.\\n * @return Copied bytes.\\n */\\n function _copy(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in.ptr, 0, _in.length);\\n }\\n}\\n\",\"keccak256\":\"0x829174c61216dce35fdb888383b6022e0365eb7fbdc71ad79d98b108091969fe\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPWriter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/**\\n * @title Lib_RLPWriter\\n * @author Bakaoh (with modifications)\\n */\\nlibrary Lib_RLPWriter {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * RLP encodes a byte string.\\n * @param _in The byte string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded;\\n\\n if (_in.length == 1 && uint8(_in[0]) < 128) {\\n encoded = _in;\\n } else {\\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * RLP encodes a list of RLP encoded byte byte strings.\\n * @param _in The list of RLP encoded byte strings.\\n * @return The RLP encoded list of items in bytes.\\n */\\n function writeList(\\n bytes[] memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory list = _flatten(_in);\\n return abi.encodePacked(_writeLength(list.length, 192), list);\\n }\\n\\n /**\\n * RLP encodes a string.\\n * @param _in The string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeString(\\n string memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(bytes(_in));\\n }\\n\\n /**\\n * RLP encodes an address.\\n * @param _in The address to encode.\\n * @return The RLP encoded address in bytes.\\n */\\n function writeAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a bytes32 value.\\n * @param _in The bytes32 to encode.\\n * @return _out The RLP encoded bytes32 in bytes.\\n */\\n function writeBytes32(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a uint.\\n * @param _in The uint256 to encode.\\n * @return The RLP encoded uint256 in bytes.\\n */\\n function writeUint(\\n uint256 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(_toBinary(_in));\\n }\\n\\n /**\\n * RLP encodes a bool.\\n * @param _in The bool to encode.\\n * @return The RLP encoded bool in bytes.\\n */\\n function writeBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded = new bytes(1);\\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\\n return encoded;\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\\n * @param _len The length of the string or the payload.\\n * @param _offset 128 if item is string, 192 if item is list.\\n * @return RLP encoded bytes.\\n */\\n function _writeLength(\\n uint256 _len,\\n uint256 _offset\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded;\\n\\n if (_len < 56) {\\n encoded = new bytes(1);\\n encoded[0] = byte(uint8(_len) + uint8(_offset));\\n } else {\\n uint256 lenLen;\\n uint256 i = 1;\\n while (_len / i != 0) {\\n lenLen++;\\n i *= 256;\\n }\\n\\n encoded = new bytes(lenLen + 1);\\n encoded[0] = byte(uint8(lenLen) + uint8(_offset) + 55);\\n for(i = 1; i <= lenLen; i++) {\\n encoded[i] = byte(uint8((_len / (256**(lenLen-i))) % 256));\\n }\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * Encode integer in big endian binary form with no leading zeroes.\\n * @notice TODO: This should be optimized with assembly to save gas costs.\\n * @param _x The integer to encode.\\n * @return RLP encoded bytes.\\n */\\n function _toBinary(\\n uint256 _x\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory b = abi.encodePacked(_x);\\n\\n uint256 i = 0;\\n for (; i < 32; i++) {\\n if (b[i] != 0) {\\n break;\\n }\\n }\\n\\n bytes memory res = new bytes(32 - i);\\n for (uint256 j = 0; j < res.length; j++) {\\n res[j] = b[i++];\\n }\\n\\n return res;\\n }\\n\\n /**\\n * Copies a piece of memory to another location.\\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\\n * @param _dest Destination location.\\n * @param _src Source location.\\n * @param _len Length of memory to copy.\\n */\\n function _memcpy(\\n uint256 _dest,\\n uint256 _src,\\n uint256 _len\\n )\\n private\\n pure\\n {\\n uint256 dest = _dest;\\n uint256 src = _src;\\n uint256 len = _len;\\n\\n for(; len >= 32; len -= 32) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n dest += 32;\\n src += 32;\\n }\\n\\n uint256 mask = 256 ** (32 - len) - 1;\\n assembly {\\n let srcpart := and(mload(src), not(mask))\\n let destpart := and(mload(dest), mask)\\n mstore(dest, or(destpart, srcpart))\\n }\\n }\\n\\n /**\\n * Flattens a list of byte strings into one byte string.\\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\\n * @param _list List of byte strings to flatten.\\n * @return The flattened byte string.\\n */\\n function _flatten(\\n bytes[] memory _list\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n if (_list.length == 0) {\\n return new bytes(0);\\n }\\n\\n uint256 len;\\n uint256 i = 0;\\n for (; i < _list.length; i++) {\\n len += _list[i].length;\\n }\\n\\n bytes memory flattened = new bytes(len);\\n uint256 flattenedPtr;\\n assembly { flattenedPtr := add(flattened, 0x20) }\\n\\n for(i = 0; i < _list.length; i++) {\\n bytes memory item = _list[i];\\n\\n uint256 listPtr;\\n assembly { listPtr := add(item, 0x20)}\\n\\n _memcpy(flattenedPtr, listPtr, item.length);\\n flattenedPtr += _list[i].length;\\n }\\n\\n return flattened;\\n }\\n}\\n\",\"keccak256\":\"0xb60ee4b03ad372c3deff21d454ab714dd0c18ee3e6f9d45532e209fc59d5a54d\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_Bytes32Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_Byte32Utils\\n */\\nlibrary Lib_Bytes32Utils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \\\"true.\\\"\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as a boolean.\\n */\\n function toBool(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return _in != 0;\\n }\\n\\n /**\\n * Converts a boolean to a bytes32 value.\\n * @param _in Input boolean value.\\n * @return Boolean as a bytes32.\\n */\\n function fromBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in ? 1 : 0));\\n }\\n\\n /**\\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as an address.\\n */\\n function toAddress(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return address(uint160(uint256(_in)));\\n }\\n\\n /**\\n * Converts an address to a bytes32.\\n * @param _in Input address value.\\n * @return Address as a bytes32.\\n */\\n function fromAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in));\\n }\\n\\n /**\\n * Removes the leading zeros from a bytes32 value and returns a new (smaller) bytes value.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 without any leading zeros.\\n */\\n function removeLeadingZeros(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out;\\n\\n assembly {\\n // Figure out how many leading zero bytes to remove.\\n let shift := 0\\n for { let i := 0 } and(lt(i, 32), eq(byte(i, _in), 0)) { i := add(i, 1) } {\\n shift := add(shift, 1)\\n }\\n\\n // Reserve some space for our output and fix the free memory pointer.\\n out := mload(0x40)\\n mstore(0x40, add(out, 0x40))\\n\\n // Shift the value and store it into the output bytes.\\n mstore(add(out, 0x20), shl(mul(shift, 8), _in))\\n\\n // Store the new size (with leading zero bytes removed) in the output byte size.\\n mstore(out, sub(32, shift))\\n }\\n\\n return out;\\n }\\n}\\n\",\"keccak256\":\"0xfa2def593e3fc56a31852c3744aefdaa93cec74e721bfcfeb1e5d166c7c60b64\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_BytesUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_BytesUtils\\n */\\nlibrary Lib_BytesUtils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_start + _length >= _start, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n if (_bytes.length - _start == 0) {\\n return bytes('');\\n }\\n\\n return slice(_bytes, _start, _bytes.length - _start);\\n }\\n\\n function toBytes32PadLeft(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n bytes32 ret;\\n uint256 len = _bytes.length <= 32 ? _bytes.length : 32;\\n assembly {\\n ret := shr(mul(sub(32, len), 8), mload(add(_bytes, 32)))\\n }\\n return ret;\\n }\\n\\n function toBytes32(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n if (_bytes.length < 32) {\\n bytes32 ret;\\n assembly {\\n ret := mload(add(_bytes, 32))\\n }\\n return ret;\\n }\\n\\n return abi.decode(_bytes,(bytes32)); // will truncate if input length > 32 bytes\\n }\\n\\n function toUint256(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return uint256(toBytes32(_bytes));\\n }\\n\\n function toUint24(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n uint24\\n )\\n {\\n require(_start + 3 >= _start, \\\"toUint24_overflow\\\");\\n require(_bytes.length >= _start + 3 , \\\"toUint24_outOfBounds\\\");\\n uint24 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x3), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toUint8(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n uint8\\n )\\n {\\n require(_start + 1 >= _start, \\\"toUint8_overflow\\\");\\n require(_bytes.length >= _start + 1 , \\\"toUint8_outOfBounds\\\");\\n uint8 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x1), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toAddress(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n require(_start + 20 >= _start, \\\"toAddress_overflow\\\");\\n require(_bytes.length >= _start + 20, \\\"toAddress_outOfBounds\\\");\\n address tempAddress;\\n\\n assembly {\\n tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000)\\n }\\n\\n return tempAddress;\\n }\\n\\n function toNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory nibbles = new bytes(_bytes.length * 2);\\n\\n for (uint256 i = 0; i < _bytes.length; i++) {\\n nibbles[i * 2] = _bytes[i] >> 4;\\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\\n }\\n\\n return nibbles;\\n }\\n\\n function fromNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory ret = new bytes(_bytes.length / 2);\\n\\n for (uint256 i = 0; i < ret.length; i++) {\\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\\n }\\n\\n return ret;\\n }\\n\\n function equal(\\n bytes memory _bytes,\\n bytes memory _other\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return keccak256(_bytes) == keccak256(_other);\\n }\\n}\\n\",\"keccak256\":\"0xa5195afe32fb2cf104d156e8f4bd39df1ec79bf6ba232097b9e8e0ee14fbc298\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_ErrorUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/**\\n * @title Lib_ErrorUtils\\n */\\nlibrary Lib_ErrorUtils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Encodes an error string into raw solidity-style revert data.\\n * (i.e. ascii bytes, prefixed with bytes4(keccak(\\\"Error(string))\\\"))\\n * Ref: https://docs.soliditylang.org/en/v0.8.2/control-structures.html?highlight=Error(string)#panic-via-assert-and-error-via-require\\n * @param _reason Reason for the reversion.\\n * @return Standard solidity revert data for the given reason.\\n */\\n function encodeRevertString(\\n string memory _reason\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return abi.encodeWithSignature(\\n \\\"Error(string)\\\",\\n _reason\\n );\\n }\\n}\\n\",\"keccak256\":\"0xfc64ec4a81fb50865b502a0004ed154e8598e1a313db77303fc95e41f536e6b7\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_EthUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// @unsupported: ovm\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"./Lib_Bytes32Utils.sol\\\";\\n\\n/**\\n * @title Lib_EthUtils\\n */\\nlibrary Lib_EthUtils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Gets the code for a given address.\\n * @param _address Address to get code for.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Code read from the contract.\\n */\\n function getCode(\\n address _address,\\n uint256 _offset,\\n uint256 _length\\n )\\n internal\\n view\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory code;\\n assembly {\\n code := mload(0x40)\\n mstore(0x40, add(code, add(_length, 0x20)))\\n mstore(code, _length)\\n extcodecopy(_address, add(code, 0x20), _offset, _length)\\n }\\n\\n return code;\\n }\\n\\n /**\\n * Gets the full code for a given address.\\n * @param _address Address to get code for.\\n * @return Full code of the contract.\\n */\\n function getCode(\\n address _address\\n )\\n internal\\n view\\n returns (\\n bytes memory\\n )\\n {\\n return getCode(\\n _address,\\n 0,\\n getCodeSize(_address)\\n );\\n }\\n\\n /**\\n * Gets the size of a contract's code in bytes.\\n * @param _address Address to get code size for.\\n * @return Size of the contract's code in bytes.\\n */\\n function getCodeSize(\\n address _address\\n )\\n internal\\n view\\n returns (\\n uint256\\n )\\n {\\n uint256 codeSize;\\n assembly {\\n codeSize := extcodesize(_address)\\n }\\n\\n return codeSize;\\n }\\n\\n /**\\n * Gets the hash of a contract's code.\\n * @param _address Address to get a code hash for.\\n * @return Hash of the contract's code.\\n */\\n function getCodeHash(\\n address _address\\n )\\n internal\\n view\\n returns (\\n bytes32\\n )\\n {\\n bytes32 codeHash;\\n assembly {\\n codeHash := extcodehash(_address)\\n }\\n\\n return codeHash;\\n }\\n\\n /**\\n * Creates a contract with some given initialization code.\\n * @param _code Contract initialization code.\\n * @return Address of the created contract.\\n */\\n function createContract(\\n bytes memory _code\\n )\\n internal\\n returns (\\n address\\n )\\n {\\n address created;\\n assembly {\\n created := create(\\n 0,\\n add(_code, 0x20),\\n mload(_code)\\n )\\n }\\n\\n return created;\\n }\\n\\n /**\\n * Computes the address that would be generated by CREATE.\\n * @param _creator Address creating the contract.\\n * @param _nonce Creator's nonce.\\n * @return Address to be generated by CREATE.\\n */\\n function getAddressForCREATE(\\n address _creator,\\n uint256 _nonce\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n bytes[] memory encoded = new bytes[](2);\\n encoded[0] = Lib_RLPWriter.writeAddress(_creator);\\n encoded[1] = Lib_RLPWriter.writeUint(_nonce);\\n\\n bytes memory encodedList = Lib_RLPWriter.writeList(encoded);\\n return Lib_Bytes32Utils.toAddress(keccak256(encodedList));\\n }\\n\\n /**\\n * Computes the address that would be generated by CREATE2.\\n * @param _creator Address creating the contract.\\n * @param _bytecode Bytecode of the contract to be created.\\n * @param _salt 32 byte salt value mixed into the hash.\\n * @return Address to be generated by CREATE2.\\n */\\n function getAddressForCREATE2(\\n address _creator,\\n bytes memory _bytecode,\\n bytes32 _salt\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n bytes32 hashedData = keccak256(abi.encodePacked(\\n byte(0xff),\\n _creator,\\n _salt,\\n keccak256(_bytecode)\\n ));\\n\\n return Lib_Bytes32Utils.toAddress(hashedData);\\n }\\n}\\n\",\"keccak256\":\"0xf29a67d78e61cb472d524b779b32cfcb39a587f4096500d5419e6425ed367d49\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_MerkleTree.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_MerkleTree\\n * @author River Keefer\\n */\\nlibrary Lib_MerkleTree {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Calculates a merkle root for a list of 32-byte leaf hashes. WARNING: If the number\\n * of leaves passed in is not a power of two, it pads out the tree with zero hashes.\\n * If you do not know the original length of elements for the tree you are verifying,\\n * then this may allow empty leaves past _elements.length to pass a verification check down the line.\\n * Note that the _elements argument is modified, therefore it must not be used again afterwards\\n * @param _elements Array of hashes from which to generate a merkle root.\\n * @return Merkle root of the leaves, with zero hashes for non-powers-of-two (see above).\\n */\\n function getMerkleRoot(\\n bytes32[] memory _elements\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n require(\\n _elements.length > 0,\\n \\\"Lib_MerkleTree: Must provide at least one leaf hash.\\\"\\n );\\n\\n if (_elements.length == 1) {\\n return _elements[0];\\n }\\n\\n uint256[16] memory defaults = [\\n 0x290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563,\\n 0x633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d,\\n 0x890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d,\\n 0x3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd8,\\n 0xecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da,\\n 0xdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da5,\\n 0x617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d7,\\n 0x292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead,\\n 0xe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e10,\\n 0x7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f82,\\n 0xe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e83636516,\\n 0x3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c,\\n 0xad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e,\\n 0xa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab,\\n 0x4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c862,\\n 0x2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf10\\n ];\\n\\n // Reserve memory space for our hashes.\\n bytes memory buf = new bytes(64);\\n\\n // We'll need to keep track of left and right siblings.\\n bytes32 leftSibling;\\n bytes32 rightSibling;\\n\\n // Number of non-empty nodes at the current depth.\\n uint256 rowSize = _elements.length;\\n\\n // Current depth, counting from 0 at the leaves\\n uint256 depth = 0;\\n\\n // Common sub-expressions\\n uint256 halfRowSize; // rowSize / 2\\n bool rowSizeIsOdd; // rowSize % 2 == 1\\n\\n while (rowSize > 1) {\\n halfRowSize = rowSize / 2;\\n rowSizeIsOdd = rowSize % 2 == 1;\\n\\n for (uint256 i = 0; i < halfRowSize; i++) {\\n leftSibling = _elements[(2 * i) ];\\n rightSibling = _elements[(2 * i) + 1];\\n assembly {\\n mstore(add(buf, 32), leftSibling )\\n mstore(add(buf, 64), rightSibling)\\n }\\n\\n _elements[i] = keccak256(buf);\\n }\\n\\n if (rowSizeIsOdd) {\\n leftSibling = _elements[rowSize - 1];\\n rightSibling = bytes32(defaults[depth]);\\n assembly {\\n mstore(add(buf, 32), leftSibling)\\n mstore(add(buf, 64), rightSibling)\\n }\\n\\n _elements[halfRowSize] = keccak256(buf);\\n }\\n\\n rowSize = halfRowSize + (rowSizeIsOdd ? 1 : 0);\\n depth++;\\n }\\n\\n return _elements[0];\\n }\\n\\n /**\\n * Verifies a merkle branch for the given leaf hash. Assumes the original length\\n * of leaves generated is a known, correct input, and does not return true for indices\\n * extending past that index (even if _siblings would be otherwise valid.)\\n * @param _root The Merkle root to verify against.\\n * @param _leaf The leaf hash to verify inclusion of.\\n * @param _index The index in the tree of this leaf.\\n * @param _siblings Array of sibline nodes in the inclusion proof, starting from depth 0 (bottom of the tree).\\n * @param _totalLeaves The total number of leaves originally passed into.\\n * @return Whether or not the merkle branch and leaf passes verification.\\n */\\n function verify(\\n bytes32 _root,\\n bytes32 _leaf,\\n uint256 _index,\\n bytes32[] memory _siblings,\\n uint256 _totalLeaves\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n require(\\n _totalLeaves > 0,\\n \\\"Lib_MerkleTree: Total leaves must be greater than zero.\\\"\\n );\\n\\n require(\\n _index < _totalLeaves,\\n \\\"Lib_MerkleTree: Index out of bounds.\\\"\\n );\\n\\n require(\\n _siblings.length == _ceilLog2(_totalLeaves),\\n \\\"Lib_MerkleTree: Total siblings does not correctly correspond to total leaves.\\\"\\n );\\n\\n bytes32 computedRoot = _leaf;\\n\\n for (uint256 i = 0; i < _siblings.length; i++) {\\n if ((_index & 1) == 1) {\\n computedRoot = keccak256(\\n abi.encodePacked(\\n _siblings[i],\\n computedRoot\\n )\\n );\\n } else {\\n computedRoot = keccak256(\\n abi.encodePacked(\\n computedRoot,\\n _siblings[i]\\n )\\n );\\n }\\n\\n _index >>= 1;\\n }\\n\\n return _root == computedRoot;\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Calculates the integer ceiling of the log base 2 of an input.\\n * @param _in Unsigned input to calculate the log.\\n * @return ceil(log_base_2(_in))\\n */\\n function _ceilLog2(\\n uint256 _in\\n )\\n private\\n pure\\n returns (\\n uint256\\n )\\n {\\n require(\\n _in > 0,\\n \\\"Lib_MerkleTree: Cannot compute ceil(log_2) of 0.\\\"\\n );\\n\\n if (_in == 1) {\\n return 0;\\n }\\n\\n // Find the highest set bit (will be floor(log_2)).\\n // Borrowed with <3 from https://github.com/ethereum/solidity-examples\\n uint256 val = _in;\\n uint256 highest = 0;\\n for (uint256 i = 128; i >= 1; i >>= 1) {\\n if (val & (uint(1) << i) - 1 << i != 0) {\\n highest += i;\\n val >>= i;\\n }\\n }\\n\\n // Increment by one if this is not a perfect logarithm.\\n if ((uint(1) << highest) != _in) {\\n highest += 1;\\n }\\n\\n return highest;\\n }\\n}\\n\",\"keccak256\":\"0xa78edb9fbd34712771a1ebff05bc5e1abec7fc1e9a1bfb709d183099b44fa62a\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x60806040523480156200001157600080fd5b506040516200315338038062003153833981016040819052620000349162000067565b600080546001600160a01b0319166001600160a01b039590951694909417909355600191909155600255600355620000b2565b600080600080608085870312156200007d578384fd5b84516001600160a01b038116811462000094578485fd5b60208601516040870151606090970151919890975090945092505050565b61309180620000c26000396000f3fe608060405234801561001057600080fd5b50600436106101425760003560e01c8063876ed5cb116100b8578063cfdf677e1161007c578063cfdf677e1461023f578063d0f8934414610247578063e10d29ee1461024f578063e561dddc14610257578063f722b41a1461025f578063facdc5da1461026757610142565b8063876ed5cb146102175780638d38c6c11461021f578063b8f7700514610227578063c139eb151461022f578063c2cf696f1461023757610142565b80634de569ce1161010a5780634de569ce146101c25780635ae6256d146101e25780636fee07e0146101ea57806378f4b2f2146101ff5780637a167a8a146102075780637aa63a861461020f57610142565b8063138387a414610147578063299ca478146101655780632a7f18be1461017a578063378997701461019a578063461a4478146101af575b600080fd5b61014f61027a565b60405161015c91906124c7565b60405180910390f35b61016d610280565b60405161015c91906123eb565b61018d610188366004612388565b61028f565b60405161015c9190612e4e565b6101a26102b0565b60405161015c9190612e8d565b61016d6101bd36600461221b565b6102c4565b6101d56101d0366004612261565b6103a0565b60405161015c9190612484565b6101a26103da565b6101fd6101f8366004612188565b6103ee565b005b61014f61066d565b6101a2610674565b61014f610689565b61014f6106a4565b61014f6106aa565b6101a26106b0565b61014f6106c7565b61014f6106cd565b61016d6106d2565b6101fd6106f5565b61016d610b69565b61014f610b8c565b6101a2610c06565b6101fd610275366004612388565b610c1e565b60025481565b6000546001600160a01b031681565b610297611ed9565b6102a8826102a3610b69565b610c36565b90505b919050565b6000806102bb610d76565b50935050505090565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b8381101561032457818101518382015260200161030c565b50505050905090810190601f1680156103515780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561036e57600080fd5b505afa158015610382573d6000803e3d6000fd5b505050506040513d602081101561039857600080fd5b505192915050565b82516000901515600114156103c2576103bb85858585610e24565b90506103d2565b6103bb8585602001518585610fef565b949350505050565b6000806103e5610d76565b94505050505090565b61c3508151111561041a5760405162461bcd60e51b81526004016104119061259b565b60405180910390fd5b60035482111561043c5760405162461bcd60e51b8152600401610411906127a1565b620186a082101561045f5760405162461bcd60e51b815260040161041190612983565b6020820460005a90508181116104875760405162461bcd60e51b815260040161041190612b8a565b60005b825a8303101561049c5760010161048a565b6000338787876040516020016104b594939291906123ff565b60408051601f19818403018152919052805160209091012090504360281b421760006104df610b69565b60405163b298e36b60e01b81529091506001600160a01b0382169063b298e36b9061050e9086906004016124c7565b600060405180830381600087803b15801561052857600080fd5b505af115801561053c573d6000803e3d6000fd5b505060405163b298e36b60e01b81526001600160a01b038416925063b298e36b915061056c9085906004016124c7565b600060405180830381600087803b15801561058657600080fd5b505af115801561059a573d6000803e3d6000fd5b50505050600060016002836001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b1580156105dd57600080fd5b505afa1580156105f1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106159190612203565b8161061c57fe5b040390507f4b388aecf9fa6cc92253704e5975a6129a4f735bdbd99567df4ed0094ee4ceb5338b8b8b85426040516106599695949392919061243c565b60405180910390a150505050505050505050565b620186a081565b60008061067f610d76565b5090935050505090565b600080610694610d76565b50505064ffffffffff1692915050565b61c35081565b60035481565b60006106c26106bd610b69565b6110c4565b905090565b60015481565b602081565b60006106c2604051806060016040528060258152602001613003602591396102c4565b60043560d81c60093560e890811c90600c35901c610711610689565b8364ffffffffff16146107365760405162461bcd60e51b815260040161041190612a35565b6107646040518060400160405280600d81526020016c27ab26afa9b2b8bab2b731b2b960991b8152506102c4565b6001600160a01b0316336001600160a01b0316146107945760405162461bcd60e51b815260040161041190612a92565b60008162ffffff16116107b95760405162461bcd60e51b8152600401610411906127fe565b60008262ffffff16116107de5760405162461bcd60e51b815260040161041190612cdf565b600f601062ffffff8316020164ffffffffff81163610156108115760405162461bcd60e51b815260040161041190612d66565b600061081b610b69565b90506000610828826110c4565b9050600062ffffff8616368161083a57fe5b0460020267ffffffffffffffff8111801561085457600080fd5b506040519080825280601f01601f19166020018201604052801561087f576020820181803683370190505b50905060008662ffffff1667ffffffffffffffff811180156108a057600080fd5b506040519080825280602002602001820160405280156108ca578160200160208202803683370190505b50905060008060006108da610674565b90506108e4611ef9565b60005b8a62ffffff168163ffffffff161015610a3b57600061090b8263ffffffff16611147565b905063ffffffff82166109215761092181611197565b61092d8382868d611264565b80925060005b835163ffffffff821610156109b1578b3560e81c61c3508111156109695760405162461bcd60e51b81526004016104119061259b565b61097c858e64ffffffffff16838d6112cf565b898963ffffffff168151811061098e57fe5b60209081029190910101529b909b016003019a6001968701969586019501610933565b5060005b83602001518163ffffffff161015610a31578964ffffffffff168564ffffffffff16106109f45760405162461bcd60e51b815260040161041190612da8565b610a048564ffffffffff16611363565b888863ffffffff1681518110610a1657fe5b602090810291909101015260019687019694850194016109b5565b50506001016108e7565b50610a488183898b6113a8565b3664ffffffffff8a1614610a6e5760405162461bcd60e51b815260040161041190612846565b8a62ffffff168463ffffffff1614610a985760405162461bcd60e51b815260040161041190612894565b6000838c62ffffff160363ffffffff169050600080836020015160001415610acb57505060408201516060830151610af3565b6000610ae16001870364ffffffffff168d610c36565b90508060200151925080604001519150505b610b14610aff8961141b565b8f62ffffff168564ffffffffff16858561184f565b7f602f1aeac0ca2e7a13e281a9ef0ad7838542712ce16780fa2ecffd351f05f89983860384610b41610689565b604051610b5093929190612e9f565b60405180910390a1505050505050505050505050505050565b60006106c2604051806060016040528060238152602001612ee6602391396102c4565b6000610b966106d2565b6001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b158015610bce57600080fd5b505afa158015610be2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106c29190612203565b6000610c10610674565b610c186106b0565b03905090565b60405162461bcd60e51b81526004016104119061250b565b610c3e611ed9565b604051634a83e9cd60e11b815260028402906000906001600160a01b03851690639507d39a90610c72908590600401612e8d565b60206040518083038186803b158015610c8a57600080fd5b505afa158015610c9e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cc29190612203565b90506000846001600160a01b0316639507d39a846001016040518263ffffffff1660e01b8152600401610cf59190612e8d565b60206040518083038186803b158015610d0d57600080fd5b505afa158015610d21573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d459190612203565b6040805160608101825293845264ffffffffff828116602086015260289290921c9091169083015250949350505050565b6000806000806000610d866106d2565b6001600160a01b031663ccf8f9696040518163ffffffff1660e01b815260040160206040518083038186803b158015610dbe57600080fd5b505afa158015610dd2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610df691906121dd565b64ffffffffff602882901c811697605083901c82169750607883901c8216965060a09290921c169350915050565b600080610e5c6040518060400160405280601481526020017327ab26afa2bc32b1baba34b7b726b0b730b3b2b960611b8152506102c4565b90506000816001600160a01b0316631c4712a76040518163ffffffff1660e01b815260040160206040518083038186803b158015610e9957600080fd5b505afa158015610ead573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ed19190612203565b90506000610ede87611a02565b9050610eeb818787611a9b565b610f075760405162461bcd60e51b8152600401610411906126ca565b86606001518860200151148015610f22575060408701518851145b8015610f635750610f4a604051806060016040528060228152602001612f09602291396102c4565b6001600160a01b031688608001516001600160a01b0316145b8015610f725750818860a00151145b8015610f89575060608801516001600160a01b0316155b8015610fa45750600088604001516001811115610fa257fe5b145b8015610fc557508660800151805190602001208860c0015180519060200120145b610fe15760405162461bcd60e51b81526004016104119061276a565b506001979650505050505050565b600080610ffb85611363565b9050611008818585611a9b565b6110245760405162461bcd60e51b815260040161041190612c2a565b6000866060015187608001518860a001518960c0015160405160200161104d94939291906123ff565b60405160208183030381529060405280519060200120905060006110708761028f565b80519091508214801561108e57508751602082015164ffffffffff16145b80156110a857508760200151816040015164ffffffffff16145b610fe15760405162461bcd60e51b815260040161041190612adf565b60006002826001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b15801561110157600080fd5b505afa158015611115573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111399190612203565b8161114057fe5b0492915050565b61114f611ef9565b5060408051608081018252601092909202600f81013560e890811c84526012820135901c6020840152601581013560d890811c92840192909252601a0135901c606082015290565b60006111a1610689565b1115611211576000806111b2610d76565b9350935050508064ffffffffff16836060015110156111e35760405162461bcd60e51b815260040161041190612718565b8164ffffffffff168360400151101561120e5760405162461bcd60e51b8152600401610411906125f8565b50505b4260015482604001510110156112395760405162461bcd60e51b815260040161041190612d20565b4360025482606001510110156112615760405162461bcd60e51b815260040161041190612552565b50565b83604001518360400151101561128c5760405162461bcd60e51b815260040161041190612bd5565b8360600151836060015110156112b45760405162461bcd60e51b815260040161041190612df1565b6020830151156112c9576112c9838383611b8c565b50505050565b60008151836041011115611326578260410167ffffffffffffffff811180156112f757600080fd5b506040519080825280601f01601f191660200182016040528015611322576020820181803683370190505b5091505b6040850151606086015160006020850160018153836001820152826021820152866003890160418301376041870190209350505050949350505050565b60006102a86040518060a00160405280600015158152602001848152602001600081526020016000815260200160405180602001604052806000815250815250611c2d565b600083830364ffffffffff161180156113c357506020840151155b156113d3576113d3848483611b8c565b42846040015111156113f75760405162461bcd60e51b815260040161041190612b45565b43846060015111156112c95760405162461bcd60e51b815260040161041190612904565b60008082511161145c5760405162461bcd60e51b81526004018080602001828103825260348152602001806130286034913960400191505060405180910390fd5b815160011415611482578160008151811061147357fe5b602002602001015190506102ab565b60408051610200810182527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56381527f633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d60208201527f890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d818301527f3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd86060808301919091527fecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da60808301527fdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da560a08301527f617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d760c08301527f292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead60e08301527fe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e106101008301527f7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f826101208301527fe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e836365166101408301527f3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c6101608301527fad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e6101808301527fa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab6101a08301527f4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c8626101c08301527f2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf106101e083015282518381529081018352909160009190602082018180368337505085519192506000918291508180805b600184111561182b5750506002820460018084161460005b828110156117a7578a816002028151811061174e57fe5b602002602001015196508a816002026001018151811061176a57fe5b6020026020010151955086602089015285604089015287805190602001208b828151811061179457fe5b6020908102919091010152600101611737565b50801561180a578960018503815181106117bd57fe5b602002602001015195508783601081106117d357fe5b602002015160001b945085602088015284604088015286805190602001208a83815181106117fd57fe5b6020026020010181815250505b80611816576000611819565b60015b60ff168201935060019092019161171f565b8960008151811061183857fe5b602002602001015198505050505050505050919050565b60006118596106d2565b9050600080611866610d76565b50509150915060006040518060a00160405280856001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b1580156118b257600080fd5b505afa1580156118c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118ea9190612203565b81526020018a81526020018981526020018464ffffffffff16815260200160405180602001604052806000815250815250905080600001517f127186556e7be68c7e31263195225b4de02820707889540969f62c05cf73525e826020015183604001518460600151856080015160405161196794939291906124e6565b60405180910390a2600061197a82611c75565b90506000611992836040015186018a86018a8a611c9e565b60405163080549db60e21b81529091506001600160a01b03871690632015276c906119c390859085906004016124d0565b600060405180830381600087803b1580156119dd57600080fd5b505af11580156119f1573d6000803e3d6000fd5b505050505050505050505050505050565b6080810151805160009190826041820167ffffffffffffffff81118015611a2857600080fd5b506040519080825280601f01601f191660200182016040528015611a53576020820181803683370190505b5060408601516060870151919250906000602084016001815383600182015282602182015285604182018760208a0160045afa50604190950190942095505050505050919050565b6000611aa56106d2565b8351604051634a83e9cd60e11b81526001600160a01b039290921691639507d39a91611ad391600401612e7c565b60206040518083038186803b158015611aeb57600080fd5b505afa158015611aff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b239190612203565b611b2c84611c75565b14611b495760405162461bcd60e51b815260040161041190612b16565b611b66836020015185846000015185602001518760400151611cbd565b611b825760405162461bcd60e51b81526004016104119061294c565b5060019392505050565b6000611b9f8364ffffffffff1683610c36565b9050600154816020015164ffffffffff16014210611bcf5760405162461bcd60e51b815260040161041190612647565b806020015164ffffffffff1684604001511115611bfe5760405162461bcd60e51b8152600401610411906129cc565b806040015164ffffffffff16846060015111156112c95760405162461bcd60e51b815260040161041190612c74565b8051602080830151604080850151606086015160808701519251600096611c5896909594910161248f565b604051602081830303815290604052805190602001209050919050565b60008160200151826040015183606001518460800151604051602001611c5894939291906124e6565b602892831b9390931760509190911b1760789290921b91909117901b90565b6000808211611cfd5760405162461bcd60e51b8152600401808060200182810382526037815260200180612f7f6037913960400191505060405180910390fd5b818410611d3b5760405162461bcd60e51b8152600401808060200182810382526024815260200180612f2b6024913960400191505060405180910390fd5b611d4482611e42565b835114611d825760405162461bcd60e51b815260040180806020018281038252604d815260200180612fb6604d913960600191505060405180910390fd5b8460005b8451811015611e35578560011660011415611de457848181518110611da757fe5b6020026020010151826040516020018083815260200182815260200192505050604051602081830303815290604052805190602001209150611e29565b81858281518110611df157fe5b602002602001015160405160200180838152602001828152602001925050506040516020818303038152906040528051906020012091505b600195861c9501611d86565b5090951495945050505050565b6000808211611e825760405162461bcd60e51b8152600401808060200182810382526030815260200180612f4f6030913960400191505060405180910390fd5b8160011415611e93575060006102ab565b81600060805b60018110611ec3576000196001821b01811b831615611ebb5791821c91908101905b60011c611e99565b506001811b8414611ed2576001015b9392505050565b604080516060810182526000808252602082018190529181019190915290565b6040518060800160405280600081526020016000815260200160008152602001600081525090565b600067ffffffffffffffff831115611f3557fe5b611f48601f8401601f1916602001612ec1565b9050828152838383011115611f5c57600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b03811681146102ab57600080fd5b600082601f830112611f9a578081fd5b611ed283833560208501611f21565b8035600281106102ab57600080fd5b600060a08284031215611fc9578081fd5b60405160a0810167ffffffffffffffff8282108183111715611fe757fe5b8160405282935084358352602085013560208401526040850135604084015260608501356060840152608085013591508082111561202457600080fd5b5061203185828601611f8a565b6080830152505092915050565b60006040828403121561204f578081fd5b6040516040810167ffffffffffffffff828210818311171561206d57fe5b816040528293508435835260209150818501358181111561208d57600080fd5b8501601f8101871361209e57600080fd5b8035828111156120aa57fe5b83810292506120ba848401612ec1565b8181528481019083860185850187018b10156120d557600080fd5b600095505b838610156120f85780358352600195909501949186019186016120da565b5080868801525050505050505092915050565b600060a0828403121561211c578081fd5b60405160a0810167ffffffffffffffff828210818311171561213a57fe5b8160405282935084359150811515821461215357600080fd5b818352602085013560208401526040850135604084015260608501356060840152608085013591508082111561202457600080fd5b60008060006060848603121561219c578283fd5b6121a584611f73565b925060208401359150604084013567ffffffffffffffff8111156121c7578182fd5b6121d386828701611f8a565b9150509250925092565b6000602082840312156121ee578081fd5b815164ffffffffff1981168114611ed2578182fd5b600060208284031215612214578081fd5b5051919050565b60006020828403121561222c578081fd5b813567ffffffffffffffff811115612242578182fd5b8201601f81018413612252578182fd5b6103d284823560208401611f21565b60008060008060808587031215612276578081fd5b843567ffffffffffffffff8082111561228d578283fd5b9086019060e082890312156122a0578283fd5b6122aa60e0612ec1565b82358152602083013560208201526122c460408401611fa9565b60408201526122d560608401611f73565b60608201526122e660808401611f73565b608082015260a083013560a082015260c083013582811115612306578485fd5b6123128a828601611f8a565b60c0830152509550602087013591508082111561232d578283fd5b6123398883890161210b565b9450604087013591508082111561234e578283fd5b61235a88838901611fb8565b9350606087013591508082111561236f578283fd5b5061237c8782880161203e565b91505092959194509250565b600060208284031215612399578081fd5b5035919050565b60008151808452815b818110156123c5576020818501810151868301820152016123a9565b818111156123d65782602083870101525b50601f01601f19169290920160200192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612432908301846123a0565b9695505050505050565b6001600160a01b038781168252861660208201526040810185905260c06060820181905260009061246f908301866123a0565b60808301949094525060a00152949350505050565b901515815260200190565b6000861515825285602083015284604083015283606083015260a060808301526124bc60a08301846123a0565b979650505050505050565b90815260200190565b91825264ffffffffff1916602082015260400190565b60008582528460208301528360408301526080606083015261243260808301846123a0565b60208082526027908201527f617070656e64517565756542617463682069732063757272656e746c7920646960408201526639b0b13632b21760c91b606082015260800190565b60208082526029908201527f436f6e7465787420626c6f636b206e756d62657220746f6f2066617220696e206040820152683a3432903830b9ba1760b91b606082015260800190565b6020808252603d908201527f5472616e73616374696f6e20646174612073697a652065786365656473206d6160408201527f78696d756d20666f7220726f6c6c7570207472616e73616374696f6e2e000000606082015260800190565b6020808252602f908201527f436f6e746578742074696d657374616d70206973206c6f776572207468616e2060408201526e3630b9ba1039bab136b4ba3a32b21760891b606082015260800190565b6020808252605b908201527f50726576696f75736c7920656e7175657565642062617463686573206861766560408201527f206578706972656420616e64206d75737420626520617070656e64656420626560608201527f666f72652061206e65772073657175656e6365722062617463682e0000000000608082015260a00190565b6020808252602e908201527f496e76616c69642053657175656e636572207472616e73616374696f6e20696e60408201526d31b63ab9b4b7b710383937b7b31760911b606082015260800190565b60208082526032908201527f436f6e7465787420626c6f636b206e756d626572206973206c6f77657220746860408201527130b7103630b9ba1039bab136b4ba3a32b21760711b606082015260800190565b6020808252601e908201527f496e76616c69642053657175656e636572207472616e73616374696f6e2e0000604082015260600190565b6020808252603d908201527f5472616e73616374696f6e20676173206c696d69742065786365656473206d6160408201527f78696d756d20666f7220726f6c6c7570207472616e73616374696f6e2e000000606082015260800190565b60208082526028908201527f4d7573742070726f76696465206174206c65617374206f6e652062617463682060408201526731b7b73a32bc3a1760c11b606082015260800190565b6020808252602e908201527f4e6f7420616c6c2073657175656e636572207472616e73616374696f6e73207760408201526d32b93290383937b1b2b9b9b2b21760911b606082015260800190565b6020808252604a908201527f41637475616c207472616e73616374696f6e20696e64657820646f6573206e6f60408201527f74206d6174636820657870656374656420746f74616c20656c656d656e7473206060820152693a379030b83832b7321760b11b608082015260a00190565b60208082526028908201527f436f6e7465787420626c6f636b206e756d6265722069732066726f6d2074686560408201526710333aba3ab9329760c11b606082015260800190565b60208082526018908201527f496e76616c696420696e636c7573696f6e2070726f6f662e0000000000000000604082015260600190565b60208082526029908201527f5472616e73616374696f6e20676173206c696d697420746f6f206c6f7720746f6040820152681032b738bab2bab29760b91b606082015260800190565b60208082526043908201527f53657175656e636572207472616e73616374696f6e2074696d657374616d702060408201527f657863656564732074686174206f66206e65787420717565756520656c656d65606082015262373a1760e91b608082015260a00190565b6020808252603d908201527f41637475616c20626174636820737461727420696e64657820646f6573206e6f60408201527f74206d6174636820657870656374656420737461727420696e6465782e000000606082015260800190565b6020808252602d908201527f46756e6374696f6e2063616e206f6e6c792062652063616c6c6564206279207460408201526c34329029b2b8bab2b731b2b91760991b606082015260800190565b6020808252601a908201527f496e76616c6964205175657565207472616e73616374696f6e2e000000000000604082015260600190565b60208082526015908201527424b73b30b634b2103130ba31b4103432b0b232b91760591b604082015260600190565b60208082526025908201527f436f6e746578742074696d657374616d702069732066726f6d207468652066756040820152643a3ab9329760d91b606082015260800190565b6020808252602b908201527f496e73756666696369656e742067617320666f72204c322072617465206c696d60408201526a34ba34b73390313ab9371760a91b606082015260800190565b60208082526035908201527f436f6e746578742074696d657374616d702076616c756573206d757374206d6f6040820152743737ba37b734b1b0b6363c9034b731b932b0b9b29760591b606082015260800190565b6020808252602a908201527f496e76616c6964205175657565207472616e73616374696f6e20696e636c757360408201526934b7b710383937b7b31760b11b606082015260800190565b60208082526045908201527f53657175656e636572207472616e73616374696f6e20626c6f636b4e756d626560408201527f7220657863656564732074686174206f66206e65787420717565756520656c6560608201526436b2b73a1760d91b608082015260a00190565b60208082526021908201527f4d75737420617070656e64206174206c65617374206f6e6520656c656d656e746040820152601760f91b606082015260800190565b60208082526026908201527f436f6e746578742074696d657374616d7020746f6f2066617220696e20746865604082015265103830b9ba1760d11b606082015260800190565b60208082526022908201527f4e6f7420656e6f756768204261746368436f6e74657874732070726f76696465604082015261321760f11b606082015260800190565b60208082526029908201527f4e6f7420656e6f75676820717565756564207472616e73616374696f6e732074604082015268379030b83832b7321760b91b606082015260800190565b60208082526037908201527f436f6e7465787420626c6f636b4e756d6265722076616c756573206d7573742060408201527f6d6f6e6f746f6e6963616c6c7920696e6372656173652e000000000000000000606082015260800190565b8151815260208083015164ffffffffff90811691830191909152604092830151169181019190915260600190565b63ffffffff91909116815260200190565b64ffffffffff91909116815260200190565b64ffffffffff9384168152919092166020820152604081019190915260600190565b60405181810167ffffffffffffffff81118282101715612edd57fe5b60405291905056fe4f564d5f436861696e53746f72616765436f6e7461696e65723a4354433a71756575654f564d5f4465636f6d7072657373696f6e507265636f6d70696c65416464726573734c69625f4d65726b6c65547265653a20496e646578206f7574206f6620626f756e64732e4c69625f4d65726b6c65547265653a2043616e6e6f7420636f6d70757465206365696c286c6f675f3229206f6620302e4c69625f4d65726b6c65547265653a20546f74616c206c6561766573206d7573742062652067726561746572207468616e207a65726f2e4c69625f4d65726b6c65547265653a20546f74616c207369626c696e677320646f6573206e6f7420636f72726563746c7920636f72726573706f6e6420746f20746f74616c206c65617665732e4f564d5f436861696e53746f72616765436f6e7461696e65723a4354433a626174636865734c69625f4d65726b6c65547265653a204d7573742070726f76696465206174206c65617374206f6e65206c65616620686173682ea26469706673582212209b8491ed970ee9675604be8c2fab390420552fe108603099f2ea76166694e32c64736f6c63430007060033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101425760003560e01c8063876ed5cb116100b8578063cfdf677e1161007c578063cfdf677e1461023f578063d0f8934414610247578063e10d29ee1461024f578063e561dddc14610257578063f722b41a1461025f578063facdc5da1461026757610142565b8063876ed5cb146102175780638d38c6c11461021f578063b8f7700514610227578063c139eb151461022f578063c2cf696f1461023757610142565b80634de569ce1161010a5780634de569ce146101c25780635ae6256d146101e25780636fee07e0146101ea57806378f4b2f2146101ff5780637a167a8a146102075780637aa63a861461020f57610142565b8063138387a414610147578063299ca478146101655780632a7f18be1461017a578063378997701461019a578063461a4478146101af575b600080fd5b61014f61027a565b60405161015c91906124c7565b60405180910390f35b61016d610280565b60405161015c91906123eb565b61018d610188366004612388565b61028f565b60405161015c9190612e4e565b6101a26102b0565b60405161015c9190612e8d565b61016d6101bd36600461221b565b6102c4565b6101d56101d0366004612261565b6103a0565b60405161015c9190612484565b6101a26103da565b6101fd6101f8366004612188565b6103ee565b005b61014f61066d565b6101a2610674565b61014f610689565b61014f6106a4565b61014f6106aa565b6101a26106b0565b61014f6106c7565b61014f6106cd565b61016d6106d2565b6101fd6106f5565b61016d610b69565b61014f610b8c565b6101a2610c06565b6101fd610275366004612388565b610c1e565b60025481565b6000546001600160a01b031681565b610297611ed9565b6102a8826102a3610b69565b610c36565b90505b919050565b6000806102bb610d76565b50935050505090565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b8381101561032457818101518382015260200161030c565b50505050905090810190601f1680156103515780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561036e57600080fd5b505afa158015610382573d6000803e3d6000fd5b505050506040513d602081101561039857600080fd5b505192915050565b82516000901515600114156103c2576103bb85858585610e24565b90506103d2565b6103bb8585602001518585610fef565b949350505050565b6000806103e5610d76565b94505050505090565b61c3508151111561041a5760405162461bcd60e51b81526004016104119061259b565b60405180910390fd5b60035482111561043c5760405162461bcd60e51b8152600401610411906127a1565b620186a082101561045f5760405162461bcd60e51b815260040161041190612983565b6020820460005a90508181116104875760405162461bcd60e51b815260040161041190612b8a565b60005b825a8303101561049c5760010161048a565b6000338787876040516020016104b594939291906123ff565b60408051601f19818403018152919052805160209091012090504360281b421760006104df610b69565b60405163b298e36b60e01b81529091506001600160a01b0382169063b298e36b9061050e9086906004016124c7565b600060405180830381600087803b15801561052857600080fd5b505af115801561053c573d6000803e3d6000fd5b505060405163b298e36b60e01b81526001600160a01b038416925063b298e36b915061056c9085906004016124c7565b600060405180830381600087803b15801561058657600080fd5b505af115801561059a573d6000803e3d6000fd5b50505050600060016002836001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b1580156105dd57600080fd5b505afa1580156105f1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106159190612203565b8161061c57fe5b040390507f4b388aecf9fa6cc92253704e5975a6129a4f735bdbd99567df4ed0094ee4ceb5338b8b8b85426040516106599695949392919061243c565b60405180910390a150505050505050505050565b620186a081565b60008061067f610d76565b5090935050505090565b600080610694610d76565b50505064ffffffffff1692915050565b61c35081565b60035481565b60006106c26106bd610b69565b6110c4565b905090565b60015481565b602081565b60006106c2604051806060016040528060258152602001613003602591396102c4565b60043560d81c60093560e890811c90600c35901c610711610689565b8364ffffffffff16146107365760405162461bcd60e51b815260040161041190612a35565b6107646040518060400160405280600d81526020016c27ab26afa9b2b8bab2b731b2b960991b8152506102c4565b6001600160a01b0316336001600160a01b0316146107945760405162461bcd60e51b815260040161041190612a92565b60008162ffffff16116107b95760405162461bcd60e51b8152600401610411906127fe565b60008262ffffff16116107de5760405162461bcd60e51b815260040161041190612cdf565b600f601062ffffff8316020164ffffffffff81163610156108115760405162461bcd60e51b815260040161041190612d66565b600061081b610b69565b90506000610828826110c4565b9050600062ffffff8616368161083a57fe5b0460020267ffffffffffffffff8111801561085457600080fd5b506040519080825280601f01601f19166020018201604052801561087f576020820181803683370190505b50905060008662ffffff1667ffffffffffffffff811180156108a057600080fd5b506040519080825280602002602001820160405280156108ca578160200160208202803683370190505b50905060008060006108da610674565b90506108e4611ef9565b60005b8a62ffffff168163ffffffff161015610a3b57600061090b8263ffffffff16611147565b905063ffffffff82166109215761092181611197565b61092d8382868d611264565b80925060005b835163ffffffff821610156109b1578b3560e81c61c3508111156109695760405162461bcd60e51b81526004016104119061259b565b61097c858e64ffffffffff16838d6112cf565b898963ffffffff168151811061098e57fe5b60209081029190910101529b909b016003019a6001968701969586019501610933565b5060005b83602001518163ffffffff161015610a31578964ffffffffff168564ffffffffff16106109f45760405162461bcd60e51b815260040161041190612da8565b610a048564ffffffffff16611363565b888863ffffffff1681518110610a1657fe5b602090810291909101015260019687019694850194016109b5565b50506001016108e7565b50610a488183898b6113a8565b3664ffffffffff8a1614610a6e5760405162461bcd60e51b815260040161041190612846565b8a62ffffff168463ffffffff1614610a985760405162461bcd60e51b815260040161041190612894565b6000838c62ffffff160363ffffffff169050600080836020015160001415610acb57505060408201516060830151610af3565b6000610ae16001870364ffffffffff168d610c36565b90508060200151925080604001519150505b610b14610aff8961141b565b8f62ffffff168564ffffffffff16858561184f565b7f602f1aeac0ca2e7a13e281a9ef0ad7838542712ce16780fa2ecffd351f05f89983860384610b41610689565b604051610b5093929190612e9f565b60405180910390a1505050505050505050505050505050565b60006106c2604051806060016040528060238152602001612ee6602391396102c4565b6000610b966106d2565b6001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b158015610bce57600080fd5b505afa158015610be2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106c29190612203565b6000610c10610674565b610c186106b0565b03905090565b60405162461bcd60e51b81526004016104119061250b565b610c3e611ed9565b604051634a83e9cd60e11b815260028402906000906001600160a01b03851690639507d39a90610c72908590600401612e8d565b60206040518083038186803b158015610c8a57600080fd5b505afa158015610c9e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cc29190612203565b90506000846001600160a01b0316639507d39a846001016040518263ffffffff1660e01b8152600401610cf59190612e8d565b60206040518083038186803b158015610d0d57600080fd5b505afa158015610d21573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d459190612203565b6040805160608101825293845264ffffffffff828116602086015260289290921c9091169083015250949350505050565b6000806000806000610d866106d2565b6001600160a01b031663ccf8f9696040518163ffffffff1660e01b815260040160206040518083038186803b158015610dbe57600080fd5b505afa158015610dd2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610df691906121dd565b64ffffffffff602882901c811697605083901c82169750607883901c8216965060a09290921c169350915050565b600080610e5c6040518060400160405280601481526020017327ab26afa2bc32b1baba34b7b726b0b730b3b2b960611b8152506102c4565b90506000816001600160a01b0316631c4712a76040518163ffffffff1660e01b815260040160206040518083038186803b158015610e9957600080fd5b505afa158015610ead573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ed19190612203565b90506000610ede87611a02565b9050610eeb818787611a9b565b610f075760405162461bcd60e51b8152600401610411906126ca565b86606001518860200151148015610f22575060408701518851145b8015610f635750610f4a604051806060016040528060228152602001612f09602291396102c4565b6001600160a01b031688608001516001600160a01b0316145b8015610f725750818860a00151145b8015610f89575060608801516001600160a01b0316155b8015610fa45750600088604001516001811115610fa257fe5b145b8015610fc557508660800151805190602001208860c0015180519060200120145b610fe15760405162461bcd60e51b81526004016104119061276a565b506001979650505050505050565b600080610ffb85611363565b9050611008818585611a9b565b6110245760405162461bcd60e51b815260040161041190612c2a565b6000866060015187608001518860a001518960c0015160405160200161104d94939291906123ff565b60405160208183030381529060405280519060200120905060006110708761028f565b80519091508214801561108e57508751602082015164ffffffffff16145b80156110a857508760200151816040015164ffffffffff16145b610fe15760405162461bcd60e51b815260040161041190612adf565b60006002826001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b15801561110157600080fd5b505afa158015611115573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111399190612203565b8161114057fe5b0492915050565b61114f611ef9565b5060408051608081018252601092909202600f81013560e890811c84526012820135901c6020840152601581013560d890811c92840192909252601a0135901c606082015290565b60006111a1610689565b1115611211576000806111b2610d76565b9350935050508064ffffffffff16836060015110156111e35760405162461bcd60e51b815260040161041190612718565b8164ffffffffff168360400151101561120e5760405162461bcd60e51b8152600401610411906125f8565b50505b4260015482604001510110156112395760405162461bcd60e51b815260040161041190612d20565b4360025482606001510110156112615760405162461bcd60e51b815260040161041190612552565b50565b83604001518360400151101561128c5760405162461bcd60e51b815260040161041190612bd5565b8360600151836060015110156112b45760405162461bcd60e51b815260040161041190612df1565b6020830151156112c9576112c9838383611b8c565b50505050565b60008151836041011115611326578260410167ffffffffffffffff811180156112f757600080fd5b506040519080825280601f01601f191660200182016040528015611322576020820181803683370190505b5091505b6040850151606086015160006020850160018153836001820152826021820152866003890160418301376041870190209350505050949350505050565b60006102a86040518060a00160405280600015158152602001848152602001600081526020016000815260200160405180602001604052806000815250815250611c2d565b600083830364ffffffffff161180156113c357506020840151155b156113d3576113d3848483611b8c565b42846040015111156113f75760405162461bcd60e51b815260040161041190612b45565b43846060015111156112c95760405162461bcd60e51b815260040161041190612904565b60008082511161145c5760405162461bcd60e51b81526004018080602001828103825260348152602001806130286034913960400191505060405180910390fd5b815160011415611482578160008151811061147357fe5b602002602001015190506102ab565b60408051610200810182527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56381527f633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d60208201527f890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d818301527f3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd86060808301919091527fecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da60808301527fdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da560a08301527f617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d760c08301527f292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead60e08301527fe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e106101008301527f7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f826101208301527fe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e836365166101408301527f3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c6101608301527fad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e6101808301527fa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab6101a08301527f4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c8626101c08301527f2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf106101e083015282518381529081018352909160009190602082018180368337505085519192506000918291508180805b600184111561182b5750506002820460018084161460005b828110156117a7578a816002028151811061174e57fe5b602002602001015196508a816002026001018151811061176a57fe5b6020026020010151955086602089015285604089015287805190602001208b828151811061179457fe5b6020908102919091010152600101611737565b50801561180a578960018503815181106117bd57fe5b602002602001015195508783601081106117d357fe5b602002015160001b945085602088015284604088015286805190602001208a83815181106117fd57fe5b6020026020010181815250505b80611816576000611819565b60015b60ff168201935060019092019161171f565b8960008151811061183857fe5b602002602001015198505050505050505050919050565b60006118596106d2565b9050600080611866610d76565b50509150915060006040518060a00160405280856001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b1580156118b257600080fd5b505afa1580156118c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118ea9190612203565b81526020018a81526020018981526020018464ffffffffff16815260200160405180602001604052806000815250815250905080600001517f127186556e7be68c7e31263195225b4de02820707889540969f62c05cf73525e826020015183604001518460600151856080015160405161196794939291906124e6565b60405180910390a2600061197a82611c75565b90506000611992836040015186018a86018a8a611c9e565b60405163080549db60e21b81529091506001600160a01b03871690632015276c906119c390859085906004016124d0565b600060405180830381600087803b1580156119dd57600080fd5b505af11580156119f1573d6000803e3d6000fd5b505050505050505050505050505050565b6080810151805160009190826041820167ffffffffffffffff81118015611a2857600080fd5b506040519080825280601f01601f191660200182016040528015611a53576020820181803683370190505b5060408601516060870151919250906000602084016001815383600182015282602182015285604182018760208a0160045afa50604190950190942095505050505050919050565b6000611aa56106d2565b8351604051634a83e9cd60e11b81526001600160a01b039290921691639507d39a91611ad391600401612e7c565b60206040518083038186803b158015611aeb57600080fd5b505afa158015611aff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b239190612203565b611b2c84611c75565b14611b495760405162461bcd60e51b815260040161041190612b16565b611b66836020015185846000015185602001518760400151611cbd565b611b825760405162461bcd60e51b81526004016104119061294c565b5060019392505050565b6000611b9f8364ffffffffff1683610c36565b9050600154816020015164ffffffffff16014210611bcf5760405162461bcd60e51b815260040161041190612647565b806020015164ffffffffff1684604001511115611bfe5760405162461bcd60e51b8152600401610411906129cc565b806040015164ffffffffff16846060015111156112c95760405162461bcd60e51b815260040161041190612c74565b8051602080830151604080850151606086015160808701519251600096611c5896909594910161248f565b604051602081830303815290604052805190602001209050919050565b60008160200151826040015183606001518460800151604051602001611c5894939291906124e6565b602892831b9390931760509190911b1760789290921b91909117901b90565b6000808211611cfd5760405162461bcd60e51b8152600401808060200182810382526037815260200180612f7f6037913960400191505060405180910390fd5b818410611d3b5760405162461bcd60e51b8152600401808060200182810382526024815260200180612f2b6024913960400191505060405180910390fd5b611d4482611e42565b835114611d825760405162461bcd60e51b815260040180806020018281038252604d815260200180612fb6604d913960600191505060405180910390fd5b8460005b8451811015611e35578560011660011415611de457848181518110611da757fe5b6020026020010151826040516020018083815260200182815260200192505050604051602081830303815290604052805190602001209150611e29565b81858281518110611df157fe5b602002602001015160405160200180838152602001828152602001925050506040516020818303038152906040528051906020012091505b600195861c9501611d86565b5090951495945050505050565b6000808211611e825760405162461bcd60e51b8152600401808060200182810382526030815260200180612f4f6030913960400191505060405180910390fd5b8160011415611e93575060006102ab565b81600060805b60018110611ec3576000196001821b01811b831615611ebb5791821c91908101905b60011c611e99565b506001811b8414611ed2576001015b9392505050565b604080516060810182526000808252602082018190529181019190915290565b6040518060800160405280600081526020016000815260200160008152602001600081525090565b600067ffffffffffffffff831115611f3557fe5b611f48601f8401601f1916602001612ec1565b9050828152838383011115611f5c57600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b03811681146102ab57600080fd5b600082601f830112611f9a578081fd5b611ed283833560208501611f21565b8035600281106102ab57600080fd5b600060a08284031215611fc9578081fd5b60405160a0810167ffffffffffffffff8282108183111715611fe757fe5b8160405282935084358352602085013560208401526040850135604084015260608501356060840152608085013591508082111561202457600080fd5b5061203185828601611f8a565b6080830152505092915050565b60006040828403121561204f578081fd5b6040516040810167ffffffffffffffff828210818311171561206d57fe5b816040528293508435835260209150818501358181111561208d57600080fd5b8501601f8101871361209e57600080fd5b8035828111156120aa57fe5b83810292506120ba848401612ec1565b8181528481019083860185850187018b10156120d557600080fd5b600095505b838610156120f85780358352600195909501949186019186016120da565b5080868801525050505050505092915050565b600060a0828403121561211c578081fd5b60405160a0810167ffffffffffffffff828210818311171561213a57fe5b8160405282935084359150811515821461215357600080fd5b818352602085013560208401526040850135604084015260608501356060840152608085013591508082111561202457600080fd5b60008060006060848603121561219c578283fd5b6121a584611f73565b925060208401359150604084013567ffffffffffffffff8111156121c7578182fd5b6121d386828701611f8a565b9150509250925092565b6000602082840312156121ee578081fd5b815164ffffffffff1981168114611ed2578182fd5b600060208284031215612214578081fd5b5051919050565b60006020828403121561222c578081fd5b813567ffffffffffffffff811115612242578182fd5b8201601f81018413612252578182fd5b6103d284823560208401611f21565b60008060008060808587031215612276578081fd5b843567ffffffffffffffff8082111561228d578283fd5b9086019060e082890312156122a0578283fd5b6122aa60e0612ec1565b82358152602083013560208201526122c460408401611fa9565b60408201526122d560608401611f73565b60608201526122e660808401611f73565b608082015260a083013560a082015260c083013582811115612306578485fd5b6123128a828601611f8a565b60c0830152509550602087013591508082111561232d578283fd5b6123398883890161210b565b9450604087013591508082111561234e578283fd5b61235a88838901611fb8565b9350606087013591508082111561236f578283fd5b5061237c8782880161203e565b91505092959194509250565b600060208284031215612399578081fd5b5035919050565b60008151808452815b818110156123c5576020818501810151868301820152016123a9565b818111156123d65782602083870101525b50601f01601f19169290920160200192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612432908301846123a0565b9695505050505050565b6001600160a01b038781168252861660208201526040810185905260c06060820181905260009061246f908301866123a0565b60808301949094525060a00152949350505050565b901515815260200190565b6000861515825285602083015284604083015283606083015260a060808301526124bc60a08301846123a0565b979650505050505050565b90815260200190565b91825264ffffffffff1916602082015260400190565b60008582528460208301528360408301526080606083015261243260808301846123a0565b60208082526027908201527f617070656e64517565756542617463682069732063757272656e746c7920646960408201526639b0b13632b21760c91b606082015260800190565b60208082526029908201527f436f6e7465787420626c6f636b206e756d62657220746f6f2066617220696e206040820152683a3432903830b9ba1760b91b606082015260800190565b6020808252603d908201527f5472616e73616374696f6e20646174612073697a652065786365656473206d6160408201527f78696d756d20666f7220726f6c6c7570207472616e73616374696f6e2e000000606082015260800190565b6020808252602f908201527f436f6e746578742074696d657374616d70206973206c6f776572207468616e2060408201526e3630b9ba1039bab136b4ba3a32b21760891b606082015260800190565b6020808252605b908201527f50726576696f75736c7920656e7175657565642062617463686573206861766560408201527f206578706972656420616e64206d75737420626520617070656e64656420626560608201527f666f72652061206e65772073657175656e6365722062617463682e0000000000608082015260a00190565b6020808252602e908201527f496e76616c69642053657175656e636572207472616e73616374696f6e20696e60408201526d31b63ab9b4b7b710383937b7b31760911b606082015260800190565b60208082526032908201527f436f6e7465787420626c6f636b206e756d626572206973206c6f77657220746860408201527130b7103630b9ba1039bab136b4ba3a32b21760711b606082015260800190565b6020808252601e908201527f496e76616c69642053657175656e636572207472616e73616374696f6e2e0000604082015260600190565b6020808252603d908201527f5472616e73616374696f6e20676173206c696d69742065786365656473206d6160408201527f78696d756d20666f7220726f6c6c7570207472616e73616374696f6e2e000000606082015260800190565b60208082526028908201527f4d7573742070726f76696465206174206c65617374206f6e652062617463682060408201526731b7b73a32bc3a1760c11b606082015260800190565b6020808252602e908201527f4e6f7420616c6c2073657175656e636572207472616e73616374696f6e73207760408201526d32b93290383937b1b2b9b9b2b21760911b606082015260800190565b6020808252604a908201527f41637475616c207472616e73616374696f6e20696e64657820646f6573206e6f60408201527f74206d6174636820657870656374656420746f74616c20656c656d656e7473206060820152693a379030b83832b7321760b11b608082015260a00190565b60208082526028908201527f436f6e7465787420626c6f636b206e756d6265722069732066726f6d2074686560408201526710333aba3ab9329760c11b606082015260800190565b60208082526018908201527f496e76616c696420696e636c7573696f6e2070726f6f662e0000000000000000604082015260600190565b60208082526029908201527f5472616e73616374696f6e20676173206c696d697420746f6f206c6f7720746f6040820152681032b738bab2bab29760b91b606082015260800190565b60208082526043908201527f53657175656e636572207472616e73616374696f6e2074696d657374616d702060408201527f657863656564732074686174206f66206e65787420717565756520656c656d65606082015262373a1760e91b608082015260a00190565b6020808252603d908201527f41637475616c20626174636820737461727420696e64657820646f6573206e6f60408201527f74206d6174636820657870656374656420737461727420696e6465782e000000606082015260800190565b6020808252602d908201527f46756e6374696f6e2063616e206f6e6c792062652063616c6c6564206279207460408201526c34329029b2b8bab2b731b2b91760991b606082015260800190565b6020808252601a908201527f496e76616c6964205175657565207472616e73616374696f6e2e000000000000604082015260600190565b60208082526015908201527424b73b30b634b2103130ba31b4103432b0b232b91760591b604082015260600190565b60208082526025908201527f436f6e746578742074696d657374616d702069732066726f6d207468652066756040820152643a3ab9329760d91b606082015260800190565b6020808252602b908201527f496e73756666696369656e742067617320666f72204c322072617465206c696d60408201526a34ba34b73390313ab9371760a91b606082015260800190565b60208082526035908201527f436f6e746578742074696d657374616d702076616c756573206d757374206d6f6040820152743737ba37b734b1b0b6363c9034b731b932b0b9b29760591b606082015260800190565b6020808252602a908201527f496e76616c6964205175657565207472616e73616374696f6e20696e636c757360408201526934b7b710383937b7b31760b11b606082015260800190565b60208082526045908201527f53657175656e636572207472616e73616374696f6e20626c6f636b4e756d626560408201527f7220657863656564732074686174206f66206e65787420717565756520656c6560608201526436b2b73a1760d91b608082015260a00190565b60208082526021908201527f4d75737420617070656e64206174206c65617374206f6e6520656c656d656e746040820152601760f91b606082015260800190565b60208082526026908201527f436f6e746578742074696d657374616d7020746f6f2066617220696e20746865604082015265103830b9ba1760d11b606082015260800190565b60208082526022908201527f4e6f7420656e6f756768204261746368436f6e74657874732070726f76696465604082015261321760f11b606082015260800190565b60208082526029908201527f4e6f7420656e6f75676820717565756564207472616e73616374696f6e732074604082015268379030b83832b7321760b91b606082015260800190565b60208082526037908201527f436f6e7465787420626c6f636b4e756d6265722076616c756573206d7573742060408201527f6d6f6e6f746f6e6963616c6c7920696e6372656173652e000000000000000000606082015260800190565b8151815260208083015164ffffffffff90811691830191909152604092830151169181019190915260600190565b63ffffffff91909116815260200190565b64ffffffffff91909116815260200190565b64ffffffffff9384168152919092166020820152604081019190915260600190565b60405181810167ffffffffffffffff81118282101715612edd57fe5b60405291905056fe4f564d5f436861696e53746f72616765436f6e7461696e65723a4354433a71756575654f564d5f4465636f6d7072657373696f6e507265636f6d70696c65416464726573734c69625f4d65726b6c65547265653a20496e646578206f7574206f6620626f756e64732e4c69625f4d65726b6c65547265653a2043616e6e6f7420636f6d70757465206365696c286c6f675f3229206f6620302e4c69625f4d65726b6c65547265653a20546f74616c206c6561766573206d7573742062652067726561746572207468616e207a65726f2e4c69625f4d65726b6c65547265653a20546f74616c207369626c696e677320646f6573206e6f7420636f72726563746c7920636f72726573706f6e6420746f20746f74616c206c65617665732e4f564d5f436861696e53746f72616765436f6e7461696e65723a4354433a626174636865734c69625f4d65726b6c65547265653a204d7573742070726f76696465206174206c65617374206f6e65206c65616620686173682ea26469706673582212209b8491ed970ee9675604be8c2fab390420552fe108603099f2ea76166694e32c64736f6c63430007060033", + "devdoc": { + "details": "The Canonical Transaction Chain (CTC) contract is an append-only log of transactions which must be applied to the rollup state. It defines the ordering of rollup transactions by writing them to the 'CTC:batches' instance of the Chain Storage Container. The CTC also allows any account to 'enqueue' an L2 transaction, which will require that the Sequencer will eventually append it to the rollup state. If the Sequencer does not include an enqueued transaction within the 'force inclusion period', then any account may force it to be included by calling appendQueueBatch(). Compiler used: solc Runtime target: EVM", + "kind": "dev", + "methods": { + "appendSequencerBatch()": { + "details": "This function uses a custom encoding scheme for efficiency reasons. .param _shouldStartAtElement Specific batch we expect to start appending to. .param _totalElementsToAppend Total number of batch elements we expect to append. .param _contexts Array of batch contexts. .param _transactionDataFields Array of raw transaction data." + }, + "batches()": { + "returns": { + "_0": "Reference to the batch storage container." + } + }, + "enqueue(address,uint256,bytes)": { + "params": { + "_data": "Transaction data.", + "_gasLimit": "Gas limit for the enqueued L2 transaction.", + "_target": "Target L2 contract to send the transaction to." + } + }, + "getLastBlockNumber()": { + "returns": { + "_0": "Blocknumber for the last transaction." + } + }, + "getLastTimestamp()": { + "returns": { + "_0": "Timestamp for the last transaction." + } + }, + "getNextQueueIndex()": { + "returns": { + "_0": "Index for the next queue element." + } + }, + "getNumPendingQueueElements()": { + "returns": { + "_0": "Number of pending queue elements." + } + }, + "getQueueElement(uint256)": { + "params": { + "_index": "Index of the queue element to access." + }, + "returns": { + "_element": "Queue element at the given index." + } + }, + "getQueueLength()": { + "returns": { + "_0": "Length of the queue." + } + }, + "getTotalBatches()": { + "returns": { + "_totalBatches": "Total submitted batches." + } + }, + "getTotalElements()": { + "returns": { + "_totalElements": "Total submitted elements." + } + }, + "queue()": { + "returns": { + "_0": "Reference to the queue storage container." + } + }, + "resolve(string)": { + "params": { + "_name": "Name to resolve an address for." + }, + "returns": { + "_0": "Address associated with the given name." + } + }, + "verifyTransaction((uint256,uint256,uint8,address,address,uint256,bytes),(bool,uint256,uint256,uint256,bytes),(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))": { + "params": { + "_batchHeader": "Header of the batch the transaction was included in.", + "_inclusionProof": "Inclusion proof for the provided transaction chain element.", + "_transaction": "Transaction to verify.", + "_txChainElement": "Transaction chain element corresponding to the transaction." + }, + "returns": { + "_0": "True if the transaction exists in the CTC, false if not." + } + } + }, + "title": "OVM_CanonicalTransactionChain", + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": { + "appendQueueBatch(uint256)": { + "notice": "Appends a given number of queued transactions as a single batch. param _numQueuedTransactions Number of transactions to append." + }, + "appendSequencerBatch()": { + "notice": "Allows the sequencer to append a batch of transactions." + }, + "batches()": { + "notice": "Accesses the batch storage container." + }, + "enqueue(address,uint256,bytes)": { + "notice": "Adds a transaction to the queue." + }, + "getLastBlockNumber()": { + "notice": "Returns the blocknumber of the last transaction." + }, + "getLastTimestamp()": { + "notice": "Returns the timestamp of the last transaction." + }, + "getNextQueueIndex()": { + "notice": "Returns the index of the next element to be enqueued." + }, + "getNumPendingQueueElements()": { + "notice": "Get the number of queue elements which have not yet been included." + }, + "getQueueElement(uint256)": { + "notice": "Gets the queue element at a particular index." + }, + "getQueueLength()": { + "notice": "Retrieves the length of the queue, including both pending and canonical transactions." + }, + "getTotalBatches()": { + "notice": "Retrieves the total number of batches submitted." + }, + "getTotalElements()": { + "notice": "Retrieves the total number of elements submitted." + }, + "queue()": { + "notice": "Accesses the queue storage container." + }, + "resolve(string)": { + "notice": "Resolves the address associated with a given name." + }, + "verifyTransaction((uint256,uint256,uint8,address,address,uint256,bytes),(bool,uint256,uint256,uint256,bytes),(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))": { + "notice": "Verifies whether a transaction is included in the chain." + } + }, + "version": 1 + }, + "storageLayout": { + "storage": [ + { + "astId": 12055, + "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_CanonicalTransactionChain.sol:OVM_CanonicalTransactionChain", + "label": "libAddressManager", + "offset": 0, + "slot": "0", + "type": "t_contract(Lib_AddressManager)12048" + }, + { + "astId": 2189, + "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_CanonicalTransactionChain.sol:OVM_CanonicalTransactionChain", + "label": "forceInclusionPeriodSeconds", + "offset": 0, + "slot": "1", + "type": "t_uint256" + }, + { + "astId": 2191, + "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_CanonicalTransactionChain.sol:OVM_CanonicalTransactionChain", + "label": "forceInclusionPeriodBlocks", + "offset": 0, + "slot": "2", + "type": "t_uint256" + }, + { + "astId": 2193, + "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_CanonicalTransactionChain.sol:OVM_CanonicalTransactionChain", + "label": "maxTransactionGasLimit", + "offset": 0, + "slot": "3", + "type": "t_uint256" + } + ], + "types": { + "t_contract(Lib_AddressManager)12048": { + "encoding": "inplace", + "label": "contract Lib_AddressManager", + "numberOfBytes": "20" + }, + "t_uint256": { + "encoding": "inplace", + "label": "uint256", + "numberOfBytes": "32" + } + } + } +} \ No newline at end of file diff --git a/packages/contracts/deployments/goerli-v3/OVM_ChainStorageContainer:CTC:batches.json b/packages/contracts/deployments/goerli-v3/OVM_ChainStorageContainer:CTC:batches.json new file mode 100644 index 0000000000000..5e148d5feb950 --- /dev/null +++ b/packages/contracts/deployments/goerli-v3/OVM_ChainStorageContainer:CTC:batches.json @@ -0,0 +1,453 @@ +{ + "address": "0x7b439CD647b76F45252858C19093a53b4c5FD4B4", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_libAddressManager", + "type": "address" + }, + { + "internalType": "string", + "name": "_owner", + "type": "string" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_index", + "type": "uint256" + }, + { + "internalType": "bytes27", + "name": "_globalMetadata", + "type": "bytes27" + } + ], + "name": "deleteElementsAfterInclusive", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_index", + "type": "uint256" + } + ], + "name": "deleteElementsAfterInclusive", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_index", + "type": "uint256" + } + ], + "name": "get", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getGlobalMetadata", + "outputs": [ + { + "internalType": "bytes27", + "name": "", + "type": "bytes27" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "length", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "libAddressManager", + "outputs": [ + { + "internalType": "contract Lib_AddressManager", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_object", + "type": "bytes32" + }, + { + "internalType": "bytes27", + "name": "_globalMetadata", + "type": "bytes27" + } + ], + "name": "push", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_object", + "type": "bytes32" + } + ], + "name": "push", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "_name", + "type": "string" + } + ], + "name": "resolve", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes27", + "name": "_globalMetadata", + "type": "bytes27" + } + ], + "name": "setGlobalMetadata", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_index", + "type": "uint256" + } + ], + "name": "setNextOverwritableIndex", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "transactionHash": "0xccaaa6192d2aa73dae4313be6a950378b1b5d86850e6494dec408f625a0713b3", + "receipt": { + "to": null, + "from": "0x4107438C1b1579f258AF9d1AC06194C4a0F55040", + "contractAddress": "0x7b439CD647b76F45252858C19093a53b4c5FD4B4", + "transactionIndex": 7, + "gasUsed": "970990", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0x0689af29938844183d2d0c03d93df4c01f711064da67936dc6b2b77310b729b6", + "transactionHash": "0xccaaa6192d2aa73dae4313be6a950378b1b5d86850e6494dec408f625a0713b3", + "logs": [], + "blockNumber": 4694091, + "cumulativeGasUsed": "2858675", + "status": 1, + "byzantium": true + }, + "args": [ + "0xE3d08F0D900A2D53cB794cf82d7127764BcC3092", + "OVM_CanonicalTransactionChain" + ], + "solcInputHash": "dde656dd41f49cad9eac9bc7065fd6a7", + "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_owner\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"get\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getGlobalMetadata\",\"outputs\":[{\"internalType\":\"bytes27\",\"name\":\"\",\"type\":\"bytes27\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"length\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"setGlobalMetadata\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"setNextOverwritableIndex\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The Chain Storage Container provides its owner contract with read, write and delete functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which can no longer be used in a fraud proof due to the fraud window having passed, and the associated chain state or transactions being finalized. Three distinct Chain Storage Containers will be deployed on Layer 1: 1. Stores transaction batches for the Canonical Transaction Chain 2. Stores queued transactions for the Canonical Transaction Chain 3. Stores chain state batches for the State Commitment Chain Compiler used: solc Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\",\"_owner\":\"Name of the contract that owns this container (will be resolved later).\"}},\"deleteElementsAfterInclusive(uint256)\":{\"params\":{\"_index\":\"Object index to delete from.\"}},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_index\":\"Object index to delete from.\"}},\"get(uint256)\":{\"params\":{\"_index\":\"Index of the particular object to access.\"},\"returns\":{\"_0\":\"32 byte object value.\"}},\"getGlobalMetadata()\":{\"returns\":{\"_0\":\"Container global metadata field.\"}},\"length()\":{\"returns\":{\"_0\":\"Number of objects in the container.\"}},\"push(bytes32)\":{\"params\":{\"_object\":\"A 32 byte value to insert into the container.\"}},\"push(bytes32,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_object\":\"A 32 byte value to insert into the container.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}},\"setGlobalMetadata(bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata to set.\"}}},\"title\":\"OVM_ChainStorageContainer\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"deleteElementsAfterInclusive(uint256)\":{\"notice\":\"Removes all objects after and including a given index.\"},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"notice\":\"Removes all objects after and including a given index. Also allows setting the global metadata field.\"},\"get(uint256)\":{\"notice\":\"Retrieves an object from the container.\"},\"getGlobalMetadata()\":{\"notice\":\"Retrieves the container's global metadata field.\"},\"length()\":{\"notice\":\"Retrieves the number of objects stored in the container.\"},\"push(bytes32)\":{\"notice\":\"Pushes an object into the container.\"},\"push(bytes32,bytes27)\":{\"notice\":\"Pushes an object into the container. Function allows setting the global metadata since we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global metadata (it's an optimization).\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"},\"setGlobalMetadata(bytes27)\":{\"notice\":\"Sets the container's global metadata field. We're using `bytes27` here because we use five bytes to maintain the length of the underlying data structure, meaning we have an extra 27 bytes to store arbitrary data.\"},\"setNextOverwritableIndex(uint256)\":{\"notice\":\"Marks an index as overwritable, meaing the underlying buffer can start to write values over any objects before and including the given index.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol\":\"OVM_ChainStorageContainer\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor () internal {\\n address msgSender = _msgSender();\\n _owner = msgSender;\\n emit OwnershipTransferred(address(0), msgSender);\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n emit OwnershipTransferred(_owner, address(0));\\n _owner = address(0);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n emit OwnershipTransferred(_owner, newOwner);\\n _owner = newOwner;\\n }\\n}\\n\",\"keccak256\":\"0x15e2d5bd4c28a88548074c54d220e8086f638a71ed07e6b3ba5a70066fcf458d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with GSN meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address payable) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes memory) {\\n this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x8d3cb350f04ff49cfb10aef08d87f19dcbaecc8027b0bed12f3275cd12f38cf0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_RingBuffer } from \\\"../../libraries/utils/Lib_RingBuffer.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_ChainStorageContainer } from \\\"../../iOVM/chain/iOVM_ChainStorageContainer.sol\\\";\\n\\n/**\\n * @title OVM_ChainStorageContainer\\n * @dev The Chain Storage Container provides its owner contract with read, write and delete functionality.\\n * This provides gas efficiency gains by enabling it to overwrite storage slots which can no longer be used\\n * in a fraud proof due to the fraud window having passed, and the associated chain state or\\n * transactions being finalized.\\n * Three distinct Chain Storage Containers will be deployed on Layer 1:\\n * 1. Stores transaction batches for the Canonical Transaction Chain\\n * 2. Stores queued transactions for the Canonical Transaction Chain\\n * 3. Stores chain state batches for the State Commitment Chain\\n *\\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract OVM_ChainStorageContainer is iOVM_ChainStorageContainer, Lib_AddressResolver {\\n\\n /*************\\n * Libraries *\\n *************/\\n\\n using Lib_RingBuffer for Lib_RingBuffer.RingBuffer;\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n string public owner;\\n Lib_RingBuffer.RingBuffer internal buffer;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n * @param _owner Name of the contract that owns this container (will be resolved later).\\n */\\n constructor(\\n address _libAddressManager,\\n string memory _owner\\n )\\n Lib_AddressResolver(_libAddressManager)\\n {\\n owner = _owner;\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n msg.sender == resolve(owner),\\n \\\"OVM_ChainStorageContainer: Function can only be called by the owner.\\\"\\n );\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function setGlobalMetadata(\\n bytes27 _globalMetadata\\n )\\n override\\n public\\n onlyOwner\\n {\\n return buffer.setExtraData(_globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function getGlobalMetadata()\\n override\\n public\\n view\\n returns (\\n bytes27\\n )\\n {\\n return buffer.getExtraData();\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function length()\\n override\\n public\\n view\\n returns (\\n uint256\\n )\\n {\\n return uint256(buffer.getLength());\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function push(\\n bytes32 _object\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.push(_object);\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function push(\\n bytes32 _object,\\n bytes27 _globalMetadata\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.push(_object, _globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function get(\\n uint256 _index\\n )\\n override\\n public\\n view\\n returns (\\n bytes32\\n )\\n {\\n return buffer.get(uint40(_index));\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.deleteElementsAfterInclusive(\\n uint40(_index)\\n );\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index,\\n bytes27 _globalMetadata\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.deleteElementsAfterInclusive(\\n uint40(_index),\\n _globalMetadata\\n );\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function setNextOverwritableIndex(\\n uint256 _index\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.nextOverwritableIndex = _index;\\n }\\n}\\n\",\"keccak256\":\"0x93325c961516aa2a22bf1aacf4029353d5e3b693e04b485753170337b50224e6\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_ChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title iOVM_ChainStorageContainer\\n */\\ninterface iOVM_ChainStorageContainer {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata()\\n external\\n view\\n returns (\\n bytes27\\n );\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length()\\n external\\n view\\n returns (\\n uint256\\n );\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(\\n bytes32 _object\\n )\\n external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(\\n bytes32 _object,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(\\n uint256 _index\\n )\\n external\\n view\\n returns (\\n bytes32\\n );\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index\\n )\\n external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Marks an index as overwritable, meaing the underlying buffer can start to write values over\\n * any objects before and including the given index.\\n */\\n function setNextOverwritableIndex(\\n uint256 _index\\n )\\n external;\\n}\\n\",\"keccak256\":\"0x2d7973a0ad84c23ec62624d3f1e3aeb198cc72686ff1e6cfa17155556b320c94\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n public\\n onlyOwner\\n {\\n addresses[_getNameHash(_name)] = _address;\\n\\n emit AddressSet(\\n _name,\\n _address\\n );\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0x2ce671a0e004df88b136bea5a3c59d0732cea8887c8496da1d509e0200b03d7d\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(\\n address _libAddressManager\\n ) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x65981feeabff6a81783ea97d44baf988a18a86c8cb374c46fdb71819cbacc7c0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_RingBuffer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\nlibrary Lib_RingBuffer {\\n using Lib_RingBuffer for RingBuffer;\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Buffer {\\n uint256 length;\\n mapping (uint256 => bytes32) buf;\\n }\\n\\n struct RingBuffer {\\n bytes32 contextA;\\n bytes32 contextB;\\n Buffer bufferA;\\n Buffer bufferB;\\n uint256 nextOverwritableIndex;\\n }\\n\\n struct RingBufferContext {\\n // contextA\\n uint40 globalIndex;\\n bytes27 extraData;\\n\\n // contextB\\n uint64 currBufferIndex;\\n uint40 prevResetIndex;\\n uint40 currResetIndex;\\n }\\n\\n\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 constant MIN_CAPACITY = 16;\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n * @param _extraData Optional global extra data.\\n */\\n function push(\\n RingBuffer storage _self,\\n bytes32 _value,\\n bytes27 _extraData\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n Buffer storage currBuffer = _self.getBuffer(ctx.currBufferIndex);\\n\\n // Set a minimum capacity.\\n if (currBuffer.length == 0) {\\n currBuffer.length = MIN_CAPACITY;\\n }\\n\\n // Check if we need to expand the buffer.\\n if (ctx.globalIndex - ctx.currResetIndex >= currBuffer.length) {\\n if (ctx.currResetIndex < _self.nextOverwritableIndex) {\\n // We're going to overwrite the inactive buffer.\\n // Bump the buffer index, reset the delete offset, and set our reset indices.\\n ctx.currBufferIndex++;\\n ctx.prevResetIndex = ctx.currResetIndex;\\n ctx.currResetIndex = ctx.globalIndex;\\n\\n // Swap over to the next buffer.\\n currBuffer = _self.getBuffer(ctx.currBufferIndex);\\n } else {\\n // We're not overwriting yet, double the length of the current buffer.\\n currBuffer.length *= 2;\\n }\\n }\\n\\n // Index to write to is the difference of the global and reset indices.\\n uint256 writeHead = ctx.globalIndex - ctx.currResetIndex;\\n currBuffer.buf[writeHead] = _value;\\n\\n // Bump the global index and insert our extra data, then save the context.\\n ctx.globalIndex++;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n */\\n function push(\\n RingBuffer storage _self,\\n bytes32 _value\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n\\n _self.push(\\n _value,\\n ctx.extraData\\n );\\n }\\n\\n /**\\n * Retrieves an element from the buffer.\\n * @param _self Buffer to access.\\n * @param _index Element index to retrieve.\\n * @return Value of the element at the given index.\\n */\\n function get(\\n RingBuffer storage _self,\\n uint256 _index\\n )\\n internal\\n view\\n returns (\\n bytes32\\n )\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n\\n require(\\n _index < ctx.globalIndex,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n Buffer storage currBuffer = _self.getBuffer(ctx.currBufferIndex);\\n Buffer storage prevBuffer = _self.getBuffer(ctx.currBufferIndex + 1);\\n\\n if (_index >= ctx.currResetIndex) {\\n // We're trying to load an element from the current buffer.\\n // Relative index is just the difference from the reset index.\\n uint256 relativeIndex = _index - ctx.currResetIndex;\\n\\n // Shouldn't happen but why not check.\\n require(\\n relativeIndex < currBuffer.length,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n return currBuffer.buf[relativeIndex];\\n } else {\\n // We're trying to load an element from the previous buffer.\\n // Relative index is the difference from the reset index in the other direction.\\n uint256 relativeIndex = ctx.currResetIndex - _index;\\n\\n // Condition only fails in the case that we deleted and flipped buffers.\\n require(\\n ctx.currResetIndex > ctx.prevResetIndex,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n // Make sure we're not trying to read beyond the array.\\n require(\\n relativeIndex <= prevBuffer.length,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n return prevBuffer.buf[prevBuffer.length - relativeIndex];\\n }\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n * @param _extraData Optional global extra data.\\n */\\n function deleteElementsAfterInclusive(\\n RingBuffer storage _self,\\n uint40 _index,\\n bytes27 _extraData\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n\\n require(\\n _index < ctx.globalIndex && _index >= ctx.prevResetIndex,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n if (_index < ctx.currResetIndex) {\\n // We're switching back to the previous buffer.\\n // Reduce the buffer index, set the current reset index back to match the previous one.\\n // We use the equality of these two values to prevent reading beyond this buffer.\\n ctx.currBufferIndex--;\\n ctx.currResetIndex = ctx.prevResetIndex;\\n }\\n\\n // Set our global index and extra data, save the context.\\n ctx.globalIndex = _index;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n */\\n function deleteElementsAfterInclusive(\\n RingBuffer storage _self,\\n uint40 _index\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n _self.deleteElementsAfterInclusive(\\n _index,\\n ctx.extraData\\n );\\n }\\n\\n /**\\n * Retrieves the current global index.\\n * @param _self Buffer to access.\\n * @return Current global index.\\n */\\n function getLength(\\n RingBuffer storage _self\\n )\\n internal\\n view\\n returns (\\n uint40\\n )\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n return ctx.globalIndex;\\n }\\n\\n /**\\n * Changes current global extra data.\\n * @param _self Buffer to access.\\n * @param _extraData New global extra data.\\n */\\n function setExtraData(\\n RingBuffer storage _self,\\n bytes27 _extraData\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Retrieves the current global extra data.\\n * @param _self Buffer to access.\\n * @return Current global extra data.\\n */\\n function getExtraData(\\n RingBuffer storage _self\\n )\\n internal\\n view\\n returns (\\n bytes27\\n )\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n return ctx.extraData;\\n }\\n\\n /**\\n * Sets the current ring buffer context.\\n * @param _self Buffer to access.\\n * @param _ctx Current ring buffer context.\\n */\\n function setContext(\\n RingBuffer storage _self,\\n RingBufferContext memory _ctx\\n )\\n internal\\n {\\n bytes32 contextA;\\n bytes32 contextB;\\n\\n uint40 globalIndex = _ctx.globalIndex;\\n bytes27 extraData = _ctx.extraData;\\n assembly {\\n contextA := globalIndex\\n contextA := or(contextA, extraData)\\n }\\n\\n uint64 currBufferIndex = _ctx.currBufferIndex;\\n uint40 prevResetIndex = _ctx.prevResetIndex;\\n uint40 currResetIndex = _ctx.currResetIndex;\\n assembly {\\n contextB := currBufferIndex\\n contextB := or(contextB, shl(64, prevResetIndex))\\n contextB := or(contextB, shl(104, currResetIndex))\\n }\\n\\n if (_self.contextA != contextA) {\\n _self.contextA = contextA;\\n }\\n\\n if (_self.contextB != contextB) {\\n _self.contextB = contextB;\\n }\\n }\\n\\n /**\\n * Retrieves the current ring buffer context.\\n * @param _self Buffer to access.\\n * @return Current ring buffer context.\\n */\\n function getContext(\\n RingBuffer storage _self\\n )\\n internal\\n view\\n returns (\\n RingBufferContext memory\\n )\\n {\\n bytes32 contextA = _self.contextA;\\n bytes32 contextB = _self.contextB;\\n\\n uint40 globalIndex;\\n bytes27 extraData;\\n assembly {\\n globalIndex := and(contextA, 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF)\\n extraData := and(contextA, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000)\\n }\\n\\n uint64 currBufferIndex;\\n uint40 prevResetIndex;\\n uint40 currResetIndex;\\n assembly {\\n currBufferIndex := and(contextB, 0x000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF)\\n prevResetIndex := shr(64, and(contextB, 0x00000000000000000000000000000000000000FFFFFFFFFF0000000000000000))\\n currResetIndex := shr(104, and(contextB, 0x0000000000000000000000000000FFFFFFFFFF00000000000000000000000000))\\n }\\n\\n return RingBufferContext({\\n globalIndex: globalIndex,\\n extraData: extraData,\\n currBufferIndex: currBufferIndex,\\n prevResetIndex: prevResetIndex,\\n currResetIndex: currResetIndex\\n });\\n }\\n\\n /**\\n * Retrieves the a buffer from the ring buffer by index.\\n * @param _self Buffer to access.\\n * @param _which Index of the sub buffer to access.\\n * @return Sub buffer for the index.\\n */\\n function getBuffer(\\n RingBuffer storage _self,\\n uint256 _which\\n )\\n internal\\n view\\n returns (\\n Buffer storage\\n )\\n {\\n return _which % 2 == 0 ? _self.bufferA : _self.bufferB;\\n }\\n}\\n\",\"keccak256\":\"0xe30fc56d4499f98582e1f800dfa3b343f171163a557266c31a56449d5fd3ffae\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x60806040523480156200001157600080fd5b506040516200118d3803806200118d833981810160405260408110156200003757600080fd5b8151602083018051604051929492938301929190846401000000008211156200005f57600080fd5b9083019060208201858111156200007557600080fd5b82516401000000008111828201881017156200009057600080fd5b82525081516020918201929091019080838360005b83811015620000bf578181015183820152602001620000a5565b50505050905090810190601f168015620000ed5780820380516001836020036101000a031916815260200191505b506040525050600080546001600160a01b0319166001600160a01b038516179055508051620001249060019060208401906200012d565b505050620001d9565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282620001655760008555620001b0565b82601f106200018057805160ff1916838001178555620001b0565b82800160010185558215620001b0579182015b82811115620001b057825182559160200191906001019062000193565b50620001be929150620001c2565b5090565b5b80821115620001be5760008155600101620001c3565b610fa480620001e96000396000f3fe608060405234801561001057600080fd5b50600436106100b45760003560e01c80634651d91e116100715780634651d91e1461021a5780638da5cb5b146102375780639507d39a146102b4578063b298e36b146102d1578063ccf8f969146102ee578063fa9e936c14610311576100b4565b8063167fd681146100b95780631f7b6d32146100e65780632015276c1461010057806329061de21461012b578063299ca47814610150578063461a447814610174575b600080fd5b6100e4600480360360408110156100cf57600080fd5b508035906020013564ffffffffff191661032e565b005b6100ee610423565b60408051918252519081900360200190f35b6100e46004803603604081101561011657600080fd5b508035906020013564ffffffffff191661043b565b6100e46004803603602081101561014157600080fd5b503564ffffffffff19166104f7565b6101586105b5565b604080516001600160a01b039092168252519081900360200190f35b6101586004803603602081101561018a57600080fd5b8101906020810181356401000000008111156101a557600080fd5b8201836020820111156101b757600080fd5b803590602001918460018302840111640100000000831117156101d957600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506105c4945050505050565b6100e46004803603602081101561023057600080fd5b50356106a0565b61023f61075b565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610279578181015183820152602001610261565b50505050905090810190601f1680156102a65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6100ee600480360360208110156102ca57600080fd5b50356107e8565b6100e4600480360360208110156102e757600080fd5b5035610802565b6102f66108bd565b6040805164ffffffffff199092168252519081900360200190f35b6100e46004803603602081101561032757600080fd5b50356108ce565b60018054604080516020601f6002600019610100878916150201909516949094049384018190048102820181019092528281526103c493909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b820191906000526020600020905b81548152906001019060200180831161039d57829003601f168201915b50505050506105c4565b6001600160a01b0316336001600160a01b0316146104135760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b61041f60028383610983565b5050565b600061042f6002610a75565b64ffffffffff16905090565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261049c93909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146104eb5760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b61041f60028383610a89565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261055893909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146105a75760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b6105b2600282610b90565b50565b6000546001600160a01b031681565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b8381101561062457818101518382015260200161060c565b50505050905090810190601f1680156106515780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561066e57600080fd5b505afa158015610682573d6000803e3d6000fd5b505050506040513d602081101561069857600080fd5b505192915050565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261070193909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146107505760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b6105b2600282610bba565b60018054604080516020600284861615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156107e05780601f106107b5576101008083540402835291602001916107e0565b820191906000526020600020905b8154815290600101906020018083116107c357829003601f168201915b505050505081565b60006107fc600264ffffffffff8416610be0565b92915050565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261086393909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146108b25760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b6105b2600282610de9565b60006108c96002610e0f565b905090565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261092f93909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b03161461097e5760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b600855565b600061098e84610e26565b9050806000015164ffffffffff168364ffffffffff161080156109c35750806060015164ffffffffff168364ffffffffff1610155b610a0b576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b806080015164ffffffffff168364ffffffffff161015610a4d576040810180516000190167ffffffffffffffff169052606081015164ffffffffff1660808201525b64ffffffffff8316815264ffffffffff1982166020820152610a6f8482610e86565b50505050565b600080610a8183610e26565b519392505050565b6000610a9484610e26565b90506000610ab9826040015167ffffffffffffffff1686610edc90919063ffffffff16565b8054909150610ac757601081555b8054608083015183510364ffffffffff1610610b3e578460060154826080015164ffffffffff161015610b365760408201805160010167ffffffffffffffff169081905260808301805164ffffffffff90811660608601528451169052610b2f908690610edc565b9050610b3e565b805460020281555b608082015182510364ffffffffff9081166000818152600184810160209081526040909220889055855101909216845264ffffffffff19851691840191909152610b888684610e86565b505050505050565b6000610b9b83610e26565b64ffffffffff19831660208201529050610bb58382610e86565b505050565b6000610bc583610e26565b9050610bb5828260200151856109839092919063ffffffff16565b600080610bec84610e26565b805190915064ffffffffff168310610c42576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b6000610c65826040015167ffffffffffffffff1686610edc90919063ffffffff16565b90506000610c8d836040015160010167ffffffffffffffff1687610edc90919063ffffffff16565b9050826080015164ffffffffff168510610d1a576080830151825464ffffffffff9091168603908110610cfe576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b6000908152600190920160205250604090205491506107fc9050565b6080830151606084015164ffffffffff9182168781039290911610610d7d576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b8154811115610dca576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b81540360009081526001909101602052604090205492506107fc915050565b6000610df483610e26565b9050610bb582826020015185610a899092919063ffffffff16565b600080610e1b83610e26565b602001519392505050565b610e2e610efc565b5080546001909101546040805160a08101825264ffffffffff808516825264ffffffffff19909416602082015267ffffffffffffffff8316818301529082901c8316606082015260689190911c909116608082015290565b80516020820151604080840151606085015160808601518754858717969483901b8417606883901b1795939291908714610ebe578689555b85896001015414610ed157600189018690555b505050505050505050565b60006002820615610ef05782600401610ef5565b826002015b9392505050565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091529056fe4f564d5f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2063616e206f6e6c792062652063616c6c656420627920746865206f776e65722ea2646970667358221220376cbc00341dd082d644157f6511fcd1ac26a6a924d04ae6532cfcab93d9191864736f6c63430007060033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100b45760003560e01c80634651d91e116100715780634651d91e1461021a5780638da5cb5b146102375780639507d39a146102b4578063b298e36b146102d1578063ccf8f969146102ee578063fa9e936c14610311576100b4565b8063167fd681146100b95780631f7b6d32146100e65780632015276c1461010057806329061de21461012b578063299ca47814610150578063461a447814610174575b600080fd5b6100e4600480360360408110156100cf57600080fd5b508035906020013564ffffffffff191661032e565b005b6100ee610423565b60408051918252519081900360200190f35b6100e46004803603604081101561011657600080fd5b508035906020013564ffffffffff191661043b565b6100e46004803603602081101561014157600080fd5b503564ffffffffff19166104f7565b6101586105b5565b604080516001600160a01b039092168252519081900360200190f35b6101586004803603602081101561018a57600080fd5b8101906020810181356401000000008111156101a557600080fd5b8201836020820111156101b757600080fd5b803590602001918460018302840111640100000000831117156101d957600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506105c4945050505050565b6100e46004803603602081101561023057600080fd5b50356106a0565b61023f61075b565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610279578181015183820152602001610261565b50505050905090810190601f1680156102a65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6100ee600480360360208110156102ca57600080fd5b50356107e8565b6100e4600480360360208110156102e757600080fd5b5035610802565b6102f66108bd565b6040805164ffffffffff199092168252519081900360200190f35b6100e46004803603602081101561032757600080fd5b50356108ce565b60018054604080516020601f6002600019610100878916150201909516949094049384018190048102820181019092528281526103c493909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b820191906000526020600020905b81548152906001019060200180831161039d57829003601f168201915b50505050506105c4565b6001600160a01b0316336001600160a01b0316146104135760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b61041f60028383610983565b5050565b600061042f6002610a75565b64ffffffffff16905090565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261049c93909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146104eb5760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b61041f60028383610a89565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261055893909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146105a75760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b6105b2600282610b90565b50565b6000546001600160a01b031681565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b8381101561062457818101518382015260200161060c565b50505050905090810190601f1680156106515780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561066e57600080fd5b505afa158015610682573d6000803e3d6000fd5b505050506040513d602081101561069857600080fd5b505192915050565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261070193909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146107505760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b6105b2600282610bba565b60018054604080516020600284861615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156107e05780601f106107b5576101008083540402835291602001916107e0565b820191906000526020600020905b8154815290600101906020018083116107c357829003601f168201915b505050505081565b60006107fc600264ffffffffff8416610be0565b92915050565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261086393909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146108b25760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b6105b2600282610de9565b60006108c96002610e0f565b905090565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261092f93909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b03161461097e5760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b600855565b600061098e84610e26565b9050806000015164ffffffffff168364ffffffffff161080156109c35750806060015164ffffffffff168364ffffffffff1610155b610a0b576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b806080015164ffffffffff168364ffffffffff161015610a4d576040810180516000190167ffffffffffffffff169052606081015164ffffffffff1660808201525b64ffffffffff8316815264ffffffffff1982166020820152610a6f8482610e86565b50505050565b600080610a8183610e26565b519392505050565b6000610a9484610e26565b90506000610ab9826040015167ffffffffffffffff1686610edc90919063ffffffff16565b8054909150610ac757601081555b8054608083015183510364ffffffffff1610610b3e578460060154826080015164ffffffffff161015610b365760408201805160010167ffffffffffffffff169081905260808301805164ffffffffff90811660608601528451169052610b2f908690610edc565b9050610b3e565b805460020281555b608082015182510364ffffffffff9081166000818152600184810160209081526040909220889055855101909216845264ffffffffff19851691840191909152610b888684610e86565b505050505050565b6000610b9b83610e26565b64ffffffffff19831660208201529050610bb58382610e86565b505050565b6000610bc583610e26565b9050610bb5828260200151856109839092919063ffffffff16565b600080610bec84610e26565b805190915064ffffffffff168310610c42576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b6000610c65826040015167ffffffffffffffff1686610edc90919063ffffffff16565b90506000610c8d836040015160010167ffffffffffffffff1687610edc90919063ffffffff16565b9050826080015164ffffffffff168510610d1a576080830151825464ffffffffff9091168603908110610cfe576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b6000908152600190920160205250604090205491506107fc9050565b6080830151606084015164ffffffffff9182168781039290911610610d7d576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b8154811115610dca576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b81540360009081526001909101602052604090205492506107fc915050565b6000610df483610e26565b9050610bb582826020015185610a899092919063ffffffff16565b600080610e1b83610e26565b602001519392505050565b610e2e610efc565b5080546001909101546040805160a08101825264ffffffffff808516825264ffffffffff19909416602082015267ffffffffffffffff8316818301529082901c8316606082015260689190911c909116608082015290565b80516020820151604080840151606085015160808601518754858717969483901b8417606883901b1795939291908714610ebe578689555b85896001015414610ed157600189018690555b505050505050505050565b60006002820615610ef05782600401610ef5565b826002015b9392505050565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091529056fe4f564d5f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2063616e206f6e6c792062652063616c6c656420627920746865206f776e65722ea2646970667358221220376cbc00341dd082d644157f6511fcd1ac26a6a924d04ae6532cfcab93d9191864736f6c63430007060033", + "devdoc": { + "details": "The Chain Storage Container provides its owner contract with read, write and delete functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which can no longer be used in a fraud proof due to the fraud window having passed, and the associated chain state or transactions being finalized. Three distinct Chain Storage Containers will be deployed on Layer 1: 1. Stores transaction batches for the Canonical Transaction Chain 2. Stores queued transactions for the Canonical Transaction Chain 3. Stores chain state batches for the State Commitment Chain Compiler used: solc Runtime target: EVM", + "kind": "dev", + "methods": { + "constructor": { + "params": { + "_libAddressManager": "Address of the Address Manager.", + "_owner": "Name of the contract that owns this container (will be resolved later)." + } + }, + "deleteElementsAfterInclusive(uint256)": { + "params": { + "_index": "Object index to delete from." + } + }, + "deleteElementsAfterInclusive(uint256,bytes27)": { + "params": { + "_globalMetadata": "New global metadata for the container.", + "_index": "Object index to delete from." + } + }, + "get(uint256)": { + "params": { + "_index": "Index of the particular object to access." + }, + "returns": { + "_0": "32 byte object value." + } + }, + "getGlobalMetadata()": { + "returns": { + "_0": "Container global metadata field." + } + }, + "length()": { + "returns": { + "_0": "Number of objects in the container." + } + }, + "push(bytes32)": { + "params": { + "_object": "A 32 byte value to insert into the container." + } + }, + "push(bytes32,bytes27)": { + "params": { + "_globalMetadata": "New global metadata for the container.", + "_object": "A 32 byte value to insert into the container." + } + }, + "resolve(string)": { + "params": { + "_name": "Name to resolve an address for." + }, + "returns": { + "_0": "Address associated with the given name." + } + }, + "setGlobalMetadata(bytes27)": { + "params": { + "_globalMetadata": "New global metadata to set." + } + } + }, + "title": "OVM_ChainStorageContainer", + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": { + "deleteElementsAfterInclusive(uint256)": { + "notice": "Removes all objects after and including a given index." + }, + "deleteElementsAfterInclusive(uint256,bytes27)": { + "notice": "Removes all objects after and including a given index. Also allows setting the global metadata field." + }, + "get(uint256)": { + "notice": "Retrieves an object from the container." + }, + "getGlobalMetadata()": { + "notice": "Retrieves the container's global metadata field." + }, + "length()": { + "notice": "Retrieves the number of objects stored in the container." + }, + "push(bytes32)": { + "notice": "Pushes an object into the container." + }, + "push(bytes32,bytes27)": { + "notice": "Pushes an object into the container. Function allows setting the global metadata since we'll need to touch the \"length\" storage slot anyway, which also contains the global metadata (it's an optimization)." + }, + "resolve(string)": { + "notice": "Resolves the address associated with a given name." + }, + "setGlobalMetadata(bytes27)": { + "notice": "Sets the container's global metadata field. We're using `bytes27` here because we use five bytes to maintain the length of the underlying data structure, meaning we have an extra 27 bytes to store arbitrary data." + }, + "setNextOverwritableIndex(uint256)": { + "notice": "Marks an index as overwritable, meaing the underlying buffer can start to write values over any objects before and including the given index." + } + }, + "version": 1 + }, + "storageLayout": { + "storage": [ + { + "astId": 12055, + "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", + "label": "libAddressManager", + "offset": 0, + "slot": "0", + "type": "t_contract(Lib_AddressManager)12048" + }, + { + "astId": 3712, + "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", + "label": "owner", + "offset": 0, + "slot": "1", + "type": "t_string_storage" + }, + { + "astId": 3714, + "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", + "label": "buffer", + "offset": 0, + "slot": "2", + "type": "t_struct(RingBuffer)17101_storage" + } + ], + "types": { + "t_bytes32": { + "encoding": "inplace", + "label": "bytes32", + "numberOfBytes": "32" + }, + "t_contract(Lib_AddressManager)12048": { + "encoding": "inplace", + "label": "contract Lib_AddressManager", + "numberOfBytes": "20" + }, + "t_mapping(t_uint256,t_bytes32)": { + "encoding": "mapping", + "key": "t_uint256", + "label": "mapping(uint256 => bytes32)", + "numberOfBytes": "32", + "value": "t_bytes32" + }, + "t_string_storage": { + "encoding": "bytes", + "label": "string", + "numberOfBytes": "32" + }, + "t_struct(Buffer)17090_storage": { + "encoding": "inplace", + "label": "struct Lib_RingBuffer.Buffer", + "members": [ + { + "astId": 17085, + "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", + "label": "length", + "offset": 0, + "slot": "0", + "type": "t_uint256" + }, + { + "astId": 17089, + "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", + "label": "buf", + "offset": 0, + "slot": "1", + "type": "t_mapping(t_uint256,t_bytes32)" + } + ], + "numberOfBytes": "64" + }, + "t_struct(RingBuffer)17101_storage": { + "encoding": "inplace", + "label": "struct Lib_RingBuffer.RingBuffer", + "members": [ + { + "astId": 17092, + "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", + "label": "contextA", + "offset": 0, + "slot": "0", + "type": "t_bytes32" + }, + { + "astId": 17094, + "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", + "label": "contextB", + "offset": 0, + "slot": "1", + "type": "t_bytes32" + }, + { + "astId": 17096, + "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", + "label": "bufferA", + "offset": 0, + "slot": "2", + "type": "t_struct(Buffer)17090_storage" + }, + { + "astId": 17098, + "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", + "label": "bufferB", + "offset": 0, + "slot": "4", + "type": "t_struct(Buffer)17090_storage" + }, + { + "astId": 17100, + "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", + "label": "nextOverwritableIndex", + "offset": 0, + "slot": "6", + "type": "t_uint256" + } + ], + "numberOfBytes": "224" + }, + "t_uint256": { + "encoding": "inplace", + "label": "uint256", + "numberOfBytes": "32" + } + } + } +} \ No newline at end of file diff --git a/packages/contracts/deployments/goerli-v3/OVM_ChainStorageContainer:CTC:queue.json b/packages/contracts/deployments/goerli-v3/OVM_ChainStorageContainer:CTC:queue.json new file mode 100644 index 0000000000000..c75f6255c10d2 --- /dev/null +++ b/packages/contracts/deployments/goerli-v3/OVM_ChainStorageContainer:CTC:queue.json @@ -0,0 +1,453 @@ +{ + "address": "0xeD5fF8cFFba09fa5fF3104a63bA321733c4553d9", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_libAddressManager", + "type": "address" + }, + { + "internalType": "string", + "name": "_owner", + "type": "string" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_index", + "type": "uint256" + }, + { + "internalType": "bytes27", + "name": "_globalMetadata", + "type": "bytes27" + } + ], + "name": "deleteElementsAfterInclusive", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_index", + "type": "uint256" + } + ], + "name": "deleteElementsAfterInclusive", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_index", + "type": "uint256" + } + ], + "name": "get", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getGlobalMetadata", + "outputs": [ + { + "internalType": "bytes27", + "name": "", + "type": "bytes27" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "length", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "libAddressManager", + "outputs": [ + { + "internalType": "contract Lib_AddressManager", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_object", + "type": "bytes32" + }, + { + "internalType": "bytes27", + "name": "_globalMetadata", + "type": "bytes27" + } + ], + "name": "push", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_object", + "type": "bytes32" + } + ], + "name": "push", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "_name", + "type": "string" + } + ], + "name": "resolve", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes27", + "name": "_globalMetadata", + "type": "bytes27" + } + ], + "name": "setGlobalMetadata", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_index", + "type": "uint256" + } + ], + "name": "setNextOverwritableIndex", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "transactionHash": "0xc18d4e89a763706311175193d4f75a4677a551fb0d8c2ee18f4157192460084f", + "receipt": { + "to": null, + "from": "0x4107438C1b1579f258AF9d1AC06194C4a0F55040", + "contractAddress": "0xeD5fF8cFFba09fa5fF3104a63bA321733c4553d9", + "transactionIndex": 4, + "gasUsed": "970990", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0x9fa346bec2f0265f5d068bef12fcde397f7f3a0e808ecdda6516881286575e60", + "transactionHash": "0xc18d4e89a763706311175193d4f75a4677a551fb0d8c2ee18f4157192460084f", + "logs": [], + "blockNumber": 4694093, + "cumulativeGasUsed": "1626532", + "status": 1, + "byzantium": true + }, + "args": [ + "0xE3d08F0D900A2D53cB794cf82d7127764BcC3092", + "OVM_CanonicalTransactionChain" + ], + "solcInputHash": "dde656dd41f49cad9eac9bc7065fd6a7", + "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_owner\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"get\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getGlobalMetadata\",\"outputs\":[{\"internalType\":\"bytes27\",\"name\":\"\",\"type\":\"bytes27\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"length\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"setGlobalMetadata\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"setNextOverwritableIndex\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The Chain Storage Container provides its owner contract with read, write and delete functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which can no longer be used in a fraud proof due to the fraud window having passed, and the associated chain state or transactions being finalized. Three distinct Chain Storage Containers will be deployed on Layer 1: 1. Stores transaction batches for the Canonical Transaction Chain 2. Stores queued transactions for the Canonical Transaction Chain 3. Stores chain state batches for the State Commitment Chain Compiler used: solc Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\",\"_owner\":\"Name of the contract that owns this container (will be resolved later).\"}},\"deleteElementsAfterInclusive(uint256)\":{\"params\":{\"_index\":\"Object index to delete from.\"}},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_index\":\"Object index to delete from.\"}},\"get(uint256)\":{\"params\":{\"_index\":\"Index of the particular object to access.\"},\"returns\":{\"_0\":\"32 byte object value.\"}},\"getGlobalMetadata()\":{\"returns\":{\"_0\":\"Container global metadata field.\"}},\"length()\":{\"returns\":{\"_0\":\"Number of objects in the container.\"}},\"push(bytes32)\":{\"params\":{\"_object\":\"A 32 byte value to insert into the container.\"}},\"push(bytes32,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_object\":\"A 32 byte value to insert into the container.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}},\"setGlobalMetadata(bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata to set.\"}}},\"title\":\"OVM_ChainStorageContainer\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"deleteElementsAfterInclusive(uint256)\":{\"notice\":\"Removes all objects after and including a given index.\"},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"notice\":\"Removes all objects after and including a given index. Also allows setting the global metadata field.\"},\"get(uint256)\":{\"notice\":\"Retrieves an object from the container.\"},\"getGlobalMetadata()\":{\"notice\":\"Retrieves the container's global metadata field.\"},\"length()\":{\"notice\":\"Retrieves the number of objects stored in the container.\"},\"push(bytes32)\":{\"notice\":\"Pushes an object into the container.\"},\"push(bytes32,bytes27)\":{\"notice\":\"Pushes an object into the container. Function allows setting the global metadata since we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global metadata (it's an optimization).\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"},\"setGlobalMetadata(bytes27)\":{\"notice\":\"Sets the container's global metadata field. We're using `bytes27` here because we use five bytes to maintain the length of the underlying data structure, meaning we have an extra 27 bytes to store arbitrary data.\"},\"setNextOverwritableIndex(uint256)\":{\"notice\":\"Marks an index as overwritable, meaing the underlying buffer can start to write values over any objects before and including the given index.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol\":\"OVM_ChainStorageContainer\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor () internal {\\n address msgSender = _msgSender();\\n _owner = msgSender;\\n emit OwnershipTransferred(address(0), msgSender);\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n emit OwnershipTransferred(_owner, address(0));\\n _owner = address(0);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n emit OwnershipTransferred(_owner, newOwner);\\n _owner = newOwner;\\n }\\n}\\n\",\"keccak256\":\"0x15e2d5bd4c28a88548074c54d220e8086f638a71ed07e6b3ba5a70066fcf458d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with GSN meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address payable) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes memory) {\\n this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x8d3cb350f04ff49cfb10aef08d87f19dcbaecc8027b0bed12f3275cd12f38cf0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_RingBuffer } from \\\"../../libraries/utils/Lib_RingBuffer.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_ChainStorageContainer } from \\\"../../iOVM/chain/iOVM_ChainStorageContainer.sol\\\";\\n\\n/**\\n * @title OVM_ChainStorageContainer\\n * @dev The Chain Storage Container provides its owner contract with read, write and delete functionality.\\n * This provides gas efficiency gains by enabling it to overwrite storage slots which can no longer be used\\n * in a fraud proof due to the fraud window having passed, and the associated chain state or\\n * transactions being finalized.\\n * Three distinct Chain Storage Containers will be deployed on Layer 1:\\n * 1. Stores transaction batches for the Canonical Transaction Chain\\n * 2. Stores queued transactions for the Canonical Transaction Chain\\n * 3. Stores chain state batches for the State Commitment Chain\\n *\\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract OVM_ChainStorageContainer is iOVM_ChainStorageContainer, Lib_AddressResolver {\\n\\n /*************\\n * Libraries *\\n *************/\\n\\n using Lib_RingBuffer for Lib_RingBuffer.RingBuffer;\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n string public owner;\\n Lib_RingBuffer.RingBuffer internal buffer;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n * @param _owner Name of the contract that owns this container (will be resolved later).\\n */\\n constructor(\\n address _libAddressManager,\\n string memory _owner\\n )\\n Lib_AddressResolver(_libAddressManager)\\n {\\n owner = _owner;\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n msg.sender == resolve(owner),\\n \\\"OVM_ChainStorageContainer: Function can only be called by the owner.\\\"\\n );\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function setGlobalMetadata(\\n bytes27 _globalMetadata\\n )\\n override\\n public\\n onlyOwner\\n {\\n return buffer.setExtraData(_globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function getGlobalMetadata()\\n override\\n public\\n view\\n returns (\\n bytes27\\n )\\n {\\n return buffer.getExtraData();\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function length()\\n override\\n public\\n view\\n returns (\\n uint256\\n )\\n {\\n return uint256(buffer.getLength());\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function push(\\n bytes32 _object\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.push(_object);\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function push(\\n bytes32 _object,\\n bytes27 _globalMetadata\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.push(_object, _globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function get(\\n uint256 _index\\n )\\n override\\n public\\n view\\n returns (\\n bytes32\\n )\\n {\\n return buffer.get(uint40(_index));\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.deleteElementsAfterInclusive(\\n uint40(_index)\\n );\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index,\\n bytes27 _globalMetadata\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.deleteElementsAfterInclusive(\\n uint40(_index),\\n _globalMetadata\\n );\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function setNextOverwritableIndex(\\n uint256 _index\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.nextOverwritableIndex = _index;\\n }\\n}\\n\",\"keccak256\":\"0x93325c961516aa2a22bf1aacf4029353d5e3b693e04b485753170337b50224e6\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_ChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title iOVM_ChainStorageContainer\\n */\\ninterface iOVM_ChainStorageContainer {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata()\\n external\\n view\\n returns (\\n bytes27\\n );\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length()\\n external\\n view\\n returns (\\n uint256\\n );\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(\\n bytes32 _object\\n )\\n external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(\\n bytes32 _object,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(\\n uint256 _index\\n )\\n external\\n view\\n returns (\\n bytes32\\n );\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index\\n )\\n external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Marks an index as overwritable, meaing the underlying buffer can start to write values over\\n * any objects before and including the given index.\\n */\\n function setNextOverwritableIndex(\\n uint256 _index\\n )\\n external;\\n}\\n\",\"keccak256\":\"0x2d7973a0ad84c23ec62624d3f1e3aeb198cc72686ff1e6cfa17155556b320c94\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n public\\n onlyOwner\\n {\\n addresses[_getNameHash(_name)] = _address;\\n\\n emit AddressSet(\\n _name,\\n _address\\n );\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0x2ce671a0e004df88b136bea5a3c59d0732cea8887c8496da1d509e0200b03d7d\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(\\n address _libAddressManager\\n ) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x65981feeabff6a81783ea97d44baf988a18a86c8cb374c46fdb71819cbacc7c0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_RingBuffer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\nlibrary Lib_RingBuffer {\\n using Lib_RingBuffer for RingBuffer;\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Buffer {\\n uint256 length;\\n mapping (uint256 => bytes32) buf;\\n }\\n\\n struct RingBuffer {\\n bytes32 contextA;\\n bytes32 contextB;\\n Buffer bufferA;\\n Buffer bufferB;\\n uint256 nextOverwritableIndex;\\n }\\n\\n struct RingBufferContext {\\n // contextA\\n uint40 globalIndex;\\n bytes27 extraData;\\n\\n // contextB\\n uint64 currBufferIndex;\\n uint40 prevResetIndex;\\n uint40 currResetIndex;\\n }\\n\\n\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 constant MIN_CAPACITY = 16;\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n * @param _extraData Optional global extra data.\\n */\\n function push(\\n RingBuffer storage _self,\\n bytes32 _value,\\n bytes27 _extraData\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n Buffer storage currBuffer = _self.getBuffer(ctx.currBufferIndex);\\n\\n // Set a minimum capacity.\\n if (currBuffer.length == 0) {\\n currBuffer.length = MIN_CAPACITY;\\n }\\n\\n // Check if we need to expand the buffer.\\n if (ctx.globalIndex - ctx.currResetIndex >= currBuffer.length) {\\n if (ctx.currResetIndex < _self.nextOverwritableIndex) {\\n // We're going to overwrite the inactive buffer.\\n // Bump the buffer index, reset the delete offset, and set our reset indices.\\n ctx.currBufferIndex++;\\n ctx.prevResetIndex = ctx.currResetIndex;\\n ctx.currResetIndex = ctx.globalIndex;\\n\\n // Swap over to the next buffer.\\n currBuffer = _self.getBuffer(ctx.currBufferIndex);\\n } else {\\n // We're not overwriting yet, double the length of the current buffer.\\n currBuffer.length *= 2;\\n }\\n }\\n\\n // Index to write to is the difference of the global and reset indices.\\n uint256 writeHead = ctx.globalIndex - ctx.currResetIndex;\\n currBuffer.buf[writeHead] = _value;\\n\\n // Bump the global index and insert our extra data, then save the context.\\n ctx.globalIndex++;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n */\\n function push(\\n RingBuffer storage _self,\\n bytes32 _value\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n\\n _self.push(\\n _value,\\n ctx.extraData\\n );\\n }\\n\\n /**\\n * Retrieves an element from the buffer.\\n * @param _self Buffer to access.\\n * @param _index Element index to retrieve.\\n * @return Value of the element at the given index.\\n */\\n function get(\\n RingBuffer storage _self,\\n uint256 _index\\n )\\n internal\\n view\\n returns (\\n bytes32\\n )\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n\\n require(\\n _index < ctx.globalIndex,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n Buffer storage currBuffer = _self.getBuffer(ctx.currBufferIndex);\\n Buffer storage prevBuffer = _self.getBuffer(ctx.currBufferIndex + 1);\\n\\n if (_index >= ctx.currResetIndex) {\\n // We're trying to load an element from the current buffer.\\n // Relative index is just the difference from the reset index.\\n uint256 relativeIndex = _index - ctx.currResetIndex;\\n\\n // Shouldn't happen but why not check.\\n require(\\n relativeIndex < currBuffer.length,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n return currBuffer.buf[relativeIndex];\\n } else {\\n // We're trying to load an element from the previous buffer.\\n // Relative index is the difference from the reset index in the other direction.\\n uint256 relativeIndex = ctx.currResetIndex - _index;\\n\\n // Condition only fails in the case that we deleted and flipped buffers.\\n require(\\n ctx.currResetIndex > ctx.prevResetIndex,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n // Make sure we're not trying to read beyond the array.\\n require(\\n relativeIndex <= prevBuffer.length,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n return prevBuffer.buf[prevBuffer.length - relativeIndex];\\n }\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n * @param _extraData Optional global extra data.\\n */\\n function deleteElementsAfterInclusive(\\n RingBuffer storage _self,\\n uint40 _index,\\n bytes27 _extraData\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n\\n require(\\n _index < ctx.globalIndex && _index >= ctx.prevResetIndex,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n if (_index < ctx.currResetIndex) {\\n // We're switching back to the previous buffer.\\n // Reduce the buffer index, set the current reset index back to match the previous one.\\n // We use the equality of these two values to prevent reading beyond this buffer.\\n ctx.currBufferIndex--;\\n ctx.currResetIndex = ctx.prevResetIndex;\\n }\\n\\n // Set our global index and extra data, save the context.\\n ctx.globalIndex = _index;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n */\\n function deleteElementsAfterInclusive(\\n RingBuffer storage _self,\\n uint40 _index\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n _self.deleteElementsAfterInclusive(\\n _index,\\n ctx.extraData\\n );\\n }\\n\\n /**\\n * Retrieves the current global index.\\n * @param _self Buffer to access.\\n * @return Current global index.\\n */\\n function getLength(\\n RingBuffer storage _self\\n )\\n internal\\n view\\n returns (\\n uint40\\n )\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n return ctx.globalIndex;\\n }\\n\\n /**\\n * Changes current global extra data.\\n * @param _self Buffer to access.\\n * @param _extraData New global extra data.\\n */\\n function setExtraData(\\n RingBuffer storage _self,\\n bytes27 _extraData\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Retrieves the current global extra data.\\n * @param _self Buffer to access.\\n * @return Current global extra data.\\n */\\n function getExtraData(\\n RingBuffer storage _self\\n )\\n internal\\n view\\n returns (\\n bytes27\\n )\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n return ctx.extraData;\\n }\\n\\n /**\\n * Sets the current ring buffer context.\\n * @param _self Buffer to access.\\n * @param _ctx Current ring buffer context.\\n */\\n function setContext(\\n RingBuffer storage _self,\\n RingBufferContext memory _ctx\\n )\\n internal\\n {\\n bytes32 contextA;\\n bytes32 contextB;\\n\\n uint40 globalIndex = _ctx.globalIndex;\\n bytes27 extraData = _ctx.extraData;\\n assembly {\\n contextA := globalIndex\\n contextA := or(contextA, extraData)\\n }\\n\\n uint64 currBufferIndex = _ctx.currBufferIndex;\\n uint40 prevResetIndex = _ctx.prevResetIndex;\\n uint40 currResetIndex = _ctx.currResetIndex;\\n assembly {\\n contextB := currBufferIndex\\n contextB := or(contextB, shl(64, prevResetIndex))\\n contextB := or(contextB, shl(104, currResetIndex))\\n }\\n\\n if (_self.contextA != contextA) {\\n _self.contextA = contextA;\\n }\\n\\n if (_self.contextB != contextB) {\\n _self.contextB = contextB;\\n }\\n }\\n\\n /**\\n * Retrieves the current ring buffer context.\\n * @param _self Buffer to access.\\n * @return Current ring buffer context.\\n */\\n function getContext(\\n RingBuffer storage _self\\n )\\n internal\\n view\\n returns (\\n RingBufferContext memory\\n )\\n {\\n bytes32 contextA = _self.contextA;\\n bytes32 contextB = _self.contextB;\\n\\n uint40 globalIndex;\\n bytes27 extraData;\\n assembly {\\n globalIndex := and(contextA, 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF)\\n extraData := and(contextA, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000)\\n }\\n\\n uint64 currBufferIndex;\\n uint40 prevResetIndex;\\n uint40 currResetIndex;\\n assembly {\\n currBufferIndex := and(contextB, 0x000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF)\\n prevResetIndex := shr(64, and(contextB, 0x00000000000000000000000000000000000000FFFFFFFFFF0000000000000000))\\n currResetIndex := shr(104, and(contextB, 0x0000000000000000000000000000FFFFFFFFFF00000000000000000000000000))\\n }\\n\\n return RingBufferContext({\\n globalIndex: globalIndex,\\n extraData: extraData,\\n currBufferIndex: currBufferIndex,\\n prevResetIndex: prevResetIndex,\\n currResetIndex: currResetIndex\\n });\\n }\\n\\n /**\\n * Retrieves the a buffer from the ring buffer by index.\\n * @param _self Buffer to access.\\n * @param _which Index of the sub buffer to access.\\n * @return Sub buffer for the index.\\n */\\n function getBuffer(\\n RingBuffer storage _self,\\n uint256 _which\\n )\\n internal\\n view\\n returns (\\n Buffer storage\\n )\\n {\\n return _which % 2 == 0 ? _self.bufferA : _self.bufferB;\\n }\\n}\\n\",\"keccak256\":\"0xe30fc56d4499f98582e1f800dfa3b343f171163a557266c31a56449d5fd3ffae\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x60806040523480156200001157600080fd5b506040516200118d3803806200118d833981810160405260408110156200003757600080fd5b8151602083018051604051929492938301929190846401000000008211156200005f57600080fd5b9083019060208201858111156200007557600080fd5b82516401000000008111828201881017156200009057600080fd5b82525081516020918201929091019080838360005b83811015620000bf578181015183820152602001620000a5565b50505050905090810190601f168015620000ed5780820380516001836020036101000a031916815260200191505b506040525050600080546001600160a01b0319166001600160a01b038516179055508051620001249060019060208401906200012d565b505050620001d9565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282620001655760008555620001b0565b82601f106200018057805160ff1916838001178555620001b0565b82800160010185558215620001b0579182015b82811115620001b057825182559160200191906001019062000193565b50620001be929150620001c2565b5090565b5b80821115620001be5760008155600101620001c3565b610fa480620001e96000396000f3fe608060405234801561001057600080fd5b50600436106100b45760003560e01c80634651d91e116100715780634651d91e1461021a5780638da5cb5b146102375780639507d39a146102b4578063b298e36b146102d1578063ccf8f969146102ee578063fa9e936c14610311576100b4565b8063167fd681146100b95780631f7b6d32146100e65780632015276c1461010057806329061de21461012b578063299ca47814610150578063461a447814610174575b600080fd5b6100e4600480360360408110156100cf57600080fd5b508035906020013564ffffffffff191661032e565b005b6100ee610423565b60408051918252519081900360200190f35b6100e46004803603604081101561011657600080fd5b508035906020013564ffffffffff191661043b565b6100e46004803603602081101561014157600080fd5b503564ffffffffff19166104f7565b6101586105b5565b604080516001600160a01b039092168252519081900360200190f35b6101586004803603602081101561018a57600080fd5b8101906020810181356401000000008111156101a557600080fd5b8201836020820111156101b757600080fd5b803590602001918460018302840111640100000000831117156101d957600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506105c4945050505050565b6100e46004803603602081101561023057600080fd5b50356106a0565b61023f61075b565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610279578181015183820152602001610261565b50505050905090810190601f1680156102a65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6100ee600480360360208110156102ca57600080fd5b50356107e8565b6100e4600480360360208110156102e757600080fd5b5035610802565b6102f66108bd565b6040805164ffffffffff199092168252519081900360200190f35b6100e46004803603602081101561032757600080fd5b50356108ce565b60018054604080516020601f6002600019610100878916150201909516949094049384018190048102820181019092528281526103c493909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b820191906000526020600020905b81548152906001019060200180831161039d57829003601f168201915b50505050506105c4565b6001600160a01b0316336001600160a01b0316146104135760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b61041f60028383610983565b5050565b600061042f6002610a75565b64ffffffffff16905090565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261049c93909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146104eb5760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b61041f60028383610a89565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261055893909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146105a75760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b6105b2600282610b90565b50565b6000546001600160a01b031681565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b8381101561062457818101518382015260200161060c565b50505050905090810190601f1680156106515780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561066e57600080fd5b505afa158015610682573d6000803e3d6000fd5b505050506040513d602081101561069857600080fd5b505192915050565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261070193909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146107505760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b6105b2600282610bba565b60018054604080516020600284861615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156107e05780601f106107b5576101008083540402835291602001916107e0565b820191906000526020600020905b8154815290600101906020018083116107c357829003601f168201915b505050505081565b60006107fc600264ffffffffff8416610be0565b92915050565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261086393909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146108b25760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b6105b2600282610de9565b60006108c96002610e0f565b905090565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261092f93909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b03161461097e5760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b600855565b600061098e84610e26565b9050806000015164ffffffffff168364ffffffffff161080156109c35750806060015164ffffffffff168364ffffffffff1610155b610a0b576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b806080015164ffffffffff168364ffffffffff161015610a4d576040810180516000190167ffffffffffffffff169052606081015164ffffffffff1660808201525b64ffffffffff8316815264ffffffffff1982166020820152610a6f8482610e86565b50505050565b600080610a8183610e26565b519392505050565b6000610a9484610e26565b90506000610ab9826040015167ffffffffffffffff1686610edc90919063ffffffff16565b8054909150610ac757601081555b8054608083015183510364ffffffffff1610610b3e578460060154826080015164ffffffffff161015610b365760408201805160010167ffffffffffffffff169081905260808301805164ffffffffff90811660608601528451169052610b2f908690610edc565b9050610b3e565b805460020281555b608082015182510364ffffffffff9081166000818152600184810160209081526040909220889055855101909216845264ffffffffff19851691840191909152610b888684610e86565b505050505050565b6000610b9b83610e26565b64ffffffffff19831660208201529050610bb58382610e86565b505050565b6000610bc583610e26565b9050610bb5828260200151856109839092919063ffffffff16565b600080610bec84610e26565b805190915064ffffffffff168310610c42576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b6000610c65826040015167ffffffffffffffff1686610edc90919063ffffffff16565b90506000610c8d836040015160010167ffffffffffffffff1687610edc90919063ffffffff16565b9050826080015164ffffffffff168510610d1a576080830151825464ffffffffff9091168603908110610cfe576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b6000908152600190920160205250604090205491506107fc9050565b6080830151606084015164ffffffffff9182168781039290911610610d7d576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b8154811115610dca576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b81540360009081526001909101602052604090205492506107fc915050565b6000610df483610e26565b9050610bb582826020015185610a899092919063ffffffff16565b600080610e1b83610e26565b602001519392505050565b610e2e610efc565b5080546001909101546040805160a08101825264ffffffffff808516825264ffffffffff19909416602082015267ffffffffffffffff8316818301529082901c8316606082015260689190911c909116608082015290565b80516020820151604080840151606085015160808601518754858717969483901b8417606883901b1795939291908714610ebe578689555b85896001015414610ed157600189018690555b505050505050505050565b60006002820615610ef05782600401610ef5565b826002015b9392505050565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091529056fe4f564d5f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2063616e206f6e6c792062652063616c6c656420627920746865206f776e65722ea2646970667358221220376cbc00341dd082d644157f6511fcd1ac26a6a924d04ae6532cfcab93d9191864736f6c63430007060033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100b45760003560e01c80634651d91e116100715780634651d91e1461021a5780638da5cb5b146102375780639507d39a146102b4578063b298e36b146102d1578063ccf8f969146102ee578063fa9e936c14610311576100b4565b8063167fd681146100b95780631f7b6d32146100e65780632015276c1461010057806329061de21461012b578063299ca47814610150578063461a447814610174575b600080fd5b6100e4600480360360408110156100cf57600080fd5b508035906020013564ffffffffff191661032e565b005b6100ee610423565b60408051918252519081900360200190f35b6100e46004803603604081101561011657600080fd5b508035906020013564ffffffffff191661043b565b6100e46004803603602081101561014157600080fd5b503564ffffffffff19166104f7565b6101586105b5565b604080516001600160a01b039092168252519081900360200190f35b6101586004803603602081101561018a57600080fd5b8101906020810181356401000000008111156101a557600080fd5b8201836020820111156101b757600080fd5b803590602001918460018302840111640100000000831117156101d957600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506105c4945050505050565b6100e46004803603602081101561023057600080fd5b50356106a0565b61023f61075b565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610279578181015183820152602001610261565b50505050905090810190601f1680156102a65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6100ee600480360360208110156102ca57600080fd5b50356107e8565b6100e4600480360360208110156102e757600080fd5b5035610802565b6102f66108bd565b6040805164ffffffffff199092168252519081900360200190f35b6100e46004803603602081101561032757600080fd5b50356108ce565b60018054604080516020601f6002600019610100878916150201909516949094049384018190048102820181019092528281526103c493909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b820191906000526020600020905b81548152906001019060200180831161039d57829003601f168201915b50505050506105c4565b6001600160a01b0316336001600160a01b0316146104135760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b61041f60028383610983565b5050565b600061042f6002610a75565b64ffffffffff16905090565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261049c93909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146104eb5760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b61041f60028383610a89565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261055893909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146105a75760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b6105b2600282610b90565b50565b6000546001600160a01b031681565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b8381101561062457818101518382015260200161060c565b50505050905090810190601f1680156106515780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561066e57600080fd5b505afa158015610682573d6000803e3d6000fd5b505050506040513d602081101561069857600080fd5b505192915050565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261070193909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146107505760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b6105b2600282610bba565b60018054604080516020600284861615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156107e05780601f106107b5576101008083540402835291602001916107e0565b820191906000526020600020905b8154815290600101906020018083116107c357829003601f168201915b505050505081565b60006107fc600264ffffffffff8416610be0565b92915050565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261086393909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146108b25760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b6105b2600282610de9565b60006108c96002610e0f565b905090565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261092f93909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b03161461097e5760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b600855565b600061098e84610e26565b9050806000015164ffffffffff168364ffffffffff161080156109c35750806060015164ffffffffff168364ffffffffff1610155b610a0b576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b806080015164ffffffffff168364ffffffffff161015610a4d576040810180516000190167ffffffffffffffff169052606081015164ffffffffff1660808201525b64ffffffffff8316815264ffffffffff1982166020820152610a6f8482610e86565b50505050565b600080610a8183610e26565b519392505050565b6000610a9484610e26565b90506000610ab9826040015167ffffffffffffffff1686610edc90919063ffffffff16565b8054909150610ac757601081555b8054608083015183510364ffffffffff1610610b3e578460060154826080015164ffffffffff161015610b365760408201805160010167ffffffffffffffff169081905260808301805164ffffffffff90811660608601528451169052610b2f908690610edc565b9050610b3e565b805460020281555b608082015182510364ffffffffff9081166000818152600184810160209081526040909220889055855101909216845264ffffffffff19851691840191909152610b888684610e86565b505050505050565b6000610b9b83610e26565b64ffffffffff19831660208201529050610bb58382610e86565b505050565b6000610bc583610e26565b9050610bb5828260200151856109839092919063ffffffff16565b600080610bec84610e26565b805190915064ffffffffff168310610c42576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b6000610c65826040015167ffffffffffffffff1686610edc90919063ffffffff16565b90506000610c8d836040015160010167ffffffffffffffff1687610edc90919063ffffffff16565b9050826080015164ffffffffff168510610d1a576080830151825464ffffffffff9091168603908110610cfe576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b6000908152600190920160205250604090205491506107fc9050565b6080830151606084015164ffffffffff9182168781039290911610610d7d576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b8154811115610dca576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b81540360009081526001909101602052604090205492506107fc915050565b6000610df483610e26565b9050610bb582826020015185610a899092919063ffffffff16565b600080610e1b83610e26565b602001519392505050565b610e2e610efc565b5080546001909101546040805160a08101825264ffffffffff808516825264ffffffffff19909416602082015267ffffffffffffffff8316818301529082901c8316606082015260689190911c909116608082015290565b80516020820151604080840151606085015160808601518754858717969483901b8417606883901b1795939291908714610ebe578689555b85896001015414610ed157600189018690555b505050505050505050565b60006002820615610ef05782600401610ef5565b826002015b9392505050565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091529056fe4f564d5f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2063616e206f6e6c792062652063616c6c656420627920746865206f776e65722ea2646970667358221220376cbc00341dd082d644157f6511fcd1ac26a6a924d04ae6532cfcab93d9191864736f6c63430007060033", + "devdoc": { + "details": "The Chain Storage Container provides its owner contract with read, write and delete functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which can no longer be used in a fraud proof due to the fraud window having passed, and the associated chain state or transactions being finalized. Three distinct Chain Storage Containers will be deployed on Layer 1: 1. Stores transaction batches for the Canonical Transaction Chain 2. Stores queued transactions for the Canonical Transaction Chain 3. Stores chain state batches for the State Commitment Chain Compiler used: solc Runtime target: EVM", + "kind": "dev", + "methods": { + "constructor": { + "params": { + "_libAddressManager": "Address of the Address Manager.", + "_owner": "Name of the contract that owns this container (will be resolved later)." + } + }, + "deleteElementsAfterInclusive(uint256)": { + "params": { + "_index": "Object index to delete from." + } + }, + "deleteElementsAfterInclusive(uint256,bytes27)": { + "params": { + "_globalMetadata": "New global metadata for the container.", + "_index": "Object index to delete from." + } + }, + "get(uint256)": { + "params": { + "_index": "Index of the particular object to access." + }, + "returns": { + "_0": "32 byte object value." + } + }, + "getGlobalMetadata()": { + "returns": { + "_0": "Container global metadata field." + } + }, + "length()": { + "returns": { + "_0": "Number of objects in the container." + } + }, + "push(bytes32)": { + "params": { + "_object": "A 32 byte value to insert into the container." + } + }, + "push(bytes32,bytes27)": { + "params": { + "_globalMetadata": "New global metadata for the container.", + "_object": "A 32 byte value to insert into the container." + } + }, + "resolve(string)": { + "params": { + "_name": "Name to resolve an address for." + }, + "returns": { + "_0": "Address associated with the given name." + } + }, + "setGlobalMetadata(bytes27)": { + "params": { + "_globalMetadata": "New global metadata to set." + } + } + }, + "title": "OVM_ChainStorageContainer", + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": { + "deleteElementsAfterInclusive(uint256)": { + "notice": "Removes all objects after and including a given index." + }, + "deleteElementsAfterInclusive(uint256,bytes27)": { + "notice": "Removes all objects after and including a given index. Also allows setting the global metadata field." + }, + "get(uint256)": { + "notice": "Retrieves an object from the container." + }, + "getGlobalMetadata()": { + "notice": "Retrieves the container's global metadata field." + }, + "length()": { + "notice": "Retrieves the number of objects stored in the container." + }, + "push(bytes32)": { + "notice": "Pushes an object into the container." + }, + "push(bytes32,bytes27)": { + "notice": "Pushes an object into the container. Function allows setting the global metadata since we'll need to touch the \"length\" storage slot anyway, which also contains the global metadata (it's an optimization)." + }, + "resolve(string)": { + "notice": "Resolves the address associated with a given name." + }, + "setGlobalMetadata(bytes27)": { + "notice": "Sets the container's global metadata field. We're using `bytes27` here because we use five bytes to maintain the length of the underlying data structure, meaning we have an extra 27 bytes to store arbitrary data." + }, + "setNextOverwritableIndex(uint256)": { + "notice": "Marks an index as overwritable, meaing the underlying buffer can start to write values over any objects before and including the given index." + } + }, + "version": 1 + }, + "storageLayout": { + "storage": [ + { + "astId": 12055, + "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", + "label": "libAddressManager", + "offset": 0, + "slot": "0", + "type": "t_contract(Lib_AddressManager)12048" + }, + { + "astId": 3712, + "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", + "label": "owner", + "offset": 0, + "slot": "1", + "type": "t_string_storage" + }, + { + "astId": 3714, + "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", + "label": "buffer", + "offset": 0, + "slot": "2", + "type": "t_struct(RingBuffer)17101_storage" + } + ], + "types": { + "t_bytes32": { + "encoding": "inplace", + "label": "bytes32", + "numberOfBytes": "32" + }, + "t_contract(Lib_AddressManager)12048": { + "encoding": "inplace", + "label": "contract Lib_AddressManager", + "numberOfBytes": "20" + }, + "t_mapping(t_uint256,t_bytes32)": { + "encoding": "mapping", + "key": "t_uint256", + "label": "mapping(uint256 => bytes32)", + "numberOfBytes": "32", + "value": "t_bytes32" + }, + "t_string_storage": { + "encoding": "bytes", + "label": "string", + "numberOfBytes": "32" + }, + "t_struct(Buffer)17090_storage": { + "encoding": "inplace", + "label": "struct Lib_RingBuffer.Buffer", + "members": [ + { + "astId": 17085, + "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", + "label": "length", + "offset": 0, + "slot": "0", + "type": "t_uint256" + }, + { + "astId": 17089, + "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", + "label": "buf", + "offset": 0, + "slot": "1", + "type": "t_mapping(t_uint256,t_bytes32)" + } + ], + "numberOfBytes": "64" + }, + "t_struct(RingBuffer)17101_storage": { + "encoding": "inplace", + "label": "struct Lib_RingBuffer.RingBuffer", + "members": [ + { + "astId": 17092, + "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", + "label": "contextA", + "offset": 0, + "slot": "0", + "type": "t_bytes32" + }, + { + "astId": 17094, + "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", + "label": "contextB", + "offset": 0, + "slot": "1", + "type": "t_bytes32" + }, + { + "astId": 17096, + "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", + "label": "bufferA", + "offset": 0, + "slot": "2", + "type": "t_struct(Buffer)17090_storage" + }, + { + "astId": 17098, + "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", + "label": "bufferB", + "offset": 0, + "slot": "4", + "type": "t_struct(Buffer)17090_storage" + }, + { + "astId": 17100, + "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", + "label": "nextOverwritableIndex", + "offset": 0, + "slot": "6", + "type": "t_uint256" + } + ], + "numberOfBytes": "224" + }, + "t_uint256": { + "encoding": "inplace", + "label": "uint256", + "numberOfBytes": "32" + } + } + } +} \ No newline at end of file diff --git a/packages/contracts/deployments/goerli-v3/OVM_ChainStorageContainer:SCC:batches.json b/packages/contracts/deployments/goerli-v3/OVM_ChainStorageContainer:SCC:batches.json new file mode 100644 index 0000000000000..2920cf0e81d5f --- /dev/null +++ b/packages/contracts/deployments/goerli-v3/OVM_ChainStorageContainer:SCC:batches.json @@ -0,0 +1,453 @@ +{ + "address": "0x2A622E327D7A204b39355202d41BD9B752C8df54", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_libAddressManager", + "type": "address" + }, + { + "internalType": "string", + "name": "_owner", + "type": "string" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_index", + "type": "uint256" + }, + { + "internalType": "bytes27", + "name": "_globalMetadata", + "type": "bytes27" + } + ], + "name": "deleteElementsAfterInclusive", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_index", + "type": "uint256" + } + ], + "name": "deleteElementsAfterInclusive", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_index", + "type": "uint256" + } + ], + "name": "get", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getGlobalMetadata", + "outputs": [ + { + "internalType": "bytes27", + "name": "", + "type": "bytes27" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "length", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "libAddressManager", + "outputs": [ + { + "internalType": "contract Lib_AddressManager", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_object", + "type": "bytes32" + }, + { + "internalType": "bytes27", + "name": "_globalMetadata", + "type": "bytes27" + } + ], + "name": "push", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_object", + "type": "bytes32" + } + ], + "name": "push", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "_name", + "type": "string" + } + ], + "name": "resolve", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes27", + "name": "_globalMetadata", + "type": "bytes27" + } + ], + "name": "setGlobalMetadata", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_index", + "type": "uint256" + } + ], + "name": "setNextOverwritableIndex", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "transactionHash": "0x60b610c9b4ebbbbfb38e22d209b0d25a52527cb323941014114a4a2c362e2863", + "receipt": { + "to": null, + "from": "0x4107438C1b1579f258AF9d1AC06194C4a0F55040", + "contractAddress": "0x2A622E327D7A204b39355202d41BD9B752C8df54", + "transactionIndex": 3, + "gasUsed": "970930", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0xa654708146fc0e44c144ff624caea84d6cf5519c3421882cacb260ca6823123b", + "transactionHash": "0x60b610c9b4ebbbbfb38e22d209b0d25a52527cb323941014114a4a2c362e2863", + "logs": [], + "blockNumber": 4694097, + "cumulativeGasUsed": "1184521", + "status": 1, + "byzantium": true + }, + "args": [ + "0xE3d08F0D900A2D53cB794cf82d7127764BcC3092", + "OVM_StateCommitmentChain" + ], + "solcInputHash": "dde656dd41f49cad9eac9bc7065fd6a7", + "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_owner\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"get\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getGlobalMetadata\",\"outputs\":[{\"internalType\":\"bytes27\",\"name\":\"\",\"type\":\"bytes27\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"length\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"setGlobalMetadata\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"setNextOverwritableIndex\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The Chain Storage Container provides its owner contract with read, write and delete functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which can no longer be used in a fraud proof due to the fraud window having passed, and the associated chain state or transactions being finalized. Three distinct Chain Storage Containers will be deployed on Layer 1: 1. Stores transaction batches for the Canonical Transaction Chain 2. Stores queued transactions for the Canonical Transaction Chain 3. Stores chain state batches for the State Commitment Chain Compiler used: solc Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\",\"_owner\":\"Name of the contract that owns this container (will be resolved later).\"}},\"deleteElementsAfterInclusive(uint256)\":{\"params\":{\"_index\":\"Object index to delete from.\"}},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_index\":\"Object index to delete from.\"}},\"get(uint256)\":{\"params\":{\"_index\":\"Index of the particular object to access.\"},\"returns\":{\"_0\":\"32 byte object value.\"}},\"getGlobalMetadata()\":{\"returns\":{\"_0\":\"Container global metadata field.\"}},\"length()\":{\"returns\":{\"_0\":\"Number of objects in the container.\"}},\"push(bytes32)\":{\"params\":{\"_object\":\"A 32 byte value to insert into the container.\"}},\"push(bytes32,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_object\":\"A 32 byte value to insert into the container.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}},\"setGlobalMetadata(bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata to set.\"}}},\"title\":\"OVM_ChainStorageContainer\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"deleteElementsAfterInclusive(uint256)\":{\"notice\":\"Removes all objects after and including a given index.\"},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"notice\":\"Removes all objects after and including a given index. Also allows setting the global metadata field.\"},\"get(uint256)\":{\"notice\":\"Retrieves an object from the container.\"},\"getGlobalMetadata()\":{\"notice\":\"Retrieves the container's global metadata field.\"},\"length()\":{\"notice\":\"Retrieves the number of objects stored in the container.\"},\"push(bytes32)\":{\"notice\":\"Pushes an object into the container.\"},\"push(bytes32,bytes27)\":{\"notice\":\"Pushes an object into the container. Function allows setting the global metadata since we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global metadata (it's an optimization).\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"},\"setGlobalMetadata(bytes27)\":{\"notice\":\"Sets the container's global metadata field. We're using `bytes27` here because we use five bytes to maintain the length of the underlying data structure, meaning we have an extra 27 bytes to store arbitrary data.\"},\"setNextOverwritableIndex(uint256)\":{\"notice\":\"Marks an index as overwritable, meaing the underlying buffer can start to write values over any objects before and including the given index.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol\":\"OVM_ChainStorageContainer\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor () internal {\\n address msgSender = _msgSender();\\n _owner = msgSender;\\n emit OwnershipTransferred(address(0), msgSender);\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n emit OwnershipTransferred(_owner, address(0));\\n _owner = address(0);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n emit OwnershipTransferred(_owner, newOwner);\\n _owner = newOwner;\\n }\\n}\\n\",\"keccak256\":\"0x15e2d5bd4c28a88548074c54d220e8086f638a71ed07e6b3ba5a70066fcf458d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with GSN meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address payable) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes memory) {\\n this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x8d3cb350f04ff49cfb10aef08d87f19dcbaecc8027b0bed12f3275cd12f38cf0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_RingBuffer } from \\\"../../libraries/utils/Lib_RingBuffer.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_ChainStorageContainer } from \\\"../../iOVM/chain/iOVM_ChainStorageContainer.sol\\\";\\n\\n/**\\n * @title OVM_ChainStorageContainer\\n * @dev The Chain Storage Container provides its owner contract with read, write and delete functionality.\\n * This provides gas efficiency gains by enabling it to overwrite storage slots which can no longer be used\\n * in a fraud proof due to the fraud window having passed, and the associated chain state or\\n * transactions being finalized.\\n * Three distinct Chain Storage Containers will be deployed on Layer 1:\\n * 1. Stores transaction batches for the Canonical Transaction Chain\\n * 2. Stores queued transactions for the Canonical Transaction Chain\\n * 3. Stores chain state batches for the State Commitment Chain\\n *\\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract OVM_ChainStorageContainer is iOVM_ChainStorageContainer, Lib_AddressResolver {\\n\\n /*************\\n * Libraries *\\n *************/\\n\\n using Lib_RingBuffer for Lib_RingBuffer.RingBuffer;\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n string public owner;\\n Lib_RingBuffer.RingBuffer internal buffer;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n * @param _owner Name of the contract that owns this container (will be resolved later).\\n */\\n constructor(\\n address _libAddressManager,\\n string memory _owner\\n )\\n Lib_AddressResolver(_libAddressManager)\\n {\\n owner = _owner;\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n msg.sender == resolve(owner),\\n \\\"OVM_ChainStorageContainer: Function can only be called by the owner.\\\"\\n );\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function setGlobalMetadata(\\n bytes27 _globalMetadata\\n )\\n override\\n public\\n onlyOwner\\n {\\n return buffer.setExtraData(_globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function getGlobalMetadata()\\n override\\n public\\n view\\n returns (\\n bytes27\\n )\\n {\\n return buffer.getExtraData();\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function length()\\n override\\n public\\n view\\n returns (\\n uint256\\n )\\n {\\n return uint256(buffer.getLength());\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function push(\\n bytes32 _object\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.push(_object);\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function push(\\n bytes32 _object,\\n bytes27 _globalMetadata\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.push(_object, _globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function get(\\n uint256 _index\\n )\\n override\\n public\\n view\\n returns (\\n bytes32\\n )\\n {\\n return buffer.get(uint40(_index));\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.deleteElementsAfterInclusive(\\n uint40(_index)\\n );\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index,\\n bytes27 _globalMetadata\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.deleteElementsAfterInclusive(\\n uint40(_index),\\n _globalMetadata\\n );\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function setNextOverwritableIndex(\\n uint256 _index\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.nextOverwritableIndex = _index;\\n }\\n}\\n\",\"keccak256\":\"0x93325c961516aa2a22bf1aacf4029353d5e3b693e04b485753170337b50224e6\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_ChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title iOVM_ChainStorageContainer\\n */\\ninterface iOVM_ChainStorageContainer {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata()\\n external\\n view\\n returns (\\n bytes27\\n );\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length()\\n external\\n view\\n returns (\\n uint256\\n );\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(\\n bytes32 _object\\n )\\n external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(\\n bytes32 _object,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(\\n uint256 _index\\n )\\n external\\n view\\n returns (\\n bytes32\\n );\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index\\n )\\n external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Marks an index as overwritable, meaing the underlying buffer can start to write values over\\n * any objects before and including the given index.\\n */\\n function setNextOverwritableIndex(\\n uint256 _index\\n )\\n external;\\n}\\n\",\"keccak256\":\"0x2d7973a0ad84c23ec62624d3f1e3aeb198cc72686ff1e6cfa17155556b320c94\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n public\\n onlyOwner\\n {\\n addresses[_getNameHash(_name)] = _address;\\n\\n emit AddressSet(\\n _name,\\n _address\\n );\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0x2ce671a0e004df88b136bea5a3c59d0732cea8887c8496da1d509e0200b03d7d\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(\\n address _libAddressManager\\n ) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x65981feeabff6a81783ea97d44baf988a18a86c8cb374c46fdb71819cbacc7c0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_RingBuffer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\nlibrary Lib_RingBuffer {\\n using Lib_RingBuffer for RingBuffer;\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Buffer {\\n uint256 length;\\n mapping (uint256 => bytes32) buf;\\n }\\n\\n struct RingBuffer {\\n bytes32 contextA;\\n bytes32 contextB;\\n Buffer bufferA;\\n Buffer bufferB;\\n uint256 nextOverwritableIndex;\\n }\\n\\n struct RingBufferContext {\\n // contextA\\n uint40 globalIndex;\\n bytes27 extraData;\\n\\n // contextB\\n uint64 currBufferIndex;\\n uint40 prevResetIndex;\\n uint40 currResetIndex;\\n }\\n\\n\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 constant MIN_CAPACITY = 16;\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n * @param _extraData Optional global extra data.\\n */\\n function push(\\n RingBuffer storage _self,\\n bytes32 _value,\\n bytes27 _extraData\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n Buffer storage currBuffer = _self.getBuffer(ctx.currBufferIndex);\\n\\n // Set a minimum capacity.\\n if (currBuffer.length == 0) {\\n currBuffer.length = MIN_CAPACITY;\\n }\\n\\n // Check if we need to expand the buffer.\\n if (ctx.globalIndex - ctx.currResetIndex >= currBuffer.length) {\\n if (ctx.currResetIndex < _self.nextOverwritableIndex) {\\n // We're going to overwrite the inactive buffer.\\n // Bump the buffer index, reset the delete offset, and set our reset indices.\\n ctx.currBufferIndex++;\\n ctx.prevResetIndex = ctx.currResetIndex;\\n ctx.currResetIndex = ctx.globalIndex;\\n\\n // Swap over to the next buffer.\\n currBuffer = _self.getBuffer(ctx.currBufferIndex);\\n } else {\\n // We're not overwriting yet, double the length of the current buffer.\\n currBuffer.length *= 2;\\n }\\n }\\n\\n // Index to write to is the difference of the global and reset indices.\\n uint256 writeHead = ctx.globalIndex - ctx.currResetIndex;\\n currBuffer.buf[writeHead] = _value;\\n\\n // Bump the global index and insert our extra data, then save the context.\\n ctx.globalIndex++;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n */\\n function push(\\n RingBuffer storage _self,\\n bytes32 _value\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n\\n _self.push(\\n _value,\\n ctx.extraData\\n );\\n }\\n\\n /**\\n * Retrieves an element from the buffer.\\n * @param _self Buffer to access.\\n * @param _index Element index to retrieve.\\n * @return Value of the element at the given index.\\n */\\n function get(\\n RingBuffer storage _self,\\n uint256 _index\\n )\\n internal\\n view\\n returns (\\n bytes32\\n )\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n\\n require(\\n _index < ctx.globalIndex,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n Buffer storage currBuffer = _self.getBuffer(ctx.currBufferIndex);\\n Buffer storage prevBuffer = _self.getBuffer(ctx.currBufferIndex + 1);\\n\\n if (_index >= ctx.currResetIndex) {\\n // We're trying to load an element from the current buffer.\\n // Relative index is just the difference from the reset index.\\n uint256 relativeIndex = _index - ctx.currResetIndex;\\n\\n // Shouldn't happen but why not check.\\n require(\\n relativeIndex < currBuffer.length,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n return currBuffer.buf[relativeIndex];\\n } else {\\n // We're trying to load an element from the previous buffer.\\n // Relative index is the difference from the reset index in the other direction.\\n uint256 relativeIndex = ctx.currResetIndex - _index;\\n\\n // Condition only fails in the case that we deleted and flipped buffers.\\n require(\\n ctx.currResetIndex > ctx.prevResetIndex,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n // Make sure we're not trying to read beyond the array.\\n require(\\n relativeIndex <= prevBuffer.length,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n return prevBuffer.buf[prevBuffer.length - relativeIndex];\\n }\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n * @param _extraData Optional global extra data.\\n */\\n function deleteElementsAfterInclusive(\\n RingBuffer storage _self,\\n uint40 _index,\\n bytes27 _extraData\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n\\n require(\\n _index < ctx.globalIndex && _index >= ctx.prevResetIndex,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n if (_index < ctx.currResetIndex) {\\n // We're switching back to the previous buffer.\\n // Reduce the buffer index, set the current reset index back to match the previous one.\\n // We use the equality of these two values to prevent reading beyond this buffer.\\n ctx.currBufferIndex--;\\n ctx.currResetIndex = ctx.prevResetIndex;\\n }\\n\\n // Set our global index and extra data, save the context.\\n ctx.globalIndex = _index;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n */\\n function deleteElementsAfterInclusive(\\n RingBuffer storage _self,\\n uint40 _index\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n _self.deleteElementsAfterInclusive(\\n _index,\\n ctx.extraData\\n );\\n }\\n\\n /**\\n * Retrieves the current global index.\\n * @param _self Buffer to access.\\n * @return Current global index.\\n */\\n function getLength(\\n RingBuffer storage _self\\n )\\n internal\\n view\\n returns (\\n uint40\\n )\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n return ctx.globalIndex;\\n }\\n\\n /**\\n * Changes current global extra data.\\n * @param _self Buffer to access.\\n * @param _extraData New global extra data.\\n */\\n function setExtraData(\\n RingBuffer storage _self,\\n bytes27 _extraData\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Retrieves the current global extra data.\\n * @param _self Buffer to access.\\n * @return Current global extra data.\\n */\\n function getExtraData(\\n RingBuffer storage _self\\n )\\n internal\\n view\\n returns (\\n bytes27\\n )\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n return ctx.extraData;\\n }\\n\\n /**\\n * Sets the current ring buffer context.\\n * @param _self Buffer to access.\\n * @param _ctx Current ring buffer context.\\n */\\n function setContext(\\n RingBuffer storage _self,\\n RingBufferContext memory _ctx\\n )\\n internal\\n {\\n bytes32 contextA;\\n bytes32 contextB;\\n\\n uint40 globalIndex = _ctx.globalIndex;\\n bytes27 extraData = _ctx.extraData;\\n assembly {\\n contextA := globalIndex\\n contextA := or(contextA, extraData)\\n }\\n\\n uint64 currBufferIndex = _ctx.currBufferIndex;\\n uint40 prevResetIndex = _ctx.prevResetIndex;\\n uint40 currResetIndex = _ctx.currResetIndex;\\n assembly {\\n contextB := currBufferIndex\\n contextB := or(contextB, shl(64, prevResetIndex))\\n contextB := or(contextB, shl(104, currResetIndex))\\n }\\n\\n if (_self.contextA != contextA) {\\n _self.contextA = contextA;\\n }\\n\\n if (_self.contextB != contextB) {\\n _self.contextB = contextB;\\n }\\n }\\n\\n /**\\n * Retrieves the current ring buffer context.\\n * @param _self Buffer to access.\\n * @return Current ring buffer context.\\n */\\n function getContext(\\n RingBuffer storage _self\\n )\\n internal\\n view\\n returns (\\n RingBufferContext memory\\n )\\n {\\n bytes32 contextA = _self.contextA;\\n bytes32 contextB = _self.contextB;\\n\\n uint40 globalIndex;\\n bytes27 extraData;\\n assembly {\\n globalIndex := and(contextA, 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF)\\n extraData := and(contextA, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000)\\n }\\n\\n uint64 currBufferIndex;\\n uint40 prevResetIndex;\\n uint40 currResetIndex;\\n assembly {\\n currBufferIndex := and(contextB, 0x000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF)\\n prevResetIndex := shr(64, and(contextB, 0x00000000000000000000000000000000000000FFFFFFFFFF0000000000000000))\\n currResetIndex := shr(104, and(contextB, 0x0000000000000000000000000000FFFFFFFFFF00000000000000000000000000))\\n }\\n\\n return RingBufferContext({\\n globalIndex: globalIndex,\\n extraData: extraData,\\n currBufferIndex: currBufferIndex,\\n prevResetIndex: prevResetIndex,\\n currResetIndex: currResetIndex\\n });\\n }\\n\\n /**\\n * Retrieves the a buffer from the ring buffer by index.\\n * @param _self Buffer to access.\\n * @param _which Index of the sub buffer to access.\\n * @return Sub buffer for the index.\\n */\\n function getBuffer(\\n RingBuffer storage _self,\\n uint256 _which\\n )\\n internal\\n view\\n returns (\\n Buffer storage\\n )\\n {\\n return _which % 2 == 0 ? _self.bufferA : _self.bufferB;\\n }\\n}\\n\",\"keccak256\":\"0xe30fc56d4499f98582e1f800dfa3b343f171163a557266c31a56449d5fd3ffae\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x60806040523480156200001157600080fd5b506040516200118d3803806200118d833981810160405260408110156200003757600080fd5b8151602083018051604051929492938301929190846401000000008211156200005f57600080fd5b9083019060208201858111156200007557600080fd5b82516401000000008111828201881017156200009057600080fd5b82525081516020918201929091019080838360005b83811015620000bf578181015183820152602001620000a5565b50505050905090810190601f168015620000ed5780820380516001836020036101000a031916815260200191505b506040525050600080546001600160a01b0319166001600160a01b038516179055508051620001249060019060208401906200012d565b505050620001d9565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282620001655760008555620001b0565b82601f106200018057805160ff1916838001178555620001b0565b82800160010185558215620001b0579182015b82811115620001b057825182559160200191906001019062000193565b50620001be929150620001c2565b5090565b5b80821115620001be5760008155600101620001c3565b610fa480620001e96000396000f3fe608060405234801561001057600080fd5b50600436106100b45760003560e01c80634651d91e116100715780634651d91e1461021a5780638da5cb5b146102375780639507d39a146102b4578063b298e36b146102d1578063ccf8f969146102ee578063fa9e936c14610311576100b4565b8063167fd681146100b95780631f7b6d32146100e65780632015276c1461010057806329061de21461012b578063299ca47814610150578063461a447814610174575b600080fd5b6100e4600480360360408110156100cf57600080fd5b508035906020013564ffffffffff191661032e565b005b6100ee610423565b60408051918252519081900360200190f35b6100e46004803603604081101561011657600080fd5b508035906020013564ffffffffff191661043b565b6100e46004803603602081101561014157600080fd5b503564ffffffffff19166104f7565b6101586105b5565b604080516001600160a01b039092168252519081900360200190f35b6101586004803603602081101561018a57600080fd5b8101906020810181356401000000008111156101a557600080fd5b8201836020820111156101b757600080fd5b803590602001918460018302840111640100000000831117156101d957600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506105c4945050505050565b6100e46004803603602081101561023057600080fd5b50356106a0565b61023f61075b565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610279578181015183820152602001610261565b50505050905090810190601f1680156102a65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6100ee600480360360208110156102ca57600080fd5b50356107e8565b6100e4600480360360208110156102e757600080fd5b5035610802565b6102f66108bd565b6040805164ffffffffff199092168252519081900360200190f35b6100e46004803603602081101561032757600080fd5b50356108ce565b60018054604080516020601f6002600019610100878916150201909516949094049384018190048102820181019092528281526103c493909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b820191906000526020600020905b81548152906001019060200180831161039d57829003601f168201915b50505050506105c4565b6001600160a01b0316336001600160a01b0316146104135760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b61041f60028383610983565b5050565b600061042f6002610a75565b64ffffffffff16905090565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261049c93909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146104eb5760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b61041f60028383610a89565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261055893909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146105a75760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b6105b2600282610b90565b50565b6000546001600160a01b031681565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b8381101561062457818101518382015260200161060c565b50505050905090810190601f1680156106515780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561066e57600080fd5b505afa158015610682573d6000803e3d6000fd5b505050506040513d602081101561069857600080fd5b505192915050565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261070193909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146107505760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b6105b2600282610bba565b60018054604080516020600284861615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156107e05780601f106107b5576101008083540402835291602001916107e0565b820191906000526020600020905b8154815290600101906020018083116107c357829003601f168201915b505050505081565b60006107fc600264ffffffffff8416610be0565b92915050565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261086393909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146108b25760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b6105b2600282610de9565b60006108c96002610e0f565b905090565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261092f93909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b03161461097e5760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b600855565b600061098e84610e26565b9050806000015164ffffffffff168364ffffffffff161080156109c35750806060015164ffffffffff168364ffffffffff1610155b610a0b576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b806080015164ffffffffff168364ffffffffff161015610a4d576040810180516000190167ffffffffffffffff169052606081015164ffffffffff1660808201525b64ffffffffff8316815264ffffffffff1982166020820152610a6f8482610e86565b50505050565b600080610a8183610e26565b519392505050565b6000610a9484610e26565b90506000610ab9826040015167ffffffffffffffff1686610edc90919063ffffffff16565b8054909150610ac757601081555b8054608083015183510364ffffffffff1610610b3e578460060154826080015164ffffffffff161015610b365760408201805160010167ffffffffffffffff169081905260808301805164ffffffffff90811660608601528451169052610b2f908690610edc565b9050610b3e565b805460020281555b608082015182510364ffffffffff9081166000818152600184810160209081526040909220889055855101909216845264ffffffffff19851691840191909152610b888684610e86565b505050505050565b6000610b9b83610e26565b64ffffffffff19831660208201529050610bb58382610e86565b505050565b6000610bc583610e26565b9050610bb5828260200151856109839092919063ffffffff16565b600080610bec84610e26565b805190915064ffffffffff168310610c42576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b6000610c65826040015167ffffffffffffffff1686610edc90919063ffffffff16565b90506000610c8d836040015160010167ffffffffffffffff1687610edc90919063ffffffff16565b9050826080015164ffffffffff168510610d1a576080830151825464ffffffffff9091168603908110610cfe576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b6000908152600190920160205250604090205491506107fc9050565b6080830151606084015164ffffffffff9182168781039290911610610d7d576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b8154811115610dca576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b81540360009081526001909101602052604090205492506107fc915050565b6000610df483610e26565b9050610bb582826020015185610a899092919063ffffffff16565b600080610e1b83610e26565b602001519392505050565b610e2e610efc565b5080546001909101546040805160a08101825264ffffffffff808516825264ffffffffff19909416602082015267ffffffffffffffff8316818301529082901c8316606082015260689190911c909116608082015290565b80516020820151604080840151606085015160808601518754858717969483901b8417606883901b1795939291908714610ebe578689555b85896001015414610ed157600189018690555b505050505050505050565b60006002820615610ef05782600401610ef5565b826002015b9392505050565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091529056fe4f564d5f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2063616e206f6e6c792062652063616c6c656420627920746865206f776e65722ea2646970667358221220376cbc00341dd082d644157f6511fcd1ac26a6a924d04ae6532cfcab93d9191864736f6c63430007060033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100b45760003560e01c80634651d91e116100715780634651d91e1461021a5780638da5cb5b146102375780639507d39a146102b4578063b298e36b146102d1578063ccf8f969146102ee578063fa9e936c14610311576100b4565b8063167fd681146100b95780631f7b6d32146100e65780632015276c1461010057806329061de21461012b578063299ca47814610150578063461a447814610174575b600080fd5b6100e4600480360360408110156100cf57600080fd5b508035906020013564ffffffffff191661032e565b005b6100ee610423565b60408051918252519081900360200190f35b6100e46004803603604081101561011657600080fd5b508035906020013564ffffffffff191661043b565b6100e46004803603602081101561014157600080fd5b503564ffffffffff19166104f7565b6101586105b5565b604080516001600160a01b039092168252519081900360200190f35b6101586004803603602081101561018a57600080fd5b8101906020810181356401000000008111156101a557600080fd5b8201836020820111156101b757600080fd5b803590602001918460018302840111640100000000831117156101d957600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506105c4945050505050565b6100e46004803603602081101561023057600080fd5b50356106a0565b61023f61075b565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610279578181015183820152602001610261565b50505050905090810190601f1680156102a65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6100ee600480360360208110156102ca57600080fd5b50356107e8565b6100e4600480360360208110156102e757600080fd5b5035610802565b6102f66108bd565b6040805164ffffffffff199092168252519081900360200190f35b6100e46004803603602081101561032757600080fd5b50356108ce565b60018054604080516020601f6002600019610100878916150201909516949094049384018190048102820181019092528281526103c493909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b820191906000526020600020905b81548152906001019060200180831161039d57829003601f168201915b50505050506105c4565b6001600160a01b0316336001600160a01b0316146104135760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b61041f60028383610983565b5050565b600061042f6002610a75565b64ffffffffff16905090565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261049c93909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146104eb5760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b61041f60028383610a89565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261055893909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146105a75760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b6105b2600282610b90565b50565b6000546001600160a01b031681565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b8381101561062457818101518382015260200161060c565b50505050905090810190601f1680156106515780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561066e57600080fd5b505afa158015610682573d6000803e3d6000fd5b505050506040513d602081101561069857600080fd5b505192915050565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261070193909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146107505760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b6105b2600282610bba565b60018054604080516020600284861615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156107e05780601f106107b5576101008083540402835291602001916107e0565b820191906000526020600020905b8154815290600101906020018083116107c357829003601f168201915b505050505081565b60006107fc600264ffffffffff8416610be0565b92915050565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261086393909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146108b25760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b6105b2600282610de9565b60006108c96002610e0f565b905090565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261092f93909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b03161461097e5760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b600855565b600061098e84610e26565b9050806000015164ffffffffff168364ffffffffff161080156109c35750806060015164ffffffffff168364ffffffffff1610155b610a0b576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b806080015164ffffffffff168364ffffffffff161015610a4d576040810180516000190167ffffffffffffffff169052606081015164ffffffffff1660808201525b64ffffffffff8316815264ffffffffff1982166020820152610a6f8482610e86565b50505050565b600080610a8183610e26565b519392505050565b6000610a9484610e26565b90506000610ab9826040015167ffffffffffffffff1686610edc90919063ffffffff16565b8054909150610ac757601081555b8054608083015183510364ffffffffff1610610b3e578460060154826080015164ffffffffff161015610b365760408201805160010167ffffffffffffffff169081905260808301805164ffffffffff90811660608601528451169052610b2f908690610edc565b9050610b3e565b805460020281555b608082015182510364ffffffffff9081166000818152600184810160209081526040909220889055855101909216845264ffffffffff19851691840191909152610b888684610e86565b505050505050565b6000610b9b83610e26565b64ffffffffff19831660208201529050610bb58382610e86565b505050565b6000610bc583610e26565b9050610bb5828260200151856109839092919063ffffffff16565b600080610bec84610e26565b805190915064ffffffffff168310610c42576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b6000610c65826040015167ffffffffffffffff1686610edc90919063ffffffff16565b90506000610c8d836040015160010167ffffffffffffffff1687610edc90919063ffffffff16565b9050826080015164ffffffffff168510610d1a576080830151825464ffffffffff9091168603908110610cfe576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b6000908152600190920160205250604090205491506107fc9050565b6080830151606084015164ffffffffff9182168781039290911610610d7d576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b8154811115610dca576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b81540360009081526001909101602052604090205492506107fc915050565b6000610df483610e26565b9050610bb582826020015185610a899092919063ffffffff16565b600080610e1b83610e26565b602001519392505050565b610e2e610efc565b5080546001909101546040805160a08101825264ffffffffff808516825264ffffffffff19909416602082015267ffffffffffffffff8316818301529082901c8316606082015260689190911c909116608082015290565b80516020820151604080840151606085015160808601518754858717969483901b8417606883901b1795939291908714610ebe578689555b85896001015414610ed157600189018690555b505050505050505050565b60006002820615610ef05782600401610ef5565b826002015b9392505050565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091529056fe4f564d5f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2063616e206f6e6c792062652063616c6c656420627920746865206f776e65722ea2646970667358221220376cbc00341dd082d644157f6511fcd1ac26a6a924d04ae6532cfcab93d9191864736f6c63430007060033", + "devdoc": { + "details": "The Chain Storage Container provides its owner contract with read, write and delete functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which can no longer be used in a fraud proof due to the fraud window having passed, and the associated chain state or transactions being finalized. Three distinct Chain Storage Containers will be deployed on Layer 1: 1. Stores transaction batches for the Canonical Transaction Chain 2. Stores queued transactions for the Canonical Transaction Chain 3. Stores chain state batches for the State Commitment Chain Compiler used: solc Runtime target: EVM", + "kind": "dev", + "methods": { + "constructor": { + "params": { + "_libAddressManager": "Address of the Address Manager.", + "_owner": "Name of the contract that owns this container (will be resolved later)." + } + }, + "deleteElementsAfterInclusive(uint256)": { + "params": { + "_index": "Object index to delete from." + } + }, + "deleteElementsAfterInclusive(uint256,bytes27)": { + "params": { + "_globalMetadata": "New global metadata for the container.", + "_index": "Object index to delete from." + } + }, + "get(uint256)": { + "params": { + "_index": "Index of the particular object to access." + }, + "returns": { + "_0": "32 byte object value." + } + }, + "getGlobalMetadata()": { + "returns": { + "_0": "Container global metadata field." + } + }, + "length()": { + "returns": { + "_0": "Number of objects in the container." + } + }, + "push(bytes32)": { + "params": { + "_object": "A 32 byte value to insert into the container." + } + }, + "push(bytes32,bytes27)": { + "params": { + "_globalMetadata": "New global metadata for the container.", + "_object": "A 32 byte value to insert into the container." + } + }, + "resolve(string)": { + "params": { + "_name": "Name to resolve an address for." + }, + "returns": { + "_0": "Address associated with the given name." + } + }, + "setGlobalMetadata(bytes27)": { + "params": { + "_globalMetadata": "New global metadata to set." + } + } + }, + "title": "OVM_ChainStorageContainer", + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": { + "deleteElementsAfterInclusive(uint256)": { + "notice": "Removes all objects after and including a given index." + }, + "deleteElementsAfterInclusive(uint256,bytes27)": { + "notice": "Removes all objects after and including a given index. Also allows setting the global metadata field." + }, + "get(uint256)": { + "notice": "Retrieves an object from the container." + }, + "getGlobalMetadata()": { + "notice": "Retrieves the container's global metadata field." + }, + "length()": { + "notice": "Retrieves the number of objects stored in the container." + }, + "push(bytes32)": { + "notice": "Pushes an object into the container." + }, + "push(bytes32,bytes27)": { + "notice": "Pushes an object into the container. Function allows setting the global metadata since we'll need to touch the \"length\" storage slot anyway, which also contains the global metadata (it's an optimization)." + }, + "resolve(string)": { + "notice": "Resolves the address associated with a given name." + }, + "setGlobalMetadata(bytes27)": { + "notice": "Sets the container's global metadata field. We're using `bytes27` here because we use five bytes to maintain the length of the underlying data structure, meaning we have an extra 27 bytes to store arbitrary data." + }, + "setNextOverwritableIndex(uint256)": { + "notice": "Marks an index as overwritable, meaing the underlying buffer can start to write values over any objects before and including the given index." + } + }, + "version": 1 + }, + "storageLayout": { + "storage": [ + { + "astId": 12055, + "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", + "label": "libAddressManager", + "offset": 0, + "slot": "0", + "type": "t_contract(Lib_AddressManager)12048" + }, + { + "astId": 3712, + "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", + "label": "owner", + "offset": 0, + "slot": "1", + "type": "t_string_storage" + }, + { + "astId": 3714, + "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", + "label": "buffer", + "offset": 0, + "slot": "2", + "type": "t_struct(RingBuffer)17101_storage" + } + ], + "types": { + "t_bytes32": { + "encoding": "inplace", + "label": "bytes32", + "numberOfBytes": "32" + }, + "t_contract(Lib_AddressManager)12048": { + "encoding": "inplace", + "label": "contract Lib_AddressManager", + "numberOfBytes": "20" + }, + "t_mapping(t_uint256,t_bytes32)": { + "encoding": "mapping", + "key": "t_uint256", + "label": "mapping(uint256 => bytes32)", + "numberOfBytes": "32", + "value": "t_bytes32" + }, + "t_string_storage": { + "encoding": "bytes", + "label": "string", + "numberOfBytes": "32" + }, + "t_struct(Buffer)17090_storage": { + "encoding": "inplace", + "label": "struct Lib_RingBuffer.Buffer", + "members": [ + { + "astId": 17085, + "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", + "label": "length", + "offset": 0, + "slot": "0", + "type": "t_uint256" + }, + { + "astId": 17089, + "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", + "label": "buf", + "offset": 0, + "slot": "1", + "type": "t_mapping(t_uint256,t_bytes32)" + } + ], + "numberOfBytes": "64" + }, + "t_struct(RingBuffer)17101_storage": { + "encoding": "inplace", + "label": "struct Lib_RingBuffer.RingBuffer", + "members": [ + { + "astId": 17092, + "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", + "label": "contextA", + "offset": 0, + "slot": "0", + "type": "t_bytes32" + }, + { + "astId": 17094, + "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", + "label": "contextB", + "offset": 0, + "slot": "1", + "type": "t_bytes32" + }, + { + "astId": 17096, + "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", + "label": "bufferA", + "offset": 0, + "slot": "2", + "type": "t_struct(Buffer)17090_storage" + }, + { + "astId": 17098, + "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", + "label": "bufferB", + "offset": 0, + "slot": "4", + "type": "t_struct(Buffer)17090_storage" + }, + { + "astId": 17100, + "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", + "label": "nextOverwritableIndex", + "offset": 0, + "slot": "6", + "type": "t_uint256" + } + ], + "numberOfBytes": "224" + }, + "t_uint256": { + "encoding": "inplace", + "label": "uint256", + "numberOfBytes": "32" + } + } + } +} \ No newline at end of file diff --git a/packages/contracts/deployments/goerli-v3/OVM_ExecutionManager.json b/packages/contracts/deployments/goerli-v3/OVM_ExecutionManager.json new file mode 100644 index 0000000000000..ede173c71acb9 --- /dev/null +++ b/packages/contracts/deployments/goerli-v3/OVM_ExecutionManager.json @@ -0,0 +1,1269 @@ +{ + "address": "0x45B459295d6b08D7dA3B9daae541D5F75E1CF818", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_libAddressManager", + "type": "address" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "minTransactionGasLimit", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "maxTransactionGasLimit", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "maxGasPerQueuePerEpoch", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "secondsPerEpoch", + "type": "uint256" + } + ], + "internalType": "struct iOVM_ExecutionManager.GasMeterConfig", + "name": "_gasMeterConfig", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "ovmCHAINID", + "type": "uint256" + } + ], + "internalType": "struct iOVM_ExecutionManager.GlobalContext", + "name": "_globalContext", + "type": "tuple" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "name": "getMaxTransactionGasLimit", + "outputs": [ + { + "internalType": "uint256", + "name": "_maxTransactionGasLimit", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "libAddressManager", + "outputs": [ + { + "internalType": "contract Lib_AddressManager", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "ovmADDRESS", + "outputs": [ + { + "internalType": "address", + "name": "_ADDRESS", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_gasLimit", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_address", + "type": "address" + }, + { + "internalType": "bytes", + "name": "_calldata", + "type": "bytes" + } + ], + "name": "ovmCALL", + "outputs": [ + { + "internalType": "bool", + "name": "_success", + "type": "bool" + }, + { + "internalType": "bytes", + "name": "_returndata", + "type": "bytes" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "ovmCALLER", + "outputs": [ + { + "internalType": "address", + "name": "_CALLER", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "ovmCHAINID", + "outputs": [ + { + "internalType": "uint256", + "name": "_CHAINID", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "_bytecode", + "type": "bytes" + } + ], + "name": "ovmCREATE", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "_bytecode", + "type": "bytes" + }, + { + "internalType": "bytes32", + "name": "_salt", + "type": "bytes32" + } + ], + "name": "ovmCREATE2", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_messageHash", + "type": "bytes32" + }, + { + "internalType": "uint8", + "name": "_v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "_r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "_s", + "type": "bytes32" + } + ], + "name": "ovmCREATEEOA", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_gasLimit", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_address", + "type": "address" + }, + { + "internalType": "bytes", + "name": "_calldata", + "type": "bytes" + } + ], + "name": "ovmDELEGATECALL", + "outputs": [ + { + "internalType": "bool", + "name": "_success", + "type": "bool" + }, + { + "internalType": "bytes", + "name": "_returndata", + "type": "bytes" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_contract", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_offset", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_length", + "type": "uint256" + } + ], + "name": "ovmEXTCODECOPY", + "outputs": [ + { + "internalType": "bytes", + "name": "_code", + "type": "bytes" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_contract", + "type": "address" + } + ], + "name": "ovmEXTCODEHASH", + "outputs": [ + { + "internalType": "bytes32", + "name": "_EXTCODEHASH", + "type": "bytes32" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_contract", + "type": "address" + } + ], + "name": "ovmEXTCODESIZE", + "outputs": [ + { + "internalType": "uint256", + "name": "_EXTCODESIZE", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "ovmGASLIMIT", + "outputs": [ + { + "internalType": "uint256", + "name": "_GASLIMIT", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "ovmGETNONCE", + "outputs": [ + { + "internalType": "uint256", + "name": "_nonce", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "ovmINCREMENTNONCE", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "ovmL1QUEUEORIGIN", + "outputs": [ + { + "internalType": "enum Lib_OVMCodec.QueueOrigin", + "name": "_queueOrigin", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "ovmL1TXORIGIN", + "outputs": [ + { + "internalType": "address", + "name": "_l1TxOrigin", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "ovmNUMBER", + "outputs": [ + { + "internalType": "uint256", + "name": "_NUMBER", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "_data", + "type": "bytes" + } + ], + "name": "ovmREVERT", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_key", + "type": "bytes32" + } + ], + "name": "ovmSLOAD", + "outputs": [ + { + "internalType": "bytes32", + "name": "_value", + "type": "bytes32" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_key", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "_value", + "type": "bytes32" + } + ], + "name": "ovmSSTORE", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_gasLimit", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_address", + "type": "address" + }, + { + "internalType": "bytes", + "name": "_calldata", + "type": "bytes" + } + ], + "name": "ovmSTATICCALL", + "outputs": [ + { + "internalType": "bool", + "name": "_success", + "type": "bool" + }, + { + "internalType": "bytes", + "name": "_returndata", + "type": "bytes" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "ovmTIMESTAMP", + "outputs": [ + { + "internalType": "uint256", + "name": "_TIMESTAMP", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "_name", + "type": "string" + } + ], + "name": "resolve", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "timestamp", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "blockNumber", + "type": "uint256" + }, + { + "internalType": "enum Lib_OVMCodec.QueueOrigin", + "name": "l1QueueOrigin", + "type": "uint8" + }, + { + "internalType": "address", + "name": "l1TxOrigin", + "type": "address" + }, + { + "internalType": "address", + "name": "entrypoint", + "type": "address" + }, + { + "internalType": "uint256", + "name": "gasLimit", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "internalType": "struct Lib_OVMCodec.Transaction", + "name": "_transaction", + "type": "tuple" + }, + { + "internalType": "address", + "name": "_ovmStateManager", + "type": "address" + } + ], + "name": "run", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_gasLimit", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "_creationCode", + "type": "bytes" + }, + { + "internalType": "address", + "name": "_address", + "type": "address" + } + ], + "name": "safeCREATE", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "timestamp", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "blockNumber", + "type": "uint256" + }, + { + "internalType": "enum Lib_OVMCodec.QueueOrigin", + "name": "l1QueueOrigin", + "type": "uint8" + }, + { + "internalType": "address", + "name": "l1TxOrigin", + "type": "address" + }, + { + "internalType": "address", + "name": "entrypoint", + "type": "address" + }, + { + "internalType": "uint256", + "name": "gasLimit", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "internalType": "struct Lib_OVMCodec.Transaction", + "name": "_transaction", + "type": "tuple" + }, + { + "internalType": "address", + "name": "_from", + "type": "address" + }, + { + "internalType": "contract iOVM_StateManager", + "name": "_ovmStateManager", + "type": "address" + } + ], + "name": "simulateMessage", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + }, + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "transactionHash": "0xcda10869e171175332a8b2722029f315fe9742242599f6884958af3273c49fa0", + "receipt": { + "to": null, + "from": "0x4107438C1b1579f258AF9d1AC06194C4a0F55040", + "contractAddress": "0x45B459295d6b08D7dA3B9daae541D5F75E1CF818", + "transactionIndex": 2, + "gasUsed": "2937053", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0x35f0b7509eaacd23e211fd8242c268f94c1ab83a2e08567e65d82911da0364c4", + "transactionHash": "0xcda10869e171175332a8b2722029f315fe9742242599f6884958af3273c49fa0", + "logs": [], + "blockNumber": 4694112, + "cumulativeGasUsed": "3078528", + "status": 1, + "byzantium": true + }, + "args": [ + "0xE3d08F0D900A2D53cB794cf82d7127764BcC3092", + { + "minTransactionGasLimit": 50000, + "maxTransactionGasLimit": 9000000, + "maxGasPerQueuePerEpoch": 250000000, + "secondsPerEpoch": 0 + }, + { + "ovmCHAINID": 420 + } + ], + "solcInputHash": "dde656dd41f49cad9eac9bc7065fd6a7", + "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"minTransactionGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxTransactionGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxGasPerQueuePerEpoch\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"secondsPerEpoch\",\"type\":\"uint256\"}],\"internalType\":\"struct iOVM_ExecutionManager.GasMeterConfig\",\"name\":\"_gasMeterConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"ovmCHAINID\",\"type\":\"uint256\"}],\"internalType\":\"struct iOVM_ExecutionManager.GlobalContext\",\"name\":\"_globalContext\",\"type\":\"tuple\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"getMaxTransactionGasLimit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_maxTransactionGasLimit\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ovmADDRESS\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"_ADDRESS\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_address\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_calldata\",\"type\":\"bytes\"}],\"name\":\"ovmCALL\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"_success\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"_returndata\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ovmCALLER\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"_CALLER\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ovmCHAINID\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_CHAINID\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_bytecode\",\"type\":\"bytes\"}],\"name\":\"ovmCREATE\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_bytecode\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"_salt\",\"type\":\"bytes32\"}],\"name\":\"ovmCREATE2\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_messageHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint8\",\"name\":\"_v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"_r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"_s\",\"type\":\"bytes32\"}],\"name\":\"ovmCREATEEOA\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_address\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_calldata\",\"type\":\"bytes\"}],\"name\":\"ovmDELEGATECALL\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"_success\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"_returndata\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_contract\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_offset\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_length\",\"type\":\"uint256\"}],\"name\":\"ovmEXTCODECOPY\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"_code\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_contract\",\"type\":\"address\"}],\"name\":\"ovmEXTCODEHASH\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"_EXTCODEHASH\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_contract\",\"type\":\"address\"}],\"name\":\"ovmEXTCODESIZE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_EXTCODESIZE\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ovmGASLIMIT\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_GASLIMIT\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ovmGETNONCE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_nonce\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ovmINCREMENTNONCE\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ovmL1QUEUEORIGIN\",\"outputs\":[{\"internalType\":\"enum Lib_OVMCodec.QueueOrigin\",\"name\":\"_queueOrigin\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ovmL1TXORIGIN\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"_l1TxOrigin\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ovmNUMBER\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_NUMBER\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"ovmREVERT\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_key\",\"type\":\"bytes32\"}],\"name\":\"ovmSLOAD\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"_value\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_key\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"_value\",\"type\":\"bytes32\"}],\"name\":\"ovmSSTORE\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_address\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_calldata\",\"type\":\"bytes\"}],\"name\":\"ovmSTATICCALL\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"_success\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"_returndata\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ovmTIMESTAMP\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_TIMESTAMP\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"enum Lib_OVMCodec.QueueOrigin\",\"name\":\"l1QueueOrigin\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"l1TxOrigin\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"entrypoint\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.Transaction\",\"name\":\"_transaction\",\"type\":\"tuple\"},{\"internalType\":\"address\",\"name\":\"_ovmStateManager\",\"type\":\"address\"}],\"name\":\"run\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_creationCode\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"_address\",\"type\":\"address\"}],\"name\":\"safeCREATE\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"enum Lib_OVMCodec.QueueOrigin\",\"name\":\"l1QueueOrigin\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"l1TxOrigin\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"entrypoint\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.Transaction\",\"name\":\"_transaction\",\"type\":\"tuple\"},{\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"internalType\":\"contract iOVM_StateManager\",\"name\":\"_ovmStateManager\",\"type\":\"address\"}],\"name\":\"simulateMessage\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The Execution Manager (EM) is the core of our OVM implementation, and provides a sandboxed environment allowing us to execute OVM transactions deterministically on either Layer 1 or Layer 2. The EM's run() function is the first function called during the execution of any transaction on L2. For each context-dependent EVM operation the EM has a function which implements a corresponding OVM operation, which will read state from the State Manager contract. The EM relies on the Safety Checker to verify that code deployed to Layer 2 does not contain any context-dependent operations. Compiler used: solc Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\"}},\"ovmADDRESS()\":{\"returns\":{\"_ADDRESS\":\"Active ADDRESS within the current message context.\"}},\"ovmCALL(uint256,address,bytes)\":{\"params\":{\"_address\":\"Address of the contract to call.\",\"_calldata\":\"Data to send along with the call.\",\"_gasLimit\":\"Amount of gas to be passed into this call.\"},\"returns\":{\"_returndata\":\"Data returned by the call.\",\"_success\":\"Whether or not the call returned (rather than reverted).\"}},\"ovmCALLER()\":{\"returns\":{\"_CALLER\":\"Address of the CALLER within the current message context.\"}},\"ovmCHAINID()\":{\"returns\":{\"_CHAINID\":\"Value of the chain's CHAINID within the global context.\"}},\"ovmCREATE(bytes)\":{\"params\":{\"_bytecode\":\"Code to be used to CREATE a new contract.\"},\"returns\":{\"_0\":\"Address of the created contract.\",\"_1\":\"Revert data, if and only if the creation threw an exception.\"}},\"ovmCREATE2(bytes,bytes32)\":{\"params\":{\"_bytecode\":\"Code to be used to CREATE2 a new contract.\",\"_salt\":\"Value used to determine the contract's address.\"},\"returns\":{\"_0\":\"Address of the created contract.\",\"_1\":\"Revert data, if and only if the creation threw an exception.\"}},\"ovmCREATEEOA(bytes32,uint8,bytes32,bytes32)\":{\"details\":\"Essentially functions like ovmCREATE or ovmCREATE2, but we can bypass a lot of checks because the contract we're creating is trusted (no need to do safety checking or to handle unexpected reverts). Doesn't need to return an address because the address is assumed to be the user's actual address.\",\"params\":{\"_messageHash\":\"Hash of a message signed by some user, for verification.\",\"_r\":\"Signature `r` parameter.\",\"_s\":\"Signature `s` parameter.\",\"_v\":\"Signature `v` parameter.\"}},\"ovmDELEGATECALL(uint256,address,bytes)\":{\"params\":{\"_address\":\"Address of the contract to call.\",\"_calldata\":\"Data to send along with the call.\",\"_gasLimit\":\"Amount of gas to be passed into this call.\"},\"returns\":{\"_returndata\":\"Data returned by the call.\",\"_success\":\"Whether or not the call returned (rather than reverted).\"}},\"ovmEXTCODECOPY(address,uint256,uint256)\":{\"params\":{\"_contract\":\"Address of the contract to copy code from.\",\"_length\":\"Total number of bytes to copy from the contract's code.\",\"_offset\":\"Offset in bytes from the start of contract code to copy beyond.\"},\"returns\":{\"_code\":\"Bytes of code copied from the requested contract.\"}},\"ovmEXTCODEHASH(address)\":{\"params\":{\"_contract\":\"Address of the contract to query the hash of.\"},\"returns\":{\"_EXTCODEHASH\":\"Hash of the requested contract.\"}},\"ovmEXTCODESIZE(address)\":{\"params\":{\"_contract\":\"Address of the contract to query the size of.\"},\"returns\":{\"_EXTCODESIZE\":\"Size of the requested contract in bytes.\"}},\"ovmGASLIMIT()\":{\"returns\":{\"_GASLIMIT\":\"Value of the block's GASLIMIT within the transaction context.\"}},\"ovmGETNONCE()\":{\"returns\":{\"_nonce\":\"Nonce of the current contract.\"}},\"ovmL1QUEUEORIGIN()\":{\"returns\":{\"_queueOrigin\":\"Enum indicating the ovmL1QUEUEORIGIN within the current message context.\"}},\"ovmL1TXORIGIN()\":{\"returns\":{\"_l1TxOrigin\":\"Address of the account which sent the tx into L2 from L1.\"}},\"ovmNUMBER()\":{\"returns\":{\"_NUMBER\":\"Value of the NUMBER within the transaction context.\"}},\"ovmREVERT(bytes)\":{\"params\":{\"_data\":\"Bytes data to pass along with the REVERT.\"}},\"ovmSLOAD(bytes32)\":{\"params\":{\"_key\":\"32 byte key of the storage slot to load.\"},\"returns\":{\"_value\":\"32 byte value of the requested storage slot.\"}},\"ovmSSTORE(bytes32,bytes32)\":{\"params\":{\"_key\":\"32 byte key of the storage slot to set.\",\"_value\":\"32 byte value for the storage slot.\"}},\"ovmSTATICCALL(uint256,address,bytes)\":{\"params\":{\"_address\":\"Address of the contract to call.\",\"_calldata\":\"Data to send along with the call.\",\"_gasLimit\":\"Amount of gas to be passed into this call.\"},\"returns\":{\"_returndata\":\"Data returned by the call.\",\"_success\":\"Whether or not the call returned (rather than reverted).\"}},\"ovmTIMESTAMP()\":{\"returns\":{\"_TIMESTAMP\":\"Value of the TIMESTAMP within the transaction context.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}},\"run((uint256,uint256,uint8,address,address,uint256,bytes),address)\":{\"params\":{\"_ovmStateManager\":\"iOVM_StateManager implementation providing account state.\",\"_transaction\":\"Transaction data to be executed.\"}},\"safeCREATE(uint256,bytes,address)\":{\"params\":{\"_address\":\"OVM address being deployed to.\",\"_creationCode\":\"Code to pass into CREATE for deployment.\",\"_gasLimit\":\"Amount of gas to be passed into this creation.\"}},\"simulateMessage((uint256,uint256,uint8,address,address,uint256,bytes),address,address)\":{\"params\":{\"_from\":\"the OVM account the simulated call should be from.\",\"_transaction\":\"the message transaction to simulate.\"}}},\"title\":\"OVM_ExecutionManager\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"ovmADDRESS()\":{\"notice\":\"Overrides ADDRESS.\"},\"ovmCALL(uint256,address,bytes)\":{\"notice\":\"Overrides CALL.\"},\"ovmCALLER()\":{\"notice\":\"Overrides CALLER.\"},\"ovmCHAINID()\":{\"notice\":\"Overrides CHAINID.\"},\"ovmCREATE(bytes)\":{\"notice\":\"Overrides CREATE.\"},\"ovmCREATE2(bytes,bytes32)\":{\"notice\":\"Overrides CREATE2.\"},\"ovmCREATEEOA(bytes32,uint8,bytes32,bytes32)\":{\"notice\":\"Creates a new EOA contract account, for account abstraction.\"},\"ovmDELEGATECALL(uint256,address,bytes)\":{\"notice\":\"Overrides DELEGATECALL.\"},\"ovmEXTCODECOPY(address,uint256,uint256)\":{\"notice\":\"Overrides EXTCODECOPY.\"},\"ovmEXTCODEHASH(address)\":{\"notice\":\"Overrides EXTCODEHASH.\"},\"ovmEXTCODESIZE(address)\":{\"notice\":\"Overrides EXTCODESIZE.\"},\"ovmGASLIMIT()\":{\"notice\":\"Overrides GASLIMIT.\"},\"ovmGETNONCE()\":{\"notice\":\"Retrieves the nonce of the current ovmADDRESS.\"},\"ovmINCREMENTNONCE()\":{\"notice\":\"Bumps the nonce of the current ovmADDRESS by one.\"},\"ovmL1QUEUEORIGIN()\":{\"notice\":\"Specifies from which source (Sequencer or Queue) this transaction originated from.\"},\"ovmL1TXORIGIN()\":{\"notice\":\"Specifies which L1 account, if any, sent this transaction by calling enqueue().\"},\"ovmNUMBER()\":{\"notice\":\"Overrides NUMBER.\"},\"ovmREVERT(bytes)\":{\"notice\":\"Overrides REVERT.\"},\"ovmSLOAD(bytes32)\":{\"notice\":\"Overrides SLOAD.\"},\"ovmSSTORE(bytes32,bytes32)\":{\"notice\":\"Overrides SSTORE.\"},\"ovmSTATICCALL(uint256,address,bytes)\":{\"notice\":\"Overrides STATICCALL.\"},\"ovmTIMESTAMP()\":{\"notice\":\"Overrides TIMESTAMP.\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"},\"run((uint256,uint256,uint8,address,address,uint256,bytes),address)\":{\"notice\":\"Starts the execution of a transaction via the OVM_ExecutionManager.\"},\"safeCREATE(uint256,bytes,address)\":{\"notice\":\"Handles the creation-specific safety measures required for OVM contract deployment. This function sanitizes the return types for creation messages to match calls (bool, bytes), by being an external function which the EM can call, that mimics the success/fail case of the CREATE. This allows for consistent handling of both types of messages in _handleExternalMessage(). Having this step occur as a separate call frame also allows us to easily revert the contract deployment in the event that the code is unsafe.\"},\"simulateMessage((uint256,uint256,uint8,address,address,uint256,bytes),address,address)\":{\"notice\":\"Unreachable helper function for simulating eth_calls with an OVM message context. This function will throw an exception in all cases other than when used as a custom entrypoint in L2 Geth to simulate eth_call.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol\":\"OVM_ExecutionManager\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor () internal {\\n address msgSender = _msgSender();\\n _owner = msgSender;\\n emit OwnershipTransferred(address(0), msgSender);\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n emit OwnershipTransferred(_owner, address(0));\\n _owner = address(0);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n emit OwnershipTransferred(_owner, newOwner);\\n _owner = newOwner;\\n }\\n}\\n\",\"keccak256\":\"0x15e2d5bd4c28a88548074c54d220e8086f638a71ed07e6b3ba5a70066fcf458d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with GSN meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address payable) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes memory) {\\n this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x8d3cb350f04ff49cfb10aef08d87f19dcbaecc8027b0bed12f3275cd12f38cf0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// @unsupported: ovm\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\nimport { Lib_EthUtils } from \\\"../../libraries/utils/Lib_EthUtils.sol\\\";\\nimport { Lib_ErrorUtils } from \\\"../../libraries/utils/Lib_ErrorUtils.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_ExecutionManager } from \\\"../../iOVM/execution/iOVM_ExecutionManager.sol\\\";\\nimport { iOVM_StateManager } from \\\"../../iOVM/execution/iOVM_StateManager.sol\\\";\\nimport { iOVM_SafetyChecker } from \\\"../../iOVM/execution/iOVM_SafetyChecker.sol\\\";\\n\\n/* Contract Imports */\\nimport { OVM_DeployerWhitelist } from \\\"../predeploys/OVM_DeployerWhitelist.sol\\\";\\n\\n/**\\n * @title OVM_ExecutionManager\\n * @dev The Execution Manager (EM) is the core of our OVM implementation, and provides a sandboxed\\n * environment allowing us to execute OVM transactions deterministically on either Layer 1 or\\n * Layer 2.\\n * The EM's run() function is the first function called during the execution of any\\n * transaction on L2.\\n * For each context-dependent EVM operation the EM has a function which implements a corresponding\\n * OVM operation, which will read state from the State Manager contract.\\n * The EM relies on the Safety Checker to verify that code deployed to Layer 2 does not contain any\\n * context-dependent operations.\\n *\\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract OVM_ExecutionManager is iOVM_ExecutionManager, Lib_AddressResolver {\\n\\n /********************************\\n * External Contract References *\\n ********************************/\\n\\n iOVM_SafetyChecker internal ovmSafetyChecker;\\n iOVM_StateManager internal ovmStateManager;\\n\\n\\n /*******************************\\n * Execution Context Variables *\\n *******************************/\\n\\n GasMeterConfig internal gasMeterConfig;\\n GlobalContext internal globalContext;\\n TransactionContext internal transactionContext;\\n MessageContext internal messageContext;\\n TransactionRecord internal transactionRecord;\\n MessageRecord internal messageRecord;\\n\\n\\n /**************************\\n * Gas Metering Constants *\\n **************************/\\n\\n address constant GAS_METADATA_ADDRESS = 0x06a506A506a506A506a506a506A506A506A506A5;\\n uint256 constant NUISANCE_GAS_SLOAD = 20000;\\n uint256 constant NUISANCE_GAS_SSTORE = 20000;\\n uint256 constant MIN_NUISANCE_GAS_PER_CONTRACT = 30000;\\n uint256 constant NUISANCE_GAS_PER_CONTRACT_BYTE = 100;\\n uint256 constant MIN_GAS_FOR_INVALID_STATE_ACCESS = 30000;\\n\\n /**************************\\n * Default Context Values *\\n **************************/\\n\\n uint256 constant DEFAULT_UINT256 = 0xdefa017defa017defa017defa017defa017defa017defa017defa017defa017d;\\n address constant DEFAULT_ADDRESS = 0xdEfa017defA017DeFA017DEfa017DeFA017DeFa0;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n */\\n constructor(\\n address _libAddressManager,\\n GasMeterConfig memory _gasMeterConfig,\\n GlobalContext memory _globalContext\\n )\\n Lib_AddressResolver(_libAddressManager)\\n {\\n ovmSafetyChecker = iOVM_SafetyChecker(resolve(\\\"OVM_SafetyChecker\\\"));\\n gasMeterConfig = _gasMeterConfig;\\n globalContext = _globalContext;\\n _resetContext();\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n /**\\n * Applies dynamically-sized refund to a transaction to account for the difference in execution\\n * between L1 and L2, so that the overall cost of the ovmOPCODE is fixed.\\n * @param _cost Desired gas cost for the function after the refund.\\n */\\n modifier netGasCost(\\n uint256 _cost\\n ) {\\n uint256 gasProvided = gasleft();\\n _;\\n uint256 gasUsed = gasProvided - gasleft();\\n\\n // We want to refund everything *except* the specified cost.\\n if (_cost < gasUsed) {\\n transactionRecord.ovmGasRefund += gasUsed - _cost;\\n }\\n }\\n\\n /**\\n * Applies a fixed-size gas refund to a transaction to account for the difference in execution\\n * between L1 and L2, so that the overall cost of an ovmOPCODE can be lowered.\\n * @param _discount Amount of gas cost to refund for the ovmOPCODE.\\n */\\n modifier fixedGasDiscount(\\n uint256 _discount\\n ) {\\n uint256 gasProvided = gasleft();\\n _;\\n uint256 gasUsed = gasProvided - gasleft();\\n\\n // We want to refund the specified _discount, unless this risks underflow.\\n if (_discount < gasUsed) {\\n transactionRecord.ovmGasRefund += _discount;\\n } else {\\n // refund all we can without risking underflow.\\n transactionRecord.ovmGasRefund += gasUsed;\\n }\\n }\\n\\n /**\\n * Makes sure we're not inside a static context.\\n */\\n modifier notStatic() {\\n if (messageContext.isStatic == true) {\\n _revertWithFlag(RevertFlag.STATIC_VIOLATION);\\n }\\n _;\\n }\\n\\n\\n /************************************\\n * Transaction Execution Entrypoint *\\n ************************************/\\n\\n /**\\n * Starts the execution of a transaction via the OVM_ExecutionManager.\\n * @param _transaction Transaction data to be executed.\\n * @param _ovmStateManager iOVM_StateManager implementation providing account state.\\n */\\n function run(\\n Lib_OVMCodec.Transaction memory _transaction,\\n address _ovmStateManager\\n )\\n override\\n public\\n returns (\\n bytes memory\\n )\\n {\\n // Make sure that run() is not re-enterable. This condition should always be satisfied\\n // Once run has been called once, due to the behavior of _isValidInput().\\n if (transactionContext.ovmNUMBER != DEFAULT_UINT256) {\\n return bytes(\\\"\\\");\\n }\\n\\n // Store our OVM_StateManager instance (significantly easier than attempting to pass the\\n // address around in calldata).\\n ovmStateManager = iOVM_StateManager(_ovmStateManager);\\n\\n // Make sure this function can't be called by anyone except the owner of the\\n // OVM_StateManager (expected to be an OVM_StateTransitioner). We can revert here because\\n // this would make the `run` itself invalid.\\n require(\\n // This method may return false during fraud proofs, but always returns true in L2 nodes' State Manager precompile.\\n ovmStateManager.isAuthenticated(msg.sender),\\n \\\"Only authenticated addresses in ovmStateManager can call this function\\\"\\n );\\n\\n // Initialize the execution context, must be initialized before we perform any gas metering\\n // or we'll throw a nuisance gas error.\\n _initContext(_transaction);\\n\\n // TEMPORARY: Gas metering is disabled for minnet.\\n // // Check whether we need to start a new epoch, do so if necessary.\\n // _checkNeedsNewEpoch(_transaction.timestamp);\\n\\n // Make sure the transaction's gas limit is valid. We don't revert here because we reserve\\n // reverts for INVALID_STATE_ACCESS.\\n if (_isValidInput(_transaction) == false) {\\n _resetContext();\\n return bytes(\\\"\\\");\\n }\\n\\n // TEMPORARY: Gas metering is disabled for minnet.\\n // // Check gas right before the call to get total gas consumed by OVM transaction.\\n // uint256 gasProvided = gasleft();\\n\\n // Run the transaction, make sure to meter the gas usage.\\n (, bytes memory returndata) = ovmCALL(\\n _transaction.gasLimit - gasMeterConfig.minTransactionGasLimit,\\n _transaction.entrypoint,\\n _transaction.data\\n );\\n\\n // TEMPORARY: Gas metering is disabled for minnet.\\n // // Update the cumulative gas based on the amount of gas used.\\n // uint256 gasUsed = gasProvided - gasleft();\\n // _updateCumulativeGas(gasUsed, _transaction.l1QueueOrigin);\\n\\n // Wipe the execution context.\\n _resetContext();\\n\\n return returndata;\\n }\\n\\n\\n /******************************\\n * Opcodes: Execution Context *\\n ******************************/\\n\\n /**\\n * @notice Overrides CALLER.\\n * @return _CALLER Address of the CALLER within the current message context.\\n */\\n function ovmCALLER()\\n override\\n public\\n view\\n returns (\\n address _CALLER\\n )\\n {\\n return messageContext.ovmCALLER;\\n }\\n\\n /**\\n * @notice Overrides ADDRESS.\\n * @return _ADDRESS Active ADDRESS within the current message context.\\n */\\n function ovmADDRESS()\\n override\\n public\\n view\\n returns (\\n address _ADDRESS\\n )\\n {\\n return messageContext.ovmADDRESS;\\n }\\n\\n /**\\n * @notice Overrides TIMESTAMP.\\n * @return _TIMESTAMP Value of the TIMESTAMP within the transaction context.\\n */\\n function ovmTIMESTAMP()\\n override\\n public\\n view\\n returns (\\n uint256 _TIMESTAMP\\n )\\n {\\n return transactionContext.ovmTIMESTAMP;\\n }\\n\\n /**\\n * @notice Overrides NUMBER.\\n * @return _NUMBER Value of the NUMBER within the transaction context.\\n */\\n function ovmNUMBER()\\n override\\n public\\n view\\n returns (\\n uint256 _NUMBER\\n )\\n {\\n return transactionContext.ovmNUMBER;\\n }\\n\\n /**\\n * @notice Overrides GASLIMIT.\\n * @return _GASLIMIT Value of the block's GASLIMIT within the transaction context.\\n */\\n function ovmGASLIMIT()\\n override\\n public\\n view\\n returns (\\n uint256 _GASLIMIT\\n )\\n {\\n return transactionContext.ovmGASLIMIT;\\n }\\n\\n /**\\n * @notice Overrides CHAINID.\\n * @return _CHAINID Value of the chain's CHAINID within the global context.\\n */\\n function ovmCHAINID()\\n override\\n public\\n view\\n returns (\\n uint256 _CHAINID\\n )\\n {\\n return globalContext.ovmCHAINID;\\n }\\n\\n /*********************************\\n * Opcodes: L2 Execution Context *\\n *********************************/\\n\\n /**\\n * @notice Specifies from which source (Sequencer or Queue) this transaction originated from.\\n * @return _queueOrigin Enum indicating the ovmL1QUEUEORIGIN within the current message context.\\n */\\n function ovmL1QUEUEORIGIN()\\n override\\n public\\n view\\n returns (\\n Lib_OVMCodec.QueueOrigin _queueOrigin\\n )\\n {\\n return transactionContext.ovmL1QUEUEORIGIN;\\n }\\n\\n /**\\n * @notice Specifies which L1 account, if any, sent this transaction by calling enqueue().\\n * @return _l1TxOrigin Address of the account which sent the tx into L2 from L1.\\n */\\n function ovmL1TXORIGIN()\\n override\\n public\\n view\\n returns (\\n address _l1TxOrigin\\n )\\n {\\n return transactionContext.ovmL1TXORIGIN;\\n }\\n\\n /********************\\n * Opcodes: Halting *\\n ********************/\\n\\n /**\\n * @notice Overrides REVERT.\\n * @param _data Bytes data to pass along with the REVERT.\\n */\\n function ovmREVERT(\\n bytes memory _data\\n )\\n override\\n public\\n {\\n _revertWithFlag(RevertFlag.INTENTIONAL_REVERT, _data);\\n }\\n\\n\\n /******************************\\n * Opcodes: Contract Creation *\\n ******************************/\\n\\n /**\\n * @notice Overrides CREATE.\\n * @param _bytecode Code to be used to CREATE a new contract.\\n * @return Address of the created contract.\\n * @return Revert data, if and only if the creation threw an exception.\\n */\\n function ovmCREATE(\\n bytes memory _bytecode\\n )\\n override\\n public\\n notStatic\\n fixedGasDiscount(40000)\\n returns (\\n address,\\n bytes memory\\n )\\n {\\n // Creator is always the current ADDRESS.\\n address creator = ovmADDRESS();\\n\\n // Check that the deployer is whitelisted, or\\n // that arbitrary contract deployment has been enabled.\\n _checkDeployerAllowed(creator);\\n\\n // Generate the correct CREATE address.\\n address contractAddress = Lib_EthUtils.getAddressForCREATE(\\n creator,\\n _getAccountNonce(creator)\\n );\\n\\n return _createContract(\\n contractAddress,\\n _bytecode\\n );\\n }\\n\\n /**\\n * @notice Overrides CREATE2.\\n * @param _bytecode Code to be used to CREATE2 a new contract.\\n * @param _salt Value used to determine the contract's address.\\n * @return Address of the created contract.\\n * @return Revert data, if and only if the creation threw an exception.\\n */\\n function ovmCREATE2(\\n bytes memory _bytecode,\\n bytes32 _salt\\n )\\n override\\n public\\n notStatic\\n fixedGasDiscount(40000)\\n returns (\\n address,\\n bytes memory\\n )\\n {\\n // Creator is always the current ADDRESS.\\n address creator = ovmADDRESS();\\n\\n // Check that the deployer is whitelisted, or\\n // that arbitrary contract deployment has been enabled.\\n _checkDeployerAllowed(creator);\\n\\n // Generate the correct CREATE2 address.\\n address contractAddress = Lib_EthUtils.getAddressForCREATE2(\\n creator,\\n _bytecode,\\n _salt\\n );\\n\\n return _createContract(\\n contractAddress,\\n _bytecode\\n );\\n }\\n\\n\\n /*******************************\\n * Account Abstraction Opcodes *\\n ******************************/\\n\\n /**\\n * Retrieves the nonce of the current ovmADDRESS.\\n * @return _nonce Nonce of the current contract.\\n */\\n function ovmGETNONCE()\\n override\\n public\\n returns (\\n uint256 _nonce\\n )\\n {\\n return _getAccountNonce(ovmADDRESS());\\n }\\n\\n /**\\n * Bumps the nonce of the current ovmADDRESS by one.\\n */\\n function ovmINCREMENTNONCE()\\n override\\n public\\n notStatic\\n {\\n address account = ovmADDRESS();\\n uint256 nonce = _getAccountNonce(account);\\n\\n // Prevent overflow.\\n if (nonce + 1 > nonce) {\\n _setAccountNonce(account, nonce + 1);\\n }\\n }\\n\\n /**\\n * Creates a new EOA contract account, for account abstraction.\\n * @dev Essentially functions like ovmCREATE or ovmCREATE2, but we can bypass a lot of checks\\n * because the contract we're creating is trusted (no need to do safety checking or to\\n * handle unexpected reverts). Doesn't need to return an address because the address is\\n * assumed to be the user's actual address.\\n * @param _messageHash Hash of a message signed by some user, for verification.\\n * @param _v Signature `v` parameter.\\n * @param _r Signature `r` parameter.\\n * @param _s Signature `s` parameter.\\n */\\n function ovmCREATEEOA(\\n bytes32 _messageHash,\\n uint8 _v,\\n bytes32 _r,\\n bytes32 _s\\n )\\n override\\n public\\n notStatic\\n {\\n // Recover the EOA address from the message hash and signature parameters. Since we do the\\n // hashing in advance, we don't have handle different message hashing schemes. Even if this\\n // function were to return the wrong address (rather than explicitly returning the zero\\n // address), the rest of the transaction would simply fail (since there's no EOA account to\\n // actually execute the transaction).\\n address eoa = ecrecover(\\n _messageHash,\\n _v + 27,\\n _r,\\n _s\\n );\\n\\n // Invalid signature is a case we proactively handle with a revert. We could alternatively\\n // have this function return a `success` boolean, but this is just easier.\\n if (eoa == address(0)) {\\n ovmREVERT(bytes(\\\"Signature provided for EOA contract creation is invalid.\\\"));\\n }\\n\\n // If the user already has an EOA account, then there's no need to perform this operation.\\n if (_hasEmptyAccount(eoa) == false) {\\n return;\\n }\\n\\n // We always need to initialize the contract with the default account values.\\n _initPendingAccount(eoa);\\n\\n // Temporarily set the current address so it's easier to access on L2.\\n address prevADDRESS = messageContext.ovmADDRESS;\\n messageContext.ovmADDRESS = eoa;\\n\\n // Creates a duplicate of the OVM_ProxyEOA located at 0x42....09. Uses the following\\n // \\\"magic\\\" prefix to deploy an exact copy of the code:\\n // PUSH1 0x0D # size of this prefix in bytes\\n // CODESIZE\\n // SUB # subtract prefix size from codesize\\n // DUP1\\n // PUSH1 0x0D\\n // PUSH1 0x00\\n // CODECOPY # copy everything after prefix into memory at pos 0\\n // PUSH1 0x00\\n // RETURN # return the copied code\\n address proxyEOA = Lib_EthUtils.createContract(abi.encodePacked(\\n hex\\\"600D380380600D6000396000f3\\\",\\n ovmEXTCODECOPY(\\n 0x4200000000000000000000000000000000000009,\\n 0,\\n ovmEXTCODESIZE(0x4200000000000000000000000000000000000009)\\n )\\n ));\\n\\n // Reset the address now that we're done deploying.\\n messageContext.ovmADDRESS = prevADDRESS;\\n\\n // Commit the account with its final values.\\n _commitPendingAccount(\\n eoa,\\n address(proxyEOA),\\n keccak256(Lib_EthUtils.getCode(address(proxyEOA)))\\n );\\n\\n _setAccountNonce(eoa, 0);\\n }\\n\\n\\n /*********************************\\n * Opcodes: Contract Interaction *\\n *********************************/\\n\\n /**\\n * @notice Overrides CALL.\\n * @param _gasLimit Amount of gas to be passed into this call.\\n * @param _address Address of the contract to call.\\n * @param _calldata Data to send along with the call.\\n * @return _success Whether or not the call returned (rather than reverted).\\n * @return _returndata Data returned by the call.\\n */\\n function ovmCALL(\\n uint256 _gasLimit,\\n address _address,\\n bytes memory _calldata\\n )\\n override\\n public\\n fixedGasDiscount(100000)\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n // CALL updates the CALLER and ADDRESS.\\n MessageContext memory nextMessageContext = messageContext;\\n nextMessageContext.ovmCALLER = nextMessageContext.ovmADDRESS;\\n nextMessageContext.ovmADDRESS = _address;\\n\\n return _callContract(\\n nextMessageContext,\\n _gasLimit,\\n _address,\\n _calldata\\n );\\n }\\n\\n /**\\n * @notice Overrides STATICCALL.\\n * @param _gasLimit Amount of gas to be passed into this call.\\n * @param _address Address of the contract to call.\\n * @param _calldata Data to send along with the call.\\n * @return _success Whether or not the call returned (rather than reverted).\\n * @return _returndata Data returned by the call.\\n */\\n function ovmSTATICCALL(\\n uint256 _gasLimit,\\n address _address,\\n bytes memory _calldata\\n )\\n override\\n public\\n fixedGasDiscount(80000)\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n // STATICCALL updates the CALLER, updates the ADDRESS, and runs in a static context.\\n MessageContext memory nextMessageContext = messageContext;\\n nextMessageContext.ovmCALLER = nextMessageContext.ovmADDRESS;\\n nextMessageContext.ovmADDRESS = _address;\\n nextMessageContext.isStatic = true;\\n\\n return _callContract(\\n nextMessageContext,\\n _gasLimit,\\n _address,\\n _calldata\\n );\\n }\\n\\n /**\\n * @notice Overrides DELEGATECALL.\\n * @param _gasLimit Amount of gas to be passed into this call.\\n * @param _address Address of the contract to call.\\n * @param _calldata Data to send along with the call.\\n * @return _success Whether or not the call returned (rather than reverted).\\n * @return _returndata Data returned by the call.\\n */\\n function ovmDELEGATECALL(\\n uint256 _gasLimit,\\n address _address,\\n bytes memory _calldata\\n )\\n override\\n public\\n fixedGasDiscount(40000)\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n // DELEGATECALL does not change anything about the message context.\\n MessageContext memory nextMessageContext = messageContext;\\n\\n return _callContract(\\n nextMessageContext,\\n _gasLimit,\\n _address,\\n _calldata\\n );\\n }\\n\\n\\n /************************************\\n * Opcodes: Contract Storage Access *\\n ************************************/\\n\\n /**\\n * @notice Overrides SLOAD.\\n * @param _key 32 byte key of the storage slot to load.\\n * @return _value 32 byte value of the requested storage slot.\\n */\\n function ovmSLOAD(\\n bytes32 _key\\n )\\n override\\n public\\n netGasCost(40000)\\n returns (\\n bytes32 _value\\n )\\n {\\n // We always SLOAD from the storage of ADDRESS.\\n address contractAddress = ovmADDRESS();\\n\\n return _getContractStorage(\\n contractAddress,\\n _key\\n );\\n }\\n\\n /**\\n * @notice Overrides SSTORE.\\n * @param _key 32 byte key of the storage slot to set.\\n * @param _value 32 byte value for the storage slot.\\n */\\n function ovmSSTORE(\\n bytes32 _key,\\n bytes32 _value\\n )\\n override\\n public\\n notStatic\\n netGasCost(60000)\\n {\\n // We always SSTORE to the storage of ADDRESS.\\n address contractAddress = ovmADDRESS();\\n\\n _putContractStorage(\\n contractAddress,\\n _key,\\n _value\\n );\\n }\\n\\n\\n /*********************************\\n * Opcodes: Contract Code Access *\\n *********************************/\\n\\n /**\\n * @notice Overrides EXTCODECOPY.\\n * @param _contract Address of the contract to copy code from.\\n * @param _offset Offset in bytes from the start of contract code to copy beyond.\\n * @param _length Total number of bytes to copy from the contract's code.\\n * @return _code Bytes of code copied from the requested contract.\\n */\\n function ovmEXTCODECOPY(\\n address _contract,\\n uint256 _offset,\\n uint256 _length\\n )\\n override\\n public\\n returns (\\n bytes memory _code\\n )\\n {\\n // `ovmEXTCODECOPY` is the only overridden opcode capable of producing exactly one byte of\\n // return data. By blocking reads of one byte, we're able to use the condition that an\\n // OVM_ExecutionManager function return value having a length of exactly one byte indicates\\n // an error without an explicit revert. If users were able to read a single byte, they\\n // could forcibly trigger behavior that should only be available to this contract.\\n uint256 length = _length == 1 ? 2 : _length;\\n\\n return Lib_EthUtils.getCode(\\n _getAccountEthAddress(_contract),\\n _offset,\\n length\\n );\\n }\\n\\n /**\\n * @notice Overrides EXTCODESIZE.\\n * @param _contract Address of the contract to query the size of.\\n * @return _EXTCODESIZE Size of the requested contract in bytes.\\n */\\n function ovmEXTCODESIZE(\\n address _contract\\n )\\n override\\n public\\n returns (\\n uint256 _EXTCODESIZE\\n )\\n {\\n return Lib_EthUtils.getCodeSize(\\n _getAccountEthAddress(_contract)\\n );\\n }\\n\\n /**\\n * @notice Overrides EXTCODEHASH.\\n * @param _contract Address of the contract to query the hash of.\\n * @return _EXTCODEHASH Hash of the requested contract.\\n */\\n function ovmEXTCODEHASH(\\n address _contract\\n )\\n override\\n public\\n returns (\\n bytes32 _EXTCODEHASH\\n )\\n {\\n return Lib_EthUtils.getCodeHash(\\n _getAccountEthAddress(_contract)\\n );\\n }\\n\\n /***************************************\\n * Public Functions: Execution Context *\\n ***************************************/\\n\\n function getMaxTransactionGasLimit()\\n external\\n view\\n override\\n returns (\\n uint256 _maxTransactionGasLimit\\n )\\n {\\n return gasMeterConfig.maxTransactionGasLimit;\\n }\\n\\n /********************************************\\n * Public Functions: Deployment Whitelisting *\\n ********************************************/\\n\\n /**\\n * Checks whether the given address is on the whitelist to ovmCREATE/ovmCREATE2, and reverts if not.\\n * @param _deployerAddress Address attempting to deploy a contract.\\n */\\n function _checkDeployerAllowed(\\n address _deployerAddress\\n )\\n internal\\n {\\n // From an OVM semantics perspective, this will appear identical to\\n // the deployer ovmCALLing the whitelist. This is fine--in a sense, we are forcing them to.\\n (bool success, bytes memory data) = ovmCALL(\\n gasleft(),\\n 0x4200000000000000000000000000000000000002,\\n abi.encodeWithSignature(\\\"isDeployerAllowed(address)\\\", _deployerAddress)\\n );\\n bool isAllowed = abi.decode(data, (bool));\\n\\n if (!isAllowed || !success) {\\n _revertWithFlag(RevertFlag.CREATOR_NOT_ALLOWED);\\n }\\n }\\n\\n /********************************************\\n * Internal Functions: Contract Interaction *\\n ********************************************/\\n\\n /**\\n * Creates a new contract and associates it with some contract address.\\n * @param _contractAddress Address to associate the created contract with.\\n * @param _bytecode Bytecode to be used to create the contract.\\n * @return Final OVM contract address.\\n * @return Revertdata, if and only if the creation threw an exception.\\n */\\n function _createContract(\\n address _contractAddress,\\n bytes memory _bytecode\\n )\\n internal\\n returns (\\n address,\\n bytes memory\\n )\\n {\\n // We always update the nonce of the creating account, even if the creation fails.\\n _setAccountNonce(ovmADDRESS(), _getAccountNonce(ovmADDRESS()) + 1);\\n\\n // We're stepping into a CREATE or CREATE2, so we need to update ADDRESS to point\\n // to the contract's associated address and CALLER to point to the previous ADDRESS.\\n MessageContext memory nextMessageContext = messageContext;\\n nextMessageContext.ovmCALLER = messageContext.ovmADDRESS;\\n nextMessageContext.ovmADDRESS = _contractAddress;\\n\\n // Run the common logic which occurs between call-type and create-type messages,\\n // passing in the creation bytecode and `true` to trigger create-specific logic.\\n (bool success, bytes memory data) = _handleExternalMessage(\\n nextMessageContext,\\n gasleft(),\\n _contractAddress,\\n _bytecode,\\n true\\n );\\n\\n // Yellow paper requires that address returned is zero if the contract deployment fails.\\n return (\\n success ? _contractAddress : address(0),\\n data\\n );\\n }\\n\\n /**\\n * Calls the deployed contract associated with a given address.\\n * @param _nextMessageContext Message context to be used for the call.\\n * @param _gasLimit Amount of gas to be passed into this call.\\n * @param _contract OVM address to be called.\\n * @param _calldata Data to send along with the call.\\n * @return _success Whether or not the call returned (rather than reverted).\\n * @return _returndata Data returned by the call.\\n */\\n function _callContract(\\n MessageContext memory _nextMessageContext,\\n uint256 _gasLimit,\\n address _contract,\\n bytes memory _calldata\\n )\\n internal\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n // We reserve addresses of the form 0xdeaddeaddead...NNNN for the container contracts in L2 geth.\\n // So, we block calls to these addresses since they are not safe to run as an OVM contract itself.\\n if (\\n (uint256(_contract) & uint256(0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000))\\n == uint256(0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000)\\n ) {\\n // EVM does not return data in the success case, see: https://github.com/ethereum/go-ethereum/blob/aae7660410f0ef90279e14afaaf2f429fdc2a186/core/vm/instructions.go#L600-L604\\n return (true, hex'');\\n }\\n\\n // Both 0x0000... and the EVM precompiles have the same address on L1 and L2 --> no trie lookup needed.\\n address codeContractAddress =\\n uint(_contract) < 100\\n ? _contract\\n : _getAccountEthAddress(_contract);\\n\\n return _handleExternalMessage(\\n _nextMessageContext,\\n _gasLimit,\\n codeContractAddress,\\n _calldata,\\n false\\n );\\n }\\n\\n /**\\n * Handles all interactions which involve the execution manager calling out to untrusted code (both calls and creates).\\n * Ensures that OVM-related measures are enforced, including L2 gas refunds, nuisance gas, and flagged reversions.\\n *\\n * @param _nextMessageContext Message context to be used for the external message.\\n * @param _gasLimit Amount of gas to be passed into this message.\\n * @param _contract OVM address being called or deployed to\\n * @param _data Data for the message (either calldata or creation code)\\n * @param _isCreate Whether this is a create-type message.\\n * @return Whether or not the message (either a call or deployment) succeeded.\\n * @return Data returned by the message.\\n */\\n function _handleExternalMessage(\\n MessageContext memory _nextMessageContext,\\n uint256 _gasLimit,\\n address _contract,\\n bytes memory _data,\\n bool _isCreate\\n )\\n internal\\n returns (\\n bool,\\n bytes memory\\n )\\n {\\n // We need to switch over to our next message context for the duration of this call.\\n MessageContext memory prevMessageContext = messageContext;\\n _switchMessageContext(prevMessageContext, _nextMessageContext);\\n\\n // Nuisance gas is a system used to bound the ability for an attacker to make fraud proofs\\n // expensive by touching a lot of different accounts or storage slots. Since most contracts\\n // only use a few storage slots during any given transaction, this shouldn't be a limiting\\n // factor.\\n uint256 prevNuisanceGasLeft = messageRecord.nuisanceGasLeft;\\n uint256 nuisanceGasLimit = _getNuisanceGasLimit(_gasLimit);\\n messageRecord.nuisanceGasLeft = nuisanceGasLimit;\\n\\n // Make the call and make sure to pass in the gas limit. Another instance of hidden\\n // complexity. `_contract` is guaranteed to be a safe contract, meaning its return/revert\\n // behavior can be controlled. In particular, we enforce that flags are passed through\\n // revert data as to retrieve execution metadata that would normally be reverted out of\\n // existence.\\n\\n bool success;\\n bytes memory returndata;\\n if (_isCreate) {\\n // safeCREATE() is a function which replicates a CREATE message, but uses return values\\n // Which match that of CALL (i.e. bool, bytes). This allows many security checks to be\\n // to be shared between untrusted call and create call frames.\\n (success, returndata) = address(this).call(\\n abi.encodeWithSelector(\\n this.safeCREATE.selector,\\n _gasLimit,\\n _data,\\n _contract\\n )\\n );\\n } else {\\n (success, returndata) = _contract.call{gas: _gasLimit}(_data);\\n }\\n\\n // Switch back to the original message context now that we're out of the call.\\n _switchMessageContext(_nextMessageContext, prevMessageContext);\\n\\n // Assuming there were no reverts, the message record should be accurate here. We'll update\\n // this value in the case of a revert.\\n uint256 nuisanceGasLeft = messageRecord.nuisanceGasLeft;\\n\\n // Reverts at this point are completely OK, but we need to make a few updates based on the\\n // information passed through the revert.\\n if (success == false) {\\n (\\n RevertFlag flag,\\n uint256 nuisanceGasLeftPostRevert,\\n uint256 ovmGasRefund,\\n bytes memory returndataFromFlag\\n ) = _decodeRevertData(returndata);\\n\\n // INVALID_STATE_ACCESS is the only flag that triggers an immediate abort of the\\n // parent EVM message. This behavior is necessary because INVALID_STATE_ACCESS must\\n // halt any further transaction execution that could impact the execution result.\\n if (flag == RevertFlag.INVALID_STATE_ACCESS) {\\n _revertWithFlag(flag);\\n }\\n\\n // INTENTIONAL_REVERT, UNSAFE_BYTECODE, STATIC_VIOLATION, and CREATOR_NOT_ALLOWED aren't\\n // dependent on the input state, so we can just handle them like standard reverts. Our only change here\\n // is to record the gas refund reported by the call (enforced by safety checking).\\n if (\\n flag == RevertFlag.INTENTIONAL_REVERT\\n || flag == RevertFlag.UNSAFE_BYTECODE\\n || flag == RevertFlag.STATIC_VIOLATION\\n || flag == RevertFlag.CREATOR_NOT_ALLOWED\\n ) {\\n transactionRecord.ovmGasRefund = ovmGasRefund;\\n }\\n\\n // INTENTIONAL_REVERT needs to pass up the user-provided return data encoded into the\\n // flag, *not* the full encoded flag. All other revert types return no data.\\n if (\\n flag == RevertFlag.INTENTIONAL_REVERT\\n || _isCreate\\n ) {\\n returndata = returndataFromFlag;\\n } else {\\n returndata = hex'';\\n }\\n\\n // Reverts mean we need to use up whatever \\\"nuisance gas\\\" was used by the call.\\n // EXCEEDS_NUISANCE_GAS explicitly reduces the remaining nuisance gas for this message\\n // to zero. OUT_OF_GAS is a \\\"pseudo\\\" flag given that messages return no data when they\\n // run out of gas, so we have to treat this like EXCEEDS_NUISANCE_GAS. All other flags\\n // will simply pass up the remaining nuisance gas.\\n nuisanceGasLeft = nuisanceGasLeftPostRevert;\\n }\\n\\n // We need to reset the nuisance gas back to its original value minus the amount used here.\\n messageRecord.nuisanceGasLeft = prevNuisanceGasLeft - (nuisanceGasLimit - nuisanceGasLeft);\\n\\n return (\\n success,\\n returndata\\n );\\n }\\n\\n /**\\n * Handles the creation-specific safety measures required for OVM contract deployment.\\n * This function sanitizes the return types for creation messages to match calls (bool, bytes),\\n * by being an external function which the EM can call, that mimics the success/fail case of the CREATE.\\n * This allows for consistent handling of both types of messages in _handleExternalMessage().\\n * Having this step occur as a separate call frame also allows us to easily revert the\\n * contract deployment in the event that the code is unsafe.\\n *\\n * @param _gasLimit Amount of gas to be passed into this creation.\\n * @param _creationCode Code to pass into CREATE for deployment.\\n * @param _address OVM address being deployed to.\\n */\\n function safeCREATE(\\n uint _gasLimit,\\n bytes memory _creationCode,\\n address _address\\n )\\n external\\n {\\n // The only way this should callable is from within _createContract(),\\n // and it should DEFINITELY not be callable by a non-EM code contract.\\n if (msg.sender != address(this)) {\\n return;\\n }\\n // Check that there is not already code at this address.\\n if (_hasEmptyAccount(_address) == false) {\\n // Note: in the EVM, this case burns all allotted gas. For improved\\n // developer experience, we do return the remaining gas.\\n _revertWithFlag(\\n RevertFlag.CREATE_COLLISION,\\n Lib_ErrorUtils.encodeRevertString(\\\"A contract has already been deployed to this address\\\")\\n );\\n }\\n\\n // Check the creation bytecode against the OVM_SafetyChecker.\\n if (ovmSafetyChecker.isBytecodeSafe(_creationCode) == false) {\\n _revertWithFlag(\\n RevertFlag.UNSAFE_BYTECODE,\\n Lib_ErrorUtils.encodeRevertString(\\\"Contract creation code contains unsafe opcodes. Did you use the right compiler or pass an unsafe constructor argument?\\\")\\n );\\n }\\n\\n // We always need to initialize the contract with the default account values.\\n _initPendingAccount(_address);\\n\\n // Actually execute the EVM create message.\\n // NOTE: The inline assembly below means we can NOT make any evm calls between here and then.\\n address ethAddress = Lib_EthUtils.createContract(_creationCode);\\n\\n if (ethAddress == address(0)) {\\n // If the creation fails, the EVM lets us grab its revert data. This may contain a revert flag\\n // to be used above in _handleExternalMessage, so we pass the revert data back up unmodified.\\n assembly {\\n returndatacopy(0,0,returndatasize())\\n revert(0, returndatasize())\\n }\\n }\\n\\n // Again simply checking that the deployed code is safe too. Contracts can generate\\n // arbitrary deployment code, so there's no easy way to analyze this beforehand.\\n bytes memory deployedCode = Lib_EthUtils.getCode(ethAddress);\\n if (ovmSafetyChecker.isBytecodeSafe(deployedCode) == false) {\\n _revertWithFlag(\\n RevertFlag.UNSAFE_BYTECODE,\\n Lib_ErrorUtils.encodeRevertString(\\\"Constructor attempted to deploy unsafe bytecode.\\\")\\n );\\n }\\n\\n // Contract creation didn't need to be reverted and the bytecode is safe. We finish up by\\n // associating the desired address with the newly created contract's code hash and address.\\n _commitPendingAccount(\\n _address,\\n ethAddress,\\n Lib_EthUtils.getCodeHash(ethAddress)\\n );\\n }\\n\\n /******************************************\\n * Internal Functions: State Manipulation *\\n ******************************************/\\n\\n /**\\n * Checks whether an account exists within the OVM_StateManager.\\n * @param _address Address of the account to check.\\n * @return _exists Whether or not the account exists.\\n */\\n function _hasAccount(\\n address _address\\n )\\n internal\\n returns (\\n bool _exists\\n )\\n {\\n _checkAccountLoad(_address);\\n return ovmStateManager.hasAccount(_address);\\n }\\n\\n /**\\n * Checks whether a known empty account exists within the OVM_StateManager.\\n * @param _address Address of the account to check.\\n * @return _exists Whether or not the account empty exists.\\n */\\n function _hasEmptyAccount(\\n address _address\\n )\\n internal\\n returns (\\n bool _exists\\n )\\n {\\n _checkAccountLoad(_address);\\n return ovmStateManager.hasEmptyAccount(_address);\\n }\\n\\n /**\\n * Sets the nonce of an account.\\n * @param _address Address of the account to modify.\\n * @param _nonce New account nonce.\\n */\\n function _setAccountNonce(\\n address _address,\\n uint256 _nonce\\n )\\n internal\\n {\\n _checkAccountChange(_address);\\n ovmStateManager.setAccountNonce(_address, _nonce);\\n }\\n\\n /**\\n * Gets the nonce of an account.\\n * @param _address Address of the account to access.\\n * @return _nonce Nonce of the account.\\n */\\n function _getAccountNonce(\\n address _address\\n )\\n internal\\n returns (\\n uint256 _nonce\\n )\\n {\\n _checkAccountLoad(_address);\\n return ovmStateManager.getAccountNonce(_address);\\n }\\n\\n /**\\n * Retrieves the Ethereum address of an account.\\n * @param _address Address of the account to access.\\n * @return _ethAddress Corresponding Ethereum address.\\n */\\n function _getAccountEthAddress(\\n address _address\\n )\\n internal\\n returns (\\n address _ethAddress\\n )\\n {\\n _checkAccountLoad(_address);\\n return ovmStateManager.getAccountEthAddress(_address);\\n }\\n\\n /**\\n * Creates the default account object for the given address.\\n * @param _address Address of the account create.\\n */\\n function _initPendingAccount(\\n address _address\\n )\\n internal\\n {\\n // Although it seems like `_checkAccountChange` would be more appropriate here, we don't\\n // actually consider an account \\\"changed\\\" until it's inserted into the state (in this case\\n // by `_commitPendingAccount`).\\n _checkAccountLoad(_address);\\n ovmStateManager.initPendingAccount(_address);\\n }\\n\\n /**\\n * Stores additional relevant data for a new account, thereby \\\"committing\\\" it to the state.\\n * This function is only called during `ovmCREATE` and `ovmCREATE2` after a successful contract\\n * creation.\\n * @param _address Address of the account to commit.\\n * @param _ethAddress Address of the associated deployed contract.\\n * @param _codeHash Hash of the code stored at the address.\\n */\\n function _commitPendingAccount(\\n address _address,\\n address _ethAddress,\\n bytes32 _codeHash\\n )\\n internal\\n {\\n _checkAccountChange(_address);\\n ovmStateManager.commitPendingAccount(\\n _address,\\n _ethAddress,\\n _codeHash\\n );\\n }\\n\\n /**\\n * Retrieves the value of a storage slot.\\n * @param _contract Address of the contract to query.\\n * @param _key 32 byte key of the storage slot.\\n * @return _value 32 byte storage slot value.\\n */\\n function _getContractStorage(\\n address _contract,\\n bytes32 _key\\n )\\n internal\\n returns (\\n bytes32 _value\\n )\\n {\\n _checkContractStorageLoad(_contract, _key);\\n return ovmStateManager.getContractStorage(_contract, _key);\\n }\\n\\n /**\\n * Sets the value of a storage slot.\\n * @param _contract Address of the contract to modify.\\n * @param _key 32 byte key of the storage slot.\\n * @param _value 32 byte storage slot value.\\n */\\n function _putContractStorage(\\n address _contract,\\n bytes32 _key,\\n bytes32 _value\\n )\\n internal\\n {\\n // We don't set storage if the value didn't change. Although this acts as a convenient\\n // optimization, it's also necessary to avoid the case in which a contract with no storage\\n // attempts to store the value \\\"0\\\" at any key. Putting this value (and therefore requiring\\n // that the value be committed into the storage trie after execution) would incorrectly\\n // modify the storage root.\\n if (_getContractStorage(_contract, _key) == _value) {\\n return;\\n }\\n\\n _checkContractStorageChange(_contract, _key);\\n ovmStateManager.putContractStorage(_contract, _key, _value);\\n }\\n\\n /**\\n * Validation whenever a contract needs to be loaded. Checks that the account exists, charges\\n * nuisance gas if the account hasn't been loaded before.\\n * @param _address Address of the account to load.\\n */\\n function _checkAccountLoad(\\n address _address\\n )\\n internal\\n {\\n // See `_checkContractStorageLoad` for more information.\\n if (gasleft() < MIN_GAS_FOR_INVALID_STATE_ACCESS) {\\n _revertWithFlag(RevertFlag.OUT_OF_GAS);\\n }\\n\\n // See `_checkContractStorageLoad` for more information.\\n if (ovmStateManager.hasAccount(_address) == false) {\\n _revertWithFlag(RevertFlag.INVALID_STATE_ACCESS);\\n }\\n\\n // Check whether the account has been loaded before and mark it as loaded if not. We need\\n // this because \\\"nuisance gas\\\" only applies to the first time that an account is loaded.\\n (\\n bool _wasAccountAlreadyLoaded\\n ) = ovmStateManager.testAndSetAccountLoaded(_address);\\n\\n // If we hadn't already loaded the account, then we'll need to charge \\\"nuisance gas\\\" based\\n // on the size of the contract code.\\n if (_wasAccountAlreadyLoaded == false) {\\n _useNuisanceGas(\\n (Lib_EthUtils.getCodeSize(_getAccountEthAddress(_address)) * NUISANCE_GAS_PER_CONTRACT_BYTE) + MIN_NUISANCE_GAS_PER_CONTRACT\\n );\\n }\\n }\\n\\n /**\\n * Validation whenever a contract needs to be changed. Checks that the account exists, charges\\n * nuisance gas if the account hasn't been changed before.\\n * @param _address Address of the account to change.\\n */\\n function _checkAccountChange(\\n address _address\\n )\\n internal\\n {\\n // Start by checking for a load as we only want to charge nuisance gas proportional to\\n // contract size once.\\n _checkAccountLoad(_address);\\n\\n // Check whether the account has been changed before and mark it as changed if not. We need\\n // this because \\\"nuisance gas\\\" only applies to the first time that an account is changed.\\n (\\n bool _wasAccountAlreadyChanged\\n ) = ovmStateManager.testAndSetAccountChanged(_address);\\n\\n // If we hadn't already loaded the account, then we'll need to charge \\\"nuisance gas\\\" based\\n // on the size of the contract code.\\n if (_wasAccountAlreadyChanged == false) {\\n ovmStateManager.incrementTotalUncommittedAccounts();\\n _useNuisanceGas(\\n (Lib_EthUtils.getCodeSize(_getAccountEthAddress(_address)) * NUISANCE_GAS_PER_CONTRACT_BYTE) + MIN_NUISANCE_GAS_PER_CONTRACT\\n );\\n }\\n }\\n\\n /**\\n * Validation whenever a slot needs to be loaded. Checks that the account exists, charges\\n * nuisance gas if the slot hasn't been loaded before.\\n * @param _contract Address of the account to load from.\\n * @param _key 32 byte key to load.\\n */\\n function _checkContractStorageLoad(\\n address _contract,\\n bytes32 _key\\n )\\n internal\\n {\\n // Another case of hidden complexity. If we didn't enforce this requirement, then a\\n // contract could pass in just enough gas to cause the INVALID_STATE_ACCESS check to fail\\n // on L1 but not on L2. A contract could use this behavior to prevent the\\n // OVM_ExecutionManager from detecting an invalid state access. Reverting with OUT_OF_GAS\\n // allows us to also charge for the full message nuisance gas, because you deserve that for\\n // trying to break the contract in this way.\\n if (gasleft() < MIN_GAS_FOR_INVALID_STATE_ACCESS) {\\n _revertWithFlag(RevertFlag.OUT_OF_GAS);\\n }\\n\\n // We need to make sure that the transaction isn't trying to access storage that hasn't\\n // been provided to the OVM_StateManager. We'll immediately abort if this is the case.\\n // We know that we have enough gas to do this check because of the above test.\\n if (ovmStateManager.hasContractStorage(_contract, _key) == false) {\\n _revertWithFlag(RevertFlag.INVALID_STATE_ACCESS);\\n }\\n\\n // Check whether the slot has been loaded before and mark it as loaded if not. We need\\n // this because \\\"nuisance gas\\\" only applies to the first time that a slot is loaded.\\n (\\n bool _wasContractStorageAlreadyLoaded\\n ) = ovmStateManager.testAndSetContractStorageLoaded(_contract, _key);\\n\\n // If we hadn't already loaded the account, then we'll need to charge some fixed amount of\\n // \\\"nuisance gas\\\".\\n if (_wasContractStorageAlreadyLoaded == false) {\\n _useNuisanceGas(NUISANCE_GAS_SLOAD);\\n }\\n }\\n\\n /**\\n * Validation whenever a slot needs to be changed. Checks that the account exists, charges\\n * nuisance gas if the slot hasn't been changed before.\\n * @param _contract Address of the account to change.\\n * @param _key 32 byte key to change.\\n */\\n function _checkContractStorageChange(\\n address _contract,\\n bytes32 _key\\n )\\n internal\\n {\\n // Start by checking for load to make sure we have the storage slot and that we charge the\\n // \\\"nuisance gas\\\" necessary to prove the storage slot state.\\n _checkContractStorageLoad(_contract, _key);\\n\\n // Check whether the slot has been changed before and mark it as changed if not. We need\\n // this because \\\"nuisance gas\\\" only applies to the first time that a slot is changed.\\n (\\n bool _wasContractStorageAlreadyChanged\\n ) = ovmStateManager.testAndSetContractStorageChanged(_contract, _key);\\n\\n // If we hadn't already changed the account, then we'll need to charge some fixed amount of\\n // \\\"nuisance gas\\\".\\n if (_wasContractStorageAlreadyChanged == false) {\\n // Changing a storage slot means that we're also going to have to change the\\n // corresponding account, so do an account change check.\\n _checkAccountChange(_contract);\\n\\n ovmStateManager.incrementTotalUncommittedContractStorage();\\n _useNuisanceGas(NUISANCE_GAS_SSTORE);\\n }\\n }\\n\\n\\n /************************************\\n * Internal Functions: Revert Logic *\\n ************************************/\\n\\n /**\\n * Simple encoding for revert data.\\n * @param _flag Flag to revert with.\\n * @param _data Additional user-provided revert data.\\n * @return _revertdata Encoded revert data.\\n */\\n function _encodeRevertData(\\n RevertFlag _flag,\\n bytes memory _data\\n )\\n internal\\n view\\n returns (\\n bytes memory _revertdata\\n )\\n {\\n // Out of gas and create exceptions will fundamentally return no data, so simulating it shouldn't either.\\n if (\\n _flag == RevertFlag.OUT_OF_GAS\\n ) {\\n return bytes('');\\n }\\n\\n // INVALID_STATE_ACCESS doesn't need to return any data other than the flag.\\n if (_flag == RevertFlag.INVALID_STATE_ACCESS) {\\n return abi.encode(\\n _flag,\\n 0,\\n 0,\\n bytes('')\\n );\\n }\\n\\n // Just ABI encode the rest of the parameters.\\n return abi.encode(\\n _flag,\\n messageRecord.nuisanceGasLeft,\\n transactionRecord.ovmGasRefund,\\n _data\\n );\\n }\\n\\n /**\\n * Simple decoding for revert data.\\n * @param _revertdata Revert data to decode.\\n * @return _flag Flag used to revert.\\n * @return _nuisanceGasLeft Amount of nuisance gas unused by the message.\\n * @return _ovmGasRefund Amount of gas refunded during the message.\\n * @return _data Additional user-provided revert data.\\n */\\n function _decodeRevertData(\\n bytes memory _revertdata\\n )\\n internal\\n pure\\n returns (\\n RevertFlag _flag,\\n uint256 _nuisanceGasLeft,\\n uint256 _ovmGasRefund,\\n bytes memory _data\\n )\\n {\\n // A length of zero means the call ran out of gas, just return empty data.\\n if (_revertdata.length == 0) {\\n return (\\n RevertFlag.OUT_OF_GAS,\\n 0,\\n 0,\\n bytes('')\\n );\\n }\\n\\n // ABI decode the incoming data.\\n return abi.decode(_revertdata, (RevertFlag, uint256, uint256, bytes));\\n }\\n\\n /**\\n * Causes a message to revert or abort.\\n * @param _flag Flag to revert with.\\n * @param _data Additional user-provided data.\\n */\\n function _revertWithFlag(\\n RevertFlag _flag,\\n bytes memory _data\\n )\\n internal\\n view\\n {\\n bytes memory revertdata = _encodeRevertData(\\n _flag,\\n _data\\n );\\n\\n assembly {\\n revert(add(revertdata, 0x20), mload(revertdata))\\n }\\n }\\n\\n /**\\n * Causes a message to revert or abort.\\n * @param _flag Flag to revert with.\\n */\\n function _revertWithFlag(\\n RevertFlag _flag\\n )\\n internal\\n {\\n _revertWithFlag(_flag, bytes(''));\\n }\\n\\n\\n /******************************************\\n * Internal Functions: Nuisance Gas Logic *\\n ******************************************/\\n\\n /**\\n * Computes the nuisance gas limit from the gas limit.\\n * @dev This function is currently using a naive implementation whereby the nuisance gas limit\\n * is set to exactly equal the lesser of the gas limit or remaining gas. It's likely that\\n * this implementation is perfectly fine, but we may change this formula later.\\n * @param _gasLimit Gas limit to compute from.\\n * @return _nuisanceGasLimit Computed nuisance gas limit.\\n */\\n function _getNuisanceGasLimit(\\n uint256 _gasLimit\\n )\\n internal\\n view\\n returns (\\n uint256 _nuisanceGasLimit\\n )\\n {\\n return _gasLimit < gasleft() ? _gasLimit : gasleft();\\n }\\n\\n /**\\n * Uses a certain amount of nuisance gas.\\n * @param _amount Amount of nuisance gas to use.\\n */\\n function _useNuisanceGas(\\n uint256 _amount\\n )\\n internal\\n {\\n // Essentially the same as a standard OUT_OF_GAS, except we also retain a record of the gas\\n // refund to be given at the end of the transaction.\\n if (messageRecord.nuisanceGasLeft < _amount) {\\n _revertWithFlag(RevertFlag.EXCEEDS_NUISANCE_GAS);\\n }\\n\\n messageRecord.nuisanceGasLeft -= _amount;\\n }\\n\\n\\n /************************************\\n * Internal Functions: Gas Metering *\\n ************************************/\\n\\n /**\\n * Checks whether a transaction needs to start a new epoch and does so if necessary.\\n * @param _timestamp Transaction timestamp.\\n */\\n function _checkNeedsNewEpoch(\\n uint256 _timestamp\\n )\\n internal\\n {\\n if (\\n _timestamp >= (\\n _getGasMetadata(GasMetadataKey.CURRENT_EPOCH_START_TIMESTAMP)\\n + gasMeterConfig.secondsPerEpoch\\n )\\n ) {\\n _putGasMetadata(\\n GasMetadataKey.CURRENT_EPOCH_START_TIMESTAMP,\\n _timestamp\\n );\\n\\n _putGasMetadata(\\n GasMetadataKey.PREV_EPOCH_SEQUENCER_QUEUE_GAS,\\n _getGasMetadata(\\n GasMetadataKey.CUMULATIVE_SEQUENCER_QUEUE_GAS\\n )\\n );\\n\\n _putGasMetadata(\\n GasMetadataKey.PREV_EPOCH_L1TOL2_QUEUE_GAS,\\n _getGasMetadata(\\n GasMetadataKey.CUMULATIVE_L1TOL2_QUEUE_GAS\\n )\\n );\\n }\\n }\\n\\n /**\\n * Validates the input values of a transaction.\\n * @return _valid Whether or not the transaction data is valid.\\n */\\n function _isValidInput(\\n Lib_OVMCodec.Transaction memory _transaction\\n )\\n view\\n internal\\n returns (\\n bool\\n )\\n {\\n // Prevent reentrancy to run():\\n // This check prevents calling run with the default ovmNumber.\\n // Combined with the first check in run():\\n // if (transactionContext.ovmNUMBER != DEFAULT_UINT256) { return; }\\n // It should be impossible to re-enter since run() returns before any other call frames are created.\\n // Since this value is already being written to storage, we save much gas compared to\\n // using the standard nonReentrant pattern.\\n if (_transaction.blockNumber == DEFAULT_UINT256) {\\n return false;\\n }\\n\\n if (_isValidGasLimit(_transaction.gasLimit, _transaction.l1QueueOrigin) == false) {\\n return false;\\n }\\n\\n return true;\\n }\\n\\n /**\\n * Validates the gas limit for a given transaction.\\n * @param _gasLimit Gas limit provided by the transaction.\\n * param _queueOrigin Queue from which the transaction originated.\\n * @return _valid Whether or not the gas limit is valid.\\n */\\n function _isValidGasLimit(\\n uint256 _gasLimit,\\n Lib_OVMCodec.QueueOrigin // _queueOrigin\\n )\\n view\\n internal\\n returns (\\n bool _valid\\n )\\n {\\n // Always have to be below the maximum gas limit.\\n if (_gasLimit > gasMeterConfig.maxTransactionGasLimit) {\\n return false;\\n }\\n\\n // Always have to be above the minimum gas limit.\\n if (_gasLimit < gasMeterConfig.minTransactionGasLimit) {\\n return false;\\n }\\n\\n // TEMPORARY: Gas metering is disabled for minnet.\\n return true;\\n // GasMetadataKey cumulativeGasKey;\\n // GasMetadataKey prevEpochGasKey;\\n // if (_queueOrigin == Lib_OVMCodec.QueueOrigin.SEQUENCER_QUEUE) {\\n // cumulativeGasKey = GasMetadataKey.CUMULATIVE_SEQUENCER_QUEUE_GAS;\\n // prevEpochGasKey = GasMetadataKey.PREV_EPOCH_SEQUENCER_QUEUE_GAS;\\n // } else {\\n // cumulativeGasKey = GasMetadataKey.CUMULATIVE_L1TOL2_QUEUE_GAS;\\n // prevEpochGasKey = GasMetadataKey.PREV_EPOCH_L1TOL2_QUEUE_GAS;\\n // }\\n\\n // return (\\n // (\\n // _getGasMetadata(cumulativeGasKey)\\n // - _getGasMetadata(prevEpochGasKey)\\n // + _gasLimit\\n // ) < gasMeterConfig.maxGasPerQueuePerEpoch\\n // );\\n }\\n\\n /**\\n * Updates the cumulative gas after a transaction.\\n * @param _gasUsed Gas used by the transaction.\\n * @param _queueOrigin Queue from which the transaction originated.\\n */\\n function _updateCumulativeGas(\\n uint256 _gasUsed,\\n Lib_OVMCodec.QueueOrigin _queueOrigin\\n )\\n internal\\n {\\n GasMetadataKey cumulativeGasKey;\\n if (_queueOrigin == Lib_OVMCodec.QueueOrigin.SEQUENCER_QUEUE) {\\n cumulativeGasKey = GasMetadataKey.CUMULATIVE_SEQUENCER_QUEUE_GAS;\\n } else {\\n cumulativeGasKey = GasMetadataKey.CUMULATIVE_L1TOL2_QUEUE_GAS;\\n }\\n\\n _putGasMetadata(\\n cumulativeGasKey,\\n (\\n _getGasMetadata(cumulativeGasKey)\\n + gasMeterConfig.minTransactionGasLimit\\n + _gasUsed\\n - transactionRecord.ovmGasRefund\\n )\\n );\\n }\\n\\n /**\\n * Retrieves the value of a gas metadata key.\\n * @param _key Gas metadata key to retrieve.\\n * @return _value Value stored at the given key.\\n */\\n function _getGasMetadata(\\n GasMetadataKey _key\\n )\\n internal\\n returns (\\n uint256 _value\\n )\\n {\\n return uint256(_getContractStorage(\\n GAS_METADATA_ADDRESS,\\n bytes32(uint256(_key))\\n ));\\n }\\n\\n /**\\n * Sets the value of a gas metadata key.\\n * @param _key Gas metadata key to set.\\n * @param _value Value to store at the given key.\\n */\\n function _putGasMetadata(\\n GasMetadataKey _key,\\n uint256 _value\\n )\\n internal\\n {\\n _putContractStorage(\\n GAS_METADATA_ADDRESS,\\n bytes32(uint256(_key)),\\n bytes32(uint256(_value))\\n );\\n }\\n\\n\\n /*****************************************\\n * Internal Functions: Execution Context *\\n *****************************************/\\n\\n /**\\n * Swaps over to a new message context.\\n * @param _prevMessageContext Context we're switching from.\\n * @param _nextMessageContext Context we're switching to.\\n */\\n function _switchMessageContext(\\n MessageContext memory _prevMessageContext,\\n MessageContext memory _nextMessageContext\\n )\\n internal\\n {\\n // Avoid unnecessary the SSTORE.\\n if (_prevMessageContext.ovmCALLER != _nextMessageContext.ovmCALLER) {\\n messageContext.ovmCALLER = _nextMessageContext.ovmCALLER;\\n }\\n\\n // Avoid unnecessary the SSTORE.\\n if (_prevMessageContext.ovmADDRESS != _nextMessageContext.ovmADDRESS) {\\n messageContext.ovmADDRESS = _nextMessageContext.ovmADDRESS;\\n }\\n\\n // Avoid unnecessary the SSTORE.\\n if (_prevMessageContext.isStatic != _nextMessageContext.isStatic) {\\n messageContext.isStatic = _nextMessageContext.isStatic;\\n }\\n }\\n\\n /**\\n * Initializes the execution context.\\n * @param _transaction OVM transaction being executed.\\n */\\n function _initContext(\\n Lib_OVMCodec.Transaction memory _transaction\\n )\\n internal\\n {\\n transactionContext.ovmTIMESTAMP = _transaction.timestamp;\\n transactionContext.ovmNUMBER = _transaction.blockNumber;\\n transactionContext.ovmTXGASLIMIT = _transaction.gasLimit;\\n transactionContext.ovmL1QUEUEORIGIN = _transaction.l1QueueOrigin;\\n transactionContext.ovmL1TXORIGIN = _transaction.l1TxOrigin;\\n transactionContext.ovmGASLIMIT = gasMeterConfig.maxGasPerQueuePerEpoch;\\n\\n messageRecord.nuisanceGasLeft = _getNuisanceGasLimit(_transaction.gasLimit);\\n }\\n\\n /**\\n * Resets the transaction and message context.\\n */\\n function _resetContext()\\n internal\\n {\\n transactionContext.ovmL1TXORIGIN = DEFAULT_ADDRESS;\\n transactionContext.ovmTIMESTAMP = DEFAULT_UINT256;\\n transactionContext.ovmNUMBER = DEFAULT_UINT256;\\n transactionContext.ovmGASLIMIT = DEFAULT_UINT256;\\n transactionContext.ovmTXGASLIMIT = DEFAULT_UINT256;\\n transactionContext.ovmL1QUEUEORIGIN = Lib_OVMCodec.QueueOrigin.SEQUENCER_QUEUE;\\n\\n transactionRecord.ovmGasRefund = DEFAULT_UINT256;\\n\\n messageContext.ovmCALLER = DEFAULT_ADDRESS;\\n messageContext.ovmADDRESS = DEFAULT_ADDRESS;\\n messageContext.isStatic = false;\\n\\n messageRecord.nuisanceGasLeft = DEFAULT_UINT256;\\n\\n // Reset the ovmStateManager.\\n ovmStateManager = iOVM_StateManager(address(0));\\n }\\n\\n /*****************************\\n * L2-only Helper Functions *\\n *****************************/\\n\\n /**\\n * Unreachable helper function for simulating eth_calls with an OVM message context.\\n * This function will throw an exception in all cases other than when used as a custom entrypoint in L2 Geth to simulate eth_call.\\n * @param _transaction the message transaction to simulate.\\n * @param _from the OVM account the simulated call should be from.\\n */\\n function simulateMessage(\\n Lib_OVMCodec.Transaction memory _transaction,\\n address _from,\\n iOVM_StateManager _ovmStateManager\\n )\\n external\\n returns (\\n bool,\\n bytes memory\\n )\\n {\\n // Prevent this call from having any effect unless in a custom-set VM frame\\n require(msg.sender == address(0));\\n\\n ovmStateManager = _ovmStateManager;\\n _initContext(_transaction);\\n messageRecord.nuisanceGasLeft = uint(-1);\\n\\n messageContext.ovmADDRESS = _from;\\n\\n bool isCreate = _transaction.entrypoint == address(0);\\n if (isCreate) {\\n (address created, bytes memory revertData) = ovmCREATE(_transaction.data);\\n if (created == address(0)) {\\n return (false, revertData);\\n } else {\\n // The eth_call RPC endpoint for to = undefined will return the deployed bytecode\\n // in the success case, differing from standard create messages.\\n return (true, Lib_EthUtils.getCode(created));\\n }\\n } else {\\n return ovmCALL(\\n _transaction.gasLimit,\\n _transaction.entrypoint,\\n _transaction.data\\n );\\n }\\n }\\n}\\n\",\"keccak256\":\"0x6d2f2c75fd5e494c53573b90cd1a06f3382a6fac3ea5bcbd1082acea2b0762c4\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/predeploys/OVM_DeployerWhitelist.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Interface Imports */\\nimport { iOVM_DeployerWhitelist } from \\\"../../iOVM/predeploys/iOVM_DeployerWhitelist.sol\\\";\\n\\n/**\\n * @title OVM_DeployerWhitelist\\n * @dev The Deployer Whitelist is a temporary predeploy used to provide additional safety during the\\n * initial phases of our mainnet roll out. It is owned by the Optimism team, and defines accounts\\n * which are allowed to deploy contracts on Layer2. The Execution Manager will only allow an\\n * ovmCREATE or ovmCREATE2 operation to proceed if the deployer's address whitelisted.\\n *\\n * Compiler used: optimistic-solc\\n * Runtime target: OVM\\n */\\ncontract OVM_DeployerWhitelist is iOVM_DeployerWhitelist {\\n\\n /**********************\\n * Contract Constants *\\n **********************/\\n\\n bool public initialized;\\n bool public allowArbitraryDeployment;\\n address override public owner;\\n mapping (address => bool) public whitelist;\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n /**\\n * Blocks functions to anyone except the contract owner.\\n */\\n modifier onlyOwner() {\\n require(\\n msg.sender == owner,\\n \\\"Function can only be called by the owner of this contract.\\\"\\n );\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Initializes the whitelist.\\n * @param _owner Address of the owner for this contract.\\n * @param _allowArbitraryDeployment Whether or not to allow arbitrary contract deployment.\\n */\\n function initialize(\\n address _owner,\\n bool _allowArbitraryDeployment\\n )\\n override\\n public\\n {\\n if (initialized == true) {\\n return;\\n }\\n\\n initialized = true;\\n allowArbitraryDeployment = _allowArbitraryDeployment;\\n owner = _owner;\\n }\\n\\n /**\\n * Adds or removes an address from the deployment whitelist.\\n * @param _deployer Address to update permissions for.\\n * @param _isWhitelisted Whether or not the address is whitelisted.\\n */\\n function setWhitelistedDeployer(\\n address _deployer,\\n bool _isWhitelisted\\n )\\n override\\n public\\n onlyOwner\\n {\\n whitelist[_deployer] = _isWhitelisted;\\n }\\n\\n /**\\n * Updates the owner of this contract.\\n * @param _owner Address of the new owner.\\n */\\n function setOwner(\\n address _owner\\n )\\n override\\n public\\n onlyOwner\\n {\\n owner = _owner;\\n }\\n\\n /**\\n * Updates the arbitrary deployment flag.\\n * @param _allowArbitraryDeployment Whether or not to allow arbitrary contract deployment.\\n */\\n function setAllowArbitraryDeployment(\\n bool _allowArbitraryDeployment\\n )\\n override\\n public\\n onlyOwner\\n {\\n allowArbitraryDeployment = _allowArbitraryDeployment;\\n }\\n\\n /**\\n * Permanently enables arbitrary contract deployment and deletes the owner.\\n */\\n function enableArbitraryContractDeployment()\\n override\\n public\\n onlyOwner\\n {\\n setAllowArbitraryDeployment(true);\\n setOwner(address(0));\\n }\\n\\n /**\\n * Checks whether an address is allowed to deploy contracts.\\n * @param _deployer Address to check.\\n * @return _allowed Whether or not the address can deploy contracts.\\n */\\n function isDeployerAllowed(\\n address _deployer\\n )\\n override\\n public\\n returns (\\n bool\\n )\\n {\\n return (\\n initialized == false\\n || allowArbitraryDeployment == true\\n || whitelist[_deployer]\\n );\\n }\\n}\\n\",\"keccak256\":\"0x371e3d3ca1dd4177738b55eead9ad6f8278280e568694df6b42ee01f5558ccb2\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/execution/iOVM_ExecutionManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\ninterface iOVM_ExecutionManager {\\n /**********\\n * Enums *\\n *********/\\n\\n enum RevertFlag {\\n OUT_OF_GAS,\\n INTENTIONAL_REVERT,\\n EXCEEDS_NUISANCE_GAS,\\n INVALID_STATE_ACCESS,\\n UNSAFE_BYTECODE,\\n CREATE_COLLISION,\\n STATIC_VIOLATION,\\n CREATOR_NOT_ALLOWED\\n }\\n\\n enum GasMetadataKey {\\n CURRENT_EPOCH_START_TIMESTAMP,\\n CUMULATIVE_SEQUENCER_QUEUE_GAS,\\n CUMULATIVE_L1TOL2_QUEUE_GAS,\\n PREV_EPOCH_SEQUENCER_QUEUE_GAS,\\n PREV_EPOCH_L1TOL2_QUEUE_GAS\\n }\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct GasMeterConfig {\\n uint256 minTransactionGasLimit;\\n uint256 maxTransactionGasLimit;\\n uint256 maxGasPerQueuePerEpoch;\\n uint256 secondsPerEpoch;\\n }\\n\\n struct GlobalContext {\\n uint256 ovmCHAINID;\\n }\\n\\n struct TransactionContext {\\n Lib_OVMCodec.QueueOrigin ovmL1QUEUEORIGIN;\\n uint256 ovmTIMESTAMP;\\n uint256 ovmNUMBER;\\n uint256 ovmGASLIMIT;\\n uint256 ovmTXGASLIMIT;\\n address ovmL1TXORIGIN;\\n }\\n\\n struct TransactionRecord {\\n uint256 ovmGasRefund;\\n }\\n\\n struct MessageContext {\\n address ovmCALLER;\\n address ovmADDRESS;\\n bool isStatic;\\n }\\n\\n struct MessageRecord {\\n uint256 nuisanceGasLeft;\\n }\\n\\n\\n /************************************\\n * Transaction Execution Entrypoint *\\n ************************************/\\n\\n function run(\\n Lib_OVMCodec.Transaction calldata _transaction,\\n address _txStateManager\\n ) external returns (bytes memory);\\n\\n\\n /*******************\\n * Context Opcodes *\\n *******************/\\n\\n function ovmCALLER() external view returns (address _caller);\\n function ovmADDRESS() external view returns (address _address);\\n function ovmTIMESTAMP() external view returns (uint256 _timestamp);\\n function ovmNUMBER() external view returns (uint256 _number);\\n function ovmGASLIMIT() external view returns (uint256 _gasLimit);\\n function ovmCHAINID() external view returns (uint256 _chainId);\\n\\n\\n /**********************\\n * L2 Context Opcodes *\\n **********************/\\n\\n function ovmL1QUEUEORIGIN() external view returns (Lib_OVMCodec.QueueOrigin _queueOrigin);\\n function ovmL1TXORIGIN() external view returns (address _l1TxOrigin);\\n\\n\\n /*******************\\n * Halting Opcodes *\\n *******************/\\n\\n function ovmREVERT(bytes memory _data) external;\\n\\n\\n /*****************************\\n * Contract Creation Opcodes *\\n *****************************/\\n\\n function ovmCREATE(bytes memory _bytecode) external returns (address _contract, bytes memory _revertdata);\\n function ovmCREATE2(bytes memory _bytecode, bytes32 _salt) external returns (address _contract, bytes memory _revertdata);\\n\\n\\n /*******************************\\n * Account Abstraction Opcodes *\\n ******************************/\\n\\n function ovmGETNONCE() external returns (uint256 _nonce);\\n function ovmINCREMENTNONCE() external;\\n function ovmCREATEEOA(bytes32 _messageHash, uint8 _v, bytes32 _r, bytes32 _s) external;\\n\\n\\n /****************************\\n * Contract Calling Opcodes *\\n ****************************/\\n\\n function ovmCALL(uint256 _gasLimit, address _address, bytes memory _calldata) external returns (bool _success, bytes memory _returndata);\\n function ovmSTATICCALL(uint256 _gasLimit, address _address, bytes memory _calldata) external returns (bool _success, bytes memory _returndata);\\n function ovmDELEGATECALL(uint256 _gasLimit, address _address, bytes memory _calldata) external returns (bool _success, bytes memory _returndata);\\n\\n\\n /****************************\\n * Contract Storage Opcodes *\\n ****************************/\\n\\n function ovmSLOAD(bytes32 _key) external returns (bytes32 _value);\\n function ovmSSTORE(bytes32 _key, bytes32 _value) external;\\n\\n\\n /*************************\\n * Contract Code Opcodes *\\n *************************/\\n\\n function ovmEXTCODECOPY(address _contract, uint256 _offset, uint256 _length) external returns (bytes memory _code);\\n function ovmEXTCODESIZE(address _contract) external returns (uint256 _size);\\n function ovmEXTCODEHASH(address _contract) external returns (bytes32 _hash);\\n\\n\\n /***************************************\\n * Public Functions: Execution Context *\\n ***************************************/\\n\\n function getMaxTransactionGasLimit() external view returns (uint _maxTransactionGasLimit);\\n}\\n\",\"keccak256\":\"0xf023d5d6fc6a03bd52f7a57af6e21076de77e8925d065bb79db062e73e43b684\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/execution/iOVM_SafetyChecker.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title iOVM_SafetyChecker\\n */\\ninterface iOVM_SafetyChecker {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function isBytecodeSafe(bytes calldata _bytecode) external pure returns (bool);\\n}\\n\",\"keccak256\":\"0xde6639676d4ec4f77297652d5ede2429bc93e74e11fefd9e9de4bc92dd784878\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/execution/iOVM_StateManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title iOVM_StateManager\\n */\\ninterface iOVM_StateManager {\\n\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n enum ItemState {\\n ITEM_UNTOUCHED,\\n ITEM_LOADED,\\n ITEM_CHANGED,\\n ITEM_COMMITTED\\n }\\n\\n /***************************\\n * Public Functions: Misc *\\n ***************************/\\n\\n function isAuthenticated(address _address) external view returns (bool);\\n\\n /***************************\\n * Public Functions: Setup *\\n ***************************/\\n\\n function owner() external view returns (address _owner);\\n function ovmExecutionManager() external view returns (address _ovmExecutionManager);\\n function setExecutionManager(address _ovmExecutionManager) external;\\n\\n\\n /************************************\\n * Public Functions: Account Access *\\n ************************************/\\n\\n function putAccount(address _address, Lib_OVMCodec.Account memory _account) external;\\n function putEmptyAccount(address _address) external;\\n function getAccount(address _address) external view returns (Lib_OVMCodec.Account memory _account);\\n function hasAccount(address _address) external view returns (bool _exists);\\n function hasEmptyAccount(address _address) external view returns (bool _exists);\\n function setAccountNonce(address _address, uint256 _nonce) external;\\n function getAccountNonce(address _address) external view returns (uint256 _nonce);\\n function getAccountEthAddress(address _address) external view returns (address _ethAddress);\\n function getAccountStorageRoot(address _address) external view returns (bytes32 _storageRoot);\\n function initPendingAccount(address _address) external;\\n function commitPendingAccount(address _address, address _ethAddress, bytes32 _codeHash) external;\\n function testAndSetAccountLoaded(address _address) external returns (bool _wasAccountAlreadyLoaded);\\n function testAndSetAccountChanged(address _address) external returns (bool _wasAccountAlreadyChanged);\\n function commitAccount(address _address) external returns (bool _wasAccountCommitted);\\n function incrementTotalUncommittedAccounts() external;\\n function getTotalUncommittedAccounts() external view returns (uint256 _total);\\n function wasAccountChanged(address _address) external view returns (bool);\\n function wasAccountCommitted(address _address) external view returns (bool);\\n\\n\\n /************************************\\n * Public Functions: Storage Access *\\n ************************************/\\n\\n function putContractStorage(address _contract, bytes32 _key, bytes32 _value) external;\\n function getContractStorage(address _contract, bytes32 _key) external view returns (bytes32 _value);\\n function hasContractStorage(address _contract, bytes32 _key) external view returns (bool _exists);\\n function testAndSetContractStorageLoaded(address _contract, bytes32 _key) external returns (bool _wasContractStorageAlreadyLoaded);\\n function testAndSetContractStorageChanged(address _contract, bytes32 _key) external returns (bool _wasContractStorageAlreadyChanged);\\n function commitContractStorage(address _contract, bytes32 _key) external returns (bool _wasContractStorageCommitted);\\n function incrementTotalUncommittedContractStorage() external;\\n function getTotalUncommittedContractStorage() external view returns (uint256 _total);\\n function wasContractStorageChanged(address _contract, bytes32 _key) external view returns (bool);\\n function wasContractStorageCommitted(address _contract, bytes32 _key) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x7a11dbd1f61593ba34debe07e39eef59967307f7f372ba9855bee0953585d08d\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/predeploys/iOVM_DeployerWhitelist.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title iOVM_DeployerWhitelist\\n */\\ninterface iOVM_DeployerWhitelist {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function initialize(address _owner, bool _allowArbitraryDeployment) external;\\n function owner() external returns (address _owner);\\n function setWhitelistedDeployer(address _deployer, bool _isWhitelisted) external;\\n function setOwner(address _newOwner) external;\\n function setAllowArbitraryDeployment(bool _allowArbitraryDeployment) external;\\n function enableArbitraryContractDeployment() external;\\n function isDeployerAllowed(address _deployer) external returns (bool _allowed);\\n}\\n\",\"keccak256\":\"0xdf1f27faf0d26d416bf6d408d146a16de32b4e1772a292c65d39eb7ec2b53ceb\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/codec/Lib_OVMCodec.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../utils/Lib_Bytes32Utils.sol\\\";\\n\\n/**\\n * @title Lib_OVMCodec\\n */\\nlibrary Lib_OVMCodec {\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum QueueOrigin {\\n SEQUENCER_QUEUE,\\n L1TOL2_QUEUE\\n }\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Account {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n address ethAddress;\\n bool isFresh;\\n }\\n\\n struct EVMAccount {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n }\\n\\n struct ChainBatchHeader {\\n uint256 batchIndex;\\n bytes32 batchRoot;\\n uint256 batchSize;\\n uint256 prevTotalElements;\\n bytes extraData;\\n }\\n\\n struct ChainInclusionProof {\\n uint256 index;\\n bytes32[] siblings;\\n }\\n\\n struct Transaction {\\n uint256 timestamp;\\n uint256 blockNumber;\\n QueueOrigin l1QueueOrigin;\\n address l1TxOrigin;\\n address entrypoint;\\n uint256 gasLimit;\\n bytes data;\\n }\\n\\n struct TransactionChainElement {\\n bool isSequenced;\\n uint256 queueIndex; // QUEUED TX ONLY\\n uint256 timestamp; // SEQUENCER TX ONLY\\n uint256 blockNumber; // SEQUENCER TX ONLY\\n bytes txData; // SEQUENCER TX ONLY\\n }\\n\\n struct QueueElement {\\n bytes32 transactionHash;\\n uint40 timestamp;\\n uint40 blockNumber;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Encodes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Encoded transaction bytes.\\n */\\n function encodeTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return abi.encodePacked(\\n _transaction.timestamp,\\n _transaction.blockNumber,\\n _transaction.l1QueueOrigin,\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n );\\n }\\n\\n /**\\n * Hashes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Hashed transaction\\n */\\n function hashTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(encodeTransaction(_transaction));\\n }\\n\\n /**\\n * Converts an OVM account to an EVM account.\\n * @param _in OVM account to convert.\\n * @return Converted EVM account.\\n */\\n function toEVMAccount(\\n Account memory _in\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n return EVMAccount({\\n nonce: _in.nonce,\\n balance: _in.balance,\\n storageRoot: _in.storageRoot,\\n codeHash: _in.codeHash\\n });\\n }\\n\\n /**\\n * @notice RLP-encodes an account state struct.\\n * @param _account Account state struct.\\n * @return RLP-encoded account state.\\n */\\n function encodeEVMAccount(\\n EVMAccount memory _account\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes[] memory raw = new bytes[](4);\\n\\n // Unfortunately we can't create this array outright because\\n // Lib_RLPWriter.writeList will reject fixed-size arrays. Assigning\\n // index-by-index circumvents this issue.\\n raw[0] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.nonce)\\n )\\n );\\n raw[1] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.balance)\\n )\\n );\\n raw[2] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.storageRoot));\\n raw[3] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.codeHash));\\n\\n return Lib_RLPWriter.writeList(raw);\\n }\\n\\n /**\\n * @notice Decodes an RLP-encoded account state into a useful struct.\\n * @param _encoded RLP-encoded account state.\\n * @return Account state struct.\\n */\\n function decodeEVMAccount(\\n bytes memory _encoded\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\\n\\n return EVMAccount({\\n nonce: Lib_RLPReader.readUint256(accountState[0]),\\n balance: Lib_RLPReader.readUint256(accountState[1]),\\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\\n });\\n }\\n\\n /**\\n * Calculates a hash for a given batch header.\\n * @param _batchHeader Header to hash.\\n * @return Hash of the header.\\n */\\n function hashBatchHeader(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(\\n abi.encode(\\n _batchHeader.batchRoot,\\n _batchHeader.batchSize,\\n _batchHeader.prevTotalElements,\\n _batchHeader.extraData\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0xd85ba2066057a2677926f484b938c7c2ef33ff3853f3b71cda252f4a54f30e05\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n public\\n onlyOwner\\n {\\n addresses[_getNameHash(_name)] = _address;\\n\\n emit AddressSet(\\n _name,\\n _address\\n );\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0x2ce671a0e004df88b136bea5a3c59d0732cea8887c8496da1d509e0200b03d7d\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(\\n address _libAddressManager\\n ) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x65981feeabff6a81783ea97d44baf988a18a86c8cb374c46fdb71819cbacc7c0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPReader.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_RLPReader\\n * @dev Adapted from \\\"RLPReader\\\" by Hamdi Allam (hamdi.allam97@gmail.com).\\n */\\nlibrary Lib_RLPReader {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 constant internal MAX_LIST_LENGTH = 32;\\n\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum RLPItemType {\\n DATA_ITEM,\\n LIST_ITEM\\n }\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct RLPItem {\\n uint256 length;\\n uint256 ptr;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts bytes to a reference to memory position and length.\\n * @param _in Input bytes to convert.\\n * @return Output memory reference.\\n */\\n function toRLPItem(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem memory\\n )\\n {\\n uint256 ptr;\\n assembly {\\n ptr := add(_in, 32)\\n }\\n\\n return RLPItem({\\n length: _in.length,\\n ptr: ptr\\n });\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n (\\n uint256 listOffset,\\n ,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.LIST_ITEM,\\n \\\"Invalid RLP list value.\\\"\\n );\\n\\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\\n // writing to the length. Since we can't know the number of RLP items without looping over\\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\\n // simply set a reasonable maximum list length and decrease the size before we finish.\\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\\n\\n uint256 itemCount = 0;\\n uint256 offset = listOffset;\\n while (offset < _in.length) {\\n require(\\n itemCount < MAX_LIST_LENGTH,\\n \\\"Provided RLP list exceeds max list length.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n ) = _decodeLength(RLPItem({\\n length: _in.length - offset,\\n ptr: _in.ptr + offset\\n }));\\n\\n out[itemCount] = RLPItem({\\n length: itemLength + itemOffset,\\n ptr: _in.ptr + offset\\n });\\n\\n itemCount += 1;\\n offset += itemOffset + itemLength;\\n }\\n\\n // Decrease the array size to match the actual item count.\\n assembly {\\n mstore(out, itemCount)\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n return readList(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes value.\\\"\\n );\\n\\n return _copy(_in.ptr, itemOffset, itemLength);\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return readBytes(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return string(readBytes(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return readString(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n require(\\n _in.length <= 33,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr + itemOffset;\\n bytes32 out;\\n assembly {\\n out := mload(ptr)\\n\\n // Shift the bytes over to match the item size.\\n if lt(itemLength, 32) {\\n out := div(out, exp(256, sub(32, itemLength)))\\n }\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return readBytes32(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return uint256(readBytes32(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return readUint256(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n require(\\n _in.length == 1,\\n \\\"Invalid RLP boolean value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 out;\\n assembly {\\n out := byte(0, mload(ptr))\\n }\\n\\n require(\\n out == 0 || out == 1,\\n \\\"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\\\"\\n );\\n\\n return out != 0;\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return readBool(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n if (_in.length == 1) {\\n return address(0);\\n }\\n\\n require(\\n _in.length == 21,\\n \\\"Invalid RLP address value.\\\"\\n );\\n\\n return address(readUint256(_in));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return readAddress(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads the raw bytes of an RLP item.\\n * @param _in RLP item to read.\\n * @return Raw RLP bytes.\\n */\\n function readRawBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in);\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Decodes the length of an RLP item.\\n * @param _in RLP item to decode.\\n * @return Offset of the encoded data.\\n * @return Length of the encoded data.\\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\\n */\\n function _decodeLength(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n uint256,\\n uint256,\\n RLPItemType\\n )\\n {\\n require(\\n _in.length > 0,\\n \\\"RLP item cannot be null.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 prefix;\\n assembly {\\n prefix := byte(0, mload(ptr))\\n }\\n\\n if (prefix <= 0x7f) {\\n // Single byte.\\n\\n return (0, 1, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xb7) {\\n // Short string.\\n\\n uint256 strLen = prefix - 0x80;\\n\\n require(\\n _in.length > strLen,\\n \\\"Invalid RLP short string.\\\"\\n );\\n\\n return (1, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xbf) {\\n // Long string.\\n uint256 lenOfStrLen = prefix - 0xb7;\\n\\n require(\\n _in.length > lenOfStrLen,\\n \\\"Invalid RLP long string length.\\\"\\n );\\n\\n uint256 strLen;\\n assembly {\\n // Pick out the string length.\\n strLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfStrLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfStrLen + strLen,\\n \\\"Invalid RLP long string.\\\"\\n );\\n\\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xf7) {\\n // Short list.\\n uint256 listLen = prefix - 0xc0;\\n\\n require(\\n _in.length > listLen,\\n \\\"Invalid RLP short list.\\\"\\n );\\n\\n return (1, listLen, RLPItemType.LIST_ITEM);\\n } else {\\n // Long list.\\n uint256 lenOfListLen = prefix - 0xf7;\\n\\n require(\\n _in.length > lenOfListLen,\\n \\\"Invalid RLP long list length.\\\"\\n );\\n\\n uint256 listLen;\\n assembly {\\n // Pick out the list length.\\n listLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfListLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfListLen + listLen,\\n \\\"Invalid RLP long list.\\\"\\n );\\n\\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\\n }\\n }\\n\\n /**\\n * Copies the bytes from a memory location.\\n * @param _src Pointer to the location to read from.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Copied bytes.\\n */\\n function _copy(\\n uint256 _src,\\n uint256 _offset,\\n uint256 _length\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out = new bytes(_length);\\n if (out.length == 0) {\\n return out;\\n }\\n\\n uint256 src = _src + _offset;\\n uint256 dest;\\n assembly {\\n dest := add(out, 32)\\n }\\n\\n // Copy over as many complete words as we can.\\n for (uint256 i = 0; i < _length / 32; i++) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n\\n src += 32;\\n dest += 32;\\n }\\n\\n // Pick out the remaining bytes.\\n uint256 mask = 256 ** (32 - (_length % 32)) - 1;\\n assembly {\\n mstore(\\n dest,\\n or(\\n and(mload(src), not(mask)),\\n and(mload(dest), mask)\\n )\\n )\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Copies an RLP item into bytes.\\n * @param _in RLP item to copy.\\n * @return Copied bytes.\\n */\\n function _copy(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in.ptr, 0, _in.length);\\n }\\n}\\n\",\"keccak256\":\"0x829174c61216dce35fdb888383b6022e0365eb7fbdc71ad79d98b108091969fe\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPWriter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/**\\n * @title Lib_RLPWriter\\n * @author Bakaoh (with modifications)\\n */\\nlibrary Lib_RLPWriter {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * RLP encodes a byte string.\\n * @param _in The byte string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded;\\n\\n if (_in.length == 1 && uint8(_in[0]) < 128) {\\n encoded = _in;\\n } else {\\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * RLP encodes a list of RLP encoded byte byte strings.\\n * @param _in The list of RLP encoded byte strings.\\n * @return The RLP encoded list of items in bytes.\\n */\\n function writeList(\\n bytes[] memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory list = _flatten(_in);\\n return abi.encodePacked(_writeLength(list.length, 192), list);\\n }\\n\\n /**\\n * RLP encodes a string.\\n * @param _in The string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeString(\\n string memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(bytes(_in));\\n }\\n\\n /**\\n * RLP encodes an address.\\n * @param _in The address to encode.\\n * @return The RLP encoded address in bytes.\\n */\\n function writeAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a bytes32 value.\\n * @param _in The bytes32 to encode.\\n * @return _out The RLP encoded bytes32 in bytes.\\n */\\n function writeBytes32(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a uint.\\n * @param _in The uint256 to encode.\\n * @return The RLP encoded uint256 in bytes.\\n */\\n function writeUint(\\n uint256 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(_toBinary(_in));\\n }\\n\\n /**\\n * RLP encodes a bool.\\n * @param _in The bool to encode.\\n * @return The RLP encoded bool in bytes.\\n */\\n function writeBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded = new bytes(1);\\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\\n return encoded;\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\\n * @param _len The length of the string or the payload.\\n * @param _offset 128 if item is string, 192 if item is list.\\n * @return RLP encoded bytes.\\n */\\n function _writeLength(\\n uint256 _len,\\n uint256 _offset\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded;\\n\\n if (_len < 56) {\\n encoded = new bytes(1);\\n encoded[0] = byte(uint8(_len) + uint8(_offset));\\n } else {\\n uint256 lenLen;\\n uint256 i = 1;\\n while (_len / i != 0) {\\n lenLen++;\\n i *= 256;\\n }\\n\\n encoded = new bytes(lenLen + 1);\\n encoded[0] = byte(uint8(lenLen) + uint8(_offset) + 55);\\n for(i = 1; i <= lenLen; i++) {\\n encoded[i] = byte(uint8((_len / (256**(lenLen-i))) % 256));\\n }\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * Encode integer in big endian binary form with no leading zeroes.\\n * @notice TODO: This should be optimized with assembly to save gas costs.\\n * @param _x The integer to encode.\\n * @return RLP encoded bytes.\\n */\\n function _toBinary(\\n uint256 _x\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory b = abi.encodePacked(_x);\\n\\n uint256 i = 0;\\n for (; i < 32; i++) {\\n if (b[i] != 0) {\\n break;\\n }\\n }\\n\\n bytes memory res = new bytes(32 - i);\\n for (uint256 j = 0; j < res.length; j++) {\\n res[j] = b[i++];\\n }\\n\\n return res;\\n }\\n\\n /**\\n * Copies a piece of memory to another location.\\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\\n * @param _dest Destination location.\\n * @param _src Source location.\\n * @param _len Length of memory to copy.\\n */\\n function _memcpy(\\n uint256 _dest,\\n uint256 _src,\\n uint256 _len\\n )\\n private\\n pure\\n {\\n uint256 dest = _dest;\\n uint256 src = _src;\\n uint256 len = _len;\\n\\n for(; len >= 32; len -= 32) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n dest += 32;\\n src += 32;\\n }\\n\\n uint256 mask = 256 ** (32 - len) - 1;\\n assembly {\\n let srcpart := and(mload(src), not(mask))\\n let destpart := and(mload(dest), mask)\\n mstore(dest, or(destpart, srcpart))\\n }\\n }\\n\\n /**\\n * Flattens a list of byte strings into one byte string.\\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\\n * @param _list List of byte strings to flatten.\\n * @return The flattened byte string.\\n */\\n function _flatten(\\n bytes[] memory _list\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n if (_list.length == 0) {\\n return new bytes(0);\\n }\\n\\n uint256 len;\\n uint256 i = 0;\\n for (; i < _list.length; i++) {\\n len += _list[i].length;\\n }\\n\\n bytes memory flattened = new bytes(len);\\n uint256 flattenedPtr;\\n assembly { flattenedPtr := add(flattened, 0x20) }\\n\\n for(i = 0; i < _list.length; i++) {\\n bytes memory item = _list[i];\\n\\n uint256 listPtr;\\n assembly { listPtr := add(item, 0x20)}\\n\\n _memcpy(flattenedPtr, listPtr, item.length);\\n flattenedPtr += _list[i].length;\\n }\\n\\n return flattened;\\n }\\n}\\n\",\"keccak256\":\"0xb60ee4b03ad372c3deff21d454ab714dd0c18ee3e6f9d45532e209fc59d5a54d\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_Bytes32Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_Byte32Utils\\n */\\nlibrary Lib_Bytes32Utils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \\\"true.\\\"\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as a boolean.\\n */\\n function toBool(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return _in != 0;\\n }\\n\\n /**\\n * Converts a boolean to a bytes32 value.\\n * @param _in Input boolean value.\\n * @return Boolean as a bytes32.\\n */\\n function fromBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in ? 1 : 0));\\n }\\n\\n /**\\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as an address.\\n */\\n function toAddress(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return address(uint160(uint256(_in)));\\n }\\n\\n /**\\n * Converts an address to a bytes32.\\n * @param _in Input address value.\\n * @return Address as a bytes32.\\n */\\n function fromAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in));\\n }\\n\\n /**\\n * Removes the leading zeros from a bytes32 value and returns a new (smaller) bytes value.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 without any leading zeros.\\n */\\n function removeLeadingZeros(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out;\\n\\n assembly {\\n // Figure out how many leading zero bytes to remove.\\n let shift := 0\\n for { let i := 0 } and(lt(i, 32), eq(byte(i, _in), 0)) { i := add(i, 1) } {\\n shift := add(shift, 1)\\n }\\n\\n // Reserve some space for our output and fix the free memory pointer.\\n out := mload(0x40)\\n mstore(0x40, add(out, 0x40))\\n\\n // Shift the value and store it into the output bytes.\\n mstore(add(out, 0x20), shl(mul(shift, 8), _in))\\n\\n // Store the new size (with leading zero bytes removed) in the output byte size.\\n mstore(out, sub(32, shift))\\n }\\n\\n return out;\\n }\\n}\\n\",\"keccak256\":\"0xfa2def593e3fc56a31852c3744aefdaa93cec74e721bfcfeb1e5d166c7c60b64\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_BytesUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_BytesUtils\\n */\\nlibrary Lib_BytesUtils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_start + _length >= _start, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n if (_bytes.length - _start == 0) {\\n return bytes('');\\n }\\n\\n return slice(_bytes, _start, _bytes.length - _start);\\n }\\n\\n function toBytes32PadLeft(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n bytes32 ret;\\n uint256 len = _bytes.length <= 32 ? _bytes.length : 32;\\n assembly {\\n ret := shr(mul(sub(32, len), 8), mload(add(_bytes, 32)))\\n }\\n return ret;\\n }\\n\\n function toBytes32(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n if (_bytes.length < 32) {\\n bytes32 ret;\\n assembly {\\n ret := mload(add(_bytes, 32))\\n }\\n return ret;\\n }\\n\\n return abi.decode(_bytes,(bytes32)); // will truncate if input length > 32 bytes\\n }\\n\\n function toUint256(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return uint256(toBytes32(_bytes));\\n }\\n\\n function toUint24(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n uint24\\n )\\n {\\n require(_start + 3 >= _start, \\\"toUint24_overflow\\\");\\n require(_bytes.length >= _start + 3 , \\\"toUint24_outOfBounds\\\");\\n uint24 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x3), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toUint8(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n uint8\\n )\\n {\\n require(_start + 1 >= _start, \\\"toUint8_overflow\\\");\\n require(_bytes.length >= _start + 1 , \\\"toUint8_outOfBounds\\\");\\n uint8 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x1), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toAddress(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n require(_start + 20 >= _start, \\\"toAddress_overflow\\\");\\n require(_bytes.length >= _start + 20, \\\"toAddress_outOfBounds\\\");\\n address tempAddress;\\n\\n assembly {\\n tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000)\\n }\\n\\n return tempAddress;\\n }\\n\\n function toNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory nibbles = new bytes(_bytes.length * 2);\\n\\n for (uint256 i = 0; i < _bytes.length; i++) {\\n nibbles[i * 2] = _bytes[i] >> 4;\\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\\n }\\n\\n return nibbles;\\n }\\n\\n function fromNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory ret = new bytes(_bytes.length / 2);\\n\\n for (uint256 i = 0; i < ret.length; i++) {\\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\\n }\\n\\n return ret;\\n }\\n\\n function equal(\\n bytes memory _bytes,\\n bytes memory _other\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return keccak256(_bytes) == keccak256(_other);\\n }\\n}\\n\",\"keccak256\":\"0xa5195afe32fb2cf104d156e8f4bd39df1ec79bf6ba232097b9e8e0ee14fbc298\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_ErrorUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/**\\n * @title Lib_ErrorUtils\\n */\\nlibrary Lib_ErrorUtils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Encodes an error string into raw solidity-style revert data.\\n * (i.e. ascii bytes, prefixed with bytes4(keccak(\\\"Error(string))\\\"))\\n * Ref: https://docs.soliditylang.org/en/v0.8.2/control-structures.html?highlight=Error(string)#panic-via-assert-and-error-via-require\\n * @param _reason Reason for the reversion.\\n * @return Standard solidity revert data for the given reason.\\n */\\n function encodeRevertString(\\n string memory _reason\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return abi.encodeWithSignature(\\n \\\"Error(string)\\\",\\n _reason\\n );\\n }\\n}\\n\",\"keccak256\":\"0xfc64ec4a81fb50865b502a0004ed154e8598e1a313db77303fc95e41f536e6b7\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_EthUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// @unsupported: ovm\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"./Lib_Bytes32Utils.sol\\\";\\n\\n/**\\n * @title Lib_EthUtils\\n */\\nlibrary Lib_EthUtils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Gets the code for a given address.\\n * @param _address Address to get code for.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Code read from the contract.\\n */\\n function getCode(\\n address _address,\\n uint256 _offset,\\n uint256 _length\\n )\\n internal\\n view\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory code;\\n assembly {\\n code := mload(0x40)\\n mstore(0x40, add(code, add(_length, 0x20)))\\n mstore(code, _length)\\n extcodecopy(_address, add(code, 0x20), _offset, _length)\\n }\\n\\n return code;\\n }\\n\\n /**\\n * Gets the full code for a given address.\\n * @param _address Address to get code for.\\n * @return Full code of the contract.\\n */\\n function getCode(\\n address _address\\n )\\n internal\\n view\\n returns (\\n bytes memory\\n )\\n {\\n return getCode(\\n _address,\\n 0,\\n getCodeSize(_address)\\n );\\n }\\n\\n /**\\n * Gets the size of a contract's code in bytes.\\n * @param _address Address to get code size for.\\n * @return Size of the contract's code in bytes.\\n */\\n function getCodeSize(\\n address _address\\n )\\n internal\\n view\\n returns (\\n uint256\\n )\\n {\\n uint256 codeSize;\\n assembly {\\n codeSize := extcodesize(_address)\\n }\\n\\n return codeSize;\\n }\\n\\n /**\\n * Gets the hash of a contract's code.\\n * @param _address Address to get a code hash for.\\n * @return Hash of the contract's code.\\n */\\n function getCodeHash(\\n address _address\\n )\\n internal\\n view\\n returns (\\n bytes32\\n )\\n {\\n bytes32 codeHash;\\n assembly {\\n codeHash := extcodehash(_address)\\n }\\n\\n return codeHash;\\n }\\n\\n /**\\n * Creates a contract with some given initialization code.\\n * @param _code Contract initialization code.\\n * @return Address of the created contract.\\n */\\n function createContract(\\n bytes memory _code\\n )\\n internal\\n returns (\\n address\\n )\\n {\\n address created;\\n assembly {\\n created := create(\\n 0,\\n add(_code, 0x20),\\n mload(_code)\\n )\\n }\\n\\n return created;\\n }\\n\\n /**\\n * Computes the address that would be generated by CREATE.\\n * @param _creator Address creating the contract.\\n * @param _nonce Creator's nonce.\\n * @return Address to be generated by CREATE.\\n */\\n function getAddressForCREATE(\\n address _creator,\\n uint256 _nonce\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n bytes[] memory encoded = new bytes[](2);\\n encoded[0] = Lib_RLPWriter.writeAddress(_creator);\\n encoded[1] = Lib_RLPWriter.writeUint(_nonce);\\n\\n bytes memory encodedList = Lib_RLPWriter.writeList(encoded);\\n return Lib_Bytes32Utils.toAddress(keccak256(encodedList));\\n }\\n\\n /**\\n * Computes the address that would be generated by CREATE2.\\n * @param _creator Address creating the contract.\\n * @param _bytecode Bytecode of the contract to be created.\\n * @param _salt 32 byte salt value mixed into the hash.\\n * @return Address to be generated by CREATE2.\\n */\\n function getAddressForCREATE2(\\n address _creator,\\n bytes memory _bytecode,\\n bytes32 _salt\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n bytes32 hashedData = keccak256(abi.encodePacked(\\n byte(0xff),\\n _creator,\\n _salt,\\n keccak256(_bytecode)\\n ));\\n\\n return Lib_Bytes32Utils.toAddress(hashedData);\\n }\\n}\\n\",\"keccak256\":\"0xf29a67d78e61cb472d524b779b32cfcb39a587f4096500d5419e6425ed367d49\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x60806040523480156200001157600080fd5b506040516200314d3803806200314d833981016040819052620000349162000292565b600080546001600160a01b0319166001600160a01b03851617905560408051808201909152601181527027ab26afa9b0b332ba3ca1b432b1b5b2b960791b60208201526200008290620000d7565b600180546001600160a01b0319166001600160a01b039290921691909117905581516003556020820151600455604082015160055560608201516006558051600755620000ce620001b9565b50505062000337565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b83811015620001395781810151838201526020016200011f565b50505050905090810190601f168015620001675780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b1580156200018557600080fd5b505afa1580156200019a573d6000803e3d6000fd5b505050506040513d6020811015620001b157600080fd5b505192915050565b600d80546001600160a01b031990811673defa017defa017defa017defa017defa017defa09081179092557fdefa017defa017defa017defa017defa017defa017defa017defa017defa017d6009819055600a819055600b819055600c8190556008805460ff191690556010819055600e8054831684179055600f8054831690931760ff60a01b1916909255601191909155600280549091169055565b60006020828403121562000268578081fd5b604051602081016001600160401b03811182821017156200028557fe5b6040529151825250919050565b600080600083850360c0811215620002a8578384fd5b84516001600160a01b0381168114620002bf578485fd5b93506080601f1982011215620002d3578283fd5b50604051608081016001600160401b0381118282101715620002f157fe5b806040525060208501518152604085015160208201526060850151604082015260808501516060820152809250506200032e8560a0860162000256565b90509250925092565b612e0680620003476000396000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c80637cebbe94116100f957806399ccd98b11610097578063bdbf8c3611610071578063bdbf8c361461037e578063c1fb2ea214610386578063fcb6829b1461038e578063ffe73914146103a1576101c4565b806399ccd98b146103505780639be3ad67146103635780639dc9dc9314610376576101c4565b806385979f76116100d357806385979f761461031a5780638bb42e151461032d5780639058025614610340578063996d79a514610348576101c4565b80637cebbe94146102de5780638435035b146102e65780638540661f146102f9576101c4565b8063299ca478116101665780635a98c361116101405780635a98c3611461029b57806373509064146102a3578063741a33eb146102ab578063746c32f1146102be576101c4565b8063299ca478146102605780632a2a7adb14610275578063461a447814610288576101c4565b80631c4712a7116101a25780631c4712a71461022857806320160f3a1461023057806322bd64c01461023857806324749d5c1461024d576101c4565b806303daa959146101c9578063101185a4146101f257806314aa2ff714610207575b600080fd5b6101dc6101d73660046125e1565b6103b4565b6040516101e99190612a35565b60405180910390f35b6101fa6103f9565b6040516101e99190612b20565b61021a610215366004612673565b610402565b6040516101e9929190612ab0565b6101dc61049a565b6101dc6104a0565b61024b610246366004612611565b6104a6565b005b6101dc61025b366004612555565b610509565b610268610524565b6040516101e99190612a3e565b61024b610283366004612673565b610533565b61026861029636600461278c565b610541565b6101dc61061d565b610268610623565b61024b6102b9366004612632565b610632565b6102d16102cc36600461258d565b61079f565b6040516101e99190612b0d565b61024b6107d2565b6101dc6102f4366004612555565b610829565b61030c610307366004612881565b61083c565b6040516101e9929190612ad4565b61030c610328366004612881565b6108b5565b61030c61033b366004612820565b610904565b6101dc6109d7565b6102686109dd565b61021a61035e3660046126ad565b6109ec565b6102d16103713660046127d1565b610a7f565b610268610be1565b6101dc610bf0565b6101dc610bf6565b61024b61039c3660046128d7565b610c0d565b61030c6103af366004612881565b610df7565b6000619c4060005a905060006103c86109dd565b90506103d48186610e48565b93505060005a82039050808310156103f157601080548483030190555b505050919050565b60085460ff1690565b600f5460009060609060ff600160a01b9091041615156001141561042a5761042a6006610ed6565b619c4060005a9050600061043c6109dd565b905061044781610eef565b600061045b8261045684610f74565b610fff565b90506104678188611090565b95509550505060005a8203905080831015610489576010805484019055610492565b60108054820190555b505050915091565b60045490565b600b5490565b600f5460ff600160a01b909104161515600114156104c8576104c86006610ed6565b61ea6060005a905060006104da6109dd565b90506104e7818686611116565b5060005a820390508083101561050257601080548483030190555b5050505050565b600061051c61051783611198565b611223565b90505b919050565b6000546001600160a01b031681565b61053e600182611227565b50565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b838110156105a1578181015183820152602001610589565b50505050905090810190601f1680156105ce5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b1580156105eb57600080fd5b505afa1580156105ff573d6000803e3d6000fd5b505050506040513d602081101561061557600080fd5b505192915050565b600a5490565b600e546001600160a01b031690565b600f5460ff600160a01b90910416151560011415610654576106546006610ed6565b600060018585601b0185856040516000815260200160405260405161067c9493929190612aef565b6020604051602081039080840390855afa15801561069e573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166106da576106da604051806060016040528060388152602001612cbf60389139610533565b6106e38161123d565b6106ed5750610799565b6106f6816112c8565b600f80546001600160a01b038381166001600160a01b031983161790925516600061075361072f6009602160991b01836102cc82610829565b60405160200161073f91906129ff565b60405160208183030381529060405261132f565b600f80546001600160a01b0319166001600160a01b038516179055905061078a838261077e81611342565b80519060200120611358565b610795836000611395565b5050505b50505050565b60606000826001146107b157826107b4565b60025b90506107c96107c286611198565b8583611406565b95945050505050565b600f5460ff600160a01b909104161515600114156107f4576107f46006610ed6565b60006107fe6109dd565b9050600061080b82610f74565b905080816001011115610825576108258282600101611395565b5050565b600061051c61083783611198565b61142a565b600060606201388060005a60408051606081018252600f546001600160a01b039081168252891660208201526001918101919091529091506108808189898961142e565b945094505060005a82039050808310156108a15760108054840190556108aa565b60108054820190555b505050935093915050565b60006060620186a060005a60408051606081018252600f5460ff600160a01b8204161515928201929092526001600160a01b03918216815290881660208201529091506108808189898961142e565b60006060331561091357600080fd5b600280546001600160a01b0319166001600160a01b038516179055610937856114bf565b600019601155600f80546001600160a01b0319166001600160a01b03868116919091179091556080860151161580156109b25760008061097a8860c00151610402565b90925090506001600160a01b03821661099b576000945092506109cf915050565b60016109a683611342565b945094505050506109cf565b6109c98660a0015187608001518860c001516108b5565b92509250505b935093915050565b60075490565b600f546001600160a01b031690565b600f5460009060609060ff600160a01b90910416151560011415610a1457610a146006610ed6565b619c4060005a90506000610a266109dd565b9050610a3181610eef565b6000610a3e828989611531565b9050610a4a8189611090565b95509550505060005a8203905080831015610a6c576010805484019055610a75565b60108054820190555b5050509250929050565b600a546060907fdefa017defa017defa017defa017defa017defa017defa017defa017defa017d14610ac05750604080516020810190915260008152610bdb565b600280546001600160a01b0319166001600160a01b038481169190911791829055604051630d15d41560e41b815291169063d15d415090610b05903390600401612a3e565b60206040518083038186803b158015610b1d57600080fd5b505afa158015610b31573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b5591906125c1565b610b7a5760405162461bcd60e51b8152600401610b7190612b9c565b60405180910390fd5b610b83836114bf565b610b8c83611577565b610bad57610b986115d3565b50604080516020810190915260008152610bdb565b6000610bcd6003600001548560a001510385608001518660c001516108b5565b915050610bd86115d3565b90505b92915050565b600d546001600160a01b031690565b60095490565b6000610c08610c036109dd565b610f74565b905090565b333014610c1957610df2565b610c228161123d565b610c5157610c516005610c4c604051806060016040528060348152602001612d6d60349139611670565b611227565b6001546040516352275acd60e11b81526001600160a01b039091169063a44eb59a90610c81908590600401612b0d565b60206040518083038186803b158015610c9957600080fd5b505afa158015610cad573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cd191906125c1565b610cfb57610cfb6004610c4c6040518060a0016040528060768152602001612cf760769139611670565b610d04816112c8565b6000610d0f8361132f565b90506001600160a01b038116610d29573d6000803e3d6000fd5b6000610d3482611342565b6001546040516352275acd60e11b81529192506001600160a01b03169063a44eb59a90610d65908490600401612b0d565b60206040518083038186803b158015610d7d57600080fd5b505afa158015610d91573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610db591906125c1565b610ddf57610ddf6004610c4c604051806060016040528060308152602001612da160309139611670565b6105028383610ded85611223565b611358565b505050565b60006060619c4060005a60408051606081018252600e546001600160a01b039081168252600f549081166020830152600160a01b900460ff161515918101919091529091506108808189898961142e565b6000610e5483836116b3565b600254604051631aaf392f60e01b81526001600160a01b0390911690631aaf392f90610e869086908690600401612a76565b60206040518083038186803b158015610e9e57600080fd5b505afa158015610eb2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bd891906125f9565b61053e8160405180602001604052806000815250611227565b600080610f3e5a6002602160991b0185604051602401610f0f9190612a3e565b60408051601f198184030181529190526020810180516001600160e01b031663b1540a0160e01b1790526108b5565b91509150600081806020019051810190610f5891906125c1565b9050801580610f65575082155b15610799576107996007610ed6565b6000610f7f826117ee565b60025460405163d126199f60e01b81526001600160a01b039091169063d126199f90610faf908590600401612a3e565b60206040518083038186803b158015610fc757600080fd5b505afa158015610fdb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061051c91906125f9565b60408051600280825260608201909252600091829190816020015b606081526020019060019003908161101a57905050905061103a84611935565b8160008151811061104757fe5b602002602001018190525061105b8361195f565b8160018151811061106857fe5b6020026020010181905250600061107e82611972565b90506107c981805190602001206119b6565b600060606110b261109f6109dd565b6110aa610c036109dd565b600101611395565b60408051606081018252600f5460ff600160a01b8204161515928201929092526001600160a01b03918216815290851660208201526000806110f8835a898960016119b9565b915091508161110857600061110a565b865b97909650945050505050565b806111218484610e48565b141561112c57610df2565b6111368383611c27565b600254604051635c17d62960e01b81526001600160a01b0390911690635c17d6299061116a90869086908690600401612a8f565b600060405180830381600087803b15801561118457600080fd5b505af1158015610795573d6000803e3d6000fd5b60006111a3826117ee565b600254604051637c8ee70360e01b81526001600160a01b0390911690637c8ee703906111d3908590600401612a3e565b60206040518083038186803b1580156111eb57600080fd5b505afa1580156111ff573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061051c9190612571565b3f90565b60006112338383611d39565b9050805160208201fd5b6000611248826117ee565b6002546040516307a1294560e01b81526001600160a01b03909116906307a1294590611278908590600401612a3e565b60206040518083038186803b15801561129057600080fd5b505afa1580156112a4573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061051c91906125c1565b6112d1816117ee565b600254604051637e78a4d160e11b81526001600160a01b039091169063fcf149a290611301908490600401612a3e565b600060405180830381600087803b15801561131b57600080fd5b505af1158015610502573d6000803e3d6000fd5b6000808251602084016000f09392505050565b606061051c8260006113538561142a565b611406565b61136183611de2565b6002546040516368510af960e11b81526001600160a01b039091169063d0a215f29061116a90869086908690600401612a52565b61139e82611de2565b6002546040516374855dc360e11b81526001600160a01b039091169063e90abb86906113d09085908590600401612a76565b600060405180830381600087803b1580156113ea57600080fd5b505af11580156113fe573d6000803e3d6000fd5b505050505050565b6060806040519050602083018101604052828152828460208301873c949350505050565b3b90565b6000606073ffffffffffffffffffffffffffffffffffff0000841673deaddeaddeaddeaddeaddeaddeaddeaddead0000141561147d5750506040805160208101909152600081526001906114b6565b60006064856001600160a01b03161061149e5761149985611198565b6114a0565b845b90506114b08787838760006119b9565b92509250505b94509492505050565b80516009556020810151600a5560a0810151600c5560408101516008805460ff1916600183818111156114ee57fe5b02179055506060810151600d80546001600160a01b0319166001600160a01b03909216919091179055600554600b5560a081015161152b90611ef1565b60115550565b60008060ff60f81b85848680519060200120604051602001611556949392919061297b565b6040516020818303038152906040528051906020012090506107c9816119b6565b60007fdefa017defa017defa017defa017defa017defa017defa017defa017defa017d826020015114156115ad5750600061051f565b6115bf8260a001518360400151611f04565b6115cb5750600061051f565b506001919050565b600d80546001600160a01b031990811673defa017defa017defa017defa017defa017defa09081179092557fdefa017defa017defa017defa017defa017defa017defa017defa017defa017d6009819055600a819055600b819055600c8190556008805460ff191690556010819055600e8054831684179055600f8054831690931760ff60a01b1916909255601191909155600280549091169055565b6060816040516024016116839190612b0d565b60408051601f198184030181529190526020810180516001600160e01b031662461bcd60e51b1790529050919050565b6175305a10156116c7576116c76000610ed6565b600254604051630ad2267960e01b81526001600160a01b0390911690630ad22679906116f99085908590600401612a76565b60206040518083038186803b15801561171157600080fd5b505afa158015611725573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061174991906125c1565b611757576117576003610ed6565b600254604051632bcdee1960e21b81526000916001600160a01b03169063af37b8649061178a9086908690600401612a76565b602060405180830381600087803b1580156117a457600080fd5b505af11580156117b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117dc91906125c1565b905080610df257610df2614e20611f34565b6175305a1015611802576118026000610ed6565b60025460405163c8e40fbf60e01b81526001600160a01b039091169063c8e40fbf90611832908490600401612a3e565b60206040518083038186803b15801561184a57600080fd5b505afa15801561185e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061188291906125c1565b611890576118906003610ed6565b600254604051633ecdecc760e21b81526000916001600160a01b03169063fb37b31c906118c1908590600401612a3e565b602060405180830381600087803b1580156118db57600080fd5b505af11580156118ef573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061191391906125c1565b90508061082557610825617530606461192e61083786611198565b0201611f34565b606061051c8260405160200161194b919061295e565b604051602081830303815290604052611f54565b606061051c61196d83611fa6565b611f54565b6060600061197f836120aa565b905061198d815160c06121aa565b8160405160200161199f9291906129d0565b604051602081830303815290604052915050919050565b90565b6040805160608082018352600e546001600160a01b039081168352600f549081166020840152600160a01b900460ff1615159282019290925260009190611a0081896122fa565b6011546000611a0e89611ef1565b60118190559050600060608715611aca57604051309063fcb6829b60e01b90611a3f908e908d908f90602401612c08565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909416939093179092529051611a7d91906129b4565b6000604051808303816000865af19150503d8060008114611aba576040519150601f19603f3d011682016040523d82523d6000602084013e611abf565b606091505b509092509050611b2d565b896001600160a01b03168b8a604051611ae391906129b4565b60006040518083038160008787f1925050503d8060008114611b21576040519150601f19603f3d011682016040523d82523d6000602084013e611b26565b606091505b5090925090505b611b378c866122fa565b60115482611c0f57600080600080611b4e866123ae565b929650909450925090506003846007811115611b6657fe5b1415611b7557611b7584610ed6565b6001846007811115611b8357fe5b1480611b9a57506004846007811115611b9857fe5b145b80611bb057506006846007811115611bae57fe5b145b80611bc657506007846007811115611bc457fe5b145b15611bd15760108290555b6001846007811115611bdf57fe5b1480611be857508c5b15611bf557809550611c08565b6040518060200160405280600081525095505b5090925050505b90920390920360115590999098509650505050505050565b611c3182826116b3565b60025460405163af3dc01160e01b81526000916001600160a01b03169063af3dc01190611c649086908690600401612a76565b602060405180830381600087803b158015611c7e57600080fd5b505af1158015611c92573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cb691906125c1565b905080610df257611cc683611de2565b600260009054906101000a90046001600160a01b03166001600160a01b031663c3fd9b256040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611d1657600080fd5b505af1158015611d2a573d6000803e3d6000fd5b50505050610df2614e20611f34565b60606000836007811115611d4957fe5b1415611d645750604080516020810190915260008152610bdb565b6003836007811115611d7257fe5b1415611db057604080516020808201835260008083529251611d9a9387939092839201612b34565b6040516020818303038152906040529050610bdb565b601154601054604051611dcb92869290918690602001612b70565b604051602081830303815290604052905092915050565b611deb816117ee565b60025460405163011b1f7960e41b81526000916001600160a01b0316906311b1f79090611e1c908590600401612a3e565b602060405180830381600087803b158015611e3657600080fd5b505af1158015611e4a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e6e91906125c1565b90508061082557600260009054906101000a90046001600160a01b03166001600160a01b03166333f943056040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611ec557600080fd5b505af1158015611ed9573d6000803e3d6000fd5b50505050610825617530606461192e61083786611198565b60005a8210611f00575a61051c565b5090565b600454600090831115611f1957506000610bdb565b600354831015611f2b57506000610bdb565b50600192915050565b601154811115611f4857611f486002610ed6565b60118054919091039055565b60608082516001148015611f7c5750608083600081518110611f7257fe5b016020015160f81c105b15611f8857508161051c565b611f94835160806121aa565b83604051602001611dcb9291906129d0565b6060600082604051602001611fbb9190612a35565b604051602081830303815290604052905060005b602081101561200557818181518110611fe457fe5b01602001516001600160f81b03191615611ffd57612005565b600101611fcf565b6000816020036001600160401b038111801561202057600080fd5b506040519080825280601f01601f19166020018201604052801561204b576020820181803683370190505b50905060005b81518110156120a157835160018401938591811061206b57fe5b602001015160f81c60f81b82828151811061208257fe5b60200101906001600160f81b031916908160001a905350600101612051565b50949350505050565b60608151600014156120cb575060408051600081526020810190915261051f565b6000805b83518110156120fe578381815181106120e457fe5b6020026020010151518201915080806001019150506120cf565b6000826001600160401b038111801561211657600080fd5b506040519080825280601f01601f191660200182016040528015612141576020820181803683370190505b50600092509050602081015b85518310156120a157600086848151811061216457fe5b60200260200101519050600060208201905061218283828451612401565b87858151811061218e57fe5b602002602001015151830192505050828060010193505061214d565b6060806038841015612204576040805160018082528183019092529060208201818036833701905050905082840160f81b816000815181106121e857fe5b60200101906001600160f81b031916908160001a905350610bd8565b600060015b80868161221257fe5b04156122275760019091019061010002612209565b816001016001600160401b038111801561224057600080fd5b506040519080825280601f01601f19166020018201604052801561226b576020820181803683370190505b50925084820160370160f81b8360008151811061228457fe5b60200101906001600160f81b031916908160001a905350600190505b8181116122f0576101008183036101000a87816122b957fe5b04816122c157fe5b0660f81b8382815181106122d157fe5b60200101906001600160f81b031916908160001a9053506001016122a0565b5050905092915050565b805182516001600160a01b03908116911614612332578051600e80546001600160a01b0319166001600160a01b039092169190911790555b80602001516001600160a01b031682602001516001600160a01b031614612378576020810151600f80546001600160a01b0319166001600160a01b039092169190911790555b8060400151151582604001511515146108255760400151600f8054911515600160a01b0260ff60a01b1990921691909117905550565b600080600060608451600014156123dd57505060408051602081019091526000808252925082915081906123fa565b848060200190518101906123f191906126ef565b93509350935093505b9193509193565b8282825b60208110612424578151835260209283019290910190601f1901612405565b905182516020929092036101000a6000190180199091169116179052505050565b600061245861245384612c5c565b612c39565b905082815283838301111561246c57600080fd5b828260208301376000602084830101529392505050565b803561051f81612ca9565b600082601f83011261249e578081fd5b610bd883833560208501612445565b80356002811061051f57600080fd5b600060e082840312156124cd578081fd5b6124d760e0612c39565b905081358152602082013560208201526124f3604083016124ad565b604082015261250460608301612483565b606082015261251560808301612483565b608082015260a082013560a082015260c08201356001600160401b0381111561253d57600080fd5b6125498482850161248e565b60c08301525092915050565b600060208284031215612566578081fd5b8135610bd881612ca9565b600060208284031215612582578081fd5b8151610bd881612ca9565b6000806000606084860312156125a1578182fd5b83356125ac81612ca9565b95602085013595506040909401359392505050565b6000602082840312156125d2578081fd5b81518015158114610bd8578182fd5b6000602082840312156125f2578081fd5b5035919050565b60006020828403121561260a578081fd5b5051919050565b60008060408385031215612623578182fd5b50508035926020909101359150565b60008060008060808587031215612647578081fd5b84359350602085013560ff8116811461265e578182fd5b93969395505050506040820135916060013590565b600060208284031215612684578081fd5b81356001600160401b03811115612699578182fd5b6126a58482850161248e565b949350505050565b600080604083850312156126bf578182fd5b82356001600160401b038111156126d4578283fd5b6126e08582860161248e565b95602094909401359450505050565b60008060008060808587031215612704578182fd5b845160088110612712578283fd5b80945050602085015192506040850151915060608501516001600160401b0381111561273c578182fd5b8501601f8101871361274c578182fd5b805161275a61245382612c5c565b81815288602083850101111561276e578384fd5b61277f826020830160208601612c7d565b9598949750929550505050565b60006020828403121561279d578081fd5b81356001600160401b038111156127b2578182fd5b8201601f810184136127c2578182fd5b6126a584823560208401612445565b600080604083850312156127e3578182fd5b82356001600160401b038111156127f8578283fd5b612804858286016124bc565b925050602083013561281581612ca9565b809150509250929050565b600080600060608486031215612834578081fd5b83356001600160401b03811115612849578182fd5b612855868287016124bc565b935050602084013561286681612ca9565b9150604084013561287681612ca9565b809150509250925092565b600080600060608486031215612895578081fd5b8335925060208401356128a781612ca9565b915060408401356001600160401b038111156128c1578182fd5b6128cd8682870161248e565b9150509250925092565b6000806000606084860312156128eb578081fd5b8335925060208401356001600160401b03811115612907578182fd5b6129138682870161248e565b925050604084013561287681612ca9565b6000815180845261293c816020860160208601612c7d565b601f01601f19169290920160200192915050565b6008811061295a57fe5b9052565b60609190911b6bffffffffffffffffffffffff1916815260140190565b6001600160f81b031994909416845260609290921b6bffffffffffffffffffffffff191660018401526015830152603582015260550190565b600082516129c6818460208701612c7d565b9190910192915050565b600083516129e2818460208801612c7d565b8351908301906129f6818360208801612c7d565b01949350505050565b6c600d380380600d6000396000f360981b81528151600090612a2881600d850160208701612c7d565b91909101600d0192915050565b90815260200190565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039390931683526020830191909152604082015260600190565b6001600160a01b03831681526040602082018190526000906126a590830184612924565b60008315158252604060208301526126a56040830184612924565b93845260ff9290921660208401526040830152606082015260800190565b600060208252610bd86020830184612924565b6020810160028310612b2e57fe5b91905290565b6000612b408287612950565b60ff8516602083015260ff8416604083015260806060830152612b666080830184612924565b9695505050505050565b6000612b7c8287612950565b84602083015283604083015260806060830152612b666080830184612924565b60208082526046908201527f4f6e6c792061757468656e746963617465642061646472657373657320696e2060408201527f6f766d53746174654d616e616765722063616e2063616c6c20746869732066756060820152653731ba34b7b760d11b608082015260a00190565b600084825260606020830152612c216060830185612924565b905060018060a01b0383166040830152949350505050565b6040518181016001600160401b0381118282101715612c5457fe5b604052919050565b60006001600160401b03821115612c6f57fe5b50601f01601f191660200190565b60005b83811015612c98578181015183820152602001612c80565b838111156107995750506000910152565b6001600160a01b038116811461053e57600080fdfe5369676e61747572652070726f766964656420666f7220454f4120636f6e7472616374206372656174696f6e20697320696e76616c69642e436f6e7472616374206372656174696f6e20636f646520636f6e7461696e7320756e73616665206f70636f6465732e2044696420796f75207573652074686520726967687420636f6d70696c6572206f72207061737320616e20756e7361666520636f6e7374727563746f7220617267756d656e743f4120636f6e74726163742068617320616c7265616479206265656e206465706c6f79656420746f20746869732061646472657373436f6e7374727563746f7220617474656d7074656420746f206465706c6f7920756e736166652062797465636f64652ea2646970667358221220d8d7793db294565fc54ab1c9bb5a859a63bd13d82487c00d15922977b1ab32ed64736f6c63430007060033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101c45760003560e01c80637cebbe94116100f957806399ccd98b11610097578063bdbf8c3611610071578063bdbf8c361461037e578063c1fb2ea214610386578063fcb6829b1461038e578063ffe73914146103a1576101c4565b806399ccd98b146103505780639be3ad67146103635780639dc9dc9314610376576101c4565b806385979f76116100d357806385979f761461031a5780638bb42e151461032d5780639058025614610340578063996d79a514610348576101c4565b80637cebbe94146102de5780638435035b146102e65780638540661f146102f9576101c4565b8063299ca478116101665780635a98c361116101405780635a98c3611461029b57806373509064146102a3578063741a33eb146102ab578063746c32f1146102be576101c4565b8063299ca478146102605780632a2a7adb14610275578063461a447814610288576101c4565b80631c4712a7116101a25780631c4712a71461022857806320160f3a1461023057806322bd64c01461023857806324749d5c1461024d576101c4565b806303daa959146101c9578063101185a4146101f257806314aa2ff714610207575b600080fd5b6101dc6101d73660046125e1565b6103b4565b6040516101e99190612a35565b60405180910390f35b6101fa6103f9565b6040516101e99190612b20565b61021a610215366004612673565b610402565b6040516101e9929190612ab0565b6101dc61049a565b6101dc6104a0565b61024b610246366004612611565b6104a6565b005b6101dc61025b366004612555565b610509565b610268610524565b6040516101e99190612a3e565b61024b610283366004612673565b610533565b61026861029636600461278c565b610541565b6101dc61061d565b610268610623565b61024b6102b9366004612632565b610632565b6102d16102cc36600461258d565b61079f565b6040516101e99190612b0d565b61024b6107d2565b6101dc6102f4366004612555565b610829565b61030c610307366004612881565b61083c565b6040516101e9929190612ad4565b61030c610328366004612881565b6108b5565b61030c61033b366004612820565b610904565b6101dc6109d7565b6102686109dd565b61021a61035e3660046126ad565b6109ec565b6102d16103713660046127d1565b610a7f565b610268610be1565b6101dc610bf0565b6101dc610bf6565b61024b61039c3660046128d7565b610c0d565b61030c6103af366004612881565b610df7565b6000619c4060005a905060006103c86109dd565b90506103d48186610e48565b93505060005a82039050808310156103f157601080548483030190555b505050919050565b60085460ff1690565b600f5460009060609060ff600160a01b9091041615156001141561042a5761042a6006610ed6565b619c4060005a9050600061043c6109dd565b905061044781610eef565b600061045b8261045684610f74565b610fff565b90506104678188611090565b95509550505060005a8203905080831015610489576010805484019055610492565b60108054820190555b505050915091565b60045490565b600b5490565b600f5460ff600160a01b909104161515600114156104c8576104c86006610ed6565b61ea6060005a905060006104da6109dd565b90506104e7818686611116565b5060005a820390508083101561050257601080548483030190555b5050505050565b600061051c61051783611198565b611223565b90505b919050565b6000546001600160a01b031681565b61053e600182611227565b50565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b838110156105a1578181015183820152602001610589565b50505050905090810190601f1680156105ce5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b1580156105eb57600080fd5b505afa1580156105ff573d6000803e3d6000fd5b505050506040513d602081101561061557600080fd5b505192915050565b600a5490565b600e546001600160a01b031690565b600f5460ff600160a01b90910416151560011415610654576106546006610ed6565b600060018585601b0185856040516000815260200160405260405161067c9493929190612aef565b6020604051602081039080840390855afa15801561069e573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166106da576106da604051806060016040528060388152602001612cbf60389139610533565b6106e38161123d565b6106ed5750610799565b6106f6816112c8565b600f80546001600160a01b038381166001600160a01b031983161790925516600061075361072f6009602160991b01836102cc82610829565b60405160200161073f91906129ff565b60405160208183030381529060405261132f565b600f80546001600160a01b0319166001600160a01b038516179055905061078a838261077e81611342565b80519060200120611358565b610795836000611395565b5050505b50505050565b60606000826001146107b157826107b4565b60025b90506107c96107c286611198565b8583611406565b95945050505050565b600f5460ff600160a01b909104161515600114156107f4576107f46006610ed6565b60006107fe6109dd565b9050600061080b82610f74565b905080816001011115610825576108258282600101611395565b5050565b600061051c61083783611198565b61142a565b600060606201388060005a60408051606081018252600f546001600160a01b039081168252891660208201526001918101919091529091506108808189898961142e565b945094505060005a82039050808310156108a15760108054840190556108aa565b60108054820190555b505050935093915050565b60006060620186a060005a60408051606081018252600f5460ff600160a01b8204161515928201929092526001600160a01b03918216815290881660208201529091506108808189898961142e565b60006060331561091357600080fd5b600280546001600160a01b0319166001600160a01b038516179055610937856114bf565b600019601155600f80546001600160a01b0319166001600160a01b03868116919091179091556080860151161580156109b25760008061097a8860c00151610402565b90925090506001600160a01b03821661099b576000945092506109cf915050565b60016109a683611342565b945094505050506109cf565b6109c98660a0015187608001518860c001516108b5565b92509250505b935093915050565b60075490565b600f546001600160a01b031690565b600f5460009060609060ff600160a01b90910416151560011415610a1457610a146006610ed6565b619c4060005a90506000610a266109dd565b9050610a3181610eef565b6000610a3e828989611531565b9050610a4a8189611090565b95509550505060005a8203905080831015610a6c576010805484019055610a75565b60108054820190555b5050509250929050565b600a546060907fdefa017defa017defa017defa017defa017defa017defa017defa017defa017d14610ac05750604080516020810190915260008152610bdb565b600280546001600160a01b0319166001600160a01b038481169190911791829055604051630d15d41560e41b815291169063d15d415090610b05903390600401612a3e565b60206040518083038186803b158015610b1d57600080fd5b505afa158015610b31573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b5591906125c1565b610b7a5760405162461bcd60e51b8152600401610b7190612b9c565b60405180910390fd5b610b83836114bf565b610b8c83611577565b610bad57610b986115d3565b50604080516020810190915260008152610bdb565b6000610bcd6003600001548560a001510385608001518660c001516108b5565b915050610bd86115d3565b90505b92915050565b600d546001600160a01b031690565b60095490565b6000610c08610c036109dd565b610f74565b905090565b333014610c1957610df2565b610c228161123d565b610c5157610c516005610c4c604051806060016040528060348152602001612d6d60349139611670565b611227565b6001546040516352275acd60e11b81526001600160a01b039091169063a44eb59a90610c81908590600401612b0d565b60206040518083038186803b158015610c9957600080fd5b505afa158015610cad573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cd191906125c1565b610cfb57610cfb6004610c4c6040518060a0016040528060768152602001612cf760769139611670565b610d04816112c8565b6000610d0f8361132f565b90506001600160a01b038116610d29573d6000803e3d6000fd5b6000610d3482611342565b6001546040516352275acd60e11b81529192506001600160a01b03169063a44eb59a90610d65908490600401612b0d565b60206040518083038186803b158015610d7d57600080fd5b505afa158015610d91573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610db591906125c1565b610ddf57610ddf6004610c4c604051806060016040528060308152602001612da160309139611670565b6105028383610ded85611223565b611358565b505050565b60006060619c4060005a60408051606081018252600e546001600160a01b039081168252600f549081166020830152600160a01b900460ff161515918101919091529091506108808189898961142e565b6000610e5483836116b3565b600254604051631aaf392f60e01b81526001600160a01b0390911690631aaf392f90610e869086908690600401612a76565b60206040518083038186803b158015610e9e57600080fd5b505afa158015610eb2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bd891906125f9565b61053e8160405180602001604052806000815250611227565b600080610f3e5a6002602160991b0185604051602401610f0f9190612a3e565b60408051601f198184030181529190526020810180516001600160e01b031663b1540a0160e01b1790526108b5565b91509150600081806020019051810190610f5891906125c1565b9050801580610f65575082155b15610799576107996007610ed6565b6000610f7f826117ee565b60025460405163d126199f60e01b81526001600160a01b039091169063d126199f90610faf908590600401612a3e565b60206040518083038186803b158015610fc757600080fd5b505afa158015610fdb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061051c91906125f9565b60408051600280825260608201909252600091829190816020015b606081526020019060019003908161101a57905050905061103a84611935565b8160008151811061104757fe5b602002602001018190525061105b8361195f565b8160018151811061106857fe5b6020026020010181905250600061107e82611972565b90506107c981805190602001206119b6565b600060606110b261109f6109dd565b6110aa610c036109dd565b600101611395565b60408051606081018252600f5460ff600160a01b8204161515928201929092526001600160a01b03918216815290851660208201526000806110f8835a898960016119b9565b915091508161110857600061110a565b865b97909650945050505050565b806111218484610e48565b141561112c57610df2565b6111368383611c27565b600254604051635c17d62960e01b81526001600160a01b0390911690635c17d6299061116a90869086908690600401612a8f565b600060405180830381600087803b15801561118457600080fd5b505af1158015610795573d6000803e3d6000fd5b60006111a3826117ee565b600254604051637c8ee70360e01b81526001600160a01b0390911690637c8ee703906111d3908590600401612a3e565b60206040518083038186803b1580156111eb57600080fd5b505afa1580156111ff573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061051c9190612571565b3f90565b60006112338383611d39565b9050805160208201fd5b6000611248826117ee565b6002546040516307a1294560e01b81526001600160a01b03909116906307a1294590611278908590600401612a3e565b60206040518083038186803b15801561129057600080fd5b505afa1580156112a4573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061051c91906125c1565b6112d1816117ee565b600254604051637e78a4d160e11b81526001600160a01b039091169063fcf149a290611301908490600401612a3e565b600060405180830381600087803b15801561131b57600080fd5b505af1158015610502573d6000803e3d6000fd5b6000808251602084016000f09392505050565b606061051c8260006113538561142a565b611406565b61136183611de2565b6002546040516368510af960e11b81526001600160a01b039091169063d0a215f29061116a90869086908690600401612a52565b61139e82611de2565b6002546040516374855dc360e11b81526001600160a01b039091169063e90abb86906113d09085908590600401612a76565b600060405180830381600087803b1580156113ea57600080fd5b505af11580156113fe573d6000803e3d6000fd5b505050505050565b6060806040519050602083018101604052828152828460208301873c949350505050565b3b90565b6000606073ffffffffffffffffffffffffffffffffffff0000841673deaddeaddeaddeaddeaddeaddeaddeaddead0000141561147d5750506040805160208101909152600081526001906114b6565b60006064856001600160a01b03161061149e5761149985611198565b6114a0565b845b90506114b08787838760006119b9565b92509250505b94509492505050565b80516009556020810151600a5560a0810151600c5560408101516008805460ff1916600183818111156114ee57fe5b02179055506060810151600d80546001600160a01b0319166001600160a01b03909216919091179055600554600b5560a081015161152b90611ef1565b60115550565b60008060ff60f81b85848680519060200120604051602001611556949392919061297b565b6040516020818303038152906040528051906020012090506107c9816119b6565b60007fdefa017defa017defa017defa017defa017defa017defa017defa017defa017d826020015114156115ad5750600061051f565b6115bf8260a001518360400151611f04565b6115cb5750600061051f565b506001919050565b600d80546001600160a01b031990811673defa017defa017defa017defa017defa017defa09081179092557fdefa017defa017defa017defa017defa017defa017defa017defa017defa017d6009819055600a819055600b819055600c8190556008805460ff191690556010819055600e8054831684179055600f8054831690931760ff60a01b1916909255601191909155600280549091169055565b6060816040516024016116839190612b0d565b60408051601f198184030181529190526020810180516001600160e01b031662461bcd60e51b1790529050919050565b6175305a10156116c7576116c76000610ed6565b600254604051630ad2267960e01b81526001600160a01b0390911690630ad22679906116f99085908590600401612a76565b60206040518083038186803b15801561171157600080fd5b505afa158015611725573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061174991906125c1565b611757576117576003610ed6565b600254604051632bcdee1960e21b81526000916001600160a01b03169063af37b8649061178a9086908690600401612a76565b602060405180830381600087803b1580156117a457600080fd5b505af11580156117b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117dc91906125c1565b905080610df257610df2614e20611f34565b6175305a1015611802576118026000610ed6565b60025460405163c8e40fbf60e01b81526001600160a01b039091169063c8e40fbf90611832908490600401612a3e565b60206040518083038186803b15801561184a57600080fd5b505afa15801561185e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061188291906125c1565b611890576118906003610ed6565b600254604051633ecdecc760e21b81526000916001600160a01b03169063fb37b31c906118c1908590600401612a3e565b602060405180830381600087803b1580156118db57600080fd5b505af11580156118ef573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061191391906125c1565b90508061082557610825617530606461192e61083786611198565b0201611f34565b606061051c8260405160200161194b919061295e565b604051602081830303815290604052611f54565b606061051c61196d83611fa6565b611f54565b6060600061197f836120aa565b905061198d815160c06121aa565b8160405160200161199f9291906129d0565b604051602081830303815290604052915050919050565b90565b6040805160608082018352600e546001600160a01b039081168352600f549081166020840152600160a01b900460ff1615159282019290925260009190611a0081896122fa565b6011546000611a0e89611ef1565b60118190559050600060608715611aca57604051309063fcb6829b60e01b90611a3f908e908d908f90602401612c08565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909416939093179092529051611a7d91906129b4565b6000604051808303816000865af19150503d8060008114611aba576040519150601f19603f3d011682016040523d82523d6000602084013e611abf565b606091505b509092509050611b2d565b896001600160a01b03168b8a604051611ae391906129b4565b60006040518083038160008787f1925050503d8060008114611b21576040519150601f19603f3d011682016040523d82523d6000602084013e611b26565b606091505b5090925090505b611b378c866122fa565b60115482611c0f57600080600080611b4e866123ae565b929650909450925090506003846007811115611b6657fe5b1415611b7557611b7584610ed6565b6001846007811115611b8357fe5b1480611b9a57506004846007811115611b9857fe5b145b80611bb057506006846007811115611bae57fe5b145b80611bc657506007846007811115611bc457fe5b145b15611bd15760108290555b6001846007811115611bdf57fe5b1480611be857508c5b15611bf557809550611c08565b6040518060200160405280600081525095505b5090925050505b90920390920360115590999098509650505050505050565b611c3182826116b3565b60025460405163af3dc01160e01b81526000916001600160a01b03169063af3dc01190611c649086908690600401612a76565b602060405180830381600087803b158015611c7e57600080fd5b505af1158015611c92573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cb691906125c1565b905080610df257611cc683611de2565b600260009054906101000a90046001600160a01b03166001600160a01b031663c3fd9b256040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611d1657600080fd5b505af1158015611d2a573d6000803e3d6000fd5b50505050610df2614e20611f34565b60606000836007811115611d4957fe5b1415611d645750604080516020810190915260008152610bdb565b6003836007811115611d7257fe5b1415611db057604080516020808201835260008083529251611d9a9387939092839201612b34565b6040516020818303038152906040529050610bdb565b601154601054604051611dcb92869290918690602001612b70565b604051602081830303815290604052905092915050565b611deb816117ee565b60025460405163011b1f7960e41b81526000916001600160a01b0316906311b1f79090611e1c908590600401612a3e565b602060405180830381600087803b158015611e3657600080fd5b505af1158015611e4a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e6e91906125c1565b90508061082557600260009054906101000a90046001600160a01b03166001600160a01b03166333f943056040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611ec557600080fd5b505af1158015611ed9573d6000803e3d6000fd5b50505050610825617530606461192e61083786611198565b60005a8210611f00575a61051c565b5090565b600454600090831115611f1957506000610bdb565b600354831015611f2b57506000610bdb565b50600192915050565b601154811115611f4857611f486002610ed6565b60118054919091039055565b60608082516001148015611f7c5750608083600081518110611f7257fe5b016020015160f81c105b15611f8857508161051c565b611f94835160806121aa565b83604051602001611dcb9291906129d0565b6060600082604051602001611fbb9190612a35565b604051602081830303815290604052905060005b602081101561200557818181518110611fe457fe5b01602001516001600160f81b03191615611ffd57612005565b600101611fcf565b6000816020036001600160401b038111801561202057600080fd5b506040519080825280601f01601f19166020018201604052801561204b576020820181803683370190505b50905060005b81518110156120a157835160018401938591811061206b57fe5b602001015160f81c60f81b82828151811061208257fe5b60200101906001600160f81b031916908160001a905350600101612051565b50949350505050565b60608151600014156120cb575060408051600081526020810190915261051f565b6000805b83518110156120fe578381815181106120e457fe5b6020026020010151518201915080806001019150506120cf565b6000826001600160401b038111801561211657600080fd5b506040519080825280601f01601f191660200182016040528015612141576020820181803683370190505b50600092509050602081015b85518310156120a157600086848151811061216457fe5b60200260200101519050600060208201905061218283828451612401565b87858151811061218e57fe5b602002602001015151830192505050828060010193505061214d565b6060806038841015612204576040805160018082528183019092529060208201818036833701905050905082840160f81b816000815181106121e857fe5b60200101906001600160f81b031916908160001a905350610bd8565b600060015b80868161221257fe5b04156122275760019091019061010002612209565b816001016001600160401b038111801561224057600080fd5b506040519080825280601f01601f19166020018201604052801561226b576020820181803683370190505b50925084820160370160f81b8360008151811061228457fe5b60200101906001600160f81b031916908160001a905350600190505b8181116122f0576101008183036101000a87816122b957fe5b04816122c157fe5b0660f81b8382815181106122d157fe5b60200101906001600160f81b031916908160001a9053506001016122a0565b5050905092915050565b805182516001600160a01b03908116911614612332578051600e80546001600160a01b0319166001600160a01b039092169190911790555b80602001516001600160a01b031682602001516001600160a01b031614612378576020810151600f80546001600160a01b0319166001600160a01b039092169190911790555b8060400151151582604001511515146108255760400151600f8054911515600160a01b0260ff60a01b1990921691909117905550565b600080600060608451600014156123dd57505060408051602081019091526000808252925082915081906123fa565b848060200190518101906123f191906126ef565b93509350935093505b9193509193565b8282825b60208110612424578151835260209283019290910190601f1901612405565b905182516020929092036101000a6000190180199091169116179052505050565b600061245861245384612c5c565b612c39565b905082815283838301111561246c57600080fd5b828260208301376000602084830101529392505050565b803561051f81612ca9565b600082601f83011261249e578081fd5b610bd883833560208501612445565b80356002811061051f57600080fd5b600060e082840312156124cd578081fd5b6124d760e0612c39565b905081358152602082013560208201526124f3604083016124ad565b604082015261250460608301612483565b606082015261251560808301612483565b608082015260a082013560a082015260c08201356001600160401b0381111561253d57600080fd5b6125498482850161248e565b60c08301525092915050565b600060208284031215612566578081fd5b8135610bd881612ca9565b600060208284031215612582578081fd5b8151610bd881612ca9565b6000806000606084860312156125a1578182fd5b83356125ac81612ca9565b95602085013595506040909401359392505050565b6000602082840312156125d2578081fd5b81518015158114610bd8578182fd5b6000602082840312156125f2578081fd5b5035919050565b60006020828403121561260a578081fd5b5051919050565b60008060408385031215612623578182fd5b50508035926020909101359150565b60008060008060808587031215612647578081fd5b84359350602085013560ff8116811461265e578182fd5b93969395505050506040820135916060013590565b600060208284031215612684578081fd5b81356001600160401b03811115612699578182fd5b6126a58482850161248e565b949350505050565b600080604083850312156126bf578182fd5b82356001600160401b038111156126d4578283fd5b6126e08582860161248e565b95602094909401359450505050565b60008060008060808587031215612704578182fd5b845160088110612712578283fd5b80945050602085015192506040850151915060608501516001600160401b0381111561273c578182fd5b8501601f8101871361274c578182fd5b805161275a61245382612c5c565b81815288602083850101111561276e578384fd5b61277f826020830160208601612c7d565b9598949750929550505050565b60006020828403121561279d578081fd5b81356001600160401b038111156127b2578182fd5b8201601f810184136127c2578182fd5b6126a584823560208401612445565b600080604083850312156127e3578182fd5b82356001600160401b038111156127f8578283fd5b612804858286016124bc565b925050602083013561281581612ca9565b809150509250929050565b600080600060608486031215612834578081fd5b83356001600160401b03811115612849578182fd5b612855868287016124bc565b935050602084013561286681612ca9565b9150604084013561287681612ca9565b809150509250925092565b600080600060608486031215612895578081fd5b8335925060208401356128a781612ca9565b915060408401356001600160401b038111156128c1578182fd5b6128cd8682870161248e565b9150509250925092565b6000806000606084860312156128eb578081fd5b8335925060208401356001600160401b03811115612907578182fd5b6129138682870161248e565b925050604084013561287681612ca9565b6000815180845261293c816020860160208601612c7d565b601f01601f19169290920160200192915050565b6008811061295a57fe5b9052565b60609190911b6bffffffffffffffffffffffff1916815260140190565b6001600160f81b031994909416845260609290921b6bffffffffffffffffffffffff191660018401526015830152603582015260550190565b600082516129c6818460208701612c7d565b9190910192915050565b600083516129e2818460208801612c7d565b8351908301906129f6818360208801612c7d565b01949350505050565b6c600d380380600d6000396000f360981b81528151600090612a2881600d850160208701612c7d565b91909101600d0192915050565b90815260200190565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039390931683526020830191909152604082015260600190565b6001600160a01b03831681526040602082018190526000906126a590830184612924565b60008315158252604060208301526126a56040830184612924565b93845260ff9290921660208401526040830152606082015260800190565b600060208252610bd86020830184612924565b6020810160028310612b2e57fe5b91905290565b6000612b408287612950565b60ff8516602083015260ff8416604083015260806060830152612b666080830184612924565b9695505050505050565b6000612b7c8287612950565b84602083015283604083015260806060830152612b666080830184612924565b60208082526046908201527f4f6e6c792061757468656e746963617465642061646472657373657320696e2060408201527f6f766d53746174654d616e616765722063616e2063616c6c20746869732066756060820152653731ba34b7b760d11b608082015260a00190565b600084825260606020830152612c216060830185612924565b905060018060a01b0383166040830152949350505050565b6040518181016001600160401b0381118282101715612c5457fe5b604052919050565b60006001600160401b03821115612c6f57fe5b50601f01601f191660200190565b60005b83811015612c98578181015183820152602001612c80565b838111156107995750506000910152565b6001600160a01b038116811461053e57600080fdfe5369676e61747572652070726f766964656420666f7220454f4120636f6e7472616374206372656174696f6e20697320696e76616c69642e436f6e7472616374206372656174696f6e20636f646520636f6e7461696e7320756e73616665206f70636f6465732e2044696420796f75207573652074686520726967687420636f6d70696c6572206f72207061737320616e20756e7361666520636f6e7374727563746f7220617267756d656e743f4120636f6e74726163742068617320616c7265616479206265656e206465706c6f79656420746f20746869732061646472657373436f6e7374727563746f7220617474656d7074656420746f206465706c6f7920756e736166652062797465636f64652ea2646970667358221220d8d7793db294565fc54ab1c9bb5a859a63bd13d82487c00d15922977b1ab32ed64736f6c63430007060033", + "devdoc": { + "details": "The Execution Manager (EM) is the core of our OVM implementation, and provides a sandboxed environment allowing us to execute OVM transactions deterministically on either Layer 1 or Layer 2. The EM's run() function is the first function called during the execution of any transaction on L2. For each context-dependent EVM operation the EM has a function which implements a corresponding OVM operation, which will read state from the State Manager contract. The EM relies on the Safety Checker to verify that code deployed to Layer 2 does not contain any context-dependent operations. Compiler used: solc Runtime target: EVM", + "kind": "dev", + "methods": { + "constructor": { + "params": { + "_libAddressManager": "Address of the Address Manager." + } + }, + "ovmADDRESS()": { + "returns": { + "_ADDRESS": "Active ADDRESS within the current message context." + } + }, + "ovmCALL(uint256,address,bytes)": { + "params": { + "_address": "Address of the contract to call.", + "_calldata": "Data to send along with the call.", + "_gasLimit": "Amount of gas to be passed into this call." + }, + "returns": { + "_returndata": "Data returned by the call.", + "_success": "Whether or not the call returned (rather than reverted)." + } + }, + "ovmCALLER()": { + "returns": { + "_CALLER": "Address of the CALLER within the current message context." + } + }, + "ovmCHAINID()": { + "returns": { + "_CHAINID": "Value of the chain's CHAINID within the global context." + } + }, + "ovmCREATE(bytes)": { + "params": { + "_bytecode": "Code to be used to CREATE a new contract." + }, + "returns": { + "_0": "Address of the created contract.", + "_1": "Revert data, if and only if the creation threw an exception." + } + }, + "ovmCREATE2(bytes,bytes32)": { + "params": { + "_bytecode": "Code to be used to CREATE2 a new contract.", + "_salt": "Value used to determine the contract's address." + }, + "returns": { + "_0": "Address of the created contract.", + "_1": "Revert data, if and only if the creation threw an exception." + } + }, + "ovmCREATEEOA(bytes32,uint8,bytes32,bytes32)": { + "details": "Essentially functions like ovmCREATE or ovmCREATE2, but we can bypass a lot of checks because the contract we're creating is trusted (no need to do safety checking or to handle unexpected reverts). Doesn't need to return an address because the address is assumed to be the user's actual address.", + "params": { + "_messageHash": "Hash of a message signed by some user, for verification.", + "_r": "Signature `r` parameter.", + "_s": "Signature `s` parameter.", + "_v": "Signature `v` parameter." + } + }, + "ovmDELEGATECALL(uint256,address,bytes)": { + "params": { + "_address": "Address of the contract to call.", + "_calldata": "Data to send along with the call.", + "_gasLimit": "Amount of gas to be passed into this call." + }, + "returns": { + "_returndata": "Data returned by the call.", + "_success": "Whether or not the call returned (rather than reverted)." + } + }, + "ovmEXTCODECOPY(address,uint256,uint256)": { + "params": { + "_contract": "Address of the contract to copy code from.", + "_length": "Total number of bytes to copy from the contract's code.", + "_offset": "Offset in bytes from the start of contract code to copy beyond." + }, + "returns": { + "_code": "Bytes of code copied from the requested contract." + } + }, + "ovmEXTCODEHASH(address)": { + "params": { + "_contract": "Address of the contract to query the hash of." + }, + "returns": { + "_EXTCODEHASH": "Hash of the requested contract." + } + }, + "ovmEXTCODESIZE(address)": { + "params": { + "_contract": "Address of the contract to query the size of." + }, + "returns": { + "_EXTCODESIZE": "Size of the requested contract in bytes." + } + }, + "ovmGASLIMIT()": { + "returns": { + "_GASLIMIT": "Value of the block's GASLIMIT within the transaction context." + } + }, + "ovmGETNONCE()": { + "returns": { + "_nonce": "Nonce of the current contract." + } + }, + "ovmL1QUEUEORIGIN()": { + "returns": { + "_queueOrigin": "Enum indicating the ovmL1QUEUEORIGIN within the current message context." + } + }, + "ovmL1TXORIGIN()": { + "returns": { + "_l1TxOrigin": "Address of the account which sent the tx into L2 from L1." + } + }, + "ovmNUMBER()": { + "returns": { + "_NUMBER": "Value of the NUMBER within the transaction context." + } + }, + "ovmREVERT(bytes)": { + "params": { + "_data": "Bytes data to pass along with the REVERT." + } + }, + "ovmSLOAD(bytes32)": { + "params": { + "_key": "32 byte key of the storage slot to load." + }, + "returns": { + "_value": "32 byte value of the requested storage slot." + } + }, + "ovmSSTORE(bytes32,bytes32)": { + "params": { + "_key": "32 byte key of the storage slot to set.", + "_value": "32 byte value for the storage slot." + } + }, + "ovmSTATICCALL(uint256,address,bytes)": { + "params": { + "_address": "Address of the contract to call.", + "_calldata": "Data to send along with the call.", + "_gasLimit": "Amount of gas to be passed into this call." + }, + "returns": { + "_returndata": "Data returned by the call.", + "_success": "Whether or not the call returned (rather than reverted)." + } + }, + "ovmTIMESTAMP()": { + "returns": { + "_TIMESTAMP": "Value of the TIMESTAMP within the transaction context." + } + }, + "resolve(string)": { + "params": { + "_name": "Name to resolve an address for." + }, + "returns": { + "_0": "Address associated with the given name." + } + }, + "run((uint256,uint256,uint8,address,address,uint256,bytes),address)": { + "params": { + "_ovmStateManager": "iOVM_StateManager implementation providing account state.", + "_transaction": "Transaction data to be executed." + } + }, + "safeCREATE(uint256,bytes,address)": { + "params": { + "_address": "OVM address being deployed to.", + "_creationCode": "Code to pass into CREATE for deployment.", + "_gasLimit": "Amount of gas to be passed into this creation." + } + }, + "simulateMessage((uint256,uint256,uint8,address,address,uint256,bytes),address,address)": { + "params": { + "_from": "the OVM account the simulated call should be from.", + "_transaction": "the message transaction to simulate." + } + } + }, + "title": "OVM_ExecutionManager", + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": { + "ovmADDRESS()": { + "notice": "Overrides ADDRESS." + }, + "ovmCALL(uint256,address,bytes)": { + "notice": "Overrides CALL." + }, + "ovmCALLER()": { + "notice": "Overrides CALLER." + }, + "ovmCHAINID()": { + "notice": "Overrides CHAINID." + }, + "ovmCREATE(bytes)": { + "notice": "Overrides CREATE." + }, + "ovmCREATE2(bytes,bytes32)": { + "notice": "Overrides CREATE2." + }, + "ovmCREATEEOA(bytes32,uint8,bytes32,bytes32)": { + "notice": "Creates a new EOA contract account, for account abstraction." + }, + "ovmDELEGATECALL(uint256,address,bytes)": { + "notice": "Overrides DELEGATECALL." + }, + "ovmEXTCODECOPY(address,uint256,uint256)": { + "notice": "Overrides EXTCODECOPY." + }, + "ovmEXTCODEHASH(address)": { + "notice": "Overrides EXTCODEHASH." + }, + "ovmEXTCODESIZE(address)": { + "notice": "Overrides EXTCODESIZE." + }, + "ovmGASLIMIT()": { + "notice": "Overrides GASLIMIT." + }, + "ovmGETNONCE()": { + "notice": "Retrieves the nonce of the current ovmADDRESS." + }, + "ovmINCREMENTNONCE()": { + "notice": "Bumps the nonce of the current ovmADDRESS by one." + }, + "ovmL1QUEUEORIGIN()": { + "notice": "Specifies from which source (Sequencer or Queue) this transaction originated from." + }, + "ovmL1TXORIGIN()": { + "notice": "Specifies which L1 account, if any, sent this transaction by calling enqueue()." + }, + "ovmNUMBER()": { + "notice": "Overrides NUMBER." + }, + "ovmREVERT(bytes)": { + "notice": "Overrides REVERT." + }, + "ovmSLOAD(bytes32)": { + "notice": "Overrides SLOAD." + }, + "ovmSSTORE(bytes32,bytes32)": { + "notice": "Overrides SSTORE." + }, + "ovmSTATICCALL(uint256,address,bytes)": { + "notice": "Overrides STATICCALL." + }, + "ovmTIMESTAMP()": { + "notice": "Overrides TIMESTAMP." + }, + "resolve(string)": { + "notice": "Resolves the address associated with a given name." + }, + "run((uint256,uint256,uint8,address,address,uint256,bytes),address)": { + "notice": "Starts the execution of a transaction via the OVM_ExecutionManager." + }, + "safeCREATE(uint256,bytes,address)": { + "notice": "Handles the creation-specific safety measures required for OVM contract deployment. This function sanitizes the return types for creation messages to match calls (bool, bytes), by being an external function which the EM can call, that mimics the success/fail case of the CREATE. This allows for consistent handling of both types of messages in _handleExternalMessage(). Having this step occur as a separate call frame also allows us to easily revert the contract deployment in the event that the code is unsafe." + }, + "simulateMessage((uint256,uint256,uint8,address,address,uint256,bytes),address,address)": { + "notice": "Unreachable helper function for simulating eth_calls with an OVM message context. This function will throw an exception in all cases other than when used as a custom entrypoint in L2 Geth to simulate eth_call." + } + }, + "version": 1 + }, + "storageLayout": { + "storage": [ + { + "astId": 12055, + "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", + "label": "libAddressManager", + "offset": 0, + "slot": "0", + "type": "t_contract(Lib_AddressManager)12048" + }, + { + "astId": 4430, + "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", + "label": "ovmSafetyChecker", + "offset": 0, + "slot": "1", + "type": "t_contract(iOVM_SafetyChecker)10535" + }, + { + "astId": 4432, + "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", + "label": "ovmStateManager", + "offset": 0, + "slot": "2", + "type": "t_contract(iOVM_StateManager)10767" + }, + { + "astId": 4434, + "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", + "label": "gasMeterConfig", + "offset": 0, + "slot": "3", + "type": "t_struct(GasMeterConfig)10318_storage" + }, + { + "astId": 4436, + "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", + "label": "globalContext", + "offset": 0, + "slot": "7", + "type": "t_struct(GlobalContext)10321_storage" + }, + { + "astId": 4438, + "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", + "label": "transactionContext", + "offset": 0, + "slot": "8", + "type": "t_struct(TransactionContext)10334_storage" + }, + { + "astId": 4440, + "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", + "label": "messageContext", + "offset": 0, + "slot": "14", + "type": "t_struct(MessageContext)10344_storage" + }, + { + "astId": 4442, + "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", + "label": "transactionRecord", + "offset": 0, + "slot": "16", + "type": "t_struct(TransactionRecord)10337_storage" + }, + { + "astId": 4444, + "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", + "label": "messageRecord", + "offset": 0, + "slot": "17", + "type": "t_struct(MessageRecord)10347_storage" + } + ], + "types": { + "t_address": { + "encoding": "inplace", + "label": "address", + "numberOfBytes": "20" + }, + "t_bool": { + "encoding": "inplace", + "label": "bool", + "numberOfBytes": "1" + }, + "t_contract(Lib_AddressManager)12048": { + "encoding": "inplace", + "label": "contract Lib_AddressManager", + "numberOfBytes": "20" + }, + "t_contract(iOVM_SafetyChecker)10535": { + "encoding": "inplace", + "label": "contract iOVM_SafetyChecker", + "numberOfBytes": "20" + }, + "t_contract(iOVM_StateManager)10767": { + "encoding": "inplace", + "label": "contract iOVM_StateManager", + "numberOfBytes": "20" + }, + "t_enum(QueueOrigin)11688": { + "encoding": "inplace", + "label": "enum Lib_OVMCodec.QueueOrigin", + "numberOfBytes": "1" + }, + "t_struct(GasMeterConfig)10318_storage": { + "encoding": "inplace", + "label": "struct iOVM_ExecutionManager.GasMeterConfig", + "members": [ + { + "astId": 10311, + "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", + "label": "minTransactionGasLimit", + "offset": 0, + "slot": "0", + "type": "t_uint256" + }, + { + "astId": 10313, + "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", + "label": "maxTransactionGasLimit", + "offset": 0, + "slot": "1", + "type": "t_uint256" + }, + { + "astId": 10315, + "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", + "label": "maxGasPerQueuePerEpoch", + "offset": 0, + "slot": "2", + "type": "t_uint256" + }, + { + "astId": 10317, + "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", + "label": "secondsPerEpoch", + "offset": 0, + "slot": "3", + "type": "t_uint256" + } + ], + "numberOfBytes": "128" + }, + "t_struct(GlobalContext)10321_storage": { + "encoding": "inplace", + "label": "struct iOVM_ExecutionManager.GlobalContext", + "members": [ + { + "astId": 10320, + "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", + "label": "ovmCHAINID", + "offset": 0, + "slot": "0", + "type": "t_uint256" + } + ], + "numberOfBytes": "32" + }, + "t_struct(MessageContext)10344_storage": { + "encoding": "inplace", + "label": "struct iOVM_ExecutionManager.MessageContext", + "members": [ + { + "astId": 10339, + "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", + "label": "ovmCALLER", + "offset": 0, + "slot": "0", + "type": "t_address" + }, + { + "astId": 10341, + "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", + "label": "ovmADDRESS", + "offset": 0, + "slot": "1", + "type": "t_address" + }, + { + "astId": 10343, + "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", + "label": "isStatic", + "offset": 20, + "slot": "1", + "type": "t_bool" + } + ], + "numberOfBytes": "64" + }, + "t_struct(MessageRecord)10347_storage": { + "encoding": "inplace", + "label": "struct iOVM_ExecutionManager.MessageRecord", + "members": [ + { + "astId": 10346, + "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", + "label": "nuisanceGasLeft", + "offset": 0, + "slot": "0", + "type": "t_uint256" + } + ], + "numberOfBytes": "32" + }, + "t_struct(TransactionContext)10334_storage": { + "encoding": "inplace", + "label": "struct iOVM_ExecutionManager.TransactionContext", + "members": [ + { + "astId": 10323, + "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", + "label": "ovmL1QUEUEORIGIN", + "offset": 0, + "slot": "0", + "type": "t_enum(QueueOrigin)11688" + }, + { + "astId": 10325, + "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", + "label": "ovmTIMESTAMP", + "offset": 0, + "slot": "1", + "type": "t_uint256" + }, + { + "astId": 10327, + "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", + "label": "ovmNUMBER", + "offset": 0, + "slot": "2", + "type": "t_uint256" + }, + { + "astId": 10329, + "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", + "label": "ovmGASLIMIT", + "offset": 0, + "slot": "3", + "type": "t_uint256" + }, + { + "astId": 10331, + "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", + "label": "ovmTXGASLIMIT", + "offset": 0, + "slot": "4", + "type": "t_uint256" + }, + { + "astId": 10333, + "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", + "label": "ovmL1TXORIGIN", + "offset": 0, + "slot": "5", + "type": "t_address" + } + ], + "numberOfBytes": "192" + }, + "t_struct(TransactionRecord)10337_storage": { + "encoding": "inplace", + "label": "struct iOVM_ExecutionManager.TransactionRecord", + "members": [ + { + "astId": 10336, + "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", + "label": "ovmGasRefund", + "offset": 0, + "slot": "0", + "type": "t_uint256" + } + ], + "numberOfBytes": "32" + }, + "t_uint256": { + "encoding": "inplace", + "label": "uint256", + "numberOfBytes": "32" + } + } + } +} \ No newline at end of file diff --git a/packages/contracts/deployments/goerli-v3/OVM_FraudVerifier.json b/packages/contracts/deployments/goerli-v3/OVM_FraudVerifier.json new file mode 100644 index 0000000000000..7cd7890026ec0 --- /dev/null +++ b/packages/contracts/deployments/goerli-v3/OVM_FraudVerifier.json @@ -0,0 +1,576 @@ +{ + "address": "0xfA590cE7fE1d80D4b286e23f3f6e9f9357D6A90b", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_libAddressManager", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes32", + "name": "_preStateRoot", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_preStateRootIndex", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "_transactionHash", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "address", + "name": "_who", + "type": "address" + } + ], + "name": "FraudProofFinalized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes32", + "name": "_preStateRoot", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_preStateRootIndex", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "_transactionHash", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "address", + "name": "_who", + "type": "address" + } + ], + "name": "FraudProofInitialized", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_preStateRoot", + "type": "bytes32" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "batchIndex", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "batchRoot", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "batchSize", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "prevTotalElements", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "extraData", + "type": "bytes" + } + ], + "internalType": "struct Lib_OVMCodec.ChainBatchHeader", + "name": "_preStateRootBatchHeader", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + }, + { + "internalType": "bytes32[]", + "name": "siblings", + "type": "bytes32[]" + } + ], + "internalType": "struct Lib_OVMCodec.ChainInclusionProof", + "name": "_preStateRootProof", + "type": "tuple" + }, + { + "internalType": "bytes32", + "name": "_txHash", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "_postStateRoot", + "type": "bytes32" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "batchIndex", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "batchRoot", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "batchSize", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "prevTotalElements", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "extraData", + "type": "bytes" + } + ], + "internalType": "struct Lib_OVMCodec.ChainBatchHeader", + "name": "_postStateRootBatchHeader", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + }, + { + "internalType": "bytes32[]", + "name": "siblings", + "type": "bytes32[]" + } + ], + "internalType": "struct Lib_OVMCodec.ChainInclusionProof", + "name": "_postStateRootProof", + "type": "tuple" + } + ], + "name": "finalizeFraudVerification", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_preStateRoot", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "_txHash", + "type": "bytes32" + } + ], + "name": "getStateTransitioner", + "outputs": [ + { + "internalType": "contract iOVM_StateTransitioner", + "name": "_transitioner", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_preStateRoot", + "type": "bytes32" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "batchIndex", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "batchRoot", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "batchSize", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "prevTotalElements", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "extraData", + "type": "bytes" + } + ], + "internalType": "struct Lib_OVMCodec.ChainBatchHeader", + "name": "_preStateRootBatchHeader", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + }, + { + "internalType": "bytes32[]", + "name": "siblings", + "type": "bytes32[]" + } + ], + "internalType": "struct Lib_OVMCodec.ChainInclusionProof", + "name": "_preStateRootProof", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "timestamp", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "blockNumber", + "type": "uint256" + }, + { + "internalType": "enum Lib_OVMCodec.QueueOrigin", + "name": "l1QueueOrigin", + "type": "uint8" + }, + { + "internalType": "address", + "name": "l1TxOrigin", + "type": "address" + }, + { + "internalType": "address", + "name": "entrypoint", + "type": "address" + }, + { + "internalType": "uint256", + "name": "gasLimit", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "internalType": "struct Lib_OVMCodec.Transaction", + "name": "_transaction", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "bool", + "name": "isSequenced", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "queueIndex", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "timestamp", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "blockNumber", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "txData", + "type": "bytes" + } + ], + "internalType": "struct Lib_OVMCodec.TransactionChainElement", + "name": "_txChainElement", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "batchIndex", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "batchRoot", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "batchSize", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "prevTotalElements", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "extraData", + "type": "bytes" + } + ], + "internalType": "struct Lib_OVMCodec.ChainBatchHeader", + "name": "_transactionBatchHeader", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + }, + { + "internalType": "bytes32[]", + "name": "siblings", + "type": "bytes32[]" + } + ], + "internalType": "struct Lib_OVMCodec.ChainInclusionProof", + "name": "_transactionProof", + "type": "tuple" + } + ], + "name": "initializeFraudVerification", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "libAddressManager", + "outputs": [ + { + "internalType": "contract Lib_AddressManager", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "_name", + "type": "string" + } + ], + "name": "resolve", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "transactionHash": "0x189c405d4c429a074b507c5110b14ce1d2397becac20fad4a768c3def9c0ccd7", + "receipt": { + "to": null, + "from": "0x4107438C1b1579f258AF9d1AC06194C4a0F55040", + "contractAddress": "0xfA590cE7fE1d80D4b286e23f3f6e9f9357D6A90b", + "transactionIndex": 0, + "gasUsed": "1386998", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0x36e6b6bab1d2fceb4b01f6fb56cbe0fe566f9d3cbcc66d80bf6072e3be43033a", + "transactionHash": "0x189c405d4c429a074b507c5110b14ce1d2397becac20fad4a768c3def9c0ccd7", + "logs": [], + "blockNumber": 4694114, + "cumulativeGasUsed": "1386998", + "status": 1, + "byzantium": true + }, + "args": [ + "0xE3d08F0D900A2D53cB794cf82d7127764BcC3092" + ], + "solcInputHash": "dde656dd41f49cad9eac9bc7065fd6a7", + "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"_preStateRoot\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_preStateRootIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"_transactionHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_who\",\"type\":\"address\"}],\"name\":\"FraudProofFinalized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"_preStateRoot\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_preStateRootIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"_transactionHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_who\",\"type\":\"address\"}],\"name\":\"FraudProofInitialized\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_preStateRoot\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"_preStateRootBatchHeader\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"siblings\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct Lib_OVMCodec.ChainInclusionProof\",\"name\":\"_preStateRootProof\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"_txHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"_postStateRoot\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"_postStateRootBatchHeader\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"siblings\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct Lib_OVMCodec.ChainInclusionProof\",\"name\":\"_postStateRootProof\",\"type\":\"tuple\"}],\"name\":\"finalizeFraudVerification\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_preStateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"_txHash\",\"type\":\"bytes32\"}],\"name\":\"getStateTransitioner\",\"outputs\":[{\"internalType\":\"contract iOVM_StateTransitioner\",\"name\":\"_transitioner\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_preStateRoot\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"_preStateRootBatchHeader\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"siblings\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct Lib_OVMCodec.ChainInclusionProof\",\"name\":\"_preStateRootProof\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"enum Lib_OVMCodec.QueueOrigin\",\"name\":\"l1QueueOrigin\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"l1TxOrigin\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"entrypoint\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.Transaction\",\"name\":\"_transaction\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isSequenced\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"queueIndex\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"txData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.TransactionChainElement\",\"name\":\"_txChainElement\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"_transactionBatchHeader\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"siblings\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct Lib_OVMCodec.ChainInclusionProof\",\"name\":\"_transactionProof\",\"type\":\"tuple\"}],\"name\":\"initializeFraudVerification\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The Fraud Verifier contract coordinates the entire fraud proof verification process. If the fraud proof was successful it prunes any state batches from State Commitment Chain which were published after the fraudulent state root. Compiler used: solc Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\"}},\"finalizeFraudVerification(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes32,bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))\":{\"params\":{\"_postStateRoot\":\"State root after the fraudulent transaction.\",\"_postStateRootBatchHeader\":\"Batch header for the provided post-state root.\",\"_postStateRootProof\":\"Inclusion proof for the provided post-state root.\",\"_preStateRoot\":\"State root before the fraudulent transaction.\",\"_preStateRootBatchHeader\":\"Batch header for the provided pre-state root.\",\"_preStateRootProof\":\"Inclusion proof for the provided pre-state root.\",\"_txHash\":\"The transaction for the state root\"}},\"getStateTransitioner(bytes32,bytes32)\":{\"params\":{\"_preStateRoot\":\"State root to query a transitioner for.\"},\"returns\":{\"_transitioner\":\"Corresponding state transitioner contract.\"}},\"initializeFraudVerification(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),(uint256,uint256,uint8,address,address,uint256,bytes),(bool,uint256,uint256,uint256,bytes),(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))\":{\"params\":{\"_preStateRoot\":\"State root before the fraudulent transaction.\",\"_preStateRootBatchHeader\":\"Batch header for the provided pre-state root.\",\"_preStateRootProof\":\"Inclusion proof for the provided pre-state root.\",\"_transaction\":\"OVM transaction claimed to be fraudulent.\",\"_transactionBatchHeader\":\"Batch header for the provided transaction.\",\"_transactionProof\":\"Inclusion proof for the provided transaction.\",\"_txChainElement\":\"OVM transaction chain element.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}}},\"title\":\"OVM_FraudVerifier\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"finalizeFraudVerification(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes32,bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))\":{\"notice\":\"Finalizes the fraud verification process.\"},\"getStateTransitioner(bytes32,bytes32)\":{\"notice\":\"Retrieves the state transitioner for a given root.\"},\"initializeFraudVerification(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),(uint256,uint256,uint8,address,address,uint256,bytes),(bool,uint256,uint256,uint256,bytes),(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))\":{\"notice\":\"Begins the fraud verification process.\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/OVM/verification/OVM_FraudVerifier.sol\":\"OVM_FraudVerifier\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor () internal {\\n address msgSender = _msgSender();\\n _owner = msgSender;\\n emit OwnershipTransferred(address(0), msgSender);\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n emit OwnershipTransferred(_owner, address(0));\\n _owner = address(0);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n emit OwnershipTransferred(_owner, newOwner);\\n _owner = newOwner;\\n }\\n}\\n\",\"keccak256\":\"0x15e2d5bd4c28a88548074c54d220e8086f638a71ed07e6b3ba5a70066fcf458d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with GSN meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address payable) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes memory) {\\n this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x8d3cb350f04ff49cfb10aef08d87f19dcbaecc8027b0bed12f3275cd12f38cf0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/verification/Abs_FraudContributor.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\nimport { iOVM_BondManager } from \\\"../../iOVM/verification/iOVM_BondManager.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/// Minimal contract to be inherited by contracts consumed by users that provide\\n/// data for fraud proofs\\nabstract contract Abs_FraudContributor is Lib_AddressResolver {\\n /// Decorate your functions with this modifier to store how much total gas was\\n /// consumed by the sender, to reward users fairly\\n modifier contributesToFraudProof(bytes32 preStateRoot, bytes32 txHash) {\\n uint256 startGas = gasleft();\\n _;\\n uint256 gasSpent = startGas - gasleft();\\n iOVM_BondManager(resolve('OVM_BondManager')).recordGasSpent(preStateRoot, txHash, msg.sender, gasSpent);\\n }\\n}\\n\",\"keccak256\":\"0x6c27d089a297103cb93b30f7649ab68691cc6b948c315f1037e5de1fe9bf5903\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/verification/OVM_FraudVerifier.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_FraudVerifier } from \\\"../../iOVM/verification/iOVM_FraudVerifier.sol\\\";\\nimport { iOVM_StateTransitioner } from \\\"../../iOVM/verification/iOVM_StateTransitioner.sol\\\";\\nimport { iOVM_StateTransitionerFactory } from \\\"../../iOVM/verification/iOVM_StateTransitionerFactory.sol\\\";\\nimport { iOVM_BondManager } from \\\"../../iOVM/verification/iOVM_BondManager.sol\\\";\\nimport { iOVM_StateCommitmentChain } from \\\"../../iOVM/chain/iOVM_StateCommitmentChain.sol\\\";\\nimport { iOVM_CanonicalTransactionChain } from \\\"../../iOVM/chain/iOVM_CanonicalTransactionChain.sol\\\";\\n\\n/* Contract Imports */\\nimport { Abs_FraudContributor } from \\\"./Abs_FraudContributor.sol\\\";\\n\\n\\n\\n/**\\n * @title OVM_FraudVerifier\\n * @dev The Fraud Verifier contract coordinates the entire fraud proof verification process.\\n * If the fraud proof was successful it prunes any state batches from State Commitment Chain\\n * which were published after the fraudulent state root.\\n *\\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract OVM_FraudVerifier is Lib_AddressResolver, Abs_FraudContributor, iOVM_FraudVerifier {\\n\\n /*******************************************\\n * Contract Variables: Internal Accounting *\\n *******************************************/\\n\\n mapping (bytes32 => iOVM_StateTransitioner) internal transitioners;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n */\\n constructor(\\n address _libAddressManager\\n )\\n Lib_AddressResolver(_libAddressManager)\\n {}\\n\\n\\n /***************************************\\n * Public Functions: Transition Status *\\n ***************************************/\\n\\n /**\\n * Retrieves the state transitioner for a given root.\\n * @param _preStateRoot State root to query a transitioner for.\\n * @return _transitioner Corresponding state transitioner contract.\\n */\\n function getStateTransitioner(\\n bytes32 _preStateRoot,\\n bytes32 _txHash\\n )\\n override\\n public\\n view\\n returns (\\n iOVM_StateTransitioner _transitioner\\n )\\n {\\n return transitioners[keccak256(abi.encodePacked(_preStateRoot, _txHash))];\\n }\\n\\n\\n /****************************************\\n * Public Functions: Fraud Verification *\\n ****************************************/\\n\\n /**\\n * Begins the fraud verification process.\\n * @param _preStateRoot State root before the fraudulent transaction.\\n * @param _preStateRootBatchHeader Batch header for the provided pre-state root.\\n * @param _preStateRootProof Inclusion proof for the provided pre-state root.\\n * @param _transaction OVM transaction claimed to be fraudulent.\\n * @param _txChainElement OVM transaction chain element.\\n * @param _transactionBatchHeader Batch header for the provided transaction.\\n * @param _transactionProof Inclusion proof for the provided transaction.\\n */\\n function initializeFraudVerification(\\n bytes32 _preStateRoot,\\n Lib_OVMCodec.ChainBatchHeader memory _preStateRootBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _preStateRootProof,\\n Lib_OVMCodec.Transaction memory _transaction,\\n Lib_OVMCodec.TransactionChainElement memory _txChainElement,\\n Lib_OVMCodec.ChainBatchHeader memory _transactionBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _transactionProof\\n )\\n override\\n public\\n contributesToFraudProof(_preStateRoot, Lib_OVMCodec.hashTransaction(_transaction))\\n {\\n bytes32 _txHash = Lib_OVMCodec.hashTransaction(_transaction);\\n\\n if (_hasStateTransitioner(_preStateRoot, _txHash)) {\\n return;\\n }\\n\\n iOVM_StateCommitmentChain ovmStateCommitmentChain = iOVM_StateCommitmentChain(resolve(\\\"OVM_StateCommitmentChain\\\"));\\n iOVM_CanonicalTransactionChain ovmCanonicalTransactionChain = iOVM_CanonicalTransactionChain(resolve(\\\"OVM_CanonicalTransactionChain\\\"));\\n\\n require(\\n ovmStateCommitmentChain.verifyStateCommitment(\\n _preStateRoot,\\n _preStateRootBatchHeader,\\n _preStateRootProof\\n ),\\n \\\"Invalid pre-state root inclusion proof.\\\"\\n );\\n\\n require(\\n ovmCanonicalTransactionChain.verifyTransaction(\\n _transaction,\\n _txChainElement,\\n _transactionBatchHeader,\\n _transactionProof\\n ),\\n \\\"Invalid transaction inclusion proof.\\\"\\n );\\n\\n require (\\n _preStateRootBatchHeader.prevTotalElements + _preStateRootProof.index + 1 == _transactionBatchHeader.prevTotalElements + _transactionProof.index,\\n \\\"Pre-state root global index must equal to the transaction root global index.\\\"\\n );\\n\\n _deployTransitioner(_preStateRoot, _txHash, _preStateRootProof.index);\\n\\n emit FraudProofInitialized(\\n _preStateRoot,\\n _preStateRootProof.index,\\n _txHash,\\n msg.sender\\n );\\n }\\n\\n /**\\n * Finalizes the fraud verification process.\\n * @param _preStateRoot State root before the fraudulent transaction.\\n * @param _preStateRootBatchHeader Batch header for the provided pre-state root.\\n * @param _preStateRootProof Inclusion proof for the provided pre-state root.\\n * @param _txHash The transaction for the state root\\n * @param _postStateRoot State root after the fraudulent transaction.\\n * @param _postStateRootBatchHeader Batch header for the provided post-state root.\\n * @param _postStateRootProof Inclusion proof for the provided post-state root.\\n */\\n function finalizeFraudVerification(\\n bytes32 _preStateRoot,\\n Lib_OVMCodec.ChainBatchHeader memory _preStateRootBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _preStateRootProof,\\n bytes32 _txHash,\\n bytes32 _postStateRoot,\\n Lib_OVMCodec.ChainBatchHeader memory _postStateRootBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _postStateRootProof\\n )\\n override\\n public\\n contributesToFraudProof(_preStateRoot, _txHash)\\n {\\n iOVM_StateTransitioner transitioner = getStateTransitioner(_preStateRoot, _txHash);\\n iOVM_StateCommitmentChain ovmStateCommitmentChain = iOVM_StateCommitmentChain(resolve(\\\"OVM_StateCommitmentChain\\\"));\\n\\n require(\\n transitioner.isComplete() == true,\\n \\\"State transition process must be completed prior to finalization.\\\"\\n );\\n\\n require (\\n _postStateRootBatchHeader.prevTotalElements + _postStateRootProof.index == _preStateRootBatchHeader.prevTotalElements + _preStateRootProof.index + 1,\\n \\\"Post-state root global index must equal to the pre state root global index plus one.\\\"\\n );\\n\\n require(\\n ovmStateCommitmentChain.verifyStateCommitment(\\n _preStateRoot,\\n _preStateRootBatchHeader,\\n _preStateRootProof\\n ),\\n \\\"Invalid pre-state root inclusion proof.\\\"\\n );\\n\\n require(\\n ovmStateCommitmentChain.verifyStateCommitment(\\n _postStateRoot,\\n _postStateRootBatchHeader,\\n _postStateRootProof\\n ),\\n \\\"Invalid post-state root inclusion proof.\\\"\\n );\\n\\n // If the post state root did not match, then there was fraud and we should delete the batch\\n require(\\n _postStateRoot != transitioner.getPostStateRoot(),\\n \\\"State transition has not been proven fraudulent.\\\"\\n );\\n\\n _cancelStateTransition(_postStateRootBatchHeader, _preStateRoot);\\n\\n // TEMPORARY: Remove the transitioner; for minnet.\\n transitioners[keccak256(abi.encodePacked(_preStateRoot, _txHash))] = iOVM_StateTransitioner(0x0000000000000000000000000000000000000000);\\n\\n emit FraudProofFinalized(\\n _preStateRoot,\\n _preStateRootProof.index,\\n _txHash,\\n msg.sender\\n );\\n }\\n\\n\\n /************************************\\n * Internal Functions: Verification *\\n ************************************/\\n\\n /**\\n * Checks whether a transitioner already exists for a given pre-state root.\\n * @param _preStateRoot Pre-state root to check.\\n * @return _exists Whether or not we already have a transitioner for the root.\\n */\\n function _hasStateTransitioner(\\n bytes32 _preStateRoot,\\n bytes32 _txHash\\n )\\n internal\\n view\\n returns (\\n bool _exists\\n )\\n {\\n return address(getStateTransitioner(_preStateRoot, _txHash)) != address(0);\\n }\\n\\n /**\\n * Deploys a new state transitioner.\\n * @param _preStateRoot Pre-state root to initialize the transitioner with.\\n * @param _txHash Hash of the transaction this transitioner will execute.\\n * @param _stateTransitionIndex Index of the transaction in the chain.\\n */\\n function _deployTransitioner(\\n bytes32 _preStateRoot,\\n bytes32 _txHash,\\n uint256 _stateTransitionIndex\\n )\\n internal\\n {\\n transitioners[keccak256(abi.encodePacked(_preStateRoot, _txHash))] = iOVM_StateTransitionerFactory(\\n resolve(\\\"OVM_StateTransitionerFactory\\\")\\n ).create(\\n address(libAddressManager),\\n _stateTransitionIndex,\\n _preStateRoot,\\n _txHash\\n );\\n }\\n\\n /**\\n * Removes a state transition from the state commitment chain.\\n * @param _postStateRootBatchHeader Header for the post-state root.\\n * @param _preStateRoot Pre-state root hash.\\n */\\n function _cancelStateTransition(\\n Lib_OVMCodec.ChainBatchHeader memory _postStateRootBatchHeader,\\n bytes32 _preStateRoot\\n )\\n internal\\n {\\n iOVM_StateCommitmentChain ovmStateCommitmentChain = iOVM_StateCommitmentChain(resolve(\\\"OVM_StateCommitmentChain\\\"));\\n iOVM_BondManager ovmBondManager = iOVM_BondManager(resolve(\\\"OVM_BondManager\\\"));\\n\\n // Delete the state batch.\\n ovmStateCommitmentChain.deleteStateBatch(\\n _postStateRootBatchHeader\\n );\\n\\n // Get the timestamp and publisher for that block.\\n (uint256 timestamp, address publisher) = abi.decode(_postStateRootBatchHeader.extraData, (uint256, address));\\n\\n // Slash the bonds at the bond manager.\\n ovmBondManager.finalize(\\n _preStateRoot,\\n publisher,\\n timestamp\\n );\\n }\\n}\\n\",\"keccak256\":\"0x879cef57019254ad958a75db64f0b58eb0a6fcf74f386ed958f75384b860dd35\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_CanonicalTransactionChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_ChainStorageContainer } from \\\"./iOVM_ChainStorageContainer.sol\\\";\\n\\n/**\\n * @title iOVM_CanonicalTransactionChain\\n */\\ninterface iOVM_CanonicalTransactionChain {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event TransactionEnqueued(\\n address _l1TxOrigin,\\n address _target,\\n uint256 _gasLimit,\\n bytes _data,\\n uint256 _queueIndex,\\n uint256 _timestamp\\n );\\n\\n event QueueBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event SequencerBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event TransactionBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct BatchContext {\\n uint256 numSequencedTransactions;\\n uint256 numSubsequentQueueTransactions;\\n uint256 timestamp;\\n uint256 blockNumber;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n\\n /**\\n * Accesses the batch storage container.\\n * @return Reference to the batch storage container.\\n */\\n function batches()\\n external\\n view\\n returns (\\n iOVM_ChainStorageContainer\\n );\\n\\n /**\\n * Accesses the queue storage container.\\n * @return Reference to the queue storage container.\\n */\\n function queue()\\n external\\n view\\n returns (\\n iOVM_ChainStorageContainer\\n );\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements()\\n external\\n view\\n returns (\\n uint256 _totalElements\\n );\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches()\\n external\\n view\\n returns (\\n uint256 _totalBatches\\n );\\n\\n /**\\n * Returns the index of the next element to be enqueued.\\n * @return Index for the next queue element.\\n */\\n function getNextQueueIndex()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Gets the queue element at a particular index.\\n * @param _index Index of the queue element to access.\\n * @return _element Queue element at the given index.\\n */\\n function getQueueElement(\\n uint256 _index\\n )\\n external\\n view\\n returns (\\n Lib_OVMCodec.QueueElement memory _element\\n );\\n\\n /**\\n * Returns the timestamp of the last transaction.\\n * @return Timestamp for the last transaction.\\n */\\n function getLastTimestamp()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Returns the blocknumber of the last transaction.\\n * @return Blocknumber for the last transaction.\\n */\\n function getLastBlockNumber()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Get the number of queue elements which have not yet been included.\\n * @return Number of pending queue elements.\\n */\\n function getNumPendingQueueElements()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Retrieves the length of the queue, including\\n * both pending and canonical transactions.\\n * @return Length of the queue.\\n */\\n function getQueueLength()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n\\n /**\\n * Adds a transaction to the queue.\\n * @param _target Target contract to send the transaction to.\\n * @param _gasLimit Gas limit for the given transaction.\\n * @param _data Transaction data.\\n */\\n function enqueue(\\n address _target,\\n uint256 _gasLimit,\\n bytes memory _data\\n )\\n external;\\n\\n /**\\n * Appends a given number of queued transactions as a single batch.\\n * @param _numQueuedTransactions Number of transactions to append.\\n */\\n function appendQueueBatch(\\n uint256 _numQueuedTransactions\\n )\\n external;\\n\\n /**\\n * Allows the sequencer to append a batch of transactions.\\n * @dev This function uses a custom encoding scheme for efficiency reasons.\\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\\n * .param _contexts Array of batch contexts.\\n * .param _transactionDataFields Array of raw transaction data.\\n */\\n function appendSequencerBatch(\\n // uint40 _shouldStartAtElement,\\n // uint24 _totalElementsToAppend,\\n // BatchContext[] _contexts,\\n // bytes[] _transactionDataFields\\n )\\n external;\\n\\n /**\\n * Verifies whether a transaction is included in the chain.\\n * @param _transaction Transaction to verify.\\n * @param _txChainElement Transaction chain element corresponding to the transaction.\\n * @param _batchHeader Header of the batch the transaction was included in.\\n * @param _inclusionProof Inclusion proof for the provided transaction chain element.\\n * @return True if the transaction exists in the CTC, false if not.\\n */\\n function verifyTransaction(\\n Lib_OVMCodec.Transaction memory _transaction,\\n Lib_OVMCodec.TransactionChainElement memory _txChainElement,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _inclusionProof\\n )\\n external\\n view\\n returns (\\n bool\\n );\\n}\\n\",\"keccak256\":\"0xb5e55488a1982841c07cdf5ff475da4789596f111dd48f01b1918ee4c775cf3a\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_ChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title iOVM_ChainStorageContainer\\n */\\ninterface iOVM_ChainStorageContainer {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata()\\n external\\n view\\n returns (\\n bytes27\\n );\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length()\\n external\\n view\\n returns (\\n uint256\\n );\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(\\n bytes32 _object\\n )\\n external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(\\n bytes32 _object,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(\\n uint256 _index\\n )\\n external\\n view\\n returns (\\n bytes32\\n );\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index\\n )\\n external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Marks an index as overwritable, meaing the underlying buffer can start to write values over\\n * any objects before and including the given index.\\n */\\n function setNextOverwritableIndex(\\n uint256 _index\\n )\\n external;\\n}\\n\",\"keccak256\":\"0x2d7973a0ad84c23ec62624d3f1e3aeb198cc72686ff1e6cfa17155556b320c94\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_StateCommitmentChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title iOVM_StateCommitmentChain\\n */\\ninterface iOVM_StateCommitmentChain {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event StateBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n event StateBatchDeleted(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot\\n );\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements()\\n external\\n view\\n returns (\\n uint256 _totalElements\\n );\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches()\\n external\\n view\\n returns (\\n uint256 _totalBatches\\n );\\n\\n /**\\n * Retrieves the timestamp of the last batch submitted by the sequencer.\\n * @return _lastSequencerTimestamp Last sequencer batch timestamp.\\n */\\n function getLastSequencerTimestamp()\\n external\\n view\\n returns (\\n uint256 _lastSequencerTimestamp\\n );\\n\\n /**\\n * Appends a batch of state roots to the chain.\\n * @param _batch Batch of state roots.\\n * @param _shouldStartAtElement Index of the element at which this batch should start.\\n */\\n function appendStateBatch(\\n bytes32[] calldata _batch,\\n uint256 _shouldStartAtElement\\n )\\n external;\\n\\n /**\\n * Deletes all state roots after (and including) a given batch.\\n * @param _batchHeader Header of the batch to start deleting from.\\n */\\n function deleteStateBatch(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n external;\\n\\n /**\\n * Verifies a batch inclusion proof.\\n * @param _element Hash of the element to verify a proof for.\\n * @param _batchHeader Header of the batch in which the element was included.\\n * @param _proof Merkle inclusion proof for the element.\\n */\\n function verifyStateCommitment(\\n bytes32 _element,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _proof\\n )\\n external\\n view\\n returns (\\n bool _verified\\n );\\n\\n /**\\n * Checks whether a given batch is still inside its fraud proof window.\\n * @param _batchHeader Header of the batch to check.\\n * @return _inside Whether or not the batch is inside the fraud proof window.\\n */\\n function insideFraudProofWindow(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n external\\n view\\n returns (\\n bool _inside\\n );\\n}\\n\",\"keccak256\":\"0x6646d6ff392b81aab52a7a277e91540819464751de0af5afd1962094b2e92448\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/verification/iOVM_BondManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\ninterface ERC20 {\\n function transfer(address, uint256) external returns (bool);\\n function transferFrom(address, address, uint256) external returns (bool);\\n}\\n\\n/// All the errors which may be encountered on the bond manager\\nlibrary Errors {\\n string constant ERC20_ERR = \\\"BondManager: Could not post bond\\\";\\n string constant ALREADY_FINALIZED = \\\"BondManager: Fraud proof for this pre-state root has already been finalized\\\";\\n string constant SLASHED = \\\"BondManager: Cannot finalize withdrawal, you probably got slashed\\\";\\n string constant WRONG_STATE = \\\"BondManager: Wrong bond state for proposer\\\";\\n string constant CANNOT_CLAIM = \\\"BondManager: Cannot claim yet. Dispute must be finalized first\\\";\\n\\n string constant WITHDRAWAL_PENDING = \\\"BondManager: Withdrawal already pending\\\";\\n string constant TOO_EARLY = \\\"BondManager: Too early to finalize your withdrawal\\\";\\n\\n string constant ONLY_TRANSITIONER = \\\"BondManager: Only the transitioner for this pre-state root may call this function\\\";\\n string constant ONLY_FRAUD_VERIFIER = \\\"BondManager: Only the fraud verifier may call this function\\\";\\n string constant ONLY_STATE_COMMITMENT_CHAIN = \\\"BondManager: Only the state commitment chain may call this function\\\";\\n string constant WAIT_FOR_DISPUTES = \\\"BondManager: Wait for other potential disputes\\\";\\n}\\n\\n/**\\n * @title iOVM_BondManager\\n */\\ninterface iOVM_BondManager {\\n\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n /// The lifecycle of a proposer's bond\\n enum State {\\n // Before depositing or after getting slashed, a user is uncollateralized\\n NOT_COLLATERALIZED,\\n // After depositing, a user is collateralized\\n COLLATERALIZED,\\n // After a user has initiated a withdrawal\\n WITHDRAWING\\n }\\n\\n /// A bond posted by a proposer\\n struct Bond {\\n // The user's state\\n State state;\\n // The timestamp at which a proposer issued their withdrawal request\\n uint32 withdrawalTimestamp;\\n // The time when the first disputed was initiated for this bond\\n uint256 firstDisputeAt;\\n // The earliest observed state root for this bond which has had fraud\\n bytes32 earliestDisputedStateRoot;\\n // The state root's timestamp\\n uint256 earliestTimestamp;\\n }\\n\\n // Per pre-state root, store the number of state provisions that were made\\n // and how many of these calls were made by each user. Payouts will then be\\n // claimed by users proportionally for that dispute.\\n struct Rewards {\\n // Flag to check if rewards for a fraud proof are claimable\\n bool canClaim;\\n // Total number of `recordGasSpent` calls made\\n uint256 total;\\n // The gas spent by each user to provide witness data. The sum of all\\n // values inside this map MUST be equal to the value of `total`\\n mapping(address => uint256) gasSpent;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function recordGasSpent(\\n bytes32 _preStateRoot,\\n bytes32 _txHash,\\n address _who,\\n uint256 _gasSpent\\n ) external;\\n\\n function finalize(\\n bytes32 _preStateRoot,\\n address _publisher,\\n uint256 _timestamp\\n ) external;\\n\\n function deposit() external;\\n\\n function startWithdrawal() external;\\n\\n function finalizeWithdrawal() external;\\n\\n function claim(\\n address _who\\n ) external;\\n\\n function isCollateralized(\\n address _who\\n ) external view returns (bool);\\n\\n function getGasSpent(\\n bytes32 _preStateRoot,\\n address _who\\n ) external view returns (uint256);\\n}\\n\",\"keccak256\":\"0x3c2a8a399487857158649db1896749d86e39cba545a8aeb2e2bb0f3bdfa7a5b1\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/verification/iOVM_FraudVerifier.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_StateTransitioner } from \\\"./iOVM_StateTransitioner.sol\\\";\\n\\n/**\\n * @title iOVM_FraudVerifier\\n */\\ninterface iOVM_FraudVerifier {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event FraudProofInitialized(\\n bytes32 _preStateRoot,\\n uint256 _preStateRootIndex,\\n bytes32 _transactionHash,\\n address _who\\n );\\n\\n event FraudProofFinalized(\\n bytes32 _preStateRoot,\\n uint256 _preStateRootIndex,\\n bytes32 _transactionHash,\\n address _who\\n );\\n\\n\\n /***************************************\\n * Public Functions: Transition Status *\\n ***************************************/\\n\\n function getStateTransitioner(bytes32 _preStateRoot, bytes32 _txHash) external view returns (iOVM_StateTransitioner _transitioner);\\n\\n\\n /****************************************\\n * Public Functions: Fraud Verification *\\n ****************************************/\\n\\n function initializeFraudVerification(\\n bytes32 _preStateRoot,\\n Lib_OVMCodec.ChainBatchHeader calldata _preStateRootBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof calldata _preStateRootProof,\\n Lib_OVMCodec.Transaction calldata _transaction,\\n Lib_OVMCodec.TransactionChainElement calldata _txChainElement,\\n Lib_OVMCodec.ChainBatchHeader calldata _transactionBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof calldata _transactionProof\\n ) external;\\n\\n function finalizeFraudVerification(\\n bytes32 _preStateRoot,\\n Lib_OVMCodec.ChainBatchHeader calldata _preStateRootBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof calldata _preStateRootProof,\\n bytes32 _txHash,\\n bytes32 _postStateRoot,\\n Lib_OVMCodec.ChainBatchHeader calldata _postStateRootBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof calldata _postStateRootProof\\n ) external;\\n}\\n\",\"keccak256\":\"0x5efd7bb18164bbd3e9d58379e8203fbf2a7ee802b1a48dff3ceaaec1523b1751\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/verification/iOVM_StateTransitioner.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title iOVM_StateTransitioner\\n */\\ninterface iOVM_StateTransitioner {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AccountCommitted(\\n address _address\\n );\\n\\n event ContractStorageCommitted(\\n address _address,\\n bytes32 _key\\n );\\n\\n\\n /**********************************\\n * Public Functions: State Access *\\n **********************************/\\n\\n function getPreStateRoot() external view returns (bytes32 _preStateRoot);\\n function getPostStateRoot() external view returns (bytes32 _postStateRoot);\\n function isComplete() external view returns (bool _complete);\\n\\n\\n /***********************************\\n * Public Functions: Pre-Execution *\\n ***********************************/\\n\\n function proveContractState(\\n address _ovmContractAddress,\\n address _ethContractAddress,\\n bytes calldata _stateTrieWitness\\n ) external;\\n\\n function proveStorageSlot(\\n address _ovmContractAddress,\\n bytes32 _key,\\n bytes calldata _storageTrieWitness\\n ) external;\\n\\n\\n /*******************************\\n * Public Functions: Execution *\\n *******************************/\\n\\n function applyTransaction(\\n Lib_OVMCodec.Transaction calldata _transaction\\n ) external;\\n\\n\\n /************************************\\n * Public Functions: Post-Execution *\\n ************************************/\\n\\n function commitContractState(\\n address _ovmContractAddress,\\n bytes calldata _stateTrieWitness\\n ) external;\\n\\n function commitStorageSlot(\\n address _ovmContractAddress,\\n bytes32 _key,\\n bytes calldata _storageTrieWitness\\n ) external;\\n\\n\\n /**********************************\\n * Public Functions: Finalization *\\n **********************************/\\n\\n function completeTransition() external;\\n}\\n\",\"keccak256\":\"0x3d044ac0a3bb6ad3d529f904b3191117511f9c379678ca03010e1ebdfcb5c34b\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/verification/iOVM_StateTransitionerFactory.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Contract Imports */\\nimport { iOVM_StateTransitioner } from \\\"./iOVM_StateTransitioner.sol\\\";\\n\\n/**\\n * @title iOVM_StateTransitionerFactory\\n */\\ninterface iOVM_StateTransitionerFactory {\\n\\n /***************************************\\n * Public Functions: Contract Creation *\\n ***************************************/\\n\\n function create(\\n address _proxyManager,\\n uint256 _stateTransitionIndex,\\n bytes32 _preStateRoot,\\n bytes32 _transactionHash\\n )\\n external\\n returns (\\n iOVM_StateTransitioner _ovmStateTransitioner\\n );\\n}\\n\",\"keccak256\":\"0x60a0f0c104e4c0c7863268a93005762e8146d393f9cfddfdd6a2d6585c5911fc\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/codec/Lib_OVMCodec.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../utils/Lib_Bytes32Utils.sol\\\";\\n\\n/**\\n * @title Lib_OVMCodec\\n */\\nlibrary Lib_OVMCodec {\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum QueueOrigin {\\n SEQUENCER_QUEUE,\\n L1TOL2_QUEUE\\n }\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Account {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n address ethAddress;\\n bool isFresh;\\n }\\n\\n struct EVMAccount {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n }\\n\\n struct ChainBatchHeader {\\n uint256 batchIndex;\\n bytes32 batchRoot;\\n uint256 batchSize;\\n uint256 prevTotalElements;\\n bytes extraData;\\n }\\n\\n struct ChainInclusionProof {\\n uint256 index;\\n bytes32[] siblings;\\n }\\n\\n struct Transaction {\\n uint256 timestamp;\\n uint256 blockNumber;\\n QueueOrigin l1QueueOrigin;\\n address l1TxOrigin;\\n address entrypoint;\\n uint256 gasLimit;\\n bytes data;\\n }\\n\\n struct TransactionChainElement {\\n bool isSequenced;\\n uint256 queueIndex; // QUEUED TX ONLY\\n uint256 timestamp; // SEQUENCER TX ONLY\\n uint256 blockNumber; // SEQUENCER TX ONLY\\n bytes txData; // SEQUENCER TX ONLY\\n }\\n\\n struct QueueElement {\\n bytes32 transactionHash;\\n uint40 timestamp;\\n uint40 blockNumber;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Encodes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Encoded transaction bytes.\\n */\\n function encodeTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return abi.encodePacked(\\n _transaction.timestamp,\\n _transaction.blockNumber,\\n _transaction.l1QueueOrigin,\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n );\\n }\\n\\n /**\\n * Hashes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Hashed transaction\\n */\\n function hashTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(encodeTransaction(_transaction));\\n }\\n\\n /**\\n * Converts an OVM account to an EVM account.\\n * @param _in OVM account to convert.\\n * @return Converted EVM account.\\n */\\n function toEVMAccount(\\n Account memory _in\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n return EVMAccount({\\n nonce: _in.nonce,\\n balance: _in.balance,\\n storageRoot: _in.storageRoot,\\n codeHash: _in.codeHash\\n });\\n }\\n\\n /**\\n * @notice RLP-encodes an account state struct.\\n * @param _account Account state struct.\\n * @return RLP-encoded account state.\\n */\\n function encodeEVMAccount(\\n EVMAccount memory _account\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes[] memory raw = new bytes[](4);\\n\\n // Unfortunately we can't create this array outright because\\n // Lib_RLPWriter.writeList will reject fixed-size arrays. Assigning\\n // index-by-index circumvents this issue.\\n raw[0] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.nonce)\\n )\\n );\\n raw[1] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.balance)\\n )\\n );\\n raw[2] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.storageRoot));\\n raw[3] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.codeHash));\\n\\n return Lib_RLPWriter.writeList(raw);\\n }\\n\\n /**\\n * @notice Decodes an RLP-encoded account state into a useful struct.\\n * @param _encoded RLP-encoded account state.\\n * @return Account state struct.\\n */\\n function decodeEVMAccount(\\n bytes memory _encoded\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\\n\\n return EVMAccount({\\n nonce: Lib_RLPReader.readUint256(accountState[0]),\\n balance: Lib_RLPReader.readUint256(accountState[1]),\\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\\n });\\n }\\n\\n /**\\n * Calculates a hash for a given batch header.\\n * @param _batchHeader Header to hash.\\n * @return Hash of the header.\\n */\\n function hashBatchHeader(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(\\n abi.encode(\\n _batchHeader.batchRoot,\\n _batchHeader.batchSize,\\n _batchHeader.prevTotalElements,\\n _batchHeader.extraData\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0xd85ba2066057a2677926f484b938c7c2ef33ff3853f3b71cda252f4a54f30e05\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n public\\n onlyOwner\\n {\\n addresses[_getNameHash(_name)] = _address;\\n\\n emit AddressSet(\\n _name,\\n _address\\n );\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0x2ce671a0e004df88b136bea5a3c59d0732cea8887c8496da1d509e0200b03d7d\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(\\n address _libAddressManager\\n ) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x65981feeabff6a81783ea97d44baf988a18a86c8cb374c46fdb71819cbacc7c0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPReader.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_RLPReader\\n * @dev Adapted from \\\"RLPReader\\\" by Hamdi Allam (hamdi.allam97@gmail.com).\\n */\\nlibrary Lib_RLPReader {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 constant internal MAX_LIST_LENGTH = 32;\\n\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum RLPItemType {\\n DATA_ITEM,\\n LIST_ITEM\\n }\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct RLPItem {\\n uint256 length;\\n uint256 ptr;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts bytes to a reference to memory position and length.\\n * @param _in Input bytes to convert.\\n * @return Output memory reference.\\n */\\n function toRLPItem(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem memory\\n )\\n {\\n uint256 ptr;\\n assembly {\\n ptr := add(_in, 32)\\n }\\n\\n return RLPItem({\\n length: _in.length,\\n ptr: ptr\\n });\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n (\\n uint256 listOffset,\\n ,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.LIST_ITEM,\\n \\\"Invalid RLP list value.\\\"\\n );\\n\\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\\n // writing to the length. Since we can't know the number of RLP items without looping over\\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\\n // simply set a reasonable maximum list length and decrease the size before we finish.\\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\\n\\n uint256 itemCount = 0;\\n uint256 offset = listOffset;\\n while (offset < _in.length) {\\n require(\\n itemCount < MAX_LIST_LENGTH,\\n \\\"Provided RLP list exceeds max list length.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n ) = _decodeLength(RLPItem({\\n length: _in.length - offset,\\n ptr: _in.ptr + offset\\n }));\\n\\n out[itemCount] = RLPItem({\\n length: itemLength + itemOffset,\\n ptr: _in.ptr + offset\\n });\\n\\n itemCount += 1;\\n offset += itemOffset + itemLength;\\n }\\n\\n // Decrease the array size to match the actual item count.\\n assembly {\\n mstore(out, itemCount)\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n return readList(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes value.\\\"\\n );\\n\\n return _copy(_in.ptr, itemOffset, itemLength);\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return readBytes(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return string(readBytes(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return readString(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n require(\\n _in.length <= 33,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr + itemOffset;\\n bytes32 out;\\n assembly {\\n out := mload(ptr)\\n\\n // Shift the bytes over to match the item size.\\n if lt(itemLength, 32) {\\n out := div(out, exp(256, sub(32, itemLength)))\\n }\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return readBytes32(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return uint256(readBytes32(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return readUint256(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n require(\\n _in.length == 1,\\n \\\"Invalid RLP boolean value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 out;\\n assembly {\\n out := byte(0, mload(ptr))\\n }\\n\\n require(\\n out == 0 || out == 1,\\n \\\"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\\\"\\n );\\n\\n return out != 0;\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return readBool(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n if (_in.length == 1) {\\n return address(0);\\n }\\n\\n require(\\n _in.length == 21,\\n \\\"Invalid RLP address value.\\\"\\n );\\n\\n return address(readUint256(_in));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return readAddress(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads the raw bytes of an RLP item.\\n * @param _in RLP item to read.\\n * @return Raw RLP bytes.\\n */\\n function readRawBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in);\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Decodes the length of an RLP item.\\n * @param _in RLP item to decode.\\n * @return Offset of the encoded data.\\n * @return Length of the encoded data.\\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\\n */\\n function _decodeLength(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n uint256,\\n uint256,\\n RLPItemType\\n )\\n {\\n require(\\n _in.length > 0,\\n \\\"RLP item cannot be null.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 prefix;\\n assembly {\\n prefix := byte(0, mload(ptr))\\n }\\n\\n if (prefix <= 0x7f) {\\n // Single byte.\\n\\n return (0, 1, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xb7) {\\n // Short string.\\n\\n uint256 strLen = prefix - 0x80;\\n\\n require(\\n _in.length > strLen,\\n \\\"Invalid RLP short string.\\\"\\n );\\n\\n return (1, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xbf) {\\n // Long string.\\n uint256 lenOfStrLen = prefix - 0xb7;\\n\\n require(\\n _in.length > lenOfStrLen,\\n \\\"Invalid RLP long string length.\\\"\\n );\\n\\n uint256 strLen;\\n assembly {\\n // Pick out the string length.\\n strLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfStrLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfStrLen + strLen,\\n \\\"Invalid RLP long string.\\\"\\n );\\n\\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xf7) {\\n // Short list.\\n uint256 listLen = prefix - 0xc0;\\n\\n require(\\n _in.length > listLen,\\n \\\"Invalid RLP short list.\\\"\\n );\\n\\n return (1, listLen, RLPItemType.LIST_ITEM);\\n } else {\\n // Long list.\\n uint256 lenOfListLen = prefix - 0xf7;\\n\\n require(\\n _in.length > lenOfListLen,\\n \\\"Invalid RLP long list length.\\\"\\n );\\n\\n uint256 listLen;\\n assembly {\\n // Pick out the list length.\\n listLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfListLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfListLen + listLen,\\n \\\"Invalid RLP long list.\\\"\\n );\\n\\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\\n }\\n }\\n\\n /**\\n * Copies the bytes from a memory location.\\n * @param _src Pointer to the location to read from.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Copied bytes.\\n */\\n function _copy(\\n uint256 _src,\\n uint256 _offset,\\n uint256 _length\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out = new bytes(_length);\\n if (out.length == 0) {\\n return out;\\n }\\n\\n uint256 src = _src + _offset;\\n uint256 dest;\\n assembly {\\n dest := add(out, 32)\\n }\\n\\n // Copy over as many complete words as we can.\\n for (uint256 i = 0; i < _length / 32; i++) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n\\n src += 32;\\n dest += 32;\\n }\\n\\n // Pick out the remaining bytes.\\n uint256 mask = 256 ** (32 - (_length % 32)) - 1;\\n assembly {\\n mstore(\\n dest,\\n or(\\n and(mload(src), not(mask)),\\n and(mload(dest), mask)\\n )\\n )\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Copies an RLP item into bytes.\\n * @param _in RLP item to copy.\\n * @return Copied bytes.\\n */\\n function _copy(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in.ptr, 0, _in.length);\\n }\\n}\\n\",\"keccak256\":\"0x829174c61216dce35fdb888383b6022e0365eb7fbdc71ad79d98b108091969fe\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPWriter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/**\\n * @title Lib_RLPWriter\\n * @author Bakaoh (with modifications)\\n */\\nlibrary Lib_RLPWriter {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * RLP encodes a byte string.\\n * @param _in The byte string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded;\\n\\n if (_in.length == 1 && uint8(_in[0]) < 128) {\\n encoded = _in;\\n } else {\\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * RLP encodes a list of RLP encoded byte byte strings.\\n * @param _in The list of RLP encoded byte strings.\\n * @return The RLP encoded list of items in bytes.\\n */\\n function writeList(\\n bytes[] memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory list = _flatten(_in);\\n return abi.encodePacked(_writeLength(list.length, 192), list);\\n }\\n\\n /**\\n * RLP encodes a string.\\n * @param _in The string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeString(\\n string memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(bytes(_in));\\n }\\n\\n /**\\n * RLP encodes an address.\\n * @param _in The address to encode.\\n * @return The RLP encoded address in bytes.\\n */\\n function writeAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a bytes32 value.\\n * @param _in The bytes32 to encode.\\n * @return _out The RLP encoded bytes32 in bytes.\\n */\\n function writeBytes32(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a uint.\\n * @param _in The uint256 to encode.\\n * @return The RLP encoded uint256 in bytes.\\n */\\n function writeUint(\\n uint256 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(_toBinary(_in));\\n }\\n\\n /**\\n * RLP encodes a bool.\\n * @param _in The bool to encode.\\n * @return The RLP encoded bool in bytes.\\n */\\n function writeBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded = new bytes(1);\\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\\n return encoded;\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\\n * @param _len The length of the string or the payload.\\n * @param _offset 128 if item is string, 192 if item is list.\\n * @return RLP encoded bytes.\\n */\\n function _writeLength(\\n uint256 _len,\\n uint256 _offset\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded;\\n\\n if (_len < 56) {\\n encoded = new bytes(1);\\n encoded[0] = byte(uint8(_len) + uint8(_offset));\\n } else {\\n uint256 lenLen;\\n uint256 i = 1;\\n while (_len / i != 0) {\\n lenLen++;\\n i *= 256;\\n }\\n\\n encoded = new bytes(lenLen + 1);\\n encoded[0] = byte(uint8(lenLen) + uint8(_offset) + 55);\\n for(i = 1; i <= lenLen; i++) {\\n encoded[i] = byte(uint8((_len / (256**(lenLen-i))) % 256));\\n }\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * Encode integer in big endian binary form with no leading zeroes.\\n * @notice TODO: This should be optimized with assembly to save gas costs.\\n * @param _x The integer to encode.\\n * @return RLP encoded bytes.\\n */\\n function _toBinary(\\n uint256 _x\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory b = abi.encodePacked(_x);\\n\\n uint256 i = 0;\\n for (; i < 32; i++) {\\n if (b[i] != 0) {\\n break;\\n }\\n }\\n\\n bytes memory res = new bytes(32 - i);\\n for (uint256 j = 0; j < res.length; j++) {\\n res[j] = b[i++];\\n }\\n\\n return res;\\n }\\n\\n /**\\n * Copies a piece of memory to another location.\\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\\n * @param _dest Destination location.\\n * @param _src Source location.\\n * @param _len Length of memory to copy.\\n */\\n function _memcpy(\\n uint256 _dest,\\n uint256 _src,\\n uint256 _len\\n )\\n private\\n pure\\n {\\n uint256 dest = _dest;\\n uint256 src = _src;\\n uint256 len = _len;\\n\\n for(; len >= 32; len -= 32) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n dest += 32;\\n src += 32;\\n }\\n\\n uint256 mask = 256 ** (32 - len) - 1;\\n assembly {\\n let srcpart := and(mload(src), not(mask))\\n let destpart := and(mload(dest), mask)\\n mstore(dest, or(destpart, srcpart))\\n }\\n }\\n\\n /**\\n * Flattens a list of byte strings into one byte string.\\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\\n * @param _list List of byte strings to flatten.\\n * @return The flattened byte string.\\n */\\n function _flatten(\\n bytes[] memory _list\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n if (_list.length == 0) {\\n return new bytes(0);\\n }\\n\\n uint256 len;\\n uint256 i = 0;\\n for (; i < _list.length; i++) {\\n len += _list[i].length;\\n }\\n\\n bytes memory flattened = new bytes(len);\\n uint256 flattenedPtr;\\n assembly { flattenedPtr := add(flattened, 0x20) }\\n\\n for(i = 0; i < _list.length; i++) {\\n bytes memory item = _list[i];\\n\\n uint256 listPtr;\\n assembly { listPtr := add(item, 0x20)}\\n\\n _memcpy(flattenedPtr, listPtr, item.length);\\n flattenedPtr += _list[i].length;\\n }\\n\\n return flattened;\\n }\\n}\\n\",\"keccak256\":\"0xb60ee4b03ad372c3deff21d454ab714dd0c18ee3e6f9d45532e209fc59d5a54d\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_Bytes32Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_Byte32Utils\\n */\\nlibrary Lib_Bytes32Utils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \\\"true.\\\"\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as a boolean.\\n */\\n function toBool(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return _in != 0;\\n }\\n\\n /**\\n * Converts a boolean to a bytes32 value.\\n * @param _in Input boolean value.\\n * @return Boolean as a bytes32.\\n */\\n function fromBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in ? 1 : 0));\\n }\\n\\n /**\\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as an address.\\n */\\n function toAddress(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return address(uint160(uint256(_in)));\\n }\\n\\n /**\\n * Converts an address to a bytes32.\\n * @param _in Input address value.\\n * @return Address as a bytes32.\\n */\\n function fromAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in));\\n }\\n\\n /**\\n * Removes the leading zeros from a bytes32 value and returns a new (smaller) bytes value.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 without any leading zeros.\\n */\\n function removeLeadingZeros(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out;\\n\\n assembly {\\n // Figure out how many leading zero bytes to remove.\\n let shift := 0\\n for { let i := 0 } and(lt(i, 32), eq(byte(i, _in), 0)) { i := add(i, 1) } {\\n shift := add(shift, 1)\\n }\\n\\n // Reserve some space for our output and fix the free memory pointer.\\n out := mload(0x40)\\n mstore(0x40, add(out, 0x40))\\n\\n // Shift the value and store it into the output bytes.\\n mstore(add(out, 0x20), shl(mul(shift, 8), _in))\\n\\n // Store the new size (with leading zero bytes removed) in the output byte size.\\n mstore(out, sub(32, shift))\\n }\\n\\n return out;\\n }\\n}\\n\",\"keccak256\":\"0xfa2def593e3fc56a31852c3744aefdaa93cec74e721bfcfeb1e5d166c7c60b64\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_BytesUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_BytesUtils\\n */\\nlibrary Lib_BytesUtils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_start + _length >= _start, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n if (_bytes.length - _start == 0) {\\n return bytes('');\\n }\\n\\n return slice(_bytes, _start, _bytes.length - _start);\\n }\\n\\n function toBytes32PadLeft(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n bytes32 ret;\\n uint256 len = _bytes.length <= 32 ? _bytes.length : 32;\\n assembly {\\n ret := shr(mul(sub(32, len), 8), mload(add(_bytes, 32)))\\n }\\n return ret;\\n }\\n\\n function toBytes32(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n if (_bytes.length < 32) {\\n bytes32 ret;\\n assembly {\\n ret := mload(add(_bytes, 32))\\n }\\n return ret;\\n }\\n\\n return abi.decode(_bytes,(bytes32)); // will truncate if input length > 32 bytes\\n }\\n\\n function toUint256(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return uint256(toBytes32(_bytes));\\n }\\n\\n function toUint24(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n uint24\\n )\\n {\\n require(_start + 3 >= _start, \\\"toUint24_overflow\\\");\\n require(_bytes.length >= _start + 3 , \\\"toUint24_outOfBounds\\\");\\n uint24 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x3), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toUint8(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n uint8\\n )\\n {\\n require(_start + 1 >= _start, \\\"toUint8_overflow\\\");\\n require(_bytes.length >= _start + 1 , \\\"toUint8_outOfBounds\\\");\\n uint8 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x1), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toAddress(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n require(_start + 20 >= _start, \\\"toAddress_overflow\\\");\\n require(_bytes.length >= _start + 20, \\\"toAddress_outOfBounds\\\");\\n address tempAddress;\\n\\n assembly {\\n tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000)\\n }\\n\\n return tempAddress;\\n }\\n\\n function toNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory nibbles = new bytes(_bytes.length * 2);\\n\\n for (uint256 i = 0; i < _bytes.length; i++) {\\n nibbles[i * 2] = _bytes[i] >> 4;\\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\\n }\\n\\n return nibbles;\\n }\\n\\n function fromNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory ret = new bytes(_bytes.length / 2);\\n\\n for (uint256 i = 0; i < ret.length; i++) {\\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\\n }\\n\\n return ret;\\n }\\n\\n function equal(\\n bytes memory _bytes,\\n bytes memory _other\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return keccak256(_bytes) == keccak256(_other);\\n }\\n}\\n\",\"keccak256\":\"0xa5195afe32fb2cf104d156e8f4bd39df1ec79bf6ba232097b9e8e0ee14fbc298\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x608060405234801561001057600080fd5b5060405161184138038061184183398101604081905261002f91610054565b600080546001600160a01b0319166001600160a01b0392909216919091179055610082565b600060208284031215610065578081fd5b81516001600160a01b038116811461007b578182fd5b9392505050565b6117b0806100916000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c8063299ca4781461005c578063461a44781461007a57806398d8867d1461008d578063a286ba1c146100a2578063b48ec820146100b5575b600080fd5b6100646100c8565b6040516100719190611306565b60405180910390f35b610064610088366004611101565b6100d7565b6100a061009b366004611029565b6101b5565b005b6100a06100b0366004610f64565b6104f4565b6100646100c3366004610f43565b6108bb565b6000546001600160a01b031681565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b8381101561013757818101518382015260200161011f565b50505050905090810190601f1680156101645780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561018157600080fd5b505afa158015610195573d6000803e3d6000fd5b505050506040513d60208110156101ab57600080fd5b505190505b919050565b866101bf8561090a565b60005a905060006101cf8861090a565b90506101db8b82610923565b156101e65750610432565b60006102216040518060400160405280601881526020017727ab26afa9ba30ba32a1b7b6b6b4ba36b2b73a21b430b4b760411b8152506100d7565b905060006102636040518060400160405280601d81526020017f4f564d5f43616e6f6e6963616c5472616e73616374696f6e436861696e0000008152506100d7565b9050816001600160a01b0316634d69ee578e8e8e6040518463ffffffff1660e01b81526004016102959392919061135f565b60206040518083038186803b1580156102ad57600080fd5b505afa1580156102c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102e59190610f0f565b61030a5760405162461bcd60e51b8152600401610301906115e7565b60405180910390fd5b6040516326f2b4e760e11b81526001600160a01b03821690634de569ce9061033c908d908d908d908d90600401611641565b60206040518083038186803b15801561035457600080fd5b505afa158015610368573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061038c9190610f0f565b6103a85760405162461bcd60e51b815260040161030190611499565b86600001518860600151018b600001518d6060015101600101146103de5760405162461bcd60e51b815260040161030190611525565b6103ed8d848d60000151610942565b7f41a48bde2468fac6f670f39b66d7b91f311053e1f28eab9d75056546e6eaac958d8c6000015185336040516104269493929190611394565b60405180910390a15050505b60005a820390506104696040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506100d7565b6001600160a01b0316631e16e92f858533856040518563ffffffff1660e01b815260040180858152602001848152602001836001600160a01b03168152602001828152602001945050505050600060405180830381600087803b1580156104cf57600080fd5b505af11580156104e3573d6000803e3d6000fd5b505050505050505050505050505050565b868460005a905060006105078b896108bb565b905060006105446040518060400160405280601881526020017727ab26afa9ba30ba32a1b7b6b6b4ba36b2b73a21b430b4b760411b8152506100d7565b9050816001600160a01b031663b2fa1c9e6040518163ffffffff1660e01b815260040160206040518083038186803b15801561057f57600080fd5b505afa158015610593573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b79190610f0f565b15156001146105d85760405162461bcd60e51b8152600401610301906113b8565b89600001518b606001510160010186600001518860600151011461060e5760405162461bcd60e51b81526004016103019061141f565b604051634d69ee5760e01b81526001600160a01b03821690634d69ee579061063e908f908f908f9060040161135f565b60206040518083038186803b15801561065657600080fd5b505afa15801561066a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061068e9190610f0f565b6106aa5760405162461bcd60e51b8152600401610301906115e7565b604051634d69ee5760e01b81526001600160a01b03821690634d69ee57906106da908b908b908b9060040161135f565b60206040518083038186803b1580156106f257600080fd5b505afa158015610706573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061072a9190610f0f565b6107465760405162461bcd60e51b8152600401610301906114dd565b816001600160a01b031663c1c618b86040518163ffffffff1660e01b815260040160206040518083038186803b15801561077f57600080fd5b505afa158015610793573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107b79190610f2b565b8814156107d65760405162461bcd60e51b815260040161030190611597565b6107e0878d610a6d565b6000600160008e8c6040516020016107f9929190611289565b60405160208183030381529060405280519060200120815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b031602179055507f1e5fff3c23daf51ea67aaa3bbc738bcedaa98be5a5503f0e63a336a004b075b18c8b600001518b3360405161087a9493929190611394565b60405180910390a1505060005a820390506104696040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506100d7565b60006001600084846040516020016108d4929190611289565b60408051808303601f19018152918152815160209283012083529082019290925201600020546001600160a01b03169392505050565b600061091582610bc7565b805190602001209050919050565b60008061093084846108bb565b6001600160a01b031614159392505050565b6109806040518060400160405280601c81526020017f4f564d5f53746174655472616e736974696f6e6572466163746f7279000000008152506100d7565b600054604051631168a38160e11b81526001600160a01b03928316926322d14702926109b79291169085908890889060040161131a565b602060405180830381600087803b1580156109d157600080fd5b505af11580156109e5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a0991906110e5565b600160008585604051602001610a20929190611289565b60405160208183030381529060405280519060200120815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b03160217905550505050565b6000610aa86040518060400160405280601881526020017727ab26afa9ba30ba32a1b7b6b6b4ba36b2b73a21b430b4b760411b8152506100d7565b90506000610adc6040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506100d7565b604051632e38626b60e21b81529091506001600160a01b0383169063b8e189ac90610b0b90879060040161162e565b600060405180830381600087803b158015610b2557600080fd5b505af1158015610b39573d6000803e3d6000fd5b505050506000808560800151806020019051810190610b58919061114f565b60405163abfbbe1360e01b815291935091506001600160a01b0384169063abfbbe1390610b8d90889085908790600401611340565b600060405180830381600087803b158015610ba757600080fd5b505af1158015610bbb573d6000803e3d6000fd5b50505050505050505050565b6060816000015182602001518360400151846060015185608001518660a001518760c00151604051602001610c029796959493929190611297565b6040516020818303038152906040529050919050565b600067ffffffffffffffff831115610c2c57fe5b610c3f601f8401601f1916602001611700565b9050828152838383011115610c5357600080fd5b828260208301376000602084830101529392505050565b80356101b081611754565b600082601f830112610c85578081fd5b610c9483833560208501610c18565b9392505050565b8035600281106101b057600080fd5b600060a08284031215610cbb578081fd5b60405160a0810167ffffffffffffffff8282108183111715610cd957fe5b81604052829350843583526020850135602084015260408501356040840152606085013560608401526080850135915080821115610d1657600080fd5b50610d2385828601610c75565b6080830152505092915050565b600060408284031215610d41578081fd5b6040516040810167ffffffffffffffff8282108183111715610d5f57fe5b8160405282935084358352602091508185013581811115610d7f57600080fd5b8501601f81018713610d9057600080fd5b803582811115610d9c57fe5b8381029250610dac848401611700565b8181528481019083860185850187018b1015610dc757600080fd5b600095505b83861015610dea578035835260019590950194918601918601610dcc565b5080868801525050505050505092915050565b600060a08284031215610e0e578081fd5b60405160a0810167ffffffffffffffff8282108183111715610e2c57fe5b8160405282935084359150610e408261176c565b8183526020850135602084015260408501356040840152606085013560608401526080850135915080821115610d1657600080fd5b600060e08284031215610e86578081fd5b610e9060e0611700565b90508135815260208201356020820152610eac60408301610c9b565b6040820152610ebd60608301610c6a565b6060820152610ece60808301610c6a565b608082015260a082013560a082015260c082013567ffffffffffffffff811115610ef757600080fd5b610f0384828501610c75565b60c08301525092915050565b600060208284031215610f20578081fd5b8151610c948161176c565b600060208284031215610f3c578081fd5b5051919050565b60008060408385031215610f55578081fd5b50508035926020909101359150565b600080600080600080600060e0888a031215610f7e578283fd5b87359650602088013567ffffffffffffffff80821115610f9c578485fd5b610fa88b838c01610caa565b975060408a0135915080821115610fbd578485fd5b610fc98b838c01610d30565b965060608a0135955060808a0135945060a08a0135915080821115610fec578384fd5b610ff88b838c01610caa565b935060c08a013591508082111561100d578283fd5b5061101a8a828b01610d30565b91505092959891949750929550565b600080600080600080600060e0888a031215611043578081fd5b87359650602088013567ffffffffffffffff80821115611061578283fd5b61106d8b838c01610caa565b975060408a0135915080821115611082578283fd5b61108e8b838c01610d30565b965060608a01359150808211156110a3578283fd5b6110af8b838c01610e75565b955060808a01359150808211156110c4578283fd5b6110d08b838c01610dfd565b945060a08a0135915080821115610fec578283fd5b6000602082840312156110f6578081fd5b8151610c9481611754565b600060208284031215611112578081fd5b813567ffffffffffffffff811115611128578182fd5b8201601f81018413611138578182fd5b61114784823560208401610c18565b949350505050565b60008060408385031215611161578182fd5b82519150602083015161117381611754565b809150509250929050565b6001600160a01b03169052565b600081518084526111a3816020860160208601611724565b601f01601f19169290920160200192915050565b600081518352602082015160208401526040820151604084015260608201516060840152608082015160a0608085015261114760a085018261118b565b6000604083018251845260208084015160408287015282815180855260608801915083830194508592505b8083101561123f578451825293830193600192909201919083019061121f565b509695505050505050565b6000815115158352602082015160208401526040820151604084015260608201516060840152608082015160a0608085015261114760a085018261118b565b918252602082015260400190565b6000888252876020830152600287106112ac57fe5b8660f81b60408301526bffffffffffffffffffffffff19808760601b166041840152808660601b1660558401525083606983015282516112f3816089850160208701611724565b9190910160890198975050505050505050565b6001600160a01b0391909116815260200190565b6001600160a01b0394909416845260208401929092526040830152606082015260800190565b9283526001600160a01b03919091166020830152604082015260600190565b60008482526060602083015261137860608301856111b7565b828103604084015261138a81856111f4565b9695505050505050565b938452602084019290925260408301526001600160a01b0316606082015260800190565b60208082526041908201527f5374617465207472616e736974696f6e2070726f63657373206d75737420626560408201527f20636f6d706c65746564207072696f7220746f2066696e616c697a6174696f6e6060820152601760f91b608082015260a00190565b60208082526054908201527f506f73742d737461746520726f6f7420676c6f62616c20696e646578206d757360408201527f7420657175616c20746f207468652070726520737461746520726f6f7420676c60608201527337b130b61034b73232bc1038363ab99037b7329760611b608082015260a00190565b60208082526024908201527f496e76616c6964207472616e73616374696f6e20696e636c7573696f6e20707260408201526337b7b31760e11b606082015260800190565b60208082526028908201527f496e76616c696420706f73742d737461746520726f6f7420696e636c7573696f6040820152673710383937b7b31760c11b606082015260800190565b6020808252604c908201527f5072652d737461746520726f6f7420676c6f62616c20696e646578206d75737460408201527f20657175616c20746f20746865207472616e73616374696f6e20726f6f74206760608201526b3637b130b61034b73232bc1760a11b608082015260a00190565b60208082526030908201527f5374617465207472616e736974696f6e20686173206e6f74206265656e20707260408201526f37bb32b710333930bab23ab632b73a1760811b606082015260800190565b60208082526027908201527f496e76616c6964207072652d737461746520726f6f7420696e636c7573696f6e60408201526610383937b7b31760c91b606082015260800190565b600060208252610c9460208301846111b7565b60006080825285516080830152602086015160a083015260408601516002811061166757fe5b60c083015260608601516001600160a01b031660e0830152608086015161169261010084018261117e565b5060a086015161012083015260c086015160e06101408401526116b961016084018261118b565b905082810360208401526116cd818761124a565b905082810360408401526116e181866111b7565b905082810360608401526116f581856111f4565b979650505050505050565b60405181810167ffffffffffffffff8111828210171561171c57fe5b604052919050565b60005b8381101561173f578181015183820152602001611727565b8381111561174e576000848401525b50505050565b6001600160a01b038116811461176957600080fd5b50565b801515811461176957600080fdfea26469706673582212205dbab94b86b7fa55149dd4efe74e8533d11e06735abd7d989856c9aa60c89c1064736f6c63430007060033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100575760003560e01c8063299ca4781461005c578063461a44781461007a57806398d8867d1461008d578063a286ba1c146100a2578063b48ec820146100b5575b600080fd5b6100646100c8565b6040516100719190611306565b60405180910390f35b610064610088366004611101565b6100d7565b6100a061009b366004611029565b6101b5565b005b6100a06100b0366004610f64565b6104f4565b6100646100c3366004610f43565b6108bb565b6000546001600160a01b031681565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b8381101561013757818101518382015260200161011f565b50505050905090810190601f1680156101645780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561018157600080fd5b505afa158015610195573d6000803e3d6000fd5b505050506040513d60208110156101ab57600080fd5b505190505b919050565b866101bf8561090a565b60005a905060006101cf8861090a565b90506101db8b82610923565b156101e65750610432565b60006102216040518060400160405280601881526020017727ab26afa9ba30ba32a1b7b6b6b4ba36b2b73a21b430b4b760411b8152506100d7565b905060006102636040518060400160405280601d81526020017f4f564d5f43616e6f6e6963616c5472616e73616374696f6e436861696e0000008152506100d7565b9050816001600160a01b0316634d69ee578e8e8e6040518463ffffffff1660e01b81526004016102959392919061135f565b60206040518083038186803b1580156102ad57600080fd5b505afa1580156102c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102e59190610f0f565b61030a5760405162461bcd60e51b8152600401610301906115e7565b60405180910390fd5b6040516326f2b4e760e11b81526001600160a01b03821690634de569ce9061033c908d908d908d908d90600401611641565b60206040518083038186803b15801561035457600080fd5b505afa158015610368573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061038c9190610f0f565b6103a85760405162461bcd60e51b815260040161030190611499565b86600001518860600151018b600001518d6060015101600101146103de5760405162461bcd60e51b815260040161030190611525565b6103ed8d848d60000151610942565b7f41a48bde2468fac6f670f39b66d7b91f311053e1f28eab9d75056546e6eaac958d8c6000015185336040516104269493929190611394565b60405180910390a15050505b60005a820390506104696040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506100d7565b6001600160a01b0316631e16e92f858533856040518563ffffffff1660e01b815260040180858152602001848152602001836001600160a01b03168152602001828152602001945050505050600060405180830381600087803b1580156104cf57600080fd5b505af11580156104e3573d6000803e3d6000fd5b505050505050505050505050505050565b868460005a905060006105078b896108bb565b905060006105446040518060400160405280601881526020017727ab26afa9ba30ba32a1b7b6b6b4ba36b2b73a21b430b4b760411b8152506100d7565b9050816001600160a01b031663b2fa1c9e6040518163ffffffff1660e01b815260040160206040518083038186803b15801561057f57600080fd5b505afa158015610593573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b79190610f0f565b15156001146105d85760405162461bcd60e51b8152600401610301906113b8565b89600001518b606001510160010186600001518860600151011461060e5760405162461bcd60e51b81526004016103019061141f565b604051634d69ee5760e01b81526001600160a01b03821690634d69ee579061063e908f908f908f9060040161135f565b60206040518083038186803b15801561065657600080fd5b505afa15801561066a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061068e9190610f0f565b6106aa5760405162461bcd60e51b8152600401610301906115e7565b604051634d69ee5760e01b81526001600160a01b03821690634d69ee57906106da908b908b908b9060040161135f565b60206040518083038186803b1580156106f257600080fd5b505afa158015610706573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061072a9190610f0f565b6107465760405162461bcd60e51b8152600401610301906114dd565b816001600160a01b031663c1c618b86040518163ffffffff1660e01b815260040160206040518083038186803b15801561077f57600080fd5b505afa158015610793573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107b79190610f2b565b8814156107d65760405162461bcd60e51b815260040161030190611597565b6107e0878d610a6d565b6000600160008e8c6040516020016107f9929190611289565b60405160208183030381529060405280519060200120815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b031602179055507f1e5fff3c23daf51ea67aaa3bbc738bcedaa98be5a5503f0e63a336a004b075b18c8b600001518b3360405161087a9493929190611394565b60405180910390a1505060005a820390506104696040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506100d7565b60006001600084846040516020016108d4929190611289565b60408051808303601f19018152918152815160209283012083529082019290925201600020546001600160a01b03169392505050565b600061091582610bc7565b805190602001209050919050565b60008061093084846108bb565b6001600160a01b031614159392505050565b6109806040518060400160405280601c81526020017f4f564d5f53746174655472616e736974696f6e6572466163746f7279000000008152506100d7565b600054604051631168a38160e11b81526001600160a01b03928316926322d14702926109b79291169085908890889060040161131a565b602060405180830381600087803b1580156109d157600080fd5b505af11580156109e5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a0991906110e5565b600160008585604051602001610a20929190611289565b60405160208183030381529060405280519060200120815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b03160217905550505050565b6000610aa86040518060400160405280601881526020017727ab26afa9ba30ba32a1b7b6b6b4ba36b2b73a21b430b4b760411b8152506100d7565b90506000610adc6040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506100d7565b604051632e38626b60e21b81529091506001600160a01b0383169063b8e189ac90610b0b90879060040161162e565b600060405180830381600087803b158015610b2557600080fd5b505af1158015610b39573d6000803e3d6000fd5b505050506000808560800151806020019051810190610b58919061114f565b60405163abfbbe1360e01b815291935091506001600160a01b0384169063abfbbe1390610b8d90889085908790600401611340565b600060405180830381600087803b158015610ba757600080fd5b505af1158015610bbb573d6000803e3d6000fd5b50505050505050505050565b6060816000015182602001518360400151846060015185608001518660a001518760c00151604051602001610c029796959493929190611297565b6040516020818303038152906040529050919050565b600067ffffffffffffffff831115610c2c57fe5b610c3f601f8401601f1916602001611700565b9050828152838383011115610c5357600080fd5b828260208301376000602084830101529392505050565b80356101b081611754565b600082601f830112610c85578081fd5b610c9483833560208501610c18565b9392505050565b8035600281106101b057600080fd5b600060a08284031215610cbb578081fd5b60405160a0810167ffffffffffffffff8282108183111715610cd957fe5b81604052829350843583526020850135602084015260408501356040840152606085013560608401526080850135915080821115610d1657600080fd5b50610d2385828601610c75565b6080830152505092915050565b600060408284031215610d41578081fd5b6040516040810167ffffffffffffffff8282108183111715610d5f57fe5b8160405282935084358352602091508185013581811115610d7f57600080fd5b8501601f81018713610d9057600080fd5b803582811115610d9c57fe5b8381029250610dac848401611700565b8181528481019083860185850187018b1015610dc757600080fd5b600095505b83861015610dea578035835260019590950194918601918601610dcc565b5080868801525050505050505092915050565b600060a08284031215610e0e578081fd5b60405160a0810167ffffffffffffffff8282108183111715610e2c57fe5b8160405282935084359150610e408261176c565b8183526020850135602084015260408501356040840152606085013560608401526080850135915080821115610d1657600080fd5b600060e08284031215610e86578081fd5b610e9060e0611700565b90508135815260208201356020820152610eac60408301610c9b565b6040820152610ebd60608301610c6a565b6060820152610ece60808301610c6a565b608082015260a082013560a082015260c082013567ffffffffffffffff811115610ef757600080fd5b610f0384828501610c75565b60c08301525092915050565b600060208284031215610f20578081fd5b8151610c948161176c565b600060208284031215610f3c578081fd5b5051919050565b60008060408385031215610f55578081fd5b50508035926020909101359150565b600080600080600080600060e0888a031215610f7e578283fd5b87359650602088013567ffffffffffffffff80821115610f9c578485fd5b610fa88b838c01610caa565b975060408a0135915080821115610fbd578485fd5b610fc98b838c01610d30565b965060608a0135955060808a0135945060a08a0135915080821115610fec578384fd5b610ff88b838c01610caa565b935060c08a013591508082111561100d578283fd5b5061101a8a828b01610d30565b91505092959891949750929550565b600080600080600080600060e0888a031215611043578081fd5b87359650602088013567ffffffffffffffff80821115611061578283fd5b61106d8b838c01610caa565b975060408a0135915080821115611082578283fd5b61108e8b838c01610d30565b965060608a01359150808211156110a3578283fd5b6110af8b838c01610e75565b955060808a01359150808211156110c4578283fd5b6110d08b838c01610dfd565b945060a08a0135915080821115610fec578283fd5b6000602082840312156110f6578081fd5b8151610c9481611754565b600060208284031215611112578081fd5b813567ffffffffffffffff811115611128578182fd5b8201601f81018413611138578182fd5b61114784823560208401610c18565b949350505050565b60008060408385031215611161578182fd5b82519150602083015161117381611754565b809150509250929050565b6001600160a01b03169052565b600081518084526111a3816020860160208601611724565b601f01601f19169290920160200192915050565b600081518352602082015160208401526040820151604084015260608201516060840152608082015160a0608085015261114760a085018261118b565b6000604083018251845260208084015160408287015282815180855260608801915083830194508592505b8083101561123f578451825293830193600192909201919083019061121f565b509695505050505050565b6000815115158352602082015160208401526040820151604084015260608201516060840152608082015160a0608085015261114760a085018261118b565b918252602082015260400190565b6000888252876020830152600287106112ac57fe5b8660f81b60408301526bffffffffffffffffffffffff19808760601b166041840152808660601b1660558401525083606983015282516112f3816089850160208701611724565b9190910160890198975050505050505050565b6001600160a01b0391909116815260200190565b6001600160a01b0394909416845260208401929092526040830152606082015260800190565b9283526001600160a01b03919091166020830152604082015260600190565b60008482526060602083015261137860608301856111b7565b828103604084015261138a81856111f4565b9695505050505050565b938452602084019290925260408301526001600160a01b0316606082015260800190565b60208082526041908201527f5374617465207472616e736974696f6e2070726f63657373206d75737420626560408201527f20636f6d706c65746564207072696f7220746f2066696e616c697a6174696f6e6060820152601760f91b608082015260a00190565b60208082526054908201527f506f73742d737461746520726f6f7420676c6f62616c20696e646578206d757360408201527f7420657175616c20746f207468652070726520737461746520726f6f7420676c60608201527337b130b61034b73232bc1038363ab99037b7329760611b608082015260a00190565b60208082526024908201527f496e76616c6964207472616e73616374696f6e20696e636c7573696f6e20707260408201526337b7b31760e11b606082015260800190565b60208082526028908201527f496e76616c696420706f73742d737461746520726f6f7420696e636c7573696f6040820152673710383937b7b31760c11b606082015260800190565b6020808252604c908201527f5072652d737461746520726f6f7420676c6f62616c20696e646578206d75737460408201527f20657175616c20746f20746865207472616e73616374696f6e20726f6f74206760608201526b3637b130b61034b73232bc1760a11b608082015260a00190565b60208082526030908201527f5374617465207472616e736974696f6e20686173206e6f74206265656e20707260408201526f37bb32b710333930bab23ab632b73a1760811b606082015260800190565b60208082526027908201527f496e76616c6964207072652d737461746520726f6f7420696e636c7573696f6e60408201526610383937b7b31760c91b606082015260800190565b600060208252610c9460208301846111b7565b60006080825285516080830152602086015160a083015260408601516002811061166757fe5b60c083015260608601516001600160a01b031660e0830152608086015161169261010084018261117e565b5060a086015161012083015260c086015160e06101408401526116b961016084018261118b565b905082810360208401526116cd818761124a565b905082810360408401526116e181866111b7565b905082810360608401526116f581856111f4565b979650505050505050565b60405181810167ffffffffffffffff8111828210171561171c57fe5b604052919050565b60005b8381101561173f578181015183820152602001611727565b8381111561174e576000848401525b50505050565b6001600160a01b038116811461176957600080fd5b50565b801515811461176957600080fdfea26469706673582212205dbab94b86b7fa55149dd4efe74e8533d11e06735abd7d989856c9aa60c89c1064736f6c63430007060033", + "devdoc": { + "details": "The Fraud Verifier contract coordinates the entire fraud proof verification process. If the fraud proof was successful it prunes any state batches from State Commitment Chain which were published after the fraudulent state root. Compiler used: solc Runtime target: EVM", + "kind": "dev", + "methods": { + "constructor": { + "params": { + "_libAddressManager": "Address of the Address Manager." + } + }, + "finalizeFraudVerification(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes32,bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))": { + "params": { + "_postStateRoot": "State root after the fraudulent transaction.", + "_postStateRootBatchHeader": "Batch header for the provided post-state root.", + "_postStateRootProof": "Inclusion proof for the provided post-state root.", + "_preStateRoot": "State root before the fraudulent transaction.", + "_preStateRootBatchHeader": "Batch header for the provided pre-state root.", + "_preStateRootProof": "Inclusion proof for the provided pre-state root.", + "_txHash": "The transaction for the state root" + } + }, + "getStateTransitioner(bytes32,bytes32)": { + "params": { + "_preStateRoot": "State root to query a transitioner for." + }, + "returns": { + "_transitioner": "Corresponding state transitioner contract." + } + }, + "initializeFraudVerification(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),(uint256,uint256,uint8,address,address,uint256,bytes),(bool,uint256,uint256,uint256,bytes),(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))": { + "params": { + "_preStateRoot": "State root before the fraudulent transaction.", + "_preStateRootBatchHeader": "Batch header for the provided pre-state root.", + "_preStateRootProof": "Inclusion proof for the provided pre-state root.", + "_transaction": "OVM transaction claimed to be fraudulent.", + "_transactionBatchHeader": "Batch header for the provided transaction.", + "_transactionProof": "Inclusion proof for the provided transaction.", + "_txChainElement": "OVM transaction chain element." + } + }, + "resolve(string)": { + "params": { + "_name": "Name to resolve an address for." + }, + "returns": { + "_0": "Address associated with the given name." + } + } + }, + "title": "OVM_FraudVerifier", + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": { + "finalizeFraudVerification(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes32,bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))": { + "notice": "Finalizes the fraud verification process." + }, + "getStateTransitioner(bytes32,bytes32)": { + "notice": "Retrieves the state transitioner for a given root." + }, + "initializeFraudVerification(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),(uint256,uint256,uint8,address,address,uint256,bytes),(bool,uint256,uint256,uint256,bytes),(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))": { + "notice": "Begins the fraud verification process." + }, + "resolve(string)": { + "notice": "Resolves the address associated with a given name." + } + }, + "version": 1 + }, + "storageLayout": { + "storage": [ + { + "astId": 12055, + "contract": "contracts/optimistic-ethereum/OVM/verification/OVM_FraudVerifier.sol:OVM_FraudVerifier", + "label": "libAddressManager", + "offset": 0, + "slot": "0", + "type": "t_contract(Lib_AddressManager)12048" + }, + { + "astId": 8646, + "contract": "contracts/optimistic-ethereum/OVM/verification/OVM_FraudVerifier.sol:OVM_FraudVerifier", + "label": "transitioners", + "offset": 0, + "slot": "1", + "type": "t_mapping(t_bytes32,t_contract(iOVM_StateTransitioner)11217)" + } + ], + "types": { + "t_bytes32": { + "encoding": "inplace", + "label": "bytes32", + "numberOfBytes": "32" + }, + "t_contract(Lib_AddressManager)12048": { + "encoding": "inplace", + "label": "contract Lib_AddressManager", + "numberOfBytes": "20" + }, + "t_contract(iOVM_StateTransitioner)11217": { + "encoding": "inplace", + "label": "contract iOVM_StateTransitioner", + "numberOfBytes": "20" + }, + "t_mapping(t_bytes32,t_contract(iOVM_StateTransitioner)11217)": { + "encoding": "mapping", + "key": "t_bytes32", + "label": "mapping(bytes32 => contract iOVM_StateTransitioner)", + "numberOfBytes": "32", + "value": "t_contract(iOVM_StateTransitioner)11217" + } + } + } +} \ No newline at end of file diff --git a/packages/contracts/deployments/goerli-v3/OVM_L1CrossDomainMessenger.json b/packages/contracts/deployments/goerli-v3/OVM_L1CrossDomainMessenger.json new file mode 100644 index 0000000000000..503ab92b97a27 --- /dev/null +++ b/packages/contracts/deployments/goerli-v3/OVM_L1CrossDomainMessenger.json @@ -0,0 +1,514 @@ +{ + "address": "0x27BdfF69C72d29493bfD2152DbE28657f8Ddd5df", + "abi": [ + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes32", + "name": "msgHash", + "type": "bytes32" + } + ], + "name": "FailedRelayedMessage", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes32", + "name": "msgHash", + "type": "bytes32" + } + ], + "name": "RelayedMessage", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes", + "name": "message", + "type": "bytes" + } + ], + "name": "SentMessage", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_libAddressManager", + "type": "address" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "libAddressManager", + "outputs": [ + { + "internalType": "contract Lib_AddressManager", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "messageNonce", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_target", + "type": "address" + }, + { + "internalType": "address", + "name": "_sender", + "type": "address" + }, + { + "internalType": "bytes", + "name": "_message", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "_messageNonce", + "type": "uint256" + }, + { + "components": [ + { + "internalType": "bytes32", + "name": "stateRoot", + "type": "bytes32" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "batchIndex", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "batchRoot", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "batchSize", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "prevTotalElements", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "extraData", + "type": "bytes" + } + ], + "internalType": "struct Lib_OVMCodec.ChainBatchHeader", + "name": "stateRootBatchHeader", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + }, + { + "internalType": "bytes32[]", + "name": "siblings", + "type": "bytes32[]" + } + ], + "internalType": "struct Lib_OVMCodec.ChainInclusionProof", + "name": "stateRootProof", + "type": "tuple" + }, + { + "internalType": "bytes", + "name": "stateTrieWitness", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "storageTrieWitness", + "type": "bytes" + } + ], + "internalType": "struct iOVM_L1CrossDomainMessenger.L2MessageInclusionProof", + "name": "_proof", + "type": "tuple" + } + ], + "name": "relayMessage", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "name": "relayedMessages", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_target", + "type": "address" + }, + { + "internalType": "address", + "name": "_sender", + "type": "address" + }, + { + "internalType": "bytes", + "name": "_message", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "_messageNonce", + "type": "uint256" + }, + { + "internalType": "uint32", + "name": "_gasLimit", + "type": "uint32" + } + ], + "name": "replayMessage", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "_name", + "type": "string" + } + ], + "name": "resolve", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_target", + "type": "address" + }, + { + "internalType": "bytes", + "name": "_message", + "type": "bytes" + }, + { + "internalType": "uint32", + "name": "_gasLimit", + "type": "uint32" + } + ], + "name": "sendMessage", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "name": "sentMessages", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "name": "successfulMessages", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "xDomainMessageSender", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "transactionHash": "0x75714a6d9ca51a7b21d8556ab605cee562224d7f13670f3b703043433f8b0ac5", + "receipt": { + "to": null, + "from": "0x4107438C1b1579f258AF9d1AC06194C4a0F55040", + "contractAddress": "0x27BdfF69C72d29493bfD2152DbE28657f8Ddd5df", + "transactionIndex": 3, + "gasUsed": "2236734", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0x10ae1fc56166e1992c7ece059bf38b711ed5a1f696335fd2f2b9dc82c3d56495", + "transactionHash": "0x75714a6d9ca51a7b21d8556ab605cee562224d7f13670f3b703043433f8b0ac5", + "logs": [], + "blockNumber": 4694106, + "cumulativeGasUsed": "3135625", + "status": 1, + "byzantium": true + }, + "args": [], + "solcInputHash": "dde656dd41f49cad9eac9bc7065fd6a7", + "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"msgHash\",\"type\":\"bytes32\"}],\"name\":\"FailedRelayedMessage\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"msgHash\",\"type\":\"bytes32\"}],\"name\":\"RelayedMessage\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"}],\"name\":\"SentMessage\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"messageNonce\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_sender\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_message\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"_messageNonce\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"stateRootBatchHeader\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"siblings\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct Lib_OVMCodec.ChainInclusionProof\",\"name\":\"stateRootProof\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"stateTrieWitness\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"storageTrieWitness\",\"type\":\"bytes\"}],\"internalType\":\"struct iOVM_L1CrossDomainMessenger.L2MessageInclusionProof\",\"name\":\"_proof\",\"type\":\"tuple\"}],\"name\":\"relayMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"relayedMessages\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_sender\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_message\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"_messageNonce\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"_gasLimit\",\"type\":\"uint32\"}],\"name\":\"replayMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_message\",\"type\":\"bytes\"},{\"internalType\":\"uint32\",\"name\":\"_gasLimit\",\"type\":\"uint32\"}],\"name\":\"sendMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"sentMessages\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"successfulMessages\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"xDomainMessageSender\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The L1 Cross Domain Messenger contract sends messages from L1 to L2, and relays messages from L2 onto L1. In the event that a message sent from L1 to L2 is rejected for exceeding the L2 epoch gas limit, it can be resubmitted via this contract's replay function. Compiler used: solc Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"initialize(address)\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\"}},\"relayMessage(address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))\":{\"params\":{\"_message\":\"Message to send to the target.\",\"_messageNonce\":\"Nonce for the provided message.\",\"_proof\":\"Inclusion proof for the given message.\",\"_sender\":\"Message sender address.\",\"_target\":\"Target contract address.\"}},\"replayMessage(address,address,bytes,uint256,uint32)\":{\"params\":{\"_gasLimit\":\"Gas limit for the provided message.\",\"_message\":\"Message to send to the target.\",\"_messageNonce\":\"Nonce for the provided message.\",\"_sender\":\"Original sender address.\",\"_target\":\"Target contract address.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}},\"sendMessage(address,bytes,uint32)\":{\"params\":{\"_gasLimit\":\"Gas limit for the provided message.\",\"_message\":\"Message to send to the target.\",\"_target\":\"Target contract address.\"}}},\"title\":\"OVM_L1CrossDomainMessenger\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"constructor\":{\"notice\":\"Pass a default zero address to the address resolver. This will be updated when initialized.\"},\"relayMessage(address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))\":{\"notice\":\"Relays a cross domain message to a contract.\"},\"replayMessage(address,address,bytes,uint256,uint32)\":{\"notice\":\"Replays a cross domain message to the target messenger.\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"},\"sendMessage(address,bytes,uint32)\":{\"notice\":\"Sends a cross domain message to the target messenger.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1CrossDomainMessenger.sol\":\"OVM_L1CrossDomainMessenger\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor () internal {\\n address msgSender = _msgSender();\\n _owner = msgSender;\\n emit OwnershipTransferred(address(0), msgSender);\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n emit OwnershipTransferred(_owner, address(0));\\n _owner = address(0);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n emit OwnershipTransferred(_owner, newOwner);\\n _owner = newOwner;\\n }\\n}\\n\",\"keccak256\":\"0x15e2d5bd4c28a88548074c54d220e8086f638a71ed07e6b3ba5a70066fcf458d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with GSN meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address payable) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes memory) {\\n this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x8d3cb350f04ff49cfb10aef08d87f19dcbaecc8027b0bed12f3275cd12f38cf0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/ReentrancyGuard.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Contract module that helps prevent reentrant calls to a function.\\n *\\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\\n * available, which can be applied to functions to make sure there are no nested\\n * (reentrant) calls to them.\\n *\\n * Note that because there is a single `nonReentrant` guard, functions marked as\\n * `nonReentrant` may not call one another. This can be worked around by making\\n * those functions `private`, and then adding `external` `nonReentrant` entry\\n * points to them.\\n *\\n * TIP: If you would like to learn more about reentrancy and alternative ways\\n * to protect against it, check out our blog post\\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\\n */\\nabstract contract ReentrancyGuard {\\n // Booleans are more expensive than uint256 or any type that takes up a full\\n // word because each write operation emits an extra SLOAD to first read the\\n // slot's contents, replace the bits taken up by the boolean, and then write\\n // back. This is the compiler's defense against contract upgrades and\\n // pointer aliasing, and it cannot be disabled.\\n\\n // The values being non-zero value makes deployment a bit more expensive,\\n // but in exchange the refund on every call to nonReentrant will be lower in\\n // amount. Since refunds are capped to a percentage of the total\\n // transaction's gas, it is best to keep them low in cases like this one, to\\n // increase the likelihood of the full refund coming into effect.\\n uint256 private constant _NOT_ENTERED = 1;\\n uint256 private constant _ENTERED = 2;\\n\\n uint256 private _status;\\n\\n constructor () internal {\\n _status = _NOT_ENTERED;\\n }\\n\\n /**\\n * @dev Prevents a contract from calling itself, directly or indirectly.\\n * Calling a `nonReentrant` function from another `nonReentrant`\\n * function is not supported. It is possible to prevent this from happening\\n * by making the `nonReentrant` function external, and make it call a\\n * `private` function that does the actual work.\\n */\\n modifier nonReentrant() {\\n // On the first call to nonReentrant, _notEntered will be true\\n require(_status != _ENTERED, \\\"ReentrancyGuard: reentrant call\\\");\\n\\n // Any calls to nonReentrant after this point will fail\\n _status = _ENTERED;\\n\\n _;\\n\\n // By storing the original value once again, a refund is triggered (see\\n // https://eips.ethereum.org/EIPS/eip-2200)\\n _status = _NOT_ENTERED;\\n }\\n}\\n\",\"keccak256\":\"0x8bbbc2f5c10065ee272592ae0a7a6ceb23de2fbd81564ee0bb015ecf404d5f61\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/bridge/messaging/Abs_BaseCrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Interface Imports */\\nimport { iAbs_BaseCrossDomainMessenger } from \\\"../../../iOVM/bridge/messaging/iAbs_BaseCrossDomainMessenger.sol\\\";\\n\\n/* External Imports */\\nimport { ReentrancyGuard } from \\\"@openzeppelin/contracts/utils/ReentrancyGuard.sol\\\";\\n\\n/**\\n * @title Abs_BaseCrossDomainMessenger\\n * @dev The Base Cross Domain Messenger is an abstract contract providing the interface and common\\n * functionality used in the L1 and L2 Cross Domain Messengers. It can also serve as a template for\\n * developers wishing to implement a custom bridge contract to suit their needs.\\n *\\n * Compiler used: defined by child contract\\n * Runtime target: defined by child contract\\n */\\nabstract contract Abs_BaseCrossDomainMessenger is iAbs_BaseCrossDomainMessenger, ReentrancyGuard {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n // The default x-domain message sender being set to a non-zero value makes\\n // deployment a bit more expensive, but in exchange the refund on every call to\\n // `relayMessage` by the L1 and L2 messengers will be higher.\\n address internal constant DEFAULT_XDOMAIN_SENDER = 0x000000000000000000000000000000000000dEaD;\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping (bytes32 => bool) public relayedMessages;\\n mapping (bytes32 => bool) public successfulMessages;\\n mapping (bytes32 => bool) public sentMessages;\\n uint256 public messageNonce;\\n address internal xDomainMsgSender = DEFAULT_XDOMAIN_SENDER;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n constructor() ReentrancyGuard() {}\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function xDomainMessageSender()\\n public\\n override\\n view\\n returns (\\n address\\n )\\n {\\n require(xDomainMsgSender != DEFAULT_XDOMAIN_SENDER, \\\"xDomainMessageSender is not set\\\");\\n return xDomainMsgSender;\\n }\\n\\n /**\\n * Sends a cross domain message to the target messenger.\\n * @param _target Target contract address.\\n * @param _message Message to send to the target.\\n * @param _gasLimit Gas limit for the provided message.\\n */\\n function sendMessage(\\n address _target,\\n bytes memory _message,\\n uint32 _gasLimit\\n )\\n override\\n public\\n {\\n bytes memory xDomainCalldata = _getXDomainCalldata(\\n _target,\\n msg.sender,\\n _message,\\n messageNonce\\n );\\n\\n messageNonce += 1;\\n sentMessages[keccak256(xDomainCalldata)] = true;\\n\\n _sendXDomainMessage(xDomainCalldata, _gasLimit);\\n emit SentMessage(xDomainCalldata);\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Generates the correct cross domain calldata for a message.\\n * @param _target Target contract address.\\n * @param _sender Message sender address.\\n * @param _message Message to send to the target.\\n * @param _messageNonce Nonce for the provided message.\\n * @return ABI encoded cross domain calldata.\\n */\\n function _getXDomainCalldata(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _messageNonce\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return abi.encodeWithSignature(\\n \\\"relayMessage(address,address,bytes,uint256)\\\",\\n _target,\\n _sender,\\n _message,\\n _messageNonce\\n );\\n }\\n\\n /**\\n * Sends a cross domain message.\\n * param // Message to send.\\n * param // Gas limit for the provided message.\\n */\\n function _sendXDomainMessage(\\n bytes memory, // _message,\\n uint256 // _gasLimit\\n )\\n virtual\\n internal\\n {\\n revert(\\\"Implement me in child contracts!\\\");\\n }\\n}\\n\",\"keccak256\":\"0x8a19df0879604c636834ca5e34482d78dff8acdf415caf913a95415a240f9d62\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1CrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../../libraries/resolver/Lib_AddressResolver.sol\\\";\\nimport { Lib_AddressManager } from \\\"../../../libraries/resolver/Lib_AddressManager.sol\\\";\\nimport { Lib_SecureMerkleTrie } from \\\"../../../libraries/trie/Lib_SecureMerkleTrie.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_L1CrossDomainMessenger } from \\\"../../../iOVM/bridge/messaging/iOVM_L1CrossDomainMessenger.sol\\\";\\nimport { iOVM_CanonicalTransactionChain } from \\\"../../../iOVM/chain/iOVM_CanonicalTransactionChain.sol\\\";\\nimport { iOVM_StateCommitmentChain } from \\\"../../../iOVM/chain/iOVM_StateCommitmentChain.sol\\\";\\n\\n/* Contract Imports */\\nimport { Abs_BaseCrossDomainMessenger } from \\\"./Abs_BaseCrossDomainMessenger.sol\\\";\\n\\n/**\\n * @title OVM_L1CrossDomainMessenger\\n * @dev The L1 Cross Domain Messenger contract sends messages from L1 to L2, and relays messages\\n * from L2 onto L1. In the event that a message sent from L1 to L2 is rejected for exceeding the L2\\n * epoch gas limit, it can be resubmitted via this contract's replay function.\\n *\\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract OVM_L1CrossDomainMessenger is iOVM_L1CrossDomainMessenger, Abs_BaseCrossDomainMessenger, Lib_AddressResolver {\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * Pass a default zero address to the address resolver. This will be updated when initialized.\\n */\\n constructor()\\n Lib_AddressResolver(address(0))\\n {}\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n /**\\n * Modifier to enforce that, if configured, only the OVM_L2MessageRelayer contract may\\n * successfully call a method.\\n */\\n modifier onlyRelayer() {\\n address relayer = resolve(\\\"OVM_L2MessageRelayer\\\");\\n if (relayer != address(0)) {\\n require(\\n msg.sender == relayer,\\n \\\"Only OVM_L2MessageRelayer can relay L2-to-L1 messages.\\\"\\n );\\n }\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n */\\n function initialize(\\n address _libAddressManager\\n )\\n public\\n {\\n require(\\n address(libAddressManager) == address(0),\\n \\\"L1CrossDomainMessenger already intialized.\\\"\\n );\\n\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n xDomainMsgSender = DEFAULT_XDOMAIN_SENDER;\\n }\\n\\n /**\\n * Relays a cross domain message to a contract.\\n * @inheritdoc iOVM_L1CrossDomainMessenger\\n */\\n function relayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _messageNonce,\\n L2MessageInclusionProof memory _proof\\n )\\n override\\n public\\n nonReentrant\\n onlyRelayer()\\n {\\n bytes memory xDomainCalldata = _getXDomainCalldata(\\n _target,\\n _sender,\\n _message,\\n _messageNonce\\n );\\n\\n require(\\n _verifyXDomainMessage(\\n xDomainCalldata,\\n _proof\\n ) == true,\\n \\\"Provided message could not be verified.\\\"\\n );\\n\\n bytes32 xDomainCalldataHash = keccak256(xDomainCalldata);\\n\\n require(\\n successfulMessages[xDomainCalldataHash] == false,\\n \\\"Provided message has already been received.\\\"\\n );\\n\\n xDomainMsgSender = _sender;\\n (bool success, ) = _target.call(_message);\\n xDomainMsgSender = DEFAULT_XDOMAIN_SENDER;\\n\\n // Mark the message as received if the call was successful. Ensures that a message can be\\n // relayed multiple times in the case that the call reverted.\\n if (success == true) {\\n successfulMessages[xDomainCalldataHash] = true;\\n emit RelayedMessage(xDomainCalldataHash);\\n } else {\\n emit FailedRelayedMessage(xDomainCalldataHash);\\n }\\n\\n // Store an identifier that can be used to prove that the given message was relayed by some\\n // user. Gives us an easy way to pay relayers for their work.\\n bytes32 relayId = keccak256(\\n abi.encodePacked(\\n xDomainCalldata,\\n msg.sender,\\n block.number\\n )\\n );\\n relayedMessages[relayId] = true;\\n }\\n\\n /**\\n * Replays a cross domain message to the target messenger.\\n * @inheritdoc iOVM_L1CrossDomainMessenger\\n */\\n function replayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _messageNonce,\\n uint32 _gasLimit\\n )\\n override\\n public\\n {\\n bytes memory xDomainCalldata = _getXDomainCalldata(\\n _target,\\n _sender,\\n _message,\\n _messageNonce\\n );\\n\\n require(\\n sentMessages[keccak256(xDomainCalldata)] == true,\\n \\\"Provided message has not already been sent.\\\"\\n );\\n\\n _sendXDomainMessage(xDomainCalldata, _gasLimit);\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Verifies that the given message is valid.\\n * @param _xDomainCalldata Calldata to verify.\\n * @param _proof Inclusion proof for the message.\\n * @return Whether or not the provided message is valid.\\n */\\n function _verifyXDomainMessage(\\n bytes memory _xDomainCalldata,\\n L2MessageInclusionProof memory _proof\\n )\\n internal\\n view\\n returns (\\n bool\\n )\\n {\\n return (\\n _verifyStateRootProof(_proof)\\n && _verifyStorageProof(_xDomainCalldata, _proof)\\n );\\n }\\n\\n /**\\n * Verifies that the state root within an inclusion proof is valid.\\n * @param _proof Message inclusion proof.\\n * @return Whether or not the provided proof is valid.\\n */\\n function _verifyStateRootProof(\\n L2MessageInclusionProof memory _proof\\n )\\n internal\\n view\\n returns (\\n bool\\n )\\n {\\n iOVM_StateCommitmentChain ovmStateCommitmentChain = iOVM_StateCommitmentChain(\\n resolve(\\\"OVM_StateCommitmentChain\\\")\\n );\\n\\n return (\\n ovmStateCommitmentChain.insideFraudProofWindow(_proof.stateRootBatchHeader) == false\\n && ovmStateCommitmentChain.verifyStateCommitment(\\n _proof.stateRoot,\\n _proof.stateRootBatchHeader,\\n _proof.stateRootProof\\n )\\n );\\n }\\n\\n /**\\n * Verifies that the storage proof within an inclusion proof is valid.\\n * @param _xDomainCalldata Encoded message calldata.\\n * @param _proof Message inclusion proof.\\n * @return Whether or not the provided proof is valid.\\n */\\n function _verifyStorageProof(\\n bytes memory _xDomainCalldata,\\n L2MessageInclusionProof memory _proof\\n )\\n internal\\n view\\n returns (\\n bool\\n )\\n {\\n bytes32 storageKey = keccak256(\\n abi.encodePacked(\\n keccak256(\\n abi.encodePacked(\\n _xDomainCalldata,\\n resolve(\\\"OVM_L2CrossDomainMessenger\\\")\\n )\\n ),\\n uint256(0)\\n )\\n );\\n\\n (\\n bool exists,\\n bytes memory encodedMessagePassingAccount\\n ) = Lib_SecureMerkleTrie.get(\\n abi.encodePacked(0x4200000000000000000000000000000000000000),\\n _proof.stateTrieWitness,\\n _proof.stateRoot\\n );\\n\\n require(\\n exists == true,\\n \\\"Message passing predeploy has not been initialized or invalid proof provided.\\\"\\n );\\n\\n Lib_OVMCodec.EVMAccount memory account = Lib_OVMCodec.decodeEVMAccount(\\n encodedMessagePassingAccount\\n );\\n\\n return Lib_SecureMerkleTrie.verifyInclusionProof(\\n abi.encodePacked(storageKey),\\n abi.encodePacked(uint8(1)),\\n _proof.storageTrieWitness,\\n account.storageRoot\\n );\\n }\\n\\n /**\\n * Sends a cross domain message.\\n * @param _message Message to send.\\n * @param _gasLimit OVM gas limit for the message.\\n */\\n function _sendXDomainMessage(\\n bytes memory _message,\\n uint256 _gasLimit\\n )\\n override\\n internal\\n {\\n iOVM_CanonicalTransactionChain(resolve(\\\"OVM_CanonicalTransactionChain\\\")).enqueue(\\n resolve(\\\"OVM_L2CrossDomainMessenger\\\"),\\n _gasLimit,\\n _message\\n );\\n }\\n}\\n\",\"keccak256\":\"0xaebba6452b71f17982465897efcd935a5724890fe10effaa901051ae2f28f397\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/bridge/messaging/iAbs_BaseCrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/**\\n * @title iAbs_BaseCrossDomainMessenger\\n */\\ninterface iAbs_BaseCrossDomainMessenger {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event SentMessage(bytes message);\\n event RelayedMessage(bytes32 msgHash);\\n event FailedRelayedMessage(bytes32 msgHash);\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n function xDomainMessageSender() external view returns (address);\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sends a cross domain message to the target messenger.\\n * @param _target Target contract address.\\n * @param _message Message to send to the target.\\n * @param _gasLimit Gas limit for the provided message.\\n */\\n function sendMessage(\\n address _target,\\n bytes calldata _message,\\n uint32 _gasLimit\\n ) external;\\n}\\n\",\"keccak256\":\"0x89981ed48e99d6939cc6cdef827d484fa3e2292d66c0ba5056c7050cb6282d7e\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/bridge/messaging/iOVM_L1CrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { iAbs_BaseCrossDomainMessenger } from \\\"./iAbs_BaseCrossDomainMessenger.sol\\\";\\n\\n/**\\n * @title iOVM_L1CrossDomainMessenger\\n */\\ninterface iOVM_L1CrossDomainMessenger is iAbs_BaseCrossDomainMessenger {\\n\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n struct L2MessageInclusionProof {\\n bytes32 stateRoot;\\n Lib_OVMCodec.ChainBatchHeader stateRootBatchHeader;\\n Lib_OVMCodec.ChainInclusionProof stateRootProof;\\n bytes stateTrieWitness;\\n bytes storageTrieWitness;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Relays a cross domain message to a contract.\\n * @param _target Target contract address.\\n * @param _sender Message sender address.\\n * @param _message Message to send to the target.\\n * @param _messageNonce Nonce for the provided message.\\n * @param _proof Inclusion proof for the given message.\\n */\\n function relayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _messageNonce,\\n L2MessageInclusionProof memory _proof\\n ) external;\\n\\n /**\\n * Replays a cross domain message to the target messenger.\\n * @param _target Target contract address.\\n * @param _sender Original sender address.\\n * @param _message Message to send to the target.\\n * @param _messageNonce Nonce for the provided message.\\n * @param _gasLimit Gas limit for the provided message.\\n */\\n function replayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _messageNonce,\\n uint32 _gasLimit\\n ) external;\\n}\\n\",\"keccak256\":\"0xdcd239d0b215e400674d78e8db4ac12ba18efc34fa78e24c2ff867f61062dba2\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_CanonicalTransactionChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_ChainStorageContainer } from \\\"./iOVM_ChainStorageContainer.sol\\\";\\n\\n/**\\n * @title iOVM_CanonicalTransactionChain\\n */\\ninterface iOVM_CanonicalTransactionChain {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event TransactionEnqueued(\\n address _l1TxOrigin,\\n address _target,\\n uint256 _gasLimit,\\n bytes _data,\\n uint256 _queueIndex,\\n uint256 _timestamp\\n );\\n\\n event QueueBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event SequencerBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event TransactionBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct BatchContext {\\n uint256 numSequencedTransactions;\\n uint256 numSubsequentQueueTransactions;\\n uint256 timestamp;\\n uint256 blockNumber;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n\\n /**\\n * Accesses the batch storage container.\\n * @return Reference to the batch storage container.\\n */\\n function batches()\\n external\\n view\\n returns (\\n iOVM_ChainStorageContainer\\n );\\n\\n /**\\n * Accesses the queue storage container.\\n * @return Reference to the queue storage container.\\n */\\n function queue()\\n external\\n view\\n returns (\\n iOVM_ChainStorageContainer\\n );\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements()\\n external\\n view\\n returns (\\n uint256 _totalElements\\n );\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches()\\n external\\n view\\n returns (\\n uint256 _totalBatches\\n );\\n\\n /**\\n * Returns the index of the next element to be enqueued.\\n * @return Index for the next queue element.\\n */\\n function getNextQueueIndex()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Gets the queue element at a particular index.\\n * @param _index Index of the queue element to access.\\n * @return _element Queue element at the given index.\\n */\\n function getQueueElement(\\n uint256 _index\\n )\\n external\\n view\\n returns (\\n Lib_OVMCodec.QueueElement memory _element\\n );\\n\\n /**\\n * Returns the timestamp of the last transaction.\\n * @return Timestamp for the last transaction.\\n */\\n function getLastTimestamp()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Returns the blocknumber of the last transaction.\\n * @return Blocknumber for the last transaction.\\n */\\n function getLastBlockNumber()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Get the number of queue elements which have not yet been included.\\n * @return Number of pending queue elements.\\n */\\n function getNumPendingQueueElements()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Retrieves the length of the queue, including\\n * both pending and canonical transactions.\\n * @return Length of the queue.\\n */\\n function getQueueLength()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n\\n /**\\n * Adds a transaction to the queue.\\n * @param _target Target contract to send the transaction to.\\n * @param _gasLimit Gas limit for the given transaction.\\n * @param _data Transaction data.\\n */\\n function enqueue(\\n address _target,\\n uint256 _gasLimit,\\n bytes memory _data\\n )\\n external;\\n\\n /**\\n * Appends a given number of queued transactions as a single batch.\\n * @param _numQueuedTransactions Number of transactions to append.\\n */\\n function appendQueueBatch(\\n uint256 _numQueuedTransactions\\n )\\n external;\\n\\n /**\\n * Allows the sequencer to append a batch of transactions.\\n * @dev This function uses a custom encoding scheme for efficiency reasons.\\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\\n * .param _contexts Array of batch contexts.\\n * .param _transactionDataFields Array of raw transaction data.\\n */\\n function appendSequencerBatch(\\n // uint40 _shouldStartAtElement,\\n // uint24 _totalElementsToAppend,\\n // BatchContext[] _contexts,\\n // bytes[] _transactionDataFields\\n )\\n external;\\n\\n /**\\n * Verifies whether a transaction is included in the chain.\\n * @param _transaction Transaction to verify.\\n * @param _txChainElement Transaction chain element corresponding to the transaction.\\n * @param _batchHeader Header of the batch the transaction was included in.\\n * @param _inclusionProof Inclusion proof for the provided transaction chain element.\\n * @return True if the transaction exists in the CTC, false if not.\\n */\\n function verifyTransaction(\\n Lib_OVMCodec.Transaction memory _transaction,\\n Lib_OVMCodec.TransactionChainElement memory _txChainElement,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _inclusionProof\\n )\\n external\\n view\\n returns (\\n bool\\n );\\n}\\n\",\"keccak256\":\"0xb5e55488a1982841c07cdf5ff475da4789596f111dd48f01b1918ee4c775cf3a\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_ChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title iOVM_ChainStorageContainer\\n */\\ninterface iOVM_ChainStorageContainer {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata()\\n external\\n view\\n returns (\\n bytes27\\n );\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length()\\n external\\n view\\n returns (\\n uint256\\n );\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(\\n bytes32 _object\\n )\\n external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(\\n bytes32 _object,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(\\n uint256 _index\\n )\\n external\\n view\\n returns (\\n bytes32\\n );\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index\\n )\\n external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Marks an index as overwritable, meaing the underlying buffer can start to write values over\\n * any objects before and including the given index.\\n */\\n function setNextOverwritableIndex(\\n uint256 _index\\n )\\n external;\\n}\\n\",\"keccak256\":\"0x2d7973a0ad84c23ec62624d3f1e3aeb198cc72686ff1e6cfa17155556b320c94\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_StateCommitmentChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title iOVM_StateCommitmentChain\\n */\\ninterface iOVM_StateCommitmentChain {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event StateBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n event StateBatchDeleted(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot\\n );\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements()\\n external\\n view\\n returns (\\n uint256 _totalElements\\n );\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches()\\n external\\n view\\n returns (\\n uint256 _totalBatches\\n );\\n\\n /**\\n * Retrieves the timestamp of the last batch submitted by the sequencer.\\n * @return _lastSequencerTimestamp Last sequencer batch timestamp.\\n */\\n function getLastSequencerTimestamp()\\n external\\n view\\n returns (\\n uint256 _lastSequencerTimestamp\\n );\\n\\n /**\\n * Appends a batch of state roots to the chain.\\n * @param _batch Batch of state roots.\\n * @param _shouldStartAtElement Index of the element at which this batch should start.\\n */\\n function appendStateBatch(\\n bytes32[] calldata _batch,\\n uint256 _shouldStartAtElement\\n )\\n external;\\n\\n /**\\n * Deletes all state roots after (and including) a given batch.\\n * @param _batchHeader Header of the batch to start deleting from.\\n */\\n function deleteStateBatch(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n external;\\n\\n /**\\n * Verifies a batch inclusion proof.\\n * @param _element Hash of the element to verify a proof for.\\n * @param _batchHeader Header of the batch in which the element was included.\\n * @param _proof Merkle inclusion proof for the element.\\n */\\n function verifyStateCommitment(\\n bytes32 _element,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _proof\\n )\\n external\\n view\\n returns (\\n bool _verified\\n );\\n\\n /**\\n * Checks whether a given batch is still inside its fraud proof window.\\n * @param _batchHeader Header of the batch to check.\\n * @return _inside Whether or not the batch is inside the fraud proof window.\\n */\\n function insideFraudProofWindow(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n external\\n view\\n returns (\\n bool _inside\\n );\\n}\\n\",\"keccak256\":\"0x6646d6ff392b81aab52a7a277e91540819464751de0af5afd1962094b2e92448\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/codec/Lib_OVMCodec.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../utils/Lib_Bytes32Utils.sol\\\";\\n\\n/**\\n * @title Lib_OVMCodec\\n */\\nlibrary Lib_OVMCodec {\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum QueueOrigin {\\n SEQUENCER_QUEUE,\\n L1TOL2_QUEUE\\n }\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Account {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n address ethAddress;\\n bool isFresh;\\n }\\n\\n struct EVMAccount {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n }\\n\\n struct ChainBatchHeader {\\n uint256 batchIndex;\\n bytes32 batchRoot;\\n uint256 batchSize;\\n uint256 prevTotalElements;\\n bytes extraData;\\n }\\n\\n struct ChainInclusionProof {\\n uint256 index;\\n bytes32[] siblings;\\n }\\n\\n struct Transaction {\\n uint256 timestamp;\\n uint256 blockNumber;\\n QueueOrigin l1QueueOrigin;\\n address l1TxOrigin;\\n address entrypoint;\\n uint256 gasLimit;\\n bytes data;\\n }\\n\\n struct TransactionChainElement {\\n bool isSequenced;\\n uint256 queueIndex; // QUEUED TX ONLY\\n uint256 timestamp; // SEQUENCER TX ONLY\\n uint256 blockNumber; // SEQUENCER TX ONLY\\n bytes txData; // SEQUENCER TX ONLY\\n }\\n\\n struct QueueElement {\\n bytes32 transactionHash;\\n uint40 timestamp;\\n uint40 blockNumber;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Encodes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Encoded transaction bytes.\\n */\\n function encodeTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return abi.encodePacked(\\n _transaction.timestamp,\\n _transaction.blockNumber,\\n _transaction.l1QueueOrigin,\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n );\\n }\\n\\n /**\\n * Hashes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Hashed transaction\\n */\\n function hashTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(encodeTransaction(_transaction));\\n }\\n\\n /**\\n * Converts an OVM account to an EVM account.\\n * @param _in OVM account to convert.\\n * @return Converted EVM account.\\n */\\n function toEVMAccount(\\n Account memory _in\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n return EVMAccount({\\n nonce: _in.nonce,\\n balance: _in.balance,\\n storageRoot: _in.storageRoot,\\n codeHash: _in.codeHash\\n });\\n }\\n\\n /**\\n * @notice RLP-encodes an account state struct.\\n * @param _account Account state struct.\\n * @return RLP-encoded account state.\\n */\\n function encodeEVMAccount(\\n EVMAccount memory _account\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes[] memory raw = new bytes[](4);\\n\\n // Unfortunately we can't create this array outright because\\n // Lib_RLPWriter.writeList will reject fixed-size arrays. Assigning\\n // index-by-index circumvents this issue.\\n raw[0] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.nonce)\\n )\\n );\\n raw[1] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.balance)\\n )\\n );\\n raw[2] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.storageRoot));\\n raw[3] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.codeHash));\\n\\n return Lib_RLPWriter.writeList(raw);\\n }\\n\\n /**\\n * @notice Decodes an RLP-encoded account state into a useful struct.\\n * @param _encoded RLP-encoded account state.\\n * @return Account state struct.\\n */\\n function decodeEVMAccount(\\n bytes memory _encoded\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\\n\\n return EVMAccount({\\n nonce: Lib_RLPReader.readUint256(accountState[0]),\\n balance: Lib_RLPReader.readUint256(accountState[1]),\\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\\n });\\n }\\n\\n /**\\n * Calculates a hash for a given batch header.\\n * @param _batchHeader Header to hash.\\n * @return Hash of the header.\\n */\\n function hashBatchHeader(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(\\n abi.encode(\\n _batchHeader.batchRoot,\\n _batchHeader.batchSize,\\n _batchHeader.prevTotalElements,\\n _batchHeader.extraData\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0xd85ba2066057a2677926f484b938c7c2ef33ff3853f3b71cda252f4a54f30e05\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n public\\n onlyOwner\\n {\\n addresses[_getNameHash(_name)] = _address;\\n\\n emit AddressSet(\\n _name,\\n _address\\n );\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0x2ce671a0e004df88b136bea5a3c59d0732cea8887c8496da1d509e0200b03d7d\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(\\n address _libAddressManager\\n ) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x65981feeabff6a81783ea97d44baf988a18a86c8cb374c46fdb71819cbacc7c0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPReader.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_RLPReader\\n * @dev Adapted from \\\"RLPReader\\\" by Hamdi Allam (hamdi.allam97@gmail.com).\\n */\\nlibrary Lib_RLPReader {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 constant internal MAX_LIST_LENGTH = 32;\\n\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum RLPItemType {\\n DATA_ITEM,\\n LIST_ITEM\\n }\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct RLPItem {\\n uint256 length;\\n uint256 ptr;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts bytes to a reference to memory position and length.\\n * @param _in Input bytes to convert.\\n * @return Output memory reference.\\n */\\n function toRLPItem(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem memory\\n )\\n {\\n uint256 ptr;\\n assembly {\\n ptr := add(_in, 32)\\n }\\n\\n return RLPItem({\\n length: _in.length,\\n ptr: ptr\\n });\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n (\\n uint256 listOffset,\\n ,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.LIST_ITEM,\\n \\\"Invalid RLP list value.\\\"\\n );\\n\\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\\n // writing to the length. Since we can't know the number of RLP items without looping over\\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\\n // simply set a reasonable maximum list length and decrease the size before we finish.\\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\\n\\n uint256 itemCount = 0;\\n uint256 offset = listOffset;\\n while (offset < _in.length) {\\n require(\\n itemCount < MAX_LIST_LENGTH,\\n \\\"Provided RLP list exceeds max list length.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n ) = _decodeLength(RLPItem({\\n length: _in.length - offset,\\n ptr: _in.ptr + offset\\n }));\\n\\n out[itemCount] = RLPItem({\\n length: itemLength + itemOffset,\\n ptr: _in.ptr + offset\\n });\\n\\n itemCount += 1;\\n offset += itemOffset + itemLength;\\n }\\n\\n // Decrease the array size to match the actual item count.\\n assembly {\\n mstore(out, itemCount)\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n return readList(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes value.\\\"\\n );\\n\\n return _copy(_in.ptr, itemOffset, itemLength);\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return readBytes(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return string(readBytes(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return readString(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n require(\\n _in.length <= 33,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr + itemOffset;\\n bytes32 out;\\n assembly {\\n out := mload(ptr)\\n\\n // Shift the bytes over to match the item size.\\n if lt(itemLength, 32) {\\n out := div(out, exp(256, sub(32, itemLength)))\\n }\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return readBytes32(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return uint256(readBytes32(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return readUint256(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n require(\\n _in.length == 1,\\n \\\"Invalid RLP boolean value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 out;\\n assembly {\\n out := byte(0, mload(ptr))\\n }\\n\\n require(\\n out == 0 || out == 1,\\n \\\"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\\\"\\n );\\n\\n return out != 0;\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return readBool(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n if (_in.length == 1) {\\n return address(0);\\n }\\n\\n require(\\n _in.length == 21,\\n \\\"Invalid RLP address value.\\\"\\n );\\n\\n return address(readUint256(_in));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return readAddress(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads the raw bytes of an RLP item.\\n * @param _in RLP item to read.\\n * @return Raw RLP bytes.\\n */\\n function readRawBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in);\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Decodes the length of an RLP item.\\n * @param _in RLP item to decode.\\n * @return Offset of the encoded data.\\n * @return Length of the encoded data.\\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\\n */\\n function _decodeLength(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n uint256,\\n uint256,\\n RLPItemType\\n )\\n {\\n require(\\n _in.length > 0,\\n \\\"RLP item cannot be null.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 prefix;\\n assembly {\\n prefix := byte(0, mload(ptr))\\n }\\n\\n if (prefix <= 0x7f) {\\n // Single byte.\\n\\n return (0, 1, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xb7) {\\n // Short string.\\n\\n uint256 strLen = prefix - 0x80;\\n\\n require(\\n _in.length > strLen,\\n \\\"Invalid RLP short string.\\\"\\n );\\n\\n return (1, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xbf) {\\n // Long string.\\n uint256 lenOfStrLen = prefix - 0xb7;\\n\\n require(\\n _in.length > lenOfStrLen,\\n \\\"Invalid RLP long string length.\\\"\\n );\\n\\n uint256 strLen;\\n assembly {\\n // Pick out the string length.\\n strLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfStrLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfStrLen + strLen,\\n \\\"Invalid RLP long string.\\\"\\n );\\n\\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xf7) {\\n // Short list.\\n uint256 listLen = prefix - 0xc0;\\n\\n require(\\n _in.length > listLen,\\n \\\"Invalid RLP short list.\\\"\\n );\\n\\n return (1, listLen, RLPItemType.LIST_ITEM);\\n } else {\\n // Long list.\\n uint256 lenOfListLen = prefix - 0xf7;\\n\\n require(\\n _in.length > lenOfListLen,\\n \\\"Invalid RLP long list length.\\\"\\n );\\n\\n uint256 listLen;\\n assembly {\\n // Pick out the list length.\\n listLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfListLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfListLen + listLen,\\n \\\"Invalid RLP long list.\\\"\\n );\\n\\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\\n }\\n }\\n\\n /**\\n * Copies the bytes from a memory location.\\n * @param _src Pointer to the location to read from.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Copied bytes.\\n */\\n function _copy(\\n uint256 _src,\\n uint256 _offset,\\n uint256 _length\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out = new bytes(_length);\\n if (out.length == 0) {\\n return out;\\n }\\n\\n uint256 src = _src + _offset;\\n uint256 dest;\\n assembly {\\n dest := add(out, 32)\\n }\\n\\n // Copy over as many complete words as we can.\\n for (uint256 i = 0; i < _length / 32; i++) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n\\n src += 32;\\n dest += 32;\\n }\\n\\n // Pick out the remaining bytes.\\n uint256 mask = 256 ** (32 - (_length % 32)) - 1;\\n assembly {\\n mstore(\\n dest,\\n or(\\n and(mload(src), not(mask)),\\n and(mload(dest), mask)\\n )\\n )\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Copies an RLP item into bytes.\\n * @param _in RLP item to copy.\\n * @return Copied bytes.\\n */\\n function _copy(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in.ptr, 0, _in.length);\\n }\\n}\\n\",\"keccak256\":\"0x829174c61216dce35fdb888383b6022e0365eb7fbdc71ad79d98b108091969fe\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPWriter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/**\\n * @title Lib_RLPWriter\\n * @author Bakaoh (with modifications)\\n */\\nlibrary Lib_RLPWriter {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * RLP encodes a byte string.\\n * @param _in The byte string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded;\\n\\n if (_in.length == 1 && uint8(_in[0]) < 128) {\\n encoded = _in;\\n } else {\\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * RLP encodes a list of RLP encoded byte byte strings.\\n * @param _in The list of RLP encoded byte strings.\\n * @return The RLP encoded list of items in bytes.\\n */\\n function writeList(\\n bytes[] memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory list = _flatten(_in);\\n return abi.encodePacked(_writeLength(list.length, 192), list);\\n }\\n\\n /**\\n * RLP encodes a string.\\n * @param _in The string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeString(\\n string memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(bytes(_in));\\n }\\n\\n /**\\n * RLP encodes an address.\\n * @param _in The address to encode.\\n * @return The RLP encoded address in bytes.\\n */\\n function writeAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a bytes32 value.\\n * @param _in The bytes32 to encode.\\n * @return _out The RLP encoded bytes32 in bytes.\\n */\\n function writeBytes32(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a uint.\\n * @param _in The uint256 to encode.\\n * @return The RLP encoded uint256 in bytes.\\n */\\n function writeUint(\\n uint256 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(_toBinary(_in));\\n }\\n\\n /**\\n * RLP encodes a bool.\\n * @param _in The bool to encode.\\n * @return The RLP encoded bool in bytes.\\n */\\n function writeBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded = new bytes(1);\\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\\n return encoded;\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\\n * @param _len The length of the string or the payload.\\n * @param _offset 128 if item is string, 192 if item is list.\\n * @return RLP encoded bytes.\\n */\\n function _writeLength(\\n uint256 _len,\\n uint256 _offset\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded;\\n\\n if (_len < 56) {\\n encoded = new bytes(1);\\n encoded[0] = byte(uint8(_len) + uint8(_offset));\\n } else {\\n uint256 lenLen;\\n uint256 i = 1;\\n while (_len / i != 0) {\\n lenLen++;\\n i *= 256;\\n }\\n\\n encoded = new bytes(lenLen + 1);\\n encoded[0] = byte(uint8(lenLen) + uint8(_offset) + 55);\\n for(i = 1; i <= lenLen; i++) {\\n encoded[i] = byte(uint8((_len / (256**(lenLen-i))) % 256));\\n }\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * Encode integer in big endian binary form with no leading zeroes.\\n * @notice TODO: This should be optimized with assembly to save gas costs.\\n * @param _x The integer to encode.\\n * @return RLP encoded bytes.\\n */\\n function _toBinary(\\n uint256 _x\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory b = abi.encodePacked(_x);\\n\\n uint256 i = 0;\\n for (; i < 32; i++) {\\n if (b[i] != 0) {\\n break;\\n }\\n }\\n\\n bytes memory res = new bytes(32 - i);\\n for (uint256 j = 0; j < res.length; j++) {\\n res[j] = b[i++];\\n }\\n\\n return res;\\n }\\n\\n /**\\n * Copies a piece of memory to another location.\\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\\n * @param _dest Destination location.\\n * @param _src Source location.\\n * @param _len Length of memory to copy.\\n */\\n function _memcpy(\\n uint256 _dest,\\n uint256 _src,\\n uint256 _len\\n )\\n private\\n pure\\n {\\n uint256 dest = _dest;\\n uint256 src = _src;\\n uint256 len = _len;\\n\\n for(; len >= 32; len -= 32) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n dest += 32;\\n src += 32;\\n }\\n\\n uint256 mask = 256 ** (32 - len) - 1;\\n assembly {\\n let srcpart := and(mload(src), not(mask))\\n let destpart := and(mload(dest), mask)\\n mstore(dest, or(destpart, srcpart))\\n }\\n }\\n\\n /**\\n * Flattens a list of byte strings into one byte string.\\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\\n * @param _list List of byte strings to flatten.\\n * @return The flattened byte string.\\n */\\n function _flatten(\\n bytes[] memory _list\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n if (_list.length == 0) {\\n return new bytes(0);\\n }\\n\\n uint256 len;\\n uint256 i = 0;\\n for (; i < _list.length; i++) {\\n len += _list[i].length;\\n }\\n\\n bytes memory flattened = new bytes(len);\\n uint256 flattenedPtr;\\n assembly { flattenedPtr := add(flattened, 0x20) }\\n\\n for(i = 0; i < _list.length; i++) {\\n bytes memory item = _list[i];\\n\\n uint256 listPtr;\\n assembly { listPtr := add(item, 0x20)}\\n\\n _memcpy(flattenedPtr, listPtr, item.length);\\n flattenedPtr += _list[i].length;\\n }\\n\\n return flattened;\\n }\\n}\\n\",\"keccak256\":\"0xb60ee4b03ad372c3deff21d454ab714dd0c18ee3e6f9d45532e209fc59d5a54d\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/trie/Lib_MerkleTrie.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\n\\n/**\\n * @title Lib_MerkleTrie\\n */\\nlibrary Lib_MerkleTrie {\\n\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n enum NodeType {\\n BranchNode,\\n ExtensionNode,\\n LeafNode\\n }\\n\\n struct TrieNode {\\n bytes encoded;\\n Lib_RLPReader.RLPItem[] decoded;\\n }\\n\\n\\n /**********************\\n * Contract Constants *\\n **********************/\\n\\n // TREE_RADIX determines the number of elements per branch node.\\n uint256 constant TREE_RADIX = 16;\\n // Branch nodes have TREE_RADIX elements plus an additional `value` slot.\\n uint256 constant BRANCH_NODE_LENGTH = TREE_RADIX + 1;\\n // Leaf nodes and extension nodes always have two elements, a `path` and a `value`.\\n uint256 constant LEAF_OR_EXTENSION_NODE_LENGTH = 2;\\n\\n // Prefixes are prepended to the `path` within a leaf or extension node and\\n // allow us to differentiate between the two node types. `ODD` or `EVEN` is\\n // determined by the number of nibbles within the unprefixed `path`. If the\\n // number of nibbles if even, we need to insert an extra padding nibble so\\n // the resulting prefixed `path` has an even number of nibbles.\\n uint8 constant PREFIX_EXTENSION_EVEN = 0;\\n uint8 constant PREFIX_EXTENSION_ODD = 1;\\n uint8 constant PREFIX_LEAF_EVEN = 2;\\n uint8 constant PREFIX_LEAF_ODD = 3;\\n\\n // Just a utility constant. RLP represents `NULL` as 0x80.\\n bytes1 constant RLP_NULL = bytes1(0x80);\\n bytes constant RLP_NULL_BYTES = hex'80';\\n bytes32 constant internal KECCAK256_RLP_NULL_BYTES = keccak256(RLP_NULL_BYTES);\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * @notice Verifies a proof that a given key/value pair is present in the\\n * Merkle trie.\\n * @param _key Key of the node to search for, as a hex string.\\n * @param _value Value of the node to search for, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the desired node. Unlike\\n * traditional Merkle trees, this proof is executed top-down and consists\\n * of a list of RLP-encoded nodes that make a path down to the target node.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _verified `true` if the k/v pair exists in the trie, `false` otherwise.\\n */\\n function verifyInclusionProof(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bool _verified\\n )\\n {\\n (\\n bool exists,\\n bytes memory value\\n ) = get(_key, _proof, _root);\\n\\n return (\\n exists && Lib_BytesUtils.equal(_value, value)\\n );\\n }\\n\\n /**\\n * @notice Verifies a proof that a given key is *not* present in\\n * the Merkle trie.\\n * @param _key Key of the node to search for, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\\n * target node.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _verified `true` if the key is absent in the trie, `false` otherwise.\\n */\\n function verifyExclusionProof(\\n bytes memory _key,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bool _verified\\n )\\n {\\n (\\n bool exists,\\n ) = get(_key, _proof, _root);\\n\\n return exists == false;\\n }\\n\\n /**\\n * @notice Updates a Merkle trie and returns a new root hash.\\n * @param _key Key of the node to update, as a hex string.\\n * @param _value Value of the node to update, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\\n * target node. If the key exists, we can simply update the value.\\n * Otherwise, we need to modify the trie to handle the new k/v pair.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _updatedRoot Root hash of the newly constructed trie.\\n */\\n function update(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bytes32 _updatedRoot\\n )\\n {\\n // Special case when inserting the very first node.\\n if (_root == KECCAK256_RLP_NULL_BYTES) {\\n return getSingleNodeRootHash(_key, _value);\\n }\\n\\n TrieNode[] memory proof = _parseProof(_proof);\\n (uint256 pathLength, bytes memory keyRemainder, ) = _walkNodePath(proof, _key, _root);\\n TrieNode[] memory newPath = _getNewPath(proof, pathLength, keyRemainder, _value);\\n\\n return _getUpdatedTrieRoot(newPath, _key);\\n }\\n\\n /**\\n * @notice Retrieves the value associated with a given key.\\n * @param _key Key to search for, as hex bytes.\\n * @param _proof Merkle trie inclusion proof for the key.\\n * @param _root Known root of the Merkle trie.\\n * @return _exists Whether or not the key exists.\\n * @return _value Value of the key if it exists.\\n */\\n function get(\\n bytes memory _key,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bool _exists,\\n bytes memory _value\\n )\\n {\\n TrieNode[] memory proof = _parseProof(_proof);\\n (uint256 pathLength, bytes memory keyRemainder, bool isFinalNode) = _walkNodePath(proof, _key, _root);\\n\\n bool exists = keyRemainder.length == 0;\\n\\n require(\\n exists || isFinalNode,\\n \\\"Provided proof is invalid.\\\"\\n );\\n\\n bytes memory value = exists ? _getNodeValue(proof[pathLength - 1]) : bytes('');\\n\\n return (\\n exists,\\n value\\n );\\n }\\n\\n /**\\n * Computes the root hash for a trie with a single node.\\n * @param _key Key for the single node.\\n * @param _value Value for the single node.\\n * @return _updatedRoot Hash of the trie.\\n */\\n function getSingleNodeRootHash(\\n bytes memory _key,\\n bytes memory _value\\n )\\n internal\\n pure\\n returns (\\n bytes32 _updatedRoot\\n )\\n {\\n return keccak256(_makeLeafNode(\\n Lib_BytesUtils.toNibbles(_key),\\n _value\\n ).encoded);\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * @notice Walks through a proof using a provided key.\\n * @param _proof Inclusion proof to walk through.\\n * @param _key Key to use for the walk.\\n * @param _root Known root of the trie.\\n * @return _pathLength Length of the final path\\n * @return _keyRemainder Portion of the key remaining after the walk.\\n * @return _isFinalNode Whether or not we've hit a dead end.\\n */\\n function _walkNodePath(\\n TrieNode[] memory _proof,\\n bytes memory _key,\\n bytes32 _root\\n )\\n private\\n pure\\n returns (\\n uint256 _pathLength,\\n bytes memory _keyRemainder,\\n bool _isFinalNode\\n )\\n {\\n uint256 pathLength = 0;\\n bytes memory key = Lib_BytesUtils.toNibbles(_key);\\n\\n bytes32 currentNodeID = _root;\\n uint256 currentKeyIndex = 0;\\n uint256 currentKeyIncrement = 0;\\n TrieNode memory currentNode;\\n\\n // Proof is top-down, so we start at the first element (root).\\n for (uint256 i = 0; i < _proof.length; i++) {\\n currentNode = _proof[i];\\n currentKeyIndex += currentKeyIncrement;\\n\\n // Keep track of the proof elements we actually need.\\n // It's expensive to resize arrays, so this simply reduces gas costs.\\n pathLength += 1;\\n\\n if (currentKeyIndex == 0) {\\n // First proof element is always the root node.\\n require(\\n keccak256(currentNode.encoded) == currentNodeID,\\n \\\"Invalid root hash\\\"\\n );\\n } else if (currentNode.encoded.length >= 32) {\\n // Nodes 32 bytes or larger are hashed inside branch nodes.\\n require(\\n keccak256(currentNode.encoded) == currentNodeID,\\n \\\"Invalid large internal hash\\\"\\n );\\n } else {\\n // Nodes smaller than 31 bytes aren't hashed.\\n require(\\n Lib_BytesUtils.toBytes32(currentNode.encoded) == currentNodeID,\\n \\\"Invalid internal node hash\\\"\\n );\\n }\\n\\n if (currentNode.decoded.length == BRANCH_NODE_LENGTH) {\\n if (currentKeyIndex == key.length) {\\n // We've hit the end of the key, meaning the value should be within this branch node.\\n break;\\n } else {\\n // We're not at the end of the key yet.\\n // Figure out what the next node ID should be and continue.\\n uint8 branchKey = uint8(key[currentKeyIndex]);\\n Lib_RLPReader.RLPItem memory nextNode = currentNode.decoded[branchKey];\\n currentNodeID = _getNodeID(nextNode);\\n currentKeyIncrement = 1;\\n continue;\\n }\\n } else if (currentNode.decoded.length == LEAF_OR_EXTENSION_NODE_LENGTH) {\\n bytes memory path = _getNodePath(currentNode);\\n uint8 prefix = uint8(path[0]);\\n uint8 offset = 2 - prefix % 2;\\n bytes memory pathRemainder = Lib_BytesUtils.slice(path, offset);\\n bytes memory keyRemainder = Lib_BytesUtils.slice(key, currentKeyIndex);\\n uint256 sharedNibbleLength = _getSharedNibbleLength(pathRemainder, keyRemainder);\\n\\n if (prefix == PREFIX_LEAF_EVEN || prefix == PREFIX_LEAF_ODD) {\\n if (\\n pathRemainder.length == sharedNibbleLength &&\\n keyRemainder.length == sharedNibbleLength\\n ) {\\n // The key within this leaf matches our key exactly.\\n // Increment the key index to reflect that we have no remainder.\\n currentKeyIndex += sharedNibbleLength;\\n }\\n\\n // We've hit a leaf node, so our next node should be NULL.\\n currentNodeID = bytes32(RLP_NULL);\\n break;\\n } else if (prefix == PREFIX_EXTENSION_EVEN || prefix == PREFIX_EXTENSION_ODD) {\\n if (sharedNibbleLength == 0) {\\n // Our extension node doesn't share any part of our key.\\n // We've hit the end of this path, updates will need to modify this extension.\\n currentNodeID = bytes32(RLP_NULL);\\n break;\\n } else {\\n // Our extension shares some nibbles.\\n // Carry on to the next node.\\n currentNodeID = _getNodeID(currentNode.decoded[1]);\\n currentKeyIncrement = sharedNibbleLength;\\n continue;\\n }\\n } else {\\n revert(\\\"Received a node with an unknown prefix\\\");\\n }\\n } else {\\n revert(\\\"Received an unparseable node.\\\");\\n }\\n }\\n\\n // If our node ID is NULL, then we're at a dead end.\\n bool isFinalNode = currentNodeID == bytes32(RLP_NULL);\\n return (pathLength, Lib_BytesUtils.slice(key, currentKeyIndex), isFinalNode);\\n }\\n\\n /**\\n * @notice Creates new nodes to support a k/v pair insertion into a given\\n * Merkle trie path.\\n * @param _path Path to the node nearest the k/v pair.\\n * @param _pathLength Length of the path. Necessary because the provided\\n * path may include additional nodes (e.g., it comes directly from a proof)\\n * and we can't resize in-memory arrays without costly duplication.\\n * @param _keyRemainder Portion of the initial key that must be inserted\\n * into the trie.\\n * @param _value Value to insert at the given key.\\n * @return _newPath A new path with the inserted k/v pair and extra supporting nodes.\\n */\\n function _getNewPath(\\n TrieNode[] memory _path,\\n uint256 _pathLength,\\n bytes memory _keyRemainder,\\n bytes memory _value\\n )\\n private\\n pure\\n returns (\\n TrieNode[] memory _newPath\\n )\\n {\\n bytes memory keyRemainder = _keyRemainder;\\n\\n // Most of our logic depends on the status of the last node in the path.\\n TrieNode memory lastNode = _path[_pathLength - 1];\\n NodeType lastNodeType = _getNodeType(lastNode);\\n\\n // Create an array for newly created nodes.\\n // We need up to three new nodes, depending on the contents of the last node.\\n // Since array resizing is expensive, we'll keep track of the size manually.\\n // We're using an explicit `totalNewNodes += 1` after insertions for clarity.\\n TrieNode[] memory newNodes = new TrieNode[](3);\\n uint256 totalNewNodes = 0;\\n\\n if (keyRemainder.length == 0 && lastNodeType == NodeType.LeafNode) {\\n // We've found a leaf node with the given key.\\n // Simply need to update the value of the node to match.\\n newNodes[totalNewNodes] = _makeLeafNode(_getNodeKey(lastNode), _value);\\n totalNewNodes += 1;\\n } else if (lastNodeType == NodeType.BranchNode) {\\n if (keyRemainder.length == 0) {\\n // We've found a branch node with the given key.\\n // Simply need to update the value of the node to match.\\n newNodes[totalNewNodes] = _editBranchValue(lastNode, _value);\\n totalNewNodes += 1;\\n } else {\\n // We've found a branch node, but it doesn't contain our key.\\n // Reinsert the old branch for now.\\n newNodes[totalNewNodes] = lastNode;\\n totalNewNodes += 1;\\n // Create a new leaf node, slicing our remainder since the first byte points\\n // to our branch node.\\n newNodes[totalNewNodes] = _makeLeafNode(Lib_BytesUtils.slice(keyRemainder, 1), _value);\\n totalNewNodes += 1;\\n }\\n } else {\\n // Our last node is either an extension node or a leaf node with a different key.\\n bytes memory lastNodeKey = _getNodeKey(lastNode);\\n uint256 sharedNibbleLength = _getSharedNibbleLength(lastNodeKey, keyRemainder);\\n\\n if (sharedNibbleLength != 0) {\\n // We've got some shared nibbles between the last node and our key remainder.\\n // We'll need to insert an extension node that covers these shared nibbles.\\n bytes memory nextNodeKey = Lib_BytesUtils.slice(lastNodeKey, 0, sharedNibbleLength);\\n newNodes[totalNewNodes] = _makeExtensionNode(nextNodeKey, _getNodeHash(_value));\\n totalNewNodes += 1;\\n\\n // Cut down the keys since we've just covered these shared nibbles.\\n lastNodeKey = Lib_BytesUtils.slice(lastNodeKey, sharedNibbleLength);\\n keyRemainder = Lib_BytesUtils.slice(keyRemainder, sharedNibbleLength);\\n }\\n\\n // Create an empty branch to fill in.\\n TrieNode memory newBranch = _makeEmptyBranchNode();\\n\\n if (lastNodeKey.length == 0) {\\n // Key remainder was larger than the key for our last node.\\n // The value within our last node is therefore going to be shifted into\\n // a branch value slot.\\n newBranch = _editBranchValue(newBranch, _getNodeValue(lastNode));\\n } else {\\n // Last node key was larger than the key remainder.\\n // We're going to modify some index of our branch.\\n uint8 branchKey = uint8(lastNodeKey[0]);\\n // Move on to the next nibble.\\n lastNodeKey = Lib_BytesUtils.slice(lastNodeKey, 1);\\n\\n if (lastNodeType == NodeType.LeafNode) {\\n // We're dealing with a leaf node.\\n // We'll modify the key and insert the old leaf node into the branch index.\\n TrieNode memory modifiedLastNode = _makeLeafNode(lastNodeKey, _getNodeValue(lastNode));\\n newBranch = _editBranchIndex(newBranch, branchKey, _getNodeHash(modifiedLastNode.encoded));\\n } else if (lastNodeKey.length != 0) {\\n // We're dealing with a shrinking extension node.\\n // We need to modify the node to decrease the size of the key.\\n TrieNode memory modifiedLastNode = _makeExtensionNode(lastNodeKey, _getNodeValue(lastNode));\\n newBranch = _editBranchIndex(newBranch, branchKey, _getNodeHash(modifiedLastNode.encoded));\\n } else {\\n // We're dealing with an unnecessary extension node.\\n // We're going to delete the node entirely.\\n // Simply insert its current value into the branch index.\\n newBranch = _editBranchIndex(newBranch, branchKey, _getNodeValue(lastNode));\\n }\\n }\\n\\n if (keyRemainder.length == 0) {\\n // We've got nothing left in the key remainder.\\n // Simply insert the value into the branch value slot.\\n newBranch = _editBranchValue(newBranch, _value);\\n // Push the branch into the list of new nodes.\\n newNodes[totalNewNodes] = newBranch;\\n totalNewNodes += 1;\\n } else {\\n // We've got some key remainder to work with.\\n // We'll be inserting a leaf node into the trie.\\n // First, move on to the next nibble.\\n keyRemainder = Lib_BytesUtils.slice(keyRemainder, 1);\\n // Push the branch into the list of new nodes.\\n newNodes[totalNewNodes] = newBranch;\\n totalNewNodes += 1;\\n // Push a new leaf node for our k/v pair.\\n newNodes[totalNewNodes] = _makeLeafNode(keyRemainder, _value);\\n totalNewNodes += 1;\\n }\\n }\\n\\n // Finally, join the old path with our newly created nodes.\\n // Since we're overwriting the last node in the path, we use `_pathLength - 1`.\\n return _joinNodeArrays(_path, _pathLength - 1, newNodes, totalNewNodes);\\n }\\n\\n /**\\n * @notice Computes the trie root from a given path.\\n * @param _nodes Path to some k/v pair.\\n * @param _key Key for the k/v pair.\\n * @return _updatedRoot Root hash for the updated trie.\\n */\\n function _getUpdatedTrieRoot(\\n TrieNode[] memory _nodes,\\n bytes memory _key\\n )\\n private\\n pure\\n returns (\\n bytes32 _updatedRoot\\n )\\n {\\n bytes memory key = Lib_BytesUtils.toNibbles(_key);\\n\\n // Some variables to keep track of during iteration.\\n TrieNode memory currentNode;\\n NodeType currentNodeType;\\n bytes memory previousNodeHash;\\n\\n // Run through the path backwards to rebuild our root hash.\\n for (uint256 i = _nodes.length; i > 0; i--) {\\n // Pick out the current node.\\n currentNode = _nodes[i - 1];\\n currentNodeType = _getNodeType(currentNode);\\n\\n if (currentNodeType == NodeType.LeafNode) {\\n // Leaf nodes are already correctly encoded.\\n // Shift the key over to account for the nodes key.\\n bytes memory nodeKey = _getNodeKey(currentNode);\\n key = Lib_BytesUtils.slice(key, 0, key.length - nodeKey.length);\\n } else if (currentNodeType == NodeType.ExtensionNode) {\\n // Shift the key over to account for the nodes key.\\n bytes memory nodeKey = _getNodeKey(currentNode);\\n key = Lib_BytesUtils.slice(key, 0, key.length - nodeKey.length);\\n\\n // If this node is the last element in the path, it'll be correctly encoded\\n // and we can skip this part.\\n if (previousNodeHash.length > 0) {\\n // Re-encode the node based on the previous node.\\n currentNode = _makeExtensionNode(nodeKey, previousNodeHash);\\n }\\n } else if (currentNodeType == NodeType.BranchNode) {\\n // If this node is the last element in the path, it'll be correctly encoded\\n // and we can skip this part.\\n if (previousNodeHash.length > 0) {\\n // Re-encode the node based on the previous node.\\n uint8 branchKey = uint8(key[key.length - 1]);\\n key = Lib_BytesUtils.slice(key, 0, key.length - 1);\\n currentNode = _editBranchIndex(currentNode, branchKey, previousNodeHash);\\n }\\n }\\n\\n // Compute the node hash for the next iteration.\\n previousNodeHash = _getNodeHash(currentNode.encoded);\\n }\\n\\n // Current node should be the root at this point.\\n // Simply return the hash of its encoding.\\n return keccak256(currentNode.encoded);\\n }\\n\\n /**\\n * @notice Parses an RLP-encoded proof into something more useful.\\n * @param _proof RLP-encoded proof to parse.\\n * @return _parsed Proof parsed into easily accessible structs.\\n */\\n function _parseProof(\\n bytes memory _proof\\n )\\n private\\n pure\\n returns (\\n TrieNode[] memory _parsed\\n )\\n {\\n Lib_RLPReader.RLPItem[] memory nodes = Lib_RLPReader.readList(_proof);\\n TrieNode[] memory proof = new TrieNode[](nodes.length);\\n\\n for (uint256 i = 0; i < nodes.length; i++) {\\n bytes memory encoded = Lib_RLPReader.readBytes(nodes[i]);\\n proof[i] = TrieNode({\\n encoded: encoded,\\n decoded: Lib_RLPReader.readList(encoded)\\n });\\n }\\n\\n return proof;\\n }\\n\\n /**\\n * @notice Picks out the ID for a node. Node ID is referred to as the\\n * \\\"hash\\\" within the specification, but nodes < 32 bytes are not actually\\n * hashed.\\n * @param _node Node to pull an ID for.\\n * @return _nodeID ID for the node, depending on the size of its contents.\\n */\\n function _getNodeID(\\n Lib_RLPReader.RLPItem memory _node\\n )\\n private\\n pure\\n returns (\\n bytes32 _nodeID\\n )\\n {\\n bytes memory nodeID;\\n\\n if (_node.length < 32) {\\n // Nodes smaller than 32 bytes are RLP encoded.\\n nodeID = Lib_RLPReader.readRawBytes(_node);\\n } else {\\n // Nodes 32 bytes or larger are hashed.\\n nodeID = Lib_RLPReader.readBytes(_node);\\n }\\n\\n return Lib_BytesUtils.toBytes32(nodeID);\\n }\\n\\n /**\\n * @notice Gets the path for a leaf or extension node.\\n * @param _node Node to get a path for.\\n * @return _path Node path, converted to an array of nibbles.\\n */\\n function _getNodePath(\\n TrieNode memory _node\\n )\\n private\\n pure\\n returns (\\n bytes memory _path\\n )\\n {\\n return Lib_BytesUtils.toNibbles(Lib_RLPReader.readBytes(_node.decoded[0]));\\n }\\n\\n /**\\n * @notice Gets the key for a leaf or extension node. Keys are essentially\\n * just paths without any prefix.\\n * @param _node Node to get a key for.\\n * @return _key Node key, converted to an array of nibbles.\\n */\\n function _getNodeKey(\\n TrieNode memory _node\\n )\\n private\\n pure\\n returns (\\n bytes memory _key\\n )\\n {\\n return _removeHexPrefix(_getNodePath(_node));\\n }\\n\\n /**\\n * @notice Gets the path for a node.\\n * @param _node Node to get a value for.\\n * @return _value Node value, as hex bytes.\\n */\\n function _getNodeValue(\\n TrieNode memory _node\\n )\\n private\\n pure\\n returns (\\n bytes memory _value\\n )\\n {\\n return Lib_RLPReader.readBytes(_node.decoded[_node.decoded.length - 1]);\\n }\\n\\n /**\\n * @notice Computes the node hash for an encoded node. Nodes < 32 bytes\\n * are not hashed, all others are keccak256 hashed.\\n * @param _encoded Encoded node to hash.\\n * @return _hash Hash of the encoded node. Simply the input if < 32 bytes.\\n */\\n function _getNodeHash(\\n bytes memory _encoded\\n )\\n private\\n pure\\n returns (\\n bytes memory _hash\\n )\\n {\\n if (_encoded.length < 32) {\\n return _encoded;\\n } else {\\n return abi.encodePacked(keccak256(_encoded));\\n }\\n }\\n\\n /**\\n * @notice Determines the type for a given node.\\n * @param _node Node to determine a type for.\\n * @return _type Type of the node; BranchNode/ExtensionNode/LeafNode.\\n */\\n function _getNodeType(\\n TrieNode memory _node\\n )\\n private\\n pure\\n returns (\\n NodeType _type\\n )\\n {\\n if (_node.decoded.length == BRANCH_NODE_LENGTH) {\\n return NodeType.BranchNode;\\n } else if (_node.decoded.length == LEAF_OR_EXTENSION_NODE_LENGTH) {\\n bytes memory path = _getNodePath(_node);\\n uint8 prefix = uint8(path[0]);\\n\\n if (prefix == PREFIX_LEAF_EVEN || prefix == PREFIX_LEAF_ODD) {\\n return NodeType.LeafNode;\\n } else if (prefix == PREFIX_EXTENSION_EVEN || prefix == PREFIX_EXTENSION_ODD) {\\n return NodeType.ExtensionNode;\\n }\\n }\\n\\n revert(\\\"Invalid node type\\\");\\n }\\n\\n /**\\n * @notice Utility; determines the number of nibbles shared between two\\n * nibble arrays.\\n * @param _a First nibble array.\\n * @param _b Second nibble array.\\n * @return _shared Number of shared nibbles.\\n */\\n function _getSharedNibbleLength(\\n bytes memory _a,\\n bytes memory _b\\n )\\n private\\n pure\\n returns (\\n uint256 _shared\\n )\\n {\\n uint256 i = 0;\\n while (_a.length > i && _b.length > i && _a[i] == _b[i]) {\\n i++;\\n }\\n return i;\\n }\\n\\n /**\\n * @notice Utility; converts an RLP-encoded node into our nice struct.\\n * @param _raw RLP-encoded node to convert.\\n * @return _node Node as a TrieNode struct.\\n */\\n function _makeNode(\\n bytes[] memory _raw\\n )\\n private\\n pure\\n returns (\\n TrieNode memory _node\\n )\\n {\\n bytes memory encoded = Lib_RLPWriter.writeList(_raw);\\n\\n return TrieNode({\\n encoded: encoded,\\n decoded: Lib_RLPReader.readList(encoded)\\n });\\n }\\n\\n /**\\n * @notice Utility; converts an RLP-decoded node into our nice struct.\\n * @param _items RLP-decoded node to convert.\\n * @return _node Node as a TrieNode struct.\\n */\\n function _makeNode(\\n Lib_RLPReader.RLPItem[] memory _items\\n )\\n private\\n pure\\n returns (\\n TrieNode memory _node\\n )\\n {\\n bytes[] memory raw = new bytes[](_items.length);\\n for (uint256 i = 0; i < _items.length; i++) {\\n raw[i] = Lib_RLPReader.readRawBytes(_items[i]);\\n }\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Creates a new extension node.\\n * @param _key Key for the extension node, unprefixed.\\n * @param _value Value for the extension node.\\n * @return _node New extension node with the given k/v pair.\\n */\\n function _makeExtensionNode(\\n bytes memory _key,\\n bytes memory _value\\n )\\n private\\n pure\\n returns (\\n TrieNode memory _node\\n )\\n {\\n bytes[] memory raw = new bytes[](2);\\n bytes memory key = _addHexPrefix(_key, false);\\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\\n raw[1] = Lib_RLPWriter.writeBytes(_value);\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Creates a new leaf node.\\n * @dev This function is essentially identical to `_makeExtensionNode`.\\n * Although we could route both to a single method with a flag, it's\\n * more gas efficient to keep them separate and duplicate the logic.\\n * @param _key Key for the leaf node, unprefixed.\\n * @param _value Value for the leaf node.\\n * @return _node New leaf node with the given k/v pair.\\n */\\n function _makeLeafNode(\\n bytes memory _key,\\n bytes memory _value\\n )\\n private\\n pure\\n returns (\\n TrieNode memory _node\\n )\\n {\\n bytes[] memory raw = new bytes[](2);\\n bytes memory key = _addHexPrefix(_key, true);\\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\\n raw[1] = Lib_RLPWriter.writeBytes(_value);\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Creates an empty branch node.\\n * @return _node Empty branch node as a TrieNode struct.\\n */\\n function _makeEmptyBranchNode()\\n private\\n pure\\n returns (\\n TrieNode memory _node\\n )\\n {\\n bytes[] memory raw = new bytes[](BRANCH_NODE_LENGTH);\\n for (uint256 i = 0; i < raw.length; i++) {\\n raw[i] = RLP_NULL_BYTES;\\n }\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Modifies the value slot for a given branch.\\n * @param _branch Branch node to modify.\\n * @param _value Value to insert into the branch.\\n * @return _updatedNode Modified branch node.\\n */\\n function _editBranchValue(\\n TrieNode memory _branch,\\n bytes memory _value\\n )\\n private\\n pure\\n returns (\\n TrieNode memory _updatedNode\\n )\\n {\\n bytes memory encoded = Lib_RLPWriter.writeBytes(_value);\\n _branch.decoded[_branch.decoded.length - 1] = Lib_RLPReader.toRLPItem(encoded);\\n return _makeNode(_branch.decoded);\\n }\\n\\n /**\\n * @notice Modifies a slot at an index for a given branch.\\n * @param _branch Branch node to modify.\\n * @param _index Slot index to modify.\\n * @param _value Value to insert into the slot.\\n * @return _updatedNode Modified branch node.\\n */\\n function _editBranchIndex(\\n TrieNode memory _branch,\\n uint8 _index,\\n bytes memory _value\\n )\\n private\\n pure\\n returns (\\n TrieNode memory _updatedNode\\n )\\n {\\n bytes memory encoded = _value.length < 32 ? _value : Lib_RLPWriter.writeBytes(_value);\\n _branch.decoded[_index] = Lib_RLPReader.toRLPItem(encoded);\\n return _makeNode(_branch.decoded);\\n }\\n\\n /**\\n * @notice Utility; adds a prefix to a key.\\n * @param _key Key to prefix.\\n * @param _isLeaf Whether or not the key belongs to a leaf.\\n * @return _prefixedKey Prefixed key.\\n */\\n function _addHexPrefix(\\n bytes memory _key,\\n bool _isLeaf\\n )\\n private\\n pure\\n returns (\\n bytes memory _prefixedKey\\n )\\n {\\n uint8 prefix = _isLeaf ? uint8(0x02) : uint8(0x00);\\n uint8 offset = uint8(_key.length % 2);\\n bytes memory prefixed = new bytes(2 - offset);\\n prefixed[0] = bytes1(prefix + offset);\\n return abi.encodePacked(prefixed, _key);\\n }\\n\\n /**\\n * @notice Utility; removes a prefix from a path.\\n * @param _path Path to remove the prefix from.\\n * @return _unprefixedKey Unprefixed key.\\n */\\n function _removeHexPrefix(\\n bytes memory _path\\n )\\n private\\n pure\\n returns (\\n bytes memory _unprefixedKey\\n )\\n {\\n if (uint8(_path[0]) % 2 == 0) {\\n return Lib_BytesUtils.slice(_path, 2);\\n } else {\\n return Lib_BytesUtils.slice(_path, 1);\\n }\\n }\\n\\n /**\\n * @notice Utility; combines two node arrays. Array lengths are required\\n * because the actual lengths may be longer than the filled lengths.\\n * Array resizing is extremely costly and should be avoided.\\n * @param _a First array to join.\\n * @param _aLength Length of the first array.\\n * @param _b Second array to join.\\n * @param _bLength Length of the second array.\\n * @return _joined Combined node array.\\n */\\n function _joinNodeArrays(\\n TrieNode[] memory _a,\\n uint256 _aLength,\\n TrieNode[] memory _b,\\n uint256 _bLength\\n )\\n private\\n pure\\n returns (\\n TrieNode[] memory _joined\\n )\\n {\\n TrieNode[] memory ret = new TrieNode[](_aLength + _bLength);\\n\\n // Copy elements from the first array.\\n for (uint256 i = 0; i < _aLength; i++) {\\n ret[i] = _a[i];\\n }\\n\\n // Copy elements from the second array.\\n for (uint256 i = 0; i < _bLength; i++) {\\n ret[i + _aLength] = _b[i];\\n }\\n\\n return ret;\\n }\\n}\\n\",\"keccak256\":\"0x161f65220b8c5cf295232f8c58c2744fbc898bf77da5f9d9c5b2dd673dafc6f6\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/trie/Lib_SecureMerkleTrie.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_MerkleTrie } from \\\"./Lib_MerkleTrie.sol\\\";\\n\\n/**\\n * @title Lib_SecureMerkleTrie\\n */\\nlibrary Lib_SecureMerkleTrie {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * @notice Verifies a proof that a given key/value pair is present in the\\n * Merkle trie.\\n * @param _key Key of the node to search for, as a hex string.\\n * @param _value Value of the node to search for, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the desired node. Unlike\\n * traditional Merkle trees, this proof is executed top-down and consists\\n * of a list of RLP-encoded nodes that make a path down to the target node.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _verified `true` if the k/v pair exists in the trie, `false` otherwise.\\n */\\n function verifyInclusionProof(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bool _verified\\n )\\n {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.verifyInclusionProof(key, _value, _proof, _root);\\n }\\n\\n /**\\n * @notice Verifies a proof that a given key is *not* present in\\n * the Merkle trie.\\n * @param _key Key of the node to search for, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\\n * target node.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _verified `true` if the key is not present in the trie, `false` otherwise.\\n */\\n function verifyExclusionProof(\\n bytes memory _key,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bool _verified\\n )\\n {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.verifyExclusionProof(key, _proof, _root);\\n }\\n\\n /**\\n * @notice Updates a Merkle trie and returns a new root hash.\\n * @param _key Key of the node to update, as a hex string.\\n * @param _value Value of the node to update, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\\n * target node. If the key exists, we can simply update the value.\\n * Otherwise, we need to modify the trie to handle the new k/v pair.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _updatedRoot Root hash of the newly constructed trie.\\n */\\n function update(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bytes32 _updatedRoot\\n )\\n {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.update(key, _value, _proof, _root);\\n }\\n\\n /**\\n * @notice Retrieves the value associated with a given key.\\n * @param _key Key to search for, as hex bytes.\\n * @param _proof Merkle trie inclusion proof for the key.\\n * @param _root Known root of the Merkle trie.\\n * @return _exists Whether or not the key exists.\\n * @return _value Value of the key if it exists.\\n */\\n function get(\\n bytes memory _key,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bool _exists,\\n bytes memory _value\\n )\\n {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.get(key, _proof, _root);\\n }\\n\\n /**\\n * Computes the root hash for a trie with a single node.\\n * @param _key Key for the single node.\\n * @param _value Value for the single node.\\n * @return _updatedRoot Hash of the trie.\\n */\\n function getSingleNodeRootHash(\\n bytes memory _key,\\n bytes memory _value\\n )\\n internal\\n pure\\n returns (\\n bytes32 _updatedRoot\\n )\\n {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.getSingleNodeRootHash(key, _value);\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Computes the secure counterpart to a key.\\n * @param _key Key to get a secure key from.\\n * @return _secureKey Secure version of the key.\\n */\\n function _getSecureKey(\\n bytes memory _key\\n )\\n private\\n pure\\n returns (\\n bytes memory _secureKey\\n )\\n {\\n return abi.encodePacked(keccak256(_key));\\n }\\n}\",\"keccak256\":\"0x79355346f74bb1eb9eeb733cb5d9677d50115c4f390307cbf608fe071a1ada0c\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_Bytes32Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_Byte32Utils\\n */\\nlibrary Lib_Bytes32Utils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \\\"true.\\\"\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as a boolean.\\n */\\n function toBool(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return _in != 0;\\n }\\n\\n /**\\n * Converts a boolean to a bytes32 value.\\n * @param _in Input boolean value.\\n * @return Boolean as a bytes32.\\n */\\n function fromBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in ? 1 : 0));\\n }\\n\\n /**\\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as an address.\\n */\\n function toAddress(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return address(uint160(uint256(_in)));\\n }\\n\\n /**\\n * Converts an address to a bytes32.\\n * @param _in Input address value.\\n * @return Address as a bytes32.\\n */\\n function fromAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in));\\n }\\n\\n /**\\n * Removes the leading zeros from a bytes32 value and returns a new (smaller) bytes value.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 without any leading zeros.\\n */\\n function removeLeadingZeros(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out;\\n\\n assembly {\\n // Figure out how many leading zero bytes to remove.\\n let shift := 0\\n for { let i := 0 } and(lt(i, 32), eq(byte(i, _in), 0)) { i := add(i, 1) } {\\n shift := add(shift, 1)\\n }\\n\\n // Reserve some space for our output and fix the free memory pointer.\\n out := mload(0x40)\\n mstore(0x40, add(out, 0x40))\\n\\n // Shift the value and store it into the output bytes.\\n mstore(add(out, 0x20), shl(mul(shift, 8), _in))\\n\\n // Store the new size (with leading zero bytes removed) in the output byte size.\\n mstore(out, sub(32, shift))\\n }\\n\\n return out;\\n }\\n}\\n\",\"keccak256\":\"0xfa2def593e3fc56a31852c3744aefdaa93cec74e721bfcfeb1e5d166c7c60b64\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_BytesUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_BytesUtils\\n */\\nlibrary Lib_BytesUtils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_start + _length >= _start, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n if (_bytes.length - _start == 0) {\\n return bytes('');\\n }\\n\\n return slice(_bytes, _start, _bytes.length - _start);\\n }\\n\\n function toBytes32PadLeft(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n bytes32 ret;\\n uint256 len = _bytes.length <= 32 ? _bytes.length : 32;\\n assembly {\\n ret := shr(mul(sub(32, len), 8), mload(add(_bytes, 32)))\\n }\\n return ret;\\n }\\n\\n function toBytes32(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n if (_bytes.length < 32) {\\n bytes32 ret;\\n assembly {\\n ret := mload(add(_bytes, 32))\\n }\\n return ret;\\n }\\n\\n return abi.decode(_bytes,(bytes32)); // will truncate if input length > 32 bytes\\n }\\n\\n function toUint256(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return uint256(toBytes32(_bytes));\\n }\\n\\n function toUint24(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n uint24\\n )\\n {\\n require(_start + 3 >= _start, \\\"toUint24_overflow\\\");\\n require(_bytes.length >= _start + 3 , \\\"toUint24_outOfBounds\\\");\\n uint24 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x3), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toUint8(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n uint8\\n )\\n {\\n require(_start + 1 >= _start, \\\"toUint8_overflow\\\");\\n require(_bytes.length >= _start + 1 , \\\"toUint8_outOfBounds\\\");\\n uint8 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x1), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toAddress(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n require(_start + 20 >= _start, \\\"toAddress_overflow\\\");\\n require(_bytes.length >= _start + 20, \\\"toAddress_outOfBounds\\\");\\n address tempAddress;\\n\\n assembly {\\n tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000)\\n }\\n\\n return tempAddress;\\n }\\n\\n function toNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory nibbles = new bytes(_bytes.length * 2);\\n\\n for (uint256 i = 0; i < _bytes.length; i++) {\\n nibbles[i * 2] = _bytes[i] >> 4;\\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\\n }\\n\\n return nibbles;\\n }\\n\\n function fromNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory ret = new bytes(_bytes.length / 2);\\n\\n for (uint256 i = 0; i < ret.length; i++) {\\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\\n }\\n\\n return ret;\\n }\\n\\n function equal(\\n bytes memory _bytes,\\n bytes memory _other\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return keccak256(_bytes) == keccak256(_other);\\n }\\n}\\n\",\"keccak256\":\"0xa5195afe32fb2cf104d156e8f4bd39df1ec79bf6ba232097b9e8e0ee14fbc298\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x6080604052600580546001600160a01b03191661dead17905534801561002457600080fd5b506001600055600680546001600160a01b03191690556126a9806100496000396000f3fe608060405234801561001057600080fd5b50600436106100a95760003560e01c8063706ceab611610071578063706ceab61461011c57806382e3702d1461012f578063b1b1b20914610142578063c4d66de814610155578063d7fd19dd14610168578063ecc704281461017b576100a9565b806321d800ec146100ae578063299ca478146100d75780633dbb202b146100ec578063461a4478146101015780636e296e4514610114575b600080fd5b6100c16100bc3660046120ea565b610190565b6040516100ce9190612300565b60405180910390f35b6100df6101a5565b6040516100ce9190612288565b6100ff6100fa36600461206e565b6101b4565b005b6100df61010f366004612102565b610243565b6100df61031f565b6100ff61012a366004611ff7565b610368565b6100c161013d3660046120ea565b6103cf565b6100c16101503660046120ea565b6103e4565b6100ff610163366004611eae565b6103f9565b6100ff610176366004611ec8565b61044f565b61018361070c565b6040516100ce91906121d1565b60016020526000908152604090205460ff1681565b6006546001600160a01b031681565b60006101c4843385600454610712565b60048054600190810190915581516020808401919091206000908152600390915260409020805460ff1916909117905590506102068163ffffffff841661075f565b7f0ee9ffdb2334d78de97ffb066b23a352a4d35180cefb36589d663fbb1eb6f326816040516102359190612382565b60405180910390a150505050565b60065460405163bf40fac160e01b81526020600482018181528451602484015284516000946001600160a01b03169363bf40fac1938793928392604401918501908083838b5b838110156102a1578181015183820152602001610289565b50505050905090810190601f1680156102ce5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b1580156102eb57600080fd5b505afa1580156102ff573d6000803e3d6000fd5b505050506040513d602081101561031557600080fd5b505190505b919050565b6005546000906001600160a01b031661dead14156103585760405162461bcd60e51b815260040161034f90612395565b60405180910390fd5b506005546001600160a01b031690565b600061037686868686610712565b805160208083019190912060009081526003909152604090205490915060ff1615156001146103b75760405162461bcd60e51b815260040161034f9061248a565b6103c7818363ffffffff1661075f565b505050505050565b60036020526000908152604090205460ff1681565b60026020526000908152604090205460ff1681565b6006546001600160a01b0316156104225760405162461bcd60e51b815260040161034f90612572565b600680546001600160a01b039092166001600160a01b03199283161790556005805490911661dead179055565b600260005414156104a7576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6002600090815560408051808201909152601481527327ab26afa61926b2b9b9b0b3b2a932b630bcb2b960611b60208201526104e290610243565b90506001600160a01b0381161561051b57336001600160a01b0382161461051b5760405162461bcd60e51b815260040161034f906124d5565b600061052987878787610712565b90506105358184610837565b15156001146105565760405162461bcd60e51b815260040161034f9061252b565b80516020808301919091206000818152600290925260409091205460ff16156105915760405162461bcd60e51b815260040161034f906123cc565b600580546001600160a01b0319166001600160a01b03898116919091179091556040516000918a16906105c59089906121e8565b6000604051808303816000865af19150503d8060008114610602576040519150601f19603f3d011682016040523d82523d6000602084013e610607565b606091505b5050600580546001600160a01b03191661dead1790559050801515600114156106805760008281526002602052604090819020805460ff19166001179055517f4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c906106739084906121d1565b60405180910390a16106b8565b7f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f826040516106af91906121d1565b60405180910390a15b60008333436040516020016106cf93929190612236565b60408051601f1981840301815291815281516020928301206000908152600192839052908120805460ff1916831790555550505050505050505050565b60045481565b60608484848460405160240161072b949392919061229c565b60408051601f198184030181529190526020810180516001600160e01b031663cbd4ece960e01b1790529050949350505050565b61079d6040518060400160405280601d81526020017f4f564d5f43616e6f6e6963616c5472616e73616374696f6e436861696e000000815250610243565b6001600160a01b0316636fee07e06107e96040518060400160405280601a81526020017f4f564d5f4c3243726f7373446f6d61696e4d657373656e676572000000000000815250610243565b83856040518463ffffffff1660e01b8152600401610809939291906122d9565b600060405180830381600087803b15801561082357600080fd5b505af11580156103c7573d6000803e3d6000fd5b60006108428261085c565b8015610853575061085383836109b9565b90505b92915050565b60008061089d6040518060400160405280601881526020017f4f564d5f5374617465436f6d6d69746d656e74436861696e0000000000000000815250610243565b6020840151604051639418bddd60e01b81529192506001600160a01b03831691639418bddd916108cf916004016125bc565b60206040518083038186803b1580156108e757600080fd5b505afa1580156108fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061091f91906120ca565b1580156109b25750825160208401516040808601519051634d69ee5760e01b81526001600160a01b03851693634d69ee579361096293919290919060040161230b565b60206040518083038186803b15801561097a57600080fd5b505afa15801561098e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109b291906120ca565b9392505050565b600080836109fb6040518060400160405280601a81526020017f4f564d5f4c3243726f7373446f6d61696e4d657373656e676572000000000000815250610243565b604051602001610a0c929190612204565b604051602081830303815290604052805190602001206000604051602001610a359291906121da565b604051602081830303815290604052805190602001209050600080610a84602160991b604051602001610a6891906121b9565b60408051601f1981840301815291905260608701518751610b16565b9092509050600182151514610aab5760405162461bcd60e51b815260040161034f90612417565b6000610ab682610b3f565b9050610b0b84604051602001610acc91906121d1565b6040516020818303038152906040526001604051602001610aed9190612270565b60405160208183030381529060405288608001518460400151610bd1565b979650505050505050565b600060606000610b2586610bf5565b9050610b32818686610c25565b9250925050935093915050565b610b47611c64565b6000610b5283610cf8565b90506040518060800160405280610b7c83600081518110610b6f57fe5b6020026020010151610d0b565b8152602001610b9183600181518110610b6f57fe5b8152602001610bb383600281518110610ba657fe5b6020026020010151610d12565b8152602001610bc883600381518110610ba657fe5b90529392505050565b600080610bdd86610bf5565b9050610beb81868686610e0b565b9695505050505050565b60608180519060200120604051602001610c0f91906121d1565b6040516020818303038152906040529050919050565b600060606000610c3485610e31565b90506000806000610c46848a89610f08565b81519295509093509150158080610c5a5750815b610cab576040805162461bcd60e51b815260206004820152601a60248201527f50726f76696465642070726f6f6620697320696e76616c69642e000000000000604482015290519081900360640190fd5b600081610cc75760405180602001604052806000815250610ce6565b610ce6866001870381518110610cd957fe5b60200260200101516112ab565b919b919a509098505050505050505050565b6060610856610d06836112c7565b6112ec565b6000610856825b6000602182600001511115610d6e576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e000000000000604482015290519081900360640190fd5b6000806000610d7c85611462565b919450925090506000816001811115610d9157fe5b14610de3576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e000000000000604482015290519081900360640190fd5b602080860151840180519091841015610beb5760208490036101000a90049695505050505050565b6000806000610e1b878686610c25565b91509150818015610b0b5750610b0b868261178b565b60606000610e3e83610cf8565b90506000815167ffffffffffffffff81118015610e5a57600080fd5b50604051908082528060200260200182016040528015610e9457816020015b610e81611c8b565b815260200190600190039081610e795790505b50905060005b8251811015610f00576000610ec1848381518110610eb457fe5b60200260200101516117a1565b90506040518060400160405280828152602001610edd83610cf8565b815250838381518110610eec57fe5b602090810291909101015250600101610e9a565b509392505050565b60006060818080610f1887611830565b905085600080610f26611c8b565b60005b8c51811015611283578c8181518110610f3e57fe5b6020026020010151915082840193506001870196508360001415610fb257815180516020909101208514610fad576040805162461bcd60e51b8152602060048201526011602482015270092dcecc2d8d2c840e4dedee840d0c2e6d607b1b604482015290519081900360640190fd5b611079565b81515160201161101957815180516020909101208514610fad576040805162461bcd60e51b815260206004820152601b60248201527f496e76616c6964206c6172676520696e7465726e616c20686173680000000000604482015290519081900360640190fd5b84611027836000015161192d565b14611079576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420696e7465726e616c206e6f64652068617368000000000000604482015290519081900360640190fd5b602082015151601114156110e857855184141561109557611283565b60008685815181106110a357fe5b602001015160f81c60f81b60f81c9050600083602001518260ff16815181106110c857fe5b602002602001015190506110db81611959565b965060019450505061127b565b6002826020015151141561122e5760006111018361198f565b905060008160008151811061111257fe5b016020015160f81c90506001811660020360006111328460ff84166119ad565b905060006111408b8a6119ad565b9050600061114e83836119de565b905060ff851660021480611165575060ff85166003145b156111975780835114801561117a5750808251145b1561118457988901985b50600160ff1b9950611283945050505050565b60ff851615806111aa575060ff85166001145b156111f757806111c75750600160ff1b9950611283945050505050565b6111e888602001516001815181106111db57fe5b6020026020010151611959565b9a50975061127b945050505050565b60405162461bcd60e51b815260040180806020018281038252602681526020018061264e6026913960400191505060405180910390fd5b6040805162461bcd60e51b815260206004820152601d60248201527f526563656976656420616e20756e706172736561626c65206e6f64652e000000604482015290519081900360640190fd5b600101610f29565b50600160ff1b84148661129687866119ad565b909e909d50909b509950505050505050505050565b60208101518051606091610856916000198101908110610eb457fe5b6112cf611ca5565b506040805180820190915281518152602082810190820152919050565b60606000806112fa84611462565b9193509091506001905081600181111561131057fe5b14611362576040805162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c50206c6973742076616c75652e000000000000000000604482015290519081900360640190fd5b6040805160208082526104208201909252600091816020015b611383611ca5565b81526020019060019003908161137b5790505090506000835b865181101561145757602082106113e45760405162461bcd60e51b815260040180806020018281038252602a815260200180612624602a913960400191505060405180910390fd5b6000806114106040518060400160405280858c60000151038152602001858c6020015101815250611462565b509150915060405180604001604052808383018152602001848b602001510181525085858151811061143e57fe5b602090810291909101015260019390930192010161139c565b508152949350505050565b6000806000808460000151116114bf576040805162461bcd60e51b815260206004820152601860248201527f524c50206974656d2063616e6e6f74206265206e756c6c2e0000000000000000604482015290519081900360640190fd5b6020840151805160001a607f81116114e4576000600160009450945094505050611784565b60b78111611559578551607f198201908110611547576040805162461bcd60e51b815260206004820152601960248201527f496e76616c696420524c502073686f727420737472696e672e00000000000000604482015290519081900360640190fd5b60019550935060009250611784915050565b60bf811161163d57855160b61982019081106115bc576040805162461bcd60e51b815260206004820152601f60248201527f496e76616c696420524c50206c6f6e6720737472696e67206c656e6774682e00604482015290519081900360640190fd5b6000816020036101000a6001850151049050808201886000015111611628576040805162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c50206c6f6e6720737472696e672e0000000000000000604482015290519081900360640190fd5b60019091019550935060009250611784915050565b60f781116116b157855160bf1982019081106116a0576040805162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c502073686f7274206c6973742e000000000000000000604482015290519081900360640190fd5b600195509350849250611784915050565b855160f619820190811061170c576040805162461bcd60e51b815260206004820152601d60248201527f496e76616c696420524c50206c6f6e67206c697374206c656e6774682e000000604482015290519081900360640190fd5b6000816020036101000a6001850151049050808201886000015111611771576040805162461bcd60e51b815260206004820152601660248201527524b73b30b634b210292628103637b733903634b9ba1760511b604482015290519081900360640190fd5b6001918201965094509250611784915050565b9193909250565b8051602091820120825192909101919091201490565b606060008060006117b185611462565b9194509250905060008160018111156117c657fe5b14611818576040805162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c502062797465732076616c75652e0000000000000000604482015290519081900360640190fd5b61182785602001518484611a44565b95945050505050565b60606000825160020267ffffffffffffffff8111801561184f57600080fd5b506040519080825280601f01601f19166020018201604052801561187a576020820181803683370190505b50905060005b835181101561192657600484828151811061189757fe5b602001015160f81c60f81b6001600160f81b031916901c8282600202815181106118bd57fe5b60200101906001600160f81b031916908160001a90535060108482815181106118e257fe5b016020015160f81c816118f157fe5b0660f81b82826002026001018151811061190757fe5b60200101906001600160f81b031916908160001a905350600101611880565b5092915050565b60006020825110156119445750602081015161031a565b81806020019051602081101561031557600080fd5b6000606060208360000151101561197a5761197383611af2565b9050611986565b611983836117a1565b90505b6109b28161192d565b60606108566119a88360200151600081518110610eb457fe5b611830565b606081835103600014156119d05750604080516020810190915260008152610856565b610853838384865103611afd565b6000805b8084511180156119f25750808351115b8015611a375750828181518110611a0557fe5b602001015160f81c60f81b6001600160f81b031916848281518110611a2657fe5b01602001516001600160f81b031916145b15610853576001016119e2565b606060008267ffffffffffffffff81118015611a5f57600080fd5b506040519080825280601f01601f191660200182016040528015611a8a576020820181803683370190505b509050805160001415611a9e5790506109b2565b8484016020820160005b60208604811015611ac9578251825260209283019290910190600101611aa8565b5080519151601f959095166020036101000a600019019182169119909416179092525092915050565b606061085682611c4e565b60608182601f011015611b48576040805162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b604482015290519081900360640190fd5b828284011015611b90576040805162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b604482015290519081900360640190fd5b81830184511015611bdc576040805162461bcd60e51b8152602060048201526011602482015270736c6963655f6f75744f66426f756e647360781b604482015290519081900360640190fd5b606082158015611bfb5760405191506000825260208201604052611c45565b6040519150601f8416801560200281840101858101878315602002848b0101015b81831015611c34578051835260209283019201611c1c565b5050858452601f01601f1916604052505b50949350505050565b6060610856826020015160008460000151611a44565b60408051608081018252600080825260208201819052918101829052606081019190915290565b604051806040016040528060608152602001606081525090565b604051806040016040528060008152602001600081525090565b600067ffffffffffffffff831115611cd357fe5b611ce6601f8401601f19166020016125cf565b9050828152838383011115611cfa57600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b038116811461031a57600080fd5b600082601f830112611d38578081fd5b61085383833560208501611cbf565b600060a08284031215611d58578081fd5b60405160a0810167ffffffffffffffff8282108183111715611d7657fe5b81604052829350843583526020850135602084015260408501356040840152606085013560608401526080850135915080821115611db357600080fd5b50611dc085828601611d28565b6080830152505092915050565b600060408284031215611dde578081fd5b6040516040810167ffffffffffffffff8282108183111715611dfc57fe5b8160405282935084358352602091508185013581811115611e1c57600080fd5b8501601f81018713611e2d57600080fd5b803582811115611e3957fe5b8381029250611e498484016125cf565b8181528481019083860185850187018b1015611e6457600080fd5b600095505b83861015611e87578035835260019590950194918601918601611e69565b5080868801525050505050505092915050565b803563ffffffff8116811461031a57600080fd5b600060208284031215611ebf578081fd5b61085382611d11565b600080600080600060a08688031215611edf578081fd5b611ee886611d11565b9450611ef660208701611d11565b9350604086013567ffffffffffffffff80821115611f12578283fd5b611f1e89838a01611d28565b9450606088013593506080880135915080821115611f3a578283fd5b9087019060a0828a031215611f4d578283fd5b611f5760a06125cf565b82358152602083013582811115611f6c578485fd5b611f788b828601611d47565b602083015250604083013582811115611f8f578485fd5b611f9b8b828601611dcd565b604083015250606083013582811115611fb2578485fd5b611fbe8b828601611d28565b606083015250608083013582811115611fd5578485fd5b611fe18b828601611d28565b6080830152508093505050509295509295909350565b600080600080600060a0868803121561200e578081fd5b61201786611d11565b945061202560208701611d11565b9350604086013567ffffffffffffffff811115612040578182fd5b61204c88828901611d28565b9350506060860135915061206260808701611e9a565b90509295509295909350565b600080600060608486031215612082578283fd5b61208b84611d11565b9250602084013567ffffffffffffffff8111156120a6578283fd5b6120b286828701611d28565b9250506120c160408501611e9a565b90509250925092565b6000602082840312156120db578081fd5b81518015158114610853578182fd5b6000602082840312156120fb578081fd5b5035919050565b600060208284031215612113578081fd5b813567ffffffffffffffff811115612129578182fd5b8201601f81018413612139578182fd5b61214884823560208401611cbf565b949350505050565b600081518084526121688160208601602086016125f3565b601f01601f19169290920160200192915050565b600081518352602082015160208401526040820151604084015260608201516060840152608082015160a0608085015261214860a0850182612150565b60609190911b6001600160601b031916815260140190565b90815260200190565b918252602082015260400190565b600082516121fa8184602087016125f3565b9190910192915050565b600083516122168184602088016125f3565b60609390931b6001600160601b0319169190920190815260140192915050565b600084516122488184602089016125f3565b60609490941b6001600160601b03191691909301908152601481019190915260340192915050565b60f89190911b6001600160f81b031916815260010190565b6001600160a01b0391909116815260200190565b6001600160a01b038581168252841660208201526080604082018190526000906122c890830185612150565b905082606083015295945050505050565b600060018060a01b0385168252836020830152606060408301526118276060830184612150565b901515815260200190565b60008482526020606081840152612325606084018661217c565b838103604085015260408101855182528286015160408484015281815180845260608501915085830194508693505b808410156123745784518252938501936001939093019290850190612354565b509998505050505050505050565b6000602082526108536020830184612150565b6020808252601f908201527f78446f6d61696e4d65737361676553656e646572206973206e6f742073657400604082015260600190565b6020808252602b908201527f50726f7669646564206d6573736167652068617320616c72656164792062656560408201526a37103932b1b2b4bb32b21760a91b606082015260800190565b6020808252604d908201527f4d6573736167652070617373696e67207072656465706c6f7920686173206e6f60408201527f74206265656e20696e697469616c697a6564206f7220696e76616c696420707260608201526c37b7b310383937bb34b232b21760991b608082015260a00190565b6020808252602b908201527f50726f7669646564206d65737361676520686173206e6f7420616c726561647960408201526a103132b2b71039b2b73a1760a91b606082015260800190565b60208082526036908201527f4f6e6c79204f564d5f4c324d65737361676552656c617965722063616e2072656040820152753630bc90261916ba3796a6189036b2b9b9b0b3b2b99760511b606082015260800190565b60208082526027908201527f50726f7669646564206d65737361676520636f756c64206e6f742062652076656040820152663934b334b2b21760c91b606082015260800190565b6020808252602a908201527f4c3143726f7373446f6d61696e4d657373656e67657220616c72656164792069604082015269373a34b0b634bd32b21760b11b606082015260800190565b600060208252610853602083018461217c565b60405181810167ffffffffffffffff811182821017156125eb57fe5b604052919050565b60005b8381101561260e5781810151838201526020016125f6565b8381111561261d576000848401525b5050505056fe50726f766964656420524c50206c6973742065786365656473206d6178206c697374206c656e6774682e52656365697665642061206e6f6465207769746820616e20756e6b6e6f776e20707265666978a2646970667358221220a662a5b81fc96637d5eb204496c3361c9a88ba50adf515314202446c37fc10ad64736f6c63430007060033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100a95760003560e01c8063706ceab611610071578063706ceab61461011c57806382e3702d1461012f578063b1b1b20914610142578063c4d66de814610155578063d7fd19dd14610168578063ecc704281461017b576100a9565b806321d800ec146100ae578063299ca478146100d75780633dbb202b146100ec578063461a4478146101015780636e296e4514610114575b600080fd5b6100c16100bc3660046120ea565b610190565b6040516100ce9190612300565b60405180910390f35b6100df6101a5565b6040516100ce9190612288565b6100ff6100fa36600461206e565b6101b4565b005b6100df61010f366004612102565b610243565b6100df61031f565b6100ff61012a366004611ff7565b610368565b6100c161013d3660046120ea565b6103cf565b6100c16101503660046120ea565b6103e4565b6100ff610163366004611eae565b6103f9565b6100ff610176366004611ec8565b61044f565b61018361070c565b6040516100ce91906121d1565b60016020526000908152604090205460ff1681565b6006546001600160a01b031681565b60006101c4843385600454610712565b60048054600190810190915581516020808401919091206000908152600390915260409020805460ff1916909117905590506102068163ffffffff841661075f565b7f0ee9ffdb2334d78de97ffb066b23a352a4d35180cefb36589d663fbb1eb6f326816040516102359190612382565b60405180910390a150505050565b60065460405163bf40fac160e01b81526020600482018181528451602484015284516000946001600160a01b03169363bf40fac1938793928392604401918501908083838b5b838110156102a1578181015183820152602001610289565b50505050905090810190601f1680156102ce5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b1580156102eb57600080fd5b505afa1580156102ff573d6000803e3d6000fd5b505050506040513d602081101561031557600080fd5b505190505b919050565b6005546000906001600160a01b031661dead14156103585760405162461bcd60e51b815260040161034f90612395565b60405180910390fd5b506005546001600160a01b031690565b600061037686868686610712565b805160208083019190912060009081526003909152604090205490915060ff1615156001146103b75760405162461bcd60e51b815260040161034f9061248a565b6103c7818363ffffffff1661075f565b505050505050565b60036020526000908152604090205460ff1681565b60026020526000908152604090205460ff1681565b6006546001600160a01b0316156104225760405162461bcd60e51b815260040161034f90612572565b600680546001600160a01b039092166001600160a01b03199283161790556005805490911661dead179055565b600260005414156104a7576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6002600090815560408051808201909152601481527327ab26afa61926b2b9b9b0b3b2a932b630bcb2b960611b60208201526104e290610243565b90506001600160a01b0381161561051b57336001600160a01b0382161461051b5760405162461bcd60e51b815260040161034f906124d5565b600061052987878787610712565b90506105358184610837565b15156001146105565760405162461bcd60e51b815260040161034f9061252b565b80516020808301919091206000818152600290925260409091205460ff16156105915760405162461bcd60e51b815260040161034f906123cc565b600580546001600160a01b0319166001600160a01b03898116919091179091556040516000918a16906105c59089906121e8565b6000604051808303816000865af19150503d8060008114610602576040519150601f19603f3d011682016040523d82523d6000602084013e610607565b606091505b5050600580546001600160a01b03191661dead1790559050801515600114156106805760008281526002602052604090819020805460ff19166001179055517f4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c906106739084906121d1565b60405180910390a16106b8565b7f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f826040516106af91906121d1565b60405180910390a15b60008333436040516020016106cf93929190612236565b60408051601f1981840301815291815281516020928301206000908152600192839052908120805460ff1916831790555550505050505050505050565b60045481565b60608484848460405160240161072b949392919061229c565b60408051601f198184030181529190526020810180516001600160e01b031663cbd4ece960e01b1790529050949350505050565b61079d6040518060400160405280601d81526020017f4f564d5f43616e6f6e6963616c5472616e73616374696f6e436861696e000000815250610243565b6001600160a01b0316636fee07e06107e96040518060400160405280601a81526020017f4f564d5f4c3243726f7373446f6d61696e4d657373656e676572000000000000815250610243565b83856040518463ffffffff1660e01b8152600401610809939291906122d9565b600060405180830381600087803b15801561082357600080fd5b505af11580156103c7573d6000803e3d6000fd5b60006108428261085c565b8015610853575061085383836109b9565b90505b92915050565b60008061089d6040518060400160405280601881526020017f4f564d5f5374617465436f6d6d69746d656e74436861696e0000000000000000815250610243565b6020840151604051639418bddd60e01b81529192506001600160a01b03831691639418bddd916108cf916004016125bc565b60206040518083038186803b1580156108e757600080fd5b505afa1580156108fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061091f91906120ca565b1580156109b25750825160208401516040808601519051634d69ee5760e01b81526001600160a01b03851693634d69ee579361096293919290919060040161230b565b60206040518083038186803b15801561097a57600080fd5b505afa15801561098e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109b291906120ca565b9392505050565b600080836109fb6040518060400160405280601a81526020017f4f564d5f4c3243726f7373446f6d61696e4d657373656e676572000000000000815250610243565b604051602001610a0c929190612204565b604051602081830303815290604052805190602001206000604051602001610a359291906121da565b604051602081830303815290604052805190602001209050600080610a84602160991b604051602001610a6891906121b9565b60408051601f1981840301815291905260608701518751610b16565b9092509050600182151514610aab5760405162461bcd60e51b815260040161034f90612417565b6000610ab682610b3f565b9050610b0b84604051602001610acc91906121d1565b6040516020818303038152906040526001604051602001610aed9190612270565b60405160208183030381529060405288608001518460400151610bd1565b979650505050505050565b600060606000610b2586610bf5565b9050610b32818686610c25565b9250925050935093915050565b610b47611c64565b6000610b5283610cf8565b90506040518060800160405280610b7c83600081518110610b6f57fe5b6020026020010151610d0b565b8152602001610b9183600181518110610b6f57fe5b8152602001610bb383600281518110610ba657fe5b6020026020010151610d12565b8152602001610bc883600381518110610ba657fe5b90529392505050565b600080610bdd86610bf5565b9050610beb81868686610e0b565b9695505050505050565b60608180519060200120604051602001610c0f91906121d1565b6040516020818303038152906040529050919050565b600060606000610c3485610e31565b90506000806000610c46848a89610f08565b81519295509093509150158080610c5a5750815b610cab576040805162461bcd60e51b815260206004820152601a60248201527f50726f76696465642070726f6f6620697320696e76616c69642e000000000000604482015290519081900360640190fd5b600081610cc75760405180602001604052806000815250610ce6565b610ce6866001870381518110610cd957fe5b60200260200101516112ab565b919b919a509098505050505050505050565b6060610856610d06836112c7565b6112ec565b6000610856825b6000602182600001511115610d6e576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e000000000000604482015290519081900360640190fd5b6000806000610d7c85611462565b919450925090506000816001811115610d9157fe5b14610de3576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e000000000000604482015290519081900360640190fd5b602080860151840180519091841015610beb5760208490036101000a90049695505050505050565b6000806000610e1b878686610c25565b91509150818015610b0b5750610b0b868261178b565b60606000610e3e83610cf8565b90506000815167ffffffffffffffff81118015610e5a57600080fd5b50604051908082528060200260200182016040528015610e9457816020015b610e81611c8b565b815260200190600190039081610e795790505b50905060005b8251811015610f00576000610ec1848381518110610eb457fe5b60200260200101516117a1565b90506040518060400160405280828152602001610edd83610cf8565b815250838381518110610eec57fe5b602090810291909101015250600101610e9a565b509392505050565b60006060818080610f1887611830565b905085600080610f26611c8b565b60005b8c51811015611283578c8181518110610f3e57fe5b6020026020010151915082840193506001870196508360001415610fb257815180516020909101208514610fad576040805162461bcd60e51b8152602060048201526011602482015270092dcecc2d8d2c840e4dedee840d0c2e6d607b1b604482015290519081900360640190fd5b611079565b81515160201161101957815180516020909101208514610fad576040805162461bcd60e51b815260206004820152601b60248201527f496e76616c6964206c6172676520696e7465726e616c20686173680000000000604482015290519081900360640190fd5b84611027836000015161192d565b14611079576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420696e7465726e616c206e6f64652068617368000000000000604482015290519081900360640190fd5b602082015151601114156110e857855184141561109557611283565b60008685815181106110a357fe5b602001015160f81c60f81b60f81c9050600083602001518260ff16815181106110c857fe5b602002602001015190506110db81611959565b965060019450505061127b565b6002826020015151141561122e5760006111018361198f565b905060008160008151811061111257fe5b016020015160f81c90506001811660020360006111328460ff84166119ad565b905060006111408b8a6119ad565b9050600061114e83836119de565b905060ff851660021480611165575060ff85166003145b156111975780835114801561117a5750808251145b1561118457988901985b50600160ff1b9950611283945050505050565b60ff851615806111aa575060ff85166001145b156111f757806111c75750600160ff1b9950611283945050505050565b6111e888602001516001815181106111db57fe5b6020026020010151611959565b9a50975061127b945050505050565b60405162461bcd60e51b815260040180806020018281038252602681526020018061264e6026913960400191505060405180910390fd5b6040805162461bcd60e51b815260206004820152601d60248201527f526563656976656420616e20756e706172736561626c65206e6f64652e000000604482015290519081900360640190fd5b600101610f29565b50600160ff1b84148661129687866119ad565b909e909d50909b509950505050505050505050565b60208101518051606091610856916000198101908110610eb457fe5b6112cf611ca5565b506040805180820190915281518152602082810190820152919050565b60606000806112fa84611462565b9193509091506001905081600181111561131057fe5b14611362576040805162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c50206c6973742076616c75652e000000000000000000604482015290519081900360640190fd5b6040805160208082526104208201909252600091816020015b611383611ca5565b81526020019060019003908161137b5790505090506000835b865181101561145757602082106113e45760405162461bcd60e51b815260040180806020018281038252602a815260200180612624602a913960400191505060405180910390fd5b6000806114106040518060400160405280858c60000151038152602001858c6020015101815250611462565b509150915060405180604001604052808383018152602001848b602001510181525085858151811061143e57fe5b602090810291909101015260019390930192010161139c565b508152949350505050565b6000806000808460000151116114bf576040805162461bcd60e51b815260206004820152601860248201527f524c50206974656d2063616e6e6f74206265206e756c6c2e0000000000000000604482015290519081900360640190fd5b6020840151805160001a607f81116114e4576000600160009450945094505050611784565b60b78111611559578551607f198201908110611547576040805162461bcd60e51b815260206004820152601960248201527f496e76616c696420524c502073686f727420737472696e672e00000000000000604482015290519081900360640190fd5b60019550935060009250611784915050565b60bf811161163d57855160b61982019081106115bc576040805162461bcd60e51b815260206004820152601f60248201527f496e76616c696420524c50206c6f6e6720737472696e67206c656e6774682e00604482015290519081900360640190fd5b6000816020036101000a6001850151049050808201886000015111611628576040805162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c50206c6f6e6720737472696e672e0000000000000000604482015290519081900360640190fd5b60019091019550935060009250611784915050565b60f781116116b157855160bf1982019081106116a0576040805162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c502073686f7274206c6973742e000000000000000000604482015290519081900360640190fd5b600195509350849250611784915050565b855160f619820190811061170c576040805162461bcd60e51b815260206004820152601d60248201527f496e76616c696420524c50206c6f6e67206c697374206c656e6774682e000000604482015290519081900360640190fd5b6000816020036101000a6001850151049050808201886000015111611771576040805162461bcd60e51b815260206004820152601660248201527524b73b30b634b210292628103637b733903634b9ba1760511b604482015290519081900360640190fd5b6001918201965094509250611784915050565b9193909250565b8051602091820120825192909101919091201490565b606060008060006117b185611462565b9194509250905060008160018111156117c657fe5b14611818576040805162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c502062797465732076616c75652e0000000000000000604482015290519081900360640190fd5b61182785602001518484611a44565b95945050505050565b60606000825160020267ffffffffffffffff8111801561184f57600080fd5b506040519080825280601f01601f19166020018201604052801561187a576020820181803683370190505b50905060005b835181101561192657600484828151811061189757fe5b602001015160f81c60f81b6001600160f81b031916901c8282600202815181106118bd57fe5b60200101906001600160f81b031916908160001a90535060108482815181106118e257fe5b016020015160f81c816118f157fe5b0660f81b82826002026001018151811061190757fe5b60200101906001600160f81b031916908160001a905350600101611880565b5092915050565b60006020825110156119445750602081015161031a565b81806020019051602081101561031557600080fd5b6000606060208360000151101561197a5761197383611af2565b9050611986565b611983836117a1565b90505b6109b28161192d565b60606108566119a88360200151600081518110610eb457fe5b611830565b606081835103600014156119d05750604080516020810190915260008152610856565b610853838384865103611afd565b6000805b8084511180156119f25750808351115b8015611a375750828181518110611a0557fe5b602001015160f81c60f81b6001600160f81b031916848281518110611a2657fe5b01602001516001600160f81b031916145b15610853576001016119e2565b606060008267ffffffffffffffff81118015611a5f57600080fd5b506040519080825280601f01601f191660200182016040528015611a8a576020820181803683370190505b509050805160001415611a9e5790506109b2565b8484016020820160005b60208604811015611ac9578251825260209283019290910190600101611aa8565b5080519151601f959095166020036101000a600019019182169119909416179092525092915050565b606061085682611c4e565b60608182601f011015611b48576040805162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b604482015290519081900360640190fd5b828284011015611b90576040805162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b604482015290519081900360640190fd5b81830184511015611bdc576040805162461bcd60e51b8152602060048201526011602482015270736c6963655f6f75744f66426f756e647360781b604482015290519081900360640190fd5b606082158015611bfb5760405191506000825260208201604052611c45565b6040519150601f8416801560200281840101858101878315602002848b0101015b81831015611c34578051835260209283019201611c1c565b5050858452601f01601f1916604052505b50949350505050565b6060610856826020015160008460000151611a44565b60408051608081018252600080825260208201819052918101829052606081019190915290565b604051806040016040528060608152602001606081525090565b604051806040016040528060008152602001600081525090565b600067ffffffffffffffff831115611cd357fe5b611ce6601f8401601f19166020016125cf565b9050828152838383011115611cfa57600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b038116811461031a57600080fd5b600082601f830112611d38578081fd5b61085383833560208501611cbf565b600060a08284031215611d58578081fd5b60405160a0810167ffffffffffffffff8282108183111715611d7657fe5b81604052829350843583526020850135602084015260408501356040840152606085013560608401526080850135915080821115611db357600080fd5b50611dc085828601611d28565b6080830152505092915050565b600060408284031215611dde578081fd5b6040516040810167ffffffffffffffff8282108183111715611dfc57fe5b8160405282935084358352602091508185013581811115611e1c57600080fd5b8501601f81018713611e2d57600080fd5b803582811115611e3957fe5b8381029250611e498484016125cf565b8181528481019083860185850187018b1015611e6457600080fd5b600095505b83861015611e87578035835260019590950194918601918601611e69565b5080868801525050505050505092915050565b803563ffffffff8116811461031a57600080fd5b600060208284031215611ebf578081fd5b61085382611d11565b600080600080600060a08688031215611edf578081fd5b611ee886611d11565b9450611ef660208701611d11565b9350604086013567ffffffffffffffff80821115611f12578283fd5b611f1e89838a01611d28565b9450606088013593506080880135915080821115611f3a578283fd5b9087019060a0828a031215611f4d578283fd5b611f5760a06125cf565b82358152602083013582811115611f6c578485fd5b611f788b828601611d47565b602083015250604083013582811115611f8f578485fd5b611f9b8b828601611dcd565b604083015250606083013582811115611fb2578485fd5b611fbe8b828601611d28565b606083015250608083013582811115611fd5578485fd5b611fe18b828601611d28565b6080830152508093505050509295509295909350565b600080600080600060a0868803121561200e578081fd5b61201786611d11565b945061202560208701611d11565b9350604086013567ffffffffffffffff811115612040578182fd5b61204c88828901611d28565b9350506060860135915061206260808701611e9a565b90509295509295909350565b600080600060608486031215612082578283fd5b61208b84611d11565b9250602084013567ffffffffffffffff8111156120a6578283fd5b6120b286828701611d28565b9250506120c160408501611e9a565b90509250925092565b6000602082840312156120db578081fd5b81518015158114610853578182fd5b6000602082840312156120fb578081fd5b5035919050565b600060208284031215612113578081fd5b813567ffffffffffffffff811115612129578182fd5b8201601f81018413612139578182fd5b61214884823560208401611cbf565b949350505050565b600081518084526121688160208601602086016125f3565b601f01601f19169290920160200192915050565b600081518352602082015160208401526040820151604084015260608201516060840152608082015160a0608085015261214860a0850182612150565b60609190911b6001600160601b031916815260140190565b90815260200190565b918252602082015260400190565b600082516121fa8184602087016125f3565b9190910192915050565b600083516122168184602088016125f3565b60609390931b6001600160601b0319169190920190815260140192915050565b600084516122488184602089016125f3565b60609490941b6001600160601b03191691909301908152601481019190915260340192915050565b60f89190911b6001600160f81b031916815260010190565b6001600160a01b0391909116815260200190565b6001600160a01b038581168252841660208201526080604082018190526000906122c890830185612150565b905082606083015295945050505050565b600060018060a01b0385168252836020830152606060408301526118276060830184612150565b901515815260200190565b60008482526020606081840152612325606084018661217c565b838103604085015260408101855182528286015160408484015281815180845260608501915085830194508693505b808410156123745784518252938501936001939093019290850190612354565b509998505050505050505050565b6000602082526108536020830184612150565b6020808252601f908201527f78446f6d61696e4d65737361676553656e646572206973206e6f742073657400604082015260600190565b6020808252602b908201527f50726f7669646564206d6573736167652068617320616c72656164792062656560408201526a37103932b1b2b4bb32b21760a91b606082015260800190565b6020808252604d908201527f4d6573736167652070617373696e67207072656465706c6f7920686173206e6f60408201527f74206265656e20696e697469616c697a6564206f7220696e76616c696420707260608201526c37b7b310383937bb34b232b21760991b608082015260a00190565b6020808252602b908201527f50726f7669646564206d65737361676520686173206e6f7420616c726561647960408201526a103132b2b71039b2b73a1760a91b606082015260800190565b60208082526036908201527f4f6e6c79204f564d5f4c324d65737361676552656c617965722063616e2072656040820152753630bc90261916ba3796a6189036b2b9b9b0b3b2b99760511b606082015260800190565b60208082526027908201527f50726f7669646564206d65737361676520636f756c64206e6f742062652076656040820152663934b334b2b21760c91b606082015260800190565b6020808252602a908201527f4c3143726f7373446f6d61696e4d657373656e67657220616c72656164792069604082015269373a34b0b634bd32b21760b11b606082015260800190565b600060208252610853602083018461217c565b60405181810167ffffffffffffffff811182821017156125eb57fe5b604052919050565b60005b8381101561260e5781810151838201526020016125f6565b8381111561261d576000848401525b5050505056fe50726f766964656420524c50206c6973742065786365656473206d6178206c697374206c656e6774682e52656365697665642061206e6f6465207769746820616e20756e6b6e6f776e20707265666978a2646970667358221220a662a5b81fc96637d5eb204496c3361c9a88ba50adf515314202446c37fc10ad64736f6c63430007060033", + "devdoc": { + "details": "The L1 Cross Domain Messenger contract sends messages from L1 to L2, and relays messages from L2 onto L1. In the event that a message sent from L1 to L2 is rejected for exceeding the L2 epoch gas limit, it can be resubmitted via this contract's replay function. Compiler used: solc Runtime target: EVM", + "kind": "dev", + "methods": { + "initialize(address)": { + "params": { + "_libAddressManager": "Address of the Address Manager." + } + }, + "relayMessage(address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))": { + "params": { + "_message": "Message to send to the target.", + "_messageNonce": "Nonce for the provided message.", + "_proof": "Inclusion proof for the given message.", + "_sender": "Message sender address.", + "_target": "Target contract address." + } + }, + "replayMessage(address,address,bytes,uint256,uint32)": { + "params": { + "_gasLimit": "Gas limit for the provided message.", + "_message": "Message to send to the target.", + "_messageNonce": "Nonce for the provided message.", + "_sender": "Original sender address.", + "_target": "Target contract address." + } + }, + "resolve(string)": { + "params": { + "_name": "Name to resolve an address for." + }, + "returns": { + "_0": "Address associated with the given name." + } + }, + "sendMessage(address,bytes,uint32)": { + "params": { + "_gasLimit": "Gas limit for the provided message.", + "_message": "Message to send to the target.", + "_target": "Target contract address." + } + } + }, + "title": "OVM_L1CrossDomainMessenger", + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": { + "constructor": { + "notice": "Pass a default zero address to the address resolver. This will be updated when initialized." + }, + "relayMessage(address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))": { + "notice": "Relays a cross domain message to a contract." + }, + "replayMessage(address,address,bytes,uint256,uint32)": { + "notice": "Replays a cross domain message to the target messenger." + }, + "resolve(string)": { + "notice": "Resolves the address associated with a given name." + }, + "sendMessage(address,bytes,uint32)": { + "notice": "Sends a cross domain message to the target messenger." + } + }, + "version": 1 + }, + "storageLayout": { + "storage": [ + { + "astId": 571, + "contract": "contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1CrossDomainMessenger.sol:OVM_L1CrossDomainMessenger", + "label": "_status", + "offset": 0, + "slot": "0", + "type": "t_uint256" + }, + { + "astId": 619, + "contract": "contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1CrossDomainMessenger.sol:OVM_L1CrossDomainMessenger", + "label": "relayedMessages", + "offset": 0, + "slot": "1", + "type": "t_mapping(t_bytes32,t_bool)" + }, + { + "astId": 623, + "contract": "contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1CrossDomainMessenger.sol:OVM_L1CrossDomainMessenger", + "label": "successfulMessages", + "offset": 0, + "slot": "2", + "type": "t_mapping(t_bytes32,t_bool)" + }, + { + "astId": 627, + "contract": "contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1CrossDomainMessenger.sol:OVM_L1CrossDomainMessenger", + "label": "sentMessages", + "offset": 0, + "slot": "3", + "type": "t_mapping(t_bytes32,t_bool)" + }, + { + "astId": 629, + "contract": "contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1CrossDomainMessenger.sol:OVM_L1CrossDomainMessenger", + "label": "messageNonce", + "offset": 0, + "slot": "4", + "type": "t_uint256" + }, + { + "astId": 632, + "contract": "contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1CrossDomainMessenger.sol:OVM_L1CrossDomainMessenger", + "label": "xDomainMsgSender", + "offset": 0, + "slot": "5", + "type": "t_address" + }, + { + "astId": 12055, + "contract": "contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1CrossDomainMessenger.sol:OVM_L1CrossDomainMessenger", + "label": "libAddressManager", + "offset": 0, + "slot": "6", + "type": "t_contract(Lib_AddressManager)12048" + } + ], + "types": { + "t_address": { + "encoding": "inplace", + "label": "address", + "numberOfBytes": "20" + }, + "t_bool": { + "encoding": "inplace", + "label": "bool", + "numberOfBytes": "1" + }, + "t_bytes32": { + "encoding": "inplace", + "label": "bytes32", + "numberOfBytes": "32" + }, + "t_contract(Lib_AddressManager)12048": { + "encoding": "inplace", + "label": "contract Lib_AddressManager", + "numberOfBytes": "20" + }, + "t_mapping(t_bytes32,t_bool)": { + "encoding": "mapping", + "key": "t_bytes32", + "label": "mapping(bytes32 => bool)", + "numberOfBytes": "32", + "value": "t_bool" + }, + "t_uint256": { + "encoding": "inplace", + "label": "uint256", + "numberOfBytes": "32" + } + } + } +} \ No newline at end of file diff --git a/packages/contracts/deployments/goerli-v3/OVM_L1ETHGateway.json b/packages/contracts/deployments/goerli-v3/OVM_L1ETHGateway.json new file mode 100644 index 0000000000000..4f0be1fd795ed --- /dev/null +++ b/packages/contracts/deployments/goerli-v3/OVM_L1ETHGateway.json @@ -0,0 +1,293 @@ +{ + "address": "0x746E840b94cC75921D1cb620b83CFd0C658B2852", + "abi": [ + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_from", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "DepositInitiated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "WithdrawalFinalized", + "type": "event" + }, + { + "inputs": [], + "name": "deposit", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_to", + "type": "address" + } + ], + "name": "depositTo", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "finalizeWithdrawal", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "getFinalizeDepositL2Gas", + "outputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_libAddressManager", + "type": "address" + }, + { + "internalType": "address", + "name": "_ovmEth", + "type": "address" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "libAddressManager", + "outputs": [ + { + "internalType": "contract Lib_AddressManager", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "messenger", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "ovmEth", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "_name", + "type": "string" + } + ], + "name": "resolve", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "stateMutability": "payable", + "type": "receive" + } + ], + "transactionHash": "0x3880c009c976f21e54efda94e4cea27d6ac934b7e2cccae7f84187b2654eea57", + "receipt": { + "to": null, + "from": "0x4107438C1b1579f258AF9d1AC06194C4a0F55040", + "contractAddress": "0x746E840b94cC75921D1cb620b83CFd0C658B2852", + "transactionIndex": 6, + "gasUsed": "609964", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0xce3b66ca48656384c99d18e47e91b59ba8c45887e83a7326236dc21acef3b142", + "transactionHash": "0x3880c009c976f21e54efda94e4cea27d6ac934b7e2cccae7f84187b2654eea57", + "logs": [], + "blockNumber": 4694128, + "cumulativeGasUsed": "1124104", + "status": 1, + "byzantium": true + }, + "args": [], + "solcInputHash": "dde656dd41f49cad9eac9bc7065fd6a7", + "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"DepositInitiated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"WithdrawalFinalized\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"deposit\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"}],\"name\":\"depositTo\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"finalizeWithdrawal\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getFinalizeDepositL2Gas\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_ovmEth\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"messenger\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ovmEth\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"details\":\"The L1 ETH Gateway is a contract which stores deposited ETH that is in use on L2. Compiler used: solc Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"deposit()\":{\"details\":\"deposit an amount of the ETH to the caller's balance on L2\"},\"depositTo(address)\":{\"details\":\"deposit an amount of ETH to a recipients's balance on L2\",\"params\":{\"_to\":\"L2 address to credit the withdrawal to\"}},\"finalizeWithdrawal(address,uint256)\":{\"details\":\"Complete a withdrawal from L2 to L1, and credit funds to the recipient's balance of the L1 ETH token. Since only the xDomainMessenger can call this function, it will never be called before the withdrawal is finalized.\",\"params\":{\"_amount\":\"Amount of the ETH to withdraw\",\"_to\":\"L1 address to credit the withdrawal to\"}},\"initialize(address,address)\":{\"params\":{\"_libAddressManager\":\"Address manager for this OE deployment\",\"_ovmEth\":\"L2 OVM_ETH implementation of iOVM_DepositedToken\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}}},\"title\":\"OVM_L1ETHGateway\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/OVM/bridge/tokens/OVM_L1ETHGateway.sol\":\"OVM_L1ETHGateway\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor () internal {\\n address msgSender = _msgSender();\\n _owner = msgSender;\\n emit OwnershipTransferred(address(0), msgSender);\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n emit OwnershipTransferred(_owner, address(0));\\n _owner = address(0);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n emit OwnershipTransferred(_owner, newOwner);\\n _owner = newOwner;\\n }\\n}\\n\",\"keccak256\":\"0x15e2d5bd4c28a88548074c54d220e8086f638a71ed07e6b3ba5a70066fcf458d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with GSN meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address payable) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes memory) {\\n this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x8d3cb350f04ff49cfb10aef08d87f19dcbaecc8027b0bed12f3275cd12f38cf0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/bridge/tokens/OVM_L1ETHGateway.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// @unsupported: ovm\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Interface Imports */\\nimport { iOVM_L1ETHGateway } from \\\"../../../iOVM/bridge/tokens/iOVM_L1ETHGateway.sol\\\";\\nimport { iOVM_L2DepositedToken } from \\\"../../../iOVM/bridge/tokens/iOVM_L2DepositedToken.sol\\\";\\n\\n/* Library Imports */\\nimport { OVM_CrossDomainEnabled } from \\\"../../../libraries/bridge/OVM_CrossDomainEnabled.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../../libraries/resolver/Lib_AddressResolver.sol\\\";\\nimport { Lib_AddressManager } from \\\"../../../libraries/resolver/Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title OVM_L1ETHGateway\\n * @dev The L1 ETH Gateway is a contract which stores deposited ETH that is in use on L2.\\n *\\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract OVM_L1ETHGateway is iOVM_L1ETHGateway, OVM_CrossDomainEnabled, Lib_AddressResolver {\\n\\n /********************\\n * Public Constants *\\n ********************/\\n\\n uint32 public constant override getFinalizeDepositL2Gas = 1200000;\\n\\n /********************************\\n * External Contract References *\\n ********************************/\\n\\n address public ovmEth;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n // This contract lives behind a proxy, so the constructor parameters will go unused.\\n constructor()\\n OVM_CrossDomainEnabled(address(0))\\n Lib_AddressResolver(address(0))\\n public\\n {}\\n\\n /******************\\n * Initialization *\\n ******************/\\n\\n /**\\n * @param _libAddressManager Address manager for this OE deployment\\n * @param _ovmEth L2 OVM_ETH implementation of iOVM_DepositedToken\\n */\\n function initialize(\\n address _libAddressManager,\\n address _ovmEth\\n )\\n public\\n {\\n require(libAddressManager == Lib_AddressManager(0), \\\"Contract has already been initialized.\\\");\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n ovmEth = _ovmEth;\\n messenger = resolve(\\\"Proxy__OVM_L1CrossDomainMessenger\\\");\\n }\\n\\n /**************\\n * Depositing *\\n **************/\\n\\n receive()\\n external\\n payable\\n {\\n _initiateDeposit(msg.sender, msg.sender);\\n }\\n\\n /**\\n * @dev deposit an amount of the ETH to the caller's balance on L2\\n */\\n function deposit()\\n external\\n override\\n payable\\n {\\n _initiateDeposit(msg.sender, msg.sender);\\n }\\n\\n /**\\n * @dev deposit an amount of ETH to a recipients's balance on L2\\n * @param _to L2 address to credit the withdrawal to\\n */\\n function depositTo(\\n address _to\\n )\\n external\\n override\\n payable\\n {\\n _initiateDeposit(msg.sender, _to);\\n }\\n\\n /**\\n * @dev Performs the logic for deposits by storing the ETH and informing the L2 ETH Gateway of the deposit.\\n *\\n * @param _from Account to pull the deposit from on L1\\n * @param _to Account to give the deposit to on L2\\n */\\n function _initiateDeposit(\\n address _from,\\n address _to\\n )\\n internal\\n {\\n // Construct calldata for l2ETHGateway.finalizeDeposit(_to, _amount)\\n bytes memory data =\\n abi.encodeWithSelector(\\n iOVM_L2DepositedToken.finalizeDeposit.selector,\\n _to,\\n msg.value\\n );\\n\\n // Send calldata into L2\\n sendCrossDomainMessage(\\n ovmEth,\\n data,\\n getFinalizeDepositL2Gas\\n );\\n\\n emit DepositInitiated(_from, _to, msg.value);\\n }\\n\\n /*************************\\n * Cross-chain Functions *\\n *************************/\\n\\n /**\\n * @dev Complete a withdrawal from L2 to L1, and credit funds to the recipient's balance of the\\n * L1 ETH token.\\n * Since only the xDomainMessenger can call this function, it will never be called before the withdrawal is finalized.\\n *\\n * @param _to L1 address to credit the withdrawal to\\n * @param _amount Amount of the ETH to withdraw\\n */\\n function finalizeWithdrawal(\\n address _to,\\n uint256 _amount\\n )\\n external\\n override\\n onlyFromCrossDomainAccount(ovmEth)\\n {\\n _safeTransferETH(_to, _amount);\\n\\n emit WithdrawalFinalized(_to, _amount);\\n }\\n\\n /**********************************\\n * Internal Functions: Accounting *\\n **********************************/\\n\\n /**\\n * @dev Internal accounting function for moving around L1 ETH.\\n *\\n * @param _to L1 address to transfer ETH to\\n * @param _value Amount of ETH to send to\\n */\\n function _safeTransferETH(\\n address _to,\\n uint256 _value\\n )\\n internal\\n {\\n (bool success, ) = _to.call{value: _value}(new bytes(0));\\n require(success, 'TransferHelper::safeTransferETH: ETH transfer failed');\\n }\\n}\\n\",\"keccak256\":\"0xee7c0d4bea0e01b0de4def829c9c8aa313ad6a788a7150adcc62c1e4190831db\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/bridge/messaging/iAbs_BaseCrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/**\\n * @title iAbs_BaseCrossDomainMessenger\\n */\\ninterface iAbs_BaseCrossDomainMessenger {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event SentMessage(bytes message);\\n event RelayedMessage(bytes32 msgHash);\\n event FailedRelayedMessage(bytes32 msgHash);\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n function xDomainMessageSender() external view returns (address);\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sends a cross domain message to the target messenger.\\n * @param _target Target contract address.\\n * @param _message Message to send to the target.\\n * @param _gasLimit Gas limit for the provided message.\\n */\\n function sendMessage(\\n address _target,\\n bytes calldata _message,\\n uint32 _gasLimit\\n ) external;\\n}\\n\",\"keccak256\":\"0x89981ed48e99d6939cc6cdef827d484fa3e2292d66c0ba5056c7050cb6282d7e\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/bridge/tokens/iOVM_L1ETHGateway.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0;\\npragma experimental ABIEncoderV2;\\n\\n/**\\n * @title iOVM_L1ETHGateway\\n */\\ninterface iOVM_L1ETHGateway {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event DepositInitiated(\\n address indexed _from,\\n address _to,\\n uint256 _amount\\n );\\n\\n event WithdrawalFinalized(\\n address indexed _to,\\n uint256 _amount\\n );\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function deposit()\\n external\\n payable;\\n\\n function depositTo(\\n address _to\\n )\\n external\\n payable;\\n\\n /*************************\\n * Cross-chain Functions *\\n *************************/\\n\\n function finalizeWithdrawal(\\n address _to,\\n uint _amount\\n )\\n external;\\n\\n function getFinalizeDepositL2Gas()\\n external\\n view\\n returns(\\n uint32\\n );\\n}\\n\",\"keccak256\":\"0x7e6805c5cacfd159410c7cd57a3d586e0fc5810bc46600bbd840a252e243e5ba\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/bridge/tokens/iOVM_L2DepositedToken.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0;\\npragma experimental ABIEncoderV2;\\n\\n/**\\n * @title iOVM_L2DepositedToken\\n */\\ninterface iOVM_L2DepositedToken {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event WithdrawalInitiated(\\n address indexed _from,\\n address _to,\\n uint256 _amount\\n );\\n\\n event DepositFinalized(\\n address indexed _to,\\n uint256 _amount\\n );\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function withdraw(\\n uint _amount\\n )\\n external;\\n\\n function withdrawTo(\\n address _to,\\n uint _amount\\n )\\n external;\\n\\n\\n /*************************\\n * Cross-chain Functions *\\n *************************/\\n\\n function finalizeDeposit(\\n address _to,\\n uint _amount\\n )\\n external;\\n}\\n\",\"keccak256\":\"0x59c807dfb01dbc00409431820457c350681af30d2f972a065231483a8ec926c4\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/bridge/OVM_CrossDomainEnabled.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Interface Imports */\\nimport { iAbs_BaseCrossDomainMessenger } from \\\"../../iOVM/bridge/messaging/iAbs_BaseCrossDomainMessenger.sol\\\";\\n\\n/**\\n * @title OVM_CrossDomainEnabled\\n * @dev Helper contract for contracts performing cross-domain communications\\n *\\n * Compiler used: defined by inheriting contract\\n * Runtime target: defined by inheriting contract\\n */\\ncontract OVM_CrossDomainEnabled {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n // Messenger contract used to send and recieve messages from the other domain.\\n address public messenger;\\n\\n\\n /***************\\n * Constructor *\\n ***************/ \\n\\n /**\\n * @param _messenger Address of the CrossDomainMessenger on the current layer.\\n */\\n constructor(\\n address _messenger\\n ) {\\n messenger = _messenger;\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n /**\\n * Enforces that the modified function is only callable by a specific cross-domain account.\\n * @param _sourceDomainAccount The only account on the originating domain which is\\n * authenticated to call this function.\\n */\\n modifier onlyFromCrossDomainAccount(\\n address _sourceDomainAccount\\n ) {\\n require(\\n msg.sender == address(getCrossDomainMessenger()),\\n \\\"OVM_XCHAIN: messenger contract unauthenticated\\\"\\n );\\n\\n require(\\n getCrossDomainMessenger().xDomainMessageSender() == _sourceDomainAccount,\\n \\\"OVM_XCHAIN: wrong sender of cross-domain message\\\"\\n );\\n\\n _;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Gets the messenger, usually from storage. This function is exposed in case a child contract\\n * needs to override.\\n * @return The address of the cross-domain messenger contract which should be used. \\n */\\n function getCrossDomainMessenger()\\n internal\\n virtual\\n returns (\\n iAbs_BaseCrossDomainMessenger\\n )\\n {\\n return iAbs_BaseCrossDomainMessenger(messenger);\\n }\\n\\n /**\\n * Sends a message to an account on another domain\\n * @param _crossDomainTarget The intended recipient on the destination domain\\n * @param _data The data to send to the target (usually calldata to a function with\\n * `onlyFromCrossDomainAccount()`)\\n * @param _gasLimit The gasLimit for the receipt of the message on the target domain.\\n */\\n function sendCrossDomainMessage(\\n address _crossDomainTarget,\\n bytes memory _data,\\n uint32 _gasLimit\\n )\\n internal\\n {\\n getCrossDomainMessenger().sendMessage(_crossDomainTarget, _data, _gasLimit);\\n }\\n}\\n\",\"keccak256\":\"0x054c802a5c1318566b7727ff5327a1ad4dc0f18038a4586b7ada467cc6b08761\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n public\\n onlyOwner\\n {\\n addresses[_getNameHash(_name)] = _address;\\n\\n emit AddressSet(\\n _name,\\n _address\\n );\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0x2ce671a0e004df88b136bea5a3c59d0732cea8887c8496da1d509e0200b03d7d\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(\\n address _libAddressManager\\n ) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x65981feeabff6a81783ea97d44baf988a18a86c8cb374c46fdb71819cbacc7c0\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x608060405234801561001057600080fd5b50600080546001600160a01b03199081169091556001805490911690556109fb8061003c6000396000f3fe60806040526004361061008a5760003560e01c8063485cc95511610059578063485cc95514610122578063490b5b7814610142578063b760faf914610157578063d0e30db01461016a578063f4f7b41a146101725761009b565b80631273a090146100a0578063299ca478146100cb5780633cb747bf146100ed578063461a4478146101025761009b565b3661009b576100993333610192565b005b600080fd5b3480156100ac57600080fd5b506100b5610246565b6040516100c29190610935565b60405180910390f35b3480156100d757600080fd5b506100e061024d565b6040516100c29190610865565b3480156100f957600080fd5b506100e061025c565b34801561010e57600080fd5b506100e061011d366004610797565b61026b565b34801561012e57600080fd5b5061009961013d36600461073c565b610347565b34801561014e57600080fd5b506100e06103ef565b61009961016536600461071b565b6103fe565b61009961040b565b34801561017e57600080fd5b5061009961018d36600461076e565b610417565b6000638d6e9a5b60e01b82346040516024016101af929190610879565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526002549091506101fe906001600160a01b03168262124f80610578565b826001600160a01b03167ff531653a5819e21265de50358610d55dbe6594c61605b209dfa4280d277938c18334604051610239929190610879565b60405180910390a2505050565b62124f8081565b6001546001600160a01b031681565b6000546001600160a01b031681565b60015460405163bf40fac160e01b81526020600482018181528451602484015284516000946001600160a01b03169363bf40fac1938793928392604401918501908083838b5b838110156102c95781810151838201526020016102b1565b50505050905090810190601f1680156102f65780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561031357600080fd5b505afa158015610327573d6000803e3d6000fd5b505050506040513d602081101561033d57600080fd5b505190505b919050565b6001546001600160a01b0316156103795760405162461bcd60e51b8152600401610370906108e6565b60405180910390fd5b600180546001600160a01b038085166001600160a01b0319928316179092556002805492841692909116919091179055604080516060810190915260218082526103cb91906109a5602083013961026b565b600080546001600160a01b0319166001600160a01b03929092169190911790555050565b6002546001600160a01b031681565b6104083382610192565b50565b6104153333610192565b565b6002546001600160a01b031661042b610663565b6001600160a01b0316336001600160a01b03161461047a5760405162461bcd60e51b815260040180806020018281038252602e815260200180610947602e913960400191505060405180910390fd5b806001600160a01b031661048c610663565b6001600160a01b0316636e296e456040518163ffffffff1660e01b815260040160206040518083038186803b1580156104c457600080fd5b505afa1580156104d8573d6000803e3d6000fd5b505050506040513d60208110156104ee57600080fd5b50516001600160a01b0316146105355760405162461bcd60e51b81526004018080602001828103825260308152602001806109756030913960400191505060405180910390fd5b61053f8383610672565b826001600160a01b03167f9e5c4f9f4e46b8629d3dda85f43a69194f50254404a72dc62b9e932d9c94eda883604051610239919061092c565b610580610663565b6001600160a01b0316633dbb202b8484846040518463ffffffff1660e01b815260040180846001600160a01b03168152602001806020018363ffffffff168152602001828103825284818151815260200191508051906020019080838360005b838110156105f85781810151838201526020016105e0565b50505050905090810190601f1680156106255780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b15801561064657600080fd5b505af115801561065a573d6000803e3d6000fd5b50505050505050565b6000546001600160a01b031690565b604080516000808252602082019092526001600160a01b03841690839060405161069c919061082c565b60006040518083038185875af1925050503d80600081146106d9576040519150601f19603f3d011682016040523d82523d6000602084013e6106de565b606091505b50509050806106ff5760405162461bcd60e51b815260040161037090610892565b505050565b80356001600160a01b038116811461034257600080fd5b60006020828403121561072c578081fd5b61073582610704565b9392505050565b6000806040838503121561074e578081fd5b61075783610704565b915061076560208401610704565b90509250929050565b60008060408385031215610780578182fd5b61078983610704565b946020939093013593505050565b600060208083850312156107a9578182fd5b823567ffffffffffffffff808211156107c0578384fd5b818501915085601f8301126107d3578384fd5b8135818111156107df57fe5b604051601f8201601f19168101850183811182821017156107fc57fe5b6040528181528382018501881015610812578586fd5b818585018683013790810190930193909352509392505050565b60008251815b8181101561084c5760208186018101518583015201610832565b8181111561085a5782828501525b509190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b60208082526034908201527f5472616e7366657248656c7065723a3a736166655472616e736665724554483a60408201527308115512081d1c985b9cd9995c8819985a5b195960621b606082015260800190565b60208082526026908201527f436f6e74726163742068617320616c7265616479206265656e20696e697469616040820152653634bd32b21760d11b606082015260800190565b90815260200190565b63ffffffff9190911681526020019056fe4f564d5f58434841494e3a206d657373656e67657220636f6e747261637420756e61757468656e746963617465644f564d5f58434841494e3a2077726f6e672073656e646572206f662063726f73732d646f6d61696e206d65737361676550726f78795f5f4f564d5f4c3143726f7373446f6d61696e4d657373656e676572a2646970667358221220d8a6002280930d6eb8035b95d663889b1a8e3dbd1b07997ca03239bd5372e85b64736f6c63430007060033", + "deployedBytecode": "0x60806040526004361061008a5760003560e01c8063485cc95511610059578063485cc95514610122578063490b5b7814610142578063b760faf914610157578063d0e30db01461016a578063f4f7b41a146101725761009b565b80631273a090146100a0578063299ca478146100cb5780633cb747bf146100ed578063461a4478146101025761009b565b3661009b576100993333610192565b005b600080fd5b3480156100ac57600080fd5b506100b5610246565b6040516100c29190610935565b60405180910390f35b3480156100d757600080fd5b506100e061024d565b6040516100c29190610865565b3480156100f957600080fd5b506100e061025c565b34801561010e57600080fd5b506100e061011d366004610797565b61026b565b34801561012e57600080fd5b5061009961013d36600461073c565b610347565b34801561014e57600080fd5b506100e06103ef565b61009961016536600461071b565b6103fe565b61009961040b565b34801561017e57600080fd5b5061009961018d36600461076e565b610417565b6000638d6e9a5b60e01b82346040516024016101af929190610879565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526002549091506101fe906001600160a01b03168262124f80610578565b826001600160a01b03167ff531653a5819e21265de50358610d55dbe6594c61605b209dfa4280d277938c18334604051610239929190610879565b60405180910390a2505050565b62124f8081565b6001546001600160a01b031681565b6000546001600160a01b031681565b60015460405163bf40fac160e01b81526020600482018181528451602484015284516000946001600160a01b03169363bf40fac1938793928392604401918501908083838b5b838110156102c95781810151838201526020016102b1565b50505050905090810190601f1680156102f65780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561031357600080fd5b505afa158015610327573d6000803e3d6000fd5b505050506040513d602081101561033d57600080fd5b505190505b919050565b6001546001600160a01b0316156103795760405162461bcd60e51b8152600401610370906108e6565b60405180910390fd5b600180546001600160a01b038085166001600160a01b0319928316179092556002805492841692909116919091179055604080516060810190915260218082526103cb91906109a5602083013961026b565b600080546001600160a01b0319166001600160a01b03929092169190911790555050565b6002546001600160a01b031681565b6104083382610192565b50565b6104153333610192565b565b6002546001600160a01b031661042b610663565b6001600160a01b0316336001600160a01b03161461047a5760405162461bcd60e51b815260040180806020018281038252602e815260200180610947602e913960400191505060405180910390fd5b806001600160a01b031661048c610663565b6001600160a01b0316636e296e456040518163ffffffff1660e01b815260040160206040518083038186803b1580156104c457600080fd5b505afa1580156104d8573d6000803e3d6000fd5b505050506040513d60208110156104ee57600080fd5b50516001600160a01b0316146105355760405162461bcd60e51b81526004018080602001828103825260308152602001806109756030913960400191505060405180910390fd5b61053f8383610672565b826001600160a01b03167f9e5c4f9f4e46b8629d3dda85f43a69194f50254404a72dc62b9e932d9c94eda883604051610239919061092c565b610580610663565b6001600160a01b0316633dbb202b8484846040518463ffffffff1660e01b815260040180846001600160a01b03168152602001806020018363ffffffff168152602001828103825284818151815260200191508051906020019080838360005b838110156105f85781810151838201526020016105e0565b50505050905090810190601f1680156106255780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b15801561064657600080fd5b505af115801561065a573d6000803e3d6000fd5b50505050505050565b6000546001600160a01b031690565b604080516000808252602082019092526001600160a01b03841690839060405161069c919061082c565b60006040518083038185875af1925050503d80600081146106d9576040519150601f19603f3d011682016040523d82523d6000602084013e6106de565b606091505b50509050806106ff5760405162461bcd60e51b815260040161037090610892565b505050565b80356001600160a01b038116811461034257600080fd5b60006020828403121561072c578081fd5b61073582610704565b9392505050565b6000806040838503121561074e578081fd5b61075783610704565b915061076560208401610704565b90509250929050565b60008060408385031215610780578182fd5b61078983610704565b946020939093013593505050565b600060208083850312156107a9578182fd5b823567ffffffffffffffff808211156107c0578384fd5b818501915085601f8301126107d3578384fd5b8135818111156107df57fe5b604051601f8201601f19168101850183811182821017156107fc57fe5b6040528181528382018501881015610812578586fd5b818585018683013790810190930193909352509392505050565b60008251815b8181101561084c5760208186018101518583015201610832565b8181111561085a5782828501525b509190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b60208082526034908201527f5472616e7366657248656c7065723a3a736166655472616e736665724554483a60408201527308115512081d1c985b9cd9995c8819985a5b195960621b606082015260800190565b60208082526026908201527f436f6e74726163742068617320616c7265616479206265656e20696e697469616040820152653634bd32b21760d11b606082015260800190565b90815260200190565b63ffffffff9190911681526020019056fe4f564d5f58434841494e3a206d657373656e67657220636f6e747261637420756e61757468656e746963617465644f564d5f58434841494e3a2077726f6e672073656e646572206f662063726f73732d646f6d61696e206d65737361676550726f78795f5f4f564d5f4c3143726f7373446f6d61696e4d657373656e676572a2646970667358221220d8a6002280930d6eb8035b95d663889b1a8e3dbd1b07997ca03239bd5372e85b64736f6c63430007060033", + "devdoc": { + "details": "The L1 ETH Gateway is a contract which stores deposited ETH that is in use on L2. Compiler used: solc Runtime target: EVM", + "kind": "dev", + "methods": { + "deposit()": { + "details": "deposit an amount of the ETH to the caller's balance on L2" + }, + "depositTo(address)": { + "details": "deposit an amount of ETH to a recipients's balance on L2", + "params": { + "_to": "L2 address to credit the withdrawal to" + } + }, + "finalizeWithdrawal(address,uint256)": { + "details": "Complete a withdrawal from L2 to L1, and credit funds to the recipient's balance of the L1 ETH token. Since only the xDomainMessenger can call this function, it will never be called before the withdrawal is finalized.", + "params": { + "_amount": "Amount of the ETH to withdraw", + "_to": "L1 address to credit the withdrawal to" + } + }, + "initialize(address,address)": { + "params": { + "_libAddressManager": "Address manager for this OE deployment", + "_ovmEth": "L2 OVM_ETH implementation of iOVM_DepositedToken" + } + }, + "resolve(string)": { + "params": { + "_name": "Name to resolve an address for." + }, + "returns": { + "_0": "Address associated with the given name." + } + } + }, + "title": "OVM_L1ETHGateway", + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": { + "resolve(string)": { + "notice": "Resolves the address associated with a given name." + } + }, + "version": 1 + }, + "storageLayout": { + "storage": [ + { + "astId": 11243, + "contract": "contracts/optimistic-ethereum/OVM/bridge/tokens/OVM_L1ETHGateway.sol:OVM_L1ETHGateway", + "label": "messenger", + "offset": 0, + "slot": "0", + "type": "t_address" + }, + { + "astId": 12055, + "contract": "contracts/optimistic-ethereum/OVM/bridge/tokens/OVM_L1ETHGateway.sol:OVM_L1ETHGateway", + "label": "libAddressManager", + "offset": 0, + "slot": "1", + "type": "t_contract(Lib_AddressManager)12048" + }, + { + "astId": 1907, + "contract": "contracts/optimistic-ethereum/OVM/bridge/tokens/OVM_L1ETHGateway.sol:OVM_L1ETHGateway", + "label": "ovmEth", + "offset": 0, + "slot": "2", + "type": "t_address" + } + ], + "types": { + "t_address": { + "encoding": "inplace", + "label": "address", + "numberOfBytes": "20" + }, + "t_contract(Lib_AddressManager)12048": { + "encoding": "inplace", + "label": "contract Lib_AddressManager", + "numberOfBytes": "20" + } + } + } +} \ No newline at end of file diff --git a/packages/contracts/deployments/goerli-v3/OVM_L1MultiMessageRelayer.json b/packages/contracts/deployments/goerli-v3/OVM_L1MultiMessageRelayer.json new file mode 100644 index 0000000000000..8ce0f27457d5c --- /dev/null +++ b/packages/contracts/deployments/goerli-v3/OVM_L1MultiMessageRelayer.json @@ -0,0 +1,234 @@ +{ + "address": "0x737557d97f7f2ccb0263C4b55f0D735D52c2D385", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_libAddressManager", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "address", + "name": "target", + "type": "address" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "bytes", + "name": "message", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "messageNonce", + "type": "uint256" + }, + { + "components": [ + { + "internalType": "bytes32", + "name": "stateRoot", + "type": "bytes32" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "batchIndex", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "batchRoot", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "batchSize", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "prevTotalElements", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "extraData", + "type": "bytes" + } + ], + "internalType": "struct Lib_OVMCodec.ChainBatchHeader", + "name": "stateRootBatchHeader", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + }, + { + "internalType": "bytes32[]", + "name": "siblings", + "type": "bytes32[]" + } + ], + "internalType": "struct Lib_OVMCodec.ChainInclusionProof", + "name": "stateRootProof", + "type": "tuple" + }, + { + "internalType": "bytes", + "name": "stateTrieWitness", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "storageTrieWitness", + "type": "bytes" + } + ], + "internalType": "struct iOVM_L1CrossDomainMessenger.L2MessageInclusionProof", + "name": "proof", + "type": "tuple" + } + ], + "internalType": "struct iOVM_L1MultiMessageRelayer.L2ToL1Message[]", + "name": "_messages", + "type": "tuple[]" + } + ], + "name": "batchRelayMessages", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "libAddressManager", + "outputs": [ + { + "internalType": "contract Lib_AddressManager", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "_name", + "type": "string" + } + ], + "name": "resolve", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "transactionHash": "0x4980c4690dc98b1cf4e24b20fc822b96a70e062195daeb603abaca93e5344003", + "receipt": { + "to": null, + "from": "0x4107438C1b1579f258AF9d1AC06194C4a0F55040", + "contractAddress": "0x737557d97f7f2ccb0263C4b55f0D735D52c2D385", + "transactionIndex": 2, + "gasUsed": "606489", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0x0df30adfabcfa2a632c8bc3fbd23be38c9ae56ca684651653924bac5734e5bd4", + "transactionHash": "0x4980c4690dc98b1cf4e24b20fc822b96a70e062195daeb603abaca93e5344003", + "logs": [], + "blockNumber": 4694125, + "cumulativeGasUsed": "1039312", + "status": 1, + "byzantium": true + }, + "args": [ + "0xE3d08F0D900A2D53cB794cf82d7127764BcC3092" + ], + "solcInputHash": "dde656dd41f49cad9eac9bc7065fd6a7", + "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"messageNonce\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"stateRootBatchHeader\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"siblings\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct Lib_OVMCodec.ChainInclusionProof\",\"name\":\"stateRootProof\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"stateTrieWitness\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"storageTrieWitness\",\"type\":\"bytes\"}],\"internalType\":\"struct iOVM_L1CrossDomainMessenger.L2MessageInclusionProof\",\"name\":\"proof\",\"type\":\"tuple\"}],\"internalType\":\"struct iOVM_L1MultiMessageRelayer.L2ToL1Message[]\",\"name\":\"_messages\",\"type\":\"tuple[]\"}],\"name\":\"batchRelayMessages\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The L1 Multi-Message Relayer contract is a gas efficiency optimization which enables the relayer to submit multiple messages in a single transaction to be relayed by the L1 Cross Domain Message Sender. Compiler used: solc Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"batchRelayMessages((address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))[])\":{\"params\":{\"_messages\":\"An array of L2 to L1 messages\"}},\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}}},\"title\":\"OVM_L1MultiMessageRelayer\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"batchRelayMessages((address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))[])\":{\"notice\":\"Forwards multiple cross domain messages to the L1 Cross Domain Messenger for relaying\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1MultiMessageRelayer.sol\":\"OVM_L1MultiMessageRelayer\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor () internal {\\n address msgSender = _msgSender();\\n _owner = msgSender;\\n emit OwnershipTransferred(address(0), msgSender);\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n emit OwnershipTransferred(_owner, address(0));\\n _owner = address(0);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n emit OwnershipTransferred(_owner, newOwner);\\n _owner = newOwner;\\n }\\n}\\n\",\"keccak256\":\"0x15e2d5bd4c28a88548074c54d220e8086f638a71ed07e6b3ba5a70066fcf458d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with GSN meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address payable) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes memory) {\\n this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x8d3cb350f04ff49cfb10aef08d87f19dcbaecc8027b0bed12f3275cd12f38cf0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1MultiMessageRelayer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// @unsupported: ovm\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Interface Imports */\\nimport { iOVM_L1CrossDomainMessenger } from \\\"../../../iOVM/bridge/messaging/iOVM_L1CrossDomainMessenger.sol\\\";\\nimport { iOVM_L1MultiMessageRelayer } from \\\"../../../iOVM/bridge/messaging/iOVM_L1MultiMessageRelayer.sol\\\";\\n\\n/* Library Imports */\\nimport { Lib_AddressResolver } from \\\"../../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/**\\n * @title OVM_L1MultiMessageRelayer\\n * @dev The L1 Multi-Message Relayer contract is a gas efficiency optimization which enables the\\n * relayer to submit multiple messages in a single transaction to be relayed by the L1 Cross Domain\\n * Message Sender.\\n *\\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract OVM_L1MultiMessageRelayer is iOVM_L1MultiMessageRelayer, Lib_AddressResolver {\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n */\\n constructor(\\n address _libAddressManager\\n )\\n Lib_AddressResolver(_libAddressManager)\\n {}\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyBatchRelayer() {\\n require(\\n msg.sender == resolve(\\\"OVM_L2BatchMessageRelayer\\\"),\\n \\\"OVM_L1MultiMessageRelayer: Function can only be called by the OVM_L2BatchMessageRelayer\\\"\\n );\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * @notice Forwards multiple cross domain messages to the L1 Cross Domain Messenger for relaying\\n * @param _messages An array of L2 to L1 messages\\n */\\n function batchRelayMessages(\\n L2ToL1Message[] calldata _messages\\n ) \\n override\\n external\\n onlyBatchRelayer\\n {\\n iOVM_L1CrossDomainMessenger messenger = iOVM_L1CrossDomainMessenger(\\n resolve(\\\"Proxy__OVM_L1CrossDomainMessenger\\\")\\n );\\n\\n for (uint256 i = 0; i < _messages.length; i++) {\\n L2ToL1Message memory message = _messages[i];\\n messenger.relayMessage(\\n message.target,\\n message.sender,\\n message.message,\\n message.messageNonce,\\n message.proof\\n );\\n }\\n }\\n}\\n\",\"keccak256\":\"0xe698b8dbdcecd055ee77cc553963f966faebcdefbed1e586f7fd603fa816d9c6\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/bridge/messaging/iAbs_BaseCrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/**\\n * @title iAbs_BaseCrossDomainMessenger\\n */\\ninterface iAbs_BaseCrossDomainMessenger {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event SentMessage(bytes message);\\n event RelayedMessage(bytes32 msgHash);\\n event FailedRelayedMessage(bytes32 msgHash);\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n function xDomainMessageSender() external view returns (address);\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sends a cross domain message to the target messenger.\\n * @param _target Target contract address.\\n * @param _message Message to send to the target.\\n * @param _gasLimit Gas limit for the provided message.\\n */\\n function sendMessage(\\n address _target,\\n bytes calldata _message,\\n uint32 _gasLimit\\n ) external;\\n}\\n\",\"keccak256\":\"0x89981ed48e99d6939cc6cdef827d484fa3e2292d66c0ba5056c7050cb6282d7e\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/bridge/messaging/iOVM_L1CrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { iAbs_BaseCrossDomainMessenger } from \\\"./iAbs_BaseCrossDomainMessenger.sol\\\";\\n\\n/**\\n * @title iOVM_L1CrossDomainMessenger\\n */\\ninterface iOVM_L1CrossDomainMessenger is iAbs_BaseCrossDomainMessenger {\\n\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n struct L2MessageInclusionProof {\\n bytes32 stateRoot;\\n Lib_OVMCodec.ChainBatchHeader stateRootBatchHeader;\\n Lib_OVMCodec.ChainInclusionProof stateRootProof;\\n bytes stateTrieWitness;\\n bytes storageTrieWitness;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Relays a cross domain message to a contract.\\n * @param _target Target contract address.\\n * @param _sender Message sender address.\\n * @param _message Message to send to the target.\\n * @param _messageNonce Nonce for the provided message.\\n * @param _proof Inclusion proof for the given message.\\n */\\n function relayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _messageNonce,\\n L2MessageInclusionProof memory _proof\\n ) external;\\n\\n /**\\n * Replays a cross domain message to the target messenger.\\n * @param _target Target contract address.\\n * @param _sender Original sender address.\\n * @param _message Message to send to the target.\\n * @param _messageNonce Nonce for the provided message.\\n * @param _gasLimit Gas limit for the provided message.\\n */\\n function replayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _messageNonce,\\n uint32 _gasLimit\\n ) external;\\n}\\n\",\"keccak256\":\"0xdcd239d0b215e400674d78e8db4ac12ba18efc34fa78e24c2ff867f61062dba2\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/bridge/messaging/iOVM_L1MultiMessageRelayer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Interface Imports */\\nimport { iOVM_L1CrossDomainMessenger } from \\\"../../../iOVM/bridge/messaging/iOVM_L1CrossDomainMessenger.sol\\\";\\ninterface iOVM_L1MultiMessageRelayer {\\n\\n struct L2ToL1Message {\\n address target;\\n address sender;\\n bytes message;\\n uint256 messageNonce;\\n iOVM_L1CrossDomainMessenger.L2MessageInclusionProof proof;\\n }\\n\\n function batchRelayMessages(L2ToL1Message[] calldata _messages) external;\\n}\\n\",\"keccak256\":\"0x8bc1fb2a33dcac59ec307195f8b8358d1ae2ab021c70a1589038b366d1b949d7\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/codec/Lib_OVMCodec.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../utils/Lib_Bytes32Utils.sol\\\";\\n\\n/**\\n * @title Lib_OVMCodec\\n */\\nlibrary Lib_OVMCodec {\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum QueueOrigin {\\n SEQUENCER_QUEUE,\\n L1TOL2_QUEUE\\n }\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Account {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n address ethAddress;\\n bool isFresh;\\n }\\n\\n struct EVMAccount {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n }\\n\\n struct ChainBatchHeader {\\n uint256 batchIndex;\\n bytes32 batchRoot;\\n uint256 batchSize;\\n uint256 prevTotalElements;\\n bytes extraData;\\n }\\n\\n struct ChainInclusionProof {\\n uint256 index;\\n bytes32[] siblings;\\n }\\n\\n struct Transaction {\\n uint256 timestamp;\\n uint256 blockNumber;\\n QueueOrigin l1QueueOrigin;\\n address l1TxOrigin;\\n address entrypoint;\\n uint256 gasLimit;\\n bytes data;\\n }\\n\\n struct TransactionChainElement {\\n bool isSequenced;\\n uint256 queueIndex; // QUEUED TX ONLY\\n uint256 timestamp; // SEQUENCER TX ONLY\\n uint256 blockNumber; // SEQUENCER TX ONLY\\n bytes txData; // SEQUENCER TX ONLY\\n }\\n\\n struct QueueElement {\\n bytes32 transactionHash;\\n uint40 timestamp;\\n uint40 blockNumber;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Encodes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Encoded transaction bytes.\\n */\\n function encodeTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return abi.encodePacked(\\n _transaction.timestamp,\\n _transaction.blockNumber,\\n _transaction.l1QueueOrigin,\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n );\\n }\\n\\n /**\\n * Hashes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Hashed transaction\\n */\\n function hashTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(encodeTransaction(_transaction));\\n }\\n\\n /**\\n * Converts an OVM account to an EVM account.\\n * @param _in OVM account to convert.\\n * @return Converted EVM account.\\n */\\n function toEVMAccount(\\n Account memory _in\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n return EVMAccount({\\n nonce: _in.nonce,\\n balance: _in.balance,\\n storageRoot: _in.storageRoot,\\n codeHash: _in.codeHash\\n });\\n }\\n\\n /**\\n * @notice RLP-encodes an account state struct.\\n * @param _account Account state struct.\\n * @return RLP-encoded account state.\\n */\\n function encodeEVMAccount(\\n EVMAccount memory _account\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes[] memory raw = new bytes[](4);\\n\\n // Unfortunately we can't create this array outright because\\n // Lib_RLPWriter.writeList will reject fixed-size arrays. Assigning\\n // index-by-index circumvents this issue.\\n raw[0] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.nonce)\\n )\\n );\\n raw[1] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.balance)\\n )\\n );\\n raw[2] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.storageRoot));\\n raw[3] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.codeHash));\\n\\n return Lib_RLPWriter.writeList(raw);\\n }\\n\\n /**\\n * @notice Decodes an RLP-encoded account state into a useful struct.\\n * @param _encoded RLP-encoded account state.\\n * @return Account state struct.\\n */\\n function decodeEVMAccount(\\n bytes memory _encoded\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\\n\\n return EVMAccount({\\n nonce: Lib_RLPReader.readUint256(accountState[0]),\\n balance: Lib_RLPReader.readUint256(accountState[1]),\\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\\n });\\n }\\n\\n /**\\n * Calculates a hash for a given batch header.\\n * @param _batchHeader Header to hash.\\n * @return Hash of the header.\\n */\\n function hashBatchHeader(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(\\n abi.encode(\\n _batchHeader.batchRoot,\\n _batchHeader.batchSize,\\n _batchHeader.prevTotalElements,\\n _batchHeader.extraData\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0xd85ba2066057a2677926f484b938c7c2ef33ff3853f3b71cda252f4a54f30e05\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n public\\n onlyOwner\\n {\\n addresses[_getNameHash(_name)] = _address;\\n\\n emit AddressSet(\\n _name,\\n _address\\n );\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0x2ce671a0e004df88b136bea5a3c59d0732cea8887c8496da1d509e0200b03d7d\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(\\n address _libAddressManager\\n ) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x65981feeabff6a81783ea97d44baf988a18a86c8cb374c46fdb71819cbacc7c0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPReader.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_RLPReader\\n * @dev Adapted from \\\"RLPReader\\\" by Hamdi Allam (hamdi.allam97@gmail.com).\\n */\\nlibrary Lib_RLPReader {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 constant internal MAX_LIST_LENGTH = 32;\\n\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum RLPItemType {\\n DATA_ITEM,\\n LIST_ITEM\\n }\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct RLPItem {\\n uint256 length;\\n uint256 ptr;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts bytes to a reference to memory position and length.\\n * @param _in Input bytes to convert.\\n * @return Output memory reference.\\n */\\n function toRLPItem(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem memory\\n )\\n {\\n uint256 ptr;\\n assembly {\\n ptr := add(_in, 32)\\n }\\n\\n return RLPItem({\\n length: _in.length,\\n ptr: ptr\\n });\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n (\\n uint256 listOffset,\\n ,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.LIST_ITEM,\\n \\\"Invalid RLP list value.\\\"\\n );\\n\\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\\n // writing to the length. Since we can't know the number of RLP items without looping over\\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\\n // simply set a reasonable maximum list length and decrease the size before we finish.\\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\\n\\n uint256 itemCount = 0;\\n uint256 offset = listOffset;\\n while (offset < _in.length) {\\n require(\\n itemCount < MAX_LIST_LENGTH,\\n \\\"Provided RLP list exceeds max list length.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n ) = _decodeLength(RLPItem({\\n length: _in.length - offset,\\n ptr: _in.ptr + offset\\n }));\\n\\n out[itemCount] = RLPItem({\\n length: itemLength + itemOffset,\\n ptr: _in.ptr + offset\\n });\\n\\n itemCount += 1;\\n offset += itemOffset + itemLength;\\n }\\n\\n // Decrease the array size to match the actual item count.\\n assembly {\\n mstore(out, itemCount)\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n return readList(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes value.\\\"\\n );\\n\\n return _copy(_in.ptr, itemOffset, itemLength);\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return readBytes(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return string(readBytes(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return readString(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n require(\\n _in.length <= 33,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr + itemOffset;\\n bytes32 out;\\n assembly {\\n out := mload(ptr)\\n\\n // Shift the bytes over to match the item size.\\n if lt(itemLength, 32) {\\n out := div(out, exp(256, sub(32, itemLength)))\\n }\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return readBytes32(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return uint256(readBytes32(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return readUint256(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n require(\\n _in.length == 1,\\n \\\"Invalid RLP boolean value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 out;\\n assembly {\\n out := byte(0, mload(ptr))\\n }\\n\\n require(\\n out == 0 || out == 1,\\n \\\"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\\\"\\n );\\n\\n return out != 0;\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return readBool(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n if (_in.length == 1) {\\n return address(0);\\n }\\n\\n require(\\n _in.length == 21,\\n \\\"Invalid RLP address value.\\\"\\n );\\n\\n return address(readUint256(_in));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return readAddress(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads the raw bytes of an RLP item.\\n * @param _in RLP item to read.\\n * @return Raw RLP bytes.\\n */\\n function readRawBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in);\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Decodes the length of an RLP item.\\n * @param _in RLP item to decode.\\n * @return Offset of the encoded data.\\n * @return Length of the encoded data.\\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\\n */\\n function _decodeLength(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n uint256,\\n uint256,\\n RLPItemType\\n )\\n {\\n require(\\n _in.length > 0,\\n \\\"RLP item cannot be null.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 prefix;\\n assembly {\\n prefix := byte(0, mload(ptr))\\n }\\n\\n if (prefix <= 0x7f) {\\n // Single byte.\\n\\n return (0, 1, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xb7) {\\n // Short string.\\n\\n uint256 strLen = prefix - 0x80;\\n\\n require(\\n _in.length > strLen,\\n \\\"Invalid RLP short string.\\\"\\n );\\n\\n return (1, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xbf) {\\n // Long string.\\n uint256 lenOfStrLen = prefix - 0xb7;\\n\\n require(\\n _in.length > lenOfStrLen,\\n \\\"Invalid RLP long string length.\\\"\\n );\\n\\n uint256 strLen;\\n assembly {\\n // Pick out the string length.\\n strLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfStrLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfStrLen + strLen,\\n \\\"Invalid RLP long string.\\\"\\n );\\n\\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xf7) {\\n // Short list.\\n uint256 listLen = prefix - 0xc0;\\n\\n require(\\n _in.length > listLen,\\n \\\"Invalid RLP short list.\\\"\\n );\\n\\n return (1, listLen, RLPItemType.LIST_ITEM);\\n } else {\\n // Long list.\\n uint256 lenOfListLen = prefix - 0xf7;\\n\\n require(\\n _in.length > lenOfListLen,\\n \\\"Invalid RLP long list length.\\\"\\n );\\n\\n uint256 listLen;\\n assembly {\\n // Pick out the list length.\\n listLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfListLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfListLen + listLen,\\n \\\"Invalid RLP long list.\\\"\\n );\\n\\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\\n }\\n }\\n\\n /**\\n * Copies the bytes from a memory location.\\n * @param _src Pointer to the location to read from.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Copied bytes.\\n */\\n function _copy(\\n uint256 _src,\\n uint256 _offset,\\n uint256 _length\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out = new bytes(_length);\\n if (out.length == 0) {\\n return out;\\n }\\n\\n uint256 src = _src + _offset;\\n uint256 dest;\\n assembly {\\n dest := add(out, 32)\\n }\\n\\n // Copy over as many complete words as we can.\\n for (uint256 i = 0; i < _length / 32; i++) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n\\n src += 32;\\n dest += 32;\\n }\\n\\n // Pick out the remaining bytes.\\n uint256 mask = 256 ** (32 - (_length % 32)) - 1;\\n assembly {\\n mstore(\\n dest,\\n or(\\n and(mload(src), not(mask)),\\n and(mload(dest), mask)\\n )\\n )\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Copies an RLP item into bytes.\\n * @param _in RLP item to copy.\\n * @return Copied bytes.\\n */\\n function _copy(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in.ptr, 0, _in.length);\\n }\\n}\\n\",\"keccak256\":\"0x829174c61216dce35fdb888383b6022e0365eb7fbdc71ad79d98b108091969fe\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPWriter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/**\\n * @title Lib_RLPWriter\\n * @author Bakaoh (with modifications)\\n */\\nlibrary Lib_RLPWriter {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * RLP encodes a byte string.\\n * @param _in The byte string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded;\\n\\n if (_in.length == 1 && uint8(_in[0]) < 128) {\\n encoded = _in;\\n } else {\\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * RLP encodes a list of RLP encoded byte byte strings.\\n * @param _in The list of RLP encoded byte strings.\\n * @return The RLP encoded list of items in bytes.\\n */\\n function writeList(\\n bytes[] memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory list = _flatten(_in);\\n return abi.encodePacked(_writeLength(list.length, 192), list);\\n }\\n\\n /**\\n * RLP encodes a string.\\n * @param _in The string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeString(\\n string memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(bytes(_in));\\n }\\n\\n /**\\n * RLP encodes an address.\\n * @param _in The address to encode.\\n * @return The RLP encoded address in bytes.\\n */\\n function writeAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a bytes32 value.\\n * @param _in The bytes32 to encode.\\n * @return _out The RLP encoded bytes32 in bytes.\\n */\\n function writeBytes32(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a uint.\\n * @param _in The uint256 to encode.\\n * @return The RLP encoded uint256 in bytes.\\n */\\n function writeUint(\\n uint256 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(_toBinary(_in));\\n }\\n\\n /**\\n * RLP encodes a bool.\\n * @param _in The bool to encode.\\n * @return The RLP encoded bool in bytes.\\n */\\n function writeBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded = new bytes(1);\\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\\n return encoded;\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\\n * @param _len The length of the string or the payload.\\n * @param _offset 128 if item is string, 192 if item is list.\\n * @return RLP encoded bytes.\\n */\\n function _writeLength(\\n uint256 _len,\\n uint256 _offset\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded;\\n\\n if (_len < 56) {\\n encoded = new bytes(1);\\n encoded[0] = byte(uint8(_len) + uint8(_offset));\\n } else {\\n uint256 lenLen;\\n uint256 i = 1;\\n while (_len / i != 0) {\\n lenLen++;\\n i *= 256;\\n }\\n\\n encoded = new bytes(lenLen + 1);\\n encoded[0] = byte(uint8(lenLen) + uint8(_offset) + 55);\\n for(i = 1; i <= lenLen; i++) {\\n encoded[i] = byte(uint8((_len / (256**(lenLen-i))) % 256));\\n }\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * Encode integer in big endian binary form with no leading zeroes.\\n * @notice TODO: This should be optimized with assembly to save gas costs.\\n * @param _x The integer to encode.\\n * @return RLP encoded bytes.\\n */\\n function _toBinary(\\n uint256 _x\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory b = abi.encodePacked(_x);\\n\\n uint256 i = 0;\\n for (; i < 32; i++) {\\n if (b[i] != 0) {\\n break;\\n }\\n }\\n\\n bytes memory res = new bytes(32 - i);\\n for (uint256 j = 0; j < res.length; j++) {\\n res[j] = b[i++];\\n }\\n\\n return res;\\n }\\n\\n /**\\n * Copies a piece of memory to another location.\\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\\n * @param _dest Destination location.\\n * @param _src Source location.\\n * @param _len Length of memory to copy.\\n */\\n function _memcpy(\\n uint256 _dest,\\n uint256 _src,\\n uint256 _len\\n )\\n private\\n pure\\n {\\n uint256 dest = _dest;\\n uint256 src = _src;\\n uint256 len = _len;\\n\\n for(; len >= 32; len -= 32) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n dest += 32;\\n src += 32;\\n }\\n\\n uint256 mask = 256 ** (32 - len) - 1;\\n assembly {\\n let srcpart := and(mload(src), not(mask))\\n let destpart := and(mload(dest), mask)\\n mstore(dest, or(destpart, srcpart))\\n }\\n }\\n\\n /**\\n * Flattens a list of byte strings into one byte string.\\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\\n * @param _list List of byte strings to flatten.\\n * @return The flattened byte string.\\n */\\n function _flatten(\\n bytes[] memory _list\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n if (_list.length == 0) {\\n return new bytes(0);\\n }\\n\\n uint256 len;\\n uint256 i = 0;\\n for (; i < _list.length; i++) {\\n len += _list[i].length;\\n }\\n\\n bytes memory flattened = new bytes(len);\\n uint256 flattenedPtr;\\n assembly { flattenedPtr := add(flattened, 0x20) }\\n\\n for(i = 0; i < _list.length; i++) {\\n bytes memory item = _list[i];\\n\\n uint256 listPtr;\\n assembly { listPtr := add(item, 0x20)}\\n\\n _memcpy(flattenedPtr, listPtr, item.length);\\n flattenedPtr += _list[i].length;\\n }\\n\\n return flattened;\\n }\\n}\\n\",\"keccak256\":\"0xb60ee4b03ad372c3deff21d454ab714dd0c18ee3e6f9d45532e209fc59d5a54d\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_Bytes32Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_Byte32Utils\\n */\\nlibrary Lib_Bytes32Utils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \\\"true.\\\"\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as a boolean.\\n */\\n function toBool(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return _in != 0;\\n }\\n\\n /**\\n * Converts a boolean to a bytes32 value.\\n * @param _in Input boolean value.\\n * @return Boolean as a bytes32.\\n */\\n function fromBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in ? 1 : 0));\\n }\\n\\n /**\\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as an address.\\n */\\n function toAddress(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return address(uint160(uint256(_in)));\\n }\\n\\n /**\\n * Converts an address to a bytes32.\\n * @param _in Input address value.\\n * @return Address as a bytes32.\\n */\\n function fromAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in));\\n }\\n\\n /**\\n * Removes the leading zeros from a bytes32 value and returns a new (smaller) bytes value.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 without any leading zeros.\\n */\\n function removeLeadingZeros(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out;\\n\\n assembly {\\n // Figure out how many leading zero bytes to remove.\\n let shift := 0\\n for { let i := 0 } and(lt(i, 32), eq(byte(i, _in), 0)) { i := add(i, 1) } {\\n shift := add(shift, 1)\\n }\\n\\n // Reserve some space for our output and fix the free memory pointer.\\n out := mload(0x40)\\n mstore(0x40, add(out, 0x40))\\n\\n // Shift the value and store it into the output bytes.\\n mstore(add(out, 0x20), shl(mul(shift, 8), _in))\\n\\n // Store the new size (with leading zero bytes removed) in the output byte size.\\n mstore(out, sub(32, shift))\\n }\\n\\n return out;\\n }\\n}\\n\",\"keccak256\":\"0xfa2def593e3fc56a31852c3744aefdaa93cec74e721bfcfeb1e5d166c7c60b64\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_BytesUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_BytesUtils\\n */\\nlibrary Lib_BytesUtils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_start + _length >= _start, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n if (_bytes.length - _start == 0) {\\n return bytes('');\\n }\\n\\n return slice(_bytes, _start, _bytes.length - _start);\\n }\\n\\n function toBytes32PadLeft(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n bytes32 ret;\\n uint256 len = _bytes.length <= 32 ? _bytes.length : 32;\\n assembly {\\n ret := shr(mul(sub(32, len), 8), mload(add(_bytes, 32)))\\n }\\n return ret;\\n }\\n\\n function toBytes32(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n if (_bytes.length < 32) {\\n bytes32 ret;\\n assembly {\\n ret := mload(add(_bytes, 32))\\n }\\n return ret;\\n }\\n\\n return abi.decode(_bytes,(bytes32)); // will truncate if input length > 32 bytes\\n }\\n\\n function toUint256(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return uint256(toBytes32(_bytes));\\n }\\n\\n function toUint24(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n uint24\\n )\\n {\\n require(_start + 3 >= _start, \\\"toUint24_overflow\\\");\\n require(_bytes.length >= _start + 3 , \\\"toUint24_outOfBounds\\\");\\n uint24 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x3), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toUint8(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n uint8\\n )\\n {\\n require(_start + 1 >= _start, \\\"toUint8_overflow\\\");\\n require(_bytes.length >= _start + 1 , \\\"toUint8_outOfBounds\\\");\\n uint8 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x1), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toAddress(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n require(_start + 20 >= _start, \\\"toAddress_overflow\\\");\\n require(_bytes.length >= _start + 20, \\\"toAddress_outOfBounds\\\");\\n address tempAddress;\\n\\n assembly {\\n tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000)\\n }\\n\\n return tempAddress;\\n }\\n\\n function toNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory nibbles = new bytes(_bytes.length * 2);\\n\\n for (uint256 i = 0; i < _bytes.length; i++) {\\n nibbles[i * 2] = _bytes[i] >> 4;\\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\\n }\\n\\n return nibbles;\\n }\\n\\n function fromNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory ret = new bytes(_bytes.length / 2);\\n\\n for (uint256 i = 0; i < ret.length; i++) {\\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\\n }\\n\\n return ret;\\n }\\n\\n function equal(\\n bytes memory _bytes,\\n bytes memory _other\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return keccak256(_bytes) == keccak256(_other);\\n }\\n}\\n\",\"keccak256\":\"0xa5195afe32fb2cf104d156e8f4bd39df1ec79bf6ba232097b9e8e0ee14fbc298\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x608060405234801561001057600080fd5b50604051610a22380380610a2283398101604081905261002f91610054565b600080546001600160a01b0319166001600160a01b0392909216919091179055610082565b600060208284031215610065578081fd5b81516001600160a01b038116811461007b578182fd5b9392505050565b610991806100916000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c806316e9cd9b14610046578063299ca4781461005b578063461a447814610079575b600080fd5b61005961005436600461057d565b61008c565b005b6100636101ea565b60405161007091906106db565b60405180910390f35b6100636100873660046105ec565b6101f9565b6100ca6040518060400160405280601981526020017f4f564d5f4c3242617463684d65737361676552656c61796572000000000000008152506101f9565b6001600160a01b0316336001600160a01b0316146101035760405162461bcd60e51b81526004016100fa906107d7565b60405180910390fd5b600061012660405180606001604052806021815260200161093b602191396101f9565b905060005b828110156101e457600084848381811061014157fe5b9050602002810190610153919061085a565b61015c9061089d565b8051602082015160408084015160608501516080860151925163d7fd19dd60e01b81529596506001600160a01b0389169563d7fd19dd956101a5959094909392916004016106ef565b600060405180830381600087803b1580156101bf57600080fd5b505af11580156101d3573d6000803e3d6000fd5b50506001909301925061012b915050565b50505050565b6000546001600160a01b031681565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b83811015610259578181015183820152602001610241565b50505050905090810190601f1680156102865780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b1580156102a357600080fd5b505afa1580156102b7573d6000803e3d6000fd5b505050506040513d60208110156102cd57600080fd5b505190505b919050565b600067ffffffffffffffff8311156102eb57fe5b6102fe601f8401601f1916602001610879565b905082815283838301111561031257600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b03811681146102d257600080fd5b600082601f830112610350578081fd5b61035f838335602085016102d7565b9392505050565b600060a08284031215610377578081fd5b60405160a0810167ffffffffffffffff828210818311171561039557fe5b816040528293508435835260208501356020840152604085013560408401526060850135606084015260808501359150808211156103d257600080fd5b506103df85828601610340565b6080830152505092915050565b6000604082840312156103fd578081fd5b6040516040810167ffffffffffffffff828210818311171561041b57fe5b816040528293508435835260209150818501358181111561043b57600080fd5b8501601f8101871361044c57600080fd5b80358281111561045857fe5b8381029250610468848401610879565b8181528481019083860185850187018b101561048357600080fd5b600095505b838610156104a6578035835260019590950194918601918601610488565b5080868801525050505050505092915050565b600060a082840312156104ca578081fd5b6104d460a0610879565b905081358152602082013567ffffffffffffffff808211156104f557600080fd5b61050185838601610366565b6020840152604084013591508082111561051a57600080fd5b610526858386016103ec565b6040840152606084013591508082111561053f57600080fd5b61054b85838601610340565b6060840152608084013591508082111561056457600080fd5b5061057184828501610340565b60808301525092915050565b6000806020838503121561058f578182fd5b823567ffffffffffffffff808211156105a6578384fd5b818501915085601f8301126105b9578384fd5b8135818111156105c7578485fd5b86602080830285010111156105da578485fd5b60209290920196919550909350505050565b6000602082840312156105fd578081fd5b813567ffffffffffffffff811115610613578182fd5b8201601f81018413610623578182fd5b610632848235602084016102d7565b949350505050565b60008151808452815b8181101561065f57602081850181015186830182015201610643565b818111156106705782602083870101525b50601f01601f19169290920160200192915050565b6000604083018251845260208084015160408287015282815180855260608801915083830194508592505b808310156106d057845182529383019360019290920191908301906106b0565b509695505050505050565b6001600160a01b0391909116815260200190565b6001600160a01b0386811682528516602082015260a06040820181905260009061071b9083018661063a565b846060840152828103608084015283518152602084015160a06020830152805160a0830152602081015160c0830152604081015160e083015260608101516101008301526080810151905060a061012083015261077c61014083018261063a565b9050604085015182820360408401526107958282610685565b915050606085015182820360608401526107af828261063a565b915050608085015182820360808401526107c9828261063a565b9a9950505050505050505050565b60208082526057908201527f4f564d5f4c314d756c74694d65737361676552656c617965723a2046756e637460408201527f696f6e2063616e206f6e6c792062652063616c6c656420627920746865204f5660608201527f4d5f4c3242617463684d65737361676552656c61796572000000000000000000608082015260a00190565b60008235609e1983360301811261086f578182fd5b9190910192915050565b60405181810167ffffffffffffffff8111828210171561089557fe5b604052919050565b600060a082360312156108ae578081fd5b60405160a0810167ffffffffffffffff82821081831117156108cc57fe5b816040526108d985610329565b83526108e760208601610329565b602084015260408501359150808211156108ff578384fd5b61090b36838701610340565b604084015260608501356060840152608085013591508082111561092d578384fd5b50610571368286016104b956fe50726f78795f5f4f564d5f4c3143726f7373446f6d61696e4d657373656e676572a264697066735822122054e57719bdaae865a83549e03668e0558acc8a0d1d5ba65034f61a02d9a35c6264736f6c63430007060033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100415760003560e01c806316e9cd9b14610046578063299ca4781461005b578063461a447814610079575b600080fd5b61005961005436600461057d565b61008c565b005b6100636101ea565b60405161007091906106db565b60405180910390f35b6100636100873660046105ec565b6101f9565b6100ca6040518060400160405280601981526020017f4f564d5f4c3242617463684d65737361676552656c61796572000000000000008152506101f9565b6001600160a01b0316336001600160a01b0316146101035760405162461bcd60e51b81526004016100fa906107d7565b60405180910390fd5b600061012660405180606001604052806021815260200161093b602191396101f9565b905060005b828110156101e457600084848381811061014157fe5b9050602002810190610153919061085a565b61015c9061089d565b8051602082015160408084015160608501516080860151925163d7fd19dd60e01b81529596506001600160a01b0389169563d7fd19dd956101a5959094909392916004016106ef565b600060405180830381600087803b1580156101bf57600080fd5b505af11580156101d3573d6000803e3d6000fd5b50506001909301925061012b915050565b50505050565b6000546001600160a01b031681565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b83811015610259578181015183820152602001610241565b50505050905090810190601f1680156102865780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b1580156102a357600080fd5b505afa1580156102b7573d6000803e3d6000fd5b505050506040513d60208110156102cd57600080fd5b505190505b919050565b600067ffffffffffffffff8311156102eb57fe5b6102fe601f8401601f1916602001610879565b905082815283838301111561031257600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b03811681146102d257600080fd5b600082601f830112610350578081fd5b61035f838335602085016102d7565b9392505050565b600060a08284031215610377578081fd5b60405160a0810167ffffffffffffffff828210818311171561039557fe5b816040528293508435835260208501356020840152604085013560408401526060850135606084015260808501359150808211156103d257600080fd5b506103df85828601610340565b6080830152505092915050565b6000604082840312156103fd578081fd5b6040516040810167ffffffffffffffff828210818311171561041b57fe5b816040528293508435835260209150818501358181111561043b57600080fd5b8501601f8101871361044c57600080fd5b80358281111561045857fe5b8381029250610468848401610879565b8181528481019083860185850187018b101561048357600080fd5b600095505b838610156104a6578035835260019590950194918601918601610488565b5080868801525050505050505092915050565b600060a082840312156104ca578081fd5b6104d460a0610879565b905081358152602082013567ffffffffffffffff808211156104f557600080fd5b61050185838601610366565b6020840152604084013591508082111561051a57600080fd5b610526858386016103ec565b6040840152606084013591508082111561053f57600080fd5b61054b85838601610340565b6060840152608084013591508082111561056457600080fd5b5061057184828501610340565b60808301525092915050565b6000806020838503121561058f578182fd5b823567ffffffffffffffff808211156105a6578384fd5b818501915085601f8301126105b9578384fd5b8135818111156105c7578485fd5b86602080830285010111156105da578485fd5b60209290920196919550909350505050565b6000602082840312156105fd578081fd5b813567ffffffffffffffff811115610613578182fd5b8201601f81018413610623578182fd5b610632848235602084016102d7565b949350505050565b60008151808452815b8181101561065f57602081850181015186830182015201610643565b818111156106705782602083870101525b50601f01601f19169290920160200192915050565b6000604083018251845260208084015160408287015282815180855260608801915083830194508592505b808310156106d057845182529383019360019290920191908301906106b0565b509695505050505050565b6001600160a01b0391909116815260200190565b6001600160a01b0386811682528516602082015260a06040820181905260009061071b9083018661063a565b846060840152828103608084015283518152602084015160a06020830152805160a0830152602081015160c0830152604081015160e083015260608101516101008301526080810151905060a061012083015261077c61014083018261063a565b9050604085015182820360408401526107958282610685565b915050606085015182820360608401526107af828261063a565b915050608085015182820360808401526107c9828261063a565b9a9950505050505050505050565b60208082526057908201527f4f564d5f4c314d756c74694d65737361676552656c617965723a2046756e637460408201527f696f6e2063616e206f6e6c792062652063616c6c656420627920746865204f5660608201527f4d5f4c3242617463684d65737361676552656c61796572000000000000000000608082015260a00190565b60008235609e1983360301811261086f578182fd5b9190910192915050565b60405181810167ffffffffffffffff8111828210171561089557fe5b604052919050565b600060a082360312156108ae578081fd5b60405160a0810167ffffffffffffffff82821081831117156108cc57fe5b816040526108d985610329565b83526108e760208601610329565b602084015260408501359150808211156108ff578384fd5b61090b36838701610340565b604084015260608501356060840152608085013591508082111561092d578384fd5b50610571368286016104b956fe50726f78795f5f4f564d5f4c3143726f7373446f6d61696e4d657373656e676572a264697066735822122054e57719bdaae865a83549e03668e0558acc8a0d1d5ba65034f61a02d9a35c6264736f6c63430007060033", + "devdoc": { + "details": "The L1 Multi-Message Relayer contract is a gas efficiency optimization which enables the relayer to submit multiple messages in a single transaction to be relayed by the L1 Cross Domain Message Sender. Compiler used: solc Runtime target: EVM", + "kind": "dev", + "methods": { + "batchRelayMessages((address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))[])": { + "params": { + "_messages": "An array of L2 to L1 messages" + } + }, + "constructor": { + "params": { + "_libAddressManager": "Address of the Address Manager." + } + }, + "resolve(string)": { + "params": { + "_name": "Name to resolve an address for." + }, + "returns": { + "_0": "Address associated with the given name." + } + } + }, + "title": "OVM_L1MultiMessageRelayer", + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": { + "batchRelayMessages((address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))[])": { + "notice": "Forwards multiple cross domain messages to the L1 Cross Domain Messenger for relaying" + }, + "resolve(string)": { + "notice": "Resolves the address associated with a given name." + } + }, + "version": 1 + }, + "storageLayout": { + "storage": [ + { + "astId": 12055, + "contract": "contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1MultiMessageRelayer.sol:OVM_L1MultiMessageRelayer", + "label": "libAddressManager", + "offset": 0, + "slot": "0", + "type": "t_contract(Lib_AddressManager)12048" + } + ], + "types": { + "t_contract(Lib_AddressManager)12048": { + "encoding": "inplace", + "label": "contract Lib_AddressManager", + "numberOfBytes": "20" + } + } + } +} \ No newline at end of file diff --git a/packages/contracts/deployments/goerli-v3/OVM_SafetyChecker.json b/packages/contracts/deployments/goerli-v3/OVM_SafetyChecker.json new file mode 100644 index 0000000000000..deb7cad8fb542 --- /dev/null +++ b/packages/contracts/deployments/goerli-v3/OVM_SafetyChecker.json @@ -0,0 +1,74 @@ +{ + "address": "0x71D4ea896C9a2D4a973CC5c7E347B6707691ECa0", + "abi": [ + { + "inputs": [ + { + "internalType": "bytes", + "name": "_bytecode", + "type": "bytes" + } + ], + "name": "isBytecodeSafe", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "pure", + "type": "function" + } + ], + "transactionHash": "0x71b7c1e6832ad929f7d8f28c89efcd535b888c667cc23b7afb74b7f3cb9989be", + "receipt": { + "to": null, + "from": "0x4107438C1b1579f258AF9d1AC06194C4a0F55040", + "contractAddress": "0x71D4ea896C9a2D4a973CC5c7E347B6707691ECa0", + "transactionIndex": 10, + "gasUsed": "243548", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0xc547b5d6b5db90aa7a21312706d22b72125e2883d5ff3ad54698673644e3a14c", + "transactionHash": "0x71b7c1e6832ad929f7d8f28c89efcd535b888c667cc23b7afb74b7f3cb9989be", + "logs": [], + "blockNumber": 4694122, + "cumulativeGasUsed": "839321", + "status": 1, + "byzantium": true + }, + "args": [], + "solcInputHash": "dde656dd41f49cad9eac9bc7065fd6a7", + "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_bytecode\",\"type\":\"bytes\"}],\"name\":\"isBytecodeSafe\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The Safety Checker verifies that contracts deployed on L2 do not contain any \\\"unsafe\\\" operations. An operation is considered unsafe if it would access state variables which are specific to the environment (ie. L1 or L2) in which it is executed, as this could be used to \\\"escape the sandbox\\\" of the OVM, resulting in non-deterministic fraud proofs. That is, an attacker would be able to \\\"prove fraud\\\" on an honestly applied transaction. Note that a \\\"safe\\\" contract requires opcodes to appear in a particular pattern; omission of \\\"unsafe\\\" opcodes is necessary, but not sufficient. Compiler used: solc Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"isBytecodeSafe(bytes)\":{\"params\":{\"_bytecode\":\"The bytecode to safety check.\"},\"returns\":{\"_0\":\"`true` if the bytecode is safe, `false` otherwise.\"}}},\"title\":\"OVM_SafetyChecker\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"isBytecodeSafe(bytes)\":{\"notice\":\"Returns whether or not all of the provided bytecode is safe.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/OVM/execution/OVM_SafetyChecker.sol\":\"OVM_SafetyChecker\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/optimistic-ethereum/OVM/execution/OVM_SafetyChecker.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Interface Imports */\\nimport { iOVM_SafetyChecker } from \\\"../../iOVM/execution/iOVM_SafetyChecker.sol\\\";\\n\\n/**\\n * @title OVM_SafetyChecker\\n * @dev The Safety Checker verifies that contracts deployed on L2 do not contain any\\n * \\\"unsafe\\\" operations. An operation is considered unsafe if it would access state variables which\\n * are specific to the environment (ie. L1 or L2) in which it is executed, as this could be used\\n * to \\\"escape the sandbox\\\" of the OVM, resulting in non-deterministic fraud proofs.\\n * That is, an attacker would be able to \\\"prove fraud\\\" on an honestly applied transaction.\\n * Note that a \\\"safe\\\" contract requires opcodes to appear in a particular pattern;\\n * omission of \\\"unsafe\\\" opcodes is necessary, but not sufficient.\\n *\\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract OVM_SafetyChecker is iOVM_SafetyChecker {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Returns whether or not all of the provided bytecode is safe.\\n * @param _bytecode The bytecode to safety check.\\n * @return `true` if the bytecode is safe, `false` otherwise.\\n */\\n function isBytecodeSafe(\\n bytes memory _bytecode\\n )\\n override\\n external\\n pure\\n returns (\\n bool\\n )\\n {\\n // autogenerated by gen_safety_checker_constants.py\\n // number of bytes to skip for each opcode\\n uint256[8] memory opcodeSkippableBytes = [\\n uint256(0x0001010101010101010101010000000001010101010101010101010101010000),\\n uint256(0x0100000000000000000000000000000000000000010101010101000000010100),\\n uint256(0x0000000000000000000000000000000001010101000000010101010100000000),\\n uint256(0x0203040500000000000000000000000000000000000000000000000000000000),\\n uint256(0x0101010101010101010101010101010101010101010101010101010101010101),\\n uint256(0x0101010101000000000000000000000000000000000000000000000000000000),\\n uint256(0x0000000000000000000000000000000000000000000000000000000000000000),\\n uint256(0x0000000000000000000000000000000000000000000000000000000000000000)\\n ];\\n // Mask to gate opcode specific cases\\n uint256 opcodeGateMask = ~uint256(0xffffffffffffffffffffffe000000000fffffffff070ffff9c0ffffec000f001);\\n // Halting opcodes\\n uint256 opcodeHaltingMask = ~uint256(0x4008000000000000000000000000000000000000004000000000000000000001);\\n // PUSH opcodes\\n uint256 opcodePushMask = ~uint256(0xffffffff000000000000000000000000);\\n\\n uint256 codeLength;\\n uint256 _pc;\\n assembly {\\n _pc := add(_bytecode, 0x20)\\n }\\n codeLength = _pc + _bytecode.length;\\n do {\\n // current opcode: 0x00...0xff\\n uint256 opNum;\\n\\n // inline assembly removes the extra add + bounds check\\n assembly {\\n let word := mload(_pc) //load the next 32 bytes at pc into word\\n\\n // Look up number of bytes to skip from opcodeSkippableBytes and then update indexInWord\\n // E.g. the 02030405 in opcodeSkippableBytes is the number of bytes to skip for PUSH1->4\\n // We repeat this 6 times, thus we can only skip bytes for up to PUSH4 ((1+4) * 6 = 30 < 32).\\n // If we see an opcode that is listed as 0 skippable bytes e.g. PUSH5,\\n // then we will get stuck on that indexInWord and then opNum will be set to the PUSH5 opcode.\\n let indexInWord := byte(0, mload(add(opcodeSkippableBytes, byte(0, word))))\\n indexInWord := add(indexInWord, byte(0, mload(add(opcodeSkippableBytes, byte(indexInWord, word)))))\\n indexInWord := add(indexInWord, byte(0, mload(add(opcodeSkippableBytes, byte(indexInWord, word)))))\\n indexInWord := add(indexInWord, byte(0, mload(add(opcodeSkippableBytes, byte(indexInWord, word)))))\\n indexInWord := add(indexInWord, byte(0, mload(add(opcodeSkippableBytes, byte(indexInWord, word)))))\\n indexInWord := add(indexInWord, byte(0, mload(add(opcodeSkippableBytes, byte(indexInWord, word)))))\\n _pc := add(_pc, indexInWord)\\n\\n opNum := byte(indexInWord, word)\\n }\\n\\n // + push opcodes\\n // + stop opcodes [STOP(0x00),JUMP(0x56),RETURN(0xf3),INVALID(0xfe)]\\n // + caller opcode CALLER(0x33)\\n // + blacklisted opcodes\\n uint256 opBit = 1 << opNum;\\n if (opBit & opcodeGateMask == 0) {\\n if (opBit & opcodePushMask == 0) {\\n // all pushes are valid opcodes\\n // subsequent bytes are not opcodes. Skip them.\\n _pc += (opNum - 0x5e); // PUSH1 is 0x60, so opNum-0x5f = PUSHed bytes and we +1 to\\n // skip the _pc++; line below in order to save gas ((-0x5f + 1) = -0x5e)\\n continue;\\n } else if (opBit & opcodeHaltingMask == 0) {\\n // STOP or JUMP or RETURN or INVALID (Note: REVERT is blacklisted, so not included here)\\n // We are now inside unreachable code until we hit a JUMPDEST!\\n do {\\n _pc++;\\n assembly {\\n opNum := byte(0, mload(_pc))\\n }\\n // encountered a JUMPDEST\\n if (opNum == 0x5b) break;\\n // skip PUSHed bytes\\n if ((1 << opNum) & opcodePushMask == 0) _pc += (opNum - 0x5f); // opNum-0x5f = PUSHed bytes (PUSH1 is 0x60)\\n } while (_pc < codeLength);\\n // opNum is 0x5b, so we don't continue here since the pc++ is fine\\n } else if (opNum == 0x33) { // Caller opcode\\n uint256 firstOps; // next 32 bytes of bytecode\\n uint256 secondOps; // following 32 bytes of bytecode\\n\\n assembly {\\n firstOps := mload(_pc)\\n // 37 bytes total, 5 left over --> 32 - 5 bytes = 27 bytes = 216 bits\\n secondOps := shr(216, mload(add(_pc, 0x20)))\\n }\\n\\n // Call identity precompile\\n // CALLER POP PUSH1 0x00 PUSH1 0x04 GAS CALL\\n // 32 - 8 bytes = 24 bytes = 192\\n if ((firstOps >> 192) == 0x3350600060045af1) {\\n _pc += 8;\\n // Call EM and abort execution if instructed\\n // CALLER PUSH1 0x00 SWAP1 GAS CALL PC PUSH1 0x0E ADD JUMPI RETURNDATASIZE PUSH1 0x00 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x00 REVERT JUMPDEST RETURNDATASIZE PUSH1 0x01 EQ ISZERO PC PUSH1 0x0a ADD JUMPI PUSH1 0x01 PUSH1 0x00 RETURN JUMPDEST\\n } else if (firstOps == 0x336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a015760 && secondOps == 0x016000f35b) {\\n _pc += 37;\\n } else {\\n return false;\\n }\\n continue;\\n } else {\\n // encountered a non-whitelisted opcode!\\n return false;\\n }\\n }\\n _pc++;\\n } while (_pc < codeLength);\\n return true;\\n }\\n}\\n\",\"keccak256\":\"0x44cd4fcdcb25a233fa98da5ba66706ce2f9fbf13359cf7f2891793739687a86f\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/execution/iOVM_SafetyChecker.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title iOVM_SafetyChecker\\n */\\ninterface iOVM_SafetyChecker {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function isBytecodeSafe(bytes calldata _bytecode) external pure returns (bool);\\n}\\n\",\"keccak256\":\"0xde6639676d4ec4f77297652d5ede2429bc93e74e11fefd9e9de4bc92dd784878\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x608060405234801561001057600080fd5b50610373806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063a44eb59a14610030575b600080fd5b6100d66004803603602081101561004657600080fd5b81019060208101813564010000000081111561006157600080fd5b82018360208201111561007357600080fd5b8035906020019184600183028401116401000000008311171561009557600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506100ea945050505050565b604080519115158252519081900360200190f35b60408051610100810182527e0101010101010101010101000000000101010101010101010101010101000081526b010101010101000000010100600160f81b016020808301919091526f0101010100000001010101010000000092820192909252630203040560e01b60608201527f0101010101010101010101010101010101010101010101010101010101010101608082015264010101010160d81b60a0820152600060c0820181905260e0820181905283519092741fffffffff000000000f8f000063f000013fff0ffe916a40000000000000000000026117ff60f31b039163ffffffff60601b1991870181019087015b8051600081811a880151811a82811a890151821a0182811a890151821a0182811a890151821a0182811a890151821a0182811a89015190911a01918201911a6001811b86811661032057808516610239575001605d1901610326565b80861661027e575b8280600101935050825160001a915081605b141561025e57610279565b6001821b851661027157918101605e1901915b838310610241575b610320565b816033141561030f578251602084015160d81c673350600060045af160c083901c14156102b057600885019450610306565b817f336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a0157601480156102e357508064016000f35b145b156102f357602585019450610306565b60009a5050505050505050505050610338565b50505050610326565b600098505050505050505050610338565b50506001015b8181106101dd57600196505050505050505b91905056fea26469706673582212209a836b268dcf58167a9f65bb872e3ddb5bd93b231f6b456f1c5e6d75b92a746364736f6c63430007060033", + "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061002b5760003560e01c8063a44eb59a14610030575b600080fd5b6100d66004803603602081101561004657600080fd5b81019060208101813564010000000081111561006157600080fd5b82018360208201111561007357600080fd5b8035906020019184600183028401116401000000008311171561009557600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506100ea945050505050565b604080519115158252519081900360200190f35b60408051610100810182527e0101010101010101010101000000000101010101010101010101010101000081526b010101010101000000010100600160f81b016020808301919091526f0101010100000001010101010000000092820192909252630203040560e01b60608201527f0101010101010101010101010101010101010101010101010101010101010101608082015264010101010160d81b60a0820152600060c0820181905260e0820181905283519092741fffffffff000000000f8f000063f000013fff0ffe916a40000000000000000000026117ff60f31b039163ffffffff60601b1991870181019087015b8051600081811a880151811a82811a890151821a0182811a890151821a0182811a890151821a0182811a890151821a0182811a89015190911a01918201911a6001811b86811661032057808516610239575001605d1901610326565b80861661027e575b8280600101935050825160001a915081605b141561025e57610279565b6001821b851661027157918101605e1901915b838310610241575b610320565b816033141561030f578251602084015160d81c673350600060045af160c083901c14156102b057600885019450610306565b817f336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a0157601480156102e357508064016000f35b145b156102f357602585019450610306565b60009a5050505050505050505050610338565b50505050610326565b600098505050505050505050610338565b50506001015b8181106101dd57600196505050505050505b91905056fea26469706673582212209a836b268dcf58167a9f65bb872e3ddb5bd93b231f6b456f1c5e6d75b92a746364736f6c63430007060033", + "devdoc": { + "details": "The Safety Checker verifies that contracts deployed on L2 do not contain any \"unsafe\" operations. An operation is considered unsafe if it would access state variables which are specific to the environment (ie. L1 or L2) in which it is executed, as this could be used to \"escape the sandbox\" of the OVM, resulting in non-deterministic fraud proofs. That is, an attacker would be able to \"prove fraud\" on an honestly applied transaction. Note that a \"safe\" contract requires opcodes to appear in a particular pattern; omission of \"unsafe\" opcodes is necessary, but not sufficient. Compiler used: solc Runtime target: EVM", + "kind": "dev", + "methods": { + "isBytecodeSafe(bytes)": { + "params": { + "_bytecode": "The bytecode to safety check." + }, + "returns": { + "_0": "`true` if the bytecode is safe, `false` otherwise." + } + } + }, + "title": "OVM_SafetyChecker", + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": { + "isBytecodeSafe(bytes)": { + "notice": "Returns whether or not all of the provided bytecode is safe." + } + }, + "version": 1 + }, + "storageLayout": { + "storage": [], + "types": null + } +} \ No newline at end of file diff --git a/packages/contracts/deployments/goerli-v3/OVM_StateCommitmentChain.json b/packages/contracts/deployments/goerli-v3/OVM_StateCommitmentChain.json new file mode 100644 index 0000000000000..41eeda6cca390 --- /dev/null +++ b/packages/contracts/deployments/goerli-v3/OVM_StateCommitmentChain.json @@ -0,0 +1,529 @@ +{ + "address": "0x5c3e321947C99698027108351ee736823Bd157D8", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_libAddressManager", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_fraudProofWindow", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_sequencerPublishWindow", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "_batchIndex", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "_batchRoot", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_batchSize", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_prevTotalElements", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "_extraData", + "type": "bytes" + } + ], + "name": "StateBatchAppended", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "_batchIndex", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "_batchRoot", + "type": "bytes32" + } + ], + "name": "StateBatchDeleted", + "type": "event" + }, + { + "inputs": [], + "name": "FRAUD_PROOF_WINDOW", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "SEQUENCER_PUBLISH_WINDOW", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32[]", + "name": "_batch", + "type": "bytes32[]" + }, + { + "internalType": "uint256", + "name": "_shouldStartAtElement", + "type": "uint256" + } + ], + "name": "appendStateBatch", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "batches", + "outputs": [ + { + "internalType": "contract iOVM_ChainStorageContainer", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "batchIndex", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "batchRoot", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "batchSize", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "prevTotalElements", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "extraData", + "type": "bytes" + } + ], + "internalType": "struct Lib_OVMCodec.ChainBatchHeader", + "name": "_batchHeader", + "type": "tuple" + } + ], + "name": "deleteStateBatch", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "getLastSequencerTimestamp", + "outputs": [ + { + "internalType": "uint256", + "name": "_lastSequencerTimestamp", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getTotalBatches", + "outputs": [ + { + "internalType": "uint256", + "name": "_totalBatches", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getTotalElements", + "outputs": [ + { + "internalType": "uint256", + "name": "_totalElements", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "batchIndex", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "batchRoot", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "batchSize", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "prevTotalElements", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "extraData", + "type": "bytes" + } + ], + "internalType": "struct Lib_OVMCodec.ChainBatchHeader", + "name": "_batchHeader", + "type": "tuple" + } + ], + "name": "insideFraudProofWindow", + "outputs": [ + { + "internalType": "bool", + "name": "_inside", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "libAddressManager", + "outputs": [ + { + "internalType": "contract Lib_AddressManager", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "_name", + "type": "string" + } + ], + "name": "resolve", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_element", + "type": "bytes32" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "batchIndex", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "batchRoot", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "batchSize", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "prevTotalElements", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "extraData", + "type": "bytes" + } + ], + "internalType": "struct Lib_OVMCodec.ChainBatchHeader", + "name": "_batchHeader", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + }, + { + "internalType": "bytes32[]", + "name": "siblings", + "type": "bytes32[]" + } + ], + "internalType": "struct Lib_OVMCodec.ChainInclusionProof", + "name": "_proof", + "type": "tuple" + } + ], + "name": "verifyStateCommitment", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "transactionHash": "0xf44aee1847653102e234b3e1acdcc3ec12b328f99e68a9b6fbe90045f4b5c846", + "receipt": { + "to": null, + "from": "0x4107438C1b1579f258AF9d1AC06194C4a0F55040", + "contractAddress": "0x5c3e321947C99698027108351ee736823Bd157D8", + "transactionIndex": 0, + "gasUsed": "1630165", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0x6a15b236bd608f28fb33fcaef422933c3bcf9ae108a761d68d1a2f03e2c1ae85", + "transactionHash": "0xf44aee1847653102e234b3e1acdcc3ec12b328f99e68a9b6fbe90045f4b5c846", + "logs": [], + "blockNumber": 4694101, + "cumulativeGasUsed": "1630165", + "status": 1, + "byzantium": true + }, + "args": [ + "0xE3d08F0D900A2D53cB794cf82d7127764BcC3092", + 30, + 999999999 + ], + "solcInputHash": "dde656dd41f49cad9eac9bc7065fd6a7", + "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_fraudProofWindow\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_sequencerPublishWindow\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_batchIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"_batchRoot\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_batchSize\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_prevTotalElements\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"_extraData\",\"type\":\"bytes\"}],\"name\":\"StateBatchAppended\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_batchIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"_batchRoot\",\"type\":\"bytes32\"}],\"name\":\"StateBatchDeleted\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"FRAUD_PROOF_WINDOW\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"SEQUENCER_PUBLISH_WINDOW\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"_batch\",\"type\":\"bytes32[]\"},{\"internalType\":\"uint256\",\"name\":\"_shouldStartAtElement\",\"type\":\"uint256\"}],\"name\":\"appendStateBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"batches\",\"outputs\":[{\"internalType\":\"contract iOVM_ChainStorageContainer\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"_batchHeader\",\"type\":\"tuple\"}],\"name\":\"deleteStateBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLastSequencerTimestamp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_lastSequencerTimestamp\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTotalBatches\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_totalBatches\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTotalElements\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_totalElements\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"_batchHeader\",\"type\":\"tuple\"}],\"name\":\"insideFraudProofWindow\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"_inside\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_element\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"_batchHeader\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"siblings\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct Lib_OVMCodec.ChainInclusionProof\",\"name\":\"_proof\",\"type\":\"tuple\"}],\"name\":\"verifyStateCommitment\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The State Commitment Chain (SCC) contract contains a list of proposed state roots which Proposers assert to be a result of each transaction in the Canonical Transaction Chain (CTC). Elements here have a 1:1 correspondence with transactions in the CTC, and should be the unique state root calculated off-chain by applying the canonical transactions one by one. Compiler used: solc Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"appendStateBatch(bytes32[],uint256)\":{\"params\":{\"_batch\":\"Batch of state roots.\",\"_shouldStartAtElement\":\"Index of the element at which this batch should start.\"}},\"batches()\":{\"returns\":{\"_0\":\"Reference to the batch storage container.\"}},\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\"}},\"deleteStateBatch((uint256,bytes32,uint256,uint256,bytes))\":{\"params\":{\"_batchHeader\":\"Header of the batch to start deleting from.\"}},\"getLastSequencerTimestamp()\":{\"returns\":{\"_lastSequencerTimestamp\":\"Last sequencer batch timestamp.\"}},\"getTotalBatches()\":{\"returns\":{\"_totalBatches\":\"Total submitted batches.\"}},\"getTotalElements()\":{\"returns\":{\"_totalElements\":\"Total submitted elements.\"}},\"insideFraudProofWindow((uint256,bytes32,uint256,uint256,bytes))\":{\"params\":{\"_batchHeader\":\"Header of the batch to check.\"},\"returns\":{\"_inside\":\"Whether or not the batch is inside the fraud proof window.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}},\"verifyStateCommitment(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))\":{\"params\":{\"_batchHeader\":\"Header of the batch in which the element was included.\",\"_element\":\"Hash of the element to verify a proof for.\",\"_proof\":\"Merkle inclusion proof for the element.\"}}},\"title\":\"OVM_StateCommitmentChain\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"appendStateBatch(bytes32[],uint256)\":{\"notice\":\"Appends a batch of state roots to the chain.\"},\"batches()\":{\"notice\":\"Accesses the batch storage container.\"},\"deleteStateBatch((uint256,bytes32,uint256,uint256,bytes))\":{\"notice\":\"Deletes all state roots after (and including) a given batch.\"},\"getLastSequencerTimestamp()\":{\"notice\":\"Retrieves the timestamp of the last batch submitted by the sequencer.\"},\"getTotalBatches()\":{\"notice\":\"Retrieves the total number of batches submitted.\"},\"getTotalElements()\":{\"notice\":\"Retrieves the total number of elements submitted.\"},\"insideFraudProofWindow((uint256,bytes32,uint256,uint256,bytes))\":{\"notice\":\"Checks whether a given batch is still inside its fraud proof window.\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"},\"verifyStateCommitment(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))\":{\"notice\":\"Verifies a batch inclusion proof.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/OVM/chain/OVM_StateCommitmentChain.sol\":\"OVM_StateCommitmentChain\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor () internal {\\n address msgSender = _msgSender();\\n _owner = msgSender;\\n emit OwnershipTransferred(address(0), msgSender);\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n emit OwnershipTransferred(_owner, address(0));\\n _owner = address(0);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n emit OwnershipTransferred(_owner, newOwner);\\n _owner = newOwner;\\n }\\n}\\n\",\"keccak256\":\"0x15e2d5bd4c28a88548074c54d220e8086f638a71ed07e6b3ba5a70066fcf458d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/math/SafeMath.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\n * checks.\\n *\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\n * in bugs, because programmers usually assume that an overflow raises an\\n * error, which is the standard behavior in high level programming languages.\\n * `SafeMath` restores this intuition by reverting the transaction when an\\n * operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n */\\nlibrary SafeMath {\\n /**\\n * @dev Returns the addition of two unsigned integers, with an overflow flag.\\n *\\n * _Available since v3.4._\\n */\\n function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n uint256 c = a + b;\\n if (c < a) return (false, 0);\\n return (true, c);\\n }\\n\\n /**\\n * @dev Returns the substraction of two unsigned integers, with an overflow flag.\\n *\\n * _Available since v3.4._\\n */\\n function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n if (b > a) return (false, 0);\\n return (true, a - b);\\n }\\n\\n /**\\n * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\\n *\\n * _Available since v3.4._\\n */\\n function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\n // benefit is lost if 'b' is also tested.\\n // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\n if (a == 0) return (true, 0);\\n uint256 c = a * b;\\n if (c / a != b) return (false, 0);\\n return (true, c);\\n }\\n\\n /**\\n * @dev Returns the division of two unsigned integers, with a division by zero flag.\\n *\\n * _Available since v3.4._\\n */\\n function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n if (b == 0) return (false, 0);\\n return (true, a / b);\\n }\\n\\n /**\\n * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\\n *\\n * _Available since v3.4._\\n */\\n function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n if (b == 0) return (false, 0);\\n return (true, a % b);\\n }\\n\\n /**\\n * @dev Returns the addition of two unsigned integers, reverting on\\n * overflow.\\n *\\n * Counterpart to Solidity's `+` operator.\\n *\\n * Requirements:\\n *\\n * - Addition cannot overflow.\\n */\\n function add(uint256 a, uint256 b) internal pure returns (uint256) {\\n uint256 c = a + b;\\n require(c >= a, \\\"SafeMath: addition overflow\\\");\\n return c;\\n }\\n\\n /**\\n * @dev Returns the subtraction of two unsigned integers, reverting on\\n * overflow (when the result is negative).\\n *\\n * Counterpart to Solidity's `-` operator.\\n *\\n * Requirements:\\n *\\n * - Subtraction cannot overflow.\\n */\\n function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\n require(b <= a, \\\"SafeMath: subtraction overflow\\\");\\n return a - b;\\n }\\n\\n /**\\n * @dev Returns the multiplication of two unsigned integers, reverting on\\n * overflow.\\n *\\n * Counterpart to Solidity's `*` operator.\\n *\\n * Requirements:\\n *\\n * - Multiplication cannot overflow.\\n */\\n function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\n if (a == 0) return 0;\\n uint256 c = a * b;\\n require(c / a == b, \\\"SafeMath: multiplication overflow\\\");\\n return c;\\n }\\n\\n /**\\n * @dev Returns the integer division of two unsigned integers, reverting on\\n * division by zero. The result is rounded towards zero.\\n *\\n * Counterpart to Solidity's `/` operator. Note: this function uses a\\n * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n * uses an invalid opcode to revert (consuming all remaining gas).\\n *\\n * Requirements:\\n *\\n * - The divisor cannot be zero.\\n */\\n function div(uint256 a, uint256 b) internal pure returns (uint256) {\\n require(b > 0, \\\"SafeMath: division by zero\\\");\\n return a / b;\\n }\\n\\n /**\\n * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n * reverting when dividing by zero.\\n *\\n * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n * opcode (which leaves remaining gas untouched) while Solidity uses an\\n * invalid opcode to revert (consuming all remaining gas).\\n *\\n * Requirements:\\n *\\n * - The divisor cannot be zero.\\n */\\n function mod(uint256 a, uint256 b) internal pure returns (uint256) {\\n require(b > 0, \\\"SafeMath: modulo by zero\\\");\\n return a % b;\\n }\\n\\n /**\\n * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\n * overflow (when the result is negative).\\n *\\n * CAUTION: This function is deprecated because it requires allocating memory for the error\\n * message unnecessarily. For custom revert reasons use {trySub}.\\n *\\n * Counterpart to Solidity's `-` operator.\\n *\\n * Requirements:\\n *\\n * - Subtraction cannot overflow.\\n */\\n function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n require(b <= a, errorMessage);\\n return a - b;\\n }\\n\\n /**\\n * @dev Returns the integer division of two unsigned integers, reverting with custom message on\\n * division by zero. The result is rounded towards zero.\\n *\\n * CAUTION: This function is deprecated because it requires allocating memory for the error\\n * message unnecessarily. For custom revert reasons use {tryDiv}.\\n *\\n * Counterpart to Solidity's `/` operator. Note: this function uses a\\n * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n * uses an invalid opcode to revert (consuming all remaining gas).\\n *\\n * Requirements:\\n *\\n * - The divisor cannot be zero.\\n */\\n function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n require(b > 0, errorMessage);\\n return a / b;\\n }\\n\\n /**\\n * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n * reverting with custom message when dividing by zero.\\n *\\n * CAUTION: This function is deprecated because it requires allocating memory for the error\\n * message unnecessarily. For custom revert reasons use {tryMod}.\\n *\\n * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n * opcode (which leaves remaining gas untouched) while Solidity uses an\\n * invalid opcode to revert (consuming all remaining gas).\\n *\\n * Requirements:\\n *\\n * - The divisor cannot be zero.\\n */\\n function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n require(b > 0, errorMessage);\\n return a % b;\\n }\\n}\\n\",\"keccak256\":\"0xcc78a17dd88fa5a2edc60c8489e2f405c0913b377216a5b26b35656b2d0dab52\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with GSN meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address payable) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes memory) {\\n this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x8d3cb350f04ff49cfb10aef08d87f19dcbaecc8027b0bed12f3275cd12f38cf0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/chain/OVM_StateCommitmentChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\nimport { Lib_MerkleTree } from \\\"../../libraries/utils/Lib_MerkleTree.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_FraudVerifier } from \\\"../../iOVM/verification/iOVM_FraudVerifier.sol\\\";\\nimport { iOVM_StateCommitmentChain } from \\\"../../iOVM/chain/iOVM_StateCommitmentChain.sol\\\";\\nimport { iOVM_CanonicalTransactionChain } from \\\"../../iOVM/chain/iOVM_CanonicalTransactionChain.sol\\\";\\nimport { iOVM_BondManager } from \\\"../../iOVM/verification/iOVM_BondManager.sol\\\";\\nimport { iOVM_ChainStorageContainer } from \\\"../../iOVM/chain/iOVM_ChainStorageContainer.sol\\\";\\n\\n/* External Imports */\\nimport '@openzeppelin/contracts/math/SafeMath.sol';\\n\\n/**\\n * @title OVM_StateCommitmentChain\\n * @dev The State Commitment Chain (SCC) contract contains a list of proposed state roots which\\n * Proposers assert to be a result of each transaction in the Canonical Transaction Chain (CTC).\\n * Elements here have a 1:1 correspondence with transactions in the CTC, and should be the unique\\n * state root calculated off-chain by applying the canonical transactions one by one.\\n *\\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract OVM_StateCommitmentChain is iOVM_StateCommitmentChain, Lib_AddressResolver {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 public FRAUD_PROOF_WINDOW;\\n uint256 public SEQUENCER_PUBLISH_WINDOW;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n */\\n constructor(\\n address _libAddressManager,\\n uint256 _fraudProofWindow,\\n uint256 _sequencerPublishWindow\\n )\\n Lib_AddressResolver(_libAddressManager)\\n {\\n FRAUD_PROOF_WINDOW = _fraudProofWindow;\\n SEQUENCER_PUBLISH_WINDOW = _sequencerPublishWindow;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Accesses the batch storage container.\\n * @return Reference to the batch storage container.\\n */\\n function batches()\\n public\\n view\\n returns (\\n iOVM_ChainStorageContainer\\n )\\n {\\n return iOVM_ChainStorageContainer(\\n resolve(\\\"OVM_ChainStorageContainer:SCC:batches\\\")\\n );\\n }\\n\\n /**\\n * @inheritdoc iOVM_StateCommitmentChain\\n */\\n function getTotalElements()\\n override\\n public\\n view\\n returns (\\n uint256 _totalElements\\n )\\n {\\n (uint40 totalElements, ) = _getBatchExtraData();\\n return uint256(totalElements);\\n }\\n\\n /**\\n * @inheritdoc iOVM_StateCommitmentChain\\n */\\n function getTotalBatches()\\n override\\n public\\n view\\n returns (\\n uint256 _totalBatches\\n )\\n {\\n return batches().length();\\n }\\n\\n /**\\n * @inheritdoc iOVM_StateCommitmentChain\\n */\\n function getLastSequencerTimestamp()\\n override\\n public\\n view\\n returns (\\n uint256 _lastSequencerTimestamp\\n )\\n {\\n (, uint40 lastSequencerTimestamp) = _getBatchExtraData();\\n return uint256(lastSequencerTimestamp);\\n }\\n\\n /**\\n * @inheritdoc iOVM_StateCommitmentChain\\n */\\n function appendStateBatch(\\n bytes32[] memory _batch,\\n uint256 _shouldStartAtElement\\n )\\n override\\n public\\n {\\n // Fail fast in to make sure our batch roots aren't accidentally made fraudulent by the\\n // publication of batches by some other user.\\n require(\\n _shouldStartAtElement == getTotalElements(),\\n \\\"Actual batch start index does not match expected start index.\\\"\\n );\\n\\n // Proposers must have previously staked at the BondManager\\n require(\\n iOVM_BondManager(resolve(\\\"OVM_BondManager\\\")).isCollateralized(msg.sender),\\n \\\"Proposer does not have enough collateral posted\\\"\\n );\\n\\n require(\\n _batch.length > 0,\\n \\\"Cannot submit an empty state batch.\\\"\\n );\\n\\n require(\\n getTotalElements() + _batch.length <= iOVM_CanonicalTransactionChain(resolve(\\\"OVM_CanonicalTransactionChain\\\")).getTotalElements(),\\n \\\"Number of state roots cannot exceed the number of canonical transactions.\\\"\\n );\\n\\n // Pass the block's timestamp and the publisher of the data\\n // to be used in the fraud proofs\\n _appendBatch(\\n _batch,\\n abi.encode(block.timestamp, msg.sender)\\n );\\n }\\n\\n /**\\n * @inheritdoc iOVM_StateCommitmentChain\\n */\\n function deleteStateBatch(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n override\\n public\\n {\\n require(\\n msg.sender == resolve(\\\"OVM_FraudVerifier\\\"),\\n \\\"State batches can only be deleted by the OVM_FraudVerifier.\\\"\\n );\\n\\n require(\\n _isValidBatchHeader(_batchHeader),\\n \\\"Invalid batch header.\\\"\\n );\\n\\n require(\\n insideFraudProofWindow(_batchHeader),\\n \\\"State batches can only be deleted within the fraud proof window.\\\"\\n );\\n\\n _deleteBatch(_batchHeader);\\n }\\n\\n /**\\n * @inheritdoc iOVM_StateCommitmentChain\\n */\\n function verifyStateCommitment(\\n bytes32 _element,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _proof\\n )\\n override\\n public\\n view\\n returns (\\n bool\\n )\\n {\\n require(\\n _isValidBatchHeader(_batchHeader),\\n \\\"Invalid batch header.\\\"\\n );\\n\\n require(\\n Lib_MerkleTree.verify(\\n _batchHeader.batchRoot,\\n _element,\\n _proof.index,\\n _proof.siblings,\\n _batchHeader.batchSize\\n ),\\n \\\"Invalid inclusion proof.\\\"\\n );\\n\\n return true;\\n }\\n\\n /**\\n * @inheritdoc iOVM_StateCommitmentChain\\n */\\n function insideFraudProofWindow(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n override\\n public\\n view\\n returns (\\n bool _inside\\n )\\n {\\n (uint256 timestamp,) = abi.decode(\\n _batchHeader.extraData,\\n (uint256, address)\\n );\\n\\n require(\\n timestamp != 0,\\n \\\"Batch header timestamp cannot be zero\\\"\\n );\\n return SafeMath.add(timestamp, FRAUD_PROOF_WINDOW) > block.timestamp;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Parses the batch context from the extra data.\\n * @return Total number of elements submitted.\\n * @return Timestamp of the last batch submitted by the sequencer.\\n */\\n function _getBatchExtraData()\\n internal\\n view\\n returns (\\n uint40,\\n uint40\\n )\\n {\\n bytes27 extraData = batches().getGlobalMetadata();\\n\\n uint40 totalElements;\\n uint40 lastSequencerTimestamp;\\n assembly {\\n extraData := shr(40, extraData)\\n totalElements := and(extraData, 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF)\\n lastSequencerTimestamp := shr(40, and(extraData, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000))\\n }\\n\\n return (\\n totalElements,\\n lastSequencerTimestamp\\n );\\n }\\n\\n /**\\n * Encodes the batch context for the extra data.\\n * @param _totalElements Total number of elements submitted.\\n * @param _lastSequencerTimestamp Timestamp of the last batch submitted by the sequencer.\\n * @return Encoded batch context.\\n */\\n function _makeBatchExtraData(\\n uint40 _totalElements,\\n uint40 _lastSequencerTimestamp\\n )\\n internal\\n pure\\n returns (\\n bytes27\\n )\\n {\\n bytes27 extraData;\\n assembly {\\n extraData := _totalElements\\n extraData := or(extraData, shl(40, _lastSequencerTimestamp))\\n extraData := shl(40, extraData)\\n }\\n\\n return extraData;\\n }\\n\\n /**\\n * Appends a batch to the chain.\\n * @param _batch Elements within the batch.\\n * @param _extraData Any extra data to append to the batch.\\n */\\n function _appendBatch(\\n bytes32[] memory _batch,\\n bytes memory _extraData\\n )\\n internal\\n {\\n address sequencer = resolve(\\\"OVM_Proposer\\\");\\n (uint40 totalElements, uint40 lastSequencerTimestamp) = _getBatchExtraData();\\n\\n if (msg.sender == sequencer) {\\n lastSequencerTimestamp = uint40(block.timestamp);\\n } else {\\n // We keep track of the last batch submitted by the sequencer so there's a window in\\n // which only the sequencer can publish state roots. A window like this just reduces\\n // the chance of \\\"system breaking\\\" state roots being published while we're still in\\n // testing mode. This window should be removed or significantly reduced in the future.\\n require(\\n lastSequencerTimestamp + SEQUENCER_PUBLISH_WINDOW < block.timestamp,\\n \\\"Cannot publish state roots within the sequencer publication window.\\\"\\n );\\n }\\n\\n // For efficiency reasons getMerkleRoot modifies the `_batch` argument in place\\n // while calculating the root hash therefore any arguments passed to it must not\\n // be used again afterwards\\n Lib_OVMCodec.ChainBatchHeader memory batchHeader = Lib_OVMCodec.ChainBatchHeader({\\n batchIndex: getTotalBatches(),\\n batchRoot: Lib_MerkleTree.getMerkleRoot(_batch),\\n batchSize: _batch.length,\\n prevTotalElements: totalElements,\\n extraData: _extraData\\n });\\n\\n emit StateBatchAppended(\\n batchHeader.batchIndex,\\n batchHeader.batchRoot,\\n batchHeader.batchSize,\\n batchHeader.prevTotalElements,\\n batchHeader.extraData\\n );\\n\\n batches().push(\\n Lib_OVMCodec.hashBatchHeader(batchHeader),\\n _makeBatchExtraData(\\n uint40(batchHeader.prevTotalElements + batchHeader.batchSize),\\n lastSequencerTimestamp\\n )\\n );\\n }\\n\\n /**\\n * Removes a batch and all subsequent batches from the chain.\\n * @param _batchHeader Header of the batch to remove.\\n */\\n function _deleteBatch(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n internal\\n {\\n require(\\n _batchHeader.batchIndex < batches().length(),\\n \\\"Invalid batch index.\\\"\\n );\\n\\n require(\\n _isValidBatchHeader(_batchHeader),\\n \\\"Invalid batch header.\\\"\\n );\\n\\n batches().deleteElementsAfterInclusive(\\n _batchHeader.batchIndex,\\n _makeBatchExtraData(\\n uint40(_batchHeader.prevTotalElements),\\n 0\\n )\\n );\\n\\n emit StateBatchDeleted(\\n _batchHeader.batchIndex,\\n _batchHeader.batchRoot\\n );\\n }\\n\\n /**\\n * Checks that a batch header matches the stored hash for the given index.\\n * @param _batchHeader Batch header to validate.\\n * @return Whether or not the header matches the stored one.\\n */\\n function _isValidBatchHeader(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n internal\\n view\\n returns (\\n bool\\n )\\n {\\n return Lib_OVMCodec.hashBatchHeader(_batchHeader) == batches().get(_batchHeader.batchIndex);\\n }\\n}\\n\",\"keccak256\":\"0x5b72c845f856a06c978880d3cb2db40dafebaebf399df100c6ac832eaf41d7bd\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_CanonicalTransactionChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_ChainStorageContainer } from \\\"./iOVM_ChainStorageContainer.sol\\\";\\n\\n/**\\n * @title iOVM_CanonicalTransactionChain\\n */\\ninterface iOVM_CanonicalTransactionChain {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event TransactionEnqueued(\\n address _l1TxOrigin,\\n address _target,\\n uint256 _gasLimit,\\n bytes _data,\\n uint256 _queueIndex,\\n uint256 _timestamp\\n );\\n\\n event QueueBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event SequencerBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event TransactionBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct BatchContext {\\n uint256 numSequencedTransactions;\\n uint256 numSubsequentQueueTransactions;\\n uint256 timestamp;\\n uint256 blockNumber;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n\\n /**\\n * Accesses the batch storage container.\\n * @return Reference to the batch storage container.\\n */\\n function batches()\\n external\\n view\\n returns (\\n iOVM_ChainStorageContainer\\n );\\n\\n /**\\n * Accesses the queue storage container.\\n * @return Reference to the queue storage container.\\n */\\n function queue()\\n external\\n view\\n returns (\\n iOVM_ChainStorageContainer\\n );\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements()\\n external\\n view\\n returns (\\n uint256 _totalElements\\n );\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches()\\n external\\n view\\n returns (\\n uint256 _totalBatches\\n );\\n\\n /**\\n * Returns the index of the next element to be enqueued.\\n * @return Index for the next queue element.\\n */\\n function getNextQueueIndex()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Gets the queue element at a particular index.\\n * @param _index Index of the queue element to access.\\n * @return _element Queue element at the given index.\\n */\\n function getQueueElement(\\n uint256 _index\\n )\\n external\\n view\\n returns (\\n Lib_OVMCodec.QueueElement memory _element\\n );\\n\\n /**\\n * Returns the timestamp of the last transaction.\\n * @return Timestamp for the last transaction.\\n */\\n function getLastTimestamp()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Returns the blocknumber of the last transaction.\\n * @return Blocknumber for the last transaction.\\n */\\n function getLastBlockNumber()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Get the number of queue elements which have not yet been included.\\n * @return Number of pending queue elements.\\n */\\n function getNumPendingQueueElements()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Retrieves the length of the queue, including\\n * both pending and canonical transactions.\\n * @return Length of the queue.\\n */\\n function getQueueLength()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n\\n /**\\n * Adds a transaction to the queue.\\n * @param _target Target contract to send the transaction to.\\n * @param _gasLimit Gas limit for the given transaction.\\n * @param _data Transaction data.\\n */\\n function enqueue(\\n address _target,\\n uint256 _gasLimit,\\n bytes memory _data\\n )\\n external;\\n\\n /**\\n * Appends a given number of queued transactions as a single batch.\\n * @param _numQueuedTransactions Number of transactions to append.\\n */\\n function appendQueueBatch(\\n uint256 _numQueuedTransactions\\n )\\n external;\\n\\n /**\\n * Allows the sequencer to append a batch of transactions.\\n * @dev This function uses a custom encoding scheme for efficiency reasons.\\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\\n * .param _contexts Array of batch contexts.\\n * .param _transactionDataFields Array of raw transaction data.\\n */\\n function appendSequencerBatch(\\n // uint40 _shouldStartAtElement,\\n // uint24 _totalElementsToAppend,\\n // BatchContext[] _contexts,\\n // bytes[] _transactionDataFields\\n )\\n external;\\n\\n /**\\n * Verifies whether a transaction is included in the chain.\\n * @param _transaction Transaction to verify.\\n * @param _txChainElement Transaction chain element corresponding to the transaction.\\n * @param _batchHeader Header of the batch the transaction was included in.\\n * @param _inclusionProof Inclusion proof for the provided transaction chain element.\\n * @return True if the transaction exists in the CTC, false if not.\\n */\\n function verifyTransaction(\\n Lib_OVMCodec.Transaction memory _transaction,\\n Lib_OVMCodec.TransactionChainElement memory _txChainElement,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _inclusionProof\\n )\\n external\\n view\\n returns (\\n bool\\n );\\n}\\n\",\"keccak256\":\"0xb5e55488a1982841c07cdf5ff475da4789596f111dd48f01b1918ee4c775cf3a\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_ChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title iOVM_ChainStorageContainer\\n */\\ninterface iOVM_ChainStorageContainer {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata()\\n external\\n view\\n returns (\\n bytes27\\n );\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length()\\n external\\n view\\n returns (\\n uint256\\n );\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(\\n bytes32 _object\\n )\\n external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(\\n bytes32 _object,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(\\n uint256 _index\\n )\\n external\\n view\\n returns (\\n bytes32\\n );\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index\\n )\\n external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Marks an index as overwritable, meaing the underlying buffer can start to write values over\\n * any objects before and including the given index.\\n */\\n function setNextOverwritableIndex(\\n uint256 _index\\n )\\n external;\\n}\\n\",\"keccak256\":\"0x2d7973a0ad84c23ec62624d3f1e3aeb198cc72686ff1e6cfa17155556b320c94\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_StateCommitmentChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title iOVM_StateCommitmentChain\\n */\\ninterface iOVM_StateCommitmentChain {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event StateBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n event StateBatchDeleted(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot\\n );\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements()\\n external\\n view\\n returns (\\n uint256 _totalElements\\n );\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches()\\n external\\n view\\n returns (\\n uint256 _totalBatches\\n );\\n\\n /**\\n * Retrieves the timestamp of the last batch submitted by the sequencer.\\n * @return _lastSequencerTimestamp Last sequencer batch timestamp.\\n */\\n function getLastSequencerTimestamp()\\n external\\n view\\n returns (\\n uint256 _lastSequencerTimestamp\\n );\\n\\n /**\\n * Appends a batch of state roots to the chain.\\n * @param _batch Batch of state roots.\\n * @param _shouldStartAtElement Index of the element at which this batch should start.\\n */\\n function appendStateBatch(\\n bytes32[] calldata _batch,\\n uint256 _shouldStartAtElement\\n )\\n external;\\n\\n /**\\n * Deletes all state roots after (and including) a given batch.\\n * @param _batchHeader Header of the batch to start deleting from.\\n */\\n function deleteStateBatch(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n external;\\n\\n /**\\n * Verifies a batch inclusion proof.\\n * @param _element Hash of the element to verify a proof for.\\n * @param _batchHeader Header of the batch in which the element was included.\\n * @param _proof Merkle inclusion proof for the element.\\n */\\n function verifyStateCommitment(\\n bytes32 _element,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _proof\\n )\\n external\\n view\\n returns (\\n bool _verified\\n );\\n\\n /**\\n * Checks whether a given batch is still inside its fraud proof window.\\n * @param _batchHeader Header of the batch to check.\\n * @return _inside Whether or not the batch is inside the fraud proof window.\\n */\\n function insideFraudProofWindow(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n external\\n view\\n returns (\\n bool _inside\\n );\\n}\\n\",\"keccak256\":\"0x6646d6ff392b81aab52a7a277e91540819464751de0af5afd1962094b2e92448\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/verification/iOVM_BondManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\ninterface ERC20 {\\n function transfer(address, uint256) external returns (bool);\\n function transferFrom(address, address, uint256) external returns (bool);\\n}\\n\\n/// All the errors which may be encountered on the bond manager\\nlibrary Errors {\\n string constant ERC20_ERR = \\\"BondManager: Could not post bond\\\";\\n string constant ALREADY_FINALIZED = \\\"BondManager: Fraud proof for this pre-state root has already been finalized\\\";\\n string constant SLASHED = \\\"BondManager: Cannot finalize withdrawal, you probably got slashed\\\";\\n string constant WRONG_STATE = \\\"BondManager: Wrong bond state for proposer\\\";\\n string constant CANNOT_CLAIM = \\\"BondManager: Cannot claim yet. Dispute must be finalized first\\\";\\n\\n string constant WITHDRAWAL_PENDING = \\\"BondManager: Withdrawal already pending\\\";\\n string constant TOO_EARLY = \\\"BondManager: Too early to finalize your withdrawal\\\";\\n\\n string constant ONLY_TRANSITIONER = \\\"BondManager: Only the transitioner for this pre-state root may call this function\\\";\\n string constant ONLY_FRAUD_VERIFIER = \\\"BondManager: Only the fraud verifier may call this function\\\";\\n string constant ONLY_STATE_COMMITMENT_CHAIN = \\\"BondManager: Only the state commitment chain may call this function\\\";\\n string constant WAIT_FOR_DISPUTES = \\\"BondManager: Wait for other potential disputes\\\";\\n}\\n\\n/**\\n * @title iOVM_BondManager\\n */\\ninterface iOVM_BondManager {\\n\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n /// The lifecycle of a proposer's bond\\n enum State {\\n // Before depositing or after getting slashed, a user is uncollateralized\\n NOT_COLLATERALIZED,\\n // After depositing, a user is collateralized\\n COLLATERALIZED,\\n // After a user has initiated a withdrawal\\n WITHDRAWING\\n }\\n\\n /// A bond posted by a proposer\\n struct Bond {\\n // The user's state\\n State state;\\n // The timestamp at which a proposer issued their withdrawal request\\n uint32 withdrawalTimestamp;\\n // The time when the first disputed was initiated for this bond\\n uint256 firstDisputeAt;\\n // The earliest observed state root for this bond which has had fraud\\n bytes32 earliestDisputedStateRoot;\\n // The state root's timestamp\\n uint256 earliestTimestamp;\\n }\\n\\n // Per pre-state root, store the number of state provisions that were made\\n // and how many of these calls were made by each user. Payouts will then be\\n // claimed by users proportionally for that dispute.\\n struct Rewards {\\n // Flag to check if rewards for a fraud proof are claimable\\n bool canClaim;\\n // Total number of `recordGasSpent` calls made\\n uint256 total;\\n // The gas spent by each user to provide witness data. The sum of all\\n // values inside this map MUST be equal to the value of `total`\\n mapping(address => uint256) gasSpent;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function recordGasSpent(\\n bytes32 _preStateRoot,\\n bytes32 _txHash,\\n address _who,\\n uint256 _gasSpent\\n ) external;\\n\\n function finalize(\\n bytes32 _preStateRoot,\\n address _publisher,\\n uint256 _timestamp\\n ) external;\\n\\n function deposit() external;\\n\\n function startWithdrawal() external;\\n\\n function finalizeWithdrawal() external;\\n\\n function claim(\\n address _who\\n ) external;\\n\\n function isCollateralized(\\n address _who\\n ) external view returns (bool);\\n\\n function getGasSpent(\\n bytes32 _preStateRoot,\\n address _who\\n ) external view returns (uint256);\\n}\\n\",\"keccak256\":\"0x3c2a8a399487857158649db1896749d86e39cba545a8aeb2e2bb0f3bdfa7a5b1\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/verification/iOVM_FraudVerifier.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_StateTransitioner } from \\\"./iOVM_StateTransitioner.sol\\\";\\n\\n/**\\n * @title iOVM_FraudVerifier\\n */\\ninterface iOVM_FraudVerifier {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event FraudProofInitialized(\\n bytes32 _preStateRoot,\\n uint256 _preStateRootIndex,\\n bytes32 _transactionHash,\\n address _who\\n );\\n\\n event FraudProofFinalized(\\n bytes32 _preStateRoot,\\n uint256 _preStateRootIndex,\\n bytes32 _transactionHash,\\n address _who\\n );\\n\\n\\n /***************************************\\n * Public Functions: Transition Status *\\n ***************************************/\\n\\n function getStateTransitioner(bytes32 _preStateRoot, bytes32 _txHash) external view returns (iOVM_StateTransitioner _transitioner);\\n\\n\\n /****************************************\\n * Public Functions: Fraud Verification *\\n ****************************************/\\n\\n function initializeFraudVerification(\\n bytes32 _preStateRoot,\\n Lib_OVMCodec.ChainBatchHeader calldata _preStateRootBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof calldata _preStateRootProof,\\n Lib_OVMCodec.Transaction calldata _transaction,\\n Lib_OVMCodec.TransactionChainElement calldata _txChainElement,\\n Lib_OVMCodec.ChainBatchHeader calldata _transactionBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof calldata _transactionProof\\n ) external;\\n\\n function finalizeFraudVerification(\\n bytes32 _preStateRoot,\\n Lib_OVMCodec.ChainBatchHeader calldata _preStateRootBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof calldata _preStateRootProof,\\n bytes32 _txHash,\\n bytes32 _postStateRoot,\\n Lib_OVMCodec.ChainBatchHeader calldata _postStateRootBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof calldata _postStateRootProof\\n ) external;\\n}\\n\",\"keccak256\":\"0x5efd7bb18164bbd3e9d58379e8203fbf2a7ee802b1a48dff3ceaaec1523b1751\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/verification/iOVM_StateTransitioner.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title iOVM_StateTransitioner\\n */\\ninterface iOVM_StateTransitioner {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AccountCommitted(\\n address _address\\n );\\n\\n event ContractStorageCommitted(\\n address _address,\\n bytes32 _key\\n );\\n\\n\\n /**********************************\\n * Public Functions: State Access *\\n **********************************/\\n\\n function getPreStateRoot() external view returns (bytes32 _preStateRoot);\\n function getPostStateRoot() external view returns (bytes32 _postStateRoot);\\n function isComplete() external view returns (bool _complete);\\n\\n\\n /***********************************\\n * Public Functions: Pre-Execution *\\n ***********************************/\\n\\n function proveContractState(\\n address _ovmContractAddress,\\n address _ethContractAddress,\\n bytes calldata _stateTrieWitness\\n ) external;\\n\\n function proveStorageSlot(\\n address _ovmContractAddress,\\n bytes32 _key,\\n bytes calldata _storageTrieWitness\\n ) external;\\n\\n\\n /*******************************\\n * Public Functions: Execution *\\n *******************************/\\n\\n function applyTransaction(\\n Lib_OVMCodec.Transaction calldata _transaction\\n ) external;\\n\\n\\n /************************************\\n * Public Functions: Post-Execution *\\n ************************************/\\n\\n function commitContractState(\\n address _ovmContractAddress,\\n bytes calldata _stateTrieWitness\\n ) external;\\n\\n function commitStorageSlot(\\n address _ovmContractAddress,\\n bytes32 _key,\\n bytes calldata _storageTrieWitness\\n ) external;\\n\\n\\n /**********************************\\n * Public Functions: Finalization *\\n **********************************/\\n\\n function completeTransition() external;\\n}\\n\",\"keccak256\":\"0x3d044ac0a3bb6ad3d529f904b3191117511f9c379678ca03010e1ebdfcb5c34b\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/codec/Lib_OVMCodec.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../utils/Lib_Bytes32Utils.sol\\\";\\n\\n/**\\n * @title Lib_OVMCodec\\n */\\nlibrary Lib_OVMCodec {\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum QueueOrigin {\\n SEQUENCER_QUEUE,\\n L1TOL2_QUEUE\\n }\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Account {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n address ethAddress;\\n bool isFresh;\\n }\\n\\n struct EVMAccount {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n }\\n\\n struct ChainBatchHeader {\\n uint256 batchIndex;\\n bytes32 batchRoot;\\n uint256 batchSize;\\n uint256 prevTotalElements;\\n bytes extraData;\\n }\\n\\n struct ChainInclusionProof {\\n uint256 index;\\n bytes32[] siblings;\\n }\\n\\n struct Transaction {\\n uint256 timestamp;\\n uint256 blockNumber;\\n QueueOrigin l1QueueOrigin;\\n address l1TxOrigin;\\n address entrypoint;\\n uint256 gasLimit;\\n bytes data;\\n }\\n\\n struct TransactionChainElement {\\n bool isSequenced;\\n uint256 queueIndex; // QUEUED TX ONLY\\n uint256 timestamp; // SEQUENCER TX ONLY\\n uint256 blockNumber; // SEQUENCER TX ONLY\\n bytes txData; // SEQUENCER TX ONLY\\n }\\n\\n struct QueueElement {\\n bytes32 transactionHash;\\n uint40 timestamp;\\n uint40 blockNumber;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Encodes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Encoded transaction bytes.\\n */\\n function encodeTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return abi.encodePacked(\\n _transaction.timestamp,\\n _transaction.blockNumber,\\n _transaction.l1QueueOrigin,\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n );\\n }\\n\\n /**\\n * Hashes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Hashed transaction\\n */\\n function hashTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(encodeTransaction(_transaction));\\n }\\n\\n /**\\n * Converts an OVM account to an EVM account.\\n * @param _in OVM account to convert.\\n * @return Converted EVM account.\\n */\\n function toEVMAccount(\\n Account memory _in\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n return EVMAccount({\\n nonce: _in.nonce,\\n balance: _in.balance,\\n storageRoot: _in.storageRoot,\\n codeHash: _in.codeHash\\n });\\n }\\n\\n /**\\n * @notice RLP-encodes an account state struct.\\n * @param _account Account state struct.\\n * @return RLP-encoded account state.\\n */\\n function encodeEVMAccount(\\n EVMAccount memory _account\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes[] memory raw = new bytes[](4);\\n\\n // Unfortunately we can't create this array outright because\\n // Lib_RLPWriter.writeList will reject fixed-size arrays. Assigning\\n // index-by-index circumvents this issue.\\n raw[0] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.nonce)\\n )\\n );\\n raw[1] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.balance)\\n )\\n );\\n raw[2] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.storageRoot));\\n raw[3] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.codeHash));\\n\\n return Lib_RLPWriter.writeList(raw);\\n }\\n\\n /**\\n * @notice Decodes an RLP-encoded account state into a useful struct.\\n * @param _encoded RLP-encoded account state.\\n * @return Account state struct.\\n */\\n function decodeEVMAccount(\\n bytes memory _encoded\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\\n\\n return EVMAccount({\\n nonce: Lib_RLPReader.readUint256(accountState[0]),\\n balance: Lib_RLPReader.readUint256(accountState[1]),\\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\\n });\\n }\\n\\n /**\\n * Calculates a hash for a given batch header.\\n * @param _batchHeader Header to hash.\\n * @return Hash of the header.\\n */\\n function hashBatchHeader(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(\\n abi.encode(\\n _batchHeader.batchRoot,\\n _batchHeader.batchSize,\\n _batchHeader.prevTotalElements,\\n _batchHeader.extraData\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0xd85ba2066057a2677926f484b938c7c2ef33ff3853f3b71cda252f4a54f30e05\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n public\\n onlyOwner\\n {\\n addresses[_getNameHash(_name)] = _address;\\n\\n emit AddressSet(\\n _name,\\n _address\\n );\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0x2ce671a0e004df88b136bea5a3c59d0732cea8887c8496da1d509e0200b03d7d\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(\\n address _libAddressManager\\n ) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x65981feeabff6a81783ea97d44baf988a18a86c8cb374c46fdb71819cbacc7c0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPReader.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_RLPReader\\n * @dev Adapted from \\\"RLPReader\\\" by Hamdi Allam (hamdi.allam97@gmail.com).\\n */\\nlibrary Lib_RLPReader {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 constant internal MAX_LIST_LENGTH = 32;\\n\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum RLPItemType {\\n DATA_ITEM,\\n LIST_ITEM\\n }\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct RLPItem {\\n uint256 length;\\n uint256 ptr;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts bytes to a reference to memory position and length.\\n * @param _in Input bytes to convert.\\n * @return Output memory reference.\\n */\\n function toRLPItem(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem memory\\n )\\n {\\n uint256 ptr;\\n assembly {\\n ptr := add(_in, 32)\\n }\\n\\n return RLPItem({\\n length: _in.length,\\n ptr: ptr\\n });\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n (\\n uint256 listOffset,\\n ,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.LIST_ITEM,\\n \\\"Invalid RLP list value.\\\"\\n );\\n\\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\\n // writing to the length. Since we can't know the number of RLP items without looping over\\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\\n // simply set a reasonable maximum list length and decrease the size before we finish.\\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\\n\\n uint256 itemCount = 0;\\n uint256 offset = listOffset;\\n while (offset < _in.length) {\\n require(\\n itemCount < MAX_LIST_LENGTH,\\n \\\"Provided RLP list exceeds max list length.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n ) = _decodeLength(RLPItem({\\n length: _in.length - offset,\\n ptr: _in.ptr + offset\\n }));\\n\\n out[itemCount] = RLPItem({\\n length: itemLength + itemOffset,\\n ptr: _in.ptr + offset\\n });\\n\\n itemCount += 1;\\n offset += itemOffset + itemLength;\\n }\\n\\n // Decrease the array size to match the actual item count.\\n assembly {\\n mstore(out, itemCount)\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n return readList(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes value.\\\"\\n );\\n\\n return _copy(_in.ptr, itemOffset, itemLength);\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return readBytes(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return string(readBytes(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return readString(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n require(\\n _in.length <= 33,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr + itemOffset;\\n bytes32 out;\\n assembly {\\n out := mload(ptr)\\n\\n // Shift the bytes over to match the item size.\\n if lt(itemLength, 32) {\\n out := div(out, exp(256, sub(32, itemLength)))\\n }\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return readBytes32(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return uint256(readBytes32(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return readUint256(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n require(\\n _in.length == 1,\\n \\\"Invalid RLP boolean value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 out;\\n assembly {\\n out := byte(0, mload(ptr))\\n }\\n\\n require(\\n out == 0 || out == 1,\\n \\\"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\\\"\\n );\\n\\n return out != 0;\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return readBool(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n if (_in.length == 1) {\\n return address(0);\\n }\\n\\n require(\\n _in.length == 21,\\n \\\"Invalid RLP address value.\\\"\\n );\\n\\n return address(readUint256(_in));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return readAddress(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads the raw bytes of an RLP item.\\n * @param _in RLP item to read.\\n * @return Raw RLP bytes.\\n */\\n function readRawBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in);\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Decodes the length of an RLP item.\\n * @param _in RLP item to decode.\\n * @return Offset of the encoded data.\\n * @return Length of the encoded data.\\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\\n */\\n function _decodeLength(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n uint256,\\n uint256,\\n RLPItemType\\n )\\n {\\n require(\\n _in.length > 0,\\n \\\"RLP item cannot be null.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 prefix;\\n assembly {\\n prefix := byte(0, mload(ptr))\\n }\\n\\n if (prefix <= 0x7f) {\\n // Single byte.\\n\\n return (0, 1, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xb7) {\\n // Short string.\\n\\n uint256 strLen = prefix - 0x80;\\n\\n require(\\n _in.length > strLen,\\n \\\"Invalid RLP short string.\\\"\\n );\\n\\n return (1, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xbf) {\\n // Long string.\\n uint256 lenOfStrLen = prefix - 0xb7;\\n\\n require(\\n _in.length > lenOfStrLen,\\n \\\"Invalid RLP long string length.\\\"\\n );\\n\\n uint256 strLen;\\n assembly {\\n // Pick out the string length.\\n strLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfStrLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfStrLen + strLen,\\n \\\"Invalid RLP long string.\\\"\\n );\\n\\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xf7) {\\n // Short list.\\n uint256 listLen = prefix - 0xc0;\\n\\n require(\\n _in.length > listLen,\\n \\\"Invalid RLP short list.\\\"\\n );\\n\\n return (1, listLen, RLPItemType.LIST_ITEM);\\n } else {\\n // Long list.\\n uint256 lenOfListLen = prefix - 0xf7;\\n\\n require(\\n _in.length > lenOfListLen,\\n \\\"Invalid RLP long list length.\\\"\\n );\\n\\n uint256 listLen;\\n assembly {\\n // Pick out the list length.\\n listLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfListLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfListLen + listLen,\\n \\\"Invalid RLP long list.\\\"\\n );\\n\\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\\n }\\n }\\n\\n /**\\n * Copies the bytes from a memory location.\\n * @param _src Pointer to the location to read from.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Copied bytes.\\n */\\n function _copy(\\n uint256 _src,\\n uint256 _offset,\\n uint256 _length\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out = new bytes(_length);\\n if (out.length == 0) {\\n return out;\\n }\\n\\n uint256 src = _src + _offset;\\n uint256 dest;\\n assembly {\\n dest := add(out, 32)\\n }\\n\\n // Copy over as many complete words as we can.\\n for (uint256 i = 0; i < _length / 32; i++) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n\\n src += 32;\\n dest += 32;\\n }\\n\\n // Pick out the remaining bytes.\\n uint256 mask = 256 ** (32 - (_length % 32)) - 1;\\n assembly {\\n mstore(\\n dest,\\n or(\\n and(mload(src), not(mask)),\\n and(mload(dest), mask)\\n )\\n )\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Copies an RLP item into bytes.\\n * @param _in RLP item to copy.\\n * @return Copied bytes.\\n */\\n function _copy(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in.ptr, 0, _in.length);\\n }\\n}\\n\",\"keccak256\":\"0x829174c61216dce35fdb888383b6022e0365eb7fbdc71ad79d98b108091969fe\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPWriter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/**\\n * @title Lib_RLPWriter\\n * @author Bakaoh (with modifications)\\n */\\nlibrary Lib_RLPWriter {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * RLP encodes a byte string.\\n * @param _in The byte string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded;\\n\\n if (_in.length == 1 && uint8(_in[0]) < 128) {\\n encoded = _in;\\n } else {\\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * RLP encodes a list of RLP encoded byte byte strings.\\n * @param _in The list of RLP encoded byte strings.\\n * @return The RLP encoded list of items in bytes.\\n */\\n function writeList(\\n bytes[] memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory list = _flatten(_in);\\n return abi.encodePacked(_writeLength(list.length, 192), list);\\n }\\n\\n /**\\n * RLP encodes a string.\\n * @param _in The string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeString(\\n string memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(bytes(_in));\\n }\\n\\n /**\\n * RLP encodes an address.\\n * @param _in The address to encode.\\n * @return The RLP encoded address in bytes.\\n */\\n function writeAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a bytes32 value.\\n * @param _in The bytes32 to encode.\\n * @return _out The RLP encoded bytes32 in bytes.\\n */\\n function writeBytes32(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a uint.\\n * @param _in The uint256 to encode.\\n * @return The RLP encoded uint256 in bytes.\\n */\\n function writeUint(\\n uint256 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(_toBinary(_in));\\n }\\n\\n /**\\n * RLP encodes a bool.\\n * @param _in The bool to encode.\\n * @return The RLP encoded bool in bytes.\\n */\\n function writeBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded = new bytes(1);\\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\\n return encoded;\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\\n * @param _len The length of the string or the payload.\\n * @param _offset 128 if item is string, 192 if item is list.\\n * @return RLP encoded bytes.\\n */\\n function _writeLength(\\n uint256 _len,\\n uint256 _offset\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded;\\n\\n if (_len < 56) {\\n encoded = new bytes(1);\\n encoded[0] = byte(uint8(_len) + uint8(_offset));\\n } else {\\n uint256 lenLen;\\n uint256 i = 1;\\n while (_len / i != 0) {\\n lenLen++;\\n i *= 256;\\n }\\n\\n encoded = new bytes(lenLen + 1);\\n encoded[0] = byte(uint8(lenLen) + uint8(_offset) + 55);\\n for(i = 1; i <= lenLen; i++) {\\n encoded[i] = byte(uint8((_len / (256**(lenLen-i))) % 256));\\n }\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * Encode integer in big endian binary form with no leading zeroes.\\n * @notice TODO: This should be optimized with assembly to save gas costs.\\n * @param _x The integer to encode.\\n * @return RLP encoded bytes.\\n */\\n function _toBinary(\\n uint256 _x\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory b = abi.encodePacked(_x);\\n\\n uint256 i = 0;\\n for (; i < 32; i++) {\\n if (b[i] != 0) {\\n break;\\n }\\n }\\n\\n bytes memory res = new bytes(32 - i);\\n for (uint256 j = 0; j < res.length; j++) {\\n res[j] = b[i++];\\n }\\n\\n return res;\\n }\\n\\n /**\\n * Copies a piece of memory to another location.\\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\\n * @param _dest Destination location.\\n * @param _src Source location.\\n * @param _len Length of memory to copy.\\n */\\n function _memcpy(\\n uint256 _dest,\\n uint256 _src,\\n uint256 _len\\n )\\n private\\n pure\\n {\\n uint256 dest = _dest;\\n uint256 src = _src;\\n uint256 len = _len;\\n\\n for(; len >= 32; len -= 32) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n dest += 32;\\n src += 32;\\n }\\n\\n uint256 mask = 256 ** (32 - len) - 1;\\n assembly {\\n let srcpart := and(mload(src), not(mask))\\n let destpart := and(mload(dest), mask)\\n mstore(dest, or(destpart, srcpart))\\n }\\n }\\n\\n /**\\n * Flattens a list of byte strings into one byte string.\\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\\n * @param _list List of byte strings to flatten.\\n * @return The flattened byte string.\\n */\\n function _flatten(\\n bytes[] memory _list\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n if (_list.length == 0) {\\n return new bytes(0);\\n }\\n\\n uint256 len;\\n uint256 i = 0;\\n for (; i < _list.length; i++) {\\n len += _list[i].length;\\n }\\n\\n bytes memory flattened = new bytes(len);\\n uint256 flattenedPtr;\\n assembly { flattenedPtr := add(flattened, 0x20) }\\n\\n for(i = 0; i < _list.length; i++) {\\n bytes memory item = _list[i];\\n\\n uint256 listPtr;\\n assembly { listPtr := add(item, 0x20)}\\n\\n _memcpy(flattenedPtr, listPtr, item.length);\\n flattenedPtr += _list[i].length;\\n }\\n\\n return flattened;\\n }\\n}\\n\",\"keccak256\":\"0xb60ee4b03ad372c3deff21d454ab714dd0c18ee3e6f9d45532e209fc59d5a54d\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_Bytes32Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_Byte32Utils\\n */\\nlibrary Lib_Bytes32Utils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \\\"true.\\\"\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as a boolean.\\n */\\n function toBool(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return _in != 0;\\n }\\n\\n /**\\n * Converts a boolean to a bytes32 value.\\n * @param _in Input boolean value.\\n * @return Boolean as a bytes32.\\n */\\n function fromBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in ? 1 : 0));\\n }\\n\\n /**\\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as an address.\\n */\\n function toAddress(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return address(uint160(uint256(_in)));\\n }\\n\\n /**\\n * Converts an address to a bytes32.\\n * @param _in Input address value.\\n * @return Address as a bytes32.\\n */\\n function fromAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in));\\n }\\n\\n /**\\n * Removes the leading zeros from a bytes32 value and returns a new (smaller) bytes value.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 without any leading zeros.\\n */\\n function removeLeadingZeros(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out;\\n\\n assembly {\\n // Figure out how many leading zero bytes to remove.\\n let shift := 0\\n for { let i := 0 } and(lt(i, 32), eq(byte(i, _in), 0)) { i := add(i, 1) } {\\n shift := add(shift, 1)\\n }\\n\\n // Reserve some space for our output and fix the free memory pointer.\\n out := mload(0x40)\\n mstore(0x40, add(out, 0x40))\\n\\n // Shift the value and store it into the output bytes.\\n mstore(add(out, 0x20), shl(mul(shift, 8), _in))\\n\\n // Store the new size (with leading zero bytes removed) in the output byte size.\\n mstore(out, sub(32, shift))\\n }\\n\\n return out;\\n }\\n}\\n\",\"keccak256\":\"0xfa2def593e3fc56a31852c3744aefdaa93cec74e721bfcfeb1e5d166c7c60b64\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_BytesUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_BytesUtils\\n */\\nlibrary Lib_BytesUtils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_start + _length >= _start, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n if (_bytes.length - _start == 0) {\\n return bytes('');\\n }\\n\\n return slice(_bytes, _start, _bytes.length - _start);\\n }\\n\\n function toBytes32PadLeft(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n bytes32 ret;\\n uint256 len = _bytes.length <= 32 ? _bytes.length : 32;\\n assembly {\\n ret := shr(mul(sub(32, len), 8), mload(add(_bytes, 32)))\\n }\\n return ret;\\n }\\n\\n function toBytes32(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n if (_bytes.length < 32) {\\n bytes32 ret;\\n assembly {\\n ret := mload(add(_bytes, 32))\\n }\\n return ret;\\n }\\n\\n return abi.decode(_bytes,(bytes32)); // will truncate if input length > 32 bytes\\n }\\n\\n function toUint256(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return uint256(toBytes32(_bytes));\\n }\\n\\n function toUint24(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n uint24\\n )\\n {\\n require(_start + 3 >= _start, \\\"toUint24_overflow\\\");\\n require(_bytes.length >= _start + 3 , \\\"toUint24_outOfBounds\\\");\\n uint24 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x3), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toUint8(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n uint8\\n )\\n {\\n require(_start + 1 >= _start, \\\"toUint8_overflow\\\");\\n require(_bytes.length >= _start + 1 , \\\"toUint8_outOfBounds\\\");\\n uint8 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x1), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toAddress(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n require(_start + 20 >= _start, \\\"toAddress_overflow\\\");\\n require(_bytes.length >= _start + 20, \\\"toAddress_outOfBounds\\\");\\n address tempAddress;\\n\\n assembly {\\n tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000)\\n }\\n\\n return tempAddress;\\n }\\n\\n function toNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory nibbles = new bytes(_bytes.length * 2);\\n\\n for (uint256 i = 0; i < _bytes.length; i++) {\\n nibbles[i * 2] = _bytes[i] >> 4;\\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\\n }\\n\\n return nibbles;\\n }\\n\\n function fromNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory ret = new bytes(_bytes.length / 2);\\n\\n for (uint256 i = 0; i < ret.length; i++) {\\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\\n }\\n\\n return ret;\\n }\\n\\n function equal(\\n bytes memory _bytes,\\n bytes memory _other\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return keccak256(_bytes) == keccak256(_other);\\n }\\n}\\n\",\"keccak256\":\"0xa5195afe32fb2cf104d156e8f4bd39df1ec79bf6ba232097b9e8e0ee14fbc298\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_MerkleTree.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_MerkleTree\\n * @author River Keefer\\n */\\nlibrary Lib_MerkleTree {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Calculates a merkle root for a list of 32-byte leaf hashes. WARNING: If the number\\n * of leaves passed in is not a power of two, it pads out the tree with zero hashes.\\n * If you do not know the original length of elements for the tree you are verifying,\\n * then this may allow empty leaves past _elements.length to pass a verification check down the line.\\n * Note that the _elements argument is modified, therefore it must not be used again afterwards\\n * @param _elements Array of hashes from which to generate a merkle root.\\n * @return Merkle root of the leaves, with zero hashes for non-powers-of-two (see above).\\n */\\n function getMerkleRoot(\\n bytes32[] memory _elements\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n require(\\n _elements.length > 0,\\n \\\"Lib_MerkleTree: Must provide at least one leaf hash.\\\"\\n );\\n\\n if (_elements.length == 1) {\\n return _elements[0];\\n }\\n\\n uint256[16] memory defaults = [\\n 0x290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563,\\n 0x633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d,\\n 0x890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d,\\n 0x3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd8,\\n 0xecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da,\\n 0xdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da5,\\n 0x617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d7,\\n 0x292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead,\\n 0xe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e10,\\n 0x7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f82,\\n 0xe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e83636516,\\n 0x3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c,\\n 0xad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e,\\n 0xa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab,\\n 0x4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c862,\\n 0x2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf10\\n ];\\n\\n // Reserve memory space for our hashes.\\n bytes memory buf = new bytes(64);\\n\\n // We'll need to keep track of left and right siblings.\\n bytes32 leftSibling;\\n bytes32 rightSibling;\\n\\n // Number of non-empty nodes at the current depth.\\n uint256 rowSize = _elements.length;\\n\\n // Current depth, counting from 0 at the leaves\\n uint256 depth = 0;\\n\\n // Common sub-expressions\\n uint256 halfRowSize; // rowSize / 2\\n bool rowSizeIsOdd; // rowSize % 2 == 1\\n\\n while (rowSize > 1) {\\n halfRowSize = rowSize / 2;\\n rowSizeIsOdd = rowSize % 2 == 1;\\n\\n for (uint256 i = 0; i < halfRowSize; i++) {\\n leftSibling = _elements[(2 * i) ];\\n rightSibling = _elements[(2 * i) + 1];\\n assembly {\\n mstore(add(buf, 32), leftSibling )\\n mstore(add(buf, 64), rightSibling)\\n }\\n\\n _elements[i] = keccak256(buf);\\n }\\n\\n if (rowSizeIsOdd) {\\n leftSibling = _elements[rowSize - 1];\\n rightSibling = bytes32(defaults[depth]);\\n assembly {\\n mstore(add(buf, 32), leftSibling)\\n mstore(add(buf, 64), rightSibling)\\n }\\n\\n _elements[halfRowSize] = keccak256(buf);\\n }\\n\\n rowSize = halfRowSize + (rowSizeIsOdd ? 1 : 0);\\n depth++;\\n }\\n\\n return _elements[0];\\n }\\n\\n /**\\n * Verifies a merkle branch for the given leaf hash. Assumes the original length\\n * of leaves generated is a known, correct input, and does not return true for indices\\n * extending past that index (even if _siblings would be otherwise valid.)\\n * @param _root The Merkle root to verify against.\\n * @param _leaf The leaf hash to verify inclusion of.\\n * @param _index The index in the tree of this leaf.\\n * @param _siblings Array of sibline nodes in the inclusion proof, starting from depth 0 (bottom of the tree).\\n * @param _totalLeaves The total number of leaves originally passed into.\\n * @return Whether or not the merkle branch and leaf passes verification.\\n */\\n function verify(\\n bytes32 _root,\\n bytes32 _leaf,\\n uint256 _index,\\n bytes32[] memory _siblings,\\n uint256 _totalLeaves\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n require(\\n _totalLeaves > 0,\\n \\\"Lib_MerkleTree: Total leaves must be greater than zero.\\\"\\n );\\n\\n require(\\n _index < _totalLeaves,\\n \\\"Lib_MerkleTree: Index out of bounds.\\\"\\n );\\n\\n require(\\n _siblings.length == _ceilLog2(_totalLeaves),\\n \\\"Lib_MerkleTree: Total siblings does not correctly correspond to total leaves.\\\"\\n );\\n\\n bytes32 computedRoot = _leaf;\\n\\n for (uint256 i = 0; i < _siblings.length; i++) {\\n if ((_index & 1) == 1) {\\n computedRoot = keccak256(\\n abi.encodePacked(\\n _siblings[i],\\n computedRoot\\n )\\n );\\n } else {\\n computedRoot = keccak256(\\n abi.encodePacked(\\n computedRoot,\\n _siblings[i]\\n )\\n );\\n }\\n\\n _index >>= 1;\\n }\\n\\n return _root == computedRoot;\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Calculates the integer ceiling of the log base 2 of an input.\\n * @param _in Unsigned input to calculate the log.\\n * @return ceil(log_base_2(_in))\\n */\\n function _ceilLog2(\\n uint256 _in\\n )\\n private\\n pure\\n returns (\\n uint256\\n )\\n {\\n require(\\n _in > 0,\\n \\\"Lib_MerkleTree: Cannot compute ceil(log_2) of 0.\\\"\\n );\\n\\n if (_in == 1) {\\n return 0;\\n }\\n\\n // Find the highest set bit (will be floor(log_2)).\\n // Borrowed with <3 from https://github.com/ethereum/solidity-examples\\n uint256 val = _in;\\n uint256 highest = 0;\\n for (uint256 i = 128; i >= 1; i >>= 1) {\\n if (val & (uint(1) << i) - 1 << i != 0) {\\n highest += i;\\n val >>= i;\\n }\\n }\\n\\n // Increment by one if this is not a perfect logarithm.\\n if ((uint(1) << highest) != _in) {\\n highest += 1;\\n }\\n\\n return highest;\\n }\\n}\\n\",\"keccak256\":\"0xa78edb9fbd34712771a1ebff05bc5e1abec7fc1e9a1bfb709d183099b44fa62a\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x608060405234801561001057600080fd5b50604051611bee380380611bee83398101604081905261002f9161005b565b600080546001600160a01b0319166001600160a01b03949094169390931790925560015560025561009c565b60008060006060848603121561006f578283fd5b83516001600160a01b0381168114610085578384fd5b602085015160409095015190969495509392505050565b611b43806100ab6000396000f3fe608060405234801561001057600080fd5b50600436106100b45760003560e01c80638ca5cbb9116100715780638ca5cbb91461012f5780639418bddd14610144578063b8e189ac14610157578063c17b291b1461016a578063cfdf677e14610172578063e561dddc1461017a576100b4565b8063299ca478146100b9578063461a4478146100d75780634d69ee57146100ea5780637aa63a861461010a5780637ad168a01461011f57806381eb62ef14610127575b600080fd5b6100c1610182565b6040516100ce919061159f565b60405180910390f35b6100c16100e53660046114e3565b610191565b6100fd6100f8366004611431565b61026f565b6040516100ce91906115b3565b6101126102e2565b6040516100ce91906115be565b6101126102fb565b610112610314565b61014261013d366004611390565b61031a565b005b6100fd610152366004611531565b61052e565b610142610165366004611531565b61057e565b610112610636565b6100c161063c565b610112610664565b6000546001600160a01b031681565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b838110156101f15781810151838201526020016101d9565b50505050905090810190601f16801561021e5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561023b57600080fd5b505afa15801561024f573d6000803e3d6000fd5b505050506040513d602081101561026557600080fd5b505190505b919050565b600061027a836106de565b61029f5760405162461bcd60e51b815260040161029690611749565b60405180910390fd5b6102bc836020015185846000015185602001518760400151610776565b6102d85760405162461bcd60e51b8152600401610296906116b5565b5060019392505050565b6000806102ed6108fb565b5064ffffffffff1691505090565b6000806103066108fb565b64ffffffffff169250505090565b60025481565b6103226102e2565b81146103405760405162461bcd60e51b8152600401610296906116ec565b6103706040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b815250610191565b6001600160a01b03166302ad4d2a336040518263ffffffff1660e01b815260040161039b919061159f565b60206040518083038186803b1580156103b357600080fd5b505afa1580156103c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103eb91906113d3565b6104075760405162461bcd60e51b8152600401610296906118bb565b60008251116104285760405162461bcd60e51b815260040161029690611878565b6104666040518060400160405280601d81526020017f4f564d5f43616e6f6e6963616c5472616e73616374696f6e436861696e000000815250610191565b6001600160a01b0316637aa63a866040518163ffffffff1660e01b815260040160206040518083038186803b15801561049e57600080fd5b505afa1580156104b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104d69190611419565b82516104e06102e2565b0111156104ff5760405162461bcd60e51b815260040161029690611646565b61052a8242336040516020016105169291906119a1565b604051602081830303815290604052610990565b5050565b60008082608001518060200190518101906105499190611564565b509050806105695760405162461bcd60e51b815260040161029690611833565b4261057682600154610b31565b119392505050565b6105b06040518060400160405280601181526020017027ab26afa33930bab22b32b934b334b2b960791b815250610191565b6001600160a01b0316336001600160a01b0316146105e05760405162461bcd60e51b8152600401610296906117d6565b6105e9816106de565b6106055760405162461bcd60e51b815260040161029690611749565b61060e8161052e565b61062a5760405162461bcd60e51b815260040161029690611778565b61063381610b92565b50565b60015481565b600061065f604051806060016040528060258152602001611ab560259139610191565b905090565b600061066e61063c565b6001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b1580156106a657600080fd5b505afa1580156106ba573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061065f9190611419565b60006106e861063c565b8251604051634a83e9cd60e11b81526001600160a01b039290921691639507d39a91610716916004016115be565b60206040518083038186803b15801561072e57600080fd5b505afa158015610742573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107669190611419565b61076f83610d0a565b1492915050565b60008082116107b65760405162461bcd60e51b8152600401808060200182810382526037815260200180611a316037913960400191505060405180910390fd5b8184106107f45760405162461bcd60e51b81526004018080602001828103825260248152602001806119dd6024913960400191505060405180910390fd5b6107fd82610d50565b83511461083b5760405162461bcd60e51b815260040180806020018281038252604d815260200180611a68604d913960600191505060405180910390fd5b8460005b84518110156108ee57856001166001141561089d5784818151811061086057fe5b60200260200101518260405160200180838152602001828152602001925050506040516020818303038152906040528051906020012091506108e2565b818582815181106108aa57fe5b602002602001015160405160200180838152602001828152602001925050506040516020818303038152906040528051906020012091505b600195861c950161083f565b5090951495945050505050565b600080600061090861063c565b6001600160a01b031663ccf8f9696040518163ffffffff1660e01b815260040160206040518083038186803b15801561094057600080fd5b505afa158015610954573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061097891906113f3565b64ffffffffff602882901c16935060501c9150509091565b60006109bf6040518060400160405280600c81526020016b27ab26afa83937b837b9b2b960a11b815250610191565b90506000806109cc6108fb565b9092509050336001600160a01b03841614156109e9575042610a13565b426002548264ffffffffff160110610a135760405162461bcd60e51b81526004016102969061190a565b60006040518060a00160405280610a28610664565b8152602001610a3688610de6565b8152602001875181526020018464ffffffffff16815260200186815250905080600001517f16be4c5129a4e03cf3350262e181dc02ddfb4a6008d925368c0899fcd97ca9c58260200151836040015184606001518560800151604051610a9f94939291906115dd565b60405180910390a2610aaf61063c565b6001600160a01b0316632015276c610ac683610d0a565b610ada84604001518560600151018661121a565b6040518363ffffffff1660e01b8152600401610af79291906115c7565b600060405180830381600087803b158015610b1157600080fd5b505af1158015610b25573d6000803e3d6000fd5b50505050505050505050565b600082820183811015610b8b576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b610b9a61063c565b6001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b158015610bd257600080fd5b505afa158015610be6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c0a9190611419565b815110610c295760405162461bcd60e51b815260040161029690611973565b610c32816106de565b610c4e5760405162461bcd60e51b815260040161029690611749565b610c5661063c565b6001600160a01b031663167fd6818260000151610c788460600151600061121a565b6040518363ffffffff1660e01b8152600401610c959291906115c7565b600060405180830381600087803b158015610caf57600080fd5b505af1158015610cc3573d6000803e3d6000fd5b5050505080600001517f8747b69ce8fdb31c3b9b0a67bd8049ad8c1a69ea417b69b12174068abd9cbd648260200151604051610cff91906115be565b60405180910390a250565b60008160200151826040015183606001518460800151604051602001610d3394939291906115dd565b604051602081830303815290604052805190602001209050919050565b6000808211610d905760405162461bcd60e51b8152600401808060200182810382526030815260200180611a016030913960400191505060405180910390fd5b8160011415610da15750600061026a565b81600060805b60018110610dd1576000196001821b01811b831615610dc95791821c91908101905b60011c610da7565b506001811b8414610b8b576001019392505050565b600080825111610e275760405162461bcd60e51b8152600401808060200182810382526034815260200180611ada6034913960400191505060405180910390fd5b815160011415610e4d5781600081518110610e3e57fe5b6020026020010151905061026a565b60408051610200810182527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56381527f633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d60208201527f890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d818301527f3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd86060808301919091527fecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da60808301527fdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da560a08301527f617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d760c08301527f292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead60e08301527fe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e106101008301527f7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f826101208301527fe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e836365166101408301527f3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c6101608301527fad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e6101808301527fa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab6101a08301527f4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c8626101c08301527f2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf106101e083015282518381529081018352909160009190602082018180368337505085519192506000918291508180805b60018411156111f65750506002820460018084161460005b82811015611172578a816002028151811061111957fe5b602002602001015196508a816002026001018151811061113557fe5b6020026020010151955086602089015285604089015287805190602001208b828151811061115f57fe5b6020908102919091010152600101611102565b5080156111d55789600185038151811061118857fe5b6020026020010151955087836010811061119e57fe5b602002015160001b945085602088015284604088015286805190602001208a83815181106111c857fe5b6020026020010181815250505b806111e15760006111e4565b60015b60ff16820193506001909201916110ea565b8960008151811061120357fe5b602002602001015198505050505050505050919050565b602890811b91909117901b90565b600067ffffffffffffffff83111561123c57fe5b61124f601f8401601f19166020016119b8565b905082815283838301111561126357600080fd5b828260208301376000602084830101529392505050565b600082601f83011261128a578081fd5b8135602067ffffffffffffffff8211156112a057fe5b8082026112ae8282016119b8565b8381528281019086840183880185018910156112c8578687fd5b8693505b858410156112ea5780358352600193909301929184019184016112cc565b50979650505050505050565b600060a08284031215611307578081fd5b60405160a0810167ffffffffffffffff828210818311171561132557fe5b8160405282935084358352602085013560208401526040850135604084015260608501356060840152608085013591508082111561136257600080fd5b508301601f8101851361137457600080fd5b61138385823560208401611228565b6080830152505092915050565b600080604083850312156113a2578182fd5b823567ffffffffffffffff8111156113b8578283fd5b6113c48582860161127a565b95602094909401359450505050565b6000602082840312156113e4578081fd5b81518015158114610b8b578182fd5b600060208284031215611404578081fd5b815164ffffffffff1981168114610b8b578182fd5b60006020828403121561142a578081fd5b5051919050565b600080600060608486031215611445578081fd5b83359250602084013567ffffffffffffffff80821115611463578283fd5b61146f878388016112f6565b93506040860135915080821115611484578283fd5b9085019060408288031215611497578283fd5b6040516040810181811083821117156114ac57fe5b604052823581526020830135828111156114c4578485fd5b6114d08982860161127a565b6020830152508093505050509250925092565b6000602082840312156114f4578081fd5b813567ffffffffffffffff81111561150a578182fd5b8201601f8101841361151a578182fd5b61152984823560208401611228565b949350505050565b600060208284031215611542578081fd5b813567ffffffffffffffff811115611558578182fd5b611529848285016112f6565b60008060408385031215611576578182fd5b825160208401519092506001600160a01b0381168114611594578182fd5b809150509250929050565b6001600160a01b0391909116815260200190565b901515815260200190565b90815260200190565b91825264ffffffffff1916602082015260400190565b600085825260208581840152846040840152608060608401528351806080850152825b8181101561161c5785810183015185820160a001528201611600565b8181111561162d578360a083870101525b50601f01601f19169290920160a0019695505050505050565b60208082526049908201527f4e756d626572206f6620737461746520726f6f74732063616e6e6f742065786360408201527f65656420746865206e756d626572206f662063616e6f6e6963616c207472616e60608201526839b0b1ba34b7b7399760b91b608082015260a00190565b60208082526018908201527f496e76616c696420696e636c7573696f6e2070726f6f662e0000000000000000604082015260600190565b6020808252603d908201527f41637475616c20626174636820737461727420696e64657820646f6573206e6f60408201527f74206d6174636820657870656374656420737461727420696e6465782e000000606082015260800190565b60208082526015908201527424b73b30b634b2103130ba31b4103432b0b232b91760591b604082015260600190565b602080825260409082018190527f537461746520626174636865732063616e206f6e6c792062652064656c657465908201527f642077697468696e207468652066726175642070726f6f662077696e646f772e606082015260800190565b6020808252603b908201527f537461746520626174636865732063616e206f6e6c792062652064656c65746560408201527f6420627920746865204f564d5f467261756456657269666965722e0000000000606082015260800190565b60208082526025908201527f4261746368206865616465722074696d657374616d702063616e6e6f74206265604082015264207a65726f60d81b606082015260800190565b60208082526023908201527f43616e6e6f74207375626d697420616e20656d7074792073746174652062617460408201526231b41760e91b606082015260800190565b6020808252602f908201527f50726f706f73657220646f6573206e6f74206861766520656e6f75676820636f60408201526e1b1b185d195c985b081c1bdcdd1959608a1b606082015260800190565b60208082526043908201527f43616e6e6f74207075626c69736820737461746520726f6f747320776974686960408201527f6e207468652073657175656e636572207075626c69636174696f6e2077696e6460608201526237bb9760e91b608082015260a00190565b60208082526014908201527324b73b30b634b2103130ba31b41034b73232bc1760611b604082015260600190565b9182526001600160a01b0316602082015260400190565b60405181810167ffffffffffffffff811182821017156119d457fe5b60405291905056fe4c69625f4d65726b6c65547265653a20496e646578206f7574206f6620626f756e64732e4c69625f4d65726b6c65547265653a2043616e6e6f7420636f6d70757465206365696c286c6f675f3229206f6620302e4c69625f4d65726b6c65547265653a20546f74616c206c6561766573206d7573742062652067726561746572207468616e207a65726f2e4c69625f4d65726b6c65547265653a20546f74616c207369626c696e677320646f6573206e6f7420636f72726563746c7920636f72726573706f6e6420746f20746f74616c206c65617665732e4f564d5f436861696e53746f72616765436f6e7461696e65723a5343433a626174636865734c69625f4d65726b6c65547265653a204d7573742070726f76696465206174206c65617374206f6e65206c65616620686173682ea26469706673582212209a79aee928c48a8e868127cc94d1fe1eb4eea95e98e6709cd65bda19d650209064736f6c63430007060033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100b45760003560e01c80638ca5cbb9116100715780638ca5cbb91461012f5780639418bddd14610144578063b8e189ac14610157578063c17b291b1461016a578063cfdf677e14610172578063e561dddc1461017a576100b4565b8063299ca478146100b9578063461a4478146100d75780634d69ee57146100ea5780637aa63a861461010a5780637ad168a01461011f57806381eb62ef14610127575b600080fd5b6100c1610182565b6040516100ce919061159f565b60405180910390f35b6100c16100e53660046114e3565b610191565b6100fd6100f8366004611431565b61026f565b6040516100ce91906115b3565b6101126102e2565b6040516100ce91906115be565b6101126102fb565b610112610314565b61014261013d366004611390565b61031a565b005b6100fd610152366004611531565b61052e565b610142610165366004611531565b61057e565b610112610636565b6100c161063c565b610112610664565b6000546001600160a01b031681565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b838110156101f15781810151838201526020016101d9565b50505050905090810190601f16801561021e5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561023b57600080fd5b505afa15801561024f573d6000803e3d6000fd5b505050506040513d602081101561026557600080fd5b505190505b919050565b600061027a836106de565b61029f5760405162461bcd60e51b815260040161029690611749565b60405180910390fd5b6102bc836020015185846000015185602001518760400151610776565b6102d85760405162461bcd60e51b8152600401610296906116b5565b5060019392505050565b6000806102ed6108fb565b5064ffffffffff1691505090565b6000806103066108fb565b64ffffffffff169250505090565b60025481565b6103226102e2565b81146103405760405162461bcd60e51b8152600401610296906116ec565b6103706040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b815250610191565b6001600160a01b03166302ad4d2a336040518263ffffffff1660e01b815260040161039b919061159f565b60206040518083038186803b1580156103b357600080fd5b505afa1580156103c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103eb91906113d3565b6104075760405162461bcd60e51b8152600401610296906118bb565b60008251116104285760405162461bcd60e51b815260040161029690611878565b6104666040518060400160405280601d81526020017f4f564d5f43616e6f6e6963616c5472616e73616374696f6e436861696e000000815250610191565b6001600160a01b0316637aa63a866040518163ffffffff1660e01b815260040160206040518083038186803b15801561049e57600080fd5b505afa1580156104b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104d69190611419565b82516104e06102e2565b0111156104ff5760405162461bcd60e51b815260040161029690611646565b61052a8242336040516020016105169291906119a1565b604051602081830303815290604052610990565b5050565b60008082608001518060200190518101906105499190611564565b509050806105695760405162461bcd60e51b815260040161029690611833565b4261057682600154610b31565b119392505050565b6105b06040518060400160405280601181526020017027ab26afa33930bab22b32b934b334b2b960791b815250610191565b6001600160a01b0316336001600160a01b0316146105e05760405162461bcd60e51b8152600401610296906117d6565b6105e9816106de565b6106055760405162461bcd60e51b815260040161029690611749565b61060e8161052e565b61062a5760405162461bcd60e51b815260040161029690611778565b61063381610b92565b50565b60015481565b600061065f604051806060016040528060258152602001611ab560259139610191565b905090565b600061066e61063c565b6001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b1580156106a657600080fd5b505afa1580156106ba573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061065f9190611419565b60006106e861063c565b8251604051634a83e9cd60e11b81526001600160a01b039290921691639507d39a91610716916004016115be565b60206040518083038186803b15801561072e57600080fd5b505afa158015610742573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107669190611419565b61076f83610d0a565b1492915050565b60008082116107b65760405162461bcd60e51b8152600401808060200182810382526037815260200180611a316037913960400191505060405180910390fd5b8184106107f45760405162461bcd60e51b81526004018080602001828103825260248152602001806119dd6024913960400191505060405180910390fd5b6107fd82610d50565b83511461083b5760405162461bcd60e51b815260040180806020018281038252604d815260200180611a68604d913960600191505060405180910390fd5b8460005b84518110156108ee57856001166001141561089d5784818151811061086057fe5b60200260200101518260405160200180838152602001828152602001925050506040516020818303038152906040528051906020012091506108e2565b818582815181106108aa57fe5b602002602001015160405160200180838152602001828152602001925050506040516020818303038152906040528051906020012091505b600195861c950161083f565b5090951495945050505050565b600080600061090861063c565b6001600160a01b031663ccf8f9696040518163ffffffff1660e01b815260040160206040518083038186803b15801561094057600080fd5b505afa158015610954573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061097891906113f3565b64ffffffffff602882901c16935060501c9150509091565b60006109bf6040518060400160405280600c81526020016b27ab26afa83937b837b9b2b960a11b815250610191565b90506000806109cc6108fb565b9092509050336001600160a01b03841614156109e9575042610a13565b426002548264ffffffffff160110610a135760405162461bcd60e51b81526004016102969061190a565b60006040518060a00160405280610a28610664565b8152602001610a3688610de6565b8152602001875181526020018464ffffffffff16815260200186815250905080600001517f16be4c5129a4e03cf3350262e181dc02ddfb4a6008d925368c0899fcd97ca9c58260200151836040015184606001518560800151604051610a9f94939291906115dd565b60405180910390a2610aaf61063c565b6001600160a01b0316632015276c610ac683610d0a565b610ada84604001518560600151018661121a565b6040518363ffffffff1660e01b8152600401610af79291906115c7565b600060405180830381600087803b158015610b1157600080fd5b505af1158015610b25573d6000803e3d6000fd5b50505050505050505050565b600082820183811015610b8b576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b610b9a61063c565b6001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b158015610bd257600080fd5b505afa158015610be6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c0a9190611419565b815110610c295760405162461bcd60e51b815260040161029690611973565b610c32816106de565b610c4e5760405162461bcd60e51b815260040161029690611749565b610c5661063c565b6001600160a01b031663167fd6818260000151610c788460600151600061121a565b6040518363ffffffff1660e01b8152600401610c959291906115c7565b600060405180830381600087803b158015610caf57600080fd5b505af1158015610cc3573d6000803e3d6000fd5b5050505080600001517f8747b69ce8fdb31c3b9b0a67bd8049ad8c1a69ea417b69b12174068abd9cbd648260200151604051610cff91906115be565b60405180910390a250565b60008160200151826040015183606001518460800151604051602001610d3394939291906115dd565b604051602081830303815290604052805190602001209050919050565b6000808211610d905760405162461bcd60e51b8152600401808060200182810382526030815260200180611a016030913960400191505060405180910390fd5b8160011415610da15750600061026a565b81600060805b60018110610dd1576000196001821b01811b831615610dc95791821c91908101905b60011c610da7565b506001811b8414610b8b576001019392505050565b600080825111610e275760405162461bcd60e51b8152600401808060200182810382526034815260200180611ada6034913960400191505060405180910390fd5b815160011415610e4d5781600081518110610e3e57fe5b6020026020010151905061026a565b60408051610200810182527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56381527f633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d60208201527f890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d818301527f3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd86060808301919091527fecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da60808301527fdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da560a08301527f617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d760c08301527f292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead60e08301527fe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e106101008301527f7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f826101208301527fe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e836365166101408301527f3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c6101608301527fad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e6101808301527fa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab6101a08301527f4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c8626101c08301527f2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf106101e083015282518381529081018352909160009190602082018180368337505085519192506000918291508180805b60018411156111f65750506002820460018084161460005b82811015611172578a816002028151811061111957fe5b602002602001015196508a816002026001018151811061113557fe5b6020026020010151955086602089015285604089015287805190602001208b828151811061115f57fe5b6020908102919091010152600101611102565b5080156111d55789600185038151811061118857fe5b6020026020010151955087836010811061119e57fe5b602002015160001b945085602088015284604088015286805190602001208a83815181106111c857fe5b6020026020010181815250505b806111e15760006111e4565b60015b60ff16820193506001909201916110ea565b8960008151811061120357fe5b602002602001015198505050505050505050919050565b602890811b91909117901b90565b600067ffffffffffffffff83111561123c57fe5b61124f601f8401601f19166020016119b8565b905082815283838301111561126357600080fd5b828260208301376000602084830101529392505050565b600082601f83011261128a578081fd5b8135602067ffffffffffffffff8211156112a057fe5b8082026112ae8282016119b8565b8381528281019086840183880185018910156112c8578687fd5b8693505b858410156112ea5780358352600193909301929184019184016112cc565b50979650505050505050565b600060a08284031215611307578081fd5b60405160a0810167ffffffffffffffff828210818311171561132557fe5b8160405282935084358352602085013560208401526040850135604084015260608501356060840152608085013591508082111561136257600080fd5b508301601f8101851361137457600080fd5b61138385823560208401611228565b6080830152505092915050565b600080604083850312156113a2578182fd5b823567ffffffffffffffff8111156113b8578283fd5b6113c48582860161127a565b95602094909401359450505050565b6000602082840312156113e4578081fd5b81518015158114610b8b578182fd5b600060208284031215611404578081fd5b815164ffffffffff1981168114610b8b578182fd5b60006020828403121561142a578081fd5b5051919050565b600080600060608486031215611445578081fd5b83359250602084013567ffffffffffffffff80821115611463578283fd5b61146f878388016112f6565b93506040860135915080821115611484578283fd5b9085019060408288031215611497578283fd5b6040516040810181811083821117156114ac57fe5b604052823581526020830135828111156114c4578485fd5b6114d08982860161127a565b6020830152508093505050509250925092565b6000602082840312156114f4578081fd5b813567ffffffffffffffff81111561150a578182fd5b8201601f8101841361151a578182fd5b61152984823560208401611228565b949350505050565b600060208284031215611542578081fd5b813567ffffffffffffffff811115611558578182fd5b611529848285016112f6565b60008060408385031215611576578182fd5b825160208401519092506001600160a01b0381168114611594578182fd5b809150509250929050565b6001600160a01b0391909116815260200190565b901515815260200190565b90815260200190565b91825264ffffffffff1916602082015260400190565b600085825260208581840152846040840152608060608401528351806080850152825b8181101561161c5785810183015185820160a001528201611600565b8181111561162d578360a083870101525b50601f01601f19169290920160a0019695505050505050565b60208082526049908201527f4e756d626572206f6620737461746520726f6f74732063616e6e6f742065786360408201527f65656420746865206e756d626572206f662063616e6f6e6963616c207472616e60608201526839b0b1ba34b7b7399760b91b608082015260a00190565b60208082526018908201527f496e76616c696420696e636c7573696f6e2070726f6f662e0000000000000000604082015260600190565b6020808252603d908201527f41637475616c20626174636820737461727420696e64657820646f6573206e6f60408201527f74206d6174636820657870656374656420737461727420696e6465782e000000606082015260800190565b60208082526015908201527424b73b30b634b2103130ba31b4103432b0b232b91760591b604082015260600190565b602080825260409082018190527f537461746520626174636865732063616e206f6e6c792062652064656c657465908201527f642077697468696e207468652066726175642070726f6f662077696e646f772e606082015260800190565b6020808252603b908201527f537461746520626174636865732063616e206f6e6c792062652064656c65746560408201527f6420627920746865204f564d5f467261756456657269666965722e0000000000606082015260800190565b60208082526025908201527f4261746368206865616465722074696d657374616d702063616e6e6f74206265604082015264207a65726f60d81b606082015260800190565b60208082526023908201527f43616e6e6f74207375626d697420616e20656d7074792073746174652062617460408201526231b41760e91b606082015260800190565b6020808252602f908201527f50726f706f73657220646f6573206e6f74206861766520656e6f75676820636f60408201526e1b1b185d195c985b081c1bdcdd1959608a1b606082015260800190565b60208082526043908201527f43616e6e6f74207075626c69736820737461746520726f6f747320776974686960408201527f6e207468652073657175656e636572207075626c69636174696f6e2077696e6460608201526237bb9760e91b608082015260a00190565b60208082526014908201527324b73b30b634b2103130ba31b41034b73232bc1760611b604082015260600190565b9182526001600160a01b0316602082015260400190565b60405181810167ffffffffffffffff811182821017156119d457fe5b60405291905056fe4c69625f4d65726b6c65547265653a20496e646578206f7574206f6620626f756e64732e4c69625f4d65726b6c65547265653a2043616e6e6f7420636f6d70757465206365696c286c6f675f3229206f6620302e4c69625f4d65726b6c65547265653a20546f74616c206c6561766573206d7573742062652067726561746572207468616e207a65726f2e4c69625f4d65726b6c65547265653a20546f74616c207369626c696e677320646f6573206e6f7420636f72726563746c7920636f72726573706f6e6420746f20746f74616c206c65617665732e4f564d5f436861696e53746f72616765436f6e7461696e65723a5343433a626174636865734c69625f4d65726b6c65547265653a204d7573742070726f76696465206174206c65617374206f6e65206c65616620686173682ea26469706673582212209a79aee928c48a8e868127cc94d1fe1eb4eea95e98e6709cd65bda19d650209064736f6c63430007060033", + "devdoc": { + "details": "The State Commitment Chain (SCC) contract contains a list of proposed state roots which Proposers assert to be a result of each transaction in the Canonical Transaction Chain (CTC). Elements here have a 1:1 correspondence with transactions in the CTC, and should be the unique state root calculated off-chain by applying the canonical transactions one by one. Compiler used: solc Runtime target: EVM", + "kind": "dev", + "methods": { + "appendStateBatch(bytes32[],uint256)": { + "params": { + "_batch": "Batch of state roots.", + "_shouldStartAtElement": "Index of the element at which this batch should start." + } + }, + "batches()": { + "returns": { + "_0": "Reference to the batch storage container." + } + }, + "constructor": { + "params": { + "_libAddressManager": "Address of the Address Manager." + } + }, + "deleteStateBatch((uint256,bytes32,uint256,uint256,bytes))": { + "params": { + "_batchHeader": "Header of the batch to start deleting from." + } + }, + "getLastSequencerTimestamp()": { + "returns": { + "_lastSequencerTimestamp": "Last sequencer batch timestamp." + } + }, + "getTotalBatches()": { + "returns": { + "_totalBatches": "Total submitted batches." + } + }, + "getTotalElements()": { + "returns": { + "_totalElements": "Total submitted elements." + } + }, + "insideFraudProofWindow((uint256,bytes32,uint256,uint256,bytes))": { + "params": { + "_batchHeader": "Header of the batch to check." + }, + "returns": { + "_inside": "Whether or not the batch is inside the fraud proof window." + } + }, + "resolve(string)": { + "params": { + "_name": "Name to resolve an address for." + }, + "returns": { + "_0": "Address associated with the given name." + } + }, + "verifyStateCommitment(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))": { + "params": { + "_batchHeader": "Header of the batch in which the element was included.", + "_element": "Hash of the element to verify a proof for.", + "_proof": "Merkle inclusion proof for the element." + } + } + }, + "title": "OVM_StateCommitmentChain", + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": { + "appendStateBatch(bytes32[],uint256)": { + "notice": "Appends a batch of state roots to the chain." + }, + "batches()": { + "notice": "Accesses the batch storage container." + }, + "deleteStateBatch((uint256,bytes32,uint256,uint256,bytes))": { + "notice": "Deletes all state roots after (and including) a given batch." + }, + "getLastSequencerTimestamp()": { + "notice": "Retrieves the timestamp of the last batch submitted by the sequencer." + }, + "getTotalBatches()": { + "notice": "Retrieves the total number of batches submitted." + }, + "getTotalElements()": { + "notice": "Retrieves the total number of elements submitted." + }, + "insideFraudProofWindow((uint256,bytes32,uint256,uint256,bytes))": { + "notice": "Checks whether a given batch is still inside its fraud proof window." + }, + "resolve(string)": { + "notice": "Resolves the address associated with a given name." + }, + "verifyStateCommitment(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))": { + "notice": "Verifies a batch inclusion proof." + } + }, + "version": 1 + }, + "storageLayout": { + "storage": [ + { + "astId": 12055, + "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_StateCommitmentChain.sol:OVM_StateCommitmentChain", + "label": "libAddressManager", + "offset": 0, + "slot": "0", + "type": "t_contract(Lib_AddressManager)12048" + }, + { + "astId": 3924, + "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_StateCommitmentChain.sol:OVM_StateCommitmentChain", + "label": "FRAUD_PROOF_WINDOW", + "offset": 0, + "slot": "1", + "type": "t_uint256" + }, + { + "astId": 3926, + "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_StateCommitmentChain.sol:OVM_StateCommitmentChain", + "label": "SEQUENCER_PUBLISH_WINDOW", + "offset": 0, + "slot": "2", + "type": "t_uint256" + } + ], + "types": { + "t_contract(Lib_AddressManager)12048": { + "encoding": "inplace", + "label": "contract Lib_AddressManager", + "numberOfBytes": "20" + }, + "t_uint256": { + "encoding": "inplace", + "label": "uint256", + "numberOfBytes": "32" + } + } + } +} \ No newline at end of file diff --git a/packages/contracts/deployments/goerli-v3/OVM_StateManagerFactory.json b/packages/contracts/deployments/goerli-v3/OVM_StateManagerFactory.json new file mode 100644 index 0000000000000..60ed243016377 --- /dev/null +++ b/packages/contracts/deployments/goerli-v3/OVM_StateManagerFactory.json @@ -0,0 +1,74 @@ +{ + "address": "0x8E63CD1CfDBe5d34a7a91B97E0A2AeA23D0e585D", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_owner", + "type": "address" + } + ], + "name": "create", + "outputs": [ + { + "internalType": "contract iOVM_StateManager", + "name": "", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "transactionHash": "0xd689eba5b8fd84816f3fbe9c3be710705e27741e22403240dace3f0a68a50f55", + "receipt": { + "to": null, + "from": "0x4107438C1b1579f258AF9d1AC06194C4a0F55040", + "contractAddress": "0x8E63CD1CfDBe5d34a7a91B97E0A2AeA23D0e585D", + "transactionIndex": 2, + "gasUsed": "1170970", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0xb974189ddc2d16744bedca25c14ff6d9963b3ca5eb813d432444cc1211b17c57", + "transactionHash": "0xd689eba5b8fd84816f3fbe9c3be710705e27741e22403240dace3f0a68a50f55", + "logs": [], + "blockNumber": 4694117, + "cumulativeGasUsed": "1355204", + "status": 1, + "byzantium": true + }, + "args": [], + "solcInputHash": "dde656dd41f49cad9eac9bc7065fd6a7", + "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"}],\"name\":\"create\",\"outputs\":[{\"internalType\":\"contract iOVM_StateManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The State Manager Factory is called by a State Transitioner's init code, to create a new State Manager for use in the Fraud Verification process. Compiler used: solc Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"create(address)\":{\"params\":{\"_owner\":\"Owner of the created contract.\"},\"returns\":{\"_0\":\"New OVM_StateManager instance.\"}}},\"title\":\"OVM_StateManagerFactory\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"create(address)\":{\"notice\":\"Creates a new OVM_StateManager\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/OVM/execution/OVM_StateManagerFactory.sol\":\"OVM_StateManagerFactory\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/optimistic-ethereum/OVM/execution/OVM_StateManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_StateManager } from \\\"../../iOVM/execution/iOVM_StateManager.sol\\\";\\n\\n/**\\n * @title OVM_StateManager\\n * @dev The State Manager contract holds all storage values for contracts in the OVM. It can only be written to by the\\n * the Execution Manager and State Transitioner. It runs on L1 during the setup and execution of a fraud proof.\\n * The same logic runs on L2, but has been implemented as a precompile in the L2 go-ethereum client\\n * (see https://github.com/ethereum-optimism/go-ethereum/blob/master/core/vm/ovm_state_manager.go).\\n *\\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract OVM_StateManager is iOVM_StateManager {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n bytes32 constant internal EMPTY_ACCOUNT_STORAGE_ROOT = 0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421;\\n bytes32 constant internal EMPTY_ACCOUNT_CODE_HASH = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;\\n bytes32 constant internal STORAGE_XOR_VALUE = 0xFEEDFACECAFEBEEFFEEDFACECAFEBEEFFEEDFACECAFEBEEFFEEDFACECAFEBEEF;\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n address override public owner;\\n address override public ovmExecutionManager;\\n mapping (address => Lib_OVMCodec.Account) internal accounts;\\n mapping (address => mapping (bytes32 => bytes32)) internal contractStorage;\\n mapping (address => mapping (bytes32 => bool)) internal verifiedContractStorage;\\n mapping (bytes32 => ItemState) internal itemStates;\\n uint256 internal totalUncommittedAccounts;\\n uint256 internal totalUncommittedContractStorage;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _owner Address of the owner of this contract.\\n */\\n constructor(\\n address _owner\\n )\\n {\\n owner = _owner;\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n /**\\n * Simple authentication, this contract should only be accessible to the owner (which is expected to be the State Transitioner during `PRE_EXECUTION`\\n * or the OVM_ExecutionManager during transaction execution.\\n */\\n modifier authenticated() {\\n // owner is the State Transitioner\\n require(\\n msg.sender == owner || msg.sender == ovmExecutionManager,\\n \\\"Function can only be called by authenticated addresses\\\"\\n );\\n _;\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Checks whether a given address is allowed to modify this contract.\\n * @param _address Address to check.\\n * @return Whether or not the address can modify this contract.\\n */\\n function isAuthenticated(\\n address _address\\n )\\n override\\n public\\n view\\n returns (\\n bool\\n )\\n {\\n return (_address == owner || _address == ovmExecutionManager);\\n }\\n\\n /**\\n * Sets the address of the OVM_ExecutionManager.\\n * @param _ovmExecutionManager Address of the OVM_ExecutionManager.\\n */\\n function setExecutionManager(\\n address _ovmExecutionManager\\n )\\n override\\n public\\n authenticated\\n {\\n ovmExecutionManager = _ovmExecutionManager;\\n }\\n\\n /**\\n * Inserts an account into the state.\\n * @param _address Address of the account to insert.\\n * @param _account Account to insert for the given address.\\n */\\n function putAccount(\\n address _address,\\n Lib_OVMCodec.Account memory _account\\n )\\n override\\n public\\n authenticated\\n {\\n accounts[_address] = _account;\\n }\\n\\n /**\\n * Marks an account as empty.\\n * @param _address Address of the account to mark.\\n */\\n function putEmptyAccount(\\n address _address\\n )\\n override\\n public\\n authenticated\\n {\\n Lib_OVMCodec.Account storage account = accounts[_address];\\n account.storageRoot = EMPTY_ACCOUNT_STORAGE_ROOT;\\n account.codeHash = EMPTY_ACCOUNT_CODE_HASH;\\n }\\n\\n /**\\n * Retrieves an account from the state.\\n * @param _address Address of the account to retrieve.\\n * @return Account for the given address.\\n */\\n function getAccount(\\n address _address\\n )\\n override\\n public\\n view\\n returns (\\n Lib_OVMCodec.Account memory\\n )\\n {\\n return accounts[_address];\\n }\\n\\n /**\\n * Checks whether the state has a given account.\\n * @param _address Address of the account to check.\\n * @return Whether or not the state has the account.\\n */\\n function hasAccount(\\n address _address\\n )\\n override\\n public\\n view\\n returns (\\n bool\\n )\\n {\\n return accounts[_address].codeHash != bytes32(0);\\n }\\n\\n /**\\n * Checks whether the state has a given known empty account.\\n * @param _address Address of the account to check.\\n * @return Whether or not the state has the empty account.\\n */\\n function hasEmptyAccount(\\n address _address\\n )\\n override\\n public\\n view\\n returns (\\n bool\\n )\\n {\\n return (\\n accounts[_address].codeHash == EMPTY_ACCOUNT_CODE_HASH\\n && accounts[_address].nonce == 0\\n );\\n }\\n\\n /**\\n * Sets the nonce of an account.\\n * @param _address Address of the account to modify.\\n * @param _nonce New account nonce.\\n */\\n function setAccountNonce(\\n address _address,\\n uint256 _nonce\\n )\\n override\\n public\\n authenticated\\n {\\n accounts[_address].nonce = _nonce;\\n }\\n\\n /**\\n * Gets the nonce of an account.\\n * @param _address Address of the account to access.\\n * @return Nonce of the account.\\n */\\n function getAccountNonce(\\n address _address\\n )\\n override\\n public\\n view\\n returns (\\n uint256\\n )\\n {\\n return accounts[_address].nonce;\\n }\\n\\n /**\\n * Retrieves the Ethereum address of an account.\\n * @param _address Address of the account to access.\\n * @return Corresponding Ethereum address.\\n */\\n function getAccountEthAddress(\\n address _address\\n )\\n override\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return accounts[_address].ethAddress;\\n }\\n\\n /**\\n * Retrieves the storage root of an account.\\n * @param _address Address of the account to access.\\n * @return Corresponding storage root.\\n */\\n function getAccountStorageRoot(\\n address _address\\n )\\n override\\n public\\n view\\n returns (\\n bytes32\\n )\\n {\\n return accounts[_address].storageRoot;\\n }\\n\\n /**\\n * Initializes a pending account (during CREATE or CREATE2) with the default values.\\n * @param _address Address of the account to initialize.\\n */\\n function initPendingAccount(\\n address _address\\n )\\n override\\n public\\n authenticated\\n {\\n Lib_OVMCodec.Account storage account = accounts[_address];\\n account.nonce = 1;\\n account.storageRoot = EMPTY_ACCOUNT_STORAGE_ROOT;\\n account.codeHash = EMPTY_ACCOUNT_CODE_HASH;\\n account.isFresh = true;\\n }\\n\\n /**\\n * Finalizes the creation of a pending account (during CREATE or CREATE2).\\n * @param _address Address of the account to finalize.\\n * @param _ethAddress Address of the account's associated contract on Ethereum.\\n * @param _codeHash Hash of the account's code.\\n */\\n function commitPendingAccount(\\n address _address,\\n address _ethAddress,\\n bytes32 _codeHash\\n )\\n override\\n public\\n authenticated\\n {\\n Lib_OVMCodec.Account storage account = accounts[_address];\\n account.ethAddress = _ethAddress;\\n account.codeHash = _codeHash;\\n }\\n\\n /**\\n * Checks whether an account has already been retrieved, and marks it as retrieved if not.\\n * @param _address Address of the account to check.\\n * @return Whether or not the account was already loaded.\\n */\\n function testAndSetAccountLoaded(\\n address _address\\n )\\n override\\n public\\n authenticated\\n returns (\\n bool\\n )\\n {\\n return _testAndSetItemState(\\n _getItemHash(_address),\\n ItemState.ITEM_LOADED\\n );\\n }\\n\\n /**\\n * Checks whether an account has already been modified, and marks it as modified if not.\\n * @param _address Address of the account to check.\\n * @return Whether or not the account was already modified.\\n */\\n function testAndSetAccountChanged(\\n address _address\\n )\\n override\\n public\\n authenticated\\n returns (\\n bool\\n )\\n {\\n return _testAndSetItemState(\\n _getItemHash(_address),\\n ItemState.ITEM_CHANGED\\n );\\n }\\n\\n /**\\n * Attempts to mark an account as committed.\\n * @param _address Address of the account to commit.\\n * @return Whether or not the account was committed.\\n */\\n function commitAccount(\\n address _address\\n )\\n override\\n public\\n authenticated\\n returns (\\n bool\\n )\\n {\\n bytes32 item = _getItemHash(_address);\\n if (itemStates[item] != ItemState.ITEM_CHANGED) {\\n return false;\\n }\\n\\n itemStates[item] = ItemState.ITEM_COMMITTED;\\n totalUncommittedAccounts -= 1;\\n\\n return true;\\n }\\n\\n /**\\n * Increments the total number of uncommitted accounts.\\n */\\n function incrementTotalUncommittedAccounts()\\n override\\n public\\n authenticated\\n {\\n totalUncommittedAccounts += 1;\\n }\\n\\n /**\\n * Gets the total number of uncommitted accounts.\\n * @return Total uncommitted accounts.\\n */\\n function getTotalUncommittedAccounts()\\n override\\n public\\n view\\n returns (\\n uint256\\n )\\n {\\n return totalUncommittedAccounts;\\n }\\n\\n /**\\n * Checks whether a given account was changed during execution.\\n * @param _address Address to check.\\n * @return Whether or not the account was changed.\\n */\\n function wasAccountChanged(\\n address _address\\n )\\n override\\n public\\n view\\n returns (\\n bool\\n )\\n {\\n bytes32 item = _getItemHash(_address);\\n return itemStates[item] >= ItemState.ITEM_CHANGED;\\n }\\n\\n /**\\n * Checks whether a given account was committed after execution.\\n * @param _address Address to check.\\n * @return Whether or not the account was committed.\\n */\\n function wasAccountCommitted(\\n address _address\\n )\\n override\\n public\\n view\\n returns (\\n bool\\n )\\n {\\n bytes32 item = _getItemHash(_address);\\n return itemStates[item] >= ItemState.ITEM_COMMITTED;\\n }\\n\\n\\n /************************************\\n * Public Functions: Storage Access *\\n ************************************/\\n\\n /**\\n * Changes a contract storage slot value.\\n * @param _contract Address of the contract to modify.\\n * @param _key 32 byte storage slot key.\\n * @param _value 32 byte storage slot value.\\n */\\n function putContractStorage(\\n address _contract,\\n bytes32 _key,\\n bytes32 _value\\n )\\n override\\n public\\n authenticated\\n {\\n // A hilarious optimization. `SSTORE`ing a value of `bytes32(0)` is common enough that it's\\n // worth populating this with a non-zero value in advance (during the fraud proof\\n // initialization phase) to cut the execution-time cost down to 5000 gas.\\n contractStorage[_contract][_key] = _value ^ STORAGE_XOR_VALUE;\\n\\n // Only used when initially populating the contract storage. OVM_ExecutionManager will\\n // perform a `hasContractStorage` INVALID_STATE_ACCESS check before putting any contract\\n // storage because writing to zero when the actual value is nonzero causes a gas\\n // discrepancy. Could be moved into a new `putVerifiedContractStorage` function, or\\n // something along those lines.\\n if (verifiedContractStorage[_contract][_key] == false) {\\n verifiedContractStorage[_contract][_key] = true;\\n }\\n }\\n\\n /**\\n * Retrieves a contract storage slot value.\\n * @param _contract Address of the contract to access.\\n * @param _key 32 byte storage slot key.\\n * @return 32 byte storage slot value.\\n */\\n function getContractStorage(\\n address _contract,\\n bytes32 _key\\n )\\n override\\n public\\n view\\n returns (\\n bytes32\\n )\\n {\\n // Storage XOR system doesn't work for newly created contracts that haven't set this\\n // storage slot value yet.\\n if (\\n verifiedContractStorage[_contract][_key] == false\\n && accounts[_contract].isFresh\\n ) {\\n return bytes32(0);\\n }\\n\\n // See `putContractStorage` for more information about the XOR here.\\n return contractStorage[_contract][_key] ^ STORAGE_XOR_VALUE;\\n }\\n\\n /**\\n * Checks whether a contract storage slot exists in the state.\\n * @param _contract Address of the contract to access.\\n * @param _key 32 byte storage slot key.\\n * @return Whether or not the key was set in the state.\\n */\\n function hasContractStorage(\\n address _contract,\\n bytes32 _key\\n )\\n override\\n public\\n view\\n returns (\\n bool\\n )\\n {\\n return verifiedContractStorage[_contract][_key] || accounts[_contract].isFresh;\\n }\\n\\n /**\\n * Checks whether a storage slot has already been retrieved, and marks it as retrieved if not.\\n * @param _contract Address of the contract to check.\\n * @param _key 32 byte storage slot key.\\n * @return Whether or not the slot was already loaded.\\n */\\n function testAndSetContractStorageLoaded(\\n address _contract,\\n bytes32 _key\\n )\\n override\\n public\\n authenticated\\n returns (\\n bool\\n )\\n {\\n return _testAndSetItemState(\\n _getItemHash(_contract, _key),\\n ItemState.ITEM_LOADED\\n );\\n }\\n\\n /**\\n * Checks whether a storage slot has already been modified, and marks it as modified if not.\\n * @param _contract Address of the contract to check.\\n * @param _key 32 byte storage slot key.\\n * @return Whether or not the slot was already modified.\\n */\\n function testAndSetContractStorageChanged(\\n address _contract,\\n bytes32 _key\\n )\\n override\\n public\\n authenticated\\n returns (\\n bool\\n )\\n {\\n return _testAndSetItemState(\\n _getItemHash(_contract, _key),\\n ItemState.ITEM_CHANGED\\n );\\n }\\n\\n /**\\n * Attempts to mark a storage slot as committed.\\n * @param _contract Address of the account to commit.\\n * @param _key 32 byte slot key to commit.\\n * @return Whether or not the slot was committed.\\n */\\n function commitContractStorage(\\n address _contract,\\n bytes32 _key\\n )\\n override\\n public\\n authenticated\\n returns (\\n bool\\n )\\n {\\n bytes32 item = _getItemHash(_contract, _key);\\n if (itemStates[item] != ItemState.ITEM_CHANGED) {\\n return false;\\n }\\n\\n itemStates[item] = ItemState.ITEM_COMMITTED;\\n totalUncommittedContractStorage -= 1;\\n\\n return true;\\n }\\n\\n /**\\n * Increments the total number of uncommitted storage slots.\\n */\\n function incrementTotalUncommittedContractStorage()\\n override\\n public\\n authenticated\\n {\\n totalUncommittedContractStorage += 1;\\n }\\n\\n /**\\n * Gets the total number of uncommitted storage slots.\\n * @return Total uncommitted storage slots.\\n */\\n function getTotalUncommittedContractStorage()\\n override\\n public\\n view\\n returns (\\n uint256\\n )\\n {\\n return totalUncommittedContractStorage;\\n }\\n\\n /**\\n * Checks whether a given storage slot was changed during execution.\\n * @param _contract Address to check.\\n * @param _key Key of the storage slot to check.\\n * @return Whether or not the storage slot was changed.\\n */\\n function wasContractStorageChanged(\\n address _contract,\\n bytes32 _key\\n )\\n override\\n public\\n view\\n returns (\\n bool\\n )\\n {\\n bytes32 item = _getItemHash(_contract, _key);\\n return itemStates[item] >= ItemState.ITEM_CHANGED;\\n }\\n\\n /**\\n * Checks whether a given storage slot was committed after execution.\\n * @param _contract Address to check.\\n * @param _key Key of the storage slot to check.\\n * @return Whether or not the storage slot was committed.\\n */\\n function wasContractStorageCommitted(\\n address _contract,\\n bytes32 _key\\n )\\n override\\n public\\n view\\n returns (\\n bool\\n )\\n {\\n bytes32 item = _getItemHash(_contract, _key);\\n return itemStates[item] >= ItemState.ITEM_COMMITTED;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Generates a unique hash for an address.\\n * @param _address Address to generate a hash for.\\n * @return Unique hash for the given address.\\n */\\n function _getItemHash(\\n address _address\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(abi.encodePacked(_address));\\n }\\n\\n /**\\n * Generates a unique hash for an address/key pair.\\n * @param _contract Address to generate a hash for.\\n * @param _key Key to generate a hash for.\\n * @return Unique hash for the given pair.\\n */\\n function _getItemHash(\\n address _contract,\\n bytes32 _key\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(abi.encodePacked(\\n _contract,\\n _key\\n ));\\n }\\n\\n /**\\n * Checks whether an item is in a particular state (ITEM_LOADED or ITEM_CHANGED) and sets the\\n * item to the provided state if not.\\n * @param _item 32 byte item ID to check.\\n * @param _minItemState Minimum state that must be satisfied by the item.\\n * @return Whether or not the item was already in the state.\\n */\\n function _testAndSetItemState(\\n bytes32 _item,\\n ItemState _minItemState\\n )\\n internal\\n returns (\\n bool\\n )\\n {\\n bool wasItemState = itemStates[_item] >= _minItemState;\\n\\n if (wasItemState == false) {\\n itemStates[_item] = _minItemState;\\n }\\n\\n return wasItemState;\\n }\\n}\\n\",\"keccak256\":\"0x0df9654f9f958038435c2b2a2c7793b20fa16afe866a69cbed32a371aaa4c78b\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/execution/OVM_StateManagerFactory.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Interface Imports */\\nimport { iOVM_StateManager } from \\\"../../iOVM/execution/iOVM_StateManager.sol\\\";\\nimport { iOVM_StateManagerFactory } from \\\"../../iOVM/execution/iOVM_StateManagerFactory.sol\\\";\\n\\n/* Contract Imports */\\nimport { OVM_StateManager } from \\\"./OVM_StateManager.sol\\\";\\n\\n/**\\n * @title OVM_StateManagerFactory\\n * @dev The State Manager Factory is called by a State Transitioner's init code, to create a new\\n * State Manager for use in the Fraud Verification process.\\n *\\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract OVM_StateManagerFactory is iOVM_StateManagerFactory {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Creates a new OVM_StateManager\\n * @param _owner Owner of the created contract.\\n * @return New OVM_StateManager instance.\\n */\\n function create(\\n address _owner\\n )\\n override\\n public\\n returns (\\n iOVM_StateManager\\n )\\n {\\n return new OVM_StateManager(_owner);\\n }\\n}\\n\",\"keccak256\":\"0xc557f05b8a82eee7b36a389795fe4acc0803bcf5ae33e15e9cba8226e9ab49fc\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/execution/iOVM_StateManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title iOVM_StateManager\\n */\\ninterface iOVM_StateManager {\\n\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n enum ItemState {\\n ITEM_UNTOUCHED,\\n ITEM_LOADED,\\n ITEM_CHANGED,\\n ITEM_COMMITTED\\n }\\n\\n /***************************\\n * Public Functions: Misc *\\n ***************************/\\n\\n function isAuthenticated(address _address) external view returns (bool);\\n\\n /***************************\\n * Public Functions: Setup *\\n ***************************/\\n\\n function owner() external view returns (address _owner);\\n function ovmExecutionManager() external view returns (address _ovmExecutionManager);\\n function setExecutionManager(address _ovmExecutionManager) external;\\n\\n\\n /************************************\\n * Public Functions: Account Access *\\n ************************************/\\n\\n function putAccount(address _address, Lib_OVMCodec.Account memory _account) external;\\n function putEmptyAccount(address _address) external;\\n function getAccount(address _address) external view returns (Lib_OVMCodec.Account memory _account);\\n function hasAccount(address _address) external view returns (bool _exists);\\n function hasEmptyAccount(address _address) external view returns (bool _exists);\\n function setAccountNonce(address _address, uint256 _nonce) external;\\n function getAccountNonce(address _address) external view returns (uint256 _nonce);\\n function getAccountEthAddress(address _address) external view returns (address _ethAddress);\\n function getAccountStorageRoot(address _address) external view returns (bytes32 _storageRoot);\\n function initPendingAccount(address _address) external;\\n function commitPendingAccount(address _address, address _ethAddress, bytes32 _codeHash) external;\\n function testAndSetAccountLoaded(address _address) external returns (bool _wasAccountAlreadyLoaded);\\n function testAndSetAccountChanged(address _address) external returns (bool _wasAccountAlreadyChanged);\\n function commitAccount(address _address) external returns (bool _wasAccountCommitted);\\n function incrementTotalUncommittedAccounts() external;\\n function getTotalUncommittedAccounts() external view returns (uint256 _total);\\n function wasAccountChanged(address _address) external view returns (bool);\\n function wasAccountCommitted(address _address) external view returns (bool);\\n\\n\\n /************************************\\n * Public Functions: Storage Access *\\n ************************************/\\n\\n function putContractStorage(address _contract, bytes32 _key, bytes32 _value) external;\\n function getContractStorage(address _contract, bytes32 _key) external view returns (bytes32 _value);\\n function hasContractStorage(address _contract, bytes32 _key) external view returns (bool _exists);\\n function testAndSetContractStorageLoaded(address _contract, bytes32 _key) external returns (bool _wasContractStorageAlreadyLoaded);\\n function testAndSetContractStorageChanged(address _contract, bytes32 _key) external returns (bool _wasContractStorageAlreadyChanged);\\n function commitContractStorage(address _contract, bytes32 _key) external returns (bool _wasContractStorageCommitted);\\n function incrementTotalUncommittedContractStorage() external;\\n function getTotalUncommittedContractStorage() external view returns (uint256 _total);\\n function wasContractStorageChanged(address _contract, bytes32 _key) external view returns (bool);\\n function wasContractStorageCommitted(address _contract, bytes32 _key) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x7a11dbd1f61593ba34debe07e39eef59967307f7f372ba9855bee0953585d08d\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/execution/iOVM_StateManagerFactory.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Contract Imports */\\nimport { iOVM_StateManager } from \\\"./iOVM_StateManager.sol\\\";\\n\\n/**\\n * @title iOVM_StateManagerFactory\\n */\\ninterface iOVM_StateManagerFactory {\\n\\n /***************************************\\n * Public Functions: Contract Creation *\\n ***************************************/\\n\\n function create(\\n address _owner\\n )\\n external\\n returns (\\n iOVM_StateManager _ovmStateManager\\n );\\n}\\n\",\"keccak256\":\"0x27a90fc43889d0c7d1db50f37907ef7386d9b415d15a1e91a0a068cba59afd36\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/codec/Lib_OVMCodec.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../utils/Lib_Bytes32Utils.sol\\\";\\n\\n/**\\n * @title Lib_OVMCodec\\n */\\nlibrary Lib_OVMCodec {\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum QueueOrigin {\\n SEQUENCER_QUEUE,\\n L1TOL2_QUEUE\\n }\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Account {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n address ethAddress;\\n bool isFresh;\\n }\\n\\n struct EVMAccount {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n }\\n\\n struct ChainBatchHeader {\\n uint256 batchIndex;\\n bytes32 batchRoot;\\n uint256 batchSize;\\n uint256 prevTotalElements;\\n bytes extraData;\\n }\\n\\n struct ChainInclusionProof {\\n uint256 index;\\n bytes32[] siblings;\\n }\\n\\n struct Transaction {\\n uint256 timestamp;\\n uint256 blockNumber;\\n QueueOrigin l1QueueOrigin;\\n address l1TxOrigin;\\n address entrypoint;\\n uint256 gasLimit;\\n bytes data;\\n }\\n\\n struct TransactionChainElement {\\n bool isSequenced;\\n uint256 queueIndex; // QUEUED TX ONLY\\n uint256 timestamp; // SEQUENCER TX ONLY\\n uint256 blockNumber; // SEQUENCER TX ONLY\\n bytes txData; // SEQUENCER TX ONLY\\n }\\n\\n struct QueueElement {\\n bytes32 transactionHash;\\n uint40 timestamp;\\n uint40 blockNumber;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Encodes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Encoded transaction bytes.\\n */\\n function encodeTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return abi.encodePacked(\\n _transaction.timestamp,\\n _transaction.blockNumber,\\n _transaction.l1QueueOrigin,\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n );\\n }\\n\\n /**\\n * Hashes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Hashed transaction\\n */\\n function hashTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(encodeTransaction(_transaction));\\n }\\n\\n /**\\n * Converts an OVM account to an EVM account.\\n * @param _in OVM account to convert.\\n * @return Converted EVM account.\\n */\\n function toEVMAccount(\\n Account memory _in\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n return EVMAccount({\\n nonce: _in.nonce,\\n balance: _in.balance,\\n storageRoot: _in.storageRoot,\\n codeHash: _in.codeHash\\n });\\n }\\n\\n /**\\n * @notice RLP-encodes an account state struct.\\n * @param _account Account state struct.\\n * @return RLP-encoded account state.\\n */\\n function encodeEVMAccount(\\n EVMAccount memory _account\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes[] memory raw = new bytes[](4);\\n\\n // Unfortunately we can't create this array outright because\\n // Lib_RLPWriter.writeList will reject fixed-size arrays. Assigning\\n // index-by-index circumvents this issue.\\n raw[0] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.nonce)\\n )\\n );\\n raw[1] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.balance)\\n )\\n );\\n raw[2] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.storageRoot));\\n raw[3] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.codeHash));\\n\\n return Lib_RLPWriter.writeList(raw);\\n }\\n\\n /**\\n * @notice Decodes an RLP-encoded account state into a useful struct.\\n * @param _encoded RLP-encoded account state.\\n * @return Account state struct.\\n */\\n function decodeEVMAccount(\\n bytes memory _encoded\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\\n\\n return EVMAccount({\\n nonce: Lib_RLPReader.readUint256(accountState[0]),\\n balance: Lib_RLPReader.readUint256(accountState[1]),\\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\\n });\\n }\\n\\n /**\\n * Calculates a hash for a given batch header.\\n * @param _batchHeader Header to hash.\\n * @return Hash of the header.\\n */\\n function hashBatchHeader(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(\\n abi.encode(\\n _batchHeader.batchRoot,\\n _batchHeader.batchSize,\\n _batchHeader.prevTotalElements,\\n _batchHeader.extraData\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0xd85ba2066057a2677926f484b938c7c2ef33ff3853f3b71cda252f4a54f30e05\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPReader.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_RLPReader\\n * @dev Adapted from \\\"RLPReader\\\" by Hamdi Allam (hamdi.allam97@gmail.com).\\n */\\nlibrary Lib_RLPReader {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 constant internal MAX_LIST_LENGTH = 32;\\n\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum RLPItemType {\\n DATA_ITEM,\\n LIST_ITEM\\n }\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct RLPItem {\\n uint256 length;\\n uint256 ptr;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts bytes to a reference to memory position and length.\\n * @param _in Input bytes to convert.\\n * @return Output memory reference.\\n */\\n function toRLPItem(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem memory\\n )\\n {\\n uint256 ptr;\\n assembly {\\n ptr := add(_in, 32)\\n }\\n\\n return RLPItem({\\n length: _in.length,\\n ptr: ptr\\n });\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n (\\n uint256 listOffset,\\n ,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.LIST_ITEM,\\n \\\"Invalid RLP list value.\\\"\\n );\\n\\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\\n // writing to the length. Since we can't know the number of RLP items without looping over\\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\\n // simply set a reasonable maximum list length and decrease the size before we finish.\\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\\n\\n uint256 itemCount = 0;\\n uint256 offset = listOffset;\\n while (offset < _in.length) {\\n require(\\n itemCount < MAX_LIST_LENGTH,\\n \\\"Provided RLP list exceeds max list length.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n ) = _decodeLength(RLPItem({\\n length: _in.length - offset,\\n ptr: _in.ptr + offset\\n }));\\n\\n out[itemCount] = RLPItem({\\n length: itemLength + itemOffset,\\n ptr: _in.ptr + offset\\n });\\n\\n itemCount += 1;\\n offset += itemOffset + itemLength;\\n }\\n\\n // Decrease the array size to match the actual item count.\\n assembly {\\n mstore(out, itemCount)\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n return readList(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes value.\\\"\\n );\\n\\n return _copy(_in.ptr, itemOffset, itemLength);\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return readBytes(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return string(readBytes(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return readString(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n require(\\n _in.length <= 33,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr + itemOffset;\\n bytes32 out;\\n assembly {\\n out := mload(ptr)\\n\\n // Shift the bytes over to match the item size.\\n if lt(itemLength, 32) {\\n out := div(out, exp(256, sub(32, itemLength)))\\n }\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return readBytes32(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return uint256(readBytes32(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return readUint256(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n require(\\n _in.length == 1,\\n \\\"Invalid RLP boolean value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 out;\\n assembly {\\n out := byte(0, mload(ptr))\\n }\\n\\n require(\\n out == 0 || out == 1,\\n \\\"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\\\"\\n );\\n\\n return out != 0;\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return readBool(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n if (_in.length == 1) {\\n return address(0);\\n }\\n\\n require(\\n _in.length == 21,\\n \\\"Invalid RLP address value.\\\"\\n );\\n\\n return address(readUint256(_in));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return readAddress(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads the raw bytes of an RLP item.\\n * @param _in RLP item to read.\\n * @return Raw RLP bytes.\\n */\\n function readRawBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in);\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Decodes the length of an RLP item.\\n * @param _in RLP item to decode.\\n * @return Offset of the encoded data.\\n * @return Length of the encoded data.\\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\\n */\\n function _decodeLength(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n uint256,\\n uint256,\\n RLPItemType\\n )\\n {\\n require(\\n _in.length > 0,\\n \\\"RLP item cannot be null.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 prefix;\\n assembly {\\n prefix := byte(0, mload(ptr))\\n }\\n\\n if (prefix <= 0x7f) {\\n // Single byte.\\n\\n return (0, 1, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xb7) {\\n // Short string.\\n\\n uint256 strLen = prefix - 0x80;\\n\\n require(\\n _in.length > strLen,\\n \\\"Invalid RLP short string.\\\"\\n );\\n\\n return (1, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xbf) {\\n // Long string.\\n uint256 lenOfStrLen = prefix - 0xb7;\\n\\n require(\\n _in.length > lenOfStrLen,\\n \\\"Invalid RLP long string length.\\\"\\n );\\n\\n uint256 strLen;\\n assembly {\\n // Pick out the string length.\\n strLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfStrLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfStrLen + strLen,\\n \\\"Invalid RLP long string.\\\"\\n );\\n\\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xf7) {\\n // Short list.\\n uint256 listLen = prefix - 0xc0;\\n\\n require(\\n _in.length > listLen,\\n \\\"Invalid RLP short list.\\\"\\n );\\n\\n return (1, listLen, RLPItemType.LIST_ITEM);\\n } else {\\n // Long list.\\n uint256 lenOfListLen = prefix - 0xf7;\\n\\n require(\\n _in.length > lenOfListLen,\\n \\\"Invalid RLP long list length.\\\"\\n );\\n\\n uint256 listLen;\\n assembly {\\n // Pick out the list length.\\n listLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfListLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfListLen + listLen,\\n \\\"Invalid RLP long list.\\\"\\n );\\n\\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\\n }\\n }\\n\\n /**\\n * Copies the bytes from a memory location.\\n * @param _src Pointer to the location to read from.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Copied bytes.\\n */\\n function _copy(\\n uint256 _src,\\n uint256 _offset,\\n uint256 _length\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out = new bytes(_length);\\n if (out.length == 0) {\\n return out;\\n }\\n\\n uint256 src = _src + _offset;\\n uint256 dest;\\n assembly {\\n dest := add(out, 32)\\n }\\n\\n // Copy over as many complete words as we can.\\n for (uint256 i = 0; i < _length / 32; i++) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n\\n src += 32;\\n dest += 32;\\n }\\n\\n // Pick out the remaining bytes.\\n uint256 mask = 256 ** (32 - (_length % 32)) - 1;\\n assembly {\\n mstore(\\n dest,\\n or(\\n and(mload(src), not(mask)),\\n and(mload(dest), mask)\\n )\\n )\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Copies an RLP item into bytes.\\n * @param _in RLP item to copy.\\n * @return Copied bytes.\\n */\\n function _copy(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in.ptr, 0, _in.length);\\n }\\n}\\n\",\"keccak256\":\"0x829174c61216dce35fdb888383b6022e0365eb7fbdc71ad79d98b108091969fe\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPWriter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/**\\n * @title Lib_RLPWriter\\n * @author Bakaoh (with modifications)\\n */\\nlibrary Lib_RLPWriter {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * RLP encodes a byte string.\\n * @param _in The byte string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded;\\n\\n if (_in.length == 1 && uint8(_in[0]) < 128) {\\n encoded = _in;\\n } else {\\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * RLP encodes a list of RLP encoded byte byte strings.\\n * @param _in The list of RLP encoded byte strings.\\n * @return The RLP encoded list of items in bytes.\\n */\\n function writeList(\\n bytes[] memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory list = _flatten(_in);\\n return abi.encodePacked(_writeLength(list.length, 192), list);\\n }\\n\\n /**\\n * RLP encodes a string.\\n * @param _in The string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeString(\\n string memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(bytes(_in));\\n }\\n\\n /**\\n * RLP encodes an address.\\n * @param _in The address to encode.\\n * @return The RLP encoded address in bytes.\\n */\\n function writeAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a bytes32 value.\\n * @param _in The bytes32 to encode.\\n * @return _out The RLP encoded bytes32 in bytes.\\n */\\n function writeBytes32(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a uint.\\n * @param _in The uint256 to encode.\\n * @return The RLP encoded uint256 in bytes.\\n */\\n function writeUint(\\n uint256 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(_toBinary(_in));\\n }\\n\\n /**\\n * RLP encodes a bool.\\n * @param _in The bool to encode.\\n * @return The RLP encoded bool in bytes.\\n */\\n function writeBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded = new bytes(1);\\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\\n return encoded;\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\\n * @param _len The length of the string or the payload.\\n * @param _offset 128 if item is string, 192 if item is list.\\n * @return RLP encoded bytes.\\n */\\n function _writeLength(\\n uint256 _len,\\n uint256 _offset\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded;\\n\\n if (_len < 56) {\\n encoded = new bytes(1);\\n encoded[0] = byte(uint8(_len) + uint8(_offset));\\n } else {\\n uint256 lenLen;\\n uint256 i = 1;\\n while (_len / i != 0) {\\n lenLen++;\\n i *= 256;\\n }\\n\\n encoded = new bytes(lenLen + 1);\\n encoded[0] = byte(uint8(lenLen) + uint8(_offset) + 55);\\n for(i = 1; i <= lenLen; i++) {\\n encoded[i] = byte(uint8((_len / (256**(lenLen-i))) % 256));\\n }\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * Encode integer in big endian binary form with no leading zeroes.\\n * @notice TODO: This should be optimized with assembly to save gas costs.\\n * @param _x The integer to encode.\\n * @return RLP encoded bytes.\\n */\\n function _toBinary(\\n uint256 _x\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory b = abi.encodePacked(_x);\\n\\n uint256 i = 0;\\n for (; i < 32; i++) {\\n if (b[i] != 0) {\\n break;\\n }\\n }\\n\\n bytes memory res = new bytes(32 - i);\\n for (uint256 j = 0; j < res.length; j++) {\\n res[j] = b[i++];\\n }\\n\\n return res;\\n }\\n\\n /**\\n * Copies a piece of memory to another location.\\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\\n * @param _dest Destination location.\\n * @param _src Source location.\\n * @param _len Length of memory to copy.\\n */\\n function _memcpy(\\n uint256 _dest,\\n uint256 _src,\\n uint256 _len\\n )\\n private\\n pure\\n {\\n uint256 dest = _dest;\\n uint256 src = _src;\\n uint256 len = _len;\\n\\n for(; len >= 32; len -= 32) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n dest += 32;\\n src += 32;\\n }\\n\\n uint256 mask = 256 ** (32 - len) - 1;\\n assembly {\\n let srcpart := and(mload(src), not(mask))\\n let destpart := and(mload(dest), mask)\\n mstore(dest, or(destpart, srcpart))\\n }\\n }\\n\\n /**\\n * Flattens a list of byte strings into one byte string.\\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\\n * @param _list List of byte strings to flatten.\\n * @return The flattened byte string.\\n */\\n function _flatten(\\n bytes[] memory _list\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n if (_list.length == 0) {\\n return new bytes(0);\\n }\\n\\n uint256 len;\\n uint256 i = 0;\\n for (; i < _list.length; i++) {\\n len += _list[i].length;\\n }\\n\\n bytes memory flattened = new bytes(len);\\n uint256 flattenedPtr;\\n assembly { flattenedPtr := add(flattened, 0x20) }\\n\\n for(i = 0; i < _list.length; i++) {\\n bytes memory item = _list[i];\\n\\n uint256 listPtr;\\n assembly { listPtr := add(item, 0x20)}\\n\\n _memcpy(flattenedPtr, listPtr, item.length);\\n flattenedPtr += _list[i].length;\\n }\\n\\n return flattened;\\n }\\n}\\n\",\"keccak256\":\"0xb60ee4b03ad372c3deff21d454ab714dd0c18ee3e6f9d45532e209fc59d5a54d\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_Bytes32Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_Byte32Utils\\n */\\nlibrary Lib_Bytes32Utils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \\\"true.\\\"\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as a boolean.\\n */\\n function toBool(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return _in != 0;\\n }\\n\\n /**\\n * Converts a boolean to a bytes32 value.\\n * @param _in Input boolean value.\\n * @return Boolean as a bytes32.\\n */\\n function fromBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in ? 1 : 0));\\n }\\n\\n /**\\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as an address.\\n */\\n function toAddress(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return address(uint160(uint256(_in)));\\n }\\n\\n /**\\n * Converts an address to a bytes32.\\n * @param _in Input address value.\\n * @return Address as a bytes32.\\n */\\n function fromAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in));\\n }\\n\\n /**\\n * Removes the leading zeros from a bytes32 value and returns a new (smaller) bytes value.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 without any leading zeros.\\n */\\n function removeLeadingZeros(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out;\\n\\n assembly {\\n // Figure out how many leading zero bytes to remove.\\n let shift := 0\\n for { let i := 0 } and(lt(i, 32), eq(byte(i, _in), 0)) { i := add(i, 1) } {\\n shift := add(shift, 1)\\n }\\n\\n // Reserve some space for our output and fix the free memory pointer.\\n out := mload(0x40)\\n mstore(0x40, add(out, 0x40))\\n\\n // Shift the value and store it into the output bytes.\\n mstore(add(out, 0x20), shl(mul(shift, 8), _in))\\n\\n // Store the new size (with leading zero bytes removed) in the output byte size.\\n mstore(out, sub(32, shift))\\n }\\n\\n return out;\\n }\\n}\\n\",\"keccak256\":\"0xfa2def593e3fc56a31852c3744aefdaa93cec74e721bfcfeb1e5d166c7c60b64\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_BytesUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_BytesUtils\\n */\\nlibrary Lib_BytesUtils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_start + _length >= _start, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n if (_bytes.length - _start == 0) {\\n return bytes('');\\n }\\n\\n return slice(_bytes, _start, _bytes.length - _start);\\n }\\n\\n function toBytes32PadLeft(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n bytes32 ret;\\n uint256 len = _bytes.length <= 32 ? _bytes.length : 32;\\n assembly {\\n ret := shr(mul(sub(32, len), 8), mload(add(_bytes, 32)))\\n }\\n return ret;\\n }\\n\\n function toBytes32(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n if (_bytes.length < 32) {\\n bytes32 ret;\\n assembly {\\n ret := mload(add(_bytes, 32))\\n }\\n return ret;\\n }\\n\\n return abi.decode(_bytes,(bytes32)); // will truncate if input length > 32 bytes\\n }\\n\\n function toUint256(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return uint256(toBytes32(_bytes));\\n }\\n\\n function toUint24(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n uint24\\n )\\n {\\n require(_start + 3 >= _start, \\\"toUint24_overflow\\\");\\n require(_bytes.length >= _start + 3 , \\\"toUint24_outOfBounds\\\");\\n uint24 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x3), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toUint8(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n uint8\\n )\\n {\\n require(_start + 1 >= _start, \\\"toUint8_overflow\\\");\\n require(_bytes.length >= _start + 1 , \\\"toUint8_outOfBounds\\\");\\n uint8 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x1), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toAddress(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n require(_start + 20 >= _start, \\\"toAddress_overflow\\\");\\n require(_bytes.length >= _start + 20, \\\"toAddress_outOfBounds\\\");\\n address tempAddress;\\n\\n assembly {\\n tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000)\\n }\\n\\n return tempAddress;\\n }\\n\\n function toNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory nibbles = new bytes(_bytes.length * 2);\\n\\n for (uint256 i = 0; i < _bytes.length; i++) {\\n nibbles[i * 2] = _bytes[i] >> 4;\\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\\n }\\n\\n return nibbles;\\n }\\n\\n function fromNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory ret = new bytes(_bytes.length / 2);\\n\\n for (uint256 i = 0; i < ret.length; i++) {\\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\\n }\\n\\n return ret;\\n }\\n\\n function equal(\\n bytes memory _bytes,\\n bytes memory _other\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return keccak256(_bytes) == keccak256(_other);\\n }\\n}\\n\",\"keccak256\":\"0xa5195afe32fb2cf104d156e8f4bd39df1ec79bf6ba232097b9e8e0ee14fbc298\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x608060405234801561001057600080fd5b50611437806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c80639ed9331814610030575b600080fd5b6100566004803603602081101561004657600080fd5b50356001600160a01b0316610072565b604080516001600160a01b039092168252519081900360200190f35b600081604051610081906100b5565b6001600160a01b03909116815260405190819003602001906000f0801580156100ae573d6000803e3d6000fd5b5092915050565b61133f806100c38339019056fe608060405234801561001057600080fd5b5060405161133f38038061133f83398101604081905261002f91610054565b600080546001600160a01b0319166001600160a01b0392909216919091179055610082565b600060208284031215610065578081fd5b81516001600160a01b038116811461007b578182fd5b9392505050565b6112ae806100916000396000f3fe608060405234801561001057600080fd5b50600436106101f05760003560e01c80638f3b96471161010f578063d126199f116100a2578063e90abb8611610071578063e90abb86146103f9578063fb37b31c1461040c578063fbcbc0f11461041f578063fcf149a21461043f576101f0565b8063d126199f146103b8578063d15d4150146103cb578063d54414c8146103de578063d7bd4a2a146103f1576101f0565b8063c3fd9b25116100de578063c3fd9b2514610377578063c7650bf21461037f578063c8e40fbf14610392578063d0a215f2146103a5576101f0565b80638f3b96471461033657806399056ba914610349578063af37b86414610351578063af3dc01114610364576101f0565b806333f94305116101875780636f3c75af116101565780636f3c75af146102f55780637c8ee703146103085780637e86faa81461031b5780638da5cb5b1461032e576101f0565b806333f94305146102b25780635c17d629146102ba5780636b18e4e8146102cd5780636c87ad20146102e0576101f0565b8063167020d2116101c3578063167020d2146102595780631aaf392f1461026c5780631b208a5a1461028c57806326dc5b121461029f576101f0565b806307a12945146101f55780630ad226791461021e57806311b1f790146102315780631381ba4d14610244575b600080fd5b61020861020336600461101d565b610452565b60405161021591906111c4565b60405180910390f35b61020861022c366004611072565b6104ba565b61020861023f36600461101d565b610517565b61025761025236600461101d565b610573565b005b61020861026736600461101d565b6105d4565b61027f61027a366004611072565b610679565b60405161021591906111cf565b61020861029a36600461101d565b610727565b61027f6102ad36600461101d565b61075e565b61025761077d565b6102576102c836600461109b565b6107c7565b6102576102db36600461101d565b61089a565b6102e8610944565b60405161021591906111b0565b610208610303366004611072565b610953565b6102e861031636600461101d565b61098c565b610208610329366004611072565b6109ad565b6102e86109c3565b6102576103443660046110cd565b6109d2565b61027f610a88565b61020861035f366004611072565b610a8e565b610208610372366004611072565b610ae2565b610257610b2f565b61020861038d366004611072565b610b79565b6102086103a036600461101d565b610c20565b6102576103b3366004611037565b610c40565b61027f6103c636600461101d565b610cb9565b6102086103d936600461101d565b610cd4565b6102086103ec36600461101d565b610d01565b61027f610d16565b610257610407366004611072565b610d1c565b61020861041a36600461101d565b610d77565b61043261042d36600461101d565b610dc3565b604051610215919061122e565b61025761044d36600461101d565b610e37565b6001600160a01b0381166000908152600260205260408120600301547fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4701480156104b257506001600160a01b038216600090815260026020526040902054155b90505b919050565b6001600160a01b038216600090815260046020908152604080832084845290915281205460ff168061050e57506001600160a01b038316600090815260026020526040902060040154600160a01b900460ff165b90505b92915050565b600080546001600160a01b031633148061053b57506001546001600160a01b031633145b6105605760405162461bcd60e51b8152600401610557906111d8565b60405180910390fd5b6104b261056c83610ef8565b6002610f28565b6000546001600160a01b031633148061059657506001546001600160a01b031633145b6105b25760405162461bcd60e51b8152600401610557906111d8565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b600080546001600160a01b03163314806105f857506001546001600160a01b031633145b6106145760405162461bcd60e51b8152600401610557906111d8565b600061061f83610ef8565b9050600260008281526005602052604090205460ff16600381111561064057fe5b1461064f5760009150506104b5565b6000908152600560205260409020805460ff19166003179055505060068054600019019055600190565b6001600160a01b038216600090815260046020908152604080832084845290915281205460ff161580156106cf57506001600160a01b038316600090815260026020526040902060040154600160a01b900460ff165b156106dc57506000610511565b506001600160a01b0391909116600090815260036020908152604080832093835292905220547ffeedfacecafebeeffeedfacecafebeeffeedfacecafebeeffeedfacecafebeef1890565b60008061073383610ef8565b905060025b60008281526005602052604090205460ff16600381111561075557fe5b10159392505050565b6001600160a01b03166000908152600260208190526040909120015490565b6000546001600160a01b03163314806107a057506001546001600160a01b031633145b6107bc5760405162461bcd60e51b8152600401610557906111d8565b600680546001019055565b6000546001600160a01b03163314806107ea57506001546001600160a01b031633145b6108065760405162461bcd60e51b8152600401610557906111d8565b6001600160a01b038316600081815260036020908152604080832086845282528083207ffeedfacecafebeeffeedfacecafebeeffeedfacecafebeeffeedfacecafebeef86189055928252600481528282208583529052205460ff16610895576001600160a01b03831660009081526004602090815260408083208584529091529020805460ff191660011790555b505050565b6000546001600160a01b03163314806108bd57506001546001600160a01b031633145b6108d95760405162461bcd60e51b8152600401610557906111d8565b6001600160a01b031660009081526002602081905260409091207f56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421918101919091557fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470600390910155565b6001546001600160a01b031681565b6000806109608484610f8e565b905060025b60008281526005602052604090205460ff16600381111561098257fe5b1015949350505050565b6001600160a01b039081166000908152600260205260409020600401541690565b6000806109ba8484610f8e565b90506003610965565b6000546001600160a01b031681565b6000546001600160a01b03163314806109f557506001546001600160a01b031633145b610a115760405162461bcd60e51b8152600401610557906111d8565b6001600160a01b039182166000908152600260208181526040928390208451815590840151600182015591830151908201556060820151600382015560808201516004909101805460a0909301516001600160a01b0319909316919093161760ff60a01b1916600160a01b91151591909102179055565b60075490565b600080546001600160a01b0316331480610ab257506001546001600160a01b031633145b610ace5760405162461bcd60e51b8152600401610557906111d8565b61050e610adb8484610f8e565b6001610f28565b600080546001600160a01b0316331480610b0657506001546001600160a01b031633145b610b225760405162461bcd60e51b8152600401610557906111d8565b61050e61056c8484610f8e565b6000546001600160a01b0316331480610b5257506001546001600160a01b031633145b610b6e5760405162461bcd60e51b8152600401610557906111d8565b600780546001019055565b600080546001600160a01b0316331480610b9d57506001546001600160a01b031633145b610bb95760405162461bcd60e51b8152600401610557906111d8565b6000610bc58484610f8e565b9050600260008281526005602052604090205460ff166003811115610be657fe5b14610bf5576000915050610511565b6000908152600560205260409020805460ff1916600317905550506007805460001901905550600190565b6001600160a01b0316600090815260026020526040902060030154151590565b6000546001600160a01b0316331480610c6357506001546001600160a01b031633145b610c7f5760405162461bcd60e51b8152600401610557906111d8565b6001600160a01b0392831660009081526002602052604090206004810180546001600160a01b031916939094169290921790925560030155565b6001600160a01b031660009081526002602052604090205490565b600080546001600160a01b03838116911614806104b25750506001546001600160a01b0390811691161490565b600080610d0d83610ef8565b90506003610738565b60065490565b6000546001600160a01b0316331480610d3f57506001546001600160a01b031633145b610d5b5760405162461bcd60e51b8152600401610557906111d8565b6001600160a01b03909116600090815260026020526040902055565b600080546001600160a01b0316331480610d9b57506001546001600160a01b031633145b610db75760405162461bcd60e51b8152600401610557906111d8565b6104b2610adb83610ef8565b610dcb610fc1565b506001600160a01b03908116600090815260026020818152604092839020835160c08101855281548152600182015492810192909252918201549281019290925260038101546060830152600401549182166080820152600160a01b90910460ff16151560a082015290565b6000546001600160a01b0316331480610e5a57506001546001600160a01b031633145b610e765760405162461bcd60e51b8152600401610557906111d8565b6001600160a01b03166000908152600260208190526040909120600181557f56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421918101919091557fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4706003820155600401805460ff60a01b1916600160a01b179055565b600081604051602001610f0b9190611171565b604051602081830303815290604052805190602001209050919050565b600080826003811115610f3757fe5b60008581526005602052604090205460ff166003811115610f5457fe5b101590508061050e576000848152600560205260409020805484919060ff19166001836003811115610f8257fe5b02179055509392505050565b60008282604051602001610fa392919061118e565b60405160208183030381529060405280519060200120905092915050565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081019190915290565b80356001600160a01b03811681146104b557600080fd5b803580151581146104b557600080fd5b60006020828403121561102e578081fd5b61050e82610ff6565b60008060006060848603121561104b578182fd5b61105484610ff6565b925061106260208501610ff6565b9150604084013590509250925092565b60008060408385031215611084578182fd5b61108d83610ff6565b946020939093013593505050565b6000806000606084860312156110af578283fd5b6110b884610ff6565b95602085013595506040909401359392505050565b60008082840360e08112156110e0578283fd5b6110e984610ff6565b925060c0601f19820112156110fc578182fd5b5060405160c0810181811067ffffffffffffffff8211171561111a57fe5b80604052506020840135815260408401356020820152606084013560408201526080840135606082015261115060a08501610ff6565b608082015261116160c0850161100d565b60a0820152809150509250929050565b60609190911b6bffffffffffffffffffffffff1916815260140190565b60609290921b6bffffffffffffffffffffffff19168252601482015260340190565b6001600160a01b0391909116815260200190565b901515815260200190565b90815260200190565b60208082526036908201527f46756e6374696f6e2063616e206f6e6c792062652063616c6c65642062792061604082015275757468656e746963617465642061646472657373657360501b606082015260800190565b815181526020808301519082015260408083015190820152606080830151908201526080808301516001600160a01b03169082015260a09182015115159181019190915260c0019056fea26469706673582212205bac84845119d44a384d804ab40cf5b8661877b394d879fd05cdd049485222d964736f6c63430007060033a264697066735822122049d6bdb64f1e5e1bffb7aba87ce3a0db62412188b801b3e899b8b558b75755a364736f6c63430007060033", + "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061002b5760003560e01c80639ed9331814610030575b600080fd5b6100566004803603602081101561004657600080fd5b50356001600160a01b0316610072565b604080516001600160a01b039092168252519081900360200190f35b600081604051610081906100b5565b6001600160a01b03909116815260405190819003602001906000f0801580156100ae573d6000803e3d6000fd5b5092915050565b61133f806100c38339019056fe608060405234801561001057600080fd5b5060405161133f38038061133f83398101604081905261002f91610054565b600080546001600160a01b0319166001600160a01b0392909216919091179055610082565b600060208284031215610065578081fd5b81516001600160a01b038116811461007b578182fd5b9392505050565b6112ae806100916000396000f3fe608060405234801561001057600080fd5b50600436106101f05760003560e01c80638f3b96471161010f578063d126199f116100a2578063e90abb8611610071578063e90abb86146103f9578063fb37b31c1461040c578063fbcbc0f11461041f578063fcf149a21461043f576101f0565b8063d126199f146103b8578063d15d4150146103cb578063d54414c8146103de578063d7bd4a2a146103f1576101f0565b8063c3fd9b25116100de578063c3fd9b2514610377578063c7650bf21461037f578063c8e40fbf14610392578063d0a215f2146103a5576101f0565b80638f3b96471461033657806399056ba914610349578063af37b86414610351578063af3dc01114610364576101f0565b806333f94305116101875780636f3c75af116101565780636f3c75af146102f55780637c8ee703146103085780637e86faa81461031b5780638da5cb5b1461032e576101f0565b806333f94305146102b25780635c17d629146102ba5780636b18e4e8146102cd5780636c87ad20146102e0576101f0565b8063167020d2116101c3578063167020d2146102595780631aaf392f1461026c5780631b208a5a1461028c57806326dc5b121461029f576101f0565b806307a12945146101f55780630ad226791461021e57806311b1f790146102315780631381ba4d14610244575b600080fd5b61020861020336600461101d565b610452565b60405161021591906111c4565b60405180910390f35b61020861022c366004611072565b6104ba565b61020861023f36600461101d565b610517565b61025761025236600461101d565b610573565b005b61020861026736600461101d565b6105d4565b61027f61027a366004611072565b610679565b60405161021591906111cf565b61020861029a36600461101d565b610727565b61027f6102ad36600461101d565b61075e565b61025761077d565b6102576102c836600461109b565b6107c7565b6102576102db36600461101d565b61089a565b6102e8610944565b60405161021591906111b0565b610208610303366004611072565b610953565b6102e861031636600461101d565b61098c565b610208610329366004611072565b6109ad565b6102e86109c3565b6102576103443660046110cd565b6109d2565b61027f610a88565b61020861035f366004611072565b610a8e565b610208610372366004611072565b610ae2565b610257610b2f565b61020861038d366004611072565b610b79565b6102086103a036600461101d565b610c20565b6102576103b3366004611037565b610c40565b61027f6103c636600461101d565b610cb9565b6102086103d936600461101d565b610cd4565b6102086103ec36600461101d565b610d01565b61027f610d16565b610257610407366004611072565b610d1c565b61020861041a36600461101d565b610d77565b61043261042d36600461101d565b610dc3565b604051610215919061122e565b61025761044d36600461101d565b610e37565b6001600160a01b0381166000908152600260205260408120600301547fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4701480156104b257506001600160a01b038216600090815260026020526040902054155b90505b919050565b6001600160a01b038216600090815260046020908152604080832084845290915281205460ff168061050e57506001600160a01b038316600090815260026020526040902060040154600160a01b900460ff165b90505b92915050565b600080546001600160a01b031633148061053b57506001546001600160a01b031633145b6105605760405162461bcd60e51b8152600401610557906111d8565b60405180910390fd5b6104b261056c83610ef8565b6002610f28565b6000546001600160a01b031633148061059657506001546001600160a01b031633145b6105b25760405162461bcd60e51b8152600401610557906111d8565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b600080546001600160a01b03163314806105f857506001546001600160a01b031633145b6106145760405162461bcd60e51b8152600401610557906111d8565b600061061f83610ef8565b9050600260008281526005602052604090205460ff16600381111561064057fe5b1461064f5760009150506104b5565b6000908152600560205260409020805460ff19166003179055505060068054600019019055600190565b6001600160a01b038216600090815260046020908152604080832084845290915281205460ff161580156106cf57506001600160a01b038316600090815260026020526040902060040154600160a01b900460ff165b156106dc57506000610511565b506001600160a01b0391909116600090815260036020908152604080832093835292905220547ffeedfacecafebeeffeedfacecafebeeffeedfacecafebeeffeedfacecafebeef1890565b60008061073383610ef8565b905060025b60008281526005602052604090205460ff16600381111561075557fe5b10159392505050565b6001600160a01b03166000908152600260208190526040909120015490565b6000546001600160a01b03163314806107a057506001546001600160a01b031633145b6107bc5760405162461bcd60e51b8152600401610557906111d8565b600680546001019055565b6000546001600160a01b03163314806107ea57506001546001600160a01b031633145b6108065760405162461bcd60e51b8152600401610557906111d8565b6001600160a01b038316600081815260036020908152604080832086845282528083207ffeedfacecafebeeffeedfacecafebeeffeedfacecafebeeffeedfacecafebeef86189055928252600481528282208583529052205460ff16610895576001600160a01b03831660009081526004602090815260408083208584529091529020805460ff191660011790555b505050565b6000546001600160a01b03163314806108bd57506001546001600160a01b031633145b6108d95760405162461bcd60e51b8152600401610557906111d8565b6001600160a01b031660009081526002602081905260409091207f56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421918101919091557fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470600390910155565b6001546001600160a01b031681565b6000806109608484610f8e565b905060025b60008281526005602052604090205460ff16600381111561098257fe5b1015949350505050565b6001600160a01b039081166000908152600260205260409020600401541690565b6000806109ba8484610f8e565b90506003610965565b6000546001600160a01b031681565b6000546001600160a01b03163314806109f557506001546001600160a01b031633145b610a115760405162461bcd60e51b8152600401610557906111d8565b6001600160a01b039182166000908152600260208181526040928390208451815590840151600182015591830151908201556060820151600382015560808201516004909101805460a0909301516001600160a01b0319909316919093161760ff60a01b1916600160a01b91151591909102179055565b60075490565b600080546001600160a01b0316331480610ab257506001546001600160a01b031633145b610ace5760405162461bcd60e51b8152600401610557906111d8565b61050e610adb8484610f8e565b6001610f28565b600080546001600160a01b0316331480610b0657506001546001600160a01b031633145b610b225760405162461bcd60e51b8152600401610557906111d8565b61050e61056c8484610f8e565b6000546001600160a01b0316331480610b5257506001546001600160a01b031633145b610b6e5760405162461bcd60e51b8152600401610557906111d8565b600780546001019055565b600080546001600160a01b0316331480610b9d57506001546001600160a01b031633145b610bb95760405162461bcd60e51b8152600401610557906111d8565b6000610bc58484610f8e565b9050600260008281526005602052604090205460ff166003811115610be657fe5b14610bf5576000915050610511565b6000908152600560205260409020805460ff1916600317905550506007805460001901905550600190565b6001600160a01b0316600090815260026020526040902060030154151590565b6000546001600160a01b0316331480610c6357506001546001600160a01b031633145b610c7f5760405162461bcd60e51b8152600401610557906111d8565b6001600160a01b0392831660009081526002602052604090206004810180546001600160a01b031916939094169290921790925560030155565b6001600160a01b031660009081526002602052604090205490565b600080546001600160a01b03838116911614806104b25750506001546001600160a01b0390811691161490565b600080610d0d83610ef8565b90506003610738565b60065490565b6000546001600160a01b0316331480610d3f57506001546001600160a01b031633145b610d5b5760405162461bcd60e51b8152600401610557906111d8565b6001600160a01b03909116600090815260026020526040902055565b600080546001600160a01b0316331480610d9b57506001546001600160a01b031633145b610db75760405162461bcd60e51b8152600401610557906111d8565b6104b2610adb83610ef8565b610dcb610fc1565b506001600160a01b03908116600090815260026020818152604092839020835160c08101855281548152600182015492810192909252918201549281019290925260038101546060830152600401549182166080820152600160a01b90910460ff16151560a082015290565b6000546001600160a01b0316331480610e5a57506001546001600160a01b031633145b610e765760405162461bcd60e51b8152600401610557906111d8565b6001600160a01b03166000908152600260208190526040909120600181557f56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421918101919091557fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4706003820155600401805460ff60a01b1916600160a01b179055565b600081604051602001610f0b9190611171565b604051602081830303815290604052805190602001209050919050565b600080826003811115610f3757fe5b60008581526005602052604090205460ff166003811115610f5457fe5b101590508061050e576000848152600560205260409020805484919060ff19166001836003811115610f8257fe5b02179055509392505050565b60008282604051602001610fa392919061118e565b60405160208183030381529060405280519060200120905092915050565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081019190915290565b80356001600160a01b03811681146104b557600080fd5b803580151581146104b557600080fd5b60006020828403121561102e578081fd5b61050e82610ff6565b60008060006060848603121561104b578182fd5b61105484610ff6565b925061106260208501610ff6565b9150604084013590509250925092565b60008060408385031215611084578182fd5b61108d83610ff6565b946020939093013593505050565b6000806000606084860312156110af578283fd5b6110b884610ff6565b95602085013595506040909401359392505050565b60008082840360e08112156110e0578283fd5b6110e984610ff6565b925060c0601f19820112156110fc578182fd5b5060405160c0810181811067ffffffffffffffff8211171561111a57fe5b80604052506020840135815260408401356020820152606084013560408201526080840135606082015261115060a08501610ff6565b608082015261116160c0850161100d565b60a0820152809150509250929050565b60609190911b6bffffffffffffffffffffffff1916815260140190565b60609290921b6bffffffffffffffffffffffff19168252601482015260340190565b6001600160a01b0391909116815260200190565b901515815260200190565b90815260200190565b60208082526036908201527f46756e6374696f6e2063616e206f6e6c792062652063616c6c65642062792061604082015275757468656e746963617465642061646472657373657360501b606082015260800190565b815181526020808301519082015260408083015190820152606080830151908201526080808301516001600160a01b03169082015260a09182015115159181019190915260c0019056fea26469706673582212205bac84845119d44a384d804ab40cf5b8661877b394d879fd05cdd049485222d964736f6c63430007060033a264697066735822122049d6bdb64f1e5e1bffb7aba87ce3a0db62412188b801b3e899b8b558b75755a364736f6c63430007060033", + "devdoc": { + "details": "The State Manager Factory is called by a State Transitioner's init code, to create a new State Manager for use in the Fraud Verification process. Compiler used: solc Runtime target: EVM", + "kind": "dev", + "methods": { + "create(address)": { + "params": { + "_owner": "Owner of the created contract." + }, + "returns": { + "_0": "New OVM_StateManager instance." + } + } + }, + "title": "OVM_StateManagerFactory", + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": { + "create(address)": { + "notice": "Creates a new OVM_StateManager" + } + }, + "version": 1 + }, + "storageLayout": { + "storage": [], + "types": null + } +} \ No newline at end of file diff --git a/packages/contracts/deployments/goerli-v3/OVM_StateTransitionerFactory.json b/packages/contracts/deployments/goerli-v3/OVM_StateTransitionerFactory.json new file mode 100644 index 0000000000000..6b841b9de7f11 --- /dev/null +++ b/packages/contracts/deployments/goerli-v3/OVM_StateTransitionerFactory.json @@ -0,0 +1,163 @@ +{ + "address": "0x543021950Af9250443EEdc681755e0bdBd3Fc81d", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_libAddressManager", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_libAddressManager", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_stateTransitionIndex", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "_preStateRoot", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "_transactionHash", + "type": "bytes32" + } + ], + "name": "create", + "outputs": [ + { + "internalType": "contract iOVM_StateTransitioner", + "name": "", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "libAddressManager", + "outputs": [ + { + "internalType": "contract Lib_AddressManager", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "_name", + "type": "string" + } + ], + "name": "resolve", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "transactionHash": "0xa0d4c463ca8c4e28f45f626748821c6ee6ea8c1bfa3177994122a305513d981a", + "receipt": { + "to": null, + "from": "0x4107438C1b1579f258AF9d1AC06194C4a0F55040", + "contractAddress": "0x543021950Af9250443EEdc681755e0bdBd3Fc81d", + "transactionIndex": 2, + "gasUsed": "4129040", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0xa51e77d2c41ef20f84a04f6744fdab9d62baa0e0455d7c0ceec6bfacbe379ed2", + "transactionHash": "0xa0d4c463ca8c4e28f45f626748821c6ee6ea8c1bfa3177994122a305513d981a", + "logs": [], + "blockNumber": 4694120, + "cumulativeGasUsed": "4262813", + "status": 1, + "byzantium": true + }, + "args": [ + "0xE3d08F0D900A2D53cB794cf82d7127764BcC3092" + ], + "solcInputHash": "dde656dd41f49cad9eac9bc7065fd6a7", + "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_stateTransitionIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"_preStateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"_transactionHash\",\"type\":\"bytes32\"}],\"name\":\"create\",\"outputs\":[{\"internalType\":\"contract iOVM_StateTransitioner\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The State Transitioner Factory is used by the Fraud Verifier to create a new State Transitioner during the initialization of a fraud proof. Compiler used: solc Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"create(address,uint256,bytes32,bytes32)\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\",\"_preStateRoot\":\"State root before the transition was executed.\",\"_stateTransitionIndex\":\"Index of the state transition being verified.\",\"_transactionHash\":\"Hash of the executed transaction.\"},\"returns\":{\"_0\":\"New OVM_StateTransitioner instance.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}}},\"title\":\"OVM_StateTransitionerFactory\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"create(address,uint256,bytes32,bytes32)\":{\"notice\":\"Creates a new OVM_StateTransitioner\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/OVM/verification/OVM_StateTransitionerFactory.sol\":\"OVM_StateTransitionerFactory\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor () internal {\\n address msgSender = _msgSender();\\n _owner = msgSender;\\n emit OwnershipTransferred(address(0), msgSender);\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n emit OwnershipTransferred(_owner, address(0));\\n _owner = address(0);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n emit OwnershipTransferred(_owner, newOwner);\\n _owner = newOwner;\\n }\\n}\\n\",\"keccak256\":\"0x15e2d5bd4c28a88548074c54d220e8086f638a71ed07e6b3ba5a70066fcf458d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with GSN meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address payable) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes memory) {\\n this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x8d3cb350f04ff49cfb10aef08d87f19dcbaecc8027b0bed12f3275cd12f38cf0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/verification/Abs_FraudContributor.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\nimport { iOVM_BondManager } from \\\"../../iOVM/verification/iOVM_BondManager.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/// Minimal contract to be inherited by contracts consumed by users that provide\\n/// data for fraud proofs\\nabstract contract Abs_FraudContributor is Lib_AddressResolver {\\n /// Decorate your functions with this modifier to store how much total gas was\\n /// consumed by the sender, to reward users fairly\\n modifier contributesToFraudProof(bytes32 preStateRoot, bytes32 txHash) {\\n uint256 startGas = gasleft();\\n _;\\n uint256 gasSpent = startGas - gasleft();\\n iOVM_BondManager(resolve('OVM_BondManager')).recordGasSpent(preStateRoot, txHash, msg.sender, gasSpent);\\n }\\n}\\n\",\"keccak256\":\"0x6c27d089a297103cb93b30f7649ab68691cc6b948c315f1037e5de1fe9bf5903\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/verification/OVM_StateTransitioner.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// @unsupported: ovm\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\nimport { Lib_EthUtils } from \\\"../../libraries/utils/Lib_EthUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../../libraries/utils/Lib_Bytes32Utils.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../../libraries/utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_SecureMerkleTrie } from \\\"../../libraries/trie/Lib_SecureMerkleTrie.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../../libraries/rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_RLPReader } from \\\"../../libraries/rlp/Lib_RLPReader.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_StateTransitioner } from \\\"../../iOVM/verification/iOVM_StateTransitioner.sol\\\";\\nimport { iOVM_BondManager } from \\\"../../iOVM/verification/iOVM_BondManager.sol\\\";\\nimport { iOVM_ExecutionManager } from \\\"../../iOVM/execution/iOVM_ExecutionManager.sol\\\";\\nimport { iOVM_StateManager } from \\\"../../iOVM/execution/iOVM_StateManager.sol\\\";\\nimport { iOVM_StateManagerFactory } from \\\"../../iOVM/execution/iOVM_StateManagerFactory.sol\\\";\\n\\n/* Contract Imports */\\nimport { Abs_FraudContributor } from \\\"./Abs_FraudContributor.sol\\\";\\n\\n/**\\n * @title OVM_StateTransitioner\\n * @dev The State Transitioner coordinates the execution of a state transition during the evaluation of a\\n * fraud proof. It feeds verified input to the Execution Manager's run(), and controls a State Manager (which is\\n * uniquely created for each fraud proof).\\n * Once a fraud proof has been initialized, this contract is provided with the pre-state root and verifies\\n * that the OVM storage slots committed to the State Mangager are contained in that state\\n * This contract controls the State Manager and Execution Manager, and uses them to calculate the\\n * post-state root by applying the transaction. The Fraud Verifier can then check for fraud by comparing\\n * the calculated post-state root with the proposed post-state root.\\n *\\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract OVM_StateTransitioner is Lib_AddressResolver, Abs_FraudContributor, iOVM_StateTransitioner {\\n\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n enum TransitionPhase {\\n PRE_EXECUTION,\\n POST_EXECUTION,\\n COMPLETE\\n }\\n\\n\\n /*******************************************\\n * Contract Variables: Contract References *\\n *******************************************/\\n\\n iOVM_StateManager public ovmStateManager;\\n\\n\\n /*******************************************\\n * Contract Variables: Internal Accounting *\\n *******************************************/\\n\\n bytes32 internal preStateRoot;\\n bytes32 internal postStateRoot;\\n TransitionPhase public phase;\\n uint256 internal stateTransitionIndex;\\n bytes32 internal transactionHash;\\n\\n\\n /*************\\n * Constants *\\n *************/\\n\\n bytes32 internal constant EMPTY_ACCOUNT_CODE_HASH = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;\\n bytes32 internal constant EMPTY_ACCOUNT_STORAGE_ROOT = 0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n * @param _stateTransitionIndex Index of the state transition being verified.\\n * @param _preStateRoot State root before the transition was executed.\\n * @param _transactionHash Hash of the executed transaction.\\n */\\n constructor(\\n address _libAddressManager,\\n uint256 _stateTransitionIndex,\\n bytes32 _preStateRoot,\\n bytes32 _transactionHash\\n )\\n Lib_AddressResolver(_libAddressManager)\\n {\\n stateTransitionIndex = _stateTransitionIndex;\\n preStateRoot = _preStateRoot;\\n postStateRoot = _preStateRoot;\\n transactionHash = _transactionHash;\\n\\n ovmStateManager = iOVM_StateManagerFactory(resolve(\\\"OVM_StateManagerFactory\\\")).create(address(this));\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n /**\\n * Checks that a function is only run during a specific phase.\\n * @param _phase Phase the function must run within.\\n */\\n modifier onlyDuringPhase(\\n TransitionPhase _phase\\n ) {\\n require(\\n phase == _phase,\\n \\\"Function must be called during the correct phase.\\\"\\n );\\n _;\\n }\\n\\n\\n /**********************************\\n * Public Functions: State Access *\\n **********************************/\\n\\n /**\\n * Retrieves the state root before execution.\\n * @return _preStateRoot State root before execution.\\n */\\n function getPreStateRoot()\\n override\\n public\\n view\\n returns (\\n bytes32 _preStateRoot\\n )\\n {\\n return preStateRoot;\\n }\\n\\n /**\\n * Retrieves the state root after execution.\\n * @return _postStateRoot State root after execution.\\n */\\n function getPostStateRoot()\\n override\\n public\\n view\\n returns (\\n bytes32 _postStateRoot\\n )\\n {\\n return postStateRoot;\\n }\\n\\n /**\\n * Checks whether the transitioner is complete.\\n * @return _complete Whether or not the transition process is finished.\\n */\\n function isComplete()\\n override\\n public\\n view\\n returns (\\n bool _complete\\n )\\n {\\n return phase == TransitionPhase.COMPLETE;\\n }\\n\\n\\n /***********************************\\n * Public Functions: Pre-Execution *\\n ***********************************/\\n\\n /**\\n * Allows a user to prove the initial state of a contract.\\n * @param _ovmContractAddress Address of the contract on the OVM.\\n * @param _ethContractAddress Address of the corresponding contract on L1.\\n * @param _stateTrieWitness Proof of the account state.\\n */\\n function proveContractState(\\n address _ovmContractAddress,\\n address _ethContractAddress,\\n bytes memory _stateTrieWitness\\n )\\n override\\n public\\n onlyDuringPhase(TransitionPhase.PRE_EXECUTION)\\n contributesToFraudProof(preStateRoot, transactionHash)\\n {\\n // Exit quickly to avoid unnecessary work.\\n require(\\n (\\n ovmStateManager.hasAccount(_ovmContractAddress) == false\\n && ovmStateManager.hasEmptyAccount(_ovmContractAddress) == false\\n ),\\n \\\"Account state has already been proven.\\\"\\n );\\n\\n // Function will fail if the proof is not a valid inclusion or exclusion proof.\\n (\\n bool exists,\\n bytes memory encodedAccount\\n ) = Lib_SecureMerkleTrie.get(\\n abi.encodePacked(_ovmContractAddress),\\n _stateTrieWitness,\\n preStateRoot\\n );\\n\\n if (exists == true) {\\n // Account exists, this was an inclusion proof.\\n Lib_OVMCodec.EVMAccount memory account = Lib_OVMCodec.decodeEVMAccount(\\n encodedAccount\\n );\\n\\n address ethContractAddress = _ethContractAddress;\\n if (account.codeHash == EMPTY_ACCOUNT_CODE_HASH) {\\n // Use a known empty contract to prevent an attack in which a user provides a\\n // contract address here and then later deploys code to it.\\n ethContractAddress = 0x0000000000000000000000000000000000000000;\\n } else {\\n // Otherwise, make sure that the code at the provided eth address matches the hash\\n // of the code stored on L2.\\n require(\\n Lib_EthUtils.getCodeHash(ethContractAddress) == account.codeHash,\\n \\\"OVM_StateTransitioner: Provided L1 contract code hash does not match L2 contract code hash.\\\"\\n );\\n }\\n\\n ovmStateManager.putAccount(\\n _ovmContractAddress,\\n Lib_OVMCodec.Account({\\n nonce: account.nonce,\\n balance: account.balance,\\n storageRoot: account.storageRoot,\\n codeHash: account.codeHash,\\n ethAddress: ethContractAddress,\\n isFresh: false\\n })\\n );\\n } else {\\n // Account does not exist, this was an exclusion proof.\\n ovmStateManager.putEmptyAccount(_ovmContractAddress);\\n }\\n }\\n\\n /**\\n * Allows a user to prove the initial state of a contract storage slot.\\n * @param _ovmContractAddress Address of the contract on the OVM.\\n * @param _key Claimed account slot key.\\n * @param _storageTrieWitness Proof of the storage slot.\\n */\\n function proveStorageSlot(\\n address _ovmContractAddress,\\n bytes32 _key,\\n bytes memory _storageTrieWitness\\n )\\n override\\n public\\n onlyDuringPhase(TransitionPhase.PRE_EXECUTION)\\n contributesToFraudProof(preStateRoot, transactionHash)\\n {\\n // Exit quickly to avoid unnecessary work.\\n require(\\n ovmStateManager.hasContractStorage(_ovmContractAddress, _key) == false,\\n \\\"Storage slot has already been proven.\\\"\\n );\\n\\n require(\\n ovmStateManager.hasAccount(_ovmContractAddress) == true,\\n \\\"Contract must be verified before proving a storage slot.\\\"\\n );\\n\\n bytes32 storageRoot = ovmStateManager.getAccountStorageRoot(_ovmContractAddress);\\n bytes32 value;\\n\\n if (storageRoot == EMPTY_ACCOUNT_STORAGE_ROOT) {\\n // Storage trie was empty, so the user is always allowed to insert zero-byte values.\\n value = bytes32(0);\\n } else {\\n // Function will fail if the proof is not a valid inclusion or exclusion proof.\\n (\\n bool exists,\\n bytes memory encodedValue\\n ) = Lib_SecureMerkleTrie.get(\\n abi.encodePacked(_key),\\n _storageTrieWitness,\\n storageRoot\\n );\\n\\n if (exists == true) {\\n // Inclusion proof.\\n // Stored values are RLP encoded, with leading zeros removed.\\n value = Lib_BytesUtils.toBytes32PadLeft(\\n Lib_RLPReader.readBytes(encodedValue)\\n );\\n } else {\\n // Exclusion proof, can only be zero bytes.\\n value = bytes32(0);\\n }\\n }\\n\\n ovmStateManager.putContractStorage(\\n _ovmContractAddress,\\n _key,\\n value\\n );\\n }\\n\\n\\n /*******************************\\n * Public Functions: Execution *\\n *******************************/\\n\\n /**\\n * Executes the state transition.\\n * @param _transaction OVM transaction to execute.\\n */\\n function applyTransaction(\\n Lib_OVMCodec.Transaction memory _transaction\\n )\\n override\\n public\\n onlyDuringPhase(TransitionPhase.PRE_EXECUTION)\\n contributesToFraudProof(preStateRoot, transactionHash)\\n {\\n require(\\n Lib_OVMCodec.hashTransaction(_transaction) == transactionHash,\\n \\\"Invalid transaction provided.\\\"\\n );\\n\\n // We require gas to complete the logic here in run() before/after execution,\\n // But must ensure the full _tx.gasLimit can be given to the ovmCALL (determinism)\\n // This includes 1/64 of the gas getting lost because of EIP-150 (lost twice--first\\n // going into EM, then going into the code contract).\\n require(\\n gasleft() >= 100000 + _transaction.gasLimit * 1032 / 1000, // 1032/1000 = 1.032 = (64/63)^2 rounded up\\n \\\"Not enough gas to execute transaction deterministically.\\\"\\n );\\n\\n iOVM_ExecutionManager ovmExecutionManager = iOVM_ExecutionManager(resolve(\\\"OVM_ExecutionManager\\\"));\\n\\n // We call `setExecutionManager` right before `run` (and not earlier) just in case the\\n // OVM_ExecutionManager address was updated between the time when this contract was created\\n // and when `applyTransaction` was called.\\n ovmStateManager.setExecutionManager(address(ovmExecutionManager));\\n\\n // `run` always succeeds *unless* the user hasn't provided enough gas to `applyTransaction`\\n // or an INVALID_STATE_ACCESS flag was triggered. Either way, we won't get beyond this line\\n // if that's the case.\\n ovmExecutionManager.run(_transaction, address(ovmStateManager));\\n\\n // Prevent the Execution Manager from calling this SM again.\\n ovmStateManager.setExecutionManager(address(0));\\n phase = TransitionPhase.POST_EXECUTION;\\n }\\n\\n\\n /************************************\\n * Public Functions: Post-Execution *\\n ************************************/\\n\\n /**\\n * Allows a user to commit the final state of a contract.\\n * @param _ovmContractAddress Address of the contract on the OVM.\\n * @param _stateTrieWitness Proof of the account state.\\n */\\n function commitContractState(\\n address _ovmContractAddress,\\n bytes memory _stateTrieWitness\\n )\\n override\\n public\\n onlyDuringPhase(TransitionPhase.POST_EXECUTION)\\n contributesToFraudProof(preStateRoot, transactionHash)\\n {\\n require(\\n ovmStateManager.getTotalUncommittedContractStorage() == 0,\\n \\\"All storage must be committed before committing account states.\\\"\\n );\\n\\n require (\\n ovmStateManager.commitAccount(_ovmContractAddress) == true,\\n \\\"Account state wasn't changed or has already been committed.\\\"\\n );\\n\\n Lib_OVMCodec.Account memory account = ovmStateManager.getAccount(_ovmContractAddress);\\n\\n postStateRoot = Lib_SecureMerkleTrie.update(\\n abi.encodePacked(_ovmContractAddress),\\n Lib_OVMCodec.encodeEVMAccount(\\n Lib_OVMCodec.toEVMAccount(account)\\n ),\\n _stateTrieWitness,\\n postStateRoot\\n );\\n\\n // Emit an event to help clients figure out the proof ordering.\\n emit AccountCommitted(\\n _ovmContractAddress\\n );\\n }\\n\\n /**\\n * Allows a user to commit the final state of a contract storage slot.\\n * @param _ovmContractAddress Address of the contract on the OVM.\\n * @param _key Claimed account slot key.\\n * @param _storageTrieWitness Proof of the storage slot.\\n */\\n function commitStorageSlot(\\n address _ovmContractAddress,\\n bytes32 _key,\\n bytes memory _storageTrieWitness\\n )\\n override\\n public\\n onlyDuringPhase(TransitionPhase.POST_EXECUTION)\\n contributesToFraudProof(preStateRoot, transactionHash)\\n {\\n require(\\n ovmStateManager.commitContractStorage(_ovmContractAddress, _key) == true,\\n \\\"Storage slot value wasn't changed or has already been committed.\\\"\\n );\\n\\n Lib_OVMCodec.Account memory account = ovmStateManager.getAccount(_ovmContractAddress);\\n bytes32 value = ovmStateManager.getContractStorage(_ovmContractAddress, _key);\\n\\n account.storageRoot = Lib_SecureMerkleTrie.update(\\n abi.encodePacked(_key),\\n Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(value)\\n ),\\n _storageTrieWitness,\\n account.storageRoot\\n );\\n\\n ovmStateManager.putAccount(_ovmContractAddress, account);\\n\\n // Emit an event to help clients figure out the proof ordering.\\n emit ContractStorageCommitted(\\n _ovmContractAddress,\\n _key\\n );\\n }\\n\\n\\n /**********************************\\n * Public Functions: Finalization *\\n **********************************/\\n\\n /**\\n * Finalizes the transition process.\\n */\\n function completeTransition()\\n override\\n public\\n onlyDuringPhase(TransitionPhase.POST_EXECUTION)\\n {\\n require(\\n ovmStateManager.getTotalUncommittedAccounts() == 0,\\n \\\"All accounts must be committed before completing a transition.\\\"\\n );\\n\\n require(\\n ovmStateManager.getTotalUncommittedContractStorage() == 0,\\n \\\"All storage must be committed before completing a transition.\\\"\\n );\\n\\n phase = TransitionPhase.COMPLETE;\\n }\\n}\\n\",\"keccak256\":\"0xc363807221625338a396c52a4bc3b7439e63972ac87521670c47745641e91fa6\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/verification/OVM_StateTransitionerFactory.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// @unsupported: ovm\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_StateTransitioner } from \\\"../../iOVM/verification/iOVM_StateTransitioner.sol\\\";\\nimport { iOVM_StateTransitionerFactory } from \\\"../../iOVM/verification/iOVM_StateTransitionerFactory.sol\\\";\\nimport { iOVM_FraudVerifier } from \\\"../../iOVM/verification/iOVM_FraudVerifier.sol\\\";\\n\\n/* Contract Imports */\\nimport { OVM_StateTransitioner } from \\\"./OVM_StateTransitioner.sol\\\";\\n\\n/**\\n * @title OVM_StateTransitionerFactory\\n * @dev The State Transitioner Factory is used by the Fraud Verifier to create a new State\\n * Transitioner during the initialization of a fraud proof.\\n *\\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract OVM_StateTransitionerFactory is iOVM_StateTransitionerFactory, Lib_AddressResolver {\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n constructor(\\n address _libAddressManager\\n )\\n Lib_AddressResolver(_libAddressManager)\\n {}\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Creates a new OVM_StateTransitioner\\n * @param _libAddressManager Address of the Address Manager.\\n * @param _stateTransitionIndex Index of the state transition being verified.\\n * @param _preStateRoot State root before the transition was executed.\\n * @param _transactionHash Hash of the executed transaction.\\n * @return New OVM_StateTransitioner instance.\\n */\\n function create(\\n address _libAddressManager,\\n uint256 _stateTransitionIndex,\\n bytes32 _preStateRoot,\\n bytes32 _transactionHash\\n )\\n override\\n public\\n returns (\\n iOVM_StateTransitioner\\n )\\n {\\n require(\\n msg.sender == resolve(\\\"OVM_FraudVerifier\\\"),\\n \\\"Create can only be done by the OVM_FraudVerifier.\\\"\\n );\\n\\n return new OVM_StateTransitioner(\\n _libAddressManager,\\n _stateTransitionIndex,\\n _preStateRoot,\\n _transactionHash\\n );\\n }\\n}\\n\",\"keccak256\":\"0x65ef11334a2d6931b6d3a85e7b29c39c774d19443e7040e132a58be505e3b52c\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/execution/iOVM_ExecutionManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\ninterface iOVM_ExecutionManager {\\n /**********\\n * Enums *\\n *********/\\n\\n enum RevertFlag {\\n OUT_OF_GAS,\\n INTENTIONAL_REVERT,\\n EXCEEDS_NUISANCE_GAS,\\n INVALID_STATE_ACCESS,\\n UNSAFE_BYTECODE,\\n CREATE_COLLISION,\\n STATIC_VIOLATION,\\n CREATOR_NOT_ALLOWED\\n }\\n\\n enum GasMetadataKey {\\n CURRENT_EPOCH_START_TIMESTAMP,\\n CUMULATIVE_SEQUENCER_QUEUE_GAS,\\n CUMULATIVE_L1TOL2_QUEUE_GAS,\\n PREV_EPOCH_SEQUENCER_QUEUE_GAS,\\n PREV_EPOCH_L1TOL2_QUEUE_GAS\\n }\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct GasMeterConfig {\\n uint256 minTransactionGasLimit;\\n uint256 maxTransactionGasLimit;\\n uint256 maxGasPerQueuePerEpoch;\\n uint256 secondsPerEpoch;\\n }\\n\\n struct GlobalContext {\\n uint256 ovmCHAINID;\\n }\\n\\n struct TransactionContext {\\n Lib_OVMCodec.QueueOrigin ovmL1QUEUEORIGIN;\\n uint256 ovmTIMESTAMP;\\n uint256 ovmNUMBER;\\n uint256 ovmGASLIMIT;\\n uint256 ovmTXGASLIMIT;\\n address ovmL1TXORIGIN;\\n }\\n\\n struct TransactionRecord {\\n uint256 ovmGasRefund;\\n }\\n\\n struct MessageContext {\\n address ovmCALLER;\\n address ovmADDRESS;\\n bool isStatic;\\n }\\n\\n struct MessageRecord {\\n uint256 nuisanceGasLeft;\\n }\\n\\n\\n /************************************\\n * Transaction Execution Entrypoint *\\n ************************************/\\n\\n function run(\\n Lib_OVMCodec.Transaction calldata _transaction,\\n address _txStateManager\\n ) external returns (bytes memory);\\n\\n\\n /*******************\\n * Context Opcodes *\\n *******************/\\n\\n function ovmCALLER() external view returns (address _caller);\\n function ovmADDRESS() external view returns (address _address);\\n function ovmTIMESTAMP() external view returns (uint256 _timestamp);\\n function ovmNUMBER() external view returns (uint256 _number);\\n function ovmGASLIMIT() external view returns (uint256 _gasLimit);\\n function ovmCHAINID() external view returns (uint256 _chainId);\\n\\n\\n /**********************\\n * L2 Context Opcodes *\\n **********************/\\n\\n function ovmL1QUEUEORIGIN() external view returns (Lib_OVMCodec.QueueOrigin _queueOrigin);\\n function ovmL1TXORIGIN() external view returns (address _l1TxOrigin);\\n\\n\\n /*******************\\n * Halting Opcodes *\\n *******************/\\n\\n function ovmREVERT(bytes memory _data) external;\\n\\n\\n /*****************************\\n * Contract Creation Opcodes *\\n *****************************/\\n\\n function ovmCREATE(bytes memory _bytecode) external returns (address _contract, bytes memory _revertdata);\\n function ovmCREATE2(bytes memory _bytecode, bytes32 _salt) external returns (address _contract, bytes memory _revertdata);\\n\\n\\n /*******************************\\n * Account Abstraction Opcodes *\\n ******************************/\\n\\n function ovmGETNONCE() external returns (uint256 _nonce);\\n function ovmINCREMENTNONCE() external;\\n function ovmCREATEEOA(bytes32 _messageHash, uint8 _v, bytes32 _r, bytes32 _s) external;\\n\\n\\n /****************************\\n * Contract Calling Opcodes *\\n ****************************/\\n\\n function ovmCALL(uint256 _gasLimit, address _address, bytes memory _calldata) external returns (bool _success, bytes memory _returndata);\\n function ovmSTATICCALL(uint256 _gasLimit, address _address, bytes memory _calldata) external returns (bool _success, bytes memory _returndata);\\n function ovmDELEGATECALL(uint256 _gasLimit, address _address, bytes memory _calldata) external returns (bool _success, bytes memory _returndata);\\n\\n\\n /****************************\\n * Contract Storage Opcodes *\\n ****************************/\\n\\n function ovmSLOAD(bytes32 _key) external returns (bytes32 _value);\\n function ovmSSTORE(bytes32 _key, bytes32 _value) external;\\n\\n\\n /*************************\\n * Contract Code Opcodes *\\n *************************/\\n\\n function ovmEXTCODECOPY(address _contract, uint256 _offset, uint256 _length) external returns (bytes memory _code);\\n function ovmEXTCODESIZE(address _contract) external returns (uint256 _size);\\n function ovmEXTCODEHASH(address _contract) external returns (bytes32 _hash);\\n\\n\\n /***************************************\\n * Public Functions: Execution Context *\\n ***************************************/\\n\\n function getMaxTransactionGasLimit() external view returns (uint _maxTransactionGasLimit);\\n}\\n\",\"keccak256\":\"0xf023d5d6fc6a03bd52f7a57af6e21076de77e8925d065bb79db062e73e43b684\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/execution/iOVM_StateManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title iOVM_StateManager\\n */\\ninterface iOVM_StateManager {\\n\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n enum ItemState {\\n ITEM_UNTOUCHED,\\n ITEM_LOADED,\\n ITEM_CHANGED,\\n ITEM_COMMITTED\\n }\\n\\n /***************************\\n * Public Functions: Misc *\\n ***************************/\\n\\n function isAuthenticated(address _address) external view returns (bool);\\n\\n /***************************\\n * Public Functions: Setup *\\n ***************************/\\n\\n function owner() external view returns (address _owner);\\n function ovmExecutionManager() external view returns (address _ovmExecutionManager);\\n function setExecutionManager(address _ovmExecutionManager) external;\\n\\n\\n /************************************\\n * Public Functions: Account Access *\\n ************************************/\\n\\n function putAccount(address _address, Lib_OVMCodec.Account memory _account) external;\\n function putEmptyAccount(address _address) external;\\n function getAccount(address _address) external view returns (Lib_OVMCodec.Account memory _account);\\n function hasAccount(address _address) external view returns (bool _exists);\\n function hasEmptyAccount(address _address) external view returns (bool _exists);\\n function setAccountNonce(address _address, uint256 _nonce) external;\\n function getAccountNonce(address _address) external view returns (uint256 _nonce);\\n function getAccountEthAddress(address _address) external view returns (address _ethAddress);\\n function getAccountStorageRoot(address _address) external view returns (bytes32 _storageRoot);\\n function initPendingAccount(address _address) external;\\n function commitPendingAccount(address _address, address _ethAddress, bytes32 _codeHash) external;\\n function testAndSetAccountLoaded(address _address) external returns (bool _wasAccountAlreadyLoaded);\\n function testAndSetAccountChanged(address _address) external returns (bool _wasAccountAlreadyChanged);\\n function commitAccount(address _address) external returns (bool _wasAccountCommitted);\\n function incrementTotalUncommittedAccounts() external;\\n function getTotalUncommittedAccounts() external view returns (uint256 _total);\\n function wasAccountChanged(address _address) external view returns (bool);\\n function wasAccountCommitted(address _address) external view returns (bool);\\n\\n\\n /************************************\\n * Public Functions: Storage Access *\\n ************************************/\\n\\n function putContractStorage(address _contract, bytes32 _key, bytes32 _value) external;\\n function getContractStorage(address _contract, bytes32 _key) external view returns (bytes32 _value);\\n function hasContractStorage(address _contract, bytes32 _key) external view returns (bool _exists);\\n function testAndSetContractStorageLoaded(address _contract, bytes32 _key) external returns (bool _wasContractStorageAlreadyLoaded);\\n function testAndSetContractStorageChanged(address _contract, bytes32 _key) external returns (bool _wasContractStorageAlreadyChanged);\\n function commitContractStorage(address _contract, bytes32 _key) external returns (bool _wasContractStorageCommitted);\\n function incrementTotalUncommittedContractStorage() external;\\n function getTotalUncommittedContractStorage() external view returns (uint256 _total);\\n function wasContractStorageChanged(address _contract, bytes32 _key) external view returns (bool);\\n function wasContractStorageCommitted(address _contract, bytes32 _key) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x7a11dbd1f61593ba34debe07e39eef59967307f7f372ba9855bee0953585d08d\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/execution/iOVM_StateManagerFactory.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Contract Imports */\\nimport { iOVM_StateManager } from \\\"./iOVM_StateManager.sol\\\";\\n\\n/**\\n * @title iOVM_StateManagerFactory\\n */\\ninterface iOVM_StateManagerFactory {\\n\\n /***************************************\\n * Public Functions: Contract Creation *\\n ***************************************/\\n\\n function create(\\n address _owner\\n )\\n external\\n returns (\\n iOVM_StateManager _ovmStateManager\\n );\\n}\\n\",\"keccak256\":\"0x27a90fc43889d0c7d1db50f37907ef7386d9b415d15a1e91a0a068cba59afd36\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/verification/iOVM_BondManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\ninterface ERC20 {\\n function transfer(address, uint256) external returns (bool);\\n function transferFrom(address, address, uint256) external returns (bool);\\n}\\n\\n/// All the errors which may be encountered on the bond manager\\nlibrary Errors {\\n string constant ERC20_ERR = \\\"BondManager: Could not post bond\\\";\\n string constant ALREADY_FINALIZED = \\\"BondManager: Fraud proof for this pre-state root has already been finalized\\\";\\n string constant SLASHED = \\\"BondManager: Cannot finalize withdrawal, you probably got slashed\\\";\\n string constant WRONG_STATE = \\\"BondManager: Wrong bond state for proposer\\\";\\n string constant CANNOT_CLAIM = \\\"BondManager: Cannot claim yet. Dispute must be finalized first\\\";\\n\\n string constant WITHDRAWAL_PENDING = \\\"BondManager: Withdrawal already pending\\\";\\n string constant TOO_EARLY = \\\"BondManager: Too early to finalize your withdrawal\\\";\\n\\n string constant ONLY_TRANSITIONER = \\\"BondManager: Only the transitioner for this pre-state root may call this function\\\";\\n string constant ONLY_FRAUD_VERIFIER = \\\"BondManager: Only the fraud verifier may call this function\\\";\\n string constant ONLY_STATE_COMMITMENT_CHAIN = \\\"BondManager: Only the state commitment chain may call this function\\\";\\n string constant WAIT_FOR_DISPUTES = \\\"BondManager: Wait for other potential disputes\\\";\\n}\\n\\n/**\\n * @title iOVM_BondManager\\n */\\ninterface iOVM_BondManager {\\n\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n /// The lifecycle of a proposer's bond\\n enum State {\\n // Before depositing or after getting slashed, a user is uncollateralized\\n NOT_COLLATERALIZED,\\n // After depositing, a user is collateralized\\n COLLATERALIZED,\\n // After a user has initiated a withdrawal\\n WITHDRAWING\\n }\\n\\n /// A bond posted by a proposer\\n struct Bond {\\n // The user's state\\n State state;\\n // The timestamp at which a proposer issued their withdrawal request\\n uint32 withdrawalTimestamp;\\n // The time when the first disputed was initiated for this bond\\n uint256 firstDisputeAt;\\n // The earliest observed state root for this bond which has had fraud\\n bytes32 earliestDisputedStateRoot;\\n // The state root's timestamp\\n uint256 earliestTimestamp;\\n }\\n\\n // Per pre-state root, store the number of state provisions that were made\\n // and how many of these calls were made by each user. Payouts will then be\\n // claimed by users proportionally for that dispute.\\n struct Rewards {\\n // Flag to check if rewards for a fraud proof are claimable\\n bool canClaim;\\n // Total number of `recordGasSpent` calls made\\n uint256 total;\\n // The gas spent by each user to provide witness data. The sum of all\\n // values inside this map MUST be equal to the value of `total`\\n mapping(address => uint256) gasSpent;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function recordGasSpent(\\n bytes32 _preStateRoot,\\n bytes32 _txHash,\\n address _who,\\n uint256 _gasSpent\\n ) external;\\n\\n function finalize(\\n bytes32 _preStateRoot,\\n address _publisher,\\n uint256 _timestamp\\n ) external;\\n\\n function deposit() external;\\n\\n function startWithdrawal() external;\\n\\n function finalizeWithdrawal() external;\\n\\n function claim(\\n address _who\\n ) external;\\n\\n function isCollateralized(\\n address _who\\n ) external view returns (bool);\\n\\n function getGasSpent(\\n bytes32 _preStateRoot,\\n address _who\\n ) external view returns (uint256);\\n}\\n\",\"keccak256\":\"0x3c2a8a399487857158649db1896749d86e39cba545a8aeb2e2bb0f3bdfa7a5b1\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/verification/iOVM_FraudVerifier.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_StateTransitioner } from \\\"./iOVM_StateTransitioner.sol\\\";\\n\\n/**\\n * @title iOVM_FraudVerifier\\n */\\ninterface iOVM_FraudVerifier {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event FraudProofInitialized(\\n bytes32 _preStateRoot,\\n uint256 _preStateRootIndex,\\n bytes32 _transactionHash,\\n address _who\\n );\\n\\n event FraudProofFinalized(\\n bytes32 _preStateRoot,\\n uint256 _preStateRootIndex,\\n bytes32 _transactionHash,\\n address _who\\n );\\n\\n\\n /***************************************\\n * Public Functions: Transition Status *\\n ***************************************/\\n\\n function getStateTransitioner(bytes32 _preStateRoot, bytes32 _txHash) external view returns (iOVM_StateTransitioner _transitioner);\\n\\n\\n /****************************************\\n * Public Functions: Fraud Verification *\\n ****************************************/\\n\\n function initializeFraudVerification(\\n bytes32 _preStateRoot,\\n Lib_OVMCodec.ChainBatchHeader calldata _preStateRootBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof calldata _preStateRootProof,\\n Lib_OVMCodec.Transaction calldata _transaction,\\n Lib_OVMCodec.TransactionChainElement calldata _txChainElement,\\n Lib_OVMCodec.ChainBatchHeader calldata _transactionBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof calldata _transactionProof\\n ) external;\\n\\n function finalizeFraudVerification(\\n bytes32 _preStateRoot,\\n Lib_OVMCodec.ChainBatchHeader calldata _preStateRootBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof calldata _preStateRootProof,\\n bytes32 _txHash,\\n bytes32 _postStateRoot,\\n Lib_OVMCodec.ChainBatchHeader calldata _postStateRootBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof calldata _postStateRootProof\\n ) external;\\n}\\n\",\"keccak256\":\"0x5efd7bb18164bbd3e9d58379e8203fbf2a7ee802b1a48dff3ceaaec1523b1751\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/verification/iOVM_StateTransitioner.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title iOVM_StateTransitioner\\n */\\ninterface iOVM_StateTransitioner {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AccountCommitted(\\n address _address\\n );\\n\\n event ContractStorageCommitted(\\n address _address,\\n bytes32 _key\\n );\\n\\n\\n /**********************************\\n * Public Functions: State Access *\\n **********************************/\\n\\n function getPreStateRoot() external view returns (bytes32 _preStateRoot);\\n function getPostStateRoot() external view returns (bytes32 _postStateRoot);\\n function isComplete() external view returns (bool _complete);\\n\\n\\n /***********************************\\n * Public Functions: Pre-Execution *\\n ***********************************/\\n\\n function proveContractState(\\n address _ovmContractAddress,\\n address _ethContractAddress,\\n bytes calldata _stateTrieWitness\\n ) external;\\n\\n function proveStorageSlot(\\n address _ovmContractAddress,\\n bytes32 _key,\\n bytes calldata _storageTrieWitness\\n ) external;\\n\\n\\n /*******************************\\n * Public Functions: Execution *\\n *******************************/\\n\\n function applyTransaction(\\n Lib_OVMCodec.Transaction calldata _transaction\\n ) external;\\n\\n\\n /************************************\\n * Public Functions: Post-Execution *\\n ************************************/\\n\\n function commitContractState(\\n address _ovmContractAddress,\\n bytes calldata _stateTrieWitness\\n ) external;\\n\\n function commitStorageSlot(\\n address _ovmContractAddress,\\n bytes32 _key,\\n bytes calldata _storageTrieWitness\\n ) external;\\n\\n\\n /**********************************\\n * Public Functions: Finalization *\\n **********************************/\\n\\n function completeTransition() external;\\n}\\n\",\"keccak256\":\"0x3d044ac0a3bb6ad3d529f904b3191117511f9c379678ca03010e1ebdfcb5c34b\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/verification/iOVM_StateTransitionerFactory.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Contract Imports */\\nimport { iOVM_StateTransitioner } from \\\"./iOVM_StateTransitioner.sol\\\";\\n\\n/**\\n * @title iOVM_StateTransitionerFactory\\n */\\ninterface iOVM_StateTransitionerFactory {\\n\\n /***************************************\\n * Public Functions: Contract Creation *\\n ***************************************/\\n\\n function create(\\n address _proxyManager,\\n uint256 _stateTransitionIndex,\\n bytes32 _preStateRoot,\\n bytes32 _transactionHash\\n )\\n external\\n returns (\\n iOVM_StateTransitioner _ovmStateTransitioner\\n );\\n}\\n\",\"keccak256\":\"0x60a0f0c104e4c0c7863268a93005762e8146d393f9cfddfdd6a2d6585c5911fc\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/codec/Lib_OVMCodec.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../utils/Lib_Bytes32Utils.sol\\\";\\n\\n/**\\n * @title Lib_OVMCodec\\n */\\nlibrary Lib_OVMCodec {\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum QueueOrigin {\\n SEQUENCER_QUEUE,\\n L1TOL2_QUEUE\\n }\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Account {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n address ethAddress;\\n bool isFresh;\\n }\\n\\n struct EVMAccount {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n }\\n\\n struct ChainBatchHeader {\\n uint256 batchIndex;\\n bytes32 batchRoot;\\n uint256 batchSize;\\n uint256 prevTotalElements;\\n bytes extraData;\\n }\\n\\n struct ChainInclusionProof {\\n uint256 index;\\n bytes32[] siblings;\\n }\\n\\n struct Transaction {\\n uint256 timestamp;\\n uint256 blockNumber;\\n QueueOrigin l1QueueOrigin;\\n address l1TxOrigin;\\n address entrypoint;\\n uint256 gasLimit;\\n bytes data;\\n }\\n\\n struct TransactionChainElement {\\n bool isSequenced;\\n uint256 queueIndex; // QUEUED TX ONLY\\n uint256 timestamp; // SEQUENCER TX ONLY\\n uint256 blockNumber; // SEQUENCER TX ONLY\\n bytes txData; // SEQUENCER TX ONLY\\n }\\n\\n struct QueueElement {\\n bytes32 transactionHash;\\n uint40 timestamp;\\n uint40 blockNumber;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Encodes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Encoded transaction bytes.\\n */\\n function encodeTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return abi.encodePacked(\\n _transaction.timestamp,\\n _transaction.blockNumber,\\n _transaction.l1QueueOrigin,\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n );\\n }\\n\\n /**\\n * Hashes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Hashed transaction\\n */\\n function hashTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(encodeTransaction(_transaction));\\n }\\n\\n /**\\n * Converts an OVM account to an EVM account.\\n * @param _in OVM account to convert.\\n * @return Converted EVM account.\\n */\\n function toEVMAccount(\\n Account memory _in\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n return EVMAccount({\\n nonce: _in.nonce,\\n balance: _in.balance,\\n storageRoot: _in.storageRoot,\\n codeHash: _in.codeHash\\n });\\n }\\n\\n /**\\n * @notice RLP-encodes an account state struct.\\n * @param _account Account state struct.\\n * @return RLP-encoded account state.\\n */\\n function encodeEVMAccount(\\n EVMAccount memory _account\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes[] memory raw = new bytes[](4);\\n\\n // Unfortunately we can't create this array outright because\\n // Lib_RLPWriter.writeList will reject fixed-size arrays. Assigning\\n // index-by-index circumvents this issue.\\n raw[0] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.nonce)\\n )\\n );\\n raw[1] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.balance)\\n )\\n );\\n raw[2] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.storageRoot));\\n raw[3] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.codeHash));\\n\\n return Lib_RLPWriter.writeList(raw);\\n }\\n\\n /**\\n * @notice Decodes an RLP-encoded account state into a useful struct.\\n * @param _encoded RLP-encoded account state.\\n * @return Account state struct.\\n */\\n function decodeEVMAccount(\\n bytes memory _encoded\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\\n\\n return EVMAccount({\\n nonce: Lib_RLPReader.readUint256(accountState[0]),\\n balance: Lib_RLPReader.readUint256(accountState[1]),\\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\\n });\\n }\\n\\n /**\\n * Calculates a hash for a given batch header.\\n * @param _batchHeader Header to hash.\\n * @return Hash of the header.\\n */\\n function hashBatchHeader(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(\\n abi.encode(\\n _batchHeader.batchRoot,\\n _batchHeader.batchSize,\\n _batchHeader.prevTotalElements,\\n _batchHeader.extraData\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0xd85ba2066057a2677926f484b938c7c2ef33ff3853f3b71cda252f4a54f30e05\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n public\\n onlyOwner\\n {\\n addresses[_getNameHash(_name)] = _address;\\n\\n emit AddressSet(\\n _name,\\n _address\\n );\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0x2ce671a0e004df88b136bea5a3c59d0732cea8887c8496da1d509e0200b03d7d\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(\\n address _libAddressManager\\n ) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x65981feeabff6a81783ea97d44baf988a18a86c8cb374c46fdb71819cbacc7c0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPReader.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_RLPReader\\n * @dev Adapted from \\\"RLPReader\\\" by Hamdi Allam (hamdi.allam97@gmail.com).\\n */\\nlibrary Lib_RLPReader {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 constant internal MAX_LIST_LENGTH = 32;\\n\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum RLPItemType {\\n DATA_ITEM,\\n LIST_ITEM\\n }\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct RLPItem {\\n uint256 length;\\n uint256 ptr;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts bytes to a reference to memory position and length.\\n * @param _in Input bytes to convert.\\n * @return Output memory reference.\\n */\\n function toRLPItem(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem memory\\n )\\n {\\n uint256 ptr;\\n assembly {\\n ptr := add(_in, 32)\\n }\\n\\n return RLPItem({\\n length: _in.length,\\n ptr: ptr\\n });\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n (\\n uint256 listOffset,\\n ,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.LIST_ITEM,\\n \\\"Invalid RLP list value.\\\"\\n );\\n\\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\\n // writing to the length. Since we can't know the number of RLP items without looping over\\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\\n // simply set a reasonable maximum list length and decrease the size before we finish.\\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\\n\\n uint256 itemCount = 0;\\n uint256 offset = listOffset;\\n while (offset < _in.length) {\\n require(\\n itemCount < MAX_LIST_LENGTH,\\n \\\"Provided RLP list exceeds max list length.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n ) = _decodeLength(RLPItem({\\n length: _in.length - offset,\\n ptr: _in.ptr + offset\\n }));\\n\\n out[itemCount] = RLPItem({\\n length: itemLength + itemOffset,\\n ptr: _in.ptr + offset\\n });\\n\\n itemCount += 1;\\n offset += itemOffset + itemLength;\\n }\\n\\n // Decrease the array size to match the actual item count.\\n assembly {\\n mstore(out, itemCount)\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n return readList(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes value.\\\"\\n );\\n\\n return _copy(_in.ptr, itemOffset, itemLength);\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return readBytes(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return string(readBytes(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return readString(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n require(\\n _in.length <= 33,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr + itemOffset;\\n bytes32 out;\\n assembly {\\n out := mload(ptr)\\n\\n // Shift the bytes over to match the item size.\\n if lt(itemLength, 32) {\\n out := div(out, exp(256, sub(32, itemLength)))\\n }\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return readBytes32(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return uint256(readBytes32(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return readUint256(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n require(\\n _in.length == 1,\\n \\\"Invalid RLP boolean value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 out;\\n assembly {\\n out := byte(0, mload(ptr))\\n }\\n\\n require(\\n out == 0 || out == 1,\\n \\\"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\\\"\\n );\\n\\n return out != 0;\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return readBool(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n if (_in.length == 1) {\\n return address(0);\\n }\\n\\n require(\\n _in.length == 21,\\n \\\"Invalid RLP address value.\\\"\\n );\\n\\n return address(readUint256(_in));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return readAddress(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads the raw bytes of an RLP item.\\n * @param _in RLP item to read.\\n * @return Raw RLP bytes.\\n */\\n function readRawBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in);\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Decodes the length of an RLP item.\\n * @param _in RLP item to decode.\\n * @return Offset of the encoded data.\\n * @return Length of the encoded data.\\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\\n */\\n function _decodeLength(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n uint256,\\n uint256,\\n RLPItemType\\n )\\n {\\n require(\\n _in.length > 0,\\n \\\"RLP item cannot be null.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 prefix;\\n assembly {\\n prefix := byte(0, mload(ptr))\\n }\\n\\n if (prefix <= 0x7f) {\\n // Single byte.\\n\\n return (0, 1, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xb7) {\\n // Short string.\\n\\n uint256 strLen = prefix - 0x80;\\n\\n require(\\n _in.length > strLen,\\n \\\"Invalid RLP short string.\\\"\\n );\\n\\n return (1, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xbf) {\\n // Long string.\\n uint256 lenOfStrLen = prefix - 0xb7;\\n\\n require(\\n _in.length > lenOfStrLen,\\n \\\"Invalid RLP long string length.\\\"\\n );\\n\\n uint256 strLen;\\n assembly {\\n // Pick out the string length.\\n strLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfStrLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfStrLen + strLen,\\n \\\"Invalid RLP long string.\\\"\\n );\\n\\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xf7) {\\n // Short list.\\n uint256 listLen = prefix - 0xc0;\\n\\n require(\\n _in.length > listLen,\\n \\\"Invalid RLP short list.\\\"\\n );\\n\\n return (1, listLen, RLPItemType.LIST_ITEM);\\n } else {\\n // Long list.\\n uint256 lenOfListLen = prefix - 0xf7;\\n\\n require(\\n _in.length > lenOfListLen,\\n \\\"Invalid RLP long list length.\\\"\\n );\\n\\n uint256 listLen;\\n assembly {\\n // Pick out the list length.\\n listLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfListLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfListLen + listLen,\\n \\\"Invalid RLP long list.\\\"\\n );\\n\\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\\n }\\n }\\n\\n /**\\n * Copies the bytes from a memory location.\\n * @param _src Pointer to the location to read from.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Copied bytes.\\n */\\n function _copy(\\n uint256 _src,\\n uint256 _offset,\\n uint256 _length\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out = new bytes(_length);\\n if (out.length == 0) {\\n return out;\\n }\\n\\n uint256 src = _src + _offset;\\n uint256 dest;\\n assembly {\\n dest := add(out, 32)\\n }\\n\\n // Copy over as many complete words as we can.\\n for (uint256 i = 0; i < _length / 32; i++) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n\\n src += 32;\\n dest += 32;\\n }\\n\\n // Pick out the remaining bytes.\\n uint256 mask = 256 ** (32 - (_length % 32)) - 1;\\n assembly {\\n mstore(\\n dest,\\n or(\\n and(mload(src), not(mask)),\\n and(mload(dest), mask)\\n )\\n )\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Copies an RLP item into bytes.\\n * @param _in RLP item to copy.\\n * @return Copied bytes.\\n */\\n function _copy(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in.ptr, 0, _in.length);\\n }\\n}\\n\",\"keccak256\":\"0x829174c61216dce35fdb888383b6022e0365eb7fbdc71ad79d98b108091969fe\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPWriter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/**\\n * @title Lib_RLPWriter\\n * @author Bakaoh (with modifications)\\n */\\nlibrary Lib_RLPWriter {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * RLP encodes a byte string.\\n * @param _in The byte string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded;\\n\\n if (_in.length == 1 && uint8(_in[0]) < 128) {\\n encoded = _in;\\n } else {\\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * RLP encodes a list of RLP encoded byte byte strings.\\n * @param _in The list of RLP encoded byte strings.\\n * @return The RLP encoded list of items in bytes.\\n */\\n function writeList(\\n bytes[] memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory list = _flatten(_in);\\n return abi.encodePacked(_writeLength(list.length, 192), list);\\n }\\n\\n /**\\n * RLP encodes a string.\\n * @param _in The string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeString(\\n string memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(bytes(_in));\\n }\\n\\n /**\\n * RLP encodes an address.\\n * @param _in The address to encode.\\n * @return The RLP encoded address in bytes.\\n */\\n function writeAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a bytes32 value.\\n * @param _in The bytes32 to encode.\\n * @return _out The RLP encoded bytes32 in bytes.\\n */\\n function writeBytes32(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a uint.\\n * @param _in The uint256 to encode.\\n * @return The RLP encoded uint256 in bytes.\\n */\\n function writeUint(\\n uint256 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(_toBinary(_in));\\n }\\n\\n /**\\n * RLP encodes a bool.\\n * @param _in The bool to encode.\\n * @return The RLP encoded bool in bytes.\\n */\\n function writeBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded = new bytes(1);\\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\\n return encoded;\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\\n * @param _len The length of the string or the payload.\\n * @param _offset 128 if item is string, 192 if item is list.\\n * @return RLP encoded bytes.\\n */\\n function _writeLength(\\n uint256 _len,\\n uint256 _offset\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded;\\n\\n if (_len < 56) {\\n encoded = new bytes(1);\\n encoded[0] = byte(uint8(_len) + uint8(_offset));\\n } else {\\n uint256 lenLen;\\n uint256 i = 1;\\n while (_len / i != 0) {\\n lenLen++;\\n i *= 256;\\n }\\n\\n encoded = new bytes(lenLen + 1);\\n encoded[0] = byte(uint8(lenLen) + uint8(_offset) + 55);\\n for(i = 1; i <= lenLen; i++) {\\n encoded[i] = byte(uint8((_len / (256**(lenLen-i))) % 256));\\n }\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * Encode integer in big endian binary form with no leading zeroes.\\n * @notice TODO: This should be optimized with assembly to save gas costs.\\n * @param _x The integer to encode.\\n * @return RLP encoded bytes.\\n */\\n function _toBinary(\\n uint256 _x\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory b = abi.encodePacked(_x);\\n\\n uint256 i = 0;\\n for (; i < 32; i++) {\\n if (b[i] != 0) {\\n break;\\n }\\n }\\n\\n bytes memory res = new bytes(32 - i);\\n for (uint256 j = 0; j < res.length; j++) {\\n res[j] = b[i++];\\n }\\n\\n return res;\\n }\\n\\n /**\\n * Copies a piece of memory to another location.\\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\\n * @param _dest Destination location.\\n * @param _src Source location.\\n * @param _len Length of memory to copy.\\n */\\n function _memcpy(\\n uint256 _dest,\\n uint256 _src,\\n uint256 _len\\n )\\n private\\n pure\\n {\\n uint256 dest = _dest;\\n uint256 src = _src;\\n uint256 len = _len;\\n\\n for(; len >= 32; len -= 32) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n dest += 32;\\n src += 32;\\n }\\n\\n uint256 mask = 256 ** (32 - len) - 1;\\n assembly {\\n let srcpart := and(mload(src), not(mask))\\n let destpart := and(mload(dest), mask)\\n mstore(dest, or(destpart, srcpart))\\n }\\n }\\n\\n /**\\n * Flattens a list of byte strings into one byte string.\\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\\n * @param _list List of byte strings to flatten.\\n * @return The flattened byte string.\\n */\\n function _flatten(\\n bytes[] memory _list\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n if (_list.length == 0) {\\n return new bytes(0);\\n }\\n\\n uint256 len;\\n uint256 i = 0;\\n for (; i < _list.length; i++) {\\n len += _list[i].length;\\n }\\n\\n bytes memory flattened = new bytes(len);\\n uint256 flattenedPtr;\\n assembly { flattenedPtr := add(flattened, 0x20) }\\n\\n for(i = 0; i < _list.length; i++) {\\n bytes memory item = _list[i];\\n\\n uint256 listPtr;\\n assembly { listPtr := add(item, 0x20)}\\n\\n _memcpy(flattenedPtr, listPtr, item.length);\\n flattenedPtr += _list[i].length;\\n }\\n\\n return flattened;\\n }\\n}\\n\",\"keccak256\":\"0xb60ee4b03ad372c3deff21d454ab714dd0c18ee3e6f9d45532e209fc59d5a54d\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/trie/Lib_MerkleTrie.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\n\\n/**\\n * @title Lib_MerkleTrie\\n */\\nlibrary Lib_MerkleTrie {\\n\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n enum NodeType {\\n BranchNode,\\n ExtensionNode,\\n LeafNode\\n }\\n\\n struct TrieNode {\\n bytes encoded;\\n Lib_RLPReader.RLPItem[] decoded;\\n }\\n\\n\\n /**********************\\n * Contract Constants *\\n **********************/\\n\\n // TREE_RADIX determines the number of elements per branch node.\\n uint256 constant TREE_RADIX = 16;\\n // Branch nodes have TREE_RADIX elements plus an additional `value` slot.\\n uint256 constant BRANCH_NODE_LENGTH = TREE_RADIX + 1;\\n // Leaf nodes and extension nodes always have two elements, a `path` and a `value`.\\n uint256 constant LEAF_OR_EXTENSION_NODE_LENGTH = 2;\\n\\n // Prefixes are prepended to the `path` within a leaf or extension node and\\n // allow us to differentiate between the two node types. `ODD` or `EVEN` is\\n // determined by the number of nibbles within the unprefixed `path`. If the\\n // number of nibbles if even, we need to insert an extra padding nibble so\\n // the resulting prefixed `path` has an even number of nibbles.\\n uint8 constant PREFIX_EXTENSION_EVEN = 0;\\n uint8 constant PREFIX_EXTENSION_ODD = 1;\\n uint8 constant PREFIX_LEAF_EVEN = 2;\\n uint8 constant PREFIX_LEAF_ODD = 3;\\n\\n // Just a utility constant. RLP represents `NULL` as 0x80.\\n bytes1 constant RLP_NULL = bytes1(0x80);\\n bytes constant RLP_NULL_BYTES = hex'80';\\n bytes32 constant internal KECCAK256_RLP_NULL_BYTES = keccak256(RLP_NULL_BYTES);\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * @notice Verifies a proof that a given key/value pair is present in the\\n * Merkle trie.\\n * @param _key Key of the node to search for, as a hex string.\\n * @param _value Value of the node to search for, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the desired node. Unlike\\n * traditional Merkle trees, this proof is executed top-down and consists\\n * of a list of RLP-encoded nodes that make a path down to the target node.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _verified `true` if the k/v pair exists in the trie, `false` otherwise.\\n */\\n function verifyInclusionProof(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bool _verified\\n )\\n {\\n (\\n bool exists,\\n bytes memory value\\n ) = get(_key, _proof, _root);\\n\\n return (\\n exists && Lib_BytesUtils.equal(_value, value)\\n );\\n }\\n\\n /**\\n * @notice Verifies a proof that a given key is *not* present in\\n * the Merkle trie.\\n * @param _key Key of the node to search for, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\\n * target node.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _verified `true` if the key is absent in the trie, `false` otherwise.\\n */\\n function verifyExclusionProof(\\n bytes memory _key,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bool _verified\\n )\\n {\\n (\\n bool exists,\\n ) = get(_key, _proof, _root);\\n\\n return exists == false;\\n }\\n\\n /**\\n * @notice Updates a Merkle trie and returns a new root hash.\\n * @param _key Key of the node to update, as a hex string.\\n * @param _value Value of the node to update, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\\n * target node. If the key exists, we can simply update the value.\\n * Otherwise, we need to modify the trie to handle the new k/v pair.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _updatedRoot Root hash of the newly constructed trie.\\n */\\n function update(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bytes32 _updatedRoot\\n )\\n {\\n // Special case when inserting the very first node.\\n if (_root == KECCAK256_RLP_NULL_BYTES) {\\n return getSingleNodeRootHash(_key, _value);\\n }\\n\\n TrieNode[] memory proof = _parseProof(_proof);\\n (uint256 pathLength, bytes memory keyRemainder, ) = _walkNodePath(proof, _key, _root);\\n TrieNode[] memory newPath = _getNewPath(proof, pathLength, keyRemainder, _value);\\n\\n return _getUpdatedTrieRoot(newPath, _key);\\n }\\n\\n /**\\n * @notice Retrieves the value associated with a given key.\\n * @param _key Key to search for, as hex bytes.\\n * @param _proof Merkle trie inclusion proof for the key.\\n * @param _root Known root of the Merkle trie.\\n * @return _exists Whether or not the key exists.\\n * @return _value Value of the key if it exists.\\n */\\n function get(\\n bytes memory _key,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bool _exists,\\n bytes memory _value\\n )\\n {\\n TrieNode[] memory proof = _parseProof(_proof);\\n (uint256 pathLength, bytes memory keyRemainder, bool isFinalNode) = _walkNodePath(proof, _key, _root);\\n\\n bool exists = keyRemainder.length == 0;\\n\\n require(\\n exists || isFinalNode,\\n \\\"Provided proof is invalid.\\\"\\n );\\n\\n bytes memory value = exists ? _getNodeValue(proof[pathLength - 1]) : bytes('');\\n\\n return (\\n exists,\\n value\\n );\\n }\\n\\n /**\\n * Computes the root hash for a trie with a single node.\\n * @param _key Key for the single node.\\n * @param _value Value for the single node.\\n * @return _updatedRoot Hash of the trie.\\n */\\n function getSingleNodeRootHash(\\n bytes memory _key,\\n bytes memory _value\\n )\\n internal\\n pure\\n returns (\\n bytes32 _updatedRoot\\n )\\n {\\n return keccak256(_makeLeafNode(\\n Lib_BytesUtils.toNibbles(_key),\\n _value\\n ).encoded);\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * @notice Walks through a proof using a provided key.\\n * @param _proof Inclusion proof to walk through.\\n * @param _key Key to use for the walk.\\n * @param _root Known root of the trie.\\n * @return _pathLength Length of the final path\\n * @return _keyRemainder Portion of the key remaining after the walk.\\n * @return _isFinalNode Whether or not we've hit a dead end.\\n */\\n function _walkNodePath(\\n TrieNode[] memory _proof,\\n bytes memory _key,\\n bytes32 _root\\n )\\n private\\n pure\\n returns (\\n uint256 _pathLength,\\n bytes memory _keyRemainder,\\n bool _isFinalNode\\n )\\n {\\n uint256 pathLength = 0;\\n bytes memory key = Lib_BytesUtils.toNibbles(_key);\\n\\n bytes32 currentNodeID = _root;\\n uint256 currentKeyIndex = 0;\\n uint256 currentKeyIncrement = 0;\\n TrieNode memory currentNode;\\n\\n // Proof is top-down, so we start at the first element (root).\\n for (uint256 i = 0; i < _proof.length; i++) {\\n currentNode = _proof[i];\\n currentKeyIndex += currentKeyIncrement;\\n\\n // Keep track of the proof elements we actually need.\\n // It's expensive to resize arrays, so this simply reduces gas costs.\\n pathLength += 1;\\n\\n if (currentKeyIndex == 0) {\\n // First proof element is always the root node.\\n require(\\n keccak256(currentNode.encoded) == currentNodeID,\\n \\\"Invalid root hash\\\"\\n );\\n } else if (currentNode.encoded.length >= 32) {\\n // Nodes 32 bytes or larger are hashed inside branch nodes.\\n require(\\n keccak256(currentNode.encoded) == currentNodeID,\\n \\\"Invalid large internal hash\\\"\\n );\\n } else {\\n // Nodes smaller than 31 bytes aren't hashed.\\n require(\\n Lib_BytesUtils.toBytes32(currentNode.encoded) == currentNodeID,\\n \\\"Invalid internal node hash\\\"\\n );\\n }\\n\\n if (currentNode.decoded.length == BRANCH_NODE_LENGTH) {\\n if (currentKeyIndex == key.length) {\\n // We've hit the end of the key, meaning the value should be within this branch node.\\n break;\\n } else {\\n // We're not at the end of the key yet.\\n // Figure out what the next node ID should be and continue.\\n uint8 branchKey = uint8(key[currentKeyIndex]);\\n Lib_RLPReader.RLPItem memory nextNode = currentNode.decoded[branchKey];\\n currentNodeID = _getNodeID(nextNode);\\n currentKeyIncrement = 1;\\n continue;\\n }\\n } else if (currentNode.decoded.length == LEAF_OR_EXTENSION_NODE_LENGTH) {\\n bytes memory path = _getNodePath(currentNode);\\n uint8 prefix = uint8(path[0]);\\n uint8 offset = 2 - prefix % 2;\\n bytes memory pathRemainder = Lib_BytesUtils.slice(path, offset);\\n bytes memory keyRemainder = Lib_BytesUtils.slice(key, currentKeyIndex);\\n uint256 sharedNibbleLength = _getSharedNibbleLength(pathRemainder, keyRemainder);\\n\\n if (prefix == PREFIX_LEAF_EVEN || prefix == PREFIX_LEAF_ODD) {\\n if (\\n pathRemainder.length == sharedNibbleLength &&\\n keyRemainder.length == sharedNibbleLength\\n ) {\\n // The key within this leaf matches our key exactly.\\n // Increment the key index to reflect that we have no remainder.\\n currentKeyIndex += sharedNibbleLength;\\n }\\n\\n // We've hit a leaf node, so our next node should be NULL.\\n currentNodeID = bytes32(RLP_NULL);\\n break;\\n } else if (prefix == PREFIX_EXTENSION_EVEN || prefix == PREFIX_EXTENSION_ODD) {\\n if (sharedNibbleLength == 0) {\\n // Our extension node doesn't share any part of our key.\\n // We've hit the end of this path, updates will need to modify this extension.\\n currentNodeID = bytes32(RLP_NULL);\\n break;\\n } else {\\n // Our extension shares some nibbles.\\n // Carry on to the next node.\\n currentNodeID = _getNodeID(currentNode.decoded[1]);\\n currentKeyIncrement = sharedNibbleLength;\\n continue;\\n }\\n } else {\\n revert(\\\"Received a node with an unknown prefix\\\");\\n }\\n } else {\\n revert(\\\"Received an unparseable node.\\\");\\n }\\n }\\n\\n // If our node ID is NULL, then we're at a dead end.\\n bool isFinalNode = currentNodeID == bytes32(RLP_NULL);\\n return (pathLength, Lib_BytesUtils.slice(key, currentKeyIndex), isFinalNode);\\n }\\n\\n /**\\n * @notice Creates new nodes to support a k/v pair insertion into a given\\n * Merkle trie path.\\n * @param _path Path to the node nearest the k/v pair.\\n * @param _pathLength Length of the path. Necessary because the provided\\n * path may include additional nodes (e.g., it comes directly from a proof)\\n * and we can't resize in-memory arrays without costly duplication.\\n * @param _keyRemainder Portion of the initial key that must be inserted\\n * into the trie.\\n * @param _value Value to insert at the given key.\\n * @return _newPath A new path with the inserted k/v pair and extra supporting nodes.\\n */\\n function _getNewPath(\\n TrieNode[] memory _path,\\n uint256 _pathLength,\\n bytes memory _keyRemainder,\\n bytes memory _value\\n )\\n private\\n pure\\n returns (\\n TrieNode[] memory _newPath\\n )\\n {\\n bytes memory keyRemainder = _keyRemainder;\\n\\n // Most of our logic depends on the status of the last node in the path.\\n TrieNode memory lastNode = _path[_pathLength - 1];\\n NodeType lastNodeType = _getNodeType(lastNode);\\n\\n // Create an array for newly created nodes.\\n // We need up to three new nodes, depending on the contents of the last node.\\n // Since array resizing is expensive, we'll keep track of the size manually.\\n // We're using an explicit `totalNewNodes += 1` after insertions for clarity.\\n TrieNode[] memory newNodes = new TrieNode[](3);\\n uint256 totalNewNodes = 0;\\n\\n if (keyRemainder.length == 0 && lastNodeType == NodeType.LeafNode) {\\n // We've found a leaf node with the given key.\\n // Simply need to update the value of the node to match.\\n newNodes[totalNewNodes] = _makeLeafNode(_getNodeKey(lastNode), _value);\\n totalNewNodes += 1;\\n } else if (lastNodeType == NodeType.BranchNode) {\\n if (keyRemainder.length == 0) {\\n // We've found a branch node with the given key.\\n // Simply need to update the value of the node to match.\\n newNodes[totalNewNodes] = _editBranchValue(lastNode, _value);\\n totalNewNodes += 1;\\n } else {\\n // We've found a branch node, but it doesn't contain our key.\\n // Reinsert the old branch for now.\\n newNodes[totalNewNodes] = lastNode;\\n totalNewNodes += 1;\\n // Create a new leaf node, slicing our remainder since the first byte points\\n // to our branch node.\\n newNodes[totalNewNodes] = _makeLeafNode(Lib_BytesUtils.slice(keyRemainder, 1), _value);\\n totalNewNodes += 1;\\n }\\n } else {\\n // Our last node is either an extension node or a leaf node with a different key.\\n bytes memory lastNodeKey = _getNodeKey(lastNode);\\n uint256 sharedNibbleLength = _getSharedNibbleLength(lastNodeKey, keyRemainder);\\n\\n if (sharedNibbleLength != 0) {\\n // We've got some shared nibbles between the last node and our key remainder.\\n // We'll need to insert an extension node that covers these shared nibbles.\\n bytes memory nextNodeKey = Lib_BytesUtils.slice(lastNodeKey, 0, sharedNibbleLength);\\n newNodes[totalNewNodes] = _makeExtensionNode(nextNodeKey, _getNodeHash(_value));\\n totalNewNodes += 1;\\n\\n // Cut down the keys since we've just covered these shared nibbles.\\n lastNodeKey = Lib_BytesUtils.slice(lastNodeKey, sharedNibbleLength);\\n keyRemainder = Lib_BytesUtils.slice(keyRemainder, sharedNibbleLength);\\n }\\n\\n // Create an empty branch to fill in.\\n TrieNode memory newBranch = _makeEmptyBranchNode();\\n\\n if (lastNodeKey.length == 0) {\\n // Key remainder was larger than the key for our last node.\\n // The value within our last node is therefore going to be shifted into\\n // a branch value slot.\\n newBranch = _editBranchValue(newBranch, _getNodeValue(lastNode));\\n } else {\\n // Last node key was larger than the key remainder.\\n // We're going to modify some index of our branch.\\n uint8 branchKey = uint8(lastNodeKey[0]);\\n // Move on to the next nibble.\\n lastNodeKey = Lib_BytesUtils.slice(lastNodeKey, 1);\\n\\n if (lastNodeType == NodeType.LeafNode) {\\n // We're dealing with a leaf node.\\n // We'll modify the key and insert the old leaf node into the branch index.\\n TrieNode memory modifiedLastNode = _makeLeafNode(lastNodeKey, _getNodeValue(lastNode));\\n newBranch = _editBranchIndex(newBranch, branchKey, _getNodeHash(modifiedLastNode.encoded));\\n } else if (lastNodeKey.length != 0) {\\n // We're dealing with a shrinking extension node.\\n // We need to modify the node to decrease the size of the key.\\n TrieNode memory modifiedLastNode = _makeExtensionNode(lastNodeKey, _getNodeValue(lastNode));\\n newBranch = _editBranchIndex(newBranch, branchKey, _getNodeHash(modifiedLastNode.encoded));\\n } else {\\n // We're dealing with an unnecessary extension node.\\n // We're going to delete the node entirely.\\n // Simply insert its current value into the branch index.\\n newBranch = _editBranchIndex(newBranch, branchKey, _getNodeValue(lastNode));\\n }\\n }\\n\\n if (keyRemainder.length == 0) {\\n // We've got nothing left in the key remainder.\\n // Simply insert the value into the branch value slot.\\n newBranch = _editBranchValue(newBranch, _value);\\n // Push the branch into the list of new nodes.\\n newNodes[totalNewNodes] = newBranch;\\n totalNewNodes += 1;\\n } else {\\n // We've got some key remainder to work with.\\n // We'll be inserting a leaf node into the trie.\\n // First, move on to the next nibble.\\n keyRemainder = Lib_BytesUtils.slice(keyRemainder, 1);\\n // Push the branch into the list of new nodes.\\n newNodes[totalNewNodes] = newBranch;\\n totalNewNodes += 1;\\n // Push a new leaf node for our k/v pair.\\n newNodes[totalNewNodes] = _makeLeafNode(keyRemainder, _value);\\n totalNewNodes += 1;\\n }\\n }\\n\\n // Finally, join the old path with our newly created nodes.\\n // Since we're overwriting the last node in the path, we use `_pathLength - 1`.\\n return _joinNodeArrays(_path, _pathLength - 1, newNodes, totalNewNodes);\\n }\\n\\n /**\\n * @notice Computes the trie root from a given path.\\n * @param _nodes Path to some k/v pair.\\n * @param _key Key for the k/v pair.\\n * @return _updatedRoot Root hash for the updated trie.\\n */\\n function _getUpdatedTrieRoot(\\n TrieNode[] memory _nodes,\\n bytes memory _key\\n )\\n private\\n pure\\n returns (\\n bytes32 _updatedRoot\\n )\\n {\\n bytes memory key = Lib_BytesUtils.toNibbles(_key);\\n\\n // Some variables to keep track of during iteration.\\n TrieNode memory currentNode;\\n NodeType currentNodeType;\\n bytes memory previousNodeHash;\\n\\n // Run through the path backwards to rebuild our root hash.\\n for (uint256 i = _nodes.length; i > 0; i--) {\\n // Pick out the current node.\\n currentNode = _nodes[i - 1];\\n currentNodeType = _getNodeType(currentNode);\\n\\n if (currentNodeType == NodeType.LeafNode) {\\n // Leaf nodes are already correctly encoded.\\n // Shift the key over to account for the nodes key.\\n bytes memory nodeKey = _getNodeKey(currentNode);\\n key = Lib_BytesUtils.slice(key, 0, key.length - nodeKey.length);\\n } else if (currentNodeType == NodeType.ExtensionNode) {\\n // Shift the key over to account for the nodes key.\\n bytes memory nodeKey = _getNodeKey(currentNode);\\n key = Lib_BytesUtils.slice(key, 0, key.length - nodeKey.length);\\n\\n // If this node is the last element in the path, it'll be correctly encoded\\n // and we can skip this part.\\n if (previousNodeHash.length > 0) {\\n // Re-encode the node based on the previous node.\\n currentNode = _makeExtensionNode(nodeKey, previousNodeHash);\\n }\\n } else if (currentNodeType == NodeType.BranchNode) {\\n // If this node is the last element in the path, it'll be correctly encoded\\n // and we can skip this part.\\n if (previousNodeHash.length > 0) {\\n // Re-encode the node based on the previous node.\\n uint8 branchKey = uint8(key[key.length - 1]);\\n key = Lib_BytesUtils.slice(key, 0, key.length - 1);\\n currentNode = _editBranchIndex(currentNode, branchKey, previousNodeHash);\\n }\\n }\\n\\n // Compute the node hash for the next iteration.\\n previousNodeHash = _getNodeHash(currentNode.encoded);\\n }\\n\\n // Current node should be the root at this point.\\n // Simply return the hash of its encoding.\\n return keccak256(currentNode.encoded);\\n }\\n\\n /**\\n * @notice Parses an RLP-encoded proof into something more useful.\\n * @param _proof RLP-encoded proof to parse.\\n * @return _parsed Proof parsed into easily accessible structs.\\n */\\n function _parseProof(\\n bytes memory _proof\\n )\\n private\\n pure\\n returns (\\n TrieNode[] memory _parsed\\n )\\n {\\n Lib_RLPReader.RLPItem[] memory nodes = Lib_RLPReader.readList(_proof);\\n TrieNode[] memory proof = new TrieNode[](nodes.length);\\n\\n for (uint256 i = 0; i < nodes.length; i++) {\\n bytes memory encoded = Lib_RLPReader.readBytes(nodes[i]);\\n proof[i] = TrieNode({\\n encoded: encoded,\\n decoded: Lib_RLPReader.readList(encoded)\\n });\\n }\\n\\n return proof;\\n }\\n\\n /**\\n * @notice Picks out the ID for a node. Node ID is referred to as the\\n * \\\"hash\\\" within the specification, but nodes < 32 bytes are not actually\\n * hashed.\\n * @param _node Node to pull an ID for.\\n * @return _nodeID ID for the node, depending on the size of its contents.\\n */\\n function _getNodeID(\\n Lib_RLPReader.RLPItem memory _node\\n )\\n private\\n pure\\n returns (\\n bytes32 _nodeID\\n )\\n {\\n bytes memory nodeID;\\n\\n if (_node.length < 32) {\\n // Nodes smaller than 32 bytes are RLP encoded.\\n nodeID = Lib_RLPReader.readRawBytes(_node);\\n } else {\\n // Nodes 32 bytes or larger are hashed.\\n nodeID = Lib_RLPReader.readBytes(_node);\\n }\\n\\n return Lib_BytesUtils.toBytes32(nodeID);\\n }\\n\\n /**\\n * @notice Gets the path for a leaf or extension node.\\n * @param _node Node to get a path for.\\n * @return _path Node path, converted to an array of nibbles.\\n */\\n function _getNodePath(\\n TrieNode memory _node\\n )\\n private\\n pure\\n returns (\\n bytes memory _path\\n )\\n {\\n return Lib_BytesUtils.toNibbles(Lib_RLPReader.readBytes(_node.decoded[0]));\\n }\\n\\n /**\\n * @notice Gets the key for a leaf or extension node. Keys are essentially\\n * just paths without any prefix.\\n * @param _node Node to get a key for.\\n * @return _key Node key, converted to an array of nibbles.\\n */\\n function _getNodeKey(\\n TrieNode memory _node\\n )\\n private\\n pure\\n returns (\\n bytes memory _key\\n )\\n {\\n return _removeHexPrefix(_getNodePath(_node));\\n }\\n\\n /**\\n * @notice Gets the path for a node.\\n * @param _node Node to get a value for.\\n * @return _value Node value, as hex bytes.\\n */\\n function _getNodeValue(\\n TrieNode memory _node\\n )\\n private\\n pure\\n returns (\\n bytes memory _value\\n )\\n {\\n return Lib_RLPReader.readBytes(_node.decoded[_node.decoded.length - 1]);\\n }\\n\\n /**\\n * @notice Computes the node hash for an encoded node. Nodes < 32 bytes\\n * are not hashed, all others are keccak256 hashed.\\n * @param _encoded Encoded node to hash.\\n * @return _hash Hash of the encoded node. Simply the input if < 32 bytes.\\n */\\n function _getNodeHash(\\n bytes memory _encoded\\n )\\n private\\n pure\\n returns (\\n bytes memory _hash\\n )\\n {\\n if (_encoded.length < 32) {\\n return _encoded;\\n } else {\\n return abi.encodePacked(keccak256(_encoded));\\n }\\n }\\n\\n /**\\n * @notice Determines the type for a given node.\\n * @param _node Node to determine a type for.\\n * @return _type Type of the node; BranchNode/ExtensionNode/LeafNode.\\n */\\n function _getNodeType(\\n TrieNode memory _node\\n )\\n private\\n pure\\n returns (\\n NodeType _type\\n )\\n {\\n if (_node.decoded.length == BRANCH_NODE_LENGTH) {\\n return NodeType.BranchNode;\\n } else if (_node.decoded.length == LEAF_OR_EXTENSION_NODE_LENGTH) {\\n bytes memory path = _getNodePath(_node);\\n uint8 prefix = uint8(path[0]);\\n\\n if (prefix == PREFIX_LEAF_EVEN || prefix == PREFIX_LEAF_ODD) {\\n return NodeType.LeafNode;\\n } else if (prefix == PREFIX_EXTENSION_EVEN || prefix == PREFIX_EXTENSION_ODD) {\\n return NodeType.ExtensionNode;\\n }\\n }\\n\\n revert(\\\"Invalid node type\\\");\\n }\\n\\n /**\\n * @notice Utility; determines the number of nibbles shared between two\\n * nibble arrays.\\n * @param _a First nibble array.\\n * @param _b Second nibble array.\\n * @return _shared Number of shared nibbles.\\n */\\n function _getSharedNibbleLength(\\n bytes memory _a,\\n bytes memory _b\\n )\\n private\\n pure\\n returns (\\n uint256 _shared\\n )\\n {\\n uint256 i = 0;\\n while (_a.length > i && _b.length > i && _a[i] == _b[i]) {\\n i++;\\n }\\n return i;\\n }\\n\\n /**\\n * @notice Utility; converts an RLP-encoded node into our nice struct.\\n * @param _raw RLP-encoded node to convert.\\n * @return _node Node as a TrieNode struct.\\n */\\n function _makeNode(\\n bytes[] memory _raw\\n )\\n private\\n pure\\n returns (\\n TrieNode memory _node\\n )\\n {\\n bytes memory encoded = Lib_RLPWriter.writeList(_raw);\\n\\n return TrieNode({\\n encoded: encoded,\\n decoded: Lib_RLPReader.readList(encoded)\\n });\\n }\\n\\n /**\\n * @notice Utility; converts an RLP-decoded node into our nice struct.\\n * @param _items RLP-decoded node to convert.\\n * @return _node Node as a TrieNode struct.\\n */\\n function _makeNode(\\n Lib_RLPReader.RLPItem[] memory _items\\n )\\n private\\n pure\\n returns (\\n TrieNode memory _node\\n )\\n {\\n bytes[] memory raw = new bytes[](_items.length);\\n for (uint256 i = 0; i < _items.length; i++) {\\n raw[i] = Lib_RLPReader.readRawBytes(_items[i]);\\n }\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Creates a new extension node.\\n * @param _key Key for the extension node, unprefixed.\\n * @param _value Value for the extension node.\\n * @return _node New extension node with the given k/v pair.\\n */\\n function _makeExtensionNode(\\n bytes memory _key,\\n bytes memory _value\\n )\\n private\\n pure\\n returns (\\n TrieNode memory _node\\n )\\n {\\n bytes[] memory raw = new bytes[](2);\\n bytes memory key = _addHexPrefix(_key, false);\\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\\n raw[1] = Lib_RLPWriter.writeBytes(_value);\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Creates a new leaf node.\\n * @dev This function is essentially identical to `_makeExtensionNode`.\\n * Although we could route both to a single method with a flag, it's\\n * more gas efficient to keep them separate and duplicate the logic.\\n * @param _key Key for the leaf node, unprefixed.\\n * @param _value Value for the leaf node.\\n * @return _node New leaf node with the given k/v pair.\\n */\\n function _makeLeafNode(\\n bytes memory _key,\\n bytes memory _value\\n )\\n private\\n pure\\n returns (\\n TrieNode memory _node\\n )\\n {\\n bytes[] memory raw = new bytes[](2);\\n bytes memory key = _addHexPrefix(_key, true);\\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\\n raw[1] = Lib_RLPWriter.writeBytes(_value);\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Creates an empty branch node.\\n * @return _node Empty branch node as a TrieNode struct.\\n */\\n function _makeEmptyBranchNode()\\n private\\n pure\\n returns (\\n TrieNode memory _node\\n )\\n {\\n bytes[] memory raw = new bytes[](BRANCH_NODE_LENGTH);\\n for (uint256 i = 0; i < raw.length; i++) {\\n raw[i] = RLP_NULL_BYTES;\\n }\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Modifies the value slot for a given branch.\\n * @param _branch Branch node to modify.\\n * @param _value Value to insert into the branch.\\n * @return _updatedNode Modified branch node.\\n */\\n function _editBranchValue(\\n TrieNode memory _branch,\\n bytes memory _value\\n )\\n private\\n pure\\n returns (\\n TrieNode memory _updatedNode\\n )\\n {\\n bytes memory encoded = Lib_RLPWriter.writeBytes(_value);\\n _branch.decoded[_branch.decoded.length - 1] = Lib_RLPReader.toRLPItem(encoded);\\n return _makeNode(_branch.decoded);\\n }\\n\\n /**\\n * @notice Modifies a slot at an index for a given branch.\\n * @param _branch Branch node to modify.\\n * @param _index Slot index to modify.\\n * @param _value Value to insert into the slot.\\n * @return _updatedNode Modified branch node.\\n */\\n function _editBranchIndex(\\n TrieNode memory _branch,\\n uint8 _index,\\n bytes memory _value\\n )\\n private\\n pure\\n returns (\\n TrieNode memory _updatedNode\\n )\\n {\\n bytes memory encoded = _value.length < 32 ? _value : Lib_RLPWriter.writeBytes(_value);\\n _branch.decoded[_index] = Lib_RLPReader.toRLPItem(encoded);\\n return _makeNode(_branch.decoded);\\n }\\n\\n /**\\n * @notice Utility; adds a prefix to a key.\\n * @param _key Key to prefix.\\n * @param _isLeaf Whether or not the key belongs to a leaf.\\n * @return _prefixedKey Prefixed key.\\n */\\n function _addHexPrefix(\\n bytes memory _key,\\n bool _isLeaf\\n )\\n private\\n pure\\n returns (\\n bytes memory _prefixedKey\\n )\\n {\\n uint8 prefix = _isLeaf ? uint8(0x02) : uint8(0x00);\\n uint8 offset = uint8(_key.length % 2);\\n bytes memory prefixed = new bytes(2 - offset);\\n prefixed[0] = bytes1(prefix + offset);\\n return abi.encodePacked(prefixed, _key);\\n }\\n\\n /**\\n * @notice Utility; removes a prefix from a path.\\n * @param _path Path to remove the prefix from.\\n * @return _unprefixedKey Unprefixed key.\\n */\\n function _removeHexPrefix(\\n bytes memory _path\\n )\\n private\\n pure\\n returns (\\n bytes memory _unprefixedKey\\n )\\n {\\n if (uint8(_path[0]) % 2 == 0) {\\n return Lib_BytesUtils.slice(_path, 2);\\n } else {\\n return Lib_BytesUtils.slice(_path, 1);\\n }\\n }\\n\\n /**\\n * @notice Utility; combines two node arrays. Array lengths are required\\n * because the actual lengths may be longer than the filled lengths.\\n * Array resizing is extremely costly and should be avoided.\\n * @param _a First array to join.\\n * @param _aLength Length of the first array.\\n * @param _b Second array to join.\\n * @param _bLength Length of the second array.\\n * @return _joined Combined node array.\\n */\\n function _joinNodeArrays(\\n TrieNode[] memory _a,\\n uint256 _aLength,\\n TrieNode[] memory _b,\\n uint256 _bLength\\n )\\n private\\n pure\\n returns (\\n TrieNode[] memory _joined\\n )\\n {\\n TrieNode[] memory ret = new TrieNode[](_aLength + _bLength);\\n\\n // Copy elements from the first array.\\n for (uint256 i = 0; i < _aLength; i++) {\\n ret[i] = _a[i];\\n }\\n\\n // Copy elements from the second array.\\n for (uint256 i = 0; i < _bLength; i++) {\\n ret[i + _aLength] = _b[i];\\n }\\n\\n return ret;\\n }\\n}\\n\",\"keccak256\":\"0x161f65220b8c5cf295232f8c58c2744fbc898bf77da5f9d9c5b2dd673dafc6f6\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/trie/Lib_SecureMerkleTrie.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_MerkleTrie } from \\\"./Lib_MerkleTrie.sol\\\";\\n\\n/**\\n * @title Lib_SecureMerkleTrie\\n */\\nlibrary Lib_SecureMerkleTrie {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * @notice Verifies a proof that a given key/value pair is present in the\\n * Merkle trie.\\n * @param _key Key of the node to search for, as a hex string.\\n * @param _value Value of the node to search for, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the desired node. Unlike\\n * traditional Merkle trees, this proof is executed top-down and consists\\n * of a list of RLP-encoded nodes that make a path down to the target node.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _verified `true` if the k/v pair exists in the trie, `false` otherwise.\\n */\\n function verifyInclusionProof(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bool _verified\\n )\\n {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.verifyInclusionProof(key, _value, _proof, _root);\\n }\\n\\n /**\\n * @notice Verifies a proof that a given key is *not* present in\\n * the Merkle trie.\\n * @param _key Key of the node to search for, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\\n * target node.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _verified `true` if the key is not present in the trie, `false` otherwise.\\n */\\n function verifyExclusionProof(\\n bytes memory _key,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bool _verified\\n )\\n {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.verifyExclusionProof(key, _proof, _root);\\n }\\n\\n /**\\n * @notice Updates a Merkle trie and returns a new root hash.\\n * @param _key Key of the node to update, as a hex string.\\n * @param _value Value of the node to update, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\\n * target node. If the key exists, we can simply update the value.\\n * Otherwise, we need to modify the trie to handle the new k/v pair.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _updatedRoot Root hash of the newly constructed trie.\\n */\\n function update(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bytes32 _updatedRoot\\n )\\n {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.update(key, _value, _proof, _root);\\n }\\n\\n /**\\n * @notice Retrieves the value associated with a given key.\\n * @param _key Key to search for, as hex bytes.\\n * @param _proof Merkle trie inclusion proof for the key.\\n * @param _root Known root of the Merkle trie.\\n * @return _exists Whether or not the key exists.\\n * @return _value Value of the key if it exists.\\n */\\n function get(\\n bytes memory _key,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bool _exists,\\n bytes memory _value\\n )\\n {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.get(key, _proof, _root);\\n }\\n\\n /**\\n * Computes the root hash for a trie with a single node.\\n * @param _key Key for the single node.\\n * @param _value Value for the single node.\\n * @return _updatedRoot Hash of the trie.\\n */\\n function getSingleNodeRootHash(\\n bytes memory _key,\\n bytes memory _value\\n )\\n internal\\n pure\\n returns (\\n bytes32 _updatedRoot\\n )\\n {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.getSingleNodeRootHash(key, _value);\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Computes the secure counterpart to a key.\\n * @param _key Key to get a secure key from.\\n * @return _secureKey Secure version of the key.\\n */\\n function _getSecureKey(\\n bytes memory _key\\n )\\n private\\n pure\\n returns (\\n bytes memory _secureKey\\n )\\n {\\n return abi.encodePacked(keccak256(_key));\\n }\\n}\",\"keccak256\":\"0x79355346f74bb1eb9eeb733cb5d9677d50115c4f390307cbf608fe071a1ada0c\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_Bytes32Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_Byte32Utils\\n */\\nlibrary Lib_Bytes32Utils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \\\"true.\\\"\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as a boolean.\\n */\\n function toBool(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return _in != 0;\\n }\\n\\n /**\\n * Converts a boolean to a bytes32 value.\\n * @param _in Input boolean value.\\n * @return Boolean as a bytes32.\\n */\\n function fromBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in ? 1 : 0));\\n }\\n\\n /**\\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as an address.\\n */\\n function toAddress(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return address(uint160(uint256(_in)));\\n }\\n\\n /**\\n * Converts an address to a bytes32.\\n * @param _in Input address value.\\n * @return Address as a bytes32.\\n */\\n function fromAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in));\\n }\\n\\n /**\\n * Removes the leading zeros from a bytes32 value and returns a new (smaller) bytes value.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 without any leading zeros.\\n */\\n function removeLeadingZeros(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out;\\n\\n assembly {\\n // Figure out how many leading zero bytes to remove.\\n let shift := 0\\n for { let i := 0 } and(lt(i, 32), eq(byte(i, _in), 0)) { i := add(i, 1) } {\\n shift := add(shift, 1)\\n }\\n\\n // Reserve some space for our output and fix the free memory pointer.\\n out := mload(0x40)\\n mstore(0x40, add(out, 0x40))\\n\\n // Shift the value and store it into the output bytes.\\n mstore(add(out, 0x20), shl(mul(shift, 8), _in))\\n\\n // Store the new size (with leading zero bytes removed) in the output byte size.\\n mstore(out, sub(32, shift))\\n }\\n\\n return out;\\n }\\n}\\n\",\"keccak256\":\"0xfa2def593e3fc56a31852c3744aefdaa93cec74e721bfcfeb1e5d166c7c60b64\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_BytesUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_BytesUtils\\n */\\nlibrary Lib_BytesUtils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_start + _length >= _start, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n if (_bytes.length - _start == 0) {\\n return bytes('');\\n }\\n\\n return slice(_bytes, _start, _bytes.length - _start);\\n }\\n\\n function toBytes32PadLeft(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n bytes32 ret;\\n uint256 len = _bytes.length <= 32 ? _bytes.length : 32;\\n assembly {\\n ret := shr(mul(sub(32, len), 8), mload(add(_bytes, 32)))\\n }\\n return ret;\\n }\\n\\n function toBytes32(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n if (_bytes.length < 32) {\\n bytes32 ret;\\n assembly {\\n ret := mload(add(_bytes, 32))\\n }\\n return ret;\\n }\\n\\n return abi.decode(_bytes,(bytes32)); // will truncate if input length > 32 bytes\\n }\\n\\n function toUint256(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return uint256(toBytes32(_bytes));\\n }\\n\\n function toUint24(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n uint24\\n )\\n {\\n require(_start + 3 >= _start, \\\"toUint24_overflow\\\");\\n require(_bytes.length >= _start + 3 , \\\"toUint24_outOfBounds\\\");\\n uint24 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x3), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toUint8(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n uint8\\n )\\n {\\n require(_start + 1 >= _start, \\\"toUint8_overflow\\\");\\n require(_bytes.length >= _start + 1 , \\\"toUint8_outOfBounds\\\");\\n uint8 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x1), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toAddress(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n require(_start + 20 >= _start, \\\"toAddress_overflow\\\");\\n require(_bytes.length >= _start + 20, \\\"toAddress_outOfBounds\\\");\\n address tempAddress;\\n\\n assembly {\\n tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000)\\n }\\n\\n return tempAddress;\\n }\\n\\n function toNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory nibbles = new bytes(_bytes.length * 2);\\n\\n for (uint256 i = 0; i < _bytes.length; i++) {\\n nibbles[i * 2] = _bytes[i] >> 4;\\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\\n }\\n\\n return nibbles;\\n }\\n\\n function fromNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory ret = new bytes(_bytes.length / 2);\\n\\n for (uint256 i = 0; i < ret.length; i++) {\\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\\n }\\n\\n return ret;\\n }\\n\\n function equal(\\n bytes memory _bytes,\\n bytes memory _other\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return keccak256(_bytes) == keccak256(_other);\\n }\\n}\\n\",\"keccak256\":\"0xa5195afe32fb2cf104d156e8f4bd39df1ec79bf6ba232097b9e8e0ee14fbc298\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_EthUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// @unsupported: ovm\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"./Lib_Bytes32Utils.sol\\\";\\n\\n/**\\n * @title Lib_EthUtils\\n */\\nlibrary Lib_EthUtils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Gets the code for a given address.\\n * @param _address Address to get code for.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Code read from the contract.\\n */\\n function getCode(\\n address _address,\\n uint256 _offset,\\n uint256 _length\\n )\\n internal\\n view\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory code;\\n assembly {\\n code := mload(0x40)\\n mstore(0x40, add(code, add(_length, 0x20)))\\n mstore(code, _length)\\n extcodecopy(_address, add(code, 0x20), _offset, _length)\\n }\\n\\n return code;\\n }\\n\\n /**\\n * Gets the full code for a given address.\\n * @param _address Address to get code for.\\n * @return Full code of the contract.\\n */\\n function getCode(\\n address _address\\n )\\n internal\\n view\\n returns (\\n bytes memory\\n )\\n {\\n return getCode(\\n _address,\\n 0,\\n getCodeSize(_address)\\n );\\n }\\n\\n /**\\n * Gets the size of a contract's code in bytes.\\n * @param _address Address to get code size for.\\n * @return Size of the contract's code in bytes.\\n */\\n function getCodeSize(\\n address _address\\n )\\n internal\\n view\\n returns (\\n uint256\\n )\\n {\\n uint256 codeSize;\\n assembly {\\n codeSize := extcodesize(_address)\\n }\\n\\n return codeSize;\\n }\\n\\n /**\\n * Gets the hash of a contract's code.\\n * @param _address Address to get a code hash for.\\n * @return Hash of the contract's code.\\n */\\n function getCodeHash(\\n address _address\\n )\\n internal\\n view\\n returns (\\n bytes32\\n )\\n {\\n bytes32 codeHash;\\n assembly {\\n codeHash := extcodehash(_address)\\n }\\n\\n return codeHash;\\n }\\n\\n /**\\n * Creates a contract with some given initialization code.\\n * @param _code Contract initialization code.\\n * @return Address of the created contract.\\n */\\n function createContract(\\n bytes memory _code\\n )\\n internal\\n returns (\\n address\\n )\\n {\\n address created;\\n assembly {\\n created := create(\\n 0,\\n add(_code, 0x20),\\n mload(_code)\\n )\\n }\\n\\n return created;\\n }\\n\\n /**\\n * Computes the address that would be generated by CREATE.\\n * @param _creator Address creating the contract.\\n * @param _nonce Creator's nonce.\\n * @return Address to be generated by CREATE.\\n */\\n function getAddressForCREATE(\\n address _creator,\\n uint256 _nonce\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n bytes[] memory encoded = new bytes[](2);\\n encoded[0] = Lib_RLPWriter.writeAddress(_creator);\\n encoded[1] = Lib_RLPWriter.writeUint(_nonce);\\n\\n bytes memory encodedList = Lib_RLPWriter.writeList(encoded);\\n return Lib_Bytes32Utils.toAddress(keccak256(encodedList));\\n }\\n\\n /**\\n * Computes the address that would be generated by CREATE2.\\n * @param _creator Address creating the contract.\\n * @param _bytecode Bytecode of the contract to be created.\\n * @param _salt 32 byte salt value mixed into the hash.\\n * @return Address to be generated by CREATE2.\\n */\\n function getAddressForCREATE2(\\n address _creator,\\n bytes memory _bytecode,\\n bytes32 _salt\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n bytes32 hashedData = keccak256(abi.encodePacked(\\n byte(0xff),\\n _creator,\\n _salt,\\n keccak256(_bytecode)\\n ));\\n\\n return Lib_Bytes32Utils.toAddress(hashedData);\\n }\\n}\\n\",\"keccak256\":\"0xf29a67d78e61cb472d524b779b32cfcb39a587f4096500d5419e6425ed367d49\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x608060405234801561001057600080fd5b506040516149b93803806149b98339818101604052602081101561003357600080fd5b5051600080546001600160a01b039092166001600160a01b0319909216919091179055614954806100656000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c806322d1470214610046578063299ca4781461009a578063461a4478146100a2575b600080fd5b61007e6004803603608081101561005c57600080fd5b506001600160a01b038135169060208101359060408101359060600135610148565b604080516001600160a01b039092168252519081900360200190f35b61007e610229565b61007e600480360360208110156100b857600080fd5b8101906020810181356401000000008111156100d357600080fd5b8201836020820111156100e557600080fd5b8035906020019184600183028401116401000000008311171561010757600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610238945050505050565b600061017c6040518060400160405280601181526020017027ab26afa33930bab22b32b934b334b2b960791b815250610238565b6001600160a01b0316336001600160a01b0316146101cb5760405162461bcd60e51b81526004018080602001828103825260318152602001806148ee6031913960400191505060405180910390fd5b848484846040516101db90610314565b80856001600160a01b03168152602001848152602001838152602001828152602001945050505050604051809103906000f08015801561021f573d6000803e3d6000fd5b5095945050505050565b6000546001600160a01b031681565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b83811015610298578181015183820152602001610280565b50505050905090810190601f1680156102c55780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b1580156102e257600080fd5b505afa1580156102f6573d6000803e3d6000fd5b505050506040513d602081101561030c57600080fd5b505192915050565b6145cc806103228339019056fe60806040523480156200001157600080fd5b50604051620045cc380380620045cc833981016040819052620000349162000232565b600080546001600160a01b0319166001600160a01b038616179055600583905560028290556003829055600681905560408051808201909152601781527f4f564d5f53746174654d616e61676572466163746f72790000000000000000006020820152620000a29062000150565b6001600160a01b0316639ed93318306040518263ffffffff1660e01b8152600401620000cf919062000299565b602060405180830381600087803b158015620000ea57600080fd5b505af1158015620000ff573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000125919062000273565b600180546001600160a01b0319166001600160a01b039290921691909117905550620002c692505050565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b83811015620001b257818101518382015260200162000198565b50505050905090810190601f168015620001e05780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b158015620001fe57600080fd5b505afa15801562000213573d6000803e3d6000fd5b505050506040513d60208110156200022a57600080fd5b505192915050565b6000806000806080858703121562000248578384fd5b84516200025581620002ad565b60208601516040870151606090970151919890975090945092505050565b60006020828403121562000285578081fd5b81516200029281620002ad565b9392505050565b6001600160a01b0391909116815260200190565b6001600160a01b0381168114620002c357600080fd5b50565b6142f680620002d66000396000f3fe608060405234801561001057600080fd5b50600436106100cf5760003560e01c8063845fe7a31161008c578063b2fa1c9e11610066578063b2fa1c9e14610185578063b52805711461019a578063b9194310146101a2578063c1c618b8146101b5576100cf565b8063845fe7a314610155578063a244316a14610168578063b1c9fe6e14610170576100cf565b8063299ca478146100d45780632e1ac36c146100f25780632eb1375814610107578063461a44781461011a578063732f960b1461012d578063805e9d3014610140575b600080fd5b6100dc6101bd565b6040516100e99190613c74565b60405180910390f35b6101056101003660046138d0565b6101cc565b005b610105610115366004613910565b610565565b6100dc6101283660046139f8565b6108a1565b61010561013b366004613abc565b61097f565b610148610c6f565b6040516100e99190613bcd565b6101056101633660046138d0565b610c75565b610105610fa1565b610178611128565b6040516100e99190613d26565b61018d611131565b6040516100e99190613d1b565b6100dc61114c565b6101056101b0366004613871565b61115b565b610148611475565b6000546001600160a01b031681565b60018060045460ff1660028111156101e057fe5b146102065760405162461bcd60e51b81526004016101fd90614077565b60405180910390fd5b60025460065460005a6001546040516363b285f960e11b81529192506001600160a01b03169063c7650bf290610242908a908a90600401613c88565b602060405180830381600087803b15801561025c57600080fd5b505af1158015610270573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610294919061395d565b15156001146102b55760405162461bcd60e51b81526004016101fd90613e22565b60015460405163fbcbc0f160e01b81526000916001600160a01b03169063fbcbc0f1906102e6908b90600401613c74565b60c06040518083038186803b1580156102fe57600080fd5b505afa158015610312573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103369190613a3d565b600154604051631aaf392f60e01b81529192506000916001600160a01b0390911690631aaf392f9061036e908c908c90600401613c88565b60206040518083038186803b15801561038657600080fd5b505afa15801561039a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103be9190613977565b90506103ff886040516020016103d49190613bcd565b6040516020818303038152906040526103f46103ef8461147b565b6114c4565b89856040015161152e565b6040808401919091526001549051638f3b964760e01b81526001600160a01b0390911690638f3b964790610439908c908690600401613cc2565b600060405180830381600087803b15801561045357600080fd5b505af1158015610467573d6000803e3d6000fd5b505050507f3e3ed1a676a2754a041b49bf752e0f167c8753495e36c320fe01d1ef7476253c898960405161049c929190613c88565b60405180910390a1505060005a820390506104dd6040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506108a1565b6001600160a01b0316631e16e92f858533856040518563ffffffff1660e01b815260040180858152602001848152602001836001600160a01b03168152602001828152602001945050505050600060405180830381600087803b15801561054357600080fd5b505af1158015610557573d6000803e3d6000fd5b505050505050505050505050565b60018060045460ff16600281111561057957fe5b146105965760405162461bcd60e51b81526004016101fd90614077565b60025460065460005a9050600160009054906101000a90046001600160a01b03166001600160a01b03166399056ba96040518163ffffffff1660e01b815260040160206040518083038186803b1580156105ef57600080fd5b505afa158015610603573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106279190613977565b156106445760405162461bcd60e51b81526004016101fd90613f03565b600154604051630b38106960e11b81526001600160a01b039091169063167020d290610674908990600401613c74565b602060405180830381600087803b15801561068e57600080fd5b505af11580156106a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106c6919061395d565b15156001146106e75760405162461bcd60e51b81526004016101fd90613fbd565b60015460405163fbcbc0f160e01b81526000916001600160a01b03169063fbcbc0f190610718908a90600401613c74565b60c06040518083038186803b15801561073057600080fd5b505afa158015610744573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107689190613a3d565b90506107a78760405160200161077e9190613bb0565b60405160208183030381529060405261079e61079984611554565b611594565b8860035461152e565b6003556040517fcec9ef675d775706a02b43afe48af52c5019bc50f99582e3208c6ff55d59c008906107da908990613c74565b60405180910390a15060005a8203905061081a6040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506108a1565b6001600160a01b0316631e16e92f858533856040518563ffffffff1660e01b815260040180858152602001848152602001836001600160a01b03168152602001828152602001945050505050600060405180830381600087803b15801561088057600080fd5b505af1158015610894573d6000803e3d6000fd5b5050505050505050505050565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b838110156109015781810151838201526020016108e9565b50505050905090810190601f16801561092e5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561094b57600080fd5b505afa15801561095f573d6000803e3d6000fd5b505050506040513d602081101561097557600080fd5b505190505b919050565b60008060045460ff16600281111561099357fe5b146109b05760405162461bcd60e51b81526004016101fd90614077565b60025460065460005a90506006546109c78661169d565b146109e45760405162461bcd60e51b81526004016101fd906140c8565b6103e88560a0015161040802816109f757fe5b04620186a0015a1015610a1c5760405162461bcd60e51b81526004016101fd90613f60565b6000610a536040518060400160405280601481526020017327ab26afa2bc32b1baba34b7b726b0b730b3b2b960611b8152506108a1565b600154604051631381ba4d60e01b81529192506001600160a01b031690631381ba4d90610a84908490600401613c74565b600060405180830381600087803b158015610a9e57600080fd5b505af1158015610ab2573d6000803e3d6000fd5b5050600154604051639be3ad6760e01b81526001600160a01b038086169450639be3ad679350610ae9928b9291169060040161415c565b600060405180830381600087803b158015610b0357600080fd5b505af1158015610b17573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610b3f919081019061398f565b50600154604051631381ba4d60e01b81526001600160a01b0390911690631381ba4d90610b7190600090600401613c74565b600060405180830381600087803b158015610b8b57600080fd5b505af1158015610b9f573d6000803e3d6000fd5b50506004805460ff191660011790555060009150505a82039050610be96040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506108a1565b6001600160a01b0316631e16e92f858533856040518563ffffffff1660e01b815260040180858152602001848152602001836001600160a01b03168152602001828152602001945050505050600060405180830381600087803b158015610c4f57600080fd5b505af1158015610c63573d6000803e3d6000fd5b50505050505050505050565b60025490565b60008060045460ff166002811115610c8957fe5b14610ca65760405162461bcd60e51b81526004016101fd90614077565b60025460065460005a600154604051630ad2267960e01b81529192506001600160a01b031690630ad2267990610ce2908a908a90600401613c88565b60206040518083038186803b158015610cfa57600080fd5b505afa158015610d0e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d32919061395d565b15610d4f5760405162461bcd60e51b81526004016101fd90613d3a565b60015460405163c8e40fbf60e01b81526001600160a01b039091169063c8e40fbf90610d7f908a90600401613c74565b60206040518083038186803b158015610d9757600080fd5b505afa158015610dab573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dcf919061395d565b1515600114610df05760405162461bcd60e51b81526004016101fd906140ff565b60015460405163136e2d8960e11b81526000916001600160a01b0316906326dc5b1290610e21908b90600401613c74565b60206040518083038186803b158015610e3957600080fd5b505afa158015610e4d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e719190613977565b905060007f56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421821415610ea557506000610f02565b600080610ed28a604051602001610ebc9190613bcd565b6040516020818303038152906040528a866116b6565b909250905060018215151415610efa57610ef3610eee826116df565b6116f2565b9250610eff565b600092505b50505b600154604051635c17d62960e01b81526001600160a01b0390911690635c17d62990610f36908c908c908690600401613ca1565b600060405180830381600087803b158015610f5057600080fd5b505af1158015610f64573d6000803e3d6000fd5b50505050505060005a820390506104dd6040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506108a1565b60018060045460ff166002811115610fb557fe5b14610fd25760405162461bcd60e51b81526004016101fd90614077565b600160009054906101000a90046001600160a01b03166001600160a01b031663d7bd4a2a6040518163ffffffff1660e01b815260040160206040518083038186803b15801561102057600080fd5b505afa158015611034573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110589190613977565b156110755760405162461bcd60e51b81526004016101fd90613dc5565b600160009054906101000a90046001600160a01b03166001600160a01b03166399056ba96040518163ffffffff1660e01b815260040160206040518083038186803b1580156110c357600080fd5b505afa1580156110d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110fb9190613977565b156111185760405162461bcd60e51b81526004016101fd9061401a565b506004805460ff19166002179055565b60045460ff1681565b6000600260045460ff16600281111561114657fe5b14905090565b6001546001600160a01b031681565b60008060045460ff16600281111561116f57fe5b1461118c5760405162461bcd60e51b81526004016101fd90614077565b60025460065460005a60015460405163c8e40fbf60e01b81529192506001600160a01b03169063c8e40fbf906111c6908a90600401613c74565b60206040518083038186803b1580156111de57600080fd5b505afa1580156111f2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611216919061395d565b1580156112a057506001546040516307a1294560e01b81526001600160a01b03909116906307a129459061124e908a90600401613c74565b60206040518083038186803b15801561126657600080fd5b505afa15801561127a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061129e919061395d565b155b6112bc5760405162461bcd60e51b81526004016101fd90613d7f565b6000806112eb896040516020016112d39190613bb0565b604051602081830303815290604052886002546116b6565b90925090506001821515141561140c57600061130682611721565b606081015190915089907fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470141561133f5750600061136a565b816060015161134d826117b3565b1461136a5760405162461bcd60e51b81526004016101fd90613e80565b6001546040805160c08101825284518152602080860151908201528482015181830152606080860151908201526001600160a01b038481166080830152600060a08301529151638f3b964760e01b81529190921691638f3b9647916113d3918f91600401613cc2565b600060405180830381600087803b1580156113ed57600080fd5b505af1158015611401573d6000803e3d6000fd5b50505050505061143c565b600154604051630d631c9d60e31b81526001600160a01b0390911690636b18e4e890610f36908c90600401613c74565b505060005a820390506104dd6040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506108a1565b60035490565b6060806000805b6020811085821a15161561149c5760019182019101611482565b5060405191506040820160405283600882021b60208301528060200382525080915050919050565b606080825160011480156114ec57506080836000815181106114e257fe5b016020015160f81c105b156114f8575081611528565b611504835160806117b7565b83604051602001611516929190613bd6565b60405160208183030381529060405290505b92915050565b60008061153a86611906565b905061154881868686611936565b9150505b949350505050565b61155c61378f565b604051806080016040528083600001518152602001836020015181526020018360400151815260200183606001518152509050919050565b60408051600480825260a0820190925260609160009190816020015b60608152602001906001900390816115b057505083519091506115d6906103ef9061147b565b816000815181106115e357fe5b60200260200101819052506116016103ef846020015160001b61147b565b8160018151811061160e57fe5b602002602001018190525061164583604001516040516020016116319190613bcd565b6040516020818303038152906040526114c4565b8160028151811061165257fe5b602002602001018190525061167583606001516040516020016116319190613bcd565b8160038151811061168257fe5b6020026020010181905250611696816119d1565b9392505050565b60006116a882611a15565b805190602001209050919050565b6000606060006116c586611906565b90506116d2818686611a50565b9250925050935093915050565b60606115286116ed83611b23565b611b48565b600080600060208451111561170857602061170b565b83515b6020858101519190036008021c92505050919050565b61172961378f565b600061173483611bd7565b9050604051806080016040528061175e8360008151811061175157fe5b6020026020010151611bea565b81526020016117738360018151811061175157fe5b81526020016117958360028151811061178857fe5b6020026020010151611bf1565b81526020016117aa8360038151811061178857fe5b90529392505050565b3f90565b6060806038841015611811576040805160018082528183019092529060208201818036833701905050905082840160f81b816000815181106117f557fe5b60200101906001600160f81b031916908160001a905350611696565b600060015b80868161181f57fe5b04156118345760019091019061010002611816565b816001016001600160401b038111801561184d57600080fd5b506040519080825280601f01601f191660200182016040528015611878576020820181803683370190505b50925084820160370160f81b8360008151811061189157fe5b60200101906001600160f81b031916908160001a905350600190505b8181116118fd576101008183036101000a87816118c657fe5b04816118ce57fe5b0660f81b8382815181106118de57fe5b60200101906001600160f81b031916908160001a9053506001016118ad565b50509392505050565b606081805190602001206040516020016119209190613bcd565b6040516020818303038152906040529050919050565b6040805180820190915260018152600160ff1b60209091015260007f56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42182141561198a576119838585611ceb565b905061154c565b600061199584611d0f565b90506000806119a5838987611de5565b509150915060006119b88484848b612188565b90506119c4818a6124a0565b9998505050505050505050565b606060006119de836125f9565b90506119ec815160c06117b7565b816040516020016119fe929190613bd6565b604051602081830303815290604052915050919050565b6060816000015182602001518360400151846060015185608001518660a001518760c001516040516020016119209796959493929190613c05565b600060606000611a5f85611d0f565b90506000806000611a71848a89611de5565b81519295509093509150158080611a855750815b611ad6576040805162461bcd60e51b815260206004820152601a60248201527f50726f76696465642070726f6f6620697320696e76616c69642e000000000000604482015290519081900360640190fd5b600081611af25760405180602001604052806000815250611b11565b611b11866001870381518110611b0457fe5b6020026020010151612702565b919b919a509098505050505050505050565b611b2b6137b6565b506040805180820190915281518152602082810190820152919050565b60606000806000611b588561271e565b919450925090506000816001811115611b6d57fe5b14611bbf576040805162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c502062797465732076616c75652e0000000000000000604482015290519081900360640190fd5b611bce85602001518484612a47565b95945050505050565b6060611528611be583611b23565b612af4565b6000611528825b6000602182600001511115611c4d576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e000000000000604482015290519081900360640190fd5b6000806000611c5b8561271e565b919450925090506000816001811115611c7057fe5b14611cc2576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e000000000000604482015290519081900360640190fd5b602080860151840180519091841015611ce15760208490036101000a90045b9695505050505050565b6000611cff611cf984612c6a565b83612d66565b5180516020909101209392505050565b60606000611d1c83611bd7565b9050600081516001600160401b0381118015611d3757600080fd5b50604051908082528060200260200182016040528015611d7157816020015b611d5e6137d0565b815260200190600190039081611d565790505b50905060005b8251811015611ddd576000611d9e848381518110611d9157fe5b6020026020010151611b48565b90506040518060400160405280828152602001611dba83611bd7565b815250838381518110611dc957fe5b602090810291909101015250600101611d77565b509392505050565b60006060818080611df587612c6a565b905085600080611e036137d0565b60005b8c51811015612160578c8181518110611e1b57fe5b6020026020010151915082840193506001870196508360001415611e8f57815180516020909101208514611e8a576040805162461bcd60e51b8152602060048201526011602482015270092dcecc2d8d2c840e4dedee840d0c2e6d607b1b604482015290519081900360640190fd5b611f56565b815151602011611ef657815180516020909101208514611e8a576040805162461bcd60e51b815260206004820152601b60248201527f496e76616c6964206c6172676520696e7465726e616c20686173680000000000604482015290519081900360640190fd5b84611f048360000151612dfa565b14611f56576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420696e7465726e616c206e6f64652068617368000000000000604482015290519081900360640190fd5b60208201515160111415611fc5578551841415611f7257612160565b6000868581518110611f8057fe5b602001015160f81c60f81b60f81c9050600083602001518260ff1681518110611fa557fe5b60200260200101519050611fb881612e26565b9650600194505050612158565b6002826020015151141561210b576000611fde83612e5c565b9050600081600081518110611fef57fe5b016020015160f81c905060018116600203600061200f8460ff8416612e7a565b9050600061201d8b8a612e7a565b9050600061202b8383612eab565b905060ff851660021480612042575060ff85166003145b15612074578083511480156120575750808251145b1561206157988901985b50600160ff1b9950612160945050505050565b60ff85161580612087575060ff85166001145b156120d457806120a45750600160ff1b9950612160945050505050565b6120c588602001516001815181106120b857fe5b6020026020010151612e26565b9a509750612158945050505050565b60405162461bcd60e51b815260040180806020018281038252602681526020018061429b6026913960400191505060405180910390fd5b6040805162461bcd60e51b815260206004820152601d60248201527f526563656976656420616e20756e706172736561626c65206e6f64652e000000604482015290519081900360640190fd5b600101611e06565b50600160ff1b8414866121738786612e7a565b909e909d50909b509950505050505050505050565b6060600083905060008660018703815181106121a057fe5b6020026020010151905060006121b582612f11565b6040805160038082526080820190925291925060009190816020015b6121d96137d0565b8152602001906001900390816121d157905050905060008451600014801561220c5750600283600281111561220a57fe5b145b156122425761222361221d85612fe7565b88612d66565b82828151811061222f57fe5b6020908102919091010152600101612483565b600083600281111561225057fe5b14156122b6578451612285576122668488612ffa565b82828151811061227257fe5b60209081029190910101526001016122b1565b8382828151811061229257fe5b602002602001018190525060018101905061222361221d866001612e7a565b612483565b60006122c185612fe7565b905060006122cf8288612eab565b905080156123305760006122e583600084613045565b90506122f9816122f48c613195565b6131d6565b85858151811061230557fe5b60200260200101819052506001840193506123208383612e7a565b925061232c8883612e7a565b9750505b600061233a61321a565b905082516000141561235f576123588161235389612702565b612ffa565b90506123f7565b60008360008151811061236e57fe5b016020015160f81c9050612383846001612e7a565b9350600287600281111561239357fe5b14156123ce5760006123ad856123a88b612702565b612d66565b90506123c683836123c18460000151613195565b6132a7565b9250506123f5565b8351156123e45760006123ad856122f48b612702565b6123f282826123c18b612702565b91505b505b875161242c57612407818b612ffa565b90508085858151811061241657fe5b602002602001018190525060018401935061247f565b612437886001612e7a565b97508085858151811061244657fe5b6020026020010181905250600184019350612461888b612d66565b85858151811061246d57fe5b60200260200101819052506001840193505b5050505b6124928a60018b038484613300565b9a9950505050505050505050565b6000806124ac83612c6a565b90506124b66137d0565b84516000906060905b80156125e4578760018203815181106124d457fe5b602002602001015193506124e784612f11565b925060028360028111156124f757fe5b141561252257600061250885612fe7565b905061251a8660008351895103613045565b9550506125ce565b600183600281111561253057fe5b141561257057600061254185612fe7565b90506125538660008351895103613045565b83519096501561256a5761256781846131d6565b94505b506125ce565b600083600281111561257e57fe5b14156125ce578151156125ce5760008560018751038151811061259d57fe5b602001015160f81c60f81b60f81c90506125bd8660006001895103613045565b95506125ca8582856132a7565b9450505b83516125d990613195565b9150600019016124bf565b50509051805160209091012095945050505050565b606081516000141561261a575060408051600081526020810190915261097a565b6000805b835181101561264d5783818151811061263357fe5b60200260200101515182019150808060010191505061261e565b6000826001600160401b038111801561266557600080fd5b506040519080825280601f01601f191660200182016040528015612690576020820181803683370190505b50600092509050602081015b85518310156126f95760008684815181106126b357fe5b6020026020010151905060006020820190506126d1838284516133e2565b8785815181106126dd57fe5b602002602001015151830192505050828060010193505061269c565b50949350505050565b60208101518051606091611528916000198101908110611d9157fe5b60008060008084600001511161277b576040805162461bcd60e51b815260206004820152601860248201527f524c50206974656d2063616e6e6f74206265206e756c6c2e0000000000000000604482015290519081900360640190fd5b6020840151805160001a607f81116127a0576000600160009450945094505050612a40565b60b78111612815578551607f198201908110612803576040805162461bcd60e51b815260206004820152601960248201527f496e76616c696420524c502073686f727420737472696e672e00000000000000604482015290519081900360640190fd5b60019550935060009250612a40915050565b60bf81116128f957855160b6198201908110612878576040805162461bcd60e51b815260206004820152601f60248201527f496e76616c696420524c50206c6f6e6720737472696e67206c656e6774682e00604482015290519081900360640190fd5b6000816020036101000a60018501510490508082018860000151116128e4576040805162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c50206c6f6e6720737472696e672e0000000000000000604482015290519081900360640190fd5b60019091019550935060009250612a40915050565b60f7811161296d57855160bf19820190811061295c576040805162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c502073686f7274206c6973742e000000000000000000604482015290519081900360640190fd5b600195509350849250612a40915050565b855160f61982019081106129c8576040805162461bcd60e51b815260206004820152601d60248201527f496e76616c696420524c50206c6f6e67206c697374206c656e6774682e000000604482015290519081900360640190fd5b6000816020036101000a6001850151049050808201886000015111612a2d576040805162461bcd60e51b815260206004820152601660248201527524b73b30b634b210292628103637b733903634b9ba1760511b604482015290519081900360640190fd5b6001918201965094509250612a40915050565b9193909250565b60606000826001600160401b0381118015612a6157600080fd5b506040519080825280601f01601f191660200182016040528015612a8c576020820181803683370190505b509050805160001415612aa0579050611696565b8484016020820160005b60208604811015612acb578251825260209283019290910190600101612aaa565b5080519151601f959095166020036101000a600019019182169119909416179092525092915050565b6060600080612b028461271e565b91935090915060019050816001811115612b1857fe5b14612b6a576040805162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c50206c6973742076616c75652e000000000000000000604482015290519081900360640190fd5b6040805160208082526104208201909252600091816020015b612b8b6137b6565b815260200190600190039081612b835790505090506000835b8651811015612c5f5760208210612bec5760405162461bcd60e51b815260040180806020018281038252602a815260200180614271602a913960400191505060405180910390fd5b600080612c186040518060400160405280858c60000151038152602001858c602001510181525061271e565b509150915060405180604001604052808383018152602001848b6020015101815250858581518110612c4657fe5b6020908102919091010152600193909301920101612ba4565b508152949350505050565b6060600082516002026001600160401b0381118015612c8857600080fd5b506040519080825280601f01601f191660200182016040528015612cb3576020820181803683370190505b50905060005b8351811015612d5f576004848281518110612cd057fe5b602001015160f81c60f81b6001600160f81b031916901c828260020281518110612cf657fe5b60200101906001600160f81b031916908160001a9053506010848281518110612d1b57fe5b016020015160f81c81612d2a57fe5b0660f81b828260020260010181518110612d4057fe5b60200101906001600160f81b031916908160001a905350600101612cb9565b5092915050565b612d6e6137d0565b60408051600280825260608201909252600091816020015b6060815260200190600190039081612d865790505090506000612daa856001613426565b9050612db86103ef8261357d565b82600081518110612dc557fe5b6020026020010181905250612dd9846114c4565b82600181518110612de657fe5b6020026020010181905250611bce8261364d565b6000602082511015612e115750602081015161097a565b81806020019051602081101561097557600080fd5b60006060602083600001511015612e4757612e408361367c565b9050612e53565b612e5083611b48565b90505b61169681612dfa565b6060611528612e758360200151600081518110611d9157fe5b612c6a565b60608183510360001415612e9d5750604080516020810190915260008152611528565b611696838384865103613045565b6000805b808451118015612ebf5750808351115b8015612f045750828181518110612ed257fe5b602001015160f81c60f81b6001600160f81b031916848281518110612ef357fe5b01602001516001600160f81b031916145b1561169657600101612eaf565b60208101515160009060111415612f2a5750600061097a565b60028260200151511415612fa6576000612f4383612e5c565b9050600081600081518110612f5457fe5b016020015160f81c90506002811480612f70575060ff81166003145b15612f805760029250505061097a565b60ff81161580612f93575060ff81166001145b15612fa35760019250505061097a565b50505b6040805162461bcd60e51b8152602060048201526011602482015270496e76616c6964206e6f6465207479706560781b604482015290519081900360640190fd5b6060611528612ff583612e5c565b613687565b6130026137d0565b600061300d836114c4565b905061301881611b23565b60208501518051600019810190811061302d57fe5b602002602001018190525061154c84602001516136d0565b60608182601f011015613090576040805162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b604482015290519081900360640190fd5b8282840110156130d8576040805162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b604482015290519081900360640190fd5b81830184511015613124576040805162461bcd60e51b8152602060048201526011602482015270736c6963655f6f75744f66426f756e647360781b604482015290519081900360640190fd5b60608215801561314357604051915060008252602082016040526126f9565b6040519150601f8416801560200281840101858101878315602002848b0101015b8183101561317c578051835260209283019201613164565b5050858452601f01601f19166040525050949350505050565b60606020825110156131a857508061097a565b818051906020012060405160200180828152602001915050604051602081830303815290604052905061097a565b6131de6137d0565b60408051600280825260608201909252600091816020015b60608152602001906001900390816131f65790505090506000612daa856000613426565b6132226137d0565b6040805160118082526102408201909252600091816020015b606081526020019060019003908161323b57905050905060005b815181101561329757604051806040016040528060018152602001600160ff1b81525082828151811061328457fe5b6020908102919091010152600101613255565b506132a18161364d565b91505090565b6132af6137d0565b600060208351106132c8576132c3836114c4565b6132ca565b825b90506132d581611b23565b85602001518560ff16815181106132e857fe5b6020026020010181905250611bce85602001516136d0565b606060008285016001600160401b038111801561331c57600080fd5b5060405190808252806020026020018201604052801561335657816020015b6133436137d0565b81526020019060019003908161333b5790505b50905060005b858110156133975786818151811061337057fe5b602002602001015182828151811061338457fe5b602090810291909101015260010161335c565b5060005b838110156133d8578481815181106133af57fe5b602002602001015182878301815181106133c557fe5b602090810291909101015260010161339b565b5095945050505050565b8282825b60208110613405578151835260209283019290910190601f19016133e6565b905182516020929092036101000a6000190180199091169116179052505050565b6060600082613436576000613439565b60025b90506000600285518161344857fe5b06905060008160020360ff166001600160401b038111801561346957600080fd5b506040519080825280601f01601f191660200182016040528015613494576020820181803683370190505b50905081830160f81b816000815181106134aa57fe5b60200101906001600160f81b031916908160001a90535080866040516020018083805190602001908083835b602083106134f55780518252601f1990920191602091820191016134d6565b51815160209384036101000a600019018019909216911617905285519190930192850191508083835b6020831061353d5780518252601f19909201916020918201910161351e565b6001836020036101000a03801982511681845116808217855250505050505090500192505050604051602081830303815290604052935050505092915050565b60606000600283518161358c57fe5b046001600160401b03811180156135a257600080fd5b506040519080825280601f01601f1916602001820160405280156135cd576020820181803683370190505b50905060005b8151811015612d5f578381600202600101815181106135ee57fe5b602001015160f81c60f81b600485836002028151811061360a57fe5b602001015160f81c60f81b6001600160f81b031916901b1782828151811061362e57fe5b60200101906001600160f81b031916908160001a9053506001016135d3565b6136556137d0565b6000613660836119d1565b905060405180604001604052808281526020016117aa83611bd7565b606061152882613779565b606060028260008151811061369857fe5b016020015160f81c816136a757fe5b0660ff16600014156136c5576136be826002612e7a565b905061097a565b6136be826001612e7a565b6136d86137d0565b600082516001600160401b03811180156136f157600080fd5b5060405190808252806020026020018201604052801561372557816020015b60608152602001906001900390816137105790505b50905060005b835181101561376f5761375084828151811061374357fe5b602002602001015161367c565b82828151811061375c57fe5b602090810291909101015260010161372b565b506116968161364d565b6060611528826020015160008460000151612a47565b60408051608081018252600080825260208201819052918101829052606081019190915290565b604051806040016040528060008152602001600081525090565b604051806040016040528060608152602001606081525090565b60006137fd6137f884614207565b6141e4565b905082815283838301111561381157600080fd5b828260208301376000602084830101529392505050565b803561097a81614258565b8051801515811461097a57600080fd5b600082601f830112613853578081fd5b611696838335602085016137ea565b80356002811061097a57600080fd5b600080600060608486031215613885578283fd5b833561389081614258565b925060208401356138a081614258565b915060408401356001600160401b038111156138ba578182fd5b6138c686828701613843565b9150509250925092565b6000806000606084860312156138e4578283fd5b83356138ef81614258565b92506020840135915060408401356001600160401b038111156138ba578182fd5b60008060408385031215613922578182fd5b823561392d81614258565b915060208301356001600160401b03811115613947578182fd5b61395385828601613843565b9150509250929050565b60006020828403121561396e578081fd5b61169682613833565b600060208284031215613988578081fd5b5051919050565b6000602082840312156139a0578081fd5b81516001600160401b038111156139b5578182fd5b8201601f810184136139c5578182fd5b80516139d36137f882614207565b8181528560208385010111156139e7578384fd5b611bce826020830160208601614228565b600060208284031215613a09578081fd5b81356001600160401b03811115613a1e578182fd5b8201601f81018413613a2e578182fd5b61154c848235602084016137ea565b600060c08284031215613a4e578081fd5b60405160c081018181106001600160401b0382111715613a6a57fe5b8060405250825181526020830151602082015260408301516040820152606083015160608201526080830151613a9f81614258565b6080820152613ab060a08401613833565b60a08201529392505050565b600060208284031215613acd578081fd5b81356001600160401b0380821115613ae3578283fd5b9083019060e08286031215613af6578283fd5b613b0060e06141e4565b8235815260208301356020820152613b1a60408401613862565b6040820152613b2b60608401613828565b6060820152613b3c60808401613828565b608082015260a083013560a082015260c083013582811115613b5c578485fd5b613b6887828601613843565b60c08301525095945050505050565b6001600160a01b03169052565b60008151808452613b9c816020860160208601614228565b601f01601f19169290920160200192915050565b60609190911b6bffffffffffffffffffffffff1916815260140190565b90815260200190565b60008351613be8818460208801614228565b835190830190613bfc818360208801614228565b01949350505050565b600088825287602083015260028710613c1a57fe5b8660f81b60408301526bffffffffffffffffffffffff19808760601b166041840152808660601b166055840152508360698301528251613c61816089850160208701614228565b9190910160890198975050505050505050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039390931683526020830191909152604082015260600190565b600060e08201905060018060a01b038085168352835160208401526020840151604084015260408401516060840152606084015160808401528060808501511660a08401525060a0830151151560c08301529392505050565b901515815260200190565b6020810160038310613d3457fe5b91905290565b60208082526025908201527f53746f7261676520736c6f742068617320616c7265616479206265656e20707260408201526437bb32b71760d91b606082015260800190565b60208082526026908201527f4163636f756e742073746174652068617320616c7265616479206265656e20706040820152653937bb32b71760d11b606082015260800190565b6020808252603e908201527f416c6c206163636f756e7473206d75737420626520636f6d6d6974746564206260408201527f65666f726520636f6d706c6574696e672061207472616e736974696f6e2e0000606082015260800190565b602080825260409082018190527f53746f7261676520736c6f742076616c7565207761736e2774206368616e6765908201527f64206f722068617320616c7265616479206265656e20636f6d6d69747465642e606082015260800190565b6020808252605b908201527f4f564d5f53746174655472616e736974696f6e65723a2050726f76696465642060408201527f4c3120636f6e747261637420636f6465206861736820646f6573206e6f74206d60608201527f61746368204c3220636f6e747261637420636f646520686173682e0000000000608082015260a00190565b6020808252603f908201527f416c6c2073746f72616765206d75737420626520636f6d6d697474656420626560408201527f666f726520636f6d6d697474696e67206163636f756e74207374617465732e00606082015260800190565b60208082526038908201527f4e6f7420656e6f7567682067617320746f2065786563757465207472616e736160408201527f6374696f6e2064657465726d696e6973746963616c6c792e0000000000000000606082015260800190565b6020808252603b908201527f4163636f756e74207374617465207761736e2774206368616e676564206f722060408201527f68617320616c7265616479206265656e20636f6d6d69747465642e0000000000606082015260800190565b6020808252603d908201527f416c6c2073746f72616765206d75737420626520636f6d6d697474656420626560408201527f666f726520636f6d706c6574696e672061207472616e736974696f6e2e000000606082015260800190565b60208082526031908201527f46756e6374696f6e206d7573742062652063616c6c656420647572696e67207460408201527034329031b7b93932b1ba10383430b9b29760791b606082015260800190565b6020808252601d908201527f496e76616c6964207472616e73616374696f6e2070726f76696465642e000000604082015260600190565b60208082526038908201527f436f6e7472616374206d757374206265207665726966696564206265666f726560408201527f2070726f76696e6720612073746f7261676520736c6f742e0000000000000000606082015260800190565b600060408252835160408301526020840151606083015260408401516002811061418257fe5b60808381019190915260608501516001600160a01b031660a08401528401516141ae60c0840182613b77565b5060a084015160e083015260c084015160e06101008401526141d4610120840182613b84565b9150506116966020830184613b77565b6040518181016001600160401b03811182821017156141ff57fe5b604052919050565b60006001600160401b0382111561421a57fe5b50601f01601f191660200190565b60005b8381101561424357818101518382015260200161422b565b83811115614252576000848401525b50505050565b6001600160a01b038116811461426d57600080fd5b5056fe50726f766964656420524c50206c6973742065786365656473206d6178206c697374206c656e6774682e52656365697665642061206e6f6465207769746820616e20756e6b6e6f776e20707265666978a2646970667358221220ce5bdf188c3574b3ab8fd8d954100f14bc36e9cb42e1ca798a8f556d7ace41f564736f6c634300070600334372656174652063616e206f6e6c7920626520646f6e6520627920746865204f564d5f467261756456657269666965722ea26469706673582212200d398ad651c22ef8f9239e5104dc8b8e30dec6c479966de4f2382a136a81db4864736f6c63430007060033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100415760003560e01c806322d1470214610046578063299ca4781461009a578063461a4478146100a2575b600080fd5b61007e6004803603608081101561005c57600080fd5b506001600160a01b038135169060208101359060408101359060600135610148565b604080516001600160a01b039092168252519081900360200190f35b61007e610229565b61007e600480360360208110156100b857600080fd5b8101906020810181356401000000008111156100d357600080fd5b8201836020820111156100e557600080fd5b8035906020019184600183028401116401000000008311171561010757600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610238945050505050565b600061017c6040518060400160405280601181526020017027ab26afa33930bab22b32b934b334b2b960791b815250610238565b6001600160a01b0316336001600160a01b0316146101cb5760405162461bcd60e51b81526004018080602001828103825260318152602001806148ee6031913960400191505060405180910390fd5b848484846040516101db90610314565b80856001600160a01b03168152602001848152602001838152602001828152602001945050505050604051809103906000f08015801561021f573d6000803e3d6000fd5b5095945050505050565b6000546001600160a01b031681565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b83811015610298578181015183820152602001610280565b50505050905090810190601f1680156102c55780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b1580156102e257600080fd5b505afa1580156102f6573d6000803e3d6000fd5b505050506040513d602081101561030c57600080fd5b505192915050565b6145cc806103228339019056fe60806040523480156200001157600080fd5b50604051620045cc380380620045cc833981016040819052620000349162000232565b600080546001600160a01b0319166001600160a01b038616179055600583905560028290556003829055600681905560408051808201909152601781527f4f564d5f53746174654d616e61676572466163746f72790000000000000000006020820152620000a29062000150565b6001600160a01b0316639ed93318306040518263ffffffff1660e01b8152600401620000cf919062000299565b602060405180830381600087803b158015620000ea57600080fd5b505af1158015620000ff573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000125919062000273565b600180546001600160a01b0319166001600160a01b039290921691909117905550620002c692505050565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b83811015620001b257818101518382015260200162000198565b50505050905090810190601f168015620001e05780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b158015620001fe57600080fd5b505afa15801562000213573d6000803e3d6000fd5b505050506040513d60208110156200022a57600080fd5b505192915050565b6000806000806080858703121562000248578384fd5b84516200025581620002ad565b60208601516040870151606090970151919890975090945092505050565b60006020828403121562000285578081fd5b81516200029281620002ad565b9392505050565b6001600160a01b0391909116815260200190565b6001600160a01b0381168114620002c357600080fd5b50565b6142f680620002d66000396000f3fe608060405234801561001057600080fd5b50600436106100cf5760003560e01c8063845fe7a31161008c578063b2fa1c9e11610066578063b2fa1c9e14610185578063b52805711461019a578063b9194310146101a2578063c1c618b8146101b5576100cf565b8063845fe7a314610155578063a244316a14610168578063b1c9fe6e14610170576100cf565b8063299ca478146100d45780632e1ac36c146100f25780632eb1375814610107578063461a44781461011a578063732f960b1461012d578063805e9d3014610140575b600080fd5b6100dc6101bd565b6040516100e99190613c74565b60405180910390f35b6101056101003660046138d0565b6101cc565b005b610105610115366004613910565b610565565b6100dc6101283660046139f8565b6108a1565b61010561013b366004613abc565b61097f565b610148610c6f565b6040516100e99190613bcd565b6101056101633660046138d0565b610c75565b610105610fa1565b610178611128565b6040516100e99190613d26565b61018d611131565b6040516100e99190613d1b565b6100dc61114c565b6101056101b0366004613871565b61115b565b610148611475565b6000546001600160a01b031681565b60018060045460ff1660028111156101e057fe5b146102065760405162461bcd60e51b81526004016101fd90614077565b60405180910390fd5b60025460065460005a6001546040516363b285f960e11b81529192506001600160a01b03169063c7650bf290610242908a908a90600401613c88565b602060405180830381600087803b15801561025c57600080fd5b505af1158015610270573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610294919061395d565b15156001146102b55760405162461bcd60e51b81526004016101fd90613e22565b60015460405163fbcbc0f160e01b81526000916001600160a01b03169063fbcbc0f1906102e6908b90600401613c74565b60c06040518083038186803b1580156102fe57600080fd5b505afa158015610312573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103369190613a3d565b600154604051631aaf392f60e01b81529192506000916001600160a01b0390911690631aaf392f9061036e908c908c90600401613c88565b60206040518083038186803b15801561038657600080fd5b505afa15801561039a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103be9190613977565b90506103ff886040516020016103d49190613bcd565b6040516020818303038152906040526103f46103ef8461147b565b6114c4565b89856040015161152e565b6040808401919091526001549051638f3b964760e01b81526001600160a01b0390911690638f3b964790610439908c908690600401613cc2565b600060405180830381600087803b15801561045357600080fd5b505af1158015610467573d6000803e3d6000fd5b505050507f3e3ed1a676a2754a041b49bf752e0f167c8753495e36c320fe01d1ef7476253c898960405161049c929190613c88565b60405180910390a1505060005a820390506104dd6040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506108a1565b6001600160a01b0316631e16e92f858533856040518563ffffffff1660e01b815260040180858152602001848152602001836001600160a01b03168152602001828152602001945050505050600060405180830381600087803b15801561054357600080fd5b505af1158015610557573d6000803e3d6000fd5b505050505050505050505050565b60018060045460ff16600281111561057957fe5b146105965760405162461bcd60e51b81526004016101fd90614077565b60025460065460005a9050600160009054906101000a90046001600160a01b03166001600160a01b03166399056ba96040518163ffffffff1660e01b815260040160206040518083038186803b1580156105ef57600080fd5b505afa158015610603573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106279190613977565b156106445760405162461bcd60e51b81526004016101fd90613f03565b600154604051630b38106960e11b81526001600160a01b039091169063167020d290610674908990600401613c74565b602060405180830381600087803b15801561068e57600080fd5b505af11580156106a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106c6919061395d565b15156001146106e75760405162461bcd60e51b81526004016101fd90613fbd565b60015460405163fbcbc0f160e01b81526000916001600160a01b03169063fbcbc0f190610718908a90600401613c74565b60c06040518083038186803b15801561073057600080fd5b505afa158015610744573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107689190613a3d565b90506107a78760405160200161077e9190613bb0565b60405160208183030381529060405261079e61079984611554565b611594565b8860035461152e565b6003556040517fcec9ef675d775706a02b43afe48af52c5019bc50f99582e3208c6ff55d59c008906107da908990613c74565b60405180910390a15060005a8203905061081a6040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506108a1565b6001600160a01b0316631e16e92f858533856040518563ffffffff1660e01b815260040180858152602001848152602001836001600160a01b03168152602001828152602001945050505050600060405180830381600087803b15801561088057600080fd5b505af1158015610894573d6000803e3d6000fd5b5050505050505050505050565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b838110156109015781810151838201526020016108e9565b50505050905090810190601f16801561092e5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561094b57600080fd5b505afa15801561095f573d6000803e3d6000fd5b505050506040513d602081101561097557600080fd5b505190505b919050565b60008060045460ff16600281111561099357fe5b146109b05760405162461bcd60e51b81526004016101fd90614077565b60025460065460005a90506006546109c78661169d565b146109e45760405162461bcd60e51b81526004016101fd906140c8565b6103e88560a0015161040802816109f757fe5b04620186a0015a1015610a1c5760405162461bcd60e51b81526004016101fd90613f60565b6000610a536040518060400160405280601481526020017327ab26afa2bc32b1baba34b7b726b0b730b3b2b960611b8152506108a1565b600154604051631381ba4d60e01b81529192506001600160a01b031690631381ba4d90610a84908490600401613c74565b600060405180830381600087803b158015610a9e57600080fd5b505af1158015610ab2573d6000803e3d6000fd5b5050600154604051639be3ad6760e01b81526001600160a01b038086169450639be3ad679350610ae9928b9291169060040161415c565b600060405180830381600087803b158015610b0357600080fd5b505af1158015610b17573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610b3f919081019061398f565b50600154604051631381ba4d60e01b81526001600160a01b0390911690631381ba4d90610b7190600090600401613c74565b600060405180830381600087803b158015610b8b57600080fd5b505af1158015610b9f573d6000803e3d6000fd5b50506004805460ff191660011790555060009150505a82039050610be96040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506108a1565b6001600160a01b0316631e16e92f858533856040518563ffffffff1660e01b815260040180858152602001848152602001836001600160a01b03168152602001828152602001945050505050600060405180830381600087803b158015610c4f57600080fd5b505af1158015610c63573d6000803e3d6000fd5b50505050505050505050565b60025490565b60008060045460ff166002811115610c8957fe5b14610ca65760405162461bcd60e51b81526004016101fd90614077565b60025460065460005a600154604051630ad2267960e01b81529192506001600160a01b031690630ad2267990610ce2908a908a90600401613c88565b60206040518083038186803b158015610cfa57600080fd5b505afa158015610d0e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d32919061395d565b15610d4f5760405162461bcd60e51b81526004016101fd90613d3a565b60015460405163c8e40fbf60e01b81526001600160a01b039091169063c8e40fbf90610d7f908a90600401613c74565b60206040518083038186803b158015610d9757600080fd5b505afa158015610dab573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dcf919061395d565b1515600114610df05760405162461bcd60e51b81526004016101fd906140ff565b60015460405163136e2d8960e11b81526000916001600160a01b0316906326dc5b1290610e21908b90600401613c74565b60206040518083038186803b158015610e3957600080fd5b505afa158015610e4d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e719190613977565b905060007f56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421821415610ea557506000610f02565b600080610ed28a604051602001610ebc9190613bcd565b6040516020818303038152906040528a866116b6565b909250905060018215151415610efa57610ef3610eee826116df565b6116f2565b9250610eff565b600092505b50505b600154604051635c17d62960e01b81526001600160a01b0390911690635c17d62990610f36908c908c908690600401613ca1565b600060405180830381600087803b158015610f5057600080fd5b505af1158015610f64573d6000803e3d6000fd5b50505050505060005a820390506104dd6040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506108a1565b60018060045460ff166002811115610fb557fe5b14610fd25760405162461bcd60e51b81526004016101fd90614077565b600160009054906101000a90046001600160a01b03166001600160a01b031663d7bd4a2a6040518163ffffffff1660e01b815260040160206040518083038186803b15801561102057600080fd5b505afa158015611034573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110589190613977565b156110755760405162461bcd60e51b81526004016101fd90613dc5565b600160009054906101000a90046001600160a01b03166001600160a01b03166399056ba96040518163ffffffff1660e01b815260040160206040518083038186803b1580156110c357600080fd5b505afa1580156110d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110fb9190613977565b156111185760405162461bcd60e51b81526004016101fd9061401a565b506004805460ff19166002179055565b60045460ff1681565b6000600260045460ff16600281111561114657fe5b14905090565b6001546001600160a01b031681565b60008060045460ff16600281111561116f57fe5b1461118c5760405162461bcd60e51b81526004016101fd90614077565b60025460065460005a60015460405163c8e40fbf60e01b81529192506001600160a01b03169063c8e40fbf906111c6908a90600401613c74565b60206040518083038186803b1580156111de57600080fd5b505afa1580156111f2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611216919061395d565b1580156112a057506001546040516307a1294560e01b81526001600160a01b03909116906307a129459061124e908a90600401613c74565b60206040518083038186803b15801561126657600080fd5b505afa15801561127a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061129e919061395d565b155b6112bc5760405162461bcd60e51b81526004016101fd90613d7f565b6000806112eb896040516020016112d39190613bb0565b604051602081830303815290604052886002546116b6565b90925090506001821515141561140c57600061130682611721565b606081015190915089907fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470141561133f5750600061136a565b816060015161134d826117b3565b1461136a5760405162461bcd60e51b81526004016101fd90613e80565b6001546040805160c08101825284518152602080860151908201528482015181830152606080860151908201526001600160a01b038481166080830152600060a08301529151638f3b964760e01b81529190921691638f3b9647916113d3918f91600401613cc2565b600060405180830381600087803b1580156113ed57600080fd5b505af1158015611401573d6000803e3d6000fd5b50505050505061143c565b600154604051630d631c9d60e31b81526001600160a01b0390911690636b18e4e890610f36908c90600401613c74565b505060005a820390506104dd6040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506108a1565b60035490565b6060806000805b6020811085821a15161561149c5760019182019101611482565b5060405191506040820160405283600882021b60208301528060200382525080915050919050565b606080825160011480156114ec57506080836000815181106114e257fe5b016020015160f81c105b156114f8575081611528565b611504835160806117b7565b83604051602001611516929190613bd6565b60405160208183030381529060405290505b92915050565b60008061153a86611906565b905061154881868686611936565b9150505b949350505050565b61155c61378f565b604051806080016040528083600001518152602001836020015181526020018360400151815260200183606001518152509050919050565b60408051600480825260a0820190925260609160009190816020015b60608152602001906001900390816115b057505083519091506115d6906103ef9061147b565b816000815181106115e357fe5b60200260200101819052506116016103ef846020015160001b61147b565b8160018151811061160e57fe5b602002602001018190525061164583604001516040516020016116319190613bcd565b6040516020818303038152906040526114c4565b8160028151811061165257fe5b602002602001018190525061167583606001516040516020016116319190613bcd565b8160038151811061168257fe5b6020026020010181905250611696816119d1565b9392505050565b60006116a882611a15565b805190602001209050919050565b6000606060006116c586611906565b90506116d2818686611a50565b9250925050935093915050565b60606115286116ed83611b23565b611b48565b600080600060208451111561170857602061170b565b83515b6020858101519190036008021c92505050919050565b61172961378f565b600061173483611bd7565b9050604051806080016040528061175e8360008151811061175157fe5b6020026020010151611bea565b81526020016117738360018151811061175157fe5b81526020016117958360028151811061178857fe5b6020026020010151611bf1565b81526020016117aa8360038151811061178857fe5b90529392505050565b3f90565b6060806038841015611811576040805160018082528183019092529060208201818036833701905050905082840160f81b816000815181106117f557fe5b60200101906001600160f81b031916908160001a905350611696565b600060015b80868161181f57fe5b04156118345760019091019061010002611816565b816001016001600160401b038111801561184d57600080fd5b506040519080825280601f01601f191660200182016040528015611878576020820181803683370190505b50925084820160370160f81b8360008151811061189157fe5b60200101906001600160f81b031916908160001a905350600190505b8181116118fd576101008183036101000a87816118c657fe5b04816118ce57fe5b0660f81b8382815181106118de57fe5b60200101906001600160f81b031916908160001a9053506001016118ad565b50509392505050565b606081805190602001206040516020016119209190613bcd565b6040516020818303038152906040529050919050565b6040805180820190915260018152600160ff1b60209091015260007f56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42182141561198a576119838585611ceb565b905061154c565b600061199584611d0f565b90506000806119a5838987611de5565b509150915060006119b88484848b612188565b90506119c4818a6124a0565b9998505050505050505050565b606060006119de836125f9565b90506119ec815160c06117b7565b816040516020016119fe929190613bd6565b604051602081830303815290604052915050919050565b6060816000015182602001518360400151846060015185608001518660a001518760c001516040516020016119209796959493929190613c05565b600060606000611a5f85611d0f565b90506000806000611a71848a89611de5565b81519295509093509150158080611a855750815b611ad6576040805162461bcd60e51b815260206004820152601a60248201527f50726f76696465642070726f6f6620697320696e76616c69642e000000000000604482015290519081900360640190fd5b600081611af25760405180602001604052806000815250611b11565b611b11866001870381518110611b0457fe5b6020026020010151612702565b919b919a509098505050505050505050565b611b2b6137b6565b506040805180820190915281518152602082810190820152919050565b60606000806000611b588561271e565b919450925090506000816001811115611b6d57fe5b14611bbf576040805162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c502062797465732076616c75652e0000000000000000604482015290519081900360640190fd5b611bce85602001518484612a47565b95945050505050565b6060611528611be583611b23565b612af4565b6000611528825b6000602182600001511115611c4d576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e000000000000604482015290519081900360640190fd5b6000806000611c5b8561271e565b919450925090506000816001811115611c7057fe5b14611cc2576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e000000000000604482015290519081900360640190fd5b602080860151840180519091841015611ce15760208490036101000a90045b9695505050505050565b6000611cff611cf984612c6a565b83612d66565b5180516020909101209392505050565b60606000611d1c83611bd7565b9050600081516001600160401b0381118015611d3757600080fd5b50604051908082528060200260200182016040528015611d7157816020015b611d5e6137d0565b815260200190600190039081611d565790505b50905060005b8251811015611ddd576000611d9e848381518110611d9157fe5b6020026020010151611b48565b90506040518060400160405280828152602001611dba83611bd7565b815250838381518110611dc957fe5b602090810291909101015250600101611d77565b509392505050565b60006060818080611df587612c6a565b905085600080611e036137d0565b60005b8c51811015612160578c8181518110611e1b57fe5b6020026020010151915082840193506001870196508360001415611e8f57815180516020909101208514611e8a576040805162461bcd60e51b8152602060048201526011602482015270092dcecc2d8d2c840e4dedee840d0c2e6d607b1b604482015290519081900360640190fd5b611f56565b815151602011611ef657815180516020909101208514611e8a576040805162461bcd60e51b815260206004820152601b60248201527f496e76616c6964206c6172676520696e7465726e616c20686173680000000000604482015290519081900360640190fd5b84611f048360000151612dfa565b14611f56576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420696e7465726e616c206e6f64652068617368000000000000604482015290519081900360640190fd5b60208201515160111415611fc5578551841415611f7257612160565b6000868581518110611f8057fe5b602001015160f81c60f81b60f81c9050600083602001518260ff1681518110611fa557fe5b60200260200101519050611fb881612e26565b9650600194505050612158565b6002826020015151141561210b576000611fde83612e5c565b9050600081600081518110611fef57fe5b016020015160f81c905060018116600203600061200f8460ff8416612e7a565b9050600061201d8b8a612e7a565b9050600061202b8383612eab565b905060ff851660021480612042575060ff85166003145b15612074578083511480156120575750808251145b1561206157988901985b50600160ff1b9950612160945050505050565b60ff85161580612087575060ff85166001145b156120d457806120a45750600160ff1b9950612160945050505050565b6120c588602001516001815181106120b857fe5b6020026020010151612e26565b9a509750612158945050505050565b60405162461bcd60e51b815260040180806020018281038252602681526020018061429b6026913960400191505060405180910390fd5b6040805162461bcd60e51b815260206004820152601d60248201527f526563656976656420616e20756e706172736561626c65206e6f64652e000000604482015290519081900360640190fd5b600101611e06565b50600160ff1b8414866121738786612e7a565b909e909d50909b509950505050505050505050565b6060600083905060008660018703815181106121a057fe5b6020026020010151905060006121b582612f11565b6040805160038082526080820190925291925060009190816020015b6121d96137d0565b8152602001906001900390816121d157905050905060008451600014801561220c5750600283600281111561220a57fe5b145b156122425761222361221d85612fe7565b88612d66565b82828151811061222f57fe5b6020908102919091010152600101612483565b600083600281111561225057fe5b14156122b6578451612285576122668488612ffa565b82828151811061227257fe5b60209081029190910101526001016122b1565b8382828151811061229257fe5b602002602001018190525060018101905061222361221d866001612e7a565b612483565b60006122c185612fe7565b905060006122cf8288612eab565b905080156123305760006122e583600084613045565b90506122f9816122f48c613195565b6131d6565b85858151811061230557fe5b60200260200101819052506001840193506123208383612e7a565b925061232c8883612e7a565b9750505b600061233a61321a565b905082516000141561235f576123588161235389612702565b612ffa565b90506123f7565b60008360008151811061236e57fe5b016020015160f81c9050612383846001612e7a565b9350600287600281111561239357fe5b14156123ce5760006123ad856123a88b612702565b612d66565b90506123c683836123c18460000151613195565b6132a7565b9250506123f5565b8351156123e45760006123ad856122f48b612702565b6123f282826123c18b612702565b91505b505b875161242c57612407818b612ffa565b90508085858151811061241657fe5b602002602001018190525060018401935061247f565b612437886001612e7a565b97508085858151811061244657fe5b6020026020010181905250600184019350612461888b612d66565b85858151811061246d57fe5b60200260200101819052506001840193505b5050505b6124928a60018b038484613300565b9a9950505050505050505050565b6000806124ac83612c6a565b90506124b66137d0565b84516000906060905b80156125e4578760018203815181106124d457fe5b602002602001015193506124e784612f11565b925060028360028111156124f757fe5b141561252257600061250885612fe7565b905061251a8660008351895103613045565b9550506125ce565b600183600281111561253057fe5b141561257057600061254185612fe7565b90506125538660008351895103613045565b83519096501561256a5761256781846131d6565b94505b506125ce565b600083600281111561257e57fe5b14156125ce578151156125ce5760008560018751038151811061259d57fe5b602001015160f81c60f81b60f81c90506125bd8660006001895103613045565b95506125ca8582856132a7565b9450505b83516125d990613195565b9150600019016124bf565b50509051805160209091012095945050505050565b606081516000141561261a575060408051600081526020810190915261097a565b6000805b835181101561264d5783818151811061263357fe5b60200260200101515182019150808060010191505061261e565b6000826001600160401b038111801561266557600080fd5b506040519080825280601f01601f191660200182016040528015612690576020820181803683370190505b50600092509050602081015b85518310156126f95760008684815181106126b357fe5b6020026020010151905060006020820190506126d1838284516133e2565b8785815181106126dd57fe5b602002602001015151830192505050828060010193505061269c565b50949350505050565b60208101518051606091611528916000198101908110611d9157fe5b60008060008084600001511161277b576040805162461bcd60e51b815260206004820152601860248201527f524c50206974656d2063616e6e6f74206265206e756c6c2e0000000000000000604482015290519081900360640190fd5b6020840151805160001a607f81116127a0576000600160009450945094505050612a40565b60b78111612815578551607f198201908110612803576040805162461bcd60e51b815260206004820152601960248201527f496e76616c696420524c502073686f727420737472696e672e00000000000000604482015290519081900360640190fd5b60019550935060009250612a40915050565b60bf81116128f957855160b6198201908110612878576040805162461bcd60e51b815260206004820152601f60248201527f496e76616c696420524c50206c6f6e6720737472696e67206c656e6774682e00604482015290519081900360640190fd5b6000816020036101000a60018501510490508082018860000151116128e4576040805162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c50206c6f6e6720737472696e672e0000000000000000604482015290519081900360640190fd5b60019091019550935060009250612a40915050565b60f7811161296d57855160bf19820190811061295c576040805162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c502073686f7274206c6973742e000000000000000000604482015290519081900360640190fd5b600195509350849250612a40915050565b855160f61982019081106129c8576040805162461bcd60e51b815260206004820152601d60248201527f496e76616c696420524c50206c6f6e67206c697374206c656e6774682e000000604482015290519081900360640190fd5b6000816020036101000a6001850151049050808201886000015111612a2d576040805162461bcd60e51b815260206004820152601660248201527524b73b30b634b210292628103637b733903634b9ba1760511b604482015290519081900360640190fd5b6001918201965094509250612a40915050565b9193909250565b60606000826001600160401b0381118015612a6157600080fd5b506040519080825280601f01601f191660200182016040528015612a8c576020820181803683370190505b509050805160001415612aa0579050611696565b8484016020820160005b60208604811015612acb578251825260209283019290910190600101612aaa565b5080519151601f959095166020036101000a600019019182169119909416179092525092915050565b6060600080612b028461271e565b91935090915060019050816001811115612b1857fe5b14612b6a576040805162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c50206c6973742076616c75652e000000000000000000604482015290519081900360640190fd5b6040805160208082526104208201909252600091816020015b612b8b6137b6565b815260200190600190039081612b835790505090506000835b8651811015612c5f5760208210612bec5760405162461bcd60e51b815260040180806020018281038252602a815260200180614271602a913960400191505060405180910390fd5b600080612c186040518060400160405280858c60000151038152602001858c602001510181525061271e565b509150915060405180604001604052808383018152602001848b6020015101815250858581518110612c4657fe5b6020908102919091010152600193909301920101612ba4565b508152949350505050565b6060600082516002026001600160401b0381118015612c8857600080fd5b506040519080825280601f01601f191660200182016040528015612cb3576020820181803683370190505b50905060005b8351811015612d5f576004848281518110612cd057fe5b602001015160f81c60f81b6001600160f81b031916901c828260020281518110612cf657fe5b60200101906001600160f81b031916908160001a9053506010848281518110612d1b57fe5b016020015160f81c81612d2a57fe5b0660f81b828260020260010181518110612d4057fe5b60200101906001600160f81b031916908160001a905350600101612cb9565b5092915050565b612d6e6137d0565b60408051600280825260608201909252600091816020015b6060815260200190600190039081612d865790505090506000612daa856001613426565b9050612db86103ef8261357d565b82600081518110612dc557fe5b6020026020010181905250612dd9846114c4565b82600181518110612de657fe5b6020026020010181905250611bce8261364d565b6000602082511015612e115750602081015161097a565b81806020019051602081101561097557600080fd5b60006060602083600001511015612e4757612e408361367c565b9050612e53565b612e5083611b48565b90505b61169681612dfa565b6060611528612e758360200151600081518110611d9157fe5b612c6a565b60608183510360001415612e9d5750604080516020810190915260008152611528565b611696838384865103613045565b6000805b808451118015612ebf5750808351115b8015612f045750828181518110612ed257fe5b602001015160f81c60f81b6001600160f81b031916848281518110612ef357fe5b01602001516001600160f81b031916145b1561169657600101612eaf565b60208101515160009060111415612f2a5750600061097a565b60028260200151511415612fa6576000612f4383612e5c565b9050600081600081518110612f5457fe5b016020015160f81c90506002811480612f70575060ff81166003145b15612f805760029250505061097a565b60ff81161580612f93575060ff81166001145b15612fa35760019250505061097a565b50505b6040805162461bcd60e51b8152602060048201526011602482015270496e76616c6964206e6f6465207479706560781b604482015290519081900360640190fd5b6060611528612ff583612e5c565b613687565b6130026137d0565b600061300d836114c4565b905061301881611b23565b60208501518051600019810190811061302d57fe5b602002602001018190525061154c84602001516136d0565b60608182601f011015613090576040805162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b604482015290519081900360640190fd5b8282840110156130d8576040805162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b604482015290519081900360640190fd5b81830184511015613124576040805162461bcd60e51b8152602060048201526011602482015270736c6963655f6f75744f66426f756e647360781b604482015290519081900360640190fd5b60608215801561314357604051915060008252602082016040526126f9565b6040519150601f8416801560200281840101858101878315602002848b0101015b8183101561317c578051835260209283019201613164565b5050858452601f01601f19166040525050949350505050565b60606020825110156131a857508061097a565b818051906020012060405160200180828152602001915050604051602081830303815290604052905061097a565b6131de6137d0565b60408051600280825260608201909252600091816020015b60608152602001906001900390816131f65790505090506000612daa856000613426565b6132226137d0565b6040805160118082526102408201909252600091816020015b606081526020019060019003908161323b57905050905060005b815181101561329757604051806040016040528060018152602001600160ff1b81525082828151811061328457fe5b6020908102919091010152600101613255565b506132a18161364d565b91505090565b6132af6137d0565b600060208351106132c8576132c3836114c4565b6132ca565b825b90506132d581611b23565b85602001518560ff16815181106132e857fe5b6020026020010181905250611bce85602001516136d0565b606060008285016001600160401b038111801561331c57600080fd5b5060405190808252806020026020018201604052801561335657816020015b6133436137d0565b81526020019060019003908161333b5790505b50905060005b858110156133975786818151811061337057fe5b602002602001015182828151811061338457fe5b602090810291909101015260010161335c565b5060005b838110156133d8578481815181106133af57fe5b602002602001015182878301815181106133c557fe5b602090810291909101015260010161339b565b5095945050505050565b8282825b60208110613405578151835260209283019290910190601f19016133e6565b905182516020929092036101000a6000190180199091169116179052505050565b6060600082613436576000613439565b60025b90506000600285518161344857fe5b06905060008160020360ff166001600160401b038111801561346957600080fd5b506040519080825280601f01601f191660200182016040528015613494576020820181803683370190505b50905081830160f81b816000815181106134aa57fe5b60200101906001600160f81b031916908160001a90535080866040516020018083805190602001908083835b602083106134f55780518252601f1990920191602091820191016134d6565b51815160209384036101000a600019018019909216911617905285519190930192850191508083835b6020831061353d5780518252601f19909201916020918201910161351e565b6001836020036101000a03801982511681845116808217855250505050505090500192505050604051602081830303815290604052935050505092915050565b60606000600283518161358c57fe5b046001600160401b03811180156135a257600080fd5b506040519080825280601f01601f1916602001820160405280156135cd576020820181803683370190505b50905060005b8151811015612d5f578381600202600101815181106135ee57fe5b602001015160f81c60f81b600485836002028151811061360a57fe5b602001015160f81c60f81b6001600160f81b031916901b1782828151811061362e57fe5b60200101906001600160f81b031916908160001a9053506001016135d3565b6136556137d0565b6000613660836119d1565b905060405180604001604052808281526020016117aa83611bd7565b606061152882613779565b606060028260008151811061369857fe5b016020015160f81c816136a757fe5b0660ff16600014156136c5576136be826002612e7a565b905061097a565b6136be826001612e7a565b6136d86137d0565b600082516001600160401b03811180156136f157600080fd5b5060405190808252806020026020018201604052801561372557816020015b60608152602001906001900390816137105790505b50905060005b835181101561376f5761375084828151811061374357fe5b602002602001015161367c565b82828151811061375c57fe5b602090810291909101015260010161372b565b506116968161364d565b6060611528826020015160008460000151612a47565b60408051608081018252600080825260208201819052918101829052606081019190915290565b604051806040016040528060008152602001600081525090565b604051806040016040528060608152602001606081525090565b60006137fd6137f884614207565b6141e4565b905082815283838301111561381157600080fd5b828260208301376000602084830101529392505050565b803561097a81614258565b8051801515811461097a57600080fd5b600082601f830112613853578081fd5b611696838335602085016137ea565b80356002811061097a57600080fd5b600080600060608486031215613885578283fd5b833561389081614258565b925060208401356138a081614258565b915060408401356001600160401b038111156138ba578182fd5b6138c686828701613843565b9150509250925092565b6000806000606084860312156138e4578283fd5b83356138ef81614258565b92506020840135915060408401356001600160401b038111156138ba578182fd5b60008060408385031215613922578182fd5b823561392d81614258565b915060208301356001600160401b03811115613947578182fd5b61395385828601613843565b9150509250929050565b60006020828403121561396e578081fd5b61169682613833565b600060208284031215613988578081fd5b5051919050565b6000602082840312156139a0578081fd5b81516001600160401b038111156139b5578182fd5b8201601f810184136139c5578182fd5b80516139d36137f882614207565b8181528560208385010111156139e7578384fd5b611bce826020830160208601614228565b600060208284031215613a09578081fd5b81356001600160401b03811115613a1e578182fd5b8201601f81018413613a2e578182fd5b61154c848235602084016137ea565b600060c08284031215613a4e578081fd5b60405160c081018181106001600160401b0382111715613a6a57fe5b8060405250825181526020830151602082015260408301516040820152606083015160608201526080830151613a9f81614258565b6080820152613ab060a08401613833565b60a08201529392505050565b600060208284031215613acd578081fd5b81356001600160401b0380821115613ae3578283fd5b9083019060e08286031215613af6578283fd5b613b0060e06141e4565b8235815260208301356020820152613b1a60408401613862565b6040820152613b2b60608401613828565b6060820152613b3c60808401613828565b608082015260a083013560a082015260c083013582811115613b5c578485fd5b613b6887828601613843565b60c08301525095945050505050565b6001600160a01b03169052565b60008151808452613b9c816020860160208601614228565b601f01601f19169290920160200192915050565b60609190911b6bffffffffffffffffffffffff1916815260140190565b90815260200190565b60008351613be8818460208801614228565b835190830190613bfc818360208801614228565b01949350505050565b600088825287602083015260028710613c1a57fe5b8660f81b60408301526bffffffffffffffffffffffff19808760601b166041840152808660601b166055840152508360698301528251613c61816089850160208701614228565b9190910160890198975050505050505050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039390931683526020830191909152604082015260600190565b600060e08201905060018060a01b038085168352835160208401526020840151604084015260408401516060840152606084015160808401528060808501511660a08401525060a0830151151560c08301529392505050565b901515815260200190565b6020810160038310613d3457fe5b91905290565b60208082526025908201527f53746f7261676520736c6f742068617320616c7265616479206265656e20707260408201526437bb32b71760d91b606082015260800190565b60208082526026908201527f4163636f756e742073746174652068617320616c7265616479206265656e20706040820152653937bb32b71760d11b606082015260800190565b6020808252603e908201527f416c6c206163636f756e7473206d75737420626520636f6d6d6974746564206260408201527f65666f726520636f6d706c6574696e672061207472616e736974696f6e2e0000606082015260800190565b602080825260409082018190527f53746f7261676520736c6f742076616c7565207761736e2774206368616e6765908201527f64206f722068617320616c7265616479206265656e20636f6d6d69747465642e606082015260800190565b6020808252605b908201527f4f564d5f53746174655472616e736974696f6e65723a2050726f76696465642060408201527f4c3120636f6e747261637420636f6465206861736820646f6573206e6f74206d60608201527f61746368204c3220636f6e747261637420636f646520686173682e0000000000608082015260a00190565b6020808252603f908201527f416c6c2073746f72616765206d75737420626520636f6d6d697474656420626560408201527f666f726520636f6d6d697474696e67206163636f756e74207374617465732e00606082015260800190565b60208082526038908201527f4e6f7420656e6f7567682067617320746f2065786563757465207472616e736160408201527f6374696f6e2064657465726d696e6973746963616c6c792e0000000000000000606082015260800190565b6020808252603b908201527f4163636f756e74207374617465207761736e2774206368616e676564206f722060408201527f68617320616c7265616479206265656e20636f6d6d69747465642e0000000000606082015260800190565b6020808252603d908201527f416c6c2073746f72616765206d75737420626520636f6d6d697474656420626560408201527f666f726520636f6d706c6574696e672061207472616e736974696f6e2e000000606082015260800190565b60208082526031908201527f46756e6374696f6e206d7573742062652063616c6c656420647572696e67207460408201527034329031b7b93932b1ba10383430b9b29760791b606082015260800190565b6020808252601d908201527f496e76616c6964207472616e73616374696f6e2070726f76696465642e000000604082015260600190565b60208082526038908201527f436f6e7472616374206d757374206265207665726966696564206265666f726560408201527f2070726f76696e6720612073746f7261676520736c6f742e0000000000000000606082015260800190565b600060408252835160408301526020840151606083015260408401516002811061418257fe5b60808381019190915260608501516001600160a01b031660a08401528401516141ae60c0840182613b77565b5060a084015160e083015260c084015160e06101008401526141d4610120840182613b84565b9150506116966020830184613b77565b6040518181016001600160401b03811182821017156141ff57fe5b604052919050565b60006001600160401b0382111561421a57fe5b50601f01601f191660200190565b60005b8381101561424357818101518382015260200161422b565b83811115614252576000848401525b50505050565b6001600160a01b038116811461426d57600080fd5b5056fe50726f766964656420524c50206c6973742065786365656473206d6178206c697374206c656e6774682e52656365697665642061206e6f6465207769746820616e20756e6b6e6f776e20707265666978a2646970667358221220ce5bdf188c3574b3ab8fd8d954100f14bc36e9cb42e1ca798a8f556d7ace41f564736f6c634300070600334372656174652063616e206f6e6c7920626520646f6e6520627920746865204f564d5f467261756456657269666965722ea26469706673582212200d398ad651c22ef8f9239e5104dc8b8e30dec6c479966de4f2382a136a81db4864736f6c63430007060033", + "devdoc": { + "details": "The State Transitioner Factory is used by the Fraud Verifier to create a new State Transitioner during the initialization of a fraud proof. Compiler used: solc Runtime target: EVM", + "kind": "dev", + "methods": { + "create(address,uint256,bytes32,bytes32)": { + "params": { + "_libAddressManager": "Address of the Address Manager.", + "_preStateRoot": "State root before the transition was executed.", + "_stateTransitionIndex": "Index of the state transition being verified.", + "_transactionHash": "Hash of the executed transaction." + }, + "returns": { + "_0": "New OVM_StateTransitioner instance." + } + }, + "resolve(string)": { + "params": { + "_name": "Name to resolve an address for." + }, + "returns": { + "_0": "Address associated with the given name." + } + } + }, + "title": "OVM_StateTransitionerFactory", + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": { + "create(address,uint256,bytes32,bytes32)": { + "notice": "Creates a new OVM_StateTransitioner" + }, + "resolve(string)": { + "notice": "Resolves the address associated with a given name." + } + }, + "version": 1 + }, + "storageLayout": { + "storage": [ + { + "astId": 12055, + "contract": "contracts/optimistic-ethereum/OVM/verification/OVM_StateTransitionerFactory.sol:OVM_StateTransitionerFactory", + "label": "libAddressManager", + "offset": 0, + "slot": "0", + "type": "t_contract(Lib_AddressManager)12048" + } + ], + "types": { + "t_contract(Lib_AddressManager)12048": { + "encoding": "inplace", + "label": "contract Lib_AddressManager", + "numberOfBytes": "20" + } + } + } +} \ No newline at end of file diff --git a/packages/contracts/deployments/goerli-v3/Proxy__OVM_L1CrossDomainMessenger.json b/packages/contracts/deployments/goerli-v3/Proxy__OVM_L1CrossDomainMessenger.json new file mode 100644 index 0000000000000..52dce9d3c9a2a --- /dev/null +++ b/packages/contracts/deployments/goerli-v3/Proxy__OVM_L1CrossDomainMessenger.json @@ -0,0 +1,118 @@ +{ + "address": "0xFec83764acDeEc2ac338d4cc1f12bBE3cCDf551E", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_libAddressManager", + "type": "address" + }, + { + "internalType": "string", + "name": "_implementationName", + "type": "string" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "stateMutability": "payable", + "type": "fallback" + } + ], + "transactionHash": "0xc796492651cfcf9c1e77eabc558db2473ee567fe03e3dbb6c8c7bccdd0a6cea9", + "receipt": { + "to": null, + "from": "0x4107438C1b1579f258AF9d1AC06194C4a0F55040", + "contractAddress": "0xFec83764acDeEc2ac338d4cc1f12bBE3cCDf551E", + "transactionIndex": 6, + "gasUsed": "225024", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0xb3e0b0bffed18d30c6a9891532f9ac5f2c4b018603682fc6547b0a166c00e935", + "transactionHash": "0xc796492651cfcf9c1e77eabc558db2473ee567fe03e3dbb6c8c7bccdd0a6cea9", + "logs": [], + "blockNumber": 4694109, + "cumulativeGasUsed": "4216864", + "status": 1, + "byzantium": true + }, + "args": [ + "0xE3d08F0D900A2D53cB794cf82d7127764BcC3092", + "OVM_L1CrossDomainMessenger" + ], + "solcInputHash": "dde656dd41f49cad9eac9bc7065fd6a7", + "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_implementationName\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"stateMutability\":\"payable\",\"type\":\"fallback\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_implementationName\":\"implementationName of the contract to proxy to.\",\"_libAddressManager\":\"Address of the Lib_AddressManager.\"}}},\"title\":\"Lib_ResolvedDelegateProxy\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/libraries/resolver/Lib_ResolvedDelegateProxy.sol\":\"Lib_ResolvedDelegateProxy\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor () internal {\\n address msgSender = _msgSender();\\n _owner = msgSender;\\n emit OwnershipTransferred(address(0), msgSender);\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n emit OwnershipTransferred(_owner, address(0));\\n _owner = address(0);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n emit OwnershipTransferred(_owner, newOwner);\\n _owner = newOwner;\\n }\\n}\\n\",\"keccak256\":\"0x15e2d5bd4c28a88548074c54d220e8086f638a71ed07e6b3ba5a70066fcf458d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with GSN meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address payable) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes memory) {\\n this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x8d3cb350f04ff49cfb10aef08d87f19dcbaecc8027b0bed12f3275cd12f38cf0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n public\\n onlyOwner\\n {\\n addresses[_getNameHash(_name)] = _address;\\n\\n emit AddressSet(\\n _name,\\n _address\\n );\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0x2ce671a0e004df88b136bea5a3c59d0732cea8887c8496da1d509e0200b03d7d\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_ResolvedDelegateProxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_ResolvedDelegateProxy\\n */\\ncontract Lib_ResolvedDelegateProxy {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n // Using mappings to store fields to avoid overwriting storage slots in the\\n // implementation contract. For example, instead of storing these fields at\\n // storage slot `0` & `1`, they are stored at `keccak256(key + slot)`.\\n // See: https://solidity.readthedocs.io/en/v0.7.0/internals/layout_in_storage.html\\n // NOTE: Do not use this code in your own contract system.\\n // There is a known flaw in this contract, and we will remove it from the repository\\n // in the near future. Due to the very limited way that we are using it, this flaw is\\n // not an issue in our system.\\n mapping (address => string) private implementationName;\\n mapping (address => Lib_AddressManager) private addressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n * @param _implementationName implementationName of the contract to proxy to.\\n */\\n constructor(\\n address _libAddressManager,\\n string memory _implementationName\\n ) {\\n addressManager[address(this)] = Lib_AddressManager(_libAddressManager);\\n implementationName[address(this)] = _implementationName;\\n }\\n\\n\\n /*********************\\n * Fallback Function *\\n *********************/\\n\\n fallback()\\n external\\n payable\\n {\\n address target = addressManager[address(this)].getAddress(\\n (implementationName[address(this)])\\n );\\n\\n require(\\n target != address(0),\\n \\\"Target address must be initialized.\\\"\\n );\\n\\n (bool success, bytes memory returndata) = target.delegatecall(msg.data);\\n\\n if (success == true) {\\n assembly {\\n return(add(returndata, 0x20), mload(returndata))\\n }\\n } else {\\n assembly {\\n revert(add(returndata, 0x20), mload(returndata))\\n }\\n }\\n }\\n}\\n\",\"keccak256\":\"0xfaecb051b37f1d87d588cafb17a575723cbdf7c3c2079772110f33e747e05027\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x608060405234801561001057600080fd5b506040516104083803806104088339818101604052604081101561003357600080fd5b81516020830180516040519294929383019291908464010000000082111561005a57600080fd5b90830190602082018581111561006f57600080fd5b825164010000000081118282018810171561008957600080fd5b82525081516020918201929091019080838360005b838110156100b657818101518382015260200161009e565b50505050905090810190601f1680156100e35780820380516001836020036101000a031916815260200191505b5060409081523060009081526001602090815282822080546001600160a01b0319166001600160a01b038a16179055818152919020855161012c95509093509085019150610134565b5050506101d5565b828054600181600116156101000203166002900490600052602060002090601f01602090048101928261016a57600085556101b0565b82601f1061018357805160ff19168380011785556101b0565b828001600101855582156101b0579182015b828111156101b0578251825591602001919060010190610195565b506101bc9291506101c0565b5090565b5b808211156101bc57600081556001016101c1565b610224806101e46000396000f3fe60806040818152306000908152600160208181528383205483825293832063bf40fac160e01b909552608490815284546002610100938216159390930260001901169190910460a481905291936001600160a01b039093169263bf40fac192909190819060c490849080156100b55780601f1061008a576101008083540402835291602001916100b5565b820191906000526020600020905b81548152906001019060200180831161009857829003601f168201915b50509250505060206040518083038186803b1580156100d357600080fd5b505afa1580156100e7573d6000803e3d6000fd5b505050506040513d60208110156100fd57600080fd5b505190506001600160a01b0381166101465760405162461bcd60e51b81526004018080602001828103825260238152602001806101cc6023913960400191505060405180910390fd5b600080826001600160a01b03166000366040518083838082843760405192019450600093509091505080830381855af49150503d80600081146101a5576040519150601f19603f3d011682016040523d82523d6000602084013e6101aa565b606091505b509092509050600182151514156101c357805160208201f35b805160208201fdfe5461726765742061646472657373206d75737420626520696e697469616c697a65642ea264697066735822122026d4992ed7562b49b7d3e306977cab94c29f8fb64a137b48d18960cc5ef1341d64736f6c63430007060033", + "deployedBytecode": "0x60806040818152306000908152600160208181528383205483825293832063bf40fac160e01b909552608490815284546002610100938216159390930260001901169190910460a481905291936001600160a01b039093169263bf40fac192909190819060c490849080156100b55780601f1061008a576101008083540402835291602001916100b5565b820191906000526020600020905b81548152906001019060200180831161009857829003601f168201915b50509250505060206040518083038186803b1580156100d357600080fd5b505afa1580156100e7573d6000803e3d6000fd5b505050506040513d60208110156100fd57600080fd5b505190506001600160a01b0381166101465760405162461bcd60e51b81526004018080602001828103825260238152602001806101cc6023913960400191505060405180910390fd5b600080826001600160a01b03166000366040518083838082843760405192019450600093509091505080830381855af49150503d80600081146101a5576040519150601f19603f3d011682016040523d82523d6000602084013e6101aa565b606091505b509092509050600182151514156101c357805160208201f35b805160208201fdfe5461726765742061646472657373206d75737420626520696e697469616c697a65642ea264697066735822122026d4992ed7562b49b7d3e306977cab94c29f8fb64a137b48d18960cc5ef1341d64736f6c63430007060033", + "devdoc": { + "kind": "dev", + "methods": { + "constructor": { + "params": { + "_implementationName": "implementationName of the contract to proxy to.", + "_libAddressManager": "Address of the Lib_AddressManager." + } + } + }, + "title": "Lib_ResolvedDelegateProxy", + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + }, + "storageLayout": { + "storage": [ + { + "astId": 12092, + "contract": "contracts/optimistic-ethereum/libraries/resolver/Lib_ResolvedDelegateProxy.sol:Lib_ResolvedDelegateProxy", + "label": "implementationName", + "offset": 0, + "slot": "0", + "type": "t_mapping(t_address,t_string_storage)" + }, + { + "astId": 12096, + "contract": "contracts/optimistic-ethereum/libraries/resolver/Lib_ResolvedDelegateProxy.sol:Lib_ResolvedDelegateProxy", + "label": "addressManager", + "offset": 0, + "slot": "1", + "type": "t_mapping(t_address,t_contract(Lib_AddressManager)12048)" + } + ], + "types": { + "t_address": { + "encoding": "inplace", + "label": "address", + "numberOfBytes": "20" + }, + "t_contract(Lib_AddressManager)12048": { + "encoding": "inplace", + "label": "contract Lib_AddressManager", + "numberOfBytes": "20" + }, + "t_mapping(t_address,t_contract(Lib_AddressManager)12048)": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => contract Lib_AddressManager)", + "numberOfBytes": "32", + "value": "t_contract(Lib_AddressManager)12048" + }, + "t_mapping(t_address,t_string_storage)": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => string)", + "numberOfBytes": "32", + "value": "t_string_storage" + }, + "t_string_storage": { + "encoding": "bytes", + "label": "string", + "numberOfBytes": "32" + } + } + } +} \ No newline at end of file diff --git a/packages/contracts/deployments/goerli-v3/Proxy__OVM_L1ETHGateway.json b/packages/contracts/deployments/goerli-v3/Proxy__OVM_L1ETHGateway.json new file mode 100644 index 0000000000000..67b28f004bcb0 --- /dev/null +++ b/packages/contracts/deployments/goerli-v3/Proxy__OVM_L1ETHGateway.json @@ -0,0 +1,118 @@ +{ + "address": "0xA721CF3e39E5cB4CfEEc0e32EE05B3D05AA9aE39", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_libAddressManager", + "type": "address" + }, + { + "internalType": "string", + "name": "_implementationName", + "type": "string" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "stateMutability": "payable", + "type": "fallback" + } + ], + "transactionHash": "0x3d4a30fba0bff5ac4443bc0060601b94df8c87840eb11dc8e586adc03e4e804e", + "receipt": { + "to": null, + "from": "0x4107438C1b1579f258AF9d1AC06194C4a0F55040", + "contractAddress": "0xA721CF3e39E5cB4CfEEc0e32EE05B3D05AA9aE39", + "transactionIndex": 1, + "gasUsed": "224904", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0xcffaf68b69cbb4498ca1c7d9727b3f74c6221de283657cc7ca5e7abb62b7fedc", + "transactionHash": "0x3d4a30fba0bff5ac4443bc0060601b94df8c87840eb11dc8e586adc03e4e804e", + "logs": [], + "blockNumber": 4694131, + "cumulativeGasUsed": "323310", + "status": 1, + "byzantium": true + }, + "args": [ + "0xE3d08F0D900A2D53cB794cf82d7127764BcC3092", + "OVM_L1ETHGateway" + ], + "solcInputHash": "dde656dd41f49cad9eac9bc7065fd6a7", + "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_implementationName\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"stateMutability\":\"payable\",\"type\":\"fallback\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_implementationName\":\"implementationName of the contract to proxy to.\",\"_libAddressManager\":\"Address of the Lib_AddressManager.\"}}},\"title\":\"Lib_ResolvedDelegateProxy\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/libraries/resolver/Lib_ResolvedDelegateProxy.sol\":\"Lib_ResolvedDelegateProxy\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor () internal {\\n address msgSender = _msgSender();\\n _owner = msgSender;\\n emit OwnershipTransferred(address(0), msgSender);\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n emit OwnershipTransferred(_owner, address(0));\\n _owner = address(0);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n emit OwnershipTransferred(_owner, newOwner);\\n _owner = newOwner;\\n }\\n}\\n\",\"keccak256\":\"0x15e2d5bd4c28a88548074c54d220e8086f638a71ed07e6b3ba5a70066fcf458d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with GSN meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address payable) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes memory) {\\n this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x8d3cb350f04ff49cfb10aef08d87f19dcbaecc8027b0bed12f3275cd12f38cf0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n public\\n onlyOwner\\n {\\n addresses[_getNameHash(_name)] = _address;\\n\\n emit AddressSet(\\n _name,\\n _address\\n );\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0x2ce671a0e004df88b136bea5a3c59d0732cea8887c8496da1d509e0200b03d7d\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_ResolvedDelegateProxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_ResolvedDelegateProxy\\n */\\ncontract Lib_ResolvedDelegateProxy {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n // Using mappings to store fields to avoid overwriting storage slots in the\\n // implementation contract. For example, instead of storing these fields at\\n // storage slot `0` & `1`, they are stored at `keccak256(key + slot)`.\\n // See: https://solidity.readthedocs.io/en/v0.7.0/internals/layout_in_storage.html\\n // NOTE: Do not use this code in your own contract system.\\n // There is a known flaw in this contract, and we will remove it from the repository\\n // in the near future. Due to the very limited way that we are using it, this flaw is\\n // not an issue in our system.\\n mapping (address => string) private implementationName;\\n mapping (address => Lib_AddressManager) private addressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n * @param _implementationName implementationName of the contract to proxy to.\\n */\\n constructor(\\n address _libAddressManager,\\n string memory _implementationName\\n ) {\\n addressManager[address(this)] = Lib_AddressManager(_libAddressManager);\\n implementationName[address(this)] = _implementationName;\\n }\\n\\n\\n /*********************\\n * Fallback Function *\\n *********************/\\n\\n fallback()\\n external\\n payable\\n {\\n address target = addressManager[address(this)].getAddress(\\n (implementationName[address(this)])\\n );\\n\\n require(\\n target != address(0),\\n \\\"Target address must be initialized.\\\"\\n );\\n\\n (bool success, bytes memory returndata) = target.delegatecall(msg.data);\\n\\n if (success == true) {\\n assembly {\\n return(add(returndata, 0x20), mload(returndata))\\n }\\n } else {\\n assembly {\\n revert(add(returndata, 0x20), mload(returndata))\\n }\\n }\\n }\\n}\\n\",\"keccak256\":\"0xfaecb051b37f1d87d588cafb17a575723cbdf7c3c2079772110f33e747e05027\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x608060405234801561001057600080fd5b506040516104083803806104088339818101604052604081101561003357600080fd5b81516020830180516040519294929383019291908464010000000082111561005a57600080fd5b90830190602082018581111561006f57600080fd5b825164010000000081118282018810171561008957600080fd5b82525081516020918201929091019080838360005b838110156100b657818101518382015260200161009e565b50505050905090810190601f1680156100e35780820380516001836020036101000a031916815260200191505b5060409081523060009081526001602090815282822080546001600160a01b0319166001600160a01b038a16179055818152919020855161012c95509093509085019150610134565b5050506101d5565b828054600181600116156101000203166002900490600052602060002090601f01602090048101928261016a57600085556101b0565b82601f1061018357805160ff19168380011785556101b0565b828001600101855582156101b0579182015b828111156101b0578251825591602001919060010190610195565b506101bc9291506101c0565b5090565b5b808211156101bc57600081556001016101c1565b610224806101e46000396000f3fe60806040818152306000908152600160208181528383205483825293832063bf40fac160e01b909552608490815284546002610100938216159390930260001901169190910460a481905291936001600160a01b039093169263bf40fac192909190819060c490849080156100b55780601f1061008a576101008083540402835291602001916100b5565b820191906000526020600020905b81548152906001019060200180831161009857829003601f168201915b50509250505060206040518083038186803b1580156100d357600080fd5b505afa1580156100e7573d6000803e3d6000fd5b505050506040513d60208110156100fd57600080fd5b505190506001600160a01b0381166101465760405162461bcd60e51b81526004018080602001828103825260238152602001806101cc6023913960400191505060405180910390fd5b600080826001600160a01b03166000366040518083838082843760405192019450600093509091505080830381855af49150503d80600081146101a5576040519150601f19603f3d011682016040523d82523d6000602084013e6101aa565b606091505b509092509050600182151514156101c357805160208201f35b805160208201fdfe5461726765742061646472657373206d75737420626520696e697469616c697a65642ea264697066735822122026d4992ed7562b49b7d3e306977cab94c29f8fb64a137b48d18960cc5ef1341d64736f6c63430007060033", + "deployedBytecode": "0x60806040818152306000908152600160208181528383205483825293832063bf40fac160e01b909552608490815284546002610100938216159390930260001901169190910460a481905291936001600160a01b039093169263bf40fac192909190819060c490849080156100b55780601f1061008a576101008083540402835291602001916100b5565b820191906000526020600020905b81548152906001019060200180831161009857829003601f168201915b50509250505060206040518083038186803b1580156100d357600080fd5b505afa1580156100e7573d6000803e3d6000fd5b505050506040513d60208110156100fd57600080fd5b505190506001600160a01b0381166101465760405162461bcd60e51b81526004018080602001828103825260238152602001806101cc6023913960400191505060405180910390fd5b600080826001600160a01b03166000366040518083838082843760405192019450600093509091505080830381855af49150503d80600081146101a5576040519150601f19603f3d011682016040523d82523d6000602084013e6101aa565b606091505b509092509050600182151514156101c357805160208201f35b805160208201fdfe5461726765742061646472657373206d75737420626520696e697469616c697a65642ea264697066735822122026d4992ed7562b49b7d3e306977cab94c29f8fb64a137b48d18960cc5ef1341d64736f6c63430007060033", + "devdoc": { + "kind": "dev", + "methods": { + "constructor": { + "params": { + "_implementationName": "implementationName of the contract to proxy to.", + "_libAddressManager": "Address of the Lib_AddressManager." + } + } + }, + "title": "Lib_ResolvedDelegateProxy", + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + }, + "storageLayout": { + "storage": [ + { + "astId": 12092, + "contract": "contracts/optimistic-ethereum/libraries/resolver/Lib_ResolvedDelegateProxy.sol:Lib_ResolvedDelegateProxy", + "label": "implementationName", + "offset": 0, + "slot": "0", + "type": "t_mapping(t_address,t_string_storage)" + }, + { + "astId": 12096, + "contract": "contracts/optimistic-ethereum/libraries/resolver/Lib_ResolvedDelegateProxy.sol:Lib_ResolvedDelegateProxy", + "label": "addressManager", + "offset": 0, + "slot": "1", + "type": "t_mapping(t_address,t_contract(Lib_AddressManager)12048)" + } + ], + "types": { + "t_address": { + "encoding": "inplace", + "label": "address", + "numberOfBytes": "20" + }, + "t_contract(Lib_AddressManager)12048": { + "encoding": "inplace", + "label": "contract Lib_AddressManager", + "numberOfBytes": "20" + }, + "t_mapping(t_address,t_contract(Lib_AddressManager)12048)": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => contract Lib_AddressManager)", + "numberOfBytes": "32", + "value": "t_contract(Lib_AddressManager)12048" + }, + "t_mapping(t_address,t_string_storage)": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => string)", + "numberOfBytes": "32", + "value": "t_string_storage" + }, + "t_string_storage": { + "encoding": "bytes", + "label": "string", + "numberOfBytes": "32" + } + } + } +} \ No newline at end of file diff --git a/packages/contracts/deployments/goerli-v3/mockOVM_BondManager.json b/packages/contracts/deployments/goerli-v3/mockOVM_BondManager.json new file mode 100644 index 0000000000000..013c9656cb3f2 --- /dev/null +++ b/packages/contracts/deployments/goerli-v3/mockOVM_BondManager.json @@ -0,0 +1,242 @@ +{ + "address": "0x35a7735F9f517d071d5cFf89D11Ab4488bc5Df8C", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_libAddressManager", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_who", + "type": "address" + } + ], + "name": "claim", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "deposit", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_preStateRoot", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "_publisher", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_timestamp", + "type": "uint256" + } + ], + "name": "finalize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "finalizeWithdrawal", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "getGasSpent", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_who", + "type": "address" + } + ], + "name": "isCollateralized", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "libAddressManager", + "outputs": [ + { + "internalType": "contract Lib_AddressManager", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_preStateRoot", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "_txHash", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "_who", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_gasSpent", + "type": "uint256" + } + ], + "name": "recordGasSpent", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "_name", + "type": "string" + } + ], + "name": "resolve", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "startWithdrawal", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "transactionHash": "0xd3ec4ca65af45c592fff0d78013702b253b1b3c8e1d1c76ccf17180dfa1f32ab", + "receipt": { + "to": null, + "from": "0x4107438C1b1579f258AF9d1AC06194C4a0F55040", + "contractAddress": "0x35a7735F9f517d071d5cFf89D11Ab4488bc5Df8C", + "transactionIndex": 3, + "gasUsed": "298498", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0x07330e15f5aa83781291ad50e573aa2edc5cb158477fcb8df5e1d0ddbd38415d", + "transactionHash": "0xd3ec4ca65af45c592fff0d78013702b253b1b3c8e1d1c76ccf17180dfa1f32ab", + "logs": [], + "blockNumber": 4694104, + "cumulativeGasUsed": "1677808", + "status": 1, + "byzantium": true + }, + "args": [ + "0xE3d08F0D900A2D53cB794cf82d7127764BcC3092" + ], + "solcInputHash": "dde656dd41f49cad9eac9bc7065fd6a7", + "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_who\",\"type\":\"address\"}],\"name\":\"claim\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"deposit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_preStateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"_publisher\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_timestamp\",\"type\":\"uint256\"}],\"name\":\"finalize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"finalizeWithdrawal\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"getGasSpent\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_who\",\"type\":\"address\"}],\"name\":\"isCollateralized\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_preStateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"_txHash\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"_who\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_gasSpent\",\"type\":\"uint256\"}],\"name\":\"recordGasSpent\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"startWithdrawal\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}}},\"title\":\"mockOVM_BondManager\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/mockOVM/verification/mockOVM_BondManager.sol\":\"mockOVM_BondManager\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor () internal {\\n address msgSender = _msgSender();\\n _owner = msgSender;\\n emit OwnershipTransferred(address(0), msgSender);\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n emit OwnershipTransferred(_owner, address(0));\\n _owner = address(0);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n emit OwnershipTransferred(_owner, newOwner);\\n _owner = newOwner;\\n }\\n}\\n\",\"keccak256\":\"0x15e2d5bd4c28a88548074c54d220e8086f638a71ed07e6b3ba5a70066fcf458d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with GSN meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address payable) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes memory) {\\n this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x8d3cb350f04ff49cfb10aef08d87f19dcbaecc8027b0bed12f3275cd12f38cf0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/verification/iOVM_BondManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\ninterface ERC20 {\\n function transfer(address, uint256) external returns (bool);\\n function transferFrom(address, address, uint256) external returns (bool);\\n}\\n\\n/// All the errors which may be encountered on the bond manager\\nlibrary Errors {\\n string constant ERC20_ERR = \\\"BondManager: Could not post bond\\\";\\n string constant ALREADY_FINALIZED = \\\"BondManager: Fraud proof for this pre-state root has already been finalized\\\";\\n string constant SLASHED = \\\"BondManager: Cannot finalize withdrawal, you probably got slashed\\\";\\n string constant WRONG_STATE = \\\"BondManager: Wrong bond state for proposer\\\";\\n string constant CANNOT_CLAIM = \\\"BondManager: Cannot claim yet. Dispute must be finalized first\\\";\\n\\n string constant WITHDRAWAL_PENDING = \\\"BondManager: Withdrawal already pending\\\";\\n string constant TOO_EARLY = \\\"BondManager: Too early to finalize your withdrawal\\\";\\n\\n string constant ONLY_TRANSITIONER = \\\"BondManager: Only the transitioner for this pre-state root may call this function\\\";\\n string constant ONLY_FRAUD_VERIFIER = \\\"BondManager: Only the fraud verifier may call this function\\\";\\n string constant ONLY_STATE_COMMITMENT_CHAIN = \\\"BondManager: Only the state commitment chain may call this function\\\";\\n string constant WAIT_FOR_DISPUTES = \\\"BondManager: Wait for other potential disputes\\\";\\n}\\n\\n/**\\n * @title iOVM_BondManager\\n */\\ninterface iOVM_BondManager {\\n\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n /// The lifecycle of a proposer's bond\\n enum State {\\n // Before depositing or after getting slashed, a user is uncollateralized\\n NOT_COLLATERALIZED,\\n // After depositing, a user is collateralized\\n COLLATERALIZED,\\n // After a user has initiated a withdrawal\\n WITHDRAWING\\n }\\n\\n /// A bond posted by a proposer\\n struct Bond {\\n // The user's state\\n State state;\\n // The timestamp at which a proposer issued their withdrawal request\\n uint32 withdrawalTimestamp;\\n // The time when the first disputed was initiated for this bond\\n uint256 firstDisputeAt;\\n // The earliest observed state root for this bond which has had fraud\\n bytes32 earliestDisputedStateRoot;\\n // The state root's timestamp\\n uint256 earliestTimestamp;\\n }\\n\\n // Per pre-state root, store the number of state provisions that were made\\n // and how many of these calls were made by each user. Payouts will then be\\n // claimed by users proportionally for that dispute.\\n struct Rewards {\\n // Flag to check if rewards for a fraud proof are claimable\\n bool canClaim;\\n // Total number of `recordGasSpent` calls made\\n uint256 total;\\n // The gas spent by each user to provide witness data. The sum of all\\n // values inside this map MUST be equal to the value of `total`\\n mapping(address => uint256) gasSpent;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function recordGasSpent(\\n bytes32 _preStateRoot,\\n bytes32 _txHash,\\n address _who,\\n uint256 _gasSpent\\n ) external;\\n\\n function finalize(\\n bytes32 _preStateRoot,\\n address _publisher,\\n uint256 _timestamp\\n ) external;\\n\\n function deposit() external;\\n\\n function startWithdrawal() external;\\n\\n function finalizeWithdrawal() external;\\n\\n function claim(\\n address _who\\n ) external;\\n\\n function isCollateralized(\\n address _who\\n ) external view returns (bool);\\n\\n function getGasSpent(\\n bytes32 _preStateRoot,\\n address _who\\n ) external view returns (uint256);\\n}\\n\",\"keccak256\":\"0x3c2a8a399487857158649db1896749d86e39cba545a8aeb2e2bb0f3bdfa7a5b1\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n public\\n onlyOwner\\n {\\n addresses[_getNameHash(_name)] = _address;\\n\\n emit AddressSet(\\n _name,\\n _address\\n );\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0x2ce671a0e004df88b136bea5a3c59d0732cea8887c8496da1d509e0200b03d7d\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(\\n address _libAddressManager\\n ) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x65981feeabff6a81783ea97d44baf988a18a86c8cb374c46fdb71819cbacc7c0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/mockOVM/verification/mockOVM_BondManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Interface Imports */\\nimport { iOVM_BondManager } from \\\"../../iOVM/verification/iOVM_BondManager.sol\\\";\\n\\n/* Contract Imports */\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/**\\n * @title mockOVM_BondManager\\n */\\ncontract mockOVM_BondManager is iOVM_BondManager, Lib_AddressResolver {\\n constructor(\\n address _libAddressManager\\n )\\n Lib_AddressResolver(_libAddressManager)\\n {}\\n\\n function recordGasSpent(\\n bytes32 _preStateRoot,\\n bytes32 _txHash,\\n address _who,\\n uint256 _gasSpent\\n )\\n override\\n public\\n {}\\n\\n function finalize(\\n bytes32 _preStateRoot,\\n address _publisher,\\n uint256 _timestamp\\n )\\n override\\n public\\n {}\\n\\n function deposit()\\n override\\n public\\n {}\\n\\n function startWithdrawal()\\n override\\n public\\n {}\\n\\n function finalizeWithdrawal()\\n override\\n public\\n {}\\n\\n function claim(\\n address _who\\n )\\n override\\n public\\n {}\\n\\n function isCollateralized(\\n address _who\\n )\\n override\\n public\\n view\\n returns (\\n bool\\n )\\n {\\n // Only authenticate sequencer to submit state root batches.\\n return _who == resolve(\\\"OVM_Proposer\\\");\\n }\\n\\n function getGasSpent(\\n bytes32, // _preStateRoot,\\n address // _who\\n )\\n override\\n public\\n pure\\n returns (\\n uint256\\n )\\n {\\n return 0;\\n }\\n}\\n\",\"keccak256\":\"0xe649b49573ba5babca407f116e97dc13f24bf677cbcd03824a2eb98a7750c4e8\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x608060405234801561001057600080fd5b506040516104673803806104678339818101604052602081101561003357600080fd5b5051600080546001600160a01b039092166001600160a01b0319909216919091179055610402806100656000396000f3fe608060405234801561001057600080fd5b506004361061009e5760003560e01c8063abfbbe1311610066578063abfbbe1314610207578063bc2f8dd814610239578063c5b6aa2f14610239578063d0e30db014610239578063dc6453dc146102415761009e565b806302ad4d2a146100a35780631e16e92f146100dd5780631e83409a14610117578063299ca4781461013d578063461a447814610161575b600080fd5b6100c9600480360360208110156100b957600080fd5b50356001600160a01b031661027f565b604080519115158252519081900360200190f35b610115600480360360808110156100f357600080fd5b508035906020810135906001600160a01b0360408201351690606001356102c9565b005b6101156004803603602081101561012d57600080fd5b50356001600160a01b03166102cf565b6101456102d2565b604080516001600160a01b039092168252519081900360200190f35b6101456004803603602081101561017757600080fd5b81019060208101813564010000000081111561019257600080fd5b8201836020820111156101a457600080fd5b803590602001918460018302840111640100000000831117156101c657600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506102e1945050505050565b6101156004803603606081101561021d57600080fd5b508035906001600160a01b0360208201351690604001356103bd565b6101156103c2565b61026d6004803603604081101561025757600080fd5b50803590602001356001600160a01b03166103c4565b60408051918252519081900360200190f35b60006102ae6040518060400160405280600c81526020016b27ab26afa83937b837b9b2b960a11b8152506102e1565b6001600160a01b0316826001600160a01b0316149050919050565b50505050565b50565b6000546001600160a01b031681565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b83811015610341578181015183820152602001610329565b50505050905090810190601f16801561036e5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561038b57600080fd5b505afa15801561039f573d6000803e3d6000fd5b505050506040513d60208110156103b557600080fd5b505192915050565b505050565b565b60009291505056fea264697066735822122023ce16ce6de3f7672940d40a33de4b777fbb7eaa3ec117bcace31640220db75d64736f6c63430007060033", + "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061009e5760003560e01c8063abfbbe1311610066578063abfbbe1314610207578063bc2f8dd814610239578063c5b6aa2f14610239578063d0e30db014610239578063dc6453dc146102415761009e565b806302ad4d2a146100a35780631e16e92f146100dd5780631e83409a14610117578063299ca4781461013d578063461a447814610161575b600080fd5b6100c9600480360360208110156100b957600080fd5b50356001600160a01b031661027f565b604080519115158252519081900360200190f35b610115600480360360808110156100f357600080fd5b508035906020810135906001600160a01b0360408201351690606001356102c9565b005b6101156004803603602081101561012d57600080fd5b50356001600160a01b03166102cf565b6101456102d2565b604080516001600160a01b039092168252519081900360200190f35b6101456004803603602081101561017757600080fd5b81019060208101813564010000000081111561019257600080fd5b8201836020820111156101a457600080fd5b803590602001918460018302840111640100000000831117156101c657600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506102e1945050505050565b6101156004803603606081101561021d57600080fd5b508035906001600160a01b0360208201351690604001356103bd565b6101156103c2565b61026d6004803603604081101561025757600080fd5b50803590602001356001600160a01b03166103c4565b60408051918252519081900360200190f35b60006102ae6040518060400160405280600c81526020016b27ab26afa83937b837b9b2b960a11b8152506102e1565b6001600160a01b0316826001600160a01b0316149050919050565b50505050565b50565b6000546001600160a01b031681565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b83811015610341578181015183820152602001610329565b50505050905090810190601f16801561036e5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561038b57600080fd5b505afa15801561039f573d6000803e3d6000fd5b505050506040513d60208110156103b557600080fd5b505192915050565b505050565b565b60009291505056fea264697066735822122023ce16ce6de3f7672940d40a33de4b777fbb7eaa3ec117bcace31640220db75d64736f6c63430007060033", + "devdoc": { + "kind": "dev", + "methods": { + "resolve(string)": { + "params": { + "_name": "Name to resolve an address for." + }, + "returns": { + "_0": "Address associated with the given name." + } + } + }, + "title": "mockOVM_BondManager", + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": { + "resolve(string)": { + "notice": "Resolves the address associated with a given name." + } + }, + "version": 1 + }, + "storageLayout": { + "storage": [ + { + "astId": 12055, + "contract": "contracts/optimistic-ethereum/mockOVM/verification/mockOVM_BondManager.sol:mockOVM_BondManager", + "label": "libAddressManager", + "offset": 0, + "slot": "0", + "type": "t_contract(Lib_AddressManager)12048" + } + ], + "types": { + "t_contract(Lib_AddressManager)12048": { + "encoding": "inplace", + "label": "contract Lib_AddressManager", + "numberOfBytes": "20" + } + } + } +} \ No newline at end of file diff --git a/packages/contracts/deployments/goerli-v3/solcInputs/dde656dd41f49cad9eac9bc7065fd6a7.json b/packages/contracts/deployments/goerli-v3/solcInputs/dde656dd41f49cad9eac9bc7065fd6a7.json new file mode 100644 index 0000000000000..8e5b0ba17232f --- /dev/null +++ b/packages/contracts/deployments/goerli-v3/solcInputs/dde656dd41f49cad9eac9bc7065fd6a7.json @@ -0,0 +1,290 @@ +{ + "language": "Solidity", + "sources": { + "contracts/optimistic-ethereum/iOVM/accounts/iOVM_ECDSAContractAccount.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/**\n * @title iOVM_ECDSAContractAccount\n */\ninterface iOVM_ECDSAContractAccount {\n\n /********************\n * Public Functions *\n ********************/\n\n function execute(\n bytes memory _encodedTransaction\n )\n external\n returns (\n bool,\n bytes memory\n );\n}\n" + }, + "contracts/optimistic-ethereum/libraries/codec/Lib_OVMCodec.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_RLPReader } from \"../rlp/Lib_RLPReader.sol\";\nimport { Lib_RLPWriter } from \"../rlp/Lib_RLPWriter.sol\";\nimport { Lib_BytesUtils } from \"../utils/Lib_BytesUtils.sol\";\nimport { Lib_Bytes32Utils } from \"../utils/Lib_Bytes32Utils.sol\";\n\n/**\n * @title Lib_OVMCodec\n */\nlibrary Lib_OVMCodec {\n\n /*********\n * Enums *\n *********/\n\n enum QueueOrigin {\n SEQUENCER_QUEUE,\n L1TOL2_QUEUE\n }\n\n\n /***********\n * Structs *\n ***********/\n\n struct Account {\n uint256 nonce;\n uint256 balance;\n bytes32 storageRoot;\n bytes32 codeHash;\n address ethAddress;\n bool isFresh;\n }\n\n struct EVMAccount {\n uint256 nonce;\n uint256 balance;\n bytes32 storageRoot;\n bytes32 codeHash;\n }\n\n struct ChainBatchHeader {\n uint256 batchIndex;\n bytes32 batchRoot;\n uint256 batchSize;\n uint256 prevTotalElements;\n bytes extraData;\n }\n\n struct ChainInclusionProof {\n uint256 index;\n bytes32[] siblings;\n }\n\n struct Transaction {\n uint256 timestamp;\n uint256 blockNumber;\n QueueOrigin l1QueueOrigin;\n address l1TxOrigin;\n address entrypoint;\n uint256 gasLimit;\n bytes data;\n }\n\n struct TransactionChainElement {\n bool isSequenced;\n uint256 queueIndex; // QUEUED TX ONLY\n uint256 timestamp; // SEQUENCER TX ONLY\n uint256 blockNumber; // SEQUENCER TX ONLY\n bytes txData; // SEQUENCER TX ONLY\n }\n\n struct QueueElement {\n bytes32 transactionHash;\n uint40 timestamp;\n uint40 blockNumber;\n }\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Encodes a standard OVM transaction.\n * @param _transaction OVM transaction to encode.\n * @return Encoded transaction bytes.\n */\n function encodeTransaction(\n Transaction memory _transaction\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n return abi.encodePacked(\n _transaction.timestamp,\n _transaction.blockNumber,\n _transaction.l1QueueOrigin,\n _transaction.l1TxOrigin,\n _transaction.entrypoint,\n _transaction.gasLimit,\n _transaction.data\n );\n }\n\n /**\n * Hashes a standard OVM transaction.\n * @param _transaction OVM transaction to encode.\n * @return Hashed transaction\n */\n function hashTransaction(\n Transaction memory _transaction\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n return keccak256(encodeTransaction(_transaction));\n }\n\n /**\n * Converts an OVM account to an EVM account.\n * @param _in OVM account to convert.\n * @return Converted EVM account.\n */\n function toEVMAccount(\n Account memory _in\n )\n internal\n pure\n returns (\n EVMAccount memory\n )\n {\n return EVMAccount({\n nonce: _in.nonce,\n balance: _in.balance,\n storageRoot: _in.storageRoot,\n codeHash: _in.codeHash\n });\n }\n\n /**\n * @notice RLP-encodes an account state struct.\n * @param _account Account state struct.\n * @return RLP-encoded account state.\n */\n function encodeEVMAccount(\n EVMAccount memory _account\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n bytes[] memory raw = new bytes[](4);\n\n // Unfortunately we can't create this array outright because\n // Lib_RLPWriter.writeList will reject fixed-size arrays. Assigning\n // index-by-index circumvents this issue.\n raw[0] = Lib_RLPWriter.writeBytes(\n Lib_Bytes32Utils.removeLeadingZeros(\n bytes32(_account.nonce)\n )\n );\n raw[1] = Lib_RLPWriter.writeBytes(\n Lib_Bytes32Utils.removeLeadingZeros(\n bytes32(_account.balance)\n )\n );\n raw[2] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.storageRoot));\n raw[3] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.codeHash));\n\n return Lib_RLPWriter.writeList(raw);\n }\n\n /**\n * @notice Decodes an RLP-encoded account state into a useful struct.\n * @param _encoded RLP-encoded account state.\n * @return Account state struct.\n */\n function decodeEVMAccount(\n bytes memory _encoded\n )\n internal\n pure\n returns (\n EVMAccount memory\n )\n {\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\n\n return EVMAccount({\n nonce: Lib_RLPReader.readUint256(accountState[0]),\n balance: Lib_RLPReader.readUint256(accountState[1]),\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\n });\n }\n\n /**\n * Calculates a hash for a given batch header.\n * @param _batchHeader Header to hash.\n * @return Hash of the header.\n */\n function hashBatchHeader(\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n return keccak256(\n abi.encode(\n _batchHeader.batchRoot,\n _batchHeader.batchSize,\n _batchHeader.prevTotalElements,\n _batchHeader.extraData\n )\n );\n }\n}\n" + }, + "contracts/optimistic-ethereum/libraries/rlp/Lib_RLPReader.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/**\n * @title Lib_RLPReader\n * @dev Adapted from \"RLPReader\" by Hamdi Allam (hamdi.allam97@gmail.com).\n */\nlibrary Lib_RLPReader {\n\n /*************\n * Constants *\n *************/\n\n uint256 constant internal MAX_LIST_LENGTH = 32;\n\n\n /*********\n * Enums *\n *********/\n\n enum RLPItemType {\n DATA_ITEM,\n LIST_ITEM\n }\n\n\n /***********\n * Structs *\n ***********/\n\n struct RLPItem {\n uint256 length;\n uint256 ptr;\n }\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Converts bytes to a reference to memory position and length.\n * @param _in Input bytes to convert.\n * @return Output memory reference.\n */\n function toRLPItem(\n bytes memory _in\n )\n internal\n pure\n returns (\n RLPItem memory\n )\n {\n uint256 ptr;\n assembly {\n ptr := add(_in, 32)\n }\n\n return RLPItem({\n length: _in.length,\n ptr: ptr\n });\n }\n\n /**\n * Reads an RLP list value into a list of RLP items.\n * @param _in RLP list value.\n * @return Decoded RLP list items.\n */\n function readList(\n RLPItem memory _in\n )\n internal\n pure\n returns (\n RLPItem[] memory\n )\n {\n (\n uint256 listOffset,\n ,\n RLPItemType itemType\n ) = _decodeLength(_in);\n\n require(\n itemType == RLPItemType.LIST_ITEM,\n \"Invalid RLP list value.\"\n );\n\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\n // writing to the length. Since we can't know the number of RLP items without looping over\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\n // simply set a reasonable maximum list length and decrease the size before we finish.\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\n\n uint256 itemCount = 0;\n uint256 offset = listOffset;\n while (offset < _in.length) {\n require(\n itemCount < MAX_LIST_LENGTH,\n \"Provided RLP list exceeds max list length.\"\n );\n\n (\n uint256 itemOffset,\n uint256 itemLength,\n ) = _decodeLength(RLPItem({\n length: _in.length - offset,\n ptr: _in.ptr + offset\n }));\n\n out[itemCount] = RLPItem({\n length: itemLength + itemOffset,\n ptr: _in.ptr + offset\n });\n\n itemCount += 1;\n offset += itemOffset + itemLength;\n }\n\n // Decrease the array size to match the actual item count.\n assembly {\n mstore(out, itemCount)\n }\n\n return out;\n }\n\n /**\n * Reads an RLP list value into a list of RLP items.\n * @param _in RLP list value.\n * @return Decoded RLP list items.\n */\n function readList(\n bytes memory _in\n )\n internal\n pure\n returns (\n RLPItem[] memory\n )\n {\n return readList(\n toRLPItem(_in)\n );\n }\n\n /**\n * Reads an RLP bytes value into bytes.\n * @param _in RLP bytes value.\n * @return Decoded bytes.\n */\n function readBytes(\n RLPItem memory _in\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n (\n uint256 itemOffset,\n uint256 itemLength,\n RLPItemType itemType\n ) = _decodeLength(_in);\n\n require(\n itemType == RLPItemType.DATA_ITEM,\n \"Invalid RLP bytes value.\"\n );\n\n return _copy(_in.ptr, itemOffset, itemLength);\n }\n\n /**\n * Reads an RLP bytes value into bytes.\n * @param _in RLP bytes value.\n * @return Decoded bytes.\n */\n function readBytes(\n bytes memory _in\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n return readBytes(\n toRLPItem(_in)\n );\n }\n\n /**\n * Reads an RLP string value into a string.\n * @param _in RLP string value.\n * @return Decoded string.\n */\n function readString(\n RLPItem memory _in\n )\n internal\n pure\n returns (\n string memory\n )\n {\n return string(readBytes(_in));\n }\n\n /**\n * Reads an RLP string value into a string.\n * @param _in RLP string value.\n * @return Decoded string.\n */\n function readString(\n bytes memory _in\n )\n internal\n pure\n returns (\n string memory\n )\n {\n return readString(\n toRLPItem(_in)\n );\n }\n\n /**\n * Reads an RLP bytes32 value into a bytes32.\n * @param _in RLP bytes32 value.\n * @return Decoded bytes32.\n */\n function readBytes32(\n RLPItem memory _in\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n require(\n _in.length <= 33,\n \"Invalid RLP bytes32 value.\"\n );\n\n (\n uint256 itemOffset,\n uint256 itemLength,\n RLPItemType itemType\n ) = _decodeLength(_in);\n\n require(\n itemType == RLPItemType.DATA_ITEM,\n \"Invalid RLP bytes32 value.\"\n );\n\n uint256 ptr = _in.ptr + itemOffset;\n bytes32 out;\n assembly {\n out := mload(ptr)\n\n // Shift the bytes over to match the item size.\n if lt(itemLength, 32) {\n out := div(out, exp(256, sub(32, itemLength)))\n }\n }\n\n return out;\n }\n\n /**\n * Reads an RLP bytes32 value into a bytes32.\n * @param _in RLP bytes32 value.\n * @return Decoded bytes32.\n */\n function readBytes32(\n bytes memory _in\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n return readBytes32(\n toRLPItem(_in)\n );\n }\n\n /**\n * Reads an RLP uint256 value into a uint256.\n * @param _in RLP uint256 value.\n * @return Decoded uint256.\n */\n function readUint256(\n RLPItem memory _in\n )\n internal\n pure\n returns (\n uint256\n )\n {\n return uint256(readBytes32(_in));\n }\n\n /**\n * Reads an RLP uint256 value into a uint256.\n * @param _in RLP uint256 value.\n * @return Decoded uint256.\n */\n function readUint256(\n bytes memory _in\n )\n internal\n pure\n returns (\n uint256\n )\n {\n return readUint256(\n toRLPItem(_in)\n );\n }\n\n /**\n * Reads an RLP bool value into a bool.\n * @param _in RLP bool value.\n * @return Decoded bool.\n */\n function readBool(\n RLPItem memory _in\n )\n internal\n pure\n returns (\n bool\n )\n {\n require(\n _in.length == 1,\n \"Invalid RLP boolean value.\"\n );\n\n uint256 ptr = _in.ptr;\n uint256 out;\n assembly {\n out := byte(0, mload(ptr))\n }\n\n require(\n out == 0 || out == 1,\n \"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\"\n );\n\n return out != 0;\n }\n\n /**\n * Reads an RLP bool value into a bool.\n * @param _in RLP bool value.\n * @return Decoded bool.\n */\n function readBool(\n bytes memory _in\n )\n internal\n pure\n returns (\n bool\n )\n {\n return readBool(\n toRLPItem(_in)\n );\n }\n\n /**\n * Reads an RLP address value into a address.\n * @param _in RLP address value.\n * @return Decoded address.\n */\n function readAddress(\n RLPItem memory _in\n )\n internal\n pure\n returns (\n address\n )\n {\n if (_in.length == 1) {\n return address(0);\n }\n\n require(\n _in.length == 21,\n \"Invalid RLP address value.\"\n );\n\n return address(readUint256(_in));\n }\n\n /**\n * Reads an RLP address value into a address.\n * @param _in RLP address value.\n * @return Decoded address.\n */\n function readAddress(\n bytes memory _in\n )\n internal\n pure\n returns (\n address\n )\n {\n return readAddress(\n toRLPItem(_in)\n );\n }\n\n /**\n * Reads the raw bytes of an RLP item.\n * @param _in RLP item to read.\n * @return Raw RLP bytes.\n */\n function readRawBytes(\n RLPItem memory _in\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n return _copy(_in);\n }\n\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * Decodes the length of an RLP item.\n * @param _in RLP item to decode.\n * @return Offset of the encoded data.\n * @return Length of the encoded data.\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\n */\n function _decodeLength(\n RLPItem memory _in\n )\n private\n pure\n returns (\n uint256,\n uint256,\n RLPItemType\n )\n {\n require(\n _in.length > 0,\n \"RLP item cannot be null.\"\n );\n\n uint256 ptr = _in.ptr;\n uint256 prefix;\n assembly {\n prefix := byte(0, mload(ptr))\n }\n\n if (prefix <= 0x7f) {\n // Single byte.\n\n return (0, 1, RLPItemType.DATA_ITEM);\n } else if (prefix <= 0xb7) {\n // Short string.\n\n uint256 strLen = prefix - 0x80;\n\n require(\n _in.length > strLen,\n \"Invalid RLP short string.\"\n );\n\n return (1, strLen, RLPItemType.DATA_ITEM);\n } else if (prefix <= 0xbf) {\n // Long string.\n uint256 lenOfStrLen = prefix - 0xb7;\n\n require(\n _in.length > lenOfStrLen,\n \"Invalid RLP long string length.\"\n );\n\n uint256 strLen;\n assembly {\n // Pick out the string length.\n strLen := div(\n mload(add(ptr, 1)),\n exp(256, sub(32, lenOfStrLen))\n )\n }\n\n require(\n _in.length > lenOfStrLen + strLen,\n \"Invalid RLP long string.\"\n );\n\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\n } else if (prefix <= 0xf7) {\n // Short list.\n uint256 listLen = prefix - 0xc0;\n\n require(\n _in.length > listLen,\n \"Invalid RLP short list.\"\n );\n\n return (1, listLen, RLPItemType.LIST_ITEM);\n } else {\n // Long list.\n uint256 lenOfListLen = prefix - 0xf7;\n\n require(\n _in.length > lenOfListLen,\n \"Invalid RLP long list length.\"\n );\n\n uint256 listLen;\n assembly {\n // Pick out the list length.\n listLen := div(\n mload(add(ptr, 1)),\n exp(256, sub(32, lenOfListLen))\n )\n }\n\n require(\n _in.length > lenOfListLen + listLen,\n \"Invalid RLP long list.\"\n );\n\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\n }\n }\n\n /**\n * Copies the bytes from a memory location.\n * @param _src Pointer to the location to read from.\n * @param _offset Offset to start reading from.\n * @param _length Number of bytes to read.\n * @return Copied bytes.\n */\n function _copy(\n uint256 _src,\n uint256 _offset,\n uint256 _length\n )\n private\n pure\n returns (\n bytes memory\n )\n {\n bytes memory out = new bytes(_length);\n if (out.length == 0) {\n return out;\n }\n\n uint256 src = _src + _offset;\n uint256 dest;\n assembly {\n dest := add(out, 32)\n }\n\n // Copy over as many complete words as we can.\n for (uint256 i = 0; i < _length / 32; i++) {\n assembly {\n mstore(dest, mload(src))\n }\n\n src += 32;\n dest += 32;\n }\n\n // Pick out the remaining bytes.\n uint256 mask = 256 ** (32 - (_length % 32)) - 1;\n assembly {\n mstore(\n dest,\n or(\n and(mload(src), not(mask)),\n and(mload(dest), mask)\n )\n )\n }\n\n return out;\n }\n\n /**\n * Copies an RLP item into bytes.\n * @param _in RLP item to copy.\n * @return Copied bytes.\n */\n function _copy(\n RLPItem memory _in\n )\n private\n pure\n returns (\n bytes memory\n )\n {\n return _copy(_in.ptr, 0, _in.length);\n }\n}\n" + }, + "contracts/optimistic-ethereum/libraries/rlp/Lib_RLPWriter.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/**\n * @title Lib_RLPWriter\n * @author Bakaoh (with modifications)\n */\nlibrary Lib_RLPWriter {\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * RLP encodes a byte string.\n * @param _in The byte string to encode.\n * @return The RLP encoded string in bytes.\n */\n function writeBytes(\n bytes memory _in\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n bytes memory encoded;\n\n if (_in.length == 1 && uint8(_in[0]) < 128) {\n encoded = _in;\n } else {\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\n }\n\n return encoded;\n }\n\n /**\n * RLP encodes a list of RLP encoded byte byte strings.\n * @param _in The list of RLP encoded byte strings.\n * @return The RLP encoded list of items in bytes.\n */\n function writeList(\n bytes[] memory _in\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n bytes memory list = _flatten(_in);\n return abi.encodePacked(_writeLength(list.length, 192), list);\n }\n\n /**\n * RLP encodes a string.\n * @param _in The string to encode.\n * @return The RLP encoded string in bytes.\n */\n function writeString(\n string memory _in\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n return writeBytes(bytes(_in));\n }\n\n /**\n * RLP encodes an address.\n * @param _in The address to encode.\n * @return The RLP encoded address in bytes.\n */\n function writeAddress(\n address _in\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n return writeBytes(abi.encodePacked(_in));\n }\n\n /**\n * RLP encodes a bytes32 value.\n * @param _in The bytes32 to encode.\n * @return _out The RLP encoded bytes32 in bytes.\n */\n function writeBytes32(\n bytes32 _in\n )\n internal\n pure\n returns (\n bytes memory _out\n )\n {\n return writeBytes(abi.encodePacked(_in));\n }\n\n /**\n * RLP encodes a uint.\n * @param _in The uint256 to encode.\n * @return The RLP encoded uint256 in bytes.\n */\n function writeUint(\n uint256 _in\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n return writeBytes(_toBinary(_in));\n }\n\n /**\n * RLP encodes a bool.\n * @param _in The bool to encode.\n * @return The RLP encoded bool in bytes.\n */\n function writeBool(\n bool _in\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n bytes memory encoded = new bytes(1);\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\n return encoded;\n }\n\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\n * @param _len The length of the string or the payload.\n * @param _offset 128 if item is string, 192 if item is list.\n * @return RLP encoded bytes.\n */\n function _writeLength(\n uint256 _len,\n uint256 _offset\n )\n private\n pure\n returns (\n bytes memory\n )\n {\n bytes memory encoded;\n\n if (_len < 56) {\n encoded = new bytes(1);\n encoded[0] = byte(uint8(_len) + uint8(_offset));\n } else {\n uint256 lenLen;\n uint256 i = 1;\n while (_len / i != 0) {\n lenLen++;\n i *= 256;\n }\n\n encoded = new bytes(lenLen + 1);\n encoded[0] = byte(uint8(lenLen) + uint8(_offset) + 55);\n for(i = 1; i <= lenLen; i++) {\n encoded[i] = byte(uint8((_len / (256**(lenLen-i))) % 256));\n }\n }\n\n return encoded;\n }\n\n /**\n * Encode integer in big endian binary form with no leading zeroes.\n * @notice TODO: This should be optimized with assembly to save gas costs.\n * @param _x The integer to encode.\n * @return RLP encoded bytes.\n */\n function _toBinary(\n uint256 _x\n )\n private\n pure\n returns (\n bytes memory\n )\n {\n bytes memory b = abi.encodePacked(_x);\n\n uint256 i = 0;\n for (; i < 32; i++) {\n if (b[i] != 0) {\n break;\n }\n }\n\n bytes memory res = new bytes(32 - i);\n for (uint256 j = 0; j < res.length; j++) {\n res[j] = b[i++];\n }\n\n return res;\n }\n\n /**\n * Copies a piece of memory to another location.\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\n * @param _dest Destination location.\n * @param _src Source location.\n * @param _len Length of memory to copy.\n */\n function _memcpy(\n uint256 _dest,\n uint256 _src,\n uint256 _len\n )\n private\n pure\n {\n uint256 dest = _dest;\n uint256 src = _src;\n uint256 len = _len;\n\n for(; len >= 32; len -= 32) {\n assembly {\n mstore(dest, mload(src))\n }\n dest += 32;\n src += 32;\n }\n\n uint256 mask = 256 ** (32 - len) - 1;\n assembly {\n let srcpart := and(mload(src), not(mask))\n let destpart := and(mload(dest), mask)\n mstore(dest, or(destpart, srcpart))\n }\n }\n\n /**\n * Flattens a list of byte strings into one byte string.\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\n * @param _list List of byte strings to flatten.\n * @return The flattened byte string.\n */\n function _flatten(\n bytes[] memory _list\n )\n private\n pure\n returns (\n bytes memory\n )\n {\n if (_list.length == 0) {\n return new bytes(0);\n }\n\n uint256 len;\n uint256 i = 0;\n for (; i < _list.length; i++) {\n len += _list[i].length;\n }\n\n bytes memory flattened = new bytes(len);\n uint256 flattenedPtr;\n assembly { flattenedPtr := add(flattened, 0x20) }\n\n for(i = 0; i < _list.length; i++) {\n bytes memory item = _list[i];\n\n uint256 listPtr;\n assembly { listPtr := add(item, 0x20)}\n\n _memcpy(flattenedPtr, listPtr, item.length);\n flattenedPtr += _list[i].length;\n }\n\n return flattened;\n }\n}\n" + }, + "contracts/optimistic-ethereum/libraries/utils/Lib_BytesUtils.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/**\n * @title Lib_BytesUtils\n */\nlibrary Lib_BytesUtils {\n\n /**********************\n * Internal Functions *\n **********************/\n\n function slice(\n bytes memory _bytes,\n uint256 _start,\n uint256 _length\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n require(_length + 31 >= _length, \"slice_overflow\");\n require(_start + _length >= _start, \"slice_overflow\");\n require(_bytes.length >= _start + _length, \"slice_outOfBounds\");\n\n bytes memory tempBytes;\n\n assembly {\n switch iszero(_length)\n case 0 {\n // Get a location of some free memory and store it in tempBytes as\n // Solidity does for memory variables.\n tempBytes := mload(0x40)\n\n // The first word of the slice result is potentially a partial\n // word read from the original array. To read it, we calculate\n // the length of that partial word and start copying that many\n // bytes into the array. The first word we copy will start with\n // data we don't care about, but the last `lengthmod` bytes will\n // land at the beginning of the contents of the new array. When\n // we're done copying, we overwrite the full first word with\n // the actual length of the slice.\n let lengthmod := and(_length, 31)\n\n // The multiplication in the next line is necessary\n // because when slicing multiples of 32 bytes (lengthmod == 0)\n // the following copy loop was copying the origin's length\n // and then ending prematurely not copying everything it should.\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\n let end := add(mc, _length)\n\n for {\n // The multiplication in the next line has the same exact purpose\n // as the one above.\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\n } lt(mc, end) {\n mc := add(mc, 0x20)\n cc := add(cc, 0x20)\n } {\n mstore(mc, mload(cc))\n }\n\n mstore(tempBytes, _length)\n\n //update free-memory pointer\n //allocating the array padded to 32 bytes like the compiler does now\n mstore(0x40, and(add(mc, 31), not(31)))\n }\n //if we want a zero-length slice let's just return a zero-length array\n default {\n tempBytes := mload(0x40)\n\n //zero out the 32 bytes slice we are about to return\n //we need to do it because Solidity does not garbage collect\n mstore(tempBytes, 0)\n\n mstore(0x40, add(tempBytes, 0x20))\n }\n }\n\n return tempBytes;\n }\n\n function slice(\n bytes memory _bytes,\n uint256 _start\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n if (_bytes.length - _start == 0) {\n return bytes('');\n }\n\n return slice(_bytes, _start, _bytes.length - _start);\n }\n\n function toBytes32PadLeft(\n bytes memory _bytes\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n bytes32 ret;\n uint256 len = _bytes.length <= 32 ? _bytes.length : 32;\n assembly {\n ret := shr(mul(sub(32, len), 8), mload(add(_bytes, 32)))\n }\n return ret;\n }\n\n function toBytes32(\n bytes memory _bytes\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n if (_bytes.length < 32) {\n bytes32 ret;\n assembly {\n ret := mload(add(_bytes, 32))\n }\n return ret;\n }\n\n return abi.decode(_bytes,(bytes32)); // will truncate if input length > 32 bytes\n }\n\n function toUint256(\n bytes memory _bytes\n )\n internal\n pure\n returns (\n uint256\n )\n {\n return uint256(toBytes32(_bytes));\n }\n\n function toUint24(\n bytes memory _bytes,\n uint256 _start\n )\n internal\n pure\n returns (\n uint24\n )\n {\n require(_start + 3 >= _start, \"toUint24_overflow\");\n require(_bytes.length >= _start + 3 , \"toUint24_outOfBounds\");\n uint24 tempUint;\n\n assembly {\n tempUint := mload(add(add(_bytes, 0x3), _start))\n }\n\n return tempUint;\n }\n\n function toUint8(\n bytes memory _bytes,\n uint256 _start\n )\n internal\n pure\n returns (\n uint8\n )\n {\n require(_start + 1 >= _start, \"toUint8_overflow\");\n require(_bytes.length >= _start + 1 , \"toUint8_outOfBounds\");\n uint8 tempUint;\n\n assembly {\n tempUint := mload(add(add(_bytes, 0x1), _start))\n }\n\n return tempUint;\n }\n\n function toAddress(\n bytes memory _bytes,\n uint256 _start\n )\n internal\n pure\n returns (\n address\n )\n {\n require(_start + 20 >= _start, \"toAddress_overflow\");\n require(_bytes.length >= _start + 20, \"toAddress_outOfBounds\");\n address tempAddress;\n\n assembly {\n tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000)\n }\n\n return tempAddress;\n }\n\n function toNibbles(\n bytes memory _bytes\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n bytes memory nibbles = new bytes(_bytes.length * 2);\n\n for (uint256 i = 0; i < _bytes.length; i++) {\n nibbles[i * 2] = _bytes[i] >> 4;\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\n }\n\n return nibbles;\n }\n\n function fromNibbles(\n bytes memory _bytes\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n bytes memory ret = new bytes(_bytes.length / 2);\n\n for (uint256 i = 0; i < ret.length; i++) {\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\n }\n\n return ret;\n }\n\n function equal(\n bytes memory _bytes,\n bytes memory _other\n )\n internal\n pure\n returns (\n bool\n )\n {\n return keccak256(_bytes) == keccak256(_other);\n }\n}\n" + }, + "contracts/optimistic-ethereum/libraries/utils/Lib_Bytes32Utils.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/**\n * @title Lib_Byte32Utils\n */\nlibrary Lib_Bytes32Utils {\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \"true.\"\n * @param _in Input bytes32 value.\n * @return Bytes32 as a boolean.\n */\n function toBool(\n bytes32 _in\n )\n internal\n pure\n returns (\n bool\n )\n {\n return _in != 0;\n }\n\n /**\n * Converts a boolean to a bytes32 value.\n * @param _in Input boolean value.\n * @return Boolean as a bytes32.\n */\n function fromBool(\n bool _in\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n return bytes32(uint256(_in ? 1 : 0));\n }\n\n /**\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\n * @param _in Input bytes32 value.\n * @return Bytes32 as an address.\n */\n function toAddress(\n bytes32 _in\n )\n internal\n pure\n returns (\n address\n )\n {\n return address(uint160(uint256(_in)));\n }\n\n /**\n * Converts an address to a bytes32.\n * @param _in Input address value.\n * @return Address as a bytes32.\n */\n function fromAddress(\n address _in\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n return bytes32(uint256(_in));\n }\n\n /**\n * Removes the leading zeros from a bytes32 value and returns a new (smaller) bytes value.\n * @param _in Input bytes32 value.\n * @return Bytes32 without any leading zeros.\n */\n function removeLeadingZeros(\n bytes32 _in\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n bytes memory out;\n\n assembly {\n // Figure out how many leading zero bytes to remove.\n let shift := 0\n for { let i := 0 } and(lt(i, 32), eq(byte(i, _in), 0)) { i := add(i, 1) } {\n shift := add(shift, 1)\n }\n\n // Reserve some space for our output and fix the free memory pointer.\n out := mload(0x40)\n mstore(0x40, add(out, 0x40))\n\n // Shift the value and store it into the output bytes.\n mstore(add(out, 0x20), shl(mul(shift, 8), _in))\n\n // Store the new size (with leading zero bytes removed) in the output byte size.\n mstore(out, sub(32, shift))\n }\n\n return out;\n }\n}\n" + }, + "contracts/optimistic-ethereum/libraries/codec/Lib_EIP155Tx.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_RLPReader } from \"../rlp/Lib_RLPReader.sol\";\nimport { Lib_RLPWriter } from \"../rlp/Lib_RLPWriter.sol\";\n\n/**\n * @title Lib_EIP155Tx\n * @dev A simple library for dealing with the transaction type defined by EIP155:\n * https://github.com/ethereum/EIPs/blob/master/EIPS/eip-155.md\n */\nlibrary Lib_EIP155Tx {\n\n /***********\n * Structs *\n ***********/\n\n // Struct representing an EIP155 transaction. See EIP link above for more information.\n struct EIP155Tx {\n // These fields correspond to the actual RLP-encoded fields specified by EIP155.\n uint256 nonce;\n uint256 gasPrice;\n uint256 gasLimit;\n address to;\n uint256 value;\n bytes data;\n uint8 v;\n bytes32 r;\n bytes32 s;\n\n // Chain ID to associate this transaction with. Used all over the place, seemed easier to\n // set this once when we create the transaction rather than providing it as an input to\n // each function. I don't see a strong need to have a transaction with a mutable chain ID.\n uint256 chainId;\n\n // The ECDSA \"recovery parameter,\" should always be 0 or 1. EIP155 specifies that:\n // `v = {0,1} + CHAIN_ID * 2 + 35`\n // Where `{0,1}` is a stand in for our `recovery_parameter`. Now computing our formula for\n // the recovery parameter:\n // 1. `v = {0,1} + CHAIN_ID * 2 + 35`\n // 2. `v = recovery_parameter + CHAIN_ID * 2 + 35`\n // 3. `v - CHAIN_ID * 2 - 35 = recovery_parameter`\n // So we're left with the final formula:\n // `recovery_parameter = v - CHAIN_ID * 2 - 35`\n // NOTE: This variable is a uint8 because `v` is inherently limited to a uint8. If we\n // didn't use a uint8, then recovery_parameter would always be a negative number for chain\n // IDs greater than 110 (`255 - 110 * 2 - 35 = 0`). So we need to wrap around to support\n // anything larger.\n uint8 recoveryParam; \n\n // Whether or not the transaction is a creation. Necessary because we can't make an address\n // \"nil\". Using the zero address creates a potential conflict if the user did actually\n // intend to send a transaction to the zero address.\n bool isCreate; \n }\n\n // Lets us use nicer syntax.\n using Lib_EIP155Tx for EIP155Tx;\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Decodes an EIP155 transaction and attaches a given Chain ID.\n * Transaction *must* be RLP-encoded.\n * @param _encoded RLP-encoded EIP155 transaction.\n * @param _chainId Chain ID to assocaite with this transaction.\n * @return Parsed transaction.\n */\n function decode(\n bytes memory _encoded,\n uint256 _chainId\n )\n internal\n pure\n returns (\n EIP155Tx memory\n )\n {\n Lib_RLPReader.RLPItem[] memory decoded = Lib_RLPReader.readList(_encoded);\n\n // Note formula above about how recoveryParam is computed.\n uint8 v = uint8(Lib_RLPReader.readUint256(decoded[6]));\n uint8 recoveryParam = uint8(v - 2 * _chainId - 35);\n\n // Recovery param being anything other than 0 or 1 indicates that we have the wrong chain\n // ID.\n require(\n recoveryParam < 2,\n \"Lib_EIP155Tx: Transaction signed with wrong chain ID\"\n );\n\n // Creations can be detected by looking at the byte length here.\n bool isCreate = Lib_RLPReader.readBytes(decoded[3]).length == 0;\n\n return EIP155Tx({\n nonce: Lib_RLPReader.readUint256(decoded[0]),\n gasPrice: Lib_RLPReader.readUint256(decoded[1]),\n gasLimit: Lib_RLPReader.readUint256(decoded[2]),\n to: Lib_RLPReader.readAddress(decoded[3]),\n value: Lib_RLPReader.readUint256(decoded[4]),\n data: Lib_RLPReader.readBytes(decoded[5]),\n v: v,\n r: Lib_RLPReader.readBytes32(decoded[7]),\n s: Lib_RLPReader.readBytes32(decoded[8]),\n chainId: _chainId,\n recoveryParam: recoveryParam,\n isCreate: isCreate\n });\n }\n\n /**\n * Encodes an EIP155 transaction into RLP.\n * @param _transaction EIP155 transaction to encode.\n * @param _includeSignature Whether or not to encode the signature.\n * @return RLP-encoded transaction.\n */\n function encode(\n EIP155Tx memory _transaction,\n bool _includeSignature\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n bytes[] memory raw = new bytes[](9);\n\n raw[0] = Lib_RLPWriter.writeUint(_transaction.nonce);\n raw[1] = Lib_RLPWriter.writeUint(_transaction.gasPrice);\n raw[2] = Lib_RLPWriter.writeUint(_transaction.gasLimit);\n\n // We write the encoding of empty bytes when the transaction is a creation, *not* the zero\n // address as one might assume.\n if (_transaction.isCreate) {\n raw[3] = Lib_RLPWriter.writeBytes('');\n } else {\n raw[3] = Lib_RLPWriter.writeAddress(_transaction.to);\n }\n\n raw[4] = Lib_RLPWriter.writeUint(_transaction.value);\n raw[5] = Lib_RLPWriter.writeBytes(_transaction.data);\n\n if (_includeSignature) {\n raw[6] = Lib_RLPWriter.writeUint(_transaction.v);\n raw[7] = Lib_RLPWriter.writeBytes32(_transaction.r);\n raw[8] = Lib_RLPWriter.writeBytes32(_transaction.s);\n } else {\n // Chain ID *is* included in the unsigned transaction.\n raw[6] = Lib_RLPWriter.writeUint(_transaction.chainId); \n raw[7] = Lib_RLPWriter.writeBytes('');\n raw[8] = Lib_RLPWriter.writeBytes('');\n }\n\n return Lib_RLPWriter.writeList(raw);\n }\n\n /**\n * Computes the hash of an EIP155 transaction. Assumes that you don't want to include the\n * signature in this hash because that's a very uncommon usecase. If you really want to include\n * the signature, just encode with the signature and take the hash yourself.\n */\n function hash(\n EIP155Tx memory _transaction\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n return keccak256(\n _transaction.encode(false)\n );\n }\n\n /**\n * Computes the sender of an EIP155 transaction.\n * @param _transaction EIP155 transaction to get a sender for.\n * @return Address corresponding to the private key that signed this transaction.\n */\n function sender(\n EIP155Tx memory _transaction\n )\n internal\n pure\n returns (\n address\n )\n {\n return ecrecover(\n _transaction.hash(),\n _transaction.recoveryParam + 27,\n _transaction.r,\n _transaction.s\n );\n }\n}\n" + }, + "contracts/optimistic-ethereum/OVM/predeploys/OVM_ETH.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Library Imports */\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/* Interface Imports */\nimport { iOVM_L1TokenGateway } from \"../../iOVM/bridge/tokens/iOVM_L1TokenGateway.sol\";\n\n/* Contract Imports */\nimport { OVM_L2DepositedERC20 } from \"../bridge/tokens/OVM_L2DepositedERC20.sol\";\n\n/**\n * @title OVM_ETH\n * @dev The ETH predeploy provides an ERC20 interface for ETH deposited to Layer 2. Note that\n * unlike on Layer 1, Layer 2 accounts do not have a balance field.\n *\n * Compiler used: optimistic-solc\n * Runtime target: OVM\n */\ncontract OVM_ETH is OVM_L2DepositedERC20 {\n constructor(\n address _l2CrossDomainMessenger,\n address _l1ETHGateway\n )\n OVM_L2DepositedERC20(\n _l2CrossDomainMessenger,\n \"Ether\",\n \"ETH\"\n )\n {\n init(iOVM_L1TokenGateway(_l1ETHGateway));\n }\n}\n" + }, + "@openzeppelin/contracts/math/SafeMath.sol": { + "content": "// SPDX-License-Identifier: MIT\n\npragma solidity >=0.6.0 <0.8.0;\n\n/**\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\n * checks.\n *\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\n * in bugs, because programmers usually assume that an overflow raises an\n * error, which is the standard behavior in high level programming languages.\n * `SafeMath` restores this intuition by reverting the transaction when an\n * operation overflows.\n *\n * Using this library instead of the unchecked operations eliminates an entire\n * class of bugs, so it's recommended to use it always.\n */\nlibrary SafeMath {\n /**\n * @dev Returns the addition of two unsigned integers, with an overflow flag.\n *\n * _Available since v3.4._\n */\n function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n uint256 c = a + b;\n if (c < a) return (false, 0);\n return (true, c);\n }\n\n /**\n * @dev Returns the substraction of two unsigned integers, with an overflow flag.\n *\n * _Available since v3.4._\n */\n function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n if (b > a) return (false, 0);\n return (true, a - b);\n }\n\n /**\n * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\n *\n * _Available since v3.4._\n */\n function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\n // benefit is lost if 'b' is also tested.\n // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\n if (a == 0) return (true, 0);\n uint256 c = a * b;\n if (c / a != b) return (false, 0);\n return (true, c);\n }\n\n /**\n * @dev Returns the division of two unsigned integers, with a division by zero flag.\n *\n * _Available since v3.4._\n */\n function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n if (b == 0) return (false, 0);\n return (true, a / b);\n }\n\n /**\n * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\n *\n * _Available since v3.4._\n */\n function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n if (b == 0) return (false, 0);\n return (true, a % b);\n }\n\n /**\n * @dev Returns the addition of two unsigned integers, reverting on\n * overflow.\n *\n * Counterpart to Solidity's `+` operator.\n *\n * Requirements:\n *\n * - Addition cannot overflow.\n */\n function add(uint256 a, uint256 b) internal pure returns (uint256) {\n uint256 c = a + b;\n require(c >= a, \"SafeMath: addition overflow\");\n return c;\n }\n\n /**\n * @dev Returns the subtraction of two unsigned integers, reverting on\n * overflow (when the result is negative).\n *\n * Counterpart to Solidity's `-` operator.\n *\n * Requirements:\n *\n * - Subtraction cannot overflow.\n */\n function sub(uint256 a, uint256 b) internal pure returns (uint256) {\n require(b <= a, \"SafeMath: subtraction overflow\");\n return a - b;\n }\n\n /**\n * @dev Returns the multiplication of two unsigned integers, reverting on\n * overflow.\n *\n * Counterpart to Solidity's `*` operator.\n *\n * Requirements:\n *\n * - Multiplication cannot overflow.\n */\n function mul(uint256 a, uint256 b) internal pure returns (uint256) {\n if (a == 0) return 0;\n uint256 c = a * b;\n require(c / a == b, \"SafeMath: multiplication overflow\");\n return c;\n }\n\n /**\n * @dev Returns the integer division of two unsigned integers, reverting on\n * division by zero. The result is rounded towards zero.\n *\n * Counterpart to Solidity's `/` operator. Note: this function uses a\n * `revert` opcode (which leaves remaining gas untouched) while Solidity\n * uses an invalid opcode to revert (consuming all remaining gas).\n *\n * Requirements:\n *\n * - The divisor cannot be zero.\n */\n function div(uint256 a, uint256 b) internal pure returns (uint256) {\n require(b > 0, \"SafeMath: division by zero\");\n return a / b;\n }\n\n /**\n * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\n * reverting when dividing by zero.\n *\n * Counterpart to Solidity's `%` operator. This function uses a `revert`\n * opcode (which leaves remaining gas untouched) while Solidity uses an\n * invalid opcode to revert (consuming all remaining gas).\n *\n * Requirements:\n *\n * - The divisor cannot be zero.\n */\n function mod(uint256 a, uint256 b) internal pure returns (uint256) {\n require(b > 0, \"SafeMath: modulo by zero\");\n return a % b;\n }\n\n /**\n * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\n * overflow (when the result is negative).\n *\n * CAUTION: This function is deprecated because it requires allocating memory for the error\n * message unnecessarily. For custom revert reasons use {trySub}.\n *\n * Counterpart to Solidity's `-` operator.\n *\n * Requirements:\n *\n * - Subtraction cannot overflow.\n */\n function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\n require(b <= a, errorMessage);\n return a - b;\n }\n\n /**\n * @dev Returns the integer division of two unsigned integers, reverting with custom message on\n * division by zero. The result is rounded towards zero.\n *\n * CAUTION: This function is deprecated because it requires allocating memory for the error\n * message unnecessarily. For custom revert reasons use {tryDiv}.\n *\n * Counterpart to Solidity's `/` operator. Note: this function uses a\n * `revert` opcode (which leaves remaining gas untouched) while Solidity\n * uses an invalid opcode to revert (consuming all remaining gas).\n *\n * Requirements:\n *\n * - The divisor cannot be zero.\n */\n function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\n require(b > 0, errorMessage);\n return a / b;\n }\n\n /**\n * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\n * reverting with custom message when dividing by zero.\n *\n * CAUTION: This function is deprecated because it requires allocating memory for the error\n * message unnecessarily. For custom revert reasons use {tryMod}.\n *\n * Counterpart to Solidity's `%` operator. This function uses a `revert`\n * opcode (which leaves remaining gas untouched) while Solidity uses an\n * invalid opcode to revert (consuming all remaining gas).\n *\n * Requirements:\n *\n * - The divisor cannot be zero.\n */\n function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\n require(b > 0, errorMessage);\n return a % b;\n }\n}\n" + }, + "contracts/optimistic-ethereum/libraries/utils/Lib_ErrorUtils.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/**\n * @title Lib_ErrorUtils\n */\nlibrary Lib_ErrorUtils {\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Encodes an error string into raw solidity-style revert data.\n * (i.e. ascii bytes, prefixed with bytes4(keccak(\"Error(string))\"))\n * Ref: https://docs.soliditylang.org/en/v0.8.2/control-structures.html?highlight=Error(string)#panic-via-assert-and-error-via-require\n * @param _reason Reason for the reversion.\n * @return Standard solidity revert data for the given reason.\n */\n function encodeRevertString(\n string memory _reason\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n return abi.encodeWithSignature(\n \"Error(string)\",\n _reason\n );\n }\n}\n" + }, + "contracts/optimistic-ethereum/libraries/resolver/Lib_AddressResolver.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Library Imports */\nimport { Lib_AddressManager } from \"./Lib_AddressManager.sol\";\n\n/**\n * @title Lib_AddressResolver\n */\nabstract contract Lib_AddressResolver {\n\n /*************\n * Variables *\n *************/\n\n Lib_AddressManager public libAddressManager;\n\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Lib_AddressManager.\n */\n constructor(\n address _libAddressManager\n ) {\n libAddressManager = Lib_AddressManager(_libAddressManager);\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Resolves the address associated with a given name.\n * @param _name Name to resolve an address for.\n * @return Address associated with the given name.\n */\n function resolve(\n string memory _name\n )\n public\n view\n returns (\n address\n )\n {\n return libAddressManager.getAddress(_name);\n }\n}\n" + }, + "contracts/optimistic-ethereum/iOVM/bridge/tokens/iOVM_L1TokenGateway.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0;\npragma experimental ABIEncoderV2;\n\n/**\n * @title iOVM_L1TokenGateway\n */\ninterface iOVM_L1TokenGateway {\n\n /**********\n * Events *\n **********/\n\n event DepositInitiated(\n address indexed _from,\n address _to,\n uint256 _amount\n );\n\n event WithdrawalFinalized(\n address indexed _to,\n uint256 _amount\n );\n\n\n /********************\n * Public Functions *\n ********************/\n\n function deposit(\n uint _amount\n )\n external;\n\n function depositTo(\n address _to,\n uint _amount\n )\n external;\n\n\n /*************************\n * Cross-chain Functions *\n *************************/\n\n function finalizeWithdrawal(\n address _to,\n uint _amount\n )\n external;\n}\n" + }, + "contracts/optimistic-ethereum/OVM/bridge/tokens/OVM_L2DepositedERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Interface Imports */\nimport { iOVM_L1TokenGateway } from \"../../../iOVM/bridge/tokens/iOVM_L1TokenGateway.sol\";\n\n/* Contract Imports */\nimport { UniswapV2ERC20 } from \"../../../libraries/standards/UniswapV2ERC20.sol\";\n\n/* Library Imports */\nimport { Abs_L2DepositedToken } from \"./Abs_L2DepositedToken.sol\";\n\n/**\n * @title OVM_L2DepositedERC20\n * @dev The L2 Deposited ERC20 is an ERC20 implementation which represents L1 assets deposited into L2.\n * This contract mints new tokens when it hears about deposits into the L1 ERC20 gateway.\n * This contract also burns the tokens intended for withdrawal, informing the L1 gateway to release L1 funds.\n *\n * NOTE: This contract implements the Abs_L2DepositedToken contract using Uniswap's ERC20 as the implementation.\n * Alternative implementations can be used in this similar manner.\n *\n * Compiler used: optimistic-solc\n * Runtime target: OVM\n */\ncontract OVM_L2DepositedERC20 is Abs_L2DepositedToken, UniswapV2ERC20 {\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _l2CrossDomainMessenger Cross-domain messenger used by this contract.\n * @param _name ERC20 name\n * @param _symbol ERC20 symbol\n */\n constructor(\n address _l2CrossDomainMessenger,\n string memory _name,\n string memory _symbol\n )\n Abs_L2DepositedToken(_l2CrossDomainMessenger)\n UniswapV2ERC20(_name, _symbol)\n {}\n\n // When a withdrawal is initiated, we burn the withdrawer's funds to prevent subsequent L2 usage.\n function _handleInitiateWithdrawal(\n address, // _to,\n uint _amount\n )\n internal\n override\n {\n _burn(msg.sender, _amount);\n }\n\n // When a deposit is finalized, we credit the account on L2 with the same amount of tokens.\n function _handleFinalizeDeposit(\n address _to,\n uint _amount\n )\n internal\n override\n {\n _mint(_to, _amount);\n }\n}\n" + }, + "contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* External Imports */\nimport { Ownable } from \"@openzeppelin/contracts/access/Ownable.sol\";\n\n/**\n * @title Lib_AddressManager\n */\ncontract Lib_AddressManager is Ownable {\n\n /**********\n * Events *\n **********/\n\n event AddressSet(\n string _name,\n address _newAddress\n );\n\n\n /*************\n * Variables *\n *************/\n\n mapping (bytes32 => address) private addresses;\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Changes the address associated with a particular name.\n * @param _name String name to associate an address with.\n * @param _address Address to associate with the name.\n */\n function setAddress(\n string memory _name,\n address _address\n )\n public\n onlyOwner\n {\n addresses[_getNameHash(_name)] = _address;\n\n emit AddressSet(\n _name,\n _address\n );\n }\n\n /**\n * Retrieves the address associated with a given name.\n * @param _name Name to retrieve an address for.\n * @return Address associated with the given name.\n */\n function getAddress(\n string memory _name\n )\n public\n view\n returns (\n address\n )\n {\n return addresses[_getNameHash(_name)];\n }\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Computes the hash of a name.\n * @param _name Name to compute a hash for.\n * @return Hash of the given name.\n */\n function _getNameHash(\n string memory _name\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n return keccak256(abi.encodePacked(_name));\n }\n}\n" + }, + "@openzeppelin/contracts/access/Ownable.sol": { + "content": "// SPDX-License-Identifier: MIT\n\npragma solidity >=0.6.0 <0.8.0;\n\nimport \"../utils/Context.sol\";\n/**\n * @dev Contract module which provides a basic access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * By default, the owner account will be the one that deploys the contract. This\n * can later be changed with {transferOwnership}.\n *\n * This module is used through inheritance. It will make available the modifier\n * `onlyOwner`, which can be applied to your functions to restrict their use to\n * the owner.\n */\nabstract contract Ownable is Context {\n address private _owner;\n\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n /**\n * @dev Initializes the contract setting the deployer as the initial owner.\n */\n constructor () internal {\n address msgSender = _msgSender();\n _owner = msgSender;\n emit OwnershipTransferred(address(0), msgSender);\n }\n\n /**\n * @dev Returns the address of the current owner.\n */\n function owner() public view virtual returns (address) {\n return _owner;\n }\n\n /**\n * @dev Throws if called by any account other than the owner.\n */\n modifier onlyOwner() {\n require(owner() == _msgSender(), \"Ownable: caller is not the owner\");\n _;\n }\n\n /**\n * @dev Leaves the contract without owner. It will not be possible to call\n * `onlyOwner` functions anymore. Can only be called by the current owner.\n *\n * NOTE: Renouncing ownership will leave the contract without an owner,\n * thereby removing any functionality that is only available to the owner.\n */\n function renounceOwnership() public virtual onlyOwner {\n emit OwnershipTransferred(_owner, address(0));\n _owner = address(0);\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Can only be called by the current owner.\n */\n function transferOwnership(address newOwner) public virtual onlyOwner {\n require(newOwner != address(0), \"Ownable: new owner is the zero address\");\n emit OwnershipTransferred(_owner, newOwner);\n _owner = newOwner;\n }\n}\n" + }, + "@openzeppelin/contracts/utils/Context.sol": { + "content": "// SPDX-License-Identifier: MIT\n\npragma solidity >=0.6.0 <0.8.0;\n\n/*\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with GSN meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract Context {\n function _msgSender() internal view virtual returns (address payable) {\n return msg.sender;\n }\n\n function _msgData() internal view virtual returns (bytes memory) {\n this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\n return msg.data;\n }\n}\n" + }, + "contracts/optimistic-ethereum/libraries/standards/UniswapV2ERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.5.16 <0.8.0;\n\nimport './IUniswapV2ERC20.sol';\nimport './UniSafeMath.sol';\n\ncontract UniswapV2ERC20 is IUniswapV2ERC20 {\n using UniSafeMath for uint;\n\n string public override name;\n string public override symbol;\n uint8 public constant override decimals = 18;\n uint public override totalSupply;\n mapping(address => uint) public override balanceOf;\n mapping(address => mapping(address => uint)) public override allowance;\n\n bytes32 public override DOMAIN_SEPARATOR;\n // keccak256(\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\");\n bytes32 public constant override PERMIT_TYPEHASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9;\n mapping(address => uint) public override nonces;\n\n constructor(\n string memory _name,\n string memory _symbol\n ) {\n name = _name;\n symbol = _symbol;\n\n uint chainId;\n assembly {\n chainId := chainid()\n }\n DOMAIN_SEPARATOR = keccak256(\n abi.encode(\n keccak256('EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)'),\n keccak256(bytes(name)),\n keccak256(bytes('1')),\n chainId,\n address(this)\n )\n );\n }\n\n function _mint(address to, uint value) internal {\n totalSupply = totalSupply.add(value);\n balanceOf[to] = balanceOf[to].add(value);\n emit Transfer(address(0), to, value);\n }\n\n function _burn(address from, uint value) internal {\n balanceOf[from] = balanceOf[from].sub(value);\n totalSupply = totalSupply.sub(value);\n emit Transfer(from, address(0), value);\n }\n\n function _approve(address owner, address spender, uint value) private {\n allowance[owner][spender] = value;\n emit Approval(owner, spender, value);\n }\n\n function _transfer(address from, address to, uint value) private {\n balanceOf[from] = balanceOf[from].sub(value);\n balanceOf[to] = balanceOf[to].add(value);\n emit Transfer(from, to, value);\n }\n\n function approve(address spender, uint value) external override returns (bool) {\n _approve(msg.sender, spender, value);\n return true;\n }\n\n function transfer(address to, uint value) external override returns (bool) {\n _transfer(msg.sender, to, value);\n return true;\n }\n\n function transferFrom(address from, address to, uint value) external override returns (bool) {\n if (allowance[from][msg.sender] != uint(-1)) {\n allowance[from][msg.sender] = allowance[from][msg.sender].sub(value);\n }\n _transfer(from, to, value);\n return true;\n }\n\n function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external override {\n require(deadline >= block.timestamp, 'UniswapV2: EXPIRED');\n bytes32 digest = keccak256(\n abi.encodePacked(\n '\\x19\\x01',\n DOMAIN_SEPARATOR,\n keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, value, nonces[owner]++, deadline))\n )\n );\n address recoveredAddress = ecrecover(digest, v, r, s);\n require(recoveredAddress != address(0) && recoveredAddress == owner, 'UniswapV2: INVALID_SIGNATURE');\n _approve(owner, spender, value);\n }\n}\n" + }, + "contracts/optimistic-ethereum/OVM/bridge/tokens/Abs_L2DepositedToken.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Interface Imports */\nimport { iOVM_L2DepositedToken } from \"../../../iOVM/bridge/tokens/iOVM_L2DepositedToken.sol\";\nimport { iOVM_L1TokenGateway } from \"../../../iOVM/bridge/tokens/iOVM_L1TokenGateway.sol\";\n\n/* Library Imports */\nimport { OVM_CrossDomainEnabled } from \"../../../libraries/bridge/OVM_CrossDomainEnabled.sol\";\n\n/**\n * @title Abs_L2DepositedToken\n * @dev An L2 Deposited Token is an L2 representation of funds which were deposited from L1.\n * Usually contract mints new tokens when it hears about deposits into the L1 ERC20 gateway.\n * This contract also burns the tokens intended for withdrawal, informing the L1 gateway to release L1 funds.\n *\n * NOTE: This abstract contract gives all the core functionality of a deposited token implementation except for the\n * token's internal accounting itself. This gives developers an easy way to implement children with their own token code.\n *\n * Compiler used: optimistic-solc\n * Runtime target: OVM\n */\nabstract contract Abs_L2DepositedToken is iOVM_L2DepositedToken, OVM_CrossDomainEnabled {\n\n /*******************\n * Contract Events *\n *******************/\n\n event Initialized(iOVM_L1TokenGateway _l1TokenGateway);\n\n /********************************\n * External Contract References *\n ********************************/\n\n iOVM_L1TokenGateway public l1TokenGateway;\n\n /********************************\n * Constructor & Initialization *\n ********************************/\n\n /**\n * @param _l2CrossDomainMessenger L1 Messenger address being used for cross-chain communications.\n */\n constructor(\n address _l2CrossDomainMessenger\n )\n OVM_CrossDomainEnabled(_l2CrossDomainMessenger)\n {}\n\n /**\n * @dev Initialize this contract with the L1 token gateway address.\n * The flow: 1) this contract gets deployed on L2, 2) the L1\n * gateway is deployed with addr from (1), 3) L1 gateway address passed here.\n *\n * @param _l1TokenGateway Address of the corresponding L1 gateway deployed to the main chain\n */\n function init(\n iOVM_L1TokenGateway _l1TokenGateway\n )\n public\n {\n require(address(l1TokenGateway) == address(0), \"Contract has already been initialized\");\n\n l1TokenGateway = _l1TokenGateway;\n\n emit Initialized(l1TokenGateway);\n }\n\n /**********************\n * Function Modifiers *\n **********************/\n\n modifier onlyInitialized() {\n require(address(l1TokenGateway) != address(0), \"Contract has not yet been initialized\");\n _;\n }\n\n /********************************\n * Overridable Accounting logic *\n ********************************/\n\n // Default gas value which can be overridden if more complex logic runs on L1.\n uint32 internal constant DEFAULT_FINALIZE_WITHDRAWAL_L1_GAS = 100000;\n\n /**\n * @dev Core logic to be performed when a withdrawal from L2 is initialized.\n * In most cases, this will simply burn the withdrawn L2 funds.\n *\n * param _to Address being withdrawn to\n * param _amount Amount being withdrawn\n */\n function _handleInitiateWithdrawal(\n address, // _to,\n uint // _amount\n )\n internal\n virtual\n {\n revert(\"Accounting must be implemented by child contract.\");\n }\n\n /**\n * @dev Core logic to be performed when a deposit from L2 is finalized on L2.\n * In most cases, this will simply _mint() to credit L2 funds to the recipient.\n *\n * param _to Address being deposited to on L2\n * param _amount Amount which was deposited on L1\n */\n function _handleFinalizeDeposit(\n address, // _to\n uint // _amount\n )\n internal\n virtual\n {\n revert(\"Accounting must be implemented by child contract.\");\n }\n\n /**\n * @dev Overridable getter for the *L1* gas limit of settling the withdrawal, in the case it may be\n * dynamic, and the above public constant does not suffice.\n */\n function getFinalizeWithdrawalL1Gas()\n public\n view\n virtual\n returns(\n uint32\n )\n {\n return DEFAULT_FINALIZE_WITHDRAWAL_L1_GAS;\n }\n\n\n /***************\n * Withdrawing *\n ***************/\n\n /**\n * @dev initiate a withdraw of some tokens to the caller's account on L1\n * @param _amount Amount of the token to withdraw\n */\n function withdraw(\n uint _amount\n )\n external\n override\n virtual\n onlyInitialized()\n {\n _initiateWithdrawal(msg.sender, _amount);\n }\n\n /**\n * @dev initiate a withdraw of some token to a recipient's account on L1\n * @param _to L1 adress to credit the withdrawal to\n * @param _amount Amount of the token to withdraw\n */\n function withdrawTo(\n address _to,\n uint _amount\n )\n external\n override\n virtual\n onlyInitialized()\n {\n _initiateWithdrawal(_to, _amount);\n }\n\n /**\n * @dev Performs the logic for deposits by storing the token and informing the L2 token Gateway of the deposit.\n *\n * @param _to Account to give the withdrawal to on L1\n * @param _amount Amount of the token to withdraw\n */\n function _initiateWithdrawal(\n address _to,\n uint _amount\n )\n internal\n {\n // Call our withdrawal accounting handler implemented by child contracts (usually a _burn)\n _handleInitiateWithdrawal(_to, _amount);\n\n // Construct calldata for l1TokenGateway.finalizeWithdrawal(_to, _amount)\n bytes memory data = abi.encodeWithSelector(\n iOVM_L1TokenGateway.finalizeWithdrawal.selector,\n _to,\n _amount\n );\n\n // Send message up to L1 gateway\n sendCrossDomainMessage(\n address(l1TokenGateway),\n data,\n getFinalizeWithdrawalL1Gas()\n );\n\n emit WithdrawalInitiated(msg.sender, _to, _amount);\n }\n\n /************************************\n * Cross-chain Function: Depositing *\n ************************************/\n\n /**\n * @dev Complete a deposit from L1 to L2, and credits funds to the recipient's balance of this\n * L2 token.\n * This call will fail if it did not originate from a corresponding deposit in OVM_l1TokenGateway.\n *\n * @param _to Address to receive the withdrawal at\n * @param _amount Amount of the token to withdraw\n */\n function finalizeDeposit(\n address _to,\n uint _amount\n )\n external\n override\n virtual\n onlyInitialized()\n onlyFromCrossDomainAccount(address(l1TokenGateway))\n {\n _handleFinalizeDeposit(_to, _amount);\n emit DepositFinalized(_to, _amount);\n }\n}\n" + }, + "contracts/optimistic-ethereum/libraries/standards/IUniswapV2ERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.5.16 <0.8.0;\n\ninterface IUniswapV2ERC20 {\n event Approval(address indexed owner, address indexed spender, uint value);\n event Transfer(address indexed from, address indexed to, uint value);\n\n function name() external view returns (string memory);\n function symbol() external view returns (string memory);\n function decimals() external view returns (uint8);\n function totalSupply() external view returns (uint);\n function balanceOf(address owner) external view returns (uint);\n function allowance(address owner, address spender) external view returns (uint);\n\n function approve(address spender, uint value) external returns (bool);\n function transfer(address to, uint value) external returns (bool);\n function transferFrom(address from, address to, uint value) external returns (bool);\n\n function DOMAIN_SEPARATOR() external view returns (bytes32);\n function PERMIT_TYPEHASH() external pure returns (bytes32);\n function nonces(address owner) external view returns (uint);\n\n function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;\n}\n" + }, + "contracts/optimistic-ethereum/libraries/standards/UniSafeMath.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.5.16 <0.8.0;\n\n// a library for performing overflow-safe math, courtesy of DappHub (https://github.com/dapphub/ds-math)\n\nlibrary UniSafeMath {\n function add(uint x, uint y) internal pure returns (uint z) {\n require((z = x + y) >= x, 'ds-math-add-overflow');\n }\n\n function sub(uint x, uint y) internal pure returns (uint z) {\n require((z = x - y) <= x, 'ds-math-sub-underflow');\n }\n\n function mul(uint x, uint y) internal pure returns (uint z) {\n require(y == 0 || (z = x * y) / y == x, 'ds-math-mul-overflow');\n }\n}\n" + }, + "contracts/optimistic-ethereum/iOVM/bridge/tokens/iOVM_L2DepositedToken.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0;\npragma experimental ABIEncoderV2;\n\n/**\n * @title iOVM_L2DepositedToken\n */\ninterface iOVM_L2DepositedToken {\n\n /**********\n * Events *\n **********/\n\n event WithdrawalInitiated(\n address indexed _from,\n address _to,\n uint256 _amount\n );\n\n event DepositFinalized(\n address indexed _to,\n uint256 _amount\n );\n\n\n /********************\n * Public Functions *\n ********************/\n\n function withdraw(\n uint _amount\n )\n external;\n\n function withdrawTo(\n address _to,\n uint _amount\n )\n external;\n\n\n /*************************\n * Cross-chain Functions *\n *************************/\n\n function finalizeDeposit(\n address _to,\n uint _amount\n )\n external;\n}\n" + }, + "contracts/optimistic-ethereum/libraries/bridge/OVM_CrossDomainEnabled.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Interface Imports */\nimport { iAbs_BaseCrossDomainMessenger } from \"../../iOVM/bridge/messaging/iAbs_BaseCrossDomainMessenger.sol\";\n\n/**\n * @title OVM_CrossDomainEnabled\n * @dev Helper contract for contracts performing cross-domain communications\n *\n * Compiler used: defined by inheriting contract\n * Runtime target: defined by inheriting contract\n */\ncontract OVM_CrossDomainEnabled {\n\n /*************\n * Variables *\n *************/\n\n // Messenger contract used to send and recieve messages from the other domain.\n address public messenger;\n\n\n /***************\n * Constructor *\n ***************/ \n\n /**\n * @param _messenger Address of the CrossDomainMessenger on the current layer.\n */\n constructor(\n address _messenger\n ) {\n messenger = _messenger;\n }\n\n\n /**********************\n * Function Modifiers *\n **********************/\n\n /**\n * Enforces that the modified function is only callable by a specific cross-domain account.\n * @param _sourceDomainAccount The only account on the originating domain which is\n * authenticated to call this function.\n */\n modifier onlyFromCrossDomainAccount(\n address _sourceDomainAccount\n ) {\n require(\n msg.sender == address(getCrossDomainMessenger()),\n \"OVM_XCHAIN: messenger contract unauthenticated\"\n );\n\n require(\n getCrossDomainMessenger().xDomainMessageSender() == _sourceDomainAccount,\n \"OVM_XCHAIN: wrong sender of cross-domain message\"\n );\n\n _;\n }\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Gets the messenger, usually from storage. This function is exposed in case a child contract\n * needs to override.\n * @return The address of the cross-domain messenger contract which should be used. \n */\n function getCrossDomainMessenger()\n internal\n virtual\n returns (\n iAbs_BaseCrossDomainMessenger\n )\n {\n return iAbs_BaseCrossDomainMessenger(messenger);\n }\n\n /**\n * Sends a message to an account on another domain\n * @param _crossDomainTarget The intended recipient on the destination domain\n * @param _data The data to send to the target (usually calldata to a function with\n * `onlyFromCrossDomainAccount()`)\n * @param _gasLimit The gasLimit for the receipt of the message on the target domain.\n */\n function sendCrossDomainMessage(\n address _crossDomainTarget,\n bytes memory _data,\n uint32 _gasLimit\n )\n internal\n {\n getCrossDomainMessenger().sendMessage(_crossDomainTarget, _data, _gasLimit);\n }\n}\n" + }, + "contracts/optimistic-ethereum/iOVM/bridge/messaging/iAbs_BaseCrossDomainMessenger.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/**\n * @title iAbs_BaseCrossDomainMessenger\n */\ninterface iAbs_BaseCrossDomainMessenger {\n\n /**********\n * Events *\n **********/\n\n event SentMessage(bytes message);\n event RelayedMessage(bytes32 msgHash);\n event FailedRelayedMessage(bytes32 msgHash);\n\n\n /*************\n * Variables *\n *************/\n\n function xDomainMessageSender() external view returns (address);\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Sends a cross domain message to the target messenger.\n * @param _target Target contract address.\n * @param _message Message to send to the target.\n * @param _gasLimit Gas limit for the provided message.\n */\n function sendMessage(\n address _target,\n bytes calldata _message,\n uint32 _gasLimit\n ) external;\n}\n" + }, + "contracts/optimistic-ethereum/OVM/chain/OVM_StateCommitmentChain.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\nimport { Lib_MerkleTree } from \"../../libraries/utils/Lib_MerkleTree.sol\";\n\n/* Interface Imports */\nimport { iOVM_FraudVerifier } from \"../../iOVM/verification/iOVM_FraudVerifier.sol\";\nimport { iOVM_StateCommitmentChain } from \"../../iOVM/chain/iOVM_StateCommitmentChain.sol\";\nimport { iOVM_CanonicalTransactionChain } from \"../../iOVM/chain/iOVM_CanonicalTransactionChain.sol\";\nimport { iOVM_BondManager } from \"../../iOVM/verification/iOVM_BondManager.sol\";\nimport { iOVM_ChainStorageContainer } from \"../../iOVM/chain/iOVM_ChainStorageContainer.sol\";\n\n/* External Imports */\nimport '@openzeppelin/contracts/math/SafeMath.sol';\n\n/**\n * @title OVM_StateCommitmentChain\n * @dev The State Commitment Chain (SCC) contract contains a list of proposed state roots which\n * Proposers assert to be a result of each transaction in the Canonical Transaction Chain (CTC).\n * Elements here have a 1:1 correspondence with transactions in the CTC, and should be the unique\n * state root calculated off-chain by applying the canonical transactions one by one.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract OVM_StateCommitmentChain is iOVM_StateCommitmentChain, Lib_AddressResolver {\n\n /*************\n * Constants *\n *************/\n\n uint256 public FRAUD_PROOF_WINDOW;\n uint256 public SEQUENCER_PUBLISH_WINDOW;\n\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n constructor(\n address _libAddressManager,\n uint256 _fraudProofWindow,\n uint256 _sequencerPublishWindow\n )\n Lib_AddressResolver(_libAddressManager)\n {\n FRAUD_PROOF_WINDOW = _fraudProofWindow;\n SEQUENCER_PUBLISH_WINDOW = _sequencerPublishWindow;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Accesses the batch storage container.\n * @return Reference to the batch storage container.\n */\n function batches()\n public\n view\n returns (\n iOVM_ChainStorageContainer\n )\n {\n return iOVM_ChainStorageContainer(\n resolve(\"OVM_ChainStorageContainer:SCC:batches\")\n );\n }\n\n /**\n * @inheritdoc iOVM_StateCommitmentChain\n */\n function getTotalElements()\n override\n public\n view\n returns (\n uint256 _totalElements\n )\n {\n (uint40 totalElements, ) = _getBatchExtraData();\n return uint256(totalElements);\n }\n\n /**\n * @inheritdoc iOVM_StateCommitmentChain\n */\n function getTotalBatches()\n override\n public\n view\n returns (\n uint256 _totalBatches\n )\n {\n return batches().length();\n }\n\n /**\n * @inheritdoc iOVM_StateCommitmentChain\n */\n function getLastSequencerTimestamp()\n override\n public\n view\n returns (\n uint256 _lastSequencerTimestamp\n )\n {\n (, uint40 lastSequencerTimestamp) = _getBatchExtraData();\n return uint256(lastSequencerTimestamp);\n }\n\n /**\n * @inheritdoc iOVM_StateCommitmentChain\n */\n function appendStateBatch(\n bytes32[] memory _batch,\n uint256 _shouldStartAtElement\n )\n override\n public\n {\n // Fail fast in to make sure our batch roots aren't accidentally made fraudulent by the\n // publication of batches by some other user.\n require(\n _shouldStartAtElement == getTotalElements(),\n \"Actual batch start index does not match expected start index.\"\n );\n\n // Proposers must have previously staked at the BondManager\n require(\n iOVM_BondManager(resolve(\"OVM_BondManager\")).isCollateralized(msg.sender),\n \"Proposer does not have enough collateral posted\"\n );\n\n require(\n _batch.length > 0,\n \"Cannot submit an empty state batch.\"\n );\n\n require(\n getTotalElements() + _batch.length <= iOVM_CanonicalTransactionChain(resolve(\"OVM_CanonicalTransactionChain\")).getTotalElements(),\n \"Number of state roots cannot exceed the number of canonical transactions.\"\n );\n\n // Pass the block's timestamp and the publisher of the data\n // to be used in the fraud proofs\n _appendBatch(\n _batch,\n abi.encode(block.timestamp, msg.sender)\n );\n }\n\n /**\n * @inheritdoc iOVM_StateCommitmentChain\n */\n function deleteStateBatch(\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\n )\n override\n public\n {\n require(\n msg.sender == resolve(\"OVM_FraudVerifier\"),\n \"State batches can only be deleted by the OVM_FraudVerifier.\"\n );\n\n require(\n _isValidBatchHeader(_batchHeader),\n \"Invalid batch header.\"\n );\n\n require(\n insideFraudProofWindow(_batchHeader),\n \"State batches can only be deleted within the fraud proof window.\"\n );\n\n _deleteBatch(_batchHeader);\n }\n\n /**\n * @inheritdoc iOVM_StateCommitmentChain\n */\n function verifyStateCommitment(\n bytes32 _element,\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _proof\n )\n override\n public\n view\n returns (\n bool\n )\n {\n require(\n _isValidBatchHeader(_batchHeader),\n \"Invalid batch header.\"\n );\n\n require(\n Lib_MerkleTree.verify(\n _batchHeader.batchRoot,\n _element,\n _proof.index,\n _proof.siblings,\n _batchHeader.batchSize\n ),\n \"Invalid inclusion proof.\"\n );\n\n return true;\n }\n\n /**\n * @inheritdoc iOVM_StateCommitmentChain\n */\n function insideFraudProofWindow(\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\n )\n override\n public\n view\n returns (\n bool _inside\n )\n {\n (uint256 timestamp,) = abi.decode(\n _batchHeader.extraData,\n (uint256, address)\n );\n\n require(\n timestamp != 0,\n \"Batch header timestamp cannot be zero\"\n );\n return SafeMath.add(timestamp, FRAUD_PROOF_WINDOW) > block.timestamp;\n }\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Parses the batch context from the extra data.\n * @return Total number of elements submitted.\n * @return Timestamp of the last batch submitted by the sequencer.\n */\n function _getBatchExtraData()\n internal\n view\n returns (\n uint40,\n uint40\n )\n {\n bytes27 extraData = batches().getGlobalMetadata();\n\n uint40 totalElements;\n uint40 lastSequencerTimestamp;\n assembly {\n extraData := shr(40, extraData)\n totalElements := and(extraData, 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF)\n lastSequencerTimestamp := shr(40, and(extraData, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000))\n }\n\n return (\n totalElements,\n lastSequencerTimestamp\n );\n }\n\n /**\n * Encodes the batch context for the extra data.\n * @param _totalElements Total number of elements submitted.\n * @param _lastSequencerTimestamp Timestamp of the last batch submitted by the sequencer.\n * @return Encoded batch context.\n */\n function _makeBatchExtraData(\n uint40 _totalElements,\n uint40 _lastSequencerTimestamp\n )\n internal\n pure\n returns (\n bytes27\n )\n {\n bytes27 extraData;\n assembly {\n extraData := _totalElements\n extraData := or(extraData, shl(40, _lastSequencerTimestamp))\n extraData := shl(40, extraData)\n }\n\n return extraData;\n }\n\n /**\n * Appends a batch to the chain.\n * @param _batch Elements within the batch.\n * @param _extraData Any extra data to append to the batch.\n */\n function _appendBatch(\n bytes32[] memory _batch,\n bytes memory _extraData\n )\n internal\n {\n address sequencer = resolve(\"OVM_Proposer\");\n (uint40 totalElements, uint40 lastSequencerTimestamp) = _getBatchExtraData();\n\n if (msg.sender == sequencer) {\n lastSequencerTimestamp = uint40(block.timestamp);\n } else {\n // We keep track of the last batch submitted by the sequencer so there's a window in\n // which only the sequencer can publish state roots. A window like this just reduces\n // the chance of \"system breaking\" state roots being published while we're still in\n // testing mode. This window should be removed or significantly reduced in the future.\n require(\n lastSequencerTimestamp + SEQUENCER_PUBLISH_WINDOW < block.timestamp,\n \"Cannot publish state roots within the sequencer publication window.\"\n );\n }\n\n // For efficiency reasons getMerkleRoot modifies the `_batch` argument in place\n // while calculating the root hash therefore any arguments passed to it must not\n // be used again afterwards\n Lib_OVMCodec.ChainBatchHeader memory batchHeader = Lib_OVMCodec.ChainBatchHeader({\n batchIndex: getTotalBatches(),\n batchRoot: Lib_MerkleTree.getMerkleRoot(_batch),\n batchSize: _batch.length,\n prevTotalElements: totalElements,\n extraData: _extraData\n });\n\n emit StateBatchAppended(\n batchHeader.batchIndex,\n batchHeader.batchRoot,\n batchHeader.batchSize,\n batchHeader.prevTotalElements,\n batchHeader.extraData\n );\n\n batches().push(\n Lib_OVMCodec.hashBatchHeader(batchHeader),\n _makeBatchExtraData(\n uint40(batchHeader.prevTotalElements + batchHeader.batchSize),\n lastSequencerTimestamp\n )\n );\n }\n\n /**\n * Removes a batch and all subsequent batches from the chain.\n * @param _batchHeader Header of the batch to remove.\n */\n function _deleteBatch(\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\n )\n internal\n {\n require(\n _batchHeader.batchIndex < batches().length(),\n \"Invalid batch index.\"\n );\n\n require(\n _isValidBatchHeader(_batchHeader),\n \"Invalid batch header.\"\n );\n\n batches().deleteElementsAfterInclusive(\n _batchHeader.batchIndex,\n _makeBatchExtraData(\n uint40(_batchHeader.prevTotalElements),\n 0\n )\n );\n\n emit StateBatchDeleted(\n _batchHeader.batchIndex,\n _batchHeader.batchRoot\n );\n }\n\n /**\n * Checks that a batch header matches the stored hash for the given index.\n * @param _batchHeader Batch header to validate.\n * @return Whether or not the header matches the stored one.\n */\n function _isValidBatchHeader(\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\n )\n internal\n view\n returns (\n bool\n )\n {\n return Lib_OVMCodec.hashBatchHeader(_batchHeader) == batches().get(_batchHeader.batchIndex);\n }\n}\n" + }, + "contracts/optimistic-ethereum/libraries/utils/Lib_MerkleTree.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/**\n * @title Lib_MerkleTree\n * @author River Keefer\n */\nlibrary Lib_MerkleTree {\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Calculates a merkle root for a list of 32-byte leaf hashes. WARNING: If the number\n * of leaves passed in is not a power of two, it pads out the tree with zero hashes.\n * If you do not know the original length of elements for the tree you are verifying,\n * then this may allow empty leaves past _elements.length to pass a verification check down the line.\n * Note that the _elements argument is modified, therefore it must not be used again afterwards\n * @param _elements Array of hashes from which to generate a merkle root.\n * @return Merkle root of the leaves, with zero hashes for non-powers-of-two (see above).\n */\n function getMerkleRoot(\n bytes32[] memory _elements\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n require(\n _elements.length > 0,\n \"Lib_MerkleTree: Must provide at least one leaf hash.\"\n );\n\n if (_elements.length == 1) {\n return _elements[0];\n }\n\n uint256[16] memory defaults = [\n 0x290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563,\n 0x633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d,\n 0x890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d,\n 0x3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd8,\n 0xecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da,\n 0xdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da5,\n 0x617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d7,\n 0x292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead,\n 0xe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e10,\n 0x7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f82,\n 0xe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e83636516,\n 0x3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c,\n 0xad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e,\n 0xa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab,\n 0x4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c862,\n 0x2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf10\n ];\n\n // Reserve memory space for our hashes.\n bytes memory buf = new bytes(64);\n\n // We'll need to keep track of left and right siblings.\n bytes32 leftSibling;\n bytes32 rightSibling;\n\n // Number of non-empty nodes at the current depth.\n uint256 rowSize = _elements.length;\n\n // Current depth, counting from 0 at the leaves\n uint256 depth = 0;\n\n // Common sub-expressions\n uint256 halfRowSize; // rowSize / 2\n bool rowSizeIsOdd; // rowSize % 2 == 1\n\n while (rowSize > 1) {\n halfRowSize = rowSize / 2;\n rowSizeIsOdd = rowSize % 2 == 1;\n\n for (uint256 i = 0; i < halfRowSize; i++) {\n leftSibling = _elements[(2 * i) ];\n rightSibling = _elements[(2 * i) + 1];\n assembly {\n mstore(add(buf, 32), leftSibling )\n mstore(add(buf, 64), rightSibling)\n }\n\n _elements[i] = keccak256(buf);\n }\n\n if (rowSizeIsOdd) {\n leftSibling = _elements[rowSize - 1];\n rightSibling = bytes32(defaults[depth]);\n assembly {\n mstore(add(buf, 32), leftSibling)\n mstore(add(buf, 64), rightSibling)\n }\n\n _elements[halfRowSize] = keccak256(buf);\n }\n\n rowSize = halfRowSize + (rowSizeIsOdd ? 1 : 0);\n depth++;\n }\n\n return _elements[0];\n }\n\n /**\n * Verifies a merkle branch for the given leaf hash. Assumes the original length\n * of leaves generated is a known, correct input, and does not return true for indices\n * extending past that index (even if _siblings would be otherwise valid.)\n * @param _root The Merkle root to verify against.\n * @param _leaf The leaf hash to verify inclusion of.\n * @param _index The index in the tree of this leaf.\n * @param _siblings Array of sibline nodes in the inclusion proof, starting from depth 0 (bottom of the tree).\n * @param _totalLeaves The total number of leaves originally passed into.\n * @return Whether or not the merkle branch and leaf passes verification.\n */\n function verify(\n bytes32 _root,\n bytes32 _leaf,\n uint256 _index,\n bytes32[] memory _siblings,\n uint256 _totalLeaves\n )\n internal\n pure\n returns (\n bool\n )\n {\n require(\n _totalLeaves > 0,\n \"Lib_MerkleTree: Total leaves must be greater than zero.\"\n );\n\n require(\n _index < _totalLeaves,\n \"Lib_MerkleTree: Index out of bounds.\"\n );\n\n require(\n _siblings.length == _ceilLog2(_totalLeaves),\n \"Lib_MerkleTree: Total siblings does not correctly correspond to total leaves.\"\n );\n\n bytes32 computedRoot = _leaf;\n\n for (uint256 i = 0; i < _siblings.length; i++) {\n if ((_index & 1) == 1) {\n computedRoot = keccak256(\n abi.encodePacked(\n _siblings[i],\n computedRoot\n )\n );\n } else {\n computedRoot = keccak256(\n abi.encodePacked(\n computedRoot,\n _siblings[i]\n )\n );\n }\n\n _index >>= 1;\n }\n\n return _root == computedRoot;\n }\n\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * Calculates the integer ceiling of the log base 2 of an input.\n * @param _in Unsigned input to calculate the log.\n * @return ceil(log_base_2(_in))\n */\n function _ceilLog2(\n uint256 _in\n )\n private\n pure\n returns (\n uint256\n )\n {\n require(\n _in > 0,\n \"Lib_MerkleTree: Cannot compute ceil(log_2) of 0.\"\n );\n\n if (_in == 1) {\n return 0;\n }\n\n // Find the highest set bit (will be floor(log_2)).\n // Borrowed with <3 from https://github.com/ethereum/solidity-examples\n uint256 val = _in;\n uint256 highest = 0;\n for (uint256 i = 128; i >= 1; i >>= 1) {\n if (val & (uint(1) << i) - 1 << i != 0) {\n highest += i;\n val >>= i;\n }\n }\n\n // Increment by one if this is not a perfect logarithm.\n if ((uint(1) << highest) != _in) {\n highest += 1;\n }\n\n return highest;\n }\n}\n" + }, + "contracts/optimistic-ethereum/iOVM/verification/iOVM_FraudVerifier.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/* Interface Imports */\nimport { iOVM_StateTransitioner } from \"./iOVM_StateTransitioner.sol\";\n\n/**\n * @title iOVM_FraudVerifier\n */\ninterface iOVM_FraudVerifier {\n\n /**********\n * Events *\n **********/\n\n event FraudProofInitialized(\n bytes32 _preStateRoot,\n uint256 _preStateRootIndex,\n bytes32 _transactionHash,\n address _who\n );\n\n event FraudProofFinalized(\n bytes32 _preStateRoot,\n uint256 _preStateRootIndex,\n bytes32 _transactionHash,\n address _who\n );\n\n\n /***************************************\n * Public Functions: Transition Status *\n ***************************************/\n\n function getStateTransitioner(bytes32 _preStateRoot, bytes32 _txHash) external view returns (iOVM_StateTransitioner _transitioner);\n\n\n /****************************************\n * Public Functions: Fraud Verification *\n ****************************************/\n\n function initializeFraudVerification(\n bytes32 _preStateRoot,\n Lib_OVMCodec.ChainBatchHeader calldata _preStateRootBatchHeader,\n Lib_OVMCodec.ChainInclusionProof calldata _preStateRootProof,\n Lib_OVMCodec.Transaction calldata _transaction,\n Lib_OVMCodec.TransactionChainElement calldata _txChainElement,\n Lib_OVMCodec.ChainBatchHeader calldata _transactionBatchHeader,\n Lib_OVMCodec.ChainInclusionProof calldata _transactionProof\n ) external;\n\n function finalizeFraudVerification(\n bytes32 _preStateRoot,\n Lib_OVMCodec.ChainBatchHeader calldata _preStateRootBatchHeader,\n Lib_OVMCodec.ChainInclusionProof calldata _preStateRootProof,\n bytes32 _txHash,\n bytes32 _postStateRoot,\n Lib_OVMCodec.ChainBatchHeader calldata _postStateRootBatchHeader,\n Lib_OVMCodec.ChainInclusionProof calldata _postStateRootProof\n ) external;\n}\n" + }, + "contracts/optimistic-ethereum/iOVM/chain/iOVM_StateCommitmentChain.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/**\n * @title iOVM_StateCommitmentChain\n */\ninterface iOVM_StateCommitmentChain {\n\n /**********\n * Events *\n **********/\n\n event StateBatchAppended(\n uint256 indexed _batchIndex,\n bytes32 _batchRoot,\n uint256 _batchSize,\n uint256 _prevTotalElements,\n bytes _extraData\n );\n\n event StateBatchDeleted(\n uint256 indexed _batchIndex,\n bytes32 _batchRoot\n );\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Retrieves the total number of elements submitted.\n * @return _totalElements Total submitted elements.\n */\n function getTotalElements()\n external\n view\n returns (\n uint256 _totalElements\n );\n\n /**\n * Retrieves the total number of batches submitted.\n * @return _totalBatches Total submitted batches.\n */\n function getTotalBatches()\n external\n view\n returns (\n uint256 _totalBatches\n );\n\n /**\n * Retrieves the timestamp of the last batch submitted by the sequencer.\n * @return _lastSequencerTimestamp Last sequencer batch timestamp.\n */\n function getLastSequencerTimestamp()\n external\n view\n returns (\n uint256 _lastSequencerTimestamp\n );\n\n /**\n * Appends a batch of state roots to the chain.\n * @param _batch Batch of state roots.\n * @param _shouldStartAtElement Index of the element at which this batch should start.\n */\n function appendStateBatch(\n bytes32[] calldata _batch,\n uint256 _shouldStartAtElement\n )\n external;\n\n /**\n * Deletes all state roots after (and including) a given batch.\n * @param _batchHeader Header of the batch to start deleting from.\n */\n function deleteStateBatch(\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\n )\n external;\n\n /**\n * Verifies a batch inclusion proof.\n * @param _element Hash of the element to verify a proof for.\n * @param _batchHeader Header of the batch in which the element was included.\n * @param _proof Merkle inclusion proof for the element.\n */\n function verifyStateCommitment(\n bytes32 _element,\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _proof\n )\n external\n view\n returns (\n bool _verified\n );\n\n /**\n * Checks whether a given batch is still inside its fraud proof window.\n * @param _batchHeader Header of the batch to check.\n * @return _inside Whether or not the batch is inside the fraud proof window.\n */\n function insideFraudProofWindow(\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\n )\n external\n view\n returns (\n bool _inside\n );\n}\n" + }, + "contracts/optimistic-ethereum/iOVM/chain/iOVM_CanonicalTransactionChain.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/* Interface Imports */\nimport { iOVM_ChainStorageContainer } from \"./iOVM_ChainStorageContainer.sol\";\n\n/**\n * @title iOVM_CanonicalTransactionChain\n */\ninterface iOVM_CanonicalTransactionChain {\n\n /**********\n * Events *\n **********/\n\n event TransactionEnqueued(\n address _l1TxOrigin,\n address _target,\n uint256 _gasLimit,\n bytes _data,\n uint256 _queueIndex,\n uint256 _timestamp\n );\n\n event QueueBatchAppended(\n uint256 _startingQueueIndex,\n uint256 _numQueueElements,\n uint256 _totalElements\n );\n\n event SequencerBatchAppended(\n uint256 _startingQueueIndex,\n uint256 _numQueueElements,\n uint256 _totalElements\n );\n\n event TransactionBatchAppended(\n uint256 indexed _batchIndex,\n bytes32 _batchRoot,\n uint256 _batchSize,\n uint256 _prevTotalElements,\n bytes _extraData\n );\n\n\n /***********\n * Structs *\n ***********/\n\n struct BatchContext {\n uint256 numSequencedTransactions;\n uint256 numSubsequentQueueTransactions;\n uint256 timestamp;\n uint256 blockNumber;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n\n /**\n * Accesses the batch storage container.\n * @return Reference to the batch storage container.\n */\n function batches()\n external\n view\n returns (\n iOVM_ChainStorageContainer\n );\n\n /**\n * Accesses the queue storage container.\n * @return Reference to the queue storage container.\n */\n function queue()\n external\n view\n returns (\n iOVM_ChainStorageContainer\n );\n\n /**\n * Retrieves the total number of elements submitted.\n * @return _totalElements Total submitted elements.\n */\n function getTotalElements()\n external\n view\n returns (\n uint256 _totalElements\n );\n\n /**\n * Retrieves the total number of batches submitted.\n * @return _totalBatches Total submitted batches.\n */\n function getTotalBatches()\n external\n view\n returns (\n uint256 _totalBatches\n );\n\n /**\n * Returns the index of the next element to be enqueued.\n * @return Index for the next queue element.\n */\n function getNextQueueIndex()\n external\n view\n returns (\n uint40\n );\n\n /**\n * Gets the queue element at a particular index.\n * @param _index Index of the queue element to access.\n * @return _element Queue element at the given index.\n */\n function getQueueElement(\n uint256 _index\n )\n external\n view\n returns (\n Lib_OVMCodec.QueueElement memory _element\n );\n\n /**\n * Returns the timestamp of the last transaction.\n * @return Timestamp for the last transaction.\n */\n function getLastTimestamp()\n external\n view\n returns (\n uint40\n );\n\n /**\n * Returns the blocknumber of the last transaction.\n * @return Blocknumber for the last transaction.\n */\n function getLastBlockNumber()\n external\n view\n returns (\n uint40\n );\n\n /**\n * Get the number of queue elements which have not yet been included.\n * @return Number of pending queue elements.\n */\n function getNumPendingQueueElements()\n external\n view\n returns (\n uint40\n );\n\n /**\n * Retrieves the length of the queue, including\n * both pending and canonical transactions.\n * @return Length of the queue.\n */\n function getQueueLength()\n external\n view\n returns (\n uint40\n );\n\n\n /**\n * Adds a transaction to the queue.\n * @param _target Target contract to send the transaction to.\n * @param _gasLimit Gas limit for the given transaction.\n * @param _data Transaction data.\n */\n function enqueue(\n address _target,\n uint256 _gasLimit,\n bytes memory _data\n )\n external;\n\n /**\n * Appends a given number of queued transactions as a single batch.\n * @param _numQueuedTransactions Number of transactions to append.\n */\n function appendQueueBatch(\n uint256 _numQueuedTransactions\n )\n external;\n\n /**\n * Allows the sequencer to append a batch of transactions.\n * @dev This function uses a custom encoding scheme for efficiency reasons.\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\n * .param _contexts Array of batch contexts.\n * .param _transactionDataFields Array of raw transaction data.\n */\n function appendSequencerBatch(\n // uint40 _shouldStartAtElement,\n // uint24 _totalElementsToAppend,\n // BatchContext[] _contexts,\n // bytes[] _transactionDataFields\n )\n external;\n\n /**\n * Verifies whether a transaction is included in the chain.\n * @param _transaction Transaction to verify.\n * @param _txChainElement Transaction chain element corresponding to the transaction.\n * @param _batchHeader Header of the batch the transaction was included in.\n * @param _inclusionProof Inclusion proof for the provided transaction chain element.\n * @return True if the transaction exists in the CTC, false if not.\n */\n function verifyTransaction(\n Lib_OVMCodec.Transaction memory _transaction,\n Lib_OVMCodec.TransactionChainElement memory _txChainElement,\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _inclusionProof\n )\n external\n view\n returns (\n bool\n );\n}\n" + }, + "contracts/optimistic-ethereum/iOVM/verification/iOVM_BondManager.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\ninterface ERC20 {\n function transfer(address, uint256) external returns (bool);\n function transferFrom(address, address, uint256) external returns (bool);\n}\n\n/// All the errors which may be encountered on the bond manager\nlibrary Errors {\n string constant ERC20_ERR = \"BondManager: Could not post bond\";\n string constant ALREADY_FINALIZED = \"BondManager: Fraud proof for this pre-state root has already been finalized\";\n string constant SLASHED = \"BondManager: Cannot finalize withdrawal, you probably got slashed\";\n string constant WRONG_STATE = \"BondManager: Wrong bond state for proposer\";\n string constant CANNOT_CLAIM = \"BondManager: Cannot claim yet. Dispute must be finalized first\";\n\n string constant WITHDRAWAL_PENDING = \"BondManager: Withdrawal already pending\";\n string constant TOO_EARLY = \"BondManager: Too early to finalize your withdrawal\";\n\n string constant ONLY_TRANSITIONER = \"BondManager: Only the transitioner for this pre-state root may call this function\";\n string constant ONLY_FRAUD_VERIFIER = \"BondManager: Only the fraud verifier may call this function\";\n string constant ONLY_STATE_COMMITMENT_CHAIN = \"BondManager: Only the state commitment chain may call this function\";\n string constant WAIT_FOR_DISPUTES = \"BondManager: Wait for other potential disputes\";\n}\n\n/**\n * @title iOVM_BondManager\n */\ninterface iOVM_BondManager {\n\n /*******************\n * Data Structures *\n *******************/\n\n /// The lifecycle of a proposer's bond\n enum State {\n // Before depositing or after getting slashed, a user is uncollateralized\n NOT_COLLATERALIZED,\n // After depositing, a user is collateralized\n COLLATERALIZED,\n // After a user has initiated a withdrawal\n WITHDRAWING\n }\n\n /// A bond posted by a proposer\n struct Bond {\n // The user's state\n State state;\n // The timestamp at which a proposer issued their withdrawal request\n uint32 withdrawalTimestamp;\n // The time when the first disputed was initiated for this bond\n uint256 firstDisputeAt;\n // The earliest observed state root for this bond which has had fraud\n bytes32 earliestDisputedStateRoot;\n // The state root's timestamp\n uint256 earliestTimestamp;\n }\n\n // Per pre-state root, store the number of state provisions that were made\n // and how many of these calls were made by each user. Payouts will then be\n // claimed by users proportionally for that dispute.\n struct Rewards {\n // Flag to check if rewards for a fraud proof are claimable\n bool canClaim;\n // Total number of `recordGasSpent` calls made\n uint256 total;\n // The gas spent by each user to provide witness data. The sum of all\n // values inside this map MUST be equal to the value of `total`\n mapping(address => uint256) gasSpent;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n function recordGasSpent(\n bytes32 _preStateRoot,\n bytes32 _txHash,\n address _who,\n uint256 _gasSpent\n ) external;\n\n function finalize(\n bytes32 _preStateRoot,\n address _publisher,\n uint256 _timestamp\n ) external;\n\n function deposit() external;\n\n function startWithdrawal() external;\n\n function finalizeWithdrawal() external;\n\n function claim(\n address _who\n ) external;\n\n function isCollateralized(\n address _who\n ) external view returns (bool);\n\n function getGasSpent(\n bytes32 _preStateRoot,\n address _who\n ) external view returns (uint256);\n}\n" + }, + "contracts/optimistic-ethereum/iOVM/chain/iOVM_ChainStorageContainer.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/**\n * @title iOVM_ChainStorageContainer\n */\ninterface iOVM_ChainStorageContainer {\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\n * 27 bytes to store arbitrary data.\n * @param _globalMetadata New global metadata to set.\n */\n function setGlobalMetadata(\n bytes27 _globalMetadata\n )\n external;\n\n /**\n * Retrieves the container's global metadata field.\n * @return Container global metadata field.\n */\n function getGlobalMetadata()\n external\n view\n returns (\n bytes27\n );\n\n /**\n * Retrieves the number of objects stored in the container.\n * @return Number of objects in the container.\n */\n function length()\n external\n view\n returns (\n uint256\n );\n\n /**\n * Pushes an object into the container.\n * @param _object A 32 byte value to insert into the container.\n */\n function push(\n bytes32 _object\n )\n external;\n\n /**\n * Pushes an object into the container. Function allows setting the global metadata since\n * we'll need to touch the \"length\" storage slot anyway, which also contains the global\n * metadata (it's an optimization).\n * @param _object A 32 byte value to insert into the container.\n * @param _globalMetadata New global metadata for the container.\n */\n function push(\n bytes32 _object,\n bytes27 _globalMetadata\n )\n external;\n\n /**\n * Retrieves an object from the container.\n * @param _index Index of the particular object to access.\n * @return 32 byte object value.\n */\n function get(\n uint256 _index\n )\n external\n view\n returns (\n bytes32\n );\n\n /**\n * Removes all objects after and including a given index.\n * @param _index Object index to delete from.\n */\n function deleteElementsAfterInclusive(\n uint256 _index\n )\n external;\n\n /**\n * Removes all objects after and including a given index. Also allows setting the global\n * metadata field.\n * @param _index Object index to delete from.\n * @param _globalMetadata New global metadata for the container.\n */\n function deleteElementsAfterInclusive(\n uint256 _index,\n bytes27 _globalMetadata\n )\n external;\n\n /**\n * Marks an index as overwritable, meaing the underlying buffer can start to write values over\n * any objects before and including the given index.\n */\n function setNextOverwritableIndex(\n uint256 _index\n )\n external;\n}\n" + }, + "contracts/optimistic-ethereum/iOVM/verification/iOVM_StateTransitioner.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/**\n * @title iOVM_StateTransitioner\n */\ninterface iOVM_StateTransitioner {\n\n /**********\n * Events *\n **********/\n\n event AccountCommitted(\n address _address\n );\n\n event ContractStorageCommitted(\n address _address,\n bytes32 _key\n );\n\n\n /**********************************\n * Public Functions: State Access *\n **********************************/\n\n function getPreStateRoot() external view returns (bytes32 _preStateRoot);\n function getPostStateRoot() external view returns (bytes32 _postStateRoot);\n function isComplete() external view returns (bool _complete);\n\n\n /***********************************\n * Public Functions: Pre-Execution *\n ***********************************/\n\n function proveContractState(\n address _ovmContractAddress,\n address _ethContractAddress,\n bytes calldata _stateTrieWitness\n ) external;\n\n function proveStorageSlot(\n address _ovmContractAddress,\n bytes32 _key,\n bytes calldata _storageTrieWitness\n ) external;\n\n\n /*******************************\n * Public Functions: Execution *\n *******************************/\n\n function applyTransaction(\n Lib_OVMCodec.Transaction calldata _transaction\n ) external;\n\n\n /************************************\n * Public Functions: Post-Execution *\n ************************************/\n\n function commitContractState(\n address _ovmContractAddress,\n bytes calldata _stateTrieWitness\n ) external;\n\n function commitStorageSlot(\n address _ovmContractAddress,\n bytes32 _key,\n bytes calldata _storageTrieWitness\n ) external;\n\n\n /**********************************\n * Public Functions: Finalization *\n **********************************/\n\n function completeTransition() external;\n}\n" + }, + "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Library Imports */\nimport { Lib_RingBuffer } from \"../../libraries/utils/Lib_RingBuffer.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/* Interface Imports */\nimport { iOVM_ChainStorageContainer } from \"../../iOVM/chain/iOVM_ChainStorageContainer.sol\";\n\n/**\n * @title OVM_ChainStorageContainer\n * @dev The Chain Storage Container provides its owner contract with read, write and delete functionality.\n * This provides gas efficiency gains by enabling it to overwrite storage slots which can no longer be used\n * in a fraud proof due to the fraud window having passed, and the associated chain state or\n * transactions being finalized.\n * Three distinct Chain Storage Containers will be deployed on Layer 1:\n * 1. Stores transaction batches for the Canonical Transaction Chain\n * 2. Stores queued transactions for the Canonical Transaction Chain\n * 3. Stores chain state batches for the State Commitment Chain\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract OVM_ChainStorageContainer is iOVM_ChainStorageContainer, Lib_AddressResolver {\n\n /*************\n * Libraries *\n *************/\n\n using Lib_RingBuffer for Lib_RingBuffer.RingBuffer;\n\n\n /*************\n * Variables *\n *************/\n\n string public owner;\n Lib_RingBuffer.RingBuffer internal buffer;\n\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n * @param _owner Name of the contract that owns this container (will be resolved later).\n */\n constructor(\n address _libAddressManager,\n string memory _owner\n )\n Lib_AddressResolver(_libAddressManager)\n {\n owner = _owner;\n }\n\n\n /**********************\n * Function Modifiers *\n **********************/\n\n modifier onlyOwner() {\n require(\n msg.sender == resolve(owner),\n \"OVM_ChainStorageContainer: Function can only be called by the owner.\"\n );\n _;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @inheritdoc iOVM_ChainStorageContainer\n */\n function setGlobalMetadata(\n bytes27 _globalMetadata\n )\n override\n public\n onlyOwner\n {\n return buffer.setExtraData(_globalMetadata);\n }\n\n /**\n * @inheritdoc iOVM_ChainStorageContainer\n */\n function getGlobalMetadata()\n override\n public\n view\n returns (\n bytes27\n )\n {\n return buffer.getExtraData();\n }\n\n /**\n * @inheritdoc iOVM_ChainStorageContainer\n */\n function length()\n override\n public\n view\n returns (\n uint256\n )\n {\n return uint256(buffer.getLength());\n }\n\n /**\n * @inheritdoc iOVM_ChainStorageContainer\n */\n function push(\n bytes32 _object\n )\n override\n public\n onlyOwner\n {\n buffer.push(_object);\n }\n\n /**\n * @inheritdoc iOVM_ChainStorageContainer\n */\n function push(\n bytes32 _object,\n bytes27 _globalMetadata\n )\n override\n public\n onlyOwner\n {\n buffer.push(_object, _globalMetadata);\n }\n\n /**\n * @inheritdoc iOVM_ChainStorageContainer\n */\n function get(\n uint256 _index\n )\n override\n public\n view\n returns (\n bytes32\n )\n {\n return buffer.get(uint40(_index));\n }\n\n /**\n * @inheritdoc iOVM_ChainStorageContainer\n */\n function deleteElementsAfterInclusive(\n uint256 _index\n )\n override\n public\n onlyOwner\n {\n buffer.deleteElementsAfterInclusive(\n uint40(_index)\n );\n }\n\n /**\n * @inheritdoc iOVM_ChainStorageContainer\n */\n function deleteElementsAfterInclusive(\n uint256 _index,\n bytes27 _globalMetadata\n )\n override\n public\n onlyOwner\n {\n buffer.deleteElementsAfterInclusive(\n uint40(_index),\n _globalMetadata\n );\n }\n\n /**\n * @inheritdoc iOVM_ChainStorageContainer\n */\n function setNextOverwritableIndex(\n uint256 _index\n )\n override\n public\n onlyOwner\n {\n buffer.nextOverwritableIndex = _index;\n }\n}\n" + }, + "contracts/optimistic-ethereum/libraries/utils/Lib_RingBuffer.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\nlibrary Lib_RingBuffer {\n using Lib_RingBuffer for RingBuffer;\n\n /***********\n * Structs *\n ***********/\n\n struct Buffer {\n uint256 length;\n mapping (uint256 => bytes32) buf;\n }\n\n struct RingBuffer {\n bytes32 contextA;\n bytes32 contextB;\n Buffer bufferA;\n Buffer bufferB;\n uint256 nextOverwritableIndex;\n }\n\n struct RingBufferContext {\n // contextA\n uint40 globalIndex;\n bytes27 extraData;\n\n // contextB\n uint64 currBufferIndex;\n uint40 prevResetIndex;\n uint40 currResetIndex;\n }\n\n\n /*************\n * Constants *\n *************/\n\n uint256 constant MIN_CAPACITY = 16;\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Pushes a single element to the buffer.\n * @param _self Buffer to access.\n * @param _value Value to push to the buffer.\n * @param _extraData Optional global extra data.\n */\n function push(\n RingBuffer storage _self,\n bytes32 _value,\n bytes27 _extraData\n )\n internal\n {\n RingBufferContext memory ctx = _self.getContext();\n Buffer storage currBuffer = _self.getBuffer(ctx.currBufferIndex);\n\n // Set a minimum capacity.\n if (currBuffer.length == 0) {\n currBuffer.length = MIN_CAPACITY;\n }\n\n // Check if we need to expand the buffer.\n if (ctx.globalIndex - ctx.currResetIndex >= currBuffer.length) {\n if (ctx.currResetIndex < _self.nextOverwritableIndex) {\n // We're going to overwrite the inactive buffer.\n // Bump the buffer index, reset the delete offset, and set our reset indices.\n ctx.currBufferIndex++;\n ctx.prevResetIndex = ctx.currResetIndex;\n ctx.currResetIndex = ctx.globalIndex;\n\n // Swap over to the next buffer.\n currBuffer = _self.getBuffer(ctx.currBufferIndex);\n } else {\n // We're not overwriting yet, double the length of the current buffer.\n currBuffer.length *= 2;\n }\n }\n\n // Index to write to is the difference of the global and reset indices.\n uint256 writeHead = ctx.globalIndex - ctx.currResetIndex;\n currBuffer.buf[writeHead] = _value;\n\n // Bump the global index and insert our extra data, then save the context.\n ctx.globalIndex++;\n ctx.extraData = _extraData;\n _self.setContext(ctx);\n }\n\n /**\n * Pushes a single element to the buffer.\n * @param _self Buffer to access.\n * @param _value Value to push to the buffer.\n */\n function push(\n RingBuffer storage _self,\n bytes32 _value\n )\n internal\n {\n RingBufferContext memory ctx = _self.getContext();\n\n _self.push(\n _value,\n ctx.extraData\n );\n }\n\n /**\n * Retrieves an element from the buffer.\n * @param _self Buffer to access.\n * @param _index Element index to retrieve.\n * @return Value of the element at the given index.\n */\n function get(\n RingBuffer storage _self,\n uint256 _index\n )\n internal\n view\n returns (\n bytes32\n )\n {\n RingBufferContext memory ctx = _self.getContext();\n\n require(\n _index < ctx.globalIndex,\n \"Index out of bounds.\"\n );\n\n Buffer storage currBuffer = _self.getBuffer(ctx.currBufferIndex);\n Buffer storage prevBuffer = _self.getBuffer(ctx.currBufferIndex + 1);\n\n if (_index >= ctx.currResetIndex) {\n // We're trying to load an element from the current buffer.\n // Relative index is just the difference from the reset index.\n uint256 relativeIndex = _index - ctx.currResetIndex;\n\n // Shouldn't happen but why not check.\n require(\n relativeIndex < currBuffer.length,\n \"Index out of bounds.\"\n );\n\n return currBuffer.buf[relativeIndex];\n } else {\n // We're trying to load an element from the previous buffer.\n // Relative index is the difference from the reset index in the other direction.\n uint256 relativeIndex = ctx.currResetIndex - _index;\n\n // Condition only fails in the case that we deleted and flipped buffers.\n require(\n ctx.currResetIndex > ctx.prevResetIndex,\n \"Index out of bounds.\"\n );\n\n // Make sure we're not trying to read beyond the array.\n require(\n relativeIndex <= prevBuffer.length,\n \"Index out of bounds.\"\n );\n\n return prevBuffer.buf[prevBuffer.length - relativeIndex];\n }\n }\n\n /**\n * Deletes all elements after (and including) a given index.\n * @param _self Buffer to access.\n * @param _index Index of the element to delete from (inclusive).\n * @param _extraData Optional global extra data.\n */\n function deleteElementsAfterInclusive(\n RingBuffer storage _self,\n uint40 _index,\n bytes27 _extraData\n )\n internal\n {\n RingBufferContext memory ctx = _self.getContext();\n\n require(\n _index < ctx.globalIndex && _index >= ctx.prevResetIndex,\n \"Index out of bounds.\"\n );\n\n if (_index < ctx.currResetIndex) {\n // We're switching back to the previous buffer.\n // Reduce the buffer index, set the current reset index back to match the previous one.\n // We use the equality of these two values to prevent reading beyond this buffer.\n ctx.currBufferIndex--;\n ctx.currResetIndex = ctx.prevResetIndex;\n }\n\n // Set our global index and extra data, save the context.\n ctx.globalIndex = _index;\n ctx.extraData = _extraData;\n _self.setContext(ctx);\n }\n\n /**\n * Deletes all elements after (and including) a given index.\n * @param _self Buffer to access.\n * @param _index Index of the element to delete from (inclusive).\n */\n function deleteElementsAfterInclusive(\n RingBuffer storage _self,\n uint40 _index\n )\n internal\n {\n RingBufferContext memory ctx = _self.getContext();\n _self.deleteElementsAfterInclusive(\n _index,\n ctx.extraData\n );\n }\n\n /**\n * Retrieves the current global index.\n * @param _self Buffer to access.\n * @return Current global index.\n */\n function getLength(\n RingBuffer storage _self\n )\n internal\n view\n returns (\n uint40\n )\n {\n RingBufferContext memory ctx = _self.getContext();\n return ctx.globalIndex;\n }\n\n /**\n * Changes current global extra data.\n * @param _self Buffer to access.\n * @param _extraData New global extra data.\n */\n function setExtraData(\n RingBuffer storage _self,\n bytes27 _extraData\n )\n internal\n {\n RingBufferContext memory ctx = _self.getContext();\n ctx.extraData = _extraData;\n _self.setContext(ctx);\n }\n\n /**\n * Retrieves the current global extra data.\n * @param _self Buffer to access.\n * @return Current global extra data.\n */\n function getExtraData(\n RingBuffer storage _self\n )\n internal\n view\n returns (\n bytes27\n )\n {\n RingBufferContext memory ctx = _self.getContext();\n return ctx.extraData;\n }\n\n /**\n * Sets the current ring buffer context.\n * @param _self Buffer to access.\n * @param _ctx Current ring buffer context.\n */\n function setContext(\n RingBuffer storage _self,\n RingBufferContext memory _ctx\n )\n internal\n {\n bytes32 contextA;\n bytes32 contextB;\n\n uint40 globalIndex = _ctx.globalIndex;\n bytes27 extraData = _ctx.extraData;\n assembly {\n contextA := globalIndex\n contextA := or(contextA, extraData)\n }\n\n uint64 currBufferIndex = _ctx.currBufferIndex;\n uint40 prevResetIndex = _ctx.prevResetIndex;\n uint40 currResetIndex = _ctx.currResetIndex;\n assembly {\n contextB := currBufferIndex\n contextB := or(contextB, shl(64, prevResetIndex))\n contextB := or(contextB, shl(104, currResetIndex))\n }\n\n if (_self.contextA != contextA) {\n _self.contextA = contextA;\n }\n\n if (_self.contextB != contextB) {\n _self.contextB = contextB;\n }\n }\n\n /**\n * Retrieves the current ring buffer context.\n * @param _self Buffer to access.\n * @return Current ring buffer context.\n */\n function getContext(\n RingBuffer storage _self\n )\n internal\n view\n returns (\n RingBufferContext memory\n )\n {\n bytes32 contextA = _self.contextA;\n bytes32 contextB = _self.contextB;\n\n uint40 globalIndex;\n bytes27 extraData;\n assembly {\n globalIndex := and(contextA, 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF)\n extraData := and(contextA, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000)\n }\n\n uint64 currBufferIndex;\n uint40 prevResetIndex;\n uint40 currResetIndex;\n assembly {\n currBufferIndex := and(contextB, 0x000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF)\n prevResetIndex := shr(64, and(contextB, 0x00000000000000000000000000000000000000FFFFFFFFFF0000000000000000))\n currResetIndex := shr(104, and(contextB, 0x0000000000000000000000000000FFFFFFFFFF00000000000000000000000000))\n }\n\n return RingBufferContext({\n globalIndex: globalIndex,\n extraData: extraData,\n currBufferIndex: currBufferIndex,\n prevResetIndex: prevResetIndex,\n currResetIndex: currResetIndex\n });\n }\n\n /**\n * Retrieves the a buffer from the ring buffer by index.\n * @param _self Buffer to access.\n * @param _which Index of the sub buffer to access.\n * @return Sub buffer for the index.\n */\n function getBuffer(\n RingBuffer storage _self,\n uint256 _which\n )\n internal\n view\n returns (\n Buffer storage\n )\n {\n return _which % 2 == 0 ? _self.bufferA : _self.bufferB;\n }\n}\n" + }, + "contracts/optimistic-ethereum/OVM/verification/OVM_StateTransitionerFactory.sol": { + "content": "// SPDX-License-Identifier: MIT\n// @unsupported: ovm\npragma solidity >0.5.0 <0.8.0;\n\n/* Library Imports */\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/* Interface Imports */\nimport { iOVM_StateTransitioner } from \"../../iOVM/verification/iOVM_StateTransitioner.sol\";\nimport { iOVM_StateTransitionerFactory } from \"../../iOVM/verification/iOVM_StateTransitionerFactory.sol\";\nimport { iOVM_FraudVerifier } from \"../../iOVM/verification/iOVM_FraudVerifier.sol\";\n\n/* Contract Imports */\nimport { OVM_StateTransitioner } from \"./OVM_StateTransitioner.sol\";\n\n/**\n * @title OVM_StateTransitionerFactory\n * @dev The State Transitioner Factory is used by the Fraud Verifier to create a new State\n * Transitioner during the initialization of a fraud proof.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract OVM_StateTransitionerFactory is iOVM_StateTransitionerFactory, Lib_AddressResolver {\n\n /***************\n * Constructor *\n ***************/\n\n constructor(\n address _libAddressManager\n )\n Lib_AddressResolver(_libAddressManager)\n {}\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Creates a new OVM_StateTransitioner\n * @param _libAddressManager Address of the Address Manager.\n * @param _stateTransitionIndex Index of the state transition being verified.\n * @param _preStateRoot State root before the transition was executed.\n * @param _transactionHash Hash of the executed transaction.\n * @return New OVM_StateTransitioner instance.\n */\n function create(\n address _libAddressManager,\n uint256 _stateTransitionIndex,\n bytes32 _preStateRoot,\n bytes32 _transactionHash\n )\n override\n public\n returns (\n iOVM_StateTransitioner\n )\n {\n require(\n msg.sender == resolve(\"OVM_FraudVerifier\"),\n \"Create can only be done by the OVM_FraudVerifier.\"\n );\n\n return new OVM_StateTransitioner(\n _libAddressManager,\n _stateTransitionIndex,\n _preStateRoot,\n _transactionHash\n );\n }\n}\n" + }, + "contracts/optimistic-ethereum/iOVM/verification/iOVM_StateTransitionerFactory.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Contract Imports */\nimport { iOVM_StateTransitioner } from \"./iOVM_StateTransitioner.sol\";\n\n/**\n * @title iOVM_StateTransitionerFactory\n */\ninterface iOVM_StateTransitionerFactory {\n\n /***************************************\n * Public Functions: Contract Creation *\n ***************************************/\n\n function create(\n address _proxyManager,\n uint256 _stateTransitionIndex,\n bytes32 _preStateRoot,\n bytes32 _transactionHash\n )\n external\n returns (\n iOVM_StateTransitioner _ovmStateTransitioner\n );\n}\n" + }, + "contracts/optimistic-ethereum/OVM/verification/OVM_StateTransitioner.sol": { + "content": "// SPDX-License-Identifier: MIT\n// @unsupported: ovm\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\nimport { Lib_EthUtils } from \"../../libraries/utils/Lib_EthUtils.sol\";\nimport { Lib_Bytes32Utils } from \"../../libraries/utils/Lib_Bytes32Utils.sol\";\nimport { Lib_BytesUtils } from \"../../libraries/utils/Lib_BytesUtils.sol\";\nimport { Lib_SecureMerkleTrie } from \"../../libraries/trie/Lib_SecureMerkleTrie.sol\";\nimport { Lib_RLPWriter } from \"../../libraries/rlp/Lib_RLPWriter.sol\";\nimport { Lib_RLPReader } from \"../../libraries/rlp/Lib_RLPReader.sol\";\n\n/* Interface Imports */\nimport { iOVM_StateTransitioner } from \"../../iOVM/verification/iOVM_StateTransitioner.sol\";\nimport { iOVM_BondManager } from \"../../iOVM/verification/iOVM_BondManager.sol\";\nimport { iOVM_ExecutionManager } from \"../../iOVM/execution/iOVM_ExecutionManager.sol\";\nimport { iOVM_StateManager } from \"../../iOVM/execution/iOVM_StateManager.sol\";\nimport { iOVM_StateManagerFactory } from \"../../iOVM/execution/iOVM_StateManagerFactory.sol\";\n\n/* Contract Imports */\nimport { Abs_FraudContributor } from \"./Abs_FraudContributor.sol\";\n\n/**\n * @title OVM_StateTransitioner\n * @dev The State Transitioner coordinates the execution of a state transition during the evaluation of a\n * fraud proof. It feeds verified input to the Execution Manager's run(), and controls a State Manager (which is\n * uniquely created for each fraud proof).\n * Once a fraud proof has been initialized, this contract is provided with the pre-state root and verifies\n * that the OVM storage slots committed to the State Mangager are contained in that state\n * This contract controls the State Manager and Execution Manager, and uses them to calculate the\n * post-state root by applying the transaction. The Fraud Verifier can then check for fraud by comparing\n * the calculated post-state root with the proposed post-state root.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract OVM_StateTransitioner is Lib_AddressResolver, Abs_FraudContributor, iOVM_StateTransitioner {\n\n /*******************\n * Data Structures *\n *******************/\n\n enum TransitionPhase {\n PRE_EXECUTION,\n POST_EXECUTION,\n COMPLETE\n }\n\n\n /*******************************************\n * Contract Variables: Contract References *\n *******************************************/\n\n iOVM_StateManager public ovmStateManager;\n\n\n /*******************************************\n * Contract Variables: Internal Accounting *\n *******************************************/\n\n bytes32 internal preStateRoot;\n bytes32 internal postStateRoot;\n TransitionPhase public phase;\n uint256 internal stateTransitionIndex;\n bytes32 internal transactionHash;\n\n\n /*************\n * Constants *\n *************/\n\n bytes32 internal constant EMPTY_ACCOUNT_CODE_HASH = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;\n bytes32 internal constant EMPTY_ACCOUNT_STORAGE_ROOT = 0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421;\n\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n * @param _stateTransitionIndex Index of the state transition being verified.\n * @param _preStateRoot State root before the transition was executed.\n * @param _transactionHash Hash of the executed transaction.\n */\n constructor(\n address _libAddressManager,\n uint256 _stateTransitionIndex,\n bytes32 _preStateRoot,\n bytes32 _transactionHash\n )\n Lib_AddressResolver(_libAddressManager)\n {\n stateTransitionIndex = _stateTransitionIndex;\n preStateRoot = _preStateRoot;\n postStateRoot = _preStateRoot;\n transactionHash = _transactionHash;\n\n ovmStateManager = iOVM_StateManagerFactory(resolve(\"OVM_StateManagerFactory\")).create(address(this));\n }\n\n\n /**********************\n * Function Modifiers *\n **********************/\n\n /**\n * Checks that a function is only run during a specific phase.\n * @param _phase Phase the function must run within.\n */\n modifier onlyDuringPhase(\n TransitionPhase _phase\n ) {\n require(\n phase == _phase,\n \"Function must be called during the correct phase.\"\n );\n _;\n }\n\n\n /**********************************\n * Public Functions: State Access *\n **********************************/\n\n /**\n * Retrieves the state root before execution.\n * @return _preStateRoot State root before execution.\n */\n function getPreStateRoot()\n override\n public\n view\n returns (\n bytes32 _preStateRoot\n )\n {\n return preStateRoot;\n }\n\n /**\n * Retrieves the state root after execution.\n * @return _postStateRoot State root after execution.\n */\n function getPostStateRoot()\n override\n public\n view\n returns (\n bytes32 _postStateRoot\n )\n {\n return postStateRoot;\n }\n\n /**\n * Checks whether the transitioner is complete.\n * @return _complete Whether or not the transition process is finished.\n */\n function isComplete()\n override\n public\n view\n returns (\n bool _complete\n )\n {\n return phase == TransitionPhase.COMPLETE;\n }\n\n\n /***********************************\n * Public Functions: Pre-Execution *\n ***********************************/\n\n /**\n * Allows a user to prove the initial state of a contract.\n * @param _ovmContractAddress Address of the contract on the OVM.\n * @param _ethContractAddress Address of the corresponding contract on L1.\n * @param _stateTrieWitness Proof of the account state.\n */\n function proveContractState(\n address _ovmContractAddress,\n address _ethContractAddress,\n bytes memory _stateTrieWitness\n )\n override\n public\n onlyDuringPhase(TransitionPhase.PRE_EXECUTION)\n contributesToFraudProof(preStateRoot, transactionHash)\n {\n // Exit quickly to avoid unnecessary work.\n require(\n (\n ovmStateManager.hasAccount(_ovmContractAddress) == false\n && ovmStateManager.hasEmptyAccount(_ovmContractAddress) == false\n ),\n \"Account state has already been proven.\"\n );\n\n // Function will fail if the proof is not a valid inclusion or exclusion proof.\n (\n bool exists,\n bytes memory encodedAccount\n ) = Lib_SecureMerkleTrie.get(\n abi.encodePacked(_ovmContractAddress),\n _stateTrieWitness,\n preStateRoot\n );\n\n if (exists == true) {\n // Account exists, this was an inclusion proof.\n Lib_OVMCodec.EVMAccount memory account = Lib_OVMCodec.decodeEVMAccount(\n encodedAccount\n );\n\n address ethContractAddress = _ethContractAddress;\n if (account.codeHash == EMPTY_ACCOUNT_CODE_HASH) {\n // Use a known empty contract to prevent an attack in which a user provides a\n // contract address here and then later deploys code to it.\n ethContractAddress = 0x0000000000000000000000000000000000000000;\n } else {\n // Otherwise, make sure that the code at the provided eth address matches the hash\n // of the code stored on L2.\n require(\n Lib_EthUtils.getCodeHash(ethContractAddress) == account.codeHash,\n \"OVM_StateTransitioner: Provided L1 contract code hash does not match L2 contract code hash.\"\n );\n }\n\n ovmStateManager.putAccount(\n _ovmContractAddress,\n Lib_OVMCodec.Account({\n nonce: account.nonce,\n balance: account.balance,\n storageRoot: account.storageRoot,\n codeHash: account.codeHash,\n ethAddress: ethContractAddress,\n isFresh: false\n })\n );\n } else {\n // Account does not exist, this was an exclusion proof.\n ovmStateManager.putEmptyAccount(_ovmContractAddress);\n }\n }\n\n /**\n * Allows a user to prove the initial state of a contract storage slot.\n * @param _ovmContractAddress Address of the contract on the OVM.\n * @param _key Claimed account slot key.\n * @param _storageTrieWitness Proof of the storage slot.\n */\n function proveStorageSlot(\n address _ovmContractAddress,\n bytes32 _key,\n bytes memory _storageTrieWitness\n )\n override\n public\n onlyDuringPhase(TransitionPhase.PRE_EXECUTION)\n contributesToFraudProof(preStateRoot, transactionHash)\n {\n // Exit quickly to avoid unnecessary work.\n require(\n ovmStateManager.hasContractStorage(_ovmContractAddress, _key) == false,\n \"Storage slot has already been proven.\"\n );\n\n require(\n ovmStateManager.hasAccount(_ovmContractAddress) == true,\n \"Contract must be verified before proving a storage slot.\"\n );\n\n bytes32 storageRoot = ovmStateManager.getAccountStorageRoot(_ovmContractAddress);\n bytes32 value;\n\n if (storageRoot == EMPTY_ACCOUNT_STORAGE_ROOT) {\n // Storage trie was empty, so the user is always allowed to insert zero-byte values.\n value = bytes32(0);\n } else {\n // Function will fail if the proof is not a valid inclusion or exclusion proof.\n (\n bool exists,\n bytes memory encodedValue\n ) = Lib_SecureMerkleTrie.get(\n abi.encodePacked(_key),\n _storageTrieWitness,\n storageRoot\n );\n\n if (exists == true) {\n // Inclusion proof.\n // Stored values are RLP encoded, with leading zeros removed.\n value = Lib_BytesUtils.toBytes32PadLeft(\n Lib_RLPReader.readBytes(encodedValue)\n );\n } else {\n // Exclusion proof, can only be zero bytes.\n value = bytes32(0);\n }\n }\n\n ovmStateManager.putContractStorage(\n _ovmContractAddress,\n _key,\n value\n );\n }\n\n\n /*******************************\n * Public Functions: Execution *\n *******************************/\n\n /**\n * Executes the state transition.\n * @param _transaction OVM transaction to execute.\n */\n function applyTransaction(\n Lib_OVMCodec.Transaction memory _transaction\n )\n override\n public\n onlyDuringPhase(TransitionPhase.PRE_EXECUTION)\n contributesToFraudProof(preStateRoot, transactionHash)\n {\n require(\n Lib_OVMCodec.hashTransaction(_transaction) == transactionHash,\n \"Invalid transaction provided.\"\n );\n\n // We require gas to complete the logic here in run() before/after execution,\n // But must ensure the full _tx.gasLimit can be given to the ovmCALL (determinism)\n // This includes 1/64 of the gas getting lost because of EIP-150 (lost twice--first\n // going into EM, then going into the code contract).\n require(\n gasleft() >= 100000 + _transaction.gasLimit * 1032 / 1000, // 1032/1000 = 1.032 = (64/63)^2 rounded up\n \"Not enough gas to execute transaction deterministically.\"\n );\n\n iOVM_ExecutionManager ovmExecutionManager = iOVM_ExecutionManager(resolve(\"OVM_ExecutionManager\"));\n\n // We call `setExecutionManager` right before `run` (and not earlier) just in case the\n // OVM_ExecutionManager address was updated between the time when this contract was created\n // and when `applyTransaction` was called.\n ovmStateManager.setExecutionManager(address(ovmExecutionManager));\n\n // `run` always succeeds *unless* the user hasn't provided enough gas to `applyTransaction`\n // or an INVALID_STATE_ACCESS flag was triggered. Either way, we won't get beyond this line\n // if that's the case.\n ovmExecutionManager.run(_transaction, address(ovmStateManager));\n\n // Prevent the Execution Manager from calling this SM again.\n ovmStateManager.setExecutionManager(address(0));\n phase = TransitionPhase.POST_EXECUTION;\n }\n\n\n /************************************\n * Public Functions: Post-Execution *\n ************************************/\n\n /**\n * Allows a user to commit the final state of a contract.\n * @param _ovmContractAddress Address of the contract on the OVM.\n * @param _stateTrieWitness Proof of the account state.\n */\n function commitContractState(\n address _ovmContractAddress,\n bytes memory _stateTrieWitness\n )\n override\n public\n onlyDuringPhase(TransitionPhase.POST_EXECUTION)\n contributesToFraudProof(preStateRoot, transactionHash)\n {\n require(\n ovmStateManager.getTotalUncommittedContractStorage() == 0,\n \"All storage must be committed before committing account states.\"\n );\n\n require (\n ovmStateManager.commitAccount(_ovmContractAddress) == true,\n \"Account state wasn't changed or has already been committed.\"\n );\n\n Lib_OVMCodec.Account memory account = ovmStateManager.getAccount(_ovmContractAddress);\n\n postStateRoot = Lib_SecureMerkleTrie.update(\n abi.encodePacked(_ovmContractAddress),\n Lib_OVMCodec.encodeEVMAccount(\n Lib_OVMCodec.toEVMAccount(account)\n ),\n _stateTrieWitness,\n postStateRoot\n );\n\n // Emit an event to help clients figure out the proof ordering.\n emit AccountCommitted(\n _ovmContractAddress\n );\n }\n\n /**\n * Allows a user to commit the final state of a contract storage slot.\n * @param _ovmContractAddress Address of the contract on the OVM.\n * @param _key Claimed account slot key.\n * @param _storageTrieWitness Proof of the storage slot.\n */\n function commitStorageSlot(\n address _ovmContractAddress,\n bytes32 _key,\n bytes memory _storageTrieWitness\n )\n override\n public\n onlyDuringPhase(TransitionPhase.POST_EXECUTION)\n contributesToFraudProof(preStateRoot, transactionHash)\n {\n require(\n ovmStateManager.commitContractStorage(_ovmContractAddress, _key) == true,\n \"Storage slot value wasn't changed or has already been committed.\"\n );\n\n Lib_OVMCodec.Account memory account = ovmStateManager.getAccount(_ovmContractAddress);\n bytes32 value = ovmStateManager.getContractStorage(_ovmContractAddress, _key);\n\n account.storageRoot = Lib_SecureMerkleTrie.update(\n abi.encodePacked(_key),\n Lib_RLPWriter.writeBytes(\n Lib_Bytes32Utils.removeLeadingZeros(value)\n ),\n _storageTrieWitness,\n account.storageRoot\n );\n\n ovmStateManager.putAccount(_ovmContractAddress, account);\n\n // Emit an event to help clients figure out the proof ordering.\n emit ContractStorageCommitted(\n _ovmContractAddress,\n _key\n );\n }\n\n\n /**********************************\n * Public Functions: Finalization *\n **********************************/\n\n /**\n * Finalizes the transition process.\n */\n function completeTransition()\n override\n public\n onlyDuringPhase(TransitionPhase.POST_EXECUTION)\n {\n require(\n ovmStateManager.getTotalUncommittedAccounts() == 0,\n \"All accounts must be committed before completing a transition.\"\n );\n\n require(\n ovmStateManager.getTotalUncommittedContractStorage() == 0,\n \"All storage must be committed before completing a transition.\"\n );\n\n phase = TransitionPhase.COMPLETE;\n }\n}\n" + }, + "contracts/optimistic-ethereum/libraries/utils/Lib_EthUtils.sol": { + "content": "// SPDX-License-Identifier: MIT\n// @unsupported: ovm\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_RLPWriter } from \"../rlp/Lib_RLPWriter.sol\";\nimport { Lib_Bytes32Utils } from \"./Lib_Bytes32Utils.sol\";\n\n/**\n * @title Lib_EthUtils\n */\nlibrary Lib_EthUtils {\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Gets the code for a given address.\n * @param _address Address to get code for.\n * @param _offset Offset to start reading from.\n * @param _length Number of bytes to read.\n * @return Code read from the contract.\n */\n function getCode(\n address _address,\n uint256 _offset,\n uint256 _length\n )\n internal\n view\n returns (\n bytes memory\n )\n {\n bytes memory code;\n assembly {\n code := mload(0x40)\n mstore(0x40, add(code, add(_length, 0x20)))\n mstore(code, _length)\n extcodecopy(_address, add(code, 0x20), _offset, _length)\n }\n\n return code;\n }\n\n /**\n * Gets the full code for a given address.\n * @param _address Address to get code for.\n * @return Full code of the contract.\n */\n function getCode(\n address _address\n )\n internal\n view\n returns (\n bytes memory\n )\n {\n return getCode(\n _address,\n 0,\n getCodeSize(_address)\n );\n }\n\n /**\n * Gets the size of a contract's code in bytes.\n * @param _address Address to get code size for.\n * @return Size of the contract's code in bytes.\n */\n function getCodeSize(\n address _address\n )\n internal\n view\n returns (\n uint256\n )\n {\n uint256 codeSize;\n assembly {\n codeSize := extcodesize(_address)\n }\n\n return codeSize;\n }\n\n /**\n * Gets the hash of a contract's code.\n * @param _address Address to get a code hash for.\n * @return Hash of the contract's code.\n */\n function getCodeHash(\n address _address\n )\n internal\n view\n returns (\n bytes32\n )\n {\n bytes32 codeHash;\n assembly {\n codeHash := extcodehash(_address)\n }\n\n return codeHash;\n }\n\n /**\n * Creates a contract with some given initialization code.\n * @param _code Contract initialization code.\n * @return Address of the created contract.\n */\n function createContract(\n bytes memory _code\n )\n internal\n returns (\n address\n )\n {\n address created;\n assembly {\n created := create(\n 0,\n add(_code, 0x20),\n mload(_code)\n )\n }\n\n return created;\n }\n\n /**\n * Computes the address that would be generated by CREATE.\n * @param _creator Address creating the contract.\n * @param _nonce Creator's nonce.\n * @return Address to be generated by CREATE.\n */\n function getAddressForCREATE(\n address _creator,\n uint256 _nonce\n )\n internal\n pure\n returns (\n address\n )\n {\n bytes[] memory encoded = new bytes[](2);\n encoded[0] = Lib_RLPWriter.writeAddress(_creator);\n encoded[1] = Lib_RLPWriter.writeUint(_nonce);\n\n bytes memory encodedList = Lib_RLPWriter.writeList(encoded);\n return Lib_Bytes32Utils.toAddress(keccak256(encodedList));\n }\n\n /**\n * Computes the address that would be generated by CREATE2.\n * @param _creator Address creating the contract.\n * @param _bytecode Bytecode of the contract to be created.\n * @param _salt 32 byte salt value mixed into the hash.\n * @return Address to be generated by CREATE2.\n */\n function getAddressForCREATE2(\n address _creator,\n bytes memory _bytecode,\n bytes32 _salt\n )\n internal\n pure\n returns (\n address\n )\n {\n bytes32 hashedData = keccak256(abi.encodePacked(\n byte(0xff),\n _creator,\n _salt,\n keccak256(_bytecode)\n ));\n\n return Lib_Bytes32Utils.toAddress(hashedData);\n }\n}\n" + }, + "contracts/optimistic-ethereum/libraries/trie/Lib_SecureMerkleTrie.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_MerkleTrie } from \"./Lib_MerkleTrie.sol\";\n\n/**\n * @title Lib_SecureMerkleTrie\n */\nlibrary Lib_SecureMerkleTrie {\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * @notice Verifies a proof that a given key/value pair is present in the\n * Merkle trie.\n * @param _key Key of the node to search for, as a hex string.\n * @param _value Value of the node to search for, as a hex string.\n * @param _proof Merkle trie inclusion proof for the desired node. Unlike\n * traditional Merkle trees, this proof is executed top-down and consists\n * of a list of RLP-encoded nodes that make a path down to the target node.\n * @param _root Known root of the Merkle trie. Used to verify that the\n * included proof is correctly constructed.\n * @return _verified `true` if the k/v pair exists in the trie, `false` otherwise.\n */\n function verifyInclusionProof(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n )\n internal\n pure\n returns (\n bool _verified\n )\n {\n bytes memory key = _getSecureKey(_key);\n return Lib_MerkleTrie.verifyInclusionProof(key, _value, _proof, _root);\n }\n\n /**\n * @notice Verifies a proof that a given key is *not* present in\n * the Merkle trie.\n * @param _key Key of the node to search for, as a hex string.\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\n * target node.\n * @param _root Known root of the Merkle trie. Used to verify that the\n * included proof is correctly constructed.\n * @return _verified `true` if the key is not present in the trie, `false` otherwise.\n */\n function verifyExclusionProof(\n bytes memory _key,\n bytes memory _proof,\n bytes32 _root\n )\n internal\n pure\n returns (\n bool _verified\n )\n {\n bytes memory key = _getSecureKey(_key);\n return Lib_MerkleTrie.verifyExclusionProof(key, _proof, _root);\n }\n\n /**\n * @notice Updates a Merkle trie and returns a new root hash.\n * @param _key Key of the node to update, as a hex string.\n * @param _value Value of the node to update, as a hex string.\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\n * target node. If the key exists, we can simply update the value.\n * Otherwise, we need to modify the trie to handle the new k/v pair.\n * @param _root Known root of the Merkle trie. Used to verify that the\n * included proof is correctly constructed.\n * @return _updatedRoot Root hash of the newly constructed trie.\n */\n function update(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n )\n internal\n pure\n returns (\n bytes32 _updatedRoot\n )\n {\n bytes memory key = _getSecureKey(_key);\n return Lib_MerkleTrie.update(key, _value, _proof, _root);\n }\n\n /**\n * @notice Retrieves the value associated with a given key.\n * @param _key Key to search for, as hex bytes.\n * @param _proof Merkle trie inclusion proof for the key.\n * @param _root Known root of the Merkle trie.\n * @return _exists Whether or not the key exists.\n * @return _value Value of the key if it exists.\n */\n function get(\n bytes memory _key,\n bytes memory _proof,\n bytes32 _root\n )\n internal\n pure\n returns (\n bool _exists,\n bytes memory _value\n )\n {\n bytes memory key = _getSecureKey(_key);\n return Lib_MerkleTrie.get(key, _proof, _root);\n }\n\n /**\n * Computes the root hash for a trie with a single node.\n * @param _key Key for the single node.\n * @param _value Value for the single node.\n * @return _updatedRoot Hash of the trie.\n */\n function getSingleNodeRootHash(\n bytes memory _key,\n bytes memory _value\n )\n internal\n pure\n returns (\n bytes32 _updatedRoot\n )\n {\n bytes memory key = _getSecureKey(_key);\n return Lib_MerkleTrie.getSingleNodeRootHash(key, _value);\n }\n\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * Computes the secure counterpart to a key.\n * @param _key Key to get a secure key from.\n * @return _secureKey Secure version of the key.\n */\n function _getSecureKey(\n bytes memory _key\n )\n private\n pure\n returns (\n bytes memory _secureKey\n )\n {\n return abi.encodePacked(keccak256(_key));\n }\n}" + }, + "contracts/optimistic-ethereum/iOVM/execution/iOVM_ExecutionManager.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\ninterface iOVM_ExecutionManager {\n /**********\n * Enums *\n *********/\n\n enum RevertFlag {\n OUT_OF_GAS,\n INTENTIONAL_REVERT,\n EXCEEDS_NUISANCE_GAS,\n INVALID_STATE_ACCESS,\n UNSAFE_BYTECODE,\n CREATE_COLLISION,\n STATIC_VIOLATION,\n CREATOR_NOT_ALLOWED\n }\n\n enum GasMetadataKey {\n CURRENT_EPOCH_START_TIMESTAMP,\n CUMULATIVE_SEQUENCER_QUEUE_GAS,\n CUMULATIVE_L1TOL2_QUEUE_GAS,\n PREV_EPOCH_SEQUENCER_QUEUE_GAS,\n PREV_EPOCH_L1TOL2_QUEUE_GAS\n }\n\n /***********\n * Structs *\n ***********/\n\n struct GasMeterConfig {\n uint256 minTransactionGasLimit;\n uint256 maxTransactionGasLimit;\n uint256 maxGasPerQueuePerEpoch;\n uint256 secondsPerEpoch;\n }\n\n struct GlobalContext {\n uint256 ovmCHAINID;\n }\n\n struct TransactionContext {\n Lib_OVMCodec.QueueOrigin ovmL1QUEUEORIGIN;\n uint256 ovmTIMESTAMP;\n uint256 ovmNUMBER;\n uint256 ovmGASLIMIT;\n uint256 ovmTXGASLIMIT;\n address ovmL1TXORIGIN;\n }\n\n struct TransactionRecord {\n uint256 ovmGasRefund;\n }\n\n struct MessageContext {\n address ovmCALLER;\n address ovmADDRESS;\n bool isStatic;\n }\n\n struct MessageRecord {\n uint256 nuisanceGasLeft;\n }\n\n\n /************************************\n * Transaction Execution Entrypoint *\n ************************************/\n\n function run(\n Lib_OVMCodec.Transaction calldata _transaction,\n address _txStateManager\n ) external returns (bytes memory);\n\n\n /*******************\n * Context Opcodes *\n *******************/\n\n function ovmCALLER() external view returns (address _caller);\n function ovmADDRESS() external view returns (address _address);\n function ovmTIMESTAMP() external view returns (uint256 _timestamp);\n function ovmNUMBER() external view returns (uint256 _number);\n function ovmGASLIMIT() external view returns (uint256 _gasLimit);\n function ovmCHAINID() external view returns (uint256 _chainId);\n\n\n /**********************\n * L2 Context Opcodes *\n **********************/\n\n function ovmL1QUEUEORIGIN() external view returns (Lib_OVMCodec.QueueOrigin _queueOrigin);\n function ovmL1TXORIGIN() external view returns (address _l1TxOrigin);\n\n\n /*******************\n * Halting Opcodes *\n *******************/\n\n function ovmREVERT(bytes memory _data) external;\n\n\n /*****************************\n * Contract Creation Opcodes *\n *****************************/\n\n function ovmCREATE(bytes memory _bytecode) external returns (address _contract, bytes memory _revertdata);\n function ovmCREATE2(bytes memory _bytecode, bytes32 _salt) external returns (address _contract, bytes memory _revertdata);\n\n\n /*******************************\n * Account Abstraction Opcodes *\n ******************************/\n\n function ovmGETNONCE() external returns (uint256 _nonce);\n function ovmINCREMENTNONCE() external;\n function ovmCREATEEOA(bytes32 _messageHash, uint8 _v, bytes32 _r, bytes32 _s) external;\n\n\n /****************************\n * Contract Calling Opcodes *\n ****************************/\n\n function ovmCALL(uint256 _gasLimit, address _address, bytes memory _calldata) external returns (bool _success, bytes memory _returndata);\n function ovmSTATICCALL(uint256 _gasLimit, address _address, bytes memory _calldata) external returns (bool _success, bytes memory _returndata);\n function ovmDELEGATECALL(uint256 _gasLimit, address _address, bytes memory _calldata) external returns (bool _success, bytes memory _returndata);\n\n\n /****************************\n * Contract Storage Opcodes *\n ****************************/\n\n function ovmSLOAD(bytes32 _key) external returns (bytes32 _value);\n function ovmSSTORE(bytes32 _key, bytes32 _value) external;\n\n\n /*************************\n * Contract Code Opcodes *\n *************************/\n\n function ovmEXTCODECOPY(address _contract, uint256 _offset, uint256 _length) external returns (bytes memory _code);\n function ovmEXTCODESIZE(address _contract) external returns (uint256 _size);\n function ovmEXTCODEHASH(address _contract) external returns (bytes32 _hash);\n\n\n /***************************************\n * Public Functions: Execution Context *\n ***************************************/\n\n function getMaxTransactionGasLimit() external view returns (uint _maxTransactionGasLimit);\n}\n" + }, + "contracts/optimistic-ethereum/iOVM/execution/iOVM_StateManager.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/**\n * @title iOVM_StateManager\n */\ninterface iOVM_StateManager {\n\n /*******************\n * Data Structures *\n *******************/\n\n enum ItemState {\n ITEM_UNTOUCHED,\n ITEM_LOADED,\n ITEM_CHANGED,\n ITEM_COMMITTED\n }\n\n /***************************\n * Public Functions: Misc *\n ***************************/\n\n function isAuthenticated(address _address) external view returns (bool);\n\n /***************************\n * Public Functions: Setup *\n ***************************/\n\n function owner() external view returns (address _owner);\n function ovmExecutionManager() external view returns (address _ovmExecutionManager);\n function setExecutionManager(address _ovmExecutionManager) external;\n\n\n /************************************\n * Public Functions: Account Access *\n ************************************/\n\n function putAccount(address _address, Lib_OVMCodec.Account memory _account) external;\n function putEmptyAccount(address _address) external;\n function getAccount(address _address) external view returns (Lib_OVMCodec.Account memory _account);\n function hasAccount(address _address) external view returns (bool _exists);\n function hasEmptyAccount(address _address) external view returns (bool _exists);\n function setAccountNonce(address _address, uint256 _nonce) external;\n function getAccountNonce(address _address) external view returns (uint256 _nonce);\n function getAccountEthAddress(address _address) external view returns (address _ethAddress);\n function getAccountStorageRoot(address _address) external view returns (bytes32 _storageRoot);\n function initPendingAccount(address _address) external;\n function commitPendingAccount(address _address, address _ethAddress, bytes32 _codeHash) external;\n function testAndSetAccountLoaded(address _address) external returns (bool _wasAccountAlreadyLoaded);\n function testAndSetAccountChanged(address _address) external returns (bool _wasAccountAlreadyChanged);\n function commitAccount(address _address) external returns (bool _wasAccountCommitted);\n function incrementTotalUncommittedAccounts() external;\n function getTotalUncommittedAccounts() external view returns (uint256 _total);\n function wasAccountChanged(address _address) external view returns (bool);\n function wasAccountCommitted(address _address) external view returns (bool);\n\n\n /************************************\n * Public Functions: Storage Access *\n ************************************/\n\n function putContractStorage(address _contract, bytes32 _key, bytes32 _value) external;\n function getContractStorage(address _contract, bytes32 _key) external view returns (bytes32 _value);\n function hasContractStorage(address _contract, bytes32 _key) external view returns (bool _exists);\n function testAndSetContractStorageLoaded(address _contract, bytes32 _key) external returns (bool _wasContractStorageAlreadyLoaded);\n function testAndSetContractStorageChanged(address _contract, bytes32 _key) external returns (bool _wasContractStorageAlreadyChanged);\n function commitContractStorage(address _contract, bytes32 _key) external returns (bool _wasContractStorageCommitted);\n function incrementTotalUncommittedContractStorage() external;\n function getTotalUncommittedContractStorage() external view returns (uint256 _total);\n function wasContractStorageChanged(address _contract, bytes32 _key) external view returns (bool);\n function wasContractStorageCommitted(address _contract, bytes32 _key) external view returns (bool);\n}\n" + }, + "contracts/optimistic-ethereum/iOVM/execution/iOVM_StateManagerFactory.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Contract Imports */\nimport { iOVM_StateManager } from \"./iOVM_StateManager.sol\";\n\n/**\n * @title iOVM_StateManagerFactory\n */\ninterface iOVM_StateManagerFactory {\n\n /***************************************\n * Public Functions: Contract Creation *\n ***************************************/\n\n function create(\n address _owner\n )\n external\n returns (\n iOVM_StateManager _ovmStateManager\n );\n}\n" + }, + "contracts/optimistic-ethereum/OVM/verification/Abs_FraudContributor.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\nimport { iOVM_BondManager } from \"../../iOVM/verification/iOVM_BondManager.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/// Minimal contract to be inherited by contracts consumed by users that provide\n/// data for fraud proofs\nabstract contract Abs_FraudContributor is Lib_AddressResolver {\n /// Decorate your functions with this modifier to store how much total gas was\n /// consumed by the sender, to reward users fairly\n modifier contributesToFraudProof(bytes32 preStateRoot, bytes32 txHash) {\n uint256 startGas = gasleft();\n _;\n uint256 gasSpent = startGas - gasleft();\n iOVM_BondManager(resolve('OVM_BondManager')).recordGasSpent(preStateRoot, txHash, msg.sender, gasSpent);\n }\n}\n" + }, + "contracts/optimistic-ethereum/libraries/trie/Lib_MerkleTrie.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Library Imports */\nimport { Lib_BytesUtils } from \"../utils/Lib_BytesUtils.sol\";\nimport { Lib_RLPReader } from \"../rlp/Lib_RLPReader.sol\";\nimport { Lib_RLPWriter } from \"../rlp/Lib_RLPWriter.sol\";\n\n/**\n * @title Lib_MerkleTrie\n */\nlibrary Lib_MerkleTrie {\n\n /*******************\n * Data Structures *\n *******************/\n\n enum NodeType {\n BranchNode,\n ExtensionNode,\n LeafNode\n }\n\n struct TrieNode {\n bytes encoded;\n Lib_RLPReader.RLPItem[] decoded;\n }\n\n\n /**********************\n * Contract Constants *\n **********************/\n\n // TREE_RADIX determines the number of elements per branch node.\n uint256 constant TREE_RADIX = 16;\n // Branch nodes have TREE_RADIX elements plus an additional `value` slot.\n uint256 constant BRANCH_NODE_LENGTH = TREE_RADIX + 1;\n // Leaf nodes and extension nodes always have two elements, a `path` and a `value`.\n uint256 constant LEAF_OR_EXTENSION_NODE_LENGTH = 2;\n\n // Prefixes are prepended to the `path` within a leaf or extension node and\n // allow us to differentiate between the two node types. `ODD` or `EVEN` is\n // determined by the number of nibbles within the unprefixed `path`. If the\n // number of nibbles if even, we need to insert an extra padding nibble so\n // the resulting prefixed `path` has an even number of nibbles.\n uint8 constant PREFIX_EXTENSION_EVEN = 0;\n uint8 constant PREFIX_EXTENSION_ODD = 1;\n uint8 constant PREFIX_LEAF_EVEN = 2;\n uint8 constant PREFIX_LEAF_ODD = 3;\n\n // Just a utility constant. RLP represents `NULL` as 0x80.\n bytes1 constant RLP_NULL = bytes1(0x80);\n bytes constant RLP_NULL_BYTES = hex'80';\n bytes32 constant internal KECCAK256_RLP_NULL_BYTES = keccak256(RLP_NULL_BYTES);\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * @notice Verifies a proof that a given key/value pair is present in the\n * Merkle trie.\n * @param _key Key of the node to search for, as a hex string.\n * @param _value Value of the node to search for, as a hex string.\n * @param _proof Merkle trie inclusion proof for the desired node. Unlike\n * traditional Merkle trees, this proof is executed top-down and consists\n * of a list of RLP-encoded nodes that make a path down to the target node.\n * @param _root Known root of the Merkle trie. Used to verify that the\n * included proof is correctly constructed.\n * @return _verified `true` if the k/v pair exists in the trie, `false` otherwise.\n */\n function verifyInclusionProof(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n )\n internal\n pure\n returns (\n bool _verified\n )\n {\n (\n bool exists,\n bytes memory value\n ) = get(_key, _proof, _root);\n\n return (\n exists && Lib_BytesUtils.equal(_value, value)\n );\n }\n\n /**\n * @notice Verifies a proof that a given key is *not* present in\n * the Merkle trie.\n * @param _key Key of the node to search for, as a hex string.\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\n * target node.\n * @param _root Known root of the Merkle trie. Used to verify that the\n * included proof is correctly constructed.\n * @return _verified `true` if the key is absent in the trie, `false` otherwise.\n */\n function verifyExclusionProof(\n bytes memory _key,\n bytes memory _proof,\n bytes32 _root\n )\n internal\n pure\n returns (\n bool _verified\n )\n {\n (\n bool exists,\n ) = get(_key, _proof, _root);\n\n return exists == false;\n }\n\n /**\n * @notice Updates a Merkle trie and returns a new root hash.\n * @param _key Key of the node to update, as a hex string.\n * @param _value Value of the node to update, as a hex string.\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\n * target node. If the key exists, we can simply update the value.\n * Otherwise, we need to modify the trie to handle the new k/v pair.\n * @param _root Known root of the Merkle trie. Used to verify that the\n * included proof is correctly constructed.\n * @return _updatedRoot Root hash of the newly constructed trie.\n */\n function update(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n )\n internal\n pure\n returns (\n bytes32 _updatedRoot\n )\n {\n // Special case when inserting the very first node.\n if (_root == KECCAK256_RLP_NULL_BYTES) {\n return getSingleNodeRootHash(_key, _value);\n }\n\n TrieNode[] memory proof = _parseProof(_proof);\n (uint256 pathLength, bytes memory keyRemainder, ) = _walkNodePath(proof, _key, _root);\n TrieNode[] memory newPath = _getNewPath(proof, pathLength, keyRemainder, _value);\n\n return _getUpdatedTrieRoot(newPath, _key);\n }\n\n /**\n * @notice Retrieves the value associated with a given key.\n * @param _key Key to search for, as hex bytes.\n * @param _proof Merkle trie inclusion proof for the key.\n * @param _root Known root of the Merkle trie.\n * @return _exists Whether or not the key exists.\n * @return _value Value of the key if it exists.\n */\n function get(\n bytes memory _key,\n bytes memory _proof,\n bytes32 _root\n )\n internal\n pure\n returns (\n bool _exists,\n bytes memory _value\n )\n {\n TrieNode[] memory proof = _parseProof(_proof);\n (uint256 pathLength, bytes memory keyRemainder, bool isFinalNode) = _walkNodePath(proof, _key, _root);\n\n bool exists = keyRemainder.length == 0;\n\n require(\n exists || isFinalNode,\n \"Provided proof is invalid.\"\n );\n\n bytes memory value = exists ? _getNodeValue(proof[pathLength - 1]) : bytes('');\n\n return (\n exists,\n value\n );\n }\n\n /**\n * Computes the root hash for a trie with a single node.\n * @param _key Key for the single node.\n * @param _value Value for the single node.\n * @return _updatedRoot Hash of the trie.\n */\n function getSingleNodeRootHash(\n bytes memory _key,\n bytes memory _value\n )\n internal\n pure\n returns (\n bytes32 _updatedRoot\n )\n {\n return keccak256(_makeLeafNode(\n Lib_BytesUtils.toNibbles(_key),\n _value\n ).encoded);\n }\n\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * @notice Walks through a proof using a provided key.\n * @param _proof Inclusion proof to walk through.\n * @param _key Key to use for the walk.\n * @param _root Known root of the trie.\n * @return _pathLength Length of the final path\n * @return _keyRemainder Portion of the key remaining after the walk.\n * @return _isFinalNode Whether or not we've hit a dead end.\n */\n function _walkNodePath(\n TrieNode[] memory _proof,\n bytes memory _key,\n bytes32 _root\n )\n private\n pure\n returns (\n uint256 _pathLength,\n bytes memory _keyRemainder,\n bool _isFinalNode\n )\n {\n uint256 pathLength = 0;\n bytes memory key = Lib_BytesUtils.toNibbles(_key);\n\n bytes32 currentNodeID = _root;\n uint256 currentKeyIndex = 0;\n uint256 currentKeyIncrement = 0;\n TrieNode memory currentNode;\n\n // Proof is top-down, so we start at the first element (root).\n for (uint256 i = 0; i < _proof.length; i++) {\n currentNode = _proof[i];\n currentKeyIndex += currentKeyIncrement;\n\n // Keep track of the proof elements we actually need.\n // It's expensive to resize arrays, so this simply reduces gas costs.\n pathLength += 1;\n\n if (currentKeyIndex == 0) {\n // First proof element is always the root node.\n require(\n keccak256(currentNode.encoded) == currentNodeID,\n \"Invalid root hash\"\n );\n } else if (currentNode.encoded.length >= 32) {\n // Nodes 32 bytes or larger are hashed inside branch nodes.\n require(\n keccak256(currentNode.encoded) == currentNodeID,\n \"Invalid large internal hash\"\n );\n } else {\n // Nodes smaller than 31 bytes aren't hashed.\n require(\n Lib_BytesUtils.toBytes32(currentNode.encoded) == currentNodeID,\n \"Invalid internal node hash\"\n );\n }\n\n if (currentNode.decoded.length == BRANCH_NODE_LENGTH) {\n if (currentKeyIndex == key.length) {\n // We've hit the end of the key, meaning the value should be within this branch node.\n break;\n } else {\n // We're not at the end of the key yet.\n // Figure out what the next node ID should be and continue.\n uint8 branchKey = uint8(key[currentKeyIndex]);\n Lib_RLPReader.RLPItem memory nextNode = currentNode.decoded[branchKey];\n currentNodeID = _getNodeID(nextNode);\n currentKeyIncrement = 1;\n continue;\n }\n } else if (currentNode.decoded.length == LEAF_OR_EXTENSION_NODE_LENGTH) {\n bytes memory path = _getNodePath(currentNode);\n uint8 prefix = uint8(path[0]);\n uint8 offset = 2 - prefix % 2;\n bytes memory pathRemainder = Lib_BytesUtils.slice(path, offset);\n bytes memory keyRemainder = Lib_BytesUtils.slice(key, currentKeyIndex);\n uint256 sharedNibbleLength = _getSharedNibbleLength(pathRemainder, keyRemainder);\n\n if (prefix == PREFIX_LEAF_EVEN || prefix == PREFIX_LEAF_ODD) {\n if (\n pathRemainder.length == sharedNibbleLength &&\n keyRemainder.length == sharedNibbleLength\n ) {\n // The key within this leaf matches our key exactly.\n // Increment the key index to reflect that we have no remainder.\n currentKeyIndex += sharedNibbleLength;\n }\n\n // We've hit a leaf node, so our next node should be NULL.\n currentNodeID = bytes32(RLP_NULL);\n break;\n } else if (prefix == PREFIX_EXTENSION_EVEN || prefix == PREFIX_EXTENSION_ODD) {\n if (sharedNibbleLength == 0) {\n // Our extension node doesn't share any part of our key.\n // We've hit the end of this path, updates will need to modify this extension.\n currentNodeID = bytes32(RLP_NULL);\n break;\n } else {\n // Our extension shares some nibbles.\n // Carry on to the next node.\n currentNodeID = _getNodeID(currentNode.decoded[1]);\n currentKeyIncrement = sharedNibbleLength;\n continue;\n }\n } else {\n revert(\"Received a node with an unknown prefix\");\n }\n } else {\n revert(\"Received an unparseable node.\");\n }\n }\n\n // If our node ID is NULL, then we're at a dead end.\n bool isFinalNode = currentNodeID == bytes32(RLP_NULL);\n return (pathLength, Lib_BytesUtils.slice(key, currentKeyIndex), isFinalNode);\n }\n\n /**\n * @notice Creates new nodes to support a k/v pair insertion into a given\n * Merkle trie path.\n * @param _path Path to the node nearest the k/v pair.\n * @param _pathLength Length of the path. Necessary because the provided\n * path may include additional nodes (e.g., it comes directly from a proof)\n * and we can't resize in-memory arrays without costly duplication.\n * @param _keyRemainder Portion of the initial key that must be inserted\n * into the trie.\n * @param _value Value to insert at the given key.\n * @return _newPath A new path with the inserted k/v pair and extra supporting nodes.\n */\n function _getNewPath(\n TrieNode[] memory _path,\n uint256 _pathLength,\n bytes memory _keyRemainder,\n bytes memory _value\n )\n private\n pure\n returns (\n TrieNode[] memory _newPath\n )\n {\n bytes memory keyRemainder = _keyRemainder;\n\n // Most of our logic depends on the status of the last node in the path.\n TrieNode memory lastNode = _path[_pathLength - 1];\n NodeType lastNodeType = _getNodeType(lastNode);\n\n // Create an array for newly created nodes.\n // We need up to three new nodes, depending on the contents of the last node.\n // Since array resizing is expensive, we'll keep track of the size manually.\n // We're using an explicit `totalNewNodes += 1` after insertions for clarity.\n TrieNode[] memory newNodes = new TrieNode[](3);\n uint256 totalNewNodes = 0;\n\n if (keyRemainder.length == 0 && lastNodeType == NodeType.LeafNode) {\n // We've found a leaf node with the given key.\n // Simply need to update the value of the node to match.\n newNodes[totalNewNodes] = _makeLeafNode(_getNodeKey(lastNode), _value);\n totalNewNodes += 1;\n } else if (lastNodeType == NodeType.BranchNode) {\n if (keyRemainder.length == 0) {\n // We've found a branch node with the given key.\n // Simply need to update the value of the node to match.\n newNodes[totalNewNodes] = _editBranchValue(lastNode, _value);\n totalNewNodes += 1;\n } else {\n // We've found a branch node, but it doesn't contain our key.\n // Reinsert the old branch for now.\n newNodes[totalNewNodes] = lastNode;\n totalNewNodes += 1;\n // Create a new leaf node, slicing our remainder since the first byte points\n // to our branch node.\n newNodes[totalNewNodes] = _makeLeafNode(Lib_BytesUtils.slice(keyRemainder, 1), _value);\n totalNewNodes += 1;\n }\n } else {\n // Our last node is either an extension node or a leaf node with a different key.\n bytes memory lastNodeKey = _getNodeKey(lastNode);\n uint256 sharedNibbleLength = _getSharedNibbleLength(lastNodeKey, keyRemainder);\n\n if (sharedNibbleLength != 0) {\n // We've got some shared nibbles between the last node and our key remainder.\n // We'll need to insert an extension node that covers these shared nibbles.\n bytes memory nextNodeKey = Lib_BytesUtils.slice(lastNodeKey, 0, sharedNibbleLength);\n newNodes[totalNewNodes] = _makeExtensionNode(nextNodeKey, _getNodeHash(_value));\n totalNewNodes += 1;\n\n // Cut down the keys since we've just covered these shared nibbles.\n lastNodeKey = Lib_BytesUtils.slice(lastNodeKey, sharedNibbleLength);\n keyRemainder = Lib_BytesUtils.slice(keyRemainder, sharedNibbleLength);\n }\n\n // Create an empty branch to fill in.\n TrieNode memory newBranch = _makeEmptyBranchNode();\n\n if (lastNodeKey.length == 0) {\n // Key remainder was larger than the key for our last node.\n // The value within our last node is therefore going to be shifted into\n // a branch value slot.\n newBranch = _editBranchValue(newBranch, _getNodeValue(lastNode));\n } else {\n // Last node key was larger than the key remainder.\n // We're going to modify some index of our branch.\n uint8 branchKey = uint8(lastNodeKey[0]);\n // Move on to the next nibble.\n lastNodeKey = Lib_BytesUtils.slice(lastNodeKey, 1);\n\n if (lastNodeType == NodeType.LeafNode) {\n // We're dealing with a leaf node.\n // We'll modify the key and insert the old leaf node into the branch index.\n TrieNode memory modifiedLastNode = _makeLeafNode(lastNodeKey, _getNodeValue(lastNode));\n newBranch = _editBranchIndex(newBranch, branchKey, _getNodeHash(modifiedLastNode.encoded));\n } else if (lastNodeKey.length != 0) {\n // We're dealing with a shrinking extension node.\n // We need to modify the node to decrease the size of the key.\n TrieNode memory modifiedLastNode = _makeExtensionNode(lastNodeKey, _getNodeValue(lastNode));\n newBranch = _editBranchIndex(newBranch, branchKey, _getNodeHash(modifiedLastNode.encoded));\n } else {\n // We're dealing with an unnecessary extension node.\n // We're going to delete the node entirely.\n // Simply insert its current value into the branch index.\n newBranch = _editBranchIndex(newBranch, branchKey, _getNodeValue(lastNode));\n }\n }\n\n if (keyRemainder.length == 0) {\n // We've got nothing left in the key remainder.\n // Simply insert the value into the branch value slot.\n newBranch = _editBranchValue(newBranch, _value);\n // Push the branch into the list of new nodes.\n newNodes[totalNewNodes] = newBranch;\n totalNewNodes += 1;\n } else {\n // We've got some key remainder to work with.\n // We'll be inserting a leaf node into the trie.\n // First, move on to the next nibble.\n keyRemainder = Lib_BytesUtils.slice(keyRemainder, 1);\n // Push the branch into the list of new nodes.\n newNodes[totalNewNodes] = newBranch;\n totalNewNodes += 1;\n // Push a new leaf node for our k/v pair.\n newNodes[totalNewNodes] = _makeLeafNode(keyRemainder, _value);\n totalNewNodes += 1;\n }\n }\n\n // Finally, join the old path with our newly created nodes.\n // Since we're overwriting the last node in the path, we use `_pathLength - 1`.\n return _joinNodeArrays(_path, _pathLength - 1, newNodes, totalNewNodes);\n }\n\n /**\n * @notice Computes the trie root from a given path.\n * @param _nodes Path to some k/v pair.\n * @param _key Key for the k/v pair.\n * @return _updatedRoot Root hash for the updated trie.\n */\n function _getUpdatedTrieRoot(\n TrieNode[] memory _nodes,\n bytes memory _key\n )\n private\n pure\n returns (\n bytes32 _updatedRoot\n )\n {\n bytes memory key = Lib_BytesUtils.toNibbles(_key);\n\n // Some variables to keep track of during iteration.\n TrieNode memory currentNode;\n NodeType currentNodeType;\n bytes memory previousNodeHash;\n\n // Run through the path backwards to rebuild our root hash.\n for (uint256 i = _nodes.length; i > 0; i--) {\n // Pick out the current node.\n currentNode = _nodes[i - 1];\n currentNodeType = _getNodeType(currentNode);\n\n if (currentNodeType == NodeType.LeafNode) {\n // Leaf nodes are already correctly encoded.\n // Shift the key over to account for the nodes key.\n bytes memory nodeKey = _getNodeKey(currentNode);\n key = Lib_BytesUtils.slice(key, 0, key.length - nodeKey.length);\n } else if (currentNodeType == NodeType.ExtensionNode) {\n // Shift the key over to account for the nodes key.\n bytes memory nodeKey = _getNodeKey(currentNode);\n key = Lib_BytesUtils.slice(key, 0, key.length - nodeKey.length);\n\n // If this node is the last element in the path, it'll be correctly encoded\n // and we can skip this part.\n if (previousNodeHash.length > 0) {\n // Re-encode the node based on the previous node.\n currentNode = _makeExtensionNode(nodeKey, previousNodeHash);\n }\n } else if (currentNodeType == NodeType.BranchNode) {\n // If this node is the last element in the path, it'll be correctly encoded\n // and we can skip this part.\n if (previousNodeHash.length > 0) {\n // Re-encode the node based on the previous node.\n uint8 branchKey = uint8(key[key.length - 1]);\n key = Lib_BytesUtils.slice(key, 0, key.length - 1);\n currentNode = _editBranchIndex(currentNode, branchKey, previousNodeHash);\n }\n }\n\n // Compute the node hash for the next iteration.\n previousNodeHash = _getNodeHash(currentNode.encoded);\n }\n\n // Current node should be the root at this point.\n // Simply return the hash of its encoding.\n return keccak256(currentNode.encoded);\n }\n\n /**\n * @notice Parses an RLP-encoded proof into something more useful.\n * @param _proof RLP-encoded proof to parse.\n * @return _parsed Proof parsed into easily accessible structs.\n */\n function _parseProof(\n bytes memory _proof\n )\n private\n pure\n returns (\n TrieNode[] memory _parsed\n )\n {\n Lib_RLPReader.RLPItem[] memory nodes = Lib_RLPReader.readList(_proof);\n TrieNode[] memory proof = new TrieNode[](nodes.length);\n\n for (uint256 i = 0; i < nodes.length; i++) {\n bytes memory encoded = Lib_RLPReader.readBytes(nodes[i]);\n proof[i] = TrieNode({\n encoded: encoded,\n decoded: Lib_RLPReader.readList(encoded)\n });\n }\n\n return proof;\n }\n\n /**\n * @notice Picks out the ID for a node. Node ID is referred to as the\n * \"hash\" within the specification, but nodes < 32 bytes are not actually\n * hashed.\n * @param _node Node to pull an ID for.\n * @return _nodeID ID for the node, depending on the size of its contents.\n */\n function _getNodeID(\n Lib_RLPReader.RLPItem memory _node\n )\n private\n pure\n returns (\n bytes32 _nodeID\n )\n {\n bytes memory nodeID;\n\n if (_node.length < 32) {\n // Nodes smaller than 32 bytes are RLP encoded.\n nodeID = Lib_RLPReader.readRawBytes(_node);\n } else {\n // Nodes 32 bytes or larger are hashed.\n nodeID = Lib_RLPReader.readBytes(_node);\n }\n\n return Lib_BytesUtils.toBytes32(nodeID);\n }\n\n /**\n * @notice Gets the path for a leaf or extension node.\n * @param _node Node to get a path for.\n * @return _path Node path, converted to an array of nibbles.\n */\n function _getNodePath(\n TrieNode memory _node\n )\n private\n pure\n returns (\n bytes memory _path\n )\n {\n return Lib_BytesUtils.toNibbles(Lib_RLPReader.readBytes(_node.decoded[0]));\n }\n\n /**\n * @notice Gets the key for a leaf or extension node. Keys are essentially\n * just paths without any prefix.\n * @param _node Node to get a key for.\n * @return _key Node key, converted to an array of nibbles.\n */\n function _getNodeKey(\n TrieNode memory _node\n )\n private\n pure\n returns (\n bytes memory _key\n )\n {\n return _removeHexPrefix(_getNodePath(_node));\n }\n\n /**\n * @notice Gets the path for a node.\n * @param _node Node to get a value for.\n * @return _value Node value, as hex bytes.\n */\n function _getNodeValue(\n TrieNode memory _node\n )\n private\n pure\n returns (\n bytes memory _value\n )\n {\n return Lib_RLPReader.readBytes(_node.decoded[_node.decoded.length - 1]);\n }\n\n /**\n * @notice Computes the node hash for an encoded node. Nodes < 32 bytes\n * are not hashed, all others are keccak256 hashed.\n * @param _encoded Encoded node to hash.\n * @return _hash Hash of the encoded node. Simply the input if < 32 bytes.\n */\n function _getNodeHash(\n bytes memory _encoded\n )\n private\n pure\n returns (\n bytes memory _hash\n )\n {\n if (_encoded.length < 32) {\n return _encoded;\n } else {\n return abi.encodePacked(keccak256(_encoded));\n }\n }\n\n /**\n * @notice Determines the type for a given node.\n * @param _node Node to determine a type for.\n * @return _type Type of the node; BranchNode/ExtensionNode/LeafNode.\n */\n function _getNodeType(\n TrieNode memory _node\n )\n private\n pure\n returns (\n NodeType _type\n )\n {\n if (_node.decoded.length == BRANCH_NODE_LENGTH) {\n return NodeType.BranchNode;\n } else if (_node.decoded.length == LEAF_OR_EXTENSION_NODE_LENGTH) {\n bytes memory path = _getNodePath(_node);\n uint8 prefix = uint8(path[0]);\n\n if (prefix == PREFIX_LEAF_EVEN || prefix == PREFIX_LEAF_ODD) {\n return NodeType.LeafNode;\n } else if (prefix == PREFIX_EXTENSION_EVEN || prefix == PREFIX_EXTENSION_ODD) {\n return NodeType.ExtensionNode;\n }\n }\n\n revert(\"Invalid node type\");\n }\n\n /**\n * @notice Utility; determines the number of nibbles shared between two\n * nibble arrays.\n * @param _a First nibble array.\n * @param _b Second nibble array.\n * @return _shared Number of shared nibbles.\n */\n function _getSharedNibbleLength(\n bytes memory _a,\n bytes memory _b\n )\n private\n pure\n returns (\n uint256 _shared\n )\n {\n uint256 i = 0;\n while (_a.length > i && _b.length > i && _a[i] == _b[i]) {\n i++;\n }\n return i;\n }\n\n /**\n * @notice Utility; converts an RLP-encoded node into our nice struct.\n * @param _raw RLP-encoded node to convert.\n * @return _node Node as a TrieNode struct.\n */\n function _makeNode(\n bytes[] memory _raw\n )\n private\n pure\n returns (\n TrieNode memory _node\n )\n {\n bytes memory encoded = Lib_RLPWriter.writeList(_raw);\n\n return TrieNode({\n encoded: encoded,\n decoded: Lib_RLPReader.readList(encoded)\n });\n }\n\n /**\n * @notice Utility; converts an RLP-decoded node into our nice struct.\n * @param _items RLP-decoded node to convert.\n * @return _node Node as a TrieNode struct.\n */\n function _makeNode(\n Lib_RLPReader.RLPItem[] memory _items\n )\n private\n pure\n returns (\n TrieNode memory _node\n )\n {\n bytes[] memory raw = new bytes[](_items.length);\n for (uint256 i = 0; i < _items.length; i++) {\n raw[i] = Lib_RLPReader.readRawBytes(_items[i]);\n }\n return _makeNode(raw);\n }\n\n /**\n * @notice Creates a new extension node.\n * @param _key Key for the extension node, unprefixed.\n * @param _value Value for the extension node.\n * @return _node New extension node with the given k/v pair.\n */\n function _makeExtensionNode(\n bytes memory _key,\n bytes memory _value\n )\n private\n pure\n returns (\n TrieNode memory _node\n )\n {\n bytes[] memory raw = new bytes[](2);\n bytes memory key = _addHexPrefix(_key, false);\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\n raw[1] = Lib_RLPWriter.writeBytes(_value);\n return _makeNode(raw);\n }\n\n /**\n * @notice Creates a new leaf node.\n * @dev This function is essentially identical to `_makeExtensionNode`.\n * Although we could route both to a single method with a flag, it's\n * more gas efficient to keep them separate and duplicate the logic.\n * @param _key Key for the leaf node, unprefixed.\n * @param _value Value for the leaf node.\n * @return _node New leaf node with the given k/v pair.\n */\n function _makeLeafNode(\n bytes memory _key,\n bytes memory _value\n )\n private\n pure\n returns (\n TrieNode memory _node\n )\n {\n bytes[] memory raw = new bytes[](2);\n bytes memory key = _addHexPrefix(_key, true);\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\n raw[1] = Lib_RLPWriter.writeBytes(_value);\n return _makeNode(raw);\n }\n\n /**\n * @notice Creates an empty branch node.\n * @return _node Empty branch node as a TrieNode struct.\n */\n function _makeEmptyBranchNode()\n private\n pure\n returns (\n TrieNode memory _node\n )\n {\n bytes[] memory raw = new bytes[](BRANCH_NODE_LENGTH);\n for (uint256 i = 0; i < raw.length; i++) {\n raw[i] = RLP_NULL_BYTES;\n }\n return _makeNode(raw);\n }\n\n /**\n * @notice Modifies the value slot for a given branch.\n * @param _branch Branch node to modify.\n * @param _value Value to insert into the branch.\n * @return _updatedNode Modified branch node.\n */\n function _editBranchValue(\n TrieNode memory _branch,\n bytes memory _value\n )\n private\n pure\n returns (\n TrieNode memory _updatedNode\n )\n {\n bytes memory encoded = Lib_RLPWriter.writeBytes(_value);\n _branch.decoded[_branch.decoded.length - 1] = Lib_RLPReader.toRLPItem(encoded);\n return _makeNode(_branch.decoded);\n }\n\n /**\n * @notice Modifies a slot at an index for a given branch.\n * @param _branch Branch node to modify.\n * @param _index Slot index to modify.\n * @param _value Value to insert into the slot.\n * @return _updatedNode Modified branch node.\n */\n function _editBranchIndex(\n TrieNode memory _branch,\n uint8 _index,\n bytes memory _value\n )\n private\n pure\n returns (\n TrieNode memory _updatedNode\n )\n {\n bytes memory encoded = _value.length < 32 ? _value : Lib_RLPWriter.writeBytes(_value);\n _branch.decoded[_index] = Lib_RLPReader.toRLPItem(encoded);\n return _makeNode(_branch.decoded);\n }\n\n /**\n * @notice Utility; adds a prefix to a key.\n * @param _key Key to prefix.\n * @param _isLeaf Whether or not the key belongs to a leaf.\n * @return _prefixedKey Prefixed key.\n */\n function _addHexPrefix(\n bytes memory _key,\n bool _isLeaf\n )\n private\n pure\n returns (\n bytes memory _prefixedKey\n )\n {\n uint8 prefix = _isLeaf ? uint8(0x02) : uint8(0x00);\n uint8 offset = uint8(_key.length % 2);\n bytes memory prefixed = new bytes(2 - offset);\n prefixed[0] = bytes1(prefix + offset);\n return abi.encodePacked(prefixed, _key);\n }\n\n /**\n * @notice Utility; removes a prefix from a path.\n * @param _path Path to remove the prefix from.\n * @return _unprefixedKey Unprefixed key.\n */\n function _removeHexPrefix(\n bytes memory _path\n )\n private\n pure\n returns (\n bytes memory _unprefixedKey\n )\n {\n if (uint8(_path[0]) % 2 == 0) {\n return Lib_BytesUtils.slice(_path, 2);\n } else {\n return Lib_BytesUtils.slice(_path, 1);\n }\n }\n\n /**\n * @notice Utility; combines two node arrays. Array lengths are required\n * because the actual lengths may be longer than the filled lengths.\n * Array resizing is extremely costly and should be avoided.\n * @param _a First array to join.\n * @param _aLength Length of the first array.\n * @param _b Second array to join.\n * @param _bLength Length of the second array.\n * @return _joined Combined node array.\n */\n function _joinNodeArrays(\n TrieNode[] memory _a,\n uint256 _aLength,\n TrieNode[] memory _b,\n uint256 _bLength\n )\n private\n pure\n returns (\n TrieNode[] memory _joined\n )\n {\n TrieNode[] memory ret = new TrieNode[](_aLength + _bLength);\n\n // Copy elements from the first array.\n for (uint256 i = 0; i < _aLength; i++) {\n ret[i] = _a[i];\n }\n\n // Copy elements from the second array.\n for (uint256 i = 0; i < _bLength; i++) {\n ret[i + _aLength] = _b[i];\n }\n\n return ret;\n }\n}\n" + }, + "contracts/optimistic-ethereum/OVM/verification/OVM_FraudVerifier.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/* Interface Imports */\nimport { iOVM_FraudVerifier } from \"../../iOVM/verification/iOVM_FraudVerifier.sol\";\nimport { iOVM_StateTransitioner } from \"../../iOVM/verification/iOVM_StateTransitioner.sol\";\nimport { iOVM_StateTransitionerFactory } from \"../../iOVM/verification/iOVM_StateTransitionerFactory.sol\";\nimport { iOVM_BondManager } from \"../../iOVM/verification/iOVM_BondManager.sol\";\nimport { iOVM_StateCommitmentChain } from \"../../iOVM/chain/iOVM_StateCommitmentChain.sol\";\nimport { iOVM_CanonicalTransactionChain } from \"../../iOVM/chain/iOVM_CanonicalTransactionChain.sol\";\n\n/* Contract Imports */\nimport { Abs_FraudContributor } from \"./Abs_FraudContributor.sol\";\n\n\n\n/**\n * @title OVM_FraudVerifier\n * @dev The Fraud Verifier contract coordinates the entire fraud proof verification process.\n * If the fraud proof was successful it prunes any state batches from State Commitment Chain\n * which were published after the fraudulent state root.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract OVM_FraudVerifier is Lib_AddressResolver, Abs_FraudContributor, iOVM_FraudVerifier {\n\n /*******************************************\n * Contract Variables: Internal Accounting *\n *******************************************/\n\n mapping (bytes32 => iOVM_StateTransitioner) internal transitioners;\n\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n constructor(\n address _libAddressManager\n )\n Lib_AddressResolver(_libAddressManager)\n {}\n\n\n /***************************************\n * Public Functions: Transition Status *\n ***************************************/\n\n /**\n * Retrieves the state transitioner for a given root.\n * @param _preStateRoot State root to query a transitioner for.\n * @return _transitioner Corresponding state transitioner contract.\n */\n function getStateTransitioner(\n bytes32 _preStateRoot,\n bytes32 _txHash\n )\n override\n public\n view\n returns (\n iOVM_StateTransitioner _transitioner\n )\n {\n return transitioners[keccak256(abi.encodePacked(_preStateRoot, _txHash))];\n }\n\n\n /****************************************\n * Public Functions: Fraud Verification *\n ****************************************/\n\n /**\n * Begins the fraud verification process.\n * @param _preStateRoot State root before the fraudulent transaction.\n * @param _preStateRootBatchHeader Batch header for the provided pre-state root.\n * @param _preStateRootProof Inclusion proof for the provided pre-state root.\n * @param _transaction OVM transaction claimed to be fraudulent.\n * @param _txChainElement OVM transaction chain element.\n * @param _transactionBatchHeader Batch header for the provided transaction.\n * @param _transactionProof Inclusion proof for the provided transaction.\n */\n function initializeFraudVerification(\n bytes32 _preStateRoot,\n Lib_OVMCodec.ChainBatchHeader memory _preStateRootBatchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _preStateRootProof,\n Lib_OVMCodec.Transaction memory _transaction,\n Lib_OVMCodec.TransactionChainElement memory _txChainElement,\n Lib_OVMCodec.ChainBatchHeader memory _transactionBatchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _transactionProof\n )\n override\n public\n contributesToFraudProof(_preStateRoot, Lib_OVMCodec.hashTransaction(_transaction))\n {\n bytes32 _txHash = Lib_OVMCodec.hashTransaction(_transaction);\n\n if (_hasStateTransitioner(_preStateRoot, _txHash)) {\n return;\n }\n\n iOVM_StateCommitmentChain ovmStateCommitmentChain = iOVM_StateCommitmentChain(resolve(\"OVM_StateCommitmentChain\"));\n iOVM_CanonicalTransactionChain ovmCanonicalTransactionChain = iOVM_CanonicalTransactionChain(resolve(\"OVM_CanonicalTransactionChain\"));\n\n require(\n ovmStateCommitmentChain.verifyStateCommitment(\n _preStateRoot,\n _preStateRootBatchHeader,\n _preStateRootProof\n ),\n \"Invalid pre-state root inclusion proof.\"\n );\n\n require(\n ovmCanonicalTransactionChain.verifyTransaction(\n _transaction,\n _txChainElement,\n _transactionBatchHeader,\n _transactionProof\n ),\n \"Invalid transaction inclusion proof.\"\n );\n\n require (\n _preStateRootBatchHeader.prevTotalElements + _preStateRootProof.index + 1 == _transactionBatchHeader.prevTotalElements + _transactionProof.index,\n \"Pre-state root global index must equal to the transaction root global index.\"\n );\n\n _deployTransitioner(_preStateRoot, _txHash, _preStateRootProof.index);\n\n emit FraudProofInitialized(\n _preStateRoot,\n _preStateRootProof.index,\n _txHash,\n msg.sender\n );\n }\n\n /**\n * Finalizes the fraud verification process.\n * @param _preStateRoot State root before the fraudulent transaction.\n * @param _preStateRootBatchHeader Batch header for the provided pre-state root.\n * @param _preStateRootProof Inclusion proof for the provided pre-state root.\n * @param _txHash The transaction for the state root\n * @param _postStateRoot State root after the fraudulent transaction.\n * @param _postStateRootBatchHeader Batch header for the provided post-state root.\n * @param _postStateRootProof Inclusion proof for the provided post-state root.\n */\n function finalizeFraudVerification(\n bytes32 _preStateRoot,\n Lib_OVMCodec.ChainBatchHeader memory _preStateRootBatchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _preStateRootProof,\n bytes32 _txHash,\n bytes32 _postStateRoot,\n Lib_OVMCodec.ChainBatchHeader memory _postStateRootBatchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _postStateRootProof\n )\n override\n public\n contributesToFraudProof(_preStateRoot, _txHash)\n {\n iOVM_StateTransitioner transitioner = getStateTransitioner(_preStateRoot, _txHash);\n iOVM_StateCommitmentChain ovmStateCommitmentChain = iOVM_StateCommitmentChain(resolve(\"OVM_StateCommitmentChain\"));\n\n require(\n transitioner.isComplete() == true,\n \"State transition process must be completed prior to finalization.\"\n );\n\n require (\n _postStateRootBatchHeader.prevTotalElements + _postStateRootProof.index == _preStateRootBatchHeader.prevTotalElements + _preStateRootProof.index + 1,\n \"Post-state root global index must equal to the pre state root global index plus one.\"\n );\n\n require(\n ovmStateCommitmentChain.verifyStateCommitment(\n _preStateRoot,\n _preStateRootBatchHeader,\n _preStateRootProof\n ),\n \"Invalid pre-state root inclusion proof.\"\n );\n\n require(\n ovmStateCommitmentChain.verifyStateCommitment(\n _postStateRoot,\n _postStateRootBatchHeader,\n _postStateRootProof\n ),\n \"Invalid post-state root inclusion proof.\"\n );\n\n // If the post state root did not match, then there was fraud and we should delete the batch\n require(\n _postStateRoot != transitioner.getPostStateRoot(),\n \"State transition has not been proven fraudulent.\"\n );\n\n _cancelStateTransition(_postStateRootBatchHeader, _preStateRoot);\n\n // TEMPORARY: Remove the transitioner; for minnet.\n transitioners[keccak256(abi.encodePacked(_preStateRoot, _txHash))] = iOVM_StateTransitioner(0x0000000000000000000000000000000000000000);\n\n emit FraudProofFinalized(\n _preStateRoot,\n _preStateRootProof.index,\n _txHash,\n msg.sender\n );\n }\n\n\n /************************************\n * Internal Functions: Verification *\n ************************************/\n\n /**\n * Checks whether a transitioner already exists for a given pre-state root.\n * @param _preStateRoot Pre-state root to check.\n * @return _exists Whether or not we already have a transitioner for the root.\n */\n function _hasStateTransitioner(\n bytes32 _preStateRoot,\n bytes32 _txHash\n )\n internal\n view\n returns (\n bool _exists\n )\n {\n return address(getStateTransitioner(_preStateRoot, _txHash)) != address(0);\n }\n\n /**\n * Deploys a new state transitioner.\n * @param _preStateRoot Pre-state root to initialize the transitioner with.\n * @param _txHash Hash of the transaction this transitioner will execute.\n * @param _stateTransitionIndex Index of the transaction in the chain.\n */\n function _deployTransitioner(\n bytes32 _preStateRoot,\n bytes32 _txHash,\n uint256 _stateTransitionIndex\n )\n internal\n {\n transitioners[keccak256(abi.encodePacked(_preStateRoot, _txHash))] = iOVM_StateTransitionerFactory(\n resolve(\"OVM_StateTransitionerFactory\")\n ).create(\n address(libAddressManager),\n _stateTransitionIndex,\n _preStateRoot,\n _txHash\n );\n }\n\n /**\n * Removes a state transition from the state commitment chain.\n * @param _postStateRootBatchHeader Header for the post-state root.\n * @param _preStateRoot Pre-state root hash.\n */\n function _cancelStateTransition(\n Lib_OVMCodec.ChainBatchHeader memory _postStateRootBatchHeader,\n bytes32 _preStateRoot\n )\n internal\n {\n iOVM_StateCommitmentChain ovmStateCommitmentChain = iOVM_StateCommitmentChain(resolve(\"OVM_StateCommitmentChain\"));\n iOVM_BondManager ovmBondManager = iOVM_BondManager(resolve(\"OVM_BondManager\"));\n\n // Delete the state batch.\n ovmStateCommitmentChain.deleteStateBatch(\n _postStateRootBatchHeader\n );\n\n // Get the timestamp and publisher for that block.\n (uint256 timestamp, address publisher) = abi.decode(_postStateRootBatchHeader.extraData, (uint256, address));\n\n // Slash the bonds at the bond manager.\n ovmBondManager.finalize(\n _preStateRoot,\n publisher,\n timestamp\n );\n }\n}\n" + }, + "contracts/optimistic-ethereum/OVM/chain/OVM_CanonicalTransactionChain.sol": { + "content": "// SPDX-License-Identifier: MIT\n// @unsupported: ovm\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\nimport { Lib_MerkleTree } from \"../../libraries/utils/Lib_MerkleTree.sol\";\n\n/* Interface Imports */\nimport { iOVM_CanonicalTransactionChain } from \"../../iOVM/chain/iOVM_CanonicalTransactionChain.sol\";\nimport { iOVM_ChainStorageContainer } from \"../../iOVM/chain/iOVM_ChainStorageContainer.sol\";\n\n/* Contract Imports */\nimport { OVM_ExecutionManager } from \"../execution/OVM_ExecutionManager.sol\";\n\n/* External Imports */\nimport { Math } from \"@openzeppelin/contracts/math/Math.sol\";\n\n/**\n * @title OVM_CanonicalTransactionChain\n * @dev The Canonical Transaction Chain (CTC) contract is an append-only log of transactions\n * which must be applied to the rollup state. It defines the ordering of rollup transactions by\n * writing them to the 'CTC:batches' instance of the Chain Storage Container.\n * The CTC also allows any account to 'enqueue' an L2 transaction, which will require that the Sequencer\n * will eventually append it to the rollup state.\n * If the Sequencer does not include an enqueued transaction within the 'force inclusion period',\n * then any account may force it to be included by calling appendQueueBatch().\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract OVM_CanonicalTransactionChain is iOVM_CanonicalTransactionChain, Lib_AddressResolver {\n\n /*************\n * Constants *\n *************/\n\n // L2 tx gas-related\n uint256 constant public MIN_ROLLUP_TX_GAS = 100000;\n uint256 constant public MAX_ROLLUP_TX_SIZE = 50000;\n uint256 constant public L2_GAS_DISCOUNT_DIVISOR = 32;\n\n // Encoding-related (all in bytes)\n uint256 constant internal BATCH_CONTEXT_SIZE = 16;\n uint256 constant internal BATCH_CONTEXT_LENGTH_POS = 12;\n uint256 constant internal BATCH_CONTEXT_START_POS = 15;\n uint256 constant internal TX_DATA_HEADER_SIZE = 3;\n uint256 constant internal BYTES_TILL_TX_DATA = 65;\n\n\n /*************\n * Variables *\n *************/\n\n uint256 public forceInclusionPeriodSeconds;\n uint256 public forceInclusionPeriodBlocks;\n uint256 public maxTransactionGasLimit;\n\n\n /***************\n * Constructor *\n ***************/\n\n constructor(\n address _libAddressManager,\n uint256 _forceInclusionPeriodSeconds,\n uint256 _forceInclusionPeriodBlocks,\n uint256 _maxTransactionGasLimit\n )\n Lib_AddressResolver(_libAddressManager)\n {\n forceInclusionPeriodSeconds = _forceInclusionPeriodSeconds;\n forceInclusionPeriodBlocks = _forceInclusionPeriodBlocks;\n maxTransactionGasLimit = _maxTransactionGasLimit;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Accesses the batch storage container.\n * @return Reference to the batch storage container.\n */\n function batches()\n override\n public\n view\n returns (\n iOVM_ChainStorageContainer\n )\n {\n return iOVM_ChainStorageContainer(\n resolve(\"OVM_ChainStorageContainer:CTC:batches\")\n );\n }\n\n /**\n * Accesses the queue storage container.\n * @return Reference to the queue storage container.\n */\n function queue()\n override\n public\n view\n returns (\n iOVM_ChainStorageContainer\n )\n {\n return iOVM_ChainStorageContainer(\n resolve(\"OVM_ChainStorageContainer:CTC:queue\")\n );\n }\n\n /**\n * Retrieves the total number of elements submitted.\n * @return _totalElements Total submitted elements.\n */\n function getTotalElements()\n override\n public\n view\n returns (\n uint256 _totalElements\n )\n {\n (uint40 totalElements,,,) = _getBatchExtraData();\n return uint256(totalElements);\n }\n\n /**\n * Retrieves the total number of batches submitted.\n * @return _totalBatches Total submitted batches.\n */\n function getTotalBatches()\n override\n public\n view\n returns (\n uint256 _totalBatches\n )\n {\n return batches().length();\n }\n\n /**\n * Returns the index of the next element to be enqueued.\n * @return Index for the next queue element.\n */\n function getNextQueueIndex()\n override\n public\n view\n returns (\n uint40\n )\n {\n (,uint40 nextQueueIndex,,) = _getBatchExtraData();\n return nextQueueIndex;\n }\n\n /**\n * Returns the timestamp of the last transaction.\n * @return Timestamp for the last transaction.\n */\n function getLastTimestamp()\n override\n public\n view\n returns (\n uint40\n )\n {\n (,,uint40 lastTimestamp,) = _getBatchExtraData();\n return lastTimestamp;\n }\n\n /**\n * Returns the blocknumber of the last transaction.\n * @return Blocknumber for the last transaction.\n */\n function getLastBlockNumber()\n override\n public\n view\n returns (\n uint40\n )\n {\n (,,,uint40 lastBlockNumber) = _getBatchExtraData();\n return lastBlockNumber;\n }\n\n /**\n * Gets the queue element at a particular index.\n * @param _index Index of the queue element to access.\n * @return _element Queue element at the given index.\n */\n function getQueueElement(\n uint256 _index\n )\n override\n public\n view\n returns (\n Lib_OVMCodec.QueueElement memory _element\n )\n {\n return _getQueueElement(\n _index,\n queue()\n );\n }\n\n /**\n * Get the number of queue elements which have not yet been included.\n * @return Number of pending queue elements.\n */\n function getNumPendingQueueElements()\n override\n public\n view\n returns (\n uint40\n )\n {\n return getQueueLength() - getNextQueueIndex();\n }\n\n /**\n * Retrieves the length of the queue, including\n * both pending and canonical transactions.\n * @return Length of the queue.\n */\n function getQueueLength()\n override\n public\n view\n returns (\n uint40\n )\n {\n return _getQueueLength(\n queue()\n );\n }\n\n /**\n * Adds a transaction to the queue.\n * @param _target Target L2 contract to send the transaction to.\n * @param _gasLimit Gas limit for the enqueued L2 transaction.\n * @param _data Transaction data.\n */\n function enqueue(\n address _target,\n uint256 _gasLimit,\n bytes memory _data\n )\n override\n public\n {\n require(\n _data.length <= MAX_ROLLUP_TX_SIZE,\n \"Transaction data size exceeds maximum for rollup transaction.\"\n );\n\n require(\n _gasLimit <= maxTransactionGasLimit,\n \"Transaction gas limit exceeds maximum for rollup transaction.\"\n );\n\n require(\n _gasLimit >= MIN_ROLLUP_TX_GAS,\n \"Transaction gas limit too low to enqueue.\"\n );\n\n // We need to consume some amount of L1 gas in order to rate limit transactions going into\n // L2. However, L2 is cheaper than L1 so we only need to burn some small proportion of the\n // provided L1 gas.\n uint256 gasToConsume = _gasLimit/L2_GAS_DISCOUNT_DIVISOR;\n uint256 startingGas = gasleft();\n\n // Although this check is not necessary (burn below will run out of gas if not true), it\n // gives the user an explicit reason as to why the enqueue attempt failed.\n require(\n startingGas > gasToConsume,\n \"Insufficient gas for L2 rate limiting burn.\"\n );\n\n // Here we do some \"dumb\" work in order to burn gas, although we should probably replace\n // this with something like minting gas token later on.\n uint256 i;\n while(startingGas - gasleft() < gasToConsume) {\n i++;\n }\n\n bytes32 transactionHash = keccak256(\n abi.encode(\n msg.sender,\n _target,\n _gasLimit,\n _data\n )\n );\n\n bytes32 timestampAndBlockNumber;\n assembly {\n timestampAndBlockNumber := timestamp()\n timestampAndBlockNumber := or(timestampAndBlockNumber, shl(40, number()))\n }\n\n iOVM_ChainStorageContainer queueRef = queue();\n\n queueRef.push(transactionHash);\n queueRef.push(timestampAndBlockNumber);\n\n // The underlying queue data structure stores 2 elements\n // per insertion, so to get the real queue length we need\n // to divide by 2 and subtract 1.\n uint256 queueIndex = queueRef.length() / 2 - 1;\n emit TransactionEnqueued(\n msg.sender,\n _target,\n _gasLimit,\n _data,\n queueIndex,\n block.timestamp\n );\n }\n\n /**\n * Appends a given number of queued transactions as a single batch.\n * param _numQueuedTransactions Number of transactions to append.\n */\n function appendQueueBatch(\n uint256 // _numQueuedTransactions\n )\n override\n public\n pure\n {\n // TEMPORARY: Disable `appendQueueBatch` for minnet\n revert(\"appendQueueBatch is currently disabled.\");\n\n // _numQueuedTransactions = Math.min(_numQueuedTransactions, getNumPendingQueueElements());\n // require(\n // _numQueuedTransactions > 0,\n // \"Must append more than zero transactions.\"\n // );\n\n // bytes32[] memory leaves = new bytes32[](_numQueuedTransactions);\n // uint40 nextQueueIndex = getNextQueueIndex();\n\n // for (uint256 i = 0; i < _numQueuedTransactions; i++) {\n // if (msg.sender != resolve(\"OVM_Sequencer\")) {\n // Lib_OVMCodec.QueueElement memory el = getQueueElement(nextQueueIndex);\n // require(\n // el.timestamp + forceInclusionPeriodSeconds < block.timestamp,\n // \"Queue transactions cannot be submitted during the sequencer inclusion period.\"\n // );\n // }\n // leaves[i] = _getQueueLeafHash(nextQueueIndex);\n // nextQueueIndex++;\n // }\n\n // Lib_OVMCodec.QueueElement memory lastElement = getQueueElement(nextQueueIndex - 1);\n\n // _appendBatch(\n // Lib_MerkleTree.getMerkleRoot(leaves),\n // _numQueuedTransactions,\n // _numQueuedTransactions,\n // lastElement.timestamp,\n // lastElement.blockNumber\n // );\n\n // emit QueueBatchAppended(\n // nextQueueIndex - _numQueuedTransactions,\n // _numQueuedTransactions,\n // getTotalElements()\n // );\n }\n\n /**\n * Allows the sequencer to append a batch of transactions.\n * @dev This function uses a custom encoding scheme for efficiency reasons.\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\n * .param _contexts Array of batch contexts.\n * .param _transactionDataFields Array of raw transaction data.\n */\n function appendSequencerBatch()\n override\n public\n {\n uint40 shouldStartAtElement;\n uint24 totalElementsToAppend;\n uint24 numContexts;\n assembly {\n shouldStartAtElement := shr(216, calldataload(4))\n totalElementsToAppend := shr(232, calldataload(9))\n numContexts := shr(232, calldataload(12))\n }\n\n require(\n shouldStartAtElement == getTotalElements(),\n \"Actual batch start index does not match expected start index.\"\n );\n\n require(\n msg.sender == resolve(\"OVM_Sequencer\"),\n \"Function can only be called by the Sequencer.\"\n );\n\n require(\n numContexts > 0,\n \"Must provide at least one batch context.\"\n );\n\n require(\n totalElementsToAppend > 0,\n \"Must append at least one element.\"\n );\n\n uint40 nextTransactionPtr = uint40(BATCH_CONTEXT_START_POS + BATCH_CONTEXT_SIZE * numContexts);\n\n require(\n msg.data.length >= nextTransactionPtr,\n \"Not enough BatchContexts provided.\"\n );\n\n // Take a reference to the queue and its length so we don't have to keep resolving it.\n // Length isn't going to change during the course of execution, so it's fine to simply\n // resolve this once at the start. Saves gas.\n iOVM_ChainStorageContainer queueRef = queue();\n uint40 queueLength = _getQueueLength(queueRef);\n\n // Reserve some memory to save gas on hashing later on. This is a relatively safe estimate\n // for the average transaction size that will prevent having to resize this chunk of memory\n // later on. Saves gas.\n bytes memory hashMemory = new bytes((msg.data.length / totalElementsToAppend) * 2);\n\n // Initialize the array of canonical chain leaves that we will append.\n bytes32[] memory leaves = new bytes32[](totalElementsToAppend);\n\n // Each leaf index corresponds to a tx, either sequenced or enqueued.\n uint32 leafIndex = 0;\n\n // Counter for number of sequencer transactions appended so far.\n uint32 numSequencerTransactions = 0;\n\n // We will sequentially append leaves which are pointers to the queue.\n // The initial queue index is what is currently in storage.\n uint40 nextQueueIndex = getNextQueueIndex();\n\n BatchContext memory curContext;\n for (uint32 i = 0; i < numContexts; i++) {\n BatchContext memory nextContext = _getBatchContext(i);\n\n if (i == 0) {\n // Execute a special check for the first batch.\n _validateFirstBatchContext(nextContext);\n }\n\n // Execute this check on every single batch, including the first one.\n _validateNextBatchContext(\n curContext,\n nextContext,\n nextQueueIndex,\n queueRef\n );\n\n // Now we can update our current context.\n curContext = nextContext;\n\n // Process sequencer transactions first.\n for (uint32 j = 0; j < curContext.numSequencedTransactions; j++) {\n uint256 txDataLength;\n assembly {\n txDataLength := shr(232, calldataload(nextTransactionPtr))\n }\n require(\n txDataLength <= MAX_ROLLUP_TX_SIZE,\n \"Transaction data size exceeds maximum for rollup transaction.\"\n );\n\n leaves[leafIndex] = _getSequencerLeafHash(\n curContext,\n nextTransactionPtr,\n txDataLength,\n hashMemory\n );\n\n nextTransactionPtr += uint40(TX_DATA_HEADER_SIZE + txDataLength);\n numSequencerTransactions++;\n leafIndex++;\n }\n\n // Now process any subsequent queue transactions.\n for (uint32 j = 0; j < curContext.numSubsequentQueueTransactions; j++) {\n require(\n nextQueueIndex < queueLength,\n \"Not enough queued transactions to append.\"\n );\n\n leaves[leafIndex] = _getQueueLeafHash(nextQueueIndex);\n nextQueueIndex++;\n leafIndex++;\n }\n }\n\n _validateFinalBatchContext(\n curContext,\n nextQueueIndex,\n queueLength,\n queueRef\n );\n\n require(\n msg.data.length == nextTransactionPtr,\n \"Not all sequencer transactions were processed.\"\n );\n\n require(\n leafIndex == totalElementsToAppend,\n \"Actual transaction index does not match expected total elements to append.\"\n );\n\n // Generate the required metadata that we need to append this batch\n uint40 numQueuedTransactions = totalElementsToAppend - numSequencerTransactions;\n uint40 blockTimestamp;\n uint40 blockNumber;\n if (curContext.numSubsequentQueueTransactions == 0) {\n // The last element is a sequencer tx, therefore pull timestamp and block number from the last context.\n blockTimestamp = uint40(curContext.timestamp);\n blockNumber = uint40(curContext.blockNumber);\n } else {\n // The last element is a queue tx, therefore pull timestamp and block number from the queue element.\n // curContext.numSubsequentQueueTransactions > 0 which means that we've processed at least one queue element.\n // We increment nextQueueIndex after processing each queue element,\n // so the index of the last element we processed is nextQueueIndex - 1.\n Lib_OVMCodec.QueueElement memory lastElement = _getQueueElement(\n nextQueueIndex - 1,\n queueRef\n );\n\n blockTimestamp = lastElement.timestamp;\n blockNumber = lastElement.blockNumber;\n }\n\n // For efficiency reasons getMerkleRoot modifies the `leaves` argument in place\n // while calculating the root hash therefore any arguments passed to it must not\n // be used again afterwards\n _appendBatch(\n Lib_MerkleTree.getMerkleRoot(leaves),\n totalElementsToAppend,\n numQueuedTransactions,\n blockTimestamp,\n blockNumber\n );\n\n emit SequencerBatchAppended(\n nextQueueIndex - numQueuedTransactions,\n numQueuedTransactions,\n getTotalElements()\n );\n }\n\n /**\n * Verifies whether a transaction is included in the chain.\n * @param _transaction Transaction to verify.\n * @param _txChainElement Transaction chain element corresponding to the transaction.\n * @param _batchHeader Header of the batch the transaction was included in.\n * @param _inclusionProof Inclusion proof for the provided transaction chain element.\n * @return True if the transaction exists in the CTC, false if not.\n */\n function verifyTransaction(\n Lib_OVMCodec.Transaction memory _transaction,\n Lib_OVMCodec.TransactionChainElement memory _txChainElement,\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _inclusionProof\n )\n override\n public\n view\n returns (\n bool\n )\n {\n if (_txChainElement.isSequenced == true) {\n return _verifySequencerTransaction(\n _transaction,\n _txChainElement,\n _batchHeader,\n _inclusionProof\n );\n } else {\n return _verifyQueueTransaction(\n _transaction,\n _txChainElement.queueIndex,\n _batchHeader,\n _inclusionProof\n );\n }\n }\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Returns the BatchContext located at a particular index.\n * @param _index The index of the BatchContext\n * @return The BatchContext at the specified index.\n */\n function _getBatchContext(\n uint256 _index\n )\n internal\n pure\n returns (\n BatchContext memory\n )\n {\n uint256 contextPtr = 15 + _index * BATCH_CONTEXT_SIZE;\n uint256 numSequencedTransactions;\n uint256 numSubsequentQueueTransactions;\n uint256 ctxTimestamp;\n uint256 ctxBlockNumber;\n\n assembly {\n numSequencedTransactions := shr(232, calldataload(contextPtr))\n numSubsequentQueueTransactions := shr(232, calldataload(add(contextPtr, 3)))\n ctxTimestamp := shr(216, calldataload(add(contextPtr, 6)))\n ctxBlockNumber := shr(216, calldataload(add(contextPtr, 11)))\n }\n\n return BatchContext({\n numSequencedTransactions: numSequencedTransactions,\n numSubsequentQueueTransactions: numSubsequentQueueTransactions,\n timestamp: ctxTimestamp,\n blockNumber: ctxBlockNumber\n });\n }\n\n /**\n * Parses the batch context from the extra data.\n * @return Total number of elements submitted.\n * @return Index of the next queue element.\n */\n function _getBatchExtraData()\n internal\n view\n returns (\n uint40,\n uint40,\n uint40,\n uint40\n )\n {\n bytes27 extraData = batches().getGlobalMetadata();\n\n uint40 totalElements;\n uint40 nextQueueIndex;\n uint40 lastTimestamp;\n uint40 lastBlockNumber;\n assembly {\n extraData := shr(40, extraData)\n totalElements := and(extraData, 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF)\n nextQueueIndex := shr(40, and(extraData, 0x00000000000000000000000000000000000000000000FFFFFFFFFF0000000000))\n lastTimestamp := shr(80, and(extraData, 0x0000000000000000000000000000000000FFFFFFFFFF00000000000000000000))\n lastBlockNumber := shr(120, and(extraData, 0x000000000000000000000000FFFFFFFFFF000000000000000000000000000000))\n }\n\n return (\n totalElements,\n nextQueueIndex,\n lastTimestamp,\n lastBlockNumber\n );\n }\n\n /**\n * Encodes the batch context for the extra data.\n * @param _totalElements Total number of elements submitted.\n * @param _nextQueueIndex Index of the next queue element.\n * @param _timestamp Timestamp for the last batch.\n * @param _blockNumber Block number of the last batch.\n * @return Encoded batch context.\n */\n function _makeBatchExtraData(\n uint40 _totalElements,\n uint40 _nextQueueIndex,\n uint40 _timestamp,\n uint40 _blockNumber\n )\n internal\n pure\n returns (\n bytes27\n )\n {\n bytes27 extraData;\n assembly {\n extraData := _totalElements\n extraData := or(extraData, shl(40, _nextQueueIndex))\n extraData := or(extraData, shl(80, _timestamp))\n extraData := or(extraData, shl(120, _blockNumber))\n extraData := shl(40, extraData)\n }\n\n return extraData;\n }\n\n /**\n * Retrieves the hash of a queue element.\n * @param _index Index of the queue element to retrieve a hash for.\n * @return Hash of the queue element.\n */\n function _getQueueLeafHash(\n uint256 _index\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n return _hashTransactionChainElement(\n Lib_OVMCodec.TransactionChainElement({\n isSequenced: false,\n queueIndex: _index,\n timestamp: 0,\n blockNumber: 0,\n txData: hex\"\"\n })\n );\n }\n\n /**\n * Gets the queue element at a particular index.\n * @param _index Index of the queue element to access.\n * @return _element Queue element at the given index.\n */\n function _getQueueElement(\n uint256 _index,\n iOVM_ChainStorageContainer _queueRef\n )\n internal\n view\n returns (\n Lib_OVMCodec.QueueElement memory _element\n )\n {\n // The underlying queue data structure stores 2 elements\n // per insertion, so to get the actual desired queue index\n // we need to multiply by 2.\n uint40 trueIndex = uint40(_index * 2);\n bytes32 transactionHash = _queueRef.get(trueIndex);\n bytes32 timestampAndBlockNumber = _queueRef.get(trueIndex + 1);\n\n uint40 elementTimestamp;\n uint40 elementBlockNumber;\n assembly {\n elementTimestamp := and(timestampAndBlockNumber, 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF)\n elementBlockNumber := shr(40, and(timestampAndBlockNumber, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000))\n }\n\n return Lib_OVMCodec.QueueElement({\n transactionHash: transactionHash,\n timestamp: elementTimestamp,\n blockNumber: elementBlockNumber\n });\n }\n\n /**\n * Retrieves the length of the queue.\n * @return Length of the queue.\n */\n function _getQueueLength(\n iOVM_ChainStorageContainer _queueRef\n )\n internal\n view\n returns (\n uint40\n )\n {\n // The underlying queue data structure stores 2 elements\n // per insertion, so to get the real queue length we need\n // to divide by 2.\n return uint40(_queueRef.length() / 2);\n }\n\n /**\n * Retrieves the hash of a sequencer element.\n * @param _context Batch context for the given element.\n * @param _nextTransactionPtr Pointer to the next transaction in the calldata.\n * @param _txDataLength Length of the transaction item.\n * @return Hash of the sequencer element.\n */\n function _getSequencerLeafHash(\n BatchContext memory _context,\n uint256 _nextTransactionPtr,\n uint256 _txDataLength,\n bytes memory _hashMemory\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n // Only allocate more memory if we didn't reserve enough to begin with.\n if (BYTES_TILL_TX_DATA + _txDataLength > _hashMemory.length) {\n _hashMemory = new bytes(BYTES_TILL_TX_DATA + _txDataLength);\n }\n\n uint256 ctxTimestamp = _context.timestamp;\n uint256 ctxBlockNumber = _context.blockNumber;\n\n bytes32 leafHash;\n assembly {\n let chainElementStart := add(_hashMemory, 0x20)\n\n // Set the first byte equal to `1` to indicate this is a sequencer chain element.\n // This distinguishes sequencer ChainElements from queue ChainElements because\n // all queue ChainElements are ABI encoded and the first byte of ABI encoded\n // elements is always zero\n mstore8(chainElementStart, 1)\n\n mstore(add(chainElementStart, 1), ctxTimestamp)\n mstore(add(chainElementStart, 33), ctxBlockNumber)\n\n calldatacopy(add(chainElementStart, BYTES_TILL_TX_DATA), add(_nextTransactionPtr, 3), _txDataLength)\n\n leafHash := keccak256(chainElementStart, add(BYTES_TILL_TX_DATA, _txDataLength))\n }\n\n return leafHash;\n }\n\n /**\n * Retrieves the hash of a sequencer element.\n * @param _txChainElement The chain element which is hashed to calculate the leaf.\n * @return Hash of the sequencer element.\n */\n function _getSequencerLeafHash(\n Lib_OVMCodec.TransactionChainElement memory _txChainElement\n )\n internal\n view\n returns(\n bytes32\n )\n {\n bytes memory txData = _txChainElement.txData;\n uint256 txDataLength = _txChainElement.txData.length;\n\n bytes memory chainElement = new bytes(BYTES_TILL_TX_DATA + txDataLength);\n uint256 ctxTimestamp = _txChainElement.timestamp;\n uint256 ctxBlockNumber = _txChainElement.blockNumber;\n\n bytes32 leafHash;\n assembly {\n let chainElementStart := add(chainElement, 0x20)\n\n // Set the first byte equal to `1` to indicate this is a sequencer chain element.\n // This distinguishes sequencer ChainElements from queue ChainElements because\n // all queue ChainElements are ABI encoded and the first byte of ABI encoded\n // elements is always zero\n mstore8(chainElementStart, 1)\n\n mstore(add(chainElementStart, 1), ctxTimestamp)\n mstore(add(chainElementStart, 33), ctxBlockNumber)\n\n pop(staticcall(gas(), 0x04, add(txData, 0x20), txDataLength, add(chainElementStart, BYTES_TILL_TX_DATA), txDataLength))\n\n leafHash := keccak256(chainElementStart, add(BYTES_TILL_TX_DATA, txDataLength))\n }\n\n return leafHash;\n }\n\n /**\n * Inserts a batch into the chain of batches.\n * @param _transactionRoot Root of the transaction tree for this batch.\n * @param _batchSize Number of elements in the batch.\n * @param _numQueuedTransactions Number of queue transactions in the batch.\n * @param _timestamp The latest batch timestamp.\n * @param _blockNumber The latest batch blockNumber.\n */\n function _appendBatch(\n bytes32 _transactionRoot,\n uint256 _batchSize,\n uint256 _numQueuedTransactions,\n uint40 _timestamp,\n uint40 _blockNumber\n )\n internal\n {\n iOVM_ChainStorageContainer batchesRef = batches();\n (uint40 totalElements, uint40 nextQueueIndex,,) = _getBatchExtraData();\n\n Lib_OVMCodec.ChainBatchHeader memory header = Lib_OVMCodec.ChainBatchHeader({\n batchIndex: batchesRef.length(),\n batchRoot: _transactionRoot,\n batchSize: _batchSize,\n prevTotalElements: totalElements,\n extraData: hex\"\"\n });\n\n emit TransactionBatchAppended(\n header.batchIndex,\n header.batchRoot,\n header.batchSize,\n header.prevTotalElements,\n header.extraData\n );\n\n bytes32 batchHeaderHash = Lib_OVMCodec.hashBatchHeader(header);\n bytes27 latestBatchContext = _makeBatchExtraData(\n totalElements + uint40(header.batchSize),\n nextQueueIndex + uint40(_numQueuedTransactions),\n _timestamp,\n _blockNumber\n );\n\n batchesRef.push(batchHeaderHash, latestBatchContext);\n }\n\n /**\n * Checks that the first batch context in a sequencer submission is valid\n * @param _firstContext The batch context to validate.\n */\n function _validateFirstBatchContext(\n BatchContext memory _firstContext\n )\n internal\n view\n {\n // If there are existing elements, this batch must have the same context\n // or a later timestamp and block number.\n if (getTotalElements() > 0) {\n (,, uint40 lastTimestamp, uint40 lastBlockNumber) = _getBatchExtraData();\n\n require(\n _firstContext.blockNumber >= lastBlockNumber,\n \"Context block number is lower than last submitted.\"\n );\n\n require(\n _firstContext.timestamp >= lastTimestamp,\n \"Context timestamp is lower than last submitted.\"\n );\n }\n\n // Sequencer cannot submit contexts which are more than the force inclusion period old.\n require(\n _firstContext.timestamp + forceInclusionPeriodSeconds >= block.timestamp,\n \"Context timestamp too far in the past.\"\n );\n\n require(\n _firstContext.blockNumber + forceInclusionPeriodBlocks >= block.number,\n \"Context block number too far in the past.\"\n );\n }\n\n /**\n * Checks that a given batch context has a time context which is below a given que element\n * @param _context The batch context to validate has values lower.\n * @param _queueIndex Index of the queue element we are validating came later than the context.\n * @param _queueRef The storage container for the queue.\n */\n function _validateContextBeforeEnqueue(\n BatchContext memory _context,\n uint40 _queueIndex,\n iOVM_ChainStorageContainer _queueRef\n )\n internal\n view\n {\n Lib_OVMCodec.QueueElement memory nextQueueElement = _getQueueElement(\n _queueIndex,\n _queueRef\n );\n\n // If the force inclusion period has passed for an enqueued transaction, it MUST be the next chain element.\n require(\n block.timestamp < nextQueueElement.timestamp + forceInclusionPeriodSeconds,\n \"Previously enqueued batches have expired and must be appended before a new sequencer batch.\"\n );\n\n // Just like sequencer transaction times must be increasing relative to each other,\n // We also require that they be increasing relative to any interspersed queue elements.\n require(\n _context.timestamp <= nextQueueElement.timestamp,\n \"Sequencer transaction timestamp exceeds that of next queue element.\"\n );\n\n require(\n _context.blockNumber <= nextQueueElement.blockNumber,\n \"Sequencer transaction blockNumber exceeds that of next queue element.\"\n );\n }\n\n /**\n * Checks that a given batch context is valid based on its previous context, and the next queue elemtent.\n * @param _prevContext The previously validated batch context.\n * @param _nextContext The batch context to validate with this call.\n * @param _nextQueueIndex Index of the next queue element to process for the _nextContext's subsequentQueueElements.\n * @param _queueRef The storage container for the queue.\n */\n function _validateNextBatchContext(\n BatchContext memory _prevContext,\n BatchContext memory _nextContext,\n uint40 _nextQueueIndex,\n iOVM_ChainStorageContainer _queueRef\n )\n internal\n view\n {\n // All sequencer transactions' times must be greater than or equal to the previous ones.\n require(\n _nextContext.timestamp >= _prevContext.timestamp,\n \"Context timestamp values must monotonically increase.\"\n );\n\n require(\n _nextContext.blockNumber >= _prevContext.blockNumber,\n \"Context blockNumber values must monotonically increase.\"\n );\n\n // If there is going to be a queue element pulled in from this context:\n if (_nextContext.numSubsequentQueueTransactions > 0) {\n _validateContextBeforeEnqueue(\n _nextContext,\n _nextQueueIndex,\n _queueRef\n );\n }\n }\n\n /**\n * Checks that the final batch context in a sequencer submission is valid.\n * @param _finalContext The batch context to validate.\n * @param _queueLength The length of the queue at the start of the batchAppend call.\n * @param _nextQueueIndex The next element in the queue that will be pulled into the CTC.\n * @param _queueRef The storage container for the queue.\n */\n function _validateFinalBatchContext(\n BatchContext memory _finalContext,\n uint40 _nextQueueIndex,\n uint40 _queueLength,\n iOVM_ChainStorageContainer _queueRef\n )\n internal\n view\n {\n // If the queue is not now empty, check the mononoticity of whatever the next batch that will come in is.\n if (_queueLength - _nextQueueIndex > 0 && _finalContext.numSubsequentQueueTransactions == 0) {\n _validateContextBeforeEnqueue(\n _finalContext,\n _nextQueueIndex,\n _queueRef\n );\n }\n // Batches cannot be added from the future, or subsequent enqueue() contexts would violate monotonicity.\n require(_finalContext.timestamp <= block.timestamp, \"Context timestamp is from the future.\");\n require(_finalContext.blockNumber <= block.number, \"Context block number is from the future.\");\n }\n\n /**\n * Hashes a transaction chain element.\n * @param _element Chain element to hash.\n * @return Hash of the chain element.\n */\n function _hashTransactionChainElement(\n Lib_OVMCodec.TransactionChainElement memory _element\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n return keccak256(\n abi.encode(\n _element.isSequenced,\n _element.queueIndex,\n _element.timestamp,\n _element.blockNumber,\n _element.txData\n )\n );\n }\n\n /**\n * Verifies a sequencer transaction, returning true if it was indeed included in the CTC\n * @param _transaction The transaction we are verifying inclusion of.\n * @param _txChainElement The chain element that the transaction is claimed to be a part of.\n * @param _batchHeader Header of the batch the transaction was included in.\n * @param _inclusionProof An inclusion proof into the CTC at a particular index.\n * @return True if the transaction was included in the specified location, else false.\n */\n function _verifySequencerTransaction(\n Lib_OVMCodec.Transaction memory _transaction,\n Lib_OVMCodec.TransactionChainElement memory _txChainElement,\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _inclusionProof\n )\n internal\n view\n returns (\n bool\n )\n {\n OVM_ExecutionManager ovmExecutionManager = OVM_ExecutionManager(resolve(\"OVM_ExecutionManager\"));\n uint256 gasLimit = ovmExecutionManager.getMaxTransactionGasLimit();\n bytes32 leafHash = _getSequencerLeafHash(_txChainElement);\n\n require(\n _verifyElement(\n leafHash,\n _batchHeader,\n _inclusionProof\n ),\n \"Invalid Sequencer transaction inclusion proof.\"\n );\n\n require(\n _transaction.blockNumber == _txChainElement.blockNumber\n && _transaction.timestamp == _txChainElement.timestamp\n && _transaction.entrypoint == resolve(\"OVM_DecompressionPrecompileAddress\")\n && _transaction.gasLimit == gasLimit\n && _transaction.l1TxOrigin == address(0)\n && _transaction.l1QueueOrigin == Lib_OVMCodec.QueueOrigin.SEQUENCER_QUEUE\n && keccak256(_transaction.data) == keccak256(_txChainElement.txData),\n \"Invalid Sequencer transaction.\"\n );\n\n return true;\n }\n\n /**\n * Verifies a queue transaction, returning true if it was indeed included in the CTC\n * @param _transaction The transaction we are verifying inclusion of.\n * @param _queueIndex The queueIndex of the queued transaction.\n * @param _batchHeader Header of the batch the transaction was included in.\n * @param _inclusionProof An inclusion proof into the CTC at a particular index (should point to queue tx).\n * @return True if the transaction was included in the specified location, else false.\n */\n function _verifyQueueTransaction(\n Lib_OVMCodec.Transaction memory _transaction,\n uint256 _queueIndex,\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _inclusionProof\n )\n internal\n view\n returns (\n bool\n )\n {\n bytes32 leafHash = _getQueueLeafHash(_queueIndex);\n\n require(\n _verifyElement(\n leafHash,\n _batchHeader,\n _inclusionProof\n ),\n \"Invalid Queue transaction inclusion proof.\"\n );\n\n bytes32 transactionHash = keccak256(\n abi.encode(\n _transaction.l1TxOrigin,\n _transaction.entrypoint,\n _transaction.gasLimit,\n _transaction.data\n )\n );\n\n Lib_OVMCodec.QueueElement memory el = getQueueElement(_queueIndex);\n require(\n el.transactionHash == transactionHash\n && el.timestamp == _transaction.timestamp\n && el.blockNumber == _transaction.blockNumber,\n \"Invalid Queue transaction.\"\n );\n\n return true;\n }\n\n /**\n * Verifies a batch inclusion proof.\n * @param _element Hash of the element to verify a proof for.\n * @param _batchHeader Header of the batch in which the element was included.\n * @param _proof Merkle inclusion proof for the element.\n */\n function _verifyElement(\n bytes32 _element,\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _proof\n )\n internal\n view\n returns (\n bool\n )\n {\n require(\n Lib_OVMCodec.hashBatchHeader(_batchHeader) == batches().get(uint32(_batchHeader.batchIndex)),\n \"Invalid batch header.\"\n );\n\n require(\n Lib_MerkleTree.verify(\n _batchHeader.batchRoot,\n _element,\n _proof.index,\n _proof.siblings,\n _batchHeader.batchSize\n ),\n \"Invalid inclusion proof.\"\n );\n\n return true;\n }\n}\n" + }, + "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol": { + "content": "// SPDX-License-Identifier: MIT\n// @unsupported: ovm\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\nimport { Lib_EthUtils } from \"../../libraries/utils/Lib_EthUtils.sol\";\nimport { Lib_ErrorUtils } from \"../../libraries/utils/Lib_ErrorUtils.sol\";\n\n/* Interface Imports */\nimport { iOVM_ExecutionManager } from \"../../iOVM/execution/iOVM_ExecutionManager.sol\";\nimport { iOVM_StateManager } from \"../../iOVM/execution/iOVM_StateManager.sol\";\nimport { iOVM_SafetyChecker } from \"../../iOVM/execution/iOVM_SafetyChecker.sol\";\n\n/* Contract Imports */\nimport { OVM_DeployerWhitelist } from \"../predeploys/OVM_DeployerWhitelist.sol\";\n\n/**\n * @title OVM_ExecutionManager\n * @dev The Execution Manager (EM) is the core of our OVM implementation, and provides a sandboxed\n * environment allowing us to execute OVM transactions deterministically on either Layer 1 or\n * Layer 2.\n * The EM's run() function is the first function called during the execution of any\n * transaction on L2.\n * For each context-dependent EVM operation the EM has a function which implements a corresponding\n * OVM operation, which will read state from the State Manager contract.\n * The EM relies on the Safety Checker to verify that code deployed to Layer 2 does not contain any\n * context-dependent operations.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract OVM_ExecutionManager is iOVM_ExecutionManager, Lib_AddressResolver {\n\n /********************************\n * External Contract References *\n ********************************/\n\n iOVM_SafetyChecker internal ovmSafetyChecker;\n iOVM_StateManager internal ovmStateManager;\n\n\n /*******************************\n * Execution Context Variables *\n *******************************/\n\n GasMeterConfig internal gasMeterConfig;\n GlobalContext internal globalContext;\n TransactionContext internal transactionContext;\n MessageContext internal messageContext;\n TransactionRecord internal transactionRecord;\n MessageRecord internal messageRecord;\n\n\n /**************************\n * Gas Metering Constants *\n **************************/\n\n address constant GAS_METADATA_ADDRESS = 0x06a506A506a506A506a506a506A506A506A506A5;\n uint256 constant NUISANCE_GAS_SLOAD = 20000;\n uint256 constant NUISANCE_GAS_SSTORE = 20000;\n uint256 constant MIN_NUISANCE_GAS_PER_CONTRACT = 30000;\n uint256 constant NUISANCE_GAS_PER_CONTRACT_BYTE = 100;\n uint256 constant MIN_GAS_FOR_INVALID_STATE_ACCESS = 30000;\n\n /**************************\n * Default Context Values *\n **************************/\n\n uint256 constant DEFAULT_UINT256 = 0xdefa017defa017defa017defa017defa017defa017defa017defa017defa017d;\n address constant DEFAULT_ADDRESS = 0xdEfa017defA017DeFA017DEfa017DeFA017DeFa0;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n constructor(\n address _libAddressManager,\n GasMeterConfig memory _gasMeterConfig,\n GlobalContext memory _globalContext\n )\n Lib_AddressResolver(_libAddressManager)\n {\n ovmSafetyChecker = iOVM_SafetyChecker(resolve(\"OVM_SafetyChecker\"));\n gasMeterConfig = _gasMeterConfig;\n globalContext = _globalContext;\n _resetContext();\n }\n\n\n /**********************\n * Function Modifiers *\n **********************/\n\n /**\n * Applies dynamically-sized refund to a transaction to account for the difference in execution\n * between L1 and L2, so that the overall cost of the ovmOPCODE is fixed.\n * @param _cost Desired gas cost for the function after the refund.\n */\n modifier netGasCost(\n uint256 _cost\n ) {\n uint256 gasProvided = gasleft();\n _;\n uint256 gasUsed = gasProvided - gasleft();\n\n // We want to refund everything *except* the specified cost.\n if (_cost < gasUsed) {\n transactionRecord.ovmGasRefund += gasUsed - _cost;\n }\n }\n\n /**\n * Applies a fixed-size gas refund to a transaction to account for the difference in execution\n * between L1 and L2, so that the overall cost of an ovmOPCODE can be lowered.\n * @param _discount Amount of gas cost to refund for the ovmOPCODE.\n */\n modifier fixedGasDiscount(\n uint256 _discount\n ) {\n uint256 gasProvided = gasleft();\n _;\n uint256 gasUsed = gasProvided - gasleft();\n\n // We want to refund the specified _discount, unless this risks underflow.\n if (_discount < gasUsed) {\n transactionRecord.ovmGasRefund += _discount;\n } else {\n // refund all we can without risking underflow.\n transactionRecord.ovmGasRefund += gasUsed;\n }\n }\n\n /**\n * Makes sure we're not inside a static context.\n */\n modifier notStatic() {\n if (messageContext.isStatic == true) {\n _revertWithFlag(RevertFlag.STATIC_VIOLATION);\n }\n _;\n }\n\n\n /************************************\n * Transaction Execution Entrypoint *\n ************************************/\n\n /**\n * Starts the execution of a transaction via the OVM_ExecutionManager.\n * @param _transaction Transaction data to be executed.\n * @param _ovmStateManager iOVM_StateManager implementation providing account state.\n */\n function run(\n Lib_OVMCodec.Transaction memory _transaction,\n address _ovmStateManager\n )\n override\n public\n returns (\n bytes memory\n )\n {\n // Make sure that run() is not re-enterable. This condition should always be satisfied\n // Once run has been called once, due to the behavior of _isValidInput().\n if (transactionContext.ovmNUMBER != DEFAULT_UINT256) {\n return bytes(\"\");\n }\n\n // Store our OVM_StateManager instance (significantly easier than attempting to pass the\n // address around in calldata).\n ovmStateManager = iOVM_StateManager(_ovmStateManager);\n\n // Make sure this function can't be called by anyone except the owner of the\n // OVM_StateManager (expected to be an OVM_StateTransitioner). We can revert here because\n // this would make the `run` itself invalid.\n require(\n // This method may return false during fraud proofs, but always returns true in L2 nodes' State Manager precompile.\n ovmStateManager.isAuthenticated(msg.sender),\n \"Only authenticated addresses in ovmStateManager can call this function\"\n );\n\n // Initialize the execution context, must be initialized before we perform any gas metering\n // or we'll throw a nuisance gas error.\n _initContext(_transaction);\n\n // TEMPORARY: Gas metering is disabled for minnet.\n // // Check whether we need to start a new epoch, do so if necessary.\n // _checkNeedsNewEpoch(_transaction.timestamp);\n\n // Make sure the transaction's gas limit is valid. We don't revert here because we reserve\n // reverts for INVALID_STATE_ACCESS.\n if (_isValidInput(_transaction) == false) {\n _resetContext();\n return bytes(\"\");\n }\n\n // TEMPORARY: Gas metering is disabled for minnet.\n // // Check gas right before the call to get total gas consumed by OVM transaction.\n // uint256 gasProvided = gasleft();\n\n // Run the transaction, make sure to meter the gas usage.\n (, bytes memory returndata) = ovmCALL(\n _transaction.gasLimit - gasMeterConfig.minTransactionGasLimit,\n _transaction.entrypoint,\n _transaction.data\n );\n\n // TEMPORARY: Gas metering is disabled for minnet.\n // // Update the cumulative gas based on the amount of gas used.\n // uint256 gasUsed = gasProvided - gasleft();\n // _updateCumulativeGas(gasUsed, _transaction.l1QueueOrigin);\n\n // Wipe the execution context.\n _resetContext();\n\n return returndata;\n }\n\n\n /******************************\n * Opcodes: Execution Context *\n ******************************/\n\n /**\n * @notice Overrides CALLER.\n * @return _CALLER Address of the CALLER within the current message context.\n */\n function ovmCALLER()\n override\n public\n view\n returns (\n address _CALLER\n )\n {\n return messageContext.ovmCALLER;\n }\n\n /**\n * @notice Overrides ADDRESS.\n * @return _ADDRESS Active ADDRESS within the current message context.\n */\n function ovmADDRESS()\n override\n public\n view\n returns (\n address _ADDRESS\n )\n {\n return messageContext.ovmADDRESS;\n }\n\n /**\n * @notice Overrides TIMESTAMP.\n * @return _TIMESTAMP Value of the TIMESTAMP within the transaction context.\n */\n function ovmTIMESTAMP()\n override\n public\n view\n returns (\n uint256 _TIMESTAMP\n )\n {\n return transactionContext.ovmTIMESTAMP;\n }\n\n /**\n * @notice Overrides NUMBER.\n * @return _NUMBER Value of the NUMBER within the transaction context.\n */\n function ovmNUMBER()\n override\n public\n view\n returns (\n uint256 _NUMBER\n )\n {\n return transactionContext.ovmNUMBER;\n }\n\n /**\n * @notice Overrides GASLIMIT.\n * @return _GASLIMIT Value of the block's GASLIMIT within the transaction context.\n */\n function ovmGASLIMIT()\n override\n public\n view\n returns (\n uint256 _GASLIMIT\n )\n {\n return transactionContext.ovmGASLIMIT;\n }\n\n /**\n * @notice Overrides CHAINID.\n * @return _CHAINID Value of the chain's CHAINID within the global context.\n */\n function ovmCHAINID()\n override\n public\n view\n returns (\n uint256 _CHAINID\n )\n {\n return globalContext.ovmCHAINID;\n }\n\n /*********************************\n * Opcodes: L2 Execution Context *\n *********************************/\n\n /**\n * @notice Specifies from which source (Sequencer or Queue) this transaction originated from.\n * @return _queueOrigin Enum indicating the ovmL1QUEUEORIGIN within the current message context.\n */\n function ovmL1QUEUEORIGIN()\n override\n public\n view\n returns (\n Lib_OVMCodec.QueueOrigin _queueOrigin\n )\n {\n return transactionContext.ovmL1QUEUEORIGIN;\n }\n\n /**\n * @notice Specifies which L1 account, if any, sent this transaction by calling enqueue().\n * @return _l1TxOrigin Address of the account which sent the tx into L2 from L1.\n */\n function ovmL1TXORIGIN()\n override\n public\n view\n returns (\n address _l1TxOrigin\n )\n {\n return transactionContext.ovmL1TXORIGIN;\n }\n\n /********************\n * Opcodes: Halting *\n ********************/\n\n /**\n * @notice Overrides REVERT.\n * @param _data Bytes data to pass along with the REVERT.\n */\n function ovmREVERT(\n bytes memory _data\n )\n override\n public\n {\n _revertWithFlag(RevertFlag.INTENTIONAL_REVERT, _data);\n }\n\n\n /******************************\n * Opcodes: Contract Creation *\n ******************************/\n\n /**\n * @notice Overrides CREATE.\n * @param _bytecode Code to be used to CREATE a new contract.\n * @return Address of the created contract.\n * @return Revert data, if and only if the creation threw an exception.\n */\n function ovmCREATE(\n bytes memory _bytecode\n )\n override\n public\n notStatic\n fixedGasDiscount(40000)\n returns (\n address,\n bytes memory\n )\n {\n // Creator is always the current ADDRESS.\n address creator = ovmADDRESS();\n\n // Check that the deployer is whitelisted, or\n // that arbitrary contract deployment has been enabled.\n _checkDeployerAllowed(creator);\n\n // Generate the correct CREATE address.\n address contractAddress = Lib_EthUtils.getAddressForCREATE(\n creator,\n _getAccountNonce(creator)\n );\n\n return _createContract(\n contractAddress,\n _bytecode\n );\n }\n\n /**\n * @notice Overrides CREATE2.\n * @param _bytecode Code to be used to CREATE2 a new contract.\n * @param _salt Value used to determine the contract's address.\n * @return Address of the created contract.\n * @return Revert data, if and only if the creation threw an exception.\n */\n function ovmCREATE2(\n bytes memory _bytecode,\n bytes32 _salt\n )\n override\n public\n notStatic\n fixedGasDiscount(40000)\n returns (\n address,\n bytes memory\n )\n {\n // Creator is always the current ADDRESS.\n address creator = ovmADDRESS();\n\n // Check that the deployer is whitelisted, or\n // that arbitrary contract deployment has been enabled.\n _checkDeployerAllowed(creator);\n\n // Generate the correct CREATE2 address.\n address contractAddress = Lib_EthUtils.getAddressForCREATE2(\n creator,\n _bytecode,\n _salt\n );\n\n return _createContract(\n contractAddress,\n _bytecode\n );\n }\n\n\n /*******************************\n * Account Abstraction Opcodes *\n ******************************/\n\n /**\n * Retrieves the nonce of the current ovmADDRESS.\n * @return _nonce Nonce of the current contract.\n */\n function ovmGETNONCE()\n override\n public\n returns (\n uint256 _nonce\n )\n {\n return _getAccountNonce(ovmADDRESS());\n }\n\n /**\n * Bumps the nonce of the current ovmADDRESS by one.\n */\n function ovmINCREMENTNONCE()\n override\n public\n notStatic\n {\n address account = ovmADDRESS();\n uint256 nonce = _getAccountNonce(account);\n\n // Prevent overflow.\n if (nonce + 1 > nonce) {\n _setAccountNonce(account, nonce + 1);\n }\n }\n\n /**\n * Creates a new EOA contract account, for account abstraction.\n * @dev Essentially functions like ovmCREATE or ovmCREATE2, but we can bypass a lot of checks\n * because the contract we're creating is trusted (no need to do safety checking or to\n * handle unexpected reverts). Doesn't need to return an address because the address is\n * assumed to be the user's actual address.\n * @param _messageHash Hash of a message signed by some user, for verification.\n * @param _v Signature `v` parameter.\n * @param _r Signature `r` parameter.\n * @param _s Signature `s` parameter.\n */\n function ovmCREATEEOA(\n bytes32 _messageHash,\n uint8 _v,\n bytes32 _r,\n bytes32 _s\n )\n override\n public\n notStatic\n {\n // Recover the EOA address from the message hash and signature parameters. Since we do the\n // hashing in advance, we don't have handle different message hashing schemes. Even if this\n // function were to return the wrong address (rather than explicitly returning the zero\n // address), the rest of the transaction would simply fail (since there's no EOA account to\n // actually execute the transaction).\n address eoa = ecrecover(\n _messageHash,\n _v + 27,\n _r,\n _s\n );\n\n // Invalid signature is a case we proactively handle with a revert. We could alternatively\n // have this function return a `success` boolean, but this is just easier.\n if (eoa == address(0)) {\n ovmREVERT(bytes(\"Signature provided for EOA contract creation is invalid.\"));\n }\n\n // If the user already has an EOA account, then there's no need to perform this operation.\n if (_hasEmptyAccount(eoa) == false) {\n return;\n }\n\n // We always need to initialize the contract with the default account values.\n _initPendingAccount(eoa);\n\n // Temporarily set the current address so it's easier to access on L2.\n address prevADDRESS = messageContext.ovmADDRESS;\n messageContext.ovmADDRESS = eoa;\n\n // Creates a duplicate of the OVM_ProxyEOA located at 0x42....09. Uses the following\n // \"magic\" prefix to deploy an exact copy of the code:\n // PUSH1 0x0D # size of this prefix in bytes\n // CODESIZE\n // SUB # subtract prefix size from codesize\n // DUP1\n // PUSH1 0x0D\n // PUSH1 0x00\n // CODECOPY # copy everything after prefix into memory at pos 0\n // PUSH1 0x00\n // RETURN # return the copied code\n address proxyEOA = Lib_EthUtils.createContract(abi.encodePacked(\n hex\"600D380380600D6000396000f3\",\n ovmEXTCODECOPY(\n 0x4200000000000000000000000000000000000009,\n 0,\n ovmEXTCODESIZE(0x4200000000000000000000000000000000000009)\n )\n ));\n\n // Reset the address now that we're done deploying.\n messageContext.ovmADDRESS = prevADDRESS;\n\n // Commit the account with its final values.\n _commitPendingAccount(\n eoa,\n address(proxyEOA),\n keccak256(Lib_EthUtils.getCode(address(proxyEOA)))\n );\n\n _setAccountNonce(eoa, 0);\n }\n\n\n /*********************************\n * Opcodes: Contract Interaction *\n *********************************/\n\n /**\n * @notice Overrides CALL.\n * @param _gasLimit Amount of gas to be passed into this call.\n * @param _address Address of the contract to call.\n * @param _calldata Data to send along with the call.\n * @return _success Whether or not the call returned (rather than reverted).\n * @return _returndata Data returned by the call.\n */\n function ovmCALL(\n uint256 _gasLimit,\n address _address,\n bytes memory _calldata\n )\n override\n public\n fixedGasDiscount(100000)\n returns (\n bool _success,\n bytes memory _returndata\n )\n {\n // CALL updates the CALLER and ADDRESS.\n MessageContext memory nextMessageContext = messageContext;\n nextMessageContext.ovmCALLER = nextMessageContext.ovmADDRESS;\n nextMessageContext.ovmADDRESS = _address;\n\n return _callContract(\n nextMessageContext,\n _gasLimit,\n _address,\n _calldata\n );\n }\n\n /**\n * @notice Overrides STATICCALL.\n * @param _gasLimit Amount of gas to be passed into this call.\n * @param _address Address of the contract to call.\n * @param _calldata Data to send along with the call.\n * @return _success Whether or not the call returned (rather than reverted).\n * @return _returndata Data returned by the call.\n */\n function ovmSTATICCALL(\n uint256 _gasLimit,\n address _address,\n bytes memory _calldata\n )\n override\n public\n fixedGasDiscount(80000)\n returns (\n bool _success,\n bytes memory _returndata\n )\n {\n // STATICCALL updates the CALLER, updates the ADDRESS, and runs in a static context.\n MessageContext memory nextMessageContext = messageContext;\n nextMessageContext.ovmCALLER = nextMessageContext.ovmADDRESS;\n nextMessageContext.ovmADDRESS = _address;\n nextMessageContext.isStatic = true;\n\n return _callContract(\n nextMessageContext,\n _gasLimit,\n _address,\n _calldata\n );\n }\n\n /**\n * @notice Overrides DELEGATECALL.\n * @param _gasLimit Amount of gas to be passed into this call.\n * @param _address Address of the contract to call.\n * @param _calldata Data to send along with the call.\n * @return _success Whether or not the call returned (rather than reverted).\n * @return _returndata Data returned by the call.\n */\n function ovmDELEGATECALL(\n uint256 _gasLimit,\n address _address,\n bytes memory _calldata\n )\n override\n public\n fixedGasDiscount(40000)\n returns (\n bool _success,\n bytes memory _returndata\n )\n {\n // DELEGATECALL does not change anything about the message context.\n MessageContext memory nextMessageContext = messageContext;\n\n return _callContract(\n nextMessageContext,\n _gasLimit,\n _address,\n _calldata\n );\n }\n\n\n /************************************\n * Opcodes: Contract Storage Access *\n ************************************/\n\n /**\n * @notice Overrides SLOAD.\n * @param _key 32 byte key of the storage slot to load.\n * @return _value 32 byte value of the requested storage slot.\n */\n function ovmSLOAD(\n bytes32 _key\n )\n override\n public\n netGasCost(40000)\n returns (\n bytes32 _value\n )\n {\n // We always SLOAD from the storage of ADDRESS.\n address contractAddress = ovmADDRESS();\n\n return _getContractStorage(\n contractAddress,\n _key\n );\n }\n\n /**\n * @notice Overrides SSTORE.\n * @param _key 32 byte key of the storage slot to set.\n * @param _value 32 byte value for the storage slot.\n */\n function ovmSSTORE(\n bytes32 _key,\n bytes32 _value\n )\n override\n public\n notStatic\n netGasCost(60000)\n {\n // We always SSTORE to the storage of ADDRESS.\n address contractAddress = ovmADDRESS();\n\n _putContractStorage(\n contractAddress,\n _key,\n _value\n );\n }\n\n\n /*********************************\n * Opcodes: Contract Code Access *\n *********************************/\n\n /**\n * @notice Overrides EXTCODECOPY.\n * @param _contract Address of the contract to copy code from.\n * @param _offset Offset in bytes from the start of contract code to copy beyond.\n * @param _length Total number of bytes to copy from the contract's code.\n * @return _code Bytes of code copied from the requested contract.\n */\n function ovmEXTCODECOPY(\n address _contract,\n uint256 _offset,\n uint256 _length\n )\n override\n public\n returns (\n bytes memory _code\n )\n {\n // `ovmEXTCODECOPY` is the only overridden opcode capable of producing exactly one byte of\n // return data. By blocking reads of one byte, we're able to use the condition that an\n // OVM_ExecutionManager function return value having a length of exactly one byte indicates\n // an error without an explicit revert. If users were able to read a single byte, they\n // could forcibly trigger behavior that should only be available to this contract.\n uint256 length = _length == 1 ? 2 : _length;\n\n return Lib_EthUtils.getCode(\n _getAccountEthAddress(_contract),\n _offset,\n length\n );\n }\n\n /**\n * @notice Overrides EXTCODESIZE.\n * @param _contract Address of the contract to query the size of.\n * @return _EXTCODESIZE Size of the requested contract in bytes.\n */\n function ovmEXTCODESIZE(\n address _contract\n )\n override\n public\n returns (\n uint256 _EXTCODESIZE\n )\n {\n return Lib_EthUtils.getCodeSize(\n _getAccountEthAddress(_contract)\n );\n }\n\n /**\n * @notice Overrides EXTCODEHASH.\n * @param _contract Address of the contract to query the hash of.\n * @return _EXTCODEHASH Hash of the requested contract.\n */\n function ovmEXTCODEHASH(\n address _contract\n )\n override\n public\n returns (\n bytes32 _EXTCODEHASH\n )\n {\n return Lib_EthUtils.getCodeHash(\n _getAccountEthAddress(_contract)\n );\n }\n\n /***************************************\n * Public Functions: Execution Context *\n ***************************************/\n\n function getMaxTransactionGasLimit()\n external\n view\n override\n returns (\n uint256 _maxTransactionGasLimit\n )\n {\n return gasMeterConfig.maxTransactionGasLimit;\n }\n\n /********************************************\n * Public Functions: Deployment Whitelisting *\n ********************************************/\n\n /**\n * Checks whether the given address is on the whitelist to ovmCREATE/ovmCREATE2, and reverts if not.\n * @param _deployerAddress Address attempting to deploy a contract.\n */\n function _checkDeployerAllowed(\n address _deployerAddress\n )\n internal\n {\n // From an OVM semantics perspective, this will appear identical to\n // the deployer ovmCALLing the whitelist. This is fine--in a sense, we are forcing them to.\n (bool success, bytes memory data) = ovmCALL(\n gasleft(),\n 0x4200000000000000000000000000000000000002,\n abi.encodeWithSignature(\"isDeployerAllowed(address)\", _deployerAddress)\n );\n bool isAllowed = abi.decode(data, (bool));\n\n if (!isAllowed || !success) {\n _revertWithFlag(RevertFlag.CREATOR_NOT_ALLOWED);\n }\n }\n\n /********************************************\n * Internal Functions: Contract Interaction *\n ********************************************/\n\n /**\n * Creates a new contract and associates it with some contract address.\n * @param _contractAddress Address to associate the created contract with.\n * @param _bytecode Bytecode to be used to create the contract.\n * @return Final OVM contract address.\n * @return Revertdata, if and only if the creation threw an exception.\n */\n function _createContract(\n address _contractAddress,\n bytes memory _bytecode\n )\n internal\n returns (\n address,\n bytes memory\n )\n {\n // We always update the nonce of the creating account, even if the creation fails.\n _setAccountNonce(ovmADDRESS(), _getAccountNonce(ovmADDRESS()) + 1);\n\n // We're stepping into a CREATE or CREATE2, so we need to update ADDRESS to point\n // to the contract's associated address and CALLER to point to the previous ADDRESS.\n MessageContext memory nextMessageContext = messageContext;\n nextMessageContext.ovmCALLER = messageContext.ovmADDRESS;\n nextMessageContext.ovmADDRESS = _contractAddress;\n\n // Run the common logic which occurs between call-type and create-type messages,\n // passing in the creation bytecode and `true` to trigger create-specific logic.\n (bool success, bytes memory data) = _handleExternalMessage(\n nextMessageContext,\n gasleft(),\n _contractAddress,\n _bytecode,\n true\n );\n\n // Yellow paper requires that address returned is zero if the contract deployment fails.\n return (\n success ? _contractAddress : address(0),\n data\n );\n }\n\n /**\n * Calls the deployed contract associated with a given address.\n * @param _nextMessageContext Message context to be used for the call.\n * @param _gasLimit Amount of gas to be passed into this call.\n * @param _contract OVM address to be called.\n * @param _calldata Data to send along with the call.\n * @return _success Whether or not the call returned (rather than reverted).\n * @return _returndata Data returned by the call.\n */\n function _callContract(\n MessageContext memory _nextMessageContext,\n uint256 _gasLimit,\n address _contract,\n bytes memory _calldata\n )\n internal\n returns (\n bool _success,\n bytes memory _returndata\n )\n {\n // We reserve addresses of the form 0xdeaddeaddead...NNNN for the container contracts in L2 geth.\n // So, we block calls to these addresses since they are not safe to run as an OVM contract itself.\n if (\n (uint256(_contract) & uint256(0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000))\n == uint256(0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000)\n ) {\n // EVM does not return data in the success case, see: https://github.com/ethereum/go-ethereum/blob/aae7660410f0ef90279e14afaaf2f429fdc2a186/core/vm/instructions.go#L600-L604\n return (true, hex'');\n }\n\n // Both 0x0000... and the EVM precompiles have the same address on L1 and L2 --> no trie lookup needed.\n address codeContractAddress =\n uint(_contract) < 100\n ? _contract\n : _getAccountEthAddress(_contract);\n\n return _handleExternalMessage(\n _nextMessageContext,\n _gasLimit,\n codeContractAddress,\n _calldata,\n false\n );\n }\n\n /**\n * Handles all interactions which involve the execution manager calling out to untrusted code (both calls and creates).\n * Ensures that OVM-related measures are enforced, including L2 gas refunds, nuisance gas, and flagged reversions.\n *\n * @param _nextMessageContext Message context to be used for the external message.\n * @param _gasLimit Amount of gas to be passed into this message.\n * @param _contract OVM address being called or deployed to\n * @param _data Data for the message (either calldata or creation code)\n * @param _isCreate Whether this is a create-type message.\n * @return Whether or not the message (either a call or deployment) succeeded.\n * @return Data returned by the message.\n */\n function _handleExternalMessage(\n MessageContext memory _nextMessageContext,\n uint256 _gasLimit,\n address _contract,\n bytes memory _data,\n bool _isCreate\n )\n internal\n returns (\n bool,\n bytes memory\n )\n {\n // We need to switch over to our next message context for the duration of this call.\n MessageContext memory prevMessageContext = messageContext;\n _switchMessageContext(prevMessageContext, _nextMessageContext);\n\n // Nuisance gas is a system used to bound the ability for an attacker to make fraud proofs\n // expensive by touching a lot of different accounts or storage slots. Since most contracts\n // only use a few storage slots during any given transaction, this shouldn't be a limiting\n // factor.\n uint256 prevNuisanceGasLeft = messageRecord.nuisanceGasLeft;\n uint256 nuisanceGasLimit = _getNuisanceGasLimit(_gasLimit);\n messageRecord.nuisanceGasLeft = nuisanceGasLimit;\n\n // Make the call and make sure to pass in the gas limit. Another instance of hidden\n // complexity. `_contract` is guaranteed to be a safe contract, meaning its return/revert\n // behavior can be controlled. In particular, we enforce that flags are passed through\n // revert data as to retrieve execution metadata that would normally be reverted out of\n // existence.\n\n bool success;\n bytes memory returndata;\n if (_isCreate) {\n // safeCREATE() is a function which replicates a CREATE message, but uses return values\n // Which match that of CALL (i.e. bool, bytes). This allows many security checks to be\n // to be shared between untrusted call and create call frames.\n (success, returndata) = address(this).call(\n abi.encodeWithSelector(\n this.safeCREATE.selector,\n _gasLimit,\n _data,\n _contract\n )\n );\n } else {\n (success, returndata) = _contract.call{gas: _gasLimit}(_data);\n }\n\n // Switch back to the original message context now that we're out of the call.\n _switchMessageContext(_nextMessageContext, prevMessageContext);\n\n // Assuming there were no reverts, the message record should be accurate here. We'll update\n // this value in the case of a revert.\n uint256 nuisanceGasLeft = messageRecord.nuisanceGasLeft;\n\n // Reverts at this point are completely OK, but we need to make a few updates based on the\n // information passed through the revert.\n if (success == false) {\n (\n RevertFlag flag,\n uint256 nuisanceGasLeftPostRevert,\n uint256 ovmGasRefund,\n bytes memory returndataFromFlag\n ) = _decodeRevertData(returndata);\n\n // INVALID_STATE_ACCESS is the only flag that triggers an immediate abort of the\n // parent EVM message. This behavior is necessary because INVALID_STATE_ACCESS must\n // halt any further transaction execution that could impact the execution result.\n if (flag == RevertFlag.INVALID_STATE_ACCESS) {\n _revertWithFlag(flag);\n }\n\n // INTENTIONAL_REVERT, UNSAFE_BYTECODE, STATIC_VIOLATION, and CREATOR_NOT_ALLOWED aren't\n // dependent on the input state, so we can just handle them like standard reverts. Our only change here\n // is to record the gas refund reported by the call (enforced by safety checking).\n if (\n flag == RevertFlag.INTENTIONAL_REVERT\n || flag == RevertFlag.UNSAFE_BYTECODE\n || flag == RevertFlag.STATIC_VIOLATION\n || flag == RevertFlag.CREATOR_NOT_ALLOWED\n ) {\n transactionRecord.ovmGasRefund = ovmGasRefund;\n }\n\n // INTENTIONAL_REVERT needs to pass up the user-provided return data encoded into the\n // flag, *not* the full encoded flag. All other revert types return no data.\n if (\n flag == RevertFlag.INTENTIONAL_REVERT\n || _isCreate\n ) {\n returndata = returndataFromFlag;\n } else {\n returndata = hex'';\n }\n\n // Reverts mean we need to use up whatever \"nuisance gas\" was used by the call.\n // EXCEEDS_NUISANCE_GAS explicitly reduces the remaining nuisance gas for this message\n // to zero. OUT_OF_GAS is a \"pseudo\" flag given that messages return no data when they\n // run out of gas, so we have to treat this like EXCEEDS_NUISANCE_GAS. All other flags\n // will simply pass up the remaining nuisance gas.\n nuisanceGasLeft = nuisanceGasLeftPostRevert;\n }\n\n // We need to reset the nuisance gas back to its original value minus the amount used here.\n messageRecord.nuisanceGasLeft = prevNuisanceGasLeft - (nuisanceGasLimit - nuisanceGasLeft);\n\n return (\n success,\n returndata\n );\n }\n\n /**\n * Handles the creation-specific safety measures required for OVM contract deployment.\n * This function sanitizes the return types for creation messages to match calls (bool, bytes),\n * by being an external function which the EM can call, that mimics the success/fail case of the CREATE.\n * This allows for consistent handling of both types of messages in _handleExternalMessage().\n * Having this step occur as a separate call frame also allows us to easily revert the\n * contract deployment in the event that the code is unsafe.\n *\n * @param _gasLimit Amount of gas to be passed into this creation.\n * @param _creationCode Code to pass into CREATE for deployment.\n * @param _address OVM address being deployed to.\n */\n function safeCREATE(\n uint _gasLimit,\n bytes memory _creationCode,\n address _address\n )\n external\n {\n // The only way this should callable is from within _createContract(),\n // and it should DEFINITELY not be callable by a non-EM code contract.\n if (msg.sender != address(this)) {\n return;\n }\n // Check that there is not already code at this address.\n if (_hasEmptyAccount(_address) == false) {\n // Note: in the EVM, this case burns all allotted gas. For improved\n // developer experience, we do return the remaining gas.\n _revertWithFlag(\n RevertFlag.CREATE_COLLISION,\n Lib_ErrorUtils.encodeRevertString(\"A contract has already been deployed to this address\")\n );\n }\n\n // Check the creation bytecode against the OVM_SafetyChecker.\n if (ovmSafetyChecker.isBytecodeSafe(_creationCode) == false) {\n _revertWithFlag(\n RevertFlag.UNSAFE_BYTECODE,\n Lib_ErrorUtils.encodeRevertString(\"Contract creation code contains unsafe opcodes. Did you use the right compiler or pass an unsafe constructor argument?\")\n );\n }\n\n // We always need to initialize the contract with the default account values.\n _initPendingAccount(_address);\n\n // Actually execute the EVM create message.\n // NOTE: The inline assembly below means we can NOT make any evm calls between here and then.\n address ethAddress = Lib_EthUtils.createContract(_creationCode);\n\n if (ethAddress == address(0)) {\n // If the creation fails, the EVM lets us grab its revert data. This may contain a revert flag\n // to be used above in _handleExternalMessage, so we pass the revert data back up unmodified.\n assembly {\n returndatacopy(0,0,returndatasize())\n revert(0, returndatasize())\n }\n }\n\n // Again simply checking that the deployed code is safe too. Contracts can generate\n // arbitrary deployment code, so there's no easy way to analyze this beforehand.\n bytes memory deployedCode = Lib_EthUtils.getCode(ethAddress);\n if (ovmSafetyChecker.isBytecodeSafe(deployedCode) == false) {\n _revertWithFlag(\n RevertFlag.UNSAFE_BYTECODE,\n Lib_ErrorUtils.encodeRevertString(\"Constructor attempted to deploy unsafe bytecode.\")\n );\n }\n\n // Contract creation didn't need to be reverted and the bytecode is safe. We finish up by\n // associating the desired address with the newly created contract's code hash and address.\n _commitPendingAccount(\n _address,\n ethAddress,\n Lib_EthUtils.getCodeHash(ethAddress)\n );\n }\n\n /******************************************\n * Internal Functions: State Manipulation *\n ******************************************/\n\n /**\n * Checks whether an account exists within the OVM_StateManager.\n * @param _address Address of the account to check.\n * @return _exists Whether or not the account exists.\n */\n function _hasAccount(\n address _address\n )\n internal\n returns (\n bool _exists\n )\n {\n _checkAccountLoad(_address);\n return ovmStateManager.hasAccount(_address);\n }\n\n /**\n * Checks whether a known empty account exists within the OVM_StateManager.\n * @param _address Address of the account to check.\n * @return _exists Whether or not the account empty exists.\n */\n function _hasEmptyAccount(\n address _address\n )\n internal\n returns (\n bool _exists\n )\n {\n _checkAccountLoad(_address);\n return ovmStateManager.hasEmptyAccount(_address);\n }\n\n /**\n * Sets the nonce of an account.\n * @param _address Address of the account to modify.\n * @param _nonce New account nonce.\n */\n function _setAccountNonce(\n address _address,\n uint256 _nonce\n )\n internal\n {\n _checkAccountChange(_address);\n ovmStateManager.setAccountNonce(_address, _nonce);\n }\n\n /**\n * Gets the nonce of an account.\n * @param _address Address of the account to access.\n * @return _nonce Nonce of the account.\n */\n function _getAccountNonce(\n address _address\n )\n internal\n returns (\n uint256 _nonce\n )\n {\n _checkAccountLoad(_address);\n return ovmStateManager.getAccountNonce(_address);\n }\n\n /**\n * Retrieves the Ethereum address of an account.\n * @param _address Address of the account to access.\n * @return _ethAddress Corresponding Ethereum address.\n */\n function _getAccountEthAddress(\n address _address\n )\n internal\n returns (\n address _ethAddress\n )\n {\n _checkAccountLoad(_address);\n return ovmStateManager.getAccountEthAddress(_address);\n }\n\n /**\n * Creates the default account object for the given address.\n * @param _address Address of the account create.\n */\n function _initPendingAccount(\n address _address\n )\n internal\n {\n // Although it seems like `_checkAccountChange` would be more appropriate here, we don't\n // actually consider an account \"changed\" until it's inserted into the state (in this case\n // by `_commitPendingAccount`).\n _checkAccountLoad(_address);\n ovmStateManager.initPendingAccount(_address);\n }\n\n /**\n * Stores additional relevant data for a new account, thereby \"committing\" it to the state.\n * This function is only called during `ovmCREATE` and `ovmCREATE2` after a successful contract\n * creation.\n * @param _address Address of the account to commit.\n * @param _ethAddress Address of the associated deployed contract.\n * @param _codeHash Hash of the code stored at the address.\n */\n function _commitPendingAccount(\n address _address,\n address _ethAddress,\n bytes32 _codeHash\n )\n internal\n {\n _checkAccountChange(_address);\n ovmStateManager.commitPendingAccount(\n _address,\n _ethAddress,\n _codeHash\n );\n }\n\n /**\n * Retrieves the value of a storage slot.\n * @param _contract Address of the contract to query.\n * @param _key 32 byte key of the storage slot.\n * @return _value 32 byte storage slot value.\n */\n function _getContractStorage(\n address _contract,\n bytes32 _key\n )\n internal\n returns (\n bytes32 _value\n )\n {\n _checkContractStorageLoad(_contract, _key);\n return ovmStateManager.getContractStorage(_contract, _key);\n }\n\n /**\n * Sets the value of a storage slot.\n * @param _contract Address of the contract to modify.\n * @param _key 32 byte key of the storage slot.\n * @param _value 32 byte storage slot value.\n */\n function _putContractStorage(\n address _contract,\n bytes32 _key,\n bytes32 _value\n )\n internal\n {\n // We don't set storage if the value didn't change. Although this acts as a convenient\n // optimization, it's also necessary to avoid the case in which a contract with no storage\n // attempts to store the value \"0\" at any key. Putting this value (and therefore requiring\n // that the value be committed into the storage trie after execution) would incorrectly\n // modify the storage root.\n if (_getContractStorage(_contract, _key) == _value) {\n return;\n }\n\n _checkContractStorageChange(_contract, _key);\n ovmStateManager.putContractStorage(_contract, _key, _value);\n }\n\n /**\n * Validation whenever a contract needs to be loaded. Checks that the account exists, charges\n * nuisance gas if the account hasn't been loaded before.\n * @param _address Address of the account to load.\n */\n function _checkAccountLoad(\n address _address\n )\n internal\n {\n // See `_checkContractStorageLoad` for more information.\n if (gasleft() < MIN_GAS_FOR_INVALID_STATE_ACCESS) {\n _revertWithFlag(RevertFlag.OUT_OF_GAS);\n }\n\n // See `_checkContractStorageLoad` for more information.\n if (ovmStateManager.hasAccount(_address) == false) {\n _revertWithFlag(RevertFlag.INVALID_STATE_ACCESS);\n }\n\n // Check whether the account has been loaded before and mark it as loaded if not. We need\n // this because \"nuisance gas\" only applies to the first time that an account is loaded.\n (\n bool _wasAccountAlreadyLoaded\n ) = ovmStateManager.testAndSetAccountLoaded(_address);\n\n // If we hadn't already loaded the account, then we'll need to charge \"nuisance gas\" based\n // on the size of the contract code.\n if (_wasAccountAlreadyLoaded == false) {\n _useNuisanceGas(\n (Lib_EthUtils.getCodeSize(_getAccountEthAddress(_address)) * NUISANCE_GAS_PER_CONTRACT_BYTE) + MIN_NUISANCE_GAS_PER_CONTRACT\n );\n }\n }\n\n /**\n * Validation whenever a contract needs to be changed. Checks that the account exists, charges\n * nuisance gas if the account hasn't been changed before.\n * @param _address Address of the account to change.\n */\n function _checkAccountChange(\n address _address\n )\n internal\n {\n // Start by checking for a load as we only want to charge nuisance gas proportional to\n // contract size once.\n _checkAccountLoad(_address);\n\n // Check whether the account has been changed before and mark it as changed if not. We need\n // this because \"nuisance gas\" only applies to the first time that an account is changed.\n (\n bool _wasAccountAlreadyChanged\n ) = ovmStateManager.testAndSetAccountChanged(_address);\n\n // If we hadn't already loaded the account, then we'll need to charge \"nuisance gas\" based\n // on the size of the contract code.\n if (_wasAccountAlreadyChanged == false) {\n ovmStateManager.incrementTotalUncommittedAccounts();\n _useNuisanceGas(\n (Lib_EthUtils.getCodeSize(_getAccountEthAddress(_address)) * NUISANCE_GAS_PER_CONTRACT_BYTE) + MIN_NUISANCE_GAS_PER_CONTRACT\n );\n }\n }\n\n /**\n * Validation whenever a slot needs to be loaded. Checks that the account exists, charges\n * nuisance gas if the slot hasn't been loaded before.\n * @param _contract Address of the account to load from.\n * @param _key 32 byte key to load.\n */\n function _checkContractStorageLoad(\n address _contract,\n bytes32 _key\n )\n internal\n {\n // Another case of hidden complexity. If we didn't enforce this requirement, then a\n // contract could pass in just enough gas to cause the INVALID_STATE_ACCESS check to fail\n // on L1 but not on L2. A contract could use this behavior to prevent the\n // OVM_ExecutionManager from detecting an invalid state access. Reverting with OUT_OF_GAS\n // allows us to also charge for the full message nuisance gas, because you deserve that for\n // trying to break the contract in this way.\n if (gasleft() < MIN_GAS_FOR_INVALID_STATE_ACCESS) {\n _revertWithFlag(RevertFlag.OUT_OF_GAS);\n }\n\n // We need to make sure that the transaction isn't trying to access storage that hasn't\n // been provided to the OVM_StateManager. We'll immediately abort if this is the case.\n // We know that we have enough gas to do this check because of the above test.\n if (ovmStateManager.hasContractStorage(_contract, _key) == false) {\n _revertWithFlag(RevertFlag.INVALID_STATE_ACCESS);\n }\n\n // Check whether the slot has been loaded before and mark it as loaded if not. We need\n // this because \"nuisance gas\" only applies to the first time that a slot is loaded.\n (\n bool _wasContractStorageAlreadyLoaded\n ) = ovmStateManager.testAndSetContractStorageLoaded(_contract, _key);\n\n // If we hadn't already loaded the account, then we'll need to charge some fixed amount of\n // \"nuisance gas\".\n if (_wasContractStorageAlreadyLoaded == false) {\n _useNuisanceGas(NUISANCE_GAS_SLOAD);\n }\n }\n\n /**\n * Validation whenever a slot needs to be changed. Checks that the account exists, charges\n * nuisance gas if the slot hasn't been changed before.\n * @param _contract Address of the account to change.\n * @param _key 32 byte key to change.\n */\n function _checkContractStorageChange(\n address _contract,\n bytes32 _key\n )\n internal\n {\n // Start by checking for load to make sure we have the storage slot and that we charge the\n // \"nuisance gas\" necessary to prove the storage slot state.\n _checkContractStorageLoad(_contract, _key);\n\n // Check whether the slot has been changed before and mark it as changed if not. We need\n // this because \"nuisance gas\" only applies to the first time that a slot is changed.\n (\n bool _wasContractStorageAlreadyChanged\n ) = ovmStateManager.testAndSetContractStorageChanged(_contract, _key);\n\n // If we hadn't already changed the account, then we'll need to charge some fixed amount of\n // \"nuisance gas\".\n if (_wasContractStorageAlreadyChanged == false) {\n // Changing a storage slot means that we're also going to have to change the\n // corresponding account, so do an account change check.\n _checkAccountChange(_contract);\n\n ovmStateManager.incrementTotalUncommittedContractStorage();\n _useNuisanceGas(NUISANCE_GAS_SSTORE);\n }\n }\n\n\n /************************************\n * Internal Functions: Revert Logic *\n ************************************/\n\n /**\n * Simple encoding for revert data.\n * @param _flag Flag to revert with.\n * @param _data Additional user-provided revert data.\n * @return _revertdata Encoded revert data.\n */\n function _encodeRevertData(\n RevertFlag _flag,\n bytes memory _data\n )\n internal\n view\n returns (\n bytes memory _revertdata\n )\n {\n // Out of gas and create exceptions will fundamentally return no data, so simulating it shouldn't either.\n if (\n _flag == RevertFlag.OUT_OF_GAS\n ) {\n return bytes('');\n }\n\n // INVALID_STATE_ACCESS doesn't need to return any data other than the flag.\n if (_flag == RevertFlag.INVALID_STATE_ACCESS) {\n return abi.encode(\n _flag,\n 0,\n 0,\n bytes('')\n );\n }\n\n // Just ABI encode the rest of the parameters.\n return abi.encode(\n _flag,\n messageRecord.nuisanceGasLeft,\n transactionRecord.ovmGasRefund,\n _data\n );\n }\n\n /**\n * Simple decoding for revert data.\n * @param _revertdata Revert data to decode.\n * @return _flag Flag used to revert.\n * @return _nuisanceGasLeft Amount of nuisance gas unused by the message.\n * @return _ovmGasRefund Amount of gas refunded during the message.\n * @return _data Additional user-provided revert data.\n */\n function _decodeRevertData(\n bytes memory _revertdata\n )\n internal\n pure\n returns (\n RevertFlag _flag,\n uint256 _nuisanceGasLeft,\n uint256 _ovmGasRefund,\n bytes memory _data\n )\n {\n // A length of zero means the call ran out of gas, just return empty data.\n if (_revertdata.length == 0) {\n return (\n RevertFlag.OUT_OF_GAS,\n 0,\n 0,\n bytes('')\n );\n }\n\n // ABI decode the incoming data.\n return abi.decode(_revertdata, (RevertFlag, uint256, uint256, bytes));\n }\n\n /**\n * Causes a message to revert or abort.\n * @param _flag Flag to revert with.\n * @param _data Additional user-provided data.\n */\n function _revertWithFlag(\n RevertFlag _flag,\n bytes memory _data\n )\n internal\n view\n {\n bytes memory revertdata = _encodeRevertData(\n _flag,\n _data\n );\n\n assembly {\n revert(add(revertdata, 0x20), mload(revertdata))\n }\n }\n\n /**\n * Causes a message to revert or abort.\n * @param _flag Flag to revert with.\n */\n function _revertWithFlag(\n RevertFlag _flag\n )\n internal\n {\n _revertWithFlag(_flag, bytes(''));\n }\n\n\n /******************************************\n * Internal Functions: Nuisance Gas Logic *\n ******************************************/\n\n /**\n * Computes the nuisance gas limit from the gas limit.\n * @dev This function is currently using a naive implementation whereby the nuisance gas limit\n * is set to exactly equal the lesser of the gas limit or remaining gas. It's likely that\n * this implementation is perfectly fine, but we may change this formula later.\n * @param _gasLimit Gas limit to compute from.\n * @return _nuisanceGasLimit Computed nuisance gas limit.\n */\n function _getNuisanceGasLimit(\n uint256 _gasLimit\n )\n internal\n view\n returns (\n uint256 _nuisanceGasLimit\n )\n {\n return _gasLimit < gasleft() ? _gasLimit : gasleft();\n }\n\n /**\n * Uses a certain amount of nuisance gas.\n * @param _amount Amount of nuisance gas to use.\n */\n function _useNuisanceGas(\n uint256 _amount\n )\n internal\n {\n // Essentially the same as a standard OUT_OF_GAS, except we also retain a record of the gas\n // refund to be given at the end of the transaction.\n if (messageRecord.nuisanceGasLeft < _amount) {\n _revertWithFlag(RevertFlag.EXCEEDS_NUISANCE_GAS);\n }\n\n messageRecord.nuisanceGasLeft -= _amount;\n }\n\n\n /************************************\n * Internal Functions: Gas Metering *\n ************************************/\n\n /**\n * Checks whether a transaction needs to start a new epoch and does so if necessary.\n * @param _timestamp Transaction timestamp.\n */\n function _checkNeedsNewEpoch(\n uint256 _timestamp\n )\n internal\n {\n if (\n _timestamp >= (\n _getGasMetadata(GasMetadataKey.CURRENT_EPOCH_START_TIMESTAMP)\n + gasMeterConfig.secondsPerEpoch\n )\n ) {\n _putGasMetadata(\n GasMetadataKey.CURRENT_EPOCH_START_TIMESTAMP,\n _timestamp\n );\n\n _putGasMetadata(\n GasMetadataKey.PREV_EPOCH_SEQUENCER_QUEUE_GAS,\n _getGasMetadata(\n GasMetadataKey.CUMULATIVE_SEQUENCER_QUEUE_GAS\n )\n );\n\n _putGasMetadata(\n GasMetadataKey.PREV_EPOCH_L1TOL2_QUEUE_GAS,\n _getGasMetadata(\n GasMetadataKey.CUMULATIVE_L1TOL2_QUEUE_GAS\n )\n );\n }\n }\n\n /**\n * Validates the input values of a transaction.\n * @return _valid Whether or not the transaction data is valid.\n */\n function _isValidInput(\n Lib_OVMCodec.Transaction memory _transaction\n )\n view\n internal\n returns (\n bool\n )\n {\n // Prevent reentrancy to run():\n // This check prevents calling run with the default ovmNumber.\n // Combined with the first check in run():\n // if (transactionContext.ovmNUMBER != DEFAULT_UINT256) { return; }\n // It should be impossible to re-enter since run() returns before any other call frames are created.\n // Since this value is already being written to storage, we save much gas compared to\n // using the standard nonReentrant pattern.\n if (_transaction.blockNumber == DEFAULT_UINT256) {\n return false;\n }\n\n if (_isValidGasLimit(_transaction.gasLimit, _transaction.l1QueueOrigin) == false) {\n return false;\n }\n\n return true;\n }\n\n /**\n * Validates the gas limit for a given transaction.\n * @param _gasLimit Gas limit provided by the transaction.\n * param _queueOrigin Queue from which the transaction originated.\n * @return _valid Whether or not the gas limit is valid.\n */\n function _isValidGasLimit(\n uint256 _gasLimit,\n Lib_OVMCodec.QueueOrigin // _queueOrigin\n )\n view\n internal\n returns (\n bool _valid\n )\n {\n // Always have to be below the maximum gas limit.\n if (_gasLimit > gasMeterConfig.maxTransactionGasLimit) {\n return false;\n }\n\n // Always have to be above the minimum gas limit.\n if (_gasLimit < gasMeterConfig.minTransactionGasLimit) {\n return false;\n }\n\n // TEMPORARY: Gas metering is disabled for minnet.\n return true;\n // GasMetadataKey cumulativeGasKey;\n // GasMetadataKey prevEpochGasKey;\n // if (_queueOrigin == Lib_OVMCodec.QueueOrigin.SEQUENCER_QUEUE) {\n // cumulativeGasKey = GasMetadataKey.CUMULATIVE_SEQUENCER_QUEUE_GAS;\n // prevEpochGasKey = GasMetadataKey.PREV_EPOCH_SEQUENCER_QUEUE_GAS;\n // } else {\n // cumulativeGasKey = GasMetadataKey.CUMULATIVE_L1TOL2_QUEUE_GAS;\n // prevEpochGasKey = GasMetadataKey.PREV_EPOCH_L1TOL2_QUEUE_GAS;\n // }\n\n // return (\n // (\n // _getGasMetadata(cumulativeGasKey)\n // - _getGasMetadata(prevEpochGasKey)\n // + _gasLimit\n // ) < gasMeterConfig.maxGasPerQueuePerEpoch\n // );\n }\n\n /**\n * Updates the cumulative gas after a transaction.\n * @param _gasUsed Gas used by the transaction.\n * @param _queueOrigin Queue from which the transaction originated.\n */\n function _updateCumulativeGas(\n uint256 _gasUsed,\n Lib_OVMCodec.QueueOrigin _queueOrigin\n )\n internal\n {\n GasMetadataKey cumulativeGasKey;\n if (_queueOrigin == Lib_OVMCodec.QueueOrigin.SEQUENCER_QUEUE) {\n cumulativeGasKey = GasMetadataKey.CUMULATIVE_SEQUENCER_QUEUE_GAS;\n } else {\n cumulativeGasKey = GasMetadataKey.CUMULATIVE_L1TOL2_QUEUE_GAS;\n }\n\n _putGasMetadata(\n cumulativeGasKey,\n (\n _getGasMetadata(cumulativeGasKey)\n + gasMeterConfig.minTransactionGasLimit\n + _gasUsed\n - transactionRecord.ovmGasRefund\n )\n );\n }\n\n /**\n * Retrieves the value of a gas metadata key.\n * @param _key Gas metadata key to retrieve.\n * @return _value Value stored at the given key.\n */\n function _getGasMetadata(\n GasMetadataKey _key\n )\n internal\n returns (\n uint256 _value\n )\n {\n return uint256(_getContractStorage(\n GAS_METADATA_ADDRESS,\n bytes32(uint256(_key))\n ));\n }\n\n /**\n * Sets the value of a gas metadata key.\n * @param _key Gas metadata key to set.\n * @param _value Value to store at the given key.\n */\n function _putGasMetadata(\n GasMetadataKey _key,\n uint256 _value\n )\n internal\n {\n _putContractStorage(\n GAS_METADATA_ADDRESS,\n bytes32(uint256(_key)),\n bytes32(uint256(_value))\n );\n }\n\n\n /*****************************************\n * Internal Functions: Execution Context *\n *****************************************/\n\n /**\n * Swaps over to a new message context.\n * @param _prevMessageContext Context we're switching from.\n * @param _nextMessageContext Context we're switching to.\n */\n function _switchMessageContext(\n MessageContext memory _prevMessageContext,\n MessageContext memory _nextMessageContext\n )\n internal\n {\n // Avoid unnecessary the SSTORE.\n if (_prevMessageContext.ovmCALLER != _nextMessageContext.ovmCALLER) {\n messageContext.ovmCALLER = _nextMessageContext.ovmCALLER;\n }\n\n // Avoid unnecessary the SSTORE.\n if (_prevMessageContext.ovmADDRESS != _nextMessageContext.ovmADDRESS) {\n messageContext.ovmADDRESS = _nextMessageContext.ovmADDRESS;\n }\n\n // Avoid unnecessary the SSTORE.\n if (_prevMessageContext.isStatic != _nextMessageContext.isStatic) {\n messageContext.isStatic = _nextMessageContext.isStatic;\n }\n }\n\n /**\n * Initializes the execution context.\n * @param _transaction OVM transaction being executed.\n */\n function _initContext(\n Lib_OVMCodec.Transaction memory _transaction\n )\n internal\n {\n transactionContext.ovmTIMESTAMP = _transaction.timestamp;\n transactionContext.ovmNUMBER = _transaction.blockNumber;\n transactionContext.ovmTXGASLIMIT = _transaction.gasLimit;\n transactionContext.ovmL1QUEUEORIGIN = _transaction.l1QueueOrigin;\n transactionContext.ovmL1TXORIGIN = _transaction.l1TxOrigin;\n transactionContext.ovmGASLIMIT = gasMeterConfig.maxGasPerQueuePerEpoch;\n\n messageRecord.nuisanceGasLeft = _getNuisanceGasLimit(_transaction.gasLimit);\n }\n\n /**\n * Resets the transaction and message context.\n */\n function _resetContext()\n internal\n {\n transactionContext.ovmL1TXORIGIN = DEFAULT_ADDRESS;\n transactionContext.ovmTIMESTAMP = DEFAULT_UINT256;\n transactionContext.ovmNUMBER = DEFAULT_UINT256;\n transactionContext.ovmGASLIMIT = DEFAULT_UINT256;\n transactionContext.ovmTXGASLIMIT = DEFAULT_UINT256;\n transactionContext.ovmL1QUEUEORIGIN = Lib_OVMCodec.QueueOrigin.SEQUENCER_QUEUE;\n\n transactionRecord.ovmGasRefund = DEFAULT_UINT256;\n\n messageContext.ovmCALLER = DEFAULT_ADDRESS;\n messageContext.ovmADDRESS = DEFAULT_ADDRESS;\n messageContext.isStatic = false;\n\n messageRecord.nuisanceGasLeft = DEFAULT_UINT256;\n\n // Reset the ovmStateManager.\n ovmStateManager = iOVM_StateManager(address(0));\n }\n\n /*****************************\n * L2-only Helper Functions *\n *****************************/\n\n /**\n * Unreachable helper function for simulating eth_calls with an OVM message context.\n * This function will throw an exception in all cases other than when used as a custom entrypoint in L2 Geth to simulate eth_call.\n * @param _transaction the message transaction to simulate.\n * @param _from the OVM account the simulated call should be from.\n */\n function simulateMessage(\n Lib_OVMCodec.Transaction memory _transaction,\n address _from,\n iOVM_StateManager _ovmStateManager\n )\n external\n returns (\n bool,\n bytes memory\n )\n {\n // Prevent this call from having any effect unless in a custom-set VM frame\n require(msg.sender == address(0));\n\n ovmStateManager = _ovmStateManager;\n _initContext(_transaction);\n messageRecord.nuisanceGasLeft = uint(-1);\n\n messageContext.ovmADDRESS = _from;\n\n bool isCreate = _transaction.entrypoint == address(0);\n if (isCreate) {\n (address created, bytes memory revertData) = ovmCREATE(_transaction.data);\n if (created == address(0)) {\n return (false, revertData);\n } else {\n // The eth_call RPC endpoint for to = undefined will return the deployed bytecode\n // in the success case, differing from standard create messages.\n return (true, Lib_EthUtils.getCode(created));\n }\n } else {\n return ovmCALL(\n _transaction.gasLimit,\n _transaction.entrypoint,\n _transaction.data\n );\n }\n }\n}\n" + }, + "@openzeppelin/contracts/math/Math.sol": { + "content": "// SPDX-License-Identifier: MIT\n\npragma solidity >=0.6.0 <0.8.0;\n\n/**\n * @dev Standard math utilities missing in the Solidity language.\n */\nlibrary Math {\n /**\n * @dev Returns the largest of two numbers.\n */\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\n return a >= b ? a : b;\n }\n\n /**\n * @dev Returns the smallest of two numbers.\n */\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return a < b ? a : b;\n }\n\n /**\n * @dev Returns the average of two numbers. The result is rounded towards\n * zero.\n */\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b) / 2 can overflow, so we distribute\n return (a / 2) + (b / 2) + ((a % 2 + b % 2) / 2);\n }\n}\n" + }, + "contracts/optimistic-ethereum/iOVM/execution/iOVM_SafetyChecker.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/**\n * @title iOVM_SafetyChecker\n */\ninterface iOVM_SafetyChecker {\n\n /********************\n * Public Functions *\n ********************/\n\n function isBytecodeSafe(bytes calldata _bytecode) external pure returns (bool);\n}\n" + }, + "contracts/optimistic-ethereum/OVM/predeploys/OVM_DeployerWhitelist.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Interface Imports */\nimport { iOVM_DeployerWhitelist } from \"../../iOVM/predeploys/iOVM_DeployerWhitelist.sol\";\n\n/**\n * @title OVM_DeployerWhitelist\n * @dev The Deployer Whitelist is a temporary predeploy used to provide additional safety during the\n * initial phases of our mainnet roll out. It is owned by the Optimism team, and defines accounts\n * which are allowed to deploy contracts on Layer2. The Execution Manager will only allow an\n * ovmCREATE or ovmCREATE2 operation to proceed if the deployer's address whitelisted.\n *\n * Compiler used: optimistic-solc\n * Runtime target: OVM\n */\ncontract OVM_DeployerWhitelist is iOVM_DeployerWhitelist {\n\n /**********************\n * Contract Constants *\n **********************/\n\n bool public initialized;\n bool public allowArbitraryDeployment;\n address override public owner;\n mapping (address => bool) public whitelist;\n\n\n /**********************\n * Function Modifiers *\n **********************/\n\n /**\n * Blocks functions to anyone except the contract owner.\n */\n modifier onlyOwner() {\n require(\n msg.sender == owner,\n \"Function can only be called by the owner of this contract.\"\n );\n _;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Initializes the whitelist.\n * @param _owner Address of the owner for this contract.\n * @param _allowArbitraryDeployment Whether or not to allow arbitrary contract deployment.\n */\n function initialize(\n address _owner,\n bool _allowArbitraryDeployment\n )\n override\n public\n {\n if (initialized == true) {\n return;\n }\n\n initialized = true;\n allowArbitraryDeployment = _allowArbitraryDeployment;\n owner = _owner;\n }\n\n /**\n * Adds or removes an address from the deployment whitelist.\n * @param _deployer Address to update permissions for.\n * @param _isWhitelisted Whether or not the address is whitelisted.\n */\n function setWhitelistedDeployer(\n address _deployer,\n bool _isWhitelisted\n )\n override\n public\n onlyOwner\n {\n whitelist[_deployer] = _isWhitelisted;\n }\n\n /**\n * Updates the owner of this contract.\n * @param _owner Address of the new owner.\n */\n function setOwner(\n address _owner\n )\n override\n public\n onlyOwner\n {\n owner = _owner;\n }\n\n /**\n * Updates the arbitrary deployment flag.\n * @param _allowArbitraryDeployment Whether or not to allow arbitrary contract deployment.\n */\n function setAllowArbitraryDeployment(\n bool _allowArbitraryDeployment\n )\n override\n public\n onlyOwner\n {\n allowArbitraryDeployment = _allowArbitraryDeployment;\n }\n\n /**\n * Permanently enables arbitrary contract deployment and deletes the owner.\n */\n function enableArbitraryContractDeployment()\n override\n public\n onlyOwner\n {\n setAllowArbitraryDeployment(true);\n setOwner(address(0));\n }\n\n /**\n * Checks whether an address is allowed to deploy contracts.\n * @param _deployer Address to check.\n * @return _allowed Whether or not the address can deploy contracts.\n */\n function isDeployerAllowed(\n address _deployer\n )\n override\n public\n returns (\n bool\n )\n {\n return (\n initialized == false\n || allowArbitraryDeployment == true\n || whitelist[_deployer]\n );\n }\n}\n" + }, + "contracts/optimistic-ethereum/iOVM/predeploys/iOVM_DeployerWhitelist.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/**\n * @title iOVM_DeployerWhitelist\n */\ninterface iOVM_DeployerWhitelist {\n\n /********************\n * Public Functions *\n ********************/\n\n function initialize(address _owner, bool _allowArbitraryDeployment) external;\n function owner() external returns (address _owner);\n function setWhitelistedDeployer(address _deployer, bool _isWhitelisted) external;\n function setOwner(address _newOwner) external;\n function setAllowArbitraryDeployment(bool _allowArbitraryDeployment) external;\n function enableArbitraryContractDeployment() external;\n function isDeployerAllowed(address _deployer) external returns (bool _allowed);\n}\n" + }, + "contracts/optimistic-ethereum/OVM/execution/OVM_SafetyChecker.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Interface Imports */\nimport { iOVM_SafetyChecker } from \"../../iOVM/execution/iOVM_SafetyChecker.sol\";\n\n/**\n * @title OVM_SafetyChecker\n * @dev The Safety Checker verifies that contracts deployed on L2 do not contain any\n * \"unsafe\" operations. An operation is considered unsafe if it would access state variables which\n * are specific to the environment (ie. L1 or L2) in which it is executed, as this could be used\n * to \"escape the sandbox\" of the OVM, resulting in non-deterministic fraud proofs.\n * That is, an attacker would be able to \"prove fraud\" on an honestly applied transaction.\n * Note that a \"safe\" contract requires opcodes to appear in a particular pattern;\n * omission of \"unsafe\" opcodes is necessary, but not sufficient.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract OVM_SafetyChecker is iOVM_SafetyChecker {\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Returns whether or not all of the provided bytecode is safe.\n * @param _bytecode The bytecode to safety check.\n * @return `true` if the bytecode is safe, `false` otherwise.\n */\n function isBytecodeSafe(\n bytes memory _bytecode\n )\n override\n external\n pure\n returns (\n bool\n )\n {\n // autogenerated by gen_safety_checker_constants.py\n // number of bytes to skip for each opcode\n uint256[8] memory opcodeSkippableBytes = [\n uint256(0x0001010101010101010101010000000001010101010101010101010101010000),\n uint256(0x0100000000000000000000000000000000000000010101010101000000010100),\n uint256(0x0000000000000000000000000000000001010101000000010101010100000000),\n uint256(0x0203040500000000000000000000000000000000000000000000000000000000),\n uint256(0x0101010101010101010101010101010101010101010101010101010101010101),\n uint256(0x0101010101000000000000000000000000000000000000000000000000000000),\n uint256(0x0000000000000000000000000000000000000000000000000000000000000000),\n uint256(0x0000000000000000000000000000000000000000000000000000000000000000)\n ];\n // Mask to gate opcode specific cases\n uint256 opcodeGateMask = ~uint256(0xffffffffffffffffffffffe000000000fffffffff070ffff9c0ffffec000f001);\n // Halting opcodes\n uint256 opcodeHaltingMask = ~uint256(0x4008000000000000000000000000000000000000004000000000000000000001);\n // PUSH opcodes\n uint256 opcodePushMask = ~uint256(0xffffffff000000000000000000000000);\n\n uint256 codeLength;\n uint256 _pc;\n assembly {\n _pc := add(_bytecode, 0x20)\n }\n codeLength = _pc + _bytecode.length;\n do {\n // current opcode: 0x00...0xff\n uint256 opNum;\n\n // inline assembly removes the extra add + bounds check\n assembly {\n let word := mload(_pc) //load the next 32 bytes at pc into word\n\n // Look up number of bytes to skip from opcodeSkippableBytes and then update indexInWord\n // E.g. the 02030405 in opcodeSkippableBytes is the number of bytes to skip for PUSH1->4\n // We repeat this 6 times, thus we can only skip bytes for up to PUSH4 ((1+4) * 6 = 30 < 32).\n // If we see an opcode that is listed as 0 skippable bytes e.g. PUSH5,\n // then we will get stuck on that indexInWord and then opNum will be set to the PUSH5 opcode.\n let indexInWord := byte(0, mload(add(opcodeSkippableBytes, byte(0, word))))\n indexInWord := add(indexInWord, byte(0, mload(add(opcodeSkippableBytes, byte(indexInWord, word)))))\n indexInWord := add(indexInWord, byte(0, mload(add(opcodeSkippableBytes, byte(indexInWord, word)))))\n indexInWord := add(indexInWord, byte(0, mload(add(opcodeSkippableBytes, byte(indexInWord, word)))))\n indexInWord := add(indexInWord, byte(0, mload(add(opcodeSkippableBytes, byte(indexInWord, word)))))\n indexInWord := add(indexInWord, byte(0, mload(add(opcodeSkippableBytes, byte(indexInWord, word)))))\n _pc := add(_pc, indexInWord)\n\n opNum := byte(indexInWord, word)\n }\n\n // + push opcodes\n // + stop opcodes [STOP(0x00),JUMP(0x56),RETURN(0xf3),INVALID(0xfe)]\n // + caller opcode CALLER(0x33)\n // + blacklisted opcodes\n uint256 opBit = 1 << opNum;\n if (opBit & opcodeGateMask == 0) {\n if (opBit & opcodePushMask == 0) {\n // all pushes are valid opcodes\n // subsequent bytes are not opcodes. Skip them.\n _pc += (opNum - 0x5e); // PUSH1 is 0x60, so opNum-0x5f = PUSHed bytes and we +1 to\n // skip the _pc++; line below in order to save gas ((-0x5f + 1) = -0x5e)\n continue;\n } else if (opBit & opcodeHaltingMask == 0) {\n // STOP or JUMP or RETURN or INVALID (Note: REVERT is blacklisted, so not included here)\n // We are now inside unreachable code until we hit a JUMPDEST!\n do {\n _pc++;\n assembly {\n opNum := byte(0, mload(_pc))\n }\n // encountered a JUMPDEST\n if (opNum == 0x5b) break;\n // skip PUSHed bytes\n if ((1 << opNum) & opcodePushMask == 0) _pc += (opNum - 0x5f); // opNum-0x5f = PUSHed bytes (PUSH1 is 0x60)\n } while (_pc < codeLength);\n // opNum is 0x5b, so we don't continue here since the pc++ is fine\n } else if (opNum == 0x33) { // Caller opcode\n uint256 firstOps; // next 32 bytes of bytecode\n uint256 secondOps; // following 32 bytes of bytecode\n\n assembly {\n firstOps := mload(_pc)\n // 37 bytes total, 5 left over --> 32 - 5 bytes = 27 bytes = 216 bits\n secondOps := shr(216, mload(add(_pc, 0x20)))\n }\n\n // Call identity precompile\n // CALLER POP PUSH1 0x00 PUSH1 0x04 GAS CALL\n // 32 - 8 bytes = 24 bytes = 192\n if ((firstOps >> 192) == 0x3350600060045af1) {\n _pc += 8;\n // Call EM and abort execution if instructed\n // CALLER PUSH1 0x00 SWAP1 GAS CALL PC PUSH1 0x0E ADD JUMPI RETURNDATASIZE PUSH1 0x00 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x00 REVERT JUMPDEST RETURNDATASIZE PUSH1 0x01 EQ ISZERO PC PUSH1 0x0a ADD JUMPI PUSH1 0x01 PUSH1 0x00 RETURN JUMPDEST\n } else if (firstOps == 0x336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a015760 && secondOps == 0x016000f35b) {\n _pc += 37;\n } else {\n return false;\n }\n continue;\n } else {\n // encountered a non-whitelisted opcode!\n return false;\n }\n }\n _pc++;\n } while (_pc < codeLength);\n return true;\n }\n}\n" + }, + "contracts/optimistic-ethereum/OVM/execution/OVM_StateManagerFactory.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Interface Imports */\nimport { iOVM_StateManager } from \"../../iOVM/execution/iOVM_StateManager.sol\";\nimport { iOVM_StateManagerFactory } from \"../../iOVM/execution/iOVM_StateManagerFactory.sol\";\n\n/* Contract Imports */\nimport { OVM_StateManager } from \"./OVM_StateManager.sol\";\n\n/**\n * @title OVM_StateManagerFactory\n * @dev The State Manager Factory is called by a State Transitioner's init code, to create a new\n * State Manager for use in the Fraud Verification process.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract OVM_StateManagerFactory is iOVM_StateManagerFactory {\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Creates a new OVM_StateManager\n * @param _owner Owner of the created contract.\n * @return New OVM_StateManager instance.\n */\n function create(\n address _owner\n )\n override\n public\n returns (\n iOVM_StateManager\n )\n {\n return new OVM_StateManager(_owner);\n }\n}\n" + }, + "contracts/optimistic-ethereum/OVM/execution/OVM_StateManager.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/* Interface Imports */\nimport { iOVM_StateManager } from \"../../iOVM/execution/iOVM_StateManager.sol\";\n\n/**\n * @title OVM_StateManager\n * @dev The State Manager contract holds all storage values for contracts in the OVM. It can only be written to by the\n * the Execution Manager and State Transitioner. It runs on L1 during the setup and execution of a fraud proof.\n * The same logic runs on L2, but has been implemented as a precompile in the L2 go-ethereum client\n * (see https://github.com/ethereum-optimism/go-ethereum/blob/master/core/vm/ovm_state_manager.go).\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract OVM_StateManager is iOVM_StateManager {\n\n /*************\n * Constants *\n *************/\n\n bytes32 constant internal EMPTY_ACCOUNT_STORAGE_ROOT = 0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421;\n bytes32 constant internal EMPTY_ACCOUNT_CODE_HASH = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;\n bytes32 constant internal STORAGE_XOR_VALUE = 0xFEEDFACECAFEBEEFFEEDFACECAFEBEEFFEEDFACECAFEBEEFFEEDFACECAFEBEEF;\n\n\n /*************\n * Variables *\n *************/\n\n address override public owner;\n address override public ovmExecutionManager;\n mapping (address => Lib_OVMCodec.Account) internal accounts;\n mapping (address => mapping (bytes32 => bytes32)) internal contractStorage;\n mapping (address => mapping (bytes32 => bool)) internal verifiedContractStorage;\n mapping (bytes32 => ItemState) internal itemStates;\n uint256 internal totalUncommittedAccounts;\n uint256 internal totalUncommittedContractStorage;\n\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _owner Address of the owner of this contract.\n */\n constructor(\n address _owner\n )\n {\n owner = _owner;\n }\n\n\n /**********************\n * Function Modifiers *\n **********************/\n\n /**\n * Simple authentication, this contract should only be accessible to the owner (which is expected to be the State Transitioner during `PRE_EXECUTION`\n * or the OVM_ExecutionManager during transaction execution.\n */\n modifier authenticated() {\n // owner is the State Transitioner\n require(\n msg.sender == owner || msg.sender == ovmExecutionManager,\n \"Function can only be called by authenticated addresses\"\n );\n _;\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Checks whether a given address is allowed to modify this contract.\n * @param _address Address to check.\n * @return Whether or not the address can modify this contract.\n */\n function isAuthenticated(\n address _address\n )\n override\n public\n view\n returns (\n bool\n )\n {\n return (_address == owner || _address == ovmExecutionManager);\n }\n\n /**\n * Sets the address of the OVM_ExecutionManager.\n * @param _ovmExecutionManager Address of the OVM_ExecutionManager.\n */\n function setExecutionManager(\n address _ovmExecutionManager\n )\n override\n public\n authenticated\n {\n ovmExecutionManager = _ovmExecutionManager;\n }\n\n /**\n * Inserts an account into the state.\n * @param _address Address of the account to insert.\n * @param _account Account to insert for the given address.\n */\n function putAccount(\n address _address,\n Lib_OVMCodec.Account memory _account\n )\n override\n public\n authenticated\n {\n accounts[_address] = _account;\n }\n\n /**\n * Marks an account as empty.\n * @param _address Address of the account to mark.\n */\n function putEmptyAccount(\n address _address\n )\n override\n public\n authenticated\n {\n Lib_OVMCodec.Account storage account = accounts[_address];\n account.storageRoot = EMPTY_ACCOUNT_STORAGE_ROOT;\n account.codeHash = EMPTY_ACCOUNT_CODE_HASH;\n }\n\n /**\n * Retrieves an account from the state.\n * @param _address Address of the account to retrieve.\n * @return Account for the given address.\n */\n function getAccount(\n address _address\n )\n override\n public\n view\n returns (\n Lib_OVMCodec.Account memory\n )\n {\n return accounts[_address];\n }\n\n /**\n * Checks whether the state has a given account.\n * @param _address Address of the account to check.\n * @return Whether or not the state has the account.\n */\n function hasAccount(\n address _address\n )\n override\n public\n view\n returns (\n bool\n )\n {\n return accounts[_address].codeHash != bytes32(0);\n }\n\n /**\n * Checks whether the state has a given known empty account.\n * @param _address Address of the account to check.\n * @return Whether or not the state has the empty account.\n */\n function hasEmptyAccount(\n address _address\n )\n override\n public\n view\n returns (\n bool\n )\n {\n return (\n accounts[_address].codeHash == EMPTY_ACCOUNT_CODE_HASH\n && accounts[_address].nonce == 0\n );\n }\n\n /**\n * Sets the nonce of an account.\n * @param _address Address of the account to modify.\n * @param _nonce New account nonce.\n */\n function setAccountNonce(\n address _address,\n uint256 _nonce\n )\n override\n public\n authenticated\n {\n accounts[_address].nonce = _nonce;\n }\n\n /**\n * Gets the nonce of an account.\n * @param _address Address of the account to access.\n * @return Nonce of the account.\n */\n function getAccountNonce(\n address _address\n )\n override\n public\n view\n returns (\n uint256\n )\n {\n return accounts[_address].nonce;\n }\n\n /**\n * Retrieves the Ethereum address of an account.\n * @param _address Address of the account to access.\n * @return Corresponding Ethereum address.\n */\n function getAccountEthAddress(\n address _address\n )\n override\n public\n view\n returns (\n address\n )\n {\n return accounts[_address].ethAddress;\n }\n\n /**\n * Retrieves the storage root of an account.\n * @param _address Address of the account to access.\n * @return Corresponding storage root.\n */\n function getAccountStorageRoot(\n address _address\n )\n override\n public\n view\n returns (\n bytes32\n )\n {\n return accounts[_address].storageRoot;\n }\n\n /**\n * Initializes a pending account (during CREATE or CREATE2) with the default values.\n * @param _address Address of the account to initialize.\n */\n function initPendingAccount(\n address _address\n )\n override\n public\n authenticated\n {\n Lib_OVMCodec.Account storage account = accounts[_address];\n account.nonce = 1;\n account.storageRoot = EMPTY_ACCOUNT_STORAGE_ROOT;\n account.codeHash = EMPTY_ACCOUNT_CODE_HASH;\n account.isFresh = true;\n }\n\n /**\n * Finalizes the creation of a pending account (during CREATE or CREATE2).\n * @param _address Address of the account to finalize.\n * @param _ethAddress Address of the account's associated contract on Ethereum.\n * @param _codeHash Hash of the account's code.\n */\n function commitPendingAccount(\n address _address,\n address _ethAddress,\n bytes32 _codeHash\n )\n override\n public\n authenticated\n {\n Lib_OVMCodec.Account storage account = accounts[_address];\n account.ethAddress = _ethAddress;\n account.codeHash = _codeHash;\n }\n\n /**\n * Checks whether an account has already been retrieved, and marks it as retrieved if not.\n * @param _address Address of the account to check.\n * @return Whether or not the account was already loaded.\n */\n function testAndSetAccountLoaded(\n address _address\n )\n override\n public\n authenticated\n returns (\n bool\n )\n {\n return _testAndSetItemState(\n _getItemHash(_address),\n ItemState.ITEM_LOADED\n );\n }\n\n /**\n * Checks whether an account has already been modified, and marks it as modified if not.\n * @param _address Address of the account to check.\n * @return Whether or not the account was already modified.\n */\n function testAndSetAccountChanged(\n address _address\n )\n override\n public\n authenticated\n returns (\n bool\n )\n {\n return _testAndSetItemState(\n _getItemHash(_address),\n ItemState.ITEM_CHANGED\n );\n }\n\n /**\n * Attempts to mark an account as committed.\n * @param _address Address of the account to commit.\n * @return Whether or not the account was committed.\n */\n function commitAccount(\n address _address\n )\n override\n public\n authenticated\n returns (\n bool\n )\n {\n bytes32 item = _getItemHash(_address);\n if (itemStates[item] != ItemState.ITEM_CHANGED) {\n return false;\n }\n\n itemStates[item] = ItemState.ITEM_COMMITTED;\n totalUncommittedAccounts -= 1;\n\n return true;\n }\n\n /**\n * Increments the total number of uncommitted accounts.\n */\n function incrementTotalUncommittedAccounts()\n override\n public\n authenticated\n {\n totalUncommittedAccounts += 1;\n }\n\n /**\n * Gets the total number of uncommitted accounts.\n * @return Total uncommitted accounts.\n */\n function getTotalUncommittedAccounts()\n override\n public\n view\n returns (\n uint256\n )\n {\n return totalUncommittedAccounts;\n }\n\n /**\n * Checks whether a given account was changed during execution.\n * @param _address Address to check.\n * @return Whether or not the account was changed.\n */\n function wasAccountChanged(\n address _address\n )\n override\n public\n view\n returns (\n bool\n )\n {\n bytes32 item = _getItemHash(_address);\n return itemStates[item] >= ItemState.ITEM_CHANGED;\n }\n\n /**\n * Checks whether a given account was committed after execution.\n * @param _address Address to check.\n * @return Whether or not the account was committed.\n */\n function wasAccountCommitted(\n address _address\n )\n override\n public\n view\n returns (\n bool\n )\n {\n bytes32 item = _getItemHash(_address);\n return itemStates[item] >= ItemState.ITEM_COMMITTED;\n }\n\n\n /************************************\n * Public Functions: Storage Access *\n ************************************/\n\n /**\n * Changes a contract storage slot value.\n * @param _contract Address of the contract to modify.\n * @param _key 32 byte storage slot key.\n * @param _value 32 byte storage slot value.\n */\n function putContractStorage(\n address _contract,\n bytes32 _key,\n bytes32 _value\n )\n override\n public\n authenticated\n {\n // A hilarious optimization. `SSTORE`ing a value of `bytes32(0)` is common enough that it's\n // worth populating this with a non-zero value in advance (during the fraud proof\n // initialization phase) to cut the execution-time cost down to 5000 gas.\n contractStorage[_contract][_key] = _value ^ STORAGE_XOR_VALUE;\n\n // Only used when initially populating the contract storage. OVM_ExecutionManager will\n // perform a `hasContractStorage` INVALID_STATE_ACCESS check before putting any contract\n // storage because writing to zero when the actual value is nonzero causes a gas\n // discrepancy. Could be moved into a new `putVerifiedContractStorage` function, or\n // something along those lines.\n if (verifiedContractStorage[_contract][_key] == false) {\n verifiedContractStorage[_contract][_key] = true;\n }\n }\n\n /**\n * Retrieves a contract storage slot value.\n * @param _contract Address of the contract to access.\n * @param _key 32 byte storage slot key.\n * @return 32 byte storage slot value.\n */\n function getContractStorage(\n address _contract,\n bytes32 _key\n )\n override\n public\n view\n returns (\n bytes32\n )\n {\n // Storage XOR system doesn't work for newly created contracts that haven't set this\n // storage slot value yet.\n if (\n verifiedContractStorage[_contract][_key] == false\n && accounts[_contract].isFresh\n ) {\n return bytes32(0);\n }\n\n // See `putContractStorage` for more information about the XOR here.\n return contractStorage[_contract][_key] ^ STORAGE_XOR_VALUE;\n }\n\n /**\n * Checks whether a contract storage slot exists in the state.\n * @param _contract Address of the contract to access.\n * @param _key 32 byte storage slot key.\n * @return Whether or not the key was set in the state.\n */\n function hasContractStorage(\n address _contract,\n bytes32 _key\n )\n override\n public\n view\n returns (\n bool\n )\n {\n return verifiedContractStorage[_contract][_key] || accounts[_contract].isFresh;\n }\n\n /**\n * Checks whether a storage slot has already been retrieved, and marks it as retrieved if not.\n * @param _contract Address of the contract to check.\n * @param _key 32 byte storage slot key.\n * @return Whether or not the slot was already loaded.\n */\n function testAndSetContractStorageLoaded(\n address _contract,\n bytes32 _key\n )\n override\n public\n authenticated\n returns (\n bool\n )\n {\n return _testAndSetItemState(\n _getItemHash(_contract, _key),\n ItemState.ITEM_LOADED\n );\n }\n\n /**\n * Checks whether a storage slot has already been modified, and marks it as modified if not.\n * @param _contract Address of the contract to check.\n * @param _key 32 byte storage slot key.\n * @return Whether or not the slot was already modified.\n */\n function testAndSetContractStorageChanged(\n address _contract,\n bytes32 _key\n )\n override\n public\n authenticated\n returns (\n bool\n )\n {\n return _testAndSetItemState(\n _getItemHash(_contract, _key),\n ItemState.ITEM_CHANGED\n );\n }\n\n /**\n * Attempts to mark a storage slot as committed.\n * @param _contract Address of the account to commit.\n * @param _key 32 byte slot key to commit.\n * @return Whether or not the slot was committed.\n */\n function commitContractStorage(\n address _contract,\n bytes32 _key\n )\n override\n public\n authenticated\n returns (\n bool\n )\n {\n bytes32 item = _getItemHash(_contract, _key);\n if (itemStates[item] != ItemState.ITEM_CHANGED) {\n return false;\n }\n\n itemStates[item] = ItemState.ITEM_COMMITTED;\n totalUncommittedContractStorage -= 1;\n\n return true;\n }\n\n /**\n * Increments the total number of uncommitted storage slots.\n */\n function incrementTotalUncommittedContractStorage()\n override\n public\n authenticated\n {\n totalUncommittedContractStorage += 1;\n }\n\n /**\n * Gets the total number of uncommitted storage slots.\n * @return Total uncommitted storage slots.\n */\n function getTotalUncommittedContractStorage()\n override\n public\n view\n returns (\n uint256\n )\n {\n return totalUncommittedContractStorage;\n }\n\n /**\n * Checks whether a given storage slot was changed during execution.\n * @param _contract Address to check.\n * @param _key Key of the storage slot to check.\n * @return Whether or not the storage slot was changed.\n */\n function wasContractStorageChanged(\n address _contract,\n bytes32 _key\n )\n override\n public\n view\n returns (\n bool\n )\n {\n bytes32 item = _getItemHash(_contract, _key);\n return itemStates[item] >= ItemState.ITEM_CHANGED;\n }\n\n /**\n * Checks whether a given storage slot was committed after execution.\n * @param _contract Address to check.\n * @param _key Key of the storage slot to check.\n * @return Whether or not the storage slot was committed.\n */\n function wasContractStorageCommitted(\n address _contract,\n bytes32 _key\n )\n override\n public\n view\n returns (\n bool\n )\n {\n bytes32 item = _getItemHash(_contract, _key);\n return itemStates[item] >= ItemState.ITEM_COMMITTED;\n }\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Generates a unique hash for an address.\n * @param _address Address to generate a hash for.\n * @return Unique hash for the given address.\n */\n function _getItemHash(\n address _address\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n return keccak256(abi.encodePacked(_address));\n }\n\n /**\n * Generates a unique hash for an address/key pair.\n * @param _contract Address to generate a hash for.\n * @param _key Key to generate a hash for.\n * @return Unique hash for the given pair.\n */\n function _getItemHash(\n address _contract,\n bytes32 _key\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n return keccak256(abi.encodePacked(\n _contract,\n _key\n ));\n }\n\n /**\n * Checks whether an item is in a particular state (ITEM_LOADED or ITEM_CHANGED) and sets the\n * item to the provided state if not.\n * @param _item 32 byte item ID to check.\n * @param _minItemState Minimum state that must be satisfied by the item.\n * @return Whether or not the item was already in the state.\n */\n function _testAndSetItemState(\n bytes32 _item,\n ItemState _minItemState\n )\n internal\n returns (\n bool\n )\n {\n bool wasItemState = itemStates[_item] >= _minItemState;\n\n if (wasItemState == false) {\n itemStates[_item] = _minItemState;\n }\n\n return wasItemState;\n }\n}\n" + }, + "contracts/test-libraries/codec/TestLib_OVMCodec.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../optimistic-ethereum/libraries/codec/Lib_OVMCodec.sol\";\n\n/**\n * @title TestLib_OVMCodec\n */\ncontract TestLib_OVMCodec {\n function encodeTransaction(\n Lib_OVMCodec.Transaction memory _transaction\n )\n public\n pure\n returns (\n bytes memory _encoded\n )\n {\n return Lib_OVMCodec.encodeTransaction(_transaction);\n }\n\n function hashTransaction(\n Lib_OVMCodec.Transaction memory _transaction\n )\n public\n pure\n returns (\n bytes32 _hash\n )\n {\n return Lib_OVMCodec.hashTransaction(_transaction);\n }\n}\n" + }, + "contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1CrossDomainMessenger.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_AddressResolver } from \"../../../libraries/resolver/Lib_AddressResolver.sol\";\nimport { Lib_AddressManager } from \"../../../libraries/resolver/Lib_AddressManager.sol\";\nimport { Lib_SecureMerkleTrie } from \"../../../libraries/trie/Lib_SecureMerkleTrie.sol\";\n\n/* Interface Imports */\nimport { iOVM_L1CrossDomainMessenger } from \"../../../iOVM/bridge/messaging/iOVM_L1CrossDomainMessenger.sol\";\nimport { iOVM_CanonicalTransactionChain } from \"../../../iOVM/chain/iOVM_CanonicalTransactionChain.sol\";\nimport { iOVM_StateCommitmentChain } from \"../../../iOVM/chain/iOVM_StateCommitmentChain.sol\";\n\n/* Contract Imports */\nimport { Abs_BaseCrossDomainMessenger } from \"./Abs_BaseCrossDomainMessenger.sol\";\n\n/**\n * @title OVM_L1CrossDomainMessenger\n * @dev The L1 Cross Domain Messenger contract sends messages from L1 to L2, and relays messages\n * from L2 onto L1. In the event that a message sent from L1 to L2 is rejected for exceeding the L2\n * epoch gas limit, it can be resubmitted via this contract's replay function.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract OVM_L1CrossDomainMessenger is iOVM_L1CrossDomainMessenger, Abs_BaseCrossDomainMessenger, Lib_AddressResolver {\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * Pass a default zero address to the address resolver. This will be updated when initialized.\n */\n constructor()\n Lib_AddressResolver(address(0))\n {}\n\n\n /**********************\n * Function Modifiers *\n **********************/\n\n /**\n * Modifier to enforce that, if configured, only the OVM_L2MessageRelayer contract may\n * successfully call a method.\n */\n modifier onlyRelayer() {\n address relayer = resolve(\"OVM_L2MessageRelayer\");\n if (relayer != address(0)) {\n require(\n msg.sender == relayer,\n \"Only OVM_L2MessageRelayer can relay L2-to-L1 messages.\"\n );\n }\n _;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n function initialize(\n address _libAddressManager\n )\n public\n {\n require(\n address(libAddressManager) == address(0),\n \"L1CrossDomainMessenger already intialized.\"\n );\n\n libAddressManager = Lib_AddressManager(_libAddressManager);\n xDomainMsgSender = DEFAULT_XDOMAIN_SENDER;\n }\n\n /**\n * Relays a cross domain message to a contract.\n * @inheritdoc iOVM_L1CrossDomainMessenger\n */\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce,\n L2MessageInclusionProof memory _proof\n )\n override\n public\n nonReentrant\n onlyRelayer()\n {\n bytes memory xDomainCalldata = _getXDomainCalldata(\n _target,\n _sender,\n _message,\n _messageNonce\n );\n\n require(\n _verifyXDomainMessage(\n xDomainCalldata,\n _proof\n ) == true,\n \"Provided message could not be verified.\"\n );\n\n bytes32 xDomainCalldataHash = keccak256(xDomainCalldata);\n\n require(\n successfulMessages[xDomainCalldataHash] == false,\n \"Provided message has already been received.\"\n );\n\n xDomainMsgSender = _sender;\n (bool success, ) = _target.call(_message);\n xDomainMsgSender = DEFAULT_XDOMAIN_SENDER;\n\n // Mark the message as received if the call was successful. Ensures that a message can be\n // relayed multiple times in the case that the call reverted.\n if (success == true) {\n successfulMessages[xDomainCalldataHash] = true;\n emit RelayedMessage(xDomainCalldataHash);\n } else {\n emit FailedRelayedMessage(xDomainCalldataHash);\n }\n\n // Store an identifier that can be used to prove that the given message was relayed by some\n // user. Gives us an easy way to pay relayers for their work.\n bytes32 relayId = keccak256(\n abi.encodePacked(\n xDomainCalldata,\n msg.sender,\n block.number\n )\n );\n relayedMessages[relayId] = true;\n }\n\n /**\n * Replays a cross domain message to the target messenger.\n * @inheritdoc iOVM_L1CrossDomainMessenger\n */\n function replayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce,\n uint32 _gasLimit\n )\n override\n public\n {\n bytes memory xDomainCalldata = _getXDomainCalldata(\n _target,\n _sender,\n _message,\n _messageNonce\n );\n\n require(\n sentMessages[keccak256(xDomainCalldata)] == true,\n \"Provided message has not already been sent.\"\n );\n\n _sendXDomainMessage(xDomainCalldata, _gasLimit);\n }\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Verifies that the given message is valid.\n * @param _xDomainCalldata Calldata to verify.\n * @param _proof Inclusion proof for the message.\n * @return Whether or not the provided message is valid.\n */\n function _verifyXDomainMessage(\n bytes memory _xDomainCalldata,\n L2MessageInclusionProof memory _proof\n )\n internal\n view\n returns (\n bool\n )\n {\n return (\n _verifyStateRootProof(_proof)\n && _verifyStorageProof(_xDomainCalldata, _proof)\n );\n }\n\n /**\n * Verifies that the state root within an inclusion proof is valid.\n * @param _proof Message inclusion proof.\n * @return Whether or not the provided proof is valid.\n */\n function _verifyStateRootProof(\n L2MessageInclusionProof memory _proof\n )\n internal\n view\n returns (\n bool\n )\n {\n iOVM_StateCommitmentChain ovmStateCommitmentChain = iOVM_StateCommitmentChain(\n resolve(\"OVM_StateCommitmentChain\")\n );\n\n return (\n ovmStateCommitmentChain.insideFraudProofWindow(_proof.stateRootBatchHeader) == false\n && ovmStateCommitmentChain.verifyStateCommitment(\n _proof.stateRoot,\n _proof.stateRootBatchHeader,\n _proof.stateRootProof\n )\n );\n }\n\n /**\n * Verifies that the storage proof within an inclusion proof is valid.\n * @param _xDomainCalldata Encoded message calldata.\n * @param _proof Message inclusion proof.\n * @return Whether or not the provided proof is valid.\n */\n function _verifyStorageProof(\n bytes memory _xDomainCalldata,\n L2MessageInclusionProof memory _proof\n )\n internal\n view\n returns (\n bool\n )\n {\n bytes32 storageKey = keccak256(\n abi.encodePacked(\n keccak256(\n abi.encodePacked(\n _xDomainCalldata,\n resolve(\"OVM_L2CrossDomainMessenger\")\n )\n ),\n uint256(0)\n )\n );\n\n (\n bool exists,\n bytes memory encodedMessagePassingAccount\n ) = Lib_SecureMerkleTrie.get(\n abi.encodePacked(0x4200000000000000000000000000000000000000),\n _proof.stateTrieWitness,\n _proof.stateRoot\n );\n\n require(\n exists == true,\n \"Message passing predeploy has not been initialized or invalid proof provided.\"\n );\n\n Lib_OVMCodec.EVMAccount memory account = Lib_OVMCodec.decodeEVMAccount(\n encodedMessagePassingAccount\n );\n\n return Lib_SecureMerkleTrie.verifyInclusionProof(\n abi.encodePacked(storageKey),\n abi.encodePacked(uint8(1)),\n _proof.storageTrieWitness,\n account.storageRoot\n );\n }\n\n /**\n * Sends a cross domain message.\n * @param _message Message to send.\n * @param _gasLimit OVM gas limit for the message.\n */\n function _sendXDomainMessage(\n bytes memory _message,\n uint256 _gasLimit\n )\n override\n internal\n {\n iOVM_CanonicalTransactionChain(resolve(\"OVM_CanonicalTransactionChain\")).enqueue(\n resolve(\"OVM_L2CrossDomainMessenger\"),\n _gasLimit,\n _message\n );\n }\n}\n" + }, + "contracts/optimistic-ethereum/iOVM/bridge/messaging/iOVM_L1CrossDomainMessenger.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../../libraries/codec/Lib_OVMCodec.sol\";\n\n/* Interface Imports */\nimport { iAbs_BaseCrossDomainMessenger } from \"./iAbs_BaseCrossDomainMessenger.sol\";\n\n/**\n * @title iOVM_L1CrossDomainMessenger\n */\ninterface iOVM_L1CrossDomainMessenger is iAbs_BaseCrossDomainMessenger {\n\n /*******************\n * Data Structures *\n *******************/\n\n struct L2MessageInclusionProof {\n bytes32 stateRoot;\n Lib_OVMCodec.ChainBatchHeader stateRootBatchHeader;\n Lib_OVMCodec.ChainInclusionProof stateRootProof;\n bytes stateTrieWitness;\n bytes storageTrieWitness;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Relays a cross domain message to a contract.\n * @param _target Target contract address.\n * @param _sender Message sender address.\n * @param _message Message to send to the target.\n * @param _messageNonce Nonce for the provided message.\n * @param _proof Inclusion proof for the given message.\n */\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce,\n L2MessageInclusionProof memory _proof\n ) external;\n\n /**\n * Replays a cross domain message to the target messenger.\n * @param _target Target contract address.\n * @param _sender Original sender address.\n * @param _message Message to send to the target.\n * @param _messageNonce Nonce for the provided message.\n * @param _gasLimit Gas limit for the provided message.\n */\n function replayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce,\n uint32 _gasLimit\n ) external;\n}\n" + }, + "contracts/optimistic-ethereum/OVM/bridge/messaging/Abs_BaseCrossDomainMessenger.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Interface Imports */\nimport { iAbs_BaseCrossDomainMessenger } from \"../../../iOVM/bridge/messaging/iAbs_BaseCrossDomainMessenger.sol\";\n\n/* External Imports */\nimport { ReentrancyGuard } from \"@openzeppelin/contracts/utils/ReentrancyGuard.sol\";\n\n/**\n * @title Abs_BaseCrossDomainMessenger\n * @dev The Base Cross Domain Messenger is an abstract contract providing the interface and common\n * functionality used in the L1 and L2 Cross Domain Messengers. It can also serve as a template for\n * developers wishing to implement a custom bridge contract to suit their needs.\n *\n * Compiler used: defined by child contract\n * Runtime target: defined by child contract\n */\nabstract contract Abs_BaseCrossDomainMessenger is iAbs_BaseCrossDomainMessenger, ReentrancyGuard {\n\n /*************\n * Constants *\n *************/\n\n // The default x-domain message sender being set to a non-zero value makes\n // deployment a bit more expensive, but in exchange the refund on every call to\n // `relayMessage` by the L1 and L2 messengers will be higher.\n address internal constant DEFAULT_XDOMAIN_SENDER = 0x000000000000000000000000000000000000dEaD;\n\n\n /*************\n * Variables *\n *************/\n\n mapping (bytes32 => bool) public relayedMessages;\n mapping (bytes32 => bool) public successfulMessages;\n mapping (bytes32 => bool) public sentMessages;\n uint256 public messageNonce;\n address internal xDomainMsgSender = DEFAULT_XDOMAIN_SENDER;\n\n\n /***************\n * Constructor *\n ***************/\n\n constructor() ReentrancyGuard() {}\n\n\n /********************\n * Public Functions *\n ********************/\n\n function xDomainMessageSender()\n public\n override\n view\n returns (\n address\n )\n {\n require(xDomainMsgSender != DEFAULT_XDOMAIN_SENDER, \"xDomainMessageSender is not set\");\n return xDomainMsgSender;\n }\n\n /**\n * Sends a cross domain message to the target messenger.\n * @param _target Target contract address.\n * @param _message Message to send to the target.\n * @param _gasLimit Gas limit for the provided message.\n */\n function sendMessage(\n address _target,\n bytes memory _message,\n uint32 _gasLimit\n )\n override\n public\n {\n bytes memory xDomainCalldata = _getXDomainCalldata(\n _target,\n msg.sender,\n _message,\n messageNonce\n );\n\n messageNonce += 1;\n sentMessages[keccak256(xDomainCalldata)] = true;\n\n _sendXDomainMessage(xDomainCalldata, _gasLimit);\n emit SentMessage(xDomainCalldata);\n }\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Generates the correct cross domain calldata for a message.\n * @param _target Target contract address.\n * @param _sender Message sender address.\n * @param _message Message to send to the target.\n * @param _messageNonce Nonce for the provided message.\n * @return ABI encoded cross domain calldata.\n */\n function _getXDomainCalldata(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n return abi.encodeWithSignature(\n \"relayMessage(address,address,bytes,uint256)\",\n _target,\n _sender,\n _message,\n _messageNonce\n );\n }\n\n /**\n * Sends a cross domain message.\n * param // Message to send.\n * param // Gas limit for the provided message.\n */\n function _sendXDomainMessage(\n bytes memory, // _message,\n uint256 // _gasLimit\n )\n virtual\n internal\n {\n revert(\"Implement me in child contracts!\");\n }\n}\n" + }, + "@openzeppelin/contracts/utils/ReentrancyGuard.sol": { + "content": "// SPDX-License-Identifier: MIT\n\npragma solidity >=0.6.0 <0.8.0;\n\n/**\n * @dev Contract module that helps prevent reentrant calls to a function.\n *\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\n * available, which can be applied to functions to make sure there are no nested\n * (reentrant) calls to them.\n *\n * Note that because there is a single `nonReentrant` guard, functions marked as\n * `nonReentrant` may not call one another. This can be worked around by making\n * those functions `private`, and then adding `external` `nonReentrant` entry\n * points to them.\n *\n * TIP: If you would like to learn more about reentrancy and alternative ways\n * to protect against it, check out our blog post\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\n */\nabstract contract ReentrancyGuard {\n // Booleans are more expensive than uint256 or any type that takes up a full\n // word because each write operation emits an extra SLOAD to first read the\n // slot's contents, replace the bits taken up by the boolean, and then write\n // back. This is the compiler's defense against contract upgrades and\n // pointer aliasing, and it cannot be disabled.\n\n // The values being non-zero value makes deployment a bit more expensive,\n // but in exchange the refund on every call to nonReentrant will be lower in\n // amount. Since refunds are capped to a percentage of the total\n // transaction's gas, it is best to keep them low in cases like this one, to\n // increase the likelihood of the full refund coming into effect.\n uint256 private constant _NOT_ENTERED = 1;\n uint256 private constant _ENTERED = 2;\n\n uint256 private _status;\n\n constructor () internal {\n _status = _NOT_ENTERED;\n }\n\n /**\n * @dev Prevents a contract from calling itself, directly or indirectly.\n * Calling a `nonReentrant` function from another `nonReentrant`\n * function is not supported. It is possible to prevent this from happening\n * by making the `nonReentrant` function external, and make it call a\n * `private` function that does the actual work.\n */\n modifier nonReentrant() {\n // On the first call to nonReentrant, _notEntered will be true\n require(_status != _ENTERED, \"ReentrancyGuard: reentrant call\");\n\n // Any calls to nonReentrant after this point will fail\n _status = _ENTERED;\n\n _;\n\n // By storing the original value once again, a refund is triggered (see\n // https://eips.ethereum.org/EIPS/eip-2200)\n _status = _NOT_ENTERED;\n }\n}\n" + }, + "contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L2CrossDomainMessenger.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_AddressResolver } from \"../../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/* Interface Imports */\nimport { iOVM_L2CrossDomainMessenger } from \"../../../iOVM/bridge/messaging/iOVM_L2CrossDomainMessenger.sol\";\nimport { iOVM_L1MessageSender } from \"../../../iOVM/predeploys/iOVM_L1MessageSender.sol\";\nimport { iOVM_L2ToL1MessagePasser } from \"../../../iOVM/predeploys/iOVM_L2ToL1MessagePasser.sol\";\n\n/* Contract Imports */\nimport { Abs_BaseCrossDomainMessenger } from \"./Abs_BaseCrossDomainMessenger.sol\";\n\n/**\n * @title OVM_L2CrossDomainMessenger\n * @dev The L2 Cross Domain Messenger contract sends messages from L2 to L1, and is the entry point\n * for L2 messages sent via the L1 Cross Domain Messenger.\n *\n * Compiler used: optimistic-solc\n * Runtime target: OVM\n */\ncontract OVM_L2CrossDomainMessenger is iOVM_L2CrossDomainMessenger, Abs_BaseCrossDomainMessenger, Lib_AddressResolver {\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n constructor(\n address _libAddressManager\n )\n Lib_AddressResolver(_libAddressManager)\n {}\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Relays a cross domain message to a contract.\n * @inheritdoc iOVM_L2CrossDomainMessenger\n */\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce\n )\n override\n nonReentrant\n public\n {\n require(\n _verifyXDomainMessage() == true,\n \"Provided message could not be verified.\"\n );\n\n bytes memory xDomainCalldata = _getXDomainCalldata(\n _target,\n _sender,\n _message,\n _messageNonce\n );\n\n bytes32 xDomainCalldataHash = keccak256(xDomainCalldata);\n\n require(\n successfulMessages[xDomainCalldataHash] == false,\n \"Provided message has already been received.\"\n );\n\n // Prevent calls to OVM_L2ToL1MessagePasser, which would enable\n // an attacker to maliciously craft the _message to spoof\n // a call from any L2 account.\n if(_target == resolve(\"OVM_L2ToL1MessagePasser\")){\n // Write to the successfulMessages mapping and return immediately.\n successfulMessages[xDomainCalldataHash] = true;\n return;\n }\n\n xDomainMsgSender = _sender;\n (bool success, ) = _target.call(_message);\n xDomainMsgSender = DEFAULT_XDOMAIN_SENDER;\n\n // Mark the message as received if the call was successful. Ensures that a message can be\n // relayed multiple times in the case that the call reverted.\n if (success == true) {\n successfulMessages[xDomainCalldataHash] = true;\n emit RelayedMessage(xDomainCalldataHash);\n } else {\n emit FailedRelayedMessage(xDomainCalldataHash);\n }\n\n // Store an identifier that can be used to prove that the given message was relayed by some\n // user. Gives us an easy way to pay relayers for their work.\n bytes32 relayId = keccak256(\n abi.encodePacked(\n xDomainCalldata,\n msg.sender,\n block.number\n )\n );\n\n relayedMessages[relayId] = true;\n }\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Verifies that a received cross domain message is valid.\n * @return _valid Whether or not the message is valid.\n */\n function _verifyXDomainMessage()\n view\n internal\n returns (\n bool _valid\n )\n {\n return (\n iOVM_L1MessageSender(\n resolve(\"OVM_L1MessageSender\")\n ).getL1MessageSender() == resolve(\"OVM_L1CrossDomainMessenger\")\n );\n }\n\n /**\n * Sends a cross domain message.\n * @param _message Message to send.\n * param _gasLimit Gas limit for the provided message.\n */\n function _sendXDomainMessage(\n bytes memory _message,\n uint256 // _gasLimit\n )\n override\n internal\n {\n iOVM_L2ToL1MessagePasser(resolve(\"OVM_L2ToL1MessagePasser\")).passMessageToL1(_message);\n }\n}\n" + }, + "contracts/optimistic-ethereum/iOVM/bridge/messaging/iOVM_L2CrossDomainMessenger.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Interface Imports */\nimport { iAbs_BaseCrossDomainMessenger } from \"./iAbs_BaseCrossDomainMessenger.sol\";\n\n/**\n * @title iOVM_L2CrossDomainMessenger\n */\ninterface iOVM_L2CrossDomainMessenger is iAbs_BaseCrossDomainMessenger {\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Relays a cross domain message to a contract.\n * @param _target Target contract address.\n * @param _sender Message sender address.\n * @param _message Message to send to the target.\n * @param _messageNonce Nonce for the provided message.\n */\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce\n ) external;\n}\n" + }, + "contracts/optimistic-ethereum/iOVM/predeploys/iOVM_L1MessageSender.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/**\n * @title iOVM_L1MessageSender\n */\ninterface iOVM_L1MessageSender {\n\n /********************\n * Public Functions *\n ********************/\n\n function getL1MessageSender() external view returns (address _l1MessageSender);\n}\n" + }, + "contracts/optimistic-ethereum/iOVM/predeploys/iOVM_L2ToL1MessagePasser.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/**\n * @title iOVM_L2ToL1MessagePasser\n */\ninterface iOVM_L2ToL1MessagePasser {\n\n /**********\n * Events *\n **********/\n\n event L2ToL1Message(\n uint256 _nonce,\n address _sender,\n bytes _data\n );\n\n\n /********************\n * Public Functions *\n ********************/\n\n function passMessageToL1(bytes calldata _message) external;\n}\n" + }, + "contracts/optimistic-ethereum/OVM/predeploys/OVM_L2ToL1MessagePasser.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Interface Imports */\nimport { iOVM_L2ToL1MessagePasser } from \"../../iOVM/predeploys/iOVM_L2ToL1MessagePasser.sol\";\n\n/**\n * @title OVM_L2ToL1MessagePasser\n * @dev The L2 to L1 Message Passer is a utility contract which facilitate an L1 proof of the\n * of a message on L2. The L1 Cross Domain Messenger performs this proof in its\n * _verifyStorageProof function, which verifies the existence of the transaction hash in this\n * contract's `sentMessages` mapping.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract OVM_L2ToL1MessagePasser is iOVM_L2ToL1MessagePasser {\n\n /**********************\n * Contract Variables *\n **********************/\n\n mapping (bytes32 => bool) public sentMessages;\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Passes a message to L1.\n * @param _message Message to pass to L1.\n */\n function passMessageToL1(\n bytes memory _message\n )\n override\n public\n {\n // Note: although this function is public, only messages sent from the OVM_L2CrossDomainMessenger\n // will be relayed by the OVM_L1CrossDomainMessenger. This is enforced by a check in\n // OVM_L1CrossDomainMessenger._verifyStorageProof().\n sentMessages[keccak256(\n abi.encodePacked(\n _message,\n msg.sender\n )\n )] = true;\n }\n}\n" + }, + "contracts/optimistic-ethereum/OVM/predeploys/OVM_L1MessageSender.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Interface Imports */\nimport { iOVM_L1MessageSender } from \"../../iOVM/predeploys/iOVM_L1MessageSender.sol\";\nimport { iOVM_ExecutionManager } from \"../../iOVM/execution/iOVM_ExecutionManager.sol\";\n\n/**\n * @title OVM_L1MessageSender\n * @dev The L1MessageSender is a predeploy contract running on L2. During the execution of cross\n * domain transaction from L1 to L2, it returns the address of the L1 account (either an EOA or\n * contract) which sent the message to L2 via the Canonical Transaction Chain's `enqueue()`\n * function.\n *\n * This contract exclusively serves as a getter for the ovmL1TXORIGIN operation. This is necessary\n * because there is no corresponding operation in the EVM which the the optimistic solidity compiler\n * can be replaced with a call to the ExecutionManager's ovmL1TXORIGIN() function.\n *\n *\n * Compiler used: solc\n * Runtime target: OVM\n */\ncontract OVM_L1MessageSender is iOVM_L1MessageSender {\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @return _l1MessageSender L1 message sender address (msg.sender).\n */\n function getL1MessageSender()\n override\n public\n view\n returns (\n address _l1MessageSender\n )\n {\n // Note that on L2 msg.sender (ie. evmCALLER) will always be the Execution Manager\n return iOVM_ExecutionManager(msg.sender).ovmL1TXORIGIN();\n }\n}\n" + }, + "contracts/optimistic-ethereum/OVM/bridge/tokens/OVM_L1ETHGateway.sol": { + "content": "// SPDX-License-Identifier: MIT\n// @unsupported: ovm\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Interface Imports */\nimport { iOVM_L1ETHGateway } from \"../../../iOVM/bridge/tokens/iOVM_L1ETHGateway.sol\";\nimport { iOVM_L2DepositedToken } from \"../../../iOVM/bridge/tokens/iOVM_L2DepositedToken.sol\";\n\n/* Library Imports */\nimport { OVM_CrossDomainEnabled } from \"../../../libraries/bridge/OVM_CrossDomainEnabled.sol\";\nimport { Lib_AddressResolver } from \"../../../libraries/resolver/Lib_AddressResolver.sol\";\nimport { Lib_AddressManager } from \"../../../libraries/resolver/Lib_AddressManager.sol\";\n\n/**\n * @title OVM_L1ETHGateway\n * @dev The L1 ETH Gateway is a contract which stores deposited ETH that is in use on L2.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract OVM_L1ETHGateway is iOVM_L1ETHGateway, OVM_CrossDomainEnabled, Lib_AddressResolver {\n\n /********************\n * Public Constants *\n ********************/\n\n uint32 public constant override getFinalizeDepositL2Gas = 1200000;\n\n /********************************\n * External Contract References *\n ********************************/\n\n address public ovmEth;\n\n /***************\n * Constructor *\n ***************/\n\n // This contract lives behind a proxy, so the constructor parameters will go unused.\n constructor()\n OVM_CrossDomainEnabled(address(0))\n Lib_AddressResolver(address(0))\n public\n {}\n\n /******************\n * Initialization *\n ******************/\n\n /**\n * @param _libAddressManager Address manager for this OE deployment\n * @param _ovmEth L2 OVM_ETH implementation of iOVM_DepositedToken\n */\n function initialize(\n address _libAddressManager,\n address _ovmEth\n )\n public\n {\n require(libAddressManager == Lib_AddressManager(0), \"Contract has already been initialized.\");\n libAddressManager = Lib_AddressManager(_libAddressManager);\n ovmEth = _ovmEth;\n messenger = resolve(\"Proxy__OVM_L1CrossDomainMessenger\");\n }\n\n /**************\n * Depositing *\n **************/\n\n receive()\n external\n payable\n {\n _initiateDeposit(msg.sender, msg.sender);\n }\n\n /**\n * @dev deposit an amount of the ETH to the caller's balance on L2\n */\n function deposit()\n external\n override\n payable\n {\n _initiateDeposit(msg.sender, msg.sender);\n }\n\n /**\n * @dev deposit an amount of ETH to a recipients's balance on L2\n * @param _to L2 address to credit the withdrawal to\n */\n function depositTo(\n address _to\n )\n external\n override\n payable\n {\n _initiateDeposit(msg.sender, _to);\n }\n\n /**\n * @dev Performs the logic for deposits by storing the ETH and informing the L2 ETH Gateway of the deposit.\n *\n * @param _from Account to pull the deposit from on L1\n * @param _to Account to give the deposit to on L2\n */\n function _initiateDeposit(\n address _from,\n address _to\n )\n internal\n {\n // Construct calldata for l2ETHGateway.finalizeDeposit(_to, _amount)\n bytes memory data =\n abi.encodeWithSelector(\n iOVM_L2DepositedToken.finalizeDeposit.selector,\n _to,\n msg.value\n );\n\n // Send calldata into L2\n sendCrossDomainMessage(\n ovmEth,\n data,\n getFinalizeDepositL2Gas\n );\n\n emit DepositInitiated(_from, _to, msg.value);\n }\n\n /*************************\n * Cross-chain Functions *\n *************************/\n\n /**\n * @dev Complete a withdrawal from L2 to L1, and credit funds to the recipient's balance of the\n * L1 ETH token.\n * Since only the xDomainMessenger can call this function, it will never be called before the withdrawal is finalized.\n *\n * @param _to L1 address to credit the withdrawal to\n * @param _amount Amount of the ETH to withdraw\n */\n function finalizeWithdrawal(\n address _to,\n uint256 _amount\n )\n external\n override\n onlyFromCrossDomainAccount(ovmEth)\n {\n _safeTransferETH(_to, _amount);\n\n emit WithdrawalFinalized(_to, _amount);\n }\n\n /**********************************\n * Internal Functions: Accounting *\n **********************************/\n\n /**\n * @dev Internal accounting function for moving around L1 ETH.\n *\n * @param _to L1 address to transfer ETH to\n * @param _value Amount of ETH to send to\n */\n function _safeTransferETH(\n address _to,\n uint256 _value\n )\n internal\n {\n (bool success, ) = _to.call{value: _value}(new bytes(0));\n require(success, 'TransferHelper::safeTransferETH: ETH transfer failed');\n }\n}\n" + }, + "contracts/optimistic-ethereum/iOVM/bridge/tokens/iOVM_L1ETHGateway.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0;\npragma experimental ABIEncoderV2;\n\n/**\n * @title iOVM_L1ETHGateway\n */\ninterface iOVM_L1ETHGateway {\n\n /**********\n * Events *\n **********/\n\n event DepositInitiated(\n address indexed _from,\n address _to,\n uint256 _amount\n );\n\n event WithdrawalFinalized(\n address indexed _to,\n uint256 _amount\n );\n\n /********************\n * Public Functions *\n ********************/\n\n function deposit()\n external\n payable;\n\n function depositTo(\n address _to\n )\n external\n payable;\n\n /*************************\n * Cross-chain Functions *\n *************************/\n\n function finalizeWithdrawal(\n address _to,\n uint _amount\n )\n external;\n\n function getFinalizeDepositL2Gas()\n external\n view\n returns(\n uint32\n );\n}\n" + }, + "contracts/optimistic-ethereum/libraries/resolver/Lib_ResolvedDelegateProxy.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Library Imports */\nimport { Lib_AddressManager } from \"./Lib_AddressManager.sol\";\n\n/**\n * @title Lib_ResolvedDelegateProxy\n */\ncontract Lib_ResolvedDelegateProxy {\n\n /*************\n * Variables *\n *************/\n\n // Using mappings to store fields to avoid overwriting storage slots in the\n // implementation contract. For example, instead of storing these fields at\n // storage slot `0` & `1`, they are stored at `keccak256(key + slot)`.\n // See: https://solidity.readthedocs.io/en/v0.7.0/internals/layout_in_storage.html\n // NOTE: Do not use this code in your own contract system.\n // There is a known flaw in this contract, and we will remove it from the repository\n // in the near future. Due to the very limited way that we are using it, this flaw is\n // not an issue in our system.\n mapping (address => string) private implementationName;\n mapping (address => Lib_AddressManager) private addressManager;\n\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Lib_AddressManager.\n * @param _implementationName implementationName of the contract to proxy to.\n */\n constructor(\n address _libAddressManager,\n string memory _implementationName\n ) {\n addressManager[address(this)] = Lib_AddressManager(_libAddressManager);\n implementationName[address(this)] = _implementationName;\n }\n\n\n /*********************\n * Fallback Function *\n *********************/\n\n fallback()\n external\n payable\n {\n address target = addressManager[address(this)].getAddress(\n (implementationName[address(this)])\n );\n\n require(\n target != address(0),\n \"Target address must be initialized.\"\n );\n\n (bool success, bytes memory returndata) = target.delegatecall(msg.data);\n\n if (success == true) {\n assembly {\n return(add(returndata, 0x20), mload(returndata))\n }\n } else {\n assembly {\n revert(add(returndata, 0x20), mload(returndata))\n }\n }\n }\n}\n" + }, + "contracts/optimistic-ethereum/OVM/bridge/tokens/Abs_L1TokenGateway.sol": { + "content": "// SPDX-License-Identifier: MIT\n// @unsupported: ovm\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Interface Imports */\nimport { iOVM_L1TokenGateway } from \"../../../iOVM/bridge/tokens/iOVM_L1TokenGateway.sol\";\nimport { iOVM_L2DepositedToken } from \"../../../iOVM/bridge/tokens/iOVM_L2DepositedToken.sol\";\n\n/* Library Imports */\nimport { OVM_CrossDomainEnabled } from \"../../../libraries/bridge/OVM_CrossDomainEnabled.sol\";\n\n/**\n * @title Abs_L1TokenGateway\n * @dev An L1 Token Gateway is a contract which stores deposited L1 funds that are in use on L2.\n * It synchronizes a corresponding L2 representation of the \"deposited token\", informing it\n * of new deposits and releasing L1 funds when there are newly finalized withdrawals.\n *\n * NOTE: This abstract contract gives all the core functionality of an L1 token gateway,\n * but provides easy hooks in case developers need extensions in child contracts.\n * In many cases, the default OVM_L1ERC20Gateway will suffice.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\nabstract contract Abs_L1TokenGateway is iOVM_L1TokenGateway, OVM_CrossDomainEnabled {\n\n /********************************\n * External Contract References *\n ********************************/\n\n address public l2DepositedToken;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _l2DepositedToken iOVM_L2DepositedToken-compatible address on the chain being deposited into.\n * @param _l1messenger L1 Messenger address being used for cross-chain communications.\n */\n constructor(\n address _l2DepositedToken,\n address _l1messenger\n )\n OVM_CrossDomainEnabled(_l1messenger)\n {\n l2DepositedToken = _l2DepositedToken;\n }\n\n /********************************\n * Overridable Accounting logic *\n ********************************/\n\n // Default gas value which can be overridden if more complex logic runs on L2.\n uint32 internal constant DEFAULT_FINALIZE_DEPOSIT_L2_GAS = 1200000;\n\n /**\n * @dev Core logic to be performed when a withdrawal is finalized on L1.\n * In most cases, this will simply send locked funds to the withdrawer.\n *\n * param _to Address being withdrawn to.\n * param _amount Amount being withdrawn.\n */\n function _handleFinalizeWithdrawal(\n address, // _to,\n uint256 // _amount\n )\n internal\n virtual\n {\n revert(\"Implement me in child contracts\");\n }\n\n /**\n * @dev Core logic to be performed when a deposit is initiated on L1.\n * In most cases, this will simply send locked funds to the withdrawer.\n *\n * param _from Address being deposited from on L1.\n * param _to Address being deposited into on L2.\n * param _amount Amount being deposited.\n */\n function _handleInitiateDeposit(\n address, // _from,\n address, // _to,\n uint256 // _amount\n )\n internal\n virtual\n {\n revert(\"Implement me in child contracts\");\n }\n\n /**\n * @dev Overridable getter for the L2 gas limit, in the case it may be\n * dynamic, and the above public constant does not suffice.\n *\n */\n function getFinalizeDepositL2Gas()\n public\n view\n virtual\n returns(\n uint32\n )\n {\n return DEFAULT_FINALIZE_DEPOSIT_L2_GAS;\n }\n\n /**************\n * Depositing *\n **************/\n\n /**\n * @dev deposit an amount of the ERC20 to the caller's balance on L2\n * @param _amount Amount of the ERC20 to deposit\n */\n function deposit(\n uint _amount\n )\n external\n override\n virtual\n {\n _initiateDeposit(msg.sender, msg.sender, _amount);\n }\n\n /**\n * @dev deposit an amount of ERC20 to a recipients's balance on L2\n * @param _to L2 address to credit the withdrawal to\n * @param _amount Amount of the ERC20 to deposit\n */\n function depositTo(\n address _to,\n uint _amount\n )\n external\n override\n virtual\n {\n _initiateDeposit(msg.sender, _to, _amount);\n }\n\n /**\n * @dev Performs the logic for deposits by informing the L2 Deposited Token\n * contract of the deposit and calling a handler to lock the L1 funds. (e.g. transferFrom)\n *\n * @param _from Account to pull the deposit from on L1\n * @param _to Account to give the deposit to on L2\n * @param _amount Amount of the ERC20 to deposit.\n */\n function _initiateDeposit(\n address _from,\n address _to,\n uint _amount\n )\n internal\n {\n // Call our deposit accounting handler implemented by child contracts.\n _handleInitiateDeposit(\n _from,\n _to,\n _amount\n );\n\n // Construct calldata for l2DepositedToken.finalizeDeposit(_to, _amount)\n bytes memory data = abi.encodeWithSelector(\n iOVM_L2DepositedToken.finalizeDeposit.selector,\n _to,\n _amount\n );\n\n // Send calldata into L2\n sendCrossDomainMessage(\n l2DepositedToken,\n data,\n getFinalizeDepositL2Gas()\n );\n\n emit DepositInitiated(_from, _to, _amount);\n }\n\n /*************************\n * Cross-chain Functions *\n *************************/\n\n /**\n * @dev Complete a withdrawal from L2 to L1, and credit funds to the recipient's balance of the\n * L1 ERC20 token.\n * This call will fail if the initialized withdrawal from L2 has not been finalized.\n *\n * @param _to L1 address to credit the withdrawal to\n * @param _amount Amount of the ERC20 to withdraw\n */\n function finalizeWithdrawal(\n address _to,\n uint _amount\n )\n external\n override\n virtual\n onlyFromCrossDomainAccount(l2DepositedToken)\n {\n // Call our withdrawal accounting handler implemented by child contracts.\n _handleFinalizeWithdrawal(\n _to,\n _amount\n );\n\n emit WithdrawalFinalized(_to, _amount);\n }\n}\n" + }, + "contracts/optimistic-ethereum/OVM/bridge/tokens/OVM_L1ERC20Gateway.sol": { + "content": "// SPDX-License-Identifier: MIT\n// @unsupported: ovm\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Interface Imports */\nimport { iOVM_L1TokenGateway } from \"../../../iOVM/bridge/tokens/iOVM_L1TokenGateway.sol\";\nimport { Abs_L1TokenGateway } from \"./Abs_L1TokenGateway.sol\";\nimport { iOVM_ERC20 } from \"../../../iOVM/predeploys/iOVM_ERC20.sol\";\n\n/**\n * @title OVM_L1ERC20Gateway\n * @dev The L1 ERC20 Gateway is a contract which stores deposited L1 funds that are in use on L2.\n * It synchronizes a corresponding L2 ERC20 Gateway, informing it of deposits, and listening to it\n * for newly finalized withdrawals.\n *\n * NOTE: This contract extends Abs_L1TokenGateway, which is where we\n * takes care of most of the initialization and the cross-chain logic.\n * If you are looking to implement your own deposit/withdrawal contracts, you\n * may also want to extend the abstract contract in a similar manner.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract OVM_L1ERC20Gateway is Abs_L1TokenGateway {\n\n /********************************\n * External Contract References *\n ********************************/\n\n iOVM_ERC20 public l1ERC20;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _l1ERC20 L1 ERC20 address this contract stores deposits for\n * @param _l2DepositedERC20 L2 Gateway address on the chain being deposited into\n */\n constructor(\n iOVM_ERC20 _l1ERC20,\n address _l2DepositedERC20,\n address _l1messenger\n )\n Abs_L1TokenGateway(\n _l2DepositedERC20,\n _l1messenger\n )\n {\n l1ERC20 = _l1ERC20;\n }\n\n\n /**************\n * Accounting *\n **************/\n\n /**\n * @dev When a deposit is initiated on L1, the L1 Gateway\n * transfers the funds to itself for future withdrawals\n *\n * @param _from L1 address ETH is being deposited from\n * param _to L2 address that the ETH is being deposited to\n * @param _amount Amount of ERC20 to send\n */\n function _handleInitiateDeposit(\n address _from,\n address, // _to,\n uint256 _amount\n )\n internal\n override\n {\n // Hold on to the newly deposited funds\n l1ERC20.transferFrom(\n _from,\n address(this),\n _amount\n );\n }\n\n /**\n * @dev When a withdrawal is finalized on L1, the L1 Gateway\n * transfers the funds to the withdrawer\n *\n * @param _to L1 address that the ERC20 is being withdrawn to\n * @param _amount Amount of ERC20 to send\n */\n function _handleFinalizeWithdrawal(\n address _to,\n uint _amount\n )\n internal\n override\n {\n // Transfer withdrawn funds out to withdrawer\n l1ERC20.transfer(_to, _amount);\n }\n}\n" + }, + "contracts/optimistic-ethereum/iOVM/predeploys/iOVM_ERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/**\n * @title iOVM_ERC20\n */\ninterface iOVM_ERC20 {\n /* This is a slight change to the ERC20 base standard.\n function totalSupply() constant returns (uint256 supply);\n is replaced with:\n uint256 public totalSupply;\n This automatically creates a getter function for the totalSupply.\n This is moved to the base contract since public getter functions are not\n currently recognised as an implementation of the matching abstract\n function by the compiler.\n */\n /// total amount of tokens\n function totalSupply() external view returns (uint256);\n\n /// @param _owner The address from which the balance will be retrieved\n /// @return balance The balance\n function balanceOf(address _owner) external view returns (uint256 balance);\n\n /// @notice send `_value` token to `_to` from `msg.sender`\n /// @param _to The address of the recipient\n /// @param _value The amount of token to be transferred\n /// @return success Whether the transfer was successful or not\n function transfer(address _to, uint256 _value) external returns (bool success);\n\n /// @notice send `_value` token to `_to` from `_from` on the condition it is approved by `_from`\n /// @param _from The address of the sender\n /// @param _to The address of the recipient\n /// @param _value The amount of token to be transferred\n /// @return success Whether the transfer was successful or not\n function transferFrom(address _from, address _to, uint256 _value) external returns (bool success);\n\n /// @notice `msg.sender` approves `_spender` to spend `_value` tokens\n /// @param _spender The address of the account able to transfer the tokens\n /// @param _value The amount of tokens to be approved for transfer\n /// @return success Whether the approval was successful or not\n function approve(address _spender, uint256 _value) external returns (bool success);\n\n /// @param _owner The address of the account owning tokens\n /// @param _spender The address of the account able to transfer the tokens\n /// @return remaining Amount of remaining tokens allowed to spent\n function allowance(address _owner, address _spender) external view returns (uint256 remaining);\n\n // solhint-disable-next-line no-simple-event-func-name\n event Transfer(address indexed _from, address indexed _to, uint256 _value);\n event Approval(address indexed _owner, address indexed _spender, uint256 _value);\n event Mint(address indexed _account, uint256 _amount);\n event Burn(address indexed _account, uint256 _amount);\n}\n" + }, + "contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1MultiMessageRelayer.sol": { + "content": "// SPDX-License-Identifier: MIT\n// @unsupported: ovm\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Interface Imports */\nimport { iOVM_L1CrossDomainMessenger } from \"../../../iOVM/bridge/messaging/iOVM_L1CrossDomainMessenger.sol\";\nimport { iOVM_L1MultiMessageRelayer } from \"../../../iOVM/bridge/messaging/iOVM_L1MultiMessageRelayer.sol\";\n\n/* Library Imports */\nimport { Lib_AddressResolver } from \"../../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/**\n * @title OVM_L1MultiMessageRelayer\n * @dev The L1 Multi-Message Relayer contract is a gas efficiency optimization which enables the\n * relayer to submit multiple messages in a single transaction to be relayed by the L1 Cross Domain\n * Message Sender.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract OVM_L1MultiMessageRelayer is iOVM_L1MultiMessageRelayer, Lib_AddressResolver {\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n constructor(\n address _libAddressManager\n )\n Lib_AddressResolver(_libAddressManager)\n {}\n\n\n /**********************\n * Function Modifiers *\n **********************/\n\n modifier onlyBatchRelayer() {\n require(\n msg.sender == resolve(\"OVM_L2BatchMessageRelayer\"),\n \"OVM_L1MultiMessageRelayer: Function can only be called by the OVM_L2BatchMessageRelayer\"\n );\n _;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @notice Forwards multiple cross domain messages to the L1 Cross Domain Messenger for relaying\n * @param _messages An array of L2 to L1 messages\n */\n function batchRelayMessages(\n L2ToL1Message[] calldata _messages\n ) \n override\n external\n onlyBatchRelayer\n {\n iOVM_L1CrossDomainMessenger messenger = iOVM_L1CrossDomainMessenger(\n resolve(\"Proxy__OVM_L1CrossDomainMessenger\")\n );\n\n for (uint256 i = 0; i < _messages.length; i++) {\n L2ToL1Message memory message = _messages[i];\n messenger.relayMessage(\n message.target,\n message.sender,\n message.message,\n message.messageNonce,\n message.proof\n );\n }\n }\n}\n" + }, + "contracts/optimistic-ethereum/iOVM/bridge/messaging/iOVM_L1MultiMessageRelayer.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Interface Imports */\nimport { iOVM_L1CrossDomainMessenger } from \"../../../iOVM/bridge/messaging/iOVM_L1CrossDomainMessenger.sol\";\ninterface iOVM_L1MultiMessageRelayer {\n\n struct L2ToL1Message {\n address target;\n address sender;\n bytes message;\n uint256 messageNonce;\n iOVM_L1CrossDomainMessenger.L2MessageInclusionProof proof;\n }\n\n function batchRelayMessages(L2ToL1Message[] calldata _messages) external;\n}\n" + }, + "contracts/test-libraries/trie/TestLib_SecureMerkleTrie.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_SecureMerkleTrie } from \"../../optimistic-ethereum/libraries/trie/Lib_SecureMerkleTrie.sol\";\n\n/**\n * @title TestLib_SecureMerkleTrie\n */\ncontract TestLib_SecureMerkleTrie {\n\n function verifyInclusionProof(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n )\n public\n pure\n returns (\n bool\n )\n {\n return Lib_SecureMerkleTrie.verifyInclusionProof(\n _key,\n _value,\n _proof,\n _root\n );\n }\n\n function verifyExclusionProof(\n bytes memory _key,\n bytes memory _proof,\n bytes32 _root\n )\n public\n pure\n returns (\n bool\n )\n {\n return Lib_SecureMerkleTrie.verifyExclusionProof(\n _key,\n _proof,\n _root\n );\n }\n\n function update(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n )\n public\n pure\n returns (\n bytes32\n )\n {\n return Lib_SecureMerkleTrie.update(\n _key,\n _value,\n _proof,\n _root\n );\n }\n\n function get(\n bytes memory _key,\n bytes memory _proof,\n bytes32 _root\n )\n public\n pure\n returns (\n bool,\n bytes memory\n )\n {\n return Lib_SecureMerkleTrie.get(\n _key,\n _proof,\n _root\n );\n }\n\n function getSingleNodeRootHash(\n bytes memory _key,\n bytes memory _value\n )\n public\n pure\n returns (\n bytes32\n )\n {\n return Lib_SecureMerkleTrie.getSingleNodeRootHash(\n _key,\n _value\n );\n }\n}\n" + }, + "contracts/test-libraries/trie/TestLib_MerkleTrie.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Library Imports */\nimport { Lib_MerkleTrie } from \"../../optimistic-ethereum/libraries/trie/Lib_MerkleTrie.sol\";\n\n/**\n * @title TestLib_MerkleTrie\n */\ncontract TestLib_MerkleTrie {\n\n function verifyInclusionProof(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n )\n public\n pure\n returns (\n bool\n )\n {\n return Lib_MerkleTrie.verifyInclusionProof(\n _key,\n _value,\n _proof,\n _root\n );\n }\n\n function verifyExclusionProof(\n bytes memory _key,\n bytes memory _proof,\n bytes32 _root\n )\n public\n pure\n returns (\n bool\n )\n {\n return Lib_MerkleTrie.verifyExclusionProof(\n _key,\n _proof,\n _root\n );\n }\n\n function update(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n )\n public\n pure\n returns (\n bytes32\n )\n {\n return Lib_MerkleTrie.update(\n _key,\n _value,\n _proof,\n _root\n );\n }\n\n function get(\n bytes memory _key,\n bytes memory _proof,\n bytes32 _root\n )\n public\n pure\n returns (\n bool,\n bytes memory\n )\n {\n return Lib_MerkleTrie.get(\n _key,\n _proof,\n _root\n );\n }\n\n function getSingleNodeRootHash(\n bytes memory _key,\n bytes memory _value\n )\n public\n pure\n returns (\n bytes32\n )\n {\n return Lib_MerkleTrie.getSingleNodeRootHash(\n _key,\n _value\n );\n }\n}\n" + }, + "contracts/test-libraries/rlp/TestLib_RLPWriter.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_RLPWriter } from \"../../optimistic-ethereum/libraries/rlp/Lib_RLPWriter.sol\";\nimport { TestERC20 } from \"../../test-helpers/TestERC20.sol\";\n\n/**\n * @title TestLib_RLPWriter\n */\ncontract TestLib_RLPWriter {\n\n function writeBytes(\n bytes memory _in\n )\n public\n pure\n returns (\n bytes memory _out\n )\n {\n return Lib_RLPWriter.writeBytes(_in);\n }\n\n function writeList(\n bytes[] memory _in\n )\n public\n pure\n returns (\n bytes memory _out\n )\n {\n return Lib_RLPWriter.writeList(_in);\n }\n\n function writeString(\n string memory _in\n )\n public\n pure\n returns (\n bytes memory _out\n )\n {\n return Lib_RLPWriter.writeString(_in);\n }\n\n function writeAddress(\n address _in\n )\n public\n pure\n returns (\n bytes memory _out\n )\n {\n return Lib_RLPWriter.writeAddress(_in);\n }\n\n function writeUint(\n uint256 _in\n )\n public\n pure\n returns (\n bytes memory _out\n )\n {\n return Lib_RLPWriter.writeUint(_in);\n }\n\n function writeBool(\n bool _in\n )\n public\n pure\n returns (\n bytes memory _out\n )\n {\n return Lib_RLPWriter.writeBool(_in);\n }\n\n function writeAddressWithTaintedMemory(\n address _in\n )\n public\n returns (\n bytes memory _out\n )\n {\n new TestERC20();\n return Lib_RLPWriter.writeAddress(_in);\n }\n}\n" + }, + "contracts/test-helpers/TestERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n// a test ERC20 token with an open mint function\ncontract TestERC20 {\n using SafeMath for uint;\n\n string public constant name = 'Test';\n string public constant symbol = 'TST';\n uint8 public constant decimals = 18;\n uint256 public totalSupply;\n mapping(address => uint) public balanceOf;\n mapping(address => mapping(address => uint)) public allowance;\n\n event Approval(address indexed owner, address indexed spender, uint256 value);\n event Transfer(address indexed from, address indexed to, uint256 value);\n\n constructor() {}\n\n function mint(address to, uint256 value) public {\n totalSupply = totalSupply.add(value);\n balanceOf[to] = balanceOf[to].add(value);\n emit Transfer(address(0), to, value);\n }\n\n function _approve(address owner, address spender, uint256 value) private {\n allowance[owner][spender] = value;\n emit Approval(owner, spender, value);\n }\n\n function _transfer(address from, address to, uint256 value) private {\n balanceOf[from] = balanceOf[from].sub(value);\n balanceOf[to] = balanceOf[to].add(value);\n emit Transfer(from, to, value);\n }\n\n function approve(address spender, uint256 value) external returns (bool) {\n _approve(msg.sender, spender, value);\n return true;\n }\n\n function transfer(address to, uint256 value) external returns (bool) {\n _transfer(msg.sender, to, value);\n return true;\n }\n\n function transferFrom(address from, address to, uint256 value) external returns (bool) {\n if (allowance[from][msg.sender] != uint(-1)) {\n allowance[from][msg.sender] = allowance[from][msg.sender].sub(value);\n }\n _transfer(from, to, value);\n return true;\n }\n}\n\nlibrary SafeMath {\n function add(uint256 x, uint256 y) internal pure returns (uint256 z) {\n require((z = x + y) >= x, 'ds-math-add-overflow');\n }\n\n function sub(uint256 x, uint256 y) internal pure returns (uint256 z) {\n require((z = x - y) <= x, 'ds-math-sub-underflow');\n }\n\n function mul(uint256 x, uint256 y) internal pure returns (uint256 z) {\n require(y == 0 || (z = x * y) / y == x, 'ds-math-mul-overflow');\n }\n}\n" + }, + "contracts/test-libraries/utils/TestLib_BytesUtils.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_BytesUtils } from \"../../optimistic-ethereum/libraries/utils/Lib_BytesUtils.sol\";\nimport { TestERC20 } from \"../../test-helpers/TestERC20.sol\";\n\n/**\n * @title TestLib_BytesUtils\n */\ncontract TestLib_BytesUtils {\n\n function concat(\n bytes memory _preBytes,\n bytes memory _postBytes\n )\n public\n pure\n returns (bytes memory)\n {\n return abi.encodePacked(\n _preBytes,\n _postBytes\n );\n }\n\n function slice(\n bytes memory _bytes,\n uint256 _start,\n uint256 _length\n )\n public\n pure\n returns (bytes memory)\n {\n return Lib_BytesUtils.slice(\n _bytes,\n _start,\n _length\n );\n }\n\n function toBytes32(\n bytes memory _bytes\n )\n public\n pure\n returns (bytes32)\n {\n return Lib_BytesUtils.toBytes32(\n _bytes\n );\n }\n\n function toUint256(\n bytes memory _bytes\n )\n public\n pure\n returns (uint256)\n {\n return Lib_BytesUtils.toUint256(\n _bytes\n );\n }\n\n function toNibbles(\n bytes memory _bytes\n )\n public\n pure\n returns (bytes memory)\n {\n return Lib_BytesUtils.toNibbles(\n _bytes\n );\n }\n\n function fromNibbles(\n bytes memory _bytes\n )\n public\n pure\n returns (bytes memory)\n {\n return Lib_BytesUtils.fromNibbles(\n _bytes\n );\n }\n\n function equal(\n bytes memory _bytes,\n bytes memory _other\n )\n public\n pure\n returns (bool)\n {\n return Lib_BytesUtils.equal(\n _bytes,\n _other\n );\n }\n\n function sliceWithTaintedMemory(\n bytes memory _bytes,\n uint256 _start,\n uint256 _length\n )\n public\n returns (bytes memory)\n {\n new TestERC20();\n return Lib_BytesUtils.slice(\n _bytes,\n _start,\n _length\n );\n }\n}\n" + }, + "contracts/test-libraries/utils/TestLib_EthUtils.sol": { + "content": "// SPDX-License-Identifier: MIT\n// @unsupported: ovm\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_EthUtils } from \"../../optimistic-ethereum/libraries/utils/Lib_EthUtils.sol\";\n\n/**\n * @title TestLib_EthUtils\n */\ncontract TestLib_EthUtils {\n\n function getCode(\n address _address,\n uint256 _offset,\n uint256 _length\n )\n public\n view\n returns (\n bytes memory _code\n )\n {\n return Lib_EthUtils.getCode(\n _address,\n _offset,\n _length\n );\n }\n\n function getCode(\n address _address\n )\n public\n view\n returns (\n bytes memory _code\n )\n {\n return Lib_EthUtils.getCode(\n _address\n );\n }\n\n function getCodeSize(\n address _address\n )\n public\n view\n returns (\n uint256 _codeSize\n )\n {\n return Lib_EthUtils.getCodeSize(\n _address\n );\n }\n\n function getCodeHash(\n address _address\n )\n public\n view\n returns (\n bytes32 _codeHash\n )\n {\n return Lib_EthUtils.getCodeHash(\n _address\n );\n }\n\n function createContract(\n bytes memory _code\n )\n public\n returns (\n address _created\n )\n {\n return Lib_EthUtils.createContract(\n _code\n );\n }\n\n function getAddressForCREATE(\n address _creator,\n uint256 _nonce\n )\n public\n pure\n returns (\n address _address\n )\n {\n return Lib_EthUtils.getAddressForCREATE(\n _creator,\n _nonce\n );\n }\n\n function getAddressForCREATE2(\n address _creator,\n bytes memory _bytecode,\n bytes32 _salt\n )\n public\n pure\n returns (address _address)\n {\n return Lib_EthUtils.getAddressForCREATE2(\n _creator,\n _bytecode,\n _salt\n );\n }\n}\n" + }, + "contracts/test-libraries/utils/TestLib_Bytes32Utils.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Library Imports */\nimport { Lib_Bytes32Utils } from \"../../optimistic-ethereum/libraries/utils/Lib_Bytes32Utils.sol\";\n\n/**\n * @title TestLib_Byte32Utils\n */\ncontract TestLib_Bytes32Utils {\n\n function toBool(\n bytes32 _in\n )\n public\n pure\n returns (\n bool _out\n )\n {\n return Lib_Bytes32Utils.toBool(_in);\n }\n\n function fromBool(\n bool _in\n )\n public\n pure\n returns (\n bytes32 _out\n )\n {\n return Lib_Bytes32Utils.fromBool(_in);\n }\n\n function toAddress(\n bytes32 _in\n )\n public\n pure\n returns (\n address _out\n )\n {\n return Lib_Bytes32Utils.toAddress(_in);\n }\n\n function fromAddress(\n address _in\n )\n public\n pure\n returns (\n bytes32 _out\n )\n {\n return Lib_Bytes32Utils.fromAddress(_in);\n }\n}\n" + }, + "contracts/test-libraries/codec/TestLib_EIP155Tx.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_EIP155Tx } from \"../../optimistic-ethereum/libraries/codec/Lib_EIP155Tx.sol\";\n\n/**\n * @title TestLib_EIP155Tx\n */\ncontract TestLib_EIP155Tx {\n function decode(\n bytes memory _encoded,\n uint256 _chainId\n )\n public\n pure\n returns (\n Lib_EIP155Tx.EIP155Tx memory\n )\n {\n return Lib_EIP155Tx.decode(\n _encoded,\n _chainId\n );\n }\n\n function encode(\n Lib_EIP155Tx.EIP155Tx memory _transaction,\n bool _includeSignature\n )\n public\n pure\n returns (\n bytes memory\n )\n {\n return Lib_EIP155Tx.encode(\n _transaction,\n _includeSignature\n );\n }\n\n function hash(\n Lib_EIP155Tx.EIP155Tx memory _transaction\n )\n public\n pure\n returns (\n bytes32\n )\n {\n return Lib_EIP155Tx.hash(\n _transaction\n );\n }\n\n function sender(\n Lib_EIP155Tx.EIP155Tx memory _transaction\n )\n public\n pure\n returns (\n address\n )\n {\n return Lib_EIP155Tx.sender(\n _transaction\n );\n }\n}\n" + }, + "contracts/test-libraries/rlp/TestLib_RLPReader.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_RLPReader } from \"../../optimistic-ethereum/libraries/rlp/Lib_RLPReader.sol\";\n\n/**\n * @title TestLib_RLPReader\n */\ncontract TestLib_RLPReader {\n\n function readList(\n bytes memory _in\n )\n public\n pure\n returns (\n bytes[] memory\n )\n {\n Lib_RLPReader.RLPItem[] memory decoded = Lib_RLPReader.readList(_in);\n bytes[] memory out = new bytes[](decoded.length);\n for (uint256 i = 0; i < out.length; i++) {\n out[i] = Lib_RLPReader.readRawBytes(decoded[i]);\n }\n return out;\n }\n\n function readString(\n bytes memory _in\n )\n public\n pure\n returns (\n string memory\n )\n {\n return Lib_RLPReader.readString(_in);\n }\n\n function readBytes(\n bytes memory _in\n )\n public\n pure\n returns (\n bytes memory\n )\n {\n return Lib_RLPReader.readBytes(_in);\n }\n\n function readBytes32(\n bytes memory _in\n )\n public\n pure\n returns (\n bytes32\n )\n {\n return Lib_RLPReader.readBytes32(_in);\n }\n\n function readUint256(\n bytes memory _in\n )\n public\n pure\n returns (\n uint256\n )\n {\n return Lib_RLPReader.readUint256(_in);\n }\n\n function readBool(\n bytes memory _in\n )\n public\n pure\n returns (\n bool\n )\n {\n return Lib_RLPReader.readBool(_in);\n }\n\n function readAddress(\n bytes memory _in\n )\n public\n pure\n returns (\n address\n )\n {\n return Lib_RLPReader.readAddress(_in);\n }\n}\n" + }, + "contracts/optimistic-ethereum/OVM/verification/OVM_BondManager.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Library Imports */\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/* Interface Imports */\nimport { iOVM_BondManager, Errors, ERC20 } from \"../../iOVM/verification/iOVM_BondManager.sol\";\nimport { iOVM_FraudVerifier } from \"../../iOVM/verification/iOVM_FraudVerifier.sol\";\n\n/**\n * @title OVM_BondManager\n * @dev The Bond Manager contract handles deposits in the form of an ERC20 token from bonded\n * Proposers. It also handles the accounting of gas costs spent by a Verifier during the course of a\n * fraud proof. In the event of a successful fraud proof, the fraudulent Proposer's bond is slashed,\n * and the Verifier's gas costs are refunded.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract OVM_BondManager is iOVM_BondManager, Lib_AddressResolver {\n\n /****************************\n * Constants and Parameters *\n ****************************/\n\n /// The period to find the earliest fraud proof for a publisher\n uint256 public constant multiFraudProofPeriod = 7 days;\n\n /// The dispute period\n uint256 public constant disputePeriodSeconds = 7 days;\n\n /// The minimum collateral a sequencer must post\n uint256 public constant requiredCollateral = 1 ether;\n\n\n /*******************************************\n * Contract Variables: Contract References *\n *******************************************/\n\n /// The bond token\n ERC20 immutable public token;\n\n\n /********************************************\n * Contract Variables: Internal Accounting *\n *******************************************/\n\n /// The bonds posted by each proposer\n mapping(address => Bond) public bonds;\n\n /// For each pre-state root, there's an array of witnessProviders that must be rewarded\n /// for posting witnesses\n mapping(bytes32 => Rewards) public witnessProviders;\n\n\n /***************\n * Constructor *\n ***************/\n\n /// Initializes with a ERC20 token to be used for the fidelity bonds\n /// and with the Address Manager\n constructor(\n ERC20 _token,\n address _libAddressManager\n )\n Lib_AddressResolver(_libAddressManager)\n {\n token = _token;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n /// Adds `who` to the list of witnessProviders for the provided `preStateRoot`.\n function recordGasSpent(bytes32 _preStateRoot, bytes32 _txHash, address who, uint256 gasSpent) override public {\n // The sender must be the transitioner that corresponds to the claimed pre-state root\n address transitioner = address(iOVM_FraudVerifier(resolve(\"OVM_FraudVerifier\")).getStateTransitioner(_preStateRoot, _txHash));\n require(transitioner == msg.sender, Errors.ONLY_TRANSITIONER);\n\n witnessProviders[_preStateRoot].total += gasSpent;\n witnessProviders[_preStateRoot].gasSpent[who] += gasSpent;\n }\n\n /// Slashes + distributes rewards or frees up the sequencer's bond, only called by\n /// `FraudVerifier.finalizeFraudVerification`\n function finalize(bytes32 _preStateRoot, address publisher, uint256 timestamp) override public {\n require(msg.sender == resolve(\"OVM_FraudVerifier\"), Errors.ONLY_FRAUD_VERIFIER);\n require(witnessProviders[_preStateRoot].canClaim == false, Errors.ALREADY_FINALIZED);\n\n // allow users to claim from that state root's\n // pool of collateral (effectively slashing the sequencer)\n witnessProviders[_preStateRoot].canClaim = true;\n\n Bond storage bond = bonds[publisher];\n if (bond.firstDisputeAt == 0) {\n bond.firstDisputeAt = block.timestamp;\n bond.earliestDisputedStateRoot = _preStateRoot;\n bond.earliestTimestamp = timestamp;\n } else if (\n // only update the disputed state root for the publisher if it's within\n // the dispute period _and_ if it's before the previous one\n block.timestamp < bond.firstDisputeAt + multiFraudProofPeriod &&\n timestamp < bond.earliestTimestamp\n ) {\n bond.earliestDisputedStateRoot = _preStateRoot;\n bond.earliestTimestamp = timestamp;\n }\n\n // if the fraud proof's dispute period does not intersect with the\n // withdrawal's timestamp, then the user should not be slashed\n // e.g if a user at day 10 submits a withdrawal, and a fraud proof\n // from day 1 gets published, the user won't be slashed since day 8 (1d + 7d)\n // is before the user started their withdrawal. on the contrary, if the user\n // had started their withdrawal at, say, day 6, they would be slashed\n if (\n bond.withdrawalTimestamp != 0 &&\n uint256(bond.withdrawalTimestamp) > timestamp + disputePeriodSeconds &&\n bond.state == State.WITHDRAWING\n ) {\n return;\n }\n\n // slash!\n bond.state = State.NOT_COLLATERALIZED;\n }\n\n /// Sequencers call this function to post collateral which will be used for\n /// the `appendBatch` call\n function deposit() override public {\n require(\n token.transferFrom(msg.sender, address(this), requiredCollateral),\n Errors.ERC20_ERR\n );\n\n // This cannot overflow\n bonds[msg.sender].state = State.COLLATERALIZED;\n }\n\n /// Starts the withdrawal for a publisher\n function startWithdrawal() override public {\n Bond storage bond = bonds[msg.sender];\n require(bond.withdrawalTimestamp == 0, Errors.WITHDRAWAL_PENDING);\n require(bond.state == State.COLLATERALIZED, Errors.WRONG_STATE);\n\n bond.state = State.WITHDRAWING;\n bond.withdrawalTimestamp = uint32(block.timestamp);\n }\n\n /// Finalizes a pending withdrawal from a publisher\n function finalizeWithdrawal() override public {\n Bond storage bond = bonds[msg.sender];\n\n require(\n block.timestamp >= uint256(bond.withdrawalTimestamp) + disputePeriodSeconds,\n Errors.TOO_EARLY\n );\n require(bond.state == State.WITHDRAWING, Errors.SLASHED);\n\n // refunds!\n bond.state = State.NOT_COLLATERALIZED;\n bond.withdrawalTimestamp = 0;\n\n require(\n token.transfer(msg.sender, requiredCollateral),\n Errors.ERC20_ERR\n );\n }\n\n /// Claims the user's reward for the witnesses they provided for the earliest\n /// disputed state root of the designated publisher\n function claim(address who) override public {\n Bond storage bond = bonds[who];\n require(\n block.timestamp >= bond.firstDisputeAt + multiFraudProofPeriod,\n Errors.WAIT_FOR_DISPUTES\n );\n\n // reward the earliest state root for this publisher\n bytes32 _preStateRoot = bond.earliestDisputedStateRoot;\n Rewards storage rewards = witnessProviders[_preStateRoot];\n\n // only allow claiming if fraud was proven in `finalize`\n require(rewards.canClaim, Errors.CANNOT_CLAIM);\n\n // proportional allocation - only reward 50% (rest gets locked in the\n // contract forever\n uint256 amount = (requiredCollateral * rewards.gasSpent[msg.sender]) / (2 * rewards.total);\n\n // reset the user's spent gas so they cannot double claim\n rewards.gasSpent[msg.sender] = 0;\n\n // transfer\n require(token.transfer(msg.sender, amount), Errors.ERC20_ERR);\n }\n\n /// Checks if the user is collateralized\n function isCollateralized(address who) override public view returns (bool) {\n return bonds[who].state == State.COLLATERALIZED;\n }\n\n /// Gets how many witnesses the user has provided for the state root\n function getGasSpent(bytes32 preStateRoot, address who) override public view returns (uint256) {\n return witnessProviders[preStateRoot].gasSpent[who];\n }\n}\n" + }, + "contracts/test-helpers/Mock_FraudVerifier.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\nimport { OVM_BondManager } from \"./../optimistic-ethereum/OVM/verification/OVM_BondManager.sol\";\n\ncontract Mock_FraudVerifier {\n OVM_BondManager bondManager;\n\n mapping (bytes32 => address) transitioners;\n\n function setBondManager(OVM_BondManager _bondManager) public {\n bondManager = _bondManager;\n }\n\n function setStateTransitioner(bytes32 preStateRoot, bytes32 txHash, address addr) public {\n transitioners[keccak256(abi.encodePacked(preStateRoot, txHash))] = addr;\n }\n\n function getStateTransitioner(\n bytes32 _preStateRoot,\n bytes32 _txHash\n )\n public\n view\n returns (\n address\n )\n {\n return transitioners[keccak256(abi.encodePacked(_preStateRoot, _txHash))];\n }\n\n function finalize(bytes32 _preStateRoot, address publisher, uint256 timestamp) public {\n bondManager.finalize(_preStateRoot, publisher, timestamp);\n }\n}\n" + }, + "contracts/optimistic-ethereum/mockOVM/verification/mockOVM_BondManager.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Interface Imports */\nimport { iOVM_BondManager } from \"../../iOVM/verification/iOVM_BondManager.sol\";\n\n/* Contract Imports */\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/**\n * @title mockOVM_BondManager\n */\ncontract mockOVM_BondManager is iOVM_BondManager, Lib_AddressResolver {\n constructor(\n address _libAddressManager\n )\n Lib_AddressResolver(_libAddressManager)\n {}\n\n function recordGasSpent(\n bytes32 _preStateRoot,\n bytes32 _txHash,\n address _who,\n uint256 _gasSpent\n )\n override\n public\n {}\n\n function finalize(\n bytes32 _preStateRoot,\n address _publisher,\n uint256 _timestamp\n )\n override\n public\n {}\n\n function deposit()\n override\n public\n {}\n\n function startWithdrawal()\n override\n public\n {}\n\n function finalizeWithdrawal()\n override\n public\n {}\n\n function claim(\n address _who\n )\n override\n public\n {}\n\n function isCollateralized(\n address _who\n )\n override\n public\n view\n returns (\n bool\n )\n {\n // Only authenticate sequencer to submit state root batches.\n return _who == resolve(\"OVM_Proposer\");\n }\n\n function getGasSpent(\n bytes32, // _preStateRoot,\n address // _who\n )\n override\n public\n pure\n returns (\n uint256\n )\n {\n return 0;\n }\n}\n" + }, + "contracts/test-libraries/utils/TestLib_MerkleTree.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_MerkleTree } from \"../../optimistic-ethereum/libraries/utils/Lib_MerkleTree.sol\";\n\n/**\n * @title TestLib_MerkleTree\n */\ncontract TestLib_MerkleTree {\n\n function getMerkleRoot(\n bytes32[] memory _elements\n )\n public\n pure\n returns (\n bytes32\n )\n {\n return Lib_MerkleTree.getMerkleRoot(\n _elements\n );\n }\n\n function verify(\n bytes32 _root,\n bytes32 _leaf,\n uint256 _index,\n bytes32[] memory _siblings,\n uint256 _totalLeaves\n )\n public\n pure\n returns (\n bool\n )\n {\n return Lib_MerkleTree.verify(\n _root,\n _leaf,\n _index,\n _siblings,\n _totalLeaves\n );\n }\n}\n" + }, + "contracts/test-libraries/utils/TestLib_RingBuffer.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_RingBuffer } from \"../../optimistic-ethereum/libraries/utils/Lib_RingBuffer.sol\";\n\n/**\n * @title TestLib_RingBuffer\n */\ncontract TestLib_RingBuffer {\n using Lib_RingBuffer for Lib_RingBuffer.RingBuffer;\n\n Lib_RingBuffer.RingBuffer internal buf;\n\n function push(\n bytes32 _value,\n bytes27 _extraData\n )\n public\n {\n buf.push(\n _value,\n _extraData\n );\n }\n\n function get(\n uint256 _index\n )\n public\n view\n returns (\n bytes32\n )\n {\n return buf.get(_index);\n }\n\n function deleteElementsAfterInclusive(\n uint40 _index,\n bytes27 _extraData\n )\n internal\n {\n return buf.deleteElementsAfterInclusive(\n _index,\n _extraData\n );\n }\n\n function getLength()\n internal\n view\n returns (\n uint40\n )\n {\n return buf.getLength();\n }\n\n function getExtraData()\n internal\n view\n returns (\n bytes27\n )\n {\n return buf.getExtraData();\n }\n}\n" + } + }, + "settings": { + "optimizer": { + "enabled": true, + "runs": 200 + }, + "outputSelection": { + "*": { + "*": [ + "storageLayout", + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata", + "devdoc", + "userdoc", + "evm.gasEstimates" + ], + "": [ + "ast" + ] + } + }, + "metadata": { + "useLiteralContent": true + } + } +} \ No newline at end of file diff --git a/packages/contracts/deployments/kovan-v3/.chainId b/packages/contracts/deployments/kovan-v3/.chainId new file mode 100644 index 0000000000000..f70d7bba4ae1f --- /dev/null +++ b/packages/contracts/deployments/kovan-v3/.chainId @@ -0,0 +1 @@ +42 \ No newline at end of file diff --git a/packages/contracts/deployments/kovan-v3/Lib_AddressManager.json b/packages/contracts/deployments/kovan-v3/Lib_AddressManager.json new file mode 100644 index 0000000000000..6f254b77797c1 --- /dev/null +++ b/packages/contracts/deployments/kovan-v3/Lib_AddressManager.json @@ -0,0 +1,230 @@ +{ + "address": "0xd56F695e73286ac252A37593DD4E7c14270eC1Df", + "abi": [ + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "string", + "name": "_name", + "type": "string" + }, + { + "indexed": false, + "internalType": "address", + "name": "_newAddress", + "type": "address" + } + ], + "name": "AddressSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "_name", + "type": "string" + } + ], + "name": "getAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "_name", + "type": "string" + }, + { + "internalType": "address", + "name": "_address", + "type": "address" + } + ], + "name": "setAddress", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "transactionHash": "0x3f80c75882bf9b2b74d3153cdc8d205e473891a8056604c361c32822f88a1a04", + "receipt": { + "to": null, + "from": "0x18394B52d3Cb931dfA76F63251919D051953413d", + "contractAddress": "0xd56F695e73286ac252A37593DD4E7c14270eC1Df", + "transactionIndex": 5, + "gasUsed": "425977", + "logsBloom": "0x00000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000001000000000000000000000000020000000000020000000000000000000800000000000000000000000000000000400000000000000000000000000000000000000000000080000000000000000000000000000000000000010000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000020000080000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0x570e3192ef23218091f6ad7d48a122cd3d4dc06792cb1c4f6523bdbbe3d88b0c", + "transactionHash": "0x3f80c75882bf9b2b74d3153cdc8d205e473891a8056604c361c32822f88a1a04", + "logs": [ + { + "transactionIndex": 5, + "blockNumber": 24572757, + "transactionHash": "0x3f80c75882bf9b2b74d3153cdc8d205e473891a8056604c361c32822f88a1a04", + "address": "0xd56F695e73286ac252A37593DD4E7c14270eC1Df", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x00000000000000000000000018394b52d3cb931dfa76f63251919d051953413d" + ], + "data": "0x", + "logIndex": 10, + "blockHash": "0x570e3192ef23218091f6ad7d48a122cd3d4dc06792cb1c4f6523bdbbe3d88b0c" + } + ], + "blockNumber": 24572757, + "cumulativeGasUsed": "863778", + "status": 1, + "byzantium": true + }, + "args": [], + "solcInputHash": "5ee8e508e2c54cb5ac6783b4855b1558", + "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_newAddress\",\"type\":\"address\"}],\"name\":\"AddressSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"getAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"_address\",\"type\":\"address\"}],\"name\":\"setAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"getAddress(string)\":{\"params\":{\"_name\":\"Name to retrieve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner.\"},\"setAddress(string,address)\":{\"params\":{\"_address\":\"Address to associate with the name.\",\"_name\":\"String name to associate an address with.\"}},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"}},\"title\":\"Lib_AddressManager\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"getAddress(string)\":{\"notice\":\"Retrieves the address associated with a given name.\"},\"setAddress(string,address)\":{\"notice\":\"Changes the address associated with a particular name.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":\"Lib_AddressManager\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor () internal {\\n address msgSender = _msgSender();\\n _owner = msgSender;\\n emit OwnershipTransferred(address(0), msgSender);\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n emit OwnershipTransferred(_owner, address(0));\\n _owner = address(0);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n emit OwnershipTransferred(_owner, newOwner);\\n _owner = newOwner;\\n }\\n}\\n\",\"keccak256\":\"0x15e2d5bd4c28a88548074c54d220e8086f638a71ed07e6b3ba5a70066fcf458d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with GSN meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address payable) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes memory) {\\n this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x8d3cb350f04ff49cfb10aef08d87f19dcbaecc8027b0bed12f3275cd12f38cf0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n public\\n onlyOwner\\n {\\n addresses[_getNameHash(_name)] = _address;\\n\\n emit AddressSet(\\n _name,\\n _address\\n );\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0x2ce671a0e004df88b136bea5a3c59d0732cea8887c8496da1d509e0200b03d7d\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x608060405234801561001057600080fd5b50600061001b61006a565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35061006e565b3390565b6106508061007d6000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c8063715018a61461005c5780638da5cb5b146100665780639b2ea4bd1461008a578063bf40fac11461013b578063f2fde38b146101e1575b600080fd5b610064610207565b005b61006e6102c5565b604080516001600160a01b039092168252519081900360200190f35b610064600480360360408110156100a057600080fd5b8101906020810181356401000000008111156100bb57600080fd5b8201836020820111156100cd57600080fd5b803590602001918460018302840111640100000000831117156100ef57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550505090356001600160a01b031691506102d49050565b61006e6004803603602081101561015157600080fd5b81019060208101813564010000000081111561016c57600080fd5b82018360208201111561017e57600080fd5b803590602001918460018302840111640100000000831117156101a057600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610436945050505050565b610064600480360360208110156101f757600080fd5b50356001600160a01b0316610465565b61020f610579565b6001600160a01b03166102206102c5565b6001600160a01b03161461027b576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b031690565b6102dc610579565b6001600160a01b03166102ed6102c5565b6001600160a01b031614610348576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b80600160006103568561057d565b815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b031602179055507f188466739ff00cc68bfb2367d23ae4b855264264fe1624caa8884399af23454c82826040518080602001836001600160a01b03168152602001828103825284818151815260200191508051906020019080838360005b838110156103f75781810151838201526020016103df565b50505050905090810190601f1680156104245780820380516001836020036101000a031916815260200191505b50935050505060405180910390a15050565b6000600160006104458461057d565b81526020810191909152604001600020546001600160a01b031692915050565b61046d610579565b6001600160a01b031661047e6102c5565b6001600160a01b0316146104d9576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b03811661051e5760405162461bcd60e51b81526004018080602001828103825260268152602001806105f56026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b3390565b6000816040516020018082805190602001908083835b602083106105b25780518252601f199092019160209182019101610593565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120905091905056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373a26469706673582212209107a301dfba06b8649cc1baf4f5d6df1fb45110fdd8dc25d143490e81f3587e64736f6c63430007060033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100575760003560e01c8063715018a61461005c5780638da5cb5b146100665780639b2ea4bd1461008a578063bf40fac11461013b578063f2fde38b146101e1575b600080fd5b610064610207565b005b61006e6102c5565b604080516001600160a01b039092168252519081900360200190f35b610064600480360360408110156100a057600080fd5b8101906020810181356401000000008111156100bb57600080fd5b8201836020820111156100cd57600080fd5b803590602001918460018302840111640100000000831117156100ef57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550505090356001600160a01b031691506102d49050565b61006e6004803603602081101561015157600080fd5b81019060208101813564010000000081111561016c57600080fd5b82018360208201111561017e57600080fd5b803590602001918460018302840111640100000000831117156101a057600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610436945050505050565b610064600480360360208110156101f757600080fd5b50356001600160a01b0316610465565b61020f610579565b6001600160a01b03166102206102c5565b6001600160a01b03161461027b576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b031690565b6102dc610579565b6001600160a01b03166102ed6102c5565b6001600160a01b031614610348576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b80600160006103568561057d565b815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b031602179055507f188466739ff00cc68bfb2367d23ae4b855264264fe1624caa8884399af23454c82826040518080602001836001600160a01b03168152602001828103825284818151815260200191508051906020019080838360005b838110156103f75781810151838201526020016103df565b50505050905090810190601f1680156104245780820380516001836020036101000a031916815260200191505b50935050505060405180910390a15050565b6000600160006104458461057d565b81526020810191909152604001600020546001600160a01b031692915050565b61046d610579565b6001600160a01b031661047e6102c5565b6001600160a01b0316146104d9576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b03811661051e5760405162461bcd60e51b81526004018080602001828103825260268152602001806105f56026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b3390565b6000816040516020018082805190602001908083835b602083106105b25780518252601f199092019160209182019101610593565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120905091905056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373a26469706673582212209107a301dfba06b8649cc1baf4f5d6df1fb45110fdd8dc25d143490e81f3587e64736f6c63430007060033", + "devdoc": { + "kind": "dev", + "methods": { + "getAddress(string)": { + "params": { + "_name": "Name to retrieve an address for." + }, + "returns": { + "_0": "Address associated with the given name." + } + }, + "owner()": { + "details": "Returns the address of the current owner." + }, + "renounceOwnership()": { + "details": "Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner." + }, + "setAddress(string,address)": { + "params": { + "_address": "Address to associate with the name.", + "_name": "String name to associate an address with." + } + }, + "transferOwnership(address)": { + "details": "Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner." + } + }, + "title": "Lib_AddressManager", + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": { + "getAddress(string)": { + "notice": "Retrieves the address associated with a given name." + }, + "setAddress(string,address)": { + "notice": "Changes the address associated with a particular name." + } + }, + "version": 1 + }, + "storageLayout": { + "storage": [ + { + "astId": 664, + "contract": "contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol:Lib_AddressManager", + "label": "_owner", + "offset": 0, + "slot": "0", + "type": "t_address" + }, + { + "astId": 12737, + "contract": "contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol:Lib_AddressManager", + "label": "addresses", + "offset": 0, + "slot": "1", + "type": "t_mapping(t_bytes32,t_address)" + } + ], + "types": { + "t_address": { + "encoding": "inplace", + "label": "address", + "numberOfBytes": "20" + }, + "t_bytes32": { + "encoding": "inplace", + "label": "bytes32", + "numberOfBytes": "32" + }, + "t_mapping(t_bytes32,t_address)": { + "encoding": "mapping", + "key": "t_bytes32", + "label": "mapping(bytes32 => address)", + "numberOfBytes": "32", + "value": "t_address" + } + } + } +} \ No newline at end of file diff --git a/packages/contracts/deployments/kovan-v3/OVM_CanonicalTransactionChain.json b/packages/contracts/deployments/kovan-v3/OVM_CanonicalTransactionChain.json new file mode 100644 index 0000000000000..16c213ccae639 --- /dev/null +++ b/packages/contracts/deployments/kovan-v3/OVM_CanonicalTransactionChain.json @@ -0,0 +1,819 @@ +{ + "address": "0x895eabB95D684c15fa46Dc00a6b7557450083DEF", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_libAddressManager", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_forceInclusionPeriodSeconds", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_forceInclusionPeriodBlocks", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_maxTransactionGasLimit", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "_startingQueueIndex", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_numQueueElements", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_totalElements", + "type": "uint256" + } + ], + "name": "QueueBatchAppended", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "_startingQueueIndex", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_numQueueElements", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_totalElements", + "type": "uint256" + } + ], + "name": "SequencerBatchAppended", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "_batchIndex", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "_batchRoot", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_batchSize", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_prevTotalElements", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "_extraData", + "type": "bytes" + } + ], + "name": "TransactionBatchAppended", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "_l1TxOrigin", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "_target", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_gasLimit", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "_data", + "type": "bytes" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_queueIndex", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_timestamp", + "type": "uint256" + } + ], + "name": "TransactionEnqueued", + "type": "event" + }, + { + "inputs": [], + "name": "L2_GAS_DISCOUNT_DIVISOR", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MAX_ROLLUP_TX_SIZE", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MIN_ROLLUP_TX_GAS", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "appendQueueBatch", + "outputs": [], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [], + "name": "appendSequencerBatch", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "batches", + "outputs": [ + { + "internalType": "contract iOVM_ChainStorageContainer", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_target", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_gasLimit", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "_data", + "type": "bytes" + } + ], + "name": "enqueue", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "forceInclusionPeriodBlocks", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "forceInclusionPeriodSeconds", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getLastBlockNumber", + "outputs": [ + { + "internalType": "uint40", + "name": "", + "type": "uint40" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getLastTimestamp", + "outputs": [ + { + "internalType": "uint40", + "name": "", + "type": "uint40" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getNextQueueIndex", + "outputs": [ + { + "internalType": "uint40", + "name": "", + "type": "uint40" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getNumPendingQueueElements", + "outputs": [ + { + "internalType": "uint40", + "name": "", + "type": "uint40" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_index", + "type": "uint256" + } + ], + "name": "getQueueElement", + "outputs": [ + { + "components": [ + { + "internalType": "bytes32", + "name": "transactionHash", + "type": "bytes32" + }, + { + "internalType": "uint40", + "name": "timestamp", + "type": "uint40" + }, + { + "internalType": "uint40", + "name": "blockNumber", + "type": "uint40" + } + ], + "internalType": "struct Lib_OVMCodec.QueueElement", + "name": "_element", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getQueueLength", + "outputs": [ + { + "internalType": "uint40", + "name": "", + "type": "uint40" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getTotalBatches", + "outputs": [ + { + "internalType": "uint256", + "name": "_totalBatches", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getTotalElements", + "outputs": [ + { + "internalType": "uint256", + "name": "_totalElements", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "libAddressManager", + "outputs": [ + { + "internalType": "contract Lib_AddressManager", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "maxTransactionGasLimit", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "queue", + "outputs": [ + { + "internalType": "contract iOVM_ChainStorageContainer", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "_name", + "type": "string" + } + ], + "name": "resolve", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "timestamp", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "blockNumber", + "type": "uint256" + }, + { + "internalType": "enum Lib_OVMCodec.QueueOrigin", + "name": "l1QueueOrigin", + "type": "uint8" + }, + { + "internalType": "address", + "name": "l1TxOrigin", + "type": "address" + }, + { + "internalType": "address", + "name": "entrypoint", + "type": "address" + }, + { + "internalType": "uint256", + "name": "gasLimit", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "internalType": "struct Lib_OVMCodec.Transaction", + "name": "_transaction", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "bool", + "name": "isSequenced", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "queueIndex", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "timestamp", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "blockNumber", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "txData", + "type": "bytes" + } + ], + "internalType": "struct Lib_OVMCodec.TransactionChainElement", + "name": "_txChainElement", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "batchIndex", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "batchRoot", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "batchSize", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "prevTotalElements", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "extraData", + "type": "bytes" + } + ], + "internalType": "struct Lib_OVMCodec.ChainBatchHeader", + "name": "_batchHeader", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + }, + { + "internalType": "bytes32[]", + "name": "siblings", + "type": "bytes32[]" + } + ], + "internalType": "struct Lib_OVMCodec.ChainInclusionProof", + "name": "_inclusionProof", + "type": "tuple" + } + ], + "name": "verifyTransaction", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "transactionHash": "0x87f51aeb050ec2c556d14cdc38b30125a66e88689373f727d2f03debbc1313fd", + "receipt": { + "to": null, + "from": "0x18394B52d3Cb931dfA76F63251919D051953413d", + "contractAddress": "0x895eabB95D684c15fa46Dc00a6b7557450083DEF", + "transactionIndex": 1, + "gasUsed": "2823402", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0x611066b262d0e72ca9d3d3d00a26327bc03a751fe0ffa189133486a0bd7e3eac", + "transactionHash": "0x87f51aeb050ec2c556d14cdc38b30125a66e88689373f727d2f03debbc1313fd", + "logs": [], + "blockNumber": 24572808, + "cumulativeGasUsed": "2868217", + "status": 1, + "byzantium": true + }, + "args": [ + "0xd56F695e73286ac252A37593DD4E7c14270eC1Df", + 2592000, + 172800, + 9000000 + ], + "solcInputHash": "5ee8e508e2c54cb5ac6783b4855b1558", + "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_forceInclusionPeriodSeconds\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_forceInclusionPeriodBlocks\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_maxTransactionGasLimit\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_startingQueueIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_numQueueElements\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_totalElements\",\"type\":\"uint256\"}],\"name\":\"QueueBatchAppended\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_startingQueueIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_numQueueElements\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_totalElements\",\"type\":\"uint256\"}],\"name\":\"SequencerBatchAppended\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_batchIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"_batchRoot\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_batchSize\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_prevTotalElements\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"_extraData\",\"type\":\"bytes\"}],\"name\":\"TransactionBatchAppended\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_l1TxOrigin\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_queueIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_timestamp\",\"type\":\"uint256\"}],\"name\":\"TransactionEnqueued\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"L2_GAS_DISCOUNT_DIVISOR\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAX_ROLLUP_TX_SIZE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MIN_ROLLUP_TX_GAS\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"appendQueueBatch\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"appendSequencerBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"batches\",\"outputs\":[{\"internalType\":\"contract iOVM_ChainStorageContainer\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"enqueue\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"forceInclusionPeriodBlocks\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"forceInclusionPeriodSeconds\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLastBlockNumber\",\"outputs\":[{\"internalType\":\"uint40\",\"name\":\"\",\"type\":\"uint40\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLastTimestamp\",\"outputs\":[{\"internalType\":\"uint40\",\"name\":\"\",\"type\":\"uint40\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getNextQueueIndex\",\"outputs\":[{\"internalType\":\"uint40\",\"name\":\"\",\"type\":\"uint40\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getNumPendingQueueElements\",\"outputs\":[{\"internalType\":\"uint40\",\"name\":\"\",\"type\":\"uint40\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"getQueueElement\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"transactionHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint40\",\"name\":\"timestamp\",\"type\":\"uint40\"},{\"internalType\":\"uint40\",\"name\":\"blockNumber\",\"type\":\"uint40\"}],\"internalType\":\"struct Lib_OVMCodec.QueueElement\",\"name\":\"_element\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getQueueLength\",\"outputs\":[{\"internalType\":\"uint40\",\"name\":\"\",\"type\":\"uint40\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTotalBatches\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_totalBatches\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTotalElements\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_totalElements\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maxTransactionGasLimit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"queue\",\"outputs\":[{\"internalType\":\"contract iOVM_ChainStorageContainer\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"enum Lib_OVMCodec.QueueOrigin\",\"name\":\"l1QueueOrigin\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"l1TxOrigin\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"entrypoint\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.Transaction\",\"name\":\"_transaction\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isSequenced\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"queueIndex\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"txData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.TransactionChainElement\",\"name\":\"_txChainElement\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"_batchHeader\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"siblings\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct Lib_OVMCodec.ChainInclusionProof\",\"name\":\"_inclusionProof\",\"type\":\"tuple\"}],\"name\":\"verifyTransaction\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The Canonical Transaction Chain (CTC) contract is an append-only log of transactions which must be applied to the rollup state. It defines the ordering of rollup transactions by writing them to the 'CTC:batches' instance of the Chain Storage Container. The CTC also allows any account to 'enqueue' an L2 transaction, which will require that the Sequencer will eventually append it to the rollup state. If the Sequencer does not include an enqueued transaction within the 'force inclusion period', then any account may force it to be included by calling appendQueueBatch(). Compiler used: solc Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"appendSequencerBatch()\":{\"details\":\"This function uses a custom encoding scheme for efficiency reasons. .param _shouldStartAtElement Specific batch we expect to start appending to. .param _totalElementsToAppend Total number of batch elements we expect to append. .param _contexts Array of batch contexts. .param _transactionDataFields Array of raw transaction data.\"},\"batches()\":{\"returns\":{\"_0\":\"Reference to the batch storage container.\"}},\"enqueue(address,uint256,bytes)\":{\"params\":{\"_data\":\"Transaction data.\",\"_gasLimit\":\"Gas limit for the enqueued L2 transaction.\",\"_target\":\"Target L2 contract to send the transaction to.\"}},\"getLastBlockNumber()\":{\"returns\":{\"_0\":\"Blocknumber for the last transaction.\"}},\"getLastTimestamp()\":{\"returns\":{\"_0\":\"Timestamp for the last transaction.\"}},\"getNextQueueIndex()\":{\"returns\":{\"_0\":\"Index for the next queue element.\"}},\"getNumPendingQueueElements()\":{\"returns\":{\"_0\":\"Number of pending queue elements.\"}},\"getQueueElement(uint256)\":{\"params\":{\"_index\":\"Index of the queue element to access.\"},\"returns\":{\"_element\":\"Queue element at the given index.\"}},\"getQueueLength()\":{\"returns\":{\"_0\":\"Length of the queue.\"}},\"getTotalBatches()\":{\"returns\":{\"_totalBatches\":\"Total submitted batches.\"}},\"getTotalElements()\":{\"returns\":{\"_totalElements\":\"Total submitted elements.\"}},\"queue()\":{\"returns\":{\"_0\":\"Reference to the queue storage container.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}},\"verifyTransaction((uint256,uint256,uint8,address,address,uint256,bytes),(bool,uint256,uint256,uint256,bytes),(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))\":{\"params\":{\"_batchHeader\":\"Header of the batch the transaction was included in.\",\"_inclusionProof\":\"Inclusion proof for the provided transaction chain element.\",\"_transaction\":\"Transaction to verify.\",\"_txChainElement\":\"Transaction chain element corresponding to the transaction.\"},\"returns\":{\"_0\":\"True if the transaction exists in the CTC, false if not.\"}}},\"title\":\"OVM_CanonicalTransactionChain\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"appendQueueBatch(uint256)\":{\"notice\":\"Appends a given number of queued transactions as a single batch. param _numQueuedTransactions Number of transactions to append.\"},\"appendSequencerBatch()\":{\"notice\":\"Allows the sequencer to append a batch of transactions.\"},\"batches()\":{\"notice\":\"Accesses the batch storage container.\"},\"enqueue(address,uint256,bytes)\":{\"notice\":\"Adds a transaction to the queue.\"},\"getLastBlockNumber()\":{\"notice\":\"Returns the blocknumber of the last transaction.\"},\"getLastTimestamp()\":{\"notice\":\"Returns the timestamp of the last transaction.\"},\"getNextQueueIndex()\":{\"notice\":\"Returns the index of the next element to be enqueued.\"},\"getNumPendingQueueElements()\":{\"notice\":\"Get the number of queue elements which have not yet been included.\"},\"getQueueElement(uint256)\":{\"notice\":\"Gets the queue element at a particular index.\"},\"getQueueLength()\":{\"notice\":\"Retrieves the length of the queue, including both pending and canonical transactions.\"},\"getTotalBatches()\":{\"notice\":\"Retrieves the total number of batches submitted.\"},\"getTotalElements()\":{\"notice\":\"Retrieves the total number of elements submitted.\"},\"queue()\":{\"notice\":\"Accesses the queue storage container.\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"},\"verifyTransaction((uint256,uint256,uint8,address,address,uint256,bytes),(bool,uint256,uint256,uint256,bytes),(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))\":{\"notice\":\"Verifies whether a transaction is included in the chain.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/OVM/chain/OVM_CanonicalTransactionChain.sol\":\"OVM_CanonicalTransactionChain\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor () internal {\\n address msgSender = _msgSender();\\n _owner = msgSender;\\n emit OwnershipTransferred(address(0), msgSender);\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n emit OwnershipTransferred(_owner, address(0));\\n _owner = address(0);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n emit OwnershipTransferred(_owner, newOwner);\\n _owner = newOwner;\\n }\\n}\\n\",\"keccak256\":\"0x15e2d5bd4c28a88548074c54d220e8086f638a71ed07e6b3ba5a70066fcf458d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a >= b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two numbers.\\n */\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two numbers. The result is rounded towards\\n * zero.\\n */\\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b) / 2 can overflow, so we distribute\\n return (a / 2) + (b / 2) + ((a % 2 + b % 2) / 2);\\n }\\n}\\n\",\"keccak256\":\"0x363bd3b45201f07c9b71c2edc96533468cf14a3d029fabd82fddceb1eb3ebd9c\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with GSN meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address payable) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes memory) {\\n this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x8d3cb350f04ff49cfb10aef08d87f19dcbaecc8027b0bed12f3275cd12f38cf0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/chain/OVM_CanonicalTransactionChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// @unsupported: ovm\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\nimport { Lib_MerkleTree } from \\\"../../libraries/utils/Lib_MerkleTree.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_CanonicalTransactionChain } from \\\"../../iOVM/chain/iOVM_CanonicalTransactionChain.sol\\\";\\nimport { iOVM_ChainStorageContainer } from \\\"../../iOVM/chain/iOVM_ChainStorageContainer.sol\\\";\\n\\n/* Contract Imports */\\nimport { OVM_ExecutionManager } from \\\"../execution/OVM_ExecutionManager.sol\\\";\\n\\n/* External Imports */\\nimport { Math } from \\\"@openzeppelin/contracts/math/Math.sol\\\";\\n\\n/**\\n * @title OVM_CanonicalTransactionChain\\n * @dev The Canonical Transaction Chain (CTC) contract is an append-only log of transactions\\n * which must be applied to the rollup state. It defines the ordering of rollup transactions by\\n * writing them to the 'CTC:batches' instance of the Chain Storage Container.\\n * The CTC also allows any account to 'enqueue' an L2 transaction, which will require that the Sequencer\\n * will eventually append it to the rollup state.\\n * If the Sequencer does not include an enqueued transaction within the 'force inclusion period',\\n * then any account may force it to be included by calling appendQueueBatch().\\n *\\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract OVM_CanonicalTransactionChain is iOVM_CanonicalTransactionChain, Lib_AddressResolver {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n // L2 tx gas-related\\n uint256 constant public MIN_ROLLUP_TX_GAS = 100000;\\n uint256 constant public MAX_ROLLUP_TX_SIZE = 50000;\\n uint256 constant public L2_GAS_DISCOUNT_DIVISOR = 32;\\n\\n // Encoding-related (all in bytes)\\n uint256 constant internal BATCH_CONTEXT_SIZE = 16;\\n uint256 constant internal BATCH_CONTEXT_LENGTH_POS = 12;\\n uint256 constant internal BATCH_CONTEXT_START_POS = 15;\\n uint256 constant internal TX_DATA_HEADER_SIZE = 3;\\n uint256 constant internal BYTES_TILL_TX_DATA = 65;\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n uint256 public forceInclusionPeriodSeconds;\\n uint256 public forceInclusionPeriodBlocks;\\n uint256 public maxTransactionGasLimit;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n constructor(\\n address _libAddressManager,\\n uint256 _forceInclusionPeriodSeconds,\\n uint256 _forceInclusionPeriodBlocks,\\n uint256 _maxTransactionGasLimit\\n )\\n Lib_AddressResolver(_libAddressManager)\\n {\\n forceInclusionPeriodSeconds = _forceInclusionPeriodSeconds;\\n forceInclusionPeriodBlocks = _forceInclusionPeriodBlocks;\\n maxTransactionGasLimit = _maxTransactionGasLimit;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Accesses the batch storage container.\\n * @return Reference to the batch storage container.\\n */\\n function batches()\\n override\\n public\\n view\\n returns (\\n iOVM_ChainStorageContainer\\n )\\n {\\n return iOVM_ChainStorageContainer(\\n resolve(\\\"OVM_ChainStorageContainer:CTC:batches\\\")\\n );\\n }\\n\\n /**\\n * Accesses the queue storage container.\\n * @return Reference to the queue storage container.\\n */\\n function queue()\\n override\\n public\\n view\\n returns (\\n iOVM_ChainStorageContainer\\n )\\n {\\n return iOVM_ChainStorageContainer(\\n resolve(\\\"OVM_ChainStorageContainer:CTC:queue\\\")\\n );\\n }\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements()\\n override\\n public\\n view\\n returns (\\n uint256 _totalElements\\n )\\n {\\n (uint40 totalElements,,,) = _getBatchExtraData();\\n return uint256(totalElements);\\n }\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches()\\n override\\n public\\n view\\n returns (\\n uint256 _totalBatches\\n )\\n {\\n return batches().length();\\n }\\n\\n /**\\n * Returns the index of the next element to be enqueued.\\n * @return Index for the next queue element.\\n */\\n function getNextQueueIndex()\\n override\\n public\\n view\\n returns (\\n uint40\\n )\\n {\\n (,uint40 nextQueueIndex,,) = _getBatchExtraData();\\n return nextQueueIndex;\\n }\\n\\n /**\\n * Returns the timestamp of the last transaction.\\n * @return Timestamp for the last transaction.\\n */\\n function getLastTimestamp()\\n override\\n public\\n view\\n returns (\\n uint40\\n )\\n {\\n (,,uint40 lastTimestamp,) = _getBatchExtraData();\\n return lastTimestamp;\\n }\\n\\n /**\\n * Returns the blocknumber of the last transaction.\\n * @return Blocknumber for the last transaction.\\n */\\n function getLastBlockNumber()\\n override\\n public\\n view\\n returns (\\n uint40\\n )\\n {\\n (,,,uint40 lastBlockNumber) = _getBatchExtraData();\\n return lastBlockNumber;\\n }\\n\\n /**\\n * Gets the queue element at a particular index.\\n * @param _index Index of the queue element to access.\\n * @return _element Queue element at the given index.\\n */\\n function getQueueElement(\\n uint256 _index\\n )\\n override\\n public\\n view\\n returns (\\n Lib_OVMCodec.QueueElement memory _element\\n )\\n {\\n return _getQueueElement(\\n _index,\\n queue()\\n );\\n }\\n\\n /**\\n * Get the number of queue elements which have not yet been included.\\n * @return Number of pending queue elements.\\n */\\n function getNumPendingQueueElements()\\n override\\n public\\n view\\n returns (\\n uint40\\n )\\n {\\n return getQueueLength() - getNextQueueIndex();\\n }\\n\\n /**\\n * Retrieves the length of the queue, including\\n * both pending and canonical transactions.\\n * @return Length of the queue.\\n */\\n function getQueueLength()\\n override\\n public\\n view\\n returns (\\n uint40\\n )\\n {\\n return _getQueueLength(\\n queue()\\n );\\n }\\n\\n /**\\n * Adds a transaction to the queue.\\n * @param _target Target L2 contract to send the transaction to.\\n * @param _gasLimit Gas limit for the enqueued L2 transaction.\\n * @param _data Transaction data.\\n */\\n function enqueue(\\n address _target,\\n uint256 _gasLimit,\\n bytes memory _data\\n )\\n override\\n public\\n {\\n require(\\n _data.length <= MAX_ROLLUP_TX_SIZE,\\n \\\"Transaction data size exceeds maximum for rollup transaction.\\\"\\n );\\n\\n require(\\n _gasLimit <= maxTransactionGasLimit,\\n \\\"Transaction gas limit exceeds maximum for rollup transaction.\\\"\\n );\\n\\n require(\\n _gasLimit >= MIN_ROLLUP_TX_GAS,\\n \\\"Transaction gas limit too low to enqueue.\\\"\\n );\\n\\n // We need to consume some amount of L1 gas in order to rate limit transactions going into\\n // L2. However, L2 is cheaper than L1 so we only need to burn some small proportion of the\\n // provided L1 gas.\\n uint256 gasToConsume = _gasLimit/L2_GAS_DISCOUNT_DIVISOR;\\n uint256 startingGas = gasleft();\\n\\n // Although this check is not necessary (burn below will run out of gas if not true), it\\n // gives the user an explicit reason as to why the enqueue attempt failed.\\n require(\\n startingGas > gasToConsume,\\n \\\"Insufficient gas for L2 rate limiting burn.\\\"\\n );\\n\\n // Here we do some \\\"dumb\\\" work in order to burn gas, although we should probably replace\\n // this with something like minting gas token later on.\\n uint256 i;\\n while(startingGas - gasleft() < gasToConsume) {\\n i++;\\n }\\n\\n bytes32 transactionHash = keccak256(\\n abi.encode(\\n msg.sender,\\n _target,\\n _gasLimit,\\n _data\\n )\\n );\\n\\n bytes32 timestampAndBlockNumber;\\n assembly {\\n timestampAndBlockNumber := timestamp()\\n timestampAndBlockNumber := or(timestampAndBlockNumber, shl(40, number()))\\n }\\n\\n iOVM_ChainStorageContainer queueRef = queue();\\n\\n queueRef.push(transactionHash);\\n queueRef.push(timestampAndBlockNumber);\\n\\n // The underlying queue data structure stores 2 elements\\n // per insertion, so to get the real queue length we need\\n // to divide by 2 and subtract 1.\\n uint256 queueIndex = queueRef.length() / 2 - 1;\\n emit TransactionEnqueued(\\n msg.sender,\\n _target,\\n _gasLimit,\\n _data,\\n queueIndex,\\n block.timestamp\\n );\\n }\\n\\n /**\\n * Appends a given number of queued transactions as a single batch.\\n * param _numQueuedTransactions Number of transactions to append.\\n */\\n function appendQueueBatch(\\n uint256 // _numQueuedTransactions\\n )\\n override\\n public\\n pure\\n {\\n // TEMPORARY: Disable `appendQueueBatch` for minnet\\n revert(\\\"appendQueueBatch is currently disabled.\\\");\\n\\n // _numQueuedTransactions = Math.min(_numQueuedTransactions, getNumPendingQueueElements());\\n // require(\\n // _numQueuedTransactions > 0,\\n // \\\"Must append more than zero transactions.\\\"\\n // );\\n\\n // bytes32[] memory leaves = new bytes32[](_numQueuedTransactions);\\n // uint40 nextQueueIndex = getNextQueueIndex();\\n\\n // for (uint256 i = 0; i < _numQueuedTransactions; i++) {\\n // if (msg.sender != resolve(\\\"OVM_Sequencer\\\")) {\\n // Lib_OVMCodec.QueueElement memory el = getQueueElement(nextQueueIndex);\\n // require(\\n // el.timestamp + forceInclusionPeriodSeconds < block.timestamp,\\n // \\\"Queue transactions cannot be submitted during the sequencer inclusion period.\\\"\\n // );\\n // }\\n // leaves[i] = _getQueueLeafHash(nextQueueIndex);\\n // nextQueueIndex++;\\n // }\\n\\n // Lib_OVMCodec.QueueElement memory lastElement = getQueueElement(nextQueueIndex - 1);\\n\\n // _appendBatch(\\n // Lib_MerkleTree.getMerkleRoot(leaves),\\n // _numQueuedTransactions,\\n // _numQueuedTransactions,\\n // lastElement.timestamp,\\n // lastElement.blockNumber\\n // );\\n\\n // emit QueueBatchAppended(\\n // nextQueueIndex - _numQueuedTransactions,\\n // _numQueuedTransactions,\\n // getTotalElements()\\n // );\\n }\\n\\n /**\\n * Allows the sequencer to append a batch of transactions.\\n * @dev This function uses a custom encoding scheme for efficiency reasons.\\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\\n * .param _contexts Array of batch contexts.\\n * .param _transactionDataFields Array of raw transaction data.\\n */\\n function appendSequencerBatch()\\n override\\n public\\n {\\n uint40 shouldStartAtElement;\\n uint24 totalElementsToAppend;\\n uint24 numContexts;\\n assembly {\\n shouldStartAtElement := shr(216, calldataload(4))\\n totalElementsToAppend := shr(232, calldataload(9))\\n numContexts := shr(232, calldataload(12))\\n }\\n\\n require(\\n shouldStartAtElement == getTotalElements(),\\n \\\"Actual batch start index does not match expected start index.\\\"\\n );\\n\\n require(\\n msg.sender == resolve(\\\"OVM_Sequencer\\\"),\\n \\\"Function can only be called by the Sequencer.\\\"\\n );\\n\\n require(\\n numContexts > 0,\\n \\\"Must provide at least one batch context.\\\"\\n );\\n\\n require(\\n totalElementsToAppend > 0,\\n \\\"Must append at least one element.\\\"\\n );\\n\\n uint40 nextTransactionPtr = uint40(BATCH_CONTEXT_START_POS + BATCH_CONTEXT_SIZE * numContexts);\\n\\n require(\\n msg.data.length >= nextTransactionPtr,\\n \\\"Not enough BatchContexts provided.\\\"\\n );\\n\\n // Take a reference to the queue and its length so we don't have to keep resolving it.\\n // Length isn't going to change during the course of execution, so it's fine to simply\\n // resolve this once at the start. Saves gas.\\n iOVM_ChainStorageContainer queueRef = queue();\\n uint40 queueLength = _getQueueLength(queueRef);\\n\\n // Reserve some memory to save gas on hashing later on. This is a relatively safe estimate\\n // for the average transaction size that will prevent having to resize this chunk of memory\\n // later on. Saves gas.\\n bytes memory hashMemory = new bytes((msg.data.length / totalElementsToAppend) * 2);\\n\\n // Initialize the array of canonical chain leaves that we will append.\\n bytes32[] memory leaves = new bytes32[](totalElementsToAppend);\\n\\n // Each leaf index corresponds to a tx, either sequenced or enqueued.\\n uint32 leafIndex = 0;\\n\\n // Counter for number of sequencer transactions appended so far.\\n uint32 numSequencerTransactions = 0;\\n\\n // We will sequentially append leaves which are pointers to the queue.\\n // The initial queue index is what is currently in storage.\\n uint40 nextQueueIndex = getNextQueueIndex();\\n\\n BatchContext memory curContext;\\n for (uint32 i = 0; i < numContexts; i++) {\\n BatchContext memory nextContext = _getBatchContext(i);\\n\\n if (i == 0) {\\n // Execute a special check for the first batch.\\n _validateFirstBatchContext(nextContext);\\n }\\n\\n // Execute this check on every single batch, including the first one.\\n _validateNextBatchContext(\\n curContext,\\n nextContext,\\n nextQueueIndex,\\n queueRef\\n );\\n\\n // Now we can update our current context.\\n curContext = nextContext;\\n\\n // Process sequencer transactions first.\\n for (uint32 j = 0; j < curContext.numSequencedTransactions; j++) {\\n uint256 txDataLength;\\n assembly {\\n txDataLength := shr(232, calldataload(nextTransactionPtr))\\n }\\n require(\\n txDataLength <= MAX_ROLLUP_TX_SIZE,\\n \\\"Transaction data size exceeds maximum for rollup transaction.\\\"\\n );\\n\\n leaves[leafIndex] = _getSequencerLeafHash(\\n curContext,\\n nextTransactionPtr,\\n txDataLength,\\n hashMemory\\n );\\n\\n nextTransactionPtr += uint40(TX_DATA_HEADER_SIZE + txDataLength);\\n numSequencerTransactions++;\\n leafIndex++;\\n }\\n\\n // Now process any subsequent queue transactions.\\n for (uint32 j = 0; j < curContext.numSubsequentQueueTransactions; j++) {\\n require(\\n nextQueueIndex < queueLength,\\n \\\"Not enough queued transactions to append.\\\"\\n );\\n\\n leaves[leafIndex] = _getQueueLeafHash(nextQueueIndex);\\n nextQueueIndex++;\\n leafIndex++;\\n }\\n }\\n\\n _validateFinalBatchContext(\\n curContext,\\n nextQueueIndex,\\n queueLength,\\n queueRef\\n );\\n\\n require(\\n msg.data.length == nextTransactionPtr,\\n \\\"Not all sequencer transactions were processed.\\\"\\n );\\n\\n require(\\n leafIndex == totalElementsToAppend,\\n \\\"Actual transaction index does not match expected total elements to append.\\\"\\n );\\n\\n // Generate the required metadata that we need to append this batch\\n uint40 numQueuedTransactions = totalElementsToAppend - numSequencerTransactions;\\n uint40 blockTimestamp;\\n uint40 blockNumber;\\n if (curContext.numSubsequentQueueTransactions == 0) {\\n // The last element is a sequencer tx, therefore pull timestamp and block number from the last context.\\n blockTimestamp = uint40(curContext.timestamp);\\n blockNumber = uint40(curContext.blockNumber);\\n } else {\\n // The last element is a queue tx, therefore pull timestamp and block number from the queue element.\\n // curContext.numSubsequentQueueTransactions > 0 which means that we've processed at least one queue element.\\n // We increment nextQueueIndex after processing each queue element,\\n // so the index of the last element we processed is nextQueueIndex - 1.\\n Lib_OVMCodec.QueueElement memory lastElement = _getQueueElement(\\n nextQueueIndex - 1,\\n queueRef\\n );\\n\\n blockTimestamp = lastElement.timestamp;\\n blockNumber = lastElement.blockNumber;\\n }\\n\\n // For efficiency reasons getMerkleRoot modifies the `leaves` argument in place\\n // while calculating the root hash therefore any arguments passed to it must not\\n // be used again afterwards\\n _appendBatch(\\n Lib_MerkleTree.getMerkleRoot(leaves),\\n totalElementsToAppend,\\n numQueuedTransactions,\\n blockTimestamp,\\n blockNumber\\n );\\n\\n emit SequencerBatchAppended(\\n nextQueueIndex - numQueuedTransactions,\\n numQueuedTransactions,\\n getTotalElements()\\n );\\n }\\n\\n /**\\n * Verifies whether a transaction is included in the chain.\\n * @param _transaction Transaction to verify.\\n * @param _txChainElement Transaction chain element corresponding to the transaction.\\n * @param _batchHeader Header of the batch the transaction was included in.\\n * @param _inclusionProof Inclusion proof for the provided transaction chain element.\\n * @return True if the transaction exists in the CTC, false if not.\\n */\\n function verifyTransaction(\\n Lib_OVMCodec.Transaction memory _transaction,\\n Lib_OVMCodec.TransactionChainElement memory _txChainElement,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _inclusionProof\\n )\\n override\\n public\\n view\\n returns (\\n bool\\n )\\n {\\n if (_txChainElement.isSequenced == true) {\\n return _verifySequencerTransaction(\\n _transaction,\\n _txChainElement,\\n _batchHeader,\\n _inclusionProof\\n );\\n } else {\\n return _verifyQueueTransaction(\\n _transaction,\\n _txChainElement.queueIndex,\\n _batchHeader,\\n _inclusionProof\\n );\\n }\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Returns the BatchContext located at a particular index.\\n * @param _index The index of the BatchContext\\n * @return The BatchContext at the specified index.\\n */\\n function _getBatchContext(\\n uint256 _index\\n )\\n internal\\n pure\\n returns (\\n BatchContext memory\\n )\\n {\\n uint256 contextPtr = 15 + _index * BATCH_CONTEXT_SIZE;\\n uint256 numSequencedTransactions;\\n uint256 numSubsequentQueueTransactions;\\n uint256 ctxTimestamp;\\n uint256 ctxBlockNumber;\\n\\n assembly {\\n numSequencedTransactions := shr(232, calldataload(contextPtr))\\n numSubsequentQueueTransactions := shr(232, calldataload(add(contextPtr, 3)))\\n ctxTimestamp := shr(216, calldataload(add(contextPtr, 6)))\\n ctxBlockNumber := shr(216, calldataload(add(contextPtr, 11)))\\n }\\n\\n return BatchContext({\\n numSequencedTransactions: numSequencedTransactions,\\n numSubsequentQueueTransactions: numSubsequentQueueTransactions,\\n timestamp: ctxTimestamp,\\n blockNumber: ctxBlockNumber\\n });\\n }\\n\\n /**\\n * Parses the batch context from the extra data.\\n * @return Total number of elements submitted.\\n * @return Index of the next queue element.\\n */\\n function _getBatchExtraData()\\n internal\\n view\\n returns (\\n uint40,\\n uint40,\\n uint40,\\n uint40\\n )\\n {\\n bytes27 extraData = batches().getGlobalMetadata();\\n\\n uint40 totalElements;\\n uint40 nextQueueIndex;\\n uint40 lastTimestamp;\\n uint40 lastBlockNumber;\\n assembly {\\n extraData := shr(40, extraData)\\n totalElements := and(extraData, 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF)\\n nextQueueIndex := shr(40, and(extraData, 0x00000000000000000000000000000000000000000000FFFFFFFFFF0000000000))\\n lastTimestamp := shr(80, and(extraData, 0x0000000000000000000000000000000000FFFFFFFFFF00000000000000000000))\\n lastBlockNumber := shr(120, and(extraData, 0x000000000000000000000000FFFFFFFFFF000000000000000000000000000000))\\n }\\n\\n return (\\n totalElements,\\n nextQueueIndex,\\n lastTimestamp,\\n lastBlockNumber\\n );\\n }\\n\\n /**\\n * Encodes the batch context for the extra data.\\n * @param _totalElements Total number of elements submitted.\\n * @param _nextQueueIndex Index of the next queue element.\\n * @param _timestamp Timestamp for the last batch.\\n * @param _blockNumber Block number of the last batch.\\n * @return Encoded batch context.\\n */\\n function _makeBatchExtraData(\\n uint40 _totalElements,\\n uint40 _nextQueueIndex,\\n uint40 _timestamp,\\n uint40 _blockNumber\\n )\\n internal\\n pure\\n returns (\\n bytes27\\n )\\n {\\n bytes27 extraData;\\n assembly {\\n extraData := _totalElements\\n extraData := or(extraData, shl(40, _nextQueueIndex))\\n extraData := or(extraData, shl(80, _timestamp))\\n extraData := or(extraData, shl(120, _blockNumber))\\n extraData := shl(40, extraData)\\n }\\n\\n return extraData;\\n }\\n\\n /**\\n * Retrieves the hash of a queue element.\\n * @param _index Index of the queue element to retrieve a hash for.\\n * @return Hash of the queue element.\\n */\\n function _getQueueLeafHash(\\n uint256 _index\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return _hashTransactionChainElement(\\n Lib_OVMCodec.TransactionChainElement({\\n isSequenced: false,\\n queueIndex: _index,\\n timestamp: 0,\\n blockNumber: 0,\\n txData: hex\\\"\\\"\\n })\\n );\\n }\\n\\n /**\\n * Gets the queue element at a particular index.\\n * @param _index Index of the queue element to access.\\n * @return _element Queue element at the given index.\\n */\\n function _getQueueElement(\\n uint256 _index,\\n iOVM_ChainStorageContainer _queueRef\\n )\\n internal\\n view\\n returns (\\n Lib_OVMCodec.QueueElement memory _element\\n )\\n {\\n // The underlying queue data structure stores 2 elements\\n // per insertion, so to get the actual desired queue index\\n // we need to multiply by 2.\\n uint40 trueIndex = uint40(_index * 2);\\n bytes32 transactionHash = _queueRef.get(trueIndex);\\n bytes32 timestampAndBlockNumber = _queueRef.get(trueIndex + 1);\\n\\n uint40 elementTimestamp;\\n uint40 elementBlockNumber;\\n assembly {\\n elementTimestamp := and(timestampAndBlockNumber, 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF)\\n elementBlockNumber := shr(40, and(timestampAndBlockNumber, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000))\\n }\\n\\n return Lib_OVMCodec.QueueElement({\\n transactionHash: transactionHash,\\n timestamp: elementTimestamp,\\n blockNumber: elementBlockNumber\\n });\\n }\\n\\n /**\\n * Retrieves the length of the queue.\\n * @return Length of the queue.\\n */\\n function _getQueueLength(\\n iOVM_ChainStorageContainer _queueRef\\n )\\n internal\\n view\\n returns (\\n uint40\\n )\\n {\\n // The underlying queue data structure stores 2 elements\\n // per insertion, so to get the real queue length we need\\n // to divide by 2.\\n return uint40(_queueRef.length() / 2);\\n }\\n\\n /**\\n * Retrieves the hash of a sequencer element.\\n * @param _context Batch context for the given element.\\n * @param _nextTransactionPtr Pointer to the next transaction in the calldata.\\n * @param _txDataLength Length of the transaction item.\\n * @return Hash of the sequencer element.\\n */\\n function _getSequencerLeafHash(\\n BatchContext memory _context,\\n uint256 _nextTransactionPtr,\\n uint256 _txDataLength,\\n bytes memory _hashMemory\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n // Only allocate more memory if we didn't reserve enough to begin with.\\n if (BYTES_TILL_TX_DATA + _txDataLength > _hashMemory.length) {\\n _hashMemory = new bytes(BYTES_TILL_TX_DATA + _txDataLength);\\n }\\n\\n uint256 ctxTimestamp = _context.timestamp;\\n uint256 ctxBlockNumber = _context.blockNumber;\\n\\n bytes32 leafHash;\\n assembly {\\n let chainElementStart := add(_hashMemory, 0x20)\\n\\n // Set the first byte equal to `1` to indicate this is a sequencer chain element.\\n // This distinguishes sequencer ChainElements from queue ChainElements because\\n // all queue ChainElements are ABI encoded and the first byte of ABI encoded\\n // elements is always zero\\n mstore8(chainElementStart, 1)\\n\\n mstore(add(chainElementStart, 1), ctxTimestamp)\\n mstore(add(chainElementStart, 33), ctxBlockNumber)\\n\\n calldatacopy(add(chainElementStart, BYTES_TILL_TX_DATA), add(_nextTransactionPtr, 3), _txDataLength)\\n\\n leafHash := keccak256(chainElementStart, add(BYTES_TILL_TX_DATA, _txDataLength))\\n }\\n\\n return leafHash;\\n }\\n\\n /**\\n * Retrieves the hash of a sequencer element.\\n * @param _txChainElement The chain element which is hashed to calculate the leaf.\\n * @return Hash of the sequencer element.\\n */\\n function _getSequencerLeafHash(\\n Lib_OVMCodec.TransactionChainElement memory _txChainElement\\n )\\n internal\\n view\\n returns(\\n bytes32\\n )\\n {\\n bytes memory txData = _txChainElement.txData;\\n uint256 txDataLength = _txChainElement.txData.length;\\n\\n bytes memory chainElement = new bytes(BYTES_TILL_TX_DATA + txDataLength);\\n uint256 ctxTimestamp = _txChainElement.timestamp;\\n uint256 ctxBlockNumber = _txChainElement.blockNumber;\\n\\n bytes32 leafHash;\\n assembly {\\n let chainElementStart := add(chainElement, 0x20)\\n\\n // Set the first byte equal to `1` to indicate this is a sequencer chain element.\\n // This distinguishes sequencer ChainElements from queue ChainElements because\\n // all queue ChainElements are ABI encoded and the first byte of ABI encoded\\n // elements is always zero\\n mstore8(chainElementStart, 1)\\n\\n mstore(add(chainElementStart, 1), ctxTimestamp)\\n mstore(add(chainElementStart, 33), ctxBlockNumber)\\n\\n pop(staticcall(gas(), 0x04, add(txData, 0x20), txDataLength, add(chainElementStart, BYTES_TILL_TX_DATA), txDataLength))\\n\\n leafHash := keccak256(chainElementStart, add(BYTES_TILL_TX_DATA, txDataLength))\\n }\\n\\n return leafHash;\\n }\\n\\n /**\\n * Inserts a batch into the chain of batches.\\n * @param _transactionRoot Root of the transaction tree for this batch.\\n * @param _batchSize Number of elements in the batch.\\n * @param _numQueuedTransactions Number of queue transactions in the batch.\\n * @param _timestamp The latest batch timestamp.\\n * @param _blockNumber The latest batch blockNumber.\\n */\\n function _appendBatch(\\n bytes32 _transactionRoot,\\n uint256 _batchSize,\\n uint256 _numQueuedTransactions,\\n uint40 _timestamp,\\n uint40 _blockNumber\\n )\\n internal\\n {\\n iOVM_ChainStorageContainer batchesRef = batches();\\n (uint40 totalElements, uint40 nextQueueIndex,,) = _getBatchExtraData();\\n\\n Lib_OVMCodec.ChainBatchHeader memory header = Lib_OVMCodec.ChainBatchHeader({\\n batchIndex: batchesRef.length(),\\n batchRoot: _transactionRoot,\\n batchSize: _batchSize,\\n prevTotalElements: totalElements,\\n extraData: hex\\\"\\\"\\n });\\n\\n emit TransactionBatchAppended(\\n header.batchIndex,\\n header.batchRoot,\\n header.batchSize,\\n header.prevTotalElements,\\n header.extraData\\n );\\n\\n bytes32 batchHeaderHash = Lib_OVMCodec.hashBatchHeader(header);\\n bytes27 latestBatchContext = _makeBatchExtraData(\\n totalElements + uint40(header.batchSize),\\n nextQueueIndex + uint40(_numQueuedTransactions),\\n _timestamp,\\n _blockNumber\\n );\\n\\n batchesRef.push(batchHeaderHash, latestBatchContext);\\n }\\n\\n /**\\n * Checks that the first batch context in a sequencer submission is valid\\n * @param _firstContext The batch context to validate.\\n */\\n function _validateFirstBatchContext(\\n BatchContext memory _firstContext\\n )\\n internal\\n view\\n {\\n // If there are existing elements, this batch must have the same context\\n // or a later timestamp and block number.\\n if (getTotalElements() > 0) {\\n (,, uint40 lastTimestamp, uint40 lastBlockNumber) = _getBatchExtraData();\\n\\n require(\\n _firstContext.blockNumber >= lastBlockNumber,\\n \\\"Context block number is lower than last submitted.\\\"\\n );\\n\\n require(\\n _firstContext.timestamp >= lastTimestamp,\\n \\\"Context timestamp is lower than last submitted.\\\"\\n );\\n }\\n\\n // Sequencer cannot submit contexts which are more than the force inclusion period old.\\n require(\\n _firstContext.timestamp + forceInclusionPeriodSeconds >= block.timestamp,\\n \\\"Context timestamp too far in the past.\\\"\\n );\\n\\n require(\\n _firstContext.blockNumber + forceInclusionPeriodBlocks >= block.number,\\n \\\"Context block number too far in the past.\\\"\\n );\\n }\\n\\n /**\\n * Checks that a given batch context has a time context which is below a given que element\\n * @param _context The batch context to validate has values lower.\\n * @param _queueIndex Index of the queue element we are validating came later than the context.\\n * @param _queueRef The storage container for the queue.\\n */\\n function _validateContextBeforeEnqueue(\\n BatchContext memory _context,\\n uint40 _queueIndex,\\n iOVM_ChainStorageContainer _queueRef\\n )\\n internal\\n view\\n {\\n Lib_OVMCodec.QueueElement memory nextQueueElement = _getQueueElement(\\n _queueIndex,\\n _queueRef\\n );\\n\\n // If the force inclusion period has passed for an enqueued transaction, it MUST be the next chain element.\\n require(\\n block.timestamp < nextQueueElement.timestamp + forceInclusionPeriodSeconds,\\n \\\"Previously enqueued batches have expired and must be appended before a new sequencer batch.\\\"\\n );\\n\\n // Just like sequencer transaction times must be increasing relative to each other,\\n // We also require that they be increasing relative to any interspersed queue elements.\\n require(\\n _context.timestamp <= nextQueueElement.timestamp,\\n \\\"Sequencer transaction timestamp exceeds that of next queue element.\\\"\\n );\\n\\n require(\\n _context.blockNumber <= nextQueueElement.blockNumber,\\n \\\"Sequencer transaction blockNumber exceeds that of next queue element.\\\"\\n );\\n }\\n\\n /**\\n * Checks that a given batch context is valid based on its previous context, and the next queue elemtent.\\n * @param _prevContext The previously validated batch context.\\n * @param _nextContext The batch context to validate with this call.\\n * @param _nextQueueIndex Index of the next queue element to process for the _nextContext's subsequentQueueElements.\\n * @param _queueRef The storage container for the queue.\\n */\\n function _validateNextBatchContext(\\n BatchContext memory _prevContext,\\n BatchContext memory _nextContext,\\n uint40 _nextQueueIndex,\\n iOVM_ChainStorageContainer _queueRef\\n )\\n internal\\n view\\n {\\n // All sequencer transactions' times must be greater than or equal to the previous ones.\\n require(\\n _nextContext.timestamp >= _prevContext.timestamp,\\n \\\"Context timestamp values must monotonically increase.\\\"\\n );\\n\\n require(\\n _nextContext.blockNumber >= _prevContext.blockNumber,\\n \\\"Context blockNumber values must monotonically increase.\\\"\\n );\\n\\n // If there is going to be a queue element pulled in from this context:\\n if (_nextContext.numSubsequentQueueTransactions > 0) {\\n _validateContextBeforeEnqueue(\\n _nextContext,\\n _nextQueueIndex,\\n _queueRef\\n );\\n }\\n }\\n\\n /**\\n * Checks that the final batch context in a sequencer submission is valid.\\n * @param _finalContext The batch context to validate.\\n * @param _queueLength The length of the queue at the start of the batchAppend call.\\n * @param _nextQueueIndex The next element in the queue that will be pulled into the CTC.\\n * @param _queueRef The storage container for the queue.\\n */\\n function _validateFinalBatchContext(\\n BatchContext memory _finalContext,\\n uint40 _nextQueueIndex,\\n uint40 _queueLength,\\n iOVM_ChainStorageContainer _queueRef\\n )\\n internal\\n view\\n {\\n // If the queue is not now empty, check the mononoticity of whatever the next batch that will come in is.\\n if (_queueLength - _nextQueueIndex > 0 && _finalContext.numSubsequentQueueTransactions == 0) {\\n _validateContextBeforeEnqueue(\\n _finalContext,\\n _nextQueueIndex,\\n _queueRef\\n );\\n }\\n // Batches cannot be added from the future, or subsequent enqueue() contexts would violate monotonicity.\\n require(_finalContext.timestamp <= block.timestamp, \\\"Context timestamp is from the future.\\\");\\n require(_finalContext.blockNumber <= block.number, \\\"Context block number is from the future.\\\");\\n }\\n\\n /**\\n * Hashes a transaction chain element.\\n * @param _element Chain element to hash.\\n * @return Hash of the chain element.\\n */\\n function _hashTransactionChainElement(\\n Lib_OVMCodec.TransactionChainElement memory _element\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(\\n abi.encode(\\n _element.isSequenced,\\n _element.queueIndex,\\n _element.timestamp,\\n _element.blockNumber,\\n _element.txData\\n )\\n );\\n }\\n\\n /**\\n * Verifies a sequencer transaction, returning true if it was indeed included in the CTC\\n * @param _transaction The transaction we are verifying inclusion of.\\n * @param _txChainElement The chain element that the transaction is claimed to be a part of.\\n * @param _batchHeader Header of the batch the transaction was included in.\\n * @param _inclusionProof An inclusion proof into the CTC at a particular index.\\n * @return True if the transaction was included in the specified location, else false.\\n */\\n function _verifySequencerTransaction(\\n Lib_OVMCodec.Transaction memory _transaction,\\n Lib_OVMCodec.TransactionChainElement memory _txChainElement,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _inclusionProof\\n )\\n internal\\n view\\n returns (\\n bool\\n )\\n {\\n OVM_ExecutionManager ovmExecutionManager = OVM_ExecutionManager(resolve(\\\"OVM_ExecutionManager\\\"));\\n uint256 gasLimit = ovmExecutionManager.getMaxTransactionGasLimit();\\n bytes32 leafHash = _getSequencerLeafHash(_txChainElement);\\n\\n require(\\n _verifyElement(\\n leafHash,\\n _batchHeader,\\n _inclusionProof\\n ),\\n \\\"Invalid Sequencer transaction inclusion proof.\\\"\\n );\\n\\n require(\\n _transaction.blockNumber == _txChainElement.blockNumber\\n && _transaction.timestamp == _txChainElement.timestamp\\n && _transaction.entrypoint == resolve(\\\"OVM_DecompressionPrecompileAddress\\\")\\n && _transaction.gasLimit == gasLimit\\n && _transaction.l1TxOrigin == address(0)\\n && _transaction.l1QueueOrigin == Lib_OVMCodec.QueueOrigin.SEQUENCER_QUEUE\\n && keccak256(_transaction.data) == keccak256(_txChainElement.txData),\\n \\\"Invalid Sequencer transaction.\\\"\\n );\\n\\n return true;\\n }\\n\\n /**\\n * Verifies a queue transaction, returning true if it was indeed included in the CTC\\n * @param _transaction The transaction we are verifying inclusion of.\\n * @param _queueIndex The queueIndex of the queued transaction.\\n * @param _batchHeader Header of the batch the transaction was included in.\\n * @param _inclusionProof An inclusion proof into the CTC at a particular index (should point to queue tx).\\n * @return True if the transaction was included in the specified location, else false.\\n */\\n function _verifyQueueTransaction(\\n Lib_OVMCodec.Transaction memory _transaction,\\n uint256 _queueIndex,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _inclusionProof\\n )\\n internal\\n view\\n returns (\\n bool\\n )\\n {\\n bytes32 leafHash = _getQueueLeafHash(_queueIndex);\\n\\n require(\\n _verifyElement(\\n leafHash,\\n _batchHeader,\\n _inclusionProof\\n ),\\n \\\"Invalid Queue transaction inclusion proof.\\\"\\n );\\n\\n bytes32 transactionHash = keccak256(\\n abi.encode(\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n )\\n );\\n\\n Lib_OVMCodec.QueueElement memory el = getQueueElement(_queueIndex);\\n require(\\n el.transactionHash == transactionHash\\n && el.timestamp == _transaction.timestamp\\n && el.blockNumber == _transaction.blockNumber,\\n \\\"Invalid Queue transaction.\\\"\\n );\\n\\n return true;\\n }\\n\\n /**\\n * Verifies a batch inclusion proof.\\n * @param _element Hash of the element to verify a proof for.\\n * @param _batchHeader Header of the batch in which the element was included.\\n * @param _proof Merkle inclusion proof for the element.\\n */\\n function _verifyElement(\\n bytes32 _element,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _proof\\n )\\n internal\\n view\\n returns (\\n bool\\n )\\n {\\n require(\\n Lib_OVMCodec.hashBatchHeader(_batchHeader) == batches().get(uint32(_batchHeader.batchIndex)),\\n \\\"Invalid batch header.\\\"\\n );\\n\\n require(\\n Lib_MerkleTree.verify(\\n _batchHeader.batchRoot,\\n _element,\\n _proof.index,\\n _proof.siblings,\\n _batchHeader.batchSize\\n ),\\n \\\"Invalid inclusion proof.\\\"\\n );\\n\\n return true;\\n }\\n}\\n\",\"keccak256\":\"0xdc5f311b6840476027f597b9b6ff6c7673988cfed9c9ace625c705175b27abe3\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// @unsupported: ovm\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\nimport { Lib_EthUtils } from \\\"../../libraries/utils/Lib_EthUtils.sol\\\";\\nimport { Lib_ErrorUtils } from \\\"../../libraries/utils/Lib_ErrorUtils.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_ExecutionManager } from \\\"../../iOVM/execution/iOVM_ExecutionManager.sol\\\";\\nimport { iOVM_StateManager } from \\\"../../iOVM/execution/iOVM_StateManager.sol\\\";\\nimport { iOVM_SafetyChecker } from \\\"../../iOVM/execution/iOVM_SafetyChecker.sol\\\";\\n\\n/* Contract Imports */\\nimport { OVM_DeployerWhitelist } from \\\"../predeploys/OVM_DeployerWhitelist.sol\\\";\\n\\n/**\\n * @title OVM_ExecutionManager\\n * @dev The Execution Manager (EM) is the core of our OVM implementation, and provides a sandboxed\\n * environment allowing us to execute OVM transactions deterministically on either Layer 1 or\\n * Layer 2.\\n * The EM's run() function is the first function called during the execution of any\\n * transaction on L2.\\n * For each context-dependent EVM operation the EM has a function which implements a corresponding\\n * OVM operation, which will read state from the State Manager contract.\\n * The EM relies on the Safety Checker to verify that code deployed to Layer 2 does not contain any\\n * context-dependent operations.\\n *\\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract OVM_ExecutionManager is iOVM_ExecutionManager, Lib_AddressResolver {\\n\\n /********************************\\n * External Contract References *\\n ********************************/\\n\\n iOVM_SafetyChecker internal ovmSafetyChecker;\\n iOVM_StateManager internal ovmStateManager;\\n\\n\\n /*******************************\\n * Execution Context Variables *\\n *******************************/\\n\\n GasMeterConfig internal gasMeterConfig;\\n GlobalContext internal globalContext;\\n TransactionContext internal transactionContext;\\n MessageContext internal messageContext;\\n TransactionRecord internal transactionRecord;\\n MessageRecord internal messageRecord;\\n\\n\\n /**************************\\n * Gas Metering Constants *\\n **************************/\\n\\n address constant GAS_METADATA_ADDRESS = 0x06a506A506a506A506a506a506A506A506A506A5;\\n uint256 constant NUISANCE_GAS_SLOAD = 20000;\\n uint256 constant NUISANCE_GAS_SSTORE = 20000;\\n uint256 constant MIN_NUISANCE_GAS_PER_CONTRACT = 30000;\\n uint256 constant NUISANCE_GAS_PER_CONTRACT_BYTE = 100;\\n uint256 constant MIN_GAS_FOR_INVALID_STATE_ACCESS = 30000;\\n\\n /**************************\\n * Default Context Values *\\n **************************/\\n\\n uint256 constant DEFAULT_UINT256 = 0xdefa017defa017defa017defa017defa017defa017defa017defa017defa017d;\\n address constant DEFAULT_ADDRESS = 0xdEfa017defA017DeFA017DEfa017DeFA017DeFa0;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n */\\n constructor(\\n address _libAddressManager,\\n GasMeterConfig memory _gasMeterConfig,\\n GlobalContext memory _globalContext\\n )\\n Lib_AddressResolver(_libAddressManager)\\n {\\n ovmSafetyChecker = iOVM_SafetyChecker(resolve(\\\"OVM_SafetyChecker\\\"));\\n gasMeterConfig = _gasMeterConfig;\\n globalContext = _globalContext;\\n _resetContext();\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n /**\\n * Applies dynamically-sized refund to a transaction to account for the difference in execution\\n * between L1 and L2, so that the overall cost of the ovmOPCODE is fixed.\\n * @param _cost Desired gas cost for the function after the refund.\\n */\\n modifier netGasCost(\\n uint256 _cost\\n ) {\\n uint256 gasProvided = gasleft();\\n _;\\n uint256 gasUsed = gasProvided - gasleft();\\n\\n // We want to refund everything *except* the specified cost.\\n if (_cost < gasUsed) {\\n transactionRecord.ovmGasRefund += gasUsed - _cost;\\n }\\n }\\n\\n /**\\n * Applies a fixed-size gas refund to a transaction to account for the difference in execution\\n * between L1 and L2, so that the overall cost of an ovmOPCODE can be lowered.\\n * @param _discount Amount of gas cost to refund for the ovmOPCODE.\\n */\\n modifier fixedGasDiscount(\\n uint256 _discount\\n ) {\\n uint256 gasProvided = gasleft();\\n _;\\n uint256 gasUsed = gasProvided - gasleft();\\n\\n // We want to refund the specified _discount, unless this risks underflow.\\n if (_discount < gasUsed) {\\n transactionRecord.ovmGasRefund += _discount;\\n } else {\\n // refund all we can without risking underflow.\\n transactionRecord.ovmGasRefund += gasUsed;\\n }\\n }\\n\\n /**\\n * Makes sure we're not inside a static context.\\n */\\n modifier notStatic() {\\n if (messageContext.isStatic == true) {\\n _revertWithFlag(RevertFlag.STATIC_VIOLATION);\\n }\\n _;\\n }\\n\\n\\n /************************************\\n * Transaction Execution Entrypoint *\\n ************************************/\\n\\n /**\\n * Starts the execution of a transaction via the OVM_ExecutionManager.\\n * @param _transaction Transaction data to be executed.\\n * @param _ovmStateManager iOVM_StateManager implementation providing account state.\\n */\\n function run(\\n Lib_OVMCodec.Transaction memory _transaction,\\n address _ovmStateManager\\n )\\n override\\n public\\n returns (\\n bytes memory\\n )\\n {\\n // Make sure that run() is not re-enterable. This condition should always be satisfied\\n // Once run has been called once, due to the behavior of _isValidInput().\\n if (transactionContext.ovmNUMBER != DEFAULT_UINT256) {\\n return bytes(\\\"\\\");\\n }\\n\\n // Store our OVM_StateManager instance (significantly easier than attempting to pass the\\n // address around in calldata).\\n ovmStateManager = iOVM_StateManager(_ovmStateManager);\\n\\n // Make sure this function can't be called by anyone except the owner of the\\n // OVM_StateManager (expected to be an OVM_StateTransitioner). We can revert here because\\n // this would make the `run` itself invalid.\\n require(\\n // This method may return false during fraud proofs, but always returns true in L2 nodes' State Manager precompile.\\n ovmStateManager.isAuthenticated(msg.sender),\\n \\\"Only authenticated addresses in ovmStateManager can call this function\\\"\\n );\\n\\n // Initialize the execution context, must be initialized before we perform any gas metering\\n // or we'll throw a nuisance gas error.\\n _initContext(_transaction);\\n\\n // TEMPORARY: Gas metering is disabled for minnet.\\n // // Check whether we need to start a new epoch, do so if necessary.\\n // _checkNeedsNewEpoch(_transaction.timestamp);\\n\\n // Make sure the transaction's gas limit is valid. We don't revert here because we reserve\\n // reverts for INVALID_STATE_ACCESS.\\n if (_isValidInput(_transaction) == false) {\\n _resetContext();\\n return bytes(\\\"\\\");\\n }\\n\\n // TEMPORARY: Gas metering is disabled for minnet.\\n // // Check gas right before the call to get total gas consumed by OVM transaction.\\n // uint256 gasProvided = gasleft();\\n\\n // Run the transaction, make sure to meter the gas usage.\\n (, bytes memory returndata) = ovmCALL(\\n _transaction.gasLimit - gasMeterConfig.minTransactionGasLimit,\\n _transaction.entrypoint,\\n _transaction.data\\n );\\n\\n // TEMPORARY: Gas metering is disabled for minnet.\\n // // Update the cumulative gas based on the amount of gas used.\\n // uint256 gasUsed = gasProvided - gasleft();\\n // _updateCumulativeGas(gasUsed, _transaction.l1QueueOrigin);\\n\\n // Wipe the execution context.\\n _resetContext();\\n\\n return returndata;\\n }\\n\\n\\n /******************************\\n * Opcodes: Execution Context *\\n ******************************/\\n\\n /**\\n * @notice Overrides CALLER.\\n * @return _CALLER Address of the CALLER within the current message context.\\n */\\n function ovmCALLER()\\n override\\n public\\n view\\n returns (\\n address _CALLER\\n )\\n {\\n return messageContext.ovmCALLER;\\n }\\n\\n /**\\n * @notice Overrides ADDRESS.\\n * @return _ADDRESS Active ADDRESS within the current message context.\\n */\\n function ovmADDRESS()\\n override\\n public\\n view\\n returns (\\n address _ADDRESS\\n )\\n {\\n return messageContext.ovmADDRESS;\\n }\\n\\n /**\\n * @notice Overrides TIMESTAMP.\\n * @return _TIMESTAMP Value of the TIMESTAMP within the transaction context.\\n */\\n function ovmTIMESTAMP()\\n override\\n public\\n view\\n returns (\\n uint256 _TIMESTAMP\\n )\\n {\\n return transactionContext.ovmTIMESTAMP;\\n }\\n\\n /**\\n * @notice Overrides NUMBER.\\n * @return _NUMBER Value of the NUMBER within the transaction context.\\n */\\n function ovmNUMBER()\\n override\\n public\\n view\\n returns (\\n uint256 _NUMBER\\n )\\n {\\n return transactionContext.ovmNUMBER;\\n }\\n\\n /**\\n * @notice Overrides GASLIMIT.\\n * @return _GASLIMIT Value of the block's GASLIMIT within the transaction context.\\n */\\n function ovmGASLIMIT()\\n override\\n public\\n view\\n returns (\\n uint256 _GASLIMIT\\n )\\n {\\n return transactionContext.ovmGASLIMIT;\\n }\\n\\n /**\\n * @notice Overrides CHAINID.\\n * @return _CHAINID Value of the chain's CHAINID within the global context.\\n */\\n function ovmCHAINID()\\n override\\n public\\n view\\n returns (\\n uint256 _CHAINID\\n )\\n {\\n return globalContext.ovmCHAINID;\\n }\\n\\n /*********************************\\n * Opcodes: L2 Execution Context *\\n *********************************/\\n\\n /**\\n * @notice Specifies from which source (Sequencer or Queue) this transaction originated from.\\n * @return _queueOrigin Enum indicating the ovmL1QUEUEORIGIN within the current message context.\\n */\\n function ovmL1QUEUEORIGIN()\\n override\\n public\\n view\\n returns (\\n Lib_OVMCodec.QueueOrigin _queueOrigin\\n )\\n {\\n return transactionContext.ovmL1QUEUEORIGIN;\\n }\\n\\n /**\\n * @notice Specifies which L1 account, if any, sent this transaction by calling enqueue().\\n * @return _l1TxOrigin Address of the account which sent the tx into L2 from L1.\\n */\\n function ovmL1TXORIGIN()\\n override\\n public\\n view\\n returns (\\n address _l1TxOrigin\\n )\\n {\\n return transactionContext.ovmL1TXORIGIN;\\n }\\n\\n /********************\\n * Opcodes: Halting *\\n ********************/\\n\\n /**\\n * @notice Overrides REVERT.\\n * @param _data Bytes data to pass along with the REVERT.\\n */\\n function ovmREVERT(\\n bytes memory _data\\n )\\n override\\n public\\n {\\n _revertWithFlag(RevertFlag.INTENTIONAL_REVERT, _data);\\n }\\n\\n\\n /******************************\\n * Opcodes: Contract Creation *\\n ******************************/\\n\\n /**\\n * @notice Overrides CREATE.\\n * @param _bytecode Code to be used to CREATE a new contract.\\n * @return Address of the created contract.\\n * @return Revert data, if and only if the creation threw an exception.\\n */\\n function ovmCREATE(\\n bytes memory _bytecode\\n )\\n override\\n public\\n notStatic\\n fixedGasDiscount(40000)\\n returns (\\n address,\\n bytes memory\\n )\\n {\\n // Creator is always the current ADDRESS.\\n address creator = ovmADDRESS();\\n\\n // Check that the deployer is whitelisted, or\\n // that arbitrary contract deployment has been enabled.\\n _checkDeployerAllowed(creator);\\n\\n // Generate the correct CREATE address.\\n address contractAddress = Lib_EthUtils.getAddressForCREATE(\\n creator,\\n _getAccountNonce(creator)\\n );\\n\\n return _createContract(\\n contractAddress,\\n _bytecode\\n );\\n }\\n\\n /**\\n * @notice Overrides CREATE2.\\n * @param _bytecode Code to be used to CREATE2 a new contract.\\n * @param _salt Value used to determine the contract's address.\\n * @return Address of the created contract.\\n * @return Revert data, if and only if the creation threw an exception.\\n */\\n function ovmCREATE2(\\n bytes memory _bytecode,\\n bytes32 _salt\\n )\\n override\\n public\\n notStatic\\n fixedGasDiscount(40000)\\n returns (\\n address,\\n bytes memory\\n )\\n {\\n // Creator is always the current ADDRESS.\\n address creator = ovmADDRESS();\\n\\n // Check that the deployer is whitelisted, or\\n // that arbitrary contract deployment has been enabled.\\n _checkDeployerAllowed(creator);\\n\\n // Generate the correct CREATE2 address.\\n address contractAddress = Lib_EthUtils.getAddressForCREATE2(\\n creator,\\n _bytecode,\\n _salt\\n );\\n\\n return _createContract(\\n contractAddress,\\n _bytecode\\n );\\n }\\n\\n\\n /*******************************\\n * Account Abstraction Opcodes *\\n ******************************/\\n\\n /**\\n * Retrieves the nonce of the current ovmADDRESS.\\n * @return _nonce Nonce of the current contract.\\n */\\n function ovmGETNONCE()\\n override\\n public\\n returns (\\n uint256 _nonce\\n )\\n {\\n return _getAccountNonce(ovmADDRESS());\\n }\\n\\n /**\\n * Bumps the nonce of the current ovmADDRESS by one.\\n */\\n function ovmINCREMENTNONCE()\\n override\\n public\\n notStatic\\n {\\n address account = ovmADDRESS();\\n uint256 nonce = _getAccountNonce(account);\\n\\n // Prevent overflow.\\n if (nonce + 1 > nonce) {\\n _setAccountNonce(account, nonce + 1);\\n }\\n }\\n\\n /**\\n * Creates a new EOA contract account, for account abstraction.\\n * @dev Essentially functions like ovmCREATE or ovmCREATE2, but we can bypass a lot of checks\\n * because the contract we're creating is trusted (no need to do safety checking or to\\n * handle unexpected reverts). Doesn't need to return an address because the address is\\n * assumed to be the user's actual address.\\n * @param _messageHash Hash of a message signed by some user, for verification.\\n * @param _v Signature `v` parameter.\\n * @param _r Signature `r` parameter.\\n * @param _s Signature `s` parameter.\\n */\\n function ovmCREATEEOA(\\n bytes32 _messageHash,\\n uint8 _v,\\n bytes32 _r,\\n bytes32 _s\\n )\\n override\\n public\\n notStatic\\n {\\n // Recover the EOA address from the message hash and signature parameters. Since we do the\\n // hashing in advance, we don't have handle different message hashing schemes. Even if this\\n // function were to return the wrong address (rather than explicitly returning the zero\\n // address), the rest of the transaction would simply fail (since there's no EOA account to\\n // actually execute the transaction).\\n address eoa = ecrecover(\\n _messageHash,\\n _v + 27,\\n _r,\\n _s\\n );\\n\\n // Invalid signature is a case we proactively handle with a revert. We could alternatively\\n // have this function return a `success` boolean, but this is just easier.\\n if (eoa == address(0)) {\\n ovmREVERT(bytes(\\\"Signature provided for EOA contract creation is invalid.\\\"));\\n }\\n\\n // If the user already has an EOA account, then there's no need to perform this operation.\\n if (_hasEmptyAccount(eoa) == false) {\\n return;\\n }\\n\\n // We always need to initialize the contract with the default account values.\\n _initPendingAccount(eoa);\\n\\n // Temporarily set the current address so it's easier to access on L2.\\n address prevADDRESS = messageContext.ovmADDRESS;\\n messageContext.ovmADDRESS = eoa;\\n\\n // Creates a duplicate of the OVM_ProxyEOA located at 0x42....09. Uses the following\\n // \\\"magic\\\" prefix to deploy an exact copy of the code:\\n // PUSH1 0x0D # size of this prefix in bytes\\n // CODESIZE\\n // SUB # subtract prefix size from codesize\\n // DUP1\\n // PUSH1 0x0D\\n // PUSH1 0x00\\n // CODECOPY # copy everything after prefix into memory at pos 0\\n // PUSH1 0x00\\n // RETURN # return the copied code\\n address proxyEOA = Lib_EthUtils.createContract(abi.encodePacked(\\n hex\\\"600D380380600D6000396000f3\\\",\\n ovmEXTCODECOPY(\\n 0x4200000000000000000000000000000000000009,\\n 0,\\n ovmEXTCODESIZE(0x4200000000000000000000000000000000000009)\\n )\\n ));\\n\\n // Reset the address now that we're done deploying.\\n messageContext.ovmADDRESS = prevADDRESS;\\n\\n // Commit the account with its final values.\\n _commitPendingAccount(\\n eoa,\\n address(proxyEOA),\\n keccak256(Lib_EthUtils.getCode(address(proxyEOA)))\\n );\\n\\n _setAccountNonce(eoa, 0);\\n }\\n\\n\\n /*********************************\\n * Opcodes: Contract Interaction *\\n *********************************/\\n\\n /**\\n * @notice Overrides CALL.\\n * @param _gasLimit Amount of gas to be passed into this call.\\n * @param _address Address of the contract to call.\\n * @param _calldata Data to send along with the call.\\n * @return _success Whether or not the call returned (rather than reverted).\\n * @return _returndata Data returned by the call.\\n */\\n function ovmCALL(\\n uint256 _gasLimit,\\n address _address,\\n bytes memory _calldata\\n )\\n override\\n public\\n fixedGasDiscount(100000)\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n // CALL updates the CALLER and ADDRESS.\\n MessageContext memory nextMessageContext = messageContext;\\n nextMessageContext.ovmCALLER = nextMessageContext.ovmADDRESS;\\n nextMessageContext.ovmADDRESS = _address;\\n\\n return _callContract(\\n nextMessageContext,\\n _gasLimit,\\n _address,\\n _calldata\\n );\\n }\\n\\n /**\\n * @notice Overrides STATICCALL.\\n * @param _gasLimit Amount of gas to be passed into this call.\\n * @param _address Address of the contract to call.\\n * @param _calldata Data to send along with the call.\\n * @return _success Whether or not the call returned (rather than reverted).\\n * @return _returndata Data returned by the call.\\n */\\n function ovmSTATICCALL(\\n uint256 _gasLimit,\\n address _address,\\n bytes memory _calldata\\n )\\n override\\n public\\n fixedGasDiscount(80000)\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n // STATICCALL updates the CALLER, updates the ADDRESS, and runs in a static context.\\n MessageContext memory nextMessageContext = messageContext;\\n nextMessageContext.ovmCALLER = nextMessageContext.ovmADDRESS;\\n nextMessageContext.ovmADDRESS = _address;\\n nextMessageContext.isStatic = true;\\n\\n return _callContract(\\n nextMessageContext,\\n _gasLimit,\\n _address,\\n _calldata\\n );\\n }\\n\\n /**\\n * @notice Overrides DELEGATECALL.\\n * @param _gasLimit Amount of gas to be passed into this call.\\n * @param _address Address of the contract to call.\\n * @param _calldata Data to send along with the call.\\n * @return _success Whether or not the call returned (rather than reverted).\\n * @return _returndata Data returned by the call.\\n */\\n function ovmDELEGATECALL(\\n uint256 _gasLimit,\\n address _address,\\n bytes memory _calldata\\n )\\n override\\n public\\n fixedGasDiscount(40000)\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n // DELEGATECALL does not change anything about the message context.\\n MessageContext memory nextMessageContext = messageContext;\\n\\n return _callContract(\\n nextMessageContext,\\n _gasLimit,\\n _address,\\n _calldata\\n );\\n }\\n\\n\\n /************************************\\n * Opcodes: Contract Storage Access *\\n ************************************/\\n\\n /**\\n * @notice Overrides SLOAD.\\n * @param _key 32 byte key of the storage slot to load.\\n * @return _value 32 byte value of the requested storage slot.\\n */\\n function ovmSLOAD(\\n bytes32 _key\\n )\\n override\\n public\\n netGasCost(40000)\\n returns (\\n bytes32 _value\\n )\\n {\\n // We always SLOAD from the storage of ADDRESS.\\n address contractAddress = ovmADDRESS();\\n\\n return _getContractStorage(\\n contractAddress,\\n _key\\n );\\n }\\n\\n /**\\n * @notice Overrides SSTORE.\\n * @param _key 32 byte key of the storage slot to set.\\n * @param _value 32 byte value for the storage slot.\\n */\\n function ovmSSTORE(\\n bytes32 _key,\\n bytes32 _value\\n )\\n override\\n public\\n notStatic\\n netGasCost(60000)\\n {\\n // We always SSTORE to the storage of ADDRESS.\\n address contractAddress = ovmADDRESS();\\n\\n _putContractStorage(\\n contractAddress,\\n _key,\\n _value\\n );\\n }\\n\\n\\n /*********************************\\n * Opcodes: Contract Code Access *\\n *********************************/\\n\\n /**\\n * @notice Overrides EXTCODECOPY.\\n * @param _contract Address of the contract to copy code from.\\n * @param _offset Offset in bytes from the start of contract code to copy beyond.\\n * @param _length Total number of bytes to copy from the contract's code.\\n * @return _code Bytes of code copied from the requested contract.\\n */\\n function ovmEXTCODECOPY(\\n address _contract,\\n uint256 _offset,\\n uint256 _length\\n )\\n override\\n public\\n returns (\\n bytes memory _code\\n )\\n {\\n return Lib_EthUtils.getCode(\\n _getAccountEthAddress(_contract),\\n _offset,\\n _length\\n );\\n }\\n\\n /**\\n * @notice Overrides EXTCODESIZE.\\n * @param _contract Address of the contract to query the size of.\\n * @return _EXTCODESIZE Size of the requested contract in bytes.\\n */\\n function ovmEXTCODESIZE(\\n address _contract\\n )\\n override\\n public\\n returns (\\n uint256 _EXTCODESIZE\\n )\\n {\\n return Lib_EthUtils.getCodeSize(\\n _getAccountEthAddress(_contract)\\n );\\n }\\n\\n /**\\n * @notice Overrides EXTCODEHASH.\\n * @param _contract Address of the contract to query the hash of.\\n * @return _EXTCODEHASH Hash of the requested contract.\\n */\\n function ovmEXTCODEHASH(\\n address _contract\\n )\\n override\\n public\\n returns (\\n bytes32 _EXTCODEHASH\\n )\\n {\\n return Lib_EthUtils.getCodeHash(\\n _getAccountEthAddress(_contract)\\n );\\n }\\n\\n /***************************************\\n * Public Functions: Execution Context *\\n ***************************************/\\n\\n function getMaxTransactionGasLimit()\\n external\\n view\\n override\\n returns (\\n uint256 _maxTransactionGasLimit\\n )\\n {\\n return gasMeterConfig.maxTransactionGasLimit;\\n }\\n\\n /********************************************\\n * Public Functions: Deployment Whitelisting *\\n ********************************************/\\n\\n /**\\n * Checks whether the given address is on the whitelist to ovmCREATE/ovmCREATE2, and reverts if not.\\n * @param _deployerAddress Address attempting to deploy a contract.\\n */\\n function _checkDeployerAllowed(\\n address _deployerAddress\\n )\\n internal\\n {\\n // From an OVM semantics perspective, this will appear identical to\\n // the deployer ovmCALLing the whitelist. This is fine--in a sense, we are forcing them to.\\n (bool success, bytes memory data) = ovmCALL(\\n gasleft(),\\n 0x4200000000000000000000000000000000000002,\\n abi.encodeWithSignature(\\\"isDeployerAllowed(address)\\\", _deployerAddress)\\n );\\n bool isAllowed = abi.decode(data, (bool));\\n\\n if (!isAllowed || !success) {\\n _revertWithFlag(RevertFlag.CREATOR_NOT_ALLOWED);\\n }\\n }\\n\\n /********************************************\\n * Internal Functions: Contract Interaction *\\n ********************************************/\\n\\n /**\\n * Creates a new contract and associates it with some contract address.\\n * @param _contractAddress Address to associate the created contract with.\\n * @param _bytecode Bytecode to be used to create the contract.\\n * @return Final OVM contract address.\\n * @return Revertdata, if and only if the creation threw an exception.\\n */\\n function _createContract(\\n address _contractAddress,\\n bytes memory _bytecode\\n )\\n internal\\n returns (\\n address,\\n bytes memory\\n )\\n {\\n // We always update the nonce of the creating account, even if the creation fails.\\n _setAccountNonce(ovmADDRESS(), _getAccountNonce(ovmADDRESS()) + 1);\\n\\n // We're stepping into a CREATE or CREATE2, so we need to update ADDRESS to point\\n // to the contract's associated address and CALLER to point to the previous ADDRESS.\\n MessageContext memory nextMessageContext = messageContext;\\n nextMessageContext.ovmCALLER = messageContext.ovmADDRESS;\\n nextMessageContext.ovmADDRESS = _contractAddress;\\n\\n // Run the common logic which occurs between call-type and create-type messages,\\n // passing in the creation bytecode and `true` to trigger create-specific logic.\\n (bool success, bytes memory data) = _handleExternalMessage(\\n nextMessageContext,\\n gasleft(),\\n _contractAddress,\\n _bytecode,\\n true\\n );\\n\\n // Yellow paper requires that address returned is zero if the contract deployment fails.\\n return (\\n success ? _contractAddress : address(0),\\n data\\n );\\n }\\n\\n /**\\n * Calls the deployed contract associated with a given address.\\n * @param _nextMessageContext Message context to be used for the call.\\n * @param _gasLimit Amount of gas to be passed into this call.\\n * @param _contract OVM address to be called.\\n * @param _calldata Data to send along with the call.\\n * @return _success Whether or not the call returned (rather than reverted).\\n * @return _returndata Data returned by the call.\\n */\\n function _callContract(\\n MessageContext memory _nextMessageContext,\\n uint256 _gasLimit,\\n address _contract,\\n bytes memory _calldata\\n )\\n internal\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n // We reserve addresses of the form 0xdeaddeaddead...NNNN for the container contracts in L2 geth.\\n // So, we block calls to these addresses since they are not safe to run as an OVM contract itself.\\n if (\\n (uint256(_contract) & uint256(0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000))\\n == uint256(0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000)\\n ) {\\n // EVM does not return data in the success case, see: https://github.com/ethereum/go-ethereum/blob/aae7660410f0ef90279e14afaaf2f429fdc2a186/core/vm/instructions.go#L600-L604\\n return (true, hex'');\\n }\\n\\n // Both 0x0000... and the EVM precompiles have the same address on L1 and L2 --> no trie lookup needed.\\n address codeContractAddress =\\n uint(_contract) < 100\\n ? _contract\\n : _getAccountEthAddress(_contract);\\n\\n return _handleExternalMessage(\\n _nextMessageContext,\\n _gasLimit,\\n codeContractAddress,\\n _calldata,\\n false\\n );\\n }\\n\\n /**\\n * Handles all interactions which involve the execution manager calling out to untrusted code (both calls and creates).\\n * Ensures that OVM-related measures are enforced, including L2 gas refunds, nuisance gas, and flagged reversions.\\n *\\n * @param _nextMessageContext Message context to be used for the external message.\\n * @param _gasLimit Amount of gas to be passed into this message.\\n * @param _contract OVM address being called or deployed to\\n * @param _data Data for the message (either calldata or creation code)\\n * @param _isCreate Whether this is a create-type message.\\n * @return Whether or not the message (either a call or deployment) succeeded.\\n * @return Data returned by the message.\\n */\\n function _handleExternalMessage(\\n MessageContext memory _nextMessageContext,\\n uint256 _gasLimit,\\n address _contract,\\n bytes memory _data,\\n bool _isCreate\\n )\\n internal\\n returns (\\n bool,\\n bytes memory\\n )\\n {\\n // We need to switch over to our next message context for the duration of this call.\\n MessageContext memory prevMessageContext = messageContext;\\n _switchMessageContext(prevMessageContext, _nextMessageContext);\\n\\n // Nuisance gas is a system used to bound the ability for an attacker to make fraud proofs\\n // expensive by touching a lot of different accounts or storage slots. Since most contracts\\n // only use a few storage slots during any given transaction, this shouldn't be a limiting\\n // factor.\\n uint256 prevNuisanceGasLeft = messageRecord.nuisanceGasLeft;\\n uint256 nuisanceGasLimit = _getNuisanceGasLimit(_gasLimit);\\n messageRecord.nuisanceGasLeft = nuisanceGasLimit;\\n\\n // Make the call and make sure to pass in the gas limit. Another instance of hidden\\n // complexity. `_contract` is guaranteed to be a safe contract, meaning its return/revert\\n // behavior can be controlled. In particular, we enforce that flags are passed through\\n // revert data as to retrieve execution metadata that would normally be reverted out of\\n // existence.\\n\\n bool success;\\n bytes memory returndata;\\n if (_isCreate) {\\n // safeCREATE() is a function which replicates a CREATE message, but uses return values\\n // Which match that of CALL (i.e. bool, bytes). This allows many security checks to be\\n // to be shared between untrusted call and create call frames.\\n (success, returndata) = address(this).call(\\n abi.encodeWithSelector(\\n this.safeCREATE.selector,\\n _gasLimit,\\n _data,\\n _contract\\n )\\n );\\n } else {\\n (success, returndata) = _contract.call{gas: _gasLimit}(_data);\\n }\\n\\n // Switch back to the original message context now that we're out of the call.\\n _switchMessageContext(_nextMessageContext, prevMessageContext);\\n\\n // Assuming there were no reverts, the message record should be accurate here. We'll update\\n // this value in the case of a revert.\\n uint256 nuisanceGasLeft = messageRecord.nuisanceGasLeft;\\n\\n // Reverts at this point are completely OK, but we need to make a few updates based on the\\n // information passed through the revert.\\n if (success == false) {\\n (\\n RevertFlag flag,\\n uint256 nuisanceGasLeftPostRevert,\\n uint256 ovmGasRefund,\\n bytes memory returndataFromFlag\\n ) = _decodeRevertData(returndata);\\n\\n // INVALID_STATE_ACCESS is the only flag that triggers an immediate abort of the\\n // parent EVM message. This behavior is necessary because INVALID_STATE_ACCESS must\\n // halt any further transaction execution that could impact the execution result.\\n if (flag == RevertFlag.INVALID_STATE_ACCESS) {\\n _revertWithFlag(flag);\\n }\\n\\n // INTENTIONAL_REVERT, UNSAFE_BYTECODE, STATIC_VIOLATION, and CREATOR_NOT_ALLOWED aren't\\n // dependent on the input state, so we can just handle them like standard reverts. Our only change here\\n // is to record the gas refund reported by the call (enforced by safety checking).\\n if (\\n flag == RevertFlag.INTENTIONAL_REVERT\\n || flag == RevertFlag.UNSAFE_BYTECODE\\n || flag == RevertFlag.STATIC_VIOLATION\\n || flag == RevertFlag.CREATOR_NOT_ALLOWED\\n ) {\\n transactionRecord.ovmGasRefund = ovmGasRefund;\\n }\\n\\n // INTENTIONAL_REVERT needs to pass up the user-provided return data encoded into the\\n // flag, *not* the full encoded flag. All other revert types return no data.\\n if (\\n flag == RevertFlag.INTENTIONAL_REVERT\\n || _isCreate\\n ) {\\n returndata = returndataFromFlag;\\n } else {\\n returndata = hex'';\\n }\\n\\n // Reverts mean we need to use up whatever \\\"nuisance gas\\\" was used by the call.\\n // EXCEEDS_NUISANCE_GAS explicitly reduces the remaining nuisance gas for this message\\n // to zero. OUT_OF_GAS is a \\\"pseudo\\\" flag given that messages return no data when they\\n // run out of gas, so we have to treat this like EXCEEDS_NUISANCE_GAS. All other flags\\n // will simply pass up the remaining nuisance gas.\\n nuisanceGasLeft = nuisanceGasLeftPostRevert;\\n }\\n\\n // We need to reset the nuisance gas back to its original value minus the amount used here.\\n messageRecord.nuisanceGasLeft = prevNuisanceGasLeft - (nuisanceGasLimit - nuisanceGasLeft);\\n\\n return (\\n success,\\n returndata\\n );\\n }\\n\\n /**\\n * Handles the creation-specific safety measures required for OVM contract deployment.\\n * This function sanitizes the return types for creation messages to match calls (bool, bytes),\\n * by being an external function which the EM can call, that mimics the success/fail case of the CREATE.\\n * This allows for consistent handling of both types of messages in _handleExternalMessage().\\n * Having this step occur as a separate call frame also allows us to easily revert the\\n * contract deployment in the event that the code is unsafe.\\n *\\n * @param _gasLimit Amount of gas to be passed into this creation.\\n * @param _creationCode Code to pass into CREATE for deployment.\\n * @param _address OVM address being deployed to.\\n */\\n function safeCREATE(\\n uint _gasLimit,\\n bytes memory _creationCode,\\n address _address\\n )\\n external\\n {\\n // The only way this should callable is from within _createContract(),\\n // and it should DEFINITELY not be callable by a non-EM code contract.\\n if (msg.sender != address(this)) {\\n return;\\n }\\n // Check that there is not already code at this address.\\n if (_hasEmptyAccount(_address) == false) {\\n // Note: in the EVM, this case burns all allotted gas. For improved\\n // developer experience, we do return the remaining gas.\\n _revertWithFlag(\\n RevertFlag.CREATE_COLLISION,\\n Lib_ErrorUtils.encodeRevertString(\\\"A contract has already been deployed to this address\\\")\\n );\\n }\\n\\n // Check the creation bytecode against the OVM_SafetyChecker.\\n if (ovmSafetyChecker.isBytecodeSafe(_creationCode) == false) {\\n _revertWithFlag(\\n RevertFlag.UNSAFE_BYTECODE,\\n Lib_ErrorUtils.encodeRevertString(\\\"Contract creation code contains unsafe opcodes. Did you use the right compiler or pass an unsafe constructor argument?\\\")\\n );\\n }\\n\\n // We always need to initialize the contract with the default account values.\\n _initPendingAccount(_address);\\n\\n // Actually execute the EVM create message.\\n // NOTE: The inline assembly below means we can NOT make any evm calls between here and then.\\n address ethAddress = Lib_EthUtils.createContract(_creationCode);\\n\\n if (ethAddress == address(0)) {\\n // If the creation fails, the EVM lets us grab its revert data. This may contain a revert flag\\n // to be used above in _handleExternalMessage, so we pass the revert data back up unmodified.\\n assembly {\\n returndatacopy(0,0,returndatasize())\\n revert(0, returndatasize())\\n }\\n }\\n\\n // Again simply checking that the deployed code is safe too. Contracts can generate\\n // arbitrary deployment code, so there's no easy way to analyze this beforehand.\\n bytes memory deployedCode = Lib_EthUtils.getCode(ethAddress);\\n if (ovmSafetyChecker.isBytecodeSafe(deployedCode) == false) {\\n _revertWithFlag(\\n RevertFlag.UNSAFE_BYTECODE,\\n Lib_ErrorUtils.encodeRevertString(\\\"Constructor attempted to deploy unsafe bytecode.\\\")\\n );\\n }\\n\\n // Contract creation didn't need to be reverted and the bytecode is safe. We finish up by\\n // associating the desired address with the newly created contract's code hash and address.\\n _commitPendingAccount(\\n _address,\\n ethAddress,\\n Lib_EthUtils.getCodeHash(ethAddress)\\n );\\n }\\n\\n /******************************************\\n * Internal Functions: State Manipulation *\\n ******************************************/\\n\\n /**\\n * Checks whether an account exists within the OVM_StateManager.\\n * @param _address Address of the account to check.\\n * @return _exists Whether or not the account exists.\\n */\\n function _hasAccount(\\n address _address\\n )\\n internal\\n returns (\\n bool _exists\\n )\\n {\\n _checkAccountLoad(_address);\\n return ovmStateManager.hasAccount(_address);\\n }\\n\\n /**\\n * Checks whether a known empty account exists within the OVM_StateManager.\\n * @param _address Address of the account to check.\\n * @return _exists Whether or not the account empty exists.\\n */\\n function _hasEmptyAccount(\\n address _address\\n )\\n internal\\n returns (\\n bool _exists\\n )\\n {\\n _checkAccountLoad(_address);\\n return ovmStateManager.hasEmptyAccount(_address);\\n }\\n\\n /**\\n * Sets the nonce of an account.\\n * @param _address Address of the account to modify.\\n * @param _nonce New account nonce.\\n */\\n function _setAccountNonce(\\n address _address,\\n uint256 _nonce\\n )\\n internal\\n {\\n _checkAccountChange(_address);\\n ovmStateManager.setAccountNonce(_address, _nonce);\\n }\\n\\n /**\\n * Gets the nonce of an account.\\n * @param _address Address of the account to access.\\n * @return _nonce Nonce of the account.\\n */\\n function _getAccountNonce(\\n address _address\\n )\\n internal\\n returns (\\n uint256 _nonce\\n )\\n {\\n _checkAccountLoad(_address);\\n return ovmStateManager.getAccountNonce(_address);\\n }\\n\\n /**\\n * Retrieves the Ethereum address of an account.\\n * @param _address Address of the account to access.\\n * @return _ethAddress Corresponding Ethereum address.\\n */\\n function _getAccountEthAddress(\\n address _address\\n )\\n internal\\n returns (\\n address _ethAddress\\n )\\n {\\n _checkAccountLoad(_address);\\n return ovmStateManager.getAccountEthAddress(_address);\\n }\\n\\n /**\\n * Creates the default account object for the given address.\\n * @param _address Address of the account create.\\n */\\n function _initPendingAccount(\\n address _address\\n )\\n internal\\n {\\n // Although it seems like `_checkAccountChange` would be more appropriate here, we don't\\n // actually consider an account \\\"changed\\\" until it's inserted into the state (in this case\\n // by `_commitPendingAccount`).\\n _checkAccountLoad(_address);\\n ovmStateManager.initPendingAccount(_address);\\n }\\n\\n /**\\n * Stores additional relevant data for a new account, thereby \\\"committing\\\" it to the state.\\n * This function is only called during `ovmCREATE` and `ovmCREATE2` after a successful contract\\n * creation.\\n * @param _address Address of the account to commit.\\n * @param _ethAddress Address of the associated deployed contract.\\n * @param _codeHash Hash of the code stored at the address.\\n */\\n function _commitPendingAccount(\\n address _address,\\n address _ethAddress,\\n bytes32 _codeHash\\n )\\n internal\\n {\\n _checkAccountChange(_address);\\n ovmStateManager.commitPendingAccount(\\n _address,\\n _ethAddress,\\n _codeHash\\n );\\n }\\n\\n /**\\n * Retrieves the value of a storage slot.\\n * @param _contract Address of the contract to query.\\n * @param _key 32 byte key of the storage slot.\\n * @return _value 32 byte storage slot value.\\n */\\n function _getContractStorage(\\n address _contract,\\n bytes32 _key\\n )\\n internal\\n returns (\\n bytes32 _value\\n )\\n {\\n _checkContractStorageLoad(_contract, _key);\\n return ovmStateManager.getContractStorage(_contract, _key);\\n }\\n\\n /**\\n * Sets the value of a storage slot.\\n * @param _contract Address of the contract to modify.\\n * @param _key 32 byte key of the storage slot.\\n * @param _value 32 byte storage slot value.\\n */\\n function _putContractStorage(\\n address _contract,\\n bytes32 _key,\\n bytes32 _value\\n )\\n internal\\n {\\n // We don't set storage if the value didn't change. Although this acts as a convenient\\n // optimization, it's also necessary to avoid the case in which a contract with no storage\\n // attempts to store the value \\\"0\\\" at any key. Putting this value (and therefore requiring\\n // that the value be committed into the storage trie after execution) would incorrectly\\n // modify the storage root.\\n if (_getContractStorage(_contract, _key) == _value) {\\n return;\\n }\\n\\n _checkContractStorageChange(_contract, _key);\\n ovmStateManager.putContractStorage(_contract, _key, _value);\\n }\\n\\n /**\\n * Validation whenever a contract needs to be loaded. Checks that the account exists, charges\\n * nuisance gas if the account hasn't been loaded before.\\n * @param _address Address of the account to load.\\n */\\n function _checkAccountLoad(\\n address _address\\n )\\n internal\\n {\\n // See `_checkContractStorageLoad` for more information.\\n if (gasleft() < MIN_GAS_FOR_INVALID_STATE_ACCESS) {\\n _revertWithFlag(RevertFlag.OUT_OF_GAS);\\n }\\n\\n // See `_checkContractStorageLoad` for more information.\\n if (ovmStateManager.hasAccount(_address) == false) {\\n _revertWithFlag(RevertFlag.INVALID_STATE_ACCESS);\\n }\\n\\n // Check whether the account has been loaded before and mark it as loaded if not. We need\\n // this because \\\"nuisance gas\\\" only applies to the first time that an account is loaded.\\n (\\n bool _wasAccountAlreadyLoaded\\n ) = ovmStateManager.testAndSetAccountLoaded(_address);\\n\\n // If we hadn't already loaded the account, then we'll need to charge \\\"nuisance gas\\\" based\\n // on the size of the contract code.\\n if (_wasAccountAlreadyLoaded == false) {\\n _useNuisanceGas(\\n (Lib_EthUtils.getCodeSize(_getAccountEthAddress(_address)) * NUISANCE_GAS_PER_CONTRACT_BYTE) + MIN_NUISANCE_GAS_PER_CONTRACT\\n );\\n }\\n }\\n\\n /**\\n * Validation whenever a contract needs to be changed. Checks that the account exists, charges\\n * nuisance gas if the account hasn't been changed before.\\n * @param _address Address of the account to change.\\n */\\n function _checkAccountChange(\\n address _address\\n )\\n internal\\n {\\n // Start by checking for a load as we only want to charge nuisance gas proportional to\\n // contract size once.\\n _checkAccountLoad(_address);\\n\\n // Check whether the account has been changed before and mark it as changed if not. We need\\n // this because \\\"nuisance gas\\\" only applies to the first time that an account is changed.\\n (\\n bool _wasAccountAlreadyChanged\\n ) = ovmStateManager.testAndSetAccountChanged(_address);\\n\\n // If we hadn't already loaded the account, then we'll need to charge \\\"nuisance gas\\\" based\\n // on the size of the contract code.\\n if (_wasAccountAlreadyChanged == false) {\\n ovmStateManager.incrementTotalUncommittedAccounts();\\n _useNuisanceGas(\\n (Lib_EthUtils.getCodeSize(_getAccountEthAddress(_address)) * NUISANCE_GAS_PER_CONTRACT_BYTE) + MIN_NUISANCE_GAS_PER_CONTRACT\\n );\\n }\\n }\\n\\n /**\\n * Validation whenever a slot needs to be loaded. Checks that the account exists, charges\\n * nuisance gas if the slot hasn't been loaded before.\\n * @param _contract Address of the account to load from.\\n * @param _key 32 byte key to load.\\n */\\n function _checkContractStorageLoad(\\n address _contract,\\n bytes32 _key\\n )\\n internal\\n {\\n // Another case of hidden complexity. If we didn't enforce this requirement, then a\\n // contract could pass in just enough gas to cause the INVALID_STATE_ACCESS check to fail\\n // on L1 but not on L2. A contract could use this behavior to prevent the\\n // OVM_ExecutionManager from detecting an invalid state access. Reverting with OUT_OF_GAS\\n // allows us to also charge for the full message nuisance gas, because you deserve that for\\n // trying to break the contract in this way.\\n if (gasleft() < MIN_GAS_FOR_INVALID_STATE_ACCESS) {\\n _revertWithFlag(RevertFlag.OUT_OF_GAS);\\n }\\n\\n // We need to make sure that the transaction isn't trying to access storage that hasn't\\n // been provided to the OVM_StateManager. We'll immediately abort if this is the case.\\n // We know that we have enough gas to do this check because of the above test.\\n if (ovmStateManager.hasContractStorage(_contract, _key) == false) {\\n _revertWithFlag(RevertFlag.INVALID_STATE_ACCESS);\\n }\\n\\n // Check whether the slot has been loaded before and mark it as loaded if not. We need\\n // this because \\\"nuisance gas\\\" only applies to the first time that a slot is loaded.\\n (\\n bool _wasContractStorageAlreadyLoaded\\n ) = ovmStateManager.testAndSetContractStorageLoaded(_contract, _key);\\n\\n // If we hadn't already loaded the account, then we'll need to charge some fixed amount of\\n // \\\"nuisance gas\\\".\\n if (_wasContractStorageAlreadyLoaded == false) {\\n _useNuisanceGas(NUISANCE_GAS_SLOAD);\\n }\\n }\\n\\n /**\\n * Validation whenever a slot needs to be changed. Checks that the account exists, charges\\n * nuisance gas if the slot hasn't been changed before.\\n * @param _contract Address of the account to change.\\n * @param _key 32 byte key to change.\\n */\\n function _checkContractStorageChange(\\n address _contract,\\n bytes32 _key\\n )\\n internal\\n {\\n // Start by checking for load to make sure we have the storage slot and that we charge the\\n // \\\"nuisance gas\\\" necessary to prove the storage slot state.\\n _checkContractStorageLoad(_contract, _key);\\n\\n // Check whether the slot has been changed before and mark it as changed if not. We need\\n // this because \\\"nuisance gas\\\" only applies to the first time that a slot is changed.\\n (\\n bool _wasContractStorageAlreadyChanged\\n ) = ovmStateManager.testAndSetContractStorageChanged(_contract, _key);\\n\\n // If we hadn't already changed the account, then we'll need to charge some fixed amount of\\n // \\\"nuisance gas\\\".\\n if (_wasContractStorageAlreadyChanged == false) {\\n // Changing a storage slot means that we're also going to have to change the\\n // corresponding account, so do an account change check.\\n _checkAccountChange(_contract);\\n\\n ovmStateManager.incrementTotalUncommittedContractStorage();\\n _useNuisanceGas(NUISANCE_GAS_SSTORE);\\n }\\n }\\n\\n\\n /************************************\\n * Internal Functions: Revert Logic *\\n ************************************/\\n\\n /**\\n * Simple encoding for revert data.\\n * @param _flag Flag to revert with.\\n * @param _data Additional user-provided revert data.\\n * @return _revertdata Encoded revert data.\\n */\\n function _encodeRevertData(\\n RevertFlag _flag,\\n bytes memory _data\\n )\\n internal\\n view\\n returns (\\n bytes memory _revertdata\\n )\\n {\\n // Out of gas and create exceptions will fundamentally return no data, so simulating it shouldn't either.\\n if (\\n _flag == RevertFlag.OUT_OF_GAS\\n ) {\\n return bytes('');\\n }\\n\\n // INVALID_STATE_ACCESS doesn't need to return any data other than the flag.\\n if (_flag == RevertFlag.INVALID_STATE_ACCESS) {\\n return abi.encode(\\n _flag,\\n 0,\\n 0,\\n bytes('')\\n );\\n }\\n\\n // Just ABI encode the rest of the parameters.\\n return abi.encode(\\n _flag,\\n messageRecord.nuisanceGasLeft,\\n transactionRecord.ovmGasRefund,\\n _data\\n );\\n }\\n\\n /**\\n * Simple decoding for revert data.\\n * @param _revertdata Revert data to decode.\\n * @return _flag Flag used to revert.\\n * @return _nuisanceGasLeft Amount of nuisance gas unused by the message.\\n * @return _ovmGasRefund Amount of gas refunded during the message.\\n * @return _data Additional user-provided revert data.\\n */\\n function _decodeRevertData(\\n bytes memory _revertdata\\n )\\n internal\\n pure\\n returns (\\n RevertFlag _flag,\\n uint256 _nuisanceGasLeft,\\n uint256 _ovmGasRefund,\\n bytes memory _data\\n )\\n {\\n // A length of zero means the call ran out of gas, just return empty data.\\n if (_revertdata.length == 0) {\\n return (\\n RevertFlag.OUT_OF_GAS,\\n 0,\\n 0,\\n bytes('')\\n );\\n }\\n\\n // ABI decode the incoming data.\\n return abi.decode(_revertdata, (RevertFlag, uint256, uint256, bytes));\\n }\\n\\n /**\\n * Causes a message to revert or abort.\\n * @param _flag Flag to revert with.\\n * @param _data Additional user-provided data.\\n */\\n function _revertWithFlag(\\n RevertFlag _flag,\\n bytes memory _data\\n )\\n internal\\n view\\n {\\n bytes memory revertdata = _encodeRevertData(\\n _flag,\\n _data\\n );\\n\\n assembly {\\n revert(add(revertdata, 0x20), mload(revertdata))\\n }\\n }\\n\\n /**\\n * Causes a message to revert or abort.\\n * @param _flag Flag to revert with.\\n */\\n function _revertWithFlag(\\n RevertFlag _flag\\n )\\n internal\\n {\\n _revertWithFlag(_flag, bytes(''));\\n }\\n\\n\\n /******************************************\\n * Internal Functions: Nuisance Gas Logic *\\n ******************************************/\\n\\n /**\\n * Computes the nuisance gas limit from the gas limit.\\n * @dev This function is currently using a naive implementation whereby the nuisance gas limit\\n * is set to exactly equal the lesser of the gas limit or remaining gas. It's likely that\\n * this implementation is perfectly fine, but we may change this formula later.\\n * @param _gasLimit Gas limit to compute from.\\n * @return _nuisanceGasLimit Computed nuisance gas limit.\\n */\\n function _getNuisanceGasLimit(\\n uint256 _gasLimit\\n )\\n internal\\n view\\n returns (\\n uint256 _nuisanceGasLimit\\n )\\n {\\n return _gasLimit < gasleft() ? _gasLimit : gasleft();\\n }\\n\\n /**\\n * Uses a certain amount of nuisance gas.\\n * @param _amount Amount of nuisance gas to use.\\n */\\n function _useNuisanceGas(\\n uint256 _amount\\n )\\n internal\\n {\\n // Essentially the same as a standard OUT_OF_GAS, except we also retain a record of the gas\\n // refund to be given at the end of the transaction.\\n if (messageRecord.nuisanceGasLeft < _amount) {\\n _revertWithFlag(RevertFlag.EXCEEDS_NUISANCE_GAS);\\n }\\n\\n messageRecord.nuisanceGasLeft -= _amount;\\n }\\n\\n\\n /************************************\\n * Internal Functions: Gas Metering *\\n ************************************/\\n\\n /**\\n * Checks whether a transaction needs to start a new epoch and does so if necessary.\\n * @param _timestamp Transaction timestamp.\\n */\\n function _checkNeedsNewEpoch(\\n uint256 _timestamp\\n )\\n internal\\n {\\n if (\\n _timestamp >= (\\n _getGasMetadata(GasMetadataKey.CURRENT_EPOCH_START_TIMESTAMP)\\n + gasMeterConfig.secondsPerEpoch\\n )\\n ) {\\n _putGasMetadata(\\n GasMetadataKey.CURRENT_EPOCH_START_TIMESTAMP,\\n _timestamp\\n );\\n\\n _putGasMetadata(\\n GasMetadataKey.PREV_EPOCH_SEQUENCER_QUEUE_GAS,\\n _getGasMetadata(\\n GasMetadataKey.CUMULATIVE_SEQUENCER_QUEUE_GAS\\n )\\n );\\n\\n _putGasMetadata(\\n GasMetadataKey.PREV_EPOCH_L1TOL2_QUEUE_GAS,\\n _getGasMetadata(\\n GasMetadataKey.CUMULATIVE_L1TOL2_QUEUE_GAS\\n )\\n );\\n }\\n }\\n\\n /**\\n * Validates the input values of a transaction.\\n * @return _valid Whether or not the transaction data is valid.\\n */\\n function _isValidInput(\\n Lib_OVMCodec.Transaction memory _transaction\\n )\\n view\\n internal\\n returns (\\n bool\\n )\\n {\\n // Prevent reentrancy to run():\\n // This check prevents calling run with the default ovmNumber.\\n // Combined with the first check in run():\\n // if (transactionContext.ovmNUMBER != DEFAULT_UINT256) { return; }\\n // It should be impossible to re-enter since run() returns before any other call frames are created.\\n // Since this value is already being written to storage, we save much gas compared to\\n // using the standard nonReentrant pattern.\\n if (_transaction.blockNumber == DEFAULT_UINT256) {\\n return false;\\n }\\n\\n if (_isValidGasLimit(_transaction.gasLimit, _transaction.l1QueueOrigin) == false) {\\n return false;\\n }\\n\\n return true;\\n }\\n\\n /**\\n * Validates the gas limit for a given transaction.\\n * @param _gasLimit Gas limit provided by the transaction.\\n * param _queueOrigin Queue from which the transaction originated.\\n * @return _valid Whether or not the gas limit is valid.\\n */\\n function _isValidGasLimit(\\n uint256 _gasLimit,\\n Lib_OVMCodec.QueueOrigin // _queueOrigin\\n )\\n view\\n internal\\n returns (\\n bool _valid\\n )\\n {\\n // Always have to be below the maximum gas limit.\\n if (_gasLimit > gasMeterConfig.maxTransactionGasLimit) {\\n return false;\\n }\\n\\n // Always have to be above the minimum gas limit.\\n if (_gasLimit < gasMeterConfig.minTransactionGasLimit) {\\n return false;\\n }\\n\\n // TEMPORARY: Gas metering is disabled for minnet.\\n return true;\\n // GasMetadataKey cumulativeGasKey;\\n // GasMetadataKey prevEpochGasKey;\\n // if (_queueOrigin == Lib_OVMCodec.QueueOrigin.SEQUENCER_QUEUE) {\\n // cumulativeGasKey = GasMetadataKey.CUMULATIVE_SEQUENCER_QUEUE_GAS;\\n // prevEpochGasKey = GasMetadataKey.PREV_EPOCH_SEQUENCER_QUEUE_GAS;\\n // } else {\\n // cumulativeGasKey = GasMetadataKey.CUMULATIVE_L1TOL2_QUEUE_GAS;\\n // prevEpochGasKey = GasMetadataKey.PREV_EPOCH_L1TOL2_QUEUE_GAS;\\n // }\\n\\n // return (\\n // (\\n // _getGasMetadata(cumulativeGasKey)\\n // - _getGasMetadata(prevEpochGasKey)\\n // + _gasLimit\\n // ) < gasMeterConfig.maxGasPerQueuePerEpoch\\n // );\\n }\\n\\n /**\\n * Updates the cumulative gas after a transaction.\\n * @param _gasUsed Gas used by the transaction.\\n * @param _queueOrigin Queue from which the transaction originated.\\n */\\n function _updateCumulativeGas(\\n uint256 _gasUsed,\\n Lib_OVMCodec.QueueOrigin _queueOrigin\\n )\\n internal\\n {\\n GasMetadataKey cumulativeGasKey;\\n if (_queueOrigin == Lib_OVMCodec.QueueOrigin.SEQUENCER_QUEUE) {\\n cumulativeGasKey = GasMetadataKey.CUMULATIVE_SEQUENCER_QUEUE_GAS;\\n } else {\\n cumulativeGasKey = GasMetadataKey.CUMULATIVE_L1TOL2_QUEUE_GAS;\\n }\\n\\n _putGasMetadata(\\n cumulativeGasKey,\\n (\\n _getGasMetadata(cumulativeGasKey)\\n + gasMeterConfig.minTransactionGasLimit\\n + _gasUsed\\n - transactionRecord.ovmGasRefund\\n )\\n );\\n }\\n\\n /**\\n * Retrieves the value of a gas metadata key.\\n * @param _key Gas metadata key to retrieve.\\n * @return _value Value stored at the given key.\\n */\\n function _getGasMetadata(\\n GasMetadataKey _key\\n )\\n internal\\n returns (\\n uint256 _value\\n )\\n {\\n return uint256(_getContractStorage(\\n GAS_METADATA_ADDRESS,\\n bytes32(uint256(_key))\\n ));\\n }\\n\\n /**\\n * Sets the value of a gas metadata key.\\n * @param _key Gas metadata key to set.\\n * @param _value Value to store at the given key.\\n */\\n function _putGasMetadata(\\n GasMetadataKey _key,\\n uint256 _value\\n )\\n internal\\n {\\n _putContractStorage(\\n GAS_METADATA_ADDRESS,\\n bytes32(uint256(_key)),\\n bytes32(uint256(_value))\\n );\\n }\\n\\n\\n /*****************************************\\n * Internal Functions: Execution Context *\\n *****************************************/\\n\\n /**\\n * Swaps over to a new message context.\\n * @param _prevMessageContext Context we're switching from.\\n * @param _nextMessageContext Context we're switching to.\\n */\\n function _switchMessageContext(\\n MessageContext memory _prevMessageContext,\\n MessageContext memory _nextMessageContext\\n )\\n internal\\n {\\n // Avoid unnecessary the SSTORE.\\n if (_prevMessageContext.ovmCALLER != _nextMessageContext.ovmCALLER) {\\n messageContext.ovmCALLER = _nextMessageContext.ovmCALLER;\\n }\\n\\n // Avoid unnecessary the SSTORE.\\n if (_prevMessageContext.ovmADDRESS != _nextMessageContext.ovmADDRESS) {\\n messageContext.ovmADDRESS = _nextMessageContext.ovmADDRESS;\\n }\\n\\n // Avoid unnecessary the SSTORE.\\n if (_prevMessageContext.isStatic != _nextMessageContext.isStatic) {\\n messageContext.isStatic = _nextMessageContext.isStatic;\\n }\\n }\\n\\n /**\\n * Initializes the execution context.\\n * @param _transaction OVM transaction being executed.\\n */\\n function _initContext(\\n Lib_OVMCodec.Transaction memory _transaction\\n )\\n internal\\n {\\n transactionContext.ovmTIMESTAMP = _transaction.timestamp;\\n transactionContext.ovmNUMBER = _transaction.blockNumber;\\n transactionContext.ovmTXGASLIMIT = _transaction.gasLimit;\\n transactionContext.ovmL1QUEUEORIGIN = _transaction.l1QueueOrigin;\\n transactionContext.ovmL1TXORIGIN = _transaction.l1TxOrigin;\\n transactionContext.ovmGASLIMIT = gasMeterConfig.maxGasPerQueuePerEpoch;\\n\\n messageRecord.nuisanceGasLeft = _getNuisanceGasLimit(_transaction.gasLimit);\\n }\\n\\n /**\\n * Resets the transaction and message context.\\n */\\n function _resetContext()\\n internal\\n {\\n transactionContext.ovmL1TXORIGIN = DEFAULT_ADDRESS;\\n transactionContext.ovmTIMESTAMP = DEFAULT_UINT256;\\n transactionContext.ovmNUMBER = DEFAULT_UINT256;\\n transactionContext.ovmGASLIMIT = DEFAULT_UINT256;\\n transactionContext.ovmTXGASLIMIT = DEFAULT_UINT256;\\n transactionContext.ovmL1QUEUEORIGIN = Lib_OVMCodec.QueueOrigin.SEQUENCER_QUEUE;\\n\\n transactionRecord.ovmGasRefund = DEFAULT_UINT256;\\n\\n messageContext.ovmCALLER = DEFAULT_ADDRESS;\\n messageContext.ovmADDRESS = DEFAULT_ADDRESS;\\n messageContext.isStatic = false;\\n\\n messageRecord.nuisanceGasLeft = DEFAULT_UINT256;\\n\\n // Reset the ovmStateManager.\\n ovmStateManager = iOVM_StateManager(address(0));\\n }\\n\\n /*****************************\\n * L2-only Helper Functions *\\n *****************************/\\n\\n /**\\n * Unreachable helper function for simulating eth_calls with an OVM message context.\\n * This function will throw an exception in all cases other than when used as a custom entrypoint in L2 Geth to simulate eth_call.\\n * @param _transaction the message transaction to simulate.\\n * @param _from the OVM account the simulated call should be from.\\n */\\n function simulateMessage(\\n Lib_OVMCodec.Transaction memory _transaction,\\n address _from,\\n iOVM_StateManager _ovmStateManager\\n )\\n external\\n returns (\\n bool,\\n bytes memory\\n )\\n {\\n // Prevent this call from having any effect unless in a custom-set VM frame\\n require(msg.sender == address(0));\\n\\n ovmStateManager = _ovmStateManager;\\n _initContext(_transaction);\\n messageRecord.nuisanceGasLeft = uint(-1);\\n\\n messageContext.ovmADDRESS = _from;\\n\\n bool isCreate = _transaction.entrypoint == address(0);\\n if (isCreate) {\\n (address created, bytes memory revertData) = ovmCREATE(_transaction.data);\\n if (created == address(0)) {\\n return (false, revertData);\\n } else {\\n // The eth_call RPC endpoint for to = undefined will return the deployed bytecode\\n // in the success case, differing from standard create messages.\\n return (true, Lib_EthUtils.getCode(created));\\n }\\n } else {\\n return ovmCALL(\\n _transaction.gasLimit,\\n _transaction.entrypoint,\\n _transaction.data\\n );\\n }\\n }\\n}\\n\",\"keccak256\":\"0x229011db3d21b69e16814325f8e5debbdf6219b3dffb4011a24f2a6540a0d98e\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/predeploys/OVM_DeployerWhitelist.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Interface Imports */\\nimport { iOVM_DeployerWhitelist } from \\\"../../iOVM/predeploys/iOVM_DeployerWhitelist.sol\\\";\\n\\n/**\\n * @title OVM_DeployerWhitelist\\n * @dev The Deployer Whitelist is a temporary predeploy used to provide additional safety during the\\n * initial phases of our mainnet roll out. It is owned by the Optimism team, and defines accounts\\n * which are allowed to deploy contracts on Layer2. The Execution Manager will only allow an\\n * ovmCREATE or ovmCREATE2 operation to proceed if the deployer's address whitelisted.\\n *\\n * Compiler used: optimistic-solc\\n * Runtime target: OVM\\n */\\ncontract OVM_DeployerWhitelist is iOVM_DeployerWhitelist {\\n\\n /**********************\\n * Contract Constants *\\n **********************/\\n\\n bool public initialized;\\n bool public allowArbitraryDeployment;\\n address override public owner;\\n mapping (address => bool) public whitelist;\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n /**\\n * Blocks functions to anyone except the contract owner.\\n */\\n modifier onlyOwner() {\\n require(\\n msg.sender == owner,\\n \\\"Function can only be called by the owner of this contract.\\\"\\n );\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Initializes the whitelist.\\n * @param _owner Address of the owner for this contract.\\n * @param _allowArbitraryDeployment Whether or not to allow arbitrary contract deployment.\\n */\\n function initialize(\\n address _owner,\\n bool _allowArbitraryDeployment\\n )\\n override\\n public\\n {\\n if (initialized == true) {\\n return;\\n }\\n\\n initialized = true;\\n allowArbitraryDeployment = _allowArbitraryDeployment;\\n owner = _owner;\\n }\\n\\n /**\\n * Adds or removes an address from the deployment whitelist.\\n * @param _deployer Address to update permissions for.\\n * @param _isWhitelisted Whether or not the address is whitelisted.\\n */\\n function setWhitelistedDeployer(\\n address _deployer,\\n bool _isWhitelisted\\n )\\n override\\n public\\n onlyOwner\\n {\\n whitelist[_deployer] = _isWhitelisted;\\n }\\n\\n /**\\n * Updates the owner of this contract.\\n * @param _owner Address of the new owner.\\n */\\n function setOwner(\\n address _owner\\n )\\n override\\n public\\n onlyOwner\\n {\\n owner = _owner;\\n }\\n\\n /**\\n * Updates the arbitrary deployment flag.\\n * @param _allowArbitraryDeployment Whether or not to allow arbitrary contract deployment.\\n */\\n function setAllowArbitraryDeployment(\\n bool _allowArbitraryDeployment\\n )\\n override\\n public\\n onlyOwner\\n {\\n allowArbitraryDeployment = _allowArbitraryDeployment;\\n }\\n\\n /**\\n * Permanently enables arbitrary contract deployment and deletes the owner.\\n */\\n function enableArbitraryContractDeployment()\\n override\\n public\\n onlyOwner\\n {\\n setAllowArbitraryDeployment(true);\\n setOwner(address(0));\\n }\\n\\n /**\\n * Checks whether an address is allowed to deploy contracts.\\n * @param _deployer Address to check.\\n * @return _allowed Whether or not the address can deploy contracts.\\n */\\n function isDeployerAllowed(\\n address _deployer\\n )\\n override\\n public\\n returns (\\n bool\\n )\\n {\\n return (\\n initialized == false\\n || allowArbitraryDeployment == true\\n || whitelist[_deployer]\\n );\\n }\\n}\\n\",\"keccak256\":\"0x371e3d3ca1dd4177738b55eead9ad6f8278280e568694df6b42ee01f5558ccb2\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_CanonicalTransactionChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_ChainStorageContainer } from \\\"./iOVM_ChainStorageContainer.sol\\\";\\n\\n/**\\n * @title iOVM_CanonicalTransactionChain\\n */\\ninterface iOVM_CanonicalTransactionChain {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event TransactionEnqueued(\\n address _l1TxOrigin,\\n address _target,\\n uint256 _gasLimit,\\n bytes _data,\\n uint256 _queueIndex,\\n uint256 _timestamp\\n );\\n\\n event QueueBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event SequencerBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event TransactionBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct BatchContext {\\n uint256 numSequencedTransactions;\\n uint256 numSubsequentQueueTransactions;\\n uint256 timestamp;\\n uint256 blockNumber;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n\\n /**\\n * Accesses the batch storage container.\\n * @return Reference to the batch storage container.\\n */\\n function batches()\\n external\\n view\\n returns (\\n iOVM_ChainStorageContainer\\n );\\n\\n /**\\n * Accesses the queue storage container.\\n * @return Reference to the queue storage container.\\n */\\n function queue()\\n external\\n view\\n returns (\\n iOVM_ChainStorageContainer\\n );\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements()\\n external\\n view\\n returns (\\n uint256 _totalElements\\n );\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches()\\n external\\n view\\n returns (\\n uint256 _totalBatches\\n );\\n\\n /**\\n * Returns the index of the next element to be enqueued.\\n * @return Index for the next queue element.\\n */\\n function getNextQueueIndex()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Gets the queue element at a particular index.\\n * @param _index Index of the queue element to access.\\n * @return _element Queue element at the given index.\\n */\\n function getQueueElement(\\n uint256 _index\\n )\\n external\\n view\\n returns (\\n Lib_OVMCodec.QueueElement memory _element\\n );\\n\\n /**\\n * Returns the timestamp of the last transaction.\\n * @return Timestamp for the last transaction.\\n */\\n function getLastTimestamp()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Returns the blocknumber of the last transaction.\\n * @return Blocknumber for the last transaction.\\n */\\n function getLastBlockNumber()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Get the number of queue elements which have not yet been included.\\n * @return Number of pending queue elements.\\n */\\n function getNumPendingQueueElements()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Retrieves the length of the queue, including\\n * both pending and canonical transactions.\\n * @return Length of the queue.\\n */\\n function getQueueLength()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n\\n /**\\n * Adds a transaction to the queue.\\n * @param _target Target contract to send the transaction to.\\n * @param _gasLimit Gas limit for the given transaction.\\n * @param _data Transaction data.\\n */\\n function enqueue(\\n address _target,\\n uint256 _gasLimit,\\n bytes memory _data\\n )\\n external;\\n\\n /**\\n * Appends a given number of queued transactions as a single batch.\\n * @param _numQueuedTransactions Number of transactions to append.\\n */\\n function appendQueueBatch(\\n uint256 _numQueuedTransactions\\n )\\n external;\\n\\n /**\\n * Allows the sequencer to append a batch of transactions.\\n * @dev This function uses a custom encoding scheme for efficiency reasons.\\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\\n * .param _contexts Array of batch contexts.\\n * .param _transactionDataFields Array of raw transaction data.\\n */\\n function appendSequencerBatch(\\n // uint40 _shouldStartAtElement,\\n // uint24 _totalElementsToAppend,\\n // BatchContext[] _contexts,\\n // bytes[] _transactionDataFields\\n )\\n external;\\n\\n /**\\n * Verifies whether a transaction is included in the chain.\\n * @param _transaction Transaction to verify.\\n * @param _txChainElement Transaction chain element corresponding to the transaction.\\n * @param _batchHeader Header of the batch the transaction was included in.\\n * @param _inclusionProof Inclusion proof for the provided transaction chain element.\\n * @return True if the transaction exists in the CTC, false if not.\\n */\\n function verifyTransaction(\\n Lib_OVMCodec.Transaction memory _transaction,\\n Lib_OVMCodec.TransactionChainElement memory _txChainElement,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _inclusionProof\\n )\\n external\\n view\\n returns (\\n bool\\n );\\n}\\n\",\"keccak256\":\"0xb5e55488a1982841c07cdf5ff475da4789596f111dd48f01b1918ee4c775cf3a\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_ChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title iOVM_ChainStorageContainer\\n */\\ninterface iOVM_ChainStorageContainer {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata()\\n external\\n view\\n returns (\\n bytes27\\n );\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length()\\n external\\n view\\n returns (\\n uint256\\n );\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(\\n bytes32 _object\\n )\\n external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(\\n bytes32 _object,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(\\n uint256 _index\\n )\\n external\\n view\\n returns (\\n bytes32\\n );\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index\\n )\\n external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Marks an index as overwritable, meaing the underlying buffer can start to write values over\\n * any objects before and including the given index.\\n */\\n function setNextOverwritableIndex(\\n uint256 _index\\n )\\n external;\\n}\\n\",\"keccak256\":\"0x2d7973a0ad84c23ec62624d3f1e3aeb198cc72686ff1e6cfa17155556b320c94\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/execution/iOVM_ExecutionManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\ninterface iOVM_ExecutionManager {\\n /**********\\n * Enums *\\n *********/\\n\\n enum RevertFlag {\\n OUT_OF_GAS,\\n INTENTIONAL_REVERT,\\n EXCEEDS_NUISANCE_GAS,\\n INVALID_STATE_ACCESS,\\n UNSAFE_BYTECODE,\\n CREATE_COLLISION,\\n STATIC_VIOLATION,\\n CREATOR_NOT_ALLOWED\\n }\\n\\n enum GasMetadataKey {\\n CURRENT_EPOCH_START_TIMESTAMP,\\n CUMULATIVE_SEQUENCER_QUEUE_GAS,\\n CUMULATIVE_L1TOL2_QUEUE_GAS,\\n PREV_EPOCH_SEQUENCER_QUEUE_GAS,\\n PREV_EPOCH_L1TOL2_QUEUE_GAS\\n }\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct GasMeterConfig {\\n uint256 minTransactionGasLimit;\\n uint256 maxTransactionGasLimit;\\n uint256 maxGasPerQueuePerEpoch;\\n uint256 secondsPerEpoch;\\n }\\n\\n struct GlobalContext {\\n uint256 ovmCHAINID;\\n }\\n\\n struct TransactionContext {\\n Lib_OVMCodec.QueueOrigin ovmL1QUEUEORIGIN;\\n uint256 ovmTIMESTAMP;\\n uint256 ovmNUMBER;\\n uint256 ovmGASLIMIT;\\n uint256 ovmTXGASLIMIT;\\n address ovmL1TXORIGIN;\\n }\\n\\n struct TransactionRecord {\\n uint256 ovmGasRefund;\\n }\\n\\n struct MessageContext {\\n address ovmCALLER;\\n address ovmADDRESS;\\n bool isStatic;\\n }\\n\\n struct MessageRecord {\\n uint256 nuisanceGasLeft;\\n }\\n\\n\\n /************************************\\n * Transaction Execution Entrypoint *\\n ************************************/\\n\\n function run(\\n Lib_OVMCodec.Transaction calldata _transaction,\\n address _txStateManager\\n ) external returns (bytes memory);\\n\\n\\n /*******************\\n * Context Opcodes *\\n *******************/\\n\\n function ovmCALLER() external view returns (address _caller);\\n function ovmADDRESS() external view returns (address _address);\\n function ovmTIMESTAMP() external view returns (uint256 _timestamp);\\n function ovmNUMBER() external view returns (uint256 _number);\\n function ovmGASLIMIT() external view returns (uint256 _gasLimit);\\n function ovmCHAINID() external view returns (uint256 _chainId);\\n\\n\\n /**********************\\n * L2 Context Opcodes *\\n **********************/\\n\\n function ovmL1QUEUEORIGIN() external view returns (Lib_OVMCodec.QueueOrigin _queueOrigin);\\n function ovmL1TXORIGIN() external view returns (address _l1TxOrigin);\\n\\n\\n /*******************\\n * Halting Opcodes *\\n *******************/\\n\\n function ovmREVERT(bytes memory _data) external;\\n\\n\\n /*****************************\\n * Contract Creation Opcodes *\\n *****************************/\\n\\n function ovmCREATE(bytes memory _bytecode) external returns (address _contract, bytes memory _revertdata);\\n function ovmCREATE2(bytes memory _bytecode, bytes32 _salt) external returns (address _contract, bytes memory _revertdata);\\n\\n\\n /*******************************\\n * Account Abstraction Opcodes *\\n ******************************/\\n\\n function ovmGETNONCE() external returns (uint256 _nonce);\\n function ovmINCREMENTNONCE() external;\\n function ovmCREATEEOA(bytes32 _messageHash, uint8 _v, bytes32 _r, bytes32 _s) external;\\n\\n\\n /****************************\\n * Contract Calling Opcodes *\\n ****************************/\\n\\n function ovmCALL(uint256 _gasLimit, address _address, bytes memory _calldata) external returns (bool _success, bytes memory _returndata);\\n function ovmSTATICCALL(uint256 _gasLimit, address _address, bytes memory _calldata) external returns (bool _success, bytes memory _returndata);\\n function ovmDELEGATECALL(uint256 _gasLimit, address _address, bytes memory _calldata) external returns (bool _success, bytes memory _returndata);\\n\\n\\n /****************************\\n * Contract Storage Opcodes *\\n ****************************/\\n\\n function ovmSLOAD(bytes32 _key) external returns (bytes32 _value);\\n function ovmSSTORE(bytes32 _key, bytes32 _value) external;\\n\\n\\n /*************************\\n * Contract Code Opcodes *\\n *************************/\\n\\n function ovmEXTCODECOPY(address _contract, uint256 _offset, uint256 _length) external returns (bytes memory _code);\\n function ovmEXTCODESIZE(address _contract) external returns (uint256 _size);\\n function ovmEXTCODEHASH(address _contract) external returns (bytes32 _hash);\\n\\n\\n /***************************************\\n * Public Functions: Execution Context *\\n ***************************************/\\n\\n function getMaxTransactionGasLimit() external view returns (uint _maxTransactionGasLimit);\\n}\\n\",\"keccak256\":\"0xf023d5d6fc6a03bd52f7a57af6e21076de77e8925d065bb79db062e73e43b684\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/execution/iOVM_SafetyChecker.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title iOVM_SafetyChecker\\n */\\ninterface iOVM_SafetyChecker {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function isBytecodeSafe(bytes calldata _bytecode) external pure returns (bool);\\n}\\n\",\"keccak256\":\"0xde6639676d4ec4f77297652d5ede2429bc93e74e11fefd9e9de4bc92dd784878\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/execution/iOVM_StateManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title iOVM_StateManager\\n */\\ninterface iOVM_StateManager {\\n\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n enum ItemState {\\n ITEM_UNTOUCHED,\\n ITEM_LOADED,\\n ITEM_CHANGED,\\n ITEM_COMMITTED\\n }\\n\\n /***************************\\n * Public Functions: Misc *\\n ***************************/\\n\\n function isAuthenticated(address _address) external view returns (bool);\\n\\n /***************************\\n * Public Functions: Setup *\\n ***************************/\\n\\n function owner() external view returns (address _owner);\\n function ovmExecutionManager() external view returns (address _ovmExecutionManager);\\n function setExecutionManager(address _ovmExecutionManager) external;\\n\\n\\n /************************************\\n * Public Functions: Account Access *\\n ************************************/\\n\\n function putAccount(address _address, Lib_OVMCodec.Account memory _account) external;\\n function putEmptyAccount(address _address) external;\\n function getAccount(address _address) external view returns (Lib_OVMCodec.Account memory _account);\\n function hasAccount(address _address) external view returns (bool _exists);\\n function hasEmptyAccount(address _address) external view returns (bool _exists);\\n function setAccountNonce(address _address, uint256 _nonce) external;\\n function getAccountNonce(address _address) external view returns (uint256 _nonce);\\n function getAccountEthAddress(address _address) external view returns (address _ethAddress);\\n function getAccountStorageRoot(address _address) external view returns (bytes32 _storageRoot);\\n function initPendingAccount(address _address) external;\\n function commitPendingAccount(address _address, address _ethAddress, bytes32 _codeHash) external;\\n function testAndSetAccountLoaded(address _address) external returns (bool _wasAccountAlreadyLoaded);\\n function testAndSetAccountChanged(address _address) external returns (bool _wasAccountAlreadyChanged);\\n function commitAccount(address _address) external returns (bool _wasAccountCommitted);\\n function incrementTotalUncommittedAccounts() external;\\n function getTotalUncommittedAccounts() external view returns (uint256 _total);\\n function wasAccountChanged(address _address) external view returns (bool);\\n function wasAccountCommitted(address _address) external view returns (bool);\\n\\n\\n /************************************\\n * Public Functions: Storage Access *\\n ************************************/\\n\\n function putContractStorage(address _contract, bytes32 _key, bytes32 _value) external;\\n function getContractStorage(address _contract, bytes32 _key) external view returns (bytes32 _value);\\n function hasContractStorage(address _contract, bytes32 _key) external view returns (bool _exists);\\n function testAndSetContractStorageLoaded(address _contract, bytes32 _key) external returns (bool _wasContractStorageAlreadyLoaded);\\n function testAndSetContractStorageChanged(address _contract, bytes32 _key) external returns (bool _wasContractStorageAlreadyChanged);\\n function commitContractStorage(address _contract, bytes32 _key) external returns (bool _wasContractStorageCommitted);\\n function incrementTotalUncommittedContractStorage() external;\\n function getTotalUncommittedContractStorage() external view returns (uint256 _total);\\n function wasContractStorageChanged(address _contract, bytes32 _key) external view returns (bool);\\n function wasContractStorageCommitted(address _contract, bytes32 _key) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x7a11dbd1f61593ba34debe07e39eef59967307f7f372ba9855bee0953585d08d\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/predeploys/iOVM_DeployerWhitelist.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title iOVM_DeployerWhitelist\\n */\\ninterface iOVM_DeployerWhitelist {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function initialize(address _owner, bool _allowArbitraryDeployment) external;\\n function owner() external returns (address _owner);\\n function setWhitelistedDeployer(address _deployer, bool _isWhitelisted) external;\\n function setOwner(address _newOwner) external;\\n function setAllowArbitraryDeployment(bool _allowArbitraryDeployment) external;\\n function enableArbitraryContractDeployment() external;\\n function isDeployerAllowed(address _deployer) external returns (bool _allowed);\\n}\\n\",\"keccak256\":\"0xdf1f27faf0d26d416bf6d408d146a16de32b4e1772a292c65d39eb7ec2b53ceb\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/codec/Lib_OVMCodec.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../utils/Lib_Bytes32Utils.sol\\\";\\n\\n/**\\n * @title Lib_OVMCodec\\n */\\nlibrary Lib_OVMCodec {\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum QueueOrigin {\\n SEQUENCER_QUEUE,\\n L1TOL2_QUEUE\\n }\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Account {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n address ethAddress;\\n bool isFresh;\\n }\\n\\n struct EVMAccount {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n }\\n\\n struct ChainBatchHeader {\\n uint256 batchIndex;\\n bytes32 batchRoot;\\n uint256 batchSize;\\n uint256 prevTotalElements;\\n bytes extraData;\\n }\\n\\n struct ChainInclusionProof {\\n uint256 index;\\n bytes32[] siblings;\\n }\\n\\n struct Transaction {\\n uint256 timestamp;\\n uint256 blockNumber;\\n QueueOrigin l1QueueOrigin;\\n address l1TxOrigin;\\n address entrypoint;\\n uint256 gasLimit;\\n bytes data;\\n }\\n\\n struct TransactionChainElement {\\n bool isSequenced;\\n uint256 queueIndex; // QUEUED TX ONLY\\n uint256 timestamp; // SEQUENCER TX ONLY\\n uint256 blockNumber; // SEQUENCER TX ONLY\\n bytes txData; // SEQUENCER TX ONLY\\n }\\n\\n struct QueueElement {\\n bytes32 transactionHash;\\n uint40 timestamp;\\n uint40 blockNumber;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Encodes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Encoded transaction bytes.\\n */\\n function encodeTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return abi.encodePacked(\\n _transaction.timestamp,\\n _transaction.blockNumber,\\n _transaction.l1QueueOrigin,\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n );\\n }\\n\\n /**\\n * Hashes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Hashed transaction\\n */\\n function hashTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(encodeTransaction(_transaction));\\n }\\n\\n /**\\n * Converts an OVM account to an EVM account.\\n * @param _in OVM account to convert.\\n * @return Converted EVM account.\\n */\\n function toEVMAccount(\\n Account memory _in\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n return EVMAccount({\\n nonce: _in.nonce,\\n balance: _in.balance,\\n storageRoot: _in.storageRoot,\\n codeHash: _in.codeHash\\n });\\n }\\n\\n /**\\n * @notice RLP-encodes an account state struct.\\n * @param _account Account state struct.\\n * @return RLP-encoded account state.\\n */\\n function encodeEVMAccount(\\n EVMAccount memory _account\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes[] memory raw = new bytes[](4);\\n\\n // Unfortunately we can't create this array outright because\\n // Lib_RLPWriter.writeList will reject fixed-size arrays. Assigning\\n // index-by-index circumvents this issue.\\n raw[0] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.nonce)\\n )\\n );\\n raw[1] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.balance)\\n )\\n );\\n raw[2] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.storageRoot));\\n raw[3] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.codeHash));\\n\\n return Lib_RLPWriter.writeList(raw);\\n }\\n\\n /**\\n * @notice Decodes an RLP-encoded account state into a useful struct.\\n * @param _encoded RLP-encoded account state.\\n * @return Account state struct.\\n */\\n function decodeEVMAccount(\\n bytes memory _encoded\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\\n\\n return EVMAccount({\\n nonce: Lib_RLPReader.readUint256(accountState[0]),\\n balance: Lib_RLPReader.readUint256(accountState[1]),\\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\\n });\\n }\\n\\n /**\\n * Calculates a hash for a given batch header.\\n * @param _batchHeader Header to hash.\\n * @return Hash of the header.\\n */\\n function hashBatchHeader(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(\\n abi.encode(\\n _batchHeader.batchRoot,\\n _batchHeader.batchSize,\\n _batchHeader.prevTotalElements,\\n _batchHeader.extraData\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0xd85ba2066057a2677926f484b938c7c2ef33ff3853f3b71cda252f4a54f30e05\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n public\\n onlyOwner\\n {\\n addresses[_getNameHash(_name)] = _address;\\n\\n emit AddressSet(\\n _name,\\n _address\\n );\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0x2ce671a0e004df88b136bea5a3c59d0732cea8887c8496da1d509e0200b03d7d\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(\\n address _libAddressManager\\n ) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x65981feeabff6a81783ea97d44baf988a18a86c8cb374c46fdb71819cbacc7c0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPReader.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_RLPReader\\n * @dev Adapted from \\\"RLPReader\\\" by Hamdi Allam (hamdi.allam97@gmail.com).\\n */\\nlibrary Lib_RLPReader {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 constant internal MAX_LIST_LENGTH = 32;\\n\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum RLPItemType {\\n DATA_ITEM,\\n LIST_ITEM\\n }\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct RLPItem {\\n uint256 length;\\n uint256 ptr;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts bytes to a reference to memory position and length.\\n * @param _in Input bytes to convert.\\n * @return Output memory reference.\\n */\\n function toRLPItem(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem memory\\n )\\n {\\n uint256 ptr;\\n assembly {\\n ptr := add(_in, 32)\\n }\\n\\n return RLPItem({\\n length: _in.length,\\n ptr: ptr\\n });\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n (\\n uint256 listOffset,\\n ,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.LIST_ITEM,\\n \\\"Invalid RLP list value.\\\"\\n );\\n\\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\\n // writing to the length. Since we can't know the number of RLP items without looping over\\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\\n // simply set a reasonable maximum list length and decrease the size before we finish.\\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\\n\\n uint256 itemCount = 0;\\n uint256 offset = listOffset;\\n while (offset < _in.length) {\\n require(\\n itemCount < MAX_LIST_LENGTH,\\n \\\"Provided RLP list exceeds max list length.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n ) = _decodeLength(RLPItem({\\n length: _in.length - offset,\\n ptr: _in.ptr + offset\\n }));\\n\\n out[itemCount] = RLPItem({\\n length: itemLength + itemOffset,\\n ptr: _in.ptr + offset\\n });\\n\\n itemCount += 1;\\n offset += itemOffset + itemLength;\\n }\\n\\n // Decrease the array size to match the actual item count.\\n assembly {\\n mstore(out, itemCount)\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n return readList(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes value.\\\"\\n );\\n\\n return _copy(_in.ptr, itemOffset, itemLength);\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return readBytes(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return string(readBytes(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return readString(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n require(\\n _in.length <= 33,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr + itemOffset;\\n bytes32 out;\\n assembly {\\n out := mload(ptr)\\n\\n // Shift the bytes over to match the item size.\\n if lt(itemLength, 32) {\\n out := div(out, exp(256, sub(32, itemLength)))\\n }\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return readBytes32(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return uint256(readBytes32(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return readUint256(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n require(\\n _in.length == 1,\\n \\\"Invalid RLP boolean value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 out;\\n assembly {\\n out := byte(0, mload(ptr))\\n }\\n\\n require(\\n out == 0 || out == 1,\\n \\\"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\\\"\\n );\\n\\n return out != 0;\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return readBool(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n if (_in.length == 1) {\\n return address(0);\\n }\\n\\n require(\\n _in.length == 21,\\n \\\"Invalid RLP address value.\\\"\\n );\\n\\n return address(readUint256(_in));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return readAddress(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads the raw bytes of an RLP item.\\n * @param _in RLP item to read.\\n * @return Raw RLP bytes.\\n */\\n function readRawBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in);\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Decodes the length of an RLP item.\\n * @param _in RLP item to decode.\\n * @return Offset of the encoded data.\\n * @return Length of the encoded data.\\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\\n */\\n function _decodeLength(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n uint256,\\n uint256,\\n RLPItemType\\n )\\n {\\n require(\\n _in.length > 0,\\n \\\"RLP item cannot be null.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 prefix;\\n assembly {\\n prefix := byte(0, mload(ptr))\\n }\\n\\n if (prefix <= 0x7f) {\\n // Single byte.\\n\\n return (0, 1, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xb7) {\\n // Short string.\\n\\n uint256 strLen = prefix - 0x80;\\n\\n require(\\n _in.length > strLen,\\n \\\"Invalid RLP short string.\\\"\\n );\\n\\n return (1, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xbf) {\\n // Long string.\\n uint256 lenOfStrLen = prefix - 0xb7;\\n\\n require(\\n _in.length > lenOfStrLen,\\n \\\"Invalid RLP long string length.\\\"\\n );\\n\\n uint256 strLen;\\n assembly {\\n // Pick out the string length.\\n strLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfStrLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfStrLen + strLen,\\n \\\"Invalid RLP long string.\\\"\\n );\\n\\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xf7) {\\n // Short list.\\n uint256 listLen = prefix - 0xc0;\\n\\n require(\\n _in.length > listLen,\\n \\\"Invalid RLP short list.\\\"\\n );\\n\\n return (1, listLen, RLPItemType.LIST_ITEM);\\n } else {\\n // Long list.\\n uint256 lenOfListLen = prefix - 0xf7;\\n\\n require(\\n _in.length > lenOfListLen,\\n \\\"Invalid RLP long list length.\\\"\\n );\\n\\n uint256 listLen;\\n assembly {\\n // Pick out the list length.\\n listLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfListLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfListLen + listLen,\\n \\\"Invalid RLP long list.\\\"\\n );\\n\\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\\n }\\n }\\n\\n /**\\n * Copies the bytes from a memory location.\\n * @param _src Pointer to the location to read from.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Copied bytes.\\n */\\n function _copy(\\n uint256 _src,\\n uint256 _offset,\\n uint256 _length\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out = new bytes(_length);\\n if (out.length == 0) {\\n return out;\\n }\\n\\n uint256 src = _src + _offset;\\n uint256 dest;\\n assembly {\\n dest := add(out, 32)\\n }\\n\\n // Copy over as many complete words as we can.\\n for (uint256 i = 0; i < _length / 32; i++) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n\\n src += 32;\\n dest += 32;\\n }\\n\\n // Pick out the remaining bytes.\\n uint256 mask = 256 ** (32 - (_length % 32)) - 1;\\n assembly {\\n mstore(\\n dest,\\n or(\\n and(mload(src), not(mask)),\\n and(mload(dest), mask)\\n )\\n )\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Copies an RLP item into bytes.\\n * @param _in RLP item to copy.\\n * @return Copied bytes.\\n */\\n function _copy(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in.ptr, 0, _in.length);\\n }\\n}\\n\",\"keccak256\":\"0x829174c61216dce35fdb888383b6022e0365eb7fbdc71ad79d98b108091969fe\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPWriter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/**\\n * @title Lib_RLPWriter\\n * @author Bakaoh (with modifications)\\n */\\nlibrary Lib_RLPWriter {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * RLP encodes a byte string.\\n * @param _in The byte string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded;\\n\\n if (_in.length == 1 && uint8(_in[0]) < 128) {\\n encoded = _in;\\n } else {\\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * RLP encodes a list of RLP encoded byte byte strings.\\n * @param _in The list of RLP encoded byte strings.\\n * @return The RLP encoded list of items in bytes.\\n */\\n function writeList(\\n bytes[] memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory list = _flatten(_in);\\n return abi.encodePacked(_writeLength(list.length, 192), list);\\n }\\n\\n /**\\n * RLP encodes a string.\\n * @param _in The string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeString(\\n string memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(bytes(_in));\\n }\\n\\n /**\\n * RLP encodes an address.\\n * @param _in The address to encode.\\n * @return The RLP encoded address in bytes.\\n */\\n function writeAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a bytes32 value.\\n * @param _in The bytes32 to encode.\\n * @return _out The RLP encoded bytes32 in bytes.\\n */\\n function writeBytes32(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a uint.\\n * @param _in The uint256 to encode.\\n * @return The RLP encoded uint256 in bytes.\\n */\\n function writeUint(\\n uint256 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(_toBinary(_in));\\n }\\n\\n /**\\n * RLP encodes a bool.\\n * @param _in The bool to encode.\\n * @return The RLP encoded bool in bytes.\\n */\\n function writeBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded = new bytes(1);\\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\\n return encoded;\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\\n * @param _len The length of the string or the payload.\\n * @param _offset 128 if item is string, 192 if item is list.\\n * @return RLP encoded bytes.\\n */\\n function _writeLength(\\n uint256 _len,\\n uint256 _offset\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded;\\n\\n if (_len < 56) {\\n encoded = new bytes(1);\\n encoded[0] = byte(uint8(_len) + uint8(_offset));\\n } else {\\n uint256 lenLen;\\n uint256 i = 1;\\n while (_len / i != 0) {\\n lenLen++;\\n i *= 256;\\n }\\n\\n encoded = new bytes(lenLen + 1);\\n encoded[0] = byte(uint8(lenLen) + uint8(_offset) + 55);\\n for(i = 1; i <= lenLen; i++) {\\n encoded[i] = byte(uint8((_len / (256**(lenLen-i))) % 256));\\n }\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * Encode integer in big endian binary form with no leading zeroes.\\n * @notice TODO: This should be optimized with assembly to save gas costs.\\n * @param _x The integer to encode.\\n * @return RLP encoded bytes.\\n */\\n function _toBinary(\\n uint256 _x\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory b = abi.encodePacked(_x);\\n\\n uint256 i = 0;\\n for (; i < 32; i++) {\\n if (b[i] != 0) {\\n break;\\n }\\n }\\n\\n bytes memory res = new bytes(32 - i);\\n for (uint256 j = 0; j < res.length; j++) {\\n res[j] = b[i++];\\n }\\n\\n return res;\\n }\\n\\n /**\\n * Copies a piece of memory to another location.\\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\\n * @param _dest Destination location.\\n * @param _src Source location.\\n * @param _len Length of memory to copy.\\n */\\n function _memcpy(\\n uint256 _dest,\\n uint256 _src,\\n uint256 _len\\n )\\n private\\n pure\\n {\\n uint256 dest = _dest;\\n uint256 src = _src;\\n uint256 len = _len;\\n\\n for(; len >= 32; len -= 32) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n dest += 32;\\n src += 32;\\n }\\n\\n uint256 mask = 256 ** (32 - len) - 1;\\n assembly {\\n let srcpart := and(mload(src), not(mask))\\n let destpart := and(mload(dest), mask)\\n mstore(dest, or(destpart, srcpart))\\n }\\n }\\n\\n /**\\n * Flattens a list of byte strings into one byte string.\\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\\n * @param _list List of byte strings to flatten.\\n * @return The flattened byte string.\\n */\\n function _flatten(\\n bytes[] memory _list\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n if (_list.length == 0) {\\n return new bytes(0);\\n }\\n\\n uint256 len;\\n uint256 i = 0;\\n for (; i < _list.length; i++) {\\n len += _list[i].length;\\n }\\n\\n bytes memory flattened = new bytes(len);\\n uint256 flattenedPtr;\\n assembly { flattenedPtr := add(flattened, 0x20) }\\n\\n for(i = 0; i < _list.length; i++) {\\n bytes memory item = _list[i];\\n\\n uint256 listPtr;\\n assembly { listPtr := add(item, 0x20)}\\n\\n _memcpy(flattenedPtr, listPtr, item.length);\\n flattenedPtr += _list[i].length;\\n }\\n\\n return flattened;\\n }\\n}\\n\",\"keccak256\":\"0xb60ee4b03ad372c3deff21d454ab714dd0c18ee3e6f9d45532e209fc59d5a54d\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_Bytes32Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_Byte32Utils\\n */\\nlibrary Lib_Bytes32Utils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \\\"true.\\\"\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as a boolean.\\n */\\n function toBool(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return _in != 0;\\n }\\n\\n /**\\n * Converts a boolean to a bytes32 value.\\n * @param _in Input boolean value.\\n * @return Boolean as a bytes32.\\n */\\n function fromBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in ? 1 : 0));\\n }\\n\\n /**\\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as an address.\\n */\\n function toAddress(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return address(uint160(uint256(_in)));\\n }\\n\\n /**\\n * Converts an address to a bytes32.\\n * @param _in Input address value.\\n * @return Address as a bytes32.\\n */\\n function fromAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in));\\n }\\n\\n /**\\n * Removes the leading zeros from a bytes32 value and returns a new (smaller) bytes value.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 without any leading zeros.\\n */\\n function removeLeadingZeros(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out;\\n\\n assembly {\\n // Figure out how many leading zero bytes to remove.\\n let shift := 0\\n for { let i := 0 } and(lt(i, 32), eq(byte(i, _in), 0)) { i := add(i, 1) } {\\n shift := add(shift, 1)\\n }\\n\\n // Reserve some space for our output and fix the free memory pointer.\\n out := mload(0x40)\\n mstore(0x40, add(out, 0x40))\\n\\n // Shift the value and store it into the output bytes.\\n mstore(add(out, 0x20), shl(mul(shift, 8), _in))\\n\\n // Store the new size (with leading zero bytes removed) in the output byte size.\\n mstore(out, sub(32, shift))\\n }\\n\\n return out;\\n }\\n}\\n\",\"keccak256\":\"0xfa2def593e3fc56a31852c3744aefdaa93cec74e721bfcfeb1e5d166c7c60b64\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_BytesUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_BytesUtils\\n */\\nlibrary Lib_BytesUtils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_start + _length >= _start, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n if (_bytes.length - _start == 0) {\\n return bytes('');\\n }\\n\\n return slice(_bytes, _start, _bytes.length - _start);\\n }\\n\\n function toBytes32PadLeft(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n bytes32 ret;\\n uint256 len = _bytes.length <= 32 ? _bytes.length : 32;\\n assembly {\\n ret := shr(mul(sub(32, len), 8), mload(add(_bytes, 32)))\\n }\\n return ret;\\n }\\n\\n function toBytes32(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n if (_bytes.length < 32) {\\n bytes32 ret;\\n assembly {\\n ret := mload(add(_bytes, 32))\\n }\\n return ret;\\n }\\n\\n return abi.decode(_bytes,(bytes32)); // will truncate if input length > 32 bytes\\n }\\n\\n function toUint256(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return uint256(toBytes32(_bytes));\\n }\\n\\n function toUint24(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n uint24\\n )\\n {\\n require(_start + 3 >= _start, \\\"toUint24_overflow\\\");\\n require(_bytes.length >= _start + 3 , \\\"toUint24_outOfBounds\\\");\\n uint24 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x3), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toUint8(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n uint8\\n )\\n {\\n require(_start + 1 >= _start, \\\"toUint8_overflow\\\");\\n require(_bytes.length >= _start + 1 , \\\"toUint8_outOfBounds\\\");\\n uint8 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x1), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toAddress(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n require(_start + 20 >= _start, \\\"toAddress_overflow\\\");\\n require(_bytes.length >= _start + 20, \\\"toAddress_outOfBounds\\\");\\n address tempAddress;\\n\\n assembly {\\n tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000)\\n }\\n\\n return tempAddress;\\n }\\n\\n function toNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory nibbles = new bytes(_bytes.length * 2);\\n\\n for (uint256 i = 0; i < _bytes.length; i++) {\\n nibbles[i * 2] = _bytes[i] >> 4;\\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\\n }\\n\\n return nibbles;\\n }\\n\\n function fromNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory ret = new bytes(_bytes.length / 2);\\n\\n for (uint256 i = 0; i < ret.length; i++) {\\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\\n }\\n\\n return ret;\\n }\\n\\n function equal(\\n bytes memory _bytes,\\n bytes memory _other\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return keccak256(_bytes) == keccak256(_other);\\n }\\n}\\n\",\"keccak256\":\"0xa5195afe32fb2cf104d156e8f4bd39df1ec79bf6ba232097b9e8e0ee14fbc298\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_ErrorUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/**\\n * @title Lib_ErrorUtils\\n */\\nlibrary Lib_ErrorUtils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Encodes an error string into raw solidity-style revert data.\\n * (i.e. ascii bytes, prefixed with bytes4(keccak(\\\"Error(string))\\\"))\\n * Ref: https://docs.soliditylang.org/en/v0.8.2/control-structures.html?highlight=Error(string)#panic-via-assert-and-error-via-require\\n * @param _reason Reason for the reversion.\\n * @return Standard solidity revert data for the given reason.\\n */\\n function encodeRevertString(\\n string memory _reason\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return abi.encodeWithSignature(\\n \\\"Error(string)\\\",\\n _reason\\n );\\n }\\n}\\n\",\"keccak256\":\"0xfc64ec4a81fb50865b502a0004ed154e8598e1a313db77303fc95e41f536e6b7\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_EthUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// @unsupported: ovm\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"./Lib_Bytes32Utils.sol\\\";\\n\\n/**\\n * @title Lib_EthUtils\\n */\\nlibrary Lib_EthUtils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Gets the code for a given address.\\n * @param _address Address to get code for.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Code read from the contract.\\n */\\n function getCode(\\n address _address,\\n uint256 _offset,\\n uint256 _length\\n )\\n internal\\n view\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory code;\\n assembly {\\n code := mload(0x40)\\n mstore(0x40, add(code, add(_length, 0x20)))\\n mstore(code, _length)\\n extcodecopy(_address, add(code, 0x20), _offset, _length)\\n }\\n\\n return code;\\n }\\n\\n /**\\n * Gets the full code for a given address.\\n * @param _address Address to get code for.\\n * @return Full code of the contract.\\n */\\n function getCode(\\n address _address\\n )\\n internal\\n view\\n returns (\\n bytes memory\\n )\\n {\\n return getCode(\\n _address,\\n 0,\\n getCodeSize(_address)\\n );\\n }\\n\\n /**\\n * Gets the size of a contract's code in bytes.\\n * @param _address Address to get code size for.\\n * @return Size of the contract's code in bytes.\\n */\\n function getCodeSize(\\n address _address\\n )\\n internal\\n view\\n returns (\\n uint256\\n )\\n {\\n uint256 codeSize;\\n assembly {\\n codeSize := extcodesize(_address)\\n }\\n\\n return codeSize;\\n }\\n\\n /**\\n * Gets the hash of a contract's code.\\n * @param _address Address to get a code hash for.\\n * @return Hash of the contract's code.\\n */\\n function getCodeHash(\\n address _address\\n )\\n internal\\n view\\n returns (\\n bytes32\\n )\\n {\\n bytes32 codeHash;\\n assembly {\\n codeHash := extcodehash(_address)\\n }\\n\\n return codeHash;\\n }\\n\\n /**\\n * Creates a contract with some given initialization code.\\n * @param _code Contract initialization code.\\n * @return Address of the created contract.\\n */\\n function createContract(\\n bytes memory _code\\n )\\n internal\\n returns (\\n address\\n )\\n {\\n address created;\\n assembly {\\n created := create(\\n 0,\\n add(_code, 0x20),\\n mload(_code)\\n )\\n }\\n\\n return created;\\n }\\n\\n /**\\n * Computes the address that would be generated by CREATE.\\n * @param _creator Address creating the contract.\\n * @param _nonce Creator's nonce.\\n * @return Address to be generated by CREATE.\\n */\\n function getAddressForCREATE(\\n address _creator,\\n uint256 _nonce\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n bytes[] memory encoded = new bytes[](2);\\n encoded[0] = Lib_RLPWriter.writeAddress(_creator);\\n encoded[1] = Lib_RLPWriter.writeUint(_nonce);\\n\\n bytes memory encodedList = Lib_RLPWriter.writeList(encoded);\\n return Lib_Bytes32Utils.toAddress(keccak256(encodedList));\\n }\\n\\n /**\\n * Computes the address that would be generated by CREATE2.\\n * @param _creator Address creating the contract.\\n * @param _bytecode Bytecode of the contract to be created.\\n * @param _salt 32 byte salt value mixed into the hash.\\n * @return Address to be generated by CREATE2.\\n */\\n function getAddressForCREATE2(\\n address _creator,\\n bytes memory _bytecode,\\n bytes32 _salt\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n bytes32 hashedData = keccak256(abi.encodePacked(\\n byte(0xff),\\n _creator,\\n _salt,\\n keccak256(_bytecode)\\n ));\\n\\n return Lib_Bytes32Utils.toAddress(hashedData);\\n }\\n}\\n\",\"keccak256\":\"0xf29a67d78e61cb472d524b779b32cfcb39a587f4096500d5419e6425ed367d49\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_MerkleTree.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_MerkleTree\\n * @author River Keefer\\n */\\nlibrary Lib_MerkleTree {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Calculates a merkle root for a list of 32-byte leaf hashes. WARNING: If the number\\n * of leaves passed in is not a power of two, it pads out the tree with zero hashes.\\n * If you do not know the original length of elements for the tree you are verifying,\\n * then this may allow empty leaves past _elements.length to pass a verification check down the line.\\n * Note that the _elements argument is modified, therefore it must not be used again afterwards\\n * @param _elements Array of hashes from which to generate a merkle root.\\n * @return Merkle root of the leaves, with zero hashes for non-powers-of-two (see above).\\n */\\n function getMerkleRoot(\\n bytes32[] memory _elements\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n require(\\n _elements.length > 0,\\n \\\"Lib_MerkleTree: Must provide at least one leaf hash.\\\"\\n );\\n\\n if (_elements.length == 1) {\\n return _elements[0];\\n }\\n\\n uint256[16] memory defaults = [\\n 0x290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563,\\n 0x633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d,\\n 0x890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d,\\n 0x3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd8,\\n 0xecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da,\\n 0xdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da5,\\n 0x617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d7,\\n 0x292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead,\\n 0xe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e10,\\n 0x7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f82,\\n 0xe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e83636516,\\n 0x3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c,\\n 0xad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e,\\n 0xa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab,\\n 0x4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c862,\\n 0x2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf10\\n ];\\n\\n // Reserve memory space for our hashes.\\n bytes memory buf = new bytes(64);\\n\\n // We'll need to keep track of left and right siblings.\\n bytes32 leftSibling;\\n bytes32 rightSibling;\\n\\n // Number of non-empty nodes at the current depth.\\n uint256 rowSize = _elements.length;\\n\\n // Current depth, counting from 0 at the leaves\\n uint256 depth = 0;\\n\\n // Common sub-expressions\\n uint256 halfRowSize; // rowSize / 2\\n bool rowSizeIsOdd; // rowSize % 2 == 1\\n\\n while (rowSize > 1) {\\n halfRowSize = rowSize / 2;\\n rowSizeIsOdd = rowSize % 2 == 1;\\n\\n for (uint256 i = 0; i < halfRowSize; i++) {\\n leftSibling = _elements[(2 * i) ];\\n rightSibling = _elements[(2 * i) + 1];\\n assembly {\\n mstore(add(buf, 32), leftSibling )\\n mstore(add(buf, 64), rightSibling)\\n }\\n\\n _elements[i] = keccak256(buf);\\n }\\n\\n if (rowSizeIsOdd) {\\n leftSibling = _elements[rowSize - 1];\\n rightSibling = bytes32(defaults[depth]);\\n assembly {\\n mstore(add(buf, 32), leftSibling)\\n mstore(add(buf, 64), rightSibling)\\n }\\n\\n _elements[halfRowSize] = keccak256(buf);\\n }\\n\\n rowSize = halfRowSize + (rowSizeIsOdd ? 1 : 0);\\n depth++;\\n }\\n\\n return _elements[0];\\n }\\n\\n /**\\n * Verifies a merkle branch for the given leaf hash. Assumes the original length\\n * of leaves generated is a known, correct input, and does not return true for indices\\n * extending past that index (even if _siblings would be otherwise valid.)\\n * @param _root The Merkle root to verify against.\\n * @param _leaf The leaf hash to verify inclusion of.\\n * @param _index The index in the tree of this leaf.\\n * @param _siblings Array of sibline nodes in the inclusion proof, starting from depth 0 (bottom of the tree).\\n * @param _totalLeaves The total number of leaves originally passed into.\\n * @return Whether or not the merkle branch and leaf passes verification.\\n */\\n function verify(\\n bytes32 _root,\\n bytes32 _leaf,\\n uint256 _index,\\n bytes32[] memory _siblings,\\n uint256 _totalLeaves\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n require(\\n _totalLeaves > 0,\\n \\\"Lib_MerkleTree: Total leaves must be greater than zero.\\\"\\n );\\n\\n require(\\n _index < _totalLeaves,\\n \\\"Lib_MerkleTree: Index out of bounds.\\\"\\n );\\n\\n require(\\n _siblings.length == _ceilLog2(_totalLeaves),\\n \\\"Lib_MerkleTree: Total siblings does not correctly correspond to total leaves.\\\"\\n );\\n\\n bytes32 computedRoot = _leaf;\\n\\n for (uint256 i = 0; i < _siblings.length; i++) {\\n if ((_index & 1) == 1) {\\n computedRoot = keccak256(\\n abi.encodePacked(\\n _siblings[i],\\n computedRoot\\n )\\n );\\n } else {\\n computedRoot = keccak256(\\n abi.encodePacked(\\n computedRoot,\\n _siblings[i]\\n )\\n );\\n }\\n\\n _index >>= 1;\\n }\\n\\n return _root == computedRoot;\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Calculates the integer ceiling of the log base 2 of an input.\\n * @param _in Unsigned input to calculate the log.\\n * @return ceil(log_base_2(_in))\\n */\\n function _ceilLog2(\\n uint256 _in\\n )\\n private\\n pure\\n returns (\\n uint256\\n )\\n {\\n require(\\n _in > 0,\\n \\\"Lib_MerkleTree: Cannot compute ceil(log_2) of 0.\\\"\\n );\\n\\n if (_in == 1) {\\n return 0;\\n }\\n\\n // Find the highest set bit (will be floor(log_2)).\\n // Borrowed with <3 from https://github.com/ethereum/solidity-examples\\n uint256 val = _in;\\n uint256 highest = 0;\\n for (uint256 i = 128; i >= 1; i >>= 1) {\\n if (val & (uint(1) << i) - 1 << i != 0) {\\n highest += i;\\n val >>= i;\\n }\\n }\\n\\n // Increment by one if this is not a perfect logarithm.\\n if ((uint(1) << highest) != _in) {\\n highest += 1;\\n }\\n\\n return highest;\\n }\\n}\\n\",\"keccak256\":\"0xa78edb9fbd34712771a1ebff05bc5e1abec7fc1e9a1bfb709d183099b44fa62a\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x60806040523480156200001157600080fd5b506040516200315338038062003153833981016040819052620000349162000067565b600080546001600160a01b0319166001600160a01b039590951694909417909355600191909155600255600355620000b2565b600080600080608085870312156200007d578384fd5b84516001600160a01b038116811462000094578485fd5b60208601516040870151606090970151919890975090945092505050565b61309180620000c26000396000f3fe608060405234801561001057600080fd5b50600436106101425760003560e01c8063876ed5cb116100b8578063cfdf677e1161007c578063cfdf677e1461023f578063d0f8934414610247578063e10d29ee1461024f578063e561dddc14610257578063f722b41a1461025f578063facdc5da1461026757610142565b8063876ed5cb146102175780638d38c6c11461021f578063b8f7700514610227578063c139eb151461022f578063c2cf696f1461023757610142565b80634de569ce1161010a5780634de569ce146101c25780635ae6256d146101e25780636fee07e0146101ea57806378f4b2f2146101ff5780637a167a8a146102075780637aa63a861461020f57610142565b8063138387a414610147578063299ca478146101655780632a7f18be1461017a578063378997701461019a578063461a4478146101af575b600080fd5b61014f61027a565b60405161015c91906124c7565b60405180910390f35b61016d610280565b60405161015c91906123eb565b61018d610188366004612388565b61028f565b60405161015c9190612e4e565b6101a26102b0565b60405161015c9190612e8d565b61016d6101bd36600461221b565b6102c4565b6101d56101d0366004612261565b6103a0565b60405161015c9190612484565b6101a26103da565b6101fd6101f8366004612188565b6103ee565b005b61014f61066d565b6101a2610674565b61014f610689565b61014f6106a4565b61014f6106aa565b6101a26106b0565b61014f6106c7565b61014f6106cd565b61016d6106d2565b6101fd6106f5565b61016d610b69565b61014f610b8c565b6101a2610c06565b6101fd610275366004612388565b610c1e565b60025481565b6000546001600160a01b031681565b610297611ed9565b6102a8826102a3610b69565b610c36565b90505b919050565b6000806102bb610d76565b50935050505090565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b8381101561032457818101518382015260200161030c565b50505050905090810190601f1680156103515780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561036e57600080fd5b505afa158015610382573d6000803e3d6000fd5b505050506040513d602081101561039857600080fd5b505192915050565b82516000901515600114156103c2576103bb85858585610e24565b90506103d2565b6103bb8585602001518585610fef565b949350505050565b6000806103e5610d76565b94505050505090565b61c3508151111561041a5760405162461bcd60e51b81526004016104119061259b565b60405180910390fd5b60035482111561043c5760405162461bcd60e51b8152600401610411906127a1565b620186a082101561045f5760405162461bcd60e51b815260040161041190612983565b6020820460005a90508181116104875760405162461bcd60e51b815260040161041190612b8a565b60005b825a8303101561049c5760010161048a565b6000338787876040516020016104b594939291906123ff565b60408051601f19818403018152919052805160209091012090504360281b421760006104df610b69565b60405163b298e36b60e01b81529091506001600160a01b0382169063b298e36b9061050e9086906004016124c7565b600060405180830381600087803b15801561052857600080fd5b505af115801561053c573d6000803e3d6000fd5b505060405163b298e36b60e01b81526001600160a01b038416925063b298e36b915061056c9085906004016124c7565b600060405180830381600087803b15801561058657600080fd5b505af115801561059a573d6000803e3d6000fd5b50505050600060016002836001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b1580156105dd57600080fd5b505afa1580156105f1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106159190612203565b8161061c57fe5b040390507f4b388aecf9fa6cc92253704e5975a6129a4f735bdbd99567df4ed0094ee4ceb5338b8b8b85426040516106599695949392919061243c565b60405180910390a150505050505050505050565b620186a081565b60008061067f610d76565b5090935050505090565b600080610694610d76565b50505064ffffffffff1692915050565b61c35081565b60035481565b60006106c26106bd610b69565b6110c4565b905090565b60015481565b602081565b60006106c2604051806060016040528060258152602001613003602591396102c4565b60043560d81c60093560e890811c90600c35901c610711610689565b8364ffffffffff16146107365760405162461bcd60e51b815260040161041190612a35565b6107646040518060400160405280600d81526020016c27ab26afa9b2b8bab2b731b2b960991b8152506102c4565b6001600160a01b0316336001600160a01b0316146107945760405162461bcd60e51b815260040161041190612a92565b60008162ffffff16116107b95760405162461bcd60e51b8152600401610411906127fe565b60008262ffffff16116107de5760405162461bcd60e51b815260040161041190612cdf565b600f601062ffffff8316020164ffffffffff81163610156108115760405162461bcd60e51b815260040161041190612d66565b600061081b610b69565b90506000610828826110c4565b9050600062ffffff8616368161083a57fe5b0460020267ffffffffffffffff8111801561085457600080fd5b506040519080825280601f01601f19166020018201604052801561087f576020820181803683370190505b50905060008662ffffff1667ffffffffffffffff811180156108a057600080fd5b506040519080825280602002602001820160405280156108ca578160200160208202803683370190505b50905060008060006108da610674565b90506108e4611ef9565b60005b8a62ffffff168163ffffffff161015610a3b57600061090b8263ffffffff16611147565b905063ffffffff82166109215761092181611197565b61092d8382868d611264565b80925060005b835163ffffffff821610156109b1578b3560e81c61c3508111156109695760405162461bcd60e51b81526004016104119061259b565b61097c858e64ffffffffff16838d6112cf565b898963ffffffff168151811061098e57fe5b60209081029190910101529b909b016003019a6001968701969586019501610933565b5060005b83602001518163ffffffff161015610a31578964ffffffffff168564ffffffffff16106109f45760405162461bcd60e51b815260040161041190612da8565b610a048564ffffffffff16611363565b888863ffffffff1681518110610a1657fe5b602090810291909101015260019687019694850194016109b5565b50506001016108e7565b50610a488183898b6113a8565b3664ffffffffff8a1614610a6e5760405162461bcd60e51b815260040161041190612846565b8a62ffffff168463ffffffff1614610a985760405162461bcd60e51b815260040161041190612894565b6000838c62ffffff160363ffffffff169050600080836020015160001415610acb57505060408201516060830151610af3565b6000610ae16001870364ffffffffff168d610c36565b90508060200151925080604001519150505b610b14610aff8961141b565b8f62ffffff168564ffffffffff16858561184f565b7f602f1aeac0ca2e7a13e281a9ef0ad7838542712ce16780fa2ecffd351f05f89983860384610b41610689565b604051610b5093929190612e9f565b60405180910390a1505050505050505050505050505050565b60006106c2604051806060016040528060238152602001612ee6602391396102c4565b6000610b966106d2565b6001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b158015610bce57600080fd5b505afa158015610be2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106c29190612203565b6000610c10610674565b610c186106b0565b03905090565b60405162461bcd60e51b81526004016104119061250b565b610c3e611ed9565b604051634a83e9cd60e11b815260028402906000906001600160a01b03851690639507d39a90610c72908590600401612e8d565b60206040518083038186803b158015610c8a57600080fd5b505afa158015610c9e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cc29190612203565b90506000846001600160a01b0316639507d39a846001016040518263ffffffff1660e01b8152600401610cf59190612e8d565b60206040518083038186803b158015610d0d57600080fd5b505afa158015610d21573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d459190612203565b6040805160608101825293845264ffffffffff828116602086015260289290921c9091169083015250949350505050565b6000806000806000610d866106d2565b6001600160a01b031663ccf8f9696040518163ffffffff1660e01b815260040160206040518083038186803b158015610dbe57600080fd5b505afa158015610dd2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610df691906121dd565b64ffffffffff602882901c811697605083901c82169750607883901c8216965060a09290921c169350915050565b600080610e5c6040518060400160405280601481526020017327ab26afa2bc32b1baba34b7b726b0b730b3b2b960611b8152506102c4565b90506000816001600160a01b0316631c4712a76040518163ffffffff1660e01b815260040160206040518083038186803b158015610e9957600080fd5b505afa158015610ead573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ed19190612203565b90506000610ede87611a02565b9050610eeb818787611a9b565b610f075760405162461bcd60e51b8152600401610411906126ca565b86606001518860200151148015610f22575060408701518851145b8015610f635750610f4a604051806060016040528060228152602001612f09602291396102c4565b6001600160a01b031688608001516001600160a01b0316145b8015610f725750818860a00151145b8015610f89575060608801516001600160a01b0316155b8015610fa45750600088604001516001811115610fa257fe5b145b8015610fc557508660800151805190602001208860c0015180519060200120145b610fe15760405162461bcd60e51b81526004016104119061276a565b506001979650505050505050565b600080610ffb85611363565b9050611008818585611a9b565b6110245760405162461bcd60e51b815260040161041190612c2a565b6000866060015187608001518860a001518960c0015160405160200161104d94939291906123ff565b60405160208183030381529060405280519060200120905060006110708761028f565b80519091508214801561108e57508751602082015164ffffffffff16145b80156110a857508760200151816040015164ffffffffff16145b610fe15760405162461bcd60e51b815260040161041190612adf565b60006002826001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b15801561110157600080fd5b505afa158015611115573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111399190612203565b8161114057fe5b0492915050565b61114f611ef9565b5060408051608081018252601092909202600f81013560e890811c84526012820135901c6020840152601581013560d890811c92840192909252601a0135901c606082015290565b60006111a1610689565b1115611211576000806111b2610d76565b9350935050508064ffffffffff16836060015110156111e35760405162461bcd60e51b815260040161041190612718565b8164ffffffffff168360400151101561120e5760405162461bcd60e51b8152600401610411906125f8565b50505b4260015482604001510110156112395760405162461bcd60e51b815260040161041190612d20565b4360025482606001510110156112615760405162461bcd60e51b815260040161041190612552565b50565b83604001518360400151101561128c5760405162461bcd60e51b815260040161041190612bd5565b8360600151836060015110156112b45760405162461bcd60e51b815260040161041190612df1565b6020830151156112c9576112c9838383611b8c565b50505050565b60008151836041011115611326578260410167ffffffffffffffff811180156112f757600080fd5b506040519080825280601f01601f191660200182016040528015611322576020820181803683370190505b5091505b6040850151606086015160006020850160018153836001820152826021820152866003890160418301376041870190209350505050949350505050565b60006102a86040518060a00160405280600015158152602001848152602001600081526020016000815260200160405180602001604052806000815250815250611c2d565b600083830364ffffffffff161180156113c357506020840151155b156113d3576113d3848483611b8c565b42846040015111156113f75760405162461bcd60e51b815260040161041190612b45565b43846060015111156112c95760405162461bcd60e51b815260040161041190612904565b60008082511161145c5760405162461bcd60e51b81526004018080602001828103825260348152602001806130286034913960400191505060405180910390fd5b815160011415611482578160008151811061147357fe5b602002602001015190506102ab565b60408051610200810182527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56381527f633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d60208201527f890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d818301527f3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd86060808301919091527fecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da60808301527fdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da560a08301527f617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d760c08301527f292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead60e08301527fe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e106101008301527f7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f826101208301527fe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e836365166101408301527f3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c6101608301527fad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e6101808301527fa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab6101a08301527f4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c8626101c08301527f2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf106101e083015282518381529081018352909160009190602082018180368337505085519192506000918291508180805b600184111561182b5750506002820460018084161460005b828110156117a7578a816002028151811061174e57fe5b602002602001015196508a816002026001018151811061176a57fe5b6020026020010151955086602089015285604089015287805190602001208b828151811061179457fe5b6020908102919091010152600101611737565b50801561180a578960018503815181106117bd57fe5b602002602001015195508783601081106117d357fe5b602002015160001b945085602088015284604088015286805190602001208a83815181106117fd57fe5b6020026020010181815250505b80611816576000611819565b60015b60ff168201935060019092019161171f565b8960008151811061183857fe5b602002602001015198505050505050505050919050565b60006118596106d2565b9050600080611866610d76565b50509150915060006040518060a00160405280856001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b1580156118b257600080fd5b505afa1580156118c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118ea9190612203565b81526020018a81526020018981526020018464ffffffffff16815260200160405180602001604052806000815250815250905080600001517f127186556e7be68c7e31263195225b4de02820707889540969f62c05cf73525e826020015183604001518460600151856080015160405161196794939291906124e6565b60405180910390a2600061197a82611c75565b90506000611992836040015186018a86018a8a611c9e565b60405163080549db60e21b81529091506001600160a01b03871690632015276c906119c390859085906004016124d0565b600060405180830381600087803b1580156119dd57600080fd5b505af11580156119f1573d6000803e3d6000fd5b505050505050505050505050505050565b6080810151805160009190826041820167ffffffffffffffff81118015611a2857600080fd5b506040519080825280601f01601f191660200182016040528015611a53576020820181803683370190505b5060408601516060870151919250906000602084016001815383600182015282602182015285604182018760208a0160045afa50604190950190942095505050505050919050565b6000611aa56106d2565b8351604051634a83e9cd60e11b81526001600160a01b039290921691639507d39a91611ad391600401612e7c565b60206040518083038186803b158015611aeb57600080fd5b505afa158015611aff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b239190612203565b611b2c84611c75565b14611b495760405162461bcd60e51b815260040161041190612b16565b611b66836020015185846000015185602001518760400151611cbd565b611b825760405162461bcd60e51b81526004016104119061294c565b5060019392505050565b6000611b9f8364ffffffffff1683610c36565b9050600154816020015164ffffffffff16014210611bcf5760405162461bcd60e51b815260040161041190612647565b806020015164ffffffffff1684604001511115611bfe5760405162461bcd60e51b8152600401610411906129cc565b806040015164ffffffffff16846060015111156112c95760405162461bcd60e51b815260040161041190612c74565b8051602080830151604080850151606086015160808701519251600096611c5896909594910161248f565b604051602081830303815290604052805190602001209050919050565b60008160200151826040015183606001518460800151604051602001611c5894939291906124e6565b602892831b9390931760509190911b1760789290921b91909117901b90565b6000808211611cfd5760405162461bcd60e51b8152600401808060200182810382526037815260200180612f7f6037913960400191505060405180910390fd5b818410611d3b5760405162461bcd60e51b8152600401808060200182810382526024815260200180612f2b6024913960400191505060405180910390fd5b611d4482611e42565b835114611d825760405162461bcd60e51b815260040180806020018281038252604d815260200180612fb6604d913960600191505060405180910390fd5b8460005b8451811015611e35578560011660011415611de457848181518110611da757fe5b6020026020010151826040516020018083815260200182815260200192505050604051602081830303815290604052805190602001209150611e29565b81858281518110611df157fe5b602002602001015160405160200180838152602001828152602001925050506040516020818303038152906040528051906020012091505b600195861c9501611d86565b5090951495945050505050565b6000808211611e825760405162461bcd60e51b8152600401808060200182810382526030815260200180612f4f6030913960400191505060405180910390fd5b8160011415611e93575060006102ab565b81600060805b60018110611ec3576000196001821b01811b831615611ebb5791821c91908101905b60011c611e99565b506001811b8414611ed2576001015b9392505050565b604080516060810182526000808252602082018190529181019190915290565b6040518060800160405280600081526020016000815260200160008152602001600081525090565b600067ffffffffffffffff831115611f3557fe5b611f48601f8401601f1916602001612ec1565b9050828152838383011115611f5c57600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b03811681146102ab57600080fd5b600082601f830112611f9a578081fd5b611ed283833560208501611f21565b8035600281106102ab57600080fd5b600060a08284031215611fc9578081fd5b60405160a0810167ffffffffffffffff8282108183111715611fe757fe5b8160405282935084358352602085013560208401526040850135604084015260608501356060840152608085013591508082111561202457600080fd5b5061203185828601611f8a565b6080830152505092915050565b60006040828403121561204f578081fd5b6040516040810167ffffffffffffffff828210818311171561206d57fe5b816040528293508435835260209150818501358181111561208d57600080fd5b8501601f8101871361209e57600080fd5b8035828111156120aa57fe5b83810292506120ba848401612ec1565b8181528481019083860185850187018b10156120d557600080fd5b600095505b838610156120f85780358352600195909501949186019186016120da565b5080868801525050505050505092915050565b600060a0828403121561211c578081fd5b60405160a0810167ffffffffffffffff828210818311171561213a57fe5b8160405282935084359150811515821461215357600080fd5b818352602085013560208401526040850135604084015260608501356060840152608085013591508082111561202457600080fd5b60008060006060848603121561219c578283fd5b6121a584611f73565b925060208401359150604084013567ffffffffffffffff8111156121c7578182fd5b6121d386828701611f8a565b9150509250925092565b6000602082840312156121ee578081fd5b815164ffffffffff1981168114611ed2578182fd5b600060208284031215612214578081fd5b5051919050565b60006020828403121561222c578081fd5b813567ffffffffffffffff811115612242578182fd5b8201601f81018413612252578182fd5b6103d284823560208401611f21565b60008060008060808587031215612276578081fd5b843567ffffffffffffffff8082111561228d578283fd5b9086019060e082890312156122a0578283fd5b6122aa60e0612ec1565b82358152602083013560208201526122c460408401611fa9565b60408201526122d560608401611f73565b60608201526122e660808401611f73565b608082015260a083013560a082015260c083013582811115612306578485fd5b6123128a828601611f8a565b60c0830152509550602087013591508082111561232d578283fd5b6123398883890161210b565b9450604087013591508082111561234e578283fd5b61235a88838901611fb8565b9350606087013591508082111561236f578283fd5b5061237c8782880161203e565b91505092959194509250565b600060208284031215612399578081fd5b5035919050565b60008151808452815b818110156123c5576020818501810151868301820152016123a9565b818111156123d65782602083870101525b50601f01601f19169290920160200192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612432908301846123a0565b9695505050505050565b6001600160a01b038781168252861660208201526040810185905260c06060820181905260009061246f908301866123a0565b60808301949094525060a00152949350505050565b901515815260200190565b6000861515825285602083015284604083015283606083015260a060808301526124bc60a08301846123a0565b979650505050505050565b90815260200190565b91825264ffffffffff1916602082015260400190565b60008582528460208301528360408301526080606083015261243260808301846123a0565b60208082526027908201527f617070656e64517565756542617463682069732063757272656e746c7920646960408201526639b0b13632b21760c91b606082015260800190565b60208082526029908201527f436f6e7465787420626c6f636b206e756d62657220746f6f2066617220696e206040820152683a3432903830b9ba1760b91b606082015260800190565b6020808252603d908201527f5472616e73616374696f6e20646174612073697a652065786365656473206d6160408201527f78696d756d20666f7220726f6c6c7570207472616e73616374696f6e2e000000606082015260800190565b6020808252602f908201527f436f6e746578742074696d657374616d70206973206c6f776572207468616e2060408201526e3630b9ba1039bab136b4ba3a32b21760891b606082015260800190565b6020808252605b908201527f50726576696f75736c7920656e7175657565642062617463686573206861766560408201527f206578706972656420616e64206d75737420626520617070656e64656420626560608201527f666f72652061206e65772073657175656e6365722062617463682e0000000000608082015260a00190565b6020808252602e908201527f496e76616c69642053657175656e636572207472616e73616374696f6e20696e60408201526d31b63ab9b4b7b710383937b7b31760911b606082015260800190565b60208082526032908201527f436f6e7465787420626c6f636b206e756d626572206973206c6f77657220746860408201527130b7103630b9ba1039bab136b4ba3a32b21760711b606082015260800190565b6020808252601e908201527f496e76616c69642053657175656e636572207472616e73616374696f6e2e0000604082015260600190565b6020808252603d908201527f5472616e73616374696f6e20676173206c696d69742065786365656473206d6160408201527f78696d756d20666f7220726f6c6c7570207472616e73616374696f6e2e000000606082015260800190565b60208082526028908201527f4d7573742070726f76696465206174206c65617374206f6e652062617463682060408201526731b7b73a32bc3a1760c11b606082015260800190565b6020808252602e908201527f4e6f7420616c6c2073657175656e636572207472616e73616374696f6e73207760408201526d32b93290383937b1b2b9b9b2b21760911b606082015260800190565b6020808252604a908201527f41637475616c207472616e73616374696f6e20696e64657820646f6573206e6f60408201527f74206d6174636820657870656374656420746f74616c20656c656d656e7473206060820152693a379030b83832b7321760b11b608082015260a00190565b60208082526028908201527f436f6e7465787420626c6f636b206e756d6265722069732066726f6d2074686560408201526710333aba3ab9329760c11b606082015260800190565b60208082526018908201527f496e76616c696420696e636c7573696f6e2070726f6f662e0000000000000000604082015260600190565b60208082526029908201527f5472616e73616374696f6e20676173206c696d697420746f6f206c6f7720746f6040820152681032b738bab2bab29760b91b606082015260800190565b60208082526043908201527f53657175656e636572207472616e73616374696f6e2074696d657374616d702060408201527f657863656564732074686174206f66206e65787420717565756520656c656d65606082015262373a1760e91b608082015260a00190565b6020808252603d908201527f41637475616c20626174636820737461727420696e64657820646f6573206e6f60408201527f74206d6174636820657870656374656420737461727420696e6465782e000000606082015260800190565b6020808252602d908201527f46756e6374696f6e2063616e206f6e6c792062652063616c6c6564206279207460408201526c34329029b2b8bab2b731b2b91760991b606082015260800190565b6020808252601a908201527f496e76616c6964205175657565207472616e73616374696f6e2e000000000000604082015260600190565b60208082526015908201527424b73b30b634b2103130ba31b4103432b0b232b91760591b604082015260600190565b60208082526025908201527f436f6e746578742074696d657374616d702069732066726f6d207468652066756040820152643a3ab9329760d91b606082015260800190565b6020808252602b908201527f496e73756666696369656e742067617320666f72204c322072617465206c696d60408201526a34ba34b73390313ab9371760a91b606082015260800190565b60208082526035908201527f436f6e746578742074696d657374616d702076616c756573206d757374206d6f6040820152743737ba37b734b1b0b6363c9034b731b932b0b9b29760591b606082015260800190565b6020808252602a908201527f496e76616c6964205175657565207472616e73616374696f6e20696e636c757360408201526934b7b710383937b7b31760b11b606082015260800190565b60208082526045908201527f53657175656e636572207472616e73616374696f6e20626c6f636b4e756d626560408201527f7220657863656564732074686174206f66206e65787420717565756520656c6560608201526436b2b73a1760d91b608082015260a00190565b60208082526021908201527f4d75737420617070656e64206174206c65617374206f6e6520656c656d656e746040820152601760f91b606082015260800190565b60208082526026908201527f436f6e746578742074696d657374616d7020746f6f2066617220696e20746865604082015265103830b9ba1760d11b606082015260800190565b60208082526022908201527f4e6f7420656e6f756768204261746368436f6e74657874732070726f76696465604082015261321760f11b606082015260800190565b60208082526029908201527f4e6f7420656e6f75676820717565756564207472616e73616374696f6e732074604082015268379030b83832b7321760b91b606082015260800190565b60208082526037908201527f436f6e7465787420626c6f636b4e756d6265722076616c756573206d7573742060408201527f6d6f6e6f746f6e6963616c6c7920696e6372656173652e000000000000000000606082015260800190565b8151815260208083015164ffffffffff90811691830191909152604092830151169181019190915260600190565b63ffffffff91909116815260200190565b64ffffffffff91909116815260200190565b64ffffffffff9384168152919092166020820152604081019190915260600190565b60405181810167ffffffffffffffff81118282101715612edd57fe5b60405291905056fe4f564d5f436861696e53746f72616765436f6e7461696e65723a4354433a71756575654f564d5f4465636f6d7072657373696f6e507265636f6d70696c65416464726573734c69625f4d65726b6c65547265653a20496e646578206f7574206f6620626f756e64732e4c69625f4d65726b6c65547265653a2043616e6e6f7420636f6d70757465206365696c286c6f675f3229206f6620302e4c69625f4d65726b6c65547265653a20546f74616c206c6561766573206d7573742062652067726561746572207468616e207a65726f2e4c69625f4d65726b6c65547265653a20546f74616c207369626c696e677320646f6573206e6f7420636f72726563746c7920636f72726573706f6e6420746f20746f74616c206c65617665732e4f564d5f436861696e53746f72616765436f6e7461696e65723a4354433a626174636865734c69625f4d65726b6c65547265653a204d7573742070726f76696465206174206c65617374206f6e65206c65616620686173682ea2646970667358221220e5d77a6634733b27dcdabf781fd1df7c095b7f821616f55c1b31d62a7238f9d764736f6c63430007060033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101425760003560e01c8063876ed5cb116100b8578063cfdf677e1161007c578063cfdf677e1461023f578063d0f8934414610247578063e10d29ee1461024f578063e561dddc14610257578063f722b41a1461025f578063facdc5da1461026757610142565b8063876ed5cb146102175780638d38c6c11461021f578063b8f7700514610227578063c139eb151461022f578063c2cf696f1461023757610142565b80634de569ce1161010a5780634de569ce146101c25780635ae6256d146101e25780636fee07e0146101ea57806378f4b2f2146101ff5780637a167a8a146102075780637aa63a861461020f57610142565b8063138387a414610147578063299ca478146101655780632a7f18be1461017a578063378997701461019a578063461a4478146101af575b600080fd5b61014f61027a565b60405161015c91906124c7565b60405180910390f35b61016d610280565b60405161015c91906123eb565b61018d610188366004612388565b61028f565b60405161015c9190612e4e565b6101a26102b0565b60405161015c9190612e8d565b61016d6101bd36600461221b565b6102c4565b6101d56101d0366004612261565b6103a0565b60405161015c9190612484565b6101a26103da565b6101fd6101f8366004612188565b6103ee565b005b61014f61066d565b6101a2610674565b61014f610689565b61014f6106a4565b61014f6106aa565b6101a26106b0565b61014f6106c7565b61014f6106cd565b61016d6106d2565b6101fd6106f5565b61016d610b69565b61014f610b8c565b6101a2610c06565b6101fd610275366004612388565b610c1e565b60025481565b6000546001600160a01b031681565b610297611ed9565b6102a8826102a3610b69565b610c36565b90505b919050565b6000806102bb610d76565b50935050505090565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b8381101561032457818101518382015260200161030c565b50505050905090810190601f1680156103515780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561036e57600080fd5b505afa158015610382573d6000803e3d6000fd5b505050506040513d602081101561039857600080fd5b505192915050565b82516000901515600114156103c2576103bb85858585610e24565b90506103d2565b6103bb8585602001518585610fef565b949350505050565b6000806103e5610d76565b94505050505090565b61c3508151111561041a5760405162461bcd60e51b81526004016104119061259b565b60405180910390fd5b60035482111561043c5760405162461bcd60e51b8152600401610411906127a1565b620186a082101561045f5760405162461bcd60e51b815260040161041190612983565b6020820460005a90508181116104875760405162461bcd60e51b815260040161041190612b8a565b60005b825a8303101561049c5760010161048a565b6000338787876040516020016104b594939291906123ff565b60408051601f19818403018152919052805160209091012090504360281b421760006104df610b69565b60405163b298e36b60e01b81529091506001600160a01b0382169063b298e36b9061050e9086906004016124c7565b600060405180830381600087803b15801561052857600080fd5b505af115801561053c573d6000803e3d6000fd5b505060405163b298e36b60e01b81526001600160a01b038416925063b298e36b915061056c9085906004016124c7565b600060405180830381600087803b15801561058657600080fd5b505af115801561059a573d6000803e3d6000fd5b50505050600060016002836001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b1580156105dd57600080fd5b505afa1580156105f1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106159190612203565b8161061c57fe5b040390507f4b388aecf9fa6cc92253704e5975a6129a4f735bdbd99567df4ed0094ee4ceb5338b8b8b85426040516106599695949392919061243c565b60405180910390a150505050505050505050565b620186a081565b60008061067f610d76565b5090935050505090565b600080610694610d76565b50505064ffffffffff1692915050565b61c35081565b60035481565b60006106c26106bd610b69565b6110c4565b905090565b60015481565b602081565b60006106c2604051806060016040528060258152602001613003602591396102c4565b60043560d81c60093560e890811c90600c35901c610711610689565b8364ffffffffff16146107365760405162461bcd60e51b815260040161041190612a35565b6107646040518060400160405280600d81526020016c27ab26afa9b2b8bab2b731b2b960991b8152506102c4565b6001600160a01b0316336001600160a01b0316146107945760405162461bcd60e51b815260040161041190612a92565b60008162ffffff16116107b95760405162461bcd60e51b8152600401610411906127fe565b60008262ffffff16116107de5760405162461bcd60e51b815260040161041190612cdf565b600f601062ffffff8316020164ffffffffff81163610156108115760405162461bcd60e51b815260040161041190612d66565b600061081b610b69565b90506000610828826110c4565b9050600062ffffff8616368161083a57fe5b0460020267ffffffffffffffff8111801561085457600080fd5b506040519080825280601f01601f19166020018201604052801561087f576020820181803683370190505b50905060008662ffffff1667ffffffffffffffff811180156108a057600080fd5b506040519080825280602002602001820160405280156108ca578160200160208202803683370190505b50905060008060006108da610674565b90506108e4611ef9565b60005b8a62ffffff168163ffffffff161015610a3b57600061090b8263ffffffff16611147565b905063ffffffff82166109215761092181611197565b61092d8382868d611264565b80925060005b835163ffffffff821610156109b1578b3560e81c61c3508111156109695760405162461bcd60e51b81526004016104119061259b565b61097c858e64ffffffffff16838d6112cf565b898963ffffffff168151811061098e57fe5b60209081029190910101529b909b016003019a6001968701969586019501610933565b5060005b83602001518163ffffffff161015610a31578964ffffffffff168564ffffffffff16106109f45760405162461bcd60e51b815260040161041190612da8565b610a048564ffffffffff16611363565b888863ffffffff1681518110610a1657fe5b602090810291909101015260019687019694850194016109b5565b50506001016108e7565b50610a488183898b6113a8565b3664ffffffffff8a1614610a6e5760405162461bcd60e51b815260040161041190612846565b8a62ffffff168463ffffffff1614610a985760405162461bcd60e51b815260040161041190612894565b6000838c62ffffff160363ffffffff169050600080836020015160001415610acb57505060408201516060830151610af3565b6000610ae16001870364ffffffffff168d610c36565b90508060200151925080604001519150505b610b14610aff8961141b565b8f62ffffff168564ffffffffff16858561184f565b7f602f1aeac0ca2e7a13e281a9ef0ad7838542712ce16780fa2ecffd351f05f89983860384610b41610689565b604051610b5093929190612e9f565b60405180910390a1505050505050505050505050505050565b60006106c2604051806060016040528060238152602001612ee6602391396102c4565b6000610b966106d2565b6001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b158015610bce57600080fd5b505afa158015610be2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106c29190612203565b6000610c10610674565b610c186106b0565b03905090565b60405162461bcd60e51b81526004016104119061250b565b610c3e611ed9565b604051634a83e9cd60e11b815260028402906000906001600160a01b03851690639507d39a90610c72908590600401612e8d565b60206040518083038186803b158015610c8a57600080fd5b505afa158015610c9e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cc29190612203565b90506000846001600160a01b0316639507d39a846001016040518263ffffffff1660e01b8152600401610cf59190612e8d565b60206040518083038186803b158015610d0d57600080fd5b505afa158015610d21573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d459190612203565b6040805160608101825293845264ffffffffff828116602086015260289290921c9091169083015250949350505050565b6000806000806000610d866106d2565b6001600160a01b031663ccf8f9696040518163ffffffff1660e01b815260040160206040518083038186803b158015610dbe57600080fd5b505afa158015610dd2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610df691906121dd565b64ffffffffff602882901c811697605083901c82169750607883901c8216965060a09290921c169350915050565b600080610e5c6040518060400160405280601481526020017327ab26afa2bc32b1baba34b7b726b0b730b3b2b960611b8152506102c4565b90506000816001600160a01b0316631c4712a76040518163ffffffff1660e01b815260040160206040518083038186803b158015610e9957600080fd5b505afa158015610ead573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ed19190612203565b90506000610ede87611a02565b9050610eeb818787611a9b565b610f075760405162461bcd60e51b8152600401610411906126ca565b86606001518860200151148015610f22575060408701518851145b8015610f635750610f4a604051806060016040528060228152602001612f09602291396102c4565b6001600160a01b031688608001516001600160a01b0316145b8015610f725750818860a00151145b8015610f89575060608801516001600160a01b0316155b8015610fa45750600088604001516001811115610fa257fe5b145b8015610fc557508660800151805190602001208860c0015180519060200120145b610fe15760405162461bcd60e51b81526004016104119061276a565b506001979650505050505050565b600080610ffb85611363565b9050611008818585611a9b565b6110245760405162461bcd60e51b815260040161041190612c2a565b6000866060015187608001518860a001518960c0015160405160200161104d94939291906123ff565b60405160208183030381529060405280519060200120905060006110708761028f565b80519091508214801561108e57508751602082015164ffffffffff16145b80156110a857508760200151816040015164ffffffffff16145b610fe15760405162461bcd60e51b815260040161041190612adf565b60006002826001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b15801561110157600080fd5b505afa158015611115573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111399190612203565b8161114057fe5b0492915050565b61114f611ef9565b5060408051608081018252601092909202600f81013560e890811c84526012820135901c6020840152601581013560d890811c92840192909252601a0135901c606082015290565b60006111a1610689565b1115611211576000806111b2610d76565b9350935050508064ffffffffff16836060015110156111e35760405162461bcd60e51b815260040161041190612718565b8164ffffffffff168360400151101561120e5760405162461bcd60e51b8152600401610411906125f8565b50505b4260015482604001510110156112395760405162461bcd60e51b815260040161041190612d20565b4360025482606001510110156112615760405162461bcd60e51b815260040161041190612552565b50565b83604001518360400151101561128c5760405162461bcd60e51b815260040161041190612bd5565b8360600151836060015110156112b45760405162461bcd60e51b815260040161041190612df1565b6020830151156112c9576112c9838383611b8c565b50505050565b60008151836041011115611326578260410167ffffffffffffffff811180156112f757600080fd5b506040519080825280601f01601f191660200182016040528015611322576020820181803683370190505b5091505b6040850151606086015160006020850160018153836001820152826021820152866003890160418301376041870190209350505050949350505050565b60006102a86040518060a00160405280600015158152602001848152602001600081526020016000815260200160405180602001604052806000815250815250611c2d565b600083830364ffffffffff161180156113c357506020840151155b156113d3576113d3848483611b8c565b42846040015111156113f75760405162461bcd60e51b815260040161041190612b45565b43846060015111156112c95760405162461bcd60e51b815260040161041190612904565b60008082511161145c5760405162461bcd60e51b81526004018080602001828103825260348152602001806130286034913960400191505060405180910390fd5b815160011415611482578160008151811061147357fe5b602002602001015190506102ab565b60408051610200810182527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56381527f633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d60208201527f890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d818301527f3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd86060808301919091527fecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da60808301527fdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da560a08301527f617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d760c08301527f292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead60e08301527fe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e106101008301527f7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f826101208301527fe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e836365166101408301527f3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c6101608301527fad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e6101808301527fa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab6101a08301527f4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c8626101c08301527f2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf106101e083015282518381529081018352909160009190602082018180368337505085519192506000918291508180805b600184111561182b5750506002820460018084161460005b828110156117a7578a816002028151811061174e57fe5b602002602001015196508a816002026001018151811061176a57fe5b6020026020010151955086602089015285604089015287805190602001208b828151811061179457fe5b6020908102919091010152600101611737565b50801561180a578960018503815181106117bd57fe5b602002602001015195508783601081106117d357fe5b602002015160001b945085602088015284604088015286805190602001208a83815181106117fd57fe5b6020026020010181815250505b80611816576000611819565b60015b60ff168201935060019092019161171f565b8960008151811061183857fe5b602002602001015198505050505050505050919050565b60006118596106d2565b9050600080611866610d76565b50509150915060006040518060a00160405280856001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b1580156118b257600080fd5b505afa1580156118c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118ea9190612203565b81526020018a81526020018981526020018464ffffffffff16815260200160405180602001604052806000815250815250905080600001517f127186556e7be68c7e31263195225b4de02820707889540969f62c05cf73525e826020015183604001518460600151856080015160405161196794939291906124e6565b60405180910390a2600061197a82611c75565b90506000611992836040015186018a86018a8a611c9e565b60405163080549db60e21b81529091506001600160a01b03871690632015276c906119c390859085906004016124d0565b600060405180830381600087803b1580156119dd57600080fd5b505af11580156119f1573d6000803e3d6000fd5b505050505050505050505050505050565b6080810151805160009190826041820167ffffffffffffffff81118015611a2857600080fd5b506040519080825280601f01601f191660200182016040528015611a53576020820181803683370190505b5060408601516060870151919250906000602084016001815383600182015282602182015285604182018760208a0160045afa50604190950190942095505050505050919050565b6000611aa56106d2565b8351604051634a83e9cd60e11b81526001600160a01b039290921691639507d39a91611ad391600401612e7c565b60206040518083038186803b158015611aeb57600080fd5b505afa158015611aff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b239190612203565b611b2c84611c75565b14611b495760405162461bcd60e51b815260040161041190612b16565b611b66836020015185846000015185602001518760400151611cbd565b611b825760405162461bcd60e51b81526004016104119061294c565b5060019392505050565b6000611b9f8364ffffffffff1683610c36565b9050600154816020015164ffffffffff16014210611bcf5760405162461bcd60e51b815260040161041190612647565b806020015164ffffffffff1684604001511115611bfe5760405162461bcd60e51b8152600401610411906129cc565b806040015164ffffffffff16846060015111156112c95760405162461bcd60e51b815260040161041190612c74565b8051602080830151604080850151606086015160808701519251600096611c5896909594910161248f565b604051602081830303815290604052805190602001209050919050565b60008160200151826040015183606001518460800151604051602001611c5894939291906124e6565b602892831b9390931760509190911b1760789290921b91909117901b90565b6000808211611cfd5760405162461bcd60e51b8152600401808060200182810382526037815260200180612f7f6037913960400191505060405180910390fd5b818410611d3b5760405162461bcd60e51b8152600401808060200182810382526024815260200180612f2b6024913960400191505060405180910390fd5b611d4482611e42565b835114611d825760405162461bcd60e51b815260040180806020018281038252604d815260200180612fb6604d913960600191505060405180910390fd5b8460005b8451811015611e35578560011660011415611de457848181518110611da757fe5b6020026020010151826040516020018083815260200182815260200192505050604051602081830303815290604052805190602001209150611e29565b81858281518110611df157fe5b602002602001015160405160200180838152602001828152602001925050506040516020818303038152906040528051906020012091505b600195861c9501611d86565b5090951495945050505050565b6000808211611e825760405162461bcd60e51b8152600401808060200182810382526030815260200180612f4f6030913960400191505060405180910390fd5b8160011415611e93575060006102ab565b81600060805b60018110611ec3576000196001821b01811b831615611ebb5791821c91908101905b60011c611e99565b506001811b8414611ed2576001015b9392505050565b604080516060810182526000808252602082018190529181019190915290565b6040518060800160405280600081526020016000815260200160008152602001600081525090565b600067ffffffffffffffff831115611f3557fe5b611f48601f8401601f1916602001612ec1565b9050828152838383011115611f5c57600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b03811681146102ab57600080fd5b600082601f830112611f9a578081fd5b611ed283833560208501611f21565b8035600281106102ab57600080fd5b600060a08284031215611fc9578081fd5b60405160a0810167ffffffffffffffff8282108183111715611fe757fe5b8160405282935084358352602085013560208401526040850135604084015260608501356060840152608085013591508082111561202457600080fd5b5061203185828601611f8a565b6080830152505092915050565b60006040828403121561204f578081fd5b6040516040810167ffffffffffffffff828210818311171561206d57fe5b816040528293508435835260209150818501358181111561208d57600080fd5b8501601f8101871361209e57600080fd5b8035828111156120aa57fe5b83810292506120ba848401612ec1565b8181528481019083860185850187018b10156120d557600080fd5b600095505b838610156120f85780358352600195909501949186019186016120da565b5080868801525050505050505092915050565b600060a0828403121561211c578081fd5b60405160a0810167ffffffffffffffff828210818311171561213a57fe5b8160405282935084359150811515821461215357600080fd5b818352602085013560208401526040850135604084015260608501356060840152608085013591508082111561202457600080fd5b60008060006060848603121561219c578283fd5b6121a584611f73565b925060208401359150604084013567ffffffffffffffff8111156121c7578182fd5b6121d386828701611f8a565b9150509250925092565b6000602082840312156121ee578081fd5b815164ffffffffff1981168114611ed2578182fd5b600060208284031215612214578081fd5b5051919050565b60006020828403121561222c578081fd5b813567ffffffffffffffff811115612242578182fd5b8201601f81018413612252578182fd5b6103d284823560208401611f21565b60008060008060808587031215612276578081fd5b843567ffffffffffffffff8082111561228d578283fd5b9086019060e082890312156122a0578283fd5b6122aa60e0612ec1565b82358152602083013560208201526122c460408401611fa9565b60408201526122d560608401611f73565b60608201526122e660808401611f73565b608082015260a083013560a082015260c083013582811115612306578485fd5b6123128a828601611f8a565b60c0830152509550602087013591508082111561232d578283fd5b6123398883890161210b565b9450604087013591508082111561234e578283fd5b61235a88838901611fb8565b9350606087013591508082111561236f578283fd5b5061237c8782880161203e565b91505092959194509250565b600060208284031215612399578081fd5b5035919050565b60008151808452815b818110156123c5576020818501810151868301820152016123a9565b818111156123d65782602083870101525b50601f01601f19169290920160200192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612432908301846123a0565b9695505050505050565b6001600160a01b038781168252861660208201526040810185905260c06060820181905260009061246f908301866123a0565b60808301949094525060a00152949350505050565b901515815260200190565b6000861515825285602083015284604083015283606083015260a060808301526124bc60a08301846123a0565b979650505050505050565b90815260200190565b91825264ffffffffff1916602082015260400190565b60008582528460208301528360408301526080606083015261243260808301846123a0565b60208082526027908201527f617070656e64517565756542617463682069732063757272656e746c7920646960408201526639b0b13632b21760c91b606082015260800190565b60208082526029908201527f436f6e7465787420626c6f636b206e756d62657220746f6f2066617220696e206040820152683a3432903830b9ba1760b91b606082015260800190565b6020808252603d908201527f5472616e73616374696f6e20646174612073697a652065786365656473206d6160408201527f78696d756d20666f7220726f6c6c7570207472616e73616374696f6e2e000000606082015260800190565b6020808252602f908201527f436f6e746578742074696d657374616d70206973206c6f776572207468616e2060408201526e3630b9ba1039bab136b4ba3a32b21760891b606082015260800190565b6020808252605b908201527f50726576696f75736c7920656e7175657565642062617463686573206861766560408201527f206578706972656420616e64206d75737420626520617070656e64656420626560608201527f666f72652061206e65772073657175656e6365722062617463682e0000000000608082015260a00190565b6020808252602e908201527f496e76616c69642053657175656e636572207472616e73616374696f6e20696e60408201526d31b63ab9b4b7b710383937b7b31760911b606082015260800190565b60208082526032908201527f436f6e7465787420626c6f636b206e756d626572206973206c6f77657220746860408201527130b7103630b9ba1039bab136b4ba3a32b21760711b606082015260800190565b6020808252601e908201527f496e76616c69642053657175656e636572207472616e73616374696f6e2e0000604082015260600190565b6020808252603d908201527f5472616e73616374696f6e20676173206c696d69742065786365656473206d6160408201527f78696d756d20666f7220726f6c6c7570207472616e73616374696f6e2e000000606082015260800190565b60208082526028908201527f4d7573742070726f76696465206174206c65617374206f6e652062617463682060408201526731b7b73a32bc3a1760c11b606082015260800190565b6020808252602e908201527f4e6f7420616c6c2073657175656e636572207472616e73616374696f6e73207760408201526d32b93290383937b1b2b9b9b2b21760911b606082015260800190565b6020808252604a908201527f41637475616c207472616e73616374696f6e20696e64657820646f6573206e6f60408201527f74206d6174636820657870656374656420746f74616c20656c656d656e7473206060820152693a379030b83832b7321760b11b608082015260a00190565b60208082526028908201527f436f6e7465787420626c6f636b206e756d6265722069732066726f6d2074686560408201526710333aba3ab9329760c11b606082015260800190565b60208082526018908201527f496e76616c696420696e636c7573696f6e2070726f6f662e0000000000000000604082015260600190565b60208082526029908201527f5472616e73616374696f6e20676173206c696d697420746f6f206c6f7720746f6040820152681032b738bab2bab29760b91b606082015260800190565b60208082526043908201527f53657175656e636572207472616e73616374696f6e2074696d657374616d702060408201527f657863656564732074686174206f66206e65787420717565756520656c656d65606082015262373a1760e91b608082015260a00190565b6020808252603d908201527f41637475616c20626174636820737461727420696e64657820646f6573206e6f60408201527f74206d6174636820657870656374656420737461727420696e6465782e000000606082015260800190565b6020808252602d908201527f46756e6374696f6e2063616e206f6e6c792062652063616c6c6564206279207460408201526c34329029b2b8bab2b731b2b91760991b606082015260800190565b6020808252601a908201527f496e76616c6964205175657565207472616e73616374696f6e2e000000000000604082015260600190565b60208082526015908201527424b73b30b634b2103130ba31b4103432b0b232b91760591b604082015260600190565b60208082526025908201527f436f6e746578742074696d657374616d702069732066726f6d207468652066756040820152643a3ab9329760d91b606082015260800190565b6020808252602b908201527f496e73756666696369656e742067617320666f72204c322072617465206c696d60408201526a34ba34b73390313ab9371760a91b606082015260800190565b60208082526035908201527f436f6e746578742074696d657374616d702076616c756573206d757374206d6f6040820152743737ba37b734b1b0b6363c9034b731b932b0b9b29760591b606082015260800190565b6020808252602a908201527f496e76616c6964205175657565207472616e73616374696f6e20696e636c757360408201526934b7b710383937b7b31760b11b606082015260800190565b60208082526045908201527f53657175656e636572207472616e73616374696f6e20626c6f636b4e756d626560408201527f7220657863656564732074686174206f66206e65787420717565756520656c6560608201526436b2b73a1760d91b608082015260a00190565b60208082526021908201527f4d75737420617070656e64206174206c65617374206f6e6520656c656d656e746040820152601760f91b606082015260800190565b60208082526026908201527f436f6e746578742074696d657374616d7020746f6f2066617220696e20746865604082015265103830b9ba1760d11b606082015260800190565b60208082526022908201527f4e6f7420656e6f756768204261746368436f6e74657874732070726f76696465604082015261321760f11b606082015260800190565b60208082526029908201527f4e6f7420656e6f75676820717565756564207472616e73616374696f6e732074604082015268379030b83832b7321760b91b606082015260800190565b60208082526037908201527f436f6e7465787420626c6f636b4e756d6265722076616c756573206d7573742060408201527f6d6f6e6f746f6e6963616c6c7920696e6372656173652e000000000000000000606082015260800190565b8151815260208083015164ffffffffff90811691830191909152604092830151169181019190915260600190565b63ffffffff91909116815260200190565b64ffffffffff91909116815260200190565b64ffffffffff9384168152919092166020820152604081019190915260600190565b60405181810167ffffffffffffffff81118282101715612edd57fe5b60405291905056fe4f564d5f436861696e53746f72616765436f6e7461696e65723a4354433a71756575654f564d5f4465636f6d7072657373696f6e507265636f6d70696c65416464726573734c69625f4d65726b6c65547265653a20496e646578206f7574206f6620626f756e64732e4c69625f4d65726b6c65547265653a2043616e6e6f7420636f6d70757465206365696c286c6f675f3229206f6620302e4c69625f4d65726b6c65547265653a20546f74616c206c6561766573206d7573742062652067726561746572207468616e207a65726f2e4c69625f4d65726b6c65547265653a20546f74616c207369626c696e677320646f6573206e6f7420636f72726563746c7920636f72726573706f6e6420746f20746f74616c206c65617665732e4f564d5f436861696e53746f72616765436f6e7461696e65723a4354433a626174636865734c69625f4d65726b6c65547265653a204d7573742070726f76696465206174206c65617374206f6e65206c65616620686173682ea2646970667358221220e5d77a6634733b27dcdabf781fd1df7c095b7f821616f55c1b31d62a7238f9d764736f6c63430007060033", + "devdoc": { + "details": "The Canonical Transaction Chain (CTC) contract is an append-only log of transactions which must be applied to the rollup state. It defines the ordering of rollup transactions by writing them to the 'CTC:batches' instance of the Chain Storage Container. The CTC also allows any account to 'enqueue' an L2 transaction, which will require that the Sequencer will eventually append it to the rollup state. If the Sequencer does not include an enqueued transaction within the 'force inclusion period', then any account may force it to be included by calling appendQueueBatch(). Compiler used: solc Runtime target: EVM", + "kind": "dev", + "methods": { + "appendSequencerBatch()": { + "details": "This function uses a custom encoding scheme for efficiency reasons. .param _shouldStartAtElement Specific batch we expect to start appending to. .param _totalElementsToAppend Total number of batch elements we expect to append. .param _contexts Array of batch contexts. .param _transactionDataFields Array of raw transaction data." + }, + "batches()": { + "returns": { + "_0": "Reference to the batch storage container." + } + }, + "enqueue(address,uint256,bytes)": { + "params": { + "_data": "Transaction data.", + "_gasLimit": "Gas limit for the enqueued L2 transaction.", + "_target": "Target L2 contract to send the transaction to." + } + }, + "getLastBlockNumber()": { + "returns": { + "_0": "Blocknumber for the last transaction." + } + }, + "getLastTimestamp()": { + "returns": { + "_0": "Timestamp for the last transaction." + } + }, + "getNextQueueIndex()": { + "returns": { + "_0": "Index for the next queue element." + } + }, + "getNumPendingQueueElements()": { + "returns": { + "_0": "Number of pending queue elements." + } + }, + "getQueueElement(uint256)": { + "params": { + "_index": "Index of the queue element to access." + }, + "returns": { + "_element": "Queue element at the given index." + } + }, + "getQueueLength()": { + "returns": { + "_0": "Length of the queue." + } + }, + "getTotalBatches()": { + "returns": { + "_totalBatches": "Total submitted batches." + } + }, + "getTotalElements()": { + "returns": { + "_totalElements": "Total submitted elements." + } + }, + "queue()": { + "returns": { + "_0": "Reference to the queue storage container." + } + }, + "resolve(string)": { + "params": { + "_name": "Name to resolve an address for." + }, + "returns": { + "_0": "Address associated with the given name." + } + }, + "verifyTransaction((uint256,uint256,uint8,address,address,uint256,bytes),(bool,uint256,uint256,uint256,bytes),(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))": { + "params": { + "_batchHeader": "Header of the batch the transaction was included in.", + "_inclusionProof": "Inclusion proof for the provided transaction chain element.", + "_transaction": "Transaction to verify.", + "_txChainElement": "Transaction chain element corresponding to the transaction." + }, + "returns": { + "_0": "True if the transaction exists in the CTC, false if not." + } + } + }, + "title": "OVM_CanonicalTransactionChain", + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": { + "appendQueueBatch(uint256)": { + "notice": "Appends a given number of queued transactions as a single batch. param _numQueuedTransactions Number of transactions to append." + }, + "appendSequencerBatch()": { + "notice": "Allows the sequencer to append a batch of transactions." + }, + "batches()": { + "notice": "Accesses the batch storage container." + }, + "enqueue(address,uint256,bytes)": { + "notice": "Adds a transaction to the queue." + }, + "getLastBlockNumber()": { + "notice": "Returns the blocknumber of the last transaction." + }, + "getLastTimestamp()": { + "notice": "Returns the timestamp of the last transaction." + }, + "getNextQueueIndex()": { + "notice": "Returns the index of the next element to be enqueued." + }, + "getNumPendingQueueElements()": { + "notice": "Get the number of queue elements which have not yet been included." + }, + "getQueueElement(uint256)": { + "notice": "Gets the queue element at a particular index." + }, + "getQueueLength()": { + "notice": "Retrieves the length of the queue, including both pending and canonical transactions." + }, + "getTotalBatches()": { + "notice": "Retrieves the total number of batches submitted." + }, + "getTotalElements()": { + "notice": "Retrieves the total number of elements submitted." + }, + "queue()": { + "notice": "Accesses the queue storage container." + }, + "resolve(string)": { + "notice": "Resolves the address associated with a given name." + }, + "verifyTransaction((uint256,uint256,uint8,address,address,uint256,bytes),(bool,uint256,uint256,uint256,bytes),(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))": { + "notice": "Verifies whether a transaction is included in the chain." + } + }, + "version": 1 + }, + "storageLayout": { + "storage": [ + { + "astId": 12800, + "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_CanonicalTransactionChain.sol:OVM_CanonicalTransactionChain", + "label": "libAddressManager", + "offset": 0, + "slot": "0", + "type": "t_contract(Lib_AddressManager)12793" + }, + { + "astId": 2943, + "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_CanonicalTransactionChain.sol:OVM_CanonicalTransactionChain", + "label": "forceInclusionPeriodSeconds", + "offset": 0, + "slot": "1", + "type": "t_uint256" + }, + { + "astId": 2945, + "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_CanonicalTransactionChain.sol:OVM_CanonicalTransactionChain", + "label": "forceInclusionPeriodBlocks", + "offset": 0, + "slot": "2", + "type": "t_uint256" + }, + { + "astId": 2947, + "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_CanonicalTransactionChain.sol:OVM_CanonicalTransactionChain", + "label": "maxTransactionGasLimit", + "offset": 0, + "slot": "3", + "type": "t_uint256" + } + ], + "types": { + "t_contract(Lib_AddressManager)12793": { + "encoding": "inplace", + "label": "contract Lib_AddressManager", + "numberOfBytes": "20" + }, + "t_uint256": { + "encoding": "inplace", + "label": "uint256", + "numberOfBytes": "32" + } + } + } +} \ No newline at end of file diff --git a/packages/contracts/deployments/kovan-v3/OVM_ChainStorageContainer:CTC:batches.json b/packages/contracts/deployments/kovan-v3/OVM_ChainStorageContainer:CTC:batches.json new file mode 100644 index 0000000000000..7d6a67f2d39f5 --- /dev/null +++ b/packages/contracts/deployments/kovan-v3/OVM_ChainStorageContainer:CTC:batches.json @@ -0,0 +1,453 @@ +{ + "address": "0xeb335a8A5e8bA008cF7Cb02D5C3432f4fDB576da", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_libAddressManager", + "type": "address" + }, + { + "internalType": "string", + "name": "_owner", + "type": "string" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_index", + "type": "uint256" + }, + { + "internalType": "bytes27", + "name": "_globalMetadata", + "type": "bytes27" + } + ], + "name": "deleteElementsAfterInclusive", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_index", + "type": "uint256" + } + ], + "name": "deleteElementsAfterInclusive", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_index", + "type": "uint256" + } + ], + "name": "get", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getGlobalMetadata", + "outputs": [ + { + "internalType": "bytes27", + "name": "", + "type": "bytes27" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "length", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "libAddressManager", + "outputs": [ + { + "internalType": "contract Lib_AddressManager", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_object", + "type": "bytes32" + }, + { + "internalType": "bytes27", + "name": "_globalMetadata", + "type": "bytes27" + } + ], + "name": "push", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_object", + "type": "bytes32" + } + ], + "name": "push", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "_name", + "type": "string" + } + ], + "name": "resolve", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes27", + "name": "_globalMetadata", + "type": "bytes27" + } + ], + "name": "setGlobalMetadata", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_index", + "type": "uint256" + } + ], + "name": "setNextOverwritableIndex", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "transactionHash": "0x787b44347630217940635c7c654bb383c4f85dba4727578dff104e50dbea79dc", + "receipt": { + "to": null, + "from": "0x18394B52d3Cb931dfA76F63251919D051953413d", + "contractAddress": "0xeb335a8A5e8bA008cF7Cb02D5C3432f4fDB576da", + "transactionIndex": 0, + "gasUsed": "968390", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0x8ea3e9319a68cca7fb784f92017ee846c2eb68c34308a6f8970dfd2dd7999eb1", + "transactionHash": "0x787b44347630217940635c7c654bb383c4f85dba4727578dff104e50dbea79dc", + "logs": [], + "blockNumber": 24572785, + "cumulativeGasUsed": "968390", + "status": 1, + "byzantium": true + }, + "args": [ + "0xd56F695e73286ac252A37593DD4E7c14270eC1Df", + "OVM_CanonicalTransactionChain" + ], + "solcInputHash": "5ee8e508e2c54cb5ac6783b4855b1558", + "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_owner\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"get\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getGlobalMetadata\",\"outputs\":[{\"internalType\":\"bytes27\",\"name\":\"\",\"type\":\"bytes27\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"length\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"setGlobalMetadata\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"setNextOverwritableIndex\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The Chain Storage Container provides its owner contract with read, write and delete functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which can no longer be used in a fraud proof due to the fraud window having passed, and the associated chain state or transactions being finalized. Three distinct Chain Storage Containers will be deployed on Layer 1: 1. Stores transaction batches for the Canonical Transaction Chain 2. Stores queued transactions for the Canonical Transaction Chain 3. Stores chain state batches for the State Commitment Chain Compiler used: solc Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\",\"_owner\":\"Name of the contract that owns this container (will be resolved later).\"}},\"deleteElementsAfterInclusive(uint256)\":{\"params\":{\"_index\":\"Object index to delete from.\"}},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_index\":\"Object index to delete from.\"}},\"get(uint256)\":{\"params\":{\"_index\":\"Index of the particular object to access.\"},\"returns\":{\"_0\":\"32 byte object value.\"}},\"getGlobalMetadata()\":{\"returns\":{\"_0\":\"Container global metadata field.\"}},\"length()\":{\"returns\":{\"_0\":\"Number of objects in the container.\"}},\"push(bytes32)\":{\"params\":{\"_object\":\"A 32 byte value to insert into the container.\"}},\"push(bytes32,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_object\":\"A 32 byte value to insert into the container.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}},\"setGlobalMetadata(bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata to set.\"}}},\"title\":\"OVM_ChainStorageContainer\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"deleteElementsAfterInclusive(uint256)\":{\"notice\":\"Removes all objects after and including a given index.\"},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"notice\":\"Removes all objects after and including a given index. Also allows setting the global metadata field.\"},\"get(uint256)\":{\"notice\":\"Retrieves an object from the container.\"},\"getGlobalMetadata()\":{\"notice\":\"Retrieves the container's global metadata field.\"},\"length()\":{\"notice\":\"Retrieves the number of objects stored in the container.\"},\"push(bytes32)\":{\"notice\":\"Pushes an object into the container.\"},\"push(bytes32,bytes27)\":{\"notice\":\"Pushes an object into the container. Function allows setting the global metadata since we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global metadata (it's an optimization).\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"},\"setGlobalMetadata(bytes27)\":{\"notice\":\"Sets the container's global metadata field. We're using `bytes27` here because we use five bytes to maintain the length of the underlying data structure, meaning we have an extra 27 bytes to store arbitrary data.\"},\"setNextOverwritableIndex(uint256)\":{\"notice\":\"Marks an index as overwritable, meaing the underlying buffer can start to write values over any objects before and including the given index.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol\":\"OVM_ChainStorageContainer\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor () internal {\\n address msgSender = _msgSender();\\n _owner = msgSender;\\n emit OwnershipTransferred(address(0), msgSender);\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n emit OwnershipTransferred(_owner, address(0));\\n _owner = address(0);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n emit OwnershipTransferred(_owner, newOwner);\\n _owner = newOwner;\\n }\\n}\\n\",\"keccak256\":\"0x15e2d5bd4c28a88548074c54d220e8086f638a71ed07e6b3ba5a70066fcf458d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with GSN meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address payable) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes memory) {\\n this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x8d3cb350f04ff49cfb10aef08d87f19dcbaecc8027b0bed12f3275cd12f38cf0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_RingBuffer } from \\\"../../libraries/utils/Lib_RingBuffer.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_ChainStorageContainer } from \\\"../../iOVM/chain/iOVM_ChainStorageContainer.sol\\\";\\n\\n/**\\n * @title OVM_ChainStorageContainer\\n * @dev The Chain Storage Container provides its owner contract with read, write and delete functionality.\\n * This provides gas efficiency gains by enabling it to overwrite storage slots which can no longer be used\\n * in a fraud proof due to the fraud window having passed, and the associated chain state or\\n * transactions being finalized.\\n * Three distinct Chain Storage Containers will be deployed on Layer 1:\\n * 1. Stores transaction batches for the Canonical Transaction Chain\\n * 2. Stores queued transactions for the Canonical Transaction Chain\\n * 3. Stores chain state batches for the State Commitment Chain\\n *\\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract OVM_ChainStorageContainer is iOVM_ChainStorageContainer, Lib_AddressResolver {\\n\\n /*************\\n * Libraries *\\n *************/\\n\\n using Lib_RingBuffer for Lib_RingBuffer.RingBuffer;\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n string public owner;\\n Lib_RingBuffer.RingBuffer internal buffer;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n * @param _owner Name of the contract that owns this container (will be resolved later).\\n */\\n constructor(\\n address _libAddressManager,\\n string memory _owner\\n )\\n Lib_AddressResolver(_libAddressManager)\\n {\\n owner = _owner;\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n msg.sender == resolve(owner),\\n \\\"OVM_ChainStorageContainer: Function can only be called by the owner.\\\"\\n );\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function setGlobalMetadata(\\n bytes27 _globalMetadata\\n )\\n override\\n public\\n onlyOwner\\n {\\n return buffer.setExtraData(_globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function getGlobalMetadata()\\n override\\n public\\n view\\n returns (\\n bytes27\\n )\\n {\\n return buffer.getExtraData();\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function length()\\n override\\n public\\n view\\n returns (\\n uint256\\n )\\n {\\n return uint256(buffer.getLength());\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function push(\\n bytes32 _object\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.push(_object);\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function push(\\n bytes32 _object,\\n bytes27 _globalMetadata\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.push(_object, _globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function get(\\n uint256 _index\\n )\\n override\\n public\\n view\\n returns (\\n bytes32\\n )\\n {\\n return buffer.get(uint40(_index));\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.deleteElementsAfterInclusive(\\n uint40(_index)\\n );\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index,\\n bytes27 _globalMetadata\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.deleteElementsAfterInclusive(\\n uint40(_index),\\n _globalMetadata\\n );\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function setNextOverwritableIndex(\\n uint256 _index\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.nextOverwritableIndex = _index;\\n }\\n}\\n\",\"keccak256\":\"0x93325c961516aa2a22bf1aacf4029353d5e3b693e04b485753170337b50224e6\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_ChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title iOVM_ChainStorageContainer\\n */\\ninterface iOVM_ChainStorageContainer {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata()\\n external\\n view\\n returns (\\n bytes27\\n );\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length()\\n external\\n view\\n returns (\\n uint256\\n );\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(\\n bytes32 _object\\n )\\n external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(\\n bytes32 _object,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(\\n uint256 _index\\n )\\n external\\n view\\n returns (\\n bytes32\\n );\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index\\n )\\n external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Marks an index as overwritable, meaing the underlying buffer can start to write values over\\n * any objects before and including the given index.\\n */\\n function setNextOverwritableIndex(\\n uint256 _index\\n )\\n external;\\n}\\n\",\"keccak256\":\"0x2d7973a0ad84c23ec62624d3f1e3aeb198cc72686ff1e6cfa17155556b320c94\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n public\\n onlyOwner\\n {\\n addresses[_getNameHash(_name)] = _address;\\n\\n emit AddressSet(\\n _name,\\n _address\\n );\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0x2ce671a0e004df88b136bea5a3c59d0732cea8887c8496da1d509e0200b03d7d\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(\\n address _libAddressManager\\n ) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x65981feeabff6a81783ea97d44baf988a18a86c8cb374c46fdb71819cbacc7c0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_RingBuffer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\nlibrary Lib_RingBuffer {\\n using Lib_RingBuffer for RingBuffer;\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Buffer {\\n uint256 length;\\n mapping (uint256 => bytes32) buf;\\n }\\n\\n struct RingBuffer {\\n bytes32 contextA;\\n bytes32 contextB;\\n Buffer bufferA;\\n Buffer bufferB;\\n uint256 nextOverwritableIndex;\\n }\\n\\n struct RingBufferContext {\\n // contextA\\n uint40 globalIndex;\\n bytes27 extraData;\\n\\n // contextB\\n uint64 currBufferIndex;\\n uint40 prevResetIndex;\\n uint40 currResetIndex;\\n }\\n\\n\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 constant MIN_CAPACITY = 16;\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n * @param _extraData Optional global extra data.\\n */\\n function push(\\n RingBuffer storage _self,\\n bytes32 _value,\\n bytes27 _extraData\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n Buffer storage currBuffer = _self.getBuffer(ctx.currBufferIndex);\\n\\n // Set a minimum capacity.\\n if (currBuffer.length == 0) {\\n currBuffer.length = MIN_CAPACITY;\\n }\\n\\n // Check if we need to expand the buffer.\\n if (ctx.globalIndex - ctx.currResetIndex >= currBuffer.length) {\\n if (ctx.currResetIndex < _self.nextOverwritableIndex) {\\n // We're going to overwrite the inactive buffer.\\n // Bump the buffer index, reset the delete offset, and set our reset indices.\\n ctx.currBufferIndex++;\\n ctx.prevResetIndex = ctx.currResetIndex;\\n ctx.currResetIndex = ctx.globalIndex;\\n\\n // Swap over to the next buffer.\\n currBuffer = _self.getBuffer(ctx.currBufferIndex);\\n } else {\\n // We're not overwriting yet, double the length of the current buffer.\\n currBuffer.length *= 2;\\n }\\n }\\n\\n // Index to write to is the difference of the global and reset indices.\\n uint256 writeHead = ctx.globalIndex - ctx.currResetIndex;\\n currBuffer.buf[writeHead] = _value;\\n\\n // Bump the global index and insert our extra data, then save the context.\\n ctx.globalIndex++;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n */\\n function push(\\n RingBuffer storage _self,\\n bytes32 _value\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n\\n _self.push(\\n _value,\\n ctx.extraData\\n );\\n }\\n\\n /**\\n * Retrieves an element from the buffer.\\n * @param _self Buffer to access.\\n * @param _index Element index to retrieve.\\n * @return Value of the element at the given index.\\n */\\n function get(\\n RingBuffer storage _self,\\n uint256 _index\\n )\\n internal\\n view\\n returns (\\n bytes32\\n )\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n\\n require(\\n _index < ctx.globalIndex,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n Buffer storage currBuffer = _self.getBuffer(ctx.currBufferIndex);\\n Buffer storage prevBuffer = _self.getBuffer(ctx.currBufferIndex + 1);\\n\\n if (_index >= ctx.currResetIndex) {\\n // We're trying to load an element from the current buffer.\\n // Relative index is just the difference from the reset index.\\n uint256 relativeIndex = _index - ctx.currResetIndex;\\n\\n // Shouldn't happen but why not check.\\n require(\\n relativeIndex < currBuffer.length,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n return currBuffer.buf[relativeIndex];\\n } else {\\n // We're trying to load an element from the previous buffer.\\n // Relative index is the difference from the reset index in the other direction.\\n uint256 relativeIndex = ctx.currResetIndex - _index;\\n\\n // Condition only fails in the case that we deleted and flipped buffers.\\n require(\\n ctx.currResetIndex > ctx.prevResetIndex,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n // Make sure we're not trying to read beyond the array.\\n require(\\n relativeIndex <= prevBuffer.length,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n return prevBuffer.buf[prevBuffer.length - relativeIndex];\\n }\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n * @param _extraData Optional global extra data.\\n */\\n function deleteElementsAfterInclusive(\\n RingBuffer storage _self,\\n uint40 _index,\\n bytes27 _extraData\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n\\n require(\\n _index < ctx.globalIndex && _index >= ctx.prevResetIndex,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n if (_index < ctx.currResetIndex) {\\n // We're switching back to the previous buffer.\\n // Reduce the buffer index, set the current reset index back to match the previous one.\\n // We use the equality of these two values to prevent reading beyond this buffer.\\n ctx.currBufferIndex--;\\n ctx.currResetIndex = ctx.prevResetIndex;\\n }\\n\\n // Set our global index and extra data, save the context.\\n ctx.globalIndex = _index;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n */\\n function deleteElementsAfterInclusive(\\n RingBuffer storage _self,\\n uint40 _index\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n _self.deleteElementsAfterInclusive(\\n _index,\\n ctx.extraData\\n );\\n }\\n\\n /**\\n * Retrieves the current global index.\\n * @param _self Buffer to access.\\n * @return Current global index.\\n */\\n function getLength(\\n RingBuffer storage _self\\n )\\n internal\\n view\\n returns (\\n uint40\\n )\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n return ctx.globalIndex;\\n }\\n\\n /**\\n * Changes current global extra data.\\n * @param _self Buffer to access.\\n * @param _extraData New global extra data.\\n */\\n function setExtraData(\\n RingBuffer storage _self,\\n bytes27 _extraData\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Retrieves the current global extra data.\\n * @param _self Buffer to access.\\n * @return Current global extra data.\\n */\\n function getExtraData(\\n RingBuffer storage _self\\n )\\n internal\\n view\\n returns (\\n bytes27\\n )\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n return ctx.extraData;\\n }\\n\\n /**\\n * Sets the current ring buffer context.\\n * @param _self Buffer to access.\\n * @param _ctx Current ring buffer context.\\n */\\n function setContext(\\n RingBuffer storage _self,\\n RingBufferContext memory _ctx\\n )\\n internal\\n {\\n bytes32 contextA;\\n bytes32 contextB;\\n\\n uint40 globalIndex = _ctx.globalIndex;\\n bytes27 extraData = _ctx.extraData;\\n assembly {\\n contextA := globalIndex\\n contextA := or(contextA, extraData)\\n }\\n\\n uint64 currBufferIndex = _ctx.currBufferIndex;\\n uint40 prevResetIndex = _ctx.prevResetIndex;\\n uint40 currResetIndex = _ctx.currResetIndex;\\n assembly {\\n contextB := currBufferIndex\\n contextB := or(contextB, shl(64, prevResetIndex))\\n contextB := or(contextB, shl(104, currResetIndex))\\n }\\n\\n if (_self.contextA != contextA) {\\n _self.contextA = contextA;\\n }\\n\\n if (_self.contextB != contextB) {\\n _self.contextB = contextB;\\n }\\n }\\n\\n /**\\n * Retrieves the current ring buffer context.\\n * @param _self Buffer to access.\\n * @return Current ring buffer context.\\n */\\n function getContext(\\n RingBuffer storage _self\\n )\\n internal\\n view\\n returns (\\n RingBufferContext memory\\n )\\n {\\n bytes32 contextA = _self.contextA;\\n bytes32 contextB = _self.contextB;\\n\\n uint40 globalIndex;\\n bytes27 extraData;\\n assembly {\\n globalIndex := and(contextA, 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF)\\n extraData := and(contextA, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000)\\n }\\n\\n uint64 currBufferIndex;\\n uint40 prevResetIndex;\\n uint40 currResetIndex;\\n assembly {\\n currBufferIndex := and(contextB, 0x000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF)\\n prevResetIndex := shr(64, and(contextB, 0x00000000000000000000000000000000000000FFFFFFFFFF0000000000000000))\\n currResetIndex := shr(104, and(contextB, 0x0000000000000000000000000000FFFFFFFFFF00000000000000000000000000))\\n }\\n\\n return RingBufferContext({\\n globalIndex: globalIndex,\\n extraData: extraData,\\n currBufferIndex: currBufferIndex,\\n prevResetIndex: prevResetIndex,\\n currResetIndex: currResetIndex\\n });\\n }\\n\\n /**\\n * Retrieves the a buffer from the ring buffer by index.\\n * @param _self Buffer to access.\\n * @param _which Index of the sub buffer to access.\\n * @return Sub buffer for the index.\\n */\\n function getBuffer(\\n RingBuffer storage _self,\\n uint256 _which\\n )\\n internal\\n view\\n returns (\\n Buffer storage\\n )\\n {\\n return _which % 2 == 0 ? _self.bufferA : _self.bufferB;\\n }\\n}\\n\",\"keccak256\":\"0xe30fc56d4499f98582e1f800dfa3b343f171163a557266c31a56449d5fd3ffae\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x60806040523480156200001157600080fd5b506040516200118d3803806200118d833981810160405260408110156200003757600080fd5b8151602083018051604051929492938301929190846401000000008211156200005f57600080fd5b9083019060208201858111156200007557600080fd5b82516401000000008111828201881017156200009057600080fd5b82525081516020918201929091019080838360005b83811015620000bf578181015183820152602001620000a5565b50505050905090810190601f168015620000ed5780820380516001836020036101000a031916815260200191505b506040525050600080546001600160a01b0319166001600160a01b038516179055508051620001249060019060208401906200012d565b505050620001d9565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282620001655760008555620001b0565b82601f106200018057805160ff1916838001178555620001b0565b82800160010185558215620001b0579182015b82811115620001b057825182559160200191906001019062000193565b50620001be929150620001c2565b5090565b5b80821115620001be5760008155600101620001c3565b610fa480620001e96000396000f3fe608060405234801561001057600080fd5b50600436106100b45760003560e01c80634651d91e116100715780634651d91e1461021a5780638da5cb5b146102375780639507d39a146102b4578063b298e36b146102d1578063ccf8f969146102ee578063fa9e936c14610311576100b4565b8063167fd681146100b95780631f7b6d32146100e65780632015276c1461010057806329061de21461012b578063299ca47814610150578063461a447814610174575b600080fd5b6100e4600480360360408110156100cf57600080fd5b508035906020013564ffffffffff191661032e565b005b6100ee610423565b60408051918252519081900360200190f35b6100e46004803603604081101561011657600080fd5b508035906020013564ffffffffff191661043b565b6100e46004803603602081101561014157600080fd5b503564ffffffffff19166104f7565b6101586105b5565b604080516001600160a01b039092168252519081900360200190f35b6101586004803603602081101561018a57600080fd5b8101906020810181356401000000008111156101a557600080fd5b8201836020820111156101b757600080fd5b803590602001918460018302840111640100000000831117156101d957600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506105c4945050505050565b6100e46004803603602081101561023057600080fd5b50356106a0565b61023f61075b565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610279578181015183820152602001610261565b50505050905090810190601f1680156102a65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6100ee600480360360208110156102ca57600080fd5b50356107e8565b6100e4600480360360208110156102e757600080fd5b5035610802565b6102f66108bd565b6040805164ffffffffff199092168252519081900360200190f35b6100e46004803603602081101561032757600080fd5b50356108ce565b60018054604080516020601f6002600019610100878916150201909516949094049384018190048102820181019092528281526103c493909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b820191906000526020600020905b81548152906001019060200180831161039d57829003601f168201915b50505050506105c4565b6001600160a01b0316336001600160a01b0316146104135760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b61041f60028383610983565b5050565b600061042f6002610a75565b64ffffffffff16905090565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261049c93909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146104eb5760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b61041f60028383610a89565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261055893909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146105a75760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b6105b2600282610b90565b50565b6000546001600160a01b031681565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b8381101561062457818101518382015260200161060c565b50505050905090810190601f1680156106515780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561066e57600080fd5b505afa158015610682573d6000803e3d6000fd5b505050506040513d602081101561069857600080fd5b505192915050565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261070193909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146107505760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b6105b2600282610bba565b60018054604080516020600284861615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156107e05780601f106107b5576101008083540402835291602001916107e0565b820191906000526020600020905b8154815290600101906020018083116107c357829003601f168201915b505050505081565b60006107fc600264ffffffffff8416610be0565b92915050565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261086393909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146108b25760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b6105b2600282610de9565b60006108c96002610e0f565b905090565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261092f93909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b03161461097e5760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b600855565b600061098e84610e26565b9050806000015164ffffffffff168364ffffffffff161080156109c35750806060015164ffffffffff168364ffffffffff1610155b610a0b576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b806080015164ffffffffff168364ffffffffff161015610a4d576040810180516000190167ffffffffffffffff169052606081015164ffffffffff1660808201525b64ffffffffff8316815264ffffffffff1982166020820152610a6f8482610e86565b50505050565b600080610a8183610e26565b519392505050565b6000610a9484610e26565b90506000610ab9826040015167ffffffffffffffff1686610edc90919063ffffffff16565b8054909150610ac757601081555b8054608083015183510364ffffffffff1610610b3e578460060154826080015164ffffffffff161015610b365760408201805160010167ffffffffffffffff169081905260808301805164ffffffffff90811660608601528451169052610b2f908690610edc565b9050610b3e565b805460020281555b608082015182510364ffffffffff9081166000818152600184810160209081526040909220889055855101909216845264ffffffffff19851691840191909152610b888684610e86565b505050505050565b6000610b9b83610e26565b64ffffffffff19831660208201529050610bb58382610e86565b505050565b6000610bc583610e26565b9050610bb5828260200151856109839092919063ffffffff16565b600080610bec84610e26565b805190915064ffffffffff168310610c42576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b6000610c65826040015167ffffffffffffffff1686610edc90919063ffffffff16565b90506000610c8d836040015160010167ffffffffffffffff1687610edc90919063ffffffff16565b9050826080015164ffffffffff168510610d1a576080830151825464ffffffffff9091168603908110610cfe576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b6000908152600190920160205250604090205491506107fc9050565b6080830151606084015164ffffffffff9182168781039290911610610d7d576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b8154811115610dca576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b81540360009081526001909101602052604090205492506107fc915050565b6000610df483610e26565b9050610bb582826020015185610a899092919063ffffffff16565b600080610e1b83610e26565b602001519392505050565b610e2e610efc565b5080546001909101546040805160a08101825264ffffffffff808516825264ffffffffff19909416602082015267ffffffffffffffff8316818301529082901c8316606082015260689190911c909116608082015290565b80516020820151604080840151606085015160808601518754858717969483901b8417606883901b1795939291908714610ebe578689555b85896001015414610ed157600189018690555b505050505050505050565b60006002820615610ef05782600401610ef5565b826002015b9392505050565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091529056fe4f564d5f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2063616e206f6e6c792062652063616c6c656420627920746865206f776e65722ea2646970667358221220376cbc00341dd082d644157f6511fcd1ac26a6a924d04ae6532cfcab93d9191864736f6c63430007060033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100b45760003560e01c80634651d91e116100715780634651d91e1461021a5780638da5cb5b146102375780639507d39a146102b4578063b298e36b146102d1578063ccf8f969146102ee578063fa9e936c14610311576100b4565b8063167fd681146100b95780631f7b6d32146100e65780632015276c1461010057806329061de21461012b578063299ca47814610150578063461a447814610174575b600080fd5b6100e4600480360360408110156100cf57600080fd5b508035906020013564ffffffffff191661032e565b005b6100ee610423565b60408051918252519081900360200190f35b6100e46004803603604081101561011657600080fd5b508035906020013564ffffffffff191661043b565b6100e46004803603602081101561014157600080fd5b503564ffffffffff19166104f7565b6101586105b5565b604080516001600160a01b039092168252519081900360200190f35b6101586004803603602081101561018a57600080fd5b8101906020810181356401000000008111156101a557600080fd5b8201836020820111156101b757600080fd5b803590602001918460018302840111640100000000831117156101d957600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506105c4945050505050565b6100e46004803603602081101561023057600080fd5b50356106a0565b61023f61075b565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610279578181015183820152602001610261565b50505050905090810190601f1680156102a65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6100ee600480360360208110156102ca57600080fd5b50356107e8565b6100e4600480360360208110156102e757600080fd5b5035610802565b6102f66108bd565b6040805164ffffffffff199092168252519081900360200190f35b6100e46004803603602081101561032757600080fd5b50356108ce565b60018054604080516020601f6002600019610100878916150201909516949094049384018190048102820181019092528281526103c493909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b820191906000526020600020905b81548152906001019060200180831161039d57829003601f168201915b50505050506105c4565b6001600160a01b0316336001600160a01b0316146104135760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b61041f60028383610983565b5050565b600061042f6002610a75565b64ffffffffff16905090565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261049c93909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146104eb5760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b61041f60028383610a89565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261055893909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146105a75760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b6105b2600282610b90565b50565b6000546001600160a01b031681565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b8381101561062457818101518382015260200161060c565b50505050905090810190601f1680156106515780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561066e57600080fd5b505afa158015610682573d6000803e3d6000fd5b505050506040513d602081101561069857600080fd5b505192915050565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261070193909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146107505760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b6105b2600282610bba565b60018054604080516020600284861615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156107e05780601f106107b5576101008083540402835291602001916107e0565b820191906000526020600020905b8154815290600101906020018083116107c357829003601f168201915b505050505081565b60006107fc600264ffffffffff8416610be0565b92915050565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261086393909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146108b25760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b6105b2600282610de9565b60006108c96002610e0f565b905090565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261092f93909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b03161461097e5760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b600855565b600061098e84610e26565b9050806000015164ffffffffff168364ffffffffff161080156109c35750806060015164ffffffffff168364ffffffffff1610155b610a0b576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b806080015164ffffffffff168364ffffffffff161015610a4d576040810180516000190167ffffffffffffffff169052606081015164ffffffffff1660808201525b64ffffffffff8316815264ffffffffff1982166020820152610a6f8482610e86565b50505050565b600080610a8183610e26565b519392505050565b6000610a9484610e26565b90506000610ab9826040015167ffffffffffffffff1686610edc90919063ffffffff16565b8054909150610ac757601081555b8054608083015183510364ffffffffff1610610b3e578460060154826080015164ffffffffff161015610b365760408201805160010167ffffffffffffffff169081905260808301805164ffffffffff90811660608601528451169052610b2f908690610edc565b9050610b3e565b805460020281555b608082015182510364ffffffffff9081166000818152600184810160209081526040909220889055855101909216845264ffffffffff19851691840191909152610b888684610e86565b505050505050565b6000610b9b83610e26565b64ffffffffff19831660208201529050610bb58382610e86565b505050565b6000610bc583610e26565b9050610bb5828260200151856109839092919063ffffffff16565b600080610bec84610e26565b805190915064ffffffffff168310610c42576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b6000610c65826040015167ffffffffffffffff1686610edc90919063ffffffff16565b90506000610c8d836040015160010167ffffffffffffffff1687610edc90919063ffffffff16565b9050826080015164ffffffffff168510610d1a576080830151825464ffffffffff9091168603908110610cfe576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b6000908152600190920160205250604090205491506107fc9050565b6080830151606084015164ffffffffff9182168781039290911610610d7d576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b8154811115610dca576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b81540360009081526001909101602052604090205492506107fc915050565b6000610df483610e26565b9050610bb582826020015185610a899092919063ffffffff16565b600080610e1b83610e26565b602001519392505050565b610e2e610efc565b5080546001909101546040805160a08101825264ffffffffff808516825264ffffffffff19909416602082015267ffffffffffffffff8316818301529082901c8316606082015260689190911c909116608082015290565b80516020820151604080840151606085015160808601518754858717969483901b8417606883901b1795939291908714610ebe578689555b85896001015414610ed157600189018690555b505050505050505050565b60006002820615610ef05782600401610ef5565b826002015b9392505050565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091529056fe4f564d5f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2063616e206f6e6c792062652063616c6c656420627920746865206f776e65722ea2646970667358221220376cbc00341dd082d644157f6511fcd1ac26a6a924d04ae6532cfcab93d9191864736f6c63430007060033", + "devdoc": { + "details": "The Chain Storage Container provides its owner contract with read, write and delete functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which can no longer be used in a fraud proof due to the fraud window having passed, and the associated chain state or transactions being finalized. Three distinct Chain Storage Containers will be deployed on Layer 1: 1. Stores transaction batches for the Canonical Transaction Chain 2. Stores queued transactions for the Canonical Transaction Chain 3. Stores chain state batches for the State Commitment Chain Compiler used: solc Runtime target: EVM", + "kind": "dev", + "methods": { + "constructor": { + "params": { + "_libAddressManager": "Address of the Address Manager.", + "_owner": "Name of the contract that owns this container (will be resolved later)." + } + }, + "deleteElementsAfterInclusive(uint256)": { + "params": { + "_index": "Object index to delete from." + } + }, + "deleteElementsAfterInclusive(uint256,bytes27)": { + "params": { + "_globalMetadata": "New global metadata for the container.", + "_index": "Object index to delete from." + } + }, + "get(uint256)": { + "params": { + "_index": "Index of the particular object to access." + }, + "returns": { + "_0": "32 byte object value." + } + }, + "getGlobalMetadata()": { + "returns": { + "_0": "Container global metadata field." + } + }, + "length()": { + "returns": { + "_0": "Number of objects in the container." + } + }, + "push(bytes32)": { + "params": { + "_object": "A 32 byte value to insert into the container." + } + }, + "push(bytes32,bytes27)": { + "params": { + "_globalMetadata": "New global metadata for the container.", + "_object": "A 32 byte value to insert into the container." + } + }, + "resolve(string)": { + "params": { + "_name": "Name to resolve an address for." + }, + "returns": { + "_0": "Address associated with the given name." + } + }, + "setGlobalMetadata(bytes27)": { + "params": { + "_globalMetadata": "New global metadata to set." + } + } + }, + "title": "OVM_ChainStorageContainer", + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": { + "deleteElementsAfterInclusive(uint256)": { + "notice": "Removes all objects after and including a given index." + }, + "deleteElementsAfterInclusive(uint256,bytes27)": { + "notice": "Removes all objects after and including a given index. Also allows setting the global metadata field." + }, + "get(uint256)": { + "notice": "Retrieves an object from the container." + }, + "getGlobalMetadata()": { + "notice": "Retrieves the container's global metadata field." + }, + "length()": { + "notice": "Retrieves the number of objects stored in the container." + }, + "push(bytes32)": { + "notice": "Pushes an object into the container." + }, + "push(bytes32,bytes27)": { + "notice": "Pushes an object into the container. Function allows setting the global metadata since we'll need to touch the \"length\" storage slot anyway, which also contains the global metadata (it's an optimization)." + }, + "resolve(string)": { + "notice": "Resolves the address associated with a given name." + }, + "setGlobalMetadata(bytes27)": { + "notice": "Sets the container's global metadata field. We're using `bytes27` here because we use five bytes to maintain the length of the underlying data structure, meaning we have an extra 27 bytes to store arbitrary data." + }, + "setNextOverwritableIndex(uint256)": { + "notice": "Marks an index as overwritable, meaing the underlying buffer can start to write values over any objects before and including the given index." + } + }, + "version": 1 + }, + "storageLayout": { + "storage": [ + { + "astId": 12800, + "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", + "label": "libAddressManager", + "offset": 0, + "slot": "0", + "type": "t_contract(Lib_AddressManager)12793" + }, + { + "astId": 4466, + "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", + "label": "owner", + "offset": 0, + "slot": "1", + "type": "t_string_storage" + }, + { + "astId": 4468, + "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", + "label": "buffer", + "offset": 0, + "slot": "2", + "type": "t_struct(RingBuffer)17846_storage" + } + ], + "types": { + "t_bytes32": { + "encoding": "inplace", + "label": "bytes32", + "numberOfBytes": "32" + }, + "t_contract(Lib_AddressManager)12793": { + "encoding": "inplace", + "label": "contract Lib_AddressManager", + "numberOfBytes": "20" + }, + "t_mapping(t_uint256,t_bytes32)": { + "encoding": "mapping", + "key": "t_uint256", + "label": "mapping(uint256 => bytes32)", + "numberOfBytes": "32", + "value": "t_bytes32" + }, + "t_string_storage": { + "encoding": "bytes", + "label": "string", + "numberOfBytes": "32" + }, + "t_struct(Buffer)17835_storage": { + "encoding": "inplace", + "label": "struct Lib_RingBuffer.Buffer", + "members": [ + { + "astId": 17830, + "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", + "label": "length", + "offset": 0, + "slot": "0", + "type": "t_uint256" + }, + { + "astId": 17834, + "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", + "label": "buf", + "offset": 0, + "slot": "1", + "type": "t_mapping(t_uint256,t_bytes32)" + } + ], + "numberOfBytes": "64" + }, + "t_struct(RingBuffer)17846_storage": { + "encoding": "inplace", + "label": "struct Lib_RingBuffer.RingBuffer", + "members": [ + { + "astId": 17837, + "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", + "label": "contextA", + "offset": 0, + "slot": "0", + "type": "t_bytes32" + }, + { + "astId": 17839, + "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", + "label": "contextB", + "offset": 0, + "slot": "1", + "type": "t_bytes32" + }, + { + "astId": 17841, + "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", + "label": "bufferA", + "offset": 0, + "slot": "2", + "type": "t_struct(Buffer)17835_storage" + }, + { + "astId": 17843, + "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", + "label": "bufferB", + "offset": 0, + "slot": "4", + "type": "t_struct(Buffer)17835_storage" + }, + { + "astId": 17845, + "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", + "label": "nextOverwritableIndex", + "offset": 0, + "slot": "6", + "type": "t_uint256" + } + ], + "numberOfBytes": "224" + }, + "t_uint256": { + "encoding": "inplace", + "label": "uint256", + "numberOfBytes": "32" + } + } + } +} \ No newline at end of file diff --git a/packages/contracts/deployments/kovan-v3/OVM_ChainStorageContainer:CTC:queue.json b/packages/contracts/deployments/kovan-v3/OVM_ChainStorageContainer:CTC:queue.json new file mode 100644 index 0000000000000..663815c631efb --- /dev/null +++ b/packages/contracts/deployments/kovan-v3/OVM_ChainStorageContainer:CTC:queue.json @@ -0,0 +1,453 @@ +{ + "address": "0x207fa9Aa7Dee9AA790A8DF64778D3E3B6273BC90", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_libAddressManager", + "type": "address" + }, + { + "internalType": "string", + "name": "_owner", + "type": "string" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_index", + "type": "uint256" + }, + { + "internalType": "bytes27", + "name": "_globalMetadata", + "type": "bytes27" + } + ], + "name": "deleteElementsAfterInclusive", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_index", + "type": "uint256" + } + ], + "name": "deleteElementsAfterInclusive", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_index", + "type": "uint256" + } + ], + "name": "get", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getGlobalMetadata", + "outputs": [ + { + "internalType": "bytes27", + "name": "", + "type": "bytes27" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "length", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "libAddressManager", + "outputs": [ + { + "internalType": "contract Lib_AddressManager", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_object", + "type": "bytes32" + }, + { + "internalType": "bytes27", + "name": "_globalMetadata", + "type": "bytes27" + } + ], + "name": "push", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_object", + "type": "bytes32" + } + ], + "name": "push", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "_name", + "type": "string" + } + ], + "name": "resolve", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes27", + "name": "_globalMetadata", + "type": "bytes27" + } + ], + "name": "setGlobalMetadata", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_index", + "type": "uint256" + } + ], + "name": "setNextOverwritableIndex", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "transactionHash": "0x131733524a44e43d5ae59ec1eba4fe60c893da9cc9f38e501d35a5b3c8cf1310", + "receipt": { + "to": null, + "from": "0x18394B52d3Cb931dfA76F63251919D051953413d", + "contractAddress": "0x207fa9Aa7Dee9AA790A8DF64778D3E3B6273BC90", + "transactionIndex": 1, + "gasUsed": "968390", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0x3f742457c998e215c0a89528d46d770ba3f2c9d49f791673bc07501ede825f8d", + "transactionHash": "0x131733524a44e43d5ae59ec1eba4fe60c893da9cc9f38e501d35a5b3c8cf1310", + "logs": [], + "blockNumber": 24572792, + "cumulativeGasUsed": "1010846", + "status": 1, + "byzantium": true + }, + "args": [ + "0xd56F695e73286ac252A37593DD4E7c14270eC1Df", + "OVM_CanonicalTransactionChain" + ], + "solcInputHash": "5ee8e508e2c54cb5ac6783b4855b1558", + "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_owner\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"get\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getGlobalMetadata\",\"outputs\":[{\"internalType\":\"bytes27\",\"name\":\"\",\"type\":\"bytes27\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"length\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"setGlobalMetadata\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"setNextOverwritableIndex\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The Chain Storage Container provides its owner contract with read, write and delete functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which can no longer be used in a fraud proof due to the fraud window having passed, and the associated chain state or transactions being finalized. Three distinct Chain Storage Containers will be deployed on Layer 1: 1. Stores transaction batches for the Canonical Transaction Chain 2. Stores queued transactions for the Canonical Transaction Chain 3. Stores chain state batches for the State Commitment Chain Compiler used: solc Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\",\"_owner\":\"Name of the contract that owns this container (will be resolved later).\"}},\"deleteElementsAfterInclusive(uint256)\":{\"params\":{\"_index\":\"Object index to delete from.\"}},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_index\":\"Object index to delete from.\"}},\"get(uint256)\":{\"params\":{\"_index\":\"Index of the particular object to access.\"},\"returns\":{\"_0\":\"32 byte object value.\"}},\"getGlobalMetadata()\":{\"returns\":{\"_0\":\"Container global metadata field.\"}},\"length()\":{\"returns\":{\"_0\":\"Number of objects in the container.\"}},\"push(bytes32)\":{\"params\":{\"_object\":\"A 32 byte value to insert into the container.\"}},\"push(bytes32,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_object\":\"A 32 byte value to insert into the container.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}},\"setGlobalMetadata(bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata to set.\"}}},\"title\":\"OVM_ChainStorageContainer\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"deleteElementsAfterInclusive(uint256)\":{\"notice\":\"Removes all objects after and including a given index.\"},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"notice\":\"Removes all objects after and including a given index. Also allows setting the global metadata field.\"},\"get(uint256)\":{\"notice\":\"Retrieves an object from the container.\"},\"getGlobalMetadata()\":{\"notice\":\"Retrieves the container's global metadata field.\"},\"length()\":{\"notice\":\"Retrieves the number of objects stored in the container.\"},\"push(bytes32)\":{\"notice\":\"Pushes an object into the container.\"},\"push(bytes32,bytes27)\":{\"notice\":\"Pushes an object into the container. Function allows setting the global metadata since we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global metadata (it's an optimization).\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"},\"setGlobalMetadata(bytes27)\":{\"notice\":\"Sets the container's global metadata field. We're using `bytes27` here because we use five bytes to maintain the length of the underlying data structure, meaning we have an extra 27 bytes to store arbitrary data.\"},\"setNextOverwritableIndex(uint256)\":{\"notice\":\"Marks an index as overwritable, meaing the underlying buffer can start to write values over any objects before and including the given index.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol\":\"OVM_ChainStorageContainer\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor () internal {\\n address msgSender = _msgSender();\\n _owner = msgSender;\\n emit OwnershipTransferred(address(0), msgSender);\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n emit OwnershipTransferred(_owner, address(0));\\n _owner = address(0);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n emit OwnershipTransferred(_owner, newOwner);\\n _owner = newOwner;\\n }\\n}\\n\",\"keccak256\":\"0x15e2d5bd4c28a88548074c54d220e8086f638a71ed07e6b3ba5a70066fcf458d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with GSN meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address payable) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes memory) {\\n this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x8d3cb350f04ff49cfb10aef08d87f19dcbaecc8027b0bed12f3275cd12f38cf0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_RingBuffer } from \\\"../../libraries/utils/Lib_RingBuffer.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_ChainStorageContainer } from \\\"../../iOVM/chain/iOVM_ChainStorageContainer.sol\\\";\\n\\n/**\\n * @title OVM_ChainStorageContainer\\n * @dev The Chain Storage Container provides its owner contract with read, write and delete functionality.\\n * This provides gas efficiency gains by enabling it to overwrite storage slots which can no longer be used\\n * in a fraud proof due to the fraud window having passed, and the associated chain state or\\n * transactions being finalized.\\n * Three distinct Chain Storage Containers will be deployed on Layer 1:\\n * 1. Stores transaction batches for the Canonical Transaction Chain\\n * 2. Stores queued transactions for the Canonical Transaction Chain\\n * 3. Stores chain state batches for the State Commitment Chain\\n *\\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract OVM_ChainStorageContainer is iOVM_ChainStorageContainer, Lib_AddressResolver {\\n\\n /*************\\n * Libraries *\\n *************/\\n\\n using Lib_RingBuffer for Lib_RingBuffer.RingBuffer;\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n string public owner;\\n Lib_RingBuffer.RingBuffer internal buffer;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n * @param _owner Name of the contract that owns this container (will be resolved later).\\n */\\n constructor(\\n address _libAddressManager,\\n string memory _owner\\n )\\n Lib_AddressResolver(_libAddressManager)\\n {\\n owner = _owner;\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n msg.sender == resolve(owner),\\n \\\"OVM_ChainStorageContainer: Function can only be called by the owner.\\\"\\n );\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function setGlobalMetadata(\\n bytes27 _globalMetadata\\n )\\n override\\n public\\n onlyOwner\\n {\\n return buffer.setExtraData(_globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function getGlobalMetadata()\\n override\\n public\\n view\\n returns (\\n bytes27\\n )\\n {\\n return buffer.getExtraData();\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function length()\\n override\\n public\\n view\\n returns (\\n uint256\\n )\\n {\\n return uint256(buffer.getLength());\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function push(\\n bytes32 _object\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.push(_object);\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function push(\\n bytes32 _object,\\n bytes27 _globalMetadata\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.push(_object, _globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function get(\\n uint256 _index\\n )\\n override\\n public\\n view\\n returns (\\n bytes32\\n )\\n {\\n return buffer.get(uint40(_index));\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.deleteElementsAfterInclusive(\\n uint40(_index)\\n );\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index,\\n bytes27 _globalMetadata\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.deleteElementsAfterInclusive(\\n uint40(_index),\\n _globalMetadata\\n );\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function setNextOverwritableIndex(\\n uint256 _index\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.nextOverwritableIndex = _index;\\n }\\n}\\n\",\"keccak256\":\"0x93325c961516aa2a22bf1aacf4029353d5e3b693e04b485753170337b50224e6\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_ChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title iOVM_ChainStorageContainer\\n */\\ninterface iOVM_ChainStorageContainer {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata()\\n external\\n view\\n returns (\\n bytes27\\n );\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length()\\n external\\n view\\n returns (\\n uint256\\n );\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(\\n bytes32 _object\\n )\\n external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(\\n bytes32 _object,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(\\n uint256 _index\\n )\\n external\\n view\\n returns (\\n bytes32\\n );\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index\\n )\\n external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Marks an index as overwritable, meaing the underlying buffer can start to write values over\\n * any objects before and including the given index.\\n */\\n function setNextOverwritableIndex(\\n uint256 _index\\n )\\n external;\\n}\\n\",\"keccak256\":\"0x2d7973a0ad84c23ec62624d3f1e3aeb198cc72686ff1e6cfa17155556b320c94\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n public\\n onlyOwner\\n {\\n addresses[_getNameHash(_name)] = _address;\\n\\n emit AddressSet(\\n _name,\\n _address\\n );\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0x2ce671a0e004df88b136bea5a3c59d0732cea8887c8496da1d509e0200b03d7d\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(\\n address _libAddressManager\\n ) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x65981feeabff6a81783ea97d44baf988a18a86c8cb374c46fdb71819cbacc7c0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_RingBuffer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\nlibrary Lib_RingBuffer {\\n using Lib_RingBuffer for RingBuffer;\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Buffer {\\n uint256 length;\\n mapping (uint256 => bytes32) buf;\\n }\\n\\n struct RingBuffer {\\n bytes32 contextA;\\n bytes32 contextB;\\n Buffer bufferA;\\n Buffer bufferB;\\n uint256 nextOverwritableIndex;\\n }\\n\\n struct RingBufferContext {\\n // contextA\\n uint40 globalIndex;\\n bytes27 extraData;\\n\\n // contextB\\n uint64 currBufferIndex;\\n uint40 prevResetIndex;\\n uint40 currResetIndex;\\n }\\n\\n\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 constant MIN_CAPACITY = 16;\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n * @param _extraData Optional global extra data.\\n */\\n function push(\\n RingBuffer storage _self,\\n bytes32 _value,\\n bytes27 _extraData\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n Buffer storage currBuffer = _self.getBuffer(ctx.currBufferIndex);\\n\\n // Set a minimum capacity.\\n if (currBuffer.length == 0) {\\n currBuffer.length = MIN_CAPACITY;\\n }\\n\\n // Check if we need to expand the buffer.\\n if (ctx.globalIndex - ctx.currResetIndex >= currBuffer.length) {\\n if (ctx.currResetIndex < _self.nextOverwritableIndex) {\\n // We're going to overwrite the inactive buffer.\\n // Bump the buffer index, reset the delete offset, and set our reset indices.\\n ctx.currBufferIndex++;\\n ctx.prevResetIndex = ctx.currResetIndex;\\n ctx.currResetIndex = ctx.globalIndex;\\n\\n // Swap over to the next buffer.\\n currBuffer = _self.getBuffer(ctx.currBufferIndex);\\n } else {\\n // We're not overwriting yet, double the length of the current buffer.\\n currBuffer.length *= 2;\\n }\\n }\\n\\n // Index to write to is the difference of the global and reset indices.\\n uint256 writeHead = ctx.globalIndex - ctx.currResetIndex;\\n currBuffer.buf[writeHead] = _value;\\n\\n // Bump the global index and insert our extra data, then save the context.\\n ctx.globalIndex++;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n */\\n function push(\\n RingBuffer storage _self,\\n bytes32 _value\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n\\n _self.push(\\n _value,\\n ctx.extraData\\n );\\n }\\n\\n /**\\n * Retrieves an element from the buffer.\\n * @param _self Buffer to access.\\n * @param _index Element index to retrieve.\\n * @return Value of the element at the given index.\\n */\\n function get(\\n RingBuffer storage _self,\\n uint256 _index\\n )\\n internal\\n view\\n returns (\\n bytes32\\n )\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n\\n require(\\n _index < ctx.globalIndex,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n Buffer storage currBuffer = _self.getBuffer(ctx.currBufferIndex);\\n Buffer storage prevBuffer = _self.getBuffer(ctx.currBufferIndex + 1);\\n\\n if (_index >= ctx.currResetIndex) {\\n // We're trying to load an element from the current buffer.\\n // Relative index is just the difference from the reset index.\\n uint256 relativeIndex = _index - ctx.currResetIndex;\\n\\n // Shouldn't happen but why not check.\\n require(\\n relativeIndex < currBuffer.length,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n return currBuffer.buf[relativeIndex];\\n } else {\\n // We're trying to load an element from the previous buffer.\\n // Relative index is the difference from the reset index in the other direction.\\n uint256 relativeIndex = ctx.currResetIndex - _index;\\n\\n // Condition only fails in the case that we deleted and flipped buffers.\\n require(\\n ctx.currResetIndex > ctx.prevResetIndex,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n // Make sure we're not trying to read beyond the array.\\n require(\\n relativeIndex <= prevBuffer.length,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n return prevBuffer.buf[prevBuffer.length - relativeIndex];\\n }\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n * @param _extraData Optional global extra data.\\n */\\n function deleteElementsAfterInclusive(\\n RingBuffer storage _self,\\n uint40 _index,\\n bytes27 _extraData\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n\\n require(\\n _index < ctx.globalIndex && _index >= ctx.prevResetIndex,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n if (_index < ctx.currResetIndex) {\\n // We're switching back to the previous buffer.\\n // Reduce the buffer index, set the current reset index back to match the previous one.\\n // We use the equality of these two values to prevent reading beyond this buffer.\\n ctx.currBufferIndex--;\\n ctx.currResetIndex = ctx.prevResetIndex;\\n }\\n\\n // Set our global index and extra data, save the context.\\n ctx.globalIndex = _index;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n */\\n function deleteElementsAfterInclusive(\\n RingBuffer storage _self,\\n uint40 _index\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n _self.deleteElementsAfterInclusive(\\n _index,\\n ctx.extraData\\n );\\n }\\n\\n /**\\n * Retrieves the current global index.\\n * @param _self Buffer to access.\\n * @return Current global index.\\n */\\n function getLength(\\n RingBuffer storage _self\\n )\\n internal\\n view\\n returns (\\n uint40\\n )\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n return ctx.globalIndex;\\n }\\n\\n /**\\n * Changes current global extra data.\\n * @param _self Buffer to access.\\n * @param _extraData New global extra data.\\n */\\n function setExtraData(\\n RingBuffer storage _self,\\n bytes27 _extraData\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Retrieves the current global extra data.\\n * @param _self Buffer to access.\\n * @return Current global extra data.\\n */\\n function getExtraData(\\n RingBuffer storage _self\\n )\\n internal\\n view\\n returns (\\n bytes27\\n )\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n return ctx.extraData;\\n }\\n\\n /**\\n * Sets the current ring buffer context.\\n * @param _self Buffer to access.\\n * @param _ctx Current ring buffer context.\\n */\\n function setContext(\\n RingBuffer storage _self,\\n RingBufferContext memory _ctx\\n )\\n internal\\n {\\n bytes32 contextA;\\n bytes32 contextB;\\n\\n uint40 globalIndex = _ctx.globalIndex;\\n bytes27 extraData = _ctx.extraData;\\n assembly {\\n contextA := globalIndex\\n contextA := or(contextA, extraData)\\n }\\n\\n uint64 currBufferIndex = _ctx.currBufferIndex;\\n uint40 prevResetIndex = _ctx.prevResetIndex;\\n uint40 currResetIndex = _ctx.currResetIndex;\\n assembly {\\n contextB := currBufferIndex\\n contextB := or(contextB, shl(64, prevResetIndex))\\n contextB := or(contextB, shl(104, currResetIndex))\\n }\\n\\n if (_self.contextA != contextA) {\\n _self.contextA = contextA;\\n }\\n\\n if (_self.contextB != contextB) {\\n _self.contextB = contextB;\\n }\\n }\\n\\n /**\\n * Retrieves the current ring buffer context.\\n * @param _self Buffer to access.\\n * @return Current ring buffer context.\\n */\\n function getContext(\\n RingBuffer storage _self\\n )\\n internal\\n view\\n returns (\\n RingBufferContext memory\\n )\\n {\\n bytes32 contextA = _self.contextA;\\n bytes32 contextB = _self.contextB;\\n\\n uint40 globalIndex;\\n bytes27 extraData;\\n assembly {\\n globalIndex := and(contextA, 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF)\\n extraData := and(contextA, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000)\\n }\\n\\n uint64 currBufferIndex;\\n uint40 prevResetIndex;\\n uint40 currResetIndex;\\n assembly {\\n currBufferIndex := and(contextB, 0x000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF)\\n prevResetIndex := shr(64, and(contextB, 0x00000000000000000000000000000000000000FFFFFFFFFF0000000000000000))\\n currResetIndex := shr(104, and(contextB, 0x0000000000000000000000000000FFFFFFFFFF00000000000000000000000000))\\n }\\n\\n return RingBufferContext({\\n globalIndex: globalIndex,\\n extraData: extraData,\\n currBufferIndex: currBufferIndex,\\n prevResetIndex: prevResetIndex,\\n currResetIndex: currResetIndex\\n });\\n }\\n\\n /**\\n * Retrieves the a buffer from the ring buffer by index.\\n * @param _self Buffer to access.\\n * @param _which Index of the sub buffer to access.\\n * @return Sub buffer for the index.\\n */\\n function getBuffer(\\n RingBuffer storage _self,\\n uint256 _which\\n )\\n internal\\n view\\n returns (\\n Buffer storage\\n )\\n {\\n return _which % 2 == 0 ? _self.bufferA : _self.bufferB;\\n }\\n}\\n\",\"keccak256\":\"0xe30fc56d4499f98582e1f800dfa3b343f171163a557266c31a56449d5fd3ffae\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x60806040523480156200001157600080fd5b506040516200118d3803806200118d833981810160405260408110156200003757600080fd5b8151602083018051604051929492938301929190846401000000008211156200005f57600080fd5b9083019060208201858111156200007557600080fd5b82516401000000008111828201881017156200009057600080fd5b82525081516020918201929091019080838360005b83811015620000bf578181015183820152602001620000a5565b50505050905090810190601f168015620000ed5780820380516001836020036101000a031916815260200191505b506040525050600080546001600160a01b0319166001600160a01b038516179055508051620001249060019060208401906200012d565b505050620001d9565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282620001655760008555620001b0565b82601f106200018057805160ff1916838001178555620001b0565b82800160010185558215620001b0579182015b82811115620001b057825182559160200191906001019062000193565b50620001be929150620001c2565b5090565b5b80821115620001be5760008155600101620001c3565b610fa480620001e96000396000f3fe608060405234801561001057600080fd5b50600436106100b45760003560e01c80634651d91e116100715780634651d91e1461021a5780638da5cb5b146102375780639507d39a146102b4578063b298e36b146102d1578063ccf8f969146102ee578063fa9e936c14610311576100b4565b8063167fd681146100b95780631f7b6d32146100e65780632015276c1461010057806329061de21461012b578063299ca47814610150578063461a447814610174575b600080fd5b6100e4600480360360408110156100cf57600080fd5b508035906020013564ffffffffff191661032e565b005b6100ee610423565b60408051918252519081900360200190f35b6100e46004803603604081101561011657600080fd5b508035906020013564ffffffffff191661043b565b6100e46004803603602081101561014157600080fd5b503564ffffffffff19166104f7565b6101586105b5565b604080516001600160a01b039092168252519081900360200190f35b6101586004803603602081101561018a57600080fd5b8101906020810181356401000000008111156101a557600080fd5b8201836020820111156101b757600080fd5b803590602001918460018302840111640100000000831117156101d957600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506105c4945050505050565b6100e46004803603602081101561023057600080fd5b50356106a0565b61023f61075b565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610279578181015183820152602001610261565b50505050905090810190601f1680156102a65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6100ee600480360360208110156102ca57600080fd5b50356107e8565b6100e4600480360360208110156102e757600080fd5b5035610802565b6102f66108bd565b6040805164ffffffffff199092168252519081900360200190f35b6100e46004803603602081101561032757600080fd5b50356108ce565b60018054604080516020601f6002600019610100878916150201909516949094049384018190048102820181019092528281526103c493909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b820191906000526020600020905b81548152906001019060200180831161039d57829003601f168201915b50505050506105c4565b6001600160a01b0316336001600160a01b0316146104135760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b61041f60028383610983565b5050565b600061042f6002610a75565b64ffffffffff16905090565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261049c93909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146104eb5760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b61041f60028383610a89565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261055893909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146105a75760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b6105b2600282610b90565b50565b6000546001600160a01b031681565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b8381101561062457818101518382015260200161060c565b50505050905090810190601f1680156106515780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561066e57600080fd5b505afa158015610682573d6000803e3d6000fd5b505050506040513d602081101561069857600080fd5b505192915050565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261070193909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146107505760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b6105b2600282610bba565b60018054604080516020600284861615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156107e05780601f106107b5576101008083540402835291602001916107e0565b820191906000526020600020905b8154815290600101906020018083116107c357829003601f168201915b505050505081565b60006107fc600264ffffffffff8416610be0565b92915050565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261086393909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146108b25760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b6105b2600282610de9565b60006108c96002610e0f565b905090565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261092f93909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b03161461097e5760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b600855565b600061098e84610e26565b9050806000015164ffffffffff168364ffffffffff161080156109c35750806060015164ffffffffff168364ffffffffff1610155b610a0b576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b806080015164ffffffffff168364ffffffffff161015610a4d576040810180516000190167ffffffffffffffff169052606081015164ffffffffff1660808201525b64ffffffffff8316815264ffffffffff1982166020820152610a6f8482610e86565b50505050565b600080610a8183610e26565b519392505050565b6000610a9484610e26565b90506000610ab9826040015167ffffffffffffffff1686610edc90919063ffffffff16565b8054909150610ac757601081555b8054608083015183510364ffffffffff1610610b3e578460060154826080015164ffffffffff161015610b365760408201805160010167ffffffffffffffff169081905260808301805164ffffffffff90811660608601528451169052610b2f908690610edc565b9050610b3e565b805460020281555b608082015182510364ffffffffff9081166000818152600184810160209081526040909220889055855101909216845264ffffffffff19851691840191909152610b888684610e86565b505050505050565b6000610b9b83610e26565b64ffffffffff19831660208201529050610bb58382610e86565b505050565b6000610bc583610e26565b9050610bb5828260200151856109839092919063ffffffff16565b600080610bec84610e26565b805190915064ffffffffff168310610c42576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b6000610c65826040015167ffffffffffffffff1686610edc90919063ffffffff16565b90506000610c8d836040015160010167ffffffffffffffff1687610edc90919063ffffffff16565b9050826080015164ffffffffff168510610d1a576080830151825464ffffffffff9091168603908110610cfe576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b6000908152600190920160205250604090205491506107fc9050565b6080830151606084015164ffffffffff9182168781039290911610610d7d576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b8154811115610dca576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b81540360009081526001909101602052604090205492506107fc915050565b6000610df483610e26565b9050610bb582826020015185610a899092919063ffffffff16565b600080610e1b83610e26565b602001519392505050565b610e2e610efc565b5080546001909101546040805160a08101825264ffffffffff808516825264ffffffffff19909416602082015267ffffffffffffffff8316818301529082901c8316606082015260689190911c909116608082015290565b80516020820151604080840151606085015160808601518754858717969483901b8417606883901b1795939291908714610ebe578689555b85896001015414610ed157600189018690555b505050505050505050565b60006002820615610ef05782600401610ef5565b826002015b9392505050565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091529056fe4f564d5f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2063616e206f6e6c792062652063616c6c656420627920746865206f776e65722ea2646970667358221220376cbc00341dd082d644157f6511fcd1ac26a6a924d04ae6532cfcab93d9191864736f6c63430007060033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100b45760003560e01c80634651d91e116100715780634651d91e1461021a5780638da5cb5b146102375780639507d39a146102b4578063b298e36b146102d1578063ccf8f969146102ee578063fa9e936c14610311576100b4565b8063167fd681146100b95780631f7b6d32146100e65780632015276c1461010057806329061de21461012b578063299ca47814610150578063461a447814610174575b600080fd5b6100e4600480360360408110156100cf57600080fd5b508035906020013564ffffffffff191661032e565b005b6100ee610423565b60408051918252519081900360200190f35b6100e46004803603604081101561011657600080fd5b508035906020013564ffffffffff191661043b565b6100e46004803603602081101561014157600080fd5b503564ffffffffff19166104f7565b6101586105b5565b604080516001600160a01b039092168252519081900360200190f35b6101586004803603602081101561018a57600080fd5b8101906020810181356401000000008111156101a557600080fd5b8201836020820111156101b757600080fd5b803590602001918460018302840111640100000000831117156101d957600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506105c4945050505050565b6100e46004803603602081101561023057600080fd5b50356106a0565b61023f61075b565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610279578181015183820152602001610261565b50505050905090810190601f1680156102a65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6100ee600480360360208110156102ca57600080fd5b50356107e8565b6100e4600480360360208110156102e757600080fd5b5035610802565b6102f66108bd565b6040805164ffffffffff199092168252519081900360200190f35b6100e46004803603602081101561032757600080fd5b50356108ce565b60018054604080516020601f6002600019610100878916150201909516949094049384018190048102820181019092528281526103c493909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b820191906000526020600020905b81548152906001019060200180831161039d57829003601f168201915b50505050506105c4565b6001600160a01b0316336001600160a01b0316146104135760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b61041f60028383610983565b5050565b600061042f6002610a75565b64ffffffffff16905090565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261049c93909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146104eb5760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b61041f60028383610a89565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261055893909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146105a75760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b6105b2600282610b90565b50565b6000546001600160a01b031681565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b8381101561062457818101518382015260200161060c565b50505050905090810190601f1680156106515780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561066e57600080fd5b505afa158015610682573d6000803e3d6000fd5b505050506040513d602081101561069857600080fd5b505192915050565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261070193909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146107505760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b6105b2600282610bba565b60018054604080516020600284861615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156107e05780601f106107b5576101008083540402835291602001916107e0565b820191906000526020600020905b8154815290600101906020018083116107c357829003601f168201915b505050505081565b60006107fc600264ffffffffff8416610be0565b92915050565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261086393909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146108b25760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b6105b2600282610de9565b60006108c96002610e0f565b905090565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261092f93909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b03161461097e5760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b600855565b600061098e84610e26565b9050806000015164ffffffffff168364ffffffffff161080156109c35750806060015164ffffffffff168364ffffffffff1610155b610a0b576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b806080015164ffffffffff168364ffffffffff161015610a4d576040810180516000190167ffffffffffffffff169052606081015164ffffffffff1660808201525b64ffffffffff8316815264ffffffffff1982166020820152610a6f8482610e86565b50505050565b600080610a8183610e26565b519392505050565b6000610a9484610e26565b90506000610ab9826040015167ffffffffffffffff1686610edc90919063ffffffff16565b8054909150610ac757601081555b8054608083015183510364ffffffffff1610610b3e578460060154826080015164ffffffffff161015610b365760408201805160010167ffffffffffffffff169081905260808301805164ffffffffff90811660608601528451169052610b2f908690610edc565b9050610b3e565b805460020281555b608082015182510364ffffffffff9081166000818152600184810160209081526040909220889055855101909216845264ffffffffff19851691840191909152610b888684610e86565b505050505050565b6000610b9b83610e26565b64ffffffffff19831660208201529050610bb58382610e86565b505050565b6000610bc583610e26565b9050610bb5828260200151856109839092919063ffffffff16565b600080610bec84610e26565b805190915064ffffffffff168310610c42576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b6000610c65826040015167ffffffffffffffff1686610edc90919063ffffffff16565b90506000610c8d836040015160010167ffffffffffffffff1687610edc90919063ffffffff16565b9050826080015164ffffffffff168510610d1a576080830151825464ffffffffff9091168603908110610cfe576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b6000908152600190920160205250604090205491506107fc9050565b6080830151606084015164ffffffffff9182168781039290911610610d7d576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b8154811115610dca576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b81540360009081526001909101602052604090205492506107fc915050565b6000610df483610e26565b9050610bb582826020015185610a899092919063ffffffff16565b600080610e1b83610e26565b602001519392505050565b610e2e610efc565b5080546001909101546040805160a08101825264ffffffffff808516825264ffffffffff19909416602082015267ffffffffffffffff8316818301529082901c8316606082015260689190911c909116608082015290565b80516020820151604080840151606085015160808601518754858717969483901b8417606883901b1795939291908714610ebe578689555b85896001015414610ed157600189018690555b505050505050505050565b60006002820615610ef05782600401610ef5565b826002015b9392505050565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091529056fe4f564d5f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2063616e206f6e6c792062652063616c6c656420627920746865206f776e65722ea2646970667358221220376cbc00341dd082d644157f6511fcd1ac26a6a924d04ae6532cfcab93d9191864736f6c63430007060033", + "devdoc": { + "details": "The Chain Storage Container provides its owner contract with read, write and delete functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which can no longer be used in a fraud proof due to the fraud window having passed, and the associated chain state or transactions being finalized. Three distinct Chain Storage Containers will be deployed on Layer 1: 1. Stores transaction batches for the Canonical Transaction Chain 2. Stores queued transactions for the Canonical Transaction Chain 3. Stores chain state batches for the State Commitment Chain Compiler used: solc Runtime target: EVM", + "kind": "dev", + "methods": { + "constructor": { + "params": { + "_libAddressManager": "Address of the Address Manager.", + "_owner": "Name of the contract that owns this container (will be resolved later)." + } + }, + "deleteElementsAfterInclusive(uint256)": { + "params": { + "_index": "Object index to delete from." + } + }, + "deleteElementsAfterInclusive(uint256,bytes27)": { + "params": { + "_globalMetadata": "New global metadata for the container.", + "_index": "Object index to delete from." + } + }, + "get(uint256)": { + "params": { + "_index": "Index of the particular object to access." + }, + "returns": { + "_0": "32 byte object value." + } + }, + "getGlobalMetadata()": { + "returns": { + "_0": "Container global metadata field." + } + }, + "length()": { + "returns": { + "_0": "Number of objects in the container." + } + }, + "push(bytes32)": { + "params": { + "_object": "A 32 byte value to insert into the container." + } + }, + "push(bytes32,bytes27)": { + "params": { + "_globalMetadata": "New global metadata for the container.", + "_object": "A 32 byte value to insert into the container." + } + }, + "resolve(string)": { + "params": { + "_name": "Name to resolve an address for." + }, + "returns": { + "_0": "Address associated with the given name." + } + }, + "setGlobalMetadata(bytes27)": { + "params": { + "_globalMetadata": "New global metadata to set." + } + } + }, + "title": "OVM_ChainStorageContainer", + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": { + "deleteElementsAfterInclusive(uint256)": { + "notice": "Removes all objects after and including a given index." + }, + "deleteElementsAfterInclusive(uint256,bytes27)": { + "notice": "Removes all objects after and including a given index. Also allows setting the global metadata field." + }, + "get(uint256)": { + "notice": "Retrieves an object from the container." + }, + "getGlobalMetadata()": { + "notice": "Retrieves the container's global metadata field." + }, + "length()": { + "notice": "Retrieves the number of objects stored in the container." + }, + "push(bytes32)": { + "notice": "Pushes an object into the container." + }, + "push(bytes32,bytes27)": { + "notice": "Pushes an object into the container. Function allows setting the global metadata since we'll need to touch the \"length\" storage slot anyway, which also contains the global metadata (it's an optimization)." + }, + "resolve(string)": { + "notice": "Resolves the address associated with a given name." + }, + "setGlobalMetadata(bytes27)": { + "notice": "Sets the container's global metadata field. We're using `bytes27` here because we use five bytes to maintain the length of the underlying data structure, meaning we have an extra 27 bytes to store arbitrary data." + }, + "setNextOverwritableIndex(uint256)": { + "notice": "Marks an index as overwritable, meaing the underlying buffer can start to write values over any objects before and including the given index." + } + }, + "version": 1 + }, + "storageLayout": { + "storage": [ + { + "astId": 12800, + "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", + "label": "libAddressManager", + "offset": 0, + "slot": "0", + "type": "t_contract(Lib_AddressManager)12793" + }, + { + "astId": 4466, + "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", + "label": "owner", + "offset": 0, + "slot": "1", + "type": "t_string_storage" + }, + { + "astId": 4468, + "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", + "label": "buffer", + "offset": 0, + "slot": "2", + "type": "t_struct(RingBuffer)17846_storage" + } + ], + "types": { + "t_bytes32": { + "encoding": "inplace", + "label": "bytes32", + "numberOfBytes": "32" + }, + "t_contract(Lib_AddressManager)12793": { + "encoding": "inplace", + "label": "contract Lib_AddressManager", + "numberOfBytes": "20" + }, + "t_mapping(t_uint256,t_bytes32)": { + "encoding": "mapping", + "key": "t_uint256", + "label": "mapping(uint256 => bytes32)", + "numberOfBytes": "32", + "value": "t_bytes32" + }, + "t_string_storage": { + "encoding": "bytes", + "label": "string", + "numberOfBytes": "32" + }, + "t_struct(Buffer)17835_storage": { + "encoding": "inplace", + "label": "struct Lib_RingBuffer.Buffer", + "members": [ + { + "astId": 17830, + "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", + "label": "length", + "offset": 0, + "slot": "0", + "type": "t_uint256" + }, + { + "astId": 17834, + "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", + "label": "buf", + "offset": 0, + "slot": "1", + "type": "t_mapping(t_uint256,t_bytes32)" + } + ], + "numberOfBytes": "64" + }, + "t_struct(RingBuffer)17846_storage": { + "encoding": "inplace", + "label": "struct Lib_RingBuffer.RingBuffer", + "members": [ + { + "astId": 17837, + "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", + "label": "contextA", + "offset": 0, + "slot": "0", + "type": "t_bytes32" + }, + { + "astId": 17839, + "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", + "label": "contextB", + "offset": 0, + "slot": "1", + "type": "t_bytes32" + }, + { + "astId": 17841, + "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", + "label": "bufferA", + "offset": 0, + "slot": "2", + "type": "t_struct(Buffer)17835_storage" + }, + { + "astId": 17843, + "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", + "label": "bufferB", + "offset": 0, + "slot": "4", + "type": "t_struct(Buffer)17835_storage" + }, + { + "astId": 17845, + "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", + "label": "nextOverwritableIndex", + "offset": 0, + "slot": "6", + "type": "t_uint256" + } + ], + "numberOfBytes": "224" + }, + "t_uint256": { + "encoding": "inplace", + "label": "uint256", + "numberOfBytes": "32" + } + } + } +} \ No newline at end of file diff --git a/packages/contracts/deployments/kovan-v3/OVM_ChainStorageContainer:SCC:batches.json b/packages/contracts/deployments/kovan-v3/OVM_ChainStorageContainer:SCC:batches.json new file mode 100644 index 0000000000000..c0192021dfa1e --- /dev/null +++ b/packages/contracts/deployments/kovan-v3/OVM_ChainStorageContainer:SCC:batches.json @@ -0,0 +1,453 @@ +{ + "address": "0xFE1CE27173676A6850ECF4e0536D7C468A4dAfa0", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_libAddressManager", + "type": "address" + }, + { + "internalType": "string", + "name": "_owner", + "type": "string" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_index", + "type": "uint256" + }, + { + "internalType": "bytes27", + "name": "_globalMetadata", + "type": "bytes27" + } + ], + "name": "deleteElementsAfterInclusive", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_index", + "type": "uint256" + } + ], + "name": "deleteElementsAfterInclusive", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_index", + "type": "uint256" + } + ], + "name": "get", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getGlobalMetadata", + "outputs": [ + { + "internalType": "bytes27", + "name": "", + "type": "bytes27" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "length", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "libAddressManager", + "outputs": [ + { + "internalType": "contract Lib_AddressManager", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_object", + "type": "bytes32" + }, + { + "internalType": "bytes27", + "name": "_globalMetadata", + "type": "bytes27" + } + ], + "name": "push", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_object", + "type": "bytes32" + } + ], + "name": "push", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "_name", + "type": "string" + } + ], + "name": "resolve", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes27", + "name": "_globalMetadata", + "type": "bytes27" + } + ], + "name": "setGlobalMetadata", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_index", + "type": "uint256" + } + ], + "name": "setNextOverwritableIndex", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "transactionHash": "0x9a6bad52721e26c2993afcc88ee94280ebde659d16dde1800520e2f23d8a993e", + "receipt": { + "to": null, + "from": "0x18394B52d3Cb931dfA76F63251919D051953413d", + "contractAddress": "0xFE1CE27173676A6850ECF4e0536D7C468A4dAfa0", + "transactionIndex": 2, + "gasUsed": "968330", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0x7f062788bcd72681fe2d1681ec3b1a30f6c5093d76e50ef210302436ee01a5d9", + "transactionHash": "0x9a6bad52721e26c2993afcc88ee94280ebde659d16dde1800520e2f23d8a993e", + "logs": [], + "blockNumber": 24572799, + "cumulativeGasUsed": "1044174", + "status": 1, + "byzantium": true + }, + "args": [ + "0xd56F695e73286ac252A37593DD4E7c14270eC1Df", + "OVM_StateCommitmentChain" + ], + "solcInputHash": "5ee8e508e2c54cb5ac6783b4855b1558", + "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_owner\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"get\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getGlobalMetadata\",\"outputs\":[{\"internalType\":\"bytes27\",\"name\":\"\",\"type\":\"bytes27\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"length\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"setGlobalMetadata\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"setNextOverwritableIndex\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The Chain Storage Container provides its owner contract with read, write and delete functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which can no longer be used in a fraud proof due to the fraud window having passed, and the associated chain state or transactions being finalized. Three distinct Chain Storage Containers will be deployed on Layer 1: 1. Stores transaction batches for the Canonical Transaction Chain 2. Stores queued transactions for the Canonical Transaction Chain 3. Stores chain state batches for the State Commitment Chain Compiler used: solc Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\",\"_owner\":\"Name of the contract that owns this container (will be resolved later).\"}},\"deleteElementsAfterInclusive(uint256)\":{\"params\":{\"_index\":\"Object index to delete from.\"}},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_index\":\"Object index to delete from.\"}},\"get(uint256)\":{\"params\":{\"_index\":\"Index of the particular object to access.\"},\"returns\":{\"_0\":\"32 byte object value.\"}},\"getGlobalMetadata()\":{\"returns\":{\"_0\":\"Container global metadata field.\"}},\"length()\":{\"returns\":{\"_0\":\"Number of objects in the container.\"}},\"push(bytes32)\":{\"params\":{\"_object\":\"A 32 byte value to insert into the container.\"}},\"push(bytes32,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_object\":\"A 32 byte value to insert into the container.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}},\"setGlobalMetadata(bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata to set.\"}}},\"title\":\"OVM_ChainStorageContainer\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"deleteElementsAfterInclusive(uint256)\":{\"notice\":\"Removes all objects after and including a given index.\"},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"notice\":\"Removes all objects after and including a given index. Also allows setting the global metadata field.\"},\"get(uint256)\":{\"notice\":\"Retrieves an object from the container.\"},\"getGlobalMetadata()\":{\"notice\":\"Retrieves the container's global metadata field.\"},\"length()\":{\"notice\":\"Retrieves the number of objects stored in the container.\"},\"push(bytes32)\":{\"notice\":\"Pushes an object into the container.\"},\"push(bytes32,bytes27)\":{\"notice\":\"Pushes an object into the container. Function allows setting the global metadata since we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global metadata (it's an optimization).\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"},\"setGlobalMetadata(bytes27)\":{\"notice\":\"Sets the container's global metadata field. We're using `bytes27` here because we use five bytes to maintain the length of the underlying data structure, meaning we have an extra 27 bytes to store arbitrary data.\"},\"setNextOverwritableIndex(uint256)\":{\"notice\":\"Marks an index as overwritable, meaing the underlying buffer can start to write values over any objects before and including the given index.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol\":\"OVM_ChainStorageContainer\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor () internal {\\n address msgSender = _msgSender();\\n _owner = msgSender;\\n emit OwnershipTransferred(address(0), msgSender);\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n emit OwnershipTransferred(_owner, address(0));\\n _owner = address(0);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n emit OwnershipTransferred(_owner, newOwner);\\n _owner = newOwner;\\n }\\n}\\n\",\"keccak256\":\"0x15e2d5bd4c28a88548074c54d220e8086f638a71ed07e6b3ba5a70066fcf458d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with GSN meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address payable) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes memory) {\\n this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x8d3cb350f04ff49cfb10aef08d87f19dcbaecc8027b0bed12f3275cd12f38cf0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_RingBuffer } from \\\"../../libraries/utils/Lib_RingBuffer.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_ChainStorageContainer } from \\\"../../iOVM/chain/iOVM_ChainStorageContainer.sol\\\";\\n\\n/**\\n * @title OVM_ChainStorageContainer\\n * @dev The Chain Storage Container provides its owner contract with read, write and delete functionality.\\n * This provides gas efficiency gains by enabling it to overwrite storage slots which can no longer be used\\n * in a fraud proof due to the fraud window having passed, and the associated chain state or\\n * transactions being finalized.\\n * Three distinct Chain Storage Containers will be deployed on Layer 1:\\n * 1. Stores transaction batches for the Canonical Transaction Chain\\n * 2. Stores queued transactions for the Canonical Transaction Chain\\n * 3. Stores chain state batches for the State Commitment Chain\\n *\\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract OVM_ChainStorageContainer is iOVM_ChainStorageContainer, Lib_AddressResolver {\\n\\n /*************\\n * Libraries *\\n *************/\\n\\n using Lib_RingBuffer for Lib_RingBuffer.RingBuffer;\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n string public owner;\\n Lib_RingBuffer.RingBuffer internal buffer;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n * @param _owner Name of the contract that owns this container (will be resolved later).\\n */\\n constructor(\\n address _libAddressManager,\\n string memory _owner\\n )\\n Lib_AddressResolver(_libAddressManager)\\n {\\n owner = _owner;\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n msg.sender == resolve(owner),\\n \\\"OVM_ChainStorageContainer: Function can only be called by the owner.\\\"\\n );\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function setGlobalMetadata(\\n bytes27 _globalMetadata\\n )\\n override\\n public\\n onlyOwner\\n {\\n return buffer.setExtraData(_globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function getGlobalMetadata()\\n override\\n public\\n view\\n returns (\\n bytes27\\n )\\n {\\n return buffer.getExtraData();\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function length()\\n override\\n public\\n view\\n returns (\\n uint256\\n )\\n {\\n return uint256(buffer.getLength());\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function push(\\n bytes32 _object\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.push(_object);\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function push(\\n bytes32 _object,\\n bytes27 _globalMetadata\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.push(_object, _globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function get(\\n uint256 _index\\n )\\n override\\n public\\n view\\n returns (\\n bytes32\\n )\\n {\\n return buffer.get(uint40(_index));\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.deleteElementsAfterInclusive(\\n uint40(_index)\\n );\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index,\\n bytes27 _globalMetadata\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.deleteElementsAfterInclusive(\\n uint40(_index),\\n _globalMetadata\\n );\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function setNextOverwritableIndex(\\n uint256 _index\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.nextOverwritableIndex = _index;\\n }\\n}\\n\",\"keccak256\":\"0x93325c961516aa2a22bf1aacf4029353d5e3b693e04b485753170337b50224e6\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_ChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title iOVM_ChainStorageContainer\\n */\\ninterface iOVM_ChainStorageContainer {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata()\\n external\\n view\\n returns (\\n bytes27\\n );\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length()\\n external\\n view\\n returns (\\n uint256\\n );\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(\\n bytes32 _object\\n )\\n external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(\\n bytes32 _object,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(\\n uint256 _index\\n )\\n external\\n view\\n returns (\\n bytes32\\n );\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index\\n )\\n external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Marks an index as overwritable, meaing the underlying buffer can start to write values over\\n * any objects before and including the given index.\\n */\\n function setNextOverwritableIndex(\\n uint256 _index\\n )\\n external;\\n}\\n\",\"keccak256\":\"0x2d7973a0ad84c23ec62624d3f1e3aeb198cc72686ff1e6cfa17155556b320c94\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n public\\n onlyOwner\\n {\\n addresses[_getNameHash(_name)] = _address;\\n\\n emit AddressSet(\\n _name,\\n _address\\n );\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0x2ce671a0e004df88b136bea5a3c59d0732cea8887c8496da1d509e0200b03d7d\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(\\n address _libAddressManager\\n ) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x65981feeabff6a81783ea97d44baf988a18a86c8cb374c46fdb71819cbacc7c0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_RingBuffer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\nlibrary Lib_RingBuffer {\\n using Lib_RingBuffer for RingBuffer;\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Buffer {\\n uint256 length;\\n mapping (uint256 => bytes32) buf;\\n }\\n\\n struct RingBuffer {\\n bytes32 contextA;\\n bytes32 contextB;\\n Buffer bufferA;\\n Buffer bufferB;\\n uint256 nextOverwritableIndex;\\n }\\n\\n struct RingBufferContext {\\n // contextA\\n uint40 globalIndex;\\n bytes27 extraData;\\n\\n // contextB\\n uint64 currBufferIndex;\\n uint40 prevResetIndex;\\n uint40 currResetIndex;\\n }\\n\\n\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 constant MIN_CAPACITY = 16;\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n * @param _extraData Optional global extra data.\\n */\\n function push(\\n RingBuffer storage _self,\\n bytes32 _value,\\n bytes27 _extraData\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n Buffer storage currBuffer = _self.getBuffer(ctx.currBufferIndex);\\n\\n // Set a minimum capacity.\\n if (currBuffer.length == 0) {\\n currBuffer.length = MIN_CAPACITY;\\n }\\n\\n // Check if we need to expand the buffer.\\n if (ctx.globalIndex - ctx.currResetIndex >= currBuffer.length) {\\n if (ctx.currResetIndex < _self.nextOverwritableIndex) {\\n // We're going to overwrite the inactive buffer.\\n // Bump the buffer index, reset the delete offset, and set our reset indices.\\n ctx.currBufferIndex++;\\n ctx.prevResetIndex = ctx.currResetIndex;\\n ctx.currResetIndex = ctx.globalIndex;\\n\\n // Swap over to the next buffer.\\n currBuffer = _self.getBuffer(ctx.currBufferIndex);\\n } else {\\n // We're not overwriting yet, double the length of the current buffer.\\n currBuffer.length *= 2;\\n }\\n }\\n\\n // Index to write to is the difference of the global and reset indices.\\n uint256 writeHead = ctx.globalIndex - ctx.currResetIndex;\\n currBuffer.buf[writeHead] = _value;\\n\\n // Bump the global index and insert our extra data, then save the context.\\n ctx.globalIndex++;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n */\\n function push(\\n RingBuffer storage _self,\\n bytes32 _value\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n\\n _self.push(\\n _value,\\n ctx.extraData\\n );\\n }\\n\\n /**\\n * Retrieves an element from the buffer.\\n * @param _self Buffer to access.\\n * @param _index Element index to retrieve.\\n * @return Value of the element at the given index.\\n */\\n function get(\\n RingBuffer storage _self,\\n uint256 _index\\n )\\n internal\\n view\\n returns (\\n bytes32\\n )\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n\\n require(\\n _index < ctx.globalIndex,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n Buffer storage currBuffer = _self.getBuffer(ctx.currBufferIndex);\\n Buffer storage prevBuffer = _self.getBuffer(ctx.currBufferIndex + 1);\\n\\n if (_index >= ctx.currResetIndex) {\\n // We're trying to load an element from the current buffer.\\n // Relative index is just the difference from the reset index.\\n uint256 relativeIndex = _index - ctx.currResetIndex;\\n\\n // Shouldn't happen but why not check.\\n require(\\n relativeIndex < currBuffer.length,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n return currBuffer.buf[relativeIndex];\\n } else {\\n // We're trying to load an element from the previous buffer.\\n // Relative index is the difference from the reset index in the other direction.\\n uint256 relativeIndex = ctx.currResetIndex - _index;\\n\\n // Condition only fails in the case that we deleted and flipped buffers.\\n require(\\n ctx.currResetIndex > ctx.prevResetIndex,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n // Make sure we're not trying to read beyond the array.\\n require(\\n relativeIndex <= prevBuffer.length,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n return prevBuffer.buf[prevBuffer.length - relativeIndex];\\n }\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n * @param _extraData Optional global extra data.\\n */\\n function deleteElementsAfterInclusive(\\n RingBuffer storage _self,\\n uint40 _index,\\n bytes27 _extraData\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n\\n require(\\n _index < ctx.globalIndex && _index >= ctx.prevResetIndex,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n if (_index < ctx.currResetIndex) {\\n // We're switching back to the previous buffer.\\n // Reduce the buffer index, set the current reset index back to match the previous one.\\n // We use the equality of these two values to prevent reading beyond this buffer.\\n ctx.currBufferIndex--;\\n ctx.currResetIndex = ctx.prevResetIndex;\\n }\\n\\n // Set our global index and extra data, save the context.\\n ctx.globalIndex = _index;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n */\\n function deleteElementsAfterInclusive(\\n RingBuffer storage _self,\\n uint40 _index\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n _self.deleteElementsAfterInclusive(\\n _index,\\n ctx.extraData\\n );\\n }\\n\\n /**\\n * Retrieves the current global index.\\n * @param _self Buffer to access.\\n * @return Current global index.\\n */\\n function getLength(\\n RingBuffer storage _self\\n )\\n internal\\n view\\n returns (\\n uint40\\n )\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n return ctx.globalIndex;\\n }\\n\\n /**\\n * Changes current global extra data.\\n * @param _self Buffer to access.\\n * @param _extraData New global extra data.\\n */\\n function setExtraData(\\n RingBuffer storage _self,\\n bytes27 _extraData\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Retrieves the current global extra data.\\n * @param _self Buffer to access.\\n * @return Current global extra data.\\n */\\n function getExtraData(\\n RingBuffer storage _self\\n )\\n internal\\n view\\n returns (\\n bytes27\\n )\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n return ctx.extraData;\\n }\\n\\n /**\\n * Sets the current ring buffer context.\\n * @param _self Buffer to access.\\n * @param _ctx Current ring buffer context.\\n */\\n function setContext(\\n RingBuffer storage _self,\\n RingBufferContext memory _ctx\\n )\\n internal\\n {\\n bytes32 contextA;\\n bytes32 contextB;\\n\\n uint40 globalIndex = _ctx.globalIndex;\\n bytes27 extraData = _ctx.extraData;\\n assembly {\\n contextA := globalIndex\\n contextA := or(contextA, extraData)\\n }\\n\\n uint64 currBufferIndex = _ctx.currBufferIndex;\\n uint40 prevResetIndex = _ctx.prevResetIndex;\\n uint40 currResetIndex = _ctx.currResetIndex;\\n assembly {\\n contextB := currBufferIndex\\n contextB := or(contextB, shl(64, prevResetIndex))\\n contextB := or(contextB, shl(104, currResetIndex))\\n }\\n\\n if (_self.contextA != contextA) {\\n _self.contextA = contextA;\\n }\\n\\n if (_self.contextB != contextB) {\\n _self.contextB = contextB;\\n }\\n }\\n\\n /**\\n * Retrieves the current ring buffer context.\\n * @param _self Buffer to access.\\n * @return Current ring buffer context.\\n */\\n function getContext(\\n RingBuffer storage _self\\n )\\n internal\\n view\\n returns (\\n RingBufferContext memory\\n )\\n {\\n bytes32 contextA = _self.contextA;\\n bytes32 contextB = _self.contextB;\\n\\n uint40 globalIndex;\\n bytes27 extraData;\\n assembly {\\n globalIndex := and(contextA, 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF)\\n extraData := and(contextA, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000)\\n }\\n\\n uint64 currBufferIndex;\\n uint40 prevResetIndex;\\n uint40 currResetIndex;\\n assembly {\\n currBufferIndex := and(contextB, 0x000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF)\\n prevResetIndex := shr(64, and(contextB, 0x00000000000000000000000000000000000000FFFFFFFFFF0000000000000000))\\n currResetIndex := shr(104, and(contextB, 0x0000000000000000000000000000FFFFFFFFFF00000000000000000000000000))\\n }\\n\\n return RingBufferContext({\\n globalIndex: globalIndex,\\n extraData: extraData,\\n currBufferIndex: currBufferIndex,\\n prevResetIndex: prevResetIndex,\\n currResetIndex: currResetIndex\\n });\\n }\\n\\n /**\\n * Retrieves the a buffer from the ring buffer by index.\\n * @param _self Buffer to access.\\n * @param _which Index of the sub buffer to access.\\n * @return Sub buffer for the index.\\n */\\n function getBuffer(\\n RingBuffer storage _self,\\n uint256 _which\\n )\\n internal\\n view\\n returns (\\n Buffer storage\\n )\\n {\\n return _which % 2 == 0 ? _self.bufferA : _self.bufferB;\\n }\\n}\\n\",\"keccak256\":\"0xe30fc56d4499f98582e1f800dfa3b343f171163a557266c31a56449d5fd3ffae\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x60806040523480156200001157600080fd5b506040516200118d3803806200118d833981810160405260408110156200003757600080fd5b8151602083018051604051929492938301929190846401000000008211156200005f57600080fd5b9083019060208201858111156200007557600080fd5b82516401000000008111828201881017156200009057600080fd5b82525081516020918201929091019080838360005b83811015620000bf578181015183820152602001620000a5565b50505050905090810190601f168015620000ed5780820380516001836020036101000a031916815260200191505b506040525050600080546001600160a01b0319166001600160a01b038516179055508051620001249060019060208401906200012d565b505050620001d9565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282620001655760008555620001b0565b82601f106200018057805160ff1916838001178555620001b0565b82800160010185558215620001b0579182015b82811115620001b057825182559160200191906001019062000193565b50620001be929150620001c2565b5090565b5b80821115620001be5760008155600101620001c3565b610fa480620001e96000396000f3fe608060405234801561001057600080fd5b50600436106100b45760003560e01c80634651d91e116100715780634651d91e1461021a5780638da5cb5b146102375780639507d39a146102b4578063b298e36b146102d1578063ccf8f969146102ee578063fa9e936c14610311576100b4565b8063167fd681146100b95780631f7b6d32146100e65780632015276c1461010057806329061de21461012b578063299ca47814610150578063461a447814610174575b600080fd5b6100e4600480360360408110156100cf57600080fd5b508035906020013564ffffffffff191661032e565b005b6100ee610423565b60408051918252519081900360200190f35b6100e46004803603604081101561011657600080fd5b508035906020013564ffffffffff191661043b565b6100e46004803603602081101561014157600080fd5b503564ffffffffff19166104f7565b6101586105b5565b604080516001600160a01b039092168252519081900360200190f35b6101586004803603602081101561018a57600080fd5b8101906020810181356401000000008111156101a557600080fd5b8201836020820111156101b757600080fd5b803590602001918460018302840111640100000000831117156101d957600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506105c4945050505050565b6100e46004803603602081101561023057600080fd5b50356106a0565b61023f61075b565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610279578181015183820152602001610261565b50505050905090810190601f1680156102a65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6100ee600480360360208110156102ca57600080fd5b50356107e8565b6100e4600480360360208110156102e757600080fd5b5035610802565b6102f66108bd565b6040805164ffffffffff199092168252519081900360200190f35b6100e46004803603602081101561032757600080fd5b50356108ce565b60018054604080516020601f6002600019610100878916150201909516949094049384018190048102820181019092528281526103c493909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b820191906000526020600020905b81548152906001019060200180831161039d57829003601f168201915b50505050506105c4565b6001600160a01b0316336001600160a01b0316146104135760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b61041f60028383610983565b5050565b600061042f6002610a75565b64ffffffffff16905090565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261049c93909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146104eb5760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b61041f60028383610a89565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261055893909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146105a75760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b6105b2600282610b90565b50565b6000546001600160a01b031681565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b8381101561062457818101518382015260200161060c565b50505050905090810190601f1680156106515780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561066e57600080fd5b505afa158015610682573d6000803e3d6000fd5b505050506040513d602081101561069857600080fd5b505192915050565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261070193909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146107505760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b6105b2600282610bba565b60018054604080516020600284861615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156107e05780601f106107b5576101008083540402835291602001916107e0565b820191906000526020600020905b8154815290600101906020018083116107c357829003601f168201915b505050505081565b60006107fc600264ffffffffff8416610be0565b92915050565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261086393909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146108b25760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b6105b2600282610de9565b60006108c96002610e0f565b905090565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261092f93909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b03161461097e5760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b600855565b600061098e84610e26565b9050806000015164ffffffffff168364ffffffffff161080156109c35750806060015164ffffffffff168364ffffffffff1610155b610a0b576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b806080015164ffffffffff168364ffffffffff161015610a4d576040810180516000190167ffffffffffffffff169052606081015164ffffffffff1660808201525b64ffffffffff8316815264ffffffffff1982166020820152610a6f8482610e86565b50505050565b600080610a8183610e26565b519392505050565b6000610a9484610e26565b90506000610ab9826040015167ffffffffffffffff1686610edc90919063ffffffff16565b8054909150610ac757601081555b8054608083015183510364ffffffffff1610610b3e578460060154826080015164ffffffffff161015610b365760408201805160010167ffffffffffffffff169081905260808301805164ffffffffff90811660608601528451169052610b2f908690610edc565b9050610b3e565b805460020281555b608082015182510364ffffffffff9081166000818152600184810160209081526040909220889055855101909216845264ffffffffff19851691840191909152610b888684610e86565b505050505050565b6000610b9b83610e26565b64ffffffffff19831660208201529050610bb58382610e86565b505050565b6000610bc583610e26565b9050610bb5828260200151856109839092919063ffffffff16565b600080610bec84610e26565b805190915064ffffffffff168310610c42576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b6000610c65826040015167ffffffffffffffff1686610edc90919063ffffffff16565b90506000610c8d836040015160010167ffffffffffffffff1687610edc90919063ffffffff16565b9050826080015164ffffffffff168510610d1a576080830151825464ffffffffff9091168603908110610cfe576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b6000908152600190920160205250604090205491506107fc9050565b6080830151606084015164ffffffffff9182168781039290911610610d7d576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b8154811115610dca576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b81540360009081526001909101602052604090205492506107fc915050565b6000610df483610e26565b9050610bb582826020015185610a899092919063ffffffff16565b600080610e1b83610e26565b602001519392505050565b610e2e610efc565b5080546001909101546040805160a08101825264ffffffffff808516825264ffffffffff19909416602082015267ffffffffffffffff8316818301529082901c8316606082015260689190911c909116608082015290565b80516020820151604080840151606085015160808601518754858717969483901b8417606883901b1795939291908714610ebe578689555b85896001015414610ed157600189018690555b505050505050505050565b60006002820615610ef05782600401610ef5565b826002015b9392505050565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091529056fe4f564d5f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2063616e206f6e6c792062652063616c6c656420627920746865206f776e65722ea2646970667358221220376cbc00341dd082d644157f6511fcd1ac26a6a924d04ae6532cfcab93d9191864736f6c63430007060033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100b45760003560e01c80634651d91e116100715780634651d91e1461021a5780638da5cb5b146102375780639507d39a146102b4578063b298e36b146102d1578063ccf8f969146102ee578063fa9e936c14610311576100b4565b8063167fd681146100b95780631f7b6d32146100e65780632015276c1461010057806329061de21461012b578063299ca47814610150578063461a447814610174575b600080fd5b6100e4600480360360408110156100cf57600080fd5b508035906020013564ffffffffff191661032e565b005b6100ee610423565b60408051918252519081900360200190f35b6100e46004803603604081101561011657600080fd5b508035906020013564ffffffffff191661043b565b6100e46004803603602081101561014157600080fd5b503564ffffffffff19166104f7565b6101586105b5565b604080516001600160a01b039092168252519081900360200190f35b6101586004803603602081101561018a57600080fd5b8101906020810181356401000000008111156101a557600080fd5b8201836020820111156101b757600080fd5b803590602001918460018302840111640100000000831117156101d957600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506105c4945050505050565b6100e46004803603602081101561023057600080fd5b50356106a0565b61023f61075b565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610279578181015183820152602001610261565b50505050905090810190601f1680156102a65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6100ee600480360360208110156102ca57600080fd5b50356107e8565b6100e4600480360360208110156102e757600080fd5b5035610802565b6102f66108bd565b6040805164ffffffffff199092168252519081900360200190f35b6100e46004803603602081101561032757600080fd5b50356108ce565b60018054604080516020601f6002600019610100878916150201909516949094049384018190048102820181019092528281526103c493909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b820191906000526020600020905b81548152906001019060200180831161039d57829003601f168201915b50505050506105c4565b6001600160a01b0316336001600160a01b0316146104135760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b61041f60028383610983565b5050565b600061042f6002610a75565b64ffffffffff16905090565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261049c93909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146104eb5760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b61041f60028383610a89565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261055893909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146105a75760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b6105b2600282610b90565b50565b6000546001600160a01b031681565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b8381101561062457818101518382015260200161060c565b50505050905090810190601f1680156106515780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561066e57600080fd5b505afa158015610682573d6000803e3d6000fd5b505050506040513d602081101561069857600080fd5b505192915050565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261070193909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146107505760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b6105b2600282610bba565b60018054604080516020600284861615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156107e05780601f106107b5576101008083540402835291602001916107e0565b820191906000526020600020905b8154815290600101906020018083116107c357829003601f168201915b505050505081565b60006107fc600264ffffffffff8416610be0565b92915050565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261086393909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146108b25760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b6105b2600282610de9565b60006108c96002610e0f565b905090565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261092f93909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b03161461097e5760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b600855565b600061098e84610e26565b9050806000015164ffffffffff168364ffffffffff161080156109c35750806060015164ffffffffff168364ffffffffff1610155b610a0b576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b806080015164ffffffffff168364ffffffffff161015610a4d576040810180516000190167ffffffffffffffff169052606081015164ffffffffff1660808201525b64ffffffffff8316815264ffffffffff1982166020820152610a6f8482610e86565b50505050565b600080610a8183610e26565b519392505050565b6000610a9484610e26565b90506000610ab9826040015167ffffffffffffffff1686610edc90919063ffffffff16565b8054909150610ac757601081555b8054608083015183510364ffffffffff1610610b3e578460060154826080015164ffffffffff161015610b365760408201805160010167ffffffffffffffff169081905260808301805164ffffffffff90811660608601528451169052610b2f908690610edc565b9050610b3e565b805460020281555b608082015182510364ffffffffff9081166000818152600184810160209081526040909220889055855101909216845264ffffffffff19851691840191909152610b888684610e86565b505050505050565b6000610b9b83610e26565b64ffffffffff19831660208201529050610bb58382610e86565b505050565b6000610bc583610e26565b9050610bb5828260200151856109839092919063ffffffff16565b600080610bec84610e26565b805190915064ffffffffff168310610c42576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b6000610c65826040015167ffffffffffffffff1686610edc90919063ffffffff16565b90506000610c8d836040015160010167ffffffffffffffff1687610edc90919063ffffffff16565b9050826080015164ffffffffff168510610d1a576080830151825464ffffffffff9091168603908110610cfe576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b6000908152600190920160205250604090205491506107fc9050565b6080830151606084015164ffffffffff9182168781039290911610610d7d576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b8154811115610dca576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b81540360009081526001909101602052604090205492506107fc915050565b6000610df483610e26565b9050610bb582826020015185610a899092919063ffffffff16565b600080610e1b83610e26565b602001519392505050565b610e2e610efc565b5080546001909101546040805160a08101825264ffffffffff808516825264ffffffffff19909416602082015267ffffffffffffffff8316818301529082901c8316606082015260689190911c909116608082015290565b80516020820151604080840151606085015160808601518754858717969483901b8417606883901b1795939291908714610ebe578689555b85896001015414610ed157600189018690555b505050505050505050565b60006002820615610ef05782600401610ef5565b826002015b9392505050565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091529056fe4f564d5f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2063616e206f6e6c792062652063616c6c656420627920746865206f776e65722ea2646970667358221220376cbc00341dd082d644157f6511fcd1ac26a6a924d04ae6532cfcab93d9191864736f6c63430007060033", + "devdoc": { + "details": "The Chain Storage Container provides its owner contract with read, write and delete functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which can no longer be used in a fraud proof due to the fraud window having passed, and the associated chain state or transactions being finalized. Three distinct Chain Storage Containers will be deployed on Layer 1: 1. Stores transaction batches for the Canonical Transaction Chain 2. Stores queued transactions for the Canonical Transaction Chain 3. Stores chain state batches for the State Commitment Chain Compiler used: solc Runtime target: EVM", + "kind": "dev", + "methods": { + "constructor": { + "params": { + "_libAddressManager": "Address of the Address Manager.", + "_owner": "Name of the contract that owns this container (will be resolved later)." + } + }, + "deleteElementsAfterInclusive(uint256)": { + "params": { + "_index": "Object index to delete from." + } + }, + "deleteElementsAfterInclusive(uint256,bytes27)": { + "params": { + "_globalMetadata": "New global metadata for the container.", + "_index": "Object index to delete from." + } + }, + "get(uint256)": { + "params": { + "_index": "Index of the particular object to access." + }, + "returns": { + "_0": "32 byte object value." + } + }, + "getGlobalMetadata()": { + "returns": { + "_0": "Container global metadata field." + } + }, + "length()": { + "returns": { + "_0": "Number of objects in the container." + } + }, + "push(bytes32)": { + "params": { + "_object": "A 32 byte value to insert into the container." + } + }, + "push(bytes32,bytes27)": { + "params": { + "_globalMetadata": "New global metadata for the container.", + "_object": "A 32 byte value to insert into the container." + } + }, + "resolve(string)": { + "params": { + "_name": "Name to resolve an address for." + }, + "returns": { + "_0": "Address associated with the given name." + } + }, + "setGlobalMetadata(bytes27)": { + "params": { + "_globalMetadata": "New global metadata to set." + } + } + }, + "title": "OVM_ChainStorageContainer", + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": { + "deleteElementsAfterInclusive(uint256)": { + "notice": "Removes all objects after and including a given index." + }, + "deleteElementsAfterInclusive(uint256,bytes27)": { + "notice": "Removes all objects after and including a given index. Also allows setting the global metadata field." + }, + "get(uint256)": { + "notice": "Retrieves an object from the container." + }, + "getGlobalMetadata()": { + "notice": "Retrieves the container's global metadata field." + }, + "length()": { + "notice": "Retrieves the number of objects stored in the container." + }, + "push(bytes32)": { + "notice": "Pushes an object into the container." + }, + "push(bytes32,bytes27)": { + "notice": "Pushes an object into the container. Function allows setting the global metadata since we'll need to touch the \"length\" storage slot anyway, which also contains the global metadata (it's an optimization)." + }, + "resolve(string)": { + "notice": "Resolves the address associated with a given name." + }, + "setGlobalMetadata(bytes27)": { + "notice": "Sets the container's global metadata field. We're using `bytes27` here because we use five bytes to maintain the length of the underlying data structure, meaning we have an extra 27 bytes to store arbitrary data." + }, + "setNextOverwritableIndex(uint256)": { + "notice": "Marks an index as overwritable, meaing the underlying buffer can start to write values over any objects before and including the given index." + } + }, + "version": 1 + }, + "storageLayout": { + "storage": [ + { + "astId": 12800, + "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", + "label": "libAddressManager", + "offset": 0, + "slot": "0", + "type": "t_contract(Lib_AddressManager)12793" + }, + { + "astId": 4466, + "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", + "label": "owner", + "offset": 0, + "slot": "1", + "type": "t_string_storage" + }, + { + "astId": 4468, + "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", + "label": "buffer", + "offset": 0, + "slot": "2", + "type": "t_struct(RingBuffer)17846_storage" + } + ], + "types": { + "t_bytes32": { + "encoding": "inplace", + "label": "bytes32", + "numberOfBytes": "32" + }, + "t_contract(Lib_AddressManager)12793": { + "encoding": "inplace", + "label": "contract Lib_AddressManager", + "numberOfBytes": "20" + }, + "t_mapping(t_uint256,t_bytes32)": { + "encoding": "mapping", + "key": "t_uint256", + "label": "mapping(uint256 => bytes32)", + "numberOfBytes": "32", + "value": "t_bytes32" + }, + "t_string_storage": { + "encoding": "bytes", + "label": "string", + "numberOfBytes": "32" + }, + "t_struct(Buffer)17835_storage": { + "encoding": "inplace", + "label": "struct Lib_RingBuffer.Buffer", + "members": [ + { + "astId": 17830, + "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", + "label": "length", + "offset": 0, + "slot": "0", + "type": "t_uint256" + }, + { + "astId": 17834, + "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", + "label": "buf", + "offset": 0, + "slot": "1", + "type": "t_mapping(t_uint256,t_bytes32)" + } + ], + "numberOfBytes": "64" + }, + "t_struct(RingBuffer)17846_storage": { + "encoding": "inplace", + "label": "struct Lib_RingBuffer.RingBuffer", + "members": [ + { + "astId": 17837, + "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", + "label": "contextA", + "offset": 0, + "slot": "0", + "type": "t_bytes32" + }, + { + "astId": 17839, + "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", + "label": "contextB", + "offset": 0, + "slot": "1", + "type": "t_bytes32" + }, + { + "astId": 17841, + "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", + "label": "bufferA", + "offset": 0, + "slot": "2", + "type": "t_struct(Buffer)17835_storage" + }, + { + "astId": 17843, + "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", + "label": "bufferB", + "offset": 0, + "slot": "4", + "type": "t_struct(Buffer)17835_storage" + }, + { + "astId": 17845, + "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", + "label": "nextOverwritableIndex", + "offset": 0, + "slot": "6", + "type": "t_uint256" + } + ], + "numberOfBytes": "224" + }, + "t_uint256": { + "encoding": "inplace", + "label": "uint256", + "numberOfBytes": "32" + } + } + } +} \ No newline at end of file diff --git a/packages/contracts/deployments/kovan-v3/OVM_ExecutionManager.json b/packages/contracts/deployments/kovan-v3/OVM_ExecutionManager.json new file mode 100644 index 0000000000000..2a066f76e0024 --- /dev/null +++ b/packages/contracts/deployments/kovan-v3/OVM_ExecutionManager.json @@ -0,0 +1,1269 @@ +{ + "address": "0xa2EB1961183a04157fF707Fa2Be2249e149c8FAB", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_libAddressManager", + "type": "address" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "minTransactionGasLimit", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "maxTransactionGasLimit", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "maxGasPerQueuePerEpoch", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "secondsPerEpoch", + "type": "uint256" + } + ], + "internalType": "struct iOVM_ExecutionManager.GasMeterConfig", + "name": "_gasMeterConfig", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "ovmCHAINID", + "type": "uint256" + } + ], + "internalType": "struct iOVM_ExecutionManager.GlobalContext", + "name": "_globalContext", + "type": "tuple" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "name": "getMaxTransactionGasLimit", + "outputs": [ + { + "internalType": "uint256", + "name": "_maxTransactionGasLimit", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "libAddressManager", + "outputs": [ + { + "internalType": "contract Lib_AddressManager", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "ovmADDRESS", + "outputs": [ + { + "internalType": "address", + "name": "_ADDRESS", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_gasLimit", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_address", + "type": "address" + }, + { + "internalType": "bytes", + "name": "_calldata", + "type": "bytes" + } + ], + "name": "ovmCALL", + "outputs": [ + { + "internalType": "bool", + "name": "_success", + "type": "bool" + }, + { + "internalType": "bytes", + "name": "_returndata", + "type": "bytes" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "ovmCALLER", + "outputs": [ + { + "internalType": "address", + "name": "_CALLER", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "ovmCHAINID", + "outputs": [ + { + "internalType": "uint256", + "name": "_CHAINID", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "_bytecode", + "type": "bytes" + } + ], + "name": "ovmCREATE", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "_bytecode", + "type": "bytes" + }, + { + "internalType": "bytes32", + "name": "_salt", + "type": "bytes32" + } + ], + "name": "ovmCREATE2", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_messageHash", + "type": "bytes32" + }, + { + "internalType": "uint8", + "name": "_v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "_r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "_s", + "type": "bytes32" + } + ], + "name": "ovmCREATEEOA", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_gasLimit", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_address", + "type": "address" + }, + { + "internalType": "bytes", + "name": "_calldata", + "type": "bytes" + } + ], + "name": "ovmDELEGATECALL", + "outputs": [ + { + "internalType": "bool", + "name": "_success", + "type": "bool" + }, + { + "internalType": "bytes", + "name": "_returndata", + "type": "bytes" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_contract", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_offset", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_length", + "type": "uint256" + } + ], + "name": "ovmEXTCODECOPY", + "outputs": [ + { + "internalType": "bytes", + "name": "_code", + "type": "bytes" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_contract", + "type": "address" + } + ], + "name": "ovmEXTCODEHASH", + "outputs": [ + { + "internalType": "bytes32", + "name": "_EXTCODEHASH", + "type": "bytes32" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_contract", + "type": "address" + } + ], + "name": "ovmEXTCODESIZE", + "outputs": [ + { + "internalType": "uint256", + "name": "_EXTCODESIZE", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "ovmGASLIMIT", + "outputs": [ + { + "internalType": "uint256", + "name": "_GASLIMIT", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "ovmGETNONCE", + "outputs": [ + { + "internalType": "uint256", + "name": "_nonce", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "ovmINCREMENTNONCE", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "ovmL1QUEUEORIGIN", + "outputs": [ + { + "internalType": "enum Lib_OVMCodec.QueueOrigin", + "name": "_queueOrigin", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "ovmL1TXORIGIN", + "outputs": [ + { + "internalType": "address", + "name": "_l1TxOrigin", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "ovmNUMBER", + "outputs": [ + { + "internalType": "uint256", + "name": "_NUMBER", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "_data", + "type": "bytes" + } + ], + "name": "ovmREVERT", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_key", + "type": "bytes32" + } + ], + "name": "ovmSLOAD", + "outputs": [ + { + "internalType": "bytes32", + "name": "_value", + "type": "bytes32" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_key", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "_value", + "type": "bytes32" + } + ], + "name": "ovmSSTORE", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_gasLimit", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_address", + "type": "address" + }, + { + "internalType": "bytes", + "name": "_calldata", + "type": "bytes" + } + ], + "name": "ovmSTATICCALL", + "outputs": [ + { + "internalType": "bool", + "name": "_success", + "type": "bool" + }, + { + "internalType": "bytes", + "name": "_returndata", + "type": "bytes" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "ovmTIMESTAMP", + "outputs": [ + { + "internalType": "uint256", + "name": "_TIMESTAMP", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "_name", + "type": "string" + } + ], + "name": "resolve", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "timestamp", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "blockNumber", + "type": "uint256" + }, + { + "internalType": "enum Lib_OVMCodec.QueueOrigin", + "name": "l1QueueOrigin", + "type": "uint8" + }, + { + "internalType": "address", + "name": "l1TxOrigin", + "type": "address" + }, + { + "internalType": "address", + "name": "entrypoint", + "type": "address" + }, + { + "internalType": "uint256", + "name": "gasLimit", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "internalType": "struct Lib_OVMCodec.Transaction", + "name": "_transaction", + "type": "tuple" + }, + { + "internalType": "address", + "name": "_ovmStateManager", + "type": "address" + } + ], + "name": "run", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_gasLimit", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "_creationCode", + "type": "bytes" + }, + { + "internalType": "address", + "name": "_address", + "type": "address" + } + ], + "name": "safeCREATE", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "timestamp", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "blockNumber", + "type": "uint256" + }, + { + "internalType": "enum Lib_OVMCodec.QueueOrigin", + "name": "l1QueueOrigin", + "type": "uint8" + }, + { + "internalType": "address", + "name": "l1TxOrigin", + "type": "address" + }, + { + "internalType": "address", + "name": "entrypoint", + "type": "address" + }, + { + "internalType": "uint256", + "name": "gasLimit", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "internalType": "struct Lib_OVMCodec.Transaction", + "name": "_transaction", + "type": "tuple" + }, + { + "internalType": "address", + "name": "_from", + "type": "address" + }, + { + "internalType": "contract iOVM_StateManager", + "name": "_ovmStateManager", + "type": "address" + } + ], + "name": "simulateMessage", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + }, + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "transactionHash": "0x8da706bbdc66066481106f6452161e0f6ad95f928a10f6a86b7175a52f2057c5", + "receipt": { + "to": null, + "from": "0x18394B52d3Cb931dfA76F63251919D051953413d", + "contractAddress": "0xa2EB1961183a04157fF707Fa2Be2249e149c8FAB", + "transactionIndex": 1, + "gasUsed": "2901234", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0xe33c92c8c1fef82666476fb549221769ae5c6ec66490489f8c123a07b6a0d115", + "transactionHash": "0x8da706bbdc66066481106f6452161e0f6ad95f928a10f6a86b7175a52f2057c5", + "logs": [], + "blockNumber": 24572845, + "cumulativeGasUsed": "3041792", + "status": 1, + "byzantium": true + }, + "args": [ + "0xd56F695e73286ac252A37593DD4E7c14270eC1Df", + { + "minTransactionGasLimit": 50000, + "maxTransactionGasLimit": 9000000, + "maxGasPerQueuePerEpoch": 250000000, + "secondsPerEpoch": 0 + }, + { + "ovmCHAINID": 420 + } + ], + "solcInputHash": "5ee8e508e2c54cb5ac6783b4855b1558", + "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"minTransactionGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxTransactionGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxGasPerQueuePerEpoch\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"secondsPerEpoch\",\"type\":\"uint256\"}],\"internalType\":\"struct iOVM_ExecutionManager.GasMeterConfig\",\"name\":\"_gasMeterConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"ovmCHAINID\",\"type\":\"uint256\"}],\"internalType\":\"struct iOVM_ExecutionManager.GlobalContext\",\"name\":\"_globalContext\",\"type\":\"tuple\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"getMaxTransactionGasLimit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_maxTransactionGasLimit\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ovmADDRESS\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"_ADDRESS\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_address\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_calldata\",\"type\":\"bytes\"}],\"name\":\"ovmCALL\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"_success\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"_returndata\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ovmCALLER\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"_CALLER\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ovmCHAINID\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_CHAINID\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_bytecode\",\"type\":\"bytes\"}],\"name\":\"ovmCREATE\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_bytecode\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"_salt\",\"type\":\"bytes32\"}],\"name\":\"ovmCREATE2\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_messageHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint8\",\"name\":\"_v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"_r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"_s\",\"type\":\"bytes32\"}],\"name\":\"ovmCREATEEOA\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_address\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_calldata\",\"type\":\"bytes\"}],\"name\":\"ovmDELEGATECALL\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"_success\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"_returndata\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_contract\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_offset\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_length\",\"type\":\"uint256\"}],\"name\":\"ovmEXTCODECOPY\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"_code\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_contract\",\"type\":\"address\"}],\"name\":\"ovmEXTCODEHASH\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"_EXTCODEHASH\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_contract\",\"type\":\"address\"}],\"name\":\"ovmEXTCODESIZE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_EXTCODESIZE\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ovmGASLIMIT\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_GASLIMIT\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ovmGETNONCE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_nonce\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ovmINCREMENTNONCE\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ovmL1QUEUEORIGIN\",\"outputs\":[{\"internalType\":\"enum Lib_OVMCodec.QueueOrigin\",\"name\":\"_queueOrigin\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ovmL1TXORIGIN\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"_l1TxOrigin\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ovmNUMBER\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_NUMBER\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"ovmREVERT\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_key\",\"type\":\"bytes32\"}],\"name\":\"ovmSLOAD\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"_value\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_key\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"_value\",\"type\":\"bytes32\"}],\"name\":\"ovmSSTORE\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_address\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_calldata\",\"type\":\"bytes\"}],\"name\":\"ovmSTATICCALL\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"_success\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"_returndata\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ovmTIMESTAMP\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_TIMESTAMP\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"enum Lib_OVMCodec.QueueOrigin\",\"name\":\"l1QueueOrigin\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"l1TxOrigin\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"entrypoint\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.Transaction\",\"name\":\"_transaction\",\"type\":\"tuple\"},{\"internalType\":\"address\",\"name\":\"_ovmStateManager\",\"type\":\"address\"}],\"name\":\"run\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_creationCode\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"_address\",\"type\":\"address\"}],\"name\":\"safeCREATE\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"enum Lib_OVMCodec.QueueOrigin\",\"name\":\"l1QueueOrigin\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"l1TxOrigin\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"entrypoint\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.Transaction\",\"name\":\"_transaction\",\"type\":\"tuple\"},{\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"internalType\":\"contract iOVM_StateManager\",\"name\":\"_ovmStateManager\",\"type\":\"address\"}],\"name\":\"simulateMessage\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The Execution Manager (EM) is the core of our OVM implementation, and provides a sandboxed environment allowing us to execute OVM transactions deterministically on either Layer 1 or Layer 2. The EM's run() function is the first function called during the execution of any transaction on L2. For each context-dependent EVM operation the EM has a function which implements a corresponding OVM operation, which will read state from the State Manager contract. The EM relies on the Safety Checker to verify that code deployed to Layer 2 does not contain any context-dependent operations. Compiler used: solc Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\"}},\"ovmADDRESS()\":{\"returns\":{\"_ADDRESS\":\"Active ADDRESS within the current message context.\"}},\"ovmCALL(uint256,address,bytes)\":{\"params\":{\"_address\":\"Address of the contract to call.\",\"_calldata\":\"Data to send along with the call.\",\"_gasLimit\":\"Amount of gas to be passed into this call.\"},\"returns\":{\"_returndata\":\"Data returned by the call.\",\"_success\":\"Whether or not the call returned (rather than reverted).\"}},\"ovmCALLER()\":{\"returns\":{\"_CALLER\":\"Address of the CALLER within the current message context.\"}},\"ovmCHAINID()\":{\"returns\":{\"_CHAINID\":\"Value of the chain's CHAINID within the global context.\"}},\"ovmCREATE(bytes)\":{\"params\":{\"_bytecode\":\"Code to be used to CREATE a new contract.\"},\"returns\":{\"_0\":\"Address of the created contract.\",\"_1\":\"Revert data, if and only if the creation threw an exception.\"}},\"ovmCREATE2(bytes,bytes32)\":{\"params\":{\"_bytecode\":\"Code to be used to CREATE2 a new contract.\",\"_salt\":\"Value used to determine the contract's address.\"},\"returns\":{\"_0\":\"Address of the created contract.\",\"_1\":\"Revert data, if and only if the creation threw an exception.\"}},\"ovmCREATEEOA(bytes32,uint8,bytes32,bytes32)\":{\"details\":\"Essentially functions like ovmCREATE or ovmCREATE2, but we can bypass a lot of checks because the contract we're creating is trusted (no need to do safety checking or to handle unexpected reverts). Doesn't need to return an address because the address is assumed to be the user's actual address.\",\"params\":{\"_messageHash\":\"Hash of a message signed by some user, for verification.\",\"_r\":\"Signature `r` parameter.\",\"_s\":\"Signature `s` parameter.\",\"_v\":\"Signature `v` parameter.\"}},\"ovmDELEGATECALL(uint256,address,bytes)\":{\"params\":{\"_address\":\"Address of the contract to call.\",\"_calldata\":\"Data to send along with the call.\",\"_gasLimit\":\"Amount of gas to be passed into this call.\"},\"returns\":{\"_returndata\":\"Data returned by the call.\",\"_success\":\"Whether or not the call returned (rather than reverted).\"}},\"ovmEXTCODECOPY(address,uint256,uint256)\":{\"params\":{\"_contract\":\"Address of the contract to copy code from.\",\"_length\":\"Total number of bytes to copy from the contract's code.\",\"_offset\":\"Offset in bytes from the start of contract code to copy beyond.\"},\"returns\":{\"_code\":\"Bytes of code copied from the requested contract.\"}},\"ovmEXTCODEHASH(address)\":{\"params\":{\"_contract\":\"Address of the contract to query the hash of.\"},\"returns\":{\"_EXTCODEHASH\":\"Hash of the requested contract.\"}},\"ovmEXTCODESIZE(address)\":{\"params\":{\"_contract\":\"Address of the contract to query the size of.\"},\"returns\":{\"_EXTCODESIZE\":\"Size of the requested contract in bytes.\"}},\"ovmGASLIMIT()\":{\"returns\":{\"_GASLIMIT\":\"Value of the block's GASLIMIT within the transaction context.\"}},\"ovmGETNONCE()\":{\"returns\":{\"_nonce\":\"Nonce of the current contract.\"}},\"ovmL1QUEUEORIGIN()\":{\"returns\":{\"_queueOrigin\":\"Enum indicating the ovmL1QUEUEORIGIN within the current message context.\"}},\"ovmL1TXORIGIN()\":{\"returns\":{\"_l1TxOrigin\":\"Address of the account which sent the tx into L2 from L1.\"}},\"ovmNUMBER()\":{\"returns\":{\"_NUMBER\":\"Value of the NUMBER within the transaction context.\"}},\"ovmREVERT(bytes)\":{\"params\":{\"_data\":\"Bytes data to pass along with the REVERT.\"}},\"ovmSLOAD(bytes32)\":{\"params\":{\"_key\":\"32 byte key of the storage slot to load.\"},\"returns\":{\"_value\":\"32 byte value of the requested storage slot.\"}},\"ovmSSTORE(bytes32,bytes32)\":{\"params\":{\"_key\":\"32 byte key of the storage slot to set.\",\"_value\":\"32 byte value for the storage slot.\"}},\"ovmSTATICCALL(uint256,address,bytes)\":{\"params\":{\"_address\":\"Address of the contract to call.\",\"_calldata\":\"Data to send along with the call.\",\"_gasLimit\":\"Amount of gas to be passed into this call.\"},\"returns\":{\"_returndata\":\"Data returned by the call.\",\"_success\":\"Whether or not the call returned (rather than reverted).\"}},\"ovmTIMESTAMP()\":{\"returns\":{\"_TIMESTAMP\":\"Value of the TIMESTAMP within the transaction context.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}},\"run((uint256,uint256,uint8,address,address,uint256,bytes),address)\":{\"params\":{\"_ovmStateManager\":\"iOVM_StateManager implementation providing account state.\",\"_transaction\":\"Transaction data to be executed.\"}},\"safeCREATE(uint256,bytes,address)\":{\"params\":{\"_address\":\"OVM address being deployed to.\",\"_creationCode\":\"Code to pass into CREATE for deployment.\",\"_gasLimit\":\"Amount of gas to be passed into this creation.\"}},\"simulateMessage((uint256,uint256,uint8,address,address,uint256,bytes),address,address)\":{\"params\":{\"_from\":\"the OVM account the simulated call should be from.\",\"_transaction\":\"the message transaction to simulate.\"}}},\"title\":\"OVM_ExecutionManager\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"ovmADDRESS()\":{\"notice\":\"Overrides ADDRESS.\"},\"ovmCALL(uint256,address,bytes)\":{\"notice\":\"Overrides CALL.\"},\"ovmCALLER()\":{\"notice\":\"Overrides CALLER.\"},\"ovmCHAINID()\":{\"notice\":\"Overrides CHAINID.\"},\"ovmCREATE(bytes)\":{\"notice\":\"Overrides CREATE.\"},\"ovmCREATE2(bytes,bytes32)\":{\"notice\":\"Overrides CREATE2.\"},\"ovmCREATEEOA(bytes32,uint8,bytes32,bytes32)\":{\"notice\":\"Creates a new EOA contract account, for account abstraction.\"},\"ovmDELEGATECALL(uint256,address,bytes)\":{\"notice\":\"Overrides DELEGATECALL.\"},\"ovmEXTCODECOPY(address,uint256,uint256)\":{\"notice\":\"Overrides EXTCODECOPY.\"},\"ovmEXTCODEHASH(address)\":{\"notice\":\"Overrides EXTCODEHASH.\"},\"ovmEXTCODESIZE(address)\":{\"notice\":\"Overrides EXTCODESIZE.\"},\"ovmGASLIMIT()\":{\"notice\":\"Overrides GASLIMIT.\"},\"ovmGETNONCE()\":{\"notice\":\"Retrieves the nonce of the current ovmADDRESS.\"},\"ovmINCREMENTNONCE()\":{\"notice\":\"Bumps the nonce of the current ovmADDRESS by one.\"},\"ovmL1QUEUEORIGIN()\":{\"notice\":\"Specifies from which source (Sequencer or Queue) this transaction originated from.\"},\"ovmL1TXORIGIN()\":{\"notice\":\"Specifies which L1 account, if any, sent this transaction by calling enqueue().\"},\"ovmNUMBER()\":{\"notice\":\"Overrides NUMBER.\"},\"ovmREVERT(bytes)\":{\"notice\":\"Overrides REVERT.\"},\"ovmSLOAD(bytes32)\":{\"notice\":\"Overrides SLOAD.\"},\"ovmSSTORE(bytes32,bytes32)\":{\"notice\":\"Overrides SSTORE.\"},\"ovmSTATICCALL(uint256,address,bytes)\":{\"notice\":\"Overrides STATICCALL.\"},\"ovmTIMESTAMP()\":{\"notice\":\"Overrides TIMESTAMP.\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"},\"run((uint256,uint256,uint8,address,address,uint256,bytes),address)\":{\"notice\":\"Starts the execution of a transaction via the OVM_ExecutionManager.\"},\"safeCREATE(uint256,bytes,address)\":{\"notice\":\"Handles the creation-specific safety measures required for OVM contract deployment. This function sanitizes the return types for creation messages to match calls (bool, bytes), by being an external function which the EM can call, that mimics the success/fail case of the CREATE. This allows for consistent handling of both types of messages in _handleExternalMessage(). Having this step occur as a separate call frame also allows us to easily revert the contract deployment in the event that the code is unsafe.\"},\"simulateMessage((uint256,uint256,uint8,address,address,uint256,bytes),address,address)\":{\"notice\":\"Unreachable helper function for simulating eth_calls with an OVM message context. This function will throw an exception in all cases other than when used as a custom entrypoint in L2 Geth to simulate eth_call.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol\":\"OVM_ExecutionManager\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor () internal {\\n address msgSender = _msgSender();\\n _owner = msgSender;\\n emit OwnershipTransferred(address(0), msgSender);\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n emit OwnershipTransferred(_owner, address(0));\\n _owner = address(0);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n emit OwnershipTransferred(_owner, newOwner);\\n _owner = newOwner;\\n }\\n}\\n\",\"keccak256\":\"0x15e2d5bd4c28a88548074c54d220e8086f638a71ed07e6b3ba5a70066fcf458d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with GSN meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address payable) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes memory) {\\n this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x8d3cb350f04ff49cfb10aef08d87f19dcbaecc8027b0bed12f3275cd12f38cf0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// @unsupported: ovm\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\nimport { Lib_EthUtils } from \\\"../../libraries/utils/Lib_EthUtils.sol\\\";\\nimport { Lib_ErrorUtils } from \\\"../../libraries/utils/Lib_ErrorUtils.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_ExecutionManager } from \\\"../../iOVM/execution/iOVM_ExecutionManager.sol\\\";\\nimport { iOVM_StateManager } from \\\"../../iOVM/execution/iOVM_StateManager.sol\\\";\\nimport { iOVM_SafetyChecker } from \\\"../../iOVM/execution/iOVM_SafetyChecker.sol\\\";\\n\\n/* Contract Imports */\\nimport { OVM_DeployerWhitelist } from \\\"../predeploys/OVM_DeployerWhitelist.sol\\\";\\n\\n/**\\n * @title OVM_ExecutionManager\\n * @dev The Execution Manager (EM) is the core of our OVM implementation, and provides a sandboxed\\n * environment allowing us to execute OVM transactions deterministically on either Layer 1 or\\n * Layer 2.\\n * The EM's run() function is the first function called during the execution of any\\n * transaction on L2.\\n * For each context-dependent EVM operation the EM has a function which implements a corresponding\\n * OVM operation, which will read state from the State Manager contract.\\n * The EM relies on the Safety Checker to verify that code deployed to Layer 2 does not contain any\\n * context-dependent operations.\\n *\\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract OVM_ExecutionManager is iOVM_ExecutionManager, Lib_AddressResolver {\\n\\n /********************************\\n * External Contract References *\\n ********************************/\\n\\n iOVM_SafetyChecker internal ovmSafetyChecker;\\n iOVM_StateManager internal ovmStateManager;\\n\\n\\n /*******************************\\n * Execution Context Variables *\\n *******************************/\\n\\n GasMeterConfig internal gasMeterConfig;\\n GlobalContext internal globalContext;\\n TransactionContext internal transactionContext;\\n MessageContext internal messageContext;\\n TransactionRecord internal transactionRecord;\\n MessageRecord internal messageRecord;\\n\\n\\n /**************************\\n * Gas Metering Constants *\\n **************************/\\n\\n address constant GAS_METADATA_ADDRESS = 0x06a506A506a506A506a506a506A506A506A506A5;\\n uint256 constant NUISANCE_GAS_SLOAD = 20000;\\n uint256 constant NUISANCE_GAS_SSTORE = 20000;\\n uint256 constant MIN_NUISANCE_GAS_PER_CONTRACT = 30000;\\n uint256 constant NUISANCE_GAS_PER_CONTRACT_BYTE = 100;\\n uint256 constant MIN_GAS_FOR_INVALID_STATE_ACCESS = 30000;\\n\\n /**************************\\n * Default Context Values *\\n **************************/\\n\\n uint256 constant DEFAULT_UINT256 = 0xdefa017defa017defa017defa017defa017defa017defa017defa017defa017d;\\n address constant DEFAULT_ADDRESS = 0xdEfa017defA017DeFA017DEfa017DeFA017DeFa0;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n */\\n constructor(\\n address _libAddressManager,\\n GasMeterConfig memory _gasMeterConfig,\\n GlobalContext memory _globalContext\\n )\\n Lib_AddressResolver(_libAddressManager)\\n {\\n ovmSafetyChecker = iOVM_SafetyChecker(resolve(\\\"OVM_SafetyChecker\\\"));\\n gasMeterConfig = _gasMeterConfig;\\n globalContext = _globalContext;\\n _resetContext();\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n /**\\n * Applies dynamically-sized refund to a transaction to account for the difference in execution\\n * between L1 and L2, so that the overall cost of the ovmOPCODE is fixed.\\n * @param _cost Desired gas cost for the function after the refund.\\n */\\n modifier netGasCost(\\n uint256 _cost\\n ) {\\n uint256 gasProvided = gasleft();\\n _;\\n uint256 gasUsed = gasProvided - gasleft();\\n\\n // We want to refund everything *except* the specified cost.\\n if (_cost < gasUsed) {\\n transactionRecord.ovmGasRefund += gasUsed - _cost;\\n }\\n }\\n\\n /**\\n * Applies a fixed-size gas refund to a transaction to account for the difference in execution\\n * between L1 and L2, so that the overall cost of an ovmOPCODE can be lowered.\\n * @param _discount Amount of gas cost to refund for the ovmOPCODE.\\n */\\n modifier fixedGasDiscount(\\n uint256 _discount\\n ) {\\n uint256 gasProvided = gasleft();\\n _;\\n uint256 gasUsed = gasProvided - gasleft();\\n\\n // We want to refund the specified _discount, unless this risks underflow.\\n if (_discount < gasUsed) {\\n transactionRecord.ovmGasRefund += _discount;\\n } else {\\n // refund all we can without risking underflow.\\n transactionRecord.ovmGasRefund += gasUsed;\\n }\\n }\\n\\n /**\\n * Makes sure we're not inside a static context.\\n */\\n modifier notStatic() {\\n if (messageContext.isStatic == true) {\\n _revertWithFlag(RevertFlag.STATIC_VIOLATION);\\n }\\n _;\\n }\\n\\n\\n /************************************\\n * Transaction Execution Entrypoint *\\n ************************************/\\n\\n /**\\n * Starts the execution of a transaction via the OVM_ExecutionManager.\\n * @param _transaction Transaction data to be executed.\\n * @param _ovmStateManager iOVM_StateManager implementation providing account state.\\n */\\n function run(\\n Lib_OVMCodec.Transaction memory _transaction,\\n address _ovmStateManager\\n )\\n override\\n public\\n returns (\\n bytes memory\\n )\\n {\\n // Make sure that run() is not re-enterable. This condition should always be satisfied\\n // Once run has been called once, due to the behavior of _isValidInput().\\n if (transactionContext.ovmNUMBER != DEFAULT_UINT256) {\\n return bytes(\\\"\\\");\\n }\\n\\n // Store our OVM_StateManager instance (significantly easier than attempting to pass the\\n // address around in calldata).\\n ovmStateManager = iOVM_StateManager(_ovmStateManager);\\n\\n // Make sure this function can't be called by anyone except the owner of the\\n // OVM_StateManager (expected to be an OVM_StateTransitioner). We can revert here because\\n // this would make the `run` itself invalid.\\n require(\\n // This method may return false during fraud proofs, but always returns true in L2 nodes' State Manager precompile.\\n ovmStateManager.isAuthenticated(msg.sender),\\n \\\"Only authenticated addresses in ovmStateManager can call this function\\\"\\n );\\n\\n // Initialize the execution context, must be initialized before we perform any gas metering\\n // or we'll throw a nuisance gas error.\\n _initContext(_transaction);\\n\\n // TEMPORARY: Gas metering is disabled for minnet.\\n // // Check whether we need to start a new epoch, do so if necessary.\\n // _checkNeedsNewEpoch(_transaction.timestamp);\\n\\n // Make sure the transaction's gas limit is valid. We don't revert here because we reserve\\n // reverts for INVALID_STATE_ACCESS.\\n if (_isValidInput(_transaction) == false) {\\n _resetContext();\\n return bytes(\\\"\\\");\\n }\\n\\n // TEMPORARY: Gas metering is disabled for minnet.\\n // // Check gas right before the call to get total gas consumed by OVM transaction.\\n // uint256 gasProvided = gasleft();\\n\\n // Run the transaction, make sure to meter the gas usage.\\n (, bytes memory returndata) = ovmCALL(\\n _transaction.gasLimit - gasMeterConfig.minTransactionGasLimit,\\n _transaction.entrypoint,\\n _transaction.data\\n );\\n\\n // TEMPORARY: Gas metering is disabled for minnet.\\n // // Update the cumulative gas based on the amount of gas used.\\n // uint256 gasUsed = gasProvided - gasleft();\\n // _updateCumulativeGas(gasUsed, _transaction.l1QueueOrigin);\\n\\n // Wipe the execution context.\\n _resetContext();\\n\\n return returndata;\\n }\\n\\n\\n /******************************\\n * Opcodes: Execution Context *\\n ******************************/\\n\\n /**\\n * @notice Overrides CALLER.\\n * @return _CALLER Address of the CALLER within the current message context.\\n */\\n function ovmCALLER()\\n override\\n public\\n view\\n returns (\\n address _CALLER\\n )\\n {\\n return messageContext.ovmCALLER;\\n }\\n\\n /**\\n * @notice Overrides ADDRESS.\\n * @return _ADDRESS Active ADDRESS within the current message context.\\n */\\n function ovmADDRESS()\\n override\\n public\\n view\\n returns (\\n address _ADDRESS\\n )\\n {\\n return messageContext.ovmADDRESS;\\n }\\n\\n /**\\n * @notice Overrides TIMESTAMP.\\n * @return _TIMESTAMP Value of the TIMESTAMP within the transaction context.\\n */\\n function ovmTIMESTAMP()\\n override\\n public\\n view\\n returns (\\n uint256 _TIMESTAMP\\n )\\n {\\n return transactionContext.ovmTIMESTAMP;\\n }\\n\\n /**\\n * @notice Overrides NUMBER.\\n * @return _NUMBER Value of the NUMBER within the transaction context.\\n */\\n function ovmNUMBER()\\n override\\n public\\n view\\n returns (\\n uint256 _NUMBER\\n )\\n {\\n return transactionContext.ovmNUMBER;\\n }\\n\\n /**\\n * @notice Overrides GASLIMIT.\\n * @return _GASLIMIT Value of the block's GASLIMIT within the transaction context.\\n */\\n function ovmGASLIMIT()\\n override\\n public\\n view\\n returns (\\n uint256 _GASLIMIT\\n )\\n {\\n return transactionContext.ovmGASLIMIT;\\n }\\n\\n /**\\n * @notice Overrides CHAINID.\\n * @return _CHAINID Value of the chain's CHAINID within the global context.\\n */\\n function ovmCHAINID()\\n override\\n public\\n view\\n returns (\\n uint256 _CHAINID\\n )\\n {\\n return globalContext.ovmCHAINID;\\n }\\n\\n /*********************************\\n * Opcodes: L2 Execution Context *\\n *********************************/\\n\\n /**\\n * @notice Specifies from which source (Sequencer or Queue) this transaction originated from.\\n * @return _queueOrigin Enum indicating the ovmL1QUEUEORIGIN within the current message context.\\n */\\n function ovmL1QUEUEORIGIN()\\n override\\n public\\n view\\n returns (\\n Lib_OVMCodec.QueueOrigin _queueOrigin\\n )\\n {\\n return transactionContext.ovmL1QUEUEORIGIN;\\n }\\n\\n /**\\n * @notice Specifies which L1 account, if any, sent this transaction by calling enqueue().\\n * @return _l1TxOrigin Address of the account which sent the tx into L2 from L1.\\n */\\n function ovmL1TXORIGIN()\\n override\\n public\\n view\\n returns (\\n address _l1TxOrigin\\n )\\n {\\n return transactionContext.ovmL1TXORIGIN;\\n }\\n\\n /********************\\n * Opcodes: Halting *\\n ********************/\\n\\n /**\\n * @notice Overrides REVERT.\\n * @param _data Bytes data to pass along with the REVERT.\\n */\\n function ovmREVERT(\\n bytes memory _data\\n )\\n override\\n public\\n {\\n _revertWithFlag(RevertFlag.INTENTIONAL_REVERT, _data);\\n }\\n\\n\\n /******************************\\n * Opcodes: Contract Creation *\\n ******************************/\\n\\n /**\\n * @notice Overrides CREATE.\\n * @param _bytecode Code to be used to CREATE a new contract.\\n * @return Address of the created contract.\\n * @return Revert data, if and only if the creation threw an exception.\\n */\\n function ovmCREATE(\\n bytes memory _bytecode\\n )\\n override\\n public\\n notStatic\\n fixedGasDiscount(40000)\\n returns (\\n address,\\n bytes memory\\n )\\n {\\n // Creator is always the current ADDRESS.\\n address creator = ovmADDRESS();\\n\\n // Check that the deployer is whitelisted, or\\n // that arbitrary contract deployment has been enabled.\\n _checkDeployerAllowed(creator);\\n\\n // Generate the correct CREATE address.\\n address contractAddress = Lib_EthUtils.getAddressForCREATE(\\n creator,\\n _getAccountNonce(creator)\\n );\\n\\n return _createContract(\\n contractAddress,\\n _bytecode\\n );\\n }\\n\\n /**\\n * @notice Overrides CREATE2.\\n * @param _bytecode Code to be used to CREATE2 a new contract.\\n * @param _salt Value used to determine the contract's address.\\n * @return Address of the created contract.\\n * @return Revert data, if and only if the creation threw an exception.\\n */\\n function ovmCREATE2(\\n bytes memory _bytecode,\\n bytes32 _salt\\n )\\n override\\n public\\n notStatic\\n fixedGasDiscount(40000)\\n returns (\\n address,\\n bytes memory\\n )\\n {\\n // Creator is always the current ADDRESS.\\n address creator = ovmADDRESS();\\n\\n // Check that the deployer is whitelisted, or\\n // that arbitrary contract deployment has been enabled.\\n _checkDeployerAllowed(creator);\\n\\n // Generate the correct CREATE2 address.\\n address contractAddress = Lib_EthUtils.getAddressForCREATE2(\\n creator,\\n _bytecode,\\n _salt\\n );\\n\\n return _createContract(\\n contractAddress,\\n _bytecode\\n );\\n }\\n\\n\\n /*******************************\\n * Account Abstraction Opcodes *\\n ******************************/\\n\\n /**\\n * Retrieves the nonce of the current ovmADDRESS.\\n * @return _nonce Nonce of the current contract.\\n */\\n function ovmGETNONCE()\\n override\\n public\\n returns (\\n uint256 _nonce\\n )\\n {\\n return _getAccountNonce(ovmADDRESS());\\n }\\n\\n /**\\n * Bumps the nonce of the current ovmADDRESS by one.\\n */\\n function ovmINCREMENTNONCE()\\n override\\n public\\n notStatic\\n {\\n address account = ovmADDRESS();\\n uint256 nonce = _getAccountNonce(account);\\n\\n // Prevent overflow.\\n if (nonce + 1 > nonce) {\\n _setAccountNonce(account, nonce + 1);\\n }\\n }\\n\\n /**\\n * Creates a new EOA contract account, for account abstraction.\\n * @dev Essentially functions like ovmCREATE or ovmCREATE2, but we can bypass a lot of checks\\n * because the contract we're creating is trusted (no need to do safety checking or to\\n * handle unexpected reverts). Doesn't need to return an address because the address is\\n * assumed to be the user's actual address.\\n * @param _messageHash Hash of a message signed by some user, for verification.\\n * @param _v Signature `v` parameter.\\n * @param _r Signature `r` parameter.\\n * @param _s Signature `s` parameter.\\n */\\n function ovmCREATEEOA(\\n bytes32 _messageHash,\\n uint8 _v,\\n bytes32 _r,\\n bytes32 _s\\n )\\n override\\n public\\n notStatic\\n {\\n // Recover the EOA address from the message hash and signature parameters. Since we do the\\n // hashing in advance, we don't have handle different message hashing schemes. Even if this\\n // function were to return the wrong address (rather than explicitly returning the zero\\n // address), the rest of the transaction would simply fail (since there's no EOA account to\\n // actually execute the transaction).\\n address eoa = ecrecover(\\n _messageHash,\\n _v + 27,\\n _r,\\n _s\\n );\\n\\n // Invalid signature is a case we proactively handle with a revert. We could alternatively\\n // have this function return a `success` boolean, but this is just easier.\\n if (eoa == address(0)) {\\n ovmREVERT(bytes(\\\"Signature provided for EOA contract creation is invalid.\\\"));\\n }\\n\\n // If the user already has an EOA account, then there's no need to perform this operation.\\n if (_hasEmptyAccount(eoa) == false) {\\n return;\\n }\\n\\n // We always need to initialize the contract with the default account values.\\n _initPendingAccount(eoa);\\n\\n // Temporarily set the current address so it's easier to access on L2.\\n address prevADDRESS = messageContext.ovmADDRESS;\\n messageContext.ovmADDRESS = eoa;\\n\\n // Creates a duplicate of the OVM_ProxyEOA located at 0x42....09. Uses the following\\n // \\\"magic\\\" prefix to deploy an exact copy of the code:\\n // PUSH1 0x0D # size of this prefix in bytes\\n // CODESIZE\\n // SUB # subtract prefix size from codesize\\n // DUP1\\n // PUSH1 0x0D\\n // PUSH1 0x00\\n // CODECOPY # copy everything after prefix into memory at pos 0\\n // PUSH1 0x00\\n // RETURN # return the copied code\\n address proxyEOA = Lib_EthUtils.createContract(abi.encodePacked(\\n hex\\\"600D380380600D6000396000f3\\\",\\n ovmEXTCODECOPY(\\n 0x4200000000000000000000000000000000000009,\\n 0,\\n ovmEXTCODESIZE(0x4200000000000000000000000000000000000009)\\n )\\n ));\\n\\n // Reset the address now that we're done deploying.\\n messageContext.ovmADDRESS = prevADDRESS;\\n\\n // Commit the account with its final values.\\n _commitPendingAccount(\\n eoa,\\n address(proxyEOA),\\n keccak256(Lib_EthUtils.getCode(address(proxyEOA)))\\n );\\n\\n _setAccountNonce(eoa, 0);\\n }\\n\\n\\n /*********************************\\n * Opcodes: Contract Interaction *\\n *********************************/\\n\\n /**\\n * @notice Overrides CALL.\\n * @param _gasLimit Amount of gas to be passed into this call.\\n * @param _address Address of the contract to call.\\n * @param _calldata Data to send along with the call.\\n * @return _success Whether or not the call returned (rather than reverted).\\n * @return _returndata Data returned by the call.\\n */\\n function ovmCALL(\\n uint256 _gasLimit,\\n address _address,\\n bytes memory _calldata\\n )\\n override\\n public\\n fixedGasDiscount(100000)\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n // CALL updates the CALLER and ADDRESS.\\n MessageContext memory nextMessageContext = messageContext;\\n nextMessageContext.ovmCALLER = nextMessageContext.ovmADDRESS;\\n nextMessageContext.ovmADDRESS = _address;\\n\\n return _callContract(\\n nextMessageContext,\\n _gasLimit,\\n _address,\\n _calldata\\n );\\n }\\n\\n /**\\n * @notice Overrides STATICCALL.\\n * @param _gasLimit Amount of gas to be passed into this call.\\n * @param _address Address of the contract to call.\\n * @param _calldata Data to send along with the call.\\n * @return _success Whether or not the call returned (rather than reverted).\\n * @return _returndata Data returned by the call.\\n */\\n function ovmSTATICCALL(\\n uint256 _gasLimit,\\n address _address,\\n bytes memory _calldata\\n )\\n override\\n public\\n fixedGasDiscount(80000)\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n // STATICCALL updates the CALLER, updates the ADDRESS, and runs in a static context.\\n MessageContext memory nextMessageContext = messageContext;\\n nextMessageContext.ovmCALLER = nextMessageContext.ovmADDRESS;\\n nextMessageContext.ovmADDRESS = _address;\\n nextMessageContext.isStatic = true;\\n\\n return _callContract(\\n nextMessageContext,\\n _gasLimit,\\n _address,\\n _calldata\\n );\\n }\\n\\n /**\\n * @notice Overrides DELEGATECALL.\\n * @param _gasLimit Amount of gas to be passed into this call.\\n * @param _address Address of the contract to call.\\n * @param _calldata Data to send along with the call.\\n * @return _success Whether or not the call returned (rather than reverted).\\n * @return _returndata Data returned by the call.\\n */\\n function ovmDELEGATECALL(\\n uint256 _gasLimit,\\n address _address,\\n bytes memory _calldata\\n )\\n override\\n public\\n fixedGasDiscount(40000)\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n // DELEGATECALL does not change anything about the message context.\\n MessageContext memory nextMessageContext = messageContext;\\n\\n return _callContract(\\n nextMessageContext,\\n _gasLimit,\\n _address,\\n _calldata\\n );\\n }\\n\\n\\n /************************************\\n * Opcodes: Contract Storage Access *\\n ************************************/\\n\\n /**\\n * @notice Overrides SLOAD.\\n * @param _key 32 byte key of the storage slot to load.\\n * @return _value 32 byte value of the requested storage slot.\\n */\\n function ovmSLOAD(\\n bytes32 _key\\n )\\n override\\n public\\n netGasCost(40000)\\n returns (\\n bytes32 _value\\n )\\n {\\n // We always SLOAD from the storage of ADDRESS.\\n address contractAddress = ovmADDRESS();\\n\\n return _getContractStorage(\\n contractAddress,\\n _key\\n );\\n }\\n\\n /**\\n * @notice Overrides SSTORE.\\n * @param _key 32 byte key of the storage slot to set.\\n * @param _value 32 byte value for the storage slot.\\n */\\n function ovmSSTORE(\\n bytes32 _key,\\n bytes32 _value\\n )\\n override\\n public\\n notStatic\\n netGasCost(60000)\\n {\\n // We always SSTORE to the storage of ADDRESS.\\n address contractAddress = ovmADDRESS();\\n\\n _putContractStorage(\\n contractAddress,\\n _key,\\n _value\\n );\\n }\\n\\n\\n /*********************************\\n * Opcodes: Contract Code Access *\\n *********************************/\\n\\n /**\\n * @notice Overrides EXTCODECOPY.\\n * @param _contract Address of the contract to copy code from.\\n * @param _offset Offset in bytes from the start of contract code to copy beyond.\\n * @param _length Total number of bytes to copy from the contract's code.\\n * @return _code Bytes of code copied from the requested contract.\\n */\\n function ovmEXTCODECOPY(\\n address _contract,\\n uint256 _offset,\\n uint256 _length\\n )\\n override\\n public\\n returns (\\n bytes memory _code\\n )\\n {\\n return Lib_EthUtils.getCode(\\n _getAccountEthAddress(_contract),\\n _offset,\\n _length\\n );\\n }\\n\\n /**\\n * @notice Overrides EXTCODESIZE.\\n * @param _contract Address of the contract to query the size of.\\n * @return _EXTCODESIZE Size of the requested contract in bytes.\\n */\\n function ovmEXTCODESIZE(\\n address _contract\\n )\\n override\\n public\\n returns (\\n uint256 _EXTCODESIZE\\n )\\n {\\n return Lib_EthUtils.getCodeSize(\\n _getAccountEthAddress(_contract)\\n );\\n }\\n\\n /**\\n * @notice Overrides EXTCODEHASH.\\n * @param _contract Address of the contract to query the hash of.\\n * @return _EXTCODEHASH Hash of the requested contract.\\n */\\n function ovmEXTCODEHASH(\\n address _contract\\n )\\n override\\n public\\n returns (\\n bytes32 _EXTCODEHASH\\n )\\n {\\n return Lib_EthUtils.getCodeHash(\\n _getAccountEthAddress(_contract)\\n );\\n }\\n\\n /***************************************\\n * Public Functions: Execution Context *\\n ***************************************/\\n\\n function getMaxTransactionGasLimit()\\n external\\n view\\n override\\n returns (\\n uint256 _maxTransactionGasLimit\\n )\\n {\\n return gasMeterConfig.maxTransactionGasLimit;\\n }\\n\\n /********************************************\\n * Public Functions: Deployment Whitelisting *\\n ********************************************/\\n\\n /**\\n * Checks whether the given address is on the whitelist to ovmCREATE/ovmCREATE2, and reverts if not.\\n * @param _deployerAddress Address attempting to deploy a contract.\\n */\\n function _checkDeployerAllowed(\\n address _deployerAddress\\n )\\n internal\\n {\\n // From an OVM semantics perspective, this will appear identical to\\n // the deployer ovmCALLing the whitelist. This is fine--in a sense, we are forcing them to.\\n (bool success, bytes memory data) = ovmCALL(\\n gasleft(),\\n 0x4200000000000000000000000000000000000002,\\n abi.encodeWithSignature(\\\"isDeployerAllowed(address)\\\", _deployerAddress)\\n );\\n bool isAllowed = abi.decode(data, (bool));\\n\\n if (!isAllowed || !success) {\\n _revertWithFlag(RevertFlag.CREATOR_NOT_ALLOWED);\\n }\\n }\\n\\n /********************************************\\n * Internal Functions: Contract Interaction *\\n ********************************************/\\n\\n /**\\n * Creates a new contract and associates it with some contract address.\\n * @param _contractAddress Address to associate the created contract with.\\n * @param _bytecode Bytecode to be used to create the contract.\\n * @return Final OVM contract address.\\n * @return Revertdata, if and only if the creation threw an exception.\\n */\\n function _createContract(\\n address _contractAddress,\\n bytes memory _bytecode\\n )\\n internal\\n returns (\\n address,\\n bytes memory\\n )\\n {\\n // We always update the nonce of the creating account, even if the creation fails.\\n _setAccountNonce(ovmADDRESS(), _getAccountNonce(ovmADDRESS()) + 1);\\n\\n // We're stepping into a CREATE or CREATE2, so we need to update ADDRESS to point\\n // to the contract's associated address and CALLER to point to the previous ADDRESS.\\n MessageContext memory nextMessageContext = messageContext;\\n nextMessageContext.ovmCALLER = messageContext.ovmADDRESS;\\n nextMessageContext.ovmADDRESS = _contractAddress;\\n\\n // Run the common logic which occurs between call-type and create-type messages,\\n // passing in the creation bytecode and `true` to trigger create-specific logic.\\n (bool success, bytes memory data) = _handleExternalMessage(\\n nextMessageContext,\\n gasleft(),\\n _contractAddress,\\n _bytecode,\\n true\\n );\\n\\n // Yellow paper requires that address returned is zero if the contract deployment fails.\\n return (\\n success ? _contractAddress : address(0),\\n data\\n );\\n }\\n\\n /**\\n * Calls the deployed contract associated with a given address.\\n * @param _nextMessageContext Message context to be used for the call.\\n * @param _gasLimit Amount of gas to be passed into this call.\\n * @param _contract OVM address to be called.\\n * @param _calldata Data to send along with the call.\\n * @return _success Whether or not the call returned (rather than reverted).\\n * @return _returndata Data returned by the call.\\n */\\n function _callContract(\\n MessageContext memory _nextMessageContext,\\n uint256 _gasLimit,\\n address _contract,\\n bytes memory _calldata\\n )\\n internal\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n // We reserve addresses of the form 0xdeaddeaddead...NNNN for the container contracts in L2 geth.\\n // So, we block calls to these addresses since they are not safe to run as an OVM contract itself.\\n if (\\n (uint256(_contract) & uint256(0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000))\\n == uint256(0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000)\\n ) {\\n // EVM does not return data in the success case, see: https://github.com/ethereum/go-ethereum/blob/aae7660410f0ef90279e14afaaf2f429fdc2a186/core/vm/instructions.go#L600-L604\\n return (true, hex'');\\n }\\n\\n // Both 0x0000... and the EVM precompiles have the same address on L1 and L2 --> no trie lookup needed.\\n address codeContractAddress =\\n uint(_contract) < 100\\n ? _contract\\n : _getAccountEthAddress(_contract);\\n\\n return _handleExternalMessage(\\n _nextMessageContext,\\n _gasLimit,\\n codeContractAddress,\\n _calldata,\\n false\\n );\\n }\\n\\n /**\\n * Handles all interactions which involve the execution manager calling out to untrusted code (both calls and creates).\\n * Ensures that OVM-related measures are enforced, including L2 gas refunds, nuisance gas, and flagged reversions.\\n *\\n * @param _nextMessageContext Message context to be used for the external message.\\n * @param _gasLimit Amount of gas to be passed into this message.\\n * @param _contract OVM address being called or deployed to\\n * @param _data Data for the message (either calldata or creation code)\\n * @param _isCreate Whether this is a create-type message.\\n * @return Whether or not the message (either a call or deployment) succeeded.\\n * @return Data returned by the message.\\n */\\n function _handleExternalMessage(\\n MessageContext memory _nextMessageContext,\\n uint256 _gasLimit,\\n address _contract,\\n bytes memory _data,\\n bool _isCreate\\n )\\n internal\\n returns (\\n bool,\\n bytes memory\\n )\\n {\\n // We need to switch over to our next message context for the duration of this call.\\n MessageContext memory prevMessageContext = messageContext;\\n _switchMessageContext(prevMessageContext, _nextMessageContext);\\n\\n // Nuisance gas is a system used to bound the ability for an attacker to make fraud proofs\\n // expensive by touching a lot of different accounts or storage slots. Since most contracts\\n // only use a few storage slots during any given transaction, this shouldn't be a limiting\\n // factor.\\n uint256 prevNuisanceGasLeft = messageRecord.nuisanceGasLeft;\\n uint256 nuisanceGasLimit = _getNuisanceGasLimit(_gasLimit);\\n messageRecord.nuisanceGasLeft = nuisanceGasLimit;\\n\\n // Make the call and make sure to pass in the gas limit. Another instance of hidden\\n // complexity. `_contract` is guaranteed to be a safe contract, meaning its return/revert\\n // behavior can be controlled. In particular, we enforce that flags are passed through\\n // revert data as to retrieve execution metadata that would normally be reverted out of\\n // existence.\\n\\n bool success;\\n bytes memory returndata;\\n if (_isCreate) {\\n // safeCREATE() is a function which replicates a CREATE message, but uses return values\\n // Which match that of CALL (i.e. bool, bytes). This allows many security checks to be\\n // to be shared between untrusted call and create call frames.\\n (success, returndata) = address(this).call(\\n abi.encodeWithSelector(\\n this.safeCREATE.selector,\\n _gasLimit,\\n _data,\\n _contract\\n )\\n );\\n } else {\\n (success, returndata) = _contract.call{gas: _gasLimit}(_data);\\n }\\n\\n // Switch back to the original message context now that we're out of the call.\\n _switchMessageContext(_nextMessageContext, prevMessageContext);\\n\\n // Assuming there were no reverts, the message record should be accurate here. We'll update\\n // this value in the case of a revert.\\n uint256 nuisanceGasLeft = messageRecord.nuisanceGasLeft;\\n\\n // Reverts at this point are completely OK, but we need to make a few updates based on the\\n // information passed through the revert.\\n if (success == false) {\\n (\\n RevertFlag flag,\\n uint256 nuisanceGasLeftPostRevert,\\n uint256 ovmGasRefund,\\n bytes memory returndataFromFlag\\n ) = _decodeRevertData(returndata);\\n\\n // INVALID_STATE_ACCESS is the only flag that triggers an immediate abort of the\\n // parent EVM message. This behavior is necessary because INVALID_STATE_ACCESS must\\n // halt any further transaction execution that could impact the execution result.\\n if (flag == RevertFlag.INVALID_STATE_ACCESS) {\\n _revertWithFlag(flag);\\n }\\n\\n // INTENTIONAL_REVERT, UNSAFE_BYTECODE, STATIC_VIOLATION, and CREATOR_NOT_ALLOWED aren't\\n // dependent on the input state, so we can just handle them like standard reverts. Our only change here\\n // is to record the gas refund reported by the call (enforced by safety checking).\\n if (\\n flag == RevertFlag.INTENTIONAL_REVERT\\n || flag == RevertFlag.UNSAFE_BYTECODE\\n || flag == RevertFlag.STATIC_VIOLATION\\n || flag == RevertFlag.CREATOR_NOT_ALLOWED\\n ) {\\n transactionRecord.ovmGasRefund = ovmGasRefund;\\n }\\n\\n // INTENTIONAL_REVERT needs to pass up the user-provided return data encoded into the\\n // flag, *not* the full encoded flag. All other revert types return no data.\\n if (\\n flag == RevertFlag.INTENTIONAL_REVERT\\n || _isCreate\\n ) {\\n returndata = returndataFromFlag;\\n } else {\\n returndata = hex'';\\n }\\n\\n // Reverts mean we need to use up whatever \\\"nuisance gas\\\" was used by the call.\\n // EXCEEDS_NUISANCE_GAS explicitly reduces the remaining nuisance gas for this message\\n // to zero. OUT_OF_GAS is a \\\"pseudo\\\" flag given that messages return no data when they\\n // run out of gas, so we have to treat this like EXCEEDS_NUISANCE_GAS. All other flags\\n // will simply pass up the remaining nuisance gas.\\n nuisanceGasLeft = nuisanceGasLeftPostRevert;\\n }\\n\\n // We need to reset the nuisance gas back to its original value minus the amount used here.\\n messageRecord.nuisanceGasLeft = prevNuisanceGasLeft - (nuisanceGasLimit - nuisanceGasLeft);\\n\\n return (\\n success,\\n returndata\\n );\\n }\\n\\n /**\\n * Handles the creation-specific safety measures required for OVM contract deployment.\\n * This function sanitizes the return types for creation messages to match calls (bool, bytes),\\n * by being an external function which the EM can call, that mimics the success/fail case of the CREATE.\\n * This allows for consistent handling of both types of messages in _handleExternalMessage().\\n * Having this step occur as a separate call frame also allows us to easily revert the\\n * contract deployment in the event that the code is unsafe.\\n *\\n * @param _gasLimit Amount of gas to be passed into this creation.\\n * @param _creationCode Code to pass into CREATE for deployment.\\n * @param _address OVM address being deployed to.\\n */\\n function safeCREATE(\\n uint _gasLimit,\\n bytes memory _creationCode,\\n address _address\\n )\\n external\\n {\\n // The only way this should callable is from within _createContract(),\\n // and it should DEFINITELY not be callable by a non-EM code contract.\\n if (msg.sender != address(this)) {\\n return;\\n }\\n // Check that there is not already code at this address.\\n if (_hasEmptyAccount(_address) == false) {\\n // Note: in the EVM, this case burns all allotted gas. For improved\\n // developer experience, we do return the remaining gas.\\n _revertWithFlag(\\n RevertFlag.CREATE_COLLISION,\\n Lib_ErrorUtils.encodeRevertString(\\\"A contract has already been deployed to this address\\\")\\n );\\n }\\n\\n // Check the creation bytecode against the OVM_SafetyChecker.\\n if (ovmSafetyChecker.isBytecodeSafe(_creationCode) == false) {\\n _revertWithFlag(\\n RevertFlag.UNSAFE_BYTECODE,\\n Lib_ErrorUtils.encodeRevertString(\\\"Contract creation code contains unsafe opcodes. Did you use the right compiler or pass an unsafe constructor argument?\\\")\\n );\\n }\\n\\n // We always need to initialize the contract with the default account values.\\n _initPendingAccount(_address);\\n\\n // Actually execute the EVM create message.\\n // NOTE: The inline assembly below means we can NOT make any evm calls between here and then.\\n address ethAddress = Lib_EthUtils.createContract(_creationCode);\\n\\n if (ethAddress == address(0)) {\\n // If the creation fails, the EVM lets us grab its revert data. This may contain a revert flag\\n // to be used above in _handleExternalMessage, so we pass the revert data back up unmodified.\\n assembly {\\n returndatacopy(0,0,returndatasize())\\n revert(0, returndatasize())\\n }\\n }\\n\\n // Again simply checking that the deployed code is safe too. Contracts can generate\\n // arbitrary deployment code, so there's no easy way to analyze this beforehand.\\n bytes memory deployedCode = Lib_EthUtils.getCode(ethAddress);\\n if (ovmSafetyChecker.isBytecodeSafe(deployedCode) == false) {\\n _revertWithFlag(\\n RevertFlag.UNSAFE_BYTECODE,\\n Lib_ErrorUtils.encodeRevertString(\\\"Constructor attempted to deploy unsafe bytecode.\\\")\\n );\\n }\\n\\n // Contract creation didn't need to be reverted and the bytecode is safe. We finish up by\\n // associating the desired address with the newly created contract's code hash and address.\\n _commitPendingAccount(\\n _address,\\n ethAddress,\\n Lib_EthUtils.getCodeHash(ethAddress)\\n );\\n }\\n\\n /******************************************\\n * Internal Functions: State Manipulation *\\n ******************************************/\\n\\n /**\\n * Checks whether an account exists within the OVM_StateManager.\\n * @param _address Address of the account to check.\\n * @return _exists Whether or not the account exists.\\n */\\n function _hasAccount(\\n address _address\\n )\\n internal\\n returns (\\n bool _exists\\n )\\n {\\n _checkAccountLoad(_address);\\n return ovmStateManager.hasAccount(_address);\\n }\\n\\n /**\\n * Checks whether a known empty account exists within the OVM_StateManager.\\n * @param _address Address of the account to check.\\n * @return _exists Whether or not the account empty exists.\\n */\\n function _hasEmptyAccount(\\n address _address\\n )\\n internal\\n returns (\\n bool _exists\\n )\\n {\\n _checkAccountLoad(_address);\\n return ovmStateManager.hasEmptyAccount(_address);\\n }\\n\\n /**\\n * Sets the nonce of an account.\\n * @param _address Address of the account to modify.\\n * @param _nonce New account nonce.\\n */\\n function _setAccountNonce(\\n address _address,\\n uint256 _nonce\\n )\\n internal\\n {\\n _checkAccountChange(_address);\\n ovmStateManager.setAccountNonce(_address, _nonce);\\n }\\n\\n /**\\n * Gets the nonce of an account.\\n * @param _address Address of the account to access.\\n * @return _nonce Nonce of the account.\\n */\\n function _getAccountNonce(\\n address _address\\n )\\n internal\\n returns (\\n uint256 _nonce\\n )\\n {\\n _checkAccountLoad(_address);\\n return ovmStateManager.getAccountNonce(_address);\\n }\\n\\n /**\\n * Retrieves the Ethereum address of an account.\\n * @param _address Address of the account to access.\\n * @return _ethAddress Corresponding Ethereum address.\\n */\\n function _getAccountEthAddress(\\n address _address\\n )\\n internal\\n returns (\\n address _ethAddress\\n )\\n {\\n _checkAccountLoad(_address);\\n return ovmStateManager.getAccountEthAddress(_address);\\n }\\n\\n /**\\n * Creates the default account object for the given address.\\n * @param _address Address of the account create.\\n */\\n function _initPendingAccount(\\n address _address\\n )\\n internal\\n {\\n // Although it seems like `_checkAccountChange` would be more appropriate here, we don't\\n // actually consider an account \\\"changed\\\" until it's inserted into the state (in this case\\n // by `_commitPendingAccount`).\\n _checkAccountLoad(_address);\\n ovmStateManager.initPendingAccount(_address);\\n }\\n\\n /**\\n * Stores additional relevant data for a new account, thereby \\\"committing\\\" it to the state.\\n * This function is only called during `ovmCREATE` and `ovmCREATE2` after a successful contract\\n * creation.\\n * @param _address Address of the account to commit.\\n * @param _ethAddress Address of the associated deployed contract.\\n * @param _codeHash Hash of the code stored at the address.\\n */\\n function _commitPendingAccount(\\n address _address,\\n address _ethAddress,\\n bytes32 _codeHash\\n )\\n internal\\n {\\n _checkAccountChange(_address);\\n ovmStateManager.commitPendingAccount(\\n _address,\\n _ethAddress,\\n _codeHash\\n );\\n }\\n\\n /**\\n * Retrieves the value of a storage slot.\\n * @param _contract Address of the contract to query.\\n * @param _key 32 byte key of the storage slot.\\n * @return _value 32 byte storage slot value.\\n */\\n function _getContractStorage(\\n address _contract,\\n bytes32 _key\\n )\\n internal\\n returns (\\n bytes32 _value\\n )\\n {\\n _checkContractStorageLoad(_contract, _key);\\n return ovmStateManager.getContractStorage(_contract, _key);\\n }\\n\\n /**\\n * Sets the value of a storage slot.\\n * @param _contract Address of the contract to modify.\\n * @param _key 32 byte key of the storage slot.\\n * @param _value 32 byte storage slot value.\\n */\\n function _putContractStorage(\\n address _contract,\\n bytes32 _key,\\n bytes32 _value\\n )\\n internal\\n {\\n // We don't set storage if the value didn't change. Although this acts as a convenient\\n // optimization, it's also necessary to avoid the case in which a contract with no storage\\n // attempts to store the value \\\"0\\\" at any key. Putting this value (and therefore requiring\\n // that the value be committed into the storage trie after execution) would incorrectly\\n // modify the storage root.\\n if (_getContractStorage(_contract, _key) == _value) {\\n return;\\n }\\n\\n _checkContractStorageChange(_contract, _key);\\n ovmStateManager.putContractStorage(_contract, _key, _value);\\n }\\n\\n /**\\n * Validation whenever a contract needs to be loaded. Checks that the account exists, charges\\n * nuisance gas if the account hasn't been loaded before.\\n * @param _address Address of the account to load.\\n */\\n function _checkAccountLoad(\\n address _address\\n )\\n internal\\n {\\n // See `_checkContractStorageLoad` for more information.\\n if (gasleft() < MIN_GAS_FOR_INVALID_STATE_ACCESS) {\\n _revertWithFlag(RevertFlag.OUT_OF_GAS);\\n }\\n\\n // See `_checkContractStorageLoad` for more information.\\n if (ovmStateManager.hasAccount(_address) == false) {\\n _revertWithFlag(RevertFlag.INVALID_STATE_ACCESS);\\n }\\n\\n // Check whether the account has been loaded before and mark it as loaded if not. We need\\n // this because \\\"nuisance gas\\\" only applies to the first time that an account is loaded.\\n (\\n bool _wasAccountAlreadyLoaded\\n ) = ovmStateManager.testAndSetAccountLoaded(_address);\\n\\n // If we hadn't already loaded the account, then we'll need to charge \\\"nuisance gas\\\" based\\n // on the size of the contract code.\\n if (_wasAccountAlreadyLoaded == false) {\\n _useNuisanceGas(\\n (Lib_EthUtils.getCodeSize(_getAccountEthAddress(_address)) * NUISANCE_GAS_PER_CONTRACT_BYTE) + MIN_NUISANCE_GAS_PER_CONTRACT\\n );\\n }\\n }\\n\\n /**\\n * Validation whenever a contract needs to be changed. Checks that the account exists, charges\\n * nuisance gas if the account hasn't been changed before.\\n * @param _address Address of the account to change.\\n */\\n function _checkAccountChange(\\n address _address\\n )\\n internal\\n {\\n // Start by checking for a load as we only want to charge nuisance gas proportional to\\n // contract size once.\\n _checkAccountLoad(_address);\\n\\n // Check whether the account has been changed before and mark it as changed if not. We need\\n // this because \\\"nuisance gas\\\" only applies to the first time that an account is changed.\\n (\\n bool _wasAccountAlreadyChanged\\n ) = ovmStateManager.testAndSetAccountChanged(_address);\\n\\n // If we hadn't already loaded the account, then we'll need to charge \\\"nuisance gas\\\" based\\n // on the size of the contract code.\\n if (_wasAccountAlreadyChanged == false) {\\n ovmStateManager.incrementTotalUncommittedAccounts();\\n _useNuisanceGas(\\n (Lib_EthUtils.getCodeSize(_getAccountEthAddress(_address)) * NUISANCE_GAS_PER_CONTRACT_BYTE) + MIN_NUISANCE_GAS_PER_CONTRACT\\n );\\n }\\n }\\n\\n /**\\n * Validation whenever a slot needs to be loaded. Checks that the account exists, charges\\n * nuisance gas if the slot hasn't been loaded before.\\n * @param _contract Address of the account to load from.\\n * @param _key 32 byte key to load.\\n */\\n function _checkContractStorageLoad(\\n address _contract,\\n bytes32 _key\\n )\\n internal\\n {\\n // Another case of hidden complexity. If we didn't enforce this requirement, then a\\n // contract could pass in just enough gas to cause the INVALID_STATE_ACCESS check to fail\\n // on L1 but not on L2. A contract could use this behavior to prevent the\\n // OVM_ExecutionManager from detecting an invalid state access. Reverting with OUT_OF_GAS\\n // allows us to also charge for the full message nuisance gas, because you deserve that for\\n // trying to break the contract in this way.\\n if (gasleft() < MIN_GAS_FOR_INVALID_STATE_ACCESS) {\\n _revertWithFlag(RevertFlag.OUT_OF_GAS);\\n }\\n\\n // We need to make sure that the transaction isn't trying to access storage that hasn't\\n // been provided to the OVM_StateManager. We'll immediately abort if this is the case.\\n // We know that we have enough gas to do this check because of the above test.\\n if (ovmStateManager.hasContractStorage(_contract, _key) == false) {\\n _revertWithFlag(RevertFlag.INVALID_STATE_ACCESS);\\n }\\n\\n // Check whether the slot has been loaded before and mark it as loaded if not. We need\\n // this because \\\"nuisance gas\\\" only applies to the first time that a slot is loaded.\\n (\\n bool _wasContractStorageAlreadyLoaded\\n ) = ovmStateManager.testAndSetContractStorageLoaded(_contract, _key);\\n\\n // If we hadn't already loaded the account, then we'll need to charge some fixed amount of\\n // \\\"nuisance gas\\\".\\n if (_wasContractStorageAlreadyLoaded == false) {\\n _useNuisanceGas(NUISANCE_GAS_SLOAD);\\n }\\n }\\n\\n /**\\n * Validation whenever a slot needs to be changed. Checks that the account exists, charges\\n * nuisance gas if the slot hasn't been changed before.\\n * @param _contract Address of the account to change.\\n * @param _key 32 byte key to change.\\n */\\n function _checkContractStorageChange(\\n address _contract,\\n bytes32 _key\\n )\\n internal\\n {\\n // Start by checking for load to make sure we have the storage slot and that we charge the\\n // \\\"nuisance gas\\\" necessary to prove the storage slot state.\\n _checkContractStorageLoad(_contract, _key);\\n\\n // Check whether the slot has been changed before and mark it as changed if not. We need\\n // this because \\\"nuisance gas\\\" only applies to the first time that a slot is changed.\\n (\\n bool _wasContractStorageAlreadyChanged\\n ) = ovmStateManager.testAndSetContractStorageChanged(_contract, _key);\\n\\n // If we hadn't already changed the account, then we'll need to charge some fixed amount of\\n // \\\"nuisance gas\\\".\\n if (_wasContractStorageAlreadyChanged == false) {\\n // Changing a storage slot means that we're also going to have to change the\\n // corresponding account, so do an account change check.\\n _checkAccountChange(_contract);\\n\\n ovmStateManager.incrementTotalUncommittedContractStorage();\\n _useNuisanceGas(NUISANCE_GAS_SSTORE);\\n }\\n }\\n\\n\\n /************************************\\n * Internal Functions: Revert Logic *\\n ************************************/\\n\\n /**\\n * Simple encoding for revert data.\\n * @param _flag Flag to revert with.\\n * @param _data Additional user-provided revert data.\\n * @return _revertdata Encoded revert data.\\n */\\n function _encodeRevertData(\\n RevertFlag _flag,\\n bytes memory _data\\n )\\n internal\\n view\\n returns (\\n bytes memory _revertdata\\n )\\n {\\n // Out of gas and create exceptions will fundamentally return no data, so simulating it shouldn't either.\\n if (\\n _flag == RevertFlag.OUT_OF_GAS\\n ) {\\n return bytes('');\\n }\\n\\n // INVALID_STATE_ACCESS doesn't need to return any data other than the flag.\\n if (_flag == RevertFlag.INVALID_STATE_ACCESS) {\\n return abi.encode(\\n _flag,\\n 0,\\n 0,\\n bytes('')\\n );\\n }\\n\\n // Just ABI encode the rest of the parameters.\\n return abi.encode(\\n _flag,\\n messageRecord.nuisanceGasLeft,\\n transactionRecord.ovmGasRefund,\\n _data\\n );\\n }\\n\\n /**\\n * Simple decoding for revert data.\\n * @param _revertdata Revert data to decode.\\n * @return _flag Flag used to revert.\\n * @return _nuisanceGasLeft Amount of nuisance gas unused by the message.\\n * @return _ovmGasRefund Amount of gas refunded during the message.\\n * @return _data Additional user-provided revert data.\\n */\\n function _decodeRevertData(\\n bytes memory _revertdata\\n )\\n internal\\n pure\\n returns (\\n RevertFlag _flag,\\n uint256 _nuisanceGasLeft,\\n uint256 _ovmGasRefund,\\n bytes memory _data\\n )\\n {\\n // A length of zero means the call ran out of gas, just return empty data.\\n if (_revertdata.length == 0) {\\n return (\\n RevertFlag.OUT_OF_GAS,\\n 0,\\n 0,\\n bytes('')\\n );\\n }\\n\\n // ABI decode the incoming data.\\n return abi.decode(_revertdata, (RevertFlag, uint256, uint256, bytes));\\n }\\n\\n /**\\n * Causes a message to revert or abort.\\n * @param _flag Flag to revert with.\\n * @param _data Additional user-provided data.\\n */\\n function _revertWithFlag(\\n RevertFlag _flag,\\n bytes memory _data\\n )\\n internal\\n view\\n {\\n bytes memory revertdata = _encodeRevertData(\\n _flag,\\n _data\\n );\\n\\n assembly {\\n revert(add(revertdata, 0x20), mload(revertdata))\\n }\\n }\\n\\n /**\\n * Causes a message to revert or abort.\\n * @param _flag Flag to revert with.\\n */\\n function _revertWithFlag(\\n RevertFlag _flag\\n )\\n internal\\n {\\n _revertWithFlag(_flag, bytes(''));\\n }\\n\\n\\n /******************************************\\n * Internal Functions: Nuisance Gas Logic *\\n ******************************************/\\n\\n /**\\n * Computes the nuisance gas limit from the gas limit.\\n * @dev This function is currently using a naive implementation whereby the nuisance gas limit\\n * is set to exactly equal the lesser of the gas limit or remaining gas. It's likely that\\n * this implementation is perfectly fine, but we may change this formula later.\\n * @param _gasLimit Gas limit to compute from.\\n * @return _nuisanceGasLimit Computed nuisance gas limit.\\n */\\n function _getNuisanceGasLimit(\\n uint256 _gasLimit\\n )\\n internal\\n view\\n returns (\\n uint256 _nuisanceGasLimit\\n )\\n {\\n return _gasLimit < gasleft() ? _gasLimit : gasleft();\\n }\\n\\n /**\\n * Uses a certain amount of nuisance gas.\\n * @param _amount Amount of nuisance gas to use.\\n */\\n function _useNuisanceGas(\\n uint256 _amount\\n )\\n internal\\n {\\n // Essentially the same as a standard OUT_OF_GAS, except we also retain a record of the gas\\n // refund to be given at the end of the transaction.\\n if (messageRecord.nuisanceGasLeft < _amount) {\\n _revertWithFlag(RevertFlag.EXCEEDS_NUISANCE_GAS);\\n }\\n\\n messageRecord.nuisanceGasLeft -= _amount;\\n }\\n\\n\\n /************************************\\n * Internal Functions: Gas Metering *\\n ************************************/\\n\\n /**\\n * Checks whether a transaction needs to start a new epoch and does so if necessary.\\n * @param _timestamp Transaction timestamp.\\n */\\n function _checkNeedsNewEpoch(\\n uint256 _timestamp\\n )\\n internal\\n {\\n if (\\n _timestamp >= (\\n _getGasMetadata(GasMetadataKey.CURRENT_EPOCH_START_TIMESTAMP)\\n + gasMeterConfig.secondsPerEpoch\\n )\\n ) {\\n _putGasMetadata(\\n GasMetadataKey.CURRENT_EPOCH_START_TIMESTAMP,\\n _timestamp\\n );\\n\\n _putGasMetadata(\\n GasMetadataKey.PREV_EPOCH_SEQUENCER_QUEUE_GAS,\\n _getGasMetadata(\\n GasMetadataKey.CUMULATIVE_SEQUENCER_QUEUE_GAS\\n )\\n );\\n\\n _putGasMetadata(\\n GasMetadataKey.PREV_EPOCH_L1TOL2_QUEUE_GAS,\\n _getGasMetadata(\\n GasMetadataKey.CUMULATIVE_L1TOL2_QUEUE_GAS\\n )\\n );\\n }\\n }\\n\\n /**\\n * Validates the input values of a transaction.\\n * @return _valid Whether or not the transaction data is valid.\\n */\\n function _isValidInput(\\n Lib_OVMCodec.Transaction memory _transaction\\n )\\n view\\n internal\\n returns (\\n bool\\n )\\n {\\n // Prevent reentrancy to run():\\n // This check prevents calling run with the default ovmNumber.\\n // Combined with the first check in run():\\n // if (transactionContext.ovmNUMBER != DEFAULT_UINT256) { return; }\\n // It should be impossible to re-enter since run() returns before any other call frames are created.\\n // Since this value is already being written to storage, we save much gas compared to\\n // using the standard nonReentrant pattern.\\n if (_transaction.blockNumber == DEFAULT_UINT256) {\\n return false;\\n }\\n\\n if (_isValidGasLimit(_transaction.gasLimit, _transaction.l1QueueOrigin) == false) {\\n return false;\\n }\\n\\n return true;\\n }\\n\\n /**\\n * Validates the gas limit for a given transaction.\\n * @param _gasLimit Gas limit provided by the transaction.\\n * param _queueOrigin Queue from which the transaction originated.\\n * @return _valid Whether or not the gas limit is valid.\\n */\\n function _isValidGasLimit(\\n uint256 _gasLimit,\\n Lib_OVMCodec.QueueOrigin // _queueOrigin\\n )\\n view\\n internal\\n returns (\\n bool _valid\\n )\\n {\\n // Always have to be below the maximum gas limit.\\n if (_gasLimit > gasMeterConfig.maxTransactionGasLimit) {\\n return false;\\n }\\n\\n // Always have to be above the minimum gas limit.\\n if (_gasLimit < gasMeterConfig.minTransactionGasLimit) {\\n return false;\\n }\\n\\n // TEMPORARY: Gas metering is disabled for minnet.\\n return true;\\n // GasMetadataKey cumulativeGasKey;\\n // GasMetadataKey prevEpochGasKey;\\n // if (_queueOrigin == Lib_OVMCodec.QueueOrigin.SEQUENCER_QUEUE) {\\n // cumulativeGasKey = GasMetadataKey.CUMULATIVE_SEQUENCER_QUEUE_GAS;\\n // prevEpochGasKey = GasMetadataKey.PREV_EPOCH_SEQUENCER_QUEUE_GAS;\\n // } else {\\n // cumulativeGasKey = GasMetadataKey.CUMULATIVE_L1TOL2_QUEUE_GAS;\\n // prevEpochGasKey = GasMetadataKey.PREV_EPOCH_L1TOL2_QUEUE_GAS;\\n // }\\n\\n // return (\\n // (\\n // _getGasMetadata(cumulativeGasKey)\\n // - _getGasMetadata(prevEpochGasKey)\\n // + _gasLimit\\n // ) < gasMeterConfig.maxGasPerQueuePerEpoch\\n // );\\n }\\n\\n /**\\n * Updates the cumulative gas after a transaction.\\n * @param _gasUsed Gas used by the transaction.\\n * @param _queueOrigin Queue from which the transaction originated.\\n */\\n function _updateCumulativeGas(\\n uint256 _gasUsed,\\n Lib_OVMCodec.QueueOrigin _queueOrigin\\n )\\n internal\\n {\\n GasMetadataKey cumulativeGasKey;\\n if (_queueOrigin == Lib_OVMCodec.QueueOrigin.SEQUENCER_QUEUE) {\\n cumulativeGasKey = GasMetadataKey.CUMULATIVE_SEQUENCER_QUEUE_GAS;\\n } else {\\n cumulativeGasKey = GasMetadataKey.CUMULATIVE_L1TOL2_QUEUE_GAS;\\n }\\n\\n _putGasMetadata(\\n cumulativeGasKey,\\n (\\n _getGasMetadata(cumulativeGasKey)\\n + gasMeterConfig.minTransactionGasLimit\\n + _gasUsed\\n - transactionRecord.ovmGasRefund\\n )\\n );\\n }\\n\\n /**\\n * Retrieves the value of a gas metadata key.\\n * @param _key Gas metadata key to retrieve.\\n * @return _value Value stored at the given key.\\n */\\n function _getGasMetadata(\\n GasMetadataKey _key\\n )\\n internal\\n returns (\\n uint256 _value\\n )\\n {\\n return uint256(_getContractStorage(\\n GAS_METADATA_ADDRESS,\\n bytes32(uint256(_key))\\n ));\\n }\\n\\n /**\\n * Sets the value of a gas metadata key.\\n * @param _key Gas metadata key to set.\\n * @param _value Value to store at the given key.\\n */\\n function _putGasMetadata(\\n GasMetadataKey _key,\\n uint256 _value\\n )\\n internal\\n {\\n _putContractStorage(\\n GAS_METADATA_ADDRESS,\\n bytes32(uint256(_key)),\\n bytes32(uint256(_value))\\n );\\n }\\n\\n\\n /*****************************************\\n * Internal Functions: Execution Context *\\n *****************************************/\\n\\n /**\\n * Swaps over to a new message context.\\n * @param _prevMessageContext Context we're switching from.\\n * @param _nextMessageContext Context we're switching to.\\n */\\n function _switchMessageContext(\\n MessageContext memory _prevMessageContext,\\n MessageContext memory _nextMessageContext\\n )\\n internal\\n {\\n // Avoid unnecessary the SSTORE.\\n if (_prevMessageContext.ovmCALLER != _nextMessageContext.ovmCALLER) {\\n messageContext.ovmCALLER = _nextMessageContext.ovmCALLER;\\n }\\n\\n // Avoid unnecessary the SSTORE.\\n if (_prevMessageContext.ovmADDRESS != _nextMessageContext.ovmADDRESS) {\\n messageContext.ovmADDRESS = _nextMessageContext.ovmADDRESS;\\n }\\n\\n // Avoid unnecessary the SSTORE.\\n if (_prevMessageContext.isStatic != _nextMessageContext.isStatic) {\\n messageContext.isStatic = _nextMessageContext.isStatic;\\n }\\n }\\n\\n /**\\n * Initializes the execution context.\\n * @param _transaction OVM transaction being executed.\\n */\\n function _initContext(\\n Lib_OVMCodec.Transaction memory _transaction\\n )\\n internal\\n {\\n transactionContext.ovmTIMESTAMP = _transaction.timestamp;\\n transactionContext.ovmNUMBER = _transaction.blockNumber;\\n transactionContext.ovmTXGASLIMIT = _transaction.gasLimit;\\n transactionContext.ovmL1QUEUEORIGIN = _transaction.l1QueueOrigin;\\n transactionContext.ovmL1TXORIGIN = _transaction.l1TxOrigin;\\n transactionContext.ovmGASLIMIT = gasMeterConfig.maxGasPerQueuePerEpoch;\\n\\n messageRecord.nuisanceGasLeft = _getNuisanceGasLimit(_transaction.gasLimit);\\n }\\n\\n /**\\n * Resets the transaction and message context.\\n */\\n function _resetContext()\\n internal\\n {\\n transactionContext.ovmL1TXORIGIN = DEFAULT_ADDRESS;\\n transactionContext.ovmTIMESTAMP = DEFAULT_UINT256;\\n transactionContext.ovmNUMBER = DEFAULT_UINT256;\\n transactionContext.ovmGASLIMIT = DEFAULT_UINT256;\\n transactionContext.ovmTXGASLIMIT = DEFAULT_UINT256;\\n transactionContext.ovmL1QUEUEORIGIN = Lib_OVMCodec.QueueOrigin.SEQUENCER_QUEUE;\\n\\n transactionRecord.ovmGasRefund = DEFAULT_UINT256;\\n\\n messageContext.ovmCALLER = DEFAULT_ADDRESS;\\n messageContext.ovmADDRESS = DEFAULT_ADDRESS;\\n messageContext.isStatic = false;\\n\\n messageRecord.nuisanceGasLeft = DEFAULT_UINT256;\\n\\n // Reset the ovmStateManager.\\n ovmStateManager = iOVM_StateManager(address(0));\\n }\\n\\n /*****************************\\n * L2-only Helper Functions *\\n *****************************/\\n\\n /**\\n * Unreachable helper function for simulating eth_calls with an OVM message context.\\n * This function will throw an exception in all cases other than when used as a custom entrypoint in L2 Geth to simulate eth_call.\\n * @param _transaction the message transaction to simulate.\\n * @param _from the OVM account the simulated call should be from.\\n */\\n function simulateMessage(\\n Lib_OVMCodec.Transaction memory _transaction,\\n address _from,\\n iOVM_StateManager _ovmStateManager\\n )\\n external\\n returns (\\n bool,\\n bytes memory\\n )\\n {\\n // Prevent this call from having any effect unless in a custom-set VM frame\\n require(msg.sender == address(0));\\n\\n ovmStateManager = _ovmStateManager;\\n _initContext(_transaction);\\n messageRecord.nuisanceGasLeft = uint(-1);\\n\\n messageContext.ovmADDRESS = _from;\\n\\n bool isCreate = _transaction.entrypoint == address(0);\\n if (isCreate) {\\n (address created, bytes memory revertData) = ovmCREATE(_transaction.data);\\n if (created == address(0)) {\\n return (false, revertData);\\n } else {\\n // The eth_call RPC endpoint for to = undefined will return the deployed bytecode\\n // in the success case, differing from standard create messages.\\n return (true, Lib_EthUtils.getCode(created));\\n }\\n } else {\\n return ovmCALL(\\n _transaction.gasLimit,\\n _transaction.entrypoint,\\n _transaction.data\\n );\\n }\\n }\\n}\\n\",\"keccak256\":\"0x229011db3d21b69e16814325f8e5debbdf6219b3dffb4011a24f2a6540a0d98e\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/predeploys/OVM_DeployerWhitelist.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Interface Imports */\\nimport { iOVM_DeployerWhitelist } from \\\"../../iOVM/predeploys/iOVM_DeployerWhitelist.sol\\\";\\n\\n/**\\n * @title OVM_DeployerWhitelist\\n * @dev The Deployer Whitelist is a temporary predeploy used to provide additional safety during the\\n * initial phases of our mainnet roll out. It is owned by the Optimism team, and defines accounts\\n * which are allowed to deploy contracts on Layer2. The Execution Manager will only allow an\\n * ovmCREATE or ovmCREATE2 operation to proceed if the deployer's address whitelisted.\\n *\\n * Compiler used: optimistic-solc\\n * Runtime target: OVM\\n */\\ncontract OVM_DeployerWhitelist is iOVM_DeployerWhitelist {\\n\\n /**********************\\n * Contract Constants *\\n **********************/\\n\\n bool public initialized;\\n bool public allowArbitraryDeployment;\\n address override public owner;\\n mapping (address => bool) public whitelist;\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n /**\\n * Blocks functions to anyone except the contract owner.\\n */\\n modifier onlyOwner() {\\n require(\\n msg.sender == owner,\\n \\\"Function can only be called by the owner of this contract.\\\"\\n );\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Initializes the whitelist.\\n * @param _owner Address of the owner for this contract.\\n * @param _allowArbitraryDeployment Whether or not to allow arbitrary contract deployment.\\n */\\n function initialize(\\n address _owner,\\n bool _allowArbitraryDeployment\\n )\\n override\\n public\\n {\\n if (initialized == true) {\\n return;\\n }\\n\\n initialized = true;\\n allowArbitraryDeployment = _allowArbitraryDeployment;\\n owner = _owner;\\n }\\n\\n /**\\n * Adds or removes an address from the deployment whitelist.\\n * @param _deployer Address to update permissions for.\\n * @param _isWhitelisted Whether or not the address is whitelisted.\\n */\\n function setWhitelistedDeployer(\\n address _deployer,\\n bool _isWhitelisted\\n )\\n override\\n public\\n onlyOwner\\n {\\n whitelist[_deployer] = _isWhitelisted;\\n }\\n\\n /**\\n * Updates the owner of this contract.\\n * @param _owner Address of the new owner.\\n */\\n function setOwner(\\n address _owner\\n )\\n override\\n public\\n onlyOwner\\n {\\n owner = _owner;\\n }\\n\\n /**\\n * Updates the arbitrary deployment flag.\\n * @param _allowArbitraryDeployment Whether or not to allow arbitrary contract deployment.\\n */\\n function setAllowArbitraryDeployment(\\n bool _allowArbitraryDeployment\\n )\\n override\\n public\\n onlyOwner\\n {\\n allowArbitraryDeployment = _allowArbitraryDeployment;\\n }\\n\\n /**\\n * Permanently enables arbitrary contract deployment and deletes the owner.\\n */\\n function enableArbitraryContractDeployment()\\n override\\n public\\n onlyOwner\\n {\\n setAllowArbitraryDeployment(true);\\n setOwner(address(0));\\n }\\n\\n /**\\n * Checks whether an address is allowed to deploy contracts.\\n * @param _deployer Address to check.\\n * @return _allowed Whether or not the address can deploy contracts.\\n */\\n function isDeployerAllowed(\\n address _deployer\\n )\\n override\\n public\\n returns (\\n bool\\n )\\n {\\n return (\\n initialized == false\\n || allowArbitraryDeployment == true\\n || whitelist[_deployer]\\n );\\n }\\n}\\n\",\"keccak256\":\"0x371e3d3ca1dd4177738b55eead9ad6f8278280e568694df6b42ee01f5558ccb2\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/execution/iOVM_ExecutionManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\ninterface iOVM_ExecutionManager {\\n /**********\\n * Enums *\\n *********/\\n\\n enum RevertFlag {\\n OUT_OF_GAS,\\n INTENTIONAL_REVERT,\\n EXCEEDS_NUISANCE_GAS,\\n INVALID_STATE_ACCESS,\\n UNSAFE_BYTECODE,\\n CREATE_COLLISION,\\n STATIC_VIOLATION,\\n CREATOR_NOT_ALLOWED\\n }\\n\\n enum GasMetadataKey {\\n CURRENT_EPOCH_START_TIMESTAMP,\\n CUMULATIVE_SEQUENCER_QUEUE_GAS,\\n CUMULATIVE_L1TOL2_QUEUE_GAS,\\n PREV_EPOCH_SEQUENCER_QUEUE_GAS,\\n PREV_EPOCH_L1TOL2_QUEUE_GAS\\n }\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct GasMeterConfig {\\n uint256 minTransactionGasLimit;\\n uint256 maxTransactionGasLimit;\\n uint256 maxGasPerQueuePerEpoch;\\n uint256 secondsPerEpoch;\\n }\\n\\n struct GlobalContext {\\n uint256 ovmCHAINID;\\n }\\n\\n struct TransactionContext {\\n Lib_OVMCodec.QueueOrigin ovmL1QUEUEORIGIN;\\n uint256 ovmTIMESTAMP;\\n uint256 ovmNUMBER;\\n uint256 ovmGASLIMIT;\\n uint256 ovmTXGASLIMIT;\\n address ovmL1TXORIGIN;\\n }\\n\\n struct TransactionRecord {\\n uint256 ovmGasRefund;\\n }\\n\\n struct MessageContext {\\n address ovmCALLER;\\n address ovmADDRESS;\\n bool isStatic;\\n }\\n\\n struct MessageRecord {\\n uint256 nuisanceGasLeft;\\n }\\n\\n\\n /************************************\\n * Transaction Execution Entrypoint *\\n ************************************/\\n\\n function run(\\n Lib_OVMCodec.Transaction calldata _transaction,\\n address _txStateManager\\n ) external returns (bytes memory);\\n\\n\\n /*******************\\n * Context Opcodes *\\n *******************/\\n\\n function ovmCALLER() external view returns (address _caller);\\n function ovmADDRESS() external view returns (address _address);\\n function ovmTIMESTAMP() external view returns (uint256 _timestamp);\\n function ovmNUMBER() external view returns (uint256 _number);\\n function ovmGASLIMIT() external view returns (uint256 _gasLimit);\\n function ovmCHAINID() external view returns (uint256 _chainId);\\n\\n\\n /**********************\\n * L2 Context Opcodes *\\n **********************/\\n\\n function ovmL1QUEUEORIGIN() external view returns (Lib_OVMCodec.QueueOrigin _queueOrigin);\\n function ovmL1TXORIGIN() external view returns (address _l1TxOrigin);\\n\\n\\n /*******************\\n * Halting Opcodes *\\n *******************/\\n\\n function ovmREVERT(bytes memory _data) external;\\n\\n\\n /*****************************\\n * Contract Creation Opcodes *\\n *****************************/\\n\\n function ovmCREATE(bytes memory _bytecode) external returns (address _contract, bytes memory _revertdata);\\n function ovmCREATE2(bytes memory _bytecode, bytes32 _salt) external returns (address _contract, bytes memory _revertdata);\\n\\n\\n /*******************************\\n * Account Abstraction Opcodes *\\n ******************************/\\n\\n function ovmGETNONCE() external returns (uint256 _nonce);\\n function ovmINCREMENTNONCE() external;\\n function ovmCREATEEOA(bytes32 _messageHash, uint8 _v, bytes32 _r, bytes32 _s) external;\\n\\n\\n /****************************\\n * Contract Calling Opcodes *\\n ****************************/\\n\\n function ovmCALL(uint256 _gasLimit, address _address, bytes memory _calldata) external returns (bool _success, bytes memory _returndata);\\n function ovmSTATICCALL(uint256 _gasLimit, address _address, bytes memory _calldata) external returns (bool _success, bytes memory _returndata);\\n function ovmDELEGATECALL(uint256 _gasLimit, address _address, bytes memory _calldata) external returns (bool _success, bytes memory _returndata);\\n\\n\\n /****************************\\n * Contract Storage Opcodes *\\n ****************************/\\n\\n function ovmSLOAD(bytes32 _key) external returns (bytes32 _value);\\n function ovmSSTORE(bytes32 _key, bytes32 _value) external;\\n\\n\\n /*************************\\n * Contract Code Opcodes *\\n *************************/\\n\\n function ovmEXTCODECOPY(address _contract, uint256 _offset, uint256 _length) external returns (bytes memory _code);\\n function ovmEXTCODESIZE(address _contract) external returns (uint256 _size);\\n function ovmEXTCODEHASH(address _contract) external returns (bytes32 _hash);\\n\\n\\n /***************************************\\n * Public Functions: Execution Context *\\n ***************************************/\\n\\n function getMaxTransactionGasLimit() external view returns (uint _maxTransactionGasLimit);\\n}\\n\",\"keccak256\":\"0xf023d5d6fc6a03bd52f7a57af6e21076de77e8925d065bb79db062e73e43b684\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/execution/iOVM_SafetyChecker.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title iOVM_SafetyChecker\\n */\\ninterface iOVM_SafetyChecker {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function isBytecodeSafe(bytes calldata _bytecode) external pure returns (bool);\\n}\\n\",\"keccak256\":\"0xde6639676d4ec4f77297652d5ede2429bc93e74e11fefd9e9de4bc92dd784878\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/execution/iOVM_StateManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title iOVM_StateManager\\n */\\ninterface iOVM_StateManager {\\n\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n enum ItemState {\\n ITEM_UNTOUCHED,\\n ITEM_LOADED,\\n ITEM_CHANGED,\\n ITEM_COMMITTED\\n }\\n\\n /***************************\\n * Public Functions: Misc *\\n ***************************/\\n\\n function isAuthenticated(address _address) external view returns (bool);\\n\\n /***************************\\n * Public Functions: Setup *\\n ***************************/\\n\\n function owner() external view returns (address _owner);\\n function ovmExecutionManager() external view returns (address _ovmExecutionManager);\\n function setExecutionManager(address _ovmExecutionManager) external;\\n\\n\\n /************************************\\n * Public Functions: Account Access *\\n ************************************/\\n\\n function putAccount(address _address, Lib_OVMCodec.Account memory _account) external;\\n function putEmptyAccount(address _address) external;\\n function getAccount(address _address) external view returns (Lib_OVMCodec.Account memory _account);\\n function hasAccount(address _address) external view returns (bool _exists);\\n function hasEmptyAccount(address _address) external view returns (bool _exists);\\n function setAccountNonce(address _address, uint256 _nonce) external;\\n function getAccountNonce(address _address) external view returns (uint256 _nonce);\\n function getAccountEthAddress(address _address) external view returns (address _ethAddress);\\n function getAccountStorageRoot(address _address) external view returns (bytes32 _storageRoot);\\n function initPendingAccount(address _address) external;\\n function commitPendingAccount(address _address, address _ethAddress, bytes32 _codeHash) external;\\n function testAndSetAccountLoaded(address _address) external returns (bool _wasAccountAlreadyLoaded);\\n function testAndSetAccountChanged(address _address) external returns (bool _wasAccountAlreadyChanged);\\n function commitAccount(address _address) external returns (bool _wasAccountCommitted);\\n function incrementTotalUncommittedAccounts() external;\\n function getTotalUncommittedAccounts() external view returns (uint256 _total);\\n function wasAccountChanged(address _address) external view returns (bool);\\n function wasAccountCommitted(address _address) external view returns (bool);\\n\\n\\n /************************************\\n * Public Functions: Storage Access *\\n ************************************/\\n\\n function putContractStorage(address _contract, bytes32 _key, bytes32 _value) external;\\n function getContractStorage(address _contract, bytes32 _key) external view returns (bytes32 _value);\\n function hasContractStorage(address _contract, bytes32 _key) external view returns (bool _exists);\\n function testAndSetContractStorageLoaded(address _contract, bytes32 _key) external returns (bool _wasContractStorageAlreadyLoaded);\\n function testAndSetContractStorageChanged(address _contract, bytes32 _key) external returns (bool _wasContractStorageAlreadyChanged);\\n function commitContractStorage(address _contract, bytes32 _key) external returns (bool _wasContractStorageCommitted);\\n function incrementTotalUncommittedContractStorage() external;\\n function getTotalUncommittedContractStorage() external view returns (uint256 _total);\\n function wasContractStorageChanged(address _contract, bytes32 _key) external view returns (bool);\\n function wasContractStorageCommitted(address _contract, bytes32 _key) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x7a11dbd1f61593ba34debe07e39eef59967307f7f372ba9855bee0953585d08d\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/predeploys/iOVM_DeployerWhitelist.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title iOVM_DeployerWhitelist\\n */\\ninterface iOVM_DeployerWhitelist {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function initialize(address _owner, bool _allowArbitraryDeployment) external;\\n function owner() external returns (address _owner);\\n function setWhitelistedDeployer(address _deployer, bool _isWhitelisted) external;\\n function setOwner(address _newOwner) external;\\n function setAllowArbitraryDeployment(bool _allowArbitraryDeployment) external;\\n function enableArbitraryContractDeployment() external;\\n function isDeployerAllowed(address _deployer) external returns (bool _allowed);\\n}\\n\",\"keccak256\":\"0xdf1f27faf0d26d416bf6d408d146a16de32b4e1772a292c65d39eb7ec2b53ceb\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/codec/Lib_OVMCodec.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../utils/Lib_Bytes32Utils.sol\\\";\\n\\n/**\\n * @title Lib_OVMCodec\\n */\\nlibrary Lib_OVMCodec {\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum QueueOrigin {\\n SEQUENCER_QUEUE,\\n L1TOL2_QUEUE\\n }\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Account {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n address ethAddress;\\n bool isFresh;\\n }\\n\\n struct EVMAccount {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n }\\n\\n struct ChainBatchHeader {\\n uint256 batchIndex;\\n bytes32 batchRoot;\\n uint256 batchSize;\\n uint256 prevTotalElements;\\n bytes extraData;\\n }\\n\\n struct ChainInclusionProof {\\n uint256 index;\\n bytes32[] siblings;\\n }\\n\\n struct Transaction {\\n uint256 timestamp;\\n uint256 blockNumber;\\n QueueOrigin l1QueueOrigin;\\n address l1TxOrigin;\\n address entrypoint;\\n uint256 gasLimit;\\n bytes data;\\n }\\n\\n struct TransactionChainElement {\\n bool isSequenced;\\n uint256 queueIndex; // QUEUED TX ONLY\\n uint256 timestamp; // SEQUENCER TX ONLY\\n uint256 blockNumber; // SEQUENCER TX ONLY\\n bytes txData; // SEQUENCER TX ONLY\\n }\\n\\n struct QueueElement {\\n bytes32 transactionHash;\\n uint40 timestamp;\\n uint40 blockNumber;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Encodes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Encoded transaction bytes.\\n */\\n function encodeTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return abi.encodePacked(\\n _transaction.timestamp,\\n _transaction.blockNumber,\\n _transaction.l1QueueOrigin,\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n );\\n }\\n\\n /**\\n * Hashes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Hashed transaction\\n */\\n function hashTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(encodeTransaction(_transaction));\\n }\\n\\n /**\\n * Converts an OVM account to an EVM account.\\n * @param _in OVM account to convert.\\n * @return Converted EVM account.\\n */\\n function toEVMAccount(\\n Account memory _in\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n return EVMAccount({\\n nonce: _in.nonce,\\n balance: _in.balance,\\n storageRoot: _in.storageRoot,\\n codeHash: _in.codeHash\\n });\\n }\\n\\n /**\\n * @notice RLP-encodes an account state struct.\\n * @param _account Account state struct.\\n * @return RLP-encoded account state.\\n */\\n function encodeEVMAccount(\\n EVMAccount memory _account\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes[] memory raw = new bytes[](4);\\n\\n // Unfortunately we can't create this array outright because\\n // Lib_RLPWriter.writeList will reject fixed-size arrays. Assigning\\n // index-by-index circumvents this issue.\\n raw[0] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.nonce)\\n )\\n );\\n raw[1] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.balance)\\n )\\n );\\n raw[2] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.storageRoot));\\n raw[3] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.codeHash));\\n\\n return Lib_RLPWriter.writeList(raw);\\n }\\n\\n /**\\n * @notice Decodes an RLP-encoded account state into a useful struct.\\n * @param _encoded RLP-encoded account state.\\n * @return Account state struct.\\n */\\n function decodeEVMAccount(\\n bytes memory _encoded\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\\n\\n return EVMAccount({\\n nonce: Lib_RLPReader.readUint256(accountState[0]),\\n balance: Lib_RLPReader.readUint256(accountState[1]),\\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\\n });\\n }\\n\\n /**\\n * Calculates a hash for a given batch header.\\n * @param _batchHeader Header to hash.\\n * @return Hash of the header.\\n */\\n function hashBatchHeader(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(\\n abi.encode(\\n _batchHeader.batchRoot,\\n _batchHeader.batchSize,\\n _batchHeader.prevTotalElements,\\n _batchHeader.extraData\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0xd85ba2066057a2677926f484b938c7c2ef33ff3853f3b71cda252f4a54f30e05\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n public\\n onlyOwner\\n {\\n addresses[_getNameHash(_name)] = _address;\\n\\n emit AddressSet(\\n _name,\\n _address\\n );\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0x2ce671a0e004df88b136bea5a3c59d0732cea8887c8496da1d509e0200b03d7d\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(\\n address _libAddressManager\\n ) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x65981feeabff6a81783ea97d44baf988a18a86c8cb374c46fdb71819cbacc7c0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPReader.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_RLPReader\\n * @dev Adapted from \\\"RLPReader\\\" by Hamdi Allam (hamdi.allam97@gmail.com).\\n */\\nlibrary Lib_RLPReader {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 constant internal MAX_LIST_LENGTH = 32;\\n\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum RLPItemType {\\n DATA_ITEM,\\n LIST_ITEM\\n }\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct RLPItem {\\n uint256 length;\\n uint256 ptr;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts bytes to a reference to memory position and length.\\n * @param _in Input bytes to convert.\\n * @return Output memory reference.\\n */\\n function toRLPItem(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem memory\\n )\\n {\\n uint256 ptr;\\n assembly {\\n ptr := add(_in, 32)\\n }\\n\\n return RLPItem({\\n length: _in.length,\\n ptr: ptr\\n });\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n (\\n uint256 listOffset,\\n ,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.LIST_ITEM,\\n \\\"Invalid RLP list value.\\\"\\n );\\n\\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\\n // writing to the length. Since we can't know the number of RLP items without looping over\\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\\n // simply set a reasonable maximum list length and decrease the size before we finish.\\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\\n\\n uint256 itemCount = 0;\\n uint256 offset = listOffset;\\n while (offset < _in.length) {\\n require(\\n itemCount < MAX_LIST_LENGTH,\\n \\\"Provided RLP list exceeds max list length.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n ) = _decodeLength(RLPItem({\\n length: _in.length - offset,\\n ptr: _in.ptr + offset\\n }));\\n\\n out[itemCount] = RLPItem({\\n length: itemLength + itemOffset,\\n ptr: _in.ptr + offset\\n });\\n\\n itemCount += 1;\\n offset += itemOffset + itemLength;\\n }\\n\\n // Decrease the array size to match the actual item count.\\n assembly {\\n mstore(out, itemCount)\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n return readList(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes value.\\\"\\n );\\n\\n return _copy(_in.ptr, itemOffset, itemLength);\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return readBytes(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return string(readBytes(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return readString(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n require(\\n _in.length <= 33,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr + itemOffset;\\n bytes32 out;\\n assembly {\\n out := mload(ptr)\\n\\n // Shift the bytes over to match the item size.\\n if lt(itemLength, 32) {\\n out := div(out, exp(256, sub(32, itemLength)))\\n }\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return readBytes32(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return uint256(readBytes32(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return readUint256(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n require(\\n _in.length == 1,\\n \\\"Invalid RLP boolean value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 out;\\n assembly {\\n out := byte(0, mload(ptr))\\n }\\n\\n require(\\n out == 0 || out == 1,\\n \\\"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\\\"\\n );\\n\\n return out != 0;\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return readBool(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n if (_in.length == 1) {\\n return address(0);\\n }\\n\\n require(\\n _in.length == 21,\\n \\\"Invalid RLP address value.\\\"\\n );\\n\\n return address(readUint256(_in));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return readAddress(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads the raw bytes of an RLP item.\\n * @param _in RLP item to read.\\n * @return Raw RLP bytes.\\n */\\n function readRawBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in);\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Decodes the length of an RLP item.\\n * @param _in RLP item to decode.\\n * @return Offset of the encoded data.\\n * @return Length of the encoded data.\\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\\n */\\n function _decodeLength(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n uint256,\\n uint256,\\n RLPItemType\\n )\\n {\\n require(\\n _in.length > 0,\\n \\\"RLP item cannot be null.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 prefix;\\n assembly {\\n prefix := byte(0, mload(ptr))\\n }\\n\\n if (prefix <= 0x7f) {\\n // Single byte.\\n\\n return (0, 1, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xb7) {\\n // Short string.\\n\\n uint256 strLen = prefix - 0x80;\\n\\n require(\\n _in.length > strLen,\\n \\\"Invalid RLP short string.\\\"\\n );\\n\\n return (1, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xbf) {\\n // Long string.\\n uint256 lenOfStrLen = prefix - 0xb7;\\n\\n require(\\n _in.length > lenOfStrLen,\\n \\\"Invalid RLP long string length.\\\"\\n );\\n\\n uint256 strLen;\\n assembly {\\n // Pick out the string length.\\n strLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfStrLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfStrLen + strLen,\\n \\\"Invalid RLP long string.\\\"\\n );\\n\\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xf7) {\\n // Short list.\\n uint256 listLen = prefix - 0xc0;\\n\\n require(\\n _in.length > listLen,\\n \\\"Invalid RLP short list.\\\"\\n );\\n\\n return (1, listLen, RLPItemType.LIST_ITEM);\\n } else {\\n // Long list.\\n uint256 lenOfListLen = prefix - 0xf7;\\n\\n require(\\n _in.length > lenOfListLen,\\n \\\"Invalid RLP long list length.\\\"\\n );\\n\\n uint256 listLen;\\n assembly {\\n // Pick out the list length.\\n listLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfListLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfListLen + listLen,\\n \\\"Invalid RLP long list.\\\"\\n );\\n\\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\\n }\\n }\\n\\n /**\\n * Copies the bytes from a memory location.\\n * @param _src Pointer to the location to read from.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Copied bytes.\\n */\\n function _copy(\\n uint256 _src,\\n uint256 _offset,\\n uint256 _length\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out = new bytes(_length);\\n if (out.length == 0) {\\n return out;\\n }\\n\\n uint256 src = _src + _offset;\\n uint256 dest;\\n assembly {\\n dest := add(out, 32)\\n }\\n\\n // Copy over as many complete words as we can.\\n for (uint256 i = 0; i < _length / 32; i++) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n\\n src += 32;\\n dest += 32;\\n }\\n\\n // Pick out the remaining bytes.\\n uint256 mask = 256 ** (32 - (_length % 32)) - 1;\\n assembly {\\n mstore(\\n dest,\\n or(\\n and(mload(src), not(mask)),\\n and(mload(dest), mask)\\n )\\n )\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Copies an RLP item into bytes.\\n * @param _in RLP item to copy.\\n * @return Copied bytes.\\n */\\n function _copy(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in.ptr, 0, _in.length);\\n }\\n}\\n\",\"keccak256\":\"0x829174c61216dce35fdb888383b6022e0365eb7fbdc71ad79d98b108091969fe\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPWriter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/**\\n * @title Lib_RLPWriter\\n * @author Bakaoh (with modifications)\\n */\\nlibrary Lib_RLPWriter {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * RLP encodes a byte string.\\n * @param _in The byte string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded;\\n\\n if (_in.length == 1 && uint8(_in[0]) < 128) {\\n encoded = _in;\\n } else {\\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * RLP encodes a list of RLP encoded byte byte strings.\\n * @param _in The list of RLP encoded byte strings.\\n * @return The RLP encoded list of items in bytes.\\n */\\n function writeList(\\n bytes[] memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory list = _flatten(_in);\\n return abi.encodePacked(_writeLength(list.length, 192), list);\\n }\\n\\n /**\\n * RLP encodes a string.\\n * @param _in The string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeString(\\n string memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(bytes(_in));\\n }\\n\\n /**\\n * RLP encodes an address.\\n * @param _in The address to encode.\\n * @return The RLP encoded address in bytes.\\n */\\n function writeAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a bytes32 value.\\n * @param _in The bytes32 to encode.\\n * @return _out The RLP encoded bytes32 in bytes.\\n */\\n function writeBytes32(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a uint.\\n * @param _in The uint256 to encode.\\n * @return The RLP encoded uint256 in bytes.\\n */\\n function writeUint(\\n uint256 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(_toBinary(_in));\\n }\\n\\n /**\\n * RLP encodes a bool.\\n * @param _in The bool to encode.\\n * @return The RLP encoded bool in bytes.\\n */\\n function writeBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded = new bytes(1);\\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\\n return encoded;\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\\n * @param _len The length of the string or the payload.\\n * @param _offset 128 if item is string, 192 if item is list.\\n * @return RLP encoded bytes.\\n */\\n function _writeLength(\\n uint256 _len,\\n uint256 _offset\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded;\\n\\n if (_len < 56) {\\n encoded = new bytes(1);\\n encoded[0] = byte(uint8(_len) + uint8(_offset));\\n } else {\\n uint256 lenLen;\\n uint256 i = 1;\\n while (_len / i != 0) {\\n lenLen++;\\n i *= 256;\\n }\\n\\n encoded = new bytes(lenLen + 1);\\n encoded[0] = byte(uint8(lenLen) + uint8(_offset) + 55);\\n for(i = 1; i <= lenLen; i++) {\\n encoded[i] = byte(uint8((_len / (256**(lenLen-i))) % 256));\\n }\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * Encode integer in big endian binary form with no leading zeroes.\\n * @notice TODO: This should be optimized with assembly to save gas costs.\\n * @param _x The integer to encode.\\n * @return RLP encoded bytes.\\n */\\n function _toBinary(\\n uint256 _x\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory b = abi.encodePacked(_x);\\n\\n uint256 i = 0;\\n for (; i < 32; i++) {\\n if (b[i] != 0) {\\n break;\\n }\\n }\\n\\n bytes memory res = new bytes(32 - i);\\n for (uint256 j = 0; j < res.length; j++) {\\n res[j] = b[i++];\\n }\\n\\n return res;\\n }\\n\\n /**\\n * Copies a piece of memory to another location.\\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\\n * @param _dest Destination location.\\n * @param _src Source location.\\n * @param _len Length of memory to copy.\\n */\\n function _memcpy(\\n uint256 _dest,\\n uint256 _src,\\n uint256 _len\\n )\\n private\\n pure\\n {\\n uint256 dest = _dest;\\n uint256 src = _src;\\n uint256 len = _len;\\n\\n for(; len >= 32; len -= 32) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n dest += 32;\\n src += 32;\\n }\\n\\n uint256 mask = 256 ** (32 - len) - 1;\\n assembly {\\n let srcpart := and(mload(src), not(mask))\\n let destpart := and(mload(dest), mask)\\n mstore(dest, or(destpart, srcpart))\\n }\\n }\\n\\n /**\\n * Flattens a list of byte strings into one byte string.\\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\\n * @param _list List of byte strings to flatten.\\n * @return The flattened byte string.\\n */\\n function _flatten(\\n bytes[] memory _list\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n if (_list.length == 0) {\\n return new bytes(0);\\n }\\n\\n uint256 len;\\n uint256 i = 0;\\n for (; i < _list.length; i++) {\\n len += _list[i].length;\\n }\\n\\n bytes memory flattened = new bytes(len);\\n uint256 flattenedPtr;\\n assembly { flattenedPtr := add(flattened, 0x20) }\\n\\n for(i = 0; i < _list.length; i++) {\\n bytes memory item = _list[i];\\n\\n uint256 listPtr;\\n assembly { listPtr := add(item, 0x20)}\\n\\n _memcpy(flattenedPtr, listPtr, item.length);\\n flattenedPtr += _list[i].length;\\n }\\n\\n return flattened;\\n }\\n}\\n\",\"keccak256\":\"0xb60ee4b03ad372c3deff21d454ab714dd0c18ee3e6f9d45532e209fc59d5a54d\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_Bytes32Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_Byte32Utils\\n */\\nlibrary Lib_Bytes32Utils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \\\"true.\\\"\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as a boolean.\\n */\\n function toBool(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return _in != 0;\\n }\\n\\n /**\\n * Converts a boolean to a bytes32 value.\\n * @param _in Input boolean value.\\n * @return Boolean as a bytes32.\\n */\\n function fromBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in ? 1 : 0));\\n }\\n\\n /**\\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as an address.\\n */\\n function toAddress(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return address(uint160(uint256(_in)));\\n }\\n\\n /**\\n * Converts an address to a bytes32.\\n * @param _in Input address value.\\n * @return Address as a bytes32.\\n */\\n function fromAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in));\\n }\\n\\n /**\\n * Removes the leading zeros from a bytes32 value and returns a new (smaller) bytes value.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 without any leading zeros.\\n */\\n function removeLeadingZeros(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out;\\n\\n assembly {\\n // Figure out how many leading zero bytes to remove.\\n let shift := 0\\n for { let i := 0 } and(lt(i, 32), eq(byte(i, _in), 0)) { i := add(i, 1) } {\\n shift := add(shift, 1)\\n }\\n\\n // Reserve some space for our output and fix the free memory pointer.\\n out := mload(0x40)\\n mstore(0x40, add(out, 0x40))\\n\\n // Shift the value and store it into the output bytes.\\n mstore(add(out, 0x20), shl(mul(shift, 8), _in))\\n\\n // Store the new size (with leading zero bytes removed) in the output byte size.\\n mstore(out, sub(32, shift))\\n }\\n\\n return out;\\n }\\n}\\n\",\"keccak256\":\"0xfa2def593e3fc56a31852c3744aefdaa93cec74e721bfcfeb1e5d166c7c60b64\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_BytesUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_BytesUtils\\n */\\nlibrary Lib_BytesUtils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_start + _length >= _start, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n if (_bytes.length - _start == 0) {\\n return bytes('');\\n }\\n\\n return slice(_bytes, _start, _bytes.length - _start);\\n }\\n\\n function toBytes32PadLeft(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n bytes32 ret;\\n uint256 len = _bytes.length <= 32 ? _bytes.length : 32;\\n assembly {\\n ret := shr(mul(sub(32, len), 8), mload(add(_bytes, 32)))\\n }\\n return ret;\\n }\\n\\n function toBytes32(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n if (_bytes.length < 32) {\\n bytes32 ret;\\n assembly {\\n ret := mload(add(_bytes, 32))\\n }\\n return ret;\\n }\\n\\n return abi.decode(_bytes,(bytes32)); // will truncate if input length > 32 bytes\\n }\\n\\n function toUint256(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return uint256(toBytes32(_bytes));\\n }\\n\\n function toUint24(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n uint24\\n )\\n {\\n require(_start + 3 >= _start, \\\"toUint24_overflow\\\");\\n require(_bytes.length >= _start + 3 , \\\"toUint24_outOfBounds\\\");\\n uint24 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x3), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toUint8(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n uint8\\n )\\n {\\n require(_start + 1 >= _start, \\\"toUint8_overflow\\\");\\n require(_bytes.length >= _start + 1 , \\\"toUint8_outOfBounds\\\");\\n uint8 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x1), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toAddress(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n require(_start + 20 >= _start, \\\"toAddress_overflow\\\");\\n require(_bytes.length >= _start + 20, \\\"toAddress_outOfBounds\\\");\\n address tempAddress;\\n\\n assembly {\\n tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000)\\n }\\n\\n return tempAddress;\\n }\\n\\n function toNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory nibbles = new bytes(_bytes.length * 2);\\n\\n for (uint256 i = 0; i < _bytes.length; i++) {\\n nibbles[i * 2] = _bytes[i] >> 4;\\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\\n }\\n\\n return nibbles;\\n }\\n\\n function fromNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory ret = new bytes(_bytes.length / 2);\\n\\n for (uint256 i = 0; i < ret.length; i++) {\\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\\n }\\n\\n return ret;\\n }\\n\\n function equal(\\n bytes memory _bytes,\\n bytes memory _other\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return keccak256(_bytes) == keccak256(_other);\\n }\\n}\\n\",\"keccak256\":\"0xa5195afe32fb2cf104d156e8f4bd39df1ec79bf6ba232097b9e8e0ee14fbc298\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_ErrorUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/**\\n * @title Lib_ErrorUtils\\n */\\nlibrary Lib_ErrorUtils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Encodes an error string into raw solidity-style revert data.\\n * (i.e. ascii bytes, prefixed with bytes4(keccak(\\\"Error(string))\\\"))\\n * Ref: https://docs.soliditylang.org/en/v0.8.2/control-structures.html?highlight=Error(string)#panic-via-assert-and-error-via-require\\n * @param _reason Reason for the reversion.\\n * @return Standard solidity revert data for the given reason.\\n */\\n function encodeRevertString(\\n string memory _reason\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return abi.encodeWithSignature(\\n \\\"Error(string)\\\",\\n _reason\\n );\\n }\\n}\\n\",\"keccak256\":\"0xfc64ec4a81fb50865b502a0004ed154e8598e1a313db77303fc95e41f536e6b7\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_EthUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// @unsupported: ovm\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"./Lib_Bytes32Utils.sol\\\";\\n\\n/**\\n * @title Lib_EthUtils\\n */\\nlibrary Lib_EthUtils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Gets the code for a given address.\\n * @param _address Address to get code for.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Code read from the contract.\\n */\\n function getCode(\\n address _address,\\n uint256 _offset,\\n uint256 _length\\n )\\n internal\\n view\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory code;\\n assembly {\\n code := mload(0x40)\\n mstore(0x40, add(code, add(_length, 0x20)))\\n mstore(code, _length)\\n extcodecopy(_address, add(code, 0x20), _offset, _length)\\n }\\n\\n return code;\\n }\\n\\n /**\\n * Gets the full code for a given address.\\n * @param _address Address to get code for.\\n * @return Full code of the contract.\\n */\\n function getCode(\\n address _address\\n )\\n internal\\n view\\n returns (\\n bytes memory\\n )\\n {\\n return getCode(\\n _address,\\n 0,\\n getCodeSize(_address)\\n );\\n }\\n\\n /**\\n * Gets the size of a contract's code in bytes.\\n * @param _address Address to get code size for.\\n * @return Size of the contract's code in bytes.\\n */\\n function getCodeSize(\\n address _address\\n )\\n internal\\n view\\n returns (\\n uint256\\n )\\n {\\n uint256 codeSize;\\n assembly {\\n codeSize := extcodesize(_address)\\n }\\n\\n return codeSize;\\n }\\n\\n /**\\n * Gets the hash of a contract's code.\\n * @param _address Address to get a code hash for.\\n * @return Hash of the contract's code.\\n */\\n function getCodeHash(\\n address _address\\n )\\n internal\\n view\\n returns (\\n bytes32\\n )\\n {\\n bytes32 codeHash;\\n assembly {\\n codeHash := extcodehash(_address)\\n }\\n\\n return codeHash;\\n }\\n\\n /**\\n * Creates a contract with some given initialization code.\\n * @param _code Contract initialization code.\\n * @return Address of the created contract.\\n */\\n function createContract(\\n bytes memory _code\\n )\\n internal\\n returns (\\n address\\n )\\n {\\n address created;\\n assembly {\\n created := create(\\n 0,\\n add(_code, 0x20),\\n mload(_code)\\n )\\n }\\n\\n return created;\\n }\\n\\n /**\\n * Computes the address that would be generated by CREATE.\\n * @param _creator Address creating the contract.\\n * @param _nonce Creator's nonce.\\n * @return Address to be generated by CREATE.\\n */\\n function getAddressForCREATE(\\n address _creator,\\n uint256 _nonce\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n bytes[] memory encoded = new bytes[](2);\\n encoded[0] = Lib_RLPWriter.writeAddress(_creator);\\n encoded[1] = Lib_RLPWriter.writeUint(_nonce);\\n\\n bytes memory encodedList = Lib_RLPWriter.writeList(encoded);\\n return Lib_Bytes32Utils.toAddress(keccak256(encodedList));\\n }\\n\\n /**\\n * Computes the address that would be generated by CREATE2.\\n * @param _creator Address creating the contract.\\n * @param _bytecode Bytecode of the contract to be created.\\n * @param _salt 32 byte salt value mixed into the hash.\\n * @return Address to be generated by CREATE2.\\n */\\n function getAddressForCREATE2(\\n address _creator,\\n bytes memory _bytecode,\\n bytes32 _salt\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n bytes32 hashedData = keccak256(abi.encodePacked(\\n byte(0xff),\\n _creator,\\n _salt,\\n keccak256(_bytecode)\\n ));\\n\\n return Lib_Bytes32Utils.toAddress(hashedData);\\n }\\n}\\n\",\"keccak256\":\"0xf29a67d78e61cb472d524b779b32cfcb39a587f4096500d5419e6425ed367d49\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x60806040523480156200001157600080fd5b506040516200313838038062003138833981016040819052620000349162000292565b600080546001600160a01b0319166001600160a01b03851617905560408051808201909152601181527027ab26afa9b0b332ba3ca1b432b1b5b2b960791b60208201526200008290620000d7565b600180546001600160a01b0319166001600160a01b039290921691909117905581516003556020820151600455604082015160055560608201516006558051600755620000ce620001b9565b50505062000337565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b83811015620001395781810151838201526020016200011f565b50505050905090810190601f168015620001675780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b1580156200018557600080fd5b505afa1580156200019a573d6000803e3d6000fd5b505050506040513d6020811015620001b157600080fd5b505192915050565b600d80546001600160a01b031990811673defa017defa017defa017defa017defa017defa09081179092557fdefa017defa017defa017defa017defa017defa017defa017defa017defa017d6009819055600a819055600b819055600c8190556008805460ff191690556010819055600e8054831684179055600f8054831690931760ff60a01b1916909255601191909155600280549091169055565b60006020828403121562000268578081fd5b604051602081016001600160401b03811182821017156200028557fe5b6040529151825250919050565b600080600083850360c0811215620002a8578384fd5b84516001600160a01b0381168114620002bf578485fd5b93506080601f1982011215620002d3578283fd5b50604051608081016001600160401b0381118282101715620002f157fe5b806040525060208501518152604085015160208201526060850151604082015260808501516060820152809250506200032e8560a0860162000256565b90509250925092565b612df180620003476000396000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c80637cebbe94116100f957806399ccd98b11610097578063bdbf8c3611610071578063bdbf8c361461037e578063c1fb2ea214610386578063fcb6829b1461038e578063ffe73914146103a1576101c4565b806399ccd98b146103505780639be3ad67146103635780639dc9dc9314610376576101c4565b806385979f76116100d357806385979f761461031a5780638bb42e151461032d5780639058025614610340578063996d79a514610348576101c4565b80637cebbe94146102de5780638435035b146102e65780638540661f146102f9576101c4565b8063299ca478116101665780635a98c361116101405780635a98c3611461029b57806373509064146102a3578063741a33eb146102ab578063746c32f1146102be576101c4565b8063299ca478146102605780632a2a7adb14610275578063461a447814610288576101c4565b80631c4712a7116101a25780631c4712a71461022857806320160f3a1461023057806322bd64c01461023857806324749d5c1461024d576101c4565b806303daa959146101c9578063101185a4146101f257806314aa2ff714610207575b600080fd5b6101dc6101d73660046125d4565b6103b4565b6040516101e99190612a20565b60405180910390f35b6101fa6103f9565b6040516101e99190612b0b565b61021a610215366004612666565b610402565b6040516101e9929190612a9b565b6101dc61049a565b6101dc6104a0565b61024b610246366004612604565b6104a6565b005b6101dc61025b366004612548565b610509565b610268610524565b6040516101e99190612a29565b61024b610283366004612666565b610533565b610268610296366004612777565b610541565b6101dc61061d565b610268610623565b61024b6102b9366004612625565b610632565b6102d16102cc366004612580565b61079f565b6040516101e99190612af8565b61024b6107bc565b6101dc6102f4366004612548565b610813565b61030c61030736600461286c565b610826565b6040516101e9929190612abf565b61030c61032836600461286c565b61089f565b61030c61033b36600461280b565b6108ee565b6101dc6109c1565b6102686109c7565b61021a61035e366004612698565b6109d6565b6102d16103713660046127bc565b610a69565b610268610bcb565b6101dc610bda565b6101dc610be0565b61024b61039c3660046128c2565b610bf7565b61030c6103af36600461286c565b610de1565b6000619c4060005a905060006103c86109c7565b90506103d48186610e32565b93505060005a82039050808310156103f157601080548483030190555b505050919050565b60085460ff1690565b600f5460009060609060ff600160a01b9091041615156001141561042a5761042a6006610ec0565b619c4060005a9050600061043c6109c7565b905061044781610ed9565b600061045b8261045684610f5e565b610fe9565b90506104678188611083565b95509550505060005a8203905080831015610489576010805484019055610492565b60108054820190555b505050915091565b60045490565b600b5490565b600f5460ff600160a01b909104161515600114156104c8576104c86006610ec0565b61ea6060005a905060006104da6109c7565b90506104e7818686611109565b5060005a820390508083101561050257601080548483030190555b5050505050565b600061051c6105178361118b565b611216565b90505b919050565b6000546001600160a01b031681565b61053e60018261121a565b50565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b838110156105a1578181015183820152602001610589565b50505050905090810190601f1680156105ce5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b1580156105eb57600080fd5b505afa1580156105ff573d6000803e3d6000fd5b505050506040513d602081101561061557600080fd5b505192915050565b600a5490565b600e546001600160a01b031690565b600f5460ff600160a01b90910416151560011415610654576106546006610ec0565b600060018585601b0185856040516000815260200160405260405161067c9493929190612ada565b6020604051602081039080840390855afa15801561069e573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166106da576106da604051806060016040528060388152602001612caa60389139610533565b6106e381611230565b6106ed5750610799565b6106f6816112bb565b600f80546001600160a01b038381166001600160a01b031983161790925516600061075361072f6009602160991b01836102cc82610813565b60405160200161073f91906129ea565b604051602081830303815290604052611322565b600f80546001600160a01b0319166001600160a01b038516179055905061078a838261077e81611335565b8051906020012061134b565b610795836000611388565b5050505b50505050565b60606107b46107ad8561118b565b84846113f9565b949350505050565b600f5460ff600160a01b909104161515600114156107de576107de6006610ec0565b60006107e86109c7565b905060006107f582610f5e565b90508081600101111561080f5761080f8282600101611388565b5050565b600061051c6108218361118b565b61141d565b600060606201388060005a60408051606081018252600f546001600160a01b0390811682528916602082015260019181019190915290915061086a81898989611421565b945094505060005a820390508083101561088b576010805484019055610894565b60108054820190555b505050935093915050565b60006060620186a060005a60408051606081018252600f5460ff600160a01b8204161515928201929092526001600160a01b039182168152908816602082015290915061086a81898989611421565b6000606033156108fd57600080fd5b600280546001600160a01b0319166001600160a01b038516179055610921856114b2565b600019601155600f80546001600160a01b0319166001600160a01b038681169190911790915560808601511615801561099c576000806109648860c00151610402565b90925090506001600160a01b038216610985576000945092506109b9915050565b600161099083611335565b945094505050506109b9565b6109b38660a0015187608001518860c0015161089f565b92509250505b935093915050565b60075490565b600f546001600160a01b031690565b600f5460009060609060ff600160a01b909104161515600114156109fe576109fe6006610ec0565b619c4060005a90506000610a106109c7565b9050610a1b81610ed9565b6000610a28828989611524565b9050610a348189611083565b95509550505060005a8203905080831015610a56576010805484019055610a5f565b60108054820190555b5050509250929050565b600a546060907fdefa017defa017defa017defa017defa017defa017defa017defa017defa017d14610aaa5750604080516020810190915260008152610bc5565b600280546001600160a01b0319166001600160a01b038481169190911791829055604051630d15d41560e41b815291169063d15d415090610aef903390600401612a29565b60206040518083038186803b158015610b0757600080fd5b505afa158015610b1b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b3f91906125b4565b610b645760405162461bcd60e51b8152600401610b5b90612b87565b60405180910390fd5b610b6d836114b2565b610b768361156a565b610b9757610b826115c6565b50604080516020810190915260008152610bc5565b6000610bb76003600001548560a001510385608001518660c0015161089f565b915050610bc26115c6565b90505b92915050565b600d546001600160a01b031690565b60095490565b6000610bf2610bed6109c7565b610f5e565b905090565b333014610c0357610ddc565b610c0c81611230565b610c3b57610c3b6005610c36604051806060016040528060348152602001612d5860349139611663565b61121a565b6001546040516352275acd60e11b81526001600160a01b039091169063a44eb59a90610c6b908590600401612af8565b60206040518083038186803b158015610c8357600080fd5b505afa158015610c97573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cbb91906125b4565b610ce557610ce56004610c366040518060a0016040528060768152602001612ce260769139611663565b610cee816112bb565b6000610cf983611322565b90506001600160a01b038116610d13573d6000803e3d6000fd5b6000610d1e82611335565b6001546040516352275acd60e11b81529192506001600160a01b03169063a44eb59a90610d4f908490600401612af8565b60206040518083038186803b158015610d6757600080fd5b505afa158015610d7b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d9f91906125b4565b610dc957610dc96004610c36604051806060016040528060308152602001612d8c60309139611663565b6105028383610dd785611216565b61134b565b505050565b60006060619c4060005a60408051606081018252600e546001600160a01b039081168252600f549081166020830152600160a01b900460ff1615159181019190915290915061086a81898989611421565b6000610e3e83836116a6565b600254604051631aaf392f60e01b81526001600160a01b0390911690631aaf392f90610e709086908690600401612a61565b60206040518083038186803b158015610e8857600080fd5b505afa158015610e9c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bc291906125ec565b61053e816040518060200160405280600081525061121a565b600080610f285a6002602160991b0185604051602401610ef99190612a29565b60408051601f198184030181529190526020810180516001600160e01b031663b1540a0160e01b17905261089f565b91509150600081806020019051810190610f4291906125b4565b9050801580610f4f575082155b15610799576107996007610ec0565b6000610f69826117e1565b60025460405163d126199f60e01b81526001600160a01b039091169063d126199f90610f99908590600401612a29565b60206040518083038186803b158015610fb157600080fd5b505afa158015610fc5573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061051c91906125ec565b60408051600280825260608201909252600091829190816020015b606081526020019060019003908161100457905050905061102484611928565b8160008151811061103157fe5b602002602001018190525061104583611952565b8160018151811061105257fe5b6020026020010181905250600061106882611965565b905061107a81805190602001206119a9565b95945050505050565b600060606110a56110926109c7565b61109d610bed6109c7565b600101611388565b60408051606081018252600f5460ff600160a01b8204161515928201929092526001600160a01b03918216815290851660208201526000806110eb835a898960016119ac565b91509150816110fb5760006110fd565b865b97909650945050505050565b806111148484610e32565b141561111f57610ddc565b6111298383611c1a565b600254604051635c17d62960e01b81526001600160a01b0390911690635c17d6299061115d90869086908690600401612a7a565b600060405180830381600087803b15801561117757600080fd5b505af1158015610795573d6000803e3d6000fd5b6000611196826117e1565b600254604051637c8ee70360e01b81526001600160a01b0390911690637c8ee703906111c6908590600401612a29565b60206040518083038186803b1580156111de57600080fd5b505afa1580156111f2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061051c9190612564565b3f90565b60006112268383611d2c565b9050805160208201fd5b600061123b826117e1565b6002546040516307a1294560e01b81526001600160a01b03909116906307a129459061126b908590600401612a29565b60206040518083038186803b15801561128357600080fd5b505afa158015611297573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061051c91906125b4565b6112c4816117e1565b600254604051637e78a4d160e11b81526001600160a01b039091169063fcf149a2906112f4908490600401612a29565b600060405180830381600087803b15801561130e57600080fd5b505af1158015610502573d6000803e3d6000fd5b6000808251602084016000f09392505050565b606061051c8260006113468561141d565b6113f9565b61135483611dd5565b6002546040516368510af960e11b81526001600160a01b039091169063d0a215f29061115d90869086908690600401612a3d565b61139182611dd5565b6002546040516374855dc360e11b81526001600160a01b039091169063e90abb86906113c39085908590600401612a61565b600060405180830381600087803b1580156113dd57600080fd5b505af11580156113f1573d6000803e3d6000fd5b505050505050565b6060806040519050602083018101604052828152828460208301873c949350505050565b3b90565b6000606073ffffffffffffffffffffffffffffffffffff0000841673deaddeaddeaddeaddeaddeaddeaddeaddead000014156114705750506040805160208101909152600081526001906114a9565b60006064856001600160a01b0316106114915761148c8561118b565b611493565b845b90506114a38787838760006119ac565b92509250505b94509492505050565b80516009556020810151600a5560a0810151600c5560408101516008805460ff1916600183818111156114e157fe5b02179055506060810151600d80546001600160a01b0319166001600160a01b03909216919091179055600554600b5560a081015161151e90611ee4565b60115550565b60008060ff60f81b858486805190602001206040516020016115499493929190612966565b60405160208183030381529060405280519060200120905061107a816119a9565b60007fdefa017defa017defa017defa017defa017defa017defa017defa017defa017d826020015114156115a05750600061051f565b6115b28260a001518360400151611ef7565b6115be5750600061051f565b506001919050565b600d80546001600160a01b031990811673defa017defa017defa017defa017defa017defa09081179092557fdefa017defa017defa017defa017defa017defa017defa017defa017defa017d6009819055600a819055600b819055600c8190556008805460ff191690556010819055600e8054831684179055600f8054831690931760ff60a01b1916909255601191909155600280549091169055565b6060816040516024016116769190612af8565b60408051601f198184030181529190526020810180516001600160e01b031662461bcd60e51b1790529050919050565b6175305a10156116ba576116ba6000610ec0565b600254604051630ad2267960e01b81526001600160a01b0390911690630ad22679906116ec9085908590600401612a61565b60206040518083038186803b15801561170457600080fd5b505afa158015611718573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061173c91906125b4565b61174a5761174a6003610ec0565b600254604051632bcdee1960e21b81526000916001600160a01b03169063af37b8649061177d9086908690600401612a61565b602060405180830381600087803b15801561179757600080fd5b505af11580156117ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117cf91906125b4565b905080610ddc57610ddc614e20611f27565b6175305a10156117f5576117f56000610ec0565b60025460405163c8e40fbf60e01b81526001600160a01b039091169063c8e40fbf90611825908490600401612a29565b60206040518083038186803b15801561183d57600080fd5b505afa158015611851573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061187591906125b4565b611883576118836003610ec0565b600254604051633ecdecc760e21b81526000916001600160a01b03169063fb37b31c906118b4908590600401612a29565b602060405180830381600087803b1580156118ce57600080fd5b505af11580156118e2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061190691906125b4565b90508061080f5761080f61753060646119216108218661118b565b0201611f27565b606061051c8260405160200161193e9190612949565b604051602081830303815290604052611f47565b606061051c61196083611f99565b611f47565b606060006119728361209d565b9050611980815160c061219d565b816040516020016119929291906129bb565b604051602081830303815290604052915050919050565b90565b6040805160608082018352600e546001600160a01b039081168352600f549081166020840152600160a01b900460ff16151592820192909252600091906119f381896122ed565b6011546000611a0189611ee4565b60118190559050600060608715611abd57604051309063fcb6829b60e01b90611a32908e908d908f90602401612bf3565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909416939093179092529051611a70919061299f565b6000604051808303816000865af19150503d8060008114611aad576040519150601f19603f3d011682016040523d82523d6000602084013e611ab2565b606091505b509092509050611b20565b896001600160a01b03168b8a604051611ad6919061299f565b60006040518083038160008787f1925050503d8060008114611b14576040519150601f19603f3d011682016040523d82523d6000602084013e611b19565b606091505b5090925090505b611b2a8c866122ed565b60115482611c0257600080600080611b41866123a1565b929650909450925090506003846007811115611b5957fe5b1415611b6857611b6884610ec0565b6001846007811115611b7657fe5b1480611b8d57506004846007811115611b8b57fe5b145b80611ba357506006846007811115611ba157fe5b145b80611bb957506007846007811115611bb757fe5b145b15611bc45760108290555b6001846007811115611bd257fe5b1480611bdb57508c5b15611be857809550611bfb565b6040518060200160405280600081525095505b5090925050505b90920390920360115590999098509650505050505050565b611c2482826116a6565b60025460405163af3dc01160e01b81526000916001600160a01b03169063af3dc01190611c579086908690600401612a61565b602060405180830381600087803b158015611c7157600080fd5b505af1158015611c85573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ca991906125b4565b905080610ddc57611cb983611dd5565b600260009054906101000a90046001600160a01b03166001600160a01b031663c3fd9b256040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611d0957600080fd5b505af1158015611d1d573d6000803e3d6000fd5b50505050610ddc614e20611f27565b60606000836007811115611d3c57fe5b1415611d575750604080516020810190915260008152610bc5565b6003836007811115611d6557fe5b1415611da357604080516020808201835260008083529251611d8d9387939092839201612b1f565b6040516020818303038152906040529050610bc5565b601154601054604051611dbe92869290918690602001612b5b565b604051602081830303815290604052905092915050565b611dde816117e1565b60025460405163011b1f7960e41b81526000916001600160a01b0316906311b1f79090611e0f908590600401612a29565b602060405180830381600087803b158015611e2957600080fd5b505af1158015611e3d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e6191906125b4565b90508061080f57600260009054906101000a90046001600160a01b03166001600160a01b03166333f943056040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611eb857600080fd5b505af1158015611ecc573d6000803e3d6000fd5b5050505061080f61753060646119216108218661118b565b60005a8210611ef3575a61051c565b5090565b600454600090831115611f0c57506000610bc5565b600354831015611f1e57506000610bc5565b50600192915050565b601154811115611f3b57611f3b6002610ec0565b60118054919091039055565b60608082516001148015611f6f5750608083600081518110611f6557fe5b016020015160f81c105b15611f7b57508161051c565b611f878351608061219d565b83604051602001611dbe9291906129bb565b6060600082604051602001611fae9190612a20565b604051602081830303815290604052905060005b6020811015611ff857818181518110611fd757fe5b01602001516001600160f81b03191615611ff057611ff8565b600101611fc2565b6000816020036001600160401b038111801561201357600080fd5b506040519080825280601f01601f19166020018201604052801561203e576020820181803683370190505b50905060005b815181101561209457835160018401938591811061205e57fe5b602001015160f81c60f81b82828151811061207557fe5b60200101906001600160f81b031916908160001a905350600101612044565b50949350505050565b60608151600014156120be575060408051600081526020810190915261051f565b6000805b83518110156120f1578381815181106120d757fe5b6020026020010151518201915080806001019150506120c2565b6000826001600160401b038111801561210957600080fd5b506040519080825280601f01601f191660200182016040528015612134576020820181803683370190505b50600092509050602081015b855183101561209457600086848151811061215757fe5b602002602001015190506000602082019050612175838284516123f4565b87858151811061218157fe5b6020026020010151518301925050508280600101935050612140565b60608060388410156121f7576040805160018082528183019092529060208201818036833701905050905082840160f81b816000815181106121db57fe5b60200101906001600160f81b031916908160001a905350610bc2565b600060015b80868161220557fe5b041561221a57600190910190610100026121fc565b816001016001600160401b038111801561223357600080fd5b506040519080825280601f01601f19166020018201604052801561225e576020820181803683370190505b50925084820160370160f81b8360008151811061227757fe5b60200101906001600160f81b031916908160001a905350600190505b8181116122e3576101008183036101000a87816122ac57fe5b04816122b457fe5b0660f81b8382815181106122c457fe5b60200101906001600160f81b031916908160001a905350600101612293565b5050905092915050565b805182516001600160a01b03908116911614612325578051600e80546001600160a01b0319166001600160a01b039092169190911790555b80602001516001600160a01b031682602001516001600160a01b03161461236b576020810151600f80546001600160a01b0319166001600160a01b039092169190911790555b80604001511515826040015115151461080f5760400151600f8054911515600160a01b0260ff60a01b1990921691909117905550565b600080600060608451600014156123d057505060408051602081019091526000808252925082915081906123ed565b848060200190518101906123e491906126da565b93509350935093505b9193509193565b8282825b60208110612417578151835260209283019290910190601f19016123f8565b905182516020929092036101000a6000190180199091169116179052505050565b600061244b61244684612c47565b612c24565b905082815283838301111561245f57600080fd5b828260208301376000602084830101529392505050565b803561051f81612c94565b600082601f830112612491578081fd5b610bc283833560208501612438565b80356002811061051f57600080fd5b600060e082840312156124c0578081fd5b6124ca60e0612c24565b905081358152602082013560208201526124e6604083016124a0565b60408201526124f760608301612476565b606082015261250860808301612476565b608082015260a082013560a082015260c08201356001600160401b0381111561253057600080fd5b61253c84828501612481565b60c08301525092915050565b600060208284031215612559578081fd5b8135610bc281612c94565b600060208284031215612575578081fd5b8151610bc281612c94565b600080600060608486031215612594578182fd5b833561259f81612c94565b95602085013595506040909401359392505050565b6000602082840312156125c5578081fd5b81518015158114610bc2578182fd5b6000602082840312156125e5578081fd5b5035919050565b6000602082840312156125fd578081fd5b5051919050565b60008060408385031215612616578182fd5b50508035926020909101359150565b6000806000806080858703121561263a578081fd5b84359350602085013560ff81168114612651578182fd5b93969395505050506040820135916060013590565b600060208284031215612677578081fd5b81356001600160401b0381111561268c578182fd5b6107b484828501612481565b600080604083850312156126aa578182fd5b82356001600160401b038111156126bf578283fd5b6126cb85828601612481565b95602094909401359450505050565b600080600080608085870312156126ef578182fd5b8451600881106126fd578283fd5b80945050602085015192506040850151915060608501516001600160401b03811115612727578182fd5b8501601f81018713612737578182fd5b805161274561244682612c47565b818152886020838501011115612759578384fd5b61276a826020830160208601612c68565b9598949750929550505050565b600060208284031215612788578081fd5b81356001600160401b0381111561279d578182fd5b8201601f810184136127ad578182fd5b6107b484823560208401612438565b600080604083850312156127ce578182fd5b82356001600160401b038111156127e3578283fd5b6127ef858286016124af565b925050602083013561280081612c94565b809150509250929050565b60008060006060848603121561281f578081fd5b83356001600160401b03811115612834578182fd5b612840868287016124af565b935050602084013561285181612c94565b9150604084013561286181612c94565b809150509250925092565b600080600060608486031215612880578081fd5b83359250602084013561289281612c94565b915060408401356001600160401b038111156128ac578182fd5b6128b886828701612481565b9150509250925092565b6000806000606084860312156128d6578081fd5b8335925060208401356001600160401b038111156128f2578182fd5b6128fe86828701612481565b925050604084013561286181612c94565b60008151808452612927816020860160208601612c68565b601f01601f19169290920160200192915050565b6008811061294557fe5b9052565b60609190911b6bffffffffffffffffffffffff1916815260140190565b6001600160f81b031994909416845260609290921b6bffffffffffffffffffffffff191660018401526015830152603582015260550190565b600082516129b1818460208701612c68565b9190910192915050565b600083516129cd818460208801612c68565b8351908301906129e1818360208801612c68565b01949350505050565b6c600d380380600d6000396000f360981b81528151600090612a1381600d850160208701612c68565b91909101600d0192915050565b90815260200190565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039390931683526020830191909152604082015260600190565b6001600160a01b03831681526040602082018190526000906107b49083018461290f565b60008315158252604060208301526107b4604083018461290f565b93845260ff9290921660208401526040830152606082015260800190565b600060208252610bc2602083018461290f565b6020810160028310612b1957fe5b91905290565b6000612b2b828761293b565b60ff8516602083015260ff8416604083015260806060830152612b51608083018461290f565b9695505050505050565b6000612b67828761293b565b84602083015283604083015260806060830152612b51608083018461290f565b60208082526046908201527f4f6e6c792061757468656e746963617465642061646472657373657320696e2060408201527f6f766d53746174654d616e616765722063616e2063616c6c20746869732066756060820152653731ba34b7b760d11b608082015260a00190565b600084825260606020830152612c0c606083018561290f565b905060018060a01b0383166040830152949350505050565b6040518181016001600160401b0381118282101715612c3f57fe5b604052919050565b60006001600160401b03821115612c5a57fe5b50601f01601f191660200190565b60005b83811015612c83578181015183820152602001612c6b565b838111156107995750506000910152565b6001600160a01b038116811461053e57600080fdfe5369676e61747572652070726f766964656420666f7220454f4120636f6e7472616374206372656174696f6e20697320696e76616c69642e436f6e7472616374206372656174696f6e20636f646520636f6e7461696e7320756e73616665206f70636f6465732e2044696420796f75207573652074686520726967687420636f6d70696c6572206f72207061737320616e20756e7361666520636f6e7374727563746f7220617267756d656e743f4120636f6e74726163742068617320616c7265616479206265656e206465706c6f79656420746f20746869732061646472657373436f6e7374727563746f7220617474656d7074656420746f206465706c6f7920756e736166652062797465636f64652ea2646970667358221220ba09f3066e98cffa8b50d7fb9822c62cac7bc36099454fe6dbe318573486c14d64736f6c63430007060033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101c45760003560e01c80637cebbe94116100f957806399ccd98b11610097578063bdbf8c3611610071578063bdbf8c361461037e578063c1fb2ea214610386578063fcb6829b1461038e578063ffe73914146103a1576101c4565b806399ccd98b146103505780639be3ad67146103635780639dc9dc9314610376576101c4565b806385979f76116100d357806385979f761461031a5780638bb42e151461032d5780639058025614610340578063996d79a514610348576101c4565b80637cebbe94146102de5780638435035b146102e65780638540661f146102f9576101c4565b8063299ca478116101665780635a98c361116101405780635a98c3611461029b57806373509064146102a3578063741a33eb146102ab578063746c32f1146102be576101c4565b8063299ca478146102605780632a2a7adb14610275578063461a447814610288576101c4565b80631c4712a7116101a25780631c4712a71461022857806320160f3a1461023057806322bd64c01461023857806324749d5c1461024d576101c4565b806303daa959146101c9578063101185a4146101f257806314aa2ff714610207575b600080fd5b6101dc6101d73660046125d4565b6103b4565b6040516101e99190612a20565b60405180910390f35b6101fa6103f9565b6040516101e99190612b0b565b61021a610215366004612666565b610402565b6040516101e9929190612a9b565b6101dc61049a565b6101dc6104a0565b61024b610246366004612604565b6104a6565b005b6101dc61025b366004612548565b610509565b610268610524565b6040516101e99190612a29565b61024b610283366004612666565b610533565b610268610296366004612777565b610541565b6101dc61061d565b610268610623565b61024b6102b9366004612625565b610632565b6102d16102cc366004612580565b61079f565b6040516101e99190612af8565b61024b6107bc565b6101dc6102f4366004612548565b610813565b61030c61030736600461286c565b610826565b6040516101e9929190612abf565b61030c61032836600461286c565b61089f565b61030c61033b36600461280b565b6108ee565b6101dc6109c1565b6102686109c7565b61021a61035e366004612698565b6109d6565b6102d16103713660046127bc565b610a69565b610268610bcb565b6101dc610bda565b6101dc610be0565b61024b61039c3660046128c2565b610bf7565b61030c6103af36600461286c565b610de1565b6000619c4060005a905060006103c86109c7565b90506103d48186610e32565b93505060005a82039050808310156103f157601080548483030190555b505050919050565b60085460ff1690565b600f5460009060609060ff600160a01b9091041615156001141561042a5761042a6006610ec0565b619c4060005a9050600061043c6109c7565b905061044781610ed9565b600061045b8261045684610f5e565b610fe9565b90506104678188611083565b95509550505060005a8203905080831015610489576010805484019055610492565b60108054820190555b505050915091565b60045490565b600b5490565b600f5460ff600160a01b909104161515600114156104c8576104c86006610ec0565b61ea6060005a905060006104da6109c7565b90506104e7818686611109565b5060005a820390508083101561050257601080548483030190555b5050505050565b600061051c6105178361118b565b611216565b90505b919050565b6000546001600160a01b031681565b61053e60018261121a565b50565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b838110156105a1578181015183820152602001610589565b50505050905090810190601f1680156105ce5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b1580156105eb57600080fd5b505afa1580156105ff573d6000803e3d6000fd5b505050506040513d602081101561061557600080fd5b505192915050565b600a5490565b600e546001600160a01b031690565b600f5460ff600160a01b90910416151560011415610654576106546006610ec0565b600060018585601b0185856040516000815260200160405260405161067c9493929190612ada565b6020604051602081039080840390855afa15801561069e573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166106da576106da604051806060016040528060388152602001612caa60389139610533565b6106e381611230565b6106ed5750610799565b6106f6816112bb565b600f80546001600160a01b038381166001600160a01b031983161790925516600061075361072f6009602160991b01836102cc82610813565b60405160200161073f91906129ea565b604051602081830303815290604052611322565b600f80546001600160a01b0319166001600160a01b038516179055905061078a838261077e81611335565b8051906020012061134b565b610795836000611388565b5050505b50505050565b60606107b46107ad8561118b565b84846113f9565b949350505050565b600f5460ff600160a01b909104161515600114156107de576107de6006610ec0565b60006107e86109c7565b905060006107f582610f5e565b90508081600101111561080f5761080f8282600101611388565b5050565b600061051c6108218361118b565b61141d565b600060606201388060005a60408051606081018252600f546001600160a01b0390811682528916602082015260019181019190915290915061086a81898989611421565b945094505060005a820390508083101561088b576010805484019055610894565b60108054820190555b505050935093915050565b60006060620186a060005a60408051606081018252600f5460ff600160a01b8204161515928201929092526001600160a01b039182168152908816602082015290915061086a81898989611421565b6000606033156108fd57600080fd5b600280546001600160a01b0319166001600160a01b038516179055610921856114b2565b600019601155600f80546001600160a01b0319166001600160a01b038681169190911790915560808601511615801561099c576000806109648860c00151610402565b90925090506001600160a01b038216610985576000945092506109b9915050565b600161099083611335565b945094505050506109b9565b6109b38660a0015187608001518860c0015161089f565b92509250505b935093915050565b60075490565b600f546001600160a01b031690565b600f5460009060609060ff600160a01b909104161515600114156109fe576109fe6006610ec0565b619c4060005a90506000610a106109c7565b9050610a1b81610ed9565b6000610a28828989611524565b9050610a348189611083565b95509550505060005a8203905080831015610a56576010805484019055610a5f565b60108054820190555b5050509250929050565b600a546060907fdefa017defa017defa017defa017defa017defa017defa017defa017defa017d14610aaa5750604080516020810190915260008152610bc5565b600280546001600160a01b0319166001600160a01b038481169190911791829055604051630d15d41560e41b815291169063d15d415090610aef903390600401612a29565b60206040518083038186803b158015610b0757600080fd5b505afa158015610b1b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b3f91906125b4565b610b645760405162461bcd60e51b8152600401610b5b90612b87565b60405180910390fd5b610b6d836114b2565b610b768361156a565b610b9757610b826115c6565b50604080516020810190915260008152610bc5565b6000610bb76003600001548560a001510385608001518660c0015161089f565b915050610bc26115c6565b90505b92915050565b600d546001600160a01b031690565b60095490565b6000610bf2610bed6109c7565b610f5e565b905090565b333014610c0357610ddc565b610c0c81611230565b610c3b57610c3b6005610c36604051806060016040528060348152602001612d5860349139611663565b61121a565b6001546040516352275acd60e11b81526001600160a01b039091169063a44eb59a90610c6b908590600401612af8565b60206040518083038186803b158015610c8357600080fd5b505afa158015610c97573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cbb91906125b4565b610ce557610ce56004610c366040518060a0016040528060768152602001612ce260769139611663565b610cee816112bb565b6000610cf983611322565b90506001600160a01b038116610d13573d6000803e3d6000fd5b6000610d1e82611335565b6001546040516352275acd60e11b81529192506001600160a01b03169063a44eb59a90610d4f908490600401612af8565b60206040518083038186803b158015610d6757600080fd5b505afa158015610d7b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d9f91906125b4565b610dc957610dc96004610c36604051806060016040528060308152602001612d8c60309139611663565b6105028383610dd785611216565b61134b565b505050565b60006060619c4060005a60408051606081018252600e546001600160a01b039081168252600f549081166020830152600160a01b900460ff1615159181019190915290915061086a81898989611421565b6000610e3e83836116a6565b600254604051631aaf392f60e01b81526001600160a01b0390911690631aaf392f90610e709086908690600401612a61565b60206040518083038186803b158015610e8857600080fd5b505afa158015610e9c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bc291906125ec565b61053e816040518060200160405280600081525061121a565b600080610f285a6002602160991b0185604051602401610ef99190612a29565b60408051601f198184030181529190526020810180516001600160e01b031663b1540a0160e01b17905261089f565b91509150600081806020019051810190610f4291906125b4565b9050801580610f4f575082155b15610799576107996007610ec0565b6000610f69826117e1565b60025460405163d126199f60e01b81526001600160a01b039091169063d126199f90610f99908590600401612a29565b60206040518083038186803b158015610fb157600080fd5b505afa158015610fc5573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061051c91906125ec565b60408051600280825260608201909252600091829190816020015b606081526020019060019003908161100457905050905061102484611928565b8160008151811061103157fe5b602002602001018190525061104583611952565b8160018151811061105257fe5b6020026020010181905250600061106882611965565b905061107a81805190602001206119a9565b95945050505050565b600060606110a56110926109c7565b61109d610bed6109c7565b600101611388565b60408051606081018252600f5460ff600160a01b8204161515928201929092526001600160a01b03918216815290851660208201526000806110eb835a898960016119ac565b91509150816110fb5760006110fd565b865b97909650945050505050565b806111148484610e32565b141561111f57610ddc565b6111298383611c1a565b600254604051635c17d62960e01b81526001600160a01b0390911690635c17d6299061115d90869086908690600401612a7a565b600060405180830381600087803b15801561117757600080fd5b505af1158015610795573d6000803e3d6000fd5b6000611196826117e1565b600254604051637c8ee70360e01b81526001600160a01b0390911690637c8ee703906111c6908590600401612a29565b60206040518083038186803b1580156111de57600080fd5b505afa1580156111f2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061051c9190612564565b3f90565b60006112268383611d2c565b9050805160208201fd5b600061123b826117e1565b6002546040516307a1294560e01b81526001600160a01b03909116906307a129459061126b908590600401612a29565b60206040518083038186803b15801561128357600080fd5b505afa158015611297573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061051c91906125b4565b6112c4816117e1565b600254604051637e78a4d160e11b81526001600160a01b039091169063fcf149a2906112f4908490600401612a29565b600060405180830381600087803b15801561130e57600080fd5b505af1158015610502573d6000803e3d6000fd5b6000808251602084016000f09392505050565b606061051c8260006113468561141d565b6113f9565b61135483611dd5565b6002546040516368510af960e11b81526001600160a01b039091169063d0a215f29061115d90869086908690600401612a3d565b61139182611dd5565b6002546040516374855dc360e11b81526001600160a01b039091169063e90abb86906113c39085908590600401612a61565b600060405180830381600087803b1580156113dd57600080fd5b505af11580156113f1573d6000803e3d6000fd5b505050505050565b6060806040519050602083018101604052828152828460208301873c949350505050565b3b90565b6000606073ffffffffffffffffffffffffffffffffffff0000841673deaddeaddeaddeaddeaddeaddeaddeaddead000014156114705750506040805160208101909152600081526001906114a9565b60006064856001600160a01b0316106114915761148c8561118b565b611493565b845b90506114a38787838760006119ac565b92509250505b94509492505050565b80516009556020810151600a5560a0810151600c5560408101516008805460ff1916600183818111156114e157fe5b02179055506060810151600d80546001600160a01b0319166001600160a01b03909216919091179055600554600b5560a081015161151e90611ee4565b60115550565b60008060ff60f81b858486805190602001206040516020016115499493929190612966565b60405160208183030381529060405280519060200120905061107a816119a9565b60007fdefa017defa017defa017defa017defa017defa017defa017defa017defa017d826020015114156115a05750600061051f565b6115b28260a001518360400151611ef7565b6115be5750600061051f565b506001919050565b600d80546001600160a01b031990811673defa017defa017defa017defa017defa017defa09081179092557fdefa017defa017defa017defa017defa017defa017defa017defa017defa017d6009819055600a819055600b819055600c8190556008805460ff191690556010819055600e8054831684179055600f8054831690931760ff60a01b1916909255601191909155600280549091169055565b6060816040516024016116769190612af8565b60408051601f198184030181529190526020810180516001600160e01b031662461bcd60e51b1790529050919050565b6175305a10156116ba576116ba6000610ec0565b600254604051630ad2267960e01b81526001600160a01b0390911690630ad22679906116ec9085908590600401612a61565b60206040518083038186803b15801561170457600080fd5b505afa158015611718573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061173c91906125b4565b61174a5761174a6003610ec0565b600254604051632bcdee1960e21b81526000916001600160a01b03169063af37b8649061177d9086908690600401612a61565b602060405180830381600087803b15801561179757600080fd5b505af11580156117ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117cf91906125b4565b905080610ddc57610ddc614e20611f27565b6175305a10156117f5576117f56000610ec0565b60025460405163c8e40fbf60e01b81526001600160a01b039091169063c8e40fbf90611825908490600401612a29565b60206040518083038186803b15801561183d57600080fd5b505afa158015611851573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061187591906125b4565b611883576118836003610ec0565b600254604051633ecdecc760e21b81526000916001600160a01b03169063fb37b31c906118b4908590600401612a29565b602060405180830381600087803b1580156118ce57600080fd5b505af11580156118e2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061190691906125b4565b90508061080f5761080f61753060646119216108218661118b565b0201611f27565b606061051c8260405160200161193e9190612949565b604051602081830303815290604052611f47565b606061051c61196083611f99565b611f47565b606060006119728361209d565b9050611980815160c061219d565b816040516020016119929291906129bb565b604051602081830303815290604052915050919050565b90565b6040805160608082018352600e546001600160a01b039081168352600f549081166020840152600160a01b900460ff16151592820192909252600091906119f381896122ed565b6011546000611a0189611ee4565b60118190559050600060608715611abd57604051309063fcb6829b60e01b90611a32908e908d908f90602401612bf3565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909416939093179092529051611a70919061299f565b6000604051808303816000865af19150503d8060008114611aad576040519150601f19603f3d011682016040523d82523d6000602084013e611ab2565b606091505b509092509050611b20565b896001600160a01b03168b8a604051611ad6919061299f565b60006040518083038160008787f1925050503d8060008114611b14576040519150601f19603f3d011682016040523d82523d6000602084013e611b19565b606091505b5090925090505b611b2a8c866122ed565b60115482611c0257600080600080611b41866123a1565b929650909450925090506003846007811115611b5957fe5b1415611b6857611b6884610ec0565b6001846007811115611b7657fe5b1480611b8d57506004846007811115611b8b57fe5b145b80611ba357506006846007811115611ba157fe5b145b80611bb957506007846007811115611bb757fe5b145b15611bc45760108290555b6001846007811115611bd257fe5b1480611bdb57508c5b15611be857809550611bfb565b6040518060200160405280600081525095505b5090925050505b90920390920360115590999098509650505050505050565b611c2482826116a6565b60025460405163af3dc01160e01b81526000916001600160a01b03169063af3dc01190611c579086908690600401612a61565b602060405180830381600087803b158015611c7157600080fd5b505af1158015611c85573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ca991906125b4565b905080610ddc57611cb983611dd5565b600260009054906101000a90046001600160a01b03166001600160a01b031663c3fd9b256040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611d0957600080fd5b505af1158015611d1d573d6000803e3d6000fd5b50505050610ddc614e20611f27565b60606000836007811115611d3c57fe5b1415611d575750604080516020810190915260008152610bc5565b6003836007811115611d6557fe5b1415611da357604080516020808201835260008083529251611d8d9387939092839201612b1f565b6040516020818303038152906040529050610bc5565b601154601054604051611dbe92869290918690602001612b5b565b604051602081830303815290604052905092915050565b611dde816117e1565b60025460405163011b1f7960e41b81526000916001600160a01b0316906311b1f79090611e0f908590600401612a29565b602060405180830381600087803b158015611e2957600080fd5b505af1158015611e3d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e6191906125b4565b90508061080f57600260009054906101000a90046001600160a01b03166001600160a01b03166333f943056040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611eb857600080fd5b505af1158015611ecc573d6000803e3d6000fd5b5050505061080f61753060646119216108218661118b565b60005a8210611ef3575a61051c565b5090565b600454600090831115611f0c57506000610bc5565b600354831015611f1e57506000610bc5565b50600192915050565b601154811115611f3b57611f3b6002610ec0565b60118054919091039055565b60608082516001148015611f6f5750608083600081518110611f6557fe5b016020015160f81c105b15611f7b57508161051c565b611f878351608061219d565b83604051602001611dbe9291906129bb565b6060600082604051602001611fae9190612a20565b604051602081830303815290604052905060005b6020811015611ff857818181518110611fd757fe5b01602001516001600160f81b03191615611ff057611ff8565b600101611fc2565b6000816020036001600160401b038111801561201357600080fd5b506040519080825280601f01601f19166020018201604052801561203e576020820181803683370190505b50905060005b815181101561209457835160018401938591811061205e57fe5b602001015160f81c60f81b82828151811061207557fe5b60200101906001600160f81b031916908160001a905350600101612044565b50949350505050565b60608151600014156120be575060408051600081526020810190915261051f565b6000805b83518110156120f1578381815181106120d757fe5b6020026020010151518201915080806001019150506120c2565b6000826001600160401b038111801561210957600080fd5b506040519080825280601f01601f191660200182016040528015612134576020820181803683370190505b50600092509050602081015b855183101561209457600086848151811061215757fe5b602002602001015190506000602082019050612175838284516123f4565b87858151811061218157fe5b6020026020010151518301925050508280600101935050612140565b60608060388410156121f7576040805160018082528183019092529060208201818036833701905050905082840160f81b816000815181106121db57fe5b60200101906001600160f81b031916908160001a905350610bc2565b600060015b80868161220557fe5b041561221a57600190910190610100026121fc565b816001016001600160401b038111801561223357600080fd5b506040519080825280601f01601f19166020018201604052801561225e576020820181803683370190505b50925084820160370160f81b8360008151811061227757fe5b60200101906001600160f81b031916908160001a905350600190505b8181116122e3576101008183036101000a87816122ac57fe5b04816122b457fe5b0660f81b8382815181106122c457fe5b60200101906001600160f81b031916908160001a905350600101612293565b5050905092915050565b805182516001600160a01b03908116911614612325578051600e80546001600160a01b0319166001600160a01b039092169190911790555b80602001516001600160a01b031682602001516001600160a01b03161461236b576020810151600f80546001600160a01b0319166001600160a01b039092169190911790555b80604001511515826040015115151461080f5760400151600f8054911515600160a01b0260ff60a01b1990921691909117905550565b600080600060608451600014156123d057505060408051602081019091526000808252925082915081906123ed565b848060200190518101906123e491906126da565b93509350935093505b9193509193565b8282825b60208110612417578151835260209283019290910190601f19016123f8565b905182516020929092036101000a6000190180199091169116179052505050565b600061244b61244684612c47565b612c24565b905082815283838301111561245f57600080fd5b828260208301376000602084830101529392505050565b803561051f81612c94565b600082601f830112612491578081fd5b610bc283833560208501612438565b80356002811061051f57600080fd5b600060e082840312156124c0578081fd5b6124ca60e0612c24565b905081358152602082013560208201526124e6604083016124a0565b60408201526124f760608301612476565b606082015261250860808301612476565b608082015260a082013560a082015260c08201356001600160401b0381111561253057600080fd5b61253c84828501612481565b60c08301525092915050565b600060208284031215612559578081fd5b8135610bc281612c94565b600060208284031215612575578081fd5b8151610bc281612c94565b600080600060608486031215612594578182fd5b833561259f81612c94565b95602085013595506040909401359392505050565b6000602082840312156125c5578081fd5b81518015158114610bc2578182fd5b6000602082840312156125e5578081fd5b5035919050565b6000602082840312156125fd578081fd5b5051919050565b60008060408385031215612616578182fd5b50508035926020909101359150565b6000806000806080858703121561263a578081fd5b84359350602085013560ff81168114612651578182fd5b93969395505050506040820135916060013590565b600060208284031215612677578081fd5b81356001600160401b0381111561268c578182fd5b6107b484828501612481565b600080604083850312156126aa578182fd5b82356001600160401b038111156126bf578283fd5b6126cb85828601612481565b95602094909401359450505050565b600080600080608085870312156126ef578182fd5b8451600881106126fd578283fd5b80945050602085015192506040850151915060608501516001600160401b03811115612727578182fd5b8501601f81018713612737578182fd5b805161274561244682612c47565b818152886020838501011115612759578384fd5b61276a826020830160208601612c68565b9598949750929550505050565b600060208284031215612788578081fd5b81356001600160401b0381111561279d578182fd5b8201601f810184136127ad578182fd5b6107b484823560208401612438565b600080604083850312156127ce578182fd5b82356001600160401b038111156127e3578283fd5b6127ef858286016124af565b925050602083013561280081612c94565b809150509250929050565b60008060006060848603121561281f578081fd5b83356001600160401b03811115612834578182fd5b612840868287016124af565b935050602084013561285181612c94565b9150604084013561286181612c94565b809150509250925092565b600080600060608486031215612880578081fd5b83359250602084013561289281612c94565b915060408401356001600160401b038111156128ac578182fd5b6128b886828701612481565b9150509250925092565b6000806000606084860312156128d6578081fd5b8335925060208401356001600160401b038111156128f2578182fd5b6128fe86828701612481565b925050604084013561286181612c94565b60008151808452612927816020860160208601612c68565b601f01601f19169290920160200192915050565b6008811061294557fe5b9052565b60609190911b6bffffffffffffffffffffffff1916815260140190565b6001600160f81b031994909416845260609290921b6bffffffffffffffffffffffff191660018401526015830152603582015260550190565b600082516129b1818460208701612c68565b9190910192915050565b600083516129cd818460208801612c68565b8351908301906129e1818360208801612c68565b01949350505050565b6c600d380380600d6000396000f360981b81528151600090612a1381600d850160208701612c68565b91909101600d0192915050565b90815260200190565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039390931683526020830191909152604082015260600190565b6001600160a01b03831681526040602082018190526000906107b49083018461290f565b60008315158252604060208301526107b4604083018461290f565b93845260ff9290921660208401526040830152606082015260800190565b600060208252610bc2602083018461290f565b6020810160028310612b1957fe5b91905290565b6000612b2b828761293b565b60ff8516602083015260ff8416604083015260806060830152612b51608083018461290f565b9695505050505050565b6000612b67828761293b565b84602083015283604083015260806060830152612b51608083018461290f565b60208082526046908201527f4f6e6c792061757468656e746963617465642061646472657373657320696e2060408201527f6f766d53746174654d616e616765722063616e2063616c6c20746869732066756060820152653731ba34b7b760d11b608082015260a00190565b600084825260606020830152612c0c606083018561290f565b905060018060a01b0383166040830152949350505050565b6040518181016001600160401b0381118282101715612c3f57fe5b604052919050565b60006001600160401b03821115612c5a57fe5b50601f01601f191660200190565b60005b83811015612c83578181015183820152602001612c6b565b838111156107995750506000910152565b6001600160a01b038116811461053e57600080fdfe5369676e61747572652070726f766964656420666f7220454f4120636f6e7472616374206372656174696f6e20697320696e76616c69642e436f6e7472616374206372656174696f6e20636f646520636f6e7461696e7320756e73616665206f70636f6465732e2044696420796f75207573652074686520726967687420636f6d70696c6572206f72207061737320616e20756e7361666520636f6e7374727563746f7220617267756d656e743f4120636f6e74726163742068617320616c7265616479206265656e206465706c6f79656420746f20746869732061646472657373436f6e7374727563746f7220617474656d7074656420746f206465706c6f7920756e736166652062797465636f64652ea2646970667358221220ba09f3066e98cffa8b50d7fb9822c62cac7bc36099454fe6dbe318573486c14d64736f6c63430007060033", + "devdoc": { + "details": "The Execution Manager (EM) is the core of our OVM implementation, and provides a sandboxed environment allowing us to execute OVM transactions deterministically on either Layer 1 or Layer 2. The EM's run() function is the first function called during the execution of any transaction on L2. For each context-dependent EVM operation the EM has a function which implements a corresponding OVM operation, which will read state from the State Manager contract. The EM relies on the Safety Checker to verify that code deployed to Layer 2 does not contain any context-dependent operations. Compiler used: solc Runtime target: EVM", + "kind": "dev", + "methods": { + "constructor": { + "params": { + "_libAddressManager": "Address of the Address Manager." + } + }, + "ovmADDRESS()": { + "returns": { + "_ADDRESS": "Active ADDRESS within the current message context." + } + }, + "ovmCALL(uint256,address,bytes)": { + "params": { + "_address": "Address of the contract to call.", + "_calldata": "Data to send along with the call.", + "_gasLimit": "Amount of gas to be passed into this call." + }, + "returns": { + "_returndata": "Data returned by the call.", + "_success": "Whether or not the call returned (rather than reverted)." + } + }, + "ovmCALLER()": { + "returns": { + "_CALLER": "Address of the CALLER within the current message context." + } + }, + "ovmCHAINID()": { + "returns": { + "_CHAINID": "Value of the chain's CHAINID within the global context." + } + }, + "ovmCREATE(bytes)": { + "params": { + "_bytecode": "Code to be used to CREATE a new contract." + }, + "returns": { + "_0": "Address of the created contract.", + "_1": "Revert data, if and only if the creation threw an exception." + } + }, + "ovmCREATE2(bytes,bytes32)": { + "params": { + "_bytecode": "Code to be used to CREATE2 a new contract.", + "_salt": "Value used to determine the contract's address." + }, + "returns": { + "_0": "Address of the created contract.", + "_1": "Revert data, if and only if the creation threw an exception." + } + }, + "ovmCREATEEOA(bytes32,uint8,bytes32,bytes32)": { + "details": "Essentially functions like ovmCREATE or ovmCREATE2, but we can bypass a lot of checks because the contract we're creating is trusted (no need to do safety checking or to handle unexpected reverts). Doesn't need to return an address because the address is assumed to be the user's actual address.", + "params": { + "_messageHash": "Hash of a message signed by some user, for verification.", + "_r": "Signature `r` parameter.", + "_s": "Signature `s` parameter.", + "_v": "Signature `v` parameter." + } + }, + "ovmDELEGATECALL(uint256,address,bytes)": { + "params": { + "_address": "Address of the contract to call.", + "_calldata": "Data to send along with the call.", + "_gasLimit": "Amount of gas to be passed into this call." + }, + "returns": { + "_returndata": "Data returned by the call.", + "_success": "Whether or not the call returned (rather than reverted)." + } + }, + "ovmEXTCODECOPY(address,uint256,uint256)": { + "params": { + "_contract": "Address of the contract to copy code from.", + "_length": "Total number of bytes to copy from the contract's code.", + "_offset": "Offset in bytes from the start of contract code to copy beyond." + }, + "returns": { + "_code": "Bytes of code copied from the requested contract." + } + }, + "ovmEXTCODEHASH(address)": { + "params": { + "_contract": "Address of the contract to query the hash of." + }, + "returns": { + "_EXTCODEHASH": "Hash of the requested contract." + } + }, + "ovmEXTCODESIZE(address)": { + "params": { + "_contract": "Address of the contract to query the size of." + }, + "returns": { + "_EXTCODESIZE": "Size of the requested contract in bytes." + } + }, + "ovmGASLIMIT()": { + "returns": { + "_GASLIMIT": "Value of the block's GASLIMIT within the transaction context." + } + }, + "ovmGETNONCE()": { + "returns": { + "_nonce": "Nonce of the current contract." + } + }, + "ovmL1QUEUEORIGIN()": { + "returns": { + "_queueOrigin": "Enum indicating the ovmL1QUEUEORIGIN within the current message context." + } + }, + "ovmL1TXORIGIN()": { + "returns": { + "_l1TxOrigin": "Address of the account which sent the tx into L2 from L1." + } + }, + "ovmNUMBER()": { + "returns": { + "_NUMBER": "Value of the NUMBER within the transaction context." + } + }, + "ovmREVERT(bytes)": { + "params": { + "_data": "Bytes data to pass along with the REVERT." + } + }, + "ovmSLOAD(bytes32)": { + "params": { + "_key": "32 byte key of the storage slot to load." + }, + "returns": { + "_value": "32 byte value of the requested storage slot." + } + }, + "ovmSSTORE(bytes32,bytes32)": { + "params": { + "_key": "32 byte key of the storage slot to set.", + "_value": "32 byte value for the storage slot." + } + }, + "ovmSTATICCALL(uint256,address,bytes)": { + "params": { + "_address": "Address of the contract to call.", + "_calldata": "Data to send along with the call.", + "_gasLimit": "Amount of gas to be passed into this call." + }, + "returns": { + "_returndata": "Data returned by the call.", + "_success": "Whether or not the call returned (rather than reverted)." + } + }, + "ovmTIMESTAMP()": { + "returns": { + "_TIMESTAMP": "Value of the TIMESTAMP within the transaction context." + } + }, + "resolve(string)": { + "params": { + "_name": "Name to resolve an address for." + }, + "returns": { + "_0": "Address associated with the given name." + } + }, + "run((uint256,uint256,uint8,address,address,uint256,bytes),address)": { + "params": { + "_ovmStateManager": "iOVM_StateManager implementation providing account state.", + "_transaction": "Transaction data to be executed." + } + }, + "safeCREATE(uint256,bytes,address)": { + "params": { + "_address": "OVM address being deployed to.", + "_creationCode": "Code to pass into CREATE for deployment.", + "_gasLimit": "Amount of gas to be passed into this creation." + } + }, + "simulateMessage((uint256,uint256,uint8,address,address,uint256,bytes),address,address)": { + "params": { + "_from": "the OVM account the simulated call should be from.", + "_transaction": "the message transaction to simulate." + } + } + }, + "title": "OVM_ExecutionManager", + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": { + "ovmADDRESS()": { + "notice": "Overrides ADDRESS." + }, + "ovmCALL(uint256,address,bytes)": { + "notice": "Overrides CALL." + }, + "ovmCALLER()": { + "notice": "Overrides CALLER." + }, + "ovmCHAINID()": { + "notice": "Overrides CHAINID." + }, + "ovmCREATE(bytes)": { + "notice": "Overrides CREATE." + }, + "ovmCREATE2(bytes,bytes32)": { + "notice": "Overrides CREATE2." + }, + "ovmCREATEEOA(bytes32,uint8,bytes32,bytes32)": { + "notice": "Creates a new EOA contract account, for account abstraction." + }, + "ovmDELEGATECALL(uint256,address,bytes)": { + "notice": "Overrides DELEGATECALL." + }, + "ovmEXTCODECOPY(address,uint256,uint256)": { + "notice": "Overrides EXTCODECOPY." + }, + "ovmEXTCODEHASH(address)": { + "notice": "Overrides EXTCODEHASH." + }, + "ovmEXTCODESIZE(address)": { + "notice": "Overrides EXTCODESIZE." + }, + "ovmGASLIMIT()": { + "notice": "Overrides GASLIMIT." + }, + "ovmGETNONCE()": { + "notice": "Retrieves the nonce of the current ovmADDRESS." + }, + "ovmINCREMENTNONCE()": { + "notice": "Bumps the nonce of the current ovmADDRESS by one." + }, + "ovmL1QUEUEORIGIN()": { + "notice": "Specifies from which source (Sequencer or Queue) this transaction originated from." + }, + "ovmL1TXORIGIN()": { + "notice": "Specifies which L1 account, if any, sent this transaction by calling enqueue()." + }, + "ovmNUMBER()": { + "notice": "Overrides NUMBER." + }, + "ovmREVERT(bytes)": { + "notice": "Overrides REVERT." + }, + "ovmSLOAD(bytes32)": { + "notice": "Overrides SLOAD." + }, + "ovmSSTORE(bytes32,bytes32)": { + "notice": "Overrides SSTORE." + }, + "ovmSTATICCALL(uint256,address,bytes)": { + "notice": "Overrides STATICCALL." + }, + "ovmTIMESTAMP()": { + "notice": "Overrides TIMESTAMP." + }, + "resolve(string)": { + "notice": "Resolves the address associated with a given name." + }, + "run((uint256,uint256,uint8,address,address,uint256,bytes),address)": { + "notice": "Starts the execution of a transaction via the OVM_ExecutionManager." + }, + "safeCREATE(uint256,bytes,address)": { + "notice": "Handles the creation-specific safety measures required for OVM contract deployment. This function sanitizes the return types for creation messages to match calls (bool, bytes), by being an external function which the EM can call, that mimics the success/fail case of the CREATE. This allows for consistent handling of both types of messages in _handleExternalMessage(). Having this step occur as a separate call frame also allows us to easily revert the contract deployment in the event that the code is unsafe." + }, + "simulateMessage((uint256,uint256,uint8,address,address,uint256,bytes),address,address)": { + "notice": "Unreachable helper function for simulating eth_calls with an OVM message context. This function will throw an exception in all cases other than when used as a custom entrypoint in L2 Geth to simulate eth_call." + } + }, + "version": 1 + }, + "storageLayout": { + "storage": [ + { + "astId": 12800, + "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", + "label": "libAddressManager", + "offset": 0, + "slot": "0", + "type": "t_contract(Lib_AddressManager)12793" + }, + { + "astId": 5184, + "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", + "label": "ovmSafetyChecker", + "offset": 0, + "slot": "1", + "type": "t_contract(iOVM_SafetyChecker)11280" + }, + { + "astId": 5186, + "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", + "label": "ovmStateManager", + "offset": 0, + "slot": "2", + "type": "t_contract(iOVM_StateManager)11512" + }, + { + "astId": 5188, + "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", + "label": "gasMeterConfig", + "offset": 0, + "slot": "3", + "type": "t_struct(GasMeterConfig)11063_storage" + }, + { + "astId": 5190, + "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", + "label": "globalContext", + "offset": 0, + "slot": "7", + "type": "t_struct(GlobalContext)11066_storage" + }, + { + "astId": 5192, + "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", + "label": "transactionContext", + "offset": 0, + "slot": "8", + "type": "t_struct(TransactionContext)11079_storage" + }, + { + "astId": 5194, + "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", + "label": "messageContext", + "offset": 0, + "slot": "14", + "type": "t_struct(MessageContext)11089_storage" + }, + { + "astId": 5196, + "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", + "label": "transactionRecord", + "offset": 0, + "slot": "16", + "type": "t_struct(TransactionRecord)11082_storage" + }, + { + "astId": 5198, + "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", + "label": "messageRecord", + "offset": 0, + "slot": "17", + "type": "t_struct(MessageRecord)11092_storage" + } + ], + "types": { + "t_address": { + "encoding": "inplace", + "label": "address", + "numberOfBytes": "20" + }, + "t_bool": { + "encoding": "inplace", + "label": "bool", + "numberOfBytes": "1" + }, + "t_contract(Lib_AddressManager)12793": { + "encoding": "inplace", + "label": "contract Lib_AddressManager", + "numberOfBytes": "20" + }, + "t_contract(iOVM_SafetyChecker)11280": { + "encoding": "inplace", + "label": "contract iOVM_SafetyChecker", + "numberOfBytes": "20" + }, + "t_contract(iOVM_StateManager)11512": { + "encoding": "inplace", + "label": "contract iOVM_StateManager", + "numberOfBytes": "20" + }, + "t_enum(QueueOrigin)12433": { + "encoding": "inplace", + "label": "enum Lib_OVMCodec.QueueOrigin", + "numberOfBytes": "1" + }, + "t_struct(GasMeterConfig)11063_storage": { + "encoding": "inplace", + "label": "struct iOVM_ExecutionManager.GasMeterConfig", + "members": [ + { + "astId": 11056, + "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", + "label": "minTransactionGasLimit", + "offset": 0, + "slot": "0", + "type": "t_uint256" + }, + { + "astId": 11058, + "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", + "label": "maxTransactionGasLimit", + "offset": 0, + "slot": "1", + "type": "t_uint256" + }, + { + "astId": 11060, + "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", + "label": "maxGasPerQueuePerEpoch", + "offset": 0, + "slot": "2", + "type": "t_uint256" + }, + { + "astId": 11062, + "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", + "label": "secondsPerEpoch", + "offset": 0, + "slot": "3", + "type": "t_uint256" + } + ], + "numberOfBytes": "128" + }, + "t_struct(GlobalContext)11066_storage": { + "encoding": "inplace", + "label": "struct iOVM_ExecutionManager.GlobalContext", + "members": [ + { + "astId": 11065, + "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", + "label": "ovmCHAINID", + "offset": 0, + "slot": "0", + "type": "t_uint256" + } + ], + "numberOfBytes": "32" + }, + "t_struct(MessageContext)11089_storage": { + "encoding": "inplace", + "label": "struct iOVM_ExecutionManager.MessageContext", + "members": [ + { + "astId": 11084, + "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", + "label": "ovmCALLER", + "offset": 0, + "slot": "0", + "type": "t_address" + }, + { + "astId": 11086, + "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", + "label": "ovmADDRESS", + "offset": 0, + "slot": "1", + "type": "t_address" + }, + { + "astId": 11088, + "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", + "label": "isStatic", + "offset": 20, + "slot": "1", + "type": "t_bool" + } + ], + "numberOfBytes": "64" + }, + "t_struct(MessageRecord)11092_storage": { + "encoding": "inplace", + "label": "struct iOVM_ExecutionManager.MessageRecord", + "members": [ + { + "astId": 11091, + "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", + "label": "nuisanceGasLeft", + "offset": 0, + "slot": "0", + "type": "t_uint256" + } + ], + "numberOfBytes": "32" + }, + "t_struct(TransactionContext)11079_storage": { + "encoding": "inplace", + "label": "struct iOVM_ExecutionManager.TransactionContext", + "members": [ + { + "astId": 11068, + "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", + "label": "ovmL1QUEUEORIGIN", + "offset": 0, + "slot": "0", + "type": "t_enum(QueueOrigin)12433" + }, + { + "astId": 11070, + "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", + "label": "ovmTIMESTAMP", + "offset": 0, + "slot": "1", + "type": "t_uint256" + }, + { + "astId": 11072, + "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", + "label": "ovmNUMBER", + "offset": 0, + "slot": "2", + "type": "t_uint256" + }, + { + "astId": 11074, + "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", + "label": "ovmGASLIMIT", + "offset": 0, + "slot": "3", + "type": "t_uint256" + }, + { + "astId": 11076, + "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", + "label": "ovmTXGASLIMIT", + "offset": 0, + "slot": "4", + "type": "t_uint256" + }, + { + "astId": 11078, + "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", + "label": "ovmL1TXORIGIN", + "offset": 0, + "slot": "5", + "type": "t_address" + } + ], + "numberOfBytes": "192" + }, + "t_struct(TransactionRecord)11082_storage": { + "encoding": "inplace", + "label": "struct iOVM_ExecutionManager.TransactionRecord", + "members": [ + { + "astId": 11081, + "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", + "label": "ovmGasRefund", + "offset": 0, + "slot": "0", + "type": "t_uint256" + } + ], + "numberOfBytes": "32" + }, + "t_uint256": { + "encoding": "inplace", + "label": "uint256", + "numberOfBytes": "32" + } + } + } +} \ No newline at end of file diff --git a/packages/contracts/deployments/kovan-v3/OVM_FraudVerifier.json b/packages/contracts/deployments/kovan-v3/OVM_FraudVerifier.json new file mode 100644 index 0000000000000..dafeec721864e --- /dev/null +++ b/packages/contracts/deployments/kovan-v3/OVM_FraudVerifier.json @@ -0,0 +1,576 @@ +{ + "address": "0x4B2F74938Ddb8742C33b46aD1a402c85e9dABC44", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_libAddressManager", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes32", + "name": "_preStateRoot", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_preStateRootIndex", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "_transactionHash", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "address", + "name": "_who", + "type": "address" + } + ], + "name": "FraudProofFinalized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes32", + "name": "_preStateRoot", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_preStateRootIndex", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "_transactionHash", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "address", + "name": "_who", + "type": "address" + } + ], + "name": "FraudProofInitialized", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_preStateRoot", + "type": "bytes32" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "batchIndex", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "batchRoot", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "batchSize", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "prevTotalElements", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "extraData", + "type": "bytes" + } + ], + "internalType": "struct Lib_OVMCodec.ChainBatchHeader", + "name": "_preStateRootBatchHeader", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + }, + { + "internalType": "bytes32[]", + "name": "siblings", + "type": "bytes32[]" + } + ], + "internalType": "struct Lib_OVMCodec.ChainInclusionProof", + "name": "_preStateRootProof", + "type": "tuple" + }, + { + "internalType": "bytes32", + "name": "_txHash", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "_postStateRoot", + "type": "bytes32" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "batchIndex", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "batchRoot", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "batchSize", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "prevTotalElements", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "extraData", + "type": "bytes" + } + ], + "internalType": "struct Lib_OVMCodec.ChainBatchHeader", + "name": "_postStateRootBatchHeader", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + }, + { + "internalType": "bytes32[]", + "name": "siblings", + "type": "bytes32[]" + } + ], + "internalType": "struct Lib_OVMCodec.ChainInclusionProof", + "name": "_postStateRootProof", + "type": "tuple" + } + ], + "name": "finalizeFraudVerification", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_preStateRoot", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "_txHash", + "type": "bytes32" + } + ], + "name": "getStateTransitioner", + "outputs": [ + { + "internalType": "contract iOVM_StateTransitioner", + "name": "_transitioner", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_preStateRoot", + "type": "bytes32" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "batchIndex", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "batchRoot", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "batchSize", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "prevTotalElements", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "extraData", + "type": "bytes" + } + ], + "internalType": "struct Lib_OVMCodec.ChainBatchHeader", + "name": "_preStateRootBatchHeader", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + }, + { + "internalType": "bytes32[]", + "name": "siblings", + "type": "bytes32[]" + } + ], + "internalType": "struct Lib_OVMCodec.ChainInclusionProof", + "name": "_preStateRootProof", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "timestamp", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "blockNumber", + "type": "uint256" + }, + { + "internalType": "enum Lib_OVMCodec.QueueOrigin", + "name": "l1QueueOrigin", + "type": "uint8" + }, + { + "internalType": "address", + "name": "l1TxOrigin", + "type": "address" + }, + { + "internalType": "address", + "name": "entrypoint", + "type": "address" + }, + { + "internalType": "uint256", + "name": "gasLimit", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "internalType": "struct Lib_OVMCodec.Transaction", + "name": "_transaction", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "bool", + "name": "isSequenced", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "queueIndex", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "timestamp", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "blockNumber", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "txData", + "type": "bytes" + } + ], + "internalType": "struct Lib_OVMCodec.TransactionChainElement", + "name": "_txChainElement", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "batchIndex", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "batchRoot", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "batchSize", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "prevTotalElements", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "extraData", + "type": "bytes" + } + ], + "internalType": "struct Lib_OVMCodec.ChainBatchHeader", + "name": "_transactionBatchHeader", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + }, + { + "internalType": "bytes32[]", + "name": "siblings", + "type": "bytes32[]" + } + ], + "internalType": "struct Lib_OVMCodec.ChainInclusionProof", + "name": "_transactionProof", + "type": "tuple" + } + ], + "name": "initializeFraudVerification", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "libAddressManager", + "outputs": [ + { + "internalType": "contract Lib_AddressManager", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "_name", + "type": "string" + } + ], + "name": "resolve", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "transactionHash": "0xb8082579bad0f835bc920bd0a9914c2579d22b880631c0d48e905bc30c4dc913", + "receipt": { + "to": null, + "from": "0x18394B52d3Cb931dfA76F63251919D051953413d", + "contractAddress": "0x4B2F74938Ddb8742C33b46aD1a402c85e9dABC44", + "transactionIndex": 2, + "gasUsed": "1385698", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0x064d3a146603fa300614898ab7c1d631f1f7bdda0144fa855991c6da4ce5103b", + "transactionHash": "0xb8082579bad0f835bc920bd0a9914c2579d22b880631c0d48e905bc30c4dc913", + "logs": [], + "blockNumber": 24572850, + "cumulativeGasUsed": "1633498", + "status": 1, + "byzantium": true + }, + "args": [ + "0xd56F695e73286ac252A37593DD4E7c14270eC1Df" + ], + "solcInputHash": "5ee8e508e2c54cb5ac6783b4855b1558", + "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"_preStateRoot\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_preStateRootIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"_transactionHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_who\",\"type\":\"address\"}],\"name\":\"FraudProofFinalized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"_preStateRoot\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_preStateRootIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"_transactionHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_who\",\"type\":\"address\"}],\"name\":\"FraudProofInitialized\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_preStateRoot\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"_preStateRootBatchHeader\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"siblings\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct Lib_OVMCodec.ChainInclusionProof\",\"name\":\"_preStateRootProof\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"_txHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"_postStateRoot\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"_postStateRootBatchHeader\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"siblings\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct Lib_OVMCodec.ChainInclusionProof\",\"name\":\"_postStateRootProof\",\"type\":\"tuple\"}],\"name\":\"finalizeFraudVerification\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_preStateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"_txHash\",\"type\":\"bytes32\"}],\"name\":\"getStateTransitioner\",\"outputs\":[{\"internalType\":\"contract iOVM_StateTransitioner\",\"name\":\"_transitioner\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_preStateRoot\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"_preStateRootBatchHeader\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"siblings\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct Lib_OVMCodec.ChainInclusionProof\",\"name\":\"_preStateRootProof\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"enum Lib_OVMCodec.QueueOrigin\",\"name\":\"l1QueueOrigin\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"l1TxOrigin\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"entrypoint\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.Transaction\",\"name\":\"_transaction\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isSequenced\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"queueIndex\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"txData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.TransactionChainElement\",\"name\":\"_txChainElement\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"_transactionBatchHeader\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"siblings\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct Lib_OVMCodec.ChainInclusionProof\",\"name\":\"_transactionProof\",\"type\":\"tuple\"}],\"name\":\"initializeFraudVerification\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The Fraud Verifier contract coordinates the entire fraud proof verification process. If the fraud proof was successful it prunes any state batches from State Commitment Chain which were published after the fraudulent state root. Compiler used: solc Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\"}},\"finalizeFraudVerification(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes32,bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))\":{\"params\":{\"_postStateRoot\":\"State root after the fraudulent transaction.\",\"_postStateRootBatchHeader\":\"Batch header for the provided post-state root.\",\"_postStateRootProof\":\"Inclusion proof for the provided post-state root.\",\"_preStateRoot\":\"State root before the fraudulent transaction.\",\"_preStateRootBatchHeader\":\"Batch header for the provided pre-state root.\",\"_preStateRootProof\":\"Inclusion proof for the provided pre-state root.\",\"_txHash\":\"The transaction for the state root\"}},\"getStateTransitioner(bytes32,bytes32)\":{\"params\":{\"_preStateRoot\":\"State root to query a transitioner for.\"},\"returns\":{\"_transitioner\":\"Corresponding state transitioner contract.\"}},\"initializeFraudVerification(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),(uint256,uint256,uint8,address,address,uint256,bytes),(bool,uint256,uint256,uint256,bytes),(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))\":{\"params\":{\"_preStateRoot\":\"State root before the fraudulent transaction.\",\"_preStateRootBatchHeader\":\"Batch header for the provided pre-state root.\",\"_preStateRootProof\":\"Inclusion proof for the provided pre-state root.\",\"_transaction\":\"OVM transaction claimed to be fraudulent.\",\"_transactionBatchHeader\":\"Batch header for the provided transaction.\",\"_transactionProof\":\"Inclusion proof for the provided transaction.\",\"_txChainElement\":\"OVM transaction chain element.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}}},\"title\":\"OVM_FraudVerifier\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"finalizeFraudVerification(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes32,bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))\":{\"notice\":\"Finalizes the fraud verification process.\"},\"getStateTransitioner(bytes32,bytes32)\":{\"notice\":\"Retrieves the state transitioner for a given root.\"},\"initializeFraudVerification(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),(uint256,uint256,uint8,address,address,uint256,bytes),(bool,uint256,uint256,uint256,bytes),(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))\":{\"notice\":\"Begins the fraud verification process.\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/OVM/verification/OVM_FraudVerifier.sol\":\"OVM_FraudVerifier\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor () internal {\\n address msgSender = _msgSender();\\n _owner = msgSender;\\n emit OwnershipTransferred(address(0), msgSender);\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n emit OwnershipTransferred(_owner, address(0));\\n _owner = address(0);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n emit OwnershipTransferred(_owner, newOwner);\\n _owner = newOwner;\\n }\\n}\\n\",\"keccak256\":\"0x15e2d5bd4c28a88548074c54d220e8086f638a71ed07e6b3ba5a70066fcf458d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with GSN meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address payable) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes memory) {\\n this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x8d3cb350f04ff49cfb10aef08d87f19dcbaecc8027b0bed12f3275cd12f38cf0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/verification/Abs_FraudContributor.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\nimport { iOVM_BondManager } from \\\"../../iOVM/verification/iOVM_BondManager.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/// Minimal contract to be inherited by contracts consumed by users that provide\\n/// data for fraud proofs\\nabstract contract Abs_FraudContributor is Lib_AddressResolver {\\n /// Decorate your functions with this modifier to store how much total gas was\\n /// consumed by the sender, to reward users fairly\\n modifier contributesToFraudProof(bytes32 preStateRoot, bytes32 txHash) {\\n uint256 startGas = gasleft();\\n _;\\n uint256 gasSpent = startGas - gasleft();\\n iOVM_BondManager(resolve('OVM_BondManager')).recordGasSpent(preStateRoot, txHash, msg.sender, gasSpent);\\n }\\n}\\n\",\"keccak256\":\"0x6c27d089a297103cb93b30f7649ab68691cc6b948c315f1037e5de1fe9bf5903\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/verification/OVM_FraudVerifier.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_FraudVerifier } from \\\"../../iOVM/verification/iOVM_FraudVerifier.sol\\\";\\nimport { iOVM_StateTransitioner } from \\\"../../iOVM/verification/iOVM_StateTransitioner.sol\\\";\\nimport { iOVM_StateTransitionerFactory } from \\\"../../iOVM/verification/iOVM_StateTransitionerFactory.sol\\\";\\nimport { iOVM_BondManager } from \\\"../../iOVM/verification/iOVM_BondManager.sol\\\";\\nimport { iOVM_StateCommitmentChain } from \\\"../../iOVM/chain/iOVM_StateCommitmentChain.sol\\\";\\nimport { iOVM_CanonicalTransactionChain } from \\\"../../iOVM/chain/iOVM_CanonicalTransactionChain.sol\\\";\\n\\n/* Contract Imports */\\nimport { Abs_FraudContributor } from \\\"./Abs_FraudContributor.sol\\\";\\n\\n\\n\\n/**\\n * @title OVM_FraudVerifier\\n * @dev The Fraud Verifier contract coordinates the entire fraud proof verification process.\\n * If the fraud proof was successful it prunes any state batches from State Commitment Chain\\n * which were published after the fraudulent state root.\\n *\\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract OVM_FraudVerifier is Lib_AddressResolver, Abs_FraudContributor, iOVM_FraudVerifier {\\n\\n /*******************************************\\n * Contract Variables: Internal Accounting *\\n *******************************************/\\n\\n mapping (bytes32 => iOVM_StateTransitioner) internal transitioners;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n */\\n constructor(\\n address _libAddressManager\\n )\\n Lib_AddressResolver(_libAddressManager)\\n {}\\n\\n\\n /***************************************\\n * Public Functions: Transition Status *\\n ***************************************/\\n\\n /**\\n * Retrieves the state transitioner for a given root.\\n * @param _preStateRoot State root to query a transitioner for.\\n * @return _transitioner Corresponding state transitioner contract.\\n */\\n function getStateTransitioner(\\n bytes32 _preStateRoot,\\n bytes32 _txHash\\n )\\n override\\n public\\n view\\n returns (\\n iOVM_StateTransitioner _transitioner\\n )\\n {\\n return transitioners[keccak256(abi.encodePacked(_preStateRoot, _txHash))];\\n }\\n\\n\\n /****************************************\\n * Public Functions: Fraud Verification *\\n ****************************************/\\n\\n /**\\n * Begins the fraud verification process.\\n * @param _preStateRoot State root before the fraudulent transaction.\\n * @param _preStateRootBatchHeader Batch header for the provided pre-state root.\\n * @param _preStateRootProof Inclusion proof for the provided pre-state root.\\n * @param _transaction OVM transaction claimed to be fraudulent.\\n * @param _txChainElement OVM transaction chain element.\\n * @param _transactionBatchHeader Batch header for the provided transaction.\\n * @param _transactionProof Inclusion proof for the provided transaction.\\n */\\n function initializeFraudVerification(\\n bytes32 _preStateRoot,\\n Lib_OVMCodec.ChainBatchHeader memory _preStateRootBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _preStateRootProof,\\n Lib_OVMCodec.Transaction memory _transaction,\\n Lib_OVMCodec.TransactionChainElement memory _txChainElement,\\n Lib_OVMCodec.ChainBatchHeader memory _transactionBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _transactionProof\\n )\\n override\\n public\\n contributesToFraudProof(_preStateRoot, Lib_OVMCodec.hashTransaction(_transaction))\\n {\\n bytes32 _txHash = Lib_OVMCodec.hashTransaction(_transaction);\\n\\n if (_hasStateTransitioner(_preStateRoot, _txHash)) {\\n return;\\n }\\n\\n iOVM_StateCommitmentChain ovmStateCommitmentChain = iOVM_StateCommitmentChain(resolve(\\\"OVM_StateCommitmentChain\\\"));\\n iOVM_CanonicalTransactionChain ovmCanonicalTransactionChain = iOVM_CanonicalTransactionChain(resolve(\\\"OVM_CanonicalTransactionChain\\\"));\\n\\n require(\\n ovmStateCommitmentChain.verifyStateCommitment(\\n _preStateRoot,\\n _preStateRootBatchHeader,\\n _preStateRootProof\\n ),\\n \\\"Invalid pre-state root inclusion proof.\\\"\\n );\\n\\n require(\\n ovmCanonicalTransactionChain.verifyTransaction(\\n _transaction,\\n _txChainElement,\\n _transactionBatchHeader,\\n _transactionProof\\n ),\\n \\\"Invalid transaction inclusion proof.\\\"\\n );\\n\\n require (\\n _preStateRootBatchHeader.prevTotalElements + _preStateRootProof.index + 1 == _transactionBatchHeader.prevTotalElements + _transactionProof.index,\\n \\\"Pre-state root global index must equal to the transaction root global index.\\\"\\n );\\n\\n _deployTransitioner(_preStateRoot, _txHash, _preStateRootProof.index);\\n\\n emit FraudProofInitialized(\\n _preStateRoot,\\n _preStateRootProof.index,\\n _txHash,\\n msg.sender\\n );\\n }\\n\\n /**\\n * Finalizes the fraud verification process.\\n * @param _preStateRoot State root before the fraudulent transaction.\\n * @param _preStateRootBatchHeader Batch header for the provided pre-state root.\\n * @param _preStateRootProof Inclusion proof for the provided pre-state root.\\n * @param _txHash The transaction for the state root\\n * @param _postStateRoot State root after the fraudulent transaction.\\n * @param _postStateRootBatchHeader Batch header for the provided post-state root.\\n * @param _postStateRootProof Inclusion proof for the provided post-state root.\\n */\\n function finalizeFraudVerification(\\n bytes32 _preStateRoot,\\n Lib_OVMCodec.ChainBatchHeader memory _preStateRootBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _preStateRootProof,\\n bytes32 _txHash,\\n bytes32 _postStateRoot,\\n Lib_OVMCodec.ChainBatchHeader memory _postStateRootBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _postStateRootProof\\n )\\n override\\n public\\n contributesToFraudProof(_preStateRoot, _txHash)\\n {\\n iOVM_StateTransitioner transitioner = getStateTransitioner(_preStateRoot, _txHash);\\n iOVM_StateCommitmentChain ovmStateCommitmentChain = iOVM_StateCommitmentChain(resolve(\\\"OVM_StateCommitmentChain\\\"));\\n\\n require(\\n transitioner.isComplete() == true,\\n \\\"State transition process must be completed prior to finalization.\\\"\\n );\\n\\n require (\\n _postStateRootBatchHeader.prevTotalElements + _postStateRootProof.index == _preStateRootBatchHeader.prevTotalElements + _preStateRootProof.index + 1,\\n \\\"Post-state root global index must equal to the pre state root global index plus one.\\\"\\n );\\n\\n require(\\n ovmStateCommitmentChain.verifyStateCommitment(\\n _preStateRoot,\\n _preStateRootBatchHeader,\\n _preStateRootProof\\n ),\\n \\\"Invalid pre-state root inclusion proof.\\\"\\n );\\n\\n require(\\n ovmStateCommitmentChain.verifyStateCommitment(\\n _postStateRoot,\\n _postStateRootBatchHeader,\\n _postStateRootProof\\n ),\\n \\\"Invalid post-state root inclusion proof.\\\"\\n );\\n\\n // If the post state root did not match, then there was fraud and we should delete the batch\\n require(\\n _postStateRoot != transitioner.getPostStateRoot(),\\n \\\"State transition has not been proven fraudulent.\\\"\\n );\\n\\n _cancelStateTransition(_postStateRootBatchHeader, _preStateRoot);\\n\\n // TEMPORARY: Remove the transitioner; for minnet.\\n transitioners[keccak256(abi.encodePacked(_preStateRoot, _txHash))] = iOVM_StateTransitioner(0x0000000000000000000000000000000000000000);\\n\\n emit FraudProofFinalized(\\n _preStateRoot,\\n _preStateRootProof.index,\\n _txHash,\\n msg.sender\\n );\\n }\\n\\n\\n /************************************\\n * Internal Functions: Verification *\\n ************************************/\\n\\n /**\\n * Checks whether a transitioner already exists for a given pre-state root.\\n * @param _preStateRoot Pre-state root to check.\\n * @return _exists Whether or not we already have a transitioner for the root.\\n */\\n function _hasStateTransitioner(\\n bytes32 _preStateRoot,\\n bytes32 _txHash\\n )\\n internal\\n view\\n returns (\\n bool _exists\\n )\\n {\\n return address(getStateTransitioner(_preStateRoot, _txHash)) != address(0);\\n }\\n\\n /**\\n * Deploys a new state transitioner.\\n * @param _preStateRoot Pre-state root to initialize the transitioner with.\\n * @param _txHash Hash of the transaction this transitioner will execute.\\n * @param _stateTransitionIndex Index of the transaction in the chain.\\n */\\n function _deployTransitioner(\\n bytes32 _preStateRoot,\\n bytes32 _txHash,\\n uint256 _stateTransitionIndex\\n )\\n internal\\n {\\n transitioners[keccak256(abi.encodePacked(_preStateRoot, _txHash))] = iOVM_StateTransitionerFactory(\\n resolve(\\\"OVM_StateTransitionerFactory\\\")\\n ).create(\\n address(libAddressManager),\\n _stateTransitionIndex,\\n _preStateRoot,\\n _txHash\\n );\\n }\\n\\n /**\\n * Removes a state transition from the state commitment chain.\\n * @param _postStateRootBatchHeader Header for the post-state root.\\n * @param _preStateRoot Pre-state root hash.\\n */\\n function _cancelStateTransition(\\n Lib_OVMCodec.ChainBatchHeader memory _postStateRootBatchHeader,\\n bytes32 _preStateRoot\\n )\\n internal\\n {\\n iOVM_StateCommitmentChain ovmStateCommitmentChain = iOVM_StateCommitmentChain(resolve(\\\"OVM_StateCommitmentChain\\\"));\\n iOVM_BondManager ovmBondManager = iOVM_BondManager(resolve(\\\"OVM_BondManager\\\"));\\n\\n // Delete the state batch.\\n ovmStateCommitmentChain.deleteStateBatch(\\n _postStateRootBatchHeader\\n );\\n\\n // Get the timestamp and publisher for that block.\\n (uint256 timestamp, address publisher) = abi.decode(_postStateRootBatchHeader.extraData, (uint256, address));\\n\\n // Slash the bonds at the bond manager.\\n ovmBondManager.finalize(\\n _preStateRoot,\\n publisher,\\n timestamp\\n );\\n }\\n}\\n\",\"keccak256\":\"0x879cef57019254ad958a75db64f0b58eb0a6fcf74f386ed958f75384b860dd35\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_CanonicalTransactionChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_ChainStorageContainer } from \\\"./iOVM_ChainStorageContainer.sol\\\";\\n\\n/**\\n * @title iOVM_CanonicalTransactionChain\\n */\\ninterface iOVM_CanonicalTransactionChain {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event TransactionEnqueued(\\n address _l1TxOrigin,\\n address _target,\\n uint256 _gasLimit,\\n bytes _data,\\n uint256 _queueIndex,\\n uint256 _timestamp\\n );\\n\\n event QueueBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event SequencerBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event TransactionBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct BatchContext {\\n uint256 numSequencedTransactions;\\n uint256 numSubsequentQueueTransactions;\\n uint256 timestamp;\\n uint256 blockNumber;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n\\n /**\\n * Accesses the batch storage container.\\n * @return Reference to the batch storage container.\\n */\\n function batches()\\n external\\n view\\n returns (\\n iOVM_ChainStorageContainer\\n );\\n\\n /**\\n * Accesses the queue storage container.\\n * @return Reference to the queue storage container.\\n */\\n function queue()\\n external\\n view\\n returns (\\n iOVM_ChainStorageContainer\\n );\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements()\\n external\\n view\\n returns (\\n uint256 _totalElements\\n );\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches()\\n external\\n view\\n returns (\\n uint256 _totalBatches\\n );\\n\\n /**\\n * Returns the index of the next element to be enqueued.\\n * @return Index for the next queue element.\\n */\\n function getNextQueueIndex()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Gets the queue element at a particular index.\\n * @param _index Index of the queue element to access.\\n * @return _element Queue element at the given index.\\n */\\n function getQueueElement(\\n uint256 _index\\n )\\n external\\n view\\n returns (\\n Lib_OVMCodec.QueueElement memory _element\\n );\\n\\n /**\\n * Returns the timestamp of the last transaction.\\n * @return Timestamp for the last transaction.\\n */\\n function getLastTimestamp()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Returns the blocknumber of the last transaction.\\n * @return Blocknumber for the last transaction.\\n */\\n function getLastBlockNumber()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Get the number of queue elements which have not yet been included.\\n * @return Number of pending queue elements.\\n */\\n function getNumPendingQueueElements()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Retrieves the length of the queue, including\\n * both pending and canonical transactions.\\n * @return Length of the queue.\\n */\\n function getQueueLength()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n\\n /**\\n * Adds a transaction to the queue.\\n * @param _target Target contract to send the transaction to.\\n * @param _gasLimit Gas limit for the given transaction.\\n * @param _data Transaction data.\\n */\\n function enqueue(\\n address _target,\\n uint256 _gasLimit,\\n bytes memory _data\\n )\\n external;\\n\\n /**\\n * Appends a given number of queued transactions as a single batch.\\n * @param _numQueuedTransactions Number of transactions to append.\\n */\\n function appendQueueBatch(\\n uint256 _numQueuedTransactions\\n )\\n external;\\n\\n /**\\n * Allows the sequencer to append a batch of transactions.\\n * @dev This function uses a custom encoding scheme for efficiency reasons.\\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\\n * .param _contexts Array of batch contexts.\\n * .param _transactionDataFields Array of raw transaction data.\\n */\\n function appendSequencerBatch(\\n // uint40 _shouldStartAtElement,\\n // uint24 _totalElementsToAppend,\\n // BatchContext[] _contexts,\\n // bytes[] _transactionDataFields\\n )\\n external;\\n\\n /**\\n * Verifies whether a transaction is included in the chain.\\n * @param _transaction Transaction to verify.\\n * @param _txChainElement Transaction chain element corresponding to the transaction.\\n * @param _batchHeader Header of the batch the transaction was included in.\\n * @param _inclusionProof Inclusion proof for the provided transaction chain element.\\n * @return True if the transaction exists in the CTC, false if not.\\n */\\n function verifyTransaction(\\n Lib_OVMCodec.Transaction memory _transaction,\\n Lib_OVMCodec.TransactionChainElement memory _txChainElement,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _inclusionProof\\n )\\n external\\n view\\n returns (\\n bool\\n );\\n}\\n\",\"keccak256\":\"0xb5e55488a1982841c07cdf5ff475da4789596f111dd48f01b1918ee4c775cf3a\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_ChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title iOVM_ChainStorageContainer\\n */\\ninterface iOVM_ChainStorageContainer {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata()\\n external\\n view\\n returns (\\n bytes27\\n );\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length()\\n external\\n view\\n returns (\\n uint256\\n );\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(\\n bytes32 _object\\n )\\n external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(\\n bytes32 _object,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(\\n uint256 _index\\n )\\n external\\n view\\n returns (\\n bytes32\\n );\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index\\n )\\n external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Marks an index as overwritable, meaing the underlying buffer can start to write values over\\n * any objects before and including the given index.\\n */\\n function setNextOverwritableIndex(\\n uint256 _index\\n )\\n external;\\n}\\n\",\"keccak256\":\"0x2d7973a0ad84c23ec62624d3f1e3aeb198cc72686ff1e6cfa17155556b320c94\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_StateCommitmentChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title iOVM_StateCommitmentChain\\n */\\ninterface iOVM_StateCommitmentChain {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event StateBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n event StateBatchDeleted(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot\\n );\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements()\\n external\\n view\\n returns (\\n uint256 _totalElements\\n );\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches()\\n external\\n view\\n returns (\\n uint256 _totalBatches\\n );\\n\\n /**\\n * Retrieves the timestamp of the last batch submitted by the sequencer.\\n * @return _lastSequencerTimestamp Last sequencer batch timestamp.\\n */\\n function getLastSequencerTimestamp()\\n external\\n view\\n returns (\\n uint256 _lastSequencerTimestamp\\n );\\n\\n /**\\n * Appends a batch of state roots to the chain.\\n * @param _batch Batch of state roots.\\n * @param _shouldStartAtElement Index of the element at which this batch should start.\\n */\\n function appendStateBatch(\\n bytes32[] calldata _batch,\\n uint256 _shouldStartAtElement\\n )\\n external;\\n\\n /**\\n * Deletes all state roots after (and including) a given batch.\\n * @param _batchHeader Header of the batch to start deleting from.\\n */\\n function deleteStateBatch(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n external;\\n\\n /**\\n * Verifies a batch inclusion proof.\\n * @param _element Hash of the element to verify a proof for.\\n * @param _batchHeader Header of the batch in which the element was included.\\n * @param _proof Merkle inclusion proof for the element.\\n */\\n function verifyStateCommitment(\\n bytes32 _element,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _proof\\n )\\n external\\n view\\n returns (\\n bool _verified\\n );\\n\\n /**\\n * Checks whether a given batch is still inside its fraud proof window.\\n * @param _batchHeader Header of the batch to check.\\n * @return _inside Whether or not the batch is inside the fraud proof window.\\n */\\n function insideFraudProofWindow(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n external\\n view\\n returns (\\n bool _inside\\n );\\n}\\n\",\"keccak256\":\"0x6646d6ff392b81aab52a7a277e91540819464751de0af5afd1962094b2e92448\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/verification/iOVM_BondManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\ninterface ERC20 {\\n function transfer(address, uint256) external returns (bool);\\n function transferFrom(address, address, uint256) external returns (bool);\\n}\\n\\n/// All the errors which may be encountered on the bond manager\\nlibrary Errors {\\n string constant ERC20_ERR = \\\"BondManager: Could not post bond\\\";\\n string constant ALREADY_FINALIZED = \\\"BondManager: Fraud proof for this pre-state root has already been finalized\\\";\\n string constant SLASHED = \\\"BondManager: Cannot finalize withdrawal, you probably got slashed\\\";\\n string constant WRONG_STATE = \\\"BondManager: Wrong bond state for proposer\\\";\\n string constant CANNOT_CLAIM = \\\"BondManager: Cannot claim yet. Dispute must be finalized first\\\";\\n\\n string constant WITHDRAWAL_PENDING = \\\"BondManager: Withdrawal already pending\\\";\\n string constant TOO_EARLY = \\\"BondManager: Too early to finalize your withdrawal\\\";\\n\\n string constant ONLY_TRANSITIONER = \\\"BondManager: Only the transitioner for this pre-state root may call this function\\\";\\n string constant ONLY_FRAUD_VERIFIER = \\\"BondManager: Only the fraud verifier may call this function\\\";\\n string constant ONLY_STATE_COMMITMENT_CHAIN = \\\"BondManager: Only the state commitment chain may call this function\\\";\\n string constant WAIT_FOR_DISPUTES = \\\"BondManager: Wait for other potential disputes\\\";\\n}\\n\\n/**\\n * @title iOVM_BondManager\\n */\\ninterface iOVM_BondManager {\\n\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n /// The lifecycle of a proposer's bond\\n enum State {\\n // Before depositing or after getting slashed, a user is uncollateralized\\n NOT_COLLATERALIZED,\\n // After depositing, a user is collateralized\\n COLLATERALIZED,\\n // After a user has initiated a withdrawal\\n WITHDRAWING\\n }\\n\\n /// A bond posted by a proposer\\n struct Bond {\\n // The user's state\\n State state;\\n // The timestamp at which a proposer issued their withdrawal request\\n uint32 withdrawalTimestamp;\\n // The time when the first disputed was initiated for this bond\\n uint256 firstDisputeAt;\\n // The earliest observed state root for this bond which has had fraud\\n bytes32 earliestDisputedStateRoot;\\n // The state root's timestamp\\n uint256 earliestTimestamp;\\n }\\n\\n // Per pre-state root, store the number of state provisions that were made\\n // and how many of these calls were made by each user. Payouts will then be\\n // claimed by users proportionally for that dispute.\\n struct Rewards {\\n // Flag to check if rewards for a fraud proof are claimable\\n bool canClaim;\\n // Total number of `recordGasSpent` calls made\\n uint256 total;\\n // The gas spent by each user to provide witness data. The sum of all\\n // values inside this map MUST be equal to the value of `total`\\n mapping(address => uint256) gasSpent;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function recordGasSpent(\\n bytes32 _preStateRoot,\\n bytes32 _txHash,\\n address _who,\\n uint256 _gasSpent\\n ) external;\\n\\n function finalize(\\n bytes32 _preStateRoot,\\n address _publisher,\\n uint256 _timestamp\\n ) external;\\n\\n function deposit() external;\\n\\n function startWithdrawal() external;\\n\\n function finalizeWithdrawal() external;\\n\\n function claim(\\n address _who\\n ) external;\\n\\n function isCollateralized(\\n address _who\\n ) external view returns (bool);\\n\\n function getGasSpent(\\n bytes32 _preStateRoot,\\n address _who\\n ) external view returns (uint256);\\n}\\n\",\"keccak256\":\"0x3c2a8a399487857158649db1896749d86e39cba545a8aeb2e2bb0f3bdfa7a5b1\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/verification/iOVM_FraudVerifier.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_StateTransitioner } from \\\"./iOVM_StateTransitioner.sol\\\";\\n\\n/**\\n * @title iOVM_FraudVerifier\\n */\\ninterface iOVM_FraudVerifier {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event FraudProofInitialized(\\n bytes32 _preStateRoot,\\n uint256 _preStateRootIndex,\\n bytes32 _transactionHash,\\n address _who\\n );\\n\\n event FraudProofFinalized(\\n bytes32 _preStateRoot,\\n uint256 _preStateRootIndex,\\n bytes32 _transactionHash,\\n address _who\\n );\\n\\n\\n /***************************************\\n * Public Functions: Transition Status *\\n ***************************************/\\n\\n function getStateTransitioner(bytes32 _preStateRoot, bytes32 _txHash) external view returns (iOVM_StateTransitioner _transitioner);\\n\\n\\n /****************************************\\n * Public Functions: Fraud Verification *\\n ****************************************/\\n\\n function initializeFraudVerification(\\n bytes32 _preStateRoot,\\n Lib_OVMCodec.ChainBatchHeader calldata _preStateRootBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof calldata _preStateRootProof,\\n Lib_OVMCodec.Transaction calldata _transaction,\\n Lib_OVMCodec.TransactionChainElement calldata _txChainElement,\\n Lib_OVMCodec.ChainBatchHeader calldata _transactionBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof calldata _transactionProof\\n ) external;\\n\\n function finalizeFraudVerification(\\n bytes32 _preStateRoot,\\n Lib_OVMCodec.ChainBatchHeader calldata _preStateRootBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof calldata _preStateRootProof,\\n bytes32 _txHash,\\n bytes32 _postStateRoot,\\n Lib_OVMCodec.ChainBatchHeader calldata _postStateRootBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof calldata _postStateRootProof\\n ) external;\\n}\\n\",\"keccak256\":\"0x5efd7bb18164bbd3e9d58379e8203fbf2a7ee802b1a48dff3ceaaec1523b1751\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/verification/iOVM_StateTransitioner.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title iOVM_StateTransitioner\\n */\\ninterface iOVM_StateTransitioner {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AccountCommitted(\\n address _address\\n );\\n\\n event ContractStorageCommitted(\\n address _address,\\n bytes32 _key\\n );\\n\\n\\n /**********************************\\n * Public Functions: State Access *\\n **********************************/\\n\\n function getPreStateRoot() external view returns (bytes32 _preStateRoot);\\n function getPostStateRoot() external view returns (bytes32 _postStateRoot);\\n function isComplete() external view returns (bool _complete);\\n\\n\\n /***********************************\\n * Public Functions: Pre-Execution *\\n ***********************************/\\n\\n function proveContractState(\\n address _ovmContractAddress,\\n address _ethContractAddress,\\n bytes calldata _stateTrieWitness\\n ) external;\\n\\n function proveStorageSlot(\\n address _ovmContractAddress,\\n bytes32 _key,\\n bytes calldata _storageTrieWitness\\n ) external;\\n\\n\\n /*******************************\\n * Public Functions: Execution *\\n *******************************/\\n\\n function applyTransaction(\\n Lib_OVMCodec.Transaction calldata _transaction\\n ) external;\\n\\n\\n /************************************\\n * Public Functions: Post-Execution *\\n ************************************/\\n\\n function commitContractState(\\n address _ovmContractAddress,\\n bytes calldata _stateTrieWitness\\n ) external;\\n\\n function commitStorageSlot(\\n address _ovmContractAddress,\\n bytes32 _key,\\n bytes calldata _storageTrieWitness\\n ) external;\\n\\n\\n /**********************************\\n * Public Functions: Finalization *\\n **********************************/\\n\\n function completeTransition() external;\\n}\\n\",\"keccak256\":\"0x3d044ac0a3bb6ad3d529f904b3191117511f9c379678ca03010e1ebdfcb5c34b\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/verification/iOVM_StateTransitionerFactory.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Contract Imports */\\nimport { iOVM_StateTransitioner } from \\\"./iOVM_StateTransitioner.sol\\\";\\n\\n/**\\n * @title iOVM_StateTransitionerFactory\\n */\\ninterface iOVM_StateTransitionerFactory {\\n\\n /***************************************\\n * Public Functions: Contract Creation *\\n ***************************************/\\n\\n function create(\\n address _proxyManager,\\n uint256 _stateTransitionIndex,\\n bytes32 _preStateRoot,\\n bytes32 _transactionHash\\n )\\n external\\n returns (\\n iOVM_StateTransitioner _ovmStateTransitioner\\n );\\n}\\n\",\"keccak256\":\"0x60a0f0c104e4c0c7863268a93005762e8146d393f9cfddfdd6a2d6585c5911fc\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/codec/Lib_OVMCodec.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../utils/Lib_Bytes32Utils.sol\\\";\\n\\n/**\\n * @title Lib_OVMCodec\\n */\\nlibrary Lib_OVMCodec {\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum QueueOrigin {\\n SEQUENCER_QUEUE,\\n L1TOL2_QUEUE\\n }\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Account {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n address ethAddress;\\n bool isFresh;\\n }\\n\\n struct EVMAccount {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n }\\n\\n struct ChainBatchHeader {\\n uint256 batchIndex;\\n bytes32 batchRoot;\\n uint256 batchSize;\\n uint256 prevTotalElements;\\n bytes extraData;\\n }\\n\\n struct ChainInclusionProof {\\n uint256 index;\\n bytes32[] siblings;\\n }\\n\\n struct Transaction {\\n uint256 timestamp;\\n uint256 blockNumber;\\n QueueOrigin l1QueueOrigin;\\n address l1TxOrigin;\\n address entrypoint;\\n uint256 gasLimit;\\n bytes data;\\n }\\n\\n struct TransactionChainElement {\\n bool isSequenced;\\n uint256 queueIndex; // QUEUED TX ONLY\\n uint256 timestamp; // SEQUENCER TX ONLY\\n uint256 blockNumber; // SEQUENCER TX ONLY\\n bytes txData; // SEQUENCER TX ONLY\\n }\\n\\n struct QueueElement {\\n bytes32 transactionHash;\\n uint40 timestamp;\\n uint40 blockNumber;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Encodes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Encoded transaction bytes.\\n */\\n function encodeTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return abi.encodePacked(\\n _transaction.timestamp,\\n _transaction.blockNumber,\\n _transaction.l1QueueOrigin,\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n );\\n }\\n\\n /**\\n * Hashes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Hashed transaction\\n */\\n function hashTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(encodeTransaction(_transaction));\\n }\\n\\n /**\\n * Converts an OVM account to an EVM account.\\n * @param _in OVM account to convert.\\n * @return Converted EVM account.\\n */\\n function toEVMAccount(\\n Account memory _in\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n return EVMAccount({\\n nonce: _in.nonce,\\n balance: _in.balance,\\n storageRoot: _in.storageRoot,\\n codeHash: _in.codeHash\\n });\\n }\\n\\n /**\\n * @notice RLP-encodes an account state struct.\\n * @param _account Account state struct.\\n * @return RLP-encoded account state.\\n */\\n function encodeEVMAccount(\\n EVMAccount memory _account\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes[] memory raw = new bytes[](4);\\n\\n // Unfortunately we can't create this array outright because\\n // Lib_RLPWriter.writeList will reject fixed-size arrays. Assigning\\n // index-by-index circumvents this issue.\\n raw[0] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.nonce)\\n )\\n );\\n raw[1] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.balance)\\n )\\n );\\n raw[2] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.storageRoot));\\n raw[3] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.codeHash));\\n\\n return Lib_RLPWriter.writeList(raw);\\n }\\n\\n /**\\n * @notice Decodes an RLP-encoded account state into a useful struct.\\n * @param _encoded RLP-encoded account state.\\n * @return Account state struct.\\n */\\n function decodeEVMAccount(\\n bytes memory _encoded\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\\n\\n return EVMAccount({\\n nonce: Lib_RLPReader.readUint256(accountState[0]),\\n balance: Lib_RLPReader.readUint256(accountState[1]),\\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\\n });\\n }\\n\\n /**\\n * Calculates a hash for a given batch header.\\n * @param _batchHeader Header to hash.\\n * @return Hash of the header.\\n */\\n function hashBatchHeader(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(\\n abi.encode(\\n _batchHeader.batchRoot,\\n _batchHeader.batchSize,\\n _batchHeader.prevTotalElements,\\n _batchHeader.extraData\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0xd85ba2066057a2677926f484b938c7c2ef33ff3853f3b71cda252f4a54f30e05\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n public\\n onlyOwner\\n {\\n addresses[_getNameHash(_name)] = _address;\\n\\n emit AddressSet(\\n _name,\\n _address\\n );\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0x2ce671a0e004df88b136bea5a3c59d0732cea8887c8496da1d509e0200b03d7d\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(\\n address _libAddressManager\\n ) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x65981feeabff6a81783ea97d44baf988a18a86c8cb374c46fdb71819cbacc7c0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPReader.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_RLPReader\\n * @dev Adapted from \\\"RLPReader\\\" by Hamdi Allam (hamdi.allam97@gmail.com).\\n */\\nlibrary Lib_RLPReader {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 constant internal MAX_LIST_LENGTH = 32;\\n\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum RLPItemType {\\n DATA_ITEM,\\n LIST_ITEM\\n }\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct RLPItem {\\n uint256 length;\\n uint256 ptr;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts bytes to a reference to memory position and length.\\n * @param _in Input bytes to convert.\\n * @return Output memory reference.\\n */\\n function toRLPItem(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem memory\\n )\\n {\\n uint256 ptr;\\n assembly {\\n ptr := add(_in, 32)\\n }\\n\\n return RLPItem({\\n length: _in.length,\\n ptr: ptr\\n });\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n (\\n uint256 listOffset,\\n ,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.LIST_ITEM,\\n \\\"Invalid RLP list value.\\\"\\n );\\n\\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\\n // writing to the length. Since we can't know the number of RLP items without looping over\\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\\n // simply set a reasonable maximum list length and decrease the size before we finish.\\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\\n\\n uint256 itemCount = 0;\\n uint256 offset = listOffset;\\n while (offset < _in.length) {\\n require(\\n itemCount < MAX_LIST_LENGTH,\\n \\\"Provided RLP list exceeds max list length.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n ) = _decodeLength(RLPItem({\\n length: _in.length - offset,\\n ptr: _in.ptr + offset\\n }));\\n\\n out[itemCount] = RLPItem({\\n length: itemLength + itemOffset,\\n ptr: _in.ptr + offset\\n });\\n\\n itemCount += 1;\\n offset += itemOffset + itemLength;\\n }\\n\\n // Decrease the array size to match the actual item count.\\n assembly {\\n mstore(out, itemCount)\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n return readList(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes value.\\\"\\n );\\n\\n return _copy(_in.ptr, itemOffset, itemLength);\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return readBytes(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return string(readBytes(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return readString(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n require(\\n _in.length <= 33,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr + itemOffset;\\n bytes32 out;\\n assembly {\\n out := mload(ptr)\\n\\n // Shift the bytes over to match the item size.\\n if lt(itemLength, 32) {\\n out := div(out, exp(256, sub(32, itemLength)))\\n }\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return readBytes32(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return uint256(readBytes32(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return readUint256(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n require(\\n _in.length == 1,\\n \\\"Invalid RLP boolean value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 out;\\n assembly {\\n out := byte(0, mload(ptr))\\n }\\n\\n require(\\n out == 0 || out == 1,\\n \\\"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\\\"\\n );\\n\\n return out != 0;\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return readBool(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n if (_in.length == 1) {\\n return address(0);\\n }\\n\\n require(\\n _in.length == 21,\\n \\\"Invalid RLP address value.\\\"\\n );\\n\\n return address(readUint256(_in));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return readAddress(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads the raw bytes of an RLP item.\\n * @param _in RLP item to read.\\n * @return Raw RLP bytes.\\n */\\n function readRawBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in);\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Decodes the length of an RLP item.\\n * @param _in RLP item to decode.\\n * @return Offset of the encoded data.\\n * @return Length of the encoded data.\\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\\n */\\n function _decodeLength(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n uint256,\\n uint256,\\n RLPItemType\\n )\\n {\\n require(\\n _in.length > 0,\\n \\\"RLP item cannot be null.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 prefix;\\n assembly {\\n prefix := byte(0, mload(ptr))\\n }\\n\\n if (prefix <= 0x7f) {\\n // Single byte.\\n\\n return (0, 1, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xb7) {\\n // Short string.\\n\\n uint256 strLen = prefix - 0x80;\\n\\n require(\\n _in.length > strLen,\\n \\\"Invalid RLP short string.\\\"\\n );\\n\\n return (1, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xbf) {\\n // Long string.\\n uint256 lenOfStrLen = prefix - 0xb7;\\n\\n require(\\n _in.length > lenOfStrLen,\\n \\\"Invalid RLP long string length.\\\"\\n );\\n\\n uint256 strLen;\\n assembly {\\n // Pick out the string length.\\n strLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfStrLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfStrLen + strLen,\\n \\\"Invalid RLP long string.\\\"\\n );\\n\\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xf7) {\\n // Short list.\\n uint256 listLen = prefix - 0xc0;\\n\\n require(\\n _in.length > listLen,\\n \\\"Invalid RLP short list.\\\"\\n );\\n\\n return (1, listLen, RLPItemType.LIST_ITEM);\\n } else {\\n // Long list.\\n uint256 lenOfListLen = prefix - 0xf7;\\n\\n require(\\n _in.length > lenOfListLen,\\n \\\"Invalid RLP long list length.\\\"\\n );\\n\\n uint256 listLen;\\n assembly {\\n // Pick out the list length.\\n listLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfListLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfListLen + listLen,\\n \\\"Invalid RLP long list.\\\"\\n );\\n\\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\\n }\\n }\\n\\n /**\\n * Copies the bytes from a memory location.\\n * @param _src Pointer to the location to read from.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Copied bytes.\\n */\\n function _copy(\\n uint256 _src,\\n uint256 _offset,\\n uint256 _length\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out = new bytes(_length);\\n if (out.length == 0) {\\n return out;\\n }\\n\\n uint256 src = _src + _offset;\\n uint256 dest;\\n assembly {\\n dest := add(out, 32)\\n }\\n\\n // Copy over as many complete words as we can.\\n for (uint256 i = 0; i < _length / 32; i++) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n\\n src += 32;\\n dest += 32;\\n }\\n\\n // Pick out the remaining bytes.\\n uint256 mask = 256 ** (32 - (_length % 32)) - 1;\\n assembly {\\n mstore(\\n dest,\\n or(\\n and(mload(src), not(mask)),\\n and(mload(dest), mask)\\n )\\n )\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Copies an RLP item into bytes.\\n * @param _in RLP item to copy.\\n * @return Copied bytes.\\n */\\n function _copy(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in.ptr, 0, _in.length);\\n }\\n}\\n\",\"keccak256\":\"0x829174c61216dce35fdb888383b6022e0365eb7fbdc71ad79d98b108091969fe\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPWriter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/**\\n * @title Lib_RLPWriter\\n * @author Bakaoh (with modifications)\\n */\\nlibrary Lib_RLPWriter {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * RLP encodes a byte string.\\n * @param _in The byte string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded;\\n\\n if (_in.length == 1 && uint8(_in[0]) < 128) {\\n encoded = _in;\\n } else {\\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * RLP encodes a list of RLP encoded byte byte strings.\\n * @param _in The list of RLP encoded byte strings.\\n * @return The RLP encoded list of items in bytes.\\n */\\n function writeList(\\n bytes[] memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory list = _flatten(_in);\\n return abi.encodePacked(_writeLength(list.length, 192), list);\\n }\\n\\n /**\\n * RLP encodes a string.\\n * @param _in The string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeString(\\n string memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(bytes(_in));\\n }\\n\\n /**\\n * RLP encodes an address.\\n * @param _in The address to encode.\\n * @return The RLP encoded address in bytes.\\n */\\n function writeAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a bytes32 value.\\n * @param _in The bytes32 to encode.\\n * @return _out The RLP encoded bytes32 in bytes.\\n */\\n function writeBytes32(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a uint.\\n * @param _in The uint256 to encode.\\n * @return The RLP encoded uint256 in bytes.\\n */\\n function writeUint(\\n uint256 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(_toBinary(_in));\\n }\\n\\n /**\\n * RLP encodes a bool.\\n * @param _in The bool to encode.\\n * @return The RLP encoded bool in bytes.\\n */\\n function writeBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded = new bytes(1);\\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\\n return encoded;\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\\n * @param _len The length of the string or the payload.\\n * @param _offset 128 if item is string, 192 if item is list.\\n * @return RLP encoded bytes.\\n */\\n function _writeLength(\\n uint256 _len,\\n uint256 _offset\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded;\\n\\n if (_len < 56) {\\n encoded = new bytes(1);\\n encoded[0] = byte(uint8(_len) + uint8(_offset));\\n } else {\\n uint256 lenLen;\\n uint256 i = 1;\\n while (_len / i != 0) {\\n lenLen++;\\n i *= 256;\\n }\\n\\n encoded = new bytes(lenLen + 1);\\n encoded[0] = byte(uint8(lenLen) + uint8(_offset) + 55);\\n for(i = 1; i <= lenLen; i++) {\\n encoded[i] = byte(uint8((_len / (256**(lenLen-i))) % 256));\\n }\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * Encode integer in big endian binary form with no leading zeroes.\\n * @notice TODO: This should be optimized with assembly to save gas costs.\\n * @param _x The integer to encode.\\n * @return RLP encoded bytes.\\n */\\n function _toBinary(\\n uint256 _x\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory b = abi.encodePacked(_x);\\n\\n uint256 i = 0;\\n for (; i < 32; i++) {\\n if (b[i] != 0) {\\n break;\\n }\\n }\\n\\n bytes memory res = new bytes(32 - i);\\n for (uint256 j = 0; j < res.length; j++) {\\n res[j] = b[i++];\\n }\\n\\n return res;\\n }\\n\\n /**\\n * Copies a piece of memory to another location.\\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\\n * @param _dest Destination location.\\n * @param _src Source location.\\n * @param _len Length of memory to copy.\\n */\\n function _memcpy(\\n uint256 _dest,\\n uint256 _src,\\n uint256 _len\\n )\\n private\\n pure\\n {\\n uint256 dest = _dest;\\n uint256 src = _src;\\n uint256 len = _len;\\n\\n for(; len >= 32; len -= 32) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n dest += 32;\\n src += 32;\\n }\\n\\n uint256 mask = 256 ** (32 - len) - 1;\\n assembly {\\n let srcpart := and(mload(src), not(mask))\\n let destpart := and(mload(dest), mask)\\n mstore(dest, or(destpart, srcpart))\\n }\\n }\\n\\n /**\\n * Flattens a list of byte strings into one byte string.\\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\\n * @param _list List of byte strings to flatten.\\n * @return The flattened byte string.\\n */\\n function _flatten(\\n bytes[] memory _list\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n if (_list.length == 0) {\\n return new bytes(0);\\n }\\n\\n uint256 len;\\n uint256 i = 0;\\n for (; i < _list.length; i++) {\\n len += _list[i].length;\\n }\\n\\n bytes memory flattened = new bytes(len);\\n uint256 flattenedPtr;\\n assembly { flattenedPtr := add(flattened, 0x20) }\\n\\n for(i = 0; i < _list.length; i++) {\\n bytes memory item = _list[i];\\n\\n uint256 listPtr;\\n assembly { listPtr := add(item, 0x20)}\\n\\n _memcpy(flattenedPtr, listPtr, item.length);\\n flattenedPtr += _list[i].length;\\n }\\n\\n return flattened;\\n }\\n}\\n\",\"keccak256\":\"0xb60ee4b03ad372c3deff21d454ab714dd0c18ee3e6f9d45532e209fc59d5a54d\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_Bytes32Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_Byte32Utils\\n */\\nlibrary Lib_Bytes32Utils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \\\"true.\\\"\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as a boolean.\\n */\\n function toBool(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return _in != 0;\\n }\\n\\n /**\\n * Converts a boolean to a bytes32 value.\\n * @param _in Input boolean value.\\n * @return Boolean as a bytes32.\\n */\\n function fromBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in ? 1 : 0));\\n }\\n\\n /**\\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as an address.\\n */\\n function toAddress(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return address(uint160(uint256(_in)));\\n }\\n\\n /**\\n * Converts an address to a bytes32.\\n * @param _in Input address value.\\n * @return Address as a bytes32.\\n */\\n function fromAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in));\\n }\\n\\n /**\\n * Removes the leading zeros from a bytes32 value and returns a new (smaller) bytes value.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 without any leading zeros.\\n */\\n function removeLeadingZeros(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out;\\n\\n assembly {\\n // Figure out how many leading zero bytes to remove.\\n let shift := 0\\n for { let i := 0 } and(lt(i, 32), eq(byte(i, _in), 0)) { i := add(i, 1) } {\\n shift := add(shift, 1)\\n }\\n\\n // Reserve some space for our output and fix the free memory pointer.\\n out := mload(0x40)\\n mstore(0x40, add(out, 0x40))\\n\\n // Shift the value and store it into the output bytes.\\n mstore(add(out, 0x20), shl(mul(shift, 8), _in))\\n\\n // Store the new size (with leading zero bytes removed) in the output byte size.\\n mstore(out, sub(32, shift))\\n }\\n\\n return out;\\n }\\n}\\n\",\"keccak256\":\"0xfa2def593e3fc56a31852c3744aefdaa93cec74e721bfcfeb1e5d166c7c60b64\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_BytesUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_BytesUtils\\n */\\nlibrary Lib_BytesUtils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_start + _length >= _start, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n if (_bytes.length - _start == 0) {\\n return bytes('');\\n }\\n\\n return slice(_bytes, _start, _bytes.length - _start);\\n }\\n\\n function toBytes32PadLeft(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n bytes32 ret;\\n uint256 len = _bytes.length <= 32 ? _bytes.length : 32;\\n assembly {\\n ret := shr(mul(sub(32, len), 8), mload(add(_bytes, 32)))\\n }\\n return ret;\\n }\\n\\n function toBytes32(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n if (_bytes.length < 32) {\\n bytes32 ret;\\n assembly {\\n ret := mload(add(_bytes, 32))\\n }\\n return ret;\\n }\\n\\n return abi.decode(_bytes,(bytes32)); // will truncate if input length > 32 bytes\\n }\\n\\n function toUint256(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return uint256(toBytes32(_bytes));\\n }\\n\\n function toUint24(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n uint24\\n )\\n {\\n require(_start + 3 >= _start, \\\"toUint24_overflow\\\");\\n require(_bytes.length >= _start + 3 , \\\"toUint24_outOfBounds\\\");\\n uint24 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x3), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toUint8(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n uint8\\n )\\n {\\n require(_start + 1 >= _start, \\\"toUint8_overflow\\\");\\n require(_bytes.length >= _start + 1 , \\\"toUint8_outOfBounds\\\");\\n uint8 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x1), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toAddress(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n require(_start + 20 >= _start, \\\"toAddress_overflow\\\");\\n require(_bytes.length >= _start + 20, \\\"toAddress_outOfBounds\\\");\\n address tempAddress;\\n\\n assembly {\\n tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000)\\n }\\n\\n return tempAddress;\\n }\\n\\n function toNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory nibbles = new bytes(_bytes.length * 2);\\n\\n for (uint256 i = 0; i < _bytes.length; i++) {\\n nibbles[i * 2] = _bytes[i] >> 4;\\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\\n }\\n\\n return nibbles;\\n }\\n\\n function fromNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory ret = new bytes(_bytes.length / 2);\\n\\n for (uint256 i = 0; i < ret.length; i++) {\\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\\n }\\n\\n return ret;\\n }\\n\\n function equal(\\n bytes memory _bytes,\\n bytes memory _other\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return keccak256(_bytes) == keccak256(_other);\\n }\\n}\\n\",\"keccak256\":\"0xa5195afe32fb2cf104d156e8f4bd39df1ec79bf6ba232097b9e8e0ee14fbc298\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x608060405234801561001057600080fd5b5060405161184138038061184183398101604081905261002f91610054565b600080546001600160a01b0319166001600160a01b0392909216919091179055610082565b600060208284031215610065578081fd5b81516001600160a01b038116811461007b578182fd5b9392505050565b6117b0806100916000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c8063299ca4781461005c578063461a44781461007a57806398d8867d1461008d578063a286ba1c146100a2578063b48ec820146100b5575b600080fd5b6100646100c8565b6040516100719190611306565b60405180910390f35b610064610088366004611101565b6100d7565b6100a061009b366004611029565b6101b5565b005b6100a06100b0366004610f64565b6104f4565b6100646100c3366004610f43565b6108bb565b6000546001600160a01b031681565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b8381101561013757818101518382015260200161011f565b50505050905090810190601f1680156101645780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561018157600080fd5b505afa158015610195573d6000803e3d6000fd5b505050506040513d60208110156101ab57600080fd5b505190505b919050565b866101bf8561090a565b60005a905060006101cf8861090a565b90506101db8b82610923565b156101e65750610432565b60006102216040518060400160405280601881526020017727ab26afa9ba30ba32a1b7b6b6b4ba36b2b73a21b430b4b760411b8152506100d7565b905060006102636040518060400160405280601d81526020017f4f564d5f43616e6f6e6963616c5472616e73616374696f6e436861696e0000008152506100d7565b9050816001600160a01b0316634d69ee578e8e8e6040518463ffffffff1660e01b81526004016102959392919061135f565b60206040518083038186803b1580156102ad57600080fd5b505afa1580156102c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102e59190610f0f565b61030a5760405162461bcd60e51b8152600401610301906115e7565b60405180910390fd5b6040516326f2b4e760e11b81526001600160a01b03821690634de569ce9061033c908d908d908d908d90600401611641565b60206040518083038186803b15801561035457600080fd5b505afa158015610368573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061038c9190610f0f565b6103a85760405162461bcd60e51b815260040161030190611499565b86600001518860600151018b600001518d6060015101600101146103de5760405162461bcd60e51b815260040161030190611525565b6103ed8d848d60000151610942565b7f41a48bde2468fac6f670f39b66d7b91f311053e1f28eab9d75056546e6eaac958d8c6000015185336040516104269493929190611394565b60405180910390a15050505b60005a820390506104696040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506100d7565b6001600160a01b0316631e16e92f858533856040518563ffffffff1660e01b815260040180858152602001848152602001836001600160a01b03168152602001828152602001945050505050600060405180830381600087803b1580156104cf57600080fd5b505af11580156104e3573d6000803e3d6000fd5b505050505050505050505050505050565b868460005a905060006105078b896108bb565b905060006105446040518060400160405280601881526020017727ab26afa9ba30ba32a1b7b6b6b4ba36b2b73a21b430b4b760411b8152506100d7565b9050816001600160a01b031663b2fa1c9e6040518163ffffffff1660e01b815260040160206040518083038186803b15801561057f57600080fd5b505afa158015610593573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b79190610f0f565b15156001146105d85760405162461bcd60e51b8152600401610301906113b8565b89600001518b606001510160010186600001518860600151011461060e5760405162461bcd60e51b81526004016103019061141f565b604051634d69ee5760e01b81526001600160a01b03821690634d69ee579061063e908f908f908f9060040161135f565b60206040518083038186803b15801561065657600080fd5b505afa15801561066a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061068e9190610f0f565b6106aa5760405162461bcd60e51b8152600401610301906115e7565b604051634d69ee5760e01b81526001600160a01b03821690634d69ee57906106da908b908b908b9060040161135f565b60206040518083038186803b1580156106f257600080fd5b505afa158015610706573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061072a9190610f0f565b6107465760405162461bcd60e51b8152600401610301906114dd565b816001600160a01b031663c1c618b86040518163ffffffff1660e01b815260040160206040518083038186803b15801561077f57600080fd5b505afa158015610793573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107b79190610f2b565b8814156107d65760405162461bcd60e51b815260040161030190611597565b6107e0878d610a6d565b6000600160008e8c6040516020016107f9929190611289565b60405160208183030381529060405280519060200120815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b031602179055507f1e5fff3c23daf51ea67aaa3bbc738bcedaa98be5a5503f0e63a336a004b075b18c8b600001518b3360405161087a9493929190611394565b60405180910390a1505060005a820390506104696040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506100d7565b60006001600084846040516020016108d4929190611289565b60408051808303601f19018152918152815160209283012083529082019290925201600020546001600160a01b03169392505050565b600061091582610bc7565b805190602001209050919050565b60008061093084846108bb565b6001600160a01b031614159392505050565b6109806040518060400160405280601c81526020017f4f564d5f53746174655472616e736974696f6e6572466163746f7279000000008152506100d7565b600054604051631168a38160e11b81526001600160a01b03928316926322d14702926109b79291169085908890889060040161131a565b602060405180830381600087803b1580156109d157600080fd5b505af11580156109e5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a0991906110e5565b600160008585604051602001610a20929190611289565b60405160208183030381529060405280519060200120815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b03160217905550505050565b6000610aa86040518060400160405280601881526020017727ab26afa9ba30ba32a1b7b6b6b4ba36b2b73a21b430b4b760411b8152506100d7565b90506000610adc6040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506100d7565b604051632e38626b60e21b81529091506001600160a01b0383169063b8e189ac90610b0b90879060040161162e565b600060405180830381600087803b158015610b2557600080fd5b505af1158015610b39573d6000803e3d6000fd5b505050506000808560800151806020019051810190610b58919061114f565b60405163abfbbe1360e01b815291935091506001600160a01b0384169063abfbbe1390610b8d90889085908790600401611340565b600060405180830381600087803b158015610ba757600080fd5b505af1158015610bbb573d6000803e3d6000fd5b50505050505050505050565b6060816000015182602001518360400151846060015185608001518660a001518760c00151604051602001610c029796959493929190611297565b6040516020818303038152906040529050919050565b600067ffffffffffffffff831115610c2c57fe5b610c3f601f8401601f1916602001611700565b9050828152838383011115610c5357600080fd5b828260208301376000602084830101529392505050565b80356101b081611754565b600082601f830112610c85578081fd5b610c9483833560208501610c18565b9392505050565b8035600281106101b057600080fd5b600060a08284031215610cbb578081fd5b60405160a0810167ffffffffffffffff8282108183111715610cd957fe5b81604052829350843583526020850135602084015260408501356040840152606085013560608401526080850135915080821115610d1657600080fd5b50610d2385828601610c75565b6080830152505092915050565b600060408284031215610d41578081fd5b6040516040810167ffffffffffffffff8282108183111715610d5f57fe5b8160405282935084358352602091508185013581811115610d7f57600080fd5b8501601f81018713610d9057600080fd5b803582811115610d9c57fe5b8381029250610dac848401611700565b8181528481019083860185850187018b1015610dc757600080fd5b600095505b83861015610dea578035835260019590950194918601918601610dcc565b5080868801525050505050505092915050565b600060a08284031215610e0e578081fd5b60405160a0810167ffffffffffffffff8282108183111715610e2c57fe5b8160405282935084359150610e408261176c565b8183526020850135602084015260408501356040840152606085013560608401526080850135915080821115610d1657600080fd5b600060e08284031215610e86578081fd5b610e9060e0611700565b90508135815260208201356020820152610eac60408301610c9b565b6040820152610ebd60608301610c6a565b6060820152610ece60808301610c6a565b608082015260a082013560a082015260c082013567ffffffffffffffff811115610ef757600080fd5b610f0384828501610c75565b60c08301525092915050565b600060208284031215610f20578081fd5b8151610c948161176c565b600060208284031215610f3c578081fd5b5051919050565b60008060408385031215610f55578081fd5b50508035926020909101359150565b600080600080600080600060e0888a031215610f7e578283fd5b87359650602088013567ffffffffffffffff80821115610f9c578485fd5b610fa88b838c01610caa565b975060408a0135915080821115610fbd578485fd5b610fc98b838c01610d30565b965060608a0135955060808a0135945060a08a0135915080821115610fec578384fd5b610ff88b838c01610caa565b935060c08a013591508082111561100d578283fd5b5061101a8a828b01610d30565b91505092959891949750929550565b600080600080600080600060e0888a031215611043578081fd5b87359650602088013567ffffffffffffffff80821115611061578283fd5b61106d8b838c01610caa565b975060408a0135915080821115611082578283fd5b61108e8b838c01610d30565b965060608a01359150808211156110a3578283fd5b6110af8b838c01610e75565b955060808a01359150808211156110c4578283fd5b6110d08b838c01610dfd565b945060a08a0135915080821115610fec578283fd5b6000602082840312156110f6578081fd5b8151610c9481611754565b600060208284031215611112578081fd5b813567ffffffffffffffff811115611128578182fd5b8201601f81018413611138578182fd5b61114784823560208401610c18565b949350505050565b60008060408385031215611161578182fd5b82519150602083015161117381611754565b809150509250929050565b6001600160a01b03169052565b600081518084526111a3816020860160208601611724565b601f01601f19169290920160200192915050565b600081518352602082015160208401526040820151604084015260608201516060840152608082015160a0608085015261114760a085018261118b565b6000604083018251845260208084015160408287015282815180855260608801915083830194508592505b8083101561123f578451825293830193600192909201919083019061121f565b509695505050505050565b6000815115158352602082015160208401526040820151604084015260608201516060840152608082015160a0608085015261114760a085018261118b565b918252602082015260400190565b6000888252876020830152600287106112ac57fe5b8660f81b60408301526bffffffffffffffffffffffff19808760601b166041840152808660601b1660558401525083606983015282516112f3816089850160208701611724565b9190910160890198975050505050505050565b6001600160a01b0391909116815260200190565b6001600160a01b0394909416845260208401929092526040830152606082015260800190565b9283526001600160a01b03919091166020830152604082015260600190565b60008482526060602083015261137860608301856111b7565b828103604084015261138a81856111f4565b9695505050505050565b938452602084019290925260408301526001600160a01b0316606082015260800190565b60208082526041908201527f5374617465207472616e736974696f6e2070726f63657373206d75737420626560408201527f20636f6d706c65746564207072696f7220746f2066696e616c697a6174696f6e6060820152601760f91b608082015260a00190565b60208082526054908201527f506f73742d737461746520726f6f7420676c6f62616c20696e646578206d757360408201527f7420657175616c20746f207468652070726520737461746520726f6f7420676c60608201527337b130b61034b73232bc1038363ab99037b7329760611b608082015260a00190565b60208082526024908201527f496e76616c6964207472616e73616374696f6e20696e636c7573696f6e20707260408201526337b7b31760e11b606082015260800190565b60208082526028908201527f496e76616c696420706f73742d737461746520726f6f7420696e636c7573696f6040820152673710383937b7b31760c11b606082015260800190565b6020808252604c908201527f5072652d737461746520726f6f7420676c6f62616c20696e646578206d75737460408201527f20657175616c20746f20746865207472616e73616374696f6e20726f6f74206760608201526b3637b130b61034b73232bc1760a11b608082015260a00190565b60208082526030908201527f5374617465207472616e736974696f6e20686173206e6f74206265656e20707260408201526f37bb32b710333930bab23ab632b73a1760811b606082015260800190565b60208082526027908201527f496e76616c6964207072652d737461746520726f6f7420696e636c7573696f6e60408201526610383937b7b31760c91b606082015260800190565b600060208252610c9460208301846111b7565b60006080825285516080830152602086015160a083015260408601516002811061166757fe5b60c083015260608601516001600160a01b031660e0830152608086015161169261010084018261117e565b5060a086015161012083015260c086015160e06101408401526116b961016084018261118b565b905082810360208401526116cd818761124a565b905082810360408401526116e181866111b7565b905082810360608401526116f581856111f4565b979650505050505050565b60405181810167ffffffffffffffff8111828210171561171c57fe5b604052919050565b60005b8381101561173f578181015183820152602001611727565b8381111561174e576000848401525b50505050565b6001600160a01b038116811461176957600080fd5b50565b801515811461176957600080fdfea26469706673582212205dbab94b86b7fa55149dd4efe74e8533d11e06735abd7d989856c9aa60c89c1064736f6c63430007060033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100575760003560e01c8063299ca4781461005c578063461a44781461007a57806398d8867d1461008d578063a286ba1c146100a2578063b48ec820146100b5575b600080fd5b6100646100c8565b6040516100719190611306565b60405180910390f35b610064610088366004611101565b6100d7565b6100a061009b366004611029565b6101b5565b005b6100a06100b0366004610f64565b6104f4565b6100646100c3366004610f43565b6108bb565b6000546001600160a01b031681565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b8381101561013757818101518382015260200161011f565b50505050905090810190601f1680156101645780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561018157600080fd5b505afa158015610195573d6000803e3d6000fd5b505050506040513d60208110156101ab57600080fd5b505190505b919050565b866101bf8561090a565b60005a905060006101cf8861090a565b90506101db8b82610923565b156101e65750610432565b60006102216040518060400160405280601881526020017727ab26afa9ba30ba32a1b7b6b6b4ba36b2b73a21b430b4b760411b8152506100d7565b905060006102636040518060400160405280601d81526020017f4f564d5f43616e6f6e6963616c5472616e73616374696f6e436861696e0000008152506100d7565b9050816001600160a01b0316634d69ee578e8e8e6040518463ffffffff1660e01b81526004016102959392919061135f565b60206040518083038186803b1580156102ad57600080fd5b505afa1580156102c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102e59190610f0f565b61030a5760405162461bcd60e51b8152600401610301906115e7565b60405180910390fd5b6040516326f2b4e760e11b81526001600160a01b03821690634de569ce9061033c908d908d908d908d90600401611641565b60206040518083038186803b15801561035457600080fd5b505afa158015610368573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061038c9190610f0f565b6103a85760405162461bcd60e51b815260040161030190611499565b86600001518860600151018b600001518d6060015101600101146103de5760405162461bcd60e51b815260040161030190611525565b6103ed8d848d60000151610942565b7f41a48bde2468fac6f670f39b66d7b91f311053e1f28eab9d75056546e6eaac958d8c6000015185336040516104269493929190611394565b60405180910390a15050505b60005a820390506104696040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506100d7565b6001600160a01b0316631e16e92f858533856040518563ffffffff1660e01b815260040180858152602001848152602001836001600160a01b03168152602001828152602001945050505050600060405180830381600087803b1580156104cf57600080fd5b505af11580156104e3573d6000803e3d6000fd5b505050505050505050505050505050565b868460005a905060006105078b896108bb565b905060006105446040518060400160405280601881526020017727ab26afa9ba30ba32a1b7b6b6b4ba36b2b73a21b430b4b760411b8152506100d7565b9050816001600160a01b031663b2fa1c9e6040518163ffffffff1660e01b815260040160206040518083038186803b15801561057f57600080fd5b505afa158015610593573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b79190610f0f565b15156001146105d85760405162461bcd60e51b8152600401610301906113b8565b89600001518b606001510160010186600001518860600151011461060e5760405162461bcd60e51b81526004016103019061141f565b604051634d69ee5760e01b81526001600160a01b03821690634d69ee579061063e908f908f908f9060040161135f565b60206040518083038186803b15801561065657600080fd5b505afa15801561066a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061068e9190610f0f565b6106aa5760405162461bcd60e51b8152600401610301906115e7565b604051634d69ee5760e01b81526001600160a01b03821690634d69ee57906106da908b908b908b9060040161135f565b60206040518083038186803b1580156106f257600080fd5b505afa158015610706573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061072a9190610f0f565b6107465760405162461bcd60e51b8152600401610301906114dd565b816001600160a01b031663c1c618b86040518163ffffffff1660e01b815260040160206040518083038186803b15801561077f57600080fd5b505afa158015610793573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107b79190610f2b565b8814156107d65760405162461bcd60e51b815260040161030190611597565b6107e0878d610a6d565b6000600160008e8c6040516020016107f9929190611289565b60405160208183030381529060405280519060200120815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b031602179055507f1e5fff3c23daf51ea67aaa3bbc738bcedaa98be5a5503f0e63a336a004b075b18c8b600001518b3360405161087a9493929190611394565b60405180910390a1505060005a820390506104696040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506100d7565b60006001600084846040516020016108d4929190611289565b60408051808303601f19018152918152815160209283012083529082019290925201600020546001600160a01b03169392505050565b600061091582610bc7565b805190602001209050919050565b60008061093084846108bb565b6001600160a01b031614159392505050565b6109806040518060400160405280601c81526020017f4f564d5f53746174655472616e736974696f6e6572466163746f7279000000008152506100d7565b600054604051631168a38160e11b81526001600160a01b03928316926322d14702926109b79291169085908890889060040161131a565b602060405180830381600087803b1580156109d157600080fd5b505af11580156109e5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a0991906110e5565b600160008585604051602001610a20929190611289565b60405160208183030381529060405280519060200120815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b03160217905550505050565b6000610aa86040518060400160405280601881526020017727ab26afa9ba30ba32a1b7b6b6b4ba36b2b73a21b430b4b760411b8152506100d7565b90506000610adc6040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506100d7565b604051632e38626b60e21b81529091506001600160a01b0383169063b8e189ac90610b0b90879060040161162e565b600060405180830381600087803b158015610b2557600080fd5b505af1158015610b39573d6000803e3d6000fd5b505050506000808560800151806020019051810190610b58919061114f565b60405163abfbbe1360e01b815291935091506001600160a01b0384169063abfbbe1390610b8d90889085908790600401611340565b600060405180830381600087803b158015610ba757600080fd5b505af1158015610bbb573d6000803e3d6000fd5b50505050505050505050565b6060816000015182602001518360400151846060015185608001518660a001518760c00151604051602001610c029796959493929190611297565b6040516020818303038152906040529050919050565b600067ffffffffffffffff831115610c2c57fe5b610c3f601f8401601f1916602001611700565b9050828152838383011115610c5357600080fd5b828260208301376000602084830101529392505050565b80356101b081611754565b600082601f830112610c85578081fd5b610c9483833560208501610c18565b9392505050565b8035600281106101b057600080fd5b600060a08284031215610cbb578081fd5b60405160a0810167ffffffffffffffff8282108183111715610cd957fe5b81604052829350843583526020850135602084015260408501356040840152606085013560608401526080850135915080821115610d1657600080fd5b50610d2385828601610c75565b6080830152505092915050565b600060408284031215610d41578081fd5b6040516040810167ffffffffffffffff8282108183111715610d5f57fe5b8160405282935084358352602091508185013581811115610d7f57600080fd5b8501601f81018713610d9057600080fd5b803582811115610d9c57fe5b8381029250610dac848401611700565b8181528481019083860185850187018b1015610dc757600080fd5b600095505b83861015610dea578035835260019590950194918601918601610dcc565b5080868801525050505050505092915050565b600060a08284031215610e0e578081fd5b60405160a0810167ffffffffffffffff8282108183111715610e2c57fe5b8160405282935084359150610e408261176c565b8183526020850135602084015260408501356040840152606085013560608401526080850135915080821115610d1657600080fd5b600060e08284031215610e86578081fd5b610e9060e0611700565b90508135815260208201356020820152610eac60408301610c9b565b6040820152610ebd60608301610c6a565b6060820152610ece60808301610c6a565b608082015260a082013560a082015260c082013567ffffffffffffffff811115610ef757600080fd5b610f0384828501610c75565b60c08301525092915050565b600060208284031215610f20578081fd5b8151610c948161176c565b600060208284031215610f3c578081fd5b5051919050565b60008060408385031215610f55578081fd5b50508035926020909101359150565b600080600080600080600060e0888a031215610f7e578283fd5b87359650602088013567ffffffffffffffff80821115610f9c578485fd5b610fa88b838c01610caa565b975060408a0135915080821115610fbd578485fd5b610fc98b838c01610d30565b965060608a0135955060808a0135945060a08a0135915080821115610fec578384fd5b610ff88b838c01610caa565b935060c08a013591508082111561100d578283fd5b5061101a8a828b01610d30565b91505092959891949750929550565b600080600080600080600060e0888a031215611043578081fd5b87359650602088013567ffffffffffffffff80821115611061578283fd5b61106d8b838c01610caa565b975060408a0135915080821115611082578283fd5b61108e8b838c01610d30565b965060608a01359150808211156110a3578283fd5b6110af8b838c01610e75565b955060808a01359150808211156110c4578283fd5b6110d08b838c01610dfd565b945060a08a0135915080821115610fec578283fd5b6000602082840312156110f6578081fd5b8151610c9481611754565b600060208284031215611112578081fd5b813567ffffffffffffffff811115611128578182fd5b8201601f81018413611138578182fd5b61114784823560208401610c18565b949350505050565b60008060408385031215611161578182fd5b82519150602083015161117381611754565b809150509250929050565b6001600160a01b03169052565b600081518084526111a3816020860160208601611724565b601f01601f19169290920160200192915050565b600081518352602082015160208401526040820151604084015260608201516060840152608082015160a0608085015261114760a085018261118b565b6000604083018251845260208084015160408287015282815180855260608801915083830194508592505b8083101561123f578451825293830193600192909201919083019061121f565b509695505050505050565b6000815115158352602082015160208401526040820151604084015260608201516060840152608082015160a0608085015261114760a085018261118b565b918252602082015260400190565b6000888252876020830152600287106112ac57fe5b8660f81b60408301526bffffffffffffffffffffffff19808760601b166041840152808660601b1660558401525083606983015282516112f3816089850160208701611724565b9190910160890198975050505050505050565b6001600160a01b0391909116815260200190565b6001600160a01b0394909416845260208401929092526040830152606082015260800190565b9283526001600160a01b03919091166020830152604082015260600190565b60008482526060602083015261137860608301856111b7565b828103604084015261138a81856111f4565b9695505050505050565b938452602084019290925260408301526001600160a01b0316606082015260800190565b60208082526041908201527f5374617465207472616e736974696f6e2070726f63657373206d75737420626560408201527f20636f6d706c65746564207072696f7220746f2066696e616c697a6174696f6e6060820152601760f91b608082015260a00190565b60208082526054908201527f506f73742d737461746520726f6f7420676c6f62616c20696e646578206d757360408201527f7420657175616c20746f207468652070726520737461746520726f6f7420676c60608201527337b130b61034b73232bc1038363ab99037b7329760611b608082015260a00190565b60208082526024908201527f496e76616c6964207472616e73616374696f6e20696e636c7573696f6e20707260408201526337b7b31760e11b606082015260800190565b60208082526028908201527f496e76616c696420706f73742d737461746520726f6f7420696e636c7573696f6040820152673710383937b7b31760c11b606082015260800190565b6020808252604c908201527f5072652d737461746520726f6f7420676c6f62616c20696e646578206d75737460408201527f20657175616c20746f20746865207472616e73616374696f6e20726f6f74206760608201526b3637b130b61034b73232bc1760a11b608082015260a00190565b60208082526030908201527f5374617465207472616e736974696f6e20686173206e6f74206265656e20707260408201526f37bb32b710333930bab23ab632b73a1760811b606082015260800190565b60208082526027908201527f496e76616c6964207072652d737461746520726f6f7420696e636c7573696f6e60408201526610383937b7b31760c91b606082015260800190565b600060208252610c9460208301846111b7565b60006080825285516080830152602086015160a083015260408601516002811061166757fe5b60c083015260608601516001600160a01b031660e0830152608086015161169261010084018261117e565b5060a086015161012083015260c086015160e06101408401526116b961016084018261118b565b905082810360208401526116cd818761124a565b905082810360408401526116e181866111b7565b905082810360608401526116f581856111f4565b979650505050505050565b60405181810167ffffffffffffffff8111828210171561171c57fe5b604052919050565b60005b8381101561173f578181015183820152602001611727565b8381111561174e576000848401525b50505050565b6001600160a01b038116811461176957600080fd5b50565b801515811461176957600080fdfea26469706673582212205dbab94b86b7fa55149dd4efe74e8533d11e06735abd7d989856c9aa60c89c1064736f6c63430007060033", + "devdoc": { + "details": "The Fraud Verifier contract coordinates the entire fraud proof verification process. If the fraud proof was successful it prunes any state batches from State Commitment Chain which were published after the fraudulent state root. Compiler used: solc Runtime target: EVM", + "kind": "dev", + "methods": { + "constructor": { + "params": { + "_libAddressManager": "Address of the Address Manager." + } + }, + "finalizeFraudVerification(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes32,bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))": { + "params": { + "_postStateRoot": "State root after the fraudulent transaction.", + "_postStateRootBatchHeader": "Batch header for the provided post-state root.", + "_postStateRootProof": "Inclusion proof for the provided post-state root.", + "_preStateRoot": "State root before the fraudulent transaction.", + "_preStateRootBatchHeader": "Batch header for the provided pre-state root.", + "_preStateRootProof": "Inclusion proof for the provided pre-state root.", + "_txHash": "The transaction for the state root" + } + }, + "getStateTransitioner(bytes32,bytes32)": { + "params": { + "_preStateRoot": "State root to query a transitioner for." + }, + "returns": { + "_transitioner": "Corresponding state transitioner contract." + } + }, + "initializeFraudVerification(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),(uint256,uint256,uint8,address,address,uint256,bytes),(bool,uint256,uint256,uint256,bytes),(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))": { + "params": { + "_preStateRoot": "State root before the fraudulent transaction.", + "_preStateRootBatchHeader": "Batch header for the provided pre-state root.", + "_preStateRootProof": "Inclusion proof for the provided pre-state root.", + "_transaction": "OVM transaction claimed to be fraudulent.", + "_transactionBatchHeader": "Batch header for the provided transaction.", + "_transactionProof": "Inclusion proof for the provided transaction.", + "_txChainElement": "OVM transaction chain element." + } + }, + "resolve(string)": { + "params": { + "_name": "Name to resolve an address for." + }, + "returns": { + "_0": "Address associated with the given name." + } + } + }, + "title": "OVM_FraudVerifier", + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": { + "finalizeFraudVerification(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes32,bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))": { + "notice": "Finalizes the fraud verification process." + }, + "getStateTransitioner(bytes32,bytes32)": { + "notice": "Retrieves the state transitioner for a given root." + }, + "initializeFraudVerification(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),(uint256,uint256,uint8,address,address,uint256,bytes),(bool,uint256,uint256,uint256,bytes),(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))": { + "notice": "Begins the fraud verification process." + }, + "resolve(string)": { + "notice": "Resolves the address associated with a given name." + } + }, + "version": 1 + }, + "storageLayout": { + "storage": [ + { + "astId": 12800, + "contract": "contracts/optimistic-ethereum/OVM/verification/OVM_FraudVerifier.sol:OVM_FraudVerifier", + "label": "libAddressManager", + "offset": 0, + "slot": "0", + "type": "t_contract(Lib_AddressManager)12793" + }, + { + "astId": 9391, + "contract": "contracts/optimistic-ethereum/OVM/verification/OVM_FraudVerifier.sol:OVM_FraudVerifier", + "label": "transitioners", + "offset": 0, + "slot": "1", + "type": "t_mapping(t_bytes32,t_contract(iOVM_StateTransitioner)11962)" + } + ], + "types": { + "t_bytes32": { + "encoding": "inplace", + "label": "bytes32", + "numberOfBytes": "32" + }, + "t_contract(Lib_AddressManager)12793": { + "encoding": "inplace", + "label": "contract Lib_AddressManager", + "numberOfBytes": "20" + }, + "t_contract(iOVM_StateTransitioner)11962": { + "encoding": "inplace", + "label": "contract iOVM_StateTransitioner", + "numberOfBytes": "20" + }, + "t_mapping(t_bytes32,t_contract(iOVM_StateTransitioner)11962)": { + "encoding": "mapping", + "key": "t_bytes32", + "label": "mapping(bytes32 => contract iOVM_StateTransitioner)", + "numberOfBytes": "32", + "value": "t_contract(iOVM_StateTransitioner)11962" + } + } + } +} \ No newline at end of file diff --git a/packages/contracts/deployments/kovan-v3/OVM_L1CrossDomainMessenger.json b/packages/contracts/deployments/kovan-v3/OVM_L1CrossDomainMessenger.json new file mode 100644 index 0000000000000..ceb42bc0a5762 --- /dev/null +++ b/packages/contracts/deployments/kovan-v3/OVM_L1CrossDomainMessenger.json @@ -0,0 +1,798 @@ +{ + "address": "0xa9D9045E4A753c856Fc0053369E780f23559E0A1", + "abi": [ + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes32", + "name": "msgHash", + "type": "bytes32" + } + ], + "name": "FailedRelayedMessage", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "_xDomainCalldataHash", + "type": "bytes32" + } + ], + "name": "MessageAllowed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "_xDomainCalldataHash", + "type": "bytes32" + } + ], + "name": "MessageBlocked", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "Paused", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes32", + "name": "msgHash", + "type": "bytes32" + } + ], + "name": "RelayedMessage", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes", + "name": "message", + "type": "bytes" + } + ], + "name": "SentMessage", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "Unpaused", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_xDomainCalldataHash", + "type": "bytes32" + } + ], + "name": "allowMessage", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_xDomainCalldataHash", + "type": "bytes32" + } + ], + "name": "blockMessage", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "name": "blockedMessages", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_libAddressManager", + "type": "address" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "libAddressManager", + "outputs": [ + { + "internalType": "contract Lib_AddressManager", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "messageNonce", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "pause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "paused", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_target", + "type": "address" + }, + { + "internalType": "address", + "name": "_sender", + "type": "address" + }, + { + "internalType": "bytes", + "name": "_message", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "_messageNonce", + "type": "uint256" + }, + { + "components": [ + { + "internalType": "bytes32", + "name": "stateRoot", + "type": "bytes32" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "batchIndex", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "batchRoot", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "batchSize", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "prevTotalElements", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "extraData", + "type": "bytes" + } + ], + "internalType": "struct Lib_OVMCodec.ChainBatchHeader", + "name": "stateRootBatchHeader", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + }, + { + "internalType": "bytes32[]", + "name": "siblings", + "type": "bytes32[]" + } + ], + "internalType": "struct Lib_OVMCodec.ChainInclusionProof", + "name": "stateRootProof", + "type": "tuple" + }, + { + "internalType": "bytes", + "name": "stateTrieWitness", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "storageTrieWitness", + "type": "bytes" + } + ], + "internalType": "struct iOVM_L1CrossDomainMessenger.L2MessageInclusionProof", + "name": "_proof", + "type": "tuple" + } + ], + "name": "relayMessage", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "name": "relayedMessages", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_target", + "type": "address" + }, + { + "internalType": "address", + "name": "_sender", + "type": "address" + }, + { + "internalType": "bytes", + "name": "_message", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "_messageNonce", + "type": "uint256" + }, + { + "internalType": "uint32", + "name": "_gasLimit", + "type": "uint32" + } + ], + "name": "replayMessage", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "_name", + "type": "string" + } + ], + "name": "resolve", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_target", + "type": "address" + }, + { + "internalType": "bytes", + "name": "_message", + "type": "bytes" + }, + { + "internalType": "uint32", + "name": "_gasLimit", + "type": "uint32" + } + ], + "name": "sendMessage", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "name": "sentMessages", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "name": "successfulMessages", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "xDomainMessageSender", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "transactionHash": "0x1fb0b55a40eda69d78843a052c4874a608d32099c0bea4eefd52a100543ae5ed", + "receipt": { + "to": null, + "from": "0x18394B52d3Cb931dfA76F63251919D051953413d", + "contractAddress": "0xa9D9045E4A753c856Fc0053369E780f23559E0A1", + "transactionIndex": 0, + "gasUsed": "2795220", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0xea435110780744f5598fc90e58d58c96add2c612a30faface1580cf6aaf66882", + "transactionHash": "0x1fb0b55a40eda69d78843a052c4874a608d32099c0bea4eefd52a100543ae5ed", + "logs": [], + "blockNumber": 24572827, + "cumulativeGasUsed": "2795220", + "status": 1, + "byzantium": true + }, + "args": [], + "solcInputHash": "5ee8e508e2c54cb5ac6783b4855b1558", + "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"msgHash\",\"type\":\"bytes32\"}],\"name\":\"FailedRelayedMessage\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"_xDomainCalldataHash\",\"type\":\"bytes32\"}],\"name\":\"MessageAllowed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"_xDomainCalldataHash\",\"type\":\"bytes32\"}],\"name\":\"MessageBlocked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Paused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"msgHash\",\"type\":\"bytes32\"}],\"name\":\"RelayedMessage\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"}],\"name\":\"SentMessage\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Unpaused\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_xDomainCalldataHash\",\"type\":\"bytes32\"}],\"name\":\"allowMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_xDomainCalldataHash\",\"type\":\"bytes32\"}],\"name\":\"blockMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"blockedMessages\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"messageNonce\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"paused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_sender\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_message\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"_messageNonce\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"stateRootBatchHeader\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"siblings\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct Lib_OVMCodec.ChainInclusionProof\",\"name\":\"stateRootProof\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"stateTrieWitness\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"storageTrieWitness\",\"type\":\"bytes\"}],\"internalType\":\"struct iOVM_L1CrossDomainMessenger.L2MessageInclusionProof\",\"name\":\"_proof\",\"type\":\"tuple\"}],\"name\":\"relayMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"relayedMessages\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_sender\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_message\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"_messageNonce\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"_gasLimit\",\"type\":\"uint32\"}],\"name\":\"replayMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_message\",\"type\":\"bytes\"},{\"internalType\":\"uint32\",\"name\":\"_gasLimit\",\"type\":\"uint32\"}],\"name\":\"sendMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"sentMessages\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"successfulMessages\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"xDomainMessageSender\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The L1 Cross Domain Messenger contract sends messages from L1 to L2, and relays messages from L2 onto L1. In the event that a message sent from L1 to L2 is rejected for exceeding the L2 epoch gas limit, it can be resubmitted via this contract's replay function. Compiler used: solc Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"allowMessage(bytes32)\":{\"params\":{\"_xDomainCalldataHash\":\"Hash of the message to block.\"}},\"blockMessage(bytes32)\":{\"params\":{\"_xDomainCalldataHash\":\"Hash of the message to block.\"}},\"initialize(address)\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"paused()\":{\"details\":\"Returns true if the contract is paused, and false otherwise.\"},\"relayMessage(address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))\":{\"params\":{\"_message\":\"Message to send to the target.\",\"_messageNonce\":\"Nonce for the provided message.\",\"_proof\":\"Inclusion proof for the given message.\",\"_sender\":\"Message sender address.\",\"_target\":\"Target contract address.\"}},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner.\"},\"replayMessage(address,address,bytes,uint256,uint32)\":{\"params\":{\"_gasLimit\":\"Gas limit for the provided message.\",\"_message\":\"Message to send to the target.\",\"_messageNonce\":\"Nonce for the provided message.\",\"_sender\":\"Original sender address.\",\"_target\":\"Target contract address.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}},\"sendMessage(address,bytes,uint32)\":{\"params\":{\"_gasLimit\":\"Gas limit for the provided message.\",\"_message\":\"Message to send to the target.\",\"_target\":\"Target contract address.\"}},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"}},\"title\":\"OVM_L1CrossDomainMessenger\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"allowMessage(bytes32)\":{\"notice\":\"Allow a message.\"},\"blockMessage(bytes32)\":{\"notice\":\"Block a message.\"},\"constructor\":{\"notice\":\"This contract is intended to be behind a delegate proxy. We pass the zero address to the address resolver just to satisfy the constructor. We still need to set this value in initialize().\"},\"pause()\":{\"notice\":\"Pause relaying.\"},\"relayMessage(address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))\":{\"notice\":\"Relays a cross domain message to a contract.\"},\"replayMessage(address,address,bytes,uint256,uint32)\":{\"notice\":\"Replays a cross domain message to the target messenger.\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"},\"sendMessage(address,bytes,uint32)\":{\"notice\":\"Sends a cross domain message to the target messenger.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1CrossDomainMessenger.sol\":\"OVM_L1CrossDomainMessenger\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../utils/ContextUpgradeable.sol\\\";\\nimport \\\"../proxy/Initializable.sol\\\";\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n function __Ownable_init() internal initializer {\\n __Context_init_unchained();\\n __Ownable_init_unchained();\\n }\\n\\n function __Ownable_init_unchained() internal initializer {\\n address msgSender = _msgSender();\\n _owner = msgSender;\\n emit OwnershipTransferred(address(0), msgSender);\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n emit OwnershipTransferred(_owner, address(0));\\n _owner = address(0);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n emit OwnershipTransferred(_owner, newOwner);\\n _owner = newOwner;\\n }\\n uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0xb419e68addcb82ecda3ad3974b0d2db76435ce9b08435a04d5b119a0c5d45ea5\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\n// solhint-disable-next-line compiler-version\\npragma solidity >=0.4.24 <0.8.0;\\n\\nimport \\\"../utils/AddressUpgradeable.sol\\\";\\n\\n/**\\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\\n * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an\\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\\n *\\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\\n * possible by providing the encoded function call as the `_data` argument to {UpgradeableProxy-constructor}.\\n *\\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\\n */\\nabstract contract Initializable {\\n\\n /**\\n * @dev Indicates that the contract has been initialized.\\n */\\n bool private _initialized;\\n\\n /**\\n * @dev Indicates that the contract is in the process of being initialized.\\n */\\n bool private _initializing;\\n\\n /**\\n * @dev Modifier to protect an initializer function from being invoked twice.\\n */\\n modifier initializer() {\\n require(_initializing || _isConstructor() || !_initialized, \\\"Initializable: contract is already initialized\\\");\\n\\n bool isTopLevelCall = !_initializing;\\n if (isTopLevelCall) {\\n _initializing = true;\\n _initialized = true;\\n }\\n\\n _;\\n\\n if (isTopLevelCall) {\\n _initializing = false;\\n }\\n }\\n\\n /// @dev Returns true if and only if the function is running in the constructor\\n function _isConstructor() private view returns (bool) {\\n return !AddressUpgradeable.isContract(address(this));\\n }\\n}\\n\",\"keccak256\":\"0xd8e4eb08dcc1d1860fb347ba5ffd595242b9a1b66d49a47f2b4cb51c3f35017e\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.2 <0.8.0;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary AddressUpgradeable {\\n /**\\n * @dev Returns true if `account` is a contract.\\n *\\n * [IMPORTANT]\\n * ====\\n * It is unsafe to assume that an address for which this function returns\\n * false is an externally-owned account (EOA) and not a contract.\\n *\\n * Among others, `isContract` will return false for the following\\n * types of addresses:\\n *\\n * - an externally-owned account\\n * - a contract in construction\\n * - an address where a contract will be created\\n * - an address where a contract lived, but was destroyed\\n * ====\\n */\\n function isContract(address account) internal view returns (bool) {\\n // This method relies on extcodesize, which returns 0 for contracts in\\n // construction, since the code is only stored at the end of the\\n // constructor execution.\\n\\n uint256 size;\\n // solhint-disable-next-line no-inline-assembly\\n assembly { size := extcodesize(account) }\\n return size > 0;\\n }\\n\\n /**\\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n * `recipient`, forwarding all available gas and reverting on errors.\\n *\\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n * imposed by `transfer`, making them unable to receive funds via\\n * `transfer`. {sendValue} removes this limitation.\\n *\\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n *\\n * IMPORTANT: because control is transferred to `recipient`, care must be\\n * taken to not create reentrancy vulnerabilities. Consider using\\n * {ReentrancyGuard} or the\\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n */\\n function sendValue(address payable recipient, uint256 amount) internal {\\n require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n // solhint-disable-next-line avoid-low-level-calls, avoid-call-value\\n (bool success, ) = recipient.call{ value: amount }(\\\"\\\");\\n require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n }\\n\\n /**\\n * @dev Performs a Solidity function call using a low level `call`. A\\n * plain`call` is an unsafe replacement for a function call: use this\\n * function instead.\\n *\\n * If `target` reverts with a revert reason, it is bubbled up by this\\n * function (like regular Solidity function calls).\\n *\\n * Returns the raw returned data. To convert to the expected return value,\\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n *\\n * Requirements:\\n *\\n * - `target` must be a contract.\\n * - calling `target` with `data` must not revert.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionCall(target, data, \\\"Address: low-level call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n * `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but also transferring `value` wei to `target`.\\n *\\n * Requirements:\\n *\\n * - the calling contract must have an ETH balance of at least `value`.\\n * - the called Solidity function must be `payable`.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n * with `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {\\n require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n require(isContract(target), \\\"Address: call to non-contract\\\");\\n\\n // solhint-disable-next-line avoid-low-level-calls\\n (bool success, bytes memory returndata) = target.call{ value: value }(data);\\n return _verifyCallResult(success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {\\n require(isContract(target), \\\"Address: static call to non-contract\\\");\\n\\n // solhint-disable-next-line avoid-low-level-calls\\n (bool success, bytes memory returndata) = target.staticcall(data);\\n return _verifyCallResult(success, returndata, errorMessage);\\n }\\n\\n function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {\\n if (success) {\\n return returndata;\\n } else {\\n // Look for revert reason and bubble it up if present\\n if (returndata.length > 0) {\\n // The easiest way to bubble the revert reason is using memory via assembly\\n\\n // solhint-disable-next-line no-inline-assembly\\n assembly {\\n let returndata_size := mload(returndata)\\n revert(add(32, returndata), returndata_size)\\n }\\n } else {\\n revert(errorMessage);\\n }\\n }\\n }\\n}\\n\",\"keccak256\":\"0xfc5ea91fa9ceb1961023b2a6c978b902888c52b90847ac7813fe3b79524165f6\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with GSN meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract ContextUpgradeable is Initializable {\\n function __Context_init() internal initializer {\\n __Context_init_unchained();\\n }\\n\\n function __Context_init_unchained() internal initializer {\\n }\\n function _msgSender() internal view virtual returns (address payable) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes memory) {\\n this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n return msg.data;\\n }\\n uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0xbbf8a21b9a66c48d45ff771b8563c6df19ba451d63dfb8380a865c1e1f29d1a0\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"./ContextUpgradeable.sol\\\";\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev Contract module which allows children to implement an emergency stop\\n * mechanism that can be triggered by an authorized account.\\n *\\n * This module is used through inheritance. It will make available the\\n * modifiers `whenNotPaused` and `whenPaused`, which can be applied to\\n * the functions of your contract. Note that they will not be pausable by\\n * simply including this module, only once the modifiers are put in place.\\n */\\nabstract contract PausableUpgradeable is Initializable, ContextUpgradeable {\\n /**\\n * @dev Emitted when the pause is triggered by `account`.\\n */\\n event Paused(address account);\\n\\n /**\\n * @dev Emitted when the pause is lifted by `account`.\\n */\\n event Unpaused(address account);\\n\\n bool private _paused;\\n\\n /**\\n * @dev Initializes the contract in unpaused state.\\n */\\n function __Pausable_init() internal initializer {\\n __Context_init_unchained();\\n __Pausable_init_unchained();\\n }\\n\\n function __Pausable_init_unchained() internal initializer {\\n _paused = false;\\n }\\n\\n /**\\n * @dev Returns true if the contract is paused, and false otherwise.\\n */\\n function paused() public view virtual returns (bool) {\\n return _paused;\\n }\\n\\n /**\\n * @dev Modifier to make a function callable only when the contract is not paused.\\n *\\n * Requirements:\\n *\\n * - The contract must not be paused.\\n */\\n modifier whenNotPaused() {\\n require(!paused(), \\\"Pausable: paused\\\");\\n _;\\n }\\n\\n /**\\n * @dev Modifier to make a function callable only when the contract is paused.\\n *\\n * Requirements:\\n *\\n * - The contract must be paused.\\n */\\n modifier whenPaused() {\\n require(paused(), \\\"Pausable: not paused\\\");\\n _;\\n }\\n\\n /**\\n * @dev Triggers stopped state.\\n *\\n * Requirements:\\n *\\n * - The contract must not be paused.\\n */\\n function _pause() internal virtual whenNotPaused {\\n _paused = true;\\n emit Paused(_msgSender());\\n }\\n\\n /**\\n * @dev Returns to normal state.\\n *\\n * Requirements:\\n *\\n * - The contract must be paused.\\n */\\n function _unpause() internal virtual whenPaused {\\n _paused = false;\\n emit Unpaused(_msgSender());\\n }\\n uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0x73bef0a5dec3efde8183c4858d90f683ed2771656c4329647b4d5b0f89498fd5\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev Contract module that helps prevent reentrant calls to a function.\\n *\\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\\n * available, which can be applied to functions to make sure there are no nested\\n * (reentrant) calls to them.\\n *\\n * Note that because there is a single `nonReentrant` guard, functions marked as\\n * `nonReentrant` may not call one another. This can be worked around by making\\n * those functions `private`, and then adding `external` `nonReentrant` entry\\n * points to them.\\n *\\n * TIP: If you would like to learn more about reentrancy and alternative ways\\n * to protect against it, check out our blog post\\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\\n */\\nabstract contract ReentrancyGuardUpgradeable is Initializable {\\n // Booleans are more expensive than uint256 or any type that takes up a full\\n // word because each write operation emits an extra SLOAD to first read the\\n // slot's contents, replace the bits taken up by the boolean, and then write\\n // back. This is the compiler's defense against contract upgrades and\\n // pointer aliasing, and it cannot be disabled.\\n\\n // The values being non-zero value makes deployment a bit more expensive,\\n // but in exchange the refund on every call to nonReentrant will be lower in\\n // amount. Since refunds are capped to a percentage of the total\\n // transaction's gas, it is best to keep them low in cases like this one, to\\n // increase the likelihood of the full refund coming into effect.\\n uint256 private constant _NOT_ENTERED = 1;\\n uint256 private constant _ENTERED = 2;\\n\\n uint256 private _status;\\n\\n function __ReentrancyGuard_init() internal initializer {\\n __ReentrancyGuard_init_unchained();\\n }\\n\\n function __ReentrancyGuard_init_unchained() internal initializer {\\n _status = _NOT_ENTERED;\\n }\\n\\n /**\\n * @dev Prevents a contract from calling itself, directly or indirectly.\\n * Calling a `nonReentrant` function from another `nonReentrant`\\n * function is not supported. It is possible to prevent this from happening\\n * by making the `nonReentrant` function external, and make it call a\\n * `private` function that does the actual work.\\n */\\n modifier nonReentrant() {\\n // On the first call to nonReentrant, _notEntered will be true\\n require(_status != _ENTERED, \\\"ReentrancyGuard: reentrant call\\\");\\n\\n // Any calls to nonReentrant after this point will fail\\n _status = _ENTERED;\\n\\n _;\\n\\n // By storing the original value once again, a refund is triggered (see\\n // https://eips.ethereum.org/EIPS/eip-2200)\\n _status = _NOT_ENTERED;\\n }\\n uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0x46034cd5cca740f636345c8f7aebae0f78adfd4b70e31e6f888cccbe1086586e\",\"license\":\"MIT\"},\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor () internal {\\n address msgSender = _msgSender();\\n _owner = msgSender;\\n emit OwnershipTransferred(address(0), msgSender);\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n emit OwnershipTransferred(_owner, address(0));\\n _owner = address(0);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n emit OwnershipTransferred(_owner, newOwner);\\n _owner = newOwner;\\n }\\n}\\n\",\"keccak256\":\"0x15e2d5bd4c28a88548074c54d220e8086f638a71ed07e6b3ba5a70066fcf458d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with GSN meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address payable) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes memory) {\\n this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x8d3cb350f04ff49cfb10aef08d87f19dcbaecc8027b0bed12f3275cd12f38cf0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/bridge/messaging/Abs_BaseCrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Interface Imports */\\nimport { iAbs_BaseCrossDomainMessenger } from \\\"../../../iOVM/bridge/messaging/iAbs_BaseCrossDomainMessenger.sol\\\";\\n\\n/**\\n * @title Abs_BaseCrossDomainMessenger\\n * @dev The Base Cross Domain Messenger is an abstract contract providing the interface and common\\n * functionality used in the L1 and L2 Cross Domain Messengers. It can also serve as a template for\\n * developers wishing to implement a custom bridge contract to suit their needs.\\n *\\n * Compiler used: defined by child contract\\n * Runtime target: defined by child contract\\n */\\nabstract contract Abs_BaseCrossDomainMessenger is iAbs_BaseCrossDomainMessenger {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n // The default x-domain message sender being set to a non-zero value makes\\n // deployment a bit more expensive, but in exchange the refund on every call to\\n // `relayMessage` by the L1 and L2 messengers will be higher.\\n address internal constant DEFAULT_XDOMAIN_SENDER = 0x000000000000000000000000000000000000dEaD;\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping (bytes32 => bool) public relayedMessages;\\n mapping (bytes32 => bool) public successfulMessages;\\n mapping (bytes32 => bool) public sentMessages;\\n uint256 public messageNonce;\\n address internal xDomainMsgSender = DEFAULT_XDOMAIN_SENDER;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n constructor() {}\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function xDomainMessageSender()\\n public\\n override\\n view\\n returns (\\n address\\n )\\n {\\n require(xDomainMsgSender != DEFAULT_XDOMAIN_SENDER, \\\"xDomainMessageSender is not set\\\");\\n return xDomainMsgSender;\\n }\\n\\n /**\\n * Sends a cross domain message to the target messenger.\\n * @param _target Target contract address.\\n * @param _message Message to send to the target.\\n * @param _gasLimit Gas limit for the provided message.\\n */\\n function sendMessage(\\n address _target,\\n bytes memory _message,\\n uint32 _gasLimit\\n )\\n override\\n public\\n {\\n bytes memory xDomainCalldata = _getXDomainCalldata(\\n _target,\\n msg.sender,\\n _message,\\n messageNonce\\n );\\n\\n messageNonce += 1;\\n sentMessages[keccak256(xDomainCalldata)] = true;\\n\\n _sendXDomainMessage(xDomainCalldata, _gasLimit);\\n emit SentMessage(xDomainCalldata);\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Generates the correct cross domain calldata for a message.\\n * @param _target Target contract address.\\n * @param _sender Message sender address.\\n * @param _message Message to send to the target.\\n * @param _messageNonce Nonce for the provided message.\\n * @return ABI encoded cross domain calldata.\\n */\\n function _getXDomainCalldata(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _messageNonce\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return abi.encodeWithSignature(\\n \\\"relayMessage(address,address,bytes,uint256)\\\",\\n _target,\\n _sender,\\n _message,\\n _messageNonce\\n );\\n }\\n\\n /**\\n * Sends a cross domain message.\\n * param // Message to send.\\n * param // Gas limit for the provided message.\\n */\\n function _sendXDomainMessage(\\n bytes memory, // _message,\\n uint256 // _gasLimit\\n )\\n virtual\\n internal\\n {\\n revert(\\\"Implement me in child contracts!\\\");\\n }\\n}\\n\",\"keccak256\":\"0xed5dafa41fadfd461e33c042da3a721f2cce73e0d2418d170a44161f7714a439\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1CrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../../libraries/resolver/Lib_AddressResolver.sol\\\";\\nimport { Lib_AddressManager } from \\\"../../../libraries/resolver/Lib_AddressManager.sol\\\";\\nimport { Lib_SecureMerkleTrie } from \\\"../../../libraries/trie/Lib_SecureMerkleTrie.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_L1CrossDomainMessenger } from \\\"../../../iOVM/bridge/messaging/iOVM_L1CrossDomainMessenger.sol\\\";\\nimport { iOVM_CanonicalTransactionChain } from \\\"../../../iOVM/chain/iOVM_CanonicalTransactionChain.sol\\\";\\nimport { iOVM_StateCommitmentChain } from \\\"../../../iOVM/chain/iOVM_StateCommitmentChain.sol\\\";\\n\\n/* Contract Imports */\\nimport { Abs_BaseCrossDomainMessenger } from \\\"./Abs_BaseCrossDomainMessenger.sol\\\";\\n\\n/* External Imports */\\nimport { OwnableUpgradeable } from \\\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\\\";\\nimport { PausableUpgradeable } from \\\"@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol\\\";\\nimport { ReentrancyGuardUpgradeable } from \\\"@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol\\\";\\n\\n/**\\n * @title OVM_L1CrossDomainMessenger\\n * @dev The L1 Cross Domain Messenger contract sends messages from L1 to L2, and relays messages\\n * from L2 onto L1. In the event that a message sent from L1 to L2 is rejected for exceeding the L2\\n * epoch gas limit, it can be resubmitted via this contract's replay function.\\n *\\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract OVM_L1CrossDomainMessenger is\\n iOVM_L1CrossDomainMessenger,\\n Abs_BaseCrossDomainMessenger,\\n Lib_AddressResolver,\\n OwnableUpgradeable,\\n PausableUpgradeable,\\n ReentrancyGuardUpgradeable\\n{\\n\\n /**********\\n * Events *\\n **********/\\n\\n event MessageBlocked(\\n bytes32 indexed _xDomainCalldataHash\\n );\\n\\n event MessageAllowed(\\n bytes32 indexed _xDomainCalldataHash\\n );\\n\\n /**********************\\n * Contract Variables *\\n **********************/\\n\\n mapping (bytes32 => bool) public blockedMessages;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * This contract is intended to be behind a delegate proxy.\\n * We pass the zero address to the address resolver just to satisfy the constructor.\\n * We still need to set this value in initialize().\\n */\\n constructor()\\n Lib_AddressResolver(address(0))\\n {}\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n /**\\n * Modifier to enforce that, if configured, only the OVM_L2MessageRelayer contract may\\n * successfully call a method.\\n */\\n modifier onlyRelayer() {\\n address relayer = resolve(\\\"OVM_L2MessageRelayer\\\");\\n if (relayer != address(0)) {\\n require(\\n msg.sender == relayer,\\n \\\"Only OVM_L2MessageRelayer can relay L2-to-L1 messages.\\\"\\n );\\n }\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n */\\n function initialize(\\n address _libAddressManager\\n )\\n public\\n initializer\\n {\\n require(\\n address(libAddressManager) == address(0),\\n \\\"L1CrossDomainMessenger already intialized.\\\"\\n );\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n xDomainMsgSender = DEFAULT_XDOMAIN_SENDER;\\n\\n // Initialize upgradable OZ contracts\\n __Context_init_unchained(); // Context is a dependency for both Ownable and Pausable\\n __Ownable_init_unchained();\\n __Pausable_init_unchained();\\n __ReentrancyGuard_init_unchained();\\n }\\n\\n /**\\n * Pause relaying.\\n */\\n function pause()\\n external\\n onlyOwner\\n {\\n _pause();\\n }\\n\\n /**\\n * Block a message.\\n * @param _xDomainCalldataHash Hash of the message to block.\\n */\\n function blockMessage(\\n bytes32 _xDomainCalldataHash\\n )\\n external\\n onlyOwner\\n {\\n blockedMessages[_xDomainCalldataHash] = true;\\n emit MessageBlocked(_xDomainCalldataHash);\\n }\\n\\n /**\\n * Allow a message.\\n * @param _xDomainCalldataHash Hash of the message to block.\\n */\\n function allowMessage(\\n bytes32 _xDomainCalldataHash\\n )\\n external\\n onlyOwner\\n {\\n blockedMessages[_xDomainCalldataHash] = false;\\n emit MessageAllowed(_xDomainCalldataHash);\\n }\\n\\n /**\\n * Relays a cross domain message to a contract.\\n * @inheritdoc iOVM_L1CrossDomainMessenger\\n */\\n function relayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _messageNonce,\\n L2MessageInclusionProof memory _proof\\n )\\n override\\n public\\n nonReentrant\\n onlyRelayer\\n whenNotPaused\\n {\\n bytes memory xDomainCalldata = _getXDomainCalldata(\\n _target,\\n _sender,\\n _message,\\n _messageNonce\\n );\\n\\n require(\\n _verifyXDomainMessage(\\n xDomainCalldata,\\n _proof\\n ) == true,\\n \\\"Provided message could not be verified.\\\"\\n );\\n\\n bytes32 xDomainCalldataHash = keccak256(xDomainCalldata);\\n\\n require(\\n successfulMessages[xDomainCalldataHash] == false,\\n \\\"Provided message has already been received.\\\"\\n );\\n\\n require(\\n blockedMessages[xDomainCalldataHash] == false,\\n \\\"Provided message has been blocked.\\\"\\n );\\n\\n xDomainMsgSender = _sender;\\n (bool success, ) = _target.call(_message);\\n xDomainMsgSender = DEFAULT_XDOMAIN_SENDER;\\n\\n // Mark the message as received if the call was successful. Ensures that a message can be\\n // relayed multiple times in the case that the call reverted.\\n if (success == true) {\\n successfulMessages[xDomainCalldataHash] = true;\\n emit RelayedMessage(xDomainCalldataHash);\\n } else {\\n emit FailedRelayedMessage(xDomainCalldataHash);\\n }\\n\\n // Store an identifier that can be used to prove that the given message was relayed by some\\n // user. Gives us an easy way to pay relayers for their work.\\n bytes32 relayId = keccak256(\\n abi.encodePacked(\\n xDomainCalldata,\\n msg.sender,\\n block.number\\n )\\n );\\n relayedMessages[relayId] = true;\\n }\\n\\n /**\\n * Replays a cross domain message to the target messenger.\\n * @inheritdoc iOVM_L1CrossDomainMessenger\\n */\\n function replayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _messageNonce,\\n uint32 _gasLimit\\n )\\n override\\n public\\n {\\n bytes memory xDomainCalldata = _getXDomainCalldata(\\n _target,\\n _sender,\\n _message,\\n _messageNonce\\n );\\n\\n require(\\n sentMessages[keccak256(xDomainCalldata)] == true,\\n \\\"Provided message has not already been sent.\\\"\\n );\\n\\n _sendXDomainMessage(xDomainCalldata, _gasLimit);\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Verifies that the given message is valid.\\n * @param _xDomainCalldata Calldata to verify.\\n * @param _proof Inclusion proof for the message.\\n * @return Whether or not the provided message is valid.\\n */\\n function _verifyXDomainMessage(\\n bytes memory _xDomainCalldata,\\n L2MessageInclusionProof memory _proof\\n )\\n internal\\n view\\n returns (\\n bool\\n )\\n {\\n return (\\n _verifyStateRootProof(_proof)\\n && _verifyStorageProof(_xDomainCalldata, _proof)\\n );\\n }\\n\\n /**\\n * Verifies that the state root within an inclusion proof is valid.\\n * @param _proof Message inclusion proof.\\n * @return Whether or not the provided proof is valid.\\n */\\n function _verifyStateRootProof(\\n L2MessageInclusionProof memory _proof\\n )\\n internal\\n view\\n returns (\\n bool\\n )\\n {\\n iOVM_StateCommitmentChain ovmStateCommitmentChain = iOVM_StateCommitmentChain(\\n resolve(\\\"OVM_StateCommitmentChain\\\")\\n );\\n\\n return (\\n ovmStateCommitmentChain.insideFraudProofWindow(_proof.stateRootBatchHeader) == false\\n && ovmStateCommitmentChain.verifyStateCommitment(\\n _proof.stateRoot,\\n _proof.stateRootBatchHeader,\\n _proof.stateRootProof\\n )\\n );\\n }\\n\\n /**\\n * Verifies that the storage proof within an inclusion proof is valid.\\n * @param _xDomainCalldata Encoded message calldata.\\n * @param _proof Message inclusion proof.\\n * @return Whether or not the provided proof is valid.\\n */\\n function _verifyStorageProof(\\n bytes memory _xDomainCalldata,\\n L2MessageInclusionProof memory _proof\\n )\\n internal\\n view\\n returns (\\n bool\\n )\\n {\\n bytes32 storageKey = keccak256(\\n abi.encodePacked(\\n keccak256(\\n abi.encodePacked(\\n _xDomainCalldata,\\n resolve(\\\"OVM_L2CrossDomainMessenger\\\")\\n )\\n ),\\n uint256(0)\\n )\\n );\\n\\n (\\n bool exists,\\n bytes memory encodedMessagePassingAccount\\n ) = Lib_SecureMerkleTrie.get(\\n abi.encodePacked(0x4200000000000000000000000000000000000000),\\n _proof.stateTrieWitness,\\n _proof.stateRoot\\n );\\n\\n require(\\n exists == true,\\n \\\"Message passing predeploy has not been initialized or invalid proof provided.\\\"\\n );\\n\\n Lib_OVMCodec.EVMAccount memory account = Lib_OVMCodec.decodeEVMAccount(\\n encodedMessagePassingAccount\\n );\\n\\n return Lib_SecureMerkleTrie.verifyInclusionProof(\\n abi.encodePacked(storageKey),\\n abi.encodePacked(uint8(1)),\\n _proof.storageTrieWitness,\\n account.storageRoot\\n );\\n }\\n\\n /**\\n * Sends a cross domain message.\\n * @param _message Message to send.\\n * @param _gasLimit OVM gas limit for the message.\\n */\\n function _sendXDomainMessage(\\n bytes memory _message,\\n uint256 _gasLimit\\n )\\n override\\n internal\\n {\\n iOVM_CanonicalTransactionChain(resolve(\\\"OVM_CanonicalTransactionChain\\\")).enqueue(\\n resolve(\\\"OVM_L2CrossDomainMessenger\\\"),\\n _gasLimit,\\n _message\\n );\\n }\\n}\\n\",\"keccak256\":\"0xba49f550a93c91448340fdb85ad8e4d4dff523532eb1524add38ee2825cc0442\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/bridge/messaging/iAbs_BaseCrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/**\\n * @title iAbs_BaseCrossDomainMessenger\\n */\\ninterface iAbs_BaseCrossDomainMessenger {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event SentMessage(bytes message);\\n event RelayedMessage(bytes32 msgHash);\\n event FailedRelayedMessage(bytes32 msgHash);\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n function xDomainMessageSender() external view returns (address);\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sends a cross domain message to the target messenger.\\n * @param _target Target contract address.\\n * @param _message Message to send to the target.\\n * @param _gasLimit Gas limit for the provided message.\\n */\\n function sendMessage(\\n address _target,\\n bytes calldata _message,\\n uint32 _gasLimit\\n ) external;\\n}\\n\",\"keccak256\":\"0x89981ed48e99d6939cc6cdef827d484fa3e2292d66c0ba5056c7050cb6282d7e\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/bridge/messaging/iOVM_L1CrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { iAbs_BaseCrossDomainMessenger } from \\\"./iAbs_BaseCrossDomainMessenger.sol\\\";\\n\\n/**\\n * @title iOVM_L1CrossDomainMessenger\\n */\\ninterface iOVM_L1CrossDomainMessenger is iAbs_BaseCrossDomainMessenger {\\n\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n struct L2MessageInclusionProof {\\n bytes32 stateRoot;\\n Lib_OVMCodec.ChainBatchHeader stateRootBatchHeader;\\n Lib_OVMCodec.ChainInclusionProof stateRootProof;\\n bytes stateTrieWitness;\\n bytes storageTrieWitness;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Relays a cross domain message to a contract.\\n * @param _target Target contract address.\\n * @param _sender Message sender address.\\n * @param _message Message to send to the target.\\n * @param _messageNonce Nonce for the provided message.\\n * @param _proof Inclusion proof for the given message.\\n */\\n function relayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _messageNonce,\\n L2MessageInclusionProof memory _proof\\n ) external;\\n\\n /**\\n * Replays a cross domain message to the target messenger.\\n * @param _target Target contract address.\\n * @param _sender Original sender address.\\n * @param _message Message to send to the target.\\n * @param _messageNonce Nonce for the provided message.\\n * @param _gasLimit Gas limit for the provided message.\\n */\\n function replayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _messageNonce,\\n uint32 _gasLimit\\n ) external;\\n}\\n\",\"keccak256\":\"0xdcd239d0b215e400674d78e8db4ac12ba18efc34fa78e24c2ff867f61062dba2\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_CanonicalTransactionChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_ChainStorageContainer } from \\\"./iOVM_ChainStorageContainer.sol\\\";\\n\\n/**\\n * @title iOVM_CanonicalTransactionChain\\n */\\ninterface iOVM_CanonicalTransactionChain {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event TransactionEnqueued(\\n address _l1TxOrigin,\\n address _target,\\n uint256 _gasLimit,\\n bytes _data,\\n uint256 _queueIndex,\\n uint256 _timestamp\\n );\\n\\n event QueueBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event SequencerBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event TransactionBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct BatchContext {\\n uint256 numSequencedTransactions;\\n uint256 numSubsequentQueueTransactions;\\n uint256 timestamp;\\n uint256 blockNumber;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n\\n /**\\n * Accesses the batch storage container.\\n * @return Reference to the batch storage container.\\n */\\n function batches()\\n external\\n view\\n returns (\\n iOVM_ChainStorageContainer\\n );\\n\\n /**\\n * Accesses the queue storage container.\\n * @return Reference to the queue storage container.\\n */\\n function queue()\\n external\\n view\\n returns (\\n iOVM_ChainStorageContainer\\n );\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements()\\n external\\n view\\n returns (\\n uint256 _totalElements\\n );\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches()\\n external\\n view\\n returns (\\n uint256 _totalBatches\\n );\\n\\n /**\\n * Returns the index of the next element to be enqueued.\\n * @return Index for the next queue element.\\n */\\n function getNextQueueIndex()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Gets the queue element at a particular index.\\n * @param _index Index of the queue element to access.\\n * @return _element Queue element at the given index.\\n */\\n function getQueueElement(\\n uint256 _index\\n )\\n external\\n view\\n returns (\\n Lib_OVMCodec.QueueElement memory _element\\n );\\n\\n /**\\n * Returns the timestamp of the last transaction.\\n * @return Timestamp for the last transaction.\\n */\\n function getLastTimestamp()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Returns the blocknumber of the last transaction.\\n * @return Blocknumber for the last transaction.\\n */\\n function getLastBlockNumber()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Get the number of queue elements which have not yet been included.\\n * @return Number of pending queue elements.\\n */\\n function getNumPendingQueueElements()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Retrieves the length of the queue, including\\n * both pending and canonical transactions.\\n * @return Length of the queue.\\n */\\n function getQueueLength()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n\\n /**\\n * Adds a transaction to the queue.\\n * @param _target Target contract to send the transaction to.\\n * @param _gasLimit Gas limit for the given transaction.\\n * @param _data Transaction data.\\n */\\n function enqueue(\\n address _target,\\n uint256 _gasLimit,\\n bytes memory _data\\n )\\n external;\\n\\n /**\\n * Appends a given number of queued transactions as a single batch.\\n * @param _numQueuedTransactions Number of transactions to append.\\n */\\n function appendQueueBatch(\\n uint256 _numQueuedTransactions\\n )\\n external;\\n\\n /**\\n * Allows the sequencer to append a batch of transactions.\\n * @dev This function uses a custom encoding scheme for efficiency reasons.\\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\\n * .param _contexts Array of batch contexts.\\n * .param _transactionDataFields Array of raw transaction data.\\n */\\n function appendSequencerBatch(\\n // uint40 _shouldStartAtElement,\\n // uint24 _totalElementsToAppend,\\n // BatchContext[] _contexts,\\n // bytes[] _transactionDataFields\\n )\\n external;\\n\\n /**\\n * Verifies whether a transaction is included in the chain.\\n * @param _transaction Transaction to verify.\\n * @param _txChainElement Transaction chain element corresponding to the transaction.\\n * @param _batchHeader Header of the batch the transaction was included in.\\n * @param _inclusionProof Inclusion proof for the provided transaction chain element.\\n * @return True if the transaction exists in the CTC, false if not.\\n */\\n function verifyTransaction(\\n Lib_OVMCodec.Transaction memory _transaction,\\n Lib_OVMCodec.TransactionChainElement memory _txChainElement,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _inclusionProof\\n )\\n external\\n view\\n returns (\\n bool\\n );\\n}\\n\",\"keccak256\":\"0xb5e55488a1982841c07cdf5ff475da4789596f111dd48f01b1918ee4c775cf3a\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_ChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title iOVM_ChainStorageContainer\\n */\\ninterface iOVM_ChainStorageContainer {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata()\\n external\\n view\\n returns (\\n bytes27\\n );\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length()\\n external\\n view\\n returns (\\n uint256\\n );\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(\\n bytes32 _object\\n )\\n external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(\\n bytes32 _object,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(\\n uint256 _index\\n )\\n external\\n view\\n returns (\\n bytes32\\n );\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index\\n )\\n external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Marks an index as overwritable, meaing the underlying buffer can start to write values over\\n * any objects before and including the given index.\\n */\\n function setNextOverwritableIndex(\\n uint256 _index\\n )\\n external;\\n}\\n\",\"keccak256\":\"0x2d7973a0ad84c23ec62624d3f1e3aeb198cc72686ff1e6cfa17155556b320c94\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_StateCommitmentChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title iOVM_StateCommitmentChain\\n */\\ninterface iOVM_StateCommitmentChain {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event StateBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n event StateBatchDeleted(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot\\n );\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements()\\n external\\n view\\n returns (\\n uint256 _totalElements\\n );\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches()\\n external\\n view\\n returns (\\n uint256 _totalBatches\\n );\\n\\n /**\\n * Retrieves the timestamp of the last batch submitted by the sequencer.\\n * @return _lastSequencerTimestamp Last sequencer batch timestamp.\\n */\\n function getLastSequencerTimestamp()\\n external\\n view\\n returns (\\n uint256 _lastSequencerTimestamp\\n );\\n\\n /**\\n * Appends a batch of state roots to the chain.\\n * @param _batch Batch of state roots.\\n * @param _shouldStartAtElement Index of the element at which this batch should start.\\n */\\n function appendStateBatch(\\n bytes32[] calldata _batch,\\n uint256 _shouldStartAtElement\\n )\\n external;\\n\\n /**\\n * Deletes all state roots after (and including) a given batch.\\n * @param _batchHeader Header of the batch to start deleting from.\\n */\\n function deleteStateBatch(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n external;\\n\\n /**\\n * Verifies a batch inclusion proof.\\n * @param _element Hash of the element to verify a proof for.\\n * @param _batchHeader Header of the batch in which the element was included.\\n * @param _proof Merkle inclusion proof for the element.\\n */\\n function verifyStateCommitment(\\n bytes32 _element,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _proof\\n )\\n external\\n view\\n returns (\\n bool _verified\\n );\\n\\n /**\\n * Checks whether a given batch is still inside its fraud proof window.\\n * @param _batchHeader Header of the batch to check.\\n * @return _inside Whether or not the batch is inside the fraud proof window.\\n */\\n function insideFraudProofWindow(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n external\\n view\\n returns (\\n bool _inside\\n );\\n}\\n\",\"keccak256\":\"0x6646d6ff392b81aab52a7a277e91540819464751de0af5afd1962094b2e92448\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/codec/Lib_OVMCodec.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../utils/Lib_Bytes32Utils.sol\\\";\\n\\n/**\\n * @title Lib_OVMCodec\\n */\\nlibrary Lib_OVMCodec {\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum QueueOrigin {\\n SEQUENCER_QUEUE,\\n L1TOL2_QUEUE\\n }\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Account {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n address ethAddress;\\n bool isFresh;\\n }\\n\\n struct EVMAccount {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n }\\n\\n struct ChainBatchHeader {\\n uint256 batchIndex;\\n bytes32 batchRoot;\\n uint256 batchSize;\\n uint256 prevTotalElements;\\n bytes extraData;\\n }\\n\\n struct ChainInclusionProof {\\n uint256 index;\\n bytes32[] siblings;\\n }\\n\\n struct Transaction {\\n uint256 timestamp;\\n uint256 blockNumber;\\n QueueOrigin l1QueueOrigin;\\n address l1TxOrigin;\\n address entrypoint;\\n uint256 gasLimit;\\n bytes data;\\n }\\n\\n struct TransactionChainElement {\\n bool isSequenced;\\n uint256 queueIndex; // QUEUED TX ONLY\\n uint256 timestamp; // SEQUENCER TX ONLY\\n uint256 blockNumber; // SEQUENCER TX ONLY\\n bytes txData; // SEQUENCER TX ONLY\\n }\\n\\n struct QueueElement {\\n bytes32 transactionHash;\\n uint40 timestamp;\\n uint40 blockNumber;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Encodes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Encoded transaction bytes.\\n */\\n function encodeTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return abi.encodePacked(\\n _transaction.timestamp,\\n _transaction.blockNumber,\\n _transaction.l1QueueOrigin,\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n );\\n }\\n\\n /**\\n * Hashes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Hashed transaction\\n */\\n function hashTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(encodeTransaction(_transaction));\\n }\\n\\n /**\\n * Converts an OVM account to an EVM account.\\n * @param _in OVM account to convert.\\n * @return Converted EVM account.\\n */\\n function toEVMAccount(\\n Account memory _in\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n return EVMAccount({\\n nonce: _in.nonce,\\n balance: _in.balance,\\n storageRoot: _in.storageRoot,\\n codeHash: _in.codeHash\\n });\\n }\\n\\n /**\\n * @notice RLP-encodes an account state struct.\\n * @param _account Account state struct.\\n * @return RLP-encoded account state.\\n */\\n function encodeEVMAccount(\\n EVMAccount memory _account\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes[] memory raw = new bytes[](4);\\n\\n // Unfortunately we can't create this array outright because\\n // Lib_RLPWriter.writeList will reject fixed-size arrays. Assigning\\n // index-by-index circumvents this issue.\\n raw[0] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.nonce)\\n )\\n );\\n raw[1] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.balance)\\n )\\n );\\n raw[2] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.storageRoot));\\n raw[3] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.codeHash));\\n\\n return Lib_RLPWriter.writeList(raw);\\n }\\n\\n /**\\n * @notice Decodes an RLP-encoded account state into a useful struct.\\n * @param _encoded RLP-encoded account state.\\n * @return Account state struct.\\n */\\n function decodeEVMAccount(\\n bytes memory _encoded\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\\n\\n return EVMAccount({\\n nonce: Lib_RLPReader.readUint256(accountState[0]),\\n balance: Lib_RLPReader.readUint256(accountState[1]),\\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\\n });\\n }\\n\\n /**\\n * Calculates a hash for a given batch header.\\n * @param _batchHeader Header to hash.\\n * @return Hash of the header.\\n */\\n function hashBatchHeader(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(\\n abi.encode(\\n _batchHeader.batchRoot,\\n _batchHeader.batchSize,\\n _batchHeader.prevTotalElements,\\n _batchHeader.extraData\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0xd85ba2066057a2677926f484b938c7c2ef33ff3853f3b71cda252f4a54f30e05\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n public\\n onlyOwner\\n {\\n addresses[_getNameHash(_name)] = _address;\\n\\n emit AddressSet(\\n _name,\\n _address\\n );\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0x2ce671a0e004df88b136bea5a3c59d0732cea8887c8496da1d509e0200b03d7d\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(\\n address _libAddressManager\\n ) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x65981feeabff6a81783ea97d44baf988a18a86c8cb374c46fdb71819cbacc7c0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPReader.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_RLPReader\\n * @dev Adapted from \\\"RLPReader\\\" by Hamdi Allam (hamdi.allam97@gmail.com).\\n */\\nlibrary Lib_RLPReader {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 constant internal MAX_LIST_LENGTH = 32;\\n\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum RLPItemType {\\n DATA_ITEM,\\n LIST_ITEM\\n }\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct RLPItem {\\n uint256 length;\\n uint256 ptr;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts bytes to a reference to memory position and length.\\n * @param _in Input bytes to convert.\\n * @return Output memory reference.\\n */\\n function toRLPItem(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem memory\\n )\\n {\\n uint256 ptr;\\n assembly {\\n ptr := add(_in, 32)\\n }\\n\\n return RLPItem({\\n length: _in.length,\\n ptr: ptr\\n });\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n (\\n uint256 listOffset,\\n ,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.LIST_ITEM,\\n \\\"Invalid RLP list value.\\\"\\n );\\n\\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\\n // writing to the length. Since we can't know the number of RLP items without looping over\\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\\n // simply set a reasonable maximum list length and decrease the size before we finish.\\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\\n\\n uint256 itemCount = 0;\\n uint256 offset = listOffset;\\n while (offset < _in.length) {\\n require(\\n itemCount < MAX_LIST_LENGTH,\\n \\\"Provided RLP list exceeds max list length.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n ) = _decodeLength(RLPItem({\\n length: _in.length - offset,\\n ptr: _in.ptr + offset\\n }));\\n\\n out[itemCount] = RLPItem({\\n length: itemLength + itemOffset,\\n ptr: _in.ptr + offset\\n });\\n\\n itemCount += 1;\\n offset += itemOffset + itemLength;\\n }\\n\\n // Decrease the array size to match the actual item count.\\n assembly {\\n mstore(out, itemCount)\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n return readList(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes value.\\\"\\n );\\n\\n return _copy(_in.ptr, itemOffset, itemLength);\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return readBytes(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return string(readBytes(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return readString(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n require(\\n _in.length <= 33,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr + itemOffset;\\n bytes32 out;\\n assembly {\\n out := mload(ptr)\\n\\n // Shift the bytes over to match the item size.\\n if lt(itemLength, 32) {\\n out := div(out, exp(256, sub(32, itemLength)))\\n }\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return readBytes32(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return uint256(readBytes32(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return readUint256(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n require(\\n _in.length == 1,\\n \\\"Invalid RLP boolean value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 out;\\n assembly {\\n out := byte(0, mload(ptr))\\n }\\n\\n require(\\n out == 0 || out == 1,\\n \\\"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\\\"\\n );\\n\\n return out != 0;\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return readBool(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n if (_in.length == 1) {\\n return address(0);\\n }\\n\\n require(\\n _in.length == 21,\\n \\\"Invalid RLP address value.\\\"\\n );\\n\\n return address(readUint256(_in));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return readAddress(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads the raw bytes of an RLP item.\\n * @param _in RLP item to read.\\n * @return Raw RLP bytes.\\n */\\n function readRawBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in);\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Decodes the length of an RLP item.\\n * @param _in RLP item to decode.\\n * @return Offset of the encoded data.\\n * @return Length of the encoded data.\\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\\n */\\n function _decodeLength(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n uint256,\\n uint256,\\n RLPItemType\\n )\\n {\\n require(\\n _in.length > 0,\\n \\\"RLP item cannot be null.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 prefix;\\n assembly {\\n prefix := byte(0, mload(ptr))\\n }\\n\\n if (prefix <= 0x7f) {\\n // Single byte.\\n\\n return (0, 1, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xb7) {\\n // Short string.\\n\\n uint256 strLen = prefix - 0x80;\\n\\n require(\\n _in.length > strLen,\\n \\\"Invalid RLP short string.\\\"\\n );\\n\\n return (1, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xbf) {\\n // Long string.\\n uint256 lenOfStrLen = prefix - 0xb7;\\n\\n require(\\n _in.length > lenOfStrLen,\\n \\\"Invalid RLP long string length.\\\"\\n );\\n\\n uint256 strLen;\\n assembly {\\n // Pick out the string length.\\n strLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfStrLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfStrLen + strLen,\\n \\\"Invalid RLP long string.\\\"\\n );\\n\\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xf7) {\\n // Short list.\\n uint256 listLen = prefix - 0xc0;\\n\\n require(\\n _in.length > listLen,\\n \\\"Invalid RLP short list.\\\"\\n );\\n\\n return (1, listLen, RLPItemType.LIST_ITEM);\\n } else {\\n // Long list.\\n uint256 lenOfListLen = prefix - 0xf7;\\n\\n require(\\n _in.length > lenOfListLen,\\n \\\"Invalid RLP long list length.\\\"\\n );\\n\\n uint256 listLen;\\n assembly {\\n // Pick out the list length.\\n listLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfListLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfListLen + listLen,\\n \\\"Invalid RLP long list.\\\"\\n );\\n\\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\\n }\\n }\\n\\n /**\\n * Copies the bytes from a memory location.\\n * @param _src Pointer to the location to read from.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Copied bytes.\\n */\\n function _copy(\\n uint256 _src,\\n uint256 _offset,\\n uint256 _length\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out = new bytes(_length);\\n if (out.length == 0) {\\n return out;\\n }\\n\\n uint256 src = _src + _offset;\\n uint256 dest;\\n assembly {\\n dest := add(out, 32)\\n }\\n\\n // Copy over as many complete words as we can.\\n for (uint256 i = 0; i < _length / 32; i++) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n\\n src += 32;\\n dest += 32;\\n }\\n\\n // Pick out the remaining bytes.\\n uint256 mask = 256 ** (32 - (_length % 32)) - 1;\\n assembly {\\n mstore(\\n dest,\\n or(\\n and(mload(src), not(mask)),\\n and(mload(dest), mask)\\n )\\n )\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Copies an RLP item into bytes.\\n * @param _in RLP item to copy.\\n * @return Copied bytes.\\n */\\n function _copy(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in.ptr, 0, _in.length);\\n }\\n}\\n\",\"keccak256\":\"0x829174c61216dce35fdb888383b6022e0365eb7fbdc71ad79d98b108091969fe\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPWriter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/**\\n * @title Lib_RLPWriter\\n * @author Bakaoh (with modifications)\\n */\\nlibrary Lib_RLPWriter {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * RLP encodes a byte string.\\n * @param _in The byte string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded;\\n\\n if (_in.length == 1 && uint8(_in[0]) < 128) {\\n encoded = _in;\\n } else {\\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * RLP encodes a list of RLP encoded byte byte strings.\\n * @param _in The list of RLP encoded byte strings.\\n * @return The RLP encoded list of items in bytes.\\n */\\n function writeList(\\n bytes[] memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory list = _flatten(_in);\\n return abi.encodePacked(_writeLength(list.length, 192), list);\\n }\\n\\n /**\\n * RLP encodes a string.\\n * @param _in The string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeString(\\n string memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(bytes(_in));\\n }\\n\\n /**\\n * RLP encodes an address.\\n * @param _in The address to encode.\\n * @return The RLP encoded address in bytes.\\n */\\n function writeAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a bytes32 value.\\n * @param _in The bytes32 to encode.\\n * @return _out The RLP encoded bytes32 in bytes.\\n */\\n function writeBytes32(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a uint.\\n * @param _in The uint256 to encode.\\n * @return The RLP encoded uint256 in bytes.\\n */\\n function writeUint(\\n uint256 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(_toBinary(_in));\\n }\\n\\n /**\\n * RLP encodes a bool.\\n * @param _in The bool to encode.\\n * @return The RLP encoded bool in bytes.\\n */\\n function writeBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded = new bytes(1);\\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\\n return encoded;\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\\n * @param _len The length of the string or the payload.\\n * @param _offset 128 if item is string, 192 if item is list.\\n * @return RLP encoded bytes.\\n */\\n function _writeLength(\\n uint256 _len,\\n uint256 _offset\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded;\\n\\n if (_len < 56) {\\n encoded = new bytes(1);\\n encoded[0] = byte(uint8(_len) + uint8(_offset));\\n } else {\\n uint256 lenLen;\\n uint256 i = 1;\\n while (_len / i != 0) {\\n lenLen++;\\n i *= 256;\\n }\\n\\n encoded = new bytes(lenLen + 1);\\n encoded[0] = byte(uint8(lenLen) + uint8(_offset) + 55);\\n for(i = 1; i <= lenLen; i++) {\\n encoded[i] = byte(uint8((_len / (256**(lenLen-i))) % 256));\\n }\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * Encode integer in big endian binary form with no leading zeroes.\\n * @notice TODO: This should be optimized with assembly to save gas costs.\\n * @param _x The integer to encode.\\n * @return RLP encoded bytes.\\n */\\n function _toBinary(\\n uint256 _x\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory b = abi.encodePacked(_x);\\n\\n uint256 i = 0;\\n for (; i < 32; i++) {\\n if (b[i] != 0) {\\n break;\\n }\\n }\\n\\n bytes memory res = new bytes(32 - i);\\n for (uint256 j = 0; j < res.length; j++) {\\n res[j] = b[i++];\\n }\\n\\n return res;\\n }\\n\\n /**\\n * Copies a piece of memory to another location.\\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\\n * @param _dest Destination location.\\n * @param _src Source location.\\n * @param _len Length of memory to copy.\\n */\\n function _memcpy(\\n uint256 _dest,\\n uint256 _src,\\n uint256 _len\\n )\\n private\\n pure\\n {\\n uint256 dest = _dest;\\n uint256 src = _src;\\n uint256 len = _len;\\n\\n for(; len >= 32; len -= 32) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n dest += 32;\\n src += 32;\\n }\\n\\n uint256 mask = 256 ** (32 - len) - 1;\\n assembly {\\n let srcpart := and(mload(src), not(mask))\\n let destpart := and(mload(dest), mask)\\n mstore(dest, or(destpart, srcpart))\\n }\\n }\\n\\n /**\\n * Flattens a list of byte strings into one byte string.\\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\\n * @param _list List of byte strings to flatten.\\n * @return The flattened byte string.\\n */\\n function _flatten(\\n bytes[] memory _list\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n if (_list.length == 0) {\\n return new bytes(0);\\n }\\n\\n uint256 len;\\n uint256 i = 0;\\n for (; i < _list.length; i++) {\\n len += _list[i].length;\\n }\\n\\n bytes memory flattened = new bytes(len);\\n uint256 flattenedPtr;\\n assembly { flattenedPtr := add(flattened, 0x20) }\\n\\n for(i = 0; i < _list.length; i++) {\\n bytes memory item = _list[i];\\n\\n uint256 listPtr;\\n assembly { listPtr := add(item, 0x20)}\\n\\n _memcpy(flattenedPtr, listPtr, item.length);\\n flattenedPtr += _list[i].length;\\n }\\n\\n return flattened;\\n }\\n}\\n\",\"keccak256\":\"0xb60ee4b03ad372c3deff21d454ab714dd0c18ee3e6f9d45532e209fc59d5a54d\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/trie/Lib_MerkleTrie.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\n\\n/**\\n * @title Lib_MerkleTrie\\n */\\nlibrary Lib_MerkleTrie {\\n\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n enum NodeType {\\n BranchNode,\\n ExtensionNode,\\n LeafNode\\n }\\n\\n struct TrieNode {\\n bytes encoded;\\n Lib_RLPReader.RLPItem[] decoded;\\n }\\n\\n\\n /**********************\\n * Contract Constants *\\n **********************/\\n\\n // TREE_RADIX determines the number of elements per branch node.\\n uint256 constant TREE_RADIX = 16;\\n // Branch nodes have TREE_RADIX elements plus an additional `value` slot.\\n uint256 constant BRANCH_NODE_LENGTH = TREE_RADIX + 1;\\n // Leaf nodes and extension nodes always have two elements, a `path` and a `value`.\\n uint256 constant LEAF_OR_EXTENSION_NODE_LENGTH = 2;\\n\\n // Prefixes are prepended to the `path` within a leaf or extension node and\\n // allow us to differentiate between the two node types. `ODD` or `EVEN` is\\n // determined by the number of nibbles within the unprefixed `path`. If the\\n // number of nibbles if even, we need to insert an extra padding nibble so\\n // the resulting prefixed `path` has an even number of nibbles.\\n uint8 constant PREFIX_EXTENSION_EVEN = 0;\\n uint8 constant PREFIX_EXTENSION_ODD = 1;\\n uint8 constant PREFIX_LEAF_EVEN = 2;\\n uint8 constant PREFIX_LEAF_ODD = 3;\\n\\n // Just a utility constant. RLP represents `NULL` as 0x80.\\n bytes1 constant RLP_NULL = bytes1(0x80);\\n bytes constant RLP_NULL_BYTES = hex'80';\\n bytes32 constant internal KECCAK256_RLP_NULL_BYTES = keccak256(RLP_NULL_BYTES);\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * @notice Verifies a proof that a given key/value pair is present in the\\n * Merkle trie.\\n * @param _key Key of the node to search for, as a hex string.\\n * @param _value Value of the node to search for, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the desired node. Unlike\\n * traditional Merkle trees, this proof is executed top-down and consists\\n * of a list of RLP-encoded nodes that make a path down to the target node.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _verified `true` if the k/v pair exists in the trie, `false` otherwise.\\n */\\n function verifyInclusionProof(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bool _verified\\n )\\n {\\n (\\n bool exists,\\n bytes memory value\\n ) = get(_key, _proof, _root);\\n\\n return (\\n exists && Lib_BytesUtils.equal(_value, value)\\n );\\n }\\n\\n /**\\n * @notice Verifies a proof that a given key is *not* present in\\n * the Merkle trie.\\n * @param _key Key of the node to search for, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\\n * target node.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _verified `true` if the key is absent in the trie, `false` otherwise.\\n */\\n function verifyExclusionProof(\\n bytes memory _key,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bool _verified\\n )\\n {\\n (\\n bool exists,\\n ) = get(_key, _proof, _root);\\n\\n return exists == false;\\n }\\n\\n /**\\n * @notice Updates a Merkle trie and returns a new root hash.\\n * @param _key Key of the node to update, as a hex string.\\n * @param _value Value of the node to update, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\\n * target node. If the key exists, we can simply update the value.\\n * Otherwise, we need to modify the trie to handle the new k/v pair.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _updatedRoot Root hash of the newly constructed trie.\\n */\\n function update(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bytes32 _updatedRoot\\n )\\n {\\n // Special case when inserting the very first node.\\n if (_root == KECCAK256_RLP_NULL_BYTES) {\\n return getSingleNodeRootHash(_key, _value);\\n }\\n\\n TrieNode[] memory proof = _parseProof(_proof);\\n (uint256 pathLength, bytes memory keyRemainder, ) = _walkNodePath(proof, _key, _root);\\n TrieNode[] memory newPath = _getNewPath(proof, pathLength, keyRemainder, _value);\\n\\n return _getUpdatedTrieRoot(newPath, _key);\\n }\\n\\n /**\\n * @notice Retrieves the value associated with a given key.\\n * @param _key Key to search for, as hex bytes.\\n * @param _proof Merkle trie inclusion proof for the key.\\n * @param _root Known root of the Merkle trie.\\n * @return _exists Whether or not the key exists.\\n * @return _value Value of the key if it exists.\\n */\\n function get(\\n bytes memory _key,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bool _exists,\\n bytes memory _value\\n )\\n {\\n TrieNode[] memory proof = _parseProof(_proof);\\n (uint256 pathLength, bytes memory keyRemainder, bool isFinalNode) = _walkNodePath(proof, _key, _root);\\n\\n bool exists = keyRemainder.length == 0;\\n\\n require(\\n exists || isFinalNode,\\n \\\"Provided proof is invalid.\\\"\\n );\\n\\n bytes memory value = exists ? _getNodeValue(proof[pathLength - 1]) : bytes('');\\n\\n return (\\n exists,\\n value\\n );\\n }\\n\\n /**\\n * Computes the root hash for a trie with a single node.\\n * @param _key Key for the single node.\\n * @param _value Value for the single node.\\n * @return _updatedRoot Hash of the trie.\\n */\\n function getSingleNodeRootHash(\\n bytes memory _key,\\n bytes memory _value\\n )\\n internal\\n pure\\n returns (\\n bytes32 _updatedRoot\\n )\\n {\\n return keccak256(_makeLeafNode(\\n Lib_BytesUtils.toNibbles(_key),\\n _value\\n ).encoded);\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * @notice Walks through a proof using a provided key.\\n * @param _proof Inclusion proof to walk through.\\n * @param _key Key to use for the walk.\\n * @param _root Known root of the trie.\\n * @return _pathLength Length of the final path\\n * @return _keyRemainder Portion of the key remaining after the walk.\\n * @return _isFinalNode Whether or not we've hit a dead end.\\n */\\n function _walkNodePath(\\n TrieNode[] memory _proof,\\n bytes memory _key,\\n bytes32 _root\\n )\\n private\\n pure\\n returns (\\n uint256 _pathLength,\\n bytes memory _keyRemainder,\\n bool _isFinalNode\\n )\\n {\\n uint256 pathLength = 0;\\n bytes memory key = Lib_BytesUtils.toNibbles(_key);\\n\\n bytes32 currentNodeID = _root;\\n uint256 currentKeyIndex = 0;\\n uint256 currentKeyIncrement = 0;\\n TrieNode memory currentNode;\\n\\n // Proof is top-down, so we start at the first element (root).\\n for (uint256 i = 0; i < _proof.length; i++) {\\n currentNode = _proof[i];\\n currentKeyIndex += currentKeyIncrement;\\n\\n // Keep track of the proof elements we actually need.\\n // It's expensive to resize arrays, so this simply reduces gas costs.\\n pathLength += 1;\\n\\n if (currentKeyIndex == 0) {\\n // First proof element is always the root node.\\n require(\\n keccak256(currentNode.encoded) == currentNodeID,\\n \\\"Invalid root hash\\\"\\n );\\n } else if (currentNode.encoded.length >= 32) {\\n // Nodes 32 bytes or larger are hashed inside branch nodes.\\n require(\\n keccak256(currentNode.encoded) == currentNodeID,\\n \\\"Invalid large internal hash\\\"\\n );\\n } else {\\n // Nodes smaller than 31 bytes aren't hashed.\\n require(\\n Lib_BytesUtils.toBytes32(currentNode.encoded) == currentNodeID,\\n \\\"Invalid internal node hash\\\"\\n );\\n }\\n\\n if (currentNode.decoded.length == BRANCH_NODE_LENGTH) {\\n if (currentKeyIndex == key.length) {\\n // We've hit the end of the key, meaning the value should be within this branch node.\\n break;\\n } else {\\n // We're not at the end of the key yet.\\n // Figure out what the next node ID should be and continue.\\n uint8 branchKey = uint8(key[currentKeyIndex]);\\n Lib_RLPReader.RLPItem memory nextNode = currentNode.decoded[branchKey];\\n currentNodeID = _getNodeID(nextNode);\\n currentKeyIncrement = 1;\\n continue;\\n }\\n } else if (currentNode.decoded.length == LEAF_OR_EXTENSION_NODE_LENGTH) {\\n bytes memory path = _getNodePath(currentNode);\\n uint8 prefix = uint8(path[0]);\\n uint8 offset = 2 - prefix % 2;\\n bytes memory pathRemainder = Lib_BytesUtils.slice(path, offset);\\n bytes memory keyRemainder = Lib_BytesUtils.slice(key, currentKeyIndex);\\n uint256 sharedNibbleLength = _getSharedNibbleLength(pathRemainder, keyRemainder);\\n\\n if (prefix == PREFIX_LEAF_EVEN || prefix == PREFIX_LEAF_ODD) {\\n if (\\n pathRemainder.length == sharedNibbleLength &&\\n keyRemainder.length == sharedNibbleLength\\n ) {\\n // The key within this leaf matches our key exactly.\\n // Increment the key index to reflect that we have no remainder.\\n currentKeyIndex += sharedNibbleLength;\\n }\\n\\n // We've hit a leaf node, so our next node should be NULL.\\n currentNodeID = bytes32(RLP_NULL);\\n break;\\n } else if (prefix == PREFIX_EXTENSION_EVEN || prefix == PREFIX_EXTENSION_ODD) {\\n if (sharedNibbleLength == 0) {\\n // Our extension node doesn't share any part of our key.\\n // We've hit the end of this path, updates will need to modify this extension.\\n currentNodeID = bytes32(RLP_NULL);\\n break;\\n } else {\\n // Our extension shares some nibbles.\\n // Carry on to the next node.\\n currentNodeID = _getNodeID(currentNode.decoded[1]);\\n currentKeyIncrement = sharedNibbleLength;\\n continue;\\n }\\n } else {\\n revert(\\\"Received a node with an unknown prefix\\\");\\n }\\n } else {\\n revert(\\\"Received an unparseable node.\\\");\\n }\\n }\\n\\n // If our node ID is NULL, then we're at a dead end.\\n bool isFinalNode = currentNodeID == bytes32(RLP_NULL);\\n return (pathLength, Lib_BytesUtils.slice(key, currentKeyIndex), isFinalNode);\\n }\\n\\n /**\\n * @notice Creates new nodes to support a k/v pair insertion into a given\\n * Merkle trie path.\\n * @param _path Path to the node nearest the k/v pair.\\n * @param _pathLength Length of the path. Necessary because the provided\\n * path may include additional nodes (e.g., it comes directly from a proof)\\n * and we can't resize in-memory arrays without costly duplication.\\n * @param _keyRemainder Portion of the initial key that must be inserted\\n * into the trie.\\n * @param _value Value to insert at the given key.\\n * @return _newPath A new path with the inserted k/v pair and extra supporting nodes.\\n */\\n function _getNewPath(\\n TrieNode[] memory _path,\\n uint256 _pathLength,\\n bytes memory _keyRemainder,\\n bytes memory _value\\n )\\n private\\n pure\\n returns (\\n TrieNode[] memory _newPath\\n )\\n {\\n bytes memory keyRemainder = _keyRemainder;\\n\\n // Most of our logic depends on the status of the last node in the path.\\n TrieNode memory lastNode = _path[_pathLength - 1];\\n NodeType lastNodeType = _getNodeType(lastNode);\\n\\n // Create an array for newly created nodes.\\n // We need up to three new nodes, depending on the contents of the last node.\\n // Since array resizing is expensive, we'll keep track of the size manually.\\n // We're using an explicit `totalNewNodes += 1` after insertions for clarity.\\n TrieNode[] memory newNodes = new TrieNode[](3);\\n uint256 totalNewNodes = 0;\\n\\n if (keyRemainder.length == 0 && lastNodeType == NodeType.LeafNode) {\\n // We've found a leaf node with the given key.\\n // Simply need to update the value of the node to match.\\n newNodes[totalNewNodes] = _makeLeafNode(_getNodeKey(lastNode), _value);\\n totalNewNodes += 1;\\n } else if (lastNodeType == NodeType.BranchNode) {\\n if (keyRemainder.length == 0) {\\n // We've found a branch node with the given key.\\n // Simply need to update the value of the node to match.\\n newNodes[totalNewNodes] = _editBranchValue(lastNode, _value);\\n totalNewNodes += 1;\\n } else {\\n // We've found a branch node, but it doesn't contain our key.\\n // Reinsert the old branch for now.\\n newNodes[totalNewNodes] = lastNode;\\n totalNewNodes += 1;\\n // Create a new leaf node, slicing our remainder since the first byte points\\n // to our branch node.\\n newNodes[totalNewNodes] = _makeLeafNode(Lib_BytesUtils.slice(keyRemainder, 1), _value);\\n totalNewNodes += 1;\\n }\\n } else {\\n // Our last node is either an extension node or a leaf node with a different key.\\n bytes memory lastNodeKey = _getNodeKey(lastNode);\\n uint256 sharedNibbleLength = _getSharedNibbleLength(lastNodeKey, keyRemainder);\\n\\n if (sharedNibbleLength != 0) {\\n // We've got some shared nibbles between the last node and our key remainder.\\n // We'll need to insert an extension node that covers these shared nibbles.\\n bytes memory nextNodeKey = Lib_BytesUtils.slice(lastNodeKey, 0, sharedNibbleLength);\\n newNodes[totalNewNodes] = _makeExtensionNode(nextNodeKey, _getNodeHash(_value));\\n totalNewNodes += 1;\\n\\n // Cut down the keys since we've just covered these shared nibbles.\\n lastNodeKey = Lib_BytesUtils.slice(lastNodeKey, sharedNibbleLength);\\n keyRemainder = Lib_BytesUtils.slice(keyRemainder, sharedNibbleLength);\\n }\\n\\n // Create an empty branch to fill in.\\n TrieNode memory newBranch = _makeEmptyBranchNode();\\n\\n if (lastNodeKey.length == 0) {\\n // Key remainder was larger than the key for our last node.\\n // The value within our last node is therefore going to be shifted into\\n // a branch value slot.\\n newBranch = _editBranchValue(newBranch, _getNodeValue(lastNode));\\n } else {\\n // Last node key was larger than the key remainder.\\n // We're going to modify some index of our branch.\\n uint8 branchKey = uint8(lastNodeKey[0]);\\n // Move on to the next nibble.\\n lastNodeKey = Lib_BytesUtils.slice(lastNodeKey, 1);\\n\\n if (lastNodeType == NodeType.LeafNode) {\\n // We're dealing with a leaf node.\\n // We'll modify the key and insert the old leaf node into the branch index.\\n TrieNode memory modifiedLastNode = _makeLeafNode(lastNodeKey, _getNodeValue(lastNode));\\n newBranch = _editBranchIndex(newBranch, branchKey, _getNodeHash(modifiedLastNode.encoded));\\n } else if (lastNodeKey.length != 0) {\\n // We're dealing with a shrinking extension node.\\n // We need to modify the node to decrease the size of the key.\\n TrieNode memory modifiedLastNode = _makeExtensionNode(lastNodeKey, _getNodeValue(lastNode));\\n newBranch = _editBranchIndex(newBranch, branchKey, _getNodeHash(modifiedLastNode.encoded));\\n } else {\\n // We're dealing with an unnecessary extension node.\\n // We're going to delete the node entirely.\\n // Simply insert its current value into the branch index.\\n newBranch = _editBranchIndex(newBranch, branchKey, _getNodeValue(lastNode));\\n }\\n }\\n\\n if (keyRemainder.length == 0) {\\n // We've got nothing left in the key remainder.\\n // Simply insert the value into the branch value slot.\\n newBranch = _editBranchValue(newBranch, _value);\\n // Push the branch into the list of new nodes.\\n newNodes[totalNewNodes] = newBranch;\\n totalNewNodes += 1;\\n } else {\\n // We've got some key remainder to work with.\\n // We'll be inserting a leaf node into the trie.\\n // First, move on to the next nibble.\\n keyRemainder = Lib_BytesUtils.slice(keyRemainder, 1);\\n // Push the branch into the list of new nodes.\\n newNodes[totalNewNodes] = newBranch;\\n totalNewNodes += 1;\\n // Push a new leaf node for our k/v pair.\\n newNodes[totalNewNodes] = _makeLeafNode(keyRemainder, _value);\\n totalNewNodes += 1;\\n }\\n }\\n\\n // Finally, join the old path with our newly created nodes.\\n // Since we're overwriting the last node in the path, we use `_pathLength - 1`.\\n return _joinNodeArrays(_path, _pathLength - 1, newNodes, totalNewNodes);\\n }\\n\\n /**\\n * @notice Computes the trie root from a given path.\\n * @param _nodes Path to some k/v pair.\\n * @param _key Key for the k/v pair.\\n * @return _updatedRoot Root hash for the updated trie.\\n */\\n function _getUpdatedTrieRoot(\\n TrieNode[] memory _nodes,\\n bytes memory _key\\n )\\n private\\n pure\\n returns (\\n bytes32 _updatedRoot\\n )\\n {\\n bytes memory key = Lib_BytesUtils.toNibbles(_key);\\n\\n // Some variables to keep track of during iteration.\\n TrieNode memory currentNode;\\n NodeType currentNodeType;\\n bytes memory previousNodeHash;\\n\\n // Run through the path backwards to rebuild our root hash.\\n for (uint256 i = _nodes.length; i > 0; i--) {\\n // Pick out the current node.\\n currentNode = _nodes[i - 1];\\n currentNodeType = _getNodeType(currentNode);\\n\\n if (currentNodeType == NodeType.LeafNode) {\\n // Leaf nodes are already correctly encoded.\\n // Shift the key over to account for the nodes key.\\n bytes memory nodeKey = _getNodeKey(currentNode);\\n key = Lib_BytesUtils.slice(key, 0, key.length - nodeKey.length);\\n } else if (currentNodeType == NodeType.ExtensionNode) {\\n // Shift the key over to account for the nodes key.\\n bytes memory nodeKey = _getNodeKey(currentNode);\\n key = Lib_BytesUtils.slice(key, 0, key.length - nodeKey.length);\\n\\n // If this node is the last element in the path, it'll be correctly encoded\\n // and we can skip this part.\\n if (previousNodeHash.length > 0) {\\n // Re-encode the node based on the previous node.\\n currentNode = _makeExtensionNode(nodeKey, previousNodeHash);\\n }\\n } else if (currentNodeType == NodeType.BranchNode) {\\n // If this node is the last element in the path, it'll be correctly encoded\\n // and we can skip this part.\\n if (previousNodeHash.length > 0) {\\n // Re-encode the node based on the previous node.\\n uint8 branchKey = uint8(key[key.length - 1]);\\n key = Lib_BytesUtils.slice(key, 0, key.length - 1);\\n currentNode = _editBranchIndex(currentNode, branchKey, previousNodeHash);\\n }\\n }\\n\\n // Compute the node hash for the next iteration.\\n previousNodeHash = _getNodeHash(currentNode.encoded);\\n }\\n\\n // Current node should be the root at this point.\\n // Simply return the hash of its encoding.\\n return keccak256(currentNode.encoded);\\n }\\n\\n /**\\n * @notice Parses an RLP-encoded proof into something more useful.\\n * @param _proof RLP-encoded proof to parse.\\n * @return _parsed Proof parsed into easily accessible structs.\\n */\\n function _parseProof(\\n bytes memory _proof\\n )\\n private\\n pure\\n returns (\\n TrieNode[] memory _parsed\\n )\\n {\\n Lib_RLPReader.RLPItem[] memory nodes = Lib_RLPReader.readList(_proof);\\n TrieNode[] memory proof = new TrieNode[](nodes.length);\\n\\n for (uint256 i = 0; i < nodes.length; i++) {\\n bytes memory encoded = Lib_RLPReader.readBytes(nodes[i]);\\n proof[i] = TrieNode({\\n encoded: encoded,\\n decoded: Lib_RLPReader.readList(encoded)\\n });\\n }\\n\\n return proof;\\n }\\n\\n /**\\n * @notice Picks out the ID for a node. Node ID is referred to as the\\n * \\\"hash\\\" within the specification, but nodes < 32 bytes are not actually\\n * hashed.\\n * @param _node Node to pull an ID for.\\n * @return _nodeID ID for the node, depending on the size of its contents.\\n */\\n function _getNodeID(\\n Lib_RLPReader.RLPItem memory _node\\n )\\n private\\n pure\\n returns (\\n bytes32 _nodeID\\n )\\n {\\n bytes memory nodeID;\\n\\n if (_node.length < 32) {\\n // Nodes smaller than 32 bytes are RLP encoded.\\n nodeID = Lib_RLPReader.readRawBytes(_node);\\n } else {\\n // Nodes 32 bytes or larger are hashed.\\n nodeID = Lib_RLPReader.readBytes(_node);\\n }\\n\\n return Lib_BytesUtils.toBytes32(nodeID);\\n }\\n\\n /**\\n * @notice Gets the path for a leaf or extension node.\\n * @param _node Node to get a path for.\\n * @return _path Node path, converted to an array of nibbles.\\n */\\n function _getNodePath(\\n TrieNode memory _node\\n )\\n private\\n pure\\n returns (\\n bytes memory _path\\n )\\n {\\n return Lib_BytesUtils.toNibbles(Lib_RLPReader.readBytes(_node.decoded[0]));\\n }\\n\\n /**\\n * @notice Gets the key for a leaf or extension node. Keys are essentially\\n * just paths without any prefix.\\n * @param _node Node to get a key for.\\n * @return _key Node key, converted to an array of nibbles.\\n */\\n function _getNodeKey(\\n TrieNode memory _node\\n )\\n private\\n pure\\n returns (\\n bytes memory _key\\n )\\n {\\n return _removeHexPrefix(_getNodePath(_node));\\n }\\n\\n /**\\n * @notice Gets the path for a node.\\n * @param _node Node to get a value for.\\n * @return _value Node value, as hex bytes.\\n */\\n function _getNodeValue(\\n TrieNode memory _node\\n )\\n private\\n pure\\n returns (\\n bytes memory _value\\n )\\n {\\n return Lib_RLPReader.readBytes(_node.decoded[_node.decoded.length - 1]);\\n }\\n\\n /**\\n * @notice Computes the node hash for an encoded node. Nodes < 32 bytes\\n * are not hashed, all others are keccak256 hashed.\\n * @param _encoded Encoded node to hash.\\n * @return _hash Hash of the encoded node. Simply the input if < 32 bytes.\\n */\\n function _getNodeHash(\\n bytes memory _encoded\\n )\\n private\\n pure\\n returns (\\n bytes memory _hash\\n )\\n {\\n if (_encoded.length < 32) {\\n return _encoded;\\n } else {\\n return abi.encodePacked(keccak256(_encoded));\\n }\\n }\\n\\n /**\\n * @notice Determines the type for a given node.\\n * @param _node Node to determine a type for.\\n * @return _type Type of the node; BranchNode/ExtensionNode/LeafNode.\\n */\\n function _getNodeType(\\n TrieNode memory _node\\n )\\n private\\n pure\\n returns (\\n NodeType _type\\n )\\n {\\n if (_node.decoded.length == BRANCH_NODE_LENGTH) {\\n return NodeType.BranchNode;\\n } else if (_node.decoded.length == LEAF_OR_EXTENSION_NODE_LENGTH) {\\n bytes memory path = _getNodePath(_node);\\n uint8 prefix = uint8(path[0]);\\n\\n if (prefix == PREFIX_LEAF_EVEN || prefix == PREFIX_LEAF_ODD) {\\n return NodeType.LeafNode;\\n } else if (prefix == PREFIX_EXTENSION_EVEN || prefix == PREFIX_EXTENSION_ODD) {\\n return NodeType.ExtensionNode;\\n }\\n }\\n\\n revert(\\\"Invalid node type\\\");\\n }\\n\\n /**\\n * @notice Utility; determines the number of nibbles shared between two\\n * nibble arrays.\\n * @param _a First nibble array.\\n * @param _b Second nibble array.\\n * @return _shared Number of shared nibbles.\\n */\\n function _getSharedNibbleLength(\\n bytes memory _a,\\n bytes memory _b\\n )\\n private\\n pure\\n returns (\\n uint256 _shared\\n )\\n {\\n uint256 i = 0;\\n while (_a.length > i && _b.length > i && _a[i] == _b[i]) {\\n i++;\\n }\\n return i;\\n }\\n\\n /**\\n * @notice Utility; converts an RLP-encoded node into our nice struct.\\n * @param _raw RLP-encoded node to convert.\\n * @return _node Node as a TrieNode struct.\\n */\\n function _makeNode(\\n bytes[] memory _raw\\n )\\n private\\n pure\\n returns (\\n TrieNode memory _node\\n )\\n {\\n bytes memory encoded = Lib_RLPWriter.writeList(_raw);\\n\\n return TrieNode({\\n encoded: encoded,\\n decoded: Lib_RLPReader.readList(encoded)\\n });\\n }\\n\\n /**\\n * @notice Utility; converts an RLP-decoded node into our nice struct.\\n * @param _items RLP-decoded node to convert.\\n * @return _node Node as a TrieNode struct.\\n */\\n function _makeNode(\\n Lib_RLPReader.RLPItem[] memory _items\\n )\\n private\\n pure\\n returns (\\n TrieNode memory _node\\n )\\n {\\n bytes[] memory raw = new bytes[](_items.length);\\n for (uint256 i = 0; i < _items.length; i++) {\\n raw[i] = Lib_RLPReader.readRawBytes(_items[i]);\\n }\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Creates a new extension node.\\n * @param _key Key for the extension node, unprefixed.\\n * @param _value Value for the extension node.\\n * @return _node New extension node with the given k/v pair.\\n */\\n function _makeExtensionNode(\\n bytes memory _key,\\n bytes memory _value\\n )\\n private\\n pure\\n returns (\\n TrieNode memory _node\\n )\\n {\\n bytes[] memory raw = new bytes[](2);\\n bytes memory key = _addHexPrefix(_key, false);\\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\\n raw[1] = Lib_RLPWriter.writeBytes(_value);\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Creates a new leaf node.\\n * @dev This function is essentially identical to `_makeExtensionNode`.\\n * Although we could route both to a single method with a flag, it's\\n * more gas efficient to keep them separate and duplicate the logic.\\n * @param _key Key for the leaf node, unprefixed.\\n * @param _value Value for the leaf node.\\n * @return _node New leaf node with the given k/v pair.\\n */\\n function _makeLeafNode(\\n bytes memory _key,\\n bytes memory _value\\n )\\n private\\n pure\\n returns (\\n TrieNode memory _node\\n )\\n {\\n bytes[] memory raw = new bytes[](2);\\n bytes memory key = _addHexPrefix(_key, true);\\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\\n raw[1] = Lib_RLPWriter.writeBytes(_value);\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Creates an empty branch node.\\n * @return _node Empty branch node as a TrieNode struct.\\n */\\n function _makeEmptyBranchNode()\\n private\\n pure\\n returns (\\n TrieNode memory _node\\n )\\n {\\n bytes[] memory raw = new bytes[](BRANCH_NODE_LENGTH);\\n for (uint256 i = 0; i < raw.length; i++) {\\n raw[i] = RLP_NULL_BYTES;\\n }\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Modifies the value slot for a given branch.\\n * @param _branch Branch node to modify.\\n * @param _value Value to insert into the branch.\\n * @return _updatedNode Modified branch node.\\n */\\n function _editBranchValue(\\n TrieNode memory _branch,\\n bytes memory _value\\n )\\n private\\n pure\\n returns (\\n TrieNode memory _updatedNode\\n )\\n {\\n bytes memory encoded = Lib_RLPWriter.writeBytes(_value);\\n _branch.decoded[_branch.decoded.length - 1] = Lib_RLPReader.toRLPItem(encoded);\\n return _makeNode(_branch.decoded);\\n }\\n\\n /**\\n * @notice Modifies a slot at an index for a given branch.\\n * @param _branch Branch node to modify.\\n * @param _index Slot index to modify.\\n * @param _value Value to insert into the slot.\\n * @return _updatedNode Modified branch node.\\n */\\n function _editBranchIndex(\\n TrieNode memory _branch,\\n uint8 _index,\\n bytes memory _value\\n )\\n private\\n pure\\n returns (\\n TrieNode memory _updatedNode\\n )\\n {\\n bytes memory encoded = _value.length < 32 ? _value : Lib_RLPWriter.writeBytes(_value);\\n _branch.decoded[_index] = Lib_RLPReader.toRLPItem(encoded);\\n return _makeNode(_branch.decoded);\\n }\\n\\n /**\\n * @notice Utility; adds a prefix to a key.\\n * @param _key Key to prefix.\\n * @param _isLeaf Whether or not the key belongs to a leaf.\\n * @return _prefixedKey Prefixed key.\\n */\\n function _addHexPrefix(\\n bytes memory _key,\\n bool _isLeaf\\n )\\n private\\n pure\\n returns (\\n bytes memory _prefixedKey\\n )\\n {\\n uint8 prefix = _isLeaf ? uint8(0x02) : uint8(0x00);\\n uint8 offset = uint8(_key.length % 2);\\n bytes memory prefixed = new bytes(2 - offset);\\n prefixed[0] = bytes1(prefix + offset);\\n return abi.encodePacked(prefixed, _key);\\n }\\n\\n /**\\n * @notice Utility; removes a prefix from a path.\\n * @param _path Path to remove the prefix from.\\n * @return _unprefixedKey Unprefixed key.\\n */\\n function _removeHexPrefix(\\n bytes memory _path\\n )\\n private\\n pure\\n returns (\\n bytes memory _unprefixedKey\\n )\\n {\\n if (uint8(_path[0]) % 2 == 0) {\\n return Lib_BytesUtils.slice(_path, 2);\\n } else {\\n return Lib_BytesUtils.slice(_path, 1);\\n }\\n }\\n\\n /**\\n * @notice Utility; combines two node arrays. Array lengths are required\\n * because the actual lengths may be longer than the filled lengths.\\n * Array resizing is extremely costly and should be avoided.\\n * @param _a First array to join.\\n * @param _aLength Length of the first array.\\n * @param _b Second array to join.\\n * @param _bLength Length of the second array.\\n * @return _joined Combined node array.\\n */\\n function _joinNodeArrays(\\n TrieNode[] memory _a,\\n uint256 _aLength,\\n TrieNode[] memory _b,\\n uint256 _bLength\\n )\\n private\\n pure\\n returns (\\n TrieNode[] memory _joined\\n )\\n {\\n TrieNode[] memory ret = new TrieNode[](_aLength + _bLength);\\n\\n // Copy elements from the first array.\\n for (uint256 i = 0; i < _aLength; i++) {\\n ret[i] = _a[i];\\n }\\n\\n // Copy elements from the second array.\\n for (uint256 i = 0; i < _bLength; i++) {\\n ret[i + _aLength] = _b[i];\\n }\\n\\n return ret;\\n }\\n}\\n\",\"keccak256\":\"0x161f65220b8c5cf295232f8c58c2744fbc898bf77da5f9d9c5b2dd673dafc6f6\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/trie/Lib_SecureMerkleTrie.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_MerkleTrie } from \\\"./Lib_MerkleTrie.sol\\\";\\n\\n/**\\n * @title Lib_SecureMerkleTrie\\n */\\nlibrary Lib_SecureMerkleTrie {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * @notice Verifies a proof that a given key/value pair is present in the\\n * Merkle trie.\\n * @param _key Key of the node to search for, as a hex string.\\n * @param _value Value of the node to search for, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the desired node. Unlike\\n * traditional Merkle trees, this proof is executed top-down and consists\\n * of a list of RLP-encoded nodes that make a path down to the target node.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _verified `true` if the k/v pair exists in the trie, `false` otherwise.\\n */\\n function verifyInclusionProof(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bool _verified\\n )\\n {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.verifyInclusionProof(key, _value, _proof, _root);\\n }\\n\\n /**\\n * @notice Verifies a proof that a given key is *not* present in\\n * the Merkle trie.\\n * @param _key Key of the node to search for, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\\n * target node.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _verified `true` if the key is not present in the trie, `false` otherwise.\\n */\\n function verifyExclusionProof(\\n bytes memory _key,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bool _verified\\n )\\n {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.verifyExclusionProof(key, _proof, _root);\\n }\\n\\n /**\\n * @notice Updates a Merkle trie and returns a new root hash.\\n * @param _key Key of the node to update, as a hex string.\\n * @param _value Value of the node to update, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\\n * target node. If the key exists, we can simply update the value.\\n * Otherwise, we need to modify the trie to handle the new k/v pair.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _updatedRoot Root hash of the newly constructed trie.\\n */\\n function update(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bytes32 _updatedRoot\\n )\\n {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.update(key, _value, _proof, _root);\\n }\\n\\n /**\\n * @notice Retrieves the value associated with a given key.\\n * @param _key Key to search for, as hex bytes.\\n * @param _proof Merkle trie inclusion proof for the key.\\n * @param _root Known root of the Merkle trie.\\n * @return _exists Whether or not the key exists.\\n * @return _value Value of the key if it exists.\\n */\\n function get(\\n bytes memory _key,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bool _exists,\\n bytes memory _value\\n )\\n {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.get(key, _proof, _root);\\n }\\n\\n /**\\n * Computes the root hash for a trie with a single node.\\n * @param _key Key for the single node.\\n * @param _value Value for the single node.\\n * @return _updatedRoot Hash of the trie.\\n */\\n function getSingleNodeRootHash(\\n bytes memory _key,\\n bytes memory _value\\n )\\n internal\\n pure\\n returns (\\n bytes32 _updatedRoot\\n )\\n {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.getSingleNodeRootHash(key, _value);\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Computes the secure counterpart to a key.\\n * @param _key Key to get a secure key from.\\n * @return _secureKey Secure version of the key.\\n */\\n function _getSecureKey(\\n bytes memory _key\\n )\\n private\\n pure\\n returns (\\n bytes memory _secureKey\\n )\\n {\\n return abi.encodePacked(keccak256(_key));\\n }\\n}\",\"keccak256\":\"0x79355346f74bb1eb9eeb733cb5d9677d50115c4f390307cbf608fe071a1ada0c\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_Bytes32Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_Byte32Utils\\n */\\nlibrary Lib_Bytes32Utils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \\\"true.\\\"\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as a boolean.\\n */\\n function toBool(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return _in != 0;\\n }\\n\\n /**\\n * Converts a boolean to a bytes32 value.\\n * @param _in Input boolean value.\\n * @return Boolean as a bytes32.\\n */\\n function fromBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in ? 1 : 0));\\n }\\n\\n /**\\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as an address.\\n */\\n function toAddress(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return address(uint160(uint256(_in)));\\n }\\n\\n /**\\n * Converts an address to a bytes32.\\n * @param _in Input address value.\\n * @return Address as a bytes32.\\n */\\n function fromAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in));\\n }\\n\\n /**\\n * Removes the leading zeros from a bytes32 value and returns a new (smaller) bytes value.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 without any leading zeros.\\n */\\n function removeLeadingZeros(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out;\\n\\n assembly {\\n // Figure out how many leading zero bytes to remove.\\n let shift := 0\\n for { let i := 0 } and(lt(i, 32), eq(byte(i, _in), 0)) { i := add(i, 1) } {\\n shift := add(shift, 1)\\n }\\n\\n // Reserve some space for our output and fix the free memory pointer.\\n out := mload(0x40)\\n mstore(0x40, add(out, 0x40))\\n\\n // Shift the value and store it into the output bytes.\\n mstore(add(out, 0x20), shl(mul(shift, 8), _in))\\n\\n // Store the new size (with leading zero bytes removed) in the output byte size.\\n mstore(out, sub(32, shift))\\n }\\n\\n return out;\\n }\\n}\\n\",\"keccak256\":\"0xfa2def593e3fc56a31852c3744aefdaa93cec74e721bfcfeb1e5d166c7c60b64\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_BytesUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_BytesUtils\\n */\\nlibrary Lib_BytesUtils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_start + _length >= _start, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n if (_bytes.length - _start == 0) {\\n return bytes('');\\n }\\n\\n return slice(_bytes, _start, _bytes.length - _start);\\n }\\n\\n function toBytes32PadLeft(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n bytes32 ret;\\n uint256 len = _bytes.length <= 32 ? _bytes.length : 32;\\n assembly {\\n ret := shr(mul(sub(32, len), 8), mload(add(_bytes, 32)))\\n }\\n return ret;\\n }\\n\\n function toBytes32(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n if (_bytes.length < 32) {\\n bytes32 ret;\\n assembly {\\n ret := mload(add(_bytes, 32))\\n }\\n return ret;\\n }\\n\\n return abi.decode(_bytes,(bytes32)); // will truncate if input length > 32 bytes\\n }\\n\\n function toUint256(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return uint256(toBytes32(_bytes));\\n }\\n\\n function toUint24(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n uint24\\n )\\n {\\n require(_start + 3 >= _start, \\\"toUint24_overflow\\\");\\n require(_bytes.length >= _start + 3 , \\\"toUint24_outOfBounds\\\");\\n uint24 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x3), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toUint8(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n uint8\\n )\\n {\\n require(_start + 1 >= _start, \\\"toUint8_overflow\\\");\\n require(_bytes.length >= _start + 1 , \\\"toUint8_outOfBounds\\\");\\n uint8 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x1), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toAddress(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n require(_start + 20 >= _start, \\\"toAddress_overflow\\\");\\n require(_bytes.length >= _start + 20, \\\"toAddress_outOfBounds\\\");\\n address tempAddress;\\n\\n assembly {\\n tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000)\\n }\\n\\n return tempAddress;\\n }\\n\\n function toNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory nibbles = new bytes(_bytes.length * 2);\\n\\n for (uint256 i = 0; i < _bytes.length; i++) {\\n nibbles[i * 2] = _bytes[i] >> 4;\\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\\n }\\n\\n return nibbles;\\n }\\n\\n function fromNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory ret = new bytes(_bytes.length / 2);\\n\\n for (uint256 i = 0; i < ret.length; i++) {\\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\\n }\\n\\n return ret;\\n }\\n\\n function equal(\\n bytes memory _bytes,\\n bytes memory _other\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return keccak256(_bytes) == keccak256(_other);\\n }\\n}\\n\",\"keccak256\":\"0xa5195afe32fb2cf104d156e8f4bd39df1ec79bf6ba232097b9e8e0ee14fbc298\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x6080604052600480546001600160a01b03191661dead17905534801561002457600080fd5b50600580546001600160a01b031916905561312f806100446000396000f3fe608060405234801561001057600080fd5b50600436106101215760003560e01c806381ada46c116100ad578063c4d66de811610071578063c4d66de814610213578063c6b94ab014610226578063d7fd19dd14610239578063ecc704281461024c578063f2fde38b1461026157610121565b806381ada46c146101ca57806382e3702d146101dd5780638456cb59146101f05780638da5cb5b146101f8578063b1b1b2091461020057610121565b8063461a4478116100f4578063461a44781461018c5780635c975abb1461019f5780636e296e45146101a7578063706ceab6146101af578063715018a6146101c257610121565b80630ecf2eea1461012657806321d800ec1461013b578063299ca478146101645780633dbb202b14610179575b600080fd5b610139610134366004612aba565b610274565b005b61014e610149366004612aba565b610319565b60405161015b9190612cd0565b60405180910390f35b61016c61032e565b60405161015b9190612c58565b610139610187366004612a3e565b61033d565b61016c61019a366004612ad2565b6103cc565b61014e6104a8565b61016c6104b1565b6101396101bd3660046129c7565b6104fa565b610139610561565b6101396101d8366004612aba565b61060d565b61014e6101eb366004612aba565b6106af565b6101396106c4565b61016c610730565b61014e61020e366004612aba565b61073f565b61013961022136600461287e565b610754565b61014e610234366004612aba565b610882565b610139610247366004612898565b610897565b610254610bd6565b60405161015b9190612ba1565b61013961026f36600461287e565b610bdc565b61027c610cdf565b6001600160a01b031661028d610730565b6001600160a01b0316146102d6576040805162461bcd60e51b815260206004820181905260248201526000805160206130da833981519152604482015290519081900360640190fd5b600081815260ce6020526040808220805460ff191660011790555182917ff52508d5339edf0d7e5060a416df98db067af561bdc60872d29c0439eaa13a0291a250565b60006020819052908152604090205460ff1681565b6005546001600160a01b031681565b600061034d843385600354610ce3565b60038054600190810190915581516020808401919091206000908152600290915260409020805460ff19169091179055905061038f8163ffffffff8416610d30565b7f0ee9ffdb2334d78de97ffb066b23a352a4d35180cefb36589d663fbb1eb6f326816040516103be9190612d52565b60405180910390a150505050565b60055460405163bf40fac160e01b81526020600482018181528451602484015284516000946001600160a01b03169363bf40fac1938793928392604401918501908083838b5b8381101561042a578181015183820152602001610412565b50505050905090810190601f1680156104575780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561047457600080fd5b505afa158015610488573d6000803e3d6000fd5b505050506040513d602081101561049e57600080fd5b505190505b919050565b606a5460ff1690565b6004546000906001600160a01b031661dead14156104ea5760405162461bcd60e51b81526004016104e190612d65565b60405180910390fd5b506004546001600160a01b031690565b600061050886868686610ce3565b805160208083019190912060009081526002909152604090205490915060ff1615156001146105495760405162461bcd60e51b81526004016104e190612e5a565b610559818363ffffffff16610d30565b505050505050565b610569610cdf565b6001600160a01b031661057a610730565b6001600160a01b0316146105c3576040805162461bcd60e51b815260206004820181905260248201526000805160206130da833981519152604482015290519081900360640190fd5b6038546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3603880546001600160a01b0319169055565b610615610cdf565b6001600160a01b0316610626610730565b6001600160a01b03161461066f576040805162461bcd60e51b815260206004820181905260248201526000805160206130da833981519152604482015290519081900360640190fd5b600081815260ce6020526040808220805460ff191690555182917f52c8a2680a9f4cc0ad0bf88f32096eadbebf0646ea611d93a0ce6a29a024040591a250565b60026020526000908152604090205460ff1681565b6106cc610cdf565b6001600160a01b03166106dd610730565b6001600160a01b031614610726576040805162461bcd60e51b815260206004820181905260248201526000805160206130da833981519152604482015290519081900360640190fd5b61072e610e08565b565b6038546001600160a01b031690565b60016020526000908152604090205460ff1681565b600554600160a81b900460ff168061076f575061076f610ea8565b806107845750600554600160a01b900460ff16155b6107bf5760405162461bcd60e51b815260040180806020018281038252602e815260200180613086602e913960400191505060405180910390fd5b600554600160a81b900460ff161580156107f6576005805460ff60a01b1960ff60a81b19909116600160a81b1716600160a01b1790555b6005546001600160a01b03161561081f5760405162461bcd60e51b81526004016104e190612f84565b600580546001600160a01b0384166001600160a01b0319918216179091556004805490911661dead179055610852610eb9565b61085a610f72565b610862611082565b61086a611144565b801561087e576005805460ff60a81b191690555b5050565b60ce6020526000908152604090205460ff1681565b6002609c5414156108ef576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6002609c5560408051808201909152601481527327ab26afa61926b2b9b9b0b3b2a932b630bcb2b960611b602082015260009061092b906103cc565b90506001600160a01b0381161561096457336001600160a01b038216146109645760405162461bcd60e51b81526004016104e190612ee7565b61096c6104a8565b156109b1576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b60006109bf87878787610ce3565b90506109cb8184611201565b15156001146109ec5760405162461bcd60e51b81526004016104e190612f3d565b80516020808301919091206000818152600190925260409091205460ff1615610a275760405162461bcd60e51b81526004016104e190612d9c565b600081815260ce602052604090205460ff1615610a565760405162461bcd60e51b81526004016104e190612ea5565b600480546001600160a01b0319166001600160a01b03898116919091179091556040516000918a1690610a8a908990612bb8565b6000604051808303816000865af19150503d8060008114610ac7576040519150601f19603f3d011682016040523d82523d6000602084013e610acc565b606091505b5050600480546001600160a01b03191661dead179055905080151560011415610b4757600082815260016020819052604091829020805460ff19169091179055517f4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c90610b3a908490612ba1565b60405180910390a1610b7f565b7f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f82604051610b769190612ba1565b60405180910390a15b6000833343604051602001610b9693929190612c06565b60408051601f1981840301815291815281516020928301206000908152918290529020805460ff19166001908117909155609c5550505050505050505050565b60035481565b610be4610cdf565b6001600160a01b0316610bf5610730565b6001600160a01b031614610c3e576040805162461bcd60e51b815260206004820181905260248201526000805160206130da833981519152604482015290519081900360640190fd5b6001600160a01b038116610c835760405162461bcd60e51b81526004018080602001828103825260268152602001806130366026913960400191505060405180910390fd5b6038546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3603880546001600160a01b0319166001600160a01b0392909216919091179055565b3390565b606084848484604051602401610cfc9493929190612c6c565b60408051601f198184030181529190526020810180516001600160e01b031663cbd4ece960e01b1790529050949350505050565b610d6e6040518060400160405280601d81526020017f4f564d5f43616e6f6e6963616c5472616e73616374696f6e436861696e0000008152506103cc565b6001600160a01b0316636fee07e0610dba6040518060400160405280601a81526020017f4f564d5f4c3243726f7373446f6d61696e4d657373656e6765720000000000008152506103cc565b83856040518463ffffffff1660e01b8152600401610dda93929190612ca9565b600060405180830381600087803b158015610df457600080fd5b505af1158015610559573d6000803e3d6000fd5b610e106104a8565b15610e55576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b606a805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258610e8b610cdf565b604080516001600160a01b039092168252519081900360200190a1565b6000610eb330611226565b15905090565b600554600160a81b900460ff1680610ed45750610ed4610ea8565b80610ee95750600554600160a01b900460ff16155b610f245760405162461bcd60e51b815260040180806020018281038252602e815260200180613086602e913960400191505060405180910390fd5b600554600160a81b900460ff16158015610f5b576005805460ff60a01b1960ff60a81b19909116600160a81b1716600160a01b1790555b8015610f6f576005805460ff60a81b191690555b50565b600554600160a81b900460ff1680610f8d5750610f8d610ea8565b80610fa25750600554600160a01b900460ff16155b610fdd5760405162461bcd60e51b815260040180806020018281038252602e815260200180613086602e913960400191505060405180910390fd5b600554600160a81b900460ff16158015611014576005805460ff60a01b1960ff60a81b19909116600160a81b1716600160a01b1790555b600061101e610cdf565b603880546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3508015610f6f576005805460ff60a81b1916905550565b600554600160a81b900460ff168061109d575061109d610ea8565b806110b25750600554600160a01b900460ff16155b6110ed5760405162461bcd60e51b815260040180806020018281038252602e815260200180613086602e913960400191505060405180910390fd5b600554600160a81b900460ff16158015611124576005805460ff60a01b1960ff60a81b19909116600160a81b1716600160a01b1790555b606a805460ff191690558015610f6f576005805460ff60a81b1916905550565b600554600160a81b900460ff168061115f575061115f610ea8565b806111745750600554600160a01b900460ff16155b6111af5760405162461bcd60e51b815260040180806020018281038252602e815260200180613086602e913960400191505060405180910390fd5b600554600160a81b900460ff161580156111e6576005805460ff60a01b1960ff60a81b19909116600160a81b1716600160a01b1790555b6001609c558015610f6f576005805460ff60a81b1916905550565b600061120c8261122c565b801561121d575061121d8383611389565b90505b92915050565b3b151590565b60008061126d6040518060400160405280601881526020017f4f564d5f5374617465436f6d6d69746d656e74436861696e00000000000000008152506103cc565b6020840151604051639418bddd60e01b81529192506001600160a01b03831691639418bddd9161129f91600401612fce565b60206040518083038186803b1580156112b757600080fd5b505afa1580156112cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112ef9190612a9a565b1580156113825750825160208401516040808601519051634d69ee5760e01b81526001600160a01b03851693634d69ee5793611332939192909190600401612cdb565b60206040518083038186803b15801561134a57600080fd5b505afa15801561135e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113829190612a9a565b9392505050565b600080836113cb6040518060400160405280601a81526020017f4f564d5f4c3243726f7373446f6d61696e4d657373656e6765720000000000008152506103cc565b6040516020016113dc929190612bd4565b604051602081830303815290604052805190602001206000604051602001611405929190612baa565b604051602081830303815290604052805190602001209050600080611454602160991b6040516020016114389190612b89565b60408051601f19818403018152919052606087015187516114e6565b909250905060018215151461147b5760405162461bcd60e51b81526004016104e190612de7565b60006114868261150f565b90506114db8460405160200161149c9190612ba1565b60405160208183030381529060405260016040516020016114bd9190612c40565b604051602081830303815290604052886080015184604001516115a1565b979650505050505050565b6000606060006114f5866115c5565b90506115028186866115f5565b9250925050935093915050565b611517612634565b6000611522836116c8565b9050604051806080016040528061154c8360008151811061153f57fe5b60200260200101516116db565b81526020016115618360018151811061153f57fe5b81526020016115838360028151811061157657fe5b60200260200101516116e2565b81526020016115988360038151811061157657fe5b90529392505050565b6000806115ad866115c5565b90506115bb818686866117db565b9695505050505050565b606081805190602001206040516020016115df9190612ba1565b6040516020818303038152906040529050919050565b60006060600061160485611801565b90506000806000611616848a896118d8565b8151929550909350915015808061162a5750815b61167b576040805162461bcd60e51b815260206004820152601a60248201527f50726f76696465642070726f6f6620697320696e76616c69642e000000000000604482015290519081900360640190fd5b60008161169757604051806020016040528060008152506116b6565b6116b68660018703815181106116a957fe5b6020026020010151611c7b565b919b919a509098505050505050505050565b60606112206116d683611c97565b611cbc565b6000611220825b600060218260000151111561173e576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e000000000000604482015290519081900360640190fd5b600080600061174c85611e32565b91945092509050600081600181111561176157fe5b146117b3576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e000000000000604482015290519081900360640190fd5b6020808601518401805190918410156115bb5760208490036101000a90049695505050505050565b60008060006117eb8786866115f5565b915091508180156114db57506114db868261215b565b6060600061180e836116c8565b90506000815167ffffffffffffffff8111801561182a57600080fd5b5060405190808252806020026020018201604052801561186457816020015b61185161265b565b8152602001906001900390816118495790505b50905060005b82518110156118d057600061189184838151811061188457fe5b6020026020010151612171565b905060405180604001604052808281526020016118ad836116c8565b8152508383815181106118bc57fe5b60209081029190910101525060010161186a565b509392505050565b600060608180806118e887612200565b9050856000806118f661265b565b60005b8c51811015611c53578c818151811061190e57fe5b60200260200101519150828401935060018701965083600014156119825781518051602090910120851461197d576040805162461bcd60e51b8152602060048201526011602482015270092dcecc2d8d2c840e4dedee840d0c2e6d607b1b604482015290519081900360640190fd5b611a49565b8151516020116119e95781518051602090910120851461197d576040805162461bcd60e51b815260206004820152601b60248201527f496e76616c6964206c6172676520696e7465726e616c20686173680000000000604482015290519081900360640190fd5b846119f783600001516122fd565b14611a49576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420696e7465726e616c206e6f64652068617368000000000000604482015290519081900360640190fd5b60208201515160111415611ab8578551841415611a6557611c53565b6000868581518110611a7357fe5b602001015160f81c60f81b60f81c9050600083602001518260ff1681518110611a9857fe5b60200260200101519050611aab81612329565b9650600194505050611c4b565b60028260200151511415611bfe576000611ad18361235f565b9050600081600081518110611ae257fe5b016020015160f81c9050600181166002036000611b028460ff841661237d565b90506000611b108b8a61237d565b90506000611b1e83836123ae565b905060ff851660021480611b35575060ff85166003145b15611b6757808351148015611b4a5750808251145b15611b5457988901985b50600160ff1b9950611c53945050505050565b60ff85161580611b7a575060ff85166001145b15611bc75780611b975750600160ff1b9950611c53945050505050565b611bb88860200151600181518110611bab57fe5b6020026020010151612329565b9a509750611c4b945050505050565b60405162461bcd60e51b81526004018080602001828103825260268152602001806130b46026913960400191505060405180910390fd5b6040805162461bcd60e51b815260206004820152601d60248201527f526563656976656420616e20756e706172736561626c65206e6f64652e000000604482015290519081900360640190fd5b6001016118f9565b50600160ff1b841486611c66878661237d565b909e909d50909b509950505050505050505050565b6020810151805160609161122091600019810190811061188457fe5b611c9f612675565b506040805180820190915281518152602082810190820152919050565b6060600080611cca84611e32565b91935090915060019050816001811115611ce057fe5b14611d32576040805162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c50206c6973742076616c75652e000000000000000000604482015290519081900360640190fd5b6040805160208082526104208201909252600091816020015b611d53612675565b815260200190600190039081611d4b5790505090506000835b8651811015611e275760208210611db45760405162461bcd60e51b815260040180806020018281038252602a81526020018061305c602a913960400191505060405180910390fd5b600080611de06040518060400160405280858c60000151038152602001858c6020015101815250611e32565b509150915060405180604001604052808383018152602001848b6020015101815250858581518110611e0e57fe5b6020908102919091010152600193909301920101611d6c565b508152949350505050565b600080600080846000015111611e8f576040805162461bcd60e51b815260206004820152601860248201527f524c50206974656d2063616e6e6f74206265206e756c6c2e0000000000000000604482015290519081900360640190fd5b6020840151805160001a607f8111611eb4576000600160009450945094505050612154565b60b78111611f29578551607f198201908110611f17576040805162461bcd60e51b815260206004820152601960248201527f496e76616c696420524c502073686f727420737472696e672e00000000000000604482015290519081900360640190fd5b60019550935060009250612154915050565b60bf811161200d57855160b6198201908110611f8c576040805162461bcd60e51b815260206004820152601f60248201527f496e76616c696420524c50206c6f6e6720737472696e67206c656e6774682e00604482015290519081900360640190fd5b6000816020036101000a6001850151049050808201886000015111611ff8576040805162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c50206c6f6e6720737472696e672e0000000000000000604482015290519081900360640190fd5b60019091019550935060009250612154915050565b60f7811161208157855160bf198201908110612070576040805162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c502073686f7274206c6973742e000000000000000000604482015290519081900360640190fd5b600195509350849250612154915050565b855160f61982019081106120dc576040805162461bcd60e51b815260206004820152601d60248201527f496e76616c696420524c50206c6f6e67206c697374206c656e6774682e000000604482015290519081900360640190fd5b6000816020036101000a6001850151049050808201886000015111612141576040805162461bcd60e51b815260206004820152601660248201527524b73b30b634b210292628103637b733903634b9ba1760511b604482015290519081900360640190fd5b6001918201965094509250612154915050565b9193909250565b8051602091820120825192909101919091201490565b6060600080600061218185611e32565b91945092509050600081600181111561219657fe5b146121e8576040805162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c502062797465732076616c75652e0000000000000000604482015290519081900360640190fd5b6121f785602001518484612414565b95945050505050565b60606000825160020267ffffffffffffffff8111801561221f57600080fd5b506040519080825280601f01601f19166020018201604052801561224a576020820181803683370190505b50905060005b83518110156122f657600484828151811061226757fe5b602001015160f81c60f81b6001600160f81b031916901c82826002028151811061228d57fe5b60200101906001600160f81b031916908160001a90535060108482815181106122b257fe5b016020015160f81c816122c157fe5b0660f81b8282600202600101815181106122d757fe5b60200101906001600160f81b031916908160001a905350600101612250565b5092915050565b6000602082511015612314575060208101516104a3565b81806020019051602081101561049e57600080fd5b6000606060208360000151101561234a57612343836124c2565b9050612356565b61235383612171565b90505b611382816122fd565b6060611220612378836020015160008151811061188457fe5b612200565b606081835103600014156123a05750604080516020810190915260008152611220565b61121d8383848651036124cd565b6000805b8084511180156123c25750808351115b801561240757508281815181106123d557fe5b602001015160f81c60f81b6001600160f81b0319168482815181106123f657fe5b01602001516001600160f81b031916145b1561121d576001016123b2565b606060008267ffffffffffffffff8111801561242f57600080fd5b506040519080825280601f01601f19166020018201604052801561245a576020820181803683370190505b50905080516000141561246e579050611382565b8484016020820160005b60208604811015612499578251825260209283019290910190600101612478565b5080519151601f959095166020036101000a600019019182169119909416179092525092915050565b60606112208261261e565b60608182601f011015612518576040805162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b604482015290519081900360640190fd5b828284011015612560576040805162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b604482015290519081900360640190fd5b818301845110156125ac576040805162461bcd60e51b8152602060048201526011602482015270736c6963655f6f75744f66426f756e647360781b604482015290519081900360640190fd5b6060821580156125cb5760405191506000825260208201604052612615565b6040519150601f8416801560200281840101858101878315602002848b0101015b818310156126045780518352602092830192016125ec565b5050858452601f01601f1916604052505b50949350505050565b6060611220826020015160008460000151612414565b60408051608081018252600080825260208201819052918101829052606081019190915290565b604051806040016040528060608152602001606081525090565b604051806040016040528060008152602001600081525090565b600067ffffffffffffffff8311156126a357fe5b6126b6601f8401601f1916602001612fe1565b90508281528383830111156126ca57600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b03811681146104a357600080fd5b600082601f830112612708578081fd5b61121d8383356020850161268f565b600060a08284031215612728578081fd5b60405160a0810167ffffffffffffffff828210818311171561274657fe5b8160405282935084358352602085013560208401526040850135604084015260608501356060840152608085013591508082111561278357600080fd5b50612790858286016126f8565b6080830152505092915050565b6000604082840312156127ae578081fd5b6040516040810167ffffffffffffffff82821081831117156127cc57fe5b81604052829350843583526020915081850135818111156127ec57600080fd5b8501601f810187136127fd57600080fd5b80358281111561280957fe5b8381029250612819848401612fe1565b8181528481019083860185850187018b101561283457600080fd5b600095505b83861015612857578035835260019590950194918601918601612839565b5080868801525050505050505092915050565b803563ffffffff811681146104a357600080fd5b60006020828403121561288f578081fd5b61121d826126e1565b600080600080600060a086880312156128af578081fd5b6128b8866126e1565b94506128c6602087016126e1565b9350604086013567ffffffffffffffff808211156128e2578283fd5b6128ee89838a016126f8565b945060608801359350608088013591508082111561290a578283fd5b9087019060a0828a03121561291d578283fd5b61292760a0612fe1565b8235815260208301358281111561293c578485fd5b6129488b828601612717565b60208301525060408301358281111561295f578485fd5b61296b8b82860161279d565b604083015250606083013582811115612982578485fd5b61298e8b8286016126f8565b6060830152506080830135828111156129a5578485fd5b6129b18b8286016126f8565b6080830152508093505050509295509295909350565b600080600080600060a086880312156129de578081fd5b6129e7866126e1565b94506129f5602087016126e1565b9350604086013567ffffffffffffffff811115612a10578182fd5b612a1c888289016126f8565b93505060608601359150612a326080870161286a565b90509295509295909350565b600080600060608486031215612a52578283fd5b612a5b846126e1565b9250602084013567ffffffffffffffff811115612a76578283fd5b612a82868287016126f8565b925050612a916040850161286a565b90509250925092565b600060208284031215612aab578081fd5b8151801515811461121d578182fd5b600060208284031215612acb578081fd5b5035919050565b600060208284031215612ae3578081fd5b813567ffffffffffffffff811115612af9578182fd5b8201601f81018413612b09578182fd5b612b188482356020840161268f565b949350505050565b60008151808452612b38816020860160208601613005565b601f01601f19169290920160200192915050565b600081518352602082015160208401526040820151604084015260608201516060840152608082015160a06080850152612b1860a0850182612b20565b60609190911b6001600160601b031916815260140190565b90815260200190565b918252602082015260400190565b60008251612bca818460208701613005565b9190910192915050565b60008351612be6818460208801613005565b60609390931b6001600160601b0319169190920190815260140192915050565b60008451612c18818460208901613005565b60609490941b6001600160601b03191691909301908152601481019190915260340192915050565b60f89190911b6001600160f81b031916815260010190565b6001600160a01b0391909116815260200190565b6001600160a01b03858116825284166020820152608060408201819052600090612c9890830185612b20565b905082606083015295945050505050565b600060018060a01b0385168252836020830152606060408301526121f76060830184612b20565b901515815260200190565b60008482526020606081840152612cf56060840186612b4c565b838103604085015260408101855182528286015160408484015281815180845260608501915085830194508693505b80841015612d445784518252938501936001939093019290850190612d24565b509998505050505050505050565b60006020825261121d6020830184612b20565b6020808252601f908201527f78446f6d61696e4d65737361676553656e646572206973206e6f742073657400604082015260600190565b6020808252602b908201527f50726f7669646564206d6573736167652068617320616c72656164792062656560408201526a37103932b1b2b4bb32b21760a91b606082015260800190565b6020808252604d908201527f4d6573736167652070617373696e67207072656465706c6f7920686173206e6f60408201527f74206265656e20696e697469616c697a6564206f7220696e76616c696420707260608201526c37b7b310383937bb34b232b21760991b608082015260a00190565b6020808252602b908201527f50726f7669646564206d65737361676520686173206e6f7420616c726561647960408201526a103132b2b71039b2b73a1760a91b606082015260800190565b60208082526022908201527f50726f7669646564206d65737361676520686173206265656e20626c6f636b65604082015261321760f11b606082015260800190565b60208082526036908201527f4f6e6c79204f564d5f4c324d65737361676552656c617965722063616e2072656040820152753630bc90261916ba3796a6189036b2b9b9b0b3b2b99760511b606082015260800190565b60208082526027908201527f50726f7669646564206d65737361676520636f756c64206e6f742062652076656040820152663934b334b2b21760c91b606082015260800190565b6020808252602a908201527f4c3143726f7373446f6d61696e4d657373656e67657220616c72656164792069604082015269373a34b0b634bd32b21760b11b606082015260800190565b60006020825261121d6020830184612b4c565b60405181810167ffffffffffffffff81118282101715612ffd57fe5b604052919050565b60005b83811015613020578181015183820152602001613008565b8381111561302f576000848401525b5050505056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737350726f766964656420524c50206c6973742065786365656473206d6178206c697374206c656e6774682e496e697469616c697a61626c653a20636f6e747261637420697320616c726561647920696e697469616c697a656452656365697665642061206e6f6465207769746820616e20756e6b6e6f776e207072656669784f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a2646970667358221220c8b08248358fc9118d8d145603700ec8109487e93128f8f4b5dafd0a63cf3bad64736f6c63430007060033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101215760003560e01c806381ada46c116100ad578063c4d66de811610071578063c4d66de814610213578063c6b94ab014610226578063d7fd19dd14610239578063ecc704281461024c578063f2fde38b1461026157610121565b806381ada46c146101ca57806382e3702d146101dd5780638456cb59146101f05780638da5cb5b146101f8578063b1b1b2091461020057610121565b8063461a4478116100f4578063461a44781461018c5780635c975abb1461019f5780636e296e45146101a7578063706ceab6146101af578063715018a6146101c257610121565b80630ecf2eea1461012657806321d800ec1461013b578063299ca478146101645780633dbb202b14610179575b600080fd5b610139610134366004612aba565b610274565b005b61014e610149366004612aba565b610319565b60405161015b9190612cd0565b60405180910390f35b61016c61032e565b60405161015b9190612c58565b610139610187366004612a3e565b61033d565b61016c61019a366004612ad2565b6103cc565b61014e6104a8565b61016c6104b1565b6101396101bd3660046129c7565b6104fa565b610139610561565b6101396101d8366004612aba565b61060d565b61014e6101eb366004612aba565b6106af565b6101396106c4565b61016c610730565b61014e61020e366004612aba565b61073f565b61013961022136600461287e565b610754565b61014e610234366004612aba565b610882565b610139610247366004612898565b610897565b610254610bd6565b60405161015b9190612ba1565b61013961026f36600461287e565b610bdc565b61027c610cdf565b6001600160a01b031661028d610730565b6001600160a01b0316146102d6576040805162461bcd60e51b815260206004820181905260248201526000805160206130da833981519152604482015290519081900360640190fd5b600081815260ce6020526040808220805460ff191660011790555182917ff52508d5339edf0d7e5060a416df98db067af561bdc60872d29c0439eaa13a0291a250565b60006020819052908152604090205460ff1681565b6005546001600160a01b031681565b600061034d843385600354610ce3565b60038054600190810190915581516020808401919091206000908152600290915260409020805460ff19169091179055905061038f8163ffffffff8416610d30565b7f0ee9ffdb2334d78de97ffb066b23a352a4d35180cefb36589d663fbb1eb6f326816040516103be9190612d52565b60405180910390a150505050565b60055460405163bf40fac160e01b81526020600482018181528451602484015284516000946001600160a01b03169363bf40fac1938793928392604401918501908083838b5b8381101561042a578181015183820152602001610412565b50505050905090810190601f1680156104575780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561047457600080fd5b505afa158015610488573d6000803e3d6000fd5b505050506040513d602081101561049e57600080fd5b505190505b919050565b606a5460ff1690565b6004546000906001600160a01b031661dead14156104ea5760405162461bcd60e51b81526004016104e190612d65565b60405180910390fd5b506004546001600160a01b031690565b600061050886868686610ce3565b805160208083019190912060009081526002909152604090205490915060ff1615156001146105495760405162461bcd60e51b81526004016104e190612e5a565b610559818363ffffffff16610d30565b505050505050565b610569610cdf565b6001600160a01b031661057a610730565b6001600160a01b0316146105c3576040805162461bcd60e51b815260206004820181905260248201526000805160206130da833981519152604482015290519081900360640190fd5b6038546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3603880546001600160a01b0319169055565b610615610cdf565b6001600160a01b0316610626610730565b6001600160a01b03161461066f576040805162461bcd60e51b815260206004820181905260248201526000805160206130da833981519152604482015290519081900360640190fd5b600081815260ce6020526040808220805460ff191690555182917f52c8a2680a9f4cc0ad0bf88f32096eadbebf0646ea611d93a0ce6a29a024040591a250565b60026020526000908152604090205460ff1681565b6106cc610cdf565b6001600160a01b03166106dd610730565b6001600160a01b031614610726576040805162461bcd60e51b815260206004820181905260248201526000805160206130da833981519152604482015290519081900360640190fd5b61072e610e08565b565b6038546001600160a01b031690565b60016020526000908152604090205460ff1681565b600554600160a81b900460ff168061076f575061076f610ea8565b806107845750600554600160a01b900460ff16155b6107bf5760405162461bcd60e51b815260040180806020018281038252602e815260200180613086602e913960400191505060405180910390fd5b600554600160a81b900460ff161580156107f6576005805460ff60a01b1960ff60a81b19909116600160a81b1716600160a01b1790555b6005546001600160a01b03161561081f5760405162461bcd60e51b81526004016104e190612f84565b600580546001600160a01b0384166001600160a01b0319918216179091556004805490911661dead179055610852610eb9565b61085a610f72565b610862611082565b61086a611144565b801561087e576005805460ff60a81b191690555b5050565b60ce6020526000908152604090205460ff1681565b6002609c5414156108ef576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6002609c5560408051808201909152601481527327ab26afa61926b2b9b9b0b3b2a932b630bcb2b960611b602082015260009061092b906103cc565b90506001600160a01b0381161561096457336001600160a01b038216146109645760405162461bcd60e51b81526004016104e190612ee7565b61096c6104a8565b156109b1576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b60006109bf87878787610ce3565b90506109cb8184611201565b15156001146109ec5760405162461bcd60e51b81526004016104e190612f3d565b80516020808301919091206000818152600190925260409091205460ff1615610a275760405162461bcd60e51b81526004016104e190612d9c565b600081815260ce602052604090205460ff1615610a565760405162461bcd60e51b81526004016104e190612ea5565b600480546001600160a01b0319166001600160a01b03898116919091179091556040516000918a1690610a8a908990612bb8565b6000604051808303816000865af19150503d8060008114610ac7576040519150601f19603f3d011682016040523d82523d6000602084013e610acc565b606091505b5050600480546001600160a01b03191661dead179055905080151560011415610b4757600082815260016020819052604091829020805460ff19169091179055517f4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c90610b3a908490612ba1565b60405180910390a1610b7f565b7f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f82604051610b769190612ba1565b60405180910390a15b6000833343604051602001610b9693929190612c06565b60408051601f1981840301815291815281516020928301206000908152918290529020805460ff19166001908117909155609c5550505050505050505050565b60035481565b610be4610cdf565b6001600160a01b0316610bf5610730565b6001600160a01b031614610c3e576040805162461bcd60e51b815260206004820181905260248201526000805160206130da833981519152604482015290519081900360640190fd5b6001600160a01b038116610c835760405162461bcd60e51b81526004018080602001828103825260268152602001806130366026913960400191505060405180910390fd5b6038546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3603880546001600160a01b0319166001600160a01b0392909216919091179055565b3390565b606084848484604051602401610cfc9493929190612c6c565b60408051601f198184030181529190526020810180516001600160e01b031663cbd4ece960e01b1790529050949350505050565b610d6e6040518060400160405280601d81526020017f4f564d5f43616e6f6e6963616c5472616e73616374696f6e436861696e0000008152506103cc565b6001600160a01b0316636fee07e0610dba6040518060400160405280601a81526020017f4f564d5f4c3243726f7373446f6d61696e4d657373656e6765720000000000008152506103cc565b83856040518463ffffffff1660e01b8152600401610dda93929190612ca9565b600060405180830381600087803b158015610df457600080fd5b505af1158015610559573d6000803e3d6000fd5b610e106104a8565b15610e55576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b606a805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258610e8b610cdf565b604080516001600160a01b039092168252519081900360200190a1565b6000610eb330611226565b15905090565b600554600160a81b900460ff1680610ed45750610ed4610ea8565b80610ee95750600554600160a01b900460ff16155b610f245760405162461bcd60e51b815260040180806020018281038252602e815260200180613086602e913960400191505060405180910390fd5b600554600160a81b900460ff16158015610f5b576005805460ff60a01b1960ff60a81b19909116600160a81b1716600160a01b1790555b8015610f6f576005805460ff60a81b191690555b50565b600554600160a81b900460ff1680610f8d5750610f8d610ea8565b80610fa25750600554600160a01b900460ff16155b610fdd5760405162461bcd60e51b815260040180806020018281038252602e815260200180613086602e913960400191505060405180910390fd5b600554600160a81b900460ff16158015611014576005805460ff60a01b1960ff60a81b19909116600160a81b1716600160a01b1790555b600061101e610cdf565b603880546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3508015610f6f576005805460ff60a81b1916905550565b600554600160a81b900460ff168061109d575061109d610ea8565b806110b25750600554600160a01b900460ff16155b6110ed5760405162461bcd60e51b815260040180806020018281038252602e815260200180613086602e913960400191505060405180910390fd5b600554600160a81b900460ff16158015611124576005805460ff60a01b1960ff60a81b19909116600160a81b1716600160a01b1790555b606a805460ff191690558015610f6f576005805460ff60a81b1916905550565b600554600160a81b900460ff168061115f575061115f610ea8565b806111745750600554600160a01b900460ff16155b6111af5760405162461bcd60e51b815260040180806020018281038252602e815260200180613086602e913960400191505060405180910390fd5b600554600160a81b900460ff161580156111e6576005805460ff60a01b1960ff60a81b19909116600160a81b1716600160a01b1790555b6001609c558015610f6f576005805460ff60a81b1916905550565b600061120c8261122c565b801561121d575061121d8383611389565b90505b92915050565b3b151590565b60008061126d6040518060400160405280601881526020017f4f564d5f5374617465436f6d6d69746d656e74436861696e00000000000000008152506103cc565b6020840151604051639418bddd60e01b81529192506001600160a01b03831691639418bddd9161129f91600401612fce565b60206040518083038186803b1580156112b757600080fd5b505afa1580156112cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112ef9190612a9a565b1580156113825750825160208401516040808601519051634d69ee5760e01b81526001600160a01b03851693634d69ee5793611332939192909190600401612cdb565b60206040518083038186803b15801561134a57600080fd5b505afa15801561135e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113829190612a9a565b9392505050565b600080836113cb6040518060400160405280601a81526020017f4f564d5f4c3243726f7373446f6d61696e4d657373656e6765720000000000008152506103cc565b6040516020016113dc929190612bd4565b604051602081830303815290604052805190602001206000604051602001611405929190612baa565b604051602081830303815290604052805190602001209050600080611454602160991b6040516020016114389190612b89565b60408051601f19818403018152919052606087015187516114e6565b909250905060018215151461147b5760405162461bcd60e51b81526004016104e190612de7565b60006114868261150f565b90506114db8460405160200161149c9190612ba1565b60405160208183030381529060405260016040516020016114bd9190612c40565b604051602081830303815290604052886080015184604001516115a1565b979650505050505050565b6000606060006114f5866115c5565b90506115028186866115f5565b9250925050935093915050565b611517612634565b6000611522836116c8565b9050604051806080016040528061154c8360008151811061153f57fe5b60200260200101516116db565b81526020016115618360018151811061153f57fe5b81526020016115838360028151811061157657fe5b60200260200101516116e2565b81526020016115988360038151811061157657fe5b90529392505050565b6000806115ad866115c5565b90506115bb818686866117db565b9695505050505050565b606081805190602001206040516020016115df9190612ba1565b6040516020818303038152906040529050919050565b60006060600061160485611801565b90506000806000611616848a896118d8565b8151929550909350915015808061162a5750815b61167b576040805162461bcd60e51b815260206004820152601a60248201527f50726f76696465642070726f6f6620697320696e76616c69642e000000000000604482015290519081900360640190fd5b60008161169757604051806020016040528060008152506116b6565b6116b68660018703815181106116a957fe5b6020026020010151611c7b565b919b919a509098505050505050505050565b60606112206116d683611c97565b611cbc565b6000611220825b600060218260000151111561173e576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e000000000000604482015290519081900360640190fd5b600080600061174c85611e32565b91945092509050600081600181111561176157fe5b146117b3576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e000000000000604482015290519081900360640190fd5b6020808601518401805190918410156115bb5760208490036101000a90049695505050505050565b60008060006117eb8786866115f5565b915091508180156114db57506114db868261215b565b6060600061180e836116c8565b90506000815167ffffffffffffffff8111801561182a57600080fd5b5060405190808252806020026020018201604052801561186457816020015b61185161265b565b8152602001906001900390816118495790505b50905060005b82518110156118d057600061189184838151811061188457fe5b6020026020010151612171565b905060405180604001604052808281526020016118ad836116c8565b8152508383815181106118bc57fe5b60209081029190910101525060010161186a565b509392505050565b600060608180806118e887612200565b9050856000806118f661265b565b60005b8c51811015611c53578c818151811061190e57fe5b60200260200101519150828401935060018701965083600014156119825781518051602090910120851461197d576040805162461bcd60e51b8152602060048201526011602482015270092dcecc2d8d2c840e4dedee840d0c2e6d607b1b604482015290519081900360640190fd5b611a49565b8151516020116119e95781518051602090910120851461197d576040805162461bcd60e51b815260206004820152601b60248201527f496e76616c6964206c6172676520696e7465726e616c20686173680000000000604482015290519081900360640190fd5b846119f783600001516122fd565b14611a49576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420696e7465726e616c206e6f64652068617368000000000000604482015290519081900360640190fd5b60208201515160111415611ab8578551841415611a6557611c53565b6000868581518110611a7357fe5b602001015160f81c60f81b60f81c9050600083602001518260ff1681518110611a9857fe5b60200260200101519050611aab81612329565b9650600194505050611c4b565b60028260200151511415611bfe576000611ad18361235f565b9050600081600081518110611ae257fe5b016020015160f81c9050600181166002036000611b028460ff841661237d565b90506000611b108b8a61237d565b90506000611b1e83836123ae565b905060ff851660021480611b35575060ff85166003145b15611b6757808351148015611b4a5750808251145b15611b5457988901985b50600160ff1b9950611c53945050505050565b60ff85161580611b7a575060ff85166001145b15611bc75780611b975750600160ff1b9950611c53945050505050565b611bb88860200151600181518110611bab57fe5b6020026020010151612329565b9a509750611c4b945050505050565b60405162461bcd60e51b81526004018080602001828103825260268152602001806130b46026913960400191505060405180910390fd5b6040805162461bcd60e51b815260206004820152601d60248201527f526563656976656420616e20756e706172736561626c65206e6f64652e000000604482015290519081900360640190fd5b6001016118f9565b50600160ff1b841486611c66878661237d565b909e909d50909b509950505050505050505050565b6020810151805160609161122091600019810190811061188457fe5b611c9f612675565b506040805180820190915281518152602082810190820152919050565b6060600080611cca84611e32565b91935090915060019050816001811115611ce057fe5b14611d32576040805162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c50206c6973742076616c75652e000000000000000000604482015290519081900360640190fd5b6040805160208082526104208201909252600091816020015b611d53612675565b815260200190600190039081611d4b5790505090506000835b8651811015611e275760208210611db45760405162461bcd60e51b815260040180806020018281038252602a81526020018061305c602a913960400191505060405180910390fd5b600080611de06040518060400160405280858c60000151038152602001858c6020015101815250611e32565b509150915060405180604001604052808383018152602001848b6020015101815250858581518110611e0e57fe5b6020908102919091010152600193909301920101611d6c565b508152949350505050565b600080600080846000015111611e8f576040805162461bcd60e51b815260206004820152601860248201527f524c50206974656d2063616e6e6f74206265206e756c6c2e0000000000000000604482015290519081900360640190fd5b6020840151805160001a607f8111611eb4576000600160009450945094505050612154565b60b78111611f29578551607f198201908110611f17576040805162461bcd60e51b815260206004820152601960248201527f496e76616c696420524c502073686f727420737472696e672e00000000000000604482015290519081900360640190fd5b60019550935060009250612154915050565b60bf811161200d57855160b6198201908110611f8c576040805162461bcd60e51b815260206004820152601f60248201527f496e76616c696420524c50206c6f6e6720737472696e67206c656e6774682e00604482015290519081900360640190fd5b6000816020036101000a6001850151049050808201886000015111611ff8576040805162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c50206c6f6e6720737472696e672e0000000000000000604482015290519081900360640190fd5b60019091019550935060009250612154915050565b60f7811161208157855160bf198201908110612070576040805162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c502073686f7274206c6973742e000000000000000000604482015290519081900360640190fd5b600195509350849250612154915050565b855160f61982019081106120dc576040805162461bcd60e51b815260206004820152601d60248201527f496e76616c696420524c50206c6f6e67206c697374206c656e6774682e000000604482015290519081900360640190fd5b6000816020036101000a6001850151049050808201886000015111612141576040805162461bcd60e51b815260206004820152601660248201527524b73b30b634b210292628103637b733903634b9ba1760511b604482015290519081900360640190fd5b6001918201965094509250612154915050565b9193909250565b8051602091820120825192909101919091201490565b6060600080600061218185611e32565b91945092509050600081600181111561219657fe5b146121e8576040805162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c502062797465732076616c75652e0000000000000000604482015290519081900360640190fd5b6121f785602001518484612414565b95945050505050565b60606000825160020267ffffffffffffffff8111801561221f57600080fd5b506040519080825280601f01601f19166020018201604052801561224a576020820181803683370190505b50905060005b83518110156122f657600484828151811061226757fe5b602001015160f81c60f81b6001600160f81b031916901c82826002028151811061228d57fe5b60200101906001600160f81b031916908160001a90535060108482815181106122b257fe5b016020015160f81c816122c157fe5b0660f81b8282600202600101815181106122d757fe5b60200101906001600160f81b031916908160001a905350600101612250565b5092915050565b6000602082511015612314575060208101516104a3565b81806020019051602081101561049e57600080fd5b6000606060208360000151101561234a57612343836124c2565b9050612356565b61235383612171565b90505b611382816122fd565b6060611220612378836020015160008151811061188457fe5b612200565b606081835103600014156123a05750604080516020810190915260008152611220565b61121d8383848651036124cd565b6000805b8084511180156123c25750808351115b801561240757508281815181106123d557fe5b602001015160f81c60f81b6001600160f81b0319168482815181106123f657fe5b01602001516001600160f81b031916145b1561121d576001016123b2565b606060008267ffffffffffffffff8111801561242f57600080fd5b506040519080825280601f01601f19166020018201604052801561245a576020820181803683370190505b50905080516000141561246e579050611382565b8484016020820160005b60208604811015612499578251825260209283019290910190600101612478565b5080519151601f959095166020036101000a600019019182169119909416179092525092915050565b60606112208261261e565b60608182601f011015612518576040805162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b604482015290519081900360640190fd5b828284011015612560576040805162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b604482015290519081900360640190fd5b818301845110156125ac576040805162461bcd60e51b8152602060048201526011602482015270736c6963655f6f75744f66426f756e647360781b604482015290519081900360640190fd5b6060821580156125cb5760405191506000825260208201604052612615565b6040519150601f8416801560200281840101858101878315602002848b0101015b818310156126045780518352602092830192016125ec565b5050858452601f01601f1916604052505b50949350505050565b6060611220826020015160008460000151612414565b60408051608081018252600080825260208201819052918101829052606081019190915290565b604051806040016040528060608152602001606081525090565b604051806040016040528060008152602001600081525090565b600067ffffffffffffffff8311156126a357fe5b6126b6601f8401601f1916602001612fe1565b90508281528383830111156126ca57600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b03811681146104a357600080fd5b600082601f830112612708578081fd5b61121d8383356020850161268f565b600060a08284031215612728578081fd5b60405160a0810167ffffffffffffffff828210818311171561274657fe5b8160405282935084358352602085013560208401526040850135604084015260608501356060840152608085013591508082111561278357600080fd5b50612790858286016126f8565b6080830152505092915050565b6000604082840312156127ae578081fd5b6040516040810167ffffffffffffffff82821081831117156127cc57fe5b81604052829350843583526020915081850135818111156127ec57600080fd5b8501601f810187136127fd57600080fd5b80358281111561280957fe5b8381029250612819848401612fe1565b8181528481019083860185850187018b101561283457600080fd5b600095505b83861015612857578035835260019590950194918601918601612839565b5080868801525050505050505092915050565b803563ffffffff811681146104a357600080fd5b60006020828403121561288f578081fd5b61121d826126e1565b600080600080600060a086880312156128af578081fd5b6128b8866126e1565b94506128c6602087016126e1565b9350604086013567ffffffffffffffff808211156128e2578283fd5b6128ee89838a016126f8565b945060608801359350608088013591508082111561290a578283fd5b9087019060a0828a03121561291d578283fd5b61292760a0612fe1565b8235815260208301358281111561293c578485fd5b6129488b828601612717565b60208301525060408301358281111561295f578485fd5b61296b8b82860161279d565b604083015250606083013582811115612982578485fd5b61298e8b8286016126f8565b6060830152506080830135828111156129a5578485fd5b6129b18b8286016126f8565b6080830152508093505050509295509295909350565b600080600080600060a086880312156129de578081fd5b6129e7866126e1565b94506129f5602087016126e1565b9350604086013567ffffffffffffffff811115612a10578182fd5b612a1c888289016126f8565b93505060608601359150612a326080870161286a565b90509295509295909350565b600080600060608486031215612a52578283fd5b612a5b846126e1565b9250602084013567ffffffffffffffff811115612a76578283fd5b612a82868287016126f8565b925050612a916040850161286a565b90509250925092565b600060208284031215612aab578081fd5b8151801515811461121d578182fd5b600060208284031215612acb578081fd5b5035919050565b600060208284031215612ae3578081fd5b813567ffffffffffffffff811115612af9578182fd5b8201601f81018413612b09578182fd5b612b188482356020840161268f565b949350505050565b60008151808452612b38816020860160208601613005565b601f01601f19169290920160200192915050565b600081518352602082015160208401526040820151604084015260608201516060840152608082015160a06080850152612b1860a0850182612b20565b60609190911b6001600160601b031916815260140190565b90815260200190565b918252602082015260400190565b60008251612bca818460208701613005565b9190910192915050565b60008351612be6818460208801613005565b60609390931b6001600160601b0319169190920190815260140192915050565b60008451612c18818460208901613005565b60609490941b6001600160601b03191691909301908152601481019190915260340192915050565b60f89190911b6001600160f81b031916815260010190565b6001600160a01b0391909116815260200190565b6001600160a01b03858116825284166020820152608060408201819052600090612c9890830185612b20565b905082606083015295945050505050565b600060018060a01b0385168252836020830152606060408301526121f76060830184612b20565b901515815260200190565b60008482526020606081840152612cf56060840186612b4c565b838103604085015260408101855182528286015160408484015281815180845260608501915085830194508693505b80841015612d445784518252938501936001939093019290850190612d24565b509998505050505050505050565b60006020825261121d6020830184612b20565b6020808252601f908201527f78446f6d61696e4d65737361676553656e646572206973206e6f742073657400604082015260600190565b6020808252602b908201527f50726f7669646564206d6573736167652068617320616c72656164792062656560408201526a37103932b1b2b4bb32b21760a91b606082015260800190565b6020808252604d908201527f4d6573736167652070617373696e67207072656465706c6f7920686173206e6f60408201527f74206265656e20696e697469616c697a6564206f7220696e76616c696420707260608201526c37b7b310383937bb34b232b21760991b608082015260a00190565b6020808252602b908201527f50726f7669646564206d65737361676520686173206e6f7420616c726561647960408201526a103132b2b71039b2b73a1760a91b606082015260800190565b60208082526022908201527f50726f7669646564206d65737361676520686173206265656e20626c6f636b65604082015261321760f11b606082015260800190565b60208082526036908201527f4f6e6c79204f564d5f4c324d65737361676552656c617965722063616e2072656040820152753630bc90261916ba3796a6189036b2b9b9b0b3b2b99760511b606082015260800190565b60208082526027908201527f50726f7669646564206d65737361676520636f756c64206e6f742062652076656040820152663934b334b2b21760c91b606082015260800190565b6020808252602a908201527f4c3143726f7373446f6d61696e4d657373656e67657220616c72656164792069604082015269373a34b0b634bd32b21760b11b606082015260800190565b60006020825261121d6020830184612b4c565b60405181810167ffffffffffffffff81118282101715612ffd57fe5b604052919050565b60005b83811015613020578181015183820152602001613008565b8381111561302f576000848401525b5050505056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737350726f766964656420524c50206c6973742065786365656473206d6178206c697374206c656e6774682e496e697469616c697a61626c653a20636f6e747261637420697320616c726561647920696e697469616c697a656452656365697665642061206e6f6465207769746820616e20756e6b6e6f776e207072656669784f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a2646970667358221220c8b08248358fc9118d8d145603700ec8109487e93128f8f4b5dafd0a63cf3bad64736f6c63430007060033", + "devdoc": { + "details": "The L1 Cross Domain Messenger contract sends messages from L1 to L2, and relays messages from L2 onto L1. In the event that a message sent from L1 to L2 is rejected for exceeding the L2 epoch gas limit, it can be resubmitted via this contract's replay function. Compiler used: solc Runtime target: EVM", + "kind": "dev", + "methods": { + "allowMessage(bytes32)": { + "params": { + "_xDomainCalldataHash": "Hash of the message to block." + } + }, + "blockMessage(bytes32)": { + "params": { + "_xDomainCalldataHash": "Hash of the message to block." + } + }, + "initialize(address)": { + "params": { + "_libAddressManager": "Address of the Address Manager." + } + }, + "owner()": { + "details": "Returns the address of the current owner." + }, + "paused()": { + "details": "Returns true if the contract is paused, and false otherwise." + }, + "relayMessage(address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))": { + "params": { + "_message": "Message to send to the target.", + "_messageNonce": "Nonce for the provided message.", + "_proof": "Inclusion proof for the given message.", + "_sender": "Message sender address.", + "_target": "Target contract address." + } + }, + "renounceOwnership()": { + "details": "Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner." + }, + "replayMessage(address,address,bytes,uint256,uint32)": { + "params": { + "_gasLimit": "Gas limit for the provided message.", + "_message": "Message to send to the target.", + "_messageNonce": "Nonce for the provided message.", + "_sender": "Original sender address.", + "_target": "Target contract address." + } + }, + "resolve(string)": { + "params": { + "_name": "Name to resolve an address for." + }, + "returns": { + "_0": "Address associated with the given name." + } + }, + "sendMessage(address,bytes,uint32)": { + "params": { + "_gasLimit": "Gas limit for the provided message.", + "_message": "Message to send to the target.", + "_target": "Target contract address." + } + }, + "transferOwnership(address)": { + "details": "Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner." + } + }, + "title": "OVM_L1CrossDomainMessenger", + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": { + "allowMessage(bytes32)": { + "notice": "Allow a message." + }, + "blockMessage(bytes32)": { + "notice": "Block a message." + }, + "constructor": { + "notice": "This contract is intended to be behind a delegate proxy. We pass the zero address to the address resolver just to satisfy the constructor. We still need to set this value in initialize()." + }, + "pause()": { + "notice": "Pause relaying." + }, + "relayMessage(address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))": { + "notice": "Relays a cross domain message to a contract." + }, + "replayMessage(address,address,bytes,uint256,uint32)": { + "notice": "Replays a cross domain message to the target messenger." + }, + "resolve(string)": { + "notice": "Resolves the address associated with a given name." + }, + "sendMessage(address,bytes,uint32)": { + "notice": "Sends a cross domain message to the target messenger." + } + }, + "version": 1 + }, + "storageLayout": { + "storage": [ + { + "astId": 1272, + "contract": "contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1CrossDomainMessenger.sol:OVM_L1CrossDomainMessenger", + "label": "relayedMessages", + "offset": 0, + "slot": "0", + "type": "t_mapping(t_bytes32,t_bool)" + }, + { + "astId": 1276, + "contract": "contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1CrossDomainMessenger.sol:OVM_L1CrossDomainMessenger", + "label": "successfulMessages", + "offset": 0, + "slot": "1", + "type": "t_mapping(t_bytes32,t_bool)" + }, + { + "astId": 1280, + "contract": "contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1CrossDomainMessenger.sol:OVM_L1CrossDomainMessenger", + "label": "sentMessages", + "offset": 0, + "slot": "2", + "type": "t_mapping(t_bytes32,t_bool)" + }, + { + "astId": 1282, + "contract": "contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1CrossDomainMessenger.sol:OVM_L1CrossDomainMessenger", + "label": "messageNonce", + "offset": 0, + "slot": "3", + "type": "t_uint256" + }, + { + "astId": 1285, + "contract": "contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1CrossDomainMessenger.sol:OVM_L1CrossDomainMessenger", + "label": "xDomainMsgSender", + "offset": 0, + "slot": "4", + "type": "t_address" + }, + { + "astId": 12800, + "contract": "contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1CrossDomainMessenger.sol:OVM_L1CrossDomainMessenger", + "label": "libAddressManager", + "offset": 0, + "slot": "5", + "type": "t_contract(Lib_AddressManager)12793" + }, + { + "astId": 137, + "contract": "contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1CrossDomainMessenger.sol:OVM_L1CrossDomainMessenger", + "label": "_initialized", + "offset": 20, + "slot": "5", + "type": "t_bool" + }, + { + "astId": 140, + "contract": "contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1CrossDomainMessenger.sol:OVM_L1CrossDomainMessenger", + "label": "_initializing", + "offset": 21, + "slot": "5", + "type": "t_bool" + }, + { + "astId": 484, + "contract": "contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1CrossDomainMessenger.sol:OVM_L1CrossDomainMessenger", + "label": "__gap", + "offset": 0, + "slot": "6", + "type": "t_array(t_uint256)50_storage" + }, + { + "astId": 10, + "contract": "contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1CrossDomainMessenger.sol:OVM_L1CrossDomainMessenger", + "label": "_owner", + "offset": 0, + "slot": "56", + "type": "t_address" + }, + { + "astId": 129, + "contract": "contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1CrossDomainMessenger.sol:OVM_L1CrossDomainMessenger", + "label": "__gap", + "offset": 0, + "slot": "57", + "type": "t_array(t_uint256)49_storage" + }, + { + "astId": 506, + "contract": "contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1CrossDomainMessenger.sol:OVM_L1CrossDomainMessenger", + "label": "_paused", + "offset": 0, + "slot": "106", + "type": "t_bool" + }, + { + "astId": 597, + "contract": "contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1CrossDomainMessenger.sol:OVM_L1CrossDomainMessenger", + "label": "__gap", + "offset": 0, + "slot": "107", + "type": "t_array(t_uint256)49_storage" + }, + { + "astId": 612, + "contract": "contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1CrossDomainMessenger.sol:OVM_L1CrossDomainMessenger", + "label": "_status", + "offset": 0, + "slot": "156", + "type": "t_uint256" + }, + { + "astId": 655, + "contract": "contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1CrossDomainMessenger.sol:OVM_L1CrossDomainMessenger", + "label": "__gap", + "offset": 0, + "slot": "157", + "type": "t_array(t_uint256)49_storage" + }, + { + "astId": 1436, + "contract": "contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1CrossDomainMessenger.sol:OVM_L1CrossDomainMessenger", + "label": "blockedMessages", + "offset": 0, + "slot": "206", + "type": "t_mapping(t_bytes32,t_bool)" + } + ], + "types": { + "t_address": { + "encoding": "inplace", + "label": "address", + "numberOfBytes": "20" + }, + "t_array(t_uint256)49_storage": { + "base": "t_uint256", + "encoding": "inplace", + "label": "uint256[49]", + "numberOfBytes": "1568" + }, + "t_array(t_uint256)50_storage": { + "base": "t_uint256", + "encoding": "inplace", + "label": "uint256[50]", + "numberOfBytes": "1600" + }, + "t_bool": { + "encoding": "inplace", + "label": "bool", + "numberOfBytes": "1" + }, + "t_bytes32": { + "encoding": "inplace", + "label": "bytes32", + "numberOfBytes": "32" + }, + "t_contract(Lib_AddressManager)12793": { + "encoding": "inplace", + "label": "contract Lib_AddressManager", + "numberOfBytes": "20" + }, + "t_mapping(t_bytes32,t_bool)": { + "encoding": "mapping", + "key": "t_bytes32", + "label": "mapping(bytes32 => bool)", + "numberOfBytes": "32", + "value": "t_bool" + }, + "t_uint256": { + "encoding": "inplace", + "label": "uint256", + "numberOfBytes": "32" + } + } + } +} \ No newline at end of file diff --git a/packages/contracts/deployments/kovan-v3/OVM_L1ETHGateway.json b/packages/contracts/deployments/kovan-v3/OVM_L1ETHGateway.json new file mode 100644 index 0000000000000..71e3eabd74fbf --- /dev/null +++ b/packages/contracts/deployments/kovan-v3/OVM_L1ETHGateway.json @@ -0,0 +1,293 @@ +{ + "address": "0x25bb69ee5665536Ce6aeb51094F0bed9e4DACc30", + "abi": [ + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_from", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "DepositInitiated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "WithdrawalFinalized", + "type": "event" + }, + { + "inputs": [], + "name": "deposit", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_to", + "type": "address" + } + ], + "name": "depositTo", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "finalizeWithdrawal", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "getFinalizeDepositL2Gas", + "outputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_libAddressManager", + "type": "address" + }, + { + "internalType": "address", + "name": "_ovmEth", + "type": "address" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "libAddressManager", + "outputs": [ + { + "internalType": "contract Lib_AddressManager", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "messenger", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "ovmEth", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "_name", + "type": "string" + } + ], + "name": "resolve", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "stateMutability": "payable", + "type": "receive" + } + ], + "transactionHash": "0xdee55e4f063e0e623d64d84766a08cdff904d121126b845ebc3e565fad826f6b", + "receipt": { + "to": null, + "from": "0x18394B52d3Cb931dfA76F63251919D051953413d", + "contractAddress": "0x25bb69ee5665536Ce6aeb51094F0bed9e4DACc30", + "transactionIndex": 3, + "gasUsed": "608764", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0x7b251469ad62221d42e05992bb7fac0bb492bc2939a072d90039a585f58e524f", + "transactionHash": "0xdee55e4f063e0e623d64d84766a08cdff904d121126b845ebc3e565fad826f6b", + "logs": [], + "blockNumber": 24572892, + "cumulativeGasUsed": "752908", + "status": 1, + "byzantium": true + }, + "args": [], + "solcInputHash": "5ee8e508e2c54cb5ac6783b4855b1558", + "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"DepositInitiated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"WithdrawalFinalized\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"deposit\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"}],\"name\":\"depositTo\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"finalizeWithdrawal\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getFinalizeDepositL2Gas\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_ovmEth\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"messenger\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ovmEth\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"details\":\"The L1 ETH Gateway is a contract which stores deposited ETH that is in use on L2. Compiler used: solc Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"deposit()\":{\"details\":\"deposit an amount of the ETH to the caller's balance on L2\"},\"depositTo(address)\":{\"details\":\"deposit an amount of ETH to a recipients's balance on L2\",\"params\":{\"_to\":\"L2 address to credit the withdrawal to\"}},\"finalizeWithdrawal(address,uint256)\":{\"details\":\"Complete a withdrawal from L2 to L1, and credit funds to the recipient's balance of the L1 ETH token. Since only the xDomainMessenger can call this function, it will never be called before the withdrawal is finalized.\",\"params\":{\"_amount\":\"Amount of the ETH to withdraw\",\"_to\":\"L1 address to credit the withdrawal to\"}},\"initialize(address,address)\":{\"params\":{\"_libAddressManager\":\"Address manager for this OE deployment\",\"_ovmEth\":\"L2 OVM_ETH implementation of iOVM_DepositedToken\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}}},\"title\":\"OVM_L1ETHGateway\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/OVM/bridge/tokens/OVM_L1ETHGateway.sol\":\"OVM_L1ETHGateway\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor () internal {\\n address msgSender = _msgSender();\\n _owner = msgSender;\\n emit OwnershipTransferred(address(0), msgSender);\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n emit OwnershipTransferred(_owner, address(0));\\n _owner = address(0);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n emit OwnershipTransferred(_owner, newOwner);\\n _owner = newOwner;\\n }\\n}\\n\",\"keccak256\":\"0x15e2d5bd4c28a88548074c54d220e8086f638a71ed07e6b3ba5a70066fcf458d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with GSN meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address payable) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes memory) {\\n this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x8d3cb350f04ff49cfb10aef08d87f19dcbaecc8027b0bed12f3275cd12f38cf0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/bridge/tokens/OVM_L1ETHGateway.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// @unsupported: ovm\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Interface Imports */\\nimport { iOVM_L1ETHGateway } from \\\"../../../iOVM/bridge/tokens/iOVM_L1ETHGateway.sol\\\";\\nimport { iOVM_L2DepositedToken } from \\\"../../../iOVM/bridge/tokens/iOVM_L2DepositedToken.sol\\\";\\n\\n/* Library Imports */\\nimport { OVM_CrossDomainEnabled } from \\\"../../../libraries/bridge/OVM_CrossDomainEnabled.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../../libraries/resolver/Lib_AddressResolver.sol\\\";\\nimport { Lib_AddressManager } from \\\"../../../libraries/resolver/Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title OVM_L1ETHGateway\\n * @dev The L1 ETH Gateway is a contract which stores deposited ETH that is in use on L2.\\n *\\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract OVM_L1ETHGateway is iOVM_L1ETHGateway, OVM_CrossDomainEnabled, Lib_AddressResolver {\\n\\n /********************\\n * Public Constants *\\n ********************/\\n\\n uint32 public constant override getFinalizeDepositL2Gas = 1200000;\\n\\n /********************************\\n * External Contract References *\\n ********************************/\\n\\n address public ovmEth;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n // This contract lives behind a proxy, so the constructor parameters will go unused.\\n constructor()\\n OVM_CrossDomainEnabled(address(0))\\n Lib_AddressResolver(address(0))\\n public\\n {}\\n\\n /******************\\n * Initialization *\\n ******************/\\n\\n /**\\n * @param _libAddressManager Address manager for this OE deployment\\n * @param _ovmEth L2 OVM_ETH implementation of iOVM_DepositedToken\\n */\\n function initialize(\\n address _libAddressManager,\\n address _ovmEth\\n )\\n public\\n {\\n require(libAddressManager == Lib_AddressManager(0), \\\"Contract has already been initialized.\\\");\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n ovmEth = _ovmEth;\\n messenger = resolve(\\\"Proxy__OVM_L1CrossDomainMessenger\\\");\\n }\\n\\n /**************\\n * Depositing *\\n **************/\\n\\n receive()\\n external\\n payable\\n {\\n _initiateDeposit(msg.sender, msg.sender);\\n }\\n\\n /**\\n * @dev deposit an amount of the ETH to the caller's balance on L2\\n */\\n function deposit()\\n external\\n override\\n payable\\n {\\n _initiateDeposit(msg.sender, msg.sender);\\n }\\n\\n /**\\n * @dev deposit an amount of ETH to a recipients's balance on L2\\n * @param _to L2 address to credit the withdrawal to\\n */\\n function depositTo(\\n address _to\\n )\\n external\\n override\\n payable\\n {\\n _initiateDeposit(msg.sender, _to);\\n }\\n\\n /**\\n * @dev Performs the logic for deposits by storing the ETH and informing the L2 ETH Gateway of the deposit.\\n *\\n * @param _from Account to pull the deposit from on L1\\n * @param _to Account to give the deposit to on L2\\n */\\n function _initiateDeposit(\\n address _from,\\n address _to\\n )\\n internal\\n {\\n // Construct calldata for l2ETHGateway.finalizeDeposit(_to, _amount)\\n bytes memory data =\\n abi.encodeWithSelector(\\n iOVM_L2DepositedToken.finalizeDeposit.selector,\\n _to,\\n msg.value\\n );\\n\\n // Send calldata into L2\\n sendCrossDomainMessage(\\n ovmEth,\\n data,\\n getFinalizeDepositL2Gas\\n );\\n\\n emit DepositInitiated(_from, _to, msg.value);\\n }\\n\\n /*************************\\n * Cross-chain Functions *\\n *************************/\\n\\n /**\\n * @dev Complete a withdrawal from L2 to L1, and credit funds to the recipient's balance of the\\n * L1 ETH token.\\n * Since only the xDomainMessenger can call this function, it will never be called before the withdrawal is finalized.\\n *\\n * @param _to L1 address to credit the withdrawal to\\n * @param _amount Amount of the ETH to withdraw\\n */\\n function finalizeWithdrawal(\\n address _to,\\n uint256 _amount\\n )\\n external\\n override\\n onlyFromCrossDomainAccount(ovmEth)\\n {\\n _safeTransferETH(_to, _amount);\\n\\n emit WithdrawalFinalized(_to, _amount);\\n }\\n\\n /**********************************\\n * Internal Functions: Accounting *\\n **********************************/\\n\\n /**\\n * @dev Internal accounting function for moving around L1 ETH.\\n *\\n * @param _to L1 address to transfer ETH to\\n * @param _value Amount of ETH to send to\\n */\\n function _safeTransferETH(\\n address _to,\\n uint256 _value\\n )\\n internal\\n {\\n (bool success, ) = _to.call{value: _value}(new bytes(0));\\n require(success, 'TransferHelper::safeTransferETH: ETH transfer failed');\\n }\\n}\\n\",\"keccak256\":\"0xee7c0d4bea0e01b0de4def829c9c8aa313ad6a788a7150adcc62c1e4190831db\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/bridge/messaging/iAbs_BaseCrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/**\\n * @title iAbs_BaseCrossDomainMessenger\\n */\\ninterface iAbs_BaseCrossDomainMessenger {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event SentMessage(bytes message);\\n event RelayedMessage(bytes32 msgHash);\\n event FailedRelayedMessage(bytes32 msgHash);\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n function xDomainMessageSender() external view returns (address);\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sends a cross domain message to the target messenger.\\n * @param _target Target contract address.\\n * @param _message Message to send to the target.\\n * @param _gasLimit Gas limit for the provided message.\\n */\\n function sendMessage(\\n address _target,\\n bytes calldata _message,\\n uint32 _gasLimit\\n ) external;\\n}\\n\",\"keccak256\":\"0x89981ed48e99d6939cc6cdef827d484fa3e2292d66c0ba5056c7050cb6282d7e\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/bridge/tokens/iOVM_L1ETHGateway.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0;\\npragma experimental ABIEncoderV2;\\n\\n/**\\n * @title iOVM_L1ETHGateway\\n */\\ninterface iOVM_L1ETHGateway {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event DepositInitiated(\\n address indexed _from,\\n address _to,\\n uint256 _amount\\n );\\n\\n event WithdrawalFinalized(\\n address indexed _to,\\n uint256 _amount\\n );\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function deposit()\\n external\\n payable;\\n\\n function depositTo(\\n address _to\\n )\\n external\\n payable;\\n\\n /*************************\\n * Cross-chain Functions *\\n *************************/\\n\\n function finalizeWithdrawal(\\n address _to,\\n uint _amount\\n )\\n external;\\n\\n function getFinalizeDepositL2Gas()\\n external\\n view\\n returns(\\n uint32\\n );\\n}\\n\",\"keccak256\":\"0x7e6805c5cacfd159410c7cd57a3d586e0fc5810bc46600bbd840a252e243e5ba\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/bridge/tokens/iOVM_L2DepositedToken.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0;\\npragma experimental ABIEncoderV2;\\n\\n/**\\n * @title iOVM_L2DepositedToken\\n */\\ninterface iOVM_L2DepositedToken {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event WithdrawalInitiated(\\n address indexed _from,\\n address _to,\\n uint256 _amount\\n );\\n\\n event DepositFinalized(\\n address indexed _to,\\n uint256 _amount\\n );\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function withdraw(\\n uint _amount\\n )\\n external;\\n\\n function withdrawTo(\\n address _to,\\n uint _amount\\n )\\n external;\\n\\n\\n /*************************\\n * Cross-chain Functions *\\n *************************/\\n\\n function finalizeDeposit(\\n address _to,\\n uint _amount\\n )\\n external;\\n}\\n\",\"keccak256\":\"0x59c807dfb01dbc00409431820457c350681af30d2f972a065231483a8ec926c4\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/bridge/OVM_CrossDomainEnabled.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Interface Imports */\\nimport { iAbs_BaseCrossDomainMessenger } from \\\"../../iOVM/bridge/messaging/iAbs_BaseCrossDomainMessenger.sol\\\";\\n\\n/**\\n * @title OVM_CrossDomainEnabled\\n * @dev Helper contract for contracts performing cross-domain communications\\n *\\n * Compiler used: defined by inheriting contract\\n * Runtime target: defined by inheriting contract\\n */\\ncontract OVM_CrossDomainEnabled {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n // Messenger contract used to send and recieve messages from the other domain.\\n address public messenger;\\n\\n\\n /***************\\n * Constructor *\\n ***************/ \\n\\n /**\\n * @param _messenger Address of the CrossDomainMessenger on the current layer.\\n */\\n constructor(\\n address _messenger\\n ) {\\n messenger = _messenger;\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n /**\\n * Enforces that the modified function is only callable by a specific cross-domain account.\\n * @param _sourceDomainAccount The only account on the originating domain which is\\n * authenticated to call this function.\\n */\\n modifier onlyFromCrossDomainAccount(\\n address _sourceDomainAccount\\n ) {\\n require(\\n msg.sender == address(getCrossDomainMessenger()),\\n \\\"OVM_XCHAIN: messenger contract unauthenticated\\\"\\n );\\n\\n require(\\n getCrossDomainMessenger().xDomainMessageSender() == _sourceDomainAccount,\\n \\\"OVM_XCHAIN: wrong sender of cross-domain message\\\"\\n );\\n\\n _;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Gets the messenger, usually from storage. This function is exposed in case a child contract\\n * needs to override.\\n * @return The address of the cross-domain messenger contract which should be used. \\n */\\n function getCrossDomainMessenger()\\n internal\\n virtual\\n returns (\\n iAbs_BaseCrossDomainMessenger\\n )\\n {\\n return iAbs_BaseCrossDomainMessenger(messenger);\\n }\\n\\n /**\\n * Sends a message to an account on another domain\\n * @param _crossDomainTarget The intended recipient on the destination domain\\n * @param _data The data to send to the target (usually calldata to a function with\\n * `onlyFromCrossDomainAccount()`)\\n * @param _gasLimit The gasLimit for the receipt of the message on the target domain.\\n */\\n function sendCrossDomainMessage(\\n address _crossDomainTarget,\\n bytes memory _data,\\n uint32 _gasLimit\\n )\\n internal\\n {\\n getCrossDomainMessenger().sendMessage(_crossDomainTarget, _data, _gasLimit);\\n }\\n}\\n\",\"keccak256\":\"0x054c802a5c1318566b7727ff5327a1ad4dc0f18038a4586b7ada467cc6b08761\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n public\\n onlyOwner\\n {\\n addresses[_getNameHash(_name)] = _address;\\n\\n emit AddressSet(\\n _name,\\n _address\\n );\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0x2ce671a0e004df88b136bea5a3c59d0732cea8887c8496da1d509e0200b03d7d\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(\\n address _libAddressManager\\n ) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x65981feeabff6a81783ea97d44baf988a18a86c8cb374c46fdb71819cbacc7c0\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x608060405234801561001057600080fd5b50600080546001600160a01b03199081169091556001805490911690556109fb8061003c6000396000f3fe60806040526004361061008a5760003560e01c8063485cc95511610059578063485cc95514610122578063490b5b7814610142578063b760faf914610157578063d0e30db01461016a578063f4f7b41a146101725761009b565b80631273a090146100a0578063299ca478146100cb5780633cb747bf146100ed578063461a4478146101025761009b565b3661009b576100993333610192565b005b600080fd5b3480156100ac57600080fd5b506100b5610246565b6040516100c29190610935565b60405180910390f35b3480156100d757600080fd5b506100e061024d565b6040516100c29190610865565b3480156100f957600080fd5b506100e061025c565b34801561010e57600080fd5b506100e061011d366004610797565b61026b565b34801561012e57600080fd5b5061009961013d36600461073c565b610347565b34801561014e57600080fd5b506100e06103ef565b61009961016536600461071b565b6103fe565b61009961040b565b34801561017e57600080fd5b5061009961018d36600461076e565b610417565b6000638d6e9a5b60e01b82346040516024016101af929190610879565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526002549091506101fe906001600160a01b03168262124f80610578565b826001600160a01b03167ff531653a5819e21265de50358610d55dbe6594c61605b209dfa4280d277938c18334604051610239929190610879565b60405180910390a2505050565b62124f8081565b6001546001600160a01b031681565b6000546001600160a01b031681565b60015460405163bf40fac160e01b81526020600482018181528451602484015284516000946001600160a01b03169363bf40fac1938793928392604401918501908083838b5b838110156102c95781810151838201526020016102b1565b50505050905090810190601f1680156102f65780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561031357600080fd5b505afa158015610327573d6000803e3d6000fd5b505050506040513d602081101561033d57600080fd5b505190505b919050565b6001546001600160a01b0316156103795760405162461bcd60e51b8152600401610370906108e6565b60405180910390fd5b600180546001600160a01b038085166001600160a01b0319928316179092556002805492841692909116919091179055604080516060810190915260218082526103cb91906109a5602083013961026b565b600080546001600160a01b0319166001600160a01b03929092169190911790555050565b6002546001600160a01b031681565b6104083382610192565b50565b6104153333610192565b565b6002546001600160a01b031661042b610663565b6001600160a01b0316336001600160a01b03161461047a5760405162461bcd60e51b815260040180806020018281038252602e815260200180610947602e913960400191505060405180910390fd5b806001600160a01b031661048c610663565b6001600160a01b0316636e296e456040518163ffffffff1660e01b815260040160206040518083038186803b1580156104c457600080fd5b505afa1580156104d8573d6000803e3d6000fd5b505050506040513d60208110156104ee57600080fd5b50516001600160a01b0316146105355760405162461bcd60e51b81526004018080602001828103825260308152602001806109756030913960400191505060405180910390fd5b61053f8383610672565b826001600160a01b03167f9e5c4f9f4e46b8629d3dda85f43a69194f50254404a72dc62b9e932d9c94eda883604051610239919061092c565b610580610663565b6001600160a01b0316633dbb202b8484846040518463ffffffff1660e01b815260040180846001600160a01b03168152602001806020018363ffffffff168152602001828103825284818151815260200191508051906020019080838360005b838110156105f85781810151838201526020016105e0565b50505050905090810190601f1680156106255780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b15801561064657600080fd5b505af115801561065a573d6000803e3d6000fd5b50505050505050565b6000546001600160a01b031690565b604080516000808252602082019092526001600160a01b03841690839060405161069c919061082c565b60006040518083038185875af1925050503d80600081146106d9576040519150601f19603f3d011682016040523d82523d6000602084013e6106de565b606091505b50509050806106ff5760405162461bcd60e51b815260040161037090610892565b505050565b80356001600160a01b038116811461034257600080fd5b60006020828403121561072c578081fd5b61073582610704565b9392505050565b6000806040838503121561074e578081fd5b61075783610704565b915061076560208401610704565b90509250929050565b60008060408385031215610780578182fd5b61078983610704565b946020939093013593505050565b600060208083850312156107a9578182fd5b823567ffffffffffffffff808211156107c0578384fd5b818501915085601f8301126107d3578384fd5b8135818111156107df57fe5b604051601f8201601f19168101850183811182821017156107fc57fe5b6040528181528382018501881015610812578586fd5b818585018683013790810190930193909352509392505050565b60008251815b8181101561084c5760208186018101518583015201610832565b8181111561085a5782828501525b509190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b60208082526034908201527f5472616e7366657248656c7065723a3a736166655472616e736665724554483a60408201527308115512081d1c985b9cd9995c8819985a5b195960621b606082015260800190565b60208082526026908201527f436f6e74726163742068617320616c7265616479206265656e20696e697469616040820152653634bd32b21760d11b606082015260800190565b90815260200190565b63ffffffff9190911681526020019056fe4f564d5f58434841494e3a206d657373656e67657220636f6e747261637420756e61757468656e746963617465644f564d5f58434841494e3a2077726f6e672073656e646572206f662063726f73732d646f6d61696e206d65737361676550726f78795f5f4f564d5f4c3143726f7373446f6d61696e4d657373656e676572a2646970667358221220d8a6002280930d6eb8035b95d663889b1a8e3dbd1b07997ca03239bd5372e85b64736f6c63430007060033", + "deployedBytecode": "0x60806040526004361061008a5760003560e01c8063485cc95511610059578063485cc95514610122578063490b5b7814610142578063b760faf914610157578063d0e30db01461016a578063f4f7b41a146101725761009b565b80631273a090146100a0578063299ca478146100cb5780633cb747bf146100ed578063461a4478146101025761009b565b3661009b576100993333610192565b005b600080fd5b3480156100ac57600080fd5b506100b5610246565b6040516100c29190610935565b60405180910390f35b3480156100d757600080fd5b506100e061024d565b6040516100c29190610865565b3480156100f957600080fd5b506100e061025c565b34801561010e57600080fd5b506100e061011d366004610797565b61026b565b34801561012e57600080fd5b5061009961013d36600461073c565b610347565b34801561014e57600080fd5b506100e06103ef565b61009961016536600461071b565b6103fe565b61009961040b565b34801561017e57600080fd5b5061009961018d36600461076e565b610417565b6000638d6e9a5b60e01b82346040516024016101af929190610879565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526002549091506101fe906001600160a01b03168262124f80610578565b826001600160a01b03167ff531653a5819e21265de50358610d55dbe6594c61605b209dfa4280d277938c18334604051610239929190610879565b60405180910390a2505050565b62124f8081565b6001546001600160a01b031681565b6000546001600160a01b031681565b60015460405163bf40fac160e01b81526020600482018181528451602484015284516000946001600160a01b03169363bf40fac1938793928392604401918501908083838b5b838110156102c95781810151838201526020016102b1565b50505050905090810190601f1680156102f65780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561031357600080fd5b505afa158015610327573d6000803e3d6000fd5b505050506040513d602081101561033d57600080fd5b505190505b919050565b6001546001600160a01b0316156103795760405162461bcd60e51b8152600401610370906108e6565b60405180910390fd5b600180546001600160a01b038085166001600160a01b0319928316179092556002805492841692909116919091179055604080516060810190915260218082526103cb91906109a5602083013961026b565b600080546001600160a01b0319166001600160a01b03929092169190911790555050565b6002546001600160a01b031681565b6104083382610192565b50565b6104153333610192565b565b6002546001600160a01b031661042b610663565b6001600160a01b0316336001600160a01b03161461047a5760405162461bcd60e51b815260040180806020018281038252602e815260200180610947602e913960400191505060405180910390fd5b806001600160a01b031661048c610663565b6001600160a01b0316636e296e456040518163ffffffff1660e01b815260040160206040518083038186803b1580156104c457600080fd5b505afa1580156104d8573d6000803e3d6000fd5b505050506040513d60208110156104ee57600080fd5b50516001600160a01b0316146105355760405162461bcd60e51b81526004018080602001828103825260308152602001806109756030913960400191505060405180910390fd5b61053f8383610672565b826001600160a01b03167f9e5c4f9f4e46b8629d3dda85f43a69194f50254404a72dc62b9e932d9c94eda883604051610239919061092c565b610580610663565b6001600160a01b0316633dbb202b8484846040518463ffffffff1660e01b815260040180846001600160a01b03168152602001806020018363ffffffff168152602001828103825284818151815260200191508051906020019080838360005b838110156105f85781810151838201526020016105e0565b50505050905090810190601f1680156106255780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b15801561064657600080fd5b505af115801561065a573d6000803e3d6000fd5b50505050505050565b6000546001600160a01b031690565b604080516000808252602082019092526001600160a01b03841690839060405161069c919061082c565b60006040518083038185875af1925050503d80600081146106d9576040519150601f19603f3d011682016040523d82523d6000602084013e6106de565b606091505b50509050806106ff5760405162461bcd60e51b815260040161037090610892565b505050565b80356001600160a01b038116811461034257600080fd5b60006020828403121561072c578081fd5b61073582610704565b9392505050565b6000806040838503121561074e578081fd5b61075783610704565b915061076560208401610704565b90509250929050565b60008060408385031215610780578182fd5b61078983610704565b946020939093013593505050565b600060208083850312156107a9578182fd5b823567ffffffffffffffff808211156107c0578384fd5b818501915085601f8301126107d3578384fd5b8135818111156107df57fe5b604051601f8201601f19168101850183811182821017156107fc57fe5b6040528181528382018501881015610812578586fd5b818585018683013790810190930193909352509392505050565b60008251815b8181101561084c5760208186018101518583015201610832565b8181111561085a5782828501525b509190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b60208082526034908201527f5472616e7366657248656c7065723a3a736166655472616e736665724554483a60408201527308115512081d1c985b9cd9995c8819985a5b195960621b606082015260800190565b60208082526026908201527f436f6e74726163742068617320616c7265616479206265656e20696e697469616040820152653634bd32b21760d11b606082015260800190565b90815260200190565b63ffffffff9190911681526020019056fe4f564d5f58434841494e3a206d657373656e67657220636f6e747261637420756e61757468656e746963617465644f564d5f58434841494e3a2077726f6e672073656e646572206f662063726f73732d646f6d61696e206d65737361676550726f78795f5f4f564d5f4c3143726f7373446f6d61696e4d657373656e676572a2646970667358221220d8a6002280930d6eb8035b95d663889b1a8e3dbd1b07997ca03239bd5372e85b64736f6c63430007060033", + "devdoc": { + "details": "The L1 ETH Gateway is a contract which stores deposited ETH that is in use on L2. Compiler used: solc Runtime target: EVM", + "kind": "dev", + "methods": { + "deposit()": { + "details": "deposit an amount of the ETH to the caller's balance on L2" + }, + "depositTo(address)": { + "details": "deposit an amount of ETH to a recipients's balance on L2", + "params": { + "_to": "L2 address to credit the withdrawal to" + } + }, + "finalizeWithdrawal(address,uint256)": { + "details": "Complete a withdrawal from L2 to L1, and credit funds to the recipient's balance of the L1 ETH token. Since only the xDomainMessenger can call this function, it will never be called before the withdrawal is finalized.", + "params": { + "_amount": "Amount of the ETH to withdraw", + "_to": "L1 address to credit the withdrawal to" + } + }, + "initialize(address,address)": { + "params": { + "_libAddressManager": "Address manager for this OE deployment", + "_ovmEth": "L2 OVM_ETH implementation of iOVM_DepositedToken" + } + }, + "resolve(string)": { + "params": { + "_name": "Name to resolve an address for." + }, + "returns": { + "_0": "Address associated with the given name." + } + } + }, + "title": "OVM_L1ETHGateway", + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": { + "resolve(string)": { + "notice": "Resolves the address associated with a given name." + } + }, + "version": 1 + }, + "storageLayout": { + "storage": [ + { + "astId": 11988, + "contract": "contracts/optimistic-ethereum/OVM/bridge/tokens/OVM_L1ETHGateway.sol:OVM_L1ETHGateway", + "label": "messenger", + "offset": 0, + "slot": "0", + "type": "t_address" + }, + { + "astId": 12800, + "contract": "contracts/optimistic-ethereum/OVM/bridge/tokens/OVM_L1ETHGateway.sol:OVM_L1ETHGateway", + "label": "libAddressManager", + "offset": 0, + "slot": "1", + "type": "t_contract(Lib_AddressManager)12793" + }, + { + "astId": 2661, + "contract": "contracts/optimistic-ethereum/OVM/bridge/tokens/OVM_L1ETHGateway.sol:OVM_L1ETHGateway", + "label": "ovmEth", + "offset": 0, + "slot": "2", + "type": "t_address" + } + ], + "types": { + "t_address": { + "encoding": "inplace", + "label": "address", + "numberOfBytes": "20" + }, + "t_contract(Lib_AddressManager)12793": { + "encoding": "inplace", + "label": "contract Lib_AddressManager", + "numberOfBytes": "20" + } + } + } +} \ No newline at end of file diff --git a/packages/contracts/deployments/kovan-v3/OVM_L1MultiMessageRelayer.json b/packages/contracts/deployments/kovan-v3/OVM_L1MultiMessageRelayer.json new file mode 100644 index 0000000000000..62ca79e117c05 --- /dev/null +++ b/packages/contracts/deployments/kovan-v3/OVM_L1MultiMessageRelayer.json @@ -0,0 +1,234 @@ +{ + "address": "0x942b1B1CaF9e7654318CbfCfD1bca6727C716638", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_libAddressManager", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "address", + "name": "target", + "type": "address" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "bytes", + "name": "message", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "messageNonce", + "type": "uint256" + }, + { + "components": [ + { + "internalType": "bytes32", + "name": "stateRoot", + "type": "bytes32" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "batchIndex", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "batchRoot", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "batchSize", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "prevTotalElements", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "extraData", + "type": "bytes" + } + ], + "internalType": "struct Lib_OVMCodec.ChainBatchHeader", + "name": "stateRootBatchHeader", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + }, + { + "internalType": "bytes32[]", + "name": "siblings", + "type": "bytes32[]" + } + ], + "internalType": "struct Lib_OVMCodec.ChainInclusionProof", + "name": "stateRootProof", + "type": "tuple" + }, + { + "internalType": "bytes", + "name": "stateTrieWitness", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "storageTrieWitness", + "type": "bytes" + } + ], + "internalType": "struct iOVM_L1CrossDomainMessenger.L2MessageInclusionProof", + "name": "proof", + "type": "tuple" + } + ], + "internalType": "struct iOVM_L1MultiMessageRelayer.L2ToL1Message[]", + "name": "_messages", + "type": "tuple[]" + } + ], + "name": "batchRelayMessages", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "libAddressManager", + "outputs": [ + { + "internalType": "contract Lib_AddressManager", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "_name", + "type": "string" + } + ], + "name": "resolve", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "transactionHash": "0xd93f806d3c8503f36c537f09883e9165dd32239e00b881f705a3441e13a3d510", + "receipt": { + "to": null, + "from": "0x18394B52d3Cb931dfA76F63251919D051953413d", + "contractAddress": "0x942b1B1CaF9e7654318CbfCfD1bca6727C716638", + "transactionIndex": 1, + "gasUsed": "605189", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0xc85c83fe27b2839cc9aee380d27e1fab4612af37f0d80a87aea6047caec2a0e1", + "transactionHash": "0xd93f806d3c8503f36c537f09883e9165dd32239e00b881f705a3441e13a3d510", + "logs": [], + "blockNumber": 24572884, + "cumulativeGasUsed": "674512", + "status": 1, + "byzantium": true + }, + "args": [ + "0xd56F695e73286ac252A37593DD4E7c14270eC1Df" + ], + "solcInputHash": "5ee8e508e2c54cb5ac6783b4855b1558", + "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"messageNonce\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"stateRootBatchHeader\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"siblings\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct Lib_OVMCodec.ChainInclusionProof\",\"name\":\"stateRootProof\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"stateTrieWitness\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"storageTrieWitness\",\"type\":\"bytes\"}],\"internalType\":\"struct iOVM_L1CrossDomainMessenger.L2MessageInclusionProof\",\"name\":\"proof\",\"type\":\"tuple\"}],\"internalType\":\"struct iOVM_L1MultiMessageRelayer.L2ToL1Message[]\",\"name\":\"_messages\",\"type\":\"tuple[]\"}],\"name\":\"batchRelayMessages\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The L1 Multi-Message Relayer contract is a gas efficiency optimization which enables the relayer to submit multiple messages in a single transaction to be relayed by the L1 Cross Domain Message Sender. Compiler used: solc Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"batchRelayMessages((address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))[])\":{\"params\":{\"_messages\":\"An array of L2 to L1 messages\"}},\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}}},\"title\":\"OVM_L1MultiMessageRelayer\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"batchRelayMessages((address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))[])\":{\"notice\":\"Forwards multiple cross domain messages to the L1 Cross Domain Messenger for relaying\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1MultiMessageRelayer.sol\":\"OVM_L1MultiMessageRelayer\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor () internal {\\n address msgSender = _msgSender();\\n _owner = msgSender;\\n emit OwnershipTransferred(address(0), msgSender);\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n emit OwnershipTransferred(_owner, address(0));\\n _owner = address(0);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n emit OwnershipTransferred(_owner, newOwner);\\n _owner = newOwner;\\n }\\n}\\n\",\"keccak256\":\"0x15e2d5bd4c28a88548074c54d220e8086f638a71ed07e6b3ba5a70066fcf458d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with GSN meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address payable) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes memory) {\\n this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x8d3cb350f04ff49cfb10aef08d87f19dcbaecc8027b0bed12f3275cd12f38cf0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1MultiMessageRelayer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// @unsupported: ovm\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Interface Imports */\\nimport { iOVM_L1CrossDomainMessenger } from \\\"../../../iOVM/bridge/messaging/iOVM_L1CrossDomainMessenger.sol\\\";\\nimport { iOVM_L1MultiMessageRelayer } from \\\"../../../iOVM/bridge/messaging/iOVM_L1MultiMessageRelayer.sol\\\";\\n\\n/* Library Imports */\\nimport { Lib_AddressResolver } from \\\"../../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/**\\n * @title OVM_L1MultiMessageRelayer\\n * @dev The L1 Multi-Message Relayer contract is a gas efficiency optimization which enables the\\n * relayer to submit multiple messages in a single transaction to be relayed by the L1 Cross Domain\\n * Message Sender.\\n *\\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract OVM_L1MultiMessageRelayer is iOVM_L1MultiMessageRelayer, Lib_AddressResolver {\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n */\\n constructor(\\n address _libAddressManager\\n )\\n Lib_AddressResolver(_libAddressManager)\\n {}\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyBatchRelayer() {\\n require(\\n msg.sender == resolve(\\\"OVM_L2BatchMessageRelayer\\\"),\\n \\\"OVM_L1MultiMessageRelayer: Function can only be called by the OVM_L2BatchMessageRelayer\\\"\\n );\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * @notice Forwards multiple cross domain messages to the L1 Cross Domain Messenger for relaying\\n * @param _messages An array of L2 to L1 messages\\n */\\n function batchRelayMessages(\\n L2ToL1Message[] calldata _messages\\n ) \\n override\\n external\\n onlyBatchRelayer\\n {\\n iOVM_L1CrossDomainMessenger messenger = iOVM_L1CrossDomainMessenger(\\n resolve(\\\"Proxy__OVM_L1CrossDomainMessenger\\\")\\n );\\n\\n for (uint256 i = 0; i < _messages.length; i++) {\\n L2ToL1Message memory message = _messages[i];\\n messenger.relayMessage(\\n message.target,\\n message.sender,\\n message.message,\\n message.messageNonce,\\n message.proof\\n );\\n }\\n }\\n}\\n\",\"keccak256\":\"0xe698b8dbdcecd055ee77cc553963f966faebcdefbed1e586f7fd603fa816d9c6\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/bridge/messaging/iAbs_BaseCrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/**\\n * @title iAbs_BaseCrossDomainMessenger\\n */\\ninterface iAbs_BaseCrossDomainMessenger {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event SentMessage(bytes message);\\n event RelayedMessage(bytes32 msgHash);\\n event FailedRelayedMessage(bytes32 msgHash);\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n function xDomainMessageSender() external view returns (address);\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sends a cross domain message to the target messenger.\\n * @param _target Target contract address.\\n * @param _message Message to send to the target.\\n * @param _gasLimit Gas limit for the provided message.\\n */\\n function sendMessage(\\n address _target,\\n bytes calldata _message,\\n uint32 _gasLimit\\n ) external;\\n}\\n\",\"keccak256\":\"0x89981ed48e99d6939cc6cdef827d484fa3e2292d66c0ba5056c7050cb6282d7e\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/bridge/messaging/iOVM_L1CrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { iAbs_BaseCrossDomainMessenger } from \\\"./iAbs_BaseCrossDomainMessenger.sol\\\";\\n\\n/**\\n * @title iOVM_L1CrossDomainMessenger\\n */\\ninterface iOVM_L1CrossDomainMessenger is iAbs_BaseCrossDomainMessenger {\\n\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n struct L2MessageInclusionProof {\\n bytes32 stateRoot;\\n Lib_OVMCodec.ChainBatchHeader stateRootBatchHeader;\\n Lib_OVMCodec.ChainInclusionProof stateRootProof;\\n bytes stateTrieWitness;\\n bytes storageTrieWitness;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Relays a cross domain message to a contract.\\n * @param _target Target contract address.\\n * @param _sender Message sender address.\\n * @param _message Message to send to the target.\\n * @param _messageNonce Nonce for the provided message.\\n * @param _proof Inclusion proof for the given message.\\n */\\n function relayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _messageNonce,\\n L2MessageInclusionProof memory _proof\\n ) external;\\n\\n /**\\n * Replays a cross domain message to the target messenger.\\n * @param _target Target contract address.\\n * @param _sender Original sender address.\\n * @param _message Message to send to the target.\\n * @param _messageNonce Nonce for the provided message.\\n * @param _gasLimit Gas limit for the provided message.\\n */\\n function replayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _messageNonce,\\n uint32 _gasLimit\\n ) external;\\n}\\n\",\"keccak256\":\"0xdcd239d0b215e400674d78e8db4ac12ba18efc34fa78e24c2ff867f61062dba2\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/bridge/messaging/iOVM_L1MultiMessageRelayer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Interface Imports */\\nimport { iOVM_L1CrossDomainMessenger } from \\\"../../../iOVM/bridge/messaging/iOVM_L1CrossDomainMessenger.sol\\\";\\ninterface iOVM_L1MultiMessageRelayer {\\n\\n struct L2ToL1Message {\\n address target;\\n address sender;\\n bytes message;\\n uint256 messageNonce;\\n iOVM_L1CrossDomainMessenger.L2MessageInclusionProof proof;\\n }\\n\\n function batchRelayMessages(L2ToL1Message[] calldata _messages) external;\\n}\\n\",\"keccak256\":\"0x8bc1fb2a33dcac59ec307195f8b8358d1ae2ab021c70a1589038b366d1b949d7\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/codec/Lib_OVMCodec.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../utils/Lib_Bytes32Utils.sol\\\";\\n\\n/**\\n * @title Lib_OVMCodec\\n */\\nlibrary Lib_OVMCodec {\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum QueueOrigin {\\n SEQUENCER_QUEUE,\\n L1TOL2_QUEUE\\n }\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Account {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n address ethAddress;\\n bool isFresh;\\n }\\n\\n struct EVMAccount {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n }\\n\\n struct ChainBatchHeader {\\n uint256 batchIndex;\\n bytes32 batchRoot;\\n uint256 batchSize;\\n uint256 prevTotalElements;\\n bytes extraData;\\n }\\n\\n struct ChainInclusionProof {\\n uint256 index;\\n bytes32[] siblings;\\n }\\n\\n struct Transaction {\\n uint256 timestamp;\\n uint256 blockNumber;\\n QueueOrigin l1QueueOrigin;\\n address l1TxOrigin;\\n address entrypoint;\\n uint256 gasLimit;\\n bytes data;\\n }\\n\\n struct TransactionChainElement {\\n bool isSequenced;\\n uint256 queueIndex; // QUEUED TX ONLY\\n uint256 timestamp; // SEQUENCER TX ONLY\\n uint256 blockNumber; // SEQUENCER TX ONLY\\n bytes txData; // SEQUENCER TX ONLY\\n }\\n\\n struct QueueElement {\\n bytes32 transactionHash;\\n uint40 timestamp;\\n uint40 blockNumber;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Encodes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Encoded transaction bytes.\\n */\\n function encodeTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return abi.encodePacked(\\n _transaction.timestamp,\\n _transaction.blockNumber,\\n _transaction.l1QueueOrigin,\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n );\\n }\\n\\n /**\\n * Hashes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Hashed transaction\\n */\\n function hashTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(encodeTransaction(_transaction));\\n }\\n\\n /**\\n * Converts an OVM account to an EVM account.\\n * @param _in OVM account to convert.\\n * @return Converted EVM account.\\n */\\n function toEVMAccount(\\n Account memory _in\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n return EVMAccount({\\n nonce: _in.nonce,\\n balance: _in.balance,\\n storageRoot: _in.storageRoot,\\n codeHash: _in.codeHash\\n });\\n }\\n\\n /**\\n * @notice RLP-encodes an account state struct.\\n * @param _account Account state struct.\\n * @return RLP-encoded account state.\\n */\\n function encodeEVMAccount(\\n EVMAccount memory _account\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes[] memory raw = new bytes[](4);\\n\\n // Unfortunately we can't create this array outright because\\n // Lib_RLPWriter.writeList will reject fixed-size arrays. Assigning\\n // index-by-index circumvents this issue.\\n raw[0] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.nonce)\\n )\\n );\\n raw[1] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.balance)\\n )\\n );\\n raw[2] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.storageRoot));\\n raw[3] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.codeHash));\\n\\n return Lib_RLPWriter.writeList(raw);\\n }\\n\\n /**\\n * @notice Decodes an RLP-encoded account state into a useful struct.\\n * @param _encoded RLP-encoded account state.\\n * @return Account state struct.\\n */\\n function decodeEVMAccount(\\n bytes memory _encoded\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\\n\\n return EVMAccount({\\n nonce: Lib_RLPReader.readUint256(accountState[0]),\\n balance: Lib_RLPReader.readUint256(accountState[1]),\\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\\n });\\n }\\n\\n /**\\n * Calculates a hash for a given batch header.\\n * @param _batchHeader Header to hash.\\n * @return Hash of the header.\\n */\\n function hashBatchHeader(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(\\n abi.encode(\\n _batchHeader.batchRoot,\\n _batchHeader.batchSize,\\n _batchHeader.prevTotalElements,\\n _batchHeader.extraData\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0xd85ba2066057a2677926f484b938c7c2ef33ff3853f3b71cda252f4a54f30e05\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n public\\n onlyOwner\\n {\\n addresses[_getNameHash(_name)] = _address;\\n\\n emit AddressSet(\\n _name,\\n _address\\n );\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0x2ce671a0e004df88b136bea5a3c59d0732cea8887c8496da1d509e0200b03d7d\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(\\n address _libAddressManager\\n ) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x65981feeabff6a81783ea97d44baf988a18a86c8cb374c46fdb71819cbacc7c0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPReader.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_RLPReader\\n * @dev Adapted from \\\"RLPReader\\\" by Hamdi Allam (hamdi.allam97@gmail.com).\\n */\\nlibrary Lib_RLPReader {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 constant internal MAX_LIST_LENGTH = 32;\\n\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum RLPItemType {\\n DATA_ITEM,\\n LIST_ITEM\\n }\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct RLPItem {\\n uint256 length;\\n uint256 ptr;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts bytes to a reference to memory position and length.\\n * @param _in Input bytes to convert.\\n * @return Output memory reference.\\n */\\n function toRLPItem(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem memory\\n )\\n {\\n uint256 ptr;\\n assembly {\\n ptr := add(_in, 32)\\n }\\n\\n return RLPItem({\\n length: _in.length,\\n ptr: ptr\\n });\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n (\\n uint256 listOffset,\\n ,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.LIST_ITEM,\\n \\\"Invalid RLP list value.\\\"\\n );\\n\\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\\n // writing to the length. Since we can't know the number of RLP items without looping over\\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\\n // simply set a reasonable maximum list length and decrease the size before we finish.\\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\\n\\n uint256 itemCount = 0;\\n uint256 offset = listOffset;\\n while (offset < _in.length) {\\n require(\\n itemCount < MAX_LIST_LENGTH,\\n \\\"Provided RLP list exceeds max list length.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n ) = _decodeLength(RLPItem({\\n length: _in.length - offset,\\n ptr: _in.ptr + offset\\n }));\\n\\n out[itemCount] = RLPItem({\\n length: itemLength + itemOffset,\\n ptr: _in.ptr + offset\\n });\\n\\n itemCount += 1;\\n offset += itemOffset + itemLength;\\n }\\n\\n // Decrease the array size to match the actual item count.\\n assembly {\\n mstore(out, itemCount)\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n return readList(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes value.\\\"\\n );\\n\\n return _copy(_in.ptr, itemOffset, itemLength);\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return readBytes(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return string(readBytes(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return readString(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n require(\\n _in.length <= 33,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr + itemOffset;\\n bytes32 out;\\n assembly {\\n out := mload(ptr)\\n\\n // Shift the bytes over to match the item size.\\n if lt(itemLength, 32) {\\n out := div(out, exp(256, sub(32, itemLength)))\\n }\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return readBytes32(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return uint256(readBytes32(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return readUint256(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n require(\\n _in.length == 1,\\n \\\"Invalid RLP boolean value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 out;\\n assembly {\\n out := byte(0, mload(ptr))\\n }\\n\\n require(\\n out == 0 || out == 1,\\n \\\"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\\\"\\n );\\n\\n return out != 0;\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return readBool(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n if (_in.length == 1) {\\n return address(0);\\n }\\n\\n require(\\n _in.length == 21,\\n \\\"Invalid RLP address value.\\\"\\n );\\n\\n return address(readUint256(_in));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return readAddress(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads the raw bytes of an RLP item.\\n * @param _in RLP item to read.\\n * @return Raw RLP bytes.\\n */\\n function readRawBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in);\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Decodes the length of an RLP item.\\n * @param _in RLP item to decode.\\n * @return Offset of the encoded data.\\n * @return Length of the encoded data.\\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\\n */\\n function _decodeLength(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n uint256,\\n uint256,\\n RLPItemType\\n )\\n {\\n require(\\n _in.length > 0,\\n \\\"RLP item cannot be null.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 prefix;\\n assembly {\\n prefix := byte(0, mload(ptr))\\n }\\n\\n if (prefix <= 0x7f) {\\n // Single byte.\\n\\n return (0, 1, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xb7) {\\n // Short string.\\n\\n uint256 strLen = prefix - 0x80;\\n\\n require(\\n _in.length > strLen,\\n \\\"Invalid RLP short string.\\\"\\n );\\n\\n return (1, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xbf) {\\n // Long string.\\n uint256 lenOfStrLen = prefix - 0xb7;\\n\\n require(\\n _in.length > lenOfStrLen,\\n \\\"Invalid RLP long string length.\\\"\\n );\\n\\n uint256 strLen;\\n assembly {\\n // Pick out the string length.\\n strLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfStrLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfStrLen + strLen,\\n \\\"Invalid RLP long string.\\\"\\n );\\n\\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xf7) {\\n // Short list.\\n uint256 listLen = prefix - 0xc0;\\n\\n require(\\n _in.length > listLen,\\n \\\"Invalid RLP short list.\\\"\\n );\\n\\n return (1, listLen, RLPItemType.LIST_ITEM);\\n } else {\\n // Long list.\\n uint256 lenOfListLen = prefix - 0xf7;\\n\\n require(\\n _in.length > lenOfListLen,\\n \\\"Invalid RLP long list length.\\\"\\n );\\n\\n uint256 listLen;\\n assembly {\\n // Pick out the list length.\\n listLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfListLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfListLen + listLen,\\n \\\"Invalid RLP long list.\\\"\\n );\\n\\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\\n }\\n }\\n\\n /**\\n * Copies the bytes from a memory location.\\n * @param _src Pointer to the location to read from.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Copied bytes.\\n */\\n function _copy(\\n uint256 _src,\\n uint256 _offset,\\n uint256 _length\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out = new bytes(_length);\\n if (out.length == 0) {\\n return out;\\n }\\n\\n uint256 src = _src + _offset;\\n uint256 dest;\\n assembly {\\n dest := add(out, 32)\\n }\\n\\n // Copy over as many complete words as we can.\\n for (uint256 i = 0; i < _length / 32; i++) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n\\n src += 32;\\n dest += 32;\\n }\\n\\n // Pick out the remaining bytes.\\n uint256 mask = 256 ** (32 - (_length % 32)) - 1;\\n assembly {\\n mstore(\\n dest,\\n or(\\n and(mload(src), not(mask)),\\n and(mload(dest), mask)\\n )\\n )\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Copies an RLP item into bytes.\\n * @param _in RLP item to copy.\\n * @return Copied bytes.\\n */\\n function _copy(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in.ptr, 0, _in.length);\\n }\\n}\\n\",\"keccak256\":\"0x829174c61216dce35fdb888383b6022e0365eb7fbdc71ad79d98b108091969fe\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPWriter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/**\\n * @title Lib_RLPWriter\\n * @author Bakaoh (with modifications)\\n */\\nlibrary Lib_RLPWriter {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * RLP encodes a byte string.\\n * @param _in The byte string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded;\\n\\n if (_in.length == 1 && uint8(_in[0]) < 128) {\\n encoded = _in;\\n } else {\\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * RLP encodes a list of RLP encoded byte byte strings.\\n * @param _in The list of RLP encoded byte strings.\\n * @return The RLP encoded list of items in bytes.\\n */\\n function writeList(\\n bytes[] memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory list = _flatten(_in);\\n return abi.encodePacked(_writeLength(list.length, 192), list);\\n }\\n\\n /**\\n * RLP encodes a string.\\n * @param _in The string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeString(\\n string memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(bytes(_in));\\n }\\n\\n /**\\n * RLP encodes an address.\\n * @param _in The address to encode.\\n * @return The RLP encoded address in bytes.\\n */\\n function writeAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a bytes32 value.\\n * @param _in The bytes32 to encode.\\n * @return _out The RLP encoded bytes32 in bytes.\\n */\\n function writeBytes32(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a uint.\\n * @param _in The uint256 to encode.\\n * @return The RLP encoded uint256 in bytes.\\n */\\n function writeUint(\\n uint256 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(_toBinary(_in));\\n }\\n\\n /**\\n * RLP encodes a bool.\\n * @param _in The bool to encode.\\n * @return The RLP encoded bool in bytes.\\n */\\n function writeBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded = new bytes(1);\\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\\n return encoded;\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\\n * @param _len The length of the string or the payload.\\n * @param _offset 128 if item is string, 192 if item is list.\\n * @return RLP encoded bytes.\\n */\\n function _writeLength(\\n uint256 _len,\\n uint256 _offset\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded;\\n\\n if (_len < 56) {\\n encoded = new bytes(1);\\n encoded[0] = byte(uint8(_len) + uint8(_offset));\\n } else {\\n uint256 lenLen;\\n uint256 i = 1;\\n while (_len / i != 0) {\\n lenLen++;\\n i *= 256;\\n }\\n\\n encoded = new bytes(lenLen + 1);\\n encoded[0] = byte(uint8(lenLen) + uint8(_offset) + 55);\\n for(i = 1; i <= lenLen; i++) {\\n encoded[i] = byte(uint8((_len / (256**(lenLen-i))) % 256));\\n }\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * Encode integer in big endian binary form with no leading zeroes.\\n * @notice TODO: This should be optimized with assembly to save gas costs.\\n * @param _x The integer to encode.\\n * @return RLP encoded bytes.\\n */\\n function _toBinary(\\n uint256 _x\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory b = abi.encodePacked(_x);\\n\\n uint256 i = 0;\\n for (; i < 32; i++) {\\n if (b[i] != 0) {\\n break;\\n }\\n }\\n\\n bytes memory res = new bytes(32 - i);\\n for (uint256 j = 0; j < res.length; j++) {\\n res[j] = b[i++];\\n }\\n\\n return res;\\n }\\n\\n /**\\n * Copies a piece of memory to another location.\\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\\n * @param _dest Destination location.\\n * @param _src Source location.\\n * @param _len Length of memory to copy.\\n */\\n function _memcpy(\\n uint256 _dest,\\n uint256 _src,\\n uint256 _len\\n )\\n private\\n pure\\n {\\n uint256 dest = _dest;\\n uint256 src = _src;\\n uint256 len = _len;\\n\\n for(; len >= 32; len -= 32) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n dest += 32;\\n src += 32;\\n }\\n\\n uint256 mask = 256 ** (32 - len) - 1;\\n assembly {\\n let srcpart := and(mload(src), not(mask))\\n let destpart := and(mload(dest), mask)\\n mstore(dest, or(destpart, srcpart))\\n }\\n }\\n\\n /**\\n * Flattens a list of byte strings into one byte string.\\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\\n * @param _list List of byte strings to flatten.\\n * @return The flattened byte string.\\n */\\n function _flatten(\\n bytes[] memory _list\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n if (_list.length == 0) {\\n return new bytes(0);\\n }\\n\\n uint256 len;\\n uint256 i = 0;\\n for (; i < _list.length; i++) {\\n len += _list[i].length;\\n }\\n\\n bytes memory flattened = new bytes(len);\\n uint256 flattenedPtr;\\n assembly { flattenedPtr := add(flattened, 0x20) }\\n\\n for(i = 0; i < _list.length; i++) {\\n bytes memory item = _list[i];\\n\\n uint256 listPtr;\\n assembly { listPtr := add(item, 0x20)}\\n\\n _memcpy(flattenedPtr, listPtr, item.length);\\n flattenedPtr += _list[i].length;\\n }\\n\\n return flattened;\\n }\\n}\\n\",\"keccak256\":\"0xb60ee4b03ad372c3deff21d454ab714dd0c18ee3e6f9d45532e209fc59d5a54d\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_Bytes32Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_Byte32Utils\\n */\\nlibrary Lib_Bytes32Utils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \\\"true.\\\"\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as a boolean.\\n */\\n function toBool(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return _in != 0;\\n }\\n\\n /**\\n * Converts a boolean to a bytes32 value.\\n * @param _in Input boolean value.\\n * @return Boolean as a bytes32.\\n */\\n function fromBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in ? 1 : 0));\\n }\\n\\n /**\\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as an address.\\n */\\n function toAddress(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return address(uint160(uint256(_in)));\\n }\\n\\n /**\\n * Converts an address to a bytes32.\\n * @param _in Input address value.\\n * @return Address as a bytes32.\\n */\\n function fromAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in));\\n }\\n\\n /**\\n * Removes the leading zeros from a bytes32 value and returns a new (smaller) bytes value.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 without any leading zeros.\\n */\\n function removeLeadingZeros(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out;\\n\\n assembly {\\n // Figure out how many leading zero bytes to remove.\\n let shift := 0\\n for { let i := 0 } and(lt(i, 32), eq(byte(i, _in), 0)) { i := add(i, 1) } {\\n shift := add(shift, 1)\\n }\\n\\n // Reserve some space for our output and fix the free memory pointer.\\n out := mload(0x40)\\n mstore(0x40, add(out, 0x40))\\n\\n // Shift the value and store it into the output bytes.\\n mstore(add(out, 0x20), shl(mul(shift, 8), _in))\\n\\n // Store the new size (with leading zero bytes removed) in the output byte size.\\n mstore(out, sub(32, shift))\\n }\\n\\n return out;\\n }\\n}\\n\",\"keccak256\":\"0xfa2def593e3fc56a31852c3744aefdaa93cec74e721bfcfeb1e5d166c7c60b64\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_BytesUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_BytesUtils\\n */\\nlibrary Lib_BytesUtils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_start + _length >= _start, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n if (_bytes.length - _start == 0) {\\n return bytes('');\\n }\\n\\n return slice(_bytes, _start, _bytes.length - _start);\\n }\\n\\n function toBytes32PadLeft(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n bytes32 ret;\\n uint256 len = _bytes.length <= 32 ? _bytes.length : 32;\\n assembly {\\n ret := shr(mul(sub(32, len), 8), mload(add(_bytes, 32)))\\n }\\n return ret;\\n }\\n\\n function toBytes32(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n if (_bytes.length < 32) {\\n bytes32 ret;\\n assembly {\\n ret := mload(add(_bytes, 32))\\n }\\n return ret;\\n }\\n\\n return abi.decode(_bytes,(bytes32)); // will truncate if input length > 32 bytes\\n }\\n\\n function toUint256(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return uint256(toBytes32(_bytes));\\n }\\n\\n function toUint24(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n uint24\\n )\\n {\\n require(_start + 3 >= _start, \\\"toUint24_overflow\\\");\\n require(_bytes.length >= _start + 3 , \\\"toUint24_outOfBounds\\\");\\n uint24 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x3), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toUint8(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n uint8\\n )\\n {\\n require(_start + 1 >= _start, \\\"toUint8_overflow\\\");\\n require(_bytes.length >= _start + 1 , \\\"toUint8_outOfBounds\\\");\\n uint8 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x1), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toAddress(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n require(_start + 20 >= _start, \\\"toAddress_overflow\\\");\\n require(_bytes.length >= _start + 20, \\\"toAddress_outOfBounds\\\");\\n address tempAddress;\\n\\n assembly {\\n tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000)\\n }\\n\\n return tempAddress;\\n }\\n\\n function toNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory nibbles = new bytes(_bytes.length * 2);\\n\\n for (uint256 i = 0; i < _bytes.length; i++) {\\n nibbles[i * 2] = _bytes[i] >> 4;\\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\\n }\\n\\n return nibbles;\\n }\\n\\n function fromNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory ret = new bytes(_bytes.length / 2);\\n\\n for (uint256 i = 0; i < ret.length; i++) {\\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\\n }\\n\\n return ret;\\n }\\n\\n function equal(\\n bytes memory _bytes,\\n bytes memory _other\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return keccak256(_bytes) == keccak256(_other);\\n }\\n}\\n\",\"keccak256\":\"0xa5195afe32fb2cf104d156e8f4bd39df1ec79bf6ba232097b9e8e0ee14fbc298\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x608060405234801561001057600080fd5b50604051610a22380380610a2283398101604081905261002f91610054565b600080546001600160a01b0319166001600160a01b0392909216919091179055610082565b600060208284031215610065578081fd5b81516001600160a01b038116811461007b578182fd5b9392505050565b610991806100916000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c806316e9cd9b14610046578063299ca4781461005b578063461a447814610079575b600080fd5b61005961005436600461057d565b61008c565b005b6100636101ea565b60405161007091906106db565b60405180910390f35b6100636100873660046105ec565b6101f9565b6100ca6040518060400160405280601981526020017f4f564d5f4c3242617463684d65737361676552656c61796572000000000000008152506101f9565b6001600160a01b0316336001600160a01b0316146101035760405162461bcd60e51b81526004016100fa906107d7565b60405180910390fd5b600061012660405180606001604052806021815260200161093b602191396101f9565b905060005b828110156101e457600084848381811061014157fe5b9050602002810190610153919061085a565b61015c9061089d565b8051602082015160408084015160608501516080860151925163d7fd19dd60e01b81529596506001600160a01b0389169563d7fd19dd956101a5959094909392916004016106ef565b600060405180830381600087803b1580156101bf57600080fd5b505af11580156101d3573d6000803e3d6000fd5b50506001909301925061012b915050565b50505050565b6000546001600160a01b031681565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b83811015610259578181015183820152602001610241565b50505050905090810190601f1680156102865780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b1580156102a357600080fd5b505afa1580156102b7573d6000803e3d6000fd5b505050506040513d60208110156102cd57600080fd5b505190505b919050565b600067ffffffffffffffff8311156102eb57fe5b6102fe601f8401601f1916602001610879565b905082815283838301111561031257600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b03811681146102d257600080fd5b600082601f830112610350578081fd5b61035f838335602085016102d7565b9392505050565b600060a08284031215610377578081fd5b60405160a0810167ffffffffffffffff828210818311171561039557fe5b816040528293508435835260208501356020840152604085013560408401526060850135606084015260808501359150808211156103d257600080fd5b506103df85828601610340565b6080830152505092915050565b6000604082840312156103fd578081fd5b6040516040810167ffffffffffffffff828210818311171561041b57fe5b816040528293508435835260209150818501358181111561043b57600080fd5b8501601f8101871361044c57600080fd5b80358281111561045857fe5b8381029250610468848401610879565b8181528481019083860185850187018b101561048357600080fd5b600095505b838610156104a6578035835260019590950194918601918601610488565b5080868801525050505050505092915050565b600060a082840312156104ca578081fd5b6104d460a0610879565b905081358152602082013567ffffffffffffffff808211156104f557600080fd5b61050185838601610366565b6020840152604084013591508082111561051a57600080fd5b610526858386016103ec565b6040840152606084013591508082111561053f57600080fd5b61054b85838601610340565b6060840152608084013591508082111561056457600080fd5b5061057184828501610340565b60808301525092915050565b6000806020838503121561058f578182fd5b823567ffffffffffffffff808211156105a6578384fd5b818501915085601f8301126105b9578384fd5b8135818111156105c7578485fd5b86602080830285010111156105da578485fd5b60209290920196919550909350505050565b6000602082840312156105fd578081fd5b813567ffffffffffffffff811115610613578182fd5b8201601f81018413610623578182fd5b610632848235602084016102d7565b949350505050565b60008151808452815b8181101561065f57602081850181015186830182015201610643565b818111156106705782602083870101525b50601f01601f19169290920160200192915050565b6000604083018251845260208084015160408287015282815180855260608801915083830194508592505b808310156106d057845182529383019360019290920191908301906106b0565b509695505050505050565b6001600160a01b0391909116815260200190565b6001600160a01b0386811682528516602082015260a06040820181905260009061071b9083018661063a565b846060840152828103608084015283518152602084015160a06020830152805160a0830152602081015160c0830152604081015160e083015260608101516101008301526080810151905060a061012083015261077c61014083018261063a565b9050604085015182820360408401526107958282610685565b915050606085015182820360608401526107af828261063a565b915050608085015182820360808401526107c9828261063a565b9a9950505050505050505050565b60208082526057908201527f4f564d5f4c314d756c74694d65737361676552656c617965723a2046756e637460408201527f696f6e2063616e206f6e6c792062652063616c6c656420627920746865204f5660608201527f4d5f4c3242617463684d65737361676552656c61796572000000000000000000608082015260a00190565b60008235609e1983360301811261086f578182fd5b9190910192915050565b60405181810167ffffffffffffffff8111828210171561089557fe5b604052919050565b600060a082360312156108ae578081fd5b60405160a0810167ffffffffffffffff82821081831117156108cc57fe5b816040526108d985610329565b83526108e760208601610329565b602084015260408501359150808211156108ff578384fd5b61090b36838701610340565b604084015260608501356060840152608085013591508082111561092d578384fd5b50610571368286016104b956fe50726f78795f5f4f564d5f4c3143726f7373446f6d61696e4d657373656e676572a264697066735822122054e57719bdaae865a83549e03668e0558acc8a0d1d5ba65034f61a02d9a35c6264736f6c63430007060033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100415760003560e01c806316e9cd9b14610046578063299ca4781461005b578063461a447814610079575b600080fd5b61005961005436600461057d565b61008c565b005b6100636101ea565b60405161007091906106db565b60405180910390f35b6100636100873660046105ec565b6101f9565b6100ca6040518060400160405280601981526020017f4f564d5f4c3242617463684d65737361676552656c61796572000000000000008152506101f9565b6001600160a01b0316336001600160a01b0316146101035760405162461bcd60e51b81526004016100fa906107d7565b60405180910390fd5b600061012660405180606001604052806021815260200161093b602191396101f9565b905060005b828110156101e457600084848381811061014157fe5b9050602002810190610153919061085a565b61015c9061089d565b8051602082015160408084015160608501516080860151925163d7fd19dd60e01b81529596506001600160a01b0389169563d7fd19dd956101a5959094909392916004016106ef565b600060405180830381600087803b1580156101bf57600080fd5b505af11580156101d3573d6000803e3d6000fd5b50506001909301925061012b915050565b50505050565b6000546001600160a01b031681565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b83811015610259578181015183820152602001610241565b50505050905090810190601f1680156102865780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b1580156102a357600080fd5b505afa1580156102b7573d6000803e3d6000fd5b505050506040513d60208110156102cd57600080fd5b505190505b919050565b600067ffffffffffffffff8311156102eb57fe5b6102fe601f8401601f1916602001610879565b905082815283838301111561031257600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b03811681146102d257600080fd5b600082601f830112610350578081fd5b61035f838335602085016102d7565b9392505050565b600060a08284031215610377578081fd5b60405160a0810167ffffffffffffffff828210818311171561039557fe5b816040528293508435835260208501356020840152604085013560408401526060850135606084015260808501359150808211156103d257600080fd5b506103df85828601610340565b6080830152505092915050565b6000604082840312156103fd578081fd5b6040516040810167ffffffffffffffff828210818311171561041b57fe5b816040528293508435835260209150818501358181111561043b57600080fd5b8501601f8101871361044c57600080fd5b80358281111561045857fe5b8381029250610468848401610879565b8181528481019083860185850187018b101561048357600080fd5b600095505b838610156104a6578035835260019590950194918601918601610488565b5080868801525050505050505092915050565b600060a082840312156104ca578081fd5b6104d460a0610879565b905081358152602082013567ffffffffffffffff808211156104f557600080fd5b61050185838601610366565b6020840152604084013591508082111561051a57600080fd5b610526858386016103ec565b6040840152606084013591508082111561053f57600080fd5b61054b85838601610340565b6060840152608084013591508082111561056457600080fd5b5061057184828501610340565b60808301525092915050565b6000806020838503121561058f578182fd5b823567ffffffffffffffff808211156105a6578384fd5b818501915085601f8301126105b9578384fd5b8135818111156105c7578485fd5b86602080830285010111156105da578485fd5b60209290920196919550909350505050565b6000602082840312156105fd578081fd5b813567ffffffffffffffff811115610613578182fd5b8201601f81018413610623578182fd5b610632848235602084016102d7565b949350505050565b60008151808452815b8181101561065f57602081850181015186830182015201610643565b818111156106705782602083870101525b50601f01601f19169290920160200192915050565b6000604083018251845260208084015160408287015282815180855260608801915083830194508592505b808310156106d057845182529383019360019290920191908301906106b0565b509695505050505050565b6001600160a01b0391909116815260200190565b6001600160a01b0386811682528516602082015260a06040820181905260009061071b9083018661063a565b846060840152828103608084015283518152602084015160a06020830152805160a0830152602081015160c0830152604081015160e083015260608101516101008301526080810151905060a061012083015261077c61014083018261063a565b9050604085015182820360408401526107958282610685565b915050606085015182820360608401526107af828261063a565b915050608085015182820360808401526107c9828261063a565b9a9950505050505050505050565b60208082526057908201527f4f564d5f4c314d756c74694d65737361676552656c617965723a2046756e637460408201527f696f6e2063616e206f6e6c792062652063616c6c656420627920746865204f5660608201527f4d5f4c3242617463684d65737361676552656c61796572000000000000000000608082015260a00190565b60008235609e1983360301811261086f578182fd5b9190910192915050565b60405181810167ffffffffffffffff8111828210171561089557fe5b604052919050565b600060a082360312156108ae578081fd5b60405160a0810167ffffffffffffffff82821081831117156108cc57fe5b816040526108d985610329565b83526108e760208601610329565b602084015260408501359150808211156108ff578384fd5b61090b36838701610340565b604084015260608501356060840152608085013591508082111561092d578384fd5b50610571368286016104b956fe50726f78795f5f4f564d5f4c3143726f7373446f6d61696e4d657373656e676572a264697066735822122054e57719bdaae865a83549e03668e0558acc8a0d1d5ba65034f61a02d9a35c6264736f6c63430007060033", + "devdoc": { + "details": "The L1 Multi-Message Relayer contract is a gas efficiency optimization which enables the relayer to submit multiple messages in a single transaction to be relayed by the L1 Cross Domain Message Sender. Compiler used: solc Runtime target: EVM", + "kind": "dev", + "methods": { + "batchRelayMessages((address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))[])": { + "params": { + "_messages": "An array of L2 to L1 messages" + } + }, + "constructor": { + "params": { + "_libAddressManager": "Address of the Address Manager." + } + }, + "resolve(string)": { + "params": { + "_name": "Name to resolve an address for." + }, + "returns": { + "_0": "Address associated with the given name." + } + } + }, + "title": "OVM_L1MultiMessageRelayer", + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": { + "batchRelayMessages((address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))[])": { + "notice": "Forwards multiple cross domain messages to the L1 Cross Domain Messenger for relaying" + }, + "resolve(string)": { + "notice": "Resolves the address associated with a given name." + } + }, + "version": 1 + }, + "storageLayout": { + "storage": [ + { + "astId": 12800, + "contract": "contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1MultiMessageRelayer.sol:OVM_L1MultiMessageRelayer", + "label": "libAddressManager", + "offset": 0, + "slot": "0", + "type": "t_contract(Lib_AddressManager)12793" + } + ], + "types": { + "t_contract(Lib_AddressManager)12793": { + "encoding": "inplace", + "label": "contract Lib_AddressManager", + "numberOfBytes": "20" + } + } + } +} \ No newline at end of file diff --git a/packages/contracts/deployments/kovan-v3/OVM_SafetyChecker.json b/packages/contracts/deployments/kovan-v3/OVM_SafetyChecker.json new file mode 100644 index 0000000000000..aa5d39e753eab --- /dev/null +++ b/packages/contracts/deployments/kovan-v3/OVM_SafetyChecker.json @@ -0,0 +1,74 @@ +{ + "address": "0xf0FaB0ce35a6d3F82b0B42f09A2734065908dB6a", + "abi": [ + { + "inputs": [ + { + "internalType": "bytes", + "name": "_bytecode", + "type": "bytes" + } + ], + "name": "isBytecodeSafe", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "pure", + "type": "function" + } + ], + "transactionHash": "0x3db100815c1e0b4b185f3eca0541d88c95348ba8e6a7beba8d0a96f6437544c3", + "receipt": { + "to": null, + "from": "0x18394B52d3Cb931dfA76F63251919D051953413d", + "contractAddress": "0xf0FaB0ce35a6d3F82b0B42f09A2734065908dB6a", + "transactionIndex": 1, + "gasUsed": "243548", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0xb26ad9738f8cc5da3a4e95a3e73bb4b26ca317503fa696d4dc1acdf8d12c63db", + "transactionHash": "0x3db100815c1e0b4b185f3eca0541d88c95348ba8e6a7beba8d0a96f6437544c3", + "logs": [], + "blockNumber": 24572875, + "cumulativeGasUsed": "288408", + "status": 1, + "byzantium": true + }, + "args": [], + "solcInputHash": "5ee8e508e2c54cb5ac6783b4855b1558", + "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_bytecode\",\"type\":\"bytes\"}],\"name\":\"isBytecodeSafe\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The Safety Checker verifies that contracts deployed on L2 do not contain any \\\"unsafe\\\" operations. An operation is considered unsafe if it would access state variables which are specific to the environment (ie. L1 or L2) in which it is executed, as this could be used to \\\"escape the sandbox\\\" of the OVM, resulting in non-deterministic fraud proofs. That is, an attacker would be able to \\\"prove fraud\\\" on an honestly applied transaction. Note that a \\\"safe\\\" contract requires opcodes to appear in a particular pattern; omission of \\\"unsafe\\\" opcodes is necessary, but not sufficient. Compiler used: solc Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"isBytecodeSafe(bytes)\":{\"params\":{\"_bytecode\":\"The bytecode to safety check.\"},\"returns\":{\"_0\":\"`true` if the bytecode is safe, `false` otherwise.\"}}},\"title\":\"OVM_SafetyChecker\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"isBytecodeSafe(bytes)\":{\"notice\":\"Returns whether or not all of the provided bytecode is safe.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/OVM/execution/OVM_SafetyChecker.sol\":\"OVM_SafetyChecker\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/optimistic-ethereum/OVM/execution/OVM_SafetyChecker.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Interface Imports */\\nimport { iOVM_SafetyChecker } from \\\"../../iOVM/execution/iOVM_SafetyChecker.sol\\\";\\n\\n/**\\n * @title OVM_SafetyChecker\\n * @dev The Safety Checker verifies that contracts deployed on L2 do not contain any\\n * \\\"unsafe\\\" operations. An operation is considered unsafe if it would access state variables which\\n * are specific to the environment (ie. L1 or L2) in which it is executed, as this could be used\\n * to \\\"escape the sandbox\\\" of the OVM, resulting in non-deterministic fraud proofs.\\n * That is, an attacker would be able to \\\"prove fraud\\\" on an honestly applied transaction.\\n * Note that a \\\"safe\\\" contract requires opcodes to appear in a particular pattern;\\n * omission of \\\"unsafe\\\" opcodes is necessary, but not sufficient.\\n *\\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract OVM_SafetyChecker is iOVM_SafetyChecker {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Returns whether or not all of the provided bytecode is safe.\\n * @param _bytecode The bytecode to safety check.\\n * @return `true` if the bytecode is safe, `false` otherwise.\\n */\\n function isBytecodeSafe(\\n bytes memory _bytecode\\n )\\n override\\n external\\n pure\\n returns (\\n bool\\n )\\n {\\n // autogenerated by gen_safety_checker_constants.py\\n // number of bytes to skip for each opcode\\n uint256[8] memory opcodeSkippableBytes = [\\n uint256(0x0001010101010101010101010000000001010101010101010101010101010000),\\n uint256(0x0100000000000000000000000000000000000000010101010101000000010100),\\n uint256(0x0000000000000000000000000000000001010101000000010101010100000000),\\n uint256(0x0203040500000000000000000000000000000000000000000000000000000000),\\n uint256(0x0101010101010101010101010101010101010101010101010101010101010101),\\n uint256(0x0101010101000000000000000000000000000000000000000000000000000000),\\n uint256(0x0000000000000000000000000000000000000000000000000000000000000000),\\n uint256(0x0000000000000000000000000000000000000000000000000000000000000000)\\n ];\\n // Mask to gate opcode specific cases\\n uint256 opcodeGateMask = ~uint256(0xffffffffffffffffffffffe000000000fffffffff070ffff9c0ffffec000f001);\\n // Halting opcodes\\n uint256 opcodeHaltingMask = ~uint256(0x4008000000000000000000000000000000000000004000000000000000000001);\\n // PUSH opcodes\\n uint256 opcodePushMask = ~uint256(0xffffffff000000000000000000000000);\\n\\n uint256 codeLength;\\n uint256 _pc;\\n assembly {\\n _pc := add(_bytecode, 0x20)\\n }\\n codeLength = _pc + _bytecode.length;\\n do {\\n // current opcode: 0x00...0xff\\n uint256 opNum;\\n\\n // inline assembly removes the extra add + bounds check\\n assembly {\\n let word := mload(_pc) //load the next 32 bytes at pc into word\\n\\n // Look up number of bytes to skip from opcodeSkippableBytes and then update indexInWord\\n // E.g. the 02030405 in opcodeSkippableBytes is the number of bytes to skip for PUSH1->4\\n // We repeat this 6 times, thus we can only skip bytes for up to PUSH4 ((1+4) * 6 = 30 < 32).\\n // If we see an opcode that is listed as 0 skippable bytes e.g. PUSH5,\\n // then we will get stuck on that indexInWord and then opNum will be set to the PUSH5 opcode.\\n let indexInWord := byte(0, mload(add(opcodeSkippableBytes, byte(0, word))))\\n indexInWord := add(indexInWord, byte(0, mload(add(opcodeSkippableBytes, byte(indexInWord, word)))))\\n indexInWord := add(indexInWord, byte(0, mload(add(opcodeSkippableBytes, byte(indexInWord, word)))))\\n indexInWord := add(indexInWord, byte(0, mload(add(opcodeSkippableBytes, byte(indexInWord, word)))))\\n indexInWord := add(indexInWord, byte(0, mload(add(opcodeSkippableBytes, byte(indexInWord, word)))))\\n indexInWord := add(indexInWord, byte(0, mload(add(opcodeSkippableBytes, byte(indexInWord, word)))))\\n _pc := add(_pc, indexInWord)\\n\\n opNum := byte(indexInWord, word)\\n }\\n\\n // + push opcodes\\n // + stop opcodes [STOP(0x00),JUMP(0x56),RETURN(0xf3),INVALID(0xfe)]\\n // + caller opcode CALLER(0x33)\\n // + blacklisted opcodes\\n uint256 opBit = 1 << opNum;\\n if (opBit & opcodeGateMask == 0) {\\n if (opBit & opcodePushMask == 0) {\\n // all pushes are valid opcodes\\n // subsequent bytes are not opcodes. Skip them.\\n _pc += (opNum - 0x5e); // PUSH1 is 0x60, so opNum-0x5f = PUSHed bytes and we +1 to\\n // skip the _pc++; line below in order to save gas ((-0x5f + 1) = -0x5e)\\n continue;\\n } else if (opBit & opcodeHaltingMask == 0) {\\n // STOP or JUMP or RETURN or INVALID (Note: REVERT is blacklisted, so not included here)\\n // We are now inside unreachable code until we hit a JUMPDEST!\\n do {\\n _pc++;\\n assembly {\\n opNum := byte(0, mload(_pc))\\n }\\n // encountered a JUMPDEST\\n if (opNum == 0x5b) break;\\n // skip PUSHed bytes\\n if ((1 << opNum) & opcodePushMask == 0) _pc += (opNum - 0x5f); // opNum-0x5f = PUSHed bytes (PUSH1 is 0x60)\\n } while (_pc < codeLength);\\n // opNum is 0x5b, so we don't continue here since the pc++ is fine\\n } else if (opNum == 0x33) { // Caller opcode\\n uint256 firstOps; // next 32 bytes of bytecode\\n uint256 secondOps; // following 32 bytes of bytecode\\n\\n assembly {\\n firstOps := mload(_pc)\\n // 37 bytes total, 5 left over --> 32 - 5 bytes = 27 bytes = 216 bits\\n secondOps := shr(216, mload(add(_pc, 0x20)))\\n }\\n\\n // Call identity precompile\\n // CALLER POP PUSH1 0x00 PUSH1 0x04 GAS CALL\\n // 32 - 8 bytes = 24 bytes = 192\\n if ((firstOps >> 192) == 0x3350600060045af1) {\\n _pc += 8;\\n // Call EM and abort execution if instructed\\n // CALLER PUSH1 0x00 SWAP1 GAS CALL PC PUSH1 0x0E ADD JUMPI RETURNDATASIZE PUSH1 0x00 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x00 REVERT JUMPDEST RETURNDATASIZE PUSH1 0x01 EQ ISZERO PC PUSH1 0x0a ADD JUMPI PUSH1 0x01 PUSH1 0x00 RETURN JUMPDEST\\n } else if (firstOps == 0x336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a015760 && secondOps == 0x016000f35b) {\\n _pc += 37;\\n } else {\\n return false;\\n }\\n continue;\\n } else {\\n // encountered a non-whitelisted opcode!\\n return false;\\n }\\n }\\n _pc++;\\n } while (_pc < codeLength);\\n return true;\\n }\\n}\\n\",\"keccak256\":\"0x44cd4fcdcb25a233fa98da5ba66706ce2f9fbf13359cf7f2891793739687a86f\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/execution/iOVM_SafetyChecker.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title iOVM_SafetyChecker\\n */\\ninterface iOVM_SafetyChecker {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function isBytecodeSafe(bytes calldata _bytecode) external pure returns (bool);\\n}\\n\",\"keccak256\":\"0xde6639676d4ec4f77297652d5ede2429bc93e74e11fefd9e9de4bc92dd784878\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x608060405234801561001057600080fd5b50610373806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063a44eb59a14610030575b600080fd5b6100d66004803603602081101561004657600080fd5b81019060208101813564010000000081111561006157600080fd5b82018360208201111561007357600080fd5b8035906020019184600183028401116401000000008311171561009557600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506100ea945050505050565b604080519115158252519081900360200190f35b60408051610100810182527e0101010101010101010101000000000101010101010101010101010101000081526b010101010101000000010100600160f81b016020808301919091526f0101010100000001010101010000000092820192909252630203040560e01b60608201527f0101010101010101010101010101010101010101010101010101010101010101608082015264010101010160d81b60a0820152600060c0820181905260e0820181905283519092741fffffffff000000000f8f000063f000013fff0ffe916a40000000000000000000026117ff60f31b039163ffffffff60601b1991870181019087015b8051600081811a880151811a82811a890151821a0182811a890151821a0182811a890151821a0182811a890151821a0182811a89015190911a01918201911a6001811b86811661032057808516610239575001605d1901610326565b80861661027e575b8280600101935050825160001a915081605b141561025e57610279565b6001821b851661027157918101605e1901915b838310610241575b610320565b816033141561030f578251602084015160d81c673350600060045af160c083901c14156102b057600885019450610306565b817f336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a0157601480156102e357508064016000f35b145b156102f357602585019450610306565b60009a5050505050505050505050610338565b50505050610326565b600098505050505050505050610338565b50506001015b8181106101dd57600196505050505050505b91905056fea26469706673582212209a836b268dcf58167a9f65bb872e3ddb5bd93b231f6b456f1c5e6d75b92a746364736f6c63430007060033", + "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061002b5760003560e01c8063a44eb59a14610030575b600080fd5b6100d66004803603602081101561004657600080fd5b81019060208101813564010000000081111561006157600080fd5b82018360208201111561007357600080fd5b8035906020019184600183028401116401000000008311171561009557600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506100ea945050505050565b604080519115158252519081900360200190f35b60408051610100810182527e0101010101010101010101000000000101010101010101010101010101000081526b010101010101000000010100600160f81b016020808301919091526f0101010100000001010101010000000092820192909252630203040560e01b60608201527f0101010101010101010101010101010101010101010101010101010101010101608082015264010101010160d81b60a0820152600060c0820181905260e0820181905283519092741fffffffff000000000f8f000063f000013fff0ffe916a40000000000000000000026117ff60f31b039163ffffffff60601b1991870181019087015b8051600081811a880151811a82811a890151821a0182811a890151821a0182811a890151821a0182811a890151821a0182811a89015190911a01918201911a6001811b86811661032057808516610239575001605d1901610326565b80861661027e575b8280600101935050825160001a915081605b141561025e57610279565b6001821b851661027157918101605e1901915b838310610241575b610320565b816033141561030f578251602084015160d81c673350600060045af160c083901c14156102b057600885019450610306565b817f336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a0157601480156102e357508064016000f35b145b156102f357602585019450610306565b60009a5050505050505050505050610338565b50505050610326565b600098505050505050505050610338565b50506001015b8181106101dd57600196505050505050505b91905056fea26469706673582212209a836b268dcf58167a9f65bb872e3ddb5bd93b231f6b456f1c5e6d75b92a746364736f6c63430007060033", + "devdoc": { + "details": "The Safety Checker verifies that contracts deployed on L2 do not contain any \"unsafe\" operations. An operation is considered unsafe if it would access state variables which are specific to the environment (ie. L1 or L2) in which it is executed, as this could be used to \"escape the sandbox\" of the OVM, resulting in non-deterministic fraud proofs. That is, an attacker would be able to \"prove fraud\" on an honestly applied transaction. Note that a \"safe\" contract requires opcodes to appear in a particular pattern; omission of \"unsafe\" opcodes is necessary, but not sufficient. Compiler used: solc Runtime target: EVM", + "kind": "dev", + "methods": { + "isBytecodeSafe(bytes)": { + "params": { + "_bytecode": "The bytecode to safety check." + }, + "returns": { + "_0": "`true` if the bytecode is safe, `false` otherwise." + } + } + }, + "title": "OVM_SafetyChecker", + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": { + "isBytecodeSafe(bytes)": { + "notice": "Returns whether or not all of the provided bytecode is safe." + } + }, + "version": 1 + }, + "storageLayout": { + "storage": [], + "types": null + } +} \ No newline at end of file diff --git a/packages/contracts/deployments/kovan-v3/OVM_StateCommitmentChain.json b/packages/contracts/deployments/kovan-v3/OVM_StateCommitmentChain.json new file mode 100644 index 0000000000000..1e34677174753 --- /dev/null +++ b/packages/contracts/deployments/kovan-v3/OVM_StateCommitmentChain.json @@ -0,0 +1,529 @@ +{ + "address": "0xdB1367bB36C34618778D492725C3eD11B508aC54", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_libAddressManager", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_fraudProofWindow", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_sequencerPublishWindow", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "_batchIndex", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "_batchRoot", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_batchSize", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_prevTotalElements", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "_extraData", + "type": "bytes" + } + ], + "name": "StateBatchAppended", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "_batchIndex", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "_batchRoot", + "type": "bytes32" + } + ], + "name": "StateBatchDeleted", + "type": "event" + }, + { + "inputs": [], + "name": "FRAUD_PROOF_WINDOW", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "SEQUENCER_PUBLISH_WINDOW", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32[]", + "name": "_batch", + "type": "bytes32[]" + }, + { + "internalType": "uint256", + "name": "_shouldStartAtElement", + "type": "uint256" + } + ], + "name": "appendStateBatch", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "batches", + "outputs": [ + { + "internalType": "contract iOVM_ChainStorageContainer", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "batchIndex", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "batchRoot", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "batchSize", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "prevTotalElements", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "extraData", + "type": "bytes" + } + ], + "internalType": "struct Lib_OVMCodec.ChainBatchHeader", + "name": "_batchHeader", + "type": "tuple" + } + ], + "name": "deleteStateBatch", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "getLastSequencerTimestamp", + "outputs": [ + { + "internalType": "uint256", + "name": "_lastSequencerTimestamp", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getTotalBatches", + "outputs": [ + { + "internalType": "uint256", + "name": "_totalBatches", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getTotalElements", + "outputs": [ + { + "internalType": "uint256", + "name": "_totalElements", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "batchIndex", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "batchRoot", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "batchSize", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "prevTotalElements", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "extraData", + "type": "bytes" + } + ], + "internalType": "struct Lib_OVMCodec.ChainBatchHeader", + "name": "_batchHeader", + "type": "tuple" + } + ], + "name": "insideFraudProofWindow", + "outputs": [ + { + "internalType": "bool", + "name": "_inside", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "libAddressManager", + "outputs": [ + { + "internalType": "contract Lib_AddressManager", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "_name", + "type": "string" + } + ], + "name": "resolve", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_element", + "type": "bytes32" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "batchIndex", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "batchRoot", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "batchSize", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "prevTotalElements", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "extraData", + "type": "bytes" + } + ], + "internalType": "struct Lib_OVMCodec.ChainBatchHeader", + "name": "_batchHeader", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + }, + { + "internalType": "bytes32[]", + "name": "siblings", + "type": "bytes32[]" + } + ], + "internalType": "struct Lib_OVMCodec.ChainInclusionProof", + "name": "_proof", + "type": "tuple" + } + ], + "name": "verifyStateCommitment", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "transactionHash": "0x8c4c4052dc351f960e93b01fdd1e39be3b8dab99459b1be05254609d70df6c9f", + "receipt": { + "to": null, + "from": "0x18394B52d3Cb931dfA76F63251919D051953413d", + "contractAddress": "0xdB1367bB36C34618778D492725C3eD11B508aC54", + "transactionIndex": 1, + "gasUsed": "1624653", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0x82d155659e443e841339b8422848b42afa81a4fcb8e285c6e423b3e266ee431b", + "transactionHash": "0x8c4c4052dc351f960e93b01fdd1e39be3b8dab99459b1be05254609d70df6c9f", + "logs": [], + "blockNumber": 24572817, + "cumulativeGasUsed": "1667041", + "status": 1, + "byzantium": true + }, + "args": [ + "0xd56F695e73286ac252A37593DD4E7c14270eC1Df", + 60, + 15769999 + ], + "solcInputHash": "5ee8e508e2c54cb5ac6783b4855b1558", + "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_fraudProofWindow\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_sequencerPublishWindow\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_batchIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"_batchRoot\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_batchSize\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_prevTotalElements\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"_extraData\",\"type\":\"bytes\"}],\"name\":\"StateBatchAppended\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_batchIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"_batchRoot\",\"type\":\"bytes32\"}],\"name\":\"StateBatchDeleted\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"FRAUD_PROOF_WINDOW\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"SEQUENCER_PUBLISH_WINDOW\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"_batch\",\"type\":\"bytes32[]\"},{\"internalType\":\"uint256\",\"name\":\"_shouldStartAtElement\",\"type\":\"uint256\"}],\"name\":\"appendStateBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"batches\",\"outputs\":[{\"internalType\":\"contract iOVM_ChainStorageContainer\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"_batchHeader\",\"type\":\"tuple\"}],\"name\":\"deleteStateBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLastSequencerTimestamp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_lastSequencerTimestamp\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTotalBatches\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_totalBatches\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTotalElements\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_totalElements\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"_batchHeader\",\"type\":\"tuple\"}],\"name\":\"insideFraudProofWindow\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"_inside\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_element\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"_batchHeader\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"siblings\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct Lib_OVMCodec.ChainInclusionProof\",\"name\":\"_proof\",\"type\":\"tuple\"}],\"name\":\"verifyStateCommitment\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The State Commitment Chain (SCC) contract contains a list of proposed state roots which Proposers assert to be a result of each transaction in the Canonical Transaction Chain (CTC). Elements here have a 1:1 correspondence with transactions in the CTC, and should be the unique state root calculated off-chain by applying the canonical transactions one by one. Compiler used: solc Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"appendStateBatch(bytes32[],uint256)\":{\"params\":{\"_batch\":\"Batch of state roots.\",\"_shouldStartAtElement\":\"Index of the element at which this batch should start.\"}},\"batches()\":{\"returns\":{\"_0\":\"Reference to the batch storage container.\"}},\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\"}},\"deleteStateBatch((uint256,bytes32,uint256,uint256,bytes))\":{\"params\":{\"_batchHeader\":\"Header of the batch to start deleting from.\"}},\"getLastSequencerTimestamp()\":{\"returns\":{\"_lastSequencerTimestamp\":\"Last sequencer batch timestamp.\"}},\"getTotalBatches()\":{\"returns\":{\"_totalBatches\":\"Total submitted batches.\"}},\"getTotalElements()\":{\"returns\":{\"_totalElements\":\"Total submitted elements.\"}},\"insideFraudProofWindow((uint256,bytes32,uint256,uint256,bytes))\":{\"params\":{\"_batchHeader\":\"Header of the batch to check.\"},\"returns\":{\"_inside\":\"Whether or not the batch is inside the fraud proof window.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}},\"verifyStateCommitment(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))\":{\"params\":{\"_batchHeader\":\"Header of the batch in which the element was included.\",\"_element\":\"Hash of the element to verify a proof for.\",\"_proof\":\"Merkle inclusion proof for the element.\"}}},\"title\":\"OVM_StateCommitmentChain\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"appendStateBatch(bytes32[],uint256)\":{\"notice\":\"Appends a batch of state roots to the chain.\"},\"batches()\":{\"notice\":\"Accesses the batch storage container.\"},\"deleteStateBatch((uint256,bytes32,uint256,uint256,bytes))\":{\"notice\":\"Deletes all state roots after (and including) a given batch.\"},\"getLastSequencerTimestamp()\":{\"notice\":\"Retrieves the timestamp of the last batch submitted by the sequencer.\"},\"getTotalBatches()\":{\"notice\":\"Retrieves the total number of batches submitted.\"},\"getTotalElements()\":{\"notice\":\"Retrieves the total number of elements submitted.\"},\"insideFraudProofWindow((uint256,bytes32,uint256,uint256,bytes))\":{\"notice\":\"Checks whether a given batch is still inside its fraud proof window.\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"},\"verifyStateCommitment(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))\":{\"notice\":\"Verifies a batch inclusion proof.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/OVM/chain/OVM_StateCommitmentChain.sol\":\"OVM_StateCommitmentChain\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor () internal {\\n address msgSender = _msgSender();\\n _owner = msgSender;\\n emit OwnershipTransferred(address(0), msgSender);\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n emit OwnershipTransferred(_owner, address(0));\\n _owner = address(0);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n emit OwnershipTransferred(_owner, newOwner);\\n _owner = newOwner;\\n }\\n}\\n\",\"keccak256\":\"0x15e2d5bd4c28a88548074c54d220e8086f638a71ed07e6b3ba5a70066fcf458d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/math/SafeMath.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\n * checks.\\n *\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\n * in bugs, because programmers usually assume that an overflow raises an\\n * error, which is the standard behavior in high level programming languages.\\n * `SafeMath` restores this intuition by reverting the transaction when an\\n * operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n */\\nlibrary SafeMath {\\n /**\\n * @dev Returns the addition of two unsigned integers, with an overflow flag.\\n *\\n * _Available since v3.4._\\n */\\n function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n uint256 c = a + b;\\n if (c < a) return (false, 0);\\n return (true, c);\\n }\\n\\n /**\\n * @dev Returns the substraction of two unsigned integers, with an overflow flag.\\n *\\n * _Available since v3.4._\\n */\\n function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n if (b > a) return (false, 0);\\n return (true, a - b);\\n }\\n\\n /**\\n * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\\n *\\n * _Available since v3.4._\\n */\\n function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\n // benefit is lost if 'b' is also tested.\\n // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\n if (a == 0) return (true, 0);\\n uint256 c = a * b;\\n if (c / a != b) return (false, 0);\\n return (true, c);\\n }\\n\\n /**\\n * @dev Returns the division of two unsigned integers, with a division by zero flag.\\n *\\n * _Available since v3.4._\\n */\\n function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n if (b == 0) return (false, 0);\\n return (true, a / b);\\n }\\n\\n /**\\n * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\\n *\\n * _Available since v3.4._\\n */\\n function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n if (b == 0) return (false, 0);\\n return (true, a % b);\\n }\\n\\n /**\\n * @dev Returns the addition of two unsigned integers, reverting on\\n * overflow.\\n *\\n * Counterpart to Solidity's `+` operator.\\n *\\n * Requirements:\\n *\\n * - Addition cannot overflow.\\n */\\n function add(uint256 a, uint256 b) internal pure returns (uint256) {\\n uint256 c = a + b;\\n require(c >= a, \\\"SafeMath: addition overflow\\\");\\n return c;\\n }\\n\\n /**\\n * @dev Returns the subtraction of two unsigned integers, reverting on\\n * overflow (when the result is negative).\\n *\\n * Counterpart to Solidity's `-` operator.\\n *\\n * Requirements:\\n *\\n * - Subtraction cannot overflow.\\n */\\n function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\n require(b <= a, \\\"SafeMath: subtraction overflow\\\");\\n return a - b;\\n }\\n\\n /**\\n * @dev Returns the multiplication of two unsigned integers, reverting on\\n * overflow.\\n *\\n * Counterpart to Solidity's `*` operator.\\n *\\n * Requirements:\\n *\\n * - Multiplication cannot overflow.\\n */\\n function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\n if (a == 0) return 0;\\n uint256 c = a * b;\\n require(c / a == b, \\\"SafeMath: multiplication overflow\\\");\\n return c;\\n }\\n\\n /**\\n * @dev Returns the integer division of two unsigned integers, reverting on\\n * division by zero. The result is rounded towards zero.\\n *\\n * Counterpart to Solidity's `/` operator. Note: this function uses a\\n * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n * uses an invalid opcode to revert (consuming all remaining gas).\\n *\\n * Requirements:\\n *\\n * - The divisor cannot be zero.\\n */\\n function div(uint256 a, uint256 b) internal pure returns (uint256) {\\n require(b > 0, \\\"SafeMath: division by zero\\\");\\n return a / b;\\n }\\n\\n /**\\n * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n * reverting when dividing by zero.\\n *\\n * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n * opcode (which leaves remaining gas untouched) while Solidity uses an\\n * invalid opcode to revert (consuming all remaining gas).\\n *\\n * Requirements:\\n *\\n * - The divisor cannot be zero.\\n */\\n function mod(uint256 a, uint256 b) internal pure returns (uint256) {\\n require(b > 0, \\\"SafeMath: modulo by zero\\\");\\n return a % b;\\n }\\n\\n /**\\n * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\n * overflow (when the result is negative).\\n *\\n * CAUTION: This function is deprecated because it requires allocating memory for the error\\n * message unnecessarily. For custom revert reasons use {trySub}.\\n *\\n * Counterpart to Solidity's `-` operator.\\n *\\n * Requirements:\\n *\\n * - Subtraction cannot overflow.\\n */\\n function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n require(b <= a, errorMessage);\\n return a - b;\\n }\\n\\n /**\\n * @dev Returns the integer division of two unsigned integers, reverting with custom message on\\n * division by zero. The result is rounded towards zero.\\n *\\n * CAUTION: This function is deprecated because it requires allocating memory for the error\\n * message unnecessarily. For custom revert reasons use {tryDiv}.\\n *\\n * Counterpart to Solidity's `/` operator. Note: this function uses a\\n * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n * uses an invalid opcode to revert (consuming all remaining gas).\\n *\\n * Requirements:\\n *\\n * - The divisor cannot be zero.\\n */\\n function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n require(b > 0, errorMessage);\\n return a / b;\\n }\\n\\n /**\\n * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n * reverting with custom message when dividing by zero.\\n *\\n * CAUTION: This function is deprecated because it requires allocating memory for the error\\n * message unnecessarily. For custom revert reasons use {tryMod}.\\n *\\n * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n * opcode (which leaves remaining gas untouched) while Solidity uses an\\n * invalid opcode to revert (consuming all remaining gas).\\n *\\n * Requirements:\\n *\\n * - The divisor cannot be zero.\\n */\\n function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n require(b > 0, errorMessage);\\n return a % b;\\n }\\n}\\n\",\"keccak256\":\"0xcc78a17dd88fa5a2edc60c8489e2f405c0913b377216a5b26b35656b2d0dab52\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with GSN meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address payable) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes memory) {\\n this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x8d3cb350f04ff49cfb10aef08d87f19dcbaecc8027b0bed12f3275cd12f38cf0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/chain/OVM_StateCommitmentChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\nimport { Lib_MerkleTree } from \\\"../../libraries/utils/Lib_MerkleTree.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_FraudVerifier } from \\\"../../iOVM/verification/iOVM_FraudVerifier.sol\\\";\\nimport { iOVM_StateCommitmentChain } from \\\"../../iOVM/chain/iOVM_StateCommitmentChain.sol\\\";\\nimport { iOVM_CanonicalTransactionChain } from \\\"../../iOVM/chain/iOVM_CanonicalTransactionChain.sol\\\";\\nimport { iOVM_BondManager } from \\\"../../iOVM/verification/iOVM_BondManager.sol\\\";\\nimport { iOVM_ChainStorageContainer } from \\\"../../iOVM/chain/iOVM_ChainStorageContainer.sol\\\";\\n\\n/* External Imports */\\nimport '@openzeppelin/contracts/math/SafeMath.sol';\\n\\n/**\\n * @title OVM_StateCommitmentChain\\n * @dev The State Commitment Chain (SCC) contract contains a list of proposed state roots which\\n * Proposers assert to be a result of each transaction in the Canonical Transaction Chain (CTC).\\n * Elements here have a 1:1 correspondence with transactions in the CTC, and should be the unique\\n * state root calculated off-chain by applying the canonical transactions one by one.\\n *\\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract OVM_StateCommitmentChain is iOVM_StateCommitmentChain, Lib_AddressResolver {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 public FRAUD_PROOF_WINDOW;\\n uint256 public SEQUENCER_PUBLISH_WINDOW;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n */\\n constructor(\\n address _libAddressManager,\\n uint256 _fraudProofWindow,\\n uint256 _sequencerPublishWindow\\n )\\n Lib_AddressResolver(_libAddressManager)\\n {\\n FRAUD_PROOF_WINDOW = _fraudProofWindow;\\n SEQUENCER_PUBLISH_WINDOW = _sequencerPublishWindow;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Accesses the batch storage container.\\n * @return Reference to the batch storage container.\\n */\\n function batches()\\n public\\n view\\n returns (\\n iOVM_ChainStorageContainer\\n )\\n {\\n return iOVM_ChainStorageContainer(\\n resolve(\\\"OVM_ChainStorageContainer:SCC:batches\\\")\\n );\\n }\\n\\n /**\\n * @inheritdoc iOVM_StateCommitmentChain\\n */\\n function getTotalElements()\\n override\\n public\\n view\\n returns (\\n uint256 _totalElements\\n )\\n {\\n (uint40 totalElements, ) = _getBatchExtraData();\\n return uint256(totalElements);\\n }\\n\\n /**\\n * @inheritdoc iOVM_StateCommitmentChain\\n */\\n function getTotalBatches()\\n override\\n public\\n view\\n returns (\\n uint256 _totalBatches\\n )\\n {\\n return batches().length();\\n }\\n\\n /**\\n * @inheritdoc iOVM_StateCommitmentChain\\n */\\n function getLastSequencerTimestamp()\\n override\\n public\\n view\\n returns (\\n uint256 _lastSequencerTimestamp\\n )\\n {\\n (, uint40 lastSequencerTimestamp) = _getBatchExtraData();\\n return uint256(lastSequencerTimestamp);\\n }\\n\\n /**\\n * @inheritdoc iOVM_StateCommitmentChain\\n */\\n function appendStateBatch(\\n bytes32[] memory _batch,\\n uint256 _shouldStartAtElement\\n )\\n override\\n public\\n {\\n // Fail fast in to make sure our batch roots aren't accidentally made fraudulent by the\\n // publication of batches by some other user.\\n require(\\n _shouldStartAtElement == getTotalElements(),\\n \\\"Actual batch start index does not match expected start index.\\\"\\n );\\n\\n // Proposers must have previously staked at the BondManager\\n require(\\n iOVM_BondManager(resolve(\\\"OVM_BondManager\\\")).isCollateralized(msg.sender),\\n \\\"Proposer does not have enough collateral posted\\\"\\n );\\n\\n require(\\n _batch.length > 0,\\n \\\"Cannot submit an empty state batch.\\\"\\n );\\n\\n require(\\n getTotalElements() + _batch.length <= iOVM_CanonicalTransactionChain(resolve(\\\"OVM_CanonicalTransactionChain\\\")).getTotalElements(),\\n \\\"Number of state roots cannot exceed the number of canonical transactions.\\\"\\n );\\n\\n // Pass the block's timestamp and the publisher of the data\\n // to be used in the fraud proofs\\n _appendBatch(\\n _batch,\\n abi.encode(block.timestamp, msg.sender)\\n );\\n }\\n\\n /**\\n * @inheritdoc iOVM_StateCommitmentChain\\n */\\n function deleteStateBatch(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n override\\n public\\n {\\n require(\\n msg.sender == resolve(\\\"OVM_FraudVerifier\\\"),\\n \\\"State batches can only be deleted by the OVM_FraudVerifier.\\\"\\n );\\n\\n require(\\n _isValidBatchHeader(_batchHeader),\\n \\\"Invalid batch header.\\\"\\n );\\n\\n require(\\n insideFraudProofWindow(_batchHeader),\\n \\\"State batches can only be deleted within the fraud proof window.\\\"\\n );\\n\\n _deleteBatch(_batchHeader);\\n }\\n\\n /**\\n * @inheritdoc iOVM_StateCommitmentChain\\n */\\n function verifyStateCommitment(\\n bytes32 _element,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _proof\\n )\\n override\\n public\\n view\\n returns (\\n bool\\n )\\n {\\n require(\\n _isValidBatchHeader(_batchHeader),\\n \\\"Invalid batch header.\\\"\\n );\\n\\n require(\\n Lib_MerkleTree.verify(\\n _batchHeader.batchRoot,\\n _element,\\n _proof.index,\\n _proof.siblings,\\n _batchHeader.batchSize\\n ),\\n \\\"Invalid inclusion proof.\\\"\\n );\\n\\n return true;\\n }\\n\\n /**\\n * @inheritdoc iOVM_StateCommitmentChain\\n */\\n function insideFraudProofWindow(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n override\\n public\\n view\\n returns (\\n bool _inside\\n )\\n {\\n (uint256 timestamp,) = abi.decode(\\n _batchHeader.extraData,\\n (uint256, address)\\n );\\n\\n require(\\n timestamp != 0,\\n \\\"Batch header timestamp cannot be zero\\\"\\n );\\n return SafeMath.add(timestamp, FRAUD_PROOF_WINDOW) > block.timestamp;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Parses the batch context from the extra data.\\n * @return Total number of elements submitted.\\n * @return Timestamp of the last batch submitted by the sequencer.\\n */\\n function _getBatchExtraData()\\n internal\\n view\\n returns (\\n uint40,\\n uint40\\n )\\n {\\n bytes27 extraData = batches().getGlobalMetadata();\\n\\n uint40 totalElements;\\n uint40 lastSequencerTimestamp;\\n assembly {\\n extraData := shr(40, extraData)\\n totalElements := and(extraData, 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF)\\n lastSequencerTimestamp := shr(40, and(extraData, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000))\\n }\\n\\n return (\\n totalElements,\\n lastSequencerTimestamp\\n );\\n }\\n\\n /**\\n * Encodes the batch context for the extra data.\\n * @param _totalElements Total number of elements submitted.\\n * @param _lastSequencerTimestamp Timestamp of the last batch submitted by the sequencer.\\n * @return Encoded batch context.\\n */\\n function _makeBatchExtraData(\\n uint40 _totalElements,\\n uint40 _lastSequencerTimestamp\\n )\\n internal\\n pure\\n returns (\\n bytes27\\n )\\n {\\n bytes27 extraData;\\n assembly {\\n extraData := _totalElements\\n extraData := or(extraData, shl(40, _lastSequencerTimestamp))\\n extraData := shl(40, extraData)\\n }\\n\\n return extraData;\\n }\\n\\n /**\\n * Appends a batch to the chain.\\n * @param _batch Elements within the batch.\\n * @param _extraData Any extra data to append to the batch.\\n */\\n function _appendBatch(\\n bytes32[] memory _batch,\\n bytes memory _extraData\\n )\\n internal\\n {\\n address sequencer = resolve(\\\"OVM_Proposer\\\");\\n (uint40 totalElements, uint40 lastSequencerTimestamp) = _getBatchExtraData();\\n\\n if (msg.sender == sequencer) {\\n lastSequencerTimestamp = uint40(block.timestamp);\\n } else {\\n // We keep track of the last batch submitted by the sequencer so there's a window in\\n // which only the sequencer can publish state roots. A window like this just reduces\\n // the chance of \\\"system breaking\\\" state roots being published while we're still in\\n // testing mode. This window should be removed or significantly reduced in the future.\\n require(\\n lastSequencerTimestamp + SEQUENCER_PUBLISH_WINDOW < block.timestamp,\\n \\\"Cannot publish state roots within the sequencer publication window.\\\"\\n );\\n }\\n\\n // For efficiency reasons getMerkleRoot modifies the `_batch` argument in place\\n // while calculating the root hash therefore any arguments passed to it must not\\n // be used again afterwards\\n Lib_OVMCodec.ChainBatchHeader memory batchHeader = Lib_OVMCodec.ChainBatchHeader({\\n batchIndex: getTotalBatches(),\\n batchRoot: Lib_MerkleTree.getMerkleRoot(_batch),\\n batchSize: _batch.length,\\n prevTotalElements: totalElements,\\n extraData: _extraData\\n });\\n\\n emit StateBatchAppended(\\n batchHeader.batchIndex,\\n batchHeader.batchRoot,\\n batchHeader.batchSize,\\n batchHeader.prevTotalElements,\\n batchHeader.extraData\\n );\\n\\n batches().push(\\n Lib_OVMCodec.hashBatchHeader(batchHeader),\\n _makeBatchExtraData(\\n uint40(batchHeader.prevTotalElements + batchHeader.batchSize),\\n lastSequencerTimestamp\\n )\\n );\\n }\\n\\n /**\\n * Removes a batch and all subsequent batches from the chain.\\n * @param _batchHeader Header of the batch to remove.\\n */\\n function _deleteBatch(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n internal\\n {\\n require(\\n _batchHeader.batchIndex < batches().length(),\\n \\\"Invalid batch index.\\\"\\n );\\n\\n require(\\n _isValidBatchHeader(_batchHeader),\\n \\\"Invalid batch header.\\\"\\n );\\n\\n batches().deleteElementsAfterInclusive(\\n _batchHeader.batchIndex,\\n _makeBatchExtraData(\\n uint40(_batchHeader.prevTotalElements),\\n 0\\n )\\n );\\n\\n emit StateBatchDeleted(\\n _batchHeader.batchIndex,\\n _batchHeader.batchRoot\\n );\\n }\\n\\n /**\\n * Checks that a batch header matches the stored hash for the given index.\\n * @param _batchHeader Batch header to validate.\\n * @return Whether or not the header matches the stored one.\\n */\\n function _isValidBatchHeader(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n internal\\n view\\n returns (\\n bool\\n )\\n {\\n return Lib_OVMCodec.hashBatchHeader(_batchHeader) == batches().get(_batchHeader.batchIndex);\\n }\\n}\\n\",\"keccak256\":\"0x5b72c845f856a06c978880d3cb2db40dafebaebf399df100c6ac832eaf41d7bd\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_CanonicalTransactionChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_ChainStorageContainer } from \\\"./iOVM_ChainStorageContainer.sol\\\";\\n\\n/**\\n * @title iOVM_CanonicalTransactionChain\\n */\\ninterface iOVM_CanonicalTransactionChain {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event TransactionEnqueued(\\n address _l1TxOrigin,\\n address _target,\\n uint256 _gasLimit,\\n bytes _data,\\n uint256 _queueIndex,\\n uint256 _timestamp\\n );\\n\\n event QueueBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event SequencerBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event TransactionBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct BatchContext {\\n uint256 numSequencedTransactions;\\n uint256 numSubsequentQueueTransactions;\\n uint256 timestamp;\\n uint256 blockNumber;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n\\n /**\\n * Accesses the batch storage container.\\n * @return Reference to the batch storage container.\\n */\\n function batches()\\n external\\n view\\n returns (\\n iOVM_ChainStorageContainer\\n );\\n\\n /**\\n * Accesses the queue storage container.\\n * @return Reference to the queue storage container.\\n */\\n function queue()\\n external\\n view\\n returns (\\n iOVM_ChainStorageContainer\\n );\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements()\\n external\\n view\\n returns (\\n uint256 _totalElements\\n );\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches()\\n external\\n view\\n returns (\\n uint256 _totalBatches\\n );\\n\\n /**\\n * Returns the index of the next element to be enqueued.\\n * @return Index for the next queue element.\\n */\\n function getNextQueueIndex()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Gets the queue element at a particular index.\\n * @param _index Index of the queue element to access.\\n * @return _element Queue element at the given index.\\n */\\n function getQueueElement(\\n uint256 _index\\n )\\n external\\n view\\n returns (\\n Lib_OVMCodec.QueueElement memory _element\\n );\\n\\n /**\\n * Returns the timestamp of the last transaction.\\n * @return Timestamp for the last transaction.\\n */\\n function getLastTimestamp()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Returns the blocknumber of the last transaction.\\n * @return Blocknumber for the last transaction.\\n */\\n function getLastBlockNumber()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Get the number of queue elements which have not yet been included.\\n * @return Number of pending queue elements.\\n */\\n function getNumPendingQueueElements()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Retrieves the length of the queue, including\\n * both pending and canonical transactions.\\n * @return Length of the queue.\\n */\\n function getQueueLength()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n\\n /**\\n * Adds a transaction to the queue.\\n * @param _target Target contract to send the transaction to.\\n * @param _gasLimit Gas limit for the given transaction.\\n * @param _data Transaction data.\\n */\\n function enqueue(\\n address _target,\\n uint256 _gasLimit,\\n bytes memory _data\\n )\\n external;\\n\\n /**\\n * Appends a given number of queued transactions as a single batch.\\n * @param _numQueuedTransactions Number of transactions to append.\\n */\\n function appendQueueBatch(\\n uint256 _numQueuedTransactions\\n )\\n external;\\n\\n /**\\n * Allows the sequencer to append a batch of transactions.\\n * @dev This function uses a custom encoding scheme for efficiency reasons.\\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\\n * .param _contexts Array of batch contexts.\\n * .param _transactionDataFields Array of raw transaction data.\\n */\\n function appendSequencerBatch(\\n // uint40 _shouldStartAtElement,\\n // uint24 _totalElementsToAppend,\\n // BatchContext[] _contexts,\\n // bytes[] _transactionDataFields\\n )\\n external;\\n\\n /**\\n * Verifies whether a transaction is included in the chain.\\n * @param _transaction Transaction to verify.\\n * @param _txChainElement Transaction chain element corresponding to the transaction.\\n * @param _batchHeader Header of the batch the transaction was included in.\\n * @param _inclusionProof Inclusion proof for the provided transaction chain element.\\n * @return True if the transaction exists in the CTC, false if not.\\n */\\n function verifyTransaction(\\n Lib_OVMCodec.Transaction memory _transaction,\\n Lib_OVMCodec.TransactionChainElement memory _txChainElement,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _inclusionProof\\n )\\n external\\n view\\n returns (\\n bool\\n );\\n}\\n\",\"keccak256\":\"0xb5e55488a1982841c07cdf5ff475da4789596f111dd48f01b1918ee4c775cf3a\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_ChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title iOVM_ChainStorageContainer\\n */\\ninterface iOVM_ChainStorageContainer {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata()\\n external\\n view\\n returns (\\n bytes27\\n );\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length()\\n external\\n view\\n returns (\\n uint256\\n );\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(\\n bytes32 _object\\n )\\n external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(\\n bytes32 _object,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(\\n uint256 _index\\n )\\n external\\n view\\n returns (\\n bytes32\\n );\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index\\n )\\n external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Marks an index as overwritable, meaing the underlying buffer can start to write values over\\n * any objects before and including the given index.\\n */\\n function setNextOverwritableIndex(\\n uint256 _index\\n )\\n external;\\n}\\n\",\"keccak256\":\"0x2d7973a0ad84c23ec62624d3f1e3aeb198cc72686ff1e6cfa17155556b320c94\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_StateCommitmentChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title iOVM_StateCommitmentChain\\n */\\ninterface iOVM_StateCommitmentChain {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event StateBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n event StateBatchDeleted(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot\\n );\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements()\\n external\\n view\\n returns (\\n uint256 _totalElements\\n );\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches()\\n external\\n view\\n returns (\\n uint256 _totalBatches\\n );\\n\\n /**\\n * Retrieves the timestamp of the last batch submitted by the sequencer.\\n * @return _lastSequencerTimestamp Last sequencer batch timestamp.\\n */\\n function getLastSequencerTimestamp()\\n external\\n view\\n returns (\\n uint256 _lastSequencerTimestamp\\n );\\n\\n /**\\n * Appends a batch of state roots to the chain.\\n * @param _batch Batch of state roots.\\n * @param _shouldStartAtElement Index of the element at which this batch should start.\\n */\\n function appendStateBatch(\\n bytes32[] calldata _batch,\\n uint256 _shouldStartAtElement\\n )\\n external;\\n\\n /**\\n * Deletes all state roots after (and including) a given batch.\\n * @param _batchHeader Header of the batch to start deleting from.\\n */\\n function deleteStateBatch(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n external;\\n\\n /**\\n * Verifies a batch inclusion proof.\\n * @param _element Hash of the element to verify a proof for.\\n * @param _batchHeader Header of the batch in which the element was included.\\n * @param _proof Merkle inclusion proof for the element.\\n */\\n function verifyStateCommitment(\\n bytes32 _element,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _proof\\n )\\n external\\n view\\n returns (\\n bool _verified\\n );\\n\\n /**\\n * Checks whether a given batch is still inside its fraud proof window.\\n * @param _batchHeader Header of the batch to check.\\n * @return _inside Whether or not the batch is inside the fraud proof window.\\n */\\n function insideFraudProofWindow(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n external\\n view\\n returns (\\n bool _inside\\n );\\n}\\n\",\"keccak256\":\"0x6646d6ff392b81aab52a7a277e91540819464751de0af5afd1962094b2e92448\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/verification/iOVM_BondManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\ninterface ERC20 {\\n function transfer(address, uint256) external returns (bool);\\n function transferFrom(address, address, uint256) external returns (bool);\\n}\\n\\n/// All the errors which may be encountered on the bond manager\\nlibrary Errors {\\n string constant ERC20_ERR = \\\"BondManager: Could not post bond\\\";\\n string constant ALREADY_FINALIZED = \\\"BondManager: Fraud proof for this pre-state root has already been finalized\\\";\\n string constant SLASHED = \\\"BondManager: Cannot finalize withdrawal, you probably got slashed\\\";\\n string constant WRONG_STATE = \\\"BondManager: Wrong bond state for proposer\\\";\\n string constant CANNOT_CLAIM = \\\"BondManager: Cannot claim yet. Dispute must be finalized first\\\";\\n\\n string constant WITHDRAWAL_PENDING = \\\"BondManager: Withdrawal already pending\\\";\\n string constant TOO_EARLY = \\\"BondManager: Too early to finalize your withdrawal\\\";\\n\\n string constant ONLY_TRANSITIONER = \\\"BondManager: Only the transitioner for this pre-state root may call this function\\\";\\n string constant ONLY_FRAUD_VERIFIER = \\\"BondManager: Only the fraud verifier may call this function\\\";\\n string constant ONLY_STATE_COMMITMENT_CHAIN = \\\"BondManager: Only the state commitment chain may call this function\\\";\\n string constant WAIT_FOR_DISPUTES = \\\"BondManager: Wait for other potential disputes\\\";\\n}\\n\\n/**\\n * @title iOVM_BondManager\\n */\\ninterface iOVM_BondManager {\\n\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n /// The lifecycle of a proposer's bond\\n enum State {\\n // Before depositing or after getting slashed, a user is uncollateralized\\n NOT_COLLATERALIZED,\\n // After depositing, a user is collateralized\\n COLLATERALIZED,\\n // After a user has initiated a withdrawal\\n WITHDRAWING\\n }\\n\\n /// A bond posted by a proposer\\n struct Bond {\\n // The user's state\\n State state;\\n // The timestamp at which a proposer issued their withdrawal request\\n uint32 withdrawalTimestamp;\\n // The time when the first disputed was initiated for this bond\\n uint256 firstDisputeAt;\\n // The earliest observed state root for this bond which has had fraud\\n bytes32 earliestDisputedStateRoot;\\n // The state root's timestamp\\n uint256 earliestTimestamp;\\n }\\n\\n // Per pre-state root, store the number of state provisions that were made\\n // and how many of these calls were made by each user. Payouts will then be\\n // claimed by users proportionally for that dispute.\\n struct Rewards {\\n // Flag to check if rewards for a fraud proof are claimable\\n bool canClaim;\\n // Total number of `recordGasSpent` calls made\\n uint256 total;\\n // The gas spent by each user to provide witness data. The sum of all\\n // values inside this map MUST be equal to the value of `total`\\n mapping(address => uint256) gasSpent;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function recordGasSpent(\\n bytes32 _preStateRoot,\\n bytes32 _txHash,\\n address _who,\\n uint256 _gasSpent\\n ) external;\\n\\n function finalize(\\n bytes32 _preStateRoot,\\n address _publisher,\\n uint256 _timestamp\\n ) external;\\n\\n function deposit() external;\\n\\n function startWithdrawal() external;\\n\\n function finalizeWithdrawal() external;\\n\\n function claim(\\n address _who\\n ) external;\\n\\n function isCollateralized(\\n address _who\\n ) external view returns (bool);\\n\\n function getGasSpent(\\n bytes32 _preStateRoot,\\n address _who\\n ) external view returns (uint256);\\n}\\n\",\"keccak256\":\"0x3c2a8a399487857158649db1896749d86e39cba545a8aeb2e2bb0f3bdfa7a5b1\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/verification/iOVM_FraudVerifier.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_StateTransitioner } from \\\"./iOVM_StateTransitioner.sol\\\";\\n\\n/**\\n * @title iOVM_FraudVerifier\\n */\\ninterface iOVM_FraudVerifier {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event FraudProofInitialized(\\n bytes32 _preStateRoot,\\n uint256 _preStateRootIndex,\\n bytes32 _transactionHash,\\n address _who\\n );\\n\\n event FraudProofFinalized(\\n bytes32 _preStateRoot,\\n uint256 _preStateRootIndex,\\n bytes32 _transactionHash,\\n address _who\\n );\\n\\n\\n /***************************************\\n * Public Functions: Transition Status *\\n ***************************************/\\n\\n function getStateTransitioner(bytes32 _preStateRoot, bytes32 _txHash) external view returns (iOVM_StateTransitioner _transitioner);\\n\\n\\n /****************************************\\n * Public Functions: Fraud Verification *\\n ****************************************/\\n\\n function initializeFraudVerification(\\n bytes32 _preStateRoot,\\n Lib_OVMCodec.ChainBatchHeader calldata _preStateRootBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof calldata _preStateRootProof,\\n Lib_OVMCodec.Transaction calldata _transaction,\\n Lib_OVMCodec.TransactionChainElement calldata _txChainElement,\\n Lib_OVMCodec.ChainBatchHeader calldata _transactionBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof calldata _transactionProof\\n ) external;\\n\\n function finalizeFraudVerification(\\n bytes32 _preStateRoot,\\n Lib_OVMCodec.ChainBatchHeader calldata _preStateRootBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof calldata _preStateRootProof,\\n bytes32 _txHash,\\n bytes32 _postStateRoot,\\n Lib_OVMCodec.ChainBatchHeader calldata _postStateRootBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof calldata _postStateRootProof\\n ) external;\\n}\\n\",\"keccak256\":\"0x5efd7bb18164bbd3e9d58379e8203fbf2a7ee802b1a48dff3ceaaec1523b1751\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/verification/iOVM_StateTransitioner.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title iOVM_StateTransitioner\\n */\\ninterface iOVM_StateTransitioner {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AccountCommitted(\\n address _address\\n );\\n\\n event ContractStorageCommitted(\\n address _address,\\n bytes32 _key\\n );\\n\\n\\n /**********************************\\n * Public Functions: State Access *\\n **********************************/\\n\\n function getPreStateRoot() external view returns (bytes32 _preStateRoot);\\n function getPostStateRoot() external view returns (bytes32 _postStateRoot);\\n function isComplete() external view returns (bool _complete);\\n\\n\\n /***********************************\\n * Public Functions: Pre-Execution *\\n ***********************************/\\n\\n function proveContractState(\\n address _ovmContractAddress,\\n address _ethContractAddress,\\n bytes calldata _stateTrieWitness\\n ) external;\\n\\n function proveStorageSlot(\\n address _ovmContractAddress,\\n bytes32 _key,\\n bytes calldata _storageTrieWitness\\n ) external;\\n\\n\\n /*******************************\\n * Public Functions: Execution *\\n *******************************/\\n\\n function applyTransaction(\\n Lib_OVMCodec.Transaction calldata _transaction\\n ) external;\\n\\n\\n /************************************\\n * Public Functions: Post-Execution *\\n ************************************/\\n\\n function commitContractState(\\n address _ovmContractAddress,\\n bytes calldata _stateTrieWitness\\n ) external;\\n\\n function commitStorageSlot(\\n address _ovmContractAddress,\\n bytes32 _key,\\n bytes calldata _storageTrieWitness\\n ) external;\\n\\n\\n /**********************************\\n * Public Functions: Finalization *\\n **********************************/\\n\\n function completeTransition() external;\\n}\\n\",\"keccak256\":\"0x3d044ac0a3bb6ad3d529f904b3191117511f9c379678ca03010e1ebdfcb5c34b\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/codec/Lib_OVMCodec.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../utils/Lib_Bytes32Utils.sol\\\";\\n\\n/**\\n * @title Lib_OVMCodec\\n */\\nlibrary Lib_OVMCodec {\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum QueueOrigin {\\n SEQUENCER_QUEUE,\\n L1TOL2_QUEUE\\n }\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Account {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n address ethAddress;\\n bool isFresh;\\n }\\n\\n struct EVMAccount {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n }\\n\\n struct ChainBatchHeader {\\n uint256 batchIndex;\\n bytes32 batchRoot;\\n uint256 batchSize;\\n uint256 prevTotalElements;\\n bytes extraData;\\n }\\n\\n struct ChainInclusionProof {\\n uint256 index;\\n bytes32[] siblings;\\n }\\n\\n struct Transaction {\\n uint256 timestamp;\\n uint256 blockNumber;\\n QueueOrigin l1QueueOrigin;\\n address l1TxOrigin;\\n address entrypoint;\\n uint256 gasLimit;\\n bytes data;\\n }\\n\\n struct TransactionChainElement {\\n bool isSequenced;\\n uint256 queueIndex; // QUEUED TX ONLY\\n uint256 timestamp; // SEQUENCER TX ONLY\\n uint256 blockNumber; // SEQUENCER TX ONLY\\n bytes txData; // SEQUENCER TX ONLY\\n }\\n\\n struct QueueElement {\\n bytes32 transactionHash;\\n uint40 timestamp;\\n uint40 blockNumber;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Encodes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Encoded transaction bytes.\\n */\\n function encodeTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return abi.encodePacked(\\n _transaction.timestamp,\\n _transaction.blockNumber,\\n _transaction.l1QueueOrigin,\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n );\\n }\\n\\n /**\\n * Hashes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Hashed transaction\\n */\\n function hashTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(encodeTransaction(_transaction));\\n }\\n\\n /**\\n * Converts an OVM account to an EVM account.\\n * @param _in OVM account to convert.\\n * @return Converted EVM account.\\n */\\n function toEVMAccount(\\n Account memory _in\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n return EVMAccount({\\n nonce: _in.nonce,\\n balance: _in.balance,\\n storageRoot: _in.storageRoot,\\n codeHash: _in.codeHash\\n });\\n }\\n\\n /**\\n * @notice RLP-encodes an account state struct.\\n * @param _account Account state struct.\\n * @return RLP-encoded account state.\\n */\\n function encodeEVMAccount(\\n EVMAccount memory _account\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes[] memory raw = new bytes[](4);\\n\\n // Unfortunately we can't create this array outright because\\n // Lib_RLPWriter.writeList will reject fixed-size arrays. Assigning\\n // index-by-index circumvents this issue.\\n raw[0] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.nonce)\\n )\\n );\\n raw[1] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.balance)\\n )\\n );\\n raw[2] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.storageRoot));\\n raw[3] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.codeHash));\\n\\n return Lib_RLPWriter.writeList(raw);\\n }\\n\\n /**\\n * @notice Decodes an RLP-encoded account state into a useful struct.\\n * @param _encoded RLP-encoded account state.\\n * @return Account state struct.\\n */\\n function decodeEVMAccount(\\n bytes memory _encoded\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\\n\\n return EVMAccount({\\n nonce: Lib_RLPReader.readUint256(accountState[0]),\\n balance: Lib_RLPReader.readUint256(accountState[1]),\\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\\n });\\n }\\n\\n /**\\n * Calculates a hash for a given batch header.\\n * @param _batchHeader Header to hash.\\n * @return Hash of the header.\\n */\\n function hashBatchHeader(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(\\n abi.encode(\\n _batchHeader.batchRoot,\\n _batchHeader.batchSize,\\n _batchHeader.prevTotalElements,\\n _batchHeader.extraData\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0xd85ba2066057a2677926f484b938c7c2ef33ff3853f3b71cda252f4a54f30e05\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n public\\n onlyOwner\\n {\\n addresses[_getNameHash(_name)] = _address;\\n\\n emit AddressSet(\\n _name,\\n _address\\n );\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0x2ce671a0e004df88b136bea5a3c59d0732cea8887c8496da1d509e0200b03d7d\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(\\n address _libAddressManager\\n ) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x65981feeabff6a81783ea97d44baf988a18a86c8cb374c46fdb71819cbacc7c0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPReader.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_RLPReader\\n * @dev Adapted from \\\"RLPReader\\\" by Hamdi Allam (hamdi.allam97@gmail.com).\\n */\\nlibrary Lib_RLPReader {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 constant internal MAX_LIST_LENGTH = 32;\\n\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum RLPItemType {\\n DATA_ITEM,\\n LIST_ITEM\\n }\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct RLPItem {\\n uint256 length;\\n uint256 ptr;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts bytes to a reference to memory position and length.\\n * @param _in Input bytes to convert.\\n * @return Output memory reference.\\n */\\n function toRLPItem(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem memory\\n )\\n {\\n uint256 ptr;\\n assembly {\\n ptr := add(_in, 32)\\n }\\n\\n return RLPItem({\\n length: _in.length,\\n ptr: ptr\\n });\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n (\\n uint256 listOffset,\\n ,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.LIST_ITEM,\\n \\\"Invalid RLP list value.\\\"\\n );\\n\\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\\n // writing to the length. Since we can't know the number of RLP items without looping over\\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\\n // simply set a reasonable maximum list length and decrease the size before we finish.\\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\\n\\n uint256 itemCount = 0;\\n uint256 offset = listOffset;\\n while (offset < _in.length) {\\n require(\\n itemCount < MAX_LIST_LENGTH,\\n \\\"Provided RLP list exceeds max list length.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n ) = _decodeLength(RLPItem({\\n length: _in.length - offset,\\n ptr: _in.ptr + offset\\n }));\\n\\n out[itemCount] = RLPItem({\\n length: itemLength + itemOffset,\\n ptr: _in.ptr + offset\\n });\\n\\n itemCount += 1;\\n offset += itemOffset + itemLength;\\n }\\n\\n // Decrease the array size to match the actual item count.\\n assembly {\\n mstore(out, itemCount)\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n return readList(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes value.\\\"\\n );\\n\\n return _copy(_in.ptr, itemOffset, itemLength);\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return readBytes(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return string(readBytes(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return readString(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n require(\\n _in.length <= 33,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr + itemOffset;\\n bytes32 out;\\n assembly {\\n out := mload(ptr)\\n\\n // Shift the bytes over to match the item size.\\n if lt(itemLength, 32) {\\n out := div(out, exp(256, sub(32, itemLength)))\\n }\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return readBytes32(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return uint256(readBytes32(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return readUint256(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n require(\\n _in.length == 1,\\n \\\"Invalid RLP boolean value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 out;\\n assembly {\\n out := byte(0, mload(ptr))\\n }\\n\\n require(\\n out == 0 || out == 1,\\n \\\"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\\\"\\n );\\n\\n return out != 0;\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return readBool(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n if (_in.length == 1) {\\n return address(0);\\n }\\n\\n require(\\n _in.length == 21,\\n \\\"Invalid RLP address value.\\\"\\n );\\n\\n return address(readUint256(_in));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return readAddress(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads the raw bytes of an RLP item.\\n * @param _in RLP item to read.\\n * @return Raw RLP bytes.\\n */\\n function readRawBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in);\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Decodes the length of an RLP item.\\n * @param _in RLP item to decode.\\n * @return Offset of the encoded data.\\n * @return Length of the encoded data.\\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\\n */\\n function _decodeLength(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n uint256,\\n uint256,\\n RLPItemType\\n )\\n {\\n require(\\n _in.length > 0,\\n \\\"RLP item cannot be null.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 prefix;\\n assembly {\\n prefix := byte(0, mload(ptr))\\n }\\n\\n if (prefix <= 0x7f) {\\n // Single byte.\\n\\n return (0, 1, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xb7) {\\n // Short string.\\n\\n uint256 strLen = prefix - 0x80;\\n\\n require(\\n _in.length > strLen,\\n \\\"Invalid RLP short string.\\\"\\n );\\n\\n return (1, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xbf) {\\n // Long string.\\n uint256 lenOfStrLen = prefix - 0xb7;\\n\\n require(\\n _in.length > lenOfStrLen,\\n \\\"Invalid RLP long string length.\\\"\\n );\\n\\n uint256 strLen;\\n assembly {\\n // Pick out the string length.\\n strLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfStrLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfStrLen + strLen,\\n \\\"Invalid RLP long string.\\\"\\n );\\n\\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xf7) {\\n // Short list.\\n uint256 listLen = prefix - 0xc0;\\n\\n require(\\n _in.length > listLen,\\n \\\"Invalid RLP short list.\\\"\\n );\\n\\n return (1, listLen, RLPItemType.LIST_ITEM);\\n } else {\\n // Long list.\\n uint256 lenOfListLen = prefix - 0xf7;\\n\\n require(\\n _in.length > lenOfListLen,\\n \\\"Invalid RLP long list length.\\\"\\n );\\n\\n uint256 listLen;\\n assembly {\\n // Pick out the list length.\\n listLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfListLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfListLen + listLen,\\n \\\"Invalid RLP long list.\\\"\\n );\\n\\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\\n }\\n }\\n\\n /**\\n * Copies the bytes from a memory location.\\n * @param _src Pointer to the location to read from.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Copied bytes.\\n */\\n function _copy(\\n uint256 _src,\\n uint256 _offset,\\n uint256 _length\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out = new bytes(_length);\\n if (out.length == 0) {\\n return out;\\n }\\n\\n uint256 src = _src + _offset;\\n uint256 dest;\\n assembly {\\n dest := add(out, 32)\\n }\\n\\n // Copy over as many complete words as we can.\\n for (uint256 i = 0; i < _length / 32; i++) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n\\n src += 32;\\n dest += 32;\\n }\\n\\n // Pick out the remaining bytes.\\n uint256 mask = 256 ** (32 - (_length % 32)) - 1;\\n assembly {\\n mstore(\\n dest,\\n or(\\n and(mload(src), not(mask)),\\n and(mload(dest), mask)\\n )\\n )\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Copies an RLP item into bytes.\\n * @param _in RLP item to copy.\\n * @return Copied bytes.\\n */\\n function _copy(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in.ptr, 0, _in.length);\\n }\\n}\\n\",\"keccak256\":\"0x829174c61216dce35fdb888383b6022e0365eb7fbdc71ad79d98b108091969fe\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPWriter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/**\\n * @title Lib_RLPWriter\\n * @author Bakaoh (with modifications)\\n */\\nlibrary Lib_RLPWriter {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * RLP encodes a byte string.\\n * @param _in The byte string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded;\\n\\n if (_in.length == 1 && uint8(_in[0]) < 128) {\\n encoded = _in;\\n } else {\\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * RLP encodes a list of RLP encoded byte byte strings.\\n * @param _in The list of RLP encoded byte strings.\\n * @return The RLP encoded list of items in bytes.\\n */\\n function writeList(\\n bytes[] memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory list = _flatten(_in);\\n return abi.encodePacked(_writeLength(list.length, 192), list);\\n }\\n\\n /**\\n * RLP encodes a string.\\n * @param _in The string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeString(\\n string memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(bytes(_in));\\n }\\n\\n /**\\n * RLP encodes an address.\\n * @param _in The address to encode.\\n * @return The RLP encoded address in bytes.\\n */\\n function writeAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a bytes32 value.\\n * @param _in The bytes32 to encode.\\n * @return _out The RLP encoded bytes32 in bytes.\\n */\\n function writeBytes32(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a uint.\\n * @param _in The uint256 to encode.\\n * @return The RLP encoded uint256 in bytes.\\n */\\n function writeUint(\\n uint256 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(_toBinary(_in));\\n }\\n\\n /**\\n * RLP encodes a bool.\\n * @param _in The bool to encode.\\n * @return The RLP encoded bool in bytes.\\n */\\n function writeBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded = new bytes(1);\\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\\n return encoded;\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\\n * @param _len The length of the string or the payload.\\n * @param _offset 128 if item is string, 192 if item is list.\\n * @return RLP encoded bytes.\\n */\\n function _writeLength(\\n uint256 _len,\\n uint256 _offset\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded;\\n\\n if (_len < 56) {\\n encoded = new bytes(1);\\n encoded[0] = byte(uint8(_len) + uint8(_offset));\\n } else {\\n uint256 lenLen;\\n uint256 i = 1;\\n while (_len / i != 0) {\\n lenLen++;\\n i *= 256;\\n }\\n\\n encoded = new bytes(lenLen + 1);\\n encoded[0] = byte(uint8(lenLen) + uint8(_offset) + 55);\\n for(i = 1; i <= lenLen; i++) {\\n encoded[i] = byte(uint8((_len / (256**(lenLen-i))) % 256));\\n }\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * Encode integer in big endian binary form with no leading zeroes.\\n * @notice TODO: This should be optimized with assembly to save gas costs.\\n * @param _x The integer to encode.\\n * @return RLP encoded bytes.\\n */\\n function _toBinary(\\n uint256 _x\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory b = abi.encodePacked(_x);\\n\\n uint256 i = 0;\\n for (; i < 32; i++) {\\n if (b[i] != 0) {\\n break;\\n }\\n }\\n\\n bytes memory res = new bytes(32 - i);\\n for (uint256 j = 0; j < res.length; j++) {\\n res[j] = b[i++];\\n }\\n\\n return res;\\n }\\n\\n /**\\n * Copies a piece of memory to another location.\\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\\n * @param _dest Destination location.\\n * @param _src Source location.\\n * @param _len Length of memory to copy.\\n */\\n function _memcpy(\\n uint256 _dest,\\n uint256 _src,\\n uint256 _len\\n )\\n private\\n pure\\n {\\n uint256 dest = _dest;\\n uint256 src = _src;\\n uint256 len = _len;\\n\\n for(; len >= 32; len -= 32) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n dest += 32;\\n src += 32;\\n }\\n\\n uint256 mask = 256 ** (32 - len) - 1;\\n assembly {\\n let srcpart := and(mload(src), not(mask))\\n let destpart := and(mload(dest), mask)\\n mstore(dest, or(destpart, srcpart))\\n }\\n }\\n\\n /**\\n * Flattens a list of byte strings into one byte string.\\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\\n * @param _list List of byte strings to flatten.\\n * @return The flattened byte string.\\n */\\n function _flatten(\\n bytes[] memory _list\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n if (_list.length == 0) {\\n return new bytes(0);\\n }\\n\\n uint256 len;\\n uint256 i = 0;\\n for (; i < _list.length; i++) {\\n len += _list[i].length;\\n }\\n\\n bytes memory flattened = new bytes(len);\\n uint256 flattenedPtr;\\n assembly { flattenedPtr := add(flattened, 0x20) }\\n\\n for(i = 0; i < _list.length; i++) {\\n bytes memory item = _list[i];\\n\\n uint256 listPtr;\\n assembly { listPtr := add(item, 0x20)}\\n\\n _memcpy(flattenedPtr, listPtr, item.length);\\n flattenedPtr += _list[i].length;\\n }\\n\\n return flattened;\\n }\\n}\\n\",\"keccak256\":\"0xb60ee4b03ad372c3deff21d454ab714dd0c18ee3e6f9d45532e209fc59d5a54d\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_Bytes32Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_Byte32Utils\\n */\\nlibrary Lib_Bytes32Utils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \\\"true.\\\"\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as a boolean.\\n */\\n function toBool(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return _in != 0;\\n }\\n\\n /**\\n * Converts a boolean to a bytes32 value.\\n * @param _in Input boolean value.\\n * @return Boolean as a bytes32.\\n */\\n function fromBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in ? 1 : 0));\\n }\\n\\n /**\\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as an address.\\n */\\n function toAddress(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return address(uint160(uint256(_in)));\\n }\\n\\n /**\\n * Converts an address to a bytes32.\\n * @param _in Input address value.\\n * @return Address as a bytes32.\\n */\\n function fromAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in));\\n }\\n\\n /**\\n * Removes the leading zeros from a bytes32 value and returns a new (smaller) bytes value.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 without any leading zeros.\\n */\\n function removeLeadingZeros(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out;\\n\\n assembly {\\n // Figure out how many leading zero bytes to remove.\\n let shift := 0\\n for { let i := 0 } and(lt(i, 32), eq(byte(i, _in), 0)) { i := add(i, 1) } {\\n shift := add(shift, 1)\\n }\\n\\n // Reserve some space for our output and fix the free memory pointer.\\n out := mload(0x40)\\n mstore(0x40, add(out, 0x40))\\n\\n // Shift the value and store it into the output bytes.\\n mstore(add(out, 0x20), shl(mul(shift, 8), _in))\\n\\n // Store the new size (with leading zero bytes removed) in the output byte size.\\n mstore(out, sub(32, shift))\\n }\\n\\n return out;\\n }\\n}\\n\",\"keccak256\":\"0xfa2def593e3fc56a31852c3744aefdaa93cec74e721bfcfeb1e5d166c7c60b64\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_BytesUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_BytesUtils\\n */\\nlibrary Lib_BytesUtils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_start + _length >= _start, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n if (_bytes.length - _start == 0) {\\n return bytes('');\\n }\\n\\n return slice(_bytes, _start, _bytes.length - _start);\\n }\\n\\n function toBytes32PadLeft(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n bytes32 ret;\\n uint256 len = _bytes.length <= 32 ? _bytes.length : 32;\\n assembly {\\n ret := shr(mul(sub(32, len), 8), mload(add(_bytes, 32)))\\n }\\n return ret;\\n }\\n\\n function toBytes32(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n if (_bytes.length < 32) {\\n bytes32 ret;\\n assembly {\\n ret := mload(add(_bytes, 32))\\n }\\n return ret;\\n }\\n\\n return abi.decode(_bytes,(bytes32)); // will truncate if input length > 32 bytes\\n }\\n\\n function toUint256(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return uint256(toBytes32(_bytes));\\n }\\n\\n function toUint24(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n uint24\\n )\\n {\\n require(_start + 3 >= _start, \\\"toUint24_overflow\\\");\\n require(_bytes.length >= _start + 3 , \\\"toUint24_outOfBounds\\\");\\n uint24 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x3), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toUint8(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n uint8\\n )\\n {\\n require(_start + 1 >= _start, \\\"toUint8_overflow\\\");\\n require(_bytes.length >= _start + 1 , \\\"toUint8_outOfBounds\\\");\\n uint8 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x1), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toAddress(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n require(_start + 20 >= _start, \\\"toAddress_overflow\\\");\\n require(_bytes.length >= _start + 20, \\\"toAddress_outOfBounds\\\");\\n address tempAddress;\\n\\n assembly {\\n tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000)\\n }\\n\\n return tempAddress;\\n }\\n\\n function toNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory nibbles = new bytes(_bytes.length * 2);\\n\\n for (uint256 i = 0; i < _bytes.length; i++) {\\n nibbles[i * 2] = _bytes[i] >> 4;\\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\\n }\\n\\n return nibbles;\\n }\\n\\n function fromNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory ret = new bytes(_bytes.length / 2);\\n\\n for (uint256 i = 0; i < ret.length; i++) {\\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\\n }\\n\\n return ret;\\n }\\n\\n function equal(\\n bytes memory _bytes,\\n bytes memory _other\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return keccak256(_bytes) == keccak256(_other);\\n }\\n}\\n\",\"keccak256\":\"0xa5195afe32fb2cf104d156e8f4bd39df1ec79bf6ba232097b9e8e0ee14fbc298\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_MerkleTree.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_MerkleTree\\n * @author River Keefer\\n */\\nlibrary Lib_MerkleTree {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Calculates a merkle root for a list of 32-byte leaf hashes. WARNING: If the number\\n * of leaves passed in is not a power of two, it pads out the tree with zero hashes.\\n * If you do not know the original length of elements for the tree you are verifying,\\n * then this may allow empty leaves past _elements.length to pass a verification check down the line.\\n * Note that the _elements argument is modified, therefore it must not be used again afterwards\\n * @param _elements Array of hashes from which to generate a merkle root.\\n * @return Merkle root of the leaves, with zero hashes for non-powers-of-two (see above).\\n */\\n function getMerkleRoot(\\n bytes32[] memory _elements\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n require(\\n _elements.length > 0,\\n \\\"Lib_MerkleTree: Must provide at least one leaf hash.\\\"\\n );\\n\\n if (_elements.length == 1) {\\n return _elements[0];\\n }\\n\\n uint256[16] memory defaults = [\\n 0x290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563,\\n 0x633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d,\\n 0x890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d,\\n 0x3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd8,\\n 0xecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da,\\n 0xdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da5,\\n 0x617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d7,\\n 0x292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead,\\n 0xe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e10,\\n 0x7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f82,\\n 0xe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e83636516,\\n 0x3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c,\\n 0xad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e,\\n 0xa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab,\\n 0x4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c862,\\n 0x2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf10\\n ];\\n\\n // Reserve memory space for our hashes.\\n bytes memory buf = new bytes(64);\\n\\n // We'll need to keep track of left and right siblings.\\n bytes32 leftSibling;\\n bytes32 rightSibling;\\n\\n // Number of non-empty nodes at the current depth.\\n uint256 rowSize = _elements.length;\\n\\n // Current depth, counting from 0 at the leaves\\n uint256 depth = 0;\\n\\n // Common sub-expressions\\n uint256 halfRowSize; // rowSize / 2\\n bool rowSizeIsOdd; // rowSize % 2 == 1\\n\\n while (rowSize > 1) {\\n halfRowSize = rowSize / 2;\\n rowSizeIsOdd = rowSize % 2 == 1;\\n\\n for (uint256 i = 0; i < halfRowSize; i++) {\\n leftSibling = _elements[(2 * i) ];\\n rightSibling = _elements[(2 * i) + 1];\\n assembly {\\n mstore(add(buf, 32), leftSibling )\\n mstore(add(buf, 64), rightSibling)\\n }\\n\\n _elements[i] = keccak256(buf);\\n }\\n\\n if (rowSizeIsOdd) {\\n leftSibling = _elements[rowSize - 1];\\n rightSibling = bytes32(defaults[depth]);\\n assembly {\\n mstore(add(buf, 32), leftSibling)\\n mstore(add(buf, 64), rightSibling)\\n }\\n\\n _elements[halfRowSize] = keccak256(buf);\\n }\\n\\n rowSize = halfRowSize + (rowSizeIsOdd ? 1 : 0);\\n depth++;\\n }\\n\\n return _elements[0];\\n }\\n\\n /**\\n * Verifies a merkle branch for the given leaf hash. Assumes the original length\\n * of leaves generated is a known, correct input, and does not return true for indices\\n * extending past that index (even if _siblings would be otherwise valid.)\\n * @param _root The Merkle root to verify against.\\n * @param _leaf The leaf hash to verify inclusion of.\\n * @param _index The index in the tree of this leaf.\\n * @param _siblings Array of sibline nodes in the inclusion proof, starting from depth 0 (bottom of the tree).\\n * @param _totalLeaves The total number of leaves originally passed into.\\n * @return Whether or not the merkle branch and leaf passes verification.\\n */\\n function verify(\\n bytes32 _root,\\n bytes32 _leaf,\\n uint256 _index,\\n bytes32[] memory _siblings,\\n uint256 _totalLeaves\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n require(\\n _totalLeaves > 0,\\n \\\"Lib_MerkleTree: Total leaves must be greater than zero.\\\"\\n );\\n\\n require(\\n _index < _totalLeaves,\\n \\\"Lib_MerkleTree: Index out of bounds.\\\"\\n );\\n\\n require(\\n _siblings.length == _ceilLog2(_totalLeaves),\\n \\\"Lib_MerkleTree: Total siblings does not correctly correspond to total leaves.\\\"\\n );\\n\\n bytes32 computedRoot = _leaf;\\n\\n for (uint256 i = 0; i < _siblings.length; i++) {\\n if ((_index & 1) == 1) {\\n computedRoot = keccak256(\\n abi.encodePacked(\\n _siblings[i],\\n computedRoot\\n )\\n );\\n } else {\\n computedRoot = keccak256(\\n abi.encodePacked(\\n computedRoot,\\n _siblings[i]\\n )\\n );\\n }\\n\\n _index >>= 1;\\n }\\n\\n return _root == computedRoot;\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Calculates the integer ceiling of the log base 2 of an input.\\n * @param _in Unsigned input to calculate the log.\\n * @return ceil(log_base_2(_in))\\n */\\n function _ceilLog2(\\n uint256 _in\\n )\\n private\\n pure\\n returns (\\n uint256\\n )\\n {\\n require(\\n _in > 0,\\n \\\"Lib_MerkleTree: Cannot compute ceil(log_2) of 0.\\\"\\n );\\n\\n if (_in == 1) {\\n return 0;\\n }\\n\\n // Find the highest set bit (will be floor(log_2)).\\n // Borrowed with <3 from https://github.com/ethereum/solidity-examples\\n uint256 val = _in;\\n uint256 highest = 0;\\n for (uint256 i = 128; i >= 1; i >>= 1) {\\n if (val & (uint(1) << i) - 1 << i != 0) {\\n highest += i;\\n val >>= i;\\n }\\n }\\n\\n // Increment by one if this is not a perfect logarithm.\\n if ((uint(1) << highest) != _in) {\\n highest += 1;\\n }\\n\\n return highest;\\n }\\n}\\n\",\"keccak256\":\"0xa78edb9fbd34712771a1ebff05bc5e1abec7fc1e9a1bfb709d183099b44fa62a\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x608060405234801561001057600080fd5b50604051611bee380380611bee83398101604081905261002f9161005b565b600080546001600160a01b0319166001600160a01b03949094169390931790925560015560025561009c565b60008060006060848603121561006f578283fd5b83516001600160a01b0381168114610085578384fd5b602085015160409095015190969495509392505050565b611b43806100ab6000396000f3fe608060405234801561001057600080fd5b50600436106100b45760003560e01c80638ca5cbb9116100715780638ca5cbb91461012f5780639418bddd14610144578063b8e189ac14610157578063c17b291b1461016a578063cfdf677e14610172578063e561dddc1461017a576100b4565b8063299ca478146100b9578063461a4478146100d75780634d69ee57146100ea5780637aa63a861461010a5780637ad168a01461011f57806381eb62ef14610127575b600080fd5b6100c1610182565b6040516100ce919061159f565b60405180910390f35b6100c16100e53660046114e3565b610191565b6100fd6100f8366004611431565b61026f565b6040516100ce91906115b3565b6101126102e2565b6040516100ce91906115be565b6101126102fb565b610112610314565b61014261013d366004611390565b61031a565b005b6100fd610152366004611531565b61052e565b610142610165366004611531565b61057e565b610112610636565b6100c161063c565b610112610664565b6000546001600160a01b031681565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b838110156101f15781810151838201526020016101d9565b50505050905090810190601f16801561021e5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561023b57600080fd5b505afa15801561024f573d6000803e3d6000fd5b505050506040513d602081101561026557600080fd5b505190505b919050565b600061027a836106de565b61029f5760405162461bcd60e51b815260040161029690611749565b60405180910390fd5b6102bc836020015185846000015185602001518760400151610776565b6102d85760405162461bcd60e51b8152600401610296906116b5565b5060019392505050565b6000806102ed6108fb565b5064ffffffffff1691505090565b6000806103066108fb565b64ffffffffff169250505090565b60025481565b6103226102e2565b81146103405760405162461bcd60e51b8152600401610296906116ec565b6103706040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b815250610191565b6001600160a01b03166302ad4d2a336040518263ffffffff1660e01b815260040161039b919061159f565b60206040518083038186803b1580156103b357600080fd5b505afa1580156103c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103eb91906113d3565b6104075760405162461bcd60e51b8152600401610296906118bb565b60008251116104285760405162461bcd60e51b815260040161029690611878565b6104666040518060400160405280601d81526020017f4f564d5f43616e6f6e6963616c5472616e73616374696f6e436861696e000000815250610191565b6001600160a01b0316637aa63a866040518163ffffffff1660e01b815260040160206040518083038186803b15801561049e57600080fd5b505afa1580156104b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104d69190611419565b82516104e06102e2565b0111156104ff5760405162461bcd60e51b815260040161029690611646565b61052a8242336040516020016105169291906119a1565b604051602081830303815290604052610990565b5050565b60008082608001518060200190518101906105499190611564565b509050806105695760405162461bcd60e51b815260040161029690611833565b4261057682600154610b31565b119392505050565b6105b06040518060400160405280601181526020017027ab26afa33930bab22b32b934b334b2b960791b815250610191565b6001600160a01b0316336001600160a01b0316146105e05760405162461bcd60e51b8152600401610296906117d6565b6105e9816106de565b6106055760405162461bcd60e51b815260040161029690611749565b61060e8161052e565b61062a5760405162461bcd60e51b815260040161029690611778565b61063381610b92565b50565b60015481565b600061065f604051806060016040528060258152602001611ab560259139610191565b905090565b600061066e61063c565b6001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b1580156106a657600080fd5b505afa1580156106ba573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061065f9190611419565b60006106e861063c565b8251604051634a83e9cd60e11b81526001600160a01b039290921691639507d39a91610716916004016115be565b60206040518083038186803b15801561072e57600080fd5b505afa158015610742573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107669190611419565b61076f83610d0a565b1492915050565b60008082116107b65760405162461bcd60e51b8152600401808060200182810382526037815260200180611a316037913960400191505060405180910390fd5b8184106107f45760405162461bcd60e51b81526004018080602001828103825260248152602001806119dd6024913960400191505060405180910390fd5b6107fd82610d50565b83511461083b5760405162461bcd60e51b815260040180806020018281038252604d815260200180611a68604d913960600191505060405180910390fd5b8460005b84518110156108ee57856001166001141561089d5784818151811061086057fe5b60200260200101518260405160200180838152602001828152602001925050506040516020818303038152906040528051906020012091506108e2565b818582815181106108aa57fe5b602002602001015160405160200180838152602001828152602001925050506040516020818303038152906040528051906020012091505b600195861c950161083f565b5090951495945050505050565b600080600061090861063c565b6001600160a01b031663ccf8f9696040518163ffffffff1660e01b815260040160206040518083038186803b15801561094057600080fd5b505afa158015610954573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061097891906113f3565b64ffffffffff602882901c16935060501c9150509091565b60006109bf6040518060400160405280600c81526020016b27ab26afa83937b837b9b2b960a11b815250610191565b90506000806109cc6108fb565b9092509050336001600160a01b03841614156109e9575042610a13565b426002548264ffffffffff160110610a135760405162461bcd60e51b81526004016102969061190a565b60006040518060a00160405280610a28610664565b8152602001610a3688610de6565b8152602001875181526020018464ffffffffff16815260200186815250905080600001517f16be4c5129a4e03cf3350262e181dc02ddfb4a6008d925368c0899fcd97ca9c58260200151836040015184606001518560800151604051610a9f94939291906115dd565b60405180910390a2610aaf61063c565b6001600160a01b0316632015276c610ac683610d0a565b610ada84604001518560600151018661121a565b6040518363ffffffff1660e01b8152600401610af79291906115c7565b600060405180830381600087803b158015610b1157600080fd5b505af1158015610b25573d6000803e3d6000fd5b50505050505050505050565b600082820183811015610b8b576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b610b9a61063c565b6001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b158015610bd257600080fd5b505afa158015610be6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c0a9190611419565b815110610c295760405162461bcd60e51b815260040161029690611973565b610c32816106de565b610c4e5760405162461bcd60e51b815260040161029690611749565b610c5661063c565b6001600160a01b031663167fd6818260000151610c788460600151600061121a565b6040518363ffffffff1660e01b8152600401610c959291906115c7565b600060405180830381600087803b158015610caf57600080fd5b505af1158015610cc3573d6000803e3d6000fd5b5050505080600001517f8747b69ce8fdb31c3b9b0a67bd8049ad8c1a69ea417b69b12174068abd9cbd648260200151604051610cff91906115be565b60405180910390a250565b60008160200151826040015183606001518460800151604051602001610d3394939291906115dd565b604051602081830303815290604052805190602001209050919050565b6000808211610d905760405162461bcd60e51b8152600401808060200182810382526030815260200180611a016030913960400191505060405180910390fd5b8160011415610da15750600061026a565b81600060805b60018110610dd1576000196001821b01811b831615610dc95791821c91908101905b60011c610da7565b506001811b8414610b8b576001019392505050565b600080825111610e275760405162461bcd60e51b8152600401808060200182810382526034815260200180611ada6034913960400191505060405180910390fd5b815160011415610e4d5781600081518110610e3e57fe5b6020026020010151905061026a565b60408051610200810182527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56381527f633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d60208201527f890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d818301527f3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd86060808301919091527fecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da60808301527fdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da560a08301527f617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d760c08301527f292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead60e08301527fe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e106101008301527f7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f826101208301527fe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e836365166101408301527f3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c6101608301527fad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e6101808301527fa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab6101a08301527f4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c8626101c08301527f2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf106101e083015282518381529081018352909160009190602082018180368337505085519192506000918291508180805b60018411156111f65750506002820460018084161460005b82811015611172578a816002028151811061111957fe5b602002602001015196508a816002026001018151811061113557fe5b6020026020010151955086602089015285604089015287805190602001208b828151811061115f57fe5b6020908102919091010152600101611102565b5080156111d55789600185038151811061118857fe5b6020026020010151955087836010811061119e57fe5b602002015160001b945085602088015284604088015286805190602001208a83815181106111c857fe5b6020026020010181815250505b806111e15760006111e4565b60015b60ff16820193506001909201916110ea565b8960008151811061120357fe5b602002602001015198505050505050505050919050565b602890811b91909117901b90565b600067ffffffffffffffff83111561123c57fe5b61124f601f8401601f19166020016119b8565b905082815283838301111561126357600080fd5b828260208301376000602084830101529392505050565b600082601f83011261128a578081fd5b8135602067ffffffffffffffff8211156112a057fe5b8082026112ae8282016119b8565b8381528281019086840183880185018910156112c8578687fd5b8693505b858410156112ea5780358352600193909301929184019184016112cc565b50979650505050505050565b600060a08284031215611307578081fd5b60405160a0810167ffffffffffffffff828210818311171561132557fe5b8160405282935084358352602085013560208401526040850135604084015260608501356060840152608085013591508082111561136257600080fd5b508301601f8101851361137457600080fd5b61138385823560208401611228565b6080830152505092915050565b600080604083850312156113a2578182fd5b823567ffffffffffffffff8111156113b8578283fd5b6113c48582860161127a565b95602094909401359450505050565b6000602082840312156113e4578081fd5b81518015158114610b8b578182fd5b600060208284031215611404578081fd5b815164ffffffffff1981168114610b8b578182fd5b60006020828403121561142a578081fd5b5051919050565b600080600060608486031215611445578081fd5b83359250602084013567ffffffffffffffff80821115611463578283fd5b61146f878388016112f6565b93506040860135915080821115611484578283fd5b9085019060408288031215611497578283fd5b6040516040810181811083821117156114ac57fe5b604052823581526020830135828111156114c4578485fd5b6114d08982860161127a565b6020830152508093505050509250925092565b6000602082840312156114f4578081fd5b813567ffffffffffffffff81111561150a578182fd5b8201601f8101841361151a578182fd5b61152984823560208401611228565b949350505050565b600060208284031215611542578081fd5b813567ffffffffffffffff811115611558578182fd5b611529848285016112f6565b60008060408385031215611576578182fd5b825160208401519092506001600160a01b0381168114611594578182fd5b809150509250929050565b6001600160a01b0391909116815260200190565b901515815260200190565b90815260200190565b91825264ffffffffff1916602082015260400190565b600085825260208581840152846040840152608060608401528351806080850152825b8181101561161c5785810183015185820160a001528201611600565b8181111561162d578360a083870101525b50601f01601f19169290920160a0019695505050505050565b60208082526049908201527f4e756d626572206f6620737461746520726f6f74732063616e6e6f742065786360408201527f65656420746865206e756d626572206f662063616e6f6e6963616c207472616e60608201526839b0b1ba34b7b7399760b91b608082015260a00190565b60208082526018908201527f496e76616c696420696e636c7573696f6e2070726f6f662e0000000000000000604082015260600190565b6020808252603d908201527f41637475616c20626174636820737461727420696e64657820646f6573206e6f60408201527f74206d6174636820657870656374656420737461727420696e6465782e000000606082015260800190565b60208082526015908201527424b73b30b634b2103130ba31b4103432b0b232b91760591b604082015260600190565b602080825260409082018190527f537461746520626174636865732063616e206f6e6c792062652064656c657465908201527f642077697468696e207468652066726175642070726f6f662077696e646f772e606082015260800190565b6020808252603b908201527f537461746520626174636865732063616e206f6e6c792062652064656c65746560408201527f6420627920746865204f564d5f467261756456657269666965722e0000000000606082015260800190565b60208082526025908201527f4261746368206865616465722074696d657374616d702063616e6e6f74206265604082015264207a65726f60d81b606082015260800190565b60208082526023908201527f43616e6e6f74207375626d697420616e20656d7074792073746174652062617460408201526231b41760e91b606082015260800190565b6020808252602f908201527f50726f706f73657220646f6573206e6f74206861766520656e6f75676820636f60408201526e1b1b185d195c985b081c1bdcdd1959608a1b606082015260800190565b60208082526043908201527f43616e6e6f74207075626c69736820737461746520726f6f747320776974686960408201527f6e207468652073657175656e636572207075626c69636174696f6e2077696e6460608201526237bb9760e91b608082015260a00190565b60208082526014908201527324b73b30b634b2103130ba31b41034b73232bc1760611b604082015260600190565b9182526001600160a01b0316602082015260400190565b60405181810167ffffffffffffffff811182821017156119d457fe5b60405291905056fe4c69625f4d65726b6c65547265653a20496e646578206f7574206f6620626f756e64732e4c69625f4d65726b6c65547265653a2043616e6e6f7420636f6d70757465206365696c286c6f675f3229206f6620302e4c69625f4d65726b6c65547265653a20546f74616c206c6561766573206d7573742062652067726561746572207468616e207a65726f2e4c69625f4d65726b6c65547265653a20546f74616c207369626c696e677320646f6573206e6f7420636f72726563746c7920636f72726573706f6e6420746f20746f74616c206c65617665732e4f564d5f436861696e53746f72616765436f6e7461696e65723a5343433a626174636865734c69625f4d65726b6c65547265653a204d7573742070726f76696465206174206c65617374206f6e65206c65616620686173682ea26469706673582212209a79aee928c48a8e868127cc94d1fe1eb4eea95e98e6709cd65bda19d650209064736f6c63430007060033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100b45760003560e01c80638ca5cbb9116100715780638ca5cbb91461012f5780639418bddd14610144578063b8e189ac14610157578063c17b291b1461016a578063cfdf677e14610172578063e561dddc1461017a576100b4565b8063299ca478146100b9578063461a4478146100d75780634d69ee57146100ea5780637aa63a861461010a5780637ad168a01461011f57806381eb62ef14610127575b600080fd5b6100c1610182565b6040516100ce919061159f565b60405180910390f35b6100c16100e53660046114e3565b610191565b6100fd6100f8366004611431565b61026f565b6040516100ce91906115b3565b6101126102e2565b6040516100ce91906115be565b6101126102fb565b610112610314565b61014261013d366004611390565b61031a565b005b6100fd610152366004611531565b61052e565b610142610165366004611531565b61057e565b610112610636565b6100c161063c565b610112610664565b6000546001600160a01b031681565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b838110156101f15781810151838201526020016101d9565b50505050905090810190601f16801561021e5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561023b57600080fd5b505afa15801561024f573d6000803e3d6000fd5b505050506040513d602081101561026557600080fd5b505190505b919050565b600061027a836106de565b61029f5760405162461bcd60e51b815260040161029690611749565b60405180910390fd5b6102bc836020015185846000015185602001518760400151610776565b6102d85760405162461bcd60e51b8152600401610296906116b5565b5060019392505050565b6000806102ed6108fb565b5064ffffffffff1691505090565b6000806103066108fb565b64ffffffffff169250505090565b60025481565b6103226102e2565b81146103405760405162461bcd60e51b8152600401610296906116ec565b6103706040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b815250610191565b6001600160a01b03166302ad4d2a336040518263ffffffff1660e01b815260040161039b919061159f565b60206040518083038186803b1580156103b357600080fd5b505afa1580156103c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103eb91906113d3565b6104075760405162461bcd60e51b8152600401610296906118bb565b60008251116104285760405162461bcd60e51b815260040161029690611878565b6104666040518060400160405280601d81526020017f4f564d5f43616e6f6e6963616c5472616e73616374696f6e436861696e000000815250610191565b6001600160a01b0316637aa63a866040518163ffffffff1660e01b815260040160206040518083038186803b15801561049e57600080fd5b505afa1580156104b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104d69190611419565b82516104e06102e2565b0111156104ff5760405162461bcd60e51b815260040161029690611646565b61052a8242336040516020016105169291906119a1565b604051602081830303815290604052610990565b5050565b60008082608001518060200190518101906105499190611564565b509050806105695760405162461bcd60e51b815260040161029690611833565b4261057682600154610b31565b119392505050565b6105b06040518060400160405280601181526020017027ab26afa33930bab22b32b934b334b2b960791b815250610191565b6001600160a01b0316336001600160a01b0316146105e05760405162461bcd60e51b8152600401610296906117d6565b6105e9816106de565b6106055760405162461bcd60e51b815260040161029690611749565b61060e8161052e565b61062a5760405162461bcd60e51b815260040161029690611778565b61063381610b92565b50565b60015481565b600061065f604051806060016040528060258152602001611ab560259139610191565b905090565b600061066e61063c565b6001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b1580156106a657600080fd5b505afa1580156106ba573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061065f9190611419565b60006106e861063c565b8251604051634a83e9cd60e11b81526001600160a01b039290921691639507d39a91610716916004016115be565b60206040518083038186803b15801561072e57600080fd5b505afa158015610742573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107669190611419565b61076f83610d0a565b1492915050565b60008082116107b65760405162461bcd60e51b8152600401808060200182810382526037815260200180611a316037913960400191505060405180910390fd5b8184106107f45760405162461bcd60e51b81526004018080602001828103825260248152602001806119dd6024913960400191505060405180910390fd5b6107fd82610d50565b83511461083b5760405162461bcd60e51b815260040180806020018281038252604d815260200180611a68604d913960600191505060405180910390fd5b8460005b84518110156108ee57856001166001141561089d5784818151811061086057fe5b60200260200101518260405160200180838152602001828152602001925050506040516020818303038152906040528051906020012091506108e2565b818582815181106108aa57fe5b602002602001015160405160200180838152602001828152602001925050506040516020818303038152906040528051906020012091505b600195861c950161083f565b5090951495945050505050565b600080600061090861063c565b6001600160a01b031663ccf8f9696040518163ffffffff1660e01b815260040160206040518083038186803b15801561094057600080fd5b505afa158015610954573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061097891906113f3565b64ffffffffff602882901c16935060501c9150509091565b60006109bf6040518060400160405280600c81526020016b27ab26afa83937b837b9b2b960a11b815250610191565b90506000806109cc6108fb565b9092509050336001600160a01b03841614156109e9575042610a13565b426002548264ffffffffff160110610a135760405162461bcd60e51b81526004016102969061190a565b60006040518060a00160405280610a28610664565b8152602001610a3688610de6565b8152602001875181526020018464ffffffffff16815260200186815250905080600001517f16be4c5129a4e03cf3350262e181dc02ddfb4a6008d925368c0899fcd97ca9c58260200151836040015184606001518560800151604051610a9f94939291906115dd565b60405180910390a2610aaf61063c565b6001600160a01b0316632015276c610ac683610d0a565b610ada84604001518560600151018661121a565b6040518363ffffffff1660e01b8152600401610af79291906115c7565b600060405180830381600087803b158015610b1157600080fd5b505af1158015610b25573d6000803e3d6000fd5b50505050505050505050565b600082820183811015610b8b576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b610b9a61063c565b6001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b158015610bd257600080fd5b505afa158015610be6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c0a9190611419565b815110610c295760405162461bcd60e51b815260040161029690611973565b610c32816106de565b610c4e5760405162461bcd60e51b815260040161029690611749565b610c5661063c565b6001600160a01b031663167fd6818260000151610c788460600151600061121a565b6040518363ffffffff1660e01b8152600401610c959291906115c7565b600060405180830381600087803b158015610caf57600080fd5b505af1158015610cc3573d6000803e3d6000fd5b5050505080600001517f8747b69ce8fdb31c3b9b0a67bd8049ad8c1a69ea417b69b12174068abd9cbd648260200151604051610cff91906115be565b60405180910390a250565b60008160200151826040015183606001518460800151604051602001610d3394939291906115dd565b604051602081830303815290604052805190602001209050919050565b6000808211610d905760405162461bcd60e51b8152600401808060200182810382526030815260200180611a016030913960400191505060405180910390fd5b8160011415610da15750600061026a565b81600060805b60018110610dd1576000196001821b01811b831615610dc95791821c91908101905b60011c610da7565b506001811b8414610b8b576001019392505050565b600080825111610e275760405162461bcd60e51b8152600401808060200182810382526034815260200180611ada6034913960400191505060405180910390fd5b815160011415610e4d5781600081518110610e3e57fe5b6020026020010151905061026a565b60408051610200810182527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56381527f633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d60208201527f890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d818301527f3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd86060808301919091527fecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da60808301527fdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da560a08301527f617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d760c08301527f292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead60e08301527fe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e106101008301527f7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f826101208301527fe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e836365166101408301527f3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c6101608301527fad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e6101808301527fa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab6101a08301527f4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c8626101c08301527f2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf106101e083015282518381529081018352909160009190602082018180368337505085519192506000918291508180805b60018411156111f65750506002820460018084161460005b82811015611172578a816002028151811061111957fe5b602002602001015196508a816002026001018151811061113557fe5b6020026020010151955086602089015285604089015287805190602001208b828151811061115f57fe5b6020908102919091010152600101611102565b5080156111d55789600185038151811061118857fe5b6020026020010151955087836010811061119e57fe5b602002015160001b945085602088015284604088015286805190602001208a83815181106111c857fe5b6020026020010181815250505b806111e15760006111e4565b60015b60ff16820193506001909201916110ea565b8960008151811061120357fe5b602002602001015198505050505050505050919050565b602890811b91909117901b90565b600067ffffffffffffffff83111561123c57fe5b61124f601f8401601f19166020016119b8565b905082815283838301111561126357600080fd5b828260208301376000602084830101529392505050565b600082601f83011261128a578081fd5b8135602067ffffffffffffffff8211156112a057fe5b8082026112ae8282016119b8565b8381528281019086840183880185018910156112c8578687fd5b8693505b858410156112ea5780358352600193909301929184019184016112cc565b50979650505050505050565b600060a08284031215611307578081fd5b60405160a0810167ffffffffffffffff828210818311171561132557fe5b8160405282935084358352602085013560208401526040850135604084015260608501356060840152608085013591508082111561136257600080fd5b508301601f8101851361137457600080fd5b61138385823560208401611228565b6080830152505092915050565b600080604083850312156113a2578182fd5b823567ffffffffffffffff8111156113b8578283fd5b6113c48582860161127a565b95602094909401359450505050565b6000602082840312156113e4578081fd5b81518015158114610b8b578182fd5b600060208284031215611404578081fd5b815164ffffffffff1981168114610b8b578182fd5b60006020828403121561142a578081fd5b5051919050565b600080600060608486031215611445578081fd5b83359250602084013567ffffffffffffffff80821115611463578283fd5b61146f878388016112f6565b93506040860135915080821115611484578283fd5b9085019060408288031215611497578283fd5b6040516040810181811083821117156114ac57fe5b604052823581526020830135828111156114c4578485fd5b6114d08982860161127a565b6020830152508093505050509250925092565b6000602082840312156114f4578081fd5b813567ffffffffffffffff81111561150a578182fd5b8201601f8101841361151a578182fd5b61152984823560208401611228565b949350505050565b600060208284031215611542578081fd5b813567ffffffffffffffff811115611558578182fd5b611529848285016112f6565b60008060408385031215611576578182fd5b825160208401519092506001600160a01b0381168114611594578182fd5b809150509250929050565b6001600160a01b0391909116815260200190565b901515815260200190565b90815260200190565b91825264ffffffffff1916602082015260400190565b600085825260208581840152846040840152608060608401528351806080850152825b8181101561161c5785810183015185820160a001528201611600565b8181111561162d578360a083870101525b50601f01601f19169290920160a0019695505050505050565b60208082526049908201527f4e756d626572206f6620737461746520726f6f74732063616e6e6f742065786360408201527f65656420746865206e756d626572206f662063616e6f6e6963616c207472616e60608201526839b0b1ba34b7b7399760b91b608082015260a00190565b60208082526018908201527f496e76616c696420696e636c7573696f6e2070726f6f662e0000000000000000604082015260600190565b6020808252603d908201527f41637475616c20626174636820737461727420696e64657820646f6573206e6f60408201527f74206d6174636820657870656374656420737461727420696e6465782e000000606082015260800190565b60208082526015908201527424b73b30b634b2103130ba31b4103432b0b232b91760591b604082015260600190565b602080825260409082018190527f537461746520626174636865732063616e206f6e6c792062652064656c657465908201527f642077697468696e207468652066726175642070726f6f662077696e646f772e606082015260800190565b6020808252603b908201527f537461746520626174636865732063616e206f6e6c792062652064656c65746560408201527f6420627920746865204f564d5f467261756456657269666965722e0000000000606082015260800190565b60208082526025908201527f4261746368206865616465722074696d657374616d702063616e6e6f74206265604082015264207a65726f60d81b606082015260800190565b60208082526023908201527f43616e6e6f74207375626d697420616e20656d7074792073746174652062617460408201526231b41760e91b606082015260800190565b6020808252602f908201527f50726f706f73657220646f6573206e6f74206861766520656e6f75676820636f60408201526e1b1b185d195c985b081c1bdcdd1959608a1b606082015260800190565b60208082526043908201527f43616e6e6f74207075626c69736820737461746520726f6f747320776974686960408201527f6e207468652073657175656e636572207075626c69636174696f6e2077696e6460608201526237bb9760e91b608082015260a00190565b60208082526014908201527324b73b30b634b2103130ba31b41034b73232bc1760611b604082015260600190565b9182526001600160a01b0316602082015260400190565b60405181810167ffffffffffffffff811182821017156119d457fe5b60405291905056fe4c69625f4d65726b6c65547265653a20496e646578206f7574206f6620626f756e64732e4c69625f4d65726b6c65547265653a2043616e6e6f7420636f6d70757465206365696c286c6f675f3229206f6620302e4c69625f4d65726b6c65547265653a20546f74616c206c6561766573206d7573742062652067726561746572207468616e207a65726f2e4c69625f4d65726b6c65547265653a20546f74616c207369626c696e677320646f6573206e6f7420636f72726563746c7920636f72726573706f6e6420746f20746f74616c206c65617665732e4f564d5f436861696e53746f72616765436f6e7461696e65723a5343433a626174636865734c69625f4d65726b6c65547265653a204d7573742070726f76696465206174206c65617374206f6e65206c65616620686173682ea26469706673582212209a79aee928c48a8e868127cc94d1fe1eb4eea95e98e6709cd65bda19d650209064736f6c63430007060033", + "devdoc": { + "details": "The State Commitment Chain (SCC) contract contains a list of proposed state roots which Proposers assert to be a result of each transaction in the Canonical Transaction Chain (CTC). Elements here have a 1:1 correspondence with transactions in the CTC, and should be the unique state root calculated off-chain by applying the canonical transactions one by one. Compiler used: solc Runtime target: EVM", + "kind": "dev", + "methods": { + "appendStateBatch(bytes32[],uint256)": { + "params": { + "_batch": "Batch of state roots.", + "_shouldStartAtElement": "Index of the element at which this batch should start." + } + }, + "batches()": { + "returns": { + "_0": "Reference to the batch storage container." + } + }, + "constructor": { + "params": { + "_libAddressManager": "Address of the Address Manager." + } + }, + "deleteStateBatch((uint256,bytes32,uint256,uint256,bytes))": { + "params": { + "_batchHeader": "Header of the batch to start deleting from." + } + }, + "getLastSequencerTimestamp()": { + "returns": { + "_lastSequencerTimestamp": "Last sequencer batch timestamp." + } + }, + "getTotalBatches()": { + "returns": { + "_totalBatches": "Total submitted batches." + } + }, + "getTotalElements()": { + "returns": { + "_totalElements": "Total submitted elements." + } + }, + "insideFraudProofWindow((uint256,bytes32,uint256,uint256,bytes))": { + "params": { + "_batchHeader": "Header of the batch to check." + }, + "returns": { + "_inside": "Whether or not the batch is inside the fraud proof window." + } + }, + "resolve(string)": { + "params": { + "_name": "Name to resolve an address for." + }, + "returns": { + "_0": "Address associated with the given name." + } + }, + "verifyStateCommitment(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))": { + "params": { + "_batchHeader": "Header of the batch in which the element was included.", + "_element": "Hash of the element to verify a proof for.", + "_proof": "Merkle inclusion proof for the element." + } + } + }, + "title": "OVM_StateCommitmentChain", + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": { + "appendStateBatch(bytes32[],uint256)": { + "notice": "Appends a batch of state roots to the chain." + }, + "batches()": { + "notice": "Accesses the batch storage container." + }, + "deleteStateBatch((uint256,bytes32,uint256,uint256,bytes))": { + "notice": "Deletes all state roots after (and including) a given batch." + }, + "getLastSequencerTimestamp()": { + "notice": "Retrieves the timestamp of the last batch submitted by the sequencer." + }, + "getTotalBatches()": { + "notice": "Retrieves the total number of batches submitted." + }, + "getTotalElements()": { + "notice": "Retrieves the total number of elements submitted." + }, + "insideFraudProofWindow((uint256,bytes32,uint256,uint256,bytes))": { + "notice": "Checks whether a given batch is still inside its fraud proof window." + }, + "resolve(string)": { + "notice": "Resolves the address associated with a given name." + }, + "verifyStateCommitment(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))": { + "notice": "Verifies a batch inclusion proof." + } + }, + "version": 1 + }, + "storageLayout": { + "storage": [ + { + "astId": 12800, + "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_StateCommitmentChain.sol:OVM_StateCommitmentChain", + "label": "libAddressManager", + "offset": 0, + "slot": "0", + "type": "t_contract(Lib_AddressManager)12793" + }, + { + "astId": 4678, + "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_StateCommitmentChain.sol:OVM_StateCommitmentChain", + "label": "FRAUD_PROOF_WINDOW", + "offset": 0, + "slot": "1", + "type": "t_uint256" + }, + { + "astId": 4680, + "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_StateCommitmentChain.sol:OVM_StateCommitmentChain", + "label": "SEQUENCER_PUBLISH_WINDOW", + "offset": 0, + "slot": "2", + "type": "t_uint256" + } + ], + "types": { + "t_contract(Lib_AddressManager)12793": { + "encoding": "inplace", + "label": "contract Lib_AddressManager", + "numberOfBytes": "20" + }, + "t_uint256": { + "encoding": "inplace", + "label": "uint256", + "numberOfBytes": "32" + } + } + } +} \ No newline at end of file diff --git a/packages/contracts/deployments/kovan-v3/OVM_StateManagerFactory.json b/packages/contracts/deployments/kovan-v3/OVM_StateManagerFactory.json new file mode 100644 index 0000000000000..bda9b91247e60 --- /dev/null +++ b/packages/contracts/deployments/kovan-v3/OVM_StateManagerFactory.json @@ -0,0 +1,74 @@ +{ + "address": "0x3b96673C9e24D362501e87B239F60543e20beD50", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_owner", + "type": "address" + } + ], + "name": "create", + "outputs": [ + { + "internalType": "contract iOVM_StateManager", + "name": "", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "transactionHash": "0x9926548d5337a7b624a7c7aa3d4ea80c4e9a2fc3afaef0bfc634b19145bb56c1", + "receipt": { + "to": null, + "from": "0x18394B52d3Cb931dfA76F63251919D051953413d", + "contractAddress": "0x3b96673C9e24D362501e87B239F60543e20beD50", + "transactionIndex": 1, + "gasUsed": "1170970", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0x20e3b8b73d8c3667eed92aa3bc04339f6a2c45f7d7bc3e7887163bed2bde2240", + "transactionHash": "0x9926548d5337a7b624a7c7aa3d4ea80c4e9a2fc3afaef0bfc634b19145bb56c1", + "logs": [], + "blockNumber": 24572858, + "cumulativeGasUsed": "1215716", + "status": 1, + "byzantium": true + }, + "args": [], + "solcInputHash": "5ee8e508e2c54cb5ac6783b4855b1558", + "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"}],\"name\":\"create\",\"outputs\":[{\"internalType\":\"contract iOVM_StateManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The State Manager Factory is called by a State Transitioner's init code, to create a new State Manager for use in the Fraud Verification process. Compiler used: solc Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"create(address)\":{\"params\":{\"_owner\":\"Owner of the created contract.\"},\"returns\":{\"_0\":\"New OVM_StateManager instance.\"}}},\"title\":\"OVM_StateManagerFactory\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"create(address)\":{\"notice\":\"Creates a new OVM_StateManager\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/OVM/execution/OVM_StateManagerFactory.sol\":\"OVM_StateManagerFactory\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/optimistic-ethereum/OVM/execution/OVM_StateManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_StateManager } from \\\"../../iOVM/execution/iOVM_StateManager.sol\\\";\\n\\n/**\\n * @title OVM_StateManager\\n * @dev The State Manager contract holds all storage values for contracts in the OVM. It can only be written to by the\\n * the Execution Manager and State Transitioner. It runs on L1 during the setup and execution of a fraud proof.\\n * The same logic runs on L2, but has been implemented as a precompile in the L2 go-ethereum client\\n * (see https://github.com/ethereum-optimism/go-ethereum/blob/master/core/vm/ovm_state_manager.go).\\n *\\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract OVM_StateManager is iOVM_StateManager {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n bytes32 constant internal EMPTY_ACCOUNT_STORAGE_ROOT = 0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421;\\n bytes32 constant internal EMPTY_ACCOUNT_CODE_HASH = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;\\n bytes32 constant internal STORAGE_XOR_VALUE = 0xFEEDFACECAFEBEEFFEEDFACECAFEBEEFFEEDFACECAFEBEEFFEEDFACECAFEBEEF;\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n address override public owner;\\n address override public ovmExecutionManager;\\n mapping (address => Lib_OVMCodec.Account) internal accounts;\\n mapping (address => mapping (bytes32 => bytes32)) internal contractStorage;\\n mapping (address => mapping (bytes32 => bool)) internal verifiedContractStorage;\\n mapping (bytes32 => ItemState) internal itemStates;\\n uint256 internal totalUncommittedAccounts;\\n uint256 internal totalUncommittedContractStorage;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _owner Address of the owner of this contract.\\n */\\n constructor(\\n address _owner\\n )\\n {\\n owner = _owner;\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n /**\\n * Simple authentication, this contract should only be accessible to the owner (which is expected to be the State Transitioner during `PRE_EXECUTION`\\n * or the OVM_ExecutionManager during transaction execution.\\n */\\n modifier authenticated() {\\n // owner is the State Transitioner\\n require(\\n msg.sender == owner || msg.sender == ovmExecutionManager,\\n \\\"Function can only be called by authenticated addresses\\\"\\n );\\n _;\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Checks whether a given address is allowed to modify this contract.\\n * @param _address Address to check.\\n * @return Whether or not the address can modify this contract.\\n */\\n function isAuthenticated(\\n address _address\\n )\\n override\\n public\\n view\\n returns (\\n bool\\n )\\n {\\n return (_address == owner || _address == ovmExecutionManager);\\n }\\n\\n /**\\n * Sets the address of the OVM_ExecutionManager.\\n * @param _ovmExecutionManager Address of the OVM_ExecutionManager.\\n */\\n function setExecutionManager(\\n address _ovmExecutionManager\\n )\\n override\\n public\\n authenticated\\n {\\n ovmExecutionManager = _ovmExecutionManager;\\n }\\n\\n /**\\n * Inserts an account into the state.\\n * @param _address Address of the account to insert.\\n * @param _account Account to insert for the given address.\\n */\\n function putAccount(\\n address _address,\\n Lib_OVMCodec.Account memory _account\\n )\\n override\\n public\\n authenticated\\n {\\n accounts[_address] = _account;\\n }\\n\\n /**\\n * Marks an account as empty.\\n * @param _address Address of the account to mark.\\n */\\n function putEmptyAccount(\\n address _address\\n )\\n override\\n public\\n authenticated\\n {\\n Lib_OVMCodec.Account storage account = accounts[_address];\\n account.storageRoot = EMPTY_ACCOUNT_STORAGE_ROOT;\\n account.codeHash = EMPTY_ACCOUNT_CODE_HASH;\\n }\\n\\n /**\\n * Retrieves an account from the state.\\n * @param _address Address of the account to retrieve.\\n * @return Account for the given address.\\n */\\n function getAccount(\\n address _address\\n )\\n override\\n public\\n view\\n returns (\\n Lib_OVMCodec.Account memory\\n )\\n {\\n return accounts[_address];\\n }\\n\\n /**\\n * Checks whether the state has a given account.\\n * @param _address Address of the account to check.\\n * @return Whether or not the state has the account.\\n */\\n function hasAccount(\\n address _address\\n )\\n override\\n public\\n view\\n returns (\\n bool\\n )\\n {\\n return accounts[_address].codeHash != bytes32(0);\\n }\\n\\n /**\\n * Checks whether the state has a given known empty account.\\n * @param _address Address of the account to check.\\n * @return Whether or not the state has the empty account.\\n */\\n function hasEmptyAccount(\\n address _address\\n )\\n override\\n public\\n view\\n returns (\\n bool\\n )\\n {\\n return (\\n accounts[_address].codeHash == EMPTY_ACCOUNT_CODE_HASH\\n && accounts[_address].nonce == 0\\n );\\n }\\n\\n /**\\n * Sets the nonce of an account.\\n * @param _address Address of the account to modify.\\n * @param _nonce New account nonce.\\n */\\n function setAccountNonce(\\n address _address,\\n uint256 _nonce\\n )\\n override\\n public\\n authenticated\\n {\\n accounts[_address].nonce = _nonce;\\n }\\n\\n /**\\n * Gets the nonce of an account.\\n * @param _address Address of the account to access.\\n * @return Nonce of the account.\\n */\\n function getAccountNonce(\\n address _address\\n )\\n override\\n public\\n view\\n returns (\\n uint256\\n )\\n {\\n return accounts[_address].nonce;\\n }\\n\\n /**\\n * Retrieves the Ethereum address of an account.\\n * @param _address Address of the account to access.\\n * @return Corresponding Ethereum address.\\n */\\n function getAccountEthAddress(\\n address _address\\n )\\n override\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return accounts[_address].ethAddress;\\n }\\n\\n /**\\n * Retrieves the storage root of an account.\\n * @param _address Address of the account to access.\\n * @return Corresponding storage root.\\n */\\n function getAccountStorageRoot(\\n address _address\\n )\\n override\\n public\\n view\\n returns (\\n bytes32\\n )\\n {\\n return accounts[_address].storageRoot;\\n }\\n\\n /**\\n * Initializes a pending account (during CREATE or CREATE2) with the default values.\\n * @param _address Address of the account to initialize.\\n */\\n function initPendingAccount(\\n address _address\\n )\\n override\\n public\\n authenticated\\n {\\n Lib_OVMCodec.Account storage account = accounts[_address];\\n account.nonce = 1;\\n account.storageRoot = EMPTY_ACCOUNT_STORAGE_ROOT;\\n account.codeHash = EMPTY_ACCOUNT_CODE_HASH;\\n account.isFresh = true;\\n }\\n\\n /**\\n * Finalizes the creation of a pending account (during CREATE or CREATE2).\\n * @param _address Address of the account to finalize.\\n * @param _ethAddress Address of the account's associated contract on Ethereum.\\n * @param _codeHash Hash of the account's code.\\n */\\n function commitPendingAccount(\\n address _address,\\n address _ethAddress,\\n bytes32 _codeHash\\n )\\n override\\n public\\n authenticated\\n {\\n Lib_OVMCodec.Account storage account = accounts[_address];\\n account.ethAddress = _ethAddress;\\n account.codeHash = _codeHash;\\n }\\n\\n /**\\n * Checks whether an account has already been retrieved, and marks it as retrieved if not.\\n * @param _address Address of the account to check.\\n * @return Whether or not the account was already loaded.\\n */\\n function testAndSetAccountLoaded(\\n address _address\\n )\\n override\\n public\\n authenticated\\n returns (\\n bool\\n )\\n {\\n return _testAndSetItemState(\\n _getItemHash(_address),\\n ItemState.ITEM_LOADED\\n );\\n }\\n\\n /**\\n * Checks whether an account has already been modified, and marks it as modified if not.\\n * @param _address Address of the account to check.\\n * @return Whether or not the account was already modified.\\n */\\n function testAndSetAccountChanged(\\n address _address\\n )\\n override\\n public\\n authenticated\\n returns (\\n bool\\n )\\n {\\n return _testAndSetItemState(\\n _getItemHash(_address),\\n ItemState.ITEM_CHANGED\\n );\\n }\\n\\n /**\\n * Attempts to mark an account as committed.\\n * @param _address Address of the account to commit.\\n * @return Whether or not the account was committed.\\n */\\n function commitAccount(\\n address _address\\n )\\n override\\n public\\n authenticated\\n returns (\\n bool\\n )\\n {\\n bytes32 item = _getItemHash(_address);\\n if (itemStates[item] != ItemState.ITEM_CHANGED) {\\n return false;\\n }\\n\\n itemStates[item] = ItemState.ITEM_COMMITTED;\\n totalUncommittedAccounts -= 1;\\n\\n return true;\\n }\\n\\n /**\\n * Increments the total number of uncommitted accounts.\\n */\\n function incrementTotalUncommittedAccounts()\\n override\\n public\\n authenticated\\n {\\n totalUncommittedAccounts += 1;\\n }\\n\\n /**\\n * Gets the total number of uncommitted accounts.\\n * @return Total uncommitted accounts.\\n */\\n function getTotalUncommittedAccounts()\\n override\\n public\\n view\\n returns (\\n uint256\\n )\\n {\\n return totalUncommittedAccounts;\\n }\\n\\n /**\\n * Checks whether a given account was changed during execution.\\n * @param _address Address to check.\\n * @return Whether or not the account was changed.\\n */\\n function wasAccountChanged(\\n address _address\\n )\\n override\\n public\\n view\\n returns (\\n bool\\n )\\n {\\n bytes32 item = _getItemHash(_address);\\n return itemStates[item] >= ItemState.ITEM_CHANGED;\\n }\\n\\n /**\\n * Checks whether a given account was committed after execution.\\n * @param _address Address to check.\\n * @return Whether or not the account was committed.\\n */\\n function wasAccountCommitted(\\n address _address\\n )\\n override\\n public\\n view\\n returns (\\n bool\\n )\\n {\\n bytes32 item = _getItemHash(_address);\\n return itemStates[item] >= ItemState.ITEM_COMMITTED;\\n }\\n\\n\\n /************************************\\n * Public Functions: Storage Access *\\n ************************************/\\n\\n /**\\n * Changes a contract storage slot value.\\n * @param _contract Address of the contract to modify.\\n * @param _key 32 byte storage slot key.\\n * @param _value 32 byte storage slot value.\\n */\\n function putContractStorage(\\n address _contract,\\n bytes32 _key,\\n bytes32 _value\\n )\\n override\\n public\\n authenticated\\n {\\n // A hilarious optimization. `SSTORE`ing a value of `bytes32(0)` is common enough that it's\\n // worth populating this with a non-zero value in advance (during the fraud proof\\n // initialization phase) to cut the execution-time cost down to 5000 gas.\\n contractStorage[_contract][_key] = _value ^ STORAGE_XOR_VALUE;\\n\\n // Only used when initially populating the contract storage. OVM_ExecutionManager will\\n // perform a `hasContractStorage` INVALID_STATE_ACCESS check before putting any contract\\n // storage because writing to zero when the actual value is nonzero causes a gas\\n // discrepancy. Could be moved into a new `putVerifiedContractStorage` function, or\\n // something along those lines.\\n if (verifiedContractStorage[_contract][_key] == false) {\\n verifiedContractStorage[_contract][_key] = true;\\n }\\n }\\n\\n /**\\n * Retrieves a contract storage slot value.\\n * @param _contract Address of the contract to access.\\n * @param _key 32 byte storage slot key.\\n * @return 32 byte storage slot value.\\n */\\n function getContractStorage(\\n address _contract,\\n bytes32 _key\\n )\\n override\\n public\\n view\\n returns (\\n bytes32\\n )\\n {\\n // Storage XOR system doesn't work for newly created contracts that haven't set this\\n // storage slot value yet.\\n if (\\n verifiedContractStorage[_contract][_key] == false\\n && accounts[_contract].isFresh\\n ) {\\n return bytes32(0);\\n }\\n\\n // See `putContractStorage` for more information about the XOR here.\\n return contractStorage[_contract][_key] ^ STORAGE_XOR_VALUE;\\n }\\n\\n /**\\n * Checks whether a contract storage slot exists in the state.\\n * @param _contract Address of the contract to access.\\n * @param _key 32 byte storage slot key.\\n * @return Whether or not the key was set in the state.\\n */\\n function hasContractStorage(\\n address _contract,\\n bytes32 _key\\n )\\n override\\n public\\n view\\n returns (\\n bool\\n )\\n {\\n return verifiedContractStorage[_contract][_key] || accounts[_contract].isFresh;\\n }\\n\\n /**\\n * Checks whether a storage slot has already been retrieved, and marks it as retrieved if not.\\n * @param _contract Address of the contract to check.\\n * @param _key 32 byte storage slot key.\\n * @return Whether or not the slot was already loaded.\\n */\\n function testAndSetContractStorageLoaded(\\n address _contract,\\n bytes32 _key\\n )\\n override\\n public\\n authenticated\\n returns (\\n bool\\n )\\n {\\n return _testAndSetItemState(\\n _getItemHash(_contract, _key),\\n ItemState.ITEM_LOADED\\n );\\n }\\n\\n /**\\n * Checks whether a storage slot has already been modified, and marks it as modified if not.\\n * @param _contract Address of the contract to check.\\n * @param _key 32 byte storage slot key.\\n * @return Whether or not the slot was already modified.\\n */\\n function testAndSetContractStorageChanged(\\n address _contract,\\n bytes32 _key\\n )\\n override\\n public\\n authenticated\\n returns (\\n bool\\n )\\n {\\n return _testAndSetItemState(\\n _getItemHash(_contract, _key),\\n ItemState.ITEM_CHANGED\\n );\\n }\\n\\n /**\\n * Attempts to mark a storage slot as committed.\\n * @param _contract Address of the account to commit.\\n * @param _key 32 byte slot key to commit.\\n * @return Whether or not the slot was committed.\\n */\\n function commitContractStorage(\\n address _contract,\\n bytes32 _key\\n )\\n override\\n public\\n authenticated\\n returns (\\n bool\\n )\\n {\\n bytes32 item = _getItemHash(_contract, _key);\\n if (itemStates[item] != ItemState.ITEM_CHANGED) {\\n return false;\\n }\\n\\n itemStates[item] = ItemState.ITEM_COMMITTED;\\n totalUncommittedContractStorage -= 1;\\n\\n return true;\\n }\\n\\n /**\\n * Increments the total number of uncommitted storage slots.\\n */\\n function incrementTotalUncommittedContractStorage()\\n override\\n public\\n authenticated\\n {\\n totalUncommittedContractStorage += 1;\\n }\\n\\n /**\\n * Gets the total number of uncommitted storage slots.\\n * @return Total uncommitted storage slots.\\n */\\n function getTotalUncommittedContractStorage()\\n override\\n public\\n view\\n returns (\\n uint256\\n )\\n {\\n return totalUncommittedContractStorage;\\n }\\n\\n /**\\n * Checks whether a given storage slot was changed during execution.\\n * @param _contract Address to check.\\n * @param _key Key of the storage slot to check.\\n * @return Whether or not the storage slot was changed.\\n */\\n function wasContractStorageChanged(\\n address _contract,\\n bytes32 _key\\n )\\n override\\n public\\n view\\n returns (\\n bool\\n )\\n {\\n bytes32 item = _getItemHash(_contract, _key);\\n return itemStates[item] >= ItemState.ITEM_CHANGED;\\n }\\n\\n /**\\n * Checks whether a given storage slot was committed after execution.\\n * @param _contract Address to check.\\n * @param _key Key of the storage slot to check.\\n * @return Whether or not the storage slot was committed.\\n */\\n function wasContractStorageCommitted(\\n address _contract,\\n bytes32 _key\\n )\\n override\\n public\\n view\\n returns (\\n bool\\n )\\n {\\n bytes32 item = _getItemHash(_contract, _key);\\n return itemStates[item] >= ItemState.ITEM_COMMITTED;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Generates a unique hash for an address.\\n * @param _address Address to generate a hash for.\\n * @return Unique hash for the given address.\\n */\\n function _getItemHash(\\n address _address\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(abi.encodePacked(_address));\\n }\\n\\n /**\\n * Generates a unique hash for an address/key pair.\\n * @param _contract Address to generate a hash for.\\n * @param _key Key to generate a hash for.\\n * @return Unique hash for the given pair.\\n */\\n function _getItemHash(\\n address _contract,\\n bytes32 _key\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(abi.encodePacked(\\n _contract,\\n _key\\n ));\\n }\\n\\n /**\\n * Checks whether an item is in a particular state (ITEM_LOADED or ITEM_CHANGED) and sets the\\n * item to the provided state if not.\\n * @param _item 32 byte item ID to check.\\n * @param _minItemState Minimum state that must be satisfied by the item.\\n * @return Whether or not the item was already in the state.\\n */\\n function _testAndSetItemState(\\n bytes32 _item,\\n ItemState _minItemState\\n )\\n internal\\n returns (\\n bool\\n )\\n {\\n bool wasItemState = itemStates[_item] >= _minItemState;\\n\\n if (wasItemState == false) {\\n itemStates[_item] = _minItemState;\\n }\\n\\n return wasItemState;\\n }\\n}\\n\",\"keccak256\":\"0x0df9654f9f958038435c2b2a2c7793b20fa16afe866a69cbed32a371aaa4c78b\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/execution/OVM_StateManagerFactory.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Interface Imports */\\nimport { iOVM_StateManager } from \\\"../../iOVM/execution/iOVM_StateManager.sol\\\";\\nimport { iOVM_StateManagerFactory } from \\\"../../iOVM/execution/iOVM_StateManagerFactory.sol\\\";\\n\\n/* Contract Imports */\\nimport { OVM_StateManager } from \\\"./OVM_StateManager.sol\\\";\\n\\n/**\\n * @title OVM_StateManagerFactory\\n * @dev The State Manager Factory is called by a State Transitioner's init code, to create a new\\n * State Manager for use in the Fraud Verification process.\\n *\\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract OVM_StateManagerFactory is iOVM_StateManagerFactory {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Creates a new OVM_StateManager\\n * @param _owner Owner of the created contract.\\n * @return New OVM_StateManager instance.\\n */\\n function create(\\n address _owner\\n )\\n override\\n public\\n returns (\\n iOVM_StateManager\\n )\\n {\\n return new OVM_StateManager(_owner);\\n }\\n}\\n\",\"keccak256\":\"0xc557f05b8a82eee7b36a389795fe4acc0803bcf5ae33e15e9cba8226e9ab49fc\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/execution/iOVM_StateManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title iOVM_StateManager\\n */\\ninterface iOVM_StateManager {\\n\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n enum ItemState {\\n ITEM_UNTOUCHED,\\n ITEM_LOADED,\\n ITEM_CHANGED,\\n ITEM_COMMITTED\\n }\\n\\n /***************************\\n * Public Functions: Misc *\\n ***************************/\\n\\n function isAuthenticated(address _address) external view returns (bool);\\n\\n /***************************\\n * Public Functions: Setup *\\n ***************************/\\n\\n function owner() external view returns (address _owner);\\n function ovmExecutionManager() external view returns (address _ovmExecutionManager);\\n function setExecutionManager(address _ovmExecutionManager) external;\\n\\n\\n /************************************\\n * Public Functions: Account Access *\\n ************************************/\\n\\n function putAccount(address _address, Lib_OVMCodec.Account memory _account) external;\\n function putEmptyAccount(address _address) external;\\n function getAccount(address _address) external view returns (Lib_OVMCodec.Account memory _account);\\n function hasAccount(address _address) external view returns (bool _exists);\\n function hasEmptyAccount(address _address) external view returns (bool _exists);\\n function setAccountNonce(address _address, uint256 _nonce) external;\\n function getAccountNonce(address _address) external view returns (uint256 _nonce);\\n function getAccountEthAddress(address _address) external view returns (address _ethAddress);\\n function getAccountStorageRoot(address _address) external view returns (bytes32 _storageRoot);\\n function initPendingAccount(address _address) external;\\n function commitPendingAccount(address _address, address _ethAddress, bytes32 _codeHash) external;\\n function testAndSetAccountLoaded(address _address) external returns (bool _wasAccountAlreadyLoaded);\\n function testAndSetAccountChanged(address _address) external returns (bool _wasAccountAlreadyChanged);\\n function commitAccount(address _address) external returns (bool _wasAccountCommitted);\\n function incrementTotalUncommittedAccounts() external;\\n function getTotalUncommittedAccounts() external view returns (uint256 _total);\\n function wasAccountChanged(address _address) external view returns (bool);\\n function wasAccountCommitted(address _address) external view returns (bool);\\n\\n\\n /************************************\\n * Public Functions: Storage Access *\\n ************************************/\\n\\n function putContractStorage(address _contract, bytes32 _key, bytes32 _value) external;\\n function getContractStorage(address _contract, bytes32 _key) external view returns (bytes32 _value);\\n function hasContractStorage(address _contract, bytes32 _key) external view returns (bool _exists);\\n function testAndSetContractStorageLoaded(address _contract, bytes32 _key) external returns (bool _wasContractStorageAlreadyLoaded);\\n function testAndSetContractStorageChanged(address _contract, bytes32 _key) external returns (bool _wasContractStorageAlreadyChanged);\\n function commitContractStorage(address _contract, bytes32 _key) external returns (bool _wasContractStorageCommitted);\\n function incrementTotalUncommittedContractStorage() external;\\n function getTotalUncommittedContractStorage() external view returns (uint256 _total);\\n function wasContractStorageChanged(address _contract, bytes32 _key) external view returns (bool);\\n function wasContractStorageCommitted(address _contract, bytes32 _key) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x7a11dbd1f61593ba34debe07e39eef59967307f7f372ba9855bee0953585d08d\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/execution/iOVM_StateManagerFactory.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Contract Imports */\\nimport { iOVM_StateManager } from \\\"./iOVM_StateManager.sol\\\";\\n\\n/**\\n * @title iOVM_StateManagerFactory\\n */\\ninterface iOVM_StateManagerFactory {\\n\\n /***************************************\\n * Public Functions: Contract Creation *\\n ***************************************/\\n\\n function create(\\n address _owner\\n )\\n external\\n returns (\\n iOVM_StateManager _ovmStateManager\\n );\\n}\\n\",\"keccak256\":\"0x27a90fc43889d0c7d1db50f37907ef7386d9b415d15a1e91a0a068cba59afd36\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/codec/Lib_OVMCodec.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../utils/Lib_Bytes32Utils.sol\\\";\\n\\n/**\\n * @title Lib_OVMCodec\\n */\\nlibrary Lib_OVMCodec {\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum QueueOrigin {\\n SEQUENCER_QUEUE,\\n L1TOL2_QUEUE\\n }\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Account {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n address ethAddress;\\n bool isFresh;\\n }\\n\\n struct EVMAccount {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n }\\n\\n struct ChainBatchHeader {\\n uint256 batchIndex;\\n bytes32 batchRoot;\\n uint256 batchSize;\\n uint256 prevTotalElements;\\n bytes extraData;\\n }\\n\\n struct ChainInclusionProof {\\n uint256 index;\\n bytes32[] siblings;\\n }\\n\\n struct Transaction {\\n uint256 timestamp;\\n uint256 blockNumber;\\n QueueOrigin l1QueueOrigin;\\n address l1TxOrigin;\\n address entrypoint;\\n uint256 gasLimit;\\n bytes data;\\n }\\n\\n struct TransactionChainElement {\\n bool isSequenced;\\n uint256 queueIndex; // QUEUED TX ONLY\\n uint256 timestamp; // SEQUENCER TX ONLY\\n uint256 blockNumber; // SEQUENCER TX ONLY\\n bytes txData; // SEQUENCER TX ONLY\\n }\\n\\n struct QueueElement {\\n bytes32 transactionHash;\\n uint40 timestamp;\\n uint40 blockNumber;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Encodes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Encoded transaction bytes.\\n */\\n function encodeTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return abi.encodePacked(\\n _transaction.timestamp,\\n _transaction.blockNumber,\\n _transaction.l1QueueOrigin,\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n );\\n }\\n\\n /**\\n * Hashes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Hashed transaction\\n */\\n function hashTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(encodeTransaction(_transaction));\\n }\\n\\n /**\\n * Converts an OVM account to an EVM account.\\n * @param _in OVM account to convert.\\n * @return Converted EVM account.\\n */\\n function toEVMAccount(\\n Account memory _in\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n return EVMAccount({\\n nonce: _in.nonce,\\n balance: _in.balance,\\n storageRoot: _in.storageRoot,\\n codeHash: _in.codeHash\\n });\\n }\\n\\n /**\\n * @notice RLP-encodes an account state struct.\\n * @param _account Account state struct.\\n * @return RLP-encoded account state.\\n */\\n function encodeEVMAccount(\\n EVMAccount memory _account\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes[] memory raw = new bytes[](4);\\n\\n // Unfortunately we can't create this array outright because\\n // Lib_RLPWriter.writeList will reject fixed-size arrays. Assigning\\n // index-by-index circumvents this issue.\\n raw[0] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.nonce)\\n )\\n );\\n raw[1] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.balance)\\n )\\n );\\n raw[2] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.storageRoot));\\n raw[3] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.codeHash));\\n\\n return Lib_RLPWriter.writeList(raw);\\n }\\n\\n /**\\n * @notice Decodes an RLP-encoded account state into a useful struct.\\n * @param _encoded RLP-encoded account state.\\n * @return Account state struct.\\n */\\n function decodeEVMAccount(\\n bytes memory _encoded\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\\n\\n return EVMAccount({\\n nonce: Lib_RLPReader.readUint256(accountState[0]),\\n balance: Lib_RLPReader.readUint256(accountState[1]),\\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\\n });\\n }\\n\\n /**\\n * Calculates a hash for a given batch header.\\n * @param _batchHeader Header to hash.\\n * @return Hash of the header.\\n */\\n function hashBatchHeader(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(\\n abi.encode(\\n _batchHeader.batchRoot,\\n _batchHeader.batchSize,\\n _batchHeader.prevTotalElements,\\n _batchHeader.extraData\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0xd85ba2066057a2677926f484b938c7c2ef33ff3853f3b71cda252f4a54f30e05\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPReader.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_RLPReader\\n * @dev Adapted from \\\"RLPReader\\\" by Hamdi Allam (hamdi.allam97@gmail.com).\\n */\\nlibrary Lib_RLPReader {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 constant internal MAX_LIST_LENGTH = 32;\\n\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum RLPItemType {\\n DATA_ITEM,\\n LIST_ITEM\\n }\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct RLPItem {\\n uint256 length;\\n uint256 ptr;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts bytes to a reference to memory position and length.\\n * @param _in Input bytes to convert.\\n * @return Output memory reference.\\n */\\n function toRLPItem(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem memory\\n )\\n {\\n uint256 ptr;\\n assembly {\\n ptr := add(_in, 32)\\n }\\n\\n return RLPItem({\\n length: _in.length,\\n ptr: ptr\\n });\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n (\\n uint256 listOffset,\\n ,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.LIST_ITEM,\\n \\\"Invalid RLP list value.\\\"\\n );\\n\\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\\n // writing to the length. Since we can't know the number of RLP items without looping over\\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\\n // simply set a reasonable maximum list length and decrease the size before we finish.\\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\\n\\n uint256 itemCount = 0;\\n uint256 offset = listOffset;\\n while (offset < _in.length) {\\n require(\\n itemCount < MAX_LIST_LENGTH,\\n \\\"Provided RLP list exceeds max list length.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n ) = _decodeLength(RLPItem({\\n length: _in.length - offset,\\n ptr: _in.ptr + offset\\n }));\\n\\n out[itemCount] = RLPItem({\\n length: itemLength + itemOffset,\\n ptr: _in.ptr + offset\\n });\\n\\n itemCount += 1;\\n offset += itemOffset + itemLength;\\n }\\n\\n // Decrease the array size to match the actual item count.\\n assembly {\\n mstore(out, itemCount)\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n return readList(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes value.\\\"\\n );\\n\\n return _copy(_in.ptr, itemOffset, itemLength);\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return readBytes(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return string(readBytes(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return readString(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n require(\\n _in.length <= 33,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr + itemOffset;\\n bytes32 out;\\n assembly {\\n out := mload(ptr)\\n\\n // Shift the bytes over to match the item size.\\n if lt(itemLength, 32) {\\n out := div(out, exp(256, sub(32, itemLength)))\\n }\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return readBytes32(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return uint256(readBytes32(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return readUint256(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n require(\\n _in.length == 1,\\n \\\"Invalid RLP boolean value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 out;\\n assembly {\\n out := byte(0, mload(ptr))\\n }\\n\\n require(\\n out == 0 || out == 1,\\n \\\"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\\\"\\n );\\n\\n return out != 0;\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return readBool(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n if (_in.length == 1) {\\n return address(0);\\n }\\n\\n require(\\n _in.length == 21,\\n \\\"Invalid RLP address value.\\\"\\n );\\n\\n return address(readUint256(_in));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return readAddress(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads the raw bytes of an RLP item.\\n * @param _in RLP item to read.\\n * @return Raw RLP bytes.\\n */\\n function readRawBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in);\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Decodes the length of an RLP item.\\n * @param _in RLP item to decode.\\n * @return Offset of the encoded data.\\n * @return Length of the encoded data.\\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\\n */\\n function _decodeLength(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n uint256,\\n uint256,\\n RLPItemType\\n )\\n {\\n require(\\n _in.length > 0,\\n \\\"RLP item cannot be null.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 prefix;\\n assembly {\\n prefix := byte(0, mload(ptr))\\n }\\n\\n if (prefix <= 0x7f) {\\n // Single byte.\\n\\n return (0, 1, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xb7) {\\n // Short string.\\n\\n uint256 strLen = prefix - 0x80;\\n\\n require(\\n _in.length > strLen,\\n \\\"Invalid RLP short string.\\\"\\n );\\n\\n return (1, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xbf) {\\n // Long string.\\n uint256 lenOfStrLen = prefix - 0xb7;\\n\\n require(\\n _in.length > lenOfStrLen,\\n \\\"Invalid RLP long string length.\\\"\\n );\\n\\n uint256 strLen;\\n assembly {\\n // Pick out the string length.\\n strLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfStrLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfStrLen + strLen,\\n \\\"Invalid RLP long string.\\\"\\n );\\n\\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xf7) {\\n // Short list.\\n uint256 listLen = prefix - 0xc0;\\n\\n require(\\n _in.length > listLen,\\n \\\"Invalid RLP short list.\\\"\\n );\\n\\n return (1, listLen, RLPItemType.LIST_ITEM);\\n } else {\\n // Long list.\\n uint256 lenOfListLen = prefix - 0xf7;\\n\\n require(\\n _in.length > lenOfListLen,\\n \\\"Invalid RLP long list length.\\\"\\n );\\n\\n uint256 listLen;\\n assembly {\\n // Pick out the list length.\\n listLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfListLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfListLen + listLen,\\n \\\"Invalid RLP long list.\\\"\\n );\\n\\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\\n }\\n }\\n\\n /**\\n * Copies the bytes from a memory location.\\n * @param _src Pointer to the location to read from.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Copied bytes.\\n */\\n function _copy(\\n uint256 _src,\\n uint256 _offset,\\n uint256 _length\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out = new bytes(_length);\\n if (out.length == 0) {\\n return out;\\n }\\n\\n uint256 src = _src + _offset;\\n uint256 dest;\\n assembly {\\n dest := add(out, 32)\\n }\\n\\n // Copy over as many complete words as we can.\\n for (uint256 i = 0; i < _length / 32; i++) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n\\n src += 32;\\n dest += 32;\\n }\\n\\n // Pick out the remaining bytes.\\n uint256 mask = 256 ** (32 - (_length % 32)) - 1;\\n assembly {\\n mstore(\\n dest,\\n or(\\n and(mload(src), not(mask)),\\n and(mload(dest), mask)\\n )\\n )\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Copies an RLP item into bytes.\\n * @param _in RLP item to copy.\\n * @return Copied bytes.\\n */\\n function _copy(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in.ptr, 0, _in.length);\\n }\\n}\\n\",\"keccak256\":\"0x829174c61216dce35fdb888383b6022e0365eb7fbdc71ad79d98b108091969fe\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPWriter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/**\\n * @title Lib_RLPWriter\\n * @author Bakaoh (with modifications)\\n */\\nlibrary Lib_RLPWriter {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * RLP encodes a byte string.\\n * @param _in The byte string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded;\\n\\n if (_in.length == 1 && uint8(_in[0]) < 128) {\\n encoded = _in;\\n } else {\\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * RLP encodes a list of RLP encoded byte byte strings.\\n * @param _in The list of RLP encoded byte strings.\\n * @return The RLP encoded list of items in bytes.\\n */\\n function writeList(\\n bytes[] memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory list = _flatten(_in);\\n return abi.encodePacked(_writeLength(list.length, 192), list);\\n }\\n\\n /**\\n * RLP encodes a string.\\n * @param _in The string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeString(\\n string memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(bytes(_in));\\n }\\n\\n /**\\n * RLP encodes an address.\\n * @param _in The address to encode.\\n * @return The RLP encoded address in bytes.\\n */\\n function writeAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a bytes32 value.\\n * @param _in The bytes32 to encode.\\n * @return _out The RLP encoded bytes32 in bytes.\\n */\\n function writeBytes32(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a uint.\\n * @param _in The uint256 to encode.\\n * @return The RLP encoded uint256 in bytes.\\n */\\n function writeUint(\\n uint256 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(_toBinary(_in));\\n }\\n\\n /**\\n * RLP encodes a bool.\\n * @param _in The bool to encode.\\n * @return The RLP encoded bool in bytes.\\n */\\n function writeBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded = new bytes(1);\\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\\n return encoded;\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\\n * @param _len The length of the string or the payload.\\n * @param _offset 128 if item is string, 192 if item is list.\\n * @return RLP encoded bytes.\\n */\\n function _writeLength(\\n uint256 _len,\\n uint256 _offset\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded;\\n\\n if (_len < 56) {\\n encoded = new bytes(1);\\n encoded[0] = byte(uint8(_len) + uint8(_offset));\\n } else {\\n uint256 lenLen;\\n uint256 i = 1;\\n while (_len / i != 0) {\\n lenLen++;\\n i *= 256;\\n }\\n\\n encoded = new bytes(lenLen + 1);\\n encoded[0] = byte(uint8(lenLen) + uint8(_offset) + 55);\\n for(i = 1; i <= lenLen; i++) {\\n encoded[i] = byte(uint8((_len / (256**(lenLen-i))) % 256));\\n }\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * Encode integer in big endian binary form with no leading zeroes.\\n * @notice TODO: This should be optimized with assembly to save gas costs.\\n * @param _x The integer to encode.\\n * @return RLP encoded bytes.\\n */\\n function _toBinary(\\n uint256 _x\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory b = abi.encodePacked(_x);\\n\\n uint256 i = 0;\\n for (; i < 32; i++) {\\n if (b[i] != 0) {\\n break;\\n }\\n }\\n\\n bytes memory res = new bytes(32 - i);\\n for (uint256 j = 0; j < res.length; j++) {\\n res[j] = b[i++];\\n }\\n\\n return res;\\n }\\n\\n /**\\n * Copies a piece of memory to another location.\\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\\n * @param _dest Destination location.\\n * @param _src Source location.\\n * @param _len Length of memory to copy.\\n */\\n function _memcpy(\\n uint256 _dest,\\n uint256 _src,\\n uint256 _len\\n )\\n private\\n pure\\n {\\n uint256 dest = _dest;\\n uint256 src = _src;\\n uint256 len = _len;\\n\\n for(; len >= 32; len -= 32) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n dest += 32;\\n src += 32;\\n }\\n\\n uint256 mask = 256 ** (32 - len) - 1;\\n assembly {\\n let srcpart := and(mload(src), not(mask))\\n let destpart := and(mload(dest), mask)\\n mstore(dest, or(destpart, srcpart))\\n }\\n }\\n\\n /**\\n * Flattens a list of byte strings into one byte string.\\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\\n * @param _list List of byte strings to flatten.\\n * @return The flattened byte string.\\n */\\n function _flatten(\\n bytes[] memory _list\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n if (_list.length == 0) {\\n return new bytes(0);\\n }\\n\\n uint256 len;\\n uint256 i = 0;\\n for (; i < _list.length; i++) {\\n len += _list[i].length;\\n }\\n\\n bytes memory flattened = new bytes(len);\\n uint256 flattenedPtr;\\n assembly { flattenedPtr := add(flattened, 0x20) }\\n\\n for(i = 0; i < _list.length; i++) {\\n bytes memory item = _list[i];\\n\\n uint256 listPtr;\\n assembly { listPtr := add(item, 0x20)}\\n\\n _memcpy(flattenedPtr, listPtr, item.length);\\n flattenedPtr += _list[i].length;\\n }\\n\\n return flattened;\\n }\\n}\\n\",\"keccak256\":\"0xb60ee4b03ad372c3deff21d454ab714dd0c18ee3e6f9d45532e209fc59d5a54d\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_Bytes32Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_Byte32Utils\\n */\\nlibrary Lib_Bytes32Utils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \\\"true.\\\"\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as a boolean.\\n */\\n function toBool(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return _in != 0;\\n }\\n\\n /**\\n * Converts a boolean to a bytes32 value.\\n * @param _in Input boolean value.\\n * @return Boolean as a bytes32.\\n */\\n function fromBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in ? 1 : 0));\\n }\\n\\n /**\\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as an address.\\n */\\n function toAddress(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return address(uint160(uint256(_in)));\\n }\\n\\n /**\\n * Converts an address to a bytes32.\\n * @param _in Input address value.\\n * @return Address as a bytes32.\\n */\\n function fromAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in));\\n }\\n\\n /**\\n * Removes the leading zeros from a bytes32 value and returns a new (smaller) bytes value.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 without any leading zeros.\\n */\\n function removeLeadingZeros(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out;\\n\\n assembly {\\n // Figure out how many leading zero bytes to remove.\\n let shift := 0\\n for { let i := 0 } and(lt(i, 32), eq(byte(i, _in), 0)) { i := add(i, 1) } {\\n shift := add(shift, 1)\\n }\\n\\n // Reserve some space for our output and fix the free memory pointer.\\n out := mload(0x40)\\n mstore(0x40, add(out, 0x40))\\n\\n // Shift the value and store it into the output bytes.\\n mstore(add(out, 0x20), shl(mul(shift, 8), _in))\\n\\n // Store the new size (with leading zero bytes removed) in the output byte size.\\n mstore(out, sub(32, shift))\\n }\\n\\n return out;\\n }\\n}\\n\",\"keccak256\":\"0xfa2def593e3fc56a31852c3744aefdaa93cec74e721bfcfeb1e5d166c7c60b64\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_BytesUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_BytesUtils\\n */\\nlibrary Lib_BytesUtils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_start + _length >= _start, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n if (_bytes.length - _start == 0) {\\n return bytes('');\\n }\\n\\n return slice(_bytes, _start, _bytes.length - _start);\\n }\\n\\n function toBytes32PadLeft(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n bytes32 ret;\\n uint256 len = _bytes.length <= 32 ? _bytes.length : 32;\\n assembly {\\n ret := shr(mul(sub(32, len), 8), mload(add(_bytes, 32)))\\n }\\n return ret;\\n }\\n\\n function toBytes32(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n if (_bytes.length < 32) {\\n bytes32 ret;\\n assembly {\\n ret := mload(add(_bytes, 32))\\n }\\n return ret;\\n }\\n\\n return abi.decode(_bytes,(bytes32)); // will truncate if input length > 32 bytes\\n }\\n\\n function toUint256(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return uint256(toBytes32(_bytes));\\n }\\n\\n function toUint24(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n uint24\\n )\\n {\\n require(_start + 3 >= _start, \\\"toUint24_overflow\\\");\\n require(_bytes.length >= _start + 3 , \\\"toUint24_outOfBounds\\\");\\n uint24 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x3), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toUint8(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n uint8\\n )\\n {\\n require(_start + 1 >= _start, \\\"toUint8_overflow\\\");\\n require(_bytes.length >= _start + 1 , \\\"toUint8_outOfBounds\\\");\\n uint8 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x1), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toAddress(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n require(_start + 20 >= _start, \\\"toAddress_overflow\\\");\\n require(_bytes.length >= _start + 20, \\\"toAddress_outOfBounds\\\");\\n address tempAddress;\\n\\n assembly {\\n tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000)\\n }\\n\\n return tempAddress;\\n }\\n\\n function toNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory nibbles = new bytes(_bytes.length * 2);\\n\\n for (uint256 i = 0; i < _bytes.length; i++) {\\n nibbles[i * 2] = _bytes[i] >> 4;\\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\\n }\\n\\n return nibbles;\\n }\\n\\n function fromNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory ret = new bytes(_bytes.length / 2);\\n\\n for (uint256 i = 0; i < ret.length; i++) {\\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\\n }\\n\\n return ret;\\n }\\n\\n function equal(\\n bytes memory _bytes,\\n bytes memory _other\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return keccak256(_bytes) == keccak256(_other);\\n }\\n}\\n\",\"keccak256\":\"0xa5195afe32fb2cf104d156e8f4bd39df1ec79bf6ba232097b9e8e0ee14fbc298\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x608060405234801561001057600080fd5b50611437806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c80639ed9331814610030575b600080fd5b6100566004803603602081101561004657600080fd5b50356001600160a01b0316610072565b604080516001600160a01b039092168252519081900360200190f35b600081604051610081906100b5565b6001600160a01b03909116815260405190819003602001906000f0801580156100ae573d6000803e3d6000fd5b5092915050565b61133f806100c38339019056fe608060405234801561001057600080fd5b5060405161133f38038061133f83398101604081905261002f91610054565b600080546001600160a01b0319166001600160a01b0392909216919091179055610082565b600060208284031215610065578081fd5b81516001600160a01b038116811461007b578182fd5b9392505050565b6112ae806100916000396000f3fe608060405234801561001057600080fd5b50600436106101f05760003560e01c80638f3b96471161010f578063d126199f116100a2578063e90abb8611610071578063e90abb86146103f9578063fb37b31c1461040c578063fbcbc0f11461041f578063fcf149a21461043f576101f0565b8063d126199f146103b8578063d15d4150146103cb578063d54414c8146103de578063d7bd4a2a146103f1576101f0565b8063c3fd9b25116100de578063c3fd9b2514610377578063c7650bf21461037f578063c8e40fbf14610392578063d0a215f2146103a5576101f0565b80638f3b96471461033657806399056ba914610349578063af37b86414610351578063af3dc01114610364576101f0565b806333f94305116101875780636f3c75af116101565780636f3c75af146102f55780637c8ee703146103085780637e86faa81461031b5780638da5cb5b1461032e576101f0565b806333f94305146102b25780635c17d629146102ba5780636b18e4e8146102cd5780636c87ad20146102e0576101f0565b8063167020d2116101c3578063167020d2146102595780631aaf392f1461026c5780631b208a5a1461028c57806326dc5b121461029f576101f0565b806307a12945146101f55780630ad226791461021e57806311b1f790146102315780631381ba4d14610244575b600080fd5b61020861020336600461101d565b610452565b60405161021591906111c4565b60405180910390f35b61020861022c366004611072565b6104ba565b61020861023f36600461101d565b610517565b61025761025236600461101d565b610573565b005b61020861026736600461101d565b6105d4565b61027f61027a366004611072565b610679565b60405161021591906111cf565b61020861029a36600461101d565b610727565b61027f6102ad36600461101d565b61075e565b61025761077d565b6102576102c836600461109b565b6107c7565b6102576102db36600461101d565b61089a565b6102e8610944565b60405161021591906111b0565b610208610303366004611072565b610953565b6102e861031636600461101d565b61098c565b610208610329366004611072565b6109ad565b6102e86109c3565b6102576103443660046110cd565b6109d2565b61027f610a88565b61020861035f366004611072565b610a8e565b610208610372366004611072565b610ae2565b610257610b2f565b61020861038d366004611072565b610b79565b6102086103a036600461101d565b610c20565b6102576103b3366004611037565b610c40565b61027f6103c636600461101d565b610cb9565b6102086103d936600461101d565b610cd4565b6102086103ec36600461101d565b610d01565b61027f610d16565b610257610407366004611072565b610d1c565b61020861041a36600461101d565b610d77565b61043261042d36600461101d565b610dc3565b604051610215919061122e565b61025761044d36600461101d565b610e37565b6001600160a01b0381166000908152600260205260408120600301547fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4701480156104b257506001600160a01b038216600090815260026020526040902054155b90505b919050565b6001600160a01b038216600090815260046020908152604080832084845290915281205460ff168061050e57506001600160a01b038316600090815260026020526040902060040154600160a01b900460ff165b90505b92915050565b600080546001600160a01b031633148061053b57506001546001600160a01b031633145b6105605760405162461bcd60e51b8152600401610557906111d8565b60405180910390fd5b6104b261056c83610ef8565b6002610f28565b6000546001600160a01b031633148061059657506001546001600160a01b031633145b6105b25760405162461bcd60e51b8152600401610557906111d8565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b600080546001600160a01b03163314806105f857506001546001600160a01b031633145b6106145760405162461bcd60e51b8152600401610557906111d8565b600061061f83610ef8565b9050600260008281526005602052604090205460ff16600381111561064057fe5b1461064f5760009150506104b5565b6000908152600560205260409020805460ff19166003179055505060068054600019019055600190565b6001600160a01b038216600090815260046020908152604080832084845290915281205460ff161580156106cf57506001600160a01b038316600090815260026020526040902060040154600160a01b900460ff165b156106dc57506000610511565b506001600160a01b0391909116600090815260036020908152604080832093835292905220547ffeedfacecafebeeffeedfacecafebeeffeedfacecafebeeffeedfacecafebeef1890565b60008061073383610ef8565b905060025b60008281526005602052604090205460ff16600381111561075557fe5b10159392505050565b6001600160a01b03166000908152600260208190526040909120015490565b6000546001600160a01b03163314806107a057506001546001600160a01b031633145b6107bc5760405162461bcd60e51b8152600401610557906111d8565b600680546001019055565b6000546001600160a01b03163314806107ea57506001546001600160a01b031633145b6108065760405162461bcd60e51b8152600401610557906111d8565b6001600160a01b038316600081815260036020908152604080832086845282528083207ffeedfacecafebeeffeedfacecafebeeffeedfacecafebeeffeedfacecafebeef86189055928252600481528282208583529052205460ff16610895576001600160a01b03831660009081526004602090815260408083208584529091529020805460ff191660011790555b505050565b6000546001600160a01b03163314806108bd57506001546001600160a01b031633145b6108d95760405162461bcd60e51b8152600401610557906111d8565b6001600160a01b031660009081526002602081905260409091207f56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421918101919091557fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470600390910155565b6001546001600160a01b031681565b6000806109608484610f8e565b905060025b60008281526005602052604090205460ff16600381111561098257fe5b1015949350505050565b6001600160a01b039081166000908152600260205260409020600401541690565b6000806109ba8484610f8e565b90506003610965565b6000546001600160a01b031681565b6000546001600160a01b03163314806109f557506001546001600160a01b031633145b610a115760405162461bcd60e51b8152600401610557906111d8565b6001600160a01b039182166000908152600260208181526040928390208451815590840151600182015591830151908201556060820151600382015560808201516004909101805460a0909301516001600160a01b0319909316919093161760ff60a01b1916600160a01b91151591909102179055565b60075490565b600080546001600160a01b0316331480610ab257506001546001600160a01b031633145b610ace5760405162461bcd60e51b8152600401610557906111d8565b61050e610adb8484610f8e565b6001610f28565b600080546001600160a01b0316331480610b0657506001546001600160a01b031633145b610b225760405162461bcd60e51b8152600401610557906111d8565b61050e61056c8484610f8e565b6000546001600160a01b0316331480610b5257506001546001600160a01b031633145b610b6e5760405162461bcd60e51b8152600401610557906111d8565b600780546001019055565b600080546001600160a01b0316331480610b9d57506001546001600160a01b031633145b610bb95760405162461bcd60e51b8152600401610557906111d8565b6000610bc58484610f8e565b9050600260008281526005602052604090205460ff166003811115610be657fe5b14610bf5576000915050610511565b6000908152600560205260409020805460ff1916600317905550506007805460001901905550600190565b6001600160a01b0316600090815260026020526040902060030154151590565b6000546001600160a01b0316331480610c6357506001546001600160a01b031633145b610c7f5760405162461bcd60e51b8152600401610557906111d8565b6001600160a01b0392831660009081526002602052604090206004810180546001600160a01b031916939094169290921790925560030155565b6001600160a01b031660009081526002602052604090205490565b600080546001600160a01b03838116911614806104b25750506001546001600160a01b0390811691161490565b600080610d0d83610ef8565b90506003610738565b60065490565b6000546001600160a01b0316331480610d3f57506001546001600160a01b031633145b610d5b5760405162461bcd60e51b8152600401610557906111d8565b6001600160a01b03909116600090815260026020526040902055565b600080546001600160a01b0316331480610d9b57506001546001600160a01b031633145b610db75760405162461bcd60e51b8152600401610557906111d8565b6104b2610adb83610ef8565b610dcb610fc1565b506001600160a01b03908116600090815260026020818152604092839020835160c08101855281548152600182015492810192909252918201549281019290925260038101546060830152600401549182166080820152600160a01b90910460ff16151560a082015290565b6000546001600160a01b0316331480610e5a57506001546001600160a01b031633145b610e765760405162461bcd60e51b8152600401610557906111d8565b6001600160a01b03166000908152600260208190526040909120600181557f56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421918101919091557fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4706003820155600401805460ff60a01b1916600160a01b179055565b600081604051602001610f0b9190611171565b604051602081830303815290604052805190602001209050919050565b600080826003811115610f3757fe5b60008581526005602052604090205460ff166003811115610f5457fe5b101590508061050e576000848152600560205260409020805484919060ff19166001836003811115610f8257fe5b02179055509392505050565b60008282604051602001610fa392919061118e565b60405160208183030381529060405280519060200120905092915050565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081019190915290565b80356001600160a01b03811681146104b557600080fd5b803580151581146104b557600080fd5b60006020828403121561102e578081fd5b61050e82610ff6565b60008060006060848603121561104b578182fd5b61105484610ff6565b925061106260208501610ff6565b9150604084013590509250925092565b60008060408385031215611084578182fd5b61108d83610ff6565b946020939093013593505050565b6000806000606084860312156110af578283fd5b6110b884610ff6565b95602085013595506040909401359392505050565b60008082840360e08112156110e0578283fd5b6110e984610ff6565b925060c0601f19820112156110fc578182fd5b5060405160c0810181811067ffffffffffffffff8211171561111a57fe5b80604052506020840135815260408401356020820152606084013560408201526080840135606082015261115060a08501610ff6565b608082015261116160c0850161100d565b60a0820152809150509250929050565b60609190911b6bffffffffffffffffffffffff1916815260140190565b60609290921b6bffffffffffffffffffffffff19168252601482015260340190565b6001600160a01b0391909116815260200190565b901515815260200190565b90815260200190565b60208082526036908201527f46756e6374696f6e2063616e206f6e6c792062652063616c6c65642062792061604082015275757468656e746963617465642061646472657373657360501b606082015260800190565b815181526020808301519082015260408083015190820152606080830151908201526080808301516001600160a01b03169082015260a09182015115159181019190915260c0019056fea26469706673582212205bac84845119d44a384d804ab40cf5b8661877b394d879fd05cdd049485222d964736f6c63430007060033a264697066735822122049d6bdb64f1e5e1bffb7aba87ce3a0db62412188b801b3e899b8b558b75755a364736f6c63430007060033", + "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061002b5760003560e01c80639ed9331814610030575b600080fd5b6100566004803603602081101561004657600080fd5b50356001600160a01b0316610072565b604080516001600160a01b039092168252519081900360200190f35b600081604051610081906100b5565b6001600160a01b03909116815260405190819003602001906000f0801580156100ae573d6000803e3d6000fd5b5092915050565b61133f806100c38339019056fe608060405234801561001057600080fd5b5060405161133f38038061133f83398101604081905261002f91610054565b600080546001600160a01b0319166001600160a01b0392909216919091179055610082565b600060208284031215610065578081fd5b81516001600160a01b038116811461007b578182fd5b9392505050565b6112ae806100916000396000f3fe608060405234801561001057600080fd5b50600436106101f05760003560e01c80638f3b96471161010f578063d126199f116100a2578063e90abb8611610071578063e90abb86146103f9578063fb37b31c1461040c578063fbcbc0f11461041f578063fcf149a21461043f576101f0565b8063d126199f146103b8578063d15d4150146103cb578063d54414c8146103de578063d7bd4a2a146103f1576101f0565b8063c3fd9b25116100de578063c3fd9b2514610377578063c7650bf21461037f578063c8e40fbf14610392578063d0a215f2146103a5576101f0565b80638f3b96471461033657806399056ba914610349578063af37b86414610351578063af3dc01114610364576101f0565b806333f94305116101875780636f3c75af116101565780636f3c75af146102f55780637c8ee703146103085780637e86faa81461031b5780638da5cb5b1461032e576101f0565b806333f94305146102b25780635c17d629146102ba5780636b18e4e8146102cd5780636c87ad20146102e0576101f0565b8063167020d2116101c3578063167020d2146102595780631aaf392f1461026c5780631b208a5a1461028c57806326dc5b121461029f576101f0565b806307a12945146101f55780630ad226791461021e57806311b1f790146102315780631381ba4d14610244575b600080fd5b61020861020336600461101d565b610452565b60405161021591906111c4565b60405180910390f35b61020861022c366004611072565b6104ba565b61020861023f36600461101d565b610517565b61025761025236600461101d565b610573565b005b61020861026736600461101d565b6105d4565b61027f61027a366004611072565b610679565b60405161021591906111cf565b61020861029a36600461101d565b610727565b61027f6102ad36600461101d565b61075e565b61025761077d565b6102576102c836600461109b565b6107c7565b6102576102db36600461101d565b61089a565b6102e8610944565b60405161021591906111b0565b610208610303366004611072565b610953565b6102e861031636600461101d565b61098c565b610208610329366004611072565b6109ad565b6102e86109c3565b6102576103443660046110cd565b6109d2565b61027f610a88565b61020861035f366004611072565b610a8e565b610208610372366004611072565b610ae2565b610257610b2f565b61020861038d366004611072565b610b79565b6102086103a036600461101d565b610c20565b6102576103b3366004611037565b610c40565b61027f6103c636600461101d565b610cb9565b6102086103d936600461101d565b610cd4565b6102086103ec36600461101d565b610d01565b61027f610d16565b610257610407366004611072565b610d1c565b61020861041a36600461101d565b610d77565b61043261042d36600461101d565b610dc3565b604051610215919061122e565b61025761044d36600461101d565b610e37565b6001600160a01b0381166000908152600260205260408120600301547fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4701480156104b257506001600160a01b038216600090815260026020526040902054155b90505b919050565b6001600160a01b038216600090815260046020908152604080832084845290915281205460ff168061050e57506001600160a01b038316600090815260026020526040902060040154600160a01b900460ff165b90505b92915050565b600080546001600160a01b031633148061053b57506001546001600160a01b031633145b6105605760405162461bcd60e51b8152600401610557906111d8565b60405180910390fd5b6104b261056c83610ef8565b6002610f28565b6000546001600160a01b031633148061059657506001546001600160a01b031633145b6105b25760405162461bcd60e51b8152600401610557906111d8565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b600080546001600160a01b03163314806105f857506001546001600160a01b031633145b6106145760405162461bcd60e51b8152600401610557906111d8565b600061061f83610ef8565b9050600260008281526005602052604090205460ff16600381111561064057fe5b1461064f5760009150506104b5565b6000908152600560205260409020805460ff19166003179055505060068054600019019055600190565b6001600160a01b038216600090815260046020908152604080832084845290915281205460ff161580156106cf57506001600160a01b038316600090815260026020526040902060040154600160a01b900460ff165b156106dc57506000610511565b506001600160a01b0391909116600090815260036020908152604080832093835292905220547ffeedfacecafebeeffeedfacecafebeeffeedfacecafebeeffeedfacecafebeef1890565b60008061073383610ef8565b905060025b60008281526005602052604090205460ff16600381111561075557fe5b10159392505050565b6001600160a01b03166000908152600260208190526040909120015490565b6000546001600160a01b03163314806107a057506001546001600160a01b031633145b6107bc5760405162461bcd60e51b8152600401610557906111d8565b600680546001019055565b6000546001600160a01b03163314806107ea57506001546001600160a01b031633145b6108065760405162461bcd60e51b8152600401610557906111d8565b6001600160a01b038316600081815260036020908152604080832086845282528083207ffeedfacecafebeeffeedfacecafebeeffeedfacecafebeeffeedfacecafebeef86189055928252600481528282208583529052205460ff16610895576001600160a01b03831660009081526004602090815260408083208584529091529020805460ff191660011790555b505050565b6000546001600160a01b03163314806108bd57506001546001600160a01b031633145b6108d95760405162461bcd60e51b8152600401610557906111d8565b6001600160a01b031660009081526002602081905260409091207f56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421918101919091557fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470600390910155565b6001546001600160a01b031681565b6000806109608484610f8e565b905060025b60008281526005602052604090205460ff16600381111561098257fe5b1015949350505050565b6001600160a01b039081166000908152600260205260409020600401541690565b6000806109ba8484610f8e565b90506003610965565b6000546001600160a01b031681565b6000546001600160a01b03163314806109f557506001546001600160a01b031633145b610a115760405162461bcd60e51b8152600401610557906111d8565b6001600160a01b039182166000908152600260208181526040928390208451815590840151600182015591830151908201556060820151600382015560808201516004909101805460a0909301516001600160a01b0319909316919093161760ff60a01b1916600160a01b91151591909102179055565b60075490565b600080546001600160a01b0316331480610ab257506001546001600160a01b031633145b610ace5760405162461bcd60e51b8152600401610557906111d8565b61050e610adb8484610f8e565b6001610f28565b600080546001600160a01b0316331480610b0657506001546001600160a01b031633145b610b225760405162461bcd60e51b8152600401610557906111d8565b61050e61056c8484610f8e565b6000546001600160a01b0316331480610b5257506001546001600160a01b031633145b610b6e5760405162461bcd60e51b8152600401610557906111d8565b600780546001019055565b600080546001600160a01b0316331480610b9d57506001546001600160a01b031633145b610bb95760405162461bcd60e51b8152600401610557906111d8565b6000610bc58484610f8e565b9050600260008281526005602052604090205460ff166003811115610be657fe5b14610bf5576000915050610511565b6000908152600560205260409020805460ff1916600317905550506007805460001901905550600190565b6001600160a01b0316600090815260026020526040902060030154151590565b6000546001600160a01b0316331480610c6357506001546001600160a01b031633145b610c7f5760405162461bcd60e51b8152600401610557906111d8565b6001600160a01b0392831660009081526002602052604090206004810180546001600160a01b031916939094169290921790925560030155565b6001600160a01b031660009081526002602052604090205490565b600080546001600160a01b03838116911614806104b25750506001546001600160a01b0390811691161490565b600080610d0d83610ef8565b90506003610738565b60065490565b6000546001600160a01b0316331480610d3f57506001546001600160a01b031633145b610d5b5760405162461bcd60e51b8152600401610557906111d8565b6001600160a01b03909116600090815260026020526040902055565b600080546001600160a01b0316331480610d9b57506001546001600160a01b031633145b610db75760405162461bcd60e51b8152600401610557906111d8565b6104b2610adb83610ef8565b610dcb610fc1565b506001600160a01b03908116600090815260026020818152604092839020835160c08101855281548152600182015492810192909252918201549281019290925260038101546060830152600401549182166080820152600160a01b90910460ff16151560a082015290565b6000546001600160a01b0316331480610e5a57506001546001600160a01b031633145b610e765760405162461bcd60e51b8152600401610557906111d8565b6001600160a01b03166000908152600260208190526040909120600181557f56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421918101919091557fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4706003820155600401805460ff60a01b1916600160a01b179055565b600081604051602001610f0b9190611171565b604051602081830303815290604052805190602001209050919050565b600080826003811115610f3757fe5b60008581526005602052604090205460ff166003811115610f5457fe5b101590508061050e576000848152600560205260409020805484919060ff19166001836003811115610f8257fe5b02179055509392505050565b60008282604051602001610fa392919061118e565b60405160208183030381529060405280519060200120905092915050565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081019190915290565b80356001600160a01b03811681146104b557600080fd5b803580151581146104b557600080fd5b60006020828403121561102e578081fd5b61050e82610ff6565b60008060006060848603121561104b578182fd5b61105484610ff6565b925061106260208501610ff6565b9150604084013590509250925092565b60008060408385031215611084578182fd5b61108d83610ff6565b946020939093013593505050565b6000806000606084860312156110af578283fd5b6110b884610ff6565b95602085013595506040909401359392505050565b60008082840360e08112156110e0578283fd5b6110e984610ff6565b925060c0601f19820112156110fc578182fd5b5060405160c0810181811067ffffffffffffffff8211171561111a57fe5b80604052506020840135815260408401356020820152606084013560408201526080840135606082015261115060a08501610ff6565b608082015261116160c0850161100d565b60a0820152809150509250929050565b60609190911b6bffffffffffffffffffffffff1916815260140190565b60609290921b6bffffffffffffffffffffffff19168252601482015260340190565b6001600160a01b0391909116815260200190565b901515815260200190565b90815260200190565b60208082526036908201527f46756e6374696f6e2063616e206f6e6c792062652063616c6c65642062792061604082015275757468656e746963617465642061646472657373657360501b606082015260800190565b815181526020808301519082015260408083015190820152606080830151908201526080808301516001600160a01b03169082015260a09182015115159181019190915260c0019056fea26469706673582212205bac84845119d44a384d804ab40cf5b8661877b394d879fd05cdd049485222d964736f6c63430007060033a264697066735822122049d6bdb64f1e5e1bffb7aba87ce3a0db62412188b801b3e899b8b558b75755a364736f6c63430007060033", + "devdoc": { + "details": "The State Manager Factory is called by a State Transitioner's init code, to create a new State Manager for use in the Fraud Verification process. Compiler used: solc Runtime target: EVM", + "kind": "dev", + "methods": { + "create(address)": { + "params": { + "_owner": "Owner of the created contract." + }, + "returns": { + "_0": "New OVM_StateManager instance." + } + } + }, + "title": "OVM_StateManagerFactory", + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": { + "create(address)": { + "notice": "Creates a new OVM_StateManager" + } + }, + "version": 1 + }, + "storageLayout": { + "storage": [], + "types": null + } +} \ No newline at end of file diff --git a/packages/contracts/deployments/kovan-v3/OVM_StateTransitionerFactory.json b/packages/contracts/deployments/kovan-v3/OVM_StateTransitionerFactory.json new file mode 100644 index 0000000000000..8c6de8d67c0c3 --- /dev/null +++ b/packages/contracts/deployments/kovan-v3/OVM_StateTransitionerFactory.json @@ -0,0 +1,163 @@ +{ + "address": "0xd6eDb16a89A2EE4484fa8fdCDb11B8B5633c3687", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_libAddressManager", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_libAddressManager", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_stateTransitionIndex", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "_preStateRoot", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "_transactionHash", + "type": "bytes32" + } + ], + "name": "create", + "outputs": [ + { + "internalType": "contract iOVM_StateTransitioner", + "name": "", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "libAddressManager", + "outputs": [ + { + "internalType": "contract Lib_AddressManager", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "_name", + "type": "string" + } + ], + "name": "resolve", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "transactionHash": "0x36cca1310ad53537bb898174d480b15209ef5ad4c1be506c4516c6de43a39de9", + "receipt": { + "to": null, + "from": "0x18394B52d3Cb931dfA76F63251919D051953413d", + "contractAddress": "0xd6eDb16a89A2EE4484fa8fdCDb11B8B5633c3687", + "transactionIndex": 0, + "gasUsed": "4127740", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0x6d044d596657c12c5311fc0306f862a5f678a150f15ef785ab4546deb6f0e3b7", + "transactionHash": "0x36cca1310ad53537bb898174d480b15209ef5ad4c1be506c4516c6de43a39de9", + "logs": [], + "blockNumber": 24572864, + "cumulativeGasUsed": "4127740", + "status": 1, + "byzantium": true + }, + "args": [ + "0xd56F695e73286ac252A37593DD4E7c14270eC1Df" + ], + "solcInputHash": "5ee8e508e2c54cb5ac6783b4855b1558", + "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_stateTransitionIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"_preStateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"_transactionHash\",\"type\":\"bytes32\"}],\"name\":\"create\",\"outputs\":[{\"internalType\":\"contract iOVM_StateTransitioner\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The State Transitioner Factory is used by the Fraud Verifier to create a new State Transitioner during the initialization of a fraud proof. Compiler used: solc Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"create(address,uint256,bytes32,bytes32)\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\",\"_preStateRoot\":\"State root before the transition was executed.\",\"_stateTransitionIndex\":\"Index of the state transition being verified.\",\"_transactionHash\":\"Hash of the executed transaction.\"},\"returns\":{\"_0\":\"New OVM_StateTransitioner instance.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}}},\"title\":\"OVM_StateTransitionerFactory\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"create(address,uint256,bytes32,bytes32)\":{\"notice\":\"Creates a new OVM_StateTransitioner\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/OVM/verification/OVM_StateTransitionerFactory.sol\":\"OVM_StateTransitionerFactory\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor () internal {\\n address msgSender = _msgSender();\\n _owner = msgSender;\\n emit OwnershipTransferred(address(0), msgSender);\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n emit OwnershipTransferred(_owner, address(0));\\n _owner = address(0);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n emit OwnershipTransferred(_owner, newOwner);\\n _owner = newOwner;\\n }\\n}\\n\",\"keccak256\":\"0x15e2d5bd4c28a88548074c54d220e8086f638a71ed07e6b3ba5a70066fcf458d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with GSN meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address payable) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes memory) {\\n this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x8d3cb350f04ff49cfb10aef08d87f19dcbaecc8027b0bed12f3275cd12f38cf0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/verification/Abs_FraudContributor.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\nimport { iOVM_BondManager } from \\\"../../iOVM/verification/iOVM_BondManager.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/// Minimal contract to be inherited by contracts consumed by users that provide\\n/// data for fraud proofs\\nabstract contract Abs_FraudContributor is Lib_AddressResolver {\\n /// Decorate your functions with this modifier to store how much total gas was\\n /// consumed by the sender, to reward users fairly\\n modifier contributesToFraudProof(bytes32 preStateRoot, bytes32 txHash) {\\n uint256 startGas = gasleft();\\n _;\\n uint256 gasSpent = startGas - gasleft();\\n iOVM_BondManager(resolve('OVM_BondManager')).recordGasSpent(preStateRoot, txHash, msg.sender, gasSpent);\\n }\\n}\\n\",\"keccak256\":\"0x6c27d089a297103cb93b30f7649ab68691cc6b948c315f1037e5de1fe9bf5903\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/verification/OVM_StateTransitioner.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// @unsupported: ovm\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\nimport { Lib_EthUtils } from \\\"../../libraries/utils/Lib_EthUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../../libraries/utils/Lib_Bytes32Utils.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../../libraries/utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_SecureMerkleTrie } from \\\"../../libraries/trie/Lib_SecureMerkleTrie.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../../libraries/rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_RLPReader } from \\\"../../libraries/rlp/Lib_RLPReader.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_StateTransitioner } from \\\"../../iOVM/verification/iOVM_StateTransitioner.sol\\\";\\nimport { iOVM_BondManager } from \\\"../../iOVM/verification/iOVM_BondManager.sol\\\";\\nimport { iOVM_ExecutionManager } from \\\"../../iOVM/execution/iOVM_ExecutionManager.sol\\\";\\nimport { iOVM_StateManager } from \\\"../../iOVM/execution/iOVM_StateManager.sol\\\";\\nimport { iOVM_StateManagerFactory } from \\\"../../iOVM/execution/iOVM_StateManagerFactory.sol\\\";\\n\\n/* Contract Imports */\\nimport { Abs_FraudContributor } from \\\"./Abs_FraudContributor.sol\\\";\\n\\n/**\\n * @title OVM_StateTransitioner\\n * @dev The State Transitioner coordinates the execution of a state transition during the evaluation of a\\n * fraud proof. It feeds verified input to the Execution Manager's run(), and controls a State Manager (which is\\n * uniquely created for each fraud proof).\\n * Once a fraud proof has been initialized, this contract is provided with the pre-state root and verifies\\n * that the OVM storage slots committed to the State Mangager are contained in that state\\n * This contract controls the State Manager and Execution Manager, and uses them to calculate the\\n * post-state root by applying the transaction. The Fraud Verifier can then check for fraud by comparing\\n * the calculated post-state root with the proposed post-state root.\\n *\\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract OVM_StateTransitioner is Lib_AddressResolver, Abs_FraudContributor, iOVM_StateTransitioner {\\n\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n enum TransitionPhase {\\n PRE_EXECUTION,\\n POST_EXECUTION,\\n COMPLETE\\n }\\n\\n\\n /*******************************************\\n * Contract Variables: Contract References *\\n *******************************************/\\n\\n iOVM_StateManager public ovmStateManager;\\n\\n\\n /*******************************************\\n * Contract Variables: Internal Accounting *\\n *******************************************/\\n\\n bytes32 internal preStateRoot;\\n bytes32 internal postStateRoot;\\n TransitionPhase public phase;\\n uint256 internal stateTransitionIndex;\\n bytes32 internal transactionHash;\\n\\n\\n /*************\\n * Constants *\\n *************/\\n\\n bytes32 internal constant EMPTY_ACCOUNT_CODE_HASH = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;\\n bytes32 internal constant EMPTY_ACCOUNT_STORAGE_ROOT = 0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n * @param _stateTransitionIndex Index of the state transition being verified.\\n * @param _preStateRoot State root before the transition was executed.\\n * @param _transactionHash Hash of the executed transaction.\\n */\\n constructor(\\n address _libAddressManager,\\n uint256 _stateTransitionIndex,\\n bytes32 _preStateRoot,\\n bytes32 _transactionHash\\n )\\n Lib_AddressResolver(_libAddressManager)\\n {\\n stateTransitionIndex = _stateTransitionIndex;\\n preStateRoot = _preStateRoot;\\n postStateRoot = _preStateRoot;\\n transactionHash = _transactionHash;\\n\\n ovmStateManager = iOVM_StateManagerFactory(resolve(\\\"OVM_StateManagerFactory\\\")).create(address(this));\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n /**\\n * Checks that a function is only run during a specific phase.\\n * @param _phase Phase the function must run within.\\n */\\n modifier onlyDuringPhase(\\n TransitionPhase _phase\\n ) {\\n require(\\n phase == _phase,\\n \\\"Function must be called during the correct phase.\\\"\\n );\\n _;\\n }\\n\\n\\n /**********************************\\n * Public Functions: State Access *\\n **********************************/\\n\\n /**\\n * Retrieves the state root before execution.\\n * @return _preStateRoot State root before execution.\\n */\\n function getPreStateRoot()\\n override\\n public\\n view\\n returns (\\n bytes32 _preStateRoot\\n )\\n {\\n return preStateRoot;\\n }\\n\\n /**\\n * Retrieves the state root after execution.\\n * @return _postStateRoot State root after execution.\\n */\\n function getPostStateRoot()\\n override\\n public\\n view\\n returns (\\n bytes32 _postStateRoot\\n )\\n {\\n return postStateRoot;\\n }\\n\\n /**\\n * Checks whether the transitioner is complete.\\n * @return _complete Whether or not the transition process is finished.\\n */\\n function isComplete()\\n override\\n public\\n view\\n returns (\\n bool _complete\\n )\\n {\\n return phase == TransitionPhase.COMPLETE;\\n }\\n\\n\\n /***********************************\\n * Public Functions: Pre-Execution *\\n ***********************************/\\n\\n /**\\n * Allows a user to prove the initial state of a contract.\\n * @param _ovmContractAddress Address of the contract on the OVM.\\n * @param _ethContractAddress Address of the corresponding contract on L1.\\n * @param _stateTrieWitness Proof of the account state.\\n */\\n function proveContractState(\\n address _ovmContractAddress,\\n address _ethContractAddress,\\n bytes memory _stateTrieWitness\\n )\\n override\\n public\\n onlyDuringPhase(TransitionPhase.PRE_EXECUTION)\\n contributesToFraudProof(preStateRoot, transactionHash)\\n {\\n // Exit quickly to avoid unnecessary work.\\n require(\\n (\\n ovmStateManager.hasAccount(_ovmContractAddress) == false\\n && ovmStateManager.hasEmptyAccount(_ovmContractAddress) == false\\n ),\\n \\\"Account state has already been proven.\\\"\\n );\\n\\n // Function will fail if the proof is not a valid inclusion or exclusion proof.\\n (\\n bool exists,\\n bytes memory encodedAccount\\n ) = Lib_SecureMerkleTrie.get(\\n abi.encodePacked(_ovmContractAddress),\\n _stateTrieWitness,\\n preStateRoot\\n );\\n\\n if (exists == true) {\\n // Account exists, this was an inclusion proof.\\n Lib_OVMCodec.EVMAccount memory account = Lib_OVMCodec.decodeEVMAccount(\\n encodedAccount\\n );\\n\\n address ethContractAddress = _ethContractAddress;\\n if (account.codeHash == EMPTY_ACCOUNT_CODE_HASH) {\\n // Use a known empty contract to prevent an attack in which a user provides a\\n // contract address here and then later deploys code to it.\\n ethContractAddress = 0x0000000000000000000000000000000000000000;\\n } else {\\n // Otherwise, make sure that the code at the provided eth address matches the hash\\n // of the code stored on L2.\\n require(\\n Lib_EthUtils.getCodeHash(ethContractAddress) == account.codeHash,\\n \\\"OVM_StateTransitioner: Provided L1 contract code hash does not match L2 contract code hash.\\\"\\n );\\n }\\n\\n ovmStateManager.putAccount(\\n _ovmContractAddress,\\n Lib_OVMCodec.Account({\\n nonce: account.nonce,\\n balance: account.balance,\\n storageRoot: account.storageRoot,\\n codeHash: account.codeHash,\\n ethAddress: ethContractAddress,\\n isFresh: false\\n })\\n );\\n } else {\\n // Account does not exist, this was an exclusion proof.\\n ovmStateManager.putEmptyAccount(_ovmContractAddress);\\n }\\n }\\n\\n /**\\n * Allows a user to prove the initial state of a contract storage slot.\\n * @param _ovmContractAddress Address of the contract on the OVM.\\n * @param _key Claimed account slot key.\\n * @param _storageTrieWitness Proof of the storage slot.\\n */\\n function proveStorageSlot(\\n address _ovmContractAddress,\\n bytes32 _key,\\n bytes memory _storageTrieWitness\\n )\\n override\\n public\\n onlyDuringPhase(TransitionPhase.PRE_EXECUTION)\\n contributesToFraudProof(preStateRoot, transactionHash)\\n {\\n // Exit quickly to avoid unnecessary work.\\n require(\\n ovmStateManager.hasContractStorage(_ovmContractAddress, _key) == false,\\n \\\"Storage slot has already been proven.\\\"\\n );\\n\\n require(\\n ovmStateManager.hasAccount(_ovmContractAddress) == true,\\n \\\"Contract must be verified before proving a storage slot.\\\"\\n );\\n\\n bytes32 storageRoot = ovmStateManager.getAccountStorageRoot(_ovmContractAddress);\\n bytes32 value;\\n\\n if (storageRoot == EMPTY_ACCOUNT_STORAGE_ROOT) {\\n // Storage trie was empty, so the user is always allowed to insert zero-byte values.\\n value = bytes32(0);\\n } else {\\n // Function will fail if the proof is not a valid inclusion or exclusion proof.\\n (\\n bool exists,\\n bytes memory encodedValue\\n ) = Lib_SecureMerkleTrie.get(\\n abi.encodePacked(_key),\\n _storageTrieWitness,\\n storageRoot\\n );\\n\\n if (exists == true) {\\n // Inclusion proof.\\n // Stored values are RLP encoded, with leading zeros removed.\\n value = Lib_BytesUtils.toBytes32PadLeft(\\n Lib_RLPReader.readBytes(encodedValue)\\n );\\n } else {\\n // Exclusion proof, can only be zero bytes.\\n value = bytes32(0);\\n }\\n }\\n\\n ovmStateManager.putContractStorage(\\n _ovmContractAddress,\\n _key,\\n value\\n );\\n }\\n\\n\\n /*******************************\\n * Public Functions: Execution *\\n *******************************/\\n\\n /**\\n * Executes the state transition.\\n * @param _transaction OVM transaction to execute.\\n */\\n function applyTransaction(\\n Lib_OVMCodec.Transaction memory _transaction\\n )\\n override\\n public\\n onlyDuringPhase(TransitionPhase.PRE_EXECUTION)\\n contributesToFraudProof(preStateRoot, transactionHash)\\n {\\n require(\\n Lib_OVMCodec.hashTransaction(_transaction) == transactionHash,\\n \\\"Invalid transaction provided.\\\"\\n );\\n\\n // We require gas to complete the logic here in run() before/after execution,\\n // But must ensure the full _tx.gasLimit can be given to the ovmCALL (determinism)\\n // This includes 1/64 of the gas getting lost because of EIP-150 (lost twice--first\\n // going into EM, then going into the code contract).\\n require(\\n gasleft() >= 100000 + _transaction.gasLimit * 1032 / 1000, // 1032/1000 = 1.032 = (64/63)^2 rounded up\\n \\\"Not enough gas to execute transaction deterministically.\\\"\\n );\\n\\n iOVM_ExecutionManager ovmExecutionManager = iOVM_ExecutionManager(resolve(\\\"OVM_ExecutionManager\\\"));\\n\\n // We call `setExecutionManager` right before `run` (and not earlier) just in case the\\n // OVM_ExecutionManager address was updated between the time when this contract was created\\n // and when `applyTransaction` was called.\\n ovmStateManager.setExecutionManager(address(ovmExecutionManager));\\n\\n // `run` always succeeds *unless* the user hasn't provided enough gas to `applyTransaction`\\n // or an INVALID_STATE_ACCESS flag was triggered. Either way, we won't get beyond this line\\n // if that's the case.\\n ovmExecutionManager.run(_transaction, address(ovmStateManager));\\n\\n // Prevent the Execution Manager from calling this SM again.\\n ovmStateManager.setExecutionManager(address(0));\\n phase = TransitionPhase.POST_EXECUTION;\\n }\\n\\n\\n /************************************\\n * Public Functions: Post-Execution *\\n ************************************/\\n\\n /**\\n * Allows a user to commit the final state of a contract.\\n * @param _ovmContractAddress Address of the contract on the OVM.\\n * @param _stateTrieWitness Proof of the account state.\\n */\\n function commitContractState(\\n address _ovmContractAddress,\\n bytes memory _stateTrieWitness\\n )\\n override\\n public\\n onlyDuringPhase(TransitionPhase.POST_EXECUTION)\\n contributesToFraudProof(preStateRoot, transactionHash)\\n {\\n require(\\n ovmStateManager.getTotalUncommittedContractStorage() == 0,\\n \\\"All storage must be committed before committing account states.\\\"\\n );\\n\\n require (\\n ovmStateManager.commitAccount(_ovmContractAddress) == true,\\n \\\"Account state wasn't changed or has already been committed.\\\"\\n );\\n\\n Lib_OVMCodec.Account memory account = ovmStateManager.getAccount(_ovmContractAddress);\\n\\n postStateRoot = Lib_SecureMerkleTrie.update(\\n abi.encodePacked(_ovmContractAddress),\\n Lib_OVMCodec.encodeEVMAccount(\\n Lib_OVMCodec.toEVMAccount(account)\\n ),\\n _stateTrieWitness,\\n postStateRoot\\n );\\n\\n // Emit an event to help clients figure out the proof ordering.\\n emit AccountCommitted(\\n _ovmContractAddress\\n );\\n }\\n\\n /**\\n * Allows a user to commit the final state of a contract storage slot.\\n * @param _ovmContractAddress Address of the contract on the OVM.\\n * @param _key Claimed account slot key.\\n * @param _storageTrieWitness Proof of the storage slot.\\n */\\n function commitStorageSlot(\\n address _ovmContractAddress,\\n bytes32 _key,\\n bytes memory _storageTrieWitness\\n )\\n override\\n public\\n onlyDuringPhase(TransitionPhase.POST_EXECUTION)\\n contributesToFraudProof(preStateRoot, transactionHash)\\n {\\n require(\\n ovmStateManager.commitContractStorage(_ovmContractAddress, _key) == true,\\n \\\"Storage slot value wasn't changed or has already been committed.\\\"\\n );\\n\\n Lib_OVMCodec.Account memory account = ovmStateManager.getAccount(_ovmContractAddress);\\n bytes32 value = ovmStateManager.getContractStorage(_ovmContractAddress, _key);\\n\\n account.storageRoot = Lib_SecureMerkleTrie.update(\\n abi.encodePacked(_key),\\n Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(value)\\n ),\\n _storageTrieWitness,\\n account.storageRoot\\n );\\n\\n ovmStateManager.putAccount(_ovmContractAddress, account);\\n\\n // Emit an event to help clients figure out the proof ordering.\\n emit ContractStorageCommitted(\\n _ovmContractAddress,\\n _key\\n );\\n }\\n\\n\\n /**********************************\\n * Public Functions: Finalization *\\n **********************************/\\n\\n /**\\n * Finalizes the transition process.\\n */\\n function completeTransition()\\n override\\n public\\n onlyDuringPhase(TransitionPhase.POST_EXECUTION)\\n {\\n require(\\n ovmStateManager.getTotalUncommittedAccounts() == 0,\\n \\\"All accounts must be committed before completing a transition.\\\"\\n );\\n\\n require(\\n ovmStateManager.getTotalUncommittedContractStorage() == 0,\\n \\\"All storage must be committed before completing a transition.\\\"\\n );\\n\\n phase = TransitionPhase.COMPLETE;\\n }\\n}\\n\",\"keccak256\":\"0xc363807221625338a396c52a4bc3b7439e63972ac87521670c47745641e91fa6\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/verification/OVM_StateTransitionerFactory.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// @unsupported: ovm\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_StateTransitioner } from \\\"../../iOVM/verification/iOVM_StateTransitioner.sol\\\";\\nimport { iOVM_StateTransitionerFactory } from \\\"../../iOVM/verification/iOVM_StateTransitionerFactory.sol\\\";\\nimport { iOVM_FraudVerifier } from \\\"../../iOVM/verification/iOVM_FraudVerifier.sol\\\";\\n\\n/* Contract Imports */\\nimport { OVM_StateTransitioner } from \\\"./OVM_StateTransitioner.sol\\\";\\n\\n/**\\n * @title OVM_StateTransitionerFactory\\n * @dev The State Transitioner Factory is used by the Fraud Verifier to create a new State\\n * Transitioner during the initialization of a fraud proof.\\n *\\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract OVM_StateTransitionerFactory is iOVM_StateTransitionerFactory, Lib_AddressResolver {\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n constructor(\\n address _libAddressManager\\n )\\n Lib_AddressResolver(_libAddressManager)\\n {}\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Creates a new OVM_StateTransitioner\\n * @param _libAddressManager Address of the Address Manager.\\n * @param _stateTransitionIndex Index of the state transition being verified.\\n * @param _preStateRoot State root before the transition was executed.\\n * @param _transactionHash Hash of the executed transaction.\\n * @return New OVM_StateTransitioner instance.\\n */\\n function create(\\n address _libAddressManager,\\n uint256 _stateTransitionIndex,\\n bytes32 _preStateRoot,\\n bytes32 _transactionHash\\n )\\n override\\n public\\n returns (\\n iOVM_StateTransitioner\\n )\\n {\\n require(\\n msg.sender == resolve(\\\"OVM_FraudVerifier\\\"),\\n \\\"Create can only be done by the OVM_FraudVerifier.\\\"\\n );\\n\\n return new OVM_StateTransitioner(\\n _libAddressManager,\\n _stateTransitionIndex,\\n _preStateRoot,\\n _transactionHash\\n );\\n }\\n}\\n\",\"keccak256\":\"0x65ef11334a2d6931b6d3a85e7b29c39c774d19443e7040e132a58be505e3b52c\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/execution/iOVM_ExecutionManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\ninterface iOVM_ExecutionManager {\\n /**********\\n * Enums *\\n *********/\\n\\n enum RevertFlag {\\n OUT_OF_GAS,\\n INTENTIONAL_REVERT,\\n EXCEEDS_NUISANCE_GAS,\\n INVALID_STATE_ACCESS,\\n UNSAFE_BYTECODE,\\n CREATE_COLLISION,\\n STATIC_VIOLATION,\\n CREATOR_NOT_ALLOWED\\n }\\n\\n enum GasMetadataKey {\\n CURRENT_EPOCH_START_TIMESTAMP,\\n CUMULATIVE_SEQUENCER_QUEUE_GAS,\\n CUMULATIVE_L1TOL2_QUEUE_GAS,\\n PREV_EPOCH_SEQUENCER_QUEUE_GAS,\\n PREV_EPOCH_L1TOL2_QUEUE_GAS\\n }\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct GasMeterConfig {\\n uint256 minTransactionGasLimit;\\n uint256 maxTransactionGasLimit;\\n uint256 maxGasPerQueuePerEpoch;\\n uint256 secondsPerEpoch;\\n }\\n\\n struct GlobalContext {\\n uint256 ovmCHAINID;\\n }\\n\\n struct TransactionContext {\\n Lib_OVMCodec.QueueOrigin ovmL1QUEUEORIGIN;\\n uint256 ovmTIMESTAMP;\\n uint256 ovmNUMBER;\\n uint256 ovmGASLIMIT;\\n uint256 ovmTXGASLIMIT;\\n address ovmL1TXORIGIN;\\n }\\n\\n struct TransactionRecord {\\n uint256 ovmGasRefund;\\n }\\n\\n struct MessageContext {\\n address ovmCALLER;\\n address ovmADDRESS;\\n bool isStatic;\\n }\\n\\n struct MessageRecord {\\n uint256 nuisanceGasLeft;\\n }\\n\\n\\n /************************************\\n * Transaction Execution Entrypoint *\\n ************************************/\\n\\n function run(\\n Lib_OVMCodec.Transaction calldata _transaction,\\n address _txStateManager\\n ) external returns (bytes memory);\\n\\n\\n /*******************\\n * Context Opcodes *\\n *******************/\\n\\n function ovmCALLER() external view returns (address _caller);\\n function ovmADDRESS() external view returns (address _address);\\n function ovmTIMESTAMP() external view returns (uint256 _timestamp);\\n function ovmNUMBER() external view returns (uint256 _number);\\n function ovmGASLIMIT() external view returns (uint256 _gasLimit);\\n function ovmCHAINID() external view returns (uint256 _chainId);\\n\\n\\n /**********************\\n * L2 Context Opcodes *\\n **********************/\\n\\n function ovmL1QUEUEORIGIN() external view returns (Lib_OVMCodec.QueueOrigin _queueOrigin);\\n function ovmL1TXORIGIN() external view returns (address _l1TxOrigin);\\n\\n\\n /*******************\\n * Halting Opcodes *\\n *******************/\\n\\n function ovmREVERT(bytes memory _data) external;\\n\\n\\n /*****************************\\n * Contract Creation Opcodes *\\n *****************************/\\n\\n function ovmCREATE(bytes memory _bytecode) external returns (address _contract, bytes memory _revertdata);\\n function ovmCREATE2(bytes memory _bytecode, bytes32 _salt) external returns (address _contract, bytes memory _revertdata);\\n\\n\\n /*******************************\\n * Account Abstraction Opcodes *\\n ******************************/\\n\\n function ovmGETNONCE() external returns (uint256 _nonce);\\n function ovmINCREMENTNONCE() external;\\n function ovmCREATEEOA(bytes32 _messageHash, uint8 _v, bytes32 _r, bytes32 _s) external;\\n\\n\\n /****************************\\n * Contract Calling Opcodes *\\n ****************************/\\n\\n function ovmCALL(uint256 _gasLimit, address _address, bytes memory _calldata) external returns (bool _success, bytes memory _returndata);\\n function ovmSTATICCALL(uint256 _gasLimit, address _address, bytes memory _calldata) external returns (bool _success, bytes memory _returndata);\\n function ovmDELEGATECALL(uint256 _gasLimit, address _address, bytes memory _calldata) external returns (bool _success, bytes memory _returndata);\\n\\n\\n /****************************\\n * Contract Storage Opcodes *\\n ****************************/\\n\\n function ovmSLOAD(bytes32 _key) external returns (bytes32 _value);\\n function ovmSSTORE(bytes32 _key, bytes32 _value) external;\\n\\n\\n /*************************\\n * Contract Code Opcodes *\\n *************************/\\n\\n function ovmEXTCODECOPY(address _contract, uint256 _offset, uint256 _length) external returns (bytes memory _code);\\n function ovmEXTCODESIZE(address _contract) external returns (uint256 _size);\\n function ovmEXTCODEHASH(address _contract) external returns (bytes32 _hash);\\n\\n\\n /***************************************\\n * Public Functions: Execution Context *\\n ***************************************/\\n\\n function getMaxTransactionGasLimit() external view returns (uint _maxTransactionGasLimit);\\n}\\n\",\"keccak256\":\"0xf023d5d6fc6a03bd52f7a57af6e21076de77e8925d065bb79db062e73e43b684\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/execution/iOVM_StateManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title iOVM_StateManager\\n */\\ninterface iOVM_StateManager {\\n\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n enum ItemState {\\n ITEM_UNTOUCHED,\\n ITEM_LOADED,\\n ITEM_CHANGED,\\n ITEM_COMMITTED\\n }\\n\\n /***************************\\n * Public Functions: Misc *\\n ***************************/\\n\\n function isAuthenticated(address _address) external view returns (bool);\\n\\n /***************************\\n * Public Functions: Setup *\\n ***************************/\\n\\n function owner() external view returns (address _owner);\\n function ovmExecutionManager() external view returns (address _ovmExecutionManager);\\n function setExecutionManager(address _ovmExecutionManager) external;\\n\\n\\n /************************************\\n * Public Functions: Account Access *\\n ************************************/\\n\\n function putAccount(address _address, Lib_OVMCodec.Account memory _account) external;\\n function putEmptyAccount(address _address) external;\\n function getAccount(address _address) external view returns (Lib_OVMCodec.Account memory _account);\\n function hasAccount(address _address) external view returns (bool _exists);\\n function hasEmptyAccount(address _address) external view returns (bool _exists);\\n function setAccountNonce(address _address, uint256 _nonce) external;\\n function getAccountNonce(address _address) external view returns (uint256 _nonce);\\n function getAccountEthAddress(address _address) external view returns (address _ethAddress);\\n function getAccountStorageRoot(address _address) external view returns (bytes32 _storageRoot);\\n function initPendingAccount(address _address) external;\\n function commitPendingAccount(address _address, address _ethAddress, bytes32 _codeHash) external;\\n function testAndSetAccountLoaded(address _address) external returns (bool _wasAccountAlreadyLoaded);\\n function testAndSetAccountChanged(address _address) external returns (bool _wasAccountAlreadyChanged);\\n function commitAccount(address _address) external returns (bool _wasAccountCommitted);\\n function incrementTotalUncommittedAccounts() external;\\n function getTotalUncommittedAccounts() external view returns (uint256 _total);\\n function wasAccountChanged(address _address) external view returns (bool);\\n function wasAccountCommitted(address _address) external view returns (bool);\\n\\n\\n /************************************\\n * Public Functions: Storage Access *\\n ************************************/\\n\\n function putContractStorage(address _contract, bytes32 _key, bytes32 _value) external;\\n function getContractStorage(address _contract, bytes32 _key) external view returns (bytes32 _value);\\n function hasContractStorage(address _contract, bytes32 _key) external view returns (bool _exists);\\n function testAndSetContractStorageLoaded(address _contract, bytes32 _key) external returns (bool _wasContractStorageAlreadyLoaded);\\n function testAndSetContractStorageChanged(address _contract, bytes32 _key) external returns (bool _wasContractStorageAlreadyChanged);\\n function commitContractStorage(address _contract, bytes32 _key) external returns (bool _wasContractStorageCommitted);\\n function incrementTotalUncommittedContractStorage() external;\\n function getTotalUncommittedContractStorage() external view returns (uint256 _total);\\n function wasContractStorageChanged(address _contract, bytes32 _key) external view returns (bool);\\n function wasContractStorageCommitted(address _contract, bytes32 _key) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x7a11dbd1f61593ba34debe07e39eef59967307f7f372ba9855bee0953585d08d\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/execution/iOVM_StateManagerFactory.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Contract Imports */\\nimport { iOVM_StateManager } from \\\"./iOVM_StateManager.sol\\\";\\n\\n/**\\n * @title iOVM_StateManagerFactory\\n */\\ninterface iOVM_StateManagerFactory {\\n\\n /***************************************\\n * Public Functions: Contract Creation *\\n ***************************************/\\n\\n function create(\\n address _owner\\n )\\n external\\n returns (\\n iOVM_StateManager _ovmStateManager\\n );\\n}\\n\",\"keccak256\":\"0x27a90fc43889d0c7d1db50f37907ef7386d9b415d15a1e91a0a068cba59afd36\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/verification/iOVM_BondManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\ninterface ERC20 {\\n function transfer(address, uint256) external returns (bool);\\n function transferFrom(address, address, uint256) external returns (bool);\\n}\\n\\n/// All the errors which may be encountered on the bond manager\\nlibrary Errors {\\n string constant ERC20_ERR = \\\"BondManager: Could not post bond\\\";\\n string constant ALREADY_FINALIZED = \\\"BondManager: Fraud proof for this pre-state root has already been finalized\\\";\\n string constant SLASHED = \\\"BondManager: Cannot finalize withdrawal, you probably got slashed\\\";\\n string constant WRONG_STATE = \\\"BondManager: Wrong bond state for proposer\\\";\\n string constant CANNOT_CLAIM = \\\"BondManager: Cannot claim yet. Dispute must be finalized first\\\";\\n\\n string constant WITHDRAWAL_PENDING = \\\"BondManager: Withdrawal already pending\\\";\\n string constant TOO_EARLY = \\\"BondManager: Too early to finalize your withdrawal\\\";\\n\\n string constant ONLY_TRANSITIONER = \\\"BondManager: Only the transitioner for this pre-state root may call this function\\\";\\n string constant ONLY_FRAUD_VERIFIER = \\\"BondManager: Only the fraud verifier may call this function\\\";\\n string constant ONLY_STATE_COMMITMENT_CHAIN = \\\"BondManager: Only the state commitment chain may call this function\\\";\\n string constant WAIT_FOR_DISPUTES = \\\"BondManager: Wait for other potential disputes\\\";\\n}\\n\\n/**\\n * @title iOVM_BondManager\\n */\\ninterface iOVM_BondManager {\\n\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n /// The lifecycle of a proposer's bond\\n enum State {\\n // Before depositing or after getting slashed, a user is uncollateralized\\n NOT_COLLATERALIZED,\\n // After depositing, a user is collateralized\\n COLLATERALIZED,\\n // After a user has initiated a withdrawal\\n WITHDRAWING\\n }\\n\\n /// A bond posted by a proposer\\n struct Bond {\\n // The user's state\\n State state;\\n // The timestamp at which a proposer issued their withdrawal request\\n uint32 withdrawalTimestamp;\\n // The time when the first disputed was initiated for this bond\\n uint256 firstDisputeAt;\\n // The earliest observed state root for this bond which has had fraud\\n bytes32 earliestDisputedStateRoot;\\n // The state root's timestamp\\n uint256 earliestTimestamp;\\n }\\n\\n // Per pre-state root, store the number of state provisions that were made\\n // and how many of these calls were made by each user. Payouts will then be\\n // claimed by users proportionally for that dispute.\\n struct Rewards {\\n // Flag to check if rewards for a fraud proof are claimable\\n bool canClaim;\\n // Total number of `recordGasSpent` calls made\\n uint256 total;\\n // The gas spent by each user to provide witness data. The sum of all\\n // values inside this map MUST be equal to the value of `total`\\n mapping(address => uint256) gasSpent;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function recordGasSpent(\\n bytes32 _preStateRoot,\\n bytes32 _txHash,\\n address _who,\\n uint256 _gasSpent\\n ) external;\\n\\n function finalize(\\n bytes32 _preStateRoot,\\n address _publisher,\\n uint256 _timestamp\\n ) external;\\n\\n function deposit() external;\\n\\n function startWithdrawal() external;\\n\\n function finalizeWithdrawal() external;\\n\\n function claim(\\n address _who\\n ) external;\\n\\n function isCollateralized(\\n address _who\\n ) external view returns (bool);\\n\\n function getGasSpent(\\n bytes32 _preStateRoot,\\n address _who\\n ) external view returns (uint256);\\n}\\n\",\"keccak256\":\"0x3c2a8a399487857158649db1896749d86e39cba545a8aeb2e2bb0f3bdfa7a5b1\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/verification/iOVM_FraudVerifier.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_StateTransitioner } from \\\"./iOVM_StateTransitioner.sol\\\";\\n\\n/**\\n * @title iOVM_FraudVerifier\\n */\\ninterface iOVM_FraudVerifier {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event FraudProofInitialized(\\n bytes32 _preStateRoot,\\n uint256 _preStateRootIndex,\\n bytes32 _transactionHash,\\n address _who\\n );\\n\\n event FraudProofFinalized(\\n bytes32 _preStateRoot,\\n uint256 _preStateRootIndex,\\n bytes32 _transactionHash,\\n address _who\\n );\\n\\n\\n /***************************************\\n * Public Functions: Transition Status *\\n ***************************************/\\n\\n function getStateTransitioner(bytes32 _preStateRoot, bytes32 _txHash) external view returns (iOVM_StateTransitioner _transitioner);\\n\\n\\n /****************************************\\n * Public Functions: Fraud Verification *\\n ****************************************/\\n\\n function initializeFraudVerification(\\n bytes32 _preStateRoot,\\n Lib_OVMCodec.ChainBatchHeader calldata _preStateRootBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof calldata _preStateRootProof,\\n Lib_OVMCodec.Transaction calldata _transaction,\\n Lib_OVMCodec.TransactionChainElement calldata _txChainElement,\\n Lib_OVMCodec.ChainBatchHeader calldata _transactionBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof calldata _transactionProof\\n ) external;\\n\\n function finalizeFraudVerification(\\n bytes32 _preStateRoot,\\n Lib_OVMCodec.ChainBatchHeader calldata _preStateRootBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof calldata _preStateRootProof,\\n bytes32 _txHash,\\n bytes32 _postStateRoot,\\n Lib_OVMCodec.ChainBatchHeader calldata _postStateRootBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof calldata _postStateRootProof\\n ) external;\\n}\\n\",\"keccak256\":\"0x5efd7bb18164bbd3e9d58379e8203fbf2a7ee802b1a48dff3ceaaec1523b1751\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/verification/iOVM_StateTransitioner.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title iOVM_StateTransitioner\\n */\\ninterface iOVM_StateTransitioner {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AccountCommitted(\\n address _address\\n );\\n\\n event ContractStorageCommitted(\\n address _address,\\n bytes32 _key\\n );\\n\\n\\n /**********************************\\n * Public Functions: State Access *\\n **********************************/\\n\\n function getPreStateRoot() external view returns (bytes32 _preStateRoot);\\n function getPostStateRoot() external view returns (bytes32 _postStateRoot);\\n function isComplete() external view returns (bool _complete);\\n\\n\\n /***********************************\\n * Public Functions: Pre-Execution *\\n ***********************************/\\n\\n function proveContractState(\\n address _ovmContractAddress,\\n address _ethContractAddress,\\n bytes calldata _stateTrieWitness\\n ) external;\\n\\n function proveStorageSlot(\\n address _ovmContractAddress,\\n bytes32 _key,\\n bytes calldata _storageTrieWitness\\n ) external;\\n\\n\\n /*******************************\\n * Public Functions: Execution *\\n *******************************/\\n\\n function applyTransaction(\\n Lib_OVMCodec.Transaction calldata _transaction\\n ) external;\\n\\n\\n /************************************\\n * Public Functions: Post-Execution *\\n ************************************/\\n\\n function commitContractState(\\n address _ovmContractAddress,\\n bytes calldata _stateTrieWitness\\n ) external;\\n\\n function commitStorageSlot(\\n address _ovmContractAddress,\\n bytes32 _key,\\n bytes calldata _storageTrieWitness\\n ) external;\\n\\n\\n /**********************************\\n * Public Functions: Finalization *\\n **********************************/\\n\\n function completeTransition() external;\\n}\\n\",\"keccak256\":\"0x3d044ac0a3bb6ad3d529f904b3191117511f9c379678ca03010e1ebdfcb5c34b\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/verification/iOVM_StateTransitionerFactory.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Contract Imports */\\nimport { iOVM_StateTransitioner } from \\\"./iOVM_StateTransitioner.sol\\\";\\n\\n/**\\n * @title iOVM_StateTransitionerFactory\\n */\\ninterface iOVM_StateTransitionerFactory {\\n\\n /***************************************\\n * Public Functions: Contract Creation *\\n ***************************************/\\n\\n function create(\\n address _proxyManager,\\n uint256 _stateTransitionIndex,\\n bytes32 _preStateRoot,\\n bytes32 _transactionHash\\n )\\n external\\n returns (\\n iOVM_StateTransitioner _ovmStateTransitioner\\n );\\n}\\n\",\"keccak256\":\"0x60a0f0c104e4c0c7863268a93005762e8146d393f9cfddfdd6a2d6585c5911fc\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/codec/Lib_OVMCodec.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../utils/Lib_Bytes32Utils.sol\\\";\\n\\n/**\\n * @title Lib_OVMCodec\\n */\\nlibrary Lib_OVMCodec {\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum QueueOrigin {\\n SEQUENCER_QUEUE,\\n L1TOL2_QUEUE\\n }\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Account {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n address ethAddress;\\n bool isFresh;\\n }\\n\\n struct EVMAccount {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n }\\n\\n struct ChainBatchHeader {\\n uint256 batchIndex;\\n bytes32 batchRoot;\\n uint256 batchSize;\\n uint256 prevTotalElements;\\n bytes extraData;\\n }\\n\\n struct ChainInclusionProof {\\n uint256 index;\\n bytes32[] siblings;\\n }\\n\\n struct Transaction {\\n uint256 timestamp;\\n uint256 blockNumber;\\n QueueOrigin l1QueueOrigin;\\n address l1TxOrigin;\\n address entrypoint;\\n uint256 gasLimit;\\n bytes data;\\n }\\n\\n struct TransactionChainElement {\\n bool isSequenced;\\n uint256 queueIndex; // QUEUED TX ONLY\\n uint256 timestamp; // SEQUENCER TX ONLY\\n uint256 blockNumber; // SEQUENCER TX ONLY\\n bytes txData; // SEQUENCER TX ONLY\\n }\\n\\n struct QueueElement {\\n bytes32 transactionHash;\\n uint40 timestamp;\\n uint40 blockNumber;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Encodes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Encoded transaction bytes.\\n */\\n function encodeTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return abi.encodePacked(\\n _transaction.timestamp,\\n _transaction.blockNumber,\\n _transaction.l1QueueOrigin,\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n );\\n }\\n\\n /**\\n * Hashes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Hashed transaction\\n */\\n function hashTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(encodeTransaction(_transaction));\\n }\\n\\n /**\\n * Converts an OVM account to an EVM account.\\n * @param _in OVM account to convert.\\n * @return Converted EVM account.\\n */\\n function toEVMAccount(\\n Account memory _in\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n return EVMAccount({\\n nonce: _in.nonce,\\n balance: _in.balance,\\n storageRoot: _in.storageRoot,\\n codeHash: _in.codeHash\\n });\\n }\\n\\n /**\\n * @notice RLP-encodes an account state struct.\\n * @param _account Account state struct.\\n * @return RLP-encoded account state.\\n */\\n function encodeEVMAccount(\\n EVMAccount memory _account\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes[] memory raw = new bytes[](4);\\n\\n // Unfortunately we can't create this array outright because\\n // Lib_RLPWriter.writeList will reject fixed-size arrays. Assigning\\n // index-by-index circumvents this issue.\\n raw[0] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.nonce)\\n )\\n );\\n raw[1] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.balance)\\n )\\n );\\n raw[2] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.storageRoot));\\n raw[3] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.codeHash));\\n\\n return Lib_RLPWriter.writeList(raw);\\n }\\n\\n /**\\n * @notice Decodes an RLP-encoded account state into a useful struct.\\n * @param _encoded RLP-encoded account state.\\n * @return Account state struct.\\n */\\n function decodeEVMAccount(\\n bytes memory _encoded\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\\n\\n return EVMAccount({\\n nonce: Lib_RLPReader.readUint256(accountState[0]),\\n balance: Lib_RLPReader.readUint256(accountState[1]),\\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\\n });\\n }\\n\\n /**\\n * Calculates a hash for a given batch header.\\n * @param _batchHeader Header to hash.\\n * @return Hash of the header.\\n */\\n function hashBatchHeader(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(\\n abi.encode(\\n _batchHeader.batchRoot,\\n _batchHeader.batchSize,\\n _batchHeader.prevTotalElements,\\n _batchHeader.extraData\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0xd85ba2066057a2677926f484b938c7c2ef33ff3853f3b71cda252f4a54f30e05\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n public\\n onlyOwner\\n {\\n addresses[_getNameHash(_name)] = _address;\\n\\n emit AddressSet(\\n _name,\\n _address\\n );\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0x2ce671a0e004df88b136bea5a3c59d0732cea8887c8496da1d509e0200b03d7d\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(\\n address _libAddressManager\\n ) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x65981feeabff6a81783ea97d44baf988a18a86c8cb374c46fdb71819cbacc7c0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPReader.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_RLPReader\\n * @dev Adapted from \\\"RLPReader\\\" by Hamdi Allam (hamdi.allam97@gmail.com).\\n */\\nlibrary Lib_RLPReader {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 constant internal MAX_LIST_LENGTH = 32;\\n\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum RLPItemType {\\n DATA_ITEM,\\n LIST_ITEM\\n }\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct RLPItem {\\n uint256 length;\\n uint256 ptr;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts bytes to a reference to memory position and length.\\n * @param _in Input bytes to convert.\\n * @return Output memory reference.\\n */\\n function toRLPItem(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem memory\\n )\\n {\\n uint256 ptr;\\n assembly {\\n ptr := add(_in, 32)\\n }\\n\\n return RLPItem({\\n length: _in.length,\\n ptr: ptr\\n });\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n (\\n uint256 listOffset,\\n ,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.LIST_ITEM,\\n \\\"Invalid RLP list value.\\\"\\n );\\n\\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\\n // writing to the length. Since we can't know the number of RLP items without looping over\\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\\n // simply set a reasonable maximum list length and decrease the size before we finish.\\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\\n\\n uint256 itemCount = 0;\\n uint256 offset = listOffset;\\n while (offset < _in.length) {\\n require(\\n itemCount < MAX_LIST_LENGTH,\\n \\\"Provided RLP list exceeds max list length.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n ) = _decodeLength(RLPItem({\\n length: _in.length - offset,\\n ptr: _in.ptr + offset\\n }));\\n\\n out[itemCount] = RLPItem({\\n length: itemLength + itemOffset,\\n ptr: _in.ptr + offset\\n });\\n\\n itemCount += 1;\\n offset += itemOffset + itemLength;\\n }\\n\\n // Decrease the array size to match the actual item count.\\n assembly {\\n mstore(out, itemCount)\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n return readList(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes value.\\\"\\n );\\n\\n return _copy(_in.ptr, itemOffset, itemLength);\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return readBytes(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return string(readBytes(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return readString(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n require(\\n _in.length <= 33,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr + itemOffset;\\n bytes32 out;\\n assembly {\\n out := mload(ptr)\\n\\n // Shift the bytes over to match the item size.\\n if lt(itemLength, 32) {\\n out := div(out, exp(256, sub(32, itemLength)))\\n }\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return readBytes32(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return uint256(readBytes32(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return readUint256(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n require(\\n _in.length == 1,\\n \\\"Invalid RLP boolean value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 out;\\n assembly {\\n out := byte(0, mload(ptr))\\n }\\n\\n require(\\n out == 0 || out == 1,\\n \\\"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\\\"\\n );\\n\\n return out != 0;\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return readBool(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n if (_in.length == 1) {\\n return address(0);\\n }\\n\\n require(\\n _in.length == 21,\\n \\\"Invalid RLP address value.\\\"\\n );\\n\\n return address(readUint256(_in));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return readAddress(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads the raw bytes of an RLP item.\\n * @param _in RLP item to read.\\n * @return Raw RLP bytes.\\n */\\n function readRawBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in);\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Decodes the length of an RLP item.\\n * @param _in RLP item to decode.\\n * @return Offset of the encoded data.\\n * @return Length of the encoded data.\\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\\n */\\n function _decodeLength(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n uint256,\\n uint256,\\n RLPItemType\\n )\\n {\\n require(\\n _in.length > 0,\\n \\\"RLP item cannot be null.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 prefix;\\n assembly {\\n prefix := byte(0, mload(ptr))\\n }\\n\\n if (prefix <= 0x7f) {\\n // Single byte.\\n\\n return (0, 1, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xb7) {\\n // Short string.\\n\\n uint256 strLen = prefix - 0x80;\\n\\n require(\\n _in.length > strLen,\\n \\\"Invalid RLP short string.\\\"\\n );\\n\\n return (1, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xbf) {\\n // Long string.\\n uint256 lenOfStrLen = prefix - 0xb7;\\n\\n require(\\n _in.length > lenOfStrLen,\\n \\\"Invalid RLP long string length.\\\"\\n );\\n\\n uint256 strLen;\\n assembly {\\n // Pick out the string length.\\n strLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfStrLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfStrLen + strLen,\\n \\\"Invalid RLP long string.\\\"\\n );\\n\\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xf7) {\\n // Short list.\\n uint256 listLen = prefix - 0xc0;\\n\\n require(\\n _in.length > listLen,\\n \\\"Invalid RLP short list.\\\"\\n );\\n\\n return (1, listLen, RLPItemType.LIST_ITEM);\\n } else {\\n // Long list.\\n uint256 lenOfListLen = prefix - 0xf7;\\n\\n require(\\n _in.length > lenOfListLen,\\n \\\"Invalid RLP long list length.\\\"\\n );\\n\\n uint256 listLen;\\n assembly {\\n // Pick out the list length.\\n listLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfListLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfListLen + listLen,\\n \\\"Invalid RLP long list.\\\"\\n );\\n\\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\\n }\\n }\\n\\n /**\\n * Copies the bytes from a memory location.\\n * @param _src Pointer to the location to read from.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Copied bytes.\\n */\\n function _copy(\\n uint256 _src,\\n uint256 _offset,\\n uint256 _length\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out = new bytes(_length);\\n if (out.length == 0) {\\n return out;\\n }\\n\\n uint256 src = _src + _offset;\\n uint256 dest;\\n assembly {\\n dest := add(out, 32)\\n }\\n\\n // Copy over as many complete words as we can.\\n for (uint256 i = 0; i < _length / 32; i++) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n\\n src += 32;\\n dest += 32;\\n }\\n\\n // Pick out the remaining bytes.\\n uint256 mask = 256 ** (32 - (_length % 32)) - 1;\\n assembly {\\n mstore(\\n dest,\\n or(\\n and(mload(src), not(mask)),\\n and(mload(dest), mask)\\n )\\n )\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Copies an RLP item into bytes.\\n * @param _in RLP item to copy.\\n * @return Copied bytes.\\n */\\n function _copy(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in.ptr, 0, _in.length);\\n }\\n}\\n\",\"keccak256\":\"0x829174c61216dce35fdb888383b6022e0365eb7fbdc71ad79d98b108091969fe\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPWriter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/**\\n * @title Lib_RLPWriter\\n * @author Bakaoh (with modifications)\\n */\\nlibrary Lib_RLPWriter {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * RLP encodes a byte string.\\n * @param _in The byte string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded;\\n\\n if (_in.length == 1 && uint8(_in[0]) < 128) {\\n encoded = _in;\\n } else {\\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * RLP encodes a list of RLP encoded byte byte strings.\\n * @param _in The list of RLP encoded byte strings.\\n * @return The RLP encoded list of items in bytes.\\n */\\n function writeList(\\n bytes[] memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory list = _flatten(_in);\\n return abi.encodePacked(_writeLength(list.length, 192), list);\\n }\\n\\n /**\\n * RLP encodes a string.\\n * @param _in The string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeString(\\n string memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(bytes(_in));\\n }\\n\\n /**\\n * RLP encodes an address.\\n * @param _in The address to encode.\\n * @return The RLP encoded address in bytes.\\n */\\n function writeAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a bytes32 value.\\n * @param _in The bytes32 to encode.\\n * @return _out The RLP encoded bytes32 in bytes.\\n */\\n function writeBytes32(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a uint.\\n * @param _in The uint256 to encode.\\n * @return The RLP encoded uint256 in bytes.\\n */\\n function writeUint(\\n uint256 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(_toBinary(_in));\\n }\\n\\n /**\\n * RLP encodes a bool.\\n * @param _in The bool to encode.\\n * @return The RLP encoded bool in bytes.\\n */\\n function writeBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded = new bytes(1);\\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\\n return encoded;\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\\n * @param _len The length of the string or the payload.\\n * @param _offset 128 if item is string, 192 if item is list.\\n * @return RLP encoded bytes.\\n */\\n function _writeLength(\\n uint256 _len,\\n uint256 _offset\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded;\\n\\n if (_len < 56) {\\n encoded = new bytes(1);\\n encoded[0] = byte(uint8(_len) + uint8(_offset));\\n } else {\\n uint256 lenLen;\\n uint256 i = 1;\\n while (_len / i != 0) {\\n lenLen++;\\n i *= 256;\\n }\\n\\n encoded = new bytes(lenLen + 1);\\n encoded[0] = byte(uint8(lenLen) + uint8(_offset) + 55);\\n for(i = 1; i <= lenLen; i++) {\\n encoded[i] = byte(uint8((_len / (256**(lenLen-i))) % 256));\\n }\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * Encode integer in big endian binary form with no leading zeroes.\\n * @notice TODO: This should be optimized with assembly to save gas costs.\\n * @param _x The integer to encode.\\n * @return RLP encoded bytes.\\n */\\n function _toBinary(\\n uint256 _x\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory b = abi.encodePacked(_x);\\n\\n uint256 i = 0;\\n for (; i < 32; i++) {\\n if (b[i] != 0) {\\n break;\\n }\\n }\\n\\n bytes memory res = new bytes(32 - i);\\n for (uint256 j = 0; j < res.length; j++) {\\n res[j] = b[i++];\\n }\\n\\n return res;\\n }\\n\\n /**\\n * Copies a piece of memory to another location.\\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\\n * @param _dest Destination location.\\n * @param _src Source location.\\n * @param _len Length of memory to copy.\\n */\\n function _memcpy(\\n uint256 _dest,\\n uint256 _src,\\n uint256 _len\\n )\\n private\\n pure\\n {\\n uint256 dest = _dest;\\n uint256 src = _src;\\n uint256 len = _len;\\n\\n for(; len >= 32; len -= 32) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n dest += 32;\\n src += 32;\\n }\\n\\n uint256 mask = 256 ** (32 - len) - 1;\\n assembly {\\n let srcpart := and(mload(src), not(mask))\\n let destpart := and(mload(dest), mask)\\n mstore(dest, or(destpart, srcpart))\\n }\\n }\\n\\n /**\\n * Flattens a list of byte strings into one byte string.\\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\\n * @param _list List of byte strings to flatten.\\n * @return The flattened byte string.\\n */\\n function _flatten(\\n bytes[] memory _list\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n if (_list.length == 0) {\\n return new bytes(0);\\n }\\n\\n uint256 len;\\n uint256 i = 0;\\n for (; i < _list.length; i++) {\\n len += _list[i].length;\\n }\\n\\n bytes memory flattened = new bytes(len);\\n uint256 flattenedPtr;\\n assembly { flattenedPtr := add(flattened, 0x20) }\\n\\n for(i = 0; i < _list.length; i++) {\\n bytes memory item = _list[i];\\n\\n uint256 listPtr;\\n assembly { listPtr := add(item, 0x20)}\\n\\n _memcpy(flattenedPtr, listPtr, item.length);\\n flattenedPtr += _list[i].length;\\n }\\n\\n return flattened;\\n }\\n}\\n\",\"keccak256\":\"0xb60ee4b03ad372c3deff21d454ab714dd0c18ee3e6f9d45532e209fc59d5a54d\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/trie/Lib_MerkleTrie.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\n\\n/**\\n * @title Lib_MerkleTrie\\n */\\nlibrary Lib_MerkleTrie {\\n\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n enum NodeType {\\n BranchNode,\\n ExtensionNode,\\n LeafNode\\n }\\n\\n struct TrieNode {\\n bytes encoded;\\n Lib_RLPReader.RLPItem[] decoded;\\n }\\n\\n\\n /**********************\\n * Contract Constants *\\n **********************/\\n\\n // TREE_RADIX determines the number of elements per branch node.\\n uint256 constant TREE_RADIX = 16;\\n // Branch nodes have TREE_RADIX elements plus an additional `value` slot.\\n uint256 constant BRANCH_NODE_LENGTH = TREE_RADIX + 1;\\n // Leaf nodes and extension nodes always have two elements, a `path` and a `value`.\\n uint256 constant LEAF_OR_EXTENSION_NODE_LENGTH = 2;\\n\\n // Prefixes are prepended to the `path` within a leaf or extension node and\\n // allow us to differentiate between the two node types. `ODD` or `EVEN` is\\n // determined by the number of nibbles within the unprefixed `path`. If the\\n // number of nibbles if even, we need to insert an extra padding nibble so\\n // the resulting prefixed `path` has an even number of nibbles.\\n uint8 constant PREFIX_EXTENSION_EVEN = 0;\\n uint8 constant PREFIX_EXTENSION_ODD = 1;\\n uint8 constant PREFIX_LEAF_EVEN = 2;\\n uint8 constant PREFIX_LEAF_ODD = 3;\\n\\n // Just a utility constant. RLP represents `NULL` as 0x80.\\n bytes1 constant RLP_NULL = bytes1(0x80);\\n bytes constant RLP_NULL_BYTES = hex'80';\\n bytes32 constant internal KECCAK256_RLP_NULL_BYTES = keccak256(RLP_NULL_BYTES);\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * @notice Verifies a proof that a given key/value pair is present in the\\n * Merkle trie.\\n * @param _key Key of the node to search for, as a hex string.\\n * @param _value Value of the node to search for, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the desired node. Unlike\\n * traditional Merkle trees, this proof is executed top-down and consists\\n * of a list of RLP-encoded nodes that make a path down to the target node.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _verified `true` if the k/v pair exists in the trie, `false` otherwise.\\n */\\n function verifyInclusionProof(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bool _verified\\n )\\n {\\n (\\n bool exists,\\n bytes memory value\\n ) = get(_key, _proof, _root);\\n\\n return (\\n exists && Lib_BytesUtils.equal(_value, value)\\n );\\n }\\n\\n /**\\n * @notice Verifies a proof that a given key is *not* present in\\n * the Merkle trie.\\n * @param _key Key of the node to search for, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\\n * target node.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _verified `true` if the key is absent in the trie, `false` otherwise.\\n */\\n function verifyExclusionProof(\\n bytes memory _key,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bool _verified\\n )\\n {\\n (\\n bool exists,\\n ) = get(_key, _proof, _root);\\n\\n return exists == false;\\n }\\n\\n /**\\n * @notice Updates a Merkle trie and returns a new root hash.\\n * @param _key Key of the node to update, as a hex string.\\n * @param _value Value of the node to update, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\\n * target node. If the key exists, we can simply update the value.\\n * Otherwise, we need to modify the trie to handle the new k/v pair.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _updatedRoot Root hash of the newly constructed trie.\\n */\\n function update(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bytes32 _updatedRoot\\n )\\n {\\n // Special case when inserting the very first node.\\n if (_root == KECCAK256_RLP_NULL_BYTES) {\\n return getSingleNodeRootHash(_key, _value);\\n }\\n\\n TrieNode[] memory proof = _parseProof(_proof);\\n (uint256 pathLength, bytes memory keyRemainder, ) = _walkNodePath(proof, _key, _root);\\n TrieNode[] memory newPath = _getNewPath(proof, pathLength, keyRemainder, _value);\\n\\n return _getUpdatedTrieRoot(newPath, _key);\\n }\\n\\n /**\\n * @notice Retrieves the value associated with a given key.\\n * @param _key Key to search for, as hex bytes.\\n * @param _proof Merkle trie inclusion proof for the key.\\n * @param _root Known root of the Merkle trie.\\n * @return _exists Whether or not the key exists.\\n * @return _value Value of the key if it exists.\\n */\\n function get(\\n bytes memory _key,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bool _exists,\\n bytes memory _value\\n )\\n {\\n TrieNode[] memory proof = _parseProof(_proof);\\n (uint256 pathLength, bytes memory keyRemainder, bool isFinalNode) = _walkNodePath(proof, _key, _root);\\n\\n bool exists = keyRemainder.length == 0;\\n\\n require(\\n exists || isFinalNode,\\n \\\"Provided proof is invalid.\\\"\\n );\\n\\n bytes memory value = exists ? _getNodeValue(proof[pathLength - 1]) : bytes('');\\n\\n return (\\n exists,\\n value\\n );\\n }\\n\\n /**\\n * Computes the root hash for a trie with a single node.\\n * @param _key Key for the single node.\\n * @param _value Value for the single node.\\n * @return _updatedRoot Hash of the trie.\\n */\\n function getSingleNodeRootHash(\\n bytes memory _key,\\n bytes memory _value\\n )\\n internal\\n pure\\n returns (\\n bytes32 _updatedRoot\\n )\\n {\\n return keccak256(_makeLeafNode(\\n Lib_BytesUtils.toNibbles(_key),\\n _value\\n ).encoded);\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * @notice Walks through a proof using a provided key.\\n * @param _proof Inclusion proof to walk through.\\n * @param _key Key to use for the walk.\\n * @param _root Known root of the trie.\\n * @return _pathLength Length of the final path\\n * @return _keyRemainder Portion of the key remaining after the walk.\\n * @return _isFinalNode Whether or not we've hit a dead end.\\n */\\n function _walkNodePath(\\n TrieNode[] memory _proof,\\n bytes memory _key,\\n bytes32 _root\\n )\\n private\\n pure\\n returns (\\n uint256 _pathLength,\\n bytes memory _keyRemainder,\\n bool _isFinalNode\\n )\\n {\\n uint256 pathLength = 0;\\n bytes memory key = Lib_BytesUtils.toNibbles(_key);\\n\\n bytes32 currentNodeID = _root;\\n uint256 currentKeyIndex = 0;\\n uint256 currentKeyIncrement = 0;\\n TrieNode memory currentNode;\\n\\n // Proof is top-down, so we start at the first element (root).\\n for (uint256 i = 0; i < _proof.length; i++) {\\n currentNode = _proof[i];\\n currentKeyIndex += currentKeyIncrement;\\n\\n // Keep track of the proof elements we actually need.\\n // It's expensive to resize arrays, so this simply reduces gas costs.\\n pathLength += 1;\\n\\n if (currentKeyIndex == 0) {\\n // First proof element is always the root node.\\n require(\\n keccak256(currentNode.encoded) == currentNodeID,\\n \\\"Invalid root hash\\\"\\n );\\n } else if (currentNode.encoded.length >= 32) {\\n // Nodes 32 bytes or larger are hashed inside branch nodes.\\n require(\\n keccak256(currentNode.encoded) == currentNodeID,\\n \\\"Invalid large internal hash\\\"\\n );\\n } else {\\n // Nodes smaller than 31 bytes aren't hashed.\\n require(\\n Lib_BytesUtils.toBytes32(currentNode.encoded) == currentNodeID,\\n \\\"Invalid internal node hash\\\"\\n );\\n }\\n\\n if (currentNode.decoded.length == BRANCH_NODE_LENGTH) {\\n if (currentKeyIndex == key.length) {\\n // We've hit the end of the key, meaning the value should be within this branch node.\\n break;\\n } else {\\n // We're not at the end of the key yet.\\n // Figure out what the next node ID should be and continue.\\n uint8 branchKey = uint8(key[currentKeyIndex]);\\n Lib_RLPReader.RLPItem memory nextNode = currentNode.decoded[branchKey];\\n currentNodeID = _getNodeID(nextNode);\\n currentKeyIncrement = 1;\\n continue;\\n }\\n } else if (currentNode.decoded.length == LEAF_OR_EXTENSION_NODE_LENGTH) {\\n bytes memory path = _getNodePath(currentNode);\\n uint8 prefix = uint8(path[0]);\\n uint8 offset = 2 - prefix % 2;\\n bytes memory pathRemainder = Lib_BytesUtils.slice(path, offset);\\n bytes memory keyRemainder = Lib_BytesUtils.slice(key, currentKeyIndex);\\n uint256 sharedNibbleLength = _getSharedNibbleLength(pathRemainder, keyRemainder);\\n\\n if (prefix == PREFIX_LEAF_EVEN || prefix == PREFIX_LEAF_ODD) {\\n if (\\n pathRemainder.length == sharedNibbleLength &&\\n keyRemainder.length == sharedNibbleLength\\n ) {\\n // The key within this leaf matches our key exactly.\\n // Increment the key index to reflect that we have no remainder.\\n currentKeyIndex += sharedNibbleLength;\\n }\\n\\n // We've hit a leaf node, so our next node should be NULL.\\n currentNodeID = bytes32(RLP_NULL);\\n break;\\n } else if (prefix == PREFIX_EXTENSION_EVEN || prefix == PREFIX_EXTENSION_ODD) {\\n if (sharedNibbleLength == 0) {\\n // Our extension node doesn't share any part of our key.\\n // We've hit the end of this path, updates will need to modify this extension.\\n currentNodeID = bytes32(RLP_NULL);\\n break;\\n } else {\\n // Our extension shares some nibbles.\\n // Carry on to the next node.\\n currentNodeID = _getNodeID(currentNode.decoded[1]);\\n currentKeyIncrement = sharedNibbleLength;\\n continue;\\n }\\n } else {\\n revert(\\\"Received a node with an unknown prefix\\\");\\n }\\n } else {\\n revert(\\\"Received an unparseable node.\\\");\\n }\\n }\\n\\n // If our node ID is NULL, then we're at a dead end.\\n bool isFinalNode = currentNodeID == bytes32(RLP_NULL);\\n return (pathLength, Lib_BytesUtils.slice(key, currentKeyIndex), isFinalNode);\\n }\\n\\n /**\\n * @notice Creates new nodes to support a k/v pair insertion into a given\\n * Merkle trie path.\\n * @param _path Path to the node nearest the k/v pair.\\n * @param _pathLength Length of the path. Necessary because the provided\\n * path may include additional nodes (e.g., it comes directly from a proof)\\n * and we can't resize in-memory arrays without costly duplication.\\n * @param _keyRemainder Portion of the initial key that must be inserted\\n * into the trie.\\n * @param _value Value to insert at the given key.\\n * @return _newPath A new path with the inserted k/v pair and extra supporting nodes.\\n */\\n function _getNewPath(\\n TrieNode[] memory _path,\\n uint256 _pathLength,\\n bytes memory _keyRemainder,\\n bytes memory _value\\n )\\n private\\n pure\\n returns (\\n TrieNode[] memory _newPath\\n )\\n {\\n bytes memory keyRemainder = _keyRemainder;\\n\\n // Most of our logic depends on the status of the last node in the path.\\n TrieNode memory lastNode = _path[_pathLength - 1];\\n NodeType lastNodeType = _getNodeType(lastNode);\\n\\n // Create an array for newly created nodes.\\n // We need up to three new nodes, depending on the contents of the last node.\\n // Since array resizing is expensive, we'll keep track of the size manually.\\n // We're using an explicit `totalNewNodes += 1` after insertions for clarity.\\n TrieNode[] memory newNodes = new TrieNode[](3);\\n uint256 totalNewNodes = 0;\\n\\n if (keyRemainder.length == 0 && lastNodeType == NodeType.LeafNode) {\\n // We've found a leaf node with the given key.\\n // Simply need to update the value of the node to match.\\n newNodes[totalNewNodes] = _makeLeafNode(_getNodeKey(lastNode), _value);\\n totalNewNodes += 1;\\n } else if (lastNodeType == NodeType.BranchNode) {\\n if (keyRemainder.length == 0) {\\n // We've found a branch node with the given key.\\n // Simply need to update the value of the node to match.\\n newNodes[totalNewNodes] = _editBranchValue(lastNode, _value);\\n totalNewNodes += 1;\\n } else {\\n // We've found a branch node, but it doesn't contain our key.\\n // Reinsert the old branch for now.\\n newNodes[totalNewNodes] = lastNode;\\n totalNewNodes += 1;\\n // Create a new leaf node, slicing our remainder since the first byte points\\n // to our branch node.\\n newNodes[totalNewNodes] = _makeLeafNode(Lib_BytesUtils.slice(keyRemainder, 1), _value);\\n totalNewNodes += 1;\\n }\\n } else {\\n // Our last node is either an extension node or a leaf node with a different key.\\n bytes memory lastNodeKey = _getNodeKey(lastNode);\\n uint256 sharedNibbleLength = _getSharedNibbleLength(lastNodeKey, keyRemainder);\\n\\n if (sharedNibbleLength != 0) {\\n // We've got some shared nibbles between the last node and our key remainder.\\n // We'll need to insert an extension node that covers these shared nibbles.\\n bytes memory nextNodeKey = Lib_BytesUtils.slice(lastNodeKey, 0, sharedNibbleLength);\\n newNodes[totalNewNodes] = _makeExtensionNode(nextNodeKey, _getNodeHash(_value));\\n totalNewNodes += 1;\\n\\n // Cut down the keys since we've just covered these shared nibbles.\\n lastNodeKey = Lib_BytesUtils.slice(lastNodeKey, sharedNibbleLength);\\n keyRemainder = Lib_BytesUtils.slice(keyRemainder, sharedNibbleLength);\\n }\\n\\n // Create an empty branch to fill in.\\n TrieNode memory newBranch = _makeEmptyBranchNode();\\n\\n if (lastNodeKey.length == 0) {\\n // Key remainder was larger than the key for our last node.\\n // The value within our last node is therefore going to be shifted into\\n // a branch value slot.\\n newBranch = _editBranchValue(newBranch, _getNodeValue(lastNode));\\n } else {\\n // Last node key was larger than the key remainder.\\n // We're going to modify some index of our branch.\\n uint8 branchKey = uint8(lastNodeKey[0]);\\n // Move on to the next nibble.\\n lastNodeKey = Lib_BytesUtils.slice(lastNodeKey, 1);\\n\\n if (lastNodeType == NodeType.LeafNode) {\\n // We're dealing with a leaf node.\\n // We'll modify the key and insert the old leaf node into the branch index.\\n TrieNode memory modifiedLastNode = _makeLeafNode(lastNodeKey, _getNodeValue(lastNode));\\n newBranch = _editBranchIndex(newBranch, branchKey, _getNodeHash(modifiedLastNode.encoded));\\n } else if (lastNodeKey.length != 0) {\\n // We're dealing with a shrinking extension node.\\n // We need to modify the node to decrease the size of the key.\\n TrieNode memory modifiedLastNode = _makeExtensionNode(lastNodeKey, _getNodeValue(lastNode));\\n newBranch = _editBranchIndex(newBranch, branchKey, _getNodeHash(modifiedLastNode.encoded));\\n } else {\\n // We're dealing with an unnecessary extension node.\\n // We're going to delete the node entirely.\\n // Simply insert its current value into the branch index.\\n newBranch = _editBranchIndex(newBranch, branchKey, _getNodeValue(lastNode));\\n }\\n }\\n\\n if (keyRemainder.length == 0) {\\n // We've got nothing left in the key remainder.\\n // Simply insert the value into the branch value slot.\\n newBranch = _editBranchValue(newBranch, _value);\\n // Push the branch into the list of new nodes.\\n newNodes[totalNewNodes] = newBranch;\\n totalNewNodes += 1;\\n } else {\\n // We've got some key remainder to work with.\\n // We'll be inserting a leaf node into the trie.\\n // First, move on to the next nibble.\\n keyRemainder = Lib_BytesUtils.slice(keyRemainder, 1);\\n // Push the branch into the list of new nodes.\\n newNodes[totalNewNodes] = newBranch;\\n totalNewNodes += 1;\\n // Push a new leaf node for our k/v pair.\\n newNodes[totalNewNodes] = _makeLeafNode(keyRemainder, _value);\\n totalNewNodes += 1;\\n }\\n }\\n\\n // Finally, join the old path with our newly created nodes.\\n // Since we're overwriting the last node in the path, we use `_pathLength - 1`.\\n return _joinNodeArrays(_path, _pathLength - 1, newNodes, totalNewNodes);\\n }\\n\\n /**\\n * @notice Computes the trie root from a given path.\\n * @param _nodes Path to some k/v pair.\\n * @param _key Key for the k/v pair.\\n * @return _updatedRoot Root hash for the updated trie.\\n */\\n function _getUpdatedTrieRoot(\\n TrieNode[] memory _nodes,\\n bytes memory _key\\n )\\n private\\n pure\\n returns (\\n bytes32 _updatedRoot\\n )\\n {\\n bytes memory key = Lib_BytesUtils.toNibbles(_key);\\n\\n // Some variables to keep track of during iteration.\\n TrieNode memory currentNode;\\n NodeType currentNodeType;\\n bytes memory previousNodeHash;\\n\\n // Run through the path backwards to rebuild our root hash.\\n for (uint256 i = _nodes.length; i > 0; i--) {\\n // Pick out the current node.\\n currentNode = _nodes[i - 1];\\n currentNodeType = _getNodeType(currentNode);\\n\\n if (currentNodeType == NodeType.LeafNode) {\\n // Leaf nodes are already correctly encoded.\\n // Shift the key over to account for the nodes key.\\n bytes memory nodeKey = _getNodeKey(currentNode);\\n key = Lib_BytesUtils.slice(key, 0, key.length - nodeKey.length);\\n } else if (currentNodeType == NodeType.ExtensionNode) {\\n // Shift the key over to account for the nodes key.\\n bytes memory nodeKey = _getNodeKey(currentNode);\\n key = Lib_BytesUtils.slice(key, 0, key.length - nodeKey.length);\\n\\n // If this node is the last element in the path, it'll be correctly encoded\\n // and we can skip this part.\\n if (previousNodeHash.length > 0) {\\n // Re-encode the node based on the previous node.\\n currentNode = _makeExtensionNode(nodeKey, previousNodeHash);\\n }\\n } else if (currentNodeType == NodeType.BranchNode) {\\n // If this node is the last element in the path, it'll be correctly encoded\\n // and we can skip this part.\\n if (previousNodeHash.length > 0) {\\n // Re-encode the node based on the previous node.\\n uint8 branchKey = uint8(key[key.length - 1]);\\n key = Lib_BytesUtils.slice(key, 0, key.length - 1);\\n currentNode = _editBranchIndex(currentNode, branchKey, previousNodeHash);\\n }\\n }\\n\\n // Compute the node hash for the next iteration.\\n previousNodeHash = _getNodeHash(currentNode.encoded);\\n }\\n\\n // Current node should be the root at this point.\\n // Simply return the hash of its encoding.\\n return keccak256(currentNode.encoded);\\n }\\n\\n /**\\n * @notice Parses an RLP-encoded proof into something more useful.\\n * @param _proof RLP-encoded proof to parse.\\n * @return _parsed Proof parsed into easily accessible structs.\\n */\\n function _parseProof(\\n bytes memory _proof\\n )\\n private\\n pure\\n returns (\\n TrieNode[] memory _parsed\\n )\\n {\\n Lib_RLPReader.RLPItem[] memory nodes = Lib_RLPReader.readList(_proof);\\n TrieNode[] memory proof = new TrieNode[](nodes.length);\\n\\n for (uint256 i = 0; i < nodes.length; i++) {\\n bytes memory encoded = Lib_RLPReader.readBytes(nodes[i]);\\n proof[i] = TrieNode({\\n encoded: encoded,\\n decoded: Lib_RLPReader.readList(encoded)\\n });\\n }\\n\\n return proof;\\n }\\n\\n /**\\n * @notice Picks out the ID for a node. Node ID is referred to as the\\n * \\\"hash\\\" within the specification, but nodes < 32 bytes are not actually\\n * hashed.\\n * @param _node Node to pull an ID for.\\n * @return _nodeID ID for the node, depending on the size of its contents.\\n */\\n function _getNodeID(\\n Lib_RLPReader.RLPItem memory _node\\n )\\n private\\n pure\\n returns (\\n bytes32 _nodeID\\n )\\n {\\n bytes memory nodeID;\\n\\n if (_node.length < 32) {\\n // Nodes smaller than 32 bytes are RLP encoded.\\n nodeID = Lib_RLPReader.readRawBytes(_node);\\n } else {\\n // Nodes 32 bytes or larger are hashed.\\n nodeID = Lib_RLPReader.readBytes(_node);\\n }\\n\\n return Lib_BytesUtils.toBytes32(nodeID);\\n }\\n\\n /**\\n * @notice Gets the path for a leaf or extension node.\\n * @param _node Node to get a path for.\\n * @return _path Node path, converted to an array of nibbles.\\n */\\n function _getNodePath(\\n TrieNode memory _node\\n )\\n private\\n pure\\n returns (\\n bytes memory _path\\n )\\n {\\n return Lib_BytesUtils.toNibbles(Lib_RLPReader.readBytes(_node.decoded[0]));\\n }\\n\\n /**\\n * @notice Gets the key for a leaf or extension node. Keys are essentially\\n * just paths without any prefix.\\n * @param _node Node to get a key for.\\n * @return _key Node key, converted to an array of nibbles.\\n */\\n function _getNodeKey(\\n TrieNode memory _node\\n )\\n private\\n pure\\n returns (\\n bytes memory _key\\n )\\n {\\n return _removeHexPrefix(_getNodePath(_node));\\n }\\n\\n /**\\n * @notice Gets the path for a node.\\n * @param _node Node to get a value for.\\n * @return _value Node value, as hex bytes.\\n */\\n function _getNodeValue(\\n TrieNode memory _node\\n )\\n private\\n pure\\n returns (\\n bytes memory _value\\n )\\n {\\n return Lib_RLPReader.readBytes(_node.decoded[_node.decoded.length - 1]);\\n }\\n\\n /**\\n * @notice Computes the node hash for an encoded node. Nodes < 32 bytes\\n * are not hashed, all others are keccak256 hashed.\\n * @param _encoded Encoded node to hash.\\n * @return _hash Hash of the encoded node. Simply the input if < 32 bytes.\\n */\\n function _getNodeHash(\\n bytes memory _encoded\\n )\\n private\\n pure\\n returns (\\n bytes memory _hash\\n )\\n {\\n if (_encoded.length < 32) {\\n return _encoded;\\n } else {\\n return abi.encodePacked(keccak256(_encoded));\\n }\\n }\\n\\n /**\\n * @notice Determines the type for a given node.\\n * @param _node Node to determine a type for.\\n * @return _type Type of the node; BranchNode/ExtensionNode/LeafNode.\\n */\\n function _getNodeType(\\n TrieNode memory _node\\n )\\n private\\n pure\\n returns (\\n NodeType _type\\n )\\n {\\n if (_node.decoded.length == BRANCH_NODE_LENGTH) {\\n return NodeType.BranchNode;\\n } else if (_node.decoded.length == LEAF_OR_EXTENSION_NODE_LENGTH) {\\n bytes memory path = _getNodePath(_node);\\n uint8 prefix = uint8(path[0]);\\n\\n if (prefix == PREFIX_LEAF_EVEN || prefix == PREFIX_LEAF_ODD) {\\n return NodeType.LeafNode;\\n } else if (prefix == PREFIX_EXTENSION_EVEN || prefix == PREFIX_EXTENSION_ODD) {\\n return NodeType.ExtensionNode;\\n }\\n }\\n\\n revert(\\\"Invalid node type\\\");\\n }\\n\\n /**\\n * @notice Utility; determines the number of nibbles shared between two\\n * nibble arrays.\\n * @param _a First nibble array.\\n * @param _b Second nibble array.\\n * @return _shared Number of shared nibbles.\\n */\\n function _getSharedNibbleLength(\\n bytes memory _a,\\n bytes memory _b\\n )\\n private\\n pure\\n returns (\\n uint256 _shared\\n )\\n {\\n uint256 i = 0;\\n while (_a.length > i && _b.length > i && _a[i] == _b[i]) {\\n i++;\\n }\\n return i;\\n }\\n\\n /**\\n * @notice Utility; converts an RLP-encoded node into our nice struct.\\n * @param _raw RLP-encoded node to convert.\\n * @return _node Node as a TrieNode struct.\\n */\\n function _makeNode(\\n bytes[] memory _raw\\n )\\n private\\n pure\\n returns (\\n TrieNode memory _node\\n )\\n {\\n bytes memory encoded = Lib_RLPWriter.writeList(_raw);\\n\\n return TrieNode({\\n encoded: encoded,\\n decoded: Lib_RLPReader.readList(encoded)\\n });\\n }\\n\\n /**\\n * @notice Utility; converts an RLP-decoded node into our nice struct.\\n * @param _items RLP-decoded node to convert.\\n * @return _node Node as a TrieNode struct.\\n */\\n function _makeNode(\\n Lib_RLPReader.RLPItem[] memory _items\\n )\\n private\\n pure\\n returns (\\n TrieNode memory _node\\n )\\n {\\n bytes[] memory raw = new bytes[](_items.length);\\n for (uint256 i = 0; i < _items.length; i++) {\\n raw[i] = Lib_RLPReader.readRawBytes(_items[i]);\\n }\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Creates a new extension node.\\n * @param _key Key for the extension node, unprefixed.\\n * @param _value Value for the extension node.\\n * @return _node New extension node with the given k/v pair.\\n */\\n function _makeExtensionNode(\\n bytes memory _key,\\n bytes memory _value\\n )\\n private\\n pure\\n returns (\\n TrieNode memory _node\\n )\\n {\\n bytes[] memory raw = new bytes[](2);\\n bytes memory key = _addHexPrefix(_key, false);\\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\\n raw[1] = Lib_RLPWriter.writeBytes(_value);\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Creates a new leaf node.\\n * @dev This function is essentially identical to `_makeExtensionNode`.\\n * Although we could route both to a single method with a flag, it's\\n * more gas efficient to keep them separate and duplicate the logic.\\n * @param _key Key for the leaf node, unprefixed.\\n * @param _value Value for the leaf node.\\n * @return _node New leaf node with the given k/v pair.\\n */\\n function _makeLeafNode(\\n bytes memory _key,\\n bytes memory _value\\n )\\n private\\n pure\\n returns (\\n TrieNode memory _node\\n )\\n {\\n bytes[] memory raw = new bytes[](2);\\n bytes memory key = _addHexPrefix(_key, true);\\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\\n raw[1] = Lib_RLPWriter.writeBytes(_value);\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Creates an empty branch node.\\n * @return _node Empty branch node as a TrieNode struct.\\n */\\n function _makeEmptyBranchNode()\\n private\\n pure\\n returns (\\n TrieNode memory _node\\n )\\n {\\n bytes[] memory raw = new bytes[](BRANCH_NODE_LENGTH);\\n for (uint256 i = 0; i < raw.length; i++) {\\n raw[i] = RLP_NULL_BYTES;\\n }\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Modifies the value slot for a given branch.\\n * @param _branch Branch node to modify.\\n * @param _value Value to insert into the branch.\\n * @return _updatedNode Modified branch node.\\n */\\n function _editBranchValue(\\n TrieNode memory _branch,\\n bytes memory _value\\n )\\n private\\n pure\\n returns (\\n TrieNode memory _updatedNode\\n )\\n {\\n bytes memory encoded = Lib_RLPWriter.writeBytes(_value);\\n _branch.decoded[_branch.decoded.length - 1] = Lib_RLPReader.toRLPItem(encoded);\\n return _makeNode(_branch.decoded);\\n }\\n\\n /**\\n * @notice Modifies a slot at an index for a given branch.\\n * @param _branch Branch node to modify.\\n * @param _index Slot index to modify.\\n * @param _value Value to insert into the slot.\\n * @return _updatedNode Modified branch node.\\n */\\n function _editBranchIndex(\\n TrieNode memory _branch,\\n uint8 _index,\\n bytes memory _value\\n )\\n private\\n pure\\n returns (\\n TrieNode memory _updatedNode\\n )\\n {\\n bytes memory encoded = _value.length < 32 ? _value : Lib_RLPWriter.writeBytes(_value);\\n _branch.decoded[_index] = Lib_RLPReader.toRLPItem(encoded);\\n return _makeNode(_branch.decoded);\\n }\\n\\n /**\\n * @notice Utility; adds a prefix to a key.\\n * @param _key Key to prefix.\\n * @param _isLeaf Whether or not the key belongs to a leaf.\\n * @return _prefixedKey Prefixed key.\\n */\\n function _addHexPrefix(\\n bytes memory _key,\\n bool _isLeaf\\n )\\n private\\n pure\\n returns (\\n bytes memory _prefixedKey\\n )\\n {\\n uint8 prefix = _isLeaf ? uint8(0x02) : uint8(0x00);\\n uint8 offset = uint8(_key.length % 2);\\n bytes memory prefixed = new bytes(2 - offset);\\n prefixed[0] = bytes1(prefix + offset);\\n return abi.encodePacked(prefixed, _key);\\n }\\n\\n /**\\n * @notice Utility; removes a prefix from a path.\\n * @param _path Path to remove the prefix from.\\n * @return _unprefixedKey Unprefixed key.\\n */\\n function _removeHexPrefix(\\n bytes memory _path\\n )\\n private\\n pure\\n returns (\\n bytes memory _unprefixedKey\\n )\\n {\\n if (uint8(_path[0]) % 2 == 0) {\\n return Lib_BytesUtils.slice(_path, 2);\\n } else {\\n return Lib_BytesUtils.slice(_path, 1);\\n }\\n }\\n\\n /**\\n * @notice Utility; combines two node arrays. Array lengths are required\\n * because the actual lengths may be longer than the filled lengths.\\n * Array resizing is extremely costly and should be avoided.\\n * @param _a First array to join.\\n * @param _aLength Length of the first array.\\n * @param _b Second array to join.\\n * @param _bLength Length of the second array.\\n * @return _joined Combined node array.\\n */\\n function _joinNodeArrays(\\n TrieNode[] memory _a,\\n uint256 _aLength,\\n TrieNode[] memory _b,\\n uint256 _bLength\\n )\\n private\\n pure\\n returns (\\n TrieNode[] memory _joined\\n )\\n {\\n TrieNode[] memory ret = new TrieNode[](_aLength + _bLength);\\n\\n // Copy elements from the first array.\\n for (uint256 i = 0; i < _aLength; i++) {\\n ret[i] = _a[i];\\n }\\n\\n // Copy elements from the second array.\\n for (uint256 i = 0; i < _bLength; i++) {\\n ret[i + _aLength] = _b[i];\\n }\\n\\n return ret;\\n }\\n}\\n\",\"keccak256\":\"0x161f65220b8c5cf295232f8c58c2744fbc898bf77da5f9d9c5b2dd673dafc6f6\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/trie/Lib_SecureMerkleTrie.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_MerkleTrie } from \\\"./Lib_MerkleTrie.sol\\\";\\n\\n/**\\n * @title Lib_SecureMerkleTrie\\n */\\nlibrary Lib_SecureMerkleTrie {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * @notice Verifies a proof that a given key/value pair is present in the\\n * Merkle trie.\\n * @param _key Key of the node to search for, as a hex string.\\n * @param _value Value of the node to search for, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the desired node. Unlike\\n * traditional Merkle trees, this proof is executed top-down and consists\\n * of a list of RLP-encoded nodes that make a path down to the target node.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _verified `true` if the k/v pair exists in the trie, `false` otherwise.\\n */\\n function verifyInclusionProof(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bool _verified\\n )\\n {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.verifyInclusionProof(key, _value, _proof, _root);\\n }\\n\\n /**\\n * @notice Verifies a proof that a given key is *not* present in\\n * the Merkle trie.\\n * @param _key Key of the node to search for, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\\n * target node.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _verified `true` if the key is not present in the trie, `false` otherwise.\\n */\\n function verifyExclusionProof(\\n bytes memory _key,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bool _verified\\n )\\n {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.verifyExclusionProof(key, _proof, _root);\\n }\\n\\n /**\\n * @notice Updates a Merkle trie and returns a new root hash.\\n * @param _key Key of the node to update, as a hex string.\\n * @param _value Value of the node to update, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\\n * target node. If the key exists, we can simply update the value.\\n * Otherwise, we need to modify the trie to handle the new k/v pair.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _updatedRoot Root hash of the newly constructed trie.\\n */\\n function update(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bytes32 _updatedRoot\\n )\\n {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.update(key, _value, _proof, _root);\\n }\\n\\n /**\\n * @notice Retrieves the value associated with a given key.\\n * @param _key Key to search for, as hex bytes.\\n * @param _proof Merkle trie inclusion proof for the key.\\n * @param _root Known root of the Merkle trie.\\n * @return _exists Whether or not the key exists.\\n * @return _value Value of the key if it exists.\\n */\\n function get(\\n bytes memory _key,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bool _exists,\\n bytes memory _value\\n )\\n {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.get(key, _proof, _root);\\n }\\n\\n /**\\n * Computes the root hash for a trie with a single node.\\n * @param _key Key for the single node.\\n * @param _value Value for the single node.\\n * @return _updatedRoot Hash of the trie.\\n */\\n function getSingleNodeRootHash(\\n bytes memory _key,\\n bytes memory _value\\n )\\n internal\\n pure\\n returns (\\n bytes32 _updatedRoot\\n )\\n {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.getSingleNodeRootHash(key, _value);\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Computes the secure counterpart to a key.\\n * @param _key Key to get a secure key from.\\n * @return _secureKey Secure version of the key.\\n */\\n function _getSecureKey(\\n bytes memory _key\\n )\\n private\\n pure\\n returns (\\n bytes memory _secureKey\\n )\\n {\\n return abi.encodePacked(keccak256(_key));\\n }\\n}\",\"keccak256\":\"0x79355346f74bb1eb9eeb733cb5d9677d50115c4f390307cbf608fe071a1ada0c\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_Bytes32Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_Byte32Utils\\n */\\nlibrary Lib_Bytes32Utils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \\\"true.\\\"\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as a boolean.\\n */\\n function toBool(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return _in != 0;\\n }\\n\\n /**\\n * Converts a boolean to a bytes32 value.\\n * @param _in Input boolean value.\\n * @return Boolean as a bytes32.\\n */\\n function fromBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in ? 1 : 0));\\n }\\n\\n /**\\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as an address.\\n */\\n function toAddress(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return address(uint160(uint256(_in)));\\n }\\n\\n /**\\n * Converts an address to a bytes32.\\n * @param _in Input address value.\\n * @return Address as a bytes32.\\n */\\n function fromAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in));\\n }\\n\\n /**\\n * Removes the leading zeros from a bytes32 value and returns a new (smaller) bytes value.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 without any leading zeros.\\n */\\n function removeLeadingZeros(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out;\\n\\n assembly {\\n // Figure out how many leading zero bytes to remove.\\n let shift := 0\\n for { let i := 0 } and(lt(i, 32), eq(byte(i, _in), 0)) { i := add(i, 1) } {\\n shift := add(shift, 1)\\n }\\n\\n // Reserve some space for our output and fix the free memory pointer.\\n out := mload(0x40)\\n mstore(0x40, add(out, 0x40))\\n\\n // Shift the value and store it into the output bytes.\\n mstore(add(out, 0x20), shl(mul(shift, 8), _in))\\n\\n // Store the new size (with leading zero bytes removed) in the output byte size.\\n mstore(out, sub(32, shift))\\n }\\n\\n return out;\\n }\\n}\\n\",\"keccak256\":\"0xfa2def593e3fc56a31852c3744aefdaa93cec74e721bfcfeb1e5d166c7c60b64\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_BytesUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_BytesUtils\\n */\\nlibrary Lib_BytesUtils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_start + _length >= _start, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n if (_bytes.length - _start == 0) {\\n return bytes('');\\n }\\n\\n return slice(_bytes, _start, _bytes.length - _start);\\n }\\n\\n function toBytes32PadLeft(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n bytes32 ret;\\n uint256 len = _bytes.length <= 32 ? _bytes.length : 32;\\n assembly {\\n ret := shr(mul(sub(32, len), 8), mload(add(_bytes, 32)))\\n }\\n return ret;\\n }\\n\\n function toBytes32(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n if (_bytes.length < 32) {\\n bytes32 ret;\\n assembly {\\n ret := mload(add(_bytes, 32))\\n }\\n return ret;\\n }\\n\\n return abi.decode(_bytes,(bytes32)); // will truncate if input length > 32 bytes\\n }\\n\\n function toUint256(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return uint256(toBytes32(_bytes));\\n }\\n\\n function toUint24(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n uint24\\n )\\n {\\n require(_start + 3 >= _start, \\\"toUint24_overflow\\\");\\n require(_bytes.length >= _start + 3 , \\\"toUint24_outOfBounds\\\");\\n uint24 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x3), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toUint8(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n uint8\\n )\\n {\\n require(_start + 1 >= _start, \\\"toUint8_overflow\\\");\\n require(_bytes.length >= _start + 1 , \\\"toUint8_outOfBounds\\\");\\n uint8 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x1), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toAddress(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n require(_start + 20 >= _start, \\\"toAddress_overflow\\\");\\n require(_bytes.length >= _start + 20, \\\"toAddress_outOfBounds\\\");\\n address tempAddress;\\n\\n assembly {\\n tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000)\\n }\\n\\n return tempAddress;\\n }\\n\\n function toNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory nibbles = new bytes(_bytes.length * 2);\\n\\n for (uint256 i = 0; i < _bytes.length; i++) {\\n nibbles[i * 2] = _bytes[i] >> 4;\\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\\n }\\n\\n return nibbles;\\n }\\n\\n function fromNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory ret = new bytes(_bytes.length / 2);\\n\\n for (uint256 i = 0; i < ret.length; i++) {\\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\\n }\\n\\n return ret;\\n }\\n\\n function equal(\\n bytes memory _bytes,\\n bytes memory _other\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return keccak256(_bytes) == keccak256(_other);\\n }\\n}\\n\",\"keccak256\":\"0xa5195afe32fb2cf104d156e8f4bd39df1ec79bf6ba232097b9e8e0ee14fbc298\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_EthUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// @unsupported: ovm\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"./Lib_Bytes32Utils.sol\\\";\\n\\n/**\\n * @title Lib_EthUtils\\n */\\nlibrary Lib_EthUtils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Gets the code for a given address.\\n * @param _address Address to get code for.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Code read from the contract.\\n */\\n function getCode(\\n address _address,\\n uint256 _offset,\\n uint256 _length\\n )\\n internal\\n view\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory code;\\n assembly {\\n code := mload(0x40)\\n mstore(0x40, add(code, add(_length, 0x20)))\\n mstore(code, _length)\\n extcodecopy(_address, add(code, 0x20), _offset, _length)\\n }\\n\\n return code;\\n }\\n\\n /**\\n * Gets the full code for a given address.\\n * @param _address Address to get code for.\\n * @return Full code of the contract.\\n */\\n function getCode(\\n address _address\\n )\\n internal\\n view\\n returns (\\n bytes memory\\n )\\n {\\n return getCode(\\n _address,\\n 0,\\n getCodeSize(_address)\\n );\\n }\\n\\n /**\\n * Gets the size of a contract's code in bytes.\\n * @param _address Address to get code size for.\\n * @return Size of the contract's code in bytes.\\n */\\n function getCodeSize(\\n address _address\\n )\\n internal\\n view\\n returns (\\n uint256\\n )\\n {\\n uint256 codeSize;\\n assembly {\\n codeSize := extcodesize(_address)\\n }\\n\\n return codeSize;\\n }\\n\\n /**\\n * Gets the hash of a contract's code.\\n * @param _address Address to get a code hash for.\\n * @return Hash of the contract's code.\\n */\\n function getCodeHash(\\n address _address\\n )\\n internal\\n view\\n returns (\\n bytes32\\n )\\n {\\n bytes32 codeHash;\\n assembly {\\n codeHash := extcodehash(_address)\\n }\\n\\n return codeHash;\\n }\\n\\n /**\\n * Creates a contract with some given initialization code.\\n * @param _code Contract initialization code.\\n * @return Address of the created contract.\\n */\\n function createContract(\\n bytes memory _code\\n )\\n internal\\n returns (\\n address\\n )\\n {\\n address created;\\n assembly {\\n created := create(\\n 0,\\n add(_code, 0x20),\\n mload(_code)\\n )\\n }\\n\\n return created;\\n }\\n\\n /**\\n * Computes the address that would be generated by CREATE.\\n * @param _creator Address creating the contract.\\n * @param _nonce Creator's nonce.\\n * @return Address to be generated by CREATE.\\n */\\n function getAddressForCREATE(\\n address _creator,\\n uint256 _nonce\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n bytes[] memory encoded = new bytes[](2);\\n encoded[0] = Lib_RLPWriter.writeAddress(_creator);\\n encoded[1] = Lib_RLPWriter.writeUint(_nonce);\\n\\n bytes memory encodedList = Lib_RLPWriter.writeList(encoded);\\n return Lib_Bytes32Utils.toAddress(keccak256(encodedList));\\n }\\n\\n /**\\n * Computes the address that would be generated by CREATE2.\\n * @param _creator Address creating the contract.\\n * @param _bytecode Bytecode of the contract to be created.\\n * @param _salt 32 byte salt value mixed into the hash.\\n * @return Address to be generated by CREATE2.\\n */\\n function getAddressForCREATE2(\\n address _creator,\\n bytes memory _bytecode,\\n bytes32 _salt\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n bytes32 hashedData = keccak256(abi.encodePacked(\\n byte(0xff),\\n _creator,\\n _salt,\\n keccak256(_bytecode)\\n ));\\n\\n return Lib_Bytes32Utils.toAddress(hashedData);\\n }\\n}\\n\",\"keccak256\":\"0xf29a67d78e61cb472d524b779b32cfcb39a587f4096500d5419e6425ed367d49\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x608060405234801561001057600080fd5b506040516149b93803806149b98339818101604052602081101561003357600080fd5b5051600080546001600160a01b039092166001600160a01b0319909216919091179055614954806100656000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c806322d1470214610046578063299ca4781461009a578063461a4478146100a2575b600080fd5b61007e6004803603608081101561005c57600080fd5b506001600160a01b038135169060208101359060408101359060600135610148565b604080516001600160a01b039092168252519081900360200190f35b61007e610229565b61007e600480360360208110156100b857600080fd5b8101906020810181356401000000008111156100d357600080fd5b8201836020820111156100e557600080fd5b8035906020019184600183028401116401000000008311171561010757600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610238945050505050565b600061017c6040518060400160405280601181526020017027ab26afa33930bab22b32b934b334b2b960791b815250610238565b6001600160a01b0316336001600160a01b0316146101cb5760405162461bcd60e51b81526004018080602001828103825260318152602001806148ee6031913960400191505060405180910390fd5b848484846040516101db90610314565b80856001600160a01b03168152602001848152602001838152602001828152602001945050505050604051809103906000f08015801561021f573d6000803e3d6000fd5b5095945050505050565b6000546001600160a01b031681565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b83811015610298578181015183820152602001610280565b50505050905090810190601f1680156102c55780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b1580156102e257600080fd5b505afa1580156102f6573d6000803e3d6000fd5b505050506040513d602081101561030c57600080fd5b505192915050565b6145cc806103228339019056fe60806040523480156200001157600080fd5b50604051620045cc380380620045cc833981016040819052620000349162000232565b600080546001600160a01b0319166001600160a01b038616179055600583905560028290556003829055600681905560408051808201909152601781527f4f564d5f53746174654d616e61676572466163746f72790000000000000000006020820152620000a29062000150565b6001600160a01b0316639ed93318306040518263ffffffff1660e01b8152600401620000cf919062000299565b602060405180830381600087803b158015620000ea57600080fd5b505af1158015620000ff573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000125919062000273565b600180546001600160a01b0319166001600160a01b039290921691909117905550620002c692505050565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b83811015620001b257818101518382015260200162000198565b50505050905090810190601f168015620001e05780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b158015620001fe57600080fd5b505afa15801562000213573d6000803e3d6000fd5b505050506040513d60208110156200022a57600080fd5b505192915050565b6000806000806080858703121562000248578384fd5b84516200025581620002ad565b60208601516040870151606090970151919890975090945092505050565b60006020828403121562000285578081fd5b81516200029281620002ad565b9392505050565b6001600160a01b0391909116815260200190565b6001600160a01b0381168114620002c357600080fd5b50565b6142f680620002d66000396000f3fe608060405234801561001057600080fd5b50600436106100cf5760003560e01c8063845fe7a31161008c578063b2fa1c9e11610066578063b2fa1c9e14610185578063b52805711461019a578063b9194310146101a2578063c1c618b8146101b5576100cf565b8063845fe7a314610155578063a244316a14610168578063b1c9fe6e14610170576100cf565b8063299ca478146100d45780632e1ac36c146100f25780632eb1375814610107578063461a44781461011a578063732f960b1461012d578063805e9d3014610140575b600080fd5b6100dc6101bd565b6040516100e99190613c74565b60405180910390f35b6101056101003660046138d0565b6101cc565b005b610105610115366004613910565b610565565b6100dc6101283660046139f8565b6108a1565b61010561013b366004613abc565b61097f565b610148610c6f565b6040516100e99190613bcd565b6101056101633660046138d0565b610c75565b610105610fa1565b610178611128565b6040516100e99190613d26565b61018d611131565b6040516100e99190613d1b565b6100dc61114c565b6101056101b0366004613871565b61115b565b610148611475565b6000546001600160a01b031681565b60018060045460ff1660028111156101e057fe5b146102065760405162461bcd60e51b81526004016101fd90614077565b60405180910390fd5b60025460065460005a6001546040516363b285f960e11b81529192506001600160a01b03169063c7650bf290610242908a908a90600401613c88565b602060405180830381600087803b15801561025c57600080fd5b505af1158015610270573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610294919061395d565b15156001146102b55760405162461bcd60e51b81526004016101fd90613e22565b60015460405163fbcbc0f160e01b81526000916001600160a01b03169063fbcbc0f1906102e6908b90600401613c74565b60c06040518083038186803b1580156102fe57600080fd5b505afa158015610312573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103369190613a3d565b600154604051631aaf392f60e01b81529192506000916001600160a01b0390911690631aaf392f9061036e908c908c90600401613c88565b60206040518083038186803b15801561038657600080fd5b505afa15801561039a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103be9190613977565b90506103ff886040516020016103d49190613bcd565b6040516020818303038152906040526103f46103ef8461147b565b6114c4565b89856040015161152e565b6040808401919091526001549051638f3b964760e01b81526001600160a01b0390911690638f3b964790610439908c908690600401613cc2565b600060405180830381600087803b15801561045357600080fd5b505af1158015610467573d6000803e3d6000fd5b505050507f3e3ed1a676a2754a041b49bf752e0f167c8753495e36c320fe01d1ef7476253c898960405161049c929190613c88565b60405180910390a1505060005a820390506104dd6040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506108a1565b6001600160a01b0316631e16e92f858533856040518563ffffffff1660e01b815260040180858152602001848152602001836001600160a01b03168152602001828152602001945050505050600060405180830381600087803b15801561054357600080fd5b505af1158015610557573d6000803e3d6000fd5b505050505050505050505050565b60018060045460ff16600281111561057957fe5b146105965760405162461bcd60e51b81526004016101fd90614077565b60025460065460005a9050600160009054906101000a90046001600160a01b03166001600160a01b03166399056ba96040518163ffffffff1660e01b815260040160206040518083038186803b1580156105ef57600080fd5b505afa158015610603573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106279190613977565b156106445760405162461bcd60e51b81526004016101fd90613f03565b600154604051630b38106960e11b81526001600160a01b039091169063167020d290610674908990600401613c74565b602060405180830381600087803b15801561068e57600080fd5b505af11580156106a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106c6919061395d565b15156001146106e75760405162461bcd60e51b81526004016101fd90613fbd565b60015460405163fbcbc0f160e01b81526000916001600160a01b03169063fbcbc0f190610718908a90600401613c74565b60c06040518083038186803b15801561073057600080fd5b505afa158015610744573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107689190613a3d565b90506107a78760405160200161077e9190613bb0565b60405160208183030381529060405261079e61079984611554565b611594565b8860035461152e565b6003556040517fcec9ef675d775706a02b43afe48af52c5019bc50f99582e3208c6ff55d59c008906107da908990613c74565b60405180910390a15060005a8203905061081a6040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506108a1565b6001600160a01b0316631e16e92f858533856040518563ffffffff1660e01b815260040180858152602001848152602001836001600160a01b03168152602001828152602001945050505050600060405180830381600087803b15801561088057600080fd5b505af1158015610894573d6000803e3d6000fd5b5050505050505050505050565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b838110156109015781810151838201526020016108e9565b50505050905090810190601f16801561092e5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561094b57600080fd5b505afa15801561095f573d6000803e3d6000fd5b505050506040513d602081101561097557600080fd5b505190505b919050565b60008060045460ff16600281111561099357fe5b146109b05760405162461bcd60e51b81526004016101fd90614077565b60025460065460005a90506006546109c78661169d565b146109e45760405162461bcd60e51b81526004016101fd906140c8565b6103e88560a0015161040802816109f757fe5b04620186a0015a1015610a1c5760405162461bcd60e51b81526004016101fd90613f60565b6000610a536040518060400160405280601481526020017327ab26afa2bc32b1baba34b7b726b0b730b3b2b960611b8152506108a1565b600154604051631381ba4d60e01b81529192506001600160a01b031690631381ba4d90610a84908490600401613c74565b600060405180830381600087803b158015610a9e57600080fd5b505af1158015610ab2573d6000803e3d6000fd5b5050600154604051639be3ad6760e01b81526001600160a01b038086169450639be3ad679350610ae9928b9291169060040161415c565b600060405180830381600087803b158015610b0357600080fd5b505af1158015610b17573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610b3f919081019061398f565b50600154604051631381ba4d60e01b81526001600160a01b0390911690631381ba4d90610b7190600090600401613c74565b600060405180830381600087803b158015610b8b57600080fd5b505af1158015610b9f573d6000803e3d6000fd5b50506004805460ff191660011790555060009150505a82039050610be96040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506108a1565b6001600160a01b0316631e16e92f858533856040518563ffffffff1660e01b815260040180858152602001848152602001836001600160a01b03168152602001828152602001945050505050600060405180830381600087803b158015610c4f57600080fd5b505af1158015610c63573d6000803e3d6000fd5b50505050505050505050565b60025490565b60008060045460ff166002811115610c8957fe5b14610ca65760405162461bcd60e51b81526004016101fd90614077565b60025460065460005a600154604051630ad2267960e01b81529192506001600160a01b031690630ad2267990610ce2908a908a90600401613c88565b60206040518083038186803b158015610cfa57600080fd5b505afa158015610d0e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d32919061395d565b15610d4f5760405162461bcd60e51b81526004016101fd90613d3a565b60015460405163c8e40fbf60e01b81526001600160a01b039091169063c8e40fbf90610d7f908a90600401613c74565b60206040518083038186803b158015610d9757600080fd5b505afa158015610dab573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dcf919061395d565b1515600114610df05760405162461bcd60e51b81526004016101fd906140ff565b60015460405163136e2d8960e11b81526000916001600160a01b0316906326dc5b1290610e21908b90600401613c74565b60206040518083038186803b158015610e3957600080fd5b505afa158015610e4d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e719190613977565b905060007f56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421821415610ea557506000610f02565b600080610ed28a604051602001610ebc9190613bcd565b6040516020818303038152906040528a866116b6565b909250905060018215151415610efa57610ef3610eee826116df565b6116f2565b9250610eff565b600092505b50505b600154604051635c17d62960e01b81526001600160a01b0390911690635c17d62990610f36908c908c908690600401613ca1565b600060405180830381600087803b158015610f5057600080fd5b505af1158015610f64573d6000803e3d6000fd5b50505050505060005a820390506104dd6040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506108a1565b60018060045460ff166002811115610fb557fe5b14610fd25760405162461bcd60e51b81526004016101fd90614077565b600160009054906101000a90046001600160a01b03166001600160a01b031663d7bd4a2a6040518163ffffffff1660e01b815260040160206040518083038186803b15801561102057600080fd5b505afa158015611034573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110589190613977565b156110755760405162461bcd60e51b81526004016101fd90613dc5565b600160009054906101000a90046001600160a01b03166001600160a01b03166399056ba96040518163ffffffff1660e01b815260040160206040518083038186803b1580156110c357600080fd5b505afa1580156110d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110fb9190613977565b156111185760405162461bcd60e51b81526004016101fd9061401a565b506004805460ff19166002179055565b60045460ff1681565b6000600260045460ff16600281111561114657fe5b14905090565b6001546001600160a01b031681565b60008060045460ff16600281111561116f57fe5b1461118c5760405162461bcd60e51b81526004016101fd90614077565b60025460065460005a60015460405163c8e40fbf60e01b81529192506001600160a01b03169063c8e40fbf906111c6908a90600401613c74565b60206040518083038186803b1580156111de57600080fd5b505afa1580156111f2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611216919061395d565b1580156112a057506001546040516307a1294560e01b81526001600160a01b03909116906307a129459061124e908a90600401613c74565b60206040518083038186803b15801561126657600080fd5b505afa15801561127a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061129e919061395d565b155b6112bc5760405162461bcd60e51b81526004016101fd90613d7f565b6000806112eb896040516020016112d39190613bb0565b604051602081830303815290604052886002546116b6565b90925090506001821515141561140c57600061130682611721565b606081015190915089907fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470141561133f5750600061136a565b816060015161134d826117b3565b1461136a5760405162461bcd60e51b81526004016101fd90613e80565b6001546040805160c08101825284518152602080860151908201528482015181830152606080860151908201526001600160a01b038481166080830152600060a08301529151638f3b964760e01b81529190921691638f3b9647916113d3918f91600401613cc2565b600060405180830381600087803b1580156113ed57600080fd5b505af1158015611401573d6000803e3d6000fd5b50505050505061143c565b600154604051630d631c9d60e31b81526001600160a01b0390911690636b18e4e890610f36908c90600401613c74565b505060005a820390506104dd6040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506108a1565b60035490565b6060806000805b6020811085821a15161561149c5760019182019101611482565b5060405191506040820160405283600882021b60208301528060200382525080915050919050565b606080825160011480156114ec57506080836000815181106114e257fe5b016020015160f81c105b156114f8575081611528565b611504835160806117b7565b83604051602001611516929190613bd6565b60405160208183030381529060405290505b92915050565b60008061153a86611906565b905061154881868686611936565b9150505b949350505050565b61155c61378f565b604051806080016040528083600001518152602001836020015181526020018360400151815260200183606001518152509050919050565b60408051600480825260a0820190925260609160009190816020015b60608152602001906001900390816115b057505083519091506115d6906103ef9061147b565b816000815181106115e357fe5b60200260200101819052506116016103ef846020015160001b61147b565b8160018151811061160e57fe5b602002602001018190525061164583604001516040516020016116319190613bcd565b6040516020818303038152906040526114c4565b8160028151811061165257fe5b602002602001018190525061167583606001516040516020016116319190613bcd565b8160038151811061168257fe5b6020026020010181905250611696816119d1565b9392505050565b60006116a882611a15565b805190602001209050919050565b6000606060006116c586611906565b90506116d2818686611a50565b9250925050935093915050565b60606115286116ed83611b23565b611b48565b600080600060208451111561170857602061170b565b83515b6020858101519190036008021c92505050919050565b61172961378f565b600061173483611bd7565b9050604051806080016040528061175e8360008151811061175157fe5b6020026020010151611bea565b81526020016117738360018151811061175157fe5b81526020016117958360028151811061178857fe5b6020026020010151611bf1565b81526020016117aa8360038151811061178857fe5b90529392505050565b3f90565b6060806038841015611811576040805160018082528183019092529060208201818036833701905050905082840160f81b816000815181106117f557fe5b60200101906001600160f81b031916908160001a905350611696565b600060015b80868161181f57fe5b04156118345760019091019061010002611816565b816001016001600160401b038111801561184d57600080fd5b506040519080825280601f01601f191660200182016040528015611878576020820181803683370190505b50925084820160370160f81b8360008151811061189157fe5b60200101906001600160f81b031916908160001a905350600190505b8181116118fd576101008183036101000a87816118c657fe5b04816118ce57fe5b0660f81b8382815181106118de57fe5b60200101906001600160f81b031916908160001a9053506001016118ad565b50509392505050565b606081805190602001206040516020016119209190613bcd565b6040516020818303038152906040529050919050565b6040805180820190915260018152600160ff1b60209091015260007f56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42182141561198a576119838585611ceb565b905061154c565b600061199584611d0f565b90506000806119a5838987611de5565b509150915060006119b88484848b612188565b90506119c4818a6124a0565b9998505050505050505050565b606060006119de836125f9565b90506119ec815160c06117b7565b816040516020016119fe929190613bd6565b604051602081830303815290604052915050919050565b6060816000015182602001518360400151846060015185608001518660a001518760c001516040516020016119209796959493929190613c05565b600060606000611a5f85611d0f565b90506000806000611a71848a89611de5565b81519295509093509150158080611a855750815b611ad6576040805162461bcd60e51b815260206004820152601a60248201527f50726f76696465642070726f6f6620697320696e76616c69642e000000000000604482015290519081900360640190fd5b600081611af25760405180602001604052806000815250611b11565b611b11866001870381518110611b0457fe5b6020026020010151612702565b919b919a509098505050505050505050565b611b2b6137b6565b506040805180820190915281518152602082810190820152919050565b60606000806000611b588561271e565b919450925090506000816001811115611b6d57fe5b14611bbf576040805162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c502062797465732076616c75652e0000000000000000604482015290519081900360640190fd5b611bce85602001518484612a47565b95945050505050565b6060611528611be583611b23565b612af4565b6000611528825b6000602182600001511115611c4d576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e000000000000604482015290519081900360640190fd5b6000806000611c5b8561271e565b919450925090506000816001811115611c7057fe5b14611cc2576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e000000000000604482015290519081900360640190fd5b602080860151840180519091841015611ce15760208490036101000a90045b9695505050505050565b6000611cff611cf984612c6a565b83612d66565b5180516020909101209392505050565b60606000611d1c83611bd7565b9050600081516001600160401b0381118015611d3757600080fd5b50604051908082528060200260200182016040528015611d7157816020015b611d5e6137d0565b815260200190600190039081611d565790505b50905060005b8251811015611ddd576000611d9e848381518110611d9157fe5b6020026020010151611b48565b90506040518060400160405280828152602001611dba83611bd7565b815250838381518110611dc957fe5b602090810291909101015250600101611d77565b509392505050565b60006060818080611df587612c6a565b905085600080611e036137d0565b60005b8c51811015612160578c8181518110611e1b57fe5b6020026020010151915082840193506001870196508360001415611e8f57815180516020909101208514611e8a576040805162461bcd60e51b8152602060048201526011602482015270092dcecc2d8d2c840e4dedee840d0c2e6d607b1b604482015290519081900360640190fd5b611f56565b815151602011611ef657815180516020909101208514611e8a576040805162461bcd60e51b815260206004820152601b60248201527f496e76616c6964206c6172676520696e7465726e616c20686173680000000000604482015290519081900360640190fd5b84611f048360000151612dfa565b14611f56576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420696e7465726e616c206e6f64652068617368000000000000604482015290519081900360640190fd5b60208201515160111415611fc5578551841415611f7257612160565b6000868581518110611f8057fe5b602001015160f81c60f81b60f81c9050600083602001518260ff1681518110611fa557fe5b60200260200101519050611fb881612e26565b9650600194505050612158565b6002826020015151141561210b576000611fde83612e5c565b9050600081600081518110611fef57fe5b016020015160f81c905060018116600203600061200f8460ff8416612e7a565b9050600061201d8b8a612e7a565b9050600061202b8383612eab565b905060ff851660021480612042575060ff85166003145b15612074578083511480156120575750808251145b1561206157988901985b50600160ff1b9950612160945050505050565b60ff85161580612087575060ff85166001145b156120d457806120a45750600160ff1b9950612160945050505050565b6120c588602001516001815181106120b857fe5b6020026020010151612e26565b9a509750612158945050505050565b60405162461bcd60e51b815260040180806020018281038252602681526020018061429b6026913960400191505060405180910390fd5b6040805162461bcd60e51b815260206004820152601d60248201527f526563656976656420616e20756e706172736561626c65206e6f64652e000000604482015290519081900360640190fd5b600101611e06565b50600160ff1b8414866121738786612e7a565b909e909d50909b509950505050505050505050565b6060600083905060008660018703815181106121a057fe5b6020026020010151905060006121b582612f11565b6040805160038082526080820190925291925060009190816020015b6121d96137d0565b8152602001906001900390816121d157905050905060008451600014801561220c5750600283600281111561220a57fe5b145b156122425761222361221d85612fe7565b88612d66565b82828151811061222f57fe5b6020908102919091010152600101612483565b600083600281111561225057fe5b14156122b6578451612285576122668488612ffa565b82828151811061227257fe5b60209081029190910101526001016122b1565b8382828151811061229257fe5b602002602001018190525060018101905061222361221d866001612e7a565b612483565b60006122c185612fe7565b905060006122cf8288612eab565b905080156123305760006122e583600084613045565b90506122f9816122f48c613195565b6131d6565b85858151811061230557fe5b60200260200101819052506001840193506123208383612e7a565b925061232c8883612e7a565b9750505b600061233a61321a565b905082516000141561235f576123588161235389612702565b612ffa565b90506123f7565b60008360008151811061236e57fe5b016020015160f81c9050612383846001612e7a565b9350600287600281111561239357fe5b14156123ce5760006123ad856123a88b612702565b612d66565b90506123c683836123c18460000151613195565b6132a7565b9250506123f5565b8351156123e45760006123ad856122f48b612702565b6123f282826123c18b612702565b91505b505b875161242c57612407818b612ffa565b90508085858151811061241657fe5b602002602001018190525060018401935061247f565b612437886001612e7a565b97508085858151811061244657fe5b6020026020010181905250600184019350612461888b612d66565b85858151811061246d57fe5b60200260200101819052506001840193505b5050505b6124928a60018b038484613300565b9a9950505050505050505050565b6000806124ac83612c6a565b90506124b66137d0565b84516000906060905b80156125e4578760018203815181106124d457fe5b602002602001015193506124e784612f11565b925060028360028111156124f757fe5b141561252257600061250885612fe7565b905061251a8660008351895103613045565b9550506125ce565b600183600281111561253057fe5b141561257057600061254185612fe7565b90506125538660008351895103613045565b83519096501561256a5761256781846131d6565b94505b506125ce565b600083600281111561257e57fe5b14156125ce578151156125ce5760008560018751038151811061259d57fe5b602001015160f81c60f81b60f81c90506125bd8660006001895103613045565b95506125ca8582856132a7565b9450505b83516125d990613195565b9150600019016124bf565b50509051805160209091012095945050505050565b606081516000141561261a575060408051600081526020810190915261097a565b6000805b835181101561264d5783818151811061263357fe5b60200260200101515182019150808060010191505061261e565b6000826001600160401b038111801561266557600080fd5b506040519080825280601f01601f191660200182016040528015612690576020820181803683370190505b50600092509050602081015b85518310156126f95760008684815181106126b357fe5b6020026020010151905060006020820190506126d1838284516133e2565b8785815181106126dd57fe5b602002602001015151830192505050828060010193505061269c565b50949350505050565b60208101518051606091611528916000198101908110611d9157fe5b60008060008084600001511161277b576040805162461bcd60e51b815260206004820152601860248201527f524c50206974656d2063616e6e6f74206265206e756c6c2e0000000000000000604482015290519081900360640190fd5b6020840151805160001a607f81116127a0576000600160009450945094505050612a40565b60b78111612815578551607f198201908110612803576040805162461bcd60e51b815260206004820152601960248201527f496e76616c696420524c502073686f727420737472696e672e00000000000000604482015290519081900360640190fd5b60019550935060009250612a40915050565b60bf81116128f957855160b6198201908110612878576040805162461bcd60e51b815260206004820152601f60248201527f496e76616c696420524c50206c6f6e6720737472696e67206c656e6774682e00604482015290519081900360640190fd5b6000816020036101000a60018501510490508082018860000151116128e4576040805162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c50206c6f6e6720737472696e672e0000000000000000604482015290519081900360640190fd5b60019091019550935060009250612a40915050565b60f7811161296d57855160bf19820190811061295c576040805162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c502073686f7274206c6973742e000000000000000000604482015290519081900360640190fd5b600195509350849250612a40915050565b855160f61982019081106129c8576040805162461bcd60e51b815260206004820152601d60248201527f496e76616c696420524c50206c6f6e67206c697374206c656e6774682e000000604482015290519081900360640190fd5b6000816020036101000a6001850151049050808201886000015111612a2d576040805162461bcd60e51b815260206004820152601660248201527524b73b30b634b210292628103637b733903634b9ba1760511b604482015290519081900360640190fd5b6001918201965094509250612a40915050565b9193909250565b60606000826001600160401b0381118015612a6157600080fd5b506040519080825280601f01601f191660200182016040528015612a8c576020820181803683370190505b509050805160001415612aa0579050611696565b8484016020820160005b60208604811015612acb578251825260209283019290910190600101612aaa565b5080519151601f959095166020036101000a600019019182169119909416179092525092915050565b6060600080612b028461271e565b91935090915060019050816001811115612b1857fe5b14612b6a576040805162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c50206c6973742076616c75652e000000000000000000604482015290519081900360640190fd5b6040805160208082526104208201909252600091816020015b612b8b6137b6565b815260200190600190039081612b835790505090506000835b8651811015612c5f5760208210612bec5760405162461bcd60e51b815260040180806020018281038252602a815260200180614271602a913960400191505060405180910390fd5b600080612c186040518060400160405280858c60000151038152602001858c602001510181525061271e565b509150915060405180604001604052808383018152602001848b6020015101815250858581518110612c4657fe5b6020908102919091010152600193909301920101612ba4565b508152949350505050565b6060600082516002026001600160401b0381118015612c8857600080fd5b506040519080825280601f01601f191660200182016040528015612cb3576020820181803683370190505b50905060005b8351811015612d5f576004848281518110612cd057fe5b602001015160f81c60f81b6001600160f81b031916901c828260020281518110612cf657fe5b60200101906001600160f81b031916908160001a9053506010848281518110612d1b57fe5b016020015160f81c81612d2a57fe5b0660f81b828260020260010181518110612d4057fe5b60200101906001600160f81b031916908160001a905350600101612cb9565b5092915050565b612d6e6137d0565b60408051600280825260608201909252600091816020015b6060815260200190600190039081612d865790505090506000612daa856001613426565b9050612db86103ef8261357d565b82600081518110612dc557fe5b6020026020010181905250612dd9846114c4565b82600181518110612de657fe5b6020026020010181905250611bce8261364d565b6000602082511015612e115750602081015161097a565b81806020019051602081101561097557600080fd5b60006060602083600001511015612e4757612e408361367c565b9050612e53565b612e5083611b48565b90505b61169681612dfa565b6060611528612e758360200151600081518110611d9157fe5b612c6a565b60608183510360001415612e9d5750604080516020810190915260008152611528565b611696838384865103613045565b6000805b808451118015612ebf5750808351115b8015612f045750828181518110612ed257fe5b602001015160f81c60f81b6001600160f81b031916848281518110612ef357fe5b01602001516001600160f81b031916145b1561169657600101612eaf565b60208101515160009060111415612f2a5750600061097a565b60028260200151511415612fa6576000612f4383612e5c565b9050600081600081518110612f5457fe5b016020015160f81c90506002811480612f70575060ff81166003145b15612f805760029250505061097a565b60ff81161580612f93575060ff81166001145b15612fa35760019250505061097a565b50505b6040805162461bcd60e51b8152602060048201526011602482015270496e76616c6964206e6f6465207479706560781b604482015290519081900360640190fd5b6060611528612ff583612e5c565b613687565b6130026137d0565b600061300d836114c4565b905061301881611b23565b60208501518051600019810190811061302d57fe5b602002602001018190525061154c84602001516136d0565b60608182601f011015613090576040805162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b604482015290519081900360640190fd5b8282840110156130d8576040805162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b604482015290519081900360640190fd5b81830184511015613124576040805162461bcd60e51b8152602060048201526011602482015270736c6963655f6f75744f66426f756e647360781b604482015290519081900360640190fd5b60608215801561314357604051915060008252602082016040526126f9565b6040519150601f8416801560200281840101858101878315602002848b0101015b8183101561317c578051835260209283019201613164565b5050858452601f01601f19166040525050949350505050565b60606020825110156131a857508061097a565b818051906020012060405160200180828152602001915050604051602081830303815290604052905061097a565b6131de6137d0565b60408051600280825260608201909252600091816020015b60608152602001906001900390816131f65790505090506000612daa856000613426565b6132226137d0565b6040805160118082526102408201909252600091816020015b606081526020019060019003908161323b57905050905060005b815181101561329757604051806040016040528060018152602001600160ff1b81525082828151811061328457fe5b6020908102919091010152600101613255565b506132a18161364d565b91505090565b6132af6137d0565b600060208351106132c8576132c3836114c4565b6132ca565b825b90506132d581611b23565b85602001518560ff16815181106132e857fe5b6020026020010181905250611bce85602001516136d0565b606060008285016001600160401b038111801561331c57600080fd5b5060405190808252806020026020018201604052801561335657816020015b6133436137d0565b81526020019060019003908161333b5790505b50905060005b858110156133975786818151811061337057fe5b602002602001015182828151811061338457fe5b602090810291909101015260010161335c565b5060005b838110156133d8578481815181106133af57fe5b602002602001015182878301815181106133c557fe5b602090810291909101015260010161339b565b5095945050505050565b8282825b60208110613405578151835260209283019290910190601f19016133e6565b905182516020929092036101000a6000190180199091169116179052505050565b6060600082613436576000613439565b60025b90506000600285518161344857fe5b06905060008160020360ff166001600160401b038111801561346957600080fd5b506040519080825280601f01601f191660200182016040528015613494576020820181803683370190505b50905081830160f81b816000815181106134aa57fe5b60200101906001600160f81b031916908160001a90535080866040516020018083805190602001908083835b602083106134f55780518252601f1990920191602091820191016134d6565b51815160209384036101000a600019018019909216911617905285519190930192850191508083835b6020831061353d5780518252601f19909201916020918201910161351e565b6001836020036101000a03801982511681845116808217855250505050505090500192505050604051602081830303815290604052935050505092915050565b60606000600283518161358c57fe5b046001600160401b03811180156135a257600080fd5b506040519080825280601f01601f1916602001820160405280156135cd576020820181803683370190505b50905060005b8151811015612d5f578381600202600101815181106135ee57fe5b602001015160f81c60f81b600485836002028151811061360a57fe5b602001015160f81c60f81b6001600160f81b031916901b1782828151811061362e57fe5b60200101906001600160f81b031916908160001a9053506001016135d3565b6136556137d0565b6000613660836119d1565b905060405180604001604052808281526020016117aa83611bd7565b606061152882613779565b606060028260008151811061369857fe5b016020015160f81c816136a757fe5b0660ff16600014156136c5576136be826002612e7a565b905061097a565b6136be826001612e7a565b6136d86137d0565b600082516001600160401b03811180156136f157600080fd5b5060405190808252806020026020018201604052801561372557816020015b60608152602001906001900390816137105790505b50905060005b835181101561376f5761375084828151811061374357fe5b602002602001015161367c565b82828151811061375c57fe5b602090810291909101015260010161372b565b506116968161364d565b6060611528826020015160008460000151612a47565b60408051608081018252600080825260208201819052918101829052606081019190915290565b604051806040016040528060008152602001600081525090565b604051806040016040528060608152602001606081525090565b60006137fd6137f884614207565b6141e4565b905082815283838301111561381157600080fd5b828260208301376000602084830101529392505050565b803561097a81614258565b8051801515811461097a57600080fd5b600082601f830112613853578081fd5b611696838335602085016137ea565b80356002811061097a57600080fd5b600080600060608486031215613885578283fd5b833561389081614258565b925060208401356138a081614258565b915060408401356001600160401b038111156138ba578182fd5b6138c686828701613843565b9150509250925092565b6000806000606084860312156138e4578283fd5b83356138ef81614258565b92506020840135915060408401356001600160401b038111156138ba578182fd5b60008060408385031215613922578182fd5b823561392d81614258565b915060208301356001600160401b03811115613947578182fd5b61395385828601613843565b9150509250929050565b60006020828403121561396e578081fd5b61169682613833565b600060208284031215613988578081fd5b5051919050565b6000602082840312156139a0578081fd5b81516001600160401b038111156139b5578182fd5b8201601f810184136139c5578182fd5b80516139d36137f882614207565b8181528560208385010111156139e7578384fd5b611bce826020830160208601614228565b600060208284031215613a09578081fd5b81356001600160401b03811115613a1e578182fd5b8201601f81018413613a2e578182fd5b61154c848235602084016137ea565b600060c08284031215613a4e578081fd5b60405160c081018181106001600160401b0382111715613a6a57fe5b8060405250825181526020830151602082015260408301516040820152606083015160608201526080830151613a9f81614258565b6080820152613ab060a08401613833565b60a08201529392505050565b600060208284031215613acd578081fd5b81356001600160401b0380821115613ae3578283fd5b9083019060e08286031215613af6578283fd5b613b0060e06141e4565b8235815260208301356020820152613b1a60408401613862565b6040820152613b2b60608401613828565b6060820152613b3c60808401613828565b608082015260a083013560a082015260c083013582811115613b5c578485fd5b613b6887828601613843565b60c08301525095945050505050565b6001600160a01b03169052565b60008151808452613b9c816020860160208601614228565b601f01601f19169290920160200192915050565b60609190911b6bffffffffffffffffffffffff1916815260140190565b90815260200190565b60008351613be8818460208801614228565b835190830190613bfc818360208801614228565b01949350505050565b600088825287602083015260028710613c1a57fe5b8660f81b60408301526bffffffffffffffffffffffff19808760601b166041840152808660601b166055840152508360698301528251613c61816089850160208701614228565b9190910160890198975050505050505050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039390931683526020830191909152604082015260600190565b600060e08201905060018060a01b038085168352835160208401526020840151604084015260408401516060840152606084015160808401528060808501511660a08401525060a0830151151560c08301529392505050565b901515815260200190565b6020810160038310613d3457fe5b91905290565b60208082526025908201527f53746f7261676520736c6f742068617320616c7265616479206265656e20707260408201526437bb32b71760d91b606082015260800190565b60208082526026908201527f4163636f756e742073746174652068617320616c7265616479206265656e20706040820152653937bb32b71760d11b606082015260800190565b6020808252603e908201527f416c6c206163636f756e7473206d75737420626520636f6d6d6974746564206260408201527f65666f726520636f6d706c6574696e672061207472616e736974696f6e2e0000606082015260800190565b602080825260409082018190527f53746f7261676520736c6f742076616c7565207761736e2774206368616e6765908201527f64206f722068617320616c7265616479206265656e20636f6d6d69747465642e606082015260800190565b6020808252605b908201527f4f564d5f53746174655472616e736974696f6e65723a2050726f76696465642060408201527f4c3120636f6e747261637420636f6465206861736820646f6573206e6f74206d60608201527f61746368204c3220636f6e747261637420636f646520686173682e0000000000608082015260a00190565b6020808252603f908201527f416c6c2073746f72616765206d75737420626520636f6d6d697474656420626560408201527f666f726520636f6d6d697474696e67206163636f756e74207374617465732e00606082015260800190565b60208082526038908201527f4e6f7420656e6f7567682067617320746f2065786563757465207472616e736160408201527f6374696f6e2064657465726d696e6973746963616c6c792e0000000000000000606082015260800190565b6020808252603b908201527f4163636f756e74207374617465207761736e2774206368616e676564206f722060408201527f68617320616c7265616479206265656e20636f6d6d69747465642e0000000000606082015260800190565b6020808252603d908201527f416c6c2073746f72616765206d75737420626520636f6d6d697474656420626560408201527f666f726520636f6d706c6574696e672061207472616e736974696f6e2e000000606082015260800190565b60208082526031908201527f46756e6374696f6e206d7573742062652063616c6c656420647572696e67207460408201527034329031b7b93932b1ba10383430b9b29760791b606082015260800190565b6020808252601d908201527f496e76616c6964207472616e73616374696f6e2070726f76696465642e000000604082015260600190565b60208082526038908201527f436f6e7472616374206d757374206265207665726966696564206265666f726560408201527f2070726f76696e6720612073746f7261676520736c6f742e0000000000000000606082015260800190565b600060408252835160408301526020840151606083015260408401516002811061418257fe5b60808381019190915260608501516001600160a01b031660a08401528401516141ae60c0840182613b77565b5060a084015160e083015260c084015160e06101008401526141d4610120840182613b84565b9150506116966020830184613b77565b6040518181016001600160401b03811182821017156141ff57fe5b604052919050565b60006001600160401b0382111561421a57fe5b50601f01601f191660200190565b60005b8381101561424357818101518382015260200161422b565b83811115614252576000848401525b50505050565b6001600160a01b038116811461426d57600080fd5b5056fe50726f766964656420524c50206c6973742065786365656473206d6178206c697374206c656e6774682e52656365697665642061206e6f6465207769746820616e20756e6b6e6f776e20707265666978a2646970667358221220ce5bdf188c3574b3ab8fd8d954100f14bc36e9cb42e1ca798a8f556d7ace41f564736f6c634300070600334372656174652063616e206f6e6c7920626520646f6e6520627920746865204f564d5f467261756456657269666965722ea26469706673582212200d398ad651c22ef8f9239e5104dc8b8e30dec6c479966de4f2382a136a81db4864736f6c63430007060033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100415760003560e01c806322d1470214610046578063299ca4781461009a578063461a4478146100a2575b600080fd5b61007e6004803603608081101561005c57600080fd5b506001600160a01b038135169060208101359060408101359060600135610148565b604080516001600160a01b039092168252519081900360200190f35b61007e610229565b61007e600480360360208110156100b857600080fd5b8101906020810181356401000000008111156100d357600080fd5b8201836020820111156100e557600080fd5b8035906020019184600183028401116401000000008311171561010757600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610238945050505050565b600061017c6040518060400160405280601181526020017027ab26afa33930bab22b32b934b334b2b960791b815250610238565b6001600160a01b0316336001600160a01b0316146101cb5760405162461bcd60e51b81526004018080602001828103825260318152602001806148ee6031913960400191505060405180910390fd5b848484846040516101db90610314565b80856001600160a01b03168152602001848152602001838152602001828152602001945050505050604051809103906000f08015801561021f573d6000803e3d6000fd5b5095945050505050565b6000546001600160a01b031681565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b83811015610298578181015183820152602001610280565b50505050905090810190601f1680156102c55780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b1580156102e257600080fd5b505afa1580156102f6573d6000803e3d6000fd5b505050506040513d602081101561030c57600080fd5b505192915050565b6145cc806103228339019056fe60806040523480156200001157600080fd5b50604051620045cc380380620045cc833981016040819052620000349162000232565b600080546001600160a01b0319166001600160a01b038616179055600583905560028290556003829055600681905560408051808201909152601781527f4f564d5f53746174654d616e61676572466163746f72790000000000000000006020820152620000a29062000150565b6001600160a01b0316639ed93318306040518263ffffffff1660e01b8152600401620000cf919062000299565b602060405180830381600087803b158015620000ea57600080fd5b505af1158015620000ff573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000125919062000273565b600180546001600160a01b0319166001600160a01b039290921691909117905550620002c692505050565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b83811015620001b257818101518382015260200162000198565b50505050905090810190601f168015620001e05780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b158015620001fe57600080fd5b505afa15801562000213573d6000803e3d6000fd5b505050506040513d60208110156200022a57600080fd5b505192915050565b6000806000806080858703121562000248578384fd5b84516200025581620002ad565b60208601516040870151606090970151919890975090945092505050565b60006020828403121562000285578081fd5b81516200029281620002ad565b9392505050565b6001600160a01b0391909116815260200190565b6001600160a01b0381168114620002c357600080fd5b50565b6142f680620002d66000396000f3fe608060405234801561001057600080fd5b50600436106100cf5760003560e01c8063845fe7a31161008c578063b2fa1c9e11610066578063b2fa1c9e14610185578063b52805711461019a578063b9194310146101a2578063c1c618b8146101b5576100cf565b8063845fe7a314610155578063a244316a14610168578063b1c9fe6e14610170576100cf565b8063299ca478146100d45780632e1ac36c146100f25780632eb1375814610107578063461a44781461011a578063732f960b1461012d578063805e9d3014610140575b600080fd5b6100dc6101bd565b6040516100e99190613c74565b60405180910390f35b6101056101003660046138d0565b6101cc565b005b610105610115366004613910565b610565565b6100dc6101283660046139f8565b6108a1565b61010561013b366004613abc565b61097f565b610148610c6f565b6040516100e99190613bcd565b6101056101633660046138d0565b610c75565b610105610fa1565b610178611128565b6040516100e99190613d26565b61018d611131565b6040516100e99190613d1b565b6100dc61114c565b6101056101b0366004613871565b61115b565b610148611475565b6000546001600160a01b031681565b60018060045460ff1660028111156101e057fe5b146102065760405162461bcd60e51b81526004016101fd90614077565b60405180910390fd5b60025460065460005a6001546040516363b285f960e11b81529192506001600160a01b03169063c7650bf290610242908a908a90600401613c88565b602060405180830381600087803b15801561025c57600080fd5b505af1158015610270573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610294919061395d565b15156001146102b55760405162461bcd60e51b81526004016101fd90613e22565b60015460405163fbcbc0f160e01b81526000916001600160a01b03169063fbcbc0f1906102e6908b90600401613c74565b60c06040518083038186803b1580156102fe57600080fd5b505afa158015610312573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103369190613a3d565b600154604051631aaf392f60e01b81529192506000916001600160a01b0390911690631aaf392f9061036e908c908c90600401613c88565b60206040518083038186803b15801561038657600080fd5b505afa15801561039a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103be9190613977565b90506103ff886040516020016103d49190613bcd565b6040516020818303038152906040526103f46103ef8461147b565b6114c4565b89856040015161152e565b6040808401919091526001549051638f3b964760e01b81526001600160a01b0390911690638f3b964790610439908c908690600401613cc2565b600060405180830381600087803b15801561045357600080fd5b505af1158015610467573d6000803e3d6000fd5b505050507f3e3ed1a676a2754a041b49bf752e0f167c8753495e36c320fe01d1ef7476253c898960405161049c929190613c88565b60405180910390a1505060005a820390506104dd6040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506108a1565b6001600160a01b0316631e16e92f858533856040518563ffffffff1660e01b815260040180858152602001848152602001836001600160a01b03168152602001828152602001945050505050600060405180830381600087803b15801561054357600080fd5b505af1158015610557573d6000803e3d6000fd5b505050505050505050505050565b60018060045460ff16600281111561057957fe5b146105965760405162461bcd60e51b81526004016101fd90614077565b60025460065460005a9050600160009054906101000a90046001600160a01b03166001600160a01b03166399056ba96040518163ffffffff1660e01b815260040160206040518083038186803b1580156105ef57600080fd5b505afa158015610603573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106279190613977565b156106445760405162461bcd60e51b81526004016101fd90613f03565b600154604051630b38106960e11b81526001600160a01b039091169063167020d290610674908990600401613c74565b602060405180830381600087803b15801561068e57600080fd5b505af11580156106a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106c6919061395d565b15156001146106e75760405162461bcd60e51b81526004016101fd90613fbd565b60015460405163fbcbc0f160e01b81526000916001600160a01b03169063fbcbc0f190610718908a90600401613c74565b60c06040518083038186803b15801561073057600080fd5b505afa158015610744573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107689190613a3d565b90506107a78760405160200161077e9190613bb0565b60405160208183030381529060405261079e61079984611554565b611594565b8860035461152e565b6003556040517fcec9ef675d775706a02b43afe48af52c5019bc50f99582e3208c6ff55d59c008906107da908990613c74565b60405180910390a15060005a8203905061081a6040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506108a1565b6001600160a01b0316631e16e92f858533856040518563ffffffff1660e01b815260040180858152602001848152602001836001600160a01b03168152602001828152602001945050505050600060405180830381600087803b15801561088057600080fd5b505af1158015610894573d6000803e3d6000fd5b5050505050505050505050565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b838110156109015781810151838201526020016108e9565b50505050905090810190601f16801561092e5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561094b57600080fd5b505afa15801561095f573d6000803e3d6000fd5b505050506040513d602081101561097557600080fd5b505190505b919050565b60008060045460ff16600281111561099357fe5b146109b05760405162461bcd60e51b81526004016101fd90614077565b60025460065460005a90506006546109c78661169d565b146109e45760405162461bcd60e51b81526004016101fd906140c8565b6103e88560a0015161040802816109f757fe5b04620186a0015a1015610a1c5760405162461bcd60e51b81526004016101fd90613f60565b6000610a536040518060400160405280601481526020017327ab26afa2bc32b1baba34b7b726b0b730b3b2b960611b8152506108a1565b600154604051631381ba4d60e01b81529192506001600160a01b031690631381ba4d90610a84908490600401613c74565b600060405180830381600087803b158015610a9e57600080fd5b505af1158015610ab2573d6000803e3d6000fd5b5050600154604051639be3ad6760e01b81526001600160a01b038086169450639be3ad679350610ae9928b9291169060040161415c565b600060405180830381600087803b158015610b0357600080fd5b505af1158015610b17573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610b3f919081019061398f565b50600154604051631381ba4d60e01b81526001600160a01b0390911690631381ba4d90610b7190600090600401613c74565b600060405180830381600087803b158015610b8b57600080fd5b505af1158015610b9f573d6000803e3d6000fd5b50506004805460ff191660011790555060009150505a82039050610be96040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506108a1565b6001600160a01b0316631e16e92f858533856040518563ffffffff1660e01b815260040180858152602001848152602001836001600160a01b03168152602001828152602001945050505050600060405180830381600087803b158015610c4f57600080fd5b505af1158015610c63573d6000803e3d6000fd5b50505050505050505050565b60025490565b60008060045460ff166002811115610c8957fe5b14610ca65760405162461bcd60e51b81526004016101fd90614077565b60025460065460005a600154604051630ad2267960e01b81529192506001600160a01b031690630ad2267990610ce2908a908a90600401613c88565b60206040518083038186803b158015610cfa57600080fd5b505afa158015610d0e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d32919061395d565b15610d4f5760405162461bcd60e51b81526004016101fd90613d3a565b60015460405163c8e40fbf60e01b81526001600160a01b039091169063c8e40fbf90610d7f908a90600401613c74565b60206040518083038186803b158015610d9757600080fd5b505afa158015610dab573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dcf919061395d565b1515600114610df05760405162461bcd60e51b81526004016101fd906140ff565b60015460405163136e2d8960e11b81526000916001600160a01b0316906326dc5b1290610e21908b90600401613c74565b60206040518083038186803b158015610e3957600080fd5b505afa158015610e4d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e719190613977565b905060007f56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421821415610ea557506000610f02565b600080610ed28a604051602001610ebc9190613bcd565b6040516020818303038152906040528a866116b6565b909250905060018215151415610efa57610ef3610eee826116df565b6116f2565b9250610eff565b600092505b50505b600154604051635c17d62960e01b81526001600160a01b0390911690635c17d62990610f36908c908c908690600401613ca1565b600060405180830381600087803b158015610f5057600080fd5b505af1158015610f64573d6000803e3d6000fd5b50505050505060005a820390506104dd6040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506108a1565b60018060045460ff166002811115610fb557fe5b14610fd25760405162461bcd60e51b81526004016101fd90614077565b600160009054906101000a90046001600160a01b03166001600160a01b031663d7bd4a2a6040518163ffffffff1660e01b815260040160206040518083038186803b15801561102057600080fd5b505afa158015611034573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110589190613977565b156110755760405162461bcd60e51b81526004016101fd90613dc5565b600160009054906101000a90046001600160a01b03166001600160a01b03166399056ba96040518163ffffffff1660e01b815260040160206040518083038186803b1580156110c357600080fd5b505afa1580156110d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110fb9190613977565b156111185760405162461bcd60e51b81526004016101fd9061401a565b506004805460ff19166002179055565b60045460ff1681565b6000600260045460ff16600281111561114657fe5b14905090565b6001546001600160a01b031681565b60008060045460ff16600281111561116f57fe5b1461118c5760405162461bcd60e51b81526004016101fd90614077565b60025460065460005a60015460405163c8e40fbf60e01b81529192506001600160a01b03169063c8e40fbf906111c6908a90600401613c74565b60206040518083038186803b1580156111de57600080fd5b505afa1580156111f2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611216919061395d565b1580156112a057506001546040516307a1294560e01b81526001600160a01b03909116906307a129459061124e908a90600401613c74565b60206040518083038186803b15801561126657600080fd5b505afa15801561127a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061129e919061395d565b155b6112bc5760405162461bcd60e51b81526004016101fd90613d7f565b6000806112eb896040516020016112d39190613bb0565b604051602081830303815290604052886002546116b6565b90925090506001821515141561140c57600061130682611721565b606081015190915089907fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470141561133f5750600061136a565b816060015161134d826117b3565b1461136a5760405162461bcd60e51b81526004016101fd90613e80565b6001546040805160c08101825284518152602080860151908201528482015181830152606080860151908201526001600160a01b038481166080830152600060a08301529151638f3b964760e01b81529190921691638f3b9647916113d3918f91600401613cc2565b600060405180830381600087803b1580156113ed57600080fd5b505af1158015611401573d6000803e3d6000fd5b50505050505061143c565b600154604051630d631c9d60e31b81526001600160a01b0390911690636b18e4e890610f36908c90600401613c74565b505060005a820390506104dd6040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506108a1565b60035490565b6060806000805b6020811085821a15161561149c5760019182019101611482565b5060405191506040820160405283600882021b60208301528060200382525080915050919050565b606080825160011480156114ec57506080836000815181106114e257fe5b016020015160f81c105b156114f8575081611528565b611504835160806117b7565b83604051602001611516929190613bd6565b60405160208183030381529060405290505b92915050565b60008061153a86611906565b905061154881868686611936565b9150505b949350505050565b61155c61378f565b604051806080016040528083600001518152602001836020015181526020018360400151815260200183606001518152509050919050565b60408051600480825260a0820190925260609160009190816020015b60608152602001906001900390816115b057505083519091506115d6906103ef9061147b565b816000815181106115e357fe5b60200260200101819052506116016103ef846020015160001b61147b565b8160018151811061160e57fe5b602002602001018190525061164583604001516040516020016116319190613bcd565b6040516020818303038152906040526114c4565b8160028151811061165257fe5b602002602001018190525061167583606001516040516020016116319190613bcd565b8160038151811061168257fe5b6020026020010181905250611696816119d1565b9392505050565b60006116a882611a15565b805190602001209050919050565b6000606060006116c586611906565b90506116d2818686611a50565b9250925050935093915050565b60606115286116ed83611b23565b611b48565b600080600060208451111561170857602061170b565b83515b6020858101519190036008021c92505050919050565b61172961378f565b600061173483611bd7565b9050604051806080016040528061175e8360008151811061175157fe5b6020026020010151611bea565b81526020016117738360018151811061175157fe5b81526020016117958360028151811061178857fe5b6020026020010151611bf1565b81526020016117aa8360038151811061178857fe5b90529392505050565b3f90565b6060806038841015611811576040805160018082528183019092529060208201818036833701905050905082840160f81b816000815181106117f557fe5b60200101906001600160f81b031916908160001a905350611696565b600060015b80868161181f57fe5b04156118345760019091019061010002611816565b816001016001600160401b038111801561184d57600080fd5b506040519080825280601f01601f191660200182016040528015611878576020820181803683370190505b50925084820160370160f81b8360008151811061189157fe5b60200101906001600160f81b031916908160001a905350600190505b8181116118fd576101008183036101000a87816118c657fe5b04816118ce57fe5b0660f81b8382815181106118de57fe5b60200101906001600160f81b031916908160001a9053506001016118ad565b50509392505050565b606081805190602001206040516020016119209190613bcd565b6040516020818303038152906040529050919050565b6040805180820190915260018152600160ff1b60209091015260007f56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42182141561198a576119838585611ceb565b905061154c565b600061199584611d0f565b90506000806119a5838987611de5565b509150915060006119b88484848b612188565b90506119c4818a6124a0565b9998505050505050505050565b606060006119de836125f9565b90506119ec815160c06117b7565b816040516020016119fe929190613bd6565b604051602081830303815290604052915050919050565b6060816000015182602001518360400151846060015185608001518660a001518760c001516040516020016119209796959493929190613c05565b600060606000611a5f85611d0f565b90506000806000611a71848a89611de5565b81519295509093509150158080611a855750815b611ad6576040805162461bcd60e51b815260206004820152601a60248201527f50726f76696465642070726f6f6620697320696e76616c69642e000000000000604482015290519081900360640190fd5b600081611af25760405180602001604052806000815250611b11565b611b11866001870381518110611b0457fe5b6020026020010151612702565b919b919a509098505050505050505050565b611b2b6137b6565b506040805180820190915281518152602082810190820152919050565b60606000806000611b588561271e565b919450925090506000816001811115611b6d57fe5b14611bbf576040805162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c502062797465732076616c75652e0000000000000000604482015290519081900360640190fd5b611bce85602001518484612a47565b95945050505050565b6060611528611be583611b23565b612af4565b6000611528825b6000602182600001511115611c4d576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e000000000000604482015290519081900360640190fd5b6000806000611c5b8561271e565b919450925090506000816001811115611c7057fe5b14611cc2576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e000000000000604482015290519081900360640190fd5b602080860151840180519091841015611ce15760208490036101000a90045b9695505050505050565b6000611cff611cf984612c6a565b83612d66565b5180516020909101209392505050565b60606000611d1c83611bd7565b9050600081516001600160401b0381118015611d3757600080fd5b50604051908082528060200260200182016040528015611d7157816020015b611d5e6137d0565b815260200190600190039081611d565790505b50905060005b8251811015611ddd576000611d9e848381518110611d9157fe5b6020026020010151611b48565b90506040518060400160405280828152602001611dba83611bd7565b815250838381518110611dc957fe5b602090810291909101015250600101611d77565b509392505050565b60006060818080611df587612c6a565b905085600080611e036137d0565b60005b8c51811015612160578c8181518110611e1b57fe5b6020026020010151915082840193506001870196508360001415611e8f57815180516020909101208514611e8a576040805162461bcd60e51b8152602060048201526011602482015270092dcecc2d8d2c840e4dedee840d0c2e6d607b1b604482015290519081900360640190fd5b611f56565b815151602011611ef657815180516020909101208514611e8a576040805162461bcd60e51b815260206004820152601b60248201527f496e76616c6964206c6172676520696e7465726e616c20686173680000000000604482015290519081900360640190fd5b84611f048360000151612dfa565b14611f56576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420696e7465726e616c206e6f64652068617368000000000000604482015290519081900360640190fd5b60208201515160111415611fc5578551841415611f7257612160565b6000868581518110611f8057fe5b602001015160f81c60f81b60f81c9050600083602001518260ff1681518110611fa557fe5b60200260200101519050611fb881612e26565b9650600194505050612158565b6002826020015151141561210b576000611fde83612e5c565b9050600081600081518110611fef57fe5b016020015160f81c905060018116600203600061200f8460ff8416612e7a565b9050600061201d8b8a612e7a565b9050600061202b8383612eab565b905060ff851660021480612042575060ff85166003145b15612074578083511480156120575750808251145b1561206157988901985b50600160ff1b9950612160945050505050565b60ff85161580612087575060ff85166001145b156120d457806120a45750600160ff1b9950612160945050505050565b6120c588602001516001815181106120b857fe5b6020026020010151612e26565b9a509750612158945050505050565b60405162461bcd60e51b815260040180806020018281038252602681526020018061429b6026913960400191505060405180910390fd5b6040805162461bcd60e51b815260206004820152601d60248201527f526563656976656420616e20756e706172736561626c65206e6f64652e000000604482015290519081900360640190fd5b600101611e06565b50600160ff1b8414866121738786612e7a565b909e909d50909b509950505050505050505050565b6060600083905060008660018703815181106121a057fe5b6020026020010151905060006121b582612f11565b6040805160038082526080820190925291925060009190816020015b6121d96137d0565b8152602001906001900390816121d157905050905060008451600014801561220c5750600283600281111561220a57fe5b145b156122425761222361221d85612fe7565b88612d66565b82828151811061222f57fe5b6020908102919091010152600101612483565b600083600281111561225057fe5b14156122b6578451612285576122668488612ffa565b82828151811061227257fe5b60209081029190910101526001016122b1565b8382828151811061229257fe5b602002602001018190525060018101905061222361221d866001612e7a565b612483565b60006122c185612fe7565b905060006122cf8288612eab565b905080156123305760006122e583600084613045565b90506122f9816122f48c613195565b6131d6565b85858151811061230557fe5b60200260200101819052506001840193506123208383612e7a565b925061232c8883612e7a565b9750505b600061233a61321a565b905082516000141561235f576123588161235389612702565b612ffa565b90506123f7565b60008360008151811061236e57fe5b016020015160f81c9050612383846001612e7a565b9350600287600281111561239357fe5b14156123ce5760006123ad856123a88b612702565b612d66565b90506123c683836123c18460000151613195565b6132a7565b9250506123f5565b8351156123e45760006123ad856122f48b612702565b6123f282826123c18b612702565b91505b505b875161242c57612407818b612ffa565b90508085858151811061241657fe5b602002602001018190525060018401935061247f565b612437886001612e7a565b97508085858151811061244657fe5b6020026020010181905250600184019350612461888b612d66565b85858151811061246d57fe5b60200260200101819052506001840193505b5050505b6124928a60018b038484613300565b9a9950505050505050505050565b6000806124ac83612c6a565b90506124b66137d0565b84516000906060905b80156125e4578760018203815181106124d457fe5b602002602001015193506124e784612f11565b925060028360028111156124f757fe5b141561252257600061250885612fe7565b905061251a8660008351895103613045565b9550506125ce565b600183600281111561253057fe5b141561257057600061254185612fe7565b90506125538660008351895103613045565b83519096501561256a5761256781846131d6565b94505b506125ce565b600083600281111561257e57fe5b14156125ce578151156125ce5760008560018751038151811061259d57fe5b602001015160f81c60f81b60f81c90506125bd8660006001895103613045565b95506125ca8582856132a7565b9450505b83516125d990613195565b9150600019016124bf565b50509051805160209091012095945050505050565b606081516000141561261a575060408051600081526020810190915261097a565b6000805b835181101561264d5783818151811061263357fe5b60200260200101515182019150808060010191505061261e565b6000826001600160401b038111801561266557600080fd5b506040519080825280601f01601f191660200182016040528015612690576020820181803683370190505b50600092509050602081015b85518310156126f95760008684815181106126b357fe5b6020026020010151905060006020820190506126d1838284516133e2565b8785815181106126dd57fe5b602002602001015151830192505050828060010193505061269c565b50949350505050565b60208101518051606091611528916000198101908110611d9157fe5b60008060008084600001511161277b576040805162461bcd60e51b815260206004820152601860248201527f524c50206974656d2063616e6e6f74206265206e756c6c2e0000000000000000604482015290519081900360640190fd5b6020840151805160001a607f81116127a0576000600160009450945094505050612a40565b60b78111612815578551607f198201908110612803576040805162461bcd60e51b815260206004820152601960248201527f496e76616c696420524c502073686f727420737472696e672e00000000000000604482015290519081900360640190fd5b60019550935060009250612a40915050565b60bf81116128f957855160b6198201908110612878576040805162461bcd60e51b815260206004820152601f60248201527f496e76616c696420524c50206c6f6e6720737472696e67206c656e6774682e00604482015290519081900360640190fd5b6000816020036101000a60018501510490508082018860000151116128e4576040805162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c50206c6f6e6720737472696e672e0000000000000000604482015290519081900360640190fd5b60019091019550935060009250612a40915050565b60f7811161296d57855160bf19820190811061295c576040805162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c502073686f7274206c6973742e000000000000000000604482015290519081900360640190fd5b600195509350849250612a40915050565b855160f61982019081106129c8576040805162461bcd60e51b815260206004820152601d60248201527f496e76616c696420524c50206c6f6e67206c697374206c656e6774682e000000604482015290519081900360640190fd5b6000816020036101000a6001850151049050808201886000015111612a2d576040805162461bcd60e51b815260206004820152601660248201527524b73b30b634b210292628103637b733903634b9ba1760511b604482015290519081900360640190fd5b6001918201965094509250612a40915050565b9193909250565b60606000826001600160401b0381118015612a6157600080fd5b506040519080825280601f01601f191660200182016040528015612a8c576020820181803683370190505b509050805160001415612aa0579050611696565b8484016020820160005b60208604811015612acb578251825260209283019290910190600101612aaa565b5080519151601f959095166020036101000a600019019182169119909416179092525092915050565b6060600080612b028461271e565b91935090915060019050816001811115612b1857fe5b14612b6a576040805162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c50206c6973742076616c75652e000000000000000000604482015290519081900360640190fd5b6040805160208082526104208201909252600091816020015b612b8b6137b6565b815260200190600190039081612b835790505090506000835b8651811015612c5f5760208210612bec5760405162461bcd60e51b815260040180806020018281038252602a815260200180614271602a913960400191505060405180910390fd5b600080612c186040518060400160405280858c60000151038152602001858c602001510181525061271e565b509150915060405180604001604052808383018152602001848b6020015101815250858581518110612c4657fe5b6020908102919091010152600193909301920101612ba4565b508152949350505050565b6060600082516002026001600160401b0381118015612c8857600080fd5b506040519080825280601f01601f191660200182016040528015612cb3576020820181803683370190505b50905060005b8351811015612d5f576004848281518110612cd057fe5b602001015160f81c60f81b6001600160f81b031916901c828260020281518110612cf657fe5b60200101906001600160f81b031916908160001a9053506010848281518110612d1b57fe5b016020015160f81c81612d2a57fe5b0660f81b828260020260010181518110612d4057fe5b60200101906001600160f81b031916908160001a905350600101612cb9565b5092915050565b612d6e6137d0565b60408051600280825260608201909252600091816020015b6060815260200190600190039081612d865790505090506000612daa856001613426565b9050612db86103ef8261357d565b82600081518110612dc557fe5b6020026020010181905250612dd9846114c4565b82600181518110612de657fe5b6020026020010181905250611bce8261364d565b6000602082511015612e115750602081015161097a565b81806020019051602081101561097557600080fd5b60006060602083600001511015612e4757612e408361367c565b9050612e53565b612e5083611b48565b90505b61169681612dfa565b6060611528612e758360200151600081518110611d9157fe5b612c6a565b60608183510360001415612e9d5750604080516020810190915260008152611528565b611696838384865103613045565b6000805b808451118015612ebf5750808351115b8015612f045750828181518110612ed257fe5b602001015160f81c60f81b6001600160f81b031916848281518110612ef357fe5b01602001516001600160f81b031916145b1561169657600101612eaf565b60208101515160009060111415612f2a5750600061097a565b60028260200151511415612fa6576000612f4383612e5c565b9050600081600081518110612f5457fe5b016020015160f81c90506002811480612f70575060ff81166003145b15612f805760029250505061097a565b60ff81161580612f93575060ff81166001145b15612fa35760019250505061097a565b50505b6040805162461bcd60e51b8152602060048201526011602482015270496e76616c6964206e6f6465207479706560781b604482015290519081900360640190fd5b6060611528612ff583612e5c565b613687565b6130026137d0565b600061300d836114c4565b905061301881611b23565b60208501518051600019810190811061302d57fe5b602002602001018190525061154c84602001516136d0565b60608182601f011015613090576040805162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b604482015290519081900360640190fd5b8282840110156130d8576040805162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b604482015290519081900360640190fd5b81830184511015613124576040805162461bcd60e51b8152602060048201526011602482015270736c6963655f6f75744f66426f756e647360781b604482015290519081900360640190fd5b60608215801561314357604051915060008252602082016040526126f9565b6040519150601f8416801560200281840101858101878315602002848b0101015b8183101561317c578051835260209283019201613164565b5050858452601f01601f19166040525050949350505050565b60606020825110156131a857508061097a565b818051906020012060405160200180828152602001915050604051602081830303815290604052905061097a565b6131de6137d0565b60408051600280825260608201909252600091816020015b60608152602001906001900390816131f65790505090506000612daa856000613426565b6132226137d0565b6040805160118082526102408201909252600091816020015b606081526020019060019003908161323b57905050905060005b815181101561329757604051806040016040528060018152602001600160ff1b81525082828151811061328457fe5b6020908102919091010152600101613255565b506132a18161364d565b91505090565b6132af6137d0565b600060208351106132c8576132c3836114c4565b6132ca565b825b90506132d581611b23565b85602001518560ff16815181106132e857fe5b6020026020010181905250611bce85602001516136d0565b606060008285016001600160401b038111801561331c57600080fd5b5060405190808252806020026020018201604052801561335657816020015b6133436137d0565b81526020019060019003908161333b5790505b50905060005b858110156133975786818151811061337057fe5b602002602001015182828151811061338457fe5b602090810291909101015260010161335c565b5060005b838110156133d8578481815181106133af57fe5b602002602001015182878301815181106133c557fe5b602090810291909101015260010161339b565b5095945050505050565b8282825b60208110613405578151835260209283019290910190601f19016133e6565b905182516020929092036101000a6000190180199091169116179052505050565b6060600082613436576000613439565b60025b90506000600285518161344857fe5b06905060008160020360ff166001600160401b038111801561346957600080fd5b506040519080825280601f01601f191660200182016040528015613494576020820181803683370190505b50905081830160f81b816000815181106134aa57fe5b60200101906001600160f81b031916908160001a90535080866040516020018083805190602001908083835b602083106134f55780518252601f1990920191602091820191016134d6565b51815160209384036101000a600019018019909216911617905285519190930192850191508083835b6020831061353d5780518252601f19909201916020918201910161351e565b6001836020036101000a03801982511681845116808217855250505050505090500192505050604051602081830303815290604052935050505092915050565b60606000600283518161358c57fe5b046001600160401b03811180156135a257600080fd5b506040519080825280601f01601f1916602001820160405280156135cd576020820181803683370190505b50905060005b8151811015612d5f578381600202600101815181106135ee57fe5b602001015160f81c60f81b600485836002028151811061360a57fe5b602001015160f81c60f81b6001600160f81b031916901b1782828151811061362e57fe5b60200101906001600160f81b031916908160001a9053506001016135d3565b6136556137d0565b6000613660836119d1565b905060405180604001604052808281526020016117aa83611bd7565b606061152882613779565b606060028260008151811061369857fe5b016020015160f81c816136a757fe5b0660ff16600014156136c5576136be826002612e7a565b905061097a565b6136be826001612e7a565b6136d86137d0565b600082516001600160401b03811180156136f157600080fd5b5060405190808252806020026020018201604052801561372557816020015b60608152602001906001900390816137105790505b50905060005b835181101561376f5761375084828151811061374357fe5b602002602001015161367c565b82828151811061375c57fe5b602090810291909101015260010161372b565b506116968161364d565b6060611528826020015160008460000151612a47565b60408051608081018252600080825260208201819052918101829052606081019190915290565b604051806040016040528060008152602001600081525090565b604051806040016040528060608152602001606081525090565b60006137fd6137f884614207565b6141e4565b905082815283838301111561381157600080fd5b828260208301376000602084830101529392505050565b803561097a81614258565b8051801515811461097a57600080fd5b600082601f830112613853578081fd5b611696838335602085016137ea565b80356002811061097a57600080fd5b600080600060608486031215613885578283fd5b833561389081614258565b925060208401356138a081614258565b915060408401356001600160401b038111156138ba578182fd5b6138c686828701613843565b9150509250925092565b6000806000606084860312156138e4578283fd5b83356138ef81614258565b92506020840135915060408401356001600160401b038111156138ba578182fd5b60008060408385031215613922578182fd5b823561392d81614258565b915060208301356001600160401b03811115613947578182fd5b61395385828601613843565b9150509250929050565b60006020828403121561396e578081fd5b61169682613833565b600060208284031215613988578081fd5b5051919050565b6000602082840312156139a0578081fd5b81516001600160401b038111156139b5578182fd5b8201601f810184136139c5578182fd5b80516139d36137f882614207565b8181528560208385010111156139e7578384fd5b611bce826020830160208601614228565b600060208284031215613a09578081fd5b81356001600160401b03811115613a1e578182fd5b8201601f81018413613a2e578182fd5b61154c848235602084016137ea565b600060c08284031215613a4e578081fd5b60405160c081018181106001600160401b0382111715613a6a57fe5b8060405250825181526020830151602082015260408301516040820152606083015160608201526080830151613a9f81614258565b6080820152613ab060a08401613833565b60a08201529392505050565b600060208284031215613acd578081fd5b81356001600160401b0380821115613ae3578283fd5b9083019060e08286031215613af6578283fd5b613b0060e06141e4565b8235815260208301356020820152613b1a60408401613862565b6040820152613b2b60608401613828565b6060820152613b3c60808401613828565b608082015260a083013560a082015260c083013582811115613b5c578485fd5b613b6887828601613843565b60c08301525095945050505050565b6001600160a01b03169052565b60008151808452613b9c816020860160208601614228565b601f01601f19169290920160200192915050565b60609190911b6bffffffffffffffffffffffff1916815260140190565b90815260200190565b60008351613be8818460208801614228565b835190830190613bfc818360208801614228565b01949350505050565b600088825287602083015260028710613c1a57fe5b8660f81b60408301526bffffffffffffffffffffffff19808760601b166041840152808660601b166055840152508360698301528251613c61816089850160208701614228565b9190910160890198975050505050505050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039390931683526020830191909152604082015260600190565b600060e08201905060018060a01b038085168352835160208401526020840151604084015260408401516060840152606084015160808401528060808501511660a08401525060a0830151151560c08301529392505050565b901515815260200190565b6020810160038310613d3457fe5b91905290565b60208082526025908201527f53746f7261676520736c6f742068617320616c7265616479206265656e20707260408201526437bb32b71760d91b606082015260800190565b60208082526026908201527f4163636f756e742073746174652068617320616c7265616479206265656e20706040820152653937bb32b71760d11b606082015260800190565b6020808252603e908201527f416c6c206163636f756e7473206d75737420626520636f6d6d6974746564206260408201527f65666f726520636f6d706c6574696e672061207472616e736974696f6e2e0000606082015260800190565b602080825260409082018190527f53746f7261676520736c6f742076616c7565207761736e2774206368616e6765908201527f64206f722068617320616c7265616479206265656e20636f6d6d69747465642e606082015260800190565b6020808252605b908201527f4f564d5f53746174655472616e736974696f6e65723a2050726f76696465642060408201527f4c3120636f6e747261637420636f6465206861736820646f6573206e6f74206d60608201527f61746368204c3220636f6e747261637420636f646520686173682e0000000000608082015260a00190565b6020808252603f908201527f416c6c2073746f72616765206d75737420626520636f6d6d697474656420626560408201527f666f726520636f6d6d697474696e67206163636f756e74207374617465732e00606082015260800190565b60208082526038908201527f4e6f7420656e6f7567682067617320746f2065786563757465207472616e736160408201527f6374696f6e2064657465726d696e6973746963616c6c792e0000000000000000606082015260800190565b6020808252603b908201527f4163636f756e74207374617465207761736e2774206368616e676564206f722060408201527f68617320616c7265616479206265656e20636f6d6d69747465642e0000000000606082015260800190565b6020808252603d908201527f416c6c2073746f72616765206d75737420626520636f6d6d697474656420626560408201527f666f726520636f6d706c6574696e672061207472616e736974696f6e2e000000606082015260800190565b60208082526031908201527f46756e6374696f6e206d7573742062652063616c6c656420647572696e67207460408201527034329031b7b93932b1ba10383430b9b29760791b606082015260800190565b6020808252601d908201527f496e76616c6964207472616e73616374696f6e2070726f76696465642e000000604082015260600190565b60208082526038908201527f436f6e7472616374206d757374206265207665726966696564206265666f726560408201527f2070726f76696e6720612073746f7261676520736c6f742e0000000000000000606082015260800190565b600060408252835160408301526020840151606083015260408401516002811061418257fe5b60808381019190915260608501516001600160a01b031660a08401528401516141ae60c0840182613b77565b5060a084015160e083015260c084015160e06101008401526141d4610120840182613b84565b9150506116966020830184613b77565b6040518181016001600160401b03811182821017156141ff57fe5b604052919050565b60006001600160401b0382111561421a57fe5b50601f01601f191660200190565b60005b8381101561424357818101518382015260200161422b565b83811115614252576000848401525b50505050565b6001600160a01b038116811461426d57600080fd5b5056fe50726f766964656420524c50206c6973742065786365656473206d6178206c697374206c656e6774682e52656365697665642061206e6f6465207769746820616e20756e6b6e6f776e20707265666978a2646970667358221220ce5bdf188c3574b3ab8fd8d954100f14bc36e9cb42e1ca798a8f556d7ace41f564736f6c634300070600334372656174652063616e206f6e6c7920626520646f6e6520627920746865204f564d5f467261756456657269666965722ea26469706673582212200d398ad651c22ef8f9239e5104dc8b8e30dec6c479966de4f2382a136a81db4864736f6c63430007060033", + "devdoc": { + "details": "The State Transitioner Factory is used by the Fraud Verifier to create a new State Transitioner during the initialization of a fraud proof. Compiler used: solc Runtime target: EVM", + "kind": "dev", + "methods": { + "create(address,uint256,bytes32,bytes32)": { + "params": { + "_libAddressManager": "Address of the Address Manager.", + "_preStateRoot": "State root before the transition was executed.", + "_stateTransitionIndex": "Index of the state transition being verified.", + "_transactionHash": "Hash of the executed transaction." + }, + "returns": { + "_0": "New OVM_StateTransitioner instance." + } + }, + "resolve(string)": { + "params": { + "_name": "Name to resolve an address for." + }, + "returns": { + "_0": "Address associated with the given name." + } + } + }, + "title": "OVM_StateTransitionerFactory", + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": { + "create(address,uint256,bytes32,bytes32)": { + "notice": "Creates a new OVM_StateTransitioner" + }, + "resolve(string)": { + "notice": "Resolves the address associated with a given name." + } + }, + "version": 1 + }, + "storageLayout": { + "storage": [ + { + "astId": 12800, + "contract": "contracts/optimistic-ethereum/OVM/verification/OVM_StateTransitionerFactory.sol:OVM_StateTransitionerFactory", + "label": "libAddressManager", + "offset": 0, + "slot": "0", + "type": "t_contract(Lib_AddressManager)12793" + } + ], + "types": { + "t_contract(Lib_AddressManager)12793": { + "encoding": "inplace", + "label": "contract Lib_AddressManager", + "numberOfBytes": "20" + } + } + } +} \ No newline at end of file diff --git a/packages/contracts/deployments/kovan-v3/Proxy__OVM_L1CrossDomainMessenger.json b/packages/contracts/deployments/kovan-v3/Proxy__OVM_L1CrossDomainMessenger.json new file mode 100644 index 0000000000000..c42f5d0bf1550 --- /dev/null +++ b/packages/contracts/deployments/kovan-v3/Proxy__OVM_L1CrossDomainMessenger.json @@ -0,0 +1,118 @@ +{ + "address": "0x78b88FD62FBdBf67b9C5C6528CF84E9d30BB28e0", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_libAddressManager", + "type": "address" + }, + { + "internalType": "string", + "name": "_implementationName", + "type": "string" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "stateMutability": "payable", + "type": "fallback" + } + ], + "transactionHash": "0xd175bdbcd00f66a7b3a247bf2d0c3719912b845f4898cfe6e09062cc7c33849f", + "receipt": { + "to": null, + "from": "0x18394B52d3Cb931dfA76F63251919D051953413d", + "contractAddress": "0x78b88FD62FBdBf67b9C5C6528CF84E9d30BB28e0", + "transactionIndex": 1, + "gasUsed": "222424", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0x1e1bc36b9553544c99025041f703c41760904c63ad443300a44e9ef0e2be7f56", + "transactionHash": "0xd175bdbcd00f66a7b3a247bf2d0c3719912b845f4898cfe6e09062cc7c33849f", + "logs": [], + "blockNumber": 24572837, + "cumulativeGasUsed": "252381", + "status": 1, + "byzantium": true + }, + "args": [ + "0xd56F695e73286ac252A37593DD4E7c14270eC1Df", + "OVM_L1CrossDomainMessenger" + ], + "solcInputHash": "5ee8e508e2c54cb5ac6783b4855b1558", + "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_implementationName\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"stateMutability\":\"payable\",\"type\":\"fallback\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_implementationName\":\"implementationName of the contract to proxy to.\",\"_libAddressManager\":\"Address of the Lib_AddressManager.\"}}},\"title\":\"Lib_ResolvedDelegateProxy\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/libraries/resolver/Lib_ResolvedDelegateProxy.sol\":\"Lib_ResolvedDelegateProxy\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor () internal {\\n address msgSender = _msgSender();\\n _owner = msgSender;\\n emit OwnershipTransferred(address(0), msgSender);\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n emit OwnershipTransferred(_owner, address(0));\\n _owner = address(0);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n emit OwnershipTransferred(_owner, newOwner);\\n _owner = newOwner;\\n }\\n}\\n\",\"keccak256\":\"0x15e2d5bd4c28a88548074c54d220e8086f638a71ed07e6b3ba5a70066fcf458d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with GSN meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address payable) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes memory) {\\n this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x8d3cb350f04ff49cfb10aef08d87f19dcbaecc8027b0bed12f3275cd12f38cf0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n public\\n onlyOwner\\n {\\n addresses[_getNameHash(_name)] = _address;\\n\\n emit AddressSet(\\n _name,\\n _address\\n );\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0x2ce671a0e004df88b136bea5a3c59d0732cea8887c8496da1d509e0200b03d7d\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_ResolvedDelegateProxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_ResolvedDelegateProxy\\n */\\ncontract Lib_ResolvedDelegateProxy {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n // Using mappings to store fields to avoid overwriting storage slots in the\\n // implementation contract. For example, instead of storing these fields at\\n // storage slot `0` & `1`, they are stored at `keccak256(key + slot)`.\\n // See: https://solidity.readthedocs.io/en/v0.7.0/internals/layout_in_storage.html\\n // NOTE: Do not use this code in your own contract system.\\n // There is a known flaw in this contract, and we will remove it from the repository\\n // in the near future. Due to the very limited way that we are using it, this flaw is\\n // not an issue in our system.\\n mapping (address => string) private implementationName;\\n mapping (address => Lib_AddressManager) private addressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n * @param _implementationName implementationName of the contract to proxy to.\\n */\\n constructor(\\n address _libAddressManager,\\n string memory _implementationName\\n ) {\\n addressManager[address(this)] = Lib_AddressManager(_libAddressManager);\\n implementationName[address(this)] = _implementationName;\\n }\\n\\n\\n /*********************\\n * Fallback Function *\\n *********************/\\n\\n fallback()\\n external\\n payable\\n {\\n address target = addressManager[address(this)].getAddress(\\n (implementationName[address(this)])\\n );\\n\\n require(\\n target != address(0),\\n \\\"Target address must be initialized.\\\"\\n );\\n\\n (bool success, bytes memory returndata) = target.delegatecall(msg.data);\\n\\n if (success == true) {\\n assembly {\\n return(add(returndata, 0x20), mload(returndata))\\n }\\n } else {\\n assembly {\\n revert(add(returndata, 0x20), mload(returndata))\\n }\\n }\\n }\\n}\\n\",\"keccak256\":\"0xfaecb051b37f1d87d588cafb17a575723cbdf7c3c2079772110f33e747e05027\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x608060405234801561001057600080fd5b506040516104083803806104088339818101604052604081101561003357600080fd5b81516020830180516040519294929383019291908464010000000082111561005a57600080fd5b90830190602082018581111561006f57600080fd5b825164010000000081118282018810171561008957600080fd5b82525081516020918201929091019080838360005b838110156100b657818101518382015260200161009e565b50505050905090810190601f1680156100e35780820380516001836020036101000a031916815260200191505b5060409081523060009081526001602090815282822080546001600160a01b0319166001600160a01b038a16179055818152919020855161012c95509093509085019150610134565b5050506101d5565b828054600181600116156101000203166002900490600052602060002090601f01602090048101928261016a57600085556101b0565b82601f1061018357805160ff19168380011785556101b0565b828001600101855582156101b0579182015b828111156101b0578251825591602001919060010190610195565b506101bc9291506101c0565b5090565b5b808211156101bc57600081556001016101c1565b610224806101e46000396000f3fe60806040818152306000908152600160208181528383205483825293832063bf40fac160e01b909552608490815284546002610100938216159390930260001901169190910460a481905291936001600160a01b039093169263bf40fac192909190819060c490849080156100b55780601f1061008a576101008083540402835291602001916100b5565b820191906000526020600020905b81548152906001019060200180831161009857829003601f168201915b50509250505060206040518083038186803b1580156100d357600080fd5b505afa1580156100e7573d6000803e3d6000fd5b505050506040513d60208110156100fd57600080fd5b505190506001600160a01b0381166101465760405162461bcd60e51b81526004018080602001828103825260238152602001806101cc6023913960400191505060405180910390fd5b600080826001600160a01b03166000366040518083838082843760405192019450600093509091505080830381855af49150503d80600081146101a5576040519150601f19603f3d011682016040523d82523d6000602084013e6101aa565b606091505b509092509050600182151514156101c357805160208201f35b805160208201fdfe5461726765742061646472657373206d75737420626520696e697469616c697a65642ea264697066735822122026d4992ed7562b49b7d3e306977cab94c29f8fb64a137b48d18960cc5ef1341d64736f6c63430007060033", + "deployedBytecode": "0x60806040818152306000908152600160208181528383205483825293832063bf40fac160e01b909552608490815284546002610100938216159390930260001901169190910460a481905291936001600160a01b039093169263bf40fac192909190819060c490849080156100b55780601f1061008a576101008083540402835291602001916100b5565b820191906000526020600020905b81548152906001019060200180831161009857829003601f168201915b50509250505060206040518083038186803b1580156100d357600080fd5b505afa1580156100e7573d6000803e3d6000fd5b505050506040513d60208110156100fd57600080fd5b505190506001600160a01b0381166101465760405162461bcd60e51b81526004018080602001828103825260238152602001806101cc6023913960400191505060405180910390fd5b600080826001600160a01b03166000366040518083838082843760405192019450600093509091505080830381855af49150503d80600081146101a5576040519150601f19603f3d011682016040523d82523d6000602084013e6101aa565b606091505b509092509050600182151514156101c357805160208201f35b805160208201fdfe5461726765742061646472657373206d75737420626520696e697469616c697a65642ea264697066735822122026d4992ed7562b49b7d3e306977cab94c29f8fb64a137b48d18960cc5ef1341d64736f6c63430007060033", + "devdoc": { + "kind": "dev", + "methods": { + "constructor": { + "params": { + "_implementationName": "implementationName of the contract to proxy to.", + "_libAddressManager": "Address of the Lib_AddressManager." + } + } + }, + "title": "Lib_ResolvedDelegateProxy", + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + }, + "storageLayout": { + "storage": [ + { + "astId": 12837, + "contract": "contracts/optimistic-ethereum/libraries/resolver/Lib_ResolvedDelegateProxy.sol:Lib_ResolvedDelegateProxy", + "label": "implementationName", + "offset": 0, + "slot": "0", + "type": "t_mapping(t_address,t_string_storage)" + }, + { + "astId": 12841, + "contract": "contracts/optimistic-ethereum/libraries/resolver/Lib_ResolvedDelegateProxy.sol:Lib_ResolvedDelegateProxy", + "label": "addressManager", + "offset": 0, + "slot": "1", + "type": "t_mapping(t_address,t_contract(Lib_AddressManager)12793)" + } + ], + "types": { + "t_address": { + "encoding": "inplace", + "label": "address", + "numberOfBytes": "20" + }, + "t_contract(Lib_AddressManager)12793": { + "encoding": "inplace", + "label": "contract Lib_AddressManager", + "numberOfBytes": "20" + }, + "t_mapping(t_address,t_contract(Lib_AddressManager)12793)": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => contract Lib_AddressManager)", + "numberOfBytes": "32", + "value": "t_contract(Lib_AddressManager)12793" + }, + "t_mapping(t_address,t_string_storage)": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => string)", + "numberOfBytes": "32", + "value": "t_string_storage" + }, + "t_string_storage": { + "encoding": "bytes", + "label": "string", + "numberOfBytes": "32" + } + } + } +} \ No newline at end of file diff --git a/packages/contracts/deployments/kovan-v3/Proxy__OVM_L1ETHGateway.json b/packages/contracts/deployments/kovan-v3/Proxy__OVM_L1ETHGateway.json new file mode 100644 index 0000000000000..65948c09a9c25 --- /dev/null +++ b/packages/contracts/deployments/kovan-v3/Proxy__OVM_L1ETHGateway.json @@ -0,0 +1,118 @@ +{ + "address": "0xB191d67F69e823445cD59e5A88953a82be73b9C6", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_libAddressManager", + "type": "address" + }, + { + "internalType": "string", + "name": "_implementationName", + "type": "string" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "stateMutability": "payable", + "type": "fallback" + } + ], + "transactionHash": "0xbb58732ffd132b5fa62c010e3bdc4ee2a500adf82d3ced38f1175e2b00cd0afb", + "receipt": { + "to": null, + "from": "0x18394B52d3Cb931dfA76F63251919D051953413d", + "contractAddress": "0xB191d67F69e823445cD59e5A88953a82be73b9C6", + "transactionIndex": 1, + "gasUsed": "222304", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0x918daf79ddefb51f9a507188032a29c44ad2b8e42bd1d90fda2943895ad18806", + "transactionHash": "0xbb58732ffd132b5fa62c010e3bdc4ee2a500adf82d3ced38f1175e2b00cd0afb", + "logs": [], + "blockNumber": 24572909, + "cumulativeGasUsed": "267164", + "status": 1, + "byzantium": true + }, + "args": [ + "0xd56F695e73286ac252A37593DD4E7c14270eC1Df", + "OVM_L1ETHGateway" + ], + "solcInputHash": "5ee8e508e2c54cb5ac6783b4855b1558", + "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_implementationName\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"stateMutability\":\"payable\",\"type\":\"fallback\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_implementationName\":\"implementationName of the contract to proxy to.\",\"_libAddressManager\":\"Address of the Lib_AddressManager.\"}}},\"title\":\"Lib_ResolvedDelegateProxy\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/libraries/resolver/Lib_ResolvedDelegateProxy.sol\":\"Lib_ResolvedDelegateProxy\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor () internal {\\n address msgSender = _msgSender();\\n _owner = msgSender;\\n emit OwnershipTransferred(address(0), msgSender);\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n emit OwnershipTransferred(_owner, address(0));\\n _owner = address(0);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n emit OwnershipTransferred(_owner, newOwner);\\n _owner = newOwner;\\n }\\n}\\n\",\"keccak256\":\"0x15e2d5bd4c28a88548074c54d220e8086f638a71ed07e6b3ba5a70066fcf458d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with GSN meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address payable) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes memory) {\\n this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x8d3cb350f04ff49cfb10aef08d87f19dcbaecc8027b0bed12f3275cd12f38cf0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n public\\n onlyOwner\\n {\\n addresses[_getNameHash(_name)] = _address;\\n\\n emit AddressSet(\\n _name,\\n _address\\n );\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0x2ce671a0e004df88b136bea5a3c59d0732cea8887c8496da1d509e0200b03d7d\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_ResolvedDelegateProxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_ResolvedDelegateProxy\\n */\\ncontract Lib_ResolvedDelegateProxy {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n // Using mappings to store fields to avoid overwriting storage slots in the\\n // implementation contract. For example, instead of storing these fields at\\n // storage slot `0` & `1`, they are stored at `keccak256(key + slot)`.\\n // See: https://solidity.readthedocs.io/en/v0.7.0/internals/layout_in_storage.html\\n // NOTE: Do not use this code in your own contract system.\\n // There is a known flaw in this contract, and we will remove it from the repository\\n // in the near future. Due to the very limited way that we are using it, this flaw is\\n // not an issue in our system.\\n mapping (address => string) private implementationName;\\n mapping (address => Lib_AddressManager) private addressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n * @param _implementationName implementationName of the contract to proxy to.\\n */\\n constructor(\\n address _libAddressManager,\\n string memory _implementationName\\n ) {\\n addressManager[address(this)] = Lib_AddressManager(_libAddressManager);\\n implementationName[address(this)] = _implementationName;\\n }\\n\\n\\n /*********************\\n * Fallback Function *\\n *********************/\\n\\n fallback()\\n external\\n payable\\n {\\n address target = addressManager[address(this)].getAddress(\\n (implementationName[address(this)])\\n );\\n\\n require(\\n target != address(0),\\n \\\"Target address must be initialized.\\\"\\n );\\n\\n (bool success, bytes memory returndata) = target.delegatecall(msg.data);\\n\\n if (success == true) {\\n assembly {\\n return(add(returndata, 0x20), mload(returndata))\\n }\\n } else {\\n assembly {\\n revert(add(returndata, 0x20), mload(returndata))\\n }\\n }\\n }\\n}\\n\",\"keccak256\":\"0xfaecb051b37f1d87d588cafb17a575723cbdf7c3c2079772110f33e747e05027\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x608060405234801561001057600080fd5b506040516104083803806104088339818101604052604081101561003357600080fd5b81516020830180516040519294929383019291908464010000000082111561005a57600080fd5b90830190602082018581111561006f57600080fd5b825164010000000081118282018810171561008957600080fd5b82525081516020918201929091019080838360005b838110156100b657818101518382015260200161009e565b50505050905090810190601f1680156100e35780820380516001836020036101000a031916815260200191505b5060409081523060009081526001602090815282822080546001600160a01b0319166001600160a01b038a16179055818152919020855161012c95509093509085019150610134565b5050506101d5565b828054600181600116156101000203166002900490600052602060002090601f01602090048101928261016a57600085556101b0565b82601f1061018357805160ff19168380011785556101b0565b828001600101855582156101b0579182015b828111156101b0578251825591602001919060010190610195565b506101bc9291506101c0565b5090565b5b808211156101bc57600081556001016101c1565b610224806101e46000396000f3fe60806040818152306000908152600160208181528383205483825293832063bf40fac160e01b909552608490815284546002610100938216159390930260001901169190910460a481905291936001600160a01b039093169263bf40fac192909190819060c490849080156100b55780601f1061008a576101008083540402835291602001916100b5565b820191906000526020600020905b81548152906001019060200180831161009857829003601f168201915b50509250505060206040518083038186803b1580156100d357600080fd5b505afa1580156100e7573d6000803e3d6000fd5b505050506040513d60208110156100fd57600080fd5b505190506001600160a01b0381166101465760405162461bcd60e51b81526004018080602001828103825260238152602001806101cc6023913960400191505060405180910390fd5b600080826001600160a01b03166000366040518083838082843760405192019450600093509091505080830381855af49150503d80600081146101a5576040519150601f19603f3d011682016040523d82523d6000602084013e6101aa565b606091505b509092509050600182151514156101c357805160208201f35b805160208201fdfe5461726765742061646472657373206d75737420626520696e697469616c697a65642ea264697066735822122026d4992ed7562b49b7d3e306977cab94c29f8fb64a137b48d18960cc5ef1341d64736f6c63430007060033", + "deployedBytecode": "0x60806040818152306000908152600160208181528383205483825293832063bf40fac160e01b909552608490815284546002610100938216159390930260001901169190910460a481905291936001600160a01b039093169263bf40fac192909190819060c490849080156100b55780601f1061008a576101008083540402835291602001916100b5565b820191906000526020600020905b81548152906001019060200180831161009857829003601f168201915b50509250505060206040518083038186803b1580156100d357600080fd5b505afa1580156100e7573d6000803e3d6000fd5b505050506040513d60208110156100fd57600080fd5b505190506001600160a01b0381166101465760405162461bcd60e51b81526004018080602001828103825260238152602001806101cc6023913960400191505060405180910390fd5b600080826001600160a01b03166000366040518083838082843760405192019450600093509091505080830381855af49150503d80600081146101a5576040519150601f19603f3d011682016040523d82523d6000602084013e6101aa565b606091505b509092509050600182151514156101c357805160208201f35b805160208201fdfe5461726765742061646472657373206d75737420626520696e697469616c697a65642ea264697066735822122026d4992ed7562b49b7d3e306977cab94c29f8fb64a137b48d18960cc5ef1341d64736f6c63430007060033", + "devdoc": { + "kind": "dev", + "methods": { + "constructor": { + "params": { + "_implementationName": "implementationName of the contract to proxy to.", + "_libAddressManager": "Address of the Lib_AddressManager." + } + } + }, + "title": "Lib_ResolvedDelegateProxy", + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + }, + "storageLayout": { + "storage": [ + { + "astId": 12837, + "contract": "contracts/optimistic-ethereum/libraries/resolver/Lib_ResolvedDelegateProxy.sol:Lib_ResolvedDelegateProxy", + "label": "implementationName", + "offset": 0, + "slot": "0", + "type": "t_mapping(t_address,t_string_storage)" + }, + { + "astId": 12841, + "contract": "contracts/optimistic-ethereum/libraries/resolver/Lib_ResolvedDelegateProxy.sol:Lib_ResolvedDelegateProxy", + "label": "addressManager", + "offset": 0, + "slot": "1", + "type": "t_mapping(t_address,t_contract(Lib_AddressManager)12793)" + } + ], + "types": { + "t_address": { + "encoding": "inplace", + "label": "address", + "numberOfBytes": "20" + }, + "t_contract(Lib_AddressManager)12793": { + "encoding": "inplace", + "label": "contract Lib_AddressManager", + "numberOfBytes": "20" + }, + "t_mapping(t_address,t_contract(Lib_AddressManager)12793)": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => contract Lib_AddressManager)", + "numberOfBytes": "32", + "value": "t_contract(Lib_AddressManager)12793" + }, + "t_mapping(t_address,t_string_storage)": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => string)", + "numberOfBytes": "32", + "value": "t_string_storage" + }, + "t_string_storage": { + "encoding": "bytes", + "label": "string", + "numberOfBytes": "32" + } + } + } +} \ No newline at end of file diff --git a/packages/contracts/deployments/kovan-v3/mockOVM_BondManager.json b/packages/contracts/deployments/kovan-v3/mockOVM_BondManager.json new file mode 100644 index 0000000000000..4ef5baaa33b78 --- /dev/null +++ b/packages/contracts/deployments/kovan-v3/mockOVM_BondManager.json @@ -0,0 +1,242 @@ +{ + "address": "0x8ECe272C9f83041bcb1Cd57AC49Ca6494776bE01", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_libAddressManager", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_who", + "type": "address" + } + ], + "name": "claim", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "deposit", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_preStateRoot", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "_publisher", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_timestamp", + "type": "uint256" + } + ], + "name": "finalize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "finalizeWithdrawal", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "getGasSpent", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_who", + "type": "address" + } + ], + "name": "isCollateralized", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "libAddressManager", + "outputs": [ + { + "internalType": "contract Lib_AddressManager", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_preStateRoot", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "_txHash", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "_who", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_gasSpent", + "type": "uint256" + } + ], + "name": "recordGasSpent", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "_name", + "type": "string" + } + ], + "name": "resolve", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "startWithdrawal", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "transactionHash": "0x51934b4913fc6cb446cb9b81b11c91393e8a00eb70ba44ac7fa1361fb8119deb", + "receipt": { + "to": null, + "from": "0x18394B52d3Cb931dfA76F63251919D051953413d", + "contractAddress": "0x8ECe272C9f83041bcb1Cd57AC49Ca6494776bE01", + "transactionIndex": 1, + "gasUsed": "297198", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0xd12c9c8a22bc6d6e515104cc5c8473933eb037f559f8ab725149f9dee9d5f25f", + "transactionHash": "0x51934b4913fc6cb446cb9b81b11c91393e8a00eb70ba44ac7fa1361fb8119deb", + "logs": [], + "blockNumber": 24572822, + "cumulativeGasUsed": "595662", + "status": 1, + "byzantium": true + }, + "args": [ + "0xd56F695e73286ac252A37593DD4E7c14270eC1Df" + ], + "solcInputHash": "5ee8e508e2c54cb5ac6783b4855b1558", + "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_who\",\"type\":\"address\"}],\"name\":\"claim\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"deposit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_preStateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"_publisher\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_timestamp\",\"type\":\"uint256\"}],\"name\":\"finalize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"finalizeWithdrawal\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"getGasSpent\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_who\",\"type\":\"address\"}],\"name\":\"isCollateralized\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_preStateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"_txHash\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"_who\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_gasSpent\",\"type\":\"uint256\"}],\"name\":\"recordGasSpent\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"startWithdrawal\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}}},\"title\":\"mockOVM_BondManager\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/mockOVM/verification/mockOVM_BondManager.sol\":\"mockOVM_BondManager\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor () internal {\\n address msgSender = _msgSender();\\n _owner = msgSender;\\n emit OwnershipTransferred(address(0), msgSender);\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n emit OwnershipTransferred(_owner, address(0));\\n _owner = address(0);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n emit OwnershipTransferred(_owner, newOwner);\\n _owner = newOwner;\\n }\\n}\\n\",\"keccak256\":\"0x15e2d5bd4c28a88548074c54d220e8086f638a71ed07e6b3ba5a70066fcf458d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with GSN meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address payable) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes memory) {\\n this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x8d3cb350f04ff49cfb10aef08d87f19dcbaecc8027b0bed12f3275cd12f38cf0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/verification/iOVM_BondManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\ninterface ERC20 {\\n function transfer(address, uint256) external returns (bool);\\n function transferFrom(address, address, uint256) external returns (bool);\\n}\\n\\n/// All the errors which may be encountered on the bond manager\\nlibrary Errors {\\n string constant ERC20_ERR = \\\"BondManager: Could not post bond\\\";\\n string constant ALREADY_FINALIZED = \\\"BondManager: Fraud proof for this pre-state root has already been finalized\\\";\\n string constant SLASHED = \\\"BondManager: Cannot finalize withdrawal, you probably got slashed\\\";\\n string constant WRONG_STATE = \\\"BondManager: Wrong bond state for proposer\\\";\\n string constant CANNOT_CLAIM = \\\"BondManager: Cannot claim yet. Dispute must be finalized first\\\";\\n\\n string constant WITHDRAWAL_PENDING = \\\"BondManager: Withdrawal already pending\\\";\\n string constant TOO_EARLY = \\\"BondManager: Too early to finalize your withdrawal\\\";\\n\\n string constant ONLY_TRANSITIONER = \\\"BondManager: Only the transitioner for this pre-state root may call this function\\\";\\n string constant ONLY_FRAUD_VERIFIER = \\\"BondManager: Only the fraud verifier may call this function\\\";\\n string constant ONLY_STATE_COMMITMENT_CHAIN = \\\"BondManager: Only the state commitment chain may call this function\\\";\\n string constant WAIT_FOR_DISPUTES = \\\"BondManager: Wait for other potential disputes\\\";\\n}\\n\\n/**\\n * @title iOVM_BondManager\\n */\\ninterface iOVM_BondManager {\\n\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n /// The lifecycle of a proposer's bond\\n enum State {\\n // Before depositing or after getting slashed, a user is uncollateralized\\n NOT_COLLATERALIZED,\\n // After depositing, a user is collateralized\\n COLLATERALIZED,\\n // After a user has initiated a withdrawal\\n WITHDRAWING\\n }\\n\\n /// A bond posted by a proposer\\n struct Bond {\\n // The user's state\\n State state;\\n // The timestamp at which a proposer issued their withdrawal request\\n uint32 withdrawalTimestamp;\\n // The time when the first disputed was initiated for this bond\\n uint256 firstDisputeAt;\\n // The earliest observed state root for this bond which has had fraud\\n bytes32 earliestDisputedStateRoot;\\n // The state root's timestamp\\n uint256 earliestTimestamp;\\n }\\n\\n // Per pre-state root, store the number of state provisions that were made\\n // and how many of these calls were made by each user. Payouts will then be\\n // claimed by users proportionally for that dispute.\\n struct Rewards {\\n // Flag to check if rewards for a fraud proof are claimable\\n bool canClaim;\\n // Total number of `recordGasSpent` calls made\\n uint256 total;\\n // The gas spent by each user to provide witness data. The sum of all\\n // values inside this map MUST be equal to the value of `total`\\n mapping(address => uint256) gasSpent;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function recordGasSpent(\\n bytes32 _preStateRoot,\\n bytes32 _txHash,\\n address _who,\\n uint256 _gasSpent\\n ) external;\\n\\n function finalize(\\n bytes32 _preStateRoot,\\n address _publisher,\\n uint256 _timestamp\\n ) external;\\n\\n function deposit() external;\\n\\n function startWithdrawal() external;\\n\\n function finalizeWithdrawal() external;\\n\\n function claim(\\n address _who\\n ) external;\\n\\n function isCollateralized(\\n address _who\\n ) external view returns (bool);\\n\\n function getGasSpent(\\n bytes32 _preStateRoot,\\n address _who\\n ) external view returns (uint256);\\n}\\n\",\"keccak256\":\"0x3c2a8a399487857158649db1896749d86e39cba545a8aeb2e2bb0f3bdfa7a5b1\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n public\\n onlyOwner\\n {\\n addresses[_getNameHash(_name)] = _address;\\n\\n emit AddressSet(\\n _name,\\n _address\\n );\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0x2ce671a0e004df88b136bea5a3c59d0732cea8887c8496da1d509e0200b03d7d\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(\\n address _libAddressManager\\n ) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x65981feeabff6a81783ea97d44baf988a18a86c8cb374c46fdb71819cbacc7c0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/mockOVM/verification/mockOVM_BondManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Interface Imports */\\nimport { iOVM_BondManager } from \\\"../../iOVM/verification/iOVM_BondManager.sol\\\";\\n\\n/* Contract Imports */\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/**\\n * @title mockOVM_BondManager\\n */\\ncontract mockOVM_BondManager is iOVM_BondManager, Lib_AddressResolver {\\n constructor(\\n address _libAddressManager\\n )\\n Lib_AddressResolver(_libAddressManager)\\n {}\\n\\n function recordGasSpent(\\n bytes32 _preStateRoot,\\n bytes32 _txHash,\\n address _who,\\n uint256 _gasSpent\\n )\\n override\\n public\\n {}\\n\\n function finalize(\\n bytes32 _preStateRoot,\\n address _publisher,\\n uint256 _timestamp\\n )\\n override\\n public\\n {}\\n\\n function deposit()\\n override\\n public\\n {}\\n\\n function startWithdrawal()\\n override\\n public\\n {}\\n\\n function finalizeWithdrawal()\\n override\\n public\\n {}\\n\\n function claim(\\n address _who\\n )\\n override\\n public\\n {}\\n\\n function isCollateralized(\\n address _who\\n )\\n override\\n public\\n view\\n returns (\\n bool\\n )\\n {\\n // Only authenticate sequencer to submit state root batches.\\n return _who == resolve(\\\"OVM_Proposer\\\");\\n }\\n\\n function getGasSpent(\\n bytes32, // _preStateRoot,\\n address // _who\\n )\\n override\\n public\\n pure\\n returns (\\n uint256\\n )\\n {\\n return 0;\\n }\\n}\\n\",\"keccak256\":\"0xe649b49573ba5babca407f116e97dc13f24bf677cbcd03824a2eb98a7750c4e8\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x608060405234801561001057600080fd5b506040516104673803806104678339818101604052602081101561003357600080fd5b5051600080546001600160a01b039092166001600160a01b0319909216919091179055610402806100656000396000f3fe608060405234801561001057600080fd5b506004361061009e5760003560e01c8063abfbbe1311610066578063abfbbe1314610207578063bc2f8dd814610239578063c5b6aa2f14610239578063d0e30db014610239578063dc6453dc146102415761009e565b806302ad4d2a146100a35780631e16e92f146100dd5780631e83409a14610117578063299ca4781461013d578063461a447814610161575b600080fd5b6100c9600480360360208110156100b957600080fd5b50356001600160a01b031661027f565b604080519115158252519081900360200190f35b610115600480360360808110156100f357600080fd5b508035906020810135906001600160a01b0360408201351690606001356102c9565b005b6101156004803603602081101561012d57600080fd5b50356001600160a01b03166102cf565b6101456102d2565b604080516001600160a01b039092168252519081900360200190f35b6101456004803603602081101561017757600080fd5b81019060208101813564010000000081111561019257600080fd5b8201836020820111156101a457600080fd5b803590602001918460018302840111640100000000831117156101c657600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506102e1945050505050565b6101156004803603606081101561021d57600080fd5b508035906001600160a01b0360208201351690604001356103bd565b6101156103c2565b61026d6004803603604081101561025757600080fd5b50803590602001356001600160a01b03166103c4565b60408051918252519081900360200190f35b60006102ae6040518060400160405280600c81526020016b27ab26afa83937b837b9b2b960a11b8152506102e1565b6001600160a01b0316826001600160a01b0316149050919050565b50505050565b50565b6000546001600160a01b031681565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b83811015610341578181015183820152602001610329565b50505050905090810190601f16801561036e5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561038b57600080fd5b505afa15801561039f573d6000803e3d6000fd5b505050506040513d60208110156103b557600080fd5b505192915050565b505050565b565b60009291505056fea264697066735822122023ce16ce6de3f7672940d40a33de4b777fbb7eaa3ec117bcace31640220db75d64736f6c63430007060033", + "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061009e5760003560e01c8063abfbbe1311610066578063abfbbe1314610207578063bc2f8dd814610239578063c5b6aa2f14610239578063d0e30db014610239578063dc6453dc146102415761009e565b806302ad4d2a146100a35780631e16e92f146100dd5780631e83409a14610117578063299ca4781461013d578063461a447814610161575b600080fd5b6100c9600480360360208110156100b957600080fd5b50356001600160a01b031661027f565b604080519115158252519081900360200190f35b610115600480360360808110156100f357600080fd5b508035906020810135906001600160a01b0360408201351690606001356102c9565b005b6101156004803603602081101561012d57600080fd5b50356001600160a01b03166102cf565b6101456102d2565b604080516001600160a01b039092168252519081900360200190f35b6101456004803603602081101561017757600080fd5b81019060208101813564010000000081111561019257600080fd5b8201836020820111156101a457600080fd5b803590602001918460018302840111640100000000831117156101c657600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506102e1945050505050565b6101156004803603606081101561021d57600080fd5b508035906001600160a01b0360208201351690604001356103bd565b6101156103c2565b61026d6004803603604081101561025757600080fd5b50803590602001356001600160a01b03166103c4565b60408051918252519081900360200190f35b60006102ae6040518060400160405280600c81526020016b27ab26afa83937b837b9b2b960a11b8152506102e1565b6001600160a01b0316826001600160a01b0316149050919050565b50505050565b50565b6000546001600160a01b031681565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b83811015610341578181015183820152602001610329565b50505050905090810190601f16801561036e5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561038b57600080fd5b505afa15801561039f573d6000803e3d6000fd5b505050506040513d60208110156103b557600080fd5b505192915050565b505050565b565b60009291505056fea264697066735822122023ce16ce6de3f7672940d40a33de4b777fbb7eaa3ec117bcace31640220db75d64736f6c63430007060033", + "devdoc": { + "kind": "dev", + "methods": { + "resolve(string)": { + "params": { + "_name": "Name to resolve an address for." + }, + "returns": { + "_0": "Address associated with the given name." + } + } + }, + "title": "mockOVM_BondManager", + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": { + "resolve(string)": { + "notice": "Resolves the address associated with a given name." + } + }, + "version": 1 + }, + "storageLayout": { + "storage": [ + { + "astId": 12800, + "contract": "contracts/optimistic-ethereum/mockOVM/verification/mockOVM_BondManager.sol:mockOVM_BondManager", + "label": "libAddressManager", + "offset": 0, + "slot": "0", + "type": "t_contract(Lib_AddressManager)12793" + } + ], + "types": { + "t_contract(Lib_AddressManager)12793": { + "encoding": "inplace", + "label": "contract Lib_AddressManager", + "numberOfBytes": "20" + } + } + } +} \ No newline at end of file diff --git a/packages/contracts/deployments/kovan-v3/solcInputs/5ee8e508e2c54cb5ac6783b4855b1558.json b/packages/contracts/deployments/kovan-v3/solcInputs/5ee8e508e2c54cb5ac6783b4855b1558.json new file mode 100644 index 0000000000000..91f1b8042e7f7 --- /dev/null +++ b/packages/contracts/deployments/kovan-v3/solcInputs/5ee8e508e2c54cb5ac6783b4855b1558.json @@ -0,0 +1,308 @@ +{ + "language": "Solidity", + "sources": { + "contracts/optimistic-ethereum/iOVM/accounts/iOVM_ECDSAContractAccount.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/**\n * @title iOVM_ECDSAContractAccount\n */\ninterface iOVM_ECDSAContractAccount {\n\n /********************\n * Public Functions *\n ********************/\n\n function execute(\n bytes memory _encodedTransaction\n )\n external\n returns (\n bool,\n bytes memory\n );\n}\n" + }, + "contracts/optimistic-ethereum/libraries/codec/Lib_OVMCodec.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_RLPReader } from \"../rlp/Lib_RLPReader.sol\";\nimport { Lib_RLPWriter } from \"../rlp/Lib_RLPWriter.sol\";\nimport { Lib_BytesUtils } from \"../utils/Lib_BytesUtils.sol\";\nimport { Lib_Bytes32Utils } from \"../utils/Lib_Bytes32Utils.sol\";\n\n/**\n * @title Lib_OVMCodec\n */\nlibrary Lib_OVMCodec {\n\n /*********\n * Enums *\n *********/\n\n enum QueueOrigin {\n SEQUENCER_QUEUE,\n L1TOL2_QUEUE\n }\n\n\n /***********\n * Structs *\n ***********/\n\n struct Account {\n uint256 nonce;\n uint256 balance;\n bytes32 storageRoot;\n bytes32 codeHash;\n address ethAddress;\n bool isFresh;\n }\n\n struct EVMAccount {\n uint256 nonce;\n uint256 balance;\n bytes32 storageRoot;\n bytes32 codeHash;\n }\n\n struct ChainBatchHeader {\n uint256 batchIndex;\n bytes32 batchRoot;\n uint256 batchSize;\n uint256 prevTotalElements;\n bytes extraData;\n }\n\n struct ChainInclusionProof {\n uint256 index;\n bytes32[] siblings;\n }\n\n struct Transaction {\n uint256 timestamp;\n uint256 blockNumber;\n QueueOrigin l1QueueOrigin;\n address l1TxOrigin;\n address entrypoint;\n uint256 gasLimit;\n bytes data;\n }\n\n struct TransactionChainElement {\n bool isSequenced;\n uint256 queueIndex; // QUEUED TX ONLY\n uint256 timestamp; // SEQUENCER TX ONLY\n uint256 blockNumber; // SEQUENCER TX ONLY\n bytes txData; // SEQUENCER TX ONLY\n }\n\n struct QueueElement {\n bytes32 transactionHash;\n uint40 timestamp;\n uint40 blockNumber;\n }\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Encodes a standard OVM transaction.\n * @param _transaction OVM transaction to encode.\n * @return Encoded transaction bytes.\n */\n function encodeTransaction(\n Transaction memory _transaction\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n return abi.encodePacked(\n _transaction.timestamp,\n _transaction.blockNumber,\n _transaction.l1QueueOrigin,\n _transaction.l1TxOrigin,\n _transaction.entrypoint,\n _transaction.gasLimit,\n _transaction.data\n );\n }\n\n /**\n * Hashes a standard OVM transaction.\n * @param _transaction OVM transaction to encode.\n * @return Hashed transaction\n */\n function hashTransaction(\n Transaction memory _transaction\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n return keccak256(encodeTransaction(_transaction));\n }\n\n /**\n * Converts an OVM account to an EVM account.\n * @param _in OVM account to convert.\n * @return Converted EVM account.\n */\n function toEVMAccount(\n Account memory _in\n )\n internal\n pure\n returns (\n EVMAccount memory\n )\n {\n return EVMAccount({\n nonce: _in.nonce,\n balance: _in.balance,\n storageRoot: _in.storageRoot,\n codeHash: _in.codeHash\n });\n }\n\n /**\n * @notice RLP-encodes an account state struct.\n * @param _account Account state struct.\n * @return RLP-encoded account state.\n */\n function encodeEVMAccount(\n EVMAccount memory _account\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n bytes[] memory raw = new bytes[](4);\n\n // Unfortunately we can't create this array outright because\n // Lib_RLPWriter.writeList will reject fixed-size arrays. Assigning\n // index-by-index circumvents this issue.\n raw[0] = Lib_RLPWriter.writeBytes(\n Lib_Bytes32Utils.removeLeadingZeros(\n bytes32(_account.nonce)\n )\n );\n raw[1] = Lib_RLPWriter.writeBytes(\n Lib_Bytes32Utils.removeLeadingZeros(\n bytes32(_account.balance)\n )\n );\n raw[2] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.storageRoot));\n raw[3] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.codeHash));\n\n return Lib_RLPWriter.writeList(raw);\n }\n\n /**\n * @notice Decodes an RLP-encoded account state into a useful struct.\n * @param _encoded RLP-encoded account state.\n * @return Account state struct.\n */\n function decodeEVMAccount(\n bytes memory _encoded\n )\n internal\n pure\n returns (\n EVMAccount memory\n )\n {\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\n\n return EVMAccount({\n nonce: Lib_RLPReader.readUint256(accountState[0]),\n balance: Lib_RLPReader.readUint256(accountState[1]),\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\n });\n }\n\n /**\n * Calculates a hash for a given batch header.\n * @param _batchHeader Header to hash.\n * @return Hash of the header.\n */\n function hashBatchHeader(\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n return keccak256(\n abi.encode(\n _batchHeader.batchRoot,\n _batchHeader.batchSize,\n _batchHeader.prevTotalElements,\n _batchHeader.extraData\n )\n );\n }\n}\n" + }, + "contracts/optimistic-ethereum/libraries/rlp/Lib_RLPReader.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/**\n * @title Lib_RLPReader\n * @dev Adapted from \"RLPReader\" by Hamdi Allam (hamdi.allam97@gmail.com).\n */\nlibrary Lib_RLPReader {\n\n /*************\n * Constants *\n *************/\n\n uint256 constant internal MAX_LIST_LENGTH = 32;\n\n\n /*********\n * Enums *\n *********/\n\n enum RLPItemType {\n DATA_ITEM,\n LIST_ITEM\n }\n\n\n /***********\n * Structs *\n ***********/\n\n struct RLPItem {\n uint256 length;\n uint256 ptr;\n }\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Converts bytes to a reference to memory position and length.\n * @param _in Input bytes to convert.\n * @return Output memory reference.\n */\n function toRLPItem(\n bytes memory _in\n )\n internal\n pure\n returns (\n RLPItem memory\n )\n {\n uint256 ptr;\n assembly {\n ptr := add(_in, 32)\n }\n\n return RLPItem({\n length: _in.length,\n ptr: ptr\n });\n }\n\n /**\n * Reads an RLP list value into a list of RLP items.\n * @param _in RLP list value.\n * @return Decoded RLP list items.\n */\n function readList(\n RLPItem memory _in\n )\n internal\n pure\n returns (\n RLPItem[] memory\n )\n {\n (\n uint256 listOffset,\n ,\n RLPItemType itemType\n ) = _decodeLength(_in);\n\n require(\n itemType == RLPItemType.LIST_ITEM,\n \"Invalid RLP list value.\"\n );\n\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\n // writing to the length. Since we can't know the number of RLP items without looping over\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\n // simply set a reasonable maximum list length and decrease the size before we finish.\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\n\n uint256 itemCount = 0;\n uint256 offset = listOffset;\n while (offset < _in.length) {\n require(\n itemCount < MAX_LIST_LENGTH,\n \"Provided RLP list exceeds max list length.\"\n );\n\n (\n uint256 itemOffset,\n uint256 itemLength,\n ) = _decodeLength(RLPItem({\n length: _in.length - offset,\n ptr: _in.ptr + offset\n }));\n\n out[itemCount] = RLPItem({\n length: itemLength + itemOffset,\n ptr: _in.ptr + offset\n });\n\n itemCount += 1;\n offset += itemOffset + itemLength;\n }\n\n // Decrease the array size to match the actual item count.\n assembly {\n mstore(out, itemCount)\n }\n\n return out;\n }\n\n /**\n * Reads an RLP list value into a list of RLP items.\n * @param _in RLP list value.\n * @return Decoded RLP list items.\n */\n function readList(\n bytes memory _in\n )\n internal\n pure\n returns (\n RLPItem[] memory\n )\n {\n return readList(\n toRLPItem(_in)\n );\n }\n\n /**\n * Reads an RLP bytes value into bytes.\n * @param _in RLP bytes value.\n * @return Decoded bytes.\n */\n function readBytes(\n RLPItem memory _in\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n (\n uint256 itemOffset,\n uint256 itemLength,\n RLPItemType itemType\n ) = _decodeLength(_in);\n\n require(\n itemType == RLPItemType.DATA_ITEM,\n \"Invalid RLP bytes value.\"\n );\n\n return _copy(_in.ptr, itemOffset, itemLength);\n }\n\n /**\n * Reads an RLP bytes value into bytes.\n * @param _in RLP bytes value.\n * @return Decoded bytes.\n */\n function readBytes(\n bytes memory _in\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n return readBytes(\n toRLPItem(_in)\n );\n }\n\n /**\n * Reads an RLP string value into a string.\n * @param _in RLP string value.\n * @return Decoded string.\n */\n function readString(\n RLPItem memory _in\n )\n internal\n pure\n returns (\n string memory\n )\n {\n return string(readBytes(_in));\n }\n\n /**\n * Reads an RLP string value into a string.\n * @param _in RLP string value.\n * @return Decoded string.\n */\n function readString(\n bytes memory _in\n )\n internal\n pure\n returns (\n string memory\n )\n {\n return readString(\n toRLPItem(_in)\n );\n }\n\n /**\n * Reads an RLP bytes32 value into a bytes32.\n * @param _in RLP bytes32 value.\n * @return Decoded bytes32.\n */\n function readBytes32(\n RLPItem memory _in\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n require(\n _in.length <= 33,\n \"Invalid RLP bytes32 value.\"\n );\n\n (\n uint256 itemOffset,\n uint256 itemLength,\n RLPItemType itemType\n ) = _decodeLength(_in);\n\n require(\n itemType == RLPItemType.DATA_ITEM,\n \"Invalid RLP bytes32 value.\"\n );\n\n uint256 ptr = _in.ptr + itemOffset;\n bytes32 out;\n assembly {\n out := mload(ptr)\n\n // Shift the bytes over to match the item size.\n if lt(itemLength, 32) {\n out := div(out, exp(256, sub(32, itemLength)))\n }\n }\n\n return out;\n }\n\n /**\n * Reads an RLP bytes32 value into a bytes32.\n * @param _in RLP bytes32 value.\n * @return Decoded bytes32.\n */\n function readBytes32(\n bytes memory _in\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n return readBytes32(\n toRLPItem(_in)\n );\n }\n\n /**\n * Reads an RLP uint256 value into a uint256.\n * @param _in RLP uint256 value.\n * @return Decoded uint256.\n */\n function readUint256(\n RLPItem memory _in\n )\n internal\n pure\n returns (\n uint256\n )\n {\n return uint256(readBytes32(_in));\n }\n\n /**\n * Reads an RLP uint256 value into a uint256.\n * @param _in RLP uint256 value.\n * @return Decoded uint256.\n */\n function readUint256(\n bytes memory _in\n )\n internal\n pure\n returns (\n uint256\n )\n {\n return readUint256(\n toRLPItem(_in)\n );\n }\n\n /**\n * Reads an RLP bool value into a bool.\n * @param _in RLP bool value.\n * @return Decoded bool.\n */\n function readBool(\n RLPItem memory _in\n )\n internal\n pure\n returns (\n bool\n )\n {\n require(\n _in.length == 1,\n \"Invalid RLP boolean value.\"\n );\n\n uint256 ptr = _in.ptr;\n uint256 out;\n assembly {\n out := byte(0, mload(ptr))\n }\n\n require(\n out == 0 || out == 1,\n \"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\"\n );\n\n return out != 0;\n }\n\n /**\n * Reads an RLP bool value into a bool.\n * @param _in RLP bool value.\n * @return Decoded bool.\n */\n function readBool(\n bytes memory _in\n )\n internal\n pure\n returns (\n bool\n )\n {\n return readBool(\n toRLPItem(_in)\n );\n }\n\n /**\n * Reads an RLP address value into a address.\n * @param _in RLP address value.\n * @return Decoded address.\n */\n function readAddress(\n RLPItem memory _in\n )\n internal\n pure\n returns (\n address\n )\n {\n if (_in.length == 1) {\n return address(0);\n }\n\n require(\n _in.length == 21,\n \"Invalid RLP address value.\"\n );\n\n return address(readUint256(_in));\n }\n\n /**\n * Reads an RLP address value into a address.\n * @param _in RLP address value.\n * @return Decoded address.\n */\n function readAddress(\n bytes memory _in\n )\n internal\n pure\n returns (\n address\n )\n {\n return readAddress(\n toRLPItem(_in)\n );\n }\n\n /**\n * Reads the raw bytes of an RLP item.\n * @param _in RLP item to read.\n * @return Raw RLP bytes.\n */\n function readRawBytes(\n RLPItem memory _in\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n return _copy(_in);\n }\n\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * Decodes the length of an RLP item.\n * @param _in RLP item to decode.\n * @return Offset of the encoded data.\n * @return Length of the encoded data.\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\n */\n function _decodeLength(\n RLPItem memory _in\n )\n private\n pure\n returns (\n uint256,\n uint256,\n RLPItemType\n )\n {\n require(\n _in.length > 0,\n \"RLP item cannot be null.\"\n );\n\n uint256 ptr = _in.ptr;\n uint256 prefix;\n assembly {\n prefix := byte(0, mload(ptr))\n }\n\n if (prefix <= 0x7f) {\n // Single byte.\n\n return (0, 1, RLPItemType.DATA_ITEM);\n } else if (prefix <= 0xb7) {\n // Short string.\n\n uint256 strLen = prefix - 0x80;\n\n require(\n _in.length > strLen,\n \"Invalid RLP short string.\"\n );\n\n return (1, strLen, RLPItemType.DATA_ITEM);\n } else if (prefix <= 0xbf) {\n // Long string.\n uint256 lenOfStrLen = prefix - 0xb7;\n\n require(\n _in.length > lenOfStrLen,\n \"Invalid RLP long string length.\"\n );\n\n uint256 strLen;\n assembly {\n // Pick out the string length.\n strLen := div(\n mload(add(ptr, 1)),\n exp(256, sub(32, lenOfStrLen))\n )\n }\n\n require(\n _in.length > lenOfStrLen + strLen,\n \"Invalid RLP long string.\"\n );\n\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\n } else if (prefix <= 0xf7) {\n // Short list.\n uint256 listLen = prefix - 0xc0;\n\n require(\n _in.length > listLen,\n \"Invalid RLP short list.\"\n );\n\n return (1, listLen, RLPItemType.LIST_ITEM);\n } else {\n // Long list.\n uint256 lenOfListLen = prefix - 0xf7;\n\n require(\n _in.length > lenOfListLen,\n \"Invalid RLP long list length.\"\n );\n\n uint256 listLen;\n assembly {\n // Pick out the list length.\n listLen := div(\n mload(add(ptr, 1)),\n exp(256, sub(32, lenOfListLen))\n )\n }\n\n require(\n _in.length > lenOfListLen + listLen,\n \"Invalid RLP long list.\"\n );\n\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\n }\n }\n\n /**\n * Copies the bytes from a memory location.\n * @param _src Pointer to the location to read from.\n * @param _offset Offset to start reading from.\n * @param _length Number of bytes to read.\n * @return Copied bytes.\n */\n function _copy(\n uint256 _src,\n uint256 _offset,\n uint256 _length\n )\n private\n pure\n returns (\n bytes memory\n )\n {\n bytes memory out = new bytes(_length);\n if (out.length == 0) {\n return out;\n }\n\n uint256 src = _src + _offset;\n uint256 dest;\n assembly {\n dest := add(out, 32)\n }\n\n // Copy over as many complete words as we can.\n for (uint256 i = 0; i < _length / 32; i++) {\n assembly {\n mstore(dest, mload(src))\n }\n\n src += 32;\n dest += 32;\n }\n\n // Pick out the remaining bytes.\n uint256 mask = 256 ** (32 - (_length % 32)) - 1;\n assembly {\n mstore(\n dest,\n or(\n and(mload(src), not(mask)),\n and(mload(dest), mask)\n )\n )\n }\n\n return out;\n }\n\n /**\n * Copies an RLP item into bytes.\n * @param _in RLP item to copy.\n * @return Copied bytes.\n */\n function _copy(\n RLPItem memory _in\n )\n private\n pure\n returns (\n bytes memory\n )\n {\n return _copy(_in.ptr, 0, _in.length);\n }\n}\n" + }, + "contracts/optimistic-ethereum/libraries/rlp/Lib_RLPWriter.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/**\n * @title Lib_RLPWriter\n * @author Bakaoh (with modifications)\n */\nlibrary Lib_RLPWriter {\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * RLP encodes a byte string.\n * @param _in The byte string to encode.\n * @return The RLP encoded string in bytes.\n */\n function writeBytes(\n bytes memory _in\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n bytes memory encoded;\n\n if (_in.length == 1 && uint8(_in[0]) < 128) {\n encoded = _in;\n } else {\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\n }\n\n return encoded;\n }\n\n /**\n * RLP encodes a list of RLP encoded byte byte strings.\n * @param _in The list of RLP encoded byte strings.\n * @return The RLP encoded list of items in bytes.\n */\n function writeList(\n bytes[] memory _in\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n bytes memory list = _flatten(_in);\n return abi.encodePacked(_writeLength(list.length, 192), list);\n }\n\n /**\n * RLP encodes a string.\n * @param _in The string to encode.\n * @return The RLP encoded string in bytes.\n */\n function writeString(\n string memory _in\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n return writeBytes(bytes(_in));\n }\n\n /**\n * RLP encodes an address.\n * @param _in The address to encode.\n * @return The RLP encoded address in bytes.\n */\n function writeAddress(\n address _in\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n return writeBytes(abi.encodePacked(_in));\n }\n\n /**\n * RLP encodes a bytes32 value.\n * @param _in The bytes32 to encode.\n * @return _out The RLP encoded bytes32 in bytes.\n */\n function writeBytes32(\n bytes32 _in\n )\n internal\n pure\n returns (\n bytes memory _out\n )\n {\n return writeBytes(abi.encodePacked(_in));\n }\n\n /**\n * RLP encodes a uint.\n * @param _in The uint256 to encode.\n * @return The RLP encoded uint256 in bytes.\n */\n function writeUint(\n uint256 _in\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n return writeBytes(_toBinary(_in));\n }\n\n /**\n * RLP encodes a bool.\n * @param _in The bool to encode.\n * @return The RLP encoded bool in bytes.\n */\n function writeBool(\n bool _in\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n bytes memory encoded = new bytes(1);\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\n return encoded;\n }\n\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\n * @param _len The length of the string or the payload.\n * @param _offset 128 if item is string, 192 if item is list.\n * @return RLP encoded bytes.\n */\n function _writeLength(\n uint256 _len,\n uint256 _offset\n )\n private\n pure\n returns (\n bytes memory\n )\n {\n bytes memory encoded;\n\n if (_len < 56) {\n encoded = new bytes(1);\n encoded[0] = byte(uint8(_len) + uint8(_offset));\n } else {\n uint256 lenLen;\n uint256 i = 1;\n while (_len / i != 0) {\n lenLen++;\n i *= 256;\n }\n\n encoded = new bytes(lenLen + 1);\n encoded[0] = byte(uint8(lenLen) + uint8(_offset) + 55);\n for(i = 1; i <= lenLen; i++) {\n encoded[i] = byte(uint8((_len / (256**(lenLen-i))) % 256));\n }\n }\n\n return encoded;\n }\n\n /**\n * Encode integer in big endian binary form with no leading zeroes.\n * @notice TODO: This should be optimized with assembly to save gas costs.\n * @param _x The integer to encode.\n * @return RLP encoded bytes.\n */\n function _toBinary(\n uint256 _x\n )\n private\n pure\n returns (\n bytes memory\n )\n {\n bytes memory b = abi.encodePacked(_x);\n\n uint256 i = 0;\n for (; i < 32; i++) {\n if (b[i] != 0) {\n break;\n }\n }\n\n bytes memory res = new bytes(32 - i);\n for (uint256 j = 0; j < res.length; j++) {\n res[j] = b[i++];\n }\n\n return res;\n }\n\n /**\n * Copies a piece of memory to another location.\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\n * @param _dest Destination location.\n * @param _src Source location.\n * @param _len Length of memory to copy.\n */\n function _memcpy(\n uint256 _dest,\n uint256 _src,\n uint256 _len\n )\n private\n pure\n {\n uint256 dest = _dest;\n uint256 src = _src;\n uint256 len = _len;\n\n for(; len >= 32; len -= 32) {\n assembly {\n mstore(dest, mload(src))\n }\n dest += 32;\n src += 32;\n }\n\n uint256 mask = 256 ** (32 - len) - 1;\n assembly {\n let srcpart := and(mload(src), not(mask))\n let destpart := and(mload(dest), mask)\n mstore(dest, or(destpart, srcpart))\n }\n }\n\n /**\n * Flattens a list of byte strings into one byte string.\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\n * @param _list List of byte strings to flatten.\n * @return The flattened byte string.\n */\n function _flatten(\n bytes[] memory _list\n )\n private\n pure\n returns (\n bytes memory\n )\n {\n if (_list.length == 0) {\n return new bytes(0);\n }\n\n uint256 len;\n uint256 i = 0;\n for (; i < _list.length; i++) {\n len += _list[i].length;\n }\n\n bytes memory flattened = new bytes(len);\n uint256 flattenedPtr;\n assembly { flattenedPtr := add(flattened, 0x20) }\n\n for(i = 0; i < _list.length; i++) {\n bytes memory item = _list[i];\n\n uint256 listPtr;\n assembly { listPtr := add(item, 0x20)}\n\n _memcpy(flattenedPtr, listPtr, item.length);\n flattenedPtr += _list[i].length;\n }\n\n return flattened;\n }\n}\n" + }, + "contracts/optimistic-ethereum/libraries/utils/Lib_BytesUtils.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/**\n * @title Lib_BytesUtils\n */\nlibrary Lib_BytesUtils {\n\n /**********************\n * Internal Functions *\n **********************/\n\n function slice(\n bytes memory _bytes,\n uint256 _start,\n uint256 _length\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n require(_length + 31 >= _length, \"slice_overflow\");\n require(_start + _length >= _start, \"slice_overflow\");\n require(_bytes.length >= _start + _length, \"slice_outOfBounds\");\n\n bytes memory tempBytes;\n\n assembly {\n switch iszero(_length)\n case 0 {\n // Get a location of some free memory and store it in tempBytes as\n // Solidity does for memory variables.\n tempBytes := mload(0x40)\n\n // The first word of the slice result is potentially a partial\n // word read from the original array. To read it, we calculate\n // the length of that partial word and start copying that many\n // bytes into the array. The first word we copy will start with\n // data we don't care about, but the last `lengthmod` bytes will\n // land at the beginning of the contents of the new array. When\n // we're done copying, we overwrite the full first word with\n // the actual length of the slice.\n let lengthmod := and(_length, 31)\n\n // The multiplication in the next line is necessary\n // because when slicing multiples of 32 bytes (lengthmod == 0)\n // the following copy loop was copying the origin's length\n // and then ending prematurely not copying everything it should.\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\n let end := add(mc, _length)\n\n for {\n // The multiplication in the next line has the same exact purpose\n // as the one above.\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\n } lt(mc, end) {\n mc := add(mc, 0x20)\n cc := add(cc, 0x20)\n } {\n mstore(mc, mload(cc))\n }\n\n mstore(tempBytes, _length)\n\n //update free-memory pointer\n //allocating the array padded to 32 bytes like the compiler does now\n mstore(0x40, and(add(mc, 31), not(31)))\n }\n //if we want a zero-length slice let's just return a zero-length array\n default {\n tempBytes := mload(0x40)\n\n //zero out the 32 bytes slice we are about to return\n //we need to do it because Solidity does not garbage collect\n mstore(tempBytes, 0)\n\n mstore(0x40, add(tempBytes, 0x20))\n }\n }\n\n return tempBytes;\n }\n\n function slice(\n bytes memory _bytes,\n uint256 _start\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n if (_bytes.length - _start == 0) {\n return bytes('');\n }\n\n return slice(_bytes, _start, _bytes.length - _start);\n }\n\n function toBytes32PadLeft(\n bytes memory _bytes\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n bytes32 ret;\n uint256 len = _bytes.length <= 32 ? _bytes.length : 32;\n assembly {\n ret := shr(mul(sub(32, len), 8), mload(add(_bytes, 32)))\n }\n return ret;\n }\n\n function toBytes32(\n bytes memory _bytes\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n if (_bytes.length < 32) {\n bytes32 ret;\n assembly {\n ret := mload(add(_bytes, 32))\n }\n return ret;\n }\n\n return abi.decode(_bytes,(bytes32)); // will truncate if input length > 32 bytes\n }\n\n function toUint256(\n bytes memory _bytes\n )\n internal\n pure\n returns (\n uint256\n )\n {\n return uint256(toBytes32(_bytes));\n }\n\n function toUint24(\n bytes memory _bytes,\n uint256 _start\n )\n internal\n pure\n returns (\n uint24\n )\n {\n require(_start + 3 >= _start, \"toUint24_overflow\");\n require(_bytes.length >= _start + 3 , \"toUint24_outOfBounds\");\n uint24 tempUint;\n\n assembly {\n tempUint := mload(add(add(_bytes, 0x3), _start))\n }\n\n return tempUint;\n }\n\n function toUint8(\n bytes memory _bytes,\n uint256 _start\n )\n internal\n pure\n returns (\n uint8\n )\n {\n require(_start + 1 >= _start, \"toUint8_overflow\");\n require(_bytes.length >= _start + 1 , \"toUint8_outOfBounds\");\n uint8 tempUint;\n\n assembly {\n tempUint := mload(add(add(_bytes, 0x1), _start))\n }\n\n return tempUint;\n }\n\n function toAddress(\n bytes memory _bytes,\n uint256 _start\n )\n internal\n pure\n returns (\n address\n )\n {\n require(_start + 20 >= _start, \"toAddress_overflow\");\n require(_bytes.length >= _start + 20, \"toAddress_outOfBounds\");\n address tempAddress;\n\n assembly {\n tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000)\n }\n\n return tempAddress;\n }\n\n function toNibbles(\n bytes memory _bytes\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n bytes memory nibbles = new bytes(_bytes.length * 2);\n\n for (uint256 i = 0; i < _bytes.length; i++) {\n nibbles[i * 2] = _bytes[i] >> 4;\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\n }\n\n return nibbles;\n }\n\n function fromNibbles(\n bytes memory _bytes\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n bytes memory ret = new bytes(_bytes.length / 2);\n\n for (uint256 i = 0; i < ret.length; i++) {\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\n }\n\n return ret;\n }\n\n function equal(\n bytes memory _bytes,\n bytes memory _other\n )\n internal\n pure\n returns (\n bool\n )\n {\n return keccak256(_bytes) == keccak256(_other);\n }\n}\n" + }, + "contracts/optimistic-ethereum/libraries/utils/Lib_Bytes32Utils.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/**\n * @title Lib_Byte32Utils\n */\nlibrary Lib_Bytes32Utils {\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \"true.\"\n * @param _in Input bytes32 value.\n * @return Bytes32 as a boolean.\n */\n function toBool(\n bytes32 _in\n )\n internal\n pure\n returns (\n bool\n )\n {\n return _in != 0;\n }\n\n /**\n * Converts a boolean to a bytes32 value.\n * @param _in Input boolean value.\n * @return Boolean as a bytes32.\n */\n function fromBool(\n bool _in\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n return bytes32(uint256(_in ? 1 : 0));\n }\n\n /**\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\n * @param _in Input bytes32 value.\n * @return Bytes32 as an address.\n */\n function toAddress(\n bytes32 _in\n )\n internal\n pure\n returns (\n address\n )\n {\n return address(uint160(uint256(_in)));\n }\n\n /**\n * Converts an address to a bytes32.\n * @param _in Input address value.\n * @return Address as a bytes32.\n */\n function fromAddress(\n address _in\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n return bytes32(uint256(_in));\n }\n\n /**\n * Removes the leading zeros from a bytes32 value and returns a new (smaller) bytes value.\n * @param _in Input bytes32 value.\n * @return Bytes32 without any leading zeros.\n */\n function removeLeadingZeros(\n bytes32 _in\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n bytes memory out;\n\n assembly {\n // Figure out how many leading zero bytes to remove.\n let shift := 0\n for { let i := 0 } and(lt(i, 32), eq(byte(i, _in), 0)) { i := add(i, 1) } {\n shift := add(shift, 1)\n }\n\n // Reserve some space for our output and fix the free memory pointer.\n out := mload(0x40)\n mstore(0x40, add(out, 0x40))\n\n // Shift the value and store it into the output bytes.\n mstore(add(out, 0x20), shl(mul(shift, 8), _in))\n\n // Store the new size (with leading zero bytes removed) in the output byte size.\n mstore(out, sub(32, shift))\n }\n\n return out;\n }\n}\n" + }, + "contracts/optimistic-ethereum/libraries/codec/Lib_EIP155Tx.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_RLPReader } from \"../rlp/Lib_RLPReader.sol\";\nimport { Lib_RLPWriter } from \"../rlp/Lib_RLPWriter.sol\";\n\n/**\n * @title Lib_EIP155Tx\n * @dev A simple library for dealing with the transaction type defined by EIP155:\n * https://github.com/ethereum/EIPs/blob/master/EIPS/eip-155.md\n */\nlibrary Lib_EIP155Tx {\n\n /***********\n * Structs *\n ***********/\n\n // Struct representing an EIP155 transaction. See EIP link above for more information.\n struct EIP155Tx {\n // These fields correspond to the actual RLP-encoded fields specified by EIP155.\n uint256 nonce;\n uint256 gasPrice;\n uint256 gasLimit;\n address to;\n uint256 value;\n bytes data;\n uint8 v;\n bytes32 r;\n bytes32 s;\n\n // Chain ID to associate this transaction with. Used all over the place, seemed easier to\n // set this once when we create the transaction rather than providing it as an input to\n // each function. I don't see a strong need to have a transaction with a mutable chain ID.\n uint256 chainId;\n\n // The ECDSA \"recovery parameter,\" should always be 0 or 1. EIP155 specifies that:\n // `v = {0,1} + CHAIN_ID * 2 + 35`\n // Where `{0,1}` is a stand in for our `recovery_parameter`. Now computing our formula for\n // the recovery parameter:\n // 1. `v = {0,1} + CHAIN_ID * 2 + 35`\n // 2. `v = recovery_parameter + CHAIN_ID * 2 + 35`\n // 3. `v - CHAIN_ID * 2 - 35 = recovery_parameter`\n // So we're left with the final formula:\n // `recovery_parameter = v - CHAIN_ID * 2 - 35`\n // NOTE: This variable is a uint8 because `v` is inherently limited to a uint8. If we\n // didn't use a uint8, then recovery_parameter would always be a negative number for chain\n // IDs greater than 110 (`255 - 110 * 2 - 35 = 0`). So we need to wrap around to support\n // anything larger.\n uint8 recoveryParam; \n\n // Whether or not the transaction is a creation. Necessary because we can't make an address\n // \"nil\". Using the zero address creates a potential conflict if the user did actually\n // intend to send a transaction to the zero address.\n bool isCreate; \n }\n\n // Lets us use nicer syntax.\n using Lib_EIP155Tx for EIP155Tx;\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Decodes an EIP155 transaction and attaches a given Chain ID.\n * Transaction *must* be RLP-encoded.\n * @param _encoded RLP-encoded EIP155 transaction.\n * @param _chainId Chain ID to assocaite with this transaction.\n * @return Parsed transaction.\n */\n function decode(\n bytes memory _encoded,\n uint256 _chainId\n )\n internal\n pure\n returns (\n EIP155Tx memory\n )\n {\n Lib_RLPReader.RLPItem[] memory decoded = Lib_RLPReader.readList(_encoded);\n\n // Note formula above about how recoveryParam is computed.\n uint8 v = uint8(Lib_RLPReader.readUint256(decoded[6]));\n uint8 recoveryParam = uint8(v - 2 * _chainId - 35);\n\n // Recovery param being anything other than 0 or 1 indicates that we have the wrong chain\n // ID.\n require(\n recoveryParam < 2,\n \"Lib_EIP155Tx: Transaction signed with wrong chain ID\"\n );\n\n // Creations can be detected by looking at the byte length here.\n bool isCreate = Lib_RLPReader.readBytes(decoded[3]).length == 0;\n\n return EIP155Tx({\n nonce: Lib_RLPReader.readUint256(decoded[0]),\n gasPrice: Lib_RLPReader.readUint256(decoded[1]),\n gasLimit: Lib_RLPReader.readUint256(decoded[2]),\n to: Lib_RLPReader.readAddress(decoded[3]),\n value: Lib_RLPReader.readUint256(decoded[4]),\n data: Lib_RLPReader.readBytes(decoded[5]),\n v: v,\n r: Lib_RLPReader.readBytes32(decoded[7]),\n s: Lib_RLPReader.readBytes32(decoded[8]),\n chainId: _chainId,\n recoveryParam: recoveryParam,\n isCreate: isCreate\n });\n }\n\n /**\n * Encodes an EIP155 transaction into RLP.\n * @param _transaction EIP155 transaction to encode.\n * @param _includeSignature Whether or not to encode the signature.\n * @return RLP-encoded transaction.\n */\n function encode(\n EIP155Tx memory _transaction,\n bool _includeSignature\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n bytes[] memory raw = new bytes[](9);\n\n raw[0] = Lib_RLPWriter.writeUint(_transaction.nonce);\n raw[1] = Lib_RLPWriter.writeUint(_transaction.gasPrice);\n raw[2] = Lib_RLPWriter.writeUint(_transaction.gasLimit);\n\n // We write the encoding of empty bytes when the transaction is a creation, *not* the zero\n // address as one might assume.\n if (_transaction.isCreate) {\n raw[3] = Lib_RLPWriter.writeBytes('');\n } else {\n raw[3] = Lib_RLPWriter.writeAddress(_transaction.to);\n }\n\n raw[4] = Lib_RLPWriter.writeUint(_transaction.value);\n raw[5] = Lib_RLPWriter.writeBytes(_transaction.data);\n\n if (_includeSignature) {\n raw[6] = Lib_RLPWriter.writeUint(_transaction.v);\n raw[7] = Lib_RLPWriter.writeBytes32(_transaction.r);\n raw[8] = Lib_RLPWriter.writeBytes32(_transaction.s);\n } else {\n // Chain ID *is* included in the unsigned transaction.\n raw[6] = Lib_RLPWriter.writeUint(_transaction.chainId); \n raw[7] = Lib_RLPWriter.writeBytes('');\n raw[8] = Lib_RLPWriter.writeBytes('');\n }\n\n return Lib_RLPWriter.writeList(raw);\n }\n\n /**\n * Computes the hash of an EIP155 transaction. Assumes that you don't want to include the\n * signature in this hash because that's a very uncommon usecase. If you really want to include\n * the signature, just encode with the signature and take the hash yourself.\n */\n function hash(\n EIP155Tx memory _transaction\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n return keccak256(\n _transaction.encode(false)\n );\n }\n\n /**\n * Computes the sender of an EIP155 transaction.\n * @param _transaction EIP155 transaction to get a sender for.\n * @return Address corresponding to the private key that signed this transaction.\n */\n function sender(\n EIP155Tx memory _transaction\n )\n internal\n pure\n returns (\n address\n )\n {\n return ecrecover(\n _transaction.hash(),\n _transaction.recoveryParam + 27,\n _transaction.r,\n _transaction.s\n );\n }\n}\n" + }, + "contracts/optimistic-ethereum/OVM/predeploys/OVM_ETH.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Library Imports */\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/* Interface Imports */\nimport { iOVM_L1TokenGateway } from \"../../iOVM/bridge/tokens/iOVM_L1TokenGateway.sol\";\n\n/* Contract Imports */\nimport { OVM_L2DepositedERC20 } from \"../bridge/tokens/OVM_L2DepositedERC20.sol\";\n\n/**\n * @title OVM_ETH\n * @dev The ETH predeploy provides an ERC20 interface for ETH deposited to Layer 2. Note that\n * unlike on Layer 1, Layer 2 accounts do not have a balance field.\n *\n * Compiler used: optimistic-solc\n * Runtime target: OVM\n */\ncontract OVM_ETH is OVM_L2DepositedERC20 {\n constructor(\n address _l2CrossDomainMessenger,\n address _l1ETHGateway\n )\n OVM_L2DepositedERC20(\n _l2CrossDomainMessenger,\n \"Ether\",\n \"ETH\"\n )\n {\n init(iOVM_L1TokenGateway(_l1ETHGateway));\n }\n}\n" + }, + "@openzeppelin/contracts/math/SafeMath.sol": { + "content": "// SPDX-License-Identifier: MIT\n\npragma solidity >=0.6.0 <0.8.0;\n\n/**\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\n * checks.\n *\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\n * in bugs, because programmers usually assume that an overflow raises an\n * error, which is the standard behavior in high level programming languages.\n * `SafeMath` restores this intuition by reverting the transaction when an\n * operation overflows.\n *\n * Using this library instead of the unchecked operations eliminates an entire\n * class of bugs, so it's recommended to use it always.\n */\nlibrary SafeMath {\n /**\n * @dev Returns the addition of two unsigned integers, with an overflow flag.\n *\n * _Available since v3.4._\n */\n function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n uint256 c = a + b;\n if (c < a) return (false, 0);\n return (true, c);\n }\n\n /**\n * @dev Returns the substraction of two unsigned integers, with an overflow flag.\n *\n * _Available since v3.4._\n */\n function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n if (b > a) return (false, 0);\n return (true, a - b);\n }\n\n /**\n * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\n *\n * _Available since v3.4._\n */\n function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\n // benefit is lost if 'b' is also tested.\n // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\n if (a == 0) return (true, 0);\n uint256 c = a * b;\n if (c / a != b) return (false, 0);\n return (true, c);\n }\n\n /**\n * @dev Returns the division of two unsigned integers, with a division by zero flag.\n *\n * _Available since v3.4._\n */\n function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n if (b == 0) return (false, 0);\n return (true, a / b);\n }\n\n /**\n * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\n *\n * _Available since v3.4._\n */\n function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n if (b == 0) return (false, 0);\n return (true, a % b);\n }\n\n /**\n * @dev Returns the addition of two unsigned integers, reverting on\n * overflow.\n *\n * Counterpart to Solidity's `+` operator.\n *\n * Requirements:\n *\n * - Addition cannot overflow.\n */\n function add(uint256 a, uint256 b) internal pure returns (uint256) {\n uint256 c = a + b;\n require(c >= a, \"SafeMath: addition overflow\");\n return c;\n }\n\n /**\n * @dev Returns the subtraction of two unsigned integers, reverting on\n * overflow (when the result is negative).\n *\n * Counterpart to Solidity's `-` operator.\n *\n * Requirements:\n *\n * - Subtraction cannot overflow.\n */\n function sub(uint256 a, uint256 b) internal pure returns (uint256) {\n require(b <= a, \"SafeMath: subtraction overflow\");\n return a - b;\n }\n\n /**\n * @dev Returns the multiplication of two unsigned integers, reverting on\n * overflow.\n *\n * Counterpart to Solidity's `*` operator.\n *\n * Requirements:\n *\n * - Multiplication cannot overflow.\n */\n function mul(uint256 a, uint256 b) internal pure returns (uint256) {\n if (a == 0) return 0;\n uint256 c = a * b;\n require(c / a == b, \"SafeMath: multiplication overflow\");\n return c;\n }\n\n /**\n * @dev Returns the integer division of two unsigned integers, reverting on\n * division by zero. The result is rounded towards zero.\n *\n * Counterpart to Solidity's `/` operator. Note: this function uses a\n * `revert` opcode (which leaves remaining gas untouched) while Solidity\n * uses an invalid opcode to revert (consuming all remaining gas).\n *\n * Requirements:\n *\n * - The divisor cannot be zero.\n */\n function div(uint256 a, uint256 b) internal pure returns (uint256) {\n require(b > 0, \"SafeMath: division by zero\");\n return a / b;\n }\n\n /**\n * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\n * reverting when dividing by zero.\n *\n * Counterpart to Solidity's `%` operator. This function uses a `revert`\n * opcode (which leaves remaining gas untouched) while Solidity uses an\n * invalid opcode to revert (consuming all remaining gas).\n *\n * Requirements:\n *\n * - The divisor cannot be zero.\n */\n function mod(uint256 a, uint256 b) internal pure returns (uint256) {\n require(b > 0, \"SafeMath: modulo by zero\");\n return a % b;\n }\n\n /**\n * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\n * overflow (when the result is negative).\n *\n * CAUTION: This function is deprecated because it requires allocating memory for the error\n * message unnecessarily. For custom revert reasons use {trySub}.\n *\n * Counterpart to Solidity's `-` operator.\n *\n * Requirements:\n *\n * - Subtraction cannot overflow.\n */\n function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\n require(b <= a, errorMessage);\n return a - b;\n }\n\n /**\n * @dev Returns the integer division of two unsigned integers, reverting with custom message on\n * division by zero. The result is rounded towards zero.\n *\n * CAUTION: This function is deprecated because it requires allocating memory for the error\n * message unnecessarily. For custom revert reasons use {tryDiv}.\n *\n * Counterpart to Solidity's `/` operator. Note: this function uses a\n * `revert` opcode (which leaves remaining gas untouched) while Solidity\n * uses an invalid opcode to revert (consuming all remaining gas).\n *\n * Requirements:\n *\n * - The divisor cannot be zero.\n */\n function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\n require(b > 0, errorMessage);\n return a / b;\n }\n\n /**\n * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\n * reverting with custom message when dividing by zero.\n *\n * CAUTION: This function is deprecated because it requires allocating memory for the error\n * message unnecessarily. For custom revert reasons use {tryMod}.\n *\n * Counterpart to Solidity's `%` operator. This function uses a `revert`\n * opcode (which leaves remaining gas untouched) while Solidity uses an\n * invalid opcode to revert (consuming all remaining gas).\n *\n * Requirements:\n *\n * - The divisor cannot be zero.\n */\n function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\n require(b > 0, errorMessage);\n return a % b;\n }\n}\n" + }, + "contracts/optimistic-ethereum/libraries/utils/Lib_ErrorUtils.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/**\n * @title Lib_ErrorUtils\n */\nlibrary Lib_ErrorUtils {\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Encodes an error string into raw solidity-style revert data.\n * (i.e. ascii bytes, prefixed with bytes4(keccak(\"Error(string))\"))\n * Ref: https://docs.soliditylang.org/en/v0.8.2/control-structures.html?highlight=Error(string)#panic-via-assert-and-error-via-require\n * @param _reason Reason for the reversion.\n * @return Standard solidity revert data for the given reason.\n */\n function encodeRevertString(\n string memory _reason\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n return abi.encodeWithSignature(\n \"Error(string)\",\n _reason\n );\n }\n}\n" + }, + "contracts/optimistic-ethereum/libraries/resolver/Lib_AddressResolver.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Library Imports */\nimport { Lib_AddressManager } from \"./Lib_AddressManager.sol\";\n\n/**\n * @title Lib_AddressResolver\n */\nabstract contract Lib_AddressResolver {\n\n /*************\n * Variables *\n *************/\n\n Lib_AddressManager public libAddressManager;\n\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Lib_AddressManager.\n */\n constructor(\n address _libAddressManager\n ) {\n libAddressManager = Lib_AddressManager(_libAddressManager);\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Resolves the address associated with a given name.\n * @param _name Name to resolve an address for.\n * @return Address associated with the given name.\n */\n function resolve(\n string memory _name\n )\n public\n view\n returns (\n address\n )\n {\n return libAddressManager.getAddress(_name);\n }\n}\n" + }, + "contracts/optimistic-ethereum/iOVM/bridge/tokens/iOVM_L1TokenGateway.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0;\npragma experimental ABIEncoderV2;\n\n/**\n * @title iOVM_L1TokenGateway\n */\ninterface iOVM_L1TokenGateway {\n\n /**********\n * Events *\n **********/\n\n event DepositInitiated(\n address indexed _from,\n address _to,\n uint256 _amount\n );\n\n event WithdrawalFinalized(\n address indexed _to,\n uint256 _amount\n );\n\n\n /********************\n * Public Functions *\n ********************/\n\n function deposit(\n uint _amount\n )\n external;\n\n function depositTo(\n address _to,\n uint _amount\n )\n external;\n\n\n /*************************\n * Cross-chain Functions *\n *************************/\n\n function finalizeWithdrawal(\n address _to,\n uint _amount\n )\n external;\n}\n" + }, + "contracts/optimistic-ethereum/OVM/bridge/tokens/OVM_L2DepositedERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Interface Imports */\nimport { iOVM_L1TokenGateway } from \"../../../iOVM/bridge/tokens/iOVM_L1TokenGateway.sol\";\n\n/* Contract Imports */\nimport { UniswapV2ERC20 } from \"../../../libraries/standards/UniswapV2ERC20.sol\";\n\n/* Library Imports */\nimport { Abs_L2DepositedToken } from \"./Abs_L2DepositedToken.sol\";\n\n/**\n * @title OVM_L2DepositedERC20\n * @dev The L2 Deposited ERC20 is an ERC20 implementation which represents L1 assets deposited into L2.\n * This contract mints new tokens when it hears about deposits into the L1 ERC20 gateway.\n * This contract also burns the tokens intended for withdrawal, informing the L1 gateway to release L1 funds.\n *\n * NOTE: This contract implements the Abs_L2DepositedToken contract using Uniswap's ERC20 as the implementation.\n * Alternative implementations can be used in this similar manner.\n *\n * Compiler used: optimistic-solc\n * Runtime target: OVM\n */\ncontract OVM_L2DepositedERC20 is Abs_L2DepositedToken, UniswapV2ERC20 {\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _l2CrossDomainMessenger Cross-domain messenger used by this contract.\n * @param _name ERC20 name\n * @param _symbol ERC20 symbol\n */\n constructor(\n address _l2CrossDomainMessenger,\n string memory _name,\n string memory _symbol\n )\n Abs_L2DepositedToken(_l2CrossDomainMessenger)\n UniswapV2ERC20(_name, _symbol)\n {}\n\n // When a withdrawal is initiated, we burn the withdrawer's funds to prevent subsequent L2 usage.\n function _handleInitiateWithdrawal(\n address, // _to,\n uint _amount\n )\n internal\n override\n {\n _burn(msg.sender, _amount);\n }\n\n // When a deposit is finalized, we credit the account on L2 with the same amount of tokens.\n function _handleFinalizeDeposit(\n address _to,\n uint _amount\n )\n internal\n override\n {\n _mint(_to, _amount);\n }\n}\n" + }, + "contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* External Imports */\nimport { Ownable } from \"@openzeppelin/contracts/access/Ownable.sol\";\n\n/**\n * @title Lib_AddressManager\n */\ncontract Lib_AddressManager is Ownable {\n\n /**********\n * Events *\n **********/\n\n event AddressSet(\n string _name,\n address _newAddress\n );\n\n\n /*************\n * Variables *\n *************/\n\n mapping (bytes32 => address) private addresses;\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Changes the address associated with a particular name.\n * @param _name String name to associate an address with.\n * @param _address Address to associate with the name.\n */\n function setAddress(\n string memory _name,\n address _address\n )\n public\n onlyOwner\n {\n addresses[_getNameHash(_name)] = _address;\n\n emit AddressSet(\n _name,\n _address\n );\n }\n\n /**\n * Retrieves the address associated with a given name.\n * @param _name Name to retrieve an address for.\n * @return Address associated with the given name.\n */\n function getAddress(\n string memory _name\n )\n public\n view\n returns (\n address\n )\n {\n return addresses[_getNameHash(_name)];\n }\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Computes the hash of a name.\n * @param _name Name to compute a hash for.\n * @return Hash of the given name.\n */\n function _getNameHash(\n string memory _name\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n return keccak256(abi.encodePacked(_name));\n }\n}\n" + }, + "@openzeppelin/contracts/access/Ownable.sol": { + "content": "// SPDX-License-Identifier: MIT\n\npragma solidity >=0.6.0 <0.8.0;\n\nimport \"../utils/Context.sol\";\n/**\n * @dev Contract module which provides a basic access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * By default, the owner account will be the one that deploys the contract. This\n * can later be changed with {transferOwnership}.\n *\n * This module is used through inheritance. It will make available the modifier\n * `onlyOwner`, which can be applied to your functions to restrict their use to\n * the owner.\n */\nabstract contract Ownable is Context {\n address private _owner;\n\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n /**\n * @dev Initializes the contract setting the deployer as the initial owner.\n */\n constructor () internal {\n address msgSender = _msgSender();\n _owner = msgSender;\n emit OwnershipTransferred(address(0), msgSender);\n }\n\n /**\n * @dev Returns the address of the current owner.\n */\n function owner() public view virtual returns (address) {\n return _owner;\n }\n\n /**\n * @dev Throws if called by any account other than the owner.\n */\n modifier onlyOwner() {\n require(owner() == _msgSender(), \"Ownable: caller is not the owner\");\n _;\n }\n\n /**\n * @dev Leaves the contract without owner. It will not be possible to call\n * `onlyOwner` functions anymore. Can only be called by the current owner.\n *\n * NOTE: Renouncing ownership will leave the contract without an owner,\n * thereby removing any functionality that is only available to the owner.\n */\n function renounceOwnership() public virtual onlyOwner {\n emit OwnershipTransferred(_owner, address(0));\n _owner = address(0);\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Can only be called by the current owner.\n */\n function transferOwnership(address newOwner) public virtual onlyOwner {\n require(newOwner != address(0), \"Ownable: new owner is the zero address\");\n emit OwnershipTransferred(_owner, newOwner);\n _owner = newOwner;\n }\n}\n" + }, + "@openzeppelin/contracts/utils/Context.sol": { + "content": "// SPDX-License-Identifier: MIT\n\npragma solidity >=0.6.0 <0.8.0;\n\n/*\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with GSN meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract Context {\n function _msgSender() internal view virtual returns (address payable) {\n return msg.sender;\n }\n\n function _msgData() internal view virtual returns (bytes memory) {\n this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\n return msg.data;\n }\n}\n" + }, + "contracts/optimistic-ethereum/libraries/standards/UniswapV2ERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.5.16 <0.8.0;\n\nimport './IUniswapV2ERC20.sol';\nimport './UniSafeMath.sol';\n\ncontract UniswapV2ERC20 is IUniswapV2ERC20 {\n using UniSafeMath for uint;\n\n string public override name;\n string public override symbol;\n uint8 public constant override decimals = 18;\n uint public override totalSupply;\n mapping(address => uint) public override balanceOf;\n mapping(address => mapping(address => uint)) public override allowance;\n\n bytes32 public override DOMAIN_SEPARATOR;\n // keccak256(\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\");\n bytes32 public constant override PERMIT_TYPEHASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9;\n mapping(address => uint) public override nonces;\n\n constructor(\n string memory _name,\n string memory _symbol\n ) {\n name = _name;\n symbol = _symbol;\n\n uint chainId;\n assembly {\n chainId := chainid()\n }\n DOMAIN_SEPARATOR = keccak256(\n abi.encode(\n keccak256('EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)'),\n keccak256(bytes(name)),\n keccak256(bytes('1')),\n chainId,\n address(this)\n )\n );\n }\n\n function _mint(address to, uint value) internal {\n totalSupply = totalSupply.add(value);\n balanceOf[to] = balanceOf[to].add(value);\n emit Transfer(address(0), to, value);\n }\n\n function _burn(address from, uint value) internal {\n balanceOf[from] = balanceOf[from].sub(value);\n totalSupply = totalSupply.sub(value);\n emit Transfer(from, address(0), value);\n }\n\n function _approve(address owner, address spender, uint value) private {\n allowance[owner][spender] = value;\n emit Approval(owner, spender, value);\n }\n\n function _transfer(address from, address to, uint value) private {\n balanceOf[from] = balanceOf[from].sub(value);\n balanceOf[to] = balanceOf[to].add(value);\n emit Transfer(from, to, value);\n }\n\n function approve(address spender, uint value) external override returns (bool) {\n _approve(msg.sender, spender, value);\n return true;\n }\n\n function transfer(address to, uint value) external override returns (bool) {\n _transfer(msg.sender, to, value);\n return true;\n }\n\n function transferFrom(address from, address to, uint value) external override returns (bool) {\n if (allowance[from][msg.sender] != uint(-1)) {\n allowance[from][msg.sender] = allowance[from][msg.sender].sub(value);\n }\n _transfer(from, to, value);\n return true;\n }\n\n function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external override {\n require(deadline >= block.timestamp, 'UniswapV2: EXPIRED');\n bytes32 digest = keccak256(\n abi.encodePacked(\n '\\x19\\x01',\n DOMAIN_SEPARATOR,\n keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, value, nonces[owner]++, deadline))\n )\n );\n address recoveredAddress = ecrecover(digest, v, r, s);\n require(recoveredAddress != address(0) && recoveredAddress == owner, 'UniswapV2: INVALID_SIGNATURE');\n _approve(owner, spender, value);\n }\n}\n" + }, + "contracts/optimistic-ethereum/OVM/bridge/tokens/Abs_L2DepositedToken.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Interface Imports */\nimport { iOVM_L2DepositedToken } from \"../../../iOVM/bridge/tokens/iOVM_L2DepositedToken.sol\";\nimport { iOVM_L1TokenGateway } from \"../../../iOVM/bridge/tokens/iOVM_L1TokenGateway.sol\";\n\n/* Library Imports */\nimport { OVM_CrossDomainEnabled } from \"../../../libraries/bridge/OVM_CrossDomainEnabled.sol\";\n\n/**\n * @title Abs_L2DepositedToken\n * @dev An L2 Deposited Token is an L2 representation of funds which were deposited from L1.\n * Usually contract mints new tokens when it hears about deposits into the L1 ERC20 gateway.\n * This contract also burns the tokens intended for withdrawal, informing the L1 gateway to release L1 funds.\n *\n * NOTE: This abstract contract gives all the core functionality of a deposited token implementation except for the\n * token's internal accounting itself. This gives developers an easy way to implement children with their own token code.\n *\n * Compiler used: optimistic-solc\n * Runtime target: OVM\n */\nabstract contract Abs_L2DepositedToken is iOVM_L2DepositedToken, OVM_CrossDomainEnabled {\n\n /*******************\n * Contract Events *\n *******************/\n\n event Initialized(iOVM_L1TokenGateway _l1TokenGateway);\n\n /********************************\n * External Contract References *\n ********************************/\n\n iOVM_L1TokenGateway public l1TokenGateway;\n\n /********************************\n * Constructor & Initialization *\n ********************************/\n\n /**\n * @param _l2CrossDomainMessenger L1 Messenger address being used for cross-chain communications.\n */\n constructor(\n address _l2CrossDomainMessenger\n )\n OVM_CrossDomainEnabled(_l2CrossDomainMessenger)\n {}\n\n /**\n * @dev Initialize this contract with the L1 token gateway address.\n * The flow: 1) this contract gets deployed on L2, 2) the L1\n * gateway is deployed with addr from (1), 3) L1 gateway address passed here.\n *\n * @param _l1TokenGateway Address of the corresponding L1 gateway deployed to the main chain\n */\n function init(\n iOVM_L1TokenGateway _l1TokenGateway\n )\n public\n {\n require(address(l1TokenGateway) == address(0), \"Contract has already been initialized\");\n\n l1TokenGateway = _l1TokenGateway;\n\n emit Initialized(l1TokenGateway);\n }\n\n /**********************\n * Function Modifiers *\n **********************/\n\n modifier onlyInitialized() {\n require(address(l1TokenGateway) != address(0), \"Contract has not yet been initialized\");\n _;\n }\n\n /********************************\n * Overridable Accounting logic *\n ********************************/\n\n // Default gas value which can be overridden if more complex logic runs on L1.\n uint32 internal constant DEFAULT_FINALIZE_WITHDRAWAL_L1_GAS = 100000;\n\n /**\n * @dev Core logic to be performed when a withdrawal from L2 is initialized.\n * In most cases, this will simply burn the withdrawn L2 funds.\n *\n * param _to Address being withdrawn to\n * param _amount Amount being withdrawn\n */\n function _handleInitiateWithdrawal(\n address, // _to,\n uint // _amount\n )\n internal\n virtual\n {\n revert(\"Accounting must be implemented by child contract.\");\n }\n\n /**\n * @dev Core logic to be performed when a deposit from L2 is finalized on L2.\n * In most cases, this will simply _mint() to credit L2 funds to the recipient.\n *\n * param _to Address being deposited to on L2\n * param _amount Amount which was deposited on L1\n */\n function _handleFinalizeDeposit(\n address, // _to\n uint // _amount\n )\n internal\n virtual\n {\n revert(\"Accounting must be implemented by child contract.\");\n }\n\n /**\n * @dev Overridable getter for the *L1* gas limit of settling the withdrawal, in the case it may be\n * dynamic, and the above public constant does not suffice.\n */\n function getFinalizeWithdrawalL1Gas()\n public\n view\n virtual\n returns(\n uint32\n )\n {\n return DEFAULT_FINALIZE_WITHDRAWAL_L1_GAS;\n }\n\n\n /***************\n * Withdrawing *\n ***************/\n\n /**\n * @dev initiate a withdraw of some tokens to the caller's account on L1\n * @param _amount Amount of the token to withdraw\n */\n function withdraw(\n uint _amount\n )\n external\n override\n virtual\n onlyInitialized()\n {\n _initiateWithdrawal(msg.sender, _amount);\n }\n\n /**\n * @dev initiate a withdraw of some token to a recipient's account on L1\n * @param _to L1 adress to credit the withdrawal to\n * @param _amount Amount of the token to withdraw\n */\n function withdrawTo(\n address _to,\n uint _amount\n )\n external\n override\n virtual\n onlyInitialized()\n {\n _initiateWithdrawal(_to, _amount);\n }\n\n /**\n * @dev Performs the logic for deposits by storing the token and informing the L2 token Gateway of the deposit.\n *\n * @param _to Account to give the withdrawal to on L1\n * @param _amount Amount of the token to withdraw\n */\n function _initiateWithdrawal(\n address _to,\n uint _amount\n )\n internal\n {\n // Call our withdrawal accounting handler implemented by child contracts (usually a _burn)\n _handleInitiateWithdrawal(_to, _amount);\n\n // Construct calldata for l1TokenGateway.finalizeWithdrawal(_to, _amount)\n bytes memory data = abi.encodeWithSelector(\n iOVM_L1TokenGateway.finalizeWithdrawal.selector,\n _to,\n _amount\n );\n\n // Send message up to L1 gateway\n sendCrossDomainMessage(\n address(l1TokenGateway),\n data,\n getFinalizeWithdrawalL1Gas()\n );\n\n emit WithdrawalInitiated(msg.sender, _to, _amount);\n }\n\n /************************************\n * Cross-chain Function: Depositing *\n ************************************/\n\n /**\n * @dev Complete a deposit from L1 to L2, and credits funds to the recipient's balance of this\n * L2 token.\n * This call will fail if it did not originate from a corresponding deposit in OVM_l1TokenGateway.\n *\n * @param _to Address to receive the withdrawal at\n * @param _amount Amount of the token to withdraw\n */\n function finalizeDeposit(\n address _to,\n uint _amount\n )\n external\n override\n virtual\n onlyInitialized()\n onlyFromCrossDomainAccount(address(l1TokenGateway))\n {\n _handleFinalizeDeposit(_to, _amount);\n emit DepositFinalized(_to, _amount);\n }\n}\n" + }, + "contracts/optimistic-ethereum/libraries/standards/IUniswapV2ERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.5.16 <0.8.0;\n\ninterface IUniswapV2ERC20 {\n event Approval(address indexed owner, address indexed spender, uint value);\n event Transfer(address indexed from, address indexed to, uint value);\n\n function name() external view returns (string memory);\n function symbol() external view returns (string memory);\n function decimals() external view returns (uint8);\n function totalSupply() external view returns (uint);\n function balanceOf(address owner) external view returns (uint);\n function allowance(address owner, address spender) external view returns (uint);\n\n function approve(address spender, uint value) external returns (bool);\n function transfer(address to, uint value) external returns (bool);\n function transferFrom(address from, address to, uint value) external returns (bool);\n\n function DOMAIN_SEPARATOR() external view returns (bytes32);\n function PERMIT_TYPEHASH() external pure returns (bytes32);\n function nonces(address owner) external view returns (uint);\n\n function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;\n}\n" + }, + "contracts/optimistic-ethereum/libraries/standards/UniSafeMath.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.5.16 <0.8.0;\n\n// a library for performing overflow-safe math, courtesy of DappHub (https://github.com/dapphub/ds-math)\n\nlibrary UniSafeMath {\n function add(uint x, uint y) internal pure returns (uint z) {\n require((z = x + y) >= x, 'ds-math-add-overflow');\n }\n\n function sub(uint x, uint y) internal pure returns (uint z) {\n require((z = x - y) <= x, 'ds-math-sub-underflow');\n }\n\n function mul(uint x, uint y) internal pure returns (uint z) {\n require(y == 0 || (z = x * y) / y == x, 'ds-math-mul-overflow');\n }\n}\n" + }, + "contracts/optimistic-ethereum/iOVM/bridge/tokens/iOVM_L2DepositedToken.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0;\npragma experimental ABIEncoderV2;\n\n/**\n * @title iOVM_L2DepositedToken\n */\ninterface iOVM_L2DepositedToken {\n\n /**********\n * Events *\n **********/\n\n event WithdrawalInitiated(\n address indexed _from,\n address _to,\n uint256 _amount\n );\n\n event DepositFinalized(\n address indexed _to,\n uint256 _amount\n );\n\n\n /********************\n * Public Functions *\n ********************/\n\n function withdraw(\n uint _amount\n )\n external;\n\n function withdrawTo(\n address _to,\n uint _amount\n )\n external;\n\n\n /*************************\n * Cross-chain Functions *\n *************************/\n\n function finalizeDeposit(\n address _to,\n uint _amount\n )\n external;\n}\n" + }, + "contracts/optimistic-ethereum/libraries/bridge/OVM_CrossDomainEnabled.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Interface Imports */\nimport { iAbs_BaseCrossDomainMessenger } from \"../../iOVM/bridge/messaging/iAbs_BaseCrossDomainMessenger.sol\";\n\n/**\n * @title OVM_CrossDomainEnabled\n * @dev Helper contract for contracts performing cross-domain communications\n *\n * Compiler used: defined by inheriting contract\n * Runtime target: defined by inheriting contract\n */\ncontract OVM_CrossDomainEnabled {\n\n /*************\n * Variables *\n *************/\n\n // Messenger contract used to send and recieve messages from the other domain.\n address public messenger;\n\n\n /***************\n * Constructor *\n ***************/ \n\n /**\n * @param _messenger Address of the CrossDomainMessenger on the current layer.\n */\n constructor(\n address _messenger\n ) {\n messenger = _messenger;\n }\n\n\n /**********************\n * Function Modifiers *\n **********************/\n\n /**\n * Enforces that the modified function is only callable by a specific cross-domain account.\n * @param _sourceDomainAccount The only account on the originating domain which is\n * authenticated to call this function.\n */\n modifier onlyFromCrossDomainAccount(\n address _sourceDomainAccount\n ) {\n require(\n msg.sender == address(getCrossDomainMessenger()),\n \"OVM_XCHAIN: messenger contract unauthenticated\"\n );\n\n require(\n getCrossDomainMessenger().xDomainMessageSender() == _sourceDomainAccount,\n \"OVM_XCHAIN: wrong sender of cross-domain message\"\n );\n\n _;\n }\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Gets the messenger, usually from storage. This function is exposed in case a child contract\n * needs to override.\n * @return The address of the cross-domain messenger contract which should be used. \n */\n function getCrossDomainMessenger()\n internal\n virtual\n returns (\n iAbs_BaseCrossDomainMessenger\n )\n {\n return iAbs_BaseCrossDomainMessenger(messenger);\n }\n\n /**\n * Sends a message to an account on another domain\n * @param _crossDomainTarget The intended recipient on the destination domain\n * @param _data The data to send to the target (usually calldata to a function with\n * `onlyFromCrossDomainAccount()`)\n * @param _gasLimit The gasLimit for the receipt of the message on the target domain.\n */\n function sendCrossDomainMessage(\n address _crossDomainTarget,\n bytes memory _data,\n uint32 _gasLimit\n )\n internal\n {\n getCrossDomainMessenger().sendMessage(_crossDomainTarget, _data, _gasLimit);\n }\n}\n" + }, + "contracts/optimistic-ethereum/iOVM/bridge/messaging/iAbs_BaseCrossDomainMessenger.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/**\n * @title iAbs_BaseCrossDomainMessenger\n */\ninterface iAbs_BaseCrossDomainMessenger {\n\n /**********\n * Events *\n **********/\n\n event SentMessage(bytes message);\n event RelayedMessage(bytes32 msgHash);\n event FailedRelayedMessage(bytes32 msgHash);\n\n\n /*************\n * Variables *\n *************/\n\n function xDomainMessageSender() external view returns (address);\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Sends a cross domain message to the target messenger.\n * @param _target Target contract address.\n * @param _message Message to send to the target.\n * @param _gasLimit Gas limit for the provided message.\n */\n function sendMessage(\n address _target,\n bytes calldata _message,\n uint32 _gasLimit\n ) external;\n}\n" + }, + "contracts/optimistic-ethereum/OVM/chain/OVM_StateCommitmentChain.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\nimport { Lib_MerkleTree } from \"../../libraries/utils/Lib_MerkleTree.sol\";\n\n/* Interface Imports */\nimport { iOVM_FraudVerifier } from \"../../iOVM/verification/iOVM_FraudVerifier.sol\";\nimport { iOVM_StateCommitmentChain } from \"../../iOVM/chain/iOVM_StateCommitmentChain.sol\";\nimport { iOVM_CanonicalTransactionChain } from \"../../iOVM/chain/iOVM_CanonicalTransactionChain.sol\";\nimport { iOVM_BondManager } from \"../../iOVM/verification/iOVM_BondManager.sol\";\nimport { iOVM_ChainStorageContainer } from \"../../iOVM/chain/iOVM_ChainStorageContainer.sol\";\n\n/* External Imports */\nimport '@openzeppelin/contracts/math/SafeMath.sol';\n\n/**\n * @title OVM_StateCommitmentChain\n * @dev The State Commitment Chain (SCC) contract contains a list of proposed state roots which\n * Proposers assert to be a result of each transaction in the Canonical Transaction Chain (CTC).\n * Elements here have a 1:1 correspondence with transactions in the CTC, and should be the unique\n * state root calculated off-chain by applying the canonical transactions one by one.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract OVM_StateCommitmentChain is iOVM_StateCommitmentChain, Lib_AddressResolver {\n\n /*************\n * Constants *\n *************/\n\n uint256 public FRAUD_PROOF_WINDOW;\n uint256 public SEQUENCER_PUBLISH_WINDOW;\n\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n constructor(\n address _libAddressManager,\n uint256 _fraudProofWindow,\n uint256 _sequencerPublishWindow\n )\n Lib_AddressResolver(_libAddressManager)\n {\n FRAUD_PROOF_WINDOW = _fraudProofWindow;\n SEQUENCER_PUBLISH_WINDOW = _sequencerPublishWindow;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Accesses the batch storage container.\n * @return Reference to the batch storage container.\n */\n function batches()\n public\n view\n returns (\n iOVM_ChainStorageContainer\n )\n {\n return iOVM_ChainStorageContainer(\n resolve(\"OVM_ChainStorageContainer:SCC:batches\")\n );\n }\n\n /**\n * @inheritdoc iOVM_StateCommitmentChain\n */\n function getTotalElements()\n override\n public\n view\n returns (\n uint256 _totalElements\n )\n {\n (uint40 totalElements, ) = _getBatchExtraData();\n return uint256(totalElements);\n }\n\n /**\n * @inheritdoc iOVM_StateCommitmentChain\n */\n function getTotalBatches()\n override\n public\n view\n returns (\n uint256 _totalBatches\n )\n {\n return batches().length();\n }\n\n /**\n * @inheritdoc iOVM_StateCommitmentChain\n */\n function getLastSequencerTimestamp()\n override\n public\n view\n returns (\n uint256 _lastSequencerTimestamp\n )\n {\n (, uint40 lastSequencerTimestamp) = _getBatchExtraData();\n return uint256(lastSequencerTimestamp);\n }\n\n /**\n * @inheritdoc iOVM_StateCommitmentChain\n */\n function appendStateBatch(\n bytes32[] memory _batch,\n uint256 _shouldStartAtElement\n )\n override\n public\n {\n // Fail fast in to make sure our batch roots aren't accidentally made fraudulent by the\n // publication of batches by some other user.\n require(\n _shouldStartAtElement == getTotalElements(),\n \"Actual batch start index does not match expected start index.\"\n );\n\n // Proposers must have previously staked at the BondManager\n require(\n iOVM_BondManager(resolve(\"OVM_BondManager\")).isCollateralized(msg.sender),\n \"Proposer does not have enough collateral posted\"\n );\n\n require(\n _batch.length > 0,\n \"Cannot submit an empty state batch.\"\n );\n\n require(\n getTotalElements() + _batch.length <= iOVM_CanonicalTransactionChain(resolve(\"OVM_CanonicalTransactionChain\")).getTotalElements(),\n \"Number of state roots cannot exceed the number of canonical transactions.\"\n );\n\n // Pass the block's timestamp and the publisher of the data\n // to be used in the fraud proofs\n _appendBatch(\n _batch,\n abi.encode(block.timestamp, msg.sender)\n );\n }\n\n /**\n * @inheritdoc iOVM_StateCommitmentChain\n */\n function deleteStateBatch(\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\n )\n override\n public\n {\n require(\n msg.sender == resolve(\"OVM_FraudVerifier\"),\n \"State batches can only be deleted by the OVM_FraudVerifier.\"\n );\n\n require(\n _isValidBatchHeader(_batchHeader),\n \"Invalid batch header.\"\n );\n\n require(\n insideFraudProofWindow(_batchHeader),\n \"State batches can only be deleted within the fraud proof window.\"\n );\n\n _deleteBatch(_batchHeader);\n }\n\n /**\n * @inheritdoc iOVM_StateCommitmentChain\n */\n function verifyStateCommitment(\n bytes32 _element,\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _proof\n )\n override\n public\n view\n returns (\n bool\n )\n {\n require(\n _isValidBatchHeader(_batchHeader),\n \"Invalid batch header.\"\n );\n\n require(\n Lib_MerkleTree.verify(\n _batchHeader.batchRoot,\n _element,\n _proof.index,\n _proof.siblings,\n _batchHeader.batchSize\n ),\n \"Invalid inclusion proof.\"\n );\n\n return true;\n }\n\n /**\n * @inheritdoc iOVM_StateCommitmentChain\n */\n function insideFraudProofWindow(\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\n )\n override\n public\n view\n returns (\n bool _inside\n )\n {\n (uint256 timestamp,) = abi.decode(\n _batchHeader.extraData,\n (uint256, address)\n );\n\n require(\n timestamp != 0,\n \"Batch header timestamp cannot be zero\"\n );\n return SafeMath.add(timestamp, FRAUD_PROOF_WINDOW) > block.timestamp;\n }\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Parses the batch context from the extra data.\n * @return Total number of elements submitted.\n * @return Timestamp of the last batch submitted by the sequencer.\n */\n function _getBatchExtraData()\n internal\n view\n returns (\n uint40,\n uint40\n )\n {\n bytes27 extraData = batches().getGlobalMetadata();\n\n uint40 totalElements;\n uint40 lastSequencerTimestamp;\n assembly {\n extraData := shr(40, extraData)\n totalElements := and(extraData, 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF)\n lastSequencerTimestamp := shr(40, and(extraData, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000))\n }\n\n return (\n totalElements,\n lastSequencerTimestamp\n );\n }\n\n /**\n * Encodes the batch context for the extra data.\n * @param _totalElements Total number of elements submitted.\n * @param _lastSequencerTimestamp Timestamp of the last batch submitted by the sequencer.\n * @return Encoded batch context.\n */\n function _makeBatchExtraData(\n uint40 _totalElements,\n uint40 _lastSequencerTimestamp\n )\n internal\n pure\n returns (\n bytes27\n )\n {\n bytes27 extraData;\n assembly {\n extraData := _totalElements\n extraData := or(extraData, shl(40, _lastSequencerTimestamp))\n extraData := shl(40, extraData)\n }\n\n return extraData;\n }\n\n /**\n * Appends a batch to the chain.\n * @param _batch Elements within the batch.\n * @param _extraData Any extra data to append to the batch.\n */\n function _appendBatch(\n bytes32[] memory _batch,\n bytes memory _extraData\n )\n internal\n {\n address sequencer = resolve(\"OVM_Proposer\");\n (uint40 totalElements, uint40 lastSequencerTimestamp) = _getBatchExtraData();\n\n if (msg.sender == sequencer) {\n lastSequencerTimestamp = uint40(block.timestamp);\n } else {\n // We keep track of the last batch submitted by the sequencer so there's a window in\n // which only the sequencer can publish state roots. A window like this just reduces\n // the chance of \"system breaking\" state roots being published while we're still in\n // testing mode. This window should be removed or significantly reduced in the future.\n require(\n lastSequencerTimestamp + SEQUENCER_PUBLISH_WINDOW < block.timestamp,\n \"Cannot publish state roots within the sequencer publication window.\"\n );\n }\n\n // For efficiency reasons getMerkleRoot modifies the `_batch` argument in place\n // while calculating the root hash therefore any arguments passed to it must not\n // be used again afterwards\n Lib_OVMCodec.ChainBatchHeader memory batchHeader = Lib_OVMCodec.ChainBatchHeader({\n batchIndex: getTotalBatches(),\n batchRoot: Lib_MerkleTree.getMerkleRoot(_batch),\n batchSize: _batch.length,\n prevTotalElements: totalElements,\n extraData: _extraData\n });\n\n emit StateBatchAppended(\n batchHeader.batchIndex,\n batchHeader.batchRoot,\n batchHeader.batchSize,\n batchHeader.prevTotalElements,\n batchHeader.extraData\n );\n\n batches().push(\n Lib_OVMCodec.hashBatchHeader(batchHeader),\n _makeBatchExtraData(\n uint40(batchHeader.prevTotalElements + batchHeader.batchSize),\n lastSequencerTimestamp\n )\n );\n }\n\n /**\n * Removes a batch and all subsequent batches from the chain.\n * @param _batchHeader Header of the batch to remove.\n */\n function _deleteBatch(\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\n )\n internal\n {\n require(\n _batchHeader.batchIndex < batches().length(),\n \"Invalid batch index.\"\n );\n\n require(\n _isValidBatchHeader(_batchHeader),\n \"Invalid batch header.\"\n );\n\n batches().deleteElementsAfterInclusive(\n _batchHeader.batchIndex,\n _makeBatchExtraData(\n uint40(_batchHeader.prevTotalElements),\n 0\n )\n );\n\n emit StateBatchDeleted(\n _batchHeader.batchIndex,\n _batchHeader.batchRoot\n );\n }\n\n /**\n * Checks that a batch header matches the stored hash for the given index.\n * @param _batchHeader Batch header to validate.\n * @return Whether or not the header matches the stored one.\n */\n function _isValidBatchHeader(\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\n )\n internal\n view\n returns (\n bool\n )\n {\n return Lib_OVMCodec.hashBatchHeader(_batchHeader) == batches().get(_batchHeader.batchIndex);\n }\n}\n" + }, + "contracts/optimistic-ethereum/libraries/utils/Lib_MerkleTree.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/**\n * @title Lib_MerkleTree\n * @author River Keefer\n */\nlibrary Lib_MerkleTree {\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Calculates a merkle root for a list of 32-byte leaf hashes. WARNING: If the number\n * of leaves passed in is not a power of two, it pads out the tree with zero hashes.\n * If you do not know the original length of elements for the tree you are verifying,\n * then this may allow empty leaves past _elements.length to pass a verification check down the line.\n * Note that the _elements argument is modified, therefore it must not be used again afterwards\n * @param _elements Array of hashes from which to generate a merkle root.\n * @return Merkle root of the leaves, with zero hashes for non-powers-of-two (see above).\n */\n function getMerkleRoot(\n bytes32[] memory _elements\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n require(\n _elements.length > 0,\n \"Lib_MerkleTree: Must provide at least one leaf hash.\"\n );\n\n if (_elements.length == 1) {\n return _elements[0];\n }\n\n uint256[16] memory defaults = [\n 0x290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563,\n 0x633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d,\n 0x890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d,\n 0x3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd8,\n 0xecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da,\n 0xdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da5,\n 0x617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d7,\n 0x292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead,\n 0xe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e10,\n 0x7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f82,\n 0xe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e83636516,\n 0x3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c,\n 0xad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e,\n 0xa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab,\n 0x4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c862,\n 0x2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf10\n ];\n\n // Reserve memory space for our hashes.\n bytes memory buf = new bytes(64);\n\n // We'll need to keep track of left and right siblings.\n bytes32 leftSibling;\n bytes32 rightSibling;\n\n // Number of non-empty nodes at the current depth.\n uint256 rowSize = _elements.length;\n\n // Current depth, counting from 0 at the leaves\n uint256 depth = 0;\n\n // Common sub-expressions\n uint256 halfRowSize; // rowSize / 2\n bool rowSizeIsOdd; // rowSize % 2 == 1\n\n while (rowSize > 1) {\n halfRowSize = rowSize / 2;\n rowSizeIsOdd = rowSize % 2 == 1;\n\n for (uint256 i = 0; i < halfRowSize; i++) {\n leftSibling = _elements[(2 * i) ];\n rightSibling = _elements[(2 * i) + 1];\n assembly {\n mstore(add(buf, 32), leftSibling )\n mstore(add(buf, 64), rightSibling)\n }\n\n _elements[i] = keccak256(buf);\n }\n\n if (rowSizeIsOdd) {\n leftSibling = _elements[rowSize - 1];\n rightSibling = bytes32(defaults[depth]);\n assembly {\n mstore(add(buf, 32), leftSibling)\n mstore(add(buf, 64), rightSibling)\n }\n\n _elements[halfRowSize] = keccak256(buf);\n }\n\n rowSize = halfRowSize + (rowSizeIsOdd ? 1 : 0);\n depth++;\n }\n\n return _elements[0];\n }\n\n /**\n * Verifies a merkle branch for the given leaf hash. Assumes the original length\n * of leaves generated is a known, correct input, and does not return true for indices\n * extending past that index (even if _siblings would be otherwise valid.)\n * @param _root The Merkle root to verify against.\n * @param _leaf The leaf hash to verify inclusion of.\n * @param _index The index in the tree of this leaf.\n * @param _siblings Array of sibline nodes in the inclusion proof, starting from depth 0 (bottom of the tree).\n * @param _totalLeaves The total number of leaves originally passed into.\n * @return Whether or not the merkle branch and leaf passes verification.\n */\n function verify(\n bytes32 _root,\n bytes32 _leaf,\n uint256 _index,\n bytes32[] memory _siblings,\n uint256 _totalLeaves\n )\n internal\n pure\n returns (\n bool\n )\n {\n require(\n _totalLeaves > 0,\n \"Lib_MerkleTree: Total leaves must be greater than zero.\"\n );\n\n require(\n _index < _totalLeaves,\n \"Lib_MerkleTree: Index out of bounds.\"\n );\n\n require(\n _siblings.length == _ceilLog2(_totalLeaves),\n \"Lib_MerkleTree: Total siblings does not correctly correspond to total leaves.\"\n );\n\n bytes32 computedRoot = _leaf;\n\n for (uint256 i = 0; i < _siblings.length; i++) {\n if ((_index & 1) == 1) {\n computedRoot = keccak256(\n abi.encodePacked(\n _siblings[i],\n computedRoot\n )\n );\n } else {\n computedRoot = keccak256(\n abi.encodePacked(\n computedRoot,\n _siblings[i]\n )\n );\n }\n\n _index >>= 1;\n }\n\n return _root == computedRoot;\n }\n\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * Calculates the integer ceiling of the log base 2 of an input.\n * @param _in Unsigned input to calculate the log.\n * @return ceil(log_base_2(_in))\n */\n function _ceilLog2(\n uint256 _in\n )\n private\n pure\n returns (\n uint256\n )\n {\n require(\n _in > 0,\n \"Lib_MerkleTree: Cannot compute ceil(log_2) of 0.\"\n );\n\n if (_in == 1) {\n return 0;\n }\n\n // Find the highest set bit (will be floor(log_2)).\n // Borrowed with <3 from https://github.com/ethereum/solidity-examples\n uint256 val = _in;\n uint256 highest = 0;\n for (uint256 i = 128; i >= 1; i >>= 1) {\n if (val & (uint(1) << i) - 1 << i != 0) {\n highest += i;\n val >>= i;\n }\n }\n\n // Increment by one if this is not a perfect logarithm.\n if ((uint(1) << highest) != _in) {\n highest += 1;\n }\n\n return highest;\n }\n}\n" + }, + "contracts/optimistic-ethereum/iOVM/verification/iOVM_FraudVerifier.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/* Interface Imports */\nimport { iOVM_StateTransitioner } from \"./iOVM_StateTransitioner.sol\";\n\n/**\n * @title iOVM_FraudVerifier\n */\ninterface iOVM_FraudVerifier {\n\n /**********\n * Events *\n **********/\n\n event FraudProofInitialized(\n bytes32 _preStateRoot,\n uint256 _preStateRootIndex,\n bytes32 _transactionHash,\n address _who\n );\n\n event FraudProofFinalized(\n bytes32 _preStateRoot,\n uint256 _preStateRootIndex,\n bytes32 _transactionHash,\n address _who\n );\n\n\n /***************************************\n * Public Functions: Transition Status *\n ***************************************/\n\n function getStateTransitioner(bytes32 _preStateRoot, bytes32 _txHash) external view returns (iOVM_StateTransitioner _transitioner);\n\n\n /****************************************\n * Public Functions: Fraud Verification *\n ****************************************/\n\n function initializeFraudVerification(\n bytes32 _preStateRoot,\n Lib_OVMCodec.ChainBatchHeader calldata _preStateRootBatchHeader,\n Lib_OVMCodec.ChainInclusionProof calldata _preStateRootProof,\n Lib_OVMCodec.Transaction calldata _transaction,\n Lib_OVMCodec.TransactionChainElement calldata _txChainElement,\n Lib_OVMCodec.ChainBatchHeader calldata _transactionBatchHeader,\n Lib_OVMCodec.ChainInclusionProof calldata _transactionProof\n ) external;\n\n function finalizeFraudVerification(\n bytes32 _preStateRoot,\n Lib_OVMCodec.ChainBatchHeader calldata _preStateRootBatchHeader,\n Lib_OVMCodec.ChainInclusionProof calldata _preStateRootProof,\n bytes32 _txHash,\n bytes32 _postStateRoot,\n Lib_OVMCodec.ChainBatchHeader calldata _postStateRootBatchHeader,\n Lib_OVMCodec.ChainInclusionProof calldata _postStateRootProof\n ) external;\n}\n" + }, + "contracts/optimistic-ethereum/iOVM/chain/iOVM_StateCommitmentChain.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/**\n * @title iOVM_StateCommitmentChain\n */\ninterface iOVM_StateCommitmentChain {\n\n /**********\n * Events *\n **********/\n\n event StateBatchAppended(\n uint256 indexed _batchIndex,\n bytes32 _batchRoot,\n uint256 _batchSize,\n uint256 _prevTotalElements,\n bytes _extraData\n );\n\n event StateBatchDeleted(\n uint256 indexed _batchIndex,\n bytes32 _batchRoot\n );\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Retrieves the total number of elements submitted.\n * @return _totalElements Total submitted elements.\n */\n function getTotalElements()\n external\n view\n returns (\n uint256 _totalElements\n );\n\n /**\n * Retrieves the total number of batches submitted.\n * @return _totalBatches Total submitted batches.\n */\n function getTotalBatches()\n external\n view\n returns (\n uint256 _totalBatches\n );\n\n /**\n * Retrieves the timestamp of the last batch submitted by the sequencer.\n * @return _lastSequencerTimestamp Last sequencer batch timestamp.\n */\n function getLastSequencerTimestamp()\n external\n view\n returns (\n uint256 _lastSequencerTimestamp\n );\n\n /**\n * Appends a batch of state roots to the chain.\n * @param _batch Batch of state roots.\n * @param _shouldStartAtElement Index of the element at which this batch should start.\n */\n function appendStateBatch(\n bytes32[] calldata _batch,\n uint256 _shouldStartAtElement\n )\n external;\n\n /**\n * Deletes all state roots after (and including) a given batch.\n * @param _batchHeader Header of the batch to start deleting from.\n */\n function deleteStateBatch(\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\n )\n external;\n\n /**\n * Verifies a batch inclusion proof.\n * @param _element Hash of the element to verify a proof for.\n * @param _batchHeader Header of the batch in which the element was included.\n * @param _proof Merkle inclusion proof for the element.\n */\n function verifyStateCommitment(\n bytes32 _element,\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _proof\n )\n external\n view\n returns (\n bool _verified\n );\n\n /**\n * Checks whether a given batch is still inside its fraud proof window.\n * @param _batchHeader Header of the batch to check.\n * @return _inside Whether or not the batch is inside the fraud proof window.\n */\n function insideFraudProofWindow(\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\n )\n external\n view\n returns (\n bool _inside\n );\n}\n" + }, + "contracts/optimistic-ethereum/iOVM/chain/iOVM_CanonicalTransactionChain.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/* Interface Imports */\nimport { iOVM_ChainStorageContainer } from \"./iOVM_ChainStorageContainer.sol\";\n\n/**\n * @title iOVM_CanonicalTransactionChain\n */\ninterface iOVM_CanonicalTransactionChain {\n\n /**********\n * Events *\n **********/\n\n event TransactionEnqueued(\n address _l1TxOrigin,\n address _target,\n uint256 _gasLimit,\n bytes _data,\n uint256 _queueIndex,\n uint256 _timestamp\n );\n\n event QueueBatchAppended(\n uint256 _startingQueueIndex,\n uint256 _numQueueElements,\n uint256 _totalElements\n );\n\n event SequencerBatchAppended(\n uint256 _startingQueueIndex,\n uint256 _numQueueElements,\n uint256 _totalElements\n );\n\n event TransactionBatchAppended(\n uint256 indexed _batchIndex,\n bytes32 _batchRoot,\n uint256 _batchSize,\n uint256 _prevTotalElements,\n bytes _extraData\n );\n\n\n /***********\n * Structs *\n ***********/\n\n struct BatchContext {\n uint256 numSequencedTransactions;\n uint256 numSubsequentQueueTransactions;\n uint256 timestamp;\n uint256 blockNumber;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n\n /**\n * Accesses the batch storage container.\n * @return Reference to the batch storage container.\n */\n function batches()\n external\n view\n returns (\n iOVM_ChainStorageContainer\n );\n\n /**\n * Accesses the queue storage container.\n * @return Reference to the queue storage container.\n */\n function queue()\n external\n view\n returns (\n iOVM_ChainStorageContainer\n );\n\n /**\n * Retrieves the total number of elements submitted.\n * @return _totalElements Total submitted elements.\n */\n function getTotalElements()\n external\n view\n returns (\n uint256 _totalElements\n );\n\n /**\n * Retrieves the total number of batches submitted.\n * @return _totalBatches Total submitted batches.\n */\n function getTotalBatches()\n external\n view\n returns (\n uint256 _totalBatches\n );\n\n /**\n * Returns the index of the next element to be enqueued.\n * @return Index for the next queue element.\n */\n function getNextQueueIndex()\n external\n view\n returns (\n uint40\n );\n\n /**\n * Gets the queue element at a particular index.\n * @param _index Index of the queue element to access.\n * @return _element Queue element at the given index.\n */\n function getQueueElement(\n uint256 _index\n )\n external\n view\n returns (\n Lib_OVMCodec.QueueElement memory _element\n );\n\n /**\n * Returns the timestamp of the last transaction.\n * @return Timestamp for the last transaction.\n */\n function getLastTimestamp()\n external\n view\n returns (\n uint40\n );\n\n /**\n * Returns the blocknumber of the last transaction.\n * @return Blocknumber for the last transaction.\n */\n function getLastBlockNumber()\n external\n view\n returns (\n uint40\n );\n\n /**\n * Get the number of queue elements which have not yet been included.\n * @return Number of pending queue elements.\n */\n function getNumPendingQueueElements()\n external\n view\n returns (\n uint40\n );\n\n /**\n * Retrieves the length of the queue, including\n * both pending and canonical transactions.\n * @return Length of the queue.\n */\n function getQueueLength()\n external\n view\n returns (\n uint40\n );\n\n\n /**\n * Adds a transaction to the queue.\n * @param _target Target contract to send the transaction to.\n * @param _gasLimit Gas limit for the given transaction.\n * @param _data Transaction data.\n */\n function enqueue(\n address _target,\n uint256 _gasLimit,\n bytes memory _data\n )\n external;\n\n /**\n * Appends a given number of queued transactions as a single batch.\n * @param _numQueuedTransactions Number of transactions to append.\n */\n function appendQueueBatch(\n uint256 _numQueuedTransactions\n )\n external;\n\n /**\n * Allows the sequencer to append a batch of transactions.\n * @dev This function uses a custom encoding scheme for efficiency reasons.\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\n * .param _contexts Array of batch contexts.\n * .param _transactionDataFields Array of raw transaction data.\n */\n function appendSequencerBatch(\n // uint40 _shouldStartAtElement,\n // uint24 _totalElementsToAppend,\n // BatchContext[] _contexts,\n // bytes[] _transactionDataFields\n )\n external;\n\n /**\n * Verifies whether a transaction is included in the chain.\n * @param _transaction Transaction to verify.\n * @param _txChainElement Transaction chain element corresponding to the transaction.\n * @param _batchHeader Header of the batch the transaction was included in.\n * @param _inclusionProof Inclusion proof for the provided transaction chain element.\n * @return True if the transaction exists in the CTC, false if not.\n */\n function verifyTransaction(\n Lib_OVMCodec.Transaction memory _transaction,\n Lib_OVMCodec.TransactionChainElement memory _txChainElement,\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _inclusionProof\n )\n external\n view\n returns (\n bool\n );\n}\n" + }, + "contracts/optimistic-ethereum/iOVM/verification/iOVM_BondManager.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\ninterface ERC20 {\n function transfer(address, uint256) external returns (bool);\n function transferFrom(address, address, uint256) external returns (bool);\n}\n\n/// All the errors which may be encountered on the bond manager\nlibrary Errors {\n string constant ERC20_ERR = \"BondManager: Could not post bond\";\n string constant ALREADY_FINALIZED = \"BondManager: Fraud proof for this pre-state root has already been finalized\";\n string constant SLASHED = \"BondManager: Cannot finalize withdrawal, you probably got slashed\";\n string constant WRONG_STATE = \"BondManager: Wrong bond state for proposer\";\n string constant CANNOT_CLAIM = \"BondManager: Cannot claim yet. Dispute must be finalized first\";\n\n string constant WITHDRAWAL_PENDING = \"BondManager: Withdrawal already pending\";\n string constant TOO_EARLY = \"BondManager: Too early to finalize your withdrawal\";\n\n string constant ONLY_TRANSITIONER = \"BondManager: Only the transitioner for this pre-state root may call this function\";\n string constant ONLY_FRAUD_VERIFIER = \"BondManager: Only the fraud verifier may call this function\";\n string constant ONLY_STATE_COMMITMENT_CHAIN = \"BondManager: Only the state commitment chain may call this function\";\n string constant WAIT_FOR_DISPUTES = \"BondManager: Wait for other potential disputes\";\n}\n\n/**\n * @title iOVM_BondManager\n */\ninterface iOVM_BondManager {\n\n /*******************\n * Data Structures *\n *******************/\n\n /// The lifecycle of a proposer's bond\n enum State {\n // Before depositing or after getting slashed, a user is uncollateralized\n NOT_COLLATERALIZED,\n // After depositing, a user is collateralized\n COLLATERALIZED,\n // After a user has initiated a withdrawal\n WITHDRAWING\n }\n\n /// A bond posted by a proposer\n struct Bond {\n // The user's state\n State state;\n // The timestamp at which a proposer issued their withdrawal request\n uint32 withdrawalTimestamp;\n // The time when the first disputed was initiated for this bond\n uint256 firstDisputeAt;\n // The earliest observed state root for this bond which has had fraud\n bytes32 earliestDisputedStateRoot;\n // The state root's timestamp\n uint256 earliestTimestamp;\n }\n\n // Per pre-state root, store the number of state provisions that were made\n // and how many of these calls were made by each user. Payouts will then be\n // claimed by users proportionally for that dispute.\n struct Rewards {\n // Flag to check if rewards for a fraud proof are claimable\n bool canClaim;\n // Total number of `recordGasSpent` calls made\n uint256 total;\n // The gas spent by each user to provide witness data. The sum of all\n // values inside this map MUST be equal to the value of `total`\n mapping(address => uint256) gasSpent;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n function recordGasSpent(\n bytes32 _preStateRoot,\n bytes32 _txHash,\n address _who,\n uint256 _gasSpent\n ) external;\n\n function finalize(\n bytes32 _preStateRoot,\n address _publisher,\n uint256 _timestamp\n ) external;\n\n function deposit() external;\n\n function startWithdrawal() external;\n\n function finalizeWithdrawal() external;\n\n function claim(\n address _who\n ) external;\n\n function isCollateralized(\n address _who\n ) external view returns (bool);\n\n function getGasSpent(\n bytes32 _preStateRoot,\n address _who\n ) external view returns (uint256);\n}\n" + }, + "contracts/optimistic-ethereum/iOVM/chain/iOVM_ChainStorageContainer.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/**\n * @title iOVM_ChainStorageContainer\n */\ninterface iOVM_ChainStorageContainer {\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\n * 27 bytes to store arbitrary data.\n * @param _globalMetadata New global metadata to set.\n */\n function setGlobalMetadata(\n bytes27 _globalMetadata\n )\n external;\n\n /**\n * Retrieves the container's global metadata field.\n * @return Container global metadata field.\n */\n function getGlobalMetadata()\n external\n view\n returns (\n bytes27\n );\n\n /**\n * Retrieves the number of objects stored in the container.\n * @return Number of objects in the container.\n */\n function length()\n external\n view\n returns (\n uint256\n );\n\n /**\n * Pushes an object into the container.\n * @param _object A 32 byte value to insert into the container.\n */\n function push(\n bytes32 _object\n )\n external;\n\n /**\n * Pushes an object into the container. Function allows setting the global metadata since\n * we'll need to touch the \"length\" storage slot anyway, which also contains the global\n * metadata (it's an optimization).\n * @param _object A 32 byte value to insert into the container.\n * @param _globalMetadata New global metadata for the container.\n */\n function push(\n bytes32 _object,\n bytes27 _globalMetadata\n )\n external;\n\n /**\n * Retrieves an object from the container.\n * @param _index Index of the particular object to access.\n * @return 32 byte object value.\n */\n function get(\n uint256 _index\n )\n external\n view\n returns (\n bytes32\n );\n\n /**\n * Removes all objects after and including a given index.\n * @param _index Object index to delete from.\n */\n function deleteElementsAfterInclusive(\n uint256 _index\n )\n external;\n\n /**\n * Removes all objects after and including a given index. Also allows setting the global\n * metadata field.\n * @param _index Object index to delete from.\n * @param _globalMetadata New global metadata for the container.\n */\n function deleteElementsAfterInclusive(\n uint256 _index,\n bytes27 _globalMetadata\n )\n external;\n\n /**\n * Marks an index as overwritable, meaing the underlying buffer can start to write values over\n * any objects before and including the given index.\n */\n function setNextOverwritableIndex(\n uint256 _index\n )\n external;\n}\n" + }, + "contracts/optimistic-ethereum/iOVM/verification/iOVM_StateTransitioner.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/**\n * @title iOVM_StateTransitioner\n */\ninterface iOVM_StateTransitioner {\n\n /**********\n * Events *\n **********/\n\n event AccountCommitted(\n address _address\n );\n\n event ContractStorageCommitted(\n address _address,\n bytes32 _key\n );\n\n\n /**********************************\n * Public Functions: State Access *\n **********************************/\n\n function getPreStateRoot() external view returns (bytes32 _preStateRoot);\n function getPostStateRoot() external view returns (bytes32 _postStateRoot);\n function isComplete() external view returns (bool _complete);\n\n\n /***********************************\n * Public Functions: Pre-Execution *\n ***********************************/\n\n function proveContractState(\n address _ovmContractAddress,\n address _ethContractAddress,\n bytes calldata _stateTrieWitness\n ) external;\n\n function proveStorageSlot(\n address _ovmContractAddress,\n bytes32 _key,\n bytes calldata _storageTrieWitness\n ) external;\n\n\n /*******************************\n * Public Functions: Execution *\n *******************************/\n\n function applyTransaction(\n Lib_OVMCodec.Transaction calldata _transaction\n ) external;\n\n\n /************************************\n * Public Functions: Post-Execution *\n ************************************/\n\n function commitContractState(\n address _ovmContractAddress,\n bytes calldata _stateTrieWitness\n ) external;\n\n function commitStorageSlot(\n address _ovmContractAddress,\n bytes32 _key,\n bytes calldata _storageTrieWitness\n ) external;\n\n\n /**********************************\n * Public Functions: Finalization *\n **********************************/\n\n function completeTransition() external;\n}\n" + }, + "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Library Imports */\nimport { Lib_RingBuffer } from \"../../libraries/utils/Lib_RingBuffer.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/* Interface Imports */\nimport { iOVM_ChainStorageContainer } from \"../../iOVM/chain/iOVM_ChainStorageContainer.sol\";\n\n/**\n * @title OVM_ChainStorageContainer\n * @dev The Chain Storage Container provides its owner contract with read, write and delete functionality.\n * This provides gas efficiency gains by enabling it to overwrite storage slots which can no longer be used\n * in a fraud proof due to the fraud window having passed, and the associated chain state or\n * transactions being finalized.\n * Three distinct Chain Storage Containers will be deployed on Layer 1:\n * 1. Stores transaction batches for the Canonical Transaction Chain\n * 2. Stores queued transactions for the Canonical Transaction Chain\n * 3. Stores chain state batches for the State Commitment Chain\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract OVM_ChainStorageContainer is iOVM_ChainStorageContainer, Lib_AddressResolver {\n\n /*************\n * Libraries *\n *************/\n\n using Lib_RingBuffer for Lib_RingBuffer.RingBuffer;\n\n\n /*************\n * Variables *\n *************/\n\n string public owner;\n Lib_RingBuffer.RingBuffer internal buffer;\n\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n * @param _owner Name of the contract that owns this container (will be resolved later).\n */\n constructor(\n address _libAddressManager,\n string memory _owner\n )\n Lib_AddressResolver(_libAddressManager)\n {\n owner = _owner;\n }\n\n\n /**********************\n * Function Modifiers *\n **********************/\n\n modifier onlyOwner() {\n require(\n msg.sender == resolve(owner),\n \"OVM_ChainStorageContainer: Function can only be called by the owner.\"\n );\n _;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @inheritdoc iOVM_ChainStorageContainer\n */\n function setGlobalMetadata(\n bytes27 _globalMetadata\n )\n override\n public\n onlyOwner\n {\n return buffer.setExtraData(_globalMetadata);\n }\n\n /**\n * @inheritdoc iOVM_ChainStorageContainer\n */\n function getGlobalMetadata()\n override\n public\n view\n returns (\n bytes27\n )\n {\n return buffer.getExtraData();\n }\n\n /**\n * @inheritdoc iOVM_ChainStorageContainer\n */\n function length()\n override\n public\n view\n returns (\n uint256\n )\n {\n return uint256(buffer.getLength());\n }\n\n /**\n * @inheritdoc iOVM_ChainStorageContainer\n */\n function push(\n bytes32 _object\n )\n override\n public\n onlyOwner\n {\n buffer.push(_object);\n }\n\n /**\n * @inheritdoc iOVM_ChainStorageContainer\n */\n function push(\n bytes32 _object,\n bytes27 _globalMetadata\n )\n override\n public\n onlyOwner\n {\n buffer.push(_object, _globalMetadata);\n }\n\n /**\n * @inheritdoc iOVM_ChainStorageContainer\n */\n function get(\n uint256 _index\n )\n override\n public\n view\n returns (\n bytes32\n )\n {\n return buffer.get(uint40(_index));\n }\n\n /**\n * @inheritdoc iOVM_ChainStorageContainer\n */\n function deleteElementsAfterInclusive(\n uint256 _index\n )\n override\n public\n onlyOwner\n {\n buffer.deleteElementsAfterInclusive(\n uint40(_index)\n );\n }\n\n /**\n * @inheritdoc iOVM_ChainStorageContainer\n */\n function deleteElementsAfterInclusive(\n uint256 _index,\n bytes27 _globalMetadata\n )\n override\n public\n onlyOwner\n {\n buffer.deleteElementsAfterInclusive(\n uint40(_index),\n _globalMetadata\n );\n }\n\n /**\n * @inheritdoc iOVM_ChainStorageContainer\n */\n function setNextOverwritableIndex(\n uint256 _index\n )\n override\n public\n onlyOwner\n {\n buffer.nextOverwritableIndex = _index;\n }\n}\n" + }, + "contracts/optimistic-ethereum/libraries/utils/Lib_RingBuffer.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\nlibrary Lib_RingBuffer {\n using Lib_RingBuffer for RingBuffer;\n\n /***********\n * Structs *\n ***********/\n\n struct Buffer {\n uint256 length;\n mapping (uint256 => bytes32) buf;\n }\n\n struct RingBuffer {\n bytes32 contextA;\n bytes32 contextB;\n Buffer bufferA;\n Buffer bufferB;\n uint256 nextOverwritableIndex;\n }\n\n struct RingBufferContext {\n // contextA\n uint40 globalIndex;\n bytes27 extraData;\n\n // contextB\n uint64 currBufferIndex;\n uint40 prevResetIndex;\n uint40 currResetIndex;\n }\n\n\n /*************\n * Constants *\n *************/\n\n uint256 constant MIN_CAPACITY = 16;\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Pushes a single element to the buffer.\n * @param _self Buffer to access.\n * @param _value Value to push to the buffer.\n * @param _extraData Optional global extra data.\n */\n function push(\n RingBuffer storage _self,\n bytes32 _value,\n bytes27 _extraData\n )\n internal\n {\n RingBufferContext memory ctx = _self.getContext();\n Buffer storage currBuffer = _self.getBuffer(ctx.currBufferIndex);\n\n // Set a minimum capacity.\n if (currBuffer.length == 0) {\n currBuffer.length = MIN_CAPACITY;\n }\n\n // Check if we need to expand the buffer.\n if (ctx.globalIndex - ctx.currResetIndex >= currBuffer.length) {\n if (ctx.currResetIndex < _self.nextOverwritableIndex) {\n // We're going to overwrite the inactive buffer.\n // Bump the buffer index, reset the delete offset, and set our reset indices.\n ctx.currBufferIndex++;\n ctx.prevResetIndex = ctx.currResetIndex;\n ctx.currResetIndex = ctx.globalIndex;\n\n // Swap over to the next buffer.\n currBuffer = _self.getBuffer(ctx.currBufferIndex);\n } else {\n // We're not overwriting yet, double the length of the current buffer.\n currBuffer.length *= 2;\n }\n }\n\n // Index to write to is the difference of the global and reset indices.\n uint256 writeHead = ctx.globalIndex - ctx.currResetIndex;\n currBuffer.buf[writeHead] = _value;\n\n // Bump the global index and insert our extra data, then save the context.\n ctx.globalIndex++;\n ctx.extraData = _extraData;\n _self.setContext(ctx);\n }\n\n /**\n * Pushes a single element to the buffer.\n * @param _self Buffer to access.\n * @param _value Value to push to the buffer.\n */\n function push(\n RingBuffer storage _self,\n bytes32 _value\n )\n internal\n {\n RingBufferContext memory ctx = _self.getContext();\n\n _self.push(\n _value,\n ctx.extraData\n );\n }\n\n /**\n * Retrieves an element from the buffer.\n * @param _self Buffer to access.\n * @param _index Element index to retrieve.\n * @return Value of the element at the given index.\n */\n function get(\n RingBuffer storage _self,\n uint256 _index\n )\n internal\n view\n returns (\n bytes32\n )\n {\n RingBufferContext memory ctx = _self.getContext();\n\n require(\n _index < ctx.globalIndex,\n \"Index out of bounds.\"\n );\n\n Buffer storage currBuffer = _self.getBuffer(ctx.currBufferIndex);\n Buffer storage prevBuffer = _self.getBuffer(ctx.currBufferIndex + 1);\n\n if (_index >= ctx.currResetIndex) {\n // We're trying to load an element from the current buffer.\n // Relative index is just the difference from the reset index.\n uint256 relativeIndex = _index - ctx.currResetIndex;\n\n // Shouldn't happen but why not check.\n require(\n relativeIndex < currBuffer.length,\n \"Index out of bounds.\"\n );\n\n return currBuffer.buf[relativeIndex];\n } else {\n // We're trying to load an element from the previous buffer.\n // Relative index is the difference from the reset index in the other direction.\n uint256 relativeIndex = ctx.currResetIndex - _index;\n\n // Condition only fails in the case that we deleted and flipped buffers.\n require(\n ctx.currResetIndex > ctx.prevResetIndex,\n \"Index out of bounds.\"\n );\n\n // Make sure we're not trying to read beyond the array.\n require(\n relativeIndex <= prevBuffer.length,\n \"Index out of bounds.\"\n );\n\n return prevBuffer.buf[prevBuffer.length - relativeIndex];\n }\n }\n\n /**\n * Deletes all elements after (and including) a given index.\n * @param _self Buffer to access.\n * @param _index Index of the element to delete from (inclusive).\n * @param _extraData Optional global extra data.\n */\n function deleteElementsAfterInclusive(\n RingBuffer storage _self,\n uint40 _index,\n bytes27 _extraData\n )\n internal\n {\n RingBufferContext memory ctx = _self.getContext();\n\n require(\n _index < ctx.globalIndex && _index >= ctx.prevResetIndex,\n \"Index out of bounds.\"\n );\n\n if (_index < ctx.currResetIndex) {\n // We're switching back to the previous buffer.\n // Reduce the buffer index, set the current reset index back to match the previous one.\n // We use the equality of these two values to prevent reading beyond this buffer.\n ctx.currBufferIndex--;\n ctx.currResetIndex = ctx.prevResetIndex;\n }\n\n // Set our global index and extra data, save the context.\n ctx.globalIndex = _index;\n ctx.extraData = _extraData;\n _self.setContext(ctx);\n }\n\n /**\n * Deletes all elements after (and including) a given index.\n * @param _self Buffer to access.\n * @param _index Index of the element to delete from (inclusive).\n */\n function deleteElementsAfterInclusive(\n RingBuffer storage _self,\n uint40 _index\n )\n internal\n {\n RingBufferContext memory ctx = _self.getContext();\n _self.deleteElementsAfterInclusive(\n _index,\n ctx.extraData\n );\n }\n\n /**\n * Retrieves the current global index.\n * @param _self Buffer to access.\n * @return Current global index.\n */\n function getLength(\n RingBuffer storage _self\n )\n internal\n view\n returns (\n uint40\n )\n {\n RingBufferContext memory ctx = _self.getContext();\n return ctx.globalIndex;\n }\n\n /**\n * Changes current global extra data.\n * @param _self Buffer to access.\n * @param _extraData New global extra data.\n */\n function setExtraData(\n RingBuffer storage _self,\n bytes27 _extraData\n )\n internal\n {\n RingBufferContext memory ctx = _self.getContext();\n ctx.extraData = _extraData;\n _self.setContext(ctx);\n }\n\n /**\n * Retrieves the current global extra data.\n * @param _self Buffer to access.\n * @return Current global extra data.\n */\n function getExtraData(\n RingBuffer storage _self\n )\n internal\n view\n returns (\n bytes27\n )\n {\n RingBufferContext memory ctx = _self.getContext();\n return ctx.extraData;\n }\n\n /**\n * Sets the current ring buffer context.\n * @param _self Buffer to access.\n * @param _ctx Current ring buffer context.\n */\n function setContext(\n RingBuffer storage _self,\n RingBufferContext memory _ctx\n )\n internal\n {\n bytes32 contextA;\n bytes32 contextB;\n\n uint40 globalIndex = _ctx.globalIndex;\n bytes27 extraData = _ctx.extraData;\n assembly {\n contextA := globalIndex\n contextA := or(contextA, extraData)\n }\n\n uint64 currBufferIndex = _ctx.currBufferIndex;\n uint40 prevResetIndex = _ctx.prevResetIndex;\n uint40 currResetIndex = _ctx.currResetIndex;\n assembly {\n contextB := currBufferIndex\n contextB := or(contextB, shl(64, prevResetIndex))\n contextB := or(contextB, shl(104, currResetIndex))\n }\n\n if (_self.contextA != contextA) {\n _self.contextA = contextA;\n }\n\n if (_self.contextB != contextB) {\n _self.contextB = contextB;\n }\n }\n\n /**\n * Retrieves the current ring buffer context.\n * @param _self Buffer to access.\n * @return Current ring buffer context.\n */\n function getContext(\n RingBuffer storage _self\n )\n internal\n view\n returns (\n RingBufferContext memory\n )\n {\n bytes32 contextA = _self.contextA;\n bytes32 contextB = _self.contextB;\n\n uint40 globalIndex;\n bytes27 extraData;\n assembly {\n globalIndex := and(contextA, 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF)\n extraData := and(contextA, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000)\n }\n\n uint64 currBufferIndex;\n uint40 prevResetIndex;\n uint40 currResetIndex;\n assembly {\n currBufferIndex := and(contextB, 0x000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF)\n prevResetIndex := shr(64, and(contextB, 0x00000000000000000000000000000000000000FFFFFFFFFF0000000000000000))\n currResetIndex := shr(104, and(contextB, 0x0000000000000000000000000000FFFFFFFFFF00000000000000000000000000))\n }\n\n return RingBufferContext({\n globalIndex: globalIndex,\n extraData: extraData,\n currBufferIndex: currBufferIndex,\n prevResetIndex: prevResetIndex,\n currResetIndex: currResetIndex\n });\n }\n\n /**\n * Retrieves the a buffer from the ring buffer by index.\n * @param _self Buffer to access.\n * @param _which Index of the sub buffer to access.\n * @return Sub buffer for the index.\n */\n function getBuffer(\n RingBuffer storage _self,\n uint256 _which\n )\n internal\n view\n returns (\n Buffer storage\n )\n {\n return _which % 2 == 0 ? _self.bufferA : _self.bufferB;\n }\n}\n" + }, + "contracts/optimistic-ethereum/OVM/verification/OVM_StateTransitionerFactory.sol": { + "content": "// SPDX-License-Identifier: MIT\n// @unsupported: ovm\npragma solidity >0.5.0 <0.8.0;\n\n/* Library Imports */\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/* Interface Imports */\nimport { iOVM_StateTransitioner } from \"../../iOVM/verification/iOVM_StateTransitioner.sol\";\nimport { iOVM_StateTransitionerFactory } from \"../../iOVM/verification/iOVM_StateTransitionerFactory.sol\";\nimport { iOVM_FraudVerifier } from \"../../iOVM/verification/iOVM_FraudVerifier.sol\";\n\n/* Contract Imports */\nimport { OVM_StateTransitioner } from \"./OVM_StateTransitioner.sol\";\n\n/**\n * @title OVM_StateTransitionerFactory\n * @dev The State Transitioner Factory is used by the Fraud Verifier to create a new State\n * Transitioner during the initialization of a fraud proof.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract OVM_StateTransitionerFactory is iOVM_StateTransitionerFactory, Lib_AddressResolver {\n\n /***************\n * Constructor *\n ***************/\n\n constructor(\n address _libAddressManager\n )\n Lib_AddressResolver(_libAddressManager)\n {}\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Creates a new OVM_StateTransitioner\n * @param _libAddressManager Address of the Address Manager.\n * @param _stateTransitionIndex Index of the state transition being verified.\n * @param _preStateRoot State root before the transition was executed.\n * @param _transactionHash Hash of the executed transaction.\n * @return New OVM_StateTransitioner instance.\n */\n function create(\n address _libAddressManager,\n uint256 _stateTransitionIndex,\n bytes32 _preStateRoot,\n bytes32 _transactionHash\n )\n override\n public\n returns (\n iOVM_StateTransitioner\n )\n {\n require(\n msg.sender == resolve(\"OVM_FraudVerifier\"),\n \"Create can only be done by the OVM_FraudVerifier.\"\n );\n\n return new OVM_StateTransitioner(\n _libAddressManager,\n _stateTransitionIndex,\n _preStateRoot,\n _transactionHash\n );\n }\n}\n" + }, + "contracts/optimistic-ethereum/iOVM/verification/iOVM_StateTransitionerFactory.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Contract Imports */\nimport { iOVM_StateTransitioner } from \"./iOVM_StateTransitioner.sol\";\n\n/**\n * @title iOVM_StateTransitionerFactory\n */\ninterface iOVM_StateTransitionerFactory {\n\n /***************************************\n * Public Functions: Contract Creation *\n ***************************************/\n\n function create(\n address _proxyManager,\n uint256 _stateTransitionIndex,\n bytes32 _preStateRoot,\n bytes32 _transactionHash\n )\n external\n returns (\n iOVM_StateTransitioner _ovmStateTransitioner\n );\n}\n" + }, + "contracts/optimistic-ethereum/OVM/verification/OVM_StateTransitioner.sol": { + "content": "// SPDX-License-Identifier: MIT\n// @unsupported: ovm\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\nimport { Lib_EthUtils } from \"../../libraries/utils/Lib_EthUtils.sol\";\nimport { Lib_Bytes32Utils } from \"../../libraries/utils/Lib_Bytes32Utils.sol\";\nimport { Lib_BytesUtils } from \"../../libraries/utils/Lib_BytesUtils.sol\";\nimport { Lib_SecureMerkleTrie } from \"../../libraries/trie/Lib_SecureMerkleTrie.sol\";\nimport { Lib_RLPWriter } from \"../../libraries/rlp/Lib_RLPWriter.sol\";\nimport { Lib_RLPReader } from \"../../libraries/rlp/Lib_RLPReader.sol\";\n\n/* Interface Imports */\nimport { iOVM_StateTransitioner } from \"../../iOVM/verification/iOVM_StateTransitioner.sol\";\nimport { iOVM_BondManager } from \"../../iOVM/verification/iOVM_BondManager.sol\";\nimport { iOVM_ExecutionManager } from \"../../iOVM/execution/iOVM_ExecutionManager.sol\";\nimport { iOVM_StateManager } from \"../../iOVM/execution/iOVM_StateManager.sol\";\nimport { iOVM_StateManagerFactory } from \"../../iOVM/execution/iOVM_StateManagerFactory.sol\";\n\n/* Contract Imports */\nimport { Abs_FraudContributor } from \"./Abs_FraudContributor.sol\";\n\n/**\n * @title OVM_StateTransitioner\n * @dev The State Transitioner coordinates the execution of a state transition during the evaluation of a\n * fraud proof. It feeds verified input to the Execution Manager's run(), and controls a State Manager (which is\n * uniquely created for each fraud proof).\n * Once a fraud proof has been initialized, this contract is provided with the pre-state root and verifies\n * that the OVM storage slots committed to the State Mangager are contained in that state\n * This contract controls the State Manager and Execution Manager, and uses them to calculate the\n * post-state root by applying the transaction. The Fraud Verifier can then check for fraud by comparing\n * the calculated post-state root with the proposed post-state root.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract OVM_StateTransitioner is Lib_AddressResolver, Abs_FraudContributor, iOVM_StateTransitioner {\n\n /*******************\n * Data Structures *\n *******************/\n\n enum TransitionPhase {\n PRE_EXECUTION,\n POST_EXECUTION,\n COMPLETE\n }\n\n\n /*******************************************\n * Contract Variables: Contract References *\n *******************************************/\n\n iOVM_StateManager public ovmStateManager;\n\n\n /*******************************************\n * Contract Variables: Internal Accounting *\n *******************************************/\n\n bytes32 internal preStateRoot;\n bytes32 internal postStateRoot;\n TransitionPhase public phase;\n uint256 internal stateTransitionIndex;\n bytes32 internal transactionHash;\n\n\n /*************\n * Constants *\n *************/\n\n bytes32 internal constant EMPTY_ACCOUNT_CODE_HASH = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;\n bytes32 internal constant EMPTY_ACCOUNT_STORAGE_ROOT = 0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421;\n\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n * @param _stateTransitionIndex Index of the state transition being verified.\n * @param _preStateRoot State root before the transition was executed.\n * @param _transactionHash Hash of the executed transaction.\n */\n constructor(\n address _libAddressManager,\n uint256 _stateTransitionIndex,\n bytes32 _preStateRoot,\n bytes32 _transactionHash\n )\n Lib_AddressResolver(_libAddressManager)\n {\n stateTransitionIndex = _stateTransitionIndex;\n preStateRoot = _preStateRoot;\n postStateRoot = _preStateRoot;\n transactionHash = _transactionHash;\n\n ovmStateManager = iOVM_StateManagerFactory(resolve(\"OVM_StateManagerFactory\")).create(address(this));\n }\n\n\n /**********************\n * Function Modifiers *\n **********************/\n\n /**\n * Checks that a function is only run during a specific phase.\n * @param _phase Phase the function must run within.\n */\n modifier onlyDuringPhase(\n TransitionPhase _phase\n ) {\n require(\n phase == _phase,\n \"Function must be called during the correct phase.\"\n );\n _;\n }\n\n\n /**********************************\n * Public Functions: State Access *\n **********************************/\n\n /**\n * Retrieves the state root before execution.\n * @return _preStateRoot State root before execution.\n */\n function getPreStateRoot()\n override\n public\n view\n returns (\n bytes32 _preStateRoot\n )\n {\n return preStateRoot;\n }\n\n /**\n * Retrieves the state root after execution.\n * @return _postStateRoot State root after execution.\n */\n function getPostStateRoot()\n override\n public\n view\n returns (\n bytes32 _postStateRoot\n )\n {\n return postStateRoot;\n }\n\n /**\n * Checks whether the transitioner is complete.\n * @return _complete Whether or not the transition process is finished.\n */\n function isComplete()\n override\n public\n view\n returns (\n bool _complete\n )\n {\n return phase == TransitionPhase.COMPLETE;\n }\n\n\n /***********************************\n * Public Functions: Pre-Execution *\n ***********************************/\n\n /**\n * Allows a user to prove the initial state of a contract.\n * @param _ovmContractAddress Address of the contract on the OVM.\n * @param _ethContractAddress Address of the corresponding contract on L1.\n * @param _stateTrieWitness Proof of the account state.\n */\n function proveContractState(\n address _ovmContractAddress,\n address _ethContractAddress,\n bytes memory _stateTrieWitness\n )\n override\n public\n onlyDuringPhase(TransitionPhase.PRE_EXECUTION)\n contributesToFraudProof(preStateRoot, transactionHash)\n {\n // Exit quickly to avoid unnecessary work.\n require(\n (\n ovmStateManager.hasAccount(_ovmContractAddress) == false\n && ovmStateManager.hasEmptyAccount(_ovmContractAddress) == false\n ),\n \"Account state has already been proven.\"\n );\n\n // Function will fail if the proof is not a valid inclusion or exclusion proof.\n (\n bool exists,\n bytes memory encodedAccount\n ) = Lib_SecureMerkleTrie.get(\n abi.encodePacked(_ovmContractAddress),\n _stateTrieWitness,\n preStateRoot\n );\n\n if (exists == true) {\n // Account exists, this was an inclusion proof.\n Lib_OVMCodec.EVMAccount memory account = Lib_OVMCodec.decodeEVMAccount(\n encodedAccount\n );\n\n address ethContractAddress = _ethContractAddress;\n if (account.codeHash == EMPTY_ACCOUNT_CODE_HASH) {\n // Use a known empty contract to prevent an attack in which a user provides a\n // contract address here and then later deploys code to it.\n ethContractAddress = 0x0000000000000000000000000000000000000000;\n } else {\n // Otherwise, make sure that the code at the provided eth address matches the hash\n // of the code stored on L2.\n require(\n Lib_EthUtils.getCodeHash(ethContractAddress) == account.codeHash,\n \"OVM_StateTransitioner: Provided L1 contract code hash does not match L2 contract code hash.\"\n );\n }\n\n ovmStateManager.putAccount(\n _ovmContractAddress,\n Lib_OVMCodec.Account({\n nonce: account.nonce,\n balance: account.balance,\n storageRoot: account.storageRoot,\n codeHash: account.codeHash,\n ethAddress: ethContractAddress,\n isFresh: false\n })\n );\n } else {\n // Account does not exist, this was an exclusion proof.\n ovmStateManager.putEmptyAccount(_ovmContractAddress);\n }\n }\n\n /**\n * Allows a user to prove the initial state of a contract storage slot.\n * @param _ovmContractAddress Address of the contract on the OVM.\n * @param _key Claimed account slot key.\n * @param _storageTrieWitness Proof of the storage slot.\n */\n function proveStorageSlot(\n address _ovmContractAddress,\n bytes32 _key,\n bytes memory _storageTrieWitness\n )\n override\n public\n onlyDuringPhase(TransitionPhase.PRE_EXECUTION)\n contributesToFraudProof(preStateRoot, transactionHash)\n {\n // Exit quickly to avoid unnecessary work.\n require(\n ovmStateManager.hasContractStorage(_ovmContractAddress, _key) == false,\n \"Storage slot has already been proven.\"\n );\n\n require(\n ovmStateManager.hasAccount(_ovmContractAddress) == true,\n \"Contract must be verified before proving a storage slot.\"\n );\n\n bytes32 storageRoot = ovmStateManager.getAccountStorageRoot(_ovmContractAddress);\n bytes32 value;\n\n if (storageRoot == EMPTY_ACCOUNT_STORAGE_ROOT) {\n // Storage trie was empty, so the user is always allowed to insert zero-byte values.\n value = bytes32(0);\n } else {\n // Function will fail if the proof is not a valid inclusion or exclusion proof.\n (\n bool exists,\n bytes memory encodedValue\n ) = Lib_SecureMerkleTrie.get(\n abi.encodePacked(_key),\n _storageTrieWitness,\n storageRoot\n );\n\n if (exists == true) {\n // Inclusion proof.\n // Stored values are RLP encoded, with leading zeros removed.\n value = Lib_BytesUtils.toBytes32PadLeft(\n Lib_RLPReader.readBytes(encodedValue)\n );\n } else {\n // Exclusion proof, can only be zero bytes.\n value = bytes32(0);\n }\n }\n\n ovmStateManager.putContractStorage(\n _ovmContractAddress,\n _key,\n value\n );\n }\n\n\n /*******************************\n * Public Functions: Execution *\n *******************************/\n\n /**\n * Executes the state transition.\n * @param _transaction OVM transaction to execute.\n */\n function applyTransaction(\n Lib_OVMCodec.Transaction memory _transaction\n )\n override\n public\n onlyDuringPhase(TransitionPhase.PRE_EXECUTION)\n contributesToFraudProof(preStateRoot, transactionHash)\n {\n require(\n Lib_OVMCodec.hashTransaction(_transaction) == transactionHash,\n \"Invalid transaction provided.\"\n );\n\n // We require gas to complete the logic here in run() before/after execution,\n // But must ensure the full _tx.gasLimit can be given to the ovmCALL (determinism)\n // This includes 1/64 of the gas getting lost because of EIP-150 (lost twice--first\n // going into EM, then going into the code contract).\n require(\n gasleft() >= 100000 + _transaction.gasLimit * 1032 / 1000, // 1032/1000 = 1.032 = (64/63)^2 rounded up\n \"Not enough gas to execute transaction deterministically.\"\n );\n\n iOVM_ExecutionManager ovmExecutionManager = iOVM_ExecutionManager(resolve(\"OVM_ExecutionManager\"));\n\n // We call `setExecutionManager` right before `run` (and not earlier) just in case the\n // OVM_ExecutionManager address was updated between the time when this contract was created\n // and when `applyTransaction` was called.\n ovmStateManager.setExecutionManager(address(ovmExecutionManager));\n\n // `run` always succeeds *unless* the user hasn't provided enough gas to `applyTransaction`\n // or an INVALID_STATE_ACCESS flag was triggered. Either way, we won't get beyond this line\n // if that's the case.\n ovmExecutionManager.run(_transaction, address(ovmStateManager));\n\n // Prevent the Execution Manager from calling this SM again.\n ovmStateManager.setExecutionManager(address(0));\n phase = TransitionPhase.POST_EXECUTION;\n }\n\n\n /************************************\n * Public Functions: Post-Execution *\n ************************************/\n\n /**\n * Allows a user to commit the final state of a contract.\n * @param _ovmContractAddress Address of the contract on the OVM.\n * @param _stateTrieWitness Proof of the account state.\n */\n function commitContractState(\n address _ovmContractAddress,\n bytes memory _stateTrieWitness\n )\n override\n public\n onlyDuringPhase(TransitionPhase.POST_EXECUTION)\n contributesToFraudProof(preStateRoot, transactionHash)\n {\n require(\n ovmStateManager.getTotalUncommittedContractStorage() == 0,\n \"All storage must be committed before committing account states.\"\n );\n\n require (\n ovmStateManager.commitAccount(_ovmContractAddress) == true,\n \"Account state wasn't changed or has already been committed.\"\n );\n\n Lib_OVMCodec.Account memory account = ovmStateManager.getAccount(_ovmContractAddress);\n\n postStateRoot = Lib_SecureMerkleTrie.update(\n abi.encodePacked(_ovmContractAddress),\n Lib_OVMCodec.encodeEVMAccount(\n Lib_OVMCodec.toEVMAccount(account)\n ),\n _stateTrieWitness,\n postStateRoot\n );\n\n // Emit an event to help clients figure out the proof ordering.\n emit AccountCommitted(\n _ovmContractAddress\n );\n }\n\n /**\n * Allows a user to commit the final state of a contract storage slot.\n * @param _ovmContractAddress Address of the contract on the OVM.\n * @param _key Claimed account slot key.\n * @param _storageTrieWitness Proof of the storage slot.\n */\n function commitStorageSlot(\n address _ovmContractAddress,\n bytes32 _key,\n bytes memory _storageTrieWitness\n )\n override\n public\n onlyDuringPhase(TransitionPhase.POST_EXECUTION)\n contributesToFraudProof(preStateRoot, transactionHash)\n {\n require(\n ovmStateManager.commitContractStorage(_ovmContractAddress, _key) == true,\n \"Storage slot value wasn't changed or has already been committed.\"\n );\n\n Lib_OVMCodec.Account memory account = ovmStateManager.getAccount(_ovmContractAddress);\n bytes32 value = ovmStateManager.getContractStorage(_ovmContractAddress, _key);\n\n account.storageRoot = Lib_SecureMerkleTrie.update(\n abi.encodePacked(_key),\n Lib_RLPWriter.writeBytes(\n Lib_Bytes32Utils.removeLeadingZeros(value)\n ),\n _storageTrieWitness,\n account.storageRoot\n );\n\n ovmStateManager.putAccount(_ovmContractAddress, account);\n\n // Emit an event to help clients figure out the proof ordering.\n emit ContractStorageCommitted(\n _ovmContractAddress,\n _key\n );\n }\n\n\n /**********************************\n * Public Functions: Finalization *\n **********************************/\n\n /**\n * Finalizes the transition process.\n */\n function completeTransition()\n override\n public\n onlyDuringPhase(TransitionPhase.POST_EXECUTION)\n {\n require(\n ovmStateManager.getTotalUncommittedAccounts() == 0,\n \"All accounts must be committed before completing a transition.\"\n );\n\n require(\n ovmStateManager.getTotalUncommittedContractStorage() == 0,\n \"All storage must be committed before completing a transition.\"\n );\n\n phase = TransitionPhase.COMPLETE;\n }\n}\n" + }, + "contracts/optimistic-ethereum/libraries/utils/Lib_EthUtils.sol": { + "content": "// SPDX-License-Identifier: MIT\n// @unsupported: ovm\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_RLPWriter } from \"../rlp/Lib_RLPWriter.sol\";\nimport { Lib_Bytes32Utils } from \"./Lib_Bytes32Utils.sol\";\n\n/**\n * @title Lib_EthUtils\n */\nlibrary Lib_EthUtils {\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Gets the code for a given address.\n * @param _address Address to get code for.\n * @param _offset Offset to start reading from.\n * @param _length Number of bytes to read.\n * @return Code read from the contract.\n */\n function getCode(\n address _address,\n uint256 _offset,\n uint256 _length\n )\n internal\n view\n returns (\n bytes memory\n )\n {\n bytes memory code;\n assembly {\n code := mload(0x40)\n mstore(0x40, add(code, add(_length, 0x20)))\n mstore(code, _length)\n extcodecopy(_address, add(code, 0x20), _offset, _length)\n }\n\n return code;\n }\n\n /**\n * Gets the full code for a given address.\n * @param _address Address to get code for.\n * @return Full code of the contract.\n */\n function getCode(\n address _address\n )\n internal\n view\n returns (\n bytes memory\n )\n {\n return getCode(\n _address,\n 0,\n getCodeSize(_address)\n );\n }\n\n /**\n * Gets the size of a contract's code in bytes.\n * @param _address Address to get code size for.\n * @return Size of the contract's code in bytes.\n */\n function getCodeSize(\n address _address\n )\n internal\n view\n returns (\n uint256\n )\n {\n uint256 codeSize;\n assembly {\n codeSize := extcodesize(_address)\n }\n\n return codeSize;\n }\n\n /**\n * Gets the hash of a contract's code.\n * @param _address Address to get a code hash for.\n * @return Hash of the contract's code.\n */\n function getCodeHash(\n address _address\n )\n internal\n view\n returns (\n bytes32\n )\n {\n bytes32 codeHash;\n assembly {\n codeHash := extcodehash(_address)\n }\n\n return codeHash;\n }\n\n /**\n * Creates a contract with some given initialization code.\n * @param _code Contract initialization code.\n * @return Address of the created contract.\n */\n function createContract(\n bytes memory _code\n )\n internal\n returns (\n address\n )\n {\n address created;\n assembly {\n created := create(\n 0,\n add(_code, 0x20),\n mload(_code)\n )\n }\n\n return created;\n }\n\n /**\n * Computes the address that would be generated by CREATE.\n * @param _creator Address creating the contract.\n * @param _nonce Creator's nonce.\n * @return Address to be generated by CREATE.\n */\n function getAddressForCREATE(\n address _creator,\n uint256 _nonce\n )\n internal\n pure\n returns (\n address\n )\n {\n bytes[] memory encoded = new bytes[](2);\n encoded[0] = Lib_RLPWriter.writeAddress(_creator);\n encoded[1] = Lib_RLPWriter.writeUint(_nonce);\n\n bytes memory encodedList = Lib_RLPWriter.writeList(encoded);\n return Lib_Bytes32Utils.toAddress(keccak256(encodedList));\n }\n\n /**\n * Computes the address that would be generated by CREATE2.\n * @param _creator Address creating the contract.\n * @param _bytecode Bytecode of the contract to be created.\n * @param _salt 32 byte salt value mixed into the hash.\n * @return Address to be generated by CREATE2.\n */\n function getAddressForCREATE2(\n address _creator,\n bytes memory _bytecode,\n bytes32 _salt\n )\n internal\n pure\n returns (\n address\n )\n {\n bytes32 hashedData = keccak256(abi.encodePacked(\n byte(0xff),\n _creator,\n _salt,\n keccak256(_bytecode)\n ));\n\n return Lib_Bytes32Utils.toAddress(hashedData);\n }\n}\n" + }, + "contracts/optimistic-ethereum/libraries/trie/Lib_SecureMerkleTrie.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_MerkleTrie } from \"./Lib_MerkleTrie.sol\";\n\n/**\n * @title Lib_SecureMerkleTrie\n */\nlibrary Lib_SecureMerkleTrie {\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * @notice Verifies a proof that a given key/value pair is present in the\n * Merkle trie.\n * @param _key Key of the node to search for, as a hex string.\n * @param _value Value of the node to search for, as a hex string.\n * @param _proof Merkle trie inclusion proof for the desired node. Unlike\n * traditional Merkle trees, this proof is executed top-down and consists\n * of a list of RLP-encoded nodes that make a path down to the target node.\n * @param _root Known root of the Merkle trie. Used to verify that the\n * included proof is correctly constructed.\n * @return _verified `true` if the k/v pair exists in the trie, `false` otherwise.\n */\n function verifyInclusionProof(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n )\n internal\n pure\n returns (\n bool _verified\n )\n {\n bytes memory key = _getSecureKey(_key);\n return Lib_MerkleTrie.verifyInclusionProof(key, _value, _proof, _root);\n }\n\n /**\n * @notice Verifies a proof that a given key is *not* present in\n * the Merkle trie.\n * @param _key Key of the node to search for, as a hex string.\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\n * target node.\n * @param _root Known root of the Merkle trie. Used to verify that the\n * included proof is correctly constructed.\n * @return _verified `true` if the key is not present in the trie, `false` otherwise.\n */\n function verifyExclusionProof(\n bytes memory _key,\n bytes memory _proof,\n bytes32 _root\n )\n internal\n pure\n returns (\n bool _verified\n )\n {\n bytes memory key = _getSecureKey(_key);\n return Lib_MerkleTrie.verifyExclusionProof(key, _proof, _root);\n }\n\n /**\n * @notice Updates a Merkle trie and returns a new root hash.\n * @param _key Key of the node to update, as a hex string.\n * @param _value Value of the node to update, as a hex string.\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\n * target node. If the key exists, we can simply update the value.\n * Otherwise, we need to modify the trie to handle the new k/v pair.\n * @param _root Known root of the Merkle trie. Used to verify that the\n * included proof is correctly constructed.\n * @return _updatedRoot Root hash of the newly constructed trie.\n */\n function update(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n )\n internal\n pure\n returns (\n bytes32 _updatedRoot\n )\n {\n bytes memory key = _getSecureKey(_key);\n return Lib_MerkleTrie.update(key, _value, _proof, _root);\n }\n\n /**\n * @notice Retrieves the value associated with a given key.\n * @param _key Key to search for, as hex bytes.\n * @param _proof Merkle trie inclusion proof for the key.\n * @param _root Known root of the Merkle trie.\n * @return _exists Whether or not the key exists.\n * @return _value Value of the key if it exists.\n */\n function get(\n bytes memory _key,\n bytes memory _proof,\n bytes32 _root\n )\n internal\n pure\n returns (\n bool _exists,\n bytes memory _value\n )\n {\n bytes memory key = _getSecureKey(_key);\n return Lib_MerkleTrie.get(key, _proof, _root);\n }\n\n /**\n * Computes the root hash for a trie with a single node.\n * @param _key Key for the single node.\n * @param _value Value for the single node.\n * @return _updatedRoot Hash of the trie.\n */\n function getSingleNodeRootHash(\n bytes memory _key,\n bytes memory _value\n )\n internal\n pure\n returns (\n bytes32 _updatedRoot\n )\n {\n bytes memory key = _getSecureKey(_key);\n return Lib_MerkleTrie.getSingleNodeRootHash(key, _value);\n }\n\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * Computes the secure counterpart to a key.\n * @param _key Key to get a secure key from.\n * @return _secureKey Secure version of the key.\n */\n function _getSecureKey(\n bytes memory _key\n )\n private\n pure\n returns (\n bytes memory _secureKey\n )\n {\n return abi.encodePacked(keccak256(_key));\n }\n}" + }, + "contracts/optimistic-ethereum/iOVM/execution/iOVM_ExecutionManager.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\ninterface iOVM_ExecutionManager {\n /**********\n * Enums *\n *********/\n\n enum RevertFlag {\n OUT_OF_GAS,\n INTENTIONAL_REVERT,\n EXCEEDS_NUISANCE_GAS,\n INVALID_STATE_ACCESS,\n UNSAFE_BYTECODE,\n CREATE_COLLISION,\n STATIC_VIOLATION,\n CREATOR_NOT_ALLOWED\n }\n\n enum GasMetadataKey {\n CURRENT_EPOCH_START_TIMESTAMP,\n CUMULATIVE_SEQUENCER_QUEUE_GAS,\n CUMULATIVE_L1TOL2_QUEUE_GAS,\n PREV_EPOCH_SEQUENCER_QUEUE_GAS,\n PREV_EPOCH_L1TOL2_QUEUE_GAS\n }\n\n /***********\n * Structs *\n ***********/\n\n struct GasMeterConfig {\n uint256 minTransactionGasLimit;\n uint256 maxTransactionGasLimit;\n uint256 maxGasPerQueuePerEpoch;\n uint256 secondsPerEpoch;\n }\n\n struct GlobalContext {\n uint256 ovmCHAINID;\n }\n\n struct TransactionContext {\n Lib_OVMCodec.QueueOrigin ovmL1QUEUEORIGIN;\n uint256 ovmTIMESTAMP;\n uint256 ovmNUMBER;\n uint256 ovmGASLIMIT;\n uint256 ovmTXGASLIMIT;\n address ovmL1TXORIGIN;\n }\n\n struct TransactionRecord {\n uint256 ovmGasRefund;\n }\n\n struct MessageContext {\n address ovmCALLER;\n address ovmADDRESS;\n bool isStatic;\n }\n\n struct MessageRecord {\n uint256 nuisanceGasLeft;\n }\n\n\n /************************************\n * Transaction Execution Entrypoint *\n ************************************/\n\n function run(\n Lib_OVMCodec.Transaction calldata _transaction,\n address _txStateManager\n ) external returns (bytes memory);\n\n\n /*******************\n * Context Opcodes *\n *******************/\n\n function ovmCALLER() external view returns (address _caller);\n function ovmADDRESS() external view returns (address _address);\n function ovmTIMESTAMP() external view returns (uint256 _timestamp);\n function ovmNUMBER() external view returns (uint256 _number);\n function ovmGASLIMIT() external view returns (uint256 _gasLimit);\n function ovmCHAINID() external view returns (uint256 _chainId);\n\n\n /**********************\n * L2 Context Opcodes *\n **********************/\n\n function ovmL1QUEUEORIGIN() external view returns (Lib_OVMCodec.QueueOrigin _queueOrigin);\n function ovmL1TXORIGIN() external view returns (address _l1TxOrigin);\n\n\n /*******************\n * Halting Opcodes *\n *******************/\n\n function ovmREVERT(bytes memory _data) external;\n\n\n /*****************************\n * Contract Creation Opcodes *\n *****************************/\n\n function ovmCREATE(bytes memory _bytecode) external returns (address _contract, bytes memory _revertdata);\n function ovmCREATE2(bytes memory _bytecode, bytes32 _salt) external returns (address _contract, bytes memory _revertdata);\n\n\n /*******************************\n * Account Abstraction Opcodes *\n ******************************/\n\n function ovmGETNONCE() external returns (uint256 _nonce);\n function ovmINCREMENTNONCE() external;\n function ovmCREATEEOA(bytes32 _messageHash, uint8 _v, bytes32 _r, bytes32 _s) external;\n\n\n /****************************\n * Contract Calling Opcodes *\n ****************************/\n\n function ovmCALL(uint256 _gasLimit, address _address, bytes memory _calldata) external returns (bool _success, bytes memory _returndata);\n function ovmSTATICCALL(uint256 _gasLimit, address _address, bytes memory _calldata) external returns (bool _success, bytes memory _returndata);\n function ovmDELEGATECALL(uint256 _gasLimit, address _address, bytes memory _calldata) external returns (bool _success, bytes memory _returndata);\n\n\n /****************************\n * Contract Storage Opcodes *\n ****************************/\n\n function ovmSLOAD(bytes32 _key) external returns (bytes32 _value);\n function ovmSSTORE(bytes32 _key, bytes32 _value) external;\n\n\n /*************************\n * Contract Code Opcodes *\n *************************/\n\n function ovmEXTCODECOPY(address _contract, uint256 _offset, uint256 _length) external returns (bytes memory _code);\n function ovmEXTCODESIZE(address _contract) external returns (uint256 _size);\n function ovmEXTCODEHASH(address _contract) external returns (bytes32 _hash);\n\n\n /***************************************\n * Public Functions: Execution Context *\n ***************************************/\n\n function getMaxTransactionGasLimit() external view returns (uint _maxTransactionGasLimit);\n}\n" + }, + "contracts/optimistic-ethereum/iOVM/execution/iOVM_StateManager.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/**\n * @title iOVM_StateManager\n */\ninterface iOVM_StateManager {\n\n /*******************\n * Data Structures *\n *******************/\n\n enum ItemState {\n ITEM_UNTOUCHED,\n ITEM_LOADED,\n ITEM_CHANGED,\n ITEM_COMMITTED\n }\n\n /***************************\n * Public Functions: Misc *\n ***************************/\n\n function isAuthenticated(address _address) external view returns (bool);\n\n /***************************\n * Public Functions: Setup *\n ***************************/\n\n function owner() external view returns (address _owner);\n function ovmExecutionManager() external view returns (address _ovmExecutionManager);\n function setExecutionManager(address _ovmExecutionManager) external;\n\n\n /************************************\n * Public Functions: Account Access *\n ************************************/\n\n function putAccount(address _address, Lib_OVMCodec.Account memory _account) external;\n function putEmptyAccount(address _address) external;\n function getAccount(address _address) external view returns (Lib_OVMCodec.Account memory _account);\n function hasAccount(address _address) external view returns (bool _exists);\n function hasEmptyAccount(address _address) external view returns (bool _exists);\n function setAccountNonce(address _address, uint256 _nonce) external;\n function getAccountNonce(address _address) external view returns (uint256 _nonce);\n function getAccountEthAddress(address _address) external view returns (address _ethAddress);\n function getAccountStorageRoot(address _address) external view returns (bytes32 _storageRoot);\n function initPendingAccount(address _address) external;\n function commitPendingAccount(address _address, address _ethAddress, bytes32 _codeHash) external;\n function testAndSetAccountLoaded(address _address) external returns (bool _wasAccountAlreadyLoaded);\n function testAndSetAccountChanged(address _address) external returns (bool _wasAccountAlreadyChanged);\n function commitAccount(address _address) external returns (bool _wasAccountCommitted);\n function incrementTotalUncommittedAccounts() external;\n function getTotalUncommittedAccounts() external view returns (uint256 _total);\n function wasAccountChanged(address _address) external view returns (bool);\n function wasAccountCommitted(address _address) external view returns (bool);\n\n\n /************************************\n * Public Functions: Storage Access *\n ************************************/\n\n function putContractStorage(address _contract, bytes32 _key, bytes32 _value) external;\n function getContractStorage(address _contract, bytes32 _key) external view returns (bytes32 _value);\n function hasContractStorage(address _contract, bytes32 _key) external view returns (bool _exists);\n function testAndSetContractStorageLoaded(address _contract, bytes32 _key) external returns (bool _wasContractStorageAlreadyLoaded);\n function testAndSetContractStorageChanged(address _contract, bytes32 _key) external returns (bool _wasContractStorageAlreadyChanged);\n function commitContractStorage(address _contract, bytes32 _key) external returns (bool _wasContractStorageCommitted);\n function incrementTotalUncommittedContractStorage() external;\n function getTotalUncommittedContractStorage() external view returns (uint256 _total);\n function wasContractStorageChanged(address _contract, bytes32 _key) external view returns (bool);\n function wasContractStorageCommitted(address _contract, bytes32 _key) external view returns (bool);\n}\n" + }, + "contracts/optimistic-ethereum/iOVM/execution/iOVM_StateManagerFactory.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Contract Imports */\nimport { iOVM_StateManager } from \"./iOVM_StateManager.sol\";\n\n/**\n * @title iOVM_StateManagerFactory\n */\ninterface iOVM_StateManagerFactory {\n\n /***************************************\n * Public Functions: Contract Creation *\n ***************************************/\n\n function create(\n address _owner\n )\n external\n returns (\n iOVM_StateManager _ovmStateManager\n );\n}\n" + }, + "contracts/optimistic-ethereum/OVM/verification/Abs_FraudContributor.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\nimport { iOVM_BondManager } from \"../../iOVM/verification/iOVM_BondManager.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/// Minimal contract to be inherited by contracts consumed by users that provide\n/// data for fraud proofs\nabstract contract Abs_FraudContributor is Lib_AddressResolver {\n /// Decorate your functions with this modifier to store how much total gas was\n /// consumed by the sender, to reward users fairly\n modifier contributesToFraudProof(bytes32 preStateRoot, bytes32 txHash) {\n uint256 startGas = gasleft();\n _;\n uint256 gasSpent = startGas - gasleft();\n iOVM_BondManager(resolve('OVM_BondManager')).recordGasSpent(preStateRoot, txHash, msg.sender, gasSpent);\n }\n}\n" + }, + "contracts/optimistic-ethereum/libraries/trie/Lib_MerkleTrie.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Library Imports */\nimport { Lib_BytesUtils } from \"../utils/Lib_BytesUtils.sol\";\nimport { Lib_RLPReader } from \"../rlp/Lib_RLPReader.sol\";\nimport { Lib_RLPWriter } from \"../rlp/Lib_RLPWriter.sol\";\n\n/**\n * @title Lib_MerkleTrie\n */\nlibrary Lib_MerkleTrie {\n\n /*******************\n * Data Structures *\n *******************/\n\n enum NodeType {\n BranchNode,\n ExtensionNode,\n LeafNode\n }\n\n struct TrieNode {\n bytes encoded;\n Lib_RLPReader.RLPItem[] decoded;\n }\n\n\n /**********************\n * Contract Constants *\n **********************/\n\n // TREE_RADIX determines the number of elements per branch node.\n uint256 constant TREE_RADIX = 16;\n // Branch nodes have TREE_RADIX elements plus an additional `value` slot.\n uint256 constant BRANCH_NODE_LENGTH = TREE_RADIX + 1;\n // Leaf nodes and extension nodes always have two elements, a `path` and a `value`.\n uint256 constant LEAF_OR_EXTENSION_NODE_LENGTH = 2;\n\n // Prefixes are prepended to the `path` within a leaf or extension node and\n // allow us to differentiate between the two node types. `ODD` or `EVEN` is\n // determined by the number of nibbles within the unprefixed `path`. If the\n // number of nibbles if even, we need to insert an extra padding nibble so\n // the resulting prefixed `path` has an even number of nibbles.\n uint8 constant PREFIX_EXTENSION_EVEN = 0;\n uint8 constant PREFIX_EXTENSION_ODD = 1;\n uint8 constant PREFIX_LEAF_EVEN = 2;\n uint8 constant PREFIX_LEAF_ODD = 3;\n\n // Just a utility constant. RLP represents `NULL` as 0x80.\n bytes1 constant RLP_NULL = bytes1(0x80);\n bytes constant RLP_NULL_BYTES = hex'80';\n bytes32 constant internal KECCAK256_RLP_NULL_BYTES = keccak256(RLP_NULL_BYTES);\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * @notice Verifies a proof that a given key/value pair is present in the\n * Merkle trie.\n * @param _key Key of the node to search for, as a hex string.\n * @param _value Value of the node to search for, as a hex string.\n * @param _proof Merkle trie inclusion proof for the desired node. Unlike\n * traditional Merkle trees, this proof is executed top-down and consists\n * of a list of RLP-encoded nodes that make a path down to the target node.\n * @param _root Known root of the Merkle trie. Used to verify that the\n * included proof is correctly constructed.\n * @return _verified `true` if the k/v pair exists in the trie, `false` otherwise.\n */\n function verifyInclusionProof(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n )\n internal\n pure\n returns (\n bool _verified\n )\n {\n (\n bool exists,\n bytes memory value\n ) = get(_key, _proof, _root);\n\n return (\n exists && Lib_BytesUtils.equal(_value, value)\n );\n }\n\n /**\n * @notice Verifies a proof that a given key is *not* present in\n * the Merkle trie.\n * @param _key Key of the node to search for, as a hex string.\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\n * target node.\n * @param _root Known root of the Merkle trie. Used to verify that the\n * included proof is correctly constructed.\n * @return _verified `true` if the key is absent in the trie, `false` otherwise.\n */\n function verifyExclusionProof(\n bytes memory _key,\n bytes memory _proof,\n bytes32 _root\n )\n internal\n pure\n returns (\n bool _verified\n )\n {\n (\n bool exists,\n ) = get(_key, _proof, _root);\n\n return exists == false;\n }\n\n /**\n * @notice Updates a Merkle trie and returns a new root hash.\n * @param _key Key of the node to update, as a hex string.\n * @param _value Value of the node to update, as a hex string.\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\n * target node. If the key exists, we can simply update the value.\n * Otherwise, we need to modify the trie to handle the new k/v pair.\n * @param _root Known root of the Merkle trie. Used to verify that the\n * included proof is correctly constructed.\n * @return _updatedRoot Root hash of the newly constructed trie.\n */\n function update(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n )\n internal\n pure\n returns (\n bytes32 _updatedRoot\n )\n {\n // Special case when inserting the very first node.\n if (_root == KECCAK256_RLP_NULL_BYTES) {\n return getSingleNodeRootHash(_key, _value);\n }\n\n TrieNode[] memory proof = _parseProof(_proof);\n (uint256 pathLength, bytes memory keyRemainder, ) = _walkNodePath(proof, _key, _root);\n TrieNode[] memory newPath = _getNewPath(proof, pathLength, keyRemainder, _value);\n\n return _getUpdatedTrieRoot(newPath, _key);\n }\n\n /**\n * @notice Retrieves the value associated with a given key.\n * @param _key Key to search for, as hex bytes.\n * @param _proof Merkle trie inclusion proof for the key.\n * @param _root Known root of the Merkle trie.\n * @return _exists Whether or not the key exists.\n * @return _value Value of the key if it exists.\n */\n function get(\n bytes memory _key,\n bytes memory _proof,\n bytes32 _root\n )\n internal\n pure\n returns (\n bool _exists,\n bytes memory _value\n )\n {\n TrieNode[] memory proof = _parseProof(_proof);\n (uint256 pathLength, bytes memory keyRemainder, bool isFinalNode) = _walkNodePath(proof, _key, _root);\n\n bool exists = keyRemainder.length == 0;\n\n require(\n exists || isFinalNode,\n \"Provided proof is invalid.\"\n );\n\n bytes memory value = exists ? _getNodeValue(proof[pathLength - 1]) : bytes('');\n\n return (\n exists,\n value\n );\n }\n\n /**\n * Computes the root hash for a trie with a single node.\n * @param _key Key for the single node.\n * @param _value Value for the single node.\n * @return _updatedRoot Hash of the trie.\n */\n function getSingleNodeRootHash(\n bytes memory _key,\n bytes memory _value\n )\n internal\n pure\n returns (\n bytes32 _updatedRoot\n )\n {\n return keccak256(_makeLeafNode(\n Lib_BytesUtils.toNibbles(_key),\n _value\n ).encoded);\n }\n\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * @notice Walks through a proof using a provided key.\n * @param _proof Inclusion proof to walk through.\n * @param _key Key to use for the walk.\n * @param _root Known root of the trie.\n * @return _pathLength Length of the final path\n * @return _keyRemainder Portion of the key remaining after the walk.\n * @return _isFinalNode Whether or not we've hit a dead end.\n */\n function _walkNodePath(\n TrieNode[] memory _proof,\n bytes memory _key,\n bytes32 _root\n )\n private\n pure\n returns (\n uint256 _pathLength,\n bytes memory _keyRemainder,\n bool _isFinalNode\n )\n {\n uint256 pathLength = 0;\n bytes memory key = Lib_BytesUtils.toNibbles(_key);\n\n bytes32 currentNodeID = _root;\n uint256 currentKeyIndex = 0;\n uint256 currentKeyIncrement = 0;\n TrieNode memory currentNode;\n\n // Proof is top-down, so we start at the first element (root).\n for (uint256 i = 0; i < _proof.length; i++) {\n currentNode = _proof[i];\n currentKeyIndex += currentKeyIncrement;\n\n // Keep track of the proof elements we actually need.\n // It's expensive to resize arrays, so this simply reduces gas costs.\n pathLength += 1;\n\n if (currentKeyIndex == 0) {\n // First proof element is always the root node.\n require(\n keccak256(currentNode.encoded) == currentNodeID,\n \"Invalid root hash\"\n );\n } else if (currentNode.encoded.length >= 32) {\n // Nodes 32 bytes or larger are hashed inside branch nodes.\n require(\n keccak256(currentNode.encoded) == currentNodeID,\n \"Invalid large internal hash\"\n );\n } else {\n // Nodes smaller than 31 bytes aren't hashed.\n require(\n Lib_BytesUtils.toBytes32(currentNode.encoded) == currentNodeID,\n \"Invalid internal node hash\"\n );\n }\n\n if (currentNode.decoded.length == BRANCH_NODE_LENGTH) {\n if (currentKeyIndex == key.length) {\n // We've hit the end of the key, meaning the value should be within this branch node.\n break;\n } else {\n // We're not at the end of the key yet.\n // Figure out what the next node ID should be and continue.\n uint8 branchKey = uint8(key[currentKeyIndex]);\n Lib_RLPReader.RLPItem memory nextNode = currentNode.decoded[branchKey];\n currentNodeID = _getNodeID(nextNode);\n currentKeyIncrement = 1;\n continue;\n }\n } else if (currentNode.decoded.length == LEAF_OR_EXTENSION_NODE_LENGTH) {\n bytes memory path = _getNodePath(currentNode);\n uint8 prefix = uint8(path[0]);\n uint8 offset = 2 - prefix % 2;\n bytes memory pathRemainder = Lib_BytesUtils.slice(path, offset);\n bytes memory keyRemainder = Lib_BytesUtils.slice(key, currentKeyIndex);\n uint256 sharedNibbleLength = _getSharedNibbleLength(pathRemainder, keyRemainder);\n\n if (prefix == PREFIX_LEAF_EVEN || prefix == PREFIX_LEAF_ODD) {\n if (\n pathRemainder.length == sharedNibbleLength &&\n keyRemainder.length == sharedNibbleLength\n ) {\n // The key within this leaf matches our key exactly.\n // Increment the key index to reflect that we have no remainder.\n currentKeyIndex += sharedNibbleLength;\n }\n\n // We've hit a leaf node, so our next node should be NULL.\n currentNodeID = bytes32(RLP_NULL);\n break;\n } else if (prefix == PREFIX_EXTENSION_EVEN || prefix == PREFIX_EXTENSION_ODD) {\n if (sharedNibbleLength == 0) {\n // Our extension node doesn't share any part of our key.\n // We've hit the end of this path, updates will need to modify this extension.\n currentNodeID = bytes32(RLP_NULL);\n break;\n } else {\n // Our extension shares some nibbles.\n // Carry on to the next node.\n currentNodeID = _getNodeID(currentNode.decoded[1]);\n currentKeyIncrement = sharedNibbleLength;\n continue;\n }\n } else {\n revert(\"Received a node with an unknown prefix\");\n }\n } else {\n revert(\"Received an unparseable node.\");\n }\n }\n\n // If our node ID is NULL, then we're at a dead end.\n bool isFinalNode = currentNodeID == bytes32(RLP_NULL);\n return (pathLength, Lib_BytesUtils.slice(key, currentKeyIndex), isFinalNode);\n }\n\n /**\n * @notice Creates new nodes to support a k/v pair insertion into a given\n * Merkle trie path.\n * @param _path Path to the node nearest the k/v pair.\n * @param _pathLength Length of the path. Necessary because the provided\n * path may include additional nodes (e.g., it comes directly from a proof)\n * and we can't resize in-memory arrays without costly duplication.\n * @param _keyRemainder Portion of the initial key that must be inserted\n * into the trie.\n * @param _value Value to insert at the given key.\n * @return _newPath A new path with the inserted k/v pair and extra supporting nodes.\n */\n function _getNewPath(\n TrieNode[] memory _path,\n uint256 _pathLength,\n bytes memory _keyRemainder,\n bytes memory _value\n )\n private\n pure\n returns (\n TrieNode[] memory _newPath\n )\n {\n bytes memory keyRemainder = _keyRemainder;\n\n // Most of our logic depends on the status of the last node in the path.\n TrieNode memory lastNode = _path[_pathLength - 1];\n NodeType lastNodeType = _getNodeType(lastNode);\n\n // Create an array for newly created nodes.\n // We need up to three new nodes, depending on the contents of the last node.\n // Since array resizing is expensive, we'll keep track of the size manually.\n // We're using an explicit `totalNewNodes += 1` after insertions for clarity.\n TrieNode[] memory newNodes = new TrieNode[](3);\n uint256 totalNewNodes = 0;\n\n if (keyRemainder.length == 0 && lastNodeType == NodeType.LeafNode) {\n // We've found a leaf node with the given key.\n // Simply need to update the value of the node to match.\n newNodes[totalNewNodes] = _makeLeafNode(_getNodeKey(lastNode), _value);\n totalNewNodes += 1;\n } else if (lastNodeType == NodeType.BranchNode) {\n if (keyRemainder.length == 0) {\n // We've found a branch node with the given key.\n // Simply need to update the value of the node to match.\n newNodes[totalNewNodes] = _editBranchValue(lastNode, _value);\n totalNewNodes += 1;\n } else {\n // We've found a branch node, but it doesn't contain our key.\n // Reinsert the old branch for now.\n newNodes[totalNewNodes] = lastNode;\n totalNewNodes += 1;\n // Create a new leaf node, slicing our remainder since the first byte points\n // to our branch node.\n newNodes[totalNewNodes] = _makeLeafNode(Lib_BytesUtils.slice(keyRemainder, 1), _value);\n totalNewNodes += 1;\n }\n } else {\n // Our last node is either an extension node or a leaf node with a different key.\n bytes memory lastNodeKey = _getNodeKey(lastNode);\n uint256 sharedNibbleLength = _getSharedNibbleLength(lastNodeKey, keyRemainder);\n\n if (sharedNibbleLength != 0) {\n // We've got some shared nibbles between the last node and our key remainder.\n // We'll need to insert an extension node that covers these shared nibbles.\n bytes memory nextNodeKey = Lib_BytesUtils.slice(lastNodeKey, 0, sharedNibbleLength);\n newNodes[totalNewNodes] = _makeExtensionNode(nextNodeKey, _getNodeHash(_value));\n totalNewNodes += 1;\n\n // Cut down the keys since we've just covered these shared nibbles.\n lastNodeKey = Lib_BytesUtils.slice(lastNodeKey, sharedNibbleLength);\n keyRemainder = Lib_BytesUtils.slice(keyRemainder, sharedNibbleLength);\n }\n\n // Create an empty branch to fill in.\n TrieNode memory newBranch = _makeEmptyBranchNode();\n\n if (lastNodeKey.length == 0) {\n // Key remainder was larger than the key for our last node.\n // The value within our last node is therefore going to be shifted into\n // a branch value slot.\n newBranch = _editBranchValue(newBranch, _getNodeValue(lastNode));\n } else {\n // Last node key was larger than the key remainder.\n // We're going to modify some index of our branch.\n uint8 branchKey = uint8(lastNodeKey[0]);\n // Move on to the next nibble.\n lastNodeKey = Lib_BytesUtils.slice(lastNodeKey, 1);\n\n if (lastNodeType == NodeType.LeafNode) {\n // We're dealing with a leaf node.\n // We'll modify the key and insert the old leaf node into the branch index.\n TrieNode memory modifiedLastNode = _makeLeafNode(lastNodeKey, _getNodeValue(lastNode));\n newBranch = _editBranchIndex(newBranch, branchKey, _getNodeHash(modifiedLastNode.encoded));\n } else if (lastNodeKey.length != 0) {\n // We're dealing with a shrinking extension node.\n // We need to modify the node to decrease the size of the key.\n TrieNode memory modifiedLastNode = _makeExtensionNode(lastNodeKey, _getNodeValue(lastNode));\n newBranch = _editBranchIndex(newBranch, branchKey, _getNodeHash(modifiedLastNode.encoded));\n } else {\n // We're dealing with an unnecessary extension node.\n // We're going to delete the node entirely.\n // Simply insert its current value into the branch index.\n newBranch = _editBranchIndex(newBranch, branchKey, _getNodeValue(lastNode));\n }\n }\n\n if (keyRemainder.length == 0) {\n // We've got nothing left in the key remainder.\n // Simply insert the value into the branch value slot.\n newBranch = _editBranchValue(newBranch, _value);\n // Push the branch into the list of new nodes.\n newNodes[totalNewNodes] = newBranch;\n totalNewNodes += 1;\n } else {\n // We've got some key remainder to work with.\n // We'll be inserting a leaf node into the trie.\n // First, move on to the next nibble.\n keyRemainder = Lib_BytesUtils.slice(keyRemainder, 1);\n // Push the branch into the list of new nodes.\n newNodes[totalNewNodes] = newBranch;\n totalNewNodes += 1;\n // Push a new leaf node for our k/v pair.\n newNodes[totalNewNodes] = _makeLeafNode(keyRemainder, _value);\n totalNewNodes += 1;\n }\n }\n\n // Finally, join the old path with our newly created nodes.\n // Since we're overwriting the last node in the path, we use `_pathLength - 1`.\n return _joinNodeArrays(_path, _pathLength - 1, newNodes, totalNewNodes);\n }\n\n /**\n * @notice Computes the trie root from a given path.\n * @param _nodes Path to some k/v pair.\n * @param _key Key for the k/v pair.\n * @return _updatedRoot Root hash for the updated trie.\n */\n function _getUpdatedTrieRoot(\n TrieNode[] memory _nodes,\n bytes memory _key\n )\n private\n pure\n returns (\n bytes32 _updatedRoot\n )\n {\n bytes memory key = Lib_BytesUtils.toNibbles(_key);\n\n // Some variables to keep track of during iteration.\n TrieNode memory currentNode;\n NodeType currentNodeType;\n bytes memory previousNodeHash;\n\n // Run through the path backwards to rebuild our root hash.\n for (uint256 i = _nodes.length; i > 0; i--) {\n // Pick out the current node.\n currentNode = _nodes[i - 1];\n currentNodeType = _getNodeType(currentNode);\n\n if (currentNodeType == NodeType.LeafNode) {\n // Leaf nodes are already correctly encoded.\n // Shift the key over to account for the nodes key.\n bytes memory nodeKey = _getNodeKey(currentNode);\n key = Lib_BytesUtils.slice(key, 0, key.length - nodeKey.length);\n } else if (currentNodeType == NodeType.ExtensionNode) {\n // Shift the key over to account for the nodes key.\n bytes memory nodeKey = _getNodeKey(currentNode);\n key = Lib_BytesUtils.slice(key, 0, key.length - nodeKey.length);\n\n // If this node is the last element in the path, it'll be correctly encoded\n // and we can skip this part.\n if (previousNodeHash.length > 0) {\n // Re-encode the node based on the previous node.\n currentNode = _makeExtensionNode(nodeKey, previousNodeHash);\n }\n } else if (currentNodeType == NodeType.BranchNode) {\n // If this node is the last element in the path, it'll be correctly encoded\n // and we can skip this part.\n if (previousNodeHash.length > 0) {\n // Re-encode the node based on the previous node.\n uint8 branchKey = uint8(key[key.length - 1]);\n key = Lib_BytesUtils.slice(key, 0, key.length - 1);\n currentNode = _editBranchIndex(currentNode, branchKey, previousNodeHash);\n }\n }\n\n // Compute the node hash for the next iteration.\n previousNodeHash = _getNodeHash(currentNode.encoded);\n }\n\n // Current node should be the root at this point.\n // Simply return the hash of its encoding.\n return keccak256(currentNode.encoded);\n }\n\n /**\n * @notice Parses an RLP-encoded proof into something more useful.\n * @param _proof RLP-encoded proof to parse.\n * @return _parsed Proof parsed into easily accessible structs.\n */\n function _parseProof(\n bytes memory _proof\n )\n private\n pure\n returns (\n TrieNode[] memory _parsed\n )\n {\n Lib_RLPReader.RLPItem[] memory nodes = Lib_RLPReader.readList(_proof);\n TrieNode[] memory proof = new TrieNode[](nodes.length);\n\n for (uint256 i = 0; i < nodes.length; i++) {\n bytes memory encoded = Lib_RLPReader.readBytes(nodes[i]);\n proof[i] = TrieNode({\n encoded: encoded,\n decoded: Lib_RLPReader.readList(encoded)\n });\n }\n\n return proof;\n }\n\n /**\n * @notice Picks out the ID for a node. Node ID is referred to as the\n * \"hash\" within the specification, but nodes < 32 bytes are not actually\n * hashed.\n * @param _node Node to pull an ID for.\n * @return _nodeID ID for the node, depending on the size of its contents.\n */\n function _getNodeID(\n Lib_RLPReader.RLPItem memory _node\n )\n private\n pure\n returns (\n bytes32 _nodeID\n )\n {\n bytes memory nodeID;\n\n if (_node.length < 32) {\n // Nodes smaller than 32 bytes are RLP encoded.\n nodeID = Lib_RLPReader.readRawBytes(_node);\n } else {\n // Nodes 32 bytes or larger are hashed.\n nodeID = Lib_RLPReader.readBytes(_node);\n }\n\n return Lib_BytesUtils.toBytes32(nodeID);\n }\n\n /**\n * @notice Gets the path for a leaf or extension node.\n * @param _node Node to get a path for.\n * @return _path Node path, converted to an array of nibbles.\n */\n function _getNodePath(\n TrieNode memory _node\n )\n private\n pure\n returns (\n bytes memory _path\n )\n {\n return Lib_BytesUtils.toNibbles(Lib_RLPReader.readBytes(_node.decoded[0]));\n }\n\n /**\n * @notice Gets the key for a leaf or extension node. Keys are essentially\n * just paths without any prefix.\n * @param _node Node to get a key for.\n * @return _key Node key, converted to an array of nibbles.\n */\n function _getNodeKey(\n TrieNode memory _node\n )\n private\n pure\n returns (\n bytes memory _key\n )\n {\n return _removeHexPrefix(_getNodePath(_node));\n }\n\n /**\n * @notice Gets the path for a node.\n * @param _node Node to get a value for.\n * @return _value Node value, as hex bytes.\n */\n function _getNodeValue(\n TrieNode memory _node\n )\n private\n pure\n returns (\n bytes memory _value\n )\n {\n return Lib_RLPReader.readBytes(_node.decoded[_node.decoded.length - 1]);\n }\n\n /**\n * @notice Computes the node hash for an encoded node. Nodes < 32 bytes\n * are not hashed, all others are keccak256 hashed.\n * @param _encoded Encoded node to hash.\n * @return _hash Hash of the encoded node. Simply the input if < 32 bytes.\n */\n function _getNodeHash(\n bytes memory _encoded\n )\n private\n pure\n returns (\n bytes memory _hash\n )\n {\n if (_encoded.length < 32) {\n return _encoded;\n } else {\n return abi.encodePacked(keccak256(_encoded));\n }\n }\n\n /**\n * @notice Determines the type for a given node.\n * @param _node Node to determine a type for.\n * @return _type Type of the node; BranchNode/ExtensionNode/LeafNode.\n */\n function _getNodeType(\n TrieNode memory _node\n )\n private\n pure\n returns (\n NodeType _type\n )\n {\n if (_node.decoded.length == BRANCH_NODE_LENGTH) {\n return NodeType.BranchNode;\n } else if (_node.decoded.length == LEAF_OR_EXTENSION_NODE_LENGTH) {\n bytes memory path = _getNodePath(_node);\n uint8 prefix = uint8(path[0]);\n\n if (prefix == PREFIX_LEAF_EVEN || prefix == PREFIX_LEAF_ODD) {\n return NodeType.LeafNode;\n } else if (prefix == PREFIX_EXTENSION_EVEN || prefix == PREFIX_EXTENSION_ODD) {\n return NodeType.ExtensionNode;\n }\n }\n\n revert(\"Invalid node type\");\n }\n\n /**\n * @notice Utility; determines the number of nibbles shared between two\n * nibble arrays.\n * @param _a First nibble array.\n * @param _b Second nibble array.\n * @return _shared Number of shared nibbles.\n */\n function _getSharedNibbleLength(\n bytes memory _a,\n bytes memory _b\n )\n private\n pure\n returns (\n uint256 _shared\n )\n {\n uint256 i = 0;\n while (_a.length > i && _b.length > i && _a[i] == _b[i]) {\n i++;\n }\n return i;\n }\n\n /**\n * @notice Utility; converts an RLP-encoded node into our nice struct.\n * @param _raw RLP-encoded node to convert.\n * @return _node Node as a TrieNode struct.\n */\n function _makeNode(\n bytes[] memory _raw\n )\n private\n pure\n returns (\n TrieNode memory _node\n )\n {\n bytes memory encoded = Lib_RLPWriter.writeList(_raw);\n\n return TrieNode({\n encoded: encoded,\n decoded: Lib_RLPReader.readList(encoded)\n });\n }\n\n /**\n * @notice Utility; converts an RLP-decoded node into our nice struct.\n * @param _items RLP-decoded node to convert.\n * @return _node Node as a TrieNode struct.\n */\n function _makeNode(\n Lib_RLPReader.RLPItem[] memory _items\n )\n private\n pure\n returns (\n TrieNode memory _node\n )\n {\n bytes[] memory raw = new bytes[](_items.length);\n for (uint256 i = 0; i < _items.length; i++) {\n raw[i] = Lib_RLPReader.readRawBytes(_items[i]);\n }\n return _makeNode(raw);\n }\n\n /**\n * @notice Creates a new extension node.\n * @param _key Key for the extension node, unprefixed.\n * @param _value Value for the extension node.\n * @return _node New extension node with the given k/v pair.\n */\n function _makeExtensionNode(\n bytes memory _key,\n bytes memory _value\n )\n private\n pure\n returns (\n TrieNode memory _node\n )\n {\n bytes[] memory raw = new bytes[](2);\n bytes memory key = _addHexPrefix(_key, false);\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\n raw[1] = Lib_RLPWriter.writeBytes(_value);\n return _makeNode(raw);\n }\n\n /**\n * @notice Creates a new leaf node.\n * @dev This function is essentially identical to `_makeExtensionNode`.\n * Although we could route both to a single method with a flag, it's\n * more gas efficient to keep them separate and duplicate the logic.\n * @param _key Key for the leaf node, unprefixed.\n * @param _value Value for the leaf node.\n * @return _node New leaf node with the given k/v pair.\n */\n function _makeLeafNode(\n bytes memory _key,\n bytes memory _value\n )\n private\n pure\n returns (\n TrieNode memory _node\n )\n {\n bytes[] memory raw = new bytes[](2);\n bytes memory key = _addHexPrefix(_key, true);\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\n raw[1] = Lib_RLPWriter.writeBytes(_value);\n return _makeNode(raw);\n }\n\n /**\n * @notice Creates an empty branch node.\n * @return _node Empty branch node as a TrieNode struct.\n */\n function _makeEmptyBranchNode()\n private\n pure\n returns (\n TrieNode memory _node\n )\n {\n bytes[] memory raw = new bytes[](BRANCH_NODE_LENGTH);\n for (uint256 i = 0; i < raw.length; i++) {\n raw[i] = RLP_NULL_BYTES;\n }\n return _makeNode(raw);\n }\n\n /**\n * @notice Modifies the value slot for a given branch.\n * @param _branch Branch node to modify.\n * @param _value Value to insert into the branch.\n * @return _updatedNode Modified branch node.\n */\n function _editBranchValue(\n TrieNode memory _branch,\n bytes memory _value\n )\n private\n pure\n returns (\n TrieNode memory _updatedNode\n )\n {\n bytes memory encoded = Lib_RLPWriter.writeBytes(_value);\n _branch.decoded[_branch.decoded.length - 1] = Lib_RLPReader.toRLPItem(encoded);\n return _makeNode(_branch.decoded);\n }\n\n /**\n * @notice Modifies a slot at an index for a given branch.\n * @param _branch Branch node to modify.\n * @param _index Slot index to modify.\n * @param _value Value to insert into the slot.\n * @return _updatedNode Modified branch node.\n */\n function _editBranchIndex(\n TrieNode memory _branch,\n uint8 _index,\n bytes memory _value\n )\n private\n pure\n returns (\n TrieNode memory _updatedNode\n )\n {\n bytes memory encoded = _value.length < 32 ? _value : Lib_RLPWriter.writeBytes(_value);\n _branch.decoded[_index] = Lib_RLPReader.toRLPItem(encoded);\n return _makeNode(_branch.decoded);\n }\n\n /**\n * @notice Utility; adds a prefix to a key.\n * @param _key Key to prefix.\n * @param _isLeaf Whether or not the key belongs to a leaf.\n * @return _prefixedKey Prefixed key.\n */\n function _addHexPrefix(\n bytes memory _key,\n bool _isLeaf\n )\n private\n pure\n returns (\n bytes memory _prefixedKey\n )\n {\n uint8 prefix = _isLeaf ? uint8(0x02) : uint8(0x00);\n uint8 offset = uint8(_key.length % 2);\n bytes memory prefixed = new bytes(2 - offset);\n prefixed[0] = bytes1(prefix + offset);\n return abi.encodePacked(prefixed, _key);\n }\n\n /**\n * @notice Utility; removes a prefix from a path.\n * @param _path Path to remove the prefix from.\n * @return _unprefixedKey Unprefixed key.\n */\n function _removeHexPrefix(\n bytes memory _path\n )\n private\n pure\n returns (\n bytes memory _unprefixedKey\n )\n {\n if (uint8(_path[0]) % 2 == 0) {\n return Lib_BytesUtils.slice(_path, 2);\n } else {\n return Lib_BytesUtils.slice(_path, 1);\n }\n }\n\n /**\n * @notice Utility; combines two node arrays. Array lengths are required\n * because the actual lengths may be longer than the filled lengths.\n * Array resizing is extremely costly and should be avoided.\n * @param _a First array to join.\n * @param _aLength Length of the first array.\n * @param _b Second array to join.\n * @param _bLength Length of the second array.\n * @return _joined Combined node array.\n */\n function _joinNodeArrays(\n TrieNode[] memory _a,\n uint256 _aLength,\n TrieNode[] memory _b,\n uint256 _bLength\n )\n private\n pure\n returns (\n TrieNode[] memory _joined\n )\n {\n TrieNode[] memory ret = new TrieNode[](_aLength + _bLength);\n\n // Copy elements from the first array.\n for (uint256 i = 0; i < _aLength; i++) {\n ret[i] = _a[i];\n }\n\n // Copy elements from the second array.\n for (uint256 i = 0; i < _bLength; i++) {\n ret[i + _aLength] = _b[i];\n }\n\n return ret;\n }\n}\n" + }, + "contracts/optimistic-ethereum/OVM/verification/OVM_FraudVerifier.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/* Interface Imports */\nimport { iOVM_FraudVerifier } from \"../../iOVM/verification/iOVM_FraudVerifier.sol\";\nimport { iOVM_StateTransitioner } from \"../../iOVM/verification/iOVM_StateTransitioner.sol\";\nimport { iOVM_StateTransitionerFactory } from \"../../iOVM/verification/iOVM_StateTransitionerFactory.sol\";\nimport { iOVM_BondManager } from \"../../iOVM/verification/iOVM_BondManager.sol\";\nimport { iOVM_StateCommitmentChain } from \"../../iOVM/chain/iOVM_StateCommitmentChain.sol\";\nimport { iOVM_CanonicalTransactionChain } from \"../../iOVM/chain/iOVM_CanonicalTransactionChain.sol\";\n\n/* Contract Imports */\nimport { Abs_FraudContributor } from \"./Abs_FraudContributor.sol\";\n\n\n\n/**\n * @title OVM_FraudVerifier\n * @dev The Fraud Verifier contract coordinates the entire fraud proof verification process.\n * If the fraud proof was successful it prunes any state batches from State Commitment Chain\n * which were published after the fraudulent state root.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract OVM_FraudVerifier is Lib_AddressResolver, Abs_FraudContributor, iOVM_FraudVerifier {\n\n /*******************************************\n * Contract Variables: Internal Accounting *\n *******************************************/\n\n mapping (bytes32 => iOVM_StateTransitioner) internal transitioners;\n\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n constructor(\n address _libAddressManager\n )\n Lib_AddressResolver(_libAddressManager)\n {}\n\n\n /***************************************\n * Public Functions: Transition Status *\n ***************************************/\n\n /**\n * Retrieves the state transitioner for a given root.\n * @param _preStateRoot State root to query a transitioner for.\n * @return _transitioner Corresponding state transitioner contract.\n */\n function getStateTransitioner(\n bytes32 _preStateRoot,\n bytes32 _txHash\n )\n override\n public\n view\n returns (\n iOVM_StateTransitioner _transitioner\n )\n {\n return transitioners[keccak256(abi.encodePacked(_preStateRoot, _txHash))];\n }\n\n\n /****************************************\n * Public Functions: Fraud Verification *\n ****************************************/\n\n /**\n * Begins the fraud verification process.\n * @param _preStateRoot State root before the fraudulent transaction.\n * @param _preStateRootBatchHeader Batch header for the provided pre-state root.\n * @param _preStateRootProof Inclusion proof for the provided pre-state root.\n * @param _transaction OVM transaction claimed to be fraudulent.\n * @param _txChainElement OVM transaction chain element.\n * @param _transactionBatchHeader Batch header for the provided transaction.\n * @param _transactionProof Inclusion proof for the provided transaction.\n */\n function initializeFraudVerification(\n bytes32 _preStateRoot,\n Lib_OVMCodec.ChainBatchHeader memory _preStateRootBatchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _preStateRootProof,\n Lib_OVMCodec.Transaction memory _transaction,\n Lib_OVMCodec.TransactionChainElement memory _txChainElement,\n Lib_OVMCodec.ChainBatchHeader memory _transactionBatchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _transactionProof\n )\n override\n public\n contributesToFraudProof(_preStateRoot, Lib_OVMCodec.hashTransaction(_transaction))\n {\n bytes32 _txHash = Lib_OVMCodec.hashTransaction(_transaction);\n\n if (_hasStateTransitioner(_preStateRoot, _txHash)) {\n return;\n }\n\n iOVM_StateCommitmentChain ovmStateCommitmentChain = iOVM_StateCommitmentChain(resolve(\"OVM_StateCommitmentChain\"));\n iOVM_CanonicalTransactionChain ovmCanonicalTransactionChain = iOVM_CanonicalTransactionChain(resolve(\"OVM_CanonicalTransactionChain\"));\n\n require(\n ovmStateCommitmentChain.verifyStateCommitment(\n _preStateRoot,\n _preStateRootBatchHeader,\n _preStateRootProof\n ),\n \"Invalid pre-state root inclusion proof.\"\n );\n\n require(\n ovmCanonicalTransactionChain.verifyTransaction(\n _transaction,\n _txChainElement,\n _transactionBatchHeader,\n _transactionProof\n ),\n \"Invalid transaction inclusion proof.\"\n );\n\n require (\n _preStateRootBatchHeader.prevTotalElements + _preStateRootProof.index + 1 == _transactionBatchHeader.prevTotalElements + _transactionProof.index,\n \"Pre-state root global index must equal to the transaction root global index.\"\n );\n\n _deployTransitioner(_preStateRoot, _txHash, _preStateRootProof.index);\n\n emit FraudProofInitialized(\n _preStateRoot,\n _preStateRootProof.index,\n _txHash,\n msg.sender\n );\n }\n\n /**\n * Finalizes the fraud verification process.\n * @param _preStateRoot State root before the fraudulent transaction.\n * @param _preStateRootBatchHeader Batch header for the provided pre-state root.\n * @param _preStateRootProof Inclusion proof for the provided pre-state root.\n * @param _txHash The transaction for the state root\n * @param _postStateRoot State root after the fraudulent transaction.\n * @param _postStateRootBatchHeader Batch header for the provided post-state root.\n * @param _postStateRootProof Inclusion proof for the provided post-state root.\n */\n function finalizeFraudVerification(\n bytes32 _preStateRoot,\n Lib_OVMCodec.ChainBatchHeader memory _preStateRootBatchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _preStateRootProof,\n bytes32 _txHash,\n bytes32 _postStateRoot,\n Lib_OVMCodec.ChainBatchHeader memory _postStateRootBatchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _postStateRootProof\n )\n override\n public\n contributesToFraudProof(_preStateRoot, _txHash)\n {\n iOVM_StateTransitioner transitioner = getStateTransitioner(_preStateRoot, _txHash);\n iOVM_StateCommitmentChain ovmStateCommitmentChain = iOVM_StateCommitmentChain(resolve(\"OVM_StateCommitmentChain\"));\n\n require(\n transitioner.isComplete() == true,\n \"State transition process must be completed prior to finalization.\"\n );\n\n require (\n _postStateRootBatchHeader.prevTotalElements + _postStateRootProof.index == _preStateRootBatchHeader.prevTotalElements + _preStateRootProof.index + 1,\n \"Post-state root global index must equal to the pre state root global index plus one.\"\n );\n\n require(\n ovmStateCommitmentChain.verifyStateCommitment(\n _preStateRoot,\n _preStateRootBatchHeader,\n _preStateRootProof\n ),\n \"Invalid pre-state root inclusion proof.\"\n );\n\n require(\n ovmStateCommitmentChain.verifyStateCommitment(\n _postStateRoot,\n _postStateRootBatchHeader,\n _postStateRootProof\n ),\n \"Invalid post-state root inclusion proof.\"\n );\n\n // If the post state root did not match, then there was fraud and we should delete the batch\n require(\n _postStateRoot != transitioner.getPostStateRoot(),\n \"State transition has not been proven fraudulent.\"\n );\n\n _cancelStateTransition(_postStateRootBatchHeader, _preStateRoot);\n\n // TEMPORARY: Remove the transitioner; for minnet.\n transitioners[keccak256(abi.encodePacked(_preStateRoot, _txHash))] = iOVM_StateTransitioner(0x0000000000000000000000000000000000000000);\n\n emit FraudProofFinalized(\n _preStateRoot,\n _preStateRootProof.index,\n _txHash,\n msg.sender\n );\n }\n\n\n /************************************\n * Internal Functions: Verification *\n ************************************/\n\n /**\n * Checks whether a transitioner already exists for a given pre-state root.\n * @param _preStateRoot Pre-state root to check.\n * @return _exists Whether or not we already have a transitioner for the root.\n */\n function _hasStateTransitioner(\n bytes32 _preStateRoot,\n bytes32 _txHash\n )\n internal\n view\n returns (\n bool _exists\n )\n {\n return address(getStateTransitioner(_preStateRoot, _txHash)) != address(0);\n }\n\n /**\n * Deploys a new state transitioner.\n * @param _preStateRoot Pre-state root to initialize the transitioner with.\n * @param _txHash Hash of the transaction this transitioner will execute.\n * @param _stateTransitionIndex Index of the transaction in the chain.\n */\n function _deployTransitioner(\n bytes32 _preStateRoot,\n bytes32 _txHash,\n uint256 _stateTransitionIndex\n )\n internal\n {\n transitioners[keccak256(abi.encodePacked(_preStateRoot, _txHash))] = iOVM_StateTransitionerFactory(\n resolve(\"OVM_StateTransitionerFactory\")\n ).create(\n address(libAddressManager),\n _stateTransitionIndex,\n _preStateRoot,\n _txHash\n );\n }\n\n /**\n * Removes a state transition from the state commitment chain.\n * @param _postStateRootBatchHeader Header for the post-state root.\n * @param _preStateRoot Pre-state root hash.\n */\n function _cancelStateTransition(\n Lib_OVMCodec.ChainBatchHeader memory _postStateRootBatchHeader,\n bytes32 _preStateRoot\n )\n internal\n {\n iOVM_StateCommitmentChain ovmStateCommitmentChain = iOVM_StateCommitmentChain(resolve(\"OVM_StateCommitmentChain\"));\n iOVM_BondManager ovmBondManager = iOVM_BondManager(resolve(\"OVM_BondManager\"));\n\n // Delete the state batch.\n ovmStateCommitmentChain.deleteStateBatch(\n _postStateRootBatchHeader\n );\n\n // Get the timestamp and publisher for that block.\n (uint256 timestamp, address publisher) = abi.decode(_postStateRootBatchHeader.extraData, (uint256, address));\n\n // Slash the bonds at the bond manager.\n ovmBondManager.finalize(\n _preStateRoot,\n publisher,\n timestamp\n );\n }\n}\n" + }, + "contracts/optimistic-ethereum/OVM/chain/OVM_CanonicalTransactionChain.sol": { + "content": "// SPDX-License-Identifier: MIT\n// @unsupported: ovm\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\nimport { Lib_MerkleTree } from \"../../libraries/utils/Lib_MerkleTree.sol\";\n\n/* Interface Imports */\nimport { iOVM_CanonicalTransactionChain } from \"../../iOVM/chain/iOVM_CanonicalTransactionChain.sol\";\nimport { iOVM_ChainStorageContainer } from \"../../iOVM/chain/iOVM_ChainStorageContainer.sol\";\n\n/* Contract Imports */\nimport { OVM_ExecutionManager } from \"../execution/OVM_ExecutionManager.sol\";\n\n/* External Imports */\nimport { Math } from \"@openzeppelin/contracts/math/Math.sol\";\n\n/**\n * @title OVM_CanonicalTransactionChain\n * @dev The Canonical Transaction Chain (CTC) contract is an append-only log of transactions\n * which must be applied to the rollup state. It defines the ordering of rollup transactions by\n * writing them to the 'CTC:batches' instance of the Chain Storage Container.\n * The CTC also allows any account to 'enqueue' an L2 transaction, which will require that the Sequencer\n * will eventually append it to the rollup state.\n * If the Sequencer does not include an enqueued transaction within the 'force inclusion period',\n * then any account may force it to be included by calling appendQueueBatch().\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract OVM_CanonicalTransactionChain is iOVM_CanonicalTransactionChain, Lib_AddressResolver {\n\n /*************\n * Constants *\n *************/\n\n // L2 tx gas-related\n uint256 constant public MIN_ROLLUP_TX_GAS = 100000;\n uint256 constant public MAX_ROLLUP_TX_SIZE = 50000;\n uint256 constant public L2_GAS_DISCOUNT_DIVISOR = 32;\n\n // Encoding-related (all in bytes)\n uint256 constant internal BATCH_CONTEXT_SIZE = 16;\n uint256 constant internal BATCH_CONTEXT_LENGTH_POS = 12;\n uint256 constant internal BATCH_CONTEXT_START_POS = 15;\n uint256 constant internal TX_DATA_HEADER_SIZE = 3;\n uint256 constant internal BYTES_TILL_TX_DATA = 65;\n\n\n /*************\n * Variables *\n *************/\n\n uint256 public forceInclusionPeriodSeconds;\n uint256 public forceInclusionPeriodBlocks;\n uint256 public maxTransactionGasLimit;\n\n\n /***************\n * Constructor *\n ***************/\n\n constructor(\n address _libAddressManager,\n uint256 _forceInclusionPeriodSeconds,\n uint256 _forceInclusionPeriodBlocks,\n uint256 _maxTransactionGasLimit\n )\n Lib_AddressResolver(_libAddressManager)\n {\n forceInclusionPeriodSeconds = _forceInclusionPeriodSeconds;\n forceInclusionPeriodBlocks = _forceInclusionPeriodBlocks;\n maxTransactionGasLimit = _maxTransactionGasLimit;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Accesses the batch storage container.\n * @return Reference to the batch storage container.\n */\n function batches()\n override\n public\n view\n returns (\n iOVM_ChainStorageContainer\n )\n {\n return iOVM_ChainStorageContainer(\n resolve(\"OVM_ChainStorageContainer:CTC:batches\")\n );\n }\n\n /**\n * Accesses the queue storage container.\n * @return Reference to the queue storage container.\n */\n function queue()\n override\n public\n view\n returns (\n iOVM_ChainStorageContainer\n )\n {\n return iOVM_ChainStorageContainer(\n resolve(\"OVM_ChainStorageContainer:CTC:queue\")\n );\n }\n\n /**\n * Retrieves the total number of elements submitted.\n * @return _totalElements Total submitted elements.\n */\n function getTotalElements()\n override\n public\n view\n returns (\n uint256 _totalElements\n )\n {\n (uint40 totalElements,,,) = _getBatchExtraData();\n return uint256(totalElements);\n }\n\n /**\n * Retrieves the total number of batches submitted.\n * @return _totalBatches Total submitted batches.\n */\n function getTotalBatches()\n override\n public\n view\n returns (\n uint256 _totalBatches\n )\n {\n return batches().length();\n }\n\n /**\n * Returns the index of the next element to be enqueued.\n * @return Index for the next queue element.\n */\n function getNextQueueIndex()\n override\n public\n view\n returns (\n uint40\n )\n {\n (,uint40 nextQueueIndex,,) = _getBatchExtraData();\n return nextQueueIndex;\n }\n\n /**\n * Returns the timestamp of the last transaction.\n * @return Timestamp for the last transaction.\n */\n function getLastTimestamp()\n override\n public\n view\n returns (\n uint40\n )\n {\n (,,uint40 lastTimestamp,) = _getBatchExtraData();\n return lastTimestamp;\n }\n\n /**\n * Returns the blocknumber of the last transaction.\n * @return Blocknumber for the last transaction.\n */\n function getLastBlockNumber()\n override\n public\n view\n returns (\n uint40\n )\n {\n (,,,uint40 lastBlockNumber) = _getBatchExtraData();\n return lastBlockNumber;\n }\n\n /**\n * Gets the queue element at a particular index.\n * @param _index Index of the queue element to access.\n * @return _element Queue element at the given index.\n */\n function getQueueElement(\n uint256 _index\n )\n override\n public\n view\n returns (\n Lib_OVMCodec.QueueElement memory _element\n )\n {\n return _getQueueElement(\n _index,\n queue()\n );\n }\n\n /**\n * Get the number of queue elements which have not yet been included.\n * @return Number of pending queue elements.\n */\n function getNumPendingQueueElements()\n override\n public\n view\n returns (\n uint40\n )\n {\n return getQueueLength() - getNextQueueIndex();\n }\n\n /**\n * Retrieves the length of the queue, including\n * both pending and canonical transactions.\n * @return Length of the queue.\n */\n function getQueueLength()\n override\n public\n view\n returns (\n uint40\n )\n {\n return _getQueueLength(\n queue()\n );\n }\n\n /**\n * Adds a transaction to the queue.\n * @param _target Target L2 contract to send the transaction to.\n * @param _gasLimit Gas limit for the enqueued L2 transaction.\n * @param _data Transaction data.\n */\n function enqueue(\n address _target,\n uint256 _gasLimit,\n bytes memory _data\n )\n override\n public\n {\n require(\n _data.length <= MAX_ROLLUP_TX_SIZE,\n \"Transaction data size exceeds maximum for rollup transaction.\"\n );\n\n require(\n _gasLimit <= maxTransactionGasLimit,\n \"Transaction gas limit exceeds maximum for rollup transaction.\"\n );\n\n require(\n _gasLimit >= MIN_ROLLUP_TX_GAS,\n \"Transaction gas limit too low to enqueue.\"\n );\n\n // We need to consume some amount of L1 gas in order to rate limit transactions going into\n // L2. However, L2 is cheaper than L1 so we only need to burn some small proportion of the\n // provided L1 gas.\n uint256 gasToConsume = _gasLimit/L2_GAS_DISCOUNT_DIVISOR;\n uint256 startingGas = gasleft();\n\n // Although this check is not necessary (burn below will run out of gas if not true), it\n // gives the user an explicit reason as to why the enqueue attempt failed.\n require(\n startingGas > gasToConsume,\n \"Insufficient gas for L2 rate limiting burn.\"\n );\n\n // Here we do some \"dumb\" work in order to burn gas, although we should probably replace\n // this with something like minting gas token later on.\n uint256 i;\n while(startingGas - gasleft() < gasToConsume) {\n i++;\n }\n\n bytes32 transactionHash = keccak256(\n abi.encode(\n msg.sender,\n _target,\n _gasLimit,\n _data\n )\n );\n\n bytes32 timestampAndBlockNumber;\n assembly {\n timestampAndBlockNumber := timestamp()\n timestampAndBlockNumber := or(timestampAndBlockNumber, shl(40, number()))\n }\n\n iOVM_ChainStorageContainer queueRef = queue();\n\n queueRef.push(transactionHash);\n queueRef.push(timestampAndBlockNumber);\n\n // The underlying queue data structure stores 2 elements\n // per insertion, so to get the real queue length we need\n // to divide by 2 and subtract 1.\n uint256 queueIndex = queueRef.length() / 2 - 1;\n emit TransactionEnqueued(\n msg.sender,\n _target,\n _gasLimit,\n _data,\n queueIndex,\n block.timestamp\n );\n }\n\n /**\n * Appends a given number of queued transactions as a single batch.\n * param _numQueuedTransactions Number of transactions to append.\n */\n function appendQueueBatch(\n uint256 // _numQueuedTransactions\n )\n override\n public\n pure\n {\n // TEMPORARY: Disable `appendQueueBatch` for minnet\n revert(\"appendQueueBatch is currently disabled.\");\n\n // _numQueuedTransactions = Math.min(_numQueuedTransactions, getNumPendingQueueElements());\n // require(\n // _numQueuedTransactions > 0,\n // \"Must append more than zero transactions.\"\n // );\n\n // bytes32[] memory leaves = new bytes32[](_numQueuedTransactions);\n // uint40 nextQueueIndex = getNextQueueIndex();\n\n // for (uint256 i = 0; i < _numQueuedTransactions; i++) {\n // if (msg.sender != resolve(\"OVM_Sequencer\")) {\n // Lib_OVMCodec.QueueElement memory el = getQueueElement(nextQueueIndex);\n // require(\n // el.timestamp + forceInclusionPeriodSeconds < block.timestamp,\n // \"Queue transactions cannot be submitted during the sequencer inclusion period.\"\n // );\n // }\n // leaves[i] = _getQueueLeafHash(nextQueueIndex);\n // nextQueueIndex++;\n // }\n\n // Lib_OVMCodec.QueueElement memory lastElement = getQueueElement(nextQueueIndex - 1);\n\n // _appendBatch(\n // Lib_MerkleTree.getMerkleRoot(leaves),\n // _numQueuedTransactions,\n // _numQueuedTransactions,\n // lastElement.timestamp,\n // lastElement.blockNumber\n // );\n\n // emit QueueBatchAppended(\n // nextQueueIndex - _numQueuedTransactions,\n // _numQueuedTransactions,\n // getTotalElements()\n // );\n }\n\n /**\n * Allows the sequencer to append a batch of transactions.\n * @dev This function uses a custom encoding scheme for efficiency reasons.\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\n * .param _contexts Array of batch contexts.\n * .param _transactionDataFields Array of raw transaction data.\n */\n function appendSequencerBatch()\n override\n public\n {\n uint40 shouldStartAtElement;\n uint24 totalElementsToAppend;\n uint24 numContexts;\n assembly {\n shouldStartAtElement := shr(216, calldataload(4))\n totalElementsToAppend := shr(232, calldataload(9))\n numContexts := shr(232, calldataload(12))\n }\n\n require(\n shouldStartAtElement == getTotalElements(),\n \"Actual batch start index does not match expected start index.\"\n );\n\n require(\n msg.sender == resolve(\"OVM_Sequencer\"),\n \"Function can only be called by the Sequencer.\"\n );\n\n require(\n numContexts > 0,\n \"Must provide at least one batch context.\"\n );\n\n require(\n totalElementsToAppend > 0,\n \"Must append at least one element.\"\n );\n\n uint40 nextTransactionPtr = uint40(BATCH_CONTEXT_START_POS + BATCH_CONTEXT_SIZE * numContexts);\n\n require(\n msg.data.length >= nextTransactionPtr,\n \"Not enough BatchContexts provided.\"\n );\n\n // Take a reference to the queue and its length so we don't have to keep resolving it.\n // Length isn't going to change during the course of execution, so it's fine to simply\n // resolve this once at the start. Saves gas.\n iOVM_ChainStorageContainer queueRef = queue();\n uint40 queueLength = _getQueueLength(queueRef);\n\n // Reserve some memory to save gas on hashing later on. This is a relatively safe estimate\n // for the average transaction size that will prevent having to resize this chunk of memory\n // later on. Saves gas.\n bytes memory hashMemory = new bytes((msg.data.length / totalElementsToAppend) * 2);\n\n // Initialize the array of canonical chain leaves that we will append.\n bytes32[] memory leaves = new bytes32[](totalElementsToAppend);\n\n // Each leaf index corresponds to a tx, either sequenced or enqueued.\n uint32 leafIndex = 0;\n\n // Counter for number of sequencer transactions appended so far.\n uint32 numSequencerTransactions = 0;\n\n // We will sequentially append leaves which are pointers to the queue.\n // The initial queue index is what is currently in storage.\n uint40 nextQueueIndex = getNextQueueIndex();\n\n BatchContext memory curContext;\n for (uint32 i = 0; i < numContexts; i++) {\n BatchContext memory nextContext = _getBatchContext(i);\n\n if (i == 0) {\n // Execute a special check for the first batch.\n _validateFirstBatchContext(nextContext);\n }\n\n // Execute this check on every single batch, including the first one.\n _validateNextBatchContext(\n curContext,\n nextContext,\n nextQueueIndex,\n queueRef\n );\n\n // Now we can update our current context.\n curContext = nextContext;\n\n // Process sequencer transactions first.\n for (uint32 j = 0; j < curContext.numSequencedTransactions; j++) {\n uint256 txDataLength;\n assembly {\n txDataLength := shr(232, calldataload(nextTransactionPtr))\n }\n require(\n txDataLength <= MAX_ROLLUP_TX_SIZE,\n \"Transaction data size exceeds maximum for rollup transaction.\"\n );\n\n leaves[leafIndex] = _getSequencerLeafHash(\n curContext,\n nextTransactionPtr,\n txDataLength,\n hashMemory\n );\n\n nextTransactionPtr += uint40(TX_DATA_HEADER_SIZE + txDataLength);\n numSequencerTransactions++;\n leafIndex++;\n }\n\n // Now process any subsequent queue transactions.\n for (uint32 j = 0; j < curContext.numSubsequentQueueTransactions; j++) {\n require(\n nextQueueIndex < queueLength,\n \"Not enough queued transactions to append.\"\n );\n\n leaves[leafIndex] = _getQueueLeafHash(nextQueueIndex);\n nextQueueIndex++;\n leafIndex++;\n }\n }\n\n _validateFinalBatchContext(\n curContext,\n nextQueueIndex,\n queueLength,\n queueRef\n );\n\n require(\n msg.data.length == nextTransactionPtr,\n \"Not all sequencer transactions were processed.\"\n );\n\n require(\n leafIndex == totalElementsToAppend,\n \"Actual transaction index does not match expected total elements to append.\"\n );\n\n // Generate the required metadata that we need to append this batch\n uint40 numQueuedTransactions = totalElementsToAppend - numSequencerTransactions;\n uint40 blockTimestamp;\n uint40 blockNumber;\n if (curContext.numSubsequentQueueTransactions == 0) {\n // The last element is a sequencer tx, therefore pull timestamp and block number from the last context.\n blockTimestamp = uint40(curContext.timestamp);\n blockNumber = uint40(curContext.blockNumber);\n } else {\n // The last element is a queue tx, therefore pull timestamp and block number from the queue element.\n // curContext.numSubsequentQueueTransactions > 0 which means that we've processed at least one queue element.\n // We increment nextQueueIndex after processing each queue element,\n // so the index of the last element we processed is nextQueueIndex - 1.\n Lib_OVMCodec.QueueElement memory lastElement = _getQueueElement(\n nextQueueIndex - 1,\n queueRef\n );\n\n blockTimestamp = lastElement.timestamp;\n blockNumber = lastElement.blockNumber;\n }\n\n // For efficiency reasons getMerkleRoot modifies the `leaves` argument in place\n // while calculating the root hash therefore any arguments passed to it must not\n // be used again afterwards\n _appendBatch(\n Lib_MerkleTree.getMerkleRoot(leaves),\n totalElementsToAppend,\n numQueuedTransactions,\n blockTimestamp,\n blockNumber\n );\n\n emit SequencerBatchAppended(\n nextQueueIndex - numQueuedTransactions,\n numQueuedTransactions,\n getTotalElements()\n );\n }\n\n /**\n * Verifies whether a transaction is included in the chain.\n * @param _transaction Transaction to verify.\n * @param _txChainElement Transaction chain element corresponding to the transaction.\n * @param _batchHeader Header of the batch the transaction was included in.\n * @param _inclusionProof Inclusion proof for the provided transaction chain element.\n * @return True if the transaction exists in the CTC, false if not.\n */\n function verifyTransaction(\n Lib_OVMCodec.Transaction memory _transaction,\n Lib_OVMCodec.TransactionChainElement memory _txChainElement,\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _inclusionProof\n )\n override\n public\n view\n returns (\n bool\n )\n {\n if (_txChainElement.isSequenced == true) {\n return _verifySequencerTransaction(\n _transaction,\n _txChainElement,\n _batchHeader,\n _inclusionProof\n );\n } else {\n return _verifyQueueTransaction(\n _transaction,\n _txChainElement.queueIndex,\n _batchHeader,\n _inclusionProof\n );\n }\n }\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Returns the BatchContext located at a particular index.\n * @param _index The index of the BatchContext\n * @return The BatchContext at the specified index.\n */\n function _getBatchContext(\n uint256 _index\n )\n internal\n pure\n returns (\n BatchContext memory\n )\n {\n uint256 contextPtr = 15 + _index * BATCH_CONTEXT_SIZE;\n uint256 numSequencedTransactions;\n uint256 numSubsequentQueueTransactions;\n uint256 ctxTimestamp;\n uint256 ctxBlockNumber;\n\n assembly {\n numSequencedTransactions := shr(232, calldataload(contextPtr))\n numSubsequentQueueTransactions := shr(232, calldataload(add(contextPtr, 3)))\n ctxTimestamp := shr(216, calldataload(add(contextPtr, 6)))\n ctxBlockNumber := shr(216, calldataload(add(contextPtr, 11)))\n }\n\n return BatchContext({\n numSequencedTransactions: numSequencedTransactions,\n numSubsequentQueueTransactions: numSubsequentQueueTransactions,\n timestamp: ctxTimestamp,\n blockNumber: ctxBlockNumber\n });\n }\n\n /**\n * Parses the batch context from the extra data.\n * @return Total number of elements submitted.\n * @return Index of the next queue element.\n */\n function _getBatchExtraData()\n internal\n view\n returns (\n uint40,\n uint40,\n uint40,\n uint40\n )\n {\n bytes27 extraData = batches().getGlobalMetadata();\n\n uint40 totalElements;\n uint40 nextQueueIndex;\n uint40 lastTimestamp;\n uint40 lastBlockNumber;\n assembly {\n extraData := shr(40, extraData)\n totalElements := and(extraData, 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF)\n nextQueueIndex := shr(40, and(extraData, 0x00000000000000000000000000000000000000000000FFFFFFFFFF0000000000))\n lastTimestamp := shr(80, and(extraData, 0x0000000000000000000000000000000000FFFFFFFFFF00000000000000000000))\n lastBlockNumber := shr(120, and(extraData, 0x000000000000000000000000FFFFFFFFFF000000000000000000000000000000))\n }\n\n return (\n totalElements,\n nextQueueIndex,\n lastTimestamp,\n lastBlockNumber\n );\n }\n\n /**\n * Encodes the batch context for the extra data.\n * @param _totalElements Total number of elements submitted.\n * @param _nextQueueIndex Index of the next queue element.\n * @param _timestamp Timestamp for the last batch.\n * @param _blockNumber Block number of the last batch.\n * @return Encoded batch context.\n */\n function _makeBatchExtraData(\n uint40 _totalElements,\n uint40 _nextQueueIndex,\n uint40 _timestamp,\n uint40 _blockNumber\n )\n internal\n pure\n returns (\n bytes27\n )\n {\n bytes27 extraData;\n assembly {\n extraData := _totalElements\n extraData := or(extraData, shl(40, _nextQueueIndex))\n extraData := or(extraData, shl(80, _timestamp))\n extraData := or(extraData, shl(120, _blockNumber))\n extraData := shl(40, extraData)\n }\n\n return extraData;\n }\n\n /**\n * Retrieves the hash of a queue element.\n * @param _index Index of the queue element to retrieve a hash for.\n * @return Hash of the queue element.\n */\n function _getQueueLeafHash(\n uint256 _index\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n return _hashTransactionChainElement(\n Lib_OVMCodec.TransactionChainElement({\n isSequenced: false,\n queueIndex: _index,\n timestamp: 0,\n blockNumber: 0,\n txData: hex\"\"\n })\n );\n }\n\n /**\n * Gets the queue element at a particular index.\n * @param _index Index of the queue element to access.\n * @return _element Queue element at the given index.\n */\n function _getQueueElement(\n uint256 _index,\n iOVM_ChainStorageContainer _queueRef\n )\n internal\n view\n returns (\n Lib_OVMCodec.QueueElement memory _element\n )\n {\n // The underlying queue data structure stores 2 elements\n // per insertion, so to get the actual desired queue index\n // we need to multiply by 2.\n uint40 trueIndex = uint40(_index * 2);\n bytes32 transactionHash = _queueRef.get(trueIndex);\n bytes32 timestampAndBlockNumber = _queueRef.get(trueIndex + 1);\n\n uint40 elementTimestamp;\n uint40 elementBlockNumber;\n assembly {\n elementTimestamp := and(timestampAndBlockNumber, 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF)\n elementBlockNumber := shr(40, and(timestampAndBlockNumber, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000))\n }\n\n return Lib_OVMCodec.QueueElement({\n transactionHash: transactionHash,\n timestamp: elementTimestamp,\n blockNumber: elementBlockNumber\n });\n }\n\n /**\n * Retrieves the length of the queue.\n * @return Length of the queue.\n */\n function _getQueueLength(\n iOVM_ChainStorageContainer _queueRef\n )\n internal\n view\n returns (\n uint40\n )\n {\n // The underlying queue data structure stores 2 elements\n // per insertion, so to get the real queue length we need\n // to divide by 2.\n return uint40(_queueRef.length() / 2);\n }\n\n /**\n * Retrieves the hash of a sequencer element.\n * @param _context Batch context for the given element.\n * @param _nextTransactionPtr Pointer to the next transaction in the calldata.\n * @param _txDataLength Length of the transaction item.\n * @return Hash of the sequencer element.\n */\n function _getSequencerLeafHash(\n BatchContext memory _context,\n uint256 _nextTransactionPtr,\n uint256 _txDataLength,\n bytes memory _hashMemory\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n // Only allocate more memory if we didn't reserve enough to begin with.\n if (BYTES_TILL_TX_DATA + _txDataLength > _hashMemory.length) {\n _hashMemory = new bytes(BYTES_TILL_TX_DATA + _txDataLength);\n }\n\n uint256 ctxTimestamp = _context.timestamp;\n uint256 ctxBlockNumber = _context.blockNumber;\n\n bytes32 leafHash;\n assembly {\n let chainElementStart := add(_hashMemory, 0x20)\n\n // Set the first byte equal to `1` to indicate this is a sequencer chain element.\n // This distinguishes sequencer ChainElements from queue ChainElements because\n // all queue ChainElements are ABI encoded and the first byte of ABI encoded\n // elements is always zero\n mstore8(chainElementStart, 1)\n\n mstore(add(chainElementStart, 1), ctxTimestamp)\n mstore(add(chainElementStart, 33), ctxBlockNumber)\n\n calldatacopy(add(chainElementStart, BYTES_TILL_TX_DATA), add(_nextTransactionPtr, 3), _txDataLength)\n\n leafHash := keccak256(chainElementStart, add(BYTES_TILL_TX_DATA, _txDataLength))\n }\n\n return leafHash;\n }\n\n /**\n * Retrieves the hash of a sequencer element.\n * @param _txChainElement The chain element which is hashed to calculate the leaf.\n * @return Hash of the sequencer element.\n */\n function _getSequencerLeafHash(\n Lib_OVMCodec.TransactionChainElement memory _txChainElement\n )\n internal\n view\n returns(\n bytes32\n )\n {\n bytes memory txData = _txChainElement.txData;\n uint256 txDataLength = _txChainElement.txData.length;\n\n bytes memory chainElement = new bytes(BYTES_TILL_TX_DATA + txDataLength);\n uint256 ctxTimestamp = _txChainElement.timestamp;\n uint256 ctxBlockNumber = _txChainElement.blockNumber;\n\n bytes32 leafHash;\n assembly {\n let chainElementStart := add(chainElement, 0x20)\n\n // Set the first byte equal to `1` to indicate this is a sequencer chain element.\n // This distinguishes sequencer ChainElements from queue ChainElements because\n // all queue ChainElements are ABI encoded and the first byte of ABI encoded\n // elements is always zero\n mstore8(chainElementStart, 1)\n\n mstore(add(chainElementStart, 1), ctxTimestamp)\n mstore(add(chainElementStart, 33), ctxBlockNumber)\n\n pop(staticcall(gas(), 0x04, add(txData, 0x20), txDataLength, add(chainElementStart, BYTES_TILL_TX_DATA), txDataLength))\n\n leafHash := keccak256(chainElementStart, add(BYTES_TILL_TX_DATA, txDataLength))\n }\n\n return leafHash;\n }\n\n /**\n * Inserts a batch into the chain of batches.\n * @param _transactionRoot Root of the transaction tree for this batch.\n * @param _batchSize Number of elements in the batch.\n * @param _numQueuedTransactions Number of queue transactions in the batch.\n * @param _timestamp The latest batch timestamp.\n * @param _blockNumber The latest batch blockNumber.\n */\n function _appendBatch(\n bytes32 _transactionRoot,\n uint256 _batchSize,\n uint256 _numQueuedTransactions,\n uint40 _timestamp,\n uint40 _blockNumber\n )\n internal\n {\n iOVM_ChainStorageContainer batchesRef = batches();\n (uint40 totalElements, uint40 nextQueueIndex,,) = _getBatchExtraData();\n\n Lib_OVMCodec.ChainBatchHeader memory header = Lib_OVMCodec.ChainBatchHeader({\n batchIndex: batchesRef.length(),\n batchRoot: _transactionRoot,\n batchSize: _batchSize,\n prevTotalElements: totalElements,\n extraData: hex\"\"\n });\n\n emit TransactionBatchAppended(\n header.batchIndex,\n header.batchRoot,\n header.batchSize,\n header.prevTotalElements,\n header.extraData\n );\n\n bytes32 batchHeaderHash = Lib_OVMCodec.hashBatchHeader(header);\n bytes27 latestBatchContext = _makeBatchExtraData(\n totalElements + uint40(header.batchSize),\n nextQueueIndex + uint40(_numQueuedTransactions),\n _timestamp,\n _blockNumber\n );\n\n batchesRef.push(batchHeaderHash, latestBatchContext);\n }\n\n /**\n * Checks that the first batch context in a sequencer submission is valid\n * @param _firstContext The batch context to validate.\n */\n function _validateFirstBatchContext(\n BatchContext memory _firstContext\n )\n internal\n view\n {\n // If there are existing elements, this batch must have the same context\n // or a later timestamp and block number.\n if (getTotalElements() > 0) {\n (,, uint40 lastTimestamp, uint40 lastBlockNumber) = _getBatchExtraData();\n\n require(\n _firstContext.blockNumber >= lastBlockNumber,\n \"Context block number is lower than last submitted.\"\n );\n\n require(\n _firstContext.timestamp >= lastTimestamp,\n \"Context timestamp is lower than last submitted.\"\n );\n }\n\n // Sequencer cannot submit contexts which are more than the force inclusion period old.\n require(\n _firstContext.timestamp + forceInclusionPeriodSeconds >= block.timestamp,\n \"Context timestamp too far in the past.\"\n );\n\n require(\n _firstContext.blockNumber + forceInclusionPeriodBlocks >= block.number,\n \"Context block number too far in the past.\"\n );\n }\n\n /**\n * Checks that a given batch context has a time context which is below a given que element\n * @param _context The batch context to validate has values lower.\n * @param _queueIndex Index of the queue element we are validating came later than the context.\n * @param _queueRef The storage container for the queue.\n */\n function _validateContextBeforeEnqueue(\n BatchContext memory _context,\n uint40 _queueIndex,\n iOVM_ChainStorageContainer _queueRef\n )\n internal\n view\n {\n Lib_OVMCodec.QueueElement memory nextQueueElement = _getQueueElement(\n _queueIndex,\n _queueRef\n );\n\n // If the force inclusion period has passed for an enqueued transaction, it MUST be the next chain element.\n require(\n block.timestamp < nextQueueElement.timestamp + forceInclusionPeriodSeconds,\n \"Previously enqueued batches have expired and must be appended before a new sequencer batch.\"\n );\n\n // Just like sequencer transaction times must be increasing relative to each other,\n // We also require that they be increasing relative to any interspersed queue elements.\n require(\n _context.timestamp <= nextQueueElement.timestamp,\n \"Sequencer transaction timestamp exceeds that of next queue element.\"\n );\n\n require(\n _context.blockNumber <= nextQueueElement.blockNumber,\n \"Sequencer transaction blockNumber exceeds that of next queue element.\"\n );\n }\n\n /**\n * Checks that a given batch context is valid based on its previous context, and the next queue elemtent.\n * @param _prevContext The previously validated batch context.\n * @param _nextContext The batch context to validate with this call.\n * @param _nextQueueIndex Index of the next queue element to process for the _nextContext's subsequentQueueElements.\n * @param _queueRef The storage container for the queue.\n */\n function _validateNextBatchContext(\n BatchContext memory _prevContext,\n BatchContext memory _nextContext,\n uint40 _nextQueueIndex,\n iOVM_ChainStorageContainer _queueRef\n )\n internal\n view\n {\n // All sequencer transactions' times must be greater than or equal to the previous ones.\n require(\n _nextContext.timestamp >= _prevContext.timestamp,\n \"Context timestamp values must monotonically increase.\"\n );\n\n require(\n _nextContext.blockNumber >= _prevContext.blockNumber,\n \"Context blockNumber values must monotonically increase.\"\n );\n\n // If there is going to be a queue element pulled in from this context:\n if (_nextContext.numSubsequentQueueTransactions > 0) {\n _validateContextBeforeEnqueue(\n _nextContext,\n _nextQueueIndex,\n _queueRef\n );\n }\n }\n\n /**\n * Checks that the final batch context in a sequencer submission is valid.\n * @param _finalContext The batch context to validate.\n * @param _queueLength The length of the queue at the start of the batchAppend call.\n * @param _nextQueueIndex The next element in the queue that will be pulled into the CTC.\n * @param _queueRef The storage container for the queue.\n */\n function _validateFinalBatchContext(\n BatchContext memory _finalContext,\n uint40 _nextQueueIndex,\n uint40 _queueLength,\n iOVM_ChainStorageContainer _queueRef\n )\n internal\n view\n {\n // If the queue is not now empty, check the mononoticity of whatever the next batch that will come in is.\n if (_queueLength - _nextQueueIndex > 0 && _finalContext.numSubsequentQueueTransactions == 0) {\n _validateContextBeforeEnqueue(\n _finalContext,\n _nextQueueIndex,\n _queueRef\n );\n }\n // Batches cannot be added from the future, or subsequent enqueue() contexts would violate monotonicity.\n require(_finalContext.timestamp <= block.timestamp, \"Context timestamp is from the future.\");\n require(_finalContext.blockNumber <= block.number, \"Context block number is from the future.\");\n }\n\n /**\n * Hashes a transaction chain element.\n * @param _element Chain element to hash.\n * @return Hash of the chain element.\n */\n function _hashTransactionChainElement(\n Lib_OVMCodec.TransactionChainElement memory _element\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n return keccak256(\n abi.encode(\n _element.isSequenced,\n _element.queueIndex,\n _element.timestamp,\n _element.blockNumber,\n _element.txData\n )\n );\n }\n\n /**\n * Verifies a sequencer transaction, returning true if it was indeed included in the CTC\n * @param _transaction The transaction we are verifying inclusion of.\n * @param _txChainElement The chain element that the transaction is claimed to be a part of.\n * @param _batchHeader Header of the batch the transaction was included in.\n * @param _inclusionProof An inclusion proof into the CTC at a particular index.\n * @return True if the transaction was included in the specified location, else false.\n */\n function _verifySequencerTransaction(\n Lib_OVMCodec.Transaction memory _transaction,\n Lib_OVMCodec.TransactionChainElement memory _txChainElement,\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _inclusionProof\n )\n internal\n view\n returns (\n bool\n )\n {\n OVM_ExecutionManager ovmExecutionManager = OVM_ExecutionManager(resolve(\"OVM_ExecutionManager\"));\n uint256 gasLimit = ovmExecutionManager.getMaxTransactionGasLimit();\n bytes32 leafHash = _getSequencerLeafHash(_txChainElement);\n\n require(\n _verifyElement(\n leafHash,\n _batchHeader,\n _inclusionProof\n ),\n \"Invalid Sequencer transaction inclusion proof.\"\n );\n\n require(\n _transaction.blockNumber == _txChainElement.blockNumber\n && _transaction.timestamp == _txChainElement.timestamp\n && _transaction.entrypoint == resolve(\"OVM_DecompressionPrecompileAddress\")\n && _transaction.gasLimit == gasLimit\n && _transaction.l1TxOrigin == address(0)\n && _transaction.l1QueueOrigin == Lib_OVMCodec.QueueOrigin.SEQUENCER_QUEUE\n && keccak256(_transaction.data) == keccak256(_txChainElement.txData),\n \"Invalid Sequencer transaction.\"\n );\n\n return true;\n }\n\n /**\n * Verifies a queue transaction, returning true if it was indeed included in the CTC\n * @param _transaction The transaction we are verifying inclusion of.\n * @param _queueIndex The queueIndex of the queued transaction.\n * @param _batchHeader Header of the batch the transaction was included in.\n * @param _inclusionProof An inclusion proof into the CTC at a particular index (should point to queue tx).\n * @return True if the transaction was included in the specified location, else false.\n */\n function _verifyQueueTransaction(\n Lib_OVMCodec.Transaction memory _transaction,\n uint256 _queueIndex,\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _inclusionProof\n )\n internal\n view\n returns (\n bool\n )\n {\n bytes32 leafHash = _getQueueLeafHash(_queueIndex);\n\n require(\n _verifyElement(\n leafHash,\n _batchHeader,\n _inclusionProof\n ),\n \"Invalid Queue transaction inclusion proof.\"\n );\n\n bytes32 transactionHash = keccak256(\n abi.encode(\n _transaction.l1TxOrigin,\n _transaction.entrypoint,\n _transaction.gasLimit,\n _transaction.data\n )\n );\n\n Lib_OVMCodec.QueueElement memory el = getQueueElement(_queueIndex);\n require(\n el.transactionHash == transactionHash\n && el.timestamp == _transaction.timestamp\n && el.blockNumber == _transaction.blockNumber,\n \"Invalid Queue transaction.\"\n );\n\n return true;\n }\n\n /**\n * Verifies a batch inclusion proof.\n * @param _element Hash of the element to verify a proof for.\n * @param _batchHeader Header of the batch in which the element was included.\n * @param _proof Merkle inclusion proof for the element.\n */\n function _verifyElement(\n bytes32 _element,\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _proof\n )\n internal\n view\n returns (\n bool\n )\n {\n require(\n Lib_OVMCodec.hashBatchHeader(_batchHeader) == batches().get(uint32(_batchHeader.batchIndex)),\n \"Invalid batch header.\"\n );\n\n require(\n Lib_MerkleTree.verify(\n _batchHeader.batchRoot,\n _element,\n _proof.index,\n _proof.siblings,\n _batchHeader.batchSize\n ),\n \"Invalid inclusion proof.\"\n );\n\n return true;\n }\n}\n" + }, + "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol": { + "content": "// SPDX-License-Identifier: MIT\n// @unsupported: ovm\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\nimport { Lib_EthUtils } from \"../../libraries/utils/Lib_EthUtils.sol\";\nimport { Lib_ErrorUtils } from \"../../libraries/utils/Lib_ErrorUtils.sol\";\n\n/* Interface Imports */\nimport { iOVM_ExecutionManager } from \"../../iOVM/execution/iOVM_ExecutionManager.sol\";\nimport { iOVM_StateManager } from \"../../iOVM/execution/iOVM_StateManager.sol\";\nimport { iOVM_SafetyChecker } from \"../../iOVM/execution/iOVM_SafetyChecker.sol\";\n\n/* Contract Imports */\nimport { OVM_DeployerWhitelist } from \"../predeploys/OVM_DeployerWhitelist.sol\";\n\n/**\n * @title OVM_ExecutionManager\n * @dev The Execution Manager (EM) is the core of our OVM implementation, and provides a sandboxed\n * environment allowing us to execute OVM transactions deterministically on either Layer 1 or\n * Layer 2.\n * The EM's run() function is the first function called during the execution of any\n * transaction on L2.\n * For each context-dependent EVM operation the EM has a function which implements a corresponding\n * OVM operation, which will read state from the State Manager contract.\n * The EM relies on the Safety Checker to verify that code deployed to Layer 2 does not contain any\n * context-dependent operations.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract OVM_ExecutionManager is iOVM_ExecutionManager, Lib_AddressResolver {\n\n /********************************\n * External Contract References *\n ********************************/\n\n iOVM_SafetyChecker internal ovmSafetyChecker;\n iOVM_StateManager internal ovmStateManager;\n\n\n /*******************************\n * Execution Context Variables *\n *******************************/\n\n GasMeterConfig internal gasMeterConfig;\n GlobalContext internal globalContext;\n TransactionContext internal transactionContext;\n MessageContext internal messageContext;\n TransactionRecord internal transactionRecord;\n MessageRecord internal messageRecord;\n\n\n /**************************\n * Gas Metering Constants *\n **************************/\n\n address constant GAS_METADATA_ADDRESS = 0x06a506A506a506A506a506a506A506A506A506A5;\n uint256 constant NUISANCE_GAS_SLOAD = 20000;\n uint256 constant NUISANCE_GAS_SSTORE = 20000;\n uint256 constant MIN_NUISANCE_GAS_PER_CONTRACT = 30000;\n uint256 constant NUISANCE_GAS_PER_CONTRACT_BYTE = 100;\n uint256 constant MIN_GAS_FOR_INVALID_STATE_ACCESS = 30000;\n\n /**************************\n * Default Context Values *\n **************************/\n\n uint256 constant DEFAULT_UINT256 = 0xdefa017defa017defa017defa017defa017defa017defa017defa017defa017d;\n address constant DEFAULT_ADDRESS = 0xdEfa017defA017DeFA017DEfa017DeFA017DeFa0;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n constructor(\n address _libAddressManager,\n GasMeterConfig memory _gasMeterConfig,\n GlobalContext memory _globalContext\n )\n Lib_AddressResolver(_libAddressManager)\n {\n ovmSafetyChecker = iOVM_SafetyChecker(resolve(\"OVM_SafetyChecker\"));\n gasMeterConfig = _gasMeterConfig;\n globalContext = _globalContext;\n _resetContext();\n }\n\n\n /**********************\n * Function Modifiers *\n **********************/\n\n /**\n * Applies dynamically-sized refund to a transaction to account for the difference in execution\n * between L1 and L2, so that the overall cost of the ovmOPCODE is fixed.\n * @param _cost Desired gas cost for the function after the refund.\n */\n modifier netGasCost(\n uint256 _cost\n ) {\n uint256 gasProvided = gasleft();\n _;\n uint256 gasUsed = gasProvided - gasleft();\n\n // We want to refund everything *except* the specified cost.\n if (_cost < gasUsed) {\n transactionRecord.ovmGasRefund += gasUsed - _cost;\n }\n }\n\n /**\n * Applies a fixed-size gas refund to a transaction to account for the difference in execution\n * between L1 and L2, so that the overall cost of an ovmOPCODE can be lowered.\n * @param _discount Amount of gas cost to refund for the ovmOPCODE.\n */\n modifier fixedGasDiscount(\n uint256 _discount\n ) {\n uint256 gasProvided = gasleft();\n _;\n uint256 gasUsed = gasProvided - gasleft();\n\n // We want to refund the specified _discount, unless this risks underflow.\n if (_discount < gasUsed) {\n transactionRecord.ovmGasRefund += _discount;\n } else {\n // refund all we can without risking underflow.\n transactionRecord.ovmGasRefund += gasUsed;\n }\n }\n\n /**\n * Makes sure we're not inside a static context.\n */\n modifier notStatic() {\n if (messageContext.isStatic == true) {\n _revertWithFlag(RevertFlag.STATIC_VIOLATION);\n }\n _;\n }\n\n\n /************************************\n * Transaction Execution Entrypoint *\n ************************************/\n\n /**\n * Starts the execution of a transaction via the OVM_ExecutionManager.\n * @param _transaction Transaction data to be executed.\n * @param _ovmStateManager iOVM_StateManager implementation providing account state.\n */\n function run(\n Lib_OVMCodec.Transaction memory _transaction,\n address _ovmStateManager\n )\n override\n public\n returns (\n bytes memory\n )\n {\n // Make sure that run() is not re-enterable. This condition should always be satisfied\n // Once run has been called once, due to the behavior of _isValidInput().\n if (transactionContext.ovmNUMBER != DEFAULT_UINT256) {\n return bytes(\"\");\n }\n\n // Store our OVM_StateManager instance (significantly easier than attempting to pass the\n // address around in calldata).\n ovmStateManager = iOVM_StateManager(_ovmStateManager);\n\n // Make sure this function can't be called by anyone except the owner of the\n // OVM_StateManager (expected to be an OVM_StateTransitioner). We can revert here because\n // this would make the `run` itself invalid.\n require(\n // This method may return false during fraud proofs, but always returns true in L2 nodes' State Manager precompile.\n ovmStateManager.isAuthenticated(msg.sender),\n \"Only authenticated addresses in ovmStateManager can call this function\"\n );\n\n // Initialize the execution context, must be initialized before we perform any gas metering\n // or we'll throw a nuisance gas error.\n _initContext(_transaction);\n\n // TEMPORARY: Gas metering is disabled for minnet.\n // // Check whether we need to start a new epoch, do so if necessary.\n // _checkNeedsNewEpoch(_transaction.timestamp);\n\n // Make sure the transaction's gas limit is valid. We don't revert here because we reserve\n // reverts for INVALID_STATE_ACCESS.\n if (_isValidInput(_transaction) == false) {\n _resetContext();\n return bytes(\"\");\n }\n\n // TEMPORARY: Gas metering is disabled for minnet.\n // // Check gas right before the call to get total gas consumed by OVM transaction.\n // uint256 gasProvided = gasleft();\n\n // Run the transaction, make sure to meter the gas usage.\n (, bytes memory returndata) = ovmCALL(\n _transaction.gasLimit - gasMeterConfig.minTransactionGasLimit,\n _transaction.entrypoint,\n _transaction.data\n );\n\n // TEMPORARY: Gas metering is disabled for minnet.\n // // Update the cumulative gas based on the amount of gas used.\n // uint256 gasUsed = gasProvided - gasleft();\n // _updateCumulativeGas(gasUsed, _transaction.l1QueueOrigin);\n\n // Wipe the execution context.\n _resetContext();\n\n return returndata;\n }\n\n\n /******************************\n * Opcodes: Execution Context *\n ******************************/\n\n /**\n * @notice Overrides CALLER.\n * @return _CALLER Address of the CALLER within the current message context.\n */\n function ovmCALLER()\n override\n public\n view\n returns (\n address _CALLER\n )\n {\n return messageContext.ovmCALLER;\n }\n\n /**\n * @notice Overrides ADDRESS.\n * @return _ADDRESS Active ADDRESS within the current message context.\n */\n function ovmADDRESS()\n override\n public\n view\n returns (\n address _ADDRESS\n )\n {\n return messageContext.ovmADDRESS;\n }\n\n /**\n * @notice Overrides TIMESTAMP.\n * @return _TIMESTAMP Value of the TIMESTAMP within the transaction context.\n */\n function ovmTIMESTAMP()\n override\n public\n view\n returns (\n uint256 _TIMESTAMP\n )\n {\n return transactionContext.ovmTIMESTAMP;\n }\n\n /**\n * @notice Overrides NUMBER.\n * @return _NUMBER Value of the NUMBER within the transaction context.\n */\n function ovmNUMBER()\n override\n public\n view\n returns (\n uint256 _NUMBER\n )\n {\n return transactionContext.ovmNUMBER;\n }\n\n /**\n * @notice Overrides GASLIMIT.\n * @return _GASLIMIT Value of the block's GASLIMIT within the transaction context.\n */\n function ovmGASLIMIT()\n override\n public\n view\n returns (\n uint256 _GASLIMIT\n )\n {\n return transactionContext.ovmGASLIMIT;\n }\n\n /**\n * @notice Overrides CHAINID.\n * @return _CHAINID Value of the chain's CHAINID within the global context.\n */\n function ovmCHAINID()\n override\n public\n view\n returns (\n uint256 _CHAINID\n )\n {\n return globalContext.ovmCHAINID;\n }\n\n /*********************************\n * Opcodes: L2 Execution Context *\n *********************************/\n\n /**\n * @notice Specifies from which source (Sequencer or Queue) this transaction originated from.\n * @return _queueOrigin Enum indicating the ovmL1QUEUEORIGIN within the current message context.\n */\n function ovmL1QUEUEORIGIN()\n override\n public\n view\n returns (\n Lib_OVMCodec.QueueOrigin _queueOrigin\n )\n {\n return transactionContext.ovmL1QUEUEORIGIN;\n }\n\n /**\n * @notice Specifies which L1 account, if any, sent this transaction by calling enqueue().\n * @return _l1TxOrigin Address of the account which sent the tx into L2 from L1.\n */\n function ovmL1TXORIGIN()\n override\n public\n view\n returns (\n address _l1TxOrigin\n )\n {\n return transactionContext.ovmL1TXORIGIN;\n }\n\n /********************\n * Opcodes: Halting *\n ********************/\n\n /**\n * @notice Overrides REVERT.\n * @param _data Bytes data to pass along with the REVERT.\n */\n function ovmREVERT(\n bytes memory _data\n )\n override\n public\n {\n _revertWithFlag(RevertFlag.INTENTIONAL_REVERT, _data);\n }\n\n\n /******************************\n * Opcodes: Contract Creation *\n ******************************/\n\n /**\n * @notice Overrides CREATE.\n * @param _bytecode Code to be used to CREATE a new contract.\n * @return Address of the created contract.\n * @return Revert data, if and only if the creation threw an exception.\n */\n function ovmCREATE(\n bytes memory _bytecode\n )\n override\n public\n notStatic\n fixedGasDiscount(40000)\n returns (\n address,\n bytes memory\n )\n {\n // Creator is always the current ADDRESS.\n address creator = ovmADDRESS();\n\n // Check that the deployer is whitelisted, or\n // that arbitrary contract deployment has been enabled.\n _checkDeployerAllowed(creator);\n\n // Generate the correct CREATE address.\n address contractAddress = Lib_EthUtils.getAddressForCREATE(\n creator,\n _getAccountNonce(creator)\n );\n\n return _createContract(\n contractAddress,\n _bytecode\n );\n }\n\n /**\n * @notice Overrides CREATE2.\n * @param _bytecode Code to be used to CREATE2 a new contract.\n * @param _salt Value used to determine the contract's address.\n * @return Address of the created contract.\n * @return Revert data, if and only if the creation threw an exception.\n */\n function ovmCREATE2(\n bytes memory _bytecode,\n bytes32 _salt\n )\n override\n public\n notStatic\n fixedGasDiscount(40000)\n returns (\n address,\n bytes memory\n )\n {\n // Creator is always the current ADDRESS.\n address creator = ovmADDRESS();\n\n // Check that the deployer is whitelisted, or\n // that arbitrary contract deployment has been enabled.\n _checkDeployerAllowed(creator);\n\n // Generate the correct CREATE2 address.\n address contractAddress = Lib_EthUtils.getAddressForCREATE2(\n creator,\n _bytecode,\n _salt\n );\n\n return _createContract(\n contractAddress,\n _bytecode\n );\n }\n\n\n /*******************************\n * Account Abstraction Opcodes *\n ******************************/\n\n /**\n * Retrieves the nonce of the current ovmADDRESS.\n * @return _nonce Nonce of the current contract.\n */\n function ovmGETNONCE()\n override\n public\n returns (\n uint256 _nonce\n )\n {\n return _getAccountNonce(ovmADDRESS());\n }\n\n /**\n * Bumps the nonce of the current ovmADDRESS by one.\n */\n function ovmINCREMENTNONCE()\n override\n public\n notStatic\n {\n address account = ovmADDRESS();\n uint256 nonce = _getAccountNonce(account);\n\n // Prevent overflow.\n if (nonce + 1 > nonce) {\n _setAccountNonce(account, nonce + 1);\n }\n }\n\n /**\n * Creates a new EOA contract account, for account abstraction.\n * @dev Essentially functions like ovmCREATE or ovmCREATE2, but we can bypass a lot of checks\n * because the contract we're creating is trusted (no need to do safety checking or to\n * handle unexpected reverts). Doesn't need to return an address because the address is\n * assumed to be the user's actual address.\n * @param _messageHash Hash of a message signed by some user, for verification.\n * @param _v Signature `v` parameter.\n * @param _r Signature `r` parameter.\n * @param _s Signature `s` parameter.\n */\n function ovmCREATEEOA(\n bytes32 _messageHash,\n uint8 _v,\n bytes32 _r,\n bytes32 _s\n )\n override\n public\n notStatic\n {\n // Recover the EOA address from the message hash and signature parameters. Since we do the\n // hashing in advance, we don't have handle different message hashing schemes. Even if this\n // function were to return the wrong address (rather than explicitly returning the zero\n // address), the rest of the transaction would simply fail (since there's no EOA account to\n // actually execute the transaction).\n address eoa = ecrecover(\n _messageHash,\n _v + 27,\n _r,\n _s\n );\n\n // Invalid signature is a case we proactively handle with a revert. We could alternatively\n // have this function return a `success` boolean, but this is just easier.\n if (eoa == address(0)) {\n ovmREVERT(bytes(\"Signature provided for EOA contract creation is invalid.\"));\n }\n\n // If the user already has an EOA account, then there's no need to perform this operation.\n if (_hasEmptyAccount(eoa) == false) {\n return;\n }\n\n // We always need to initialize the contract with the default account values.\n _initPendingAccount(eoa);\n\n // Temporarily set the current address so it's easier to access on L2.\n address prevADDRESS = messageContext.ovmADDRESS;\n messageContext.ovmADDRESS = eoa;\n\n // Creates a duplicate of the OVM_ProxyEOA located at 0x42....09. Uses the following\n // \"magic\" prefix to deploy an exact copy of the code:\n // PUSH1 0x0D # size of this prefix in bytes\n // CODESIZE\n // SUB # subtract prefix size from codesize\n // DUP1\n // PUSH1 0x0D\n // PUSH1 0x00\n // CODECOPY # copy everything after prefix into memory at pos 0\n // PUSH1 0x00\n // RETURN # return the copied code\n address proxyEOA = Lib_EthUtils.createContract(abi.encodePacked(\n hex\"600D380380600D6000396000f3\",\n ovmEXTCODECOPY(\n 0x4200000000000000000000000000000000000009,\n 0,\n ovmEXTCODESIZE(0x4200000000000000000000000000000000000009)\n )\n ));\n\n // Reset the address now that we're done deploying.\n messageContext.ovmADDRESS = prevADDRESS;\n\n // Commit the account with its final values.\n _commitPendingAccount(\n eoa,\n address(proxyEOA),\n keccak256(Lib_EthUtils.getCode(address(proxyEOA)))\n );\n\n _setAccountNonce(eoa, 0);\n }\n\n\n /*********************************\n * Opcodes: Contract Interaction *\n *********************************/\n\n /**\n * @notice Overrides CALL.\n * @param _gasLimit Amount of gas to be passed into this call.\n * @param _address Address of the contract to call.\n * @param _calldata Data to send along with the call.\n * @return _success Whether or not the call returned (rather than reverted).\n * @return _returndata Data returned by the call.\n */\n function ovmCALL(\n uint256 _gasLimit,\n address _address,\n bytes memory _calldata\n )\n override\n public\n fixedGasDiscount(100000)\n returns (\n bool _success,\n bytes memory _returndata\n )\n {\n // CALL updates the CALLER and ADDRESS.\n MessageContext memory nextMessageContext = messageContext;\n nextMessageContext.ovmCALLER = nextMessageContext.ovmADDRESS;\n nextMessageContext.ovmADDRESS = _address;\n\n return _callContract(\n nextMessageContext,\n _gasLimit,\n _address,\n _calldata\n );\n }\n\n /**\n * @notice Overrides STATICCALL.\n * @param _gasLimit Amount of gas to be passed into this call.\n * @param _address Address of the contract to call.\n * @param _calldata Data to send along with the call.\n * @return _success Whether or not the call returned (rather than reverted).\n * @return _returndata Data returned by the call.\n */\n function ovmSTATICCALL(\n uint256 _gasLimit,\n address _address,\n bytes memory _calldata\n )\n override\n public\n fixedGasDiscount(80000)\n returns (\n bool _success,\n bytes memory _returndata\n )\n {\n // STATICCALL updates the CALLER, updates the ADDRESS, and runs in a static context.\n MessageContext memory nextMessageContext = messageContext;\n nextMessageContext.ovmCALLER = nextMessageContext.ovmADDRESS;\n nextMessageContext.ovmADDRESS = _address;\n nextMessageContext.isStatic = true;\n\n return _callContract(\n nextMessageContext,\n _gasLimit,\n _address,\n _calldata\n );\n }\n\n /**\n * @notice Overrides DELEGATECALL.\n * @param _gasLimit Amount of gas to be passed into this call.\n * @param _address Address of the contract to call.\n * @param _calldata Data to send along with the call.\n * @return _success Whether or not the call returned (rather than reverted).\n * @return _returndata Data returned by the call.\n */\n function ovmDELEGATECALL(\n uint256 _gasLimit,\n address _address,\n bytes memory _calldata\n )\n override\n public\n fixedGasDiscount(40000)\n returns (\n bool _success,\n bytes memory _returndata\n )\n {\n // DELEGATECALL does not change anything about the message context.\n MessageContext memory nextMessageContext = messageContext;\n\n return _callContract(\n nextMessageContext,\n _gasLimit,\n _address,\n _calldata\n );\n }\n\n\n /************************************\n * Opcodes: Contract Storage Access *\n ************************************/\n\n /**\n * @notice Overrides SLOAD.\n * @param _key 32 byte key of the storage slot to load.\n * @return _value 32 byte value of the requested storage slot.\n */\n function ovmSLOAD(\n bytes32 _key\n )\n override\n public\n netGasCost(40000)\n returns (\n bytes32 _value\n )\n {\n // We always SLOAD from the storage of ADDRESS.\n address contractAddress = ovmADDRESS();\n\n return _getContractStorage(\n contractAddress,\n _key\n );\n }\n\n /**\n * @notice Overrides SSTORE.\n * @param _key 32 byte key of the storage slot to set.\n * @param _value 32 byte value for the storage slot.\n */\n function ovmSSTORE(\n bytes32 _key,\n bytes32 _value\n )\n override\n public\n notStatic\n netGasCost(60000)\n {\n // We always SSTORE to the storage of ADDRESS.\n address contractAddress = ovmADDRESS();\n\n _putContractStorage(\n contractAddress,\n _key,\n _value\n );\n }\n\n\n /*********************************\n * Opcodes: Contract Code Access *\n *********************************/\n\n /**\n * @notice Overrides EXTCODECOPY.\n * @param _contract Address of the contract to copy code from.\n * @param _offset Offset in bytes from the start of contract code to copy beyond.\n * @param _length Total number of bytes to copy from the contract's code.\n * @return _code Bytes of code copied from the requested contract.\n */\n function ovmEXTCODECOPY(\n address _contract,\n uint256 _offset,\n uint256 _length\n )\n override\n public\n returns (\n bytes memory _code\n )\n {\n return Lib_EthUtils.getCode(\n _getAccountEthAddress(_contract),\n _offset,\n _length\n );\n }\n\n /**\n * @notice Overrides EXTCODESIZE.\n * @param _contract Address of the contract to query the size of.\n * @return _EXTCODESIZE Size of the requested contract in bytes.\n */\n function ovmEXTCODESIZE(\n address _contract\n )\n override\n public\n returns (\n uint256 _EXTCODESIZE\n )\n {\n return Lib_EthUtils.getCodeSize(\n _getAccountEthAddress(_contract)\n );\n }\n\n /**\n * @notice Overrides EXTCODEHASH.\n * @param _contract Address of the contract to query the hash of.\n * @return _EXTCODEHASH Hash of the requested contract.\n */\n function ovmEXTCODEHASH(\n address _contract\n )\n override\n public\n returns (\n bytes32 _EXTCODEHASH\n )\n {\n return Lib_EthUtils.getCodeHash(\n _getAccountEthAddress(_contract)\n );\n }\n\n /***************************************\n * Public Functions: Execution Context *\n ***************************************/\n\n function getMaxTransactionGasLimit()\n external\n view\n override\n returns (\n uint256 _maxTransactionGasLimit\n )\n {\n return gasMeterConfig.maxTransactionGasLimit;\n }\n\n /********************************************\n * Public Functions: Deployment Whitelisting *\n ********************************************/\n\n /**\n * Checks whether the given address is on the whitelist to ovmCREATE/ovmCREATE2, and reverts if not.\n * @param _deployerAddress Address attempting to deploy a contract.\n */\n function _checkDeployerAllowed(\n address _deployerAddress\n )\n internal\n {\n // From an OVM semantics perspective, this will appear identical to\n // the deployer ovmCALLing the whitelist. This is fine--in a sense, we are forcing them to.\n (bool success, bytes memory data) = ovmCALL(\n gasleft(),\n 0x4200000000000000000000000000000000000002,\n abi.encodeWithSignature(\"isDeployerAllowed(address)\", _deployerAddress)\n );\n bool isAllowed = abi.decode(data, (bool));\n\n if (!isAllowed || !success) {\n _revertWithFlag(RevertFlag.CREATOR_NOT_ALLOWED);\n }\n }\n\n /********************************************\n * Internal Functions: Contract Interaction *\n ********************************************/\n\n /**\n * Creates a new contract and associates it with some contract address.\n * @param _contractAddress Address to associate the created contract with.\n * @param _bytecode Bytecode to be used to create the contract.\n * @return Final OVM contract address.\n * @return Revertdata, if and only if the creation threw an exception.\n */\n function _createContract(\n address _contractAddress,\n bytes memory _bytecode\n )\n internal\n returns (\n address,\n bytes memory\n )\n {\n // We always update the nonce of the creating account, even if the creation fails.\n _setAccountNonce(ovmADDRESS(), _getAccountNonce(ovmADDRESS()) + 1);\n\n // We're stepping into a CREATE or CREATE2, so we need to update ADDRESS to point\n // to the contract's associated address and CALLER to point to the previous ADDRESS.\n MessageContext memory nextMessageContext = messageContext;\n nextMessageContext.ovmCALLER = messageContext.ovmADDRESS;\n nextMessageContext.ovmADDRESS = _contractAddress;\n\n // Run the common logic which occurs between call-type and create-type messages,\n // passing in the creation bytecode and `true` to trigger create-specific logic.\n (bool success, bytes memory data) = _handleExternalMessage(\n nextMessageContext,\n gasleft(),\n _contractAddress,\n _bytecode,\n true\n );\n\n // Yellow paper requires that address returned is zero if the contract deployment fails.\n return (\n success ? _contractAddress : address(0),\n data\n );\n }\n\n /**\n * Calls the deployed contract associated with a given address.\n * @param _nextMessageContext Message context to be used for the call.\n * @param _gasLimit Amount of gas to be passed into this call.\n * @param _contract OVM address to be called.\n * @param _calldata Data to send along with the call.\n * @return _success Whether or not the call returned (rather than reverted).\n * @return _returndata Data returned by the call.\n */\n function _callContract(\n MessageContext memory _nextMessageContext,\n uint256 _gasLimit,\n address _contract,\n bytes memory _calldata\n )\n internal\n returns (\n bool _success,\n bytes memory _returndata\n )\n {\n // We reserve addresses of the form 0xdeaddeaddead...NNNN for the container contracts in L2 geth.\n // So, we block calls to these addresses since they are not safe to run as an OVM contract itself.\n if (\n (uint256(_contract) & uint256(0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000))\n == uint256(0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000)\n ) {\n // EVM does not return data in the success case, see: https://github.com/ethereum/go-ethereum/blob/aae7660410f0ef90279e14afaaf2f429fdc2a186/core/vm/instructions.go#L600-L604\n return (true, hex'');\n }\n\n // Both 0x0000... and the EVM precompiles have the same address on L1 and L2 --> no trie lookup needed.\n address codeContractAddress =\n uint(_contract) < 100\n ? _contract\n : _getAccountEthAddress(_contract);\n\n return _handleExternalMessage(\n _nextMessageContext,\n _gasLimit,\n codeContractAddress,\n _calldata,\n false\n );\n }\n\n /**\n * Handles all interactions which involve the execution manager calling out to untrusted code (both calls and creates).\n * Ensures that OVM-related measures are enforced, including L2 gas refunds, nuisance gas, and flagged reversions.\n *\n * @param _nextMessageContext Message context to be used for the external message.\n * @param _gasLimit Amount of gas to be passed into this message.\n * @param _contract OVM address being called or deployed to\n * @param _data Data for the message (either calldata or creation code)\n * @param _isCreate Whether this is a create-type message.\n * @return Whether or not the message (either a call or deployment) succeeded.\n * @return Data returned by the message.\n */\n function _handleExternalMessage(\n MessageContext memory _nextMessageContext,\n uint256 _gasLimit,\n address _contract,\n bytes memory _data,\n bool _isCreate\n )\n internal\n returns (\n bool,\n bytes memory\n )\n {\n // We need to switch over to our next message context for the duration of this call.\n MessageContext memory prevMessageContext = messageContext;\n _switchMessageContext(prevMessageContext, _nextMessageContext);\n\n // Nuisance gas is a system used to bound the ability for an attacker to make fraud proofs\n // expensive by touching a lot of different accounts or storage slots. Since most contracts\n // only use a few storage slots during any given transaction, this shouldn't be a limiting\n // factor.\n uint256 prevNuisanceGasLeft = messageRecord.nuisanceGasLeft;\n uint256 nuisanceGasLimit = _getNuisanceGasLimit(_gasLimit);\n messageRecord.nuisanceGasLeft = nuisanceGasLimit;\n\n // Make the call and make sure to pass in the gas limit. Another instance of hidden\n // complexity. `_contract` is guaranteed to be a safe contract, meaning its return/revert\n // behavior can be controlled. In particular, we enforce that flags are passed through\n // revert data as to retrieve execution metadata that would normally be reverted out of\n // existence.\n\n bool success;\n bytes memory returndata;\n if (_isCreate) {\n // safeCREATE() is a function which replicates a CREATE message, but uses return values\n // Which match that of CALL (i.e. bool, bytes). This allows many security checks to be\n // to be shared between untrusted call and create call frames.\n (success, returndata) = address(this).call(\n abi.encodeWithSelector(\n this.safeCREATE.selector,\n _gasLimit,\n _data,\n _contract\n )\n );\n } else {\n (success, returndata) = _contract.call{gas: _gasLimit}(_data);\n }\n\n // Switch back to the original message context now that we're out of the call.\n _switchMessageContext(_nextMessageContext, prevMessageContext);\n\n // Assuming there were no reverts, the message record should be accurate here. We'll update\n // this value in the case of a revert.\n uint256 nuisanceGasLeft = messageRecord.nuisanceGasLeft;\n\n // Reverts at this point are completely OK, but we need to make a few updates based on the\n // information passed through the revert.\n if (success == false) {\n (\n RevertFlag flag,\n uint256 nuisanceGasLeftPostRevert,\n uint256 ovmGasRefund,\n bytes memory returndataFromFlag\n ) = _decodeRevertData(returndata);\n\n // INVALID_STATE_ACCESS is the only flag that triggers an immediate abort of the\n // parent EVM message. This behavior is necessary because INVALID_STATE_ACCESS must\n // halt any further transaction execution that could impact the execution result.\n if (flag == RevertFlag.INVALID_STATE_ACCESS) {\n _revertWithFlag(flag);\n }\n\n // INTENTIONAL_REVERT, UNSAFE_BYTECODE, STATIC_VIOLATION, and CREATOR_NOT_ALLOWED aren't\n // dependent on the input state, so we can just handle them like standard reverts. Our only change here\n // is to record the gas refund reported by the call (enforced by safety checking).\n if (\n flag == RevertFlag.INTENTIONAL_REVERT\n || flag == RevertFlag.UNSAFE_BYTECODE\n || flag == RevertFlag.STATIC_VIOLATION\n || flag == RevertFlag.CREATOR_NOT_ALLOWED\n ) {\n transactionRecord.ovmGasRefund = ovmGasRefund;\n }\n\n // INTENTIONAL_REVERT needs to pass up the user-provided return data encoded into the\n // flag, *not* the full encoded flag. All other revert types return no data.\n if (\n flag == RevertFlag.INTENTIONAL_REVERT\n || _isCreate\n ) {\n returndata = returndataFromFlag;\n } else {\n returndata = hex'';\n }\n\n // Reverts mean we need to use up whatever \"nuisance gas\" was used by the call.\n // EXCEEDS_NUISANCE_GAS explicitly reduces the remaining nuisance gas for this message\n // to zero. OUT_OF_GAS is a \"pseudo\" flag given that messages return no data when they\n // run out of gas, so we have to treat this like EXCEEDS_NUISANCE_GAS. All other flags\n // will simply pass up the remaining nuisance gas.\n nuisanceGasLeft = nuisanceGasLeftPostRevert;\n }\n\n // We need to reset the nuisance gas back to its original value minus the amount used here.\n messageRecord.nuisanceGasLeft = prevNuisanceGasLeft - (nuisanceGasLimit - nuisanceGasLeft);\n\n return (\n success,\n returndata\n );\n }\n\n /**\n * Handles the creation-specific safety measures required for OVM contract deployment.\n * This function sanitizes the return types for creation messages to match calls (bool, bytes),\n * by being an external function which the EM can call, that mimics the success/fail case of the CREATE.\n * This allows for consistent handling of both types of messages in _handleExternalMessage().\n * Having this step occur as a separate call frame also allows us to easily revert the\n * contract deployment in the event that the code is unsafe.\n *\n * @param _gasLimit Amount of gas to be passed into this creation.\n * @param _creationCode Code to pass into CREATE for deployment.\n * @param _address OVM address being deployed to.\n */\n function safeCREATE(\n uint _gasLimit,\n bytes memory _creationCode,\n address _address\n )\n external\n {\n // The only way this should callable is from within _createContract(),\n // and it should DEFINITELY not be callable by a non-EM code contract.\n if (msg.sender != address(this)) {\n return;\n }\n // Check that there is not already code at this address.\n if (_hasEmptyAccount(_address) == false) {\n // Note: in the EVM, this case burns all allotted gas. For improved\n // developer experience, we do return the remaining gas.\n _revertWithFlag(\n RevertFlag.CREATE_COLLISION,\n Lib_ErrorUtils.encodeRevertString(\"A contract has already been deployed to this address\")\n );\n }\n\n // Check the creation bytecode against the OVM_SafetyChecker.\n if (ovmSafetyChecker.isBytecodeSafe(_creationCode) == false) {\n _revertWithFlag(\n RevertFlag.UNSAFE_BYTECODE,\n Lib_ErrorUtils.encodeRevertString(\"Contract creation code contains unsafe opcodes. Did you use the right compiler or pass an unsafe constructor argument?\")\n );\n }\n\n // We always need to initialize the contract with the default account values.\n _initPendingAccount(_address);\n\n // Actually execute the EVM create message.\n // NOTE: The inline assembly below means we can NOT make any evm calls between here and then.\n address ethAddress = Lib_EthUtils.createContract(_creationCode);\n\n if (ethAddress == address(0)) {\n // If the creation fails, the EVM lets us grab its revert data. This may contain a revert flag\n // to be used above in _handleExternalMessage, so we pass the revert data back up unmodified.\n assembly {\n returndatacopy(0,0,returndatasize())\n revert(0, returndatasize())\n }\n }\n\n // Again simply checking that the deployed code is safe too. Contracts can generate\n // arbitrary deployment code, so there's no easy way to analyze this beforehand.\n bytes memory deployedCode = Lib_EthUtils.getCode(ethAddress);\n if (ovmSafetyChecker.isBytecodeSafe(deployedCode) == false) {\n _revertWithFlag(\n RevertFlag.UNSAFE_BYTECODE,\n Lib_ErrorUtils.encodeRevertString(\"Constructor attempted to deploy unsafe bytecode.\")\n );\n }\n\n // Contract creation didn't need to be reverted and the bytecode is safe. We finish up by\n // associating the desired address with the newly created contract's code hash and address.\n _commitPendingAccount(\n _address,\n ethAddress,\n Lib_EthUtils.getCodeHash(ethAddress)\n );\n }\n\n /******************************************\n * Internal Functions: State Manipulation *\n ******************************************/\n\n /**\n * Checks whether an account exists within the OVM_StateManager.\n * @param _address Address of the account to check.\n * @return _exists Whether or not the account exists.\n */\n function _hasAccount(\n address _address\n )\n internal\n returns (\n bool _exists\n )\n {\n _checkAccountLoad(_address);\n return ovmStateManager.hasAccount(_address);\n }\n\n /**\n * Checks whether a known empty account exists within the OVM_StateManager.\n * @param _address Address of the account to check.\n * @return _exists Whether or not the account empty exists.\n */\n function _hasEmptyAccount(\n address _address\n )\n internal\n returns (\n bool _exists\n )\n {\n _checkAccountLoad(_address);\n return ovmStateManager.hasEmptyAccount(_address);\n }\n\n /**\n * Sets the nonce of an account.\n * @param _address Address of the account to modify.\n * @param _nonce New account nonce.\n */\n function _setAccountNonce(\n address _address,\n uint256 _nonce\n )\n internal\n {\n _checkAccountChange(_address);\n ovmStateManager.setAccountNonce(_address, _nonce);\n }\n\n /**\n * Gets the nonce of an account.\n * @param _address Address of the account to access.\n * @return _nonce Nonce of the account.\n */\n function _getAccountNonce(\n address _address\n )\n internal\n returns (\n uint256 _nonce\n )\n {\n _checkAccountLoad(_address);\n return ovmStateManager.getAccountNonce(_address);\n }\n\n /**\n * Retrieves the Ethereum address of an account.\n * @param _address Address of the account to access.\n * @return _ethAddress Corresponding Ethereum address.\n */\n function _getAccountEthAddress(\n address _address\n )\n internal\n returns (\n address _ethAddress\n )\n {\n _checkAccountLoad(_address);\n return ovmStateManager.getAccountEthAddress(_address);\n }\n\n /**\n * Creates the default account object for the given address.\n * @param _address Address of the account create.\n */\n function _initPendingAccount(\n address _address\n )\n internal\n {\n // Although it seems like `_checkAccountChange` would be more appropriate here, we don't\n // actually consider an account \"changed\" until it's inserted into the state (in this case\n // by `_commitPendingAccount`).\n _checkAccountLoad(_address);\n ovmStateManager.initPendingAccount(_address);\n }\n\n /**\n * Stores additional relevant data for a new account, thereby \"committing\" it to the state.\n * This function is only called during `ovmCREATE` and `ovmCREATE2` after a successful contract\n * creation.\n * @param _address Address of the account to commit.\n * @param _ethAddress Address of the associated deployed contract.\n * @param _codeHash Hash of the code stored at the address.\n */\n function _commitPendingAccount(\n address _address,\n address _ethAddress,\n bytes32 _codeHash\n )\n internal\n {\n _checkAccountChange(_address);\n ovmStateManager.commitPendingAccount(\n _address,\n _ethAddress,\n _codeHash\n );\n }\n\n /**\n * Retrieves the value of a storage slot.\n * @param _contract Address of the contract to query.\n * @param _key 32 byte key of the storage slot.\n * @return _value 32 byte storage slot value.\n */\n function _getContractStorage(\n address _contract,\n bytes32 _key\n )\n internal\n returns (\n bytes32 _value\n )\n {\n _checkContractStorageLoad(_contract, _key);\n return ovmStateManager.getContractStorage(_contract, _key);\n }\n\n /**\n * Sets the value of a storage slot.\n * @param _contract Address of the contract to modify.\n * @param _key 32 byte key of the storage slot.\n * @param _value 32 byte storage slot value.\n */\n function _putContractStorage(\n address _contract,\n bytes32 _key,\n bytes32 _value\n )\n internal\n {\n // We don't set storage if the value didn't change. Although this acts as a convenient\n // optimization, it's also necessary to avoid the case in which a contract with no storage\n // attempts to store the value \"0\" at any key. Putting this value (and therefore requiring\n // that the value be committed into the storage trie after execution) would incorrectly\n // modify the storage root.\n if (_getContractStorage(_contract, _key) == _value) {\n return;\n }\n\n _checkContractStorageChange(_contract, _key);\n ovmStateManager.putContractStorage(_contract, _key, _value);\n }\n\n /**\n * Validation whenever a contract needs to be loaded. Checks that the account exists, charges\n * nuisance gas if the account hasn't been loaded before.\n * @param _address Address of the account to load.\n */\n function _checkAccountLoad(\n address _address\n )\n internal\n {\n // See `_checkContractStorageLoad` for more information.\n if (gasleft() < MIN_GAS_FOR_INVALID_STATE_ACCESS) {\n _revertWithFlag(RevertFlag.OUT_OF_GAS);\n }\n\n // See `_checkContractStorageLoad` for more information.\n if (ovmStateManager.hasAccount(_address) == false) {\n _revertWithFlag(RevertFlag.INVALID_STATE_ACCESS);\n }\n\n // Check whether the account has been loaded before and mark it as loaded if not. We need\n // this because \"nuisance gas\" only applies to the first time that an account is loaded.\n (\n bool _wasAccountAlreadyLoaded\n ) = ovmStateManager.testAndSetAccountLoaded(_address);\n\n // If we hadn't already loaded the account, then we'll need to charge \"nuisance gas\" based\n // on the size of the contract code.\n if (_wasAccountAlreadyLoaded == false) {\n _useNuisanceGas(\n (Lib_EthUtils.getCodeSize(_getAccountEthAddress(_address)) * NUISANCE_GAS_PER_CONTRACT_BYTE) + MIN_NUISANCE_GAS_PER_CONTRACT\n );\n }\n }\n\n /**\n * Validation whenever a contract needs to be changed. Checks that the account exists, charges\n * nuisance gas if the account hasn't been changed before.\n * @param _address Address of the account to change.\n */\n function _checkAccountChange(\n address _address\n )\n internal\n {\n // Start by checking for a load as we only want to charge nuisance gas proportional to\n // contract size once.\n _checkAccountLoad(_address);\n\n // Check whether the account has been changed before and mark it as changed if not. We need\n // this because \"nuisance gas\" only applies to the first time that an account is changed.\n (\n bool _wasAccountAlreadyChanged\n ) = ovmStateManager.testAndSetAccountChanged(_address);\n\n // If we hadn't already loaded the account, then we'll need to charge \"nuisance gas\" based\n // on the size of the contract code.\n if (_wasAccountAlreadyChanged == false) {\n ovmStateManager.incrementTotalUncommittedAccounts();\n _useNuisanceGas(\n (Lib_EthUtils.getCodeSize(_getAccountEthAddress(_address)) * NUISANCE_GAS_PER_CONTRACT_BYTE) + MIN_NUISANCE_GAS_PER_CONTRACT\n );\n }\n }\n\n /**\n * Validation whenever a slot needs to be loaded. Checks that the account exists, charges\n * nuisance gas if the slot hasn't been loaded before.\n * @param _contract Address of the account to load from.\n * @param _key 32 byte key to load.\n */\n function _checkContractStorageLoad(\n address _contract,\n bytes32 _key\n )\n internal\n {\n // Another case of hidden complexity. If we didn't enforce this requirement, then a\n // contract could pass in just enough gas to cause the INVALID_STATE_ACCESS check to fail\n // on L1 but not on L2. A contract could use this behavior to prevent the\n // OVM_ExecutionManager from detecting an invalid state access. Reverting with OUT_OF_GAS\n // allows us to also charge for the full message nuisance gas, because you deserve that for\n // trying to break the contract in this way.\n if (gasleft() < MIN_GAS_FOR_INVALID_STATE_ACCESS) {\n _revertWithFlag(RevertFlag.OUT_OF_GAS);\n }\n\n // We need to make sure that the transaction isn't trying to access storage that hasn't\n // been provided to the OVM_StateManager. We'll immediately abort if this is the case.\n // We know that we have enough gas to do this check because of the above test.\n if (ovmStateManager.hasContractStorage(_contract, _key) == false) {\n _revertWithFlag(RevertFlag.INVALID_STATE_ACCESS);\n }\n\n // Check whether the slot has been loaded before and mark it as loaded if not. We need\n // this because \"nuisance gas\" only applies to the first time that a slot is loaded.\n (\n bool _wasContractStorageAlreadyLoaded\n ) = ovmStateManager.testAndSetContractStorageLoaded(_contract, _key);\n\n // If we hadn't already loaded the account, then we'll need to charge some fixed amount of\n // \"nuisance gas\".\n if (_wasContractStorageAlreadyLoaded == false) {\n _useNuisanceGas(NUISANCE_GAS_SLOAD);\n }\n }\n\n /**\n * Validation whenever a slot needs to be changed. Checks that the account exists, charges\n * nuisance gas if the slot hasn't been changed before.\n * @param _contract Address of the account to change.\n * @param _key 32 byte key to change.\n */\n function _checkContractStorageChange(\n address _contract,\n bytes32 _key\n )\n internal\n {\n // Start by checking for load to make sure we have the storage slot and that we charge the\n // \"nuisance gas\" necessary to prove the storage slot state.\n _checkContractStorageLoad(_contract, _key);\n\n // Check whether the slot has been changed before and mark it as changed if not. We need\n // this because \"nuisance gas\" only applies to the first time that a slot is changed.\n (\n bool _wasContractStorageAlreadyChanged\n ) = ovmStateManager.testAndSetContractStorageChanged(_contract, _key);\n\n // If we hadn't already changed the account, then we'll need to charge some fixed amount of\n // \"nuisance gas\".\n if (_wasContractStorageAlreadyChanged == false) {\n // Changing a storage slot means that we're also going to have to change the\n // corresponding account, so do an account change check.\n _checkAccountChange(_contract);\n\n ovmStateManager.incrementTotalUncommittedContractStorage();\n _useNuisanceGas(NUISANCE_GAS_SSTORE);\n }\n }\n\n\n /************************************\n * Internal Functions: Revert Logic *\n ************************************/\n\n /**\n * Simple encoding for revert data.\n * @param _flag Flag to revert with.\n * @param _data Additional user-provided revert data.\n * @return _revertdata Encoded revert data.\n */\n function _encodeRevertData(\n RevertFlag _flag,\n bytes memory _data\n )\n internal\n view\n returns (\n bytes memory _revertdata\n )\n {\n // Out of gas and create exceptions will fundamentally return no data, so simulating it shouldn't either.\n if (\n _flag == RevertFlag.OUT_OF_GAS\n ) {\n return bytes('');\n }\n\n // INVALID_STATE_ACCESS doesn't need to return any data other than the flag.\n if (_flag == RevertFlag.INVALID_STATE_ACCESS) {\n return abi.encode(\n _flag,\n 0,\n 0,\n bytes('')\n );\n }\n\n // Just ABI encode the rest of the parameters.\n return abi.encode(\n _flag,\n messageRecord.nuisanceGasLeft,\n transactionRecord.ovmGasRefund,\n _data\n );\n }\n\n /**\n * Simple decoding for revert data.\n * @param _revertdata Revert data to decode.\n * @return _flag Flag used to revert.\n * @return _nuisanceGasLeft Amount of nuisance gas unused by the message.\n * @return _ovmGasRefund Amount of gas refunded during the message.\n * @return _data Additional user-provided revert data.\n */\n function _decodeRevertData(\n bytes memory _revertdata\n )\n internal\n pure\n returns (\n RevertFlag _flag,\n uint256 _nuisanceGasLeft,\n uint256 _ovmGasRefund,\n bytes memory _data\n )\n {\n // A length of zero means the call ran out of gas, just return empty data.\n if (_revertdata.length == 0) {\n return (\n RevertFlag.OUT_OF_GAS,\n 0,\n 0,\n bytes('')\n );\n }\n\n // ABI decode the incoming data.\n return abi.decode(_revertdata, (RevertFlag, uint256, uint256, bytes));\n }\n\n /**\n * Causes a message to revert or abort.\n * @param _flag Flag to revert with.\n * @param _data Additional user-provided data.\n */\n function _revertWithFlag(\n RevertFlag _flag,\n bytes memory _data\n )\n internal\n view\n {\n bytes memory revertdata = _encodeRevertData(\n _flag,\n _data\n );\n\n assembly {\n revert(add(revertdata, 0x20), mload(revertdata))\n }\n }\n\n /**\n * Causes a message to revert or abort.\n * @param _flag Flag to revert with.\n */\n function _revertWithFlag(\n RevertFlag _flag\n )\n internal\n {\n _revertWithFlag(_flag, bytes(''));\n }\n\n\n /******************************************\n * Internal Functions: Nuisance Gas Logic *\n ******************************************/\n\n /**\n * Computes the nuisance gas limit from the gas limit.\n * @dev This function is currently using a naive implementation whereby the nuisance gas limit\n * is set to exactly equal the lesser of the gas limit or remaining gas. It's likely that\n * this implementation is perfectly fine, but we may change this formula later.\n * @param _gasLimit Gas limit to compute from.\n * @return _nuisanceGasLimit Computed nuisance gas limit.\n */\n function _getNuisanceGasLimit(\n uint256 _gasLimit\n )\n internal\n view\n returns (\n uint256 _nuisanceGasLimit\n )\n {\n return _gasLimit < gasleft() ? _gasLimit : gasleft();\n }\n\n /**\n * Uses a certain amount of nuisance gas.\n * @param _amount Amount of nuisance gas to use.\n */\n function _useNuisanceGas(\n uint256 _amount\n )\n internal\n {\n // Essentially the same as a standard OUT_OF_GAS, except we also retain a record of the gas\n // refund to be given at the end of the transaction.\n if (messageRecord.nuisanceGasLeft < _amount) {\n _revertWithFlag(RevertFlag.EXCEEDS_NUISANCE_GAS);\n }\n\n messageRecord.nuisanceGasLeft -= _amount;\n }\n\n\n /************************************\n * Internal Functions: Gas Metering *\n ************************************/\n\n /**\n * Checks whether a transaction needs to start a new epoch and does so if necessary.\n * @param _timestamp Transaction timestamp.\n */\n function _checkNeedsNewEpoch(\n uint256 _timestamp\n )\n internal\n {\n if (\n _timestamp >= (\n _getGasMetadata(GasMetadataKey.CURRENT_EPOCH_START_TIMESTAMP)\n + gasMeterConfig.secondsPerEpoch\n )\n ) {\n _putGasMetadata(\n GasMetadataKey.CURRENT_EPOCH_START_TIMESTAMP,\n _timestamp\n );\n\n _putGasMetadata(\n GasMetadataKey.PREV_EPOCH_SEQUENCER_QUEUE_GAS,\n _getGasMetadata(\n GasMetadataKey.CUMULATIVE_SEQUENCER_QUEUE_GAS\n )\n );\n\n _putGasMetadata(\n GasMetadataKey.PREV_EPOCH_L1TOL2_QUEUE_GAS,\n _getGasMetadata(\n GasMetadataKey.CUMULATIVE_L1TOL2_QUEUE_GAS\n )\n );\n }\n }\n\n /**\n * Validates the input values of a transaction.\n * @return _valid Whether or not the transaction data is valid.\n */\n function _isValidInput(\n Lib_OVMCodec.Transaction memory _transaction\n )\n view\n internal\n returns (\n bool\n )\n {\n // Prevent reentrancy to run():\n // This check prevents calling run with the default ovmNumber.\n // Combined with the first check in run():\n // if (transactionContext.ovmNUMBER != DEFAULT_UINT256) { return; }\n // It should be impossible to re-enter since run() returns before any other call frames are created.\n // Since this value is already being written to storage, we save much gas compared to\n // using the standard nonReentrant pattern.\n if (_transaction.blockNumber == DEFAULT_UINT256) {\n return false;\n }\n\n if (_isValidGasLimit(_transaction.gasLimit, _transaction.l1QueueOrigin) == false) {\n return false;\n }\n\n return true;\n }\n\n /**\n * Validates the gas limit for a given transaction.\n * @param _gasLimit Gas limit provided by the transaction.\n * param _queueOrigin Queue from which the transaction originated.\n * @return _valid Whether or not the gas limit is valid.\n */\n function _isValidGasLimit(\n uint256 _gasLimit,\n Lib_OVMCodec.QueueOrigin // _queueOrigin\n )\n view\n internal\n returns (\n bool _valid\n )\n {\n // Always have to be below the maximum gas limit.\n if (_gasLimit > gasMeterConfig.maxTransactionGasLimit) {\n return false;\n }\n\n // Always have to be above the minimum gas limit.\n if (_gasLimit < gasMeterConfig.minTransactionGasLimit) {\n return false;\n }\n\n // TEMPORARY: Gas metering is disabled for minnet.\n return true;\n // GasMetadataKey cumulativeGasKey;\n // GasMetadataKey prevEpochGasKey;\n // if (_queueOrigin == Lib_OVMCodec.QueueOrigin.SEQUENCER_QUEUE) {\n // cumulativeGasKey = GasMetadataKey.CUMULATIVE_SEQUENCER_QUEUE_GAS;\n // prevEpochGasKey = GasMetadataKey.PREV_EPOCH_SEQUENCER_QUEUE_GAS;\n // } else {\n // cumulativeGasKey = GasMetadataKey.CUMULATIVE_L1TOL2_QUEUE_GAS;\n // prevEpochGasKey = GasMetadataKey.PREV_EPOCH_L1TOL2_QUEUE_GAS;\n // }\n\n // return (\n // (\n // _getGasMetadata(cumulativeGasKey)\n // - _getGasMetadata(prevEpochGasKey)\n // + _gasLimit\n // ) < gasMeterConfig.maxGasPerQueuePerEpoch\n // );\n }\n\n /**\n * Updates the cumulative gas after a transaction.\n * @param _gasUsed Gas used by the transaction.\n * @param _queueOrigin Queue from which the transaction originated.\n */\n function _updateCumulativeGas(\n uint256 _gasUsed,\n Lib_OVMCodec.QueueOrigin _queueOrigin\n )\n internal\n {\n GasMetadataKey cumulativeGasKey;\n if (_queueOrigin == Lib_OVMCodec.QueueOrigin.SEQUENCER_QUEUE) {\n cumulativeGasKey = GasMetadataKey.CUMULATIVE_SEQUENCER_QUEUE_GAS;\n } else {\n cumulativeGasKey = GasMetadataKey.CUMULATIVE_L1TOL2_QUEUE_GAS;\n }\n\n _putGasMetadata(\n cumulativeGasKey,\n (\n _getGasMetadata(cumulativeGasKey)\n + gasMeterConfig.minTransactionGasLimit\n + _gasUsed\n - transactionRecord.ovmGasRefund\n )\n );\n }\n\n /**\n * Retrieves the value of a gas metadata key.\n * @param _key Gas metadata key to retrieve.\n * @return _value Value stored at the given key.\n */\n function _getGasMetadata(\n GasMetadataKey _key\n )\n internal\n returns (\n uint256 _value\n )\n {\n return uint256(_getContractStorage(\n GAS_METADATA_ADDRESS,\n bytes32(uint256(_key))\n ));\n }\n\n /**\n * Sets the value of a gas metadata key.\n * @param _key Gas metadata key to set.\n * @param _value Value to store at the given key.\n */\n function _putGasMetadata(\n GasMetadataKey _key,\n uint256 _value\n )\n internal\n {\n _putContractStorage(\n GAS_METADATA_ADDRESS,\n bytes32(uint256(_key)),\n bytes32(uint256(_value))\n );\n }\n\n\n /*****************************************\n * Internal Functions: Execution Context *\n *****************************************/\n\n /**\n * Swaps over to a new message context.\n * @param _prevMessageContext Context we're switching from.\n * @param _nextMessageContext Context we're switching to.\n */\n function _switchMessageContext(\n MessageContext memory _prevMessageContext,\n MessageContext memory _nextMessageContext\n )\n internal\n {\n // Avoid unnecessary the SSTORE.\n if (_prevMessageContext.ovmCALLER != _nextMessageContext.ovmCALLER) {\n messageContext.ovmCALLER = _nextMessageContext.ovmCALLER;\n }\n\n // Avoid unnecessary the SSTORE.\n if (_prevMessageContext.ovmADDRESS != _nextMessageContext.ovmADDRESS) {\n messageContext.ovmADDRESS = _nextMessageContext.ovmADDRESS;\n }\n\n // Avoid unnecessary the SSTORE.\n if (_prevMessageContext.isStatic != _nextMessageContext.isStatic) {\n messageContext.isStatic = _nextMessageContext.isStatic;\n }\n }\n\n /**\n * Initializes the execution context.\n * @param _transaction OVM transaction being executed.\n */\n function _initContext(\n Lib_OVMCodec.Transaction memory _transaction\n )\n internal\n {\n transactionContext.ovmTIMESTAMP = _transaction.timestamp;\n transactionContext.ovmNUMBER = _transaction.blockNumber;\n transactionContext.ovmTXGASLIMIT = _transaction.gasLimit;\n transactionContext.ovmL1QUEUEORIGIN = _transaction.l1QueueOrigin;\n transactionContext.ovmL1TXORIGIN = _transaction.l1TxOrigin;\n transactionContext.ovmGASLIMIT = gasMeterConfig.maxGasPerQueuePerEpoch;\n\n messageRecord.nuisanceGasLeft = _getNuisanceGasLimit(_transaction.gasLimit);\n }\n\n /**\n * Resets the transaction and message context.\n */\n function _resetContext()\n internal\n {\n transactionContext.ovmL1TXORIGIN = DEFAULT_ADDRESS;\n transactionContext.ovmTIMESTAMP = DEFAULT_UINT256;\n transactionContext.ovmNUMBER = DEFAULT_UINT256;\n transactionContext.ovmGASLIMIT = DEFAULT_UINT256;\n transactionContext.ovmTXGASLIMIT = DEFAULT_UINT256;\n transactionContext.ovmL1QUEUEORIGIN = Lib_OVMCodec.QueueOrigin.SEQUENCER_QUEUE;\n\n transactionRecord.ovmGasRefund = DEFAULT_UINT256;\n\n messageContext.ovmCALLER = DEFAULT_ADDRESS;\n messageContext.ovmADDRESS = DEFAULT_ADDRESS;\n messageContext.isStatic = false;\n\n messageRecord.nuisanceGasLeft = DEFAULT_UINT256;\n\n // Reset the ovmStateManager.\n ovmStateManager = iOVM_StateManager(address(0));\n }\n\n /*****************************\n * L2-only Helper Functions *\n *****************************/\n\n /**\n * Unreachable helper function for simulating eth_calls with an OVM message context.\n * This function will throw an exception in all cases other than when used as a custom entrypoint in L2 Geth to simulate eth_call.\n * @param _transaction the message transaction to simulate.\n * @param _from the OVM account the simulated call should be from.\n */\n function simulateMessage(\n Lib_OVMCodec.Transaction memory _transaction,\n address _from,\n iOVM_StateManager _ovmStateManager\n )\n external\n returns (\n bool,\n bytes memory\n )\n {\n // Prevent this call from having any effect unless in a custom-set VM frame\n require(msg.sender == address(0));\n\n ovmStateManager = _ovmStateManager;\n _initContext(_transaction);\n messageRecord.nuisanceGasLeft = uint(-1);\n\n messageContext.ovmADDRESS = _from;\n\n bool isCreate = _transaction.entrypoint == address(0);\n if (isCreate) {\n (address created, bytes memory revertData) = ovmCREATE(_transaction.data);\n if (created == address(0)) {\n return (false, revertData);\n } else {\n // The eth_call RPC endpoint for to = undefined will return the deployed bytecode\n // in the success case, differing from standard create messages.\n return (true, Lib_EthUtils.getCode(created));\n }\n } else {\n return ovmCALL(\n _transaction.gasLimit,\n _transaction.entrypoint,\n _transaction.data\n );\n }\n }\n}\n" + }, + "@openzeppelin/contracts/math/Math.sol": { + "content": "// SPDX-License-Identifier: MIT\n\npragma solidity >=0.6.0 <0.8.0;\n\n/**\n * @dev Standard math utilities missing in the Solidity language.\n */\nlibrary Math {\n /**\n * @dev Returns the largest of two numbers.\n */\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\n return a >= b ? a : b;\n }\n\n /**\n * @dev Returns the smallest of two numbers.\n */\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return a < b ? a : b;\n }\n\n /**\n * @dev Returns the average of two numbers. The result is rounded towards\n * zero.\n */\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b) / 2 can overflow, so we distribute\n return (a / 2) + (b / 2) + ((a % 2 + b % 2) / 2);\n }\n}\n" + }, + "contracts/optimistic-ethereum/iOVM/execution/iOVM_SafetyChecker.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/**\n * @title iOVM_SafetyChecker\n */\ninterface iOVM_SafetyChecker {\n\n /********************\n * Public Functions *\n ********************/\n\n function isBytecodeSafe(bytes calldata _bytecode) external pure returns (bool);\n}\n" + }, + "contracts/optimistic-ethereum/OVM/predeploys/OVM_DeployerWhitelist.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Interface Imports */\nimport { iOVM_DeployerWhitelist } from \"../../iOVM/predeploys/iOVM_DeployerWhitelist.sol\";\n\n/**\n * @title OVM_DeployerWhitelist\n * @dev The Deployer Whitelist is a temporary predeploy used to provide additional safety during the\n * initial phases of our mainnet roll out. It is owned by the Optimism team, and defines accounts\n * which are allowed to deploy contracts on Layer2. The Execution Manager will only allow an\n * ovmCREATE or ovmCREATE2 operation to proceed if the deployer's address whitelisted.\n *\n * Compiler used: optimistic-solc\n * Runtime target: OVM\n */\ncontract OVM_DeployerWhitelist is iOVM_DeployerWhitelist {\n\n /**********************\n * Contract Constants *\n **********************/\n\n bool public initialized;\n bool public allowArbitraryDeployment;\n address override public owner;\n mapping (address => bool) public whitelist;\n\n\n /**********************\n * Function Modifiers *\n **********************/\n\n /**\n * Blocks functions to anyone except the contract owner.\n */\n modifier onlyOwner() {\n require(\n msg.sender == owner,\n \"Function can only be called by the owner of this contract.\"\n );\n _;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Initializes the whitelist.\n * @param _owner Address of the owner for this contract.\n * @param _allowArbitraryDeployment Whether or not to allow arbitrary contract deployment.\n */\n function initialize(\n address _owner,\n bool _allowArbitraryDeployment\n )\n override\n public\n {\n if (initialized == true) {\n return;\n }\n\n initialized = true;\n allowArbitraryDeployment = _allowArbitraryDeployment;\n owner = _owner;\n }\n\n /**\n * Adds or removes an address from the deployment whitelist.\n * @param _deployer Address to update permissions for.\n * @param _isWhitelisted Whether or not the address is whitelisted.\n */\n function setWhitelistedDeployer(\n address _deployer,\n bool _isWhitelisted\n )\n override\n public\n onlyOwner\n {\n whitelist[_deployer] = _isWhitelisted;\n }\n\n /**\n * Updates the owner of this contract.\n * @param _owner Address of the new owner.\n */\n function setOwner(\n address _owner\n )\n override\n public\n onlyOwner\n {\n owner = _owner;\n }\n\n /**\n * Updates the arbitrary deployment flag.\n * @param _allowArbitraryDeployment Whether or not to allow arbitrary contract deployment.\n */\n function setAllowArbitraryDeployment(\n bool _allowArbitraryDeployment\n )\n override\n public\n onlyOwner\n {\n allowArbitraryDeployment = _allowArbitraryDeployment;\n }\n\n /**\n * Permanently enables arbitrary contract deployment and deletes the owner.\n */\n function enableArbitraryContractDeployment()\n override\n public\n onlyOwner\n {\n setAllowArbitraryDeployment(true);\n setOwner(address(0));\n }\n\n /**\n * Checks whether an address is allowed to deploy contracts.\n * @param _deployer Address to check.\n * @return _allowed Whether or not the address can deploy contracts.\n */\n function isDeployerAllowed(\n address _deployer\n )\n override\n public\n returns (\n bool\n )\n {\n return (\n initialized == false\n || allowArbitraryDeployment == true\n || whitelist[_deployer]\n );\n }\n}\n" + }, + "contracts/optimistic-ethereum/iOVM/predeploys/iOVM_DeployerWhitelist.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/**\n * @title iOVM_DeployerWhitelist\n */\ninterface iOVM_DeployerWhitelist {\n\n /********************\n * Public Functions *\n ********************/\n\n function initialize(address _owner, bool _allowArbitraryDeployment) external;\n function owner() external returns (address _owner);\n function setWhitelistedDeployer(address _deployer, bool _isWhitelisted) external;\n function setOwner(address _newOwner) external;\n function setAllowArbitraryDeployment(bool _allowArbitraryDeployment) external;\n function enableArbitraryContractDeployment() external;\n function isDeployerAllowed(address _deployer) external returns (bool _allowed);\n}\n" + }, + "contracts/optimistic-ethereum/OVM/execution/OVM_SafetyChecker.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Interface Imports */\nimport { iOVM_SafetyChecker } from \"../../iOVM/execution/iOVM_SafetyChecker.sol\";\n\n/**\n * @title OVM_SafetyChecker\n * @dev The Safety Checker verifies that contracts deployed on L2 do not contain any\n * \"unsafe\" operations. An operation is considered unsafe if it would access state variables which\n * are specific to the environment (ie. L1 or L2) in which it is executed, as this could be used\n * to \"escape the sandbox\" of the OVM, resulting in non-deterministic fraud proofs.\n * That is, an attacker would be able to \"prove fraud\" on an honestly applied transaction.\n * Note that a \"safe\" contract requires opcodes to appear in a particular pattern;\n * omission of \"unsafe\" opcodes is necessary, but not sufficient.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract OVM_SafetyChecker is iOVM_SafetyChecker {\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Returns whether or not all of the provided bytecode is safe.\n * @param _bytecode The bytecode to safety check.\n * @return `true` if the bytecode is safe, `false` otherwise.\n */\n function isBytecodeSafe(\n bytes memory _bytecode\n )\n override\n external\n pure\n returns (\n bool\n )\n {\n // autogenerated by gen_safety_checker_constants.py\n // number of bytes to skip for each opcode\n uint256[8] memory opcodeSkippableBytes = [\n uint256(0x0001010101010101010101010000000001010101010101010101010101010000),\n uint256(0x0100000000000000000000000000000000000000010101010101000000010100),\n uint256(0x0000000000000000000000000000000001010101000000010101010100000000),\n uint256(0x0203040500000000000000000000000000000000000000000000000000000000),\n uint256(0x0101010101010101010101010101010101010101010101010101010101010101),\n uint256(0x0101010101000000000000000000000000000000000000000000000000000000),\n uint256(0x0000000000000000000000000000000000000000000000000000000000000000),\n uint256(0x0000000000000000000000000000000000000000000000000000000000000000)\n ];\n // Mask to gate opcode specific cases\n uint256 opcodeGateMask = ~uint256(0xffffffffffffffffffffffe000000000fffffffff070ffff9c0ffffec000f001);\n // Halting opcodes\n uint256 opcodeHaltingMask = ~uint256(0x4008000000000000000000000000000000000000004000000000000000000001);\n // PUSH opcodes\n uint256 opcodePushMask = ~uint256(0xffffffff000000000000000000000000);\n\n uint256 codeLength;\n uint256 _pc;\n assembly {\n _pc := add(_bytecode, 0x20)\n }\n codeLength = _pc + _bytecode.length;\n do {\n // current opcode: 0x00...0xff\n uint256 opNum;\n\n // inline assembly removes the extra add + bounds check\n assembly {\n let word := mload(_pc) //load the next 32 bytes at pc into word\n\n // Look up number of bytes to skip from opcodeSkippableBytes and then update indexInWord\n // E.g. the 02030405 in opcodeSkippableBytes is the number of bytes to skip for PUSH1->4\n // We repeat this 6 times, thus we can only skip bytes for up to PUSH4 ((1+4) * 6 = 30 < 32).\n // If we see an opcode that is listed as 0 skippable bytes e.g. PUSH5,\n // then we will get stuck on that indexInWord and then opNum will be set to the PUSH5 opcode.\n let indexInWord := byte(0, mload(add(opcodeSkippableBytes, byte(0, word))))\n indexInWord := add(indexInWord, byte(0, mload(add(opcodeSkippableBytes, byte(indexInWord, word)))))\n indexInWord := add(indexInWord, byte(0, mload(add(opcodeSkippableBytes, byte(indexInWord, word)))))\n indexInWord := add(indexInWord, byte(0, mload(add(opcodeSkippableBytes, byte(indexInWord, word)))))\n indexInWord := add(indexInWord, byte(0, mload(add(opcodeSkippableBytes, byte(indexInWord, word)))))\n indexInWord := add(indexInWord, byte(0, mload(add(opcodeSkippableBytes, byte(indexInWord, word)))))\n _pc := add(_pc, indexInWord)\n\n opNum := byte(indexInWord, word)\n }\n\n // + push opcodes\n // + stop opcodes [STOP(0x00),JUMP(0x56),RETURN(0xf3),INVALID(0xfe)]\n // + caller opcode CALLER(0x33)\n // + blacklisted opcodes\n uint256 opBit = 1 << opNum;\n if (opBit & opcodeGateMask == 0) {\n if (opBit & opcodePushMask == 0) {\n // all pushes are valid opcodes\n // subsequent bytes are not opcodes. Skip them.\n _pc += (opNum - 0x5e); // PUSH1 is 0x60, so opNum-0x5f = PUSHed bytes and we +1 to\n // skip the _pc++; line below in order to save gas ((-0x5f + 1) = -0x5e)\n continue;\n } else if (opBit & opcodeHaltingMask == 0) {\n // STOP or JUMP or RETURN or INVALID (Note: REVERT is blacklisted, so not included here)\n // We are now inside unreachable code until we hit a JUMPDEST!\n do {\n _pc++;\n assembly {\n opNum := byte(0, mload(_pc))\n }\n // encountered a JUMPDEST\n if (opNum == 0x5b) break;\n // skip PUSHed bytes\n if ((1 << opNum) & opcodePushMask == 0) _pc += (opNum - 0x5f); // opNum-0x5f = PUSHed bytes (PUSH1 is 0x60)\n } while (_pc < codeLength);\n // opNum is 0x5b, so we don't continue here since the pc++ is fine\n } else if (opNum == 0x33) { // Caller opcode\n uint256 firstOps; // next 32 bytes of bytecode\n uint256 secondOps; // following 32 bytes of bytecode\n\n assembly {\n firstOps := mload(_pc)\n // 37 bytes total, 5 left over --> 32 - 5 bytes = 27 bytes = 216 bits\n secondOps := shr(216, mload(add(_pc, 0x20)))\n }\n\n // Call identity precompile\n // CALLER POP PUSH1 0x00 PUSH1 0x04 GAS CALL\n // 32 - 8 bytes = 24 bytes = 192\n if ((firstOps >> 192) == 0x3350600060045af1) {\n _pc += 8;\n // Call EM and abort execution if instructed\n // CALLER PUSH1 0x00 SWAP1 GAS CALL PC PUSH1 0x0E ADD JUMPI RETURNDATASIZE PUSH1 0x00 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x00 REVERT JUMPDEST RETURNDATASIZE PUSH1 0x01 EQ ISZERO PC PUSH1 0x0a ADD JUMPI PUSH1 0x01 PUSH1 0x00 RETURN JUMPDEST\n } else if (firstOps == 0x336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a015760 && secondOps == 0x016000f35b) {\n _pc += 37;\n } else {\n return false;\n }\n continue;\n } else {\n // encountered a non-whitelisted opcode!\n return false;\n }\n }\n _pc++;\n } while (_pc < codeLength);\n return true;\n }\n}\n" + }, + "contracts/optimistic-ethereum/OVM/execution/OVM_StateManagerFactory.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Interface Imports */\nimport { iOVM_StateManager } from \"../../iOVM/execution/iOVM_StateManager.sol\";\nimport { iOVM_StateManagerFactory } from \"../../iOVM/execution/iOVM_StateManagerFactory.sol\";\n\n/* Contract Imports */\nimport { OVM_StateManager } from \"./OVM_StateManager.sol\";\n\n/**\n * @title OVM_StateManagerFactory\n * @dev The State Manager Factory is called by a State Transitioner's init code, to create a new\n * State Manager for use in the Fraud Verification process.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract OVM_StateManagerFactory is iOVM_StateManagerFactory {\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Creates a new OVM_StateManager\n * @param _owner Owner of the created contract.\n * @return New OVM_StateManager instance.\n */\n function create(\n address _owner\n )\n override\n public\n returns (\n iOVM_StateManager\n )\n {\n return new OVM_StateManager(_owner);\n }\n}\n" + }, + "contracts/optimistic-ethereum/OVM/execution/OVM_StateManager.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/* Interface Imports */\nimport { iOVM_StateManager } from \"../../iOVM/execution/iOVM_StateManager.sol\";\n\n/**\n * @title OVM_StateManager\n * @dev The State Manager contract holds all storage values for contracts in the OVM. It can only be written to by the\n * the Execution Manager and State Transitioner. It runs on L1 during the setup and execution of a fraud proof.\n * The same logic runs on L2, but has been implemented as a precompile in the L2 go-ethereum client\n * (see https://github.com/ethereum-optimism/go-ethereum/blob/master/core/vm/ovm_state_manager.go).\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract OVM_StateManager is iOVM_StateManager {\n\n /*************\n * Constants *\n *************/\n\n bytes32 constant internal EMPTY_ACCOUNT_STORAGE_ROOT = 0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421;\n bytes32 constant internal EMPTY_ACCOUNT_CODE_HASH = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;\n bytes32 constant internal STORAGE_XOR_VALUE = 0xFEEDFACECAFEBEEFFEEDFACECAFEBEEFFEEDFACECAFEBEEFFEEDFACECAFEBEEF;\n\n\n /*************\n * Variables *\n *************/\n\n address override public owner;\n address override public ovmExecutionManager;\n mapping (address => Lib_OVMCodec.Account) internal accounts;\n mapping (address => mapping (bytes32 => bytes32)) internal contractStorage;\n mapping (address => mapping (bytes32 => bool)) internal verifiedContractStorage;\n mapping (bytes32 => ItemState) internal itemStates;\n uint256 internal totalUncommittedAccounts;\n uint256 internal totalUncommittedContractStorage;\n\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _owner Address of the owner of this contract.\n */\n constructor(\n address _owner\n )\n {\n owner = _owner;\n }\n\n\n /**********************\n * Function Modifiers *\n **********************/\n\n /**\n * Simple authentication, this contract should only be accessible to the owner (which is expected to be the State Transitioner during `PRE_EXECUTION`\n * or the OVM_ExecutionManager during transaction execution.\n */\n modifier authenticated() {\n // owner is the State Transitioner\n require(\n msg.sender == owner || msg.sender == ovmExecutionManager,\n \"Function can only be called by authenticated addresses\"\n );\n _;\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Checks whether a given address is allowed to modify this contract.\n * @param _address Address to check.\n * @return Whether or not the address can modify this contract.\n */\n function isAuthenticated(\n address _address\n )\n override\n public\n view\n returns (\n bool\n )\n {\n return (_address == owner || _address == ovmExecutionManager);\n }\n\n /**\n * Sets the address of the OVM_ExecutionManager.\n * @param _ovmExecutionManager Address of the OVM_ExecutionManager.\n */\n function setExecutionManager(\n address _ovmExecutionManager\n )\n override\n public\n authenticated\n {\n ovmExecutionManager = _ovmExecutionManager;\n }\n\n /**\n * Inserts an account into the state.\n * @param _address Address of the account to insert.\n * @param _account Account to insert for the given address.\n */\n function putAccount(\n address _address,\n Lib_OVMCodec.Account memory _account\n )\n override\n public\n authenticated\n {\n accounts[_address] = _account;\n }\n\n /**\n * Marks an account as empty.\n * @param _address Address of the account to mark.\n */\n function putEmptyAccount(\n address _address\n )\n override\n public\n authenticated\n {\n Lib_OVMCodec.Account storage account = accounts[_address];\n account.storageRoot = EMPTY_ACCOUNT_STORAGE_ROOT;\n account.codeHash = EMPTY_ACCOUNT_CODE_HASH;\n }\n\n /**\n * Retrieves an account from the state.\n * @param _address Address of the account to retrieve.\n * @return Account for the given address.\n */\n function getAccount(\n address _address\n )\n override\n public\n view\n returns (\n Lib_OVMCodec.Account memory\n )\n {\n return accounts[_address];\n }\n\n /**\n * Checks whether the state has a given account.\n * @param _address Address of the account to check.\n * @return Whether or not the state has the account.\n */\n function hasAccount(\n address _address\n )\n override\n public\n view\n returns (\n bool\n )\n {\n return accounts[_address].codeHash != bytes32(0);\n }\n\n /**\n * Checks whether the state has a given known empty account.\n * @param _address Address of the account to check.\n * @return Whether or not the state has the empty account.\n */\n function hasEmptyAccount(\n address _address\n )\n override\n public\n view\n returns (\n bool\n )\n {\n return (\n accounts[_address].codeHash == EMPTY_ACCOUNT_CODE_HASH\n && accounts[_address].nonce == 0\n );\n }\n\n /**\n * Sets the nonce of an account.\n * @param _address Address of the account to modify.\n * @param _nonce New account nonce.\n */\n function setAccountNonce(\n address _address,\n uint256 _nonce\n )\n override\n public\n authenticated\n {\n accounts[_address].nonce = _nonce;\n }\n\n /**\n * Gets the nonce of an account.\n * @param _address Address of the account to access.\n * @return Nonce of the account.\n */\n function getAccountNonce(\n address _address\n )\n override\n public\n view\n returns (\n uint256\n )\n {\n return accounts[_address].nonce;\n }\n\n /**\n * Retrieves the Ethereum address of an account.\n * @param _address Address of the account to access.\n * @return Corresponding Ethereum address.\n */\n function getAccountEthAddress(\n address _address\n )\n override\n public\n view\n returns (\n address\n )\n {\n return accounts[_address].ethAddress;\n }\n\n /**\n * Retrieves the storage root of an account.\n * @param _address Address of the account to access.\n * @return Corresponding storage root.\n */\n function getAccountStorageRoot(\n address _address\n )\n override\n public\n view\n returns (\n bytes32\n )\n {\n return accounts[_address].storageRoot;\n }\n\n /**\n * Initializes a pending account (during CREATE or CREATE2) with the default values.\n * @param _address Address of the account to initialize.\n */\n function initPendingAccount(\n address _address\n )\n override\n public\n authenticated\n {\n Lib_OVMCodec.Account storage account = accounts[_address];\n account.nonce = 1;\n account.storageRoot = EMPTY_ACCOUNT_STORAGE_ROOT;\n account.codeHash = EMPTY_ACCOUNT_CODE_HASH;\n account.isFresh = true;\n }\n\n /**\n * Finalizes the creation of a pending account (during CREATE or CREATE2).\n * @param _address Address of the account to finalize.\n * @param _ethAddress Address of the account's associated contract on Ethereum.\n * @param _codeHash Hash of the account's code.\n */\n function commitPendingAccount(\n address _address,\n address _ethAddress,\n bytes32 _codeHash\n )\n override\n public\n authenticated\n {\n Lib_OVMCodec.Account storage account = accounts[_address];\n account.ethAddress = _ethAddress;\n account.codeHash = _codeHash;\n }\n\n /**\n * Checks whether an account has already been retrieved, and marks it as retrieved if not.\n * @param _address Address of the account to check.\n * @return Whether or not the account was already loaded.\n */\n function testAndSetAccountLoaded(\n address _address\n )\n override\n public\n authenticated\n returns (\n bool\n )\n {\n return _testAndSetItemState(\n _getItemHash(_address),\n ItemState.ITEM_LOADED\n );\n }\n\n /**\n * Checks whether an account has already been modified, and marks it as modified if not.\n * @param _address Address of the account to check.\n * @return Whether or not the account was already modified.\n */\n function testAndSetAccountChanged(\n address _address\n )\n override\n public\n authenticated\n returns (\n bool\n )\n {\n return _testAndSetItemState(\n _getItemHash(_address),\n ItemState.ITEM_CHANGED\n );\n }\n\n /**\n * Attempts to mark an account as committed.\n * @param _address Address of the account to commit.\n * @return Whether or not the account was committed.\n */\n function commitAccount(\n address _address\n )\n override\n public\n authenticated\n returns (\n bool\n )\n {\n bytes32 item = _getItemHash(_address);\n if (itemStates[item] != ItemState.ITEM_CHANGED) {\n return false;\n }\n\n itemStates[item] = ItemState.ITEM_COMMITTED;\n totalUncommittedAccounts -= 1;\n\n return true;\n }\n\n /**\n * Increments the total number of uncommitted accounts.\n */\n function incrementTotalUncommittedAccounts()\n override\n public\n authenticated\n {\n totalUncommittedAccounts += 1;\n }\n\n /**\n * Gets the total number of uncommitted accounts.\n * @return Total uncommitted accounts.\n */\n function getTotalUncommittedAccounts()\n override\n public\n view\n returns (\n uint256\n )\n {\n return totalUncommittedAccounts;\n }\n\n /**\n * Checks whether a given account was changed during execution.\n * @param _address Address to check.\n * @return Whether or not the account was changed.\n */\n function wasAccountChanged(\n address _address\n )\n override\n public\n view\n returns (\n bool\n )\n {\n bytes32 item = _getItemHash(_address);\n return itemStates[item] >= ItemState.ITEM_CHANGED;\n }\n\n /**\n * Checks whether a given account was committed after execution.\n * @param _address Address to check.\n * @return Whether or not the account was committed.\n */\n function wasAccountCommitted(\n address _address\n )\n override\n public\n view\n returns (\n bool\n )\n {\n bytes32 item = _getItemHash(_address);\n return itemStates[item] >= ItemState.ITEM_COMMITTED;\n }\n\n\n /************************************\n * Public Functions: Storage Access *\n ************************************/\n\n /**\n * Changes a contract storage slot value.\n * @param _contract Address of the contract to modify.\n * @param _key 32 byte storage slot key.\n * @param _value 32 byte storage slot value.\n */\n function putContractStorage(\n address _contract,\n bytes32 _key,\n bytes32 _value\n )\n override\n public\n authenticated\n {\n // A hilarious optimization. `SSTORE`ing a value of `bytes32(0)` is common enough that it's\n // worth populating this with a non-zero value in advance (during the fraud proof\n // initialization phase) to cut the execution-time cost down to 5000 gas.\n contractStorage[_contract][_key] = _value ^ STORAGE_XOR_VALUE;\n\n // Only used when initially populating the contract storage. OVM_ExecutionManager will\n // perform a `hasContractStorage` INVALID_STATE_ACCESS check before putting any contract\n // storage because writing to zero when the actual value is nonzero causes a gas\n // discrepancy. Could be moved into a new `putVerifiedContractStorage` function, or\n // something along those lines.\n if (verifiedContractStorage[_contract][_key] == false) {\n verifiedContractStorage[_contract][_key] = true;\n }\n }\n\n /**\n * Retrieves a contract storage slot value.\n * @param _contract Address of the contract to access.\n * @param _key 32 byte storage slot key.\n * @return 32 byte storage slot value.\n */\n function getContractStorage(\n address _contract,\n bytes32 _key\n )\n override\n public\n view\n returns (\n bytes32\n )\n {\n // Storage XOR system doesn't work for newly created contracts that haven't set this\n // storage slot value yet.\n if (\n verifiedContractStorage[_contract][_key] == false\n && accounts[_contract].isFresh\n ) {\n return bytes32(0);\n }\n\n // See `putContractStorage` for more information about the XOR here.\n return contractStorage[_contract][_key] ^ STORAGE_XOR_VALUE;\n }\n\n /**\n * Checks whether a contract storage slot exists in the state.\n * @param _contract Address of the contract to access.\n * @param _key 32 byte storage slot key.\n * @return Whether or not the key was set in the state.\n */\n function hasContractStorage(\n address _contract,\n bytes32 _key\n )\n override\n public\n view\n returns (\n bool\n )\n {\n return verifiedContractStorage[_contract][_key] || accounts[_contract].isFresh;\n }\n\n /**\n * Checks whether a storage slot has already been retrieved, and marks it as retrieved if not.\n * @param _contract Address of the contract to check.\n * @param _key 32 byte storage slot key.\n * @return Whether or not the slot was already loaded.\n */\n function testAndSetContractStorageLoaded(\n address _contract,\n bytes32 _key\n )\n override\n public\n authenticated\n returns (\n bool\n )\n {\n return _testAndSetItemState(\n _getItemHash(_contract, _key),\n ItemState.ITEM_LOADED\n );\n }\n\n /**\n * Checks whether a storage slot has already been modified, and marks it as modified if not.\n * @param _contract Address of the contract to check.\n * @param _key 32 byte storage slot key.\n * @return Whether or not the slot was already modified.\n */\n function testAndSetContractStorageChanged(\n address _contract,\n bytes32 _key\n )\n override\n public\n authenticated\n returns (\n bool\n )\n {\n return _testAndSetItemState(\n _getItemHash(_contract, _key),\n ItemState.ITEM_CHANGED\n );\n }\n\n /**\n * Attempts to mark a storage slot as committed.\n * @param _contract Address of the account to commit.\n * @param _key 32 byte slot key to commit.\n * @return Whether or not the slot was committed.\n */\n function commitContractStorage(\n address _contract,\n bytes32 _key\n )\n override\n public\n authenticated\n returns (\n bool\n )\n {\n bytes32 item = _getItemHash(_contract, _key);\n if (itemStates[item] != ItemState.ITEM_CHANGED) {\n return false;\n }\n\n itemStates[item] = ItemState.ITEM_COMMITTED;\n totalUncommittedContractStorage -= 1;\n\n return true;\n }\n\n /**\n * Increments the total number of uncommitted storage slots.\n */\n function incrementTotalUncommittedContractStorage()\n override\n public\n authenticated\n {\n totalUncommittedContractStorage += 1;\n }\n\n /**\n * Gets the total number of uncommitted storage slots.\n * @return Total uncommitted storage slots.\n */\n function getTotalUncommittedContractStorage()\n override\n public\n view\n returns (\n uint256\n )\n {\n return totalUncommittedContractStorage;\n }\n\n /**\n * Checks whether a given storage slot was changed during execution.\n * @param _contract Address to check.\n * @param _key Key of the storage slot to check.\n * @return Whether or not the storage slot was changed.\n */\n function wasContractStorageChanged(\n address _contract,\n bytes32 _key\n )\n override\n public\n view\n returns (\n bool\n )\n {\n bytes32 item = _getItemHash(_contract, _key);\n return itemStates[item] >= ItemState.ITEM_CHANGED;\n }\n\n /**\n * Checks whether a given storage slot was committed after execution.\n * @param _contract Address to check.\n * @param _key Key of the storage slot to check.\n * @return Whether or not the storage slot was committed.\n */\n function wasContractStorageCommitted(\n address _contract,\n bytes32 _key\n )\n override\n public\n view\n returns (\n bool\n )\n {\n bytes32 item = _getItemHash(_contract, _key);\n return itemStates[item] >= ItemState.ITEM_COMMITTED;\n }\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Generates a unique hash for an address.\n * @param _address Address to generate a hash for.\n * @return Unique hash for the given address.\n */\n function _getItemHash(\n address _address\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n return keccak256(abi.encodePacked(_address));\n }\n\n /**\n * Generates a unique hash for an address/key pair.\n * @param _contract Address to generate a hash for.\n * @param _key Key to generate a hash for.\n * @return Unique hash for the given pair.\n */\n function _getItemHash(\n address _contract,\n bytes32 _key\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n return keccak256(abi.encodePacked(\n _contract,\n _key\n ));\n }\n\n /**\n * Checks whether an item is in a particular state (ITEM_LOADED or ITEM_CHANGED) and sets the\n * item to the provided state if not.\n * @param _item 32 byte item ID to check.\n * @param _minItemState Minimum state that must be satisfied by the item.\n * @return Whether or not the item was already in the state.\n */\n function _testAndSetItemState(\n bytes32 _item,\n ItemState _minItemState\n )\n internal\n returns (\n bool\n )\n {\n bool wasItemState = itemStates[_item] >= _minItemState;\n\n if (wasItemState == false) {\n itemStates[_item] = _minItemState;\n }\n\n return wasItemState;\n }\n}\n" + }, + "contracts/test-libraries/codec/TestLib_OVMCodec.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../optimistic-ethereum/libraries/codec/Lib_OVMCodec.sol\";\n\n/**\n * @title TestLib_OVMCodec\n */\ncontract TestLib_OVMCodec {\n function encodeTransaction(\n Lib_OVMCodec.Transaction memory _transaction\n )\n public\n pure\n returns (\n bytes memory _encoded\n )\n {\n return Lib_OVMCodec.encodeTransaction(_transaction);\n }\n\n function hashTransaction(\n Lib_OVMCodec.Transaction memory _transaction\n )\n public\n pure\n returns (\n bytes32 _hash\n )\n {\n return Lib_OVMCodec.hashTransaction(_transaction);\n }\n}\n" + }, + "contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1CrossDomainMessenger.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_AddressResolver } from \"../../../libraries/resolver/Lib_AddressResolver.sol\";\nimport { Lib_AddressManager } from \"../../../libraries/resolver/Lib_AddressManager.sol\";\nimport { Lib_SecureMerkleTrie } from \"../../../libraries/trie/Lib_SecureMerkleTrie.sol\";\n\n/* Interface Imports */\nimport { iOVM_L1CrossDomainMessenger } from \"../../../iOVM/bridge/messaging/iOVM_L1CrossDomainMessenger.sol\";\nimport { iOVM_CanonicalTransactionChain } from \"../../../iOVM/chain/iOVM_CanonicalTransactionChain.sol\";\nimport { iOVM_StateCommitmentChain } from \"../../../iOVM/chain/iOVM_StateCommitmentChain.sol\";\n\n/* Contract Imports */\nimport { Abs_BaseCrossDomainMessenger } from \"./Abs_BaseCrossDomainMessenger.sol\";\n\n/* External Imports */\nimport { OwnableUpgradeable } from \"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\";\nimport { PausableUpgradeable } from \"@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol\";\nimport { ReentrancyGuardUpgradeable } from \"@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol\";\n\n/**\n * @title OVM_L1CrossDomainMessenger\n * @dev The L1 Cross Domain Messenger contract sends messages from L1 to L2, and relays messages\n * from L2 onto L1. In the event that a message sent from L1 to L2 is rejected for exceeding the L2\n * epoch gas limit, it can be resubmitted via this contract's replay function.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract OVM_L1CrossDomainMessenger is\n iOVM_L1CrossDomainMessenger,\n Abs_BaseCrossDomainMessenger,\n Lib_AddressResolver,\n OwnableUpgradeable,\n PausableUpgradeable,\n ReentrancyGuardUpgradeable\n{\n\n /**********\n * Events *\n **********/\n\n event MessageBlocked(\n bytes32 indexed _xDomainCalldataHash\n );\n\n event MessageAllowed(\n bytes32 indexed _xDomainCalldataHash\n );\n\n /**********************\n * Contract Variables *\n **********************/\n\n mapping (bytes32 => bool) public blockedMessages;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * This contract is intended to be behind a delegate proxy.\n * We pass the zero address to the address resolver just to satisfy the constructor.\n * We still need to set this value in initialize().\n */\n constructor()\n Lib_AddressResolver(address(0))\n {}\n\n /**********************\n * Function Modifiers *\n **********************/\n\n /**\n * Modifier to enforce that, if configured, only the OVM_L2MessageRelayer contract may\n * successfully call a method.\n */\n modifier onlyRelayer() {\n address relayer = resolve(\"OVM_L2MessageRelayer\");\n if (relayer != address(0)) {\n require(\n msg.sender == relayer,\n \"Only OVM_L2MessageRelayer can relay L2-to-L1 messages.\"\n );\n }\n _;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n function initialize(\n address _libAddressManager\n )\n public\n initializer\n {\n require(\n address(libAddressManager) == address(0),\n \"L1CrossDomainMessenger already intialized.\"\n );\n libAddressManager = Lib_AddressManager(_libAddressManager);\n xDomainMsgSender = DEFAULT_XDOMAIN_SENDER;\n\n // Initialize upgradable OZ contracts\n __Context_init_unchained(); // Context is a dependency for both Ownable and Pausable\n __Ownable_init_unchained();\n __Pausable_init_unchained();\n __ReentrancyGuard_init_unchained();\n }\n\n /**\n * Pause relaying.\n */\n function pause()\n external\n onlyOwner\n {\n _pause();\n }\n\n /**\n * Block a message.\n * @param _xDomainCalldataHash Hash of the message to block.\n */\n function blockMessage(\n bytes32 _xDomainCalldataHash\n )\n external\n onlyOwner\n {\n blockedMessages[_xDomainCalldataHash] = true;\n emit MessageBlocked(_xDomainCalldataHash);\n }\n\n /**\n * Allow a message.\n * @param _xDomainCalldataHash Hash of the message to block.\n */\n function allowMessage(\n bytes32 _xDomainCalldataHash\n )\n external\n onlyOwner\n {\n blockedMessages[_xDomainCalldataHash] = false;\n emit MessageAllowed(_xDomainCalldataHash);\n }\n\n /**\n * Relays a cross domain message to a contract.\n * @inheritdoc iOVM_L1CrossDomainMessenger\n */\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce,\n L2MessageInclusionProof memory _proof\n )\n override\n public\n nonReentrant\n onlyRelayer\n whenNotPaused\n {\n bytes memory xDomainCalldata = _getXDomainCalldata(\n _target,\n _sender,\n _message,\n _messageNonce\n );\n\n require(\n _verifyXDomainMessage(\n xDomainCalldata,\n _proof\n ) == true,\n \"Provided message could not be verified.\"\n );\n\n bytes32 xDomainCalldataHash = keccak256(xDomainCalldata);\n\n require(\n successfulMessages[xDomainCalldataHash] == false,\n \"Provided message has already been received.\"\n );\n\n require(\n blockedMessages[xDomainCalldataHash] == false,\n \"Provided message has been blocked.\"\n );\n\n xDomainMsgSender = _sender;\n (bool success, ) = _target.call(_message);\n xDomainMsgSender = DEFAULT_XDOMAIN_SENDER;\n\n // Mark the message as received if the call was successful. Ensures that a message can be\n // relayed multiple times in the case that the call reverted.\n if (success == true) {\n successfulMessages[xDomainCalldataHash] = true;\n emit RelayedMessage(xDomainCalldataHash);\n } else {\n emit FailedRelayedMessage(xDomainCalldataHash);\n }\n\n // Store an identifier that can be used to prove that the given message was relayed by some\n // user. Gives us an easy way to pay relayers for their work.\n bytes32 relayId = keccak256(\n abi.encodePacked(\n xDomainCalldata,\n msg.sender,\n block.number\n )\n );\n relayedMessages[relayId] = true;\n }\n\n /**\n * Replays a cross domain message to the target messenger.\n * @inheritdoc iOVM_L1CrossDomainMessenger\n */\n function replayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce,\n uint32 _gasLimit\n )\n override\n public\n {\n bytes memory xDomainCalldata = _getXDomainCalldata(\n _target,\n _sender,\n _message,\n _messageNonce\n );\n\n require(\n sentMessages[keccak256(xDomainCalldata)] == true,\n \"Provided message has not already been sent.\"\n );\n\n _sendXDomainMessage(xDomainCalldata, _gasLimit);\n }\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Verifies that the given message is valid.\n * @param _xDomainCalldata Calldata to verify.\n * @param _proof Inclusion proof for the message.\n * @return Whether or not the provided message is valid.\n */\n function _verifyXDomainMessage(\n bytes memory _xDomainCalldata,\n L2MessageInclusionProof memory _proof\n )\n internal\n view\n returns (\n bool\n )\n {\n return (\n _verifyStateRootProof(_proof)\n && _verifyStorageProof(_xDomainCalldata, _proof)\n );\n }\n\n /**\n * Verifies that the state root within an inclusion proof is valid.\n * @param _proof Message inclusion proof.\n * @return Whether or not the provided proof is valid.\n */\n function _verifyStateRootProof(\n L2MessageInclusionProof memory _proof\n )\n internal\n view\n returns (\n bool\n )\n {\n iOVM_StateCommitmentChain ovmStateCommitmentChain = iOVM_StateCommitmentChain(\n resolve(\"OVM_StateCommitmentChain\")\n );\n\n return (\n ovmStateCommitmentChain.insideFraudProofWindow(_proof.stateRootBatchHeader) == false\n && ovmStateCommitmentChain.verifyStateCommitment(\n _proof.stateRoot,\n _proof.stateRootBatchHeader,\n _proof.stateRootProof\n )\n );\n }\n\n /**\n * Verifies that the storage proof within an inclusion proof is valid.\n * @param _xDomainCalldata Encoded message calldata.\n * @param _proof Message inclusion proof.\n * @return Whether or not the provided proof is valid.\n */\n function _verifyStorageProof(\n bytes memory _xDomainCalldata,\n L2MessageInclusionProof memory _proof\n )\n internal\n view\n returns (\n bool\n )\n {\n bytes32 storageKey = keccak256(\n abi.encodePacked(\n keccak256(\n abi.encodePacked(\n _xDomainCalldata,\n resolve(\"OVM_L2CrossDomainMessenger\")\n )\n ),\n uint256(0)\n )\n );\n\n (\n bool exists,\n bytes memory encodedMessagePassingAccount\n ) = Lib_SecureMerkleTrie.get(\n abi.encodePacked(0x4200000000000000000000000000000000000000),\n _proof.stateTrieWitness,\n _proof.stateRoot\n );\n\n require(\n exists == true,\n \"Message passing predeploy has not been initialized or invalid proof provided.\"\n );\n\n Lib_OVMCodec.EVMAccount memory account = Lib_OVMCodec.decodeEVMAccount(\n encodedMessagePassingAccount\n );\n\n return Lib_SecureMerkleTrie.verifyInclusionProof(\n abi.encodePacked(storageKey),\n abi.encodePacked(uint8(1)),\n _proof.storageTrieWitness,\n account.storageRoot\n );\n }\n\n /**\n * Sends a cross domain message.\n * @param _message Message to send.\n * @param _gasLimit OVM gas limit for the message.\n */\n function _sendXDomainMessage(\n bytes memory _message,\n uint256 _gasLimit\n )\n override\n internal\n {\n iOVM_CanonicalTransactionChain(resolve(\"OVM_CanonicalTransactionChain\")).enqueue(\n resolve(\"OVM_L2CrossDomainMessenger\"),\n _gasLimit,\n _message\n );\n }\n}\n" + }, + "contracts/optimistic-ethereum/iOVM/bridge/messaging/iOVM_L1CrossDomainMessenger.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../../libraries/codec/Lib_OVMCodec.sol\";\n\n/* Interface Imports */\nimport { iAbs_BaseCrossDomainMessenger } from \"./iAbs_BaseCrossDomainMessenger.sol\";\n\n/**\n * @title iOVM_L1CrossDomainMessenger\n */\ninterface iOVM_L1CrossDomainMessenger is iAbs_BaseCrossDomainMessenger {\n\n /*******************\n * Data Structures *\n *******************/\n\n struct L2MessageInclusionProof {\n bytes32 stateRoot;\n Lib_OVMCodec.ChainBatchHeader stateRootBatchHeader;\n Lib_OVMCodec.ChainInclusionProof stateRootProof;\n bytes stateTrieWitness;\n bytes storageTrieWitness;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Relays a cross domain message to a contract.\n * @param _target Target contract address.\n * @param _sender Message sender address.\n * @param _message Message to send to the target.\n * @param _messageNonce Nonce for the provided message.\n * @param _proof Inclusion proof for the given message.\n */\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce,\n L2MessageInclusionProof memory _proof\n ) external;\n\n /**\n * Replays a cross domain message to the target messenger.\n * @param _target Target contract address.\n * @param _sender Original sender address.\n * @param _message Message to send to the target.\n * @param _messageNonce Nonce for the provided message.\n * @param _gasLimit Gas limit for the provided message.\n */\n function replayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce,\n uint32 _gasLimit\n ) external;\n}\n" + }, + "contracts/optimistic-ethereum/OVM/bridge/messaging/Abs_BaseCrossDomainMessenger.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Interface Imports */\nimport { iAbs_BaseCrossDomainMessenger } from \"../../../iOVM/bridge/messaging/iAbs_BaseCrossDomainMessenger.sol\";\n\n/**\n * @title Abs_BaseCrossDomainMessenger\n * @dev The Base Cross Domain Messenger is an abstract contract providing the interface and common\n * functionality used in the L1 and L2 Cross Domain Messengers. It can also serve as a template for\n * developers wishing to implement a custom bridge contract to suit their needs.\n *\n * Compiler used: defined by child contract\n * Runtime target: defined by child contract\n */\nabstract contract Abs_BaseCrossDomainMessenger is iAbs_BaseCrossDomainMessenger {\n\n /*************\n * Constants *\n *************/\n\n // The default x-domain message sender being set to a non-zero value makes\n // deployment a bit more expensive, but in exchange the refund on every call to\n // `relayMessage` by the L1 and L2 messengers will be higher.\n address internal constant DEFAULT_XDOMAIN_SENDER = 0x000000000000000000000000000000000000dEaD;\n\n\n /*************\n * Variables *\n *************/\n\n mapping (bytes32 => bool) public relayedMessages;\n mapping (bytes32 => bool) public successfulMessages;\n mapping (bytes32 => bool) public sentMessages;\n uint256 public messageNonce;\n address internal xDomainMsgSender = DEFAULT_XDOMAIN_SENDER;\n\n\n /***************\n * Constructor *\n ***************/\n\n constructor() {}\n\n\n /********************\n * Public Functions *\n ********************/\n\n function xDomainMessageSender()\n public\n override\n view\n returns (\n address\n )\n {\n require(xDomainMsgSender != DEFAULT_XDOMAIN_SENDER, \"xDomainMessageSender is not set\");\n return xDomainMsgSender;\n }\n\n /**\n * Sends a cross domain message to the target messenger.\n * @param _target Target contract address.\n * @param _message Message to send to the target.\n * @param _gasLimit Gas limit for the provided message.\n */\n function sendMessage(\n address _target,\n bytes memory _message,\n uint32 _gasLimit\n )\n override\n public\n {\n bytes memory xDomainCalldata = _getXDomainCalldata(\n _target,\n msg.sender,\n _message,\n messageNonce\n );\n\n messageNonce += 1;\n sentMessages[keccak256(xDomainCalldata)] = true;\n\n _sendXDomainMessage(xDomainCalldata, _gasLimit);\n emit SentMessage(xDomainCalldata);\n }\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Generates the correct cross domain calldata for a message.\n * @param _target Target contract address.\n * @param _sender Message sender address.\n * @param _message Message to send to the target.\n * @param _messageNonce Nonce for the provided message.\n * @return ABI encoded cross domain calldata.\n */\n function _getXDomainCalldata(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n return abi.encodeWithSignature(\n \"relayMessage(address,address,bytes,uint256)\",\n _target,\n _sender,\n _message,\n _messageNonce\n );\n }\n\n /**\n * Sends a cross domain message.\n * param // Message to send.\n * param // Gas limit for the provided message.\n */\n function _sendXDomainMessage(\n bytes memory, // _message,\n uint256 // _gasLimit\n )\n virtual\n internal\n {\n revert(\"Implement me in child contracts!\");\n }\n}\n" + }, + "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n\npragma solidity >=0.6.0 <0.8.0;\n\nimport \"../utils/ContextUpgradeable.sol\";\nimport \"../proxy/Initializable.sol\";\n/**\n * @dev Contract module which provides a basic access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * By default, the owner account will be the one that deploys the contract. This\n * can later be changed with {transferOwnership}.\n *\n * This module is used through inheritance. It will make available the modifier\n * `onlyOwner`, which can be applied to your functions to restrict their use to\n * the owner.\n */\nabstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {\n address private _owner;\n\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n /**\n * @dev Initializes the contract setting the deployer as the initial owner.\n */\n function __Ownable_init() internal initializer {\n __Context_init_unchained();\n __Ownable_init_unchained();\n }\n\n function __Ownable_init_unchained() internal initializer {\n address msgSender = _msgSender();\n _owner = msgSender;\n emit OwnershipTransferred(address(0), msgSender);\n }\n\n /**\n * @dev Returns the address of the current owner.\n */\n function owner() public view virtual returns (address) {\n return _owner;\n }\n\n /**\n * @dev Throws if called by any account other than the owner.\n */\n modifier onlyOwner() {\n require(owner() == _msgSender(), \"Ownable: caller is not the owner\");\n _;\n }\n\n /**\n * @dev Leaves the contract without owner. It will not be possible to call\n * `onlyOwner` functions anymore. Can only be called by the current owner.\n *\n * NOTE: Renouncing ownership will leave the contract without an owner,\n * thereby removing any functionality that is only available to the owner.\n */\n function renounceOwnership() public virtual onlyOwner {\n emit OwnershipTransferred(_owner, address(0));\n _owner = address(0);\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Can only be called by the current owner.\n */\n function transferOwnership(address newOwner) public virtual onlyOwner {\n require(newOwner != address(0), \"Ownable: new owner is the zero address\");\n emit OwnershipTransferred(_owner, newOwner);\n _owner = newOwner;\n }\n uint256[49] private __gap;\n}\n" + }, + "@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n\npragma solidity >=0.6.0 <0.8.0;\n\nimport \"./ContextUpgradeable.sol\";\nimport \"../proxy/Initializable.sol\";\n\n/**\n * @dev Contract module which allows children to implement an emergency stop\n * mechanism that can be triggered by an authorized account.\n *\n * This module is used through inheritance. It will make available the\n * modifiers `whenNotPaused` and `whenPaused`, which can be applied to\n * the functions of your contract. Note that they will not be pausable by\n * simply including this module, only once the modifiers are put in place.\n */\nabstract contract PausableUpgradeable is Initializable, ContextUpgradeable {\n /**\n * @dev Emitted when the pause is triggered by `account`.\n */\n event Paused(address account);\n\n /**\n * @dev Emitted when the pause is lifted by `account`.\n */\n event Unpaused(address account);\n\n bool private _paused;\n\n /**\n * @dev Initializes the contract in unpaused state.\n */\n function __Pausable_init() internal initializer {\n __Context_init_unchained();\n __Pausable_init_unchained();\n }\n\n function __Pausable_init_unchained() internal initializer {\n _paused = false;\n }\n\n /**\n * @dev Returns true if the contract is paused, and false otherwise.\n */\n function paused() public view virtual returns (bool) {\n return _paused;\n }\n\n /**\n * @dev Modifier to make a function callable only when the contract is not paused.\n *\n * Requirements:\n *\n * - The contract must not be paused.\n */\n modifier whenNotPaused() {\n require(!paused(), \"Pausable: paused\");\n _;\n }\n\n /**\n * @dev Modifier to make a function callable only when the contract is paused.\n *\n * Requirements:\n *\n * - The contract must be paused.\n */\n modifier whenPaused() {\n require(paused(), \"Pausable: not paused\");\n _;\n }\n\n /**\n * @dev Triggers stopped state.\n *\n * Requirements:\n *\n * - The contract must not be paused.\n */\n function _pause() internal virtual whenNotPaused {\n _paused = true;\n emit Paused(_msgSender());\n }\n\n /**\n * @dev Returns to normal state.\n *\n * Requirements:\n *\n * - The contract must be paused.\n */\n function _unpause() internal virtual whenPaused {\n _paused = false;\n emit Unpaused(_msgSender());\n }\n uint256[49] private __gap;\n}\n" + }, + "@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n\npragma solidity >=0.6.0 <0.8.0;\nimport \"../proxy/Initializable.sol\";\n\n/**\n * @dev Contract module that helps prevent reentrant calls to a function.\n *\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\n * available, which can be applied to functions to make sure there are no nested\n * (reentrant) calls to them.\n *\n * Note that because there is a single `nonReentrant` guard, functions marked as\n * `nonReentrant` may not call one another. This can be worked around by making\n * those functions `private`, and then adding `external` `nonReentrant` entry\n * points to them.\n *\n * TIP: If you would like to learn more about reentrancy and alternative ways\n * to protect against it, check out our blog post\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\n */\nabstract contract ReentrancyGuardUpgradeable is Initializable {\n // Booleans are more expensive than uint256 or any type that takes up a full\n // word because each write operation emits an extra SLOAD to first read the\n // slot's contents, replace the bits taken up by the boolean, and then write\n // back. This is the compiler's defense against contract upgrades and\n // pointer aliasing, and it cannot be disabled.\n\n // The values being non-zero value makes deployment a bit more expensive,\n // but in exchange the refund on every call to nonReentrant will be lower in\n // amount. Since refunds are capped to a percentage of the total\n // transaction's gas, it is best to keep them low in cases like this one, to\n // increase the likelihood of the full refund coming into effect.\n uint256 private constant _NOT_ENTERED = 1;\n uint256 private constant _ENTERED = 2;\n\n uint256 private _status;\n\n function __ReentrancyGuard_init() internal initializer {\n __ReentrancyGuard_init_unchained();\n }\n\n function __ReentrancyGuard_init_unchained() internal initializer {\n _status = _NOT_ENTERED;\n }\n\n /**\n * @dev Prevents a contract from calling itself, directly or indirectly.\n * Calling a `nonReentrant` function from another `nonReentrant`\n * function is not supported. It is possible to prevent this from happening\n * by making the `nonReentrant` function external, and make it call a\n * `private` function that does the actual work.\n */\n modifier nonReentrant() {\n // On the first call to nonReentrant, _notEntered will be true\n require(_status != _ENTERED, \"ReentrancyGuard: reentrant call\");\n\n // Any calls to nonReentrant after this point will fail\n _status = _ENTERED;\n\n _;\n\n // By storing the original value once again, a refund is triggered (see\n // https://eips.ethereum.org/EIPS/eip-2200)\n _status = _NOT_ENTERED;\n }\n uint256[49] private __gap;\n}\n" + }, + "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n\npragma solidity >=0.6.0 <0.8.0;\nimport \"../proxy/Initializable.sol\";\n\n/*\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with GSN meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract ContextUpgradeable is Initializable {\n function __Context_init() internal initializer {\n __Context_init_unchained();\n }\n\n function __Context_init_unchained() internal initializer {\n }\n function _msgSender() internal view virtual returns (address payable) {\n return msg.sender;\n }\n\n function _msgData() internal view virtual returns (bytes memory) {\n this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\n return msg.data;\n }\n uint256[50] private __gap;\n}\n" + }, + "@openzeppelin/contracts-upgradeable/proxy/Initializable.sol": { + "content": "// SPDX-License-Identifier: MIT\n\n// solhint-disable-next-line compiler-version\npragma solidity >=0.4.24 <0.8.0;\n\nimport \"../utils/AddressUpgradeable.sol\";\n\n/**\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\n * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\n *\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\n * possible by providing the encoded function call as the `_data` argument to {UpgradeableProxy-constructor}.\n *\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\n */\nabstract contract Initializable {\n\n /**\n * @dev Indicates that the contract has been initialized.\n */\n bool private _initialized;\n\n /**\n * @dev Indicates that the contract is in the process of being initialized.\n */\n bool private _initializing;\n\n /**\n * @dev Modifier to protect an initializer function from being invoked twice.\n */\n modifier initializer() {\n require(_initializing || _isConstructor() || !_initialized, \"Initializable: contract is already initialized\");\n\n bool isTopLevelCall = !_initializing;\n if (isTopLevelCall) {\n _initializing = true;\n _initialized = true;\n }\n\n _;\n\n if (isTopLevelCall) {\n _initializing = false;\n }\n }\n\n /// @dev Returns true if and only if the function is running in the constructor\n function _isConstructor() private view returns (bool) {\n return !AddressUpgradeable.isContract(address(this));\n }\n}\n" + }, + "@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n\npragma solidity >=0.6.2 <0.8.0;\n\n/**\n * @dev Collection of functions related to the address type\n */\nlibrary AddressUpgradeable {\n /**\n * @dev Returns true if `account` is a contract.\n *\n * [IMPORTANT]\n * ====\n * It is unsafe to assume that an address for which this function returns\n * false is an externally-owned account (EOA) and not a contract.\n *\n * Among others, `isContract` will return false for the following\n * types of addresses:\n *\n * - an externally-owned account\n * - a contract in construction\n * - an address where a contract will be created\n * - an address where a contract lived, but was destroyed\n * ====\n */\n function isContract(address account) internal view returns (bool) {\n // This method relies on extcodesize, which returns 0 for contracts in\n // construction, since the code is only stored at the end of the\n // constructor execution.\n\n uint256 size;\n // solhint-disable-next-line no-inline-assembly\n assembly { size := extcodesize(account) }\n return size > 0;\n }\n\n /**\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\n * `recipient`, forwarding all available gas and reverting on errors.\n *\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\n * imposed by `transfer`, making them unable to receive funds via\n * `transfer`. {sendValue} removes this limitation.\n *\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\n *\n * IMPORTANT: because control is transferred to `recipient`, care must be\n * taken to not create reentrancy vulnerabilities. Consider using\n * {ReentrancyGuard} or the\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\n */\n function sendValue(address payable recipient, uint256 amount) internal {\n require(address(this).balance >= amount, \"Address: insufficient balance\");\n\n // solhint-disable-next-line avoid-low-level-calls, avoid-call-value\n (bool success, ) = recipient.call{ value: amount }(\"\");\n require(success, \"Address: unable to send value, recipient may have reverted\");\n }\n\n /**\n * @dev Performs a Solidity function call using a low level `call`. A\n * plain`call` is an unsafe replacement for a function call: use this\n * function instead.\n *\n * If `target` reverts with a revert reason, it is bubbled up by this\n * function (like regular Solidity function calls).\n *\n * Returns the raw returned data. To convert to the expected return value,\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\n *\n * Requirements:\n *\n * - `target` must be a contract.\n * - calling `target` with `data` must not revert.\n *\n * _Available since v3.1._\n */\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionCall(target, data, \"Address: low-level call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\n * `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\n return functionCallWithValue(target, data, 0, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but also transferring `value` wei to `target`.\n *\n * Requirements:\n *\n * - the calling contract must have an ETH balance of at least `value`.\n * - the called Solidity function must be `payable`.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\n return functionCallWithValue(target, data, value, \"Address: low-level call with value failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\n * with `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {\n require(address(this).balance >= value, \"Address: insufficient balance for call\");\n require(isContract(target), \"Address: call to non-contract\");\n\n // solhint-disable-next-line avoid-low-level-calls\n (bool success, bytes memory returndata) = target.call{ value: value }(data);\n return _verifyCallResult(success, returndata, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\n return functionStaticCall(target, data, \"Address: low-level static call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {\n require(isContract(target), \"Address: static call to non-contract\");\n\n // solhint-disable-next-line avoid-low-level-calls\n (bool success, bytes memory returndata) = target.staticcall(data);\n return _verifyCallResult(success, returndata, errorMessage);\n }\n\n function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {\n if (success) {\n return returndata;\n } else {\n // Look for revert reason and bubble it up if present\n if (returndata.length > 0) {\n // The easiest way to bubble the revert reason is using memory via assembly\n\n // solhint-disable-next-line no-inline-assembly\n assembly {\n let returndata_size := mload(returndata)\n revert(add(32, returndata), returndata_size)\n }\n } else {\n revert(errorMessage);\n }\n }\n }\n}\n" + }, + "contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L2CrossDomainMessenger.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_AddressResolver } from \"../../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/* Interface Imports */\nimport { iOVM_L2CrossDomainMessenger } from \"../../../iOVM/bridge/messaging/iOVM_L2CrossDomainMessenger.sol\";\nimport { iOVM_L1MessageSender } from \"../../../iOVM/predeploys/iOVM_L1MessageSender.sol\";\nimport { iOVM_L2ToL1MessagePasser } from \"../../../iOVM/predeploys/iOVM_L2ToL1MessagePasser.sol\";\n\n/* Contract Imports */\nimport { Abs_BaseCrossDomainMessenger } from \"./Abs_BaseCrossDomainMessenger.sol\";\n\n/* External Imports */\nimport { ReentrancyGuard } from \"@openzeppelin/contracts/utils/ReentrancyGuard.sol\";\n\n/**\n * @title OVM_L2CrossDomainMessenger\n * @dev The L2 Cross Domain Messenger contract sends messages from L2 to L1, and is the entry point\n * for L2 messages sent via the L1 Cross Domain Messenger.\n *\n * Compiler used: optimistic-solc\n * Runtime target: OVM\n */\ncontract OVM_L2CrossDomainMessenger is\n iOVM_L2CrossDomainMessenger,\n Abs_BaseCrossDomainMessenger,\n Lib_AddressResolver,\n ReentrancyGuard\n{\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n constructor(\n address _libAddressManager\n )\n Lib_AddressResolver(_libAddressManager)\n ReentrancyGuard()\n {}\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Relays a cross domain message to a contract.\n * @inheritdoc iOVM_L2CrossDomainMessenger\n */\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce\n )\n override\n nonReentrant\n public\n {\n require(\n _verifyXDomainMessage() == true,\n \"Provided message could not be verified.\"\n );\n\n bytes memory xDomainCalldata = _getXDomainCalldata(\n _target,\n _sender,\n _message,\n _messageNonce\n );\n\n bytes32 xDomainCalldataHash = keccak256(xDomainCalldata);\n\n require(\n successfulMessages[xDomainCalldataHash] == false,\n \"Provided message has already been received.\"\n );\n\n // Prevent calls to OVM_L2ToL1MessagePasser, which would enable\n // an attacker to maliciously craft the _message to spoof\n // a call from any L2 account.\n if(_target == resolve(\"OVM_L2ToL1MessagePasser\")){\n // Write to the successfulMessages mapping and return immediately.\n successfulMessages[xDomainCalldataHash] = true;\n return;\n }\n\n xDomainMsgSender = _sender;\n (bool success, ) = _target.call(_message);\n xDomainMsgSender = DEFAULT_XDOMAIN_SENDER;\n\n // Mark the message as received if the call was successful. Ensures that a message can be\n // relayed multiple times in the case that the call reverted.\n if (success == true) {\n successfulMessages[xDomainCalldataHash] = true;\n emit RelayedMessage(xDomainCalldataHash);\n } else {\n emit FailedRelayedMessage(xDomainCalldataHash);\n }\n\n // Store an identifier that can be used to prove that the given message was relayed by some\n // user. Gives us an easy way to pay relayers for their work.\n bytes32 relayId = keccak256(\n abi.encodePacked(\n xDomainCalldata,\n msg.sender,\n block.number\n )\n );\n\n relayedMessages[relayId] = true;\n }\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Verifies that a received cross domain message is valid.\n * @return _valid Whether or not the message is valid.\n */\n function _verifyXDomainMessage()\n view\n internal\n returns (\n bool _valid\n )\n {\n return (\n iOVM_L1MessageSender(\n resolve(\"OVM_L1MessageSender\")\n ).getL1MessageSender() == resolve(\"OVM_L1CrossDomainMessenger\")\n );\n }\n\n /**\n * Sends a cross domain message.\n * @param _message Message to send.\n * param _gasLimit Gas limit for the provided message.\n */\n function _sendXDomainMessage(\n bytes memory _message,\n uint256 // _gasLimit\n )\n override\n internal\n {\n iOVM_L2ToL1MessagePasser(resolve(\"OVM_L2ToL1MessagePasser\")).passMessageToL1(_message);\n }\n}\n" + }, + "contracts/optimistic-ethereum/iOVM/bridge/messaging/iOVM_L2CrossDomainMessenger.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Interface Imports */\nimport { iAbs_BaseCrossDomainMessenger } from \"./iAbs_BaseCrossDomainMessenger.sol\";\n\n/**\n * @title iOVM_L2CrossDomainMessenger\n */\ninterface iOVM_L2CrossDomainMessenger is iAbs_BaseCrossDomainMessenger {\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Relays a cross domain message to a contract.\n * @param _target Target contract address.\n * @param _sender Message sender address.\n * @param _message Message to send to the target.\n * @param _messageNonce Nonce for the provided message.\n */\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce\n ) external;\n}\n" + }, + "contracts/optimistic-ethereum/iOVM/predeploys/iOVM_L1MessageSender.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/**\n * @title iOVM_L1MessageSender\n */\ninterface iOVM_L1MessageSender {\n\n /********************\n * Public Functions *\n ********************/\n\n function getL1MessageSender() external view returns (address _l1MessageSender);\n}\n" + }, + "contracts/optimistic-ethereum/iOVM/predeploys/iOVM_L2ToL1MessagePasser.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/**\n * @title iOVM_L2ToL1MessagePasser\n */\ninterface iOVM_L2ToL1MessagePasser {\n\n /**********\n * Events *\n **********/\n\n event L2ToL1Message(\n uint256 _nonce,\n address _sender,\n bytes _data\n );\n\n\n /********************\n * Public Functions *\n ********************/\n\n function passMessageToL1(bytes calldata _message) external;\n}\n" + }, + "@openzeppelin/contracts/utils/ReentrancyGuard.sol": { + "content": "// SPDX-License-Identifier: MIT\n\npragma solidity >=0.6.0 <0.8.0;\n\n/**\n * @dev Contract module that helps prevent reentrant calls to a function.\n *\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\n * available, which can be applied to functions to make sure there are no nested\n * (reentrant) calls to them.\n *\n * Note that because there is a single `nonReentrant` guard, functions marked as\n * `nonReentrant` may not call one another. This can be worked around by making\n * those functions `private`, and then adding `external` `nonReentrant` entry\n * points to them.\n *\n * TIP: If you would like to learn more about reentrancy and alternative ways\n * to protect against it, check out our blog post\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\n */\nabstract contract ReentrancyGuard {\n // Booleans are more expensive than uint256 or any type that takes up a full\n // word because each write operation emits an extra SLOAD to first read the\n // slot's contents, replace the bits taken up by the boolean, and then write\n // back. This is the compiler's defense against contract upgrades and\n // pointer aliasing, and it cannot be disabled.\n\n // The values being non-zero value makes deployment a bit more expensive,\n // but in exchange the refund on every call to nonReentrant will be lower in\n // amount. Since refunds are capped to a percentage of the total\n // transaction's gas, it is best to keep them low in cases like this one, to\n // increase the likelihood of the full refund coming into effect.\n uint256 private constant _NOT_ENTERED = 1;\n uint256 private constant _ENTERED = 2;\n\n uint256 private _status;\n\n constructor () internal {\n _status = _NOT_ENTERED;\n }\n\n /**\n * @dev Prevents a contract from calling itself, directly or indirectly.\n * Calling a `nonReentrant` function from another `nonReentrant`\n * function is not supported. It is possible to prevent this from happening\n * by making the `nonReentrant` function external, and make it call a\n * `private` function that does the actual work.\n */\n modifier nonReentrant() {\n // On the first call to nonReentrant, _notEntered will be true\n require(_status != _ENTERED, \"ReentrancyGuard: reentrant call\");\n\n // Any calls to nonReentrant after this point will fail\n _status = _ENTERED;\n\n _;\n\n // By storing the original value once again, a refund is triggered (see\n // https://eips.ethereum.org/EIPS/eip-2200)\n _status = _NOT_ENTERED;\n }\n}\n" + }, + "contracts/optimistic-ethereum/OVM/predeploys/OVM_L2ToL1MessagePasser.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Interface Imports */\nimport { iOVM_L2ToL1MessagePasser } from \"../../iOVM/predeploys/iOVM_L2ToL1MessagePasser.sol\";\n\n/**\n * @title OVM_L2ToL1MessagePasser\n * @dev The L2 to L1 Message Passer is a utility contract which facilitate an L1 proof of the\n * of a message on L2. The L1 Cross Domain Messenger performs this proof in its\n * _verifyStorageProof function, which verifies the existence of the transaction hash in this\n * contract's `sentMessages` mapping.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract OVM_L2ToL1MessagePasser is iOVM_L2ToL1MessagePasser {\n\n /**********************\n * Contract Variables *\n **********************/\n\n mapping (bytes32 => bool) public sentMessages;\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Passes a message to L1.\n * @param _message Message to pass to L1.\n */\n function passMessageToL1(\n bytes memory _message\n )\n override\n public\n {\n // Note: although this function is public, only messages sent from the OVM_L2CrossDomainMessenger\n // will be relayed by the OVM_L1CrossDomainMessenger. This is enforced by a check in\n // OVM_L1CrossDomainMessenger._verifyStorageProof().\n sentMessages[keccak256(\n abi.encodePacked(\n _message,\n msg.sender\n )\n )] = true;\n }\n}\n" + }, + "contracts/optimistic-ethereum/OVM/predeploys/OVM_L1MessageSender.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Interface Imports */\nimport { iOVM_L1MessageSender } from \"../../iOVM/predeploys/iOVM_L1MessageSender.sol\";\nimport { iOVM_ExecutionManager } from \"../../iOVM/execution/iOVM_ExecutionManager.sol\";\n\n/**\n * @title OVM_L1MessageSender\n * @dev The L1MessageSender is a predeploy contract running on L2. During the execution of cross\n * domain transaction from L1 to L2, it returns the address of the L1 account (either an EOA or\n * contract) which sent the message to L2 via the Canonical Transaction Chain's `enqueue()`\n * function.\n *\n * This contract exclusively serves as a getter for the ovmL1TXORIGIN operation. This is necessary\n * because there is no corresponding operation in the EVM which the the optimistic solidity compiler\n * can be replaced with a call to the ExecutionManager's ovmL1TXORIGIN() function.\n *\n *\n * Compiler used: solc\n * Runtime target: OVM\n */\ncontract OVM_L1MessageSender is iOVM_L1MessageSender {\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @return _l1MessageSender L1 message sender address (msg.sender).\n */\n function getL1MessageSender()\n override\n public\n view\n returns (\n address _l1MessageSender\n )\n {\n // Note that on L2 msg.sender (ie. evmCALLER) will always be the Execution Manager\n return iOVM_ExecutionManager(msg.sender).ovmL1TXORIGIN();\n }\n}\n" + }, + "contracts/optimistic-ethereum/OVM/bridge/tokens/OVM_L1ETHGateway.sol": { + "content": "// SPDX-License-Identifier: MIT\n// @unsupported: ovm\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Interface Imports */\nimport { iOVM_L1ETHGateway } from \"../../../iOVM/bridge/tokens/iOVM_L1ETHGateway.sol\";\nimport { iOVM_L2DepositedToken } from \"../../../iOVM/bridge/tokens/iOVM_L2DepositedToken.sol\";\n\n/* Library Imports */\nimport { OVM_CrossDomainEnabled } from \"../../../libraries/bridge/OVM_CrossDomainEnabled.sol\";\nimport { Lib_AddressResolver } from \"../../../libraries/resolver/Lib_AddressResolver.sol\";\nimport { Lib_AddressManager } from \"../../../libraries/resolver/Lib_AddressManager.sol\";\n\n/**\n * @title OVM_L1ETHGateway\n * @dev The L1 ETH Gateway is a contract which stores deposited ETH that is in use on L2.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract OVM_L1ETHGateway is iOVM_L1ETHGateway, OVM_CrossDomainEnabled, Lib_AddressResolver {\n\n /********************\n * Public Constants *\n ********************/\n\n uint32 public constant override getFinalizeDepositL2Gas = 1200000;\n\n /********************************\n * External Contract References *\n ********************************/\n\n address public ovmEth;\n\n /***************\n * Constructor *\n ***************/\n\n // This contract lives behind a proxy, so the constructor parameters will go unused.\n constructor()\n OVM_CrossDomainEnabled(address(0))\n Lib_AddressResolver(address(0))\n public\n {}\n\n /******************\n * Initialization *\n ******************/\n\n /**\n * @param _libAddressManager Address manager for this OE deployment\n * @param _ovmEth L2 OVM_ETH implementation of iOVM_DepositedToken\n */\n function initialize(\n address _libAddressManager,\n address _ovmEth\n )\n public\n {\n require(libAddressManager == Lib_AddressManager(0), \"Contract has already been initialized.\");\n libAddressManager = Lib_AddressManager(_libAddressManager);\n ovmEth = _ovmEth;\n messenger = resolve(\"Proxy__OVM_L1CrossDomainMessenger\");\n }\n\n /**************\n * Depositing *\n **************/\n\n receive()\n external\n payable\n {\n _initiateDeposit(msg.sender, msg.sender);\n }\n\n /**\n * @dev deposit an amount of the ETH to the caller's balance on L2\n */\n function deposit()\n external\n override\n payable\n {\n _initiateDeposit(msg.sender, msg.sender);\n }\n\n /**\n * @dev deposit an amount of ETH to a recipients's balance on L2\n * @param _to L2 address to credit the withdrawal to\n */\n function depositTo(\n address _to\n )\n external\n override\n payable\n {\n _initiateDeposit(msg.sender, _to);\n }\n\n /**\n * @dev Performs the logic for deposits by storing the ETH and informing the L2 ETH Gateway of the deposit.\n *\n * @param _from Account to pull the deposit from on L1\n * @param _to Account to give the deposit to on L2\n */\n function _initiateDeposit(\n address _from,\n address _to\n )\n internal\n {\n // Construct calldata for l2ETHGateway.finalizeDeposit(_to, _amount)\n bytes memory data =\n abi.encodeWithSelector(\n iOVM_L2DepositedToken.finalizeDeposit.selector,\n _to,\n msg.value\n );\n\n // Send calldata into L2\n sendCrossDomainMessage(\n ovmEth,\n data,\n getFinalizeDepositL2Gas\n );\n\n emit DepositInitiated(_from, _to, msg.value);\n }\n\n /*************************\n * Cross-chain Functions *\n *************************/\n\n /**\n * @dev Complete a withdrawal from L2 to L1, and credit funds to the recipient's balance of the\n * L1 ETH token.\n * Since only the xDomainMessenger can call this function, it will never be called before the withdrawal is finalized.\n *\n * @param _to L1 address to credit the withdrawal to\n * @param _amount Amount of the ETH to withdraw\n */\n function finalizeWithdrawal(\n address _to,\n uint256 _amount\n )\n external\n override\n onlyFromCrossDomainAccount(ovmEth)\n {\n _safeTransferETH(_to, _amount);\n\n emit WithdrawalFinalized(_to, _amount);\n }\n\n /**********************************\n * Internal Functions: Accounting *\n **********************************/\n\n /**\n * @dev Internal accounting function for moving around L1 ETH.\n *\n * @param _to L1 address to transfer ETH to\n * @param _value Amount of ETH to send to\n */\n function _safeTransferETH(\n address _to,\n uint256 _value\n )\n internal\n {\n (bool success, ) = _to.call{value: _value}(new bytes(0));\n require(success, 'TransferHelper::safeTransferETH: ETH transfer failed');\n }\n}\n" + }, + "contracts/optimistic-ethereum/iOVM/bridge/tokens/iOVM_L1ETHGateway.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0;\npragma experimental ABIEncoderV2;\n\n/**\n * @title iOVM_L1ETHGateway\n */\ninterface iOVM_L1ETHGateway {\n\n /**********\n * Events *\n **********/\n\n event DepositInitiated(\n address indexed _from,\n address _to,\n uint256 _amount\n );\n\n event WithdrawalFinalized(\n address indexed _to,\n uint256 _amount\n );\n\n /********************\n * Public Functions *\n ********************/\n\n function deposit()\n external\n payable;\n\n function depositTo(\n address _to\n )\n external\n payable;\n\n /*************************\n * Cross-chain Functions *\n *************************/\n\n function finalizeWithdrawal(\n address _to,\n uint _amount\n )\n external;\n\n function getFinalizeDepositL2Gas()\n external\n view\n returns(\n uint32\n );\n}\n" + }, + "contracts/optimistic-ethereum/libraries/resolver/Lib_ResolvedDelegateProxy.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Library Imports */\nimport { Lib_AddressManager } from \"./Lib_AddressManager.sol\";\n\n/**\n * @title Lib_ResolvedDelegateProxy\n */\ncontract Lib_ResolvedDelegateProxy {\n\n /*************\n * Variables *\n *************/\n\n // Using mappings to store fields to avoid overwriting storage slots in the\n // implementation contract. For example, instead of storing these fields at\n // storage slot `0` & `1`, they are stored at `keccak256(key + slot)`.\n // See: https://solidity.readthedocs.io/en/v0.7.0/internals/layout_in_storage.html\n // NOTE: Do not use this code in your own contract system.\n // There is a known flaw in this contract, and we will remove it from the repository\n // in the near future. Due to the very limited way that we are using it, this flaw is\n // not an issue in our system.\n mapping (address => string) private implementationName;\n mapping (address => Lib_AddressManager) private addressManager;\n\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Lib_AddressManager.\n * @param _implementationName implementationName of the contract to proxy to.\n */\n constructor(\n address _libAddressManager,\n string memory _implementationName\n ) {\n addressManager[address(this)] = Lib_AddressManager(_libAddressManager);\n implementationName[address(this)] = _implementationName;\n }\n\n\n /*********************\n * Fallback Function *\n *********************/\n\n fallback()\n external\n payable\n {\n address target = addressManager[address(this)].getAddress(\n (implementationName[address(this)])\n );\n\n require(\n target != address(0),\n \"Target address must be initialized.\"\n );\n\n (bool success, bytes memory returndata) = target.delegatecall(msg.data);\n\n if (success == true) {\n assembly {\n return(add(returndata, 0x20), mload(returndata))\n }\n } else {\n assembly {\n revert(add(returndata, 0x20), mload(returndata))\n }\n }\n }\n}\n" + }, + "contracts/optimistic-ethereum/OVM/bridge/tokens/Abs_L1TokenGateway.sol": { + "content": "// SPDX-License-Identifier: MIT\n// @unsupported: ovm\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Interface Imports */\nimport { iOVM_L1TokenGateway } from \"../../../iOVM/bridge/tokens/iOVM_L1TokenGateway.sol\";\nimport { iOVM_L2DepositedToken } from \"../../../iOVM/bridge/tokens/iOVM_L2DepositedToken.sol\";\n\n/* Library Imports */\nimport { OVM_CrossDomainEnabled } from \"../../../libraries/bridge/OVM_CrossDomainEnabled.sol\";\n\n/**\n * @title Abs_L1TokenGateway\n * @dev An L1 Token Gateway is a contract which stores deposited L1 funds that are in use on L2.\n * It synchronizes a corresponding L2 representation of the \"deposited token\", informing it\n * of new deposits and releasing L1 funds when there are newly finalized withdrawals.\n *\n * NOTE: This abstract contract gives all the core functionality of an L1 token gateway,\n * but provides easy hooks in case developers need extensions in child contracts.\n * In many cases, the default OVM_L1ERC20Gateway will suffice.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\nabstract contract Abs_L1TokenGateway is iOVM_L1TokenGateway, OVM_CrossDomainEnabled {\n\n /********************************\n * External Contract References *\n ********************************/\n\n address public l2DepositedToken;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _l2DepositedToken iOVM_L2DepositedToken-compatible address on the chain being deposited into.\n * @param _l1messenger L1 Messenger address being used for cross-chain communications.\n */\n constructor(\n address _l2DepositedToken,\n address _l1messenger\n )\n OVM_CrossDomainEnabled(_l1messenger)\n {\n l2DepositedToken = _l2DepositedToken;\n }\n\n /********************************\n * Overridable Accounting logic *\n ********************************/\n\n // Default gas value which can be overridden if more complex logic runs on L2.\n uint32 internal constant DEFAULT_FINALIZE_DEPOSIT_L2_GAS = 1200000;\n\n /**\n * @dev Core logic to be performed when a withdrawal is finalized on L1.\n * In most cases, this will simply send locked funds to the withdrawer.\n *\n * param _to Address being withdrawn to.\n * param _amount Amount being withdrawn.\n */\n function _handleFinalizeWithdrawal(\n address, // _to,\n uint256 // _amount\n )\n internal\n virtual\n {\n revert(\"Implement me in child contracts\");\n }\n\n /**\n * @dev Core logic to be performed when a deposit is initiated on L1.\n * In most cases, this will simply send locked funds to the withdrawer.\n *\n * param _from Address being deposited from on L1.\n * param _to Address being deposited into on L2.\n * param _amount Amount being deposited.\n */\n function _handleInitiateDeposit(\n address, // _from,\n address, // _to,\n uint256 // _amount\n )\n internal\n virtual\n {\n revert(\"Implement me in child contracts\");\n }\n\n /**\n * @dev Overridable getter for the L2 gas limit, in the case it may be\n * dynamic, and the above public constant does not suffice.\n *\n */\n function getFinalizeDepositL2Gas()\n public\n view\n virtual\n returns(\n uint32\n )\n {\n return DEFAULT_FINALIZE_DEPOSIT_L2_GAS;\n }\n\n /**************\n * Depositing *\n **************/\n\n /**\n * @dev deposit an amount of the ERC20 to the caller's balance on L2\n * @param _amount Amount of the ERC20 to deposit\n */\n function deposit(\n uint _amount\n )\n external\n override\n virtual\n {\n _initiateDeposit(msg.sender, msg.sender, _amount);\n }\n\n /**\n * @dev deposit an amount of ERC20 to a recipients's balance on L2\n * @param _to L2 address to credit the withdrawal to\n * @param _amount Amount of the ERC20 to deposit\n */\n function depositTo(\n address _to,\n uint _amount\n )\n external\n override\n virtual\n {\n _initiateDeposit(msg.sender, _to, _amount);\n }\n\n /**\n * @dev Performs the logic for deposits by informing the L2 Deposited Token\n * contract of the deposit and calling a handler to lock the L1 funds. (e.g. transferFrom)\n *\n * @param _from Account to pull the deposit from on L1\n * @param _to Account to give the deposit to on L2\n * @param _amount Amount of the ERC20 to deposit.\n */\n function _initiateDeposit(\n address _from,\n address _to,\n uint _amount\n )\n internal\n {\n // Call our deposit accounting handler implemented by child contracts.\n _handleInitiateDeposit(\n _from,\n _to,\n _amount\n );\n\n // Construct calldata for l2DepositedToken.finalizeDeposit(_to, _amount)\n bytes memory data = abi.encodeWithSelector(\n iOVM_L2DepositedToken.finalizeDeposit.selector,\n _to,\n _amount\n );\n\n // Send calldata into L2\n sendCrossDomainMessage(\n l2DepositedToken,\n data,\n getFinalizeDepositL2Gas()\n );\n\n emit DepositInitiated(_from, _to, _amount);\n }\n\n /*************************\n * Cross-chain Functions *\n *************************/\n\n /**\n * @dev Complete a withdrawal from L2 to L1, and credit funds to the recipient's balance of the\n * L1 ERC20 token.\n * This call will fail if the initialized withdrawal from L2 has not been finalized.\n *\n * @param _to L1 address to credit the withdrawal to\n * @param _amount Amount of the ERC20 to withdraw\n */\n function finalizeWithdrawal(\n address _to,\n uint _amount\n )\n external\n override\n virtual\n onlyFromCrossDomainAccount(l2DepositedToken)\n {\n // Call our withdrawal accounting handler implemented by child contracts.\n _handleFinalizeWithdrawal(\n _to,\n _amount\n );\n\n emit WithdrawalFinalized(_to, _amount);\n }\n}\n" + }, + "contracts/optimistic-ethereum/OVM/bridge/tokens/OVM_L1ERC20Gateway.sol": { + "content": "// SPDX-License-Identifier: MIT\n// @unsupported: ovm\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Interface Imports */\nimport { iOVM_L1TokenGateway } from \"../../../iOVM/bridge/tokens/iOVM_L1TokenGateway.sol\";\nimport { Abs_L1TokenGateway } from \"./Abs_L1TokenGateway.sol\";\nimport { iOVM_ERC20 } from \"../../../iOVM/predeploys/iOVM_ERC20.sol\";\n\n/**\n * @title OVM_L1ERC20Gateway\n * @dev The L1 ERC20 Gateway is a contract which stores deposited L1 funds that are in use on L2.\n * It synchronizes a corresponding L2 ERC20 Gateway, informing it of deposits, and listening to it\n * for newly finalized withdrawals.\n *\n * NOTE: This contract extends Abs_L1TokenGateway, which is where we\n * takes care of most of the initialization and the cross-chain logic.\n * If you are looking to implement your own deposit/withdrawal contracts, you\n * may also want to extend the abstract contract in a similar manner.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract OVM_L1ERC20Gateway is Abs_L1TokenGateway {\n\n /********************************\n * External Contract References *\n ********************************/\n\n iOVM_ERC20 public l1ERC20;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _l1ERC20 L1 ERC20 address this contract stores deposits for\n * @param _l2DepositedERC20 L2 Gateway address on the chain being deposited into\n */\n constructor(\n iOVM_ERC20 _l1ERC20,\n address _l2DepositedERC20,\n address _l1messenger\n )\n Abs_L1TokenGateway(\n _l2DepositedERC20,\n _l1messenger\n )\n {\n l1ERC20 = _l1ERC20;\n }\n\n\n /**************\n * Accounting *\n **************/\n\n /**\n * @dev When a deposit is initiated on L1, the L1 Gateway\n * transfers the funds to itself for future withdrawals\n *\n * @param _from L1 address ETH is being deposited from\n * param _to L2 address that the ETH is being deposited to\n * @param _amount Amount of ERC20 to send\n */\n function _handleInitiateDeposit(\n address _from,\n address, // _to,\n uint256 _amount\n )\n internal\n override\n {\n // Hold on to the newly deposited funds\n l1ERC20.transferFrom(\n _from,\n address(this),\n _amount\n );\n }\n\n /**\n * @dev When a withdrawal is finalized on L1, the L1 Gateway\n * transfers the funds to the withdrawer\n *\n * @param _to L1 address that the ERC20 is being withdrawn to\n * @param _amount Amount of ERC20 to send\n */\n function _handleFinalizeWithdrawal(\n address _to,\n uint _amount\n )\n internal\n override\n {\n // Transfer withdrawn funds out to withdrawer\n l1ERC20.transfer(_to, _amount);\n }\n}\n" + }, + "contracts/optimistic-ethereum/iOVM/predeploys/iOVM_ERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/**\n * @title iOVM_ERC20\n */\ninterface iOVM_ERC20 {\n /* This is a slight change to the ERC20 base standard.\n function totalSupply() constant returns (uint256 supply);\n is replaced with:\n uint256 public totalSupply;\n This automatically creates a getter function for the totalSupply.\n This is moved to the base contract since public getter functions are not\n currently recognised as an implementation of the matching abstract\n function by the compiler.\n */\n /// total amount of tokens\n function totalSupply() external view returns (uint256);\n\n /// @param _owner The address from which the balance will be retrieved\n /// @return balance The balance\n function balanceOf(address _owner) external view returns (uint256 balance);\n\n /// @notice send `_value` token to `_to` from `msg.sender`\n /// @param _to The address of the recipient\n /// @param _value The amount of token to be transferred\n /// @return success Whether the transfer was successful or not\n function transfer(address _to, uint256 _value) external returns (bool success);\n\n /// @notice send `_value` token to `_to` from `_from` on the condition it is approved by `_from`\n /// @param _from The address of the sender\n /// @param _to The address of the recipient\n /// @param _value The amount of token to be transferred\n /// @return success Whether the transfer was successful or not\n function transferFrom(address _from, address _to, uint256 _value) external returns (bool success);\n\n /// @notice `msg.sender` approves `_spender` to spend `_value` tokens\n /// @param _spender The address of the account able to transfer the tokens\n /// @param _value The amount of tokens to be approved for transfer\n /// @return success Whether the approval was successful or not\n function approve(address _spender, uint256 _value) external returns (bool success);\n\n /// @param _owner The address of the account owning tokens\n /// @param _spender The address of the account able to transfer the tokens\n /// @return remaining Amount of remaining tokens allowed to spent\n function allowance(address _owner, address _spender) external view returns (uint256 remaining);\n\n // solhint-disable-next-line no-simple-event-func-name\n event Transfer(address indexed _from, address indexed _to, uint256 _value);\n event Approval(address indexed _owner, address indexed _spender, uint256 _value);\n event Mint(address indexed _account, uint256 _amount);\n event Burn(address indexed _account, uint256 _amount);\n}\n" + }, + "contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1MultiMessageRelayer.sol": { + "content": "// SPDX-License-Identifier: MIT\n// @unsupported: ovm\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Interface Imports */\nimport { iOVM_L1CrossDomainMessenger } from \"../../../iOVM/bridge/messaging/iOVM_L1CrossDomainMessenger.sol\";\nimport { iOVM_L1MultiMessageRelayer } from \"../../../iOVM/bridge/messaging/iOVM_L1MultiMessageRelayer.sol\";\n\n/* Library Imports */\nimport { Lib_AddressResolver } from \"../../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/**\n * @title OVM_L1MultiMessageRelayer\n * @dev The L1 Multi-Message Relayer contract is a gas efficiency optimization which enables the\n * relayer to submit multiple messages in a single transaction to be relayed by the L1 Cross Domain\n * Message Sender.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract OVM_L1MultiMessageRelayer is iOVM_L1MultiMessageRelayer, Lib_AddressResolver {\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n constructor(\n address _libAddressManager\n )\n Lib_AddressResolver(_libAddressManager)\n {}\n\n\n /**********************\n * Function Modifiers *\n **********************/\n\n modifier onlyBatchRelayer() {\n require(\n msg.sender == resolve(\"OVM_L2BatchMessageRelayer\"),\n \"OVM_L1MultiMessageRelayer: Function can only be called by the OVM_L2BatchMessageRelayer\"\n );\n _;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @notice Forwards multiple cross domain messages to the L1 Cross Domain Messenger for relaying\n * @param _messages An array of L2 to L1 messages\n */\n function batchRelayMessages(\n L2ToL1Message[] calldata _messages\n ) \n override\n external\n onlyBatchRelayer\n {\n iOVM_L1CrossDomainMessenger messenger = iOVM_L1CrossDomainMessenger(\n resolve(\"Proxy__OVM_L1CrossDomainMessenger\")\n );\n\n for (uint256 i = 0; i < _messages.length; i++) {\n L2ToL1Message memory message = _messages[i];\n messenger.relayMessage(\n message.target,\n message.sender,\n message.message,\n message.messageNonce,\n message.proof\n );\n }\n }\n}\n" + }, + "contracts/optimistic-ethereum/iOVM/bridge/messaging/iOVM_L1MultiMessageRelayer.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Interface Imports */\nimport { iOVM_L1CrossDomainMessenger } from \"../../../iOVM/bridge/messaging/iOVM_L1CrossDomainMessenger.sol\";\ninterface iOVM_L1MultiMessageRelayer {\n\n struct L2ToL1Message {\n address target;\n address sender;\n bytes message;\n uint256 messageNonce;\n iOVM_L1CrossDomainMessenger.L2MessageInclusionProof proof;\n }\n\n function batchRelayMessages(L2ToL1Message[] calldata _messages) external;\n}\n" + }, + "contracts/test-libraries/trie/TestLib_SecureMerkleTrie.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_SecureMerkleTrie } from \"../../optimistic-ethereum/libraries/trie/Lib_SecureMerkleTrie.sol\";\n\n/**\n * @title TestLib_SecureMerkleTrie\n */\ncontract TestLib_SecureMerkleTrie {\n\n function verifyInclusionProof(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n )\n public\n pure\n returns (\n bool\n )\n {\n return Lib_SecureMerkleTrie.verifyInclusionProof(\n _key,\n _value,\n _proof,\n _root\n );\n }\n\n function verifyExclusionProof(\n bytes memory _key,\n bytes memory _proof,\n bytes32 _root\n )\n public\n pure\n returns (\n bool\n )\n {\n return Lib_SecureMerkleTrie.verifyExclusionProof(\n _key,\n _proof,\n _root\n );\n }\n\n function update(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n )\n public\n pure\n returns (\n bytes32\n )\n {\n return Lib_SecureMerkleTrie.update(\n _key,\n _value,\n _proof,\n _root\n );\n }\n\n function get(\n bytes memory _key,\n bytes memory _proof,\n bytes32 _root\n )\n public\n pure\n returns (\n bool,\n bytes memory\n )\n {\n return Lib_SecureMerkleTrie.get(\n _key,\n _proof,\n _root\n );\n }\n\n function getSingleNodeRootHash(\n bytes memory _key,\n bytes memory _value\n )\n public\n pure\n returns (\n bytes32\n )\n {\n return Lib_SecureMerkleTrie.getSingleNodeRootHash(\n _key,\n _value\n );\n }\n}\n" + }, + "contracts/test-libraries/trie/TestLib_MerkleTrie.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Library Imports */\nimport { Lib_MerkleTrie } from \"../../optimistic-ethereum/libraries/trie/Lib_MerkleTrie.sol\";\n\n/**\n * @title TestLib_MerkleTrie\n */\ncontract TestLib_MerkleTrie {\n\n function verifyInclusionProof(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n )\n public\n pure\n returns (\n bool\n )\n {\n return Lib_MerkleTrie.verifyInclusionProof(\n _key,\n _value,\n _proof,\n _root\n );\n }\n\n function verifyExclusionProof(\n bytes memory _key,\n bytes memory _proof,\n bytes32 _root\n )\n public\n pure\n returns (\n bool\n )\n {\n return Lib_MerkleTrie.verifyExclusionProof(\n _key,\n _proof,\n _root\n );\n }\n\n function update(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n )\n public\n pure\n returns (\n bytes32\n )\n {\n return Lib_MerkleTrie.update(\n _key,\n _value,\n _proof,\n _root\n );\n }\n\n function get(\n bytes memory _key,\n bytes memory _proof,\n bytes32 _root\n )\n public\n pure\n returns (\n bool,\n bytes memory\n )\n {\n return Lib_MerkleTrie.get(\n _key,\n _proof,\n _root\n );\n }\n\n function getSingleNodeRootHash(\n bytes memory _key,\n bytes memory _value\n )\n public\n pure\n returns (\n bytes32\n )\n {\n return Lib_MerkleTrie.getSingleNodeRootHash(\n _key,\n _value\n );\n }\n}\n" + }, + "contracts/test-libraries/rlp/TestLib_RLPWriter.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_RLPWriter } from \"../../optimistic-ethereum/libraries/rlp/Lib_RLPWriter.sol\";\nimport { TestERC20 } from \"../../test-helpers/TestERC20.sol\";\n\n/**\n * @title TestLib_RLPWriter\n */\ncontract TestLib_RLPWriter {\n\n function writeBytes(\n bytes memory _in\n )\n public\n pure\n returns (\n bytes memory _out\n )\n {\n return Lib_RLPWriter.writeBytes(_in);\n }\n\n function writeList(\n bytes[] memory _in\n )\n public\n pure\n returns (\n bytes memory _out\n )\n {\n return Lib_RLPWriter.writeList(_in);\n }\n\n function writeString(\n string memory _in\n )\n public\n pure\n returns (\n bytes memory _out\n )\n {\n return Lib_RLPWriter.writeString(_in);\n }\n\n function writeAddress(\n address _in\n )\n public\n pure\n returns (\n bytes memory _out\n )\n {\n return Lib_RLPWriter.writeAddress(_in);\n }\n\n function writeUint(\n uint256 _in\n )\n public\n pure\n returns (\n bytes memory _out\n )\n {\n return Lib_RLPWriter.writeUint(_in);\n }\n\n function writeBool(\n bool _in\n )\n public\n pure\n returns (\n bytes memory _out\n )\n {\n return Lib_RLPWriter.writeBool(_in);\n }\n\n function writeAddressWithTaintedMemory(\n address _in\n )\n public\n returns (\n bytes memory _out\n )\n {\n new TestERC20();\n return Lib_RLPWriter.writeAddress(_in);\n }\n}\n" + }, + "contracts/test-helpers/TestERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n// a test ERC20 token with an open mint function\ncontract TestERC20 {\n using SafeMath for uint;\n\n string public constant name = 'Test';\n string public constant symbol = 'TST';\n uint8 public constant decimals = 18;\n uint256 public totalSupply;\n mapping(address => uint) public balanceOf;\n mapping(address => mapping(address => uint)) public allowance;\n\n event Approval(address indexed owner, address indexed spender, uint256 value);\n event Transfer(address indexed from, address indexed to, uint256 value);\n\n constructor() {}\n\n function mint(address to, uint256 value) public {\n totalSupply = totalSupply.add(value);\n balanceOf[to] = balanceOf[to].add(value);\n emit Transfer(address(0), to, value);\n }\n\n function _approve(address owner, address spender, uint256 value) private {\n allowance[owner][spender] = value;\n emit Approval(owner, spender, value);\n }\n\n function _transfer(address from, address to, uint256 value) private {\n balanceOf[from] = balanceOf[from].sub(value);\n balanceOf[to] = balanceOf[to].add(value);\n emit Transfer(from, to, value);\n }\n\n function approve(address spender, uint256 value) external returns (bool) {\n _approve(msg.sender, spender, value);\n return true;\n }\n\n function transfer(address to, uint256 value) external returns (bool) {\n _transfer(msg.sender, to, value);\n return true;\n }\n\n function transferFrom(address from, address to, uint256 value) external returns (bool) {\n if (allowance[from][msg.sender] != uint(-1)) {\n allowance[from][msg.sender] = allowance[from][msg.sender].sub(value);\n }\n _transfer(from, to, value);\n return true;\n }\n}\n\nlibrary SafeMath {\n function add(uint256 x, uint256 y) internal pure returns (uint256 z) {\n require((z = x + y) >= x, 'ds-math-add-overflow');\n }\n\n function sub(uint256 x, uint256 y) internal pure returns (uint256 z) {\n require((z = x - y) <= x, 'ds-math-sub-underflow');\n }\n\n function mul(uint256 x, uint256 y) internal pure returns (uint256 z) {\n require(y == 0 || (z = x * y) / y == x, 'ds-math-mul-overflow');\n }\n}\n" + }, + "contracts/test-libraries/utils/TestLib_BytesUtils.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_BytesUtils } from \"../../optimistic-ethereum/libraries/utils/Lib_BytesUtils.sol\";\nimport { TestERC20 } from \"../../test-helpers/TestERC20.sol\";\n\n/**\n * @title TestLib_BytesUtils\n */\ncontract TestLib_BytesUtils {\n\n function concat(\n bytes memory _preBytes,\n bytes memory _postBytes\n )\n public\n pure\n returns (bytes memory)\n {\n return abi.encodePacked(\n _preBytes,\n _postBytes\n );\n }\n\n function slice(\n bytes memory _bytes,\n uint256 _start,\n uint256 _length\n )\n public\n pure\n returns (bytes memory)\n {\n return Lib_BytesUtils.slice(\n _bytes,\n _start,\n _length\n );\n }\n\n function toBytes32(\n bytes memory _bytes\n )\n public\n pure\n returns (bytes32)\n {\n return Lib_BytesUtils.toBytes32(\n _bytes\n );\n }\n\n function toUint256(\n bytes memory _bytes\n )\n public\n pure\n returns (uint256)\n {\n return Lib_BytesUtils.toUint256(\n _bytes\n );\n }\n\n function toNibbles(\n bytes memory _bytes\n )\n public\n pure\n returns (bytes memory)\n {\n return Lib_BytesUtils.toNibbles(\n _bytes\n );\n }\n\n function fromNibbles(\n bytes memory _bytes\n )\n public\n pure\n returns (bytes memory)\n {\n return Lib_BytesUtils.fromNibbles(\n _bytes\n );\n }\n\n function equal(\n bytes memory _bytes,\n bytes memory _other\n )\n public\n pure\n returns (bool)\n {\n return Lib_BytesUtils.equal(\n _bytes,\n _other\n );\n }\n\n function sliceWithTaintedMemory(\n bytes memory _bytes,\n uint256 _start,\n uint256 _length\n )\n public\n returns (bytes memory)\n {\n new TestERC20();\n return Lib_BytesUtils.slice(\n _bytes,\n _start,\n _length\n );\n }\n}\n" + }, + "contracts/test-libraries/utils/TestLib_EthUtils.sol": { + "content": "// SPDX-License-Identifier: MIT\n// @unsupported: ovm\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_EthUtils } from \"../../optimistic-ethereum/libraries/utils/Lib_EthUtils.sol\";\n\n/**\n * @title TestLib_EthUtils\n */\ncontract TestLib_EthUtils {\n\n function getCode(\n address _address,\n uint256 _offset,\n uint256 _length\n )\n public\n view\n returns (\n bytes memory _code\n )\n {\n return Lib_EthUtils.getCode(\n _address,\n _offset,\n _length\n );\n }\n\n function getCode(\n address _address\n )\n public\n view\n returns (\n bytes memory _code\n )\n {\n return Lib_EthUtils.getCode(\n _address\n );\n }\n\n function getCodeSize(\n address _address\n )\n public\n view\n returns (\n uint256 _codeSize\n )\n {\n return Lib_EthUtils.getCodeSize(\n _address\n );\n }\n\n function getCodeHash(\n address _address\n )\n public\n view\n returns (\n bytes32 _codeHash\n )\n {\n return Lib_EthUtils.getCodeHash(\n _address\n );\n }\n\n function createContract(\n bytes memory _code\n )\n public\n returns (\n address _created\n )\n {\n return Lib_EthUtils.createContract(\n _code\n );\n }\n\n function getAddressForCREATE(\n address _creator,\n uint256 _nonce\n )\n public\n pure\n returns (\n address _address\n )\n {\n return Lib_EthUtils.getAddressForCREATE(\n _creator,\n _nonce\n );\n }\n\n function getAddressForCREATE2(\n address _creator,\n bytes memory _bytecode,\n bytes32 _salt\n )\n public\n pure\n returns (address _address)\n {\n return Lib_EthUtils.getAddressForCREATE2(\n _creator,\n _bytecode,\n _salt\n );\n }\n}\n" + }, + "contracts/test-libraries/utils/TestLib_Bytes32Utils.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Library Imports */\nimport { Lib_Bytes32Utils } from \"../../optimistic-ethereum/libraries/utils/Lib_Bytes32Utils.sol\";\n\n/**\n * @title TestLib_Byte32Utils\n */\ncontract TestLib_Bytes32Utils {\n\n function toBool(\n bytes32 _in\n )\n public\n pure\n returns (\n bool _out\n )\n {\n return Lib_Bytes32Utils.toBool(_in);\n }\n\n function fromBool(\n bool _in\n )\n public\n pure\n returns (\n bytes32 _out\n )\n {\n return Lib_Bytes32Utils.fromBool(_in);\n }\n\n function toAddress(\n bytes32 _in\n )\n public\n pure\n returns (\n address _out\n )\n {\n return Lib_Bytes32Utils.toAddress(_in);\n }\n\n function fromAddress(\n address _in\n )\n public\n pure\n returns (\n bytes32 _out\n )\n {\n return Lib_Bytes32Utils.fromAddress(_in);\n }\n}\n" + }, + "contracts/test-libraries/codec/TestLib_EIP155Tx.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_EIP155Tx } from \"../../optimistic-ethereum/libraries/codec/Lib_EIP155Tx.sol\";\n\n/**\n * @title TestLib_EIP155Tx\n */\ncontract TestLib_EIP155Tx {\n function decode(\n bytes memory _encoded,\n uint256 _chainId\n )\n public\n pure\n returns (\n Lib_EIP155Tx.EIP155Tx memory\n )\n {\n return Lib_EIP155Tx.decode(\n _encoded,\n _chainId\n );\n }\n\n function encode(\n Lib_EIP155Tx.EIP155Tx memory _transaction,\n bool _includeSignature\n )\n public\n pure\n returns (\n bytes memory\n )\n {\n return Lib_EIP155Tx.encode(\n _transaction,\n _includeSignature\n );\n }\n\n function hash(\n Lib_EIP155Tx.EIP155Tx memory _transaction\n )\n public\n pure\n returns (\n bytes32\n )\n {\n return Lib_EIP155Tx.hash(\n _transaction\n );\n }\n\n function sender(\n Lib_EIP155Tx.EIP155Tx memory _transaction\n )\n public\n pure\n returns (\n address\n )\n {\n return Lib_EIP155Tx.sender(\n _transaction\n );\n }\n}\n" + }, + "contracts/test-libraries/rlp/TestLib_RLPReader.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_RLPReader } from \"../../optimistic-ethereum/libraries/rlp/Lib_RLPReader.sol\";\n\n/**\n * @title TestLib_RLPReader\n */\ncontract TestLib_RLPReader {\n\n function readList(\n bytes memory _in\n )\n public\n pure\n returns (\n bytes[] memory\n )\n {\n Lib_RLPReader.RLPItem[] memory decoded = Lib_RLPReader.readList(_in);\n bytes[] memory out = new bytes[](decoded.length);\n for (uint256 i = 0; i < out.length; i++) {\n out[i] = Lib_RLPReader.readRawBytes(decoded[i]);\n }\n return out;\n }\n\n function readString(\n bytes memory _in\n )\n public\n pure\n returns (\n string memory\n )\n {\n return Lib_RLPReader.readString(_in);\n }\n\n function readBytes(\n bytes memory _in\n )\n public\n pure\n returns (\n bytes memory\n )\n {\n return Lib_RLPReader.readBytes(_in);\n }\n\n function readBytes32(\n bytes memory _in\n )\n public\n pure\n returns (\n bytes32\n )\n {\n return Lib_RLPReader.readBytes32(_in);\n }\n\n function readUint256(\n bytes memory _in\n )\n public\n pure\n returns (\n uint256\n )\n {\n return Lib_RLPReader.readUint256(_in);\n }\n\n function readBool(\n bytes memory _in\n )\n public\n pure\n returns (\n bool\n )\n {\n return Lib_RLPReader.readBool(_in);\n }\n\n function readAddress(\n bytes memory _in\n )\n public\n pure\n returns (\n address\n )\n {\n return Lib_RLPReader.readAddress(_in);\n }\n}\n" + }, + "contracts/optimistic-ethereum/OVM/verification/OVM_BondManager.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Library Imports */\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/* Interface Imports */\nimport { iOVM_BondManager, Errors, ERC20 } from \"../../iOVM/verification/iOVM_BondManager.sol\";\nimport { iOVM_FraudVerifier } from \"../../iOVM/verification/iOVM_FraudVerifier.sol\";\n\n/**\n * @title OVM_BondManager\n * @dev The Bond Manager contract handles deposits in the form of an ERC20 token from bonded\n * Proposers. It also handles the accounting of gas costs spent by a Verifier during the course of a\n * fraud proof. In the event of a successful fraud proof, the fraudulent Proposer's bond is slashed,\n * and the Verifier's gas costs are refunded.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract OVM_BondManager is iOVM_BondManager, Lib_AddressResolver {\n\n /****************************\n * Constants and Parameters *\n ****************************/\n\n /// The period to find the earliest fraud proof for a publisher\n uint256 public constant multiFraudProofPeriod = 7 days;\n\n /// The dispute period\n uint256 public constant disputePeriodSeconds = 7 days;\n\n /// The minimum collateral a sequencer must post\n uint256 public constant requiredCollateral = 1 ether;\n\n\n /*******************************************\n * Contract Variables: Contract References *\n *******************************************/\n\n /// The bond token\n ERC20 immutable public token;\n\n\n /********************************************\n * Contract Variables: Internal Accounting *\n *******************************************/\n\n /// The bonds posted by each proposer\n mapping(address => Bond) public bonds;\n\n /// For each pre-state root, there's an array of witnessProviders that must be rewarded\n /// for posting witnesses\n mapping(bytes32 => Rewards) public witnessProviders;\n\n\n /***************\n * Constructor *\n ***************/\n\n /// Initializes with a ERC20 token to be used for the fidelity bonds\n /// and with the Address Manager\n constructor(\n ERC20 _token,\n address _libAddressManager\n )\n Lib_AddressResolver(_libAddressManager)\n {\n token = _token;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n /// Adds `who` to the list of witnessProviders for the provided `preStateRoot`.\n function recordGasSpent(bytes32 _preStateRoot, bytes32 _txHash, address who, uint256 gasSpent) override public {\n // The sender must be the transitioner that corresponds to the claimed pre-state root\n address transitioner = address(iOVM_FraudVerifier(resolve(\"OVM_FraudVerifier\")).getStateTransitioner(_preStateRoot, _txHash));\n require(transitioner == msg.sender, Errors.ONLY_TRANSITIONER);\n\n witnessProviders[_preStateRoot].total += gasSpent;\n witnessProviders[_preStateRoot].gasSpent[who] += gasSpent;\n }\n\n /// Slashes + distributes rewards or frees up the sequencer's bond, only called by\n /// `FraudVerifier.finalizeFraudVerification`\n function finalize(bytes32 _preStateRoot, address publisher, uint256 timestamp) override public {\n require(msg.sender == resolve(\"OVM_FraudVerifier\"), Errors.ONLY_FRAUD_VERIFIER);\n require(witnessProviders[_preStateRoot].canClaim == false, Errors.ALREADY_FINALIZED);\n\n // allow users to claim from that state root's\n // pool of collateral (effectively slashing the sequencer)\n witnessProviders[_preStateRoot].canClaim = true;\n\n Bond storage bond = bonds[publisher];\n if (bond.firstDisputeAt == 0) {\n bond.firstDisputeAt = block.timestamp;\n bond.earliestDisputedStateRoot = _preStateRoot;\n bond.earliestTimestamp = timestamp;\n } else if (\n // only update the disputed state root for the publisher if it's within\n // the dispute period _and_ if it's before the previous one\n block.timestamp < bond.firstDisputeAt + multiFraudProofPeriod &&\n timestamp < bond.earliestTimestamp\n ) {\n bond.earliestDisputedStateRoot = _preStateRoot;\n bond.earliestTimestamp = timestamp;\n }\n\n // if the fraud proof's dispute period does not intersect with the\n // withdrawal's timestamp, then the user should not be slashed\n // e.g if a user at day 10 submits a withdrawal, and a fraud proof\n // from day 1 gets published, the user won't be slashed since day 8 (1d + 7d)\n // is before the user started their withdrawal. on the contrary, if the user\n // had started their withdrawal at, say, day 6, they would be slashed\n if (\n bond.withdrawalTimestamp != 0 &&\n uint256(bond.withdrawalTimestamp) > timestamp + disputePeriodSeconds &&\n bond.state == State.WITHDRAWING\n ) {\n return;\n }\n\n // slash!\n bond.state = State.NOT_COLLATERALIZED;\n }\n\n /// Sequencers call this function to post collateral which will be used for\n /// the `appendBatch` call\n function deposit() override public {\n require(\n token.transferFrom(msg.sender, address(this), requiredCollateral),\n Errors.ERC20_ERR\n );\n\n // This cannot overflow\n bonds[msg.sender].state = State.COLLATERALIZED;\n }\n\n /// Starts the withdrawal for a publisher\n function startWithdrawal() override public {\n Bond storage bond = bonds[msg.sender];\n require(bond.withdrawalTimestamp == 0, Errors.WITHDRAWAL_PENDING);\n require(bond.state == State.COLLATERALIZED, Errors.WRONG_STATE);\n\n bond.state = State.WITHDRAWING;\n bond.withdrawalTimestamp = uint32(block.timestamp);\n }\n\n /// Finalizes a pending withdrawal from a publisher\n function finalizeWithdrawal() override public {\n Bond storage bond = bonds[msg.sender];\n\n require(\n block.timestamp >= uint256(bond.withdrawalTimestamp) + disputePeriodSeconds,\n Errors.TOO_EARLY\n );\n require(bond.state == State.WITHDRAWING, Errors.SLASHED);\n\n // refunds!\n bond.state = State.NOT_COLLATERALIZED;\n bond.withdrawalTimestamp = 0;\n\n require(\n token.transfer(msg.sender, requiredCollateral),\n Errors.ERC20_ERR\n );\n }\n\n /// Claims the user's reward for the witnesses they provided for the earliest\n /// disputed state root of the designated publisher\n function claim(address who) override public {\n Bond storage bond = bonds[who];\n require(\n block.timestamp >= bond.firstDisputeAt + multiFraudProofPeriod,\n Errors.WAIT_FOR_DISPUTES\n );\n\n // reward the earliest state root for this publisher\n bytes32 _preStateRoot = bond.earliestDisputedStateRoot;\n Rewards storage rewards = witnessProviders[_preStateRoot];\n\n // only allow claiming if fraud was proven in `finalize`\n require(rewards.canClaim, Errors.CANNOT_CLAIM);\n\n // proportional allocation - only reward 50% (rest gets locked in the\n // contract forever\n uint256 amount = (requiredCollateral * rewards.gasSpent[msg.sender]) / (2 * rewards.total);\n\n // reset the user's spent gas so they cannot double claim\n rewards.gasSpent[msg.sender] = 0;\n\n // transfer\n require(token.transfer(msg.sender, amount), Errors.ERC20_ERR);\n }\n\n /// Checks if the user is collateralized\n function isCollateralized(address who) override public view returns (bool) {\n return bonds[who].state == State.COLLATERALIZED;\n }\n\n /// Gets how many witnesses the user has provided for the state root\n function getGasSpent(bytes32 preStateRoot, address who) override public view returns (uint256) {\n return witnessProviders[preStateRoot].gasSpent[who];\n }\n}\n" + }, + "contracts/test-helpers/Mock_FraudVerifier.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\nimport { OVM_BondManager } from \"./../optimistic-ethereum/OVM/verification/OVM_BondManager.sol\";\n\ncontract Mock_FraudVerifier {\n OVM_BondManager bondManager;\n\n mapping (bytes32 => address) transitioners;\n\n function setBondManager(OVM_BondManager _bondManager) public {\n bondManager = _bondManager;\n }\n\n function setStateTransitioner(bytes32 preStateRoot, bytes32 txHash, address addr) public {\n transitioners[keccak256(abi.encodePacked(preStateRoot, txHash))] = addr;\n }\n\n function getStateTransitioner(\n bytes32 _preStateRoot,\n bytes32 _txHash\n )\n public\n view\n returns (\n address\n )\n {\n return transitioners[keccak256(abi.encodePacked(_preStateRoot, _txHash))];\n }\n\n function finalize(bytes32 _preStateRoot, address publisher, uint256 timestamp) public {\n bondManager.finalize(_preStateRoot, publisher, timestamp);\n }\n}\n" + }, + "contracts/optimistic-ethereum/mockOVM/verification/mockOVM_BondManager.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Interface Imports */\nimport { iOVM_BondManager } from \"../../iOVM/verification/iOVM_BondManager.sol\";\n\n/* Contract Imports */\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/**\n * @title mockOVM_BondManager\n */\ncontract mockOVM_BondManager is iOVM_BondManager, Lib_AddressResolver {\n constructor(\n address _libAddressManager\n )\n Lib_AddressResolver(_libAddressManager)\n {}\n\n function recordGasSpent(\n bytes32 _preStateRoot,\n bytes32 _txHash,\n address _who,\n uint256 _gasSpent\n )\n override\n public\n {}\n\n function finalize(\n bytes32 _preStateRoot,\n address _publisher,\n uint256 _timestamp\n )\n override\n public\n {}\n\n function deposit()\n override\n public\n {}\n\n function startWithdrawal()\n override\n public\n {}\n\n function finalizeWithdrawal()\n override\n public\n {}\n\n function claim(\n address _who\n )\n override\n public\n {}\n\n function isCollateralized(\n address _who\n )\n override\n public\n view\n returns (\n bool\n )\n {\n // Only authenticate sequencer to submit state root batches.\n return _who == resolve(\"OVM_Proposer\");\n }\n\n function getGasSpent(\n bytes32, // _preStateRoot,\n address // _who\n )\n override\n public\n pure\n returns (\n uint256\n )\n {\n return 0;\n }\n}\n" + }, + "contracts/test-libraries/utils/TestLib_MerkleTree.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_MerkleTree } from \"../../optimistic-ethereum/libraries/utils/Lib_MerkleTree.sol\";\n\n/**\n * @title TestLib_MerkleTree\n */\ncontract TestLib_MerkleTree {\n\n function getMerkleRoot(\n bytes32[] memory _elements\n )\n public\n pure\n returns (\n bytes32\n )\n {\n return Lib_MerkleTree.getMerkleRoot(\n _elements\n );\n }\n\n function verify(\n bytes32 _root,\n bytes32 _leaf,\n uint256 _index,\n bytes32[] memory _siblings,\n uint256 _totalLeaves\n )\n public\n pure\n returns (\n bool\n )\n {\n return Lib_MerkleTree.verify(\n _root,\n _leaf,\n _index,\n _siblings,\n _totalLeaves\n );\n }\n}\n" + }, + "contracts/test-libraries/utils/TestLib_RingBuffer.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_RingBuffer } from \"../../optimistic-ethereum/libraries/utils/Lib_RingBuffer.sol\";\n\n/**\n * @title TestLib_RingBuffer\n */\ncontract TestLib_RingBuffer {\n using Lib_RingBuffer for Lib_RingBuffer.RingBuffer;\n\n Lib_RingBuffer.RingBuffer internal buf;\n\n function push(\n bytes32 _value,\n bytes27 _extraData\n )\n public\n {\n buf.push(\n _value,\n _extraData\n );\n }\n\n function get(\n uint256 _index\n )\n public\n view\n returns (\n bytes32\n )\n {\n return buf.get(_index);\n }\n\n function deleteElementsAfterInclusive(\n uint40 _index,\n bytes27 _extraData\n )\n internal\n {\n return buf.deleteElementsAfterInclusive(\n _index,\n _extraData\n );\n }\n\n function getLength()\n internal\n view\n returns (\n uint40\n )\n {\n return buf.getLength();\n }\n\n function getExtraData()\n internal\n view\n returns (\n bytes27\n )\n {\n return buf.getExtraData();\n }\n}\n" + } + }, + "settings": { + "optimizer": { + "enabled": true, + "runs": 200 + }, + "outputSelection": { + "*": { + "*": [ + "storageLayout", + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata", + "devdoc", + "userdoc", + "evm.gasEstimates" + ], + "": [ + "ast" + ] + } + }, + "metadata": { + "useLiteralContent": true + } + } +} \ No newline at end of file diff --git a/packages/contracts/test/contracts/OVM/accounts/OVM_ECDSAContractAccount.spec.ts b/packages/contracts/test/contracts/OVM/accounts/OVM_ECDSAContractAccount.spec.ts index 521b172b8b623..c3a09d32c4ffa 100644 --- a/packages/contracts/test/contracts/OVM/accounts/OVM_ECDSAContractAccount.spec.ts +++ b/packages/contracts/test/contracts/OVM/accounts/OVM_ECDSAContractAccount.spec.ts @@ -8,15 +8,15 @@ import { fromHexString, toHexString } from '@eth-optimism/core-utils' /* Internal Imports */ import { - serializeNativeTransaction, - signNativeTransaction, + NON_ZERO_ADDRESS, DEFAULT_EIP155_TX, - serializeEthSignTransaction, - signEthSignMessage, decodeSolidityError, - NON_ZERO_ADDRESS, } from '../../../helpers' -import { getContractFactory, predeploys } from '../../../../src' +import { + getContractFactory, + getContractInterface, + predeploys, +} from '../../../../src' const callPredeploy = async ( Helper_PredeployCaller: Contract, @@ -41,6 +41,8 @@ const callPredeploy = async ( ) } +const iOVM_ETH = getContractInterface('OVM_ETH') + describe('OVM_ECDSAContractAccount', () => { let wallet: Wallet let badWallet: Wallet @@ -99,11 +101,18 @@ describe('OVM_ECDSAContractAccount', () => { // Duplicating the behavior of the ecrecover precompile. if (target === '0x0000000000000000000000000000000000000001') { const databuf = fromHexString(data) - const addr = ethers.utils.recoverAddress(databuf.slice(0, 32), { - v: BigNumber.from(databuf.slice(32, 64)).toNumber(), - r: toHexString(databuf.slice(64, 96)), - s: toHexString(databuf.slice(96, 128)), - }) + + let addr: string + try { + addr = ethers.utils.recoverAddress(databuf.slice(0, 32), { + v: BigNumber.from(databuf.slice(32, 64)).toNumber(), + r: toHexString(databuf.slice(64, 96)), + s: toHexString(databuf.slice(96, 128)), + }) + } catch (err) { + addr = ethers.constants.AddressZero + } + const ret = ethers.utils.defaultAbiCoder.encode(['address'], [addr]) return [true, ret] } else { @@ -122,43 +131,14 @@ describe('OVM_ECDSAContractAccount', () => { describe('fallback()', () => { it(`should successfully execute an EIP155Transaction`, async () => { - const message = serializeNativeTransaction(DEFAULT_EIP155_TX) - const sig = await signNativeTransaction(wallet, DEFAULT_EIP155_TX) - - await callPredeploy( - Helper_PredeployCaller, - OVM_ECDSAContractAccount, - 'execute', - [ - message, - 0, // isEthSignedMessage - `0x${sig.v}`, //v - `0x${sig.r}`, //r - `0x${sig.s}`, //s - ] - ) - - // The ovmCALL is the 2nd call because the first call transfers the fee. - const ovmCALL: any = Mock__OVM_ExecutionManager.smocked.ovmCALL.calls[1] - expect(ovmCALL._address).to.equal(DEFAULT_EIP155_TX.to) - expect(ovmCALL._calldata).to.equal(DEFAULT_EIP155_TX.data) - }) - - it(`should successfully execute an ETHSignedTransaction`, async () => { - const message = serializeEthSignTransaction(DEFAULT_EIP155_TX) - const sig = await signEthSignMessage(wallet, DEFAULT_EIP155_TX) + const transaction = DEFAULT_EIP155_TX + const encodedTransaction = await wallet.signTransaction(transaction) await callPredeploy( Helper_PredeployCaller, OVM_ECDSAContractAccount, 'execute', - [ - message, - 1, //isEthSignedMessage - `0x${sig.v}`, //v - `0x${sig.r}`, //r - `0x${sig.s}`, //s - ] + [encodedTransaction] ) // The ovmCALL is the 2nd call because the first call transfers the fee. @@ -168,43 +148,33 @@ describe('OVM_ECDSAContractAccount', () => { }) it(`should ovmCREATE if EIP155Transaction.to is zero address`, async () => { - const createTx = { ...DEFAULT_EIP155_TX, to: '' } - const message = serializeNativeTransaction(createTx) - const sig = await signNativeTransaction(wallet, createTx) + const transaction = { ...DEFAULT_EIP155_TX, to: '' } + const encodedTransaction = await wallet.signTransaction(transaction) await callPredeploy( Helper_PredeployCaller, OVM_ECDSAContractAccount, 'execute', - [ - message, - 0, //isEthSignedMessage - `0x${sig.v}`, //v - `0x${sig.r}`, //r - `0x${sig.s}`, //s - ] + [encodedTransaction] ) const ovmCREATE: any = Mock__OVM_ExecutionManager.smocked.ovmCREATE.calls[0] - expect(ovmCREATE._bytecode).to.equal(createTx.data) + expect(ovmCREATE._bytecode).to.equal(transaction.data) }) it(`should revert on invalid signature`, async () => { - const message = serializeNativeTransaction(DEFAULT_EIP155_TX) - const sig = await signNativeTransaction(badWallet, DEFAULT_EIP155_TX) + const transaction = DEFAULT_EIP155_TX + const encodedTransaction = ethers.utils.serializeTransaction( + transaction, + '0x' + '00'.repeat(65) + ) await callPredeploy( Helper_PredeployCaller, OVM_ECDSAContractAccount, 'execute', - [ - message, - 0, //isEthSignedMessage - `0x${sig.v}`, //v - `0x${sig.r}`, //r - `0x${sig.s}`, //s - ] + [encodedTransaction] ) const ovmREVERT: any = Mock__OVM_ExecutionManager.smocked.ovmREVERT.calls[0] @@ -214,24 +184,14 @@ describe('OVM_ECDSAContractAccount', () => { }) it(`should revert on incorrect nonce`, async () => { - const alteredNonceTx = { - ...DEFAULT_EIP155_TX, - nonce: 99, - } - const message = serializeNativeTransaction(alteredNonceTx) - const sig = await signNativeTransaction(wallet, alteredNonceTx) + const transaction = { ...DEFAULT_EIP155_TX, nonce: 99 } + const encodedTransaction = await wallet.signTransaction(transaction) await callPredeploy( Helper_PredeployCaller, OVM_ECDSAContractAccount, 'execute', - [ - message, - 0, //isEthSignedMessage - `0x${sig.v}`, //v - `0x${sig.r}`, //r - `0x${sig.s}`, //s - ] + [encodedTransaction] ) const ovmREVERT: any = Mock__OVM_ExecutionManager.smocked.ovmREVERT.calls[0] @@ -241,52 +201,32 @@ describe('OVM_ECDSAContractAccount', () => { }) it(`should revert on incorrect chainId`, async () => { - const alteredChainIdTx = { - ...DEFAULT_EIP155_TX, - chainId: 421, - } - const message = serializeNativeTransaction(alteredChainIdTx) - const sig = await signNativeTransaction(wallet, alteredChainIdTx) + const transaction = { ...DEFAULT_EIP155_TX, chainId: 421 } + const encodedTransaction = await wallet.signTransaction(transaction) await callPredeploy( Helper_PredeployCaller, OVM_ECDSAContractAccount, 'execute', - [ - message, - 0, //isEthSignedMessage - `0x${sig.v}`, //v - `0x${sig.r}`, //r - `0x${sig.s}`, //s - ] + [encodedTransaction] ) const ovmREVERT: any = Mock__OVM_ExecutionManager.smocked.ovmREVERT.calls[0] expect(decodeSolidityError(ovmREVERT._data)).to.equal( - 'Transaction chainId does not match expected OVM chainId.' + 'Lib_EIP155Tx: Transaction signed with wrong chain ID' ) }) // TEMPORARY: Skip gas checks for minnet. it.skip(`should revert on insufficient gas`, async () => { - const alteredInsufficientGasTx = { - ...DEFAULT_EIP155_TX, - gasLimit: 200000000, - } - const message = serializeNativeTransaction(alteredInsufficientGasTx) - const sig = await signNativeTransaction(wallet, alteredInsufficientGasTx) + const transaction = { ...DEFAULT_EIP155_TX, gasLimit: 200000000 } + const encodedTransaction = await wallet.signTransaction(transaction) await callPredeploy( Helper_PredeployCaller, OVM_ECDSAContractAccount, 'execute', - [ - message, - 0, //isEthSignedMessage - `0x${sig.v}`, //v - `0x${sig.r}`, //r - `0x${sig.s}`, //s - ], + [encodedTransaction], 40000000 ) @@ -298,11 +238,12 @@ describe('OVM_ECDSAContractAccount', () => { }) it(`should revert if fee is not transferred to the relayer`, async () => { - const message = serializeNativeTransaction(DEFAULT_EIP155_TX) - const sig = await signNativeTransaction(wallet, DEFAULT_EIP155_TX) + const transaction = DEFAULT_EIP155_TX + const encodedTransaction = await wallet.signTransaction(transaction) + Mock__OVM_ExecutionManager.smocked.ovmCALL.will.return.with( (gasLimit, target, data) => { - if (target === '0x4200000000000000000000000000000000000006') { + if (target === predeploys.OVM_ETH) { return [ true, '0x0000000000000000000000000000000000000000000000000000000000000000', @@ -317,13 +258,7 @@ describe('OVM_ECDSAContractAccount', () => { Helper_PredeployCaller, OVM_ECDSAContractAccount, 'execute', - [ - message, - 0, //isEthSignedMessage - `0x${sig.v}`, //v - `0x${sig.r}`, //r - `0x${sig.s}`, //s - ], + [encodedTransaction], 40000000 ) @@ -333,5 +268,109 @@ describe('OVM_ECDSAContractAccount', () => { 'Fee was not transferred to relayer.' ) }) + + it(`should transfer value if value is greater than 0`, async () => { + const transaction = { ...DEFAULT_EIP155_TX, value: 1234, data: '0x' } + const encodedTransaction = await wallet.signTransaction(transaction) + + await callPredeploy( + Helper_PredeployCaller, + OVM_ECDSAContractAccount, + 'execute', + [encodedTransaction], + 40000000 + ) + + // First call transfers fee, second transfers value (since value > 0). + const ovmCALL: any = Mock__OVM_ExecutionManager.smocked.ovmCALL.calls[1] + expect(ovmCALL._address).to.equal(predeploys.OVM_ETH) + expect(ovmCALL._calldata).to.equal( + iOVM_ETH.encodeFunctionData('transfer', [ + transaction.to, + transaction.value, + ]) + ) + }) + + it(`should revert if the value is not transferred to the recipient`, async () => { + const transaction = { ...DEFAULT_EIP155_TX, value: 1234, data: '0x' } + const encodedTransaction = await wallet.signTransaction(transaction) + + Mock__OVM_ExecutionManager.smocked.ovmCALL.will.return.with( + (gasLimit, target, data) => { + if (target === predeploys.OVM_ETH) { + const [recipient, amount] = iOVM_ETH.decodeFunctionData( + 'transfer', + data + ) + if (recipient === transaction.to) { + return [ + true, + '0x0000000000000000000000000000000000000000000000000000000000000000', + ] + } else { + return [ + true, + '0x0000000000000000000000000000000000000000000000000000000000000001', + ] + } + } else { + return [true, '0x'] + } + } + ) + + await callPredeploy( + Helper_PredeployCaller, + OVM_ECDSAContractAccount, + 'execute', + [encodedTransaction], + 40000000 + ) + + const ovmREVERT: any = + Mock__OVM_ExecutionManager.smocked.ovmREVERT.calls[0] + expect(decodeSolidityError(ovmREVERT._data)).to.equal( + 'Value could not be transferred to recipient.' + ) + }) + + it(`should revert if trying to send value with a contract creation`, async () => { + const transaction = { ...DEFAULT_EIP155_TX, value: 1234, to: '' } + const encodedTransaction = await wallet.signTransaction(transaction) + + await callPredeploy( + Helper_PredeployCaller, + OVM_ECDSAContractAccount, + 'execute', + [encodedTransaction], + 40000000 + ) + + const ovmREVERT: any = + Mock__OVM_ExecutionManager.smocked.ovmREVERT.calls[0] + expect(decodeSolidityError(ovmREVERT._data)).to.equal( + 'Value transfer in contract creation not supported.' + ) + }) + + it(`should revert if trying to send value with non-empty transaction data`, async () => { + const transaction = { ...DEFAULT_EIP155_TX, value: 1234, to: '' } + const encodedTransaction = await wallet.signTransaction(transaction) + + await callPredeploy( + Helper_PredeployCaller, + OVM_ECDSAContractAccount, + 'execute', + [encodedTransaction], + 40000000 + ) + + const ovmREVERT: any = + Mock__OVM_ExecutionManager.smocked.ovmREVERT.calls[0] + expect(decodeSolidityError(ovmREVERT._data)).to.equal( + 'Value transfer in contract creation not supported.' + ) + }) }) }) diff --git a/packages/contracts/test/contracts/OVM/accounts/OVM_ProxyEOA.spec.ts b/packages/contracts/test/contracts/OVM/accounts/OVM_ProxyEOA.spec.ts index 2d9f00f9939dc..b292372f50243 100644 --- a/packages/contracts/test/contracts/OVM/accounts/OVM_ProxyEOA.spec.ts +++ b/packages/contracts/test/contracts/OVM/accounts/OVM_ProxyEOA.spec.ts @@ -94,7 +94,7 @@ describe('OVM_ProxyEOA', () => { }) describe('upgrade()', () => { const implSlotKey = - '0xdeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddead' + '0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc' //bytes32(uint256(keccak256('eip1967.proxy.implementation')) - 1) it(`should upgrade the proxy implementation`, async () => { const newImpl = `0x${'81'.repeat(20)}` const newImplBytes32 = addrToBytes32(newImpl) diff --git a/packages/contracts/test/contracts/OVM/bridge/assets/OVM_L1ETHGateway.spec.ts b/packages/contracts/test/contracts/OVM/bridge/assets/OVM_L1ETHGateway.spec.ts index f76f55e9b693b..98d64620cfad4 100644 --- a/packages/contracts/test/contracts/OVM/bridge/assets/OVM_L1ETHGateway.spec.ts +++ b/packages/contracts/test/contracts/OVM/bridge/assets/OVM_L1ETHGateway.spec.ts @@ -8,7 +8,7 @@ import { smockit, MockContract } from '@eth-optimism/smock' /* Internal Imports */ import { NON_ZERO_ADDRESS, makeAddressManager } from '../../../../helpers' -const L1_ETH_GATEWAY_NAME = 'Proxy__OVM_L1CrossDomainMessenger' +const L1_MESSENGER_NAME = 'Proxy__OVM_L1CrossDomainMessenger' const ERR_INVALID_MESSENGER = 'OVM_XCHAIN: messenger contract unauthenticated' const ERR_INVALID_X_DOMAIN_MSG_SENDER = @@ -82,7 +82,7 @@ describe('OVM_L1ETHGateway', () => { it('onlyFromCrossDomainAccount: should revert on calls from the right crossDomainMessenger, but wrong xDomainMessageSender (ie. not the L2ETHGateway)', async () => { await AddressManager.setAddress( - L1_ETH_GATEWAY_NAME, + L1_MESSENGER_NAME, Mock__OVM_L1CrossDomainMessenger.address ) @@ -163,7 +163,7 @@ describe('OVM_L1ETHGateway', () => { await ethers.getContractFactory('OVM_L1CrossDomainMessenger') ) await AddressManager.setAddress( - L1_ETH_GATEWAY_NAME, + L1_MESSENGER_NAME, Mock__OVM_L1CrossDomainMessenger.address ) @@ -256,4 +256,41 @@ describe('OVM_L1ETHGateway', () => { expect(depositCallToMessenger._gasLimit).to.equal(finalizeDepositGasLimit) }) }) + describe('migrating ETH', () => { + const migrateAmount = 1_000 + + beforeEach(async () => { + await OVM_L1ETHGateway.donateETH({ value: migrateAmount }) + const gatewayBalance = await ethers.provider.getBalance( + OVM_L1ETHGateway.address + ) + expect(gatewayBalance).to.equal(migrateAmount) + }) + it('should successfully migrate ETH to new gateway', async () => { + const New_OVM_L1ETHGateway = await ( + await ethers.getContractFactory('OVM_L1ETHGateway') + ).deploy() + await New_OVM_L1ETHGateway.initialize( + AddressManager.address, + Mock__OVM_L2DepositedERC20.address + ) + await OVM_L1ETHGateway.migrateEth(New_OVM_L1ETHGateway.address) + const newGatewayBalance = await ethers.provider.getBalance( + New_OVM_L1ETHGateway.address + ) + expect(newGatewayBalance).to.equal(migrateAmount) + }) + it('should not allow migrating ETH from non-owner', async () => { + const New_OVM_L1ETHGateway = await ( + await ethers.getContractFactory('OVM_L1ETHGateway') + ).deploy() + await New_OVM_L1ETHGateway.initialize( + AddressManager.address, + Mock__OVM_L2DepositedERC20.address + ) + await expect( + OVM_L1ETHGateway.connect(bob).migrateEth(New_OVM_L1ETHGateway.address) + ).to.be.revertedWith('Only the owner can migrate ETH') + }) + }) }) diff --git a/packages/contracts/test/contracts/OVM/execution/OVM_ExecutionManager.gas-spec.ts b/packages/contracts/test/contracts/OVM/execution/OVM_ExecutionManager.gas-spec.ts index eff4c61fdf9c7..c6fdaa0577b22 100644 --- a/packages/contracts/test/contracts/OVM/execution/OVM_ExecutionManager.gas-spec.ts +++ b/packages/contracts/test/contracts/OVM/execution/OVM_ExecutionManager.gas-spec.ts @@ -110,7 +110,7 @@ describe('OVM_ExecutionManager gas consumption', () => { ) console.log(`calculated gas cost of ${gasCost}`) - const benchmark: number = 105_000 + const benchmark: number = 106_000 expect(gasCost).to.be.lte(benchmark) expect(gasCost).to.be.gte( benchmark - 1_000, diff --git a/packages/contracts/test/contracts/OVM/precompiles/OVM_SequencerEntrypoint.spec.ts b/packages/contracts/test/contracts/OVM/precompiles/OVM_SequencerEntrypoint.spec.ts index 02f613ce3aa8f..6406943a6cd09 100644 --- a/packages/contracts/test/contracts/OVM/precompiles/OVM_SequencerEntrypoint.spec.ts +++ b/packages/contracts/test/contracts/OVM/precompiles/OVM_SequencerEntrypoint.spec.ts @@ -7,15 +7,8 @@ import { smockit, MockContract } from '@eth-optimism/smock' import { fromHexString, toHexString } from '@eth-optimism/core-utils' /* Internal Imports */ +import { DEFAULT_EIP155_TX } from '../../../helpers' import { getContractInterface, getContractFactory } from '../../../../src' -import { - encodeSequencerCalldata, - signNativeTransaction, - signEthSignMessage, - DEFAULT_EIP155_TX, - serializeNativeTransaction, - serializeEthSignTransaction, -} from '../../../helpers' describe('OVM_SequencerEntrypoint', () => { let wallet: Wallet @@ -94,141 +87,69 @@ describe('OVM_SequencerEntrypoint', () => { }) describe('fallback()', async () => { - it('should call EIP155 if the transaction type is 0', async () => { - const calldata = await encodeSequencerCalldata( - wallet, - DEFAULT_EIP155_TX, - 0 - ) + it('should call EIP155', async () => { + const transaction = DEFAULT_EIP155_TX + const encodedTransaction = await wallet.signTransaction(transaction) + await Helper_PredeployCaller.callPredeploy( OVM_SequencerEntrypoint.address, - calldata + encodedTransaction ) - const encodedTx = serializeNativeTransaction(DEFAULT_EIP155_TX) - const sig = await signNativeTransaction(wallet, DEFAULT_EIP155_TX) - const expectedEOACalldata = iOVM_ECDSAContractAccount.encodeFunctionData( 'execute', - [ - encodedTx, - 0, //isEthSignedMessage - `0x${sig.v}`, //v - `0x${sig.r}`, //r - `0x${sig.s}`, //s - ] + [encodedTransaction] ) const ovmCALL: any = Mock__OVM_ExecutionManager.smocked.ovmCALL.calls[0] expect(ovmCALL._address).to.equal(await wallet.getAddress()) expect(ovmCALL._calldata).to.equal(expectedEOACalldata) }) - it('should send correct calldata if tx is a create and the transaction type is 0', async () => { - const createTx = { ...DEFAULT_EIP155_TX, to: '' } - const calldata = await encodeSequencerCalldata(wallet, createTx, 0) + it('should send correct calldata if tx is a create', async () => { + const transaction = { ...DEFAULT_EIP155_TX, to: '' } + const encodedTransaction = await wallet.signTransaction(transaction) + await Helper_PredeployCaller.callPredeploy( OVM_SequencerEntrypoint.address, - calldata + encodedTransaction ) - const encodedTx = serializeNativeTransaction(createTx) - const sig = await signNativeTransaction(wallet, createTx) - const expectedEOACalldata = iOVM_ECDSAContractAccount.encodeFunctionData( 'execute', - [ - encodedTx, - 0, //isEthSignedMessage - `0x${sig.v}`, //v - `0x${sig.r}`, //r - `0x${sig.s}`, //s - ] + [encodedTransaction] ) const ovmCALL: any = Mock__OVM_ExecutionManager.smocked.ovmCALL.calls[0] expect(ovmCALL._address).to.equal(await wallet.getAddress()) expect(ovmCALL._calldata).to.equal(expectedEOACalldata) }) - for (let i = 0; i < 3; i += 2) { - it(`should call ovmCreateEOA when tx type is ${i} and ovmEXTCODESIZE returns 0`, async () => { - let firstCheck = true - Mock__OVM_ExecutionManager.smocked.ovmEXTCODESIZE.will.return.with( - () => { - if (firstCheck) { - firstCheck = false - return 0 - } else { - return 1 - } - } - ) - const calldata = await encodeSequencerCalldata( - wallet, - DEFAULT_EIP155_TX, - i - ) - await Helper_PredeployCaller.callPredeploy( - OVM_SequencerEntrypoint.address, - calldata - ) - const call: any = - Mock__OVM_ExecutionManager.smocked.ovmCREATEEOA.calls[0] - const eoaAddress = ethers.utils.recoverAddress(call._messageHash, { - v: call._v + 27, - r: call._r, - s: call._s, - }) - expect(eoaAddress).to.equal(await wallet.getAddress()) + it(`should call ovmCreateEOA when ovmEXTCODESIZE returns 0`, async () => { + let isFirstCheck = true + Mock__OVM_ExecutionManager.smocked.ovmEXTCODESIZE.will.return.with(() => { + if (isFirstCheck) { + isFirstCheck = false + return 0 + } else { + return 1 + } }) - } - it('should submit ETHSignedTypedData if TransactionType is 2', async () => { - const calldata = await encodeSequencerCalldata( - wallet, - DEFAULT_EIP155_TX, - 2 - ) + const transaction = DEFAULT_EIP155_TX + const encodedTransaction = await wallet.signTransaction(transaction) + await Helper_PredeployCaller.callPredeploy( OVM_SequencerEntrypoint.address, - calldata - ) - - const encodedTx = serializeEthSignTransaction(DEFAULT_EIP155_TX) - const sig = await signEthSignMessage(wallet, DEFAULT_EIP155_TX) - - const expectedEOACalldata = iOVM_ECDSAContractAccount.encodeFunctionData( - 'execute', - [ - encodedTx, - 1, //isEthSignedMessage - `0x${sig.v}`, //v - `0x${sig.r}`, //r - `0x${sig.s}`, //s - ] + encodedTransaction ) - const ovmCALL: any = Mock__OVM_ExecutionManager.smocked.ovmCALL.calls[0] - expect(ovmCALL._address).to.equal(await wallet.getAddress()) - expect(ovmCALL._calldata).to.equal(expectedEOACalldata) - }) - it('should revert if TransactionType is >2', async () => { - const calldata = '0x03' - await expect( - Helper_PredeployCaller.callPredeploy( - OVM_SequencerEntrypoint.address, - calldata - ) - ).to.be.reverted - }) + const call: any = Mock__OVM_ExecutionManager.smocked.ovmCREATEEOA.calls[0] + const eoaAddress = ethers.utils.recoverAddress(call._messageHash, { + v: call._v + 27, + r: call._r, + s: call._s, + }) - it('should revert if TransactionType is 1', async () => { - const calldata = '0x01' - await expect( - Helper_PredeployCaller.callPredeploy( - OVM_SequencerEntrypoint.address, - calldata - ) - ).to.be.reverted + expect(eoaAddress).to.equal(await wallet.getAddress()) }) }) }) diff --git a/packages/contracts/test/contracts/libraries/codec/Lib_EIP155Tx.spec.ts b/packages/contracts/test/contracts/libraries/codec/Lib_EIP155Tx.spec.ts new file mode 100644 index 0000000000000..021f14edcb19d --- /dev/null +++ b/packages/contracts/test/contracts/libraries/codec/Lib_EIP155Tx.spec.ts @@ -0,0 +1,15 @@ +/* tslint:disable:no-empty */ +import '../../../setup' + +/* Internal Imports */ +import { Lib_EIP155Tx_TEST_JSON } from '../../../data' +import { runJsonTest } from '../../../helpers' + +// Currently running tests from here: +// https://github.com/ethereumjs/ethereumjs-tx/blob/master/test/ttTransactionTestEip155VitaliksTests.json + +describe('Lib_EIP155Tx', () => { + describe('JSON tests', () => { + runJsonTest('TestLib_EIP155Tx', Lib_EIP155Tx_TEST_JSON) + }) +}) diff --git a/packages/contracts/test/contracts/libraries/utils/Lib_ECDSAUtils.spec.ts b/packages/contracts/test/contracts/libraries/utils/Lib_ECDSAUtils.spec.ts deleted file mode 100644 index baf3c5a999b23..0000000000000 --- a/packages/contracts/test/contracts/libraries/utils/Lib_ECDSAUtils.spec.ts +++ /dev/null @@ -1,9 +0,0 @@ -/* Internal Imports */ -import { Lib_ECDSAUtils_TEST_JSON } from '../../../data' -import { runJsonTest } from '../../../helpers' - -describe('Lib_ECDSAUtils', () => { - describe('JSON tests', () => { - runJsonTest('TestLib_ECDSAUtils', Lib_ECDSAUtils_TEST_JSON) - }) -}) diff --git a/packages/contracts/test/data/index.ts b/packages/contracts/test/data/index.ts index 8a4a1f7e65b88..5c9103f5c2d5b 100644 --- a/packages/contracts/test/data/index.ts +++ b/packages/contracts/test/data/index.ts @@ -2,8 +2,8 @@ export { tests as Lib_RLPWriter_TEST_JSON } from './json/libraries/rlp/Lib_RLPWr export { tests as Lib_RLPReader_TEST_JSON } from './json/libraries/rlp/Lib_RLPReader.test.json' export { tests as Lib_Bytes32Utils_TEST_JSON } from './json/libraries/utils/Lib_Bytes32Utils.test.json' export { tests as Lib_BytesUtils_TEST_JSON } from './json/libraries/utils/Lib_BytesUtils.test.json' -export { tests as Lib_ECDSAUtils_TEST_JSON } from './json/libraries/utils/Lib_ECDSAUtils.test.json' export { tests as Lib_MerkleTrie_TEST_JSON } from './json/libraries/trie/Lib_MerkleTrie.test.json' +export { tests as Lib_EIP155Tx_TEST_JSON } from './json/libraries/codec/Lib_EIP155Tx.test.json' export { tests as Lib_OVMCodec_TEST_JSON } from './json/libraries/codec/Lib_OVMCodec.test.json' export { tests as CREATE2_TEST_JSON } from './json/create2.test.json' export { tests as SAFETY_CHECKER_TEST_JSON } from './json/safety-checker.test.json' diff --git a/packages/contracts/test/data/json/libraries/codec/Lib_EIP155Tx.test.json b/packages/contracts/test/data/json/libraries/codec/Lib_EIP155Tx.test.json new file mode 100644 index 0000000000000..a7536ad4fa3bb --- /dev/null +++ b/packages/contracts/test/data/json/libraries/codec/Lib_EIP155Tx.test.json @@ -0,0 +1,725 @@ +{ + "tests": { + "decode": { + "vitalik test 0": { + "in": [ + "0xf864808504a817c800825208943535353535353535353535353535353535353535808025a0044852b2a670ade5407e78fb2863c51de9fcb96542a07186fe3aeda6bb8a116da0044852b2a670ade5407e78fb2863c51de9fcb96542a07186fe3aeda6bb8a116d", + 1 + ], + "out": [ + [ + "0x00", + "0x04a817c800", + "0x5208", + "0x3535353535353535353535353535353535353535", + "0x00", + "0x", + "0x25", + "0x044852b2a670ade5407e78fb2863c51de9fcb96542a07186fe3aeda6bb8a116d", + "0x044852b2a670ade5407e78fb2863c51de9fcb96542a07186fe3aeda6bb8a116d", + "0x01", + "0x00", + false + ] + ] + }, + "vitalik test 1": { + "in": [ + "0xf867088504a817c8088302e2489435353535353535353535353535353535353535358202008025a064b1702d9298fee62dfeccc57d322a463ad55ca201256d01f62b45b2e1c21c12a064b1702d9298fee62dfeccc57d322a463ad55ca201256d01f62b45b2e1c21c10", + 1 + ], + "out": [ + [ + "0x08", + "0x04a817c808", + "0x02e248", + "0x3535353535353535353535353535353535353535", + "0x0200", + "0x", + "0x25", + "0x64b1702d9298fee62dfeccc57d322a463ad55ca201256d01f62b45b2e1c21c12", + "0x64b1702d9298fee62dfeccc57d322a463ad55ca201256d01f62b45b2e1c21c10", + "0x01", + "0x00", + false + ] + ] + }, + "vitalik test 2": { + "in": [ + "0xf867098504a817c809830334509435353535353535353535353535353535353535358202d98025a052f8f61201b2b11a78d6e866abc9c3db2ae8631fa656bfe5cb53668255367afba052f8f61201b2b11a78d6e866abc9c3db2ae8631fa656bfe5cb53668255367afb", + 1 + ], + "out": [ + [ + "0x09", + "0x04a817c809", + "0x033450", + "0x3535353535353535353535353535353535353535", + "0x02d9", + "0x", + "0x25", + "0x52f8f61201b2b11a78d6e866abc9c3db2ae8631fa656bfe5cb53668255367afb", + "0x52f8f61201b2b11a78d6e866abc9c3db2ae8631fa656bfe5cb53668255367afb", + "0x01", + "0x00", + false + ] + ] + }, + "vitalik test 3": { + "in": [ + "0xf864018504a817c80182a410943535353535353535353535353535353535353535018025a0489efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bcaa0489efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6", + 1 + ], + "out": [ + [ + "0x01", + "0x04a817c801", + "0xa410", + "0x3535353535353535353535353535353535353535", + "0x01", + "0x", + "0x25", + "0x489efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bca", + "0x489efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6", + "0x01", + "0x00", + false + ] + ] + }, + "vitalik test 4": { + "in": [ + "0xf864028504a817c80282f618943535353535353535353535353535353535353535088025a02d7c5bef027816a800da1736444fb58a807ef4c9603b7848673f7e3a68eb14a5a02d7c5bef027816a800da1736444fb58a807ef4c9603b7848673f7e3a68eb14a5", + 1 + ], + "out": [ + [ + "0x02", + "0x04a817c802", + "0xf618", + "0x3535353535353535353535353535353535353535", + "0x08", + "0x", + "0x25", + "0x2d7c5bef027816a800da1736444fb58a807ef4c9603b7848673f7e3a68eb14a5", + "0x2d7c5bef027816a800da1736444fb58a807ef4c9603b7848673f7e3a68eb14a5", + "0x01", + "0x00", + false + ] + ] + }, + "vitalik test 5": { + "in": [ + "0xf865038504a817c803830148209435353535353535353535353535353535353535351b8025a02a80e1ef1d7842f27f2e6be0972bb708b9a135c38860dbe73c27c3486c34f4e0a02a80e1ef1d7842f27f2e6be0972bb708b9a135c38860dbe73c27c3486c34f4de", + 1 + ], + "out": [ + [ + "0x03", + "0x04a817c803", + "0x014820", + "0x3535353535353535353535353535353535353535", + "0x1b", + "0x", + "0x25", + "0x2a80e1ef1d7842f27f2e6be0972bb708b9a135c38860dbe73c27c3486c34f4e0", + "0x2a80e1ef1d7842f27f2e6be0972bb708b9a135c38860dbe73c27c3486c34f4de", + "0x01", + "0x00", + false + ] + ] + }, + "vitalik test 6": { + "in": [ + "0xf865048504a817c80483019a28943535353535353535353535353535353535353535408025a013600b294191fc92924bb3ce4b969c1e7e2bab8f4c93c3fc6d0a51733df3c063a013600b294191fc92924bb3ce4b969c1e7e2bab8f4c93c3fc6d0a51733df3c060", + 1 + ], + "out": [ + [ + "0x04", + "0x04a817c804", + "0x019a28", + "0x3535353535353535353535353535353535353535", + "0x40", + "0x", + "0x25", + "0x13600b294191fc92924bb3ce4b969c1e7e2bab8f4c93c3fc6d0a51733df3c063", + "0x13600b294191fc92924bb3ce4b969c1e7e2bab8f4c93c3fc6d0a51733df3c060", + "0x01", + "0x00", + false + ] + ] + }, + "vitalik test 7": { + "in": [ + "0xf865058504a817c8058301ec309435353535353535353535353535353535353535357d8025a04eebf77a833b30520287ddd9478ff51abbdffa30aa90a8d655dba0e8a79ce0c1a04eebf77a833b30520287ddd9478ff51abbdffa30aa90a8d655dba0e8a79ce0c1", + 1 + ], + "out": [ + [ + "0x05", + "0x04a817c805", + "0x01ec30", + "0x3535353535353535353535353535353535353535", + "0x7d", + "0x", + "0x25", + "0x4eebf77a833b30520287ddd9478ff51abbdffa30aa90a8d655dba0e8a79ce0c1", + "0x4eebf77a833b30520287ddd9478ff51abbdffa30aa90a8d655dba0e8a79ce0c1", + "0x01", + "0x00", + false + ] + ] + }, + "vitalik test 8": { + "in": [ + "0xf865058504a817c8058301ec309435353535353535353535353535353535353535357d8025a04eebf77a833b30520287ddd9478ff51abbdffa30aa90a8d655dba0e8a79ce0c1a04eebf77a833b30520287ddd9478ff51abbdffa30aa90a8d655dba0e8a79ce0c1", + 1 + ], + "out": [ + [ + "0x05", + "0x04a817c805", + "0x01ec30", + "0x3535353535353535353535353535353535353535", + "0x7d", + "0x", + "0x25", + "0x4eebf77a833b30520287ddd9478ff51abbdffa30aa90a8d655dba0e8a79ce0c1", + "0x4eebf77a833b30520287ddd9478ff51abbdffa30aa90a8d655dba0e8a79ce0c1", + "0x01", + "0x00", + false + ] + ] + }, + "vitalik test 9": { + "in": [ + "0xf866068504a817c80683023e3894353535353535353535353535353535353535353581d88025a06455bf8ea6e7463a1046a0b52804526e119b4bf5136279614e0b1e8e296a4e2fa06455bf8ea6e7463a1046a0b52804526e119b4bf5136279614e0b1e8e296a4e2d", + 1 + ], + "out": [ + [ + "0x06", + "0x04a817c806", + "0x023e38", + "0x3535353535353535353535353535353535353535", + "0xd8", + "0x", + "0x25", + "0x6455bf8ea6e7463a1046a0b52804526e119b4bf5136279614e0b1e8e296a4e2f", + "0x6455bf8ea6e7463a1046a0b52804526e119b4bf5136279614e0b1e8e296a4e2d", + "0x01", + "0x00", + false + ] + ] + }, + "vitalik test 10": { + "in": [ + "0xf867078504a817c807830290409435353535353535353535353535353535353535358201578025a052f1a9b320cab38e5da8a8f97989383aab0a49165fc91c737310e4f7e9821021a052f1a9b320cab38e5da8a8f97989383aab0a49165fc91c737310e4f7e9821021", + 1 + ], + "out": [ + [ + "0x07", + "0x04a817c807", + "0x029040", + "0x3535353535353535353535353535353535353535", + "0x0157", + "0x", + "0x25", + "0x52f1a9b320cab38e5da8a8f97989383aab0a49165fc91c737310e4f7e9821021", + "0x52f1a9b320cab38e5da8a8f97989383aab0a49165fc91c737310e4f7e9821021", + "0x01", + "0x00", + false + ] + ] + } + }, + "encode": { + "vitalik test 0": { + "in": [ + [ + "0x00", + "0x04a817c800", + "0x5208", + "0x3535353535353535353535353535353535353535", + "0x00", + "0x", + "0x25", + "0x044852b2a670ade5407e78fb2863c51de9fcb96542a07186fe3aeda6bb8a116d", + "0x044852b2a670ade5407e78fb2863c51de9fcb96542a07186fe3aeda6bb8a116d", + "0x01", + "0x00", + false + ], + true + ], + "out": [ + "0xf864808504a817c800825208943535353535353535353535353535353535353535808025a0044852b2a670ade5407e78fb2863c51de9fcb96542a07186fe3aeda6bb8a116da0044852b2a670ade5407e78fb2863c51de9fcb96542a07186fe3aeda6bb8a116d" + ] + }, + "vitalik test 1": { + "in": [ + [ + "0x08", + "0x04a817c808", + "0x02e248", + "0x3535353535353535353535353535353535353535", + "0x0200", + "0x", + "0x25", + "0x64b1702d9298fee62dfeccc57d322a463ad55ca201256d01f62b45b2e1c21c12", + "0x64b1702d9298fee62dfeccc57d322a463ad55ca201256d01f62b45b2e1c21c10", + "0x01", + "0x00", + false + ], + true + ], + "out": [ + "0xf867088504a817c8088302e2489435353535353535353535353535353535353535358202008025a064b1702d9298fee62dfeccc57d322a463ad55ca201256d01f62b45b2e1c21c12a064b1702d9298fee62dfeccc57d322a463ad55ca201256d01f62b45b2e1c21c10" + ] + }, + "vitalik test 2": { + "in": [ + [ + "0x09", + "0x04a817c809", + "0x033450", + "0x3535353535353535353535353535353535353535", + "0x02d9", + "0x", + "0x25", + "0x52f8f61201b2b11a78d6e866abc9c3db2ae8631fa656bfe5cb53668255367afb", + "0x52f8f61201b2b11a78d6e866abc9c3db2ae8631fa656bfe5cb53668255367afb", + "0x01", + "0x00", + false + ], + true + ], + "out": [ + "0xf867098504a817c809830334509435353535353535353535353535353535353535358202d98025a052f8f61201b2b11a78d6e866abc9c3db2ae8631fa656bfe5cb53668255367afba052f8f61201b2b11a78d6e866abc9c3db2ae8631fa656bfe5cb53668255367afb" + ] + }, + "vitalik test 3": { + "in": [ + [ + "0x01", + "0x04a817c801", + "0xa410", + "0x3535353535353535353535353535353535353535", + "0x01", + "0x", + "0x25", + "0x489efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bca", + "0x489efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6", + "0x01", + "0x00", + false + ], + true + ], + "out": [ + "0xf864018504a817c80182a410943535353535353535353535353535353535353535018025a0489efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bcaa0489efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6" + ] + }, + "vitalik test 4": { + "in": [ + [ + "0x02", + "0x04a817c802", + "0xf618", + "0x3535353535353535353535353535353535353535", + "0x08", + "0x", + "0x25", + "0x2d7c5bef027816a800da1736444fb58a807ef4c9603b7848673f7e3a68eb14a5", + "0x2d7c5bef027816a800da1736444fb58a807ef4c9603b7848673f7e3a68eb14a5", + "0x01", + "0x00", + false + ], + true + ], + "out": [ + "0xf864028504a817c80282f618943535353535353535353535353535353535353535088025a02d7c5bef027816a800da1736444fb58a807ef4c9603b7848673f7e3a68eb14a5a02d7c5bef027816a800da1736444fb58a807ef4c9603b7848673f7e3a68eb14a5" + ] + }, + "vitalik test 5": { + "in": [ + [ + "0x03", + "0x04a817c803", + "0x014820", + "0x3535353535353535353535353535353535353535", + "0x1b", + "0x", + "0x25", + "0x2a80e1ef1d7842f27f2e6be0972bb708b9a135c38860dbe73c27c3486c34f4e0", + "0x2a80e1ef1d7842f27f2e6be0972bb708b9a135c38860dbe73c27c3486c34f4de", + "0x01", + "0x00", + false + ], + true + ], + "out": [ + "0xf865038504a817c803830148209435353535353535353535353535353535353535351b8025a02a80e1ef1d7842f27f2e6be0972bb708b9a135c38860dbe73c27c3486c34f4e0a02a80e1ef1d7842f27f2e6be0972bb708b9a135c38860dbe73c27c3486c34f4de" + ] + }, + "vitalik test 6": { + "in": [ + [ + "0x04", + "0x04a817c804", + "0x019a28", + "0x3535353535353535353535353535353535353535", + "0x40", + "0x", + "0x25", + "0x13600b294191fc92924bb3ce4b969c1e7e2bab8f4c93c3fc6d0a51733df3c063", + "0x13600b294191fc92924bb3ce4b969c1e7e2bab8f4c93c3fc6d0a51733df3c060", + "0x01", + "0x00", + false + ], + true + ], + "out": [ + "0xf865048504a817c80483019a28943535353535353535353535353535353535353535408025a013600b294191fc92924bb3ce4b969c1e7e2bab8f4c93c3fc6d0a51733df3c063a013600b294191fc92924bb3ce4b969c1e7e2bab8f4c93c3fc6d0a51733df3c060" + ] + }, + "vitalik test 7": { + "in": [ + [ + "0x05", + "0x04a817c805", + "0x01ec30", + "0x3535353535353535353535353535353535353535", + "0x7d", + "0x", + "0x25", + "0x4eebf77a833b30520287ddd9478ff51abbdffa30aa90a8d655dba0e8a79ce0c1", + "0x4eebf77a833b30520287ddd9478ff51abbdffa30aa90a8d655dba0e8a79ce0c1", + "0x01", + "0x00", + false + ], + true + ], + "out": [ + "0xf865058504a817c8058301ec309435353535353535353535353535353535353535357d8025a04eebf77a833b30520287ddd9478ff51abbdffa30aa90a8d655dba0e8a79ce0c1a04eebf77a833b30520287ddd9478ff51abbdffa30aa90a8d655dba0e8a79ce0c1" + ] + }, + "vitalik test 8": { + "in": [ + [ + "0x05", + "0x04a817c805", + "0x01ec30", + "0x3535353535353535353535353535353535353535", + "0x7d", + "0x", + "0x25", + "0x4eebf77a833b30520287ddd9478ff51abbdffa30aa90a8d655dba0e8a79ce0c1", + "0x4eebf77a833b30520287ddd9478ff51abbdffa30aa90a8d655dba0e8a79ce0c1", + "0x01", + "0x00", + false + ], + true + ], + "out": [ + "0xf865058504a817c8058301ec309435353535353535353535353535353535353535357d8025a04eebf77a833b30520287ddd9478ff51abbdffa30aa90a8d655dba0e8a79ce0c1a04eebf77a833b30520287ddd9478ff51abbdffa30aa90a8d655dba0e8a79ce0c1" + ] + }, + "vitalik test 9": { + "in": [ + [ + "0x06", + "0x04a817c806", + "0x023e38", + "0x3535353535353535353535353535353535353535", + "0xd8", + "0x", + "0x25", + "0x6455bf8ea6e7463a1046a0b52804526e119b4bf5136279614e0b1e8e296a4e2f", + "0x6455bf8ea6e7463a1046a0b52804526e119b4bf5136279614e0b1e8e296a4e2d", + "0x01", + "0x00", + false + ], + true + ], + "out": [ + "0xf866068504a817c80683023e3894353535353535353535353535353535353535353581d88025a06455bf8ea6e7463a1046a0b52804526e119b4bf5136279614e0b1e8e296a4e2fa06455bf8ea6e7463a1046a0b52804526e119b4bf5136279614e0b1e8e296a4e2d" + ] + }, + "vitalik test 10": { + "in": [ + [ + "0x07", + "0x04a817c807", + "0x029040", + "0x3535353535353535353535353535353535353535", + "0x0157", + "0x", + "0x25", + "0x52f1a9b320cab38e5da8a8f97989383aab0a49165fc91c737310e4f7e9821021", + "0x52f1a9b320cab38e5da8a8f97989383aab0a49165fc91c737310e4f7e9821021", + "0x01", + "0x00", + false + ], + true + ], + "out": [ + "0xf867078504a817c807830290409435353535353535353535353535353535353535358201578025a052f1a9b320cab38e5da8a8f97989383aab0a49165fc91c737310e4f7e9821021a052f1a9b320cab38e5da8a8f97989383aab0a49165fc91c737310e4f7e9821021" + ] + } + }, + "sender": { + "vitalik test 0": { + "in": [ + [ + "0x00", + "0x04a817c800", + "0x5208", + "0x3535353535353535353535353535353535353535", + "0x00", + "0x", + "0x25", + "0x044852b2a670ade5407e78fb2863c51de9fcb96542a07186fe3aeda6bb8a116d", + "0x044852b2a670ade5407e78fb2863c51de9fcb96542a07186fe3aeda6bb8a116d", + "0x01", + "0x00", + false + ] + ], + "out": [ + "0xf0f6f18bca1b28cd68e4357452947e021241e9ce" + ] + }, + "vitalik test 1": { + "in": [ + [ + "0x08", + "0x04a817c808", + "0x02e248", + "0x3535353535353535353535353535353535353535", + "0x0200", + "0x", + "0x25", + "0x64b1702d9298fee62dfeccc57d322a463ad55ca201256d01f62b45b2e1c21c12", + "0x64b1702d9298fee62dfeccc57d322a463ad55ca201256d01f62b45b2e1c21c10", + "0x01", + "0x00", + false + ] + ], + "out": [ + "0x9bddad43f934d313c2b79ca28a432dd2b7281029" + ] + }, + "vitalik test 2": { + "in": [ + [ + "0x09", + "0x04a817c809", + "0x033450", + "0x3535353535353535353535353535353535353535", + "0x02d9", + "0x", + "0x25", + "0x52f8f61201b2b11a78d6e866abc9c3db2ae8631fa656bfe5cb53668255367afb", + "0x52f8f61201b2b11a78d6e866abc9c3db2ae8631fa656bfe5cb53668255367afb", + "0x01", + "0x00", + false + ] + ], + "out": [ + "0x3c24d7329e92f84f08556ceb6df1cdb0104ca49f" + ] + }, + "vitalik test 3": { + "in": [ + [ + "0x01", + "0x04a817c801", + "0xa410", + "0x3535353535353535353535353535353535353535", + "0x01", + "0x", + "0x25", + "0x489efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bca", + "0x489efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6", + "0x01", + "0x00", + false + ] + ], + "out": [ + "0x23ef145a395ea3fa3deb533b8a9e1b4c6c25d112" + ] + }, + "vitalik test 4": { + "in": [ + [ + "0x02", + "0x04a817c802", + "0xf618", + "0x3535353535353535353535353535353535353535", + "0x08", + "0x", + "0x25", + "0x2d7c5bef027816a800da1736444fb58a807ef4c9603b7848673f7e3a68eb14a5", + "0x2d7c5bef027816a800da1736444fb58a807ef4c9603b7848673f7e3a68eb14a5", + "0x01", + "0x00", + false + ] + ], + "out": [ + "0x2e485e0c23b4c3c542628a5f672eeab0ad4888be" + ] + }, + "vitalik test 5": { + "in": [ + [ + "0x03", + "0x04a817c803", + "0x014820", + "0x3535353535353535353535353535353535353535", + "0x1b", + "0x", + "0x25", + "0x2a80e1ef1d7842f27f2e6be0972bb708b9a135c38860dbe73c27c3486c34f4e0", + "0x2a80e1ef1d7842f27f2e6be0972bb708b9a135c38860dbe73c27c3486c34f4de", + "0x01", + "0x00", + false + ] + ], + "out": [ + "0x82a88539669a3fd524d669e858935de5e5410cf0" + ] + }, + "vitalik test 6": { + "in": [ + [ + "0x04", + "0x04a817c804", + "0x019a28", + "0x3535353535353535353535353535353535353535", + "0x40", + "0x", + "0x25", + "0x13600b294191fc92924bb3ce4b969c1e7e2bab8f4c93c3fc6d0a51733df3c063", + "0x13600b294191fc92924bb3ce4b969c1e7e2bab8f4c93c3fc6d0a51733df3c060", + "0x01", + "0x00", + false + ] + ], + "out": [ + "0xf9358f2538fd5ccfeb848b64a96b743fcc930554" + ] + }, + "vitalik test 7": { + "in": [ + [ + "0x05", + "0x04a817c805", + "0x01ec30", + "0x3535353535353535353535353535353535353535", + "0x7d", + "0x", + "0x25", + "0x4eebf77a833b30520287ddd9478ff51abbdffa30aa90a8d655dba0e8a79ce0c1", + "0x4eebf77a833b30520287ddd9478ff51abbdffa30aa90a8d655dba0e8a79ce0c1", + "0x01", + "0x00", + false + ] + ], + "out": [ + "0xa8f7aba377317440bc5b26198a363ad22af1f3a4" + ] + }, + "vitalik test 8": { + "in": [ + [ + "0x05", + "0x04a817c805", + "0x01ec30", + "0x3535353535353535353535353535353535353535", + "0x7d", + "0x", + "0x25", + "0x4eebf77a833b30520287ddd9478ff51abbdffa30aa90a8d655dba0e8a79ce0c1", + "0x4eebf77a833b30520287ddd9478ff51abbdffa30aa90a8d655dba0e8a79ce0c1", + "0x01", + "0x00", + false + ] + ], + "out": [ + "0xa8f7aba377317440bc5b26198a363ad22af1f3a4" + ] + }, + "vitalik test 9": { + "in": [ + [ + "0x06", + "0x04a817c806", + "0x023e38", + "0x3535353535353535353535353535353535353535", + "0xd8", + "0x", + "0x25", + "0x6455bf8ea6e7463a1046a0b52804526e119b4bf5136279614e0b1e8e296a4e2f", + "0x6455bf8ea6e7463a1046a0b52804526e119b4bf5136279614e0b1e8e296a4e2d", + "0x01", + "0x00", + false + ] + ], + "out": [ + "0xf1f571dc362a0e5b2696b8e775f8491d3e50de35" + ] + }, + "vitalik test 10": { + "in": [ + [ + "0x07", + "0x04a817c807", + "0x029040", + "0x3535353535353535353535353535353535353535", + "0x0157", + "0x", + "0x25", + "0x52f1a9b320cab38e5da8a8f97989383aab0a49165fc91c737310e4f7e9821021", + "0x52f1a9b320cab38e5da8a8f97989383aab0a49165fc91c737310e4f7e9821021", + "0x01", + "0x00", + false + ] + ], + "out": [ + "0xd37922162ab7cea97c97a87551ed02c9a38b7332" + ] + } + } + } +} diff --git a/packages/contracts/test/data/json/libraries/codec/Lib_OVMCodec.test.json b/packages/contracts/test/data/json/libraries/codec/Lib_OVMCodec.test.json index 6808dcef02d4d..a55ce0122c21f 100644 --- a/packages/contracts/test/data/json/libraries/codec/Lib_OVMCodec.test.json +++ b/packages/contracts/test/data/json/libraries/codec/Lib_OVMCodec.test.json @@ -1,23 +1,4 @@ { "tests": { - "decompressEIP155Transaction": { - "decompression": { - "in": [ - "0x0001f4000064000064121212121212121212121212121212121212121299999999999999999999", - 420 - ], - "out": [ - [ - 100, - 100000000, - 500, - "0x1212121212121212121212121212121212121212", - 0, - "0x99999999999999999999", - 420 - ] - ] - } - } } } diff --git a/packages/contracts/test/data/json/libraries/utils/Lib_ECDSAUtils.test.json b/packages/contracts/test/data/json/libraries/utils/Lib_ECDSAUtils.test.json deleted file mode 100644 index 40f15819442f1..0000000000000 --- a/packages/contracts/test/data/json/libraries/utils/Lib_ECDSAUtils.test.json +++ /dev/null @@ -1,126 +0,0 @@ -{ - "tests": { - "recover": { - "standard hash, valid signature": { - "in": [ - "0xf83d80808094121212121212121212121212121212121212121280a0bc36789e7a1e281436464229828f817d6612f7b477d66591ff96a9e064bcc98a6c8080", - false, - "0x01", - "0x057bf1c0edf0a9002a79f8c9b39683f6453a18e73e02364270a2b6ee8117f11a", - "0x5f8181365a222c7b05a84c29a29754e6a925952d3bf4bd65a6259ef37ee048e3" - ], - "out": [ - "0x17ec8597ff92C3F44523bDc65BF0f1bE632917ff" - ] - }, - "standard hash, invalid v parameter": { - "in": [ - "0xf83d80808094121212121212121212121212121212121212121280a0bc36789e7a1e281436464229828f817d6612f7b477d66591ff96a9e064bcc98a6c8080", - false, - "0xfc", - "0x057bf1c0edf0a9002a79f8c9b39683f6453a18e73e02364270a2b6ee8117f11a", - "0x5f8181365a222c7b05a84c29a29754e6a925952d3bf4bd65a6259ef37ee048e3" - ], - "out": [ - "0x0000000000000000000000000000000000000000" - ] - }, - "standard hash, invalid r parameter": { - "in": [ - "0xf83d80808094121212121212121212121212121212121212121280a0bc36789e7a1e281436464229828f817d6612f7b477d66591ff96a9e064bcc98a6c8080", - false, - "0x01", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x5f8181365a222c7b05a84c29a29754e6a925952d3bf4bd65a6259ef37ee048e3" - ], - "out": [ - "0x0000000000000000000000000000000000000000" - ] - }, - "standard hash, invalid s parameter": { - "in": [ - "0xf83d80808094121212121212121212121212121212121212121280a0bc36789e7a1e281436464229828f817d6612f7b477d66591ff96a9e064bcc98a6c8080", - false, - "0x01", - "0x057bf1c0edf0a9002a79f8c9b39683f6453a18e73e02364270a2b6ee8117f11a", - "0x0000000000000000000000000000000000000000000000000000000000000000" - ], - "out": [ - "0x0000000000000000000000000000000000000000" - ] - }, - "standard hash, invalid message": { - "in": [ - "0x0000000000000000000000000000000000000000000000000000000000000000", - false, - "0x01", - "0x057bf1c0edf0a9002a79f8c9b39683f6453a18e73e02364270a2b6ee8117f11a", - "0x5f8181365a222c7b05a84c29a29754e6a925952d3bf4bd65a6259ef37ee048e3" - ], - "out": [ - "0x1397890fcfC2D7563Aa01cE93A217b9809D3447B" - ] - }, - "eth signed message hash, valid signature": { - "in": [ - "0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006c000000000000000000000000121212121212121212121212121212121212121200000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000020bc36789e7a1e281436464229828f817d6612f7b477d66591ff96a9e064bcc98a", - true, - "0x01", - "0xe5a2edb71b6d76a8aacd59467d3063fd455ca13a4e9cb57da6f25849d40e4e2a", - "0x5465373d68d521845e3ffd2baf4c51f3d21c990914c09490b32ffc0b322dbf98" - ], - "out": [ - "0x17ec8597ff92C3F44523bDc65BF0f1bE632917ff" - ] - }, - "eth signed message hash, invalid v parameter": { - "in": [ - "0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006c000000000000000000000000121212121212121212121212121212121212121200000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000020bc36789e7a1e281436464229828f817d6612f7b477d66591ff96a9e064bcc98a", - true, - "0x1c", - "0xe5a2edb71b6d76a8aacd59467d3063fd455ca13a4e9cb57da6f25849d40e4e2a", - "0x5465373d68d521845e3ffd2baf4c51f3d21c990914c09490b32ffc0b322dbf98" - ], - "out": [ - "0x0000000000000000000000000000000000000000" - ] - }, - "eth signed message hash, invalid r parameter": { - "in": [ - "0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006c000000000000000000000000121212121212121212121212121212121212121200000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000020bc36789e7a1e281436464229828f817d6612f7b477d66591ff96a9e064bcc98a", - true, - "0x01", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x5465373d68d521845e3ffd2baf4c51f3d21c990914c09490b32ffc0b322dbf98" - ], - "out": [ - "0x0000000000000000000000000000000000000000" - ] - }, - "eth signed message hash, invalid s parameter": { - "in": [ - "0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006c000000000000000000000000121212121212121212121212121212121212121200000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000020bc36789e7a1e281436464229828f817d6612f7b477d66591ff96a9e064bcc98a", - true, - "0x01", - "0xe5a2edb71b6d76a8aacd59467d3063fd455ca13a4e9cb57da6f25849d40e4e2a", - "0x0000000000000000000000000000000000000000000000000000000000000000" - ], - "out": [ - "0x0000000000000000000000000000000000000000" - ] - }, - "eth signed message hash, invalid message": { - "in": [ - "0x0000000000000000000000000000000000000000000000000000000000000000", - true, - "0x01", - "0xe5a2edb71b6d76a8aacd59467d3063fd455ca13a4e9cb57da6f25849d40e4e2a", - "0x5465373d68d521845e3ffd2baf4c51f3d21c990914c09490b32ffc0b322dbf98" - ], - "out": [ - "0xf8bd1421f9D28C8F58f33B25a6faB16F3f89b749" - ] - } - } - } -} diff --git a/packages/contracts/test/helpers/codec/encoding.ts b/packages/contracts/test/helpers/codec/encoding.ts index f7e16531fcd68..7f384930b4b94 100644 --- a/packages/contracts/test/helpers/codec/encoding.ts +++ b/packages/contracts/test/helpers/codec/encoding.ts @@ -37,115 +37,3 @@ export const getRawSignedComponents = (signed: string): any[] => { export const getSignedComponents = (signed: string): any[] => { return ethers.utils.RLP.decode(signed).slice(-3) } - -export const encodeCompactTransaction = (transaction: any): string => { - const nonce = ethers.utils.zeroPad(transaction.nonce, 3) - const gasLimit = ethers.utils.zeroPad(transaction.gasLimit, 3) - if (transaction.gasPrice % 1000000 !== 0) - throw Error('gas price must be a multiple of 1000000') - const compressedGasPrice: any = transaction.gasPrice / 1000000 - const gasPrice = ethers.utils.zeroPad(compressedGasPrice, 3) - const to = !transaction.to.length - ? fromHexString(constants.AddressZero) - : fromHexString(transaction.to) - const data = fromHexString(transaction.data) - - return Buffer.concat([ - Buffer.from(gasLimit), - Buffer.from(gasPrice), - Buffer.from(nonce), - Buffer.from(to), - data, - ]).toString('hex') -} - -export const serializeEthSignTransaction = ( - transaction: EIP155Transaction -): string => { - return ethers.utils.defaultAbiCoder.encode( - ['uint256', 'uint256', 'uint256', 'uint256', 'address', 'bytes'], - [ - transaction.nonce, - transaction.gasLimit, - transaction.gasPrice, - transaction.chainId, - transaction.to, - transaction.data, - ] - ) -} - -export const serializeNativeTransaction = ( - transaction: EIP155Transaction -): string => { - return ethers.utils.serializeTransaction(transaction) -} - -export const signEthSignMessage = async ( - wallet: Wallet, - transaction: EIP155Transaction -): Promise => { - const serializedTransaction = serializeEthSignTransaction(transaction) - const transactionHash = ethers.utils.keccak256(serializedTransaction) - const transactionHashBytes = ethers.utils.arrayify(transactionHash) - const transactionSignature = await wallet.signMessage(transactionHashBytes) - - const messageHash = ethers.utils.hashMessage(transactionHashBytes) - const [v, r, s] = getRawSignedComponents(transactionSignature).map( - (component) => { - return remove0x(component) - } - ) - return { - messageHash, - v: '0' + (parseInt(v, 16) - 27), - r, - s, - } -} - -export const signNativeTransaction = async ( - wallet: Wallet, - transaction: EIP155Transaction -): Promise => { - const serializedTransaction = serializeNativeTransaction(transaction) - const transactionSignature = await wallet.signTransaction(transaction) - - const messageHash = ethers.utils.keccak256(serializedTransaction) - const [v, r, s] = getSignedComponents(transactionSignature).map( - (component) => { - return remove0x(component) - } - ) - return { - messageHash, - v: '0' + (parseInt(v, 16) - transaction.chainId * 2 - 8 - 27), - r, - s, - } -} - -export const signTransaction = async ( - wallet: Wallet, - transaction: EIP155Transaction, - transactionType: number -): Promise => { - return transactionType === 2 - ? signEthSignMessage(wallet, transaction) //ETH Signed tx - : signNativeTransaction(wallet, transaction) //Create EOA tx or EIP155 tx -} - -export const encodeSequencerCalldata = async ( - wallet: Wallet, - transaction: EIP155Transaction, - transactionType: number -) => { - const sig = await signTransaction(wallet, transaction, transactionType) - const encodedTransaction = encodeCompactTransaction(transaction) - const dataPrefix = `0x0${transactionType}${sig.r}${sig.s}${sig.v}` - const calldata = - transactionType === 1 - ? `${dataPrefix}${remove0x(sig.messageHash)}` // Create EOA tx - : `${dataPrefix}${encodedTransaction}` // EIP155 tx or ETH Signed Tx - return calldata -} diff --git a/packages/contracts/test/helpers/test-runner/json-test-runner.ts b/packages/contracts/test/helpers/test-runner/json-test-runner.ts index 0380ee849f069..b08676cc08420 100644 --- a/packages/contracts/test/helpers/test-runner/json-test-runner.ts +++ b/packages/contracts/test/helpers/test-runner/json-test-runner.ts @@ -4,10 +4,14 @@ import { expect } from '../../setup' import { ethers } from 'hardhat' import { Contract, BigNumber } from 'ethers' -const bigNumberify = (arr) => { +const bigNumberify = (arr: any[]) => { return arr.map((el: any) => { if (typeof el === 'number') { return BigNumber.from(el) + } else if (typeof el === 'string' && /^\d+n$/gm.test(el)) { + return BigNumber.from(el.slice(0, el.length - 1)) + } else if (typeof el === 'string' && el.length > 2 && el.startsWith('0x')) { + return BigNumber.from(el.toLowerCase()) } else if (Array.isArray(el)) { return bigNumberify(el) } else { @@ -31,7 +35,7 @@ export const runJsonTest = (contractName: string, json: any): void => { .reverted } else { expect( - await contract.functions[functionName](...test.in) + bigNumberify(await contract.functions[functionName](...test.in)) ).to.deep.equal(bigNumberify(test.out)) } }) diff --git a/packages/data-transport-layer/src/services/l1-ingestion/handlers/sequencer-batch-appended.ts b/packages/data-transport-layer/src/services/l1-ingestion/handlers/sequencer-batch-appended.ts index c755898eec934..c829f755cf8ea 100644 --- a/packages/data-transport-layer/src/services/l1-ingestion/handlers/sequencer-batch-appended.ts +++ b/packages/data-transport-layer/src/services/l1-ingestion/handlers/sequencer-batch-appended.ts @@ -243,36 +243,31 @@ const maybeDecodeSequencerBatchTransaction = ( decoded: DecodedSequencerBatchTransaction | null type: 'EIP155' | 'ETH_SIGN' | null } => { - let decoded = null - let type = null - try { - const txType = transaction.slice(0, 1).readUInt8() - if (txType === TxType.EIP155) { - type = 'EIP155' - decoded = ctcCoder.eip155TxData.decode(transaction.toString('hex')) - } else if (txType === TxType.EthSign) { - type = 'ETH_SIGN' - decoded = ctcCoder.ethSignTxData.decode(transaction.toString('hex')) - } else if (txType === TxType.EthSign2) { - type = 'ETH_SIGN' - decoded = ctcCoder.ethSign2TxData.decode(transaction.toString('hex')) - } else { - throw new Error(`Unknown sequencer transaction type.`) - } - // Temporary fix to propagate the value - decoded.value = '0x0' - // Validate the transaction - if (!validateBatchTransaction(type, decoded)) { - decoded = null + const decodedTx = ethers.utils.parseTransaction(transaction) + + return { + type: 'EIP155', + decoded: { + nonce: BigNumber.from(decodedTx.nonce).toNumber(), + gasPrice: BigNumber.from(decodedTx.gasPrice).toNumber(), + gasLimit: BigNumber.from(decodedTx.gasLimit).toNumber(), + value: toRpcHexString(decodedTx.value), + target: toHexString(decodedTx.to), // Maybe null this out for creations? + data: toHexString(decodedTx.data), + sig: { + v: BigNumber.from(decodedTx.v).toNumber(), + r: toHexString(decodedTx.r), + s: toHexString(decodedTx.s), + }, + type: 0, // EIP155 legacy holdover. + }, } } catch (err) { - // Do nothing - } - - return { - decoded, - type, + return { + decoded: null, + type: null, + } } } diff --git a/packages/data-transport-layer/src/services/server/service.ts b/packages/data-transport-layer/src/services/server/service.ts index 63a76164d42e5..6ad577c1a67fb 100644 --- a/packages/data-transport-layer/src/services/server/service.ts +++ b/packages/data-transport-layer/src/services/server/service.ts @@ -218,7 +218,8 @@ export class L1TransportServer extends BaseService { break case 'l2': currentL2Block = await this.state.db.getLatestUnconfirmedTransaction() - highestL2BlockNumber = await this.state.db.getHighestSyncedUnconfirmedBlock() + highestL2BlockNumber = + (await this.state.db.getHighestSyncedUnconfirmedBlock()) - 1 break default: throw new Error(`Unknown transaction backend ${backend}`) diff --git a/packages/data-transport-layer/test/unit-tests/services/l1-ingestion/handlers/sequencer-batch-appended.spec.ts b/packages/data-transport-layer/test/unit-tests/services/l1-ingestion/handlers/sequencer-batch-appended.spec.ts index 1cb6b36acfffb..edd91577070f4 100644 --- a/packages/data-transport-layer/test/unit-tests/services/l1-ingestion/handlers/sequencer-batch-appended.spec.ts +++ b/packages/data-transport-layer/test/unit-tests/services/l1-ingestion/handlers/sequencer-batch-appended.spec.ts @@ -136,65 +136,6 @@ describe('Event Handlers: OVM_CanonicalTransactionChain.SequencerBatchAppended', '10B99425FB53AD7D40A939205C0F7B35CBB89AB4D67E7AE64BDAC5F1073943B4', batchExtraData: '', } - it('should correctly parse a mainnet transaction', async () => { - const input1: [any, SequencerBatchAppendedExtraData] = [ - { - args: { - _startingQueueIndex: ethers.constants.Zero, - _numQueueElements: ethers.constants.Zero, - _totalElements: ethers.constants.Zero, - }, - }, - { - l1TransactionData, - ...exampleExtraData, - }, - ] - - const output1 = await handleEventsSequencerBatchAppended.parseEvent( - ...input1 - ) - - const batchEntry = output1.transactionBatchEntry - expect(batchEntry.index).to.eq(exampleExtraData.batchIndex.toNumber()) - expect(batchEntry.root).to.eq(exampleExtraData.batchRoot) - expect(batchEntry.size).to.eq(exampleExtraData.batchSize.toNumber()) - expect(batchEntry.prevTotalElements).to.eq( - exampleExtraData.prevTotalElements.toNumber() - ) - expect(batchEntry.extraData).to.eq(exampleExtraData.batchExtraData) - expect(batchEntry.blockNumber).to.eq(exampleExtraData.blockNumber) - expect(batchEntry.timestamp).to.eq(exampleExtraData.timestamp) - expect(batchEntry.submitter).to.eq(exampleExtraData.submitter) - expect(batchEntry.l1TransactionHash).to.eq( - exampleExtraData.l1TransactionHash - ) - - // Expected transaction entry results based on mainnet data - // Source: https://ethtx.info/mainnet/0x6effe006836b841205ace4d99d7ae1b74ee96aac499a3f358b97fccd32ee9af2 - const txEntries = output1.transactionEntries - expect(txEntries).to.have.length(101) - expect(txEntries.every((t) => t.queueOrigin === 'sequencer' || 'l1')).to - .be.true - - // Sequencer transactions are decoded, but l1 transactions are not - txEntries.forEach((tx, i) => { - if (tx.queueOrigin === 'l1') { - expect(tx.decoded).to.be.null - } else { - const l2Tx = blocksOnL2[i].transactions[0] - expect(tx.decoded.data).to.equal(l2Tx.data) - expect(tx.decoded.target).to.equal(l2Tx.to.toLowerCase()) - expect(tx.decoded.nonce).to.equal(l2Tx.nonce) - expect(tx.decoded.gasLimit).to.equal( - BigNumber.from(l2Tx.gasLimit.hex).toNumber() - ) - expect(tx.decoded.gasPrice).to.equal( - BigNumber.from(l2Tx.gasPrice.hex).toNumber() - ) - } - }) - }) it('should error on malformed transaction data', async () => { const input1: [any, SequencerBatchAppendedExtraData] = [ From 7554d80484aa3ad74d95acbff1005917c5a00956 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 10 May 2021 14:45:57 -0700 Subject: [PATCH 58/81] Version Packages (#815) Co-authored-by: github-actions[bot] --- .changeset/beige-keys-hammer.md | 5 ----- .changeset/blue-needles-clap.md | 5 ----- .changeset/brown-bananas-deny.md | 5 ----- .changeset/chilly-grapes-greet.md | 5 ----- .changeset/curly-pumas-wait.md | 5 ----- .changeset/early-hats-sell.md | 6 ------ .changeset/eight-beers-prove.md | 6 ------ .changeset/fuzzy-gorillas-accept.md | 7 ------- .changeset/good-poets-march.md | 5 ----- .changeset/great-clouds-call.md | 5 ----- .changeset/grumpy-bananas-brush.md | 5 ----- .changeset/kind-bears-think.md | 5 ----- .changeset/kind-plants-tickle.md | 5 ----- .changeset/light-needles-brush.md | 5 ----- .changeset/mean-comics-rush.md | 6 ------ .changeset/nasty-bees-remain.md | 5 ----- .changeset/old-cycles-invite.md | 5 ----- .changeset/pink-buttons-hang.md | 5 ----- .changeset/sharp-flowers-fail.md | 5 ----- .changeset/six-ties-invent.md | 10 ---------- .changeset/sour-onions-burn.md | 5 ----- .changeset/ten-keys-share.md | 5 ----- .changeset/tender-rings-deliver.md | 5 ----- .changeset/thirty-radios-sniff.md | 5 ----- .changeset/tough-lamps-hammer.md | 5 ----- .changeset/violet-comics-reflect.md | 5 ----- .changeset/weak-suits-burn.md | 5 ----- examples/hardhat/package.json | 2 +- integration-tests/CHANGELOG.md | 9 +++++++++ integration-tests/package.json | 8 ++++---- l2geth/CHANGELOG.md | 23 ++++++++++++++++++++++ l2geth/package.json | 2 +- packages/batch-submitter/CHANGELOG.md | 20 +++++++++++++++++++ packages/batch-submitter/package.json | 6 +++--- packages/contracts/CHANGELOG.md | 17 ++++++++++++++++ packages/contracts/package.json | 6 +++--- packages/core-utils/CHANGELOG.md | 6 ++++++ packages/core-utils/package.json | 2 +- packages/data-transport-layer/CHANGELOG.md | 23 ++++++++++++++++++++++ packages/data-transport-layer/package.json | 6 +++--- packages/hardhat-ovm/CHANGELOG.md | 6 ++++++ packages/hardhat-ovm/package.json | 2 +- packages/message-relayer/CHANGELOG.md | 20 +++++++++++++++++++ packages/message-relayer/package.json | 6 +++--- 44 files changed, 144 insertions(+), 165 deletions(-) delete mode 100644 .changeset/beige-keys-hammer.md delete mode 100644 .changeset/blue-needles-clap.md delete mode 100644 .changeset/brown-bananas-deny.md delete mode 100644 .changeset/chilly-grapes-greet.md delete mode 100644 .changeset/curly-pumas-wait.md delete mode 100644 .changeset/early-hats-sell.md delete mode 100644 .changeset/eight-beers-prove.md delete mode 100644 .changeset/fuzzy-gorillas-accept.md delete mode 100644 .changeset/good-poets-march.md delete mode 100644 .changeset/great-clouds-call.md delete mode 100644 .changeset/grumpy-bananas-brush.md delete mode 100644 .changeset/kind-bears-think.md delete mode 100644 .changeset/kind-plants-tickle.md delete mode 100644 .changeset/light-needles-brush.md delete mode 100644 .changeset/mean-comics-rush.md delete mode 100644 .changeset/nasty-bees-remain.md delete mode 100644 .changeset/old-cycles-invite.md delete mode 100644 .changeset/pink-buttons-hang.md delete mode 100644 .changeset/sharp-flowers-fail.md delete mode 100644 .changeset/six-ties-invent.md delete mode 100644 .changeset/sour-onions-burn.md delete mode 100644 .changeset/ten-keys-share.md delete mode 100644 .changeset/tender-rings-deliver.md delete mode 100644 .changeset/thirty-radios-sniff.md delete mode 100644 .changeset/tough-lamps-hammer.md delete mode 100644 .changeset/violet-comics-reflect.md delete mode 100644 .changeset/weak-suits-burn.md diff --git a/.changeset/beige-keys-hammer.md b/.changeset/beige-keys-hammer.md deleted file mode 100644 index c7f737b878627..0000000000000 --- a/.changeset/beige-keys-hammer.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@eth-optimism/data-transport-layer": patch ---- - -Parse and index the value field in the data transport layer diff --git a/.changeset/blue-needles-clap.md b/.changeset/blue-needles-clap.md deleted file mode 100644 index fccbfa51e50c8..0000000000000 --- a/.changeset/blue-needles-clap.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@eth-optimism/data-transport-layer": patch ---- - -Account for the off by one with regards to the l2geth block number and the CTC index diff --git a/.changeset/brown-bananas-deny.md b/.changeset/brown-bananas-deny.md deleted file mode 100644 index 0f8c2ca18e103..0000000000000 --- a/.changeset/brown-bananas-deny.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@eth-optimism/l2geth": patch ---- - -Add value parsing to the rollup client diff --git a/.changeset/chilly-grapes-greet.md b/.changeset/chilly-grapes-greet.md deleted file mode 100644 index 71ca9dbc8974d..0000000000000 --- a/.changeset/chilly-grapes-greet.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@eth-optimism/l2geth": patch ---- - -Removes the extra setting of the txmeta in the syncservice and instead sets the raw tx in the txmeta at the rpc layer diff --git a/.changeset/curly-pumas-wait.md b/.changeset/curly-pumas-wait.md deleted file mode 100644 index 897732aaa67cc..0000000000000 --- a/.changeset/curly-pumas-wait.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@eth-optimism/l2geth': patch ---- - -Fill in the raw transaction into the txmeta in the `eth_sendTransaction` codepath diff --git a/.changeset/early-hats-sell.md b/.changeset/early-hats-sell.md deleted file mode 100644 index 9dc4ac0b0247f..0000000000000 --- a/.changeset/early-hats-sell.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@eth-optimism/integration-tests': patch -'@eth-optimism/l2geth': patch ---- - -Add support for parsed revert reasons in DoEstimateGas diff --git a/.changeset/eight-beers-prove.md b/.changeset/eight-beers-prove.md deleted file mode 100644 index c6d68aec6c29c..0000000000000 --- a/.changeset/eight-beers-prove.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"@eth-optimism/integration-tests": patch -"@eth-optimism/l2geth": patch ---- - -Update minimum response from estimate gas diff --git a/.changeset/fuzzy-gorillas-accept.md b/.changeset/fuzzy-gorillas-accept.md deleted file mode 100644 index 3bede02b3aaf2..0000000000000 --- a/.changeset/fuzzy-gorillas-accept.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -"@eth-optimism/integration-tests": patch -"@eth-optimism/l2geth": patch -"@eth-optimism/contracts": patch ---- - -Add value transfer support to ECDSAContractAccount diff --git a/.changeset/good-poets-march.md b/.changeset/good-poets-march.md deleted file mode 100644 index 9473af129b13e..0000000000000 --- a/.changeset/good-poets-march.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@eth-optimism/l2geth': patch ---- - -Ignore the deprecated type field in the API diff --git a/.changeset/great-clouds-call.md b/.changeset/great-clouds-call.md deleted file mode 100644 index 2afa4f4c80322..0000000000000 --- a/.changeset/great-clouds-call.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@eth-optimism/l2geth": patch ---- - -Return bytes from both ExecutionManager.run and ExecutionManager.simulateMessage and be sure to properly ABI decode the return values and the nested (bool, returndata) diff --git a/.changeset/grumpy-bananas-brush.md b/.changeset/grumpy-bananas-brush.md deleted file mode 100644 index d0ce1dfe421d5..0000000000000 --- a/.changeset/grumpy-bananas-brush.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@eth-optimism/data-transport-layer": patch ---- - -Remove legacy transaction deserialization to support RLP batch encoding diff --git a/.changeset/kind-bears-think.md b/.changeset/kind-bears-think.md deleted file mode 100644 index 6c23951cc055d..0000000000000 --- a/.changeset/kind-bears-think.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@eth-optimism/contracts': patch ---- - -Move various dependencies from primary deps to dev deps diff --git a/.changeset/kind-plants-tickle.md b/.changeset/kind-plants-tickle.md deleted file mode 100644 index 818beff88b520..0000000000000 --- a/.changeset/kind-plants-tickle.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@eth-optimism/l2geth': patch ---- - -Block access to RPCs related to signing transactions diff --git a/.changeset/light-needles-brush.md b/.changeset/light-needles-brush.md deleted file mode 100644 index 8e66a47dbb77b..0000000000000 --- a/.changeset/light-needles-brush.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@eth-optimism/integration-tests': patch ---- - -Update expected gas prices based on minimum of 21k value diff --git a/.changeset/mean-comics-rush.md b/.changeset/mean-comics-rush.md deleted file mode 100644 index c255f1fec8f16..0000000000000 --- a/.changeset/mean-comics-rush.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"@eth-optimism/l2geth": patch -"@eth-optimism/contracts": patch ---- - -Add ExecutionManager return data & RLP encoding diff --git a/.changeset/nasty-bees-remain.md b/.changeset/nasty-bees-remain.md deleted file mode 100644 index 74cc671ad9213..0000000000000 --- a/.changeset/nasty-bees-remain.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@eth-optimism/message-relayer': patch ---- - -Add a check for `OVM_L2MessageRelayer` in the AddressManager before attempting to relay messages to help surface errors more quickly diff --git a/.changeset/old-cycles-invite.md b/.changeset/old-cycles-invite.md deleted file mode 100644 index d05596e7bedf7..0000000000000 --- a/.changeset/old-cycles-invite.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@eth-optimism/contracts": patch ---- - -Makes ProxyEOA compatible with EIP1967, not backwards compatible since the storage slot changes. diff --git a/.changeset/pink-buttons-hang.md b/.changeset/pink-buttons-hang.md deleted file mode 100644 index 809d21409cd2f..0000000000000 --- a/.changeset/pink-buttons-hang.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@eth-optimism/batch-submitter': patch ---- - -Add the support for different sequencer & proposer keys in the batch submitter. diff --git a/.changeset/sharp-flowers-fail.md b/.changeset/sharp-flowers-fail.md deleted file mode 100644 index ebc8482578a8a..0000000000000 --- a/.changeset/sharp-flowers-fail.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@eth-optimism/l2geth": patch ---- - -Update gas related things in the RPC to allow transactions with high gas limits and prevent gas estimations from being too small diff --git a/.changeset/six-ties-invent.md b/.changeset/six-ties-invent.md deleted file mode 100644 index 95cf982039726..0000000000000 --- a/.changeset/six-ties-invent.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -'@eth-optimism/l2geth': minor -'@eth-optimism/contracts': minor -'@eth-optimism/data-transport-layer': minor -'@eth-optimism/batch-submitter': minor -'@eth-optimism/hardhat-ovm': minor -'@eth-optimism/message-relayer': minor ---- - -Updates to use RLP encoded transactions in batches for the `v0.3.0` release diff --git a/.changeset/sour-onions-burn.md b/.changeset/sour-onions-burn.md deleted file mode 100644 index 6c202ac41998a..0000000000000 --- a/.changeset/sour-onions-burn.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@eth-optimism/l2geth': patch ---- - -Update `scripts/start.sh` to parse the websocket port and pass to geth at runtime diff --git a/.changeset/ten-keys-share.md b/.changeset/ten-keys-share.md deleted file mode 100644 index 05727782102ed..0000000000000 --- a/.changeset/ten-keys-share.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@eth-optimism/l2geth": patch ---- - -Remove the OVMSigner diff --git a/.changeset/tender-rings-deliver.md b/.changeset/tender-rings-deliver.md deleted file mode 100644 index cd2d9b95bb19d..0000000000000 --- a/.changeset/tender-rings-deliver.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@eth-optimism/contracts': patch ---- - -Set L2MessageRelayer name to L1MultiMessageRelayer when deploying to mainnet diff --git a/.changeset/thirty-radios-sniff.md b/.changeset/thirty-radios-sniff.md deleted file mode 100644 index 3340bc37e2366..0000000000000 --- a/.changeset/thirty-radios-sniff.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@eth-optimism/l2geth": patch ---- - -Prevent 0 value transactions with calldata via RPC diff --git a/.changeset/tough-lamps-hammer.md b/.changeset/tough-lamps-hammer.md deleted file mode 100644 index 204262b71f8ff..0000000000000 --- a/.changeset/tough-lamps-hammer.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@eth-optimism/core-utils": patch ---- - -Update toRpcHexString to accept ethers.BigNumber and add tests diff --git a/.changeset/violet-comics-reflect.md b/.changeset/violet-comics-reflect.md deleted file mode 100644 index 8f52dda5c2b98..0000000000000 --- a/.changeset/violet-comics-reflect.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@eth-optimism/data-transport-layer': patch ---- - -Prevent access of null value in L1 transaction deserialization diff --git a/.changeset/weak-suits-burn.md b/.changeset/weak-suits-burn.md deleted file mode 100644 index 77d40acef164a..0000000000000 --- a/.changeset/weak-suits-burn.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@eth-optimism/contracts": patch ---- - -Update ABI of simulateMessage to match run diff --git a/examples/hardhat/package.json b/examples/hardhat/package.json index 46f29693641ae..e398dd84f1cb9 100644 --- a/examples/hardhat/package.json +++ b/examples/hardhat/package.json @@ -14,7 +14,7 @@ "clean": "rimraf ./cache-ovm ./cache ./artifacts-ovm ./artifacts ./deployments" }, "devDependencies": { - "@eth-optimism/hardhat-ovm": "^0.1.0", + "@eth-optimism/hardhat-ovm": "^0.2.0", "@nomiclabs/hardhat-ethers": "^2.0.1", "@nomiclabs/hardhat-waffle": "^2.0.1", "@types/chai": "4.2.17", diff --git a/integration-tests/CHANGELOG.md b/integration-tests/CHANGELOG.md index d8e4f1c2f36b3..43efc633ba15d 100644 --- a/integration-tests/CHANGELOG.md +++ b/integration-tests/CHANGELOG.md @@ -1,5 +1,14 @@ # @eth-optimism/integration-tests +## 0.0.4 + +### Patch Changes + +- b799caa: Add support for parsed revert reasons in DoEstimateGas +- b799caa: Update minimum response from estimate gas +- b799caa: Add value transfer support to ECDSAContractAccount +- b799caa: Update expected gas prices based on minimum of 21k value + ## 0.0.3 ### Patch Changes diff --git a/integration-tests/package.json b/integration-tests/package.json index 3293fe305aaa8..5a20d4b51f3ed 100644 --- a/integration-tests/package.json +++ b/integration-tests/package.json @@ -1,6 +1,6 @@ { "name": "@eth-optimism/integration-tests", - "version": "0.0.3", + "version": "0.0.4", "description": "[Optimism] Integration Tests", "private": true, "author": "Optimism PBC", @@ -16,9 +16,9 @@ "clean": "rimraf cache artifacts artifacts-ovm cache-ovm" }, "devDependencies": { - "@eth-optimism/contracts": "^0.2.9", - "@eth-optimism/core-utils": "^0.4.0", - "@eth-optimism/hardhat-ovm": "^0.1.1", + "@eth-optimism/contracts": "^0.3.0", + "@eth-optimism/core-utils": "^0.4.2", + "@eth-optimism/hardhat-ovm": "^0.2.0", "@ethersproject/providers": "^5.0.24", "@nomiclabs/hardhat-ethers": "^2.0.2", "@nomiclabs/hardhat-waffle": "^2.0.1", diff --git a/l2geth/CHANGELOG.md b/l2geth/CHANGELOG.md index 8d43374228f4c..548d1553c1e8c 100644 --- a/l2geth/CHANGELOG.md +++ b/l2geth/CHANGELOG.md @@ -1,5 +1,28 @@ # Changelog +## 0.3.0 + +### Minor Changes + +- b799caa: Updates to use RLP encoded transactions in batches for the `v0.3.0` release + +### Patch Changes + +- b799caa: Add value parsing to the rollup client +- b799caa: Removes the extra setting of the txmeta in the syncservice and instead sets the raw tx in the txmeta at the rpc layer +- b799caa: Fill in the raw transaction into the txmeta in the `eth_sendTransaction` codepath +- b799caa: Add support for parsed revert reasons in DoEstimateGas +- b799caa: Update minimum response from estimate gas +- b799caa: Add value transfer support to ECDSAContractAccount +- b799caa: Ignore the deprecated type field in the API +- b799caa: Return bytes from both ExecutionManager.run and ExecutionManager.simulateMessage and be sure to properly ABI decode the return values and the nested (bool, returndata) +- b799caa: Block access to RPCs related to signing transactions +- b799caa: Add ExecutionManager return data & RLP encoding +- b799caa: Update gas related things in the RPC to allow transactions with high gas limits and prevent gas estimations from being too small +- 9b7dd4b: Update `scripts/start.sh` to parse the websocket port and pass to geth at runtime +- b799caa: Remove the OVMSigner +- b799caa: Prevent 0 value transactions with calldata via RPC + ## 0.2.6 ### Patch Changes diff --git a/l2geth/package.json b/l2geth/package.json index 35d04a6d9ac1d..52dfaf8413c7d 100644 --- a/l2geth/package.json +++ b/l2geth/package.json @@ -1,6 +1,6 @@ { "name": "@eth-optimism/l2geth", - "version": "0.2.6", + "version": "0.3.0", "private": true, "devDependencies": {} } diff --git a/packages/batch-submitter/CHANGELOG.md b/packages/batch-submitter/CHANGELOG.md index c29aece5dcf75..54314fb4f7e93 100644 --- a/packages/batch-submitter/CHANGELOG.md +++ b/packages/batch-submitter/CHANGELOG.md @@ -1,5 +1,25 @@ # Changelog +## 0.3.0 + +### Minor Changes + +- b799caa: Updates to use RLP encoded transactions in batches for the `v0.3.0` release + +### Patch Changes + +- 751e2be: Add the support for different sequencer & proposer keys in the batch submitter. +- Updated dependencies [b799caa] +- Updated dependencies [6132e7a] +- Updated dependencies [b799caa] +- Updated dependencies [b799caa] +- Updated dependencies [b799caa] +- Updated dependencies [20747fd] +- Updated dependencies [b799caa] +- Updated dependencies [b799caa] + - @eth-optimism/contracts@0.3.0 + - @eth-optimism/core-utils@0.4.2 + ## 0.2.5 ### Patch Changes diff --git a/packages/batch-submitter/package.json b/packages/batch-submitter/package.json index 3cabbeec7d343..5ed68527cf993 100644 --- a/packages/batch-submitter/package.json +++ b/packages/batch-submitter/package.json @@ -1,6 +1,6 @@ { "name": "@eth-optimism/batch-submitter", - "version": "0.2.5", + "version": "0.3.0", "private": true, "description": "[Optimism] Batch submission for sequencer & aggregators", "main": "dist/index", @@ -32,8 +32,8 @@ }, "dependencies": { "@eth-optimism/common-ts": "^0.1.1", - "@eth-optimism/contracts": "^0.2.10", - "@eth-optimism/core-utils": "^0.4.1", + "@eth-optimism/contracts": "^0.3.0", + "@eth-optimism/core-utils": "^0.4.2", "@eth-optimism/ynatm": "^0.2.2", "@ethersproject/abstract-provider": "^5.0.5", "@ethersproject/providers": "^5.0.14", diff --git a/packages/contracts/CHANGELOG.md b/packages/contracts/CHANGELOG.md index 8f81ef078000c..d28292c38c67c 100644 --- a/packages/contracts/CHANGELOG.md +++ b/packages/contracts/CHANGELOG.md @@ -1,5 +1,22 @@ # Changelog +## 0.3.0 + +### Minor Changes + +- b799caa: Updates to use RLP encoded transactions in batches for the `v0.3.0` release + +### Patch Changes + +- b799caa: Add value transfer support to ECDSAContractAccount +- 6132e7a: Move various dependencies from primary deps to dev deps +- b799caa: Add ExecutionManager return data & RLP encoding +- b799caa: Makes ProxyEOA compatible with EIP1967, not backwards compatible since the storage slot changes. +- 20747fd: Set L2MessageRelayer name to L1MultiMessageRelayer when deploying to mainnet +- b799caa: Update ABI of simulateMessage to match run +- Updated dependencies [b799caa] + - @eth-optimism/core-utils@0.4.2 + ## 0.2.11 ### Patch Changes diff --git a/packages/contracts/package.json b/packages/contracts/package.json index 5b6b7451bd667..03212a89d9cd1 100644 --- a/packages/contracts/package.json +++ b/packages/contracts/package.json @@ -1,6 +1,6 @@ { "name": "@eth-optimism/contracts", - "version": "0.2.11", + "version": "0.3.0", "main": "dist/index", "files": [ "dist/**/*.js", @@ -45,14 +45,14 @@ "generate-markdown": "node scripts/generate-markdown.js" }, "dependencies": { - "@eth-optimism/core-utils": "^0.4.1", + "@eth-optimism/core-utils": "^0.4.2", "@ethersproject/abstract-provider": "^5.0.8", "@ethersproject/contracts": "^5.0.5", "glob": "^7.1.6" }, "devDependencies": { "@codechecks/client": "0.1.10-beta", - "@eth-optimism/hardhat-ovm": "^0.1.2", + "@eth-optimism/hardhat-ovm": "^0.2.0", "@eth-optimism/smock": "^1.1.3", "@nomiclabs/hardhat-ethers": "^2.0.1", "@nomiclabs/hardhat-waffle": "^2.0.1", diff --git a/packages/core-utils/CHANGELOG.md b/packages/core-utils/CHANGELOG.md index d717b0630bf05..3e7fff79c7acb 100644 --- a/packages/core-utils/CHANGELOG.md +++ b/packages/core-utils/CHANGELOG.md @@ -1,5 +1,11 @@ # @eth-optimism/core-utils +## 0.4.2 + +### Patch Changes + +- b799caa: Update toRpcHexString to accept ethers.BigNumber and add tests + ## 0.4.1 ### Patch Changes diff --git a/packages/core-utils/package.json b/packages/core-utils/package.json index 111a3b70a8bf6..70d3beebcf959 100644 --- a/packages/core-utils/package.json +++ b/packages/core-utils/package.json @@ -1,6 +1,6 @@ { "name": "@eth-optimism/core-utils", - "version": "0.4.1", + "version": "0.4.2", "main": "dist/index", "files": [ "dist/*" diff --git a/packages/data-transport-layer/CHANGELOG.md b/packages/data-transport-layer/CHANGELOG.md index b57d817d21dcf..5eb2365cf5d8a 100644 --- a/packages/data-transport-layer/CHANGELOG.md +++ b/packages/data-transport-layer/CHANGELOG.md @@ -1,5 +1,28 @@ # data transport layer +## 0.3.0 + +### Minor Changes + +- b799caa: Updates to use RLP encoded transactions in batches for the `v0.3.0` release + +### Patch Changes + +- b799caa: Parse and index the value field in the data transport layer +- b799caa: Account for the off by one with regards to the l2geth block number and the CTC index +- b799caa: Remove legacy transaction deserialization to support RLP batch encoding +- b799caa: Prevent access of null value in L1 transaction deserialization +- Updated dependencies [b799caa] +- Updated dependencies [6132e7a] +- Updated dependencies [b799caa] +- Updated dependencies [b799caa] +- Updated dependencies [b799caa] +- Updated dependencies [20747fd] +- Updated dependencies [b799caa] +- Updated dependencies [b799caa] + - @eth-optimism/contracts@0.3.0 + - @eth-optimism/core-utils@0.4.2 + ## 0.2.5 ### Patch Changes diff --git a/packages/data-transport-layer/package.json b/packages/data-transport-layer/package.json index ae32e55f21246..1b59136fb5de1 100644 --- a/packages/data-transport-layer/package.json +++ b/packages/data-transport-layer/package.json @@ -1,6 +1,6 @@ { "name": "@eth-optimism/data-transport-layer", - "version": "0.2.5", + "version": "0.3.0", "private": true, "main": "dist/index", "files": [ @@ -20,8 +20,8 @@ }, "dependencies": { "@eth-optimism/common-ts": "^0.1.1", - "@eth-optimism/contracts": "^0.2.10", - "@eth-optimism/core-utils": "^0.4.1", + "@eth-optimism/contracts": "^0.3.0", + "@eth-optimism/core-utils": "^0.4.2", "@ethersproject/providers": "^5.0.21", "@sentry/node": "^6.3.1", "@sentry/tracing": "^6.3.1", diff --git a/packages/hardhat-ovm/CHANGELOG.md b/packages/hardhat-ovm/CHANGELOG.md index f85b74d4102e1..7a47b03d2321c 100644 --- a/packages/hardhat-ovm/CHANGELOG.md +++ b/packages/hardhat-ovm/CHANGELOG.md @@ -1,5 +1,11 @@ # @eth-optimism/hardhat-ovm +## 0.2.0 + +### Minor Changes + +- b799caa: Updates to use RLP encoded transactions in batches for the `v0.3.0` release + ## 0.1.2 ### Patch Changes diff --git a/packages/hardhat-ovm/package.json b/packages/hardhat-ovm/package.json index c3184b3b2f250..17649420df811 100644 --- a/packages/hardhat-ovm/package.json +++ b/packages/hardhat-ovm/package.json @@ -1,6 +1,6 @@ { "name": "@eth-optimism/hardhat-ovm", - "version": "0.1.2", + "version": "0.2.0", "main": "dist/index", "types": "dist/index", "files": [ diff --git a/packages/message-relayer/CHANGELOG.md b/packages/message-relayer/CHANGELOG.md index 2bb5548d659ca..1c9b6af006eb0 100644 --- a/packages/message-relayer/CHANGELOG.md +++ b/packages/message-relayer/CHANGELOG.md @@ -1,5 +1,25 @@ # @eth-optimism/message-relayer +## 0.1.0 + +### Minor Changes + +- b799caa: Updates to use RLP encoded transactions in batches for the `v0.3.0` release + +### Patch Changes + +- 33fcd84: Add a check for `OVM_L2MessageRelayer` in the AddressManager before attempting to relay messages to help surface errors more quickly +- Updated dependencies [b799caa] +- Updated dependencies [6132e7a] +- Updated dependencies [b799caa] +- Updated dependencies [b799caa] +- Updated dependencies [b799caa] +- Updated dependencies [20747fd] +- Updated dependencies [b799caa] +- Updated dependencies [b799caa] + - @eth-optimism/contracts@0.3.0 + - @eth-optimism/core-utils@0.4.2 + ## 0.0.5 ### Patch Changes diff --git a/packages/message-relayer/package.json b/packages/message-relayer/package.json index 9d83f40cd9495..6dd79116e03b5 100644 --- a/packages/message-relayer/package.json +++ b/packages/message-relayer/package.json @@ -1,6 +1,6 @@ { "name": "@eth-optimism/message-relayer", - "version": "0.0.5", + "version": "0.1.0", "private": true, "description": "[Optimism] Cross Domain Message Relayer service", "main": "dist/index", @@ -30,8 +30,8 @@ }, "dependencies": { "@eth-optimism/common-ts": "^0.1.0", - "@eth-optimism/contracts": "^0.2.9", - "@eth-optimism/core-utils": "^0.4.0", + "@eth-optimism/contracts": "^0.3.0", + "@eth-optimism/core-utils": "^0.4.2", "dotenv": "^8.2.0", "ethers": "^5.1.0", "google-spreadsheet": "^3.1.15", From d723b2a1e341e70a5ef39040db360bb68cf6d026 Mon Sep 17 00:00:00 2001 From: Mark Tyneway Date: Mon, 10 May 2021 15:32:06 -0700 Subject: [PATCH 59/81] relayer: logging cleanup (#807) * relayer: don't log options at startup * chore: add changeset * relayer: log specifc config options --- .changeset/soft-bikes-sing.md | 5 +++++ packages/message-relayer/src/service.ts | 9 ++++++++- 2 files changed, 13 insertions(+), 1 deletion(-) create mode 100644 .changeset/soft-bikes-sing.md diff --git a/.changeset/soft-bikes-sing.md b/.changeset/soft-bikes-sing.md new file mode 100644 index 0000000000000..edf6402e87444 --- /dev/null +++ b/.changeset/soft-bikes-sing.md @@ -0,0 +1,5 @@ +--- +'@eth-optimism/message-relayer': patch +--- + +Don't log the config options at startup because it contains secrets diff --git a/packages/message-relayer/src/service.ts b/packages/message-relayer/src/service.ts index 18fbff994da96..497a222563a3c 100644 --- a/packages/message-relayer/src/service.ts +++ b/packages/message-relayer/src/service.ts @@ -78,7 +78,14 @@ export class MessageRelayerService extends BaseService { } protected async _init(): Promise { - this.logger.info('Initializing message relayer', { options: this.options }) + this.logger.info('Initializing message relayer', { + relayGasLimit: this.options.relayGasLimit, + fromL2TransactionIndex: this.options.fromL2TransactionIndex, + pollingInterval: this.options.pollingInterval, + l2BlockOffset: this.options.l2BlockOffset, + getLogsInterval: this.options.getLogsInterval, + spreadSheetMode: this.options.spreadsheetMode, + }) // Need to improve this, sorry. this.state = {} as any From aedf9310dc3de8359eb6df0bd7685a43c43f80e7 Mon Sep 17 00:00:00 2001 From: Mark Tyneway Date: Mon, 10 May 2021 15:55:54 -0700 Subject: [PATCH 60/81] config: message relayer (#809) * relayer: migrate towards prefixed config w/ backwards compat * chore: update relayer config parsing * env: use start-offset instead of block offset * lint: fix * deps: add bcfg * message-relayer: cleaner config parsing * lint: fix --- .changeset/cuddly-beans-brake.md | 5 ++ packages/message-relayer/package.json | 1 + packages/message-relayer/src/exec/run.ts | 95 +++++++++++++++++------- 3 files changed, 75 insertions(+), 26 deletions(-) create mode 100644 .changeset/cuddly-beans-brake.md diff --git a/.changeset/cuddly-beans-brake.md b/.changeset/cuddly-beans-brake.md new file mode 100644 index 0000000000000..6c24045799046 --- /dev/null +++ b/.changeset/cuddly-beans-brake.md @@ -0,0 +1,5 @@ +--- +'@eth-optimism/message-relayer': patch +--- + +Add updated config parsing in a backwards compatible way diff --git a/packages/message-relayer/package.json b/packages/message-relayer/package.json index 6dd79116e03b5..de6693b1d7bc8 100644 --- a/packages/message-relayer/package.json +++ b/packages/message-relayer/package.json @@ -30,6 +30,7 @@ }, "dependencies": { "@eth-optimism/common-ts": "^0.1.0", + "bcfg": "^0.1.6", "@eth-optimism/contracts": "^0.3.0", "@eth-optimism/core-utils": "^0.4.2", "dotenv": "^8.2.0", diff --git a/packages/message-relayer/src/exec/run.ts b/packages/message-relayer/src/exec/run.ts index 0e27da75eee6b..50ff1a72c12ff 100644 --- a/packages/message-relayer/src/exec/run.ts +++ b/packages/message-relayer/src/exec/run.ts @@ -1,30 +1,73 @@ import { Wallet, providers } from 'ethers' import { MessageRelayerService } from '../service' import SpreadSheet from '../spreadsheet' -import { config } from 'dotenv' -config() +import * as dotenv from 'dotenv' +import Config from 'bcfg' -const env = process.env -const L2_NODE_WEB3_URL = env.L2_NODE_WEB3_URL -const L1_NODE_WEB3_URL = env.L1_NODE_WEB3_URL -const ADDRESS_MANAGER_ADDRESS = env.ADDRESS_MANAGER_ADDRESS -const L1_WALLET_KEY = env.L1_WALLET_KEY -const MNEMONIC = env.MNEMONIC -const HD_PATH = env.HD_PATH -const RELAY_GAS_LIMIT = env.RELAY_GAS_LIMIT || '4000000' -const POLLING_INTERVAL = env.POLLING_INTERVAL || '5000' -const GET_LOGS_INTERVAL = env.GET_LOGS_INTERVAL || '2000' -const L2_BLOCK_OFFSET = env.L2_BLOCK_OFFSET || '1' -const L1_START_OFFSET = env.L1_BLOCK_OFFSET || '1' -const FROM_L2_TRANSACTION_INDEX = env.FROM_L2_TRANSACTION_INDEX || '0' +interface Bcfg { + load: (options: { env?: boolean; argv?: boolean }) => void + str: (name: string, defaultValue?: string) => string + uint: (name: string, defaultValue?: number) => number + bool: (name: string, defaultValue?: boolean) => boolean + ufloat: (name: string, defaultValue?: number) => number +} -// Spreadsheet configuration -const SPREADSHEET_MODE = env.SPREADSHEET_MODE || '' -const SHEET_ID = env.SHEET_ID || '' -const CLIENT_EMAIL = env.CLIENT_EMAIL || '' -const CLIENT_PRIVATE_KEY = env.CLIENT_PRIVATE_KEY || '' +dotenv.config() const main = async () => { + const config: Bcfg = new Config('message-relayer') + config.load({ + env: true, + argv: true, + }) + + const env = process.env + const L2_NODE_WEB3_URL = config.str('l2-node-web3-url', env.L2_NODE_WEB3_URL) + const L1_NODE_WEB3_URL = config.str('l1-node-web3-url', env.L1_NODE_WEB3_URL) + const ADDRESS_MANAGER_ADDRESS = config.str( + 'address-manager-address', + env.ADDRESS_MANAGER_ADDRESS + ) + const L1_WALLET_KEY = config.str('l1-wallet-key', env.L1_WALLET_KEY) + const MNEMONIC = config.str('mnemonic', env.MNEMONIC) + const HD_PATH = config.str('hd-path', env.HD_PATH) + const RELAY_GAS_LIMIT = config.uint( + 'relay-gas-limit', + parseInt(env.RELAY_GAS_LIMIT, 10) || 4000000 + ) + const POLLING_INTERVAL = config.uint( + 'polling-interval', + parseInt(env.POLLING_INTERVAL, 10) || 5000 + ) + const GET_LOGS_INTERVAL = config.uint( + 'get-logs-interval', + parseInt(env.GET_LOGS_INTERVAL, 10) || 2000 + ) + const L2_BLOCK_OFFSET = config.uint( + 'l2-start-offset', + parseInt(env.L2_BLOCK_OFFSET, 10) || 1 + ) + const L1_START_OFFSET = config.uint( + 'l1-start-offset', + parseInt(env.L1_BLOCK_OFFSET, 10) || 1 + ) + const FROM_L2_TRANSACTION_INDEX = config.uint( + 'from-l2-transaction-index', + parseInt(env.FROM_L2_TRANSACTION_INDEX, 10) || 0 + ) + + // Spreadsheet configuration + const SPREADSHEET_MODE = config.bool( + 'spreadsheet-mode', + !!env.SPREADSHEET_MODE || false + ) + const SHEET_ID = config.str('sheet-id', env.SHEET_ID) + const CLIENT_EMAIL = config.str('client-email', env.CLIENT_EMAIL) + const CLIENT_PRIVATE_KEY = config.str( + 'client-private-key', + env.CLIENT_PRIVATE_KEY + ) + if (!ADDRESS_MANAGER_ADDRESS) { throw new Error('Must pass ADDRESS_MANAGER_ADDRESS') } @@ -69,12 +112,12 @@ const main = async () => { l2RpcProvider: l2Provider, addressManagerAddress: ADDRESS_MANAGER_ADDRESS, l1Wallet: wallet, - relayGasLimit: parseInt(RELAY_GAS_LIMIT, 10), - fromL2TransactionIndex: parseInt(FROM_L2_TRANSACTION_INDEX, 10), - pollingInterval: parseInt(POLLING_INTERVAL, 10), - l2BlockOffset: parseInt(L2_BLOCK_OFFSET, 10), - l1StartOffset: parseInt(L1_START_OFFSET, 10), - getLogsInterval: parseInt(GET_LOGS_INTERVAL, 10), + relayGasLimit: RELAY_GAS_LIMIT, + fromL2TransactionIndex: FROM_L2_TRANSACTION_INDEX, + pollingInterval: POLLING_INTERVAL, + l2BlockOffset: L2_BLOCK_OFFSET, + l1StartOffset: L1_START_OFFSET, + getLogsInterval: GET_LOGS_INTERVAL, spreadsheetMode: !!SPREADSHEET_MODE, spreadsheet, }) From 2479b4abbceef401308919b38470a0cf8a6b4df6 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 10 May 2021 17:13:41 -0700 Subject: [PATCH 61/81] Version Packages (#833) Co-authored-by: github-actions[bot] --- .changeset/cuddly-beans-brake.md | 5 ----- .changeset/soft-bikes-sing.md | 5 ----- packages/message-relayer/CHANGELOG.md | 7 +++++++ packages/message-relayer/package.json | 2 +- 4 files changed, 8 insertions(+), 11 deletions(-) delete mode 100644 .changeset/cuddly-beans-brake.md delete mode 100644 .changeset/soft-bikes-sing.md diff --git a/.changeset/cuddly-beans-brake.md b/.changeset/cuddly-beans-brake.md deleted file mode 100644 index 6c24045799046..0000000000000 --- a/.changeset/cuddly-beans-brake.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@eth-optimism/message-relayer': patch ---- - -Add updated config parsing in a backwards compatible way diff --git a/.changeset/soft-bikes-sing.md b/.changeset/soft-bikes-sing.md deleted file mode 100644 index edf6402e87444..0000000000000 --- a/.changeset/soft-bikes-sing.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@eth-optimism/message-relayer': patch ---- - -Don't log the config options at startup because it contains secrets diff --git a/packages/message-relayer/CHANGELOG.md b/packages/message-relayer/CHANGELOG.md index 1c9b6af006eb0..af28c41932d80 100644 --- a/packages/message-relayer/CHANGELOG.md +++ b/packages/message-relayer/CHANGELOG.md @@ -1,5 +1,12 @@ # @eth-optimism/message-relayer +## 0.1.1 + +### Patch Changes + +- aedf931: Add updated config parsing in a backwards compatible way +- d723b2a: Don't log the config options at startup because it contains secrets + ## 0.1.0 ### Minor Changes diff --git a/packages/message-relayer/package.json b/packages/message-relayer/package.json index de6693b1d7bc8..774c1c1692265 100644 --- a/packages/message-relayer/package.json +++ b/packages/message-relayer/package.json @@ -1,6 +1,6 @@ { "name": "@eth-optimism/message-relayer", - "version": "0.1.0", + "version": "0.1.1", "private": true, "description": "[Optimism] Cross Domain Message Relayer service", "main": "dist/index", From 92310636dbba7e05792cae34bb2b59403c0b2415 Mon Sep 17 00:00:00 2001 From: Mark Tyneway Date: Mon, 10 May 2021 19:07:02 -0700 Subject: [PATCH 62/81] fix: geth miner timestamp bug (#836) * l2geth: use correct timestamp protection * chore: add changeset --- .changeset/gorgeous-countries-listen.md | 5 +++++ l2geth/miner/worker.go | 5 ++--- 2 files changed, 7 insertions(+), 3 deletions(-) create mode 100644 .changeset/gorgeous-countries-listen.md diff --git a/.changeset/gorgeous-countries-listen.md b/.changeset/gorgeous-countries-listen.md new file mode 100644 index 0000000000000..f3b3fa25b8502 --- /dev/null +++ b/.changeset/gorgeous-countries-listen.md @@ -0,0 +1,5 @@ +--- +'@eth-optimism/l2geth': patch +--- + +Prevent montonicity errors in the miner diff --git a/l2geth/miner/worker.go b/l2geth/miner/worker.go index d152367f4d1e5..8221e5afa57d3 100644 --- a/l2geth/miner/worker.go +++ b/l2geth/miner/worker.go @@ -863,12 +863,11 @@ func (w *worker) commitNewTx(tx *types.Transaction) error { tstart := time.Now() parent := w.chain.CurrentBlock() - timestamp := tx.L1Timestamp() num := parent.Number() // Preserve liveliness as best as possible. Must panic on L1 to L2 // transactions as the timestamp cannot be malleated - if parent.Time() > timestamp { + if parent.Time() > tx.L1Timestamp() { log.Error("Monotonicity violation", "index", num) if tx.QueueOrigin().Uint64() == uint64(types.QueueOriginSequencer) { tx.SetL1Timestamp(parent.Time()) @@ -898,7 +897,7 @@ func (w *worker) commitNewTx(tx *types.Transaction) error { Number: num.Add(num, common.Big1), GasLimit: w.config.GasFloor, Extra: w.extra, - Time: timestamp, + Time: tx.L1Timestamp(), } if err := w.engine.Prepare(w.chain, header); err != nil { return fmt.Errorf("Failed to prepare header for mining: %w", err) From aa4f462029dfdac96c698505faef62d23b466582 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 10 May 2021 19:09:40 -0700 Subject: [PATCH 63/81] Version Packages (#837) Co-authored-by: github-actions[bot] --- .changeset/gorgeous-countries-listen.md | 5 ----- l2geth/CHANGELOG.md | 6 ++++++ l2geth/package.json | 2 +- 3 files changed, 7 insertions(+), 6 deletions(-) delete mode 100644 .changeset/gorgeous-countries-listen.md diff --git a/.changeset/gorgeous-countries-listen.md b/.changeset/gorgeous-countries-listen.md deleted file mode 100644 index f3b3fa25b8502..0000000000000 --- a/.changeset/gorgeous-countries-listen.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@eth-optimism/l2geth': patch ---- - -Prevent montonicity errors in the miner diff --git a/l2geth/CHANGELOG.md b/l2geth/CHANGELOG.md index 548d1553c1e8c..611acd82aa23f 100644 --- a/l2geth/CHANGELOG.md +++ b/l2geth/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +## 0.3.1 + +### Patch Changes + +- 9231063: Prevent montonicity errors in the miner + ## 0.3.0 ### Minor Changes diff --git a/l2geth/package.json b/l2geth/package.json index 52dfaf8413c7d..47f3fabf2b061 100644 --- a/l2geth/package.json +++ b/l2geth/package.json @@ -1,6 +1,6 @@ { "name": "@eth-optimism/l2geth", - "version": "0.3.0", + "version": "0.3.1", "private": true, "devDependencies": {} } From c949803faa7a0f3bc313c8c0ac5f3bdab731374e Mon Sep 17 00:00:00 2001 From: smartcontracts Date: Mon, 10 May 2021 23:12:52 -0400 Subject: [PATCH 64/81] style: require curly braces for if statements (#835) --- packages/common-ts/src/common/logger.ts | 4 +++- packages/hardhat-ovm/src/index.ts | 9 ++++++--- tslint.base.json | 3 ++- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/packages/common-ts/src/common/logger.ts b/packages/common-ts/src/common/logger.ts index 0c8c2b79c88c4..387521af3c5aa 100644 --- a/packages/common-ts/src/common/logger.ts +++ b/packages/common-ts/src/common/logger.ts @@ -41,7 +41,9 @@ export class Logger { }), }) } - if (options.streams) loggerStreams = loggerStreams.concat(options.streams) + if (options.streams) { + loggerStreams = loggerStreams.concat(options.streams) + } this.inner = pino(loggerOptions, pinoms.multistream(loggerStreams)) } diff --git a/packages/hardhat-ovm/src/index.ts b/packages/hardhat-ovm/src/index.ts index 3b95daec5f016..5fb17caf4c87d 100644 --- a/packages/hardhat-ovm/src/index.ts +++ b/packages/hardhat-ovm/src/index.ts @@ -47,8 +47,9 @@ const getOvmSolcPath = async (version: string): Promise => { const ovmCompilersCache = path.join(await getCompilersDir(), 'ovm') // Need to create the OVM compiler cache folder if it doesn't already exist. - if (!fs.existsSync(ovmCompilersCache)) - [fs.mkdirSync(ovmCompilersCache, { recursive: true })] + if (!fs.existsSync(ovmCompilersCache)) { + fs.mkdirSync(ovmCompilersCache, { recursive: true }) + } // Pull information about the latest commit in the solc-bin repo. We'll use this to invalidate // our compiler cache if necessary. @@ -186,7 +187,9 @@ subtask( } } - if (Object.keys(ovmInput.sources).length === 0) return {} + if (Object.keys(ovmInput.sources).length === 0) { + return {} + } // Build both inputs separately. const ovmOutput = await hre.run(TASK_COMPILE_SOLIDITY_RUN_SOLCJS, { diff --git a/tslint.base.json b/tslint.base.json index 350b4196a46ac..28bab7f8245b3 100644 --- a/tslint.base.json +++ b/tslint.base.json @@ -27,7 +27,8 @@ "variable-name": false, "no-focused-test": true, "array-type": false, - "prettier": [true, "./.prettierrc.json"] + "prettier": [true, "./.prettierrc.json"], + "curly": true }, "linterOptions": { "exclude": [ From 52d9e6b73362a203bdae3fa0182bd6e7c9693b13 Mon Sep 17 00:00:00 2001 From: ben-chain Date: Tue, 11 May 2021 03:17:49 -0700 Subject: [PATCH 65/81] test[integration-tests]: l2geth call and creation OOG (#839) --- integration-tests/test/rpc.spec.ts | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/integration-tests/test/rpc.spec.ts b/integration-tests/test/rpc.spec.ts index 66f3cfa23a5b7..b0e0a3222ffed 100644 --- a/integration-tests/test/rpc.spec.ts +++ b/integration-tests/test/rpc.spec.ts @@ -135,6 +135,15 @@ describe('Basic RPC tests', () => { expectedReverterRevertData = encodeSolidityRevertMessage(revertMessage) }) + it('should correctly identify call out-of-gas', async () => { + await expect( + provider.call({ + ...revertingTx, + gasLimit: 21_000, + }) + ).to.be.rejectedWith('out of gas') + }) + it('should correctly return solidity revert data from a call', async () => { const revertData = await provider.call(revertingTx) const expectedRevertData = encodeSolidityRevertMessage(revertMessage) @@ -151,6 +160,15 @@ describe('Basic RPC tests', () => { expect(revertData).to.eq(expectedReverterRevertData) }) + it('should correctly identify contract creation out of gas', async () => { + await expect( + provider.call({ + ...revertingDeployTx, + gasLimit: 30_000, + }) + ).to.be.rejectedWith('out of gas') + }) + it('should return the correct error message when attempting to deploy unsafe initcode', async () => { // PUSH1 0x00 PUSH1 0x00 SSTORE const unsafeCode = '0x6000600055' From 8d67991aba584c1703692ea46273ea8a1ef45f56 Mon Sep 17 00:00:00 2001 From: smartcontracts Date: Tue, 11 May 2021 22:38:00 -0400 Subject: [PATCH 66/81] fix: have workflows run on develop (#845) --- .github/workflows/geth.yml | 12 ++++++++---- .github/workflows/integration.yml | 4 +++- .github/workflows/ts-packages.yml | 4 +++- 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/.github/workflows/geth.yml b/.github/workflows/geth.yml index 2183ba5b6ecd2..89bc45068957b 100644 --- a/.github/workflows/geth.yml +++ b/.github/workflows/geth.yml @@ -4,16 +4,20 @@ name: geth unit tests on: push: paths: - - 'l2geth/**' + - 'l2geth/**' branches: - - master + - 'master' + - 'develop' - '*rc' + - 'regenesis/*' pull_request: paths: - - 'l2geth/**' + - 'l2geth/**' branches: - - master + - 'master' + - 'develop' - '*rc' + - 'regenesis/*' workflow_dispatch: defaults: diff --git a/.github/workflows/integration.yml b/.github/workflows/integration.yml index 4d3f6c8d36dd9..cf985e647563d 100644 --- a/.github/workflows/integration.yml +++ b/.github/workflows/integration.yml @@ -3,8 +3,10 @@ name: integration on: push: branches: - - master + - 'master' + - 'develop' - '*rc' + - 'regenesis/*' pull_request: workflow_dispatch: diff --git a/.github/workflows/ts-packages.yml b/.github/workflows/ts-packages.yml index 2239ea6bd3e38..a49eaf62b55c7 100644 --- a/.github/workflows/ts-packages.yml +++ b/.github/workflows/ts-packages.yml @@ -3,8 +3,10 @@ name: typescript / contracts on: push: branches: - - master + - 'master' + - 'develop' - '*rc' + - 'regenesis/*' pull_request: workflow_dispatch: From a30817e5bc3fc030633be63f977a6ad2397ebee9 Mon Sep 17 00:00:00 2001 From: platocrat <37757724+platocrat@users.noreply.github.com> Date: Tue, 11 May 2021 20:17:06 -0700 Subject: [PATCH 67/81] docs: add truffle example + ci (#666) * docs: add truffle example * fix: add gasPrice: 0 to all ctc calls and deploys * chore(truffle-example): use correct truffle command * fix: install missing packages * style: fix missing newlines * fix: attempt to fix yarn.lock (2) * Update integration.yml * specify truffle config and network * correctly specify path and version * relayer: logging cleanup (#807) * relayer: don't log options at startup * chore: add changeset * relayer: log specifc config options * config: message relayer (#809) * relayer: migrate towards prefixed config w/ backwards compat * chore: update relayer config parsing * env: use start-offset instead of block offset * lint: fix * deps: add bcfg * message-relayer: cleaner config parsing * lint: fix * Version Packages (#833) Co-authored-by: github-actions[bot] * fix: geth miner timestamp bug (#836) * l2geth: use correct timestamp protection * chore: add changeset * Version Packages (#837) Co-authored-by: github-actions[bot] * style: require curly braces for if statements (#835) * test[integration-tests]: l2geth call and creation OOG (#839) * fix: WE DID IT Co-authored-by: Georgios Konstantopoulos Co-authored-by: Kelvin Fichter Co-authored-by: Mark Tyneway Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: github-actions[bot] Co-authored-by: ben-chain --- .github/workflows/integration.yml | 15 + examples/truffle/.gitignore | 112 + examples/truffle/README.md | 3 + examples/truffle/contracts/ERC20.sol | 90 + examples/truffle/contracts/IERC20.sol | 53 + .../migrations/1_deploy_ERC20_contract.js | 17 + examples/truffle/package.json | 42 + examples/truffle/test/erc20.spec.js | 246 + examples/truffle/truffle-config-ovm.js | 34 + examples/truffle/truffle-config.js | 17 + yarn.lock | 6658 ++++++++++++++++- 11 files changed, 7052 insertions(+), 235 deletions(-) create mode 100644 examples/truffle/.gitignore create mode 100644 examples/truffle/README.md create mode 100644 examples/truffle/contracts/ERC20.sol create mode 100644 examples/truffle/contracts/IERC20.sol create mode 100644 examples/truffle/migrations/1_deploy_ERC20_contract.js create mode 100644 examples/truffle/package.json create mode 100644 examples/truffle/test/erc20.spec.js create mode 100644 examples/truffle/truffle-config-ovm.js create mode 100644 examples/truffle/truffle-config.js diff --git a/.github/workflows/integration.yml b/.github/workflows/integration.yml index cf985e647563d..bee88f31f89f5 100644 --- a/.github/workflows/integration.yml +++ b/.github/workflows/integration.yml @@ -62,8 +62,23 @@ jobs: run: | yarn compile yarn test:integration + - name: Test & deploy waffle-example on Optimism working-directory: ./examples/waffle run: | yarn compile:ovm yarn test:integration:ovm + + - name: Test & deploy truffle-example on truffle (regression) + working-directory: ./examples/truffle + run: | + yarn compile + yarn test:integration + yarn deploy + + - name: Test & deploy truffle-example on Optimism + working-directory: ./examples/truffle + run: | + yarn compile:ovm + yarn test:integration:ovm + yarn deploy:ovm diff --git a/examples/truffle/.gitignore b/examples/truffle/.gitignore new file mode 100644 index 0000000000000..9f9cc50acd92e --- /dev/null +++ b/examples/truffle/.gitignore @@ -0,0 +1,112 @@ +# Project specific +build +build-ovm + +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* + +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage +*.lcov + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# TypeScript v1 declaration files +typings/ + +# TypeScript cache +*.tsbuildinfo + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Microbundle cache +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variables file +.env +.env.test + +# parcel-bundler cache (https://parceljs.org/) +.cache + +# Next.js build output +.next + +# Nuxt.js build / generate output +.nuxt +dist + +# Gatsby files +.cache/ +# Comment in the public line in if your project uses Gatsby and *not* Next.js +# https://nextjs.org/blog/next-9-1#public-directory-support +# public + +# vuepress build output +.vuepress/dist + +# Serverless directories +.serverless/ + +# FuseBox cache +.fusebox/ + +# DynamoDB Local files +.dynamodb/ + +# TernJS port file +.tern-port + +.DS_Store + +build/ diff --git a/examples/truffle/README.md b/examples/truffle/README.md new file mode 100644 index 0000000000000..456b09acb3a6d --- /dev/null +++ b/examples/truffle/README.md @@ -0,0 +1,3 @@ +# Getting Started with Optimistic Ethereum: Simple ERC20 Token Truffle Tutorial + +### For the full README, please see the [guided repository, `Truffle-ER20-Example`](https://github.com/ethereum-optimism/Truffle-ERC20-Example) \ No newline at end of file diff --git a/examples/truffle/contracts/ERC20.sol b/examples/truffle/contracts/ERC20.sol new file mode 100644 index 0000000000000..dca01f264b983 --- /dev/null +++ b/examples/truffle/contracts/ERC20.sol @@ -0,0 +1,90 @@ +// SPDX-License-Identifier: MIT LICENSE +/* Implements ERC20 token standard: https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20.md */ +pragma solidity ^0.7.6; + +import "./IERC20.sol"; + +contract ERC20 is IERC20 { + uint256 private constant 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; + uint8 public decimals; + string public symbol; + uint256 public totalSupply; + + constructor( + uint256 _initialAmount, + string memory _tokenName, + uint8 _decimalUnits, + string memory _tokenSymbol + ) { + 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 + override + 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 override 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 + override + returns (uint256 balance) + { + return balances[_owner]; + } + + function approve(address _spender, uint256 _value) + public + override + 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 + override + returns (uint256 remaining) + { + return allowed[_owner][_spender]; + } +} diff --git a/examples/truffle/contracts/IERC20.sol b/examples/truffle/contracts/IERC20.sol new file mode 100644 index 0000000000000..111d6ebe2fa27 --- /dev/null +++ b/examples/truffle/contracts/IERC20.sol @@ -0,0 +1,53 @@ +// SPDX-License-Identifier: MIT LICENSE +// Abstract contract for the full ERC20 Token standard +// https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20.md +pragma solidity ^0.7.6; + +interface IERC20 { + /// @param _owner The address from which the balance will be retrieved + /// @return balance The balance + function balanceOf(address _owner) external view returns (uint256 balance); + + /// @notice send `_value` token to `_to` from `msg.sender` + /// @param _to The address of the recipient + /// @param _value The amount of token to be transferred + /// @return success Whether the transfer was successful or not + function transfer(address _to, uint256 _value) + external + returns (bool success); + + /// @notice send `_value` token to `_to` from `_from` on the condition it is approved by `_from` + /// @param _from The address of the sender + /// @param _to The address of the recipient + /// @param _value The amount of token to be transferred + /// @return success Whether the transfer was successful or not + function transferFrom( + address _from, + address _to, + uint256 _value + ) external returns (bool success); + + /// @notice `msg.sender` approves `_spender` to spend `_value` tokens + /// @param _spender The address of the account able to transfer the tokens + /// @param _value The amount of tokens to be approved for transfer + /// @return success Whether the approval was successful or not + function approve(address _spender, uint256 _value) + external + returns (bool success); + + /// @param _owner The address of the account owning tokens + /// @param _spender The address of the account able to transfer the tokens + /// @return remaining Amount of remaining tokens allowed to spent + function allowance(address _owner, address _spender) + external + view + returns (uint256 remaining); + + // solhint-disable-next-line no-simple-event-func-name + event Transfer(address indexed _from, address indexed _to, uint256 _value); + event Approval( + address indexed _owner, + address indexed _spender, + uint256 _value + ); +} diff --git a/examples/truffle/migrations/1_deploy_ERC20_contract.js b/examples/truffle/migrations/1_deploy_ERC20_contract.js new file mode 100644 index 0000000000000..346ebcab9346d --- /dev/null +++ b/examples/truffle/migrations/1_deploy_ERC20_contract.js @@ -0,0 +1,17 @@ +const ERC20 = artifacts.require('ERC20') + +module.exports = function (deployer, accounts) { + const tokenName = 'My Optimistic Coin' + const tokenSymbol = 'OPT' + const tokenDecimals = 1 + + // deployment steps + deployer.deploy( + ERC20, + 10000, + tokenName, + tokenDecimals, + tokenSymbol, + { gasPrice: 0 } + ) +} diff --git a/examples/truffle/package.json b/examples/truffle/package.json new file mode 100644 index 0000000000000..4579a04e9e47a --- /dev/null +++ b/examples/truffle/package.json @@ -0,0 +1,42 @@ +{ + "name": "@ethereum-optimism/Truffle-ERC20-Example", + "private": true, + "version": "1.0.0-alpha.1", + "description": "Example of using Optimistic Ethereum compiler & local Optimistic Ethereum nodes with Truffle to run a full ERC20 test suite", + "scripts": { + "clean": "rimraf build build-ovm", + "compile": "truffle compile", + "compile:ovm": "truffle compile --config truffle-config-ovm.js", + "test:integration": "truffle test", + "test:integration:ovm": "truffle test --network optimism --config truffle-config-ovm.js", + "deploy": "truffle migrate --network ethereum --config truffle-config", + "deploy:ovm": "truffle migrate --network optimism --config truffle-config-ovm.js" + }, + "keywords": [ + "optimism", + "rollup", + "optimistic", + "ethereum", + "truffle", + "ovm", + "example", + "ERC20", + "token" + ], + "homepage": "https://github.com/ethereum-optimism/Truffle-ERC20-Example#readme", + "license": "MIT", + "author": "Optimism PBC", + "repository": { + "type": "git", + "url": "https://github.com/ethereum-optimism/Truffle-ERC20-Example.git" + }, + "publishConfig": { + "access": "public" + }, + "dependencies": { + "@eth-optimism/solc": "0.7.6-alpha.1", + "rimraf": "^3.0.2", + "truffle": "^5.3.6", + "@truffle/hdwallet-provider": "^1.4.0" + } +} \ No newline at end of file diff --git a/examples/truffle/test/erc20.spec.js b/examples/truffle/test/erc20.spec.js new file mode 100644 index 0000000000000..4a8e284881b9d --- /dev/null +++ b/examples/truffle/test/erc20.spec.js @@ -0,0 +1,246 @@ +let token + +const ERC20 = artifacts.require('ERC20') + +contract('ERC20', (accounts) => { + const tokenName = 'My Optimistic Coin' + const tokenSymbol = 'OPT' + const tokenDecimals = 1 + + beforeEach(async () => { + token = await ERC20.new(10000, tokenName, tokenDecimals, tokenSymbol, { from: accounts[ 0 ], gasPrice: 0 }) + }) + + it('creation: should create an initial balance of 10000 for the creator', async () => { + const balance = await token.balanceOf.call(accounts[ 0 ], { + gasPrice: 0 + }) + assert.strictEqual(balance.toNumber(), 10000) + }) + + it('creation: test correct setting of vanity information', async () => { + const name = await token.name.call() + assert.strictEqual(name, tokenName) + + const decimals = await token.decimals.call() + assert.strictEqual(decimals.toNumber(), tokenDecimals) + + const symbol = await token.symbol.call() + assert.strictEqual(symbol, tokenSymbol) + }) + + it('creation: should succeed in creating over 2^256 - 1 (max) tokens', async () => { + // 2^256 - 1 + const token2 = await ERC20.new('115792089237316195423570985008687907853269984665640564039457584007913129639935', 'Simon Bucks', 1, 'SBX', { from: accounts[ 0 ], gasPrice: 0 }) + const totalSupply = await token2.totalSupply() + assert.strictEqual(totalSupply.toString(), '115792089237316195423570985008687907853269984665640564039457584007913129639935') + }) + + // TRANSERS + // normal transfers without approvals + it('transfers: ether transfer should be reversed.', async () => { + const balanceBefore = await token.balanceOf.call(accounts[ 0 ]) + assert.strictEqual(balanceBefore.toNumber(), 10000) + + let threw = false + try { + await web3.eth.sendTransaction({ from: accounts[ 0 ], to: token.address, value: web3.utils.toWei('10', 'Ether'), gasPrice: 0 }) + } catch (e) { + threw = true + } + assert.equal(threw, true) + + const balanceAfter = await token.balanceOf.call(accounts[ 0 ]) + assert.strictEqual(balanceAfter.toNumber(), 10000) + }) + + it('transfers: should transfer 10000 to accounts[1] with accounts[0] having 10000', async () => { + await token.transfer(accounts[ 1 ], 10000, { from: accounts[ 0 ], gasPrice: 0 }) + const balance = await token.balanceOf.call(accounts[ 1 ]) + assert.strictEqual(balance.toNumber(), 10000) + }) + + it('transfers: should fail when trying to transfer 10001 to accounts[1] with accounts[0] having 10000', async () => { + let threw = false + try { + await token.transfer.call(accounts[ 1 ], 10001, { from: accounts[ 0 ], gasPrice: 0 }) + } catch (e) { + threw = true + } + assert.equal(threw, true) + }) + + it('transfers: should handle zero-transfers normally', async () => { + assert(await token.transfer.call(accounts[ 1 ], 0, { from: accounts[ 0 ], gasPrice: 0 }), 'zero-transfer has failed') + }) + + // NOTE: testing uint256 wrapping is impossible since you can't supply > 2^256 -1 + // todo: transfer max amounts + + // APPROVALS + it('approvals: msg.sender should approve 100 to accounts[1]', async () => { + await token.approve(accounts[ 1 ], 100, { from: accounts[ 0 ], gasPrice: 0 }) + const allowance = await token.allowance.call(accounts[ 0 ], accounts[ 1 ]) + assert.strictEqual(allowance.toNumber(), 100) + }) + + // bit overkill. But is for testing a bug + it('approvals: msg.sender approves accounts[1] of 100 & withdraws 20 once.', async () => { + const balance0 = await token.balanceOf.call(accounts[ 0 ]) + assert.strictEqual(balance0.toNumber(), 10000) + + await token.approve(accounts[ 1 ], 100, { from: accounts[ 0 ], gasPrice: 0 }) // 100 + const balance2 = await token.balanceOf.call(accounts[ 2 ]) + assert.strictEqual(balance2.toNumber(), 0, 'balance2 not correct') + + await token.transferFrom.call(accounts[ 0 ], accounts[ 2 ], 20, { from: accounts[ 1 ], gasPrice: 0 }) + await token.allowance.call(accounts[ 0 ], accounts[ 1 ]) + await token.transferFrom(accounts[ 0 ], accounts[ 2 ], 20, { from: accounts[ 1 ], gasPrice: 0 }) // -20 + const allowance01 = await token.allowance.call(accounts[ 0 ], accounts[ 1 ]) + assert.strictEqual(allowance01.toNumber(), 80) // =80 + + const balance22 = await token.balanceOf.call(accounts[ 2 ]) + assert.strictEqual(balance22.toNumber(), 20) + + const balance02 = await token.balanceOf.call(accounts[ 0 ]) + assert.strictEqual(balance02.toNumber(), 9980) + }) + + // should approve 100 of msg.sender & withdraw 50, twice. (should succeed) + it('approvals: msg.sender approves accounts[1] of 100 & withdraws 20 twice.', async () => { + await token.approve(accounts[ 1 ], 100, { from: accounts[ 0 ], gasPrice: 0 }) + const allowance01 = await token.allowance.call(accounts[ 0 ], accounts[ 1 ]) + assert.strictEqual(allowance01.toNumber(), 100) + + await token.transferFrom(accounts[ 0 ], accounts[ 2 ], 20, { from: accounts[ 1 ], gasPrice: 0 }) + const allowance012 = await token.allowance.call(accounts[ 0 ], accounts[ 1 ]) + assert.strictEqual(allowance012.toNumber(), 80) + + const balance2 = await token.balanceOf.call(accounts[ 2 ]) + assert.strictEqual(balance2.toNumber(), 20) + + const balance0 = await token.balanceOf.call(accounts[ 0 ]) + assert.strictEqual(balance0.toNumber(), 9980) + + // FIRST tx done. + // onto next. + await token.transferFrom(accounts[ 0 ], accounts[ 2 ], 20, { from: accounts[ 1 ], gasPrice: 0 }) + const allowance013 = await token.allowance.call(accounts[ 0 ], accounts[ 1 ]) + assert.strictEqual(allowance013.toNumber(), 60) + + const balance22 = await token.balanceOf.call(accounts[ 2 ]) + assert.strictEqual(balance22.toNumber(), 40) + + const balance02 = await token.balanceOf.call(accounts[ 0 ]) + assert.strictEqual(balance02.toNumber(), 9960) + }) + + // should approve 100 of msg.sender & withdraw 50 & 60 (should fail). + it('approvals: msg.sender approves accounts[1] of 100 & withdraws 50 & 60 (2nd tx should fail)', async () => { + await token.approve(accounts[ 1 ], 100, { from: accounts[ 0 ], gasPrice: 0 }) + const allowance01 = await token.allowance.call(accounts[ 0 ], accounts[ 1 ]) + assert.strictEqual(allowance01.toNumber(), 100) + + await token.transferFrom(accounts[ 0 ], accounts[ 2 ], 50, { from: accounts[ 1 ], gasPrice: 0 }) + const allowance012 = await token.allowance.call(accounts[ 0 ], accounts[ 1 ]) + assert.strictEqual(allowance012.toNumber(), 50) + + const balance2 = await token.balanceOf.call(accounts[ 2 ]) + assert.strictEqual(balance2.toNumber(), 50) + + const balance0 = await token.balanceOf.call(accounts[ 0 ]) + assert.strictEqual(balance0.toNumber(), 9950) + + // FIRST tx done. + // onto next. + let threw = false + try { + await token.transferFrom.call(accounts[ 0 ], accounts[ 2 ], 60, { from: accounts[ 1 ], gasPrice: 0 }) + } catch (e) { + threw = true + } + assert.equal(threw, true) + }) + + it('approvals: attempt withdrawal from account with no allowance (should fail)', async () => { + let threw = false + try { + await token.transferFrom.call(accounts[ 0 ], accounts[ 2 ], 60, { from: accounts[ 1 ], gasPrice: 0 }) + } catch (e) { + threw = true + } + assert.equal(threw, true) + }) + + it('approvals: allow accounts[1] 100 to withdraw from accounts[0]. Withdraw 60 and then approve 0 & attempt transfer.', async () => { + await token.approve(accounts[ 1 ], 100, { from: accounts[ 0 ], gasPrice: 0 }) + await token.transferFrom(accounts[ 0 ], accounts[ 2 ], 60, { from: accounts[ 1 ], gasPrice: 0 }) + await token.approve(accounts[ 1 ], 0, { from: accounts[ 0 ], gasPrice: 0 }) + let threw = false + try { + await token.transferFrom.call(accounts[ 0 ], accounts[ 2 ], 10, { from: accounts[ 1 ], gasPrice: 0 }) + } catch (e) { + threw = true + } + assert.equal(threw, true) + }) + + it('approvals: approve max (2^256 - 1)', async () => { + await token.approve(accounts[ 1 ], '115792089237316195423570985008687907853269984665640564039457584007913129639935', { from: accounts[ 0 ], gasPrice: 0 }) + const allowance = await token.allowance(accounts[ 0 ], accounts[ 1 ]) + assert.strictEqual(allowance.toString(), '115792089237316195423570985008687907853269984665640564039457584007913129639935') + }) + + // should approve max of msg.sender & withdraw 20 without changing allowance (should succeed). + it('approvals: msg.sender approves accounts[1] of max (2^256 - 1) & withdraws 20', async () => { + const balance0 = await token.balanceOf.call(accounts[ 0 ]) + assert.strictEqual(balance0.toNumber(), 10000) + + const max = '115792089237316195423570985008687907853269984665640564039457584007913129639935' + await token.approve(accounts[ 1 ], max, { from: accounts[ 0 ], gasPrice: 0 }) + const balance2 = await token.balanceOf.call(accounts[ 2 ]) + assert.strictEqual(balance2.toNumber(), 0, 'balance2 not correct') + + await token.transferFrom(accounts[ 0 ], accounts[ 2 ], 20, { from: accounts[ 1 ], gasPrice: 0 }) + const allowance01 = await token.allowance.call(accounts[ 0 ], accounts[ 1 ]) + assert.strictEqual(allowance01.toString(), max) + + const balance22 = await token.balanceOf.call(accounts[ 2 ]) + assert.strictEqual(balance22.toNumber(), 20) + + const balance02 = await token.balanceOf.call(accounts[ 0 ]) + assert.strictEqual(balance02.toNumber(), 9980) + }) + + /* eslint-disable no-underscore-dangle */ + it('events: should fire Transfer event properly', async () => { + const res = await token.transfer(accounts[ 1 ], '2666', { from: accounts[ 0 ], gasPrice: 0 }) + const transferLog = res.logs.find( + element => element.event.match('Transfer') && + element.address.match(token.address) + ) + assert.strictEqual(transferLog.args._from, accounts[ 0 ]) + // L2 ETH transfer also emits a transfer event + assert.strictEqual(transferLog.args._to, accounts[ 1 ]) + assert.strictEqual(transferLog.args._value.toString(), '2666') + }) + + it('events: should fire Transfer event normally on a zero transfer', async () => { + const res = await token.transfer(accounts[ 1 ], '0', { from: accounts[ 0 ], gasPrice: 0 }) + const transferLog = res.logs.find( + element => element.event.match('Transfer') && + element.address.match(token.address) + ) + assert.strictEqual(transferLog.args._from, accounts[ 0 ]) + assert.strictEqual(transferLog.args._to, accounts[ 1 ]) + assert.strictEqual(transferLog.args._value.toString(), '0') + }) + + it('events: should fire Approval event properly', async () => { + const res = await token.approve(accounts[ 1 ], '2666', { from: accounts[ 0 ], gasPrice: 0 }) + const approvalLog = res.logs.find(element => element.event.match('Approval')) + assert.strictEqual(approvalLog.args._owner, accounts[ 0 ]) + assert.strictEqual(approvalLog.args._spender, accounts[ 1 ]) + assert.strictEqual(approvalLog.args._value.toString(), '2666') + }) +}) diff --git a/examples/truffle/truffle-config-ovm.js b/examples/truffle/truffle-config-ovm.js new file mode 100644 index 0000000000000..4009be5e7abf4 --- /dev/null +++ b/examples/truffle/truffle-config-ovm.js @@ -0,0 +1,34 @@ +const mnemonicPhrase = "candy maple cake sugar pudding cream honey rich smooth crumble sweet treat" +const HDWalletProvider = require('@truffle/hdwallet-provider') + +module.exports = { + contracts_build_directory: './build-ovm', + networks: { + optimism: { + provider: function () { + return new HDWalletProvider({ + mnemonic: { + phrase: mnemonicPhrase + }, + providerOrUrl: 'http://127.0.0.1:8545' + }) + }, + network_id: 420, + host: '127.0.0.1', + port: 8545, + gasPrice: 0, + } + }, + compilers: { + solc: { + // Add path to the optimism solc fork + version: '../../node_modules/@eth-optimism/solc', + settings: { + optimizer: { + enabled: true, + runs: 1 + }, + } + } + } +} \ No newline at end of file diff --git a/examples/truffle/truffle-config.js b/examples/truffle/truffle-config.js new file mode 100644 index 0000000000000..06820670cb40f --- /dev/null +++ b/examples/truffle/truffle-config.js @@ -0,0 +1,17 @@ +module.exports = { + contracts_build_directory: './build', + networks: { + ethereum: { + network_id: 31337, + host: '127.0.0.1', + port: 9545, + gasPrice: 0, + }, + }, + // Configure your compilers + compilers: { + solc: { + version: "0.7.6", // Fetch exact version from solc-bin (default: truffle's version) + } + } +} diff --git a/yarn.lock b/yarn.lock index 86175bedaf922..b961104a6d570 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,18 +2,283 @@ # yarn lockfile v1 -"@babel/code-frame@^7.0.0": +"101@^1.0.0", "101@^1.2.0": + version "1.6.3" + resolved "https://registry.yarnpkg.com/101/-/101-1.6.3.tgz#9071196e60c47e4ce327075cf49c0ad79bd822fd" + integrity sha512-4dmQ45yY0Dx24Qxp+zAsNLlMF6tteCyfVzgbulvSyC7tCyd3V8sW76sS0tHq8NpcbXfWTKasfyfzU1Kd86oKzw== + dependencies: + clone "^1.0.2" + deep-eql "^0.1.3" + keypather "^1.10.2" + +"@apollo/client@^3.1.5": + version "3.3.16" + resolved "https://registry.yarnpkg.com/@apollo/client/-/client-3.3.16.tgz#e4a51b0f86583b18ab81723660e381ef616536c1" + integrity sha512-EPTiNpmiU6/vvxpl4lXWQDqS3YddweC1sh/ewCuVP9IK0+xlVGb5vR1yhM/7T3PIJqwz52dGpZyJskmbTfENfQ== + dependencies: + "@graphql-typed-document-node/core" "^3.0.0" + "@types/zen-observable" "^0.8.0" + "@wry/context" "^0.6.0" + "@wry/equality" "^0.4.0" + fast-json-stable-stringify "^2.0.0" + graphql-tag "^2.12.0" + hoist-non-react-statics "^3.3.2" + optimism "^0.15.0" + prop-types "^15.7.2" + symbol-observable "^2.0.0" + ts-invariant "^0.7.0" + tslib "^1.10.0" + zen-observable "^0.8.14" + +"@apollo/protobufjs@1.2.2": + version "1.2.2" + resolved "https://registry.yarnpkg.com/@apollo/protobufjs/-/protobufjs-1.2.2.tgz#4bd92cd7701ccaef6d517cdb75af2755f049f87c" + integrity sha512-vF+zxhPiLtkwxONs6YanSt1EpwpGilThpneExUN5K3tCymuxNnVq2yojTvnpRjv2QfsEIt/n7ozPIIzBLwGIDQ== + dependencies: + "@protobufjs/aspromise" "^1.1.2" + "@protobufjs/base64" "^1.1.2" + "@protobufjs/codegen" "^2.0.4" + "@protobufjs/eventemitter" "^1.1.0" + "@protobufjs/fetch" "^1.1.0" + "@protobufjs/float" "^1.0.2" + "@protobufjs/inquire" "^1.1.0" + "@protobufjs/path" "^1.1.2" + "@protobufjs/pool" "^1.1.0" + "@protobufjs/utf8" "^1.1.0" + "@types/long" "^4.0.0" + "@types/node" "^10.1.0" + long "^4.0.0" + +"@apollographql/apollo-tools@^0.5.0": + version "0.5.0" + resolved "https://registry.yarnpkg.com/@apollographql/apollo-tools/-/apollo-tools-0.5.0.tgz#81aadcabb35eeab6ef7e0d3d6c592a6fe15e66d9" + integrity sha512-7IOZHVaKjBq44StXFJEITl4rxgZCsZFSWogAvIErKR9DYV20rt9bJ2mY5lCn+zghfGrweykjLb9g4TDxLg750w== + dependencies: + apollo-env "^0.10.0" + +"@apollographql/graphql-playground-html@1.6.27": + version "1.6.27" + resolved "https://registry.yarnpkg.com/@apollographql/graphql-playground-html/-/graphql-playground-html-1.6.27.tgz#bc9ab60e9445aa2a8813b4e94f152fa72b756335" + integrity sha512-tea2LweZvn6y6xFV11K0KC8ETjmm52mQrW+ezgB2O/aTQf8JGyFmMcRPFgUaQZeHbWdm8iisDC6EjOKsXu0nfw== + dependencies: + xss "^1.0.8" + +"@apollographql/graphql-upload-8-fork@^8.1.3": + version "8.1.3" + resolved "https://registry.yarnpkg.com/@apollographql/graphql-upload-8-fork/-/graphql-upload-8-fork-8.1.3.tgz#a0d4e0d5cec8e126d78bd915c264d6b90f5784bc" + integrity sha512-ssOPUT7euLqDXcdVv3Qs4LoL4BPtfermW1IOouaqEmj36TpHYDmYDIbKoSQxikd9vtMumFnP87OybH7sC9fJ6g== + dependencies: + "@types/express" "*" + "@types/fs-capacitor" "*" + "@types/koa" "*" + busboy "^0.3.1" + fs-capacitor "^2.0.4" + http-errors "^1.7.3" + object-path "^0.11.4" + +"@ardatan/aggregate-error@0.0.6": + version "0.0.6" + resolved "https://registry.yarnpkg.com/@ardatan/aggregate-error/-/aggregate-error-0.0.6.tgz#fe6924771ea40fc98dc7a7045c2e872dc8527609" + integrity sha512-vyrkEHG1jrukmzTPtyWB4NLPauUw5bQeg4uhn8f+1SSynmrOcyvlb1GKQjjgoBzElLdfXCRYX8UnBlhklOHYRQ== + dependencies: + tslib "~2.0.1" + +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.13.tgz#dcfc826beef65e75c50e21d3837d7d95798dd658" integrity sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g== dependencies: "@babel/highlight" "^7.12.13" +"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.13.15", "@babel/compat-data@^7.13.8": + version "7.14.0" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.14.0.tgz#a901128bce2ad02565df95e6ecbf195cf9465919" + integrity sha512-vu9V3uMM/1o5Hl5OekMUowo3FqXLJSw+s+66nt0fSWVWTtmosdzn45JHOB3cPtZoe6CTBDzvSw0RdOY85Q37+Q== + +"@babel/core@^7.0.0": + version "7.14.0" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.14.0.tgz#47299ff3ec8d111b493f1a9d04bf88c04e728d88" + integrity sha512-8YqpRig5NmIHlMLw09zMlPTvUVMILjqCOtVgu+TVNWEBvy9b5I3RRyhqnrV4hjgEK7n8P9OqvkWJAFmEL6Wwfw== + dependencies: + "@babel/code-frame" "^7.12.13" + "@babel/generator" "^7.14.0" + "@babel/helper-compilation-targets" "^7.13.16" + "@babel/helper-module-transforms" "^7.14.0" + "@babel/helpers" "^7.14.0" + "@babel/parser" "^7.14.0" + "@babel/template" "^7.12.13" + "@babel/traverse" "^7.14.0" + "@babel/types" "^7.14.0" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.1.2" + semver "^6.3.0" + source-map "^0.5.0" + +"@babel/generator@^7.12.13", "@babel/generator@^7.14.0", "@babel/generator@^7.5.0": + version "7.14.1" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.14.1.tgz#1f99331babd65700183628da186f36f63d615c93" + integrity sha512-TMGhsXMXCP/O1WtQmZjpEYDhCYC9vFhayWZPJSZCGkPJgUqX0rF0wwtrYvnzVxIjcF80tkUertXVk5cwqi5cAQ== + dependencies: + "@babel/types" "^7.14.1" + jsesc "^2.5.1" + source-map "^0.5.0" + +"@babel/helper-annotate-as-pure@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.13.tgz#0f58e86dfc4bb3b1fcd7db806570e177d439b6ab" + integrity sha512-7YXfX5wQ5aYM/BOlbSccHDbuXXFPxeoUmfWtz8le2yTkTZc+BxsiEnENFoi2SlmA8ewDkG2LgIMIVzzn2h8kfw== + dependencies: + "@babel/types" "^7.12.13" + +"@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.13.16", "@babel/helper-compilation-targets@^7.13.8": + version "7.13.16" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.13.16.tgz#6e91dccf15e3f43e5556dffe32d860109887563c" + integrity sha512-3gmkYIrpqsLlieFwjkGgLaSHmhnvlAYzZLlYVjlW+QwI+1zE17kGxuJGmIqDQdYp56XdmGeD+Bswx0UTyG18xA== + dependencies: + "@babel/compat-data" "^7.13.15" + "@babel/helper-validator-option" "^7.12.17" + browserslist "^4.14.5" + semver "^6.3.0" + +"@babel/helper-create-class-features-plugin@^7.13.0": + version "7.14.1" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.14.1.tgz#1fe11b376f3c41650ad9fedc665b0068722ea76c" + integrity sha512-r8rsUahG4ywm0QpGcCrLaUSOuNAISR3IZCg4Fx05Ozq31aCUrQsTLH6KPxy0N5ULoQ4Sn9qjNdGNtbPWAC6hYg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.12.13" + "@babel/helper-function-name" "^7.12.13" + "@babel/helper-member-expression-to-functions" "^7.13.12" + "@babel/helper-optimise-call-expression" "^7.12.13" + "@babel/helper-replace-supers" "^7.13.12" + "@babel/helper-split-export-declaration" "^7.12.13" + +"@babel/helper-define-polyfill-provider@^0.2.0": + version "0.2.0" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.0.tgz#a640051772045fedaaecc6f0c6c69f02bdd34bf1" + integrity sha512-JT8tHuFjKBo8NnaUbblz7mIu1nnvUDiHVjXXkulZULyidvo/7P6TY7+YqpV37IfF+KUFxmlK04elKtGKXaiVgw== + dependencies: + "@babel/helper-compilation-targets" "^7.13.0" + "@babel/helper-module-imports" "^7.12.13" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/traverse" "^7.13.0" + debug "^4.1.1" + lodash.debounce "^4.0.8" + resolve "^1.14.2" + semver "^6.1.2" + +"@babel/helper-function-name@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz#93ad656db3c3c2232559fd7b2c3dbdcbe0eb377a" + integrity sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA== + dependencies: + "@babel/helper-get-function-arity" "^7.12.13" + "@babel/template" "^7.12.13" + "@babel/types" "^7.12.13" + +"@babel/helper-get-function-arity@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz#bc63451d403a3b3082b97e1d8b3fe5bd4091e583" + integrity sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg== + dependencies: + "@babel/types" "^7.12.13" + +"@babel/helper-member-expression-to-functions@^7.13.12": + version "7.13.12" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.12.tgz#dfe368f26d426a07299d8d6513821768216e6d72" + integrity sha512-48ql1CLL59aKbU94Y88Xgb2VFy7a95ykGRbJJaaVv+LX5U8wFpLfiGXJJGUozsmA1oEh/o5Bp60Voq7ACyA/Sw== + dependencies: + "@babel/types" "^7.13.12" + +"@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.13.12": + version "7.13.12" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.13.12.tgz#c6a369a6f3621cb25da014078684da9196b61977" + integrity sha512-4cVvR2/1B693IuOvSI20xqqa/+bl7lqAMR59R4iu39R9aOX8/JoYY1sFaNvUMyMBGnHdwvJgUrzNLoUZxXypxA== + dependencies: + "@babel/types" "^7.13.12" + +"@babel/helper-module-transforms@^7.14.0": + version "7.14.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.14.0.tgz#8fcf78be220156f22633ee204ea81f73f826a8ad" + integrity sha512-L40t9bxIuGOfpIGA3HNkJhU9qYrf4y5A5LUSw7rGMSn+pcG8dfJ0g6Zval6YJGd2nEjI7oP00fRdnhLKndx6bw== + dependencies: + "@babel/helper-module-imports" "^7.13.12" + "@babel/helper-replace-supers" "^7.13.12" + "@babel/helper-simple-access" "^7.13.12" + "@babel/helper-split-export-declaration" "^7.12.13" + "@babel/helper-validator-identifier" "^7.14.0" + "@babel/template" "^7.12.13" + "@babel/traverse" "^7.14.0" + "@babel/types" "^7.14.0" + +"@babel/helper-optimise-call-expression@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz#5c02d171b4c8615b1e7163f888c1c81c30a2aaea" + integrity sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA== + dependencies: + "@babel/types" "^7.12.13" + +"@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.13.0", "@babel/helper-plugin-utils@^7.8.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz#806526ce125aed03373bc416a828321e3a6a33af" + integrity sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ== + +"@babel/helper-replace-supers@^7.12.13", "@babel/helper-replace-supers@^7.13.0", "@babel/helper-replace-supers@^7.13.12": + version "7.13.12" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.13.12.tgz#6442f4c1ad912502481a564a7386de0c77ff3804" + integrity sha512-Gz1eiX+4yDO8mT+heB94aLVNCL+rbuT2xy4YfyNqu8F+OI6vMvJK891qGBTqL9Uc8wxEvRW92Id6G7sDen3fFw== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.13.12" + "@babel/helper-optimise-call-expression" "^7.12.13" + "@babel/traverse" "^7.13.0" + "@babel/types" "^7.13.12" + +"@babel/helper-simple-access@^7.13.12": + version "7.13.12" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.13.12.tgz#dd6c538afb61819d205a012c31792a39c7a5eaf6" + integrity sha512-7FEjbrx5SL9cWvXioDbnlYTppcZGuCY6ow3/D5vMggb2Ywgu4dMrpTJX0JdQAIcRRUElOIxF3yEooa9gUb9ZbA== + dependencies: + "@babel/types" "^7.13.12" + +"@babel/helper-skip-transparent-expression-wrappers@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz#462dc63a7e435ade8468385c63d2b84cce4b3cbf" + integrity sha512-Mf5AUuhG1/OCChOJ/HcADmvcHM42WJockombn8ATJG3OnyiSxBK/Mm5x78BQWvmtXZKHgbjdGL2kin/HOLlZGA== + dependencies: + "@babel/types" "^7.12.1" + +"@babel/helper-split-export-declaration@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz#e9430be00baf3e88b0e13e6f9d4eaf2136372b05" + integrity sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg== + dependencies: + "@babel/types" "^7.12.13" + "@babel/helper-validator-identifier@^7.12.11": version "7.12.11" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz#c9a1f021917dcb5ccf0d4e453e399022981fc9ed" integrity sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw== +"@babel/helper-validator-identifier@^7.14.0": + version "7.14.0" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz#d26cad8a47c65286b15df1547319a5d0bcf27288" + integrity sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A== + +"@babel/helper-validator-option@^7.12.17": + version "7.12.17" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz#d1fbf012e1a79b7eebbfdc6d270baaf8d9eb9831" + integrity sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw== + +"@babel/helpers@^7.14.0": + version "7.14.0" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.14.0.tgz#ea9b6be9478a13d6f961dbb5f36bf75e2f3b8f62" + integrity sha512-+ufuXprtQ1D1iZTO/K9+EBRn+qPWMJjZSw/S0KlFrxCw4tkrzv9grgpDHkY9MeQTjTY8i2sp7Jep8DfU6tN9Mg== + dependencies: + "@babel/template" "^7.12.13" + "@babel/traverse" "^7.14.0" + "@babel/types" "^7.14.0" + "@babel/highlight@^7.12.13": version "7.13.10" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.13.10.tgz#a8b2a66148f5b27d666b15d81774347a731d52d1" @@ -23,6 +288,239 @@ chalk "^2.0.0" js-tokens "^4.0.0" +"@babel/parser@7.12.16": + version "7.12.16" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.12.16.tgz#cc31257419d2c3189d394081635703f549fc1ed4" + integrity sha512-c/+u9cqV6F0+4Hpq01jnJO+GLp2DdT63ppz9Xa+6cHaajM9VFzK/iDXiKK65YtpeVwu+ctfS6iqlMqRgQRzeCw== + +"@babel/parser@^7.0.0", "@babel/parser@^7.12.13", "@babel/parser@^7.14.0": + version "7.14.1" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.14.1.tgz#1bd644b5db3f5797c4479d89ec1817fe02b84c47" + integrity sha512-muUGEKu8E/ftMTPlNp+mc6zL3E9zKWmF5sDHZ5MSsoTP9Wyz64AhEf9kD08xYJ7w6Hdcu8H550ircnPyWSIF0Q== + +"@babel/plugin-proposal-class-properties@^7.0.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.13.0.tgz#146376000b94efd001e57a40a88a525afaab9f37" + integrity sha512-KnTDjFNC1g+45ka0myZNvSBFLhNCLN+GeGYLDEA8Oq7MZ6yMgfLoIRh86GRT0FjtJhZw8JyUskP9uvj5pHM9Zg== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.13.0" + "@babel/helper-plugin-utils" "^7.13.0" + +"@babel/plugin-proposal-object-rest-spread@^7.0.0": + version "7.13.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.13.8.tgz#5d210a4d727d6ce3b18f9de82cc99a3964eed60a" + integrity sha512-DhB2EuB1Ih7S3/IRX5AFVgZ16k3EzfRbq97CxAVI1KSYcW+lexV8VZb7G7L8zuPVSdQMRn0kiBpf/Yzu9ZKH0g== + dependencies: + "@babel/compat-data" "^7.13.8" + "@babel/helper-compilation-targets" "^7.13.8" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-transform-parameters" "^7.13.0" + +"@babel/plugin-syntax-class-properties@^7.0.0": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" + integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-syntax-flow@^7.0.0", "@babel/plugin-syntax-flow@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.12.13.tgz#5df9962503c0a9c918381c929d51d4d6949e7e86" + integrity sha512-J/RYxnlSLXZLVR7wTRsozxKT8qbsx1mNKJzXEEjQ0Kjx1ZACcyHgbanNWNCFtc36IzuWhYWPpvJFFoexoOWFmA== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-syntax-jsx@^7.0.0", "@babel/plugin-syntax-jsx@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.13.tgz#044fb81ebad6698fe62c478875575bcbb9b70f15" + integrity sha512-d4HM23Q1K7oq/SLNmG6mRt85l2csmQ0cHRaxRXjKW0YFdEXqlZ5kzFQKH5Uc3rDJECgu+yCRgPkG04Mm98R/1g== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-syntax-object-rest-spread@^7.0.0", "@babel/plugin-syntax-object-rest-spread@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" + integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-transform-arrow-functions@^7.0.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.13.0.tgz#10a59bebad52d637a027afa692e8d5ceff5e3dae" + integrity sha512-96lgJagobeVmazXFaDrbmCLQxBysKu7U6Do3mLsx27gf5Dk85ezysrs2BZUpXD703U/Su1xTBDxxar2oa4jAGg== + dependencies: + "@babel/helper-plugin-utils" "^7.13.0" + +"@babel/plugin-transform-block-scoped-functions@^7.0.0": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.13.tgz#a9bf1836f2a39b4eb6cf09967739de29ea4bf4c4" + integrity sha512-zNyFqbc3kI/fVpqwfqkg6RvBgFpC4J18aKKMmv7KdQ/1GgREapSJAykLMVNwfRGO3BtHj3YQZl8kxCXPcVMVeg== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-transform-block-scoping@^7.0.0": + version "7.14.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.14.1.tgz#ac1b3a8e3d8cbb31efc6b9be2f74eb9823b74ab2" + integrity sha512-2mQXd0zBrwfp0O1moWIhPpEeTKDvxyHcnma3JATVP1l+CctWBuot6OJG8LQ4DnBj4ZZPSmlb/fm4mu47EOAnVA== + dependencies: + "@babel/helper-plugin-utils" "^7.13.0" + +"@babel/plugin-transform-classes@^7.0.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.13.0.tgz#0265155075c42918bf4d3a4053134176ad9b533b" + integrity sha512-9BtHCPUARyVH1oXGcSJD3YpsqRLROJx5ZNP6tN5vnk17N0SVf9WCtf8Nuh1CFmgByKKAIMstitKduoCmsaDK5g== + dependencies: + "@babel/helper-annotate-as-pure" "^7.12.13" + "@babel/helper-function-name" "^7.12.13" + "@babel/helper-optimise-call-expression" "^7.12.13" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-replace-supers" "^7.13.0" + "@babel/helper-split-export-declaration" "^7.12.13" + globals "^11.1.0" + +"@babel/plugin-transform-computed-properties@^7.0.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.13.0.tgz#845c6e8b9bb55376b1fa0b92ef0bdc8ea06644ed" + integrity sha512-RRqTYTeZkZAz8WbieLTvKUEUxZlUTdmL5KGMyZj7FnMfLNKV4+r5549aORG/mgojRmFlQMJDUupwAMiF2Q7OUg== + dependencies: + "@babel/helper-plugin-utils" "^7.13.0" + +"@babel/plugin-transform-destructuring@^7.0.0": + version "7.13.17" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.13.17.tgz#678d96576638c19d5b36b332504d3fd6e06dea27" + integrity sha512-UAUqiLv+uRLO+xuBKKMEpC+t7YRNVRqBsWWq1yKXbBZBje/t3IXCiSinZhjn/DC3qzBfICeYd2EFGEbHsh5RLA== + dependencies: + "@babel/helper-plugin-utils" "^7.13.0" + +"@babel/plugin-transform-flow-strip-types@^7.0.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.13.0.tgz#58177a48c209971e8234e99906cb6bd1122addd3" + integrity sha512-EXAGFMJgSX8gxWD7PZtW/P6M+z74jpx3wm/+9pn+c2dOawPpBkUX7BrfyPvo6ZpXbgRIEuwgwDb/MGlKvu2pOg== + dependencies: + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/plugin-syntax-flow" "^7.12.13" + +"@babel/plugin-transform-for-of@^7.0.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.13.0.tgz#c799f881a8091ac26b54867a845c3e97d2696062" + integrity sha512-IHKT00mwUVYE0zzbkDgNRP6SRzvfGCYsOxIRz8KsiaaHCcT9BWIkO+H9QRJseHBLOGBZkHUdHiqj6r0POsdytg== + dependencies: + "@babel/helper-plugin-utils" "^7.13.0" + +"@babel/plugin-transform-function-name@^7.0.0": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.13.tgz#bb024452f9aaed861d374c8e7a24252ce3a50051" + integrity sha512-6K7gZycG0cmIwwF7uMK/ZqeCikCGVBdyP2J5SKNCXO5EOHcqi+z7Jwf8AmyDNcBgxET8DrEtCt/mPKPyAzXyqQ== + dependencies: + "@babel/helper-function-name" "^7.12.13" + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-transform-literals@^7.0.0": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.13.tgz#2ca45bafe4a820197cf315794a4d26560fe4bdb9" + integrity sha512-FW+WPjSR7hiUxMcKqyNjP05tQ2kmBCdpEpZHY1ARm96tGQCCBvXKnpjILtDplUnJ/eHZ0lALLM+d2lMFSpYJrQ== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-transform-member-expression-literals@^7.0.0": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.13.tgz#5ffa66cd59b9e191314c9f1f803b938e8c081e40" + integrity sha512-kxLkOsg8yir4YeEPHLuO2tXP9R/gTjpuTOjshqSpELUN3ZAg2jfDnKUvzzJxObun38sw3wm4Uu69sX/zA7iRvg== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-transform-modules-commonjs@^7.0.0": + version "7.14.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.14.0.tgz#52bc199cb581e0992edba0f0f80356467587f161" + integrity sha512-EX4QePlsTaRZQmw9BsoPeyh5OCtRGIhwfLquhxGp5e32w+dyL8htOcDwamlitmNFK6xBZYlygjdye9dbd9rUlQ== + dependencies: + "@babel/helper-module-transforms" "^7.14.0" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-simple-access" "^7.13.12" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-object-super@^7.0.0": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.13.tgz#b4416a2d63b8f7be314f3d349bd55a9c1b5171f7" + integrity sha512-JzYIcj3XtYspZDV8j9ulnoMPZZnF/Cj0LUxPOjR89BdBVx+zYJI9MdMIlUZjbXDX+6YVeS6I3e8op+qQ3BYBoQ== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-replace-supers" "^7.12.13" + +"@babel/plugin-transform-parameters@^7.0.0", "@babel/plugin-transform-parameters@^7.13.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.13.0.tgz#8fa7603e3097f9c0b7ca1a4821bc2fb52e9e5007" + integrity sha512-Jt8k/h/mIwE2JFEOb3lURoY5C85ETcYPnbuAJ96zRBzh1XHtQZfs62ChZ6EP22QlC8c7Xqr9q+e1SU5qttwwjw== + dependencies: + "@babel/helper-plugin-utils" "^7.13.0" + +"@babel/plugin-transform-property-literals@^7.0.0": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.13.tgz#4e6a9e37864d8f1b3bc0e2dce7bf8857db8b1a81" + integrity sha512-nqVigwVan+lR+g8Fj8Exl0UQX2kymtjcWfMOYM1vTYEKujeyv2SkMgazf2qNcK7l4SDiKyTA/nHCPqL4e2zo1A== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-transform-react-display-name@^7.0.0": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.12.13.tgz#c28effd771b276f4647411c9733dbb2d2da954bd" + integrity sha512-MprESJzI9O5VnJZrL7gg1MpdqmiFcUv41Jc7SahxYsNP2kDkFqClxxTZq+1Qv4AFCamm+GXMRDQINNn+qrxmiA== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-transform-react-jsx@^7.0.0": + version "7.13.12" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.13.12.tgz#1df5dfaf0f4b784b43e96da6f28d630e775f68b3" + integrity sha512-jcEI2UqIcpCqB5U5DRxIl0tQEProI2gcu+g8VTIqxLO5Iidojb4d77q+fwGseCvd8af/lJ9masp4QWzBXFE2xA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.12.13" + "@babel/helper-module-imports" "^7.13.12" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/plugin-syntax-jsx" "^7.12.13" + "@babel/types" "^7.13.12" + +"@babel/plugin-transform-runtime@^7.5.5": + version "7.13.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.13.15.tgz#2eddf585dd066b84102517e10a577f24f76a9cd7" + integrity sha512-d+ezl76gx6Jal08XngJUkXM4lFXK/5Ikl9Mh4HKDxSfGJXmZ9xG64XT2oivBzfxb/eQ62VfvoMkaCZUKJMVrBA== + dependencies: + "@babel/helper-module-imports" "^7.13.12" + "@babel/helper-plugin-utils" "^7.13.0" + babel-plugin-polyfill-corejs2 "^0.2.0" + babel-plugin-polyfill-corejs3 "^0.2.0" + babel-plugin-polyfill-regenerator "^0.2.0" + semver "^6.3.0" + +"@babel/plugin-transform-shorthand-properties@^7.0.0": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.13.tgz#db755732b70c539d504c6390d9ce90fe64aff7ad" + integrity sha512-xpL49pqPnLtf0tVluuqvzWIgLEhuPpZzvs2yabUHSKRNlN7ScYU7aMlmavOeyXJZKgZKQRBlh8rHbKiJDraTSw== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-transform-spread@^7.0.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.13.0.tgz#84887710e273c1815ace7ae459f6f42a5d31d5fd" + integrity sha512-V6vkiXijjzYeFmQTr3dBxPtZYLPcUfY34DebOU27jIl2M/Y8Egm52Hw82CSjjPqd54GTlJs5x+CR7HeNr24ckg== + dependencies: + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1" + +"@babel/plugin-transform-template-literals@^7.0.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.13.0.tgz#a36049127977ad94438dee7443598d1cefdf409d" + integrity sha512-d67umW6nlfmr1iehCcBv69eSUSySk1EsIS8aTDX4Xo9qajAh6mYtcl4kJrBkGXuxZPEgVr7RVfAvNW6YQkd4Mw== + dependencies: + "@babel/helper-plugin-utils" "^7.13.0" + +"@babel/runtime@^7.0.0", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.1", "@babel/runtime@^7.6.3", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": + version "7.14.0" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.14.0.tgz#46794bc20b612c5f75e62dd071e24dfd95f1cbe6" + integrity sha512-JELkvo/DlpNdJ7dlyw/eY7E0suy5i5GQH+Vlxaq1nsNJ+H7f4Vtv3jMeCEgRhZZQFXTjldYfQgv2qmM6M1v5wA== + dependencies: + regenerator-runtime "^0.13.4" + "@babel/runtime@^7.10.4", "@babel/runtime@^7.5.5": version "7.13.10" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.13.10.tgz#47d42a57b6095f4468da440388fdbad8bebf0d7d" @@ -30,6 +528,61 @@ dependencies: regenerator-runtime "^0.13.4" +"@babel/template@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.12.13.tgz#530265be8a2589dbb37523844c5bcb55947fb327" + integrity sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA== + dependencies: + "@babel/code-frame" "^7.12.13" + "@babel/parser" "^7.12.13" + "@babel/types" "^7.12.13" + +"@babel/traverse@7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.12.13.tgz#689f0e4b4c08587ad26622832632735fb8c4e0c0" + integrity sha512-3Zb4w7eE/OslI0fTp8c7b286/cQps3+vdLW3UcwC8VSJC6GbKn55aeVVu2QJNuCDoeKyptLOFrPq8WqZZBodyA== + dependencies: + "@babel/code-frame" "^7.12.13" + "@babel/generator" "^7.12.13" + "@babel/helper-function-name" "^7.12.13" + "@babel/helper-split-export-declaration" "^7.12.13" + "@babel/parser" "^7.12.13" + "@babel/types" "^7.12.13" + debug "^4.1.0" + globals "^11.1.0" + lodash "^4.17.19" + +"@babel/traverse@^7.0.0", "@babel/traverse@^7.13.0", "@babel/traverse@^7.14.0": + version "7.14.0" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.14.0.tgz#cea0dc8ae7e2b1dec65f512f39f3483e8cc95aef" + integrity sha512-dZ/a371EE5XNhTHomvtuLTUyx6UEoJmYX+DT5zBCQN3McHemsuIaKKYqsc/fs26BEkHs/lBZy0J571LP5z9kQA== + dependencies: + "@babel/code-frame" "^7.12.13" + "@babel/generator" "^7.14.0" + "@babel/helper-function-name" "^7.12.13" + "@babel/helper-split-export-declaration" "^7.12.13" + "@babel/parser" "^7.14.0" + "@babel/types" "^7.14.0" + debug "^4.1.0" + globals "^11.1.0" + +"@babel/types@7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.12.13.tgz#8be1aa8f2c876da11a9cf650c0ecf656913ad611" + integrity sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ== + dependencies: + "@babel/helper-validator-identifier" "^7.12.11" + lodash "^4.17.19" + to-fast-properties "^2.0.0" + +"@babel/types@^7.0.0", "@babel/types@^7.12.1", "@babel/types@^7.12.13", "@babel/types@^7.13.12", "@babel/types@^7.14.0", "@babel/types@^7.14.1": + version "7.14.1" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.14.1.tgz#095bd12f1c08ab63eff6e8f7745fa7c9cc15a9db" + integrity sha512-S13Qe85fzLs3gYRUnrpyeIrBJIMYv33qSTg1qoBwiG6nPKwUWAD9odSzWhEedpwOIzSEI6gbdQIWEMiCI42iBA== + dependencies: + "@babel/helper-validator-identifier" "^7.14.0" + to-fast-properties "^2.0.0" + "@changesets/apply-release-plan@^5.0.0": version "5.0.0" resolved "https://registry.yarnpkg.com/@changesets/apply-release-plan/-/apply-release-plan-5.0.0.tgz#11bf168acecbf4cfa2b0e6425160bac5ceeec1c3" @@ -240,6 +793,14 @@ ts-node "^8.0.2" url-join "^4.0.0" +"@consento/sync-randombytes@^1.0.4", "@consento/sync-randombytes@^1.0.5": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@consento/sync-randombytes/-/sync-randombytes-1.0.5.tgz#5be6bc58c6a6fa6e09f04cc684d037e29e6c28d5" + integrity sha512-mPJ2XvrTLQGEdhleDuSIkWtVWnvmhREOC1FjorV1nlK49t/52Z9X1d618gTj6nlQghRLiYvcd8oL4vZ2YZuDIQ== + dependencies: + buffer "^5.4.3" + seedrandom "^3.0.5" + "@ensdomains/ens@^0.4.4": version "0.4.5" resolved "https://registry.yarnpkg.com/@ensdomains/ens/-/ens-0.4.5.tgz#e0aebc005afdc066447c6e22feb4eda89a5edbfc" @@ -431,6 +992,21 @@ "@ethersproject/properties" ">=5.0.0-beta.131" "@ethersproject/strings" ">=5.0.0-beta.130" +"@ethersproject/abi@5.0.7": + version "5.0.7" + resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.0.7.tgz#79e52452bd3ca2956d0e1c964207a58ad1a0ee7b" + integrity sha512-Cqktk+hSIckwP/W8O47Eef60VwmoSC/L3lY0+dIBhQPCNn9E4V7rwmm2aFrNRRDJfFlGuZ1khkQUOc3oBX+niw== + dependencies: + "@ethersproject/address" "^5.0.4" + "@ethersproject/bignumber" "^5.0.7" + "@ethersproject/bytes" "^5.0.4" + "@ethersproject/constants" "^5.0.4" + "@ethersproject/hash" "^5.0.4" + "@ethersproject/keccak256" "^5.0.3" + "@ethersproject/logger" "^5.0.5" + "@ethersproject/properties" "^5.0.3" + "@ethersproject/strings" "^5.0.4" + "@ethersproject/abi@5.1.0", "@ethersproject/abi@^5.0.0", "@ethersproject/abi@^5.0.1", "@ethersproject/abi@^5.0.13", "@ethersproject/abi@^5.0.2", "@ethersproject/abi@^5.1.0": version "5.1.0" resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.1.0.tgz#d582c9f6a8e8192778b5f2c991ce19d7b336b0c5" @@ -485,7 +1061,7 @@ "@ethersproject/logger" "^5.1.0" "@ethersproject/properties" "^5.1.0" -"@ethersproject/address@5.1.0", "@ethersproject/address@>=5.0.0-beta.128", "@ethersproject/address@^5.0.0", "@ethersproject/address@^5.0.2", "@ethersproject/address@^5.1.0": +"@ethersproject/address@5.1.0", "@ethersproject/address@>=5.0.0-beta.128", "@ethersproject/address@^5.0.0", "@ethersproject/address@^5.0.2", "@ethersproject/address@^5.0.4", "@ethersproject/address@^5.1.0": version "5.1.0" resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.1.0.tgz#3854fd7ebcb6af7597de66f847c3345dae735b58" integrity sha512-rfWQR12eHn2cpstCFS4RF7oGjfbkZb0oqep+BfrT+gWEGWG2IowJvIsacPOvzyS1jhNF4MQ4BS59B04Mbovteg== @@ -520,7 +1096,7 @@ "@ethersproject/logger" "^5.1.0" bn.js "^4.4.0" -"@ethersproject/bignumber@5.1.1": +"@ethersproject/bignumber@5.1.1", "@ethersproject/bignumber@^5.0.7": version "5.1.1" resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.1.1.tgz#84812695253ccbc639117f7ac49ee1529b68e637" integrity sha512-AVz5iqz7+70RIqoQTznsdJ6DOVBYciNlvO+AlQmPTB6ofCvoihI9bQdr6wljsX+d5W7Yc4nyvQvP4JMzg0Agig== @@ -529,14 +1105,14 @@ "@ethersproject/logger" "^5.1.0" bn.js "^4.4.0" -"@ethersproject/bytes@5.1.0", "@ethersproject/bytes@>=5.0.0-beta.129", "@ethersproject/bytes@^5.0.0", "@ethersproject/bytes@^5.0.2", "@ethersproject/bytes@^5.1.0": +"@ethersproject/bytes@5.1.0", "@ethersproject/bytes@>=5.0.0-beta.129", "@ethersproject/bytes@^5.0.0", "@ethersproject/bytes@^5.0.2", "@ethersproject/bytes@^5.0.4", "@ethersproject/bytes@^5.1.0": version "5.1.0" resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.1.0.tgz#55dfa9c4c21df1b1b538be3accb50fb76d5facfd" integrity sha512-sGTxb+LVjFxJcJeUswAIK6ncgOrh3D8c192iEJd7mLr95V6du119rRfYT/b87WPkZ5I3gRBUYIYXtdgCWACe8g== dependencies: "@ethersproject/logger" "^5.1.0" -"@ethersproject/constants@5.1.0", "@ethersproject/constants@>=5.0.0-beta.128", "@ethersproject/constants@^5.0.0", "@ethersproject/constants@^5.1.0": +"@ethersproject/constants@5.1.0", "@ethersproject/constants@>=5.0.0-beta.128", "@ethersproject/constants@^5.0.0", "@ethersproject/constants@^5.0.4", "@ethersproject/constants@^5.1.0": version "5.1.0" resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.1.0.tgz#4e7da6367ea0e9be87585d8b09f3fccf384b1452" integrity sha512-0/SuHrxc8R8k+JiLmJymxHJbojUDWBQqO+b+XFdwaP0jGzqC09YDy/CAlSZB6qHsBifY8X3I89HcK/oMqxRdBw== @@ -587,7 +1163,7 @@ optionalDependencies: "@ledgerhq/hw-transport-node-hid" "5.26.0" -"@ethersproject/hash@5.1.0", "@ethersproject/hash@>=5.0.0-beta.128", "@ethersproject/hash@^5.0.0", "@ethersproject/hash@^5.1.0": +"@ethersproject/hash@5.1.0", "@ethersproject/hash@>=5.0.0-beta.128", "@ethersproject/hash@^5.0.0", "@ethersproject/hash@^5.0.4", "@ethersproject/hash@^5.1.0": version "5.1.0" resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.1.0.tgz#40961d64837d57f580b7b055e0d74174876d891e" integrity sha512-fNwry20yLLPpnRRwm3fBL+2ksgO+KMadxM44WJmRIoTKzy4269+rbq9KFoe2LTqq2CXJM2CE70beGaNrpuqflQ== @@ -638,7 +1214,7 @@ aes-js "3.0.0" scrypt-js "3.0.1" -"@ethersproject/keccak256@5.1.0", "@ethersproject/keccak256@>=5.0.0-beta.127", "@ethersproject/keccak256@^5.0.0", "@ethersproject/keccak256@^5.1.0": +"@ethersproject/keccak256@5.1.0", "@ethersproject/keccak256@>=5.0.0-beta.127", "@ethersproject/keccak256@^5.0.0", "@ethersproject/keccak256@^5.0.3", "@ethersproject/keccak256@^5.1.0": version "5.1.0" resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.1.0.tgz#fdcd88fb13bfef4271b225cdd8dec4d315c8e60e" integrity sha512-vrTB1W6AEYoadww5c9UyVJ2YcSiyIUTNDRccZIgwTmFFoSHwBtcvG1hqy9RzJ1T0bMdATbM9Hfx2mJ6H0i7Hig== @@ -646,7 +1222,7 @@ "@ethersproject/bytes" "^5.1.0" js-sha3 "0.5.7" -"@ethersproject/logger@5.1.0", "@ethersproject/logger@>=5.0.0-beta.129", "@ethersproject/logger@^5.0.0", "@ethersproject/logger@^5.1.0": +"@ethersproject/logger@5.1.0", "@ethersproject/logger@>=5.0.0-beta.129", "@ethersproject/logger@^5.0.0", "@ethersproject/logger@^5.0.5", "@ethersproject/logger@^5.1.0": version "5.1.0" resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.1.0.tgz#4cdeeefac029373349d5818f39c31b82cc6d9bbf" integrity sha512-wtUaD1lBX10HBXjjKV9VHCBnTdUaKQnQ2XSET1ezglqLdPdllNOIlLfhyCRqXm5xwcjExVI5ETokOYfjPtaAlw== @@ -666,7 +1242,7 @@ "@ethersproject/bytes" "^5.1.0" "@ethersproject/sha2" "^5.1.0" -"@ethersproject/properties@5.1.0", "@ethersproject/properties@>=5.0.0-beta.131", "@ethersproject/properties@^5.0.0", "@ethersproject/properties@^5.1.0": +"@ethersproject/properties@5.1.0", "@ethersproject/properties@>=5.0.0-beta.131", "@ethersproject/properties@^5.0.0", "@ethersproject/properties@^5.0.3", "@ethersproject/properties@^5.1.0": version "5.1.0" resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.1.0.tgz#9484bd6def16595fc6e4bdc26f29dff4d3f6ac42" integrity sha512-519KKTwgmH42AQL3+GFV3SX6khYEfHsvI6v8HYejlkigSDuqttdgVygFTDsGlofNFchhDwuclrxQnD5B0YLNMg== @@ -770,7 +1346,7 @@ "@ethersproject/sha2" "^5.1.0" "@ethersproject/strings" "^5.1.0" -"@ethersproject/strings@5.1.0", "@ethersproject/strings@>=5.0.0-beta.130", "@ethersproject/strings@^5.0.0", "@ethersproject/strings@^5.1.0": +"@ethersproject/strings@5.1.0", "@ethersproject/strings@>=5.0.0-beta.130", "@ethersproject/strings@^5.0.0", "@ethersproject/strings@^5.0.4", "@ethersproject/strings@^5.1.0": version "5.1.0" resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.1.0.tgz#0f95a56c3c8c9d5510a06c241d818779750e2da5" integrity sha512-perBZy0RrmmL0ejiFGUOlBVjMsUceqLut3OBP3zP96LhiJWWbS8u1NqQVgN4/Gyrbziuda66DxiQocXhsvx+Sw== @@ -861,11 +1437,335 @@ "@ethersproject/properties" "^5.1.0" "@ethersproject/strings" "^5.1.0" +"@graphql-tools/batch-delegate@^6.2.4", "@graphql-tools/batch-delegate@^6.2.6": + version "6.2.6" + resolved "https://registry.yarnpkg.com/@graphql-tools/batch-delegate/-/batch-delegate-6.2.6.tgz#fbea98dc825f87ef29ea5f3f371912c2a2aa2f2c" + integrity sha512-QUoE9pQtkdNPFdJHSnBhZtUfr3M7pIRoXoMR+TG7DK2Y62ISKbT/bKtZEUU1/2v5uqd5WVIvw9dF8gHDSJAsSA== + dependencies: + "@graphql-tools/delegate" "^6.2.4" + dataloader "2.0.0" + tslib "~2.0.1" + +"@graphql-tools/batch-execute@^7.1.2": + version "7.1.2" + resolved "https://registry.yarnpkg.com/@graphql-tools/batch-execute/-/batch-execute-7.1.2.tgz#35ba09a1e0f80f34f1ce111d23c40f039d4403a0" + integrity sha512-IuR2SB2MnC2ztA/XeTMTfWcA0Wy7ZH5u+nDkDNLAdX+AaSyDnsQS35sCmHqG0VOGTl7rzoyBWLCKGwSJplgtwg== + dependencies: + "@graphql-tools/utils" "^7.7.0" + dataloader "2.0.0" + tslib "~2.2.0" + value-or-promise "1.0.6" + +"@graphql-tools/code-file-loader@^6.2.4": + version "6.3.1" + resolved "https://registry.yarnpkg.com/@graphql-tools/code-file-loader/-/code-file-loader-6.3.1.tgz#42dfd4db5b968acdb453382f172ec684fa0c34ed" + integrity sha512-ZJimcm2ig+avgsEOWWVvAaxZrXXhiiSZyYYOJi0hk9wh5BxZcLUNKkTp6EFnZE/jmGUwuos3pIjUD3Hwi3Bwhg== + dependencies: + "@graphql-tools/graphql-tag-pluck" "^6.5.1" + "@graphql-tools/utils" "^7.0.0" + tslib "~2.1.0" + +"@graphql-tools/delegate@^6.2.4": + version "6.2.4" + resolved "https://registry.yarnpkg.com/@graphql-tools/delegate/-/delegate-6.2.4.tgz#db553b63eb9512d5eb5bbfdfcd8cb1e2b534699c" + integrity sha512-mXe6DfoWmq49kPcDrpKHgC2DSWcD5q0YCaHHoXYPAOlnLH8VMTY8BxcE8y/Do2eyg+GLcwAcrpffVszWMwqw0w== + dependencies: + "@ardatan/aggregate-error" "0.0.6" + "@graphql-tools/schema" "^6.2.4" + "@graphql-tools/utils" "^6.2.4" + dataloader "2.0.0" + is-promise "4.0.0" + tslib "~2.0.1" + +"@graphql-tools/delegate@^7.0.1", "@graphql-tools/delegate@^7.1.5": + version "7.1.5" + resolved "https://registry.yarnpkg.com/@graphql-tools/delegate/-/delegate-7.1.5.tgz#0b027819b7047eff29bacbd5032e34a3d64bd093" + integrity sha512-bQu+hDd37e+FZ0CQGEEczmRSfQRnnXeUxI/0miDV+NV/zCbEdIJj5tYFNrKT03W6wgdqx8U06d8L23LxvGri/g== + dependencies: + "@ardatan/aggregate-error" "0.0.6" + "@graphql-tools/batch-execute" "^7.1.2" + "@graphql-tools/schema" "^7.1.5" + "@graphql-tools/utils" "^7.7.1" + dataloader "2.0.0" + tslib "~2.2.0" + value-or-promise "1.0.6" + +"@graphql-tools/git-loader@^6.2.4": + version "6.2.6" + resolved "https://registry.yarnpkg.com/@graphql-tools/git-loader/-/git-loader-6.2.6.tgz#c2226f4b8f51f1c05c9ab2649ba32d49c68cd077" + integrity sha512-ooQTt2CaG47vEYPP3CPD+nbA0F+FYQXfzrB1Y1ABN9K3d3O2RK3g8qwslzZaI8VJQthvKwt0A95ZeE4XxteYfw== + dependencies: + "@graphql-tools/graphql-tag-pluck" "^6.2.6" + "@graphql-tools/utils" "^7.0.0" + tslib "~2.1.0" + +"@graphql-tools/github-loader@^6.2.4": + version "6.2.5" + resolved "https://registry.yarnpkg.com/@graphql-tools/github-loader/-/github-loader-6.2.5.tgz#460dff6f5bbaa26957a5ea3be4f452b89cc6a44b" + integrity sha512-DLuQmYeNNdPo8oWus8EePxWCfCAyUXPZ/p1PWqjrX/NGPyH2ZObdqtDAfRHztljt0F/qkBHbGHCEk2TKbRZTRw== + dependencies: + "@graphql-tools/graphql-tag-pluck" "^6.2.6" + "@graphql-tools/utils" "^7.0.0" + cross-fetch "3.0.6" + tslib "~2.0.1" + +"@graphql-tools/graphql-file-loader@^6.2.4": + version "6.2.7" + resolved "https://registry.yarnpkg.com/@graphql-tools/graphql-file-loader/-/graphql-file-loader-6.2.7.tgz#d3720f2c4f4bb90eb2a03a7869a780c61945e143" + integrity sha512-5k2SNz0W87tDcymhEMZMkd6/vs6QawDyjQXWtqkuLTBF3vxjxPD1I4dwHoxgWPIjjANhXybvulD7E+St/7s9TQ== + dependencies: + "@graphql-tools/import" "^6.2.6" + "@graphql-tools/utils" "^7.0.0" + tslib "~2.1.0" + +"@graphql-tools/graphql-tag-pluck@^6.2.4", "@graphql-tools/graphql-tag-pluck@^6.2.6", "@graphql-tools/graphql-tag-pluck@^6.5.1": + version "6.5.1" + resolved "https://registry.yarnpkg.com/@graphql-tools/graphql-tag-pluck/-/graphql-tag-pluck-6.5.1.tgz#5fb227dbb1e19f4b037792b50f646f16a2d4c686" + integrity sha512-7qkm82iFmcpb8M6/yRgzjShtW6Qu2OlCSZp8uatA3J0eMl87TxyJoUmL3M3UMMOSundAK8GmoyNVFUrueueV5Q== + dependencies: + "@babel/parser" "7.12.16" + "@babel/traverse" "7.12.13" + "@babel/types" "7.12.13" + "@graphql-tools/utils" "^7.0.0" + tslib "~2.1.0" + +"@graphql-tools/import@^6.2.4", "@graphql-tools/import@^6.2.6": + version "6.3.1" + resolved "https://registry.yarnpkg.com/@graphql-tools/import/-/import-6.3.1.tgz#731c47ab6c6ac9f7994d75c76b6c2fa127d2d483" + integrity sha512-1szR19JI6WPibjYurMLdadHKZoG9C//8I/FZ0Dt4vJSbrMdVNp8WFxg4QnZrDeMG4MzZc90etsyF5ofKjcC+jw== + dependencies: + resolve-from "5.0.0" + tslib "~2.2.0" + +"@graphql-tools/json-file-loader@^6.2.4": + version "6.2.6" + resolved "https://registry.yarnpkg.com/@graphql-tools/json-file-loader/-/json-file-loader-6.2.6.tgz#830482cfd3721a0799cbf2fe5b09959d9332739a" + integrity sha512-CnfwBSY5926zyb6fkDBHnlTblHnHI4hoBALFYXnrg0Ev4yWU8B04DZl/pBRUc459VNgO2x8/mxGIZj2hPJG1EA== + dependencies: + "@graphql-tools/utils" "^7.0.0" + tslib "~2.0.1" + +"@graphql-tools/links@^6.2.4": + version "6.2.5" + resolved "https://registry.yarnpkg.com/@graphql-tools/links/-/links-6.2.5.tgz#b172cadc4b7cbe27bfc1dc787651f92517f583bc" + integrity sha512-XeGDioW7F+HK6HHD/zCeF0HRC9s12NfOXAKv1HC0J7D50F4qqMvhdS/OkjzLoBqsgh/Gm8icRc36B5s0rOA9ig== + dependencies: + "@graphql-tools/utils" "^7.0.0" + apollo-link "1.2.14" + apollo-upload-client "14.1.2" + cross-fetch "3.0.6" + form-data "3.0.0" + is-promise "4.0.0" + tslib "~2.0.1" + +"@graphql-tools/load-files@^6.2.4": + version "6.3.2" + resolved "https://registry.yarnpkg.com/@graphql-tools/load-files/-/load-files-6.3.2.tgz#c4e84394e5b95b96452c22e960e2595ac9154648" + integrity sha512-3mgwEKZ8yy7CD/uVs9yeXR3r+GwjlTKRG5bC75xdJFN8WbzbcHjIJiTXfWSAYqbfSTam0hWnRdWghagzFSo5kQ== + dependencies: + globby "11.0.3" + tslib "~2.1.0" + unixify "1.0.0" + +"@graphql-tools/load@^6.2.4": + version "6.2.8" + resolved "https://registry.yarnpkg.com/@graphql-tools/load/-/load-6.2.8.tgz#16900fb6e75e1d075cad8f7ea439b334feb0b96a" + integrity sha512-JpbyXOXd8fJXdBh2ta0Q4w8ia6uK5FHzrTNmcvYBvflFuWly2LDTk2abbSl81zKkzswQMEd2UIYghXELRg8eTA== + dependencies: + "@graphql-tools/merge" "^6.2.12" + "@graphql-tools/utils" "^7.5.0" + globby "11.0.3" + import-from "3.0.0" + is-glob "4.0.1" + p-limit "3.1.0" + tslib "~2.2.0" + unixify "1.0.0" + valid-url "1.0.9" + +"@graphql-tools/merge@^6.2.12", "@graphql-tools/merge@^6.2.4": + version "6.2.13" + resolved "https://registry.yarnpkg.com/@graphql-tools/merge/-/merge-6.2.13.tgz#4603fac8fc44daff0a4704055634d95ca7fa62b2" + integrity sha512-Qjlki0fp+bBQPinhdv7rv24eurvThZ5oIFvGMpLxMZplbw/ovJ2c6llwXr5PCuWAk9HGZsyM9NxxDgtTRfq3dQ== + dependencies: + "@graphql-tools/schema" "^7.0.0" + "@graphql-tools/utils" "^7.7.0" + tslib "~2.2.0" + +"@graphql-tools/mock@^6.2.4": + version "6.2.4" + resolved "https://registry.yarnpkg.com/@graphql-tools/mock/-/mock-6.2.4.tgz#205323c51f89dd855d345d130c7713d0420909ea" + integrity sha512-O5Zvq/mcDZ7Ptky0IZ4EK9USmxV6FEVYq0Jxv2TI80kvxbCjt0tbEpZ+r1vIt1gZOXlAvadSHYyzWnUPh+1vkQ== + dependencies: + "@graphql-tools/schema" "^6.2.4" + "@graphql-tools/utils" "^6.2.4" + tslib "~2.0.1" + +"@graphql-tools/module-loader@^6.2.4": + version "6.2.7" + resolved "https://registry.yarnpkg.com/@graphql-tools/module-loader/-/module-loader-6.2.7.tgz#66ab9468775fac8079ca46ea9896ceea76e4ef69" + integrity sha512-ItAAbHvwfznY9h1H9FwHYDstTcm22Dr5R9GZtrWlpwqj0jaJGcBxsMB9jnK9kFqkbtFYEe4E/NsSnxsS4/vViQ== + dependencies: + "@graphql-tools/utils" "^7.5.0" + tslib "~2.1.0" + +"@graphql-tools/relay-operation-optimizer@^6.2.4": + version "6.3.0" + resolved "https://registry.yarnpkg.com/@graphql-tools/relay-operation-optimizer/-/relay-operation-optimizer-6.3.0.tgz#f8c7f6c8aa4a9cf50ab151fbc5db4f4282a79532" + integrity sha512-Or3UgRvkY9Fq1AAx7q38oPqFmTepLz7kp6wDHKyR0ceG7AvHv5En22R12mAeISInbhff4Rpwgf6cE8zHRu6bCw== + dependencies: + "@graphql-tools/utils" "^7.1.0" + relay-compiler "10.1.0" + tslib "~2.0.1" + +"@graphql-tools/resolvers-composition@^6.2.4": + version "6.2.8" + resolved "https://registry.yarnpkg.com/@graphql-tools/resolvers-composition/-/resolvers-composition-6.2.8.tgz#fa91be40ef424e88290cc101e1ab67b1201ce04f" + integrity sha512-/2xedRZYhvts88x9Rv/VWrk69wpl84M7cuYZ4aAacqxnXNm7zxT+MqeL54lsRhq2Kb2yjEhtfguEiqOn+kV8Xg== + dependencies: + "@graphql-tools/utils" "^7.9.1" + lodash "4.17.21" + tslib "~2.2.0" + +"@graphql-tools/schema@^6.2.4": + version "6.2.4" + resolved "https://registry.yarnpkg.com/@graphql-tools/schema/-/schema-6.2.4.tgz#cc4e9f5cab0f4ec48500e666719d99fc5042481d" + integrity sha512-rh+14lSY1q8IPbEv2J9x8UBFJ5NrDX9W5asXEUlPp+7vraLp/Tiox4GXdgyA92JhwpYco3nTf5Bo2JDMt1KnAQ== + dependencies: + "@graphql-tools/utils" "^6.2.4" + tslib "~2.0.1" + +"@graphql-tools/schema@^7.0.0", "@graphql-tools/schema@^7.1.5": + version "7.1.5" + resolved "https://registry.yarnpkg.com/@graphql-tools/schema/-/schema-7.1.5.tgz#07b24e52b182e736a6b77c829fc48b84d89aa711" + integrity sha512-uyn3HSNSckf4mvQSq0Q07CPaVZMNFCYEVxroApOaw802m9DcZPgf9XVPy/gda5GWj9AhbijfRYVTZQgHnJ4CXA== + dependencies: + "@graphql-tools/utils" "^7.1.2" + tslib "~2.2.0" + value-or-promise "1.0.6" + +"@graphql-tools/stitch@^6.2.4": + version "6.2.4" + resolved "https://registry.yarnpkg.com/@graphql-tools/stitch/-/stitch-6.2.4.tgz#acfa6a577a33c0f02e4940ffff04753b23b87fd6" + integrity sha512-0C7PNkS7v7iAc001m7c1LPm5FUB0/DYw+s3OyCii6YYYHY8NwdI0roeOyeDGFJkFubWBQfjc3hoSyueKtU73mw== + dependencies: + "@graphql-tools/batch-delegate" "^6.2.4" + "@graphql-tools/delegate" "^6.2.4" + "@graphql-tools/merge" "^6.2.4" + "@graphql-tools/schema" "^6.2.4" + "@graphql-tools/utils" "^6.2.4" + "@graphql-tools/wrap" "^6.2.4" + is-promise "4.0.0" + tslib "~2.0.1" + +"@graphql-tools/url-loader@^6.2.4": + version "6.10.1" + resolved "https://registry.yarnpkg.com/@graphql-tools/url-loader/-/url-loader-6.10.1.tgz#dc741e4299e0e7ddf435eba50a1f713b3e763b33" + integrity sha512-DSDrbhQIv7fheQ60pfDpGD256ixUQIR6Hhf9Z5bRjVkXOCvO5XrkwoWLiU7iHL81GB1r0Ba31bf+sl+D4nyyfw== + dependencies: + "@graphql-tools/delegate" "^7.0.1" + "@graphql-tools/utils" "^7.9.0" + "@graphql-tools/wrap" "^7.0.4" + "@microsoft/fetch-event-source" "2.0.1" + "@types/websocket" "1.0.2" + abort-controller "3.0.0" + cross-fetch "3.1.4" + extract-files "9.0.0" + form-data "4.0.0" + graphql-ws "^4.4.1" + is-promise "4.0.0" + isomorphic-ws "4.0.1" + lodash "4.17.21" + meros "1.1.4" + subscriptions-transport-ws "^0.9.18" + sync-fetch "0.3.0" + tslib "~2.2.0" + valid-url "1.0.9" + ws "7.4.5" + +"@graphql-tools/utils@^6.2.4": + version "6.2.4" + resolved "https://registry.yarnpkg.com/@graphql-tools/utils/-/utils-6.2.4.tgz#38a2314d2e5e229ad4f78cca44e1199e18d55856" + integrity sha512-ybgZ9EIJE3JMOtTrTd2VcIpTXtDrn2q6eiYkeYMKRVh3K41+LZa6YnR2zKERTXqTWqhobROwLt4BZbw2O3Aeeg== + dependencies: + "@ardatan/aggregate-error" "0.0.6" + camel-case "4.1.1" + tslib "~2.0.1" + +"@graphql-tools/utils@^7.0.0", "@graphql-tools/utils@^7.1.0", "@graphql-tools/utils@^7.1.2", "@graphql-tools/utils@^7.5.0", "@graphql-tools/utils@^7.7.0", "@graphql-tools/utils@^7.7.1", "@graphql-tools/utils@^7.8.1", "@graphql-tools/utils@^7.9.0", "@graphql-tools/utils@^7.9.1": + version "7.9.1" + resolved "https://registry.yarnpkg.com/@graphql-tools/utils/-/utils-7.9.1.tgz#265e12a0b8a396be97f459599f2f1150fceee4b1" + integrity sha512-k4bQWsOnSJSW7suBnVUJf3Sc8uXuvIYLHXujbEoSrwOEHjC+707GvXbQ7rg+8l7v8NMgpyARyuKFlqz3cfoxBQ== + dependencies: + "@ardatan/aggregate-error" "0.0.6" + camel-case "4.1.2" + tslib "~2.2.0" + +"@graphql-tools/wrap@^6.2.4": + version "6.2.4" + resolved "https://registry.yarnpkg.com/@graphql-tools/wrap/-/wrap-6.2.4.tgz#2709817da6e469753735a9fe038c9e99736b2c57" + integrity sha512-cyQgpybolF9DjL2QNOvTS1WDCT/epgYoiA8/8b3nwv5xmMBQ6/6nYnZwityCZ7njb7MMyk7HBEDNNlP9qNJDcA== + dependencies: + "@graphql-tools/delegate" "^6.2.4" + "@graphql-tools/schema" "^6.2.4" + "@graphql-tools/utils" "^6.2.4" + is-promise "4.0.0" + tslib "~2.0.1" + +"@graphql-tools/wrap@^7.0.4": + version "7.0.8" + resolved "https://registry.yarnpkg.com/@graphql-tools/wrap/-/wrap-7.0.8.tgz#ad41e487135ca3ea1ae0ea04bb3f596177fb4f50" + integrity sha512-1NDUymworsOlb53Qfh7fonDi2STvqCtbeE68ntKY9K/Ju/be2ZNxrFSbrBHwnxWcN9PjISNnLcAyJ1L5tCUyhg== + dependencies: + "@graphql-tools/delegate" "^7.1.5" + "@graphql-tools/schema" "^7.1.5" + "@graphql-tools/utils" "^7.8.1" + tslib "~2.2.0" + value-or-promise "1.0.6" + +"@graphql-typed-document-node/core@^3.0.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@graphql-typed-document-node/core/-/core-3.1.0.tgz#0eee6373e11418bfe0b5638f654df7a4ca6a3950" + integrity sha512-wYn6r8zVZyQJ6rQaALBEln5B1pzxb9shV5Ef97kTvn6yVGrqyXVnDqnU24MXnFubR+rZjBY9NWuxX3FB2sTsjg== + +"@gulp-sourcemaps/map-sources@1.X": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@gulp-sourcemaps/map-sources/-/map-sources-1.0.0.tgz#890ae7c5d8c877f6d384860215ace9d7ec945bda" + integrity sha1-iQrnxdjId/bThIYCFazp1+yUW9o= + dependencies: + normalize-path "^2.0.1" + through2 "^2.0.3" + "@hapi/bourne@^2.0.0": version "2.0.0" resolved "https://registry.yarnpkg.com/@hapi/bourne/-/bourne-2.0.0.tgz#5bb2193eb685c0007540ca61d166d4e1edaf918d" integrity sha512-WEezM1FWztfbzqIUbsDzFRVMxSoLy3HugVcux6KDDtTqzPsLE8NDRHfXvev66aH1i2oOKKar3/XDjbvh/OUBdg== +"@improbable-eng/grpc-web@^0.12.0": + version "0.12.0" + resolved "https://registry.yarnpkg.com/@improbable-eng/grpc-web/-/grpc-web-0.12.0.tgz#9b10a7edf2a1d7672f8997e34a60e7b70e49738f" + integrity sha512-uJjgMPngreRTYPBuo6gswMj1gK39Wbqre/RgE0XnSDXJRg6ST7ZhuS53dFE6Vc2CX4jxgl+cO+0B3op8LA4Q0Q== + dependencies: + browser-headers "^0.4.0" + +"@improbable-eng/grpc-web@^0.13.0": + version "0.13.0" + resolved "https://registry.yarnpkg.com/@improbable-eng/grpc-web/-/grpc-web-0.13.0.tgz#289e6fc4dafc00b1af8e2b93b970e6892299014d" + integrity sha512-vaxxT+Qwb7GPqDQrBV4vAAfH0HywgOLw6xGIKXd9Q8hcV63CQhmS3p4+pZ9/wVvt4Ph3ZDK9fdC983b9aGMUFg== + dependencies: + browser-headers "^0.4.0" + +"@improbable-eng/grpc-web@^0.14.0": + version "0.14.0" + resolved "https://registry.yarnpkg.com/@improbable-eng/grpc-web/-/grpc-web-0.14.0.tgz#a71c5af471dcef6a2810798f71f93ed8d6ac3817" + integrity sha512-ag1PTMWpBZKGi6GrEcZ4lkU5Qag23Xjo10BmnK9qyx4TMmSVcWmQ3rECirfQzm2uogrM9n1M6xfOpFsJP62ivA== + dependencies: + browser-headers "^0.4.1" + +"@josephg/resolvable@^1.0.0": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@josephg/resolvable/-/resolvable-1.0.1.tgz#69bc4db754d79e1a2f17a650d3466e038d94a5eb" + integrity sha512-CtzORUwWTTOTqfVtHaKRJ0I1kNQd1bpn3sUh8I3nJDVY+5/M/Oe1DnEWzPQvqq/xPIIkzzzIP7mfCoAjFRvDhg== + "@ledgerhq/cryptoassets@^5.27.2": version "5.48.0" resolved "https://registry.yarnpkg.com/@ledgerhq/cryptoassets/-/cryptoassets-5.48.0.tgz#43785b64b5bc355f98e60fb0facfc8e3585d52d2" @@ -883,11 +1783,26 @@ rxjs "^6.6.7" semver "^7.3.5" +"@ledgerhq/devices@^5.51.1": + version "5.51.1" + resolved "https://registry.yarnpkg.com/@ledgerhq/devices/-/devices-5.51.1.tgz#d741a4a5d8f17c2f9d282fd27147e6fe1999edb7" + integrity sha512-4w+P0VkbjzEXC7kv8T1GJ/9AVaP9I6uasMZ/JcdwZBS3qwvKo5A5z9uGhP5c7TvItzcmPb44b5Mw2kT+WjUuAA== + dependencies: + "@ledgerhq/errors" "^5.50.0" + "@ledgerhq/logs" "^5.50.0" + rxjs "6" + semver "^7.3.5" + "@ledgerhq/errors@^5.26.0", "@ledgerhq/errors@^5.48.0": version "5.48.0" resolved "https://registry.yarnpkg.com/@ledgerhq/errors/-/errors-5.48.0.tgz#f77e098d9e9bb4443ed57f4a5f46c97fb25f8a7a" integrity sha512-817t7M0hi7j0xY6uuG0F3kjbkaEP9hHlxfDBpb3EWkTvkg5SgHaDmvHYTjUoE1HhaPypHLjEii7URx2boOfQVA== +"@ledgerhq/errors@^5.50.0": + version "5.50.0" + resolved "https://registry.yarnpkg.com/@ledgerhq/errors/-/errors-5.50.0.tgz#e3a6834cb8c19346efca214c1af84ed28e69dad9" + integrity sha512-gu6aJ/BHuRlpU7kgVpy2vcYk6atjB4iauP2ymF7Gk0ez0Y/6VSMVSJvubeEQN+IV60+OBK0JgeIZG7OiHaw8ow== + "@ledgerhq/hw-app-eth@5.27.2": version "5.27.2" resolved "https://registry.yarnpkg.com/@ledgerhq/hw-app-eth/-/hw-app-eth-5.27.2.tgz#65a2ed613a69340e0cd69c942147455ec513d006" @@ -934,6 +1849,16 @@ "@ledgerhq/logs" "^5.26.0" u2f-api "0.2.7" +"@ledgerhq/hw-transport-webusb@^5.22.0": + version "5.51.1" + resolved "https://registry.yarnpkg.com/@ledgerhq/hw-transport-webusb/-/hw-transport-webusb-5.51.1.tgz#664a46dcde36ff78107dea44e32a1647d8e2e93f" + integrity sha512-k35KUlMT8I4X/Zj89sRrIyQ8ApSWSRc/uF/eu6Qv+0cp9mMIty/cfg9v0sBwJ3EA9FHQGY5jJHxJrWPWnZLMOg== + dependencies: + "@ledgerhq/devices" "^5.51.1" + "@ledgerhq/errors" "^5.50.0" + "@ledgerhq/hw-transport" "^5.51.1" + "@ledgerhq/logs" "^5.50.0" + "@ledgerhq/hw-transport@5.26.0": version "5.26.0" resolved "https://registry.yarnpkg.com/@ledgerhq/hw-transport/-/hw-transport-5.26.0.tgz#bfedc3d48400ad2fe48278d9444344b72aa9d0fe" @@ -952,11 +1877,25 @@ "@ledgerhq/errors" "^5.48.0" events "^3.3.0" +"@ledgerhq/hw-transport@^5.51.1": + version "5.51.1" + resolved "https://registry.yarnpkg.com/@ledgerhq/hw-transport/-/hw-transport-5.51.1.tgz#8dd14a8e58cbee4df0c29eaeef983a79f5f22578" + integrity sha512-6wDYdbWrw9VwHIcoDnqWBaDFyviyjZWv6H9vz9Vyhe4Qd7TIFmbTl/eWs6hZvtZBza9K8y7zD8ChHwRI4s9tSw== + dependencies: + "@ledgerhq/devices" "^5.51.1" + "@ledgerhq/errors" "^5.50.0" + events "^3.3.0" + "@ledgerhq/logs@^5.26.0", "@ledgerhq/logs@^5.48.0": version "5.48.0" resolved "https://registry.yarnpkg.com/@ledgerhq/logs/-/logs-5.48.0.tgz#e3628e3d48819ce74f116d6128a5f7324843bcca" integrity sha512-ItOEw1BDsN7q43/uku44izA9y5f6va79KrO5SeYNcojAa3gLn6u02ADLzdHJtuvGEf9DBwCTRPlJmlT7kIaFPQ== +"@ledgerhq/logs@^5.50.0": + version "5.50.0" + resolved "https://registry.yarnpkg.com/@ledgerhq/logs/-/logs-5.50.0.tgz#29c6419e8379d496ab6d0426eadf3c4d100cd186" + integrity sha512-swKHYCOZUGyVt4ge0u8a7AwNcA//h4nx5wIi0sruGye1IJ5Cva0GyK9L2/WdX+kWVTKp92ZiEo1df31lrWGPgA== + "@lerna/add@4.0.0": version "4.0.0" resolved "https://registry.yarnpkg.com/@lerna/add/-/add-4.0.0.tgz#c36f57d132502a57b9e7058d1548b7a565ef183f" @@ -1649,6 +2588,26 @@ globby "^11.0.0" read-yaml-file "^1.1.0" +"@microsoft/fetch-event-source@2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@microsoft/fetch-event-source/-/fetch-event-source-2.0.1.tgz#9ceecc94b49fbaa15666e38ae8587f64acce007d" + integrity sha512-W6CLUJ2eBMw3Rec70qrsEW0jOm/3twwJv21mrmj2yORiaVmVYGS4sSS5yUwvQc1ZlDLYGPnClVWmUUMagKNsfA== + +"@multiformats/base-x@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@multiformats/base-x/-/base-x-4.0.1.tgz#95ff0fa58711789d53aefb2590a8b7a4e715d121" + integrity sha512-eMk0b9ReBbV23xXU693TAIrLyeO5iTgBZGSJfpqriG8UkYvr/hC9u9pyMlAakDNHWmbhMZCDs6KQO0jzKD8OTw== + +"@nodefactory/filsnap-adapter@^0.2.1": + version "0.2.2" + resolved "https://registry.yarnpkg.com/@nodefactory/filsnap-adapter/-/filsnap-adapter-0.2.2.tgz#0e182150ce3825b6c26b8512ab9355ab7759b498" + integrity sha512-nbaYMwVopOXN2bWOdDY3il6gGL9qMuCmMN4WPuoxzJjSnAMJNqEeSe6MNNJ/fYBLipZcJfAtirNXRrFLFN+Tvw== + +"@nodefactory/filsnap-types@^0.2.1": + version "0.2.2" + resolved "https://registry.yarnpkg.com/@nodefactory/filsnap-types/-/filsnap-types-0.2.2.tgz#f95cbf93ce5815d8d151c60663940086b015cb8f" + integrity sha512-XT1tE2vrYF2D0tSNNekgjqKRpqPQn4W72eKul9dDCul/8ykouhqnVTyjFHYvBhlBWE0PK3nmG7i83QvhgGSiMw== + "@nodelib/fs.scandir@2.1.4": version "2.1.4" resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz#d4b3549a5db5de2683e0c1071ab4f140904bbf69" @@ -1881,6 +2840,108 @@ resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-3.4.1.tgz#03c891fec7f93be0ae44ed74e57a122a38732ce7" integrity sha512-cUriqMauq1ylzP2TxePNdPqkwI7Le3Annh4K9rrpvKfSBB/bdW+Iu1ihBaTIABTAAJ85LmKL5SSPPL9ry8d1gQ== +"@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@protobufjs/aspromise/-/aspromise-1.1.2.tgz#9b8b0cc663d669a7d8f6f5d0893a14d348f30fbf" + integrity sha1-m4sMxmPWaafY9vXQiToU00jzD78= + +"@protobufjs/base64@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@protobufjs/base64/-/base64-1.1.2.tgz#4c85730e59b9a1f1f349047dbf24296034bb2735" + integrity sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg== + +"@protobufjs/codegen@^2.0.4": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@protobufjs/codegen/-/codegen-2.0.4.tgz#7ef37f0d010fb028ad1ad59722e506d9262815cb" + integrity sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg== + +"@protobufjs/eventemitter@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz#355cbc98bafad5978f9ed095f397621f1d066b70" + integrity sha1-NVy8mLr61ZePntCV85diHx0Ga3A= + +"@protobufjs/fetch@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/fetch/-/fetch-1.1.0.tgz#ba99fb598614af65700c1619ff06d454b0d84c45" + integrity sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU= + dependencies: + "@protobufjs/aspromise" "^1.1.1" + "@protobufjs/inquire" "^1.1.0" + +"@protobufjs/float@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@protobufjs/float/-/float-1.0.2.tgz#5e9e1abdcb73fc0a7cb8b291df78c8cbd97b87d1" + integrity sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E= + +"@protobufjs/inquire@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/inquire/-/inquire-1.1.0.tgz#ff200e3e7cf2429e2dcafc1140828e8cc638f089" + integrity sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik= + +"@protobufjs/path@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@protobufjs/path/-/path-1.1.2.tgz#6cc2b20c5c9ad6ad0dccfd21ca7673d8d7fbf68d" + integrity sha1-bMKyDFya1q0NzP0hynZz2Nf79o0= + +"@protobufjs/pool@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/pool/-/pool-1.1.0.tgz#09fd15f2d6d3abfa9b65bc366506d6ad7846ff54" + integrity sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q= + +"@protobufjs/utf8@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" + integrity sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA= + +"@redux-saga/core@^1.0.0": + version "1.1.3" + resolved "https://registry.yarnpkg.com/@redux-saga/core/-/core-1.1.3.tgz#3085097b57a4ea8db5528d58673f20ce0950f6a4" + integrity sha512-8tInBftak8TPzE6X13ABmEtRJGjtK17w7VUs7qV17S8hCO5S3+aUTWZ/DBsBJPdE8Z5jOPwYALyvofgq1Ws+kg== + dependencies: + "@babel/runtime" "^7.6.3" + "@redux-saga/deferred" "^1.1.2" + "@redux-saga/delay-p" "^1.1.2" + "@redux-saga/is" "^1.1.2" + "@redux-saga/symbols" "^1.1.2" + "@redux-saga/types" "^1.1.0" + redux "^4.0.4" + typescript-tuple "^2.2.1" + +"@redux-saga/deferred@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@redux-saga/deferred/-/deferred-1.1.2.tgz#59937a0eba71fff289f1310233bc518117a71888" + integrity sha512-908rDLHFN2UUzt2jb4uOzj6afpjgJe3MjICaUNO3bvkV/kN/cNeI9PMr8BsFXB/MR8WTAZQq/PlTq8Kww3TBSQ== + +"@redux-saga/delay-p@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@redux-saga/delay-p/-/delay-p-1.1.2.tgz#8f515f4b009b05b02a37a7c3d0ca9ddc157bb355" + integrity sha512-ojc+1IoC6OP65Ts5+ZHbEYdrohmIw1j9P7HS9MOJezqMYtCDgpkoqB5enAAZrNtnbSL6gVCWPHaoaTY5KeO0/g== + dependencies: + "@redux-saga/symbols" "^1.1.2" + +"@redux-saga/is@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@redux-saga/is/-/is-1.1.2.tgz#ae6c8421f58fcba80faf7cadb7d65b303b97e58e" + integrity sha512-OLbunKVsCVNTKEf2cH4TYyNbbPgvmZ52iaxBD4I1fTif4+MTXMa4/Z07L83zW/hTCXwpSZvXogqMqLfex2Tg6w== + dependencies: + "@redux-saga/symbols" "^1.1.2" + "@redux-saga/types" "^1.1.0" + +"@redux-saga/symbols@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@redux-saga/symbols/-/symbols-1.1.2.tgz#216a672a487fc256872b8034835afc22a2d0595d" + integrity sha512-EfdGnF423glv3uMwLsGAtE6bg+R9MdqlHEzExnfagXPrIiuxwr3bdiAwz3gi+PsrQ3yBlaBpfGLtDG8rf3LgQQ== + +"@redux-saga/types@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@redux-saga/types/-/types-1.1.0.tgz#0e81ce56b4883b4b2a3001ebe1ab298b84237204" + integrity sha512-afmTuJrylUU/0OtqzaRkbyYFFNgCF73Bvel/sw90pvGrWIZ+vyoIJqA6eMSoA6+nb443kTmulmBtC9NerXboNg== + +"@repeaterjs/repeater@^3.0.4": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@repeaterjs/repeater/-/repeater-3.0.4.tgz#a04d63f4d1bf5540a41b01a921c9a7fddc3bd1ca" + integrity sha512-AW8PKd6iX3vAZ0vA43nOUOnbq/X5ihgU+mSXXqunMkeQADGiqw/PY0JNeYtD5sr0PAy51YPgAPbDoeapv9r8WA== + "@resolver-engine/core@^0.3.3": version "0.3.3" resolved "https://registry.yarnpkg.com/@resolver-engine/core/-/core-0.3.3.tgz#590f77d85d45bc7ecc4e06c654f41345db6ca967" @@ -2214,35 +3275,547 @@ dependencies: defer-to-connect "^1.0.1" -"@tootallnate/once@1": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" - integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== +"@textile/buckets-grpc@2.6.5": + version "2.6.5" + resolved "https://registry.yarnpkg.com/@textile/buckets-grpc/-/buckets-grpc-2.6.5.tgz#42ed152c19d65766c1da5046cd1532f6eeb873cb" + integrity sha512-jySQPKJvqeyeVJZIx4BUlgi3MHxKvVpyV1NtoZXserItLbNNPURaFuCeLi7ujAXjGWIcMMJMbcFfSsetDVvrOQ== + dependencies: + "@improbable-eng/grpc-web" "^0.13.0" + "@types/google-protobuf" "^3.7.4" + google-protobuf "^3.13.0" -"@truffle/error@^0.0.12": - version "0.0.12" - resolved "https://registry.yarnpkg.com/@truffle/error/-/error-0.0.12.tgz#83e02e6ffe1d154fe274141d90038a91fd1e186d" - integrity sha512-kZqqnPR9YDJG7KCDOcN1qH16Qs0oz1PzF0Y93AWdhXuL9S9HYo/RUUeqGKbPpRBEZldQUS8aa4EzfK08u5pu6g== +"@textile/buckets@^6.0.5": + version "6.0.5" + resolved "https://registry.yarnpkg.com/@textile/buckets/-/buckets-6.0.5.tgz#0d7c27a4545e4d4cc5ec59d7d422ea3f6a99c052" + integrity sha512-MJum/qLGPE13Ew0uhoNI4Wp2SdDCdmfp35JFEBHU4Uisna0PZ4lfOFXZVA/cVVgw5g94NOm1KS0FXQKu0x8prw== + dependencies: + "@improbable-eng/grpc-web" "^0.13.0" + "@repeaterjs/repeater" "^3.0.4" + "@textile/buckets-grpc" "2.6.5" + "@textile/context" "^0.11.1" + "@textile/crypto" "^4.1.1" + "@textile/grpc-authentication" "^3.3.4" + "@textile/grpc-connection" "^2.4.1" + "@textile/grpc-transport" "^0.4.0" + "@textile/hub-grpc" "2.6.5" + "@textile/hub-threads-client" "^5.3.4" + "@textile/security" "^0.8.1" + "@textile/threads-id" "^0.5.1" + abort-controller "^3.0.0" + cids "^1.1.4" + it-drain "^1.0.3" + loglevel "^1.6.8" + paramap-it "^0.1.1" -"@truffle/interface-adapter@^0.4.19": - version "0.4.19" - resolved "https://registry.yarnpkg.com/@truffle/interface-adapter/-/interface-adapter-0.4.19.tgz#19248ac88099f8df34f58a3d43a95ba3470dc89a" - integrity sha512-+Zz6Fr8+I2wYSS8RM3WBOMzf22QffMQTnlsYsRgRHzv3gYoRA9ZDLb84lFRfmWyw+IdXTo90tjRHEb5krC6uxg== +"@textile/context@^0.11.1": + version "0.11.1" + resolved "https://registry.yarnpkg.com/@textile/context/-/context-0.11.1.tgz#216b72586dd559a42c00d93e3fb99fbc3b804a38" + integrity sha512-XP1cBT5OaJVt8LrTCzE/OffnmE4ImwDXiGG7kzU5gCRSx5ftafEwgOOjbQA3HRPl7nWW1YdBsiZf35xSM1KmoQ== dependencies: - bn.js "^5.1.3" - ethers "^4.0.32" - source-map-support "^0.5.19" - web3 "1.2.9" + "@improbable-eng/grpc-web" "^0.13.0" + "@textile/security" "^0.8.1" -"@truffle/provider@^0.2.24": - version "0.2.26" - resolved "https://registry.yarnpkg.com/@truffle/provider/-/provider-0.2.26.tgz#88e31b79973c2427c4a17d9a59411e6fbc810190" - integrity sha512-YKPmhB9S9AQkT2ePGtadwjDduxU23DXXy+5zyM5fevw5GCbXSnf+jG6rICXjPkVFjuKBlXuq5JbuERZn43522Q== +"@textile/crypto@^4.1.1": + version "4.1.1" + resolved "https://registry.yarnpkg.com/@textile/crypto/-/crypto-4.1.1.tgz#ab77117bbc66dc5842827ab37670a0d170bd7404" + integrity sha512-n/SxZyNvAD4FEyfX1HXtyNDcK+stUYur0vgwIoi5NzT6jP6gwhFVzf8NI3TBNIP2rInCAuF3Qks8hWS+LWL/YA== + dependencies: + "@types/ed2curve" "^0.2.2" + ed2curve "^0.3.0" + fastestsmallesttextencoderdecoder "^1.0.22" + multibase "^3.1.0" + tweetnacl "^1.0.3" + +"@textile/grpc-authentication@^3.3.4": + version "3.3.4" + resolved "https://registry.yarnpkg.com/@textile/grpc-authentication/-/grpc-authentication-3.3.4.tgz#6b7a31fb1183fee3c338e167fa33dcf80e095a87" + integrity sha512-E7pw+MDNu7oWFWiTqDuLZncei+GIwnlSXlRlrRUXITZrf9vBiY+QHKkDrhLyhBpaLGazqB0PERzOFx8a0BYlbw== + dependencies: + "@textile/context" "^0.11.1" + "@textile/crypto" "^4.1.1" + "@textile/grpc-connection" "^2.4.1" + "@textile/hub-threads-client" "^5.3.4" + "@textile/security" "^0.8.1" + +"@textile/grpc-connection@^2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@textile/grpc-connection/-/grpc-connection-2.4.1.tgz#eacc2fe5e212d64d35aa7030d2313041b613ef81" + integrity sha512-8+y9PFcl9VBCludEpXvzputIis3lKYAzExdm8+zvtrr9uv0dCovIS0bu2GJoqU6DJkQSVBP9PA4V6T9THuQpjQ== + dependencies: + "@improbable-eng/grpc-web" "^0.12.0" + "@textile/context" "^0.11.1" + "@textile/grpc-transport" "^0.4.0" + +"@textile/grpc-powergate-client@^2.3.0": + version "2.4.0" + resolved "https://registry.yarnpkg.com/@textile/grpc-powergate-client/-/grpc-powergate-client-2.4.0.tgz#db1377c47b46180b7277250f7d908f5fd05566ba" + integrity sha512-yDWHUKqHOO4Zs4dIYCY/2stQpabYOe+7EBARrn6VYXklXMQGBznOdOO3HsR8X335WOj8JHcxKvWKOW8J7cYNFw== + dependencies: + "@improbable-eng/grpc-web" "^0.14.0" + "@types/google-protobuf" "^3.7.4" + google-protobuf "^3.15.6" + +"@textile/grpc-transport@^0.4.0": + version "0.4.0" + resolved "https://registry.yarnpkg.com/@textile/grpc-transport/-/grpc-transport-0.4.0.tgz#96013613ceb8c961bd7b7b1c7764783ed8c932f4" + integrity sha512-OyHyv963Y0y1qlMkuIp7urWCKbCL0Tjn06ffFo+u82yy6G1YprjTQDE980dUGQMZfK1EF2/OTjqZb04PxHa5zQ== + dependencies: + "@improbable-eng/grpc-web" "^0.13.0" + "@types/ws" "^7.2.6" + isomorphic-ws "^4.0.1" + loglevel "^1.6.6" + ws "^7.2.1" + +"@textile/hub-filecoin@^2.0.5": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@textile/hub-filecoin/-/hub-filecoin-2.0.5.tgz#c610a1c2fb3a6d81586e840bb7a7fb46cbebed44" + integrity sha512-5qwm3aMeR5q6KBbY1tVagUynMDw/Irh6jijgtlv66kQ+CbV4TgQjLsIH14UQkgcAW5hj1CMfqPIabLaBXFtDlA== + dependencies: + "@improbable-eng/grpc-web" "^0.12.0" + "@textile/context" "^0.11.1" + "@textile/crypto" "^4.1.1" + "@textile/grpc-authentication" "^3.3.4" + "@textile/grpc-connection" "^2.4.1" + "@textile/grpc-powergate-client" "^2.3.0" + "@textile/hub-grpc" "2.6.5" + "@textile/security" "^0.8.1" + event-iterator "^2.0.0" + loglevel "^1.6.8" + +"@textile/hub-grpc@2.6.5": + version "2.6.5" + resolved "https://registry.yarnpkg.com/@textile/hub-grpc/-/hub-grpc-2.6.5.tgz#9ba6596a18bf66f0c0e830826b97ce673113759a" + integrity sha512-BFjhkBOQD1CebGjP4Hys/6Z5OlzepZTbC11kUSuLG6mt4rb2JiDNw25/UUzylsJCkpyAusob2sttJ9GUh/lv+g== + dependencies: + "@improbable-eng/grpc-web" "^0.13.0" + "@types/google-protobuf" "^3.7.4" + google-protobuf "^3.13.0" + +"@textile/hub-threads-client@^5.3.4": + version "5.3.4" + resolved "https://registry.yarnpkg.com/@textile/hub-threads-client/-/hub-threads-client-5.3.4.tgz#ad94d35dd5da1271f6cd4ef06c04c8dd0828a02b" + integrity sha512-bKbpavWOg2bH9Zuf/aSmg7YOfKzx9yL7xmvPYo1FBaVcos8XeZvsN2gA80oFzTfm88e6xvotNNcRy7GktGDWIQ== + dependencies: + "@improbable-eng/grpc-web" "^0.13.0" + "@textile/context" "^0.11.1" + "@textile/hub-grpc" "2.6.5" + "@textile/security" "^0.8.1" + "@textile/threads-client" "^2.1.2" + "@textile/threads-id" "^0.5.1" + "@textile/users-grpc" "2.6.5" + loglevel "^1.7.0" + +"@textile/hub@^6.0.2": + version "6.1.2" + resolved "https://registry.yarnpkg.com/@textile/hub/-/hub-6.1.2.tgz#d200c5bb7e5d285e613f8c8a509291a5ebd21447" + integrity sha512-BnmF1539+/939BmmHt+X7TzSrDgD3vkP5tBHZKksjppJn6q+6BJOPYdmWapt6S9YOTQAoCcYkkcr+xUdN8z3mA== + dependencies: + "@textile/buckets" "^6.0.5" + "@textile/crypto" "^4.1.1" + "@textile/grpc-authentication" "^3.3.4" + "@textile/hub-filecoin" "^2.0.5" + "@textile/hub-grpc" "2.6.5" + "@textile/hub-threads-client" "^5.3.4" + "@textile/security" "^0.8.1" + "@textile/threads-id" "^0.5.1" + "@textile/users" "^6.0.4" + loglevel "^1.6.8" + multihashes "3.1.2" + +"@textile/multiaddr@^0.5.1": + version "0.5.1" + resolved "https://registry.yarnpkg.com/@textile/multiaddr/-/multiaddr-0.5.1.tgz#a31c4a72ab2e246571ee8bd5d4fcdb2d350dd79d" + integrity sha512-i/lBZ9j+MgxqcjLl+4lbOCbw5dU3Vbn39aGKma8yBILLPbmCAWWUDGzk5+Rbcnk3giuPBM/nNhJLLSeKzK+rhA== + dependencies: + "@textile/threads-id" "^0.5.1" + multiaddr "^8.1.2" + varint "^6.0.0" + +"@textile/security@^0.8.1": + version "0.8.1" + resolved "https://registry.yarnpkg.com/@textile/security/-/security-0.8.1.tgz#4b8815eeedfd76ed95cd920fb361fbec50c560d1" + integrity sha512-FVoBRP7DAL+lh1+CyUQPE3ceG8HO3LMClTPYuNjW+2BAOR+KiKf5vFbeSpe29l6p+A9LF5/r2KWz7bN5cqCs8w== + dependencies: + "@consento/sync-randombytes" "^1.0.5" + fast-sha256 "^1.3.0" + fastestsmallesttextencoderdecoder "^1.0.22" + multibase "^3.1.0" + +"@textile/threads-client-grpc@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@textile/threads-client-grpc/-/threads-client-grpc-1.0.2.tgz#5d6ee09431eef2eb582f116bb3b48698e9fedc99" + integrity sha512-yrgdUb3VLGW18HKmbzAU8L7NElhnPYKWG9cHZG6EnV3ITS9zOiDydfVSNSkojEDfoFSel5x3eAUiOQbXUrkKng== + dependencies: + "@improbable-eng/grpc-web" "^0.13.0" + "@types/google-protobuf" "^3.7.3" + google-protobuf "^3.13.0" + +"@textile/threads-client@^2.1.2": + version "2.1.2" + resolved "https://registry.yarnpkg.com/@textile/threads-client/-/threads-client-2.1.2.tgz#7c8be5c7f28108c61e8f29066f31a375975e518b" + integrity sha512-N4ItF3hxKmdC3oA1dAENw9uA7Q89q86/foYiNaXLPq5KJ1B3IYP3GdXjxe56wkT6dRRniCIREkRnqDdwVpRtQA== + dependencies: + "@improbable-eng/grpc-web" "^0.13.0" + "@textile/context" "^0.11.1" + "@textile/crypto" "^4.1.1" + "@textile/grpc-transport" "^0.4.0" + "@textile/multiaddr" "^0.5.1" + "@textile/security" "^0.8.1" + "@textile/threads-client-grpc" "^1.0.2" + "@textile/threads-id" "^0.5.1" + "@types/to-json-schema" "^0.2.0" + fastestsmallesttextencoderdecoder "^1.0.22" + to-json-schema "^0.2.5" + +"@textile/threads-id@^0.5.1": + version "0.5.1" + resolved "https://registry.yarnpkg.com/@textile/threads-id/-/threads-id-0.5.1.tgz#fa200244429c5e9a17630d1a23b28d2b958b5295" + integrity sha512-Nyvp24RsHarLBT3JxEI5akshcKKXA4Yx851bAooReE5G/40cijMuxTeVK4hDM0HdTex4PZRYozpPRXIDFDA96Q== + dependencies: + "@consento/sync-randombytes" "^1.0.4" + multibase "^3.1.0" + varint "^6.0.0" + +"@textile/users-grpc@2.6.5": + version "2.6.5" + resolved "https://registry.yarnpkg.com/@textile/users-grpc/-/users-grpc-2.6.5.tgz#ab5fb1d9f6a8571ea81af8bb63f90207e6f2aa56" + integrity sha512-JMxkze3eyxyuxhbuMrqdbVTqp5wQmv1YoXAq1gJdAYYpcOX5S4ov6arI5NPy3weF3+KP3U+BX/HdR8dIvkFAcw== + dependencies: + "@improbable-eng/grpc-web" "^0.13.0" + "@types/google-protobuf" "^3.7.4" + google-protobuf "^3.13.0" + +"@textile/users@^6.0.4": + version "6.0.4" + resolved "https://registry.yarnpkg.com/@textile/users/-/users-6.0.4.tgz#93b6c0ef738fb6cabd00b42a6559087b4740b8ae" + integrity sha512-/aDwdcsvpW0QrUuXmRAAg41oGjGebwMUGK5czY0gcI/+Av6W8PicHJk4O9ft5ByfwXWzUMyz3ODWH45OYi0TVQ== + dependencies: + "@improbable-eng/grpc-web" "^0.13.0" + "@textile/buckets-grpc" "2.6.5" + "@textile/context" "^0.11.1" + "@textile/crypto" "^4.1.1" + "@textile/grpc-authentication" "^3.3.4" + "@textile/grpc-connection" "^2.4.1" + "@textile/grpc-transport" "^0.4.0" + "@textile/hub-grpc" "2.6.5" + "@textile/hub-threads-client" "^5.3.4" + "@textile/security" "^0.8.1" + "@textile/threads-id" "^0.5.1" + "@textile/users-grpc" "2.6.5" + event-iterator "^2.0.0" + loglevel "^1.7.0" + +"@tootallnate/once@1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" + integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== + +"@truffle/abi-utils@^0.2.1": + version "0.2.1" + resolved "https://registry.yarnpkg.com/@truffle/abi-utils/-/abi-utils-0.2.1.tgz#c34e4c5c9605f59282d8c99c49c38c16cdf89f08" + integrity sha512-Ba05gGBzTqjzgpQ8Fpfny47HD3aMn7+LWZ44A0HXdMgn1d5bxjR8SPYlXV5jo5fpOOvsghfQTvSUk0G9fg2fIg== + dependencies: + change-case "3.0.2" + faker "^5.3.1" + fast-check "^2.12.1" + +"@truffle/code-utils@^1.2.27": + version "1.2.27" + resolved "https://registry.yarnpkg.com/@truffle/code-utils/-/code-utils-1.2.27.tgz#5ae7a9107194104d6b3c1c30b96a911f8dbe7b21" + integrity sha512-1vnJYup1KDlXWsDbEinMFhWN1VyqRWxWzDN4UhdfqCUXrEWDBpGmKeEPLwwKYuUBY43TDPpnwq1/cGGN0PjOeA== + dependencies: + cbor "^5.1.0" + +"@truffle/codec@^0.10.6": + version "0.10.6" + resolved "https://registry.yarnpkg.com/@truffle/codec/-/codec-0.10.6.tgz#38e85e098c1ac13892a095b6ed823c6ff5d85a2d" + integrity sha512-laKk5iL2Y9W0ndNnFAy2f3tuhwYV4PlQf1aZO3mlxk0QgCVkhS1G+p/b2xsJp75CI1PVVvEfGwjshQk8qL04wA== + dependencies: + big.js "^5.2.2" + bn.js "^5.1.3" + cbor "^5.1.0" + debug "^4.3.1" + lodash.clonedeep "^4.5.0" + lodash.escaperegexp "^4.1.2" + lodash.partition "^4.6.0" + lodash.sum "^4.0.2" + semver "^7.3.4" + utf8 "^3.0.0" + web3-utils "1.3.5" + +"@truffle/config@^1.2.39": + version "1.2.39" + resolved "https://registry.yarnpkg.com/@truffle/config/-/config-1.2.39.tgz#4b8aa86f274465b5bd1cddf2849d4b3832c96979" + integrity sha512-77STNPnLkEs+Kp4x0DM3JeoWF5veoM5r1idN28qZ3mZ1fO4jmK8WL21Cxe1ODQwLbdtJOMlBMY5ST+Pju/yWSg== + dependencies: + "@truffle/error" "^0.0.14" + "@truffle/events" "^0.0.10" + "@truffle/provider" "^0.2.30" + configstore "^4.0.0" + find-up "^2.1.0" + lodash.assignin "^4.2.0" + lodash.merge "^4.6.2" + module "^1.2.5" + original-require "^1.0.1" + +"@truffle/db@^0.5.11": + version "0.5.11" + resolved "https://registry.yarnpkg.com/@truffle/db/-/db-0.5.11.tgz#1941dcd650b50f48bae3cae056b58d5cc032c804" + integrity sha512-wQA0KNxeiIy+3us8Uqf5dqk6TvCJ5qoopQZxPK3rdc8pi1hNT5KbXskgOR+IlANoYRZxjKGEvlsI2yUHZiD4pA== + dependencies: + "@truffle/abi-utils" "^0.2.1" + "@truffle/code-utils" "^1.2.27" + "@truffle/config" "^1.2.39" + apollo-server "^2.18.2" + debug "^4.3.1" + fs-extra "^9.1.0" + graphql "^15.3.0" + graphql-tag "^2.11.0" + graphql-tools "^6.2.4" + json-stable-stringify "^1.0.1" + jsondown "^1.0.0" + pascal-case "^2.0.1" + pluralize "^8.0.0" + pouchdb "7.1.1" + pouchdb-adapter-memory "^7.1.1" + pouchdb-adapter-node-websql "^7.0.0" + pouchdb-debug "^7.1.1" + pouchdb-find "^7.0.0" + web3-utils "1.3.5" + +"@truffle/debugger@^8.0.25": + version "8.0.25" + resolved "https://registry.yarnpkg.com/@truffle/debugger/-/debugger-8.0.25.tgz#080b19422eb473849e6b81751e88daa6bc5ad410" + integrity sha512-iUZgVbLmXO/Pap6APnN7yfu9i+Z1GT1koS3KNiB65cHHdh4ZRXxkMQl/YbVUBiBCIVA2K4edUvvN9g5buKOyCQ== + dependencies: + "@truffle/abi-utils" "^0.2.1" + "@truffle/codec" "^0.10.6" + "@truffle/source-map-utils" "^1.3.40" + bn.js "^5.1.3" + debug "^4.3.1" + json-pointer "^0.6.0" + json-stable-stringify "^1.0.1" + lodash.flatten "^4.4.0" + lodash.merge "^4.6.2" + lodash.sum "^4.0.2" + lodash.zipwith "^4.2.0" + redux "^3.7.2" + redux-cli-logger "^2.0.1" + redux-saga "1.0.0" + remote-redux-devtools "^0.5.12" + reselect-tree "^1.3.4" + semver "^7.3.4" + web3 "1.3.5" + web3-eth-abi "1.3.5" + +"@truffle/error@^0.0.12": + version "0.0.12" + resolved "https://registry.yarnpkg.com/@truffle/error/-/error-0.0.12.tgz#83e02e6ffe1d154fe274141d90038a91fd1e186d" + integrity sha512-kZqqnPR9YDJG7KCDOcN1qH16Qs0oz1PzF0Y93AWdhXuL9S9HYo/RUUeqGKbPpRBEZldQUS8aa4EzfK08u5pu6g== + +"@truffle/error@^0.0.14": + version "0.0.14" + resolved "https://registry.yarnpkg.com/@truffle/error/-/error-0.0.14.tgz#59683b5407bede7bddf16d80dc5592f9c5e5fa05" + integrity sha512-utJx+SZYoMqk8wldQG4gCVKhV8GwMJbWY7sLXFT/D8wWZTnE2peX7URFJh/cxkjTRCO328z1s2qewkhyVsu2HA== + +"@truffle/events@^0.0.10": + version "0.0.10" + resolved "https://registry.yarnpkg.com/@truffle/events/-/events-0.0.10.tgz#7c5623ebfd1a61c6ac821b965e025ba6a682246b" + integrity sha512-sfBnf/MtN1TlfnTNbe1A/PcUM4PUdR35GVhYzahwjHajgKhbYV32y5cbeXNM2UagEQLPv0kO2z9hkrJU5H1O1Q== + dependencies: + emittery "^0.4.1" + ora "^3.4.0" + +"@truffle/hdwallet-provider@^1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@truffle/hdwallet-provider/-/hdwallet-provider-1.4.0.tgz#8b937d0688eebc049db4ab0e9ed895598b9b4d48" + integrity sha512-zCc4IWEtfAuKWWktZOaYFoHCvameQIz5Bk+S2ahCPxYMlWECWrbCMjoqqLojB1Hyz+IsvU1cspmr3E6PoO4ZmQ== + dependencies: + "@trufflesuite/web3-provider-engine" "15.0.13-1" + any-promise "^1.3.0" + bindings "^1.5.0" + ethereum-cryptography "^0.1.3" + ethereum-protocol "^1.0.1" + ethereumjs-common "^1.5.0" + ethereumjs-tx "^2.1.2" + ethereumjs-util "^6.1.0" + ethereumjs-wallet "^1.0.1" + +"@truffle/interface-adapter@^0.4.19": + version "0.4.19" + resolved "https://registry.yarnpkg.com/@truffle/interface-adapter/-/interface-adapter-0.4.19.tgz#19248ac88099f8df34f58a3d43a95ba3470dc89a" + integrity sha512-+Zz6Fr8+I2wYSS8RM3WBOMzf22QffMQTnlsYsRgRHzv3gYoRA9ZDLb84lFRfmWyw+IdXTo90tjRHEb5krC6uxg== + dependencies: + bn.js "^5.1.3" + ethers "^4.0.32" + source-map-support "^0.5.19" + web3 "1.2.9" + +"@truffle/interface-adapter@^0.4.23": + version "0.4.23" + resolved "https://registry.yarnpkg.com/@truffle/interface-adapter/-/interface-adapter-0.4.23.tgz#9b474bb0455df1f02d72bf5a08f3d70b6fef875d" + integrity sha512-mfpwY25Apx36WHHNJMNHWyDQVFZoZYNQ43rOwr/n+5gAMxke7+D7+IR9UW4kuO/Jp0+2848UxMdRV+oqm017kQ== + dependencies: + bn.js "^5.1.3" + ethers "^4.0.32" + web3 "1.3.5" + +"@truffle/preserve-fs@^0.2.2": + version "0.2.2" + resolved "https://registry.yarnpkg.com/@truffle/preserve-fs/-/preserve-fs-0.2.2.tgz#18a6d5a8171133f1c62971f0592664554f267ab0" + integrity sha512-t5YPqVfdEdpC85QRGxWPmgq8/iC4dDE2PSmmt0KKwtSx2kVw+DCXLUdl82T6Bp5En5Hbg8Pwehi1h37OAJ7dWQ== + dependencies: + "@truffle/preserve" "^0.2.2" + +"@truffle/preserve-to-buckets@^0.2.2": + version "0.2.2" + resolved "https://registry.yarnpkg.com/@truffle/preserve-to-buckets/-/preserve-to-buckets-0.2.2.tgz#0d43e4d6f4fc4a0251c2cb6e7d65b7be8ded69fa" + integrity sha512-VxfnLQ4NDt2t/MrM3FAt1TfOHzkusgPgyltO/cTFYDj+ljXWlECPY9XZgQ60kpWLbNzq6SXjJuWYnCYEmTxghA== + dependencies: + "@textile/hub" "^6.0.2" + "@truffle/preserve" "^0.2.2" + cids "^1.1.5" + ipfs-http-client "^48.2.2" + isomorphic-ws "^4.0.1" + iter-tools "^7.0.2" + ws "^7.4.3" + +"@truffle/preserve-to-filecoin@^0.2.2": + version "0.2.2" + resolved "https://registry.yarnpkg.com/@truffle/preserve-to-filecoin/-/preserve-to-filecoin-0.2.2.tgz#3b4a27e8c74982fbd0366c85b608488faf6d7278" + integrity sha512-cg5uFp1HTlVpVH0dTpv+0nR6v0SZP6673m2NaFOjYpTtbN4AA+ijvXd0XPdDNitw/6So+vDcPpzuE79RkY5zSg== + dependencies: + "@truffle/preserve" "^0.2.2" + cids "^1.1.5" + delay "^5.0.0" + filecoin.js "^0.0.5-alpha" + node-fetch "^2.6.0" + +"@truffle/preserve-to-ipfs@^0.2.2": + version "0.2.2" + resolved "https://registry.yarnpkg.com/@truffle/preserve-to-ipfs/-/preserve-to-ipfs-0.2.2.tgz#f7ec4f63bb0d52c9da22aa604161ff93dd26d8d0" + integrity sha512-6y/237oLtkJbDRJb1Lj6xblz1iaQXfbjJdvtTAxwX3Z9bcMQmv33pDaUTEgkYXc+dYaOf8hQi511xEoqJXQx6A== + dependencies: + "@truffle/preserve" "^0.2.2" + cids "^1.1.5" + ipfs-http-client "^48.2.2" + iter-tools "^7.0.2" + +"@truffle/preserve@^0.2.2": + version "0.2.2" + resolved "https://registry.yarnpkg.com/@truffle/preserve/-/preserve-0.2.2.tgz#b68814ff338fbb44799e3d354af954beec17cb4f" + integrity sha512-yg2AII9X2o9kwLvMXGJ9jcmrIhKtMynXFP19LacA27MAOV/v+xjauXL9irfcd/9zpSv2b1DACYbeTyufpsatvw== + dependencies: + spinnies "^0.5.1" + +"@truffle/provider@^0.2.24": + version "0.2.26" + resolved "https://registry.yarnpkg.com/@truffle/provider/-/provider-0.2.26.tgz#88e31b79973c2427c4a17d9a59411e6fbc810190" + integrity sha512-YKPmhB9S9AQkT2ePGtadwjDduxU23DXXy+5zyM5fevw5GCbXSnf+jG6rICXjPkVFjuKBlXuq5JbuERZn43522Q== dependencies: "@truffle/error" "^0.0.12" "@truffle/interface-adapter" "^0.4.19" web3 "1.2.9" +"@truffle/provider@^0.2.30": + version "0.2.30" + resolved "https://registry.yarnpkg.com/@truffle/provider/-/provider-0.2.30.tgz#c2f7d84e698e1d200f48d1349683ee5dee693808" + integrity sha512-5ScTbWsrm7zmQjw020T41U30/kYA1LppXAtaeucUGN2jvPrSwlh0aTL18makbqftTx1NRuYKw7C8wO4jCKQSUQ== + dependencies: + "@truffle/error" "^0.0.14" + "@truffle/interface-adapter" "^0.4.23" + web3 "1.3.5" + +"@truffle/source-map-utils@^1.3.40": + version "1.3.40" + resolved "https://registry.yarnpkg.com/@truffle/source-map-utils/-/source-map-utils-1.3.40.tgz#027b590d774ef550bdd94f2e42d66d58ea844a29" + integrity sha512-Dlg+f5EMbHClt08FPM+a4AUaXv8BKLWTJdvnv0fUgMTG9z1xHh6bcoY2ETkgG+yf/+U18HGj6Um4UAvCu0C2jA== + dependencies: + "@truffle/code-utils" "^1.2.27" + "@truffle/codec" "^0.10.6" + debug "^4.3.1" + json-pointer "^0.6.0" + node-interval-tree "^1.3.3" + web3-utils "1.3.5" + +"@trufflesuite/eth-json-rpc-filters@^4.1.2-1": + version "4.1.2-1" + resolved "https://registry.yarnpkg.com/@trufflesuite/eth-json-rpc-filters/-/eth-json-rpc-filters-4.1.2-1.tgz#61ab78c52e98a883e5cf086925b34a30297b1824" + integrity sha512-/MChvC5dw2ck9NU1cZmdovCz2VKbOeIyR4tcxDvA5sT+NaL0rA2/R5U0yI7zsbo1zD+pgqav77rQHTzpUdDNJQ== + dependencies: + "@trufflesuite/eth-json-rpc-middleware" "^4.4.2-0" + await-semaphore "^0.1.3" + eth-query "^2.1.2" + json-rpc-engine "^5.1.3" + lodash.flatmap "^4.5.0" + safe-event-emitter "^1.0.1" + +"@trufflesuite/eth-json-rpc-infura@^4.0.3-0": + version "4.0.3-0" + resolved "https://registry.yarnpkg.com/@trufflesuite/eth-json-rpc-infura/-/eth-json-rpc-infura-4.0.3-0.tgz#6d22122937cf60ec9d21a02351c101fdc608c4fe" + integrity sha512-xaUanOmo0YLqRsL0SfXpFienhdw5bpQ1WEXxMTRi57az4lwpZBv4tFUDvcerdwJrxX9wQqNmgUgd1BrR01dumw== + dependencies: + "@trufflesuite/eth-json-rpc-middleware" "^4.4.2-1" + cross-fetch "^2.1.1" + eth-json-rpc-errors "^1.0.1" + json-rpc-engine "^5.1.3" + +"@trufflesuite/eth-json-rpc-middleware@^4.4.2-0", "@trufflesuite/eth-json-rpc-middleware@^4.4.2-1": + version "4.4.2-1" + resolved "https://registry.yarnpkg.com/@trufflesuite/eth-json-rpc-middleware/-/eth-json-rpc-middleware-4.4.2-1.tgz#8c3638ed8a7ed89a1e5e71407de068a65bef0df2" + integrity sha512-iEy9H8ja7/8aYES5HfrepGBKU9n/Y4OabBJEklVd/zIBlhCCBAWBqkIZgXt11nBXO/rYAeKwYuE3puH3ByYnLA== + dependencies: + "@trufflesuite/eth-sig-util" "^1.4.2" + btoa "^1.2.1" + clone "^2.1.1" + eth-json-rpc-errors "^1.0.1" + eth-query "^2.1.2" + ethereumjs-block "^1.6.0" + ethereumjs-tx "^1.3.7" + ethereumjs-util "^5.1.2" + ethereumjs-vm "^2.6.0" + fetch-ponyfill "^4.0.0" + json-rpc-engine "^5.1.3" + json-stable-stringify "^1.0.1" + pify "^3.0.0" + safe-event-emitter "^1.0.1" + +"@trufflesuite/eth-sig-util@^1.4.2": + version "1.4.2" + resolved "https://registry.yarnpkg.com/@trufflesuite/eth-sig-util/-/eth-sig-util-1.4.2.tgz#b529e2f38ac08e652116f48981132a26242a4f08" + integrity sha512-+GyfN6b0LNW77hbQlH3ufZ/1eCON7mMrGym6tdYf7xiNw9Vv3jBO72bmmos1EId2NgBvPMhmYYm6DSLQFTmzrA== + dependencies: + ethereumjs-abi "^0.6.8" + ethereumjs-util "^5.1.1" + +"@trufflesuite/web3-provider-engine@15.0.13-1": + version "15.0.13-1" + resolved "https://registry.yarnpkg.com/@trufflesuite/web3-provider-engine/-/web3-provider-engine-15.0.13-1.tgz#f6a7f7131a2fdc4ab53976318ed13ce83e8e4bcb" + integrity sha512-6u3x/iIN5fyj8pib5QTUDmIOUiwAGhaqdSTXdqCu6v9zo2BEwdCqgEJd1uXDh3DBmPRDfiZ/ge8oUPy7LerpHg== + dependencies: + "@trufflesuite/eth-json-rpc-filters" "^4.1.2-1" + "@trufflesuite/eth-json-rpc-infura" "^4.0.3-0" + "@trufflesuite/eth-json-rpc-middleware" "^4.4.2-1" + "@trufflesuite/eth-sig-util" "^1.4.2" + async "^2.5.0" + backoff "^2.5.0" + clone "^2.0.0" + cross-fetch "^2.1.0" + eth-block-tracker "^4.4.2" + eth-json-rpc-errors "^2.0.2" + ethereumjs-block "^1.2.2" + ethereumjs-tx "^1.2.0" + ethereumjs-util "^5.1.5" + ethereumjs-vm "^2.3.4" + json-stable-stringify "^1.0.1" + promise-to-callback "^1.0.0" + readable-stream "^2.2.9" + request "^2.85.0" + semaphore "^1.0.3" + ws "^5.1.1" + xhr "^2.2.0" + xtend "^4.0.1" + "@typechain/ethers-v5@1.0.0": version "1.0.0" resolved "https://registry.yarnpkg.com/@typechain/ethers-v5/-/ethers-v5-1.0.0.tgz#9156c9a2b078f9bb00a339631221e42c26b218df" @@ -2267,6 +3840,13 @@ resolved "https://registry.yarnpkg.com/@types/abstract-leveldown/-/abstract-leveldown-5.0.1.tgz#3c7750d0186b954c7f2d2f6acc8c3c7ba0c3412e" integrity sha512-wYxU3kp5zItbxKmeRYCEplS2MW7DzyBnxPGj+GJVHZEUZiK/nn5Ei1sUFgURDh+X051+zsGe28iud3oHjrYWQQ== +"@types/accepts@*", "@types/accepts@^1.3.5": + version "1.3.5" + resolved "https://registry.yarnpkg.com/@types/accepts/-/accepts-1.3.5.tgz#c34bec115cfc746e04fe5a059df4ce7e7b391575" + integrity sha512-jOdnI/3qTpHABjM5cx1Hc0sKsPoYCp+DP/GJRGtDlPd7fiV9oXGGIcjW/ZOxLIvjGz8MA+uMZI9metHlgqbgwQ== + dependencies: + "@types/node" "*" + "@types/bluebird@^3.5.34": version "3.5.34" resolved "https://registry.yarnpkg.com/@types/bluebird/-/bluebird-3.5.34.tgz#0e9f1f4f5dfab98a421fb973b5f5690d22411893" @@ -2286,7 +3866,7 @@ dependencies: "@types/node" "*" -"@types/body-parser@*": +"@types/body-parser@*", "@types/body-parser@1.19.0": version "1.19.0" resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.0.tgz#0685b3c47eb3006ffed117cdd55164b61f80538f" integrity sha512-W98JrE0j2K78swW4ukqMleo8R7h/pFETjM2DQ90MF6XK2i4LO4W3gQ71Lt4w3bfm2EvVSyWHplECvB5sK22yFQ== @@ -2337,17 +3917,39 @@ dependencies: "@types/node" "*" +"@types/content-disposition@*": + version "0.5.3" + resolved "https://registry.yarnpkg.com/@types/content-disposition/-/content-disposition-0.5.3.tgz#0aa116701955c2faa0717fc69cd1596095e49d96" + integrity sha512-P1bffQfhD3O4LW0ioENXUhZ9OIa0Zn+P7M+pWgkCKaT53wVLSq0mrKksCID/FGHpFhRSxRGhgrQmfhRuzwtKdg== + +"@types/cookies@*": + version "0.7.6" + resolved "https://registry.yarnpkg.com/@types/cookies/-/cookies-0.7.6.tgz#71212c5391a976d3bae57d4b09fac20fc6bda504" + integrity sha512-FK4U5Qyn7/Sc5ih233OuHO0qAkOpEcD/eG6584yEiLKizTFRny86qHLe/rej3HFQrkBuUjF4whFliAdODbVN/w== + dependencies: + "@types/connect" "*" + "@types/express" "*" + "@types/keygrip" "*" + "@types/node" "*" + "@types/copyfiles@^2.4.0": version "2.4.0" resolved "https://registry.yarnpkg.com/@types/copyfiles/-/copyfiles-2.4.0.tgz#877ef9aa9def7df889fb1ca900206c79a873d113" integrity sha512-ujm66wtJzW0ok5bIfwSZdvI4C4E6rbAvG58zow71wLjPPj65rIMu4Uy5LOx5H4eRvaagGUrrKTxqfLiDSsHEGQ== -"@types/cors@^2.8.9": +"@types/cors@2.8.10", "@types/cors@^2.8.9": version "2.8.10" resolved "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.10.tgz#61cc8469849e5bcdd0c7044122265c39cec10cf4" integrity sha512-C7srjHiVG3Ey1nR6d511dtDkCEjxuN9W1HWAEjGq8kpcwmNM6JJkpC0xvabM7BXTG2wDq8Eu33iH9aQKa7IvLQ== -"@types/express-serve-static-core@^4.17.18": +"@types/ed2curve@^0.2.2": + version "0.2.2" + resolved "https://registry.yarnpkg.com/@types/ed2curve/-/ed2curve-0.2.2.tgz#8f8bc7e2c9a5895a941c63a4f7acd7a6a62a5b15" + integrity sha512-G1sTX5xo91ydevQPINbL2nfgVAj/s1ZiqZxC8OCWduwu+edoNGUm5JXtTkg9F3LsBZbRI46/0HES4CPUE2wc9g== + dependencies: + tweetnacl "^1.0.0" + +"@types/express-serve-static-core@4.17.19", "@types/express-serve-static-core@^4.17.18": version "4.17.19" resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.19.tgz#00acfc1632e729acac4f1530e9e16f6dd1508a1d" integrity sha512-DJOSHzX7pCiSElWaGR8kCprwibCB/3yW6vcT8VG3P0SJjnv19gnWG/AZMfM60Xj/YJIp/YCaDHyvzsFVeniARA== @@ -2356,7 +3958,7 @@ "@types/qs" "*" "@types/range-parser" "*" -"@types/express@^4.17.11": +"@types/express@*", "@types/express@4.17.11", "@types/express@^4.17.11": version "4.17.11" resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.11.tgz#debe3caa6f8e5fcda96b47bd54e2f40c4ee59545" integrity sha512-no+R6rW60JEc59977wIxreQVsIEOAYwgCqldrA/vkpCnbD7MqTefO97lmoBe4WE0F156bC4uLSP1XHDOySnChg== @@ -2373,6 +3975,13 @@ dependencies: "@types/node" "*" +"@types/fs-capacitor@*": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@types/fs-capacitor/-/fs-capacitor-2.0.0.tgz#17113e25817f584f58100fb7a08eed288b81956e" + integrity sha512-FKVPOCFbhCvZxpVAMhdBdTfVfXUpsh15wFHgqOKxh9N9vzWZVuWCSijZ5T4U34XYNnuj2oduh6xcs1i+LPI+BQ== + dependencies: + "@types/node" "*" + "@types/glob@*", "@types/glob@^7.1.1", "@types/glob@^7.1.3": version "7.1.3" resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.3.tgz#e6ba80f36b7daad2c685acd9266382e68985c183" @@ -2381,11 +3990,57 @@ "@types/minimatch" "*" "@types/node" "*" +"@types/google-protobuf@^3.7.3", "@types/google-protobuf@^3.7.4": + version "3.15.2" + resolved "https://registry.yarnpkg.com/@types/google-protobuf/-/google-protobuf-3.15.2.tgz#70753e948cabeb416d71299dc35c3f562a10fb0f" + integrity sha512-ubeqvw7sl6CdgeiIilsXB2jIFoD/D0F+/LIEp7xEBEXRNtDJcf05FRINybsJtL7GlkWOUVn6gJs2W9OF+xI6lg== + +"@types/http-assert@*": + version "1.5.1" + resolved "https://registry.yarnpkg.com/@types/http-assert/-/http-assert-1.5.1.tgz#d775e93630c2469c2f980fc27e3143240335db3b" + integrity sha512-PGAK759pxyfXE78NbKxyfRcWYA/KwW17X290cNev/qAsn9eQIxkH4shoNBafH37wewhDG/0p1cHPbK6+SzZjWQ== + +"@types/http-errors@*": + version "1.8.0" + resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-1.8.0.tgz#682477dbbbd07cd032731cb3b0e7eaee3d026b69" + integrity sha512-2aoSC4UUbHDj2uCsCxcG/vRMXey/m17bC7UwitVm5hn22nI8O8Y9iDpA76Orc+DWkQ4zZrOKEshCqR/jSuXAHA== + +"@types/json-schema@*": + version "7.0.7" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.7.tgz#98a993516c859eb0d5c4c8f098317a9ea68db9ad" + integrity sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA== + "@types/json5@^0.0.29": version "0.0.29" resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4= +"@types/keygrip@*": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@types/keygrip/-/keygrip-1.0.2.tgz#513abfd256d7ad0bf1ee1873606317b33b1b2a72" + integrity sha512-GJhpTepz2udxGexqos8wgaBx4I/zWIDPh/KOGEwAqtuGDkOUJu5eFvwmdBX4AmB8Odsr+9pHCQqiAqDL/yKMKw== + +"@types/koa-compose@*": + version "3.2.5" + resolved "https://registry.yarnpkg.com/@types/koa-compose/-/koa-compose-3.2.5.tgz#85eb2e80ac50be95f37ccf8c407c09bbe3468e9d" + integrity sha512-B8nG/OoE1ORZqCkBVsup/AKcvjdgoHnfi4pZMn5UwAPCbhk/96xyv284eBYW8JlQbQ7zDmnpFr68I/40mFoIBQ== + dependencies: + "@types/koa" "*" + +"@types/koa@*": + version "2.13.1" + resolved "https://registry.yarnpkg.com/@types/koa/-/koa-2.13.1.tgz#e29877a6b5ad3744ab1024f6ec75b8cbf6ec45db" + integrity sha512-Qbno7FWom9nNqu0yHZ6A0+RWt4mrYBhw3wpBAQ3+IuzGcLlfeYkzZrnMq5wsxulN2np8M4KKeUpTodsOsSad5Q== + dependencies: + "@types/accepts" "*" + "@types/content-disposition" "*" + "@types/cookies" "*" + "@types/http-assert" "*" + "@types/http-errors" "*" + "@types/keygrip" "*" + "@types/koa-compose" "*" + "@types/node" "*" + "@types/levelup@^4.3.0": version "4.3.0" resolved "https://registry.yarnpkg.com/@types/levelup/-/levelup-4.3.0.tgz#4f55585e05a33caa08c1439c344bbba93e947327" @@ -2399,6 +4054,11 @@ resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.168.tgz#fe24632e79b7ade3f132891afff86caa5e5ce008" integrity sha512-oVfRvqHV/V6D1yifJbVRU3TMp8OT6o6BG+U9MkwuJ3U8/CsDHvalRpsxBqivn71ztOFZBTfJMvETbqHiaNSj7Q== +"@types/long@^4.0.0", "@types/long@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@types/long/-/long-4.0.1.tgz#459c65fa1867dafe6a8f322c4c51695663cc55e9" + integrity sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w== + "@types/lru-cache@^5.1.0": version "5.1.0" resolved "https://registry.yarnpkg.com/@types/lru-cache/-/lru-cache-5.1.0.tgz#57f228f2b80c046b4a1bd5cac031f81f207f4f03" @@ -2469,11 +4129,31 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.37.tgz#a3dd8da4eb84a996c36e331df98d82abd76b516e" integrity sha512-XYmBiy+ohOR4Lh5jE379fV2IU+6Jn4g5qASinhitfyO71b/sCo6MKsMLF5tc7Zf2CE8hViVQyYSobJNke8OvUw== +"@types/node@10.12.18": + version "10.12.18" + resolved "https://registry.yarnpkg.com/@types/node/-/node-10.12.18.tgz#1d3ca764718915584fcd9f6344621b7672665c67" + integrity sha512-fh+pAqt4xRzPfqA6eh3Z2y6fyZavRIumvjhaCL753+TVkGKGhpPeyrJG2JftD0T9q4GF00KjefsQ+PQNDdWQaQ== + +"@types/node@11.11.6": + version "11.11.6" + resolved "https://registry.yarnpkg.com/@types/node/-/node-11.11.6.tgz#df929d1bb2eee5afdda598a41930fe50b43eaa6a" + integrity sha512-Exw4yUWMBXM3X+8oqzJNRqZSwUAaS4+7NdvHqQuFi/d+synz++xmX3QIf+BFqneW8N31R8Ky+sikfZUXq07ggQ== + +"@types/node@>=13.7.0": + version "15.0.2" + resolved "https://registry.yarnpkg.com/@types/node/-/node-15.0.2.tgz#51e9c0920d1b45936ea04341aa3e2e58d339fb67" + integrity sha512-p68+a+KoxpoB47015IeYZYRrdqMUcpbK8re/zpFB8Ld46LHC1lPEbp3EXgkEhAYEcPvjJF6ZO+869SQ0aH1dcA== + "@types/node@^10.0.3": version "10.17.58" resolved "https://registry.yarnpkg.com/@types/node/-/node-10.17.58.tgz#10682f6016fd866725c36d22ce6bbbd029bf4545" integrity sha512-Dn5RBxLohjdHFj17dVVw3rtrZAeXeWg+LQfvxDIW/fdPkSiuQk7h3frKMYtsQhtIW42wkErDcy9UMVxhGW4O7w== +"@types/node@^10.1.0": + version "10.17.59" + resolved "https://registry.yarnpkg.com/@types/node/-/node-10.17.59.tgz#03f440ccf746a27f7da6e141e6cbae64681dbd2f" + integrity sha512-7Uc8IRrL8yZz5ti45RaFxpbU8TxlzdC3HvxV+hOWo1EyLsuKv/w7y0n+TwZzwL3vdx3oZ2k3ubxPq131hNtXyg== + "@types/node@^10.12.18": version "10.17.56" resolved "https://registry.yarnpkg.com/@types/node/-/node-10.17.56.tgz#010c9e047c3ff09ddcd11cbb6cf5912725cdc2b3" @@ -2646,6 +4326,13 @@ dependencies: "@types/node" "*" +"@types/to-json-schema@^0.2.0": + version "0.2.0" + resolved "https://registry.yarnpkg.com/@types/to-json-schema/-/to-json-schema-0.2.0.tgz#6c76736449942aa8a16a522fa2d3fcfd3bcb8d15" + integrity sha512-9fqRjNFSSxJ8dQrE4v8gThS5ftxdFj8Q0y8hAjaF+uN+saJRxLiJdtFaDd9sv3bhzwcB2oDJpT/1ZelHnexbLw== + dependencies: + "@types/json-schema" "*" + "@types/underscore@*": version "1.11.1" resolved "https://registry.yarnpkg.com/@types/underscore/-/underscore-1.11.1.tgz#5b773d04c44897137485615dbef56a2919b9fa5a" @@ -2659,6 +4346,20 @@ "@types/bn.js" "*" "@types/underscore" "*" +"@types/websocket@1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@types/websocket/-/websocket-1.0.2.tgz#d2855c6a312b7da73ed16ba6781815bf30c6187a" + integrity sha512-B5m9aq7cbbD/5/jThEr33nUY8WEfVi6A2YKCTOvw5Ldy7mtsOkqRvGjnzy6g7iMMDsgu7xREuCzqATLDLQVKcQ== + dependencies: + "@types/node" "*" + +"@types/ws@^7.0.0", "@types/ws@^7.2.6": + version "7.4.2" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-7.4.2.tgz#bfe739b5f8b3a39742605fbe415ae7e88ee614c8" + integrity sha512-PbeN0Eydl7LQl4OIav29YmkO2LxbVuz3nZD/kb19lOS+wLgIkRbWMNmU/QQR7ABpOJ7D7xDOU8co7iohObewrw== + dependencies: + "@types/node" "*" + "@types/yargs-parser@*": version "20.2.0" resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-20.2.0.tgz#dd3e6699ba3237f0348cd085e4698780204842f9" @@ -2671,16 +4372,69 @@ dependencies: "@types/yargs-parser" "*" +"@types/zen-observable@^0.8.0": + version "0.8.2" + resolved "https://registry.yarnpkg.com/@types/zen-observable/-/zen-observable-0.8.2.tgz#808c9fa7e4517274ed555fa158f2de4b4f468e71" + integrity sha512-HrCIVMLjE1MOozVoD86622S7aunluLb2PJdPfb3nYiEtohm8mIB/vyv0Fd37AdeMFrTUQXEunw78YloMA3Qilg== + "@ungap/promise-all-settled@1.1.2": version "1.1.2" resolved "https://registry.yarnpkg.com/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz#aa58042711d6e3275dd37dc597e5d31e8c290a44" integrity sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q== +"@wry/context@^0.6.0": + version "0.6.0" + resolved "https://registry.yarnpkg.com/@wry/context/-/context-0.6.0.tgz#f903eceb89d238ef7e8168ed30f4511f92d83e06" + integrity sha512-sAgendOXR8dM7stJw3FusRxFHF/ZinU0lffsA2YTyyIOfic86JX02qlPqPVqJNZJPAxFt+2EE8bvq6ZlS0Kf+Q== + dependencies: + tslib "^2.1.0" + +"@wry/equality@^0.1.2": + version "0.1.11" + resolved "https://registry.yarnpkg.com/@wry/equality/-/equality-0.1.11.tgz#35cb156e4a96695aa81a9ecc4d03787bc17f1790" + integrity sha512-mwEVBDUVODlsQQ5dfuLUS5/Tf7jqUKyhKYHmVi4fPB6bDMOfWvUPJmKgS1Z7Za/sOI3vzWt4+O7yCiL/70MogA== + dependencies: + tslib "^1.9.3" + +"@wry/equality@^0.4.0": + version "0.4.0" + resolved "https://registry.yarnpkg.com/@wry/equality/-/equality-0.4.0.tgz#474491869a8d0590f4a33fd2a4850a77a0f63408" + integrity sha512-DxN/uawWfhRbgYE55zVCPOoe+jvsQ4m7PT1Wlxjyb/LCCLuU1UsucV2BbCxFAX8bjcSueFBbB5Qfj1Zfe8e7Fw== + dependencies: + tslib "^2.1.0" + +"@wry/trie@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@wry/trie/-/trie-0.3.0.tgz#3245e74988c4e3033299e479a1bf004430752463" + integrity sha512-Yw1akIogPhAT6XPYsRHlZZIS0tIGmAl9EYXHi2scf7LPKKqdqmow/Hu4kEqP2cJR3EjaU/9L0ZlAjFf3hFxmug== + dependencies: + tslib "^2.1.0" + "@yarnpkg/lockfile@^1.1.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz#e77a97fbd345b76d83245edcd17d393b1b41fb31" integrity sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ== +"@zondax/filecoin-signing-tools@github:Digital-MOB-Filecoin/filecoin-signing-tools-js": + version "0.2.0" + resolved "https://codeload.github.com/Digital-MOB-Filecoin/filecoin-signing-tools-js/tar.gz/8f8e92157cac2556d35cab866779e9a8ea8a4e25" + dependencies: + axios "^0.20.0" + base32-decode "^1.0.0" + base32-encode "^1.1.1" + bip32 "^2.0.5" + bip39 "^3.0.2" + blakejs "^1.1.0" + bn.js "^5.1.2" + ipld-dag-cbor "^0.17.0" + leb128 "0.0.5" + secp256k1 "^4.0.1" + +"@zxing/text-encoding@0.9.0": + version "0.9.0" + resolved "https://registry.yarnpkg.com/@zxing/text-encoding/-/text-encoding-0.9.0.tgz#fb50ffabc6c7c66a0c96b4c03e3d9be74864b70b" + integrity sha512-U/4aVJ2mxI0aDNI8Uq0wEhMgY+u4CNtEb0om3+y3+niDAsoTCOB33UF0sxpzqzdqXLqmvc+vZyAt4O8pPdfkwA== + JSONStream@^1.0.4: version "1.3.5" resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0" @@ -2689,6 +4443,11 @@ JSONStream@^1.0.4: jsonparse "^1.2.0" through ">=2.2.7 <3" +abab@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/abab/-/abab-1.0.4.tgz#5faad9c2c07f60dd76770f71cf025b62a63cfd4e" + integrity sha1-X6rZwsB/YN12dw9xzwJbYqY8/U4= + abbrev@1: version "1.1.1" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" @@ -2699,7 +4458,7 @@ abbrev@1.0.x: resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135" integrity sha1-kbR5JYinc4wl813W9jdSovh3YTU= -abort-controller@^3.0.0: +abort-controller@3.0.0, abort-controller@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== @@ -2745,6 +4504,14 @@ abstract-leveldown@~2.6.0: dependencies: xtend "~4.0.0" +abstract-leveldown@~6.0.0, abstract-leveldown@~6.0.1: + version "6.0.3" + resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-6.0.3.tgz#b4b6159343c74b0c5197b2817854782d8f748c4a" + integrity sha512-jzewKKpZbaYUa6HTThnrl+GrJhzjEAeuc7hTVpZdzg7kupXZFoqQDFwyOwLNbmJKJlmzw8yiipMPkDiuKkT06Q== + dependencies: + level-concat-iterator "~2.0.0" + xtend "~4.0.0" + abstract-leveldown@~6.2.1, abstract-leveldown@~6.2.3: version "6.2.3" resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-6.2.3.tgz#036543d87e3710f2528e47040bc3261b77a9a8eb" @@ -2756,7 +4523,7 @@ abstract-leveldown@~6.2.1, abstract-leveldown@~6.2.3: level-supports "~1.0.0" xtend "~4.0.0" -accepts@~1.3.7: +accepts@^1.3.5, accepts@~1.3.7: version "1.3.7" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== @@ -2764,6 +4531,23 @@ accepts@~1.3.7: mime-types "~2.1.24" negotiator "0.6.2" +acorn-globals@^1.0.4: + version "1.0.9" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-1.0.9.tgz#55bb5e98691507b74579d0513413217c380c54cf" + integrity sha1-VbtemGkVB7dFedBRNBMhfDgMVM8= + dependencies: + acorn "^2.1.0" + +acorn@4.X: + version "4.0.13" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787" + integrity sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c= + +acorn@^2.1.0, acorn@^2.4.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-2.7.0.tgz#ab6e7d9d886aaca8b085bc3312b79a198433f0e7" + integrity sha1-q259nYhqrKiwhbwzEreaGYQz8Oc= + add-stream@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/add-stream/-/add-stream-1.0.0.tgz#6a7990437ca736d5e1288db92bd3266d5f5cb2aa" @@ -2901,6 +4685,19 @@ ansicolors@~0.3.2: resolved "https://registry.yarnpkg.com/ansicolors/-/ansicolors-0.3.2.tgz#665597de86a9ffe3aa9bfbe6cae5c6ea426b4979" integrity sha1-ZlWX3oap/+Oqm/vmyuXG6kJrSXk= +any-promise@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" + integrity sha1-q8av7tzqUugJzcA3au0845Y10X8= + +any-signal@^2.0.0, any-signal@^2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/any-signal/-/any-signal-2.1.2.tgz#8d48270de0605f8b218cf9abe8e9c6a0e7418102" + integrity sha512-B+rDnWasMi/eWcajPcCWSlYc7muXOrcYrqgyzcdKisl2H/WTlQ0gip1KyQfr0ZlxJdsuWCj/LWwQm7fhyhRfIQ== + dependencies: + abort-controller "^3.0.0" + native-abort-controller "^1.0.3" + anymatch@~3.1.1: version "3.1.2" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" @@ -2909,6 +4706,193 @@ anymatch@~3.1.1: normalize-path "^3.0.0" picomatch "^2.0.4" +apollo-cache-control@^0.13.0: + version "0.13.0" + resolved "https://registry.yarnpkg.com/apollo-cache-control/-/apollo-cache-control-0.13.0.tgz#cd63aa24a662b2fe89ef147a30df907c8061aedc" + integrity sha512-ImUXwVc/8K9QA3mQiKbKw8bOS4lMNL4DoP4hldIx+gwna8dgh3gBChgxW5guMOhcvH/55ximS7ZNWUglFmQY4Q== + dependencies: + apollo-server-env "^3.1.0" + apollo-server-plugin-base "^0.12.0" + +apollo-datasource@^0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/apollo-datasource/-/apollo-datasource-0.9.0.tgz#b0b2913257a6103a5f4c03cb56d78a30e9d850db" + integrity sha512-y8H99NExU1Sk4TvcaUxTdzfq2SZo6uSj5dyh75XSQvbpH6gdAXIW9MaBcvlNC7n0cVPsidHmOcHOWxJ/pTXGjA== + dependencies: + apollo-server-caching "^0.7.0" + apollo-server-env "^3.1.0" + +apollo-env@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/apollo-env/-/apollo-env-0.10.0.tgz#8dd51bf974253a760ea15c81e870ff2c0d6e6820" + integrity sha512-7Geot+eyOl4jzPi9beiszeDmEEVZOVT11LSlkQluF5eaCNaIvld+xklZxITZGI/Wr+PQX380YJgQt1ndR2GtOg== + dependencies: + "@types/node-fetch" "^2.5.10" + core-js "^3.0.1" + node-fetch "^2.6.1" + sha.js "^2.4.11" + +apollo-graphql@^0.9.0: + version "0.9.2" + resolved "https://registry.yarnpkg.com/apollo-graphql/-/apollo-graphql-0.9.2.tgz#750ca9a97b59c868426defc95d9d9e1733ae4bdf" + integrity sha512-+c/vqC2LPq3e5kO7MfBxDDiljzLog/THZr9Pd46HVaKAhHUxFL0rJEbT17VhjdOoZGWFWLYG7x9hiN6EQD1xZQ== + dependencies: + core-js-pure "^3.10.2" + lodash.sortby "^4.7.0" + sha.js "^2.4.11" + +apollo-link@1.2.14, apollo-link@^1.2.14: + version "1.2.14" + resolved "https://registry.yarnpkg.com/apollo-link/-/apollo-link-1.2.14.tgz#3feda4b47f9ebba7f4160bef8b977ba725b684d9" + integrity sha512-p67CMEFP7kOG1JZ0ZkYZwRDa369w5PIjtMjvrQd/HnIV8FRsHRqLqK+oAZQnFa1DDdZtOtHTi+aMIW6EatC2jg== + dependencies: + apollo-utilities "^1.3.0" + ts-invariant "^0.4.0" + tslib "^1.9.3" + zen-observable-ts "^0.8.21" + +apollo-reporting-protobuf@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/apollo-reporting-protobuf/-/apollo-reporting-protobuf-0.7.0.tgz#622352d3eea943dff2647741a509b39d464f98a9" + integrity sha512-PC+zDqPPJcseemqmvUEqFiDi45pz6UaPWt6czgmrrbcQ+9VWp6IEkm08V5xBKk7V1WGUw19YwiJ7kqXpcgVNyw== + dependencies: + "@apollo/protobufjs" "1.2.2" + +apollo-server-caching@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/apollo-server-caching/-/apollo-server-caching-0.7.0.tgz#e6d1e68e3bb571cba63a61f60b434fb771c6ff39" + integrity sha512-MsVCuf/2FxuTFVhGLK13B+TZH9tBd2qkyoXKKILIiGcZ5CDUEBO14vIV63aNkMkS1xxvK2U4wBcuuNj/VH2Mkw== + dependencies: + lru-cache "^6.0.0" + +apollo-server-core@^2.24.0: + version "2.24.0" + resolved "https://registry.yarnpkg.com/apollo-server-core/-/apollo-server-core-2.24.0.tgz#60313e5bd265422d53fe0ffbd45760046465f5f0" + integrity sha512-uW7gykPzhin9fLgSvciN8tX7098mHnUM79W3+fWfK5J415JidIqW9O+JhYmEPo6BCgosu0cKSdYe7NB+FP4lFQ== + dependencies: + "@apollographql/apollo-tools" "^0.5.0" + "@apollographql/graphql-playground-html" "1.6.27" + "@apollographql/graphql-upload-8-fork" "^8.1.3" + "@josephg/resolvable" "^1.0.0" + "@types/ws" "^7.0.0" + apollo-cache-control "^0.13.0" + apollo-datasource "^0.9.0" + apollo-graphql "^0.9.0" + apollo-reporting-protobuf "^0.7.0" + apollo-server-caching "^0.7.0" + apollo-server-env "^3.1.0" + apollo-server-errors "^2.5.0" + apollo-server-plugin-base "^0.12.0" + apollo-server-types "^0.8.0" + apollo-tracing "^0.14.0" + async-retry "^1.2.1" + fast-json-stable-stringify "^2.0.0" + graphql-extensions "^0.14.0" + graphql-tag "^2.11.0" + graphql-tools "^4.0.8" + loglevel "^1.6.7" + lru-cache "^6.0.0" + sha.js "^2.4.11" + subscriptions-transport-ws "^0.9.11" + uuid "^8.0.0" + ws "^6.0.0" + +apollo-server-env@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/apollo-server-env/-/apollo-server-env-3.1.0.tgz#0733c2ef50aea596cc90cf40a53f6ea2ad402cd0" + integrity sha512-iGdZgEOAuVop3vb0F2J3+kaBVi4caMoxefHosxmgzAbbSpvWehB8Y1QiSyyMeouYC38XNVk5wnZl+jdGSsWsIQ== + dependencies: + node-fetch "^2.6.1" + util.promisify "^1.0.0" + +apollo-server-errors@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/apollo-server-errors/-/apollo-server-errors-2.5.0.tgz#5d1024117c7496a2979e3e34908b5685fe112b68" + integrity sha512-lO5oTjgiC3vlVg2RKr3RiXIIQ5pGXBFxYGGUkKDhTud3jMIhs+gel8L8zsEjKaKxkjHhCQAA/bcEfYiKkGQIvA== + +apollo-server-express@^2.24.0: + version "2.24.0" + resolved "https://registry.yarnpkg.com/apollo-server-express/-/apollo-server-express-2.24.0.tgz#f17444929fc776fa1c166d8bad9685bd65dfa1c9" + integrity sha512-wVoD53azxqVZt/i4yAm6cDDCXpbzr0AJpzOdNXVFW/KivInWEMF5ekCc80uMOawPeu78U7Skoc20akyvZKc+YA== + dependencies: + "@apollographql/graphql-playground-html" "1.6.27" + "@types/accepts" "^1.3.5" + "@types/body-parser" "1.19.0" + "@types/cors" "2.8.10" + "@types/express" "4.17.11" + "@types/express-serve-static-core" "4.17.19" + accepts "^1.3.5" + apollo-server-core "^2.24.0" + apollo-server-types "^0.8.0" + body-parser "^1.18.3" + cors "^2.8.5" + express "^4.17.1" + graphql-subscriptions "^1.0.0" + graphql-tools "^4.0.8" + parseurl "^1.3.2" + subscriptions-transport-ws "^0.9.16" + type-is "^1.6.16" + +apollo-server-plugin-base@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/apollo-server-plugin-base/-/apollo-server-plugin-base-0.12.0.tgz#9063c47e84c849c4227b9398cd06994f13b3a4c3" + integrity sha512-jnNIztYz34ImE7off0t9LwseGCR/J0H1wlbiBGvdXvQY+ZiMfVF2oF8KdSAPxG2vT6scvWP4GFS/FsZcOyP1Xw== + dependencies: + apollo-server-types "^0.8.0" + +apollo-server-types@^0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/apollo-server-types/-/apollo-server-types-0.8.0.tgz#5462c99e93c5b6896d686bc234c05850059b2efe" + integrity sha512-adHJnHbRV2kWUY0VQY1M2KpSdGfm+4mX4w+2lROPExqOnkyTI7CGfpJCdEwYMKrIn3aH8HIcOH0SnpWRet6TNw== + dependencies: + apollo-reporting-protobuf "^0.7.0" + apollo-server-caching "^0.7.0" + apollo-server-env "^3.1.0" + +apollo-server@^2.18.2: + version "2.24.0" + resolved "https://registry.yarnpkg.com/apollo-server/-/apollo-server-2.24.0.tgz#68747b786af16803da0d0fa915334f4c81f312c4" + integrity sha512-KYYyBRLvqJaXFk64HfdgPilm8bqc2ON3hwhWmWx2Apsy4PC7paVK4gYFAUh9piPpeVZfF3t7zm+2J+9R47otjA== + dependencies: + apollo-server-core "^2.24.0" + apollo-server-express "^2.24.0" + express "^4.0.0" + graphql-subscriptions "^1.0.0" + graphql-tools "^4.0.8" + stoppable "^1.1.0" + +apollo-tracing@^0.14.0: + version "0.14.0" + resolved "https://registry.yarnpkg.com/apollo-tracing/-/apollo-tracing-0.14.0.tgz#2b7e07e6f1cb9d6161f03dc6e51baaa8468735bd" + integrity sha512-KH4mOoicZ2CQkEYVuNP9avJth59LwNqku3fKZ4S0UYE1RfxzIoLLsEyuY8MuJEgNdtKKfkX5G5Kn5Rp4LCJ4RQ== + dependencies: + apollo-server-env "^3.1.0" + apollo-server-plugin-base "^0.12.0" + +apollo-upload-client@14.1.2: + version "14.1.2" + resolved "https://registry.yarnpkg.com/apollo-upload-client/-/apollo-upload-client-14.1.2.tgz#7a72b000f1cd67eaf8f12b4bda2796d0898c0dae" + integrity sha512-ozaW+4tnVz1rpfwiQwG3RCdCcZ93RV/37ZQbRnObcQ9mjb+zur58sGDPVg9Ef3fiujLmiE/Fe9kdgvIMA3VOjA== + dependencies: + "@apollo/client" "^3.1.5" + "@babel/runtime" "^7.11.2" + extract-files "^9.0.0" + +apollo-utilities@^1.0.1, apollo-utilities@^1.3.0: + version "1.3.4" + resolved "https://registry.yarnpkg.com/apollo-utilities/-/apollo-utilities-1.3.4.tgz#6129e438e8be201b6c55b0f13ce49d2c7175c9cf" + integrity sha512-pk2hiWrCXMAy2fRPwEyhvka+mqwzeP60Jr1tRYi5xru+3ko94HI9o6lK0CT33/w4RDlxWchmdhDCrvdr+pHCig== + dependencies: + "@wry/equality" "^0.1.2" + fast-json-stable-stringify "^2.0.0" + ts-invariant "^0.4.0" + tslib "^1.10.0" + +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= + aproba@^1.0.3: version "1.2.0" resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" @@ -2954,12 +4938,24 @@ args@^5.0.1: leven "2.1.0" mri "1.1.4" +argsarray@0.0.1, argsarray@^0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/argsarray/-/argsarray-0.0.1.tgz#6e7207b4ecdb39b0af88303fa5ae22bda8df61cb" + integrity sha1-bnIHtOzbObCviDA/pa4ivajfYcs= + +arr-diff@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" + integrity sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8= + dependencies: + arr-flatten "^1.0.1" + arr-diff@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= -arr-flatten@^1.1.0: +arr-flatten@^1.0.1, arr-flatten@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== @@ -2988,6 +4984,11 @@ array-differ@^3.0.0: resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-3.0.0.tgz#3cbb3d0f316810eafcc47624734237d6aee4ae6b" integrity sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg== +array-filter@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-filter/-/array-filter-1.0.0.tgz#baf79e62e6ef4c2a4c0b831232daffec251f9d83" + integrity sha1-uveeYubvTCpMC4MSMtr/7CUfnYM= + array-find-index@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" @@ -3008,11 +5009,27 @@ array-union@^2.1.0: resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== +array-unique@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" + integrity sha1-odl8yvy8JiXMcPrc6zalDFiwGlM= + array-unique@^0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= +array.prototype.map@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/array.prototype.map/-/array.prototype.map-1.0.3.tgz#1609623618d3d84134a37d4a220030c2bd18420b" + integrity sha512-nNcb30v0wfDyIe26Yif3PcV1JXQp4zEeEfupG7L4SRjnD6HLbO5b2a7eVSba53bOx4YCHYMBHt+Fp4vYstneRA== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + es-abstract "^1.18.0-next.1" + es-array-method-boxes-properly "^1.0.0" + is-string "^1.0.5" + arrify@^1.0.0, arrify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" @@ -3023,12 +5040,12 @@ arrify@^2.0.0, arrify@^2.0.1: resolved "https://registry.yarnpkg.com/arrify/-/arrify-2.0.1.tgz#c9655e9331e0abcd588d2a7cad7e9956f66701fa" integrity sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug== -asap@^2.0.0, asap@~2.0.6: +asap@^2.0.0, asap@~2.0.3, asap@~2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY= -asn1.js@^5.2.0: +asn1.js@^5.0.1, asn1.js@^5.2.0: version "5.4.1" resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07" integrity sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA== @@ -3045,6 +5062,18 @@ asn1@~0.2.3: dependencies: safer-buffer "~2.1.0" +assert-args@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/assert-args/-/assert-args-1.2.1.tgz#404103a1452a32fe77898811e54e590a8a9373bd" + integrity sha1-QEEDoUUqMv53iYgR5U5ZCoqTc70= + dependencies: + "101" "^1.2.0" + compound-subject "0.0.1" + debug "^2.2.0" + get-prototype-of "0.0.0" + is-capitalized "^1.0.0" + is-class "0.0.4" + assert-plus@1.0.0, assert-plus@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" @@ -3067,11 +5096,18 @@ async-eventemitter@^0.2.2, async-eventemitter@^0.2.4: dependencies: async "^2.4.0" -async-limiter@~1.0.0: +async-limiter@^1.0.0, async-limiter@~1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== +async-retry@^1.2.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/async-retry/-/async-retry-1.3.1.tgz#139f31f8ddce50c0870b0ba558a6079684aaed55" + integrity sha512-aiieFW/7h3hY0Bq5d+ktDBejxuwR78vRu9hDUdR8rNhSaQ29VzPL4AoIRG7D/c7tdenwOcKvgPM6tIxB3cB6HA== + dependencies: + retry "0.12.0" + async@1.x, async@^1.4.2: version "1.5.2" resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" @@ -3111,6 +5147,18 @@ atomic-sleep@^1.0.0: resolved "https://registry.yarnpkg.com/atomic-sleep/-/atomic-sleep-1.0.0.tgz#eb85b77a601fc932cfe432c5acd364a9e2c9075b" integrity sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ== +available-typed-arrays@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.2.tgz#6b098ca9d8039079ee3f77f7b783c4480ba513f5" + integrity sha512-XWX3OX8Onv97LMk/ftVyBibpGwY5a8SmuxZPzeOxqmuEqUCOM9ZE+uIaD1VNJ5QnvU2UQusvmKbuM1FR8QWGfQ== + dependencies: + array-filter "^1.0.0" + +await-semaphore@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/await-semaphore/-/await-semaphore-0.1.3.tgz#2b88018cc8c28e06167ae1cdff02504f1f9688d3" + integrity sha512-d1W2aNSYcz/sxYO4pMGX9vq65qOTu0P800epMud+6cYYX0QcT7zyqcxec3VWzpgvdXo57UWmVbZpLMjX2m1I7Q== + aws-sign2@~0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" @@ -3121,6 +5169,13 @@ aws4@^1.8.0: resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59" integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== +axios@^0.20.0: + version "0.20.0" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.20.0.tgz#057ba30f04884694993a8cd07fa394cff11c50bd" + integrity sha512-ANA4rr2BDcmmAQLOKft2fufrtuvlqR+cXNNinUmvfeSNCOF98PZL+7M/v1zIdGo7OLjEA9J2gXJL+j4zGsl0bA== + dependencies: + follow-redirects "^1.10.0" + axios@^0.21.1: version "0.21.1" resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.1.tgz#22563481962f4d6bde9a76d516ef0e5d3c09b2b8" @@ -3162,7 +5217,7 @@ babel-core@^6.0.14, babel-core@^6.26.0: slash "^1.0.0" source-map "^0.5.7" -babel-generator@^6.26.0: +babel-generator@6.26.1, babel-generator@^6.26.0: version "6.26.1" resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90" integrity sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA== @@ -3303,6 +5358,37 @@ babel-plugin-check-es2015-constants@^6.22.0: dependencies: babel-runtime "^6.22.0" +babel-plugin-dynamic-import-node@^2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3" + integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ== + dependencies: + object.assign "^4.1.0" + +babel-plugin-polyfill-corejs2@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.0.tgz#686775bf9a5aa757e10520903675e3889caeedc4" + integrity sha512-9bNwiR0dS881c5SHnzCmmGlMkJLl0OUZvxrxHo9w/iNoRuqaPjqlvBf4HrovXtQs/au5yKkpcdgfT1cC5PAZwg== + dependencies: + "@babel/compat-data" "^7.13.11" + "@babel/helper-define-polyfill-provider" "^0.2.0" + semver "^6.1.1" + +babel-plugin-polyfill-corejs3@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.0.tgz#f4b4bb7b19329827df36ff56f6e6d367026cb7a2" + integrity sha512-zZyi7p3BCUyzNxLx8KV61zTINkkV65zVkDAFNZmrTCRVhjo1jAS+YLvDJ9Jgd/w2tsAviCwFHReYfxO3Iql8Yg== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.2.0" + core-js-compat "^3.9.1" + +babel-plugin-polyfill-regenerator@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.0.tgz#853f5f5716f4691d98c84f8069c7636ea8da7ab8" + integrity sha512-J7vKbCuD2Xi/eEHxquHN14bXAW9CXtecwuLrOIDJtcZzTaPzV1VdEfoUf9AzcRBMolKUQKM9/GVojeh0hFiqMg== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.2.0" + babel-plugin-syntax-async-functions@^6.8.0: version "6.13.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" @@ -3318,6 +5404,11 @@ babel-plugin-syntax-trailing-function-commas@^6.22.0: resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3" integrity sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM= +babel-plugin-syntax-trailing-function-commas@^7.0.0-beta.0: + version "7.0.0-beta.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-7.0.0-beta.0.tgz#aa213c1435e2bffeb6fca842287ef534ad05d5cf" + integrity sha512-Xj9XuRuz3nTSbaTXWv3itLOcxyF4oPD8douBBmj7U9BBC6nEBYfyOJYQMf/8PJAFotC62UY5dFfIGEPr7WswzQ== + babel-plugin-transform-async-to-generator@^6.22.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz#6536e378aff6cb1d5517ac0e40eb3e9fc8d08761" @@ -3577,6 +5668,39 @@ babel-preset-env@^1.7.0: invariant "^2.2.2" semver "^5.3.0" +babel-preset-fbjs@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/babel-preset-fbjs/-/babel-preset-fbjs-3.3.0.tgz#a6024764ea86c8e06a22d794ca8b69534d263541" + integrity sha512-7QTLTCd2gwB2qGoi5epSULMHugSVgpcVt5YAeiFO9ABLrutDQzKfGwzxgZHLpugq8qMdg/DhRZDZ5CLKxBkEbw== + dependencies: + "@babel/plugin-proposal-class-properties" "^7.0.0" + "@babel/plugin-proposal-object-rest-spread" "^7.0.0" + "@babel/plugin-syntax-class-properties" "^7.0.0" + "@babel/plugin-syntax-flow" "^7.0.0" + "@babel/plugin-syntax-jsx" "^7.0.0" + "@babel/plugin-syntax-object-rest-spread" "^7.0.0" + "@babel/plugin-transform-arrow-functions" "^7.0.0" + "@babel/plugin-transform-block-scoped-functions" "^7.0.0" + "@babel/plugin-transform-block-scoping" "^7.0.0" + "@babel/plugin-transform-classes" "^7.0.0" + "@babel/plugin-transform-computed-properties" "^7.0.0" + "@babel/plugin-transform-destructuring" "^7.0.0" + "@babel/plugin-transform-flow-strip-types" "^7.0.0" + "@babel/plugin-transform-for-of" "^7.0.0" + "@babel/plugin-transform-function-name" "^7.0.0" + "@babel/plugin-transform-literals" "^7.0.0" + "@babel/plugin-transform-member-expression-literals" "^7.0.0" + "@babel/plugin-transform-modules-commonjs" "^7.0.0" + "@babel/plugin-transform-object-super" "^7.0.0" + "@babel/plugin-transform-parameters" "^7.0.0" + "@babel/plugin-transform-property-literals" "^7.0.0" + "@babel/plugin-transform-react-display-name" "^7.0.0" + "@babel/plugin-transform-react-jsx" "^7.0.0" + "@babel/plugin-transform-shorthand-properties" "^7.0.0" + "@babel/plugin-transform-spread" "^7.0.0" + "@babel/plugin-transform-template-literals" "^7.0.0" + babel-plugin-syntax-trailing-function-commas "^7.0.0-beta.0" + babel-register@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071" @@ -3609,7 +5733,7 @@ babel-template@^6.24.1, babel-template@^6.26.0: babylon "^6.18.0" lodash "^4.17.4" -babel-traverse@^6.24.1, babel-traverse@^6.26.0: +babel-traverse@6.26.0, babel-traverse@^6.24.1, babel-traverse@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" integrity sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4= @@ -3642,11 +5766,16 @@ babelify@^7.3.0: babel-core "^6.0.14" object-assign "^4.0.0" -babylon@^6.18.0: +babylon@6.18.0, babylon@^6.18.0: version "6.18.0" resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ== +backo2@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/backo2/-/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947" + integrity sha1-MasayLEpNjRj41s+u2n038+6eUc= + backoff@^2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/backoff/-/backoff-2.5.0.tgz#f616eda9d3e4b66b8ca7fca79f695722c5f8e26f" @@ -3666,6 +5795,18 @@ base-x@^3.0.2, base-x@^3.0.8: dependencies: safe-buffer "^5.0.1" +base32-decode@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/base32-decode/-/base32-decode-1.0.0.tgz#2a821d6a664890c872f20aa9aca95a4b4b80e2a7" + integrity sha512-KNWUX/R7wKenwE/G/qFMzGScOgVntOmbE27vvc6GrniDGYb6a5+qWcuoXl8WIOQL7q0TpK7nZDm1Y04Yi3Yn5g== + +base32-encode@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/base32-encode/-/base32-encode-1.2.0.tgz#e150573a5e431af0a998e32bdfde7045725ca453" + integrity sha512-cHFU8XeRyx0GgmoWi5qHMCVRiqU6J3MHWxVgun7jggCBUpVzm1Ir7M9dYr2whjSNc3tFeXfQ/oZjQu/4u55h9A== + dependencies: + to-data-view "^1.1.0" + base64-js@^1.3.0, base64-js@^1.3.1: version "1.5.1" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" @@ -3703,6 +5844,11 @@ bech32@1.1.4: resolved "https://registry.yarnpkg.com/bech32/-/bech32-1.1.4.tgz#e38c9f37bf179b8eb16ae3a772b40c356d4832e9" integrity sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ== +bech32@=1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/bech32/-/bech32-1.1.3.tgz#bd47a8986bbb3eec34a56a097a84b8d3e9a2dfcd" + integrity sha512-yuVFUvrNcoJi0sv5phmqc6P+Fl1HjRDRNOOkHY2X/3LBy2bIGNSFx4fZ95HMaXHupuS7cZR15AsvtmCIF4UEyg== + before-after-hook@^2.2.0: version "2.2.1" resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-2.2.1.tgz#73540563558687586b52ed217dad6a802ab1549c" @@ -3715,6 +5861,11 @@ better-path-resolve@1.0.0: dependencies: is-windows "^1.0.0" +big.js@^5.2.2: + version "5.2.2" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" + integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== + bignumber.js@^9.0.0, bignumber.js@^9.0.1: version "9.0.1" resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.0.1.tgz#8d7ba124c882bfd8e43260c67475518d0689e4e5" @@ -3725,7 +5876,7 @@ binary-extensions@^2.0.0: resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== -bindings@^1.4.0, bindings@^1.5.0: +bindings@^1.3.0, bindings@^1.4.0, 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== @@ -3737,6 +5888,19 @@ bintrees@1.0.1: resolved "https://registry.yarnpkg.com/bintrees/-/bintrees-1.0.1.tgz#0e655c9b9c2435eaab68bf4027226d2b55a34524" integrity sha1-DmVcm5wkNeqraL9AJyJtK1WjRSQ= +bip32@^2.0.5: + version "2.0.6" + resolved "https://registry.yarnpkg.com/bip32/-/bip32-2.0.6.tgz#6a81d9f98c4cd57d05150c60d8f9e75121635134" + integrity sha512-HpV5OMLLGTjSVblmrtYRfFFKuQB+GArM0+XP8HGWfJ5vxYBqo+DesvJwOdC2WJ3bCkZShGf0QIfoIpeomVzVdA== + dependencies: + "@types/node" "10.12.18" + bs58check "^2.1.1" + create-hash "^1.2.0" + create-hmac "^1.1.7" + tiny-secp256k1 "^1.1.3" + typeforce "^1.11.5" + wif "^2.0.6" + bip39@2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/bip39/-/bip39-2.5.0.tgz#51cbd5179460504a63ea3c000db3f787ca051235" @@ -3748,6 +5912,16 @@ bip39@2.5.0: safe-buffer "^5.0.1" unorm "^1.3.3" +bip39@^3.0.2: + version "3.0.4" + resolved "https://registry.yarnpkg.com/bip39/-/bip39-3.0.4.tgz#5b11fed966840b5e1b8539f0f54ab6392969b2a0" + integrity sha512-YZKQlb752TrUWqHWj7XAwCSjYEgGAk+/Aas3V7NyjQeZYsztO8JnQUaCWhcnL4T+jL8nvB8typ2jRPzTlgugNw== + dependencies: + "@types/node" "11.11.6" + create-hash "^1.1.0" + pbkdf2 "^3.0.9" + randombytes "^2.0.1" + bip66@^1.1.5: version "1.1.5" resolved "https://registry.yarnpkg.com/bip66/-/bip66-1.1.5.tgz#01fa8748785ca70955d5011217d1b3139969ca22" @@ -3755,7 +5929,28 @@ bip66@^1.1.5: dependencies: safe-buffer "^5.0.1" -bl@^4.0.3: +bitcore-lib@^8.22.2, bitcore-lib@^8.25.8: + version "8.25.8" + resolved "https://registry.yarnpkg.com/bitcore-lib/-/bitcore-lib-8.25.8.tgz#b4a9d6cd715596297d958d2ad12fdf09e54a16d7" + integrity sha512-vxNJ+DLAeC2V8iPa6dRvUbb/Nm3Vr/cXKhCKSIxj8YPU2tP0QiwEz2Lu9sbqhtsmIerS+F1eeHulzS21MpS2GQ== + dependencies: + bech32 "=1.1.3" + bn.js "=4.11.8" + bs58 "^4.0.1" + buffer-compare "=1.1.1" + elliptic "^6.5.3" + inherits "=2.0.1" + lodash "^4.17.20" + +bitcore-mnemonic@^8.22.2: + version "8.25.8" + resolved "https://registry.yarnpkg.com/bitcore-mnemonic/-/bitcore-mnemonic-8.25.8.tgz#fbca9fda34d9f5fa66a6c13420b63b3ac10a4720" + integrity sha512-xViUIa9YiJ2UP5yNVAfFfsiCKB7ed+wJuPo6jz36GE91nPPxxNJ2LOMIVQMSYj89g77FsgQmAx/qj2g35G34WA== + dependencies: + bitcore-lib "^8.25.8" + unorm "^1.4.1" + +bl@^4.0.0, bl@^4.0.3: version "4.1.0" resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== @@ -3769,6 +5964,13 @@ blakejs@^1.1.0: resolved "https://registry.yarnpkg.com/blakejs/-/blakejs-1.1.0.tgz#69df92ef953aa88ca51a32df6ab1c54a155fc7a5" integrity sha1-ad+S75U6qIylGjLfarHFShVfx6U= +blob-to-it@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/blob-to-it/-/blob-to-it-1.0.2.tgz#bc76550638ca13280dbd3f202422a6a132ffcc8d" + integrity sha512-yD8tikfTlUGEOSHExz4vDCIQFLaBPXIL0KcxGQt9RbwMVXBEh+jokdJyStvTXPgWrdKfwgk7RX8GPsgrYzsyng== + dependencies: + browser-readablestream-to-it "^1.0.2" + bluebird@^3.5.0, bluebird@^3.5.2, bluebird@^3.5.3, bluebird@^3.7.2: version "3.7.2" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" @@ -3779,7 +5981,7 @@ bn.js@4.11.6: resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.6.tgz#53344adb14617a13f6e8dd2ce28905d1c0ba3215" integrity sha1-UzRK2xRhehP26N0s4okF0cC6MhU= -bn.js@4.11.8: +bn.js@4.11.8, bn.js@=4.11.8: version "4.11.8" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" integrity sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA== @@ -3794,7 +5996,7 @@ bn.js@^5.0.0, bn.js@^5.1.1, bn.js@^5.1.2, bn.js@^5.1.3, bn.js@^5.2.0: resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.0.tgz#358860674396c6997771a9d051fcc1b57d4ae002" integrity sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw== -body-parser@1.19.0, body-parser@^1.16.0: +body-parser@1.19.0, body-parser@^1.16.0, body-parser@^1.18.3: version "1.19.0" resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a" integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw== @@ -3810,6 +6012,24 @@ body-parser@1.19.0, body-parser@^1.16.0: raw-body "2.4.0" type-is "~1.6.17" +boolbase@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" + integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= + +borc@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/borc/-/borc-2.1.2.tgz#6ce75e7da5ce711b963755117dd1b187f6f8cf19" + integrity sha512-Sy9eoUi4OiKzq7VovMn246iTo17kzuyHJKomCfpWMlI6RpfN1gk95w7d7gH264nApVLg0HZfcpz62/g4VH1Y4w== + dependencies: + bignumber.js "^9.0.0" + buffer "^5.5.0" + commander "^2.15.0" + ieee754 "^1.1.13" + iso-url "~0.4.7" + json-text-sequence "~0.1.0" + readable-stream "^3.6.0" + boxen@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/boxen/-/boxen-1.3.0.tgz#55c6c39a8ba58d9c61ad22cd877532deb665a20b" @@ -3831,6 +6051,15 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" +braces@^1.8.2: + version "1.8.5" + resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" + integrity sha1-uneWLhLf+WnWt2cR6RS3N4V79qc= + dependencies: + expand-range "^1.8.1" + preserve "^0.2.0" + repeat-element "^1.1.2" + braces@^2.3.1: version "2.3.2" resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" @@ -3866,11 +6095,21 @@ brorand@^1.0.1, brorand@^1.1.0: resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= +browser-headers@^0.4.0, browser-headers@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/browser-headers/-/browser-headers-0.4.1.tgz#4308a7ad3b240f4203dbb45acedb38dc2d65dd02" + integrity sha512-CA9hsySZVo9371qEHjHZtYxV2cFtVj5Wj/ZHi8ooEsrtm4vOnl9Y9HmyYWk9q+05d7K3rdoAE0j3MVEFVvtQtg== + browser-or-node@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/browser-or-node/-/browser-or-node-1.3.0.tgz#f2a4e8568f60263050a6714b2cc236bb976647a7" integrity sha512-0F2z/VSnLbmEeBcUrSuDH5l0HxTXdQQzLjkmBR4cYfvg1zJrKSlmIZFqyFR8oX0NrwPhy3c3HQ6i3OxMbew4Tg== +browser-readablestream-to-it@^1.0.1, browser-readablestream-to-it@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/browser-readablestream-to-it/-/browser-readablestream-to-it-1.0.2.tgz#f6b8d18e7a35b0321359261a32aa2c70f46921c4" + integrity sha512-lv4M2Z6RKJpyJijJzBQL5MNssS7i8yedl+QkhnLCyPtgNGNSXv1KthzUnye9NlRAtBAI80X6S9i+vK09Rzjcvg== + browser-stdout@1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" @@ -3938,14 +6177,25 @@ browserslist@^3.2.6: caniuse-lite "^1.0.30000844" electron-to-chromium "^1.3.47" -bs58@^4.0.0: +browserslist@^4.14.5, browserslist@^4.16.6: + version "4.16.6" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.6.tgz#d7901277a5a88e554ed305b183ec9b0c08f66fa2" + integrity sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ== + dependencies: + caniuse-lite "^1.0.30001219" + colorette "^1.2.2" + electron-to-chromium "^1.3.723" + escalade "^3.1.1" + node-releases "^1.1.71" + +bs58@^4.0.0, bs58@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a" integrity sha1-vhYedsNU9veIrkBx9j806MTwpCo= dependencies: base-x "^3.0.2" -bs58check@^2.1.2: +bs58check@<3.0.0, bs58check@^2.1.1, bs58check@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/bs58check/-/bs58check-2.1.2.tgz#53b018291228d82a5aa08e7d796fdafda54aebfc" integrity sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA== @@ -3954,21 +6204,55 @@ bs58check@^2.1.2: create-hash "^1.1.0" safe-buffer "^5.1.2" +bser@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" + integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== + dependencies: + node-int64 "^0.4.0" + bsert@~0.0.10: version "0.0.10" resolved "https://registry.yarnpkg.com/bsert/-/bsert-0.0.10.tgz#231ac82873a1418c6ade301ab5cd9ae385895597" integrity sha512-NHNwlac+WPy4t2LoNh8pXk8uaIGH3NSaIUbTTRXGpE2WEbq0te/tDykYHkFK57YKLPjv/aGHmbqvnGeVWDz57Q== +btoa-lite@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/btoa-lite/-/btoa-lite-1.0.0.tgz#337766da15801210fdd956c22e9c6891ab9d0337" + integrity sha1-M3dm2hWAEhD92VbCLpxokaudAzc= + +btoa@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/btoa/-/btoa-1.2.1.tgz#01a9909f8b2c93f6bf680ba26131eb30f7fa3d73" + integrity sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g== + +buffer-compare@=1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/buffer-compare/-/buffer-compare-1.1.1.tgz#5be7be853af89198d1f4ddc090d1d66a48aef596" + integrity sha1-W+e+hTr4kZjR9N3AkNHWakiu9ZY= + buffer-equal-constant-time@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819" integrity sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk= -buffer-from@^1.0.0, buffer-from@^1.1.0: +buffer-from@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.0.tgz#87fcaa3a298358e0ade6e442cfce840740d1ad04" + integrity sha512-c5mRlguI/Pe2dSZmpER62rSCu0ryKmWddzRYsuXc50U2/g8jMOulc31VZMa4mYx31U5xsmSOpDCgH88Vl9cDGQ== + +buffer-from@1.1.1, buffer-from@^1.0.0, buffer-from@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== +buffer-pipe@0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/buffer-pipe/-/buffer-pipe-0.0.3.tgz#242197681d4591e7feda213336af6c07a5ce2409" + integrity sha512-GlxfuD/NrKvCNs0Ut+7b1IHjylfdegMBxQIlZHj7bObKVQBxB5S84gtm2yu1mQ8/sSggceWBDPY0cPXgvX2MuA== + dependencies: + safe-buffer "^5.1.2" + buffer-reverse@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/buffer-reverse/-/buffer-reverse-1.0.1.tgz#49283c8efa6f901bc01fa3304d06027971ae2f60" @@ -3991,7 +6275,7 @@ buffer-xor@^2.0.1, buffer-xor@^2.0.2: dependencies: safe-buffer "^5.1.1" -buffer@^5.0.5, buffer@^5.2.1, buffer@^5.5.0, buffer@^5.6.0: +buffer@^5.0.5, buffer@^5.2.1, buffer@^5.4.3, buffer@^5.5.0, buffer@^5.6.0, buffer@^5.7.0: version "5.7.1" resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== @@ -3999,6 +6283,14 @@ buffer@^5.0.5, buffer@^5.2.1, buffer@^5.5.0, buffer@^5.6.0: base64-js "^1.3.1" ieee754 "^1.1.13" +buffer@^6.0.1: + version "6.0.3" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" + integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.2.1" + bufferutil@^4.0.1: version "4.0.3" resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.3.tgz#66724b756bed23cd7c28c4d306d7994f9943cc6b" @@ -4016,6 +6308,13 @@ builtins@^1.0.3: resolved "https://registry.yarnpkg.com/builtins/-/builtins-1.0.3.tgz#cb94faeb61c8696451db36534e1422f94f0aee88" integrity sha1-y5T662HIaWRR2zZTThQi+U8K7og= +busboy@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/busboy/-/busboy-0.3.1.tgz#170899274c5bf38aae27d5c62b71268cd585fd1b" + integrity sha512-y7tTxhGKXcyBxRKAni+awqx8uqaJKrSFSNFSeRG5CsWNdmy2BIK+6VGWEW7TZnIO/533mtMEA4rOevQV815YJw== + dependencies: + dicer "0.3.0" + byline@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/byline/-/byline-5.0.0.tgz#741c5216468eadc457b03410118ad77de8c1ddb1" @@ -4118,6 +6417,30 @@ callsites@^3.0.0: resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== +camel-case@4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-4.1.1.tgz#1fc41c854f00e2f7d0139dfeba1542d6896fe547" + integrity sha512-7fa2WcG4fYFkclIvEmxBbTvmibwF2/agfEBc6q3lOpVu0A13ltLsA+Hr/8Hp6kp5f+G7hKi6t8lys6XxP+1K6Q== + dependencies: + pascal-case "^3.1.1" + tslib "^1.10.0" + +camel-case@4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-4.1.2.tgz#9728072a954f805228225a6deea6b38461e1bd5a" + integrity sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw== + dependencies: + pascal-case "^3.1.2" + tslib "^2.0.3" + +camel-case@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-3.0.0.tgz#ca3c3688a4e9cf3a4cda777dc4dcbc713249cf73" + integrity sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M= + dependencies: + no-case "^2.2.0" + upper-case "^1.1.1" + camelcase-keys@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" @@ -4140,7 +6463,7 @@ camelcase@5.0.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.0.0.tgz#03295527d58bd3cd4aa75363f35b2e8d97be2f42" integrity sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA== -camelcase@^2.0.0: +camelcase@^2.0.0, camelcase@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" integrity sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8= @@ -4170,6 +6493,11 @@ caniuse-lite@^1.0.30000844: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001207.tgz#364d47d35a3007e528f69adb6fecb07c2bb2cc50" integrity sha512-UPQZdmAsyp2qfCTiMU/zqGSWOYaY9F9LL61V8f+8MrubsaDGpaHD9HRV/EWZGULZn0Hxu48SKzI5DgFwTvHuYw== +caniuse-lite@^1.0.30001219: + version "1.0.30001228" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001228.tgz#bfdc5942cd3326fa51ee0b42fbef4da9d492a7fa" + integrity sha512-QQmLOGJ3DEgokHbMSA8cj2a+geXqmnpyOFT0lhQV6P3/YOJvGDEwoedcwxEQ30gJIwIIunHIicunJ2rzK5gB2A== + cardinal@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/cardinal/-/cardinal-2.1.1.tgz#7cc1055d822d212954d07b085dea251cc7bc5505" @@ -4183,6 +6511,14 @@ caseless@^0.12.0, caseless@~0.12.0: resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= +cbor@^5.1.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/cbor/-/cbor-5.2.0.tgz#4cca67783ccd6de7b50ab4ed62636712f287a67c" + integrity sha512-5IMhi9e1QU76ppa5/ajP1BmMWZ2FHkhAhjeVKQ/EFCgYSEaeVaoGtL7cxJskf9oCCk+XjzaIdc3IuU/dbA/o2A== + dependencies: + bignumber.js "^9.0.1" + nofilter "^1.0.4" + chai-as-promised@^7.1.1: version "7.1.1" resolved "https://registry.yarnpkg.com/chai-as-promised/-/chai-as-promised-7.1.1.tgz#08645d825deb8696ee61725dbf590c012eb00ca0" @@ -4202,16 +6538,7 @@ chai@4.3.4, chai@^4.2.0, chai@^4.3.0, chai@^4.3.1, chai@^4.3.3, chai@^4.3.4: pathval "^1.1.1" type-detect "^4.0.5" -chalk@2.4.2, chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.4.1, chalk@^2.4.2: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -chalk@^1.1.3: +chalk@1.1.3, chalk@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= @@ -4222,6 +6549,15 @@ chalk@^1.1.3: strip-ansi "^3.0.0" supports-color "^2.0.0" +chalk@2.4.2, chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.4.1, chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + chalk@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" @@ -4238,6 +6574,30 @@ chalk@^4.0.0, chalk@^4.1.0: ansi-styles "^4.1.0" supports-color "^7.1.0" +change-case@3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/change-case/-/change-case-3.0.2.tgz#fd48746cce02f03f0a672577d1d3a8dc2eceb037" + integrity sha512-Mww+SLF6MZ0U6kdg11algyKd5BARbyM4TbFBepwowYSR5ClfQGCGtxNXgykpN0uF/bstWeaGDT4JWaDh8zWAHA== + dependencies: + camel-case "^3.0.0" + constant-case "^2.0.0" + dot-case "^2.1.0" + header-case "^1.0.0" + is-lower-case "^1.1.0" + is-upper-case "^1.1.0" + lower-case "^1.1.1" + lower-case-first "^1.0.0" + no-case "^2.3.2" + param-case "^2.1.0" + pascal-case "^2.0.0" + path-case "^2.1.0" + sentence-case "^2.1.0" + snake-case "^2.1.0" + swap-case "^1.1.0" + title-case "^2.1.0" + upper-case "^1.1.1" + upper-case-first "^1.1.0" + chardet@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" @@ -4260,6 +6620,31 @@ checkpoint-store@^1.1.0: dependencies: functional-red-black-tree "^1.0.1" +cheerio@0.20.0: + version "0.20.0" + resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-0.20.0.tgz#5c710f2bab95653272842ba01c6ea61b3545ec35" + integrity sha1-XHEPK6uVZTJyhCugHG6mGzVF7DU= + dependencies: + css-select "~1.2.0" + dom-serializer "~0.1.0" + entities "~1.1.1" + htmlparser2 "~3.8.1" + lodash "^4.1.0" + optionalDependencies: + jsdom "^7.0.2" + +cheerio@1.0.0-rc.2: + version "1.0.0-rc.2" + resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0-rc.2.tgz#4b9f53a81b27e4d5dac31c0ffd0cfa03cc6830db" + integrity sha1-S59TqBsn5NXawxwP/Qz6A8xoMNs= + dependencies: + css-select "~1.2.0" + dom-serializer "~0.1.0" + entities "~1.1.1" + htmlparser2 "^3.9.1" + lodash "^4.15.0" + parse5 "^3.0.1" + chokidar@3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.3.0.tgz#12c0714668c55800f659e262d4962a97faf554a6" @@ -4275,6 +6660,21 @@ chokidar@3.3.0: optionalDependencies: fsevents "~2.1.1" +chokidar@3.4.2: + version "3.4.2" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.4.2.tgz#38dc8e658dec3809741eb3ef7bb0a47fe424232d" + integrity sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A== + dependencies: + anymatch "~3.1.1" + braces "~3.0.2" + glob-parent "~5.1.0" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.4.0" + optionalDependencies: + fsevents "~2.1.2" + chokidar@3.5.1, chokidar@^3.4.0: version "3.5.1" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.1.tgz#ee9ce7bbebd2b79f49f304799d5468e31e14e68a" @@ -4316,6 +6716,16 @@ cids@^0.7.1: multicodec "^1.0.0" multihashes "~0.4.15" +cids@^1.0.0, cids@^1.1.4, cids@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/cids/-/cids-1.1.6.tgz#ac7aea7dbcabaa64ca242b5d970d596a5c34d006" + integrity sha512-5P+Jas2bVpjiHibp/SOwKY+v7JhAjTChaAZN+vCIrsWXn/JZV0frX22Vp5zZgEyJRPco79pX+yNQ2S3LkRukHQ== + dependencies: + multibase "^4.0.1" + multicodec "^3.0.1" + multihashes "^4.0.1" + uint8arrays "^2.1.3" + cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" @@ -4324,6 +6734,11 @@ cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: inherits "^2.0.1" safe-buffer "^5.0.1" +circular-json@^0.5.9: + version "0.5.9" + resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.5.9.tgz#932763ae88f4f7dead7a0d09c8a51a4743a53b1d" + integrity sha512-4ivwqHpIFJZBuhN3g/pEcdbnGUywkBblloGbkglyloVjjR3uT6tieI89MVOfbP2tHX5sgb01FuLgAOzebNlJNQ== + class-is@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/class-is/-/class-is-1.1.0.tgz#9d3c0fba0440d211d843cec3dedfa48055005825" @@ -4349,13 +6764,25 @@ cli-boxes@^1.0.0: resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143" integrity sha1-T6kXw+WclKAEzWH47lCdplFocUM= -cli-cursor@^3.1.0: +cli-cursor@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" + integrity sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU= + dependencies: + restore-cursor "^2.0.0" + +cli-cursor@^3.0.0, cli-cursor@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== dependencies: restore-cursor "^3.1.0" +cli-spinners@^2.0.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.6.0.tgz#36c7dc98fb6a9a76bd6238ec3f77e2425627e939" + integrity sha512-t+4/y50K/+4xcCRosKkA7W4gTr1MySvLV0q+PxmG7FJ5g+66ChKurYjxBCjHggHH3HA5Hh9cy+lcUGWDqVH+4Q== + cli-table3@^0.5.0: version "0.5.1" resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.5.1.tgz#0252372d94dfc40dbd8df06005f48f31f656f202" @@ -4414,6 +6841,11 @@ cliui@^7.0.2: strip-ansi "^6.0.0" wrap-ansi "^7.0.0" +clone-buffer@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/clone-buffer/-/clone-buffer-1.0.0.tgz#e3e25b207ac4e701af721e2cb5a16792cac3dc58" + integrity sha1-4+JbIHrE5wGvch4staFnksrD3Fg= + clone-deep@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" @@ -4430,12 +6862,22 @@ clone-response@^1.0.2: dependencies: mimic-response "^1.0.0" -clone@2.1.2, clone@^2.0.0: +clone-stats@^0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-0.0.1.tgz#b88f94a82cf38b8791d58046ea4029ad88ca99d1" + integrity sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE= + +clone@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.1.tgz#d217d1e961118e3ac9a4b8bba3285553bf647cdb" + integrity sha1-0hfR6WERjjrJpLi7oyhVU79kfNs= + +clone@2.1.2, clone@^2.0.0, clone@^2.1.1: version "2.1.2" resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f" integrity sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18= -clone@^1.0.2: +clone@^1.0.0, clone@^1.0.2: version "1.0.4" resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4= @@ -4474,6 +6916,16 @@ color-convert@^2.0.1: dependencies: color-name "~1.1.4" +color-logger@0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/color-logger/-/color-logger-0.0.3.tgz#d9b22dd1d973e166b18bf313f9f481bba4df2018" + integrity sha1-2bIt0dlz4Waxi/MT+fSBu6TfIBg= + +color-logger@0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/color-logger/-/color-logger-0.0.6.tgz#e56245ef29822657110c7cb75a9cd786cb69ed1b" + integrity sha1-5WJF7ymCJlcRDHy3WpzXhstp7Rs= + color-name@1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" @@ -4484,6 +6936,11 @@ color-name@~1.1.4: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== +colorette@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.2.tgz#cbcc79d5e99caea2dbf10eb3a26fd8b3e6acfa94" + integrity sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w== + colors@1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" @@ -4528,7 +6985,7 @@ commander@3.0.2: resolved "https://registry.yarnpkg.com/commander/-/commander-3.0.2.tgz#6837c3fb677ad9933d1cfba42dd14d5117d6b39e" integrity sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow== -commander@^2.12.1, commander@^2.19.0, commander@^2.20.0: +commander@^2.12.1, commander@^2.15.0, commander@^2.19.0, commander@^2.20.0, commander@^2.20.3: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== @@ -4541,16 +6998,35 @@ compare-func@^2.0.0: array-ify "^1.0.0" dot-prop "^5.1.0" +component-emitter@1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" + integrity sha1-E3kY1teCg/ffemt8WmPhQOaUJeY= + component-emitter@^1.2.1: version "1.3.0" resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== +compound-subject@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/compound-subject/-/compound-subject-0.0.1.tgz#271554698a15ae608b1dfcafd30b7ba1ea892c4b" + integrity sha1-JxVUaYoVrmCLHfyv0wt7oeqJLEs= + concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= +concat-stream@1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.5.1.tgz#f3b80acf9e1f48e3875c0688b41b6c31602eea1c" + integrity sha1-87gKz54fSOOHXAaItBtsMWAu6hw= + dependencies: + inherits "~2.0.1" + readable-stream "~2.0.0" + typedarray "~0.0.5" + concat-stream@^1.5.1, concat-stream@^1.6.0, concat-stream@^1.6.2: version "1.6.2" resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" @@ -4579,11 +7055,31 @@ config-chain@^1.1.12: ini "^1.3.4" proto-list "~1.2.1" +configstore@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/configstore/-/configstore-4.0.0.tgz#5933311e95d3687efb592c528b922d9262d227e7" + integrity sha512-CmquAXFBocrzaSM8mtGPMM/HiWmyIpr4CcJl/rgY2uCObZ/S7cKU0silxslqJejl+t/T9HS8E0PUNQD81JGUEQ== + dependencies: + dot-prop "^4.1.0" + graceful-fs "^4.1.2" + make-dir "^1.0.0" + unique-string "^1.0.0" + write-file-atomic "^2.0.0" + xdg-basedir "^3.0.0" + console-control-strings@^1.0.0, console-control-strings@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= +constant-case@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/constant-case/-/constant-case-2.0.0.tgz#4175764d389d3fa9c8ecd29186ed6005243b6a46" + integrity sha1-QXV2TTidP6nI7NKRhu1gBSQ7akY= + dependencies: + snake-case "^2.1.0" + upper-case "^1.1.1" + content-disposition@0.5.3: version "0.5.3" resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd" @@ -4690,7 +7186,7 @@ conventional-recommended-bump@^6.1.0: meow "^8.0.0" q "^1.5.1" -convert-source-map@^1.5.1: +convert-source-map@1.X, convert-source-map@^1.5.1, convert-source-map@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== @@ -4735,16 +7231,34 @@ copyfiles@^2.3.0: untildify "^4.0.0" yargs "^16.1.0" +core-js-compat@^3.9.1: + version "3.12.1" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.12.1.tgz#2c302c4708505fa7072b0adb5156d26f7801a18b" + integrity sha512-i6h5qODpw6EsHAoIdQhKoZdWn+dGBF3dSS8m5tif36RlWvW3A6+yu2S16QHUo3CrkzrnEskMAt9f8FxmY9fhWQ== + dependencies: + browserslist "^4.16.6" + semver "7.0.0" + core-js-pure@^3.0.1: version "3.10.0" resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.10.0.tgz#dab9d6b141779b622b40567e7a536d2276646c15" integrity sha512-CC582enhrFZStO4F8lGI7QL3SYx7/AIRc+IdSi3btrQGrVsTawo5K/crmKbRrQ+MOMhNX4v+PATn0k2NN6wI7A== +core-js-pure@^3.10.2: + version "3.12.1" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.12.1.tgz#934da8b9b7221e2a2443dc71dfa5bd77a7ea00b8" + integrity sha512-1cch+qads4JnDSWsvc7d6nzlKAippwjUlf6vykkTLW53VSV+NkE6muGBToAjEA8pG90cSfcud3JgVmW2ds5TaQ== + core-js@^2.4.0, core-js@^2.5.0: version "2.6.12" resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec" integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ== +core-js@^3.0.1: + version "3.12.1" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.12.1.tgz#6b5af4ff55616c08a44d386f1f510917ff204112" + integrity sha512-Ne9DKPHTObRuB09Dru5AjwKjY4cJHVGu+y5f7coGn1E9Grkc3p2iBwE9AI/nJzsE29mQF7oq+mhYYRqOMFN1Bw== + core-util-is@1.0.2, core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" @@ -4813,6 +7327,20 @@ create-require@^1.1.0: resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== +cross-fetch@3.0.6: + version "3.0.6" + resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.0.6.tgz#3a4040bc8941e653e0e9cf17f29ebcd177d3365c" + integrity sha512-KBPUbqgFjzWlVcURG+Svp9TlhA5uliYtiNx/0r8nv0pdypeQCRJ9IaSIc3q/x3q8t3F75cHuwxVql1HFGHCNJQ== + dependencies: + node-fetch "2.6.1" + +cross-fetch@3.1.4, cross-fetch@^3.0.4: + version "3.1.4" + resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.4.tgz#9723f3a3a247bf8b89039f3a380a9244e8fa2f39" + integrity sha512-1eAtFWdIubi6T4XPy6ei9iUFoKpUkIF971QLN8lIvvvwueI65+Nw5haMNKUwfJxabqlIIDODJKGrQ66gxC0PbQ== + dependencies: + node-fetch "2.6.1" + cross-fetch@^2.1.0, cross-fetch@^2.1.1: version "2.2.3" resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-2.2.3.tgz#e8a0b3c54598136e037f8650f8e823ccdfac198e" @@ -4877,6 +7405,53 @@ crypto-js@^3.1.9-1: resolved "https://registry.yarnpkg.com/crypto-js/-/crypto-js-3.3.0.tgz#846dd1cce2f68aacfa156c8578f926a609b7976b" integrity sha512-DIT51nX0dCfKltpRiXV+/TVZq+Qq2NgF4644+K7Ttnla7zEzqc+kjJyiB96BHNyUTBxyjzRcZYpUdZa+QAqi6Q== +crypto-random-string@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" + integrity sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4= + +css-select@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-1.2.0.tgz#2b3a110539c5355f1cd8d314623e870b121ec858" + integrity sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg= + dependencies: + boolbase "~1.0.0" + css-what "2.1" + domutils "1.5.1" + nth-check "~1.0.1" + +css-what@2.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.3.tgz#a6d7604573365fe74686c3f311c56513d88285f2" + integrity sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg== + +css@2.X: + version "2.2.4" + resolved "https://registry.yarnpkg.com/css/-/css-2.2.4.tgz#c646755c73971f2bba6a601e2cf2fd71b1298929" + integrity sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw== + dependencies: + inherits "^2.0.3" + source-map "^0.6.1" + source-map-resolve "^0.5.2" + urix "^0.1.0" + +cssfilter@0.0.10: + version "0.0.10" + resolved "https://registry.yarnpkg.com/cssfilter/-/cssfilter-0.0.10.tgz#c6d2672632a2e5c83e013e6864a42ce8defd20ae" + integrity sha1-xtJnJjKi5cg+AT5oZKQs6N79IK4= + +cssom@0.3.x, "cssom@>= 0.3.0 < 0.4.0": + version "0.3.8" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" + integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== + +"cssstyle@>= 0.2.29 < 0.3.0": + version "0.2.37" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-0.2.37.tgz#541097234cb2513c83ceed3acddc27ff27987d54" + integrity sha1-VBCXI0yyUTyDzu06zdwn/yeYfVQ= + dependencies: + cssom "0.3.x" + csv-generate@^3.4.0: version "3.4.0" resolved "https://registry.yarnpkg.com/csv-generate/-/csv-generate-3.4.0.tgz#360ed73ef8ec7119515a47c3bd5970ac4b988f00" @@ -4929,6 +7504,11 @@ dashdash@^1.12.0: dependencies: assert-plus "^1.0.0" +dataloader@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/dataloader/-/dataloader-2.0.0.tgz#41eaf123db115987e21ca93c005cd7753c55fe6f" + integrity sha512-YzhyDAwA4TaQIhM5go+vCLmU0UikghC/t9DTQYZR2M/UvZ1MdOhPezSDZcjj9uqQJOMqjLcpWtyW2iNINdlatQ== + dateformat@^3.0.0: version "3.0.3" resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-3.0.3.tgz#a6e37499a4d9a9cf85ef5872044d62901c9889ae" @@ -4944,13 +7524,29 @@ death@^1.1.0: resolved "https://registry.yarnpkg.com/death/-/death-1.1.0.tgz#01aa9c401edd92750514470b8266390c66c67318" integrity sha1-AaqcQB7dknUFFEcLgmY5DGbGcxg= -debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0, debug@^2.6.8, debug@^2.6.9: +debug-fabulous@0.0.X: + version "0.0.4" + resolved "https://registry.yarnpkg.com/debug-fabulous/-/debug-fabulous-0.0.4.tgz#fa071c5d87484685424807421ca4b16b0b1a0763" + integrity sha1-+gccXYdIRoVCSAdCHKSxawsaB2M= + dependencies: + debug "2.X" + lazy-debug-legacy "0.0.X" + object-assign "4.1.0" + +debug@2.6.9, debug@2.X, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0, debug@^2.6.8, debug@^2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== dependencies: ms "2.0.0" +debug@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" + integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== + dependencies: + ms "2.0.0" + debug@3.2.6: version "3.2.6" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" @@ -4958,14 +7554,21 @@ debug@3.2.6: dependencies: ms "^2.1.1" -debug@4, debug@4.3.1, debug@^4.1.0, debug@^4.1.1: +debug@4, debug@4.3.1, debug@^4.1.0, debug@^4.1.1, debug@^4.2.0, debug@^4.3.1: version "4.3.1" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== dependencies: ms "2.1.2" -debug@^3.1.0: +debug@4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" + integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== + dependencies: + ms "^2.1.1" + +debug@^3.1.0, debug@^3.2.6: version "3.2.7" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== @@ -5019,6 +7622,13 @@ dedent@^0.7.0: resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" integrity sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw= +deep-eql@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-0.1.3.tgz#ef558acab8de25206cd713906d74e56930eb69f2" + integrity sha1-71WKyrjeJSBs1xOQbXTlaTDrafI= + dependencies: + type-detect "0.1.1" + deep-eql@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-3.0.1.tgz#dfc9404400ad1c8fe023e7da1df1c147c4b444df" @@ -5075,6 +7685,14 @@ deferred-leveldown@~4.0.0: abstract-leveldown "~5.0.0" inherits "^2.0.3" +deferred-leveldown@~5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/deferred-leveldown/-/deferred-leveldown-5.0.1.tgz#1642eb18b535dfb2b6ac4d39fb10a9cbcfd13b09" + integrity sha512-BXohsvTedWOLkj2n/TY+yqVlrCWa2Zs8LSxh3uCAgFOru7/pjxKyZAexGa1j83BaKloER4PqUyQ9rGPJLt9bqA== + dependencies: + abstract-leveldown "~6.0.0" + inherits "^2.0.3" + deferred-leveldown@~5.3.0: version "5.3.0" resolved "https://registry.yarnpkg.com/deferred-leveldown/-/deferred-leveldown-5.3.0.tgz#27a997ad95408b61161aa69bd489b86c71b78058" @@ -5117,6 +7735,11 @@ defined@~1.0.0: resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" integrity sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM= +delay@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/delay/-/delay-5.0.0.tgz#137045ef1b96e5071060dd5be60bf9334436bd1d" + integrity sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw== + delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" @@ -5127,11 +7750,21 @@ delegates@^1.0.0: resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= +delimit-stream@0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/delimit-stream/-/delimit-stream-0.1.0.tgz#9b8319477c0e5f8aeb3ce357ae305fc25ea1cd2b" + integrity sha1-m4MZR3wOX4rrPONXrjBfwl6hzSs= + depd@^1.1.2, depd@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= +deprecated-decorator@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/deprecated-decorator/-/deprecated-decorator-0.1.6.tgz#00966317b7a12fe92f3cc831f7583af329b86c37" + integrity sha1-AJZjF7ehL+kvPMgx91g68ym4bDc= + deprecation@^2.0.0, deprecation@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/deprecation/-/deprecation-2.3.1.tgz#6368cbdb40abf3373b525ac87e4a260c3a700919" @@ -5167,11 +7800,16 @@ detect-indent@^6.0.0: resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-6.0.0.tgz#0abd0f549f69fc6659a254fe96786186b6f528fd" integrity sha512-oSyFlqaTHCItVRGK5RmrmjB+CmaMOW7IaNA/kdxqhoa6d17j/5ce9O9eWXmV/KEdRwqpQA+Vqe8a8Bsybu4YnA== -detect-libc@^1.0.3: +detect-libc@^1.0.2, detect-libc@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= +detect-newline@2.X: + version "2.1.0" + resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2" + integrity sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I= + detect-port@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/detect-port/-/detect-port-1.3.0.tgz#d9c40e9accadd4df5cac6a782aefd014d573d1f1" @@ -5188,21 +7826,28 @@ dezalgo@^1.0.0: asap "^2.0.0" wrappy "1" +dicer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/dicer/-/dicer-0.3.0.tgz#eacd98b3bfbf92e8ab5c2fdb71aaac44bb06b872" + integrity sha512-MdceRRWqltEG2dZqO769g27N/3PXfcKl04VhYnBlo2YhH7zPi88VebsjTKclaOyiuMaGU72hTfw3VkUitGcVCA== + dependencies: + streamsearch "0.1.2" + diff@3.5.0, diff@^3.1.0: version "3.5.0" resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== +diff@4.0.2, diff@^4.0.1, diff@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" + integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== + diff@5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b" integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== -diff@^4.0.1, diff@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" - integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== - diffie-hellman@^5.0.0: version "5.0.3" resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" @@ -5224,6 +7869,15 @@ directory-tree@^2.2.7: resolved "https://registry.yarnpkg.com/directory-tree/-/directory-tree-2.2.7.tgz#4617c794ee89d5618f03fffb7486c7e49df52ad2" integrity sha512-fgTad/YdV6Y2njsCRK4fl4ZUlGhmb5xj1qrZUIMjvnrKvghVqh8dkB+OUssjYVvb/Q2L+5+8XG0l5uTGI9/8iQ== +dns-over-http-resolver@^1.0.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/dns-over-http-resolver/-/dns-over-http-resolver-1.2.2.tgz#148740c1b14d81b78078a1af1d606f2d0c6cc255" + integrity sha512-4J7LoLl26mczU6LdWlhvNM51aWXHJmTz6iDUrGz1sqiAgNb6HzBc/huvkgqS6bYfbCzvlOKW/bGkugReliac0A== + dependencies: + debug "^4.2.0" + native-fetch "^3.0.0" + receptacle "^1.3.2" + docker-compose@^0.23.8: version "0.23.8" resolved "https://registry.yarnpkg.com/docker-compose/-/docker-compose-0.23.8.tgz#475b1e1294821d380316c54277ad350074186c6f" @@ -5231,11 +7885,81 @@ docker-compose@^0.23.8: dependencies: yaml "^1.10.2" +dom-serializer@0: + version "0.2.2" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.2.2.tgz#1afb81f533717175d478655debc5e332d9f9bb51" + integrity sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g== + dependencies: + domelementtype "^2.0.1" + entities "^2.0.0" + +dom-serializer@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.1.tgz#1ec4059e284babed36eec2941d4a970a189ce7c0" + integrity sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA== + dependencies: + domelementtype "^1.3.0" + entities "^1.1.1" + dom-walk@^0.1.0: version "0.1.2" resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.2.tgz#0c548bef048f4d1f2a97249002236060daa3fd84" integrity sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w== +domelementtype@1, domelementtype@^1.3.0, domelementtype@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f" + integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== + +domelementtype@^2.0.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.2.0.tgz#9a0b6c2782ed6a1c7323d42267183df9bd8b1d57" + integrity sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A== + +domhandler@2.3: + version "2.3.0" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.3.0.tgz#2de59a0822d5027fabff6f032c2b25a2a8abe738" + integrity sha1-LeWaCCLVAn+r/28DLCsloqir5zg= + dependencies: + domelementtype "1" + +domhandler@^2.3.0: + version "2.4.2" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.4.2.tgz#8805097e933d65e85546f726d60f5eb88b44f803" + integrity sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA== + dependencies: + domelementtype "1" + +domutils@1.5, domutils@1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf" + integrity sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8= + dependencies: + dom-serializer "0" + domelementtype "1" + +domutils@^1.5.1: + version "1.7.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a" + integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg== + dependencies: + dom-serializer "0" + domelementtype "1" + +dot-case@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-2.1.1.tgz#34dcf37f50a8e93c2b3bca8bb7fb9155c7da3bee" + integrity sha1-NNzzf1Co6TwrO8qLt/uRVcfaO+4= + dependencies: + no-case "^2.2.0" + +dot-prop@^4.1.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.1.tgz#45884194a71fc2cda71cbb4bceb3a4dd2f433ba4" + integrity sha512-l0p4+mIuJIua0mhxGoh4a+iNL9bmeK5DvnSVQa6T0OhrVmaEa1XScX5Etc673FePCJOArq/4Pa2cLGODUWTPOQ== + dependencies: + is-obj "^1.0.0" + dot-prop@^5.1.0: version "5.3.0" resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88" @@ -5262,6 +7986,11 @@ dotignore@~0.1.2: dependencies: minimatch "^3.0.4" +double-ended-queue@2.1.0-0: + version "2.1.0-0" + resolved "https://registry.yarnpkg.com/double-ended-queue/-/double-ended-queue-2.1.0-0.tgz#103d3527fd31528f40188130c841efdd78264e5c" + integrity sha1-ED01J/0xUo9AGIEwyEHv3XgmTlw= + drbg.js@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/drbg.js/-/drbg.js-1.0.1.tgz#3e36b6c42b37043823cdbc332d58f31e2445480b" @@ -5281,6 +8010,16 @@ duplexer@^0.1.1: resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== +duplexify@^3.2.0: + version "3.7.1" + resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309" + integrity sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g== + dependencies: + end-of-stream "^1.0.0" + inherits "^2.0.1" + readable-stream "^2.0.0" + stream-shift "^1.0.0" + duplexify@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-4.1.1.tgz#7027dc374f157b122a8ae08c2d3ea4d2d953aa61" @@ -5306,16 +8045,35 @@ ecdsa-sig-formatter@1.0.11, ecdsa-sig-formatter@^1.0.11: dependencies: safe-buffer "^5.0.1" +ed2curve@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/ed2curve/-/ed2curve-0.3.0.tgz#322b575152a45305429d546b071823a93129a05d" + integrity sha512-8w2fmmq3hv9rCrcI7g9hms2pMunQr1JINfcjwR9tAyZqhtyaMN991lF/ZfHfr5tzZQ8c7y7aBgZbjfbd0fjFwQ== + dependencies: + tweetnacl "1.x.x" + ee-first@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= +electron-fetch@^1.7.2: + version "1.7.3" + resolved "https://registry.yarnpkg.com/electron-fetch/-/electron-fetch-1.7.3.tgz#06cf363d7f64073ec00a37e9949ec9d29ce6b08a" + integrity sha512-1AVMaxrHXTTMqd7EK0MGWusdqNr07Rpj8Th6bG4at0oNgIi/1LBwa9CjT/0Zy+M0k/tSJPS04nFxHj0SXDVgVw== + dependencies: + encoding "^0.1.13" + electron-to-chromium@^1.3.47: version "1.3.709" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.709.tgz#d7be0b5686a2fdfe8bad898faa3a428d04d8f656" integrity sha512-LolItk2/ikSGQ7SN8UkuKVNMBZp3RG7Itgaxj1npsHRzQobj9JjMneZOZfLhtwlYBe5fCJ75k+cVCiDFUs23oA== +electron-to-chromium@^1.3.723: + version "1.3.727" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.727.tgz#857e310ca00f0b75da4e1db6ff0e073cc4a91ddf" + integrity sha512-Mfz4FIB4FSvEwBpDfdipRIrwd6uo8gUDoRDF4QEYb4h4tSuI3ov594OrjU6on042UlFHouIJpClDODGkPcBSbg== + elliptic@6.5.3: version "6.5.3" resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.3.tgz#cb59eb2efdaf73a0bd78ccd7015a62ad6e0f93d6" @@ -5342,6 +8100,11 @@ elliptic@6.5.4, elliptic@^6.4.0, elliptic@^6.5.2, elliptic@^6.5.3: minimalistic-assert "^1.0.1" minimalistic-crypto-utils "^1.0.1" +emittery@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.4.1.tgz#abe9d3297389ba424ac87e53d1c701962ce7433d" + integrity sha512-r4eRSeStEGf6M5SKdrQhhLK5bOwOBxQhIE3YSTnZE3GpKiLfnnhE+tPtrJE79+eDJgm39BM6LSoI8SCx4HbwlQ== + emoji-regex@^7.0.1: version "7.0.3" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" @@ -5383,20 +8146,27 @@ encoding-down@^6.3.0: level-codec "^9.0.0" level-errors "^2.0.0" -encoding@^0.1.11, encoding@^0.1.12: +encoding@^0.1.11, encoding@^0.1.12, encoding@^0.1.13: version "0.1.13" resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== dependencies: iconv-lite "^0.6.2" -end-of-stream@^1.1.0, end-of-stream@^1.4.1: +end-of-stream@^1.0.0, end-of-stream@^1.1.0, end-of-stream@^1.4.1: version "1.4.4" resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== dependencies: once "^1.4.0" +end-stream@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/end-stream/-/end-stream-0.1.0.tgz#32003f3f438a2b0143168137f8fa6e9866c81ed5" + integrity sha1-MgA/P0OKKwFDFoE3+PpumGbIHtU= + dependencies: + write-stream "~0.4.3" + enquirer@^2.3.0: version "2.3.6" resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" @@ -5404,6 +8174,21 @@ enquirer@^2.3.0: dependencies: ansi-colors "^4.1.1" +entities@1.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-1.0.0.tgz#b2987aa3821347fcde642b24fdfc9e4fb712bf26" + integrity sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY= + +entities@^1.1.1, entities@~1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56" + integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w== + +entities@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" + integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== + env-paths@^2.2.0: version "2.2.1" resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" @@ -5419,11 +8204,16 @@ envinfo@^7.7.4: resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.8.1.tgz#06377e3e5f4d379fea7ac592d5ad8927e0c4d475" integrity sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw== -err-code@^2.0.2: +err-code@^2.0.0, err-code@^2.0.2, err-code@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/err-code/-/err-code-2.0.3.tgz#23c2f3b756ffdfc608d30e27c9a941024807e7f9" integrity sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA== +err-code@^3.0.0, err-code@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/err-code/-/err-code-3.0.1.tgz#a444c7b992705f2b120ee320b09972eef331c920" + integrity sha512-GiaH0KJUewYok+eeY05IIgjtAe4Yltygk9Wqp1V5yVWLdhf0hYZchRjNIT9bb0mSwRcIusT3cx7PJUf3zEIfUA== + errno@~0.1.1: version "0.1.8" resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f" @@ -5438,7 +8228,7 @@ error-ex@^1.2.0, error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" -es-abstract@^1.18.0-next.2: +es-abstract@^1.17.0-next.1, es-abstract@^1.18.0-next.1, es-abstract@^1.18.0-next.2: version "1.18.0" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.0.tgz#ab80b359eecb7ede4c298000390bc5ac3ec7b5a4" integrity sha512-LJzK7MrQa8TS0ja2w3YNLzUgJCGPdPOV1yVvezjNnS89D+VR08+Szt2mz3YB2Dck/+w5tfIq/RoUAFqJJGM2yw== @@ -5460,6 +8250,25 @@ es-abstract@^1.18.0-next.2: string.prototype.trimstart "^1.0.4" unbox-primitive "^1.0.0" +es-array-method-boxes-properly@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz#873f3e84418de4ee19c5be752990b2e44718d09e" + integrity sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA== + +es-get-iterator@^1.0.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/es-get-iterator/-/es-get-iterator-1.1.2.tgz#9234c54aba713486d7ebde0220864af5e2b283f7" + integrity sha512-+DTO8GYwbMCwbywjimwZMHp8AuYXOS2JZFWoi2AlPOS3ebnII9w/NLpNZtA7A0YLaVDw+O7KFCeoIV7OPvM7hQ== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.0" + has-symbols "^1.0.1" + is-arguments "^1.1.0" + is-map "^2.0.2" + is-set "^2.0.2" + is-string "^1.0.5" + isarray "^2.0.5" + es-to-primitive@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" @@ -5478,6 +8287,11 @@ es5-ext@^0.10.35, es5-ext@^0.10.50: es6-symbol "~3.1.3" next-tick "~1.0.0" +es6-denodeify@^0.1.1: + version "0.1.5" + resolved "https://registry.yarnpkg.com/es6-denodeify/-/es6-denodeify-0.1.5.tgz#31d4d5fe9c5503e125460439310e16a2a3f39c1f" + integrity sha1-MdTV/pxVA+ElRgQ5MQ4WoqPznB8= + es6-iterator@~2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" @@ -5500,7 +8314,7 @@ escalade@^3.1.1: resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== -escape-html@~1.0.3: +escape-html@1.0.3, escape-html@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= @@ -5527,6 +8341,35 @@ escodegen@1.8.x: optionalDependencies: source-map "~0.2.0" +escodegen@^1.6.1: + version "1.14.3" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.3.tgz#4e7b81fba61581dc97582ed78cab7f0e8d63f503" + integrity sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw== + dependencies: + esprima "^4.0.1" + estraverse "^4.2.0" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.6.1" + +esdoc@^1.0.4: + version "1.1.0" + resolved "https://registry.yarnpkg.com/esdoc/-/esdoc-1.1.0.tgz#07d40ebf791764cd537929c29111e20a857624f3" + integrity sha512-vsUcp52XJkOWg9m1vDYplGZN2iDzvmjDL5M/Mp8qkoDG3p2s0yIQCIjKR5wfPBaM3eV14a6zhQNYiNTCVzPnxA== + dependencies: + babel-generator "6.26.1" + babel-traverse "6.26.0" + babylon "6.18.0" + cheerio "1.0.0-rc.2" + color-logger "0.0.6" + escape-html "1.0.3" + fs-extra "5.0.0" + ice-cap "0.0.4" + marked "0.3.19" + minimist "1.2.0" + taffydb "2.7.3" + eslint-plugin-prettier@^2.2.0: version "2.7.0" resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-2.7.0.tgz#b4312dcf2c1d965379d7f9d5b5f8aaadc6a45904" @@ -5540,7 +8383,7 @@ esprima@2.7.x, esprima@^2.7.1: resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" integrity sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE= -esprima@^4.0.0, esprima@~4.0.0: +esprima@^4.0.0, esprima@^4.0.1, esprima@~4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== @@ -5550,6 +8393,11 @@ estraverse@^1.9.1: resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.9.3.tgz#af67f2dc922582415950926091a4005d29c9bb44" integrity sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q= +estraverse@^4.2.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + esutils@^2.0.2: version "2.0.3" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" @@ -5573,6 +8421,18 @@ eth-block-tracker@^3.0.0: pify "^2.3.0" tape "^4.6.3" +eth-block-tracker@^4.4.2: + version "4.4.3" + resolved "https://registry.yarnpkg.com/eth-block-tracker/-/eth-block-tracker-4.4.3.tgz#766a0a0eb4a52c867a28328e9ae21353812cf626" + integrity sha512-A8tG4Z4iNg4mw5tP1Vung9N9IjgMNqpiMoJ/FouSFwNCGHv2X0mmOYwtQOJzki6XN7r7Tyo01S29p7b224I4jw== + dependencies: + "@babel/plugin-transform-runtime" "^7.5.5" + "@babel/runtime" "^7.5.5" + eth-query "^2.1.0" + json-rpc-random-id "^1.0.1" + pify "^3.0.0" + safe-event-emitter "^1.0.1" + eth-ens-namehash@2.0.8, eth-ens-namehash@^2.0.8: version "2.0.8" resolved "https://registry.yarnpkg.com/eth-ens-namehash/-/eth-ens-namehash-2.0.8.tgz#229ac46eca86d52e0c991e7cb2aef83ff0f68bcf" @@ -5602,6 +8462,20 @@ eth-gas-reporter@^0.2.20: sha1 "^1.1.1" sync-request "^6.0.0" +eth-json-rpc-errors@^1.0.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/eth-json-rpc-errors/-/eth-json-rpc-errors-1.1.1.tgz#148377ef55155585981c21ff574a8937f9d6991f" + integrity sha512-WT5shJ5KfNqHi9jOZD+ID8I1kuYWNrigtZat7GOQkvwo99f8SzAVaEcWhJUv656WiZOAg3P1RiJQANtUmDmbIg== + dependencies: + fast-safe-stringify "^2.0.6" + +eth-json-rpc-errors@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/eth-json-rpc-errors/-/eth-json-rpc-errors-2.0.2.tgz#c1965de0301fe941c058e928bebaba2e1285e3c4" + integrity sha512-uBCRM2w2ewusRHGxN8JhcuOb2RN3ueAOYH/0BhqdFmQkZx5lj5+fLKTz0mIVOzd4FG5/kUksCzCD7eTEim6gaA== + dependencies: + fast-safe-stringify "^2.0.6" + eth-json-rpc-infura@^3.1.0: version "3.2.1" resolved "https://registry.yarnpkg.com/eth-json-rpc-infura/-/eth-json-rpc-infura-3.2.1.tgz#26702a821067862b72d979c016fd611502c6057f" @@ -5669,6 +8543,13 @@ eth-query@^2.0.2, eth-query@^2.1.0, eth-query@^2.1.2: json-rpc-random-id "^1.0.0" xtend "^4.0.1" +eth-rpc-errors@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/eth-rpc-errors/-/eth-rpc-errors-3.0.0.tgz#d7b22653c70dbf9defd4ef490fd08fe70608ca10" + integrity sha512-iPPNHPrLwUlR9xCSYm7HHQjWBasor3+KZfRvwEWxMz3ca0yqnlBeJrnyphkGIXZ4J7AMAaOLmwy4AWhnxOiLxg== + dependencies: + fast-safe-stringify "^2.0.6" + eth-sig-util@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/eth-sig-util/-/eth-sig-util-3.0.0.tgz#75133b3d7c20a5731af0690c385e184ab942b97e" @@ -5763,6 +8644,11 @@ ethereum-cryptography@^0.1.2, ethereum-cryptography@^0.1.3: secp256k1 "^4.0.1" setimmediate "^1.0.5" +ethereum-protocol@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ethereum-protocol/-/ethereum-protocol-1.0.1.tgz#b7d68142f4105e0ae7b5e178cf42f8d4dc4b93cf" + integrity sha512-3KLX1mHuEsBW0dKG+c6EOJS1NBNqdCICvZW9sInmZTt5aY0oxmHVggYRE0lJu1tcnMD1K+AKHdLi6U43Awm1Vg== + ethereum-waffle@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/ethereum-waffle/-/ethereum-waffle-3.0.0.tgz#59e46b8e303eb5decbb5ceebca1ddf378db312d6" @@ -5882,7 +8768,7 @@ ethereumjs-tx@2.1.2, ethereumjs-tx@^2.1.1, ethereumjs-tx@^2.1.2: ethereumjs-common "^1.5.0" ethereumjs-util "^6.0.0" -ethereumjs-tx@^1.1.1, ethereumjs-tx@^1.2.0, ethereumjs-tx@^1.2.2, ethereumjs-tx@^1.3.3: +ethereumjs-tx@^1.1.1, ethereumjs-tx@^1.2.0, ethereumjs-tx@^1.2.2, ethereumjs-tx@^1.3.3, ethereumjs-tx@^1.3.7: version "1.3.7" resolved "https://registry.yarnpkg.com/ethereumjs-tx/-/ethereumjs-tx-1.3.7.tgz#88323a2d875b10549b8347e09f4862b546f3d89a" integrity sha512-wvLMxzt1RPhAQ9Yi3/HKZTn0FZYpnsmQdbKYfUUpi4j1SEIcbkd9tndVjcPrufY3V7j2IebOpC00Zp2P/Ay2kA== @@ -6005,6 +8891,20 @@ ethereumjs-wallet@0.6.5: utf8 "^3.0.0" uuid "^3.3.2" +ethereumjs-wallet@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ethereumjs-wallet/-/ethereumjs-wallet-1.0.1.tgz#664a4bcacfc1291ca2703de066df1178938dba1c" + integrity sha512-3Z5g1hG1das0JWU6cQ9HWWTY2nt9nXCcwj7eXVNAHKbo00XAZO8+NHlwdgXDWrL0SXVQMvTWN8Q/82DRH/JhPw== + dependencies: + aes-js "^3.1.1" + bs58check "^2.1.2" + ethereum-cryptography "^0.1.3" + ethereumjs-util "^7.0.2" + randombytes "^2.0.6" + scrypt-js "^3.0.1" + utf8 "^3.0.0" + uuid "^3.3.2" + ethers@5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.0.0.tgz#76558a3020766f310a49f4e1a4c6c1e331761abd" @@ -6144,12 +9044,22 @@ ethjs-util@0.1.6, ethjs-util@^0.1.3: is-hex-prefixed "1.0.0" strip-hex-prefix "1.0.0" +event-iterator@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/event-iterator/-/event-iterator-1.2.0.tgz#2e71dc6ca56f1cf8ebcb2b9be7fdfd10acabbb76" + integrity sha512-Daq7YUl0Mv1i4QEgzGQlz0jrx7hUFNyLGbiF+Ap7NCMCjDLCCnolyj6s0TAc6HmrBziO5rNVHsPwGMp7KdRPvw== + +event-iterator@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/event-iterator/-/event-iterator-2.0.0.tgz#10f06740cc1e9fd6bc575f334c2bc1ae9d2dbf62" + integrity sha512-KGft0ldl31BZVV//jj+IAIGCxkvvUkkON+ScH6zfoX+l+omX6001ggyRSpI0Io2Hlro0ThXotswCtfzS8UkIiQ== + event-target-shim@^5.0.0: version "5.0.1" resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== -eventemitter3@3.1.2: +eventemitter3@3.1.2, eventemitter3@^3.1.0, eventemitter3@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.2.tgz#2d3d48f9c346698fce83a85d7d664e98535df6e7" integrity sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q== @@ -6223,6 +9133,13 @@ exit-on-epipe@~1.0.1: resolved "https://registry.yarnpkg.com/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz#0bdd92e87d5285d267daa8171d0eb06159689692" integrity sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw== +expand-brackets@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" + integrity sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s= + dependencies: + is-posix-bracket "^0.1.0" + expand-brackets@^2.1.4: version "2.1.4" resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" @@ -6236,6 +9153,13 @@ expand-brackets@^2.1.4: snapdragon "^0.8.1" to-regex "^3.0.1" +expand-range@^1.8.1: + version "1.8.2" + resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" + integrity sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc= + dependencies: + fill-range "^2.1.0" + expand-template@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-2.0.3.tgz#6e14b3fcee0f3a6340ecb57d2e8918692052a47c" @@ -6249,7 +9173,7 @@ express-prom-bundle@^6.3.6: on-finished "^2.3.0" url-value-parser "^2.0.0" -express@^4.14.0, express@^4.17.1: +express@^4.0.0, express@^4.14.0, express@^4.17.1: version "4.17.1" resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134" integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g== @@ -6307,7 +9231,7 @@ extend-shallow@^3.0.0, extend-shallow@^3.0.2: assign-symbols "^1.0.0" is-extendable "^1.0.1" -extend@^3.0.2, extend@~3.0.2: +extend@^3.0.0, extend@^3.0.2, extend@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== @@ -6326,6 +9250,13 @@ external-editor@^3.0.3, external-editor@^3.1.0: iconv-lite "^0.4.24" tmp "^0.0.33" +extglob@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" + integrity sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE= + dependencies: + is-extglob "^1.0.0" + extglob@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" @@ -6340,6 +9271,11 @@ extglob@^2.0.4: snapdragon "^0.8.1" to-regex "^3.0.1" +extract-files@9.0.0, extract-files@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/extract-files/-/extract-files-9.0.0.tgz#8a7744f2437f81f5ed3250ed9f1550de902fe54a" + integrity sha512-CvdFfHkC95B4bBBk36hcEmvdR2awOdhhVUYH6S/zrVj3477zven/fJMYg7121h4T1xHZC+tetUpubpAhxwI7hQ== + extsprintf@1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" @@ -6357,6 +9293,18 @@ fake-merkle-patricia-tree@^1.0.1: dependencies: checkpoint-store "^1.1.0" +faker@^5.3.1: + version "5.5.3" + resolved "https://registry.yarnpkg.com/faker/-/faker-5.5.3.tgz#c57974ee484431b25205c2c8dc09fda861e51e0e" + integrity sha512-wLTv2a28wjUyWkbnX7u/ABZBkUkIF2fCd73V6P2oFqEGEktDfzWx4UxrSqtPRw0xPRAcjeAOIiJWqZm3pP4u3g== + +fast-check@^2.12.1: + version "2.14.0" + resolved "https://registry.yarnpkg.com/fast-check/-/fast-check-2.14.0.tgz#13e891977a7cc1ba87aa3883c75053990c02fb21" + integrity sha512-4hm0ioyEVCwgjBLBqriwAFYu3/yc7pNH9fBfvzi6JRWRs4R3mwZwrr/d4MHbY0fTBJ0Uakg4TaMAAQ8Cnt2+KQ== + dependencies: + pure-rand "^4.1.1" + fast-deep-equal@^3.1.1: version "3.1.3" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" @@ -6367,6 +9315,16 @@ fast-diff@^1.1.1: resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== +fast-fifo@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fast-fifo/-/fast-fifo-1.0.0.tgz#9bc72e6860347bb045a876d1c5c0af11e9b984e7" + integrity sha512-4VEXmjxLj7sbs8J//cn2qhRap50dGzF5n8fjay8mau+Jn4hxSeR3xPFwxMaQq/pDaq7+KQk0PAbC2+nWDkJrmQ== + +fast-future@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/fast-future/-/fast-future-1.0.2.tgz#8435a9aaa02d79248d17d704e76259301d99280a" + integrity sha1-hDWpqqAteSSNF9cE52JZMB2ZKAo= + fast-glob@^3.0.3, fast-glob@^3.1.1: version "3.2.5" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.5.tgz#7939af2a656de79a4f1901903ee8adcaa7cb9661" @@ -6394,16 +9352,26 @@ fast-redact@^3.0.0: resolved "https://registry.yarnpkg.com/fast-redact/-/fast-redact-3.0.0.tgz#ac2f9e36c9f4976f5db9fb18c6ffbaf308cf316d" integrity sha512-a/S/Hp6aoIjx7EmugtzLqXmcNsyFszqbt6qQ99BdG61QjBZF6shNis0BYR6TsZOQ1twYc0FN2Xdhwwbv6+KD0w== -fast-safe-stringify@^2.0.7: +fast-safe-stringify@^2.0.6, fast-safe-stringify@^2.0.7: version "2.0.7" resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz#124aa885899261f68aedb42a7c080de9da608743" integrity sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA== +fast-sha256@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/fast-sha256/-/fast-sha256-1.3.0.tgz#7916ba2054eeb255982608cccd0f6660c79b7ae6" + integrity sha512-n11RGP/lrWEFI/bWdygLxhI+pVeo1ZYIVwvvPkW7azl/rOy+F3HYRZ2K5zeE9mmkhQppyv9sQFx0JM9UabnpPQ== + fast-text-encoding@^1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/fast-text-encoding/-/fast-text-encoding-1.0.3.tgz#ec02ac8e01ab8a319af182dae2681213cfe9ce53" integrity sha512-dtm4QZH9nZtcDt8qJiOH9fcQd1NAgi+K1O2DbE6GG1PPCK/BWfOH3idCTRQ4ImXRUOyopDEgDEnVEE7Y/2Wrig== +fastestsmallesttextencoderdecoder@^1.0.22: + version "1.0.22" + resolved "https://registry.yarnpkg.com/fastestsmallesttextencoderdecoder/-/fastestsmallesttextencoderdecoder-1.0.22.tgz#59b47e7b965f45258629cc6c127bf783281c5e93" + integrity sha512-Pb8d48e+oIuY4MaM64Cd7OW1gt4nxCHs7/ddPPZ/Ic3sg8yVGM7O9wDvZ7us6ScaUupzM+pfBolwtYhN1IxBIw== + fastq@^1.6.0: version "1.11.0" resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.11.0.tgz#bb9fb955a07130a918eb63c1f5161cc32a5d0858" @@ -6411,6 +9379,46 @@ fastq@^1.6.0: dependencies: reusify "^1.0.4" +fb-watchman@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.1.tgz#fc84fb39d2709cf3ff6d743706157bb5708a8a85" + integrity sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg== + dependencies: + bser "2.1.1" + +fbjs-css-vars@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz#216551136ae02fe255932c3ec8775f18e2c078b8" + integrity sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ== + +fbjs@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-3.0.0.tgz#0907067fb3f57a78f45d95f1eacffcacd623c165" + integrity sha512-dJd4PiDOFuhe7vk4F80Mba83Vr2QuK86FoxtgPmzBqEJahncp+13YCmfoa53KHCo6OnlXLG7eeMWPfB5CrpVKg== + dependencies: + cross-fetch "^3.0.4" + fbjs-css-vars "^1.0.0" + loose-envify "^1.0.0" + object-assign "^4.1.0" + promise "^7.1.1" + setimmediate "^1.0.5" + ua-parser-js "^0.7.18" + +fetch-cookie@0.10.1: + version "0.10.1" + resolved "https://registry.yarnpkg.com/fetch-cookie/-/fetch-cookie-0.10.1.tgz#5ea88f3d36950543c87997c27ae2aeafb4b5c4d4" + integrity sha512-beB+VEd4cNeVG1PY+ee74+PkuCQnik78pgLi5Ah/7qdUfov8IctU0vLUbBT8/10Ma5GMBeI4wtxhGrEfKNYs2g== + dependencies: + tough-cookie "^2.3.3 || ^3.0.1 || ^4.0.0" + +fetch-cookie@0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/fetch-cookie/-/fetch-cookie-0.7.0.tgz#a6fc137ad8363aa89125864c6451b86ecb7de802" + integrity sha512-Mm5pGlT3agW6t71xVM7vMZPIvI7T4FaTuFW4jari6dVzYHFDb3WZZsGpN22r/o3XMdkM0E7sPd1EGeyVbH2Tgg== + dependencies: + es6-denodeify "^0.1.1" + tough-cookie "^2.3.1" + fetch-ponyfill@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/fetch-ponyfill/-/fetch-ponyfill-4.1.0.tgz#ae3ce5f732c645eab87e4ae8793414709b239893" @@ -6430,6 +9438,45 @@ file-uri-to-path@1.0.0: resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== +filecoin.js@^0.0.5-alpha: + version "0.0.5-alpha" + resolved "https://registry.yarnpkg.com/filecoin.js/-/filecoin.js-0.0.5-alpha.tgz#cf6f14ae0715e88c290aeacfe813ff48a69442cd" + integrity sha512-xPrB86vDnTPfmvtN/rJSrhl4M77694ruOgNXd0+5gP67mgmCDhStLCqcr+zHIDRgDpraf7rY+ELbwjXZcQNdpQ== + dependencies: + "@ledgerhq/hw-transport-webusb" "^5.22.0" + "@nodefactory/filsnap-adapter" "^0.2.1" + "@nodefactory/filsnap-types" "^0.2.1" + "@zondax/filecoin-signing-tools" "github:Digital-MOB-Filecoin/filecoin-signing-tools-js" + bignumber.js "^9.0.0" + bitcore-lib "^8.22.2" + bitcore-mnemonic "^8.22.2" + btoa-lite "^1.0.0" + events "^3.2.0" + isomorphic-ws "^4.0.1" + node-fetch "^2.6.0" + rpc-websockets "^5.3.1" + scrypt-async "^2.0.1" + tweetnacl "^1.0.3" + tweetnacl-util "^0.15.1" + websocket "^1.0.31" + ws "^7.3.1" + +filename-regex@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" + integrity sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY= + +fill-range@^2.1.0: + version "2.2.4" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.4.tgz#eb1e773abb056dcd8df2bfdf6af59b8b3a936565" + integrity sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q== + dependencies: + is-number "^2.1.0" + isobject "^2.0.0" + randomatic "^3.0.0" + repeat-element "^1.1.2" + repeat-string "^1.5.2" + fill-range@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" @@ -6534,6 +9581,11 @@ find-yarn-workspace-root@^2.0.0: dependencies: micromatch "^4.0.2" +first-chunk-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz#59bfb50cd905f60d7c394cd3d9acaab4e6ad934e" + integrity sha1-Wb+1DNkF9g18OUzT2ayqtOatk04= + flat@^4.1.0: version "4.1.1" resolved "https://registry.yarnpkg.com/flat/-/flat-4.1.1.tgz#a392059cc382881ff98642f5da4dde0a959f309b" @@ -6575,16 +9627,46 @@ for-each@^0.3.3, for-each@~0.3.3: dependencies: is-callable "^1.1.3" -for-in@^1.0.2: +for-in@^1.0.1, for-in@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= +for-own@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" + integrity sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4= + dependencies: + for-in "^1.0.1" + +foreach@^2.0.4, foreach@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" + integrity sha1-C+4AUBiusmDQo6865ljdATbsG5k= + forever-agent@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= +form-data@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.0.tgz#31b7e39c85f1355b7139ee0c647cf0de7f83c682" + integrity sha512-CKMFDglpbMi6PyN+brwB9Q/GOw0eAnsrEZDgcsH5Krhz5Od/haKHAX0NmQfha2zPPz0JpWzA7GJHGSnvCRLWsg== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + +form-data@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" + integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + form-data@^2.2.0: version "2.5.1" resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.5.1.tgz#f2cbec57b5e59e23716e128fe44d4e5dd23895f4" @@ -6639,11 +9721,25 @@ fresh@0.5.2: resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= +fs-capacitor@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/fs-capacitor/-/fs-capacitor-2.0.4.tgz#5a22e72d40ae5078b4fe64fe4d08c0d3fc88ad3c" + integrity sha512-8S4f4WsCryNw2mJJchi46YgB6CR5Ze+4L1h8ewl9tEpL4SJ3ZO+c/bS4BWhB8bK+O3TMqhuZarTitd0S0eh2pA== + fs-constants@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== +fs-extra@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-5.0.0.tgz#414d0110cdd06705734d055652c5411260c31abd" + integrity sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ== + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + fs-extra@^0.30.0: version "0.30.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.30.0.tgz#f233ffcc08d4da7d432daa449776989db1df93f0" @@ -6682,7 +9778,7 @@ fs-extra@^8.1.0: jsonfile "^4.0.0" universalify "^0.1.0" -fs-extra@^9.0.0, fs-extra@^9.1.0: +fs-extra@^9.0.0, fs-extra@^9.0.1, fs-extra@^9.1.0: version "9.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== @@ -6716,7 +9812,7 @@ fs.realpath@^1.0.0: resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= -fsevents@~2.1.1: +fsevents@~2.1.1, fsevents@~2.1.2: version "2.1.3" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e" integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ== @@ -6815,6 +9911,11 @@ gcp-metadata@^4.2.0: gaxios "^4.0.0" json-bigint "^1.0.0" +gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== + get-caller-file@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" @@ -6830,7 +9931,7 @@ get-func-name@^2.0.0: resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" integrity sha1-6td0q+5y4gQJQzoGY2YCPdaIekE= -get-intrinsic@^1.0.2, get-intrinsic@^1.1.1: +get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== @@ -6839,6 +9940,16 @@ get-intrinsic@^1.0.2, get-intrinsic@^1.1.1: has "^1.0.3" has-symbols "^1.0.1" +get-iterator@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/get-iterator/-/get-iterator-1.0.2.tgz#cd747c02b4c084461fac14f48f6b45a80ed25c82" + integrity sha512-v+dm9bNVfOYsY1OrhaCrmyOcYoSeVvbt+hHZ0Au+T+p1y+0Uyj9aMaGIeUTT6xdpRbWzDeYKvfOslPhggQMcsg== + +get-params@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/get-params/-/get-params-0.1.2.tgz#bae0dfaba588a0c60d7834c0d8dc2ff60eeef2fe" + integrity sha1-uuDfq6WIoMYNeDTA2Nwv9g7u8v4= + get-pkg-repo@^1.0.0: version "1.4.0" resolved "https://registry.yarnpkg.com/get-pkg-repo/-/get-pkg-repo-1.4.0.tgz#c73b489c06d80cc5536c2c853f9e05232056972d" @@ -6860,6 +9971,11 @@ get-port@^5.1.1: resolved "https://registry.yarnpkg.com/get-port/-/get-port-5.1.1.tgz#0469ed07563479de6efb986baf053dcd7d4e3193" integrity sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ== +get-prototype-of@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/get-prototype-of/-/get-prototype-of-0.0.0.tgz#98772bd10716d16deb4b322516c469efca28ac44" + integrity sha1-mHcr0QcW0W3rSzIlFsRp78oorEQ= + get-stdin@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" @@ -6963,6 +10079,29 @@ github-from-package@0.0.0: resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce" integrity sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4= +glob-base@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" + integrity sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q= + dependencies: + glob-parent "^2.0.0" + is-glob "^2.0.0" + +glob-parent@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" + integrity sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg= + dependencies: + is-glob "^2.0.0" + +glob-parent@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" + integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= + dependencies: + is-glob "^3.1.0" + path-dirname "^1.0.0" + glob-parent@^5.1.0, glob-parent@^5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" @@ -6977,6 +10116,20 @@ glob-parent@~5.1.0: dependencies: is-glob "^4.0.1" +glob-stream@^5.3.2: + version "5.3.5" + resolved "https://registry.yarnpkg.com/glob-stream/-/glob-stream-5.3.5.tgz#a55665a9a8ccdc41915a87c701e32d4e016fad22" + integrity sha1-pVZlqajM3EGRWofHAeMtTgFvrSI= + dependencies: + extend "^3.0.0" + glob "^5.0.3" + glob-parent "^3.0.0" + micromatch "^2.3.7" + ordered-read-streams "^0.3.0" + through2 "^0.6.0" + to-absolute-glob "^0.1.1" + unique-stream "^2.0.2" + glob@7.1.3: version "7.1.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" @@ -7001,7 +10154,7 @@ glob@7.1.6, glob@^7.0.0, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glo once "^1.3.0" path-is-absolute "^1.0.0" -glob@^5.0.15: +glob@^5.0.15, glob@^5.0.3: version "5.0.15" resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" integrity sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E= @@ -7036,11 +10189,35 @@ global@~4.4.0: min-document "^2.19.0" process "^0.11.10" +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + globals@^9.18.0: version "9.18.0" resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" integrity sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ== +globalthis@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.2.tgz#2a235d34f4d8036219f7e34929b5de9e18166b8b" + integrity sha512-ZQnSFO1la8P7auIOQECnm0sSuoMeaSq0EEdXMBFF2QJO4uNcwbyhSgG3MruWNbFTqCLmxVwGOl7LZ9kASvHdeQ== + dependencies: + define-properties "^1.1.3" + +globby@11.0.3, globby@^11.0.0, globby@^11.0.2: + version "11.0.3" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.3.tgz#9b1f0cb523e171dd1ad8c7b2a9fb4b644b9593cb" + integrity sha512-ffdmosjA807y7+lA1NM0jELARVmYul/715xiILEjo3hBLPTcirgQNnXECn5g3mtR8TOLCVbkfua1Hpen25/Xcg== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.1.1" + ignore "^5.1.4" + merge2 "^1.3.0" + slash "^3.0.0" + globby@^10.0.1: version "10.0.2" resolved "https://registry.yarnpkg.com/globby/-/globby-10.0.2.tgz#277593e745acaa4646c3ab411289ec47a0392543" @@ -7055,18 +10232,6 @@ globby@^10.0.1: merge2 "^1.2.3" slash "^3.0.0" -globby@^11.0.0, globby@^11.0.2: - version "11.0.3" - resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.3.tgz#9b1f0cb523e171dd1ad8c7b2a9fb4b644b9593cb" - integrity sha512-ffdmosjA807y7+lA1NM0jELARVmYul/715xiILEjo3hBLPTcirgQNnXECn5g3mtR8TOLCVbkfua1Hpen25/Xcg== - dependencies: - array-union "^2.1.0" - dir-glob "^3.0.1" - fast-glob "^3.1.1" - ignore "^5.1.4" - merge2 "^1.3.0" - slash "^3.0.0" - google-auth-library@^6.1.3: version "6.1.6" resolved "https://registry.yarnpkg.com/google-auth-library/-/google-auth-library-6.1.6.tgz#deacdcdb883d9ed6bac78bb5d79a078877fdf572" @@ -7089,6 +10254,11 @@ google-p12-pem@^3.0.3: dependencies: node-forge "^0.10.0" +google-protobuf@^3.13.0, google-protobuf@^3.15.6: + version "3.16.0" + resolved "https://registry.yarnpkg.com/google-protobuf/-/google-protobuf-3.16.0.tgz#87c61829a8aec7d9244dcbed9464e1d0fcbed8ae" + integrity sha512-gBY66yYL1wbQMU2r1POkXSXkm035Ni0wFv3vx0K9IEUsJLP9G5rAcFVn0xUXfZneRu6MmDjaw93pt/DE56VOyw== + google-spreadsheet@^3.1.15: version "3.1.15" resolved "https://registry.yarnpkg.com/google-spreadsheet/-/google-spreadsheet-3.1.15.tgz#e7a86f750d8166faaa3e16929561baceb807bf5a" @@ -7135,7 +10305,7 @@ got@^7.1.0: url-parse-lax "^1.0.0" url-to-options "^1.0.1" -graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.5, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0, graceful-fs@^4.2.2, graceful-fs@^4.2.3: +graceful-fs@4.X, graceful-fs@^4.0.0, graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.5, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0, graceful-fs@^4.2.2, graceful-fs@^4.2.3: version "4.2.6" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee" integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ== @@ -7145,6 +10315,79 @@ grapheme-splitter@^1.0.4: resolved "https://registry.yarnpkg.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e" integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ== +graphql-extensions@^0.14.0: + version "0.14.0" + resolved "https://registry.yarnpkg.com/graphql-extensions/-/graphql-extensions-0.14.0.tgz#cddf2fd43168e18be1d0e9057a4b3647febdd35f" + integrity sha512-DFtD8G+6rSj/Xhtb0IPh4A/sB/qcSEm9MTS221ESCx+axrsME92wGEsr7ihVjn1/tEEIy+9V5lUQOH/dHkCb0A== + dependencies: + "@apollographql/apollo-tools" "^0.5.0" + apollo-server-env "^3.1.0" + apollo-server-types "^0.8.0" + +graphql-subscriptions@^1.0.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/graphql-subscriptions/-/graphql-subscriptions-1.2.1.tgz#2142b2d729661ddf967b7388f7cf1dd4cf2e061d" + integrity sha512-95yD/tKi24q8xYa7Q9rhQN16AYj5wPbrb8tmHGM3WRc9EBmWrG/0kkMl+tQG8wcEuE9ibR4zyOM31p5Sdr2v4g== + dependencies: + iterall "^1.3.0" + +graphql-tag@^2.11.0, graphql-tag@^2.12.0: + version "2.12.4" + resolved "https://registry.yarnpkg.com/graphql-tag/-/graphql-tag-2.12.4.tgz#d34066688a4f09e72d6f4663c74211e9b4b7c4bf" + integrity sha512-VV1U4O+9x99EkNpNmCUV5RZwq6MnK4+pGbRYWG+lA/m3uo7TSqJF81OkcOP148gFP6fzdl7JWYBrwWVTS9jXww== + dependencies: + tslib "^2.1.0" + +graphql-tools@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/graphql-tools/-/graphql-tools-4.0.8.tgz#e7fb9f0d43408fb0878ba66b522ce871bafe9d30" + integrity sha512-MW+ioleBrwhRjalKjYaLQbr+920pHBgy9vM/n47sswtns8+96sRn5M/G+J1eu7IMeKWiN/9p6tmwCHU7552VJg== + dependencies: + apollo-link "^1.2.14" + apollo-utilities "^1.0.1" + deprecated-decorator "^0.1.6" + iterall "^1.1.3" + uuid "^3.1.0" + +graphql-tools@^6.2.4: + version "6.2.6" + resolved "https://registry.yarnpkg.com/graphql-tools/-/graphql-tools-6.2.6.tgz#557c6d32797a02988f214bd596dec2abd12425dd" + integrity sha512-OyhSvK5ALVVD6bFiWjAqv2+lRyvjIRfb6Br5Tkjrv++rxnXDodPH/zhMbDGRw+W3SD5ioGEEz84yO48iPiN7jA== + dependencies: + "@graphql-tools/batch-delegate" "^6.2.6" + "@graphql-tools/code-file-loader" "^6.2.4" + "@graphql-tools/delegate" "^6.2.4" + "@graphql-tools/git-loader" "^6.2.4" + "@graphql-tools/github-loader" "^6.2.4" + "@graphql-tools/graphql-file-loader" "^6.2.4" + "@graphql-tools/graphql-tag-pluck" "^6.2.4" + "@graphql-tools/import" "^6.2.4" + "@graphql-tools/json-file-loader" "^6.2.4" + "@graphql-tools/links" "^6.2.4" + "@graphql-tools/load" "^6.2.4" + "@graphql-tools/load-files" "^6.2.4" + "@graphql-tools/merge" "^6.2.4" + "@graphql-tools/mock" "^6.2.4" + "@graphql-tools/module-loader" "^6.2.4" + "@graphql-tools/relay-operation-optimizer" "^6.2.4" + "@graphql-tools/resolvers-composition" "^6.2.4" + "@graphql-tools/schema" "^6.2.4" + "@graphql-tools/stitch" "^6.2.4" + "@graphql-tools/url-loader" "^6.2.4" + "@graphql-tools/utils" "^6.2.4" + "@graphql-tools/wrap" "^6.2.4" + tslib "~2.0.1" + +graphql-ws@^4.4.1: + version "4.5.0" + resolved "https://registry.yarnpkg.com/graphql-ws/-/graphql-ws-4.5.0.tgz#c71c6eed34850c375156c29b1ed45cea2f9aee6b" + integrity sha512-J3PuSfOKX2y9ryOtWxOcKlizkFWyhCvPAc3hhMKMVSTcPxtWiv9oNzvAZp1HKfuQng32YQduHeX+lRDy2+F6VQ== + +graphql@^15.3.0: + version "15.5.0" + resolved "https://registry.yarnpkg.com/graphql/-/graphql-15.5.0.tgz#39d19494dbe69d1ea719915b578bf920344a69d5" + integrity sha512-OmaM7y0kaK31NKG31q4YbD2beNYa6jBBKtMFT6gLYJljHLJr42IqJ8KX08u3Li/0ifzTU5HjmoOOrwa5BRLeDA== + growl@1.10.5: version "1.10.5" resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" @@ -7159,6 +10402,23 @@ gtoken@^5.0.4: google-p12-pem "^3.0.3" jws "^4.0.0" +gulp-sourcemaps@^1.5.2: + version "1.12.1" + resolved "https://registry.yarnpkg.com/gulp-sourcemaps/-/gulp-sourcemaps-1.12.1.tgz#b437d1f3d980cf26e81184823718ce15ae6597b6" + integrity sha1-tDfR89mAzyboEYSCNxjOFa5ll7Y= + dependencies: + "@gulp-sourcemaps/map-sources" "1.X" + acorn "4.X" + convert-source-map "1.X" + css "2.X" + debug-fabulous "0.0.X" + detect-newline "2.X" + graceful-fs "4.X" + source-map "~0.6.0" + strip-bom "2.X" + through2 "2.X" + vinyl "1.X" + handlebars@^4.0.1, handlebars@^4.7.6: version "4.7.7" resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.7.tgz#9ce33416aad02dbd6c8fafa8240d5d98004945a1" @@ -7422,6 +10682,14 @@ he@1.2.0: resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== +header-case@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/header-case/-/header-case-1.0.1.tgz#9535973197c144b09613cd65d317ef19963bd02d" + integrity sha1-lTWXMZfBRLCWE81l0xfvGZY70C0= + dependencies: + no-case "^2.2.0" + upper-case "^1.1.3" + heap@0.2.6: version "0.2.6" resolved "https://registry.yarnpkg.com/heap/-/heap-0.2.6.tgz#087e1f10b046932fc8594dd9e6d378afc9d1e5ac" @@ -7436,6 +10704,13 @@ hmac-drbg@^1.0.0, hmac-drbg@^1.0.1: minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.1" +hoist-non-react-statics@^3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" + integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== + dependencies: + react-is "^16.7.0" + home-or-tmp@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" @@ -7456,6 +10731,29 @@ hosted-git-info@^4.0.1: dependencies: lru-cache "^6.0.0" +htmlparser2@^3.9.1: + version "3.10.1" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.10.1.tgz#bd679dc3f59897b6a34bb10749c855bb53a9392f" + integrity sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ== + dependencies: + domelementtype "^1.3.1" + domhandler "^2.3.0" + domutils "^1.5.1" + entities "^1.1.1" + inherits "^2.0.1" + readable-stream "^3.1.1" + +htmlparser2@~3.8.1: + version "3.8.3" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.8.3.tgz#996c28b191516a8be86501a7d79757e5c70c1068" + integrity sha1-mWwosZFRaovoZQGn15dX5ccMEGg= + dependencies: + domelementtype "1" + domhandler "2.3" + domutils "1.5" + entities "1.0" + readable-stream "1.1" + http-basic@^8.1.1: version "8.1.3" resolved "https://registry.yarnpkg.com/http-basic/-/http-basic-8.1.3.tgz#a7cabee7526869b9b710136970805b1004261bbf" @@ -7493,6 +10791,17 @@ http-errors@1.7.3, http-errors@~1.7.2: statuses ">= 1.5.0 < 2" toidentifier "1.0.0" +http-errors@^1.7.3: + version "1.8.0" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.8.0.tgz#75d1bbe497e1044f51e4ee9e704a62f28d336507" + integrity sha512-4I8r0C5JDhT5VkvI47QktDW75rNlGVsUf/8hzjCC/wkWI/jdTRmBb9aI7erSG82r1bjKY3F6k28WnsVxB1C73A== + dependencies: + depd "~1.1.2" + inherits "2.0.4" + setprototypeof "1.2.0" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.0" + http-https@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/http-https/-/http-https-1.0.0.tgz#2f908dd5f1db4068c058cd6e6d4ce392c913389b" @@ -7548,7 +10857,15 @@ humanize-ms@^1.2.1: dependencies: ms "^2.0.0" -iconv-lite@0.4.24, iconv-lite@^0.4.24: +ice-cap@0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/ice-cap/-/ice-cap-0.0.4.tgz#8a6d31ab4cac8d4b56de4fa946df3352561b6e18" + integrity sha1-im0xq0ysjUtW3k+pRt8zUlYbbhg= + dependencies: + cheerio "0.20.0" + color-logger "0.0.3" + +iconv-lite@0.4.24, iconv-lite@^0.4.24, iconv-lite@^0.4.4: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== @@ -7569,11 +10886,18 @@ idna-uts46-hx@^2.3.1: dependencies: punycode "2.1.0" -ieee754@^1.1.13: +ieee754@^1.1.13, ieee754@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== +ignore-walk@^3.0.1: + version "3.0.4" + resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.4.tgz#c9a09f69b7c7b479a5d74ac1a3c0d4236d2a6335" + integrity sha512-PY6Ii8o1jMRA1z4F2hRkH/xN59ox43DavKvD3oDpfurRlOJyAHpifIwpbdv1n4jt4ov0jSpw3kQ4GhJnpBL6WQ== + dependencies: + minimatch "^3.0.4" + ignore-walk@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.3.tgz#017e2447184bfeade7c238e4aefdd1e8f95b1e37" @@ -7586,7 +10910,12 @@ ignore@^5.1.1, ignore@^5.1.4: resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57" integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw== -immediate@^3.2.3: +immediate@3.0.6: + version "3.0.6" + resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b" + integrity sha1-nbHb0Pr43m++D13V5Wu2BigN5ps= + +immediate@3.3.0, immediate@^3.2.2, immediate@^3.2.3: version "3.3.0" resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.3.0.tgz#1aef225517836bcdf7f2a2de2600c79ff0269266" integrity sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q== @@ -7601,6 +10930,11 @@ immutable@^4.0.0-rc.12: resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.0.0-rc.12.tgz#ca59a7e4c19ae8d9bf74a97bdf0f6e2f2a5d0217" integrity sha512-0M2XxkZLx/mi3t8NVwIm1g8nHoEmM9p9UBl/G9k4+hm0kBgOVdMV/B3CY5dQ8qG8qc80NN4gDV4HQv6FTJ5q7A== +immutable@~3.7.6: + version "3.7.6" + resolved "https://registry.yarnpkg.com/immutable/-/immutable-3.7.6.tgz#13b4d3cb12befa15482a26fe1b2ebae640071e4b" + integrity sha1-E7TTyxK++hVIKib+Gy665kAHHks= + import-fresh@^3.2.1: version "3.3.0" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" @@ -7609,6 +10943,13 @@ import-fresh@^3.2.1: parent-module "^1.0.0" resolve-from "^4.0.0" +import-from@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/import-from/-/import-from-3.0.0.tgz#055cfec38cd5a27d8057ca51376d7d3bf0891966" + integrity sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ== + dependencies: + resolve-from "^5.0.0" + import-local@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.0.2.tgz#a8cfd0431d1de4a2199703d003e3e62364fa6db6" @@ -7662,6 +11003,11 @@ inherits@2.0.3: resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= +inherits@=2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" + integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE= + ini@^1.3.2, ini@^1.3.4, ini@^1.3.5, ini@~1.3.0: version "1.3.8" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" @@ -7729,6 +11075,11 @@ io-ts@1.10.4: dependencies: fp-ts "^1.0.0" +ip-regex@^4.0.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-4.3.0.tgz#687275ab0f57fa76978ff8f4dddc8a23d5990db5" + integrity sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q== + ip@^1.1.5: version "1.1.5" resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" @@ -7739,6 +11090,133 @@ ipaddr.js@1.9.1: resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== +ipfs-core-types@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/ipfs-core-types/-/ipfs-core-types-0.2.1.tgz#460bf2116477ce621995468c962c685dbdc4ac6f" + integrity sha512-q93+93qSybku6woZaajE9mCrHeVoMzNtZ7S5m/zx0+xHRhnoLlg8QNnGGsb5/+uFQt/RiBArsIw/Q61K9Jwkzw== + dependencies: + cids "^1.1.5" + multiaddr "^8.0.0" + peer-id "^0.14.1" + +ipfs-core-utils@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/ipfs-core-utils/-/ipfs-core-utils-0.6.1.tgz#59d1ca9ff4a33bbf6497c4abe024573c3fd7d784" + integrity sha512-UFIklwE3CFcsNIhYFDuz0qB7E2QtdFauRfc76kskgiqhGWcjqqiDeND5zBCrAy0u8UMaDqAbFl02f/mIq1yKXw== + dependencies: + any-signal "^2.0.0" + blob-to-it "^1.0.1" + browser-readablestream-to-it "^1.0.1" + cids "^1.1.5" + err-code "^2.0.3" + ipfs-core-types "^0.2.1" + ipfs-utils "^5.0.0" + it-all "^1.0.4" + it-map "^1.0.4" + it-peekable "^1.0.1" + multiaddr "^8.0.0" + multiaddr-to-uri "^6.0.0" + parse-duration "^0.4.4" + timeout-abort-controller "^1.1.1" + uint8arrays "^1.1.0" + +ipfs-http-client@^48.2.2: + version "48.2.2" + resolved "https://registry.yarnpkg.com/ipfs-http-client/-/ipfs-http-client-48.2.2.tgz#b570fb99866f94df1c394a6101a2eb750ff46599" + integrity sha512-f3ppfWe913SJLvunm0UgqdA1dxVZSGQJPaEVJtqgjxPa5x0fPDiBDdo60g2MgkW1W6bhF9RGlxvHHIE9sv/tdg== + dependencies: + any-signal "^2.0.0" + bignumber.js "^9.0.0" + cids "^1.1.5" + debug "^4.1.1" + form-data "^3.0.0" + ipfs-core-types "^0.2.1" + ipfs-core-utils "^0.6.1" + ipfs-utils "^5.0.0" + ipld-block "^0.11.0" + ipld-dag-cbor "^0.17.0" + ipld-dag-pb "^0.20.0" + ipld-raw "^6.0.0" + it-last "^1.0.4" + it-map "^1.0.4" + it-tar "^1.2.2" + it-to-stream "^0.1.2" + merge-options "^2.0.0" + multiaddr "^8.0.0" + multibase "^3.0.0" + multicodec "^2.0.1" + multihashes "^3.0.1" + nanoid "^3.1.12" + native-abort-controller "~0.0.3" + parse-duration "^0.4.4" + stream-to-it "^0.2.2" + uint8arrays "^1.1.0" + +ipfs-utils@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ipfs-utils/-/ipfs-utils-5.0.1.tgz#7c0053d5e77686f45577257a73905d4523e6b4f7" + integrity sha512-28KZPgO4Uf5duT2ORLAYfboUp98iUshDD7yRAfbNxNAR8Dtidfn6o20rZfoXnkri2zKBVIPlJkuCPmPJB+6erg== + dependencies: + abort-controller "^3.0.0" + any-signal "^2.1.0" + buffer "^6.0.1" + electron-fetch "^1.7.2" + err-code "^2.0.0" + fs-extra "^9.0.1" + is-electron "^2.2.0" + iso-url "^1.0.0" + it-glob "0.0.10" + it-to-stream "^0.1.2" + merge-options "^2.0.0" + nanoid "^3.1.3" + native-abort-controller "0.0.3" + native-fetch "^2.0.0" + node-fetch "^2.6.0" + stream-to-it "^0.2.0" + +ipld-block@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/ipld-block/-/ipld-block-0.11.1.tgz#c3a7b41aee3244187bd87a73f980e3565d299b6e" + integrity sha512-sDqqLqD5qh4QzGq6ssxLHUCnH4emCf/8F8IwjQM2cjEEIEHMUj57XhNYgmGbemdYPznUhffxFGEHsruh5+HQRw== + dependencies: + cids "^1.0.0" + +ipld-dag-cbor@^0.17.0: + version "0.17.1" + resolved "https://registry.yarnpkg.com/ipld-dag-cbor/-/ipld-dag-cbor-0.17.1.tgz#842e6c250603e5791049168831a425ec03471fb1" + integrity sha512-Bakj/cnxQBdscORyf4LRHxQJQfoaY8KWc7PWROQgX+aw5FCzBt8ga0VM/59K+ABOznsqNvyLR/wz/oYImOpXJw== + dependencies: + borc "^2.1.2" + cids "^1.0.0" + is-circular "^1.0.2" + multicodec "^3.0.1" + multihashing-async "^2.0.0" + uint8arrays "^2.1.3" + +ipld-dag-pb@^0.20.0: + version "0.20.0" + resolved "https://registry.yarnpkg.com/ipld-dag-pb/-/ipld-dag-pb-0.20.0.tgz#025c0343aafe6cb9db395dd1dc93c8c60a669360" + integrity sha512-zfM0EdaolqNjAxIrtpuGKvXxWk5YtH9jKinBuQGTcngOsWFQhyybGCTJHGNGGtRjHNJi2hz5Udy/8pzv4kcKyg== + dependencies: + cids "^1.0.0" + class-is "^1.1.0" + multicodec "^2.0.0" + multihashing-async "^2.0.0" + protons "^2.0.0" + reset "^0.1.0" + run "^1.4.0" + stable "^0.1.8" + uint8arrays "^1.0.0" + +ipld-raw@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/ipld-raw/-/ipld-raw-6.0.0.tgz#74d947fcd2ce4e0e1d5bb650c1b5754ed8ea6da0" + integrity sha512-UK7fjncAzs59iu/o2kwYtb8jgTtW6B+cNWIiNpAJkfRwqoMk1xD/6i25ktzwe4qO8gQgoR9RxA5ibC23nq8BLg== + dependencies: + cids "^1.0.0" + multicodec "^2.0.0" + multihashing-async "^2.0.0" + is-accessor-descriptor@^0.1.6: version "0.1.6" resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" @@ -7753,7 +11231,7 @@ is-accessor-descriptor@^1.0.0: dependencies: kind-of "^6.0.0" -is-arguments@^1.0.4: +is-arguments@^1.0.4, is-arguments@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.0.tgz#62353031dfbee07ceb34656a6bde59efecae8dd9" integrity sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg== @@ -7799,6 +11277,11 @@ is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.3: resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.3.tgz#8b1e0500b73a1d76c70487636f368e519de8db8e" integrity sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ== +is-capitalized@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-capitalized/-/is-capitalized-1.0.0.tgz#4c8464b4d91d3e4eeb44889dd2cd8f1b0ac4c136" + integrity sha1-TIRktNkdPk7rRIid0s2PGwrEwTY= + is-ci@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" @@ -7806,6 +11289,16 @@ is-ci@^2.0.0: dependencies: ci-info "^2.0.0" +is-circular@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-circular/-/is-circular-1.0.2.tgz#2e0ab4e9835f4c6b0ea2b9855a84acd501b8366c" + integrity sha512-YttjnrswnUYRVJvxCvu8z+PGMUSzC2JttP0OEXezlAEdp3EXzhf7IZ3j0gRAybJBQupedIZFhY61Tga6E0qASA== + +is-class@0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/is-class/-/is-class-0.0.4.tgz#e057451705bb34e39e3e33598c93a9837296b736" + integrity sha1-4FdFFwW7NOOePjNZjJOpg3KWtzY= + is-core-module@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.2.0.tgz#97037ef3d52224d85163f5597b2b63d9afed981a" @@ -7855,6 +11348,23 @@ is-docker@^2.0.0: resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.0.tgz#b037c8815281edaad6c2562648a5f5f18839d5f7" integrity sha512-K4GwB4i/HzhAzwP/XSlspzRdFTI9N8OxJOyOU7Y5Rz+p+WBokXWVWblaJeBkggthmoSV0OoGTH5thJNvplpkvQ== +is-dotfile@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" + integrity sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE= + +is-electron@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-electron/-/is-electron-2.2.0.tgz#8943084f09e8b731b3a7a0298a7b5d56f6b7eef0" + integrity sha512-SpMppC2XR3YdxSzczXReBjqs2zGscWQpBIKqwXYBFic0ERaxNVgwLCHwOLZeESfdJQjX0RDvrJ1lBXX2ij+G1Q== + +is-equal-shallow@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" + integrity sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ= + dependencies: + is-primitive "^2.0.0" + is-extendable@^0.1.0, is-extendable@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" @@ -7867,7 +11377,12 @@ is-extendable@^1.0.1: dependencies: is-plain-object "^2.0.4" -is-extglob@^2.1.1: +is-extglob@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" + integrity sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA= + +is-extglob@^2.1.0, is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= @@ -7904,23 +11419,61 @@ is-function@^1.0.1: resolved "https://registry.yarnpkg.com/is-function/-/is-function-1.0.2.tgz#4f097f30abf6efadac9833b17ca5dc03f8144e08" integrity sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ== -is-glob@^4.0.1, is-glob@~4.0.1: +is-generator-function@^1.0.7: + version "1.0.9" + resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.9.tgz#e5f82c2323673e7fcad3d12858c83c4039f6399c" + integrity sha512-ZJ34p1uvIfptHCN7sFTjGibB9/oBg17sHqzDLfuwhvmN/qLVvIQXRQ8licZQ35WJ8KuEQt/etnnzQFI9C9Ue/A== + +is-glob@4.0.1, is-glob@^4.0.1, is-glob@~4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== dependencies: is-extglob "^2.1.1" +is-glob@^2.0.0, is-glob@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" + integrity sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM= + dependencies: + is-extglob "^1.0.0" + +is-glob@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" + integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= + dependencies: + is-extglob "^2.1.0" + is-hex-prefixed@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz#7d8d37e6ad77e5d127148913c573e082d777f554" integrity sha1-fY035q135dEnFIkTxXPggtd39VQ= +is-ip@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/is-ip/-/is-ip-3.1.0.tgz#2ae5ddfafaf05cb8008a62093cf29734f657c5d8" + integrity sha512-35vd5necO7IitFPjd/YBeqwWnyDWbuLH9ZXQdMfDA8TEo7pv5X8yfrvVO3xbJbLUlERCMvf6X0hTUamQxCYJ9Q== + dependencies: + ip-regex "^4.0.0" + is-lambda@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-lambda/-/is-lambda-1.0.1.tgz#3d9877899e6a53efc0160504cde15f82e6f061d5" integrity sha1-PZh3iZ5qU+/AFgUEzeFfgubwYdU= +is-lower-case@^1.1.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/is-lower-case/-/is-lower-case-1.1.3.tgz#7e147be4768dc466db3bfb21cc60b31e6ad69393" + integrity sha1-fhR75HaNxGbbO/shzGCzHmrWk5M= + dependencies: + lower-case "^1.1.0" + +is-map@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.2.tgz#00922db8c9bf73e81b7a335827bc2a43f2b91127" + integrity sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg== + is-negative-zero@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.1.tgz#3de746c18dda2319241a53675908d8f766f11c24" @@ -7931,6 +11484,13 @@ is-number-object@^1.0.4: resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.4.tgz#36ac95e741cf18b283fc1ddf5e83da798e3ec197" integrity sha512-zohwelOAur+5uXtk8O3GPQ1eAcu4ZX3UwxQhUlfFFMNpUd83gXgjbhJh6HmB6LUNV/ieOLQuDwJO3dWJosUeMw== +is-number@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" + integrity sha1-Afy7s5NGOlSPL0ZszhbezknbkI8= + dependencies: + kind-of "^3.0.2" + is-number@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" @@ -7938,11 +11498,21 @@ is-number@^3.0.0: dependencies: kind-of "^3.0.2" +is-number@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff" + integrity sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ== + is-number@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== +is-obj@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" + integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= + is-obj@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" @@ -7975,6 +11545,21 @@ is-plain-object@^5.0.0: resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-5.0.0.tgz#4427f50ab3429e9025ea7d52e9043a9ef4159344" integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q== +is-posix-bracket@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" + integrity sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q= + +is-primitive@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" + integrity sha1-IHurkWOEmcB7Kt8kCkGochADRXU= + +is-promise@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-4.0.0.tgz#42ff9f84206c1991d26debf520dd5c01042dd2f3" + integrity sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ== + is-regex@^1.0.4, is-regex@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.2.tgz#81c8ebde4db142f2cf1c53fc86d6a45788266251" @@ -7995,6 +11580,11 @@ is-retry-allowed@^1.0.0: resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz#d778488bd0a4666a3be8a1482b9f2baafedea8b4" integrity sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg== +is-set@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.2.tgz#90755fa4c2562dc1c5d4024760d6119b94ca18ec" + integrity sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g== + is-ssh@^1.3.0: version "1.3.2" resolved "https://registry.yarnpkg.com/is-ssh/-/is-ssh-1.3.2.tgz#a4b82ab63d73976fd8263cceee27f99a88bdae2b" @@ -8038,11 +11628,29 @@ is-text-path@^1.0.1: dependencies: text-extensions "^1.0.0" +is-typed-array@^1.1.3: + version "1.1.5" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.5.tgz#f32e6e096455e329eb7b423862456aa213f0eb4e" + integrity sha512-S+GRDgJlR3PyEbsX/Fobd9cqpZBuvUS+8asRqYDMLCb2qMzt1oz5m5oxQCxOgUDxiWsOVNi4yaF+/uvdlHlYug== + dependencies: + available-typed-arrays "^1.0.2" + call-bind "^1.0.2" + es-abstract "^1.18.0-next.2" + foreach "^2.0.5" + has-symbols "^1.0.1" + is-typedarray@^1.0.0, is-typedarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= +is-upper-case@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/is-upper-case/-/is-upper-case-1.1.2.tgz#8d0b1fa7e7933a1e58483600ec7d9661cbaf756f" + integrity sha1-jQsfp+eTOh5YSDYA7H2WYcuvdW8= + dependencies: + upper-case "^1.1.0" + is-url@^1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/is-url/-/is-url-1.2.4.tgz#04a4df46d28c4cff3d73d01ff06abeb318a1aa52" @@ -8053,6 +11661,11 @@ is-utf8@^0.2.0: resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= +is-valid-glob@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/is-valid-glob/-/is-valid-glob-0.3.0.tgz#d4b55c69f51886f9b65c70d6c2622d37e29f48fe" + integrity sha1-1LVcafUYhvm2XHDWwmItN+KfSP4= + is-windows@^1.0.0, is-windows@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" @@ -8075,35 +11688,164 @@ isarray@1.0.0, isarray@~1.0.0: resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= +isarray@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" + integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + +iso-constants@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/iso-constants/-/iso-constants-0.1.2.tgz#3d2456ed5aeaa55d18564f285ba02a47a0d885b4" + integrity sha512-OTCM5ZCQsHBCI4Wdu4tSxvDIkmDHd5EwJDps5mKqnQnWJSKlnwMs3EDZ4n3Fh1tmkWkDlyd2vCDbEYuPbyrUNQ== + +iso-random-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/iso-random-stream/-/iso-random-stream-2.0.0.tgz#3f0118166d5443148bbc134345fb100002ad0f1d" + integrity sha512-lGuIu104KfBV9ubYTSaE3GeAr6I69iggXxBHbTBc5u/XKlwlWl0LCytnkIZissaKqvxablwRD9B3ktVnmIUnEg== + dependencies: + events "^3.3.0" + readable-stream "^3.4.0" + +iso-url@^1.0.0: + version "1.1.5" + resolved "https://registry.yarnpkg.com/iso-url/-/iso-url-1.1.5.tgz#875a0f2bf33fa1fc200f8d89e3f49eee57a8f0d9" + integrity sha512-+3JqoKdBTGmyv9vOkS6b9iHhvK34UajfTibrH/1HOK8TI7K2VsM0qOCd+aJdWKtSOA8g3PqZfcwDmnR0p3klqQ== + +iso-url@~0.4.7: + version "0.4.7" + resolved "https://registry.yarnpkg.com/iso-url/-/iso-url-0.4.7.tgz#de7e48120dae46921079fe78f325ac9e9217a385" + integrity sha512-27fFRDnPAMnHGLq36bWTpKET+eiXct3ENlCcdcMdk+mjXrb2kw3mhBUg1B7ewAC0kVzlOPhADzQgz1SE6Tglog== + +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= + dependencies: + isarray "1.0.0" + +isobject@^3.0.0, isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= + +isomorphic-ws@4.0.1, isomorphic-ws@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz#55fd4cd6c5e6491e76dc125938dd863f5cd4f2dc" + integrity sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w== + +isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= + +isurl@^1.0.0-alpha5: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isurl/-/isurl-1.0.0.tgz#b27f4f49f3cdaa3ea44a0a5b7f3462e6edc39d67" + integrity sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w== + dependencies: + has-to-string-tag-x "^1.2.0" + is-object "^1.0.1" + +it-all@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/it-all/-/it-all-1.0.5.tgz#e880510d7e73ebb79063a76296a2eb3cb77bbbdb" + integrity sha512-ygD4kA4vp8fi+Y+NBgEKt6W06xSbv6Ub/0V8d1r3uCyJ9Izwa1UspkIOlqY9fOee0Z1w3WRo1+VWyAU4DgtufA== + +it-concat@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/it-concat/-/it-concat-1.0.3.tgz#84db9376e4c77bf7bc1fd933bb90f184e7cef32b" + integrity sha512-sjeZQ1BWQ9U/W2oI09kZgUyvSWzQahTkOkLIsnEPgyqZFaF9ME5gV6An4nMjlyhXKWQMKEakQU8oRHs2SdmeyA== + dependencies: + bl "^4.0.0" + +it-drain@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/it-drain/-/it-drain-1.0.4.tgz#15ee0e90fba4b5bc8cff1c61b8c59d4203293baa" + integrity sha512-coB7mcyZ4lWBQKoQGJuqM+P94pvpn2T3KY27vcVWPqeB1WmoysRC76VZnzAqrBWzpWcoEJMjZ+fsMBslxNaWfQ== + +it-glob@0.0.10: + version "0.0.10" + resolved "https://registry.yarnpkg.com/it-glob/-/it-glob-0.0.10.tgz#4defd9286f693847c3ff483d2ff65f22e1359ad8" + integrity sha512-p1PR15djgPV7pxdLOW9j4WcJdla8+91rJdUU2hU2Jm68vkxpIEXK55VHBeH8Lvqh2vqLtM83t8q4BuJxue6niA== + dependencies: + fs-extra "^9.0.1" + minimatch "^3.0.4" + +it-last@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/it-last/-/it-last-1.0.5.tgz#5c711c7d58948bcbc8e0cb129af3a039ba2a585b" + integrity sha512-PV/2S4zg5g6dkVuKfgrQfN2rUN4wdTI1FzyAvU+i8RV96syut40pa2s9Dut5X7SkjwA3P0tOhLABLdnOJ0Y/4Q== + +it-map@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/it-map/-/it-map-1.0.5.tgz#2f6a9b8f0ba1ed1aeadabf86e00b38c73a1dc299" + integrity sha512-EElupuWhHVStUgUY+OfTJIS2MZed96lDrAXzJUuqiiqLnIKoBRqtX1ZG2oR0bGDsSppmz83MtzCeKLZ9TVAUxQ== + +it-peekable@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/it-peekable/-/it-peekable-1.0.2.tgz#3b2c7948b765f35b3bb07abbb9b2108c644e73c1" + integrity sha512-LRPLu94RLm+lxLZbChuc9iCXrKCOu1obWqxfaKhF00yIp30VGkl741b5P60U+rdBxuZD/Gt1bnmakernv7bVFg== -isobject@^2.0.0: +it-reader@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" - integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= + resolved "https://registry.yarnpkg.com/it-reader/-/it-reader-2.1.0.tgz#b1164be343f8538d8775e10fb0339f61ccf71b0f" + integrity sha512-hSysqWTO9Tlwc5EGjVf8JYZzw0D2FsxD/g+eNNWrez9zODxWt6QlN6JAMmycK72Mv4jHEKEXoyzUN4FYGmJaZw== dependencies: - isarray "1.0.0" + bl "^4.0.0" -isobject@^3.0.0, isobject@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" - integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= +it-tar@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/it-tar/-/it-tar-1.2.2.tgz#8d79863dad27726c781a4bcc491f53c20f2866cf" + integrity sha512-M8V4a9I+x/vwXTjqvixcEZbQZHjwDIb8iUQ+D4M2QbhAdNs3WKVSl+45u5/F2XFx6jYMFOGzMVlKNK/uONgNIA== + dependencies: + bl "^4.0.0" + buffer "^5.4.3" + iso-constants "^0.1.2" + it-concat "^1.0.0" + it-reader "^2.0.0" + p-defer "^3.0.0" -isstream@~0.1.2: +it-to-stream@^0.1.2: version "0.1.2" - resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" - integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= + resolved "https://registry.yarnpkg.com/it-to-stream/-/it-to-stream-0.1.2.tgz#7163151f75b60445e86b8ab1a968666acaacfe7b" + integrity sha512-DTB5TJRZG3untmZehcaFN0kGWl2bNv7tnJRgQHAO9QEt8jfvVRrebZtnD5NZd4SCj4WVPjl0LSrugNWE/UaZRQ== + dependencies: + buffer "^5.6.0" + fast-fifo "^1.0.0" + get-iterator "^1.0.2" + p-defer "^3.0.0" + p-fifo "^1.0.0" + readable-stream "^3.6.0" -isurl@^1.0.0-alpha5: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isurl/-/isurl-1.0.0.tgz#b27f4f49f3cdaa3ea44a0a5b7f3462e6edc39d67" - integrity sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w== +iter-tools@^7.0.2: + version "7.1.3" + resolved "https://registry.yarnpkg.com/iter-tools/-/iter-tools-7.1.3.tgz#eeafa7cde16ae8ff3b67ce6890f5e2f745a65fe7" + integrity sha512-Pnd3FVHgKnDHrTVjggXLMq5O/P60fho5iL0a0kkdLcofxX8STHw6cgYZ4ZHQS3Zb4Hg/VeqeNUxDs4vlVwUL4A== dependencies: - has-to-string-tag-x "^1.2.0" - is-object "^1.0.1" + "@babel/runtime" "^7.12.1" + +iterall@^1.1.3, iterall@^1.2.1, iterall@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/iterall/-/iterall-1.3.0.tgz#afcb08492e2915cbd8a0884eb93a8c94d0d72fea" + integrity sha512-QZ9qOMdF+QLHxy1QIpUHUU1D5pS2CG2P69LF6L6CPjPYA/XMOmKV3PZpawHoAjHNyB0swdVTRxdYT4tbBbxqwg== + +iterate-iterator@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/iterate-iterator/-/iterate-iterator-1.0.1.tgz#1693a768c1ddd79c969051459453f082fe82e9f6" + integrity sha512-3Q6tudGN05kbkDQDI4CqjaBf4qf85w6W6GnuZDtUVYwKgtC1q8yxYX7CZed7N+tLzQqS6roujWvszf13T+n9aw== + +iterate-value@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/iterate-value/-/iterate-value-1.0.2.tgz#935115bd37d006a52046535ebc8d07e9c9337f57" + integrity sha512-A6fMAio4D2ot2r/TYzr4yUWrmwNdsN5xL7+HUiyACE4DXm+q8HtPcnFTp+NnW3k4N05tZ7FVYFFb2CR13NxyHQ== + dependencies: + es-get-iterator "^1.0.2" + iterate-iterator "^1.0.1" jest-docblock@^21.0.0: version "21.2.0" @@ -8148,6 +11890,14 @@ js-yaml@3.13.1: argparse "^1.0.7" esprima "^4.0.0" +js-yaml@3.14.0: + version "3.14.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.0.tgz#a7a34170f26a21bb162424d8adacb4113a69e482" + integrity sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + js-yaml@3.x, js-yaml@^3.13.0, js-yaml@^3.13.1, js-yaml@^3.6.1: version "3.14.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" @@ -8163,16 +11913,47 @@ js-yaml@4.0.0: dependencies: argparse "^2.0.1" +jsan@^3.1.13: + version "3.1.13" + resolved "https://registry.yarnpkg.com/jsan/-/jsan-3.1.13.tgz#4de8c7bf8d1cfcd020c313d438f930cec4b91d86" + integrity sha512-9kGpCsGHifmw6oJet+y8HaCl14y7qgAsxVdV3pCHDySNR3BfDC30zgkssd7x5LRVAT22dnpbe9JdzzmXZnq9/g== + jsbn@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= +jsdom@^7.0.2: + version "7.2.2" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-7.2.2.tgz#40b402770c2bda23469096bee91ab675e3b1fc6e" + integrity sha1-QLQCdwwr2iNGkJa+6Rq2deOx/G4= + dependencies: + abab "^1.0.0" + acorn "^2.4.0" + acorn-globals "^1.0.4" + cssom ">= 0.3.0 < 0.4.0" + cssstyle ">= 0.2.29 < 0.3.0" + escodegen "^1.6.1" + nwmatcher ">= 1.3.7 < 2.0.0" + parse5 "^1.5.1" + request "^2.55.0" + sax "^1.1.4" + symbol-tree ">= 3.1.0 < 4.0.0" + tough-cookie "^2.2.0" + webidl-conversions "^2.0.0" + whatwg-url-compat "~0.6.5" + xml-name-validator ">= 2.0.1 < 3.0.0" + jsesc@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" integrity sha1-RsP+yMGJKxKwgz25vHYiF226s0s= +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + jsesc@~0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" @@ -8200,6 +11981,13 @@ json-parse-even-better-errors@^2.3.0: resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== +json-pointer@^0.6.0: + version "0.6.1" + resolved "https://registry.yarnpkg.com/json-pointer/-/json-pointer-0.6.1.tgz#3c6caa6ac139e2599f5a1659d39852154015054d" + integrity sha512-3OvjqKdCBvH41DLpV4iSt6v2XhZXV1bPB4OROuknvUXI7ZQNofieCPkmE26stEJ9zdQuvIxDHCuYhfgxFAAs+Q== + dependencies: + foreach "^2.0.4" + json-rpc-engine@^3.4.0, json-rpc-engine@^3.6.0: version "3.8.0" resolved "https://registry.yarnpkg.com/json-rpc-engine/-/json-rpc-engine-3.8.0.tgz#9d4ff447241792e1d0a232f6ef927302bb0c62a9" @@ -8212,6 +12000,14 @@ json-rpc-engine@^3.4.0, json-rpc-engine@^3.6.0: promise-to-callback "^1.0.0" safe-event-emitter "^1.0.1" +json-rpc-engine@^5.1.3: + version "5.4.0" + resolved "https://registry.yarnpkg.com/json-rpc-engine/-/json-rpc-engine-5.4.0.tgz#75758609d849e1dba1e09021ae473f3ab63161e5" + integrity sha512-rAffKbPoNDjuRnXkecTjnsE3xLLrb00rEkdgalINhaYVYIxDwWtvYBr9UFbhTvPB1B2qUOLoFd/cV6f4Q7mh7g== + dependencies: + eth-rpc-errors "^3.0.0" + safe-event-emitter "^1.0.1" + json-rpc-error@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/json-rpc-error/-/json-rpc-error-2.0.0.tgz#a7af9c202838b5e905c7250e547f1aff77258a02" @@ -8219,7 +12015,7 @@ json-rpc-error@^2.0.0: dependencies: inherits "^2.0.1" -json-rpc-random-id@^1.0.0: +json-rpc-random-id@^1.0.0, json-rpc-random-id@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/json-rpc-random-id/-/json-rpc-random-id-1.0.1.tgz#ba49d96aded1444dbb8da3d203748acbbcdec8c8" integrity sha1-uknZat7RRE27jaPSA3SKy7zeyMg= @@ -8234,6 +12030,11 @@ json-schema@0.2.3: resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= + json-stable-stringify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" @@ -8246,6 +12047,13 @@ json-stringify-safe@^5.0.1, json-stringify-safe@~5.0.1: resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= +json-text-sequence@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/json-text-sequence/-/json-text-sequence-0.1.1.tgz#a72f217dc4afc4629fff5feb304dc1bd51a2f3d2" + integrity sha1-py8hfcSvxGKf/1/rME3BvVGi89I= + dependencies: + delimit-stream "0.1.0" + json5@^0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" @@ -8258,13 +12066,21 @@ json5@^1.0.1: dependencies: minimist "^1.2.0" -json5@^2.1.0: +json5@^2.1.0, json5@^2.1.2: version "2.2.0" resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.0.tgz#2dfefe720c6ba525d9ebd909950f0515316c89a3" integrity sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA== dependencies: minimist "^1.2.5" +jsondown@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/jsondown/-/jsondown-1.0.0.tgz#c5cc5cda65f515d2376136a104b5f535534f26e3" + integrity sha512-p6XxPaq59aXwcdDQV3ISMA5xk+1z6fJuctcwwSdR9iQgbYOcIrnknNrhcMGG+0FaUfKHGkdDpQNaZrovfBoyOw== + dependencies: + memdown "1.4.1" + mkdirp "0.5.1" + jsonfile@^2.1.0: version "2.4.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" @@ -8353,6 +12169,18 @@ keccak@^2.0.0: nan "^2.14.0" safe-buffer "^5.2.0" +keypair@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/keypair/-/keypair-1.0.3.tgz#4314109d94052a0acfd6b885695026ad29529c80" + integrity sha512-0wjZ2z/SfZZq01+3/8jYLd8aEShSa+aat1zyPGQY3IuKoEAp6DJGvu2zt6snELrQU9jbCkIlCyNOD7RdQbHhkQ== + +keypather@^1.10.2: + version "1.10.2" + resolved "https://registry.yarnpkg.com/keypather/-/keypather-1.10.2.tgz#e0449632d4b3e516f21cc014ce7c5644fddce614" + integrity sha1-4ESWMtSz5RbyHMAUznxWRP3c5hQ= + dependencies: + "101" "^1.0.0" + keyv@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9" @@ -8398,6 +12226,18 @@ klaw@^1.0.0: optionalDependencies: graceful-fs "^4.1.9" +lazy-debug-legacy@0.0.X: + version "0.0.1" + resolved "https://registry.yarnpkg.com/lazy-debug-legacy/-/lazy-debug-legacy-0.0.1.tgz#537716c0776e4cf79e3ed1b621f7658c2911b1b1" + integrity sha1-U3cWwHduTPeePtG2IfdljCkRsbE= + +lazystream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lazystream/-/lazystream-1.0.0.tgz#f6995fe0f820392f61396be89462407bb77168e4" + integrity sha1-9plf4PggOS9hOWvolGJAe7dxaOQ= + dependencies: + readable-stream "^2.0.5" + lcid@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" @@ -8412,6 +12252,14 @@ lcid@^2.0.0: dependencies: invert-kv "^2.0.0" +leb128@0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/leb128/-/leb128-0.0.5.tgz#84524a86ef7799fb3933ce41345f6490e27ac948" + integrity sha512-elbNtfmu3GndZbesVF6+iQAfVjOXW9bM/aax9WwMlABZW+oK9sbAZEXoewaPHmL34sxa8kVwWsru8cNE/yn2gg== + dependencies: + bn.js "^5.0.0" + buffer-pipe "0.0.3" + lerna@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/lerna/-/lerna-4.0.0.tgz#b139d685d50ea0ca1be87713a7c2f44a5b678e9e" @@ -8436,7 +12284,12 @@ lerna@^4.0.0: import-local "^3.0.2" npmlog "^4.1.2" -level-codec@^9.0.0: +level-codec@9.0.1: + version "9.0.1" + resolved "https://registry.yarnpkg.com/level-codec/-/level-codec-9.0.1.tgz#042f4aa85e56d4328ace368c950811ba802b7247" + integrity sha512-ajFP0kJ+nyq4i6kptSM+mAvJKLOg1X5FiFPtLG9M5gCEZyBmgDi3FkDrvlMkEzrUn1cWxtvVmrvoS4ASyO/q+Q== + +level-codec@9.0.2, level-codec@^9.0.0: version "9.0.2" resolved "https://registry.yarnpkg.com/level-codec/-/level-codec-9.0.2.tgz#fd60df8c64786a80d44e63423096ffead63d8cbc" integrity sha512-UyIwNb1lJBChJnGfjmO0OR+ezh2iVu1Kas3nvBS/BzGnx79dv6g7unpKIDNPMhfdTEGoc7mC8uAu51XEtX+FHQ== @@ -8511,6 +12364,17 @@ level-iterator-stream@~4.0.0: readable-stream "^3.4.0" xtend "^4.0.2" +level-js@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/level-js/-/level-js-4.0.2.tgz#fa51527fa38b87c4d111b0d0334de47fcda38f21" + integrity sha512-PeGjZsyMG4O89KHiez1zoMJxStnkM+oBIqgACjoo5PJqFiSUUm3GNod/KcbqN5ktyZa8jkG7I1T0P2u6HN9lIg== + dependencies: + abstract-leveldown "~6.0.1" + immediate "~3.2.3" + inherits "^2.0.3" + ltgt "^2.1.2" + typedarray-to-buffer "~3.1.5" + level-js@^5.0.0: version "5.0.2" resolved "https://registry.yarnpkg.com/level-js/-/level-js-5.0.2.tgz#5e280b8f93abd9ef3a305b13faf0b5397c969b55" @@ -8537,7 +12401,7 @@ level-mem@^5.0.1: level-packager "^5.0.3" memdown "^5.0.0" -level-packager@^5.0.3, level-packager@^5.1.0: +level-packager@^5.0.0, level-packager@^5.0.3, level-packager@^5.1.0: version "5.1.1" resolved "https://registry.yarnpkg.com/level-packager/-/level-packager-5.1.1.tgz#323ec842d6babe7336f70299c14df2e329c18939" integrity sha512-HMwMaQPlTC1IlcwT3+swhqf/NUO+ZhXVz6TY1zZIIZlIR0YSn8GtAAWmIvKjNY16ZkEg/JcpAuQskxsXqC0yOQ== @@ -8583,6 +12447,13 @@ level-supports@~1.0.0: dependencies: xtend "^4.0.2" +level-write-stream@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/level-write-stream/-/level-write-stream-1.0.0.tgz#3f7fbb679a55137c0feb303dee766e12ee13c1dc" + integrity sha1-P3+7Z5pVE3wP6zA97nZuEu4Twdw= + dependencies: + end-stream "~0.1.0" + level-ws@0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/level-ws/-/level-ws-0.0.0.tgz#372e512177924a00424b0b43aef2bb42496d228b" @@ -8609,6 +12480,16 @@ level-ws@^2.0.0: readable-stream "^3.1.0" xtend "^4.0.1" +level@5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/level/-/level-5.0.1.tgz#8528cc1ee37ac413270129a1eab938c610be3ccb" + integrity sha512-wcak5OQeA4rURGacqS62R/xNHjCYnJSQDBOlm4KNUGJVE9bWv2B04TclqReYejN+oD65PzD4FsqeWoI5wNC5Lg== + dependencies: + level-js "^4.0.0" + level-packager "^5.0.0" + leveldown "^5.0.0" + opencollective-postinstall "^2.0.0" + level@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/level/-/level-6.0.1.tgz#dc34c5edb81846a6de5079eac15706334b0d7cd6" @@ -8618,7 +12499,17 @@ level@^6.0.1: level-packager "^5.1.0" leveldown "^5.4.0" -leveldown@^5.4.0: +leveldown@5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/leveldown/-/leveldown-5.0.2.tgz#c8edc2308c8abf893ffc81e66ab6536111cae92c" + integrity sha512-Ib6ygFYBleS8x2gh3C1AkVsdrUShqXpe6jSTnZ6sRycEXKhqVf+xOSkhgSnjidpPzyv0d95LJVFrYQ4NuXAqHA== + dependencies: + abstract-leveldown "~6.0.0" + fast-future "~1.0.2" + napi-macros "~1.8.1" + node-gyp-build "~3.8.0" + +leveldown@^5.0.0, leveldown@^5.4.0: version "5.6.0" resolved "https://registry.yarnpkg.com/leveldown/-/leveldown-5.6.0.tgz#16ba937bb2991c6094e13ac5a6898ee66d3eee98" integrity sha512-iB8O/7Db9lPaITU1aA2txU/cBEXAt4vWwKQRrrWuS6XDgbP4QZGj9BL2aNbwb002atoQ/lIotJkfyzz+ygQnUQ== @@ -8637,20 +12528,17 @@ levelup@3.1.1, levelup@^3.0.0: level-iterator-stream "~3.0.0" xtend "~4.0.0" -levelup@^1.2.1: - version "1.3.9" - resolved "https://registry.yarnpkg.com/levelup/-/levelup-1.3.9.tgz#2dbcae845b2bb2b6bea84df334c475533bbd82ab" - integrity sha512-VVGHfKIlmw8w1XqpGOAGwq6sZm2WwWLmlDcULkKWQXEA5EopA8OBNJ2Ck2v6bdk8HeEZSbCSEgzXadyQFm76sQ== +levelup@4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/levelup/-/levelup-4.0.2.tgz#bcb8d28d0a82ee97f1c6d00f20ea6d32c2803c5b" + integrity sha512-cx9PmLENwbGA3svWBEbeO2HazpOSOYSXH4VA+ahVpYyurvD+SDSfURl29VBY2qgyk+Vfy2dJd71SBRckj/EZVA== dependencies: - deferred-leveldown "~1.2.1" - level-codec "~7.0.0" - level-errors "~1.0.3" - level-iterator-stream "~1.3.0" - prr "~1.0.1" - semver "~5.4.1" + deferred-leveldown "~5.0.0" + level-errors "~2.0.0" + level-iterator-stream "~4.0.0" xtend "~4.0.0" -levelup@^4.3.2, levelup@^4.4.0: +levelup@4.4.0, levelup@^4.3.2, levelup@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/levelup/-/levelup-4.4.0.tgz#f89da3a228c38deb49c48f88a70fb71f01cafed6" integrity sha512-94++VFO3qN95cM/d6eBXvd894oJE0w3cInq9USsyQzzoJxmiYzPAocNcuGCPGGjoXqDVJcr3C1jzt1TSjyaiLQ== @@ -8661,6 +12549,19 @@ levelup@^4.3.2, levelup@^4.4.0: level-supports "~1.0.0" xtend "~4.0.0" +levelup@^1.2.1: + version "1.3.9" + resolved "https://registry.yarnpkg.com/levelup/-/levelup-1.3.9.tgz#2dbcae845b2bb2b6bea84df334c475533bbd82ab" + integrity sha512-VVGHfKIlmw8w1XqpGOAGwq6sZm2WwWLmlDcULkKWQXEA5EopA8OBNJ2Ck2v6bdk8HeEZSbCSEgzXadyQFm76sQ== + dependencies: + deferred-leveldown "~1.2.1" + level-codec "~7.0.0" + level-errors "~1.0.3" + level-iterator-stream "~1.3.0" + prr "~1.0.1" + semver "~5.4.1" + xtend "~4.0.0" + leven@2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/leven/-/leven-2.1.0.tgz#c2e7a9f772094dee9d34202ae8acce4687875580" @@ -8695,12 +12596,37 @@ libnpmpublish@^4.0.0: semver "^7.1.3" ssri "^8.0.0" +libp2p-crypto@^0.19.0: + version "0.19.4" + resolved "https://registry.yarnpkg.com/libp2p-crypto/-/libp2p-crypto-0.19.4.tgz#90603a1318e903fbf142db3124ff3b2a1ba07ec7" + integrity sha512-8iUwiNlU/sFEtXQpxaehmXUQ5Fw6r52H7NH0d8ZSb8nKBbO6r8y8ft6f1to8A81SrFOVd4/zsjEzokpedDvRgw== + dependencies: + err-code "^3.0.1" + is-typedarray "^1.0.0" + iso-random-stream "^2.0.0" + keypair "^1.0.1" + multibase "^4.0.3" + multicodec "^3.0.1" + multihashes "^4.0.2" + multihashing-async "^2.1.2" + node-forge "^0.10.0" + pem-jwk "^2.0.0" + protobufjs "^6.10.2" + secp256k1 "^4.0.0" + uint8arrays "^2.1.4" + ursa-optional "^0.10.1" + lines-and-columns@^1.1.6: version "1.1.6" resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA= -load-json-file@^1.0.0: +linked-list@0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/linked-list/-/linked-list-0.1.0.tgz#798b0ff97d1b92a4fd08480f55aea4e9d49d37bf" + integrity sha1-eYsP+X0bkqT9CEgPVa6k6dSdN78= + +load-json-file@^1.0.0, load-json-file@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" integrity sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA= @@ -8771,7 +12697,12 @@ locate-path@^6.0.0: dependencies: p-locate "^5.0.0" -lodash._reinterpolate@^3.0.0: +lodash-es@^4.2.1: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.21.tgz#43e626c46e6591b7750beb2b50117390c609e3ee" + integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw== + +lodash._reinterpolate@^3.0.0, lodash._reinterpolate@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" integrity sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0= @@ -8781,21 +12712,108 @@ lodash.assign@^4.0.3, lodash.assign@^4.0.6: resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7" integrity sha1-DZnzzNem0mHRm9rrkkUAXShYCOc= +lodash.assignin@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.assignin/-/lodash.assignin-4.2.0.tgz#ba8df5fb841eb0a3e8044232b0e263a8dc6a28a2" + integrity sha1-uo31+4QesKPoBEIysOJjqNxqKKI= + +lodash.assigninwith@^4.0.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.assigninwith/-/lodash.assigninwith-4.2.0.tgz#af02c98432ac86d93da695b4be801401971736af" + integrity sha1-rwLJhDKshtk9ppW0voAUAZcXNq8= + +lodash.clonedeep@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" + integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8= + +lodash.debounce@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" + integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= + +lodash.escaperegexp@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz#64762c48618082518ac3df4ccf5d5886dae20347" + integrity sha1-ZHYsSGGAglGKw99Mz11YhtriA0c= + +lodash.flatmap@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.flatmap/-/lodash.flatmap-4.5.0.tgz#ef8cbf408f6e48268663345305c6acc0b778702e" + integrity sha1-74y/QI9uSCaGYzRTBcaswLd4cC4= + +lodash.flatten@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f" + integrity sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8= + lodash.get@^4.4.2: version "4.4.2" resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" integrity sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk= +lodash.isequal@^4.0.0, lodash.isequal@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" + integrity sha1-QVxEePK8wwEgwizhDtMib30+GOA= + lodash.ismatch@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz#756cb5150ca3ba6f11085a78849645f188f85f37" integrity sha1-dWy1FQyjum8RCFp4hJZF8Yj4Xzc= +lodash.keys@^4.0.0, lodash.keys@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-4.2.0.tgz#a08602ac12e4fb83f91fc1fb7a360a4d9ba35205" + integrity sha1-oIYCrBLk+4P5H8H7ejYKTZujUgU= + +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + +lodash.omit@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.omit/-/lodash.omit-4.5.0.tgz#6eb19ae5a1ee1dd9df0b969e66ce0b7fa30b5e60" + integrity sha1-brGa5aHuHdnfC5aeZs4Lf6MLXmA= + +lodash.partition@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.partition/-/lodash.partition-4.6.0.tgz#a38e46b73469e0420b0da1212e66d414be364ba4" + integrity sha1-o45GtzRp4EILDaEhLmbUFL42S6Q= + +lodash.rest@^4.0.0: + version "4.0.5" + resolved "https://registry.yarnpkg.com/lodash.rest/-/lodash.rest-4.0.5.tgz#954ef75049262038c96d1fc98b28fdaf9f0772aa" + integrity sha1-lU73UEkmIDjJbR/Jiyj9r58Hcqo= + +lodash.sortby@^4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" + integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg= + lodash.startcase@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.startcase/-/lodash.startcase-4.4.0.tgz#9436e34ed26093ed7ffae1936144350915d9add8" integrity sha1-lDbjTtJgk+1/+uGTYUQ1CRXZrdg= +lodash.sum@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/lodash.sum/-/lodash.sum-4.0.2.tgz#ad90e397965d803d4f1ff7aa5b2d0197f3b4637b" + integrity sha1-rZDjl5ZdgD1PH/eqWy0Bl/O0Y3s= + +lodash.template@4.2.4: + version "4.2.4" + resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.2.4.tgz#d053c19e8e74e38d965bf4fb495d80f109e7f7a4" + integrity sha1-0FPBno50442WW/T7SV2A8Qnn96Q= + dependencies: + lodash._reinterpolate "~3.0.0" + lodash.assigninwith "^4.0.0" + lodash.keys "^4.0.0" + lodash.rest "^4.0.0" + lodash.templatesettings "^4.0.0" + lodash.tostring "^4.0.0" + lodash.template@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.5.0.tgz#f976195cf3f347d0d5f52483569fe8031ccce8ab" @@ -8816,17 +12834,37 @@ lodash.toarray@^4.4.0: resolved "https://registry.yarnpkg.com/lodash.toarray/-/lodash.toarray-4.4.0.tgz#24c4bfcd6b2fba38bfd0594db1179d8e9b656561" integrity sha1-JMS/zWsvuji/0FlNsRedjptlZWE= +lodash.tostring@^4.0.0: + version "4.1.4" + resolved "https://registry.yarnpkg.com/lodash.tostring/-/lodash.tostring-4.1.4.tgz#560c27d1f8eadde03c2cce198fef5c031d8298fb" + integrity sha1-Vgwn0fjq3eA8LM4Zj+9cAx2CmPs= + +lodash.without@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.without/-/lodash.without-4.4.0.tgz#3cd4574a00b67bae373a94b748772640507b7aac" + integrity sha1-PNRXSgC2e643OpS3SHcmQFB7eqw= + +lodash.xor@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.xor/-/lodash.xor-4.5.0.tgz#4d48ed7e98095b0632582ba714d3ff8ae8fb1db6" + integrity sha1-TUjtfpgJWwYyWCunFNP/iuj7HbY= + +lodash.zipwith@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.zipwith/-/lodash.zipwith-4.2.0.tgz#afacf03fd2f384af29e263c3c6bda3b80e3f51fd" + integrity sha1-r6zwP9LzhK8p4mPDxr2juA4/Uf0= + lodash@4.17.20: version "4.17.20" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== -lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.4, lodash@^4.7.0: +lodash@4.17.21, lodash@^4.1.0, lodash@^4.15.0, lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.4, lodash@^4.2.1, lodash@^4.7.0: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== -log-symbols@2.2.0: +log-symbols@2.2.0, log-symbols@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" integrity sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg== @@ -8847,6 +12885,16 @@ log-symbols@4.0.0: dependencies: chalk "^4.0.0" +loglevel@^1.6.6, loglevel@^1.6.7, loglevel@^1.6.8, loglevel@^1.7.0: + version "1.7.1" + resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.7.1.tgz#005fde2f5e6e47068f935ff28573e125ef72f197" + integrity sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw== + +long@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28" + integrity sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA== + looper@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/looper/-/looper-2.0.0.tgz#66cd0c774af3d4fedac53794f742db56da8f09ec" @@ -8857,7 +12905,7 @@ looper@^3.0.0: resolved "https://registry.yarnpkg.com/looper/-/looper-3.0.0.tgz#2efa54c3b1cbaba9b94aee2e5914b0be57fbb749" integrity sha1-LvpUw7HLq6m5Su4uWRSwvlf7t0k= -loose-envify@^1.0.0: +loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== @@ -8872,6 +12920,25 @@ loud-rejection@^1.0.0: currently-unhandled "^0.4.1" signal-exit "^3.0.0" +lower-case-first@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/lower-case-first/-/lower-case-first-1.0.2.tgz#e5da7c26f29a7073be02d52bac9980e5922adfa1" + integrity sha1-5dp8JvKacHO+AtUrrJmA5ZIq36E= + dependencies: + lower-case "^1.1.2" + +lower-case@^1.1.0, lower-case@^1.1.1, lower-case@^1.1.2: + version "1.1.4" + resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-1.1.4.tgz#9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac" + integrity sha1-miyr0bno4K6ZOkv31YdcOcQujqw= + +lower-case@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" + integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== + dependencies: + tslib "^2.0.3" + lowercase-keys@^1.0.0, lowercase-keys@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" @@ -8916,7 +12983,7 @@ lru_map@^0.3.3: resolved "https://registry.yarnpkg.com/lru_map/-/lru_map-0.3.3.tgz#b5c8351b9464cbd750335a79650a0ec0e56118dd" integrity sha1-tcg1G5Rky9dQM1p5ZQoOwOVhGN0= -ltgt@^2.1.2, ltgt@~2.2.0: +ltgt@2.2.1, ltgt@^2.1.2, ltgt@~2.2.0: version "2.2.1" resolved "https://registry.yarnpkg.com/ltgt/-/ltgt-2.2.1.tgz#f35ca91c493f7b73da0e07495304f17b31f87ee5" integrity sha1-81ypHEk/e3PaDgdJUwTxezH4fuU= @@ -8926,6 +12993,13 @@ ltgt@~2.1.1: resolved "https://registry.yarnpkg.com/ltgt/-/ltgt-2.1.3.tgz#10851a06d9964b971178441c23c9e52698eece34" integrity sha1-EIUaBtmWS5cReEQcI8nlJpjuzjQ= +make-dir@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" + integrity sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ== + dependencies: + pify "^3.0.0" + make-dir@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" @@ -8989,6 +13063,11 @@ map-obj@^4.0.0: resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-4.2.1.tgz#e4ea399dbc979ae735c83c863dd31bdf364277b7" integrity sha512-+WA2/1sPmDj1dlvvJmB5G6JKfY9dpn7EVBUL06+y6PoljPkh+6V1QihwxNkbcGxCRjt2b0F9K0taiCuo7MbdFQ== +map-stream@0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/map-stream/-/map-stream-0.0.6.tgz#d2ef4eb811a28644c7a8989985c69c2fdd496827" + integrity sha1-0u9OuBGihkTHqJiZhcacL91JaCc= + map-visit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" @@ -9013,6 +13092,11 @@ marked-terminal@^3.3.0: node-emoji "^1.4.1" supports-hyperlinks "^1.0.1" +marked@0.3.19: + version "0.3.19" + resolved "https://registry.yarnpkg.com/marked/-/marked-0.3.19.tgz#5d47f709c4c9fc3c216b6d46127280f40b39d790" + integrity sha512-ea2eGWOqNxPcXv8dyERdSr/6FmzvWwzjMxpfGB/sbMccXoct+xY+YukPD+QTUZwyvK7BZwcr4m21WBOW41pAkg== + marked@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/marked/-/marked-0.7.0.tgz#b64201f051d271b1edc10a04d1ae9b74bb8e5c0e" @@ -9023,6 +13107,11 @@ match-all@^1.2.6: resolved "https://registry.yarnpkg.com/match-all/-/match-all-1.2.6.tgz#66d276ad6b49655551e63d3a6ee53e8be0566f8d" integrity sha512-0EESkXiTkWzrQQntBu2uzKvLu6vVkUGz40nGPbSZuegcfE5UuSzNjLaIu76zJWuaT/2I3Z/8M06OlUOZLGwLlQ== +math-random@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/math-random/-/math-random-1.0.4.tgz#5dd6943c938548267016d4e34f057583080c514c" + integrity sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A== + mcl-wasm@^0.7.1: version "0.7.6" resolved "https://registry.yarnpkg.com/mcl-wasm/-/mcl-wasm-0.7.6.tgz#c1789ebda5565d49b77d2ee195ff3e4d282f1554" @@ -9051,7 +13140,7 @@ mem@^4.0.0: mimic-fn "^2.0.0" p-is-promise "^2.0.0" -memdown@^1.0.0: +memdown@1.4.1, memdown@^1.0.0: version "1.4.1" resolved "https://registry.yarnpkg.com/memdown/-/memdown-1.4.1.tgz#b4e4e192174664ffbae41361aa500f3119efe215" integrity sha1-tOThkhdGZP+65BNhqlAPMRnv4hU= @@ -9147,6 +13236,20 @@ merge-descriptors@1.0.1: resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= +merge-options@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-options/-/merge-options-2.0.0.tgz#36ca5038badfc3974dbde5e58ba89d3df80882c3" + integrity sha512-S7xYIeWHl2ZUKF7SDeBhGg6rfv5bKxVBdk95s/I7wVF8d+hjLSztJ/B271cnUiF6CAFduEQ5Zn3HYwAjT16DlQ== + dependencies: + is-plain-obj "^2.0.0" + +merge-stream@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-1.0.1.tgz#4041202d508a342ba00174008df0c251b8c135e1" + integrity sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE= + dependencies: + readable-stream "^2.0.1" + merge-stream@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" @@ -9208,11 +13311,35 @@ merkletreejs@^0.2.12, merkletreejs@^0.2.18: treeify "^1.1.0" web3-utils "^1.3.4" +meros@1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/meros/-/meros-1.1.4.tgz#c17994d3133db8b23807f62bec7f0cb276cfd948" + integrity sha512-E9ZXfK9iQfG9s73ars9qvvvbSIkJZF5yOo9j4tcwM5tN8mUKfj/EKN5PzOr3ZH0y5wL7dLAHw3RVEfpQV9Q7VQ== + methods@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= +micromatch@^2.3.7: + version "2.3.11" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" + integrity sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU= + dependencies: + arr-diff "^2.0.0" + array-unique "^0.2.1" + braces "^1.8.2" + expand-brackets "^0.1.4" + extglob "^0.3.1" + filename-regex "^2.0.0" + is-extglob "^1.0.0" + is-glob "^2.0.1" + kind-of "^3.0.2" + normalize-path "^2.0.1" + object.omit "^2.0.0" + parse-glob "^3.0.4" + regex-cache "^0.4.2" + micromatch@^3.1.4: version "3.1.10" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" @@ -9265,6 +13392,11 @@ mime@1.6.0: resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== +mimic-fn@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" + integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== + mimic-fn@^2.0.0, mimic-fn@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" @@ -9302,7 +13434,7 @@ minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= -"minimatch@2 || 3", minimatch@3.0.4, minimatch@^3.0.3, minimatch@^3.0.4: +minimatch@*, "minimatch@2 || 3", minimatch@3.0.4, minimatch@^3.0.3, minimatch@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== @@ -9318,6 +13450,16 @@ minimist-options@4.1.0, minimist-options@^4.0.2: is-plain-obj "^1.1.0" kind-of "^6.0.3" +minimist@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= + +minimist@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" + integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= + minimist@^1.1.3, minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.5, minimist@~1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" @@ -9439,6 +13581,13 @@ mkdirp@*, mkdirp@^1.0.3, mkdirp@^1.0.4: resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== +mkdirp@0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" + integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= + dependencies: + minimist "0.0.8" + mkdirp@0.5.4: version "0.5.4" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.4.tgz#fd01504a6797ec5c9be81ff43d204961ed64a512" @@ -9460,6 +13609,37 @@ mnemonist@^0.38.0: dependencies: obliterator "^1.6.1" +mocha@8.1.2: + version "8.1.2" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-8.1.2.tgz#d67fad13300e4f5cd48135a935ea566f96caf827" + integrity sha512-I8FRAcuACNMLQn3lS4qeWLxXqLvGf6r2CaLstDpZmMUUSmvW6Cnm1AuHxgbc7ctZVRcfwspCRbDHymPsi3dkJw== + dependencies: + ansi-colors "4.1.1" + browser-stdout "1.3.1" + chokidar "3.4.2" + debug "4.1.1" + diff "4.0.2" + escape-string-regexp "4.0.0" + find-up "5.0.0" + glob "7.1.6" + growl "1.10.5" + he "1.2.0" + js-yaml "3.14.0" + log-symbols "4.0.0" + minimatch "3.0.4" + ms "2.1.2" + object.assign "4.1.0" + promise.allsettled "1.0.2" + serialize-javascript "4.0.0" + strip-json-comments "3.0.1" + supports-color "7.1.0" + which "2.0.2" + wide-align "1.1.3" + workerpool "6.0.0" + yargs "13.3.2" + yargs-parser "13.1.2" + yargs-unparser "1.6.1" + mocha@^6.1.4: version "6.2.3" resolved "https://registry.yarnpkg.com/mocha/-/mocha-6.2.3.tgz#e648432181d8b99393410212664450a4c1e31912" @@ -9560,6 +13740,19 @@ modify-values@^1.0.0: resolved "https://registry.yarnpkg.com/modify-values/-/modify-values-1.0.1.tgz#b3939fa605546474e3e3e3c63d64bd43b4ee6022" integrity sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw== +module@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/module/-/module-1.2.5.tgz#b503eb06cdc13473f56818426974cde7ec59bf15" + integrity sha1-tQPrBs3BNHP1aBhCaXTN5+xZvxU= + dependencies: + chalk "1.1.3" + concat-stream "1.5.1" + lodash.template "4.2.4" + map-stream "0.0.6" + tildify "1.2.0" + vinyl-fs "2.4.3" + yargs "4.6.0" + mri@1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/mri/-/mri-1.1.4.tgz#7cb1dd1b9b40905f1fac053abe25b6720f44744a" @@ -9585,6 +13778,27 @@ ms@2.1.3, ms@^2.0.0, ms@^2.1.1: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== +multiaddr-to-uri@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/multiaddr-to-uri/-/multiaddr-to-uri-6.0.0.tgz#8f08a75c6eeb2370d5d24b77b8413e3f0fa9bcc0" + integrity sha512-OjpkVHOXEmIKMO8WChzzQ7aZQcSQX8squxmvtDbRpy7/QNmJ3Z7jv6qyD74C28QtaeNie8O8ngW2AkeiMmKP7A== + dependencies: + multiaddr "^8.0.0" + +multiaddr@^8.0.0, multiaddr@^8.1.2: + version "8.1.2" + resolved "https://registry.yarnpkg.com/multiaddr/-/multiaddr-8.1.2.tgz#74060ff8636ba1c01b2cf0ffd53950b852fa9b1f" + integrity sha512-r13IzW8+Sv9zab9Gt8RPMIN2WkptIPq99EpAzg4IbJ/zTELhiEwXWr9bAmEatSCI4j/LSA6ESJzvz95JZ+ZYXQ== + dependencies: + cids "^1.0.0" + class-is "^1.1.0" + dns-over-http-resolver "^1.0.0" + err-code "^2.0.3" + is-ip "^3.1.0" + multibase "^3.0.0" + uint8arrays "^1.1.0" + varint "^5.0.0" + multibase@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/multibase/-/multibase-0.7.0.tgz#1adfc1c50abe05eefeb5091ac0c2728d6b84581b" @@ -9593,6 +13807,21 @@ multibase@^0.7.0: base-x "^3.0.8" buffer "^5.5.0" +multibase@^3.0.0, multibase@^3.1.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/multibase/-/multibase-3.1.2.tgz#59314e1e2c35d018db38e4c20bb79026827f0f2f" + integrity sha512-bpklWHs70LO3smJUHOjcnzGceJJvn9ui0Vau6Za0B/GBepaXswmW8Ufea0uD9pROf/qCQ4N4lZ3sf3U+SNf0tw== + dependencies: + "@multiformats/base-x" "^4.0.1" + web-encoding "^1.0.6" + +multibase@^4.0.1, multibase@^4.0.3: + version "4.0.4" + resolved "https://registry.yarnpkg.com/multibase/-/multibase-4.0.4.tgz#55ef53e6acce223c5a09341a8a3a3d973871a577" + integrity sha512-8/JmrdSGzlw6KTgAJCOqUBSGd1V6186i/X8dDCGy/lbCKrQ+1QB6f3HE+wPr7Tpdj4U3gutaj9jG2rNX6UpiJg== + dependencies: + "@multiformats/base-x" "^4.0.1" + multibase@~0.6.0: version "0.6.1" resolved "https://registry.yarnpkg.com/multibase/-/multibase-0.6.1.tgz#b76df6298536cc17b9f6a6db53ec88f85f8cc12b" @@ -9616,6 +13845,31 @@ multicodec@^1.0.0: buffer "^5.6.0" varint "^5.0.0" +multicodec@^2.0.0, multicodec@^2.0.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/multicodec/-/multicodec-2.1.3.tgz#b9850635ad4e2a285a933151b55b4a2294152a5d" + integrity sha512-0tOH2Gtio39uO41o+2xl9UhRkCWxU5ZmZSbFCh/OjGzkWJI8e6lkN/s4Mj1YfyWoBod+2+S3W+6wO6nhkwN8pA== + dependencies: + uint8arrays "1.1.0" + varint "^6.0.0" + +multicodec@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/multicodec/-/multicodec-3.0.1.tgz#94e043847ee11fcce92487609ac9010429a95e31" + integrity sha512-Y6j3wiPojvkF/z6KFIGt84KdJdP2oILEdzc/3YbD3qQ3EerhqtYlfsZTPPNVoCCxNZZdzIpCKrdYFSav17sIrQ== + dependencies: + uint8arrays "^2.1.3" + varint "^5.0.2" + +multihashes@3.1.2, multihashes@^3.0.1: + version "3.1.2" + resolved "https://registry.yarnpkg.com/multihashes/-/multihashes-3.1.2.tgz#ffa5e50497aceb7911f7b4a3b6cada9b9730edfc" + integrity sha512-AP4IoV/YzkNrfbQKZE3OMPibrmy350OmCd6cJkwyM8oExaXIlOY4UnOOVSQtAEuq/LR01XfXKCESidzZvSwHCQ== + dependencies: + multibase "^3.1.0" + uint8arrays "^2.0.5" + varint "^6.0.0" + multihashes@^0.4.15, multihashes@~0.4.15: version "0.4.21" resolved "https://registry.yarnpkg.com/multihashes/-/multihashes-0.4.21.tgz#dc02d525579f334a7909ade8a122dabb58ccfcb5" @@ -9625,6 +13879,27 @@ multihashes@^0.4.15, multihashes@~0.4.15: multibase "^0.7.0" varint "^5.0.0" +multihashes@^4.0.1, multihashes@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/multihashes/-/multihashes-4.0.2.tgz#d76aeac3a302a1bed9fe1ec964fb7a22fa662283" + integrity sha512-xpx++1iZr4ZQHjN1mcrXS6904R36LWLxX/CBifczjtmrtCXEX623DMWOF1eiNSg+pFpiZDFVBgou/4v6ayCHSQ== + dependencies: + multibase "^4.0.1" + uint8arrays "^2.1.3" + varint "^5.0.2" + +multihashing-async@^2.0.0, multihashing-async@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/multihashing-async/-/multihashing-async-2.1.2.tgz#9ed68f183bde70e0416b166bbc59a0c0623a0ede" + integrity sha512-FTPNnWWxwIK5dXXmTFhySSF8Fkdqf7vzqpV09+RWsmfUhrsL/b3Arg3+bRrBnXTtjxm3JRGI3wSAtQHL0QCxhQ== + dependencies: + blakejs "^1.1.0" + err-code "^3.0.0" + js-sha3 "^0.8.0" + multihashes "^4.0.1" + murmurhash3js-revisited "^3.0.0" + uint8arrays "^2.1.3" + multimatch@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/multimatch/-/multimatch-5.0.0.tgz#932b800963cea7a31a033328fa1e0c3a1874dbe6" @@ -9645,6 +13920,11 @@ murmur-128@^0.2.1: fmix "^0.1.0" imul "^1.0.0" +murmurhash3js-revisited@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/murmurhash3js-revisited/-/murmurhash3js-revisited-3.0.0.tgz#6bd36e25de8f73394222adc6e41fa3fac08a5869" + integrity sha512-/sF3ee6zvScXMb1XFJ8gDsSnY+X8PbOyjIuBhtgis10W2Jx4ZjIhikUCIF9c4gpJxVnQIsPAFrSwTCuAjicP6g== + mute-stream@0.0.8, mute-stream@~0.0.4: version "0.0.8" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" @@ -9655,7 +13935,7 @@ nan@2.13.2: resolved "https://registry.yarnpkg.com/nan/-/nan-2.13.2.tgz#f51dc7ae66ba7d5d55e1e6d4d8092e802c9aefe7" integrity sha512-TghvYc72wlMGMVMluVo9WRJc0mB8KxxF/gZ4YYFy7V2ZQX9l7rgbPg7vjS9mt6U5HXODVFVI2bOduCzwOMv/lw== -nan@^2.14.0: +nan@^2.12.1, nan@^2.13.2, nan@^2.14.0, nan@^2.14.2: version "2.14.2" resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.2.tgz#f5376400695168f4cc694ac9393d0c9585eeea19" integrity sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ== @@ -9670,6 +13950,16 @@ nanoid@3.1.20: resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.20.tgz#badc263c6b1dcf14b71efaa85f6ab4c1d6cfc788" integrity sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw== +nanoid@^2.0.0: + version "2.1.11" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-2.1.11.tgz#ec24b8a758d591561531b4176a01e3ab4f0f0280" + integrity sha512-s/snB+WGm6uwi0WjsZdaVcuf3KJXlfGl2LcxgwkEwJF0D/BWzVWAZW/XY4bFaiR7s0Jk3FPvlnepg1H1b1UwlA== + +nanoid@^3.1.12, nanoid@^3.1.3: + version "3.1.23" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.23.tgz#f744086ce7c2bc47ee0a8472574d5c78e4183a81" + integrity sha512-FiB0kzdP0FFVGDKlRLEQ1BgDzU87dy5NnzjeW9YZNt+/c3+q82EQDUwniSAUxp/F0gFNI1ZhKU1FqYsMuqZVnw== + nanomatch@^1.2.9: version "1.2.13" resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" @@ -9692,11 +13982,49 @@ napi-build-utils@^1.0.1: resolved "https://registry.yarnpkg.com/napi-build-utils/-/napi-build-utils-1.0.2.tgz#b1fddc0b2c46e380a0b7a76f984dd47c41a13806" integrity sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg== +napi-macros@~1.8.1: + version "1.8.2" + resolved "https://registry.yarnpkg.com/napi-macros/-/napi-macros-1.8.2.tgz#299265c1d8aa401351ad0675107d751228c03eda" + integrity sha512-Tr0DNY4RzTaBG2W2m3l7ZtFuJChTH6VZhXVhkGGjF/4cZTt+i8GcM9ozD+30Lmr4mDoZ5Xx34t2o4GJqYWDGcg== + napi-macros@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/napi-macros/-/napi-macros-2.0.0.tgz#2b6bae421e7b96eb687aa6c77a7858640670001b" integrity sha512-A0xLykHtARfueITVDernsAWdtIMbOJgKgcluwENp3AlsKN/PloyO10HtmoqnFAQAcxPkgZN7wdfPfEd0zNGxbg== +native-abort-controller@0.0.3, native-abort-controller@~0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/native-abort-controller/-/native-abort-controller-0.0.3.tgz#4c528a6c9c7d3eafefdc2c196ac9deb1a5edf2f8" + integrity sha512-YIxU5nWqSHG1Xbu3eOu3pdFRD882ivQpIcu6AiPVe2oSVoRbfYW63DVkZm3g1gHiMtZSvZzF6THSzTGEBYl8YA== + dependencies: + globalthis "^1.0.1" + +native-abort-controller@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/native-abort-controller/-/native-abort-controller-1.0.3.tgz#35974a2e189c0d91399c8767a989a5bf058c1435" + integrity sha512-fd5LY5q06mHKZPD5FmMrn7Lkd2H018oBGKNOAdLpctBDEPFKsfJ1nX9ke+XRa8PEJJpjqrpQkGjq2IZ27QNmYA== + +native-fetch@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/native-fetch/-/native-fetch-2.0.1.tgz#319d53741a7040def92d5dc8ea5fe9416b1fad89" + integrity sha512-gv4Bea+ga9QdXINurpkEqun3ap3vnB+WYoe4c8ddqUYEH7B2h6iD39RF8uVN7OwmSfMY3RDxkvBnoI4e2/vLXQ== + dependencies: + globalthis "^1.0.1" + +native-fetch@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/native-fetch/-/native-fetch-3.0.0.tgz#06ccdd70e79e171c365c75117959cf4fe14a09bb" + integrity sha512-G3Z7vx0IFb/FQ4JxvtqGABsOTIqRWvgQz6e+erkB+JJD6LrszQtMozEHI4EkmgZQvnGHrpLVzUWk7t4sJCIkVw== + +needle@^2.2.1: + version "2.6.0" + resolved "https://registry.yarnpkg.com/needle/-/needle-2.6.0.tgz#24dbb55f2509e2324b4a99d61f413982013ccdbe" + integrity sha512-KKYdza4heMsEfSWD7VPUIz3zX2XDwOyX2d+geb4vrERZMT5RMU6ujjaD+I5Yr54uZxQ2w6XRTAhHBbSCyovZBg== + 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" @@ -9728,6 +14056,21 @@ nise@^4.0.4: just-extend "^4.0.2" path-to-regexp "^1.7.0" +no-case@^2.2.0, no-case@^2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/no-case/-/no-case-2.3.2.tgz#60b813396be39b3f1288a4c1ed5d1e7d28b464ac" + integrity sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ== + dependencies: + lower-case "^1.1.1" + +no-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" + integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== + dependencies: + lower-case "^2.0.2" + tslib "^2.0.3" + node-abi@^2.18.0, node-abi@^2.21.0, node-abi@^2.7.0: version "2.21.0" resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-2.21.0.tgz#c2dc9ebad6f4f53d6ea9b531e7b8faad81041d48" @@ -9773,7 +14116,17 @@ node-fetch@2.1.2: resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.1.2.tgz#ab884e8e7e57e38a944753cec706f788d1768bb5" integrity sha1-q4hOjn5X44qUR1POxwb3iNF2i7U= -node-fetch@^2.3.0, node-fetch@^2.6.0, node-fetch@^2.6.1: +node-fetch@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.4.1.tgz#b2e38f1117b8acbedbe0524f041fb3177188255d" + integrity sha512-P9UbpFK87NyqBZzUuDBDz4f6Yiys8xm8j7ACDbi6usvFm6KItklQUKjeoqTrYS/S1k6I8oaOC2YLLDr/gg26Mw== + +node-fetch@2.6.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.0.tgz#e633456386d4aa55863f676a7ab0daa8fdecb0fd" + integrity sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA== + +node-fetch@2.6.1, node-fetch@^2.3.0, node-fetch@^2.6.0, node-fetch@^2.6.1: version "2.6.1" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== @@ -9796,6 +14149,11 @@ node-gyp-build@^4.2.0: resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.2.3.tgz#ce6277f853835f718829efb47db20f3e4d9c4739" integrity sha512-MN6ZpzmfNCRM+3t57PTJHgHyw/h4OWnZ6mR8P5j/uZtqQr46RRuDE/P+g3n0YR/AiYXeWixZZzaip77gdICfRg== +node-gyp-build@~3.8.0: + version "3.8.0" + resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-3.8.0.tgz#0f57efeb1971f404dfcbfab975c284de7c70f14a" + integrity sha512-bYbpIHyRqZ7sVWXxGpz8QIRug5JZc/hzZH4GbdT9HTZi6WmKCZ8GLvP8OZ9TTiIBvwPFKgtGrlWQSXDAvYdsPw== + node-gyp-build@~4.1.0: version "4.1.1" resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.1.1.tgz#d7270b5d86717068d114cc57fff352f96d745feb" @@ -9853,6 +14211,44 @@ node-hid@2.1.1: node-addon-api "^3.0.2" prebuild-install "^6.0.0" +node-int64@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" + integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs= + +node-interval-tree@^1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/node-interval-tree/-/node-interval-tree-1.3.3.tgz#15ffb904cde08270214acace8dc7653e89ae32b7" + integrity sha512-K9vk96HdTK5fEipJwxSvIIqwTqr4e3HRJeJrNxBSeVMNSC/JWARRaX7etOLOuTmrRMeOI/K5TCJu3aWIwZiNTw== + dependencies: + shallowequal "^1.0.2" + +node-pre-gyp@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.11.0.tgz#db1f33215272f692cd38f03238e3e9b47c5dd054" + integrity sha512-TwWAOZb0j7e9eGaf9esRx3ZcLaE5tQ2lvYy1pb5IAaG1a2e2Kv5Lms1Y4hpj+ciXJRofIxxlt5haeQ/2ANeE0Q== + 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" + +node-releases@^1.1.71: + version "1.1.71" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.71.tgz#cb1334b179896b1c89ecfdd4b725fb7bbdfc7dbb" + integrity sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg== + +nofilter@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/nofilter/-/nofilter-1.0.4.tgz#78d6f4b6a613e7ced8b015cec534625f7667006e" + integrity sha512-N8lidFp+fCz+TD51+haYdbDGrcBWwuHX40F5+z0qkUjMJ5Tp+rdSuAkMJ9N9eoolDlEVTf6u5icM+cNKkKW2mA== + noms@0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/noms/-/noms-0.0.0.tgz#da8ebd9f3af9d6760919b27d9cdc8092a7332859" @@ -9861,6 +14257,11 @@ noms@0.0.0: inherits "^2.0.1" readable-stream "~1.0.31" +noop-fn@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/noop-fn/-/noop-fn-1.0.0.tgz#5f33d47f13d2150df93e0cb036699e982f78ffbf" + integrity sha1-XzPUfxPSFQ35PgywNmmemC94/78= + noop-logger@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/noop-logger/-/noop-logger-0.1.1.tgz#94a2b1633c4f1317553007d8966fd0e841b6a4c2" @@ -9908,6 +14309,13 @@ normalize-package-data@^3.0.0: semver "^7.3.4" validate-npm-package-license "^3.0.1" +normalize-path@^2.0.1, normalize-path@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= + dependencies: + remove-trailing-separator "^1.0.1" + normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" @@ -9923,6 +14331,13 @@ normalize-url@^4.1.0: resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.0.tgz#453354087e6ca96957bd8f5baf753f5982142129" integrity sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ== +npm-bundled@^1.0.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.1.2.tgz#944c78789bd739035b70baa2ca5cc32b8d860bc1" + integrity sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ== + dependencies: + npm-normalize-package-bin "^1.0.1" + npm-bundled@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.1.1.tgz#1edd570865a94cdb1bc8220775e29466c9fb234b" @@ -9965,6 +14380,15 @@ npm-package-arg@^8.0.0, npm-package-arg@^8.0.1, npm-package-arg@^8.1.0, npm-pack semver "^7.3.4" validate-npm-package-name "^3.0.0" +npm-packlist@^1.1.6: + version "1.4.8" + resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.8.tgz#56ee6cc135b9f98ad3d51c1c95da22bbb9b2ef3e" + integrity sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A== + dependencies: + ignore-walk "^3.0.1" + npm-bundled "^1.0.1" + npm-normalize-package-bin "^1.0.1" + npm-packlist@^2.1.4: version "2.1.5" resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-2.1.5.tgz#43ef5bbb9f59b7c0ef91e0905f1dd707b4cfb33c" @@ -10013,7 +14437,7 @@ npm-run-path@^4.0.1: dependencies: path-key "^3.0.0" -npmlog@^4.0.1, npmlog@^4.1.2: +npmlog@^4.0.1, npmlog@^4.0.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== @@ -10023,6 +14447,18 @@ npmlog@^4.0.1, npmlog@^4.1.2: gauge "~2.7.3" set-blocking "~2.0.0" +nth-check@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c" + integrity sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg== + dependencies: + boolbase "~1.0.0" + +nullthrows@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/nullthrows/-/nullthrows-1.1.1.tgz#7818258843856ae971eae4208ad7d7eb19a431b1" + integrity sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw== + number-is-nan@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" @@ -10036,11 +14472,21 @@ number-to-bn@1.7.0: bn.js "4.11.6" strip-hex-prefix "1.0.0" +"nwmatcher@>= 1.3.7 < 2.0.0": + version "1.4.4" + resolved "https://registry.yarnpkg.com/nwmatcher/-/nwmatcher-1.4.4.tgz#2285631f34a95f0d0395cd900c96ed39b58f346e" + integrity sha512-3iuY4N5dhgMpCUrOVnuAdGrgxVqV2cJpM+XNccjR2DKOB1RUP0aA+wGXEiNziG/UKboFyGBIoKOaNlJxx8bciQ== + oauth-sign@~0.9.0: version "0.9.0" resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== +object-assign@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.0.tgz#7a3b3d0e98063d43f4c03f2e8ae6cd51a86883a0" + integrity sha1-ejs9DpgGPUP0wD8uiubNUahog6A= + object-assign@^4, object-assign@^4.0.0, object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" @@ -10083,6 +14529,11 @@ object-keys@~0.4.0: resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-0.4.0.tgz#28a6aae7428dd2c3a92f3d95f21335dd204e0336" integrity sha1-KKaq50KN0sOpLz2V8hM13SBOAzY= +object-path@^0.11.4: + version "0.11.5" + resolved "https://registry.yarnpkg.com/object-path/-/object-path-0.11.5.tgz#d4e3cf19601a5140a55a16ad712019a9c50b577a" + integrity sha512-jgSbThcoR/s+XumvGMTMf81QVBmah+/Q7K7YduKeKVWL7N111unR2d6pZZarSk6kY/caeNxUDyxOvMWyzoU2eg== + object-visit@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" @@ -10100,7 +14551,7 @@ object.assign@4.1.0: has-symbols "^1.0.0" object-keys "^1.0.11" -object.assign@^4.1.2: +object.assign@^4.1.0, object.assign@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== @@ -10119,6 +14570,14 @@ object.getownpropertydescriptors@^2.0.3, object.getownpropertydescriptors@^2.1.1 define-properties "^1.1.3" es-abstract "^1.18.0-next.2" +object.omit@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" + integrity sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo= + dependencies: + for-own "^0.1.4" + is-extendable "^0.1.1" + object.pick@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" @@ -10138,6 +14597,13 @@ oboe@2.1.4: dependencies: http-https "^1.0.0" +oboe@2.1.5: + version "2.1.5" + resolved "https://registry.yarnpkg.com/oboe/-/oboe-2.1.5.tgz#5554284c543a2266d7a38f17e073821fbde393cd" + integrity sha1-VVQoTFQ6ImbXo48X4HOCH73jk80= + dependencies: + http-https "^1.0.0" + "old-contracts@npm:@eth-optimism/contracts@^0.0.2-alpha.7": version "0.0.2-alpha.15" resolved "https://registry.yarnpkg.com/@eth-optimism/contracts/-/contracts-0.0.2-alpha.15.tgz#d602bdb6f1186d111ce9f7c282fc80e023086892" @@ -10164,6 +14630,13 @@ once@1.x, once@^1.3.0, once@^1.3.1, once@^1.4.0: dependencies: wrappy "1" +onetime@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" + integrity sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ= + dependencies: + mimic-fn "^1.0.0" + onetime@^5.1.0, onetime@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" @@ -10179,6 +14652,19 @@ open@^7.4.2: is-docker "^2.0.0" is-wsl "^2.1.1" +opencollective-postinstall@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz#7a0fff978f6dbfa4d006238fbac98ed4198c3259" + integrity sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q== + +optimism@^0.15.0: + version "0.15.0" + resolved "https://registry.yarnpkg.com/optimism/-/optimism-0.15.0.tgz#c65e694bec7ce439f41e9cb8fc261a72d798125b" + integrity sha512-KLKl3Kb7hH++s9ewRcBhmfpXgXF0xQ+JZ3xQFuPjnoT6ib2TDmYyVkKENmGxivsN2G3VRxpXuauCkB4GYOhtPw== + dependencies: + "@wry/context" "^0.6.0" + "@wry/trie" "^0.3.0" + optionator@^0.8.1: version "0.8.3" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" @@ -10191,6 +14677,31 @@ optionator@^0.8.1: type-check "~0.3.2" word-wrap "~1.2.3" +ora@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/ora/-/ora-3.4.0.tgz#bf0752491059a3ef3ed4c85097531de9fdbcd318" + integrity sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg== + dependencies: + chalk "^2.4.2" + cli-cursor "^2.1.0" + cli-spinners "^2.0.0" + log-symbols "^2.2.0" + strip-ansi "^5.2.0" + wcwidth "^1.0.1" + +ordered-read-streams@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/ordered-read-streams/-/ordered-read-streams-0.3.0.tgz#7137e69b3298bb342247a1bbee3881c80e2fd78b" + integrity sha1-cTfmmzKYuzQiR6G77jiByA4v14s= + dependencies: + is-stream "^1.0.1" + 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" @@ -10245,6 +14756,19 @@ p-defer@^1.0.0: resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" integrity sha1-n26xgvbJqozXQwBKfU+WsZaw+ww= +p-defer@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-3.0.0.tgz#d1dceb4ee9b2b604b1d94ffec83760175d4e6f83" + integrity sha512-ugZxsxmtTln604yeYd29EGrNhazN2lywetzpKhfmQjW/VJmhpDmWbiX+h0zL8V91R0UXkhb3KtPmyq9PZw3aYw== + +p-fifo@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-fifo/-/p-fifo-1.0.0.tgz#e29d5cf17c239ba87f51dde98c1d26a9cfe20a63" + integrity sha512-IjoCxXW48tqdtDFz6fqo5q1UfFVjjVZe8TC1QRflvNUJtNfCUhxOUw6MOVZhDPjqhSzc26xKdugsO17gmzd5+A== + dependencies: + fast-fifo "^1.0.0" + p-defer "^3.0.0" + p-filter@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/p-filter/-/p-filter-2.1.0.tgz#1b1472562ae7a0f742f0f3d3d3718ea66ff9c09c" @@ -10262,6 +14786,13 @@ p-is-promise@^2.0.0: resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-2.1.0.tgz#918cebaea248a62cf7ffab8e3bca8c5f882fc42e" integrity sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg== +p-limit@3.1.0, p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + p-limit@^1.1.0: version "1.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" @@ -10276,13 +14807,6 @@ p-limit@^2.0.0, p-limit@^2.2.0: dependencies: p-try "^2.0.0" -p-limit@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" - integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== - dependencies: - yocto-queue "^0.1.0" - p-locate@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" @@ -10402,6 +14926,20 @@ pacote@^11.2.6: ssri "^8.0.1" tar "^6.1.0" +param-case@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/param-case/-/param-case-2.1.1.tgz#df94fd8cf6531ecf75e6bef9a0858fbc72be2247" + integrity sha1-35T9jPZTHs915r75oIWPvHK+Ikc= + dependencies: + no-case "^2.2.0" + +paramap-it@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/paramap-it/-/paramap-it-0.1.1.tgz#dad5963c003315c0993b84402a9c08f8c36e80d9" + integrity sha512-3uZmCAN3xCw7Am/4ikGzjjR59aNMJVXGSU7CjG2Z6DfOAdhnLdCOd0S0m1sTkN4ov9QhlE3/jkzyu953hq0uwQ== + dependencies: + event-iterator "^1.0.0" + parent-module@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" @@ -10425,11 +14963,26 @@ parse-cache-control@^1.0.1: resolved "https://registry.yarnpkg.com/parse-cache-control/-/parse-cache-control-1.0.1.tgz#8eeab3e54fa56920fe16ba38f77fa21aacc2d74e" integrity sha1-juqz5U+laSD+Fro493+iGqzC104= +parse-duration@^0.4.4: + version "0.4.4" + resolved "https://registry.yarnpkg.com/parse-duration/-/parse-duration-0.4.4.tgz#11c0f51a689e97d06c57bd772f7fda7dc013243c" + integrity sha512-KbAJuYGUhZkB9gotDiKLnZ7Z3VTacK3fgwmDdB6ZVDtJbMBT6MfLga0WJaYpPDu0mzqT0NgHtHDt5PY4l0nidg== + parse-github-repo-url@^1.3.0: version "1.4.1" resolved "https://registry.yarnpkg.com/parse-github-repo-url/-/parse-github-repo-url-1.4.1.tgz#9e7d8bb252a6cb6ba42595060b7bf6df3dbc1f50" integrity sha1-nn2LslKmy2ukJZUGC3v23z28H1A= +parse-glob@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" + integrity sha1-ssN2z7EfNVE7rdFz7wu246OIORw= + dependencies: + glob-base "^0.3.0" + is-dotfile "^1.0.0" + is-extglob "^1.0.0" + is-glob "^2.0.0" + parse-headers@^2.0.0: version "2.0.3" resolved "https://registry.yarnpkg.com/parse-headers/-/parse-headers-2.0.3.tgz#5e8e7512383d140ba02f0c7aa9f49b4399c92515" @@ -10480,11 +15033,39 @@ parse-url@^5.0.0: parse-path "^4.0.0" protocols "^1.4.0" -parseurl@~1.3.3: +parse5@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-1.5.1.tgz#9b7f3b0de32be78dc2401b17573ccaf0f6f59d94" + integrity sha1-m387DeMr543CQBsXVzzK8Pb1nZQ= + +parse5@^3.0.1: + version "3.0.3" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-3.0.3.tgz#042f792ffdd36851551cf4e9e066b3874ab45b5c" + integrity sha512-rgO9Zg5LLLkfJF9E6CCmXlSE4UVceloys8JrFqCcHloC3usd/kJCyPDwH2SOlzix2j3xaP9sUX3e8+kvkuleAA== + dependencies: + "@types/node" "*" + +parseurl@^1.3.2, parseurl@~1.3.3: version "1.3.3" resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== +pascal-case@^2.0.0, pascal-case@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pascal-case/-/pascal-case-2.0.1.tgz#2d578d3455f660da65eca18ef95b4e0de912761e" + integrity sha1-LVeNNFX2YNpl7KGO+VtODekSdh4= + dependencies: + camel-case "^3.0.0" + upper-case-first "^1.1.0" + +pascal-case@^3.1.1, pascal-case@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/pascal-case/-/pascal-case-3.1.2.tgz#b48e0ef2b98e205e7c1dae747d0b1508237660eb" + integrity sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + pascalcase@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" @@ -10532,6 +15113,18 @@ path-browserify@^1.0.0: resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-1.0.1.tgz#d98454a9c3753d5790860f16f68867b9e46be1fd" integrity sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g== +path-case@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/path-case/-/path-case-2.1.1.tgz#94b8037c372d3fe2906e465bb45e25d226e8eea5" + integrity sha1-lLgDfDctP+KQbkZbtF4l0ibo7qU= + dependencies: + no-case "^2.2.0" + +path-dirname@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" + integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= + path-exists@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" @@ -10618,6 +15211,26 @@ pbkdf2@^3.0.17, pbkdf2@^3.0.3, pbkdf2@^3.0.9: safe-buffer "^5.0.1" sha.js "^2.4.8" +peer-id@^0.14.1: + version "0.14.8" + resolved "https://registry.yarnpkg.com/peer-id/-/peer-id-0.14.8.tgz#667c6bedc8ab313c81376f6aca0baa2140266fab" + integrity sha512-GpuLpob/9FrEFvyZrKKsISEkaBYsON2u0WtiawLHj1ii6ewkoeRiSDFLyIefYhw0jGvQoeoZS05jaT52X7Bvig== + dependencies: + cids "^1.1.5" + class-is "^1.1.0" + libp2p-crypto "^0.19.0" + minimist "^1.2.5" + multihashes "^4.0.2" + protobufjs "^6.10.2" + uint8arrays "^2.0.5" + +pem-jwk@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pem-jwk/-/pem-jwk-2.0.0.tgz#1c5bb264612fc391340907f5c1de60c06d22f085" + integrity sha512-rFxu7rVoHgQ5H9YsP50dDWf0rHjreVA2z0yPiWr5WdH/UHb29hKtF7h6l8vNd1cbYR1t0QL+JKhW55a2ZV4KtA== + dependencies: + asn1.js "^5.0.1" + performance-now@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" @@ -10712,6 +15325,16 @@ pino@^6.0.0, pino@^6.11.3: quick-format-unescaped "^4.0.3" sonic-boom "^1.0.2" +pkg-conf@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/pkg-conf/-/pkg-conf-1.1.3.tgz#378e56d6fd13e88bfb6f4a25df7a83faabddba5b" + integrity sha1-N45W1v0T6Iv7b0ol33qD+qvduls= + dependencies: + find-up "^1.0.0" + load-json-file "^1.1.0" + object-assign "^4.0.1" + symbol "^0.2.1" + pkg-dir@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" @@ -10719,6 +15342,11 @@ pkg-dir@^4.2.0: dependencies: find-up "^4.0.0" +pluralize@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-8.0.0.tgz#1a6fa16a38d12a1901e0320fa017051c539ce3b1" + integrity sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA== + posix-character-classes@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" @@ -10729,6 +15357,278 @@ postinstall-postinstall@^2.1.0: resolved "https://registry.yarnpkg.com/postinstall-postinstall/-/postinstall-postinstall-2.1.0.tgz#4f7f77441ef539d1512c40bd04c71b06a4704ca3" integrity sha512-7hQX6ZlZXIoRiWNrbMQaLzUUfH+sSx39u8EJ9HYuDc1kLo9IXKWjM5RSquZN1ad5GnH8CGFM78fsAAQi3OKEEQ== +pouchdb-abstract-mapreduce@7.2.2: + version "7.2.2" + resolved "https://registry.yarnpkg.com/pouchdb-abstract-mapreduce/-/pouchdb-abstract-mapreduce-7.2.2.tgz#dd1b10a83f8d24361dce9aaaab054614b39f766f" + integrity sha512-7HWN/2yV2JkwMnGnlp84lGvFtnm0Q55NiBUdbBcaT810+clCGKvhssBCrXnmwShD1SXTwT83aszsgiSfW+SnBA== + dependencies: + pouchdb-binary-utils "7.2.2" + pouchdb-collate "7.2.2" + pouchdb-collections "7.2.2" + pouchdb-errors "7.2.2" + pouchdb-fetch "7.2.2" + pouchdb-mapreduce-utils "7.2.2" + pouchdb-md5 "7.2.2" + pouchdb-utils "7.2.2" + +pouchdb-adapter-leveldb-core@7.2.2: + version "7.2.2" + resolved "https://registry.yarnpkg.com/pouchdb-adapter-leveldb-core/-/pouchdb-adapter-leveldb-core-7.2.2.tgz#e0aa6a476e2607d7ae89f4a803c9fba6e6d05a8a" + integrity sha512-K9UGf1Ivwe87mjrMqN+1D07tO/DfU7ariVDrGffuOjvl+3BcvUF25IWrxsBObd4iPOYCH7NVQWRpojhBgxULtQ== + dependencies: + argsarray "0.0.1" + buffer-from "1.1.1" + double-ended-queue "2.1.0-0" + levelup "4.4.0" + pouchdb-adapter-utils "7.2.2" + pouchdb-binary-utils "7.2.2" + pouchdb-collections "7.2.2" + pouchdb-errors "7.2.2" + pouchdb-json "7.2.2" + pouchdb-md5 "7.2.2" + pouchdb-merge "7.2.2" + pouchdb-utils "7.2.2" + sublevel-pouchdb "7.2.2" + through2 "3.0.2" + +pouchdb-adapter-memory@^7.1.1: + version "7.2.2" + resolved "https://registry.yarnpkg.com/pouchdb-adapter-memory/-/pouchdb-adapter-memory-7.2.2.tgz#c0ec2e87928d516ca9d1b5badc7269df6f95e5ea" + integrity sha512-9o+zdItPEq7rIrxdkUxgsLNaZkDJAGEqqoYgeYdrHidOCZnlhxhX3g7/R/HcpDKC513iEPqJWDJQSfeT6nVKkw== + dependencies: + memdown "1.4.1" + pouchdb-adapter-leveldb-core "7.2.2" + pouchdb-utils "7.2.2" + +pouchdb-adapter-node-websql@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/pouchdb-adapter-node-websql/-/pouchdb-adapter-node-websql-7.0.0.tgz#64ad88dd45b23578e454bf3032a3a79f9d1e4008" + integrity sha512-fNaOMO8bvMrRTSfmH4RSLSpgnKahRcCA7Z0jg732PwRbGvvMdGbreZwvKPPD1fg2tm2ZwwiXWK2G3+oXyoqZYw== + dependencies: + pouchdb-adapter-websql-core "7.0.0" + pouchdb-utils "7.0.0" + websql "1.0.0" + +pouchdb-adapter-utils@7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/pouchdb-adapter-utils/-/pouchdb-adapter-utils-7.0.0.tgz#1ac8d34481911e0e9a9bf51024610a2e7351dc80" + integrity sha512-UWKPC6jkz6mHUzZefrU7P5X8ZGvBC8LSNZ7BIp0hWvJE6c20cnpDwedTVDpZORcCbVJpDmFOHBYnOqEIblPtbA== + dependencies: + pouchdb-binary-utils "7.0.0" + pouchdb-collections "7.0.0" + pouchdb-errors "7.0.0" + pouchdb-md5 "7.0.0" + pouchdb-merge "7.0.0" + pouchdb-utils "7.0.0" + +pouchdb-adapter-utils@7.2.2: + version "7.2.2" + resolved "https://registry.yarnpkg.com/pouchdb-adapter-utils/-/pouchdb-adapter-utils-7.2.2.tgz#c64426447d9044ba31517a18500d6d2d28abd47d" + integrity sha512-2CzZkTyTyHZkr3ePiWFMTiD5+56lnembMjaTl8ohwegM0+hYhRyJux0biAZafVxgIL4gnCUC4w2xf6WVztzKdg== + dependencies: + pouchdb-binary-utils "7.2.2" + pouchdb-collections "7.2.2" + pouchdb-errors "7.2.2" + pouchdb-md5 "7.2.2" + pouchdb-merge "7.2.2" + pouchdb-utils "7.2.2" + +pouchdb-adapter-websql-core@7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/pouchdb-adapter-websql-core/-/pouchdb-adapter-websql-core-7.0.0.tgz#27b3e404159538e515b2567baa7869f90caac16c" + integrity sha512-NyMaH0bl20SdJdOCzd+fwXo8JZ15a48/MAwMcIbXzsRHE4DjFNlRcWAcjUP6uN4Ezc+Gx+r2tkBBMf71mIz1Aw== + dependencies: + pouchdb-adapter-utils "7.0.0" + pouchdb-binary-utils "7.0.0" + pouchdb-collections "7.0.0" + pouchdb-errors "7.0.0" + pouchdb-json "7.0.0" + pouchdb-merge "7.0.0" + pouchdb-utils "7.0.0" + +pouchdb-binary-utils@7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/pouchdb-binary-utils/-/pouchdb-binary-utils-7.0.0.tgz#cb71a288b09572a231f6bab1b4aed201c4d219a7" + integrity sha512-yUktdOPIPvOVouCjJN3uop+bCcpdPwePrLm9eUAZNgEYnUFu0njdx7Q0WRsZ7UJ6l75HinL5ZHk4bnvEt86FLw== + dependencies: + buffer-from "1.1.0" + +pouchdb-binary-utils@7.2.2: + version "7.2.2" + resolved "https://registry.yarnpkg.com/pouchdb-binary-utils/-/pouchdb-binary-utils-7.2.2.tgz#0690b348052c543b1e67f032f47092ca82bcb10e" + integrity sha512-shacxlmyHbUrNfE6FGYpfyAJx7Q0m91lDdEAaPoKZM3SzAmbtB1i+OaDNtYFztXjJl16yeudkDb3xOeokVL3Qw== + dependencies: + buffer-from "1.1.1" + +pouchdb-collate@7.2.2: + version "7.2.2" + resolved "https://registry.yarnpkg.com/pouchdb-collate/-/pouchdb-collate-7.2.2.tgz#fc261f5ef837c437e3445fb0abc3f125d982c37c" + integrity sha512-/SMY9GGasslknivWlCVwXMRMnQ8myKHs4WryQ5535nq1Wj/ehpqWloMwxEQGvZE1Sda3LOm7/5HwLTcB8Our+w== + +pouchdb-collections@7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/pouchdb-collections/-/pouchdb-collections-7.0.0.tgz#fd1f632337dc6301b0ff8649732ca79204e41780" + integrity sha512-DaoUr/vU24Q3gM6ghj0va9j/oBanPwkbhkvnqSyC3Dm5dgf5pculNxueLF9PKMo3ycApoWzHMh6N2N8KJbDU2Q== + +pouchdb-collections@7.2.2: + version "7.2.2" + resolved "https://registry.yarnpkg.com/pouchdb-collections/-/pouchdb-collections-7.2.2.tgz#aeed77f33322429e3f59d59ea233b48ff0e68572" + integrity sha512-6O9zyAYlp3UdtfneiMYuOCWdUCQNo2bgdjvNsMSacQX+3g8WvIoFQCYJjZZCpTttQGb+MHeRMr8m2U95lhJTew== + +pouchdb-debug@^7.1.1: + version "7.2.1" + resolved "https://registry.yarnpkg.com/pouchdb-debug/-/pouchdb-debug-7.2.1.tgz#f5f869f6113c12ccb97cddf5b0a32b6e0e67e961" + integrity sha512-eP3ht/AKavLF2RjTzBM6S9gaI2/apcW6xvaKRQhEdOfiANqerFuksFqHCal3aikVQuDO+cB/cw+a4RyJn/glBw== + dependencies: + debug "3.1.0" + +pouchdb-errors@7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/pouchdb-errors/-/pouchdb-errors-7.0.0.tgz#4e2a5a8b82af20cbe5f9970ca90b7ec74563caa0" + integrity sha512-dTusY8nnTw4HIztCrNl7AoGgwvS1bVf/3/97hDaGc4ytn72V9/4dK8kTqlimi3UpaurohYRnqac0SGXYP8vgXA== + dependencies: + inherits "2.0.3" + +pouchdb-errors@7.2.2: + version "7.2.2" + resolved "https://registry.yarnpkg.com/pouchdb-errors/-/pouchdb-errors-7.2.2.tgz#80d811d65c766c9d20b755c6e6cc123f8c3c4792" + integrity sha512-6GQsiWc+7uPfgEHeavG+7wuzH3JZW29Dnrvz8eVbDFE50kVFxNDVm3EkYHskvo5isG7/IkOx7PV7RPTA3keG3g== + dependencies: + inherits "2.0.4" + +pouchdb-fetch@7.2.2: + version "7.2.2" + resolved "https://registry.yarnpkg.com/pouchdb-fetch/-/pouchdb-fetch-7.2.2.tgz#492791236d60c899d7e9973f9aca0d7b9cc02230" + integrity sha512-lUHmaG6U3zjdMkh8Vob9GvEiRGwJfXKE02aZfjiVQgew+9SLkuOxNw3y2q4d1B6mBd273y1k2Lm0IAziRNxQnA== + dependencies: + abort-controller "3.0.0" + fetch-cookie "0.10.1" + node-fetch "2.6.0" + +pouchdb-find@^7.0.0: + version "7.2.2" + resolved "https://registry.yarnpkg.com/pouchdb-find/-/pouchdb-find-7.2.2.tgz#1227afdd761812d508fe0794b3e904518a721089" + integrity sha512-BmFeFVQ0kHmDehvJxNZl9OmIztCjPlZlVSdpijuFbk/Fi1EFPU1BAv3kLC+6DhZuOqU/BCoaUBY9sn66pPY2ag== + dependencies: + pouchdb-abstract-mapreduce "7.2.2" + pouchdb-collate "7.2.2" + pouchdb-errors "7.2.2" + pouchdb-fetch "7.2.2" + pouchdb-md5 "7.2.2" + pouchdb-selector-core "7.2.2" + pouchdb-utils "7.2.2" + +pouchdb-json@7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/pouchdb-json/-/pouchdb-json-7.0.0.tgz#d9860f66f27a359ac6e4b24da4f89b6909f37530" + integrity sha512-w0bNRu/7VmmCrFWMYAm62n30wvJJUT2SokyzeTyj3hRohj4GFwTRg1mSZ+iAmxgRKOFE8nzZstLG/WAB4Ymjew== + dependencies: + vuvuzela "1.0.3" + +pouchdb-json@7.2.2: + version "7.2.2" + resolved "https://registry.yarnpkg.com/pouchdb-json/-/pouchdb-json-7.2.2.tgz#b939be24b91a7322e9a24b8880a6e21514ec5e1f" + integrity sha512-3b2S2ynN+aoB7aCNyDZc/4c0IAdx/ir3nsHB+/RrKE9cM3QkQYbnnE3r/RvOD1Xvr6ji/KOCBie+Pz/6sxoaug== + dependencies: + vuvuzela "1.0.3" + +pouchdb-mapreduce-utils@7.2.2: + version "7.2.2" + resolved "https://registry.yarnpkg.com/pouchdb-mapreduce-utils/-/pouchdb-mapreduce-utils-7.2.2.tgz#13a46a3cc2a3f3b8e24861da26966904f2963146" + integrity sha512-rAllb73hIkU8rU2LJNbzlcj91KuulpwQu804/F6xF3fhZKC/4JQMClahk+N/+VATkpmLxp1zWmvmgdlwVU4HtQ== + dependencies: + argsarray "0.0.1" + inherits "2.0.4" + pouchdb-collections "7.2.2" + pouchdb-utils "7.2.2" + +pouchdb-md5@7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/pouchdb-md5/-/pouchdb-md5-7.0.0.tgz#935dc6bb507a5f3978fb653ca5790331bae67c96" + integrity sha512-yaSJKhLA3QlgloKUQeb2hLdT3KmUmPfoYdryfwHZuPTpXIRKTnMQTR9qCIRUszc0ruBpDe53DRslCgNUhAyTNQ== + dependencies: + pouchdb-binary-utils "7.0.0" + spark-md5 "3.0.0" + +pouchdb-md5@7.2.2: + version "7.2.2" + resolved "https://registry.yarnpkg.com/pouchdb-md5/-/pouchdb-md5-7.2.2.tgz#415401acc5a844112d765bd1fb4e5d9f38fb0838" + integrity sha512-c/RvLp2oSh8PLAWU5vFBnp6ejJABIdKqboZwRRUrWcfGDf+oyX8RgmJFlYlzMMOh4XQLUT1IoaDV8cwlsuryZw== + dependencies: + pouchdb-binary-utils "7.2.2" + spark-md5 "3.0.1" + +pouchdb-merge@7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/pouchdb-merge/-/pouchdb-merge-7.0.0.tgz#9f476ce7e32aae56904ad770ae8a1dfe14b57547" + integrity sha512-tci5u6NpznQhGcPv4ho1h0miky9rs+ds/T9zQ9meQeDZbUojXNaX1Jxsb0uYEQQ+HMqdcQs3Akdl0/u0mgwPGg== + +pouchdb-merge@7.2.2: + version "7.2.2" + resolved "https://registry.yarnpkg.com/pouchdb-merge/-/pouchdb-merge-7.2.2.tgz#940d85a2b532d6a93a6cab4b250f5648511bcc16" + integrity sha512-6yzKJfjIchBaS7Tusuk8280WJdESzFfQ0sb4jeMUNnrqs4Cx3b0DIEOYTRRD9EJDM+je7D3AZZ4AT0tFw8gb4A== + +pouchdb-selector-core@7.2.2: + version "7.2.2" + resolved "https://registry.yarnpkg.com/pouchdb-selector-core/-/pouchdb-selector-core-7.2.2.tgz#264d7436a8c8ac3801f39960e79875ef7f3879a0" + integrity sha512-XYKCNv9oiNmSXV5+CgR9pkEkTFqxQGWplnVhO3W9P154H08lU0ZoNH02+uf+NjZ2kjse7Q1fxV4r401LEcGMMg== + dependencies: + pouchdb-collate "7.2.2" + pouchdb-utils "7.2.2" + +pouchdb-utils@7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/pouchdb-utils/-/pouchdb-utils-7.0.0.tgz#48bfced6665b8f5a2b2d2317e2aa57635ed1e88e" + integrity sha512-1bnoX1KdZYHv9wicDIFdO0PLiVIMzNDUBUZ/yOJZ+6LW6niQCB8aCv09ZztmKfSQcU5nnN3fe656tScBgP6dOQ== + dependencies: + argsarray "0.0.1" + clone-buffer "1.0.0" + immediate "3.0.6" + inherits "2.0.3" + pouchdb-collections "7.0.0" + pouchdb-errors "7.0.0" + pouchdb-md5 "7.0.0" + uuid "3.2.1" + +pouchdb-utils@7.2.2: + version "7.2.2" + resolved "https://registry.yarnpkg.com/pouchdb-utils/-/pouchdb-utils-7.2.2.tgz#c17c4788f1d052b0daf4ef8797bbc4aaa3945aa4" + integrity sha512-XmeM5ioB4KCfyB2MGZXu1Bb2xkElNwF1qG+zVFbQsKQij0zvepdOUfGuWvLRHxTOmt4muIuSOmWZObZa3NOgzQ== + dependencies: + argsarray "0.0.1" + clone-buffer "1.0.0" + immediate "3.3.0" + inherits "2.0.4" + pouchdb-collections "7.2.2" + pouchdb-errors "7.2.2" + pouchdb-md5 "7.2.2" + uuid "8.1.0" + +pouchdb@7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/pouchdb/-/pouchdb-7.1.1.tgz#f5f8dcd1fc440fb76651cb26f6fc5d97a39cd6ce" + integrity sha512-8bXWclixNJZqokvxGHRsG19zehSJiaZaz4dVYlhXhhUctz7gMcNTElHjPBzBdZlKKvt9aFDndmXN1VVE53Co8g== + dependencies: + argsarray "0.0.1" + buffer-from "1.1.0" + clone-buffer "1.0.0" + double-ended-queue "2.1.0-0" + fetch-cookie "0.7.0" + immediate "3.0.6" + inherits "2.0.3" + level "5.0.1" + level-codec "9.0.1" + level-write-stream "1.0.0" + leveldown "5.0.2" + levelup "4.0.2" + ltgt "2.2.1" + node-fetch "2.4.1" + readable-stream "1.0.33" + spark-md5 "3.0.0" + through2 "3.0.1" + uuid "3.2.1" + vuvuzela "1.0.3" + prebuild-install@^5.3.3, prebuild-install@^5.3.4: version "5.3.6" resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-5.3.6.tgz#7c225568d864c71d89d07f8796042733a3f54291" @@ -10800,6 +15700,11 @@ prepend-http@^2.0.0: resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc= +preserve@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" + integrity sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks= + prettier@^1.14.2, prettier@^1.19.1: version "1.19.1" resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.19.1.tgz#f7d7f5ff8a9cd872a7be4ca142095956a60797cb" @@ -10820,6 +15725,11 @@ private@^0.1.6, private@^0.1.8: resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg== +process-nextick-args@~1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" + integrity sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M= + process-nextick-args@~2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" @@ -10858,6 +15768,24 @@ promise-to-callback@^1.0.0: is-fn "^1.0.0" set-immediate-shim "^1.0.1" +promise.allsettled@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/promise.allsettled/-/promise.allsettled-1.0.2.tgz#d66f78fbb600e83e863d893e98b3d4376a9c47c9" + integrity sha512-UpcYW5S1RaNKT6pd+s9jp9K9rlQge1UXKskec0j6Mmuq7UJCvlS2J2/s/yuPN8ehftf9HXMxWlKiPbGGUzpoRg== + dependencies: + array.prototype.map "^1.0.1" + define-properties "^1.1.3" + es-abstract "^1.17.0-next.1" + function-bind "^1.1.1" + iterate-value "^1.0.0" + +promise@^7.1.1: + version "7.3.1" + resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" + integrity sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg== + dependencies: + asap "~2.0.3" + promise@^8.0.0, promise@^8.0.2: version "8.1.0" resolved "https://registry.yarnpkg.com/promise/-/promise-8.1.0.tgz#697c25c3dfe7435dd79fcd58c38a135888eaf05e" @@ -10872,16 +15800,59 @@ promzard@^0.3.0: dependencies: read "1" +prop-types@^15.7.2: + version "15.7.2" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" + integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.8.1" + proto-list@~1.2.1: version "1.2.4" resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" integrity sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk= +protobufjs@^6.10.2: + version "6.11.2" + resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-6.11.2.tgz#de39fabd4ed32beaa08e9bb1e30d08544c1edf8b" + integrity sha512-4BQJoPooKJl2G9j3XftkIXjoC9C0Av2NOrWmbLWT1vH32GcSUHjM0Arra6UfTsVyfMAuFzaLucXn1sadxJydAw== + dependencies: + "@protobufjs/aspromise" "^1.1.2" + "@protobufjs/base64" "^1.1.2" + "@protobufjs/codegen" "^2.0.4" + "@protobufjs/eventemitter" "^1.1.0" + "@protobufjs/fetch" "^1.1.0" + "@protobufjs/float" "^1.0.2" + "@protobufjs/inquire" "^1.1.0" + "@protobufjs/path" "^1.1.2" + "@protobufjs/pool" "^1.1.0" + "@protobufjs/utf8" "^1.1.0" + "@types/long" "^4.0.1" + "@types/node" ">=13.7.0" + long "^4.0.0" + +protocol-buffers-schema@^3.3.1: + version "3.5.1" + resolved "https://registry.yarnpkg.com/protocol-buffers-schema/-/protocol-buffers-schema-3.5.1.tgz#8388e768d383ac8cbea23e1280dfadb79f4122ad" + integrity sha512-YVCvdhxWNDP8/nJDyXLuM+UFsuPk4+1PB7WGPVDzm3HTHbzFLxQYeW2iZpS4mmnXrQJGBzt230t/BbEb7PrQaw== + protocols@^1.1.0, protocols@^1.4.0: version "1.4.8" resolved "https://registry.yarnpkg.com/protocols/-/protocols-1.4.8.tgz#48eea2d8f58d9644a4a32caae5d5db290a075ce8" integrity sha512-IgjKyaUSjsROSO8/D49Ab7hP8mJgTYcqApOqdPhLoPxAplXmkp+zRvsrSQjFn5by0rhm4VH0GAUELIPpx7B1yg== +protons@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/protons/-/protons-2.0.1.tgz#bfee5123c100001dcf56ab8f71b1b36f2e8289f1" + integrity sha512-FlmPorLEeCEDPu+uIn0Qardgiy5XqVA4IyNTz9wb9c0e2U7BEXdRcIbx64r09o4Abtf+4B7mkTtMbsIXMxZzKw== + dependencies: + protocol-buffers-schema "^3.3.1" + signed-varint "^2.0.1" + uint8arrays "^2.1.3" + varint "^5.0.0" + proxy-addr@~2.0.5: version "2.0.6" resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.6.tgz#fdc2336505447d3f2f2c638ed272caf614bbb2bf" @@ -10900,7 +15871,7 @@ pseudomap@^1.0.1, pseudomap@^1.0.2: resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= -psl@^1.1.28: +psl@^1.1.28, psl@^1.1.33: version "1.8.0" resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== @@ -10997,6 +15968,11 @@ punycode@^2.1.0, punycode@^2.1.1: resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== +pure-rand@^4.1.1: + version "4.1.2" + resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-4.1.2.tgz#cbad2a3e3ea6df0a8d80d8ba204779b5679a5205" + integrity sha512-uLzZpQWfroIqyFWmX/pl0OL2JHJdoU3dbh0dvZ25fChHFJJi56J5oQZhW6QgbT2Llwh1upki84LnTwlZvsungA== + q@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" @@ -11043,6 +16019,11 @@ querystring@0.2.0: resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= +querystring@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.1.tgz#40d77615bb09d16902a85c3e38aa8b5ed761c2dd" + integrity sha512-wkvS7mL/JMugcup3/rMitHmd9ecIGd2lhFhK9N3UUQ450h66d1r3Y9nvXzQAW1Lq+wyx61k/1pfKS5KuKiyEbg== + queue-microtask@^1.2.2: version "1.2.3" resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" @@ -11063,6 +16044,15 @@ random-bytes-seed@^1.0.3: resolved "https://registry.yarnpkg.com/random-bytes-seed/-/random-bytes-seed-1.0.3.tgz#126f1201dba2ec70cd0784f94a810396cad24a15" integrity sha512-O+eniMt8Sj2iAn2q1x5VEirS/XvbtwYcXNDbOAcRtGN+OhC48cmzS5ksf9qEHRVKC1I8A4qzjucNVElddofB0A== +randomatic@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-3.1.1.tgz#b776efc59375984e36c537b2f51a1f0aff0da1ed" + integrity sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw== + dependencies: + is-number "^4.0.0" + kind-of "^6.0.0" + math-random "^1.0.1" + randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.0.6, randombytes@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" @@ -11113,6 +16103,11 @@ rc@^1.2.7: minimist "^1.2.0" strip-json-comments "~2.0.1" +react-is@^16.7.0, react-is@^16.8.1: + version "16.13.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + read-cmd-shim@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/read-cmd-shim/-/read-cmd-shim-2.0.0.tgz#4a50a71d6f0965364938e9038476f7eede3928d9" @@ -11225,6 +16220,36 @@ read@1, read@~1.0.1: dependencies: mute-stream "~0.0.4" +readable-stream@1.0.33: + version "1.0.33" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.33.tgz#3a360dd66c1b1d7fd4705389860eda1d0f61126c" + integrity sha1-OjYN1mwbHX/UcFOJhg7aHQ9hEmw= + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + +readable-stream@1.1: + version "1.1.13" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.13.tgz#f6eef764f514c89e2b9e23146a75ba106756d23e" + integrity sha1-9u73ZPUUyJ4rniMUanW6EGdW0j4= + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + +readable-stream@1.1.14, readable-stream@^1.0.33: + version "1.1.14" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" + integrity sha1-fPTFTvZI44EwhMY23SB54WbAgdk= + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + "readable-stream@2 || 3", readable-stream@3, readable-stream@^3.0.0, readable-stream@^3.0.2, readable-stream@^3.0.6, readable-stream@^3.1.0, readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" @@ -11232,19 +16257,19 @@ read@1, read@~1.0.1: dependencies: inherits "^2.0.3" string_decoder "^1.1.1" - util-deprecate "^1.0.1" - -readable-stream@^1.0.33: - version "1.1.14" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" - integrity sha1-fPTFTvZI44EwhMY23SB54WbAgdk= + util-deprecate "^1.0.1" + +"readable-stream@>=1.0.33-1 <1.1.0-0", readable-stream@~1.0.15, readable-stream@~1.0.31: + version "1.0.34" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" + integrity sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw= dependencies: core-util-is "~1.0.0" inherits "~2.0.1" isarray "0.0.1" string_decoder "~0.10.x" -readable-stream@^2.0.0, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.2.2, readable-stream@^2.2.8, readable-stream@^2.2.9, readable-stream@^2.3.6, readable-stream@~2.3.6: +readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.4, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.2.2, readable-stream@^2.2.8, readable-stream@^2.2.9, readable-stream@^2.3.6, readable-stream@~2.3.6: version "2.3.7" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== @@ -11257,15 +16282,22 @@ readable-stream@^2.0.0, readable-stream@^2.0.5, readable-stream@^2.0.6, readable string_decoder "~1.1.1" util-deprecate "~1.0.1" -readable-stream@~1.0.15, readable-stream@~1.0.31: - version "1.0.34" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" - integrity sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw= +readable-stream@~0.0.2: + version "0.0.4" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-0.0.4.tgz#f32d76e3fb863344a548d79923007173665b3b8d" + integrity sha1-8y124/uGM0SlSNeZIwBxc2ZbO40= + +readable-stream@~2.0.0: + version "2.0.6" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.0.6.tgz#8f90341e68a53ccc928788dacfcd11b36eb9b78e" + integrity sha1-j5A0HmilPMySh4jaz80Rs265t44= dependencies: core-util-is "~1.0.0" inherits "~2.0.1" - isarray "0.0.1" + isarray "~1.0.0" + process-nextick-args "~1.0.6" string_decoder "~0.10.x" + util-deprecate "~1.0.1" readdir-scoped-modules@^1.0.0: version "1.1.0" @@ -11284,6 +16316,13 @@ readdirp@~3.2.0: dependencies: picomatch "^2.0.4" +readdirp@~3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.4.0.tgz#9fdccdf9e9155805449221ac645e8303ab5b9ada" + integrity sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ== + dependencies: + picomatch "^2.2.1" + readdirp@~3.5.0: version "3.5.0" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.5.0.tgz#9ba74c019b15d365278d2e91bb8c48d7b4d42c9e" @@ -11291,6 +16330,13 @@ readdirp@~3.5.0: dependencies: picomatch "^2.2.1" +receptacle@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/receptacle/-/receptacle-1.3.2.tgz#a7994c7efafc7a01d0e2041839dab6c4951360d2" + integrity sha512-HrsFvqZZheusncQRiEE7GatOAETrARKV/lnfYicIm8lbvp/JQOdADOfhjBd2DajvoszEyxSM6RlAAIZgEoeu/A== + dependencies: + ms "^2.1.1" + rechoir@^0.6.2: version "0.6.2" resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" @@ -11328,6 +16374,56 @@ redeyed@~2.1.0: dependencies: esprima "~4.0.0" +redux-cli-logger@^2.0.1: + version "2.1.0" + resolved "https://registry.yarnpkg.com/redux-cli-logger/-/redux-cli-logger-2.1.0.tgz#7e546502a4b08c7fac4fe2faee2326a6326cb4a1" + integrity sha512-75mVsggAJRSykWy2qxdGI7osocDWvc3RCMeN93hlvS/FxgdRww12NaXslez+W6gBOrSJKO7W16V0IzuISSfCxg== + dependencies: + colors "^1.1.2" + +redux-devtools-core@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/redux-devtools-core/-/redux-devtools-core-0.2.1.tgz#4e43cbe590a1f18c13ee165d2d42e0bc77a164d8" + integrity sha512-RAGOxtUFdr/1USAvxrWd+Gq/Euzgw7quCZlO5TgFpDfG7rB5tMhZUrNyBjpzgzL2yMk0eHnPYIGm7NkIfRzHxQ== + dependencies: + get-params "^0.1.2" + jsan "^3.1.13" + lodash "^4.17.11" + nanoid "^2.0.0" + remotedev-serialize "^0.1.8" + +redux-devtools-instrument@^1.9.4: + version "1.10.0" + resolved "https://registry.yarnpkg.com/redux-devtools-instrument/-/redux-devtools-instrument-1.10.0.tgz#036caf79fa1e5f25ec4bae38a9af4f08c69e323a" + integrity sha512-X8JRBCzX2ADSMp+iiV7YQ8uoTNyEm0VPFPd4T854coz6lvRiBrFSqAr9YAS2n8Kzxx8CJQotR0QF9wsMM+3DvA== + dependencies: + lodash "^4.17.19" + symbol-observable "^1.2.0" + +redux-saga@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/redux-saga/-/redux-saga-1.0.0.tgz#acb8b3ed9180fecbe75f342011d75af3ac11045b" + integrity sha512-GvJWs/SzMvEQgeaw6sRMXnS2FghlvEGsHiEtTLpJqc/FHF3I5EE/B+Hq5lyHZ8LSoT2r/X/46uWvkdCnK9WgHA== + dependencies: + "@redux-saga/core" "^1.0.0" + +redux@^3.7.2: + version "3.7.2" + resolved "https://registry.yarnpkg.com/redux/-/redux-3.7.2.tgz#06b73123215901d25d065be342eb026bc1c8537b" + integrity sha512-pNqnf9q1hI5HHZRBkj3bAngGZW/JMCmexDlOxw4XagXY2o1327nHH54LoTjiPJ0gizoqPDRqWyX/00g0hD6w+A== + dependencies: + lodash "^4.2.1" + lodash-es "^4.2.1" + loose-envify "^1.1.0" + symbol-observable "^1.0.3" + +redux@^4.0.4: + version "4.1.0" + resolved "https://registry.yarnpkg.com/redux/-/redux-4.1.0.tgz#eb049679f2f523c379f1aff345c8612f294c88d4" + integrity sha512-uI2dQN43zqLWCt6B/BMGRMY6db7TTY4qeHHfGeKb3EOhmOKjU3KdWvNLJyqaHRksv/ErdNH7cFZWg9jXtewy4g== + dependencies: + "@babel/runtime" "^7.9.2" + regenerate@^1.2.1: version "1.4.2" resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" @@ -11352,6 +16448,13 @@ regenerator-transform@^0.10.0: babel-types "^6.19.0" private "^0.1.6" +regex-cache@^0.4.2: + version "0.4.4" + resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd" + integrity sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ== + dependencies: + is-equal-shallow "^0.1.3" + regex-not@^1.0.0, regex-not@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" @@ -11389,12 +16492,66 @@ regjsparser@^0.1.4: dependencies: jsesc "~0.5.0" +relay-compiler@10.1.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/relay-compiler/-/relay-compiler-10.1.0.tgz#fb4672cdbe9b54869a3a79759edd8c2d91609cbe" + integrity sha512-HPqc3N3tNgEgUH5+lTr5lnLbgnsZMt+MRiyS0uAVNhuPY2It0X1ZJG+9qdA3L9IqKFUNwVn6zTO7RArjMZbARQ== + dependencies: + "@babel/core" "^7.0.0" + "@babel/generator" "^7.5.0" + "@babel/parser" "^7.0.0" + "@babel/runtime" "^7.0.0" + "@babel/traverse" "^7.0.0" + "@babel/types" "^7.0.0" + babel-preset-fbjs "^3.3.0" + chalk "^4.0.0" + fb-watchman "^2.0.0" + fbjs "^3.0.0" + glob "^7.1.1" + immutable "~3.7.6" + nullthrows "^1.1.1" + relay-runtime "10.1.0" + signedsource "^1.0.0" + yargs "^15.3.1" + +relay-runtime@10.1.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/relay-runtime/-/relay-runtime-10.1.0.tgz#4753bf36e95e8d862cef33608e3d98b4ed730d16" + integrity sha512-bxznLnQ1ST6APN/cFi7l0FpjbZVchWQjjhj9mAuJBuUqNNCh9uV+UTRhpQF7Q8ycsPp19LHTpVyGhYb0ustuRQ== + dependencies: + "@babel/runtime" "^7.0.0" + fbjs "^3.0.0" + +remote-redux-devtools@^0.5.12: + version "0.5.16" + resolved "https://registry.yarnpkg.com/remote-redux-devtools/-/remote-redux-devtools-0.5.16.tgz#95b1a4a1988147ca04f3368f3573b661748b3717" + integrity sha512-xZ2D1VRIWzat5nsvcraT6fKEX9Cfi+HbQBCwzNnUAM8Uicm/anOc60XGalcaDPrVmLug7nhDl2nimEa3bL3K9w== + dependencies: + jsan "^3.1.13" + querystring "^0.2.0" + redux-devtools-core "^0.2.1" + redux-devtools-instrument "^1.9.4" + rn-host-detect "^1.1.5" + socketcluster-client "^14.2.1" + +remotedev-serialize@^0.1.8: + version "0.1.9" + resolved "https://registry.yarnpkg.com/remotedev-serialize/-/remotedev-serialize-0.1.9.tgz#5e67e05cbca75d408d769d057dc59d0f56cd2c43" + integrity sha512-5tFdZg9mSaAWTv6xmQ7HtHjKMLSFQFExEZOtJe10PLsv1wb7cy7kYHtBvTYRro27/3fRGEcQBRNKSaixOpb69w== + dependencies: + jsan "^3.1.13" + +remove-trailing-separator@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" + integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= + repeat-element@^1.1.2: version "1.1.3" resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== -repeat-string@^1.6.1: +repeat-string@^1.5.2, repeat-string@^1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= @@ -11406,6 +16563,11 @@ repeating@^2.0.0: dependencies: is-finite "^1.0.0" +replace-ext@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-0.0.1.tgz#29bbd92078a739f0bcce2b4ee41e837953522924" + integrity sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ= + req-cwd@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/req-cwd/-/req-cwd-2.0.0.tgz#d4082b4d44598036640fb73ddea01ed53db49ebc" @@ -11446,7 +16608,7 @@ request-promise@^4.2.2: stealthy-require "^1.1.1" tough-cookie "^2.3.3" -request@^2.79.0, request@^2.85.0, request@^2.88.0, request@^2.88.2: +request@^2.55.0, request@^2.79.0, request@^2.85.0, request@^2.88.0, request@^2.88.2: version "2.88.2" resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== @@ -11497,6 +16659,27 @@ require-main-filename@^2.0.0: resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== +reselect-tree@^1.3.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/reselect-tree/-/reselect-tree-1.3.4.tgz#449629728e2dc79bf0602571ec8859ac34737089" + integrity sha512-1OgNq1IStyJFqIqOoD3k3Ge4SsYCMP9W88VQOfvgyLniVKLfvbYO1Vrl92SyEK5021MkoBX6tWb381VxTDyPBQ== + dependencies: + debug "^3.1.0" + esdoc "^1.0.4" + json-pointer "^0.6.0" + reselect "^4.0.0" + source-map-support "^0.5.3" + +reselect@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/reselect/-/reselect-4.0.0.tgz#f2529830e5d3d0e021408b246a206ef4ea4437f7" + integrity sha512-qUgANli03jjAyGlnbYVAV5vvnOmJnODyABz51RdBN7M4WaVu8mecZWgyQNkG8Yqe3KRGRt0l4K4B3XVEULC4CA== + +reset@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/reset/-/reset-0.1.0.tgz#9fc7314171995ae6cb0b7e58b06ce7522af4bafb" + integrity sha1-n8cxQXGZWubLC35YsGznUir0uvs= + resolve-cwd@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" @@ -11504,6 +16687,11 @@ resolve-cwd@^3.0.0: dependencies: resolve-from "^5.0.0" +resolve-from@5.0.0, resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + resolve-from@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" @@ -11514,11 +16702,6 @@ resolve-from@^4.0.0: resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== -resolve-from@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" - integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== - resolve-url@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" @@ -11536,7 +16719,7 @@ resolve@1.17.0, resolve@~1.17.0: dependencies: path-parse "^1.0.6" -resolve@^1.1.6, resolve@^1.10.0, resolve@^1.20.0, resolve@^1.3.2, resolve@^1.8.1: +resolve@^1.1.6, resolve@^1.10.0, resolve@^1.14.2, resolve@^1.20.0, resolve@^1.3.2, resolve@^1.8.1: version "1.20.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== @@ -11551,6 +16734,14 @@ responselike@^1.0.2: dependencies: lowercase-keys "^1.0.0" +restore-cursor@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" + integrity sha1-n37ih/gv0ybU/RYpI9YhKe7g368= + dependencies: + onetime "^2.0.0" + signal-exit "^3.0.2" + restore-cursor@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" @@ -11571,7 +16762,12 @@ ret@~0.1.10: resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== -retry@^0.12.0: +retimer@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/retimer/-/retimer-2.0.0.tgz#e8bd68c5e5a8ec2f49ccb5c636db84c04063bbca" + integrity sha512-KLXY85WkEq2V2bKex/LOO1ViXVn2KGYe4PYysAdYdjmraYIUsVkXu8O4am+8+5UbaaGl1qho4aqAAPHNQ4GSbg== + +retry@0.12.0, retry@^0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" integrity sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs= @@ -11581,7 +16777,7 @@ reusify@^1.0.4: resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== -rimraf@^2.2.8, rimraf@^2.6.3: +rimraf@^2.2.8, rimraf@^2.6.1, rimraf@^2.6.3: version "2.7.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== @@ -11610,6 +16806,24 @@ rlp@^2.0.0, rlp@^2.2.1, rlp@^2.2.2, rlp@^2.2.3, rlp@^2.2.4, rlp@^2.2.6: dependencies: bn.js "^4.11.1" +rn-host-detect@^1.1.5: + version "1.2.0" + resolved "https://registry.yarnpkg.com/rn-host-detect/-/rn-host-detect-1.2.0.tgz#8b0396fc05631ec60c1cb8789e5070cdb04d0da0" + integrity sha512-btNg5kzHcjZZ7t7mvvV/4wNJ9e3MPgrWivkRgWURzXL0JJ0pwWlU4zrbmdlz3HHzHOxhBhHB4D+/dbMFfu4/4A== + +rpc-websockets@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/rpc-websockets/-/rpc-websockets-5.3.1.tgz#678ca24315e4fe34a5f42ac7c2744764c056eb08" + integrity sha512-rIxEl1BbXRlIA9ON7EmY/2GUM7RLMy8zrUPTiLPFiYnYOz0I3PXfCmDDrge5vt4pW4oIcAXBDvgZuJ1jlY5+VA== + dependencies: + "@babel/runtime" "^7.8.7" + assert-args "^1.2.1" + babel-runtime "^6.26.0" + circular-json "^0.5.9" + eventemitter3 "^3.1.2" + uuid "^3.4.0" + ws "^5.2.2" + run-async@^2.4.0: version "2.4.1" resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" @@ -11622,12 +16836,19 @@ run-parallel@^1.1.9: dependencies: queue-microtask "^1.2.2" +run@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/run/-/run-1.4.0.tgz#e17d9e9043ab2fe17776cb299e1237f38f0b4ffa" + integrity sha1-4X2ekEOrL+F3dsspnhI3848LT/o= + dependencies: + minimatch "*" + rustbn.js@~0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/rustbn.js/-/rustbn.js-0.2.0.tgz#8082cb886e707155fd1cb6f23bd591ab8d55d0ca" integrity sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA== -rxjs@^6.6.0, rxjs@^6.6.7: +rxjs@6, rxjs@^6.6.0, rxjs@^6.6.7: version "6.6.7" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9" integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== @@ -11663,6 +16884,28 @@ safe-regex@^1.1.0: resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== +sax@^1.1.4, 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== + +sc-channel@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/sc-channel/-/sc-channel-1.2.0.tgz#d9209f3a91e3fa694c66b011ce55c4ad8c3087d9" + integrity sha512-M3gdq8PlKg0zWJSisWqAsMmTVxYRTpVRqw4CWAdKBgAfVKumFcTjoCV0hYu7lgUXccCtCD8Wk9VkkE+IXCxmZA== + dependencies: + component-emitter "1.2.1" + +sc-errors@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/sc-errors/-/sc-errors-2.0.1.tgz#3af2d934dfd82116279a4b2c1552c1e021ddcb03" + integrity sha512-JoVhq3Ud+3Ujv2SIG7W0XtjRHsrNgl6iXuHHsh0s+Kdt5NwI6N2EGAZD4iteitdDv68ENBkpjtSvN597/wxPSQ== + +sc-formatter@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/sc-formatter/-/sc-formatter-3.0.2.tgz#9abdb14e71873ce7157714d3002477bbdb33c4e6" + integrity sha512-9PbqYBpCq+OoEeRQ3QfFIGE6qwjjBcd2j7UjgDlhnZbtSnuGgHdcRklPKYGuYFH82V/dwd+AIpu8XvA1zqTd+A== + sc-istanbul@^0.4.5: version "0.4.6" resolved "https://registry.yarnpkg.com/sc-istanbul/-/sc-istanbul-0.4.6.tgz#cf6784355ff2076f92d70d59047d71c13703e839" @@ -11683,6 +16926,11 @@ sc-istanbul@^0.4.5: which "^1.1.1" wordwrap "^1.0.0" +scrypt-async@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/scrypt-async/-/scrypt-async-2.0.1.tgz#4318dae48a8b7cc3b8fe05f75f4164a7d973d25d" + integrity sha512-wHR032jldwZNy7Tzrfu7RccOgGf8r5hyDMSP2uV6DpLiBUsR8JsDcx/in73o2UGVVrH5ivRFdNsFPcjtl3LErQ== + scrypt-js@2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-2.0.4.tgz#32f8c5149f0797672e551c07e230f834b6af5f16" @@ -11714,7 +16962,7 @@ secp256k1@^3.0.1: nan "^2.14.0" safe-buffer "^5.1.2" -secp256k1@^4.0.1: +secp256k1@^4.0.0, secp256k1@^4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-4.0.2.tgz#15dd57d0f0b9fdb54ac1fa1694f40e5e9a54f4a1" integrity sha512-UDar4sKvWAksIlfX3xIaQReADn+WFnHvbVujpcbr+9Sf/69odMwy2MUsz5CKLQgX9nsIyrjuxL2imVyoNHa3fg== @@ -11728,6 +16976,11 @@ seedrandom@3.0.1: resolved "https://registry.yarnpkg.com/seedrandom/-/seedrandom-3.0.1.tgz#eb3dde015bcf55df05a233514e5df44ef9dce083" integrity sha512-1/02Y/rUeU1CJBAGLebiC5Lbo5FnB22gQbIFFYTLkwvp1xdABZJH1sn4ZT1MzXmPpzv+Rf/Lu2NcsLJiK4rcDg== +seedrandom@^3.0.5: + version "3.0.5" + resolved "https://registry.yarnpkg.com/seedrandom/-/seedrandom-3.0.5.tgz#54edc85c95222525b0c7a6f6b3543d8e0b3aa0a7" + integrity sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg== + semaphore-async-await@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/semaphore-async-await/-/semaphore-async-await-1.5.1.tgz#857bef5e3644601ca4b9570b87e9df5ca12974fa" @@ -11743,7 +16996,12 @@ semaphore@>=1.0.1, semaphore@^1.0.3, semaphore@^1.1.0: resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== -semver@^6.0.0, semver@^6.3.0: +semver@7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" + integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== + +semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== @@ -11779,6 +17037,21 @@ send@0.17.1: range-parser "~1.2.1" statuses "~1.5.0" +sentence-case@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/sentence-case/-/sentence-case-2.1.1.tgz#1f6e2dda39c168bf92d13f86d4a918933f667ed4" + integrity sha1-H24t2jnBaL+S0T+G1KkYkz9mftQ= + dependencies: + no-case "^2.2.0" + upper-case-first "^1.1.2" + +serialize-javascript@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-4.0.0.tgz#b525e1238489a5ecfc42afacc3fe99e666f4b1aa" + integrity sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw== + dependencies: + randombytes "^2.1.0" + serialize-javascript@5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-5.0.1.tgz#7886ec848049a462467a97d3d918ebb2aaf934f4" @@ -11842,7 +17115,12 @@ setprototypeof@1.1.1: resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== -sha.js@^2.4.0, sha.js@^2.4.8: +setprototypeof@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" + integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== + +sha.js@^2.4.0, sha.js@^2.4.11, sha.js@^2.4.8: version "2.4.11" resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== @@ -11865,6 +17143,11 @@ shallow-clone@^3.0.0: dependencies: kind-of "^6.0.2" +shallowequal@^1.0.2: + version "1.1.0" + resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8" + integrity sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ== + shebang-command@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" @@ -11912,6 +17195,18 @@ signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== +signed-varint@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/signed-varint/-/signed-varint-2.0.1.tgz#50a9989da7c98c2c61dad119bc97470ef8528129" + integrity sha1-UKmYnafJjCxh2tEZvJdHDvhSgSk= + dependencies: + varint "~5.0.0" + +signedsource@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/signedsource/-/signedsource-1.0.0.tgz#1ddace4981798f93bd833973803d80d52e93ad6a" + integrity sha1-HdrOSYF5j5O9gzlzgD2A1S6TrWo= + simple-concat@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f" @@ -11988,6 +17283,13 @@ smartwrap@^1.2.3: wcwidth "^1.0.1" yargs "^15.1.0" +snake-case@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/snake-case/-/snake-case-2.1.0.tgz#41bdb1b73f30ec66a04d4e2cad1b76387d4d6d9f" + integrity sha1-Qb2xtz8w7GagTU4srRt2OH1NbZ8= + dependencies: + no-case "^2.2.0" + snapdragon-node@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" @@ -12018,6 +17320,22 @@ snapdragon@^0.8.1: source-map-resolve "^0.5.0" use "^3.1.0" +socketcluster-client@^14.2.1: + version "14.3.1" + resolved "https://registry.yarnpkg.com/socketcluster-client/-/socketcluster-client-14.3.1.tgz#bfc3591c0cad2668e7b3512a102f3844f5f2e84d" + integrity sha512-Sd/T0K/9UlqTfz+HUuFq90dshA5OBJPQbdkRzGtcKIOm52fkdsBTt0FYpiuzzxv5VrU7PWpRm6KIfNXyPwlLpw== + dependencies: + buffer "^5.2.1" + clone "2.1.1" + component-emitter "1.2.1" + linked-list "0.1.0" + querystring "0.2.0" + sc-channel "^1.2.0" + sc-errors "^2.0.1" + sc-formatter "^3.0.1" + uuid "3.2.1" + ws "7.1.0" + socks-proxy-agent@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-5.0.0.tgz#7c0f364e7b1cf4a7a437e71253bed72e9004be60" @@ -12137,7 +17455,7 @@ sort-keys@^4.0.0: dependencies: is-plain-obj "^2.0.0" -source-map-resolve@^0.5.0: +source-map-resolve@^0.5.0, source-map-resolve@^0.5.2: version "0.5.3" resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== @@ -12163,7 +17481,7 @@ source-map-support@^0.4.15: dependencies: source-map "^0.5.6" -source-map-support@^0.5.13, source-map-support@^0.5.17, source-map-support@^0.5.19, source-map-support@^0.5.6: +source-map-support@^0.5.13, source-map-support@^0.5.17, source-map-support@^0.5.19, source-map-support@^0.5.3, source-map-support@^0.5.6: version "0.5.19" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== @@ -12176,12 +17494,12 @@ source-map-url@^0.4.0: resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.1.tgz#0af66605a745a5a2f91cf1bbf8a7afbc283dec56" integrity sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw== -source-map@^0.5.6, source-map@^0.5.7: +source-map@^0.5.0, source-map@^0.5.6, source-map@^0.5.7: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= -source-map@^0.6.0, source-map@^0.6.1: +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== @@ -12193,6 +17511,16 @@ source-map@~0.2.0: dependencies: amdefine ">=0.0.4" +spark-md5@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/spark-md5/-/spark-md5-3.0.0.tgz#3722227c54e2faf24b1dc6d933cc144e6f71bfef" + integrity sha1-NyIifFTi+vJLHcbZM8wUTm9xv+8= + +spark-md5@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/spark-md5/-/spark-md5-3.0.1.tgz#83a0e255734f2ab4e5c466e5a2cfc9ba2aa2124d" + integrity sha512-0tF3AGSD1ppQeuffsLDIOWlKUd3lS92tFxcsrh5Pe3ZphhnoK+oXIBTzOAThZCiuINZLvpiLH/1VS1/ANEJVig== + spawndamnit@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/spawndamnit/-/spawndamnit-2.0.0.tgz#9f762ac5c3476abb994b42ad592b5ad22bb4b0ad" @@ -12227,6 +17555,15 @@ spdx-license-ids@^3.0.0: resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz#e9c18a410e5ed7e12442a549fbd8afa767038d65" integrity sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ== +spinnies@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/spinnies/-/spinnies-0.5.1.tgz#6ac88455d9117c7712d52898a02c969811819a7e" + integrity sha512-WpjSXv9NQz0nU3yCT9TFEOfpFrXADY9C5fG6eAJqixLhvTX1jP3w92Y8IE5oafIe42nlF9otjhllnXN/QCaB3A== + dependencies: + chalk "^2.4.2" + cli-cursor "^3.0.0" + strip-ansi "^5.2.0" + split-on-first@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/split-on-first/-/split-on-first-1.1.0.tgz#f610afeee3b12bce1d0c30425e76398b78249a5f" @@ -12258,6 +17595,14 @@ sprintf-js@~1.0.2: resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= +sqlite3@^4.0.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/sqlite3/-/sqlite3-4.2.0.tgz#49026d665e9fc4f922e56fb9711ba5b4c85c4901" + integrity sha512-roEOz41hxui2Q7uYnWsjMOTry6TcNUNmp8audCx18gF10P2NknwdpF+E+HKvz/F2NvPKGGBF4NGc+ZPQ+AABwg== + dependencies: + nan "^2.12.1" + node-pre-gyp "^0.11.0" + sshpk@^1.7.0: version "1.16.1" resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" @@ -12280,6 +17625,11 @@ ssri@^8.0.0, ssri@^8.0.1: dependencies: minipass "^3.1.1" +stable@^0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" + integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== + stacktrace-parser@^0.1.10: version "0.1.10" resolved "https://registry.yarnpkg.com/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz#29fb0cae4e0d0b85155879402857a1639eb6051a" @@ -12305,11 +17655,23 @@ stealthy-require@^1.1.1: resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks= +stoppable@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/stoppable/-/stoppable-1.1.0.tgz#32da568e83ea488b08e4d7ea2c3bcc9d75015d5b" + integrity sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw== + stream-shift@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d" integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ== +stream-to-it@^0.2.0, stream-to-it@^0.2.2: + version "0.2.3" + resolved "https://registry.yarnpkg.com/stream-to-it/-/stream-to-it-0.2.3.tgz#b9320ceb26a51b313de81036d4354d9b657f4d2d" + integrity sha512-xaK9EjPtLox5rrC7YLSBXSanTtUJN/lzJlMFvy9VaROmnyvy0U/X6m2uMhXPJRn3g3M9uOSIzTszW7BPiWSg9w== + dependencies: + get-iterator "^1.0.2" + stream-to-pull-stream@^1.7.1: version "1.7.3" resolved "https://registry.yarnpkg.com/stream-to-pull-stream/-/stream-to-pull-stream-1.7.3.tgz#4161aa2d2eb9964de60bfa1af7feaf917e874ece" @@ -12325,6 +17687,11 @@ stream-transform@^2.1.0: dependencies: mixme "^0.5.0" +streamsearch@0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-0.1.2.tgz#808b9d0e56fc273d809ba57338e929919a1a9f1a" + integrity sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo= + strict-uri-encode@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" @@ -12442,7 +17809,15 @@ strip-ansi@^6.0.0: dependencies: ansi-regex "^5.0.0" -strip-bom@^2.0.0: +strip-bom-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-bom-stream/-/strip-bom-stream-1.0.0.tgz#e7144398577d51a6bed0fa1994fa05f43fd988ee" + integrity sha1-5xRDmFd9Uaa+0PoZlPoF9D/ZiO4= + dependencies: + first-chunk-stream "^1.0.0" + strip-bom "^2.0.0" + +strip-bom@2.X, strip-bom@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" integrity sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4= @@ -12495,6 +17870,11 @@ strip-json-comments@2.0.1, strip-json-comments@~2.0.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= +strip-json-comments@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.0.1.tgz#85713975a91fb87bf1b305cca77395e40d2a64a7" + integrity sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw== + strip-json-comments@3.1.1, strip-json-comments@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" @@ -12509,6 +17889,27 @@ strong-log-transformer@^2.1.0: minimist "^1.2.0" through "^2.3.4" +sublevel-pouchdb@7.2.2: + version "7.2.2" + resolved "https://registry.yarnpkg.com/sublevel-pouchdb/-/sublevel-pouchdb-7.2.2.tgz#49e46cd37883bf7ff5006d7c5b9bcc7bcc1f422f" + integrity sha512-y5uYgwKDgXVyPZceTDGWsSFAhpSddY29l9PJbXqMJLfREdPmQTY8InpatohlEfCXX7s1LGcrfYAhxPFZaJOLnQ== + dependencies: + inherits "2.0.4" + level-codec "9.0.2" + ltgt "2.2.1" + readable-stream "1.1.14" + +subscriptions-transport-ws@^0.9.11, subscriptions-transport-ws@^0.9.16, subscriptions-transport-ws@^0.9.18: + version "0.9.18" + resolved "https://registry.yarnpkg.com/subscriptions-transport-ws/-/subscriptions-transport-ws-0.9.18.tgz#bcf02320c911fbadb054f7f928e51c6041a37b97" + integrity sha512-tztzcBTNoEbuErsVQpTN2xUNN/efAZXyCyL5m3x4t6SKrEiTL2N8SaKWBFWM4u56pL79ULif3zjyeq+oV+nOaA== + dependencies: + backo2 "^1.0.2" + eventemitter3 "^3.1.0" + iterall "^1.2.1" + symbol-observable "^1.0.4" + ws "^5.2.0" + supports-color@6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.0.0.tgz#76cfe742cf1f41bb9b1c29ad03068c05b4c0e40a" @@ -12516,6 +17917,13 @@ supports-color@6.0.0: dependencies: has-flag "^3.0.0" +supports-color@7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.1.0.tgz#68e32591df73e25ad1c4b49108a2ec507962bfd1" + integrity sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g== + dependencies: + has-flag "^4.0.0" + supports-color@8.1.1: version "8.1.1" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" @@ -12557,6 +17965,14 @@ supports-hyperlinks@^1.0.1: has-flag "^2.0.0" supports-color "^5.0.0" +swap-case@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/swap-case/-/swap-case-1.1.2.tgz#c39203a4587385fad3c850a0bd1bcafa081974e3" + integrity sha1-w5IDpFhzhfrTyFCgvRvK+ggZdOM= + dependencies: + lower-case "^1.1.1" + upper-case "^1.1.1" + swarm-js@^0.1.40: version "0.1.40" resolved "https://registry.yarnpkg.com/swarm-js/-/swarm-js-0.1.40.tgz#b1bc7b6dcc76061f6c772203e004c11997e06b99" @@ -12574,6 +17990,34 @@ swarm-js@^0.1.40: tar "^4.0.2" xhr-request "^1.0.1" +symbol-observable@^1.0.3, symbol-observable@^1.0.4, symbol-observable@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" + integrity sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ== + +symbol-observable@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-2.0.3.tgz#5b521d3d07a43c351055fa43b8355b62d33fd16a" + integrity sha512-sQV7phh2WCYAn81oAkakC5qjq2Ml0g8ozqz03wOGnx9dDlG1de6yrF+0RAzSJD8fPUow3PTSMf2SAbOGxb93BA== + +"symbol-tree@>= 3.1.0 < 4.0.0": + version "3.2.4" + resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" + integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== + +symbol@^0.2.1: + version "0.2.3" + resolved "https://registry.yarnpkg.com/symbol/-/symbol-0.2.3.tgz#3b9873b8a901e47c6efe21526a3ac372ef28bbc7" + integrity sha1-O5hzuKkB5Hxu/iFSajrDcu8ou8c= + +sync-fetch@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/sync-fetch/-/sync-fetch-0.3.0.tgz#77246da949389310ad978ab26790bb05f88d1335" + integrity sha512-dJp4qg+x4JwSEW1HibAuMi0IIrBI3wuQr2GimmqB7OXR50wmwzfdusG+p39R9w3R6aFtZ2mzvxvWKQ3Bd/vx3g== + dependencies: + buffer "^5.7.0" + node-fetch "^2.6.1" + sync-request@^6.0.0: version "6.1.0" resolved "https://registry.yarnpkg.com/sync-request/-/sync-request-6.1.0.tgz#e96217565b5e50bbffe179868ba75532fb597e68" @@ -12590,6 +18034,11 @@ sync-rpc@^1.2.1: dependencies: get-port "^3.1.0" +taffydb@2.7.3: + version "2.7.3" + resolved "https://registry.yarnpkg.com/taffydb/-/taffydb-2.7.3.tgz#2ad37169629498fca5bc84243096d3cde0ec3a34" + integrity sha1-KtNxaWKUmPylvIQkMJbTzeDsOjQ= + tape@^4.6.3: version "4.13.3" resolved "https://registry.yarnpkg.com/tape/-/tape-4.13.3.tgz#51b3d91c83668c7a45b1a594b607dee0a0b46278" @@ -12632,7 +18081,7 @@ tar-stream@^2.1.4: inherits "^2.0.3" readable-stream "^3.1.1" -tar@^4.0.2, tar@^4.4.12: +tar@^4, tar@^4.0.2, tar@^4.4.12: version "4.4.13" resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.13.tgz#43b364bc52888d555298637b10d60790254ab525" integrity sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA== @@ -12727,7 +18176,23 @@ then-request@^6.0.0: promise "^8.0.0" qs "^6.4.0" -through2@^2.0.0, through2@^2.0.1, through2@^2.0.3: +through2-filter@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/through2-filter/-/through2-filter-2.0.0.tgz#60bc55a0dacb76085db1f9dae99ab43f83d622ec" + integrity sha1-YLxVoNrLdghdsfna6Zq0P4PWIuw= + dependencies: + through2 "~2.0.0" + xtend "~4.0.0" + +through2-filter@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/through2-filter/-/through2-filter-3.0.0.tgz#700e786df2367c2c88cd8aa5be4cf9c1e7831254" + integrity sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA== + dependencies: + through2 "~2.0.0" + xtend "~4.0.0" + +through2@2.X, through2@^2.0.0, through2@^2.0.1, through2@^2.0.3, through2@~2.0.0: version "2.0.5" resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== @@ -12735,7 +18200,14 @@ through2@^2.0.0, through2@^2.0.1, through2@^2.0.3: readable-stream "~2.3.6" xtend "~4.0.1" -through2@^3.0.1: +through2@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/through2/-/through2-3.0.1.tgz#39276e713c3302edf9e388dd9c812dd3b825bd5a" + integrity sha512-M96dvTalPT3YbYLaKaCuwu+j06D/8Jfib0o/PxbVt6Amhv3dUAtW6rTV1jPgJSBG83I/e04Y6xkVdVhSRhi0ww== + dependencies: + readable-stream "2 || 3" + +through2@3.0.2, through2@^3.0.1: version "3.0.2" resolved "https://registry.yarnpkg.com/through2/-/through2-3.0.2.tgz#99f88931cfc761ec7678b41d5d7336b5b6a07bf4" integrity sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ== @@ -12743,6 +18215,14 @@ through2@^3.0.1: inherits "^2.0.4" readable-stream "2 || 3" +through2@^0.6.0: + version "0.6.5" + resolved "https://registry.yarnpkg.com/through2/-/through2-0.6.5.tgz#41ab9c67b29d57209071410e1d7a7a968cd3ad48" + integrity sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg= + dependencies: + readable-stream ">=1.0.33-1 <1.1.0-0" + xtend ">=4.0.0 <4.1.0-0" + through2@^4.0.0: version "4.0.2" resolved "https://registry.yarnpkg.com/through2/-/through2-4.0.2.tgz#a7ce3ac2a7a8b0b966c80e7c49f0484c3b239764" @@ -12755,11 +18235,50 @@ through@2, "through@>=2.2.7 <3", through@^2.3.4, through@^2.3.6, through@~2.3.4, resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= +tildify@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/tildify/-/tildify-1.2.0.tgz#dcec03f55dca9b7aa3e5b04f21817eb56e63588a" + integrity sha1-3OwD9V3Km3qj5bBPIYF+tW5jWIo= + dependencies: + os-homedir "^1.0.0" + timed-out@^4.0.0, timed-out@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" integrity sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8= +timeout-abort-controller@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/timeout-abort-controller/-/timeout-abort-controller-1.1.1.tgz#2c3c3c66f13c783237987673c276cbd7a9762f29" + integrity sha512-BsF9i3NAJag6T0ZEjki9j654zoafI2X6ayuNd6Tp8+Ul6Tr5s4jo973qFeiWrRSweqvskC+AHDKUmIW4b7pdhQ== + dependencies: + abort-controller "^3.0.0" + retimer "^2.0.0" + +tiny-queue@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/tiny-queue/-/tiny-queue-0.2.1.tgz#25a67f2c6e253b2ca941977b5ef7442ef97a6046" + integrity sha1-JaZ/LG4lOyypQZd7XvdELvl6YEY= + +tiny-secp256k1@^1.1.3: + version "1.1.6" + resolved "https://registry.yarnpkg.com/tiny-secp256k1/-/tiny-secp256k1-1.1.6.tgz#7e224d2bee8ab8283f284e40e6b4acb74ffe047c" + integrity sha512-FmqJZGduTyvsr2cF3375fqGHUovSwDi/QytexX1Se4BPuPZpTE5Ftp5fg+EFSuEf3lhZqgCRjEG3ydUQ/aNiwA== + dependencies: + bindings "^1.3.0" + bn.js "^4.11.8" + create-hmac "^1.1.7" + elliptic "^6.4.0" + nan "^2.13.2" + +title-case@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/title-case/-/title-case-2.1.1.tgz#3e127216da58d2bc5becf137ab91dae3a7cd8faa" + integrity sha1-PhJyFtpY0rxb7PE3q5Ha46fNj6o= + dependencies: + no-case "^2.2.0" + upper-case "^1.0.3" + tmp@0.0.33, tmp@^0.0.33: version "0.0.33" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" @@ -12774,11 +18293,40 @@ tmp@0.1.0: dependencies: rimraf "^2.6.3" +to-absolute-glob@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/to-absolute-glob/-/to-absolute-glob-0.1.1.tgz#1cdfa472a9ef50c239ee66999b662ca0eb39937f" + integrity sha1-HN+kcqnvUMI57maZm2YsoOs5k38= + dependencies: + extend-shallow "^2.0.1" + +to-data-view@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/to-data-view/-/to-data-view-1.1.0.tgz#08d6492b0b8deb9b29bdf1f61c23eadfa8994d00" + integrity sha512-1eAdufMg6mwgmlojAx3QeMnzB/BTVp7Tbndi3U7ftcT2zCZadjxkkmLmd97zmaxWi+sgGcgWrokmpEoy0Dn0vQ== + to-fast-properties@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" integrity sha1-uDVx+k2MJbguIxsG46MFXeTKGkc= +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= + +to-json-schema@^0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/to-json-schema/-/to-json-schema-0.2.5.tgz#ef3c3f11ad64460dcfbdbafd0fd525d69d62a98f" + integrity sha512-jP1ievOee8pec3tV9ncxLSS48Bnw7DIybgy112rhMCEhf3K4uyVNZZHr03iQQBzbV5v5Hos+dlZRRyk6YSMNDw== + dependencies: + lodash.isequal "^4.5.0" + lodash.keys "^4.2.0" + lodash.merge "^4.6.2" + lodash.omit "^4.5.0" + lodash.without "^4.4.0" + lodash.xor "^4.5.0" + to-object-path@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" @@ -12821,7 +18369,7 @@ toidentifier@1.0.0: resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== -tough-cookie@^2.3.3, tough-cookie@~2.5.0: +tough-cookie@^2.2.0, tough-cookie@^2.3.1, tough-cookie@^2.3.3, tough-cookie@~2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== @@ -12829,6 +18377,15 @@ tough-cookie@^2.3.3, tough-cookie@~2.5.0: psl "^1.1.28" punycode "^2.1.1" +"tough-cookie@^2.3.3 || ^3.0.1 || ^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.0.0.tgz#d822234eeca882f991f0f908824ad2622ddbece4" + integrity sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg== + dependencies: + psl "^1.1.33" + punycode "^2.1.1" + universalify "^0.1.2" + tr46@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/tr46/-/tr46-2.0.2.tgz#03273586def1595ae08fedb38d7733cee91d2479" @@ -12836,6 +18393,11 @@ tr46@^2.0.2: dependencies: punycode "^2.1.1" +tr46@~0.0.1: + version "0.0.3" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= + treeify@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/treeify/-/treeify-1.1.0.tgz#4e31c6a463accd0943879f30667c4fdaff411bb8" @@ -12866,6 +18428,22 @@ trim-right@^1.0.1: resolved "https://registry.yarnpkg.com/true-case-path/-/true-case-path-2.2.1.tgz#c5bf04a5bbec3fd118be4084461b3a27c4d796bf" integrity sha512-0z3j8R7MCjy10kc/g+qg7Ln3alJTodw9aDuVWZa3uiWqfuBMKeAeP2ocWcxoyM3D73yz3Jt/Pu4qPr4wHSdB/Q== +truffle@^5.3.6: + version "5.3.6" + resolved "https://registry.yarnpkg.com/truffle/-/truffle-5.3.6.tgz#f7a8ee263bc808a9a0fcb0f86d2b50a65f3773c9" + integrity sha512-qdvaZzKc5WxnWS6qW7hpAo4aAphAtQfJYnr2hv7FftbycgOv7lemtIPxcd91+/3eZAIGM6hmCjbFYXgEyyaIkQ== + dependencies: + "@truffle/debugger" "^8.0.25" + app-module-path "^2.2.0" + mocha "8.1.2" + original-require "^1.0.1" + optionalDependencies: + "@truffle/db" "^0.5.11" + "@truffle/preserve-fs" "^0.2.2" + "@truffle/preserve-to-buckets" "^0.2.2" + "@truffle/preserve-to-filecoin" "^0.2.2" + "@truffle/preserve-to-ipfs" "^0.2.2" + ts-essentials@^1.0.0, ts-essentials@^1.0.2: version "1.0.4" resolved "https://registry.yarnpkg.com/ts-essentials/-/ts-essentials-1.0.4.tgz#ce3b5dade5f5d97cf69889c11bf7d2da8555b15a" @@ -12906,6 +18484,20 @@ ts-generator@^0.1.1: resolve "^1.8.1" ts-essentials "^1.0.0" +ts-invariant@^0.4.0: + version "0.4.4" + resolved "https://registry.yarnpkg.com/ts-invariant/-/ts-invariant-0.4.4.tgz#97a523518688f93aafad01b0e80eb803eb2abd86" + integrity sha512-uEtWkFM/sdZvRNNDL3Ehu4WVpwaulhwQszV8mrtcdeE8nN00BV9mAmQ88RkrBhFgl9gMgvjJLAQcZbnPXI9mlA== + dependencies: + tslib "^1.9.3" + +ts-invariant@^0.7.0: + version "0.7.3" + resolved "https://registry.yarnpkg.com/ts-invariant/-/ts-invariant-0.7.3.tgz#13aae22a4a165393aaf5cecdee45ef4128d358b8" + integrity sha512-UWDDeovyUTIMWj+45g5nhnl+8oo+GhxL5leTaHn5c8FkQWfh8v66gccLd2/YzVmV5hoQUjCEjhrXnQqVDJdvKA== + dependencies: + tslib "^2.1.0" + ts-mocha@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/ts-mocha/-/ts-mocha-8.0.0.tgz#962d0fa12eeb6468aa1a6b594bb3bbc818da3ef0" @@ -12962,11 +18554,26 @@ tsconfig-paths@^3.5.0: minimist "^1.2.0" strip-bom "^3.0.0" -tslib@^1.13.0, tslib@^1.7.1, tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3: +tslib@^1.10.0, tslib@^1.13.0, tslib@^1.7.1, tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3: version "1.14.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== +tslib@^2.0.3, tslib@^2.1.0, tslib@~2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.2.0.tgz#fb2c475977e35e241311ede2693cee1ec6698f5c" + integrity sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w== + +tslib@~2.0.1: + version "2.0.3" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.0.3.tgz#8e0741ac45fc0c226e58a17bfc3e64b9bc6ca61c" + integrity sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ== + +tslib@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.1.0.tgz#da60860f1c2ecaa5703ab7d39bc05b6bf988b97a" + integrity sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A== + tslint-config-prettier@^1.18.0: version "1.18.0" resolved "https://registry.yarnpkg.com/tslint-config-prettier/-/tslint-config-prettier-1.18.0.tgz#75f140bde947d35d8f0d238e0ebf809d64592c37" @@ -13036,21 +18643,21 @@ tunnel-agent@^0.6.0: dependencies: safe-buffer "^5.0.1" -tweetnacl-util@^0.15.0: +tweetnacl-util@^0.15.0, tweetnacl-util@^0.15.1: version "0.15.1" resolved "https://registry.yarnpkg.com/tweetnacl-util/-/tweetnacl-util-0.15.1.tgz#b80fcdb5c97bcc508be18c44a4be50f022eea00b" integrity sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw== +tweetnacl@1.x.x, tweetnacl@^1.0.0, tweetnacl@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-1.0.3.tgz#ac0af71680458d8a6378d0d0d050ab1407d35596" + integrity sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw== + tweetnacl@^0.14.3, tweetnacl@~0.14.0: version "0.14.5" resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= -tweetnacl@^1.0.0, tweetnacl@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-1.0.3.tgz#ac0af71680458d8a6378d0d0d050ab1407d35596" - integrity sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw== - type-check@~0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" @@ -13058,6 +18665,11 @@ type-check@~0.3.2: dependencies: prelude-ls "~1.1.2" +type-detect@0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-0.1.1.tgz#0ba5ec2a885640e470ea4e8505971900dac58822" + integrity sha1-C6XsKohWQORw6k6FBZcZANrFiCI= + type-detect@4.0.8, type-detect@^4.0.0, type-detect@^4.0.5, type-detect@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" @@ -13098,7 +18710,7 @@ type-fest@^0.8.1: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== -type-is@~1.6.17, type-is@~1.6.18: +type-is@^1.6.16, type-is@~1.6.17, type-is@~1.6.18: version "1.6.18" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== @@ -13142,17 +18754,41 @@ typechain@^3.0.0: ts-essentials "^6.0.3" ts-generator "^0.1.1" -typedarray-to-buffer@^3.1.5: +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" integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== dependencies: - is-typedarray "^1.0.0" + is-typedarray "^1.0.0" + +typedarray@^0.0.6, typedarray@~0.0.5: + version "0.0.6" + resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= + +typeforce@^1.11.5: + version "1.18.0" + resolved "https://registry.yarnpkg.com/typeforce/-/typeforce-1.18.0.tgz#d7416a2c5845e085034d70fcc5b6cc4a90edbfdc" + integrity sha512-7uc1O8h1M1g0rArakJdf0uLRSSgFcYexrVoKo+bzJd32gd4gDy2L/Z+8/FjPnU9ydY3pEnVPtr9FyscYY60K1g== + +typescript-compare@^0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/typescript-compare/-/typescript-compare-0.0.2.tgz#7ee40a400a406c2ea0a7e551efd3309021d5f425" + integrity sha512-8ja4j7pMHkfLJQO2/8tut7ub+J3Lw2S3061eJLFQcvs3tsmJKp8KG5NtpLn7KcY2w08edF74BSVN7qJS0U6oHA== + dependencies: + typescript-logic "^0.0.0" -typedarray@^0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" - integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= +typescript-logic@^0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/typescript-logic/-/typescript-logic-0.0.0.tgz#66ebd82a2548f2b444a43667bec120b496890196" + integrity sha512-zXFars5LUkI3zP492ls0VskH3TtdeHCqu0i7/duGt60i5IGPIpAHE/DWo5FqJ6EjQ15YKXrt+AETjv60Dat34Q== + +typescript-tuple@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/typescript-tuple/-/typescript-tuple-2.2.1.tgz#7d9813fb4b355f69ac55032e0363e8bb0f04dad2" + integrity sha512-Zcr0lbt8z5ZdEzERHAMAniTiIKerFCMgd7yjq1fPnDJ43et/k9twIFQMUYff9k5oXcsQ0WpvFcgzK2ZKASoW6Q== + dependencies: + typescript-compare "^0.0.2" typescript@^4.2.3: version "4.2.3" @@ -13186,6 +18822,11 @@ u2f-api@0.2.7: resolved "https://registry.yarnpkg.com/u2f-api/-/u2f-api-0.2.7.tgz#17bf196b242f6bf72353d9858e6a7566cc192720" integrity sha512-fqLNg8vpvLOD5J/z4B6wpPg4Lvowz1nJ9xdHcCzdUPKcFE/qNCceV2gNZxSJd5vhAZemHr/K/hbzVA0zxB5mkg== +ua-parser-js@^0.7.18: + version "0.7.28" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.28.tgz#8ba04e653f35ce210239c64661685bf9121dec31" + integrity sha512-6Gurc1n//gjp9eQNXjD9O3M/sMwVtN5S8Lv9bvOYBfKfDNiIIhqiyi01vMBO45u4zkDE420w/e0se7Vs+sIg+g== + uglify-js@^3.1.4: version "3.13.2" resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.13.2.tgz#fe10319861bccc8682bfe2e8151fbdd8aa921c44" @@ -13196,6 +18837,21 @@ uid-number@0.0.6: resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" integrity sha1-DqEOgDXo61uOREnwbaHHMGY7qoE= +uint8arrays@1.1.0, uint8arrays@^1.0.0, uint8arrays@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/uint8arrays/-/uint8arrays-1.1.0.tgz#d034aa65399a9fd213a1579e323f0b29f67d0ed2" + integrity sha512-cLdlZ6jnFczsKf5IH1gPHTtcHtPGho5r4CvctohmQjw8K7Q3gFdfIGHxSTdTaCKrL4w09SsPRJTqRS0drYeszA== + dependencies: + multibase "^3.0.0" + web-encoding "^1.0.2" + +uint8arrays@^2.0.5, uint8arrays@^2.1.3, uint8arrays@^2.1.4: + version "2.1.5" + resolved "https://registry.yarnpkg.com/uint8arrays/-/uint8arrays-2.1.5.tgz#9e6e6377a9463d5eba4620a3f0450f7eb389a351" + integrity sha512-CSR7AO+4AHUeSOnZ/NBNCElDeWfRh9bXtOck27083kc7SznmmHIhNEkEOCQOn0wvrIMjS3IH0TNLR16vuc46mA== + dependencies: + multibase "^4.0.1" + ultron@~1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.1.1.tgz#9fe1536a10a664a65266a1e3ccf85fd36302bc9c" @@ -13245,12 +18901,27 @@ unique-slug@^2.0.0: dependencies: imurmurhash "^0.1.4" +unique-stream@^2.0.2: + version "2.3.1" + resolved "https://registry.yarnpkg.com/unique-stream/-/unique-stream-2.3.1.tgz#c65d110e9a4adf9a6c5948b28053d9a8d04cbeac" + integrity sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A== + dependencies: + json-stable-stringify-without-jsonify "^1.0.1" + through2-filter "^3.0.0" + +unique-string@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-1.0.0.tgz#9e1057cca851abb93398f8b33ae187b99caec11a" + integrity sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo= + dependencies: + crypto-random-string "^1.0.0" + universal-user-agent@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-6.0.0.tgz#3381f8503b251c0d9cd21bc1de939ec9df5480ee" integrity sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w== -universalify@^0.1.0: +universalify@^0.1.0, universalify@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== @@ -13260,7 +18931,14 @@ universalify@^2.0.0: resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== -unorm@^1.3.3: +unixify@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unixify/-/unixify-1.0.0.tgz#3a641c8c2ffbce4da683a5c70f03a462940c2090" + integrity sha1-OmQcjC/7zk2mg6XHDwOkYpQMIJA= + dependencies: + normalize-path "^2.1.1" + +unorm@^1.3.3, unorm@^1.4.1: version "1.6.0" resolved "https://registry.yarnpkg.com/unorm/-/unorm-1.6.0.tgz#029b289661fba714f1a9af439eb51d9b16c205af" integrity sha512-b2/KCUlYZUeA7JFUuRJZPUtr4gZvBh7tavtv4fvk4+KV9pfGiR6CQAQAWl49ZpR3ts2dk4FYkP7EIgDJoiOLDA== @@ -13288,6 +18966,18 @@ upath@^2.0.1: resolved "https://registry.yarnpkg.com/upath/-/upath-2.0.1.tgz#50c73dea68d6f6b990f51d279ce6081665d61a8b" integrity sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w== +upper-case-first@^1.1.0, upper-case-first@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/upper-case-first/-/upper-case-first-1.1.2.tgz#5d79bedcff14419518fd2edb0a0507c9b6859115" + integrity sha1-XXm+3P8UQZUY/S7bCgUHybaFkRU= + dependencies: + upper-case "^1.1.1" + +upper-case@^1.0.3, upper-case@^1.1.0, upper-case@^1.1.1, upper-case@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/upper-case/-/upper-case-1.1.3.tgz#f6b4501c2ec4cdd26ba78be7222961de77621598" + integrity sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg= + uri-js@^4.2.2: version "4.4.1" resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" @@ -13342,6 +19032,14 @@ url@^0.11.0: punycode "1.3.2" querystring "0.2.0" +ursa-optional@^0.10.1: + version "0.10.2" + resolved "https://registry.yarnpkg.com/ursa-optional/-/ursa-optional-0.10.2.tgz#bd74e7d60289c22ac2a69a3c8dea5eb2817f9681" + integrity sha512-TKdwuLboBn7M34RcvVTuQyhvrA8gYKapuVdm0nBP0mnBc7oECOfUQZrY91cefL3/nm64ZyrejSRrhTVdX7NG/A== + dependencies: + bindings "^1.5.0" + nan "^2.14.2" + usb@^1.6.3: version "1.6.5" resolved "https://registry.yarnpkg.com/usb/-/usb-1.6.5.tgz#482dc18468a6ed7b33d92ef88500630c68da3c7d" @@ -13391,6 +19089,18 @@ util.promisify@^1.0.0, util.promisify@^1.0.1: has-symbols "^1.0.1" object.getownpropertydescriptors "^2.1.1" +util@^0.12.0, util@^0.12.3: + version "0.12.3" + resolved "https://registry.yarnpkg.com/util/-/util-0.12.3.tgz#971bb0292d2cc0c892dab7c6a5d37c2bec707888" + integrity sha512-I8XkoQwE+fPQEhy9v012V+TSdH2kp9ts29i20TaaDUXsg7x/onePbhFJUExBfv/2ay1ZOp/Vsm3nDlmnFGSAog== + dependencies: + inherits "^2.0.3" + is-arguments "^1.0.4" + is-generator-function "^1.0.7" + is-typed-array "^1.1.3" + safe-buffer "^5.1.2" + which-typed-array "^1.1.2" + utils-merge@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" @@ -13401,16 +19111,41 @@ uuid@2.0.1: resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.1.tgz#c2a30dedb3e535d72ccf82e343941a50ba8533ac" integrity sha1-wqMN7bPlNdcsz4LjQ5QaULqFM6w= +uuid@3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.2.1.tgz#12c528bb9d58d0b9265d9a2f6f0fe8be17ff1f14" + integrity sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA== + uuid@3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA== -uuid@^3.3.2: +uuid@8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.1.0.tgz#6f1536eb43249f473abc6bd58ff983da1ca30d8d" + integrity sha512-CI18flHDznR0lq54xBycOVmphdCYnQLKn8abKn7PXUiKUGdEd+/l9LWNJmugXel4hXq7S+RMNl34ecyC9TntWg== + +uuid@^3.1.0, uuid@^3.3.2, uuid@^3.4.0: version "3.4.0" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== +uuid@^8.0.0: + version "8.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + +vali-date@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/vali-date/-/vali-date-1.0.0.tgz#1b904a59609fb328ef078138420934f6b86709a6" + integrity sha1-G5BKWWCfsyjvB4E4Qgk09rhnCaY= + +valid-url@1.0.9: + version "1.0.9" + resolved "https://registry.yarnpkg.com/valid-url/-/valid-url-1.0.9.tgz#1c14479b40f1397a75782f115e4086447433a200" + integrity sha1-HBRHm0DxOXp1eC8RXkCGRHQzogA= + validate-npm-package-license@^3.0.1, validate-npm-package-license@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" @@ -13426,11 +19161,21 @@ validate-npm-package-name@^3.0.0: dependencies: builtins "^1.0.3" -varint@^5.0.0: +value-or-promise@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/value-or-promise/-/value-or-promise-1.0.6.tgz#218aa4794aa2ee24dcf48a29aba4413ed584747f" + integrity sha512-9r0wQsWD8z/BxPOvnwbPf05ZvFngXyouE9EKB+5GbYix+BYnAwrIChCUyFIinfbf2FL/U71z+CPpbnmTdxrwBg== + +varint@^5.0.0, varint@^5.0.2, varint@~5.0.0: version "5.0.2" resolved "https://registry.yarnpkg.com/varint/-/varint-5.0.2.tgz#5b47f8a947eb668b848e034dcfa87d0ff8a7f7a4" integrity sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow== +varint@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/varint/-/varint-6.0.0.tgz#9881eb0ce8feaea6512439d19ddf84bf551661d0" + integrity sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg== + vary@^1, vary@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" @@ -13445,6 +19190,43 @@ verror@1.10.0: core-util-is "1.0.2" extsprintf "^1.2.0" +vinyl-fs@2.4.3: + version "2.4.3" + resolved "https://registry.yarnpkg.com/vinyl-fs/-/vinyl-fs-2.4.3.tgz#3d97e562ebfdd4b66921dea70626b84bde9d2d07" + integrity sha1-PZflYuv91LZpId6nBia4S96dLQc= + dependencies: + duplexify "^3.2.0" + glob-stream "^5.3.2" + graceful-fs "^4.0.0" + gulp-sourcemaps "^1.5.2" + is-valid-glob "^0.3.0" + lazystream "^1.0.0" + lodash.isequal "^4.0.0" + merge-stream "^1.0.0" + mkdirp "^0.5.0" + object-assign "^4.0.0" + readable-stream "^2.0.4" + strip-bom "^2.0.0" + strip-bom-stream "^1.0.0" + through2 "^2.0.0" + through2-filter "^2.0.0" + vali-date "^1.0.0" + vinyl "^1.0.0" + +vinyl@1.X, vinyl@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-1.2.0.tgz#5c88036cf565e5df05558bfc911f8656df218884" + integrity sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ= + dependencies: + clone "^1.0.0" + clone-stats "^0.0.1" + replace-ext "0.0.1" + +vuvuzela@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/vuvuzela/-/vuvuzela-1.0.3.tgz#3be145e58271c73ca55279dd851f12a682114b0b" + integrity sha1-O+FF5YJxxzylUnndhR8SpoIRSws= + wcwidth@^1.0.0, wcwidth@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" @@ -13452,6 +19234,15 @@ wcwidth@^1.0.0, wcwidth@^1.0.1: dependencies: defaults "^1.0.3" +web-encoding@^1.0.2, web-encoding@^1.0.6: + version "1.1.5" + resolved "https://registry.yarnpkg.com/web-encoding/-/web-encoding-1.1.5.tgz#fc810cf7667364a6335c939913f5051d3e0c4864" + integrity sha512-HYLeVCdJ0+lBYV2FvNZmv3HJ2Nt0QYXqZojk3d9FJOLkwnuhzM9tmamh8d7HPM8QqjKH8DeHkFTx+CFlWpZZDA== + dependencies: + util "^0.12.3" + optionalDependencies: + "@zxing/text-encoding" "0.9.0" + web3-bzz@1.2.11: version "1.2.11" resolved "https://registry.yarnpkg.com/web3-bzz/-/web3-bzz-1.2.11.tgz#41bc19a77444bd5365744596d778b811880f707f" @@ -13472,6 +19263,16 @@ web3-bzz@1.2.9: swarm-js "^0.1.40" underscore "1.9.1" +web3-bzz@1.3.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/web3-bzz/-/web3-bzz-1.3.5.tgz#f181a1319d9f867f4183b147e7aebd21aecff4a0" + integrity sha512-XiEUAbB1uKm/agqfwBsCW8fbw+sma85TfwuDpdcy591vinVk0S9TfWgLxro6v1KJ6nSELySIbKGbAJbh2GSyxw== + dependencies: + "@types/node" "^12.12.6" + got "9.6.0" + swarm-js "^0.1.40" + underscore "1.9.1" + web3-core-helpers@1.2.11: version "1.2.11" resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.2.11.tgz#84c681ed0b942c0203f3b324a245a127e8c67a99" @@ -13490,6 +19291,15 @@ web3-core-helpers@1.2.9: web3-eth-iban "1.2.9" web3-utils "1.2.9" +web3-core-helpers@1.3.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.3.5.tgz#9f0ff7ed40befb9f691986e66fd94c828c7b1b13" + integrity sha512-HYh3ix5FjysgT0jyzD8s/X5ym0b4BGU7I2QtuBiydMnE0mQEWy7GcT9XKpTySA8FTOHHIAQYvQS07DN/ky3UzA== + dependencies: + underscore "1.9.1" + web3-eth-iban "1.3.5" + web3-utils "1.3.5" + web3-core-method@1.2.11: version "1.2.11" resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.2.11.tgz#f880137d1507a0124912bf052534f168b8d8fbb6" @@ -13514,6 +19324,18 @@ web3-core-method@1.2.9: web3-core-subscriptions "1.2.9" web3-utils "1.2.9" +web3-core-method@1.3.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.3.5.tgz#995fe12f3b364469e5208a88d72736327b231faa" + integrity sha512-hCbmgQ+At6OTuaNGAdjXMsCr4eUCmp9yGKSuaB5HdkNVDpqFso4HHjVxcjNrTyJp3OZnyjKBzQzK1ZWLpLl84Q== + dependencies: + "@ethersproject/transactions" "^5.0.0-beta.135" + underscore "1.9.1" + web3-core-helpers "1.3.5" + web3-core-promievent "1.3.5" + web3-core-subscriptions "1.3.5" + web3-utils "1.3.5" + web3-core-promievent@1.2.11: version "1.2.11" resolved "https://registry.yarnpkg.com/web3-core-promievent/-/web3-core-promievent-1.2.11.tgz#51fe97ca0ddec2f99bf8c3306a7a8e4b094ea3cf" @@ -13528,6 +19350,13 @@ web3-core-promievent@1.2.9: dependencies: eventemitter3 "3.1.2" +web3-core-promievent@1.3.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/web3-core-promievent/-/web3-core-promievent-1.3.5.tgz#33c34811cc4e2987c56e5192f9a014368c42ca39" + integrity sha512-K0j8x3ZJr0eAyNvyUCxOUsSTd4hco0/9nxxlyOuijcsa6YV8l9NL6eqhniWbSyxCJT8ka5Mb7yAiUZe69EDLBQ== + dependencies: + eventemitter3 "4.0.4" + web3-core-requestmanager@1.2.11: version "1.2.11" resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.2.11.tgz#fe6eb603fbaee18530293a91f8cf26d8ae28c45a" @@ -13550,6 +19379,18 @@ web3-core-requestmanager@1.2.9: web3-providers-ipc "1.2.9" web3-providers-ws "1.2.9" +web3-core-requestmanager@1.3.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.3.5.tgz#c452ea85fcffdf5b82b84c250707b638790d0e75" + integrity sha512-9l294U3Ga8qmvv8E37BqjQREfMs+kFnkU3PY28g9DZGYzKvl3V1dgDYqxyrOBdCFhc7rNSpHdgC4PrVHjouspg== + dependencies: + underscore "1.9.1" + util "^0.12.0" + web3-core-helpers "1.3.5" + web3-providers-http "1.3.5" + web3-providers-ipc "1.3.5" + web3-providers-ws "1.3.5" + web3-core-subscriptions@1.2.11: version "1.2.11" resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.2.11.tgz#beca908fbfcb050c16f45f3f0f4c205e8505accd" @@ -13568,6 +19409,15 @@ web3-core-subscriptions@1.2.9: underscore "1.9.1" web3-core-helpers "1.2.9" +web3-core-subscriptions@1.3.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.3.5.tgz#7c4dc9d559e344d852de2cf01bd0cc13c94023cb" + integrity sha512-6mtXdaEB1V1zKLqYBq7RF2W75AK5ZJNGpW6QYC7Zvbku7zq1ZlgaUkJo88JKMWJ7etfaHaYqQ/7VveHk5sQynA== + dependencies: + eventemitter3 "4.0.4" + underscore "1.9.1" + web3-core-helpers "1.3.5" + web3-core@1.2.11: version "1.2.11" resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.2.11.tgz#1043cacc1becb80638453cc5b2a14be9050288a7" @@ -13594,6 +19444,19 @@ web3-core@1.2.9: web3-core-requestmanager "1.2.9" web3-utils "1.2.9" +web3-core@1.3.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.3.5.tgz#1e9335e6c4549dac09aaa07157242ebd6d097226" + integrity sha512-VQjTvnGTqJwDwjKEHSApea3RmgtFGLDSJ6bqrOyHROYNyTyKYjFQ/drG9zs3rjDkND9mgh8foI1ty37Qua3QCQ== + dependencies: + "@types/bn.js" "^4.11.5" + "@types/node" "^12.12.6" + bignumber.js "^9.0.0" + web3-core-helpers "1.3.5" + web3-core-method "1.3.5" + web3-core-requestmanager "1.3.5" + web3-utils "1.3.5" + web3-eth-abi@1.2.11: version "1.2.11" resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.2.11.tgz#a887494e5d447c2926d557a3834edd66e17af9b0" @@ -13612,6 +19475,15 @@ web3-eth-abi@1.2.9: underscore "1.9.1" web3-utils "1.2.9" +web3-eth-abi@1.3.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.3.5.tgz#eeffab0a4b318c47b8777de90983ca45614f8173" + integrity sha512-bkbG2v/mOW5DH6rF/SEgqunusjYoEi2IBw+fkmD3rzWDaEY7+/i1xY94AeO257d06QMgld75GtV/N+aEs7A6vQ== + dependencies: + "@ethersproject/abi" "5.0.7" + underscore "1.9.1" + web3-utils "1.3.5" + web3-eth-accounts@1.2.11: version "1.2.11" resolved "https://registry.yarnpkg.com/web3-eth-accounts/-/web3-eth-accounts-1.2.11.tgz#a9e3044da442d31903a7ce035a86d8fa33f90520" @@ -13646,6 +19518,23 @@ web3-eth-accounts@1.2.9: web3-core-method "1.2.9" web3-utils "1.2.9" +web3-eth-accounts@1.3.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/web3-eth-accounts/-/web3-eth-accounts-1.3.5.tgz#c23ee748759a6a06d6485a9322b106baa944dcdd" + integrity sha512-r3WOR21rgm6Cd6OFnifr3Tizdm5K+g2TsSOPySwX4FrgLrYDL6ck4zr5VXUPz+llpSExb/JztpE8pqEHr3U2NA== + dependencies: + crypto-browserify "3.12.0" + eth-lib "0.2.8" + ethereumjs-common "^1.3.2" + ethereumjs-tx "^2.1.1" + scrypt-js "^3.0.1" + underscore "1.9.1" + uuid "3.3.2" + web3-core "1.3.5" + web3-core-helpers "1.3.5" + web3-core-method "1.3.5" + web3-utils "1.3.5" + web3-eth-contract@1.2.11: version "1.2.11" resolved "https://registry.yarnpkg.com/web3-eth-contract/-/web3-eth-contract-1.2.11.tgz#917065902bc27ce89da9a1da26e62ef663663b90" @@ -13676,6 +19565,21 @@ web3-eth-contract@1.2.9: web3-eth-abi "1.2.9" web3-utils "1.2.9" +web3-eth-contract@1.3.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/web3-eth-contract/-/web3-eth-contract-1.3.5.tgz#b41ecf8612b379c4fb1c614e950135717aa8f919" + integrity sha512-WfGVeQquN3D7Qm+KEIN9EI7yrm/fL2V9Y4+YhDWiKA/ns1pX1LYcEWojTOnBXCnPF3tcvoKKL+KBxXg1iKm38A== + dependencies: + "@types/bn.js" "^4.11.5" + underscore "1.9.1" + web3-core "1.3.5" + web3-core-helpers "1.3.5" + web3-core-method "1.3.5" + web3-core-promievent "1.3.5" + web3-core-subscriptions "1.3.5" + web3-eth-abi "1.3.5" + web3-utils "1.3.5" + web3-eth-ens@1.2.11: version "1.2.11" resolved "https://registry.yarnpkg.com/web3-eth-ens/-/web3-eth-ens-1.2.11.tgz#26d4d7f16d6cbcfff918e39832b939edc3162532" @@ -13706,6 +19610,21 @@ web3-eth-ens@1.2.9: web3-eth-contract "1.2.9" web3-utils "1.2.9" +web3-eth-ens@1.3.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/web3-eth-ens/-/web3-eth-ens-1.3.5.tgz#5a28d23eb402fb1f6964da60ea60641e4d24d366" + integrity sha512-5bkpFTXV18CvaVP8kCbLZZm2r1TWUv9AsXH+80yz8bTZulUGvXsBMRfK6e5nfEr2Yv59xlIXCFoalmmySI9EJw== + dependencies: + content-hash "^2.5.2" + eth-ens-namehash "2.0.8" + underscore "1.9.1" + web3-core "1.3.5" + web3-core-helpers "1.3.5" + web3-core-promievent "1.3.5" + web3-eth-abi "1.3.5" + web3-eth-contract "1.3.5" + web3-utils "1.3.5" + web3-eth-iban@1.2.11: version "1.2.11" resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.2.11.tgz#f5f73298305bc7392e2f188bf38a7362b42144ef" @@ -13722,6 +19641,14 @@ web3-eth-iban@1.2.9: bn.js "4.11.8" web3-utils "1.2.9" +web3-eth-iban@1.3.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.3.5.tgz#dff1e37864e23a3387016ec4db96cdc290a6fbd6" + integrity sha512-x+BI/d2Vt0J1cKK8eFd4W0f1TDjgEOYCwiViTb28lLE+tqrgyPqWDA+l6UlKYLF/yMFX3Dym4ofcCOtgcn4q4g== + dependencies: + bn.js "^4.11.9" + web3-utils "1.3.5" + web3-eth-personal@1.2.11: version "1.2.11" resolved "https://registry.yarnpkg.com/web3-eth-personal/-/web3-eth-personal-1.2.11.tgz#a38b3942a1d87a62070ce0622a941553c3d5aa70" @@ -13746,6 +19673,18 @@ web3-eth-personal@1.2.9: web3-net "1.2.9" web3-utils "1.2.9" +web3-eth-personal@1.3.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/web3-eth-personal/-/web3-eth-personal-1.3.5.tgz#bc5d5b900bc4824139af2ef01eaf8e9855c644ba" + integrity sha512-xELQHNZ8p3VoO1582ghCaq+Bx7pSkOOalc6/ACOCGtHDMelqgVejrmSIZGScYl+k0HzngmQAzURZWQocaoGM1g== + dependencies: + "@types/node" "^12.12.6" + web3-core "1.3.5" + web3-core-helpers "1.3.5" + web3-core-method "1.3.5" + web3-net "1.3.5" + web3-utils "1.3.5" + web3-eth@1.2.11: version "1.2.11" resolved "https://registry.yarnpkg.com/web3-eth/-/web3-eth-1.2.11.tgz#4c81fcb6285b8caf544058fba3ae802968fdc793" @@ -13784,6 +19723,25 @@ web3-eth@1.2.9: web3-net "1.2.9" web3-utils "1.2.9" +web3-eth@1.3.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/web3-eth/-/web3-eth-1.3.5.tgz#2a3d0db870ef7921942a5d798ba0569175cc4de1" + integrity sha512-5qqDPMMD+D0xRqOV2ePU2G7/uQmhn0FgCEhFzKDMHrssDQJyQLW/VgfA0NLn64lWnuUrGnQStGvNxrWf7MgsfA== + dependencies: + underscore "1.9.1" + web3-core "1.3.5" + web3-core-helpers "1.3.5" + web3-core-method "1.3.5" + web3-core-subscriptions "1.3.5" + web3-eth-abi "1.3.5" + web3-eth-accounts "1.3.5" + web3-eth-contract "1.3.5" + web3-eth-ens "1.3.5" + web3-eth-iban "1.3.5" + web3-eth-personal "1.3.5" + web3-net "1.3.5" + web3-utils "1.3.5" + web3-net@1.2.11: version "1.2.11" resolved "https://registry.yarnpkg.com/web3-net/-/web3-net-1.2.11.tgz#eda68ef25e5cdb64c96c39085cdb74669aabbe1b" @@ -13802,6 +19760,15 @@ web3-net@1.2.9: web3-core-method "1.2.9" web3-utils "1.2.9" +web3-net@1.3.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/web3-net/-/web3-net-1.3.5.tgz#06e3465a9fbbeec1240160e2fd66ddb07b6af944" + integrity sha512-usbFbuUpKK8s7jPLGoUzi/WpNnefGFPTj948aJv8BZ04UQA4L/XS5NNkkhk358zNMmhGfEFW8wrWy+0Oy0njtA== + dependencies: + web3-core "1.3.5" + web3-core-method "1.3.5" + web3-utils "1.3.5" + web3-provider-engine@14.2.1: version "14.2.1" resolved "https://registry.yarnpkg.com/web3-provider-engine/-/web3-provider-engine-14.2.1.tgz#ef351578797bf170e08d529cb5b02f8751329b95" @@ -13844,6 +19811,14 @@ web3-providers-http@1.2.9: web3-core-helpers "1.2.9" xhr2-cookies "1.1.0" +web3-providers-http@1.3.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/web3-providers-http/-/web3-providers-http-1.3.5.tgz#cdada6fb342e08fd75aea249fceb6eee467beffc" + integrity sha512-ZQOmceFjcajEZdiuqciXjijwIYWNmEJ1oxMtbrwB2eGxHRCMXEH2xGRUZuhOFNF88yQC/VXVi14yvYg5ZlFJlA== + dependencies: + web3-core-helpers "1.3.5" + xhr2-cookies "1.1.0" + web3-providers-ipc@1.2.11: version "1.2.11" resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.2.11.tgz#d16d6c9be1be6e0b4f4536c4acc16b0f4f27ef21" @@ -13862,6 +19837,15 @@ web3-providers-ipc@1.2.9: underscore "1.9.1" web3-core-helpers "1.2.9" +web3-providers-ipc@1.3.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.3.5.tgz#2f5536abfe03f3824e00dedc614d8f46db72b57f" + integrity sha512-cbZOeb/sALiHjzMolJjIyHla/J5wdL2JKUtRO66Nh/uLALBCpU8JUgzNvpAdJ1ae3+A33+EdFStdzuDYHKtQew== + dependencies: + oboe "2.1.5" + underscore "1.9.1" + web3-core-helpers "1.3.5" + web3-providers-ws@1.2.11: version "1.2.11" resolved "https://registry.yarnpkg.com/web3-providers-ws/-/web3-providers-ws-1.2.11.tgz#a1dfd6d9778d840561d9ec13dd453046451a96bb" @@ -13882,6 +19866,16 @@ web3-providers-ws@1.2.9: web3-core-helpers "1.2.9" websocket "^1.0.31" +web3-providers-ws@1.3.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/web3-providers-ws/-/web3-providers-ws-1.3.5.tgz#7f841ec79358d90c4a803d1291157b5ffb15aeb7" + integrity sha512-zeZ4LMvKhYaJBDCqA//Bzgp4r/T0tNq5U/xvN0axA4YflzF7yqlsbzGwCkcZYDbrUaK3Ltl2uOmvwjbWALOZ1A== + dependencies: + eventemitter3 "4.0.4" + underscore "1.9.1" + web3-core-helpers "1.3.5" + websocket "^1.0.32" + web3-shh@1.2.11: version "1.2.11" resolved "https://registry.yarnpkg.com/web3-shh/-/web3-shh-1.2.11.tgz#f5d086f9621c9a47e98d438010385b5f059fd88f" @@ -13902,6 +19896,16 @@ web3-shh@1.2.9: web3-core-subscriptions "1.2.9" web3-net "1.2.9" +web3-shh@1.3.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/web3-shh/-/web3-shh-1.3.5.tgz#af0b8ebca90a3652dbbb90d351395f36ca91f40b" + integrity sha512-aRwzCduXvuGVslLL/Y15VcOHa70Qr2kxZI7UwOzQVhaaOdxuRRvo3AK/cmyln1Tsd54/n93Yk8I3qg5I2+6alw== + dependencies: + web3-core "1.3.5" + web3-core-method "1.3.5" + web3-core-subscriptions "1.3.5" + web3-net "1.3.5" + web3-utils@1.2.11: version "1.2.11" resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.2.11.tgz#af1942aead3fb166ae851a985bed8ef2c2d95a82" @@ -13930,10 +19934,10 @@ web3-utils@1.2.9: underscore "1.9.1" utf8 "3.0.0" -web3-utils@^1.0.0-beta.31, web3-utils@^1.3.0: - version "1.3.4" - resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.3.4.tgz#9b1aa30d7549f860b573e7bb7e690999e7192198" - integrity sha512-/vC2v0MaZNpWooJfpRw63u0Y3ag2gNjAWiLtMSL6QQLmCqCy4SQIndMt/vRyx0uMoeGt1YTwSXEcHjUzOhLg0A== +web3-utils@1.3.5, web3-utils@^1.3.4: + version "1.3.5" + resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.3.5.tgz#14ee2ff1a7a226867698d6eaffd21aa97aed422e" + integrity sha512-5apMRm8ElYjI/92GHqijmaLC+s+d5lgjpjHft+rJSs/dsnX8I8tQreqev0dmU+wzU+2EEe4Sx9a/OwGWHhQv3A== dependencies: bn.js "^4.11.9" eth-lib "0.2.8" @@ -13944,10 +19948,10 @@ web3-utils@^1.0.0-beta.31, web3-utils@^1.3.0: underscore "1.9.1" utf8 "3.0.0" -web3-utils@^1.3.4: - version "1.3.5" - resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.3.5.tgz#14ee2ff1a7a226867698d6eaffd21aa97aed422e" - integrity sha512-5apMRm8ElYjI/92GHqijmaLC+s+d5lgjpjHft+rJSs/dsnX8I8tQreqev0dmU+wzU+2EEe4Sx9a/OwGWHhQv3A== +web3-utils@^1.0.0-beta.31, web3-utils@^1.3.0: + version "1.3.4" + resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.3.4.tgz#9b1aa30d7549f860b573e7bb7e690999e7192198" + integrity sha512-/vC2v0MaZNpWooJfpRw63u0Y3ag2gNjAWiLtMSL6QQLmCqCy4SQIndMt/vRyx0uMoeGt1YTwSXEcHjUzOhLg0A== dependencies: bn.js "^4.11.9" eth-lib "0.2.8" @@ -13984,6 +19988,24 @@ web3@1.2.9: web3-shh "1.2.9" web3-utils "1.2.9" +web3@1.3.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/web3/-/web3-1.3.5.tgz#ef4c3a2241fdd74f2f7794e839f30bc6f9814e46" + integrity sha512-UyQW/MT5EIGBrXPCh/FDIaD7RtJTn5/rJUNw2FOglp0qoXnCQHNKvntiR1ylztk05fYxIF6UgsC76IrazlKJjw== + dependencies: + web3-bzz "1.3.5" + web3-core "1.3.5" + web3-eth "1.3.5" + web3-eth-personal "1.3.5" + web3-net "1.3.5" + web3-shh "1.3.5" + web3-utils "1.3.5" + +webidl-conversions@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-2.0.1.tgz#3bf8258f7d318c7443c36f2e169402a1a6703506" + integrity sha1-O/glj30xjHRDw28uFpQCoaZwNQY= + webidl-conversions@^6.1.0: version "6.1.0" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-6.1.0.tgz#9111b4d7ea80acd40f5270d666621afa78b69514" @@ -14013,11 +20035,41 @@ websocket@^1.0.31: utf-8-validate "^5.0.2" yaeti "^0.0.6" +websocket@^1.0.32: + version "1.0.34" + resolved "https://registry.yarnpkg.com/websocket/-/websocket-1.0.34.tgz#2bdc2602c08bf2c82253b730655c0ef7dcab3111" + integrity sha512-PRDso2sGwF6kM75QykIesBijKSVceR6jL2G8NGYyq2XrItNC2P5/qL5XeR056GhA+Ly7JMFvJb9I312mJfmqnQ== + dependencies: + bufferutil "^4.0.1" + debug "^2.2.0" + es5-ext "^0.10.50" + typedarray-to-buffer "^3.1.5" + utf-8-validate "^5.0.2" + yaeti "^0.0.6" + +websql@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/websql/-/websql-1.0.0.tgz#1bd00b27392893134715d5dd6941fd89e730bab5" + integrity sha512-7iZ+u28Ljw5hCnMiq0BCOeSYf0vCFQe/ORY0HgscTiKjQed8WqugpBUggJ2NTnB9fahn1kEnPRX2jf8Px5PhJw== + dependencies: + argsarray "^0.0.1" + immediate "^3.2.2" + noop-fn "^1.0.0" + sqlite3 "^4.0.0" + tiny-queue "^0.2.1" + whatwg-fetch@2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz#dde6a5df315f9d39991aa17621853d720b85566f" integrity sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng== +whatwg-url-compat@~0.6.5: + version "0.6.5" + resolved "https://registry.yarnpkg.com/whatwg-url-compat/-/whatwg-url-compat-0.6.5.tgz#00898111af689bb097541cd5a45ca6c8798445bf" + integrity sha1-AImBEa9om7CXVBzVpFymyHmERb8= + dependencies: + tr46 "~0.0.1" + whatwg-url@^8.4.0: version "8.5.0" resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.5.0.tgz#7752b8464fc0903fec89aa9846fc9efe07351fd3" @@ -14061,6 +20113,19 @@ which-pm@2.0.0: load-yaml-file "^0.2.0" path-exists "^4.0.0" +which-typed-array@^1.1.2: + version "1.1.4" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.4.tgz#8fcb7d3ee5adf2d771066fba7cf37e32fe8711ff" + integrity sha512-49E0SpUe90cjpoc7BOJwyPHRqSAd12c10Qm2amdEZrJPCY2NDxaW01zHITrem+rnETY3dwrbH3UUrUwagfCYDA== + dependencies: + available-typed-arrays "^1.0.2" + call-bind "^1.0.0" + es-abstract "^1.18.0-next.1" + foreach "^2.0.5" + function-bind "^1.1.1" + has-symbols "^1.0.1" + is-typed-array "^1.1.3" + which@1.3.1, which@^1.1.1, which@^1.2.9, which@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" @@ -14089,6 +20154,13 @@ widest-line@^2.0.0: dependencies: string-width "^2.1.1" +wif@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/wif/-/wif-2.0.6.tgz#08d3f52056c66679299726fade0d432ae74b4704" + integrity sha1-CNP1IFbGZnkplyb63g1DKudLRwQ= + dependencies: + bs58check "<3.0.0" + window-size@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.2.0.tgz#b4315bb4214a3d7058ebeee892e13fa24d98b075" @@ -14104,6 +20176,11 @@ wordwrap@^1.0.0: resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= +workerpool@6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.0.0.tgz#85aad67fa1a2c8ef9386a1b43539900f61d03d58" + integrity sha512-fU2OcNA/GVAJLLyKUoHkAgIhKb0JoCpSjLC/G2vYKxUjVmQwGbRVeoPJ1a8U4pnVofz4AQV5Y/NEw8oKqxEBtA== + workerpool@6.1.0: version "6.1.0" resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.1.0.tgz#a8e038b4c94569596852de7a8ea4228eefdeb37b" @@ -14149,7 +20226,7 @@ wrappy@1: resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= -write-file-atomic@^2.4.2: +write-file-atomic@^2.0.0, write-file-atomic@^2.4.2: version "2.4.3" resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.4.3.tgz#1fd2e9ae1df3e75b8d8c367443c692d4ca81f481" integrity sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ== @@ -14201,11 +20278,30 @@ write-pkg@^4.0.0: type-fest "^0.4.1" write-json-file "^3.2.0" +write-stream@~0.4.3: + version "0.4.3" + resolved "https://registry.yarnpkg.com/write-stream/-/write-stream-0.4.3.tgz#83cc8c0347d0af6057a93862b4e3ae01de5c81c1" + integrity sha1-g8yMA0fQr2BXqThitOOuAd5cgcE= + dependencies: + readable-stream "~0.0.2" + +ws@7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.1.0.tgz#0395646c6fcc3ac56abf61ce1a42039637a6bd98" + integrity sha512-Swie2C4fs7CkwlHu1glMePLYJJsWjzhl1vm3ZaLplD0h7OMkZyZ6kLTB/OagiU923bZrPFXuDTeEqaEN4NWG4g== + dependencies: + async-limiter "^1.0.0" + ws@7.2.3: version "7.2.3" resolved "https://registry.yarnpkg.com/ws/-/ws-7.2.3.tgz#a5411e1fb04d5ed0efee76d26d5c46d830c39b46" integrity sha512-HTDl9G9hbkNDk98naoR/cHDws7+EyYMOdL1BmjsZXRUjf7d+MficC4B7HLUPlSiho0vg+CWKrGIt/VJBd1xunQ== +ws@7.4.5, ws@^7.3.1, ws@^7.4.3: + version "7.4.5" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.5.tgz#a484dd851e9beb6fdb420027e3885e8ce48986c1" + integrity sha512-xzyu3hFvomRfXKH8vOFMU3OguG6oOvhXMo3xsGy3xWExqaM2dxBbVxuD99O7m3ZUFMvvscsZDqxfgMaRr/Nr1g== + ws@^3.0.0: version "3.3.3" resolved "https://registry.yarnpkg.com/ws/-/ws-3.3.3.tgz#f1cf84fe2d5e901ebce94efaece785f187a228f2" @@ -14215,18 +20311,30 @@ ws@^3.0.0: safe-buffer "~5.1.0" ultron "~1.1.0" -ws@^5.1.1: +ws@^5.1.1, ws@^5.2.0, ws@^5.2.2: version "5.2.2" resolved "https://registry.yarnpkg.com/ws/-/ws-5.2.2.tgz#dffef14866b8e8dc9133582514d1befaf96e980f" integrity sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA== dependencies: async-limiter "~1.0.0" +ws@^6.0.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.1.tgz#442fdf0a47ed64f59b6a5d8ff130f4748ed524fb" + integrity sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA== + dependencies: + async-limiter "~1.0.0" + ws@^7.2.1: version "7.4.4" resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.4.tgz#383bc9742cb202292c9077ceab6f6047b17f2d59" integrity sha512-Qm8k8ojNQIMx7S+Zp8u/uHOx7Qazv3Yv4q68MiWWWOJhiwG5W3x7iqmRtJo8xxrciZUY4vRxUTJCKuRnF28ZZw== +xdg-basedir@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4" + integrity sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ= + xhr-request-promise@^0.1.2: version "0.1.3" resolved "https://registry.yarnpkg.com/xhr-request-promise/-/xhr-request-promise-0.1.3.tgz#2d5f4b16d8c6c893be97f1a62b0ed4cf3ca5f96c" @@ -14264,12 +20372,25 @@ xhr@^2.0.4, xhr@^2.2.0, xhr@^2.3.3: parse-headers "^2.0.0" xtend "^4.0.0" +"xml-name-validator@>= 2.0.1 < 3.0.0": + version "2.0.1" + resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-2.0.1.tgz#4d8b8f1eccd3419aa362061becef515e1e559635" + integrity sha1-TYuPHszTQZqjYgYb7O9RXh5VljU= + xmlhttprequest@1.8.0: version "1.8.0" resolved "https://registry.yarnpkg.com/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz#67fe075c5c24fef39f9d65f5f7b7fe75171968fc" integrity sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw= -xtend@^4.0.0, xtend@^4.0.1, xtend@^4.0.2, xtend@~4.0.0, xtend@~4.0.1: +xss@^1.0.8: + version "1.0.9" + resolved "https://registry.yarnpkg.com/xss/-/xss-1.0.9.tgz#3ffd565571ff60d2e40db7f3b80b4677bec770d2" + integrity sha512-2t7FahYnGJys6DpHLhajusId7R0Pm2yTmuL0GV9+mV0ZlaLSnb2toBmppATfg5sWIhZQGlsTLoecSzya+l4EAQ== + dependencies: + commander "^2.20.3" + cssfilter "0.0.10" + +"xtend@>=4.0.0 <4.1.0-0", xtend@^4.0.0, xtend@^4.0.1, xtend@^4.0.2, xtend@~4.0.0, xtend@~4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== @@ -14334,6 +20455,14 @@ yargs-parser@20.2.4: resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== +yargs-parser@^15.0.1: + version "15.0.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-15.0.1.tgz#54786af40b820dcb2fb8025b11b4d659d76323b3" + integrity sha512-0OAMV2mAZQrs3FkNpDQcBk1x5HXb8X4twADss4S0Iuk+2dGnLOE/fRHrsYm542GduMveyA77OF4wrNJuanRCWw== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + yargs-parser@^18.1.2, yargs-parser@^18.1.3: version "18.1.3" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" @@ -14342,7 +20471,7 @@ yargs-parser@^18.1.2, yargs-parser@^18.1.3: camelcase "^5.0.0" decamelize "^1.2.0" -yargs-parser@^2.4.1: +yargs-parser@^2.4.0, yargs-parser@^2.4.1: version "2.4.1" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-2.4.1.tgz#85568de3cf150ff49fa51825f03a8c880ddcc5c4" integrity sha1-hVaN488VD/SfpRgl8DqMiA3cxcQ= @@ -14364,6 +20493,17 @@ yargs-unparser@1.6.0: lodash "^4.17.15" yargs "^13.3.0" +yargs-unparser@1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-1.6.1.tgz#bd4b0ee05b4c94d058929c32cb09e3fce71d3c5f" + integrity sha512-qZV14lK9MWsGCmcr7u5oXGH0dbGqZAIxTDrWXZDo5zUr6b6iUmelNKO6x6R1dQT24AH3LgRxJpr8meWy2unolA== + dependencies: + camelcase "^5.3.1" + decamelize "^1.2.0" + flat "^4.1.0" + is-plain-obj "^1.1.0" + yargs "^14.2.3" + yargs-unparser@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" @@ -14420,7 +20560,42 @@ yargs@16.2.0, yargs@^16.1.0, yargs@^16.2.0: y18n "^5.0.5" yargs-parser "^20.2.2" -yargs@^15.1.0: +yargs@4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-4.6.0.tgz#cb4050c0159bfb6bb649c0f4af550526a84619dc" + integrity sha1-y0BQwBWb+2u2ScD0r1UFJqhGGdw= + dependencies: + camelcase "^2.0.1" + cliui "^3.2.0" + decamelize "^1.1.1" + lodash.assign "^4.0.3" + os-locale "^1.4.0" + pkg-conf "^1.1.2" + read-pkg-up "^1.0.1" + require-main-filename "^1.0.1" + string-width "^1.0.1" + window-size "^0.2.0" + y18n "^3.2.1" + yargs-parser "^2.4.0" + +yargs@^14.2.3: + version "14.2.3" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-14.2.3.tgz#1a1c3edced1afb2a2fea33604bc6d1d8d688a414" + integrity sha512-ZbotRWhF+lkjijC/VhmOT9wSgyBQ7+zr13+YLkhfsSiTriYsMzkTUFP18pFhWwBeMa5gUc1MzbhrO6/VB7c9Xg== + dependencies: + cliui "^5.0.0" + decamelize "^1.2.0" + find-up "^3.0.0" + get-caller-file "^2.0.1" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^3.0.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^15.0.1" + +yargs@^15.1.0, yargs@^15.3.1: version "15.4.1" resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== @@ -14471,3 +20646,16 @@ yocto-queue@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== + +zen-observable-ts@^0.8.21: + version "0.8.21" + resolved "https://registry.yarnpkg.com/zen-observable-ts/-/zen-observable-ts-0.8.21.tgz#85d0031fbbde1eba3cd07d3ba90da241215f421d" + integrity sha512-Yj3yXweRc8LdRMrCC8nIc4kkjWecPAUVh0TI0OUrWXx6aX790vLcDlWca6I4vsyCGH3LpWxq0dJRcMOFoVqmeg== + dependencies: + tslib "^1.9.3" + zen-observable "^0.8.0" + +zen-observable@^0.8.0, zen-observable@^0.8.14: + version "0.8.15" + resolved "https://registry.yarnpkg.com/zen-observable/-/zen-observable-0.8.15.tgz#96415c512d8e3ffd920afd3889604e30b9eaac15" + integrity sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ== From fa4898aaf42143e5b0da88196f4a125d5cf45c33 Mon Sep 17 00:00:00 2001 From: Mark Tyneway Date: Tue, 11 May 2021 23:08:57 -0700 Subject: [PATCH 68/81] fix: logging error messages and stack (#843) * batch-submitter: log error explicitly * data-transport-layer: log error explicitly * message-relayer: log error explicitly * chore: add changeset --- .changeset/short-ducks-type.md | 7 +++++++ .../src/exec/run-batch-submitter.ts | 12 ++++++++++-- .../src/services/l2-ingestion/service.ts | 7 +++++-- packages/message-relayer/src/service.ts | 18 +++++++++++++++--- 4 files changed, 37 insertions(+), 7 deletions(-) create mode 100644 .changeset/short-ducks-type.md diff --git a/.changeset/short-ducks-type.md b/.changeset/short-ducks-type.md new file mode 100644 index 0000000000000..6eb7a1e38e258 --- /dev/null +++ b/.changeset/short-ducks-type.md @@ -0,0 +1,7 @@ +--- +'@eth-optimism/batch-submitter': patch +'@eth-optimism/data-transport-layer': patch +'@eth-optimism/message-relayer': patch +--- + +Explicitly log error messages so that they do not show as empty objects diff --git a/packages/batch-submitter/src/exec/run-batch-submitter.ts b/packages/batch-submitter/src/exec/run-batch-submitter.ts index 9e4108af5ac1b..00319f59330b0 100644 --- a/packages/batch-submitter/src/exec/run-batch-submitter.ts +++ b/packages/batch-submitter/src/exec/run-batch-submitter.ts @@ -286,7 +286,11 @@ export const run = async () => { } } } catch (err) { - logger.error('Cannot clear transactions', { err }) + logger.error('Cannot clear transactions', { + message: err.toString(), + stack: err.stack, + code: err.code, + }) process.exit(1) } } @@ -295,7 +299,11 @@ export const run = async () => { try { await func() } catch (err) { - logger.error('Error submitting batch', { err }) + logger.error('Error submitting batch', { + message: err.toString(), + stack: err.stack, + code: err.code, + }) logger.info('Retrying...') } // Sleep diff --git a/packages/data-transport-layer/src/services/l2-ingestion/service.ts b/packages/data-transport-layer/src/services/l2-ingestion/service.ts index 052122b476c27..120bb35ad7341 100644 --- a/packages/data-transport-layer/src/services/l2-ingestion/service.ts +++ b/packages/data-transport-layer/src/services/l2-ingestion/service.ts @@ -115,10 +115,13 @@ export class L2IngestionService extends BaseService { } } catch (err) { if (!this.running || this.options.dangerouslyCatchAllErrors) { - this.logger.error('Caught an unhandled error', { err }) + this.logger.error('Caught an unhandled error', { + message: err.toString(), + stack: err.stack, + code: err.code, + }) await sleep(this.options.pollingInterval) } else { - // TODO: Is this the best thing to do here? throw err } } diff --git a/packages/message-relayer/src/service.ts b/packages/message-relayer/src/service.ts index 497a222563a3c..e5f51675fee7b 100644 --- a/packages/message-relayer/src/service.ts +++ b/packages/message-relayer/src/service.ts @@ -243,7 +243,11 @@ export class MessageRelayerService extends BaseService { } ) } catch (err) { - this.logger.error('Caught an unhandled error', { err }) + this.logger.error('Caught an unhandled error', { + message: err.toString(), + stack: err.stack, + code: err.code, + }) } } } @@ -490,7 +494,11 @@ export class MessageRelayerService extends BaseService { 'Proof should succeed. Submitting for real this time...' ) } catch (err) { - this.logger.error('Proof would fail, skipping', { err }) + this.logger.error('Proof would fail, skipping', { + message: err.toString(), + stack: err.stack, + code: err.code, + }) return } @@ -522,7 +530,11 @@ export class MessageRelayerService extends BaseService { status: receipt.status, }) } catch (err) { - this.logger.error('Real relay attempt failed, skipping.', { err }) + this.logger.error('Real relay attempt failed, skipping.', { + message: err.toString(), + stack: err.stack, + code: err.code, + }) return } this.logger.info('Message successfully relayed to Layer 1!') From e88e85d1ee2449d636a9315d25a9a2afdae5494f Mon Sep 17 00:00:00 2001 From: platocrat <37757724+platocrat@users.noreply.github.com> Date: Wed, 12 May 2021 09:11:43 -0700 Subject: [PATCH 69/81] example: get revert msgs for hardhat (#841) * example: get revert msgs for hardhat * fix: remove chai-as-promised dep and logic * re-add @types/mocha and @types/chai * Update examples/hardhat/package.json Co-authored-by: smartcontracts --- examples/hardhat/hardhat.config.js | 2 +- examples/hardhat/package.json | 6 +++--- examples/hardhat/test/erc20.test.js | 21 ++++++++++++--------- 3 files changed, 16 insertions(+), 13 deletions(-) diff --git a/examples/hardhat/hardhat.config.js b/examples/hardhat/hardhat.config.js index c42677ecf5f87..bd5aa89e526ff 100644 --- a/examples/hardhat/hardhat.config.js +++ b/examples/hardhat/hardhat.config.js @@ -1,7 +1,7 @@ require('@nomiclabs/hardhat-ethers') require('@nomiclabs/hardhat-waffle') require('hardhat-deploy') -require("@eth-optimism/hardhat-ovm") +require('@eth-optimism/hardhat-ovm') module.exports = { networks: { diff --git a/examples/hardhat/package.json b/examples/hardhat/package.json index e398dd84f1cb9..f6b4cde125dee 100644 --- a/examples/hardhat/package.json +++ b/examples/hardhat/package.json @@ -14,18 +14,18 @@ "clean": "rimraf ./cache-ovm ./cache ./artifacts-ovm ./artifacts ./deployments" }, "devDependencies": { - "@eth-optimism/hardhat-ovm": "^0.2.0", "@nomiclabs/hardhat-ethers": "^2.0.1", "@nomiclabs/hardhat-waffle": "^2.0.1", "@types/chai": "4.2.17", - "@types/chai-as-promised": "^7.1.3", "@types/mocha": "^8.2.2", "chai": "4.3.4", - "chai-as-promised": "^7.1.1", "ethereum-waffle": "^3.3.0", "ethers": "^5.1.4", "hardhat": "^2.2.0", "hardhat-deploy": "^0.7.5", "mocha": "^8.2.1" + }, + "dependencies": { + "@eth-optimism/hardhat-ovm": "^0.2.0" } } diff --git a/examples/hardhat/test/erc20.test.js b/examples/hardhat/test/erc20.test.js index ffae27d24f894..974e80fb74109 100644 --- a/examples/hardhat/test/erc20.test.js +++ b/examples/hardhat/test/erc20.test.js @@ -1,7 +1,10 @@ /* External Imports */ -const { ethers } = require('hardhat') -const { expect } = require('chai') +const { ethers, network } = require('hardhat') +const chai = require('chai') +const { solidity } = require('ethereum-waffle') +const { expect } = chai +chai.use(solidity) describe(`ERC20`, () => { const INITIAL_SUPPLY = 1000000 @@ -43,15 +46,15 @@ describe(`ERC20`, () => { it(`should revert when the sender does not have enough balance`, async () => { const tx = ERC20.connect(account1).transfer( await account2.getAddress(), - INITIAL_SUPPLY + 1, + INITIAL_SUPPLY + 1 ) - await expect(tx).to.be.reverted + await expect(tx).to.be.revertedWith("You don't have enough balance to make this transfer!") }) it(`should succeed when the sender has enough balance`, async () => { const tx = await ERC20.connect(account1).transfer( await account2.getAddress(), - INITIAL_SUPPLY, + INITIAL_SUPPLY ) await tx.wait() @@ -73,22 +76,22 @@ describe(`ERC20`, () => { const tx = ERC20.connect(account2).transferFrom( await account1.getAddress(), await account2.getAddress(), - INITIAL_SUPPLY, + INITIAL_SUPPLY ) - await expect(tx).to.be.reverted + await expect(tx).to.be.revertedWith("Can't transfer from the desired account because you don't have enough of an allowance.") }) it(`should succeed when the owner has enough balance and the sender has a large enough allowance`, async () => { const tx1 = await ERC20.connect(account1).approve( await account2.getAddress(), - INITIAL_SUPPLY, + INITIAL_SUPPLY ) await tx1.wait() const tx2 = await ERC20.connect(account2).transferFrom( await account1.getAddress(), await account2.getAddress(), - INITIAL_SUPPLY, + INITIAL_SUPPLY ) await tx2.wait() From 63f2cdd415c1b8d5e0075bf0aa3ab3ff6b68e18e Mon Sep 17 00:00:00 2001 From: Karl Floersch Date: Wed, 12 May 2021 10:29:33 -0700 Subject: [PATCH 70/81] feat: update mainnet deployment (#838) * Update mainnet deployment * Remove old unused contracts * chore: regenerate readme * Change : to - in deploy files Co-authored-by: Georgios Konstantopoulos Co-authored-by: Mark Tyneway Co-authored-by: platocrat <37757724+platocrat@users.noreply.github.com> --- packages/contracts/deployments/README.md | 82 +++- .../mainnet/Lib_AddressManager.json | 87 ++-- .../OVM_CanonicalTransactionChain.json | 59 +-- ...OVM_ChainStorageContainer-CTC-batches.json | 77 ++-- .../OVM_ChainStorageContainer-CTC-queue.json | 77 ++-- ...OVM_ChainStorageContainer-SCC-batches.json | 77 ++-- .../mainnet/OVM_ExecutionManager.json | 156 +++---- .../mainnet/OVM_FraudVerifier.json | 61 +-- .../mainnet/OVM_L1CrossDomainMessenger.json | 380 ++++++++++++++++-- .../deployments/mainnet/OVM_L1ETHGateway.json | 85 +++- .../mainnet/OVM_L1MultiMessageRelayer.json | 56 ++- .../mainnet/OVM_SafetyChecker.json | 30 +- .../mainnet/OVM_StateCommitmentChain.json | 57 +-- .../mainnet/OVM_StateManagerFactory.json | 30 +- .../mainnet/OVM_StateTransitionerFactory.json | 51 ++- .../Proxy__OVM_L1CrossDomainMessenger.json | 42 +- .../mainnet/Proxy__OVM_L1ETHGateway.json | 42 +- .../mainnet/mockOVM_BondManager.json | 55 ++- .../f2bdab652d5102f5f11e78dae866798d.json | 308 ++++++++++++++ 19 files changed, 1333 insertions(+), 479 deletions(-) create mode 100644 packages/contracts/deployments/mainnet/solcInputs/f2bdab652d5102f5f11e78dae866798d.json diff --git a/packages/contracts/deployments/README.md b/packages/contracts/deployments/README.md index 616ac2fcacb8a..3de3435179e12 100644 --- a/packages/contracts/deployments/README.md +++ b/packages/contracts/deployments/README.md @@ -31,25 +31,48 @@ Network : __mainnet (chain id: 1)__ |Contract|Address| |--|--| -|Lib_AddressManager|[0xd3EeD86464Ff13B4BFD81a3bB1e753b7ceBA3A39](https://etherscan.io/address/0xd3EeD86464Ff13B4BFD81a3bB1e753b7ceBA3A39)| -|OVM_CanonicalTransactionChain|[0x405B4008Da75C48F4E54AA39607378967Ae62338](https://etherscan.io/address/0x405B4008Da75C48F4E54AA39607378967Ae62338)| -|OVM_ChainStorageContainer-CTC-batches|[0x65E921eE201E4a0881FF84ea462baB744bB2fbf0](https://etherscan.io/address/0x65E921eE201E4a0881FF84ea462baB744bB2fbf0)| -|OVM_ChainStorageContainer-CTC-queue|[0x03004C447722d207B0355529A6d0dA0696BF6ec6](https://etherscan.io/address/0x03004C447722d207B0355529A6d0dA0696BF6ec6)| -|OVM_ChainStorageContainer-SCC-batches|[0x6B7Fce2C4FD1934a2d251F8b0930ac82DdDAD804](https://etherscan.io/address/0x6B7Fce2C4FD1934a2d251F8b0930ac82DdDAD804)| -|OVM_ExecutionManager|[0xEd93C5c21c502bB52b4D77240fA9a5d38472304d](https://etherscan.io/address/0xEd93C5c21c502bB52b4D77240fA9a5d38472304d)| -|OVM_FraudVerifier|[0xF7C64A47A557D2944798801C08771e15455c56c4](https://etherscan.io/address/0xF7C64A47A557D2944798801C08771e15455c56c4)| -|OVM_L1CrossDomainMessenger|[0xeec700E5a793e28B068537c7dd95d632B603440A](https://etherscan.io/address/0xeec700E5a793e28B068537c7dd95d632B603440A)| -|OVM_L1ETHGateway|[0x384bC62a4bb9aE617c8dD0eC351d7780444EFDc0](https://etherscan.io/address/0x384bC62a4bb9aE617c8dD0eC351d7780444EFDc0)| -|OVM_L1MultiMessageRelayer|[0x22adc8A1152B090721E253Ee88CC12a15bcF9222](https://etherscan.io/address/0x22adc8A1152B090721E253Ee88CC12a15bcF9222)| -|OVM_SafetyChecker|[0x4667c625b36Df62e393a9483BCfB2F00cA0708D1](https://etherscan.io/address/0x4667c625b36Df62e393a9483BCfB2F00cA0708D1)| -|OVM_StateCommitmentChain|[0x1D0C46671E0696a4Ba800032D5195d5b0f8c60A3](https://etherscan.io/address/0x1D0C46671E0696a4Ba800032D5195d5b0f8c60A3)| -|OVM_StateManagerFactory|[0xc43AB03567A18CC75CD4B75ABDBEb6DfC2192fF3](https://etherscan.io/address/0xc43AB03567A18CC75CD4B75ABDBEb6DfC2192fF3)| -|OVM_StateTransitionerFactory|[0x8FA5bfeeb7786D2a241527E8aE8cA1d7511A0E10](https://etherscan.io/address/0x8FA5bfeeb7786D2a241527E8aE8cA1d7511A0E10)| -|Proxy__OVM_L1CrossDomainMessenger|[0xD1EC7d40CCd01EB7A305b94cBa8AB6D17f6a9eFE](https://etherscan.io/address/0xD1EC7d40CCd01EB7A305b94cBa8AB6D17f6a9eFE)| -|Proxy__OVM_L1ETHGateway|[0xF20C38fCdDF0C790319Fd7431d17ea0c2bC9959c](https://etherscan.io/address/0xF20C38fCdDF0C790319Fd7431d17ea0c2bC9959c)| -|mockOVM_BondManager|[0x99EDa8472E93Aa28E5470eEDEc6e32081E14DaFC](https://etherscan.io/address/0x99EDa8472E93Aa28E5470eEDEc6e32081E14DaFC)| +|Lib_AddressManager|[0x668E5b997b9aE88a56cd40409119d4Db9e6d752E](https://etherscan.io/address/0x668E5b997b9aE88a56cd40409119d4Db9e6d752E)| +|OVM_CanonicalTransactionChain|[0xa88e220c7FC7F0D845D2624a5dF1DfD6874B9a44](https://etherscan.io/address/0xa88e220c7FC7F0D845D2624a5dF1DfD6874B9a44)| +|OVM_ChainStorageContainer-CTC-batches|[0x28157e8a8E6d22A367c63Ad61dD56d9E6bDCE905](https://etherscan.io/address/0x28157e8a8E6d22A367c63Ad61dD56d9E6bDCE905)| +|OVM_ChainStorageContainer-CTC-queue|[0xD68670eD8800c856613FD3e4C55539A2Ff53cCb3](https://etherscan.io/address/0xD68670eD8800c856613FD3e4C55539A2Ff53cCb3)| +|OVM_ChainStorageContainer-SCC-batches|[0x7B8af5f008A7C5eFD319e68Fd5C9A68008519Caf](https://etherscan.io/address/0x7B8af5f008A7C5eFD319e68Fd5C9A68008519Caf)| +|OVM_ExecutionManager|[0x3f5FA555c434b49D946042955013966Fd108DaC3](https://etherscan.io/address/0x3f5FA555c434b49D946042955013966Fd108DaC3)| +|OVM_FraudVerifier|[0x169CC2f69Cc16da17B71Df2dce6161ef57991bB9](https://etherscan.io/address/0x169CC2f69Cc16da17B71Df2dce6161ef57991bB9)| +|OVM_L1CrossDomainMessenger|[0x598F2b19e983910529affAb7D219724a019339CC](https://etherscan.io/address/0x598F2b19e983910529affAb7D219724a019339CC)| +|OVM_L1ETHGateway|[0x40c9067ec8087EcF101FC10d2673636955b81A32](https://etherscan.io/address/0x40c9067ec8087EcF101FC10d2673636955b81A32)| +|OVM_L1MultiMessageRelayer|[0xc34F5B7279A9276A9D02491c59630fa725B7c36B](https://etherscan.io/address/0xc34F5B7279A9276A9D02491c59630fa725B7c36B)| +|OVM_SafetyChecker|[0xD87eFbBb82f1B7d25469641ee2E0E513f144394C](https://etherscan.io/address/0xD87eFbBb82f1B7d25469641ee2E0E513f144394C)| +|OVM_StateCommitmentChain|[0x6786EB419547a4902d285F70c6acDbC9AefAdB6F](https://etherscan.io/address/0x6786EB419547a4902d285F70c6acDbC9AefAdB6F)| +|OVM_StateManagerFactory|[0xA4C213C1E2bF5594baB0BCdF071ed5B0E946b19e](https://etherscan.io/address/0xA4C213C1E2bF5594baB0BCdF071ed5B0E946b19e)| +|OVM_StateTransitionerFactory|[0xAe4ef5e45C42dA513d2B48E184B64A05c18d8154](https://etherscan.io/address/0xAe4ef5e45C42dA513d2B48E184B64A05c18d8154)| +|Proxy__OVM_L1CrossDomainMessenger|[0x902e5fF5A99C4eC1C21bbab089fdabE32EF0A5DF](https://etherscan.io/address/0x902e5fF5A99C4eC1C21bbab089fdabE32EF0A5DF)| +|Proxy__OVM_L1ETHGateway|[0xe681F80966a8b1fFadECf8068bD6F99034791c95](https://etherscan.io/address/0xe681F80966a8b1fFadECf8068bD6F99034791c95)| +|mockOVM_BondManager|[0x90c5F8d045bBcCc99d907f30E8707F06D95d065b](https://etherscan.io/address/0x90c5F8d045bBcCc99d907f30E8707F06D95d065b)| --- +## KOVAN-V3 +Network : __kovan (chain id: 42)__ + +|Contract|Address| +|--|--| +|Lib_AddressManager|[0xd56F695e73286ac252A37593DD4E7c14270eC1Df](https://kovan.etherscan.io/address/0xd56F695e73286ac252A37593DD4E7c14270eC1Df)| +|OVM_CanonicalTransactionChain|[0x895eabB95D684c15fa46Dc00a6b7557450083DEF](https://kovan.etherscan.io/address/0x895eabB95D684c15fa46Dc00a6b7557450083DEF)| +|OVM_ChainStorageContainer-CTC-batches|[0xeb335a8A5e8bA008cF7Cb02D5C3432f4fDB576da](https://kovan.etherscan.io/address/0xeb335a8A5e8bA008cF7Cb02D5C3432f4fDB576da)| +|OVM_ChainStorageContainer-CTC-queue|[0x207fa9Aa7Dee9AA790A8DF64778D3E3B6273BC90](https://kovan.etherscan.io/address/0x207fa9Aa7Dee9AA790A8DF64778D3E3B6273BC90)| +|OVM_ChainStorageContainer-SCC-batches|[0xFE1CE27173676A6850ECF4e0536D7C468A4dAfa0](https://kovan.etherscan.io/address/0xFE1CE27173676A6850ECF4e0536D7C468A4dAfa0)| +|OVM_ExecutionManager|[0xa2EB1961183a04157fF707Fa2Be2249e149c8FAB](https://kovan.etherscan.io/address/0xa2EB1961183a04157fF707Fa2Be2249e149c8FAB)| +|OVM_FraudVerifier|[0x4B2F74938Ddb8742C33b46aD1a402c85e9dABC44](https://kovan.etherscan.io/address/0x4B2F74938Ddb8742C33b46aD1a402c85e9dABC44)| +|OVM_L1CrossDomainMessenger|[0xa9D9045E4A753c856Fc0053369E780f23559E0A1](https://kovan.etherscan.io/address/0xa9D9045E4A753c856Fc0053369E780f23559E0A1)| +|OVM_L1ETHGateway|[0x25bb69ee5665536Ce6aeb51094F0bed9e4DACc30](https://kovan.etherscan.io/address/0x25bb69ee5665536Ce6aeb51094F0bed9e4DACc30)| +|OVM_L1MultiMessageRelayer|[0x942b1B1CaF9e7654318CbfCfD1bca6727C716638](https://kovan.etherscan.io/address/0x942b1B1CaF9e7654318CbfCfD1bca6727C716638)| +|OVM_SafetyChecker|[0xf0FaB0ce35a6d3F82b0B42f09A2734065908dB6a](https://kovan.etherscan.io/address/0xf0FaB0ce35a6d3F82b0B42f09A2734065908dB6a)| +|OVM_StateCommitmentChain|[0xdB1367bB36C34618778D492725C3eD11B508aC54](https://kovan.etherscan.io/address/0xdB1367bB36C34618778D492725C3eD11B508aC54)| +|OVM_StateManagerFactory|[0x3b96673C9e24D362501e87B239F60543e20beD50](https://kovan.etherscan.io/address/0x3b96673C9e24D362501e87B239F60543e20beD50)| +|OVM_StateTransitionerFactory|[0xd6eDb16a89A2EE4484fa8fdCDb11B8B5633c3687](https://kovan.etherscan.io/address/0xd6eDb16a89A2EE4484fa8fdCDb11B8B5633c3687)| +|Proxy__OVM_L1CrossDomainMessenger|[0x78b88FD62FBdBf67b9C5C6528CF84E9d30BB28e0](https://kovan.etherscan.io/address/0x78b88FD62FBdBf67b9C5C6528CF84E9d30BB28e0)| +|Proxy__OVM_L1ETHGateway|[0xB191d67F69e823445cD59e5A88953a82be73b9C6](https://kovan.etherscan.io/address/0xB191d67F69e823445cD59e5A88953a82be73b9C6)| +|mockOVM_BondManager|[0x8ECe272C9f83041bcb1Cd57AC49Ca6494776bE01](https://kovan.etherscan.io/address/0x8ECe272C9f83041bcb1Cd57AC49Ca6494776bE01)| +--- ## KOVAN Network : __kovan (chain id: 42)__ @@ -73,3 +96,28 @@ Network : __kovan (chain id: 42)__ |Proxy__OVM_L1CrossDomainMessenger|[0x48062eD9b6488EC41c4CfbF2f568D7773819d8C9](https://kovan.etherscan.io/address/0x48062eD9b6488EC41c4CfbF2f568D7773819d8C9)| |Proxy__OVM_L1ETHGateway|[0xf3902e50dA095bD2e954AB320E8eafDA6152dFDa](https://kovan.etherscan.io/address/0xf3902e50dA095bD2e954AB320E8eafDA6152dFDa)| |mockOVM_BondManager|[0x77e244ec49014cFb9c4572453568eCC3AbB70A2d](https://kovan.etherscan.io/address/0x77e244ec49014cFb9c4572453568eCC3AbB70A2d)| +--- +## GOERLI-V3 + +Network : __goerli (chain id: 5)__ + +|Contract|Address| +|--|--| +|Lib_AddressManager|[0xE3d08F0D900A2D53cB794cf82d7127764BcC3092](https://goerli.etherscan.io/address/0xE3d08F0D900A2D53cB794cf82d7127764BcC3092)| +|OVM_CanonicalTransactionChain|[0x266534680e632Ce9425d8E5a991C43B3531C7818](https://goerli.etherscan.io/address/0x266534680e632Ce9425d8E5a991C43B3531C7818)| +|OVM_ChainStorageContainer-CTC-batches|[0x7b439CD647b76F45252858C19093a53b4c5FD4B4](https://goerli.etherscan.io/address/0x7b439CD647b76F45252858C19093a53b4c5FD4B4)| +|OVM_ChainStorageContainer-CTC-queue|[0xeD5fF8cFFba09fa5fF3104a63bA321733c4553d9](https://goerli.etherscan.io/address/0xeD5fF8cFFba09fa5fF3104a63bA321733c4553d9)| +|OVM_ChainStorageContainer-SCC-batches|[0x2A622E327D7A204b39355202d41BD9B752C8df54](https://goerli.etherscan.io/address/0x2A622E327D7A204b39355202d41BD9B752C8df54)| +|OVM_ExecutionManager|[0x45B459295d6b08D7dA3B9daae541D5F75E1CF818](https://goerli.etherscan.io/address/0x45B459295d6b08D7dA3B9daae541D5F75E1CF818)| +|OVM_FraudVerifier|[0xfA590cE7fE1d80D4b286e23f3f6e9f9357D6A90b](https://goerli.etherscan.io/address/0xfA590cE7fE1d80D4b286e23f3f6e9f9357D6A90b)| +|OVM_L1CrossDomainMessenger|[0x27BdfF69C72d29493bfD2152DbE28657f8Ddd5df](https://goerli.etherscan.io/address/0x27BdfF69C72d29493bfD2152DbE28657f8Ddd5df)| +|OVM_L1ETHGateway|[0x746E840b94cC75921D1cb620b83CFd0C658B2852](https://goerli.etherscan.io/address/0x746E840b94cC75921D1cb620b83CFd0C658B2852)| +|OVM_L1MultiMessageRelayer|[0x737557d97f7f2ccb0263C4b55f0D735D52c2D385](https://goerli.etherscan.io/address/0x737557d97f7f2ccb0263C4b55f0D735D52c2D385)| +|OVM_SafetyChecker|[0x71D4ea896C9a2D4a973CC5c7E347B6707691ECa0](https://goerli.etherscan.io/address/0x71D4ea896C9a2D4a973CC5c7E347B6707691ECa0)| +|OVM_StateCommitmentChain|[0x5c3e321947C99698027108351ee736823Bd157D8](https://goerli.etherscan.io/address/0x5c3e321947C99698027108351ee736823Bd157D8)| +|OVM_StateManagerFactory|[0x8E63CD1CfDBe5d34a7a91B97E0A2AeA23D0e585D](https://goerli.etherscan.io/address/0x8E63CD1CfDBe5d34a7a91B97E0A2AeA23D0e585D)| +|OVM_StateTransitionerFactory|[0x543021950Af9250443EEdc681755e0bdBd3Fc81d](https://goerli.etherscan.io/address/0x543021950Af9250443EEdc681755e0bdBd3Fc81d)| +|Proxy__OVM_L1CrossDomainMessenger|[0xFec83764acDeEc2ac338d4cc1f12bBE3cCDf551E](https://goerli.etherscan.io/address/0xFec83764acDeEc2ac338d4cc1f12bBE3cCDf551E)| +|Proxy__OVM_L1ETHGateway|[0xA721CF3e39E5cB4CfEEc0e32EE05B3D05AA9aE39](https://goerli.etherscan.io/address/0xA721CF3e39E5cB4CfEEc0e32EE05B3D05AA9aE39)| +|mockOVM_BondManager|[0x35a7735F9f517d071d5cFf89D11Ab4488bc5Df8C](https://goerli.etherscan.io/address/0x35a7735F9f517d071d5cFf89D11Ab4488bc5Df8C)| +--- diff --git a/packages/contracts/deployments/mainnet/Lib_AddressManager.json b/packages/contracts/deployments/mainnet/Lib_AddressManager.json index 482343042b856..e6108b197dc0e 100644 --- a/packages/contracts/deployments/mainnet/Lib_AddressManager.json +++ b/packages/contracts/deployments/mainnet/Lib_AddressManager.json @@ -1,5 +1,5 @@ { - "address": "0xd3EeD86464Ff13B4BFD81a3bB1e753b7ceBA3A39", + "address": "0x668E5b997b9aE88a56cd40409119d4Db9e6d752E", "abi": [ { "anonymous": false, @@ -100,7 +100,7 @@ "inputs": [ { "internalType": "address", - "name": "_newOwner", + "name": "newOwner", "type": "address" } ], @@ -110,65 +110,96 @@ "type": "function" } ], - "transactionHash": "0x3f0530a8f329bf40345ebeb476efaf823ec5c89f3d1cc41f494e6d218b2ef08f", + "transactionHash": "0xb7ffb05e540cf02a164869cca8b6f00f5d645148eac465644f27a6d80977f821", "receipt": { "to": null, - "from": "0x77C4c8f491e5ff22a2C0E18b005c3BA0Fe36c1Bc", - "contractAddress": "0xd3EeD86464Ff13B4BFD81a3bB1e753b7ceBA3A39", - "transactionIndex": 197, - "gasUsed": "403788", - "logsBloom": "0x00000000000000000000000000000000000000000000000000800000000000000000000080000000000000000000000000000000000000000000008000000000001000000000000000000000000000000001000000000000000000000000000000000000020000000000000000000800000000000000000000000000010000400000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0x9d66eda604e8274e6adb8b371ab52f1874b2402c2d6fb7d91ce0ace69b8f801c", - "transactionHash": "0x3f0530a8f329bf40345ebeb476efaf823ec5c89f3d1cc41f494e6d218b2ef08f", + "from": "0xd033f09cB85621F98F7A84C64dB381ac16Eff818", + "contractAddress": "0x668E5b997b9aE88a56cd40409119d4Db9e6d752E", + "transactionIndex": 227, + "gasUsed": "427277", + "logsBloom": "0x00000000000000000000000000000040000000000000000000800000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000020000200000000000000800000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000001000000000000000000000000000000", + "blockHash": "0x53e80ac59e7178fc903374bca1e8fbb3c212cd56e6a4763e8cf6a564cf461457", + "transactionHash": "0xb7ffb05e540cf02a164869cca8b6f00f5d645148eac465644f27a6d80977f821", "logs": [ { - "transactionIndex": 197, - "blockNumber": 12207737, - "transactionHash": "0x3f0530a8f329bf40345ebeb476efaf823ec5c89f3d1cc41f494e6d218b2ef08f", - "address": "0xd3EeD86464Ff13B4BFD81a3bB1e753b7ceBA3A39", + "transactionIndex": 227, + "blockNumber": 12410727, + "transactionHash": "0xb7ffb05e540cf02a164869cca8b6f00f5d645148eac465644f27a6d80977f821", + "address": "0x668E5b997b9aE88a56cd40409119d4Db9e6d752E", "topics": [ "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x00000000000000000000000077c4c8f491e5ff22a2c0e18b005c3ba0fe36c1bc" + "0x000000000000000000000000d033f09cb85621f98f7a84c64db381ac16eff818" ], "data": "0x", - "logIndex": 104, - "blockHash": "0x9d66eda604e8274e6adb8b371ab52f1874b2402c2d6fb7d91ce0ace69b8f801c" + "logIndex": 58, + "blockHash": "0x53e80ac59e7178fc903374bca1e8fbb3c212cd56e6a4763e8cf6a564cf461457" } ], - "blockNumber": 12207737, - "cumulativeGasUsed": "9721212", + "blockNumber": 12410727, + "cumulativeGasUsed": "6359487", "status": 1, "byzantium": true }, "args": [], - "solcInputHash": "43ee6bb8ef92595aa6d0e22a6c464dff", - "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_newAddress\",\"type\":\"address\"}],\"name\":\"AddressSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"getAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"_address\",\"type\":\"address\"}],\"name\":\"setAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"title\":\"Lib_AddressManager\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":\"Lib_AddressManager\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Contract Imports */\\nimport { Ownable } from \\\"./Lib_Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n /*******************************************\\n * Contract Variables: Internal Accounting *\\n *******************************************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n public\\n onlyOwner\\n {\\n emit AddressSet(_name, _address);\\n addresses[_getNameHash(_name)] = _address;\\n }\\n\\n function getAddress(\\n string memory _name\\n )\\n public\\n view\\n returns (address)\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32 _hash\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0x3a490595cc21ff170e4027843093670ff845d5972481fbfb956b722ea564bb06\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Ownable\\n * @dev Adapted from https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol\\n */\\nabstract contract Ownable {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n address public owner;\\n\\n\\n /**********\\n * Events *\\n **********/\\n\\n event OwnershipTransferred(\\n address indexed previousOwner,\\n address indexed newOwner\\n );\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n constructor() {\\n owner = msg.sender;\\n emit OwnershipTransferred(address(0), owner);\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n owner == msg.sender,\\n \\\"Ownable: caller is not the owner\\\"\\n );\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function renounceOwnership()\\n public\\n virtual\\n onlyOwner\\n {\\n emit OwnershipTransferred(owner, address(0));\\n owner = address(0);\\n }\\n\\n function transferOwnership(address _newOwner)\\n public\\n virtual\\n onlyOwner\\n {\\n require(\\n _newOwner != address(0),\\n \\\"Ownable: new owner cannot be the zero address\\\"\\n );\\n\\n emit OwnershipTransferred(owner, _newOwner);\\n owner = _newOwner;\\n }\\n}\\n\",\"keccak256\":\"0xd9dfd9264e5b5fedd53a5b10fdf179c3f367614b0fe69179bce4e45119f5b739\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x608060405234801561001057600080fd5b50600080546001600160a01b03191633178082556040516001600160a01b039190911691907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a36105eb806100696000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c8063715018a61461005c5780638da5cb5b146100665780639b2ea4bd1461008a578063bf40fac11461013b578063f2fde38b146101e1575b600080fd5b610064610207565b005b61006e6102b0565b604080516001600160a01b039092168252519081900360200190f35b610064600480360360408110156100a057600080fd5b8101906020810181356401000000008111156100bb57600080fd5b8201836020820111156100cd57600080fd5b803590602001918460018302840111640100000000831117156100ef57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550505090356001600160a01b031691506102bf9050565b61006e6004803603602081101561015157600080fd5b81019060208101813564010000000081111561016c57600080fd5b82018360208201111561017e57600080fd5b803590602001918460018302840111640100000000831117156101a057600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061040c945050505050565b610064600480360360208110156101f757600080fd5b50356001600160a01b031661043b565b6000546001600160a01b03163314610266576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b031681565b6000546001600160a01b0316331461031e576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b7f188466739ff00cc68bfb2367d23ae4b855264264fe1624caa8884399af23454c82826040518080602001836001600160a01b03168152602001828103825284818151815260200191508051906020019080838360005b8381101561038d578181015183820152602001610375565b50505050905090810190601f1680156103ba5780820380516001836020036101000a031916815260200191505b50935050505060405180910390a180600160006103d68561053a565b815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b031602179055505050565b60006001600061041b8461053a565b81526020810191909152604001600020546001600160a01b031692915050565b6000546001600160a01b0316331461049a576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b0381166104df5760405162461bcd60e51b815260040180806020018281038252602d8152602001806105b2602d913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000816040516020018082805190602001908083835b6020831061056f5780518252601f199092019160209182019101610550565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120905091905056fe4f776e61626c653a206e6577206f776e65722063616e6e6f7420626520746865207a65726f2061646472657373a164736f6c6343000706000a", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100575760003560e01c8063715018a61461005c5780638da5cb5b146100665780639b2ea4bd1461008a578063bf40fac11461013b578063f2fde38b146101e1575b600080fd5b610064610207565b005b61006e6102b0565b604080516001600160a01b039092168252519081900360200190f35b610064600480360360408110156100a057600080fd5b8101906020810181356401000000008111156100bb57600080fd5b8201836020820111156100cd57600080fd5b803590602001918460018302840111640100000000831117156100ef57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550505090356001600160a01b031691506102bf9050565b61006e6004803603602081101561015157600080fd5b81019060208101813564010000000081111561016c57600080fd5b82018360208201111561017e57600080fd5b803590602001918460018302840111640100000000831117156101a057600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061040c945050505050565b610064600480360360208110156101f757600080fd5b50356001600160a01b031661043b565b6000546001600160a01b03163314610266576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b031681565b6000546001600160a01b0316331461031e576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b7f188466739ff00cc68bfb2367d23ae4b855264264fe1624caa8884399af23454c82826040518080602001836001600160a01b03168152602001828103825284818151815260200191508051906020019080838360005b8381101561038d578181015183820152602001610375565b50505050905090810190601f1680156103ba5780820380516001836020036101000a031916815260200191505b50935050505060405180910390a180600160006103d68561053a565b815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b031602179055505050565b60006001600061041b8461053a565b81526020810191909152604001600020546001600160a01b031692915050565b6000546001600160a01b0316331461049a576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b0381166104df5760405162461bcd60e51b815260040180806020018281038252602d8152602001806105b2602d913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000816040516020018082805190602001908083835b6020831061056f5780518252601f199092019160209182019101610550565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120905091905056fe4f776e61626c653a206e6577206f776e65722063616e6e6f7420626520746865207a65726f2061646472657373a164736f6c6343000706000a", + "solcInputHash": "f2bdab652d5102f5f11e78dae866798d", + "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_newAddress\",\"type\":\"address\"}],\"name\":\"AddressSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"getAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"_address\",\"type\":\"address\"}],\"name\":\"setAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"getAddress(string)\":{\"params\":{\"_name\":\"Name to retrieve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner.\"},\"setAddress(string,address)\":{\"params\":{\"_address\":\"Address to associate with the name.\",\"_name\":\"String name to associate an address with.\"}},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"}},\"title\":\"Lib_AddressManager\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"getAddress(string)\":{\"notice\":\"Retrieves the address associated with a given name.\"},\"setAddress(string,address)\":{\"notice\":\"Changes the address associated with a particular name.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":\"Lib_AddressManager\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor () internal {\\n address msgSender = _msgSender();\\n _owner = msgSender;\\n emit OwnershipTransferred(address(0), msgSender);\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n emit OwnershipTransferred(_owner, address(0));\\n _owner = address(0);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n emit OwnershipTransferred(_owner, newOwner);\\n _owner = newOwner;\\n }\\n}\\n\",\"keccak256\":\"0x15e2d5bd4c28a88548074c54d220e8086f638a71ed07e6b3ba5a70066fcf458d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with GSN meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address payable) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes memory) {\\n this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x8d3cb350f04ff49cfb10aef08d87f19dcbaecc8027b0bed12f3275cd12f38cf0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n external\\n onlyOwner\\n {\\n addresses[_getNameHash(_name)] = _address;\\n\\n emit AddressSet(\\n _name,\\n _address\\n );\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(\\n string memory _name\\n )\\n external\\n view\\n returns (\\n address\\n )\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xcc9fc5c64f1101a5c6c397594086b1608189a9edc5c9635e1ac38f70aeeeecbf\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x608060405234801561001057600080fd5b50600061001b61006a565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35061006e565b3390565b6106508061007d6000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c8063715018a61461005c5780638da5cb5b146100665780639b2ea4bd1461008a578063bf40fac11461013b578063f2fde38b146101e1575b600080fd5b610064610207565b005b61006e6102c5565b604080516001600160a01b039092168252519081900360200190f35b610064600480360360408110156100a057600080fd5b8101906020810181356401000000008111156100bb57600080fd5b8201836020820111156100cd57600080fd5b803590602001918460018302840111640100000000831117156100ef57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550505090356001600160a01b031691506102d49050565b61006e6004803603602081101561015157600080fd5b81019060208101813564010000000081111561016c57600080fd5b82018360208201111561017e57600080fd5b803590602001918460018302840111640100000000831117156101a057600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610436945050505050565b610064600480360360208110156101f757600080fd5b50356001600160a01b0316610465565b61020f610579565b6001600160a01b03166102206102c5565b6001600160a01b03161461027b576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b031690565b6102dc610579565b6001600160a01b03166102ed6102c5565b6001600160a01b031614610348576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b80600160006103568561057d565b815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b031602179055507f188466739ff00cc68bfb2367d23ae4b855264264fe1624caa8884399af23454c82826040518080602001836001600160a01b03168152602001828103825284818151815260200191508051906020019080838360005b838110156103f75781810151838201526020016103df565b50505050905090810190601f1680156104245780820380516001836020036101000a031916815260200191505b50935050505060405180910390a15050565b6000600160006104458461057d565b81526020810191909152604001600020546001600160a01b031692915050565b61046d610579565b6001600160a01b031661047e6102c5565b6001600160a01b0316146104d9576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b03811661051e5760405162461bcd60e51b81526004018080602001828103825260268152602001806105f56026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b3390565b6000816040516020018082805190602001908083835b602083106105b25780518252601f199092019160209182019101610593565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120905091905056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373a26469706673582212204a95fb185077bedee9e8a29a2d18e7398dc688fcfeb979fef060e7ac4073b45464736f6c63430007060033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100575760003560e01c8063715018a61461005c5780638da5cb5b146100665780639b2ea4bd1461008a578063bf40fac11461013b578063f2fde38b146101e1575b600080fd5b610064610207565b005b61006e6102c5565b604080516001600160a01b039092168252519081900360200190f35b610064600480360360408110156100a057600080fd5b8101906020810181356401000000008111156100bb57600080fd5b8201836020820111156100cd57600080fd5b803590602001918460018302840111640100000000831117156100ef57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550505090356001600160a01b031691506102d49050565b61006e6004803603602081101561015157600080fd5b81019060208101813564010000000081111561016c57600080fd5b82018360208201111561017e57600080fd5b803590602001918460018302840111640100000000831117156101a057600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610436945050505050565b610064600480360360208110156101f757600080fd5b50356001600160a01b0316610465565b61020f610579565b6001600160a01b03166102206102c5565b6001600160a01b03161461027b576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b031690565b6102dc610579565b6001600160a01b03166102ed6102c5565b6001600160a01b031614610348576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b80600160006103568561057d565b815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b031602179055507f188466739ff00cc68bfb2367d23ae4b855264264fe1624caa8884399af23454c82826040518080602001836001600160a01b03168152602001828103825284818151815260200191508051906020019080838360005b838110156103f75781810151838201526020016103df565b50505050905090810190601f1680156104245780820380516001836020036101000a031916815260200191505b50935050505060405180910390a15050565b6000600160006104458461057d565b81526020810191909152604001600020546001600160a01b031692915050565b61046d610579565b6001600160a01b031661047e6102c5565b6001600160a01b0316146104d9576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b03811661051e5760405162461bcd60e51b81526004018080602001828103825260268152602001806105f56026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b3390565b6000816040516020018082805190602001908083835b602083106105b25780518252601f199092019160209182019101610593565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120905091905056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373a26469706673582212204a95fb185077bedee9e8a29a2d18e7398dc688fcfeb979fef060e7ac4073b45464736f6c63430007060033", "devdoc": { "kind": "dev", - "methods": {}, + "methods": { + "getAddress(string)": { + "params": { + "_name": "Name to retrieve an address for." + }, + "returns": { + "_0": "Address associated with the given name." + } + }, + "owner()": { + "details": "Returns the address of the current owner." + }, + "renounceOwnership()": { + "details": "Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner." + }, + "setAddress(string,address)": { + "params": { + "_address": "Address to associate with the name.", + "_name": "String name to associate an address with." + } + }, + "transferOwnership(address)": { + "details": "Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner." + } + }, "title": "Lib_AddressManager", "version": 1 }, "userdoc": { "kind": "user", - "methods": {}, + "methods": { + "getAddress(string)": { + "notice": "Retrieves the address associated with a given name." + }, + "setAddress(string,address)": { + "notice": "Changes the address associated with a particular name." + } + }, "version": 1 }, "storageLayout": { "storage": [ { - "astId": 12586, + "astId": 664, "contract": "contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol:Lib_AddressManager", - "label": "owner", + "label": "_owner", "offset": 0, "slot": "0", "type": "t_address" }, { - "astId": 12494, + "astId": 12793, "contract": "contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol:Lib_AddressManager", "label": "addresses", "offset": 0, diff --git a/packages/contracts/deployments/mainnet/OVM_CanonicalTransactionChain.json b/packages/contracts/deployments/mainnet/OVM_CanonicalTransactionChain.json index 48d8e1e70bc4f..4764b4327c81f 100644 --- a/packages/contracts/deployments/mainnet/OVM_CanonicalTransactionChain.json +++ b/packages/contracts/deployments/mainnet/OVM_CanonicalTransactionChain.json @@ -1,5 +1,5 @@ { - "address": "0x405B4008Da75C48F4E54AA39607378967Ae62338", + "address": "0xa88e220c7FC7F0D845D2624a5dF1DfD6874B9a44", "abi": [ { "inputs": [ @@ -456,7 +456,7 @@ "outputs": [ { "internalType": "address", - "name": "_contract", + "name": "", "type": "address" } ], @@ -601,32 +601,32 @@ "type": "function" } ], - "transactionHash": "0x1c20c2ee279bfa7446fd7117b4b147cb2709f581a8052fa66276df2d1af3467b", + "transactionHash": "0x7d26b7cfd3f595bebab4d22ca651feb308c3f95e475a8d2e80f4b06ffefed461", "receipt": { "to": null, - "from": "0x77C4c8f491e5ff22a2C0E18b005c3BA0Fe36c1Bc", - "contractAddress": "0x405B4008Da75C48F4E54AA39607378967Ae62338", - "transactionIndex": 144, - "gasUsed": "2814575", + "from": "0xd033f09cB85621F98F7A84C64dB381ac16Eff818", + "contractAddress": "0xa88e220c7FC7F0D845D2624a5dF1DfD6874B9a44", + "transactionIndex": 102, + "gasUsed": "2831026", "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0xf94f495e3ac703206e0edc2e0922da91c418f22a6d0af1ca2b9fab1bd5618219", - "transactionHash": "0x1c20c2ee279bfa7446fd7117b4b147cb2709f581a8052fa66276df2d1af3467b", + "blockHash": "0xb4aa0366ff1e4f3f49f77d89d9025e4102a8cd2a0b3fd64cd1c1a13b0a7c98f6", + "transactionHash": "0x7d26b7cfd3f595bebab4d22ca651feb308c3f95e475a8d2e80f4b06ffefed461", "logs": [], - "blockNumber": 12207792, - "cumulativeGasUsed": "12334867", + "blockNumber": 12410807, + "cumulativeGasUsed": "8803160", "status": 1, "byzantium": true }, "args": [ - "0xd3EeD86464Ff13B4BFD81a3bB1e753b7ceBA3A39", - 18000000, - 1200000, + "0x668E5b997b9aE88a56cd40409119d4Db9e6d752E", + 15769999, + 1213076, 9000000 ], - "solcInputHash": "43ee6bb8ef92595aa6d0e22a6c464dff", - "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_forceInclusionPeriodSeconds\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_forceInclusionPeriodBlocks\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_maxTransactionGasLimit\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_startingQueueIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_numQueueElements\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_totalElements\",\"type\":\"uint256\"}],\"name\":\"QueueBatchAppended\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_startingQueueIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_numQueueElements\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_totalElements\",\"type\":\"uint256\"}],\"name\":\"SequencerBatchAppended\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_batchIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"_batchRoot\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_batchSize\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_prevTotalElements\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"_extraData\",\"type\":\"bytes\"}],\"name\":\"TransactionBatchAppended\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_l1TxOrigin\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_queueIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_timestamp\",\"type\":\"uint256\"}],\"name\":\"TransactionEnqueued\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"L2_GAS_DISCOUNT_DIVISOR\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAX_ROLLUP_TX_SIZE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MIN_ROLLUP_TX_GAS\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"appendQueueBatch\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"appendSequencerBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"batches\",\"outputs\":[{\"internalType\":\"contract iOVM_ChainStorageContainer\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"enqueue\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"forceInclusionPeriodBlocks\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"forceInclusionPeriodSeconds\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLastBlockNumber\",\"outputs\":[{\"internalType\":\"uint40\",\"name\":\"\",\"type\":\"uint40\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLastTimestamp\",\"outputs\":[{\"internalType\":\"uint40\",\"name\":\"\",\"type\":\"uint40\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getNextQueueIndex\",\"outputs\":[{\"internalType\":\"uint40\",\"name\":\"\",\"type\":\"uint40\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getNumPendingQueueElements\",\"outputs\":[{\"internalType\":\"uint40\",\"name\":\"\",\"type\":\"uint40\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"getQueueElement\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"transactionHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint40\",\"name\":\"timestamp\",\"type\":\"uint40\"},{\"internalType\":\"uint40\",\"name\":\"blockNumber\",\"type\":\"uint40\"}],\"internalType\":\"struct Lib_OVMCodec.QueueElement\",\"name\":\"_element\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getQueueLength\",\"outputs\":[{\"internalType\":\"uint40\",\"name\":\"\",\"type\":\"uint40\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTotalBatches\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_totalBatches\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTotalElements\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_totalElements\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maxTransactionGasLimit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"queue\",\"outputs\":[{\"internalType\":\"contract iOVM_ChainStorageContainer\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"_contract\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"enum Lib_OVMCodec.QueueOrigin\",\"name\":\"l1QueueOrigin\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"l1TxOrigin\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"entrypoint\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.Transaction\",\"name\":\"_transaction\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isSequenced\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"queueIndex\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"txData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.TransactionChainElement\",\"name\":\"_txChainElement\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"_batchHeader\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"siblings\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct Lib_OVMCodec.ChainInclusionProof\",\"name\":\"_inclusionProof\",\"type\":\"tuple\"}],\"name\":\"verifyTransaction\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The Canonical Transaction Chain (CTC) contract is an append-only log of transactions which must be applied to the rollup state. It defines the ordering of rollup transactions by writing them to the 'CTC:batches' instance of the Chain Storage Container. The CTC also allows any account to 'enqueue' an L2 transaction, which will require that the Sequencer will eventually append it to the rollup state. If the Sequencer does not include an enqueued transaction within the 'force inclusion period', then any account may force it to be included by calling appendQueueBatch(). Compiler used: solc Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"appendSequencerBatch()\":{\"details\":\"This function uses a custom encoding scheme for efficiency reasons. .param _shouldStartAtElement Specific batch we expect to start appending to. .param _totalElementsToAppend Total number of batch elements we expect to append. .param _contexts Array of batch contexts. .param _transactionDataFields Array of raw transaction data.\"},\"batches()\":{\"returns\":{\"_0\":\"Reference to the batch storage container.\"}},\"enqueue(address,uint256,bytes)\":{\"params\":{\"_data\":\"Transaction data.\",\"_gasLimit\":\"Gas limit for the enqueued L2 transaction.\",\"_target\":\"Target L2 contract to send the transaction to.\"}},\"getLastBlockNumber()\":{\"returns\":{\"_0\":\"Blocknumber for the last transaction.\"}},\"getLastTimestamp()\":{\"returns\":{\"_0\":\"Timestamp for the last transaction.\"}},\"getNextQueueIndex()\":{\"returns\":{\"_0\":\"Index for the next queue element.\"}},\"getNumPendingQueueElements()\":{\"returns\":{\"_0\":\"Number of pending queue elements.\"}},\"getQueueElement(uint256)\":{\"params\":{\"_index\":\"Index of the queue element to access.\"},\"returns\":{\"_element\":\"Queue element at the given index.\"}},\"getQueueLength()\":{\"returns\":{\"_0\":\"Length of the queue.\"}},\"getTotalBatches()\":{\"returns\":{\"_totalBatches\":\"Total submitted batches.\"}},\"getTotalElements()\":{\"returns\":{\"_totalElements\":\"Total submitted elements.\"}},\"queue()\":{\"returns\":{\"_0\":\"Reference to the queue storage container.\"}},\"verifyTransaction((uint256,uint256,uint8,address,address,uint256,bytes),(bool,uint256,uint256,uint256,bytes),(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))\":{\"params\":{\"_batchHeader\":\"Header of the batch the transaction was included in.\",\"_inclusionProof\":\"Inclusion proof for the provided transaction chain element.\",\"_transaction\":\"Transaction to verify.\",\"_txChainElement\":\"Transaction chain element corresponding to the transaction.\"},\"returns\":{\"_0\":\"True if the transaction exists in the CTC, false if not.\"}}},\"title\":\"OVM_CanonicalTransactionChain\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"appendQueueBatch(uint256)\":{\"notice\":\"Appends a given number of queued transactions as a single batch. param _numQueuedTransactions Number of transactions to append.\"},\"appendSequencerBatch()\":{\"notice\":\"Allows the sequencer to append a batch of transactions.\"},\"batches()\":{\"notice\":\"Accesses the batch storage container.\"},\"enqueue(address,uint256,bytes)\":{\"notice\":\"Adds a transaction to the queue.\"},\"getLastBlockNumber()\":{\"notice\":\"Returns the blocknumber of the last transaction.\"},\"getLastTimestamp()\":{\"notice\":\"Returns the timestamp of the last transaction.\"},\"getNextQueueIndex()\":{\"notice\":\"Returns the index of the next element to be enqueued.\"},\"getNumPendingQueueElements()\":{\"notice\":\"Get the number of queue elements which have not yet been included.\"},\"getQueueElement(uint256)\":{\"notice\":\"Gets the queue element at a particular index.\"},\"getQueueLength()\":{\"notice\":\"Retrieves the length of the queue, including both pending and canonical transactions.\"},\"getTotalBatches()\":{\"notice\":\"Retrieves the total number of batches submitted.\"},\"getTotalElements()\":{\"notice\":\"Retrieves the total number of elements submitted.\"},\"queue()\":{\"notice\":\"Accesses the queue storage container.\"},\"verifyTransaction((uint256,uint256,uint8,address,address,uint256,bytes),(bool,uint256,uint256,uint256,bytes),(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))\":{\"notice\":\"Verifies whether a transaction is included in the chain.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/OVM/chain/OVM_CanonicalTransactionChain.sol\":\"OVM_CanonicalTransactionChain\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/optimistic-ethereum/OVM/accounts/OVM_ECDSAContractAccount.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Interface Imports */\\nimport { iOVM_ECDSAContractAccount } from \\\"../../iOVM/accounts/iOVM_ECDSAContractAccount.sol\\\";\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { Lib_ECDSAUtils } from \\\"../../libraries/utils/Lib_ECDSAUtils.sol\\\";\\nimport { Lib_SafeExecutionManagerWrapper } from \\\"../../libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\\\";\\nimport { Lib_SafeMathWrapper } from \\\"../../libraries/wrappers/Lib_SafeMathWrapper.sol\\\";\\n\\n/**\\n * @title OVM_ECDSAContractAccount\\n * @dev The ECDSA Contract Account can be used as the implementation for a ProxyEOA deployed by the\\n * ovmCREATEEOA operation. It enables backwards compatibility with Ethereum's Layer 1, by \\n * providing eth_sign and EIP155 formatted transaction encodings.\\n *\\n * Compiler used: solc\\n * Runtime target: OVM\\n */\\ncontract OVM_ECDSAContractAccount is iOVM_ECDSAContractAccount {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n // TODO: should be the amount sufficient to cover the gas costs of all of the transactions up\\n // to and including the CALL/CREATE which forms the entrypoint of the transaction.\\n uint256 constant EXECUTION_VALIDATION_GAS_OVERHEAD = 25000;\\n address constant ETH_ERC20_ADDRESS = 0x4200000000000000000000000000000000000006;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Executes a signed transaction.\\n * @param _transaction Signed EOA transaction.\\n * @param _signatureType Hashing scheme used for the transaction (e.g., ETH signed message).\\n * @param _v Signature `v` parameter.\\n * @param _r Signature `r` parameter.\\n * @param _s Signature `s` parameter.\\n * @return Whether or not the call returned (rather than reverted).\\n * @return Data returned by the call.\\n */\\n function execute(\\n bytes memory _transaction,\\n Lib_OVMCodec.EOASignatureType _signatureType,\\n uint8 _v,\\n bytes32 _r,\\n bytes32 _s\\n )\\n override\\n public\\n returns (\\n bool,\\n bytes memory\\n )\\n {\\n bool isEthSign = _signatureType == Lib_OVMCodec.EOASignatureType.ETH_SIGNED_MESSAGE;\\n\\n // Address of this contract within the ovm (ovmADDRESS) should be the same as the\\n // recovered address of the user who signed this message. This is how we manage to shim\\n // account abstraction even though the user isn't a contract.\\n // Need to make sure that the transaction nonce is right and bump it if so.\\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(\\n Lib_ECDSAUtils.recover(\\n _transaction,\\n isEthSign,\\n _v,\\n _r,\\n _s\\n ) == Lib_SafeExecutionManagerWrapper.safeADDRESS(),\\n \\\"Signature provided for EOA transaction execution is invalid.\\\"\\n );\\n\\n Lib_OVMCodec.EIP155Transaction memory decodedTx = Lib_OVMCodec.decodeEIP155Transaction(_transaction, isEthSign);\\n\\n // Need to make sure that the transaction chainId is correct.\\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(\\n decodedTx.chainId == Lib_SafeExecutionManagerWrapper.safeCHAINID(),\\n \\\"Transaction chainId does not match expected OVM chainId.\\\"\\n );\\n\\n // Need to make sure that the transaction nonce is right.\\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(\\n decodedTx.nonce == Lib_SafeExecutionManagerWrapper.safeGETNONCE(),\\n \\\"Transaction nonce does not match the expected nonce.\\\"\\n );\\n\\n // TEMPORARY: Disable gas checks for mainnet.\\n // // Need to make sure that the gas is sufficient to execute the transaction.\\n // Lib_SafeExecutionManagerWrapper.safeREQUIRE(\\n // gasleft() >= Lib_SafeMathWrapper.add(decodedTx.gasLimit, EXECUTION_VALIDATION_GAS_OVERHEAD),\\n // \\\"Gas is not sufficient to execute the transaction.\\\"\\n // );\\n\\n // Transfer fee to relayer.\\n address relayer = Lib_SafeExecutionManagerWrapper.safeCALLER();\\n uint256 fee = Lib_SafeMathWrapper.mul(decodedTx.gasLimit, decodedTx.gasPrice);\\n (bool success, ) = Lib_SafeExecutionManagerWrapper.safeCALL(\\n gasleft(),\\n ETH_ERC20_ADDRESS,\\n abi.encodeWithSignature(\\\"transfer(address,uint256)\\\", relayer, fee)\\n );\\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(\\n success == true,\\n \\\"Fee was not transferred to relayer.\\\"\\n );\\n\\n // Contract creations are signalled by sending a transaction to the zero address.\\n if (decodedTx.to == address(0)) {\\n (address created, bytes memory revertData) = Lib_SafeExecutionManagerWrapper.safeCREATE(\\n gasleft(),\\n decodedTx.data\\n );\\n\\n // Return true if the contract creation succeeded, false w/ revertData otherwise.\\n if (created != address(0)) {\\n return (true, abi.encode(created));\\n } else {\\n return (false, revertData);\\n }\\n } else {\\n // We only want to bump the nonce for `ovmCALL` because `ovmCREATE` automatically bumps\\n // the nonce of the calling account. Normally an EOA would bump the nonce for both\\n // cases, but since this is a contract we'd end up bumping the nonce twice.\\n Lib_SafeExecutionManagerWrapper.safeINCREMENTNONCE();\\n\\n return Lib_SafeExecutionManagerWrapper.safeCALL(\\n gasleft(),\\n decodedTx.to,\\n decodedTx.data\\n );\\n }\\n }\\n}\\n\",\"keccak256\":\"0xcba0b593ad36291ec3d8c61ca254057c1bdcf1c9debf8ef920add32a51b14817\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/accounts/OVM_ProxyEOA.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_Bytes32Utils } from \\\"../../libraries/utils/Lib_Bytes32Utils.sol\\\";\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { Lib_ECDSAUtils } from \\\"../../libraries/utils/Lib_ECDSAUtils.sol\\\";\\nimport { Lib_SafeExecutionManagerWrapper } from \\\"../../libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\\\";\\n\\n/**\\n * @title OVM_ProxyEOA\\n * @dev The Proxy EOA contract uses a delegate call to execute the logic in an implementation contract.\\n * In combination with the logic implemented in the ECDSA Contract Account, this enables a form of upgradable \\n * 'account abstraction' on layer 2. \\n * \\n * Compiler used: solc\\n * Runtime target: OVM\\n */\\ncontract OVM_ProxyEOA {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n bytes32 constant IMPLEMENTATION_KEY = 0xdeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddead;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _implementation Address of the initial implementation contract.\\n */\\n constructor(\\n address _implementation\\n )\\n {\\n _setImplementation(_implementation);\\n }\\n\\n\\n /*********************\\n * Fallback Function *\\n *********************/\\n\\n fallback()\\n external\\n {\\n (bool success, bytes memory returndata) = Lib_SafeExecutionManagerWrapper.safeDELEGATECALL(\\n gasleft(),\\n getImplementation(),\\n msg.data\\n );\\n\\n if (success) {\\n assembly {\\n return(add(returndata, 0x20), mload(returndata))\\n }\\n } else {\\n Lib_SafeExecutionManagerWrapper.safeREVERT(\\n string(returndata)\\n );\\n }\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the implementation address.\\n * @param _implementation New implementation address.\\n */\\n function upgrade(\\n address _implementation\\n )\\n external\\n {\\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(\\n Lib_SafeExecutionManagerWrapper.safeADDRESS() == Lib_SafeExecutionManagerWrapper.safeCALLER(),\\n \\\"EOAs can only upgrade their own EOA implementation\\\"\\n );\\n\\n _setImplementation(_implementation);\\n }\\n\\n /**\\n * Gets the address of the current implementation.\\n * @return Current implementation address.\\n */\\n function getImplementation()\\n public\\n returns (\\n address\\n )\\n {\\n return Lib_Bytes32Utils.toAddress(\\n Lib_SafeExecutionManagerWrapper.safeSLOAD(\\n IMPLEMENTATION_KEY\\n )\\n );\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function _setImplementation(\\n address _implementation\\n )\\n internal\\n {\\n Lib_SafeExecutionManagerWrapper.safeSSTORE(\\n IMPLEMENTATION_KEY,\\n Lib_Bytes32Utils.fromAddress(_implementation)\\n );\\n }\\n}\\n\",\"keccak256\":\"0x220433074300f98c50f923df76050fbaa548e83926351b7a27f379aa851f70ec\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/chain/OVM_CanonicalTransactionChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// @unsupported: ovm\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\nimport { Lib_MerkleTree } from \\\"../../libraries/utils/Lib_MerkleTree.sol\\\";\\nimport { Lib_Math } from \\\"../../libraries/utils/Lib_Math.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_CanonicalTransactionChain } from \\\"../../iOVM/chain/iOVM_CanonicalTransactionChain.sol\\\";\\nimport { iOVM_ChainStorageContainer } from \\\"../../iOVM/chain/iOVM_ChainStorageContainer.sol\\\";\\n\\n/* Contract Imports */\\nimport { OVM_ExecutionManager } from \\\"../execution/OVM_ExecutionManager.sol\\\";\\n\\n\\n/**\\n * @title OVM_CanonicalTransactionChain\\n * @dev The Canonical Transaction Chain (CTC) contract is an append-only log of transactions\\n * which must be applied to the rollup state. It defines the ordering of rollup transactions by\\n * writing them to the 'CTC:batches' instance of the Chain Storage Container.\\n * The CTC also allows any account to 'enqueue' an L2 transaction, which will require that the Sequencer\\n * will eventually append it to the rollup state.\\n * If the Sequencer does not include an enqueued transaction within the 'force inclusion period',\\n * then any account may force it to be included by calling appendQueueBatch().\\n *\\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract OVM_CanonicalTransactionChain is iOVM_CanonicalTransactionChain, Lib_AddressResolver {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n // L2 tx gas-related\\n uint256 constant public MIN_ROLLUP_TX_GAS = 100000;\\n uint256 constant public MAX_ROLLUP_TX_SIZE = 50000;\\n uint256 constant public L2_GAS_DISCOUNT_DIVISOR = 32;\\n\\n // Encoding-related (all in bytes)\\n uint256 constant internal BATCH_CONTEXT_SIZE = 16;\\n uint256 constant internal BATCH_CONTEXT_LENGTH_POS = 12;\\n uint256 constant internal BATCH_CONTEXT_START_POS = 15;\\n uint256 constant internal TX_DATA_HEADER_SIZE = 3;\\n uint256 constant internal BYTES_TILL_TX_DATA = 65;\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n uint256 public forceInclusionPeriodSeconds;\\n uint256 public forceInclusionPeriodBlocks;\\n uint256 public maxTransactionGasLimit;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n constructor(\\n address _libAddressManager,\\n uint256 _forceInclusionPeriodSeconds,\\n uint256 _forceInclusionPeriodBlocks,\\n uint256 _maxTransactionGasLimit\\n )\\n Lib_AddressResolver(_libAddressManager)\\n {\\n forceInclusionPeriodSeconds = _forceInclusionPeriodSeconds;\\n forceInclusionPeriodBlocks = _forceInclusionPeriodBlocks;\\n maxTransactionGasLimit = _maxTransactionGasLimit;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Accesses the batch storage container.\\n * @return Reference to the batch storage container.\\n */\\n function batches()\\n override\\n public\\n view\\n returns (\\n iOVM_ChainStorageContainer\\n )\\n {\\n return iOVM_ChainStorageContainer(\\n resolve(\\\"OVM_ChainStorageContainer:CTC:batches\\\")\\n );\\n }\\n\\n /**\\n * Accesses the queue storage container.\\n * @return Reference to the queue storage container.\\n */\\n function queue()\\n override\\n public\\n view\\n returns (\\n iOVM_ChainStorageContainer\\n )\\n {\\n return iOVM_ChainStorageContainer(\\n resolve(\\\"OVM_ChainStorageContainer:CTC:queue\\\")\\n );\\n }\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements()\\n override\\n public\\n view\\n returns (\\n uint256 _totalElements\\n )\\n {\\n (uint40 totalElements,,,) = _getBatchExtraData();\\n return uint256(totalElements);\\n }\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches()\\n override\\n public\\n view\\n returns (\\n uint256 _totalBatches\\n )\\n {\\n return batches().length();\\n }\\n\\n /**\\n * Returns the index of the next element to be enqueued.\\n * @return Index for the next queue element.\\n */\\n function getNextQueueIndex()\\n override\\n public\\n view\\n returns (\\n uint40\\n )\\n {\\n (,uint40 nextQueueIndex,,) = _getBatchExtraData();\\n return nextQueueIndex;\\n }\\n\\n /**\\n * Returns the timestamp of the last transaction.\\n * @return Timestamp for the last transaction.\\n */\\n function getLastTimestamp()\\n override\\n public\\n view\\n returns (\\n uint40\\n )\\n {\\n (,,uint40 lastTimestamp,) = _getBatchExtraData();\\n return lastTimestamp;\\n }\\n\\n /**\\n * Returns the blocknumber of the last transaction.\\n * @return Blocknumber for the last transaction.\\n */\\n function getLastBlockNumber()\\n override\\n public\\n view\\n returns (\\n uint40\\n )\\n {\\n (,,,uint40 lastBlockNumber) = _getBatchExtraData();\\n return lastBlockNumber;\\n }\\n\\n /**\\n * Gets the queue element at a particular index.\\n * @param _index Index of the queue element to access.\\n * @return _element Queue element at the given index.\\n */\\n function getQueueElement(\\n uint256 _index\\n )\\n override\\n public\\n view\\n returns (\\n Lib_OVMCodec.QueueElement memory _element\\n )\\n {\\n return _getQueueElement(\\n _index,\\n queue()\\n );\\n }\\n\\n /**\\n * Get the number of queue elements which have not yet been included.\\n * @return Number of pending queue elements.\\n */\\n function getNumPendingQueueElements()\\n override\\n public\\n view\\n returns (\\n uint40\\n )\\n {\\n return getQueueLength() - getNextQueueIndex();\\n }\\n\\n /**\\n * Retrieves the length of the queue, including\\n * both pending and canonical transactions.\\n * @return Length of the queue.\\n */\\n function getQueueLength()\\n override\\n public\\n view\\n returns (\\n uint40\\n )\\n {\\n return _getQueueLength(\\n queue()\\n );\\n }\\n\\n /**\\n * Adds a transaction to the queue.\\n * @param _target Target L2 contract to send the transaction to.\\n * @param _gasLimit Gas limit for the enqueued L2 transaction.\\n * @param _data Transaction data.\\n */\\n function enqueue(\\n address _target,\\n uint256 _gasLimit,\\n bytes memory _data\\n )\\n override\\n public\\n {\\n require(\\n _data.length <= MAX_ROLLUP_TX_SIZE,\\n \\\"Transaction data size exceeds maximum for rollup transaction.\\\"\\n );\\n\\n require(\\n _gasLimit <= maxTransactionGasLimit,\\n \\\"Transaction gas limit exceeds maximum for rollup transaction.\\\"\\n );\\n\\n require(\\n _gasLimit >= MIN_ROLLUP_TX_GAS,\\n \\\"Transaction gas limit too low to enqueue.\\\"\\n );\\n\\n // We need to consume some amount of L1 gas in order to rate limit transactions going into\\n // L2. However, L2 is cheaper than L1 so we only need to burn some small proportion of the\\n // provided L1 gas.\\n uint256 gasToConsume = _gasLimit/L2_GAS_DISCOUNT_DIVISOR;\\n uint256 startingGas = gasleft();\\n\\n // Although this check is not necessary (burn below will run out of gas if not true), it\\n // gives the user an explicit reason as to why the enqueue attempt failed.\\n require(\\n startingGas > gasToConsume,\\n \\\"Insufficient gas for L2 rate limiting burn.\\\"\\n );\\n\\n // Here we do some \\\"dumb\\\" work in order to burn gas, although we should probably replace\\n // this with something like minting gas token later on.\\n uint256 i;\\n while(startingGas - gasleft() < gasToConsume) {\\n i++;\\n }\\n\\n bytes32 transactionHash = keccak256(\\n abi.encode(\\n msg.sender,\\n _target,\\n _gasLimit,\\n _data\\n )\\n );\\n\\n bytes32 timestampAndBlockNumber;\\n assembly {\\n timestampAndBlockNumber := timestamp()\\n timestampAndBlockNumber := or(timestampAndBlockNumber, shl(40, number()))\\n }\\n\\n iOVM_ChainStorageContainer queueRef = queue();\\n\\n queueRef.push(transactionHash);\\n queueRef.push(timestampAndBlockNumber);\\n\\n // The underlying queue data structure stores 2 elements\\n // per insertion, so to get the real queue length we need\\n // to divide by 2 and subtract 1.\\n uint256 queueIndex = queueRef.length() / 2 - 1;\\n emit TransactionEnqueued(\\n msg.sender,\\n _target,\\n _gasLimit,\\n _data,\\n queueIndex,\\n block.timestamp\\n );\\n }\\n\\n /**\\n * Appends a given number of queued transactions as a single batch.\\n * param _numQueuedTransactions Number of transactions to append.\\n */\\n function appendQueueBatch(\\n uint256 // _numQueuedTransactions\\n )\\n override\\n public\\n pure\\n {\\n // TEMPORARY: Disable `appendQueueBatch` for minnet\\n revert(\\\"appendQueueBatch is currently disabled.\\\");\\n\\n // _numQueuedTransactions = Lib_Math.min(_numQueuedTransactions, getNumPendingQueueElements());\\n // require(\\n // _numQueuedTransactions > 0,\\n // \\\"Must append more than zero transactions.\\\"\\n // );\\n\\n // bytes32[] memory leaves = new bytes32[](_numQueuedTransactions);\\n // uint40 nextQueueIndex = getNextQueueIndex();\\n\\n // for (uint256 i = 0; i < _numQueuedTransactions; i++) {\\n // if (msg.sender != resolve(\\\"OVM_Sequencer\\\")) {\\n // Lib_OVMCodec.QueueElement memory el = getQueueElement(nextQueueIndex);\\n // require(\\n // el.timestamp + forceInclusionPeriodSeconds < block.timestamp,\\n // \\\"Queue transactions cannot be submitted during the sequencer inclusion period.\\\"\\n // );\\n // }\\n // leaves[i] = _getQueueLeafHash(nextQueueIndex);\\n // nextQueueIndex++;\\n // }\\n\\n // Lib_OVMCodec.QueueElement memory lastElement = getQueueElement(nextQueueIndex - 1);\\n\\n // _appendBatch(\\n // Lib_MerkleTree.getMerkleRoot(leaves),\\n // _numQueuedTransactions,\\n // _numQueuedTransactions,\\n // lastElement.timestamp,\\n // lastElement.blockNumber\\n // );\\n\\n // emit QueueBatchAppended(\\n // nextQueueIndex - _numQueuedTransactions,\\n // _numQueuedTransactions,\\n // getTotalElements()\\n // );\\n }\\n\\n /**\\n * Allows the sequencer to append a batch of transactions.\\n * @dev This function uses a custom encoding scheme for efficiency reasons.\\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\\n * .param _contexts Array of batch contexts.\\n * .param _transactionDataFields Array of raw transaction data.\\n */\\n function appendSequencerBatch()\\n override\\n public\\n {\\n uint40 shouldStartAtElement;\\n uint24 totalElementsToAppend;\\n uint24 numContexts;\\n assembly {\\n shouldStartAtElement := shr(216, calldataload(4))\\n totalElementsToAppend := shr(232, calldataload(9))\\n numContexts := shr(232, calldataload(12))\\n }\\n\\n require(\\n shouldStartAtElement == getTotalElements(),\\n \\\"Actual batch start index does not match expected start index.\\\"\\n );\\n\\n require(\\n msg.sender == resolve(\\\"OVM_Sequencer\\\"),\\n \\\"Function can only be called by the Sequencer.\\\"\\n );\\n\\n require(\\n numContexts > 0,\\n \\\"Must provide at least one batch context.\\\"\\n );\\n\\n require(\\n totalElementsToAppend > 0,\\n \\\"Must append at least one element.\\\"\\n );\\n\\n uint40 nextTransactionPtr = uint40(BATCH_CONTEXT_START_POS + BATCH_CONTEXT_SIZE * numContexts);\\n\\n require(\\n msg.data.length >= nextTransactionPtr,\\n \\\"Not enough BatchContexts provided.\\\"\\n );\\n\\n // Take a reference to the queue and its length so we don't have to keep resolving it.\\n // Length isn't going to change during the course of execution, so it's fine to simply\\n // resolve this once at the start. Saves gas.\\n iOVM_ChainStorageContainer queueRef = queue();\\n uint40 queueLength = _getQueueLength(queueRef);\\n\\n // Reserve some memory to save gas on hashing later on. This is a relatively safe estimate\\n // for the average transaction size that will prevent having to resize this chunk of memory\\n // later on. Saves gas.\\n bytes memory hashMemory = new bytes((msg.data.length / totalElementsToAppend) * 2);\\n\\n // Initialize the array of canonical chain leaves that we will append.\\n bytes32[] memory leaves = new bytes32[](totalElementsToAppend);\\n\\n // Each leaf index corresponds to a tx, either sequenced or enqueued.\\n uint32 leafIndex = 0;\\n\\n // Counter for number of sequencer transactions appended so far.\\n uint32 numSequencerTransactions = 0;\\n\\n // We will sequentially append leaves which are pointers to the queue.\\n // The initial queue index is what is currently in storage.\\n uint40 nextQueueIndex = getNextQueueIndex();\\n\\n BatchContext memory curContext;\\n for (uint32 i = 0; i < numContexts; i++) {\\n BatchContext memory nextContext = _getBatchContext(i);\\n\\n if (i == 0) {\\n // Execute a special check for the first batch.\\n _validateFirstBatchContext(nextContext);\\n }\\n\\n // Execute this check on every single batch, including the first one.\\n _validateNextBatchContext(\\n curContext,\\n nextContext,\\n nextQueueIndex,\\n queueRef\\n );\\n\\n // Now we can update our current context.\\n curContext = nextContext;\\n\\n // Process sequencer transactions first.\\n for (uint32 j = 0; j < curContext.numSequencedTransactions; j++) {\\n uint256 txDataLength;\\n assembly {\\n txDataLength := shr(232, calldataload(nextTransactionPtr))\\n }\\n require(\\n txDataLength <= MAX_ROLLUP_TX_SIZE,\\n \\\"Transaction data size exceeds maximum for rollup transaction.\\\"\\n );\\n\\n leaves[leafIndex] = _getSequencerLeafHash(\\n curContext,\\n nextTransactionPtr,\\n txDataLength,\\n hashMemory\\n );\\n\\n nextTransactionPtr += uint40(TX_DATA_HEADER_SIZE + txDataLength);\\n numSequencerTransactions++;\\n leafIndex++;\\n }\\n\\n // Now process any subsequent queue transactions.\\n for (uint32 j = 0; j < curContext.numSubsequentQueueTransactions; j++) {\\n require(\\n nextQueueIndex < queueLength,\\n \\\"Not enough queued transactions to append.\\\"\\n );\\n\\n leaves[leafIndex] = _getQueueLeafHash(nextQueueIndex);\\n nextQueueIndex++;\\n leafIndex++;\\n }\\n }\\n\\n _validateFinalBatchContext(\\n curContext,\\n nextQueueIndex,\\n queueLength,\\n queueRef\\n );\\n\\n require(\\n msg.data.length == nextTransactionPtr,\\n \\\"Not all sequencer transactions were processed.\\\"\\n );\\n\\n require(\\n leafIndex == totalElementsToAppend,\\n \\\"Actual transaction index does not match expected total elements to append.\\\"\\n );\\n\\n // Generate the required metadata that we need to append this batch\\n uint40 numQueuedTransactions = totalElementsToAppend - numSequencerTransactions;\\n uint40 blockTimestamp;\\n uint40 blockNumber;\\n if (curContext.numSubsequentQueueTransactions == 0) {\\n // The last element is a sequencer tx, therefore pull timestamp and block number from the last context.\\n blockTimestamp = uint40(curContext.timestamp);\\n blockNumber = uint40(curContext.blockNumber);\\n } else {\\n // The last element is a queue tx, therefore pull timestamp and block number from the queue element.\\n // curContext.numSubsequentQueueTransactions > 0 which means that we've processed at least one queue element.\\n // We increment nextQueueIndex after processing each queue element,\\n // so the index of the last element we processed is nextQueueIndex - 1.\\n Lib_OVMCodec.QueueElement memory lastElement = _getQueueElement(\\n nextQueueIndex - 1,\\n queueRef\\n );\\n\\n blockTimestamp = lastElement.timestamp;\\n blockNumber = lastElement.blockNumber;\\n }\\n\\n // For efficiency reasons getMerkleRoot modifies the `leaves` argument in place\\n // while calculating the root hash therefore any arguments passed to it must not\\n // be used again afterwards\\n _appendBatch(\\n Lib_MerkleTree.getMerkleRoot(leaves),\\n totalElementsToAppend,\\n numQueuedTransactions,\\n blockTimestamp,\\n blockNumber\\n );\\n\\n emit SequencerBatchAppended(\\n nextQueueIndex - numQueuedTransactions,\\n numQueuedTransactions,\\n getTotalElements()\\n );\\n }\\n\\n /**\\n * Verifies whether a transaction is included in the chain.\\n * @param _transaction Transaction to verify.\\n * @param _txChainElement Transaction chain element corresponding to the transaction.\\n * @param _batchHeader Header of the batch the transaction was included in.\\n * @param _inclusionProof Inclusion proof for the provided transaction chain element.\\n * @return True if the transaction exists in the CTC, false if not.\\n */\\n function verifyTransaction(\\n Lib_OVMCodec.Transaction memory _transaction,\\n Lib_OVMCodec.TransactionChainElement memory _txChainElement,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _inclusionProof\\n )\\n override\\n public\\n view\\n returns (\\n bool\\n )\\n {\\n if (_txChainElement.isSequenced == true) {\\n return _verifySequencerTransaction(\\n _transaction,\\n _txChainElement,\\n _batchHeader,\\n _inclusionProof\\n );\\n } else {\\n return _verifyQueueTransaction(\\n _transaction,\\n _txChainElement.queueIndex,\\n _batchHeader,\\n _inclusionProof\\n );\\n }\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Returns the BatchContext located at a particular index.\\n * @param _index The index of the BatchContext\\n * @return The BatchContext at the specified index.\\n */\\n function _getBatchContext(\\n uint256 _index\\n )\\n internal\\n pure\\n returns (\\n BatchContext memory\\n )\\n {\\n uint256 contextPtr = 15 + _index * BATCH_CONTEXT_SIZE;\\n uint256 numSequencedTransactions;\\n uint256 numSubsequentQueueTransactions;\\n uint256 ctxTimestamp;\\n uint256 ctxBlockNumber;\\n\\n assembly {\\n numSequencedTransactions := shr(232, calldataload(contextPtr))\\n numSubsequentQueueTransactions := shr(232, calldataload(add(contextPtr, 3)))\\n ctxTimestamp := shr(216, calldataload(add(contextPtr, 6)))\\n ctxBlockNumber := shr(216, calldataload(add(contextPtr, 11)))\\n }\\n\\n return BatchContext({\\n numSequencedTransactions: numSequencedTransactions,\\n numSubsequentQueueTransactions: numSubsequentQueueTransactions,\\n timestamp: ctxTimestamp,\\n blockNumber: ctxBlockNumber\\n });\\n }\\n\\n /**\\n * Parses the batch context from the extra data.\\n * @return Total number of elements submitted.\\n * @return Index of the next queue element.\\n */\\n function _getBatchExtraData()\\n internal\\n view\\n returns (\\n uint40,\\n uint40,\\n uint40,\\n uint40\\n )\\n {\\n bytes27 extraData = batches().getGlobalMetadata();\\n\\n uint40 totalElements;\\n uint40 nextQueueIndex;\\n uint40 lastTimestamp;\\n uint40 lastBlockNumber;\\n assembly {\\n extraData := shr(40, extraData)\\n totalElements := and(extraData, 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF)\\n nextQueueIndex := shr(40, and(extraData, 0x00000000000000000000000000000000000000000000FFFFFFFFFF0000000000))\\n lastTimestamp := shr(80, and(extraData, 0x0000000000000000000000000000000000FFFFFFFFFF00000000000000000000))\\n lastBlockNumber := shr(120, and(extraData, 0x000000000000000000000000FFFFFFFFFF000000000000000000000000000000))\\n }\\n\\n return (\\n totalElements,\\n nextQueueIndex,\\n lastTimestamp,\\n lastBlockNumber\\n );\\n }\\n\\n /**\\n * Encodes the batch context for the extra data.\\n * @param _totalElements Total number of elements submitted.\\n * @param _nextQueueIndex Index of the next queue element.\\n * @param _timestamp Timestamp for the last batch.\\n * @param _blockNumber Block number of the last batch.\\n * @return Encoded batch context.\\n */\\n function _makeBatchExtraData(\\n uint40 _totalElements,\\n uint40 _nextQueueIndex,\\n uint40 _timestamp,\\n uint40 _blockNumber\\n )\\n internal\\n pure\\n returns (\\n bytes27\\n )\\n {\\n bytes27 extraData;\\n assembly {\\n extraData := _totalElements\\n extraData := or(extraData, shl(40, _nextQueueIndex))\\n extraData := or(extraData, shl(80, _timestamp))\\n extraData := or(extraData, shl(120, _blockNumber))\\n extraData := shl(40, extraData)\\n }\\n\\n return extraData;\\n }\\n\\n /**\\n * Retrieves the hash of a queue element.\\n * @param _index Index of the queue element to retrieve a hash for.\\n * @return Hash of the queue element.\\n */\\n function _getQueueLeafHash(\\n uint256 _index\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return _hashTransactionChainElement(\\n Lib_OVMCodec.TransactionChainElement({\\n isSequenced: false,\\n queueIndex: _index,\\n timestamp: 0,\\n blockNumber: 0,\\n txData: hex\\\"\\\"\\n })\\n );\\n }\\n\\n /**\\n * Gets the queue element at a particular index.\\n * @param _index Index of the queue element to access.\\n * @return _element Queue element at the given index.\\n */\\n function _getQueueElement(\\n uint256 _index,\\n iOVM_ChainStorageContainer _queueRef\\n )\\n internal\\n view\\n returns (\\n Lib_OVMCodec.QueueElement memory _element\\n )\\n {\\n // The underlying queue data structure stores 2 elements\\n // per insertion, so to get the actual desired queue index\\n // we need to multiply by 2.\\n uint40 trueIndex = uint40(_index * 2);\\n bytes32 transactionHash = _queueRef.get(trueIndex);\\n bytes32 timestampAndBlockNumber = _queueRef.get(trueIndex + 1);\\n\\n uint40 elementTimestamp;\\n uint40 elementBlockNumber;\\n assembly {\\n elementTimestamp := and(timestampAndBlockNumber, 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF)\\n elementBlockNumber := shr(40, and(timestampAndBlockNumber, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000))\\n }\\n\\n return Lib_OVMCodec.QueueElement({\\n transactionHash: transactionHash,\\n timestamp: elementTimestamp,\\n blockNumber: elementBlockNumber\\n });\\n }\\n\\n /**\\n * Retrieves the length of the queue.\\n * @return Length of the queue.\\n */\\n function _getQueueLength(\\n iOVM_ChainStorageContainer _queueRef\\n )\\n internal\\n view\\n returns (\\n uint40\\n )\\n {\\n // The underlying queue data structure stores 2 elements\\n // per insertion, so to get the real queue length we need\\n // to divide by 2.\\n return uint40(_queueRef.length() / 2);\\n }\\n\\n /**\\n * Retrieves the hash of a sequencer element.\\n * @param _context Batch context for the given element.\\n * @param _nextTransactionPtr Pointer to the next transaction in the calldata.\\n * @param _txDataLength Length of the transaction item.\\n * @return Hash of the sequencer element.\\n */\\n function _getSequencerLeafHash(\\n BatchContext memory _context,\\n uint256 _nextTransactionPtr,\\n uint256 _txDataLength,\\n bytes memory _hashMemory\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n // Only allocate more memory if we didn't reserve enough to begin with.\\n if (BYTES_TILL_TX_DATA + _txDataLength > _hashMemory.length) {\\n _hashMemory = new bytes(BYTES_TILL_TX_DATA + _txDataLength);\\n }\\n\\n uint256 ctxTimestamp = _context.timestamp;\\n uint256 ctxBlockNumber = _context.blockNumber;\\n\\n bytes32 leafHash;\\n assembly {\\n let chainElementStart := add(_hashMemory, 0x20)\\n\\n // Set the first byte equal to `1` to indicate this is a sequencer chain element.\\n // This distinguishes sequencer ChainElements from queue ChainElements because\\n // all queue ChainElements are ABI encoded and the first byte of ABI encoded\\n // elements is always zero\\n mstore8(chainElementStart, 1)\\n\\n mstore(add(chainElementStart, 1), ctxTimestamp)\\n mstore(add(chainElementStart, 33), ctxBlockNumber)\\n\\n calldatacopy(add(chainElementStart, BYTES_TILL_TX_DATA), add(_nextTransactionPtr, 3), _txDataLength)\\n\\n leafHash := keccak256(chainElementStart, add(BYTES_TILL_TX_DATA, _txDataLength))\\n }\\n\\n return leafHash;\\n }\\n\\n /**\\n * Retrieves the hash of a sequencer element.\\n * @param _txChainElement The chain element which is hashed to calculate the leaf.\\n * @return Hash of the sequencer element.\\n */\\n function _getSequencerLeafHash(\\n Lib_OVMCodec.TransactionChainElement memory _txChainElement\\n )\\n internal\\n view\\n returns(\\n bytes32\\n )\\n {\\n bytes memory txData = _txChainElement.txData;\\n uint256 txDataLength = _txChainElement.txData.length;\\n\\n bytes memory chainElement = new bytes(BYTES_TILL_TX_DATA + txDataLength);\\n uint256 ctxTimestamp = _txChainElement.timestamp;\\n uint256 ctxBlockNumber = _txChainElement.blockNumber;\\n\\n bytes32 leafHash;\\n assembly {\\n let chainElementStart := add(chainElement, 0x20)\\n\\n // Set the first byte equal to `1` to indicate this is a sequencer chain element.\\n // This distinguishes sequencer ChainElements from queue ChainElements because\\n // all queue ChainElements are ABI encoded and the first byte of ABI encoded\\n // elements is always zero\\n mstore8(chainElementStart, 1)\\n\\n mstore(add(chainElementStart, 1), ctxTimestamp)\\n mstore(add(chainElementStart, 33), ctxBlockNumber)\\n\\n pop(staticcall(gas(), 0x04, add(txData, 0x20), txDataLength, add(chainElementStart, BYTES_TILL_TX_DATA), txDataLength))\\n\\n leafHash := keccak256(chainElementStart, add(BYTES_TILL_TX_DATA, txDataLength))\\n }\\n\\n return leafHash;\\n }\\n\\n /**\\n * Inserts a batch into the chain of batches.\\n * @param _transactionRoot Root of the transaction tree for this batch.\\n * @param _batchSize Number of elements in the batch.\\n * @param _numQueuedTransactions Number of queue transactions in the batch.\\n * @param _timestamp The latest batch timestamp.\\n * @param _blockNumber The latest batch blockNumber.\\n */\\n function _appendBatch(\\n bytes32 _transactionRoot,\\n uint256 _batchSize,\\n uint256 _numQueuedTransactions,\\n uint40 _timestamp,\\n uint40 _blockNumber\\n )\\n internal\\n {\\n iOVM_ChainStorageContainer batchesRef = batches();\\n (uint40 totalElements, uint40 nextQueueIndex,,) = _getBatchExtraData();\\n\\n Lib_OVMCodec.ChainBatchHeader memory header = Lib_OVMCodec.ChainBatchHeader({\\n batchIndex: batchesRef.length(),\\n batchRoot: _transactionRoot,\\n batchSize: _batchSize,\\n prevTotalElements: totalElements,\\n extraData: hex\\\"\\\"\\n });\\n\\n emit TransactionBatchAppended(\\n header.batchIndex,\\n header.batchRoot,\\n header.batchSize,\\n header.prevTotalElements,\\n header.extraData\\n );\\n\\n bytes32 batchHeaderHash = Lib_OVMCodec.hashBatchHeader(header);\\n bytes27 latestBatchContext = _makeBatchExtraData(\\n totalElements + uint40(header.batchSize),\\n nextQueueIndex + uint40(_numQueuedTransactions),\\n _timestamp,\\n _blockNumber\\n );\\n\\n batchesRef.push(batchHeaderHash, latestBatchContext);\\n }\\n\\n /**\\n * Checks that the first batch context in a sequencer submission is valid\\n * @param _firstContext The batch context to validate.\\n */\\n function _validateFirstBatchContext(\\n BatchContext memory _firstContext\\n )\\n internal\\n view\\n {\\n // If there are existing elements, this batch must have the same context\\n // or a later timestamp and block number.\\n if (getTotalElements() > 0) {\\n (,, uint40 lastTimestamp, uint40 lastBlockNumber) = _getBatchExtraData();\\n\\n require(\\n _firstContext.blockNumber >= lastBlockNumber,\\n \\\"Context block number is lower than last submitted.\\\"\\n );\\n\\n require(\\n _firstContext.timestamp >= lastTimestamp,\\n \\\"Context timestamp is lower than last submitted.\\\"\\n );\\n }\\n\\n // Sequencer cannot submit contexts which are more than the force inclusion period old.\\n require(\\n _firstContext.timestamp + forceInclusionPeriodSeconds >= block.timestamp,\\n \\\"Context timestamp too far in the past.\\\"\\n );\\n\\n require(\\n _firstContext.blockNumber + forceInclusionPeriodBlocks >= block.number,\\n \\\"Context block number too far in the past.\\\"\\n );\\n }\\n\\n /**\\n * Checks that a given batch context has a time context which is below a given que element\\n * @param _context The batch context to validate has values lower.\\n * @param _queueIndex Index of the queue element we are validating came later than the context.\\n * @param _queueRef The storage container for the queue.\\n */\\n function _validateContextBeforeEnqueue(\\n BatchContext memory _context,\\n uint40 _queueIndex,\\n iOVM_ChainStorageContainer _queueRef\\n )\\n internal\\n view\\n {\\n Lib_OVMCodec.QueueElement memory nextQueueElement = _getQueueElement(\\n _queueIndex,\\n _queueRef\\n );\\n\\n // If the force inclusion period has passed for an enqueued transaction, it MUST be the next chain element.\\n require(\\n block.timestamp < nextQueueElement.timestamp + forceInclusionPeriodSeconds,\\n \\\"Previously enqueued batches have expired and must be appended before a new sequencer batch.\\\"\\n );\\n\\n // Just like sequencer transaction times must be increasing relative to each other,\\n // We also require that they be increasing relative to any interspersed queue elements.\\n require(\\n _context.timestamp <= nextQueueElement.timestamp,\\n \\\"Sequencer transaction timestamp exceeds that of next queue element.\\\"\\n );\\n\\n require(\\n _context.blockNumber <= nextQueueElement.blockNumber,\\n \\\"Sequencer transaction blockNumber exceeds that of next queue element.\\\"\\n );\\n }\\n\\n /**\\n * Checks that a given batch context is valid based on its previous context, and the next queue elemtent.\\n * @param _prevContext The previously validated batch context.\\n * @param _nextContext The batch context to validate with this call.\\n * @param _nextQueueIndex Index of the next queue element to process for the _nextContext's subsequentQueueElements.\\n * @param _queueRef The storage container for the queue.\\n */\\n function _validateNextBatchContext(\\n BatchContext memory _prevContext,\\n BatchContext memory _nextContext,\\n uint40 _nextQueueIndex,\\n iOVM_ChainStorageContainer _queueRef\\n )\\n internal\\n view\\n {\\n // All sequencer transactions' times must be greater than or equal to the previous ones.\\n require(\\n _nextContext.timestamp >= _prevContext.timestamp,\\n \\\"Context timestamp values must monotonically increase.\\\"\\n );\\n\\n require(\\n _nextContext.blockNumber >= _prevContext.blockNumber,\\n \\\"Context blockNumber values must monotonically increase.\\\"\\n );\\n\\n // If there is going to be a queue element pulled in from this context:\\n if (_nextContext.numSubsequentQueueTransactions > 0) {\\n _validateContextBeforeEnqueue(\\n _nextContext,\\n _nextQueueIndex,\\n _queueRef\\n );\\n }\\n }\\n\\n /**\\n * Checks that the final batch context in a sequencer submission is valid.\\n * @param _finalContext The batch context to validate.\\n * @param _queueLength The length of the queue at the start of the batchAppend call.\\n * @param _nextQueueIndex The next element in the queue that will be pulled into the CTC.\\n * @param _queueRef The storage container for the queue.\\n */\\n function _validateFinalBatchContext(\\n BatchContext memory _finalContext,\\n uint40 _nextQueueIndex,\\n uint40 _queueLength,\\n iOVM_ChainStorageContainer _queueRef\\n )\\n internal\\n view\\n {\\n // If the queue is not now empty, check the mononoticity of whatever the next batch that will come in is.\\n if (_queueLength - _nextQueueIndex > 0 && _finalContext.numSubsequentQueueTransactions == 0) {\\n _validateContextBeforeEnqueue(\\n _finalContext,\\n _nextQueueIndex,\\n _queueRef\\n );\\n }\\n // Batches cannot be added from the future, or subsequent enqueue() contexts would violate monotonicity.\\n require(_finalContext.timestamp <= block.timestamp, \\\"Context timestamp is from the future.\\\");\\n require(_finalContext.blockNumber <= block.number, \\\"Context block number is from the future.\\\");\\n }\\n\\n /**\\n * Hashes a transaction chain element.\\n * @param _element Chain element to hash.\\n * @return Hash of the chain element.\\n */\\n function _hashTransactionChainElement(\\n Lib_OVMCodec.TransactionChainElement memory _element\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(\\n abi.encode(\\n _element.isSequenced,\\n _element.queueIndex,\\n _element.timestamp,\\n _element.blockNumber,\\n _element.txData\\n )\\n );\\n }\\n\\n /**\\n * Verifies a sequencer transaction, returning true if it was indeed included in the CTC\\n * @param _transaction The transaction we are verifying inclusion of.\\n * @param _txChainElement The chain element that the transaction is claimed to be a part of.\\n * @param _batchHeader Header of the batch the transaction was included in.\\n * @param _inclusionProof An inclusion proof into the CTC at a particular index.\\n * @return True if the transaction was included in the specified location, else false.\\n */\\n function _verifySequencerTransaction(\\n Lib_OVMCodec.Transaction memory _transaction,\\n Lib_OVMCodec.TransactionChainElement memory _txChainElement,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _inclusionProof\\n )\\n internal\\n view\\n returns (\\n bool\\n )\\n {\\n OVM_ExecutionManager ovmExecutionManager = OVM_ExecutionManager(resolve(\\\"OVM_ExecutionManager\\\"));\\n uint256 gasLimit = ovmExecutionManager.getMaxTransactionGasLimit();\\n bytes32 leafHash = _getSequencerLeafHash(_txChainElement);\\n\\n require(\\n _verifyElement(\\n leafHash,\\n _batchHeader,\\n _inclusionProof\\n ),\\n \\\"Invalid Sequencer transaction inclusion proof.\\\"\\n );\\n\\n require(\\n _transaction.blockNumber == _txChainElement.blockNumber\\n && _transaction.timestamp == _txChainElement.timestamp\\n && _transaction.entrypoint == resolve(\\\"OVM_DecompressionPrecompileAddress\\\")\\n && _transaction.gasLimit == gasLimit\\n && _transaction.l1TxOrigin == address(0)\\n && _transaction.l1QueueOrigin == Lib_OVMCodec.QueueOrigin.SEQUENCER_QUEUE\\n && keccak256(_transaction.data) == keccak256(_txChainElement.txData),\\n \\\"Invalid Sequencer transaction.\\\"\\n );\\n\\n return true;\\n }\\n\\n /**\\n * Verifies a queue transaction, returning true if it was indeed included in the CTC\\n * @param _transaction The transaction we are verifying inclusion of.\\n * @param _queueIndex The queueIndex of the queued transaction.\\n * @param _batchHeader Header of the batch the transaction was included in.\\n * @param _inclusionProof An inclusion proof into the CTC at a particular index (should point to queue tx).\\n * @return True if the transaction was included in the specified location, else false.\\n */\\n function _verifyQueueTransaction(\\n Lib_OVMCodec.Transaction memory _transaction,\\n uint256 _queueIndex,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _inclusionProof\\n )\\n internal\\n view\\n returns (\\n bool\\n )\\n {\\n bytes32 leafHash = _getQueueLeafHash(_queueIndex);\\n\\n require(\\n _verifyElement(\\n leafHash,\\n _batchHeader,\\n _inclusionProof\\n ),\\n \\\"Invalid Queue transaction inclusion proof.\\\"\\n );\\n\\n bytes32 transactionHash = keccak256(\\n abi.encode(\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n )\\n );\\n\\n Lib_OVMCodec.QueueElement memory el = getQueueElement(_queueIndex);\\n require(\\n el.transactionHash == transactionHash\\n && el.timestamp == _transaction.timestamp\\n && el.blockNumber == _transaction.blockNumber,\\n \\\"Invalid Queue transaction.\\\"\\n );\\n\\n return true;\\n }\\n\\n /**\\n * Verifies a batch inclusion proof.\\n * @param _element Hash of the element to verify a proof for.\\n * @param _batchHeader Header of the batch in which the element was included.\\n * @param _proof Merkle inclusion proof for the element.\\n */\\n function _verifyElement(\\n bytes32 _element,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _proof\\n )\\n internal\\n view\\n returns (\\n bool\\n )\\n {\\n require(\\n Lib_OVMCodec.hashBatchHeader(_batchHeader) == batches().get(uint32(_batchHeader.batchIndex)),\\n \\\"Invalid batch header.\\\"\\n );\\n\\n require(\\n Lib_MerkleTree.verify(\\n _batchHeader.batchRoot,\\n _element,\\n _proof.index,\\n _proof.siblings,\\n _batchHeader.batchSize\\n ),\\n \\\"Invalid inclusion proof.\\\"\\n );\\n\\n return true;\\n }\\n}\\n\",\"keccak256\":\"0x70eb90b2f03d5b4c78af0b479d253eacdf311e760b80108710aafc0aa0b84941\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// @unsupported: ovm\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\nimport { Lib_EthUtils } from \\\"../../libraries/utils/Lib_EthUtils.sol\\\";\\nimport { Lib_ErrorUtils } from \\\"../../libraries/utils/Lib_ErrorUtils.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_ExecutionManager } from \\\"../../iOVM/execution/iOVM_ExecutionManager.sol\\\";\\nimport { iOVM_StateManager } from \\\"../../iOVM/execution/iOVM_StateManager.sol\\\";\\nimport { iOVM_SafetyChecker } from \\\"../../iOVM/execution/iOVM_SafetyChecker.sol\\\";\\n\\n/* Contract Imports */\\nimport { OVM_ECDSAContractAccount } from \\\"../accounts/OVM_ECDSAContractAccount.sol\\\";\\nimport { OVM_ProxyEOA } from \\\"../accounts/OVM_ProxyEOA.sol\\\";\\nimport { OVM_DeployerWhitelist } from \\\"../predeploys/OVM_DeployerWhitelist.sol\\\";\\n\\n/**\\n * @title OVM_ExecutionManager\\n * @dev The Execution Manager (EM) is the core of our OVM implementation, and provides a sandboxed\\n * environment allowing us to execute OVM transactions deterministically on either Layer 1 or\\n * Layer 2.\\n * The EM's run() function is the first function called during the execution of any\\n * transaction on L2.\\n * For each context-dependent EVM operation the EM has a function which implements a corresponding\\n * OVM operation, which will read state from the State Manager contract.\\n * The EM relies on the Safety Checker to verify that code deployed to Layer 2 does not contain any\\n * context-dependent operations.\\n *\\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract OVM_ExecutionManager is iOVM_ExecutionManager, Lib_AddressResolver {\\n\\n /********************************\\n * External Contract References *\\n ********************************/\\n\\n iOVM_SafetyChecker internal ovmSafetyChecker;\\n iOVM_StateManager internal ovmStateManager;\\n\\n\\n /*******************************\\n * Execution Context Variables *\\n *******************************/\\n\\n GasMeterConfig internal gasMeterConfig;\\n GlobalContext internal globalContext;\\n TransactionContext internal transactionContext;\\n MessageContext internal messageContext;\\n TransactionRecord internal transactionRecord;\\n MessageRecord internal messageRecord;\\n\\n\\n /**************************\\n * Gas Metering Constants *\\n **************************/\\n\\n address constant GAS_METADATA_ADDRESS = 0x06a506A506a506A506a506a506A506A506A506A5;\\n uint256 constant NUISANCE_GAS_SLOAD = 20000;\\n uint256 constant NUISANCE_GAS_SSTORE = 20000;\\n uint256 constant MIN_NUISANCE_GAS_PER_CONTRACT = 30000;\\n uint256 constant NUISANCE_GAS_PER_CONTRACT_BYTE = 100;\\n uint256 constant MIN_GAS_FOR_INVALID_STATE_ACCESS = 30000;\\n\\n /**************************\\n * Default Context Values *\\n **************************/\\n\\n uint256 constant DEFAULT_UINT256 = 0xdefa017defa017defa017defa017defa017defa017defa017defa017defa017d;\\n address constant DEFAULT_ADDRESS = 0xdEfa017defA017DeFA017DEfa017DeFA017DeFa0;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n */\\n constructor(\\n address _libAddressManager,\\n GasMeterConfig memory _gasMeterConfig,\\n GlobalContext memory _globalContext\\n )\\n Lib_AddressResolver(_libAddressManager)\\n {\\n ovmSafetyChecker = iOVM_SafetyChecker(resolve(\\\"OVM_SafetyChecker\\\"));\\n gasMeterConfig = _gasMeterConfig;\\n globalContext = _globalContext;\\n _resetContext();\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n /**\\n * Applies dynamically-sized refund to a transaction to account for the difference in execution\\n * between L1 and L2, so that the overall cost of the ovmOPCODE is fixed.\\n * @param _cost Desired gas cost for the function after the refund.\\n */\\n modifier netGasCost(\\n uint256 _cost\\n ) {\\n uint256 gasProvided = gasleft();\\n _;\\n uint256 gasUsed = gasProvided - gasleft();\\n\\n // We want to refund everything *except* the specified cost.\\n if (_cost < gasUsed) {\\n transactionRecord.ovmGasRefund += gasUsed - _cost;\\n }\\n }\\n\\n /**\\n * Applies a fixed-size gas refund to a transaction to account for the difference in execution\\n * between L1 and L2, so that the overall cost of an ovmOPCODE can be lowered.\\n * @param _discount Amount of gas cost to refund for the ovmOPCODE.\\n */\\n modifier fixedGasDiscount(\\n uint256 _discount\\n ) {\\n uint256 gasProvided = gasleft();\\n _;\\n uint256 gasUsed = gasProvided - gasleft();\\n\\n // We want to refund the specified _discount, unless this risks underflow.\\n if (_discount < gasUsed) {\\n transactionRecord.ovmGasRefund += _discount;\\n } else {\\n // refund all we can without risking underflow.\\n transactionRecord.ovmGasRefund += gasUsed;\\n }\\n }\\n\\n /**\\n * Makes sure we're not inside a static context.\\n */\\n modifier notStatic() {\\n if (messageContext.isStatic == true) {\\n _revertWithFlag(RevertFlag.STATIC_VIOLATION);\\n }\\n _;\\n }\\n\\n\\n /************************************\\n * Transaction Execution Entrypoint *\\n ************************************/\\n\\n /**\\n * Starts the execution of a transaction via the OVM_ExecutionManager.\\n * @param _transaction Transaction data to be executed.\\n * @param _ovmStateManager iOVM_StateManager implementation providing account state.\\n */\\n function run(\\n Lib_OVMCodec.Transaction memory _transaction,\\n address _ovmStateManager\\n )\\n override\\n public\\n {\\n // Make sure that run() is not re-enterable. This condition should awlways be satisfied\\n // Once run has been called once, due to the behvaior of _isValidInput().\\n if (transactionContext.ovmNUMBER != DEFAULT_UINT256) {\\n return;\\n }\\n\\n // Store our OVM_StateManager instance (significantly easier than attempting to pass the\\n // address around in calldata).\\n ovmStateManager = iOVM_StateManager(_ovmStateManager);\\n\\n // Make sure this function can't be called by anyone except the owner of the\\n // OVM_StateManager (expected to be an OVM_StateTransitioner). We can revert here because\\n // this would make the `run` itself invalid.\\n require(\\n // This method may return false during fraud proofs, but always returns true in L2 nodes' State Manager precompile.\\n ovmStateManager.isAuthenticated(msg.sender),\\n \\\"Only authenticated addresses in ovmStateManager can call this function\\\"\\n );\\n\\n // Initialize the execution context, must be initialized before we perform any gas metering\\n // or we'll throw a nuisance gas error.\\n _initContext(_transaction);\\n\\n // TEMPORARY: Gas metering is disabled for minnet.\\n // // Check whether we need to start a new epoch, do so if necessary.\\n // _checkNeedsNewEpoch(_transaction.timestamp);\\n\\n // Make sure the transaction's gas limit is valid. We don't revert here because we reserve\\n // reverts for INVALID_STATE_ACCESS.\\n if (_isValidInput(_transaction) == false) {\\n _resetContext();\\n return;\\n }\\n\\n // TEMPORARY: Gas metering is disabled for minnet.\\n // // Check gas right before the call to get total gas consumed by OVM transaction.\\n // uint256 gasProvided = gasleft();\\n\\n // Run the transaction, make sure to meter the gas usage.\\n ovmCALL(\\n _transaction.gasLimit - gasMeterConfig.minTransactionGasLimit,\\n _transaction.entrypoint,\\n _transaction.data\\n );\\n\\n // TEMPORARY: Gas metering is disabled for minnet.\\n // // Update the cumulative gas based on the amount of gas used.\\n // uint256 gasUsed = gasProvided - gasleft();\\n // _updateCumulativeGas(gasUsed, _transaction.l1QueueOrigin);\\n\\n // Wipe the execution context.\\n _resetContext();\\n }\\n\\n\\n /******************************\\n * Opcodes: Execution Context *\\n ******************************/\\n\\n /**\\n * @notice Overrides CALLER.\\n * @return _CALLER Address of the CALLER within the current message context.\\n */\\n function ovmCALLER()\\n override\\n public\\n view\\n returns (\\n address _CALLER\\n )\\n {\\n return messageContext.ovmCALLER;\\n }\\n\\n /**\\n * @notice Overrides ADDRESS.\\n * @return _ADDRESS Active ADDRESS within the current message context.\\n */\\n function ovmADDRESS()\\n override\\n public\\n view\\n returns (\\n address _ADDRESS\\n )\\n {\\n return messageContext.ovmADDRESS;\\n }\\n\\n /**\\n * @notice Overrides TIMESTAMP.\\n * @return _TIMESTAMP Value of the TIMESTAMP within the transaction context.\\n */\\n function ovmTIMESTAMP()\\n override\\n public\\n view\\n returns (\\n uint256 _TIMESTAMP\\n )\\n {\\n return transactionContext.ovmTIMESTAMP;\\n }\\n\\n /**\\n * @notice Overrides NUMBER.\\n * @return _NUMBER Value of the NUMBER within the transaction context.\\n */\\n function ovmNUMBER()\\n override\\n public\\n view\\n returns (\\n uint256 _NUMBER\\n )\\n {\\n return transactionContext.ovmNUMBER;\\n }\\n\\n /**\\n * @notice Overrides GASLIMIT.\\n * @return _GASLIMIT Value of the block's GASLIMIT within the transaction context.\\n */\\n function ovmGASLIMIT()\\n override\\n public\\n view\\n returns (\\n uint256 _GASLIMIT\\n )\\n {\\n return transactionContext.ovmGASLIMIT;\\n }\\n\\n /**\\n * @notice Overrides CHAINID.\\n * @return _CHAINID Value of the chain's CHAINID within the global context.\\n */\\n function ovmCHAINID()\\n override\\n public\\n view\\n returns (\\n uint256 _CHAINID\\n )\\n {\\n return globalContext.ovmCHAINID;\\n }\\n\\n /*********************************\\n * Opcodes: L2 Execution Context *\\n *********************************/\\n\\n /**\\n * @notice Specifies from which L1 rollup queue this transaction originated from.\\n * @return _queueOrigin Address of the ovmL1QUEUEORIGIN within the current message context.\\n */\\n function ovmL1QUEUEORIGIN()\\n override\\n public\\n view\\n returns (\\n Lib_OVMCodec.QueueOrigin _queueOrigin\\n )\\n {\\n return transactionContext.ovmL1QUEUEORIGIN;\\n }\\n\\n /**\\n * @notice Specifies which L1 account, if any, sent this transaction by calling enqueue().\\n * @return _l1TxOrigin Address of the account which sent the tx into L2 from L1.\\n */\\n function ovmL1TXORIGIN()\\n override\\n public\\n view\\n returns (\\n address _l1TxOrigin\\n )\\n {\\n return transactionContext.ovmL1TXORIGIN;\\n }\\n\\n /********************\\n * Opcodes: Halting *\\n ********************/\\n\\n /**\\n * @notice Overrides REVERT.\\n * @param _data Bytes data to pass along with the REVERT.\\n */\\n function ovmREVERT(\\n bytes memory _data\\n )\\n override\\n public\\n {\\n _revertWithFlag(RevertFlag.INTENTIONAL_REVERT, _data);\\n }\\n\\n\\n /******************************\\n * Opcodes: Contract Creation *\\n ******************************/\\n\\n /**\\n * @notice Overrides CREATE.\\n * @param _bytecode Code to be used to CREATE a new contract.\\n * @return Address of the created contract.\\n * @return Revert data, if and only if the creation threw an exception.\\n */\\n function ovmCREATE(\\n bytes memory _bytecode\\n )\\n override\\n public\\n notStatic\\n fixedGasDiscount(40000)\\n returns (\\n address,\\n bytes memory\\n )\\n {\\n // Creator is always the current ADDRESS.\\n address creator = ovmADDRESS();\\n\\n // Check that the deployer is whitelisted, or\\n // that arbitrary contract deployment has been enabled.\\n _checkDeployerAllowed(creator);\\n\\n // Generate the correct CREATE address.\\n address contractAddress = Lib_EthUtils.getAddressForCREATE(\\n creator,\\n _getAccountNonce(creator)\\n );\\n\\n return _createContract(\\n contractAddress,\\n _bytecode\\n );\\n }\\n\\n /**\\n * @notice Overrides CREATE2.\\n * @param _bytecode Code to be used to CREATE2 a new contract.\\n * @param _salt Value used to determine the contract's address.\\n * @return Address of the created contract.\\n * @return Revert data, if and only if the creation threw an exception.\\n */\\n function ovmCREATE2(\\n bytes memory _bytecode,\\n bytes32 _salt\\n )\\n override\\n public\\n notStatic\\n fixedGasDiscount(40000)\\n returns (\\n address,\\n bytes memory\\n )\\n {\\n // Creator is always the current ADDRESS.\\n address creator = ovmADDRESS();\\n\\n // Check that the deployer is whitelisted, or\\n // that arbitrary contract deployment has been enabled.\\n _checkDeployerAllowed(creator);\\n\\n // Generate the correct CREATE2 address.\\n address contractAddress = Lib_EthUtils.getAddressForCREATE2(\\n creator,\\n _bytecode,\\n _salt\\n );\\n\\n return _createContract(\\n contractAddress,\\n _bytecode\\n );\\n }\\n\\n\\n /*******************************\\n * Account Abstraction Opcodes *\\n ******************************/\\n\\n /**\\n * Retrieves the nonce of the current ovmADDRESS.\\n * @return _nonce Nonce of the current contract.\\n */\\n function ovmGETNONCE()\\n override\\n public\\n returns (\\n uint256 _nonce\\n )\\n {\\n return _getAccountNonce(ovmADDRESS());\\n }\\n\\n /**\\n * Bumps the nonce of the current ovmADDRESS by one.\\n */\\n function ovmINCREMENTNONCE()\\n override\\n public\\n notStatic\\n {\\n address account = ovmADDRESS();\\n uint256 nonce = _getAccountNonce(account);\\n\\n // Prevent overflow.\\n if (nonce + 1 > nonce) {\\n _setAccountNonce(account, nonce + 1);\\n }\\n }\\n\\n /**\\n * Creates a new EOA contract account, for account abstraction.\\n * @dev Essentially functions like ovmCREATE or ovmCREATE2, but we can bypass a lot of checks\\n * because the contract we're creating is trusted (no need to do safety checking or to\\n * handle unexpected reverts). Doesn't need to return an address because the address is\\n * assumed to be the user's actual address.\\n * @param _messageHash Hash of a message signed by some user, for verification.\\n * @param _v Signature `v` parameter.\\n * @param _r Signature `r` parameter.\\n * @param _s Signature `s` parameter.\\n */\\n function ovmCREATEEOA(\\n bytes32 _messageHash,\\n uint8 _v,\\n bytes32 _r,\\n bytes32 _s\\n )\\n override\\n public\\n notStatic\\n {\\n // Recover the EOA address from the message hash and signature parameters. Since we do the\\n // hashing in advance, we don't have handle different message hashing schemes. Even if this\\n // function were to return the wrong address (rather than explicitly returning the zero\\n // address), the rest of the transaction would simply fail (since there's no EOA account to\\n // actually execute the transaction).\\n address eoa = ecrecover(\\n _messageHash,\\n _v + 27,\\n _r,\\n _s\\n );\\n\\n // Invalid signature is a case we proactively handle with a revert. We could alternatively\\n // have this function return a `success` boolean, but this is just easier.\\n if (eoa == address(0)) {\\n ovmREVERT(bytes(\\\"Signature provided for EOA contract creation is invalid.\\\"));\\n }\\n\\n // If the user already has an EOA account, then there's no need to perform this operation.\\n if (_hasEmptyAccount(eoa) == false) {\\n return;\\n }\\n\\n // We always need to initialize the contract with the default account values.\\n _initPendingAccount(eoa);\\n\\n // Temporarily set the current address so it's easier to access on L2.\\n address prevADDRESS = messageContext.ovmADDRESS;\\n messageContext.ovmADDRESS = eoa;\\n\\n // Now actually create the account and get its bytecode. We're not worried about reverts\\n // (other than out of gas, which we can't capture anyway) because this contract is trusted.\\n OVM_ProxyEOA proxyEOA = new OVM_ProxyEOA(0x4200000000000000000000000000000000000003);\\n\\n // Reset the address now that we're done deploying.\\n messageContext.ovmADDRESS = prevADDRESS;\\n\\n // Commit the account with its final values.\\n _commitPendingAccount(\\n eoa,\\n address(proxyEOA),\\n keccak256(Lib_EthUtils.getCode(address(proxyEOA)))\\n );\\n\\n _setAccountNonce(eoa, 0);\\n }\\n\\n\\n /*********************************\\n * Opcodes: Contract Interaction *\\n *********************************/\\n\\n /**\\n * @notice Overrides CALL.\\n * @param _gasLimit Amount of gas to be passed into this call.\\n * @param _address Address of the contract to call.\\n * @param _calldata Data to send along with the call.\\n * @return _success Whether or not the call returned (rather than reverted).\\n * @return _returndata Data returned by the call.\\n */\\n function ovmCALL(\\n uint256 _gasLimit,\\n address _address,\\n bytes memory _calldata\\n )\\n override\\n public\\n fixedGasDiscount(100000)\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n // CALL updates the CALLER and ADDRESS.\\n MessageContext memory nextMessageContext = messageContext;\\n nextMessageContext.ovmCALLER = nextMessageContext.ovmADDRESS;\\n nextMessageContext.ovmADDRESS = _address;\\n\\n return _callContract(\\n nextMessageContext,\\n _gasLimit,\\n _address,\\n _calldata\\n );\\n }\\n\\n /**\\n * @notice Overrides STATICCALL.\\n * @param _gasLimit Amount of gas to be passed into this call.\\n * @param _address Address of the contract to call.\\n * @param _calldata Data to send along with the call.\\n * @return _success Whether or not the call returned (rather than reverted).\\n * @return _returndata Data returned by the call.\\n */\\n function ovmSTATICCALL(\\n uint256 _gasLimit,\\n address _address,\\n bytes memory _calldata\\n )\\n override\\n public\\n fixedGasDiscount(80000)\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n // STATICCALL updates the CALLER, updates the ADDRESS, and runs in a static context.\\n MessageContext memory nextMessageContext = messageContext;\\n nextMessageContext.ovmCALLER = nextMessageContext.ovmADDRESS;\\n nextMessageContext.ovmADDRESS = _address;\\n nextMessageContext.isStatic = true;\\n\\n return _callContract(\\n nextMessageContext,\\n _gasLimit,\\n _address,\\n _calldata\\n );\\n }\\n\\n /**\\n * @notice Overrides DELEGATECALL.\\n * @param _gasLimit Amount of gas to be passed into this call.\\n * @param _address Address of the contract to call.\\n * @param _calldata Data to send along with the call.\\n * @return _success Whether or not the call returned (rather than reverted).\\n * @return _returndata Data returned by the call.\\n */\\n function ovmDELEGATECALL(\\n uint256 _gasLimit,\\n address _address,\\n bytes memory _calldata\\n )\\n override\\n public\\n fixedGasDiscount(40000)\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n // DELEGATECALL does not change anything about the message context.\\n MessageContext memory nextMessageContext = messageContext;\\n\\n return _callContract(\\n nextMessageContext,\\n _gasLimit,\\n _address,\\n _calldata\\n );\\n }\\n\\n\\n /************************************\\n * Opcodes: Contract Storage Access *\\n ************************************/\\n\\n /**\\n * @notice Overrides SLOAD.\\n * @param _key 32 byte key of the storage slot to load.\\n * @return _value 32 byte value of the requested storage slot.\\n */\\n function ovmSLOAD(\\n bytes32 _key\\n )\\n override\\n public\\n netGasCost(40000)\\n returns (\\n bytes32 _value\\n )\\n {\\n // We always SLOAD from the storage of ADDRESS.\\n address contractAddress = ovmADDRESS();\\n\\n return _getContractStorage(\\n contractAddress,\\n _key\\n );\\n }\\n\\n /**\\n * @notice Overrides SSTORE.\\n * @param _key 32 byte key of the storage slot to set.\\n * @param _value 32 byte value for the storage slot.\\n */\\n function ovmSSTORE(\\n bytes32 _key,\\n bytes32 _value\\n )\\n override\\n public\\n notStatic\\n netGasCost(60000)\\n {\\n // We always SSTORE to the storage of ADDRESS.\\n address contractAddress = ovmADDRESS();\\n\\n _putContractStorage(\\n contractAddress,\\n _key,\\n _value\\n );\\n }\\n\\n\\n /*********************************\\n * Opcodes: Contract Code Access *\\n *********************************/\\n\\n /**\\n * @notice Overrides EXTCODECOPY.\\n * @param _contract Address of the contract to copy code from.\\n * @param _offset Offset in bytes from the start of contract code to copy beyond.\\n * @param _length Total number of bytes to copy from the contract's code.\\n * @return _code Bytes of code copied from the requested contract.\\n */\\n function ovmEXTCODECOPY(\\n address _contract,\\n uint256 _offset,\\n uint256 _length\\n )\\n override\\n public\\n returns (\\n bytes memory _code\\n )\\n {\\n // `ovmEXTCODECOPY` is the only overridden opcode capable of producing exactly one byte of\\n // return data. By blocking reads of one byte, we're able to use the condition that an\\n // OVM_ExecutionManager function return value having a length of exactly one byte indicates\\n // an error without an explicit revert. If users were able to read a single byte, they\\n // could forcibly trigger behavior that should only be available to this contract.\\n uint256 length = _length == 1 ? 2 : _length;\\n\\n return Lib_EthUtils.getCode(\\n _getAccountEthAddress(_contract),\\n _offset,\\n length\\n );\\n }\\n\\n /**\\n * @notice Overrides EXTCODESIZE.\\n * @param _contract Address of the contract to query the size of.\\n * @return _EXTCODESIZE Size of the requested contract in bytes.\\n */\\n function ovmEXTCODESIZE(\\n address _contract\\n )\\n override\\n public\\n returns (\\n uint256 _EXTCODESIZE\\n )\\n {\\n return Lib_EthUtils.getCodeSize(\\n _getAccountEthAddress(_contract)\\n );\\n }\\n\\n /**\\n * @notice Overrides EXTCODEHASH.\\n * @param _contract Address of the contract to query the hash of.\\n * @return _EXTCODEHASH Hash of the requested contract.\\n */\\n function ovmEXTCODEHASH(\\n address _contract\\n )\\n override\\n public\\n returns (\\n bytes32 _EXTCODEHASH\\n )\\n {\\n return Lib_EthUtils.getCodeHash(\\n _getAccountEthAddress(_contract)\\n );\\n }\\n\\n /***************************************\\n * Public Functions: Execution Context *\\n ***************************************/\\n\\n function getMaxTransactionGasLimit()\\n external\\n view\\n override\\n returns (\\n uint256 _maxTransactionGasLimit\\n )\\n {\\n return gasMeterConfig.maxTransactionGasLimit;\\n }\\n\\n /********************************************\\n * Public Functions: Deployment Whitelisting *\\n ********************************************/\\n\\n /**\\n * Checks whether the given address is on the whitelist to ovmCREATE/ovmCREATE2, and reverts if not.\\n * @param _deployerAddress Address attempting to deploy a contract.\\n */\\n function _checkDeployerAllowed(\\n address _deployerAddress\\n )\\n internal\\n {\\n // From an OVM semantics perspective, this will appear identical to\\n // the deployer ovmCALLing the whitelist. This is fine--in a sense, we are forcing them to.\\n (bool success, bytes memory data) = ovmCALL(\\n gasleft(),\\n 0x4200000000000000000000000000000000000002,\\n abi.encodeWithSignature(\\\"isDeployerAllowed(address)\\\", _deployerAddress)\\n );\\n bool isAllowed = abi.decode(data, (bool));\\n\\n if (!isAllowed || !success) {\\n _revertWithFlag(RevertFlag.CREATOR_NOT_ALLOWED);\\n }\\n }\\n\\n /********************************************\\n * Internal Functions: Contract Interaction *\\n ********************************************/\\n\\n /**\\n * Creates a new contract and associates it with some contract address.\\n * @param _contractAddress Address to associate the created contract with.\\n * @param _bytecode Bytecode to be used to create the contract.\\n * @return Final OVM contract address.\\n * @return Revertdata, if and only if the creation threw an exception.\\n */\\n function _createContract(\\n address _contractAddress,\\n bytes memory _bytecode\\n )\\n internal\\n returns (\\n address,\\n bytes memory\\n )\\n {\\n // We always update the nonce of the creating account, even if the creation fails.\\n _setAccountNonce(ovmADDRESS(), _getAccountNonce(ovmADDRESS()) + 1);\\n\\n // We're stepping into a CREATE or CREATE2, so we need to update ADDRESS to point\\n // to the contract's associated address and CALLER to point to the previous ADDRESS.\\n MessageContext memory nextMessageContext = messageContext;\\n nextMessageContext.ovmCALLER = messageContext.ovmADDRESS;\\n nextMessageContext.ovmADDRESS = _contractAddress;\\n\\n // Run the common logic which occurs between call-type and create-type messages,\\n // passing in the creation bytecode and `true` to trigger create-specific logic.\\n (bool success, bytes memory data) = _handleExternalMessage(\\n nextMessageContext,\\n gasleft(),\\n _contractAddress,\\n _bytecode,\\n true\\n );\\n\\n // Yellow paper requires that address returned is zero if the contract deployment fails.\\n return (\\n success ? _contractAddress : address(0),\\n data\\n );\\n }\\n\\n /**\\n * Calls the deployed contract associated with a given address.\\n * @param _nextMessageContext Message context to be used for the call.\\n * @param _gasLimit Amount of gas to be passed into this call.\\n * @param _contract OVM address to be called.\\n * @param _calldata Data to send along with the call.\\n * @return _success Whether or not the call returned (rather than reverted).\\n * @return _returndata Data returned by the call.\\n */\\n function _callContract(\\n MessageContext memory _nextMessageContext,\\n uint256 _gasLimit,\\n address _contract,\\n bytes memory _calldata\\n )\\n internal\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n // We reserve addresses of the form 0xdeaddeaddead...NNNN for the container contracts in L2 geth.\\n // So, we block calls to these addresses since they are not safe to run as an OVM contract itself.\\n if (\\n (uint256(_contract) & uint256(0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000))\\n == uint256(0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000)\\n ) {\\n // EVM does not return data in the success case, see: https://github.com/ethereum/go-ethereum/blob/aae7660410f0ef90279e14afaaf2f429fdc2a186/core/vm/instructions.go#L600-L604\\n return (true, hex'');\\n }\\n\\n // Both 0x0000... and the EVM precompiles have the same address on L1 and L2 --> no trie lookup needed.\\n address codeContractAddress =\\n uint(_contract) < 100\\n ? _contract\\n : _getAccountEthAddress(_contract);\\n\\n return _handleExternalMessage(\\n _nextMessageContext,\\n _gasLimit,\\n codeContractAddress,\\n _calldata,\\n false\\n );\\n }\\n\\n /**\\n * Handles all interactions which involve the execution manager calling out to untrusted code (both calls and creates).\\n * Ensures that OVM-related measures are enforced, including L2 gas refunds, nuisance gas, and flagged reversions.\\n *\\n * @param _nextMessageContext Message context to be used for the external message.\\n * @param _gasLimit Amount of gas to be passed into this message.\\n * @param _contract OVM address being called or deployed to\\n * @param _data Data for the message (either calldata or creation code)\\n * @param _isCreate Whether this is a create-type message.\\n * @return Whether or not the message (either a call or deployment) succeeded.\\n * @return Data returned by the message.\\n */\\n function _handleExternalMessage(\\n MessageContext memory _nextMessageContext,\\n uint256 _gasLimit,\\n address _contract,\\n bytes memory _data,\\n bool _isCreate\\n )\\n internal\\n returns (\\n bool,\\n bytes memory\\n )\\n {\\n // We need to switch over to our next message context for the duration of this call.\\n MessageContext memory prevMessageContext = messageContext;\\n _switchMessageContext(prevMessageContext, _nextMessageContext);\\n\\n // Nuisance gas is a system used to bound the ability for an attacker to make fraud proofs\\n // expensive by touching a lot of different accounts or storage slots. Since most contracts\\n // only use a few storage slots during any given transaction, this shouldn't be a limiting\\n // factor.\\n uint256 prevNuisanceGasLeft = messageRecord.nuisanceGasLeft;\\n uint256 nuisanceGasLimit = _getNuisanceGasLimit(_gasLimit);\\n messageRecord.nuisanceGasLeft = nuisanceGasLimit;\\n\\n // Make the call and make sure to pass in the gas limit. Another instance of hidden\\n // complexity. `_contract` is guaranteed to be a safe contract, meaning its return/revert\\n // behavior can be controlled. In particular, we enforce that flags are passed through\\n // revert data as to retrieve execution metadata that would normally be reverted out of\\n // existence.\\n\\n bool success; \\n bytes memory returndata;\\n\\n if (_isCreate) {\\n // safeCREATE() is a function which replicates a CREATE message, but uses return values\\n // Which match that of CALL (i.e. bool, bytes). This allows many security checks to be\\n // to be shared between untrusted call and create call frames.\\n (success, returndata) = address(this).call(\\n abi.encodeWithSelector(\\n this.safeCREATE.selector,\\n _gasLimit,\\n _data,\\n _contract\\n )\\n );\\n } else {\\n (success, returndata) = _contract.call{gas: _gasLimit}(_data);\\n }\\n\\n // Switch back to the original message context now that we're out of the call.\\n _switchMessageContext(_nextMessageContext, prevMessageContext);\\n\\n // Assuming there were no reverts, the message record should be accurate here. We'll update\\n // this value in the case of a revert.\\n uint256 nuisanceGasLeft = messageRecord.nuisanceGasLeft;\\n\\n // Reverts at this point are completely OK, but we need to make a few updates based on the\\n // information passed through the revert.\\n if (success == false) {\\n (\\n RevertFlag flag,\\n uint256 nuisanceGasLeftPostRevert,\\n uint256 ovmGasRefund,\\n bytes memory returndataFromFlag\\n ) = _decodeRevertData(returndata);\\n\\n // INVALID_STATE_ACCESS is the only flag that triggers an immediate abort of the\\n // parent EVM message. This behavior is necessary because INVALID_STATE_ACCESS must\\n // halt any further transaction execution that could impact the execution result.\\n if (flag == RevertFlag.INVALID_STATE_ACCESS) {\\n _revertWithFlag(flag);\\n }\\n\\n // INTENTIONAL_REVERT, UNSAFE_BYTECODE, STATIC_VIOLATION, and CREATOR_NOT_ALLOWED aren't\\n // dependent on the input state, so we can just handle them like standard reverts. Our only change here\\n // is to record the gas refund reported by the call (enforced by safety checking).\\n if (\\n flag == RevertFlag.INTENTIONAL_REVERT\\n || flag == RevertFlag.UNSAFE_BYTECODE\\n || flag == RevertFlag.STATIC_VIOLATION\\n || flag == RevertFlag.CREATOR_NOT_ALLOWED\\n ) {\\n transactionRecord.ovmGasRefund = ovmGasRefund;\\n }\\n\\n // INTENTIONAL_REVERT needs to pass up the user-provided return data encoded into the\\n // flag, *not* the full encoded flag. All other revert types return no data.\\n if (\\n flag == RevertFlag.INTENTIONAL_REVERT\\n || _isCreate\\n ) {\\n returndata = returndataFromFlag;\\n } else {\\n returndata = hex'';\\n }\\n\\n // Reverts mean we need to use up whatever \\\"nuisance gas\\\" was used by the call.\\n // EXCEEDS_NUISANCE_GAS explicitly reduces the remaining nuisance gas for this message\\n // to zero. OUT_OF_GAS is a \\\"pseudo\\\" flag given that messages return no data when they\\n // run out of gas, so we have to treat this like EXCEEDS_NUISANCE_GAS. All other flags\\n // will simply pass up the remaining nuisance gas.\\n nuisanceGasLeft = nuisanceGasLeftPostRevert;\\n }\\n\\n // We need to reset the nuisance gas back to its original value minus the amount used here.\\n messageRecord.nuisanceGasLeft = prevNuisanceGasLeft - (nuisanceGasLimit - nuisanceGasLeft);\\n\\n return (\\n success,\\n returndata\\n );\\n }\\n\\n /**\\n * Handles the creation-specific safety measures required for OVM contract deployment.\\n * This function sanitizes the return types for creation messages to match calls (bool, bytes),\\n * by being an external function which the EM can call, that mimics the success/fail case of the CREATE.\\n * This allows for consistent handling of both types of messages in _handleExternalMessage().\\n * Having this step occur as a separate call frame also allows us to easily revert the \\n * contract deployment in the event that the code is unsafe.\\n * \\n * @param _gasLimit Amount of gas to be passed into this creation.\\n * @param _creationCode Code to pass into CREATE for deployment.\\n * @param _address OVM address being deployed to.\\n */\\n function safeCREATE(\\n uint _gasLimit,\\n bytes memory _creationCode,\\n address _address\\n )\\n external\\n {\\n // The only way this should callable is from within _createContract(),\\n // and it should DEFINITELY not be callable by a non-EM code contract.\\n if (msg.sender != address(this)) {\\n return;\\n }\\n // Check that there is not already code at this address.\\n if (_hasEmptyAccount(_address) == false) {\\n // Note: in the EVM, this case burns all allotted gas. For improved\\n // developer experience, we do return the remaining gas.\\n _revertWithFlag(\\n RevertFlag.CREATE_COLLISION,\\n Lib_ErrorUtils.encodeRevertString(\\\"A contract has already been deployed to this address\\\")\\n );\\n }\\n\\n // Check the creation bytecode against the OVM_SafetyChecker.\\n if (ovmSafetyChecker.isBytecodeSafe(_creationCode) == false) {\\n _revertWithFlag(\\n RevertFlag.UNSAFE_BYTECODE,\\n Lib_ErrorUtils.encodeRevertString(\\\"Contract creation code contains unsafe opcodes. Did you use the right compiler or pass an unsafe constructor argument?\\\")\\n );\\n }\\n\\n // We always need to initialize the contract with the default account values.\\n _initPendingAccount(_address);\\n\\n // Actually execute the EVM create message.\\n // NOTE: The inline assembly below means we can NOT make any evm calls between here and then.\\n address ethAddress = Lib_EthUtils.createContract(_creationCode);\\n\\n if (ethAddress == address(0)) {\\n // If the creation fails, the EVM lets us grab its revert data. This may contain a revert flag\\n // to be used above in _handleExternalMessage, so we pass the revert data back up unmodified.\\n assembly { \\n returndatacopy(0,0,returndatasize())\\n revert(0, returndatasize())\\n }\\n }\\n\\n // Again simply checking that the deployed code is safe too. Contracts can generate\\n // arbitrary deployment code, so there's no easy way to analyze this beforehand.\\n bytes memory deployedCode = Lib_EthUtils.getCode(ethAddress);\\n if (ovmSafetyChecker.isBytecodeSafe(deployedCode) == false) {\\n _revertWithFlag(\\n RevertFlag.UNSAFE_BYTECODE,\\n Lib_ErrorUtils.encodeRevertString(\\\"Constructor attempted to deploy unsafe bytecode.\\\")\\n );\\n }\\n\\n // Contract creation didn't need to be reverted and the bytecode is safe. We finish up by\\n // associating the desired address with the newly created contract's code hash and address.\\n _commitPendingAccount(\\n _address,\\n ethAddress,\\n Lib_EthUtils.getCodeHash(ethAddress)\\n );\\n }\\n\\n /******************************************\\n * Internal Functions: State Manipulation *\\n ******************************************/\\n\\n /**\\n * Checks whether an account exists within the OVM_StateManager.\\n * @param _address Address of the account to check.\\n * @return _exists Whether or not the account exists.\\n */\\n function _hasAccount(\\n address _address\\n )\\n internal\\n returns (\\n bool _exists\\n )\\n {\\n _checkAccountLoad(_address);\\n return ovmStateManager.hasAccount(_address);\\n }\\n\\n /**\\n * Checks whether a known empty account exists within the OVM_StateManager.\\n * @param _address Address of the account to check.\\n * @return _exists Whether or not the account empty exists.\\n */\\n function _hasEmptyAccount(\\n address _address\\n )\\n internal\\n returns (\\n bool _exists\\n )\\n {\\n _checkAccountLoad(_address);\\n return ovmStateManager.hasEmptyAccount(_address);\\n }\\n\\n /**\\n * Sets the nonce of an account.\\n * @param _address Address of the account to modify.\\n * @param _nonce New account nonce.\\n */\\n function _setAccountNonce(\\n address _address,\\n uint256 _nonce\\n )\\n internal\\n {\\n _checkAccountChange(_address);\\n ovmStateManager.setAccountNonce(_address, _nonce);\\n }\\n\\n /**\\n * Gets the nonce of an account.\\n * @param _address Address of the account to access.\\n * @return _nonce Nonce of the account.\\n */\\n function _getAccountNonce(\\n address _address\\n )\\n internal\\n returns (\\n uint256 _nonce\\n )\\n {\\n _checkAccountLoad(_address);\\n return ovmStateManager.getAccountNonce(_address);\\n }\\n\\n /**\\n * Retrieves the Ethereum address of an account.\\n * @param _address Address of the account to access.\\n * @return _ethAddress Corresponding Ethereum address.\\n */\\n function _getAccountEthAddress(\\n address _address\\n )\\n internal\\n returns (\\n address _ethAddress\\n )\\n {\\n _checkAccountLoad(_address);\\n return ovmStateManager.getAccountEthAddress(_address);\\n }\\n\\n /**\\n * Creates the default account object for the given address.\\n * @param _address Address of the account create.\\n */\\n function _initPendingAccount(\\n address _address\\n )\\n internal\\n {\\n // Although it seems like `_checkAccountChange` would be more appropriate here, we don't\\n // actually consider an account \\\"changed\\\" until it's inserted into the state (in this case\\n // by `_commitPendingAccount`).\\n _checkAccountLoad(_address);\\n ovmStateManager.initPendingAccount(_address);\\n }\\n\\n /**\\n * Stores additional relevant data for a new account, thereby \\\"committing\\\" it to the state.\\n * This function is only called during `ovmCREATE` and `ovmCREATE2` after a successful contract\\n * creation.\\n * @param _address Address of the account to commit.\\n * @param _ethAddress Address of the associated deployed contract.\\n * @param _codeHash Hash of the code stored at the address.\\n */\\n function _commitPendingAccount(\\n address _address,\\n address _ethAddress,\\n bytes32 _codeHash\\n )\\n internal\\n {\\n _checkAccountChange(_address);\\n ovmStateManager.commitPendingAccount(\\n _address,\\n _ethAddress,\\n _codeHash\\n );\\n }\\n\\n /**\\n * Retrieves the value of a storage slot.\\n * @param _contract Address of the contract to query.\\n * @param _key 32 byte key of the storage slot.\\n * @return _value 32 byte storage slot value.\\n */\\n function _getContractStorage(\\n address _contract,\\n bytes32 _key\\n )\\n internal\\n returns (\\n bytes32 _value\\n )\\n {\\n _checkContractStorageLoad(_contract, _key);\\n return ovmStateManager.getContractStorage(_contract, _key);\\n }\\n\\n /**\\n * Sets the value of a storage slot.\\n * @param _contract Address of the contract to modify.\\n * @param _key 32 byte key of the storage slot.\\n * @param _value 32 byte storage slot value.\\n */\\n function _putContractStorage(\\n address _contract,\\n bytes32 _key,\\n bytes32 _value\\n )\\n internal\\n {\\n // We don't set storage if the value didn't change. Although this acts as a convenient\\n // optimization, it's also necessary to avoid the case in which a contract with no storage\\n // attempts to store the value \\\"0\\\" at any key. Putting this value (and therefore requiring\\n // that the value be committed into the storage trie after execution) would incorrectly\\n // modify the storage root.\\n if (_getContractStorage(_contract, _key) == _value) {\\n return;\\n }\\n\\n _checkContractStorageChange(_contract, _key);\\n ovmStateManager.putContractStorage(_contract, _key, _value);\\n }\\n\\n /**\\n * Validation whenever a contract needs to be loaded. Checks that the account exists, charges\\n * nuisance gas if the account hasn't been loaded before.\\n * @param _address Address of the account to load.\\n */\\n function _checkAccountLoad(\\n address _address\\n )\\n internal\\n {\\n // See `_checkContractStorageLoad` for more information.\\n if (gasleft() < MIN_GAS_FOR_INVALID_STATE_ACCESS) {\\n _revertWithFlag(RevertFlag.OUT_OF_GAS);\\n }\\n\\n // See `_checkContractStorageLoad` for more information.\\n if (ovmStateManager.hasAccount(_address) == false) {\\n _revertWithFlag(RevertFlag.INVALID_STATE_ACCESS);\\n }\\n\\n // Check whether the account has been loaded before and mark it as loaded if not. We need\\n // this because \\\"nuisance gas\\\" only applies to the first time that an account is loaded.\\n (\\n bool _wasAccountAlreadyLoaded\\n ) = ovmStateManager.testAndSetAccountLoaded(_address);\\n\\n // If we hadn't already loaded the account, then we'll need to charge \\\"nuisance gas\\\" based\\n // on the size of the contract code.\\n if (_wasAccountAlreadyLoaded == false) {\\n _useNuisanceGas(\\n (Lib_EthUtils.getCodeSize(_getAccountEthAddress(_address)) * NUISANCE_GAS_PER_CONTRACT_BYTE) + MIN_NUISANCE_GAS_PER_CONTRACT\\n );\\n }\\n }\\n\\n /**\\n * Validation whenever a contract needs to be changed. Checks that the account exists, charges\\n * nuisance gas if the account hasn't been changed before.\\n * @param _address Address of the account to change.\\n */\\n function _checkAccountChange(\\n address _address\\n )\\n internal\\n {\\n // Start by checking for a load as we only want to charge nuisance gas proportional to\\n // contract size once.\\n _checkAccountLoad(_address);\\n\\n // Check whether the account has been changed before and mark it as changed if not. We need\\n // this because \\\"nuisance gas\\\" only applies to the first time that an account is changed.\\n (\\n bool _wasAccountAlreadyChanged\\n ) = ovmStateManager.testAndSetAccountChanged(_address);\\n\\n // If we hadn't already loaded the account, then we'll need to charge \\\"nuisance gas\\\" based\\n // on the size of the contract code.\\n if (_wasAccountAlreadyChanged == false) {\\n ovmStateManager.incrementTotalUncommittedAccounts();\\n _useNuisanceGas(\\n (Lib_EthUtils.getCodeSize(_getAccountEthAddress(_address)) * NUISANCE_GAS_PER_CONTRACT_BYTE) + MIN_NUISANCE_GAS_PER_CONTRACT\\n );\\n }\\n }\\n\\n /**\\n * Validation whenever a slot needs to be loaded. Checks that the account exists, charges\\n * nuisance gas if the slot hasn't been loaded before.\\n * @param _contract Address of the account to load from.\\n * @param _key 32 byte key to load.\\n */\\n function _checkContractStorageLoad(\\n address _contract,\\n bytes32 _key\\n )\\n internal\\n {\\n // Another case of hidden complexity. If we didn't enforce this requirement, then a\\n // contract could pass in just enough gas to cause the INVALID_STATE_ACCESS check to fail\\n // on L1 but not on L2. A contract could use this behavior to prevent the\\n // OVM_ExecutionManager from detecting an invalid state access. Reverting with OUT_OF_GAS\\n // allows us to also charge for the full message nuisance gas, because you deserve that for\\n // trying to break the contract in this way.\\n if (gasleft() < MIN_GAS_FOR_INVALID_STATE_ACCESS) {\\n _revertWithFlag(RevertFlag.OUT_OF_GAS);\\n }\\n\\n // We need to make sure that the transaction isn't trying to access storage that hasn't\\n // been provided to the OVM_StateManager. We'll immediately abort if this is the case.\\n // We know that we have enough gas to do this check because of the above test.\\n if (ovmStateManager.hasContractStorage(_contract, _key) == false) {\\n _revertWithFlag(RevertFlag.INVALID_STATE_ACCESS);\\n }\\n\\n // Check whether the slot has been loaded before and mark it as loaded if not. We need\\n // this because \\\"nuisance gas\\\" only applies to the first time that a slot is loaded.\\n (\\n bool _wasContractStorageAlreadyLoaded\\n ) = ovmStateManager.testAndSetContractStorageLoaded(_contract, _key);\\n\\n // If we hadn't already loaded the account, then we'll need to charge some fixed amount of\\n // \\\"nuisance gas\\\".\\n if (_wasContractStorageAlreadyLoaded == false) {\\n _useNuisanceGas(NUISANCE_GAS_SLOAD);\\n }\\n }\\n\\n /**\\n * Validation whenever a slot needs to be changed. Checks that the account exists, charges\\n * nuisance gas if the slot hasn't been changed before.\\n * @param _contract Address of the account to change.\\n * @param _key 32 byte key to change.\\n */\\n function _checkContractStorageChange(\\n address _contract,\\n bytes32 _key\\n )\\n internal\\n {\\n // Start by checking for load to make sure we have the storage slot and that we charge the\\n // \\\"nuisance gas\\\" necessary to prove the storage slot state.\\n _checkContractStorageLoad(_contract, _key);\\n\\n // Check whether the slot has been changed before and mark it as changed if not. We need\\n // this because \\\"nuisance gas\\\" only applies to the first time that a slot is changed.\\n (\\n bool _wasContractStorageAlreadyChanged\\n ) = ovmStateManager.testAndSetContractStorageChanged(_contract, _key);\\n\\n // If we hadn't already changed the account, then we'll need to charge some fixed amount of\\n // \\\"nuisance gas\\\".\\n if (_wasContractStorageAlreadyChanged == false) {\\n // Changing a storage slot means that we're also going to have to change the\\n // corresponding account, so do an account change check.\\n _checkAccountChange(_contract);\\n\\n ovmStateManager.incrementTotalUncommittedContractStorage();\\n _useNuisanceGas(NUISANCE_GAS_SSTORE);\\n }\\n }\\n\\n\\n /************************************\\n * Internal Functions: Revert Logic *\\n ************************************/\\n\\n /**\\n * Simple encoding for revert data.\\n * @param _flag Flag to revert with.\\n * @param _data Additional user-provided revert data.\\n * @return _revertdata Encoded revert data.\\n */\\n function _encodeRevertData(\\n RevertFlag _flag,\\n bytes memory _data\\n )\\n internal\\n view\\n returns (\\n bytes memory _revertdata\\n )\\n {\\n // Out of gas and create exceptions will fundamentally return no data, so simulating it shouldn't either.\\n if (\\n _flag == RevertFlag.OUT_OF_GAS\\n ) {\\n return bytes('');\\n }\\n\\n // INVALID_STATE_ACCESS doesn't need to return any data other than the flag.\\n if (_flag == RevertFlag.INVALID_STATE_ACCESS) {\\n return abi.encode(\\n _flag,\\n 0,\\n 0,\\n bytes('')\\n );\\n }\\n\\n // Just ABI encode the rest of the parameters.\\n return abi.encode(\\n _flag,\\n messageRecord.nuisanceGasLeft,\\n transactionRecord.ovmGasRefund,\\n _data\\n );\\n }\\n\\n /**\\n * Simple decoding for revert data.\\n * @param _revertdata Revert data to decode.\\n * @return _flag Flag used to revert.\\n * @return _nuisanceGasLeft Amount of nuisance gas unused by the message.\\n * @return _ovmGasRefund Amount of gas refunded during the message.\\n * @return _data Additional user-provided revert data.\\n */\\n function _decodeRevertData(\\n bytes memory _revertdata\\n )\\n internal\\n pure\\n returns (\\n RevertFlag _flag,\\n uint256 _nuisanceGasLeft,\\n uint256 _ovmGasRefund,\\n bytes memory _data\\n )\\n {\\n // A length of zero means the call ran out of gas, just return empty data.\\n if (_revertdata.length == 0) {\\n return (\\n RevertFlag.OUT_OF_GAS,\\n 0,\\n 0,\\n bytes('')\\n );\\n }\\n\\n // ABI decode the incoming data.\\n return abi.decode(_revertdata, (RevertFlag, uint256, uint256, bytes));\\n }\\n\\n /**\\n * Causes a message to revert or abort.\\n * @param _flag Flag to revert with.\\n * @param _data Additional user-provided data.\\n */\\n function _revertWithFlag(\\n RevertFlag _flag,\\n bytes memory _data\\n )\\n internal\\n view\\n {\\n bytes memory revertdata = _encodeRevertData(\\n _flag,\\n _data\\n );\\n\\n assembly {\\n revert(add(revertdata, 0x20), mload(revertdata))\\n }\\n }\\n\\n /**\\n * Causes a message to revert or abort.\\n * @param _flag Flag to revert with.\\n */\\n function _revertWithFlag(\\n RevertFlag _flag\\n )\\n internal\\n {\\n _revertWithFlag(_flag, bytes(''));\\n }\\n\\n\\n /******************************************\\n * Internal Functions: Nuisance Gas Logic *\\n ******************************************/\\n\\n /**\\n * Computes the nuisance gas limit from the gas limit.\\n * @dev This function is currently using a naive implementation whereby the nuisance gas limit\\n * is set to exactly equal the lesser of the gas limit or remaining gas. It's likely that\\n * this implementation is perfectly fine, but we may change this formula later.\\n * @param _gasLimit Gas limit to compute from.\\n * @return _nuisanceGasLimit Computed nuisance gas limit.\\n */\\n function _getNuisanceGasLimit(\\n uint256 _gasLimit\\n )\\n internal\\n view\\n returns (\\n uint256 _nuisanceGasLimit\\n )\\n {\\n return _gasLimit < gasleft() ? _gasLimit : gasleft();\\n }\\n\\n /**\\n * Uses a certain amount of nuisance gas.\\n * @param _amount Amount of nuisance gas to use.\\n */\\n function _useNuisanceGas(\\n uint256 _amount\\n )\\n internal\\n {\\n // Essentially the same as a standard OUT_OF_GAS, except we also retain a record of the gas\\n // refund to be given at the end of the transaction.\\n if (messageRecord.nuisanceGasLeft < _amount) {\\n _revertWithFlag(RevertFlag.EXCEEDS_NUISANCE_GAS);\\n }\\n\\n messageRecord.nuisanceGasLeft -= _amount;\\n }\\n\\n\\n /************************************\\n * Internal Functions: Gas Metering *\\n ************************************/\\n\\n /**\\n * Checks whether a transaction needs to start a new epoch and does so if necessary.\\n * @param _timestamp Transaction timestamp.\\n */\\n function _checkNeedsNewEpoch(\\n uint256 _timestamp\\n )\\n internal\\n {\\n if (\\n _timestamp >= (\\n _getGasMetadata(GasMetadataKey.CURRENT_EPOCH_START_TIMESTAMP)\\n + gasMeterConfig.secondsPerEpoch\\n )\\n ) {\\n _putGasMetadata(\\n GasMetadataKey.CURRENT_EPOCH_START_TIMESTAMP,\\n _timestamp\\n );\\n\\n _putGasMetadata(\\n GasMetadataKey.PREV_EPOCH_SEQUENCER_QUEUE_GAS,\\n _getGasMetadata(\\n GasMetadataKey.CUMULATIVE_SEQUENCER_QUEUE_GAS\\n )\\n );\\n\\n _putGasMetadata(\\n GasMetadataKey.PREV_EPOCH_L1TOL2_QUEUE_GAS,\\n _getGasMetadata(\\n GasMetadataKey.CUMULATIVE_L1TOL2_QUEUE_GAS\\n )\\n );\\n }\\n }\\n\\n /**\\n * Validates the input values of a transaction.\\n * @return _valid Whether or not the transaction data is valid.\\n */\\n function _isValidInput(\\n Lib_OVMCodec.Transaction memory _transaction\\n )\\n view\\n internal\\n returns (\\n bool\\n )\\n {\\n // Prevent reentrancy to run():\\n // This check prevents calling run with the default ovmNumber.\\n // Combined with the first check in run():\\n // if (transactionContext.ovmNUMBER != DEFAULT_UINT256) { return; }\\n // It should be impossible to re-enter since run() returns before any other call frames are created.\\n // Since this value is already being written to storage, we save much gas compared to\\n // using the standard nonReentrant pattern.\\n if (_transaction.blockNumber == DEFAULT_UINT256) {\\n return false;\\n }\\n\\n if (_isValidGasLimit(_transaction.gasLimit, _transaction.l1QueueOrigin) == false) {\\n return false;\\n }\\n\\n return true;\\n }\\n\\n /**\\n * Validates the gas limit for a given transaction.\\n * @param _gasLimit Gas limit provided by the transaction.\\n * param _queueOrigin Queue from which the transaction originated.\\n * @return _valid Whether or not the gas limit is valid.\\n */\\n function _isValidGasLimit(\\n uint256 _gasLimit,\\n Lib_OVMCodec.QueueOrigin // _queueOrigin\\n )\\n view\\n internal\\n returns (\\n bool _valid\\n )\\n {\\n // Always have to be below the maximum gas limit.\\n if (_gasLimit > gasMeterConfig.maxTransactionGasLimit) {\\n return false;\\n }\\n\\n // Always have to be above the minimum gas limit.\\n if (_gasLimit < gasMeterConfig.minTransactionGasLimit) {\\n return false;\\n }\\n\\n // TEMPORARY: Gas metering is disabled for minnet.\\n return true;\\n // GasMetadataKey cumulativeGasKey;\\n // GasMetadataKey prevEpochGasKey;\\n // if (_queueOrigin == Lib_OVMCodec.QueueOrigin.SEQUENCER_QUEUE) {\\n // cumulativeGasKey = GasMetadataKey.CUMULATIVE_SEQUENCER_QUEUE_GAS;\\n // prevEpochGasKey = GasMetadataKey.PREV_EPOCH_SEQUENCER_QUEUE_GAS;\\n // } else {\\n // cumulativeGasKey = GasMetadataKey.CUMULATIVE_L1TOL2_QUEUE_GAS;\\n // prevEpochGasKey = GasMetadataKey.PREV_EPOCH_L1TOL2_QUEUE_GAS;\\n // }\\n\\n // return (\\n // (\\n // _getGasMetadata(cumulativeGasKey)\\n // - _getGasMetadata(prevEpochGasKey)\\n // + _gasLimit\\n // ) < gasMeterConfig.maxGasPerQueuePerEpoch\\n // );\\n }\\n\\n /**\\n * Updates the cumulative gas after a transaction.\\n * @param _gasUsed Gas used by the transaction.\\n * @param _queueOrigin Queue from which the transaction originated.\\n */\\n function _updateCumulativeGas(\\n uint256 _gasUsed,\\n Lib_OVMCodec.QueueOrigin _queueOrigin\\n )\\n internal\\n {\\n GasMetadataKey cumulativeGasKey;\\n if (_queueOrigin == Lib_OVMCodec.QueueOrigin.SEQUENCER_QUEUE) {\\n cumulativeGasKey = GasMetadataKey.CUMULATIVE_SEQUENCER_QUEUE_GAS;\\n } else {\\n cumulativeGasKey = GasMetadataKey.CUMULATIVE_L1TOL2_QUEUE_GAS;\\n }\\n\\n _putGasMetadata(\\n cumulativeGasKey,\\n (\\n _getGasMetadata(cumulativeGasKey)\\n + gasMeterConfig.minTransactionGasLimit\\n + _gasUsed\\n - transactionRecord.ovmGasRefund\\n )\\n );\\n }\\n\\n /**\\n * Retrieves the value of a gas metadata key.\\n * @param _key Gas metadata key to retrieve.\\n * @return _value Value stored at the given key.\\n */\\n function _getGasMetadata(\\n GasMetadataKey _key\\n )\\n internal\\n returns (\\n uint256 _value\\n )\\n {\\n return uint256(_getContractStorage(\\n GAS_METADATA_ADDRESS,\\n bytes32(uint256(_key))\\n ));\\n }\\n\\n /**\\n * Sets the value of a gas metadata key.\\n * @param _key Gas metadata key to set.\\n * @param _value Value to store at the given key.\\n */\\n function _putGasMetadata(\\n GasMetadataKey _key,\\n uint256 _value\\n )\\n internal\\n {\\n _putContractStorage(\\n GAS_METADATA_ADDRESS,\\n bytes32(uint256(_key)),\\n bytes32(uint256(_value))\\n );\\n }\\n\\n\\n /*****************************************\\n * Internal Functions: Execution Context *\\n *****************************************/\\n\\n /**\\n * Swaps over to a new message context.\\n * @param _prevMessageContext Context we're switching from.\\n * @param _nextMessageContext Context we're switching to.\\n */\\n function _switchMessageContext(\\n MessageContext memory _prevMessageContext,\\n MessageContext memory _nextMessageContext\\n )\\n internal\\n {\\n // Avoid unnecessary the SSTORE.\\n if (_prevMessageContext.ovmCALLER != _nextMessageContext.ovmCALLER) {\\n messageContext.ovmCALLER = _nextMessageContext.ovmCALLER;\\n }\\n\\n // Avoid unnecessary the SSTORE.\\n if (_prevMessageContext.ovmADDRESS != _nextMessageContext.ovmADDRESS) {\\n messageContext.ovmADDRESS = _nextMessageContext.ovmADDRESS;\\n }\\n\\n // Avoid unnecessary the SSTORE.\\n if (_prevMessageContext.isStatic != _nextMessageContext.isStatic) {\\n messageContext.isStatic = _nextMessageContext.isStatic;\\n }\\n }\\n\\n /**\\n * Initializes the execution context.\\n * @param _transaction OVM transaction being executed.\\n */\\n function _initContext(\\n Lib_OVMCodec.Transaction memory _transaction\\n )\\n internal\\n {\\n transactionContext.ovmTIMESTAMP = _transaction.timestamp;\\n transactionContext.ovmNUMBER = _transaction.blockNumber;\\n transactionContext.ovmTXGASLIMIT = _transaction.gasLimit;\\n transactionContext.ovmL1QUEUEORIGIN = _transaction.l1QueueOrigin;\\n transactionContext.ovmL1TXORIGIN = _transaction.l1TxOrigin;\\n transactionContext.ovmGASLIMIT = gasMeterConfig.maxGasPerQueuePerEpoch;\\n\\n messageRecord.nuisanceGasLeft = _getNuisanceGasLimit(_transaction.gasLimit);\\n }\\n\\n /**\\n * Resets the transaction and message context.\\n */\\n function _resetContext()\\n internal\\n {\\n transactionContext.ovmL1TXORIGIN = DEFAULT_ADDRESS;\\n transactionContext.ovmTIMESTAMP = DEFAULT_UINT256;\\n transactionContext.ovmNUMBER = DEFAULT_UINT256;\\n transactionContext.ovmGASLIMIT = DEFAULT_UINT256;\\n transactionContext.ovmTXGASLIMIT = DEFAULT_UINT256;\\n transactionContext.ovmL1QUEUEORIGIN = Lib_OVMCodec.QueueOrigin.SEQUENCER_QUEUE;\\n\\n transactionRecord.ovmGasRefund = DEFAULT_UINT256;\\n\\n messageContext.ovmCALLER = DEFAULT_ADDRESS;\\n messageContext.ovmADDRESS = DEFAULT_ADDRESS;\\n messageContext.isStatic = false;\\n\\n messageRecord.nuisanceGasLeft = DEFAULT_UINT256;\\n\\n // Reset the ovmStateManager.\\n ovmStateManager = iOVM_StateManager(address(0));\\n }\\n\\n /*****************************\\n * L2-only Helper Functions *\\n *****************************/\\n\\n /**\\n * Unreachable helper function for simulating eth_calls with an OVM message context.\\n * This function will throw an exception in all cases other than when used as a custom entrypoint in L2 Geth to simulate eth_call.\\n * @param _transaction the message transaction to simulate.\\n * @param _from the OVM account the simulated call should be from.\\n */\\n function simulateMessage(\\n Lib_OVMCodec.Transaction memory _transaction,\\n address _from,\\n iOVM_StateManager _ovmStateManager\\n )\\n external\\n returns (\\n bool,\\n bytes memory\\n )\\n {\\n // Prevent this call from having any effect unless in a custom-set VM frame\\n require(msg.sender == address(0));\\n\\n ovmStateManager = _ovmStateManager;\\n _initContext(_transaction);\\n messageRecord.nuisanceGasLeft = uint(-1);\\n\\n messageContext.ovmADDRESS = _from;\\n\\n bool isCreate = _transaction.entrypoint == address(0);\\n if (isCreate) {\\n (address created, bytes memory revertData) = ovmCREATE(_transaction.data);\\n if (created == address(0)) {\\n return (false, revertData);\\n } else {\\n // The eth_call RPC endpoint for to = undefined will return the deployed bytecode\\n // in the success case, differing from standard create messages.\\n return (true, Lib_EthUtils.getCode(created));\\n }\\n } else {\\n return ovmCALL(\\n _transaction.gasLimit,\\n _transaction.entrypoint,\\n _transaction.data\\n );\\n }\\n }\\n}\\n\",\"keccak256\":\"0xad8464075bba192a72c955048a435cbf0ff20062804c1167adc2ecd3e21ff3f4\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/predeploys/OVM_DeployerWhitelist.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_Bytes32Utils } from \\\"../../libraries/utils/Lib_Bytes32Utils.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_DeployerWhitelist } from \\\"../../iOVM/predeploys/iOVM_DeployerWhitelist.sol\\\";\\nimport { Lib_SafeExecutionManagerWrapper } from \\\"../../libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\\\";\\n\\n/**\\n * @title OVM_DeployerWhitelist\\n * @dev The Deployer Whitelist is a temporary predeploy used to provide additional safety during the\\n * initial phases of our mainnet roll out. It is owned by the Optimism team, and defines accounts\\n * which are allowed to deploy contracts on Layer2. The Execution Manager will only allow an \\n * ovmCREATE or ovmCREATE2 operation to proceed if the deployer's address whitelisted.\\n * \\n * Compiler used: solc\\n * Runtime target: OVM\\n */\\ncontract OVM_DeployerWhitelist is iOVM_DeployerWhitelist {\\n\\n /**********************\\n * Contract Constants *\\n **********************/\\n\\n bytes32 internal constant KEY_INITIALIZED = 0x0000000000000000000000000000000000000000000000000000000000000010;\\n bytes32 internal constant KEY_OWNER = 0x0000000000000000000000000000000000000000000000000000000000000011;\\n bytes32 internal constant KEY_ALLOW_ARBITRARY_DEPLOYMENT = 0x0000000000000000000000000000000000000000000000000000000000000012;\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n \\n /**\\n * Blocks functions to anyone except the contract owner.\\n */\\n modifier onlyOwner() {\\n address owner = Lib_Bytes32Utils.toAddress(\\n Lib_SafeExecutionManagerWrapper.safeSLOAD(\\n KEY_OWNER\\n )\\n );\\n\\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(\\n Lib_SafeExecutionManagerWrapper.safeCALLER() == owner,\\n \\\"Function can only be called by the owner of this contract.\\\"\\n );\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n \\n /**\\n * Initializes the whitelist.\\n * @param _owner Address of the owner for this contract.\\n * @param _allowArbitraryDeployment Whether or not to allow arbitrary contract deployment.\\n */\\n function initialize(\\n address _owner,\\n bool _allowArbitraryDeployment\\n )\\n override\\n public\\n {\\n bool initialized = Lib_Bytes32Utils.toBool(\\n Lib_SafeExecutionManagerWrapper.safeSLOAD(KEY_INITIALIZED)\\n );\\n\\n if (initialized == true) {\\n return;\\n }\\n\\n Lib_SafeExecutionManagerWrapper.safeSSTORE(\\n KEY_INITIALIZED,\\n Lib_Bytes32Utils.fromBool(true)\\n );\\n Lib_SafeExecutionManagerWrapper.safeSSTORE(\\n KEY_OWNER,\\n Lib_Bytes32Utils.fromAddress(_owner)\\n );\\n Lib_SafeExecutionManagerWrapper.safeSSTORE(\\n KEY_ALLOW_ARBITRARY_DEPLOYMENT,\\n Lib_Bytes32Utils.fromBool(_allowArbitraryDeployment)\\n );\\n }\\n\\n /**\\n * Gets the owner of the whitelist.\\n */\\n function getOwner()\\n override\\n public\\n returns(\\n address\\n )\\n {\\n return Lib_Bytes32Utils.toAddress(\\n Lib_SafeExecutionManagerWrapper.safeSLOAD(\\n KEY_OWNER\\n )\\n );\\n }\\n\\n /**\\n * Adds or removes an address from the deployment whitelist.\\n * @param _deployer Address to update permissions for.\\n * @param _isWhitelisted Whether or not the address is whitelisted.\\n */\\n function setWhitelistedDeployer(\\n address _deployer,\\n bool _isWhitelisted\\n )\\n override\\n public\\n onlyOwner\\n {\\n Lib_SafeExecutionManagerWrapper.safeSSTORE(\\n Lib_Bytes32Utils.fromAddress(_deployer),\\n Lib_Bytes32Utils.fromBool(_isWhitelisted)\\n );\\n }\\n\\n /**\\n * Updates the owner of this contract.\\n * @param _owner Address of the new owner.\\n */\\n function setOwner(\\n address _owner\\n )\\n override\\n public\\n onlyOwner\\n {\\n Lib_SafeExecutionManagerWrapper.safeSSTORE(\\n KEY_OWNER,\\n Lib_Bytes32Utils.fromAddress(_owner)\\n );\\n }\\n\\n /**\\n * Updates the arbitrary deployment flag.\\n * @param _allowArbitraryDeployment Whether or not to allow arbitrary contract deployment.\\n */\\n function setAllowArbitraryDeployment(\\n bool _allowArbitraryDeployment\\n )\\n override\\n public\\n onlyOwner\\n {\\n Lib_SafeExecutionManagerWrapper.safeSSTORE(\\n KEY_ALLOW_ARBITRARY_DEPLOYMENT,\\n Lib_Bytes32Utils.fromBool(_allowArbitraryDeployment)\\n );\\n }\\n\\n /**\\n * Permanently enables arbitrary contract deployment and deletes the owner.\\n */\\n function enableArbitraryContractDeployment()\\n override\\n public\\n onlyOwner\\n {\\n setAllowArbitraryDeployment(true);\\n setOwner(address(0));\\n }\\n\\n /**\\n * Checks whether an address is allowed to deploy contracts.\\n * @param _deployer Address to check.\\n * @return _allowed Whether or not the address can deploy contracts.\\n */\\n function isDeployerAllowed(\\n address _deployer\\n )\\n override\\n public\\n returns (\\n bool _allowed\\n )\\n {\\n bool initialized = Lib_Bytes32Utils.toBool(\\n Lib_SafeExecutionManagerWrapper.safeSLOAD(KEY_INITIALIZED)\\n );\\n\\n if (initialized == false) {\\n return true;\\n }\\n\\n bool allowArbitraryDeployment = Lib_Bytes32Utils.toBool(\\n Lib_SafeExecutionManagerWrapper.safeSLOAD(KEY_ALLOW_ARBITRARY_DEPLOYMENT)\\n );\\n\\n if (allowArbitraryDeployment == true) {\\n return true;\\n }\\n\\n bool isWhitelisted = Lib_Bytes32Utils.toBool(\\n Lib_SafeExecutionManagerWrapper.safeSLOAD(\\n Lib_Bytes32Utils.fromAddress(_deployer)\\n )\\n );\\n\\n return isWhitelisted; \\n }\\n}\\n\",\"keccak256\":\"0xe746e2a3f649d3d9760db8a0b6dccee5cdb267c9615268181285846277307084\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/accounts/iOVM_ECDSAContractAccount.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title iOVM_ECDSAContractAccount\\n */\\ninterface iOVM_ECDSAContractAccount {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function execute(\\n bytes memory _transaction,\\n Lib_OVMCodec.EOASignatureType _signatureType,\\n uint8 _v,\\n bytes32 _r,\\n bytes32 _s\\n ) external returns (bool _success, bytes memory _returndata);\\n}\\n\",\"keccak256\":\"0x308729bc62dcffb11ff1d840781105cf1bf0dd4cbcfb1af704b800bb0cfe9b85\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_CanonicalTransactionChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_ChainStorageContainer } from \\\"./iOVM_ChainStorageContainer.sol\\\";\\n\\n/**\\n * @title iOVM_CanonicalTransactionChain\\n */\\ninterface iOVM_CanonicalTransactionChain {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event TransactionEnqueued(\\n address _l1TxOrigin,\\n address _target,\\n uint256 _gasLimit,\\n bytes _data,\\n uint256 _queueIndex,\\n uint256 _timestamp\\n );\\n\\n event QueueBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event SequencerBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event TransactionBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct BatchContext {\\n uint256 numSequencedTransactions;\\n uint256 numSubsequentQueueTransactions;\\n uint256 timestamp;\\n uint256 blockNumber;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n\\n /**\\n * Accesses the batch storage container.\\n * @return Reference to the batch storage container.\\n */\\n function batches()\\n external\\n view\\n returns (\\n iOVM_ChainStorageContainer\\n );\\n\\n /**\\n * Accesses the queue storage container.\\n * @return Reference to the queue storage container.\\n */\\n function queue()\\n external\\n view\\n returns (\\n iOVM_ChainStorageContainer\\n );\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements()\\n external\\n view\\n returns (\\n uint256 _totalElements\\n );\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches()\\n external\\n view\\n returns (\\n uint256 _totalBatches\\n );\\n\\n /**\\n * Returns the index of the next element to be enqueued.\\n * @return Index for the next queue element.\\n */\\n function getNextQueueIndex()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Gets the queue element at a particular index.\\n * @param _index Index of the queue element to access.\\n * @return _element Queue element at the given index.\\n */\\n function getQueueElement(\\n uint256 _index\\n )\\n external\\n view\\n returns (\\n Lib_OVMCodec.QueueElement memory _element\\n );\\n\\n /**\\n * Returns the timestamp of the last transaction.\\n * @return Timestamp for the last transaction.\\n */\\n function getLastTimestamp()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Returns the blocknumber of the last transaction.\\n * @return Blocknumber for the last transaction.\\n */\\n function getLastBlockNumber()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Get the number of queue elements which have not yet been included.\\n * @return Number of pending queue elements.\\n */\\n function getNumPendingQueueElements()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Retrieves the length of the queue, including\\n * both pending and canonical transactions.\\n * @return Length of the queue.\\n */\\n function getQueueLength()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n\\n /**\\n * Adds a transaction to the queue.\\n * @param _target Target contract to send the transaction to.\\n * @param _gasLimit Gas limit for the given transaction.\\n * @param _data Transaction data.\\n */\\n function enqueue(\\n address _target,\\n uint256 _gasLimit,\\n bytes memory _data\\n )\\n external;\\n\\n /**\\n * Appends a given number of queued transactions as a single batch.\\n * @param _numQueuedTransactions Number of transactions to append.\\n */\\n function appendQueueBatch(\\n uint256 _numQueuedTransactions\\n )\\n external;\\n\\n /**\\n * Allows the sequencer to append a batch of transactions.\\n * @dev This function uses a custom encoding scheme for efficiency reasons.\\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\\n * .param _contexts Array of batch contexts.\\n * .param _transactionDataFields Array of raw transaction data.\\n */\\n function appendSequencerBatch(\\n // uint40 _shouldStartAtElement,\\n // uint24 _totalElementsToAppend,\\n // BatchContext[] _contexts,\\n // bytes[] _transactionDataFields\\n )\\n external;\\n\\n /**\\n * Verifies whether a transaction is included in the chain.\\n * @param _transaction Transaction to verify.\\n * @param _txChainElement Transaction chain element corresponding to the transaction.\\n * @param _batchHeader Header of the batch the transaction was included in.\\n * @param _inclusionProof Inclusion proof for the provided transaction chain element.\\n * @return True if the transaction exists in the CTC, false if not.\\n */\\n function verifyTransaction(\\n Lib_OVMCodec.Transaction memory _transaction,\\n Lib_OVMCodec.TransactionChainElement memory _txChainElement,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _inclusionProof\\n )\\n external\\n view\\n returns (\\n bool\\n );\\n}\\n\",\"keccak256\":\"0xb5e55488a1982841c07cdf5ff475da4789596f111dd48f01b1918ee4c775cf3a\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_ChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title iOVM_ChainStorageContainer\\n */\\ninterface iOVM_ChainStorageContainer {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata()\\n external\\n view\\n returns (\\n bytes27\\n );\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length()\\n external\\n view\\n returns (\\n uint256\\n );\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(\\n bytes32 _object\\n )\\n external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(\\n bytes32 _object,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(\\n uint256 _index\\n )\\n external\\n view\\n returns (\\n bytes32\\n );\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index\\n )\\n external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Marks an index as overwritable, meaing the underlying buffer can start to write values over\\n * any objects before and including the given index.\\n */\\n function setNextOverwritableIndex(\\n uint256 _index\\n )\\n external;\\n}\\n\",\"keccak256\":\"0x2d7973a0ad84c23ec62624d3f1e3aeb198cc72686ff1e6cfa17155556b320c94\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/execution/iOVM_ExecutionManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\ninterface iOVM_ExecutionManager {\\n /**********\\n * Enums *\\n *********/\\n\\n enum RevertFlag {\\n OUT_OF_GAS,\\n INTENTIONAL_REVERT,\\n EXCEEDS_NUISANCE_GAS,\\n INVALID_STATE_ACCESS,\\n UNSAFE_BYTECODE,\\n CREATE_COLLISION,\\n STATIC_VIOLATION,\\n CREATOR_NOT_ALLOWED\\n }\\n\\n enum GasMetadataKey {\\n CURRENT_EPOCH_START_TIMESTAMP,\\n CUMULATIVE_SEQUENCER_QUEUE_GAS,\\n CUMULATIVE_L1TOL2_QUEUE_GAS,\\n PREV_EPOCH_SEQUENCER_QUEUE_GAS,\\n PREV_EPOCH_L1TOL2_QUEUE_GAS\\n }\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct GasMeterConfig {\\n uint256 minTransactionGasLimit;\\n uint256 maxTransactionGasLimit;\\n uint256 maxGasPerQueuePerEpoch;\\n uint256 secondsPerEpoch;\\n }\\n\\n struct GlobalContext {\\n uint256 ovmCHAINID;\\n }\\n\\n struct TransactionContext {\\n Lib_OVMCodec.QueueOrigin ovmL1QUEUEORIGIN;\\n uint256 ovmTIMESTAMP;\\n uint256 ovmNUMBER;\\n uint256 ovmGASLIMIT;\\n uint256 ovmTXGASLIMIT;\\n address ovmL1TXORIGIN;\\n }\\n\\n struct TransactionRecord {\\n uint256 ovmGasRefund;\\n }\\n\\n struct MessageContext {\\n address ovmCALLER;\\n address ovmADDRESS;\\n bool isStatic;\\n }\\n\\n struct MessageRecord {\\n uint256 nuisanceGasLeft;\\n }\\n\\n\\n /************************************\\n * Transaction Execution Entrypoint *\\n ************************************/\\n\\n function run(\\n Lib_OVMCodec.Transaction calldata _transaction,\\n address _txStateManager\\n ) external;\\n\\n\\n /*******************\\n * Context Opcodes *\\n *******************/\\n\\n function ovmCALLER() external view returns (address _caller);\\n function ovmADDRESS() external view returns (address _address);\\n function ovmTIMESTAMP() external view returns (uint256 _timestamp);\\n function ovmNUMBER() external view returns (uint256 _number);\\n function ovmGASLIMIT() external view returns (uint256 _gasLimit);\\n function ovmCHAINID() external view returns (uint256 _chainId);\\n\\n\\n /**********************\\n * L2 Context Opcodes *\\n **********************/\\n\\n function ovmL1QUEUEORIGIN() external view returns (Lib_OVMCodec.QueueOrigin _queueOrigin);\\n function ovmL1TXORIGIN() external view returns (address _l1TxOrigin);\\n\\n\\n /*******************\\n * Halting Opcodes *\\n *******************/\\n\\n function ovmREVERT(bytes memory _data) external;\\n\\n\\n /*****************************\\n * Contract Creation Opcodes *\\n *****************************/\\n\\n function ovmCREATE(bytes memory _bytecode) external returns (address _contract, bytes memory _revertdata);\\n function ovmCREATE2(bytes memory _bytecode, bytes32 _salt) external returns (address _contract, bytes memory _revertdata);\\n\\n\\n /*******************************\\n * Account Abstraction Opcodes *\\n ******************************/\\n\\n function ovmGETNONCE() external returns (uint256 _nonce);\\n function ovmINCREMENTNONCE() external;\\n function ovmCREATEEOA(bytes32 _messageHash, uint8 _v, bytes32 _r, bytes32 _s) external;\\n\\n\\n /****************************\\n * Contract Calling Opcodes *\\n ****************************/\\n\\n function ovmCALL(uint256 _gasLimit, address _address, bytes memory _calldata) external returns (bool _success, bytes memory _returndata);\\n function ovmSTATICCALL(uint256 _gasLimit, address _address, bytes memory _calldata) external returns (bool _success, bytes memory _returndata);\\n function ovmDELEGATECALL(uint256 _gasLimit, address _address, bytes memory _calldata) external returns (bool _success, bytes memory _returndata);\\n\\n\\n /****************************\\n * Contract Storage Opcodes *\\n ****************************/\\n\\n function ovmSLOAD(bytes32 _key) external returns (bytes32 _value);\\n function ovmSSTORE(bytes32 _key, bytes32 _value) external;\\n\\n\\n /*************************\\n * Contract Code Opcodes *\\n *************************/\\n\\n function ovmEXTCODECOPY(address _contract, uint256 _offset, uint256 _length) external returns (bytes memory _code);\\n function ovmEXTCODESIZE(address _contract) external returns (uint256 _size);\\n function ovmEXTCODEHASH(address _contract) external returns (bytes32 _hash);\\n\\n\\n /***************************************\\n * Public Functions: Execution Context *\\n ***************************************/\\n\\n function getMaxTransactionGasLimit() external view returns (uint _maxTransactionGasLimit);\\n}\\n\",\"keccak256\":\"0xa613e2f578d56aa80f0916df538b487f8213a18933e78fdecb9efeedae02cf9c\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/execution/iOVM_SafetyChecker.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title iOVM_SafetyChecker\\n */\\ninterface iOVM_SafetyChecker {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function isBytecodeSafe(bytes calldata _bytecode) external pure returns (bool);\\n}\\n\",\"keccak256\":\"0xde6639676d4ec4f77297652d5ede2429bc93e74e11fefd9e9de4bc92dd784878\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/execution/iOVM_StateManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title iOVM_StateManager\\n */\\ninterface iOVM_StateManager {\\n\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n enum ItemState {\\n ITEM_UNTOUCHED,\\n ITEM_LOADED,\\n ITEM_CHANGED,\\n ITEM_COMMITTED\\n }\\n\\n /***************************\\n * Public Functions: Misc *\\n ***************************/\\n\\n function isAuthenticated(address _address) external view returns (bool);\\n\\n /***************************\\n * Public Functions: Setup *\\n ***************************/\\n\\n function owner() external view returns (address _owner);\\n function ovmExecutionManager() external view returns (address _ovmExecutionManager);\\n function setExecutionManager(address _ovmExecutionManager) external;\\n\\n\\n /************************************\\n * Public Functions: Account Access *\\n ************************************/\\n\\n function putAccount(address _address, Lib_OVMCodec.Account memory _account) external;\\n function putEmptyAccount(address _address) external;\\n function getAccount(address _address) external view returns (Lib_OVMCodec.Account memory _account);\\n function hasAccount(address _address) external view returns (bool _exists);\\n function hasEmptyAccount(address _address) external view returns (bool _exists);\\n function setAccountNonce(address _address, uint256 _nonce) external;\\n function getAccountNonce(address _address) external view returns (uint256 _nonce);\\n function getAccountEthAddress(address _address) external view returns (address _ethAddress);\\n function getAccountStorageRoot(address _address) external view returns (bytes32 _storageRoot);\\n function initPendingAccount(address _address) external;\\n function commitPendingAccount(address _address, address _ethAddress, bytes32 _codeHash) external;\\n function testAndSetAccountLoaded(address _address) external returns (bool _wasAccountAlreadyLoaded);\\n function testAndSetAccountChanged(address _address) external returns (bool _wasAccountAlreadyChanged);\\n function commitAccount(address _address) external returns (bool _wasAccountCommitted);\\n function incrementTotalUncommittedAccounts() external;\\n function getTotalUncommittedAccounts() external view returns (uint256 _total);\\n function wasAccountChanged(address _address) external view returns (bool);\\n function wasAccountCommitted(address _address) external view returns (bool);\\n\\n\\n /************************************\\n * Public Functions: Storage Access *\\n ************************************/\\n\\n function putContractStorage(address _contract, bytes32 _key, bytes32 _value) external;\\n function getContractStorage(address _contract, bytes32 _key) external view returns (bytes32 _value);\\n function hasContractStorage(address _contract, bytes32 _key) external view returns (bool _exists);\\n function testAndSetContractStorageLoaded(address _contract, bytes32 _key) external returns (bool _wasContractStorageAlreadyLoaded);\\n function testAndSetContractStorageChanged(address _contract, bytes32 _key) external returns (bool _wasContractStorageAlreadyChanged);\\n function commitContractStorage(address _contract, bytes32 _key) external returns (bool _wasContractStorageCommitted);\\n function incrementTotalUncommittedContractStorage() external;\\n function getTotalUncommittedContractStorage() external view returns (uint256 _total);\\n function wasContractStorageChanged(address _contract, bytes32 _key) external view returns (bool);\\n function wasContractStorageCommitted(address _contract, bytes32 _key) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x7a11dbd1f61593ba34debe07e39eef59967307f7f372ba9855bee0953585d08d\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/predeploys/iOVM_DeployerWhitelist.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title iOVM_DeployerWhitelist\\n */\\ninterface iOVM_DeployerWhitelist {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function initialize(address _owner, bool _allowArbitraryDeployment) external;\\n function getOwner() external returns (address _owner);\\n function setWhitelistedDeployer(address _deployer, bool _isWhitelisted) external;\\n function setOwner(address _newOwner) external;\\n function setAllowArbitraryDeployment(bool _allowArbitraryDeployment) external;\\n function enableArbitraryContractDeployment() external;\\n function isDeployerAllowed(address _deployer) external returns (bool _allowed);\\n}\\n\",\"keccak256\":\"0x969394371cacfc36493230150b6d629173ea72dfdf729330bede475b91d0f004\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/codec/Lib_OVMCodec.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../utils/Lib_Bytes32Utils.sol\\\";\\nimport { Lib_SafeExecutionManagerWrapper } from \\\"../../libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\\\";\\n\\n/**\\n * @title Lib_OVMCodec\\n */\\nlibrary Lib_OVMCodec {\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum EOASignatureType {\\n EIP155_TRANSACTION,\\n ETH_SIGNED_MESSAGE\\n }\\n\\n enum QueueOrigin {\\n SEQUENCER_QUEUE,\\n L1TOL2_QUEUE\\n }\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Account {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n address ethAddress;\\n bool isFresh;\\n }\\n\\n struct EVMAccount {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n }\\n\\n struct ChainBatchHeader {\\n uint256 batchIndex;\\n bytes32 batchRoot;\\n uint256 batchSize;\\n uint256 prevTotalElements;\\n bytes extraData;\\n }\\n\\n struct ChainInclusionProof {\\n uint256 index;\\n bytes32[] siblings;\\n }\\n\\n struct Transaction {\\n uint256 timestamp;\\n uint256 blockNumber;\\n QueueOrigin l1QueueOrigin;\\n address l1TxOrigin;\\n address entrypoint;\\n uint256 gasLimit;\\n bytes data;\\n }\\n\\n struct TransactionChainElement {\\n bool isSequenced;\\n uint256 queueIndex; // QUEUED TX ONLY\\n uint256 timestamp; // SEQUENCER TX ONLY\\n uint256 blockNumber; // SEQUENCER TX ONLY\\n bytes txData; // SEQUENCER TX ONLY\\n }\\n\\n struct QueueElement {\\n bytes32 transactionHash;\\n uint40 timestamp;\\n uint40 blockNumber;\\n }\\n\\n struct EIP155Transaction {\\n uint256 nonce;\\n uint256 gasPrice;\\n uint256 gasLimit;\\n address to;\\n uint256 value;\\n bytes data;\\n uint256 chainId;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Decodes an EOA transaction (i.e., native Ethereum RLP encoding).\\n * @param _transaction Encoded EOA transaction.\\n * @return Transaction decoded into a struct.\\n */\\n function decodeEIP155Transaction(\\n bytes memory _transaction,\\n bool _isEthSignedMessage\\n )\\n internal\\n pure\\n returns (\\n EIP155Transaction memory\\n )\\n {\\n if (_isEthSignedMessage) {\\n (\\n uint256 _nonce,\\n uint256 _gasLimit,\\n uint256 _gasPrice,\\n uint256 _chainId,\\n address _to,\\n bytes memory _data\\n ) = abi.decode(\\n _transaction,\\n (uint256, uint256, uint256, uint256, address ,bytes)\\n );\\n return EIP155Transaction({\\n nonce: _nonce,\\n gasPrice: _gasPrice,\\n gasLimit: _gasLimit,\\n to: _to,\\n value: 0,\\n data: _data,\\n chainId: _chainId\\n });\\n } else {\\n Lib_RLPReader.RLPItem[] memory decoded = Lib_RLPReader.readList(_transaction);\\n\\n return EIP155Transaction({\\n nonce: Lib_RLPReader.readUint256(decoded[0]),\\n gasPrice: Lib_RLPReader.readUint256(decoded[1]),\\n gasLimit: Lib_RLPReader.readUint256(decoded[2]),\\n to: Lib_RLPReader.readAddress(decoded[3]),\\n value: Lib_RLPReader.readUint256(decoded[4]),\\n data: Lib_RLPReader.readBytes(decoded[5]),\\n chainId: Lib_RLPReader.readUint256(decoded[6])\\n });\\n }\\n }\\n\\n /**\\n * Decompresses a compressed EIP155 transaction.\\n * @param _transaction Compressed EIP155 transaction bytes.\\n * @return Transaction parsed into a struct.\\n */\\n function decompressEIP155Transaction(\\n bytes memory _transaction\\n )\\n internal\\n returns (\\n EIP155Transaction memory\\n )\\n {\\n return EIP155Transaction({\\n gasLimit: Lib_BytesUtils.toUint24(_transaction, 0),\\n gasPrice: uint256(Lib_BytesUtils.toUint24(_transaction, 3)) * 1000000,\\n nonce: Lib_BytesUtils.toUint24(_transaction, 6),\\n to: Lib_BytesUtils.toAddress(_transaction, 9),\\n data: Lib_BytesUtils.slice(_transaction, 29),\\n chainId: Lib_SafeExecutionManagerWrapper.safeCHAINID(),\\n value: 0\\n });\\n }\\n\\n /**\\n * Encodes an EOA transaction back into the original transaction.\\n * @param _transaction EIP155transaction to encode.\\n * @param _isEthSignedMessage Whether or not this was an eth signed message.\\n * @return Encoded transaction.\\n */\\n function encodeEIP155Transaction(\\n EIP155Transaction memory _transaction,\\n bool _isEthSignedMessage\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n if (_isEthSignedMessage) {\\n return abi.encode(\\n _transaction.nonce,\\n _transaction.gasLimit,\\n _transaction.gasPrice,\\n _transaction.chainId,\\n _transaction.to,\\n _transaction.data\\n );\\n } else {\\n bytes[] memory raw = new bytes[](9);\\n\\n raw[0] = Lib_RLPWriter.writeUint(_transaction.nonce);\\n raw[1] = Lib_RLPWriter.writeUint(_transaction.gasPrice);\\n raw[2] = Lib_RLPWriter.writeUint(_transaction.gasLimit);\\n if (_transaction.to == address(0)) {\\n raw[3] = Lib_RLPWriter.writeBytes('');\\n } else {\\n raw[3] = Lib_RLPWriter.writeAddress(_transaction.to);\\n }\\n raw[4] = Lib_RLPWriter.writeUint(0);\\n raw[5] = Lib_RLPWriter.writeBytes(_transaction.data);\\n raw[6] = Lib_RLPWriter.writeUint(_transaction.chainId);\\n raw[7] = Lib_RLPWriter.writeBytes(bytes(''));\\n raw[8] = Lib_RLPWriter.writeBytes(bytes(''));\\n\\n return Lib_RLPWriter.writeList(raw);\\n }\\n }\\n\\n /**\\n * Encodes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Encoded transaction bytes.\\n */\\n function encodeTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return abi.encodePacked(\\n _transaction.timestamp,\\n _transaction.blockNumber,\\n _transaction.l1QueueOrigin,\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n );\\n }\\n\\n /**\\n * Hashes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Hashed transaction\\n */\\n function hashTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(encodeTransaction(_transaction));\\n }\\n\\n /**\\n * Converts an OVM account to an EVM account.\\n * @param _in OVM account to convert.\\n * @return Converted EVM account.\\n */\\n function toEVMAccount(\\n Account memory _in\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n return EVMAccount({\\n nonce: _in.nonce,\\n balance: _in.balance,\\n storageRoot: _in.storageRoot,\\n codeHash: _in.codeHash\\n });\\n }\\n\\n /**\\n * @notice RLP-encodes an account state struct.\\n * @param _account Account state struct.\\n * @return RLP-encoded account state.\\n */\\n function encodeEVMAccount(\\n EVMAccount memory _account\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes[] memory raw = new bytes[](4);\\n\\n // Unfortunately we can't create this array outright because\\n // Lib_RLPWriter.writeList will reject fixed-size arrays. Assigning\\n // index-by-index circumvents this issue.\\n raw[0] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.nonce)\\n )\\n );\\n raw[1] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.balance)\\n )\\n );\\n raw[2] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.storageRoot));\\n raw[3] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.codeHash));\\n\\n return Lib_RLPWriter.writeList(raw);\\n }\\n\\n /**\\n * @notice Decodes an RLP-encoded account state into a useful struct.\\n * @param _encoded RLP-encoded account state.\\n * @return Account state struct.\\n */\\n function decodeEVMAccount(\\n bytes memory _encoded\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\\n\\n return EVMAccount({\\n nonce: Lib_RLPReader.readUint256(accountState[0]),\\n balance: Lib_RLPReader.readUint256(accountState[1]),\\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\\n });\\n }\\n\\n /**\\n * Calculates a hash for a given batch header.\\n * @param _batchHeader Header to hash.\\n * @return Hash of the header.\\n */\\n function hashBatchHeader(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(\\n abi.encode(\\n _batchHeader.batchRoot,\\n _batchHeader.batchSize,\\n _batchHeader.prevTotalElements,\\n _batchHeader.extraData\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0xe7e518ba7bba3fa28c532f8902576c1bb4dfc1ec4b62bed6da50623248ba17c3\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Contract Imports */\\nimport { Ownable } from \\\"./Lib_Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n /*******************************************\\n * Contract Variables: Internal Accounting *\\n *******************************************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n public\\n onlyOwner\\n {\\n emit AddressSet(_name, _address);\\n addresses[_getNameHash(_name)] = _address;\\n }\\n\\n function getAddress(\\n string memory _name\\n )\\n public\\n view\\n returns (address)\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32 _hash\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0x3a490595cc21ff170e4027843093670ff845d5972481fbfb956b722ea564bb06\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n\\n /*******************************************\\n * Contract Variables: Contract References *\\n *******************************************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(\\n address _libAddressManager\\n ) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function resolve(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address _contract\\n )\\n {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0xaa3ed342f6deb156c660fd83afa579a3b80db17eb465e8949cf5c1b114780143\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Ownable\\n * @dev Adapted from https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol\\n */\\nabstract contract Ownable {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n address public owner;\\n\\n\\n /**********\\n * Events *\\n **********/\\n\\n event OwnershipTransferred(\\n address indexed previousOwner,\\n address indexed newOwner\\n );\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n constructor() {\\n owner = msg.sender;\\n emit OwnershipTransferred(address(0), owner);\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n owner == msg.sender,\\n \\\"Ownable: caller is not the owner\\\"\\n );\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function renounceOwnership()\\n public\\n virtual\\n onlyOwner\\n {\\n emit OwnershipTransferred(owner, address(0));\\n owner = address(0);\\n }\\n\\n function transferOwnership(address _newOwner)\\n public\\n virtual\\n onlyOwner\\n {\\n require(\\n _newOwner != address(0),\\n \\\"Ownable: new owner cannot be the zero address\\\"\\n );\\n\\n emit OwnershipTransferred(owner, _newOwner);\\n owner = _newOwner;\\n }\\n}\\n\",\"keccak256\":\"0xd9dfd9264e5b5fedd53a5b10fdf179c3f367614b0fe69179bce4e45119f5b739\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPReader.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_RLPReader\\n * @dev Adapted from \\\"RLPReader\\\" by Hamdi Allam (hamdi.allam97@gmail.com).\\n */\\nlibrary Lib_RLPReader {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 constant internal MAX_LIST_LENGTH = 32;\\n\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum RLPItemType {\\n DATA_ITEM,\\n LIST_ITEM\\n }\\n\\n \\n /***********\\n * Structs *\\n ***********/\\n\\n struct RLPItem {\\n uint256 length;\\n uint256 ptr;\\n }\\n \\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n \\n /**\\n * Converts bytes to a reference to memory position and length.\\n * @param _in Input bytes to convert.\\n * @return Output memory reference.\\n */\\n function toRLPItem(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem memory\\n )\\n {\\n uint256 ptr;\\n assembly {\\n ptr := add(_in, 32)\\n }\\n\\n return RLPItem({\\n length: _in.length,\\n ptr: ptr\\n });\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n (\\n uint256 listOffset,\\n ,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.LIST_ITEM,\\n \\\"Invalid RLP list value.\\\"\\n );\\n\\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\\n // writing to the length. Since we can't know the number of RLP items without looping over\\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\\n // simply set a reasonable maximum list length and decrease the size before we finish.\\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\\n\\n uint256 itemCount = 0;\\n uint256 offset = listOffset;\\n while (offset < _in.length) {\\n require(\\n itemCount < MAX_LIST_LENGTH,\\n \\\"Provided RLP list exceeds max list length.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n ) = _decodeLength(RLPItem({\\n length: _in.length - offset,\\n ptr: _in.ptr + offset\\n }));\\n\\n out[itemCount] = RLPItem({\\n length: itemLength + itemOffset,\\n ptr: _in.ptr + offset\\n });\\n\\n itemCount += 1;\\n offset += itemOffset + itemLength;\\n }\\n\\n // Decrease the array size to match the actual item count.\\n assembly {\\n mstore(out, itemCount)\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n return readList(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes value.\\\"\\n );\\n\\n return _copy(_in.ptr, itemOffset, itemLength);\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return readBytes(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return string(readBytes(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return readString(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n require(\\n _in.length <= 33,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr + itemOffset;\\n bytes32 out;\\n assembly {\\n out := mload(ptr)\\n\\n // Shift the bytes over to match the item size.\\n if lt(itemLength, 32) {\\n out := div(out, exp(256, sub(32, itemLength)))\\n }\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return readBytes32(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return uint256(readBytes32(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return readUint256(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n require(\\n _in.length == 1,\\n \\\"Invalid RLP boolean value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 out;\\n assembly {\\n out := byte(0, mload(ptr))\\n }\\n\\n require(\\n out == 0 || out == 1,\\n \\\"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\\\"\\n );\\n\\n return out != 0;\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return readBool(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n if (_in.length == 1) {\\n return address(0);\\n }\\n\\n require(\\n _in.length == 21,\\n \\\"Invalid RLP address value.\\\"\\n );\\n\\n return address(readUint256(_in));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return readAddress(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads the raw bytes of an RLP item.\\n * @param _in RLP item to read.\\n * @return Raw RLP bytes.\\n */\\n function readRawBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in);\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Decodes the length of an RLP item.\\n * @param _in RLP item to decode.\\n * @return Offset of the encoded data.\\n * @return Length of the encoded data.\\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\\n */\\n function _decodeLength(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n uint256,\\n uint256,\\n RLPItemType\\n )\\n {\\n require(\\n _in.length > 0,\\n \\\"RLP item cannot be null.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 prefix;\\n assembly {\\n prefix := byte(0, mload(ptr))\\n }\\n\\n if (prefix <= 0x7f) {\\n // Single byte.\\n\\n return (0, 1, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xb7) {\\n // Short string.\\n\\n uint256 strLen = prefix - 0x80;\\n \\n require(\\n _in.length > strLen,\\n \\\"Invalid RLP short string.\\\"\\n );\\n\\n return (1, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xbf) {\\n // Long string.\\n uint256 lenOfStrLen = prefix - 0xb7;\\n\\n require(\\n _in.length > lenOfStrLen,\\n \\\"Invalid RLP long string length.\\\"\\n );\\n\\n uint256 strLen;\\n assembly {\\n // Pick out the string length.\\n strLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfStrLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfStrLen + strLen,\\n \\\"Invalid RLP long string.\\\"\\n );\\n\\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xf7) {\\n // Short list.\\n uint256 listLen = prefix - 0xc0;\\n\\n require(\\n _in.length > listLen,\\n \\\"Invalid RLP short list.\\\"\\n );\\n\\n return (1, listLen, RLPItemType.LIST_ITEM);\\n } else {\\n // Long list.\\n uint256 lenOfListLen = prefix - 0xf7;\\n\\n require(\\n _in.length > lenOfListLen,\\n \\\"Invalid RLP long list length.\\\"\\n );\\n\\n uint256 listLen;\\n assembly {\\n // Pick out the list length.\\n listLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfListLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfListLen + listLen,\\n \\\"Invalid RLP long list.\\\"\\n );\\n\\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\\n }\\n }\\n\\n /**\\n * Copies the bytes from a memory location.\\n * @param _src Pointer to the location to read from.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Copied bytes.\\n */\\n function _copy(\\n uint256 _src,\\n uint256 _offset,\\n uint256 _length\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out = new bytes(_length);\\n if (out.length == 0) {\\n return out;\\n }\\n\\n uint256 src = _src + _offset;\\n uint256 dest;\\n assembly {\\n dest := add(out, 32)\\n }\\n\\n // Copy over as many complete words as we can.\\n for (uint256 i = 0; i < _length / 32; i++) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n\\n src += 32;\\n dest += 32;\\n }\\n\\n // Pick out the remaining bytes.\\n uint256 mask = 256 ** (32 - (_length % 32)) - 1;\\n assembly {\\n mstore(\\n dest,\\n or(\\n and(mload(src), not(mask)),\\n and(mload(dest), mask)\\n )\\n )\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Copies an RLP item into bytes.\\n * @param _in RLP item to copy.\\n * @return Copied bytes.\\n */\\n function _copy(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in.ptr, 0, _in.length);\\n }\\n}\\n\",\"keccak256\":\"0xbdb8fae0ca2483b4cc07607a5070fc25e33c54b4e4462b99e7c0b13aac48a09b\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPWriter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\n\\n/**\\n * @title Lib_RLPWriter\\n * @author Bakaoh (with modifications)\\n */\\nlibrary Lib_RLPWriter {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * RLP encodes a byte string.\\n * @param _in The byte string to encode.\\n * @return _out The RLP encoded string in bytes.\\n */\\n function writeBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n bytes memory encoded;\\n\\n if (_in.length == 1 && uint8(_in[0]) < 128) {\\n encoded = _in;\\n } else {\\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * RLP encodes a list of RLP encoded byte byte strings.\\n * @param _in The list of RLP encoded byte strings.\\n * @return _out The RLP encoded list of items in bytes.\\n */\\n function writeList(\\n bytes[] memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n bytes memory list = _flatten(_in);\\n return abi.encodePacked(_writeLength(list.length, 192), list);\\n }\\n\\n /**\\n * RLP encodes a string.\\n * @param _in The string to encode.\\n * @return _out The RLP encoded string in bytes.\\n */\\n function writeString(\\n string memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(bytes(_in));\\n }\\n\\n /**\\n * RLP encodes an address.\\n * @param _in The address to encode.\\n * @return _out The RLP encoded address in bytes.\\n */\\n function writeAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a uint.\\n * @param _in The uint256 to encode.\\n * @return _out The RLP encoded uint256 in bytes.\\n */\\n function writeUint(\\n uint256 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(_toBinary(_in));\\n }\\n\\n /**\\n * RLP encodes a bool.\\n * @param _in The bool to encode.\\n * @return _out The RLP encoded bool in bytes.\\n */\\n function writeBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n bytes memory encoded = new bytes(1);\\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\\n return encoded;\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\\n * @param _len The length of the string or the payload.\\n * @param _offset 128 if item is string, 192 if item is list.\\n * @return _encoded RLP encoded bytes.\\n */\\n function _writeLength(\\n uint256 _len,\\n uint256 _offset\\n )\\n private\\n pure\\n returns (\\n bytes memory _encoded\\n )\\n {\\n bytes memory encoded;\\n\\n if (_len < 56) {\\n encoded = new bytes(1);\\n encoded[0] = byte(uint8(_len) + uint8(_offset));\\n } else {\\n uint256 lenLen;\\n uint256 i = 1;\\n while (_len / i != 0) {\\n lenLen++;\\n i *= 256;\\n }\\n\\n encoded = new bytes(lenLen + 1);\\n encoded[0] = byte(uint8(lenLen) + uint8(_offset) + 55);\\n for(i = 1; i <= lenLen; i++) {\\n encoded[i] = byte(uint8((_len / (256**(lenLen-i))) % 256));\\n }\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * Encode integer in big endian binary form with no leading zeroes.\\n * @notice TODO: This should be optimized with assembly to save gas costs.\\n * @param _x The integer to encode.\\n * @return _binary RLP encoded bytes.\\n */\\n function _toBinary(\\n uint256 _x\\n )\\n private\\n pure\\n returns (\\n bytes memory _binary\\n )\\n {\\n bytes memory b = abi.encodePacked(_x);\\n\\n uint256 i = 0;\\n for (; i < 32; i++) {\\n if (b[i] != 0) {\\n break;\\n }\\n }\\n\\n bytes memory res = new bytes(32 - i);\\n for (uint256 j = 0; j < res.length; j++) {\\n res[j] = b[i++];\\n }\\n\\n return res;\\n }\\n\\n /**\\n * Copies a piece of memory to another location.\\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\\n * @param _dest Destination location.\\n * @param _src Source location.\\n * @param _len Length of memory to copy.\\n */\\n function _memcpy(\\n uint256 _dest,\\n uint256 _src,\\n uint256 _len\\n )\\n private\\n pure\\n {\\n uint256 dest = _dest;\\n uint256 src = _src;\\n uint256 len = _len;\\n\\n for(; len >= 32; len -= 32) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n dest += 32;\\n src += 32;\\n }\\n\\n uint256 mask = 256 ** (32 - len) - 1;\\n assembly {\\n let srcpart := and(mload(src), not(mask))\\n let destpart := and(mload(dest), mask)\\n mstore(dest, or(destpart, srcpart))\\n }\\n }\\n\\n /**\\n * Flattens a list of byte strings into one byte string.\\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\\n * @param _list List of byte strings to flatten.\\n * @return _flattened The flattened byte string.\\n */\\n function _flatten(\\n bytes[] memory _list\\n )\\n private\\n pure\\n returns (\\n bytes memory _flattened\\n )\\n {\\n if (_list.length == 0) {\\n return new bytes(0);\\n }\\n\\n uint256 len;\\n uint256 i = 0;\\n for (; i < _list.length; i++) {\\n len += _list[i].length;\\n }\\n\\n bytes memory flattened = new bytes(len);\\n uint256 flattenedPtr;\\n assembly { flattenedPtr := add(flattened, 0x20) }\\n\\n for(i = 0; i < _list.length; i++) {\\n bytes memory item = _list[i];\\n\\n uint256 listPtr;\\n assembly { listPtr := add(item, 0x20)}\\n\\n _memcpy(flattenedPtr, listPtr, item.length);\\n flattenedPtr += _list[i].length;\\n }\\n\\n return flattened;\\n }\\n}\",\"keccak256\":\"0xbcb24619c1758cb0d9f3fe5c79495950045a9087046a02b9ce01df46ae09ae5b\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_Bytes32Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_Byte32Utils\\n */\\nlibrary Lib_Bytes32Utils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \\\"true.\\\"\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as a boolean.\\n */\\n function toBool(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return _in != 0;\\n }\\n\\n /**\\n * Converts a boolean to a bytes32 value.\\n * @param _in Input boolean value.\\n * @return Boolean as a bytes32.\\n */\\n function fromBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in ? 1 : 0));\\n }\\n\\n /**\\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as an address.\\n */\\n function toAddress(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return address(uint160(uint256(_in)));\\n }\\n\\n /**\\n * Converts an address to a bytes32.\\n * @param _in Input address value.\\n * @return Address as a bytes32.\\n */\\n function fromAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in));\\n }\\n\\n /**\\n * Removes the leading zeros from a bytes32 value and returns a new (smaller) bytes value.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 without any leading zeros.\\n */\\n function removeLeadingZeros(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out;\\n\\n assembly {\\n // Figure out how many leading zero bytes to remove.\\n let shift := 0\\n for { let i := 0 } and(lt(i, 32), eq(byte(i, _in), 0)) { i := add(i, 1) } {\\n shift := add(shift, 1)\\n }\\n\\n // Reserve some space for our output and fix the free memory pointer.\\n out := mload(0x40)\\n mstore(0x40, add(out, 0x40))\\n\\n // Shift the value and store it into the output bytes.\\n mstore(add(out, 0x20), shl(mul(shift, 8), _in))\\n\\n // Store the new size (with leading zero bytes removed) in the output byte size.\\n mstore(out, sub(32, shift))\\n }\\n\\n return out;\\n }\\n}\\n\",\"keccak256\":\"0xfa2def593e3fc56a31852c3744aefdaa93cec74e721bfcfeb1e5d166c7c60b64\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_BytesUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_BytesUtils\\n */\\nlibrary Lib_BytesUtils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_start + _length >= _start, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n if (_bytes.length - _start == 0) {\\n return bytes('');\\n }\\n\\n return slice(_bytes, _start, _bytes.length - _start);\\n }\\n\\n function toBytes32PadLeft(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes32)\\n {\\n bytes32 ret;\\n uint256 len = _bytes.length <= 32 ? _bytes.length : 32;\\n assembly {\\n ret := shr(mul(sub(32, len), 8), mload(add(_bytes, 32)))\\n }\\n return ret;\\n }\\n\\n function toBytes32(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes32)\\n {\\n if (_bytes.length < 32) {\\n bytes32 ret;\\n assembly {\\n ret := mload(add(_bytes, 32))\\n }\\n return ret;\\n }\\n\\n return abi.decode(_bytes,(bytes32)); // will truncate if input length > 32 bytes\\n }\\n\\n function toUint256(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (uint256)\\n {\\n return uint256(toBytes32(_bytes));\\n }\\n\\n function toUint24(bytes memory _bytes, uint256 _start) internal pure returns (uint24) {\\n require(_start + 3 >= _start, \\\"toUint24_overflow\\\");\\n require(_bytes.length >= _start + 3 , \\\"toUint24_outOfBounds\\\");\\n uint24 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x3), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toUint8(bytes memory _bytes, uint256 _start) internal pure returns (uint8) {\\n require(_start + 1 >= _start, \\\"toUint8_overflow\\\");\\n require(_bytes.length >= _start + 1 , \\\"toUint8_outOfBounds\\\");\\n uint8 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x1), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toAddress(bytes memory _bytes, uint256 _start) internal pure returns (address) {\\n require(_start + 20 >= _start, \\\"toAddress_overflow\\\");\\n require(_bytes.length >= _start + 20, \\\"toAddress_outOfBounds\\\");\\n address tempAddress;\\n\\n assembly {\\n tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000)\\n }\\n\\n return tempAddress;\\n }\\n\\n function toNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n bytes memory nibbles = new bytes(_bytes.length * 2);\\n\\n for (uint256 i = 0; i < _bytes.length; i++) {\\n nibbles[i * 2] = _bytes[i] >> 4;\\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\\n }\\n\\n return nibbles;\\n }\\n\\n function fromNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n bytes memory ret = new bytes(_bytes.length / 2);\\n\\n for (uint256 i = 0; i < ret.length; i++) {\\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\\n }\\n\\n return ret;\\n }\\n\\n function equal(\\n bytes memory _bytes,\\n bytes memory _other\\n )\\n internal\\n pure\\n returns (bool)\\n {\\n return keccak256(_bytes) == keccak256(_other);\\n }\\n}\\n\",\"keccak256\":\"0x0adf22e1b22ba09911e859f64cb3b484e992be4f9fd3b09088e6225bf8d06ce0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_ECDSAUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_ECDSAUtils\\n */\\nlibrary Lib_ECDSAUtils {\\n\\n /**************************************\\n * Internal Functions: ECDSA Recovery *\\n **************************************/\\n\\n /**\\n * Recovers a signed address given a message and signature.\\n * @param _message Message that was originally signed.\\n * @param _isEthSignedMessage Whether or not the user used the `Ethereum Signed Message` prefix.\\n * @param _v Signature `v` parameter.\\n * @param _r Signature `r` parameter.\\n * @param _s Signature `s` parameter.\\n * @return _sender Signer address.\\n */\\n function recover(\\n bytes memory _message,\\n bool _isEthSignedMessage,\\n uint8 _v,\\n bytes32 _r,\\n bytes32 _s\\n )\\n internal\\n pure\\n returns (\\n address _sender\\n )\\n {\\n bytes32 messageHash = getMessageHash(_message, _isEthSignedMessage);\\n\\n return ecrecover(\\n messageHash,\\n _v + 27,\\n _r,\\n _s\\n );\\n }\\n\\n function getMessageHash(\\n bytes memory _message,\\n bool _isEthSignedMessage\\n )\\n internal\\n pure\\n returns (bytes32) {\\n if (_isEthSignedMessage) {\\n return getEthSignedMessageHash(_message);\\n }\\n return getNativeMessageHash(_message);\\n }\\n\\n\\n /*************************************\\n * Private Functions: ECDSA Recovery *\\n *************************************/\\n\\n /**\\n * Gets the native message hash (simple keccak256) for a message.\\n * @param _message Message to hash.\\n * @return _messageHash Native message hash.\\n */\\n function getNativeMessageHash(\\n bytes memory _message\\n )\\n private\\n pure\\n returns (\\n bytes32 _messageHash\\n )\\n {\\n return keccak256(_message);\\n }\\n\\n /**\\n * Gets the hash of a message with the `Ethereum Signed Message` prefix.\\n * @param _message Message to hash.\\n * @return _messageHash Prefixed message hash.\\n */\\n function getEthSignedMessageHash(\\n bytes memory _message\\n )\\n private\\n pure\\n returns (\\n bytes32 _messageHash\\n )\\n {\\n bytes memory prefix = \\\"\\\\x19Ethereum Signed Message:\\\\n32\\\";\\n bytes32 messageHash = keccak256(_message);\\n return keccak256(abi.encodePacked(prefix, messageHash));\\n }\\n}\",\"keccak256\":\"0xda865d8cc014940a4755e329db9c6272a31bd9a340000a4ecc005d46299a585c\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_ErrorUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/**\\n * @title Lib_ErrorUtils\\n */\\nlibrary Lib_ErrorUtils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Encodes an error string into raw solidity-style revert data.\\n * (i.e. ascii bytes, prefixed with bytes4(keccak(\\\"Error(string))\\\"))\\n * Ref: https://docs.soliditylang.org/en/v0.8.2/control-structures.html?highlight=Error(string)#panic-via-assert-and-error-via-require\\n * @param _reason Reason for the reversion.\\n * @return Standard solidity revert data for the given reason.\\n */\\n function encodeRevertString(\\n string memory _reason\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return abi.encodeWithSignature(\\n \\\"Error(string)\\\",\\n _reason\\n );\\n }\\n}\\n\",\"keccak256\":\"0xfc64ec4a81fb50865b502a0004ed154e8598e1a313db77303fc95e41f536e6b7\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_EthUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// @unsupported: ovm\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"./Lib_Bytes32Utils.sol\\\";\\n\\n/**\\n * @title Lib_EthUtils\\n */\\nlibrary Lib_EthUtils {\\n\\n /***********************************\\n * Internal Functions: Code Access *\\n ***********************************/\\n\\n /**\\n * Gets the code for a given address.\\n * @param _address Address to get code for.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return _code Code read from the contract.\\n */\\n function getCode(\\n address _address,\\n uint256 _offset,\\n uint256 _length\\n )\\n internal\\n view\\n returns (\\n bytes memory _code\\n )\\n {\\n assembly {\\n _code := mload(0x40)\\n mstore(0x40, add(_code, add(_length, 0x20)))\\n mstore(_code, _length)\\n extcodecopy(_address, add(_code, 0x20), _offset, _length)\\n }\\n\\n return _code;\\n }\\n\\n /**\\n * Gets the full code for a given address.\\n * @param _address Address to get code for.\\n * @return _code Full code of the contract.\\n */\\n function getCode(\\n address _address\\n )\\n internal\\n view\\n returns (\\n bytes memory _code\\n )\\n {\\n return getCode(\\n _address,\\n 0,\\n getCodeSize(_address)\\n );\\n }\\n\\n /**\\n * Gets the size of a contract's code in bytes.\\n * @param _address Address to get code size for.\\n * @return _codeSize Size of the contract's code in bytes.\\n */\\n function getCodeSize(\\n address _address\\n )\\n internal\\n view\\n returns (\\n uint256 _codeSize\\n )\\n {\\n assembly {\\n _codeSize := extcodesize(_address)\\n }\\n\\n return _codeSize;\\n }\\n\\n /**\\n * Gets the hash of a contract's code.\\n * @param _address Address to get a code hash for.\\n * @return _codeHash Hash of the contract's code.\\n */\\n function getCodeHash(\\n address _address\\n )\\n internal\\n view\\n returns (\\n bytes32 _codeHash\\n )\\n {\\n assembly {\\n _codeHash := extcodehash(_address)\\n }\\n\\n return _codeHash;\\n }\\n\\n\\n /*****************************************\\n * Internal Functions: Contract Creation *\\n *****************************************/\\n\\n /**\\n * Creates a contract with some given initialization code.\\n * @param _code Contract initialization code.\\n * @return _created Address of the created contract.\\n */\\n function createContract(\\n bytes memory _code\\n )\\n internal\\n returns (\\n address _created\\n )\\n {\\n assembly {\\n _created := create(\\n 0,\\n add(_code, 0x20),\\n mload(_code)\\n )\\n }\\n\\n return _created;\\n }\\n\\n /**\\n * Computes the address that would be generated by CREATE.\\n * @param _creator Address creating the contract.\\n * @param _nonce Creator's nonce.\\n * @return _address Address to be generated by CREATE.\\n */\\n function getAddressForCREATE(\\n address _creator,\\n uint256 _nonce\\n )\\n internal\\n pure\\n returns (\\n address _address\\n )\\n {\\n bytes[] memory encoded = new bytes[](2);\\n encoded[0] = Lib_RLPWriter.writeAddress(_creator);\\n encoded[1] = Lib_RLPWriter.writeUint(_nonce);\\n\\n bytes memory encodedList = Lib_RLPWriter.writeList(encoded);\\n return Lib_Bytes32Utils.toAddress(keccak256(encodedList));\\n }\\n\\n /**\\n * Computes the address that would be generated by CREATE2.\\n * @param _creator Address creating the contract.\\n * @param _bytecode Bytecode of the contract to be created.\\n * @param _salt 32 byte salt value mixed into the hash.\\n * @return _address Address to be generated by CREATE2.\\n */\\n function getAddressForCREATE2(\\n address _creator,\\n bytes memory _bytecode,\\n bytes32 _salt\\n )\\n internal\\n pure\\n returns (address _address)\\n {\\n bytes32 hashedData = keccak256(abi.encodePacked(\\n byte(0xff),\\n _creator,\\n _salt,\\n keccak256(_bytecode)\\n ));\\n\\n return Lib_Bytes32Utils.toAddress(hashedData);\\n }\\n}\\n\",\"keccak256\":\"0x5fdf009da11f90cb5e99e5cd160d07bb744a5a2055774a646bdf277ad6910595\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_Math\\n */\\nlibrary Lib_Math {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Calculates the minumum of two numbers.\\n * @param _x First number to compare.\\n * @param _y Second number to compare.\\n * @return Lesser of the two numbers.\\n */\\n function min(\\n uint256 _x,\\n uint256 _y\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n if (_x < _y) {\\n return _x;\\n }\\n\\n return _y;\\n }\\n}\\n\",\"keccak256\":\"0xcc36559529e708e99b8fd2ab0078fcba5a1f81787b08c1cf4cd46288ad64ee58\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_MerkleTree.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_MerkleTree\\n * @author River Keefer\\n */\\nlibrary Lib_MerkleTree {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Calculates a merkle root for a list of 32-byte leaf hashes. WARNING: If the number\\n * of leaves passed in is not a power of two, it pads out the tree with zero hashes.\\n * If you do not know the original length of elements for the tree you are verifying,\\n * then this may allow empty leaves past _elements.length to pass a verification check down the line.\\n * Note that the _elements argument is modified, therefore it must not be used again afterwards\\n * @param _elements Array of hashes from which to generate a merkle root.\\n * @return Merkle root of the leaves, with zero hashes for non-powers-of-two (see above).\\n */\\n function getMerkleRoot(\\n bytes32[] memory _elements\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n require(\\n _elements.length > 0,\\n \\\"Lib_MerkleTree: Must provide at least one leaf hash.\\\"\\n );\\n\\n if (_elements.length == 1) {\\n return _elements[0];\\n }\\n\\n uint256[16] memory defaults = [\\n 0x290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563,\\n 0x633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d,\\n 0x890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d,\\n 0x3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd8,\\n 0xecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da,\\n 0xdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da5,\\n 0x617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d7,\\n 0x292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead,\\n 0xe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e10,\\n 0x7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f82,\\n 0xe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e83636516,\\n 0x3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c,\\n 0xad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e,\\n 0xa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab,\\n 0x4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c862,\\n 0x2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf10\\n ];\\n\\n // Reserve memory space for our hashes.\\n bytes memory buf = new bytes(64);\\n\\n // We'll need to keep track of left and right siblings.\\n bytes32 leftSibling;\\n bytes32 rightSibling;\\n\\n // Number of non-empty nodes at the current depth.\\n uint256 rowSize = _elements.length;\\n\\n // Current depth, counting from 0 at the leaves\\n uint256 depth = 0;\\n\\n // Common sub-expressions\\n uint256 halfRowSize; // rowSize / 2\\n bool rowSizeIsOdd; // rowSize % 2 == 1\\n\\n while (rowSize > 1) {\\n halfRowSize = rowSize / 2;\\n rowSizeIsOdd = rowSize % 2 == 1;\\n\\n for (uint256 i = 0; i < halfRowSize; i++) {\\n leftSibling = _elements[(2 * i) ];\\n rightSibling = _elements[(2 * i) + 1];\\n assembly {\\n mstore(add(buf, 32), leftSibling )\\n mstore(add(buf, 64), rightSibling)\\n }\\n\\n _elements[i] = keccak256(buf);\\n }\\n\\n if (rowSizeIsOdd) {\\n leftSibling = _elements[rowSize - 1];\\n rightSibling = bytes32(defaults[depth]);\\n assembly {\\n mstore(add(buf, 32), leftSibling)\\n mstore(add(buf, 64), rightSibling)\\n }\\n\\n _elements[halfRowSize] = keccak256(buf);\\n }\\n\\n rowSize = halfRowSize + (rowSizeIsOdd ? 1 : 0);\\n depth++;\\n }\\n\\n return _elements[0];\\n }\\n\\n /**\\n * Verifies a merkle branch for the given leaf hash. Assumes the original length\\n * of leaves generated is a known, correct input, and does not return true for indices\\n * extending past that index (even if _siblings would be otherwise valid.)\\n * @param _root The Merkle root to verify against.\\n * @param _leaf The leaf hash to verify inclusion of.\\n * @param _index The index in the tree of this leaf.\\n * @param _siblings Array of sibline nodes in the inclusion proof, starting from depth 0 (bottom of the tree).\\n * @param _totalLeaves The total number of leaves originally passed into.\\n * @return Whether or not the merkle branch and leaf passes verification.\\n */\\n function verify(\\n bytes32 _root,\\n bytes32 _leaf,\\n uint256 _index,\\n bytes32[] memory _siblings,\\n uint256 _totalLeaves\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n require(\\n _totalLeaves > 0,\\n \\\"Lib_MerkleTree: Total leaves must be greater than zero.\\\"\\n );\\n\\n require(\\n _index < _totalLeaves,\\n \\\"Lib_MerkleTree: Index out of bounds.\\\"\\n );\\n\\n require(\\n _siblings.length == _ceilLog2(_totalLeaves),\\n \\\"Lib_MerkleTree: Total siblings does not correctly correspond to total leaves.\\\"\\n );\\n\\n bytes32 computedRoot = _leaf;\\n\\n for (uint256 i = 0; i < _siblings.length; i++) {\\n if ((_index & 1) == 1) {\\n computedRoot = keccak256(\\n abi.encodePacked(\\n _siblings[i],\\n computedRoot\\n )\\n );\\n } else {\\n computedRoot = keccak256(\\n abi.encodePacked(\\n computedRoot,\\n _siblings[i]\\n )\\n );\\n }\\n\\n _index >>= 1;\\n }\\n\\n return _root == computedRoot;\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Calculates the integer ceiling of the log base 2 of an input.\\n * @param _in Unsigned input to calculate the log.\\n * @return ceil(log_base_2(_in))\\n */\\n function _ceilLog2(\\n uint256 _in\\n )\\n private\\n pure\\n returns (\\n uint256\\n )\\n {\\n require(\\n _in > 0,\\n \\\"Lib_MerkleTree: Cannot compute ceil(log_2) of 0.\\\"\\n );\\n\\n if (_in == 1) {\\n return 0;\\n }\\n\\n // Find the highest set bit (will be floor(log_2)).\\n // Borrowed with <3 from https://github.com/ethereum/solidity-examples\\n uint256 val = _in;\\n uint256 highest = 0;\\n for (uint256 i = 128; i >= 1; i >>= 1) {\\n if (val & (uint(1) << i) - 1 << i != 0) {\\n highest += i;\\n val >>= i;\\n }\\n }\\n\\n // Increment by one if this is not a perfect logarithm.\\n if ((uint(1) << highest) != _in) {\\n highest += 1;\\n }\\n\\n return highest;\\n }\\n}\\n\",\"keccak256\":\"0xa78edb9fbd34712771a1ebff05bc5e1abec7fc1e9a1bfb709d183099b44fa62a\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_ErrorUtils } from \\\"../utils/Lib_ErrorUtils.sol\\\";\\n\\n/**\\n * @title Lib_SafeExecutionManagerWrapper\\n * @dev The Safe Execution Manager Wrapper provides functions which facilitate writing OVM safe \\n * code using the standard solidity compiler, by routing all its operations through the Execution \\n * Manager.\\n * \\n * Compiler used: solc\\n * Runtime target: OVM\\n */\\nlibrary Lib_SafeExecutionManagerWrapper {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Performs a safe ovmCALL.\\n * @param _gasLimit Gas limit for the call.\\n * @param _target Address to call.\\n * @param _calldata Data to send to the call.\\n * @return _success Whether or not the call reverted.\\n * @return _returndata Data returned by the call.\\n */\\n function safeCALL(\\n uint256 _gasLimit,\\n address _target,\\n bytes memory _calldata\\n )\\n internal\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCALL(uint256,address,bytes)\\\",\\n _gasLimit,\\n _target,\\n _calldata\\n )\\n );\\n\\n return abi.decode(returndata, (bool, bytes));\\n }\\n\\n /**\\n * Performs a safe ovmDELEGATECALL.\\n * @param _gasLimit Gas limit for the call.\\n * @param _target Address to call.\\n * @param _calldata Data to send to the call.\\n * @return _success Whether or not the call reverted.\\n * @return _returndata Data returned by the call.\\n */\\n function safeDELEGATECALL(\\n uint256 _gasLimit,\\n address _target,\\n bytes memory _calldata\\n )\\n internal\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmDELEGATECALL(uint256,address,bytes)\\\",\\n _gasLimit,\\n _target,\\n _calldata\\n )\\n );\\n\\n return abi.decode(returndata, (bool, bytes));\\n }\\n\\n /**\\n * Performs a safe ovmCREATE call.\\n * @param _gasLimit Gas limit for the creation.\\n * @param _bytecode Code for the new contract.\\n * @return _contract Address of the created contract.\\n */\\n function safeCREATE(\\n uint256 _gasLimit,\\n bytes memory _bytecode\\n )\\n internal\\n returns (\\n address,\\n bytes memory\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n _gasLimit,\\n abi.encodeWithSignature(\\n \\\"ovmCREATE(bytes)\\\",\\n _bytecode\\n )\\n );\\n\\n return abi.decode(returndata, (address, bytes));\\n }\\n\\n /**\\n * Performs a safe ovmEXTCODESIZE call.\\n * @param _contract Address of the contract to query the size of.\\n * @return _EXTCODESIZE Size of the requested contract in bytes.\\n */\\n function safeEXTCODESIZE(\\n address _contract\\n )\\n internal\\n returns (\\n uint256 _EXTCODESIZE\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmEXTCODESIZE(address)\\\",\\n _contract\\n )\\n );\\n\\n return abi.decode(returndata, (uint256));\\n }\\n\\n /**\\n * Performs a safe ovmCHAINID call.\\n * @return _CHAINID Result of calling ovmCHAINID.\\n */\\n function safeCHAINID()\\n internal\\n returns (\\n uint256 _CHAINID\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCHAINID()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (uint256));\\n }\\n\\n /**\\n * Performs a safe ovmCALLER call.\\n * @return _CALLER Result of calling ovmCALLER.\\n */\\n function safeCALLER()\\n internal\\n returns (\\n address _CALLER\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCALLER()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (address));\\n }\\n\\n /**\\n * Performs a safe ovmADDRESS call.\\n * @return _ADDRESS Result of calling ovmADDRESS.\\n */\\n function safeADDRESS()\\n internal\\n returns (\\n address _ADDRESS\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmADDRESS()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (address));\\n }\\n\\n /**\\n * Performs a safe ovmGETNONCE call.\\n * @return _nonce Result of calling ovmGETNONCE.\\n */\\n function safeGETNONCE()\\n internal\\n returns (\\n uint256 _nonce\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmGETNONCE()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (uint256));\\n }\\n\\n /**\\n * Performs a safe ovmINCREMENTNONCE call.\\n */\\n function safeINCREMENTNONCE()\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmINCREMENTNONCE()\\\"\\n )\\n );\\n }\\n\\n /**\\n * Performs a safe ovmCREATEEOA call.\\n * @param _messageHash Message hash which was signed by EOA\\n * @param _v v value of signature (0 or 1)\\n * @param _r r value of signature\\n * @param _s s value of signature\\n */\\n function safeCREATEEOA(\\n bytes32 _messageHash,\\n uint8 _v,\\n bytes32 _r,\\n bytes32 _s\\n )\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCREATEEOA(bytes32,uint8,bytes32,bytes32)\\\",\\n _messageHash,\\n _v,\\n _r,\\n _s\\n )\\n );\\n }\\n\\n /**\\n * Performs a safe REVERT.\\n * @param _reason String revert reason to pass along with the REVERT.\\n */\\n function safeREVERT(\\n string memory _reason\\n )\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmREVERT(bytes)\\\",\\n Lib_ErrorUtils.encodeRevertString(\\n _reason\\n )\\n )\\n );\\n }\\n\\n /**\\n * Performs a safe \\\"require\\\".\\n * @param _condition Boolean condition that must be true or will revert.\\n * @param _reason String revert reason to pass along with the REVERT.\\n */\\n function safeREQUIRE(\\n bool _condition,\\n string memory _reason\\n )\\n internal\\n {\\n if (!_condition) {\\n safeREVERT(\\n _reason\\n );\\n }\\n }\\n\\n /**\\n * Performs a safe ovmSLOAD call.\\n */\\n function safeSLOAD(\\n bytes32 _key\\n )\\n internal\\n returns (\\n bytes32\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmSLOAD(bytes32)\\\",\\n _key\\n )\\n );\\n\\n return abi.decode(returndata, (bytes32));\\n }\\n\\n /**\\n * Performs a safe ovmSSTORE call.\\n */\\n function safeSSTORE(\\n bytes32 _key,\\n bytes32 _value\\n )\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmSSTORE(bytes32,bytes32)\\\",\\n _key,\\n _value\\n )\\n );\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Performs an ovm interaction and the necessary safety checks.\\n * @param _gasLimit Gas limit for the interaction.\\n * @param _calldata Data to send to the OVM_ExecutionManager (encoded with sighash).\\n * @return _returndata Data sent back by the OVM_ExecutionManager.\\n */\\n function _safeExecutionManagerInteraction(\\n uint256 _gasLimit,\\n bytes memory _calldata\\n )\\n private\\n returns (\\n bytes memory _returndata\\n )\\n {\\n address ovmExecutionManager = msg.sender;\\n (\\n bool success,\\n bytes memory returndata\\n ) = ovmExecutionManager.call{gas: _gasLimit}(_calldata);\\n\\n if (success == false) {\\n assembly {\\n revert(add(returndata, 0x20), mload(returndata))\\n }\\n } else if (returndata.length == 1) {\\n assembly {\\n return(0, 1)\\n }\\n } else {\\n return returndata;\\n }\\n }\\n\\n function _safeExecutionManagerInteraction(\\n bytes memory _calldata\\n )\\n private\\n returns (\\n bytes memory _returndata\\n )\\n {\\n return _safeExecutionManagerInteraction(\\n gasleft(),\\n _calldata\\n );\\n }\\n}\\n\",\"keccak256\":\"0x41e146e7912af794a17cd43c5a276674be956bfa8f3ca5b451bcb82d81e6f492\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/wrappers/Lib_SafeMathWrapper.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// Pulled from @openzeppelin/contracts/math/SafeMath.sol\\n// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_SafeExecutionManagerWrapper } from \\\"./Lib_SafeExecutionManagerWrapper.sol\\\";\\n\\n/**\\n * @title Lib_SafeMathWrapper\\n */\\n\\n/**\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\n * checks.\\n *\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\n * in bugs, because programmers usually assume that an overflow raises an\\n * error, which is the standard behavior in high level programming languages.\\n * `SafeMath` restores this intuition by reverting the transaction when an\\n * operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n */\\n\\nlibrary Lib_SafeMathWrapper {\\n /**\\n * @dev Returns the addition of two unsigned integers, reverting on\\n * overflow.\\n *\\n * Counterpart to Solidity's `+` operator.\\n *\\n * Requirements:\\n *\\n * - Addition cannot overflow.\\n */\\n function add(uint256 a, uint256 b) internal returns (uint256) {\\n uint256 c = a + b;\\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(c >= a, \\\"Lib_SafeMathWrapper: addition overflow\\\");\\n\\n return c;\\n }\\n\\n /**\\n * @dev Returns the subtraction of two unsigned integers, reverting on\\n * overflow (when the result is negative).\\n *\\n * Counterpart to Solidity's `-` operator.\\n *\\n * Requirements:\\n *\\n * - Subtraction cannot overflow.\\n */\\n function sub(uint256 a, uint256 b) internal returns (uint256) {\\n return sub(a, b, \\\"Lib_SafeMathWrapper: subtraction overflow\\\");\\n }\\n\\n /**\\n * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\n * overflow (when the result is negative).\\n *\\n * Counterpart to Solidity's `-` operator.\\n *\\n * Requirements:\\n *\\n * - Subtraction cannot overflow.\\n */\\n function sub(uint256 a, uint256 b, string memory errorMessage) internal returns (uint256) {\\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(b <= a, errorMessage);\\n uint256 c = a - b;\\n\\n return c;\\n }\\n\\n /**\\n * @dev Returns the multiplication of two unsigned integers, reverting on\\n * overflow.\\n *\\n * Counterpart to Solidity's `*` operator.\\n *\\n * Requirements:\\n *\\n * - Multiplication cannot overflow.\\n */\\n function mul(uint256 a, uint256 b) internal returns (uint256) {\\n // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\n // benefit is lost if 'b' is also tested.\\n // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\n if (a == 0) {\\n return 0;\\n }\\n\\n uint256 c = a * b;\\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(c / a == b, \\\"Lib_SafeMathWrapper: multiplication overflow\\\");\\n\\n return c;\\n }\\n\\n /**\\n * @dev Returns the integer division of two unsigned integers. Reverts on\\n * division by zero. The result is rounded towards zero.\\n *\\n * Counterpart to Solidity's `/` operator. Note: this function uses a\\n * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n * uses an invalid opcode to revert (consuming all remaining gas).\\n *\\n * Requirements:\\n *\\n * - The divisor cannot be zero.\\n */\\n function div(uint256 a, uint256 b) internal returns (uint256) {\\n return div(a, b, \\\"Lib_SafeMathWrapper: division by zero\\\");\\n }\\n\\n /**\\n * @dev Returns the integer division of two unsigned integers. Reverts with custom message on\\n * division by zero. The result is rounded towards zero.\\n *\\n * Counterpart to Solidity's `/` operator. Note: this function uses a\\n * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n * uses an invalid opcode to revert (consuming all remaining gas).\\n *\\n * Requirements:\\n *\\n * - The divisor cannot be zero.\\n */\\n function div(uint256 a, uint256 b, string memory errorMessage) internal returns (uint256) {\\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(b > 0, errorMessage);\\n uint256 c = a / b;\\n // assert(a == b * c + a % b); // There is no case in which this doesn't hold\\n\\n return c;\\n }\\n\\n /**\\n * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n * Reverts when dividing by zero.\\n *\\n * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n * opcode (which leaves remaining gas untouched) while Solidity uses an\\n * invalid opcode to revert (consuming all remaining gas).\\n *\\n * Requirements:\\n *\\n * - The divisor cannot be zero.\\n */\\n function mod(uint256 a, uint256 b) internal returns (uint256) {\\n return mod(a, b, \\\"Lib_SafeMathWrapper: modulo by zero\\\");\\n }\\n\\n /**\\n * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n * Reverts with custom message when dividing by zero.\\n *\\n * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n * opcode (which leaves remaining gas untouched) while Solidity uses an\\n * invalid opcode to revert (consuming all remaining gas).\\n *\\n * Requirements:\\n *\\n * - The divisor cannot be zero.\\n */\\n function mod(uint256 a, uint256 b, string memory errorMessage) internal returns (uint256) {\\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(b != 0, errorMessage);\\n return a % b;\\n }\\n}\",\"keccak256\":\"0xc58aa064894677f65fc8205f79252d15e59a0f5e2794e5c2d069c7b2bc97a9e2\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x60806040523480156200001157600080fd5b506040516200312a3803806200312a833981016040819052620000349162000067565b600080546001600160a01b0319166001600160a01b039590951694909417909355600191909155600255600355620000b2565b600080600080608085870312156200007d578384fd5b84516001600160a01b038116811462000094578485fd5b60208601516040870151606090970151919890975090945092505050565b61306880620000c26000396000f3fe608060405234801561001057600080fd5b50600436106101425760003560e01c8063876ed5cb116100b8578063cfdf677e1161007c578063cfdf677e1461023f578063d0f8934414610247578063e10d29ee1461024f578063e561dddc14610257578063f722b41a1461025f578063facdc5da1461026757610142565b8063876ed5cb146102175780638d38c6c11461021f578063b8f7700514610227578063c139eb151461022f578063c2cf696f1461023757610142565b80634de569ce1161010a5780634de569ce146101c25780635ae6256d146101e25780636fee07e0146101ea57806378f4b2f2146101ff5780637a167a8a146102075780637aa63a861461020f57610142565b8063138387a414610147578063299ca478146101655780632a7f18be1461017a578063378997701461019a578063461a4478146101af575b600080fd5b61014f61027a565b60405161015c91906124c7565b60405180910390f35b61016d610280565b60405161015c91906123eb565b61018d610188366004612388565b61028f565b60405161015c9190612e4e565b6101a26102b0565b60405161015c9190612e8d565b61016d6101bd36600461221b565b6102c4565b6101d56101d0366004612261565b6103a0565b60405161015c9190612484565b6101a26103da565b6101fd6101f8366004612188565b6103ee565b005b61014f61066d565b6101a2610674565b61014f610689565b61014f6106a4565b61014f6106aa565b6101a26106b0565b61014f6106c7565b61014f6106cd565b61016d6106d2565b6101fd6106f5565b61016d610b69565b61014f610b8c565b6101a2610c06565b6101fd610275366004612388565b610c1e565b60025481565b6000546001600160a01b031681565b610297611ed9565b6102a8826102a3610b69565b610c36565b90505b919050565b6000806102bb610d76565b50935050505090565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b8381101561032457818101518382015260200161030c565b50505050905090810190601f1680156103515780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561036e57600080fd5b505afa158015610382573d6000803e3d6000fd5b505050506040513d602081101561039857600080fd5b505192915050565b82516000901515600114156103c2576103bb85858585610e24565b90506103d2565b6103bb8585602001518585610fef565b949350505050565b6000806103e5610d76565b94505050505090565b61c3508151111561041a5760405162461bcd60e51b81526004016104119061259b565b60405180910390fd5b60035482111561043c5760405162461bcd60e51b8152600401610411906127a1565b620186a082101561045f5760405162461bcd60e51b815260040161041190612983565b6020820460005a90508181116104875760405162461bcd60e51b815260040161041190612b8a565b60005b825a8303101561049c5760010161048a565b6000338787876040516020016104b594939291906123ff565b60408051601f19818403018152919052805160209091012090504360281b421760006104df610b69565b60405163b298e36b60e01b81529091506001600160a01b0382169063b298e36b9061050e9086906004016124c7565b600060405180830381600087803b15801561052857600080fd5b505af115801561053c573d6000803e3d6000fd5b505060405163b298e36b60e01b81526001600160a01b038416925063b298e36b915061056c9085906004016124c7565b600060405180830381600087803b15801561058657600080fd5b505af115801561059a573d6000803e3d6000fd5b50505050600060016002836001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b1580156105dd57600080fd5b505afa1580156105f1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106159190612203565b8161061c57fe5b040390507f4b388aecf9fa6cc92253704e5975a6129a4f735bdbd99567df4ed0094ee4ceb5338b8b8b85426040516106599695949392919061243c565b60405180910390a150505050505050505050565b620186a081565b60008061067f610d76565b5090935050505090565b600080610694610d76565b50505064ffffffffff1692915050565b61c35081565b60035481565b60006106c26106bd610b69565b6110c4565b905090565b60015481565b602081565b60006106c2604051806060016040528060258152602001613003602591396102c4565b60043560d81c60093560e890811c90600c35901c610711610689565b8364ffffffffff16146107365760405162461bcd60e51b815260040161041190612a35565b6107646040518060400160405280600d81526020016c27ab26afa9b2b8bab2b731b2b960991b8152506102c4565b6001600160a01b0316336001600160a01b0316146107945760405162461bcd60e51b815260040161041190612a92565b60008162ffffff16116107b95760405162461bcd60e51b8152600401610411906127fe565b60008262ffffff16116107de5760405162461bcd60e51b815260040161041190612cdf565b600f601062ffffff8316020164ffffffffff81163610156108115760405162461bcd60e51b815260040161041190612d66565b600061081b610b69565b90506000610828826110c4565b9050600062ffffff8616368161083a57fe5b0460020267ffffffffffffffff8111801561085457600080fd5b506040519080825280601f01601f19166020018201604052801561087f576020820181803683370190505b50905060008662ffffff1667ffffffffffffffff811180156108a057600080fd5b506040519080825280602002602001820160405280156108ca578160200160208202803683370190505b50905060008060006108da610674565b90506108e4611ef9565b60005b8a62ffffff168163ffffffff161015610a3b57600061090b8263ffffffff16611147565b905063ffffffff82166109215761092181611197565b61092d8382868d611264565b80925060005b835163ffffffff821610156109b1578b3560e81c61c3508111156109695760405162461bcd60e51b81526004016104119061259b565b61097c858e64ffffffffff16838d6112cf565b898963ffffffff168151811061098e57fe5b60209081029190910101529b909b016003019a6001968701969586019501610933565b5060005b83602001518163ffffffff161015610a31578964ffffffffff168564ffffffffff16106109f45760405162461bcd60e51b815260040161041190612da8565b610a048564ffffffffff16611363565b888863ffffffff1681518110610a1657fe5b602090810291909101015260019687019694850194016109b5565b50506001016108e7565b50610a488183898b6113a8565b3664ffffffffff8a1614610a6e5760405162461bcd60e51b815260040161041190612846565b8a62ffffff168463ffffffff1614610a985760405162461bcd60e51b815260040161041190612894565b6000838c62ffffff160363ffffffff169050600080836020015160001415610acb57505060408201516060830151610af3565b6000610ae16001870364ffffffffff168d610c36565b90508060200151925080604001519150505b610b14610aff8961141b565b8f62ffffff168564ffffffffff16858561184f565b7f602f1aeac0ca2e7a13e281a9ef0ad7838542712ce16780fa2ecffd351f05f89983860384610b41610689565b604051610b5093929190612e9f565b60405180910390a1505050505050505050505050505050565b60006106c2604051806060016040528060238152602001612ee6602391396102c4565b6000610b966106d2565b6001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b158015610bce57600080fd5b505afa158015610be2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106c29190612203565b6000610c10610674565b610c186106b0565b03905090565b60405162461bcd60e51b81526004016104119061250b565b610c3e611ed9565b604051634a83e9cd60e11b815260028402906000906001600160a01b03851690639507d39a90610c72908590600401612e8d565b60206040518083038186803b158015610c8a57600080fd5b505afa158015610c9e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cc29190612203565b90506000846001600160a01b0316639507d39a846001016040518263ffffffff1660e01b8152600401610cf59190612e8d565b60206040518083038186803b158015610d0d57600080fd5b505afa158015610d21573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d459190612203565b6040805160608101825293845264ffffffffff828116602086015260289290921c9091169083015250949350505050565b6000806000806000610d866106d2565b6001600160a01b031663ccf8f9696040518163ffffffff1660e01b815260040160206040518083038186803b158015610dbe57600080fd5b505afa158015610dd2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610df691906121dd565b64ffffffffff602882901c811697605083901c82169750607883901c8216965060a09290921c169350915050565b600080610e5c6040518060400160405280601481526020017327ab26afa2bc32b1baba34b7b726b0b730b3b2b960611b8152506102c4565b90506000816001600160a01b0316631c4712a76040518163ffffffff1660e01b815260040160206040518083038186803b158015610e9957600080fd5b505afa158015610ead573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ed19190612203565b90506000610ede87611a02565b9050610eeb818787611a9b565b610f075760405162461bcd60e51b8152600401610411906126ca565b86606001518860200151148015610f22575060408701518851145b8015610f635750610f4a604051806060016040528060228152602001612f09602291396102c4565b6001600160a01b031688608001516001600160a01b0316145b8015610f725750818860a00151145b8015610f89575060608801516001600160a01b0316155b8015610fa45750600088604001516001811115610fa257fe5b145b8015610fc557508660800151805190602001208860c0015180519060200120145b610fe15760405162461bcd60e51b81526004016104119061276a565b506001979650505050505050565b600080610ffb85611363565b9050611008818585611a9b565b6110245760405162461bcd60e51b815260040161041190612c2a565b6000866060015187608001518860a001518960c0015160405160200161104d94939291906123ff565b60405160208183030381529060405280519060200120905060006110708761028f565b80519091508214801561108e57508751602082015164ffffffffff16145b80156110a857508760200151816040015164ffffffffff16145b610fe15760405162461bcd60e51b815260040161041190612adf565b60006002826001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b15801561110157600080fd5b505afa158015611115573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111399190612203565b8161114057fe5b0492915050565b61114f611ef9565b5060408051608081018252601092909202600f81013560e890811c84526012820135901c6020840152601581013560d890811c92840192909252601a0135901c606082015290565b60006111a1610689565b1115611211576000806111b2610d76565b9350935050508064ffffffffff16836060015110156111e35760405162461bcd60e51b815260040161041190612718565b8164ffffffffff168360400151101561120e5760405162461bcd60e51b8152600401610411906125f8565b50505b4260015482604001510110156112395760405162461bcd60e51b815260040161041190612d20565b4360025482606001510110156112615760405162461bcd60e51b815260040161041190612552565b50565b83604001518360400151101561128c5760405162461bcd60e51b815260040161041190612bd5565b8360600151836060015110156112b45760405162461bcd60e51b815260040161041190612df1565b6020830151156112c9576112c9838383611b8c565b50505050565b60008151836041011115611326578260410167ffffffffffffffff811180156112f757600080fd5b506040519080825280601f01601f191660200182016040528015611322576020820181803683370190505b5091505b6040850151606086015160006020850160018153836001820152826021820152866003890160418301376041870190209350505050949350505050565b60006102a86040518060a00160405280600015158152602001848152602001600081526020016000815260200160405180602001604052806000815250815250611c2d565b600083830364ffffffffff161180156113c357506020840151155b156113d3576113d3848483611b8c565b42846040015111156113f75760405162461bcd60e51b815260040161041190612b45565b43846060015111156112c95760405162461bcd60e51b815260040161041190612904565b60008082511161145c5760405162461bcd60e51b81526004018080602001828103825260348152602001806130286034913960400191505060405180910390fd5b815160011415611482578160008151811061147357fe5b602002602001015190506102ab565b60408051610200810182527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56381527f633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d60208201527f890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d818301527f3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd86060808301919091527fecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da60808301527fdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da560a08301527f617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d760c08301527f292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead60e08301527fe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e106101008301527f7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f826101208301527fe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e836365166101408301527f3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c6101608301527fad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e6101808301527fa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab6101a08301527f4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c8626101c08301527f2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf106101e083015282518381529081018352909160009190602082018180368337505085519192506000918291508180805b600184111561182b5750506002820460018084161460005b828110156117a7578a816002028151811061174e57fe5b602002602001015196508a816002026001018151811061176a57fe5b6020026020010151955086602089015285604089015287805190602001208b828151811061179457fe5b6020908102919091010152600101611737565b50801561180a578960018503815181106117bd57fe5b602002602001015195508783601081106117d357fe5b602002015160001b945085602088015284604088015286805190602001208a83815181106117fd57fe5b6020026020010181815250505b80611816576000611819565b60015b60ff168201935060019092019161171f565b8960008151811061183857fe5b602002602001015198505050505050505050919050565b60006118596106d2565b9050600080611866610d76565b50509150915060006040518060a00160405280856001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b1580156118b257600080fd5b505afa1580156118c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118ea9190612203565b81526020018a81526020018981526020018464ffffffffff16815260200160405180602001604052806000815250815250905080600001517f127186556e7be68c7e31263195225b4de02820707889540969f62c05cf73525e826020015183604001518460600151856080015160405161196794939291906124e6565b60405180910390a2600061197a82611c75565b90506000611992836040015186018a86018a8a611c9e565b60405163080549db60e21b81529091506001600160a01b03871690632015276c906119c390859085906004016124d0565b600060405180830381600087803b1580156119dd57600080fd5b505af11580156119f1573d6000803e3d6000fd5b505050505050505050505050505050565b6080810151805160009190826041820167ffffffffffffffff81118015611a2857600080fd5b506040519080825280601f01601f191660200182016040528015611a53576020820181803683370190505b5060408601516060870151919250906000602084016001815383600182015282602182015285604182018760208a0160045afa50604190950190942095505050505050919050565b6000611aa56106d2565b8351604051634a83e9cd60e11b81526001600160a01b039290921691639507d39a91611ad391600401612e7c565b60206040518083038186803b158015611aeb57600080fd5b505afa158015611aff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b239190612203565b611b2c84611c75565b14611b495760405162461bcd60e51b815260040161041190612b16565b611b66836020015185846000015185602001518760400151611cbd565b611b825760405162461bcd60e51b81526004016104119061294c565b5060019392505050565b6000611b9f8364ffffffffff1683610c36565b9050600154816020015164ffffffffff16014210611bcf5760405162461bcd60e51b815260040161041190612647565b806020015164ffffffffff1684604001511115611bfe5760405162461bcd60e51b8152600401610411906129cc565b806040015164ffffffffff16846060015111156112c95760405162461bcd60e51b815260040161041190612c74565b8051602080830151604080850151606086015160808701519251600096611c5896909594910161248f565b604051602081830303815290604052805190602001209050919050565b60008160200151826040015183606001518460800151604051602001611c5894939291906124e6565b602892831b9390931760509190911b1760789290921b91909117901b90565b6000808211611cfd5760405162461bcd60e51b8152600401808060200182810382526037815260200180612f7f6037913960400191505060405180910390fd5b818410611d3b5760405162461bcd60e51b8152600401808060200182810382526024815260200180612f2b6024913960400191505060405180910390fd5b611d4482611e42565b835114611d825760405162461bcd60e51b815260040180806020018281038252604d815260200180612fb6604d913960600191505060405180910390fd5b8460005b8451811015611e35578560011660011415611de457848181518110611da757fe5b6020026020010151826040516020018083815260200182815260200192505050604051602081830303815290604052805190602001209150611e29565b81858281518110611df157fe5b602002602001015160405160200180838152602001828152602001925050506040516020818303038152906040528051906020012091505b600195861c9501611d86565b5090951495945050505050565b6000808211611e825760405162461bcd60e51b8152600401808060200182810382526030815260200180612f4f6030913960400191505060405180910390fd5b8160011415611e93575060006102ab565b81600060805b60018110611ec3576000196001821b01811b831615611ebb5791821c91908101905b60011c611e99565b506001811b8414611ed2576001015b9392505050565b604080516060810182526000808252602082018190529181019190915290565b6040518060800160405280600081526020016000815260200160008152602001600081525090565b600067ffffffffffffffff831115611f3557fe5b611f48601f8401601f1916602001612ec1565b9050828152838383011115611f5c57600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b03811681146102ab57600080fd5b600082601f830112611f9a578081fd5b611ed283833560208501611f21565b8035600281106102ab57600080fd5b600060a08284031215611fc9578081fd5b60405160a0810167ffffffffffffffff8282108183111715611fe757fe5b8160405282935084358352602085013560208401526040850135604084015260608501356060840152608085013591508082111561202457600080fd5b5061203185828601611f8a565b6080830152505092915050565b60006040828403121561204f578081fd5b6040516040810167ffffffffffffffff828210818311171561206d57fe5b816040528293508435835260209150818501358181111561208d57600080fd5b8501601f8101871361209e57600080fd5b8035828111156120aa57fe5b83810292506120ba848401612ec1565b8181528481019083860185850187018b10156120d557600080fd5b600095505b838610156120f85780358352600195909501949186019186016120da565b5080868801525050505050505092915050565b600060a0828403121561211c578081fd5b60405160a0810167ffffffffffffffff828210818311171561213a57fe5b8160405282935084359150811515821461215357600080fd5b818352602085013560208401526040850135604084015260608501356060840152608085013591508082111561202457600080fd5b60008060006060848603121561219c578283fd5b6121a584611f73565b925060208401359150604084013567ffffffffffffffff8111156121c7578182fd5b6121d386828701611f8a565b9150509250925092565b6000602082840312156121ee578081fd5b815164ffffffffff1981168114611ed2578182fd5b600060208284031215612214578081fd5b5051919050565b60006020828403121561222c578081fd5b813567ffffffffffffffff811115612242578182fd5b8201601f81018413612252578182fd5b6103d284823560208401611f21565b60008060008060808587031215612276578081fd5b843567ffffffffffffffff8082111561228d578283fd5b9086019060e082890312156122a0578283fd5b6122aa60e0612ec1565b82358152602083013560208201526122c460408401611fa9565b60408201526122d560608401611f73565b60608201526122e660808401611f73565b608082015260a083013560a082015260c083013582811115612306578485fd5b6123128a828601611f8a565b60c0830152509550602087013591508082111561232d578283fd5b6123398883890161210b565b9450604087013591508082111561234e578283fd5b61235a88838901611fb8565b9350606087013591508082111561236f578283fd5b5061237c8782880161203e565b91505092959194509250565b600060208284031215612399578081fd5b5035919050565b60008151808452815b818110156123c5576020818501810151868301820152016123a9565b818111156123d65782602083870101525b50601f01601f19169290920160200192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612432908301846123a0565b9695505050505050565b6001600160a01b038781168252861660208201526040810185905260c06060820181905260009061246f908301866123a0565b60808301949094525060a00152949350505050565b901515815260200190565b6000861515825285602083015284604083015283606083015260a060808301526124bc60a08301846123a0565b979650505050505050565b90815260200190565b91825264ffffffffff1916602082015260400190565b60008582528460208301528360408301526080606083015261243260808301846123a0565b60208082526027908201527f617070656e64517565756542617463682069732063757272656e746c7920646960408201526639b0b13632b21760c91b606082015260800190565b60208082526029908201527f436f6e7465787420626c6f636b206e756d62657220746f6f2066617220696e206040820152683a3432903830b9ba1760b91b606082015260800190565b6020808252603d908201527f5472616e73616374696f6e20646174612073697a652065786365656473206d6160408201527f78696d756d20666f7220726f6c6c7570207472616e73616374696f6e2e000000606082015260800190565b6020808252602f908201527f436f6e746578742074696d657374616d70206973206c6f776572207468616e2060408201526e3630b9ba1039bab136b4ba3a32b21760891b606082015260800190565b6020808252605b908201527f50726576696f75736c7920656e7175657565642062617463686573206861766560408201527f206578706972656420616e64206d75737420626520617070656e64656420626560608201527f666f72652061206e65772073657175656e6365722062617463682e0000000000608082015260a00190565b6020808252602e908201527f496e76616c69642053657175656e636572207472616e73616374696f6e20696e60408201526d31b63ab9b4b7b710383937b7b31760911b606082015260800190565b60208082526032908201527f436f6e7465787420626c6f636b206e756d626572206973206c6f77657220746860408201527130b7103630b9ba1039bab136b4ba3a32b21760711b606082015260800190565b6020808252601e908201527f496e76616c69642053657175656e636572207472616e73616374696f6e2e0000604082015260600190565b6020808252603d908201527f5472616e73616374696f6e20676173206c696d69742065786365656473206d6160408201527f78696d756d20666f7220726f6c6c7570207472616e73616374696f6e2e000000606082015260800190565b60208082526028908201527f4d7573742070726f76696465206174206c65617374206f6e652062617463682060408201526731b7b73a32bc3a1760c11b606082015260800190565b6020808252602e908201527f4e6f7420616c6c2073657175656e636572207472616e73616374696f6e73207760408201526d32b93290383937b1b2b9b9b2b21760911b606082015260800190565b6020808252604a908201527f41637475616c207472616e73616374696f6e20696e64657820646f6573206e6f60408201527f74206d6174636820657870656374656420746f74616c20656c656d656e7473206060820152693a379030b83832b7321760b11b608082015260a00190565b60208082526028908201527f436f6e7465787420626c6f636b206e756d6265722069732066726f6d2074686560408201526710333aba3ab9329760c11b606082015260800190565b60208082526018908201527f496e76616c696420696e636c7573696f6e2070726f6f662e0000000000000000604082015260600190565b60208082526029908201527f5472616e73616374696f6e20676173206c696d697420746f6f206c6f7720746f6040820152681032b738bab2bab29760b91b606082015260800190565b60208082526043908201527f53657175656e636572207472616e73616374696f6e2074696d657374616d702060408201527f657863656564732074686174206f66206e65787420717565756520656c656d65606082015262373a1760e91b608082015260a00190565b6020808252603d908201527f41637475616c20626174636820737461727420696e64657820646f6573206e6f60408201527f74206d6174636820657870656374656420737461727420696e6465782e000000606082015260800190565b6020808252602d908201527f46756e6374696f6e2063616e206f6e6c792062652063616c6c6564206279207460408201526c34329029b2b8bab2b731b2b91760991b606082015260800190565b6020808252601a908201527f496e76616c6964205175657565207472616e73616374696f6e2e000000000000604082015260600190565b60208082526015908201527424b73b30b634b2103130ba31b4103432b0b232b91760591b604082015260600190565b60208082526025908201527f436f6e746578742074696d657374616d702069732066726f6d207468652066756040820152643a3ab9329760d91b606082015260800190565b6020808252602b908201527f496e73756666696369656e742067617320666f72204c322072617465206c696d60408201526a34ba34b73390313ab9371760a91b606082015260800190565b60208082526035908201527f436f6e746578742074696d657374616d702076616c756573206d757374206d6f6040820152743737ba37b734b1b0b6363c9034b731b932b0b9b29760591b606082015260800190565b6020808252602a908201527f496e76616c6964205175657565207472616e73616374696f6e20696e636c757360408201526934b7b710383937b7b31760b11b606082015260800190565b60208082526045908201527f53657175656e636572207472616e73616374696f6e20626c6f636b4e756d626560408201527f7220657863656564732074686174206f66206e65787420717565756520656c6560608201526436b2b73a1760d91b608082015260a00190565b60208082526021908201527f4d75737420617070656e64206174206c65617374206f6e6520656c656d656e746040820152601760f91b606082015260800190565b60208082526026908201527f436f6e746578742074696d657374616d7020746f6f2066617220696e20746865604082015265103830b9ba1760d11b606082015260800190565b60208082526022908201527f4e6f7420656e6f756768204261746368436f6e74657874732070726f76696465604082015261321760f11b606082015260800190565b60208082526029908201527f4e6f7420656e6f75676820717565756564207472616e73616374696f6e732074604082015268379030b83832b7321760b91b606082015260800190565b60208082526037908201527f436f6e7465787420626c6f636b4e756d6265722076616c756573206d7573742060408201527f6d6f6e6f746f6e6963616c6c7920696e6372656173652e000000000000000000606082015260800190565b8151815260208083015164ffffffffff90811691830191909152604092830151169181019190915260600190565b63ffffffff91909116815260200190565b64ffffffffff91909116815260200190565b64ffffffffff9384168152919092166020820152604081019190915260600190565b60405181810167ffffffffffffffff81118282101715612edd57fe5b60405291905056fe4f564d5f436861696e53746f72616765436f6e7461696e65723a4354433a71756575654f564d5f4465636f6d7072657373696f6e507265636f6d70696c65416464726573734c69625f4d65726b6c65547265653a20496e646578206f7574206f6620626f756e64732e4c69625f4d65726b6c65547265653a2043616e6e6f7420636f6d70757465206365696c286c6f675f3229206f6620302e4c69625f4d65726b6c65547265653a20546f74616c206c6561766573206d7573742062652067726561746572207468616e207a65726f2e4c69625f4d65726b6c65547265653a20546f74616c207369626c696e677320646f6573206e6f7420636f72726563746c7920636f72726573706f6e6420746f20746f74616c206c65617665732e4f564d5f436861696e53746f72616765436f6e7461696e65723a4354433a626174636865734c69625f4d65726b6c65547265653a204d7573742070726f76696465206174206c65617374206f6e65206c65616620686173682ea164736f6c6343000706000a", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101425760003560e01c8063876ed5cb116100b8578063cfdf677e1161007c578063cfdf677e1461023f578063d0f8934414610247578063e10d29ee1461024f578063e561dddc14610257578063f722b41a1461025f578063facdc5da1461026757610142565b8063876ed5cb146102175780638d38c6c11461021f578063b8f7700514610227578063c139eb151461022f578063c2cf696f1461023757610142565b80634de569ce1161010a5780634de569ce146101c25780635ae6256d146101e25780636fee07e0146101ea57806378f4b2f2146101ff5780637a167a8a146102075780637aa63a861461020f57610142565b8063138387a414610147578063299ca478146101655780632a7f18be1461017a578063378997701461019a578063461a4478146101af575b600080fd5b61014f61027a565b60405161015c91906124c7565b60405180910390f35b61016d610280565b60405161015c91906123eb565b61018d610188366004612388565b61028f565b60405161015c9190612e4e565b6101a26102b0565b60405161015c9190612e8d565b61016d6101bd36600461221b565b6102c4565b6101d56101d0366004612261565b6103a0565b60405161015c9190612484565b6101a26103da565b6101fd6101f8366004612188565b6103ee565b005b61014f61066d565b6101a2610674565b61014f610689565b61014f6106a4565b61014f6106aa565b6101a26106b0565b61014f6106c7565b61014f6106cd565b61016d6106d2565b6101fd6106f5565b61016d610b69565b61014f610b8c565b6101a2610c06565b6101fd610275366004612388565b610c1e565b60025481565b6000546001600160a01b031681565b610297611ed9565b6102a8826102a3610b69565b610c36565b90505b919050565b6000806102bb610d76565b50935050505090565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b8381101561032457818101518382015260200161030c565b50505050905090810190601f1680156103515780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561036e57600080fd5b505afa158015610382573d6000803e3d6000fd5b505050506040513d602081101561039857600080fd5b505192915050565b82516000901515600114156103c2576103bb85858585610e24565b90506103d2565b6103bb8585602001518585610fef565b949350505050565b6000806103e5610d76565b94505050505090565b61c3508151111561041a5760405162461bcd60e51b81526004016104119061259b565b60405180910390fd5b60035482111561043c5760405162461bcd60e51b8152600401610411906127a1565b620186a082101561045f5760405162461bcd60e51b815260040161041190612983565b6020820460005a90508181116104875760405162461bcd60e51b815260040161041190612b8a565b60005b825a8303101561049c5760010161048a565b6000338787876040516020016104b594939291906123ff565b60408051601f19818403018152919052805160209091012090504360281b421760006104df610b69565b60405163b298e36b60e01b81529091506001600160a01b0382169063b298e36b9061050e9086906004016124c7565b600060405180830381600087803b15801561052857600080fd5b505af115801561053c573d6000803e3d6000fd5b505060405163b298e36b60e01b81526001600160a01b038416925063b298e36b915061056c9085906004016124c7565b600060405180830381600087803b15801561058657600080fd5b505af115801561059a573d6000803e3d6000fd5b50505050600060016002836001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b1580156105dd57600080fd5b505afa1580156105f1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106159190612203565b8161061c57fe5b040390507f4b388aecf9fa6cc92253704e5975a6129a4f735bdbd99567df4ed0094ee4ceb5338b8b8b85426040516106599695949392919061243c565b60405180910390a150505050505050505050565b620186a081565b60008061067f610d76565b5090935050505090565b600080610694610d76565b50505064ffffffffff1692915050565b61c35081565b60035481565b60006106c26106bd610b69565b6110c4565b905090565b60015481565b602081565b60006106c2604051806060016040528060258152602001613003602591396102c4565b60043560d81c60093560e890811c90600c35901c610711610689565b8364ffffffffff16146107365760405162461bcd60e51b815260040161041190612a35565b6107646040518060400160405280600d81526020016c27ab26afa9b2b8bab2b731b2b960991b8152506102c4565b6001600160a01b0316336001600160a01b0316146107945760405162461bcd60e51b815260040161041190612a92565b60008162ffffff16116107b95760405162461bcd60e51b8152600401610411906127fe565b60008262ffffff16116107de5760405162461bcd60e51b815260040161041190612cdf565b600f601062ffffff8316020164ffffffffff81163610156108115760405162461bcd60e51b815260040161041190612d66565b600061081b610b69565b90506000610828826110c4565b9050600062ffffff8616368161083a57fe5b0460020267ffffffffffffffff8111801561085457600080fd5b506040519080825280601f01601f19166020018201604052801561087f576020820181803683370190505b50905060008662ffffff1667ffffffffffffffff811180156108a057600080fd5b506040519080825280602002602001820160405280156108ca578160200160208202803683370190505b50905060008060006108da610674565b90506108e4611ef9565b60005b8a62ffffff168163ffffffff161015610a3b57600061090b8263ffffffff16611147565b905063ffffffff82166109215761092181611197565b61092d8382868d611264565b80925060005b835163ffffffff821610156109b1578b3560e81c61c3508111156109695760405162461bcd60e51b81526004016104119061259b565b61097c858e64ffffffffff16838d6112cf565b898963ffffffff168151811061098e57fe5b60209081029190910101529b909b016003019a6001968701969586019501610933565b5060005b83602001518163ffffffff161015610a31578964ffffffffff168564ffffffffff16106109f45760405162461bcd60e51b815260040161041190612da8565b610a048564ffffffffff16611363565b888863ffffffff1681518110610a1657fe5b602090810291909101015260019687019694850194016109b5565b50506001016108e7565b50610a488183898b6113a8565b3664ffffffffff8a1614610a6e5760405162461bcd60e51b815260040161041190612846565b8a62ffffff168463ffffffff1614610a985760405162461bcd60e51b815260040161041190612894565b6000838c62ffffff160363ffffffff169050600080836020015160001415610acb57505060408201516060830151610af3565b6000610ae16001870364ffffffffff168d610c36565b90508060200151925080604001519150505b610b14610aff8961141b565b8f62ffffff168564ffffffffff16858561184f565b7f602f1aeac0ca2e7a13e281a9ef0ad7838542712ce16780fa2ecffd351f05f89983860384610b41610689565b604051610b5093929190612e9f565b60405180910390a1505050505050505050505050505050565b60006106c2604051806060016040528060238152602001612ee6602391396102c4565b6000610b966106d2565b6001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b158015610bce57600080fd5b505afa158015610be2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106c29190612203565b6000610c10610674565b610c186106b0565b03905090565b60405162461bcd60e51b81526004016104119061250b565b610c3e611ed9565b604051634a83e9cd60e11b815260028402906000906001600160a01b03851690639507d39a90610c72908590600401612e8d565b60206040518083038186803b158015610c8a57600080fd5b505afa158015610c9e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cc29190612203565b90506000846001600160a01b0316639507d39a846001016040518263ffffffff1660e01b8152600401610cf59190612e8d565b60206040518083038186803b158015610d0d57600080fd5b505afa158015610d21573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d459190612203565b6040805160608101825293845264ffffffffff828116602086015260289290921c9091169083015250949350505050565b6000806000806000610d866106d2565b6001600160a01b031663ccf8f9696040518163ffffffff1660e01b815260040160206040518083038186803b158015610dbe57600080fd5b505afa158015610dd2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610df691906121dd565b64ffffffffff602882901c811697605083901c82169750607883901c8216965060a09290921c169350915050565b600080610e5c6040518060400160405280601481526020017327ab26afa2bc32b1baba34b7b726b0b730b3b2b960611b8152506102c4565b90506000816001600160a01b0316631c4712a76040518163ffffffff1660e01b815260040160206040518083038186803b158015610e9957600080fd5b505afa158015610ead573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ed19190612203565b90506000610ede87611a02565b9050610eeb818787611a9b565b610f075760405162461bcd60e51b8152600401610411906126ca565b86606001518860200151148015610f22575060408701518851145b8015610f635750610f4a604051806060016040528060228152602001612f09602291396102c4565b6001600160a01b031688608001516001600160a01b0316145b8015610f725750818860a00151145b8015610f89575060608801516001600160a01b0316155b8015610fa45750600088604001516001811115610fa257fe5b145b8015610fc557508660800151805190602001208860c0015180519060200120145b610fe15760405162461bcd60e51b81526004016104119061276a565b506001979650505050505050565b600080610ffb85611363565b9050611008818585611a9b565b6110245760405162461bcd60e51b815260040161041190612c2a565b6000866060015187608001518860a001518960c0015160405160200161104d94939291906123ff565b60405160208183030381529060405280519060200120905060006110708761028f565b80519091508214801561108e57508751602082015164ffffffffff16145b80156110a857508760200151816040015164ffffffffff16145b610fe15760405162461bcd60e51b815260040161041190612adf565b60006002826001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b15801561110157600080fd5b505afa158015611115573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111399190612203565b8161114057fe5b0492915050565b61114f611ef9565b5060408051608081018252601092909202600f81013560e890811c84526012820135901c6020840152601581013560d890811c92840192909252601a0135901c606082015290565b60006111a1610689565b1115611211576000806111b2610d76565b9350935050508064ffffffffff16836060015110156111e35760405162461bcd60e51b815260040161041190612718565b8164ffffffffff168360400151101561120e5760405162461bcd60e51b8152600401610411906125f8565b50505b4260015482604001510110156112395760405162461bcd60e51b815260040161041190612d20565b4360025482606001510110156112615760405162461bcd60e51b815260040161041190612552565b50565b83604001518360400151101561128c5760405162461bcd60e51b815260040161041190612bd5565b8360600151836060015110156112b45760405162461bcd60e51b815260040161041190612df1565b6020830151156112c9576112c9838383611b8c565b50505050565b60008151836041011115611326578260410167ffffffffffffffff811180156112f757600080fd5b506040519080825280601f01601f191660200182016040528015611322576020820181803683370190505b5091505b6040850151606086015160006020850160018153836001820152826021820152866003890160418301376041870190209350505050949350505050565b60006102a86040518060a00160405280600015158152602001848152602001600081526020016000815260200160405180602001604052806000815250815250611c2d565b600083830364ffffffffff161180156113c357506020840151155b156113d3576113d3848483611b8c565b42846040015111156113f75760405162461bcd60e51b815260040161041190612b45565b43846060015111156112c95760405162461bcd60e51b815260040161041190612904565b60008082511161145c5760405162461bcd60e51b81526004018080602001828103825260348152602001806130286034913960400191505060405180910390fd5b815160011415611482578160008151811061147357fe5b602002602001015190506102ab565b60408051610200810182527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56381527f633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d60208201527f890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d818301527f3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd86060808301919091527fecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da60808301527fdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da560a08301527f617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d760c08301527f292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead60e08301527fe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e106101008301527f7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f826101208301527fe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e836365166101408301527f3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c6101608301527fad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e6101808301527fa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab6101a08301527f4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c8626101c08301527f2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf106101e083015282518381529081018352909160009190602082018180368337505085519192506000918291508180805b600184111561182b5750506002820460018084161460005b828110156117a7578a816002028151811061174e57fe5b602002602001015196508a816002026001018151811061176a57fe5b6020026020010151955086602089015285604089015287805190602001208b828151811061179457fe5b6020908102919091010152600101611737565b50801561180a578960018503815181106117bd57fe5b602002602001015195508783601081106117d357fe5b602002015160001b945085602088015284604088015286805190602001208a83815181106117fd57fe5b6020026020010181815250505b80611816576000611819565b60015b60ff168201935060019092019161171f565b8960008151811061183857fe5b602002602001015198505050505050505050919050565b60006118596106d2565b9050600080611866610d76565b50509150915060006040518060a00160405280856001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b1580156118b257600080fd5b505afa1580156118c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118ea9190612203565b81526020018a81526020018981526020018464ffffffffff16815260200160405180602001604052806000815250815250905080600001517f127186556e7be68c7e31263195225b4de02820707889540969f62c05cf73525e826020015183604001518460600151856080015160405161196794939291906124e6565b60405180910390a2600061197a82611c75565b90506000611992836040015186018a86018a8a611c9e565b60405163080549db60e21b81529091506001600160a01b03871690632015276c906119c390859085906004016124d0565b600060405180830381600087803b1580156119dd57600080fd5b505af11580156119f1573d6000803e3d6000fd5b505050505050505050505050505050565b6080810151805160009190826041820167ffffffffffffffff81118015611a2857600080fd5b506040519080825280601f01601f191660200182016040528015611a53576020820181803683370190505b5060408601516060870151919250906000602084016001815383600182015282602182015285604182018760208a0160045afa50604190950190942095505050505050919050565b6000611aa56106d2565b8351604051634a83e9cd60e11b81526001600160a01b039290921691639507d39a91611ad391600401612e7c565b60206040518083038186803b158015611aeb57600080fd5b505afa158015611aff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b239190612203565b611b2c84611c75565b14611b495760405162461bcd60e51b815260040161041190612b16565b611b66836020015185846000015185602001518760400151611cbd565b611b825760405162461bcd60e51b81526004016104119061294c565b5060019392505050565b6000611b9f8364ffffffffff1683610c36565b9050600154816020015164ffffffffff16014210611bcf5760405162461bcd60e51b815260040161041190612647565b806020015164ffffffffff1684604001511115611bfe5760405162461bcd60e51b8152600401610411906129cc565b806040015164ffffffffff16846060015111156112c95760405162461bcd60e51b815260040161041190612c74565b8051602080830151604080850151606086015160808701519251600096611c5896909594910161248f565b604051602081830303815290604052805190602001209050919050565b60008160200151826040015183606001518460800151604051602001611c5894939291906124e6565b602892831b9390931760509190911b1760789290921b91909117901b90565b6000808211611cfd5760405162461bcd60e51b8152600401808060200182810382526037815260200180612f7f6037913960400191505060405180910390fd5b818410611d3b5760405162461bcd60e51b8152600401808060200182810382526024815260200180612f2b6024913960400191505060405180910390fd5b611d4482611e42565b835114611d825760405162461bcd60e51b815260040180806020018281038252604d815260200180612fb6604d913960600191505060405180910390fd5b8460005b8451811015611e35578560011660011415611de457848181518110611da757fe5b6020026020010151826040516020018083815260200182815260200192505050604051602081830303815290604052805190602001209150611e29565b81858281518110611df157fe5b602002602001015160405160200180838152602001828152602001925050506040516020818303038152906040528051906020012091505b600195861c9501611d86565b5090951495945050505050565b6000808211611e825760405162461bcd60e51b8152600401808060200182810382526030815260200180612f4f6030913960400191505060405180910390fd5b8160011415611e93575060006102ab565b81600060805b60018110611ec3576000196001821b01811b831615611ebb5791821c91908101905b60011c611e99565b506001811b8414611ed2576001015b9392505050565b604080516060810182526000808252602082018190529181019190915290565b6040518060800160405280600081526020016000815260200160008152602001600081525090565b600067ffffffffffffffff831115611f3557fe5b611f48601f8401601f1916602001612ec1565b9050828152838383011115611f5c57600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b03811681146102ab57600080fd5b600082601f830112611f9a578081fd5b611ed283833560208501611f21565b8035600281106102ab57600080fd5b600060a08284031215611fc9578081fd5b60405160a0810167ffffffffffffffff8282108183111715611fe757fe5b8160405282935084358352602085013560208401526040850135604084015260608501356060840152608085013591508082111561202457600080fd5b5061203185828601611f8a565b6080830152505092915050565b60006040828403121561204f578081fd5b6040516040810167ffffffffffffffff828210818311171561206d57fe5b816040528293508435835260209150818501358181111561208d57600080fd5b8501601f8101871361209e57600080fd5b8035828111156120aa57fe5b83810292506120ba848401612ec1565b8181528481019083860185850187018b10156120d557600080fd5b600095505b838610156120f85780358352600195909501949186019186016120da565b5080868801525050505050505092915050565b600060a0828403121561211c578081fd5b60405160a0810167ffffffffffffffff828210818311171561213a57fe5b8160405282935084359150811515821461215357600080fd5b818352602085013560208401526040850135604084015260608501356060840152608085013591508082111561202457600080fd5b60008060006060848603121561219c578283fd5b6121a584611f73565b925060208401359150604084013567ffffffffffffffff8111156121c7578182fd5b6121d386828701611f8a565b9150509250925092565b6000602082840312156121ee578081fd5b815164ffffffffff1981168114611ed2578182fd5b600060208284031215612214578081fd5b5051919050565b60006020828403121561222c578081fd5b813567ffffffffffffffff811115612242578182fd5b8201601f81018413612252578182fd5b6103d284823560208401611f21565b60008060008060808587031215612276578081fd5b843567ffffffffffffffff8082111561228d578283fd5b9086019060e082890312156122a0578283fd5b6122aa60e0612ec1565b82358152602083013560208201526122c460408401611fa9565b60408201526122d560608401611f73565b60608201526122e660808401611f73565b608082015260a083013560a082015260c083013582811115612306578485fd5b6123128a828601611f8a565b60c0830152509550602087013591508082111561232d578283fd5b6123398883890161210b565b9450604087013591508082111561234e578283fd5b61235a88838901611fb8565b9350606087013591508082111561236f578283fd5b5061237c8782880161203e565b91505092959194509250565b600060208284031215612399578081fd5b5035919050565b60008151808452815b818110156123c5576020818501810151868301820152016123a9565b818111156123d65782602083870101525b50601f01601f19169290920160200192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612432908301846123a0565b9695505050505050565b6001600160a01b038781168252861660208201526040810185905260c06060820181905260009061246f908301866123a0565b60808301949094525060a00152949350505050565b901515815260200190565b6000861515825285602083015284604083015283606083015260a060808301526124bc60a08301846123a0565b979650505050505050565b90815260200190565b91825264ffffffffff1916602082015260400190565b60008582528460208301528360408301526080606083015261243260808301846123a0565b60208082526027908201527f617070656e64517565756542617463682069732063757272656e746c7920646960408201526639b0b13632b21760c91b606082015260800190565b60208082526029908201527f436f6e7465787420626c6f636b206e756d62657220746f6f2066617220696e206040820152683a3432903830b9ba1760b91b606082015260800190565b6020808252603d908201527f5472616e73616374696f6e20646174612073697a652065786365656473206d6160408201527f78696d756d20666f7220726f6c6c7570207472616e73616374696f6e2e000000606082015260800190565b6020808252602f908201527f436f6e746578742074696d657374616d70206973206c6f776572207468616e2060408201526e3630b9ba1039bab136b4ba3a32b21760891b606082015260800190565b6020808252605b908201527f50726576696f75736c7920656e7175657565642062617463686573206861766560408201527f206578706972656420616e64206d75737420626520617070656e64656420626560608201527f666f72652061206e65772073657175656e6365722062617463682e0000000000608082015260a00190565b6020808252602e908201527f496e76616c69642053657175656e636572207472616e73616374696f6e20696e60408201526d31b63ab9b4b7b710383937b7b31760911b606082015260800190565b60208082526032908201527f436f6e7465787420626c6f636b206e756d626572206973206c6f77657220746860408201527130b7103630b9ba1039bab136b4ba3a32b21760711b606082015260800190565b6020808252601e908201527f496e76616c69642053657175656e636572207472616e73616374696f6e2e0000604082015260600190565b6020808252603d908201527f5472616e73616374696f6e20676173206c696d69742065786365656473206d6160408201527f78696d756d20666f7220726f6c6c7570207472616e73616374696f6e2e000000606082015260800190565b60208082526028908201527f4d7573742070726f76696465206174206c65617374206f6e652062617463682060408201526731b7b73a32bc3a1760c11b606082015260800190565b6020808252602e908201527f4e6f7420616c6c2073657175656e636572207472616e73616374696f6e73207760408201526d32b93290383937b1b2b9b9b2b21760911b606082015260800190565b6020808252604a908201527f41637475616c207472616e73616374696f6e20696e64657820646f6573206e6f60408201527f74206d6174636820657870656374656420746f74616c20656c656d656e7473206060820152693a379030b83832b7321760b11b608082015260a00190565b60208082526028908201527f436f6e7465787420626c6f636b206e756d6265722069732066726f6d2074686560408201526710333aba3ab9329760c11b606082015260800190565b60208082526018908201527f496e76616c696420696e636c7573696f6e2070726f6f662e0000000000000000604082015260600190565b60208082526029908201527f5472616e73616374696f6e20676173206c696d697420746f6f206c6f7720746f6040820152681032b738bab2bab29760b91b606082015260800190565b60208082526043908201527f53657175656e636572207472616e73616374696f6e2074696d657374616d702060408201527f657863656564732074686174206f66206e65787420717565756520656c656d65606082015262373a1760e91b608082015260a00190565b6020808252603d908201527f41637475616c20626174636820737461727420696e64657820646f6573206e6f60408201527f74206d6174636820657870656374656420737461727420696e6465782e000000606082015260800190565b6020808252602d908201527f46756e6374696f6e2063616e206f6e6c792062652063616c6c6564206279207460408201526c34329029b2b8bab2b731b2b91760991b606082015260800190565b6020808252601a908201527f496e76616c6964205175657565207472616e73616374696f6e2e000000000000604082015260600190565b60208082526015908201527424b73b30b634b2103130ba31b4103432b0b232b91760591b604082015260600190565b60208082526025908201527f436f6e746578742074696d657374616d702069732066726f6d207468652066756040820152643a3ab9329760d91b606082015260800190565b6020808252602b908201527f496e73756666696369656e742067617320666f72204c322072617465206c696d60408201526a34ba34b73390313ab9371760a91b606082015260800190565b60208082526035908201527f436f6e746578742074696d657374616d702076616c756573206d757374206d6f6040820152743737ba37b734b1b0b6363c9034b731b932b0b9b29760591b606082015260800190565b6020808252602a908201527f496e76616c6964205175657565207472616e73616374696f6e20696e636c757360408201526934b7b710383937b7b31760b11b606082015260800190565b60208082526045908201527f53657175656e636572207472616e73616374696f6e20626c6f636b4e756d626560408201527f7220657863656564732074686174206f66206e65787420717565756520656c6560608201526436b2b73a1760d91b608082015260a00190565b60208082526021908201527f4d75737420617070656e64206174206c65617374206f6e6520656c656d656e746040820152601760f91b606082015260800190565b60208082526026908201527f436f6e746578742074696d657374616d7020746f6f2066617220696e20746865604082015265103830b9ba1760d11b606082015260800190565b60208082526022908201527f4e6f7420656e6f756768204261746368436f6e74657874732070726f76696465604082015261321760f11b606082015260800190565b60208082526029908201527f4e6f7420656e6f75676820717565756564207472616e73616374696f6e732074604082015268379030b83832b7321760b91b606082015260800190565b60208082526037908201527f436f6e7465787420626c6f636b4e756d6265722076616c756573206d7573742060408201527f6d6f6e6f746f6e6963616c6c7920696e6372656173652e000000000000000000606082015260800190565b8151815260208083015164ffffffffff90811691830191909152604092830151169181019190915260600190565b63ffffffff91909116815260200190565b64ffffffffff91909116815260200190565b64ffffffffff9384168152919092166020820152604081019190915260600190565b60405181810167ffffffffffffffff81118282101715612edd57fe5b60405291905056fe4f564d5f436861696e53746f72616765436f6e7461696e65723a4354433a71756575654f564d5f4465636f6d7072657373696f6e507265636f6d70696c65416464726573734c69625f4d65726b6c65547265653a20496e646578206f7574206f6620626f756e64732e4c69625f4d65726b6c65547265653a2043616e6e6f7420636f6d70757465206365696c286c6f675f3229206f6620302e4c69625f4d65726b6c65547265653a20546f74616c206c6561766573206d7573742062652067726561746572207468616e207a65726f2e4c69625f4d65726b6c65547265653a20546f74616c207369626c696e677320646f6573206e6f7420636f72726563746c7920636f72726573706f6e6420746f20746f74616c206c65617665732e4f564d5f436861696e53746f72616765436f6e7461696e65723a4354433a626174636865734c69625f4d65726b6c65547265653a204d7573742070726f76696465206174206c65617374206f6e65206c65616620686173682ea164736f6c6343000706000a", + "solcInputHash": "f2bdab652d5102f5f11e78dae866798d", + "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_forceInclusionPeriodSeconds\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_forceInclusionPeriodBlocks\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_maxTransactionGasLimit\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_startingQueueIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_numQueueElements\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_totalElements\",\"type\":\"uint256\"}],\"name\":\"QueueBatchAppended\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_startingQueueIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_numQueueElements\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_totalElements\",\"type\":\"uint256\"}],\"name\":\"SequencerBatchAppended\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_batchIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"_batchRoot\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_batchSize\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_prevTotalElements\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"_extraData\",\"type\":\"bytes\"}],\"name\":\"TransactionBatchAppended\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_l1TxOrigin\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_queueIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_timestamp\",\"type\":\"uint256\"}],\"name\":\"TransactionEnqueued\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"L2_GAS_DISCOUNT_DIVISOR\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAX_ROLLUP_TX_SIZE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MIN_ROLLUP_TX_GAS\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"appendQueueBatch\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"appendSequencerBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"batches\",\"outputs\":[{\"internalType\":\"contract iOVM_ChainStorageContainer\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"enqueue\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"forceInclusionPeriodBlocks\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"forceInclusionPeriodSeconds\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLastBlockNumber\",\"outputs\":[{\"internalType\":\"uint40\",\"name\":\"\",\"type\":\"uint40\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLastTimestamp\",\"outputs\":[{\"internalType\":\"uint40\",\"name\":\"\",\"type\":\"uint40\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getNextQueueIndex\",\"outputs\":[{\"internalType\":\"uint40\",\"name\":\"\",\"type\":\"uint40\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getNumPendingQueueElements\",\"outputs\":[{\"internalType\":\"uint40\",\"name\":\"\",\"type\":\"uint40\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"getQueueElement\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"transactionHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint40\",\"name\":\"timestamp\",\"type\":\"uint40\"},{\"internalType\":\"uint40\",\"name\":\"blockNumber\",\"type\":\"uint40\"}],\"internalType\":\"struct Lib_OVMCodec.QueueElement\",\"name\":\"_element\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getQueueLength\",\"outputs\":[{\"internalType\":\"uint40\",\"name\":\"\",\"type\":\"uint40\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTotalBatches\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_totalBatches\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTotalElements\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_totalElements\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maxTransactionGasLimit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"queue\",\"outputs\":[{\"internalType\":\"contract iOVM_ChainStorageContainer\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"enum Lib_OVMCodec.QueueOrigin\",\"name\":\"l1QueueOrigin\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"l1TxOrigin\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"entrypoint\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.Transaction\",\"name\":\"_transaction\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isSequenced\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"queueIndex\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"txData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.TransactionChainElement\",\"name\":\"_txChainElement\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"_batchHeader\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"siblings\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct Lib_OVMCodec.ChainInclusionProof\",\"name\":\"_inclusionProof\",\"type\":\"tuple\"}],\"name\":\"verifyTransaction\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The Canonical Transaction Chain (CTC) contract is an append-only log of transactions which must be applied to the rollup state. It defines the ordering of rollup transactions by writing them to the 'CTC:batches' instance of the Chain Storage Container. The CTC also allows any account to 'enqueue' an L2 transaction, which will require that the Sequencer will eventually append it to the rollup state. If the Sequencer does not include an enqueued transaction within the 'force inclusion period', then any account may force it to be included by calling appendQueueBatch(). Compiler used: solc Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"appendSequencerBatch()\":{\"details\":\"This function uses a custom encoding scheme for efficiency reasons. .param _shouldStartAtElement Specific batch we expect to start appending to. .param _totalElementsToAppend Total number of batch elements we expect to append. .param _contexts Array of batch contexts. .param _transactionDataFields Array of raw transaction data.\"},\"batches()\":{\"returns\":{\"_0\":\"Reference to the batch storage container.\"}},\"enqueue(address,uint256,bytes)\":{\"params\":{\"_data\":\"Transaction data.\",\"_gasLimit\":\"Gas limit for the enqueued L2 transaction.\",\"_target\":\"Target L2 contract to send the transaction to.\"}},\"getLastBlockNumber()\":{\"returns\":{\"_0\":\"Blocknumber for the last transaction.\"}},\"getLastTimestamp()\":{\"returns\":{\"_0\":\"Timestamp for the last transaction.\"}},\"getNextQueueIndex()\":{\"returns\":{\"_0\":\"Index for the next queue element.\"}},\"getNumPendingQueueElements()\":{\"returns\":{\"_0\":\"Number of pending queue elements.\"}},\"getQueueElement(uint256)\":{\"params\":{\"_index\":\"Index of the queue element to access.\"},\"returns\":{\"_element\":\"Queue element at the given index.\"}},\"getQueueLength()\":{\"returns\":{\"_0\":\"Length of the queue.\"}},\"getTotalBatches()\":{\"returns\":{\"_totalBatches\":\"Total submitted batches.\"}},\"getTotalElements()\":{\"returns\":{\"_totalElements\":\"Total submitted elements.\"}},\"queue()\":{\"returns\":{\"_0\":\"Reference to the queue storage container.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}},\"verifyTransaction((uint256,uint256,uint8,address,address,uint256,bytes),(bool,uint256,uint256,uint256,bytes),(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))\":{\"params\":{\"_batchHeader\":\"Header of the batch the transaction was included in.\",\"_inclusionProof\":\"Inclusion proof for the provided transaction chain element.\",\"_transaction\":\"Transaction to verify.\",\"_txChainElement\":\"Transaction chain element corresponding to the transaction.\"},\"returns\":{\"_0\":\"True if the transaction exists in the CTC, false if not.\"}}},\"title\":\"OVM_CanonicalTransactionChain\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"appendQueueBatch(uint256)\":{\"notice\":\"Appends a given number of queued transactions as a single batch. param _numQueuedTransactions Number of transactions to append.\"},\"appendSequencerBatch()\":{\"notice\":\"Allows the sequencer to append a batch of transactions.\"},\"batches()\":{\"notice\":\"Accesses the batch storage container.\"},\"enqueue(address,uint256,bytes)\":{\"notice\":\"Adds a transaction to the queue.\"},\"getLastBlockNumber()\":{\"notice\":\"Returns the blocknumber of the last transaction.\"},\"getLastTimestamp()\":{\"notice\":\"Returns the timestamp of the last transaction.\"},\"getNextQueueIndex()\":{\"notice\":\"Returns the index of the next element to be enqueued.\"},\"getNumPendingQueueElements()\":{\"notice\":\"Get the number of queue elements which have not yet been included.\"},\"getQueueElement(uint256)\":{\"notice\":\"Gets the queue element at a particular index.\"},\"getQueueLength()\":{\"notice\":\"Retrieves the length of the queue, including both pending and canonical transactions.\"},\"getTotalBatches()\":{\"notice\":\"Retrieves the total number of batches submitted.\"},\"getTotalElements()\":{\"notice\":\"Retrieves the total number of elements submitted.\"},\"queue()\":{\"notice\":\"Accesses the queue storage container.\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"},\"verifyTransaction((uint256,uint256,uint8,address,address,uint256,bytes),(bool,uint256,uint256,uint256,bytes),(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))\":{\"notice\":\"Verifies whether a transaction is included in the chain.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/OVM/chain/OVM_CanonicalTransactionChain.sol\":\"OVM_CanonicalTransactionChain\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor () internal {\\n address msgSender = _msgSender();\\n _owner = msgSender;\\n emit OwnershipTransferred(address(0), msgSender);\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n emit OwnershipTransferred(_owner, address(0));\\n _owner = address(0);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n emit OwnershipTransferred(_owner, newOwner);\\n _owner = newOwner;\\n }\\n}\\n\",\"keccak256\":\"0x15e2d5bd4c28a88548074c54d220e8086f638a71ed07e6b3ba5a70066fcf458d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a >= b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two numbers.\\n */\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two numbers. The result is rounded towards\\n * zero.\\n */\\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b) / 2 can overflow, so we distribute\\n return (a / 2) + (b / 2) + ((a % 2 + b % 2) / 2);\\n }\\n}\\n\",\"keccak256\":\"0x363bd3b45201f07c9b71c2edc96533468cf14a3d029fabd82fddceb1eb3ebd9c\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with GSN meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address payable) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes memory) {\\n this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x8d3cb350f04ff49cfb10aef08d87f19dcbaecc8027b0bed12f3275cd12f38cf0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/chain/OVM_CanonicalTransactionChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// @unsupported: ovm\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\nimport { Lib_MerkleTree } from \\\"../../libraries/utils/Lib_MerkleTree.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_CanonicalTransactionChain } from \\\"../../iOVM/chain/iOVM_CanonicalTransactionChain.sol\\\";\\nimport { iOVM_ChainStorageContainer } from \\\"../../iOVM/chain/iOVM_ChainStorageContainer.sol\\\";\\n\\n/* Contract Imports */\\nimport { OVM_ExecutionManager } from \\\"../execution/OVM_ExecutionManager.sol\\\";\\n\\n/* External Imports */\\nimport { Math } from \\\"@openzeppelin/contracts/math/Math.sol\\\";\\n\\n/**\\n * @title OVM_CanonicalTransactionChain\\n * @dev The Canonical Transaction Chain (CTC) contract is an append-only log of transactions\\n * which must be applied to the rollup state. It defines the ordering of rollup transactions by\\n * writing them to the 'CTC:batches' instance of the Chain Storage Container.\\n * The CTC also allows any account to 'enqueue' an L2 transaction, which will require that the Sequencer\\n * will eventually append it to the rollup state.\\n * If the Sequencer does not include an enqueued transaction within the 'force inclusion period',\\n * then any account may force it to be included by calling appendQueueBatch().\\n *\\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract OVM_CanonicalTransactionChain is iOVM_CanonicalTransactionChain, Lib_AddressResolver {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n // L2 tx gas-related\\n uint256 constant public MIN_ROLLUP_TX_GAS = 100000;\\n uint256 constant public MAX_ROLLUP_TX_SIZE = 50000;\\n uint256 constant public L2_GAS_DISCOUNT_DIVISOR = 32;\\n\\n // Encoding-related (all in bytes)\\n uint256 constant internal BATCH_CONTEXT_SIZE = 16;\\n uint256 constant internal BATCH_CONTEXT_LENGTH_POS = 12;\\n uint256 constant internal BATCH_CONTEXT_START_POS = 15;\\n uint256 constant internal TX_DATA_HEADER_SIZE = 3;\\n uint256 constant internal BYTES_TILL_TX_DATA = 65;\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n uint256 public forceInclusionPeriodSeconds;\\n uint256 public forceInclusionPeriodBlocks;\\n uint256 public maxTransactionGasLimit;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n constructor(\\n address _libAddressManager,\\n uint256 _forceInclusionPeriodSeconds,\\n uint256 _forceInclusionPeriodBlocks,\\n uint256 _maxTransactionGasLimit\\n )\\n Lib_AddressResolver(_libAddressManager)\\n {\\n forceInclusionPeriodSeconds = _forceInclusionPeriodSeconds;\\n forceInclusionPeriodBlocks = _forceInclusionPeriodBlocks;\\n maxTransactionGasLimit = _maxTransactionGasLimit;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Accesses the batch storage container.\\n * @return Reference to the batch storage container.\\n */\\n function batches()\\n override\\n public\\n view\\n returns (\\n iOVM_ChainStorageContainer\\n )\\n {\\n return iOVM_ChainStorageContainer(\\n resolve(\\\"OVM_ChainStorageContainer:CTC:batches\\\")\\n );\\n }\\n\\n /**\\n * Accesses the queue storage container.\\n * @return Reference to the queue storage container.\\n */\\n function queue()\\n override\\n public\\n view\\n returns (\\n iOVM_ChainStorageContainer\\n )\\n {\\n return iOVM_ChainStorageContainer(\\n resolve(\\\"OVM_ChainStorageContainer:CTC:queue\\\")\\n );\\n }\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements()\\n override\\n public\\n view\\n returns (\\n uint256 _totalElements\\n )\\n {\\n (uint40 totalElements,,,) = _getBatchExtraData();\\n return uint256(totalElements);\\n }\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches()\\n override\\n public\\n view\\n returns (\\n uint256 _totalBatches\\n )\\n {\\n return batches().length();\\n }\\n\\n /**\\n * Returns the index of the next element to be enqueued.\\n * @return Index for the next queue element.\\n */\\n function getNextQueueIndex()\\n override\\n public\\n view\\n returns (\\n uint40\\n )\\n {\\n (,uint40 nextQueueIndex,,) = _getBatchExtraData();\\n return nextQueueIndex;\\n }\\n\\n /**\\n * Returns the timestamp of the last transaction.\\n * @return Timestamp for the last transaction.\\n */\\n function getLastTimestamp()\\n override\\n public\\n view\\n returns (\\n uint40\\n )\\n {\\n (,,uint40 lastTimestamp,) = _getBatchExtraData();\\n return lastTimestamp;\\n }\\n\\n /**\\n * Returns the blocknumber of the last transaction.\\n * @return Blocknumber for the last transaction.\\n */\\n function getLastBlockNumber()\\n override\\n public\\n view\\n returns (\\n uint40\\n )\\n {\\n (,,,uint40 lastBlockNumber) = _getBatchExtraData();\\n return lastBlockNumber;\\n }\\n\\n /**\\n * Gets the queue element at a particular index.\\n * @param _index Index of the queue element to access.\\n * @return _element Queue element at the given index.\\n */\\n function getQueueElement(\\n uint256 _index\\n )\\n override\\n public\\n view\\n returns (\\n Lib_OVMCodec.QueueElement memory _element\\n )\\n {\\n return _getQueueElement(\\n _index,\\n queue()\\n );\\n }\\n\\n /**\\n * Get the number of queue elements which have not yet been included.\\n * @return Number of pending queue elements.\\n */\\n function getNumPendingQueueElements()\\n override\\n public\\n view\\n returns (\\n uint40\\n )\\n {\\n return getQueueLength() - getNextQueueIndex();\\n }\\n\\n /**\\n * Retrieves the length of the queue, including\\n * both pending and canonical transactions.\\n * @return Length of the queue.\\n */\\n function getQueueLength()\\n override\\n public\\n view\\n returns (\\n uint40\\n )\\n {\\n return _getQueueLength(\\n queue()\\n );\\n }\\n\\n /**\\n * Adds a transaction to the queue.\\n * @param _target Target L2 contract to send the transaction to.\\n * @param _gasLimit Gas limit for the enqueued L2 transaction.\\n * @param _data Transaction data.\\n */\\n function enqueue(\\n address _target,\\n uint256 _gasLimit,\\n bytes memory _data\\n )\\n override\\n public\\n {\\n require(\\n _data.length <= MAX_ROLLUP_TX_SIZE,\\n \\\"Transaction data size exceeds maximum for rollup transaction.\\\"\\n );\\n\\n require(\\n _gasLimit <= maxTransactionGasLimit,\\n \\\"Transaction gas limit exceeds maximum for rollup transaction.\\\"\\n );\\n\\n require(\\n _gasLimit >= MIN_ROLLUP_TX_GAS,\\n \\\"Transaction gas limit too low to enqueue.\\\"\\n );\\n\\n // We need to consume some amount of L1 gas in order to rate limit transactions going into\\n // L2. However, L2 is cheaper than L1 so we only need to burn some small proportion of the\\n // provided L1 gas.\\n uint256 gasToConsume = _gasLimit/L2_GAS_DISCOUNT_DIVISOR;\\n uint256 startingGas = gasleft();\\n\\n // Although this check is not necessary (burn below will run out of gas if not true), it\\n // gives the user an explicit reason as to why the enqueue attempt failed.\\n require(\\n startingGas > gasToConsume,\\n \\\"Insufficient gas for L2 rate limiting burn.\\\"\\n );\\n\\n // Here we do some \\\"dumb\\\" work in order to burn gas, although we should probably replace\\n // this with something like minting gas token later on.\\n uint256 i;\\n while(startingGas - gasleft() < gasToConsume) {\\n i++;\\n }\\n\\n bytes32 transactionHash = keccak256(\\n abi.encode(\\n msg.sender,\\n _target,\\n _gasLimit,\\n _data\\n )\\n );\\n\\n bytes32 timestampAndBlockNumber;\\n assembly {\\n timestampAndBlockNumber := timestamp()\\n timestampAndBlockNumber := or(timestampAndBlockNumber, shl(40, number()))\\n }\\n\\n iOVM_ChainStorageContainer queueRef = queue();\\n\\n queueRef.push(transactionHash);\\n queueRef.push(timestampAndBlockNumber);\\n\\n // The underlying queue data structure stores 2 elements\\n // per insertion, so to get the real queue length we need\\n // to divide by 2 and subtract 1.\\n uint256 queueIndex = queueRef.length() / 2 - 1;\\n emit TransactionEnqueued(\\n msg.sender,\\n _target,\\n _gasLimit,\\n _data,\\n queueIndex,\\n block.timestamp\\n );\\n }\\n\\n /**\\n * Appends a given number of queued transactions as a single batch.\\n * param _numQueuedTransactions Number of transactions to append.\\n */\\n function appendQueueBatch(\\n uint256 // _numQueuedTransactions\\n )\\n override\\n public\\n pure\\n {\\n // TEMPORARY: Disable `appendQueueBatch` for minnet\\n revert(\\\"appendQueueBatch is currently disabled.\\\");\\n\\n // _numQueuedTransactions = Math.min(_numQueuedTransactions, getNumPendingQueueElements());\\n // require(\\n // _numQueuedTransactions > 0,\\n // \\\"Must append more than zero transactions.\\\"\\n // );\\n\\n // bytes32[] memory leaves = new bytes32[](_numQueuedTransactions);\\n // uint40 nextQueueIndex = getNextQueueIndex();\\n\\n // for (uint256 i = 0; i < _numQueuedTransactions; i++) {\\n // if (msg.sender != resolve(\\\"OVM_Sequencer\\\")) {\\n // Lib_OVMCodec.QueueElement memory el = getQueueElement(nextQueueIndex);\\n // require(\\n // el.timestamp + forceInclusionPeriodSeconds < block.timestamp,\\n // \\\"Queue transactions cannot be submitted during the sequencer inclusion period.\\\"\\n // );\\n // }\\n // leaves[i] = _getQueueLeafHash(nextQueueIndex);\\n // nextQueueIndex++;\\n // }\\n\\n // Lib_OVMCodec.QueueElement memory lastElement = getQueueElement(nextQueueIndex - 1);\\n\\n // _appendBatch(\\n // Lib_MerkleTree.getMerkleRoot(leaves),\\n // _numQueuedTransactions,\\n // _numQueuedTransactions,\\n // lastElement.timestamp,\\n // lastElement.blockNumber\\n // );\\n\\n // emit QueueBatchAppended(\\n // nextQueueIndex - _numQueuedTransactions,\\n // _numQueuedTransactions,\\n // getTotalElements()\\n // );\\n }\\n\\n /**\\n * Allows the sequencer to append a batch of transactions.\\n * @dev This function uses a custom encoding scheme for efficiency reasons.\\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\\n * .param _contexts Array of batch contexts.\\n * .param _transactionDataFields Array of raw transaction data.\\n */\\n function appendSequencerBatch()\\n override\\n public\\n {\\n uint40 shouldStartAtElement;\\n uint24 totalElementsToAppend;\\n uint24 numContexts;\\n assembly {\\n shouldStartAtElement := shr(216, calldataload(4))\\n totalElementsToAppend := shr(232, calldataload(9))\\n numContexts := shr(232, calldataload(12))\\n }\\n\\n require(\\n shouldStartAtElement == getTotalElements(),\\n \\\"Actual batch start index does not match expected start index.\\\"\\n );\\n\\n require(\\n msg.sender == resolve(\\\"OVM_Sequencer\\\"),\\n \\\"Function can only be called by the Sequencer.\\\"\\n );\\n\\n require(\\n numContexts > 0,\\n \\\"Must provide at least one batch context.\\\"\\n );\\n\\n require(\\n totalElementsToAppend > 0,\\n \\\"Must append at least one element.\\\"\\n );\\n\\n uint40 nextTransactionPtr = uint40(BATCH_CONTEXT_START_POS + BATCH_CONTEXT_SIZE * numContexts);\\n\\n require(\\n msg.data.length >= nextTransactionPtr,\\n \\\"Not enough BatchContexts provided.\\\"\\n );\\n\\n // Take a reference to the queue and its length so we don't have to keep resolving it.\\n // Length isn't going to change during the course of execution, so it's fine to simply\\n // resolve this once at the start. Saves gas.\\n iOVM_ChainStorageContainer queueRef = queue();\\n uint40 queueLength = _getQueueLength(queueRef);\\n\\n // Reserve some memory to save gas on hashing later on. This is a relatively safe estimate\\n // for the average transaction size that will prevent having to resize this chunk of memory\\n // later on. Saves gas.\\n bytes memory hashMemory = new bytes((msg.data.length / totalElementsToAppend) * 2);\\n\\n // Initialize the array of canonical chain leaves that we will append.\\n bytes32[] memory leaves = new bytes32[](totalElementsToAppend);\\n\\n // Each leaf index corresponds to a tx, either sequenced or enqueued.\\n uint32 leafIndex = 0;\\n\\n // Counter for number of sequencer transactions appended so far.\\n uint32 numSequencerTransactions = 0;\\n\\n // We will sequentially append leaves which are pointers to the queue.\\n // The initial queue index is what is currently in storage.\\n uint40 nextQueueIndex = getNextQueueIndex();\\n\\n BatchContext memory curContext;\\n for (uint32 i = 0; i < numContexts; i++) {\\n BatchContext memory nextContext = _getBatchContext(i);\\n\\n if (i == 0) {\\n // Execute a special check for the first batch.\\n _validateFirstBatchContext(nextContext);\\n }\\n\\n // Execute this check on every single batch, including the first one.\\n _validateNextBatchContext(\\n curContext,\\n nextContext,\\n nextQueueIndex,\\n queueRef\\n );\\n\\n // Now we can update our current context.\\n curContext = nextContext;\\n\\n // Process sequencer transactions first.\\n for (uint32 j = 0; j < curContext.numSequencedTransactions; j++) {\\n uint256 txDataLength;\\n assembly {\\n txDataLength := shr(232, calldataload(nextTransactionPtr))\\n }\\n require(\\n txDataLength <= MAX_ROLLUP_TX_SIZE,\\n \\\"Transaction data size exceeds maximum for rollup transaction.\\\"\\n );\\n\\n leaves[leafIndex] = _getSequencerLeafHash(\\n curContext,\\n nextTransactionPtr,\\n txDataLength,\\n hashMemory\\n );\\n\\n nextTransactionPtr += uint40(TX_DATA_HEADER_SIZE + txDataLength);\\n numSequencerTransactions++;\\n leafIndex++;\\n }\\n\\n // Now process any subsequent queue transactions.\\n for (uint32 j = 0; j < curContext.numSubsequentQueueTransactions; j++) {\\n require(\\n nextQueueIndex < queueLength,\\n \\\"Not enough queued transactions to append.\\\"\\n );\\n\\n leaves[leafIndex] = _getQueueLeafHash(nextQueueIndex);\\n nextQueueIndex++;\\n leafIndex++;\\n }\\n }\\n\\n _validateFinalBatchContext(\\n curContext,\\n nextQueueIndex,\\n queueLength,\\n queueRef\\n );\\n\\n require(\\n msg.data.length == nextTransactionPtr,\\n \\\"Not all sequencer transactions were processed.\\\"\\n );\\n\\n require(\\n leafIndex == totalElementsToAppend,\\n \\\"Actual transaction index does not match expected total elements to append.\\\"\\n );\\n\\n // Generate the required metadata that we need to append this batch\\n uint40 numQueuedTransactions = totalElementsToAppend - numSequencerTransactions;\\n uint40 blockTimestamp;\\n uint40 blockNumber;\\n if (curContext.numSubsequentQueueTransactions == 0) {\\n // The last element is a sequencer tx, therefore pull timestamp and block number from the last context.\\n blockTimestamp = uint40(curContext.timestamp);\\n blockNumber = uint40(curContext.blockNumber);\\n } else {\\n // The last element is a queue tx, therefore pull timestamp and block number from the queue element.\\n // curContext.numSubsequentQueueTransactions > 0 which means that we've processed at least one queue element.\\n // We increment nextQueueIndex after processing each queue element,\\n // so the index of the last element we processed is nextQueueIndex - 1.\\n Lib_OVMCodec.QueueElement memory lastElement = _getQueueElement(\\n nextQueueIndex - 1,\\n queueRef\\n );\\n\\n blockTimestamp = lastElement.timestamp;\\n blockNumber = lastElement.blockNumber;\\n }\\n\\n // For efficiency reasons getMerkleRoot modifies the `leaves` argument in place\\n // while calculating the root hash therefore any arguments passed to it must not\\n // be used again afterwards\\n _appendBatch(\\n Lib_MerkleTree.getMerkleRoot(leaves),\\n totalElementsToAppend,\\n numQueuedTransactions,\\n blockTimestamp,\\n blockNumber\\n );\\n\\n emit SequencerBatchAppended(\\n nextQueueIndex - numQueuedTransactions,\\n numQueuedTransactions,\\n getTotalElements()\\n );\\n }\\n\\n /**\\n * Verifies whether a transaction is included in the chain.\\n * @param _transaction Transaction to verify.\\n * @param _txChainElement Transaction chain element corresponding to the transaction.\\n * @param _batchHeader Header of the batch the transaction was included in.\\n * @param _inclusionProof Inclusion proof for the provided transaction chain element.\\n * @return True if the transaction exists in the CTC, false if not.\\n */\\n function verifyTransaction(\\n Lib_OVMCodec.Transaction memory _transaction,\\n Lib_OVMCodec.TransactionChainElement memory _txChainElement,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _inclusionProof\\n )\\n override\\n public\\n view\\n returns (\\n bool\\n )\\n {\\n if (_txChainElement.isSequenced == true) {\\n return _verifySequencerTransaction(\\n _transaction,\\n _txChainElement,\\n _batchHeader,\\n _inclusionProof\\n );\\n } else {\\n return _verifyQueueTransaction(\\n _transaction,\\n _txChainElement.queueIndex,\\n _batchHeader,\\n _inclusionProof\\n );\\n }\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Returns the BatchContext located at a particular index.\\n * @param _index The index of the BatchContext\\n * @return The BatchContext at the specified index.\\n */\\n function _getBatchContext(\\n uint256 _index\\n )\\n internal\\n pure\\n returns (\\n BatchContext memory\\n )\\n {\\n uint256 contextPtr = 15 + _index * BATCH_CONTEXT_SIZE;\\n uint256 numSequencedTransactions;\\n uint256 numSubsequentQueueTransactions;\\n uint256 ctxTimestamp;\\n uint256 ctxBlockNumber;\\n\\n assembly {\\n numSequencedTransactions := shr(232, calldataload(contextPtr))\\n numSubsequentQueueTransactions := shr(232, calldataload(add(contextPtr, 3)))\\n ctxTimestamp := shr(216, calldataload(add(contextPtr, 6)))\\n ctxBlockNumber := shr(216, calldataload(add(contextPtr, 11)))\\n }\\n\\n return BatchContext({\\n numSequencedTransactions: numSequencedTransactions,\\n numSubsequentQueueTransactions: numSubsequentQueueTransactions,\\n timestamp: ctxTimestamp,\\n blockNumber: ctxBlockNumber\\n });\\n }\\n\\n /**\\n * Parses the batch context from the extra data.\\n * @return Total number of elements submitted.\\n * @return Index of the next queue element.\\n */\\n function _getBatchExtraData()\\n internal\\n view\\n returns (\\n uint40,\\n uint40,\\n uint40,\\n uint40\\n )\\n {\\n bytes27 extraData = batches().getGlobalMetadata();\\n\\n uint40 totalElements;\\n uint40 nextQueueIndex;\\n uint40 lastTimestamp;\\n uint40 lastBlockNumber;\\n assembly {\\n extraData := shr(40, extraData)\\n totalElements := and(extraData, 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF)\\n nextQueueIndex := shr(40, and(extraData, 0x00000000000000000000000000000000000000000000FFFFFFFFFF0000000000))\\n lastTimestamp := shr(80, and(extraData, 0x0000000000000000000000000000000000FFFFFFFFFF00000000000000000000))\\n lastBlockNumber := shr(120, and(extraData, 0x000000000000000000000000FFFFFFFFFF000000000000000000000000000000))\\n }\\n\\n return (\\n totalElements,\\n nextQueueIndex,\\n lastTimestamp,\\n lastBlockNumber\\n );\\n }\\n\\n /**\\n * Encodes the batch context for the extra data.\\n * @param _totalElements Total number of elements submitted.\\n * @param _nextQueueIndex Index of the next queue element.\\n * @param _timestamp Timestamp for the last batch.\\n * @param _blockNumber Block number of the last batch.\\n * @return Encoded batch context.\\n */\\n function _makeBatchExtraData(\\n uint40 _totalElements,\\n uint40 _nextQueueIndex,\\n uint40 _timestamp,\\n uint40 _blockNumber\\n )\\n internal\\n pure\\n returns (\\n bytes27\\n )\\n {\\n bytes27 extraData;\\n assembly {\\n extraData := _totalElements\\n extraData := or(extraData, shl(40, _nextQueueIndex))\\n extraData := or(extraData, shl(80, _timestamp))\\n extraData := or(extraData, shl(120, _blockNumber))\\n extraData := shl(40, extraData)\\n }\\n\\n return extraData;\\n }\\n\\n /**\\n * Retrieves the hash of a queue element.\\n * @param _index Index of the queue element to retrieve a hash for.\\n * @return Hash of the queue element.\\n */\\n function _getQueueLeafHash(\\n uint256 _index\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return _hashTransactionChainElement(\\n Lib_OVMCodec.TransactionChainElement({\\n isSequenced: false,\\n queueIndex: _index,\\n timestamp: 0,\\n blockNumber: 0,\\n txData: hex\\\"\\\"\\n })\\n );\\n }\\n\\n /**\\n * Gets the queue element at a particular index.\\n * @param _index Index of the queue element to access.\\n * @return _element Queue element at the given index.\\n */\\n function _getQueueElement(\\n uint256 _index,\\n iOVM_ChainStorageContainer _queueRef\\n )\\n internal\\n view\\n returns (\\n Lib_OVMCodec.QueueElement memory _element\\n )\\n {\\n // The underlying queue data structure stores 2 elements\\n // per insertion, so to get the actual desired queue index\\n // we need to multiply by 2.\\n uint40 trueIndex = uint40(_index * 2);\\n bytes32 transactionHash = _queueRef.get(trueIndex);\\n bytes32 timestampAndBlockNumber = _queueRef.get(trueIndex + 1);\\n\\n uint40 elementTimestamp;\\n uint40 elementBlockNumber;\\n assembly {\\n elementTimestamp := and(timestampAndBlockNumber, 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF)\\n elementBlockNumber := shr(40, and(timestampAndBlockNumber, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000))\\n }\\n\\n return Lib_OVMCodec.QueueElement({\\n transactionHash: transactionHash,\\n timestamp: elementTimestamp,\\n blockNumber: elementBlockNumber\\n });\\n }\\n\\n /**\\n * Retrieves the length of the queue.\\n * @return Length of the queue.\\n */\\n function _getQueueLength(\\n iOVM_ChainStorageContainer _queueRef\\n )\\n internal\\n view\\n returns (\\n uint40\\n )\\n {\\n // The underlying queue data structure stores 2 elements\\n // per insertion, so to get the real queue length we need\\n // to divide by 2.\\n return uint40(_queueRef.length() / 2);\\n }\\n\\n /**\\n * Retrieves the hash of a sequencer element.\\n * @param _context Batch context for the given element.\\n * @param _nextTransactionPtr Pointer to the next transaction in the calldata.\\n * @param _txDataLength Length of the transaction item.\\n * @return Hash of the sequencer element.\\n */\\n function _getSequencerLeafHash(\\n BatchContext memory _context,\\n uint256 _nextTransactionPtr,\\n uint256 _txDataLength,\\n bytes memory _hashMemory\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n // Only allocate more memory if we didn't reserve enough to begin with.\\n if (BYTES_TILL_TX_DATA + _txDataLength > _hashMemory.length) {\\n _hashMemory = new bytes(BYTES_TILL_TX_DATA + _txDataLength);\\n }\\n\\n uint256 ctxTimestamp = _context.timestamp;\\n uint256 ctxBlockNumber = _context.blockNumber;\\n\\n bytes32 leafHash;\\n assembly {\\n let chainElementStart := add(_hashMemory, 0x20)\\n\\n // Set the first byte equal to `1` to indicate this is a sequencer chain element.\\n // This distinguishes sequencer ChainElements from queue ChainElements because\\n // all queue ChainElements are ABI encoded and the first byte of ABI encoded\\n // elements is always zero\\n mstore8(chainElementStart, 1)\\n\\n mstore(add(chainElementStart, 1), ctxTimestamp)\\n mstore(add(chainElementStart, 33), ctxBlockNumber)\\n\\n calldatacopy(add(chainElementStart, BYTES_TILL_TX_DATA), add(_nextTransactionPtr, 3), _txDataLength)\\n\\n leafHash := keccak256(chainElementStart, add(BYTES_TILL_TX_DATA, _txDataLength))\\n }\\n\\n return leafHash;\\n }\\n\\n /**\\n * Retrieves the hash of a sequencer element.\\n * @param _txChainElement The chain element which is hashed to calculate the leaf.\\n * @return Hash of the sequencer element.\\n */\\n function _getSequencerLeafHash(\\n Lib_OVMCodec.TransactionChainElement memory _txChainElement\\n )\\n internal\\n view\\n returns(\\n bytes32\\n )\\n {\\n bytes memory txData = _txChainElement.txData;\\n uint256 txDataLength = _txChainElement.txData.length;\\n\\n bytes memory chainElement = new bytes(BYTES_TILL_TX_DATA + txDataLength);\\n uint256 ctxTimestamp = _txChainElement.timestamp;\\n uint256 ctxBlockNumber = _txChainElement.blockNumber;\\n\\n bytes32 leafHash;\\n assembly {\\n let chainElementStart := add(chainElement, 0x20)\\n\\n // Set the first byte equal to `1` to indicate this is a sequencer chain element.\\n // This distinguishes sequencer ChainElements from queue ChainElements because\\n // all queue ChainElements are ABI encoded and the first byte of ABI encoded\\n // elements is always zero\\n mstore8(chainElementStart, 1)\\n\\n mstore(add(chainElementStart, 1), ctxTimestamp)\\n mstore(add(chainElementStart, 33), ctxBlockNumber)\\n\\n pop(staticcall(gas(), 0x04, add(txData, 0x20), txDataLength, add(chainElementStart, BYTES_TILL_TX_DATA), txDataLength))\\n\\n leafHash := keccak256(chainElementStart, add(BYTES_TILL_TX_DATA, txDataLength))\\n }\\n\\n return leafHash;\\n }\\n\\n /**\\n * Inserts a batch into the chain of batches.\\n * @param _transactionRoot Root of the transaction tree for this batch.\\n * @param _batchSize Number of elements in the batch.\\n * @param _numQueuedTransactions Number of queue transactions in the batch.\\n * @param _timestamp The latest batch timestamp.\\n * @param _blockNumber The latest batch blockNumber.\\n */\\n function _appendBatch(\\n bytes32 _transactionRoot,\\n uint256 _batchSize,\\n uint256 _numQueuedTransactions,\\n uint40 _timestamp,\\n uint40 _blockNumber\\n )\\n internal\\n {\\n iOVM_ChainStorageContainer batchesRef = batches();\\n (uint40 totalElements, uint40 nextQueueIndex,,) = _getBatchExtraData();\\n\\n Lib_OVMCodec.ChainBatchHeader memory header = Lib_OVMCodec.ChainBatchHeader({\\n batchIndex: batchesRef.length(),\\n batchRoot: _transactionRoot,\\n batchSize: _batchSize,\\n prevTotalElements: totalElements,\\n extraData: hex\\\"\\\"\\n });\\n\\n emit TransactionBatchAppended(\\n header.batchIndex,\\n header.batchRoot,\\n header.batchSize,\\n header.prevTotalElements,\\n header.extraData\\n );\\n\\n bytes32 batchHeaderHash = Lib_OVMCodec.hashBatchHeader(header);\\n bytes27 latestBatchContext = _makeBatchExtraData(\\n totalElements + uint40(header.batchSize),\\n nextQueueIndex + uint40(_numQueuedTransactions),\\n _timestamp,\\n _blockNumber\\n );\\n\\n batchesRef.push(batchHeaderHash, latestBatchContext);\\n }\\n\\n /**\\n * Checks that the first batch context in a sequencer submission is valid\\n * @param _firstContext The batch context to validate.\\n */\\n function _validateFirstBatchContext(\\n BatchContext memory _firstContext\\n )\\n internal\\n view\\n {\\n // If there are existing elements, this batch must have the same context\\n // or a later timestamp and block number.\\n if (getTotalElements() > 0) {\\n (,, uint40 lastTimestamp, uint40 lastBlockNumber) = _getBatchExtraData();\\n\\n require(\\n _firstContext.blockNumber >= lastBlockNumber,\\n \\\"Context block number is lower than last submitted.\\\"\\n );\\n\\n require(\\n _firstContext.timestamp >= lastTimestamp,\\n \\\"Context timestamp is lower than last submitted.\\\"\\n );\\n }\\n\\n // Sequencer cannot submit contexts which are more than the force inclusion period old.\\n require(\\n _firstContext.timestamp + forceInclusionPeriodSeconds >= block.timestamp,\\n \\\"Context timestamp too far in the past.\\\"\\n );\\n\\n require(\\n _firstContext.blockNumber + forceInclusionPeriodBlocks >= block.number,\\n \\\"Context block number too far in the past.\\\"\\n );\\n }\\n\\n /**\\n * Checks that a given batch context has a time context which is below a given que element\\n * @param _context The batch context to validate has values lower.\\n * @param _queueIndex Index of the queue element we are validating came later than the context.\\n * @param _queueRef The storage container for the queue.\\n */\\n function _validateContextBeforeEnqueue(\\n BatchContext memory _context,\\n uint40 _queueIndex,\\n iOVM_ChainStorageContainer _queueRef\\n )\\n internal\\n view\\n {\\n Lib_OVMCodec.QueueElement memory nextQueueElement = _getQueueElement(\\n _queueIndex,\\n _queueRef\\n );\\n\\n // If the force inclusion period has passed for an enqueued transaction, it MUST be the next chain element.\\n require(\\n block.timestamp < nextQueueElement.timestamp + forceInclusionPeriodSeconds,\\n \\\"Previously enqueued batches have expired and must be appended before a new sequencer batch.\\\"\\n );\\n\\n // Just like sequencer transaction times must be increasing relative to each other,\\n // We also require that they be increasing relative to any interspersed queue elements.\\n require(\\n _context.timestamp <= nextQueueElement.timestamp,\\n \\\"Sequencer transaction timestamp exceeds that of next queue element.\\\"\\n );\\n\\n require(\\n _context.blockNumber <= nextQueueElement.blockNumber,\\n \\\"Sequencer transaction blockNumber exceeds that of next queue element.\\\"\\n );\\n }\\n\\n /**\\n * Checks that a given batch context is valid based on its previous context, and the next queue elemtent.\\n * @param _prevContext The previously validated batch context.\\n * @param _nextContext The batch context to validate with this call.\\n * @param _nextQueueIndex Index of the next queue element to process for the _nextContext's subsequentQueueElements.\\n * @param _queueRef The storage container for the queue.\\n */\\n function _validateNextBatchContext(\\n BatchContext memory _prevContext,\\n BatchContext memory _nextContext,\\n uint40 _nextQueueIndex,\\n iOVM_ChainStorageContainer _queueRef\\n )\\n internal\\n view\\n {\\n // All sequencer transactions' times must be greater than or equal to the previous ones.\\n require(\\n _nextContext.timestamp >= _prevContext.timestamp,\\n \\\"Context timestamp values must monotonically increase.\\\"\\n );\\n\\n require(\\n _nextContext.blockNumber >= _prevContext.blockNumber,\\n \\\"Context blockNumber values must monotonically increase.\\\"\\n );\\n\\n // If there is going to be a queue element pulled in from this context:\\n if (_nextContext.numSubsequentQueueTransactions > 0) {\\n _validateContextBeforeEnqueue(\\n _nextContext,\\n _nextQueueIndex,\\n _queueRef\\n );\\n }\\n }\\n\\n /**\\n * Checks that the final batch context in a sequencer submission is valid.\\n * @param _finalContext The batch context to validate.\\n * @param _queueLength The length of the queue at the start of the batchAppend call.\\n * @param _nextQueueIndex The next element in the queue that will be pulled into the CTC.\\n * @param _queueRef The storage container for the queue.\\n */\\n function _validateFinalBatchContext(\\n BatchContext memory _finalContext,\\n uint40 _nextQueueIndex,\\n uint40 _queueLength,\\n iOVM_ChainStorageContainer _queueRef\\n )\\n internal\\n view\\n {\\n // If the queue is not now empty, check the mononoticity of whatever the next batch that will come in is.\\n if (_queueLength - _nextQueueIndex > 0 && _finalContext.numSubsequentQueueTransactions == 0) {\\n _validateContextBeforeEnqueue(\\n _finalContext,\\n _nextQueueIndex,\\n _queueRef\\n );\\n }\\n // Batches cannot be added from the future, or subsequent enqueue() contexts would violate monotonicity.\\n require(_finalContext.timestamp <= block.timestamp, \\\"Context timestamp is from the future.\\\");\\n require(_finalContext.blockNumber <= block.number, \\\"Context block number is from the future.\\\");\\n }\\n\\n /**\\n * Hashes a transaction chain element.\\n * @param _element Chain element to hash.\\n * @return Hash of the chain element.\\n */\\n function _hashTransactionChainElement(\\n Lib_OVMCodec.TransactionChainElement memory _element\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(\\n abi.encode(\\n _element.isSequenced,\\n _element.queueIndex,\\n _element.timestamp,\\n _element.blockNumber,\\n _element.txData\\n )\\n );\\n }\\n\\n /**\\n * Verifies a sequencer transaction, returning true if it was indeed included in the CTC\\n * @param _transaction The transaction we are verifying inclusion of.\\n * @param _txChainElement The chain element that the transaction is claimed to be a part of.\\n * @param _batchHeader Header of the batch the transaction was included in.\\n * @param _inclusionProof An inclusion proof into the CTC at a particular index.\\n * @return True if the transaction was included in the specified location, else false.\\n */\\n function _verifySequencerTransaction(\\n Lib_OVMCodec.Transaction memory _transaction,\\n Lib_OVMCodec.TransactionChainElement memory _txChainElement,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _inclusionProof\\n )\\n internal\\n view\\n returns (\\n bool\\n )\\n {\\n OVM_ExecutionManager ovmExecutionManager = OVM_ExecutionManager(resolve(\\\"OVM_ExecutionManager\\\"));\\n uint256 gasLimit = ovmExecutionManager.getMaxTransactionGasLimit();\\n bytes32 leafHash = _getSequencerLeafHash(_txChainElement);\\n\\n require(\\n _verifyElement(\\n leafHash,\\n _batchHeader,\\n _inclusionProof\\n ),\\n \\\"Invalid Sequencer transaction inclusion proof.\\\"\\n );\\n\\n require(\\n _transaction.blockNumber == _txChainElement.blockNumber\\n && _transaction.timestamp == _txChainElement.timestamp\\n && _transaction.entrypoint == resolve(\\\"OVM_DecompressionPrecompileAddress\\\")\\n && _transaction.gasLimit == gasLimit\\n && _transaction.l1TxOrigin == address(0)\\n && _transaction.l1QueueOrigin == Lib_OVMCodec.QueueOrigin.SEQUENCER_QUEUE\\n && keccak256(_transaction.data) == keccak256(_txChainElement.txData),\\n \\\"Invalid Sequencer transaction.\\\"\\n );\\n\\n return true;\\n }\\n\\n /**\\n * Verifies a queue transaction, returning true if it was indeed included in the CTC\\n * @param _transaction The transaction we are verifying inclusion of.\\n * @param _queueIndex The queueIndex of the queued transaction.\\n * @param _batchHeader Header of the batch the transaction was included in.\\n * @param _inclusionProof An inclusion proof into the CTC at a particular index (should point to queue tx).\\n * @return True if the transaction was included in the specified location, else false.\\n */\\n function _verifyQueueTransaction(\\n Lib_OVMCodec.Transaction memory _transaction,\\n uint256 _queueIndex,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _inclusionProof\\n )\\n internal\\n view\\n returns (\\n bool\\n )\\n {\\n bytes32 leafHash = _getQueueLeafHash(_queueIndex);\\n\\n require(\\n _verifyElement(\\n leafHash,\\n _batchHeader,\\n _inclusionProof\\n ),\\n \\\"Invalid Queue transaction inclusion proof.\\\"\\n );\\n\\n bytes32 transactionHash = keccak256(\\n abi.encode(\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n )\\n );\\n\\n Lib_OVMCodec.QueueElement memory el = getQueueElement(_queueIndex);\\n require(\\n el.transactionHash == transactionHash\\n && el.timestamp == _transaction.timestamp\\n && el.blockNumber == _transaction.blockNumber,\\n \\\"Invalid Queue transaction.\\\"\\n );\\n\\n return true;\\n }\\n\\n /**\\n * Verifies a batch inclusion proof.\\n * @param _element Hash of the element to verify a proof for.\\n * @param _batchHeader Header of the batch in which the element was included.\\n * @param _proof Merkle inclusion proof for the element.\\n */\\n function _verifyElement(\\n bytes32 _element,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _proof\\n )\\n internal\\n view\\n returns (\\n bool\\n )\\n {\\n require(\\n Lib_OVMCodec.hashBatchHeader(_batchHeader) == batches().get(uint32(_batchHeader.batchIndex)),\\n \\\"Invalid batch header.\\\"\\n );\\n\\n require(\\n Lib_MerkleTree.verify(\\n _batchHeader.batchRoot,\\n _element,\\n _proof.index,\\n _proof.siblings,\\n _batchHeader.batchSize\\n ),\\n \\\"Invalid inclusion proof.\\\"\\n );\\n\\n return true;\\n }\\n}\\n\",\"keccak256\":\"0xdc5f311b6840476027f597b9b6ff6c7673988cfed9c9ace625c705175b27abe3\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// @unsupported: ovm\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\nimport { Lib_EthUtils } from \\\"../../libraries/utils/Lib_EthUtils.sol\\\";\\nimport { Lib_ErrorUtils } from \\\"../../libraries/utils/Lib_ErrorUtils.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_ExecutionManager } from \\\"../../iOVM/execution/iOVM_ExecutionManager.sol\\\";\\nimport { iOVM_StateManager } from \\\"../../iOVM/execution/iOVM_StateManager.sol\\\";\\nimport { iOVM_SafetyChecker } from \\\"../../iOVM/execution/iOVM_SafetyChecker.sol\\\";\\n\\n/* Contract Imports */\\nimport { OVM_DeployerWhitelist } from \\\"../predeploys/OVM_DeployerWhitelist.sol\\\";\\n\\n/**\\n * @title OVM_ExecutionManager\\n * @dev The Execution Manager (EM) is the core of our OVM implementation, and provides a sandboxed\\n * environment allowing us to execute OVM transactions deterministically on either Layer 1 or\\n * Layer 2.\\n * The EM's run() function is the first function called during the execution of any\\n * transaction on L2.\\n * For each context-dependent EVM operation the EM has a function which implements a corresponding\\n * OVM operation, which will read state from the State Manager contract.\\n * The EM relies on the Safety Checker to verify that code deployed to Layer 2 does not contain any\\n * context-dependent operations.\\n *\\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract OVM_ExecutionManager is iOVM_ExecutionManager, Lib_AddressResolver {\\n\\n /********************************\\n * External Contract References *\\n ********************************/\\n\\n iOVM_SafetyChecker internal ovmSafetyChecker;\\n iOVM_StateManager internal ovmStateManager;\\n\\n\\n /*******************************\\n * Execution Context Variables *\\n *******************************/\\n\\n GasMeterConfig internal gasMeterConfig;\\n GlobalContext internal globalContext;\\n TransactionContext internal transactionContext;\\n MessageContext internal messageContext;\\n TransactionRecord internal transactionRecord;\\n MessageRecord internal messageRecord;\\n\\n\\n /**************************\\n * Gas Metering Constants *\\n **************************/\\n\\n address constant GAS_METADATA_ADDRESS = 0x06a506A506a506A506a506a506A506A506A506A5;\\n uint256 constant NUISANCE_GAS_SLOAD = 20000;\\n uint256 constant NUISANCE_GAS_SSTORE = 20000;\\n uint256 constant MIN_NUISANCE_GAS_PER_CONTRACT = 30000;\\n uint256 constant NUISANCE_GAS_PER_CONTRACT_BYTE = 100;\\n uint256 constant MIN_GAS_FOR_INVALID_STATE_ACCESS = 30000;\\n\\n /**************************\\n * Default Context Values *\\n **************************/\\n\\n uint256 constant DEFAULT_UINT256 = 0xdefa017defa017defa017defa017defa017defa017defa017defa017defa017d;\\n address constant DEFAULT_ADDRESS = 0xdEfa017defA017DeFA017DEfa017DeFA017DeFa0;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n */\\n constructor(\\n address _libAddressManager,\\n GasMeterConfig memory _gasMeterConfig,\\n GlobalContext memory _globalContext\\n )\\n Lib_AddressResolver(_libAddressManager)\\n {\\n ovmSafetyChecker = iOVM_SafetyChecker(resolve(\\\"OVM_SafetyChecker\\\"));\\n gasMeterConfig = _gasMeterConfig;\\n globalContext = _globalContext;\\n _resetContext();\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n /**\\n * Applies dynamically-sized refund to a transaction to account for the difference in execution\\n * between L1 and L2, so that the overall cost of the ovmOPCODE is fixed.\\n * @param _cost Desired gas cost for the function after the refund.\\n */\\n modifier netGasCost(\\n uint256 _cost\\n ) {\\n uint256 gasProvided = gasleft();\\n _;\\n uint256 gasUsed = gasProvided - gasleft();\\n\\n // We want to refund everything *except* the specified cost.\\n if (_cost < gasUsed) {\\n transactionRecord.ovmGasRefund += gasUsed - _cost;\\n }\\n }\\n\\n /**\\n * Applies a fixed-size gas refund to a transaction to account for the difference in execution\\n * between L1 and L2, so that the overall cost of an ovmOPCODE can be lowered.\\n * @param _discount Amount of gas cost to refund for the ovmOPCODE.\\n */\\n modifier fixedGasDiscount(\\n uint256 _discount\\n ) {\\n uint256 gasProvided = gasleft();\\n _;\\n uint256 gasUsed = gasProvided - gasleft();\\n\\n // We want to refund the specified _discount, unless this risks underflow.\\n if (_discount < gasUsed) {\\n transactionRecord.ovmGasRefund += _discount;\\n } else {\\n // refund all we can without risking underflow.\\n transactionRecord.ovmGasRefund += gasUsed;\\n }\\n }\\n\\n /**\\n * Makes sure we're not inside a static context.\\n */\\n modifier notStatic() {\\n if (messageContext.isStatic == true) {\\n _revertWithFlag(RevertFlag.STATIC_VIOLATION);\\n }\\n _;\\n }\\n\\n\\n /************************************\\n * Transaction Execution Entrypoint *\\n ************************************/\\n\\n /**\\n * Starts the execution of a transaction via the OVM_ExecutionManager.\\n * @param _transaction Transaction data to be executed.\\n * @param _ovmStateManager iOVM_StateManager implementation providing account state.\\n */\\n function run(\\n Lib_OVMCodec.Transaction memory _transaction,\\n address _ovmStateManager\\n )\\n override\\n external\\n returns (\\n bytes memory\\n )\\n {\\n // Make sure that run() is not re-enterable. This condition should always be satisfied\\n // Once run has been called once, due to the behavior of _isValidInput().\\n if (transactionContext.ovmNUMBER != DEFAULT_UINT256) {\\n return bytes(\\\"\\\");\\n }\\n\\n // Store our OVM_StateManager instance (significantly easier than attempting to pass the\\n // address around in calldata).\\n ovmStateManager = iOVM_StateManager(_ovmStateManager);\\n\\n // Make sure this function can't be called by anyone except the owner of the\\n // OVM_StateManager (expected to be an OVM_StateTransitioner). We can revert here because\\n // this would make the `run` itself invalid.\\n require(\\n // This method may return false during fraud proofs, but always returns true in L2 nodes' State Manager precompile.\\n ovmStateManager.isAuthenticated(msg.sender),\\n \\\"Only authenticated addresses in ovmStateManager can call this function\\\"\\n );\\n\\n // Initialize the execution context, must be initialized before we perform any gas metering\\n // or we'll throw a nuisance gas error.\\n _initContext(_transaction);\\n\\n // TEMPORARY: Gas metering is disabled for minnet.\\n // // Check whether we need to start a new epoch, do so if necessary.\\n // _checkNeedsNewEpoch(_transaction.timestamp);\\n\\n // Make sure the transaction's gas limit is valid. We don't revert here because we reserve\\n // reverts for INVALID_STATE_ACCESS.\\n if (_isValidInput(_transaction) == false) {\\n _resetContext();\\n return bytes(\\\"\\\");\\n }\\n\\n // TEMPORARY: Gas metering is disabled for minnet.\\n // // Check gas right before the call to get total gas consumed by OVM transaction.\\n // uint256 gasProvided = gasleft();\\n\\n // Run the transaction, make sure to meter the gas usage.\\n (, bytes memory returndata) = ovmCALL(\\n _transaction.gasLimit - gasMeterConfig.minTransactionGasLimit,\\n _transaction.entrypoint,\\n _transaction.data\\n );\\n\\n // TEMPORARY: Gas metering is disabled for minnet.\\n // // Update the cumulative gas based on the amount of gas used.\\n // uint256 gasUsed = gasProvided - gasleft();\\n // _updateCumulativeGas(gasUsed, _transaction.l1QueueOrigin);\\n\\n // Wipe the execution context.\\n _resetContext();\\n\\n return returndata;\\n }\\n\\n\\n /******************************\\n * Opcodes: Execution Context *\\n ******************************/\\n\\n /**\\n * @notice Overrides CALLER.\\n * @return _CALLER Address of the CALLER within the current message context.\\n */\\n function ovmCALLER()\\n override\\n external\\n view\\n returns (\\n address _CALLER\\n )\\n {\\n return messageContext.ovmCALLER;\\n }\\n\\n /**\\n * @notice Overrides ADDRESS.\\n * @return _ADDRESS Active ADDRESS within the current message context.\\n */\\n function ovmADDRESS()\\n override\\n public\\n view\\n returns (\\n address _ADDRESS\\n )\\n {\\n return messageContext.ovmADDRESS;\\n }\\n\\n /**\\n * @notice Overrides TIMESTAMP.\\n * @return _TIMESTAMP Value of the TIMESTAMP within the transaction context.\\n */\\n function ovmTIMESTAMP()\\n override\\n external\\n view\\n returns (\\n uint256 _TIMESTAMP\\n )\\n {\\n return transactionContext.ovmTIMESTAMP;\\n }\\n\\n /**\\n * @notice Overrides NUMBER.\\n * @return _NUMBER Value of the NUMBER within the transaction context.\\n */\\n function ovmNUMBER()\\n override\\n external\\n view\\n returns (\\n uint256 _NUMBER\\n )\\n {\\n return transactionContext.ovmNUMBER;\\n }\\n\\n /**\\n * @notice Overrides GASLIMIT.\\n * @return _GASLIMIT Value of the block's GASLIMIT within the transaction context.\\n */\\n function ovmGASLIMIT()\\n override\\n external\\n view\\n returns (\\n uint256 _GASLIMIT\\n )\\n {\\n return transactionContext.ovmGASLIMIT;\\n }\\n\\n /**\\n * @notice Overrides CHAINID.\\n * @return _CHAINID Value of the chain's CHAINID within the global context.\\n */\\n function ovmCHAINID()\\n override\\n external\\n view\\n returns (\\n uint256 _CHAINID\\n )\\n {\\n return globalContext.ovmCHAINID;\\n }\\n\\n /*********************************\\n * Opcodes: L2 Execution Context *\\n *********************************/\\n\\n /**\\n * @notice Specifies from which source (Sequencer or Queue) this transaction originated from.\\n * @return _queueOrigin Enum indicating the ovmL1QUEUEORIGIN within the current message context.\\n */\\n function ovmL1QUEUEORIGIN()\\n override\\n external\\n view\\n returns (\\n Lib_OVMCodec.QueueOrigin _queueOrigin\\n )\\n {\\n return transactionContext.ovmL1QUEUEORIGIN;\\n }\\n\\n /**\\n * @notice Specifies which L1 account, if any, sent this transaction by calling enqueue().\\n * @return _l1TxOrigin Address of the account which sent the tx into L2 from L1.\\n */\\n function ovmL1TXORIGIN()\\n override\\n external\\n view\\n returns (\\n address _l1TxOrigin\\n )\\n {\\n return transactionContext.ovmL1TXORIGIN;\\n }\\n\\n /********************\\n * Opcodes: Halting *\\n ********************/\\n\\n /**\\n * @notice Overrides REVERT.\\n * @param _data Bytes data to pass along with the REVERT.\\n */\\n function ovmREVERT(\\n bytes memory _data\\n )\\n override\\n public\\n {\\n _revertWithFlag(RevertFlag.INTENTIONAL_REVERT, _data);\\n }\\n\\n\\n /******************************\\n * Opcodes: Contract Creation *\\n ******************************/\\n\\n /**\\n * @notice Overrides CREATE.\\n * @param _bytecode Code to be used to CREATE a new contract.\\n * @return Address of the created contract.\\n * @return Revert data, if and only if the creation threw an exception.\\n */\\n function ovmCREATE(\\n bytes memory _bytecode\\n )\\n override\\n public\\n notStatic\\n fixedGasDiscount(40000)\\n returns (\\n address,\\n bytes memory\\n )\\n {\\n // Creator is always the current ADDRESS.\\n address creator = ovmADDRESS();\\n\\n // Check that the deployer is whitelisted, or\\n // that arbitrary contract deployment has been enabled.\\n _checkDeployerAllowed(creator);\\n\\n // Generate the correct CREATE address.\\n address contractAddress = Lib_EthUtils.getAddressForCREATE(\\n creator,\\n _getAccountNonce(creator)\\n );\\n\\n return _createContract(\\n contractAddress,\\n _bytecode\\n );\\n }\\n\\n /**\\n * @notice Overrides CREATE2.\\n * @param _bytecode Code to be used to CREATE2 a new contract.\\n * @param _salt Value used to determine the contract's address.\\n * @return Address of the created contract.\\n * @return Revert data, if and only if the creation threw an exception.\\n */\\n function ovmCREATE2(\\n bytes memory _bytecode,\\n bytes32 _salt\\n )\\n override\\n external\\n notStatic\\n fixedGasDiscount(40000)\\n returns (\\n address,\\n bytes memory\\n )\\n {\\n // Creator is always the current ADDRESS.\\n address creator = ovmADDRESS();\\n\\n // Check that the deployer is whitelisted, or\\n // that arbitrary contract deployment has been enabled.\\n _checkDeployerAllowed(creator);\\n\\n // Generate the correct CREATE2 address.\\n address contractAddress = Lib_EthUtils.getAddressForCREATE2(\\n creator,\\n _bytecode,\\n _salt\\n );\\n\\n return _createContract(\\n contractAddress,\\n _bytecode\\n );\\n }\\n\\n\\n /*******************************\\n * Account Abstraction Opcodes *\\n ******************************/\\n\\n /**\\n * Retrieves the nonce of the current ovmADDRESS.\\n * @return _nonce Nonce of the current contract.\\n */\\n function ovmGETNONCE()\\n override\\n external\\n returns (\\n uint256 _nonce\\n )\\n {\\n return _getAccountNonce(ovmADDRESS());\\n }\\n\\n /**\\n * Bumps the nonce of the current ovmADDRESS by one.\\n */\\n function ovmINCREMENTNONCE()\\n override\\n external\\n notStatic\\n {\\n address account = ovmADDRESS();\\n uint256 nonce = _getAccountNonce(account);\\n\\n // Prevent overflow.\\n if (nonce + 1 > nonce) {\\n _setAccountNonce(account, nonce + 1);\\n }\\n }\\n\\n /**\\n * Creates a new EOA contract account, for account abstraction.\\n * @dev Essentially functions like ovmCREATE or ovmCREATE2, but we can bypass a lot of checks\\n * because the contract we're creating is trusted (no need to do safety checking or to\\n * handle unexpected reverts). Doesn't need to return an address because the address is\\n * assumed to be the user's actual address.\\n * @param _messageHash Hash of a message signed by some user, for verification.\\n * @param _v Signature `v` parameter.\\n * @param _r Signature `r` parameter.\\n * @param _s Signature `s` parameter.\\n */\\n function ovmCREATEEOA(\\n bytes32 _messageHash,\\n uint8 _v,\\n bytes32 _r,\\n bytes32 _s\\n )\\n override\\n public\\n notStatic\\n {\\n // Recover the EOA address from the message hash and signature parameters. Since we do the\\n // hashing in advance, we don't have handle different message hashing schemes. Even if this\\n // function were to return the wrong address (rather than explicitly returning the zero\\n // address), the rest of the transaction would simply fail (since there's no EOA account to\\n // actually execute the transaction).\\n address eoa = ecrecover(\\n _messageHash,\\n _v + 27,\\n _r,\\n _s\\n );\\n\\n // Invalid signature is a case we proactively handle with a revert. We could alternatively\\n // have this function return a `success` boolean, but this is just easier.\\n if (eoa == address(0)) {\\n ovmREVERT(bytes(\\\"Signature provided for EOA contract creation is invalid.\\\"));\\n }\\n\\n // If the user already has an EOA account, then there's no need to perform this operation.\\n if (_hasEmptyAccount(eoa) == false) {\\n return;\\n }\\n\\n // We always need to initialize the contract with the default account values.\\n _initPendingAccount(eoa);\\n\\n // Temporarily set the current address so it's easier to access on L2.\\n address prevADDRESS = messageContext.ovmADDRESS;\\n messageContext.ovmADDRESS = eoa;\\n\\n // Creates a duplicate of the OVM_ProxyEOA located at 0x42....09. Uses the following\\n // \\\"magic\\\" prefix to deploy an exact copy of the code:\\n // PUSH1 0x0D # size of this prefix in bytes\\n // CODESIZE\\n // SUB # subtract prefix size from codesize\\n // DUP1\\n // PUSH1 0x0D\\n // PUSH1 0x00\\n // CODECOPY # copy everything after prefix into memory at pos 0\\n // PUSH1 0x00\\n // RETURN # return the copied code\\n address proxyEOA = Lib_EthUtils.createContract(abi.encodePacked(\\n hex\\\"600D380380600D6000396000f3\\\",\\n ovmEXTCODECOPY(\\n 0x4200000000000000000000000000000000000009,\\n 0,\\n ovmEXTCODESIZE(0x4200000000000000000000000000000000000009)\\n )\\n ));\\n\\n // Reset the address now that we're done deploying.\\n messageContext.ovmADDRESS = prevADDRESS;\\n\\n // Commit the account with its final values.\\n _commitPendingAccount(\\n eoa,\\n address(proxyEOA),\\n keccak256(Lib_EthUtils.getCode(address(proxyEOA)))\\n );\\n\\n _setAccountNonce(eoa, 0);\\n }\\n\\n\\n /*********************************\\n * Opcodes: Contract Interaction *\\n *********************************/\\n\\n /**\\n * @notice Overrides CALL.\\n * @param _gasLimit Amount of gas to be passed into this call.\\n * @param _address Address of the contract to call.\\n * @param _calldata Data to send along with the call.\\n * @return _success Whether or not the call returned (rather than reverted).\\n * @return _returndata Data returned by the call.\\n */\\n function ovmCALL(\\n uint256 _gasLimit,\\n address _address,\\n bytes memory _calldata\\n )\\n override\\n public\\n fixedGasDiscount(100000)\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n // CALL updates the CALLER and ADDRESS.\\n MessageContext memory nextMessageContext = messageContext;\\n nextMessageContext.ovmCALLER = nextMessageContext.ovmADDRESS;\\n nextMessageContext.ovmADDRESS = _address;\\n\\n return _callContract(\\n nextMessageContext,\\n _gasLimit,\\n _address,\\n _calldata\\n );\\n }\\n\\n /**\\n * @notice Overrides STATICCALL.\\n * @param _gasLimit Amount of gas to be passed into this call.\\n * @param _address Address of the contract to call.\\n * @param _calldata Data to send along with the call.\\n * @return _success Whether or not the call returned (rather than reverted).\\n * @return _returndata Data returned by the call.\\n */\\n function ovmSTATICCALL(\\n uint256 _gasLimit,\\n address _address,\\n bytes memory _calldata\\n )\\n override\\n external\\n fixedGasDiscount(80000)\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n // STATICCALL updates the CALLER, updates the ADDRESS, and runs in a static context.\\n MessageContext memory nextMessageContext = messageContext;\\n nextMessageContext.ovmCALLER = nextMessageContext.ovmADDRESS;\\n nextMessageContext.ovmADDRESS = _address;\\n nextMessageContext.isStatic = true;\\n\\n return _callContract(\\n nextMessageContext,\\n _gasLimit,\\n _address,\\n _calldata\\n );\\n }\\n\\n /**\\n * @notice Overrides DELEGATECALL.\\n * @param _gasLimit Amount of gas to be passed into this call.\\n * @param _address Address of the contract to call.\\n * @param _calldata Data to send along with the call.\\n * @return _success Whether or not the call returned (rather than reverted).\\n * @return _returndata Data returned by the call.\\n */\\n function ovmDELEGATECALL(\\n uint256 _gasLimit,\\n address _address,\\n bytes memory _calldata\\n )\\n override\\n external\\n fixedGasDiscount(40000)\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n // DELEGATECALL does not change anything about the message context.\\n MessageContext memory nextMessageContext = messageContext;\\n\\n return _callContract(\\n nextMessageContext,\\n _gasLimit,\\n _address,\\n _calldata\\n );\\n }\\n\\n\\n /************************************\\n * Opcodes: Contract Storage Access *\\n ************************************/\\n\\n /**\\n * @notice Overrides SLOAD.\\n * @param _key 32 byte key of the storage slot to load.\\n * @return _value 32 byte value of the requested storage slot.\\n */\\n function ovmSLOAD(\\n bytes32 _key\\n )\\n override\\n external\\n netGasCost(40000)\\n returns (\\n bytes32 _value\\n )\\n {\\n // We always SLOAD from the storage of ADDRESS.\\n address contractAddress = ovmADDRESS();\\n\\n return _getContractStorage(\\n contractAddress,\\n _key\\n );\\n }\\n\\n /**\\n * @notice Overrides SSTORE.\\n * @param _key 32 byte key of the storage slot to set.\\n * @param _value 32 byte value for the storage slot.\\n */\\n function ovmSSTORE(\\n bytes32 _key,\\n bytes32 _value\\n )\\n override\\n external\\n notStatic\\n netGasCost(60000)\\n {\\n // We always SSTORE to the storage of ADDRESS.\\n address contractAddress = ovmADDRESS();\\n\\n _putContractStorage(\\n contractAddress,\\n _key,\\n _value\\n );\\n }\\n\\n\\n /*********************************\\n * Opcodes: Contract Code Access *\\n *********************************/\\n\\n /**\\n * @notice Overrides EXTCODECOPY.\\n * @param _contract Address of the contract to copy code from.\\n * @param _offset Offset in bytes from the start of contract code to copy beyond.\\n * @param _length Total number of bytes to copy from the contract's code.\\n * @return _code Bytes of code copied from the requested contract.\\n */\\n function ovmEXTCODECOPY(\\n address _contract,\\n uint256 _offset,\\n uint256 _length\\n )\\n override\\n public\\n returns (\\n bytes memory _code\\n )\\n {\\n return Lib_EthUtils.getCode(\\n _getAccountEthAddress(_contract),\\n _offset,\\n _length\\n );\\n }\\n\\n /**\\n * @notice Overrides EXTCODESIZE.\\n * @param _contract Address of the contract to query the size of.\\n * @return _EXTCODESIZE Size of the requested contract in bytes.\\n */\\n function ovmEXTCODESIZE(\\n address _contract\\n )\\n override\\n public\\n returns (\\n uint256 _EXTCODESIZE\\n )\\n {\\n return Lib_EthUtils.getCodeSize(\\n _getAccountEthAddress(_contract)\\n );\\n }\\n\\n /**\\n * @notice Overrides EXTCODEHASH.\\n * @param _contract Address of the contract to query the hash of.\\n * @return _EXTCODEHASH Hash of the requested contract.\\n */\\n function ovmEXTCODEHASH(\\n address _contract\\n )\\n override\\n external\\n returns (\\n bytes32 _EXTCODEHASH\\n )\\n {\\n return Lib_EthUtils.getCodeHash(\\n _getAccountEthAddress(_contract)\\n );\\n }\\n\\n /***************************************\\n * Public Functions: Execution Context *\\n ***************************************/\\n\\n function getMaxTransactionGasLimit()\\n external\\n view\\n override\\n returns (\\n uint256 _maxTransactionGasLimit\\n )\\n {\\n return gasMeterConfig.maxTransactionGasLimit;\\n }\\n\\n /********************************************\\n * Public Functions: Deployment Whitelisting *\\n ********************************************/\\n\\n /**\\n * Checks whether the given address is on the whitelist to ovmCREATE/ovmCREATE2, and reverts if not.\\n * @param _deployerAddress Address attempting to deploy a contract.\\n */\\n function _checkDeployerAllowed(\\n address _deployerAddress\\n )\\n internal\\n {\\n // From an OVM semantics perspective, this will appear identical to\\n // the deployer ovmCALLing the whitelist. This is fine--in a sense, we are forcing them to.\\n (bool success, bytes memory data) = ovmCALL(\\n gasleft(),\\n 0x4200000000000000000000000000000000000002,\\n abi.encodeWithSignature(\\\"isDeployerAllowed(address)\\\", _deployerAddress)\\n );\\n bool isAllowed = abi.decode(data, (bool));\\n\\n if (!isAllowed || !success) {\\n _revertWithFlag(RevertFlag.CREATOR_NOT_ALLOWED);\\n }\\n }\\n\\n /********************************************\\n * Internal Functions: Contract Interaction *\\n ********************************************/\\n\\n /**\\n * Creates a new contract and associates it with some contract address.\\n * @param _contractAddress Address to associate the created contract with.\\n * @param _bytecode Bytecode to be used to create the contract.\\n * @return Final OVM contract address.\\n * @return Revertdata, if and only if the creation threw an exception.\\n */\\n function _createContract(\\n address _contractAddress,\\n bytes memory _bytecode\\n )\\n internal\\n returns (\\n address,\\n bytes memory\\n )\\n {\\n // We always update the nonce of the creating account, even if the creation fails.\\n _setAccountNonce(ovmADDRESS(), _getAccountNonce(ovmADDRESS()) + 1);\\n\\n // We're stepping into a CREATE or CREATE2, so we need to update ADDRESS to point\\n // to the contract's associated address and CALLER to point to the previous ADDRESS.\\n MessageContext memory nextMessageContext = messageContext;\\n nextMessageContext.ovmCALLER = messageContext.ovmADDRESS;\\n nextMessageContext.ovmADDRESS = _contractAddress;\\n\\n // Run the common logic which occurs between call-type and create-type messages,\\n // passing in the creation bytecode and `true` to trigger create-specific logic.\\n (bool success, bytes memory data) = _handleExternalMessage(\\n nextMessageContext,\\n gasleft(),\\n _contractAddress,\\n _bytecode,\\n true\\n );\\n\\n // Yellow paper requires that address returned is zero if the contract deployment fails.\\n return (\\n success ? _contractAddress : address(0),\\n data\\n );\\n }\\n\\n /**\\n * Calls the deployed contract associated with a given address.\\n * @param _nextMessageContext Message context to be used for the call.\\n * @param _gasLimit Amount of gas to be passed into this call.\\n * @param _contract OVM address to be called.\\n * @param _calldata Data to send along with the call.\\n * @return _success Whether or not the call returned (rather than reverted).\\n * @return _returndata Data returned by the call.\\n */\\n function _callContract(\\n MessageContext memory _nextMessageContext,\\n uint256 _gasLimit,\\n address _contract,\\n bytes memory _calldata\\n )\\n internal\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n // We reserve addresses of the form 0xdeaddeaddead...NNNN for the container contracts in L2 geth.\\n // So, we block calls to these addresses since they are not safe to run as an OVM contract itself.\\n if (\\n (uint256(_contract) & uint256(0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000))\\n == uint256(0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000)\\n ) {\\n // EVM does not return data in the success case, see: https://github.com/ethereum/go-ethereum/blob/aae7660410f0ef90279e14afaaf2f429fdc2a186/core/vm/instructions.go#L600-L604\\n return (true, hex'');\\n }\\n\\n // Both 0x0000... and the EVM precompiles have the same address on L1 and L2 --> no trie lookup needed.\\n address codeContractAddress =\\n uint(_contract) < 100\\n ? _contract\\n : _getAccountEthAddress(_contract);\\n\\n return _handleExternalMessage(\\n _nextMessageContext,\\n _gasLimit,\\n codeContractAddress,\\n _calldata,\\n false\\n );\\n }\\n\\n /**\\n * Handles all interactions which involve the execution manager calling out to untrusted code (both calls and creates).\\n * Ensures that OVM-related measures are enforced, including L2 gas refunds, nuisance gas, and flagged reversions.\\n *\\n * @param _nextMessageContext Message context to be used for the external message.\\n * @param _gasLimit Amount of gas to be passed into this message.\\n * @param _contract OVM address being called or deployed to\\n * @param _data Data for the message (either calldata or creation code)\\n * @param _isCreate Whether this is a create-type message.\\n * @return Whether or not the message (either a call or deployment) succeeded.\\n * @return Data returned by the message.\\n */\\n function _handleExternalMessage(\\n MessageContext memory _nextMessageContext,\\n uint256 _gasLimit,\\n address _contract,\\n bytes memory _data,\\n bool _isCreate\\n )\\n internal\\n returns (\\n bool,\\n bytes memory\\n )\\n {\\n // We need to switch over to our next message context for the duration of this call.\\n MessageContext memory prevMessageContext = messageContext;\\n _switchMessageContext(prevMessageContext, _nextMessageContext);\\n\\n // Nuisance gas is a system used to bound the ability for an attacker to make fraud proofs\\n // expensive by touching a lot of different accounts or storage slots. Since most contracts\\n // only use a few storage slots during any given transaction, this shouldn't be a limiting\\n // factor.\\n uint256 prevNuisanceGasLeft = messageRecord.nuisanceGasLeft;\\n uint256 nuisanceGasLimit = _getNuisanceGasLimit(_gasLimit);\\n messageRecord.nuisanceGasLeft = nuisanceGasLimit;\\n\\n // Make the call and make sure to pass in the gas limit. Another instance of hidden\\n // complexity. `_contract` is guaranteed to be a safe contract, meaning its return/revert\\n // behavior can be controlled. In particular, we enforce that flags are passed through\\n // revert data as to retrieve execution metadata that would normally be reverted out of\\n // existence.\\n\\n bool success;\\n bytes memory returndata;\\n if (_isCreate) {\\n // safeCREATE() is a function which replicates a CREATE message, but uses return values\\n // Which match that of CALL (i.e. bool, bytes). This allows many security checks to be\\n // to be shared between untrusted call and create call frames.\\n (success, returndata) = address(this).call(\\n abi.encodeWithSelector(\\n this.safeCREATE.selector,\\n _gasLimit,\\n _data,\\n _contract\\n )\\n );\\n } else {\\n (success, returndata) = _contract.call{gas: _gasLimit}(_data);\\n }\\n\\n // Switch back to the original message context now that we're out of the call.\\n _switchMessageContext(_nextMessageContext, prevMessageContext);\\n\\n // Assuming there were no reverts, the message record should be accurate here. We'll update\\n // this value in the case of a revert.\\n uint256 nuisanceGasLeft = messageRecord.nuisanceGasLeft;\\n\\n // Reverts at this point are completely OK, but we need to make a few updates based on the\\n // information passed through the revert.\\n if (success == false) {\\n (\\n RevertFlag flag,\\n uint256 nuisanceGasLeftPostRevert,\\n uint256 ovmGasRefund,\\n bytes memory returndataFromFlag\\n ) = _decodeRevertData(returndata);\\n\\n // INVALID_STATE_ACCESS is the only flag that triggers an immediate abort of the\\n // parent EVM message. This behavior is necessary because INVALID_STATE_ACCESS must\\n // halt any further transaction execution that could impact the execution result.\\n if (flag == RevertFlag.INVALID_STATE_ACCESS) {\\n _revertWithFlag(flag);\\n }\\n\\n // INTENTIONAL_REVERT, UNSAFE_BYTECODE, STATIC_VIOLATION, and CREATOR_NOT_ALLOWED aren't\\n // dependent on the input state, so we can just handle them like standard reverts. Our only change here\\n // is to record the gas refund reported by the call (enforced by safety checking).\\n if (\\n flag == RevertFlag.INTENTIONAL_REVERT\\n || flag == RevertFlag.UNSAFE_BYTECODE\\n || flag == RevertFlag.STATIC_VIOLATION\\n || flag == RevertFlag.CREATOR_NOT_ALLOWED\\n ) {\\n transactionRecord.ovmGasRefund = ovmGasRefund;\\n }\\n\\n // INTENTIONAL_REVERT needs to pass up the user-provided return data encoded into the\\n // flag, *not* the full encoded flag. All other revert types return no data.\\n if (\\n flag == RevertFlag.INTENTIONAL_REVERT\\n || _isCreate\\n ) {\\n returndata = returndataFromFlag;\\n } else {\\n returndata = hex'';\\n }\\n\\n // Reverts mean we need to use up whatever \\\"nuisance gas\\\" was used by the call.\\n // EXCEEDS_NUISANCE_GAS explicitly reduces the remaining nuisance gas for this message\\n // to zero. OUT_OF_GAS is a \\\"pseudo\\\" flag given that messages return no data when they\\n // run out of gas, so we have to treat this like EXCEEDS_NUISANCE_GAS. All other flags\\n // will simply pass up the remaining nuisance gas.\\n nuisanceGasLeft = nuisanceGasLeftPostRevert;\\n }\\n\\n // We need to reset the nuisance gas back to its original value minus the amount used here.\\n messageRecord.nuisanceGasLeft = prevNuisanceGasLeft - (nuisanceGasLimit - nuisanceGasLeft);\\n\\n return (\\n success,\\n returndata\\n );\\n }\\n\\n /**\\n * Handles the creation-specific safety measures required for OVM contract deployment.\\n * This function sanitizes the return types for creation messages to match calls (bool, bytes),\\n * by being an external function which the EM can call, that mimics the success/fail case of the CREATE.\\n * This allows for consistent handling of both types of messages in _handleExternalMessage().\\n * Having this step occur as a separate call frame also allows us to easily revert the\\n * contract deployment in the event that the code is unsafe.\\n *\\n * @param _gasLimit Amount of gas to be passed into this creation.\\n * @param _creationCode Code to pass into CREATE for deployment.\\n * @param _address OVM address being deployed to.\\n */\\n function safeCREATE(\\n uint _gasLimit,\\n bytes memory _creationCode,\\n address _address\\n )\\n external\\n {\\n // The only way this should callable is from within _createContract(),\\n // and it should DEFINITELY not be callable by a non-EM code contract.\\n if (msg.sender != address(this)) {\\n return;\\n }\\n // Check that there is not already code at this address.\\n if (_hasEmptyAccount(_address) == false) {\\n // Note: in the EVM, this case burns all allotted gas. For improved\\n // developer experience, we do return the remaining gas.\\n _revertWithFlag(\\n RevertFlag.CREATE_COLLISION,\\n Lib_ErrorUtils.encodeRevertString(\\\"A contract has already been deployed to this address\\\")\\n );\\n }\\n\\n // Check the creation bytecode against the OVM_SafetyChecker.\\n if (ovmSafetyChecker.isBytecodeSafe(_creationCode) == false) {\\n _revertWithFlag(\\n RevertFlag.UNSAFE_BYTECODE,\\n Lib_ErrorUtils.encodeRevertString(\\\"Contract creation code contains unsafe opcodes. Did you use the right compiler or pass an unsafe constructor argument?\\\")\\n );\\n }\\n\\n // We always need to initialize the contract with the default account values.\\n _initPendingAccount(_address);\\n\\n // Actually execute the EVM create message.\\n // NOTE: The inline assembly below means we can NOT make any evm calls between here and then.\\n address ethAddress = Lib_EthUtils.createContract(_creationCode);\\n\\n if (ethAddress == address(0)) {\\n // If the creation fails, the EVM lets us grab its revert data. This may contain a revert flag\\n // to be used above in _handleExternalMessage, so we pass the revert data back up unmodified.\\n assembly {\\n returndatacopy(0,0,returndatasize())\\n revert(0, returndatasize())\\n }\\n }\\n\\n // Again simply checking that the deployed code is safe too. Contracts can generate\\n // arbitrary deployment code, so there's no easy way to analyze this beforehand.\\n bytes memory deployedCode = Lib_EthUtils.getCode(ethAddress);\\n if (ovmSafetyChecker.isBytecodeSafe(deployedCode) == false) {\\n _revertWithFlag(\\n RevertFlag.UNSAFE_BYTECODE,\\n Lib_ErrorUtils.encodeRevertString(\\\"Constructor attempted to deploy unsafe bytecode.\\\")\\n );\\n }\\n\\n // Contract creation didn't need to be reverted and the bytecode is safe. We finish up by\\n // associating the desired address with the newly created contract's code hash and address.\\n _commitPendingAccount(\\n _address,\\n ethAddress,\\n Lib_EthUtils.getCodeHash(ethAddress)\\n );\\n }\\n\\n /******************************************\\n * Internal Functions: State Manipulation *\\n ******************************************/\\n\\n /**\\n * Checks whether an account exists within the OVM_StateManager.\\n * @param _address Address of the account to check.\\n * @return _exists Whether or not the account exists.\\n */\\n function _hasAccount(\\n address _address\\n )\\n internal\\n returns (\\n bool _exists\\n )\\n {\\n _checkAccountLoad(_address);\\n return ovmStateManager.hasAccount(_address);\\n }\\n\\n /**\\n * Checks whether a known empty account exists within the OVM_StateManager.\\n * @param _address Address of the account to check.\\n * @return _exists Whether or not the account empty exists.\\n */\\n function _hasEmptyAccount(\\n address _address\\n )\\n internal\\n returns (\\n bool _exists\\n )\\n {\\n _checkAccountLoad(_address);\\n return ovmStateManager.hasEmptyAccount(_address);\\n }\\n\\n /**\\n * Sets the nonce of an account.\\n * @param _address Address of the account to modify.\\n * @param _nonce New account nonce.\\n */\\n function _setAccountNonce(\\n address _address,\\n uint256 _nonce\\n )\\n internal\\n {\\n _checkAccountChange(_address);\\n ovmStateManager.setAccountNonce(_address, _nonce);\\n }\\n\\n /**\\n * Gets the nonce of an account.\\n * @param _address Address of the account to access.\\n * @return _nonce Nonce of the account.\\n */\\n function _getAccountNonce(\\n address _address\\n )\\n internal\\n returns (\\n uint256 _nonce\\n )\\n {\\n _checkAccountLoad(_address);\\n return ovmStateManager.getAccountNonce(_address);\\n }\\n\\n /**\\n * Retrieves the Ethereum address of an account.\\n * @param _address Address of the account to access.\\n * @return _ethAddress Corresponding Ethereum address.\\n */\\n function _getAccountEthAddress(\\n address _address\\n )\\n internal\\n returns (\\n address _ethAddress\\n )\\n {\\n _checkAccountLoad(_address);\\n return ovmStateManager.getAccountEthAddress(_address);\\n }\\n\\n /**\\n * Creates the default account object for the given address.\\n * @param _address Address of the account create.\\n */\\n function _initPendingAccount(\\n address _address\\n )\\n internal\\n {\\n // Although it seems like `_checkAccountChange` would be more appropriate here, we don't\\n // actually consider an account \\\"changed\\\" until it's inserted into the state (in this case\\n // by `_commitPendingAccount`).\\n _checkAccountLoad(_address);\\n ovmStateManager.initPendingAccount(_address);\\n }\\n\\n /**\\n * Stores additional relevant data for a new account, thereby \\\"committing\\\" it to the state.\\n * This function is only called during `ovmCREATE` and `ovmCREATE2` after a successful contract\\n * creation.\\n * @param _address Address of the account to commit.\\n * @param _ethAddress Address of the associated deployed contract.\\n * @param _codeHash Hash of the code stored at the address.\\n */\\n function _commitPendingAccount(\\n address _address,\\n address _ethAddress,\\n bytes32 _codeHash\\n )\\n internal\\n {\\n _checkAccountChange(_address);\\n ovmStateManager.commitPendingAccount(\\n _address,\\n _ethAddress,\\n _codeHash\\n );\\n }\\n\\n /**\\n * Retrieves the value of a storage slot.\\n * @param _contract Address of the contract to query.\\n * @param _key 32 byte key of the storage slot.\\n * @return _value 32 byte storage slot value.\\n */\\n function _getContractStorage(\\n address _contract,\\n bytes32 _key\\n )\\n internal\\n returns (\\n bytes32 _value\\n )\\n {\\n _checkContractStorageLoad(_contract, _key);\\n return ovmStateManager.getContractStorage(_contract, _key);\\n }\\n\\n /**\\n * Sets the value of a storage slot.\\n * @param _contract Address of the contract to modify.\\n * @param _key 32 byte key of the storage slot.\\n * @param _value 32 byte storage slot value.\\n */\\n function _putContractStorage(\\n address _contract,\\n bytes32 _key,\\n bytes32 _value\\n )\\n internal\\n {\\n // We don't set storage if the value didn't change. Although this acts as a convenient\\n // optimization, it's also necessary to avoid the case in which a contract with no storage\\n // attempts to store the value \\\"0\\\" at any key. Putting this value (and therefore requiring\\n // that the value be committed into the storage trie after execution) would incorrectly\\n // modify the storage root.\\n if (_getContractStorage(_contract, _key) == _value) {\\n return;\\n }\\n\\n _checkContractStorageChange(_contract, _key);\\n ovmStateManager.putContractStorage(_contract, _key, _value);\\n }\\n\\n /**\\n * Validation whenever a contract needs to be loaded. Checks that the account exists, charges\\n * nuisance gas if the account hasn't been loaded before.\\n * @param _address Address of the account to load.\\n */\\n function _checkAccountLoad(\\n address _address\\n )\\n internal\\n {\\n // See `_checkContractStorageLoad` for more information.\\n if (gasleft() < MIN_GAS_FOR_INVALID_STATE_ACCESS) {\\n _revertWithFlag(RevertFlag.OUT_OF_GAS);\\n }\\n\\n // See `_checkContractStorageLoad` for more information.\\n if (ovmStateManager.hasAccount(_address) == false) {\\n _revertWithFlag(RevertFlag.INVALID_STATE_ACCESS);\\n }\\n\\n // Check whether the account has been loaded before and mark it as loaded if not. We need\\n // this because \\\"nuisance gas\\\" only applies to the first time that an account is loaded.\\n (\\n bool _wasAccountAlreadyLoaded\\n ) = ovmStateManager.testAndSetAccountLoaded(_address);\\n\\n // If we hadn't already loaded the account, then we'll need to charge \\\"nuisance gas\\\" based\\n // on the size of the contract code.\\n if (_wasAccountAlreadyLoaded == false) {\\n _useNuisanceGas(\\n (Lib_EthUtils.getCodeSize(_getAccountEthAddress(_address)) * NUISANCE_GAS_PER_CONTRACT_BYTE) + MIN_NUISANCE_GAS_PER_CONTRACT\\n );\\n }\\n }\\n\\n /**\\n * Validation whenever a contract needs to be changed. Checks that the account exists, charges\\n * nuisance gas if the account hasn't been changed before.\\n * @param _address Address of the account to change.\\n */\\n function _checkAccountChange(\\n address _address\\n )\\n internal\\n {\\n // Start by checking for a load as we only want to charge nuisance gas proportional to\\n // contract size once.\\n _checkAccountLoad(_address);\\n\\n // Check whether the account has been changed before and mark it as changed if not. We need\\n // this because \\\"nuisance gas\\\" only applies to the first time that an account is changed.\\n (\\n bool _wasAccountAlreadyChanged\\n ) = ovmStateManager.testAndSetAccountChanged(_address);\\n\\n // If we hadn't already loaded the account, then we'll need to charge \\\"nuisance gas\\\" based\\n // on the size of the contract code.\\n if (_wasAccountAlreadyChanged == false) {\\n ovmStateManager.incrementTotalUncommittedAccounts();\\n _useNuisanceGas(\\n (Lib_EthUtils.getCodeSize(_getAccountEthAddress(_address)) * NUISANCE_GAS_PER_CONTRACT_BYTE) + MIN_NUISANCE_GAS_PER_CONTRACT\\n );\\n }\\n }\\n\\n /**\\n * Validation whenever a slot needs to be loaded. Checks that the account exists, charges\\n * nuisance gas if the slot hasn't been loaded before.\\n * @param _contract Address of the account to load from.\\n * @param _key 32 byte key to load.\\n */\\n function _checkContractStorageLoad(\\n address _contract,\\n bytes32 _key\\n )\\n internal\\n {\\n // Another case of hidden complexity. If we didn't enforce this requirement, then a\\n // contract could pass in just enough gas to cause the INVALID_STATE_ACCESS check to fail\\n // on L1 but not on L2. A contract could use this behavior to prevent the\\n // OVM_ExecutionManager from detecting an invalid state access. Reverting with OUT_OF_GAS\\n // allows us to also charge for the full message nuisance gas, because you deserve that for\\n // trying to break the contract in this way.\\n if (gasleft() < MIN_GAS_FOR_INVALID_STATE_ACCESS) {\\n _revertWithFlag(RevertFlag.OUT_OF_GAS);\\n }\\n\\n // We need to make sure that the transaction isn't trying to access storage that hasn't\\n // been provided to the OVM_StateManager. We'll immediately abort if this is the case.\\n // We know that we have enough gas to do this check because of the above test.\\n if (ovmStateManager.hasContractStorage(_contract, _key) == false) {\\n _revertWithFlag(RevertFlag.INVALID_STATE_ACCESS);\\n }\\n\\n // Check whether the slot has been loaded before and mark it as loaded if not. We need\\n // this because \\\"nuisance gas\\\" only applies to the first time that a slot is loaded.\\n (\\n bool _wasContractStorageAlreadyLoaded\\n ) = ovmStateManager.testAndSetContractStorageLoaded(_contract, _key);\\n\\n // If we hadn't already loaded the account, then we'll need to charge some fixed amount of\\n // \\\"nuisance gas\\\".\\n if (_wasContractStorageAlreadyLoaded == false) {\\n _useNuisanceGas(NUISANCE_GAS_SLOAD);\\n }\\n }\\n\\n /**\\n * Validation whenever a slot needs to be changed. Checks that the account exists, charges\\n * nuisance gas if the slot hasn't been changed before.\\n * @param _contract Address of the account to change.\\n * @param _key 32 byte key to change.\\n */\\n function _checkContractStorageChange(\\n address _contract,\\n bytes32 _key\\n )\\n internal\\n {\\n // Start by checking for load to make sure we have the storage slot and that we charge the\\n // \\\"nuisance gas\\\" necessary to prove the storage slot state.\\n _checkContractStorageLoad(_contract, _key);\\n\\n // Check whether the slot has been changed before and mark it as changed if not. We need\\n // this because \\\"nuisance gas\\\" only applies to the first time that a slot is changed.\\n (\\n bool _wasContractStorageAlreadyChanged\\n ) = ovmStateManager.testAndSetContractStorageChanged(_contract, _key);\\n\\n // If we hadn't already changed the account, then we'll need to charge some fixed amount of\\n // \\\"nuisance gas\\\".\\n if (_wasContractStorageAlreadyChanged == false) {\\n // Changing a storage slot means that we're also going to have to change the\\n // corresponding account, so do an account change check.\\n _checkAccountChange(_contract);\\n\\n ovmStateManager.incrementTotalUncommittedContractStorage();\\n _useNuisanceGas(NUISANCE_GAS_SSTORE);\\n }\\n }\\n\\n\\n /************************************\\n * Internal Functions: Revert Logic *\\n ************************************/\\n\\n /**\\n * Simple encoding for revert data.\\n * @param _flag Flag to revert with.\\n * @param _data Additional user-provided revert data.\\n * @return _revertdata Encoded revert data.\\n */\\n function _encodeRevertData(\\n RevertFlag _flag,\\n bytes memory _data\\n )\\n internal\\n view\\n returns (\\n bytes memory _revertdata\\n )\\n {\\n // Out of gas and create exceptions will fundamentally return no data, so simulating it shouldn't either.\\n if (\\n _flag == RevertFlag.OUT_OF_GAS\\n ) {\\n return bytes('');\\n }\\n\\n // INVALID_STATE_ACCESS doesn't need to return any data other than the flag.\\n if (_flag == RevertFlag.INVALID_STATE_ACCESS) {\\n return abi.encode(\\n _flag,\\n 0,\\n 0,\\n bytes('')\\n );\\n }\\n\\n // Just ABI encode the rest of the parameters.\\n return abi.encode(\\n _flag,\\n messageRecord.nuisanceGasLeft,\\n transactionRecord.ovmGasRefund,\\n _data\\n );\\n }\\n\\n /**\\n * Simple decoding for revert data.\\n * @param _revertdata Revert data to decode.\\n * @return _flag Flag used to revert.\\n * @return _nuisanceGasLeft Amount of nuisance gas unused by the message.\\n * @return _ovmGasRefund Amount of gas refunded during the message.\\n * @return _data Additional user-provided revert data.\\n */\\n function _decodeRevertData(\\n bytes memory _revertdata\\n )\\n internal\\n pure\\n returns (\\n RevertFlag _flag,\\n uint256 _nuisanceGasLeft,\\n uint256 _ovmGasRefund,\\n bytes memory _data\\n )\\n {\\n // A length of zero means the call ran out of gas, just return empty data.\\n if (_revertdata.length == 0) {\\n return (\\n RevertFlag.OUT_OF_GAS,\\n 0,\\n 0,\\n bytes('')\\n );\\n }\\n\\n // ABI decode the incoming data.\\n return abi.decode(_revertdata, (RevertFlag, uint256, uint256, bytes));\\n }\\n\\n /**\\n * Causes a message to revert or abort.\\n * @param _flag Flag to revert with.\\n * @param _data Additional user-provided data.\\n */\\n function _revertWithFlag(\\n RevertFlag _flag,\\n bytes memory _data\\n )\\n internal\\n view\\n {\\n bytes memory revertdata = _encodeRevertData(\\n _flag,\\n _data\\n );\\n\\n assembly {\\n revert(add(revertdata, 0x20), mload(revertdata))\\n }\\n }\\n\\n /**\\n * Causes a message to revert or abort.\\n * @param _flag Flag to revert with.\\n */\\n function _revertWithFlag(\\n RevertFlag _flag\\n )\\n internal\\n {\\n _revertWithFlag(_flag, bytes(''));\\n }\\n\\n\\n /******************************************\\n * Internal Functions: Nuisance Gas Logic *\\n ******************************************/\\n\\n /**\\n * Computes the nuisance gas limit from the gas limit.\\n * @dev This function is currently using a naive implementation whereby the nuisance gas limit\\n * is set to exactly equal the lesser of the gas limit or remaining gas. It's likely that\\n * this implementation is perfectly fine, but we may change this formula later.\\n * @param _gasLimit Gas limit to compute from.\\n * @return _nuisanceGasLimit Computed nuisance gas limit.\\n */\\n function _getNuisanceGasLimit(\\n uint256 _gasLimit\\n )\\n internal\\n view\\n returns (\\n uint256 _nuisanceGasLimit\\n )\\n {\\n return _gasLimit < gasleft() ? _gasLimit : gasleft();\\n }\\n\\n /**\\n * Uses a certain amount of nuisance gas.\\n * @param _amount Amount of nuisance gas to use.\\n */\\n function _useNuisanceGas(\\n uint256 _amount\\n )\\n internal\\n {\\n // Essentially the same as a standard OUT_OF_GAS, except we also retain a record of the gas\\n // refund to be given at the end of the transaction.\\n if (messageRecord.nuisanceGasLeft < _amount) {\\n _revertWithFlag(RevertFlag.EXCEEDS_NUISANCE_GAS);\\n }\\n\\n messageRecord.nuisanceGasLeft -= _amount;\\n }\\n\\n\\n /************************************\\n * Internal Functions: Gas Metering *\\n ************************************/\\n\\n /**\\n * Checks whether a transaction needs to start a new epoch and does so if necessary.\\n * @param _timestamp Transaction timestamp.\\n */\\n function _checkNeedsNewEpoch(\\n uint256 _timestamp\\n )\\n internal\\n {\\n if (\\n _timestamp >= (\\n _getGasMetadata(GasMetadataKey.CURRENT_EPOCH_START_TIMESTAMP)\\n + gasMeterConfig.secondsPerEpoch\\n )\\n ) {\\n _putGasMetadata(\\n GasMetadataKey.CURRENT_EPOCH_START_TIMESTAMP,\\n _timestamp\\n );\\n\\n _putGasMetadata(\\n GasMetadataKey.PREV_EPOCH_SEQUENCER_QUEUE_GAS,\\n _getGasMetadata(\\n GasMetadataKey.CUMULATIVE_SEQUENCER_QUEUE_GAS\\n )\\n );\\n\\n _putGasMetadata(\\n GasMetadataKey.PREV_EPOCH_L1TOL2_QUEUE_GAS,\\n _getGasMetadata(\\n GasMetadataKey.CUMULATIVE_L1TOL2_QUEUE_GAS\\n )\\n );\\n }\\n }\\n\\n /**\\n * Validates the input values of a transaction.\\n * @return _valid Whether or not the transaction data is valid.\\n */\\n function _isValidInput(\\n Lib_OVMCodec.Transaction memory _transaction\\n )\\n view\\n internal\\n returns (\\n bool\\n )\\n {\\n // Prevent reentrancy to run():\\n // This check prevents calling run with the default ovmNumber.\\n // Combined with the first check in run():\\n // if (transactionContext.ovmNUMBER != DEFAULT_UINT256) { return; }\\n // It should be impossible to re-enter since run() returns before any other call frames are created.\\n // Since this value is already being written to storage, we save much gas compared to\\n // using the standard nonReentrant pattern.\\n if (_transaction.blockNumber == DEFAULT_UINT256) {\\n return false;\\n }\\n\\n if (_isValidGasLimit(_transaction.gasLimit, _transaction.l1QueueOrigin) == false) {\\n return false;\\n }\\n\\n return true;\\n }\\n\\n /**\\n * Validates the gas limit for a given transaction.\\n * @param _gasLimit Gas limit provided by the transaction.\\n * param _queueOrigin Queue from which the transaction originated.\\n * @return _valid Whether or not the gas limit is valid.\\n */\\n function _isValidGasLimit(\\n uint256 _gasLimit,\\n Lib_OVMCodec.QueueOrigin // _queueOrigin\\n )\\n view\\n internal\\n returns (\\n bool _valid\\n )\\n {\\n // Always have to be below the maximum gas limit.\\n if (_gasLimit > gasMeterConfig.maxTransactionGasLimit) {\\n return false;\\n }\\n\\n // Always have to be above the minimum gas limit.\\n if (_gasLimit < gasMeterConfig.minTransactionGasLimit) {\\n return false;\\n }\\n\\n // TEMPORARY: Gas metering is disabled for minnet.\\n return true;\\n // GasMetadataKey cumulativeGasKey;\\n // GasMetadataKey prevEpochGasKey;\\n // if (_queueOrigin == Lib_OVMCodec.QueueOrigin.SEQUENCER_QUEUE) {\\n // cumulativeGasKey = GasMetadataKey.CUMULATIVE_SEQUENCER_QUEUE_GAS;\\n // prevEpochGasKey = GasMetadataKey.PREV_EPOCH_SEQUENCER_QUEUE_GAS;\\n // } else {\\n // cumulativeGasKey = GasMetadataKey.CUMULATIVE_L1TOL2_QUEUE_GAS;\\n // prevEpochGasKey = GasMetadataKey.PREV_EPOCH_L1TOL2_QUEUE_GAS;\\n // }\\n\\n // return (\\n // (\\n // _getGasMetadata(cumulativeGasKey)\\n // - _getGasMetadata(prevEpochGasKey)\\n // + _gasLimit\\n // ) < gasMeterConfig.maxGasPerQueuePerEpoch\\n // );\\n }\\n\\n /**\\n * Updates the cumulative gas after a transaction.\\n * @param _gasUsed Gas used by the transaction.\\n * @param _queueOrigin Queue from which the transaction originated.\\n */\\n function _updateCumulativeGas(\\n uint256 _gasUsed,\\n Lib_OVMCodec.QueueOrigin _queueOrigin\\n )\\n internal\\n {\\n GasMetadataKey cumulativeGasKey;\\n if (_queueOrigin == Lib_OVMCodec.QueueOrigin.SEQUENCER_QUEUE) {\\n cumulativeGasKey = GasMetadataKey.CUMULATIVE_SEQUENCER_QUEUE_GAS;\\n } else {\\n cumulativeGasKey = GasMetadataKey.CUMULATIVE_L1TOL2_QUEUE_GAS;\\n }\\n\\n _putGasMetadata(\\n cumulativeGasKey,\\n (\\n _getGasMetadata(cumulativeGasKey)\\n + gasMeterConfig.minTransactionGasLimit\\n + _gasUsed\\n - transactionRecord.ovmGasRefund\\n )\\n );\\n }\\n\\n /**\\n * Retrieves the value of a gas metadata key.\\n * @param _key Gas metadata key to retrieve.\\n * @return _value Value stored at the given key.\\n */\\n function _getGasMetadata(\\n GasMetadataKey _key\\n )\\n internal\\n returns (\\n uint256 _value\\n )\\n {\\n return uint256(_getContractStorage(\\n GAS_METADATA_ADDRESS,\\n bytes32(uint256(_key))\\n ));\\n }\\n\\n /**\\n * Sets the value of a gas metadata key.\\n * @param _key Gas metadata key to set.\\n * @param _value Value to store at the given key.\\n */\\n function _putGasMetadata(\\n GasMetadataKey _key,\\n uint256 _value\\n )\\n internal\\n {\\n _putContractStorage(\\n GAS_METADATA_ADDRESS,\\n bytes32(uint256(_key)),\\n bytes32(uint256(_value))\\n );\\n }\\n\\n\\n /*****************************************\\n * Internal Functions: Execution Context *\\n *****************************************/\\n\\n /**\\n * Swaps over to a new message context.\\n * @param _prevMessageContext Context we're switching from.\\n * @param _nextMessageContext Context we're switching to.\\n */\\n function _switchMessageContext(\\n MessageContext memory _prevMessageContext,\\n MessageContext memory _nextMessageContext\\n )\\n internal\\n {\\n // Avoid unnecessary the SSTORE.\\n if (_prevMessageContext.ovmCALLER != _nextMessageContext.ovmCALLER) {\\n messageContext.ovmCALLER = _nextMessageContext.ovmCALLER;\\n }\\n\\n // Avoid unnecessary the SSTORE.\\n if (_prevMessageContext.ovmADDRESS != _nextMessageContext.ovmADDRESS) {\\n messageContext.ovmADDRESS = _nextMessageContext.ovmADDRESS;\\n }\\n\\n // Avoid unnecessary the SSTORE.\\n if (_prevMessageContext.isStatic != _nextMessageContext.isStatic) {\\n messageContext.isStatic = _nextMessageContext.isStatic;\\n }\\n }\\n\\n /**\\n * Initializes the execution context.\\n * @param _transaction OVM transaction being executed.\\n */\\n function _initContext(\\n Lib_OVMCodec.Transaction memory _transaction\\n )\\n internal\\n {\\n transactionContext.ovmTIMESTAMP = _transaction.timestamp;\\n transactionContext.ovmNUMBER = _transaction.blockNumber;\\n transactionContext.ovmTXGASLIMIT = _transaction.gasLimit;\\n transactionContext.ovmL1QUEUEORIGIN = _transaction.l1QueueOrigin;\\n transactionContext.ovmL1TXORIGIN = _transaction.l1TxOrigin;\\n transactionContext.ovmGASLIMIT = gasMeterConfig.maxGasPerQueuePerEpoch;\\n\\n messageRecord.nuisanceGasLeft = _getNuisanceGasLimit(_transaction.gasLimit);\\n }\\n\\n /**\\n * Resets the transaction and message context.\\n */\\n function _resetContext()\\n internal\\n {\\n transactionContext.ovmL1TXORIGIN = DEFAULT_ADDRESS;\\n transactionContext.ovmTIMESTAMP = DEFAULT_UINT256;\\n transactionContext.ovmNUMBER = DEFAULT_UINT256;\\n transactionContext.ovmGASLIMIT = DEFAULT_UINT256;\\n transactionContext.ovmTXGASLIMIT = DEFAULT_UINT256;\\n transactionContext.ovmL1QUEUEORIGIN = Lib_OVMCodec.QueueOrigin.SEQUENCER_QUEUE;\\n\\n transactionRecord.ovmGasRefund = DEFAULT_UINT256;\\n\\n messageContext.ovmCALLER = DEFAULT_ADDRESS;\\n messageContext.ovmADDRESS = DEFAULT_ADDRESS;\\n messageContext.isStatic = false;\\n\\n messageRecord.nuisanceGasLeft = DEFAULT_UINT256;\\n\\n // Reset the ovmStateManager.\\n ovmStateManager = iOVM_StateManager(address(0));\\n }\\n\\n /*****************************\\n * L2-only Helper Functions *\\n *****************************/\\n\\n /**\\n * Unreachable helper function for simulating eth_calls with an OVM message context.\\n * This function will throw an exception in all cases other than when used as a custom entrypoint in L2 Geth to simulate eth_call.\\n * @param _transaction the message transaction to simulate.\\n * @param _from the OVM account the simulated call should be from.\\n */\\n function simulateMessage(\\n Lib_OVMCodec.Transaction memory _transaction,\\n address _from,\\n iOVM_StateManager _ovmStateManager\\n )\\n external\\n returns (\\n bytes memory\\n )\\n {\\n // Prevent this call from having any effect unless in a custom-set VM frame\\n require(msg.sender == address(0));\\n\\n ovmStateManager = _ovmStateManager;\\n _initContext(_transaction);\\n messageRecord.nuisanceGasLeft = uint(-1);\\n\\n messageContext.ovmADDRESS = _from;\\n\\n bool isCreate = _transaction.entrypoint == address(0);\\n if (isCreate) {\\n (address created, bytes memory revertData) = ovmCREATE(_transaction.data);\\n if (created == address(0)) {\\n return abi.encode(false, revertData);\\n } else {\\n // The eth_call RPC endpoint for to = undefined will return the deployed bytecode\\n // in the success case, differing from standard create messages.\\n return abi.encode(true, Lib_EthUtils.getCode(created));\\n }\\n } else {\\n (bool success, bytes memory returndata) = ovmCALL(\\n _transaction.gasLimit,\\n _transaction.entrypoint,\\n _transaction.data\\n );\\n return abi.encode(success, returndata);\\n }\\n }\\n}\\n\",\"keccak256\":\"0x2d8c32b3438f9b9da37e33430527e12658178bd96b0863e20bd02fcaaf162cd4\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/predeploys/OVM_DeployerWhitelist.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Interface Imports */\\nimport { iOVM_DeployerWhitelist } from \\\"../../iOVM/predeploys/iOVM_DeployerWhitelist.sol\\\";\\n\\n/**\\n * @title OVM_DeployerWhitelist\\n * @dev The Deployer Whitelist is a temporary predeploy used to provide additional safety during the\\n * initial phases of our mainnet roll out. It is owned by the Optimism team, and defines accounts\\n * which are allowed to deploy contracts on Layer2. The Execution Manager will only allow an\\n * ovmCREATE or ovmCREATE2 operation to proceed if the deployer's address whitelisted.\\n *\\n * Compiler used: optimistic-solc\\n * Runtime target: OVM\\n */\\ncontract OVM_DeployerWhitelist is iOVM_DeployerWhitelist {\\n\\n /**********************\\n * Contract Constants *\\n **********************/\\n\\n bool public initialized;\\n bool public allowArbitraryDeployment;\\n address override public owner;\\n mapping (address => bool) public whitelist;\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n /**\\n * Blocks functions to anyone except the contract owner.\\n */\\n modifier onlyOwner() {\\n require(\\n msg.sender == owner,\\n \\\"Function can only be called by the owner of this contract.\\\"\\n );\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Initializes the whitelist.\\n * @param _owner Address of the owner for this contract.\\n * @param _allowArbitraryDeployment Whether or not to allow arbitrary contract deployment.\\n */\\n function initialize(\\n address _owner,\\n bool _allowArbitraryDeployment\\n )\\n override\\n external\\n {\\n if (initialized == true) {\\n return;\\n }\\n\\n initialized = true;\\n allowArbitraryDeployment = _allowArbitraryDeployment;\\n owner = _owner;\\n }\\n\\n /**\\n * Adds or removes an address from the deployment whitelist.\\n * @param _deployer Address to update permissions for.\\n * @param _isWhitelisted Whether or not the address is whitelisted.\\n */\\n function setWhitelistedDeployer(\\n address _deployer,\\n bool _isWhitelisted\\n )\\n override\\n external\\n onlyOwner\\n {\\n whitelist[_deployer] = _isWhitelisted;\\n }\\n\\n /**\\n * Updates the owner of this contract.\\n * @param _owner Address of the new owner.\\n */\\n function setOwner(\\n address _owner\\n )\\n override\\n public\\n onlyOwner\\n {\\n owner = _owner;\\n }\\n\\n /**\\n * Updates the arbitrary deployment flag.\\n * @param _allowArbitraryDeployment Whether or not to allow arbitrary contract deployment.\\n */\\n function setAllowArbitraryDeployment(\\n bool _allowArbitraryDeployment\\n )\\n override\\n public\\n onlyOwner\\n {\\n allowArbitraryDeployment = _allowArbitraryDeployment;\\n }\\n\\n /**\\n * Permanently enables arbitrary contract deployment and deletes the owner.\\n */\\n function enableArbitraryContractDeployment()\\n override\\n external\\n onlyOwner\\n {\\n setAllowArbitraryDeployment(true);\\n setOwner(address(0));\\n }\\n\\n /**\\n * Checks whether an address is allowed to deploy contracts.\\n * @param _deployer Address to check.\\n * @return _allowed Whether or not the address can deploy contracts.\\n */\\n function isDeployerAllowed(\\n address _deployer\\n )\\n override\\n external\\n returns (\\n bool\\n )\\n {\\n return (\\n initialized == false\\n || allowArbitraryDeployment == true\\n || whitelist[_deployer]\\n );\\n }\\n}\\n\",\"keccak256\":\"0xb96bfb8eb24503b05de41483cc9fb7a7f81107aa1ca146dc281952f8100848a0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_CanonicalTransactionChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_ChainStorageContainer } from \\\"./iOVM_ChainStorageContainer.sol\\\";\\n\\n/**\\n * @title iOVM_CanonicalTransactionChain\\n */\\ninterface iOVM_CanonicalTransactionChain {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event TransactionEnqueued(\\n address _l1TxOrigin,\\n address _target,\\n uint256 _gasLimit,\\n bytes _data,\\n uint256 _queueIndex,\\n uint256 _timestamp\\n );\\n\\n event QueueBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event SequencerBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event TransactionBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct BatchContext {\\n uint256 numSequencedTransactions;\\n uint256 numSubsequentQueueTransactions;\\n uint256 timestamp;\\n uint256 blockNumber;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n\\n /**\\n * Accesses the batch storage container.\\n * @return Reference to the batch storage container.\\n */\\n function batches()\\n external\\n view\\n returns (\\n iOVM_ChainStorageContainer\\n );\\n\\n /**\\n * Accesses the queue storage container.\\n * @return Reference to the queue storage container.\\n */\\n function queue()\\n external\\n view\\n returns (\\n iOVM_ChainStorageContainer\\n );\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements()\\n external\\n view\\n returns (\\n uint256 _totalElements\\n );\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches()\\n external\\n view\\n returns (\\n uint256 _totalBatches\\n );\\n\\n /**\\n * Returns the index of the next element to be enqueued.\\n * @return Index for the next queue element.\\n */\\n function getNextQueueIndex()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Gets the queue element at a particular index.\\n * @param _index Index of the queue element to access.\\n * @return _element Queue element at the given index.\\n */\\n function getQueueElement(\\n uint256 _index\\n )\\n external\\n view\\n returns (\\n Lib_OVMCodec.QueueElement memory _element\\n );\\n\\n /**\\n * Returns the timestamp of the last transaction.\\n * @return Timestamp for the last transaction.\\n */\\n function getLastTimestamp()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Returns the blocknumber of the last transaction.\\n * @return Blocknumber for the last transaction.\\n */\\n function getLastBlockNumber()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Get the number of queue elements which have not yet been included.\\n * @return Number of pending queue elements.\\n */\\n function getNumPendingQueueElements()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Retrieves the length of the queue, including\\n * both pending and canonical transactions.\\n * @return Length of the queue.\\n */\\n function getQueueLength()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n\\n /**\\n * Adds a transaction to the queue.\\n * @param _target Target contract to send the transaction to.\\n * @param _gasLimit Gas limit for the given transaction.\\n * @param _data Transaction data.\\n */\\n function enqueue(\\n address _target,\\n uint256 _gasLimit,\\n bytes memory _data\\n )\\n external;\\n\\n /**\\n * Appends a given number of queued transactions as a single batch.\\n * @param _numQueuedTransactions Number of transactions to append.\\n */\\n function appendQueueBatch(\\n uint256 _numQueuedTransactions\\n )\\n external;\\n\\n /**\\n * Allows the sequencer to append a batch of transactions.\\n * @dev This function uses a custom encoding scheme for efficiency reasons.\\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\\n * .param _contexts Array of batch contexts.\\n * .param _transactionDataFields Array of raw transaction data.\\n */\\n function appendSequencerBatch(\\n // uint40 _shouldStartAtElement,\\n // uint24 _totalElementsToAppend,\\n // BatchContext[] _contexts,\\n // bytes[] _transactionDataFields\\n )\\n external;\\n\\n /**\\n * Verifies whether a transaction is included in the chain.\\n * @param _transaction Transaction to verify.\\n * @param _txChainElement Transaction chain element corresponding to the transaction.\\n * @param _batchHeader Header of the batch the transaction was included in.\\n * @param _inclusionProof Inclusion proof for the provided transaction chain element.\\n * @return True if the transaction exists in the CTC, false if not.\\n */\\n function verifyTransaction(\\n Lib_OVMCodec.Transaction memory _transaction,\\n Lib_OVMCodec.TransactionChainElement memory _txChainElement,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _inclusionProof\\n )\\n external\\n view\\n returns (\\n bool\\n );\\n}\\n\",\"keccak256\":\"0xb5e55488a1982841c07cdf5ff475da4789596f111dd48f01b1918ee4c775cf3a\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_ChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title iOVM_ChainStorageContainer\\n */\\ninterface iOVM_ChainStorageContainer {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata()\\n external\\n view\\n returns (\\n bytes27\\n );\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length()\\n external\\n view\\n returns (\\n uint256\\n );\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(\\n bytes32 _object\\n )\\n external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(\\n bytes32 _object,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(\\n uint256 _index\\n )\\n external\\n view\\n returns (\\n bytes32\\n );\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index\\n )\\n external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Marks an index as overwritable, meaing the underlying buffer can start to write values over\\n * any objects before and including the given index.\\n */\\n function setNextOverwritableIndex(\\n uint256 _index\\n )\\n external;\\n}\\n\",\"keccak256\":\"0x2d7973a0ad84c23ec62624d3f1e3aeb198cc72686ff1e6cfa17155556b320c94\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/execution/iOVM_ExecutionManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\ninterface iOVM_ExecutionManager {\\n /**********\\n * Enums *\\n *********/\\n\\n enum RevertFlag {\\n OUT_OF_GAS,\\n INTENTIONAL_REVERT,\\n EXCEEDS_NUISANCE_GAS,\\n INVALID_STATE_ACCESS,\\n UNSAFE_BYTECODE,\\n CREATE_COLLISION,\\n STATIC_VIOLATION,\\n CREATOR_NOT_ALLOWED\\n }\\n\\n enum GasMetadataKey {\\n CURRENT_EPOCH_START_TIMESTAMP,\\n CUMULATIVE_SEQUENCER_QUEUE_GAS,\\n CUMULATIVE_L1TOL2_QUEUE_GAS,\\n PREV_EPOCH_SEQUENCER_QUEUE_GAS,\\n PREV_EPOCH_L1TOL2_QUEUE_GAS\\n }\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct GasMeterConfig {\\n uint256 minTransactionGasLimit;\\n uint256 maxTransactionGasLimit;\\n uint256 maxGasPerQueuePerEpoch;\\n uint256 secondsPerEpoch;\\n }\\n\\n struct GlobalContext {\\n uint256 ovmCHAINID;\\n }\\n\\n struct TransactionContext {\\n Lib_OVMCodec.QueueOrigin ovmL1QUEUEORIGIN;\\n uint256 ovmTIMESTAMP;\\n uint256 ovmNUMBER;\\n uint256 ovmGASLIMIT;\\n uint256 ovmTXGASLIMIT;\\n address ovmL1TXORIGIN;\\n }\\n\\n struct TransactionRecord {\\n uint256 ovmGasRefund;\\n }\\n\\n struct MessageContext {\\n address ovmCALLER;\\n address ovmADDRESS;\\n bool isStatic;\\n }\\n\\n struct MessageRecord {\\n uint256 nuisanceGasLeft;\\n }\\n\\n\\n /************************************\\n * Transaction Execution Entrypoint *\\n ************************************/\\n\\n function run(\\n Lib_OVMCodec.Transaction calldata _transaction,\\n address _txStateManager\\n ) external returns (bytes memory);\\n\\n\\n /*******************\\n * Context Opcodes *\\n *******************/\\n\\n function ovmCALLER() external view returns (address _caller);\\n function ovmADDRESS() external view returns (address _address);\\n function ovmTIMESTAMP() external view returns (uint256 _timestamp);\\n function ovmNUMBER() external view returns (uint256 _number);\\n function ovmGASLIMIT() external view returns (uint256 _gasLimit);\\n function ovmCHAINID() external view returns (uint256 _chainId);\\n\\n\\n /**********************\\n * L2 Context Opcodes *\\n **********************/\\n\\n function ovmL1QUEUEORIGIN() external view returns (Lib_OVMCodec.QueueOrigin _queueOrigin);\\n function ovmL1TXORIGIN() external view returns (address _l1TxOrigin);\\n\\n\\n /*******************\\n * Halting Opcodes *\\n *******************/\\n\\n function ovmREVERT(bytes memory _data) external;\\n\\n\\n /*****************************\\n * Contract Creation Opcodes *\\n *****************************/\\n\\n function ovmCREATE(bytes memory _bytecode) external returns (address _contract, bytes memory _revertdata);\\n function ovmCREATE2(bytes memory _bytecode, bytes32 _salt) external returns (address _contract, bytes memory _revertdata);\\n\\n\\n /*******************************\\n * Account Abstraction Opcodes *\\n ******************************/\\n\\n function ovmGETNONCE() external returns (uint256 _nonce);\\n function ovmINCREMENTNONCE() external;\\n function ovmCREATEEOA(bytes32 _messageHash, uint8 _v, bytes32 _r, bytes32 _s) external;\\n\\n\\n /****************************\\n * Contract Calling Opcodes *\\n ****************************/\\n\\n function ovmCALL(uint256 _gasLimit, address _address, bytes memory _calldata) external returns (bool _success, bytes memory _returndata);\\n function ovmSTATICCALL(uint256 _gasLimit, address _address, bytes memory _calldata) external returns (bool _success, bytes memory _returndata);\\n function ovmDELEGATECALL(uint256 _gasLimit, address _address, bytes memory _calldata) external returns (bool _success, bytes memory _returndata);\\n\\n\\n /****************************\\n * Contract Storage Opcodes *\\n ****************************/\\n\\n function ovmSLOAD(bytes32 _key) external returns (bytes32 _value);\\n function ovmSSTORE(bytes32 _key, bytes32 _value) external;\\n\\n\\n /*************************\\n * Contract Code Opcodes *\\n *************************/\\n\\n function ovmEXTCODECOPY(address _contract, uint256 _offset, uint256 _length) external returns (bytes memory _code);\\n function ovmEXTCODESIZE(address _contract) external returns (uint256 _size);\\n function ovmEXTCODEHASH(address _contract) external returns (bytes32 _hash);\\n\\n\\n /***************************************\\n * Public Functions: Execution Context *\\n ***************************************/\\n\\n function getMaxTransactionGasLimit() external view returns (uint _maxTransactionGasLimit);\\n}\\n\",\"keccak256\":\"0xf023d5d6fc6a03bd52f7a57af6e21076de77e8925d065bb79db062e73e43b684\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/execution/iOVM_SafetyChecker.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title iOVM_SafetyChecker\\n */\\ninterface iOVM_SafetyChecker {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function isBytecodeSafe(bytes calldata _bytecode) external pure returns (bool);\\n}\\n\",\"keccak256\":\"0xde6639676d4ec4f77297652d5ede2429bc93e74e11fefd9e9de4bc92dd784878\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/execution/iOVM_StateManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title iOVM_StateManager\\n */\\ninterface iOVM_StateManager {\\n\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n enum ItemState {\\n ITEM_UNTOUCHED,\\n ITEM_LOADED,\\n ITEM_CHANGED,\\n ITEM_COMMITTED\\n }\\n\\n /***************************\\n * Public Functions: Misc *\\n ***************************/\\n\\n function isAuthenticated(address _address) external view returns (bool);\\n\\n /***************************\\n * Public Functions: Setup *\\n ***************************/\\n\\n function owner() external view returns (address _owner);\\n function ovmExecutionManager() external view returns (address _ovmExecutionManager);\\n function setExecutionManager(address _ovmExecutionManager) external;\\n\\n\\n /************************************\\n * Public Functions: Account Access *\\n ************************************/\\n\\n function putAccount(address _address, Lib_OVMCodec.Account memory _account) external;\\n function putEmptyAccount(address _address) external;\\n function getAccount(address _address) external view returns (Lib_OVMCodec.Account memory _account);\\n function hasAccount(address _address) external view returns (bool _exists);\\n function hasEmptyAccount(address _address) external view returns (bool _exists);\\n function setAccountNonce(address _address, uint256 _nonce) external;\\n function getAccountNonce(address _address) external view returns (uint256 _nonce);\\n function getAccountEthAddress(address _address) external view returns (address _ethAddress);\\n function getAccountStorageRoot(address _address) external view returns (bytes32 _storageRoot);\\n function initPendingAccount(address _address) external;\\n function commitPendingAccount(address _address, address _ethAddress, bytes32 _codeHash) external;\\n function testAndSetAccountLoaded(address _address) external returns (bool _wasAccountAlreadyLoaded);\\n function testAndSetAccountChanged(address _address) external returns (bool _wasAccountAlreadyChanged);\\n function commitAccount(address _address) external returns (bool _wasAccountCommitted);\\n function incrementTotalUncommittedAccounts() external;\\n function getTotalUncommittedAccounts() external view returns (uint256 _total);\\n function wasAccountChanged(address _address) external view returns (bool);\\n function wasAccountCommitted(address _address) external view returns (bool);\\n\\n\\n /************************************\\n * Public Functions: Storage Access *\\n ************************************/\\n\\n function putContractStorage(address _contract, bytes32 _key, bytes32 _value) external;\\n function getContractStorage(address _contract, bytes32 _key) external view returns (bytes32 _value);\\n function hasContractStorage(address _contract, bytes32 _key) external view returns (bool _exists);\\n function testAndSetContractStorageLoaded(address _contract, bytes32 _key) external returns (bool _wasContractStorageAlreadyLoaded);\\n function testAndSetContractStorageChanged(address _contract, bytes32 _key) external returns (bool _wasContractStorageAlreadyChanged);\\n function commitContractStorage(address _contract, bytes32 _key) external returns (bool _wasContractStorageCommitted);\\n function incrementTotalUncommittedContractStorage() external;\\n function getTotalUncommittedContractStorage() external view returns (uint256 _total);\\n function wasContractStorageChanged(address _contract, bytes32 _key) external view returns (bool);\\n function wasContractStorageCommitted(address _contract, bytes32 _key) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x7a11dbd1f61593ba34debe07e39eef59967307f7f372ba9855bee0953585d08d\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/predeploys/iOVM_DeployerWhitelist.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title iOVM_DeployerWhitelist\\n */\\ninterface iOVM_DeployerWhitelist {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function initialize(address _owner, bool _allowArbitraryDeployment) external;\\n function owner() external returns (address _owner);\\n function setWhitelistedDeployer(address _deployer, bool _isWhitelisted) external;\\n function setOwner(address _newOwner) external;\\n function setAllowArbitraryDeployment(bool _allowArbitraryDeployment) external;\\n function enableArbitraryContractDeployment() external;\\n function isDeployerAllowed(address _deployer) external returns (bool _allowed);\\n}\\n\",\"keccak256\":\"0xdf1f27faf0d26d416bf6d408d146a16de32b4e1772a292c65d39eb7ec2b53ceb\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/codec/Lib_OVMCodec.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../utils/Lib_Bytes32Utils.sol\\\";\\n\\n/**\\n * @title Lib_OVMCodec\\n */\\nlibrary Lib_OVMCodec {\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum QueueOrigin {\\n SEQUENCER_QUEUE,\\n L1TOL2_QUEUE\\n }\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Account {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n address ethAddress;\\n bool isFresh;\\n }\\n\\n struct EVMAccount {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n }\\n\\n struct ChainBatchHeader {\\n uint256 batchIndex;\\n bytes32 batchRoot;\\n uint256 batchSize;\\n uint256 prevTotalElements;\\n bytes extraData;\\n }\\n\\n struct ChainInclusionProof {\\n uint256 index;\\n bytes32[] siblings;\\n }\\n\\n struct Transaction {\\n uint256 timestamp;\\n uint256 blockNumber;\\n QueueOrigin l1QueueOrigin;\\n address l1TxOrigin;\\n address entrypoint;\\n uint256 gasLimit;\\n bytes data;\\n }\\n\\n struct TransactionChainElement {\\n bool isSequenced;\\n uint256 queueIndex; // QUEUED TX ONLY\\n uint256 timestamp; // SEQUENCER TX ONLY\\n uint256 blockNumber; // SEQUENCER TX ONLY\\n bytes txData; // SEQUENCER TX ONLY\\n }\\n\\n struct QueueElement {\\n bytes32 transactionHash;\\n uint40 timestamp;\\n uint40 blockNumber;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Encodes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Encoded transaction bytes.\\n */\\n function encodeTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return abi.encodePacked(\\n _transaction.timestamp,\\n _transaction.blockNumber,\\n _transaction.l1QueueOrigin,\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n );\\n }\\n\\n /**\\n * Hashes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Hashed transaction\\n */\\n function hashTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(encodeTransaction(_transaction));\\n }\\n\\n /**\\n * Converts an OVM account to an EVM account.\\n * @param _in OVM account to convert.\\n * @return Converted EVM account.\\n */\\n function toEVMAccount(\\n Account memory _in\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n return EVMAccount({\\n nonce: _in.nonce,\\n balance: _in.balance,\\n storageRoot: _in.storageRoot,\\n codeHash: _in.codeHash\\n });\\n }\\n\\n /**\\n * @notice RLP-encodes an account state struct.\\n * @param _account Account state struct.\\n * @return RLP-encoded account state.\\n */\\n function encodeEVMAccount(\\n EVMAccount memory _account\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes[] memory raw = new bytes[](4);\\n\\n // Unfortunately we can't create this array outright because\\n // Lib_RLPWriter.writeList will reject fixed-size arrays. Assigning\\n // index-by-index circumvents this issue.\\n raw[0] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.nonce)\\n )\\n );\\n raw[1] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.balance)\\n )\\n );\\n raw[2] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.storageRoot));\\n raw[3] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.codeHash));\\n\\n return Lib_RLPWriter.writeList(raw);\\n }\\n\\n /**\\n * @notice Decodes an RLP-encoded account state into a useful struct.\\n * @param _encoded RLP-encoded account state.\\n * @return Account state struct.\\n */\\n function decodeEVMAccount(\\n bytes memory _encoded\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\\n\\n return EVMAccount({\\n nonce: Lib_RLPReader.readUint256(accountState[0]),\\n balance: Lib_RLPReader.readUint256(accountState[1]),\\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\\n });\\n }\\n\\n /**\\n * Calculates a hash for a given batch header.\\n * @param _batchHeader Header to hash.\\n * @return Hash of the header.\\n */\\n function hashBatchHeader(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(\\n abi.encode(\\n _batchHeader.batchRoot,\\n _batchHeader.batchSize,\\n _batchHeader.prevTotalElements,\\n _batchHeader.extraData\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0xd85ba2066057a2677926f484b938c7c2ef33ff3853f3b71cda252f4a54f30e05\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n external\\n onlyOwner\\n {\\n addresses[_getNameHash(_name)] = _address;\\n\\n emit AddressSet(\\n _name,\\n _address\\n );\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(\\n string memory _name\\n )\\n external\\n view\\n returns (\\n address\\n )\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xcc9fc5c64f1101a5c6c397594086b1608189a9edc5c9635e1ac38f70aeeeecbf\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(\\n address _libAddressManager\\n ) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x65981feeabff6a81783ea97d44baf988a18a86c8cb374c46fdb71819cbacc7c0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPReader.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_RLPReader\\n * @dev Adapted from \\\"RLPReader\\\" by Hamdi Allam (hamdi.allam97@gmail.com).\\n */\\nlibrary Lib_RLPReader {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 constant internal MAX_LIST_LENGTH = 32;\\n\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum RLPItemType {\\n DATA_ITEM,\\n LIST_ITEM\\n }\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct RLPItem {\\n uint256 length;\\n uint256 ptr;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts bytes to a reference to memory position and length.\\n * @param _in Input bytes to convert.\\n * @return Output memory reference.\\n */\\n function toRLPItem(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem memory\\n )\\n {\\n uint256 ptr;\\n assembly {\\n ptr := add(_in, 32)\\n }\\n\\n return RLPItem({\\n length: _in.length,\\n ptr: ptr\\n });\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n (\\n uint256 listOffset,\\n ,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.LIST_ITEM,\\n \\\"Invalid RLP list value.\\\"\\n );\\n\\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\\n // writing to the length. Since we can't know the number of RLP items without looping over\\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\\n // simply set a reasonable maximum list length and decrease the size before we finish.\\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\\n\\n uint256 itemCount = 0;\\n uint256 offset = listOffset;\\n while (offset < _in.length) {\\n require(\\n itemCount < MAX_LIST_LENGTH,\\n \\\"Provided RLP list exceeds max list length.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n ) = _decodeLength(RLPItem({\\n length: _in.length - offset,\\n ptr: _in.ptr + offset\\n }));\\n\\n out[itemCount] = RLPItem({\\n length: itemLength + itemOffset,\\n ptr: _in.ptr + offset\\n });\\n\\n itemCount += 1;\\n offset += itemOffset + itemLength;\\n }\\n\\n // Decrease the array size to match the actual item count.\\n assembly {\\n mstore(out, itemCount)\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n return readList(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes value.\\\"\\n );\\n\\n return _copy(_in.ptr, itemOffset, itemLength);\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return readBytes(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return string(readBytes(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return readString(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n require(\\n _in.length <= 33,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr + itemOffset;\\n bytes32 out;\\n assembly {\\n out := mload(ptr)\\n\\n // Shift the bytes over to match the item size.\\n if lt(itemLength, 32) {\\n out := div(out, exp(256, sub(32, itemLength)))\\n }\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return readBytes32(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return uint256(readBytes32(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return readUint256(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n require(\\n _in.length == 1,\\n \\\"Invalid RLP boolean value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 out;\\n assembly {\\n out := byte(0, mload(ptr))\\n }\\n\\n require(\\n out == 0 || out == 1,\\n \\\"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\\\"\\n );\\n\\n return out != 0;\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return readBool(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n if (_in.length == 1) {\\n return address(0);\\n }\\n\\n require(\\n _in.length == 21,\\n \\\"Invalid RLP address value.\\\"\\n );\\n\\n return address(readUint256(_in));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return readAddress(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads the raw bytes of an RLP item.\\n * @param _in RLP item to read.\\n * @return Raw RLP bytes.\\n */\\n function readRawBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in);\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Decodes the length of an RLP item.\\n * @param _in RLP item to decode.\\n * @return Offset of the encoded data.\\n * @return Length of the encoded data.\\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\\n */\\n function _decodeLength(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n uint256,\\n uint256,\\n RLPItemType\\n )\\n {\\n require(\\n _in.length > 0,\\n \\\"RLP item cannot be null.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 prefix;\\n assembly {\\n prefix := byte(0, mload(ptr))\\n }\\n\\n if (prefix <= 0x7f) {\\n // Single byte.\\n\\n return (0, 1, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xb7) {\\n // Short string.\\n\\n uint256 strLen = prefix - 0x80;\\n\\n require(\\n _in.length > strLen,\\n \\\"Invalid RLP short string.\\\"\\n );\\n\\n return (1, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xbf) {\\n // Long string.\\n uint256 lenOfStrLen = prefix - 0xb7;\\n\\n require(\\n _in.length > lenOfStrLen,\\n \\\"Invalid RLP long string length.\\\"\\n );\\n\\n uint256 strLen;\\n assembly {\\n // Pick out the string length.\\n strLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfStrLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfStrLen + strLen,\\n \\\"Invalid RLP long string.\\\"\\n );\\n\\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xf7) {\\n // Short list.\\n uint256 listLen = prefix - 0xc0;\\n\\n require(\\n _in.length > listLen,\\n \\\"Invalid RLP short list.\\\"\\n );\\n\\n return (1, listLen, RLPItemType.LIST_ITEM);\\n } else {\\n // Long list.\\n uint256 lenOfListLen = prefix - 0xf7;\\n\\n require(\\n _in.length > lenOfListLen,\\n \\\"Invalid RLP long list length.\\\"\\n );\\n\\n uint256 listLen;\\n assembly {\\n // Pick out the list length.\\n listLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfListLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfListLen + listLen,\\n \\\"Invalid RLP long list.\\\"\\n );\\n\\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\\n }\\n }\\n\\n /**\\n * Copies the bytes from a memory location.\\n * @param _src Pointer to the location to read from.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Copied bytes.\\n */\\n function _copy(\\n uint256 _src,\\n uint256 _offset,\\n uint256 _length\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out = new bytes(_length);\\n if (out.length == 0) {\\n return out;\\n }\\n\\n uint256 src = _src + _offset;\\n uint256 dest;\\n assembly {\\n dest := add(out, 32)\\n }\\n\\n // Copy over as many complete words as we can.\\n for (uint256 i = 0; i < _length / 32; i++) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n\\n src += 32;\\n dest += 32;\\n }\\n\\n // Pick out the remaining bytes.\\n uint256 mask = 256 ** (32 - (_length % 32)) - 1;\\n assembly {\\n mstore(\\n dest,\\n or(\\n and(mload(src), not(mask)),\\n and(mload(dest), mask)\\n )\\n )\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Copies an RLP item into bytes.\\n * @param _in RLP item to copy.\\n * @return Copied bytes.\\n */\\n function _copy(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in.ptr, 0, _in.length);\\n }\\n}\\n\",\"keccak256\":\"0x829174c61216dce35fdb888383b6022e0365eb7fbdc71ad79d98b108091969fe\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPWriter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/**\\n * @title Lib_RLPWriter\\n * @author Bakaoh (with modifications)\\n */\\nlibrary Lib_RLPWriter {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * RLP encodes a byte string.\\n * @param _in The byte string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded;\\n\\n if (_in.length == 1 && uint8(_in[0]) < 128) {\\n encoded = _in;\\n } else {\\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * RLP encodes a list of RLP encoded byte byte strings.\\n * @param _in The list of RLP encoded byte strings.\\n * @return The RLP encoded list of items in bytes.\\n */\\n function writeList(\\n bytes[] memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory list = _flatten(_in);\\n return abi.encodePacked(_writeLength(list.length, 192), list);\\n }\\n\\n /**\\n * RLP encodes a string.\\n * @param _in The string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeString(\\n string memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(bytes(_in));\\n }\\n\\n /**\\n * RLP encodes an address.\\n * @param _in The address to encode.\\n * @return The RLP encoded address in bytes.\\n */\\n function writeAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a bytes32 value.\\n * @param _in The bytes32 to encode.\\n * @return _out The RLP encoded bytes32 in bytes.\\n */\\n function writeBytes32(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a uint.\\n * @param _in The uint256 to encode.\\n * @return The RLP encoded uint256 in bytes.\\n */\\n function writeUint(\\n uint256 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(_toBinary(_in));\\n }\\n\\n /**\\n * RLP encodes a bool.\\n * @param _in The bool to encode.\\n * @return The RLP encoded bool in bytes.\\n */\\n function writeBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded = new bytes(1);\\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\\n return encoded;\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\\n * @param _len The length of the string or the payload.\\n * @param _offset 128 if item is string, 192 if item is list.\\n * @return RLP encoded bytes.\\n */\\n function _writeLength(\\n uint256 _len,\\n uint256 _offset\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded;\\n\\n if (_len < 56) {\\n encoded = new bytes(1);\\n encoded[0] = byte(uint8(_len) + uint8(_offset));\\n } else {\\n uint256 lenLen;\\n uint256 i = 1;\\n while (_len / i != 0) {\\n lenLen++;\\n i *= 256;\\n }\\n\\n encoded = new bytes(lenLen + 1);\\n encoded[0] = byte(uint8(lenLen) + uint8(_offset) + 55);\\n for(i = 1; i <= lenLen; i++) {\\n encoded[i] = byte(uint8((_len / (256**(lenLen-i))) % 256));\\n }\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * Encode integer in big endian binary form with no leading zeroes.\\n * @notice TODO: This should be optimized with assembly to save gas costs.\\n * @param _x The integer to encode.\\n * @return RLP encoded bytes.\\n */\\n function _toBinary(\\n uint256 _x\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory b = abi.encodePacked(_x);\\n\\n uint256 i = 0;\\n for (; i < 32; i++) {\\n if (b[i] != 0) {\\n break;\\n }\\n }\\n\\n bytes memory res = new bytes(32 - i);\\n for (uint256 j = 0; j < res.length; j++) {\\n res[j] = b[i++];\\n }\\n\\n return res;\\n }\\n\\n /**\\n * Copies a piece of memory to another location.\\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\\n * @param _dest Destination location.\\n * @param _src Source location.\\n * @param _len Length of memory to copy.\\n */\\n function _memcpy(\\n uint256 _dest,\\n uint256 _src,\\n uint256 _len\\n )\\n private\\n pure\\n {\\n uint256 dest = _dest;\\n uint256 src = _src;\\n uint256 len = _len;\\n\\n for(; len >= 32; len -= 32) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n dest += 32;\\n src += 32;\\n }\\n\\n uint256 mask = 256 ** (32 - len) - 1;\\n assembly {\\n let srcpart := and(mload(src), not(mask))\\n let destpart := and(mload(dest), mask)\\n mstore(dest, or(destpart, srcpart))\\n }\\n }\\n\\n /**\\n * Flattens a list of byte strings into one byte string.\\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\\n * @param _list List of byte strings to flatten.\\n * @return The flattened byte string.\\n */\\n function _flatten(\\n bytes[] memory _list\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n if (_list.length == 0) {\\n return new bytes(0);\\n }\\n\\n uint256 len;\\n uint256 i = 0;\\n for (; i < _list.length; i++) {\\n len += _list[i].length;\\n }\\n\\n bytes memory flattened = new bytes(len);\\n uint256 flattenedPtr;\\n assembly { flattenedPtr := add(flattened, 0x20) }\\n\\n for(i = 0; i < _list.length; i++) {\\n bytes memory item = _list[i];\\n\\n uint256 listPtr;\\n assembly { listPtr := add(item, 0x20)}\\n\\n _memcpy(flattenedPtr, listPtr, item.length);\\n flattenedPtr += _list[i].length;\\n }\\n\\n return flattened;\\n }\\n}\\n\",\"keccak256\":\"0xb60ee4b03ad372c3deff21d454ab714dd0c18ee3e6f9d45532e209fc59d5a54d\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_Bytes32Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_Byte32Utils\\n */\\nlibrary Lib_Bytes32Utils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \\\"true.\\\"\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as a boolean.\\n */\\n function toBool(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return _in != 0;\\n }\\n\\n /**\\n * Converts a boolean to a bytes32 value.\\n * @param _in Input boolean value.\\n * @return Boolean as a bytes32.\\n */\\n function fromBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in ? 1 : 0));\\n }\\n\\n /**\\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as an address.\\n */\\n function toAddress(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return address(uint160(uint256(_in)));\\n }\\n\\n /**\\n * Converts an address to a bytes32.\\n * @param _in Input address value.\\n * @return Address as a bytes32.\\n */\\n function fromAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in));\\n }\\n\\n /**\\n * Removes the leading zeros from a bytes32 value and returns a new (smaller) bytes value.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 without any leading zeros.\\n */\\n function removeLeadingZeros(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out;\\n\\n assembly {\\n // Figure out how many leading zero bytes to remove.\\n let shift := 0\\n for { let i := 0 } and(lt(i, 32), eq(byte(i, _in), 0)) { i := add(i, 1) } {\\n shift := add(shift, 1)\\n }\\n\\n // Reserve some space for our output and fix the free memory pointer.\\n out := mload(0x40)\\n mstore(0x40, add(out, 0x40))\\n\\n // Shift the value and store it into the output bytes.\\n mstore(add(out, 0x20), shl(mul(shift, 8), _in))\\n\\n // Store the new size (with leading zero bytes removed) in the output byte size.\\n mstore(out, sub(32, shift))\\n }\\n\\n return out;\\n }\\n}\\n\",\"keccak256\":\"0xfa2def593e3fc56a31852c3744aefdaa93cec74e721bfcfeb1e5d166c7c60b64\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_BytesUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_BytesUtils\\n */\\nlibrary Lib_BytesUtils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_start + _length >= _start, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n if (_start >= _bytes.length) {\\n return bytes('');\\n }\\n\\n return slice(_bytes, _start, _bytes.length - _start);\\n }\\n\\n function toBytes32PadLeft(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n bytes32 ret;\\n uint256 len = _bytes.length <= 32 ? _bytes.length : 32;\\n assembly {\\n ret := shr(mul(sub(32, len), 8), mload(add(_bytes, 32)))\\n }\\n return ret;\\n }\\n\\n function toBytes32(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n if (_bytes.length < 32) {\\n bytes32 ret;\\n assembly {\\n ret := mload(add(_bytes, 32))\\n }\\n return ret;\\n }\\n\\n return abi.decode(_bytes,(bytes32)); // will truncate if input length > 32 bytes\\n }\\n\\n function toUint256(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return uint256(toBytes32(_bytes));\\n }\\n\\n function toUint24(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n uint24\\n )\\n {\\n require(_start + 3 >= _start, \\\"toUint24_overflow\\\");\\n require(_bytes.length >= _start + 3 , \\\"toUint24_outOfBounds\\\");\\n uint24 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x3), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toUint8(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n uint8\\n )\\n {\\n require(_start + 1 >= _start, \\\"toUint8_overflow\\\");\\n require(_bytes.length >= _start + 1 , \\\"toUint8_outOfBounds\\\");\\n uint8 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x1), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toAddress(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n require(_start + 20 >= _start, \\\"toAddress_overflow\\\");\\n require(_bytes.length >= _start + 20, \\\"toAddress_outOfBounds\\\");\\n address tempAddress;\\n\\n assembly {\\n tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000)\\n }\\n\\n return tempAddress;\\n }\\n\\n function toNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory nibbles = new bytes(_bytes.length * 2);\\n\\n for (uint256 i = 0; i < _bytes.length; i++) {\\n nibbles[i * 2] = _bytes[i] >> 4;\\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\\n }\\n\\n return nibbles;\\n }\\n\\n function fromNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory ret = new bytes(_bytes.length / 2);\\n\\n for (uint256 i = 0; i < ret.length; i++) {\\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\\n }\\n\\n return ret;\\n }\\n\\n function equal(\\n bytes memory _bytes,\\n bytes memory _other\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return keccak256(_bytes) == keccak256(_other);\\n }\\n}\\n\",\"keccak256\":\"0xd27e37973f1e0f64798725b7a0de12989dac992fba0d72970249d7e1f70e17c5\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_ErrorUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/**\\n * @title Lib_ErrorUtils\\n */\\nlibrary Lib_ErrorUtils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Encodes an error string into raw solidity-style revert data.\\n * (i.e. ascii bytes, prefixed with bytes4(keccak(\\\"Error(string))\\\"))\\n * Ref: https://docs.soliditylang.org/en/v0.8.2/control-structures.html?highlight=Error(string)#panic-via-assert-and-error-via-require\\n * @param _reason Reason for the reversion.\\n * @return Standard solidity revert data for the given reason.\\n */\\n function encodeRevertString(\\n string memory _reason\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return abi.encodeWithSignature(\\n \\\"Error(string)\\\",\\n _reason\\n );\\n }\\n}\\n\",\"keccak256\":\"0xfc64ec4a81fb50865b502a0004ed154e8598e1a313db77303fc95e41f536e6b7\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_EthUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// @unsupported: ovm\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"./Lib_Bytes32Utils.sol\\\";\\n\\n/**\\n * @title Lib_EthUtils\\n */\\nlibrary Lib_EthUtils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Gets the code for a given address.\\n * @param _address Address to get code for.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Code read from the contract.\\n */\\n function getCode(\\n address _address,\\n uint256 _offset,\\n uint256 _length\\n )\\n internal\\n view\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory code;\\n assembly {\\n code := mload(0x40)\\n mstore(0x40, add(code, add(_length, 0x20)))\\n mstore(code, _length)\\n extcodecopy(_address, add(code, 0x20), _offset, _length)\\n }\\n\\n return code;\\n }\\n\\n /**\\n * Gets the full code for a given address.\\n * @param _address Address to get code for.\\n * @return Full code of the contract.\\n */\\n function getCode(\\n address _address\\n )\\n internal\\n view\\n returns (\\n bytes memory\\n )\\n {\\n return getCode(\\n _address,\\n 0,\\n getCodeSize(_address)\\n );\\n }\\n\\n /**\\n * Gets the size of a contract's code in bytes.\\n * @param _address Address to get code size for.\\n * @return Size of the contract's code in bytes.\\n */\\n function getCodeSize(\\n address _address\\n )\\n internal\\n view\\n returns (\\n uint256\\n )\\n {\\n uint256 codeSize;\\n assembly {\\n codeSize := extcodesize(_address)\\n }\\n\\n return codeSize;\\n }\\n\\n /**\\n * Gets the hash of a contract's code.\\n * @param _address Address to get a code hash for.\\n * @return Hash of the contract's code.\\n */\\n function getCodeHash(\\n address _address\\n )\\n internal\\n view\\n returns (\\n bytes32\\n )\\n {\\n bytes32 codeHash;\\n assembly {\\n codeHash := extcodehash(_address)\\n }\\n\\n return codeHash;\\n }\\n\\n /**\\n * Creates a contract with some given initialization code.\\n * @param _code Contract initialization code.\\n * @return Address of the created contract.\\n */\\n function createContract(\\n bytes memory _code\\n )\\n internal\\n returns (\\n address\\n )\\n {\\n address created;\\n assembly {\\n created := create(\\n 0,\\n add(_code, 0x20),\\n mload(_code)\\n )\\n }\\n\\n return created;\\n }\\n\\n /**\\n * Computes the address that would be generated by CREATE.\\n * @param _creator Address creating the contract.\\n * @param _nonce Creator's nonce.\\n * @return Address to be generated by CREATE.\\n */\\n function getAddressForCREATE(\\n address _creator,\\n uint256 _nonce\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n bytes[] memory encoded = new bytes[](2);\\n encoded[0] = Lib_RLPWriter.writeAddress(_creator);\\n encoded[1] = Lib_RLPWriter.writeUint(_nonce);\\n\\n bytes memory encodedList = Lib_RLPWriter.writeList(encoded);\\n return Lib_Bytes32Utils.toAddress(keccak256(encodedList));\\n }\\n\\n /**\\n * Computes the address that would be generated by CREATE2.\\n * @param _creator Address creating the contract.\\n * @param _bytecode Bytecode of the contract to be created.\\n * @param _salt 32 byte salt value mixed into the hash.\\n * @return Address to be generated by CREATE2.\\n */\\n function getAddressForCREATE2(\\n address _creator,\\n bytes memory _bytecode,\\n bytes32 _salt\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n bytes32 hashedData = keccak256(abi.encodePacked(\\n byte(0xff),\\n _creator,\\n _salt,\\n keccak256(_bytecode)\\n ));\\n\\n return Lib_Bytes32Utils.toAddress(hashedData);\\n }\\n}\\n\",\"keccak256\":\"0xf29a67d78e61cb472d524b779b32cfcb39a587f4096500d5419e6425ed367d49\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_MerkleTree.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_MerkleTree\\n * @author River Keefer\\n */\\nlibrary Lib_MerkleTree {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Calculates a merkle root for a list of 32-byte leaf hashes. WARNING: If the number\\n * of leaves passed in is not a power of two, it pads out the tree with zero hashes.\\n * If you do not know the original length of elements for the tree you are verifying,\\n * then this may allow empty leaves past _elements.length to pass a verification check down the line.\\n * Note that the _elements argument is modified, therefore it must not be used again afterwards\\n * @param _elements Array of hashes from which to generate a merkle root.\\n * @return Merkle root of the leaves, with zero hashes for non-powers-of-two (see above).\\n */\\n function getMerkleRoot(\\n bytes32[] memory _elements\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n require(\\n _elements.length > 0,\\n \\\"Lib_MerkleTree: Must provide at least one leaf hash.\\\"\\n );\\n\\n if (_elements.length == 1) {\\n return _elements[0];\\n }\\n\\n uint256[16] memory defaults = [\\n 0x290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563,\\n 0x633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d,\\n 0x890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d,\\n 0x3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd8,\\n 0xecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da,\\n 0xdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da5,\\n 0x617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d7,\\n 0x292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead,\\n 0xe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e10,\\n 0x7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f82,\\n 0xe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e83636516,\\n 0x3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c,\\n 0xad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e,\\n 0xa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab,\\n 0x4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c862,\\n 0x2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf10\\n ];\\n\\n // Reserve memory space for our hashes.\\n bytes memory buf = new bytes(64);\\n\\n // We'll need to keep track of left and right siblings.\\n bytes32 leftSibling;\\n bytes32 rightSibling;\\n\\n // Number of non-empty nodes at the current depth.\\n uint256 rowSize = _elements.length;\\n\\n // Current depth, counting from 0 at the leaves\\n uint256 depth = 0;\\n\\n // Common sub-expressions\\n uint256 halfRowSize; // rowSize / 2\\n bool rowSizeIsOdd; // rowSize % 2 == 1\\n\\n while (rowSize > 1) {\\n halfRowSize = rowSize / 2;\\n rowSizeIsOdd = rowSize % 2 == 1;\\n\\n for (uint256 i = 0; i < halfRowSize; i++) {\\n leftSibling = _elements[(2 * i) ];\\n rightSibling = _elements[(2 * i) + 1];\\n assembly {\\n mstore(add(buf, 32), leftSibling )\\n mstore(add(buf, 64), rightSibling)\\n }\\n\\n _elements[i] = keccak256(buf);\\n }\\n\\n if (rowSizeIsOdd) {\\n leftSibling = _elements[rowSize - 1];\\n rightSibling = bytes32(defaults[depth]);\\n assembly {\\n mstore(add(buf, 32), leftSibling)\\n mstore(add(buf, 64), rightSibling)\\n }\\n\\n _elements[halfRowSize] = keccak256(buf);\\n }\\n\\n rowSize = halfRowSize + (rowSizeIsOdd ? 1 : 0);\\n depth++;\\n }\\n\\n return _elements[0];\\n }\\n\\n /**\\n * Verifies a merkle branch for the given leaf hash. Assumes the original length\\n * of leaves generated is a known, correct input, and does not return true for indices\\n * extending past that index (even if _siblings would be otherwise valid.)\\n * @param _root The Merkle root to verify against.\\n * @param _leaf The leaf hash to verify inclusion of.\\n * @param _index The index in the tree of this leaf.\\n * @param _siblings Array of sibline nodes in the inclusion proof, starting from depth 0 (bottom of the tree).\\n * @param _totalLeaves The total number of leaves originally passed into.\\n * @return Whether or not the merkle branch and leaf passes verification.\\n */\\n function verify(\\n bytes32 _root,\\n bytes32 _leaf,\\n uint256 _index,\\n bytes32[] memory _siblings,\\n uint256 _totalLeaves\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n require(\\n _totalLeaves > 0,\\n \\\"Lib_MerkleTree: Total leaves must be greater than zero.\\\"\\n );\\n\\n require(\\n _index < _totalLeaves,\\n \\\"Lib_MerkleTree: Index out of bounds.\\\"\\n );\\n\\n require(\\n _siblings.length == _ceilLog2(_totalLeaves),\\n \\\"Lib_MerkleTree: Total siblings does not correctly correspond to total leaves.\\\"\\n );\\n\\n bytes32 computedRoot = _leaf;\\n\\n for (uint256 i = 0; i < _siblings.length; i++) {\\n if ((_index & 1) == 1) {\\n computedRoot = keccak256(\\n abi.encodePacked(\\n _siblings[i],\\n computedRoot\\n )\\n );\\n } else {\\n computedRoot = keccak256(\\n abi.encodePacked(\\n computedRoot,\\n _siblings[i]\\n )\\n );\\n }\\n\\n _index >>= 1;\\n }\\n\\n return _root == computedRoot;\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Calculates the integer ceiling of the log base 2 of an input.\\n * @param _in Unsigned input to calculate the log.\\n * @return ceil(log_base_2(_in))\\n */\\n function _ceilLog2(\\n uint256 _in\\n )\\n private\\n pure\\n returns (\\n uint256\\n )\\n {\\n require(\\n _in > 0,\\n \\\"Lib_MerkleTree: Cannot compute ceil(log_2) of 0.\\\"\\n );\\n\\n if (_in == 1) {\\n return 0;\\n }\\n\\n // Find the highest set bit (will be floor(log_2)).\\n // Borrowed with <3 from https://github.com/ethereum/solidity-examples\\n uint256 val = _in;\\n uint256 highest = 0;\\n for (uint256 i = 128; i >= 1; i >>= 1) {\\n if (val & (uint(1) << i) - 1 << i != 0) {\\n highest += i;\\n val >>= i;\\n }\\n }\\n\\n // Increment by one if this is not a perfect logarithm.\\n if ((uint(1) << highest) != _in) {\\n highest += 1;\\n }\\n\\n return highest;\\n }\\n}\\n\",\"keccak256\":\"0xa78edb9fbd34712771a1ebff05bc5e1abec7fc1e9a1bfb709d183099b44fa62a\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x60806040523480156200001157600080fd5b506040516200315338038062003153833981016040819052620000349162000067565b600080546001600160a01b0319166001600160a01b039590951694909417909355600191909155600255600355620000b2565b600080600080608085870312156200007d578384fd5b84516001600160a01b038116811462000094578485fd5b60208601516040870151606090970151919890975090945092505050565b61309180620000c26000396000f3fe608060405234801561001057600080fd5b50600436106101425760003560e01c8063876ed5cb116100b8578063cfdf677e1161007c578063cfdf677e1461023f578063d0f8934414610247578063e10d29ee1461024f578063e561dddc14610257578063f722b41a1461025f578063facdc5da1461026757610142565b8063876ed5cb146102175780638d38c6c11461021f578063b8f7700514610227578063c139eb151461022f578063c2cf696f1461023757610142565b80634de569ce1161010a5780634de569ce146101c25780635ae6256d146101e25780636fee07e0146101ea57806378f4b2f2146101ff5780637a167a8a146102075780637aa63a861461020f57610142565b8063138387a414610147578063299ca478146101655780632a7f18be1461017a578063378997701461019a578063461a4478146101af575b600080fd5b61014f61027a565b60405161015c91906124c7565b60405180910390f35b61016d610280565b60405161015c91906123eb565b61018d610188366004612388565b61028f565b60405161015c9190612e4e565b6101a26102b0565b60405161015c9190612e8d565b61016d6101bd36600461221b565b6102c4565b6101d56101d0366004612261565b6103a0565b60405161015c9190612484565b6101a26103da565b6101fd6101f8366004612188565b6103ee565b005b61014f61066d565b6101a2610674565b61014f610689565b61014f6106a4565b61014f6106aa565b6101a26106b0565b61014f6106c7565b61014f6106cd565b61016d6106d2565b6101fd6106f5565b61016d610b69565b61014f610b8c565b6101a2610c06565b6101fd610275366004612388565b610c1e565b60025481565b6000546001600160a01b031681565b610297611ed9565b6102a8826102a3610b69565b610c36565b90505b919050565b6000806102bb610d76565b50935050505090565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b8381101561032457818101518382015260200161030c565b50505050905090810190601f1680156103515780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561036e57600080fd5b505afa158015610382573d6000803e3d6000fd5b505050506040513d602081101561039857600080fd5b505192915050565b82516000901515600114156103c2576103bb85858585610e24565b90506103d2565b6103bb8585602001518585610fef565b949350505050565b6000806103e5610d76565b94505050505090565b61c3508151111561041a5760405162461bcd60e51b81526004016104119061259b565b60405180910390fd5b60035482111561043c5760405162461bcd60e51b8152600401610411906127a1565b620186a082101561045f5760405162461bcd60e51b815260040161041190612983565b6020820460005a90508181116104875760405162461bcd60e51b815260040161041190612b8a565b60005b825a8303101561049c5760010161048a565b6000338787876040516020016104b594939291906123ff565b60408051601f19818403018152919052805160209091012090504360281b421760006104df610b69565b60405163b298e36b60e01b81529091506001600160a01b0382169063b298e36b9061050e9086906004016124c7565b600060405180830381600087803b15801561052857600080fd5b505af115801561053c573d6000803e3d6000fd5b505060405163b298e36b60e01b81526001600160a01b038416925063b298e36b915061056c9085906004016124c7565b600060405180830381600087803b15801561058657600080fd5b505af115801561059a573d6000803e3d6000fd5b50505050600060016002836001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b1580156105dd57600080fd5b505afa1580156105f1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106159190612203565b8161061c57fe5b040390507f4b388aecf9fa6cc92253704e5975a6129a4f735bdbd99567df4ed0094ee4ceb5338b8b8b85426040516106599695949392919061243c565b60405180910390a150505050505050505050565b620186a081565b60008061067f610d76565b5090935050505090565b600080610694610d76565b50505064ffffffffff1692915050565b61c35081565b60035481565b60006106c26106bd610b69565b6110c4565b905090565b60015481565b602081565b60006106c2604051806060016040528060258152602001613003602591396102c4565b60043560d81c60093560e890811c90600c35901c610711610689565b8364ffffffffff16146107365760405162461bcd60e51b815260040161041190612a35565b6107646040518060400160405280600d81526020016c27ab26afa9b2b8bab2b731b2b960991b8152506102c4565b6001600160a01b0316336001600160a01b0316146107945760405162461bcd60e51b815260040161041190612a92565b60008162ffffff16116107b95760405162461bcd60e51b8152600401610411906127fe565b60008262ffffff16116107de5760405162461bcd60e51b815260040161041190612cdf565b600f601062ffffff8316020164ffffffffff81163610156108115760405162461bcd60e51b815260040161041190612d66565b600061081b610b69565b90506000610828826110c4565b9050600062ffffff8616368161083a57fe5b0460020267ffffffffffffffff8111801561085457600080fd5b506040519080825280601f01601f19166020018201604052801561087f576020820181803683370190505b50905060008662ffffff1667ffffffffffffffff811180156108a057600080fd5b506040519080825280602002602001820160405280156108ca578160200160208202803683370190505b50905060008060006108da610674565b90506108e4611ef9565b60005b8a62ffffff168163ffffffff161015610a3b57600061090b8263ffffffff16611147565b905063ffffffff82166109215761092181611197565b61092d8382868d611264565b80925060005b835163ffffffff821610156109b1578b3560e81c61c3508111156109695760405162461bcd60e51b81526004016104119061259b565b61097c858e64ffffffffff16838d6112cf565b898963ffffffff168151811061098e57fe5b60209081029190910101529b909b016003019a6001968701969586019501610933565b5060005b83602001518163ffffffff161015610a31578964ffffffffff168564ffffffffff16106109f45760405162461bcd60e51b815260040161041190612da8565b610a048564ffffffffff16611363565b888863ffffffff1681518110610a1657fe5b602090810291909101015260019687019694850194016109b5565b50506001016108e7565b50610a488183898b6113a8565b3664ffffffffff8a1614610a6e5760405162461bcd60e51b815260040161041190612846565b8a62ffffff168463ffffffff1614610a985760405162461bcd60e51b815260040161041190612894565b6000838c62ffffff160363ffffffff169050600080836020015160001415610acb57505060408201516060830151610af3565b6000610ae16001870364ffffffffff168d610c36565b90508060200151925080604001519150505b610b14610aff8961141b565b8f62ffffff168564ffffffffff16858561184f565b7f602f1aeac0ca2e7a13e281a9ef0ad7838542712ce16780fa2ecffd351f05f89983860384610b41610689565b604051610b5093929190612e9f565b60405180910390a1505050505050505050505050505050565b60006106c2604051806060016040528060238152602001612ee6602391396102c4565b6000610b966106d2565b6001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b158015610bce57600080fd5b505afa158015610be2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106c29190612203565b6000610c10610674565b610c186106b0565b03905090565b60405162461bcd60e51b81526004016104119061250b565b610c3e611ed9565b604051634a83e9cd60e11b815260028402906000906001600160a01b03851690639507d39a90610c72908590600401612e8d565b60206040518083038186803b158015610c8a57600080fd5b505afa158015610c9e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cc29190612203565b90506000846001600160a01b0316639507d39a846001016040518263ffffffff1660e01b8152600401610cf59190612e8d565b60206040518083038186803b158015610d0d57600080fd5b505afa158015610d21573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d459190612203565b6040805160608101825293845264ffffffffff828116602086015260289290921c9091169083015250949350505050565b6000806000806000610d866106d2565b6001600160a01b031663ccf8f9696040518163ffffffff1660e01b815260040160206040518083038186803b158015610dbe57600080fd5b505afa158015610dd2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610df691906121dd565b64ffffffffff602882901c811697605083901c82169750607883901c8216965060a09290921c169350915050565b600080610e5c6040518060400160405280601481526020017327ab26afa2bc32b1baba34b7b726b0b730b3b2b960611b8152506102c4565b90506000816001600160a01b0316631c4712a76040518163ffffffff1660e01b815260040160206040518083038186803b158015610e9957600080fd5b505afa158015610ead573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ed19190612203565b90506000610ede87611a02565b9050610eeb818787611a9b565b610f075760405162461bcd60e51b8152600401610411906126ca565b86606001518860200151148015610f22575060408701518851145b8015610f635750610f4a604051806060016040528060228152602001612f09602291396102c4565b6001600160a01b031688608001516001600160a01b0316145b8015610f725750818860a00151145b8015610f89575060608801516001600160a01b0316155b8015610fa45750600088604001516001811115610fa257fe5b145b8015610fc557508660800151805190602001208860c0015180519060200120145b610fe15760405162461bcd60e51b81526004016104119061276a565b506001979650505050505050565b600080610ffb85611363565b9050611008818585611a9b565b6110245760405162461bcd60e51b815260040161041190612c2a565b6000866060015187608001518860a001518960c0015160405160200161104d94939291906123ff565b60405160208183030381529060405280519060200120905060006110708761028f565b80519091508214801561108e57508751602082015164ffffffffff16145b80156110a857508760200151816040015164ffffffffff16145b610fe15760405162461bcd60e51b815260040161041190612adf565b60006002826001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b15801561110157600080fd5b505afa158015611115573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111399190612203565b8161114057fe5b0492915050565b61114f611ef9565b5060408051608081018252601092909202600f81013560e890811c84526012820135901c6020840152601581013560d890811c92840192909252601a0135901c606082015290565b60006111a1610689565b1115611211576000806111b2610d76565b9350935050508064ffffffffff16836060015110156111e35760405162461bcd60e51b815260040161041190612718565b8164ffffffffff168360400151101561120e5760405162461bcd60e51b8152600401610411906125f8565b50505b4260015482604001510110156112395760405162461bcd60e51b815260040161041190612d20565b4360025482606001510110156112615760405162461bcd60e51b815260040161041190612552565b50565b83604001518360400151101561128c5760405162461bcd60e51b815260040161041190612bd5565b8360600151836060015110156112b45760405162461bcd60e51b815260040161041190612df1565b6020830151156112c9576112c9838383611b8c565b50505050565b60008151836041011115611326578260410167ffffffffffffffff811180156112f757600080fd5b506040519080825280601f01601f191660200182016040528015611322576020820181803683370190505b5091505b6040850151606086015160006020850160018153836001820152826021820152866003890160418301376041870190209350505050949350505050565b60006102a86040518060a00160405280600015158152602001848152602001600081526020016000815260200160405180602001604052806000815250815250611c2d565b600083830364ffffffffff161180156113c357506020840151155b156113d3576113d3848483611b8c565b42846040015111156113f75760405162461bcd60e51b815260040161041190612b45565b43846060015111156112c95760405162461bcd60e51b815260040161041190612904565b60008082511161145c5760405162461bcd60e51b81526004018080602001828103825260348152602001806130286034913960400191505060405180910390fd5b815160011415611482578160008151811061147357fe5b602002602001015190506102ab565b60408051610200810182527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56381527f633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d60208201527f890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d818301527f3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd86060808301919091527fecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da60808301527fdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da560a08301527f617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d760c08301527f292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead60e08301527fe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e106101008301527f7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f826101208301527fe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e836365166101408301527f3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c6101608301527fad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e6101808301527fa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab6101a08301527f4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c8626101c08301527f2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf106101e083015282518381529081018352909160009190602082018180368337505085519192506000918291508180805b600184111561182b5750506002820460018084161460005b828110156117a7578a816002028151811061174e57fe5b602002602001015196508a816002026001018151811061176a57fe5b6020026020010151955086602089015285604089015287805190602001208b828151811061179457fe5b6020908102919091010152600101611737565b50801561180a578960018503815181106117bd57fe5b602002602001015195508783601081106117d357fe5b602002015160001b945085602088015284604088015286805190602001208a83815181106117fd57fe5b6020026020010181815250505b80611816576000611819565b60015b60ff168201935060019092019161171f565b8960008151811061183857fe5b602002602001015198505050505050505050919050565b60006118596106d2565b9050600080611866610d76565b50509150915060006040518060a00160405280856001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b1580156118b257600080fd5b505afa1580156118c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118ea9190612203565b81526020018a81526020018981526020018464ffffffffff16815260200160405180602001604052806000815250815250905080600001517f127186556e7be68c7e31263195225b4de02820707889540969f62c05cf73525e826020015183604001518460600151856080015160405161196794939291906124e6565b60405180910390a2600061197a82611c75565b90506000611992836040015186018a86018a8a611c9e565b60405163080549db60e21b81529091506001600160a01b03871690632015276c906119c390859085906004016124d0565b600060405180830381600087803b1580156119dd57600080fd5b505af11580156119f1573d6000803e3d6000fd5b505050505050505050505050505050565b6080810151805160009190826041820167ffffffffffffffff81118015611a2857600080fd5b506040519080825280601f01601f191660200182016040528015611a53576020820181803683370190505b5060408601516060870151919250906000602084016001815383600182015282602182015285604182018760208a0160045afa50604190950190942095505050505050919050565b6000611aa56106d2565b8351604051634a83e9cd60e11b81526001600160a01b039290921691639507d39a91611ad391600401612e7c565b60206040518083038186803b158015611aeb57600080fd5b505afa158015611aff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b239190612203565b611b2c84611c75565b14611b495760405162461bcd60e51b815260040161041190612b16565b611b66836020015185846000015185602001518760400151611cbd565b611b825760405162461bcd60e51b81526004016104119061294c565b5060019392505050565b6000611b9f8364ffffffffff1683610c36565b9050600154816020015164ffffffffff16014210611bcf5760405162461bcd60e51b815260040161041190612647565b806020015164ffffffffff1684604001511115611bfe5760405162461bcd60e51b8152600401610411906129cc565b806040015164ffffffffff16846060015111156112c95760405162461bcd60e51b815260040161041190612c74565b8051602080830151604080850151606086015160808701519251600096611c5896909594910161248f565b604051602081830303815290604052805190602001209050919050565b60008160200151826040015183606001518460800151604051602001611c5894939291906124e6565b602892831b9390931760509190911b1760789290921b91909117901b90565b6000808211611cfd5760405162461bcd60e51b8152600401808060200182810382526037815260200180612f7f6037913960400191505060405180910390fd5b818410611d3b5760405162461bcd60e51b8152600401808060200182810382526024815260200180612f2b6024913960400191505060405180910390fd5b611d4482611e42565b835114611d825760405162461bcd60e51b815260040180806020018281038252604d815260200180612fb6604d913960600191505060405180910390fd5b8460005b8451811015611e35578560011660011415611de457848181518110611da757fe5b6020026020010151826040516020018083815260200182815260200192505050604051602081830303815290604052805190602001209150611e29565b81858281518110611df157fe5b602002602001015160405160200180838152602001828152602001925050506040516020818303038152906040528051906020012091505b600195861c9501611d86565b5090951495945050505050565b6000808211611e825760405162461bcd60e51b8152600401808060200182810382526030815260200180612f4f6030913960400191505060405180910390fd5b8160011415611e93575060006102ab565b81600060805b60018110611ec3576000196001821b01811b831615611ebb5791821c91908101905b60011c611e99565b506001811b8414611ed2576001015b9392505050565b604080516060810182526000808252602082018190529181019190915290565b6040518060800160405280600081526020016000815260200160008152602001600081525090565b600067ffffffffffffffff831115611f3557fe5b611f48601f8401601f1916602001612ec1565b9050828152838383011115611f5c57600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b03811681146102ab57600080fd5b600082601f830112611f9a578081fd5b611ed283833560208501611f21565b8035600281106102ab57600080fd5b600060a08284031215611fc9578081fd5b60405160a0810167ffffffffffffffff8282108183111715611fe757fe5b8160405282935084358352602085013560208401526040850135604084015260608501356060840152608085013591508082111561202457600080fd5b5061203185828601611f8a565b6080830152505092915050565b60006040828403121561204f578081fd5b6040516040810167ffffffffffffffff828210818311171561206d57fe5b816040528293508435835260209150818501358181111561208d57600080fd5b8501601f8101871361209e57600080fd5b8035828111156120aa57fe5b83810292506120ba848401612ec1565b8181528481019083860185850187018b10156120d557600080fd5b600095505b838610156120f85780358352600195909501949186019186016120da565b5080868801525050505050505092915050565b600060a0828403121561211c578081fd5b60405160a0810167ffffffffffffffff828210818311171561213a57fe5b8160405282935084359150811515821461215357600080fd5b818352602085013560208401526040850135604084015260608501356060840152608085013591508082111561202457600080fd5b60008060006060848603121561219c578283fd5b6121a584611f73565b925060208401359150604084013567ffffffffffffffff8111156121c7578182fd5b6121d386828701611f8a565b9150509250925092565b6000602082840312156121ee578081fd5b815164ffffffffff1981168114611ed2578182fd5b600060208284031215612214578081fd5b5051919050565b60006020828403121561222c578081fd5b813567ffffffffffffffff811115612242578182fd5b8201601f81018413612252578182fd5b6103d284823560208401611f21565b60008060008060808587031215612276578081fd5b843567ffffffffffffffff8082111561228d578283fd5b9086019060e082890312156122a0578283fd5b6122aa60e0612ec1565b82358152602083013560208201526122c460408401611fa9565b60408201526122d560608401611f73565b60608201526122e660808401611f73565b608082015260a083013560a082015260c083013582811115612306578485fd5b6123128a828601611f8a565b60c0830152509550602087013591508082111561232d578283fd5b6123398883890161210b565b9450604087013591508082111561234e578283fd5b61235a88838901611fb8565b9350606087013591508082111561236f578283fd5b5061237c8782880161203e565b91505092959194509250565b600060208284031215612399578081fd5b5035919050565b60008151808452815b818110156123c5576020818501810151868301820152016123a9565b818111156123d65782602083870101525b50601f01601f19169290920160200192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612432908301846123a0565b9695505050505050565b6001600160a01b038781168252861660208201526040810185905260c06060820181905260009061246f908301866123a0565b60808301949094525060a00152949350505050565b901515815260200190565b6000861515825285602083015284604083015283606083015260a060808301526124bc60a08301846123a0565b979650505050505050565b90815260200190565b91825264ffffffffff1916602082015260400190565b60008582528460208301528360408301526080606083015261243260808301846123a0565b60208082526027908201527f617070656e64517565756542617463682069732063757272656e746c7920646960408201526639b0b13632b21760c91b606082015260800190565b60208082526029908201527f436f6e7465787420626c6f636b206e756d62657220746f6f2066617220696e206040820152683a3432903830b9ba1760b91b606082015260800190565b6020808252603d908201527f5472616e73616374696f6e20646174612073697a652065786365656473206d6160408201527f78696d756d20666f7220726f6c6c7570207472616e73616374696f6e2e000000606082015260800190565b6020808252602f908201527f436f6e746578742074696d657374616d70206973206c6f776572207468616e2060408201526e3630b9ba1039bab136b4ba3a32b21760891b606082015260800190565b6020808252605b908201527f50726576696f75736c7920656e7175657565642062617463686573206861766560408201527f206578706972656420616e64206d75737420626520617070656e64656420626560608201527f666f72652061206e65772073657175656e6365722062617463682e0000000000608082015260a00190565b6020808252602e908201527f496e76616c69642053657175656e636572207472616e73616374696f6e20696e60408201526d31b63ab9b4b7b710383937b7b31760911b606082015260800190565b60208082526032908201527f436f6e7465787420626c6f636b206e756d626572206973206c6f77657220746860408201527130b7103630b9ba1039bab136b4ba3a32b21760711b606082015260800190565b6020808252601e908201527f496e76616c69642053657175656e636572207472616e73616374696f6e2e0000604082015260600190565b6020808252603d908201527f5472616e73616374696f6e20676173206c696d69742065786365656473206d6160408201527f78696d756d20666f7220726f6c6c7570207472616e73616374696f6e2e000000606082015260800190565b60208082526028908201527f4d7573742070726f76696465206174206c65617374206f6e652062617463682060408201526731b7b73a32bc3a1760c11b606082015260800190565b6020808252602e908201527f4e6f7420616c6c2073657175656e636572207472616e73616374696f6e73207760408201526d32b93290383937b1b2b9b9b2b21760911b606082015260800190565b6020808252604a908201527f41637475616c207472616e73616374696f6e20696e64657820646f6573206e6f60408201527f74206d6174636820657870656374656420746f74616c20656c656d656e7473206060820152693a379030b83832b7321760b11b608082015260a00190565b60208082526028908201527f436f6e7465787420626c6f636b206e756d6265722069732066726f6d2074686560408201526710333aba3ab9329760c11b606082015260800190565b60208082526018908201527f496e76616c696420696e636c7573696f6e2070726f6f662e0000000000000000604082015260600190565b60208082526029908201527f5472616e73616374696f6e20676173206c696d697420746f6f206c6f7720746f6040820152681032b738bab2bab29760b91b606082015260800190565b60208082526043908201527f53657175656e636572207472616e73616374696f6e2074696d657374616d702060408201527f657863656564732074686174206f66206e65787420717565756520656c656d65606082015262373a1760e91b608082015260a00190565b6020808252603d908201527f41637475616c20626174636820737461727420696e64657820646f6573206e6f60408201527f74206d6174636820657870656374656420737461727420696e6465782e000000606082015260800190565b6020808252602d908201527f46756e6374696f6e2063616e206f6e6c792062652063616c6c6564206279207460408201526c34329029b2b8bab2b731b2b91760991b606082015260800190565b6020808252601a908201527f496e76616c6964205175657565207472616e73616374696f6e2e000000000000604082015260600190565b60208082526015908201527424b73b30b634b2103130ba31b4103432b0b232b91760591b604082015260600190565b60208082526025908201527f436f6e746578742074696d657374616d702069732066726f6d207468652066756040820152643a3ab9329760d91b606082015260800190565b6020808252602b908201527f496e73756666696369656e742067617320666f72204c322072617465206c696d60408201526a34ba34b73390313ab9371760a91b606082015260800190565b60208082526035908201527f436f6e746578742074696d657374616d702076616c756573206d757374206d6f6040820152743737ba37b734b1b0b6363c9034b731b932b0b9b29760591b606082015260800190565b6020808252602a908201527f496e76616c6964205175657565207472616e73616374696f6e20696e636c757360408201526934b7b710383937b7b31760b11b606082015260800190565b60208082526045908201527f53657175656e636572207472616e73616374696f6e20626c6f636b4e756d626560408201527f7220657863656564732074686174206f66206e65787420717565756520656c6560608201526436b2b73a1760d91b608082015260a00190565b60208082526021908201527f4d75737420617070656e64206174206c65617374206f6e6520656c656d656e746040820152601760f91b606082015260800190565b60208082526026908201527f436f6e746578742074696d657374616d7020746f6f2066617220696e20746865604082015265103830b9ba1760d11b606082015260800190565b60208082526022908201527f4e6f7420656e6f756768204261746368436f6e74657874732070726f76696465604082015261321760f11b606082015260800190565b60208082526029908201527f4e6f7420656e6f75676820717565756564207472616e73616374696f6e732074604082015268379030b83832b7321760b91b606082015260800190565b60208082526037908201527f436f6e7465787420626c6f636b4e756d6265722076616c756573206d7573742060408201527f6d6f6e6f746f6e6963616c6c7920696e6372656173652e000000000000000000606082015260800190565b8151815260208083015164ffffffffff90811691830191909152604092830151169181019190915260600190565b63ffffffff91909116815260200190565b64ffffffffff91909116815260200190565b64ffffffffff9384168152919092166020820152604081019190915260600190565b60405181810167ffffffffffffffff81118282101715612edd57fe5b60405291905056fe4f564d5f436861696e53746f72616765436f6e7461696e65723a4354433a71756575654f564d5f4465636f6d7072657373696f6e507265636f6d70696c65416464726573734c69625f4d65726b6c65547265653a20496e646578206f7574206f6620626f756e64732e4c69625f4d65726b6c65547265653a2043616e6e6f7420636f6d70757465206365696c286c6f675f3229206f6620302e4c69625f4d65726b6c65547265653a20546f74616c206c6561766573206d7573742062652067726561746572207468616e207a65726f2e4c69625f4d65726b6c65547265653a20546f74616c207369626c696e677320646f6573206e6f7420636f72726563746c7920636f72726573706f6e6420746f20746f74616c206c65617665732e4f564d5f436861696e53746f72616765436f6e7461696e65723a4354433a626174636865734c69625f4d65726b6c65547265653a204d7573742070726f76696465206174206c65617374206f6e65206c65616620686173682ea2646970667358221220828f57135c61279b924bbbcded24811b56f14e0b701fd6564e301e4a1b7d73d364736f6c63430007060033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101425760003560e01c8063876ed5cb116100b8578063cfdf677e1161007c578063cfdf677e1461023f578063d0f8934414610247578063e10d29ee1461024f578063e561dddc14610257578063f722b41a1461025f578063facdc5da1461026757610142565b8063876ed5cb146102175780638d38c6c11461021f578063b8f7700514610227578063c139eb151461022f578063c2cf696f1461023757610142565b80634de569ce1161010a5780634de569ce146101c25780635ae6256d146101e25780636fee07e0146101ea57806378f4b2f2146101ff5780637a167a8a146102075780637aa63a861461020f57610142565b8063138387a414610147578063299ca478146101655780632a7f18be1461017a578063378997701461019a578063461a4478146101af575b600080fd5b61014f61027a565b60405161015c91906124c7565b60405180910390f35b61016d610280565b60405161015c91906123eb565b61018d610188366004612388565b61028f565b60405161015c9190612e4e565b6101a26102b0565b60405161015c9190612e8d565b61016d6101bd36600461221b565b6102c4565b6101d56101d0366004612261565b6103a0565b60405161015c9190612484565b6101a26103da565b6101fd6101f8366004612188565b6103ee565b005b61014f61066d565b6101a2610674565b61014f610689565b61014f6106a4565b61014f6106aa565b6101a26106b0565b61014f6106c7565b61014f6106cd565b61016d6106d2565b6101fd6106f5565b61016d610b69565b61014f610b8c565b6101a2610c06565b6101fd610275366004612388565b610c1e565b60025481565b6000546001600160a01b031681565b610297611ed9565b6102a8826102a3610b69565b610c36565b90505b919050565b6000806102bb610d76565b50935050505090565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b8381101561032457818101518382015260200161030c565b50505050905090810190601f1680156103515780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561036e57600080fd5b505afa158015610382573d6000803e3d6000fd5b505050506040513d602081101561039857600080fd5b505192915050565b82516000901515600114156103c2576103bb85858585610e24565b90506103d2565b6103bb8585602001518585610fef565b949350505050565b6000806103e5610d76565b94505050505090565b61c3508151111561041a5760405162461bcd60e51b81526004016104119061259b565b60405180910390fd5b60035482111561043c5760405162461bcd60e51b8152600401610411906127a1565b620186a082101561045f5760405162461bcd60e51b815260040161041190612983565b6020820460005a90508181116104875760405162461bcd60e51b815260040161041190612b8a565b60005b825a8303101561049c5760010161048a565b6000338787876040516020016104b594939291906123ff565b60408051601f19818403018152919052805160209091012090504360281b421760006104df610b69565b60405163b298e36b60e01b81529091506001600160a01b0382169063b298e36b9061050e9086906004016124c7565b600060405180830381600087803b15801561052857600080fd5b505af115801561053c573d6000803e3d6000fd5b505060405163b298e36b60e01b81526001600160a01b038416925063b298e36b915061056c9085906004016124c7565b600060405180830381600087803b15801561058657600080fd5b505af115801561059a573d6000803e3d6000fd5b50505050600060016002836001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b1580156105dd57600080fd5b505afa1580156105f1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106159190612203565b8161061c57fe5b040390507f4b388aecf9fa6cc92253704e5975a6129a4f735bdbd99567df4ed0094ee4ceb5338b8b8b85426040516106599695949392919061243c565b60405180910390a150505050505050505050565b620186a081565b60008061067f610d76565b5090935050505090565b600080610694610d76565b50505064ffffffffff1692915050565b61c35081565b60035481565b60006106c26106bd610b69565b6110c4565b905090565b60015481565b602081565b60006106c2604051806060016040528060258152602001613003602591396102c4565b60043560d81c60093560e890811c90600c35901c610711610689565b8364ffffffffff16146107365760405162461bcd60e51b815260040161041190612a35565b6107646040518060400160405280600d81526020016c27ab26afa9b2b8bab2b731b2b960991b8152506102c4565b6001600160a01b0316336001600160a01b0316146107945760405162461bcd60e51b815260040161041190612a92565b60008162ffffff16116107b95760405162461bcd60e51b8152600401610411906127fe565b60008262ffffff16116107de5760405162461bcd60e51b815260040161041190612cdf565b600f601062ffffff8316020164ffffffffff81163610156108115760405162461bcd60e51b815260040161041190612d66565b600061081b610b69565b90506000610828826110c4565b9050600062ffffff8616368161083a57fe5b0460020267ffffffffffffffff8111801561085457600080fd5b506040519080825280601f01601f19166020018201604052801561087f576020820181803683370190505b50905060008662ffffff1667ffffffffffffffff811180156108a057600080fd5b506040519080825280602002602001820160405280156108ca578160200160208202803683370190505b50905060008060006108da610674565b90506108e4611ef9565b60005b8a62ffffff168163ffffffff161015610a3b57600061090b8263ffffffff16611147565b905063ffffffff82166109215761092181611197565b61092d8382868d611264565b80925060005b835163ffffffff821610156109b1578b3560e81c61c3508111156109695760405162461bcd60e51b81526004016104119061259b565b61097c858e64ffffffffff16838d6112cf565b898963ffffffff168151811061098e57fe5b60209081029190910101529b909b016003019a6001968701969586019501610933565b5060005b83602001518163ffffffff161015610a31578964ffffffffff168564ffffffffff16106109f45760405162461bcd60e51b815260040161041190612da8565b610a048564ffffffffff16611363565b888863ffffffff1681518110610a1657fe5b602090810291909101015260019687019694850194016109b5565b50506001016108e7565b50610a488183898b6113a8565b3664ffffffffff8a1614610a6e5760405162461bcd60e51b815260040161041190612846565b8a62ffffff168463ffffffff1614610a985760405162461bcd60e51b815260040161041190612894565b6000838c62ffffff160363ffffffff169050600080836020015160001415610acb57505060408201516060830151610af3565b6000610ae16001870364ffffffffff168d610c36565b90508060200151925080604001519150505b610b14610aff8961141b565b8f62ffffff168564ffffffffff16858561184f565b7f602f1aeac0ca2e7a13e281a9ef0ad7838542712ce16780fa2ecffd351f05f89983860384610b41610689565b604051610b5093929190612e9f565b60405180910390a1505050505050505050505050505050565b60006106c2604051806060016040528060238152602001612ee6602391396102c4565b6000610b966106d2565b6001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b158015610bce57600080fd5b505afa158015610be2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106c29190612203565b6000610c10610674565b610c186106b0565b03905090565b60405162461bcd60e51b81526004016104119061250b565b610c3e611ed9565b604051634a83e9cd60e11b815260028402906000906001600160a01b03851690639507d39a90610c72908590600401612e8d565b60206040518083038186803b158015610c8a57600080fd5b505afa158015610c9e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cc29190612203565b90506000846001600160a01b0316639507d39a846001016040518263ffffffff1660e01b8152600401610cf59190612e8d565b60206040518083038186803b158015610d0d57600080fd5b505afa158015610d21573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d459190612203565b6040805160608101825293845264ffffffffff828116602086015260289290921c9091169083015250949350505050565b6000806000806000610d866106d2565b6001600160a01b031663ccf8f9696040518163ffffffff1660e01b815260040160206040518083038186803b158015610dbe57600080fd5b505afa158015610dd2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610df691906121dd565b64ffffffffff602882901c811697605083901c82169750607883901c8216965060a09290921c169350915050565b600080610e5c6040518060400160405280601481526020017327ab26afa2bc32b1baba34b7b726b0b730b3b2b960611b8152506102c4565b90506000816001600160a01b0316631c4712a76040518163ffffffff1660e01b815260040160206040518083038186803b158015610e9957600080fd5b505afa158015610ead573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ed19190612203565b90506000610ede87611a02565b9050610eeb818787611a9b565b610f075760405162461bcd60e51b8152600401610411906126ca565b86606001518860200151148015610f22575060408701518851145b8015610f635750610f4a604051806060016040528060228152602001612f09602291396102c4565b6001600160a01b031688608001516001600160a01b0316145b8015610f725750818860a00151145b8015610f89575060608801516001600160a01b0316155b8015610fa45750600088604001516001811115610fa257fe5b145b8015610fc557508660800151805190602001208860c0015180519060200120145b610fe15760405162461bcd60e51b81526004016104119061276a565b506001979650505050505050565b600080610ffb85611363565b9050611008818585611a9b565b6110245760405162461bcd60e51b815260040161041190612c2a565b6000866060015187608001518860a001518960c0015160405160200161104d94939291906123ff565b60405160208183030381529060405280519060200120905060006110708761028f565b80519091508214801561108e57508751602082015164ffffffffff16145b80156110a857508760200151816040015164ffffffffff16145b610fe15760405162461bcd60e51b815260040161041190612adf565b60006002826001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b15801561110157600080fd5b505afa158015611115573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111399190612203565b8161114057fe5b0492915050565b61114f611ef9565b5060408051608081018252601092909202600f81013560e890811c84526012820135901c6020840152601581013560d890811c92840192909252601a0135901c606082015290565b60006111a1610689565b1115611211576000806111b2610d76565b9350935050508064ffffffffff16836060015110156111e35760405162461bcd60e51b815260040161041190612718565b8164ffffffffff168360400151101561120e5760405162461bcd60e51b8152600401610411906125f8565b50505b4260015482604001510110156112395760405162461bcd60e51b815260040161041190612d20565b4360025482606001510110156112615760405162461bcd60e51b815260040161041190612552565b50565b83604001518360400151101561128c5760405162461bcd60e51b815260040161041190612bd5565b8360600151836060015110156112b45760405162461bcd60e51b815260040161041190612df1565b6020830151156112c9576112c9838383611b8c565b50505050565b60008151836041011115611326578260410167ffffffffffffffff811180156112f757600080fd5b506040519080825280601f01601f191660200182016040528015611322576020820181803683370190505b5091505b6040850151606086015160006020850160018153836001820152826021820152866003890160418301376041870190209350505050949350505050565b60006102a86040518060a00160405280600015158152602001848152602001600081526020016000815260200160405180602001604052806000815250815250611c2d565b600083830364ffffffffff161180156113c357506020840151155b156113d3576113d3848483611b8c565b42846040015111156113f75760405162461bcd60e51b815260040161041190612b45565b43846060015111156112c95760405162461bcd60e51b815260040161041190612904565b60008082511161145c5760405162461bcd60e51b81526004018080602001828103825260348152602001806130286034913960400191505060405180910390fd5b815160011415611482578160008151811061147357fe5b602002602001015190506102ab565b60408051610200810182527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56381527f633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d60208201527f890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d818301527f3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd86060808301919091527fecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da60808301527fdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da560a08301527f617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d760c08301527f292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead60e08301527fe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e106101008301527f7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f826101208301527fe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e836365166101408301527f3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c6101608301527fad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e6101808301527fa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab6101a08301527f4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c8626101c08301527f2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf106101e083015282518381529081018352909160009190602082018180368337505085519192506000918291508180805b600184111561182b5750506002820460018084161460005b828110156117a7578a816002028151811061174e57fe5b602002602001015196508a816002026001018151811061176a57fe5b6020026020010151955086602089015285604089015287805190602001208b828151811061179457fe5b6020908102919091010152600101611737565b50801561180a578960018503815181106117bd57fe5b602002602001015195508783601081106117d357fe5b602002015160001b945085602088015284604088015286805190602001208a83815181106117fd57fe5b6020026020010181815250505b80611816576000611819565b60015b60ff168201935060019092019161171f565b8960008151811061183857fe5b602002602001015198505050505050505050919050565b60006118596106d2565b9050600080611866610d76565b50509150915060006040518060a00160405280856001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b1580156118b257600080fd5b505afa1580156118c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118ea9190612203565b81526020018a81526020018981526020018464ffffffffff16815260200160405180602001604052806000815250815250905080600001517f127186556e7be68c7e31263195225b4de02820707889540969f62c05cf73525e826020015183604001518460600151856080015160405161196794939291906124e6565b60405180910390a2600061197a82611c75565b90506000611992836040015186018a86018a8a611c9e565b60405163080549db60e21b81529091506001600160a01b03871690632015276c906119c390859085906004016124d0565b600060405180830381600087803b1580156119dd57600080fd5b505af11580156119f1573d6000803e3d6000fd5b505050505050505050505050505050565b6080810151805160009190826041820167ffffffffffffffff81118015611a2857600080fd5b506040519080825280601f01601f191660200182016040528015611a53576020820181803683370190505b5060408601516060870151919250906000602084016001815383600182015282602182015285604182018760208a0160045afa50604190950190942095505050505050919050565b6000611aa56106d2565b8351604051634a83e9cd60e11b81526001600160a01b039290921691639507d39a91611ad391600401612e7c565b60206040518083038186803b158015611aeb57600080fd5b505afa158015611aff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b239190612203565b611b2c84611c75565b14611b495760405162461bcd60e51b815260040161041190612b16565b611b66836020015185846000015185602001518760400151611cbd565b611b825760405162461bcd60e51b81526004016104119061294c565b5060019392505050565b6000611b9f8364ffffffffff1683610c36565b9050600154816020015164ffffffffff16014210611bcf5760405162461bcd60e51b815260040161041190612647565b806020015164ffffffffff1684604001511115611bfe5760405162461bcd60e51b8152600401610411906129cc565b806040015164ffffffffff16846060015111156112c95760405162461bcd60e51b815260040161041190612c74565b8051602080830151604080850151606086015160808701519251600096611c5896909594910161248f565b604051602081830303815290604052805190602001209050919050565b60008160200151826040015183606001518460800151604051602001611c5894939291906124e6565b602892831b9390931760509190911b1760789290921b91909117901b90565b6000808211611cfd5760405162461bcd60e51b8152600401808060200182810382526037815260200180612f7f6037913960400191505060405180910390fd5b818410611d3b5760405162461bcd60e51b8152600401808060200182810382526024815260200180612f2b6024913960400191505060405180910390fd5b611d4482611e42565b835114611d825760405162461bcd60e51b815260040180806020018281038252604d815260200180612fb6604d913960600191505060405180910390fd5b8460005b8451811015611e35578560011660011415611de457848181518110611da757fe5b6020026020010151826040516020018083815260200182815260200192505050604051602081830303815290604052805190602001209150611e29565b81858281518110611df157fe5b602002602001015160405160200180838152602001828152602001925050506040516020818303038152906040528051906020012091505b600195861c9501611d86565b5090951495945050505050565b6000808211611e825760405162461bcd60e51b8152600401808060200182810382526030815260200180612f4f6030913960400191505060405180910390fd5b8160011415611e93575060006102ab565b81600060805b60018110611ec3576000196001821b01811b831615611ebb5791821c91908101905b60011c611e99565b506001811b8414611ed2576001015b9392505050565b604080516060810182526000808252602082018190529181019190915290565b6040518060800160405280600081526020016000815260200160008152602001600081525090565b600067ffffffffffffffff831115611f3557fe5b611f48601f8401601f1916602001612ec1565b9050828152838383011115611f5c57600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b03811681146102ab57600080fd5b600082601f830112611f9a578081fd5b611ed283833560208501611f21565b8035600281106102ab57600080fd5b600060a08284031215611fc9578081fd5b60405160a0810167ffffffffffffffff8282108183111715611fe757fe5b8160405282935084358352602085013560208401526040850135604084015260608501356060840152608085013591508082111561202457600080fd5b5061203185828601611f8a565b6080830152505092915050565b60006040828403121561204f578081fd5b6040516040810167ffffffffffffffff828210818311171561206d57fe5b816040528293508435835260209150818501358181111561208d57600080fd5b8501601f8101871361209e57600080fd5b8035828111156120aa57fe5b83810292506120ba848401612ec1565b8181528481019083860185850187018b10156120d557600080fd5b600095505b838610156120f85780358352600195909501949186019186016120da565b5080868801525050505050505092915050565b600060a0828403121561211c578081fd5b60405160a0810167ffffffffffffffff828210818311171561213a57fe5b8160405282935084359150811515821461215357600080fd5b818352602085013560208401526040850135604084015260608501356060840152608085013591508082111561202457600080fd5b60008060006060848603121561219c578283fd5b6121a584611f73565b925060208401359150604084013567ffffffffffffffff8111156121c7578182fd5b6121d386828701611f8a565b9150509250925092565b6000602082840312156121ee578081fd5b815164ffffffffff1981168114611ed2578182fd5b600060208284031215612214578081fd5b5051919050565b60006020828403121561222c578081fd5b813567ffffffffffffffff811115612242578182fd5b8201601f81018413612252578182fd5b6103d284823560208401611f21565b60008060008060808587031215612276578081fd5b843567ffffffffffffffff8082111561228d578283fd5b9086019060e082890312156122a0578283fd5b6122aa60e0612ec1565b82358152602083013560208201526122c460408401611fa9565b60408201526122d560608401611f73565b60608201526122e660808401611f73565b608082015260a083013560a082015260c083013582811115612306578485fd5b6123128a828601611f8a565b60c0830152509550602087013591508082111561232d578283fd5b6123398883890161210b565b9450604087013591508082111561234e578283fd5b61235a88838901611fb8565b9350606087013591508082111561236f578283fd5b5061237c8782880161203e565b91505092959194509250565b600060208284031215612399578081fd5b5035919050565b60008151808452815b818110156123c5576020818501810151868301820152016123a9565b818111156123d65782602083870101525b50601f01601f19169290920160200192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612432908301846123a0565b9695505050505050565b6001600160a01b038781168252861660208201526040810185905260c06060820181905260009061246f908301866123a0565b60808301949094525060a00152949350505050565b901515815260200190565b6000861515825285602083015284604083015283606083015260a060808301526124bc60a08301846123a0565b979650505050505050565b90815260200190565b91825264ffffffffff1916602082015260400190565b60008582528460208301528360408301526080606083015261243260808301846123a0565b60208082526027908201527f617070656e64517565756542617463682069732063757272656e746c7920646960408201526639b0b13632b21760c91b606082015260800190565b60208082526029908201527f436f6e7465787420626c6f636b206e756d62657220746f6f2066617220696e206040820152683a3432903830b9ba1760b91b606082015260800190565b6020808252603d908201527f5472616e73616374696f6e20646174612073697a652065786365656473206d6160408201527f78696d756d20666f7220726f6c6c7570207472616e73616374696f6e2e000000606082015260800190565b6020808252602f908201527f436f6e746578742074696d657374616d70206973206c6f776572207468616e2060408201526e3630b9ba1039bab136b4ba3a32b21760891b606082015260800190565b6020808252605b908201527f50726576696f75736c7920656e7175657565642062617463686573206861766560408201527f206578706972656420616e64206d75737420626520617070656e64656420626560608201527f666f72652061206e65772073657175656e6365722062617463682e0000000000608082015260a00190565b6020808252602e908201527f496e76616c69642053657175656e636572207472616e73616374696f6e20696e60408201526d31b63ab9b4b7b710383937b7b31760911b606082015260800190565b60208082526032908201527f436f6e7465787420626c6f636b206e756d626572206973206c6f77657220746860408201527130b7103630b9ba1039bab136b4ba3a32b21760711b606082015260800190565b6020808252601e908201527f496e76616c69642053657175656e636572207472616e73616374696f6e2e0000604082015260600190565b6020808252603d908201527f5472616e73616374696f6e20676173206c696d69742065786365656473206d6160408201527f78696d756d20666f7220726f6c6c7570207472616e73616374696f6e2e000000606082015260800190565b60208082526028908201527f4d7573742070726f76696465206174206c65617374206f6e652062617463682060408201526731b7b73a32bc3a1760c11b606082015260800190565b6020808252602e908201527f4e6f7420616c6c2073657175656e636572207472616e73616374696f6e73207760408201526d32b93290383937b1b2b9b9b2b21760911b606082015260800190565b6020808252604a908201527f41637475616c207472616e73616374696f6e20696e64657820646f6573206e6f60408201527f74206d6174636820657870656374656420746f74616c20656c656d656e7473206060820152693a379030b83832b7321760b11b608082015260a00190565b60208082526028908201527f436f6e7465787420626c6f636b206e756d6265722069732066726f6d2074686560408201526710333aba3ab9329760c11b606082015260800190565b60208082526018908201527f496e76616c696420696e636c7573696f6e2070726f6f662e0000000000000000604082015260600190565b60208082526029908201527f5472616e73616374696f6e20676173206c696d697420746f6f206c6f7720746f6040820152681032b738bab2bab29760b91b606082015260800190565b60208082526043908201527f53657175656e636572207472616e73616374696f6e2074696d657374616d702060408201527f657863656564732074686174206f66206e65787420717565756520656c656d65606082015262373a1760e91b608082015260a00190565b6020808252603d908201527f41637475616c20626174636820737461727420696e64657820646f6573206e6f60408201527f74206d6174636820657870656374656420737461727420696e6465782e000000606082015260800190565b6020808252602d908201527f46756e6374696f6e2063616e206f6e6c792062652063616c6c6564206279207460408201526c34329029b2b8bab2b731b2b91760991b606082015260800190565b6020808252601a908201527f496e76616c6964205175657565207472616e73616374696f6e2e000000000000604082015260600190565b60208082526015908201527424b73b30b634b2103130ba31b4103432b0b232b91760591b604082015260600190565b60208082526025908201527f436f6e746578742074696d657374616d702069732066726f6d207468652066756040820152643a3ab9329760d91b606082015260800190565b6020808252602b908201527f496e73756666696369656e742067617320666f72204c322072617465206c696d60408201526a34ba34b73390313ab9371760a91b606082015260800190565b60208082526035908201527f436f6e746578742074696d657374616d702076616c756573206d757374206d6f6040820152743737ba37b734b1b0b6363c9034b731b932b0b9b29760591b606082015260800190565b6020808252602a908201527f496e76616c6964205175657565207472616e73616374696f6e20696e636c757360408201526934b7b710383937b7b31760b11b606082015260800190565b60208082526045908201527f53657175656e636572207472616e73616374696f6e20626c6f636b4e756d626560408201527f7220657863656564732074686174206f66206e65787420717565756520656c6560608201526436b2b73a1760d91b608082015260a00190565b60208082526021908201527f4d75737420617070656e64206174206c65617374206f6e6520656c656d656e746040820152601760f91b606082015260800190565b60208082526026908201527f436f6e746578742074696d657374616d7020746f6f2066617220696e20746865604082015265103830b9ba1760d11b606082015260800190565b60208082526022908201527f4e6f7420656e6f756768204261746368436f6e74657874732070726f76696465604082015261321760f11b606082015260800190565b60208082526029908201527f4e6f7420656e6f75676820717565756564207472616e73616374696f6e732074604082015268379030b83832b7321760b91b606082015260800190565b60208082526037908201527f436f6e7465787420626c6f636b4e756d6265722076616c756573206d7573742060408201527f6d6f6e6f746f6e6963616c6c7920696e6372656173652e000000000000000000606082015260800190565b8151815260208083015164ffffffffff90811691830191909152604092830151169181019190915260600190565b63ffffffff91909116815260200190565b64ffffffffff91909116815260200190565b64ffffffffff9384168152919092166020820152604081019190915260600190565b60405181810167ffffffffffffffff81118282101715612edd57fe5b60405291905056fe4f564d5f436861696e53746f72616765436f6e7461696e65723a4354433a71756575654f564d5f4465636f6d7072657373696f6e507265636f6d70696c65416464726573734c69625f4d65726b6c65547265653a20496e646578206f7574206f6620626f756e64732e4c69625f4d65726b6c65547265653a2043616e6e6f7420636f6d70757465206365696c286c6f675f3229206f6620302e4c69625f4d65726b6c65547265653a20546f74616c206c6561766573206d7573742062652067726561746572207468616e207a65726f2e4c69625f4d65726b6c65547265653a20546f74616c207369626c696e677320646f6573206e6f7420636f72726563746c7920636f72726573706f6e6420746f20746f74616c206c65617665732e4f564d5f436861696e53746f72616765436f6e7461696e65723a4354433a626174636865734c69625f4d65726b6c65547265653a204d7573742070726f76696465206174206c65617374206f6e65206c65616620686173682ea2646970667358221220828f57135c61279b924bbbcded24811b56f14e0b701fd6564e301e4a1b7d73d364736f6c63430007060033", "devdoc": { "details": "The Canonical Transaction Chain (CTC) contract is an append-only log of transactions which must be applied to the rollup state. It defines the ordering of rollup transactions by writing them to the 'CTC:batches' instance of the Chain Storage Container. The CTC also allows any account to 'enqueue' an L2 transaction, which will require that the Sequencer will eventually append it to the rollup state. If the Sequencer does not include an enqueued transaction within the 'force inclusion period', then any account may force it to be included by calling appendQueueBatch(). Compiler used: solc Runtime target: EVM", "kind": "dev", @@ -694,6 +694,14 @@ "_0": "Reference to the queue storage container." } }, + "resolve(string)": { + "params": { + "_name": "Name to resolve an address for." + }, + "returns": { + "_0": "Address associated with the given name." + } + }, "verifyTransaction((uint256,uint256,uint8,address,address,uint256,bytes),(bool,uint256,uint256,uint256,bytes),(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))": { "params": { "_batchHeader": "Header of the batch the transaction was included in.", @@ -751,6 +759,9 @@ "queue()": { "notice": "Accesses the queue storage container." }, + "resolve(string)": { + "notice": "Resolves the address associated with a given name." + }, "verifyTransaction((uint256,uint256,uint8,address,address,uint256,bytes),(bool,uint256,uint256,uint256,bytes),(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))": { "notice": "Verifies whether a transaction is included in the chain." } @@ -760,15 +771,15 @@ "storageLayout": { "storage": [ { - "astId": 12554, + "astId": 12856, "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_CanonicalTransactionChain.sol:OVM_CanonicalTransactionChain", "label": "libAddressManager", "offset": 0, "slot": "0", - "type": "t_contract(Lib_AddressManager)12547" + "type": "t_contract(Lib_AddressManager)12849" }, { - "astId": 2249, + "astId": 2987, "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_CanonicalTransactionChain.sol:OVM_CanonicalTransactionChain", "label": "forceInclusionPeriodSeconds", "offset": 0, @@ -776,7 +787,7 @@ "type": "t_uint256" }, { - "astId": 2251, + "astId": 2989, "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_CanonicalTransactionChain.sol:OVM_CanonicalTransactionChain", "label": "forceInclusionPeriodBlocks", "offset": 0, @@ -784,7 +795,7 @@ "type": "t_uint256" }, { - "astId": 2253, + "astId": 2991, "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_CanonicalTransactionChain.sol:OVM_CanonicalTransactionChain", "label": "maxTransactionGasLimit", "offset": 0, @@ -793,7 +804,7 @@ } ], "types": { - "t_contract(Lib_AddressManager)12547": { + "t_contract(Lib_AddressManager)12849": { "encoding": "inplace", "label": "contract Lib_AddressManager", "numberOfBytes": "20" diff --git a/packages/contracts/deployments/mainnet/OVM_ChainStorageContainer-CTC-batches.json b/packages/contracts/deployments/mainnet/OVM_ChainStorageContainer-CTC-batches.json index 98fffc8461d26..5d6f0414194d1 100644 --- a/packages/contracts/deployments/mainnet/OVM_ChainStorageContainer-CTC-batches.json +++ b/packages/contracts/deployments/mainnet/OVM_ChainStorageContainer-CTC-batches.json @@ -1,5 +1,5 @@ { - "address": "0x65E921eE201E4a0881FF84ea462baB744bB2fbf0", + "address": "0x28157e8a8E6d22A367c63Ad61dD56d9E6bDCE905", "abi": [ { "inputs": [ @@ -162,7 +162,7 @@ "outputs": [ { "internalType": "address", - "name": "_contract", + "name": "", "type": "address" } ], @@ -196,30 +196,30 @@ "type": "function" } ], - "transactionHash": "0x3abb7147109cf28b011821fdb82e0c25556ea9049f9b4466d49e4ca3ba66f3db", + "transactionHash": "0xbe02f28d8c1f2bbdb313fa33aeccf01d34bf65bdd69e77615c2f0562ba0a857f", "receipt": { "to": null, - "from": "0x77C4c8f491e5ff22a2C0E18b005c3BA0Fe36c1Bc", - "contractAddress": "0x65E921eE201E4a0881FF84ea462baB744bB2fbf0", - "transactionIndex": 43, - "gasUsed": "959533", + "from": "0xd033f09cB85621F98F7A84C64dB381ac16Eff818", + "contractAddress": "0x28157e8a8E6d22A367c63Ad61dD56d9E6bDCE905", + "transactionIndex": 189, + "gasUsed": "971002", "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0xb2874206a5352bb8c8e7cbbe1a18a72aff412ab482441452e2b1ceac3b8c5ec3", - "transactionHash": "0x3abb7147109cf28b011821fdb82e0c25556ea9049f9b4466d49e4ca3ba66f3db", + "blockHash": "0x62b05e0c36dd4480a01d855db04dbdf3521a9edeb48955250e88751fc67b4a4b", + "transactionHash": "0xbe02f28d8c1f2bbdb313fa33aeccf01d34bf65bdd69e77615c2f0562ba0a857f", "logs": [], - "blockNumber": 12207766, - "cumulativeGasUsed": "3990129", + "blockNumber": 12410762, + "cumulativeGasUsed": "11273913", "status": 1, "byzantium": true }, "args": [ - "0xd3EeD86464Ff13B4BFD81a3bB1e753b7ceBA3A39", + "0x668E5b997b9aE88a56cd40409119d4Db9e6d752E", "OVM_CanonicalTransactionChain" ], - "solcInputHash": "43ee6bb8ef92595aa6d0e22a6c464dff", - "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_owner\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"get\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getGlobalMetadata\",\"outputs\":[{\"internalType\":\"bytes27\",\"name\":\"\",\"type\":\"bytes27\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"length\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"_contract\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"setGlobalMetadata\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"setNextOverwritableIndex\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The Chain Storage Container provides its owner contract with read, write and delete functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which can no longer be used in a fraud proof due to the fraud window having passed, and the associated chain state or transactions being finalized. Three distinct Chain Storage Containers will be deployed on Layer 1: 1. Stores transaction batches for the Canonical Transaction Chain 2. Stores queued transactions for the Canonical Transaction Chain 3. Stores chain state batches for the State Commitment Chain Compiler used: solc Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\",\"_owner\":\"Name of the contract that owns this container (will be resolved later).\"}},\"deleteElementsAfterInclusive(uint256)\":{\"params\":{\"_index\":\"Object index to delete from.\"}},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_index\":\"Object index to delete from.\"}},\"get(uint256)\":{\"params\":{\"_index\":\"Index of the particular object to access.\"},\"returns\":{\"_0\":\"32 byte object value.\"}},\"getGlobalMetadata()\":{\"returns\":{\"_0\":\"Container global metadata field.\"}},\"length()\":{\"returns\":{\"_0\":\"Number of objects in the container.\"}},\"push(bytes32)\":{\"params\":{\"_object\":\"A 32 byte value to insert into the container.\"}},\"push(bytes32,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_object\":\"A 32 byte value to insert into the container.\"}},\"setGlobalMetadata(bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata to set.\"}}},\"title\":\"OVM_ChainStorageContainer\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"deleteElementsAfterInclusive(uint256)\":{\"notice\":\"Removes all objects after and including a given index.\"},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"notice\":\"Removes all objects after and including a given index. Also allows setting the global metadata field.\"},\"get(uint256)\":{\"notice\":\"Retrieves an object from the container.\"},\"getGlobalMetadata()\":{\"notice\":\"Retrieves the container's global metadata field.\"},\"length()\":{\"notice\":\"Retrieves the number of objects stored in the container.\"},\"push(bytes32)\":{\"notice\":\"Pushes an object into the container.\"},\"push(bytes32,bytes27)\":{\"notice\":\"Pushes an object into the container. Function allows setting the global metadata since we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global metadata (it's an optimization).\"},\"setGlobalMetadata(bytes27)\":{\"notice\":\"Sets the container's global metadata field. We're using `bytes27` here because we use five bytes to maintain the length of the underlying data structure, meaning we have an extra 27 bytes to store arbitrary data.\"},\"setNextOverwritableIndex(uint256)\":{\"notice\":\"Marks an index as overwritable, meaing the underlying buffer can start to write values over any objects before and including the given index.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol\":\"OVM_ChainStorageContainer\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_RingBuffer } from \\\"../../libraries/utils/Lib_RingBuffer.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_ChainStorageContainer } from \\\"../../iOVM/chain/iOVM_ChainStorageContainer.sol\\\";\\n\\n/**\\n * @title OVM_ChainStorageContainer\\n * @dev The Chain Storage Container provides its owner contract with read, write and delete functionality.\\n * This provides gas efficiency gains by enabling it to overwrite storage slots which can no longer be used\\n * in a fraud proof due to the fraud window having passed, and the associated chain state or\\n * transactions being finalized.\\n * Three distinct Chain Storage Containers will be deployed on Layer 1:\\n * 1. Stores transaction batches for the Canonical Transaction Chain\\n * 2. Stores queued transactions for the Canonical Transaction Chain\\n * 3. Stores chain state batches for the State Commitment Chain\\n *\\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract OVM_ChainStorageContainer is iOVM_ChainStorageContainer, Lib_AddressResolver {\\n\\n /*************\\n * Libraries *\\n *************/\\n\\n using Lib_RingBuffer for Lib_RingBuffer.RingBuffer;\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n string public owner;\\n Lib_RingBuffer.RingBuffer internal buffer;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n * @param _owner Name of the contract that owns this container (will be resolved later).\\n */\\n constructor(\\n address _libAddressManager,\\n string memory _owner\\n )\\n Lib_AddressResolver(_libAddressManager)\\n {\\n owner = _owner;\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n msg.sender == resolve(owner),\\n \\\"OVM_ChainStorageContainer: Function can only be called by the owner.\\\"\\n );\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function setGlobalMetadata(\\n bytes27 _globalMetadata\\n )\\n override\\n public\\n onlyOwner\\n {\\n return buffer.setExtraData(_globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function getGlobalMetadata()\\n override\\n public\\n view\\n returns (\\n bytes27\\n )\\n {\\n return buffer.getExtraData();\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function length()\\n override\\n public\\n view\\n returns (\\n uint256\\n )\\n {\\n return uint256(buffer.getLength());\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function push(\\n bytes32 _object\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.push(_object);\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function push(\\n bytes32 _object,\\n bytes27 _globalMetadata\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.push(_object, _globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function get(\\n uint256 _index\\n )\\n override\\n public\\n view\\n returns (\\n bytes32\\n )\\n {\\n return buffer.get(uint40(_index));\\n }\\n \\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.deleteElementsAfterInclusive(\\n uint40(_index)\\n );\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index,\\n bytes27 _globalMetadata\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.deleteElementsAfterInclusive(\\n uint40(_index),\\n _globalMetadata\\n );\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function setNextOverwritableIndex(\\n uint256 _index\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.nextOverwritableIndex = _index;\\n }\\n}\\n\",\"keccak256\":\"0x52e3ef7166fe134d32997917067e3d74128173b12fb6231eec34132102ddbb50\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_ChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title iOVM_ChainStorageContainer\\n */\\ninterface iOVM_ChainStorageContainer {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata()\\n external\\n view\\n returns (\\n bytes27\\n );\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length()\\n external\\n view\\n returns (\\n uint256\\n );\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(\\n bytes32 _object\\n )\\n external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(\\n bytes32 _object,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(\\n uint256 _index\\n )\\n external\\n view\\n returns (\\n bytes32\\n );\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index\\n )\\n external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Marks an index as overwritable, meaing the underlying buffer can start to write values over\\n * any objects before and including the given index.\\n */\\n function setNextOverwritableIndex(\\n uint256 _index\\n )\\n external;\\n}\\n\",\"keccak256\":\"0x2d7973a0ad84c23ec62624d3f1e3aeb198cc72686ff1e6cfa17155556b320c94\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Contract Imports */\\nimport { Ownable } from \\\"./Lib_Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n /*******************************************\\n * Contract Variables: Internal Accounting *\\n *******************************************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n public\\n onlyOwner\\n {\\n emit AddressSet(_name, _address);\\n addresses[_getNameHash(_name)] = _address;\\n }\\n\\n function getAddress(\\n string memory _name\\n )\\n public\\n view\\n returns (address)\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32 _hash\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0x3a490595cc21ff170e4027843093670ff845d5972481fbfb956b722ea564bb06\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n\\n /*******************************************\\n * Contract Variables: Contract References *\\n *******************************************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(\\n address _libAddressManager\\n ) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function resolve(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address _contract\\n )\\n {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0xaa3ed342f6deb156c660fd83afa579a3b80db17eb465e8949cf5c1b114780143\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Ownable\\n * @dev Adapted from https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol\\n */\\nabstract contract Ownable {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n address public owner;\\n\\n\\n /**********\\n * Events *\\n **********/\\n\\n event OwnershipTransferred(\\n address indexed previousOwner,\\n address indexed newOwner\\n );\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n constructor() {\\n owner = msg.sender;\\n emit OwnershipTransferred(address(0), owner);\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n owner == msg.sender,\\n \\\"Ownable: caller is not the owner\\\"\\n );\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function renounceOwnership()\\n public\\n virtual\\n onlyOwner\\n {\\n emit OwnershipTransferred(owner, address(0));\\n owner = address(0);\\n }\\n\\n function transferOwnership(address _newOwner)\\n public\\n virtual\\n onlyOwner\\n {\\n require(\\n _newOwner != address(0),\\n \\\"Ownable: new owner cannot be the zero address\\\"\\n );\\n\\n emit OwnershipTransferred(owner, _newOwner);\\n owner = _newOwner;\\n }\\n}\\n\",\"keccak256\":\"0xd9dfd9264e5b5fedd53a5b10fdf179c3f367614b0fe69179bce4e45119f5b739\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_RingBuffer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\nlibrary Lib_RingBuffer {\\n using Lib_RingBuffer for RingBuffer;\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Buffer {\\n uint256 length;\\n mapping (uint256 => bytes32) buf;\\n }\\n\\n struct RingBuffer {\\n bytes32 contextA;\\n bytes32 contextB;\\n Buffer bufferA;\\n Buffer bufferB;\\n uint256 nextOverwritableIndex;\\n }\\n\\n struct RingBufferContext {\\n // contextA\\n uint40 globalIndex;\\n bytes27 extraData;\\n\\n // contextB\\n uint64 currBufferIndex;\\n uint40 prevResetIndex;\\n uint40 currResetIndex;\\n }\\n\\n\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 constant MIN_CAPACITY = 16;\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n * @param _extraData Optional global extra data.\\n */\\n function push(\\n RingBuffer storage _self,\\n bytes32 _value,\\n bytes27 _extraData\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n Buffer storage currBuffer = _self.getBuffer(ctx.currBufferIndex);\\n\\n // Set a minimum capacity.\\n if (currBuffer.length == 0) {\\n currBuffer.length = MIN_CAPACITY;\\n }\\n\\n // Check if we need to expand the buffer.\\n if (ctx.globalIndex - ctx.currResetIndex >= currBuffer.length) {\\n if (ctx.currResetIndex < _self.nextOverwritableIndex) {\\n // We're going to overwrite the inactive buffer.\\n // Bump the buffer index, reset the delete offset, and set our reset indices.\\n ctx.currBufferIndex++;\\n ctx.prevResetIndex = ctx.currResetIndex;\\n ctx.currResetIndex = ctx.globalIndex;\\n\\n // Swap over to the next buffer.\\n currBuffer = _self.getBuffer(ctx.currBufferIndex);\\n } else {\\n // We're not overwriting yet, double the length of the current buffer.\\n currBuffer.length *= 2;\\n }\\n }\\n\\n // Index to write to is the difference of the global and reset indices.\\n uint256 writeHead = ctx.globalIndex - ctx.currResetIndex;\\n currBuffer.buf[writeHead] = _value;\\n\\n // Bump the global index and insert our extra data, then save the context.\\n ctx.globalIndex++;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n */\\n function push(\\n RingBuffer storage _self,\\n bytes32 _value\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n \\n _self.push(\\n _value,\\n ctx.extraData\\n );\\n }\\n\\n /**\\n * Retrieves an element from the buffer.\\n * @param _self Buffer to access.\\n * @param _index Element index to retrieve.\\n * @return Value of the element at the given index.\\n */\\n function get(\\n RingBuffer storage _self,\\n uint256 _index\\n )\\n internal\\n view\\n returns (\\n bytes32 \\n )\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n\\n require(\\n _index < ctx.globalIndex,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n Buffer storage currBuffer = _self.getBuffer(ctx.currBufferIndex);\\n Buffer storage prevBuffer = _self.getBuffer(ctx.currBufferIndex + 1);\\n\\n if (_index >= ctx.currResetIndex) {\\n // We're trying to load an element from the current buffer.\\n // Relative index is just the difference from the reset index.\\n uint256 relativeIndex = _index - ctx.currResetIndex;\\n\\n // Shouldn't happen but why not check.\\n require(\\n relativeIndex < currBuffer.length,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n return currBuffer.buf[relativeIndex];\\n } else {\\n // We're trying to load an element from the previous buffer.\\n // Relative index is the difference from the reset index in the other direction.\\n uint256 relativeIndex = ctx.currResetIndex - _index;\\n\\n // Condition only fails in the case that we deleted and flipped buffers.\\n require(\\n ctx.currResetIndex > ctx.prevResetIndex,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n // Make sure we're not trying to read beyond the array.\\n require(\\n relativeIndex <= prevBuffer.length,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n return prevBuffer.buf[prevBuffer.length - relativeIndex];\\n }\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n * @param _extraData Optional global extra data.\\n */\\n function deleteElementsAfterInclusive(\\n RingBuffer storage _self,\\n uint40 _index,\\n bytes27 _extraData\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n\\n require(\\n _index < ctx.globalIndex && _index >= ctx.prevResetIndex,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n if (_index < ctx.currResetIndex) {\\n // We're switching back to the previous buffer.\\n // Reduce the buffer index, set the current reset index back to match the previous one.\\n // We use the equality of these two values to prevent reading beyond this buffer.\\n ctx.currBufferIndex--;\\n ctx.currResetIndex = ctx.prevResetIndex;\\n }\\n\\n // Set our global index and extra data, save the context.\\n ctx.globalIndex = _index;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n */\\n function deleteElementsAfterInclusive(\\n RingBuffer storage _self,\\n uint40 _index\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n _self.deleteElementsAfterInclusive(\\n _index,\\n ctx.extraData\\n );\\n }\\n\\n /**\\n * Retrieves the current global index.\\n * @param _self Buffer to access.\\n * @return Current global index.\\n */\\n function getLength(\\n RingBuffer storage _self\\n )\\n internal\\n view\\n returns (\\n uint40\\n )\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n return ctx.globalIndex;\\n }\\n\\n /**\\n * Changes current global extra data.\\n * @param _self Buffer to access.\\n * @param _extraData New global extra data.\\n */\\n function setExtraData(\\n RingBuffer storage _self,\\n bytes27 _extraData\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Retrieves the current global extra data.\\n * @param _self Buffer to access.\\n * @return Current global extra data.\\n */\\n function getExtraData(\\n RingBuffer storage _self\\n )\\n internal\\n view\\n returns (\\n bytes27\\n )\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n return ctx.extraData;\\n }\\n\\n /**\\n * Sets the current ring buffer context.\\n * @param _self Buffer to access.\\n * @param _ctx Current ring buffer context.\\n */\\n function setContext(\\n RingBuffer storage _self,\\n RingBufferContext memory _ctx\\n )\\n internal\\n {\\n bytes32 contextA;\\n bytes32 contextB;\\n\\n uint40 globalIndex = _ctx.globalIndex;\\n bytes27 extraData = _ctx.extraData;\\n assembly {\\n contextA := globalIndex\\n contextA := or(contextA, extraData)\\n }\\n\\n uint64 currBufferIndex = _ctx.currBufferIndex;\\n uint40 prevResetIndex = _ctx.prevResetIndex;\\n uint40 currResetIndex = _ctx.currResetIndex;\\n assembly {\\n contextB := currBufferIndex\\n contextB := or(contextB, shl(64, prevResetIndex))\\n contextB := or(contextB, shl(104, currResetIndex))\\n }\\n\\n if (_self.contextA != contextA) {\\n _self.contextA = contextA;\\n }\\n\\n if (_self.contextB != contextB) {\\n _self.contextB = contextB;\\n }\\n }\\n\\n /**\\n * Retrieves the current ring buffer context.\\n * @param _self Buffer to access.\\n * @return Current ring buffer context.\\n */\\n function getContext(\\n RingBuffer storage _self\\n )\\n internal\\n view\\n returns (\\n RingBufferContext memory\\n )\\n {\\n bytes32 contextA = _self.contextA;\\n bytes32 contextB = _self.contextB;\\n\\n uint40 globalIndex;\\n bytes27 extraData;\\n assembly {\\n globalIndex := and(contextA, 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF)\\n extraData := and(contextA, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000)\\n }\\n\\n uint64 currBufferIndex;\\n uint40 prevResetIndex;\\n uint40 currResetIndex;\\n assembly {\\n currBufferIndex := and(contextB, 0x000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF)\\n prevResetIndex := shr(64, and(contextB, 0x00000000000000000000000000000000000000FFFFFFFFFF0000000000000000))\\n currResetIndex := shr(104, and(contextB, 0x0000000000000000000000000000FFFFFFFFFF00000000000000000000000000))\\n }\\n\\n return RingBufferContext({\\n globalIndex: globalIndex,\\n extraData: extraData,\\n currBufferIndex: currBufferIndex,\\n prevResetIndex: prevResetIndex,\\n currResetIndex: currResetIndex\\n });\\n }\\n\\n /**\\n * Retrieves the a buffer from the ring buffer by index.\\n * @param _self Buffer to access.\\n * @param _which Index of the sub buffer to access.\\n * @return Sub buffer for the index.\\n */\\n function getBuffer(\\n RingBuffer storage _self,\\n uint256 _which\\n )\\n internal\\n view\\n returns (\\n Buffer storage\\n )\\n {\\n return _which % 2 == 0 ? _self.bufferA : _self.bufferB;\\n }\\n}\\n\",\"keccak256\":\"0xb38cb98da2d09f922d5cfe772bdbd36ede2b2267ade93128e949c9da21b89940\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x60806040523480156200001157600080fd5b506040516200116438038062001164833981810160405260408110156200003757600080fd5b8151602083018051604051929492938301929190846401000000008211156200005f57600080fd5b9083019060208201858111156200007557600080fd5b82516401000000008111828201881017156200009057600080fd5b82525081516020918201929091019080838360005b83811015620000bf578181015183820152602001620000a5565b50505050905090810190601f168015620000ed5780820380516001836020036101000a031916815260200191505b506040525050600080546001600160a01b0319166001600160a01b038516179055508051620001249060019060208401906200012d565b505050620001d9565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282620001655760008555620001b0565b82601f106200018057805160ff1916838001178555620001b0565b82800160010185558215620001b0579182015b82811115620001b057825182559160200191906001019062000193565b50620001be929150620001c2565b5090565b5b80821115620001be5760008155600101620001c3565b610f7b80620001e96000396000f3fe608060405234801561001057600080fd5b50600436106100b45760003560e01c80634651d91e116100715780634651d91e1461021a5780638da5cb5b146102375780639507d39a146102b4578063b298e36b146102d1578063ccf8f969146102ee578063fa9e936c14610311576100b4565b8063167fd681146100b95780631f7b6d32146100e65780632015276c1461010057806329061de21461012b578063299ca47814610150578063461a447814610174575b600080fd5b6100e4600480360360408110156100cf57600080fd5b508035906020013564ffffffffff191661032e565b005b6100ee610423565b60408051918252519081900360200190f35b6100e46004803603604081101561011657600080fd5b508035906020013564ffffffffff191661043b565b6100e46004803603602081101561014157600080fd5b503564ffffffffff19166104f7565b6101586105b5565b604080516001600160a01b039092168252519081900360200190f35b6101586004803603602081101561018a57600080fd5b8101906020810181356401000000008111156101a557600080fd5b8201836020820111156101b757600080fd5b803590602001918460018302840111640100000000831117156101d957600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506105c4945050505050565b6100e46004803603602081101561023057600080fd5b50356106a0565b61023f61075b565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610279578181015183820152602001610261565b50505050905090810190601f1680156102a65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6100ee600480360360208110156102ca57600080fd5b50356107e8565b6100e4600480360360208110156102e757600080fd5b5035610802565b6102f66108bd565b6040805164ffffffffff199092168252519081900360200190f35b6100e46004803603602081101561032757600080fd5b50356108ce565b60018054604080516020601f6002600019610100878916150201909516949094049384018190048102820181019092528281526103c493909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b820191906000526020600020905b81548152906001019060200180831161039d57829003601f168201915b50505050506105c4565b6001600160a01b0316336001600160a01b0316146104135760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b61041f60028383610983565b5050565b600061042f6002610a75565b64ffffffffff16905090565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261049c93909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146104eb5760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b61041f60028383610a89565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261055893909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146105a75760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b6105b2600282610b90565b50565b6000546001600160a01b031681565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b8381101561062457818101518382015260200161060c565b50505050905090810190601f1680156106515780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561066e57600080fd5b505afa158015610682573d6000803e3d6000fd5b505050506040513d602081101561069857600080fd5b505192915050565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261070193909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146107505760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b6105b2600282610bba565b60018054604080516020600284861615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156107e05780601f106107b5576101008083540402835291602001916107e0565b820191906000526020600020905b8154815290600101906020018083116107c357829003601f168201915b505050505081565b60006107fc600264ffffffffff8416610be0565b92915050565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261086393909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146108b25760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b6105b2600282610de9565b60006108c96002610e0f565b905090565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261092f93909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b03161461097e5760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b600855565b600061098e84610e26565b9050806000015164ffffffffff168364ffffffffff161080156109c35750806060015164ffffffffff168364ffffffffff1610155b610a0b576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b806080015164ffffffffff168364ffffffffff161015610a4d576040810180516000190167ffffffffffffffff169052606081015164ffffffffff1660808201525b64ffffffffff8316815264ffffffffff1982166020820152610a6f8482610e86565b50505050565b600080610a8183610e26565b519392505050565b6000610a9484610e26565b90506000610ab9826040015167ffffffffffffffff1686610edc90919063ffffffff16565b8054909150610ac757601081555b8054608083015183510364ffffffffff1610610b3e578460060154826080015164ffffffffff161015610b365760408201805160010167ffffffffffffffff169081905260808301805164ffffffffff90811660608601528451169052610b2f908690610edc565b9050610b3e565b805460020281555b608082015182510364ffffffffff9081166000818152600184810160209081526040909220889055855101909216845264ffffffffff19851691840191909152610b888684610e86565b505050505050565b6000610b9b83610e26565b64ffffffffff19831660208201529050610bb58382610e86565b505050565b6000610bc583610e26565b9050610bb5828260200151856109839092919063ffffffff16565b600080610bec84610e26565b805190915064ffffffffff168310610c42576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b6000610c65826040015167ffffffffffffffff1686610edc90919063ffffffff16565b90506000610c8d836040015160010167ffffffffffffffff1687610edc90919063ffffffff16565b9050826080015164ffffffffff168510610d1a576080830151825464ffffffffff9091168603908110610cfe576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b6000908152600190920160205250604090205491506107fc9050565b6080830151606084015164ffffffffff9182168781039290911610610d7d576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b8154811115610dca576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b81540360009081526001909101602052604090205492506107fc915050565b6000610df483610e26565b9050610bb582826020015185610a899092919063ffffffff16565b600080610e1b83610e26565b602001519392505050565b610e2e610efc565b5080546001909101546040805160a08101825264ffffffffff808516825264ffffffffff19909416602082015267ffffffffffffffff8316818301529082901c8316606082015260689190911c909116608082015290565b80516020820151604080840151606085015160808601518754858717969483901b8417606883901b1795939291908714610ebe578689555b85896001015414610ed157600189018690555b505050505050505050565b60006002820615610ef05782600401610ef5565b826002015b9392505050565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091529056fe4f564d5f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2063616e206f6e6c792062652063616c6c656420627920746865206f776e65722ea164736f6c6343000706000a", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100b45760003560e01c80634651d91e116100715780634651d91e1461021a5780638da5cb5b146102375780639507d39a146102b4578063b298e36b146102d1578063ccf8f969146102ee578063fa9e936c14610311576100b4565b8063167fd681146100b95780631f7b6d32146100e65780632015276c1461010057806329061de21461012b578063299ca47814610150578063461a447814610174575b600080fd5b6100e4600480360360408110156100cf57600080fd5b508035906020013564ffffffffff191661032e565b005b6100ee610423565b60408051918252519081900360200190f35b6100e46004803603604081101561011657600080fd5b508035906020013564ffffffffff191661043b565b6100e46004803603602081101561014157600080fd5b503564ffffffffff19166104f7565b6101586105b5565b604080516001600160a01b039092168252519081900360200190f35b6101586004803603602081101561018a57600080fd5b8101906020810181356401000000008111156101a557600080fd5b8201836020820111156101b757600080fd5b803590602001918460018302840111640100000000831117156101d957600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506105c4945050505050565b6100e46004803603602081101561023057600080fd5b50356106a0565b61023f61075b565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610279578181015183820152602001610261565b50505050905090810190601f1680156102a65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6100ee600480360360208110156102ca57600080fd5b50356107e8565b6100e4600480360360208110156102e757600080fd5b5035610802565b6102f66108bd565b6040805164ffffffffff199092168252519081900360200190f35b6100e46004803603602081101561032757600080fd5b50356108ce565b60018054604080516020601f6002600019610100878916150201909516949094049384018190048102820181019092528281526103c493909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b820191906000526020600020905b81548152906001019060200180831161039d57829003601f168201915b50505050506105c4565b6001600160a01b0316336001600160a01b0316146104135760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b61041f60028383610983565b5050565b600061042f6002610a75565b64ffffffffff16905090565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261049c93909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146104eb5760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b61041f60028383610a89565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261055893909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146105a75760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b6105b2600282610b90565b50565b6000546001600160a01b031681565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b8381101561062457818101518382015260200161060c565b50505050905090810190601f1680156106515780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561066e57600080fd5b505afa158015610682573d6000803e3d6000fd5b505050506040513d602081101561069857600080fd5b505192915050565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261070193909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146107505760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b6105b2600282610bba565b60018054604080516020600284861615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156107e05780601f106107b5576101008083540402835291602001916107e0565b820191906000526020600020905b8154815290600101906020018083116107c357829003601f168201915b505050505081565b60006107fc600264ffffffffff8416610be0565b92915050565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261086393909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146108b25760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b6105b2600282610de9565b60006108c96002610e0f565b905090565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261092f93909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b03161461097e5760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b600855565b600061098e84610e26565b9050806000015164ffffffffff168364ffffffffff161080156109c35750806060015164ffffffffff168364ffffffffff1610155b610a0b576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b806080015164ffffffffff168364ffffffffff161015610a4d576040810180516000190167ffffffffffffffff169052606081015164ffffffffff1660808201525b64ffffffffff8316815264ffffffffff1982166020820152610a6f8482610e86565b50505050565b600080610a8183610e26565b519392505050565b6000610a9484610e26565b90506000610ab9826040015167ffffffffffffffff1686610edc90919063ffffffff16565b8054909150610ac757601081555b8054608083015183510364ffffffffff1610610b3e578460060154826080015164ffffffffff161015610b365760408201805160010167ffffffffffffffff169081905260808301805164ffffffffff90811660608601528451169052610b2f908690610edc565b9050610b3e565b805460020281555b608082015182510364ffffffffff9081166000818152600184810160209081526040909220889055855101909216845264ffffffffff19851691840191909152610b888684610e86565b505050505050565b6000610b9b83610e26565b64ffffffffff19831660208201529050610bb58382610e86565b505050565b6000610bc583610e26565b9050610bb5828260200151856109839092919063ffffffff16565b600080610bec84610e26565b805190915064ffffffffff168310610c42576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b6000610c65826040015167ffffffffffffffff1686610edc90919063ffffffff16565b90506000610c8d836040015160010167ffffffffffffffff1687610edc90919063ffffffff16565b9050826080015164ffffffffff168510610d1a576080830151825464ffffffffff9091168603908110610cfe576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b6000908152600190920160205250604090205491506107fc9050565b6080830151606084015164ffffffffff9182168781039290911610610d7d576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b8154811115610dca576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b81540360009081526001909101602052604090205492506107fc915050565b6000610df483610e26565b9050610bb582826020015185610a899092919063ffffffff16565b600080610e1b83610e26565b602001519392505050565b610e2e610efc565b5080546001909101546040805160a08101825264ffffffffff808516825264ffffffffff19909416602082015267ffffffffffffffff8316818301529082901c8316606082015260689190911c909116608082015290565b80516020820151604080840151606085015160808601518754858717969483901b8417606883901b1795939291908714610ebe578689555b85896001015414610ed157600189018690555b505050505050505050565b60006002820615610ef05782600401610ef5565b826002015b9392505050565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091529056fe4f564d5f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2063616e206f6e6c792062652063616c6c656420627920746865206f776e65722ea164736f6c6343000706000a", + "solcInputHash": "f2bdab652d5102f5f11e78dae866798d", + "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_owner\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"get\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getGlobalMetadata\",\"outputs\":[{\"internalType\":\"bytes27\",\"name\":\"\",\"type\":\"bytes27\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"length\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"setGlobalMetadata\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"setNextOverwritableIndex\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The Chain Storage Container provides its owner contract with read, write and delete functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which can no longer be used in a fraud proof due to the fraud window having passed, and the associated chain state or transactions being finalized. Three distinct Chain Storage Containers will be deployed on Layer 1: 1. Stores transaction batches for the Canonical Transaction Chain 2. Stores queued transactions for the Canonical Transaction Chain 3. Stores chain state batches for the State Commitment Chain Compiler used: solc Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\",\"_owner\":\"Name of the contract that owns this container (will be resolved later).\"}},\"deleteElementsAfterInclusive(uint256)\":{\"params\":{\"_index\":\"Object index to delete from.\"}},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_index\":\"Object index to delete from.\"}},\"get(uint256)\":{\"params\":{\"_index\":\"Index of the particular object to access.\"},\"returns\":{\"_0\":\"32 byte object value.\"}},\"getGlobalMetadata()\":{\"returns\":{\"_0\":\"Container global metadata field.\"}},\"length()\":{\"returns\":{\"_0\":\"Number of objects in the container.\"}},\"push(bytes32)\":{\"params\":{\"_object\":\"A 32 byte value to insert into the container.\"}},\"push(bytes32,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_object\":\"A 32 byte value to insert into the container.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}},\"setGlobalMetadata(bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata to set.\"}}},\"title\":\"OVM_ChainStorageContainer\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"deleteElementsAfterInclusive(uint256)\":{\"notice\":\"Removes all objects after and including a given index.\"},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"notice\":\"Removes all objects after and including a given index. Also allows setting the global metadata field.\"},\"get(uint256)\":{\"notice\":\"Retrieves an object from the container.\"},\"getGlobalMetadata()\":{\"notice\":\"Retrieves the container's global metadata field.\"},\"length()\":{\"notice\":\"Retrieves the number of objects stored in the container.\"},\"push(bytes32)\":{\"notice\":\"Pushes an object into the container.\"},\"push(bytes32,bytes27)\":{\"notice\":\"Pushes an object into the container. Function allows setting the global metadata since we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global metadata (it's an optimization).\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"},\"setGlobalMetadata(bytes27)\":{\"notice\":\"Sets the container's global metadata field. We're using `bytes27` here because we use five bytes to maintain the length of the underlying data structure, meaning we have an extra 27 bytes to store arbitrary data.\"},\"setNextOverwritableIndex(uint256)\":{\"notice\":\"Marks an index as overwritable, meaing the underlying buffer can start to write values over any objects before and including the given index.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol\":\"OVM_ChainStorageContainer\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor () internal {\\n address msgSender = _msgSender();\\n _owner = msgSender;\\n emit OwnershipTransferred(address(0), msgSender);\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n emit OwnershipTransferred(_owner, address(0));\\n _owner = address(0);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n emit OwnershipTransferred(_owner, newOwner);\\n _owner = newOwner;\\n }\\n}\\n\",\"keccak256\":\"0x15e2d5bd4c28a88548074c54d220e8086f638a71ed07e6b3ba5a70066fcf458d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with GSN meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address payable) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes memory) {\\n this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x8d3cb350f04ff49cfb10aef08d87f19dcbaecc8027b0bed12f3275cd12f38cf0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_RingBuffer } from \\\"../../libraries/utils/Lib_RingBuffer.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_ChainStorageContainer } from \\\"../../iOVM/chain/iOVM_ChainStorageContainer.sol\\\";\\n\\n/**\\n * @title OVM_ChainStorageContainer\\n * @dev The Chain Storage Container provides its owner contract with read, write and delete functionality.\\n * This provides gas efficiency gains by enabling it to overwrite storage slots which can no longer be used\\n * in a fraud proof due to the fraud window having passed, and the associated chain state or\\n * transactions being finalized.\\n * Three distinct Chain Storage Containers will be deployed on Layer 1:\\n * 1. Stores transaction batches for the Canonical Transaction Chain\\n * 2. Stores queued transactions for the Canonical Transaction Chain\\n * 3. Stores chain state batches for the State Commitment Chain\\n *\\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract OVM_ChainStorageContainer is iOVM_ChainStorageContainer, Lib_AddressResolver {\\n\\n /*************\\n * Libraries *\\n *************/\\n\\n using Lib_RingBuffer for Lib_RingBuffer.RingBuffer;\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n string public owner;\\n Lib_RingBuffer.RingBuffer internal buffer;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n * @param _owner Name of the contract that owns this container (will be resolved later).\\n */\\n constructor(\\n address _libAddressManager,\\n string memory _owner\\n )\\n Lib_AddressResolver(_libAddressManager)\\n {\\n owner = _owner;\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n msg.sender == resolve(owner),\\n \\\"OVM_ChainStorageContainer: Function can only be called by the owner.\\\"\\n );\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function setGlobalMetadata(\\n bytes27 _globalMetadata\\n )\\n override\\n public\\n onlyOwner\\n {\\n return buffer.setExtraData(_globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function getGlobalMetadata()\\n override\\n public\\n view\\n returns (\\n bytes27\\n )\\n {\\n return buffer.getExtraData();\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function length()\\n override\\n public\\n view\\n returns (\\n uint256\\n )\\n {\\n return uint256(buffer.getLength());\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function push(\\n bytes32 _object\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.push(_object);\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function push(\\n bytes32 _object,\\n bytes27 _globalMetadata\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.push(_object, _globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function get(\\n uint256 _index\\n )\\n override\\n public\\n view\\n returns (\\n bytes32\\n )\\n {\\n return buffer.get(uint40(_index));\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.deleteElementsAfterInclusive(\\n uint40(_index)\\n );\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index,\\n bytes27 _globalMetadata\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.deleteElementsAfterInclusive(\\n uint40(_index),\\n _globalMetadata\\n );\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function setNextOverwritableIndex(\\n uint256 _index\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.nextOverwritableIndex = _index;\\n }\\n}\\n\",\"keccak256\":\"0x93325c961516aa2a22bf1aacf4029353d5e3b693e04b485753170337b50224e6\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_ChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title iOVM_ChainStorageContainer\\n */\\ninterface iOVM_ChainStorageContainer {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata()\\n external\\n view\\n returns (\\n bytes27\\n );\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length()\\n external\\n view\\n returns (\\n uint256\\n );\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(\\n bytes32 _object\\n )\\n external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(\\n bytes32 _object,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(\\n uint256 _index\\n )\\n external\\n view\\n returns (\\n bytes32\\n );\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index\\n )\\n external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Marks an index as overwritable, meaing the underlying buffer can start to write values over\\n * any objects before and including the given index.\\n */\\n function setNextOverwritableIndex(\\n uint256 _index\\n )\\n external;\\n}\\n\",\"keccak256\":\"0x2d7973a0ad84c23ec62624d3f1e3aeb198cc72686ff1e6cfa17155556b320c94\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n external\\n onlyOwner\\n {\\n addresses[_getNameHash(_name)] = _address;\\n\\n emit AddressSet(\\n _name,\\n _address\\n );\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(\\n string memory _name\\n )\\n external\\n view\\n returns (\\n address\\n )\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xcc9fc5c64f1101a5c6c397594086b1608189a9edc5c9635e1ac38f70aeeeecbf\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(\\n address _libAddressManager\\n ) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x65981feeabff6a81783ea97d44baf988a18a86c8cb374c46fdb71819cbacc7c0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_RingBuffer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\nlibrary Lib_RingBuffer {\\n using Lib_RingBuffer for RingBuffer;\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Buffer {\\n uint256 length;\\n mapping (uint256 => bytes32) buf;\\n }\\n\\n struct RingBuffer {\\n bytes32 contextA;\\n bytes32 contextB;\\n Buffer bufferA;\\n Buffer bufferB;\\n uint256 nextOverwritableIndex;\\n }\\n\\n struct RingBufferContext {\\n // contextA\\n uint40 globalIndex;\\n bytes27 extraData;\\n\\n // contextB\\n uint64 currBufferIndex;\\n uint40 prevResetIndex;\\n uint40 currResetIndex;\\n }\\n\\n\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 constant MIN_CAPACITY = 16;\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n * @param _extraData Optional global extra data.\\n */\\n function push(\\n RingBuffer storage _self,\\n bytes32 _value,\\n bytes27 _extraData\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n Buffer storage currBuffer = _self.getBuffer(ctx.currBufferIndex);\\n\\n // Set a minimum capacity.\\n if (currBuffer.length == 0) {\\n currBuffer.length = MIN_CAPACITY;\\n }\\n\\n // Check if we need to expand the buffer.\\n if (ctx.globalIndex - ctx.currResetIndex >= currBuffer.length) {\\n if (ctx.currResetIndex < _self.nextOverwritableIndex) {\\n // We're going to overwrite the inactive buffer.\\n // Bump the buffer index, reset the delete offset, and set our reset indices.\\n ctx.currBufferIndex++;\\n ctx.prevResetIndex = ctx.currResetIndex;\\n ctx.currResetIndex = ctx.globalIndex;\\n\\n // Swap over to the next buffer.\\n currBuffer = _self.getBuffer(ctx.currBufferIndex);\\n } else {\\n // We're not overwriting yet, double the length of the current buffer.\\n currBuffer.length *= 2;\\n }\\n }\\n\\n // Index to write to is the difference of the global and reset indices.\\n uint256 writeHead = ctx.globalIndex - ctx.currResetIndex;\\n currBuffer.buf[writeHead] = _value;\\n\\n // Bump the global index and insert our extra data, then save the context.\\n ctx.globalIndex++;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n */\\n function push(\\n RingBuffer storage _self,\\n bytes32 _value\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n\\n _self.push(\\n _value,\\n ctx.extraData\\n );\\n }\\n\\n /**\\n * Retrieves an element from the buffer.\\n * @param _self Buffer to access.\\n * @param _index Element index to retrieve.\\n * @return Value of the element at the given index.\\n */\\n function get(\\n RingBuffer storage _self,\\n uint256 _index\\n )\\n internal\\n view\\n returns (\\n bytes32\\n )\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n\\n require(\\n _index < ctx.globalIndex,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n Buffer storage currBuffer = _self.getBuffer(ctx.currBufferIndex);\\n Buffer storage prevBuffer = _self.getBuffer(ctx.currBufferIndex + 1);\\n\\n if (_index >= ctx.currResetIndex) {\\n // We're trying to load an element from the current buffer.\\n // Relative index is just the difference from the reset index.\\n uint256 relativeIndex = _index - ctx.currResetIndex;\\n\\n // Shouldn't happen but why not check.\\n require(\\n relativeIndex < currBuffer.length,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n return currBuffer.buf[relativeIndex];\\n } else {\\n // We're trying to load an element from the previous buffer.\\n // Relative index is the difference from the reset index in the other direction.\\n uint256 relativeIndex = ctx.currResetIndex - _index;\\n\\n // Condition only fails in the case that we deleted and flipped buffers.\\n require(\\n ctx.currResetIndex > ctx.prevResetIndex,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n // Make sure we're not trying to read beyond the array.\\n require(\\n relativeIndex <= prevBuffer.length,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n return prevBuffer.buf[prevBuffer.length - relativeIndex];\\n }\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n * @param _extraData Optional global extra data.\\n */\\n function deleteElementsAfterInclusive(\\n RingBuffer storage _self,\\n uint40 _index,\\n bytes27 _extraData\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n\\n require(\\n _index < ctx.globalIndex && _index >= ctx.prevResetIndex,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n if (_index < ctx.currResetIndex) {\\n // We're switching back to the previous buffer.\\n // Reduce the buffer index, set the current reset index back to match the previous one.\\n // We use the equality of these two values to prevent reading beyond this buffer.\\n ctx.currBufferIndex--;\\n ctx.currResetIndex = ctx.prevResetIndex;\\n }\\n\\n // Set our global index and extra data, save the context.\\n ctx.globalIndex = _index;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n */\\n function deleteElementsAfterInclusive(\\n RingBuffer storage _self,\\n uint40 _index\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n _self.deleteElementsAfterInclusive(\\n _index,\\n ctx.extraData\\n );\\n }\\n\\n /**\\n * Retrieves the current global index.\\n * @param _self Buffer to access.\\n * @return Current global index.\\n */\\n function getLength(\\n RingBuffer storage _self\\n )\\n internal\\n view\\n returns (\\n uint40\\n )\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n return ctx.globalIndex;\\n }\\n\\n /**\\n * Changes current global extra data.\\n * @param _self Buffer to access.\\n * @param _extraData New global extra data.\\n */\\n function setExtraData(\\n RingBuffer storage _self,\\n bytes27 _extraData\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Retrieves the current global extra data.\\n * @param _self Buffer to access.\\n * @return Current global extra data.\\n */\\n function getExtraData(\\n RingBuffer storage _self\\n )\\n internal\\n view\\n returns (\\n bytes27\\n )\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n return ctx.extraData;\\n }\\n\\n /**\\n * Sets the current ring buffer context.\\n * @param _self Buffer to access.\\n * @param _ctx Current ring buffer context.\\n */\\n function setContext(\\n RingBuffer storage _self,\\n RingBufferContext memory _ctx\\n )\\n internal\\n {\\n bytes32 contextA;\\n bytes32 contextB;\\n\\n uint40 globalIndex = _ctx.globalIndex;\\n bytes27 extraData = _ctx.extraData;\\n assembly {\\n contextA := globalIndex\\n contextA := or(contextA, extraData)\\n }\\n\\n uint64 currBufferIndex = _ctx.currBufferIndex;\\n uint40 prevResetIndex = _ctx.prevResetIndex;\\n uint40 currResetIndex = _ctx.currResetIndex;\\n assembly {\\n contextB := currBufferIndex\\n contextB := or(contextB, shl(64, prevResetIndex))\\n contextB := or(contextB, shl(104, currResetIndex))\\n }\\n\\n if (_self.contextA != contextA) {\\n _self.contextA = contextA;\\n }\\n\\n if (_self.contextB != contextB) {\\n _self.contextB = contextB;\\n }\\n }\\n\\n /**\\n * Retrieves the current ring buffer context.\\n * @param _self Buffer to access.\\n * @return Current ring buffer context.\\n */\\n function getContext(\\n RingBuffer storage _self\\n )\\n internal\\n view\\n returns (\\n RingBufferContext memory\\n )\\n {\\n bytes32 contextA = _self.contextA;\\n bytes32 contextB = _self.contextB;\\n\\n uint40 globalIndex;\\n bytes27 extraData;\\n assembly {\\n globalIndex := and(contextA, 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF)\\n extraData := and(contextA, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000)\\n }\\n\\n uint64 currBufferIndex;\\n uint40 prevResetIndex;\\n uint40 currResetIndex;\\n assembly {\\n currBufferIndex := and(contextB, 0x000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF)\\n prevResetIndex := shr(64, and(contextB, 0x00000000000000000000000000000000000000FFFFFFFFFF0000000000000000))\\n currResetIndex := shr(104, and(contextB, 0x0000000000000000000000000000FFFFFFFFFF00000000000000000000000000))\\n }\\n\\n return RingBufferContext({\\n globalIndex: globalIndex,\\n extraData: extraData,\\n currBufferIndex: currBufferIndex,\\n prevResetIndex: prevResetIndex,\\n currResetIndex: currResetIndex\\n });\\n }\\n\\n /**\\n * Retrieves the a buffer from the ring buffer by index.\\n * @param _self Buffer to access.\\n * @param _which Index of the sub buffer to access.\\n * @return Sub buffer for the index.\\n */\\n function getBuffer(\\n RingBuffer storage _self,\\n uint256 _which\\n )\\n internal\\n view\\n returns (\\n Buffer storage\\n )\\n {\\n return _which % 2 == 0 ? _self.bufferA : _self.bufferB;\\n }\\n}\\n\",\"keccak256\":\"0xe30fc56d4499f98582e1f800dfa3b343f171163a557266c31a56449d5fd3ffae\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x60806040523480156200001157600080fd5b506040516200118d3803806200118d833981810160405260408110156200003757600080fd5b8151602083018051604051929492938301929190846401000000008211156200005f57600080fd5b9083019060208201858111156200007557600080fd5b82516401000000008111828201881017156200009057600080fd5b82525081516020918201929091019080838360005b83811015620000bf578181015183820152602001620000a5565b50505050905090810190601f168015620000ed5780820380516001836020036101000a031916815260200191505b506040525050600080546001600160a01b0319166001600160a01b038516179055508051620001249060019060208401906200012d565b505050620001d9565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282620001655760008555620001b0565b82601f106200018057805160ff1916838001178555620001b0565b82800160010185558215620001b0579182015b82811115620001b057825182559160200191906001019062000193565b50620001be929150620001c2565b5090565b5b80821115620001be5760008155600101620001c3565b610fa480620001e96000396000f3fe608060405234801561001057600080fd5b50600436106100b45760003560e01c80634651d91e116100715780634651d91e1461021a5780638da5cb5b146102375780639507d39a146102b4578063b298e36b146102d1578063ccf8f969146102ee578063fa9e936c14610311576100b4565b8063167fd681146100b95780631f7b6d32146100e65780632015276c1461010057806329061de21461012b578063299ca47814610150578063461a447814610174575b600080fd5b6100e4600480360360408110156100cf57600080fd5b508035906020013564ffffffffff191661032e565b005b6100ee610423565b60408051918252519081900360200190f35b6100e46004803603604081101561011657600080fd5b508035906020013564ffffffffff191661043b565b6100e46004803603602081101561014157600080fd5b503564ffffffffff19166104f7565b6101586105b5565b604080516001600160a01b039092168252519081900360200190f35b6101586004803603602081101561018a57600080fd5b8101906020810181356401000000008111156101a557600080fd5b8201836020820111156101b757600080fd5b803590602001918460018302840111640100000000831117156101d957600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506105c4945050505050565b6100e46004803603602081101561023057600080fd5b50356106a0565b61023f61075b565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610279578181015183820152602001610261565b50505050905090810190601f1680156102a65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6100ee600480360360208110156102ca57600080fd5b50356107e8565b6100e4600480360360208110156102e757600080fd5b5035610802565b6102f66108bd565b6040805164ffffffffff199092168252519081900360200190f35b6100e46004803603602081101561032757600080fd5b50356108ce565b60018054604080516020601f6002600019610100878916150201909516949094049384018190048102820181019092528281526103c493909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b820191906000526020600020905b81548152906001019060200180831161039d57829003601f168201915b50505050506105c4565b6001600160a01b0316336001600160a01b0316146104135760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b61041f60028383610983565b5050565b600061042f6002610a75565b64ffffffffff16905090565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261049c93909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146104eb5760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b61041f60028383610a89565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261055893909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146105a75760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b6105b2600282610b90565b50565b6000546001600160a01b031681565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b8381101561062457818101518382015260200161060c565b50505050905090810190601f1680156106515780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561066e57600080fd5b505afa158015610682573d6000803e3d6000fd5b505050506040513d602081101561069857600080fd5b505192915050565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261070193909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146107505760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b6105b2600282610bba565b60018054604080516020600284861615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156107e05780601f106107b5576101008083540402835291602001916107e0565b820191906000526020600020905b8154815290600101906020018083116107c357829003601f168201915b505050505081565b60006107fc600264ffffffffff8416610be0565b92915050565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261086393909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146108b25760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b6105b2600282610de9565b60006108c96002610e0f565b905090565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261092f93909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b03161461097e5760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b600855565b600061098e84610e26565b9050806000015164ffffffffff168364ffffffffff161080156109c35750806060015164ffffffffff168364ffffffffff1610155b610a0b576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b806080015164ffffffffff168364ffffffffff161015610a4d576040810180516000190167ffffffffffffffff169052606081015164ffffffffff1660808201525b64ffffffffff8316815264ffffffffff1982166020820152610a6f8482610e86565b50505050565b600080610a8183610e26565b519392505050565b6000610a9484610e26565b90506000610ab9826040015167ffffffffffffffff1686610edc90919063ffffffff16565b8054909150610ac757601081555b8054608083015183510364ffffffffff1610610b3e578460060154826080015164ffffffffff161015610b365760408201805160010167ffffffffffffffff169081905260808301805164ffffffffff90811660608601528451169052610b2f908690610edc565b9050610b3e565b805460020281555b608082015182510364ffffffffff9081166000818152600184810160209081526040909220889055855101909216845264ffffffffff19851691840191909152610b888684610e86565b505050505050565b6000610b9b83610e26565b64ffffffffff19831660208201529050610bb58382610e86565b505050565b6000610bc583610e26565b9050610bb5828260200151856109839092919063ffffffff16565b600080610bec84610e26565b805190915064ffffffffff168310610c42576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b6000610c65826040015167ffffffffffffffff1686610edc90919063ffffffff16565b90506000610c8d836040015160010167ffffffffffffffff1687610edc90919063ffffffff16565b9050826080015164ffffffffff168510610d1a576080830151825464ffffffffff9091168603908110610cfe576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b6000908152600190920160205250604090205491506107fc9050565b6080830151606084015164ffffffffff9182168781039290911610610d7d576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b8154811115610dca576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b81540360009081526001909101602052604090205492506107fc915050565b6000610df483610e26565b9050610bb582826020015185610a899092919063ffffffff16565b600080610e1b83610e26565b602001519392505050565b610e2e610efc565b5080546001909101546040805160a08101825264ffffffffff808516825264ffffffffff19909416602082015267ffffffffffffffff8316818301529082901c8316606082015260689190911c909116608082015290565b80516020820151604080840151606085015160808601518754858717969483901b8417606883901b1795939291908714610ebe578689555b85896001015414610ed157600189018690555b505050505050505050565b60006002820615610ef05782600401610ef5565b826002015b9392505050565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091529056fe4f564d5f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2063616e206f6e6c792062652063616c6c656420627920746865206f776e65722ea264697066735822122014fd994dbf02ce54f07982ffcab79a1d699dc0313a3c136f6482cba97b52de4264736f6c63430007060033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100b45760003560e01c80634651d91e116100715780634651d91e1461021a5780638da5cb5b146102375780639507d39a146102b4578063b298e36b146102d1578063ccf8f969146102ee578063fa9e936c14610311576100b4565b8063167fd681146100b95780631f7b6d32146100e65780632015276c1461010057806329061de21461012b578063299ca47814610150578063461a447814610174575b600080fd5b6100e4600480360360408110156100cf57600080fd5b508035906020013564ffffffffff191661032e565b005b6100ee610423565b60408051918252519081900360200190f35b6100e46004803603604081101561011657600080fd5b508035906020013564ffffffffff191661043b565b6100e46004803603602081101561014157600080fd5b503564ffffffffff19166104f7565b6101586105b5565b604080516001600160a01b039092168252519081900360200190f35b6101586004803603602081101561018a57600080fd5b8101906020810181356401000000008111156101a557600080fd5b8201836020820111156101b757600080fd5b803590602001918460018302840111640100000000831117156101d957600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506105c4945050505050565b6100e46004803603602081101561023057600080fd5b50356106a0565b61023f61075b565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610279578181015183820152602001610261565b50505050905090810190601f1680156102a65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6100ee600480360360208110156102ca57600080fd5b50356107e8565b6100e4600480360360208110156102e757600080fd5b5035610802565b6102f66108bd565b6040805164ffffffffff199092168252519081900360200190f35b6100e46004803603602081101561032757600080fd5b50356108ce565b60018054604080516020601f6002600019610100878916150201909516949094049384018190048102820181019092528281526103c493909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b820191906000526020600020905b81548152906001019060200180831161039d57829003601f168201915b50505050506105c4565b6001600160a01b0316336001600160a01b0316146104135760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b61041f60028383610983565b5050565b600061042f6002610a75565b64ffffffffff16905090565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261049c93909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146104eb5760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b61041f60028383610a89565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261055893909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146105a75760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b6105b2600282610b90565b50565b6000546001600160a01b031681565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b8381101561062457818101518382015260200161060c565b50505050905090810190601f1680156106515780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561066e57600080fd5b505afa158015610682573d6000803e3d6000fd5b505050506040513d602081101561069857600080fd5b505192915050565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261070193909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146107505760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b6105b2600282610bba565b60018054604080516020600284861615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156107e05780601f106107b5576101008083540402835291602001916107e0565b820191906000526020600020905b8154815290600101906020018083116107c357829003601f168201915b505050505081565b60006107fc600264ffffffffff8416610be0565b92915050565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261086393909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146108b25760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b6105b2600282610de9565b60006108c96002610e0f565b905090565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261092f93909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b03161461097e5760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b600855565b600061098e84610e26565b9050806000015164ffffffffff168364ffffffffff161080156109c35750806060015164ffffffffff168364ffffffffff1610155b610a0b576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b806080015164ffffffffff168364ffffffffff161015610a4d576040810180516000190167ffffffffffffffff169052606081015164ffffffffff1660808201525b64ffffffffff8316815264ffffffffff1982166020820152610a6f8482610e86565b50505050565b600080610a8183610e26565b519392505050565b6000610a9484610e26565b90506000610ab9826040015167ffffffffffffffff1686610edc90919063ffffffff16565b8054909150610ac757601081555b8054608083015183510364ffffffffff1610610b3e578460060154826080015164ffffffffff161015610b365760408201805160010167ffffffffffffffff169081905260808301805164ffffffffff90811660608601528451169052610b2f908690610edc565b9050610b3e565b805460020281555b608082015182510364ffffffffff9081166000818152600184810160209081526040909220889055855101909216845264ffffffffff19851691840191909152610b888684610e86565b505050505050565b6000610b9b83610e26565b64ffffffffff19831660208201529050610bb58382610e86565b505050565b6000610bc583610e26565b9050610bb5828260200151856109839092919063ffffffff16565b600080610bec84610e26565b805190915064ffffffffff168310610c42576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b6000610c65826040015167ffffffffffffffff1686610edc90919063ffffffff16565b90506000610c8d836040015160010167ffffffffffffffff1687610edc90919063ffffffff16565b9050826080015164ffffffffff168510610d1a576080830151825464ffffffffff9091168603908110610cfe576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b6000908152600190920160205250604090205491506107fc9050565b6080830151606084015164ffffffffff9182168781039290911610610d7d576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b8154811115610dca576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b81540360009081526001909101602052604090205492506107fc915050565b6000610df483610e26565b9050610bb582826020015185610a899092919063ffffffff16565b600080610e1b83610e26565b602001519392505050565b610e2e610efc565b5080546001909101546040805160a08101825264ffffffffff808516825264ffffffffff19909416602082015267ffffffffffffffff8316818301529082901c8316606082015260689190911c909116608082015290565b80516020820151604080840151606085015160808601518754858717969483901b8417606883901b1795939291908714610ebe578689555b85896001015414610ed157600189018690555b505050505050505050565b60006002820615610ef05782600401610ef5565b826002015b9392505050565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091529056fe4f564d5f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2063616e206f6e6c792062652063616c6c656420627920746865206f776e65722ea264697066735822122014fd994dbf02ce54f07982ffcab79a1d699dc0313a3c136f6482cba97b52de4264736f6c63430007060033", "devdoc": { "details": "The Chain Storage Container provides its owner contract with read, write and delete functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which can no longer be used in a fraud proof due to the fraud window having passed, and the associated chain state or transactions being finalized. Three distinct Chain Storage Containers will be deployed on Layer 1: 1. Stores transaction batches for the Canonical Transaction Chain 2. Stores queued transactions for the Canonical Transaction Chain 3. Stores chain state batches for the State Commitment Chain Compiler used: solc Runtime target: EVM", "kind": "dev", @@ -270,6 +270,14 @@ "_object": "A 32 byte value to insert into the container." } }, + "resolve(string)": { + "params": { + "_name": "Name to resolve an address for." + }, + "returns": { + "_0": "Address associated with the given name." + } + }, "setGlobalMetadata(bytes27)": { "params": { "_globalMetadata": "New global metadata to set." @@ -303,6 +311,9 @@ "push(bytes32,bytes27)": { "notice": "Pushes an object into the container. Function allows setting the global metadata since we'll need to touch the \"length\" storage slot anyway, which also contains the global metadata (it's an optimization)." }, + "resolve(string)": { + "notice": "Resolves the address associated with a given name." + }, "setGlobalMetadata(bytes27)": { "notice": "Sets the container's global metadata field. We're using `bytes27` here because we use five bytes to maintain the length of the underlying data structure, meaning we have an extra 27 bytes to store arbitrary data." }, @@ -315,15 +326,15 @@ "storageLayout": { "storage": [ { - "astId": 12554, + "astId": 12856, "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", "label": "libAddressManager", "offset": 0, "slot": "0", - "type": "t_contract(Lib_AddressManager)12547" + "type": "t_contract(Lib_AddressManager)12849" }, { - "astId": 3772, + "astId": 4510, "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", "label": "owner", "offset": 0, @@ -331,12 +342,12 @@ "type": "t_string_storage" }, { - "astId": 3774, + "astId": 4512, "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", "label": "buffer", "offset": 0, "slot": "2", - "type": "t_struct(RingBuffer)17824_storage" + "type": "t_struct(RingBuffer)18001_storage" } ], "types": { @@ -345,7 +356,7 @@ "label": "bytes32", "numberOfBytes": "32" }, - "t_contract(Lib_AddressManager)12547": { + "t_contract(Lib_AddressManager)12849": { "encoding": "inplace", "label": "contract Lib_AddressManager", "numberOfBytes": "20" @@ -362,12 +373,12 @@ "label": "string", "numberOfBytes": "32" }, - "t_struct(Buffer)17813_storage": { + "t_struct(Buffer)17990_storage": { "encoding": "inplace", "label": "struct Lib_RingBuffer.Buffer", "members": [ { - "astId": 17808, + "astId": 17985, "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", "label": "length", "offset": 0, @@ -375,7 +386,7 @@ "type": "t_uint256" }, { - "astId": 17812, + "astId": 17989, "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", "label": "buf", "offset": 0, @@ -385,12 +396,12 @@ ], "numberOfBytes": "64" }, - "t_struct(RingBuffer)17824_storage": { + "t_struct(RingBuffer)18001_storage": { "encoding": "inplace", "label": "struct Lib_RingBuffer.RingBuffer", "members": [ { - "astId": 17815, + "astId": 17992, "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", "label": "contextA", "offset": 0, @@ -398,7 +409,7 @@ "type": "t_bytes32" }, { - "astId": 17817, + "astId": 17994, "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", "label": "contextB", "offset": 0, @@ -406,23 +417,23 @@ "type": "t_bytes32" }, { - "astId": 17819, + "astId": 17996, "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", "label": "bufferA", "offset": 0, "slot": "2", - "type": "t_struct(Buffer)17813_storage" + "type": "t_struct(Buffer)17990_storage" }, { - "astId": 17821, + "astId": 17998, "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", "label": "bufferB", "offset": 0, "slot": "4", - "type": "t_struct(Buffer)17813_storage" + "type": "t_struct(Buffer)17990_storage" }, { - "astId": 17823, + "astId": 18000, "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", "label": "nextOverwritableIndex", "offset": 0, diff --git a/packages/contracts/deployments/mainnet/OVM_ChainStorageContainer-CTC-queue.json b/packages/contracts/deployments/mainnet/OVM_ChainStorageContainer-CTC-queue.json index a9c14f102192b..36e619bfd4d0d 100644 --- a/packages/contracts/deployments/mainnet/OVM_ChainStorageContainer-CTC-queue.json +++ b/packages/contracts/deployments/mainnet/OVM_ChainStorageContainer-CTC-queue.json @@ -1,5 +1,5 @@ { - "address": "0x03004C447722d207B0355529A6d0dA0696BF6ec6", + "address": "0xD68670eD8800c856613FD3e4C55539A2Ff53cCb3", "abi": [ { "inputs": [ @@ -162,7 +162,7 @@ "outputs": [ { "internalType": "address", - "name": "_contract", + "name": "", "type": "address" } ], @@ -196,30 +196,30 @@ "type": "function" } ], - "transactionHash": "0xb3711e8e4e8d0131c78545b6417697a593ed3f4ddd6eec2590e5692322351902", + "transactionHash": "0xf1dd8ad4c30d6b02c0a0a91895066f27e09d74d731e67f5f45c51a544805c479", "receipt": { "to": null, - "from": "0x77C4c8f491e5ff22a2C0E18b005c3BA0Fe36c1Bc", - "contractAddress": "0x03004C447722d207B0355529A6d0dA0696BF6ec6", - "transactionIndex": 88, - "gasUsed": "959533", + "from": "0xd033f09cB85621F98F7A84C64dB381ac16Eff818", + "contractAddress": "0xD68670eD8800c856613FD3e4C55539A2Ff53cCb3", + "transactionIndex": 53, + "gasUsed": "971002", "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0x7ead824289ee296640d2fd91a21193044fd97a230ab9e842acc70919c8492ea1", - "transactionHash": "0xb3711e8e4e8d0131c78545b6417697a593ed3f4ddd6eec2590e5692322351902", + "blockHash": "0x7b19add9aa95a53b76a43bc2f3711d1f6a0264b78325a19132700e12f866158c", + "transactionHash": "0xf1dd8ad4c30d6b02c0a0a91895066f27e09d74d731e67f5f45c51a544805c479", "logs": [], - "blockNumber": 12207773, - "cumulativeGasUsed": "7828535", + "blockNumber": 12410800, + "cumulativeGasUsed": "4007149", "status": 1, "byzantium": true }, "args": [ - "0xd3EeD86464Ff13B4BFD81a3bB1e753b7ceBA3A39", + "0x668E5b997b9aE88a56cd40409119d4Db9e6d752E", "OVM_CanonicalTransactionChain" ], - "solcInputHash": "43ee6bb8ef92595aa6d0e22a6c464dff", - "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_owner\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"get\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getGlobalMetadata\",\"outputs\":[{\"internalType\":\"bytes27\",\"name\":\"\",\"type\":\"bytes27\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"length\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"_contract\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"setGlobalMetadata\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"setNextOverwritableIndex\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The Chain Storage Container provides its owner contract with read, write and delete functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which can no longer be used in a fraud proof due to the fraud window having passed, and the associated chain state or transactions being finalized. Three distinct Chain Storage Containers will be deployed on Layer 1: 1. Stores transaction batches for the Canonical Transaction Chain 2. Stores queued transactions for the Canonical Transaction Chain 3. Stores chain state batches for the State Commitment Chain Compiler used: solc Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\",\"_owner\":\"Name of the contract that owns this container (will be resolved later).\"}},\"deleteElementsAfterInclusive(uint256)\":{\"params\":{\"_index\":\"Object index to delete from.\"}},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_index\":\"Object index to delete from.\"}},\"get(uint256)\":{\"params\":{\"_index\":\"Index of the particular object to access.\"},\"returns\":{\"_0\":\"32 byte object value.\"}},\"getGlobalMetadata()\":{\"returns\":{\"_0\":\"Container global metadata field.\"}},\"length()\":{\"returns\":{\"_0\":\"Number of objects in the container.\"}},\"push(bytes32)\":{\"params\":{\"_object\":\"A 32 byte value to insert into the container.\"}},\"push(bytes32,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_object\":\"A 32 byte value to insert into the container.\"}},\"setGlobalMetadata(bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata to set.\"}}},\"title\":\"OVM_ChainStorageContainer\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"deleteElementsAfterInclusive(uint256)\":{\"notice\":\"Removes all objects after and including a given index.\"},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"notice\":\"Removes all objects after and including a given index. Also allows setting the global metadata field.\"},\"get(uint256)\":{\"notice\":\"Retrieves an object from the container.\"},\"getGlobalMetadata()\":{\"notice\":\"Retrieves the container's global metadata field.\"},\"length()\":{\"notice\":\"Retrieves the number of objects stored in the container.\"},\"push(bytes32)\":{\"notice\":\"Pushes an object into the container.\"},\"push(bytes32,bytes27)\":{\"notice\":\"Pushes an object into the container. Function allows setting the global metadata since we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global metadata (it's an optimization).\"},\"setGlobalMetadata(bytes27)\":{\"notice\":\"Sets the container's global metadata field. We're using `bytes27` here because we use five bytes to maintain the length of the underlying data structure, meaning we have an extra 27 bytes to store arbitrary data.\"},\"setNextOverwritableIndex(uint256)\":{\"notice\":\"Marks an index as overwritable, meaing the underlying buffer can start to write values over any objects before and including the given index.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol\":\"OVM_ChainStorageContainer\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_RingBuffer } from \\\"../../libraries/utils/Lib_RingBuffer.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_ChainStorageContainer } from \\\"../../iOVM/chain/iOVM_ChainStorageContainer.sol\\\";\\n\\n/**\\n * @title OVM_ChainStorageContainer\\n * @dev The Chain Storage Container provides its owner contract with read, write and delete functionality.\\n * This provides gas efficiency gains by enabling it to overwrite storage slots which can no longer be used\\n * in a fraud proof due to the fraud window having passed, and the associated chain state or\\n * transactions being finalized.\\n * Three distinct Chain Storage Containers will be deployed on Layer 1:\\n * 1. Stores transaction batches for the Canonical Transaction Chain\\n * 2. Stores queued transactions for the Canonical Transaction Chain\\n * 3. Stores chain state batches for the State Commitment Chain\\n *\\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract OVM_ChainStorageContainer is iOVM_ChainStorageContainer, Lib_AddressResolver {\\n\\n /*************\\n * Libraries *\\n *************/\\n\\n using Lib_RingBuffer for Lib_RingBuffer.RingBuffer;\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n string public owner;\\n Lib_RingBuffer.RingBuffer internal buffer;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n * @param _owner Name of the contract that owns this container (will be resolved later).\\n */\\n constructor(\\n address _libAddressManager,\\n string memory _owner\\n )\\n Lib_AddressResolver(_libAddressManager)\\n {\\n owner = _owner;\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n msg.sender == resolve(owner),\\n \\\"OVM_ChainStorageContainer: Function can only be called by the owner.\\\"\\n );\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function setGlobalMetadata(\\n bytes27 _globalMetadata\\n )\\n override\\n public\\n onlyOwner\\n {\\n return buffer.setExtraData(_globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function getGlobalMetadata()\\n override\\n public\\n view\\n returns (\\n bytes27\\n )\\n {\\n return buffer.getExtraData();\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function length()\\n override\\n public\\n view\\n returns (\\n uint256\\n )\\n {\\n return uint256(buffer.getLength());\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function push(\\n bytes32 _object\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.push(_object);\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function push(\\n bytes32 _object,\\n bytes27 _globalMetadata\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.push(_object, _globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function get(\\n uint256 _index\\n )\\n override\\n public\\n view\\n returns (\\n bytes32\\n )\\n {\\n return buffer.get(uint40(_index));\\n }\\n \\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.deleteElementsAfterInclusive(\\n uint40(_index)\\n );\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index,\\n bytes27 _globalMetadata\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.deleteElementsAfterInclusive(\\n uint40(_index),\\n _globalMetadata\\n );\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function setNextOverwritableIndex(\\n uint256 _index\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.nextOverwritableIndex = _index;\\n }\\n}\\n\",\"keccak256\":\"0x52e3ef7166fe134d32997917067e3d74128173b12fb6231eec34132102ddbb50\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_ChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title iOVM_ChainStorageContainer\\n */\\ninterface iOVM_ChainStorageContainer {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata()\\n external\\n view\\n returns (\\n bytes27\\n );\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length()\\n external\\n view\\n returns (\\n uint256\\n );\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(\\n bytes32 _object\\n )\\n external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(\\n bytes32 _object,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(\\n uint256 _index\\n )\\n external\\n view\\n returns (\\n bytes32\\n );\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index\\n )\\n external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Marks an index as overwritable, meaing the underlying buffer can start to write values over\\n * any objects before and including the given index.\\n */\\n function setNextOverwritableIndex(\\n uint256 _index\\n )\\n external;\\n}\\n\",\"keccak256\":\"0x2d7973a0ad84c23ec62624d3f1e3aeb198cc72686ff1e6cfa17155556b320c94\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Contract Imports */\\nimport { Ownable } from \\\"./Lib_Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n /*******************************************\\n * Contract Variables: Internal Accounting *\\n *******************************************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n public\\n onlyOwner\\n {\\n emit AddressSet(_name, _address);\\n addresses[_getNameHash(_name)] = _address;\\n }\\n\\n function getAddress(\\n string memory _name\\n )\\n public\\n view\\n returns (address)\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32 _hash\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0x3a490595cc21ff170e4027843093670ff845d5972481fbfb956b722ea564bb06\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n\\n /*******************************************\\n * Contract Variables: Contract References *\\n *******************************************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(\\n address _libAddressManager\\n ) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function resolve(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address _contract\\n )\\n {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0xaa3ed342f6deb156c660fd83afa579a3b80db17eb465e8949cf5c1b114780143\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Ownable\\n * @dev Adapted from https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol\\n */\\nabstract contract Ownable {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n address public owner;\\n\\n\\n /**********\\n * Events *\\n **********/\\n\\n event OwnershipTransferred(\\n address indexed previousOwner,\\n address indexed newOwner\\n );\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n constructor() {\\n owner = msg.sender;\\n emit OwnershipTransferred(address(0), owner);\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n owner == msg.sender,\\n \\\"Ownable: caller is not the owner\\\"\\n );\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function renounceOwnership()\\n public\\n virtual\\n onlyOwner\\n {\\n emit OwnershipTransferred(owner, address(0));\\n owner = address(0);\\n }\\n\\n function transferOwnership(address _newOwner)\\n public\\n virtual\\n onlyOwner\\n {\\n require(\\n _newOwner != address(0),\\n \\\"Ownable: new owner cannot be the zero address\\\"\\n );\\n\\n emit OwnershipTransferred(owner, _newOwner);\\n owner = _newOwner;\\n }\\n}\\n\",\"keccak256\":\"0xd9dfd9264e5b5fedd53a5b10fdf179c3f367614b0fe69179bce4e45119f5b739\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_RingBuffer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\nlibrary Lib_RingBuffer {\\n using Lib_RingBuffer for RingBuffer;\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Buffer {\\n uint256 length;\\n mapping (uint256 => bytes32) buf;\\n }\\n\\n struct RingBuffer {\\n bytes32 contextA;\\n bytes32 contextB;\\n Buffer bufferA;\\n Buffer bufferB;\\n uint256 nextOverwritableIndex;\\n }\\n\\n struct RingBufferContext {\\n // contextA\\n uint40 globalIndex;\\n bytes27 extraData;\\n\\n // contextB\\n uint64 currBufferIndex;\\n uint40 prevResetIndex;\\n uint40 currResetIndex;\\n }\\n\\n\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 constant MIN_CAPACITY = 16;\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n * @param _extraData Optional global extra data.\\n */\\n function push(\\n RingBuffer storage _self,\\n bytes32 _value,\\n bytes27 _extraData\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n Buffer storage currBuffer = _self.getBuffer(ctx.currBufferIndex);\\n\\n // Set a minimum capacity.\\n if (currBuffer.length == 0) {\\n currBuffer.length = MIN_CAPACITY;\\n }\\n\\n // Check if we need to expand the buffer.\\n if (ctx.globalIndex - ctx.currResetIndex >= currBuffer.length) {\\n if (ctx.currResetIndex < _self.nextOverwritableIndex) {\\n // We're going to overwrite the inactive buffer.\\n // Bump the buffer index, reset the delete offset, and set our reset indices.\\n ctx.currBufferIndex++;\\n ctx.prevResetIndex = ctx.currResetIndex;\\n ctx.currResetIndex = ctx.globalIndex;\\n\\n // Swap over to the next buffer.\\n currBuffer = _self.getBuffer(ctx.currBufferIndex);\\n } else {\\n // We're not overwriting yet, double the length of the current buffer.\\n currBuffer.length *= 2;\\n }\\n }\\n\\n // Index to write to is the difference of the global and reset indices.\\n uint256 writeHead = ctx.globalIndex - ctx.currResetIndex;\\n currBuffer.buf[writeHead] = _value;\\n\\n // Bump the global index and insert our extra data, then save the context.\\n ctx.globalIndex++;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n */\\n function push(\\n RingBuffer storage _self,\\n bytes32 _value\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n \\n _self.push(\\n _value,\\n ctx.extraData\\n );\\n }\\n\\n /**\\n * Retrieves an element from the buffer.\\n * @param _self Buffer to access.\\n * @param _index Element index to retrieve.\\n * @return Value of the element at the given index.\\n */\\n function get(\\n RingBuffer storage _self,\\n uint256 _index\\n )\\n internal\\n view\\n returns (\\n bytes32 \\n )\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n\\n require(\\n _index < ctx.globalIndex,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n Buffer storage currBuffer = _self.getBuffer(ctx.currBufferIndex);\\n Buffer storage prevBuffer = _self.getBuffer(ctx.currBufferIndex + 1);\\n\\n if (_index >= ctx.currResetIndex) {\\n // We're trying to load an element from the current buffer.\\n // Relative index is just the difference from the reset index.\\n uint256 relativeIndex = _index - ctx.currResetIndex;\\n\\n // Shouldn't happen but why not check.\\n require(\\n relativeIndex < currBuffer.length,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n return currBuffer.buf[relativeIndex];\\n } else {\\n // We're trying to load an element from the previous buffer.\\n // Relative index is the difference from the reset index in the other direction.\\n uint256 relativeIndex = ctx.currResetIndex - _index;\\n\\n // Condition only fails in the case that we deleted and flipped buffers.\\n require(\\n ctx.currResetIndex > ctx.prevResetIndex,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n // Make sure we're not trying to read beyond the array.\\n require(\\n relativeIndex <= prevBuffer.length,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n return prevBuffer.buf[prevBuffer.length - relativeIndex];\\n }\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n * @param _extraData Optional global extra data.\\n */\\n function deleteElementsAfterInclusive(\\n RingBuffer storage _self,\\n uint40 _index,\\n bytes27 _extraData\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n\\n require(\\n _index < ctx.globalIndex && _index >= ctx.prevResetIndex,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n if (_index < ctx.currResetIndex) {\\n // We're switching back to the previous buffer.\\n // Reduce the buffer index, set the current reset index back to match the previous one.\\n // We use the equality of these two values to prevent reading beyond this buffer.\\n ctx.currBufferIndex--;\\n ctx.currResetIndex = ctx.prevResetIndex;\\n }\\n\\n // Set our global index and extra data, save the context.\\n ctx.globalIndex = _index;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n */\\n function deleteElementsAfterInclusive(\\n RingBuffer storage _self,\\n uint40 _index\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n _self.deleteElementsAfterInclusive(\\n _index,\\n ctx.extraData\\n );\\n }\\n\\n /**\\n * Retrieves the current global index.\\n * @param _self Buffer to access.\\n * @return Current global index.\\n */\\n function getLength(\\n RingBuffer storage _self\\n )\\n internal\\n view\\n returns (\\n uint40\\n )\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n return ctx.globalIndex;\\n }\\n\\n /**\\n * Changes current global extra data.\\n * @param _self Buffer to access.\\n * @param _extraData New global extra data.\\n */\\n function setExtraData(\\n RingBuffer storage _self,\\n bytes27 _extraData\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Retrieves the current global extra data.\\n * @param _self Buffer to access.\\n * @return Current global extra data.\\n */\\n function getExtraData(\\n RingBuffer storage _self\\n )\\n internal\\n view\\n returns (\\n bytes27\\n )\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n return ctx.extraData;\\n }\\n\\n /**\\n * Sets the current ring buffer context.\\n * @param _self Buffer to access.\\n * @param _ctx Current ring buffer context.\\n */\\n function setContext(\\n RingBuffer storage _self,\\n RingBufferContext memory _ctx\\n )\\n internal\\n {\\n bytes32 contextA;\\n bytes32 contextB;\\n\\n uint40 globalIndex = _ctx.globalIndex;\\n bytes27 extraData = _ctx.extraData;\\n assembly {\\n contextA := globalIndex\\n contextA := or(contextA, extraData)\\n }\\n\\n uint64 currBufferIndex = _ctx.currBufferIndex;\\n uint40 prevResetIndex = _ctx.prevResetIndex;\\n uint40 currResetIndex = _ctx.currResetIndex;\\n assembly {\\n contextB := currBufferIndex\\n contextB := or(contextB, shl(64, prevResetIndex))\\n contextB := or(contextB, shl(104, currResetIndex))\\n }\\n\\n if (_self.contextA != contextA) {\\n _self.contextA = contextA;\\n }\\n\\n if (_self.contextB != contextB) {\\n _self.contextB = contextB;\\n }\\n }\\n\\n /**\\n * Retrieves the current ring buffer context.\\n * @param _self Buffer to access.\\n * @return Current ring buffer context.\\n */\\n function getContext(\\n RingBuffer storage _self\\n )\\n internal\\n view\\n returns (\\n RingBufferContext memory\\n )\\n {\\n bytes32 contextA = _self.contextA;\\n bytes32 contextB = _self.contextB;\\n\\n uint40 globalIndex;\\n bytes27 extraData;\\n assembly {\\n globalIndex := and(contextA, 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF)\\n extraData := and(contextA, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000)\\n }\\n\\n uint64 currBufferIndex;\\n uint40 prevResetIndex;\\n uint40 currResetIndex;\\n assembly {\\n currBufferIndex := and(contextB, 0x000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF)\\n prevResetIndex := shr(64, and(contextB, 0x00000000000000000000000000000000000000FFFFFFFFFF0000000000000000))\\n currResetIndex := shr(104, and(contextB, 0x0000000000000000000000000000FFFFFFFFFF00000000000000000000000000))\\n }\\n\\n return RingBufferContext({\\n globalIndex: globalIndex,\\n extraData: extraData,\\n currBufferIndex: currBufferIndex,\\n prevResetIndex: prevResetIndex,\\n currResetIndex: currResetIndex\\n });\\n }\\n\\n /**\\n * Retrieves the a buffer from the ring buffer by index.\\n * @param _self Buffer to access.\\n * @param _which Index of the sub buffer to access.\\n * @return Sub buffer for the index.\\n */\\n function getBuffer(\\n RingBuffer storage _self,\\n uint256 _which\\n )\\n internal\\n view\\n returns (\\n Buffer storage\\n )\\n {\\n return _which % 2 == 0 ? _self.bufferA : _self.bufferB;\\n }\\n}\\n\",\"keccak256\":\"0xb38cb98da2d09f922d5cfe772bdbd36ede2b2267ade93128e949c9da21b89940\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x60806040523480156200001157600080fd5b506040516200116438038062001164833981810160405260408110156200003757600080fd5b8151602083018051604051929492938301929190846401000000008211156200005f57600080fd5b9083019060208201858111156200007557600080fd5b82516401000000008111828201881017156200009057600080fd5b82525081516020918201929091019080838360005b83811015620000bf578181015183820152602001620000a5565b50505050905090810190601f168015620000ed5780820380516001836020036101000a031916815260200191505b506040525050600080546001600160a01b0319166001600160a01b038516179055508051620001249060019060208401906200012d565b505050620001d9565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282620001655760008555620001b0565b82601f106200018057805160ff1916838001178555620001b0565b82800160010185558215620001b0579182015b82811115620001b057825182559160200191906001019062000193565b50620001be929150620001c2565b5090565b5b80821115620001be5760008155600101620001c3565b610f7b80620001e96000396000f3fe608060405234801561001057600080fd5b50600436106100b45760003560e01c80634651d91e116100715780634651d91e1461021a5780638da5cb5b146102375780639507d39a146102b4578063b298e36b146102d1578063ccf8f969146102ee578063fa9e936c14610311576100b4565b8063167fd681146100b95780631f7b6d32146100e65780632015276c1461010057806329061de21461012b578063299ca47814610150578063461a447814610174575b600080fd5b6100e4600480360360408110156100cf57600080fd5b508035906020013564ffffffffff191661032e565b005b6100ee610423565b60408051918252519081900360200190f35b6100e46004803603604081101561011657600080fd5b508035906020013564ffffffffff191661043b565b6100e46004803603602081101561014157600080fd5b503564ffffffffff19166104f7565b6101586105b5565b604080516001600160a01b039092168252519081900360200190f35b6101586004803603602081101561018a57600080fd5b8101906020810181356401000000008111156101a557600080fd5b8201836020820111156101b757600080fd5b803590602001918460018302840111640100000000831117156101d957600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506105c4945050505050565b6100e46004803603602081101561023057600080fd5b50356106a0565b61023f61075b565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610279578181015183820152602001610261565b50505050905090810190601f1680156102a65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6100ee600480360360208110156102ca57600080fd5b50356107e8565b6100e4600480360360208110156102e757600080fd5b5035610802565b6102f66108bd565b6040805164ffffffffff199092168252519081900360200190f35b6100e46004803603602081101561032757600080fd5b50356108ce565b60018054604080516020601f6002600019610100878916150201909516949094049384018190048102820181019092528281526103c493909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b820191906000526020600020905b81548152906001019060200180831161039d57829003601f168201915b50505050506105c4565b6001600160a01b0316336001600160a01b0316146104135760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b61041f60028383610983565b5050565b600061042f6002610a75565b64ffffffffff16905090565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261049c93909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146104eb5760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b61041f60028383610a89565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261055893909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146105a75760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b6105b2600282610b90565b50565b6000546001600160a01b031681565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b8381101561062457818101518382015260200161060c565b50505050905090810190601f1680156106515780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561066e57600080fd5b505afa158015610682573d6000803e3d6000fd5b505050506040513d602081101561069857600080fd5b505192915050565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261070193909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146107505760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b6105b2600282610bba565b60018054604080516020600284861615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156107e05780601f106107b5576101008083540402835291602001916107e0565b820191906000526020600020905b8154815290600101906020018083116107c357829003601f168201915b505050505081565b60006107fc600264ffffffffff8416610be0565b92915050565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261086393909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146108b25760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b6105b2600282610de9565b60006108c96002610e0f565b905090565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261092f93909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b03161461097e5760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b600855565b600061098e84610e26565b9050806000015164ffffffffff168364ffffffffff161080156109c35750806060015164ffffffffff168364ffffffffff1610155b610a0b576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b806080015164ffffffffff168364ffffffffff161015610a4d576040810180516000190167ffffffffffffffff169052606081015164ffffffffff1660808201525b64ffffffffff8316815264ffffffffff1982166020820152610a6f8482610e86565b50505050565b600080610a8183610e26565b519392505050565b6000610a9484610e26565b90506000610ab9826040015167ffffffffffffffff1686610edc90919063ffffffff16565b8054909150610ac757601081555b8054608083015183510364ffffffffff1610610b3e578460060154826080015164ffffffffff161015610b365760408201805160010167ffffffffffffffff169081905260808301805164ffffffffff90811660608601528451169052610b2f908690610edc565b9050610b3e565b805460020281555b608082015182510364ffffffffff9081166000818152600184810160209081526040909220889055855101909216845264ffffffffff19851691840191909152610b888684610e86565b505050505050565b6000610b9b83610e26565b64ffffffffff19831660208201529050610bb58382610e86565b505050565b6000610bc583610e26565b9050610bb5828260200151856109839092919063ffffffff16565b600080610bec84610e26565b805190915064ffffffffff168310610c42576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b6000610c65826040015167ffffffffffffffff1686610edc90919063ffffffff16565b90506000610c8d836040015160010167ffffffffffffffff1687610edc90919063ffffffff16565b9050826080015164ffffffffff168510610d1a576080830151825464ffffffffff9091168603908110610cfe576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b6000908152600190920160205250604090205491506107fc9050565b6080830151606084015164ffffffffff9182168781039290911610610d7d576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b8154811115610dca576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b81540360009081526001909101602052604090205492506107fc915050565b6000610df483610e26565b9050610bb582826020015185610a899092919063ffffffff16565b600080610e1b83610e26565b602001519392505050565b610e2e610efc565b5080546001909101546040805160a08101825264ffffffffff808516825264ffffffffff19909416602082015267ffffffffffffffff8316818301529082901c8316606082015260689190911c909116608082015290565b80516020820151604080840151606085015160808601518754858717969483901b8417606883901b1795939291908714610ebe578689555b85896001015414610ed157600189018690555b505050505050505050565b60006002820615610ef05782600401610ef5565b826002015b9392505050565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091529056fe4f564d5f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2063616e206f6e6c792062652063616c6c656420627920746865206f776e65722ea164736f6c6343000706000a", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100b45760003560e01c80634651d91e116100715780634651d91e1461021a5780638da5cb5b146102375780639507d39a146102b4578063b298e36b146102d1578063ccf8f969146102ee578063fa9e936c14610311576100b4565b8063167fd681146100b95780631f7b6d32146100e65780632015276c1461010057806329061de21461012b578063299ca47814610150578063461a447814610174575b600080fd5b6100e4600480360360408110156100cf57600080fd5b508035906020013564ffffffffff191661032e565b005b6100ee610423565b60408051918252519081900360200190f35b6100e46004803603604081101561011657600080fd5b508035906020013564ffffffffff191661043b565b6100e46004803603602081101561014157600080fd5b503564ffffffffff19166104f7565b6101586105b5565b604080516001600160a01b039092168252519081900360200190f35b6101586004803603602081101561018a57600080fd5b8101906020810181356401000000008111156101a557600080fd5b8201836020820111156101b757600080fd5b803590602001918460018302840111640100000000831117156101d957600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506105c4945050505050565b6100e46004803603602081101561023057600080fd5b50356106a0565b61023f61075b565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610279578181015183820152602001610261565b50505050905090810190601f1680156102a65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6100ee600480360360208110156102ca57600080fd5b50356107e8565b6100e4600480360360208110156102e757600080fd5b5035610802565b6102f66108bd565b6040805164ffffffffff199092168252519081900360200190f35b6100e46004803603602081101561032757600080fd5b50356108ce565b60018054604080516020601f6002600019610100878916150201909516949094049384018190048102820181019092528281526103c493909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b820191906000526020600020905b81548152906001019060200180831161039d57829003601f168201915b50505050506105c4565b6001600160a01b0316336001600160a01b0316146104135760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b61041f60028383610983565b5050565b600061042f6002610a75565b64ffffffffff16905090565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261049c93909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146104eb5760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b61041f60028383610a89565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261055893909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146105a75760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b6105b2600282610b90565b50565b6000546001600160a01b031681565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b8381101561062457818101518382015260200161060c565b50505050905090810190601f1680156106515780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561066e57600080fd5b505afa158015610682573d6000803e3d6000fd5b505050506040513d602081101561069857600080fd5b505192915050565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261070193909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146107505760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b6105b2600282610bba565b60018054604080516020600284861615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156107e05780601f106107b5576101008083540402835291602001916107e0565b820191906000526020600020905b8154815290600101906020018083116107c357829003601f168201915b505050505081565b60006107fc600264ffffffffff8416610be0565b92915050565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261086393909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146108b25760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b6105b2600282610de9565b60006108c96002610e0f565b905090565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261092f93909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b03161461097e5760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b600855565b600061098e84610e26565b9050806000015164ffffffffff168364ffffffffff161080156109c35750806060015164ffffffffff168364ffffffffff1610155b610a0b576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b806080015164ffffffffff168364ffffffffff161015610a4d576040810180516000190167ffffffffffffffff169052606081015164ffffffffff1660808201525b64ffffffffff8316815264ffffffffff1982166020820152610a6f8482610e86565b50505050565b600080610a8183610e26565b519392505050565b6000610a9484610e26565b90506000610ab9826040015167ffffffffffffffff1686610edc90919063ffffffff16565b8054909150610ac757601081555b8054608083015183510364ffffffffff1610610b3e578460060154826080015164ffffffffff161015610b365760408201805160010167ffffffffffffffff169081905260808301805164ffffffffff90811660608601528451169052610b2f908690610edc565b9050610b3e565b805460020281555b608082015182510364ffffffffff9081166000818152600184810160209081526040909220889055855101909216845264ffffffffff19851691840191909152610b888684610e86565b505050505050565b6000610b9b83610e26565b64ffffffffff19831660208201529050610bb58382610e86565b505050565b6000610bc583610e26565b9050610bb5828260200151856109839092919063ffffffff16565b600080610bec84610e26565b805190915064ffffffffff168310610c42576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b6000610c65826040015167ffffffffffffffff1686610edc90919063ffffffff16565b90506000610c8d836040015160010167ffffffffffffffff1687610edc90919063ffffffff16565b9050826080015164ffffffffff168510610d1a576080830151825464ffffffffff9091168603908110610cfe576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b6000908152600190920160205250604090205491506107fc9050565b6080830151606084015164ffffffffff9182168781039290911610610d7d576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b8154811115610dca576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b81540360009081526001909101602052604090205492506107fc915050565b6000610df483610e26565b9050610bb582826020015185610a899092919063ffffffff16565b600080610e1b83610e26565b602001519392505050565b610e2e610efc565b5080546001909101546040805160a08101825264ffffffffff808516825264ffffffffff19909416602082015267ffffffffffffffff8316818301529082901c8316606082015260689190911c909116608082015290565b80516020820151604080840151606085015160808601518754858717969483901b8417606883901b1795939291908714610ebe578689555b85896001015414610ed157600189018690555b505050505050505050565b60006002820615610ef05782600401610ef5565b826002015b9392505050565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091529056fe4f564d5f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2063616e206f6e6c792062652063616c6c656420627920746865206f776e65722ea164736f6c6343000706000a", + "solcInputHash": "f2bdab652d5102f5f11e78dae866798d", + "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_owner\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"get\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getGlobalMetadata\",\"outputs\":[{\"internalType\":\"bytes27\",\"name\":\"\",\"type\":\"bytes27\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"length\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"setGlobalMetadata\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"setNextOverwritableIndex\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The Chain Storage Container provides its owner contract with read, write and delete functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which can no longer be used in a fraud proof due to the fraud window having passed, and the associated chain state or transactions being finalized. Three distinct Chain Storage Containers will be deployed on Layer 1: 1. Stores transaction batches for the Canonical Transaction Chain 2. Stores queued transactions for the Canonical Transaction Chain 3. Stores chain state batches for the State Commitment Chain Compiler used: solc Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\",\"_owner\":\"Name of the contract that owns this container (will be resolved later).\"}},\"deleteElementsAfterInclusive(uint256)\":{\"params\":{\"_index\":\"Object index to delete from.\"}},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_index\":\"Object index to delete from.\"}},\"get(uint256)\":{\"params\":{\"_index\":\"Index of the particular object to access.\"},\"returns\":{\"_0\":\"32 byte object value.\"}},\"getGlobalMetadata()\":{\"returns\":{\"_0\":\"Container global metadata field.\"}},\"length()\":{\"returns\":{\"_0\":\"Number of objects in the container.\"}},\"push(bytes32)\":{\"params\":{\"_object\":\"A 32 byte value to insert into the container.\"}},\"push(bytes32,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_object\":\"A 32 byte value to insert into the container.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}},\"setGlobalMetadata(bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata to set.\"}}},\"title\":\"OVM_ChainStorageContainer\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"deleteElementsAfterInclusive(uint256)\":{\"notice\":\"Removes all objects after and including a given index.\"},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"notice\":\"Removes all objects after and including a given index. Also allows setting the global metadata field.\"},\"get(uint256)\":{\"notice\":\"Retrieves an object from the container.\"},\"getGlobalMetadata()\":{\"notice\":\"Retrieves the container's global metadata field.\"},\"length()\":{\"notice\":\"Retrieves the number of objects stored in the container.\"},\"push(bytes32)\":{\"notice\":\"Pushes an object into the container.\"},\"push(bytes32,bytes27)\":{\"notice\":\"Pushes an object into the container. Function allows setting the global metadata since we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global metadata (it's an optimization).\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"},\"setGlobalMetadata(bytes27)\":{\"notice\":\"Sets the container's global metadata field. We're using `bytes27` here because we use five bytes to maintain the length of the underlying data structure, meaning we have an extra 27 bytes to store arbitrary data.\"},\"setNextOverwritableIndex(uint256)\":{\"notice\":\"Marks an index as overwritable, meaing the underlying buffer can start to write values over any objects before and including the given index.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol\":\"OVM_ChainStorageContainer\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor () internal {\\n address msgSender = _msgSender();\\n _owner = msgSender;\\n emit OwnershipTransferred(address(0), msgSender);\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n emit OwnershipTransferred(_owner, address(0));\\n _owner = address(0);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n emit OwnershipTransferred(_owner, newOwner);\\n _owner = newOwner;\\n }\\n}\\n\",\"keccak256\":\"0x15e2d5bd4c28a88548074c54d220e8086f638a71ed07e6b3ba5a70066fcf458d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with GSN meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address payable) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes memory) {\\n this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x8d3cb350f04ff49cfb10aef08d87f19dcbaecc8027b0bed12f3275cd12f38cf0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_RingBuffer } from \\\"../../libraries/utils/Lib_RingBuffer.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_ChainStorageContainer } from \\\"../../iOVM/chain/iOVM_ChainStorageContainer.sol\\\";\\n\\n/**\\n * @title OVM_ChainStorageContainer\\n * @dev The Chain Storage Container provides its owner contract with read, write and delete functionality.\\n * This provides gas efficiency gains by enabling it to overwrite storage slots which can no longer be used\\n * in a fraud proof due to the fraud window having passed, and the associated chain state or\\n * transactions being finalized.\\n * Three distinct Chain Storage Containers will be deployed on Layer 1:\\n * 1. Stores transaction batches for the Canonical Transaction Chain\\n * 2. Stores queued transactions for the Canonical Transaction Chain\\n * 3. Stores chain state batches for the State Commitment Chain\\n *\\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract OVM_ChainStorageContainer is iOVM_ChainStorageContainer, Lib_AddressResolver {\\n\\n /*************\\n * Libraries *\\n *************/\\n\\n using Lib_RingBuffer for Lib_RingBuffer.RingBuffer;\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n string public owner;\\n Lib_RingBuffer.RingBuffer internal buffer;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n * @param _owner Name of the contract that owns this container (will be resolved later).\\n */\\n constructor(\\n address _libAddressManager,\\n string memory _owner\\n )\\n Lib_AddressResolver(_libAddressManager)\\n {\\n owner = _owner;\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n msg.sender == resolve(owner),\\n \\\"OVM_ChainStorageContainer: Function can only be called by the owner.\\\"\\n );\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function setGlobalMetadata(\\n bytes27 _globalMetadata\\n )\\n override\\n public\\n onlyOwner\\n {\\n return buffer.setExtraData(_globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function getGlobalMetadata()\\n override\\n public\\n view\\n returns (\\n bytes27\\n )\\n {\\n return buffer.getExtraData();\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function length()\\n override\\n public\\n view\\n returns (\\n uint256\\n )\\n {\\n return uint256(buffer.getLength());\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function push(\\n bytes32 _object\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.push(_object);\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function push(\\n bytes32 _object,\\n bytes27 _globalMetadata\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.push(_object, _globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function get(\\n uint256 _index\\n )\\n override\\n public\\n view\\n returns (\\n bytes32\\n )\\n {\\n return buffer.get(uint40(_index));\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.deleteElementsAfterInclusive(\\n uint40(_index)\\n );\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index,\\n bytes27 _globalMetadata\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.deleteElementsAfterInclusive(\\n uint40(_index),\\n _globalMetadata\\n );\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function setNextOverwritableIndex(\\n uint256 _index\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.nextOverwritableIndex = _index;\\n }\\n}\\n\",\"keccak256\":\"0x93325c961516aa2a22bf1aacf4029353d5e3b693e04b485753170337b50224e6\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_ChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title iOVM_ChainStorageContainer\\n */\\ninterface iOVM_ChainStorageContainer {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata()\\n external\\n view\\n returns (\\n bytes27\\n );\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length()\\n external\\n view\\n returns (\\n uint256\\n );\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(\\n bytes32 _object\\n )\\n external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(\\n bytes32 _object,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(\\n uint256 _index\\n )\\n external\\n view\\n returns (\\n bytes32\\n );\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index\\n )\\n external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Marks an index as overwritable, meaing the underlying buffer can start to write values over\\n * any objects before and including the given index.\\n */\\n function setNextOverwritableIndex(\\n uint256 _index\\n )\\n external;\\n}\\n\",\"keccak256\":\"0x2d7973a0ad84c23ec62624d3f1e3aeb198cc72686ff1e6cfa17155556b320c94\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n external\\n onlyOwner\\n {\\n addresses[_getNameHash(_name)] = _address;\\n\\n emit AddressSet(\\n _name,\\n _address\\n );\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(\\n string memory _name\\n )\\n external\\n view\\n returns (\\n address\\n )\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xcc9fc5c64f1101a5c6c397594086b1608189a9edc5c9635e1ac38f70aeeeecbf\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(\\n address _libAddressManager\\n ) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x65981feeabff6a81783ea97d44baf988a18a86c8cb374c46fdb71819cbacc7c0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_RingBuffer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\nlibrary Lib_RingBuffer {\\n using Lib_RingBuffer for RingBuffer;\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Buffer {\\n uint256 length;\\n mapping (uint256 => bytes32) buf;\\n }\\n\\n struct RingBuffer {\\n bytes32 contextA;\\n bytes32 contextB;\\n Buffer bufferA;\\n Buffer bufferB;\\n uint256 nextOverwritableIndex;\\n }\\n\\n struct RingBufferContext {\\n // contextA\\n uint40 globalIndex;\\n bytes27 extraData;\\n\\n // contextB\\n uint64 currBufferIndex;\\n uint40 prevResetIndex;\\n uint40 currResetIndex;\\n }\\n\\n\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 constant MIN_CAPACITY = 16;\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n * @param _extraData Optional global extra data.\\n */\\n function push(\\n RingBuffer storage _self,\\n bytes32 _value,\\n bytes27 _extraData\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n Buffer storage currBuffer = _self.getBuffer(ctx.currBufferIndex);\\n\\n // Set a minimum capacity.\\n if (currBuffer.length == 0) {\\n currBuffer.length = MIN_CAPACITY;\\n }\\n\\n // Check if we need to expand the buffer.\\n if (ctx.globalIndex - ctx.currResetIndex >= currBuffer.length) {\\n if (ctx.currResetIndex < _self.nextOverwritableIndex) {\\n // We're going to overwrite the inactive buffer.\\n // Bump the buffer index, reset the delete offset, and set our reset indices.\\n ctx.currBufferIndex++;\\n ctx.prevResetIndex = ctx.currResetIndex;\\n ctx.currResetIndex = ctx.globalIndex;\\n\\n // Swap over to the next buffer.\\n currBuffer = _self.getBuffer(ctx.currBufferIndex);\\n } else {\\n // We're not overwriting yet, double the length of the current buffer.\\n currBuffer.length *= 2;\\n }\\n }\\n\\n // Index to write to is the difference of the global and reset indices.\\n uint256 writeHead = ctx.globalIndex - ctx.currResetIndex;\\n currBuffer.buf[writeHead] = _value;\\n\\n // Bump the global index and insert our extra data, then save the context.\\n ctx.globalIndex++;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n */\\n function push(\\n RingBuffer storage _self,\\n bytes32 _value\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n\\n _self.push(\\n _value,\\n ctx.extraData\\n );\\n }\\n\\n /**\\n * Retrieves an element from the buffer.\\n * @param _self Buffer to access.\\n * @param _index Element index to retrieve.\\n * @return Value of the element at the given index.\\n */\\n function get(\\n RingBuffer storage _self,\\n uint256 _index\\n )\\n internal\\n view\\n returns (\\n bytes32\\n )\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n\\n require(\\n _index < ctx.globalIndex,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n Buffer storage currBuffer = _self.getBuffer(ctx.currBufferIndex);\\n Buffer storage prevBuffer = _self.getBuffer(ctx.currBufferIndex + 1);\\n\\n if (_index >= ctx.currResetIndex) {\\n // We're trying to load an element from the current buffer.\\n // Relative index is just the difference from the reset index.\\n uint256 relativeIndex = _index - ctx.currResetIndex;\\n\\n // Shouldn't happen but why not check.\\n require(\\n relativeIndex < currBuffer.length,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n return currBuffer.buf[relativeIndex];\\n } else {\\n // We're trying to load an element from the previous buffer.\\n // Relative index is the difference from the reset index in the other direction.\\n uint256 relativeIndex = ctx.currResetIndex - _index;\\n\\n // Condition only fails in the case that we deleted and flipped buffers.\\n require(\\n ctx.currResetIndex > ctx.prevResetIndex,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n // Make sure we're not trying to read beyond the array.\\n require(\\n relativeIndex <= prevBuffer.length,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n return prevBuffer.buf[prevBuffer.length - relativeIndex];\\n }\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n * @param _extraData Optional global extra data.\\n */\\n function deleteElementsAfterInclusive(\\n RingBuffer storage _self,\\n uint40 _index,\\n bytes27 _extraData\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n\\n require(\\n _index < ctx.globalIndex && _index >= ctx.prevResetIndex,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n if (_index < ctx.currResetIndex) {\\n // We're switching back to the previous buffer.\\n // Reduce the buffer index, set the current reset index back to match the previous one.\\n // We use the equality of these two values to prevent reading beyond this buffer.\\n ctx.currBufferIndex--;\\n ctx.currResetIndex = ctx.prevResetIndex;\\n }\\n\\n // Set our global index and extra data, save the context.\\n ctx.globalIndex = _index;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n */\\n function deleteElementsAfterInclusive(\\n RingBuffer storage _self,\\n uint40 _index\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n _self.deleteElementsAfterInclusive(\\n _index,\\n ctx.extraData\\n );\\n }\\n\\n /**\\n * Retrieves the current global index.\\n * @param _self Buffer to access.\\n * @return Current global index.\\n */\\n function getLength(\\n RingBuffer storage _self\\n )\\n internal\\n view\\n returns (\\n uint40\\n )\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n return ctx.globalIndex;\\n }\\n\\n /**\\n * Changes current global extra data.\\n * @param _self Buffer to access.\\n * @param _extraData New global extra data.\\n */\\n function setExtraData(\\n RingBuffer storage _self,\\n bytes27 _extraData\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Retrieves the current global extra data.\\n * @param _self Buffer to access.\\n * @return Current global extra data.\\n */\\n function getExtraData(\\n RingBuffer storage _self\\n )\\n internal\\n view\\n returns (\\n bytes27\\n )\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n return ctx.extraData;\\n }\\n\\n /**\\n * Sets the current ring buffer context.\\n * @param _self Buffer to access.\\n * @param _ctx Current ring buffer context.\\n */\\n function setContext(\\n RingBuffer storage _self,\\n RingBufferContext memory _ctx\\n )\\n internal\\n {\\n bytes32 contextA;\\n bytes32 contextB;\\n\\n uint40 globalIndex = _ctx.globalIndex;\\n bytes27 extraData = _ctx.extraData;\\n assembly {\\n contextA := globalIndex\\n contextA := or(contextA, extraData)\\n }\\n\\n uint64 currBufferIndex = _ctx.currBufferIndex;\\n uint40 prevResetIndex = _ctx.prevResetIndex;\\n uint40 currResetIndex = _ctx.currResetIndex;\\n assembly {\\n contextB := currBufferIndex\\n contextB := or(contextB, shl(64, prevResetIndex))\\n contextB := or(contextB, shl(104, currResetIndex))\\n }\\n\\n if (_self.contextA != contextA) {\\n _self.contextA = contextA;\\n }\\n\\n if (_self.contextB != contextB) {\\n _self.contextB = contextB;\\n }\\n }\\n\\n /**\\n * Retrieves the current ring buffer context.\\n * @param _self Buffer to access.\\n * @return Current ring buffer context.\\n */\\n function getContext(\\n RingBuffer storage _self\\n )\\n internal\\n view\\n returns (\\n RingBufferContext memory\\n )\\n {\\n bytes32 contextA = _self.contextA;\\n bytes32 contextB = _self.contextB;\\n\\n uint40 globalIndex;\\n bytes27 extraData;\\n assembly {\\n globalIndex := and(contextA, 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF)\\n extraData := and(contextA, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000)\\n }\\n\\n uint64 currBufferIndex;\\n uint40 prevResetIndex;\\n uint40 currResetIndex;\\n assembly {\\n currBufferIndex := and(contextB, 0x000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF)\\n prevResetIndex := shr(64, and(contextB, 0x00000000000000000000000000000000000000FFFFFFFFFF0000000000000000))\\n currResetIndex := shr(104, and(contextB, 0x0000000000000000000000000000FFFFFFFFFF00000000000000000000000000))\\n }\\n\\n return RingBufferContext({\\n globalIndex: globalIndex,\\n extraData: extraData,\\n currBufferIndex: currBufferIndex,\\n prevResetIndex: prevResetIndex,\\n currResetIndex: currResetIndex\\n });\\n }\\n\\n /**\\n * Retrieves the a buffer from the ring buffer by index.\\n * @param _self Buffer to access.\\n * @param _which Index of the sub buffer to access.\\n * @return Sub buffer for the index.\\n */\\n function getBuffer(\\n RingBuffer storage _self,\\n uint256 _which\\n )\\n internal\\n view\\n returns (\\n Buffer storage\\n )\\n {\\n return _which % 2 == 0 ? _self.bufferA : _self.bufferB;\\n }\\n}\\n\",\"keccak256\":\"0xe30fc56d4499f98582e1f800dfa3b343f171163a557266c31a56449d5fd3ffae\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x60806040523480156200001157600080fd5b506040516200118d3803806200118d833981810160405260408110156200003757600080fd5b8151602083018051604051929492938301929190846401000000008211156200005f57600080fd5b9083019060208201858111156200007557600080fd5b82516401000000008111828201881017156200009057600080fd5b82525081516020918201929091019080838360005b83811015620000bf578181015183820152602001620000a5565b50505050905090810190601f168015620000ed5780820380516001836020036101000a031916815260200191505b506040525050600080546001600160a01b0319166001600160a01b038516179055508051620001249060019060208401906200012d565b505050620001d9565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282620001655760008555620001b0565b82601f106200018057805160ff1916838001178555620001b0565b82800160010185558215620001b0579182015b82811115620001b057825182559160200191906001019062000193565b50620001be929150620001c2565b5090565b5b80821115620001be5760008155600101620001c3565b610fa480620001e96000396000f3fe608060405234801561001057600080fd5b50600436106100b45760003560e01c80634651d91e116100715780634651d91e1461021a5780638da5cb5b146102375780639507d39a146102b4578063b298e36b146102d1578063ccf8f969146102ee578063fa9e936c14610311576100b4565b8063167fd681146100b95780631f7b6d32146100e65780632015276c1461010057806329061de21461012b578063299ca47814610150578063461a447814610174575b600080fd5b6100e4600480360360408110156100cf57600080fd5b508035906020013564ffffffffff191661032e565b005b6100ee610423565b60408051918252519081900360200190f35b6100e46004803603604081101561011657600080fd5b508035906020013564ffffffffff191661043b565b6100e46004803603602081101561014157600080fd5b503564ffffffffff19166104f7565b6101586105b5565b604080516001600160a01b039092168252519081900360200190f35b6101586004803603602081101561018a57600080fd5b8101906020810181356401000000008111156101a557600080fd5b8201836020820111156101b757600080fd5b803590602001918460018302840111640100000000831117156101d957600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506105c4945050505050565b6100e46004803603602081101561023057600080fd5b50356106a0565b61023f61075b565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610279578181015183820152602001610261565b50505050905090810190601f1680156102a65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6100ee600480360360208110156102ca57600080fd5b50356107e8565b6100e4600480360360208110156102e757600080fd5b5035610802565b6102f66108bd565b6040805164ffffffffff199092168252519081900360200190f35b6100e46004803603602081101561032757600080fd5b50356108ce565b60018054604080516020601f6002600019610100878916150201909516949094049384018190048102820181019092528281526103c493909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b820191906000526020600020905b81548152906001019060200180831161039d57829003601f168201915b50505050506105c4565b6001600160a01b0316336001600160a01b0316146104135760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b61041f60028383610983565b5050565b600061042f6002610a75565b64ffffffffff16905090565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261049c93909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146104eb5760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b61041f60028383610a89565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261055893909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146105a75760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b6105b2600282610b90565b50565b6000546001600160a01b031681565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b8381101561062457818101518382015260200161060c565b50505050905090810190601f1680156106515780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561066e57600080fd5b505afa158015610682573d6000803e3d6000fd5b505050506040513d602081101561069857600080fd5b505192915050565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261070193909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146107505760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b6105b2600282610bba565b60018054604080516020600284861615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156107e05780601f106107b5576101008083540402835291602001916107e0565b820191906000526020600020905b8154815290600101906020018083116107c357829003601f168201915b505050505081565b60006107fc600264ffffffffff8416610be0565b92915050565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261086393909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146108b25760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b6105b2600282610de9565b60006108c96002610e0f565b905090565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261092f93909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b03161461097e5760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b600855565b600061098e84610e26565b9050806000015164ffffffffff168364ffffffffff161080156109c35750806060015164ffffffffff168364ffffffffff1610155b610a0b576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b806080015164ffffffffff168364ffffffffff161015610a4d576040810180516000190167ffffffffffffffff169052606081015164ffffffffff1660808201525b64ffffffffff8316815264ffffffffff1982166020820152610a6f8482610e86565b50505050565b600080610a8183610e26565b519392505050565b6000610a9484610e26565b90506000610ab9826040015167ffffffffffffffff1686610edc90919063ffffffff16565b8054909150610ac757601081555b8054608083015183510364ffffffffff1610610b3e578460060154826080015164ffffffffff161015610b365760408201805160010167ffffffffffffffff169081905260808301805164ffffffffff90811660608601528451169052610b2f908690610edc565b9050610b3e565b805460020281555b608082015182510364ffffffffff9081166000818152600184810160209081526040909220889055855101909216845264ffffffffff19851691840191909152610b888684610e86565b505050505050565b6000610b9b83610e26565b64ffffffffff19831660208201529050610bb58382610e86565b505050565b6000610bc583610e26565b9050610bb5828260200151856109839092919063ffffffff16565b600080610bec84610e26565b805190915064ffffffffff168310610c42576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b6000610c65826040015167ffffffffffffffff1686610edc90919063ffffffff16565b90506000610c8d836040015160010167ffffffffffffffff1687610edc90919063ffffffff16565b9050826080015164ffffffffff168510610d1a576080830151825464ffffffffff9091168603908110610cfe576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b6000908152600190920160205250604090205491506107fc9050565b6080830151606084015164ffffffffff9182168781039290911610610d7d576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b8154811115610dca576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b81540360009081526001909101602052604090205492506107fc915050565b6000610df483610e26565b9050610bb582826020015185610a899092919063ffffffff16565b600080610e1b83610e26565b602001519392505050565b610e2e610efc565b5080546001909101546040805160a08101825264ffffffffff808516825264ffffffffff19909416602082015267ffffffffffffffff8316818301529082901c8316606082015260689190911c909116608082015290565b80516020820151604080840151606085015160808601518754858717969483901b8417606883901b1795939291908714610ebe578689555b85896001015414610ed157600189018690555b505050505050505050565b60006002820615610ef05782600401610ef5565b826002015b9392505050565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091529056fe4f564d5f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2063616e206f6e6c792062652063616c6c656420627920746865206f776e65722ea264697066735822122014fd994dbf02ce54f07982ffcab79a1d699dc0313a3c136f6482cba97b52de4264736f6c63430007060033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100b45760003560e01c80634651d91e116100715780634651d91e1461021a5780638da5cb5b146102375780639507d39a146102b4578063b298e36b146102d1578063ccf8f969146102ee578063fa9e936c14610311576100b4565b8063167fd681146100b95780631f7b6d32146100e65780632015276c1461010057806329061de21461012b578063299ca47814610150578063461a447814610174575b600080fd5b6100e4600480360360408110156100cf57600080fd5b508035906020013564ffffffffff191661032e565b005b6100ee610423565b60408051918252519081900360200190f35b6100e46004803603604081101561011657600080fd5b508035906020013564ffffffffff191661043b565b6100e46004803603602081101561014157600080fd5b503564ffffffffff19166104f7565b6101586105b5565b604080516001600160a01b039092168252519081900360200190f35b6101586004803603602081101561018a57600080fd5b8101906020810181356401000000008111156101a557600080fd5b8201836020820111156101b757600080fd5b803590602001918460018302840111640100000000831117156101d957600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506105c4945050505050565b6100e46004803603602081101561023057600080fd5b50356106a0565b61023f61075b565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610279578181015183820152602001610261565b50505050905090810190601f1680156102a65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6100ee600480360360208110156102ca57600080fd5b50356107e8565b6100e4600480360360208110156102e757600080fd5b5035610802565b6102f66108bd565b6040805164ffffffffff199092168252519081900360200190f35b6100e46004803603602081101561032757600080fd5b50356108ce565b60018054604080516020601f6002600019610100878916150201909516949094049384018190048102820181019092528281526103c493909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b820191906000526020600020905b81548152906001019060200180831161039d57829003601f168201915b50505050506105c4565b6001600160a01b0316336001600160a01b0316146104135760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b61041f60028383610983565b5050565b600061042f6002610a75565b64ffffffffff16905090565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261049c93909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146104eb5760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b61041f60028383610a89565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261055893909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146105a75760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b6105b2600282610b90565b50565b6000546001600160a01b031681565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b8381101561062457818101518382015260200161060c565b50505050905090810190601f1680156106515780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561066e57600080fd5b505afa158015610682573d6000803e3d6000fd5b505050506040513d602081101561069857600080fd5b505192915050565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261070193909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146107505760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b6105b2600282610bba565b60018054604080516020600284861615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156107e05780601f106107b5576101008083540402835291602001916107e0565b820191906000526020600020905b8154815290600101906020018083116107c357829003601f168201915b505050505081565b60006107fc600264ffffffffff8416610be0565b92915050565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261086393909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146108b25760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b6105b2600282610de9565b60006108c96002610e0f565b905090565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261092f93909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b03161461097e5760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b600855565b600061098e84610e26565b9050806000015164ffffffffff168364ffffffffff161080156109c35750806060015164ffffffffff168364ffffffffff1610155b610a0b576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b806080015164ffffffffff168364ffffffffff161015610a4d576040810180516000190167ffffffffffffffff169052606081015164ffffffffff1660808201525b64ffffffffff8316815264ffffffffff1982166020820152610a6f8482610e86565b50505050565b600080610a8183610e26565b519392505050565b6000610a9484610e26565b90506000610ab9826040015167ffffffffffffffff1686610edc90919063ffffffff16565b8054909150610ac757601081555b8054608083015183510364ffffffffff1610610b3e578460060154826080015164ffffffffff161015610b365760408201805160010167ffffffffffffffff169081905260808301805164ffffffffff90811660608601528451169052610b2f908690610edc565b9050610b3e565b805460020281555b608082015182510364ffffffffff9081166000818152600184810160209081526040909220889055855101909216845264ffffffffff19851691840191909152610b888684610e86565b505050505050565b6000610b9b83610e26565b64ffffffffff19831660208201529050610bb58382610e86565b505050565b6000610bc583610e26565b9050610bb5828260200151856109839092919063ffffffff16565b600080610bec84610e26565b805190915064ffffffffff168310610c42576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b6000610c65826040015167ffffffffffffffff1686610edc90919063ffffffff16565b90506000610c8d836040015160010167ffffffffffffffff1687610edc90919063ffffffff16565b9050826080015164ffffffffff168510610d1a576080830151825464ffffffffff9091168603908110610cfe576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b6000908152600190920160205250604090205491506107fc9050565b6080830151606084015164ffffffffff9182168781039290911610610d7d576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b8154811115610dca576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b81540360009081526001909101602052604090205492506107fc915050565b6000610df483610e26565b9050610bb582826020015185610a899092919063ffffffff16565b600080610e1b83610e26565b602001519392505050565b610e2e610efc565b5080546001909101546040805160a08101825264ffffffffff808516825264ffffffffff19909416602082015267ffffffffffffffff8316818301529082901c8316606082015260689190911c909116608082015290565b80516020820151604080840151606085015160808601518754858717969483901b8417606883901b1795939291908714610ebe578689555b85896001015414610ed157600189018690555b505050505050505050565b60006002820615610ef05782600401610ef5565b826002015b9392505050565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091529056fe4f564d5f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2063616e206f6e6c792062652063616c6c656420627920746865206f776e65722ea264697066735822122014fd994dbf02ce54f07982ffcab79a1d699dc0313a3c136f6482cba97b52de4264736f6c63430007060033", "devdoc": { "details": "The Chain Storage Container provides its owner contract with read, write and delete functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which can no longer be used in a fraud proof due to the fraud window having passed, and the associated chain state or transactions being finalized. Three distinct Chain Storage Containers will be deployed on Layer 1: 1. Stores transaction batches for the Canonical Transaction Chain 2. Stores queued transactions for the Canonical Transaction Chain 3. Stores chain state batches for the State Commitment Chain Compiler used: solc Runtime target: EVM", "kind": "dev", @@ -270,6 +270,14 @@ "_object": "A 32 byte value to insert into the container." } }, + "resolve(string)": { + "params": { + "_name": "Name to resolve an address for." + }, + "returns": { + "_0": "Address associated with the given name." + } + }, "setGlobalMetadata(bytes27)": { "params": { "_globalMetadata": "New global metadata to set." @@ -303,6 +311,9 @@ "push(bytes32,bytes27)": { "notice": "Pushes an object into the container. Function allows setting the global metadata since we'll need to touch the \"length\" storage slot anyway, which also contains the global metadata (it's an optimization)." }, + "resolve(string)": { + "notice": "Resolves the address associated with a given name." + }, "setGlobalMetadata(bytes27)": { "notice": "Sets the container's global metadata field. We're using `bytes27` here because we use five bytes to maintain the length of the underlying data structure, meaning we have an extra 27 bytes to store arbitrary data." }, @@ -315,15 +326,15 @@ "storageLayout": { "storage": [ { - "astId": 12554, + "astId": 12856, "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", "label": "libAddressManager", "offset": 0, "slot": "0", - "type": "t_contract(Lib_AddressManager)12547" + "type": "t_contract(Lib_AddressManager)12849" }, { - "astId": 3772, + "astId": 4510, "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", "label": "owner", "offset": 0, @@ -331,12 +342,12 @@ "type": "t_string_storage" }, { - "astId": 3774, + "astId": 4512, "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", "label": "buffer", "offset": 0, "slot": "2", - "type": "t_struct(RingBuffer)17824_storage" + "type": "t_struct(RingBuffer)18001_storage" } ], "types": { @@ -345,7 +356,7 @@ "label": "bytes32", "numberOfBytes": "32" }, - "t_contract(Lib_AddressManager)12547": { + "t_contract(Lib_AddressManager)12849": { "encoding": "inplace", "label": "contract Lib_AddressManager", "numberOfBytes": "20" @@ -362,12 +373,12 @@ "label": "string", "numberOfBytes": "32" }, - "t_struct(Buffer)17813_storage": { + "t_struct(Buffer)17990_storage": { "encoding": "inplace", "label": "struct Lib_RingBuffer.Buffer", "members": [ { - "astId": 17808, + "astId": 17985, "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", "label": "length", "offset": 0, @@ -375,7 +386,7 @@ "type": "t_uint256" }, { - "astId": 17812, + "astId": 17989, "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", "label": "buf", "offset": 0, @@ -385,12 +396,12 @@ ], "numberOfBytes": "64" }, - "t_struct(RingBuffer)17824_storage": { + "t_struct(RingBuffer)18001_storage": { "encoding": "inplace", "label": "struct Lib_RingBuffer.RingBuffer", "members": [ { - "astId": 17815, + "astId": 17992, "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", "label": "contextA", "offset": 0, @@ -398,7 +409,7 @@ "type": "t_bytes32" }, { - "astId": 17817, + "astId": 17994, "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", "label": "contextB", "offset": 0, @@ -406,23 +417,23 @@ "type": "t_bytes32" }, { - "astId": 17819, + "astId": 17996, "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", "label": "bufferA", "offset": 0, "slot": "2", - "type": "t_struct(Buffer)17813_storage" + "type": "t_struct(Buffer)17990_storage" }, { - "astId": 17821, + "astId": 17998, "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", "label": "bufferB", "offset": 0, "slot": "4", - "type": "t_struct(Buffer)17813_storage" + "type": "t_struct(Buffer)17990_storage" }, { - "astId": 17823, + "astId": 18000, "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", "label": "nextOverwritableIndex", "offset": 0, diff --git a/packages/contracts/deployments/mainnet/OVM_ChainStorageContainer-SCC-batches.json b/packages/contracts/deployments/mainnet/OVM_ChainStorageContainer-SCC-batches.json index 79e6370006d45..d8843c21963e4 100644 --- a/packages/contracts/deployments/mainnet/OVM_ChainStorageContainer-SCC-batches.json +++ b/packages/contracts/deployments/mainnet/OVM_ChainStorageContainer-SCC-batches.json @@ -1,5 +1,5 @@ { - "address": "0x6B7Fce2C4FD1934a2d251F8b0930ac82DdDAD804", + "address": "0x7B8af5f008A7C5eFD319e68Fd5C9A68008519Caf", "abi": [ { "inputs": [ @@ -162,7 +162,7 @@ "outputs": [ { "internalType": "address", - "name": "_contract", + "name": "", "type": "address" } ], @@ -196,30 +196,30 @@ "type": "function" } ], - "transactionHash": "0x3e0af59033fa6e02868e35c9c5ac3ea241b7bdfc8e85950824c2109984f2a0c7", + "transactionHash": "0x5274f8966076b554ddddba99f5987fba45eeaa071324c4d68d01c40b6160d456", "receipt": { "to": null, - "from": "0x77C4c8f491e5ff22a2C0E18b005c3BA0Fe36c1Bc", - "contractAddress": "0x6B7Fce2C4FD1934a2d251F8b0930ac82DdDAD804", - "transactionIndex": 128, - "gasUsed": "959473", + "from": "0xd033f09cB85621F98F7A84C64dB381ac16Eff818", + "contractAddress": "0x7B8af5f008A7C5eFD319e68Fd5C9A68008519Caf", + "transactionIndex": 22, + "gasUsed": "970942", "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0xe1b0eec91862477a8db4dc5139ea97dbdb1c3519f7cd4040010c9e63c71dda8b", - "transactionHash": "0x3e0af59033fa6e02868e35c9c5ac3ea241b7bdfc8e85950824c2109984f2a0c7", + "blockHash": "0x9f27b2f9ffda2c799731c954123668232f423fdbc10da7c2031500488b2ba3c8", + "transactionHash": "0x5274f8966076b554ddddba99f5987fba45eeaa071324c4d68d01c40b6160d456", "logs": [], - "blockNumber": 12207780, - "cumulativeGasUsed": "9688823", + "blockNumber": 12410803, + "cumulativeGasUsed": "2690196", "status": 1, "byzantium": true }, "args": [ - "0xd3EeD86464Ff13B4BFD81a3bB1e753b7ceBA3A39", + "0x668E5b997b9aE88a56cd40409119d4Db9e6d752E", "OVM_StateCommitmentChain" ], - "solcInputHash": "43ee6bb8ef92595aa6d0e22a6c464dff", - "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_owner\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"get\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getGlobalMetadata\",\"outputs\":[{\"internalType\":\"bytes27\",\"name\":\"\",\"type\":\"bytes27\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"length\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"_contract\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"setGlobalMetadata\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"setNextOverwritableIndex\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The Chain Storage Container provides its owner contract with read, write and delete functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which can no longer be used in a fraud proof due to the fraud window having passed, and the associated chain state or transactions being finalized. Three distinct Chain Storage Containers will be deployed on Layer 1: 1. Stores transaction batches for the Canonical Transaction Chain 2. Stores queued transactions for the Canonical Transaction Chain 3. Stores chain state batches for the State Commitment Chain Compiler used: solc Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\",\"_owner\":\"Name of the contract that owns this container (will be resolved later).\"}},\"deleteElementsAfterInclusive(uint256)\":{\"params\":{\"_index\":\"Object index to delete from.\"}},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_index\":\"Object index to delete from.\"}},\"get(uint256)\":{\"params\":{\"_index\":\"Index of the particular object to access.\"},\"returns\":{\"_0\":\"32 byte object value.\"}},\"getGlobalMetadata()\":{\"returns\":{\"_0\":\"Container global metadata field.\"}},\"length()\":{\"returns\":{\"_0\":\"Number of objects in the container.\"}},\"push(bytes32)\":{\"params\":{\"_object\":\"A 32 byte value to insert into the container.\"}},\"push(bytes32,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_object\":\"A 32 byte value to insert into the container.\"}},\"setGlobalMetadata(bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata to set.\"}}},\"title\":\"OVM_ChainStorageContainer\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"deleteElementsAfterInclusive(uint256)\":{\"notice\":\"Removes all objects after and including a given index.\"},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"notice\":\"Removes all objects after and including a given index. Also allows setting the global metadata field.\"},\"get(uint256)\":{\"notice\":\"Retrieves an object from the container.\"},\"getGlobalMetadata()\":{\"notice\":\"Retrieves the container's global metadata field.\"},\"length()\":{\"notice\":\"Retrieves the number of objects stored in the container.\"},\"push(bytes32)\":{\"notice\":\"Pushes an object into the container.\"},\"push(bytes32,bytes27)\":{\"notice\":\"Pushes an object into the container. Function allows setting the global metadata since we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global metadata (it's an optimization).\"},\"setGlobalMetadata(bytes27)\":{\"notice\":\"Sets the container's global metadata field. We're using `bytes27` here because we use five bytes to maintain the length of the underlying data structure, meaning we have an extra 27 bytes to store arbitrary data.\"},\"setNextOverwritableIndex(uint256)\":{\"notice\":\"Marks an index as overwritable, meaing the underlying buffer can start to write values over any objects before and including the given index.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol\":\"OVM_ChainStorageContainer\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_RingBuffer } from \\\"../../libraries/utils/Lib_RingBuffer.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_ChainStorageContainer } from \\\"../../iOVM/chain/iOVM_ChainStorageContainer.sol\\\";\\n\\n/**\\n * @title OVM_ChainStorageContainer\\n * @dev The Chain Storage Container provides its owner contract with read, write and delete functionality.\\n * This provides gas efficiency gains by enabling it to overwrite storage slots which can no longer be used\\n * in a fraud proof due to the fraud window having passed, and the associated chain state or\\n * transactions being finalized.\\n * Three distinct Chain Storage Containers will be deployed on Layer 1:\\n * 1. Stores transaction batches for the Canonical Transaction Chain\\n * 2. Stores queued transactions for the Canonical Transaction Chain\\n * 3. Stores chain state batches for the State Commitment Chain\\n *\\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract OVM_ChainStorageContainer is iOVM_ChainStorageContainer, Lib_AddressResolver {\\n\\n /*************\\n * Libraries *\\n *************/\\n\\n using Lib_RingBuffer for Lib_RingBuffer.RingBuffer;\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n string public owner;\\n Lib_RingBuffer.RingBuffer internal buffer;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n * @param _owner Name of the contract that owns this container (will be resolved later).\\n */\\n constructor(\\n address _libAddressManager,\\n string memory _owner\\n )\\n Lib_AddressResolver(_libAddressManager)\\n {\\n owner = _owner;\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n msg.sender == resolve(owner),\\n \\\"OVM_ChainStorageContainer: Function can only be called by the owner.\\\"\\n );\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function setGlobalMetadata(\\n bytes27 _globalMetadata\\n )\\n override\\n public\\n onlyOwner\\n {\\n return buffer.setExtraData(_globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function getGlobalMetadata()\\n override\\n public\\n view\\n returns (\\n bytes27\\n )\\n {\\n return buffer.getExtraData();\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function length()\\n override\\n public\\n view\\n returns (\\n uint256\\n )\\n {\\n return uint256(buffer.getLength());\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function push(\\n bytes32 _object\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.push(_object);\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function push(\\n bytes32 _object,\\n bytes27 _globalMetadata\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.push(_object, _globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function get(\\n uint256 _index\\n )\\n override\\n public\\n view\\n returns (\\n bytes32\\n )\\n {\\n return buffer.get(uint40(_index));\\n }\\n \\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.deleteElementsAfterInclusive(\\n uint40(_index)\\n );\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index,\\n bytes27 _globalMetadata\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.deleteElementsAfterInclusive(\\n uint40(_index),\\n _globalMetadata\\n );\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function setNextOverwritableIndex(\\n uint256 _index\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.nextOverwritableIndex = _index;\\n }\\n}\\n\",\"keccak256\":\"0x52e3ef7166fe134d32997917067e3d74128173b12fb6231eec34132102ddbb50\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_ChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title iOVM_ChainStorageContainer\\n */\\ninterface iOVM_ChainStorageContainer {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata()\\n external\\n view\\n returns (\\n bytes27\\n );\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length()\\n external\\n view\\n returns (\\n uint256\\n );\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(\\n bytes32 _object\\n )\\n external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(\\n bytes32 _object,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(\\n uint256 _index\\n )\\n external\\n view\\n returns (\\n bytes32\\n );\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index\\n )\\n external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Marks an index as overwritable, meaing the underlying buffer can start to write values over\\n * any objects before and including the given index.\\n */\\n function setNextOverwritableIndex(\\n uint256 _index\\n )\\n external;\\n}\\n\",\"keccak256\":\"0x2d7973a0ad84c23ec62624d3f1e3aeb198cc72686ff1e6cfa17155556b320c94\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Contract Imports */\\nimport { Ownable } from \\\"./Lib_Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n /*******************************************\\n * Contract Variables: Internal Accounting *\\n *******************************************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n public\\n onlyOwner\\n {\\n emit AddressSet(_name, _address);\\n addresses[_getNameHash(_name)] = _address;\\n }\\n\\n function getAddress(\\n string memory _name\\n )\\n public\\n view\\n returns (address)\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32 _hash\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0x3a490595cc21ff170e4027843093670ff845d5972481fbfb956b722ea564bb06\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n\\n /*******************************************\\n * Contract Variables: Contract References *\\n *******************************************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(\\n address _libAddressManager\\n ) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function resolve(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address _contract\\n )\\n {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0xaa3ed342f6deb156c660fd83afa579a3b80db17eb465e8949cf5c1b114780143\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Ownable\\n * @dev Adapted from https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol\\n */\\nabstract contract Ownable {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n address public owner;\\n\\n\\n /**********\\n * Events *\\n **********/\\n\\n event OwnershipTransferred(\\n address indexed previousOwner,\\n address indexed newOwner\\n );\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n constructor() {\\n owner = msg.sender;\\n emit OwnershipTransferred(address(0), owner);\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n owner == msg.sender,\\n \\\"Ownable: caller is not the owner\\\"\\n );\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function renounceOwnership()\\n public\\n virtual\\n onlyOwner\\n {\\n emit OwnershipTransferred(owner, address(0));\\n owner = address(0);\\n }\\n\\n function transferOwnership(address _newOwner)\\n public\\n virtual\\n onlyOwner\\n {\\n require(\\n _newOwner != address(0),\\n \\\"Ownable: new owner cannot be the zero address\\\"\\n );\\n\\n emit OwnershipTransferred(owner, _newOwner);\\n owner = _newOwner;\\n }\\n}\\n\",\"keccak256\":\"0xd9dfd9264e5b5fedd53a5b10fdf179c3f367614b0fe69179bce4e45119f5b739\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_RingBuffer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\nlibrary Lib_RingBuffer {\\n using Lib_RingBuffer for RingBuffer;\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Buffer {\\n uint256 length;\\n mapping (uint256 => bytes32) buf;\\n }\\n\\n struct RingBuffer {\\n bytes32 contextA;\\n bytes32 contextB;\\n Buffer bufferA;\\n Buffer bufferB;\\n uint256 nextOverwritableIndex;\\n }\\n\\n struct RingBufferContext {\\n // contextA\\n uint40 globalIndex;\\n bytes27 extraData;\\n\\n // contextB\\n uint64 currBufferIndex;\\n uint40 prevResetIndex;\\n uint40 currResetIndex;\\n }\\n\\n\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 constant MIN_CAPACITY = 16;\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n * @param _extraData Optional global extra data.\\n */\\n function push(\\n RingBuffer storage _self,\\n bytes32 _value,\\n bytes27 _extraData\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n Buffer storage currBuffer = _self.getBuffer(ctx.currBufferIndex);\\n\\n // Set a minimum capacity.\\n if (currBuffer.length == 0) {\\n currBuffer.length = MIN_CAPACITY;\\n }\\n\\n // Check if we need to expand the buffer.\\n if (ctx.globalIndex - ctx.currResetIndex >= currBuffer.length) {\\n if (ctx.currResetIndex < _self.nextOverwritableIndex) {\\n // We're going to overwrite the inactive buffer.\\n // Bump the buffer index, reset the delete offset, and set our reset indices.\\n ctx.currBufferIndex++;\\n ctx.prevResetIndex = ctx.currResetIndex;\\n ctx.currResetIndex = ctx.globalIndex;\\n\\n // Swap over to the next buffer.\\n currBuffer = _self.getBuffer(ctx.currBufferIndex);\\n } else {\\n // We're not overwriting yet, double the length of the current buffer.\\n currBuffer.length *= 2;\\n }\\n }\\n\\n // Index to write to is the difference of the global and reset indices.\\n uint256 writeHead = ctx.globalIndex - ctx.currResetIndex;\\n currBuffer.buf[writeHead] = _value;\\n\\n // Bump the global index and insert our extra data, then save the context.\\n ctx.globalIndex++;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n */\\n function push(\\n RingBuffer storage _self,\\n bytes32 _value\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n \\n _self.push(\\n _value,\\n ctx.extraData\\n );\\n }\\n\\n /**\\n * Retrieves an element from the buffer.\\n * @param _self Buffer to access.\\n * @param _index Element index to retrieve.\\n * @return Value of the element at the given index.\\n */\\n function get(\\n RingBuffer storage _self,\\n uint256 _index\\n )\\n internal\\n view\\n returns (\\n bytes32 \\n )\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n\\n require(\\n _index < ctx.globalIndex,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n Buffer storage currBuffer = _self.getBuffer(ctx.currBufferIndex);\\n Buffer storage prevBuffer = _self.getBuffer(ctx.currBufferIndex + 1);\\n\\n if (_index >= ctx.currResetIndex) {\\n // We're trying to load an element from the current buffer.\\n // Relative index is just the difference from the reset index.\\n uint256 relativeIndex = _index - ctx.currResetIndex;\\n\\n // Shouldn't happen but why not check.\\n require(\\n relativeIndex < currBuffer.length,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n return currBuffer.buf[relativeIndex];\\n } else {\\n // We're trying to load an element from the previous buffer.\\n // Relative index is the difference from the reset index in the other direction.\\n uint256 relativeIndex = ctx.currResetIndex - _index;\\n\\n // Condition only fails in the case that we deleted and flipped buffers.\\n require(\\n ctx.currResetIndex > ctx.prevResetIndex,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n // Make sure we're not trying to read beyond the array.\\n require(\\n relativeIndex <= prevBuffer.length,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n return prevBuffer.buf[prevBuffer.length - relativeIndex];\\n }\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n * @param _extraData Optional global extra data.\\n */\\n function deleteElementsAfterInclusive(\\n RingBuffer storage _self,\\n uint40 _index,\\n bytes27 _extraData\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n\\n require(\\n _index < ctx.globalIndex && _index >= ctx.prevResetIndex,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n if (_index < ctx.currResetIndex) {\\n // We're switching back to the previous buffer.\\n // Reduce the buffer index, set the current reset index back to match the previous one.\\n // We use the equality of these two values to prevent reading beyond this buffer.\\n ctx.currBufferIndex--;\\n ctx.currResetIndex = ctx.prevResetIndex;\\n }\\n\\n // Set our global index and extra data, save the context.\\n ctx.globalIndex = _index;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n */\\n function deleteElementsAfterInclusive(\\n RingBuffer storage _self,\\n uint40 _index\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n _self.deleteElementsAfterInclusive(\\n _index,\\n ctx.extraData\\n );\\n }\\n\\n /**\\n * Retrieves the current global index.\\n * @param _self Buffer to access.\\n * @return Current global index.\\n */\\n function getLength(\\n RingBuffer storage _self\\n )\\n internal\\n view\\n returns (\\n uint40\\n )\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n return ctx.globalIndex;\\n }\\n\\n /**\\n * Changes current global extra data.\\n * @param _self Buffer to access.\\n * @param _extraData New global extra data.\\n */\\n function setExtraData(\\n RingBuffer storage _self,\\n bytes27 _extraData\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Retrieves the current global extra data.\\n * @param _self Buffer to access.\\n * @return Current global extra data.\\n */\\n function getExtraData(\\n RingBuffer storage _self\\n )\\n internal\\n view\\n returns (\\n bytes27\\n )\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n return ctx.extraData;\\n }\\n\\n /**\\n * Sets the current ring buffer context.\\n * @param _self Buffer to access.\\n * @param _ctx Current ring buffer context.\\n */\\n function setContext(\\n RingBuffer storage _self,\\n RingBufferContext memory _ctx\\n )\\n internal\\n {\\n bytes32 contextA;\\n bytes32 contextB;\\n\\n uint40 globalIndex = _ctx.globalIndex;\\n bytes27 extraData = _ctx.extraData;\\n assembly {\\n contextA := globalIndex\\n contextA := or(contextA, extraData)\\n }\\n\\n uint64 currBufferIndex = _ctx.currBufferIndex;\\n uint40 prevResetIndex = _ctx.prevResetIndex;\\n uint40 currResetIndex = _ctx.currResetIndex;\\n assembly {\\n contextB := currBufferIndex\\n contextB := or(contextB, shl(64, prevResetIndex))\\n contextB := or(contextB, shl(104, currResetIndex))\\n }\\n\\n if (_self.contextA != contextA) {\\n _self.contextA = contextA;\\n }\\n\\n if (_self.contextB != contextB) {\\n _self.contextB = contextB;\\n }\\n }\\n\\n /**\\n * Retrieves the current ring buffer context.\\n * @param _self Buffer to access.\\n * @return Current ring buffer context.\\n */\\n function getContext(\\n RingBuffer storage _self\\n )\\n internal\\n view\\n returns (\\n RingBufferContext memory\\n )\\n {\\n bytes32 contextA = _self.contextA;\\n bytes32 contextB = _self.contextB;\\n\\n uint40 globalIndex;\\n bytes27 extraData;\\n assembly {\\n globalIndex := and(contextA, 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF)\\n extraData := and(contextA, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000)\\n }\\n\\n uint64 currBufferIndex;\\n uint40 prevResetIndex;\\n uint40 currResetIndex;\\n assembly {\\n currBufferIndex := and(contextB, 0x000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF)\\n prevResetIndex := shr(64, and(contextB, 0x00000000000000000000000000000000000000FFFFFFFFFF0000000000000000))\\n currResetIndex := shr(104, and(contextB, 0x0000000000000000000000000000FFFFFFFFFF00000000000000000000000000))\\n }\\n\\n return RingBufferContext({\\n globalIndex: globalIndex,\\n extraData: extraData,\\n currBufferIndex: currBufferIndex,\\n prevResetIndex: prevResetIndex,\\n currResetIndex: currResetIndex\\n });\\n }\\n\\n /**\\n * Retrieves the a buffer from the ring buffer by index.\\n * @param _self Buffer to access.\\n * @param _which Index of the sub buffer to access.\\n * @return Sub buffer for the index.\\n */\\n function getBuffer(\\n RingBuffer storage _self,\\n uint256 _which\\n )\\n internal\\n view\\n returns (\\n Buffer storage\\n )\\n {\\n return _which % 2 == 0 ? _self.bufferA : _self.bufferB;\\n }\\n}\\n\",\"keccak256\":\"0xb38cb98da2d09f922d5cfe772bdbd36ede2b2267ade93128e949c9da21b89940\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x60806040523480156200001157600080fd5b506040516200116438038062001164833981810160405260408110156200003757600080fd5b8151602083018051604051929492938301929190846401000000008211156200005f57600080fd5b9083019060208201858111156200007557600080fd5b82516401000000008111828201881017156200009057600080fd5b82525081516020918201929091019080838360005b83811015620000bf578181015183820152602001620000a5565b50505050905090810190601f168015620000ed5780820380516001836020036101000a031916815260200191505b506040525050600080546001600160a01b0319166001600160a01b038516179055508051620001249060019060208401906200012d565b505050620001d9565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282620001655760008555620001b0565b82601f106200018057805160ff1916838001178555620001b0565b82800160010185558215620001b0579182015b82811115620001b057825182559160200191906001019062000193565b50620001be929150620001c2565b5090565b5b80821115620001be5760008155600101620001c3565b610f7b80620001e96000396000f3fe608060405234801561001057600080fd5b50600436106100b45760003560e01c80634651d91e116100715780634651d91e1461021a5780638da5cb5b146102375780639507d39a146102b4578063b298e36b146102d1578063ccf8f969146102ee578063fa9e936c14610311576100b4565b8063167fd681146100b95780631f7b6d32146100e65780632015276c1461010057806329061de21461012b578063299ca47814610150578063461a447814610174575b600080fd5b6100e4600480360360408110156100cf57600080fd5b508035906020013564ffffffffff191661032e565b005b6100ee610423565b60408051918252519081900360200190f35b6100e46004803603604081101561011657600080fd5b508035906020013564ffffffffff191661043b565b6100e46004803603602081101561014157600080fd5b503564ffffffffff19166104f7565b6101586105b5565b604080516001600160a01b039092168252519081900360200190f35b6101586004803603602081101561018a57600080fd5b8101906020810181356401000000008111156101a557600080fd5b8201836020820111156101b757600080fd5b803590602001918460018302840111640100000000831117156101d957600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506105c4945050505050565b6100e46004803603602081101561023057600080fd5b50356106a0565b61023f61075b565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610279578181015183820152602001610261565b50505050905090810190601f1680156102a65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6100ee600480360360208110156102ca57600080fd5b50356107e8565b6100e4600480360360208110156102e757600080fd5b5035610802565b6102f66108bd565b6040805164ffffffffff199092168252519081900360200190f35b6100e46004803603602081101561032757600080fd5b50356108ce565b60018054604080516020601f6002600019610100878916150201909516949094049384018190048102820181019092528281526103c493909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b820191906000526020600020905b81548152906001019060200180831161039d57829003601f168201915b50505050506105c4565b6001600160a01b0316336001600160a01b0316146104135760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b61041f60028383610983565b5050565b600061042f6002610a75565b64ffffffffff16905090565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261049c93909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146104eb5760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b61041f60028383610a89565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261055893909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146105a75760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b6105b2600282610b90565b50565b6000546001600160a01b031681565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b8381101561062457818101518382015260200161060c565b50505050905090810190601f1680156106515780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561066e57600080fd5b505afa158015610682573d6000803e3d6000fd5b505050506040513d602081101561069857600080fd5b505192915050565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261070193909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146107505760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b6105b2600282610bba565b60018054604080516020600284861615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156107e05780601f106107b5576101008083540402835291602001916107e0565b820191906000526020600020905b8154815290600101906020018083116107c357829003601f168201915b505050505081565b60006107fc600264ffffffffff8416610be0565b92915050565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261086393909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146108b25760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b6105b2600282610de9565b60006108c96002610e0f565b905090565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261092f93909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b03161461097e5760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b600855565b600061098e84610e26565b9050806000015164ffffffffff168364ffffffffff161080156109c35750806060015164ffffffffff168364ffffffffff1610155b610a0b576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b806080015164ffffffffff168364ffffffffff161015610a4d576040810180516000190167ffffffffffffffff169052606081015164ffffffffff1660808201525b64ffffffffff8316815264ffffffffff1982166020820152610a6f8482610e86565b50505050565b600080610a8183610e26565b519392505050565b6000610a9484610e26565b90506000610ab9826040015167ffffffffffffffff1686610edc90919063ffffffff16565b8054909150610ac757601081555b8054608083015183510364ffffffffff1610610b3e578460060154826080015164ffffffffff161015610b365760408201805160010167ffffffffffffffff169081905260808301805164ffffffffff90811660608601528451169052610b2f908690610edc565b9050610b3e565b805460020281555b608082015182510364ffffffffff9081166000818152600184810160209081526040909220889055855101909216845264ffffffffff19851691840191909152610b888684610e86565b505050505050565b6000610b9b83610e26565b64ffffffffff19831660208201529050610bb58382610e86565b505050565b6000610bc583610e26565b9050610bb5828260200151856109839092919063ffffffff16565b600080610bec84610e26565b805190915064ffffffffff168310610c42576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b6000610c65826040015167ffffffffffffffff1686610edc90919063ffffffff16565b90506000610c8d836040015160010167ffffffffffffffff1687610edc90919063ffffffff16565b9050826080015164ffffffffff168510610d1a576080830151825464ffffffffff9091168603908110610cfe576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b6000908152600190920160205250604090205491506107fc9050565b6080830151606084015164ffffffffff9182168781039290911610610d7d576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b8154811115610dca576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b81540360009081526001909101602052604090205492506107fc915050565b6000610df483610e26565b9050610bb582826020015185610a899092919063ffffffff16565b600080610e1b83610e26565b602001519392505050565b610e2e610efc565b5080546001909101546040805160a08101825264ffffffffff808516825264ffffffffff19909416602082015267ffffffffffffffff8316818301529082901c8316606082015260689190911c909116608082015290565b80516020820151604080840151606085015160808601518754858717969483901b8417606883901b1795939291908714610ebe578689555b85896001015414610ed157600189018690555b505050505050505050565b60006002820615610ef05782600401610ef5565b826002015b9392505050565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091529056fe4f564d5f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2063616e206f6e6c792062652063616c6c656420627920746865206f776e65722ea164736f6c6343000706000a", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100b45760003560e01c80634651d91e116100715780634651d91e1461021a5780638da5cb5b146102375780639507d39a146102b4578063b298e36b146102d1578063ccf8f969146102ee578063fa9e936c14610311576100b4565b8063167fd681146100b95780631f7b6d32146100e65780632015276c1461010057806329061de21461012b578063299ca47814610150578063461a447814610174575b600080fd5b6100e4600480360360408110156100cf57600080fd5b508035906020013564ffffffffff191661032e565b005b6100ee610423565b60408051918252519081900360200190f35b6100e46004803603604081101561011657600080fd5b508035906020013564ffffffffff191661043b565b6100e46004803603602081101561014157600080fd5b503564ffffffffff19166104f7565b6101586105b5565b604080516001600160a01b039092168252519081900360200190f35b6101586004803603602081101561018a57600080fd5b8101906020810181356401000000008111156101a557600080fd5b8201836020820111156101b757600080fd5b803590602001918460018302840111640100000000831117156101d957600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506105c4945050505050565b6100e46004803603602081101561023057600080fd5b50356106a0565b61023f61075b565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610279578181015183820152602001610261565b50505050905090810190601f1680156102a65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6100ee600480360360208110156102ca57600080fd5b50356107e8565b6100e4600480360360208110156102e757600080fd5b5035610802565b6102f66108bd565b6040805164ffffffffff199092168252519081900360200190f35b6100e46004803603602081101561032757600080fd5b50356108ce565b60018054604080516020601f6002600019610100878916150201909516949094049384018190048102820181019092528281526103c493909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b820191906000526020600020905b81548152906001019060200180831161039d57829003601f168201915b50505050506105c4565b6001600160a01b0316336001600160a01b0316146104135760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b61041f60028383610983565b5050565b600061042f6002610a75565b64ffffffffff16905090565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261049c93909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146104eb5760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b61041f60028383610a89565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261055893909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146105a75760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b6105b2600282610b90565b50565b6000546001600160a01b031681565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b8381101561062457818101518382015260200161060c565b50505050905090810190601f1680156106515780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561066e57600080fd5b505afa158015610682573d6000803e3d6000fd5b505050506040513d602081101561069857600080fd5b505192915050565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261070193909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146107505760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b6105b2600282610bba565b60018054604080516020600284861615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156107e05780601f106107b5576101008083540402835291602001916107e0565b820191906000526020600020905b8154815290600101906020018083116107c357829003601f168201915b505050505081565b60006107fc600264ffffffffff8416610be0565b92915050565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261086393909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146108b25760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b6105b2600282610de9565b60006108c96002610e0f565b905090565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261092f93909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b03161461097e5760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b600855565b600061098e84610e26565b9050806000015164ffffffffff168364ffffffffff161080156109c35750806060015164ffffffffff168364ffffffffff1610155b610a0b576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b806080015164ffffffffff168364ffffffffff161015610a4d576040810180516000190167ffffffffffffffff169052606081015164ffffffffff1660808201525b64ffffffffff8316815264ffffffffff1982166020820152610a6f8482610e86565b50505050565b600080610a8183610e26565b519392505050565b6000610a9484610e26565b90506000610ab9826040015167ffffffffffffffff1686610edc90919063ffffffff16565b8054909150610ac757601081555b8054608083015183510364ffffffffff1610610b3e578460060154826080015164ffffffffff161015610b365760408201805160010167ffffffffffffffff169081905260808301805164ffffffffff90811660608601528451169052610b2f908690610edc565b9050610b3e565b805460020281555b608082015182510364ffffffffff9081166000818152600184810160209081526040909220889055855101909216845264ffffffffff19851691840191909152610b888684610e86565b505050505050565b6000610b9b83610e26565b64ffffffffff19831660208201529050610bb58382610e86565b505050565b6000610bc583610e26565b9050610bb5828260200151856109839092919063ffffffff16565b600080610bec84610e26565b805190915064ffffffffff168310610c42576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b6000610c65826040015167ffffffffffffffff1686610edc90919063ffffffff16565b90506000610c8d836040015160010167ffffffffffffffff1687610edc90919063ffffffff16565b9050826080015164ffffffffff168510610d1a576080830151825464ffffffffff9091168603908110610cfe576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b6000908152600190920160205250604090205491506107fc9050565b6080830151606084015164ffffffffff9182168781039290911610610d7d576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b8154811115610dca576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b81540360009081526001909101602052604090205492506107fc915050565b6000610df483610e26565b9050610bb582826020015185610a899092919063ffffffff16565b600080610e1b83610e26565b602001519392505050565b610e2e610efc565b5080546001909101546040805160a08101825264ffffffffff808516825264ffffffffff19909416602082015267ffffffffffffffff8316818301529082901c8316606082015260689190911c909116608082015290565b80516020820151604080840151606085015160808601518754858717969483901b8417606883901b1795939291908714610ebe578689555b85896001015414610ed157600189018690555b505050505050505050565b60006002820615610ef05782600401610ef5565b826002015b9392505050565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091529056fe4f564d5f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2063616e206f6e6c792062652063616c6c656420627920746865206f776e65722ea164736f6c6343000706000a", + "solcInputHash": "f2bdab652d5102f5f11e78dae866798d", + "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_owner\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"get\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getGlobalMetadata\",\"outputs\":[{\"internalType\":\"bytes27\",\"name\":\"\",\"type\":\"bytes27\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"length\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"setGlobalMetadata\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"setNextOverwritableIndex\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The Chain Storage Container provides its owner contract with read, write and delete functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which can no longer be used in a fraud proof due to the fraud window having passed, and the associated chain state or transactions being finalized. Three distinct Chain Storage Containers will be deployed on Layer 1: 1. Stores transaction batches for the Canonical Transaction Chain 2. Stores queued transactions for the Canonical Transaction Chain 3. Stores chain state batches for the State Commitment Chain Compiler used: solc Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\",\"_owner\":\"Name of the contract that owns this container (will be resolved later).\"}},\"deleteElementsAfterInclusive(uint256)\":{\"params\":{\"_index\":\"Object index to delete from.\"}},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_index\":\"Object index to delete from.\"}},\"get(uint256)\":{\"params\":{\"_index\":\"Index of the particular object to access.\"},\"returns\":{\"_0\":\"32 byte object value.\"}},\"getGlobalMetadata()\":{\"returns\":{\"_0\":\"Container global metadata field.\"}},\"length()\":{\"returns\":{\"_0\":\"Number of objects in the container.\"}},\"push(bytes32)\":{\"params\":{\"_object\":\"A 32 byte value to insert into the container.\"}},\"push(bytes32,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_object\":\"A 32 byte value to insert into the container.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}},\"setGlobalMetadata(bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata to set.\"}}},\"title\":\"OVM_ChainStorageContainer\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"deleteElementsAfterInclusive(uint256)\":{\"notice\":\"Removes all objects after and including a given index.\"},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"notice\":\"Removes all objects after and including a given index. Also allows setting the global metadata field.\"},\"get(uint256)\":{\"notice\":\"Retrieves an object from the container.\"},\"getGlobalMetadata()\":{\"notice\":\"Retrieves the container's global metadata field.\"},\"length()\":{\"notice\":\"Retrieves the number of objects stored in the container.\"},\"push(bytes32)\":{\"notice\":\"Pushes an object into the container.\"},\"push(bytes32,bytes27)\":{\"notice\":\"Pushes an object into the container. Function allows setting the global metadata since we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global metadata (it's an optimization).\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"},\"setGlobalMetadata(bytes27)\":{\"notice\":\"Sets the container's global metadata field. We're using `bytes27` here because we use five bytes to maintain the length of the underlying data structure, meaning we have an extra 27 bytes to store arbitrary data.\"},\"setNextOverwritableIndex(uint256)\":{\"notice\":\"Marks an index as overwritable, meaing the underlying buffer can start to write values over any objects before and including the given index.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol\":\"OVM_ChainStorageContainer\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor () internal {\\n address msgSender = _msgSender();\\n _owner = msgSender;\\n emit OwnershipTransferred(address(0), msgSender);\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n emit OwnershipTransferred(_owner, address(0));\\n _owner = address(0);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n emit OwnershipTransferred(_owner, newOwner);\\n _owner = newOwner;\\n }\\n}\\n\",\"keccak256\":\"0x15e2d5bd4c28a88548074c54d220e8086f638a71ed07e6b3ba5a70066fcf458d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with GSN meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address payable) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes memory) {\\n this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x8d3cb350f04ff49cfb10aef08d87f19dcbaecc8027b0bed12f3275cd12f38cf0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_RingBuffer } from \\\"../../libraries/utils/Lib_RingBuffer.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_ChainStorageContainer } from \\\"../../iOVM/chain/iOVM_ChainStorageContainer.sol\\\";\\n\\n/**\\n * @title OVM_ChainStorageContainer\\n * @dev The Chain Storage Container provides its owner contract with read, write and delete functionality.\\n * This provides gas efficiency gains by enabling it to overwrite storage slots which can no longer be used\\n * in a fraud proof due to the fraud window having passed, and the associated chain state or\\n * transactions being finalized.\\n * Three distinct Chain Storage Containers will be deployed on Layer 1:\\n * 1. Stores transaction batches for the Canonical Transaction Chain\\n * 2. Stores queued transactions for the Canonical Transaction Chain\\n * 3. Stores chain state batches for the State Commitment Chain\\n *\\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract OVM_ChainStorageContainer is iOVM_ChainStorageContainer, Lib_AddressResolver {\\n\\n /*************\\n * Libraries *\\n *************/\\n\\n using Lib_RingBuffer for Lib_RingBuffer.RingBuffer;\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n string public owner;\\n Lib_RingBuffer.RingBuffer internal buffer;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n * @param _owner Name of the contract that owns this container (will be resolved later).\\n */\\n constructor(\\n address _libAddressManager,\\n string memory _owner\\n )\\n Lib_AddressResolver(_libAddressManager)\\n {\\n owner = _owner;\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n msg.sender == resolve(owner),\\n \\\"OVM_ChainStorageContainer: Function can only be called by the owner.\\\"\\n );\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function setGlobalMetadata(\\n bytes27 _globalMetadata\\n )\\n override\\n public\\n onlyOwner\\n {\\n return buffer.setExtraData(_globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function getGlobalMetadata()\\n override\\n public\\n view\\n returns (\\n bytes27\\n )\\n {\\n return buffer.getExtraData();\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function length()\\n override\\n public\\n view\\n returns (\\n uint256\\n )\\n {\\n return uint256(buffer.getLength());\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function push(\\n bytes32 _object\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.push(_object);\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function push(\\n bytes32 _object,\\n bytes27 _globalMetadata\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.push(_object, _globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function get(\\n uint256 _index\\n )\\n override\\n public\\n view\\n returns (\\n bytes32\\n )\\n {\\n return buffer.get(uint40(_index));\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.deleteElementsAfterInclusive(\\n uint40(_index)\\n );\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index,\\n bytes27 _globalMetadata\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.deleteElementsAfterInclusive(\\n uint40(_index),\\n _globalMetadata\\n );\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function setNextOverwritableIndex(\\n uint256 _index\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.nextOverwritableIndex = _index;\\n }\\n}\\n\",\"keccak256\":\"0x93325c961516aa2a22bf1aacf4029353d5e3b693e04b485753170337b50224e6\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_ChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title iOVM_ChainStorageContainer\\n */\\ninterface iOVM_ChainStorageContainer {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata()\\n external\\n view\\n returns (\\n bytes27\\n );\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length()\\n external\\n view\\n returns (\\n uint256\\n );\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(\\n bytes32 _object\\n )\\n external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(\\n bytes32 _object,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(\\n uint256 _index\\n )\\n external\\n view\\n returns (\\n bytes32\\n );\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index\\n )\\n external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Marks an index as overwritable, meaing the underlying buffer can start to write values over\\n * any objects before and including the given index.\\n */\\n function setNextOverwritableIndex(\\n uint256 _index\\n )\\n external;\\n}\\n\",\"keccak256\":\"0x2d7973a0ad84c23ec62624d3f1e3aeb198cc72686ff1e6cfa17155556b320c94\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n external\\n onlyOwner\\n {\\n addresses[_getNameHash(_name)] = _address;\\n\\n emit AddressSet(\\n _name,\\n _address\\n );\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(\\n string memory _name\\n )\\n external\\n view\\n returns (\\n address\\n )\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xcc9fc5c64f1101a5c6c397594086b1608189a9edc5c9635e1ac38f70aeeeecbf\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(\\n address _libAddressManager\\n ) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x65981feeabff6a81783ea97d44baf988a18a86c8cb374c46fdb71819cbacc7c0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_RingBuffer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\nlibrary Lib_RingBuffer {\\n using Lib_RingBuffer for RingBuffer;\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Buffer {\\n uint256 length;\\n mapping (uint256 => bytes32) buf;\\n }\\n\\n struct RingBuffer {\\n bytes32 contextA;\\n bytes32 contextB;\\n Buffer bufferA;\\n Buffer bufferB;\\n uint256 nextOverwritableIndex;\\n }\\n\\n struct RingBufferContext {\\n // contextA\\n uint40 globalIndex;\\n bytes27 extraData;\\n\\n // contextB\\n uint64 currBufferIndex;\\n uint40 prevResetIndex;\\n uint40 currResetIndex;\\n }\\n\\n\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 constant MIN_CAPACITY = 16;\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n * @param _extraData Optional global extra data.\\n */\\n function push(\\n RingBuffer storage _self,\\n bytes32 _value,\\n bytes27 _extraData\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n Buffer storage currBuffer = _self.getBuffer(ctx.currBufferIndex);\\n\\n // Set a minimum capacity.\\n if (currBuffer.length == 0) {\\n currBuffer.length = MIN_CAPACITY;\\n }\\n\\n // Check if we need to expand the buffer.\\n if (ctx.globalIndex - ctx.currResetIndex >= currBuffer.length) {\\n if (ctx.currResetIndex < _self.nextOverwritableIndex) {\\n // We're going to overwrite the inactive buffer.\\n // Bump the buffer index, reset the delete offset, and set our reset indices.\\n ctx.currBufferIndex++;\\n ctx.prevResetIndex = ctx.currResetIndex;\\n ctx.currResetIndex = ctx.globalIndex;\\n\\n // Swap over to the next buffer.\\n currBuffer = _self.getBuffer(ctx.currBufferIndex);\\n } else {\\n // We're not overwriting yet, double the length of the current buffer.\\n currBuffer.length *= 2;\\n }\\n }\\n\\n // Index to write to is the difference of the global and reset indices.\\n uint256 writeHead = ctx.globalIndex - ctx.currResetIndex;\\n currBuffer.buf[writeHead] = _value;\\n\\n // Bump the global index and insert our extra data, then save the context.\\n ctx.globalIndex++;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n */\\n function push(\\n RingBuffer storage _self,\\n bytes32 _value\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n\\n _self.push(\\n _value,\\n ctx.extraData\\n );\\n }\\n\\n /**\\n * Retrieves an element from the buffer.\\n * @param _self Buffer to access.\\n * @param _index Element index to retrieve.\\n * @return Value of the element at the given index.\\n */\\n function get(\\n RingBuffer storage _self,\\n uint256 _index\\n )\\n internal\\n view\\n returns (\\n bytes32\\n )\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n\\n require(\\n _index < ctx.globalIndex,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n Buffer storage currBuffer = _self.getBuffer(ctx.currBufferIndex);\\n Buffer storage prevBuffer = _self.getBuffer(ctx.currBufferIndex + 1);\\n\\n if (_index >= ctx.currResetIndex) {\\n // We're trying to load an element from the current buffer.\\n // Relative index is just the difference from the reset index.\\n uint256 relativeIndex = _index - ctx.currResetIndex;\\n\\n // Shouldn't happen but why not check.\\n require(\\n relativeIndex < currBuffer.length,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n return currBuffer.buf[relativeIndex];\\n } else {\\n // We're trying to load an element from the previous buffer.\\n // Relative index is the difference from the reset index in the other direction.\\n uint256 relativeIndex = ctx.currResetIndex - _index;\\n\\n // Condition only fails in the case that we deleted and flipped buffers.\\n require(\\n ctx.currResetIndex > ctx.prevResetIndex,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n // Make sure we're not trying to read beyond the array.\\n require(\\n relativeIndex <= prevBuffer.length,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n return prevBuffer.buf[prevBuffer.length - relativeIndex];\\n }\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n * @param _extraData Optional global extra data.\\n */\\n function deleteElementsAfterInclusive(\\n RingBuffer storage _self,\\n uint40 _index,\\n bytes27 _extraData\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n\\n require(\\n _index < ctx.globalIndex && _index >= ctx.prevResetIndex,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n if (_index < ctx.currResetIndex) {\\n // We're switching back to the previous buffer.\\n // Reduce the buffer index, set the current reset index back to match the previous one.\\n // We use the equality of these two values to prevent reading beyond this buffer.\\n ctx.currBufferIndex--;\\n ctx.currResetIndex = ctx.prevResetIndex;\\n }\\n\\n // Set our global index and extra data, save the context.\\n ctx.globalIndex = _index;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n */\\n function deleteElementsAfterInclusive(\\n RingBuffer storage _self,\\n uint40 _index\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n _self.deleteElementsAfterInclusive(\\n _index,\\n ctx.extraData\\n );\\n }\\n\\n /**\\n * Retrieves the current global index.\\n * @param _self Buffer to access.\\n * @return Current global index.\\n */\\n function getLength(\\n RingBuffer storage _self\\n )\\n internal\\n view\\n returns (\\n uint40\\n )\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n return ctx.globalIndex;\\n }\\n\\n /**\\n * Changes current global extra data.\\n * @param _self Buffer to access.\\n * @param _extraData New global extra data.\\n */\\n function setExtraData(\\n RingBuffer storage _self,\\n bytes27 _extraData\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Retrieves the current global extra data.\\n * @param _self Buffer to access.\\n * @return Current global extra data.\\n */\\n function getExtraData(\\n RingBuffer storage _self\\n )\\n internal\\n view\\n returns (\\n bytes27\\n )\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n return ctx.extraData;\\n }\\n\\n /**\\n * Sets the current ring buffer context.\\n * @param _self Buffer to access.\\n * @param _ctx Current ring buffer context.\\n */\\n function setContext(\\n RingBuffer storage _self,\\n RingBufferContext memory _ctx\\n )\\n internal\\n {\\n bytes32 contextA;\\n bytes32 contextB;\\n\\n uint40 globalIndex = _ctx.globalIndex;\\n bytes27 extraData = _ctx.extraData;\\n assembly {\\n contextA := globalIndex\\n contextA := or(contextA, extraData)\\n }\\n\\n uint64 currBufferIndex = _ctx.currBufferIndex;\\n uint40 prevResetIndex = _ctx.prevResetIndex;\\n uint40 currResetIndex = _ctx.currResetIndex;\\n assembly {\\n contextB := currBufferIndex\\n contextB := or(contextB, shl(64, prevResetIndex))\\n contextB := or(contextB, shl(104, currResetIndex))\\n }\\n\\n if (_self.contextA != contextA) {\\n _self.contextA = contextA;\\n }\\n\\n if (_self.contextB != contextB) {\\n _self.contextB = contextB;\\n }\\n }\\n\\n /**\\n * Retrieves the current ring buffer context.\\n * @param _self Buffer to access.\\n * @return Current ring buffer context.\\n */\\n function getContext(\\n RingBuffer storage _self\\n )\\n internal\\n view\\n returns (\\n RingBufferContext memory\\n )\\n {\\n bytes32 contextA = _self.contextA;\\n bytes32 contextB = _self.contextB;\\n\\n uint40 globalIndex;\\n bytes27 extraData;\\n assembly {\\n globalIndex := and(contextA, 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF)\\n extraData := and(contextA, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000)\\n }\\n\\n uint64 currBufferIndex;\\n uint40 prevResetIndex;\\n uint40 currResetIndex;\\n assembly {\\n currBufferIndex := and(contextB, 0x000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF)\\n prevResetIndex := shr(64, and(contextB, 0x00000000000000000000000000000000000000FFFFFFFFFF0000000000000000))\\n currResetIndex := shr(104, and(contextB, 0x0000000000000000000000000000FFFFFFFFFF00000000000000000000000000))\\n }\\n\\n return RingBufferContext({\\n globalIndex: globalIndex,\\n extraData: extraData,\\n currBufferIndex: currBufferIndex,\\n prevResetIndex: prevResetIndex,\\n currResetIndex: currResetIndex\\n });\\n }\\n\\n /**\\n * Retrieves the a buffer from the ring buffer by index.\\n * @param _self Buffer to access.\\n * @param _which Index of the sub buffer to access.\\n * @return Sub buffer for the index.\\n */\\n function getBuffer(\\n RingBuffer storage _self,\\n uint256 _which\\n )\\n internal\\n view\\n returns (\\n Buffer storage\\n )\\n {\\n return _which % 2 == 0 ? _self.bufferA : _self.bufferB;\\n }\\n}\\n\",\"keccak256\":\"0xe30fc56d4499f98582e1f800dfa3b343f171163a557266c31a56449d5fd3ffae\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x60806040523480156200001157600080fd5b506040516200118d3803806200118d833981810160405260408110156200003757600080fd5b8151602083018051604051929492938301929190846401000000008211156200005f57600080fd5b9083019060208201858111156200007557600080fd5b82516401000000008111828201881017156200009057600080fd5b82525081516020918201929091019080838360005b83811015620000bf578181015183820152602001620000a5565b50505050905090810190601f168015620000ed5780820380516001836020036101000a031916815260200191505b506040525050600080546001600160a01b0319166001600160a01b038516179055508051620001249060019060208401906200012d565b505050620001d9565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282620001655760008555620001b0565b82601f106200018057805160ff1916838001178555620001b0565b82800160010185558215620001b0579182015b82811115620001b057825182559160200191906001019062000193565b50620001be929150620001c2565b5090565b5b80821115620001be5760008155600101620001c3565b610fa480620001e96000396000f3fe608060405234801561001057600080fd5b50600436106100b45760003560e01c80634651d91e116100715780634651d91e1461021a5780638da5cb5b146102375780639507d39a146102b4578063b298e36b146102d1578063ccf8f969146102ee578063fa9e936c14610311576100b4565b8063167fd681146100b95780631f7b6d32146100e65780632015276c1461010057806329061de21461012b578063299ca47814610150578063461a447814610174575b600080fd5b6100e4600480360360408110156100cf57600080fd5b508035906020013564ffffffffff191661032e565b005b6100ee610423565b60408051918252519081900360200190f35b6100e46004803603604081101561011657600080fd5b508035906020013564ffffffffff191661043b565b6100e46004803603602081101561014157600080fd5b503564ffffffffff19166104f7565b6101586105b5565b604080516001600160a01b039092168252519081900360200190f35b6101586004803603602081101561018a57600080fd5b8101906020810181356401000000008111156101a557600080fd5b8201836020820111156101b757600080fd5b803590602001918460018302840111640100000000831117156101d957600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506105c4945050505050565b6100e46004803603602081101561023057600080fd5b50356106a0565b61023f61075b565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610279578181015183820152602001610261565b50505050905090810190601f1680156102a65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6100ee600480360360208110156102ca57600080fd5b50356107e8565b6100e4600480360360208110156102e757600080fd5b5035610802565b6102f66108bd565b6040805164ffffffffff199092168252519081900360200190f35b6100e46004803603602081101561032757600080fd5b50356108ce565b60018054604080516020601f6002600019610100878916150201909516949094049384018190048102820181019092528281526103c493909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b820191906000526020600020905b81548152906001019060200180831161039d57829003601f168201915b50505050506105c4565b6001600160a01b0316336001600160a01b0316146104135760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b61041f60028383610983565b5050565b600061042f6002610a75565b64ffffffffff16905090565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261049c93909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146104eb5760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b61041f60028383610a89565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261055893909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146105a75760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b6105b2600282610b90565b50565b6000546001600160a01b031681565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b8381101561062457818101518382015260200161060c565b50505050905090810190601f1680156106515780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561066e57600080fd5b505afa158015610682573d6000803e3d6000fd5b505050506040513d602081101561069857600080fd5b505192915050565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261070193909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146107505760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b6105b2600282610bba565b60018054604080516020600284861615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156107e05780601f106107b5576101008083540402835291602001916107e0565b820191906000526020600020905b8154815290600101906020018083116107c357829003601f168201915b505050505081565b60006107fc600264ffffffffff8416610be0565b92915050565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261086393909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146108b25760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b6105b2600282610de9565b60006108c96002610e0f565b905090565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261092f93909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b03161461097e5760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b600855565b600061098e84610e26565b9050806000015164ffffffffff168364ffffffffff161080156109c35750806060015164ffffffffff168364ffffffffff1610155b610a0b576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b806080015164ffffffffff168364ffffffffff161015610a4d576040810180516000190167ffffffffffffffff169052606081015164ffffffffff1660808201525b64ffffffffff8316815264ffffffffff1982166020820152610a6f8482610e86565b50505050565b600080610a8183610e26565b519392505050565b6000610a9484610e26565b90506000610ab9826040015167ffffffffffffffff1686610edc90919063ffffffff16565b8054909150610ac757601081555b8054608083015183510364ffffffffff1610610b3e578460060154826080015164ffffffffff161015610b365760408201805160010167ffffffffffffffff169081905260808301805164ffffffffff90811660608601528451169052610b2f908690610edc565b9050610b3e565b805460020281555b608082015182510364ffffffffff9081166000818152600184810160209081526040909220889055855101909216845264ffffffffff19851691840191909152610b888684610e86565b505050505050565b6000610b9b83610e26565b64ffffffffff19831660208201529050610bb58382610e86565b505050565b6000610bc583610e26565b9050610bb5828260200151856109839092919063ffffffff16565b600080610bec84610e26565b805190915064ffffffffff168310610c42576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b6000610c65826040015167ffffffffffffffff1686610edc90919063ffffffff16565b90506000610c8d836040015160010167ffffffffffffffff1687610edc90919063ffffffff16565b9050826080015164ffffffffff168510610d1a576080830151825464ffffffffff9091168603908110610cfe576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b6000908152600190920160205250604090205491506107fc9050565b6080830151606084015164ffffffffff9182168781039290911610610d7d576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b8154811115610dca576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b81540360009081526001909101602052604090205492506107fc915050565b6000610df483610e26565b9050610bb582826020015185610a899092919063ffffffff16565b600080610e1b83610e26565b602001519392505050565b610e2e610efc565b5080546001909101546040805160a08101825264ffffffffff808516825264ffffffffff19909416602082015267ffffffffffffffff8316818301529082901c8316606082015260689190911c909116608082015290565b80516020820151604080840151606085015160808601518754858717969483901b8417606883901b1795939291908714610ebe578689555b85896001015414610ed157600189018690555b505050505050505050565b60006002820615610ef05782600401610ef5565b826002015b9392505050565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091529056fe4f564d5f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2063616e206f6e6c792062652063616c6c656420627920746865206f776e65722ea264697066735822122014fd994dbf02ce54f07982ffcab79a1d699dc0313a3c136f6482cba97b52de4264736f6c63430007060033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100b45760003560e01c80634651d91e116100715780634651d91e1461021a5780638da5cb5b146102375780639507d39a146102b4578063b298e36b146102d1578063ccf8f969146102ee578063fa9e936c14610311576100b4565b8063167fd681146100b95780631f7b6d32146100e65780632015276c1461010057806329061de21461012b578063299ca47814610150578063461a447814610174575b600080fd5b6100e4600480360360408110156100cf57600080fd5b508035906020013564ffffffffff191661032e565b005b6100ee610423565b60408051918252519081900360200190f35b6100e46004803603604081101561011657600080fd5b508035906020013564ffffffffff191661043b565b6100e46004803603602081101561014157600080fd5b503564ffffffffff19166104f7565b6101586105b5565b604080516001600160a01b039092168252519081900360200190f35b6101586004803603602081101561018a57600080fd5b8101906020810181356401000000008111156101a557600080fd5b8201836020820111156101b757600080fd5b803590602001918460018302840111640100000000831117156101d957600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506105c4945050505050565b6100e46004803603602081101561023057600080fd5b50356106a0565b61023f61075b565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610279578181015183820152602001610261565b50505050905090810190601f1680156102a65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6100ee600480360360208110156102ca57600080fd5b50356107e8565b6100e4600480360360208110156102e757600080fd5b5035610802565b6102f66108bd565b6040805164ffffffffff199092168252519081900360200190f35b6100e46004803603602081101561032757600080fd5b50356108ce565b60018054604080516020601f6002600019610100878916150201909516949094049384018190048102820181019092528281526103c493909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b820191906000526020600020905b81548152906001019060200180831161039d57829003601f168201915b50505050506105c4565b6001600160a01b0316336001600160a01b0316146104135760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b61041f60028383610983565b5050565b600061042f6002610a75565b64ffffffffff16905090565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261049c93909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146104eb5760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b61041f60028383610a89565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261055893909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146105a75760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b6105b2600282610b90565b50565b6000546001600160a01b031681565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b8381101561062457818101518382015260200161060c565b50505050905090810190601f1680156106515780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561066e57600080fd5b505afa158015610682573d6000803e3d6000fd5b505050506040513d602081101561069857600080fd5b505192915050565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261070193909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146107505760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b6105b2600282610bba565b60018054604080516020600284861615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156107e05780601f106107b5576101008083540402835291602001916107e0565b820191906000526020600020905b8154815290600101906020018083116107c357829003601f168201915b505050505081565b60006107fc600264ffffffffff8416610be0565b92915050565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261086393909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146108b25760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b6105b2600282610de9565b60006108c96002610e0f565b905090565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261092f93909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b03161461097e5760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b600855565b600061098e84610e26565b9050806000015164ffffffffff168364ffffffffff161080156109c35750806060015164ffffffffff168364ffffffffff1610155b610a0b576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b806080015164ffffffffff168364ffffffffff161015610a4d576040810180516000190167ffffffffffffffff169052606081015164ffffffffff1660808201525b64ffffffffff8316815264ffffffffff1982166020820152610a6f8482610e86565b50505050565b600080610a8183610e26565b519392505050565b6000610a9484610e26565b90506000610ab9826040015167ffffffffffffffff1686610edc90919063ffffffff16565b8054909150610ac757601081555b8054608083015183510364ffffffffff1610610b3e578460060154826080015164ffffffffff161015610b365760408201805160010167ffffffffffffffff169081905260808301805164ffffffffff90811660608601528451169052610b2f908690610edc565b9050610b3e565b805460020281555b608082015182510364ffffffffff9081166000818152600184810160209081526040909220889055855101909216845264ffffffffff19851691840191909152610b888684610e86565b505050505050565b6000610b9b83610e26565b64ffffffffff19831660208201529050610bb58382610e86565b505050565b6000610bc583610e26565b9050610bb5828260200151856109839092919063ffffffff16565b600080610bec84610e26565b805190915064ffffffffff168310610c42576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b6000610c65826040015167ffffffffffffffff1686610edc90919063ffffffff16565b90506000610c8d836040015160010167ffffffffffffffff1687610edc90919063ffffffff16565b9050826080015164ffffffffff168510610d1a576080830151825464ffffffffff9091168603908110610cfe576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b6000908152600190920160205250604090205491506107fc9050565b6080830151606084015164ffffffffff9182168781039290911610610d7d576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b8154811115610dca576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b81540360009081526001909101602052604090205492506107fc915050565b6000610df483610e26565b9050610bb582826020015185610a899092919063ffffffff16565b600080610e1b83610e26565b602001519392505050565b610e2e610efc565b5080546001909101546040805160a08101825264ffffffffff808516825264ffffffffff19909416602082015267ffffffffffffffff8316818301529082901c8316606082015260689190911c909116608082015290565b80516020820151604080840151606085015160808601518754858717969483901b8417606883901b1795939291908714610ebe578689555b85896001015414610ed157600189018690555b505050505050505050565b60006002820615610ef05782600401610ef5565b826002015b9392505050565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091529056fe4f564d5f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2063616e206f6e6c792062652063616c6c656420627920746865206f776e65722ea264697066735822122014fd994dbf02ce54f07982ffcab79a1d699dc0313a3c136f6482cba97b52de4264736f6c63430007060033", "devdoc": { "details": "The Chain Storage Container provides its owner contract with read, write and delete functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which can no longer be used in a fraud proof due to the fraud window having passed, and the associated chain state or transactions being finalized. Three distinct Chain Storage Containers will be deployed on Layer 1: 1. Stores transaction batches for the Canonical Transaction Chain 2. Stores queued transactions for the Canonical Transaction Chain 3. Stores chain state batches for the State Commitment Chain Compiler used: solc Runtime target: EVM", "kind": "dev", @@ -270,6 +270,14 @@ "_object": "A 32 byte value to insert into the container." } }, + "resolve(string)": { + "params": { + "_name": "Name to resolve an address for." + }, + "returns": { + "_0": "Address associated with the given name." + } + }, "setGlobalMetadata(bytes27)": { "params": { "_globalMetadata": "New global metadata to set." @@ -303,6 +311,9 @@ "push(bytes32,bytes27)": { "notice": "Pushes an object into the container. Function allows setting the global metadata since we'll need to touch the \"length\" storage slot anyway, which also contains the global metadata (it's an optimization)." }, + "resolve(string)": { + "notice": "Resolves the address associated with a given name." + }, "setGlobalMetadata(bytes27)": { "notice": "Sets the container's global metadata field. We're using `bytes27` here because we use five bytes to maintain the length of the underlying data structure, meaning we have an extra 27 bytes to store arbitrary data." }, @@ -315,15 +326,15 @@ "storageLayout": { "storage": [ { - "astId": 12554, + "astId": 12856, "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", "label": "libAddressManager", "offset": 0, "slot": "0", - "type": "t_contract(Lib_AddressManager)12547" + "type": "t_contract(Lib_AddressManager)12849" }, { - "astId": 3772, + "astId": 4510, "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", "label": "owner", "offset": 0, @@ -331,12 +342,12 @@ "type": "t_string_storage" }, { - "astId": 3774, + "astId": 4512, "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", "label": "buffer", "offset": 0, "slot": "2", - "type": "t_struct(RingBuffer)17824_storage" + "type": "t_struct(RingBuffer)18001_storage" } ], "types": { @@ -345,7 +356,7 @@ "label": "bytes32", "numberOfBytes": "32" }, - "t_contract(Lib_AddressManager)12547": { + "t_contract(Lib_AddressManager)12849": { "encoding": "inplace", "label": "contract Lib_AddressManager", "numberOfBytes": "20" @@ -362,12 +373,12 @@ "label": "string", "numberOfBytes": "32" }, - "t_struct(Buffer)17813_storage": { + "t_struct(Buffer)17990_storage": { "encoding": "inplace", "label": "struct Lib_RingBuffer.Buffer", "members": [ { - "astId": 17808, + "astId": 17985, "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", "label": "length", "offset": 0, @@ -375,7 +386,7 @@ "type": "t_uint256" }, { - "astId": 17812, + "astId": 17989, "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", "label": "buf", "offset": 0, @@ -385,12 +396,12 @@ ], "numberOfBytes": "64" }, - "t_struct(RingBuffer)17824_storage": { + "t_struct(RingBuffer)18001_storage": { "encoding": "inplace", "label": "struct Lib_RingBuffer.RingBuffer", "members": [ { - "astId": 17815, + "astId": 17992, "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", "label": "contextA", "offset": 0, @@ -398,7 +409,7 @@ "type": "t_bytes32" }, { - "astId": 17817, + "astId": 17994, "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", "label": "contextB", "offset": 0, @@ -406,23 +417,23 @@ "type": "t_bytes32" }, { - "astId": 17819, + "astId": 17996, "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", "label": "bufferA", "offset": 0, "slot": "2", - "type": "t_struct(Buffer)17813_storage" + "type": "t_struct(Buffer)17990_storage" }, { - "astId": 17821, + "astId": 17998, "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", "label": "bufferB", "offset": 0, "slot": "4", - "type": "t_struct(Buffer)17813_storage" + "type": "t_struct(Buffer)17990_storage" }, { - "astId": 17823, + "astId": 18000, "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", "label": "nextOverwritableIndex", "offset": 0, diff --git a/packages/contracts/deployments/mainnet/OVM_ExecutionManager.json b/packages/contracts/deployments/mainnet/OVM_ExecutionManager.json index 4721f7f9c4ea1..19fa7860cdb13 100644 --- a/packages/contracts/deployments/mainnet/OVM_ExecutionManager.json +++ b/packages/contracts/deployments/mainnet/OVM_ExecutionManager.json @@ -1,5 +1,5 @@ { - "address": "0xEd93C5c21c502bB52b4D77240fA9a5d38472304d", + "address": "0x3f5FA555c434b49D946042955013966Fd108DaC3", "abi": [ { "inputs": [ @@ -513,7 +513,7 @@ "outputs": [ { "internalType": "address", - "name": "_contract", + "name": "", "type": "address" } ], @@ -571,7 +571,13 @@ } ], "name": "run", - "outputs": [], + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], "stateMutability": "nonpayable", "type": "function" }, @@ -655,11 +661,6 @@ ], "name": "simulateMessage", "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - }, { "internalType": "bytes", "name": "", @@ -670,38 +671,38 @@ "type": "function" } ], - "transactionHash": "0x5e986b048e3fc50a6186604f8048c310d4bcf7790dc790a41bf6eb337c8d4d48", + "transactionHash": "0xde8005c84c3179ad305e8a09dc97d3147344df3658bb76d7570a7721066f7eee", "receipt": { "to": null, - "from": "0x77C4c8f491e5ff22a2C0E18b005c3BA0Fe36c1Bc", - "contractAddress": "0xEd93C5c21c502bB52b4D77240fA9a5d38472304d", - "transactionIndex": 41, - "gasUsed": "3535831", + "from": "0xd033f09cB85621F98F7A84C64dB381ac16Eff818", + "contractAddress": "0x3f5FA555c434b49D946042955013966Fd108DaC3", + "transactionIndex": 194, + "gasUsed": "2944657", "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0x79facf003b0e15ebca3063dade3622d78db0537262b6165e260ed323fb158c7f", - "transactionHash": "0x5e986b048e3fc50a6186604f8048c310d4bcf7790dc790a41bf6eb337c8d4d48", + "blockHash": "0x9dd55e729aebcd0316698d6b7efebeef7ee1cc12d129ec22595107be4ee9c554", + "transactionHash": "0xde8005c84c3179ad305e8a09dc97d3147344df3658bb76d7570a7721066f7eee", "logs": [], - "blockNumber": 12207854, - "cumulativeGasUsed": "7070914", + "blockNumber": 12410837, + "cumulativeGasUsed": "10740618", "status": 1, "byzantium": true }, "args": [ - "0xd3EeD86464Ff13B4BFD81a3bB1e753b7ceBA3A39", + "0x668E5b997b9aE88a56cd40409119d4Db9e6d752E", { - "minTransactionGasLimit": 50000, + "minTransactionGasLimit": 100000, "maxTransactionGasLimit": 9000000, - "maxGasPerQueuePerEpoch": 250000000, + "maxGasPerQueuePerEpoch": 99999999999, "secondsPerEpoch": 0 }, { "ovmCHAINID": 10 } ], - "solcInputHash": "43ee6bb8ef92595aa6d0e22a6c464dff", - "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"minTransactionGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxTransactionGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxGasPerQueuePerEpoch\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"secondsPerEpoch\",\"type\":\"uint256\"}],\"internalType\":\"struct iOVM_ExecutionManager.GasMeterConfig\",\"name\":\"_gasMeterConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"ovmCHAINID\",\"type\":\"uint256\"}],\"internalType\":\"struct iOVM_ExecutionManager.GlobalContext\",\"name\":\"_globalContext\",\"type\":\"tuple\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"getMaxTransactionGasLimit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_maxTransactionGasLimit\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ovmADDRESS\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"_ADDRESS\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_address\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_calldata\",\"type\":\"bytes\"}],\"name\":\"ovmCALL\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"_success\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"_returndata\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ovmCALLER\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"_CALLER\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ovmCHAINID\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_CHAINID\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_bytecode\",\"type\":\"bytes\"}],\"name\":\"ovmCREATE\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_bytecode\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"_salt\",\"type\":\"bytes32\"}],\"name\":\"ovmCREATE2\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_messageHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint8\",\"name\":\"_v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"_r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"_s\",\"type\":\"bytes32\"}],\"name\":\"ovmCREATEEOA\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_address\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_calldata\",\"type\":\"bytes\"}],\"name\":\"ovmDELEGATECALL\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"_success\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"_returndata\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_contract\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_offset\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_length\",\"type\":\"uint256\"}],\"name\":\"ovmEXTCODECOPY\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"_code\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_contract\",\"type\":\"address\"}],\"name\":\"ovmEXTCODEHASH\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"_EXTCODEHASH\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_contract\",\"type\":\"address\"}],\"name\":\"ovmEXTCODESIZE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_EXTCODESIZE\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ovmGASLIMIT\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_GASLIMIT\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ovmGETNONCE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_nonce\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ovmINCREMENTNONCE\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ovmL1QUEUEORIGIN\",\"outputs\":[{\"internalType\":\"enum Lib_OVMCodec.QueueOrigin\",\"name\":\"_queueOrigin\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ovmL1TXORIGIN\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"_l1TxOrigin\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ovmNUMBER\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_NUMBER\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"ovmREVERT\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_key\",\"type\":\"bytes32\"}],\"name\":\"ovmSLOAD\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"_value\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_key\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"_value\",\"type\":\"bytes32\"}],\"name\":\"ovmSSTORE\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_address\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_calldata\",\"type\":\"bytes\"}],\"name\":\"ovmSTATICCALL\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"_success\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"_returndata\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ovmTIMESTAMP\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_TIMESTAMP\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"_contract\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"enum Lib_OVMCodec.QueueOrigin\",\"name\":\"l1QueueOrigin\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"l1TxOrigin\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"entrypoint\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.Transaction\",\"name\":\"_transaction\",\"type\":\"tuple\"},{\"internalType\":\"address\",\"name\":\"_ovmStateManager\",\"type\":\"address\"}],\"name\":\"run\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_creationCode\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"_address\",\"type\":\"address\"}],\"name\":\"safeCREATE\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"enum Lib_OVMCodec.QueueOrigin\",\"name\":\"l1QueueOrigin\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"l1TxOrigin\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"entrypoint\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.Transaction\",\"name\":\"_transaction\",\"type\":\"tuple\"},{\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"internalType\":\"contract iOVM_StateManager\",\"name\":\"_ovmStateManager\",\"type\":\"address\"}],\"name\":\"simulateMessage\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The Execution Manager (EM) is the core of our OVM implementation, and provides a sandboxed environment allowing us to execute OVM transactions deterministically on either Layer 1 or Layer 2. The EM's run() function is the first function called during the execution of any transaction on L2. For each context-dependent EVM operation the EM has a function which implements a corresponding OVM operation, which will read state from the State Manager contract. The EM relies on the Safety Checker to verify that code deployed to Layer 2 does not contain any context-dependent operations. Compiler used: solc Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\"}},\"ovmADDRESS()\":{\"returns\":{\"_ADDRESS\":\"Active ADDRESS within the current message context.\"}},\"ovmCALL(uint256,address,bytes)\":{\"params\":{\"_address\":\"Address of the contract to call.\",\"_calldata\":\"Data to send along with the call.\",\"_gasLimit\":\"Amount of gas to be passed into this call.\"},\"returns\":{\"_returndata\":\"Data returned by the call.\",\"_success\":\"Whether or not the call returned (rather than reverted).\"}},\"ovmCALLER()\":{\"returns\":{\"_CALLER\":\"Address of the CALLER within the current message context.\"}},\"ovmCHAINID()\":{\"returns\":{\"_CHAINID\":\"Value of the chain's CHAINID within the global context.\"}},\"ovmCREATE(bytes)\":{\"params\":{\"_bytecode\":\"Code to be used to CREATE a new contract.\"},\"returns\":{\"_0\":\"Address of the created contract.\",\"_1\":\"Revert data, if and only if the creation threw an exception.\"}},\"ovmCREATE2(bytes,bytes32)\":{\"params\":{\"_bytecode\":\"Code to be used to CREATE2 a new contract.\",\"_salt\":\"Value used to determine the contract's address.\"},\"returns\":{\"_0\":\"Address of the created contract.\",\"_1\":\"Revert data, if and only if the creation threw an exception.\"}},\"ovmCREATEEOA(bytes32,uint8,bytes32,bytes32)\":{\"details\":\"Essentially functions like ovmCREATE or ovmCREATE2, but we can bypass a lot of checks because the contract we're creating is trusted (no need to do safety checking or to handle unexpected reverts). Doesn't need to return an address because the address is assumed to be the user's actual address.\",\"params\":{\"_messageHash\":\"Hash of a message signed by some user, for verification.\",\"_r\":\"Signature `r` parameter.\",\"_s\":\"Signature `s` parameter.\",\"_v\":\"Signature `v` parameter.\"}},\"ovmDELEGATECALL(uint256,address,bytes)\":{\"params\":{\"_address\":\"Address of the contract to call.\",\"_calldata\":\"Data to send along with the call.\",\"_gasLimit\":\"Amount of gas to be passed into this call.\"},\"returns\":{\"_returndata\":\"Data returned by the call.\",\"_success\":\"Whether or not the call returned (rather than reverted).\"}},\"ovmEXTCODECOPY(address,uint256,uint256)\":{\"params\":{\"_contract\":\"Address of the contract to copy code from.\",\"_length\":\"Total number of bytes to copy from the contract's code.\",\"_offset\":\"Offset in bytes from the start of contract code to copy beyond.\"},\"returns\":{\"_code\":\"Bytes of code copied from the requested contract.\"}},\"ovmEXTCODEHASH(address)\":{\"params\":{\"_contract\":\"Address of the contract to query the hash of.\"},\"returns\":{\"_EXTCODEHASH\":\"Hash of the requested contract.\"}},\"ovmEXTCODESIZE(address)\":{\"params\":{\"_contract\":\"Address of the contract to query the size of.\"},\"returns\":{\"_EXTCODESIZE\":\"Size of the requested contract in bytes.\"}},\"ovmGASLIMIT()\":{\"returns\":{\"_GASLIMIT\":\"Value of the block's GASLIMIT within the transaction context.\"}},\"ovmGETNONCE()\":{\"returns\":{\"_nonce\":\"Nonce of the current contract.\"}},\"ovmL1QUEUEORIGIN()\":{\"returns\":{\"_queueOrigin\":\"Address of the ovmL1QUEUEORIGIN within the current message context.\"}},\"ovmL1TXORIGIN()\":{\"returns\":{\"_l1TxOrigin\":\"Address of the account which sent the tx into L2 from L1.\"}},\"ovmNUMBER()\":{\"returns\":{\"_NUMBER\":\"Value of the NUMBER within the transaction context.\"}},\"ovmREVERT(bytes)\":{\"params\":{\"_data\":\"Bytes data to pass along with the REVERT.\"}},\"ovmSLOAD(bytes32)\":{\"params\":{\"_key\":\"32 byte key of the storage slot to load.\"},\"returns\":{\"_value\":\"32 byte value of the requested storage slot.\"}},\"ovmSSTORE(bytes32,bytes32)\":{\"params\":{\"_key\":\"32 byte key of the storage slot to set.\",\"_value\":\"32 byte value for the storage slot.\"}},\"ovmSTATICCALL(uint256,address,bytes)\":{\"params\":{\"_address\":\"Address of the contract to call.\",\"_calldata\":\"Data to send along with the call.\",\"_gasLimit\":\"Amount of gas to be passed into this call.\"},\"returns\":{\"_returndata\":\"Data returned by the call.\",\"_success\":\"Whether or not the call returned (rather than reverted).\"}},\"ovmTIMESTAMP()\":{\"returns\":{\"_TIMESTAMP\":\"Value of the TIMESTAMP within the transaction context.\"}},\"run((uint256,uint256,uint8,address,address,uint256,bytes),address)\":{\"params\":{\"_ovmStateManager\":\"iOVM_StateManager implementation providing account state.\",\"_transaction\":\"Transaction data to be executed.\"}},\"safeCREATE(uint256,bytes,address)\":{\"params\":{\"_address\":\"OVM address being deployed to.\",\"_creationCode\":\"Code to pass into CREATE for deployment.\",\"_gasLimit\":\"Amount of gas to be passed into this creation.\"}},\"simulateMessage((uint256,uint256,uint8,address,address,uint256,bytes),address,address)\":{\"params\":{\"_from\":\"the OVM account the simulated call should be from.\",\"_transaction\":\"the message transaction to simulate.\"}}},\"title\":\"OVM_ExecutionManager\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"ovmADDRESS()\":{\"notice\":\"Overrides ADDRESS.\"},\"ovmCALL(uint256,address,bytes)\":{\"notice\":\"Overrides CALL.\"},\"ovmCALLER()\":{\"notice\":\"Overrides CALLER.\"},\"ovmCHAINID()\":{\"notice\":\"Overrides CHAINID.\"},\"ovmCREATE(bytes)\":{\"notice\":\"Overrides CREATE.\"},\"ovmCREATE2(bytes,bytes32)\":{\"notice\":\"Overrides CREATE2.\"},\"ovmCREATEEOA(bytes32,uint8,bytes32,bytes32)\":{\"notice\":\"Creates a new EOA contract account, for account abstraction.\"},\"ovmDELEGATECALL(uint256,address,bytes)\":{\"notice\":\"Overrides DELEGATECALL.\"},\"ovmEXTCODECOPY(address,uint256,uint256)\":{\"notice\":\"Overrides EXTCODECOPY.\"},\"ovmEXTCODEHASH(address)\":{\"notice\":\"Overrides EXTCODEHASH.\"},\"ovmEXTCODESIZE(address)\":{\"notice\":\"Overrides EXTCODESIZE.\"},\"ovmGASLIMIT()\":{\"notice\":\"Overrides GASLIMIT.\"},\"ovmGETNONCE()\":{\"notice\":\"Retrieves the nonce of the current ovmADDRESS.\"},\"ovmINCREMENTNONCE()\":{\"notice\":\"Bumps the nonce of the current ovmADDRESS by one.\"},\"ovmL1QUEUEORIGIN()\":{\"notice\":\"Specifies from which L1 rollup queue this transaction originated from.\"},\"ovmL1TXORIGIN()\":{\"notice\":\"Specifies which L1 account, if any, sent this transaction by calling enqueue().\"},\"ovmNUMBER()\":{\"notice\":\"Overrides NUMBER.\"},\"ovmREVERT(bytes)\":{\"notice\":\"Overrides REVERT.\"},\"ovmSLOAD(bytes32)\":{\"notice\":\"Overrides SLOAD.\"},\"ovmSSTORE(bytes32,bytes32)\":{\"notice\":\"Overrides SSTORE.\"},\"ovmSTATICCALL(uint256,address,bytes)\":{\"notice\":\"Overrides STATICCALL.\"},\"ovmTIMESTAMP()\":{\"notice\":\"Overrides TIMESTAMP.\"},\"run((uint256,uint256,uint8,address,address,uint256,bytes),address)\":{\"notice\":\"Starts the execution of a transaction via the OVM_ExecutionManager.\"},\"safeCREATE(uint256,bytes,address)\":{\"notice\":\"Handles the creation-specific safety measures required for OVM contract deployment. This function sanitizes the return types for creation messages to match calls (bool, bytes), by being an external function which the EM can call, that mimics the success/fail case of the CREATE. This allows for consistent handling of both types of messages in _handleExternalMessage(). Having this step occur as a separate call frame also allows us to easily revert the contract deployment in the event that the code is unsafe. \"},\"simulateMessage((uint256,uint256,uint8,address,address,uint256,bytes),address,address)\":{\"notice\":\"Unreachable helper function for simulating eth_calls with an OVM message context. This function will throw an exception in all cases other than when used as a custom entrypoint in L2 Geth to simulate eth_call.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol\":\"OVM_ExecutionManager\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/optimistic-ethereum/OVM/accounts/OVM_ECDSAContractAccount.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Interface Imports */\\nimport { iOVM_ECDSAContractAccount } from \\\"../../iOVM/accounts/iOVM_ECDSAContractAccount.sol\\\";\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { Lib_ECDSAUtils } from \\\"../../libraries/utils/Lib_ECDSAUtils.sol\\\";\\nimport { Lib_SafeExecutionManagerWrapper } from \\\"../../libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\\\";\\nimport { Lib_SafeMathWrapper } from \\\"../../libraries/wrappers/Lib_SafeMathWrapper.sol\\\";\\n\\n/**\\n * @title OVM_ECDSAContractAccount\\n * @dev The ECDSA Contract Account can be used as the implementation for a ProxyEOA deployed by the\\n * ovmCREATEEOA operation. It enables backwards compatibility with Ethereum's Layer 1, by \\n * providing eth_sign and EIP155 formatted transaction encodings.\\n *\\n * Compiler used: solc\\n * Runtime target: OVM\\n */\\ncontract OVM_ECDSAContractAccount is iOVM_ECDSAContractAccount {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n // TODO: should be the amount sufficient to cover the gas costs of all of the transactions up\\n // to and including the CALL/CREATE which forms the entrypoint of the transaction.\\n uint256 constant EXECUTION_VALIDATION_GAS_OVERHEAD = 25000;\\n address constant ETH_ERC20_ADDRESS = 0x4200000000000000000000000000000000000006;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Executes a signed transaction.\\n * @param _transaction Signed EOA transaction.\\n * @param _signatureType Hashing scheme used for the transaction (e.g., ETH signed message).\\n * @param _v Signature `v` parameter.\\n * @param _r Signature `r` parameter.\\n * @param _s Signature `s` parameter.\\n * @return Whether or not the call returned (rather than reverted).\\n * @return Data returned by the call.\\n */\\n function execute(\\n bytes memory _transaction,\\n Lib_OVMCodec.EOASignatureType _signatureType,\\n uint8 _v,\\n bytes32 _r,\\n bytes32 _s\\n )\\n override\\n public\\n returns (\\n bool,\\n bytes memory\\n )\\n {\\n bool isEthSign = _signatureType == Lib_OVMCodec.EOASignatureType.ETH_SIGNED_MESSAGE;\\n\\n // Address of this contract within the ovm (ovmADDRESS) should be the same as the\\n // recovered address of the user who signed this message. This is how we manage to shim\\n // account abstraction even though the user isn't a contract.\\n // Need to make sure that the transaction nonce is right and bump it if so.\\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(\\n Lib_ECDSAUtils.recover(\\n _transaction,\\n isEthSign,\\n _v,\\n _r,\\n _s\\n ) == Lib_SafeExecutionManagerWrapper.safeADDRESS(),\\n \\\"Signature provided for EOA transaction execution is invalid.\\\"\\n );\\n\\n Lib_OVMCodec.EIP155Transaction memory decodedTx = Lib_OVMCodec.decodeEIP155Transaction(_transaction, isEthSign);\\n\\n // Need to make sure that the transaction chainId is correct.\\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(\\n decodedTx.chainId == Lib_SafeExecutionManagerWrapper.safeCHAINID(),\\n \\\"Transaction chainId does not match expected OVM chainId.\\\"\\n );\\n\\n // Need to make sure that the transaction nonce is right.\\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(\\n decodedTx.nonce == Lib_SafeExecutionManagerWrapper.safeGETNONCE(),\\n \\\"Transaction nonce does not match the expected nonce.\\\"\\n );\\n\\n // TEMPORARY: Disable gas checks for mainnet.\\n // // Need to make sure that the gas is sufficient to execute the transaction.\\n // Lib_SafeExecutionManagerWrapper.safeREQUIRE(\\n // gasleft() >= Lib_SafeMathWrapper.add(decodedTx.gasLimit, EXECUTION_VALIDATION_GAS_OVERHEAD),\\n // \\\"Gas is not sufficient to execute the transaction.\\\"\\n // );\\n\\n // Transfer fee to relayer.\\n address relayer = Lib_SafeExecutionManagerWrapper.safeCALLER();\\n uint256 fee = Lib_SafeMathWrapper.mul(decodedTx.gasLimit, decodedTx.gasPrice);\\n (bool success, ) = Lib_SafeExecutionManagerWrapper.safeCALL(\\n gasleft(),\\n ETH_ERC20_ADDRESS,\\n abi.encodeWithSignature(\\\"transfer(address,uint256)\\\", relayer, fee)\\n );\\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(\\n success == true,\\n \\\"Fee was not transferred to relayer.\\\"\\n );\\n\\n // Contract creations are signalled by sending a transaction to the zero address.\\n if (decodedTx.to == address(0)) {\\n (address created, bytes memory revertData) = Lib_SafeExecutionManagerWrapper.safeCREATE(\\n gasleft(),\\n decodedTx.data\\n );\\n\\n // Return true if the contract creation succeeded, false w/ revertData otherwise.\\n if (created != address(0)) {\\n return (true, abi.encode(created));\\n } else {\\n return (false, revertData);\\n }\\n } else {\\n // We only want to bump the nonce for `ovmCALL` because `ovmCREATE` automatically bumps\\n // the nonce of the calling account. Normally an EOA would bump the nonce for both\\n // cases, but since this is a contract we'd end up bumping the nonce twice.\\n Lib_SafeExecutionManagerWrapper.safeINCREMENTNONCE();\\n\\n return Lib_SafeExecutionManagerWrapper.safeCALL(\\n gasleft(),\\n decodedTx.to,\\n decodedTx.data\\n );\\n }\\n }\\n}\\n\",\"keccak256\":\"0xcba0b593ad36291ec3d8c61ca254057c1bdcf1c9debf8ef920add32a51b14817\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/accounts/OVM_ProxyEOA.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_Bytes32Utils } from \\\"../../libraries/utils/Lib_Bytes32Utils.sol\\\";\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { Lib_ECDSAUtils } from \\\"../../libraries/utils/Lib_ECDSAUtils.sol\\\";\\nimport { Lib_SafeExecutionManagerWrapper } from \\\"../../libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\\\";\\n\\n/**\\n * @title OVM_ProxyEOA\\n * @dev The Proxy EOA contract uses a delegate call to execute the logic in an implementation contract.\\n * In combination with the logic implemented in the ECDSA Contract Account, this enables a form of upgradable \\n * 'account abstraction' on layer 2. \\n * \\n * Compiler used: solc\\n * Runtime target: OVM\\n */\\ncontract OVM_ProxyEOA {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n bytes32 constant IMPLEMENTATION_KEY = 0xdeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddead;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _implementation Address of the initial implementation contract.\\n */\\n constructor(\\n address _implementation\\n )\\n {\\n _setImplementation(_implementation);\\n }\\n\\n\\n /*********************\\n * Fallback Function *\\n *********************/\\n\\n fallback()\\n external\\n {\\n (bool success, bytes memory returndata) = Lib_SafeExecutionManagerWrapper.safeDELEGATECALL(\\n gasleft(),\\n getImplementation(),\\n msg.data\\n );\\n\\n if (success) {\\n assembly {\\n return(add(returndata, 0x20), mload(returndata))\\n }\\n } else {\\n Lib_SafeExecutionManagerWrapper.safeREVERT(\\n string(returndata)\\n );\\n }\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the implementation address.\\n * @param _implementation New implementation address.\\n */\\n function upgrade(\\n address _implementation\\n )\\n external\\n {\\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(\\n Lib_SafeExecutionManagerWrapper.safeADDRESS() == Lib_SafeExecutionManagerWrapper.safeCALLER(),\\n \\\"EOAs can only upgrade their own EOA implementation\\\"\\n );\\n\\n _setImplementation(_implementation);\\n }\\n\\n /**\\n * Gets the address of the current implementation.\\n * @return Current implementation address.\\n */\\n function getImplementation()\\n public\\n returns (\\n address\\n )\\n {\\n return Lib_Bytes32Utils.toAddress(\\n Lib_SafeExecutionManagerWrapper.safeSLOAD(\\n IMPLEMENTATION_KEY\\n )\\n );\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function _setImplementation(\\n address _implementation\\n )\\n internal\\n {\\n Lib_SafeExecutionManagerWrapper.safeSSTORE(\\n IMPLEMENTATION_KEY,\\n Lib_Bytes32Utils.fromAddress(_implementation)\\n );\\n }\\n}\\n\",\"keccak256\":\"0x220433074300f98c50f923df76050fbaa548e83926351b7a27f379aa851f70ec\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// @unsupported: ovm\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\nimport { Lib_EthUtils } from \\\"../../libraries/utils/Lib_EthUtils.sol\\\";\\nimport { Lib_ErrorUtils } from \\\"../../libraries/utils/Lib_ErrorUtils.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_ExecutionManager } from \\\"../../iOVM/execution/iOVM_ExecutionManager.sol\\\";\\nimport { iOVM_StateManager } from \\\"../../iOVM/execution/iOVM_StateManager.sol\\\";\\nimport { iOVM_SafetyChecker } from \\\"../../iOVM/execution/iOVM_SafetyChecker.sol\\\";\\n\\n/* Contract Imports */\\nimport { OVM_ECDSAContractAccount } from \\\"../accounts/OVM_ECDSAContractAccount.sol\\\";\\nimport { OVM_ProxyEOA } from \\\"../accounts/OVM_ProxyEOA.sol\\\";\\nimport { OVM_DeployerWhitelist } from \\\"../predeploys/OVM_DeployerWhitelist.sol\\\";\\n\\n/**\\n * @title OVM_ExecutionManager\\n * @dev The Execution Manager (EM) is the core of our OVM implementation, and provides a sandboxed\\n * environment allowing us to execute OVM transactions deterministically on either Layer 1 or\\n * Layer 2.\\n * The EM's run() function is the first function called during the execution of any\\n * transaction on L2.\\n * For each context-dependent EVM operation the EM has a function which implements a corresponding\\n * OVM operation, which will read state from the State Manager contract.\\n * The EM relies on the Safety Checker to verify that code deployed to Layer 2 does not contain any\\n * context-dependent operations.\\n *\\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract OVM_ExecutionManager is iOVM_ExecutionManager, Lib_AddressResolver {\\n\\n /********************************\\n * External Contract References *\\n ********************************/\\n\\n iOVM_SafetyChecker internal ovmSafetyChecker;\\n iOVM_StateManager internal ovmStateManager;\\n\\n\\n /*******************************\\n * Execution Context Variables *\\n *******************************/\\n\\n GasMeterConfig internal gasMeterConfig;\\n GlobalContext internal globalContext;\\n TransactionContext internal transactionContext;\\n MessageContext internal messageContext;\\n TransactionRecord internal transactionRecord;\\n MessageRecord internal messageRecord;\\n\\n\\n /**************************\\n * Gas Metering Constants *\\n **************************/\\n\\n address constant GAS_METADATA_ADDRESS = 0x06a506A506a506A506a506a506A506A506A506A5;\\n uint256 constant NUISANCE_GAS_SLOAD = 20000;\\n uint256 constant NUISANCE_GAS_SSTORE = 20000;\\n uint256 constant MIN_NUISANCE_GAS_PER_CONTRACT = 30000;\\n uint256 constant NUISANCE_GAS_PER_CONTRACT_BYTE = 100;\\n uint256 constant MIN_GAS_FOR_INVALID_STATE_ACCESS = 30000;\\n\\n /**************************\\n * Default Context Values *\\n **************************/\\n\\n uint256 constant DEFAULT_UINT256 = 0xdefa017defa017defa017defa017defa017defa017defa017defa017defa017d;\\n address constant DEFAULT_ADDRESS = 0xdEfa017defA017DeFA017DEfa017DeFA017DeFa0;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n */\\n constructor(\\n address _libAddressManager,\\n GasMeterConfig memory _gasMeterConfig,\\n GlobalContext memory _globalContext\\n )\\n Lib_AddressResolver(_libAddressManager)\\n {\\n ovmSafetyChecker = iOVM_SafetyChecker(resolve(\\\"OVM_SafetyChecker\\\"));\\n gasMeterConfig = _gasMeterConfig;\\n globalContext = _globalContext;\\n _resetContext();\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n /**\\n * Applies dynamically-sized refund to a transaction to account for the difference in execution\\n * between L1 and L2, so that the overall cost of the ovmOPCODE is fixed.\\n * @param _cost Desired gas cost for the function after the refund.\\n */\\n modifier netGasCost(\\n uint256 _cost\\n ) {\\n uint256 gasProvided = gasleft();\\n _;\\n uint256 gasUsed = gasProvided - gasleft();\\n\\n // We want to refund everything *except* the specified cost.\\n if (_cost < gasUsed) {\\n transactionRecord.ovmGasRefund += gasUsed - _cost;\\n }\\n }\\n\\n /**\\n * Applies a fixed-size gas refund to a transaction to account for the difference in execution\\n * between L1 and L2, so that the overall cost of an ovmOPCODE can be lowered.\\n * @param _discount Amount of gas cost to refund for the ovmOPCODE.\\n */\\n modifier fixedGasDiscount(\\n uint256 _discount\\n ) {\\n uint256 gasProvided = gasleft();\\n _;\\n uint256 gasUsed = gasProvided - gasleft();\\n\\n // We want to refund the specified _discount, unless this risks underflow.\\n if (_discount < gasUsed) {\\n transactionRecord.ovmGasRefund += _discount;\\n } else {\\n // refund all we can without risking underflow.\\n transactionRecord.ovmGasRefund += gasUsed;\\n }\\n }\\n\\n /**\\n * Makes sure we're not inside a static context.\\n */\\n modifier notStatic() {\\n if (messageContext.isStatic == true) {\\n _revertWithFlag(RevertFlag.STATIC_VIOLATION);\\n }\\n _;\\n }\\n\\n\\n /************************************\\n * Transaction Execution Entrypoint *\\n ************************************/\\n\\n /**\\n * Starts the execution of a transaction via the OVM_ExecutionManager.\\n * @param _transaction Transaction data to be executed.\\n * @param _ovmStateManager iOVM_StateManager implementation providing account state.\\n */\\n function run(\\n Lib_OVMCodec.Transaction memory _transaction,\\n address _ovmStateManager\\n )\\n override\\n public\\n {\\n // Make sure that run() is not re-enterable. This condition should awlways be satisfied\\n // Once run has been called once, due to the behvaior of _isValidInput().\\n if (transactionContext.ovmNUMBER != DEFAULT_UINT256) {\\n return;\\n }\\n\\n // Store our OVM_StateManager instance (significantly easier than attempting to pass the\\n // address around in calldata).\\n ovmStateManager = iOVM_StateManager(_ovmStateManager);\\n\\n // Make sure this function can't be called by anyone except the owner of the\\n // OVM_StateManager (expected to be an OVM_StateTransitioner). We can revert here because\\n // this would make the `run` itself invalid.\\n require(\\n // This method may return false during fraud proofs, but always returns true in L2 nodes' State Manager precompile.\\n ovmStateManager.isAuthenticated(msg.sender),\\n \\\"Only authenticated addresses in ovmStateManager can call this function\\\"\\n );\\n\\n // Initialize the execution context, must be initialized before we perform any gas metering\\n // or we'll throw a nuisance gas error.\\n _initContext(_transaction);\\n\\n // TEMPORARY: Gas metering is disabled for minnet.\\n // // Check whether we need to start a new epoch, do so if necessary.\\n // _checkNeedsNewEpoch(_transaction.timestamp);\\n\\n // Make sure the transaction's gas limit is valid. We don't revert here because we reserve\\n // reverts for INVALID_STATE_ACCESS.\\n if (_isValidInput(_transaction) == false) {\\n _resetContext();\\n return;\\n }\\n\\n // TEMPORARY: Gas metering is disabled for minnet.\\n // // Check gas right before the call to get total gas consumed by OVM transaction.\\n // uint256 gasProvided = gasleft();\\n\\n // Run the transaction, make sure to meter the gas usage.\\n ovmCALL(\\n _transaction.gasLimit - gasMeterConfig.minTransactionGasLimit,\\n _transaction.entrypoint,\\n _transaction.data\\n );\\n\\n // TEMPORARY: Gas metering is disabled for minnet.\\n // // Update the cumulative gas based on the amount of gas used.\\n // uint256 gasUsed = gasProvided - gasleft();\\n // _updateCumulativeGas(gasUsed, _transaction.l1QueueOrigin);\\n\\n // Wipe the execution context.\\n _resetContext();\\n }\\n\\n\\n /******************************\\n * Opcodes: Execution Context *\\n ******************************/\\n\\n /**\\n * @notice Overrides CALLER.\\n * @return _CALLER Address of the CALLER within the current message context.\\n */\\n function ovmCALLER()\\n override\\n public\\n view\\n returns (\\n address _CALLER\\n )\\n {\\n return messageContext.ovmCALLER;\\n }\\n\\n /**\\n * @notice Overrides ADDRESS.\\n * @return _ADDRESS Active ADDRESS within the current message context.\\n */\\n function ovmADDRESS()\\n override\\n public\\n view\\n returns (\\n address _ADDRESS\\n )\\n {\\n return messageContext.ovmADDRESS;\\n }\\n\\n /**\\n * @notice Overrides TIMESTAMP.\\n * @return _TIMESTAMP Value of the TIMESTAMP within the transaction context.\\n */\\n function ovmTIMESTAMP()\\n override\\n public\\n view\\n returns (\\n uint256 _TIMESTAMP\\n )\\n {\\n return transactionContext.ovmTIMESTAMP;\\n }\\n\\n /**\\n * @notice Overrides NUMBER.\\n * @return _NUMBER Value of the NUMBER within the transaction context.\\n */\\n function ovmNUMBER()\\n override\\n public\\n view\\n returns (\\n uint256 _NUMBER\\n )\\n {\\n return transactionContext.ovmNUMBER;\\n }\\n\\n /**\\n * @notice Overrides GASLIMIT.\\n * @return _GASLIMIT Value of the block's GASLIMIT within the transaction context.\\n */\\n function ovmGASLIMIT()\\n override\\n public\\n view\\n returns (\\n uint256 _GASLIMIT\\n )\\n {\\n return transactionContext.ovmGASLIMIT;\\n }\\n\\n /**\\n * @notice Overrides CHAINID.\\n * @return _CHAINID Value of the chain's CHAINID within the global context.\\n */\\n function ovmCHAINID()\\n override\\n public\\n view\\n returns (\\n uint256 _CHAINID\\n )\\n {\\n return globalContext.ovmCHAINID;\\n }\\n\\n /*********************************\\n * Opcodes: L2 Execution Context *\\n *********************************/\\n\\n /**\\n * @notice Specifies from which L1 rollup queue this transaction originated from.\\n * @return _queueOrigin Address of the ovmL1QUEUEORIGIN within the current message context.\\n */\\n function ovmL1QUEUEORIGIN()\\n override\\n public\\n view\\n returns (\\n Lib_OVMCodec.QueueOrigin _queueOrigin\\n )\\n {\\n return transactionContext.ovmL1QUEUEORIGIN;\\n }\\n\\n /**\\n * @notice Specifies which L1 account, if any, sent this transaction by calling enqueue().\\n * @return _l1TxOrigin Address of the account which sent the tx into L2 from L1.\\n */\\n function ovmL1TXORIGIN()\\n override\\n public\\n view\\n returns (\\n address _l1TxOrigin\\n )\\n {\\n return transactionContext.ovmL1TXORIGIN;\\n }\\n\\n /********************\\n * Opcodes: Halting *\\n ********************/\\n\\n /**\\n * @notice Overrides REVERT.\\n * @param _data Bytes data to pass along with the REVERT.\\n */\\n function ovmREVERT(\\n bytes memory _data\\n )\\n override\\n public\\n {\\n _revertWithFlag(RevertFlag.INTENTIONAL_REVERT, _data);\\n }\\n\\n\\n /******************************\\n * Opcodes: Contract Creation *\\n ******************************/\\n\\n /**\\n * @notice Overrides CREATE.\\n * @param _bytecode Code to be used to CREATE a new contract.\\n * @return Address of the created contract.\\n * @return Revert data, if and only if the creation threw an exception.\\n */\\n function ovmCREATE(\\n bytes memory _bytecode\\n )\\n override\\n public\\n notStatic\\n fixedGasDiscount(40000)\\n returns (\\n address,\\n bytes memory\\n )\\n {\\n // Creator is always the current ADDRESS.\\n address creator = ovmADDRESS();\\n\\n // Check that the deployer is whitelisted, or\\n // that arbitrary contract deployment has been enabled.\\n _checkDeployerAllowed(creator);\\n\\n // Generate the correct CREATE address.\\n address contractAddress = Lib_EthUtils.getAddressForCREATE(\\n creator,\\n _getAccountNonce(creator)\\n );\\n\\n return _createContract(\\n contractAddress,\\n _bytecode\\n );\\n }\\n\\n /**\\n * @notice Overrides CREATE2.\\n * @param _bytecode Code to be used to CREATE2 a new contract.\\n * @param _salt Value used to determine the contract's address.\\n * @return Address of the created contract.\\n * @return Revert data, if and only if the creation threw an exception.\\n */\\n function ovmCREATE2(\\n bytes memory _bytecode,\\n bytes32 _salt\\n )\\n override\\n public\\n notStatic\\n fixedGasDiscount(40000)\\n returns (\\n address,\\n bytes memory\\n )\\n {\\n // Creator is always the current ADDRESS.\\n address creator = ovmADDRESS();\\n\\n // Check that the deployer is whitelisted, or\\n // that arbitrary contract deployment has been enabled.\\n _checkDeployerAllowed(creator);\\n\\n // Generate the correct CREATE2 address.\\n address contractAddress = Lib_EthUtils.getAddressForCREATE2(\\n creator,\\n _bytecode,\\n _salt\\n );\\n\\n return _createContract(\\n contractAddress,\\n _bytecode\\n );\\n }\\n\\n\\n /*******************************\\n * Account Abstraction Opcodes *\\n ******************************/\\n\\n /**\\n * Retrieves the nonce of the current ovmADDRESS.\\n * @return _nonce Nonce of the current contract.\\n */\\n function ovmGETNONCE()\\n override\\n public\\n returns (\\n uint256 _nonce\\n )\\n {\\n return _getAccountNonce(ovmADDRESS());\\n }\\n\\n /**\\n * Bumps the nonce of the current ovmADDRESS by one.\\n */\\n function ovmINCREMENTNONCE()\\n override\\n public\\n notStatic\\n {\\n address account = ovmADDRESS();\\n uint256 nonce = _getAccountNonce(account);\\n\\n // Prevent overflow.\\n if (nonce + 1 > nonce) {\\n _setAccountNonce(account, nonce + 1);\\n }\\n }\\n\\n /**\\n * Creates a new EOA contract account, for account abstraction.\\n * @dev Essentially functions like ovmCREATE or ovmCREATE2, but we can bypass a lot of checks\\n * because the contract we're creating is trusted (no need to do safety checking or to\\n * handle unexpected reverts). Doesn't need to return an address because the address is\\n * assumed to be the user's actual address.\\n * @param _messageHash Hash of a message signed by some user, for verification.\\n * @param _v Signature `v` parameter.\\n * @param _r Signature `r` parameter.\\n * @param _s Signature `s` parameter.\\n */\\n function ovmCREATEEOA(\\n bytes32 _messageHash,\\n uint8 _v,\\n bytes32 _r,\\n bytes32 _s\\n )\\n override\\n public\\n notStatic\\n {\\n // Recover the EOA address from the message hash and signature parameters. Since we do the\\n // hashing in advance, we don't have handle different message hashing schemes. Even if this\\n // function were to return the wrong address (rather than explicitly returning the zero\\n // address), the rest of the transaction would simply fail (since there's no EOA account to\\n // actually execute the transaction).\\n address eoa = ecrecover(\\n _messageHash,\\n _v + 27,\\n _r,\\n _s\\n );\\n\\n // Invalid signature is a case we proactively handle with a revert. We could alternatively\\n // have this function return a `success` boolean, but this is just easier.\\n if (eoa == address(0)) {\\n ovmREVERT(bytes(\\\"Signature provided for EOA contract creation is invalid.\\\"));\\n }\\n\\n // If the user already has an EOA account, then there's no need to perform this operation.\\n if (_hasEmptyAccount(eoa) == false) {\\n return;\\n }\\n\\n // We always need to initialize the contract with the default account values.\\n _initPendingAccount(eoa);\\n\\n // Temporarily set the current address so it's easier to access on L2.\\n address prevADDRESS = messageContext.ovmADDRESS;\\n messageContext.ovmADDRESS = eoa;\\n\\n // Now actually create the account and get its bytecode. We're not worried about reverts\\n // (other than out of gas, which we can't capture anyway) because this contract is trusted.\\n OVM_ProxyEOA proxyEOA = new OVM_ProxyEOA(0x4200000000000000000000000000000000000003);\\n\\n // Reset the address now that we're done deploying.\\n messageContext.ovmADDRESS = prevADDRESS;\\n\\n // Commit the account with its final values.\\n _commitPendingAccount(\\n eoa,\\n address(proxyEOA),\\n keccak256(Lib_EthUtils.getCode(address(proxyEOA)))\\n );\\n\\n _setAccountNonce(eoa, 0);\\n }\\n\\n\\n /*********************************\\n * Opcodes: Contract Interaction *\\n *********************************/\\n\\n /**\\n * @notice Overrides CALL.\\n * @param _gasLimit Amount of gas to be passed into this call.\\n * @param _address Address of the contract to call.\\n * @param _calldata Data to send along with the call.\\n * @return _success Whether or not the call returned (rather than reverted).\\n * @return _returndata Data returned by the call.\\n */\\n function ovmCALL(\\n uint256 _gasLimit,\\n address _address,\\n bytes memory _calldata\\n )\\n override\\n public\\n fixedGasDiscount(100000)\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n // CALL updates the CALLER and ADDRESS.\\n MessageContext memory nextMessageContext = messageContext;\\n nextMessageContext.ovmCALLER = nextMessageContext.ovmADDRESS;\\n nextMessageContext.ovmADDRESS = _address;\\n\\n return _callContract(\\n nextMessageContext,\\n _gasLimit,\\n _address,\\n _calldata\\n );\\n }\\n\\n /**\\n * @notice Overrides STATICCALL.\\n * @param _gasLimit Amount of gas to be passed into this call.\\n * @param _address Address of the contract to call.\\n * @param _calldata Data to send along with the call.\\n * @return _success Whether or not the call returned (rather than reverted).\\n * @return _returndata Data returned by the call.\\n */\\n function ovmSTATICCALL(\\n uint256 _gasLimit,\\n address _address,\\n bytes memory _calldata\\n )\\n override\\n public\\n fixedGasDiscount(80000)\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n // STATICCALL updates the CALLER, updates the ADDRESS, and runs in a static context.\\n MessageContext memory nextMessageContext = messageContext;\\n nextMessageContext.ovmCALLER = nextMessageContext.ovmADDRESS;\\n nextMessageContext.ovmADDRESS = _address;\\n nextMessageContext.isStatic = true;\\n\\n return _callContract(\\n nextMessageContext,\\n _gasLimit,\\n _address,\\n _calldata\\n );\\n }\\n\\n /**\\n * @notice Overrides DELEGATECALL.\\n * @param _gasLimit Amount of gas to be passed into this call.\\n * @param _address Address of the contract to call.\\n * @param _calldata Data to send along with the call.\\n * @return _success Whether or not the call returned (rather than reverted).\\n * @return _returndata Data returned by the call.\\n */\\n function ovmDELEGATECALL(\\n uint256 _gasLimit,\\n address _address,\\n bytes memory _calldata\\n )\\n override\\n public\\n fixedGasDiscount(40000)\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n // DELEGATECALL does not change anything about the message context.\\n MessageContext memory nextMessageContext = messageContext;\\n\\n return _callContract(\\n nextMessageContext,\\n _gasLimit,\\n _address,\\n _calldata\\n );\\n }\\n\\n\\n /************************************\\n * Opcodes: Contract Storage Access *\\n ************************************/\\n\\n /**\\n * @notice Overrides SLOAD.\\n * @param _key 32 byte key of the storage slot to load.\\n * @return _value 32 byte value of the requested storage slot.\\n */\\n function ovmSLOAD(\\n bytes32 _key\\n )\\n override\\n public\\n netGasCost(40000)\\n returns (\\n bytes32 _value\\n )\\n {\\n // We always SLOAD from the storage of ADDRESS.\\n address contractAddress = ovmADDRESS();\\n\\n return _getContractStorage(\\n contractAddress,\\n _key\\n );\\n }\\n\\n /**\\n * @notice Overrides SSTORE.\\n * @param _key 32 byte key of the storage slot to set.\\n * @param _value 32 byte value for the storage slot.\\n */\\n function ovmSSTORE(\\n bytes32 _key,\\n bytes32 _value\\n )\\n override\\n public\\n notStatic\\n netGasCost(60000)\\n {\\n // We always SSTORE to the storage of ADDRESS.\\n address contractAddress = ovmADDRESS();\\n\\n _putContractStorage(\\n contractAddress,\\n _key,\\n _value\\n );\\n }\\n\\n\\n /*********************************\\n * Opcodes: Contract Code Access *\\n *********************************/\\n\\n /**\\n * @notice Overrides EXTCODECOPY.\\n * @param _contract Address of the contract to copy code from.\\n * @param _offset Offset in bytes from the start of contract code to copy beyond.\\n * @param _length Total number of bytes to copy from the contract's code.\\n * @return _code Bytes of code copied from the requested contract.\\n */\\n function ovmEXTCODECOPY(\\n address _contract,\\n uint256 _offset,\\n uint256 _length\\n )\\n override\\n public\\n returns (\\n bytes memory _code\\n )\\n {\\n // `ovmEXTCODECOPY` is the only overridden opcode capable of producing exactly one byte of\\n // return data. By blocking reads of one byte, we're able to use the condition that an\\n // OVM_ExecutionManager function return value having a length of exactly one byte indicates\\n // an error without an explicit revert. If users were able to read a single byte, they\\n // could forcibly trigger behavior that should only be available to this contract.\\n uint256 length = _length == 1 ? 2 : _length;\\n\\n return Lib_EthUtils.getCode(\\n _getAccountEthAddress(_contract),\\n _offset,\\n length\\n );\\n }\\n\\n /**\\n * @notice Overrides EXTCODESIZE.\\n * @param _contract Address of the contract to query the size of.\\n * @return _EXTCODESIZE Size of the requested contract in bytes.\\n */\\n function ovmEXTCODESIZE(\\n address _contract\\n )\\n override\\n public\\n returns (\\n uint256 _EXTCODESIZE\\n )\\n {\\n return Lib_EthUtils.getCodeSize(\\n _getAccountEthAddress(_contract)\\n );\\n }\\n\\n /**\\n * @notice Overrides EXTCODEHASH.\\n * @param _contract Address of the contract to query the hash of.\\n * @return _EXTCODEHASH Hash of the requested contract.\\n */\\n function ovmEXTCODEHASH(\\n address _contract\\n )\\n override\\n public\\n returns (\\n bytes32 _EXTCODEHASH\\n )\\n {\\n return Lib_EthUtils.getCodeHash(\\n _getAccountEthAddress(_contract)\\n );\\n }\\n\\n /***************************************\\n * Public Functions: Execution Context *\\n ***************************************/\\n\\n function getMaxTransactionGasLimit()\\n external\\n view\\n override\\n returns (\\n uint256 _maxTransactionGasLimit\\n )\\n {\\n return gasMeterConfig.maxTransactionGasLimit;\\n }\\n\\n /********************************************\\n * Public Functions: Deployment Whitelisting *\\n ********************************************/\\n\\n /**\\n * Checks whether the given address is on the whitelist to ovmCREATE/ovmCREATE2, and reverts if not.\\n * @param _deployerAddress Address attempting to deploy a contract.\\n */\\n function _checkDeployerAllowed(\\n address _deployerAddress\\n )\\n internal\\n {\\n // From an OVM semantics perspective, this will appear identical to\\n // the deployer ovmCALLing the whitelist. This is fine--in a sense, we are forcing them to.\\n (bool success, bytes memory data) = ovmCALL(\\n gasleft(),\\n 0x4200000000000000000000000000000000000002,\\n abi.encodeWithSignature(\\\"isDeployerAllowed(address)\\\", _deployerAddress)\\n );\\n bool isAllowed = abi.decode(data, (bool));\\n\\n if (!isAllowed || !success) {\\n _revertWithFlag(RevertFlag.CREATOR_NOT_ALLOWED);\\n }\\n }\\n\\n /********************************************\\n * Internal Functions: Contract Interaction *\\n ********************************************/\\n\\n /**\\n * Creates a new contract and associates it with some contract address.\\n * @param _contractAddress Address to associate the created contract with.\\n * @param _bytecode Bytecode to be used to create the contract.\\n * @return Final OVM contract address.\\n * @return Revertdata, if and only if the creation threw an exception.\\n */\\n function _createContract(\\n address _contractAddress,\\n bytes memory _bytecode\\n )\\n internal\\n returns (\\n address,\\n bytes memory\\n )\\n {\\n // We always update the nonce of the creating account, even if the creation fails.\\n _setAccountNonce(ovmADDRESS(), _getAccountNonce(ovmADDRESS()) + 1);\\n\\n // We're stepping into a CREATE or CREATE2, so we need to update ADDRESS to point\\n // to the contract's associated address and CALLER to point to the previous ADDRESS.\\n MessageContext memory nextMessageContext = messageContext;\\n nextMessageContext.ovmCALLER = messageContext.ovmADDRESS;\\n nextMessageContext.ovmADDRESS = _contractAddress;\\n\\n // Run the common logic which occurs between call-type and create-type messages,\\n // passing in the creation bytecode and `true` to trigger create-specific logic.\\n (bool success, bytes memory data) = _handleExternalMessage(\\n nextMessageContext,\\n gasleft(),\\n _contractAddress,\\n _bytecode,\\n true\\n );\\n\\n // Yellow paper requires that address returned is zero if the contract deployment fails.\\n return (\\n success ? _contractAddress : address(0),\\n data\\n );\\n }\\n\\n /**\\n * Calls the deployed contract associated with a given address.\\n * @param _nextMessageContext Message context to be used for the call.\\n * @param _gasLimit Amount of gas to be passed into this call.\\n * @param _contract OVM address to be called.\\n * @param _calldata Data to send along with the call.\\n * @return _success Whether or not the call returned (rather than reverted).\\n * @return _returndata Data returned by the call.\\n */\\n function _callContract(\\n MessageContext memory _nextMessageContext,\\n uint256 _gasLimit,\\n address _contract,\\n bytes memory _calldata\\n )\\n internal\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n // We reserve addresses of the form 0xdeaddeaddead...NNNN for the container contracts in L2 geth.\\n // So, we block calls to these addresses since they are not safe to run as an OVM contract itself.\\n if (\\n (uint256(_contract) & uint256(0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000))\\n == uint256(0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000)\\n ) {\\n // EVM does not return data in the success case, see: https://github.com/ethereum/go-ethereum/blob/aae7660410f0ef90279e14afaaf2f429fdc2a186/core/vm/instructions.go#L600-L604\\n return (true, hex'');\\n }\\n\\n // Both 0x0000... and the EVM precompiles have the same address on L1 and L2 --> no trie lookup needed.\\n address codeContractAddress =\\n uint(_contract) < 100\\n ? _contract\\n : _getAccountEthAddress(_contract);\\n\\n return _handleExternalMessage(\\n _nextMessageContext,\\n _gasLimit,\\n codeContractAddress,\\n _calldata,\\n false\\n );\\n }\\n\\n /**\\n * Handles all interactions which involve the execution manager calling out to untrusted code (both calls and creates).\\n * Ensures that OVM-related measures are enforced, including L2 gas refunds, nuisance gas, and flagged reversions.\\n *\\n * @param _nextMessageContext Message context to be used for the external message.\\n * @param _gasLimit Amount of gas to be passed into this message.\\n * @param _contract OVM address being called or deployed to\\n * @param _data Data for the message (either calldata or creation code)\\n * @param _isCreate Whether this is a create-type message.\\n * @return Whether or not the message (either a call or deployment) succeeded.\\n * @return Data returned by the message.\\n */\\n function _handleExternalMessage(\\n MessageContext memory _nextMessageContext,\\n uint256 _gasLimit,\\n address _contract,\\n bytes memory _data,\\n bool _isCreate\\n )\\n internal\\n returns (\\n bool,\\n bytes memory\\n )\\n {\\n // We need to switch over to our next message context for the duration of this call.\\n MessageContext memory prevMessageContext = messageContext;\\n _switchMessageContext(prevMessageContext, _nextMessageContext);\\n\\n // Nuisance gas is a system used to bound the ability for an attacker to make fraud proofs\\n // expensive by touching a lot of different accounts or storage slots. Since most contracts\\n // only use a few storage slots during any given transaction, this shouldn't be a limiting\\n // factor.\\n uint256 prevNuisanceGasLeft = messageRecord.nuisanceGasLeft;\\n uint256 nuisanceGasLimit = _getNuisanceGasLimit(_gasLimit);\\n messageRecord.nuisanceGasLeft = nuisanceGasLimit;\\n\\n // Make the call and make sure to pass in the gas limit. Another instance of hidden\\n // complexity. `_contract` is guaranteed to be a safe contract, meaning its return/revert\\n // behavior can be controlled. In particular, we enforce that flags are passed through\\n // revert data as to retrieve execution metadata that would normally be reverted out of\\n // existence.\\n\\n bool success; \\n bytes memory returndata;\\n\\n if (_isCreate) {\\n // safeCREATE() is a function which replicates a CREATE message, but uses return values\\n // Which match that of CALL (i.e. bool, bytes). This allows many security checks to be\\n // to be shared between untrusted call and create call frames.\\n (success, returndata) = address(this).call(\\n abi.encodeWithSelector(\\n this.safeCREATE.selector,\\n _gasLimit,\\n _data,\\n _contract\\n )\\n );\\n } else {\\n (success, returndata) = _contract.call{gas: _gasLimit}(_data);\\n }\\n\\n // Switch back to the original message context now that we're out of the call.\\n _switchMessageContext(_nextMessageContext, prevMessageContext);\\n\\n // Assuming there were no reverts, the message record should be accurate here. We'll update\\n // this value in the case of a revert.\\n uint256 nuisanceGasLeft = messageRecord.nuisanceGasLeft;\\n\\n // Reverts at this point are completely OK, but we need to make a few updates based on the\\n // information passed through the revert.\\n if (success == false) {\\n (\\n RevertFlag flag,\\n uint256 nuisanceGasLeftPostRevert,\\n uint256 ovmGasRefund,\\n bytes memory returndataFromFlag\\n ) = _decodeRevertData(returndata);\\n\\n // INVALID_STATE_ACCESS is the only flag that triggers an immediate abort of the\\n // parent EVM message. This behavior is necessary because INVALID_STATE_ACCESS must\\n // halt any further transaction execution that could impact the execution result.\\n if (flag == RevertFlag.INVALID_STATE_ACCESS) {\\n _revertWithFlag(flag);\\n }\\n\\n // INTENTIONAL_REVERT, UNSAFE_BYTECODE, STATIC_VIOLATION, and CREATOR_NOT_ALLOWED aren't\\n // dependent on the input state, so we can just handle them like standard reverts. Our only change here\\n // is to record the gas refund reported by the call (enforced by safety checking).\\n if (\\n flag == RevertFlag.INTENTIONAL_REVERT\\n || flag == RevertFlag.UNSAFE_BYTECODE\\n || flag == RevertFlag.STATIC_VIOLATION\\n || flag == RevertFlag.CREATOR_NOT_ALLOWED\\n ) {\\n transactionRecord.ovmGasRefund = ovmGasRefund;\\n }\\n\\n // INTENTIONAL_REVERT needs to pass up the user-provided return data encoded into the\\n // flag, *not* the full encoded flag. All other revert types return no data.\\n if (\\n flag == RevertFlag.INTENTIONAL_REVERT\\n || _isCreate\\n ) {\\n returndata = returndataFromFlag;\\n } else {\\n returndata = hex'';\\n }\\n\\n // Reverts mean we need to use up whatever \\\"nuisance gas\\\" was used by the call.\\n // EXCEEDS_NUISANCE_GAS explicitly reduces the remaining nuisance gas for this message\\n // to zero. OUT_OF_GAS is a \\\"pseudo\\\" flag given that messages return no data when they\\n // run out of gas, so we have to treat this like EXCEEDS_NUISANCE_GAS. All other flags\\n // will simply pass up the remaining nuisance gas.\\n nuisanceGasLeft = nuisanceGasLeftPostRevert;\\n }\\n\\n // We need to reset the nuisance gas back to its original value minus the amount used here.\\n messageRecord.nuisanceGasLeft = prevNuisanceGasLeft - (nuisanceGasLimit - nuisanceGasLeft);\\n\\n return (\\n success,\\n returndata\\n );\\n }\\n\\n /**\\n * Handles the creation-specific safety measures required for OVM contract deployment.\\n * This function sanitizes the return types for creation messages to match calls (bool, bytes),\\n * by being an external function which the EM can call, that mimics the success/fail case of the CREATE.\\n * This allows for consistent handling of both types of messages in _handleExternalMessage().\\n * Having this step occur as a separate call frame also allows us to easily revert the \\n * contract deployment in the event that the code is unsafe.\\n * \\n * @param _gasLimit Amount of gas to be passed into this creation.\\n * @param _creationCode Code to pass into CREATE for deployment.\\n * @param _address OVM address being deployed to.\\n */\\n function safeCREATE(\\n uint _gasLimit,\\n bytes memory _creationCode,\\n address _address\\n )\\n external\\n {\\n // The only way this should callable is from within _createContract(),\\n // and it should DEFINITELY not be callable by a non-EM code contract.\\n if (msg.sender != address(this)) {\\n return;\\n }\\n // Check that there is not already code at this address.\\n if (_hasEmptyAccount(_address) == false) {\\n // Note: in the EVM, this case burns all allotted gas. For improved\\n // developer experience, we do return the remaining gas.\\n _revertWithFlag(\\n RevertFlag.CREATE_COLLISION,\\n Lib_ErrorUtils.encodeRevertString(\\\"A contract has already been deployed to this address\\\")\\n );\\n }\\n\\n // Check the creation bytecode against the OVM_SafetyChecker.\\n if (ovmSafetyChecker.isBytecodeSafe(_creationCode) == false) {\\n _revertWithFlag(\\n RevertFlag.UNSAFE_BYTECODE,\\n Lib_ErrorUtils.encodeRevertString(\\\"Contract creation code contains unsafe opcodes. Did you use the right compiler or pass an unsafe constructor argument?\\\")\\n );\\n }\\n\\n // We always need to initialize the contract with the default account values.\\n _initPendingAccount(_address);\\n\\n // Actually execute the EVM create message.\\n // NOTE: The inline assembly below means we can NOT make any evm calls between here and then.\\n address ethAddress = Lib_EthUtils.createContract(_creationCode);\\n\\n if (ethAddress == address(0)) {\\n // If the creation fails, the EVM lets us grab its revert data. This may contain a revert flag\\n // to be used above in _handleExternalMessage, so we pass the revert data back up unmodified.\\n assembly { \\n returndatacopy(0,0,returndatasize())\\n revert(0, returndatasize())\\n }\\n }\\n\\n // Again simply checking that the deployed code is safe too. Contracts can generate\\n // arbitrary deployment code, so there's no easy way to analyze this beforehand.\\n bytes memory deployedCode = Lib_EthUtils.getCode(ethAddress);\\n if (ovmSafetyChecker.isBytecodeSafe(deployedCode) == false) {\\n _revertWithFlag(\\n RevertFlag.UNSAFE_BYTECODE,\\n Lib_ErrorUtils.encodeRevertString(\\\"Constructor attempted to deploy unsafe bytecode.\\\")\\n );\\n }\\n\\n // Contract creation didn't need to be reverted and the bytecode is safe. We finish up by\\n // associating the desired address with the newly created contract's code hash and address.\\n _commitPendingAccount(\\n _address,\\n ethAddress,\\n Lib_EthUtils.getCodeHash(ethAddress)\\n );\\n }\\n\\n /******************************************\\n * Internal Functions: State Manipulation *\\n ******************************************/\\n\\n /**\\n * Checks whether an account exists within the OVM_StateManager.\\n * @param _address Address of the account to check.\\n * @return _exists Whether or not the account exists.\\n */\\n function _hasAccount(\\n address _address\\n )\\n internal\\n returns (\\n bool _exists\\n )\\n {\\n _checkAccountLoad(_address);\\n return ovmStateManager.hasAccount(_address);\\n }\\n\\n /**\\n * Checks whether a known empty account exists within the OVM_StateManager.\\n * @param _address Address of the account to check.\\n * @return _exists Whether or not the account empty exists.\\n */\\n function _hasEmptyAccount(\\n address _address\\n )\\n internal\\n returns (\\n bool _exists\\n )\\n {\\n _checkAccountLoad(_address);\\n return ovmStateManager.hasEmptyAccount(_address);\\n }\\n\\n /**\\n * Sets the nonce of an account.\\n * @param _address Address of the account to modify.\\n * @param _nonce New account nonce.\\n */\\n function _setAccountNonce(\\n address _address,\\n uint256 _nonce\\n )\\n internal\\n {\\n _checkAccountChange(_address);\\n ovmStateManager.setAccountNonce(_address, _nonce);\\n }\\n\\n /**\\n * Gets the nonce of an account.\\n * @param _address Address of the account to access.\\n * @return _nonce Nonce of the account.\\n */\\n function _getAccountNonce(\\n address _address\\n )\\n internal\\n returns (\\n uint256 _nonce\\n )\\n {\\n _checkAccountLoad(_address);\\n return ovmStateManager.getAccountNonce(_address);\\n }\\n\\n /**\\n * Retrieves the Ethereum address of an account.\\n * @param _address Address of the account to access.\\n * @return _ethAddress Corresponding Ethereum address.\\n */\\n function _getAccountEthAddress(\\n address _address\\n )\\n internal\\n returns (\\n address _ethAddress\\n )\\n {\\n _checkAccountLoad(_address);\\n return ovmStateManager.getAccountEthAddress(_address);\\n }\\n\\n /**\\n * Creates the default account object for the given address.\\n * @param _address Address of the account create.\\n */\\n function _initPendingAccount(\\n address _address\\n )\\n internal\\n {\\n // Although it seems like `_checkAccountChange` would be more appropriate here, we don't\\n // actually consider an account \\\"changed\\\" until it's inserted into the state (in this case\\n // by `_commitPendingAccount`).\\n _checkAccountLoad(_address);\\n ovmStateManager.initPendingAccount(_address);\\n }\\n\\n /**\\n * Stores additional relevant data for a new account, thereby \\\"committing\\\" it to the state.\\n * This function is only called during `ovmCREATE` and `ovmCREATE2` after a successful contract\\n * creation.\\n * @param _address Address of the account to commit.\\n * @param _ethAddress Address of the associated deployed contract.\\n * @param _codeHash Hash of the code stored at the address.\\n */\\n function _commitPendingAccount(\\n address _address,\\n address _ethAddress,\\n bytes32 _codeHash\\n )\\n internal\\n {\\n _checkAccountChange(_address);\\n ovmStateManager.commitPendingAccount(\\n _address,\\n _ethAddress,\\n _codeHash\\n );\\n }\\n\\n /**\\n * Retrieves the value of a storage slot.\\n * @param _contract Address of the contract to query.\\n * @param _key 32 byte key of the storage slot.\\n * @return _value 32 byte storage slot value.\\n */\\n function _getContractStorage(\\n address _contract,\\n bytes32 _key\\n )\\n internal\\n returns (\\n bytes32 _value\\n )\\n {\\n _checkContractStorageLoad(_contract, _key);\\n return ovmStateManager.getContractStorage(_contract, _key);\\n }\\n\\n /**\\n * Sets the value of a storage slot.\\n * @param _contract Address of the contract to modify.\\n * @param _key 32 byte key of the storage slot.\\n * @param _value 32 byte storage slot value.\\n */\\n function _putContractStorage(\\n address _contract,\\n bytes32 _key,\\n bytes32 _value\\n )\\n internal\\n {\\n // We don't set storage if the value didn't change. Although this acts as a convenient\\n // optimization, it's also necessary to avoid the case in which a contract with no storage\\n // attempts to store the value \\\"0\\\" at any key. Putting this value (and therefore requiring\\n // that the value be committed into the storage trie after execution) would incorrectly\\n // modify the storage root.\\n if (_getContractStorage(_contract, _key) == _value) {\\n return;\\n }\\n\\n _checkContractStorageChange(_contract, _key);\\n ovmStateManager.putContractStorage(_contract, _key, _value);\\n }\\n\\n /**\\n * Validation whenever a contract needs to be loaded. Checks that the account exists, charges\\n * nuisance gas if the account hasn't been loaded before.\\n * @param _address Address of the account to load.\\n */\\n function _checkAccountLoad(\\n address _address\\n )\\n internal\\n {\\n // See `_checkContractStorageLoad` for more information.\\n if (gasleft() < MIN_GAS_FOR_INVALID_STATE_ACCESS) {\\n _revertWithFlag(RevertFlag.OUT_OF_GAS);\\n }\\n\\n // See `_checkContractStorageLoad` for more information.\\n if (ovmStateManager.hasAccount(_address) == false) {\\n _revertWithFlag(RevertFlag.INVALID_STATE_ACCESS);\\n }\\n\\n // Check whether the account has been loaded before and mark it as loaded if not. We need\\n // this because \\\"nuisance gas\\\" only applies to the first time that an account is loaded.\\n (\\n bool _wasAccountAlreadyLoaded\\n ) = ovmStateManager.testAndSetAccountLoaded(_address);\\n\\n // If we hadn't already loaded the account, then we'll need to charge \\\"nuisance gas\\\" based\\n // on the size of the contract code.\\n if (_wasAccountAlreadyLoaded == false) {\\n _useNuisanceGas(\\n (Lib_EthUtils.getCodeSize(_getAccountEthAddress(_address)) * NUISANCE_GAS_PER_CONTRACT_BYTE) + MIN_NUISANCE_GAS_PER_CONTRACT\\n );\\n }\\n }\\n\\n /**\\n * Validation whenever a contract needs to be changed. Checks that the account exists, charges\\n * nuisance gas if the account hasn't been changed before.\\n * @param _address Address of the account to change.\\n */\\n function _checkAccountChange(\\n address _address\\n )\\n internal\\n {\\n // Start by checking for a load as we only want to charge nuisance gas proportional to\\n // contract size once.\\n _checkAccountLoad(_address);\\n\\n // Check whether the account has been changed before and mark it as changed if not. We need\\n // this because \\\"nuisance gas\\\" only applies to the first time that an account is changed.\\n (\\n bool _wasAccountAlreadyChanged\\n ) = ovmStateManager.testAndSetAccountChanged(_address);\\n\\n // If we hadn't already loaded the account, then we'll need to charge \\\"nuisance gas\\\" based\\n // on the size of the contract code.\\n if (_wasAccountAlreadyChanged == false) {\\n ovmStateManager.incrementTotalUncommittedAccounts();\\n _useNuisanceGas(\\n (Lib_EthUtils.getCodeSize(_getAccountEthAddress(_address)) * NUISANCE_GAS_PER_CONTRACT_BYTE) + MIN_NUISANCE_GAS_PER_CONTRACT\\n );\\n }\\n }\\n\\n /**\\n * Validation whenever a slot needs to be loaded. Checks that the account exists, charges\\n * nuisance gas if the slot hasn't been loaded before.\\n * @param _contract Address of the account to load from.\\n * @param _key 32 byte key to load.\\n */\\n function _checkContractStorageLoad(\\n address _contract,\\n bytes32 _key\\n )\\n internal\\n {\\n // Another case of hidden complexity. If we didn't enforce this requirement, then a\\n // contract could pass in just enough gas to cause the INVALID_STATE_ACCESS check to fail\\n // on L1 but not on L2. A contract could use this behavior to prevent the\\n // OVM_ExecutionManager from detecting an invalid state access. Reverting with OUT_OF_GAS\\n // allows us to also charge for the full message nuisance gas, because you deserve that for\\n // trying to break the contract in this way.\\n if (gasleft() < MIN_GAS_FOR_INVALID_STATE_ACCESS) {\\n _revertWithFlag(RevertFlag.OUT_OF_GAS);\\n }\\n\\n // We need to make sure that the transaction isn't trying to access storage that hasn't\\n // been provided to the OVM_StateManager. We'll immediately abort if this is the case.\\n // We know that we have enough gas to do this check because of the above test.\\n if (ovmStateManager.hasContractStorage(_contract, _key) == false) {\\n _revertWithFlag(RevertFlag.INVALID_STATE_ACCESS);\\n }\\n\\n // Check whether the slot has been loaded before and mark it as loaded if not. We need\\n // this because \\\"nuisance gas\\\" only applies to the first time that a slot is loaded.\\n (\\n bool _wasContractStorageAlreadyLoaded\\n ) = ovmStateManager.testAndSetContractStorageLoaded(_contract, _key);\\n\\n // If we hadn't already loaded the account, then we'll need to charge some fixed amount of\\n // \\\"nuisance gas\\\".\\n if (_wasContractStorageAlreadyLoaded == false) {\\n _useNuisanceGas(NUISANCE_GAS_SLOAD);\\n }\\n }\\n\\n /**\\n * Validation whenever a slot needs to be changed. Checks that the account exists, charges\\n * nuisance gas if the slot hasn't been changed before.\\n * @param _contract Address of the account to change.\\n * @param _key 32 byte key to change.\\n */\\n function _checkContractStorageChange(\\n address _contract,\\n bytes32 _key\\n )\\n internal\\n {\\n // Start by checking for load to make sure we have the storage slot and that we charge the\\n // \\\"nuisance gas\\\" necessary to prove the storage slot state.\\n _checkContractStorageLoad(_contract, _key);\\n\\n // Check whether the slot has been changed before and mark it as changed if not. We need\\n // this because \\\"nuisance gas\\\" only applies to the first time that a slot is changed.\\n (\\n bool _wasContractStorageAlreadyChanged\\n ) = ovmStateManager.testAndSetContractStorageChanged(_contract, _key);\\n\\n // If we hadn't already changed the account, then we'll need to charge some fixed amount of\\n // \\\"nuisance gas\\\".\\n if (_wasContractStorageAlreadyChanged == false) {\\n // Changing a storage slot means that we're also going to have to change the\\n // corresponding account, so do an account change check.\\n _checkAccountChange(_contract);\\n\\n ovmStateManager.incrementTotalUncommittedContractStorage();\\n _useNuisanceGas(NUISANCE_GAS_SSTORE);\\n }\\n }\\n\\n\\n /************************************\\n * Internal Functions: Revert Logic *\\n ************************************/\\n\\n /**\\n * Simple encoding for revert data.\\n * @param _flag Flag to revert with.\\n * @param _data Additional user-provided revert data.\\n * @return _revertdata Encoded revert data.\\n */\\n function _encodeRevertData(\\n RevertFlag _flag,\\n bytes memory _data\\n )\\n internal\\n view\\n returns (\\n bytes memory _revertdata\\n )\\n {\\n // Out of gas and create exceptions will fundamentally return no data, so simulating it shouldn't either.\\n if (\\n _flag == RevertFlag.OUT_OF_GAS\\n ) {\\n return bytes('');\\n }\\n\\n // INVALID_STATE_ACCESS doesn't need to return any data other than the flag.\\n if (_flag == RevertFlag.INVALID_STATE_ACCESS) {\\n return abi.encode(\\n _flag,\\n 0,\\n 0,\\n bytes('')\\n );\\n }\\n\\n // Just ABI encode the rest of the parameters.\\n return abi.encode(\\n _flag,\\n messageRecord.nuisanceGasLeft,\\n transactionRecord.ovmGasRefund,\\n _data\\n );\\n }\\n\\n /**\\n * Simple decoding for revert data.\\n * @param _revertdata Revert data to decode.\\n * @return _flag Flag used to revert.\\n * @return _nuisanceGasLeft Amount of nuisance gas unused by the message.\\n * @return _ovmGasRefund Amount of gas refunded during the message.\\n * @return _data Additional user-provided revert data.\\n */\\n function _decodeRevertData(\\n bytes memory _revertdata\\n )\\n internal\\n pure\\n returns (\\n RevertFlag _flag,\\n uint256 _nuisanceGasLeft,\\n uint256 _ovmGasRefund,\\n bytes memory _data\\n )\\n {\\n // A length of zero means the call ran out of gas, just return empty data.\\n if (_revertdata.length == 0) {\\n return (\\n RevertFlag.OUT_OF_GAS,\\n 0,\\n 0,\\n bytes('')\\n );\\n }\\n\\n // ABI decode the incoming data.\\n return abi.decode(_revertdata, (RevertFlag, uint256, uint256, bytes));\\n }\\n\\n /**\\n * Causes a message to revert or abort.\\n * @param _flag Flag to revert with.\\n * @param _data Additional user-provided data.\\n */\\n function _revertWithFlag(\\n RevertFlag _flag,\\n bytes memory _data\\n )\\n internal\\n view\\n {\\n bytes memory revertdata = _encodeRevertData(\\n _flag,\\n _data\\n );\\n\\n assembly {\\n revert(add(revertdata, 0x20), mload(revertdata))\\n }\\n }\\n\\n /**\\n * Causes a message to revert or abort.\\n * @param _flag Flag to revert with.\\n */\\n function _revertWithFlag(\\n RevertFlag _flag\\n )\\n internal\\n {\\n _revertWithFlag(_flag, bytes(''));\\n }\\n\\n\\n /******************************************\\n * Internal Functions: Nuisance Gas Logic *\\n ******************************************/\\n\\n /**\\n * Computes the nuisance gas limit from the gas limit.\\n * @dev This function is currently using a naive implementation whereby the nuisance gas limit\\n * is set to exactly equal the lesser of the gas limit or remaining gas. It's likely that\\n * this implementation is perfectly fine, but we may change this formula later.\\n * @param _gasLimit Gas limit to compute from.\\n * @return _nuisanceGasLimit Computed nuisance gas limit.\\n */\\n function _getNuisanceGasLimit(\\n uint256 _gasLimit\\n )\\n internal\\n view\\n returns (\\n uint256 _nuisanceGasLimit\\n )\\n {\\n return _gasLimit < gasleft() ? _gasLimit : gasleft();\\n }\\n\\n /**\\n * Uses a certain amount of nuisance gas.\\n * @param _amount Amount of nuisance gas to use.\\n */\\n function _useNuisanceGas(\\n uint256 _amount\\n )\\n internal\\n {\\n // Essentially the same as a standard OUT_OF_GAS, except we also retain a record of the gas\\n // refund to be given at the end of the transaction.\\n if (messageRecord.nuisanceGasLeft < _amount) {\\n _revertWithFlag(RevertFlag.EXCEEDS_NUISANCE_GAS);\\n }\\n\\n messageRecord.nuisanceGasLeft -= _amount;\\n }\\n\\n\\n /************************************\\n * Internal Functions: Gas Metering *\\n ************************************/\\n\\n /**\\n * Checks whether a transaction needs to start a new epoch and does so if necessary.\\n * @param _timestamp Transaction timestamp.\\n */\\n function _checkNeedsNewEpoch(\\n uint256 _timestamp\\n )\\n internal\\n {\\n if (\\n _timestamp >= (\\n _getGasMetadata(GasMetadataKey.CURRENT_EPOCH_START_TIMESTAMP)\\n + gasMeterConfig.secondsPerEpoch\\n )\\n ) {\\n _putGasMetadata(\\n GasMetadataKey.CURRENT_EPOCH_START_TIMESTAMP,\\n _timestamp\\n );\\n\\n _putGasMetadata(\\n GasMetadataKey.PREV_EPOCH_SEQUENCER_QUEUE_GAS,\\n _getGasMetadata(\\n GasMetadataKey.CUMULATIVE_SEQUENCER_QUEUE_GAS\\n )\\n );\\n\\n _putGasMetadata(\\n GasMetadataKey.PREV_EPOCH_L1TOL2_QUEUE_GAS,\\n _getGasMetadata(\\n GasMetadataKey.CUMULATIVE_L1TOL2_QUEUE_GAS\\n )\\n );\\n }\\n }\\n\\n /**\\n * Validates the input values of a transaction.\\n * @return _valid Whether or not the transaction data is valid.\\n */\\n function _isValidInput(\\n Lib_OVMCodec.Transaction memory _transaction\\n )\\n view\\n internal\\n returns (\\n bool\\n )\\n {\\n // Prevent reentrancy to run():\\n // This check prevents calling run with the default ovmNumber.\\n // Combined with the first check in run():\\n // if (transactionContext.ovmNUMBER != DEFAULT_UINT256) { return; }\\n // It should be impossible to re-enter since run() returns before any other call frames are created.\\n // Since this value is already being written to storage, we save much gas compared to\\n // using the standard nonReentrant pattern.\\n if (_transaction.blockNumber == DEFAULT_UINT256) {\\n return false;\\n }\\n\\n if (_isValidGasLimit(_transaction.gasLimit, _transaction.l1QueueOrigin) == false) {\\n return false;\\n }\\n\\n return true;\\n }\\n\\n /**\\n * Validates the gas limit for a given transaction.\\n * @param _gasLimit Gas limit provided by the transaction.\\n * param _queueOrigin Queue from which the transaction originated.\\n * @return _valid Whether or not the gas limit is valid.\\n */\\n function _isValidGasLimit(\\n uint256 _gasLimit,\\n Lib_OVMCodec.QueueOrigin // _queueOrigin\\n )\\n view\\n internal\\n returns (\\n bool _valid\\n )\\n {\\n // Always have to be below the maximum gas limit.\\n if (_gasLimit > gasMeterConfig.maxTransactionGasLimit) {\\n return false;\\n }\\n\\n // Always have to be above the minimum gas limit.\\n if (_gasLimit < gasMeterConfig.minTransactionGasLimit) {\\n return false;\\n }\\n\\n // TEMPORARY: Gas metering is disabled for minnet.\\n return true;\\n // GasMetadataKey cumulativeGasKey;\\n // GasMetadataKey prevEpochGasKey;\\n // if (_queueOrigin == Lib_OVMCodec.QueueOrigin.SEQUENCER_QUEUE) {\\n // cumulativeGasKey = GasMetadataKey.CUMULATIVE_SEQUENCER_QUEUE_GAS;\\n // prevEpochGasKey = GasMetadataKey.PREV_EPOCH_SEQUENCER_QUEUE_GAS;\\n // } else {\\n // cumulativeGasKey = GasMetadataKey.CUMULATIVE_L1TOL2_QUEUE_GAS;\\n // prevEpochGasKey = GasMetadataKey.PREV_EPOCH_L1TOL2_QUEUE_GAS;\\n // }\\n\\n // return (\\n // (\\n // _getGasMetadata(cumulativeGasKey)\\n // - _getGasMetadata(prevEpochGasKey)\\n // + _gasLimit\\n // ) < gasMeterConfig.maxGasPerQueuePerEpoch\\n // );\\n }\\n\\n /**\\n * Updates the cumulative gas after a transaction.\\n * @param _gasUsed Gas used by the transaction.\\n * @param _queueOrigin Queue from which the transaction originated.\\n */\\n function _updateCumulativeGas(\\n uint256 _gasUsed,\\n Lib_OVMCodec.QueueOrigin _queueOrigin\\n )\\n internal\\n {\\n GasMetadataKey cumulativeGasKey;\\n if (_queueOrigin == Lib_OVMCodec.QueueOrigin.SEQUENCER_QUEUE) {\\n cumulativeGasKey = GasMetadataKey.CUMULATIVE_SEQUENCER_QUEUE_GAS;\\n } else {\\n cumulativeGasKey = GasMetadataKey.CUMULATIVE_L1TOL2_QUEUE_GAS;\\n }\\n\\n _putGasMetadata(\\n cumulativeGasKey,\\n (\\n _getGasMetadata(cumulativeGasKey)\\n + gasMeterConfig.minTransactionGasLimit\\n + _gasUsed\\n - transactionRecord.ovmGasRefund\\n )\\n );\\n }\\n\\n /**\\n * Retrieves the value of a gas metadata key.\\n * @param _key Gas metadata key to retrieve.\\n * @return _value Value stored at the given key.\\n */\\n function _getGasMetadata(\\n GasMetadataKey _key\\n )\\n internal\\n returns (\\n uint256 _value\\n )\\n {\\n return uint256(_getContractStorage(\\n GAS_METADATA_ADDRESS,\\n bytes32(uint256(_key))\\n ));\\n }\\n\\n /**\\n * Sets the value of a gas metadata key.\\n * @param _key Gas metadata key to set.\\n * @param _value Value to store at the given key.\\n */\\n function _putGasMetadata(\\n GasMetadataKey _key,\\n uint256 _value\\n )\\n internal\\n {\\n _putContractStorage(\\n GAS_METADATA_ADDRESS,\\n bytes32(uint256(_key)),\\n bytes32(uint256(_value))\\n );\\n }\\n\\n\\n /*****************************************\\n * Internal Functions: Execution Context *\\n *****************************************/\\n\\n /**\\n * Swaps over to a new message context.\\n * @param _prevMessageContext Context we're switching from.\\n * @param _nextMessageContext Context we're switching to.\\n */\\n function _switchMessageContext(\\n MessageContext memory _prevMessageContext,\\n MessageContext memory _nextMessageContext\\n )\\n internal\\n {\\n // Avoid unnecessary the SSTORE.\\n if (_prevMessageContext.ovmCALLER != _nextMessageContext.ovmCALLER) {\\n messageContext.ovmCALLER = _nextMessageContext.ovmCALLER;\\n }\\n\\n // Avoid unnecessary the SSTORE.\\n if (_prevMessageContext.ovmADDRESS != _nextMessageContext.ovmADDRESS) {\\n messageContext.ovmADDRESS = _nextMessageContext.ovmADDRESS;\\n }\\n\\n // Avoid unnecessary the SSTORE.\\n if (_prevMessageContext.isStatic != _nextMessageContext.isStatic) {\\n messageContext.isStatic = _nextMessageContext.isStatic;\\n }\\n }\\n\\n /**\\n * Initializes the execution context.\\n * @param _transaction OVM transaction being executed.\\n */\\n function _initContext(\\n Lib_OVMCodec.Transaction memory _transaction\\n )\\n internal\\n {\\n transactionContext.ovmTIMESTAMP = _transaction.timestamp;\\n transactionContext.ovmNUMBER = _transaction.blockNumber;\\n transactionContext.ovmTXGASLIMIT = _transaction.gasLimit;\\n transactionContext.ovmL1QUEUEORIGIN = _transaction.l1QueueOrigin;\\n transactionContext.ovmL1TXORIGIN = _transaction.l1TxOrigin;\\n transactionContext.ovmGASLIMIT = gasMeterConfig.maxGasPerQueuePerEpoch;\\n\\n messageRecord.nuisanceGasLeft = _getNuisanceGasLimit(_transaction.gasLimit);\\n }\\n\\n /**\\n * Resets the transaction and message context.\\n */\\n function _resetContext()\\n internal\\n {\\n transactionContext.ovmL1TXORIGIN = DEFAULT_ADDRESS;\\n transactionContext.ovmTIMESTAMP = DEFAULT_UINT256;\\n transactionContext.ovmNUMBER = DEFAULT_UINT256;\\n transactionContext.ovmGASLIMIT = DEFAULT_UINT256;\\n transactionContext.ovmTXGASLIMIT = DEFAULT_UINT256;\\n transactionContext.ovmL1QUEUEORIGIN = Lib_OVMCodec.QueueOrigin.SEQUENCER_QUEUE;\\n\\n transactionRecord.ovmGasRefund = DEFAULT_UINT256;\\n\\n messageContext.ovmCALLER = DEFAULT_ADDRESS;\\n messageContext.ovmADDRESS = DEFAULT_ADDRESS;\\n messageContext.isStatic = false;\\n\\n messageRecord.nuisanceGasLeft = DEFAULT_UINT256;\\n\\n // Reset the ovmStateManager.\\n ovmStateManager = iOVM_StateManager(address(0));\\n }\\n\\n /*****************************\\n * L2-only Helper Functions *\\n *****************************/\\n\\n /**\\n * Unreachable helper function for simulating eth_calls with an OVM message context.\\n * This function will throw an exception in all cases other than when used as a custom entrypoint in L2 Geth to simulate eth_call.\\n * @param _transaction the message transaction to simulate.\\n * @param _from the OVM account the simulated call should be from.\\n */\\n function simulateMessage(\\n Lib_OVMCodec.Transaction memory _transaction,\\n address _from,\\n iOVM_StateManager _ovmStateManager\\n )\\n external\\n returns (\\n bool,\\n bytes memory\\n )\\n {\\n // Prevent this call from having any effect unless in a custom-set VM frame\\n require(msg.sender == address(0));\\n\\n ovmStateManager = _ovmStateManager;\\n _initContext(_transaction);\\n messageRecord.nuisanceGasLeft = uint(-1);\\n\\n messageContext.ovmADDRESS = _from;\\n\\n bool isCreate = _transaction.entrypoint == address(0);\\n if (isCreate) {\\n (address created, bytes memory revertData) = ovmCREATE(_transaction.data);\\n if (created == address(0)) {\\n return (false, revertData);\\n } else {\\n // The eth_call RPC endpoint for to = undefined will return the deployed bytecode\\n // in the success case, differing from standard create messages.\\n return (true, Lib_EthUtils.getCode(created));\\n }\\n } else {\\n return ovmCALL(\\n _transaction.gasLimit,\\n _transaction.entrypoint,\\n _transaction.data\\n );\\n }\\n }\\n}\\n\",\"keccak256\":\"0xad8464075bba192a72c955048a435cbf0ff20062804c1167adc2ecd3e21ff3f4\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/predeploys/OVM_DeployerWhitelist.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_Bytes32Utils } from \\\"../../libraries/utils/Lib_Bytes32Utils.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_DeployerWhitelist } from \\\"../../iOVM/predeploys/iOVM_DeployerWhitelist.sol\\\";\\nimport { Lib_SafeExecutionManagerWrapper } from \\\"../../libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\\\";\\n\\n/**\\n * @title OVM_DeployerWhitelist\\n * @dev The Deployer Whitelist is a temporary predeploy used to provide additional safety during the\\n * initial phases of our mainnet roll out. It is owned by the Optimism team, and defines accounts\\n * which are allowed to deploy contracts on Layer2. The Execution Manager will only allow an \\n * ovmCREATE or ovmCREATE2 operation to proceed if the deployer's address whitelisted.\\n * \\n * Compiler used: solc\\n * Runtime target: OVM\\n */\\ncontract OVM_DeployerWhitelist is iOVM_DeployerWhitelist {\\n\\n /**********************\\n * Contract Constants *\\n **********************/\\n\\n bytes32 internal constant KEY_INITIALIZED = 0x0000000000000000000000000000000000000000000000000000000000000010;\\n bytes32 internal constant KEY_OWNER = 0x0000000000000000000000000000000000000000000000000000000000000011;\\n bytes32 internal constant KEY_ALLOW_ARBITRARY_DEPLOYMENT = 0x0000000000000000000000000000000000000000000000000000000000000012;\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n \\n /**\\n * Blocks functions to anyone except the contract owner.\\n */\\n modifier onlyOwner() {\\n address owner = Lib_Bytes32Utils.toAddress(\\n Lib_SafeExecutionManagerWrapper.safeSLOAD(\\n KEY_OWNER\\n )\\n );\\n\\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(\\n Lib_SafeExecutionManagerWrapper.safeCALLER() == owner,\\n \\\"Function can only be called by the owner of this contract.\\\"\\n );\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n \\n /**\\n * Initializes the whitelist.\\n * @param _owner Address of the owner for this contract.\\n * @param _allowArbitraryDeployment Whether or not to allow arbitrary contract deployment.\\n */\\n function initialize(\\n address _owner,\\n bool _allowArbitraryDeployment\\n )\\n override\\n public\\n {\\n bool initialized = Lib_Bytes32Utils.toBool(\\n Lib_SafeExecutionManagerWrapper.safeSLOAD(KEY_INITIALIZED)\\n );\\n\\n if (initialized == true) {\\n return;\\n }\\n\\n Lib_SafeExecutionManagerWrapper.safeSSTORE(\\n KEY_INITIALIZED,\\n Lib_Bytes32Utils.fromBool(true)\\n );\\n Lib_SafeExecutionManagerWrapper.safeSSTORE(\\n KEY_OWNER,\\n Lib_Bytes32Utils.fromAddress(_owner)\\n );\\n Lib_SafeExecutionManagerWrapper.safeSSTORE(\\n KEY_ALLOW_ARBITRARY_DEPLOYMENT,\\n Lib_Bytes32Utils.fromBool(_allowArbitraryDeployment)\\n );\\n }\\n\\n /**\\n * Gets the owner of the whitelist.\\n */\\n function getOwner()\\n override\\n public\\n returns(\\n address\\n )\\n {\\n return Lib_Bytes32Utils.toAddress(\\n Lib_SafeExecutionManagerWrapper.safeSLOAD(\\n KEY_OWNER\\n )\\n );\\n }\\n\\n /**\\n * Adds or removes an address from the deployment whitelist.\\n * @param _deployer Address to update permissions for.\\n * @param _isWhitelisted Whether or not the address is whitelisted.\\n */\\n function setWhitelistedDeployer(\\n address _deployer,\\n bool _isWhitelisted\\n )\\n override\\n public\\n onlyOwner\\n {\\n Lib_SafeExecutionManagerWrapper.safeSSTORE(\\n Lib_Bytes32Utils.fromAddress(_deployer),\\n Lib_Bytes32Utils.fromBool(_isWhitelisted)\\n );\\n }\\n\\n /**\\n * Updates the owner of this contract.\\n * @param _owner Address of the new owner.\\n */\\n function setOwner(\\n address _owner\\n )\\n override\\n public\\n onlyOwner\\n {\\n Lib_SafeExecutionManagerWrapper.safeSSTORE(\\n KEY_OWNER,\\n Lib_Bytes32Utils.fromAddress(_owner)\\n );\\n }\\n\\n /**\\n * Updates the arbitrary deployment flag.\\n * @param _allowArbitraryDeployment Whether or not to allow arbitrary contract deployment.\\n */\\n function setAllowArbitraryDeployment(\\n bool _allowArbitraryDeployment\\n )\\n override\\n public\\n onlyOwner\\n {\\n Lib_SafeExecutionManagerWrapper.safeSSTORE(\\n KEY_ALLOW_ARBITRARY_DEPLOYMENT,\\n Lib_Bytes32Utils.fromBool(_allowArbitraryDeployment)\\n );\\n }\\n\\n /**\\n * Permanently enables arbitrary contract deployment and deletes the owner.\\n */\\n function enableArbitraryContractDeployment()\\n override\\n public\\n onlyOwner\\n {\\n setAllowArbitraryDeployment(true);\\n setOwner(address(0));\\n }\\n\\n /**\\n * Checks whether an address is allowed to deploy contracts.\\n * @param _deployer Address to check.\\n * @return _allowed Whether or not the address can deploy contracts.\\n */\\n function isDeployerAllowed(\\n address _deployer\\n )\\n override\\n public\\n returns (\\n bool _allowed\\n )\\n {\\n bool initialized = Lib_Bytes32Utils.toBool(\\n Lib_SafeExecutionManagerWrapper.safeSLOAD(KEY_INITIALIZED)\\n );\\n\\n if (initialized == false) {\\n return true;\\n }\\n\\n bool allowArbitraryDeployment = Lib_Bytes32Utils.toBool(\\n Lib_SafeExecutionManagerWrapper.safeSLOAD(KEY_ALLOW_ARBITRARY_DEPLOYMENT)\\n );\\n\\n if (allowArbitraryDeployment == true) {\\n return true;\\n }\\n\\n bool isWhitelisted = Lib_Bytes32Utils.toBool(\\n Lib_SafeExecutionManagerWrapper.safeSLOAD(\\n Lib_Bytes32Utils.fromAddress(_deployer)\\n )\\n );\\n\\n return isWhitelisted; \\n }\\n}\\n\",\"keccak256\":\"0xe746e2a3f649d3d9760db8a0b6dccee5cdb267c9615268181285846277307084\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/accounts/iOVM_ECDSAContractAccount.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title iOVM_ECDSAContractAccount\\n */\\ninterface iOVM_ECDSAContractAccount {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function execute(\\n bytes memory _transaction,\\n Lib_OVMCodec.EOASignatureType _signatureType,\\n uint8 _v,\\n bytes32 _r,\\n bytes32 _s\\n ) external returns (bool _success, bytes memory _returndata);\\n}\\n\",\"keccak256\":\"0x308729bc62dcffb11ff1d840781105cf1bf0dd4cbcfb1af704b800bb0cfe9b85\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/execution/iOVM_ExecutionManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\ninterface iOVM_ExecutionManager {\\n /**********\\n * Enums *\\n *********/\\n\\n enum RevertFlag {\\n OUT_OF_GAS,\\n INTENTIONAL_REVERT,\\n EXCEEDS_NUISANCE_GAS,\\n INVALID_STATE_ACCESS,\\n UNSAFE_BYTECODE,\\n CREATE_COLLISION,\\n STATIC_VIOLATION,\\n CREATOR_NOT_ALLOWED\\n }\\n\\n enum GasMetadataKey {\\n CURRENT_EPOCH_START_TIMESTAMP,\\n CUMULATIVE_SEQUENCER_QUEUE_GAS,\\n CUMULATIVE_L1TOL2_QUEUE_GAS,\\n PREV_EPOCH_SEQUENCER_QUEUE_GAS,\\n PREV_EPOCH_L1TOL2_QUEUE_GAS\\n }\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct GasMeterConfig {\\n uint256 minTransactionGasLimit;\\n uint256 maxTransactionGasLimit;\\n uint256 maxGasPerQueuePerEpoch;\\n uint256 secondsPerEpoch;\\n }\\n\\n struct GlobalContext {\\n uint256 ovmCHAINID;\\n }\\n\\n struct TransactionContext {\\n Lib_OVMCodec.QueueOrigin ovmL1QUEUEORIGIN;\\n uint256 ovmTIMESTAMP;\\n uint256 ovmNUMBER;\\n uint256 ovmGASLIMIT;\\n uint256 ovmTXGASLIMIT;\\n address ovmL1TXORIGIN;\\n }\\n\\n struct TransactionRecord {\\n uint256 ovmGasRefund;\\n }\\n\\n struct MessageContext {\\n address ovmCALLER;\\n address ovmADDRESS;\\n bool isStatic;\\n }\\n\\n struct MessageRecord {\\n uint256 nuisanceGasLeft;\\n }\\n\\n\\n /************************************\\n * Transaction Execution Entrypoint *\\n ************************************/\\n\\n function run(\\n Lib_OVMCodec.Transaction calldata _transaction,\\n address _txStateManager\\n ) external;\\n\\n\\n /*******************\\n * Context Opcodes *\\n *******************/\\n\\n function ovmCALLER() external view returns (address _caller);\\n function ovmADDRESS() external view returns (address _address);\\n function ovmTIMESTAMP() external view returns (uint256 _timestamp);\\n function ovmNUMBER() external view returns (uint256 _number);\\n function ovmGASLIMIT() external view returns (uint256 _gasLimit);\\n function ovmCHAINID() external view returns (uint256 _chainId);\\n\\n\\n /**********************\\n * L2 Context Opcodes *\\n **********************/\\n\\n function ovmL1QUEUEORIGIN() external view returns (Lib_OVMCodec.QueueOrigin _queueOrigin);\\n function ovmL1TXORIGIN() external view returns (address _l1TxOrigin);\\n\\n\\n /*******************\\n * Halting Opcodes *\\n *******************/\\n\\n function ovmREVERT(bytes memory _data) external;\\n\\n\\n /*****************************\\n * Contract Creation Opcodes *\\n *****************************/\\n\\n function ovmCREATE(bytes memory _bytecode) external returns (address _contract, bytes memory _revertdata);\\n function ovmCREATE2(bytes memory _bytecode, bytes32 _salt) external returns (address _contract, bytes memory _revertdata);\\n\\n\\n /*******************************\\n * Account Abstraction Opcodes *\\n ******************************/\\n\\n function ovmGETNONCE() external returns (uint256 _nonce);\\n function ovmINCREMENTNONCE() external;\\n function ovmCREATEEOA(bytes32 _messageHash, uint8 _v, bytes32 _r, bytes32 _s) external;\\n\\n\\n /****************************\\n * Contract Calling Opcodes *\\n ****************************/\\n\\n function ovmCALL(uint256 _gasLimit, address _address, bytes memory _calldata) external returns (bool _success, bytes memory _returndata);\\n function ovmSTATICCALL(uint256 _gasLimit, address _address, bytes memory _calldata) external returns (bool _success, bytes memory _returndata);\\n function ovmDELEGATECALL(uint256 _gasLimit, address _address, bytes memory _calldata) external returns (bool _success, bytes memory _returndata);\\n\\n\\n /****************************\\n * Contract Storage Opcodes *\\n ****************************/\\n\\n function ovmSLOAD(bytes32 _key) external returns (bytes32 _value);\\n function ovmSSTORE(bytes32 _key, bytes32 _value) external;\\n\\n\\n /*************************\\n * Contract Code Opcodes *\\n *************************/\\n\\n function ovmEXTCODECOPY(address _contract, uint256 _offset, uint256 _length) external returns (bytes memory _code);\\n function ovmEXTCODESIZE(address _contract) external returns (uint256 _size);\\n function ovmEXTCODEHASH(address _contract) external returns (bytes32 _hash);\\n\\n\\n /***************************************\\n * Public Functions: Execution Context *\\n ***************************************/\\n\\n function getMaxTransactionGasLimit() external view returns (uint _maxTransactionGasLimit);\\n}\\n\",\"keccak256\":\"0xa613e2f578d56aa80f0916df538b487f8213a18933e78fdecb9efeedae02cf9c\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/execution/iOVM_SafetyChecker.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title iOVM_SafetyChecker\\n */\\ninterface iOVM_SafetyChecker {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function isBytecodeSafe(bytes calldata _bytecode) external pure returns (bool);\\n}\\n\",\"keccak256\":\"0xde6639676d4ec4f77297652d5ede2429bc93e74e11fefd9e9de4bc92dd784878\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/execution/iOVM_StateManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title iOVM_StateManager\\n */\\ninterface iOVM_StateManager {\\n\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n enum ItemState {\\n ITEM_UNTOUCHED,\\n ITEM_LOADED,\\n ITEM_CHANGED,\\n ITEM_COMMITTED\\n }\\n\\n /***************************\\n * Public Functions: Misc *\\n ***************************/\\n\\n function isAuthenticated(address _address) external view returns (bool);\\n\\n /***************************\\n * Public Functions: Setup *\\n ***************************/\\n\\n function owner() external view returns (address _owner);\\n function ovmExecutionManager() external view returns (address _ovmExecutionManager);\\n function setExecutionManager(address _ovmExecutionManager) external;\\n\\n\\n /************************************\\n * Public Functions: Account Access *\\n ************************************/\\n\\n function putAccount(address _address, Lib_OVMCodec.Account memory _account) external;\\n function putEmptyAccount(address _address) external;\\n function getAccount(address _address) external view returns (Lib_OVMCodec.Account memory _account);\\n function hasAccount(address _address) external view returns (bool _exists);\\n function hasEmptyAccount(address _address) external view returns (bool _exists);\\n function setAccountNonce(address _address, uint256 _nonce) external;\\n function getAccountNonce(address _address) external view returns (uint256 _nonce);\\n function getAccountEthAddress(address _address) external view returns (address _ethAddress);\\n function getAccountStorageRoot(address _address) external view returns (bytes32 _storageRoot);\\n function initPendingAccount(address _address) external;\\n function commitPendingAccount(address _address, address _ethAddress, bytes32 _codeHash) external;\\n function testAndSetAccountLoaded(address _address) external returns (bool _wasAccountAlreadyLoaded);\\n function testAndSetAccountChanged(address _address) external returns (bool _wasAccountAlreadyChanged);\\n function commitAccount(address _address) external returns (bool _wasAccountCommitted);\\n function incrementTotalUncommittedAccounts() external;\\n function getTotalUncommittedAccounts() external view returns (uint256 _total);\\n function wasAccountChanged(address _address) external view returns (bool);\\n function wasAccountCommitted(address _address) external view returns (bool);\\n\\n\\n /************************************\\n * Public Functions: Storage Access *\\n ************************************/\\n\\n function putContractStorage(address _contract, bytes32 _key, bytes32 _value) external;\\n function getContractStorage(address _contract, bytes32 _key) external view returns (bytes32 _value);\\n function hasContractStorage(address _contract, bytes32 _key) external view returns (bool _exists);\\n function testAndSetContractStorageLoaded(address _contract, bytes32 _key) external returns (bool _wasContractStorageAlreadyLoaded);\\n function testAndSetContractStorageChanged(address _contract, bytes32 _key) external returns (bool _wasContractStorageAlreadyChanged);\\n function commitContractStorage(address _contract, bytes32 _key) external returns (bool _wasContractStorageCommitted);\\n function incrementTotalUncommittedContractStorage() external;\\n function getTotalUncommittedContractStorage() external view returns (uint256 _total);\\n function wasContractStorageChanged(address _contract, bytes32 _key) external view returns (bool);\\n function wasContractStorageCommitted(address _contract, bytes32 _key) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x7a11dbd1f61593ba34debe07e39eef59967307f7f372ba9855bee0953585d08d\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/predeploys/iOVM_DeployerWhitelist.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title iOVM_DeployerWhitelist\\n */\\ninterface iOVM_DeployerWhitelist {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function initialize(address _owner, bool _allowArbitraryDeployment) external;\\n function getOwner() external returns (address _owner);\\n function setWhitelistedDeployer(address _deployer, bool _isWhitelisted) external;\\n function setOwner(address _newOwner) external;\\n function setAllowArbitraryDeployment(bool _allowArbitraryDeployment) external;\\n function enableArbitraryContractDeployment() external;\\n function isDeployerAllowed(address _deployer) external returns (bool _allowed);\\n}\\n\",\"keccak256\":\"0x969394371cacfc36493230150b6d629173ea72dfdf729330bede475b91d0f004\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/codec/Lib_OVMCodec.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../utils/Lib_Bytes32Utils.sol\\\";\\nimport { Lib_SafeExecutionManagerWrapper } from \\\"../../libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\\\";\\n\\n/**\\n * @title Lib_OVMCodec\\n */\\nlibrary Lib_OVMCodec {\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum EOASignatureType {\\n EIP155_TRANSACTION,\\n ETH_SIGNED_MESSAGE\\n }\\n\\n enum QueueOrigin {\\n SEQUENCER_QUEUE,\\n L1TOL2_QUEUE\\n }\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Account {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n address ethAddress;\\n bool isFresh;\\n }\\n\\n struct EVMAccount {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n }\\n\\n struct ChainBatchHeader {\\n uint256 batchIndex;\\n bytes32 batchRoot;\\n uint256 batchSize;\\n uint256 prevTotalElements;\\n bytes extraData;\\n }\\n\\n struct ChainInclusionProof {\\n uint256 index;\\n bytes32[] siblings;\\n }\\n\\n struct Transaction {\\n uint256 timestamp;\\n uint256 blockNumber;\\n QueueOrigin l1QueueOrigin;\\n address l1TxOrigin;\\n address entrypoint;\\n uint256 gasLimit;\\n bytes data;\\n }\\n\\n struct TransactionChainElement {\\n bool isSequenced;\\n uint256 queueIndex; // QUEUED TX ONLY\\n uint256 timestamp; // SEQUENCER TX ONLY\\n uint256 blockNumber; // SEQUENCER TX ONLY\\n bytes txData; // SEQUENCER TX ONLY\\n }\\n\\n struct QueueElement {\\n bytes32 transactionHash;\\n uint40 timestamp;\\n uint40 blockNumber;\\n }\\n\\n struct EIP155Transaction {\\n uint256 nonce;\\n uint256 gasPrice;\\n uint256 gasLimit;\\n address to;\\n uint256 value;\\n bytes data;\\n uint256 chainId;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Decodes an EOA transaction (i.e., native Ethereum RLP encoding).\\n * @param _transaction Encoded EOA transaction.\\n * @return Transaction decoded into a struct.\\n */\\n function decodeEIP155Transaction(\\n bytes memory _transaction,\\n bool _isEthSignedMessage\\n )\\n internal\\n pure\\n returns (\\n EIP155Transaction memory\\n )\\n {\\n if (_isEthSignedMessage) {\\n (\\n uint256 _nonce,\\n uint256 _gasLimit,\\n uint256 _gasPrice,\\n uint256 _chainId,\\n address _to,\\n bytes memory _data\\n ) = abi.decode(\\n _transaction,\\n (uint256, uint256, uint256, uint256, address ,bytes)\\n );\\n return EIP155Transaction({\\n nonce: _nonce,\\n gasPrice: _gasPrice,\\n gasLimit: _gasLimit,\\n to: _to,\\n value: 0,\\n data: _data,\\n chainId: _chainId\\n });\\n } else {\\n Lib_RLPReader.RLPItem[] memory decoded = Lib_RLPReader.readList(_transaction);\\n\\n return EIP155Transaction({\\n nonce: Lib_RLPReader.readUint256(decoded[0]),\\n gasPrice: Lib_RLPReader.readUint256(decoded[1]),\\n gasLimit: Lib_RLPReader.readUint256(decoded[2]),\\n to: Lib_RLPReader.readAddress(decoded[3]),\\n value: Lib_RLPReader.readUint256(decoded[4]),\\n data: Lib_RLPReader.readBytes(decoded[5]),\\n chainId: Lib_RLPReader.readUint256(decoded[6])\\n });\\n }\\n }\\n\\n /**\\n * Decompresses a compressed EIP155 transaction.\\n * @param _transaction Compressed EIP155 transaction bytes.\\n * @return Transaction parsed into a struct.\\n */\\n function decompressEIP155Transaction(\\n bytes memory _transaction\\n )\\n internal\\n returns (\\n EIP155Transaction memory\\n )\\n {\\n return EIP155Transaction({\\n gasLimit: Lib_BytesUtils.toUint24(_transaction, 0),\\n gasPrice: uint256(Lib_BytesUtils.toUint24(_transaction, 3)) * 1000000,\\n nonce: Lib_BytesUtils.toUint24(_transaction, 6),\\n to: Lib_BytesUtils.toAddress(_transaction, 9),\\n data: Lib_BytesUtils.slice(_transaction, 29),\\n chainId: Lib_SafeExecutionManagerWrapper.safeCHAINID(),\\n value: 0\\n });\\n }\\n\\n /**\\n * Encodes an EOA transaction back into the original transaction.\\n * @param _transaction EIP155transaction to encode.\\n * @param _isEthSignedMessage Whether or not this was an eth signed message.\\n * @return Encoded transaction.\\n */\\n function encodeEIP155Transaction(\\n EIP155Transaction memory _transaction,\\n bool _isEthSignedMessage\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n if (_isEthSignedMessage) {\\n return abi.encode(\\n _transaction.nonce,\\n _transaction.gasLimit,\\n _transaction.gasPrice,\\n _transaction.chainId,\\n _transaction.to,\\n _transaction.data\\n );\\n } else {\\n bytes[] memory raw = new bytes[](9);\\n\\n raw[0] = Lib_RLPWriter.writeUint(_transaction.nonce);\\n raw[1] = Lib_RLPWriter.writeUint(_transaction.gasPrice);\\n raw[2] = Lib_RLPWriter.writeUint(_transaction.gasLimit);\\n if (_transaction.to == address(0)) {\\n raw[3] = Lib_RLPWriter.writeBytes('');\\n } else {\\n raw[3] = Lib_RLPWriter.writeAddress(_transaction.to);\\n }\\n raw[4] = Lib_RLPWriter.writeUint(0);\\n raw[5] = Lib_RLPWriter.writeBytes(_transaction.data);\\n raw[6] = Lib_RLPWriter.writeUint(_transaction.chainId);\\n raw[7] = Lib_RLPWriter.writeBytes(bytes(''));\\n raw[8] = Lib_RLPWriter.writeBytes(bytes(''));\\n\\n return Lib_RLPWriter.writeList(raw);\\n }\\n }\\n\\n /**\\n * Encodes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Encoded transaction bytes.\\n */\\n function encodeTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return abi.encodePacked(\\n _transaction.timestamp,\\n _transaction.blockNumber,\\n _transaction.l1QueueOrigin,\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n );\\n }\\n\\n /**\\n * Hashes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Hashed transaction\\n */\\n function hashTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(encodeTransaction(_transaction));\\n }\\n\\n /**\\n * Converts an OVM account to an EVM account.\\n * @param _in OVM account to convert.\\n * @return Converted EVM account.\\n */\\n function toEVMAccount(\\n Account memory _in\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n return EVMAccount({\\n nonce: _in.nonce,\\n balance: _in.balance,\\n storageRoot: _in.storageRoot,\\n codeHash: _in.codeHash\\n });\\n }\\n\\n /**\\n * @notice RLP-encodes an account state struct.\\n * @param _account Account state struct.\\n * @return RLP-encoded account state.\\n */\\n function encodeEVMAccount(\\n EVMAccount memory _account\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes[] memory raw = new bytes[](4);\\n\\n // Unfortunately we can't create this array outright because\\n // Lib_RLPWriter.writeList will reject fixed-size arrays. Assigning\\n // index-by-index circumvents this issue.\\n raw[0] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.nonce)\\n )\\n );\\n raw[1] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.balance)\\n )\\n );\\n raw[2] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.storageRoot));\\n raw[3] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.codeHash));\\n\\n return Lib_RLPWriter.writeList(raw);\\n }\\n\\n /**\\n * @notice Decodes an RLP-encoded account state into a useful struct.\\n * @param _encoded RLP-encoded account state.\\n * @return Account state struct.\\n */\\n function decodeEVMAccount(\\n bytes memory _encoded\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\\n\\n return EVMAccount({\\n nonce: Lib_RLPReader.readUint256(accountState[0]),\\n balance: Lib_RLPReader.readUint256(accountState[1]),\\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\\n });\\n }\\n\\n /**\\n * Calculates a hash for a given batch header.\\n * @param _batchHeader Header to hash.\\n * @return Hash of the header.\\n */\\n function hashBatchHeader(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(\\n abi.encode(\\n _batchHeader.batchRoot,\\n _batchHeader.batchSize,\\n _batchHeader.prevTotalElements,\\n _batchHeader.extraData\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0xe7e518ba7bba3fa28c532f8902576c1bb4dfc1ec4b62bed6da50623248ba17c3\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Contract Imports */\\nimport { Ownable } from \\\"./Lib_Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n /*******************************************\\n * Contract Variables: Internal Accounting *\\n *******************************************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n public\\n onlyOwner\\n {\\n emit AddressSet(_name, _address);\\n addresses[_getNameHash(_name)] = _address;\\n }\\n\\n function getAddress(\\n string memory _name\\n )\\n public\\n view\\n returns (address)\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32 _hash\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0x3a490595cc21ff170e4027843093670ff845d5972481fbfb956b722ea564bb06\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n\\n /*******************************************\\n * Contract Variables: Contract References *\\n *******************************************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(\\n address _libAddressManager\\n ) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function resolve(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address _contract\\n )\\n {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0xaa3ed342f6deb156c660fd83afa579a3b80db17eb465e8949cf5c1b114780143\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Ownable\\n * @dev Adapted from https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol\\n */\\nabstract contract Ownable {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n address public owner;\\n\\n\\n /**********\\n * Events *\\n **********/\\n\\n event OwnershipTransferred(\\n address indexed previousOwner,\\n address indexed newOwner\\n );\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n constructor() {\\n owner = msg.sender;\\n emit OwnershipTransferred(address(0), owner);\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n owner == msg.sender,\\n \\\"Ownable: caller is not the owner\\\"\\n );\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function renounceOwnership()\\n public\\n virtual\\n onlyOwner\\n {\\n emit OwnershipTransferred(owner, address(0));\\n owner = address(0);\\n }\\n\\n function transferOwnership(address _newOwner)\\n public\\n virtual\\n onlyOwner\\n {\\n require(\\n _newOwner != address(0),\\n \\\"Ownable: new owner cannot be the zero address\\\"\\n );\\n\\n emit OwnershipTransferred(owner, _newOwner);\\n owner = _newOwner;\\n }\\n}\\n\",\"keccak256\":\"0xd9dfd9264e5b5fedd53a5b10fdf179c3f367614b0fe69179bce4e45119f5b739\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPReader.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_RLPReader\\n * @dev Adapted from \\\"RLPReader\\\" by Hamdi Allam (hamdi.allam97@gmail.com).\\n */\\nlibrary Lib_RLPReader {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 constant internal MAX_LIST_LENGTH = 32;\\n\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum RLPItemType {\\n DATA_ITEM,\\n LIST_ITEM\\n }\\n\\n \\n /***********\\n * Structs *\\n ***********/\\n\\n struct RLPItem {\\n uint256 length;\\n uint256 ptr;\\n }\\n \\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n \\n /**\\n * Converts bytes to a reference to memory position and length.\\n * @param _in Input bytes to convert.\\n * @return Output memory reference.\\n */\\n function toRLPItem(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem memory\\n )\\n {\\n uint256 ptr;\\n assembly {\\n ptr := add(_in, 32)\\n }\\n\\n return RLPItem({\\n length: _in.length,\\n ptr: ptr\\n });\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n (\\n uint256 listOffset,\\n ,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.LIST_ITEM,\\n \\\"Invalid RLP list value.\\\"\\n );\\n\\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\\n // writing to the length. Since we can't know the number of RLP items without looping over\\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\\n // simply set a reasonable maximum list length and decrease the size before we finish.\\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\\n\\n uint256 itemCount = 0;\\n uint256 offset = listOffset;\\n while (offset < _in.length) {\\n require(\\n itemCount < MAX_LIST_LENGTH,\\n \\\"Provided RLP list exceeds max list length.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n ) = _decodeLength(RLPItem({\\n length: _in.length - offset,\\n ptr: _in.ptr + offset\\n }));\\n\\n out[itemCount] = RLPItem({\\n length: itemLength + itemOffset,\\n ptr: _in.ptr + offset\\n });\\n\\n itemCount += 1;\\n offset += itemOffset + itemLength;\\n }\\n\\n // Decrease the array size to match the actual item count.\\n assembly {\\n mstore(out, itemCount)\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n return readList(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes value.\\\"\\n );\\n\\n return _copy(_in.ptr, itemOffset, itemLength);\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return readBytes(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return string(readBytes(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return readString(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n require(\\n _in.length <= 33,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr + itemOffset;\\n bytes32 out;\\n assembly {\\n out := mload(ptr)\\n\\n // Shift the bytes over to match the item size.\\n if lt(itemLength, 32) {\\n out := div(out, exp(256, sub(32, itemLength)))\\n }\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return readBytes32(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return uint256(readBytes32(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return readUint256(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n require(\\n _in.length == 1,\\n \\\"Invalid RLP boolean value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 out;\\n assembly {\\n out := byte(0, mload(ptr))\\n }\\n\\n require(\\n out == 0 || out == 1,\\n \\\"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\\\"\\n );\\n\\n return out != 0;\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return readBool(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n if (_in.length == 1) {\\n return address(0);\\n }\\n\\n require(\\n _in.length == 21,\\n \\\"Invalid RLP address value.\\\"\\n );\\n\\n return address(readUint256(_in));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return readAddress(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads the raw bytes of an RLP item.\\n * @param _in RLP item to read.\\n * @return Raw RLP bytes.\\n */\\n function readRawBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in);\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Decodes the length of an RLP item.\\n * @param _in RLP item to decode.\\n * @return Offset of the encoded data.\\n * @return Length of the encoded data.\\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\\n */\\n function _decodeLength(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n uint256,\\n uint256,\\n RLPItemType\\n )\\n {\\n require(\\n _in.length > 0,\\n \\\"RLP item cannot be null.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 prefix;\\n assembly {\\n prefix := byte(0, mload(ptr))\\n }\\n\\n if (prefix <= 0x7f) {\\n // Single byte.\\n\\n return (0, 1, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xb7) {\\n // Short string.\\n\\n uint256 strLen = prefix - 0x80;\\n \\n require(\\n _in.length > strLen,\\n \\\"Invalid RLP short string.\\\"\\n );\\n\\n return (1, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xbf) {\\n // Long string.\\n uint256 lenOfStrLen = prefix - 0xb7;\\n\\n require(\\n _in.length > lenOfStrLen,\\n \\\"Invalid RLP long string length.\\\"\\n );\\n\\n uint256 strLen;\\n assembly {\\n // Pick out the string length.\\n strLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfStrLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfStrLen + strLen,\\n \\\"Invalid RLP long string.\\\"\\n );\\n\\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xf7) {\\n // Short list.\\n uint256 listLen = prefix - 0xc0;\\n\\n require(\\n _in.length > listLen,\\n \\\"Invalid RLP short list.\\\"\\n );\\n\\n return (1, listLen, RLPItemType.LIST_ITEM);\\n } else {\\n // Long list.\\n uint256 lenOfListLen = prefix - 0xf7;\\n\\n require(\\n _in.length > lenOfListLen,\\n \\\"Invalid RLP long list length.\\\"\\n );\\n\\n uint256 listLen;\\n assembly {\\n // Pick out the list length.\\n listLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfListLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfListLen + listLen,\\n \\\"Invalid RLP long list.\\\"\\n );\\n\\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\\n }\\n }\\n\\n /**\\n * Copies the bytes from a memory location.\\n * @param _src Pointer to the location to read from.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Copied bytes.\\n */\\n function _copy(\\n uint256 _src,\\n uint256 _offset,\\n uint256 _length\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out = new bytes(_length);\\n if (out.length == 0) {\\n return out;\\n }\\n\\n uint256 src = _src + _offset;\\n uint256 dest;\\n assembly {\\n dest := add(out, 32)\\n }\\n\\n // Copy over as many complete words as we can.\\n for (uint256 i = 0; i < _length / 32; i++) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n\\n src += 32;\\n dest += 32;\\n }\\n\\n // Pick out the remaining bytes.\\n uint256 mask = 256 ** (32 - (_length % 32)) - 1;\\n assembly {\\n mstore(\\n dest,\\n or(\\n and(mload(src), not(mask)),\\n and(mload(dest), mask)\\n )\\n )\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Copies an RLP item into bytes.\\n * @param _in RLP item to copy.\\n * @return Copied bytes.\\n */\\n function _copy(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in.ptr, 0, _in.length);\\n }\\n}\\n\",\"keccak256\":\"0xbdb8fae0ca2483b4cc07607a5070fc25e33c54b4e4462b99e7c0b13aac48a09b\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPWriter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\n\\n/**\\n * @title Lib_RLPWriter\\n * @author Bakaoh (with modifications)\\n */\\nlibrary Lib_RLPWriter {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * RLP encodes a byte string.\\n * @param _in The byte string to encode.\\n * @return _out The RLP encoded string in bytes.\\n */\\n function writeBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n bytes memory encoded;\\n\\n if (_in.length == 1 && uint8(_in[0]) < 128) {\\n encoded = _in;\\n } else {\\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * RLP encodes a list of RLP encoded byte byte strings.\\n * @param _in The list of RLP encoded byte strings.\\n * @return _out The RLP encoded list of items in bytes.\\n */\\n function writeList(\\n bytes[] memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n bytes memory list = _flatten(_in);\\n return abi.encodePacked(_writeLength(list.length, 192), list);\\n }\\n\\n /**\\n * RLP encodes a string.\\n * @param _in The string to encode.\\n * @return _out The RLP encoded string in bytes.\\n */\\n function writeString(\\n string memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(bytes(_in));\\n }\\n\\n /**\\n * RLP encodes an address.\\n * @param _in The address to encode.\\n * @return _out The RLP encoded address in bytes.\\n */\\n function writeAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a uint.\\n * @param _in The uint256 to encode.\\n * @return _out The RLP encoded uint256 in bytes.\\n */\\n function writeUint(\\n uint256 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(_toBinary(_in));\\n }\\n\\n /**\\n * RLP encodes a bool.\\n * @param _in The bool to encode.\\n * @return _out The RLP encoded bool in bytes.\\n */\\n function writeBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n bytes memory encoded = new bytes(1);\\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\\n return encoded;\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\\n * @param _len The length of the string or the payload.\\n * @param _offset 128 if item is string, 192 if item is list.\\n * @return _encoded RLP encoded bytes.\\n */\\n function _writeLength(\\n uint256 _len,\\n uint256 _offset\\n )\\n private\\n pure\\n returns (\\n bytes memory _encoded\\n )\\n {\\n bytes memory encoded;\\n\\n if (_len < 56) {\\n encoded = new bytes(1);\\n encoded[0] = byte(uint8(_len) + uint8(_offset));\\n } else {\\n uint256 lenLen;\\n uint256 i = 1;\\n while (_len / i != 0) {\\n lenLen++;\\n i *= 256;\\n }\\n\\n encoded = new bytes(lenLen + 1);\\n encoded[0] = byte(uint8(lenLen) + uint8(_offset) + 55);\\n for(i = 1; i <= lenLen; i++) {\\n encoded[i] = byte(uint8((_len / (256**(lenLen-i))) % 256));\\n }\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * Encode integer in big endian binary form with no leading zeroes.\\n * @notice TODO: This should be optimized with assembly to save gas costs.\\n * @param _x The integer to encode.\\n * @return _binary RLP encoded bytes.\\n */\\n function _toBinary(\\n uint256 _x\\n )\\n private\\n pure\\n returns (\\n bytes memory _binary\\n )\\n {\\n bytes memory b = abi.encodePacked(_x);\\n\\n uint256 i = 0;\\n for (; i < 32; i++) {\\n if (b[i] != 0) {\\n break;\\n }\\n }\\n\\n bytes memory res = new bytes(32 - i);\\n for (uint256 j = 0; j < res.length; j++) {\\n res[j] = b[i++];\\n }\\n\\n return res;\\n }\\n\\n /**\\n * Copies a piece of memory to another location.\\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\\n * @param _dest Destination location.\\n * @param _src Source location.\\n * @param _len Length of memory to copy.\\n */\\n function _memcpy(\\n uint256 _dest,\\n uint256 _src,\\n uint256 _len\\n )\\n private\\n pure\\n {\\n uint256 dest = _dest;\\n uint256 src = _src;\\n uint256 len = _len;\\n\\n for(; len >= 32; len -= 32) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n dest += 32;\\n src += 32;\\n }\\n\\n uint256 mask = 256 ** (32 - len) - 1;\\n assembly {\\n let srcpart := and(mload(src), not(mask))\\n let destpart := and(mload(dest), mask)\\n mstore(dest, or(destpart, srcpart))\\n }\\n }\\n\\n /**\\n * Flattens a list of byte strings into one byte string.\\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\\n * @param _list List of byte strings to flatten.\\n * @return _flattened The flattened byte string.\\n */\\n function _flatten(\\n bytes[] memory _list\\n )\\n private\\n pure\\n returns (\\n bytes memory _flattened\\n )\\n {\\n if (_list.length == 0) {\\n return new bytes(0);\\n }\\n\\n uint256 len;\\n uint256 i = 0;\\n for (; i < _list.length; i++) {\\n len += _list[i].length;\\n }\\n\\n bytes memory flattened = new bytes(len);\\n uint256 flattenedPtr;\\n assembly { flattenedPtr := add(flattened, 0x20) }\\n\\n for(i = 0; i < _list.length; i++) {\\n bytes memory item = _list[i];\\n\\n uint256 listPtr;\\n assembly { listPtr := add(item, 0x20)}\\n\\n _memcpy(flattenedPtr, listPtr, item.length);\\n flattenedPtr += _list[i].length;\\n }\\n\\n return flattened;\\n }\\n}\",\"keccak256\":\"0xbcb24619c1758cb0d9f3fe5c79495950045a9087046a02b9ce01df46ae09ae5b\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_Bytes32Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_Byte32Utils\\n */\\nlibrary Lib_Bytes32Utils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \\\"true.\\\"\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as a boolean.\\n */\\n function toBool(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return _in != 0;\\n }\\n\\n /**\\n * Converts a boolean to a bytes32 value.\\n * @param _in Input boolean value.\\n * @return Boolean as a bytes32.\\n */\\n function fromBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in ? 1 : 0));\\n }\\n\\n /**\\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as an address.\\n */\\n function toAddress(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return address(uint160(uint256(_in)));\\n }\\n\\n /**\\n * Converts an address to a bytes32.\\n * @param _in Input address value.\\n * @return Address as a bytes32.\\n */\\n function fromAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in));\\n }\\n\\n /**\\n * Removes the leading zeros from a bytes32 value and returns a new (smaller) bytes value.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 without any leading zeros.\\n */\\n function removeLeadingZeros(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out;\\n\\n assembly {\\n // Figure out how many leading zero bytes to remove.\\n let shift := 0\\n for { let i := 0 } and(lt(i, 32), eq(byte(i, _in), 0)) { i := add(i, 1) } {\\n shift := add(shift, 1)\\n }\\n\\n // Reserve some space for our output and fix the free memory pointer.\\n out := mload(0x40)\\n mstore(0x40, add(out, 0x40))\\n\\n // Shift the value and store it into the output bytes.\\n mstore(add(out, 0x20), shl(mul(shift, 8), _in))\\n\\n // Store the new size (with leading zero bytes removed) in the output byte size.\\n mstore(out, sub(32, shift))\\n }\\n\\n return out;\\n }\\n}\\n\",\"keccak256\":\"0xfa2def593e3fc56a31852c3744aefdaa93cec74e721bfcfeb1e5d166c7c60b64\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_BytesUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_BytesUtils\\n */\\nlibrary Lib_BytesUtils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_start + _length >= _start, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n if (_bytes.length - _start == 0) {\\n return bytes('');\\n }\\n\\n return slice(_bytes, _start, _bytes.length - _start);\\n }\\n\\n function toBytes32PadLeft(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes32)\\n {\\n bytes32 ret;\\n uint256 len = _bytes.length <= 32 ? _bytes.length : 32;\\n assembly {\\n ret := shr(mul(sub(32, len), 8), mload(add(_bytes, 32)))\\n }\\n return ret;\\n }\\n\\n function toBytes32(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes32)\\n {\\n if (_bytes.length < 32) {\\n bytes32 ret;\\n assembly {\\n ret := mload(add(_bytes, 32))\\n }\\n return ret;\\n }\\n\\n return abi.decode(_bytes,(bytes32)); // will truncate if input length > 32 bytes\\n }\\n\\n function toUint256(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (uint256)\\n {\\n return uint256(toBytes32(_bytes));\\n }\\n\\n function toUint24(bytes memory _bytes, uint256 _start) internal pure returns (uint24) {\\n require(_start + 3 >= _start, \\\"toUint24_overflow\\\");\\n require(_bytes.length >= _start + 3 , \\\"toUint24_outOfBounds\\\");\\n uint24 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x3), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toUint8(bytes memory _bytes, uint256 _start) internal pure returns (uint8) {\\n require(_start + 1 >= _start, \\\"toUint8_overflow\\\");\\n require(_bytes.length >= _start + 1 , \\\"toUint8_outOfBounds\\\");\\n uint8 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x1), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toAddress(bytes memory _bytes, uint256 _start) internal pure returns (address) {\\n require(_start + 20 >= _start, \\\"toAddress_overflow\\\");\\n require(_bytes.length >= _start + 20, \\\"toAddress_outOfBounds\\\");\\n address tempAddress;\\n\\n assembly {\\n tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000)\\n }\\n\\n return tempAddress;\\n }\\n\\n function toNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n bytes memory nibbles = new bytes(_bytes.length * 2);\\n\\n for (uint256 i = 0; i < _bytes.length; i++) {\\n nibbles[i * 2] = _bytes[i] >> 4;\\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\\n }\\n\\n return nibbles;\\n }\\n\\n function fromNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n bytes memory ret = new bytes(_bytes.length / 2);\\n\\n for (uint256 i = 0; i < ret.length; i++) {\\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\\n }\\n\\n return ret;\\n }\\n\\n function equal(\\n bytes memory _bytes,\\n bytes memory _other\\n )\\n internal\\n pure\\n returns (bool)\\n {\\n return keccak256(_bytes) == keccak256(_other);\\n }\\n}\\n\",\"keccak256\":\"0x0adf22e1b22ba09911e859f64cb3b484e992be4f9fd3b09088e6225bf8d06ce0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_ECDSAUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_ECDSAUtils\\n */\\nlibrary Lib_ECDSAUtils {\\n\\n /**************************************\\n * Internal Functions: ECDSA Recovery *\\n **************************************/\\n\\n /**\\n * Recovers a signed address given a message and signature.\\n * @param _message Message that was originally signed.\\n * @param _isEthSignedMessage Whether or not the user used the `Ethereum Signed Message` prefix.\\n * @param _v Signature `v` parameter.\\n * @param _r Signature `r` parameter.\\n * @param _s Signature `s` parameter.\\n * @return _sender Signer address.\\n */\\n function recover(\\n bytes memory _message,\\n bool _isEthSignedMessage,\\n uint8 _v,\\n bytes32 _r,\\n bytes32 _s\\n )\\n internal\\n pure\\n returns (\\n address _sender\\n )\\n {\\n bytes32 messageHash = getMessageHash(_message, _isEthSignedMessage);\\n\\n return ecrecover(\\n messageHash,\\n _v + 27,\\n _r,\\n _s\\n );\\n }\\n\\n function getMessageHash(\\n bytes memory _message,\\n bool _isEthSignedMessage\\n )\\n internal\\n pure\\n returns (bytes32) {\\n if (_isEthSignedMessage) {\\n return getEthSignedMessageHash(_message);\\n }\\n return getNativeMessageHash(_message);\\n }\\n\\n\\n /*************************************\\n * Private Functions: ECDSA Recovery *\\n *************************************/\\n\\n /**\\n * Gets the native message hash (simple keccak256) for a message.\\n * @param _message Message to hash.\\n * @return _messageHash Native message hash.\\n */\\n function getNativeMessageHash(\\n bytes memory _message\\n )\\n private\\n pure\\n returns (\\n bytes32 _messageHash\\n )\\n {\\n return keccak256(_message);\\n }\\n\\n /**\\n * Gets the hash of a message with the `Ethereum Signed Message` prefix.\\n * @param _message Message to hash.\\n * @return _messageHash Prefixed message hash.\\n */\\n function getEthSignedMessageHash(\\n bytes memory _message\\n )\\n private\\n pure\\n returns (\\n bytes32 _messageHash\\n )\\n {\\n bytes memory prefix = \\\"\\\\x19Ethereum Signed Message:\\\\n32\\\";\\n bytes32 messageHash = keccak256(_message);\\n return keccak256(abi.encodePacked(prefix, messageHash));\\n }\\n}\",\"keccak256\":\"0xda865d8cc014940a4755e329db9c6272a31bd9a340000a4ecc005d46299a585c\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_ErrorUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/**\\n * @title Lib_ErrorUtils\\n */\\nlibrary Lib_ErrorUtils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Encodes an error string into raw solidity-style revert data.\\n * (i.e. ascii bytes, prefixed with bytes4(keccak(\\\"Error(string))\\\"))\\n * Ref: https://docs.soliditylang.org/en/v0.8.2/control-structures.html?highlight=Error(string)#panic-via-assert-and-error-via-require\\n * @param _reason Reason for the reversion.\\n * @return Standard solidity revert data for the given reason.\\n */\\n function encodeRevertString(\\n string memory _reason\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return abi.encodeWithSignature(\\n \\\"Error(string)\\\",\\n _reason\\n );\\n }\\n}\\n\",\"keccak256\":\"0xfc64ec4a81fb50865b502a0004ed154e8598e1a313db77303fc95e41f536e6b7\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_EthUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// @unsupported: ovm\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"./Lib_Bytes32Utils.sol\\\";\\n\\n/**\\n * @title Lib_EthUtils\\n */\\nlibrary Lib_EthUtils {\\n\\n /***********************************\\n * Internal Functions: Code Access *\\n ***********************************/\\n\\n /**\\n * Gets the code for a given address.\\n * @param _address Address to get code for.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return _code Code read from the contract.\\n */\\n function getCode(\\n address _address,\\n uint256 _offset,\\n uint256 _length\\n )\\n internal\\n view\\n returns (\\n bytes memory _code\\n )\\n {\\n assembly {\\n _code := mload(0x40)\\n mstore(0x40, add(_code, add(_length, 0x20)))\\n mstore(_code, _length)\\n extcodecopy(_address, add(_code, 0x20), _offset, _length)\\n }\\n\\n return _code;\\n }\\n\\n /**\\n * Gets the full code for a given address.\\n * @param _address Address to get code for.\\n * @return _code Full code of the contract.\\n */\\n function getCode(\\n address _address\\n )\\n internal\\n view\\n returns (\\n bytes memory _code\\n )\\n {\\n return getCode(\\n _address,\\n 0,\\n getCodeSize(_address)\\n );\\n }\\n\\n /**\\n * Gets the size of a contract's code in bytes.\\n * @param _address Address to get code size for.\\n * @return _codeSize Size of the contract's code in bytes.\\n */\\n function getCodeSize(\\n address _address\\n )\\n internal\\n view\\n returns (\\n uint256 _codeSize\\n )\\n {\\n assembly {\\n _codeSize := extcodesize(_address)\\n }\\n\\n return _codeSize;\\n }\\n\\n /**\\n * Gets the hash of a contract's code.\\n * @param _address Address to get a code hash for.\\n * @return _codeHash Hash of the contract's code.\\n */\\n function getCodeHash(\\n address _address\\n )\\n internal\\n view\\n returns (\\n bytes32 _codeHash\\n )\\n {\\n assembly {\\n _codeHash := extcodehash(_address)\\n }\\n\\n return _codeHash;\\n }\\n\\n\\n /*****************************************\\n * Internal Functions: Contract Creation *\\n *****************************************/\\n\\n /**\\n * Creates a contract with some given initialization code.\\n * @param _code Contract initialization code.\\n * @return _created Address of the created contract.\\n */\\n function createContract(\\n bytes memory _code\\n )\\n internal\\n returns (\\n address _created\\n )\\n {\\n assembly {\\n _created := create(\\n 0,\\n add(_code, 0x20),\\n mload(_code)\\n )\\n }\\n\\n return _created;\\n }\\n\\n /**\\n * Computes the address that would be generated by CREATE.\\n * @param _creator Address creating the contract.\\n * @param _nonce Creator's nonce.\\n * @return _address Address to be generated by CREATE.\\n */\\n function getAddressForCREATE(\\n address _creator,\\n uint256 _nonce\\n )\\n internal\\n pure\\n returns (\\n address _address\\n )\\n {\\n bytes[] memory encoded = new bytes[](2);\\n encoded[0] = Lib_RLPWriter.writeAddress(_creator);\\n encoded[1] = Lib_RLPWriter.writeUint(_nonce);\\n\\n bytes memory encodedList = Lib_RLPWriter.writeList(encoded);\\n return Lib_Bytes32Utils.toAddress(keccak256(encodedList));\\n }\\n\\n /**\\n * Computes the address that would be generated by CREATE2.\\n * @param _creator Address creating the contract.\\n * @param _bytecode Bytecode of the contract to be created.\\n * @param _salt 32 byte salt value mixed into the hash.\\n * @return _address Address to be generated by CREATE2.\\n */\\n function getAddressForCREATE2(\\n address _creator,\\n bytes memory _bytecode,\\n bytes32 _salt\\n )\\n internal\\n pure\\n returns (address _address)\\n {\\n bytes32 hashedData = keccak256(abi.encodePacked(\\n byte(0xff),\\n _creator,\\n _salt,\\n keccak256(_bytecode)\\n ));\\n\\n return Lib_Bytes32Utils.toAddress(hashedData);\\n }\\n}\\n\",\"keccak256\":\"0x5fdf009da11f90cb5e99e5cd160d07bb744a5a2055774a646bdf277ad6910595\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_ErrorUtils } from \\\"../utils/Lib_ErrorUtils.sol\\\";\\n\\n/**\\n * @title Lib_SafeExecutionManagerWrapper\\n * @dev The Safe Execution Manager Wrapper provides functions which facilitate writing OVM safe \\n * code using the standard solidity compiler, by routing all its operations through the Execution \\n * Manager.\\n * \\n * Compiler used: solc\\n * Runtime target: OVM\\n */\\nlibrary Lib_SafeExecutionManagerWrapper {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Performs a safe ovmCALL.\\n * @param _gasLimit Gas limit for the call.\\n * @param _target Address to call.\\n * @param _calldata Data to send to the call.\\n * @return _success Whether or not the call reverted.\\n * @return _returndata Data returned by the call.\\n */\\n function safeCALL(\\n uint256 _gasLimit,\\n address _target,\\n bytes memory _calldata\\n )\\n internal\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCALL(uint256,address,bytes)\\\",\\n _gasLimit,\\n _target,\\n _calldata\\n )\\n );\\n\\n return abi.decode(returndata, (bool, bytes));\\n }\\n\\n /**\\n * Performs a safe ovmDELEGATECALL.\\n * @param _gasLimit Gas limit for the call.\\n * @param _target Address to call.\\n * @param _calldata Data to send to the call.\\n * @return _success Whether or not the call reverted.\\n * @return _returndata Data returned by the call.\\n */\\n function safeDELEGATECALL(\\n uint256 _gasLimit,\\n address _target,\\n bytes memory _calldata\\n )\\n internal\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmDELEGATECALL(uint256,address,bytes)\\\",\\n _gasLimit,\\n _target,\\n _calldata\\n )\\n );\\n\\n return abi.decode(returndata, (bool, bytes));\\n }\\n\\n /**\\n * Performs a safe ovmCREATE call.\\n * @param _gasLimit Gas limit for the creation.\\n * @param _bytecode Code for the new contract.\\n * @return _contract Address of the created contract.\\n */\\n function safeCREATE(\\n uint256 _gasLimit,\\n bytes memory _bytecode\\n )\\n internal\\n returns (\\n address,\\n bytes memory\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n _gasLimit,\\n abi.encodeWithSignature(\\n \\\"ovmCREATE(bytes)\\\",\\n _bytecode\\n )\\n );\\n\\n return abi.decode(returndata, (address, bytes));\\n }\\n\\n /**\\n * Performs a safe ovmEXTCODESIZE call.\\n * @param _contract Address of the contract to query the size of.\\n * @return _EXTCODESIZE Size of the requested contract in bytes.\\n */\\n function safeEXTCODESIZE(\\n address _contract\\n )\\n internal\\n returns (\\n uint256 _EXTCODESIZE\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmEXTCODESIZE(address)\\\",\\n _contract\\n )\\n );\\n\\n return abi.decode(returndata, (uint256));\\n }\\n\\n /**\\n * Performs a safe ovmCHAINID call.\\n * @return _CHAINID Result of calling ovmCHAINID.\\n */\\n function safeCHAINID()\\n internal\\n returns (\\n uint256 _CHAINID\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCHAINID()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (uint256));\\n }\\n\\n /**\\n * Performs a safe ovmCALLER call.\\n * @return _CALLER Result of calling ovmCALLER.\\n */\\n function safeCALLER()\\n internal\\n returns (\\n address _CALLER\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCALLER()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (address));\\n }\\n\\n /**\\n * Performs a safe ovmADDRESS call.\\n * @return _ADDRESS Result of calling ovmADDRESS.\\n */\\n function safeADDRESS()\\n internal\\n returns (\\n address _ADDRESS\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmADDRESS()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (address));\\n }\\n\\n /**\\n * Performs a safe ovmGETNONCE call.\\n * @return _nonce Result of calling ovmGETNONCE.\\n */\\n function safeGETNONCE()\\n internal\\n returns (\\n uint256 _nonce\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmGETNONCE()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (uint256));\\n }\\n\\n /**\\n * Performs a safe ovmINCREMENTNONCE call.\\n */\\n function safeINCREMENTNONCE()\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmINCREMENTNONCE()\\\"\\n )\\n );\\n }\\n\\n /**\\n * Performs a safe ovmCREATEEOA call.\\n * @param _messageHash Message hash which was signed by EOA\\n * @param _v v value of signature (0 or 1)\\n * @param _r r value of signature\\n * @param _s s value of signature\\n */\\n function safeCREATEEOA(\\n bytes32 _messageHash,\\n uint8 _v,\\n bytes32 _r,\\n bytes32 _s\\n )\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCREATEEOA(bytes32,uint8,bytes32,bytes32)\\\",\\n _messageHash,\\n _v,\\n _r,\\n _s\\n )\\n );\\n }\\n\\n /**\\n * Performs a safe REVERT.\\n * @param _reason String revert reason to pass along with the REVERT.\\n */\\n function safeREVERT(\\n string memory _reason\\n )\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmREVERT(bytes)\\\",\\n Lib_ErrorUtils.encodeRevertString(\\n _reason\\n )\\n )\\n );\\n }\\n\\n /**\\n * Performs a safe \\\"require\\\".\\n * @param _condition Boolean condition that must be true or will revert.\\n * @param _reason String revert reason to pass along with the REVERT.\\n */\\n function safeREQUIRE(\\n bool _condition,\\n string memory _reason\\n )\\n internal\\n {\\n if (!_condition) {\\n safeREVERT(\\n _reason\\n );\\n }\\n }\\n\\n /**\\n * Performs a safe ovmSLOAD call.\\n */\\n function safeSLOAD(\\n bytes32 _key\\n )\\n internal\\n returns (\\n bytes32\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmSLOAD(bytes32)\\\",\\n _key\\n )\\n );\\n\\n return abi.decode(returndata, (bytes32));\\n }\\n\\n /**\\n * Performs a safe ovmSSTORE call.\\n */\\n function safeSSTORE(\\n bytes32 _key,\\n bytes32 _value\\n )\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmSSTORE(bytes32,bytes32)\\\",\\n _key,\\n _value\\n )\\n );\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Performs an ovm interaction and the necessary safety checks.\\n * @param _gasLimit Gas limit for the interaction.\\n * @param _calldata Data to send to the OVM_ExecutionManager (encoded with sighash).\\n * @return _returndata Data sent back by the OVM_ExecutionManager.\\n */\\n function _safeExecutionManagerInteraction(\\n uint256 _gasLimit,\\n bytes memory _calldata\\n )\\n private\\n returns (\\n bytes memory _returndata\\n )\\n {\\n address ovmExecutionManager = msg.sender;\\n (\\n bool success,\\n bytes memory returndata\\n ) = ovmExecutionManager.call{gas: _gasLimit}(_calldata);\\n\\n if (success == false) {\\n assembly {\\n revert(add(returndata, 0x20), mload(returndata))\\n }\\n } else if (returndata.length == 1) {\\n assembly {\\n return(0, 1)\\n }\\n } else {\\n return returndata;\\n }\\n }\\n\\n function _safeExecutionManagerInteraction(\\n bytes memory _calldata\\n )\\n private\\n returns (\\n bytes memory _returndata\\n )\\n {\\n return _safeExecutionManagerInteraction(\\n gasleft(),\\n _calldata\\n );\\n }\\n}\\n\",\"keccak256\":\"0x41e146e7912af794a17cd43c5a276674be956bfa8f3ca5b451bcb82d81e6f492\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/wrappers/Lib_SafeMathWrapper.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// Pulled from @openzeppelin/contracts/math/SafeMath.sol\\n// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_SafeExecutionManagerWrapper } from \\\"./Lib_SafeExecutionManagerWrapper.sol\\\";\\n\\n/**\\n * @title Lib_SafeMathWrapper\\n */\\n\\n/**\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\n * checks.\\n *\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\n * in bugs, because programmers usually assume that an overflow raises an\\n * error, which is the standard behavior in high level programming languages.\\n * `SafeMath` restores this intuition by reverting the transaction when an\\n * operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n */\\n\\nlibrary Lib_SafeMathWrapper {\\n /**\\n * @dev Returns the addition of two unsigned integers, reverting on\\n * overflow.\\n *\\n * Counterpart to Solidity's `+` operator.\\n *\\n * Requirements:\\n *\\n * - Addition cannot overflow.\\n */\\n function add(uint256 a, uint256 b) internal returns (uint256) {\\n uint256 c = a + b;\\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(c >= a, \\\"Lib_SafeMathWrapper: addition overflow\\\");\\n\\n return c;\\n }\\n\\n /**\\n * @dev Returns the subtraction of two unsigned integers, reverting on\\n * overflow (when the result is negative).\\n *\\n * Counterpart to Solidity's `-` operator.\\n *\\n * Requirements:\\n *\\n * - Subtraction cannot overflow.\\n */\\n function sub(uint256 a, uint256 b) internal returns (uint256) {\\n return sub(a, b, \\\"Lib_SafeMathWrapper: subtraction overflow\\\");\\n }\\n\\n /**\\n * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\n * overflow (when the result is negative).\\n *\\n * Counterpart to Solidity's `-` operator.\\n *\\n * Requirements:\\n *\\n * - Subtraction cannot overflow.\\n */\\n function sub(uint256 a, uint256 b, string memory errorMessage) internal returns (uint256) {\\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(b <= a, errorMessage);\\n uint256 c = a - b;\\n\\n return c;\\n }\\n\\n /**\\n * @dev Returns the multiplication of two unsigned integers, reverting on\\n * overflow.\\n *\\n * Counterpart to Solidity's `*` operator.\\n *\\n * Requirements:\\n *\\n * - Multiplication cannot overflow.\\n */\\n function mul(uint256 a, uint256 b) internal returns (uint256) {\\n // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\n // benefit is lost if 'b' is also tested.\\n // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\n if (a == 0) {\\n return 0;\\n }\\n\\n uint256 c = a * b;\\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(c / a == b, \\\"Lib_SafeMathWrapper: multiplication overflow\\\");\\n\\n return c;\\n }\\n\\n /**\\n * @dev Returns the integer division of two unsigned integers. Reverts on\\n * division by zero. The result is rounded towards zero.\\n *\\n * Counterpart to Solidity's `/` operator. Note: this function uses a\\n * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n * uses an invalid opcode to revert (consuming all remaining gas).\\n *\\n * Requirements:\\n *\\n * - The divisor cannot be zero.\\n */\\n function div(uint256 a, uint256 b) internal returns (uint256) {\\n return div(a, b, \\\"Lib_SafeMathWrapper: division by zero\\\");\\n }\\n\\n /**\\n * @dev Returns the integer division of two unsigned integers. Reverts with custom message on\\n * division by zero. The result is rounded towards zero.\\n *\\n * Counterpart to Solidity's `/` operator. Note: this function uses a\\n * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n * uses an invalid opcode to revert (consuming all remaining gas).\\n *\\n * Requirements:\\n *\\n * - The divisor cannot be zero.\\n */\\n function div(uint256 a, uint256 b, string memory errorMessage) internal returns (uint256) {\\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(b > 0, errorMessage);\\n uint256 c = a / b;\\n // assert(a == b * c + a % b); // There is no case in which this doesn't hold\\n\\n return c;\\n }\\n\\n /**\\n * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n * Reverts when dividing by zero.\\n *\\n * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n * opcode (which leaves remaining gas untouched) while Solidity uses an\\n * invalid opcode to revert (consuming all remaining gas).\\n *\\n * Requirements:\\n *\\n * - The divisor cannot be zero.\\n */\\n function mod(uint256 a, uint256 b) internal returns (uint256) {\\n return mod(a, b, \\\"Lib_SafeMathWrapper: modulo by zero\\\");\\n }\\n\\n /**\\n * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n * Reverts with custom message when dividing by zero.\\n *\\n * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n * opcode (which leaves remaining gas untouched) while Solidity uses an\\n * invalid opcode to revert (consuming all remaining gas).\\n *\\n * Requirements:\\n *\\n * - The divisor cannot be zero.\\n */\\n function mod(uint256 a, uint256 b, string memory errorMessage) internal returns (uint256) {\\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(b != 0, errorMessage);\\n return a % b;\\n }\\n}\",\"keccak256\":\"0xc58aa064894677f65fc8205f79252d15e59a0f5e2794e5c2d069c7b2bc97a9e2\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x60806040523480156200001157600080fd5b5060405162003cdf38038062003cdf833981016040819052620000349162000292565b600080546001600160a01b0319166001600160a01b03851617905560408051808201909152601181527027ab26afa9b0b332ba3ca1b432b1b5b2b960791b60208201526200008290620000d7565b600180546001600160a01b0319166001600160a01b039290921691909117905581516003556020820151600455604082015160055560608201516006558051600755620000ce620001b9565b50505062000337565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b83811015620001395781810151838201526020016200011f565b50505050905090810190601f168015620001675780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b1580156200018557600080fd5b505afa1580156200019a573d6000803e3d6000fd5b505050506040513d6020811015620001b157600080fd5b505192915050565b600d80546001600160a01b031990811673defa017defa017defa017defa017defa017defa09081179092557fdefa017defa017defa017defa017defa017defa017defa017defa017defa017d6009819055600a819055600b819055600c8190556008805460ff191690556010819055600e8054831684179055600f8054831690931760ff60a01b1916909255601191909155600280549091169055565b60006020828403121562000268578081fd5b604051602081016001600160401b03811182821017156200028557fe5b6040529151825250919050565b600080600083850360c0811215620002a8578384fd5b84516001600160a01b0381168114620002bf578485fd5b93506080601f1982011215620002d3578283fd5b50604051608081016001600160401b0381118282101715620002f157fe5b806040525060208501518152604085015160208201526060850151604082015260808501516060820152809250506200032e8560a0860162000256565b90509250925092565b61399880620003476000396000f3fe60806040523480156200001157600080fd5b5060043610620001f05760003560e01c80637cebbe94116200011157806399ccd98b11620000a5578063bdbf8c36116200007b578063bdbf8c361462000402578063c1fb2ea2146200040c578063fcb6829b1462000416578063ffe73914146200042d57620001f0565b806399ccd98b14620003ca5780639be3ad6714620003e15780639dc9dc9314620003f857620001f0565b806385979f7611620000e757806385979f7614620003885780638bb42e15146200039f5780639058025614620003b6578063996d79a514620003c057620001f0565b80637cebbe9414620003405780638435035b146200034a5780638540661f146200036157620001f0565b8063299ca47811620001895780635a98c361116200015f5780635a98c36114620002ef5780637350906414620002f9578063741a33eb1462000303578063746c32f1146200031a57620001f0565b8063299ca47814620002a85780632a2a7adb14620002c1578063461a447814620002d857620001f0565b80631c4712a711620001cb5780631c4712a7146200026457806320160f3a146200026e57806322bd64c0146200027857806324749d5c146200029157620001f0565b806303daa95914620001f5578063101185a4146200022457806314aa2ff7146200023d575b600080fd5b6200020c620002063660046200287b565b62000444565b6040516200021b919062002cd8565b60405180910390f35b6200022e6200048e565b6040516200021b919062002dc9565b620002546200024e36600462002912565b62000497565b6040516200021b92919062002d53565b6200020c6200053e565b6200020c62000544565b6200028f62000289366004620028ad565b6200054a565b005b6200020c620002a2366004620027e4565b620005b5565b620002b2620005d4565b6040516200021b919062002ce1565b6200028f620002d236600462002912565b620005e3565b620002b2620002e936600462002a3d565b620005f3565b6200020c620006d5565b620002b2620006db565b6200028f62000314366004620028cf565b620006ea565b620003316200032b36600462002822565b62000875565b6040516200021b919062002db4565b6200028f620008ae565b6200020c6200035b366004620027e4565b6200090f565b620003786200037236600462002b45565b62000926565b6040516200021b92919062002d79565b620003786200039936600462002b45565b620009a3565b62000378620003b036600462002adc565b620009f4565b6200020c62000ad4565b620002b262000ada565b62000254620003db36600462002950565b62000ae9565b6200028f620003f236600462002a87565b62000b89565b620002b262000cd3565b6200020c62000ce2565b6200020c62000ce8565b6200028f6200042736600462002ba1565b62000d03565b620003786200043e36600462002b45565b62000f18565b6000619c4060005a905060006200045a62000ada565b905062000468818662000f6b565b93505060005a82039050808310156200048657601080548483030190555b505050919050565b60085460ff1690565b600f5460009060609060ff600160a01b90910416151560011415620004c257620004c260066200100a565b619c4060005a90506000620004d662000ada565b9050620004e38162001025565b6000620004fb82620004f584620010b4565b62001147565b9050620005098188620011e3565b95509550505060005a82039050808310156200052d57601080548401905562000536565b60108054820190555b505050915091565b60045490565b600b5490565b600f5460ff600160a01b909104161515600114156200056f576200056f60066200100a565b61ea6060005a905060006200058362000ada565b90506200059281868662001274565b5060005a8203905080831015620005ae57601080548483030190555b5050505050565b6000620005cc620005c68362001300565b62001393565b90505b919050565b6000546001600160a01b031681565b620005f060018262001397565b50565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b83811015620006555781810151838201526020016200063b565b50505050905090810190601f168015620006835780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b158015620006a157600080fd5b505afa158015620006b6573d6000803e3d6000fd5b505050506040513d6020811015620006cd57600080fd5b505192915050565b600a5490565b600e546001600160a01b031690565b600f5460ff600160a01b909104161515600114156200070f576200070f60066200100a565b600060018585601b0185856040516000815260200160405260405162000739949392919062002d96565b6020604051602081039080840390855afa1580156200075c573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166200079c576200079c6040518060600160405280603881526020016200387a60389139620005e3565b620007a781620013af565b620007b357506200086f565b620007be8162001442565b600f80546001600160a01b038381166001600160a01b03198316179092556040519116906000906003602160991b0190620007f990620026af565b62000805919062002ce1565b604051809103906000f08015801562000822573d6000803e3d6000fd5b50600f80546001600160a01b0319166001600160a01b03851617905590506200085e83826200085181620014af565b80519060200120620014c9565b6200086b8360006200150a565b5050505b50505050565b60606000826001146200088957826200088c565b60025b9050620008a56200089d8662001300565b858362001581565b95945050505050565b600f5460ff600160a01b90910416151560011415620008d357620008d360066200100a565b6000620008df62000ada565b90506000620008ee82620010b4565b9050808160010111156200090b576200090b82826001016200150a565b5050565b6000620005cc620009208362001300565b620015a3565b600060606201388060005a60408051606081018252600f546001600160a01b039081168252891660208201526001918101919091529091506200096c81898989620015a7565b945094505060005a82039050808310156200098f57601080548401905562000998565b60108054820190555b505050935093915050565b60006060620186a060005a60408051606081018252600f5460ff600160a01b8204161515928201929092526001600160a01b03918216815290881660208201529091506200096c81898989620015a7565b60006060331562000a0457600080fd5b600280546001600160a01b0319166001600160a01b03851617905562000a2a8562001640565b600019601155600f80546001600160a01b0319166001600160a01b038681169190911790915560808601511615801562000aad5760008062000a708860c0015162000497565b90925090506001600160a01b03821662000a935760009450925062000acc915050565b600162000aa083620014af565b9450945050505062000acc565b62000ac68660a0015187608001518860c00151620009a3565b92509250505b935093915050565b60075490565b600f546001600160a01b031690565b600f5460009060609060ff600160a01b9091041615156001141562000b145762000b1460066200100a565b619c4060005a9050600062000b2862000ada565b905062000b358162001025565b600062000b44828989620016b5565b905062000b528189620011e3565b95509550505060005a820390508083101562000b7657601080548401905562000b7f565b60108054820190555b5050509250929050565b600a547fdefa017defa017defa017defa017defa017defa017defa017defa017defa017d1462000bb9576200090b565b600280546001600160a01b0319166001600160a01b038381169190911791829055604051630d15d41560e41b815291169063d15d41509062000c0090339060040162002ce1565b60206040518083038186803b15801562000c1957600080fd5b505afa15801562000c2e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000c54919062002859565b62000c7c5760405162461bcd60e51b815260040162000c739062002e4e565b60405180910390fd5b62000c878262001640565b62000c9282620016ff565b62000ca75762000ca162001761565b6200090b565b62000cc76003600001548360a001510383608001518460c00151620009a3565b50506200090b62001761565b600d546001600160a01b031690565b60095490565b600062000cfe62000cf862000ada565b620010b4565b905090565b33301462000d115762000f13565b62000d1c81620013af565b62000d515762000d51600562000d4b6040518060600160405280603481526020016200392860349139620017fe565b62001397565b6001546040516352275acd60e11b81526001600160a01b039091169063a44eb59a9062000d8390859060040162002db4565b60206040518083038186803b15801562000d9c57600080fd5b505afa15801562000db1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000dd7919062002859565b62000e065762000e06600462000d4b6040518060a0016040528060768152602001620038b260769139620017fe565b62000e118162001442565b600062000e1e8362001843565b90506001600160a01b03811662000e39573d6000803e3d6000fd5b600062000e4682620014af565b6001546040516352275acd60e11b81529192506001600160a01b03169063a44eb59a9062000e7990849060040162002db4565b60206040518083038186803b15801562000e9257600080fd5b505afa15801562000ea7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000ecd919062002859565b62000efc5762000efc600462000d4b6040518060600160405280603081526020016200395c60309139620017fe565b620005ae838362000f0d8562001393565b620014c9565b505050565b60006060619c4060005a60408051606081018252600e546001600160a01b039081168252600f549081166020830152600160a01b900460ff161515918101919091529091506200096c81898989620015a7565b600062000f79838362001854565b600254604051631aaf392f60e01b81526001600160a01b0390911690631aaf392f9062000fad908690869060040162002d19565b60206040518083038186803b15801562000fc657600080fd5b505afa15801562000fdb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001001919062002894565b90505b92915050565b620005f0816040518060200160405280600081525062001397565b600080620010785a6002602160991b018560405160240162001048919062002ce1565b60408051601f198184030181529190526020810180516001600160e01b031663b1540a0160e01b179052620009a3565b9150915060008180602001905181019062001094919062002859565b9050801580620010a2575082155b156200086f576200086f60076200100a565b6000620010c182620019a4565b60025460405163d126199f60e01b81526001600160a01b039091169063d126199f90620010f390859060040162002ce1565b60206040518083038186803b1580156200110c57600080fd5b505afa15801562001121573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620005cc919062002894565b60408051600280825260608201909252600091829190816020015b606081526020019060019003908162001162579050509050620011858462001b03565b816000815181106200119357fe5b6020026020010181905250620011a98362001b31565b81600181518110620011b757fe5b60200260200101819052506000620011cf8262001b48565b9050620008a5818051906020012062001b92565b600060606200120c620011f562000ada565b6200120362000cf862000ada565b6001016200150a565b60408051606081018252600f5460ff600160a01b8204161515928201929092526001600160a01b039182168152908516602082015260008062001254835a8989600162001b95565b91509150816200126657600062001268565b865b97909650945050505050565b8062001281848462000f6b565b14156200128e5762000f13565b6200129a838362001e28565b600254604051635c17d62960e01b81526001600160a01b0390911690635c17d62990620012d09086908690869060040162002d32565b600060405180830381600087803b158015620012eb57600080fd5b505af11580156200086b573d6000803e3d6000fd5b60006200130d82620019a4565b600254604051637c8ee70360e01b81526001600160a01b0390911690637c8ee703906200133f90859060040162002ce1565b60206040518083038186803b1580156200135857600080fd5b505afa1580156200136d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620005cc919062002803565b3f90565b6000620013a5838362001f49565b9050805160208201fd5b6000620013bc82620019a4565b6002546040516307a1294560e01b81526001600160a01b03909116906307a1294590620013ee90859060040162002ce1565b60206040518083038186803b1580156200140757600080fd5b505afa1580156200141c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620005cc919062002859565b6200144d81620019a4565b600254604051637e78a4d160e11b81526001600160a01b039091169063fcf149a2906200147f90849060040162002ce1565b600060405180830381600087803b1580156200149a57600080fd5b505af1158015620005ae573d6000803e3d6000fd5b6060620005cc826000620014c385620015a3565b62001581565b620014d48362001ffc565b6002546040516368510af960e11b81526001600160a01b039091169063d0a215f290620012d09086908690869060040162002cf5565b620015158262001ffc565b6002546040516374855dc360e11b81526001600160a01b039091169063e90abb869062001549908590859060040162002d19565b600060405180830381600087803b1580156200156457600080fd5b505af115801562001579573d6000803e3d6000fd5b505050505050565b60606040519050602082018101604052818152818360208301863c9392505050565b3b90565b6000606073ffffffffffffffffffffffffffffffffffff0000841673deaddeaddeaddeaddeaddeaddeaddeaddead00001415620015f857505060408051602081019091526000815260019062001637565b60006064856001600160a01b0316106200161d57620016178562001300565b6200161f565b845b90506200163187878387600062001b95565b92509250505b94509492505050565b80516009556020810151600a5560a0810151600c5560408101516008805460ff1916600183818111156200167057fe5b02179055506060810151600d80546001600160a01b0319166001600160a01b03909216919091179055600554600b5560a0810151620016af906200211a565b60115550565b60008060ff60f81b85848680519060200120604051602001620016dc949392919062002c4e565b604051602081830303815290604052805190602001209050620008a58162001b92565b60007fdefa017defa017defa017defa017defa017defa017defa017defa017defa017d826020015114156200173757506000620005cf565b6200174b8260a0015183604001516200212f565b6200175957506000620005cf565b506001919050565b600d80546001600160a01b031990811673defa017defa017defa017defa017defa017defa09081179092557fdefa017defa017defa017defa017defa017defa017defa017defa017defa017d6009819055600a819055600b819055600c8190556008805460ff191690556010819055600e8054831684179055600f8054831690931760ff60a01b1916909255601191909155600280549091169055565b60608160405160240162001813919062002db4565b60408051601f198184030181529190526020810180516001600160e01b031662461bcd60e51b1790529050919050565b60008151602083016000f092915050565b6175305a10156200186b576200186b60006200100a565b600254604051630ad2267960e01b81526001600160a01b0390911690630ad22679906200189f908590859060040162002d19565b60206040518083038186803b158015620018b857600080fd5b505afa158015620018cd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620018f3919062002859565b62001904576200190460036200100a565b600254604051632bcdee1960e21b81526000916001600160a01b03169063af37b8649062001939908690869060040162002d19565b602060405180830381600087803b1580156200195457600080fd5b505af115801562001969573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200198f919062002859565b90508062000f135762000f13614e2062002163565b6175305a1015620019bb57620019bb60006200100a565b60025460405163c8e40fbf60e01b81526001600160a01b039091169063c8e40fbf90620019ed90849060040162002ce1565b60206040518083038186803b15801562001a0657600080fd5b505afa15801562001a1b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001a41919062002859565b62001a525762001a5260036200100a565b600254604051633ecdecc760e21b81526000916001600160a01b03169063fb37b31c9062001a8590859060040162002ce1565b602060405180830381600087803b15801562001aa057600080fd5b505af115801562001ab5573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001adb919062002859565b9050806200090b576200090b617530606462001afb620009208662001300565b020162002163565b6060620005cc8260405160200162001b1c919062002c31565b60405160208183030381529060405262002186565b6060620005cc62001b4283620021e0565b62002186565b6060600062001b5783620022f1565b905062001b67815160c0620023fe565b8160405160200162001b7b92919062002ca5565b604051602081830303815290604052915050919050565b90565b6040805160608082018352600e546001600160a01b039081168352600f549081166020840152600160a01b900460ff161515928201929092526000919062001bde81896200255b565b601154600062001bee896200211a565b6011819055905060006060871562001cb257604051309063fcb6829b60e01b9062001c22908e908d908f9060240162002eba565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b031990941693909317909252905162001c62919062002c87565b6000604051808303816000865af19150503d806000811462001ca1576040519150601f19603f3d011682016040523d82523d6000602084013e62001ca6565b606091505b50909250905062001d19565b896001600160a01b03168b8a60405162001ccd919062002c87565b60006040518083038160008787f1925050503d806000811462001d0d576040519150601f19603f3d011682016040523d82523d6000602084013e62001d12565b606091505b5090925090505b62001d258c866200255b565b6011548262001e105760008060008062001d3f8662002612565b92965090945092509050600384600781111562001d5857fe5b141562001d6a5762001d6a846200100a565b600184600781111562001d7957fe5b148062001d925750600484600781111562001d9057fe5b145b8062001daa5750600684600781111562001da857fe5b145b8062001dc25750600784600781111562001dc057fe5b145b1562001dce5760108290555b600184600781111562001ddd57fe5b148062001de757508c5b1562001df65780955062001e09565b6040518060200160405280600081525095505b5090925050505b90920390920360115590999098509650505050505050565b62001e34828262001854565b60025460405163af3dc01160e01b81526000916001600160a01b03169063af3dc0119062001e69908690869060040162002d19565b602060405180830381600087803b15801562001e8457600080fd5b505af115801562001e99573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001ebf919062002859565b90508062000f135762001ed28362001ffc565b600260009054906101000a90046001600160a01b03166001600160a01b031663c3fd9b256040518163ffffffff1660e01b8152600401600060405180830381600087803b15801562001f2357600080fd5b505af115801562001f38573d6000803e3d6000fd5b5050505062000f13614e2062002163565b6060600083600781111562001f5a57fe5b141562001f77575060408051602081019091526000815262001004565b600383600781111562001f8657fe5b141562001fc85760408051602080820183526000808352925162001fb1938793909283920162002dde565b604051602081830303815290604052905062001004565b60115460105460405162001fe59286929091869060200162002e1e565b604051602081830303815290604052905092915050565b6200200781620019a4565b60025460405163011b1f7960e41b81526000916001600160a01b0316906311b1f790906200203a90859060040162002ce1565b602060405180830381600087803b1580156200205557600080fd5b505af11580156200206a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062002090919062002859565b9050806200090b57600260009054906101000a90046001600160a01b03166001600160a01b03166333f943056040518163ffffffff1660e01b8152600401600060405180830381600087803b158015620020e957600080fd5b505af1158015620020fe573d6000803e3d6000fd5b505050506200090b617530606462001afb620009208662001300565b60005a82106200212b575a620005cc565b5090565b600454600090831115620021465750600062001004565b6003548310156200215a5750600062001004565b50600192915050565b6011548111156200217a576200217a60026200100a565b60118054919091039055565b60608082516001148015620021b05750608083600081518110620021a657fe5b016020015160f81c105b15620021be575081620005cc565b620021cc83516080620023fe565b8360405160200162001fe592919062002ca5565b6060600082604051602001620021f7919062002cd8565b604051602081830303815290604052905060005b602081101562002246578181815181106200222257fe5b01602001516001600160f81b031916156200223d5762002246565b6001016200220b565b6000816020036001600160401b03811180156200226257600080fd5b506040519080825280601f01601f1916602001820160405280156200228e576020820181803683370190505b50905060005b8151811015620022e8578351600184019385918110620022b057fe5b602001015160f81c60f81b828281518110620022c857fe5b60200101906001600160f81b031916908160001a90535060010162002294565b50949350505050565b6060815160001415620023145750604080516000815260208101909152620005cf565b6000805b83518110156200234a578381815181106200232f57fe5b60200260200101515182019150808060010191505062002318565b6000826001600160401b03811180156200236357600080fd5b506040519080825280601f01601f1916602001820160405280156200238f576020820181803683370190505b50600092509050602081015b8551831015620022e8576000868481518110620023b457fe5b602002602001015190506000602082019050620023d48382845162002669565b878581518110620023e157fe5b60200260200101515183019250505082806001019350506200239b565b60608060388410156200245b576040805160018082528183019092529060208201818036833701905050905082840160f81b816000815181106200243e57fe5b60200101906001600160f81b031916908160001a90535062001001565b600060015b8086816200246a57fe5b041562002481576001909101906101000262002460565b816001016001600160401b03811180156200249b57600080fd5b506040519080825280601f01601f191660200182016040528015620024c7576020820181803683370190505b50925084820160370160f81b83600081518110620024e157fe5b60200101906001600160f81b031916908160001a905350600190505b81811162002552576101008183036101000a87816200251857fe5b04816200252157fe5b0660f81b8382815181106200253257fe5b60200101906001600160f81b031916908160001a905350600101620024fd565b50509392505050565b805182516001600160a01b0390811691161462002594578051600e80546001600160a01b0319166001600160a01b039092169190911790555b80602001516001600160a01b031682602001516001600160a01b031614620025db576020810151600f80546001600160a01b0319166001600160a01b039092169190911790555b8060400151151582604001511515146200090b5760400151600f8054911515600160a01b0260ff60a01b1990921691909117905550565b6000806000606084516000141562002643575050604080516020810190915260008082529250829150819062002662565b8480602001905181019062002659919062002996565b93509350935093505b9193509193565b8282825b602081106200268e578151835260209283019290910190601f19016200266d565b905182516020929092036101000a6000190180199091169116179052505050565b6109018062002f7983390190565b6000620026d4620026ce8462002f11565b62002eed565b9050828152838383011115620026e957600080fd5b828260208301376000602084830101529392505050565b8035620005cf8162002f62565b600082601f8301126200271e578081fd5b6200100183833560208501620026bd565b803560028110620005cf57600080fd5b600060e0828403121562002751578081fd5b6200275d60e062002eed565b905081358152602082013560208201526200277b604083016200272f565b60408201526200278e6060830162002700565b6060820152620027a16080830162002700565b608082015260a082013560a082015260c08201356001600160401b03811115620027ca57600080fd5b620027d8848285016200270d565b60c08301525092915050565b600060208284031215620027f6578081fd5b8135620010018162002f62565b60006020828403121562002815578081fd5b8151620010018162002f62565b60008060006060848603121562002837578182fd5b8335620028448162002f62565b95602085013595506040909401359392505050565b6000602082840312156200286b578081fd5b8151801515811462001001578182fd5b6000602082840312156200288d578081fd5b5035919050565b600060208284031215620028a6578081fd5b5051919050565b60008060408385031215620028c0578182fd5b50508035926020909101359150565b60008060008060808587031215620028e5578081fd5b84359350602085013560ff81168114620028fd578182fd5b93969395505050506040820135916060013590565b60006020828403121562002924578081fd5b81356001600160401b038111156200293a578182fd5b62002948848285016200270d565b949350505050565b6000806040838503121562002963578182fd5b82356001600160401b0381111562002979578283fd5b62002987858286016200270d565b95602094909401359450505050565b60008060008060808587031215620029ac578182fd5b845160088110620029bb578283fd5b80945050602085015192506040850151915060608501516001600160401b03811115620029e6578182fd5b8501601f81018713620029f7578182fd5b805162002a08620026ce8262002f11565b81815288602083850101111562002a1d578384fd5b62002a3082602083016020860162002f33565b9598949750929550505050565b60006020828403121562002a4f578081fd5b81356001600160401b0381111562002a65578182fd5b8201601f8101841362002a76578182fd5b6200294884823560208401620026bd565b6000806040838503121562002a9a578182fd5b82356001600160401b0381111562002ab0578283fd5b62002abe858286016200273f565b925050602083013562002ad18162002f62565b809150509250929050565b60008060006060848603121562002af1578081fd5b83356001600160401b0381111562002b07578182fd5b62002b15868287016200273f565b935050602084013562002b288162002f62565b9150604084013562002b3a8162002f62565b809150509250925092565b60008060006060848603121562002b5a578081fd5b83359250602084013562002b6e8162002f62565b915060408401356001600160401b0381111562002b89578182fd5b62002b97868287016200270d565b9150509250925092565b60008060006060848603121562002bb6578081fd5b8335925060208401356001600160401b0381111562002bd3578182fd5b62002be1868287016200270d565b925050604084013562002b3a8162002f62565b6000815180845262002c0e81602086016020860162002f33565b601f01601f19169290920160200192915050565b6008811062002c2d57fe5b9052565b60609190911b6bffffffffffffffffffffffff1916815260140190565b6001600160f81b031994909416845260609290921b6bffffffffffffffffffffffff191660018401526015830152603582015260550190565b6000825162002c9b81846020870162002f33565b9190910192915050565b6000835162002cb981846020880162002f33565b83519083019062002ccf81836020880162002f33565b01949350505050565b90815260200190565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039390931683526020830191909152604082015260600190565b6001600160a01b0383168152604060208201819052600090620029489083018462002bf4565b600083151582526040602083015262002948604083018462002bf4565b93845260ff9290921660208401526040830152606082015260800190565b60006020825262001001602083018462002bf4565b602081016002831062002dd857fe5b91905290565b600062002dec828762002c22565b60ff8516602083015260ff841660408301526080606083015262002e14608083018462002bf4565b9695505050505050565b600062002e2c828762002c22565b8460208301528360408301526080606083015262002e14608083018462002bf4565b60208082526046908201527f4f6e6c792061757468656e746963617465642061646472657373657320696e2060408201527f6f766d53746174654d616e616765722063616e2063616c6c20746869732066756060820152653731ba34b7b760d11b608082015260a00190565b60008482526060602083015262002ed5606083018562002bf4565b905060018060a01b0383166040830152949350505050565b6040518181016001600160401b038111828210171562002f0957fe5b604052919050565b60006001600160401b0382111562002f2557fe5b50601f01601f191660200190565b60005b8381101562002f5057818101518382015260200162002f36565b838111156200086f5750506000910152565b6001600160a01b0381168114620005f057600080fdfe608060405234801561001057600080fd5b506040516109013803806109018339818101604052602081101561003357600080fd5b505161003e81610044565b506101d9565b61008d7fdeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddead60001b61007e8361009060201b6103ca1760201c565b61009c60201b6103d61760201c565b50565b6001600160a01b031690565b604080516024810184905260448082018490528251808303909101815260649091019091526020810180516001600160e01b03908116628af59360e61b179091526100e891906100ed16565b505050565b60606100f95a836100ff565b92915050565b60606000339050600080826001600160a01b031686866040518082805190602001908083835b602083106101445780518252601f199092019160209182019101610125565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038160008787f1925050503d80600081146101a7576040519150601f19603f3d011682016040523d82523d6000602084013e6101ac565b606091505b509092509050816101bf57805160208201fd5b8051600114156101cf5760016000f35b92506100f9915050565b610719806101e86000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c80630900f010146100a1578063aaf10f42146100c9575b6000806100825a6100456100ed565b6000368080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061012592505050565b91509150811561009457805160208201f35b61009d816102c8565b5050005b6100c7600480360360208110156100b757600080fd5b50356001600160a01b031661037a565b005b6100d16100ed565b604080516001600160a01b039092168252519081900360200190f35b600061012061011b7fdeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddead610422565b610488565b905090565b6000606060006101ed86868660405160240180848152602001836001600160a01b0316815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561018657818101518382015260200161016e565b50505050905090810190601f1680156101b35780820380516001836020036101000a031916815260200191505b5060408051601f198184030181529190526020810180516001600160e01b03166001620631bb60e21b0319179052945061048b9350505050565b905080806020019051604081101561020457600080fd5b81516020830180516040519294929383019291908464010000000082111561022b57600080fd5b90830190602082018581111561024057600080fd5b825164010000000081118282018810171561025a57600080fd5b82525081516020918201929091019080838360005b8381101561028757818101518382015260200161026f565b50505050905090810190601f1680156102b45780820380516001836020036101000a031916815260200191505b506040525050509250925050935093915050565b6103766102d48261049d565b6040516024018080602001828103825283818151815260200191508051906020019080838360005b838110156103145781810151838201526020016102fc565b50505050905090810190601f1680156103415780820380516001836020036101000a031916815260200191505b5060408051601f198184030181529190526020810180516001600160e01b0316632a2a7adb60e01b179052925061048b915050565b5050565b6103be6103856104e0565b6001600160a01b0316610396610536565b6001600160a01b0316146040518060600160405280603281526020016106db6032913961056d565b6103c78161057b565b50565b6001600160a01b031690565b604080516024810184905260448082018490528251808303909101815260649091019091526020810180516001600160e01b0316628af59360e61b17905261041d9061048b565b505050565b6040805160248082018490528251808303909101815260449091019091526020810180516001600160e01b03166303daa95960e01b17905260009081906104689061048b565b905080806020019051602081101561047f57600080fd5b50519392505050565b90565b60606104975a836105ad565b92915050565b6060816040516024016104b09190610687565b60408051601f198184030181529190526020810180516001600160e01b031662461bcd60e51b1790529050919050565b6040805160048152602481019091526020810180516001600160e01b0316631cd4241960e21b17905260009081906105179061048b565b905080806020019051602081101561052e57600080fd5b505191505090565b6040805160048152602481019091526020810180516001600160e01b031663996d79a560e01b17905260009081906105179061048b565b8161037657610376816102c8565b6103c77fdeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddead6105a8836103ca565b6103d6565b60606000339050600080826001600160a01b031686866040518082805190602001908083835b602083106105f25780518252601f1990920191602091820191016105d3565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038160008787f1925050503d8060008114610655576040519150601f19603f3d011682016040523d82523d6000602084013e61065a565b606091505b5090925090508161066d57805160208201fd5b80516001141561067d5760016000f35b9250610497915050565b6000602080835283518082850152825b818110156106b357858101830151858201604001528201610697565b818111156106c45783604083870101525b50601f01601f191692909201604001939250505056fe454f41732063616e206f6e6c792075706772616465207468656972206f776e20454f4120696d706c656d656e746174696f6ea164736f6c6343000706000a5369676e61747572652070726f766964656420666f7220454f4120636f6e7472616374206372656174696f6e20697320696e76616c69642e436f6e7472616374206372656174696f6e20636f646520636f6e7461696e7320756e73616665206f70636f6465732e2044696420796f75207573652074686520726967687420636f6d70696c6572206f72207061737320616e20756e7361666520636f6e7374727563746f7220617267756d656e743f4120636f6e74726163742068617320616c7265616479206265656e206465706c6f79656420746f20746869732061646472657373436f6e7374727563746f7220617474656d7074656420746f206465706c6f7920756e736166652062797465636f64652ea164736f6c6343000706000a", - "deployedBytecode": "0x60806040523480156200001157600080fd5b5060043610620001f05760003560e01c80637cebbe94116200011157806399ccd98b11620000a5578063bdbf8c36116200007b578063bdbf8c361462000402578063c1fb2ea2146200040c578063fcb6829b1462000416578063ffe73914146200042d57620001f0565b806399ccd98b14620003ca5780639be3ad6714620003e15780639dc9dc9314620003f857620001f0565b806385979f7611620000e757806385979f7614620003885780638bb42e15146200039f5780639058025614620003b6578063996d79a514620003c057620001f0565b80637cebbe9414620003405780638435035b146200034a5780638540661f146200036157620001f0565b8063299ca47811620001895780635a98c361116200015f5780635a98c36114620002ef5780637350906414620002f9578063741a33eb1462000303578063746c32f1146200031a57620001f0565b8063299ca47814620002a85780632a2a7adb14620002c1578063461a447814620002d857620001f0565b80631c4712a711620001cb5780631c4712a7146200026457806320160f3a146200026e57806322bd64c0146200027857806324749d5c146200029157620001f0565b806303daa95914620001f5578063101185a4146200022457806314aa2ff7146200023d575b600080fd5b6200020c620002063660046200287b565b62000444565b6040516200021b919062002cd8565b60405180910390f35b6200022e6200048e565b6040516200021b919062002dc9565b620002546200024e36600462002912565b62000497565b6040516200021b92919062002d53565b6200020c6200053e565b6200020c62000544565b6200028f62000289366004620028ad565b6200054a565b005b6200020c620002a2366004620027e4565b620005b5565b620002b2620005d4565b6040516200021b919062002ce1565b6200028f620002d236600462002912565b620005e3565b620002b2620002e936600462002a3d565b620005f3565b6200020c620006d5565b620002b2620006db565b6200028f62000314366004620028cf565b620006ea565b620003316200032b36600462002822565b62000875565b6040516200021b919062002db4565b6200028f620008ae565b6200020c6200035b366004620027e4565b6200090f565b620003786200037236600462002b45565b62000926565b6040516200021b92919062002d79565b620003786200039936600462002b45565b620009a3565b62000378620003b036600462002adc565b620009f4565b6200020c62000ad4565b620002b262000ada565b62000254620003db36600462002950565b62000ae9565b6200028f620003f236600462002a87565b62000b89565b620002b262000cd3565b6200020c62000ce2565b6200020c62000ce8565b6200028f6200042736600462002ba1565b62000d03565b620003786200043e36600462002b45565b62000f18565b6000619c4060005a905060006200045a62000ada565b905062000468818662000f6b565b93505060005a82039050808310156200048657601080548483030190555b505050919050565b60085460ff1690565b600f5460009060609060ff600160a01b90910416151560011415620004c257620004c260066200100a565b619c4060005a90506000620004d662000ada565b9050620004e38162001025565b6000620004fb82620004f584620010b4565b62001147565b9050620005098188620011e3565b95509550505060005a82039050808310156200052d57601080548401905562000536565b60108054820190555b505050915091565b60045490565b600b5490565b600f5460ff600160a01b909104161515600114156200056f576200056f60066200100a565b61ea6060005a905060006200058362000ada565b90506200059281868662001274565b5060005a8203905080831015620005ae57601080548483030190555b5050505050565b6000620005cc620005c68362001300565b62001393565b90505b919050565b6000546001600160a01b031681565b620005f060018262001397565b50565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b83811015620006555781810151838201526020016200063b565b50505050905090810190601f168015620006835780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b158015620006a157600080fd5b505afa158015620006b6573d6000803e3d6000fd5b505050506040513d6020811015620006cd57600080fd5b505192915050565b600a5490565b600e546001600160a01b031690565b600f5460ff600160a01b909104161515600114156200070f576200070f60066200100a565b600060018585601b0185856040516000815260200160405260405162000739949392919062002d96565b6020604051602081039080840390855afa1580156200075c573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166200079c576200079c6040518060600160405280603881526020016200387a60389139620005e3565b620007a781620013af565b620007b357506200086f565b620007be8162001442565b600f80546001600160a01b038381166001600160a01b03198316179092556040519116906000906003602160991b0190620007f990620026af565b62000805919062002ce1565b604051809103906000f08015801562000822573d6000803e3d6000fd5b50600f80546001600160a01b0319166001600160a01b03851617905590506200085e83826200085181620014af565b80519060200120620014c9565b6200086b8360006200150a565b5050505b50505050565b60606000826001146200088957826200088c565b60025b9050620008a56200089d8662001300565b858362001581565b95945050505050565b600f5460ff600160a01b90910416151560011415620008d357620008d360066200100a565b6000620008df62000ada565b90506000620008ee82620010b4565b9050808160010111156200090b576200090b82826001016200150a565b5050565b6000620005cc620009208362001300565b620015a3565b600060606201388060005a60408051606081018252600f546001600160a01b039081168252891660208201526001918101919091529091506200096c81898989620015a7565b945094505060005a82039050808310156200098f57601080548401905562000998565b60108054820190555b505050935093915050565b60006060620186a060005a60408051606081018252600f5460ff600160a01b8204161515928201929092526001600160a01b03918216815290881660208201529091506200096c81898989620015a7565b60006060331562000a0457600080fd5b600280546001600160a01b0319166001600160a01b03851617905562000a2a8562001640565b600019601155600f80546001600160a01b0319166001600160a01b038681169190911790915560808601511615801562000aad5760008062000a708860c0015162000497565b90925090506001600160a01b03821662000a935760009450925062000acc915050565b600162000aa083620014af565b9450945050505062000acc565b62000ac68660a0015187608001518860c00151620009a3565b92509250505b935093915050565b60075490565b600f546001600160a01b031690565b600f5460009060609060ff600160a01b9091041615156001141562000b145762000b1460066200100a565b619c4060005a9050600062000b2862000ada565b905062000b358162001025565b600062000b44828989620016b5565b905062000b528189620011e3565b95509550505060005a820390508083101562000b7657601080548401905562000b7f565b60108054820190555b5050509250929050565b600a547fdefa017defa017defa017defa017defa017defa017defa017defa017defa017d1462000bb9576200090b565b600280546001600160a01b0319166001600160a01b038381169190911791829055604051630d15d41560e41b815291169063d15d41509062000c0090339060040162002ce1565b60206040518083038186803b15801562000c1957600080fd5b505afa15801562000c2e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000c54919062002859565b62000c7c5760405162461bcd60e51b815260040162000c739062002e4e565b60405180910390fd5b62000c878262001640565b62000c9282620016ff565b62000ca75762000ca162001761565b6200090b565b62000cc76003600001548360a001510383608001518460c00151620009a3565b50506200090b62001761565b600d546001600160a01b031690565b60095490565b600062000cfe62000cf862000ada565b620010b4565b905090565b33301462000d115762000f13565b62000d1c81620013af565b62000d515762000d51600562000d4b6040518060600160405280603481526020016200392860349139620017fe565b62001397565b6001546040516352275acd60e11b81526001600160a01b039091169063a44eb59a9062000d8390859060040162002db4565b60206040518083038186803b15801562000d9c57600080fd5b505afa15801562000db1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000dd7919062002859565b62000e065762000e06600462000d4b6040518060a0016040528060768152602001620038b260769139620017fe565b62000e118162001442565b600062000e1e8362001843565b90506001600160a01b03811662000e39573d6000803e3d6000fd5b600062000e4682620014af565b6001546040516352275acd60e11b81529192506001600160a01b03169063a44eb59a9062000e7990849060040162002db4565b60206040518083038186803b15801562000e9257600080fd5b505afa15801562000ea7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000ecd919062002859565b62000efc5762000efc600462000d4b6040518060600160405280603081526020016200395c60309139620017fe565b620005ae838362000f0d8562001393565b620014c9565b505050565b60006060619c4060005a60408051606081018252600e546001600160a01b039081168252600f549081166020830152600160a01b900460ff161515918101919091529091506200096c81898989620015a7565b600062000f79838362001854565b600254604051631aaf392f60e01b81526001600160a01b0390911690631aaf392f9062000fad908690869060040162002d19565b60206040518083038186803b15801562000fc657600080fd5b505afa15801562000fdb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001001919062002894565b90505b92915050565b620005f0816040518060200160405280600081525062001397565b600080620010785a6002602160991b018560405160240162001048919062002ce1565b60408051601f198184030181529190526020810180516001600160e01b031663b1540a0160e01b179052620009a3565b9150915060008180602001905181019062001094919062002859565b9050801580620010a2575082155b156200086f576200086f60076200100a565b6000620010c182620019a4565b60025460405163d126199f60e01b81526001600160a01b039091169063d126199f90620010f390859060040162002ce1565b60206040518083038186803b1580156200110c57600080fd5b505afa15801562001121573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620005cc919062002894565b60408051600280825260608201909252600091829190816020015b606081526020019060019003908162001162579050509050620011858462001b03565b816000815181106200119357fe5b6020026020010181905250620011a98362001b31565b81600181518110620011b757fe5b60200260200101819052506000620011cf8262001b48565b9050620008a5818051906020012062001b92565b600060606200120c620011f562000ada565b6200120362000cf862000ada565b6001016200150a565b60408051606081018252600f5460ff600160a01b8204161515928201929092526001600160a01b039182168152908516602082015260008062001254835a8989600162001b95565b91509150816200126657600062001268565b865b97909650945050505050565b8062001281848462000f6b565b14156200128e5762000f13565b6200129a838362001e28565b600254604051635c17d62960e01b81526001600160a01b0390911690635c17d62990620012d09086908690869060040162002d32565b600060405180830381600087803b158015620012eb57600080fd5b505af11580156200086b573d6000803e3d6000fd5b60006200130d82620019a4565b600254604051637c8ee70360e01b81526001600160a01b0390911690637c8ee703906200133f90859060040162002ce1565b60206040518083038186803b1580156200135857600080fd5b505afa1580156200136d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620005cc919062002803565b3f90565b6000620013a5838362001f49565b9050805160208201fd5b6000620013bc82620019a4565b6002546040516307a1294560e01b81526001600160a01b03909116906307a1294590620013ee90859060040162002ce1565b60206040518083038186803b1580156200140757600080fd5b505afa1580156200141c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620005cc919062002859565b6200144d81620019a4565b600254604051637e78a4d160e11b81526001600160a01b039091169063fcf149a2906200147f90849060040162002ce1565b600060405180830381600087803b1580156200149a57600080fd5b505af1158015620005ae573d6000803e3d6000fd5b6060620005cc826000620014c385620015a3565b62001581565b620014d48362001ffc565b6002546040516368510af960e11b81526001600160a01b039091169063d0a215f290620012d09086908690869060040162002cf5565b620015158262001ffc565b6002546040516374855dc360e11b81526001600160a01b039091169063e90abb869062001549908590859060040162002d19565b600060405180830381600087803b1580156200156457600080fd5b505af115801562001579573d6000803e3d6000fd5b505050505050565b60606040519050602082018101604052818152818360208301863c9392505050565b3b90565b6000606073ffffffffffffffffffffffffffffffffffff0000841673deaddeaddeaddeaddeaddeaddeaddeaddead00001415620015f857505060408051602081019091526000815260019062001637565b60006064856001600160a01b0316106200161d57620016178562001300565b6200161f565b845b90506200163187878387600062001b95565b92509250505b94509492505050565b80516009556020810151600a5560a0810151600c5560408101516008805460ff1916600183818111156200167057fe5b02179055506060810151600d80546001600160a01b0319166001600160a01b03909216919091179055600554600b5560a0810151620016af906200211a565b60115550565b60008060ff60f81b85848680519060200120604051602001620016dc949392919062002c4e565b604051602081830303815290604052805190602001209050620008a58162001b92565b60007fdefa017defa017defa017defa017defa017defa017defa017defa017defa017d826020015114156200173757506000620005cf565b6200174b8260a0015183604001516200212f565b6200175957506000620005cf565b506001919050565b600d80546001600160a01b031990811673defa017defa017defa017defa017defa017defa09081179092557fdefa017defa017defa017defa017defa017defa017defa017defa017defa017d6009819055600a819055600b819055600c8190556008805460ff191690556010819055600e8054831684179055600f8054831690931760ff60a01b1916909255601191909155600280549091169055565b60608160405160240162001813919062002db4565b60408051601f198184030181529190526020810180516001600160e01b031662461bcd60e51b1790529050919050565b60008151602083016000f092915050565b6175305a10156200186b576200186b60006200100a565b600254604051630ad2267960e01b81526001600160a01b0390911690630ad22679906200189f908590859060040162002d19565b60206040518083038186803b158015620018b857600080fd5b505afa158015620018cd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620018f3919062002859565b62001904576200190460036200100a565b600254604051632bcdee1960e21b81526000916001600160a01b03169063af37b8649062001939908690869060040162002d19565b602060405180830381600087803b1580156200195457600080fd5b505af115801562001969573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200198f919062002859565b90508062000f135762000f13614e2062002163565b6175305a1015620019bb57620019bb60006200100a565b60025460405163c8e40fbf60e01b81526001600160a01b039091169063c8e40fbf90620019ed90849060040162002ce1565b60206040518083038186803b15801562001a0657600080fd5b505afa15801562001a1b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001a41919062002859565b62001a525762001a5260036200100a565b600254604051633ecdecc760e21b81526000916001600160a01b03169063fb37b31c9062001a8590859060040162002ce1565b602060405180830381600087803b15801562001aa057600080fd5b505af115801562001ab5573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001adb919062002859565b9050806200090b576200090b617530606462001afb620009208662001300565b020162002163565b6060620005cc8260405160200162001b1c919062002c31565b60405160208183030381529060405262002186565b6060620005cc62001b4283620021e0565b62002186565b6060600062001b5783620022f1565b905062001b67815160c0620023fe565b8160405160200162001b7b92919062002ca5565b604051602081830303815290604052915050919050565b90565b6040805160608082018352600e546001600160a01b039081168352600f549081166020840152600160a01b900460ff161515928201929092526000919062001bde81896200255b565b601154600062001bee896200211a565b6011819055905060006060871562001cb257604051309063fcb6829b60e01b9062001c22908e908d908f9060240162002eba565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b031990941693909317909252905162001c62919062002c87565b6000604051808303816000865af19150503d806000811462001ca1576040519150601f19603f3d011682016040523d82523d6000602084013e62001ca6565b606091505b50909250905062001d19565b896001600160a01b03168b8a60405162001ccd919062002c87565b60006040518083038160008787f1925050503d806000811462001d0d576040519150601f19603f3d011682016040523d82523d6000602084013e62001d12565b606091505b5090925090505b62001d258c866200255b565b6011548262001e105760008060008062001d3f8662002612565b92965090945092509050600384600781111562001d5857fe5b141562001d6a5762001d6a846200100a565b600184600781111562001d7957fe5b148062001d925750600484600781111562001d9057fe5b145b8062001daa5750600684600781111562001da857fe5b145b8062001dc25750600784600781111562001dc057fe5b145b1562001dce5760108290555b600184600781111562001ddd57fe5b148062001de757508c5b1562001df65780955062001e09565b6040518060200160405280600081525095505b5090925050505b90920390920360115590999098509650505050505050565b62001e34828262001854565b60025460405163af3dc01160e01b81526000916001600160a01b03169063af3dc0119062001e69908690869060040162002d19565b602060405180830381600087803b15801562001e8457600080fd5b505af115801562001e99573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001ebf919062002859565b90508062000f135762001ed28362001ffc565b600260009054906101000a90046001600160a01b03166001600160a01b031663c3fd9b256040518163ffffffff1660e01b8152600401600060405180830381600087803b15801562001f2357600080fd5b505af115801562001f38573d6000803e3d6000fd5b5050505062000f13614e2062002163565b6060600083600781111562001f5a57fe5b141562001f77575060408051602081019091526000815262001004565b600383600781111562001f8657fe5b141562001fc85760408051602080820183526000808352925162001fb1938793909283920162002dde565b604051602081830303815290604052905062001004565b60115460105460405162001fe59286929091869060200162002e1e565b604051602081830303815290604052905092915050565b6200200781620019a4565b60025460405163011b1f7960e41b81526000916001600160a01b0316906311b1f790906200203a90859060040162002ce1565b602060405180830381600087803b1580156200205557600080fd5b505af11580156200206a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062002090919062002859565b9050806200090b57600260009054906101000a90046001600160a01b03166001600160a01b03166333f943056040518163ffffffff1660e01b8152600401600060405180830381600087803b158015620020e957600080fd5b505af1158015620020fe573d6000803e3d6000fd5b505050506200090b617530606462001afb620009208662001300565b60005a82106200212b575a620005cc565b5090565b600454600090831115620021465750600062001004565b6003548310156200215a5750600062001004565b50600192915050565b6011548111156200217a576200217a60026200100a565b60118054919091039055565b60608082516001148015620021b05750608083600081518110620021a657fe5b016020015160f81c105b15620021be575081620005cc565b620021cc83516080620023fe565b8360405160200162001fe592919062002ca5565b6060600082604051602001620021f7919062002cd8565b604051602081830303815290604052905060005b602081101562002246578181815181106200222257fe5b01602001516001600160f81b031916156200223d5762002246565b6001016200220b565b6000816020036001600160401b03811180156200226257600080fd5b506040519080825280601f01601f1916602001820160405280156200228e576020820181803683370190505b50905060005b8151811015620022e8578351600184019385918110620022b057fe5b602001015160f81c60f81b828281518110620022c857fe5b60200101906001600160f81b031916908160001a90535060010162002294565b50949350505050565b6060815160001415620023145750604080516000815260208101909152620005cf565b6000805b83518110156200234a578381815181106200232f57fe5b60200260200101515182019150808060010191505062002318565b6000826001600160401b03811180156200236357600080fd5b506040519080825280601f01601f1916602001820160405280156200238f576020820181803683370190505b50600092509050602081015b8551831015620022e8576000868481518110620023b457fe5b602002602001015190506000602082019050620023d48382845162002669565b878581518110620023e157fe5b60200260200101515183019250505082806001019350506200239b565b60608060388410156200245b576040805160018082528183019092529060208201818036833701905050905082840160f81b816000815181106200243e57fe5b60200101906001600160f81b031916908160001a90535062001001565b600060015b8086816200246a57fe5b041562002481576001909101906101000262002460565b816001016001600160401b03811180156200249b57600080fd5b506040519080825280601f01601f191660200182016040528015620024c7576020820181803683370190505b50925084820160370160f81b83600081518110620024e157fe5b60200101906001600160f81b031916908160001a905350600190505b81811162002552576101008183036101000a87816200251857fe5b04816200252157fe5b0660f81b8382815181106200253257fe5b60200101906001600160f81b031916908160001a905350600101620024fd565b50509392505050565b805182516001600160a01b0390811691161462002594578051600e80546001600160a01b0319166001600160a01b039092169190911790555b80602001516001600160a01b031682602001516001600160a01b031614620025db576020810151600f80546001600160a01b0319166001600160a01b039092169190911790555b8060400151151582604001511515146200090b5760400151600f8054911515600160a01b0260ff60a01b1990921691909117905550565b6000806000606084516000141562002643575050604080516020810190915260008082529250829150819062002662565b8480602001905181019062002659919062002996565b93509350935093505b9193509193565b8282825b602081106200268e578151835260209283019290910190601f19016200266d565b905182516020929092036101000a6000190180199091169116179052505050565b6109018062002f7983390190565b6000620026d4620026ce8462002f11565b62002eed565b9050828152838383011115620026e957600080fd5b828260208301376000602084830101529392505050565b8035620005cf8162002f62565b600082601f8301126200271e578081fd5b6200100183833560208501620026bd565b803560028110620005cf57600080fd5b600060e0828403121562002751578081fd5b6200275d60e062002eed565b905081358152602082013560208201526200277b604083016200272f565b60408201526200278e6060830162002700565b6060820152620027a16080830162002700565b608082015260a082013560a082015260c08201356001600160401b03811115620027ca57600080fd5b620027d8848285016200270d565b60c08301525092915050565b600060208284031215620027f6578081fd5b8135620010018162002f62565b60006020828403121562002815578081fd5b8151620010018162002f62565b60008060006060848603121562002837578182fd5b8335620028448162002f62565b95602085013595506040909401359392505050565b6000602082840312156200286b578081fd5b8151801515811462001001578182fd5b6000602082840312156200288d578081fd5b5035919050565b600060208284031215620028a6578081fd5b5051919050565b60008060408385031215620028c0578182fd5b50508035926020909101359150565b60008060008060808587031215620028e5578081fd5b84359350602085013560ff81168114620028fd578182fd5b93969395505050506040820135916060013590565b60006020828403121562002924578081fd5b81356001600160401b038111156200293a578182fd5b62002948848285016200270d565b949350505050565b6000806040838503121562002963578182fd5b82356001600160401b0381111562002979578283fd5b62002987858286016200270d565b95602094909401359450505050565b60008060008060808587031215620029ac578182fd5b845160088110620029bb578283fd5b80945050602085015192506040850151915060608501516001600160401b03811115620029e6578182fd5b8501601f81018713620029f7578182fd5b805162002a08620026ce8262002f11565b81815288602083850101111562002a1d578384fd5b62002a3082602083016020860162002f33565b9598949750929550505050565b60006020828403121562002a4f578081fd5b81356001600160401b0381111562002a65578182fd5b8201601f8101841362002a76578182fd5b6200294884823560208401620026bd565b6000806040838503121562002a9a578182fd5b82356001600160401b0381111562002ab0578283fd5b62002abe858286016200273f565b925050602083013562002ad18162002f62565b809150509250929050565b60008060006060848603121562002af1578081fd5b83356001600160401b0381111562002b07578182fd5b62002b15868287016200273f565b935050602084013562002b288162002f62565b9150604084013562002b3a8162002f62565b809150509250925092565b60008060006060848603121562002b5a578081fd5b83359250602084013562002b6e8162002f62565b915060408401356001600160401b0381111562002b89578182fd5b62002b97868287016200270d565b9150509250925092565b60008060006060848603121562002bb6578081fd5b8335925060208401356001600160401b0381111562002bd3578182fd5b62002be1868287016200270d565b925050604084013562002b3a8162002f62565b6000815180845262002c0e81602086016020860162002f33565b601f01601f19169290920160200192915050565b6008811062002c2d57fe5b9052565b60609190911b6bffffffffffffffffffffffff1916815260140190565b6001600160f81b031994909416845260609290921b6bffffffffffffffffffffffff191660018401526015830152603582015260550190565b6000825162002c9b81846020870162002f33565b9190910192915050565b6000835162002cb981846020880162002f33565b83519083019062002ccf81836020880162002f33565b01949350505050565b90815260200190565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039390931683526020830191909152604082015260600190565b6001600160a01b0383168152604060208201819052600090620029489083018462002bf4565b600083151582526040602083015262002948604083018462002bf4565b93845260ff9290921660208401526040830152606082015260800190565b60006020825262001001602083018462002bf4565b602081016002831062002dd857fe5b91905290565b600062002dec828762002c22565b60ff8516602083015260ff841660408301526080606083015262002e14608083018462002bf4565b9695505050505050565b600062002e2c828762002c22565b8460208301528360408301526080606083015262002e14608083018462002bf4565b60208082526046908201527f4f6e6c792061757468656e746963617465642061646472657373657320696e2060408201527f6f766d53746174654d616e616765722063616e2063616c6c20746869732066756060820152653731ba34b7b760d11b608082015260a00190565b60008482526060602083015262002ed5606083018562002bf4565b905060018060a01b0383166040830152949350505050565b6040518181016001600160401b038111828210171562002f0957fe5b604052919050565b60006001600160401b0382111562002f2557fe5b50601f01601f191660200190565b60005b8381101562002f5057818101518382015260200162002f36565b838111156200086f5750506000910152565b6001600160a01b0381168114620005f057600080fdfe608060405234801561001057600080fd5b506040516109013803806109018339818101604052602081101561003357600080fd5b505161003e81610044565b506101d9565b61008d7fdeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddead60001b61007e8361009060201b6103ca1760201c565b61009c60201b6103d61760201c565b50565b6001600160a01b031690565b604080516024810184905260448082018490528251808303909101815260649091019091526020810180516001600160e01b03908116628af59360e61b179091526100e891906100ed16565b505050565b60606100f95a836100ff565b92915050565b60606000339050600080826001600160a01b031686866040518082805190602001908083835b602083106101445780518252601f199092019160209182019101610125565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038160008787f1925050503d80600081146101a7576040519150601f19603f3d011682016040523d82523d6000602084013e6101ac565b606091505b509092509050816101bf57805160208201fd5b8051600114156101cf5760016000f35b92506100f9915050565b610719806101e86000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c80630900f010146100a1578063aaf10f42146100c9575b6000806100825a6100456100ed565b6000368080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061012592505050565b91509150811561009457805160208201f35b61009d816102c8565b5050005b6100c7600480360360208110156100b757600080fd5b50356001600160a01b031661037a565b005b6100d16100ed565b604080516001600160a01b039092168252519081900360200190f35b600061012061011b7fdeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddead610422565b610488565b905090565b6000606060006101ed86868660405160240180848152602001836001600160a01b0316815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561018657818101518382015260200161016e565b50505050905090810190601f1680156101b35780820380516001836020036101000a031916815260200191505b5060408051601f198184030181529190526020810180516001600160e01b03166001620631bb60e21b0319179052945061048b9350505050565b905080806020019051604081101561020457600080fd5b81516020830180516040519294929383019291908464010000000082111561022b57600080fd5b90830190602082018581111561024057600080fd5b825164010000000081118282018810171561025a57600080fd5b82525081516020918201929091019080838360005b8381101561028757818101518382015260200161026f565b50505050905090810190601f1680156102b45780820380516001836020036101000a031916815260200191505b506040525050509250925050935093915050565b6103766102d48261049d565b6040516024018080602001828103825283818151815260200191508051906020019080838360005b838110156103145781810151838201526020016102fc565b50505050905090810190601f1680156103415780820380516001836020036101000a031916815260200191505b5060408051601f198184030181529190526020810180516001600160e01b0316632a2a7adb60e01b179052925061048b915050565b5050565b6103be6103856104e0565b6001600160a01b0316610396610536565b6001600160a01b0316146040518060600160405280603281526020016106db6032913961056d565b6103c78161057b565b50565b6001600160a01b031690565b604080516024810184905260448082018490528251808303909101815260649091019091526020810180516001600160e01b0316628af59360e61b17905261041d9061048b565b505050565b6040805160248082018490528251808303909101815260449091019091526020810180516001600160e01b03166303daa95960e01b17905260009081906104689061048b565b905080806020019051602081101561047f57600080fd5b50519392505050565b90565b60606104975a836105ad565b92915050565b6060816040516024016104b09190610687565b60408051601f198184030181529190526020810180516001600160e01b031662461bcd60e51b1790529050919050565b6040805160048152602481019091526020810180516001600160e01b0316631cd4241960e21b17905260009081906105179061048b565b905080806020019051602081101561052e57600080fd5b505191505090565b6040805160048152602481019091526020810180516001600160e01b031663996d79a560e01b17905260009081906105179061048b565b8161037657610376816102c8565b6103c77fdeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddead6105a8836103ca565b6103d6565b60606000339050600080826001600160a01b031686866040518082805190602001908083835b602083106105f25780518252601f1990920191602091820191016105d3565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038160008787f1925050503d8060008114610655576040519150601f19603f3d011682016040523d82523d6000602084013e61065a565b606091505b5090925090508161066d57805160208201fd5b80516001141561067d5760016000f35b9250610497915050565b6000602080835283518082850152825b818110156106b357858101830151858201604001528201610697565b818111156106c45783604083870101525b50601f01601f191692909201604001939250505056fe454f41732063616e206f6e6c792075706772616465207468656972206f776e20454f4120696d706c656d656e746174696f6ea164736f6c6343000706000a5369676e61747572652070726f766964656420666f7220454f4120636f6e7472616374206372656174696f6e20697320696e76616c69642e436f6e7472616374206372656174696f6e20636f646520636f6e7461696e7320756e73616665206f70636f6465732e2044696420796f75207573652074686520726967687420636f6d70696c6572206f72207061737320616e20756e7361666520636f6e7374727563746f7220617267756d656e743f4120636f6e74726163742068617320616c7265616479206265656e206465706c6f79656420746f20746869732061646472657373436f6e7374727563746f7220617474656d7074656420746f206465706c6f7920756e736166652062797465636f64652ea164736f6c6343000706000a", + "solcInputHash": "f2bdab652d5102f5f11e78dae866798d", + "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"minTransactionGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxTransactionGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxGasPerQueuePerEpoch\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"secondsPerEpoch\",\"type\":\"uint256\"}],\"internalType\":\"struct iOVM_ExecutionManager.GasMeterConfig\",\"name\":\"_gasMeterConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"ovmCHAINID\",\"type\":\"uint256\"}],\"internalType\":\"struct iOVM_ExecutionManager.GlobalContext\",\"name\":\"_globalContext\",\"type\":\"tuple\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"getMaxTransactionGasLimit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_maxTransactionGasLimit\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ovmADDRESS\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"_ADDRESS\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_address\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_calldata\",\"type\":\"bytes\"}],\"name\":\"ovmCALL\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"_success\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"_returndata\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ovmCALLER\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"_CALLER\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ovmCHAINID\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_CHAINID\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_bytecode\",\"type\":\"bytes\"}],\"name\":\"ovmCREATE\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_bytecode\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"_salt\",\"type\":\"bytes32\"}],\"name\":\"ovmCREATE2\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_messageHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint8\",\"name\":\"_v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"_r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"_s\",\"type\":\"bytes32\"}],\"name\":\"ovmCREATEEOA\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_address\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_calldata\",\"type\":\"bytes\"}],\"name\":\"ovmDELEGATECALL\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"_success\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"_returndata\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_contract\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_offset\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_length\",\"type\":\"uint256\"}],\"name\":\"ovmEXTCODECOPY\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"_code\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_contract\",\"type\":\"address\"}],\"name\":\"ovmEXTCODEHASH\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"_EXTCODEHASH\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_contract\",\"type\":\"address\"}],\"name\":\"ovmEXTCODESIZE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_EXTCODESIZE\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ovmGASLIMIT\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_GASLIMIT\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ovmGETNONCE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_nonce\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ovmINCREMENTNONCE\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ovmL1QUEUEORIGIN\",\"outputs\":[{\"internalType\":\"enum Lib_OVMCodec.QueueOrigin\",\"name\":\"_queueOrigin\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ovmL1TXORIGIN\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"_l1TxOrigin\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ovmNUMBER\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_NUMBER\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"ovmREVERT\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_key\",\"type\":\"bytes32\"}],\"name\":\"ovmSLOAD\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"_value\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_key\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"_value\",\"type\":\"bytes32\"}],\"name\":\"ovmSSTORE\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_address\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_calldata\",\"type\":\"bytes\"}],\"name\":\"ovmSTATICCALL\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"_success\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"_returndata\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ovmTIMESTAMP\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_TIMESTAMP\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"enum Lib_OVMCodec.QueueOrigin\",\"name\":\"l1QueueOrigin\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"l1TxOrigin\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"entrypoint\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.Transaction\",\"name\":\"_transaction\",\"type\":\"tuple\"},{\"internalType\":\"address\",\"name\":\"_ovmStateManager\",\"type\":\"address\"}],\"name\":\"run\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_creationCode\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"_address\",\"type\":\"address\"}],\"name\":\"safeCREATE\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"enum Lib_OVMCodec.QueueOrigin\",\"name\":\"l1QueueOrigin\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"l1TxOrigin\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"entrypoint\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.Transaction\",\"name\":\"_transaction\",\"type\":\"tuple\"},{\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"internalType\":\"contract iOVM_StateManager\",\"name\":\"_ovmStateManager\",\"type\":\"address\"}],\"name\":\"simulateMessage\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The Execution Manager (EM) is the core of our OVM implementation, and provides a sandboxed environment allowing us to execute OVM transactions deterministically on either Layer 1 or Layer 2. The EM's run() function is the first function called during the execution of any transaction on L2. For each context-dependent EVM operation the EM has a function which implements a corresponding OVM operation, which will read state from the State Manager contract. The EM relies on the Safety Checker to verify that code deployed to Layer 2 does not contain any context-dependent operations. Compiler used: solc Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\"}},\"ovmADDRESS()\":{\"returns\":{\"_ADDRESS\":\"Active ADDRESS within the current message context.\"}},\"ovmCALL(uint256,address,bytes)\":{\"params\":{\"_address\":\"Address of the contract to call.\",\"_calldata\":\"Data to send along with the call.\",\"_gasLimit\":\"Amount of gas to be passed into this call.\"},\"returns\":{\"_returndata\":\"Data returned by the call.\",\"_success\":\"Whether or not the call returned (rather than reverted).\"}},\"ovmCALLER()\":{\"returns\":{\"_CALLER\":\"Address of the CALLER within the current message context.\"}},\"ovmCHAINID()\":{\"returns\":{\"_CHAINID\":\"Value of the chain's CHAINID within the global context.\"}},\"ovmCREATE(bytes)\":{\"params\":{\"_bytecode\":\"Code to be used to CREATE a new contract.\"},\"returns\":{\"_0\":\"Address of the created contract.\",\"_1\":\"Revert data, if and only if the creation threw an exception.\"}},\"ovmCREATE2(bytes,bytes32)\":{\"params\":{\"_bytecode\":\"Code to be used to CREATE2 a new contract.\",\"_salt\":\"Value used to determine the contract's address.\"},\"returns\":{\"_0\":\"Address of the created contract.\",\"_1\":\"Revert data, if and only if the creation threw an exception.\"}},\"ovmCREATEEOA(bytes32,uint8,bytes32,bytes32)\":{\"details\":\"Essentially functions like ovmCREATE or ovmCREATE2, but we can bypass a lot of checks because the contract we're creating is trusted (no need to do safety checking or to handle unexpected reverts). Doesn't need to return an address because the address is assumed to be the user's actual address.\",\"params\":{\"_messageHash\":\"Hash of a message signed by some user, for verification.\",\"_r\":\"Signature `r` parameter.\",\"_s\":\"Signature `s` parameter.\",\"_v\":\"Signature `v` parameter.\"}},\"ovmDELEGATECALL(uint256,address,bytes)\":{\"params\":{\"_address\":\"Address of the contract to call.\",\"_calldata\":\"Data to send along with the call.\",\"_gasLimit\":\"Amount of gas to be passed into this call.\"},\"returns\":{\"_returndata\":\"Data returned by the call.\",\"_success\":\"Whether or not the call returned (rather than reverted).\"}},\"ovmEXTCODECOPY(address,uint256,uint256)\":{\"params\":{\"_contract\":\"Address of the contract to copy code from.\",\"_length\":\"Total number of bytes to copy from the contract's code.\",\"_offset\":\"Offset in bytes from the start of contract code to copy beyond.\"},\"returns\":{\"_code\":\"Bytes of code copied from the requested contract.\"}},\"ovmEXTCODEHASH(address)\":{\"params\":{\"_contract\":\"Address of the contract to query the hash of.\"},\"returns\":{\"_EXTCODEHASH\":\"Hash of the requested contract.\"}},\"ovmEXTCODESIZE(address)\":{\"params\":{\"_contract\":\"Address of the contract to query the size of.\"},\"returns\":{\"_EXTCODESIZE\":\"Size of the requested contract in bytes.\"}},\"ovmGASLIMIT()\":{\"returns\":{\"_GASLIMIT\":\"Value of the block's GASLIMIT within the transaction context.\"}},\"ovmGETNONCE()\":{\"returns\":{\"_nonce\":\"Nonce of the current contract.\"}},\"ovmL1QUEUEORIGIN()\":{\"returns\":{\"_queueOrigin\":\"Enum indicating the ovmL1QUEUEORIGIN within the current message context.\"}},\"ovmL1TXORIGIN()\":{\"returns\":{\"_l1TxOrigin\":\"Address of the account which sent the tx into L2 from L1.\"}},\"ovmNUMBER()\":{\"returns\":{\"_NUMBER\":\"Value of the NUMBER within the transaction context.\"}},\"ovmREVERT(bytes)\":{\"params\":{\"_data\":\"Bytes data to pass along with the REVERT.\"}},\"ovmSLOAD(bytes32)\":{\"params\":{\"_key\":\"32 byte key of the storage slot to load.\"},\"returns\":{\"_value\":\"32 byte value of the requested storage slot.\"}},\"ovmSSTORE(bytes32,bytes32)\":{\"params\":{\"_key\":\"32 byte key of the storage slot to set.\",\"_value\":\"32 byte value for the storage slot.\"}},\"ovmSTATICCALL(uint256,address,bytes)\":{\"params\":{\"_address\":\"Address of the contract to call.\",\"_calldata\":\"Data to send along with the call.\",\"_gasLimit\":\"Amount of gas to be passed into this call.\"},\"returns\":{\"_returndata\":\"Data returned by the call.\",\"_success\":\"Whether or not the call returned (rather than reverted).\"}},\"ovmTIMESTAMP()\":{\"returns\":{\"_TIMESTAMP\":\"Value of the TIMESTAMP within the transaction context.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}},\"run((uint256,uint256,uint8,address,address,uint256,bytes),address)\":{\"params\":{\"_ovmStateManager\":\"iOVM_StateManager implementation providing account state.\",\"_transaction\":\"Transaction data to be executed.\"}},\"safeCREATE(uint256,bytes,address)\":{\"params\":{\"_address\":\"OVM address being deployed to.\",\"_creationCode\":\"Code to pass into CREATE for deployment.\",\"_gasLimit\":\"Amount of gas to be passed into this creation.\"}},\"simulateMessage((uint256,uint256,uint8,address,address,uint256,bytes),address,address)\":{\"params\":{\"_from\":\"the OVM account the simulated call should be from.\",\"_transaction\":\"the message transaction to simulate.\"}}},\"title\":\"OVM_ExecutionManager\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"ovmADDRESS()\":{\"notice\":\"Overrides ADDRESS.\"},\"ovmCALL(uint256,address,bytes)\":{\"notice\":\"Overrides CALL.\"},\"ovmCALLER()\":{\"notice\":\"Overrides CALLER.\"},\"ovmCHAINID()\":{\"notice\":\"Overrides CHAINID.\"},\"ovmCREATE(bytes)\":{\"notice\":\"Overrides CREATE.\"},\"ovmCREATE2(bytes,bytes32)\":{\"notice\":\"Overrides CREATE2.\"},\"ovmCREATEEOA(bytes32,uint8,bytes32,bytes32)\":{\"notice\":\"Creates a new EOA contract account, for account abstraction.\"},\"ovmDELEGATECALL(uint256,address,bytes)\":{\"notice\":\"Overrides DELEGATECALL.\"},\"ovmEXTCODECOPY(address,uint256,uint256)\":{\"notice\":\"Overrides EXTCODECOPY.\"},\"ovmEXTCODEHASH(address)\":{\"notice\":\"Overrides EXTCODEHASH.\"},\"ovmEXTCODESIZE(address)\":{\"notice\":\"Overrides EXTCODESIZE.\"},\"ovmGASLIMIT()\":{\"notice\":\"Overrides GASLIMIT.\"},\"ovmGETNONCE()\":{\"notice\":\"Retrieves the nonce of the current ovmADDRESS.\"},\"ovmINCREMENTNONCE()\":{\"notice\":\"Bumps the nonce of the current ovmADDRESS by one.\"},\"ovmL1QUEUEORIGIN()\":{\"notice\":\"Specifies from which source (Sequencer or Queue) this transaction originated from.\"},\"ovmL1TXORIGIN()\":{\"notice\":\"Specifies which L1 account, if any, sent this transaction by calling enqueue().\"},\"ovmNUMBER()\":{\"notice\":\"Overrides NUMBER.\"},\"ovmREVERT(bytes)\":{\"notice\":\"Overrides REVERT.\"},\"ovmSLOAD(bytes32)\":{\"notice\":\"Overrides SLOAD.\"},\"ovmSSTORE(bytes32,bytes32)\":{\"notice\":\"Overrides SSTORE.\"},\"ovmSTATICCALL(uint256,address,bytes)\":{\"notice\":\"Overrides STATICCALL.\"},\"ovmTIMESTAMP()\":{\"notice\":\"Overrides TIMESTAMP.\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"},\"run((uint256,uint256,uint8,address,address,uint256,bytes),address)\":{\"notice\":\"Starts the execution of a transaction via the OVM_ExecutionManager.\"},\"safeCREATE(uint256,bytes,address)\":{\"notice\":\"Handles the creation-specific safety measures required for OVM contract deployment. This function sanitizes the return types for creation messages to match calls (bool, bytes), by being an external function which the EM can call, that mimics the success/fail case of the CREATE. This allows for consistent handling of both types of messages in _handleExternalMessage(). Having this step occur as a separate call frame also allows us to easily revert the contract deployment in the event that the code is unsafe.\"},\"simulateMessage((uint256,uint256,uint8,address,address,uint256,bytes),address,address)\":{\"notice\":\"Unreachable helper function for simulating eth_calls with an OVM message context. This function will throw an exception in all cases other than when used as a custom entrypoint in L2 Geth to simulate eth_call.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol\":\"OVM_ExecutionManager\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor () internal {\\n address msgSender = _msgSender();\\n _owner = msgSender;\\n emit OwnershipTransferred(address(0), msgSender);\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n emit OwnershipTransferred(_owner, address(0));\\n _owner = address(0);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n emit OwnershipTransferred(_owner, newOwner);\\n _owner = newOwner;\\n }\\n}\\n\",\"keccak256\":\"0x15e2d5bd4c28a88548074c54d220e8086f638a71ed07e6b3ba5a70066fcf458d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with GSN meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address payable) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes memory) {\\n this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x8d3cb350f04ff49cfb10aef08d87f19dcbaecc8027b0bed12f3275cd12f38cf0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// @unsupported: ovm\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\nimport { Lib_EthUtils } from \\\"../../libraries/utils/Lib_EthUtils.sol\\\";\\nimport { Lib_ErrorUtils } from \\\"../../libraries/utils/Lib_ErrorUtils.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_ExecutionManager } from \\\"../../iOVM/execution/iOVM_ExecutionManager.sol\\\";\\nimport { iOVM_StateManager } from \\\"../../iOVM/execution/iOVM_StateManager.sol\\\";\\nimport { iOVM_SafetyChecker } from \\\"../../iOVM/execution/iOVM_SafetyChecker.sol\\\";\\n\\n/* Contract Imports */\\nimport { OVM_DeployerWhitelist } from \\\"../predeploys/OVM_DeployerWhitelist.sol\\\";\\n\\n/**\\n * @title OVM_ExecutionManager\\n * @dev The Execution Manager (EM) is the core of our OVM implementation, and provides a sandboxed\\n * environment allowing us to execute OVM transactions deterministically on either Layer 1 or\\n * Layer 2.\\n * The EM's run() function is the first function called during the execution of any\\n * transaction on L2.\\n * For each context-dependent EVM operation the EM has a function which implements a corresponding\\n * OVM operation, which will read state from the State Manager contract.\\n * The EM relies on the Safety Checker to verify that code deployed to Layer 2 does not contain any\\n * context-dependent operations.\\n *\\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract OVM_ExecutionManager is iOVM_ExecutionManager, Lib_AddressResolver {\\n\\n /********************************\\n * External Contract References *\\n ********************************/\\n\\n iOVM_SafetyChecker internal ovmSafetyChecker;\\n iOVM_StateManager internal ovmStateManager;\\n\\n\\n /*******************************\\n * Execution Context Variables *\\n *******************************/\\n\\n GasMeterConfig internal gasMeterConfig;\\n GlobalContext internal globalContext;\\n TransactionContext internal transactionContext;\\n MessageContext internal messageContext;\\n TransactionRecord internal transactionRecord;\\n MessageRecord internal messageRecord;\\n\\n\\n /**************************\\n * Gas Metering Constants *\\n **************************/\\n\\n address constant GAS_METADATA_ADDRESS = 0x06a506A506a506A506a506a506A506A506A506A5;\\n uint256 constant NUISANCE_GAS_SLOAD = 20000;\\n uint256 constant NUISANCE_GAS_SSTORE = 20000;\\n uint256 constant MIN_NUISANCE_GAS_PER_CONTRACT = 30000;\\n uint256 constant NUISANCE_GAS_PER_CONTRACT_BYTE = 100;\\n uint256 constant MIN_GAS_FOR_INVALID_STATE_ACCESS = 30000;\\n\\n /**************************\\n * Default Context Values *\\n **************************/\\n\\n uint256 constant DEFAULT_UINT256 = 0xdefa017defa017defa017defa017defa017defa017defa017defa017defa017d;\\n address constant DEFAULT_ADDRESS = 0xdEfa017defA017DeFA017DEfa017DeFA017DeFa0;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n */\\n constructor(\\n address _libAddressManager,\\n GasMeterConfig memory _gasMeterConfig,\\n GlobalContext memory _globalContext\\n )\\n Lib_AddressResolver(_libAddressManager)\\n {\\n ovmSafetyChecker = iOVM_SafetyChecker(resolve(\\\"OVM_SafetyChecker\\\"));\\n gasMeterConfig = _gasMeterConfig;\\n globalContext = _globalContext;\\n _resetContext();\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n /**\\n * Applies dynamically-sized refund to a transaction to account for the difference in execution\\n * between L1 and L2, so that the overall cost of the ovmOPCODE is fixed.\\n * @param _cost Desired gas cost for the function after the refund.\\n */\\n modifier netGasCost(\\n uint256 _cost\\n ) {\\n uint256 gasProvided = gasleft();\\n _;\\n uint256 gasUsed = gasProvided - gasleft();\\n\\n // We want to refund everything *except* the specified cost.\\n if (_cost < gasUsed) {\\n transactionRecord.ovmGasRefund += gasUsed - _cost;\\n }\\n }\\n\\n /**\\n * Applies a fixed-size gas refund to a transaction to account for the difference in execution\\n * between L1 and L2, so that the overall cost of an ovmOPCODE can be lowered.\\n * @param _discount Amount of gas cost to refund for the ovmOPCODE.\\n */\\n modifier fixedGasDiscount(\\n uint256 _discount\\n ) {\\n uint256 gasProvided = gasleft();\\n _;\\n uint256 gasUsed = gasProvided - gasleft();\\n\\n // We want to refund the specified _discount, unless this risks underflow.\\n if (_discount < gasUsed) {\\n transactionRecord.ovmGasRefund += _discount;\\n } else {\\n // refund all we can without risking underflow.\\n transactionRecord.ovmGasRefund += gasUsed;\\n }\\n }\\n\\n /**\\n * Makes sure we're not inside a static context.\\n */\\n modifier notStatic() {\\n if (messageContext.isStatic == true) {\\n _revertWithFlag(RevertFlag.STATIC_VIOLATION);\\n }\\n _;\\n }\\n\\n\\n /************************************\\n * Transaction Execution Entrypoint *\\n ************************************/\\n\\n /**\\n * Starts the execution of a transaction via the OVM_ExecutionManager.\\n * @param _transaction Transaction data to be executed.\\n * @param _ovmStateManager iOVM_StateManager implementation providing account state.\\n */\\n function run(\\n Lib_OVMCodec.Transaction memory _transaction,\\n address _ovmStateManager\\n )\\n override\\n external\\n returns (\\n bytes memory\\n )\\n {\\n // Make sure that run() is not re-enterable. This condition should always be satisfied\\n // Once run has been called once, due to the behavior of _isValidInput().\\n if (transactionContext.ovmNUMBER != DEFAULT_UINT256) {\\n return bytes(\\\"\\\");\\n }\\n\\n // Store our OVM_StateManager instance (significantly easier than attempting to pass the\\n // address around in calldata).\\n ovmStateManager = iOVM_StateManager(_ovmStateManager);\\n\\n // Make sure this function can't be called by anyone except the owner of the\\n // OVM_StateManager (expected to be an OVM_StateTransitioner). We can revert here because\\n // this would make the `run` itself invalid.\\n require(\\n // This method may return false during fraud proofs, but always returns true in L2 nodes' State Manager precompile.\\n ovmStateManager.isAuthenticated(msg.sender),\\n \\\"Only authenticated addresses in ovmStateManager can call this function\\\"\\n );\\n\\n // Initialize the execution context, must be initialized before we perform any gas metering\\n // or we'll throw a nuisance gas error.\\n _initContext(_transaction);\\n\\n // TEMPORARY: Gas metering is disabled for minnet.\\n // // Check whether we need to start a new epoch, do so if necessary.\\n // _checkNeedsNewEpoch(_transaction.timestamp);\\n\\n // Make sure the transaction's gas limit is valid. We don't revert here because we reserve\\n // reverts for INVALID_STATE_ACCESS.\\n if (_isValidInput(_transaction) == false) {\\n _resetContext();\\n return bytes(\\\"\\\");\\n }\\n\\n // TEMPORARY: Gas metering is disabled for minnet.\\n // // Check gas right before the call to get total gas consumed by OVM transaction.\\n // uint256 gasProvided = gasleft();\\n\\n // Run the transaction, make sure to meter the gas usage.\\n (, bytes memory returndata) = ovmCALL(\\n _transaction.gasLimit - gasMeterConfig.minTransactionGasLimit,\\n _transaction.entrypoint,\\n _transaction.data\\n );\\n\\n // TEMPORARY: Gas metering is disabled for minnet.\\n // // Update the cumulative gas based on the amount of gas used.\\n // uint256 gasUsed = gasProvided - gasleft();\\n // _updateCumulativeGas(gasUsed, _transaction.l1QueueOrigin);\\n\\n // Wipe the execution context.\\n _resetContext();\\n\\n return returndata;\\n }\\n\\n\\n /******************************\\n * Opcodes: Execution Context *\\n ******************************/\\n\\n /**\\n * @notice Overrides CALLER.\\n * @return _CALLER Address of the CALLER within the current message context.\\n */\\n function ovmCALLER()\\n override\\n external\\n view\\n returns (\\n address _CALLER\\n )\\n {\\n return messageContext.ovmCALLER;\\n }\\n\\n /**\\n * @notice Overrides ADDRESS.\\n * @return _ADDRESS Active ADDRESS within the current message context.\\n */\\n function ovmADDRESS()\\n override\\n public\\n view\\n returns (\\n address _ADDRESS\\n )\\n {\\n return messageContext.ovmADDRESS;\\n }\\n\\n /**\\n * @notice Overrides TIMESTAMP.\\n * @return _TIMESTAMP Value of the TIMESTAMP within the transaction context.\\n */\\n function ovmTIMESTAMP()\\n override\\n external\\n view\\n returns (\\n uint256 _TIMESTAMP\\n )\\n {\\n return transactionContext.ovmTIMESTAMP;\\n }\\n\\n /**\\n * @notice Overrides NUMBER.\\n * @return _NUMBER Value of the NUMBER within the transaction context.\\n */\\n function ovmNUMBER()\\n override\\n external\\n view\\n returns (\\n uint256 _NUMBER\\n )\\n {\\n return transactionContext.ovmNUMBER;\\n }\\n\\n /**\\n * @notice Overrides GASLIMIT.\\n * @return _GASLIMIT Value of the block's GASLIMIT within the transaction context.\\n */\\n function ovmGASLIMIT()\\n override\\n external\\n view\\n returns (\\n uint256 _GASLIMIT\\n )\\n {\\n return transactionContext.ovmGASLIMIT;\\n }\\n\\n /**\\n * @notice Overrides CHAINID.\\n * @return _CHAINID Value of the chain's CHAINID within the global context.\\n */\\n function ovmCHAINID()\\n override\\n external\\n view\\n returns (\\n uint256 _CHAINID\\n )\\n {\\n return globalContext.ovmCHAINID;\\n }\\n\\n /*********************************\\n * Opcodes: L2 Execution Context *\\n *********************************/\\n\\n /**\\n * @notice Specifies from which source (Sequencer or Queue) this transaction originated from.\\n * @return _queueOrigin Enum indicating the ovmL1QUEUEORIGIN within the current message context.\\n */\\n function ovmL1QUEUEORIGIN()\\n override\\n external\\n view\\n returns (\\n Lib_OVMCodec.QueueOrigin _queueOrigin\\n )\\n {\\n return transactionContext.ovmL1QUEUEORIGIN;\\n }\\n\\n /**\\n * @notice Specifies which L1 account, if any, sent this transaction by calling enqueue().\\n * @return _l1TxOrigin Address of the account which sent the tx into L2 from L1.\\n */\\n function ovmL1TXORIGIN()\\n override\\n external\\n view\\n returns (\\n address _l1TxOrigin\\n )\\n {\\n return transactionContext.ovmL1TXORIGIN;\\n }\\n\\n /********************\\n * Opcodes: Halting *\\n ********************/\\n\\n /**\\n * @notice Overrides REVERT.\\n * @param _data Bytes data to pass along with the REVERT.\\n */\\n function ovmREVERT(\\n bytes memory _data\\n )\\n override\\n public\\n {\\n _revertWithFlag(RevertFlag.INTENTIONAL_REVERT, _data);\\n }\\n\\n\\n /******************************\\n * Opcodes: Contract Creation *\\n ******************************/\\n\\n /**\\n * @notice Overrides CREATE.\\n * @param _bytecode Code to be used to CREATE a new contract.\\n * @return Address of the created contract.\\n * @return Revert data, if and only if the creation threw an exception.\\n */\\n function ovmCREATE(\\n bytes memory _bytecode\\n )\\n override\\n public\\n notStatic\\n fixedGasDiscount(40000)\\n returns (\\n address,\\n bytes memory\\n )\\n {\\n // Creator is always the current ADDRESS.\\n address creator = ovmADDRESS();\\n\\n // Check that the deployer is whitelisted, or\\n // that arbitrary contract deployment has been enabled.\\n _checkDeployerAllowed(creator);\\n\\n // Generate the correct CREATE address.\\n address contractAddress = Lib_EthUtils.getAddressForCREATE(\\n creator,\\n _getAccountNonce(creator)\\n );\\n\\n return _createContract(\\n contractAddress,\\n _bytecode\\n );\\n }\\n\\n /**\\n * @notice Overrides CREATE2.\\n * @param _bytecode Code to be used to CREATE2 a new contract.\\n * @param _salt Value used to determine the contract's address.\\n * @return Address of the created contract.\\n * @return Revert data, if and only if the creation threw an exception.\\n */\\n function ovmCREATE2(\\n bytes memory _bytecode,\\n bytes32 _salt\\n )\\n override\\n external\\n notStatic\\n fixedGasDiscount(40000)\\n returns (\\n address,\\n bytes memory\\n )\\n {\\n // Creator is always the current ADDRESS.\\n address creator = ovmADDRESS();\\n\\n // Check that the deployer is whitelisted, or\\n // that arbitrary contract deployment has been enabled.\\n _checkDeployerAllowed(creator);\\n\\n // Generate the correct CREATE2 address.\\n address contractAddress = Lib_EthUtils.getAddressForCREATE2(\\n creator,\\n _bytecode,\\n _salt\\n );\\n\\n return _createContract(\\n contractAddress,\\n _bytecode\\n );\\n }\\n\\n\\n /*******************************\\n * Account Abstraction Opcodes *\\n ******************************/\\n\\n /**\\n * Retrieves the nonce of the current ovmADDRESS.\\n * @return _nonce Nonce of the current contract.\\n */\\n function ovmGETNONCE()\\n override\\n external\\n returns (\\n uint256 _nonce\\n )\\n {\\n return _getAccountNonce(ovmADDRESS());\\n }\\n\\n /**\\n * Bumps the nonce of the current ovmADDRESS by one.\\n */\\n function ovmINCREMENTNONCE()\\n override\\n external\\n notStatic\\n {\\n address account = ovmADDRESS();\\n uint256 nonce = _getAccountNonce(account);\\n\\n // Prevent overflow.\\n if (nonce + 1 > nonce) {\\n _setAccountNonce(account, nonce + 1);\\n }\\n }\\n\\n /**\\n * Creates a new EOA contract account, for account abstraction.\\n * @dev Essentially functions like ovmCREATE or ovmCREATE2, but we can bypass a lot of checks\\n * because the contract we're creating is trusted (no need to do safety checking or to\\n * handle unexpected reverts). Doesn't need to return an address because the address is\\n * assumed to be the user's actual address.\\n * @param _messageHash Hash of a message signed by some user, for verification.\\n * @param _v Signature `v` parameter.\\n * @param _r Signature `r` parameter.\\n * @param _s Signature `s` parameter.\\n */\\n function ovmCREATEEOA(\\n bytes32 _messageHash,\\n uint8 _v,\\n bytes32 _r,\\n bytes32 _s\\n )\\n override\\n public\\n notStatic\\n {\\n // Recover the EOA address from the message hash and signature parameters. Since we do the\\n // hashing in advance, we don't have handle different message hashing schemes. Even if this\\n // function were to return the wrong address (rather than explicitly returning the zero\\n // address), the rest of the transaction would simply fail (since there's no EOA account to\\n // actually execute the transaction).\\n address eoa = ecrecover(\\n _messageHash,\\n _v + 27,\\n _r,\\n _s\\n );\\n\\n // Invalid signature is a case we proactively handle with a revert. We could alternatively\\n // have this function return a `success` boolean, but this is just easier.\\n if (eoa == address(0)) {\\n ovmREVERT(bytes(\\\"Signature provided for EOA contract creation is invalid.\\\"));\\n }\\n\\n // If the user already has an EOA account, then there's no need to perform this operation.\\n if (_hasEmptyAccount(eoa) == false) {\\n return;\\n }\\n\\n // We always need to initialize the contract with the default account values.\\n _initPendingAccount(eoa);\\n\\n // Temporarily set the current address so it's easier to access on L2.\\n address prevADDRESS = messageContext.ovmADDRESS;\\n messageContext.ovmADDRESS = eoa;\\n\\n // Creates a duplicate of the OVM_ProxyEOA located at 0x42....09. Uses the following\\n // \\\"magic\\\" prefix to deploy an exact copy of the code:\\n // PUSH1 0x0D # size of this prefix in bytes\\n // CODESIZE\\n // SUB # subtract prefix size from codesize\\n // DUP1\\n // PUSH1 0x0D\\n // PUSH1 0x00\\n // CODECOPY # copy everything after prefix into memory at pos 0\\n // PUSH1 0x00\\n // RETURN # return the copied code\\n address proxyEOA = Lib_EthUtils.createContract(abi.encodePacked(\\n hex\\\"600D380380600D6000396000f3\\\",\\n ovmEXTCODECOPY(\\n 0x4200000000000000000000000000000000000009,\\n 0,\\n ovmEXTCODESIZE(0x4200000000000000000000000000000000000009)\\n )\\n ));\\n\\n // Reset the address now that we're done deploying.\\n messageContext.ovmADDRESS = prevADDRESS;\\n\\n // Commit the account with its final values.\\n _commitPendingAccount(\\n eoa,\\n address(proxyEOA),\\n keccak256(Lib_EthUtils.getCode(address(proxyEOA)))\\n );\\n\\n _setAccountNonce(eoa, 0);\\n }\\n\\n\\n /*********************************\\n * Opcodes: Contract Interaction *\\n *********************************/\\n\\n /**\\n * @notice Overrides CALL.\\n * @param _gasLimit Amount of gas to be passed into this call.\\n * @param _address Address of the contract to call.\\n * @param _calldata Data to send along with the call.\\n * @return _success Whether or not the call returned (rather than reverted).\\n * @return _returndata Data returned by the call.\\n */\\n function ovmCALL(\\n uint256 _gasLimit,\\n address _address,\\n bytes memory _calldata\\n )\\n override\\n public\\n fixedGasDiscount(100000)\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n // CALL updates the CALLER and ADDRESS.\\n MessageContext memory nextMessageContext = messageContext;\\n nextMessageContext.ovmCALLER = nextMessageContext.ovmADDRESS;\\n nextMessageContext.ovmADDRESS = _address;\\n\\n return _callContract(\\n nextMessageContext,\\n _gasLimit,\\n _address,\\n _calldata\\n );\\n }\\n\\n /**\\n * @notice Overrides STATICCALL.\\n * @param _gasLimit Amount of gas to be passed into this call.\\n * @param _address Address of the contract to call.\\n * @param _calldata Data to send along with the call.\\n * @return _success Whether or not the call returned (rather than reverted).\\n * @return _returndata Data returned by the call.\\n */\\n function ovmSTATICCALL(\\n uint256 _gasLimit,\\n address _address,\\n bytes memory _calldata\\n )\\n override\\n external\\n fixedGasDiscount(80000)\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n // STATICCALL updates the CALLER, updates the ADDRESS, and runs in a static context.\\n MessageContext memory nextMessageContext = messageContext;\\n nextMessageContext.ovmCALLER = nextMessageContext.ovmADDRESS;\\n nextMessageContext.ovmADDRESS = _address;\\n nextMessageContext.isStatic = true;\\n\\n return _callContract(\\n nextMessageContext,\\n _gasLimit,\\n _address,\\n _calldata\\n );\\n }\\n\\n /**\\n * @notice Overrides DELEGATECALL.\\n * @param _gasLimit Amount of gas to be passed into this call.\\n * @param _address Address of the contract to call.\\n * @param _calldata Data to send along with the call.\\n * @return _success Whether or not the call returned (rather than reverted).\\n * @return _returndata Data returned by the call.\\n */\\n function ovmDELEGATECALL(\\n uint256 _gasLimit,\\n address _address,\\n bytes memory _calldata\\n )\\n override\\n external\\n fixedGasDiscount(40000)\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n // DELEGATECALL does not change anything about the message context.\\n MessageContext memory nextMessageContext = messageContext;\\n\\n return _callContract(\\n nextMessageContext,\\n _gasLimit,\\n _address,\\n _calldata\\n );\\n }\\n\\n\\n /************************************\\n * Opcodes: Contract Storage Access *\\n ************************************/\\n\\n /**\\n * @notice Overrides SLOAD.\\n * @param _key 32 byte key of the storage slot to load.\\n * @return _value 32 byte value of the requested storage slot.\\n */\\n function ovmSLOAD(\\n bytes32 _key\\n )\\n override\\n external\\n netGasCost(40000)\\n returns (\\n bytes32 _value\\n )\\n {\\n // We always SLOAD from the storage of ADDRESS.\\n address contractAddress = ovmADDRESS();\\n\\n return _getContractStorage(\\n contractAddress,\\n _key\\n );\\n }\\n\\n /**\\n * @notice Overrides SSTORE.\\n * @param _key 32 byte key of the storage slot to set.\\n * @param _value 32 byte value for the storage slot.\\n */\\n function ovmSSTORE(\\n bytes32 _key,\\n bytes32 _value\\n )\\n override\\n external\\n notStatic\\n netGasCost(60000)\\n {\\n // We always SSTORE to the storage of ADDRESS.\\n address contractAddress = ovmADDRESS();\\n\\n _putContractStorage(\\n contractAddress,\\n _key,\\n _value\\n );\\n }\\n\\n\\n /*********************************\\n * Opcodes: Contract Code Access *\\n *********************************/\\n\\n /**\\n * @notice Overrides EXTCODECOPY.\\n * @param _contract Address of the contract to copy code from.\\n * @param _offset Offset in bytes from the start of contract code to copy beyond.\\n * @param _length Total number of bytes to copy from the contract's code.\\n * @return _code Bytes of code copied from the requested contract.\\n */\\n function ovmEXTCODECOPY(\\n address _contract,\\n uint256 _offset,\\n uint256 _length\\n )\\n override\\n public\\n returns (\\n bytes memory _code\\n )\\n {\\n return Lib_EthUtils.getCode(\\n _getAccountEthAddress(_contract),\\n _offset,\\n _length\\n );\\n }\\n\\n /**\\n * @notice Overrides EXTCODESIZE.\\n * @param _contract Address of the contract to query the size of.\\n * @return _EXTCODESIZE Size of the requested contract in bytes.\\n */\\n function ovmEXTCODESIZE(\\n address _contract\\n )\\n override\\n public\\n returns (\\n uint256 _EXTCODESIZE\\n )\\n {\\n return Lib_EthUtils.getCodeSize(\\n _getAccountEthAddress(_contract)\\n );\\n }\\n\\n /**\\n * @notice Overrides EXTCODEHASH.\\n * @param _contract Address of the contract to query the hash of.\\n * @return _EXTCODEHASH Hash of the requested contract.\\n */\\n function ovmEXTCODEHASH(\\n address _contract\\n )\\n override\\n external\\n returns (\\n bytes32 _EXTCODEHASH\\n )\\n {\\n return Lib_EthUtils.getCodeHash(\\n _getAccountEthAddress(_contract)\\n );\\n }\\n\\n /***************************************\\n * Public Functions: Execution Context *\\n ***************************************/\\n\\n function getMaxTransactionGasLimit()\\n external\\n view\\n override\\n returns (\\n uint256 _maxTransactionGasLimit\\n )\\n {\\n return gasMeterConfig.maxTransactionGasLimit;\\n }\\n\\n /********************************************\\n * Public Functions: Deployment Whitelisting *\\n ********************************************/\\n\\n /**\\n * Checks whether the given address is on the whitelist to ovmCREATE/ovmCREATE2, and reverts if not.\\n * @param _deployerAddress Address attempting to deploy a contract.\\n */\\n function _checkDeployerAllowed(\\n address _deployerAddress\\n )\\n internal\\n {\\n // From an OVM semantics perspective, this will appear identical to\\n // the deployer ovmCALLing the whitelist. This is fine--in a sense, we are forcing them to.\\n (bool success, bytes memory data) = ovmCALL(\\n gasleft(),\\n 0x4200000000000000000000000000000000000002,\\n abi.encodeWithSignature(\\\"isDeployerAllowed(address)\\\", _deployerAddress)\\n );\\n bool isAllowed = abi.decode(data, (bool));\\n\\n if (!isAllowed || !success) {\\n _revertWithFlag(RevertFlag.CREATOR_NOT_ALLOWED);\\n }\\n }\\n\\n /********************************************\\n * Internal Functions: Contract Interaction *\\n ********************************************/\\n\\n /**\\n * Creates a new contract and associates it with some contract address.\\n * @param _contractAddress Address to associate the created contract with.\\n * @param _bytecode Bytecode to be used to create the contract.\\n * @return Final OVM contract address.\\n * @return Revertdata, if and only if the creation threw an exception.\\n */\\n function _createContract(\\n address _contractAddress,\\n bytes memory _bytecode\\n )\\n internal\\n returns (\\n address,\\n bytes memory\\n )\\n {\\n // We always update the nonce of the creating account, even if the creation fails.\\n _setAccountNonce(ovmADDRESS(), _getAccountNonce(ovmADDRESS()) + 1);\\n\\n // We're stepping into a CREATE or CREATE2, so we need to update ADDRESS to point\\n // to the contract's associated address and CALLER to point to the previous ADDRESS.\\n MessageContext memory nextMessageContext = messageContext;\\n nextMessageContext.ovmCALLER = messageContext.ovmADDRESS;\\n nextMessageContext.ovmADDRESS = _contractAddress;\\n\\n // Run the common logic which occurs between call-type and create-type messages,\\n // passing in the creation bytecode and `true` to trigger create-specific logic.\\n (bool success, bytes memory data) = _handleExternalMessage(\\n nextMessageContext,\\n gasleft(),\\n _contractAddress,\\n _bytecode,\\n true\\n );\\n\\n // Yellow paper requires that address returned is zero if the contract deployment fails.\\n return (\\n success ? _contractAddress : address(0),\\n data\\n );\\n }\\n\\n /**\\n * Calls the deployed contract associated with a given address.\\n * @param _nextMessageContext Message context to be used for the call.\\n * @param _gasLimit Amount of gas to be passed into this call.\\n * @param _contract OVM address to be called.\\n * @param _calldata Data to send along with the call.\\n * @return _success Whether or not the call returned (rather than reverted).\\n * @return _returndata Data returned by the call.\\n */\\n function _callContract(\\n MessageContext memory _nextMessageContext,\\n uint256 _gasLimit,\\n address _contract,\\n bytes memory _calldata\\n )\\n internal\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n // We reserve addresses of the form 0xdeaddeaddead...NNNN for the container contracts in L2 geth.\\n // So, we block calls to these addresses since they are not safe to run as an OVM contract itself.\\n if (\\n (uint256(_contract) & uint256(0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000))\\n == uint256(0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000)\\n ) {\\n // EVM does not return data in the success case, see: https://github.com/ethereum/go-ethereum/blob/aae7660410f0ef90279e14afaaf2f429fdc2a186/core/vm/instructions.go#L600-L604\\n return (true, hex'');\\n }\\n\\n // Both 0x0000... and the EVM precompiles have the same address on L1 and L2 --> no trie lookup needed.\\n address codeContractAddress =\\n uint(_contract) < 100\\n ? _contract\\n : _getAccountEthAddress(_contract);\\n\\n return _handleExternalMessage(\\n _nextMessageContext,\\n _gasLimit,\\n codeContractAddress,\\n _calldata,\\n false\\n );\\n }\\n\\n /**\\n * Handles all interactions which involve the execution manager calling out to untrusted code (both calls and creates).\\n * Ensures that OVM-related measures are enforced, including L2 gas refunds, nuisance gas, and flagged reversions.\\n *\\n * @param _nextMessageContext Message context to be used for the external message.\\n * @param _gasLimit Amount of gas to be passed into this message.\\n * @param _contract OVM address being called or deployed to\\n * @param _data Data for the message (either calldata or creation code)\\n * @param _isCreate Whether this is a create-type message.\\n * @return Whether or not the message (either a call or deployment) succeeded.\\n * @return Data returned by the message.\\n */\\n function _handleExternalMessage(\\n MessageContext memory _nextMessageContext,\\n uint256 _gasLimit,\\n address _contract,\\n bytes memory _data,\\n bool _isCreate\\n )\\n internal\\n returns (\\n bool,\\n bytes memory\\n )\\n {\\n // We need to switch over to our next message context for the duration of this call.\\n MessageContext memory prevMessageContext = messageContext;\\n _switchMessageContext(prevMessageContext, _nextMessageContext);\\n\\n // Nuisance gas is a system used to bound the ability for an attacker to make fraud proofs\\n // expensive by touching a lot of different accounts or storage slots. Since most contracts\\n // only use a few storage slots during any given transaction, this shouldn't be a limiting\\n // factor.\\n uint256 prevNuisanceGasLeft = messageRecord.nuisanceGasLeft;\\n uint256 nuisanceGasLimit = _getNuisanceGasLimit(_gasLimit);\\n messageRecord.nuisanceGasLeft = nuisanceGasLimit;\\n\\n // Make the call and make sure to pass in the gas limit. Another instance of hidden\\n // complexity. `_contract` is guaranteed to be a safe contract, meaning its return/revert\\n // behavior can be controlled. In particular, we enforce that flags are passed through\\n // revert data as to retrieve execution metadata that would normally be reverted out of\\n // existence.\\n\\n bool success;\\n bytes memory returndata;\\n if (_isCreate) {\\n // safeCREATE() is a function which replicates a CREATE message, but uses return values\\n // Which match that of CALL (i.e. bool, bytes). This allows many security checks to be\\n // to be shared between untrusted call and create call frames.\\n (success, returndata) = address(this).call(\\n abi.encodeWithSelector(\\n this.safeCREATE.selector,\\n _gasLimit,\\n _data,\\n _contract\\n )\\n );\\n } else {\\n (success, returndata) = _contract.call{gas: _gasLimit}(_data);\\n }\\n\\n // Switch back to the original message context now that we're out of the call.\\n _switchMessageContext(_nextMessageContext, prevMessageContext);\\n\\n // Assuming there were no reverts, the message record should be accurate here. We'll update\\n // this value in the case of a revert.\\n uint256 nuisanceGasLeft = messageRecord.nuisanceGasLeft;\\n\\n // Reverts at this point are completely OK, but we need to make a few updates based on the\\n // information passed through the revert.\\n if (success == false) {\\n (\\n RevertFlag flag,\\n uint256 nuisanceGasLeftPostRevert,\\n uint256 ovmGasRefund,\\n bytes memory returndataFromFlag\\n ) = _decodeRevertData(returndata);\\n\\n // INVALID_STATE_ACCESS is the only flag that triggers an immediate abort of the\\n // parent EVM message. This behavior is necessary because INVALID_STATE_ACCESS must\\n // halt any further transaction execution that could impact the execution result.\\n if (flag == RevertFlag.INVALID_STATE_ACCESS) {\\n _revertWithFlag(flag);\\n }\\n\\n // INTENTIONAL_REVERT, UNSAFE_BYTECODE, STATIC_VIOLATION, and CREATOR_NOT_ALLOWED aren't\\n // dependent on the input state, so we can just handle them like standard reverts. Our only change here\\n // is to record the gas refund reported by the call (enforced by safety checking).\\n if (\\n flag == RevertFlag.INTENTIONAL_REVERT\\n || flag == RevertFlag.UNSAFE_BYTECODE\\n || flag == RevertFlag.STATIC_VIOLATION\\n || flag == RevertFlag.CREATOR_NOT_ALLOWED\\n ) {\\n transactionRecord.ovmGasRefund = ovmGasRefund;\\n }\\n\\n // INTENTIONAL_REVERT needs to pass up the user-provided return data encoded into the\\n // flag, *not* the full encoded flag. All other revert types return no data.\\n if (\\n flag == RevertFlag.INTENTIONAL_REVERT\\n || _isCreate\\n ) {\\n returndata = returndataFromFlag;\\n } else {\\n returndata = hex'';\\n }\\n\\n // Reverts mean we need to use up whatever \\\"nuisance gas\\\" was used by the call.\\n // EXCEEDS_NUISANCE_GAS explicitly reduces the remaining nuisance gas for this message\\n // to zero. OUT_OF_GAS is a \\\"pseudo\\\" flag given that messages return no data when they\\n // run out of gas, so we have to treat this like EXCEEDS_NUISANCE_GAS. All other flags\\n // will simply pass up the remaining nuisance gas.\\n nuisanceGasLeft = nuisanceGasLeftPostRevert;\\n }\\n\\n // We need to reset the nuisance gas back to its original value minus the amount used here.\\n messageRecord.nuisanceGasLeft = prevNuisanceGasLeft - (nuisanceGasLimit - nuisanceGasLeft);\\n\\n return (\\n success,\\n returndata\\n );\\n }\\n\\n /**\\n * Handles the creation-specific safety measures required for OVM contract deployment.\\n * This function sanitizes the return types for creation messages to match calls (bool, bytes),\\n * by being an external function which the EM can call, that mimics the success/fail case of the CREATE.\\n * This allows for consistent handling of both types of messages in _handleExternalMessage().\\n * Having this step occur as a separate call frame also allows us to easily revert the\\n * contract deployment in the event that the code is unsafe.\\n *\\n * @param _gasLimit Amount of gas to be passed into this creation.\\n * @param _creationCode Code to pass into CREATE for deployment.\\n * @param _address OVM address being deployed to.\\n */\\n function safeCREATE(\\n uint _gasLimit,\\n bytes memory _creationCode,\\n address _address\\n )\\n external\\n {\\n // The only way this should callable is from within _createContract(),\\n // and it should DEFINITELY not be callable by a non-EM code contract.\\n if (msg.sender != address(this)) {\\n return;\\n }\\n // Check that there is not already code at this address.\\n if (_hasEmptyAccount(_address) == false) {\\n // Note: in the EVM, this case burns all allotted gas. For improved\\n // developer experience, we do return the remaining gas.\\n _revertWithFlag(\\n RevertFlag.CREATE_COLLISION,\\n Lib_ErrorUtils.encodeRevertString(\\\"A contract has already been deployed to this address\\\")\\n );\\n }\\n\\n // Check the creation bytecode against the OVM_SafetyChecker.\\n if (ovmSafetyChecker.isBytecodeSafe(_creationCode) == false) {\\n _revertWithFlag(\\n RevertFlag.UNSAFE_BYTECODE,\\n Lib_ErrorUtils.encodeRevertString(\\\"Contract creation code contains unsafe opcodes. Did you use the right compiler or pass an unsafe constructor argument?\\\")\\n );\\n }\\n\\n // We always need to initialize the contract with the default account values.\\n _initPendingAccount(_address);\\n\\n // Actually execute the EVM create message.\\n // NOTE: The inline assembly below means we can NOT make any evm calls between here and then.\\n address ethAddress = Lib_EthUtils.createContract(_creationCode);\\n\\n if (ethAddress == address(0)) {\\n // If the creation fails, the EVM lets us grab its revert data. This may contain a revert flag\\n // to be used above in _handleExternalMessage, so we pass the revert data back up unmodified.\\n assembly {\\n returndatacopy(0,0,returndatasize())\\n revert(0, returndatasize())\\n }\\n }\\n\\n // Again simply checking that the deployed code is safe too. Contracts can generate\\n // arbitrary deployment code, so there's no easy way to analyze this beforehand.\\n bytes memory deployedCode = Lib_EthUtils.getCode(ethAddress);\\n if (ovmSafetyChecker.isBytecodeSafe(deployedCode) == false) {\\n _revertWithFlag(\\n RevertFlag.UNSAFE_BYTECODE,\\n Lib_ErrorUtils.encodeRevertString(\\\"Constructor attempted to deploy unsafe bytecode.\\\")\\n );\\n }\\n\\n // Contract creation didn't need to be reverted and the bytecode is safe. We finish up by\\n // associating the desired address with the newly created contract's code hash and address.\\n _commitPendingAccount(\\n _address,\\n ethAddress,\\n Lib_EthUtils.getCodeHash(ethAddress)\\n );\\n }\\n\\n /******************************************\\n * Internal Functions: State Manipulation *\\n ******************************************/\\n\\n /**\\n * Checks whether an account exists within the OVM_StateManager.\\n * @param _address Address of the account to check.\\n * @return _exists Whether or not the account exists.\\n */\\n function _hasAccount(\\n address _address\\n )\\n internal\\n returns (\\n bool _exists\\n )\\n {\\n _checkAccountLoad(_address);\\n return ovmStateManager.hasAccount(_address);\\n }\\n\\n /**\\n * Checks whether a known empty account exists within the OVM_StateManager.\\n * @param _address Address of the account to check.\\n * @return _exists Whether or not the account empty exists.\\n */\\n function _hasEmptyAccount(\\n address _address\\n )\\n internal\\n returns (\\n bool _exists\\n )\\n {\\n _checkAccountLoad(_address);\\n return ovmStateManager.hasEmptyAccount(_address);\\n }\\n\\n /**\\n * Sets the nonce of an account.\\n * @param _address Address of the account to modify.\\n * @param _nonce New account nonce.\\n */\\n function _setAccountNonce(\\n address _address,\\n uint256 _nonce\\n )\\n internal\\n {\\n _checkAccountChange(_address);\\n ovmStateManager.setAccountNonce(_address, _nonce);\\n }\\n\\n /**\\n * Gets the nonce of an account.\\n * @param _address Address of the account to access.\\n * @return _nonce Nonce of the account.\\n */\\n function _getAccountNonce(\\n address _address\\n )\\n internal\\n returns (\\n uint256 _nonce\\n )\\n {\\n _checkAccountLoad(_address);\\n return ovmStateManager.getAccountNonce(_address);\\n }\\n\\n /**\\n * Retrieves the Ethereum address of an account.\\n * @param _address Address of the account to access.\\n * @return _ethAddress Corresponding Ethereum address.\\n */\\n function _getAccountEthAddress(\\n address _address\\n )\\n internal\\n returns (\\n address _ethAddress\\n )\\n {\\n _checkAccountLoad(_address);\\n return ovmStateManager.getAccountEthAddress(_address);\\n }\\n\\n /**\\n * Creates the default account object for the given address.\\n * @param _address Address of the account create.\\n */\\n function _initPendingAccount(\\n address _address\\n )\\n internal\\n {\\n // Although it seems like `_checkAccountChange` would be more appropriate here, we don't\\n // actually consider an account \\\"changed\\\" until it's inserted into the state (in this case\\n // by `_commitPendingAccount`).\\n _checkAccountLoad(_address);\\n ovmStateManager.initPendingAccount(_address);\\n }\\n\\n /**\\n * Stores additional relevant data for a new account, thereby \\\"committing\\\" it to the state.\\n * This function is only called during `ovmCREATE` and `ovmCREATE2` after a successful contract\\n * creation.\\n * @param _address Address of the account to commit.\\n * @param _ethAddress Address of the associated deployed contract.\\n * @param _codeHash Hash of the code stored at the address.\\n */\\n function _commitPendingAccount(\\n address _address,\\n address _ethAddress,\\n bytes32 _codeHash\\n )\\n internal\\n {\\n _checkAccountChange(_address);\\n ovmStateManager.commitPendingAccount(\\n _address,\\n _ethAddress,\\n _codeHash\\n );\\n }\\n\\n /**\\n * Retrieves the value of a storage slot.\\n * @param _contract Address of the contract to query.\\n * @param _key 32 byte key of the storage slot.\\n * @return _value 32 byte storage slot value.\\n */\\n function _getContractStorage(\\n address _contract,\\n bytes32 _key\\n )\\n internal\\n returns (\\n bytes32 _value\\n )\\n {\\n _checkContractStorageLoad(_contract, _key);\\n return ovmStateManager.getContractStorage(_contract, _key);\\n }\\n\\n /**\\n * Sets the value of a storage slot.\\n * @param _contract Address of the contract to modify.\\n * @param _key 32 byte key of the storage slot.\\n * @param _value 32 byte storage slot value.\\n */\\n function _putContractStorage(\\n address _contract,\\n bytes32 _key,\\n bytes32 _value\\n )\\n internal\\n {\\n // We don't set storage if the value didn't change. Although this acts as a convenient\\n // optimization, it's also necessary to avoid the case in which a contract with no storage\\n // attempts to store the value \\\"0\\\" at any key. Putting this value (and therefore requiring\\n // that the value be committed into the storage trie after execution) would incorrectly\\n // modify the storage root.\\n if (_getContractStorage(_contract, _key) == _value) {\\n return;\\n }\\n\\n _checkContractStorageChange(_contract, _key);\\n ovmStateManager.putContractStorage(_contract, _key, _value);\\n }\\n\\n /**\\n * Validation whenever a contract needs to be loaded. Checks that the account exists, charges\\n * nuisance gas if the account hasn't been loaded before.\\n * @param _address Address of the account to load.\\n */\\n function _checkAccountLoad(\\n address _address\\n )\\n internal\\n {\\n // See `_checkContractStorageLoad` for more information.\\n if (gasleft() < MIN_GAS_FOR_INVALID_STATE_ACCESS) {\\n _revertWithFlag(RevertFlag.OUT_OF_GAS);\\n }\\n\\n // See `_checkContractStorageLoad` for more information.\\n if (ovmStateManager.hasAccount(_address) == false) {\\n _revertWithFlag(RevertFlag.INVALID_STATE_ACCESS);\\n }\\n\\n // Check whether the account has been loaded before and mark it as loaded if not. We need\\n // this because \\\"nuisance gas\\\" only applies to the first time that an account is loaded.\\n (\\n bool _wasAccountAlreadyLoaded\\n ) = ovmStateManager.testAndSetAccountLoaded(_address);\\n\\n // If we hadn't already loaded the account, then we'll need to charge \\\"nuisance gas\\\" based\\n // on the size of the contract code.\\n if (_wasAccountAlreadyLoaded == false) {\\n _useNuisanceGas(\\n (Lib_EthUtils.getCodeSize(_getAccountEthAddress(_address)) * NUISANCE_GAS_PER_CONTRACT_BYTE) + MIN_NUISANCE_GAS_PER_CONTRACT\\n );\\n }\\n }\\n\\n /**\\n * Validation whenever a contract needs to be changed. Checks that the account exists, charges\\n * nuisance gas if the account hasn't been changed before.\\n * @param _address Address of the account to change.\\n */\\n function _checkAccountChange(\\n address _address\\n )\\n internal\\n {\\n // Start by checking for a load as we only want to charge nuisance gas proportional to\\n // contract size once.\\n _checkAccountLoad(_address);\\n\\n // Check whether the account has been changed before and mark it as changed if not. We need\\n // this because \\\"nuisance gas\\\" only applies to the first time that an account is changed.\\n (\\n bool _wasAccountAlreadyChanged\\n ) = ovmStateManager.testAndSetAccountChanged(_address);\\n\\n // If we hadn't already loaded the account, then we'll need to charge \\\"nuisance gas\\\" based\\n // on the size of the contract code.\\n if (_wasAccountAlreadyChanged == false) {\\n ovmStateManager.incrementTotalUncommittedAccounts();\\n _useNuisanceGas(\\n (Lib_EthUtils.getCodeSize(_getAccountEthAddress(_address)) * NUISANCE_GAS_PER_CONTRACT_BYTE) + MIN_NUISANCE_GAS_PER_CONTRACT\\n );\\n }\\n }\\n\\n /**\\n * Validation whenever a slot needs to be loaded. Checks that the account exists, charges\\n * nuisance gas if the slot hasn't been loaded before.\\n * @param _contract Address of the account to load from.\\n * @param _key 32 byte key to load.\\n */\\n function _checkContractStorageLoad(\\n address _contract,\\n bytes32 _key\\n )\\n internal\\n {\\n // Another case of hidden complexity. If we didn't enforce this requirement, then a\\n // contract could pass in just enough gas to cause the INVALID_STATE_ACCESS check to fail\\n // on L1 but not on L2. A contract could use this behavior to prevent the\\n // OVM_ExecutionManager from detecting an invalid state access. Reverting with OUT_OF_GAS\\n // allows us to also charge for the full message nuisance gas, because you deserve that for\\n // trying to break the contract in this way.\\n if (gasleft() < MIN_GAS_FOR_INVALID_STATE_ACCESS) {\\n _revertWithFlag(RevertFlag.OUT_OF_GAS);\\n }\\n\\n // We need to make sure that the transaction isn't trying to access storage that hasn't\\n // been provided to the OVM_StateManager. We'll immediately abort if this is the case.\\n // We know that we have enough gas to do this check because of the above test.\\n if (ovmStateManager.hasContractStorage(_contract, _key) == false) {\\n _revertWithFlag(RevertFlag.INVALID_STATE_ACCESS);\\n }\\n\\n // Check whether the slot has been loaded before and mark it as loaded if not. We need\\n // this because \\\"nuisance gas\\\" only applies to the first time that a slot is loaded.\\n (\\n bool _wasContractStorageAlreadyLoaded\\n ) = ovmStateManager.testAndSetContractStorageLoaded(_contract, _key);\\n\\n // If we hadn't already loaded the account, then we'll need to charge some fixed amount of\\n // \\\"nuisance gas\\\".\\n if (_wasContractStorageAlreadyLoaded == false) {\\n _useNuisanceGas(NUISANCE_GAS_SLOAD);\\n }\\n }\\n\\n /**\\n * Validation whenever a slot needs to be changed. Checks that the account exists, charges\\n * nuisance gas if the slot hasn't been changed before.\\n * @param _contract Address of the account to change.\\n * @param _key 32 byte key to change.\\n */\\n function _checkContractStorageChange(\\n address _contract,\\n bytes32 _key\\n )\\n internal\\n {\\n // Start by checking for load to make sure we have the storage slot and that we charge the\\n // \\\"nuisance gas\\\" necessary to prove the storage slot state.\\n _checkContractStorageLoad(_contract, _key);\\n\\n // Check whether the slot has been changed before and mark it as changed if not. We need\\n // this because \\\"nuisance gas\\\" only applies to the first time that a slot is changed.\\n (\\n bool _wasContractStorageAlreadyChanged\\n ) = ovmStateManager.testAndSetContractStorageChanged(_contract, _key);\\n\\n // If we hadn't already changed the account, then we'll need to charge some fixed amount of\\n // \\\"nuisance gas\\\".\\n if (_wasContractStorageAlreadyChanged == false) {\\n // Changing a storage slot means that we're also going to have to change the\\n // corresponding account, so do an account change check.\\n _checkAccountChange(_contract);\\n\\n ovmStateManager.incrementTotalUncommittedContractStorage();\\n _useNuisanceGas(NUISANCE_GAS_SSTORE);\\n }\\n }\\n\\n\\n /************************************\\n * Internal Functions: Revert Logic *\\n ************************************/\\n\\n /**\\n * Simple encoding for revert data.\\n * @param _flag Flag to revert with.\\n * @param _data Additional user-provided revert data.\\n * @return _revertdata Encoded revert data.\\n */\\n function _encodeRevertData(\\n RevertFlag _flag,\\n bytes memory _data\\n )\\n internal\\n view\\n returns (\\n bytes memory _revertdata\\n )\\n {\\n // Out of gas and create exceptions will fundamentally return no data, so simulating it shouldn't either.\\n if (\\n _flag == RevertFlag.OUT_OF_GAS\\n ) {\\n return bytes('');\\n }\\n\\n // INVALID_STATE_ACCESS doesn't need to return any data other than the flag.\\n if (_flag == RevertFlag.INVALID_STATE_ACCESS) {\\n return abi.encode(\\n _flag,\\n 0,\\n 0,\\n bytes('')\\n );\\n }\\n\\n // Just ABI encode the rest of the parameters.\\n return abi.encode(\\n _flag,\\n messageRecord.nuisanceGasLeft,\\n transactionRecord.ovmGasRefund,\\n _data\\n );\\n }\\n\\n /**\\n * Simple decoding for revert data.\\n * @param _revertdata Revert data to decode.\\n * @return _flag Flag used to revert.\\n * @return _nuisanceGasLeft Amount of nuisance gas unused by the message.\\n * @return _ovmGasRefund Amount of gas refunded during the message.\\n * @return _data Additional user-provided revert data.\\n */\\n function _decodeRevertData(\\n bytes memory _revertdata\\n )\\n internal\\n pure\\n returns (\\n RevertFlag _flag,\\n uint256 _nuisanceGasLeft,\\n uint256 _ovmGasRefund,\\n bytes memory _data\\n )\\n {\\n // A length of zero means the call ran out of gas, just return empty data.\\n if (_revertdata.length == 0) {\\n return (\\n RevertFlag.OUT_OF_GAS,\\n 0,\\n 0,\\n bytes('')\\n );\\n }\\n\\n // ABI decode the incoming data.\\n return abi.decode(_revertdata, (RevertFlag, uint256, uint256, bytes));\\n }\\n\\n /**\\n * Causes a message to revert or abort.\\n * @param _flag Flag to revert with.\\n * @param _data Additional user-provided data.\\n */\\n function _revertWithFlag(\\n RevertFlag _flag,\\n bytes memory _data\\n )\\n internal\\n view\\n {\\n bytes memory revertdata = _encodeRevertData(\\n _flag,\\n _data\\n );\\n\\n assembly {\\n revert(add(revertdata, 0x20), mload(revertdata))\\n }\\n }\\n\\n /**\\n * Causes a message to revert or abort.\\n * @param _flag Flag to revert with.\\n */\\n function _revertWithFlag(\\n RevertFlag _flag\\n )\\n internal\\n {\\n _revertWithFlag(_flag, bytes(''));\\n }\\n\\n\\n /******************************************\\n * Internal Functions: Nuisance Gas Logic *\\n ******************************************/\\n\\n /**\\n * Computes the nuisance gas limit from the gas limit.\\n * @dev This function is currently using a naive implementation whereby the nuisance gas limit\\n * is set to exactly equal the lesser of the gas limit or remaining gas. It's likely that\\n * this implementation is perfectly fine, but we may change this formula later.\\n * @param _gasLimit Gas limit to compute from.\\n * @return _nuisanceGasLimit Computed nuisance gas limit.\\n */\\n function _getNuisanceGasLimit(\\n uint256 _gasLimit\\n )\\n internal\\n view\\n returns (\\n uint256 _nuisanceGasLimit\\n )\\n {\\n return _gasLimit < gasleft() ? _gasLimit : gasleft();\\n }\\n\\n /**\\n * Uses a certain amount of nuisance gas.\\n * @param _amount Amount of nuisance gas to use.\\n */\\n function _useNuisanceGas(\\n uint256 _amount\\n )\\n internal\\n {\\n // Essentially the same as a standard OUT_OF_GAS, except we also retain a record of the gas\\n // refund to be given at the end of the transaction.\\n if (messageRecord.nuisanceGasLeft < _amount) {\\n _revertWithFlag(RevertFlag.EXCEEDS_NUISANCE_GAS);\\n }\\n\\n messageRecord.nuisanceGasLeft -= _amount;\\n }\\n\\n\\n /************************************\\n * Internal Functions: Gas Metering *\\n ************************************/\\n\\n /**\\n * Checks whether a transaction needs to start a new epoch and does so if necessary.\\n * @param _timestamp Transaction timestamp.\\n */\\n function _checkNeedsNewEpoch(\\n uint256 _timestamp\\n )\\n internal\\n {\\n if (\\n _timestamp >= (\\n _getGasMetadata(GasMetadataKey.CURRENT_EPOCH_START_TIMESTAMP)\\n + gasMeterConfig.secondsPerEpoch\\n )\\n ) {\\n _putGasMetadata(\\n GasMetadataKey.CURRENT_EPOCH_START_TIMESTAMP,\\n _timestamp\\n );\\n\\n _putGasMetadata(\\n GasMetadataKey.PREV_EPOCH_SEQUENCER_QUEUE_GAS,\\n _getGasMetadata(\\n GasMetadataKey.CUMULATIVE_SEQUENCER_QUEUE_GAS\\n )\\n );\\n\\n _putGasMetadata(\\n GasMetadataKey.PREV_EPOCH_L1TOL2_QUEUE_GAS,\\n _getGasMetadata(\\n GasMetadataKey.CUMULATIVE_L1TOL2_QUEUE_GAS\\n )\\n );\\n }\\n }\\n\\n /**\\n * Validates the input values of a transaction.\\n * @return _valid Whether or not the transaction data is valid.\\n */\\n function _isValidInput(\\n Lib_OVMCodec.Transaction memory _transaction\\n )\\n view\\n internal\\n returns (\\n bool\\n )\\n {\\n // Prevent reentrancy to run():\\n // This check prevents calling run with the default ovmNumber.\\n // Combined with the first check in run():\\n // if (transactionContext.ovmNUMBER != DEFAULT_UINT256) { return; }\\n // It should be impossible to re-enter since run() returns before any other call frames are created.\\n // Since this value is already being written to storage, we save much gas compared to\\n // using the standard nonReentrant pattern.\\n if (_transaction.blockNumber == DEFAULT_UINT256) {\\n return false;\\n }\\n\\n if (_isValidGasLimit(_transaction.gasLimit, _transaction.l1QueueOrigin) == false) {\\n return false;\\n }\\n\\n return true;\\n }\\n\\n /**\\n * Validates the gas limit for a given transaction.\\n * @param _gasLimit Gas limit provided by the transaction.\\n * param _queueOrigin Queue from which the transaction originated.\\n * @return _valid Whether or not the gas limit is valid.\\n */\\n function _isValidGasLimit(\\n uint256 _gasLimit,\\n Lib_OVMCodec.QueueOrigin // _queueOrigin\\n )\\n view\\n internal\\n returns (\\n bool _valid\\n )\\n {\\n // Always have to be below the maximum gas limit.\\n if (_gasLimit > gasMeterConfig.maxTransactionGasLimit) {\\n return false;\\n }\\n\\n // Always have to be above the minimum gas limit.\\n if (_gasLimit < gasMeterConfig.minTransactionGasLimit) {\\n return false;\\n }\\n\\n // TEMPORARY: Gas metering is disabled for minnet.\\n return true;\\n // GasMetadataKey cumulativeGasKey;\\n // GasMetadataKey prevEpochGasKey;\\n // if (_queueOrigin == Lib_OVMCodec.QueueOrigin.SEQUENCER_QUEUE) {\\n // cumulativeGasKey = GasMetadataKey.CUMULATIVE_SEQUENCER_QUEUE_GAS;\\n // prevEpochGasKey = GasMetadataKey.PREV_EPOCH_SEQUENCER_QUEUE_GAS;\\n // } else {\\n // cumulativeGasKey = GasMetadataKey.CUMULATIVE_L1TOL2_QUEUE_GAS;\\n // prevEpochGasKey = GasMetadataKey.PREV_EPOCH_L1TOL2_QUEUE_GAS;\\n // }\\n\\n // return (\\n // (\\n // _getGasMetadata(cumulativeGasKey)\\n // - _getGasMetadata(prevEpochGasKey)\\n // + _gasLimit\\n // ) < gasMeterConfig.maxGasPerQueuePerEpoch\\n // );\\n }\\n\\n /**\\n * Updates the cumulative gas after a transaction.\\n * @param _gasUsed Gas used by the transaction.\\n * @param _queueOrigin Queue from which the transaction originated.\\n */\\n function _updateCumulativeGas(\\n uint256 _gasUsed,\\n Lib_OVMCodec.QueueOrigin _queueOrigin\\n )\\n internal\\n {\\n GasMetadataKey cumulativeGasKey;\\n if (_queueOrigin == Lib_OVMCodec.QueueOrigin.SEQUENCER_QUEUE) {\\n cumulativeGasKey = GasMetadataKey.CUMULATIVE_SEQUENCER_QUEUE_GAS;\\n } else {\\n cumulativeGasKey = GasMetadataKey.CUMULATIVE_L1TOL2_QUEUE_GAS;\\n }\\n\\n _putGasMetadata(\\n cumulativeGasKey,\\n (\\n _getGasMetadata(cumulativeGasKey)\\n + gasMeterConfig.minTransactionGasLimit\\n + _gasUsed\\n - transactionRecord.ovmGasRefund\\n )\\n );\\n }\\n\\n /**\\n * Retrieves the value of a gas metadata key.\\n * @param _key Gas metadata key to retrieve.\\n * @return _value Value stored at the given key.\\n */\\n function _getGasMetadata(\\n GasMetadataKey _key\\n )\\n internal\\n returns (\\n uint256 _value\\n )\\n {\\n return uint256(_getContractStorage(\\n GAS_METADATA_ADDRESS,\\n bytes32(uint256(_key))\\n ));\\n }\\n\\n /**\\n * Sets the value of a gas metadata key.\\n * @param _key Gas metadata key to set.\\n * @param _value Value to store at the given key.\\n */\\n function _putGasMetadata(\\n GasMetadataKey _key,\\n uint256 _value\\n )\\n internal\\n {\\n _putContractStorage(\\n GAS_METADATA_ADDRESS,\\n bytes32(uint256(_key)),\\n bytes32(uint256(_value))\\n );\\n }\\n\\n\\n /*****************************************\\n * Internal Functions: Execution Context *\\n *****************************************/\\n\\n /**\\n * Swaps over to a new message context.\\n * @param _prevMessageContext Context we're switching from.\\n * @param _nextMessageContext Context we're switching to.\\n */\\n function _switchMessageContext(\\n MessageContext memory _prevMessageContext,\\n MessageContext memory _nextMessageContext\\n )\\n internal\\n {\\n // Avoid unnecessary the SSTORE.\\n if (_prevMessageContext.ovmCALLER != _nextMessageContext.ovmCALLER) {\\n messageContext.ovmCALLER = _nextMessageContext.ovmCALLER;\\n }\\n\\n // Avoid unnecessary the SSTORE.\\n if (_prevMessageContext.ovmADDRESS != _nextMessageContext.ovmADDRESS) {\\n messageContext.ovmADDRESS = _nextMessageContext.ovmADDRESS;\\n }\\n\\n // Avoid unnecessary the SSTORE.\\n if (_prevMessageContext.isStatic != _nextMessageContext.isStatic) {\\n messageContext.isStatic = _nextMessageContext.isStatic;\\n }\\n }\\n\\n /**\\n * Initializes the execution context.\\n * @param _transaction OVM transaction being executed.\\n */\\n function _initContext(\\n Lib_OVMCodec.Transaction memory _transaction\\n )\\n internal\\n {\\n transactionContext.ovmTIMESTAMP = _transaction.timestamp;\\n transactionContext.ovmNUMBER = _transaction.blockNumber;\\n transactionContext.ovmTXGASLIMIT = _transaction.gasLimit;\\n transactionContext.ovmL1QUEUEORIGIN = _transaction.l1QueueOrigin;\\n transactionContext.ovmL1TXORIGIN = _transaction.l1TxOrigin;\\n transactionContext.ovmGASLIMIT = gasMeterConfig.maxGasPerQueuePerEpoch;\\n\\n messageRecord.nuisanceGasLeft = _getNuisanceGasLimit(_transaction.gasLimit);\\n }\\n\\n /**\\n * Resets the transaction and message context.\\n */\\n function _resetContext()\\n internal\\n {\\n transactionContext.ovmL1TXORIGIN = DEFAULT_ADDRESS;\\n transactionContext.ovmTIMESTAMP = DEFAULT_UINT256;\\n transactionContext.ovmNUMBER = DEFAULT_UINT256;\\n transactionContext.ovmGASLIMIT = DEFAULT_UINT256;\\n transactionContext.ovmTXGASLIMIT = DEFAULT_UINT256;\\n transactionContext.ovmL1QUEUEORIGIN = Lib_OVMCodec.QueueOrigin.SEQUENCER_QUEUE;\\n\\n transactionRecord.ovmGasRefund = DEFAULT_UINT256;\\n\\n messageContext.ovmCALLER = DEFAULT_ADDRESS;\\n messageContext.ovmADDRESS = DEFAULT_ADDRESS;\\n messageContext.isStatic = false;\\n\\n messageRecord.nuisanceGasLeft = DEFAULT_UINT256;\\n\\n // Reset the ovmStateManager.\\n ovmStateManager = iOVM_StateManager(address(0));\\n }\\n\\n /*****************************\\n * L2-only Helper Functions *\\n *****************************/\\n\\n /**\\n * Unreachable helper function for simulating eth_calls with an OVM message context.\\n * This function will throw an exception in all cases other than when used as a custom entrypoint in L2 Geth to simulate eth_call.\\n * @param _transaction the message transaction to simulate.\\n * @param _from the OVM account the simulated call should be from.\\n */\\n function simulateMessage(\\n Lib_OVMCodec.Transaction memory _transaction,\\n address _from,\\n iOVM_StateManager _ovmStateManager\\n )\\n external\\n returns (\\n bytes memory\\n )\\n {\\n // Prevent this call from having any effect unless in a custom-set VM frame\\n require(msg.sender == address(0));\\n\\n ovmStateManager = _ovmStateManager;\\n _initContext(_transaction);\\n messageRecord.nuisanceGasLeft = uint(-1);\\n\\n messageContext.ovmADDRESS = _from;\\n\\n bool isCreate = _transaction.entrypoint == address(0);\\n if (isCreate) {\\n (address created, bytes memory revertData) = ovmCREATE(_transaction.data);\\n if (created == address(0)) {\\n return abi.encode(false, revertData);\\n } else {\\n // The eth_call RPC endpoint for to = undefined will return the deployed bytecode\\n // in the success case, differing from standard create messages.\\n return abi.encode(true, Lib_EthUtils.getCode(created));\\n }\\n } else {\\n (bool success, bytes memory returndata) = ovmCALL(\\n _transaction.gasLimit,\\n _transaction.entrypoint,\\n _transaction.data\\n );\\n return abi.encode(success, returndata);\\n }\\n }\\n}\\n\",\"keccak256\":\"0x2d8c32b3438f9b9da37e33430527e12658178bd96b0863e20bd02fcaaf162cd4\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/predeploys/OVM_DeployerWhitelist.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Interface Imports */\\nimport { iOVM_DeployerWhitelist } from \\\"../../iOVM/predeploys/iOVM_DeployerWhitelist.sol\\\";\\n\\n/**\\n * @title OVM_DeployerWhitelist\\n * @dev The Deployer Whitelist is a temporary predeploy used to provide additional safety during the\\n * initial phases of our mainnet roll out. It is owned by the Optimism team, and defines accounts\\n * which are allowed to deploy contracts on Layer2. The Execution Manager will only allow an\\n * ovmCREATE or ovmCREATE2 operation to proceed if the deployer's address whitelisted.\\n *\\n * Compiler used: optimistic-solc\\n * Runtime target: OVM\\n */\\ncontract OVM_DeployerWhitelist is iOVM_DeployerWhitelist {\\n\\n /**********************\\n * Contract Constants *\\n **********************/\\n\\n bool public initialized;\\n bool public allowArbitraryDeployment;\\n address override public owner;\\n mapping (address => bool) public whitelist;\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n /**\\n * Blocks functions to anyone except the contract owner.\\n */\\n modifier onlyOwner() {\\n require(\\n msg.sender == owner,\\n \\\"Function can only be called by the owner of this contract.\\\"\\n );\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Initializes the whitelist.\\n * @param _owner Address of the owner for this contract.\\n * @param _allowArbitraryDeployment Whether or not to allow arbitrary contract deployment.\\n */\\n function initialize(\\n address _owner,\\n bool _allowArbitraryDeployment\\n )\\n override\\n external\\n {\\n if (initialized == true) {\\n return;\\n }\\n\\n initialized = true;\\n allowArbitraryDeployment = _allowArbitraryDeployment;\\n owner = _owner;\\n }\\n\\n /**\\n * Adds or removes an address from the deployment whitelist.\\n * @param _deployer Address to update permissions for.\\n * @param _isWhitelisted Whether or not the address is whitelisted.\\n */\\n function setWhitelistedDeployer(\\n address _deployer,\\n bool _isWhitelisted\\n )\\n override\\n external\\n onlyOwner\\n {\\n whitelist[_deployer] = _isWhitelisted;\\n }\\n\\n /**\\n * Updates the owner of this contract.\\n * @param _owner Address of the new owner.\\n */\\n function setOwner(\\n address _owner\\n )\\n override\\n public\\n onlyOwner\\n {\\n owner = _owner;\\n }\\n\\n /**\\n * Updates the arbitrary deployment flag.\\n * @param _allowArbitraryDeployment Whether or not to allow arbitrary contract deployment.\\n */\\n function setAllowArbitraryDeployment(\\n bool _allowArbitraryDeployment\\n )\\n override\\n public\\n onlyOwner\\n {\\n allowArbitraryDeployment = _allowArbitraryDeployment;\\n }\\n\\n /**\\n * Permanently enables arbitrary contract deployment and deletes the owner.\\n */\\n function enableArbitraryContractDeployment()\\n override\\n external\\n onlyOwner\\n {\\n setAllowArbitraryDeployment(true);\\n setOwner(address(0));\\n }\\n\\n /**\\n * Checks whether an address is allowed to deploy contracts.\\n * @param _deployer Address to check.\\n * @return _allowed Whether or not the address can deploy contracts.\\n */\\n function isDeployerAllowed(\\n address _deployer\\n )\\n override\\n external\\n returns (\\n bool\\n )\\n {\\n return (\\n initialized == false\\n || allowArbitraryDeployment == true\\n || whitelist[_deployer]\\n );\\n }\\n}\\n\",\"keccak256\":\"0xb96bfb8eb24503b05de41483cc9fb7a7f81107aa1ca146dc281952f8100848a0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/execution/iOVM_ExecutionManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\ninterface iOVM_ExecutionManager {\\n /**********\\n * Enums *\\n *********/\\n\\n enum RevertFlag {\\n OUT_OF_GAS,\\n INTENTIONAL_REVERT,\\n EXCEEDS_NUISANCE_GAS,\\n INVALID_STATE_ACCESS,\\n UNSAFE_BYTECODE,\\n CREATE_COLLISION,\\n STATIC_VIOLATION,\\n CREATOR_NOT_ALLOWED\\n }\\n\\n enum GasMetadataKey {\\n CURRENT_EPOCH_START_TIMESTAMP,\\n CUMULATIVE_SEQUENCER_QUEUE_GAS,\\n CUMULATIVE_L1TOL2_QUEUE_GAS,\\n PREV_EPOCH_SEQUENCER_QUEUE_GAS,\\n PREV_EPOCH_L1TOL2_QUEUE_GAS\\n }\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct GasMeterConfig {\\n uint256 minTransactionGasLimit;\\n uint256 maxTransactionGasLimit;\\n uint256 maxGasPerQueuePerEpoch;\\n uint256 secondsPerEpoch;\\n }\\n\\n struct GlobalContext {\\n uint256 ovmCHAINID;\\n }\\n\\n struct TransactionContext {\\n Lib_OVMCodec.QueueOrigin ovmL1QUEUEORIGIN;\\n uint256 ovmTIMESTAMP;\\n uint256 ovmNUMBER;\\n uint256 ovmGASLIMIT;\\n uint256 ovmTXGASLIMIT;\\n address ovmL1TXORIGIN;\\n }\\n\\n struct TransactionRecord {\\n uint256 ovmGasRefund;\\n }\\n\\n struct MessageContext {\\n address ovmCALLER;\\n address ovmADDRESS;\\n bool isStatic;\\n }\\n\\n struct MessageRecord {\\n uint256 nuisanceGasLeft;\\n }\\n\\n\\n /************************************\\n * Transaction Execution Entrypoint *\\n ************************************/\\n\\n function run(\\n Lib_OVMCodec.Transaction calldata _transaction,\\n address _txStateManager\\n ) external returns (bytes memory);\\n\\n\\n /*******************\\n * Context Opcodes *\\n *******************/\\n\\n function ovmCALLER() external view returns (address _caller);\\n function ovmADDRESS() external view returns (address _address);\\n function ovmTIMESTAMP() external view returns (uint256 _timestamp);\\n function ovmNUMBER() external view returns (uint256 _number);\\n function ovmGASLIMIT() external view returns (uint256 _gasLimit);\\n function ovmCHAINID() external view returns (uint256 _chainId);\\n\\n\\n /**********************\\n * L2 Context Opcodes *\\n **********************/\\n\\n function ovmL1QUEUEORIGIN() external view returns (Lib_OVMCodec.QueueOrigin _queueOrigin);\\n function ovmL1TXORIGIN() external view returns (address _l1TxOrigin);\\n\\n\\n /*******************\\n * Halting Opcodes *\\n *******************/\\n\\n function ovmREVERT(bytes memory _data) external;\\n\\n\\n /*****************************\\n * Contract Creation Opcodes *\\n *****************************/\\n\\n function ovmCREATE(bytes memory _bytecode) external returns (address _contract, bytes memory _revertdata);\\n function ovmCREATE2(bytes memory _bytecode, bytes32 _salt) external returns (address _contract, bytes memory _revertdata);\\n\\n\\n /*******************************\\n * Account Abstraction Opcodes *\\n ******************************/\\n\\n function ovmGETNONCE() external returns (uint256 _nonce);\\n function ovmINCREMENTNONCE() external;\\n function ovmCREATEEOA(bytes32 _messageHash, uint8 _v, bytes32 _r, bytes32 _s) external;\\n\\n\\n /****************************\\n * Contract Calling Opcodes *\\n ****************************/\\n\\n function ovmCALL(uint256 _gasLimit, address _address, bytes memory _calldata) external returns (bool _success, bytes memory _returndata);\\n function ovmSTATICCALL(uint256 _gasLimit, address _address, bytes memory _calldata) external returns (bool _success, bytes memory _returndata);\\n function ovmDELEGATECALL(uint256 _gasLimit, address _address, bytes memory _calldata) external returns (bool _success, bytes memory _returndata);\\n\\n\\n /****************************\\n * Contract Storage Opcodes *\\n ****************************/\\n\\n function ovmSLOAD(bytes32 _key) external returns (bytes32 _value);\\n function ovmSSTORE(bytes32 _key, bytes32 _value) external;\\n\\n\\n /*************************\\n * Contract Code Opcodes *\\n *************************/\\n\\n function ovmEXTCODECOPY(address _contract, uint256 _offset, uint256 _length) external returns (bytes memory _code);\\n function ovmEXTCODESIZE(address _contract) external returns (uint256 _size);\\n function ovmEXTCODEHASH(address _contract) external returns (bytes32 _hash);\\n\\n\\n /***************************************\\n * Public Functions: Execution Context *\\n ***************************************/\\n\\n function getMaxTransactionGasLimit() external view returns (uint _maxTransactionGasLimit);\\n}\\n\",\"keccak256\":\"0xf023d5d6fc6a03bd52f7a57af6e21076de77e8925d065bb79db062e73e43b684\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/execution/iOVM_SafetyChecker.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title iOVM_SafetyChecker\\n */\\ninterface iOVM_SafetyChecker {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function isBytecodeSafe(bytes calldata _bytecode) external pure returns (bool);\\n}\\n\",\"keccak256\":\"0xde6639676d4ec4f77297652d5ede2429bc93e74e11fefd9e9de4bc92dd784878\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/execution/iOVM_StateManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title iOVM_StateManager\\n */\\ninterface iOVM_StateManager {\\n\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n enum ItemState {\\n ITEM_UNTOUCHED,\\n ITEM_LOADED,\\n ITEM_CHANGED,\\n ITEM_COMMITTED\\n }\\n\\n /***************************\\n * Public Functions: Misc *\\n ***************************/\\n\\n function isAuthenticated(address _address) external view returns (bool);\\n\\n /***************************\\n * Public Functions: Setup *\\n ***************************/\\n\\n function owner() external view returns (address _owner);\\n function ovmExecutionManager() external view returns (address _ovmExecutionManager);\\n function setExecutionManager(address _ovmExecutionManager) external;\\n\\n\\n /************************************\\n * Public Functions: Account Access *\\n ************************************/\\n\\n function putAccount(address _address, Lib_OVMCodec.Account memory _account) external;\\n function putEmptyAccount(address _address) external;\\n function getAccount(address _address) external view returns (Lib_OVMCodec.Account memory _account);\\n function hasAccount(address _address) external view returns (bool _exists);\\n function hasEmptyAccount(address _address) external view returns (bool _exists);\\n function setAccountNonce(address _address, uint256 _nonce) external;\\n function getAccountNonce(address _address) external view returns (uint256 _nonce);\\n function getAccountEthAddress(address _address) external view returns (address _ethAddress);\\n function getAccountStorageRoot(address _address) external view returns (bytes32 _storageRoot);\\n function initPendingAccount(address _address) external;\\n function commitPendingAccount(address _address, address _ethAddress, bytes32 _codeHash) external;\\n function testAndSetAccountLoaded(address _address) external returns (bool _wasAccountAlreadyLoaded);\\n function testAndSetAccountChanged(address _address) external returns (bool _wasAccountAlreadyChanged);\\n function commitAccount(address _address) external returns (bool _wasAccountCommitted);\\n function incrementTotalUncommittedAccounts() external;\\n function getTotalUncommittedAccounts() external view returns (uint256 _total);\\n function wasAccountChanged(address _address) external view returns (bool);\\n function wasAccountCommitted(address _address) external view returns (bool);\\n\\n\\n /************************************\\n * Public Functions: Storage Access *\\n ************************************/\\n\\n function putContractStorage(address _contract, bytes32 _key, bytes32 _value) external;\\n function getContractStorage(address _contract, bytes32 _key) external view returns (bytes32 _value);\\n function hasContractStorage(address _contract, bytes32 _key) external view returns (bool _exists);\\n function testAndSetContractStorageLoaded(address _contract, bytes32 _key) external returns (bool _wasContractStorageAlreadyLoaded);\\n function testAndSetContractStorageChanged(address _contract, bytes32 _key) external returns (bool _wasContractStorageAlreadyChanged);\\n function commitContractStorage(address _contract, bytes32 _key) external returns (bool _wasContractStorageCommitted);\\n function incrementTotalUncommittedContractStorage() external;\\n function getTotalUncommittedContractStorage() external view returns (uint256 _total);\\n function wasContractStorageChanged(address _contract, bytes32 _key) external view returns (bool);\\n function wasContractStorageCommitted(address _contract, bytes32 _key) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x7a11dbd1f61593ba34debe07e39eef59967307f7f372ba9855bee0953585d08d\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/predeploys/iOVM_DeployerWhitelist.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title iOVM_DeployerWhitelist\\n */\\ninterface iOVM_DeployerWhitelist {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function initialize(address _owner, bool _allowArbitraryDeployment) external;\\n function owner() external returns (address _owner);\\n function setWhitelistedDeployer(address _deployer, bool _isWhitelisted) external;\\n function setOwner(address _newOwner) external;\\n function setAllowArbitraryDeployment(bool _allowArbitraryDeployment) external;\\n function enableArbitraryContractDeployment() external;\\n function isDeployerAllowed(address _deployer) external returns (bool _allowed);\\n}\\n\",\"keccak256\":\"0xdf1f27faf0d26d416bf6d408d146a16de32b4e1772a292c65d39eb7ec2b53ceb\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/codec/Lib_OVMCodec.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../utils/Lib_Bytes32Utils.sol\\\";\\n\\n/**\\n * @title Lib_OVMCodec\\n */\\nlibrary Lib_OVMCodec {\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum QueueOrigin {\\n SEQUENCER_QUEUE,\\n L1TOL2_QUEUE\\n }\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Account {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n address ethAddress;\\n bool isFresh;\\n }\\n\\n struct EVMAccount {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n }\\n\\n struct ChainBatchHeader {\\n uint256 batchIndex;\\n bytes32 batchRoot;\\n uint256 batchSize;\\n uint256 prevTotalElements;\\n bytes extraData;\\n }\\n\\n struct ChainInclusionProof {\\n uint256 index;\\n bytes32[] siblings;\\n }\\n\\n struct Transaction {\\n uint256 timestamp;\\n uint256 blockNumber;\\n QueueOrigin l1QueueOrigin;\\n address l1TxOrigin;\\n address entrypoint;\\n uint256 gasLimit;\\n bytes data;\\n }\\n\\n struct TransactionChainElement {\\n bool isSequenced;\\n uint256 queueIndex; // QUEUED TX ONLY\\n uint256 timestamp; // SEQUENCER TX ONLY\\n uint256 blockNumber; // SEQUENCER TX ONLY\\n bytes txData; // SEQUENCER TX ONLY\\n }\\n\\n struct QueueElement {\\n bytes32 transactionHash;\\n uint40 timestamp;\\n uint40 blockNumber;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Encodes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Encoded transaction bytes.\\n */\\n function encodeTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return abi.encodePacked(\\n _transaction.timestamp,\\n _transaction.blockNumber,\\n _transaction.l1QueueOrigin,\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n );\\n }\\n\\n /**\\n * Hashes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Hashed transaction\\n */\\n function hashTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(encodeTransaction(_transaction));\\n }\\n\\n /**\\n * Converts an OVM account to an EVM account.\\n * @param _in OVM account to convert.\\n * @return Converted EVM account.\\n */\\n function toEVMAccount(\\n Account memory _in\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n return EVMAccount({\\n nonce: _in.nonce,\\n balance: _in.balance,\\n storageRoot: _in.storageRoot,\\n codeHash: _in.codeHash\\n });\\n }\\n\\n /**\\n * @notice RLP-encodes an account state struct.\\n * @param _account Account state struct.\\n * @return RLP-encoded account state.\\n */\\n function encodeEVMAccount(\\n EVMAccount memory _account\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes[] memory raw = new bytes[](4);\\n\\n // Unfortunately we can't create this array outright because\\n // Lib_RLPWriter.writeList will reject fixed-size arrays. Assigning\\n // index-by-index circumvents this issue.\\n raw[0] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.nonce)\\n )\\n );\\n raw[1] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.balance)\\n )\\n );\\n raw[2] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.storageRoot));\\n raw[3] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.codeHash));\\n\\n return Lib_RLPWriter.writeList(raw);\\n }\\n\\n /**\\n * @notice Decodes an RLP-encoded account state into a useful struct.\\n * @param _encoded RLP-encoded account state.\\n * @return Account state struct.\\n */\\n function decodeEVMAccount(\\n bytes memory _encoded\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\\n\\n return EVMAccount({\\n nonce: Lib_RLPReader.readUint256(accountState[0]),\\n balance: Lib_RLPReader.readUint256(accountState[1]),\\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\\n });\\n }\\n\\n /**\\n * Calculates a hash for a given batch header.\\n * @param _batchHeader Header to hash.\\n * @return Hash of the header.\\n */\\n function hashBatchHeader(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(\\n abi.encode(\\n _batchHeader.batchRoot,\\n _batchHeader.batchSize,\\n _batchHeader.prevTotalElements,\\n _batchHeader.extraData\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0xd85ba2066057a2677926f484b938c7c2ef33ff3853f3b71cda252f4a54f30e05\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n external\\n onlyOwner\\n {\\n addresses[_getNameHash(_name)] = _address;\\n\\n emit AddressSet(\\n _name,\\n _address\\n );\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(\\n string memory _name\\n )\\n external\\n view\\n returns (\\n address\\n )\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xcc9fc5c64f1101a5c6c397594086b1608189a9edc5c9635e1ac38f70aeeeecbf\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(\\n address _libAddressManager\\n ) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x65981feeabff6a81783ea97d44baf988a18a86c8cb374c46fdb71819cbacc7c0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPReader.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_RLPReader\\n * @dev Adapted from \\\"RLPReader\\\" by Hamdi Allam (hamdi.allam97@gmail.com).\\n */\\nlibrary Lib_RLPReader {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 constant internal MAX_LIST_LENGTH = 32;\\n\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum RLPItemType {\\n DATA_ITEM,\\n LIST_ITEM\\n }\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct RLPItem {\\n uint256 length;\\n uint256 ptr;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts bytes to a reference to memory position and length.\\n * @param _in Input bytes to convert.\\n * @return Output memory reference.\\n */\\n function toRLPItem(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem memory\\n )\\n {\\n uint256 ptr;\\n assembly {\\n ptr := add(_in, 32)\\n }\\n\\n return RLPItem({\\n length: _in.length,\\n ptr: ptr\\n });\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n (\\n uint256 listOffset,\\n ,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.LIST_ITEM,\\n \\\"Invalid RLP list value.\\\"\\n );\\n\\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\\n // writing to the length. Since we can't know the number of RLP items without looping over\\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\\n // simply set a reasonable maximum list length and decrease the size before we finish.\\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\\n\\n uint256 itemCount = 0;\\n uint256 offset = listOffset;\\n while (offset < _in.length) {\\n require(\\n itemCount < MAX_LIST_LENGTH,\\n \\\"Provided RLP list exceeds max list length.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n ) = _decodeLength(RLPItem({\\n length: _in.length - offset,\\n ptr: _in.ptr + offset\\n }));\\n\\n out[itemCount] = RLPItem({\\n length: itemLength + itemOffset,\\n ptr: _in.ptr + offset\\n });\\n\\n itemCount += 1;\\n offset += itemOffset + itemLength;\\n }\\n\\n // Decrease the array size to match the actual item count.\\n assembly {\\n mstore(out, itemCount)\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n return readList(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes value.\\\"\\n );\\n\\n return _copy(_in.ptr, itemOffset, itemLength);\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return readBytes(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return string(readBytes(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return readString(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n require(\\n _in.length <= 33,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr + itemOffset;\\n bytes32 out;\\n assembly {\\n out := mload(ptr)\\n\\n // Shift the bytes over to match the item size.\\n if lt(itemLength, 32) {\\n out := div(out, exp(256, sub(32, itemLength)))\\n }\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return readBytes32(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return uint256(readBytes32(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return readUint256(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n require(\\n _in.length == 1,\\n \\\"Invalid RLP boolean value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 out;\\n assembly {\\n out := byte(0, mload(ptr))\\n }\\n\\n require(\\n out == 0 || out == 1,\\n \\\"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\\\"\\n );\\n\\n return out != 0;\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return readBool(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n if (_in.length == 1) {\\n return address(0);\\n }\\n\\n require(\\n _in.length == 21,\\n \\\"Invalid RLP address value.\\\"\\n );\\n\\n return address(readUint256(_in));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return readAddress(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads the raw bytes of an RLP item.\\n * @param _in RLP item to read.\\n * @return Raw RLP bytes.\\n */\\n function readRawBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in);\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Decodes the length of an RLP item.\\n * @param _in RLP item to decode.\\n * @return Offset of the encoded data.\\n * @return Length of the encoded data.\\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\\n */\\n function _decodeLength(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n uint256,\\n uint256,\\n RLPItemType\\n )\\n {\\n require(\\n _in.length > 0,\\n \\\"RLP item cannot be null.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 prefix;\\n assembly {\\n prefix := byte(0, mload(ptr))\\n }\\n\\n if (prefix <= 0x7f) {\\n // Single byte.\\n\\n return (0, 1, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xb7) {\\n // Short string.\\n\\n uint256 strLen = prefix - 0x80;\\n\\n require(\\n _in.length > strLen,\\n \\\"Invalid RLP short string.\\\"\\n );\\n\\n return (1, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xbf) {\\n // Long string.\\n uint256 lenOfStrLen = prefix - 0xb7;\\n\\n require(\\n _in.length > lenOfStrLen,\\n \\\"Invalid RLP long string length.\\\"\\n );\\n\\n uint256 strLen;\\n assembly {\\n // Pick out the string length.\\n strLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfStrLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfStrLen + strLen,\\n \\\"Invalid RLP long string.\\\"\\n );\\n\\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xf7) {\\n // Short list.\\n uint256 listLen = prefix - 0xc0;\\n\\n require(\\n _in.length > listLen,\\n \\\"Invalid RLP short list.\\\"\\n );\\n\\n return (1, listLen, RLPItemType.LIST_ITEM);\\n } else {\\n // Long list.\\n uint256 lenOfListLen = prefix - 0xf7;\\n\\n require(\\n _in.length > lenOfListLen,\\n \\\"Invalid RLP long list length.\\\"\\n );\\n\\n uint256 listLen;\\n assembly {\\n // Pick out the list length.\\n listLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfListLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfListLen + listLen,\\n \\\"Invalid RLP long list.\\\"\\n );\\n\\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\\n }\\n }\\n\\n /**\\n * Copies the bytes from a memory location.\\n * @param _src Pointer to the location to read from.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Copied bytes.\\n */\\n function _copy(\\n uint256 _src,\\n uint256 _offset,\\n uint256 _length\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out = new bytes(_length);\\n if (out.length == 0) {\\n return out;\\n }\\n\\n uint256 src = _src + _offset;\\n uint256 dest;\\n assembly {\\n dest := add(out, 32)\\n }\\n\\n // Copy over as many complete words as we can.\\n for (uint256 i = 0; i < _length / 32; i++) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n\\n src += 32;\\n dest += 32;\\n }\\n\\n // Pick out the remaining bytes.\\n uint256 mask = 256 ** (32 - (_length % 32)) - 1;\\n assembly {\\n mstore(\\n dest,\\n or(\\n and(mload(src), not(mask)),\\n and(mload(dest), mask)\\n )\\n )\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Copies an RLP item into bytes.\\n * @param _in RLP item to copy.\\n * @return Copied bytes.\\n */\\n function _copy(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in.ptr, 0, _in.length);\\n }\\n}\\n\",\"keccak256\":\"0x829174c61216dce35fdb888383b6022e0365eb7fbdc71ad79d98b108091969fe\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPWriter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/**\\n * @title Lib_RLPWriter\\n * @author Bakaoh (with modifications)\\n */\\nlibrary Lib_RLPWriter {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * RLP encodes a byte string.\\n * @param _in The byte string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded;\\n\\n if (_in.length == 1 && uint8(_in[0]) < 128) {\\n encoded = _in;\\n } else {\\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * RLP encodes a list of RLP encoded byte byte strings.\\n * @param _in The list of RLP encoded byte strings.\\n * @return The RLP encoded list of items in bytes.\\n */\\n function writeList(\\n bytes[] memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory list = _flatten(_in);\\n return abi.encodePacked(_writeLength(list.length, 192), list);\\n }\\n\\n /**\\n * RLP encodes a string.\\n * @param _in The string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeString(\\n string memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(bytes(_in));\\n }\\n\\n /**\\n * RLP encodes an address.\\n * @param _in The address to encode.\\n * @return The RLP encoded address in bytes.\\n */\\n function writeAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a bytes32 value.\\n * @param _in The bytes32 to encode.\\n * @return _out The RLP encoded bytes32 in bytes.\\n */\\n function writeBytes32(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a uint.\\n * @param _in The uint256 to encode.\\n * @return The RLP encoded uint256 in bytes.\\n */\\n function writeUint(\\n uint256 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(_toBinary(_in));\\n }\\n\\n /**\\n * RLP encodes a bool.\\n * @param _in The bool to encode.\\n * @return The RLP encoded bool in bytes.\\n */\\n function writeBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded = new bytes(1);\\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\\n return encoded;\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\\n * @param _len The length of the string or the payload.\\n * @param _offset 128 if item is string, 192 if item is list.\\n * @return RLP encoded bytes.\\n */\\n function _writeLength(\\n uint256 _len,\\n uint256 _offset\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded;\\n\\n if (_len < 56) {\\n encoded = new bytes(1);\\n encoded[0] = byte(uint8(_len) + uint8(_offset));\\n } else {\\n uint256 lenLen;\\n uint256 i = 1;\\n while (_len / i != 0) {\\n lenLen++;\\n i *= 256;\\n }\\n\\n encoded = new bytes(lenLen + 1);\\n encoded[0] = byte(uint8(lenLen) + uint8(_offset) + 55);\\n for(i = 1; i <= lenLen; i++) {\\n encoded[i] = byte(uint8((_len / (256**(lenLen-i))) % 256));\\n }\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * Encode integer in big endian binary form with no leading zeroes.\\n * @notice TODO: This should be optimized with assembly to save gas costs.\\n * @param _x The integer to encode.\\n * @return RLP encoded bytes.\\n */\\n function _toBinary(\\n uint256 _x\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory b = abi.encodePacked(_x);\\n\\n uint256 i = 0;\\n for (; i < 32; i++) {\\n if (b[i] != 0) {\\n break;\\n }\\n }\\n\\n bytes memory res = new bytes(32 - i);\\n for (uint256 j = 0; j < res.length; j++) {\\n res[j] = b[i++];\\n }\\n\\n return res;\\n }\\n\\n /**\\n * Copies a piece of memory to another location.\\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\\n * @param _dest Destination location.\\n * @param _src Source location.\\n * @param _len Length of memory to copy.\\n */\\n function _memcpy(\\n uint256 _dest,\\n uint256 _src,\\n uint256 _len\\n )\\n private\\n pure\\n {\\n uint256 dest = _dest;\\n uint256 src = _src;\\n uint256 len = _len;\\n\\n for(; len >= 32; len -= 32) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n dest += 32;\\n src += 32;\\n }\\n\\n uint256 mask = 256 ** (32 - len) - 1;\\n assembly {\\n let srcpart := and(mload(src), not(mask))\\n let destpart := and(mload(dest), mask)\\n mstore(dest, or(destpart, srcpart))\\n }\\n }\\n\\n /**\\n * Flattens a list of byte strings into one byte string.\\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\\n * @param _list List of byte strings to flatten.\\n * @return The flattened byte string.\\n */\\n function _flatten(\\n bytes[] memory _list\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n if (_list.length == 0) {\\n return new bytes(0);\\n }\\n\\n uint256 len;\\n uint256 i = 0;\\n for (; i < _list.length; i++) {\\n len += _list[i].length;\\n }\\n\\n bytes memory flattened = new bytes(len);\\n uint256 flattenedPtr;\\n assembly { flattenedPtr := add(flattened, 0x20) }\\n\\n for(i = 0; i < _list.length; i++) {\\n bytes memory item = _list[i];\\n\\n uint256 listPtr;\\n assembly { listPtr := add(item, 0x20)}\\n\\n _memcpy(flattenedPtr, listPtr, item.length);\\n flattenedPtr += _list[i].length;\\n }\\n\\n return flattened;\\n }\\n}\\n\",\"keccak256\":\"0xb60ee4b03ad372c3deff21d454ab714dd0c18ee3e6f9d45532e209fc59d5a54d\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_Bytes32Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_Byte32Utils\\n */\\nlibrary Lib_Bytes32Utils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \\\"true.\\\"\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as a boolean.\\n */\\n function toBool(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return _in != 0;\\n }\\n\\n /**\\n * Converts a boolean to a bytes32 value.\\n * @param _in Input boolean value.\\n * @return Boolean as a bytes32.\\n */\\n function fromBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in ? 1 : 0));\\n }\\n\\n /**\\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as an address.\\n */\\n function toAddress(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return address(uint160(uint256(_in)));\\n }\\n\\n /**\\n * Converts an address to a bytes32.\\n * @param _in Input address value.\\n * @return Address as a bytes32.\\n */\\n function fromAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in));\\n }\\n\\n /**\\n * Removes the leading zeros from a bytes32 value and returns a new (smaller) bytes value.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 without any leading zeros.\\n */\\n function removeLeadingZeros(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out;\\n\\n assembly {\\n // Figure out how many leading zero bytes to remove.\\n let shift := 0\\n for { let i := 0 } and(lt(i, 32), eq(byte(i, _in), 0)) { i := add(i, 1) } {\\n shift := add(shift, 1)\\n }\\n\\n // Reserve some space for our output and fix the free memory pointer.\\n out := mload(0x40)\\n mstore(0x40, add(out, 0x40))\\n\\n // Shift the value and store it into the output bytes.\\n mstore(add(out, 0x20), shl(mul(shift, 8), _in))\\n\\n // Store the new size (with leading zero bytes removed) in the output byte size.\\n mstore(out, sub(32, shift))\\n }\\n\\n return out;\\n }\\n}\\n\",\"keccak256\":\"0xfa2def593e3fc56a31852c3744aefdaa93cec74e721bfcfeb1e5d166c7c60b64\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_BytesUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_BytesUtils\\n */\\nlibrary Lib_BytesUtils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_start + _length >= _start, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n if (_start >= _bytes.length) {\\n return bytes('');\\n }\\n\\n return slice(_bytes, _start, _bytes.length - _start);\\n }\\n\\n function toBytes32PadLeft(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n bytes32 ret;\\n uint256 len = _bytes.length <= 32 ? _bytes.length : 32;\\n assembly {\\n ret := shr(mul(sub(32, len), 8), mload(add(_bytes, 32)))\\n }\\n return ret;\\n }\\n\\n function toBytes32(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n if (_bytes.length < 32) {\\n bytes32 ret;\\n assembly {\\n ret := mload(add(_bytes, 32))\\n }\\n return ret;\\n }\\n\\n return abi.decode(_bytes,(bytes32)); // will truncate if input length > 32 bytes\\n }\\n\\n function toUint256(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return uint256(toBytes32(_bytes));\\n }\\n\\n function toUint24(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n uint24\\n )\\n {\\n require(_start + 3 >= _start, \\\"toUint24_overflow\\\");\\n require(_bytes.length >= _start + 3 , \\\"toUint24_outOfBounds\\\");\\n uint24 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x3), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toUint8(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n uint8\\n )\\n {\\n require(_start + 1 >= _start, \\\"toUint8_overflow\\\");\\n require(_bytes.length >= _start + 1 , \\\"toUint8_outOfBounds\\\");\\n uint8 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x1), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toAddress(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n require(_start + 20 >= _start, \\\"toAddress_overflow\\\");\\n require(_bytes.length >= _start + 20, \\\"toAddress_outOfBounds\\\");\\n address tempAddress;\\n\\n assembly {\\n tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000)\\n }\\n\\n return tempAddress;\\n }\\n\\n function toNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory nibbles = new bytes(_bytes.length * 2);\\n\\n for (uint256 i = 0; i < _bytes.length; i++) {\\n nibbles[i * 2] = _bytes[i] >> 4;\\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\\n }\\n\\n return nibbles;\\n }\\n\\n function fromNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory ret = new bytes(_bytes.length / 2);\\n\\n for (uint256 i = 0; i < ret.length; i++) {\\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\\n }\\n\\n return ret;\\n }\\n\\n function equal(\\n bytes memory _bytes,\\n bytes memory _other\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return keccak256(_bytes) == keccak256(_other);\\n }\\n}\\n\",\"keccak256\":\"0xd27e37973f1e0f64798725b7a0de12989dac992fba0d72970249d7e1f70e17c5\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_ErrorUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/**\\n * @title Lib_ErrorUtils\\n */\\nlibrary Lib_ErrorUtils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Encodes an error string into raw solidity-style revert data.\\n * (i.e. ascii bytes, prefixed with bytes4(keccak(\\\"Error(string))\\\"))\\n * Ref: https://docs.soliditylang.org/en/v0.8.2/control-structures.html?highlight=Error(string)#panic-via-assert-and-error-via-require\\n * @param _reason Reason for the reversion.\\n * @return Standard solidity revert data for the given reason.\\n */\\n function encodeRevertString(\\n string memory _reason\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return abi.encodeWithSignature(\\n \\\"Error(string)\\\",\\n _reason\\n );\\n }\\n}\\n\",\"keccak256\":\"0xfc64ec4a81fb50865b502a0004ed154e8598e1a313db77303fc95e41f536e6b7\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_EthUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// @unsupported: ovm\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"./Lib_Bytes32Utils.sol\\\";\\n\\n/**\\n * @title Lib_EthUtils\\n */\\nlibrary Lib_EthUtils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Gets the code for a given address.\\n * @param _address Address to get code for.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Code read from the contract.\\n */\\n function getCode(\\n address _address,\\n uint256 _offset,\\n uint256 _length\\n )\\n internal\\n view\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory code;\\n assembly {\\n code := mload(0x40)\\n mstore(0x40, add(code, add(_length, 0x20)))\\n mstore(code, _length)\\n extcodecopy(_address, add(code, 0x20), _offset, _length)\\n }\\n\\n return code;\\n }\\n\\n /**\\n * Gets the full code for a given address.\\n * @param _address Address to get code for.\\n * @return Full code of the contract.\\n */\\n function getCode(\\n address _address\\n )\\n internal\\n view\\n returns (\\n bytes memory\\n )\\n {\\n return getCode(\\n _address,\\n 0,\\n getCodeSize(_address)\\n );\\n }\\n\\n /**\\n * Gets the size of a contract's code in bytes.\\n * @param _address Address to get code size for.\\n * @return Size of the contract's code in bytes.\\n */\\n function getCodeSize(\\n address _address\\n )\\n internal\\n view\\n returns (\\n uint256\\n )\\n {\\n uint256 codeSize;\\n assembly {\\n codeSize := extcodesize(_address)\\n }\\n\\n return codeSize;\\n }\\n\\n /**\\n * Gets the hash of a contract's code.\\n * @param _address Address to get a code hash for.\\n * @return Hash of the contract's code.\\n */\\n function getCodeHash(\\n address _address\\n )\\n internal\\n view\\n returns (\\n bytes32\\n )\\n {\\n bytes32 codeHash;\\n assembly {\\n codeHash := extcodehash(_address)\\n }\\n\\n return codeHash;\\n }\\n\\n /**\\n * Creates a contract with some given initialization code.\\n * @param _code Contract initialization code.\\n * @return Address of the created contract.\\n */\\n function createContract(\\n bytes memory _code\\n )\\n internal\\n returns (\\n address\\n )\\n {\\n address created;\\n assembly {\\n created := create(\\n 0,\\n add(_code, 0x20),\\n mload(_code)\\n )\\n }\\n\\n return created;\\n }\\n\\n /**\\n * Computes the address that would be generated by CREATE.\\n * @param _creator Address creating the contract.\\n * @param _nonce Creator's nonce.\\n * @return Address to be generated by CREATE.\\n */\\n function getAddressForCREATE(\\n address _creator,\\n uint256 _nonce\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n bytes[] memory encoded = new bytes[](2);\\n encoded[0] = Lib_RLPWriter.writeAddress(_creator);\\n encoded[1] = Lib_RLPWriter.writeUint(_nonce);\\n\\n bytes memory encodedList = Lib_RLPWriter.writeList(encoded);\\n return Lib_Bytes32Utils.toAddress(keccak256(encodedList));\\n }\\n\\n /**\\n * Computes the address that would be generated by CREATE2.\\n * @param _creator Address creating the contract.\\n * @param _bytecode Bytecode of the contract to be created.\\n * @param _salt 32 byte salt value mixed into the hash.\\n * @return Address to be generated by CREATE2.\\n */\\n function getAddressForCREATE2(\\n address _creator,\\n bytes memory _bytecode,\\n bytes32 _salt\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n bytes32 hashedData = keccak256(abi.encodePacked(\\n byte(0xff),\\n _creator,\\n _salt,\\n keccak256(_bytecode)\\n ));\\n\\n return Lib_Bytes32Utils.toAddress(hashedData);\\n }\\n}\\n\",\"keccak256\":\"0xf29a67d78e61cb472d524b779b32cfcb39a587f4096500d5419e6425ed367d49\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x60806040523480156200001157600080fd5b506040516200317038038062003170833981016040819052620000349162000292565b600080546001600160a01b0319166001600160a01b03851617905560408051808201909152601181527027ab26afa9b0b332ba3ca1b432b1b5b2b960791b60208201526200008290620000d7565b600180546001600160a01b0319166001600160a01b039290921691909117905581516003556020820151600455604082015160055560608201516006558051600755620000ce620001b9565b50505062000337565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b83811015620001395781810151838201526020016200011f565b50505050905090810190601f168015620001675780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b1580156200018557600080fd5b505afa1580156200019a573d6000803e3d6000fd5b505050506040513d6020811015620001b157600080fd5b505192915050565b600d80546001600160a01b031990811673defa017defa017defa017defa017defa017defa09081179092557fdefa017defa017defa017defa017defa017defa017defa017defa017defa017d6009819055600a819055600b819055600c8190556008805460ff191690556010819055600e8054831684179055600f8054831690931760ff60a01b1916909255601191909155600280549091169055565b60006020828403121562000268578081fd5b604051602081016001600160401b03811182821017156200028557fe5b6040529151825250919050565b600080600083850360c0811215620002a8578384fd5b84516001600160a01b0381168114620002bf578485fd5b93506080601f1982011215620002d3578283fd5b50604051608081016001600160401b0381118282101715620002f157fe5b806040525060208501518152604085015160208201526060850151604082015260808501516060820152809250506200032e8560a0860162000256565b90509250925092565b612e2980620003476000396000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c80637cebbe94116100f957806399ccd98b11610097578063bdbf8c3611610071578063bdbf8c361461037e578063c1fb2ea214610386578063fcb6829b1461038e578063ffe73914146103a1576101c4565b806399ccd98b146103505780639be3ad67146103635780639dc9dc9314610376576101c4565b806385979f76116100d357806385979f761461031a5780638bb42e151461032d5780639058025614610340578063996d79a514610348576101c4565b80637cebbe94146102de5780638435035b146102e65780638540661f146102f9576101c4565b8063299ca478116101665780635a98c361116101405780635a98c3611461029b57806373509064146102a3578063741a33eb146102ab578063746c32f1146102be576101c4565b8063299ca478146102605780632a2a7adb14610275578063461a447814610288576101c4565b80631c4712a7116101a25780631c4712a71461022857806320160f3a1461023057806322bd64c01461023857806324749d5c1461024d576101c4565b806303daa959146101c9578063101185a4146101f257806314aa2ff714610207575b600080fd5b6101dc6101d7366004612604565b6103b4565b6040516101e99190612a58565b60405180910390f35b6101fa6103f9565b6040516101e99190612b43565b61021a610215366004612696565b610402565b6040516101e9929190612ad3565b6101dc61049a565b6101dc6104a0565b61024b610246366004612634565b6104a6565b005b6101dc61025b366004612578565b610509565b610268610524565b6040516101e99190612a61565b61024b610283366004612696565b610533565b6102686102963660046127af565b610541565b6101dc61061d565b610268610623565b61024b6102b9366004612655565b610632565b6102d16102cc3660046125b0565b61079f565b6040516101e99190612b30565b61024b6107be565b6101dc6102f4366004612578565b610815565b61030c6103073660046128a4565b610828565b6040516101e9929190612af7565b61030c6103283660046128a4565b6108a1565b6102d161033b366004612843565b6108f0565b6101dc6109f1565b6102686109f7565b61021a61035e3660046126d0565b610a06565b6102d16103713660046127f4565b610a99565b610268610bfb565b6101dc610c0a565b6101dc610c10565b61024b61039c3660046128fa565b610c27565b61030c6103af3660046128a4565b610e11565b6000619c4060005a905060006103c86109f7565b90506103d48186610e62565b93505060005a82039050808310156103f157601080548483030190555b505050919050565b60085460ff1690565b600f5460009060609060ff600160a01b9091041615156001141561042a5761042a6006610ef0565b619c4060005a9050600061043c6109f7565b905061044781610f09565b600061045b8261045684610f8e565b611019565b905061046781886110b3565b95509550505060005a8203905080831015610489576010805484019055610492565b60108054820190555b505050915091565b60045490565b600b5490565b600f5460ff600160a01b909104161515600114156104c8576104c86006610ef0565b61ea6060005a905060006104da6109f7565b90506104e7818686611139565b5060005a820390508083101561050257601080548483030190555b5050505050565b600061051c610517836111bb565b611246565b90505b919050565b6000546001600160a01b031681565b61053e60018261124a565b50565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b838110156105a1578181015183820152602001610589565b50505050905090810190601f1680156105ce5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b1580156105eb57600080fd5b505afa1580156105ff573d6000803e3d6000fd5b505050506040513d602081101561061557600080fd5b505192915050565b600a5490565b600e546001600160a01b031690565b600f5460ff600160a01b90910416151560011415610654576106546006610ef0565b600060018585601b0185856040516000815260200160405260405161067c9493929190612b12565b6020604051602081039080840390855afa15801561069e573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166106da576106da604051806060016040528060388152602001612ce260389139610533565b6106e381611260565b6106ed5750610799565b6106f6816112eb565b600f80546001600160a01b038381166001600160a01b031983161790925516600061075361072f6009602160991b01836102cc82610815565b60405160200161073f9190612a22565b604051602081830303815290604052611352565b600f80546001600160a01b0319166001600160a01b038516179055905061078a838261077e81611365565b8051906020012061137b565b6107958360006113b8565b5050505b50505050565b60606107b46107ad856111bb565b8484611429565b90505b9392505050565b600f5460ff600160a01b909104161515600114156107e0576107e06006610ef0565b60006107ea6109f7565b905060006107f782610f8e565b9050808160010111156108115761081182826001016113b8565b5050565b600061051c610823836111bb565b61144d565b600060606201388060005a60408051606081018252600f546001600160a01b0390811682528916602082015260019181019190915290915061086c81898989611451565b945094505060005a820390508083101561088d576010805484019055610896565b60108054820190555b505050935093915050565b60006060620186a060005a60408051606081018252600f5460ff600160a01b8204161515928201929092526001600160a01b039182168152908816602082015290915061086c81898989611451565b606033156108fd57600080fd5b600280546001600160a01b0319166001600160a01b038416179055610921846114e2565b600019601155600f80546001600160a01b0319166001600160a01b03858116919091179091556080850151161580156109c0576000806109648760c00151610402565b90925090506001600160a01b0382166109a45760008160405160200161098b929190612af7565b60405160208183030381529060405293505050506107b7565b60016109af83611365565b60405160200161098b929190612af7565b6000806109da8760a0015188608001518960c001516108a1565b91509150818160405160200161098b929190612af7565b60075490565b600f546001600160a01b031690565b600f5460009060609060ff600160a01b90910416151560011415610a2e57610a2e6006610ef0565b619c4060005a90506000610a406109f7565b9050610a4b81610f09565b6000610a58828989611554565b9050610a6481896110b3565b95509550505060005a8203905080831015610a86576010805484019055610a8f565b60108054820190555b5050509250929050565b600a546060907fdefa017defa017defa017defa017defa017defa017defa017defa017defa017d14610ada5750604080516020810190915260008152610bf5565b600280546001600160a01b0319166001600160a01b038481169190911791829055604051630d15d41560e41b815291169063d15d415090610b1f903390600401612a61565b60206040518083038186803b158015610b3757600080fd5b505afa158015610b4b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b6f91906125e4565b610b945760405162461bcd60e51b8152600401610b8b90612bbf565b60405180910390fd5b610b9d836114e2565b610ba68361159a565b610bc757610bb26115f6565b50604080516020810190915260008152610bf5565b6000610be76003600001548560a001510385608001518660c001516108a1565b915050610bf26115f6565b90505b92915050565b600d546001600160a01b031690565b60095490565b6000610c22610c1d6109f7565b610f8e565b905090565b333014610c3357610e0c565b610c3c81611260565b610c6b57610c6b6005610c66604051806060016040528060348152602001612d9060349139611693565b61124a565b6001546040516352275acd60e11b81526001600160a01b039091169063a44eb59a90610c9b908590600401612b30565b60206040518083038186803b158015610cb357600080fd5b505afa158015610cc7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ceb91906125e4565b610d1557610d156004610c666040518060a0016040528060768152602001612d1a60769139611693565b610d1e816112eb565b6000610d2983611352565b90506001600160a01b038116610d43573d6000803e3d6000fd5b6000610d4e82611365565b6001546040516352275acd60e11b81529192506001600160a01b03169063a44eb59a90610d7f908490600401612b30565b60206040518083038186803b158015610d9757600080fd5b505afa158015610dab573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dcf91906125e4565b610df957610df96004610c66604051806060016040528060308152602001612dc460309139611693565b6105028383610e0785611246565b61137b565b505050565b60006060619c4060005a60408051606081018252600e546001600160a01b039081168252600f549081166020830152600160a01b900460ff1615159181019190915290915061086c81898989611451565b6000610e6e83836116d6565b600254604051631aaf392f60e01b81526001600160a01b0390911690631aaf392f90610ea09086908690600401612a99565b60206040518083038186803b158015610eb857600080fd5b505afa158015610ecc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bf2919061261c565b61053e816040518060200160405280600081525061124a565b600080610f585a6002602160991b0185604051602401610f299190612a61565b60408051601f198184030181529190526020810180516001600160e01b031663b1540a0160e01b1790526108a1565b91509150600081806020019051810190610f7291906125e4565b9050801580610f7f575082155b15610799576107996007610ef0565b6000610f9982611811565b60025460405163d126199f60e01b81526001600160a01b039091169063d126199f90610fc9908590600401612a61565b60206040518083038186803b158015610fe157600080fd5b505afa158015610ff5573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061051c919061261c565b60408051600280825260608201909252600091829190816020015b606081526020019060019003908161103457905050905061105484611958565b8160008151811061106157fe5b602002602001018190525061107583611982565b8160018151811061108257fe5b6020026020010181905250600061109882611995565b90506110aa81805190602001206119d9565b95945050505050565b600060606110d56110c26109f7565b6110cd610c1d6109f7565b6001016113b8565b60408051606081018252600f5460ff600160a01b8204161515928201929092526001600160a01b039182168152908516602082015260008061111b835a898960016119dc565b915091508161112b57600061112d565b865b97909650945050505050565b806111448484610e62565b141561114f57610e0c565b6111598383611c4a565b600254604051635c17d62960e01b81526001600160a01b0390911690635c17d6299061118d90869086908690600401612ab2565b600060405180830381600087803b1580156111a757600080fd5b505af1158015610795573d6000803e3d6000fd5b60006111c682611811565b600254604051637c8ee70360e01b81526001600160a01b0390911690637c8ee703906111f6908590600401612a61565b60206040518083038186803b15801561120e57600080fd5b505afa158015611222573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061051c9190612594565b3f90565b60006112568383611d5c565b9050805160208201fd5b600061126b82611811565b6002546040516307a1294560e01b81526001600160a01b03909116906307a129459061129b908590600401612a61565b60206040518083038186803b1580156112b357600080fd5b505afa1580156112c7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061051c91906125e4565b6112f481611811565b600254604051637e78a4d160e11b81526001600160a01b039091169063fcf149a290611324908490600401612a61565b600060405180830381600087803b15801561133e57600080fd5b505af1158015610502573d6000803e3d6000fd5b6000808251602084016000f09392505050565b606061051c8260006113768561144d565b611429565b61138483611e05565b6002546040516368510af960e11b81526001600160a01b039091169063d0a215f29061118d90869086908690600401612a75565b6113c182611e05565b6002546040516374855dc360e11b81526001600160a01b039091169063e90abb86906113f39085908590600401612a99565b600060405180830381600087803b15801561140d57600080fd5b505af1158015611421573d6000803e3d6000fd5b505050505050565b6060806040519050602083018101604052828152828460208301873c949350505050565b3b90565b6000606073ffffffffffffffffffffffffffffffffffff0000841673deaddeaddeaddeaddeaddeaddeaddeaddead000014156114a05750506040805160208101909152600081526001906114d9565b60006064856001600160a01b0316106114c1576114bc856111bb565b6114c3565b845b90506114d38787838760006119dc565b92509250505b94509492505050565b80516009556020810151600a5560a0810151600c5560408101516008805460ff19166001838181111561151157fe5b02179055506060810151600d80546001600160a01b0319166001600160a01b03909216919091179055600554600b5560a081015161154e90611f14565b60115550565b60008060ff60f81b85848680519060200120604051602001611579949392919061299e565b6040516020818303038152906040528051906020012090506110aa816119d9565b60007fdefa017defa017defa017defa017defa017defa017defa017defa017defa017d826020015114156115d05750600061051f565b6115e28260a001518360400151611f27565b6115ee5750600061051f565b506001919050565b600d80546001600160a01b031990811673defa017defa017defa017defa017defa017defa09081179092557fdefa017defa017defa017defa017defa017defa017defa017defa017defa017d6009819055600a819055600b819055600c8190556008805460ff191690556010819055600e8054831684179055600f8054831690931760ff60a01b1916909255601191909155600280549091169055565b6060816040516024016116a69190612b30565b60408051601f198184030181529190526020810180516001600160e01b031662461bcd60e51b1790529050919050565b6175305a10156116ea576116ea6000610ef0565b600254604051630ad2267960e01b81526001600160a01b0390911690630ad226799061171c9085908590600401612a99565b60206040518083038186803b15801561173457600080fd5b505afa158015611748573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061176c91906125e4565b61177a5761177a6003610ef0565b600254604051632bcdee1960e21b81526000916001600160a01b03169063af37b864906117ad9086908690600401612a99565b602060405180830381600087803b1580156117c757600080fd5b505af11580156117db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117ff91906125e4565b905080610e0c57610e0c614e20611f57565b6175305a1015611825576118256000610ef0565b60025460405163c8e40fbf60e01b81526001600160a01b039091169063c8e40fbf90611855908490600401612a61565b60206040518083038186803b15801561186d57600080fd5b505afa158015611881573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118a591906125e4565b6118b3576118b36003610ef0565b600254604051633ecdecc760e21b81526000916001600160a01b03169063fb37b31c906118e4908590600401612a61565b602060405180830381600087803b1580156118fe57600080fd5b505af1158015611912573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061193691906125e4565b905080610811576108116175306064611951610823866111bb565b0201611f57565b606061051c8260405160200161196e9190612981565b604051602081830303815290604052611f77565b606061051c61199083611fc9565b611f77565b606060006119a2836120cd565b90506119b0815160c06121cd565b816040516020016119c29291906129f3565b604051602081830303815290604052915050919050565b90565b6040805160608082018352600e546001600160a01b039081168352600f549081166020840152600160a01b900460ff1615159282019290925260009190611a23818961231d565b6011546000611a3189611f14565b60118190559050600060608715611aed57604051309063fcb6829b60e01b90611a62908e908d908f90602401612c2b565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909416939093179092529051611aa091906129d7565b6000604051808303816000865af19150503d8060008114611add576040519150601f19603f3d011682016040523d82523d6000602084013e611ae2565b606091505b509092509050611b50565b896001600160a01b03168b8a604051611b0691906129d7565b60006040518083038160008787f1925050503d8060008114611b44576040519150601f19603f3d011682016040523d82523d6000602084013e611b49565b606091505b5090925090505b611b5a8c8661231d565b60115482611c3257600080600080611b71866123d1565b929650909450925090506003846007811115611b8957fe5b1415611b9857611b9884610ef0565b6001846007811115611ba657fe5b1480611bbd57506004846007811115611bbb57fe5b145b80611bd357506006846007811115611bd157fe5b145b80611be957506007846007811115611be757fe5b145b15611bf45760108290555b6001846007811115611c0257fe5b1480611c0b57508c5b15611c1857809550611c2b565b6040518060200160405280600081525095505b5090925050505b90920390920360115590999098509650505050505050565b611c5482826116d6565b60025460405163af3dc01160e01b81526000916001600160a01b03169063af3dc01190611c879086908690600401612a99565b602060405180830381600087803b158015611ca157600080fd5b505af1158015611cb5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cd991906125e4565b905080610e0c57611ce983611e05565b600260009054906101000a90046001600160a01b03166001600160a01b031663c3fd9b256040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611d3957600080fd5b505af1158015611d4d573d6000803e3d6000fd5b50505050610e0c614e20611f57565b60606000836007811115611d6c57fe5b1415611d875750604080516020810190915260008152610bf5565b6003836007811115611d9557fe5b1415611dd357604080516020808201835260008083529251611dbd9387939092839201612b57565b6040516020818303038152906040529050610bf5565b601154601054604051611dee92869290918690602001612b93565b604051602081830303815290604052905092915050565b611e0e81611811565b60025460405163011b1f7960e41b81526000916001600160a01b0316906311b1f79090611e3f908590600401612a61565b602060405180830381600087803b158015611e5957600080fd5b505af1158015611e6d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e9191906125e4565b90508061081157600260009054906101000a90046001600160a01b03166001600160a01b03166333f943056040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611ee857600080fd5b505af1158015611efc573d6000803e3d6000fd5b505050506108116175306064611951610823866111bb565b60005a8210611f23575a61051c565b5090565b600454600090831115611f3c57506000610bf5565b600354831015611f4e57506000610bf5565b50600192915050565b601154811115611f6b57611f6b6002610ef0565b60118054919091039055565b60608082516001148015611f9f5750608083600081518110611f9557fe5b016020015160f81c105b15611fab57508161051c565b611fb7835160806121cd565b83604051602001611dee9291906129f3565b6060600082604051602001611fde9190612a58565b604051602081830303815290604052905060005b60208110156120285781818151811061200757fe5b01602001516001600160f81b0319161561202057612028565b600101611ff2565b6000816020036001600160401b038111801561204357600080fd5b506040519080825280601f01601f19166020018201604052801561206e576020820181803683370190505b50905060005b81518110156120c457835160018401938591811061208e57fe5b602001015160f81c60f81b8282815181106120a557fe5b60200101906001600160f81b031916908160001a905350600101612074565b50949350505050565b60608151600014156120ee575060408051600081526020810190915261051f565b6000805b83518110156121215783818151811061210757fe5b6020026020010151518201915080806001019150506120f2565b6000826001600160401b038111801561213957600080fd5b506040519080825280601f01601f191660200182016040528015612164576020820181803683370190505b50600092509050602081015b85518310156120c457600086848151811061218757fe5b6020026020010151905060006020820190506121a583828451612424565b8785815181106121b157fe5b6020026020010151518301925050508280600101935050612170565b6060806038841015612227576040805160018082528183019092529060208201818036833701905050905082840160f81b8160008151811061220b57fe5b60200101906001600160f81b031916908160001a905350610bf2565b600060015b80868161223557fe5b041561224a576001909101906101000261222c565b816001016001600160401b038111801561226357600080fd5b506040519080825280601f01601f19166020018201604052801561228e576020820181803683370190505b50925084820160370160f81b836000815181106122a757fe5b60200101906001600160f81b031916908160001a905350600190505b818111612313576101008183036101000a87816122dc57fe5b04816122e457fe5b0660f81b8382815181106122f457fe5b60200101906001600160f81b031916908160001a9053506001016122c3565b5050905092915050565b805182516001600160a01b03908116911614612355578051600e80546001600160a01b0319166001600160a01b039092169190911790555b80602001516001600160a01b031682602001516001600160a01b03161461239b576020810151600f80546001600160a01b0319166001600160a01b039092169190911790555b8060400151151582604001511515146108115760400151600f8054911515600160a01b0260ff60a01b1990921691909117905550565b60008060006060845160001415612400575050604080516020810190915260008082529250829150819061241d565b848060200190518101906124149190612712565b93509350935093505b9193509193565b8282825b60208110612447578151835260209283019290910190601f1901612428565b905182516020929092036101000a6000190180199091169116179052505050565b600061247b61247684612c7f565b612c5c565b905082815283838301111561248f57600080fd5b828260208301376000602084830101529392505050565b803561051f81612ccc565b600082601f8301126124c1578081fd5b610bf283833560208501612468565b80356002811061051f57600080fd5b600060e082840312156124f0578081fd5b6124fa60e0612c5c565b90508135815260208201356020820152612516604083016124d0565b6040820152612527606083016124a6565b6060820152612538608083016124a6565b608082015260a082013560a082015260c08201356001600160401b0381111561256057600080fd5b61256c848285016124b1565b60c08301525092915050565b600060208284031215612589578081fd5b8135610bf281612ccc565b6000602082840312156125a5578081fd5b8151610bf281612ccc565b6000806000606084860312156125c4578182fd5b83356125cf81612ccc565b95602085013595506040909401359392505050565b6000602082840312156125f5578081fd5b81518015158114610bf2578182fd5b600060208284031215612615578081fd5b5035919050565b60006020828403121561262d578081fd5b5051919050565b60008060408385031215612646578182fd5b50508035926020909101359150565b6000806000806080858703121561266a578081fd5b84359350602085013560ff81168114612681578182fd5b93969395505050506040820135916060013590565b6000602082840312156126a7578081fd5b81356001600160401b038111156126bc578182fd5b6126c8848285016124b1565b949350505050565b600080604083850312156126e2578182fd5b82356001600160401b038111156126f7578283fd5b612703858286016124b1565b95602094909401359450505050565b60008060008060808587031215612727578182fd5b845160088110612735578283fd5b80945050602085015192506040850151915060608501516001600160401b0381111561275f578182fd5b8501601f8101871361276f578182fd5b805161277d61247682612c7f565b818152886020838501011115612791578384fd5b6127a2826020830160208601612ca0565b9598949750929550505050565b6000602082840312156127c0578081fd5b81356001600160401b038111156127d5578182fd5b8201601f810184136127e5578182fd5b6126c884823560208401612468565b60008060408385031215612806578182fd5b82356001600160401b0381111561281b578283fd5b612827858286016124df565b925050602083013561283881612ccc565b809150509250929050565b600080600060608486031215612857578081fd5b83356001600160401b0381111561286c578182fd5b612878868287016124df565b935050602084013561288981612ccc565b9150604084013561289981612ccc565b809150509250925092565b6000806000606084860312156128b8578081fd5b8335925060208401356128ca81612ccc565b915060408401356001600160401b038111156128e4578182fd5b6128f0868287016124b1565b9150509250925092565b60008060006060848603121561290e578081fd5b8335925060208401356001600160401b0381111561292a578182fd5b612936868287016124b1565b925050604084013561289981612ccc565b6000815180845261295f816020860160208601612ca0565b601f01601f19169290920160200192915050565b6008811061297d57fe5b9052565b60609190911b6bffffffffffffffffffffffff1916815260140190565b6001600160f81b031994909416845260609290921b6bffffffffffffffffffffffff191660018401526015830152603582015260550190565b600082516129e9818460208701612ca0565b9190910192915050565b60008351612a05818460208801612ca0565b835190830190612a19818360208801612ca0565b01949350505050565b6c600d380380600d6000396000f360981b81528151600090612a4b81600d850160208701612ca0565b91909101600d0192915050565b90815260200190565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039390931683526020830191909152604082015260600190565b6001600160a01b03831681526040602082018190526000906107b490830184612947565b60008315158252604060208301526107b46040830184612947565b93845260ff9290921660208401526040830152606082015260800190565b600060208252610bf26020830184612947565b6020810160028310612b5157fe5b91905290565b6000612b638287612973565b60ff8516602083015260ff8416604083015260806060830152612b896080830184612947565b9695505050505050565b6000612b9f8287612973565b84602083015283604083015260806060830152612b896080830184612947565b60208082526046908201527f4f6e6c792061757468656e746963617465642061646472657373657320696e2060408201527f6f766d53746174654d616e616765722063616e2063616c6c20746869732066756060820152653731ba34b7b760d11b608082015260a00190565b600084825260606020830152612c446060830185612947565b905060018060a01b0383166040830152949350505050565b6040518181016001600160401b0381118282101715612c7757fe5b604052919050565b60006001600160401b03821115612c9257fe5b50601f01601f191660200190565b60005b83811015612cbb578181015183820152602001612ca3565b838111156107995750506000910152565b6001600160a01b038116811461053e57600080fdfe5369676e61747572652070726f766964656420666f7220454f4120636f6e7472616374206372656174696f6e20697320696e76616c69642e436f6e7472616374206372656174696f6e20636f646520636f6e7461696e7320756e73616665206f70636f6465732e2044696420796f75207573652074686520726967687420636f6d70696c6572206f72207061737320616e20756e7361666520636f6e7374727563746f7220617267756d656e743f4120636f6e74726163742068617320616c7265616479206265656e206465706c6f79656420746f20746869732061646472657373436f6e7374727563746f7220617474656d7074656420746f206465706c6f7920756e736166652062797465636f64652ea264697066735822122037659553997f9c397990c7f057ea0856b2adcea1b4d101ba588eaa7204c18d2f64736f6c63430007060033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101c45760003560e01c80637cebbe94116100f957806399ccd98b11610097578063bdbf8c3611610071578063bdbf8c361461037e578063c1fb2ea214610386578063fcb6829b1461038e578063ffe73914146103a1576101c4565b806399ccd98b146103505780639be3ad67146103635780639dc9dc9314610376576101c4565b806385979f76116100d357806385979f761461031a5780638bb42e151461032d5780639058025614610340578063996d79a514610348576101c4565b80637cebbe94146102de5780638435035b146102e65780638540661f146102f9576101c4565b8063299ca478116101665780635a98c361116101405780635a98c3611461029b57806373509064146102a3578063741a33eb146102ab578063746c32f1146102be576101c4565b8063299ca478146102605780632a2a7adb14610275578063461a447814610288576101c4565b80631c4712a7116101a25780631c4712a71461022857806320160f3a1461023057806322bd64c01461023857806324749d5c1461024d576101c4565b806303daa959146101c9578063101185a4146101f257806314aa2ff714610207575b600080fd5b6101dc6101d7366004612604565b6103b4565b6040516101e99190612a58565b60405180910390f35b6101fa6103f9565b6040516101e99190612b43565b61021a610215366004612696565b610402565b6040516101e9929190612ad3565b6101dc61049a565b6101dc6104a0565b61024b610246366004612634565b6104a6565b005b6101dc61025b366004612578565b610509565b610268610524565b6040516101e99190612a61565b61024b610283366004612696565b610533565b6102686102963660046127af565b610541565b6101dc61061d565b610268610623565b61024b6102b9366004612655565b610632565b6102d16102cc3660046125b0565b61079f565b6040516101e99190612b30565b61024b6107be565b6101dc6102f4366004612578565b610815565b61030c6103073660046128a4565b610828565b6040516101e9929190612af7565b61030c6103283660046128a4565b6108a1565b6102d161033b366004612843565b6108f0565b6101dc6109f1565b6102686109f7565b61021a61035e3660046126d0565b610a06565b6102d16103713660046127f4565b610a99565b610268610bfb565b6101dc610c0a565b6101dc610c10565b61024b61039c3660046128fa565b610c27565b61030c6103af3660046128a4565b610e11565b6000619c4060005a905060006103c86109f7565b90506103d48186610e62565b93505060005a82039050808310156103f157601080548483030190555b505050919050565b60085460ff1690565b600f5460009060609060ff600160a01b9091041615156001141561042a5761042a6006610ef0565b619c4060005a9050600061043c6109f7565b905061044781610f09565b600061045b8261045684610f8e565b611019565b905061046781886110b3565b95509550505060005a8203905080831015610489576010805484019055610492565b60108054820190555b505050915091565b60045490565b600b5490565b600f5460ff600160a01b909104161515600114156104c8576104c86006610ef0565b61ea6060005a905060006104da6109f7565b90506104e7818686611139565b5060005a820390508083101561050257601080548483030190555b5050505050565b600061051c610517836111bb565b611246565b90505b919050565b6000546001600160a01b031681565b61053e60018261124a565b50565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b838110156105a1578181015183820152602001610589565b50505050905090810190601f1680156105ce5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b1580156105eb57600080fd5b505afa1580156105ff573d6000803e3d6000fd5b505050506040513d602081101561061557600080fd5b505192915050565b600a5490565b600e546001600160a01b031690565b600f5460ff600160a01b90910416151560011415610654576106546006610ef0565b600060018585601b0185856040516000815260200160405260405161067c9493929190612b12565b6020604051602081039080840390855afa15801561069e573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166106da576106da604051806060016040528060388152602001612ce260389139610533565b6106e381611260565b6106ed5750610799565b6106f6816112eb565b600f80546001600160a01b038381166001600160a01b031983161790925516600061075361072f6009602160991b01836102cc82610815565b60405160200161073f9190612a22565b604051602081830303815290604052611352565b600f80546001600160a01b0319166001600160a01b038516179055905061078a838261077e81611365565b8051906020012061137b565b6107958360006113b8565b5050505b50505050565b60606107b46107ad856111bb565b8484611429565b90505b9392505050565b600f5460ff600160a01b909104161515600114156107e0576107e06006610ef0565b60006107ea6109f7565b905060006107f782610f8e565b9050808160010111156108115761081182826001016113b8565b5050565b600061051c610823836111bb565b61144d565b600060606201388060005a60408051606081018252600f546001600160a01b0390811682528916602082015260019181019190915290915061086c81898989611451565b945094505060005a820390508083101561088d576010805484019055610896565b60108054820190555b505050935093915050565b60006060620186a060005a60408051606081018252600f5460ff600160a01b8204161515928201929092526001600160a01b039182168152908816602082015290915061086c81898989611451565b606033156108fd57600080fd5b600280546001600160a01b0319166001600160a01b038416179055610921846114e2565b600019601155600f80546001600160a01b0319166001600160a01b03858116919091179091556080850151161580156109c0576000806109648760c00151610402565b90925090506001600160a01b0382166109a45760008160405160200161098b929190612af7565b60405160208183030381529060405293505050506107b7565b60016109af83611365565b60405160200161098b929190612af7565b6000806109da8760a0015188608001518960c001516108a1565b91509150818160405160200161098b929190612af7565b60075490565b600f546001600160a01b031690565b600f5460009060609060ff600160a01b90910416151560011415610a2e57610a2e6006610ef0565b619c4060005a90506000610a406109f7565b9050610a4b81610f09565b6000610a58828989611554565b9050610a6481896110b3565b95509550505060005a8203905080831015610a86576010805484019055610a8f565b60108054820190555b5050509250929050565b600a546060907fdefa017defa017defa017defa017defa017defa017defa017defa017defa017d14610ada5750604080516020810190915260008152610bf5565b600280546001600160a01b0319166001600160a01b038481169190911791829055604051630d15d41560e41b815291169063d15d415090610b1f903390600401612a61565b60206040518083038186803b158015610b3757600080fd5b505afa158015610b4b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b6f91906125e4565b610b945760405162461bcd60e51b8152600401610b8b90612bbf565b60405180910390fd5b610b9d836114e2565b610ba68361159a565b610bc757610bb26115f6565b50604080516020810190915260008152610bf5565b6000610be76003600001548560a001510385608001518660c001516108a1565b915050610bf26115f6565b90505b92915050565b600d546001600160a01b031690565b60095490565b6000610c22610c1d6109f7565b610f8e565b905090565b333014610c3357610e0c565b610c3c81611260565b610c6b57610c6b6005610c66604051806060016040528060348152602001612d9060349139611693565b61124a565b6001546040516352275acd60e11b81526001600160a01b039091169063a44eb59a90610c9b908590600401612b30565b60206040518083038186803b158015610cb357600080fd5b505afa158015610cc7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ceb91906125e4565b610d1557610d156004610c666040518060a0016040528060768152602001612d1a60769139611693565b610d1e816112eb565b6000610d2983611352565b90506001600160a01b038116610d43573d6000803e3d6000fd5b6000610d4e82611365565b6001546040516352275acd60e11b81529192506001600160a01b03169063a44eb59a90610d7f908490600401612b30565b60206040518083038186803b158015610d9757600080fd5b505afa158015610dab573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dcf91906125e4565b610df957610df96004610c66604051806060016040528060308152602001612dc460309139611693565b6105028383610e0785611246565b61137b565b505050565b60006060619c4060005a60408051606081018252600e546001600160a01b039081168252600f549081166020830152600160a01b900460ff1615159181019190915290915061086c81898989611451565b6000610e6e83836116d6565b600254604051631aaf392f60e01b81526001600160a01b0390911690631aaf392f90610ea09086908690600401612a99565b60206040518083038186803b158015610eb857600080fd5b505afa158015610ecc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bf2919061261c565b61053e816040518060200160405280600081525061124a565b600080610f585a6002602160991b0185604051602401610f299190612a61565b60408051601f198184030181529190526020810180516001600160e01b031663b1540a0160e01b1790526108a1565b91509150600081806020019051810190610f7291906125e4565b9050801580610f7f575082155b15610799576107996007610ef0565b6000610f9982611811565b60025460405163d126199f60e01b81526001600160a01b039091169063d126199f90610fc9908590600401612a61565b60206040518083038186803b158015610fe157600080fd5b505afa158015610ff5573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061051c919061261c565b60408051600280825260608201909252600091829190816020015b606081526020019060019003908161103457905050905061105484611958565b8160008151811061106157fe5b602002602001018190525061107583611982565b8160018151811061108257fe5b6020026020010181905250600061109882611995565b90506110aa81805190602001206119d9565b95945050505050565b600060606110d56110c26109f7565b6110cd610c1d6109f7565b6001016113b8565b60408051606081018252600f5460ff600160a01b8204161515928201929092526001600160a01b039182168152908516602082015260008061111b835a898960016119dc565b915091508161112b57600061112d565b865b97909650945050505050565b806111448484610e62565b141561114f57610e0c565b6111598383611c4a565b600254604051635c17d62960e01b81526001600160a01b0390911690635c17d6299061118d90869086908690600401612ab2565b600060405180830381600087803b1580156111a757600080fd5b505af1158015610795573d6000803e3d6000fd5b60006111c682611811565b600254604051637c8ee70360e01b81526001600160a01b0390911690637c8ee703906111f6908590600401612a61565b60206040518083038186803b15801561120e57600080fd5b505afa158015611222573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061051c9190612594565b3f90565b60006112568383611d5c565b9050805160208201fd5b600061126b82611811565b6002546040516307a1294560e01b81526001600160a01b03909116906307a129459061129b908590600401612a61565b60206040518083038186803b1580156112b357600080fd5b505afa1580156112c7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061051c91906125e4565b6112f481611811565b600254604051637e78a4d160e11b81526001600160a01b039091169063fcf149a290611324908490600401612a61565b600060405180830381600087803b15801561133e57600080fd5b505af1158015610502573d6000803e3d6000fd5b6000808251602084016000f09392505050565b606061051c8260006113768561144d565b611429565b61138483611e05565b6002546040516368510af960e11b81526001600160a01b039091169063d0a215f29061118d90869086908690600401612a75565b6113c182611e05565b6002546040516374855dc360e11b81526001600160a01b039091169063e90abb86906113f39085908590600401612a99565b600060405180830381600087803b15801561140d57600080fd5b505af1158015611421573d6000803e3d6000fd5b505050505050565b6060806040519050602083018101604052828152828460208301873c949350505050565b3b90565b6000606073ffffffffffffffffffffffffffffffffffff0000841673deaddeaddeaddeaddeaddeaddeaddeaddead000014156114a05750506040805160208101909152600081526001906114d9565b60006064856001600160a01b0316106114c1576114bc856111bb565b6114c3565b845b90506114d38787838760006119dc565b92509250505b94509492505050565b80516009556020810151600a5560a0810151600c5560408101516008805460ff19166001838181111561151157fe5b02179055506060810151600d80546001600160a01b0319166001600160a01b03909216919091179055600554600b5560a081015161154e90611f14565b60115550565b60008060ff60f81b85848680519060200120604051602001611579949392919061299e565b6040516020818303038152906040528051906020012090506110aa816119d9565b60007fdefa017defa017defa017defa017defa017defa017defa017defa017defa017d826020015114156115d05750600061051f565b6115e28260a001518360400151611f27565b6115ee5750600061051f565b506001919050565b600d80546001600160a01b031990811673defa017defa017defa017defa017defa017defa09081179092557fdefa017defa017defa017defa017defa017defa017defa017defa017defa017d6009819055600a819055600b819055600c8190556008805460ff191690556010819055600e8054831684179055600f8054831690931760ff60a01b1916909255601191909155600280549091169055565b6060816040516024016116a69190612b30565b60408051601f198184030181529190526020810180516001600160e01b031662461bcd60e51b1790529050919050565b6175305a10156116ea576116ea6000610ef0565b600254604051630ad2267960e01b81526001600160a01b0390911690630ad226799061171c9085908590600401612a99565b60206040518083038186803b15801561173457600080fd5b505afa158015611748573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061176c91906125e4565b61177a5761177a6003610ef0565b600254604051632bcdee1960e21b81526000916001600160a01b03169063af37b864906117ad9086908690600401612a99565b602060405180830381600087803b1580156117c757600080fd5b505af11580156117db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117ff91906125e4565b905080610e0c57610e0c614e20611f57565b6175305a1015611825576118256000610ef0565b60025460405163c8e40fbf60e01b81526001600160a01b039091169063c8e40fbf90611855908490600401612a61565b60206040518083038186803b15801561186d57600080fd5b505afa158015611881573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118a591906125e4565b6118b3576118b36003610ef0565b600254604051633ecdecc760e21b81526000916001600160a01b03169063fb37b31c906118e4908590600401612a61565b602060405180830381600087803b1580156118fe57600080fd5b505af1158015611912573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061193691906125e4565b905080610811576108116175306064611951610823866111bb565b0201611f57565b606061051c8260405160200161196e9190612981565b604051602081830303815290604052611f77565b606061051c61199083611fc9565b611f77565b606060006119a2836120cd565b90506119b0815160c06121cd565b816040516020016119c29291906129f3565b604051602081830303815290604052915050919050565b90565b6040805160608082018352600e546001600160a01b039081168352600f549081166020840152600160a01b900460ff1615159282019290925260009190611a23818961231d565b6011546000611a3189611f14565b60118190559050600060608715611aed57604051309063fcb6829b60e01b90611a62908e908d908f90602401612c2b565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909416939093179092529051611aa091906129d7565b6000604051808303816000865af19150503d8060008114611add576040519150601f19603f3d011682016040523d82523d6000602084013e611ae2565b606091505b509092509050611b50565b896001600160a01b03168b8a604051611b0691906129d7565b60006040518083038160008787f1925050503d8060008114611b44576040519150601f19603f3d011682016040523d82523d6000602084013e611b49565b606091505b5090925090505b611b5a8c8661231d565b60115482611c3257600080600080611b71866123d1565b929650909450925090506003846007811115611b8957fe5b1415611b9857611b9884610ef0565b6001846007811115611ba657fe5b1480611bbd57506004846007811115611bbb57fe5b145b80611bd357506006846007811115611bd157fe5b145b80611be957506007846007811115611be757fe5b145b15611bf45760108290555b6001846007811115611c0257fe5b1480611c0b57508c5b15611c1857809550611c2b565b6040518060200160405280600081525095505b5090925050505b90920390920360115590999098509650505050505050565b611c5482826116d6565b60025460405163af3dc01160e01b81526000916001600160a01b03169063af3dc01190611c879086908690600401612a99565b602060405180830381600087803b158015611ca157600080fd5b505af1158015611cb5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cd991906125e4565b905080610e0c57611ce983611e05565b600260009054906101000a90046001600160a01b03166001600160a01b031663c3fd9b256040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611d3957600080fd5b505af1158015611d4d573d6000803e3d6000fd5b50505050610e0c614e20611f57565b60606000836007811115611d6c57fe5b1415611d875750604080516020810190915260008152610bf5565b6003836007811115611d9557fe5b1415611dd357604080516020808201835260008083529251611dbd9387939092839201612b57565b6040516020818303038152906040529050610bf5565b601154601054604051611dee92869290918690602001612b93565b604051602081830303815290604052905092915050565b611e0e81611811565b60025460405163011b1f7960e41b81526000916001600160a01b0316906311b1f79090611e3f908590600401612a61565b602060405180830381600087803b158015611e5957600080fd5b505af1158015611e6d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e9191906125e4565b90508061081157600260009054906101000a90046001600160a01b03166001600160a01b03166333f943056040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611ee857600080fd5b505af1158015611efc573d6000803e3d6000fd5b505050506108116175306064611951610823866111bb565b60005a8210611f23575a61051c565b5090565b600454600090831115611f3c57506000610bf5565b600354831015611f4e57506000610bf5565b50600192915050565b601154811115611f6b57611f6b6002610ef0565b60118054919091039055565b60608082516001148015611f9f5750608083600081518110611f9557fe5b016020015160f81c105b15611fab57508161051c565b611fb7835160806121cd565b83604051602001611dee9291906129f3565b6060600082604051602001611fde9190612a58565b604051602081830303815290604052905060005b60208110156120285781818151811061200757fe5b01602001516001600160f81b0319161561202057612028565b600101611ff2565b6000816020036001600160401b038111801561204357600080fd5b506040519080825280601f01601f19166020018201604052801561206e576020820181803683370190505b50905060005b81518110156120c457835160018401938591811061208e57fe5b602001015160f81c60f81b8282815181106120a557fe5b60200101906001600160f81b031916908160001a905350600101612074565b50949350505050565b60608151600014156120ee575060408051600081526020810190915261051f565b6000805b83518110156121215783818151811061210757fe5b6020026020010151518201915080806001019150506120f2565b6000826001600160401b038111801561213957600080fd5b506040519080825280601f01601f191660200182016040528015612164576020820181803683370190505b50600092509050602081015b85518310156120c457600086848151811061218757fe5b6020026020010151905060006020820190506121a583828451612424565b8785815181106121b157fe5b6020026020010151518301925050508280600101935050612170565b6060806038841015612227576040805160018082528183019092529060208201818036833701905050905082840160f81b8160008151811061220b57fe5b60200101906001600160f81b031916908160001a905350610bf2565b600060015b80868161223557fe5b041561224a576001909101906101000261222c565b816001016001600160401b038111801561226357600080fd5b506040519080825280601f01601f19166020018201604052801561228e576020820181803683370190505b50925084820160370160f81b836000815181106122a757fe5b60200101906001600160f81b031916908160001a905350600190505b818111612313576101008183036101000a87816122dc57fe5b04816122e457fe5b0660f81b8382815181106122f457fe5b60200101906001600160f81b031916908160001a9053506001016122c3565b5050905092915050565b805182516001600160a01b03908116911614612355578051600e80546001600160a01b0319166001600160a01b039092169190911790555b80602001516001600160a01b031682602001516001600160a01b03161461239b576020810151600f80546001600160a01b0319166001600160a01b039092169190911790555b8060400151151582604001511515146108115760400151600f8054911515600160a01b0260ff60a01b1990921691909117905550565b60008060006060845160001415612400575050604080516020810190915260008082529250829150819061241d565b848060200190518101906124149190612712565b93509350935093505b9193509193565b8282825b60208110612447578151835260209283019290910190601f1901612428565b905182516020929092036101000a6000190180199091169116179052505050565b600061247b61247684612c7f565b612c5c565b905082815283838301111561248f57600080fd5b828260208301376000602084830101529392505050565b803561051f81612ccc565b600082601f8301126124c1578081fd5b610bf283833560208501612468565b80356002811061051f57600080fd5b600060e082840312156124f0578081fd5b6124fa60e0612c5c565b90508135815260208201356020820152612516604083016124d0565b6040820152612527606083016124a6565b6060820152612538608083016124a6565b608082015260a082013560a082015260c08201356001600160401b0381111561256057600080fd5b61256c848285016124b1565b60c08301525092915050565b600060208284031215612589578081fd5b8135610bf281612ccc565b6000602082840312156125a5578081fd5b8151610bf281612ccc565b6000806000606084860312156125c4578182fd5b83356125cf81612ccc565b95602085013595506040909401359392505050565b6000602082840312156125f5578081fd5b81518015158114610bf2578182fd5b600060208284031215612615578081fd5b5035919050565b60006020828403121561262d578081fd5b5051919050565b60008060408385031215612646578182fd5b50508035926020909101359150565b6000806000806080858703121561266a578081fd5b84359350602085013560ff81168114612681578182fd5b93969395505050506040820135916060013590565b6000602082840312156126a7578081fd5b81356001600160401b038111156126bc578182fd5b6126c8848285016124b1565b949350505050565b600080604083850312156126e2578182fd5b82356001600160401b038111156126f7578283fd5b612703858286016124b1565b95602094909401359450505050565b60008060008060808587031215612727578182fd5b845160088110612735578283fd5b80945050602085015192506040850151915060608501516001600160401b0381111561275f578182fd5b8501601f8101871361276f578182fd5b805161277d61247682612c7f565b818152886020838501011115612791578384fd5b6127a2826020830160208601612ca0565b9598949750929550505050565b6000602082840312156127c0578081fd5b81356001600160401b038111156127d5578182fd5b8201601f810184136127e5578182fd5b6126c884823560208401612468565b60008060408385031215612806578182fd5b82356001600160401b0381111561281b578283fd5b612827858286016124df565b925050602083013561283881612ccc565b809150509250929050565b600080600060608486031215612857578081fd5b83356001600160401b0381111561286c578182fd5b612878868287016124df565b935050602084013561288981612ccc565b9150604084013561289981612ccc565b809150509250925092565b6000806000606084860312156128b8578081fd5b8335925060208401356128ca81612ccc565b915060408401356001600160401b038111156128e4578182fd5b6128f0868287016124b1565b9150509250925092565b60008060006060848603121561290e578081fd5b8335925060208401356001600160401b0381111561292a578182fd5b612936868287016124b1565b925050604084013561289981612ccc565b6000815180845261295f816020860160208601612ca0565b601f01601f19169290920160200192915050565b6008811061297d57fe5b9052565b60609190911b6bffffffffffffffffffffffff1916815260140190565b6001600160f81b031994909416845260609290921b6bffffffffffffffffffffffff191660018401526015830152603582015260550190565b600082516129e9818460208701612ca0565b9190910192915050565b60008351612a05818460208801612ca0565b835190830190612a19818360208801612ca0565b01949350505050565b6c600d380380600d6000396000f360981b81528151600090612a4b81600d850160208701612ca0565b91909101600d0192915050565b90815260200190565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039390931683526020830191909152604082015260600190565b6001600160a01b03831681526040602082018190526000906107b490830184612947565b60008315158252604060208301526107b46040830184612947565b93845260ff9290921660208401526040830152606082015260800190565b600060208252610bf26020830184612947565b6020810160028310612b5157fe5b91905290565b6000612b638287612973565b60ff8516602083015260ff8416604083015260806060830152612b896080830184612947565b9695505050505050565b6000612b9f8287612973565b84602083015283604083015260806060830152612b896080830184612947565b60208082526046908201527f4f6e6c792061757468656e746963617465642061646472657373657320696e2060408201527f6f766d53746174654d616e616765722063616e2063616c6c20746869732066756060820152653731ba34b7b760d11b608082015260a00190565b600084825260606020830152612c446060830185612947565b905060018060a01b0383166040830152949350505050565b6040518181016001600160401b0381118282101715612c7757fe5b604052919050565b60006001600160401b03821115612c9257fe5b50601f01601f191660200190565b60005b83811015612cbb578181015183820152602001612ca3565b838111156107995750506000910152565b6001600160a01b038116811461053e57600080fdfe5369676e61747572652070726f766964656420666f7220454f4120636f6e7472616374206372656174696f6e20697320696e76616c69642e436f6e7472616374206372656174696f6e20636f646520636f6e7461696e7320756e73616665206f70636f6465732e2044696420796f75207573652074686520726967687420636f6d70696c6572206f72207061737320616e20756e7361666520636f6e7374727563746f7220617267756d656e743f4120636f6e74726163742068617320616c7265616479206265656e206465706c6f79656420746f20746869732061646472657373436f6e7374727563746f7220617474656d7074656420746f206465706c6f7920756e736166652062797465636f64652ea264697066735822122037659553997f9c397990c7f057ea0856b2adcea1b4d101ba588eaa7204c18d2f64736f6c63430007060033", "devdoc": { "details": "The Execution Manager (EM) is the core of our OVM implementation, and provides a sandboxed environment allowing us to execute OVM transactions deterministically on either Layer 1 or Layer 2. The EM's run() function is the first function called during the execution of any transaction on L2. For each context-dependent EVM operation the EM has a function which implements a corresponding OVM operation, which will read state from the State Manager contract. The EM relies on the Safety Checker to verify that code deployed to Layer 2 does not contain any context-dependent operations. Compiler used: solc Runtime target: EVM", "kind": "dev", @@ -814,7 +815,7 @@ }, "ovmL1QUEUEORIGIN()": { "returns": { - "_queueOrigin": "Address of the ovmL1QUEUEORIGIN within the current message context." + "_queueOrigin": "Enum indicating the ovmL1QUEUEORIGIN within the current message context." } }, "ovmL1TXORIGIN()": { @@ -862,6 +863,14 @@ "_TIMESTAMP": "Value of the TIMESTAMP within the transaction context." } }, + "resolve(string)": { + "params": { + "_name": "Name to resolve an address for." + }, + "returns": { + "_0": "Address associated with the given name." + } + }, "run((uint256,uint256,uint8,address,address,uint256,bytes),address)": { "params": { "_ovmStateManager": "iOVM_StateManager implementation providing account state.", @@ -931,7 +940,7 @@ "notice": "Bumps the nonce of the current ovmADDRESS by one." }, "ovmL1QUEUEORIGIN()": { - "notice": "Specifies from which L1 rollup queue this transaction originated from." + "notice": "Specifies from which source (Sequencer or Queue) this transaction originated from." }, "ovmL1TXORIGIN()": { "notice": "Specifies which L1 account, if any, sent this transaction by calling enqueue()." @@ -954,11 +963,14 @@ "ovmTIMESTAMP()": { "notice": "Overrides TIMESTAMP." }, + "resolve(string)": { + "notice": "Resolves the address associated with a given name." + }, "run((uint256,uint256,uint8,address,address,uint256,bytes),address)": { "notice": "Starts the execution of a transaction via the OVM_ExecutionManager." }, "safeCREATE(uint256,bytes,address)": { - "notice": "Handles the creation-specific safety measures required for OVM contract deployment. This function sanitizes the return types for creation messages to match calls (bool, bytes), by being an external function which the EM can call, that mimics the success/fail case of the CREATE. This allows for consistent handling of both types of messages in _handleExternalMessage(). Having this step occur as a separate call frame also allows us to easily revert the contract deployment in the event that the code is unsafe. " + "notice": "Handles the creation-specific safety measures required for OVM contract deployment. This function sanitizes the return types for creation messages to match calls (bool, bytes), by being an external function which the EM can call, that mimics the success/fail case of the CREATE. This allows for consistent handling of both types of messages in _handleExternalMessage(). Having this step occur as a separate call frame also allows us to easily revert the contract deployment in the event that the code is unsafe." }, "simulateMessage((uint256,uint256,uint8,address,address,uint256,bytes),address,address)": { "notice": "Unreachable helper function for simulating eth_calls with an OVM message context. This function will throw an exception in all cases other than when used as a custom entrypoint in L2 Geth to simulate eth_call." @@ -969,76 +981,76 @@ "storageLayout": { "storage": [ { - "astId": 12554, + "astId": 12856, "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", "label": "libAddressManager", "offset": 0, "slot": "0", - "type": "t_contract(Lib_AddressManager)12547" + "type": "t_contract(Lib_AddressManager)12849" }, { - "astId": 4494, + "astId": 5228, "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", "label": "ovmSafetyChecker", "offset": 0, "slot": "1", - "type": "t_contract(iOVM_SafetyChecker)11062" + "type": "t_contract(iOVM_SafetyChecker)11336" }, { - "astId": 4496, + "astId": 5230, "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", "label": "ovmStateManager", "offset": 0, "slot": "2", - "type": "t_contract(iOVM_StateManager)11294" + "type": "t_contract(iOVM_StateManager)11568" }, { - "astId": 4498, + "astId": 5232, "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", "label": "gasMeterConfig", "offset": 0, "slot": "3", - "type": "t_struct(GasMeterConfig)10847_storage" + "type": "t_struct(GasMeterConfig)11119_storage" }, { - "astId": 4500, + "astId": 5234, "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", "label": "globalContext", "offset": 0, "slot": "7", - "type": "t_struct(GlobalContext)10850_storage" + "type": "t_struct(GlobalContext)11122_storage" }, { - "astId": 4502, + "astId": 5236, "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", "label": "transactionContext", "offset": 0, "slot": "8", - "type": "t_struct(TransactionContext)10863_storage" + "type": "t_struct(TransactionContext)11135_storage" }, { - "astId": 4504, + "astId": 5238, "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", "label": "messageContext", "offset": 0, "slot": "14", - "type": "t_struct(MessageContext)10873_storage" + "type": "t_struct(MessageContext)11145_storage" }, { - "astId": 4506, + "astId": 5240, "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", "label": "transactionRecord", "offset": 0, "slot": "16", - "type": "t_struct(TransactionRecord)10866_storage" + "type": "t_struct(TransactionRecord)11138_storage" }, { - "astId": 4508, + "astId": 5242, "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", "label": "messageRecord", "offset": 0, "slot": "17", - "type": "t_struct(MessageRecord)10876_storage" + "type": "t_struct(MessageRecord)11148_storage" } ], "types": { @@ -1052,32 +1064,32 @@ "label": "bool", "numberOfBytes": "1" }, - "t_contract(Lib_AddressManager)12547": { + "t_contract(Lib_AddressManager)12849": { "encoding": "inplace", "label": "contract Lib_AddressManager", "numberOfBytes": "20" }, - "t_contract(iOVM_SafetyChecker)11062": { + "t_contract(iOVM_SafetyChecker)11336": { "encoding": "inplace", "label": "contract iOVM_SafetyChecker", "numberOfBytes": "20" }, - "t_contract(iOVM_StateManager)11294": { + "t_contract(iOVM_StateManager)11568": { "encoding": "inplace", "label": "contract iOVM_StateManager", "numberOfBytes": "20" }, - "t_enum(QueueOrigin)11860": { + "t_enum(QueueOrigin)12489": { "encoding": "inplace", "label": "enum Lib_OVMCodec.QueueOrigin", "numberOfBytes": "1" }, - "t_struct(GasMeterConfig)10847_storage": { + "t_struct(GasMeterConfig)11119_storage": { "encoding": "inplace", "label": "struct iOVM_ExecutionManager.GasMeterConfig", "members": [ { - "astId": 10840, + "astId": 11112, "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", "label": "minTransactionGasLimit", "offset": 0, @@ -1085,7 +1097,7 @@ "type": "t_uint256" }, { - "astId": 10842, + "astId": 11114, "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", "label": "maxTransactionGasLimit", "offset": 0, @@ -1093,7 +1105,7 @@ "type": "t_uint256" }, { - "astId": 10844, + "astId": 11116, "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", "label": "maxGasPerQueuePerEpoch", "offset": 0, @@ -1101,7 +1113,7 @@ "type": "t_uint256" }, { - "astId": 10846, + "astId": 11118, "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", "label": "secondsPerEpoch", "offset": 0, @@ -1111,12 +1123,12 @@ ], "numberOfBytes": "128" }, - "t_struct(GlobalContext)10850_storage": { + "t_struct(GlobalContext)11122_storage": { "encoding": "inplace", "label": "struct iOVM_ExecutionManager.GlobalContext", "members": [ { - "astId": 10849, + "astId": 11121, "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", "label": "ovmCHAINID", "offset": 0, @@ -1126,12 +1138,12 @@ ], "numberOfBytes": "32" }, - "t_struct(MessageContext)10873_storage": { + "t_struct(MessageContext)11145_storage": { "encoding": "inplace", "label": "struct iOVM_ExecutionManager.MessageContext", "members": [ { - "astId": 10868, + "astId": 11140, "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", "label": "ovmCALLER", "offset": 0, @@ -1139,7 +1151,7 @@ "type": "t_address" }, { - "astId": 10870, + "astId": 11142, "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", "label": "ovmADDRESS", "offset": 0, @@ -1147,7 +1159,7 @@ "type": "t_address" }, { - "astId": 10872, + "astId": 11144, "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", "label": "isStatic", "offset": 20, @@ -1157,12 +1169,12 @@ ], "numberOfBytes": "64" }, - "t_struct(MessageRecord)10876_storage": { + "t_struct(MessageRecord)11148_storage": { "encoding": "inplace", "label": "struct iOVM_ExecutionManager.MessageRecord", "members": [ { - "astId": 10875, + "astId": 11147, "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", "label": "nuisanceGasLeft", "offset": 0, @@ -1172,20 +1184,20 @@ ], "numberOfBytes": "32" }, - "t_struct(TransactionContext)10863_storage": { + "t_struct(TransactionContext)11135_storage": { "encoding": "inplace", "label": "struct iOVM_ExecutionManager.TransactionContext", "members": [ { - "astId": 10852, + "astId": 11124, "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", "label": "ovmL1QUEUEORIGIN", "offset": 0, "slot": "0", - "type": "t_enum(QueueOrigin)11860" + "type": "t_enum(QueueOrigin)12489" }, { - "astId": 10854, + "astId": 11126, "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", "label": "ovmTIMESTAMP", "offset": 0, @@ -1193,7 +1205,7 @@ "type": "t_uint256" }, { - "astId": 10856, + "astId": 11128, "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", "label": "ovmNUMBER", "offset": 0, @@ -1201,7 +1213,7 @@ "type": "t_uint256" }, { - "astId": 10858, + "astId": 11130, "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", "label": "ovmGASLIMIT", "offset": 0, @@ -1209,7 +1221,7 @@ "type": "t_uint256" }, { - "astId": 10860, + "astId": 11132, "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", "label": "ovmTXGASLIMIT", "offset": 0, @@ -1217,7 +1229,7 @@ "type": "t_uint256" }, { - "astId": 10862, + "astId": 11134, "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", "label": "ovmL1TXORIGIN", "offset": 0, @@ -1227,12 +1239,12 @@ ], "numberOfBytes": "192" }, - "t_struct(TransactionRecord)10866_storage": { + "t_struct(TransactionRecord)11138_storage": { "encoding": "inplace", "label": "struct iOVM_ExecutionManager.TransactionRecord", "members": [ { - "astId": 10865, + "astId": 11137, "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", "label": "ovmGasRefund", "offset": 0, diff --git a/packages/contracts/deployments/mainnet/OVM_FraudVerifier.json b/packages/contracts/deployments/mainnet/OVM_FraudVerifier.json index 3a6e129e87b6f..6792581fd20e0 100644 --- a/packages/contracts/deployments/mainnet/OVM_FraudVerifier.json +++ b/packages/contracts/deployments/mainnet/OVM_FraudVerifier.json @@ -1,5 +1,5 @@ { - "address": "0xF7C64A47A557D2944798801C08771e15455c56c4", + "address": "0x169CC2f69Cc16da17B71Df2dce6161ef57991bB9", "abi": [ { "inputs": [ @@ -429,7 +429,7 @@ "outputs": [ { "internalType": "address", - "name": "_contract", + "name": "", "type": "address" } ], @@ -437,31 +437,31 @@ "type": "function" } ], - "transactionHash": "0x01f9ac2efc552863b77c56153eb6cc75a22dcc31fb5c99425ba30eff2bdd2b4a", + "transactionHash": "0xb24349bb6d8ea4817102c7c98e1f7656e761fa6817ed7a14a77c0a4bfd7a4215", "receipt": { "to": null, - "from": "0x77C4c8f491e5ff22a2C0E18b005c3BA0Fe36c1Bc", - "contractAddress": "0xF7C64A47A557D2944798801C08771e15455c56c4", - "transactionIndex": 157, - "gasUsed": "1376835", + "from": "0xd033f09cB85621F98F7A84C64dB381ac16Eff818", + "contractAddress": "0x169CC2f69Cc16da17B71Df2dce6161ef57991bB9", + "transactionIndex": 154, + "gasUsed": "1386986", "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0x42c2005a07f741c1c5cf3e41e80a4d477d4eeced69956257da9a1bbeb75ca7d9", - "transactionHash": "0x01f9ac2efc552863b77c56153eb6cc75a22dcc31fb5c99425ba30eff2bdd2b4a", + "blockHash": "0x7337e713943b7eeaef3e1fb048abc568735fedc9f81d2e1520179efdb4643a0c", + "transactionHash": "0xb24349bb6d8ea4817102c7c98e1f7656e761fa6817ed7a14a77c0a4bfd7a4215", "logs": [], - "blockNumber": 12207859, - "cumulativeGasUsed": "10636042", + "blockNumber": 12410842, + "cumulativeGasUsed": "7764301", "status": 1, "byzantium": true }, "args": [ - "0xd3EeD86464Ff13B4BFD81a3bB1e753b7ceBA3A39" + "0x668E5b997b9aE88a56cd40409119d4Db9e6d752E" ], - "solcInputHash": "43ee6bb8ef92595aa6d0e22a6c464dff", - "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"_preStateRoot\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_preStateRootIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"_transactionHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_who\",\"type\":\"address\"}],\"name\":\"FraudProofFinalized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"_preStateRoot\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_preStateRootIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"_transactionHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_who\",\"type\":\"address\"}],\"name\":\"FraudProofInitialized\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_preStateRoot\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"_preStateRootBatchHeader\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"siblings\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct Lib_OVMCodec.ChainInclusionProof\",\"name\":\"_preStateRootProof\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"_txHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"_postStateRoot\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"_postStateRootBatchHeader\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"siblings\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct Lib_OVMCodec.ChainInclusionProof\",\"name\":\"_postStateRootProof\",\"type\":\"tuple\"}],\"name\":\"finalizeFraudVerification\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_preStateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"_txHash\",\"type\":\"bytes32\"}],\"name\":\"getStateTransitioner\",\"outputs\":[{\"internalType\":\"contract iOVM_StateTransitioner\",\"name\":\"_transitioner\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_preStateRoot\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"_preStateRootBatchHeader\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"siblings\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct Lib_OVMCodec.ChainInclusionProof\",\"name\":\"_preStateRootProof\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"enum Lib_OVMCodec.QueueOrigin\",\"name\":\"l1QueueOrigin\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"l1TxOrigin\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"entrypoint\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.Transaction\",\"name\":\"_transaction\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isSequenced\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"queueIndex\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"txData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.TransactionChainElement\",\"name\":\"_txChainElement\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"_transactionBatchHeader\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"siblings\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct Lib_OVMCodec.ChainInclusionProof\",\"name\":\"_transactionProof\",\"type\":\"tuple\"}],\"name\":\"initializeFraudVerification\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"_contract\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The Fraud Verifier contract coordinates the entire fraud proof verification process. If the fraud proof was successful it prunes any state batches from State Commitment Chain which were published after the fraudulent state root. Compiler used: solc Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\"}},\"finalizeFraudVerification(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes32,bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))\":{\"params\":{\"_postStateRoot\":\"State root after the fraudulent transaction.\",\"_postStateRootBatchHeader\":\"Batch header for the provided post-state root.\",\"_postStateRootProof\":\"Inclusion proof for the provided post-state root.\",\"_preStateRoot\":\"State root before the fraudulent transaction.\",\"_preStateRootBatchHeader\":\"Batch header for the provided pre-state root.\",\"_preStateRootProof\":\"Inclusion proof for the provided pre-state root.\",\"_txHash\":\"The transaction for the state root\"}},\"getStateTransitioner(bytes32,bytes32)\":{\"params\":{\"_preStateRoot\":\"State root to query a transitioner for.\"},\"returns\":{\"_transitioner\":\"Corresponding state transitioner contract.\"}},\"initializeFraudVerification(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),(uint256,uint256,uint8,address,address,uint256,bytes),(bool,uint256,uint256,uint256,bytes),(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))\":{\"params\":{\"_preStateRoot\":\"State root before the fraudulent transaction.\",\"_preStateRootBatchHeader\":\"Batch header for the provided pre-state root.\",\"_preStateRootProof\":\"Inclusion proof for the provided pre-state root.\",\"_transaction\":\"OVM transaction claimed to be fraudulent.\",\"_transactionBatchHeader\":\"Batch header for the provided transaction.\",\"_transactionProof\":\"Inclusion proof for the provided transaction.\",\"_txChainElement\":\"OVM transaction chain element.\"}}},\"title\":\"OVM_FraudVerifier\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"finalizeFraudVerification(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes32,bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))\":{\"notice\":\"Finalizes the fraud verification process.\"},\"getStateTransitioner(bytes32,bytes32)\":{\"notice\":\"Retrieves the state transitioner for a given root.\"},\"initializeFraudVerification(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),(uint256,uint256,uint8,address,address,uint256,bytes),(bool,uint256,uint256,uint256,bytes),(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))\":{\"notice\":\"Begins the fraud verification process.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/OVM/verification/OVM_FraudVerifier.sol\":\"OVM_FraudVerifier\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/optimistic-ethereum/OVM/verification/Abs_FraudContributor.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\nimport { iOVM_BondManager } from \\\"../../iOVM/verification/iOVM_BondManager.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/// Minimal contract to be inherited by contracts consumed by users that provide\\n/// data for fraud proofs\\nabstract contract Abs_FraudContributor is Lib_AddressResolver {\\n /// Decorate your functions with this modifier to store how much total gas was\\n /// consumed by the sender, to reward users fairly\\n modifier contributesToFraudProof(bytes32 preStateRoot, bytes32 txHash) {\\n uint256 startGas = gasleft();\\n _;\\n uint256 gasSpent = startGas - gasleft();\\n iOVM_BondManager(resolve('OVM_BondManager')).recordGasSpent(preStateRoot, txHash, msg.sender, gasSpent);\\n }\\n}\\n\",\"keccak256\":\"0x6c27d089a297103cb93b30f7649ab68691cc6b948c315f1037e5de1fe9bf5903\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/verification/OVM_FraudVerifier.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_FraudVerifier } from \\\"../../iOVM/verification/iOVM_FraudVerifier.sol\\\";\\nimport { iOVM_StateTransitioner } from \\\"../../iOVM/verification/iOVM_StateTransitioner.sol\\\";\\nimport { iOVM_StateTransitionerFactory } from \\\"../../iOVM/verification/iOVM_StateTransitionerFactory.sol\\\";\\nimport { iOVM_BondManager } from \\\"../../iOVM/verification/iOVM_BondManager.sol\\\";\\nimport { iOVM_StateCommitmentChain } from \\\"../../iOVM/chain/iOVM_StateCommitmentChain.sol\\\";\\nimport { iOVM_CanonicalTransactionChain } from \\\"../../iOVM/chain/iOVM_CanonicalTransactionChain.sol\\\";\\n\\n/* Contract Imports */\\nimport { Abs_FraudContributor } from \\\"./Abs_FraudContributor.sol\\\";\\n\\n\\n\\n/**\\n * @title OVM_FraudVerifier\\n * @dev The Fraud Verifier contract coordinates the entire fraud proof verification process. \\n * If the fraud proof was successful it prunes any state batches from State Commitment Chain\\n * which were published after the fraudulent state root.\\n * \\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract OVM_FraudVerifier is Lib_AddressResolver, Abs_FraudContributor, iOVM_FraudVerifier {\\n\\n /*******************************************\\n * Contract Variables: Internal Accounting *\\n *******************************************/\\n\\n mapping (bytes32 => iOVM_StateTransitioner) internal transitioners;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n */\\n constructor(\\n address _libAddressManager\\n )\\n Lib_AddressResolver(_libAddressManager)\\n {}\\n\\n\\n /***************************************\\n * Public Functions: Transition Status *\\n ***************************************/\\n\\n /**\\n * Retrieves the state transitioner for a given root.\\n * @param _preStateRoot State root to query a transitioner for.\\n * @return _transitioner Corresponding state transitioner contract.\\n */\\n function getStateTransitioner(\\n bytes32 _preStateRoot,\\n bytes32 _txHash\\n )\\n override\\n public\\n view\\n returns (\\n iOVM_StateTransitioner _transitioner\\n )\\n {\\n return transitioners[keccak256(abi.encodePacked(_preStateRoot, _txHash))];\\n }\\n\\n\\n /****************************************\\n * Public Functions: Fraud Verification *\\n ****************************************/\\n\\n /**\\n * Begins the fraud verification process.\\n * @param _preStateRoot State root before the fraudulent transaction.\\n * @param _preStateRootBatchHeader Batch header for the provided pre-state root.\\n * @param _preStateRootProof Inclusion proof for the provided pre-state root.\\n * @param _transaction OVM transaction claimed to be fraudulent.\\n * @param _txChainElement OVM transaction chain element.\\n * @param _transactionBatchHeader Batch header for the provided transaction.\\n * @param _transactionProof Inclusion proof for the provided transaction.\\n */\\n function initializeFraudVerification(\\n bytes32 _preStateRoot,\\n Lib_OVMCodec.ChainBatchHeader memory _preStateRootBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _preStateRootProof,\\n Lib_OVMCodec.Transaction memory _transaction,\\n Lib_OVMCodec.TransactionChainElement memory _txChainElement,\\n Lib_OVMCodec.ChainBatchHeader memory _transactionBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _transactionProof\\n )\\n override\\n public\\n contributesToFraudProof(_preStateRoot, Lib_OVMCodec.hashTransaction(_transaction))\\n {\\n bytes32 _txHash = Lib_OVMCodec.hashTransaction(_transaction);\\n\\n if (_hasStateTransitioner(_preStateRoot, _txHash)) {\\n return;\\n }\\n\\n iOVM_StateCommitmentChain ovmStateCommitmentChain = iOVM_StateCommitmentChain(resolve(\\\"OVM_StateCommitmentChain\\\"));\\n iOVM_CanonicalTransactionChain ovmCanonicalTransactionChain = iOVM_CanonicalTransactionChain(resolve(\\\"OVM_CanonicalTransactionChain\\\"));\\n\\n require(\\n ovmStateCommitmentChain.verifyStateCommitment(\\n _preStateRoot,\\n _preStateRootBatchHeader,\\n _preStateRootProof\\n ),\\n \\\"Invalid pre-state root inclusion proof.\\\"\\n );\\n\\n require(\\n ovmCanonicalTransactionChain.verifyTransaction(\\n _transaction,\\n _txChainElement,\\n _transactionBatchHeader,\\n _transactionProof\\n ),\\n \\\"Invalid transaction inclusion proof.\\\"\\n );\\n\\n require (\\n _preStateRootBatchHeader.prevTotalElements + _preStateRootProof.index + 1 == _transactionBatchHeader.prevTotalElements + _transactionProof.index,\\n \\\"Pre-state root global index must equal to the transaction root global index.\\\"\\n );\\n\\n _deployTransitioner(_preStateRoot, _txHash, _preStateRootProof.index);\\n\\n emit FraudProofInitialized(\\n _preStateRoot,\\n _preStateRootProof.index,\\n _txHash,\\n msg.sender\\n );\\n }\\n\\n /**\\n * Finalizes the fraud verification process.\\n * @param _preStateRoot State root before the fraudulent transaction.\\n * @param _preStateRootBatchHeader Batch header for the provided pre-state root.\\n * @param _preStateRootProof Inclusion proof for the provided pre-state root.\\n * @param _txHash The transaction for the state root\\n * @param _postStateRoot State root after the fraudulent transaction.\\n * @param _postStateRootBatchHeader Batch header for the provided post-state root.\\n * @param _postStateRootProof Inclusion proof for the provided post-state root.\\n */\\n function finalizeFraudVerification(\\n bytes32 _preStateRoot,\\n Lib_OVMCodec.ChainBatchHeader memory _preStateRootBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _preStateRootProof,\\n bytes32 _txHash,\\n bytes32 _postStateRoot,\\n Lib_OVMCodec.ChainBatchHeader memory _postStateRootBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _postStateRootProof\\n )\\n override\\n public\\n contributesToFraudProof(_preStateRoot, _txHash)\\n {\\n iOVM_StateTransitioner transitioner = getStateTransitioner(_preStateRoot, _txHash);\\n iOVM_StateCommitmentChain ovmStateCommitmentChain = iOVM_StateCommitmentChain(resolve(\\\"OVM_StateCommitmentChain\\\"));\\n\\n require(\\n transitioner.isComplete() == true,\\n \\\"State transition process must be completed prior to finalization.\\\"\\n );\\n\\n require (\\n _postStateRootBatchHeader.prevTotalElements + _postStateRootProof.index == _preStateRootBatchHeader.prevTotalElements + _preStateRootProof.index + 1,\\n \\\"Post-state root global index must equal to the pre state root global index plus one.\\\"\\n );\\n\\n require(\\n ovmStateCommitmentChain.verifyStateCommitment(\\n _preStateRoot,\\n _preStateRootBatchHeader,\\n _preStateRootProof\\n ),\\n \\\"Invalid pre-state root inclusion proof.\\\"\\n );\\n\\n require(\\n ovmStateCommitmentChain.verifyStateCommitment(\\n _postStateRoot,\\n _postStateRootBatchHeader,\\n _postStateRootProof\\n ),\\n \\\"Invalid post-state root inclusion proof.\\\"\\n );\\n\\n // If the post state root did not match, then there was fraud and we should delete the batch\\n require(\\n _postStateRoot != transitioner.getPostStateRoot(),\\n \\\"State transition has not been proven fraudulent.\\\"\\n );\\n \\n _cancelStateTransition(_postStateRootBatchHeader, _preStateRoot);\\n\\n // TEMPORARY: Remove the transitioner; for minnet.\\n transitioners[keccak256(abi.encodePacked(_preStateRoot, _txHash))] = iOVM_StateTransitioner(0x0000000000000000000000000000000000000000);\\n\\n emit FraudProofFinalized(\\n _preStateRoot,\\n _preStateRootProof.index,\\n _txHash,\\n msg.sender\\n );\\n }\\n\\n\\n /************************************\\n * Internal Functions: Verification *\\n ************************************/\\n\\n /**\\n * Checks whether a transitioner already exists for a given pre-state root.\\n * @param _preStateRoot Pre-state root to check.\\n * @return _exists Whether or not we already have a transitioner for the root.\\n */\\n function _hasStateTransitioner(\\n bytes32 _preStateRoot,\\n bytes32 _txHash\\n )\\n internal\\n view\\n returns (\\n bool _exists\\n )\\n {\\n return address(getStateTransitioner(_preStateRoot, _txHash)) != address(0);\\n }\\n\\n /**\\n * Deploys a new state transitioner.\\n * @param _preStateRoot Pre-state root to initialize the transitioner with.\\n * @param _txHash Hash of the transaction this transitioner will execute.\\n * @param _stateTransitionIndex Index of the transaction in the chain.\\n */\\n function _deployTransitioner(\\n bytes32 _preStateRoot,\\n bytes32 _txHash,\\n uint256 _stateTransitionIndex\\n )\\n internal\\n {\\n transitioners[keccak256(abi.encodePacked(_preStateRoot, _txHash))] = iOVM_StateTransitionerFactory(\\n resolve(\\\"OVM_StateTransitionerFactory\\\")\\n ).create(\\n address(libAddressManager),\\n _stateTransitionIndex,\\n _preStateRoot,\\n _txHash\\n );\\n }\\n\\n /**\\n * Removes a state transition from the state commitment chain.\\n * @param _postStateRootBatchHeader Header for the post-state root.\\n * @param _preStateRoot Pre-state root hash.\\n */\\n function _cancelStateTransition(\\n Lib_OVMCodec.ChainBatchHeader memory _postStateRootBatchHeader,\\n bytes32 _preStateRoot\\n )\\n internal\\n {\\n iOVM_StateCommitmentChain ovmStateCommitmentChain = iOVM_StateCommitmentChain(resolve(\\\"OVM_StateCommitmentChain\\\"));\\n iOVM_BondManager ovmBondManager = iOVM_BondManager(resolve(\\\"OVM_BondManager\\\"));\\n\\n // Delete the state batch.\\n ovmStateCommitmentChain.deleteStateBatch(\\n _postStateRootBatchHeader\\n );\\n\\n // Get the timestamp and publisher for that block.\\n (uint256 timestamp, address publisher) = abi.decode(_postStateRootBatchHeader.extraData, (uint256, address));\\n\\n // Slash the bonds at the bond manager.\\n ovmBondManager.finalize(\\n _preStateRoot,\\n publisher,\\n timestamp\\n );\\n }\\n}\\n\",\"keccak256\":\"0x5a0ee382d8b4a7aa46d3c52f10005e58b374ddf2113dd7e0113591477c4cfa04\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_CanonicalTransactionChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_ChainStorageContainer } from \\\"./iOVM_ChainStorageContainer.sol\\\";\\n\\n/**\\n * @title iOVM_CanonicalTransactionChain\\n */\\ninterface iOVM_CanonicalTransactionChain {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event TransactionEnqueued(\\n address _l1TxOrigin,\\n address _target,\\n uint256 _gasLimit,\\n bytes _data,\\n uint256 _queueIndex,\\n uint256 _timestamp\\n );\\n\\n event QueueBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event SequencerBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event TransactionBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct BatchContext {\\n uint256 numSequencedTransactions;\\n uint256 numSubsequentQueueTransactions;\\n uint256 timestamp;\\n uint256 blockNumber;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n\\n /**\\n * Accesses the batch storage container.\\n * @return Reference to the batch storage container.\\n */\\n function batches()\\n external\\n view\\n returns (\\n iOVM_ChainStorageContainer\\n );\\n\\n /**\\n * Accesses the queue storage container.\\n * @return Reference to the queue storage container.\\n */\\n function queue()\\n external\\n view\\n returns (\\n iOVM_ChainStorageContainer\\n );\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements()\\n external\\n view\\n returns (\\n uint256 _totalElements\\n );\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches()\\n external\\n view\\n returns (\\n uint256 _totalBatches\\n );\\n\\n /**\\n * Returns the index of the next element to be enqueued.\\n * @return Index for the next queue element.\\n */\\n function getNextQueueIndex()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Gets the queue element at a particular index.\\n * @param _index Index of the queue element to access.\\n * @return _element Queue element at the given index.\\n */\\n function getQueueElement(\\n uint256 _index\\n )\\n external\\n view\\n returns (\\n Lib_OVMCodec.QueueElement memory _element\\n );\\n\\n /**\\n * Returns the timestamp of the last transaction.\\n * @return Timestamp for the last transaction.\\n */\\n function getLastTimestamp()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Returns the blocknumber of the last transaction.\\n * @return Blocknumber for the last transaction.\\n */\\n function getLastBlockNumber()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Get the number of queue elements which have not yet been included.\\n * @return Number of pending queue elements.\\n */\\n function getNumPendingQueueElements()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Retrieves the length of the queue, including\\n * both pending and canonical transactions.\\n * @return Length of the queue.\\n */\\n function getQueueLength()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n\\n /**\\n * Adds a transaction to the queue.\\n * @param _target Target contract to send the transaction to.\\n * @param _gasLimit Gas limit for the given transaction.\\n * @param _data Transaction data.\\n */\\n function enqueue(\\n address _target,\\n uint256 _gasLimit,\\n bytes memory _data\\n )\\n external;\\n\\n /**\\n * Appends a given number of queued transactions as a single batch.\\n * @param _numQueuedTransactions Number of transactions to append.\\n */\\n function appendQueueBatch(\\n uint256 _numQueuedTransactions\\n )\\n external;\\n\\n /**\\n * Allows the sequencer to append a batch of transactions.\\n * @dev This function uses a custom encoding scheme for efficiency reasons.\\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\\n * .param _contexts Array of batch contexts.\\n * .param _transactionDataFields Array of raw transaction data.\\n */\\n function appendSequencerBatch(\\n // uint40 _shouldStartAtElement,\\n // uint24 _totalElementsToAppend,\\n // BatchContext[] _contexts,\\n // bytes[] _transactionDataFields\\n )\\n external;\\n\\n /**\\n * Verifies whether a transaction is included in the chain.\\n * @param _transaction Transaction to verify.\\n * @param _txChainElement Transaction chain element corresponding to the transaction.\\n * @param _batchHeader Header of the batch the transaction was included in.\\n * @param _inclusionProof Inclusion proof for the provided transaction chain element.\\n * @return True if the transaction exists in the CTC, false if not.\\n */\\n function verifyTransaction(\\n Lib_OVMCodec.Transaction memory _transaction,\\n Lib_OVMCodec.TransactionChainElement memory _txChainElement,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _inclusionProof\\n )\\n external\\n view\\n returns (\\n bool\\n );\\n}\\n\",\"keccak256\":\"0xb5e55488a1982841c07cdf5ff475da4789596f111dd48f01b1918ee4c775cf3a\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_ChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title iOVM_ChainStorageContainer\\n */\\ninterface iOVM_ChainStorageContainer {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata()\\n external\\n view\\n returns (\\n bytes27\\n );\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length()\\n external\\n view\\n returns (\\n uint256\\n );\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(\\n bytes32 _object\\n )\\n external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(\\n bytes32 _object,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(\\n uint256 _index\\n )\\n external\\n view\\n returns (\\n bytes32\\n );\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index\\n )\\n external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Marks an index as overwritable, meaing the underlying buffer can start to write values over\\n * any objects before and including the given index.\\n */\\n function setNextOverwritableIndex(\\n uint256 _index\\n )\\n external;\\n}\\n\",\"keccak256\":\"0x2d7973a0ad84c23ec62624d3f1e3aeb198cc72686ff1e6cfa17155556b320c94\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_StateCommitmentChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title iOVM_StateCommitmentChain\\n */\\ninterface iOVM_StateCommitmentChain {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event StateBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n event StateBatchDeleted(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot\\n );\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements()\\n external\\n view\\n returns (\\n uint256 _totalElements\\n );\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches()\\n external\\n view\\n returns (\\n uint256 _totalBatches\\n );\\n\\n /**\\n * Retrieves the timestamp of the last batch submitted by the sequencer.\\n * @return _lastSequencerTimestamp Last sequencer batch timestamp.\\n */\\n function getLastSequencerTimestamp()\\n external\\n view\\n returns (\\n uint256 _lastSequencerTimestamp\\n );\\n\\n /**\\n * Appends a batch of state roots to the chain.\\n * @param _batch Batch of state roots.\\n * @param _shouldStartAtElement Index of the element at which this batch should start.\\n */\\n function appendStateBatch(\\n bytes32[] calldata _batch,\\n uint256 _shouldStartAtElement\\n )\\n external;\\n\\n /**\\n * Deletes all state roots after (and including) a given batch.\\n * @param _batchHeader Header of the batch to start deleting from.\\n */\\n function deleteStateBatch(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n external;\\n\\n /**\\n * Verifies a batch inclusion proof.\\n * @param _element Hash of the element to verify a proof for.\\n * @param _batchHeader Header of the batch in which the element was included.\\n * @param _proof Merkle inclusion proof for the element.\\n */\\n function verifyStateCommitment(\\n bytes32 _element,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _proof\\n )\\n external\\n view\\n returns (\\n bool _verified\\n );\\n\\n /**\\n * Checks whether a given batch is still inside its fraud proof window.\\n * @param _batchHeader Header of the batch to check.\\n * @return _inside Whether or not the batch is inside the fraud proof window.\\n */\\n function insideFraudProofWindow(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n external\\n view\\n returns (\\n bool _inside\\n );\\n}\\n\",\"keccak256\":\"0x6646d6ff392b81aab52a7a277e91540819464751de0af5afd1962094b2e92448\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/verification/iOVM_BondManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\ninterface ERC20 {\\n function transfer(address, uint256) external returns (bool);\\n function transferFrom(address, address, uint256) external returns (bool);\\n}\\n\\n/// All the errors which may be encountered on the bond manager\\nlibrary Errors {\\n string constant ERC20_ERR = \\\"BondManager: Could not post bond\\\";\\n string constant ALREADY_FINALIZED = \\\"BondManager: Fraud proof for this pre-state root has already been finalized\\\";\\n string constant SLASHED = \\\"BondManager: Cannot finalize withdrawal, you probably got slashed\\\";\\n string constant WRONG_STATE = \\\"BondManager: Wrong bond state for proposer\\\";\\n string constant CANNOT_CLAIM = \\\"BondManager: Cannot claim yet. Dispute must be finalized first\\\";\\n\\n string constant WITHDRAWAL_PENDING = \\\"BondManager: Withdrawal already pending\\\";\\n string constant TOO_EARLY = \\\"BondManager: Too early to finalize your withdrawal\\\";\\n\\n string constant ONLY_TRANSITIONER = \\\"BondManager: Only the transitioner for this pre-state root may call this function\\\";\\n string constant ONLY_FRAUD_VERIFIER = \\\"BondManager: Only the fraud verifier may call this function\\\";\\n string constant ONLY_STATE_COMMITMENT_CHAIN = \\\"BondManager: Only the state commitment chain may call this function\\\";\\n string constant WAIT_FOR_DISPUTES = \\\"BondManager: Wait for other potential disputes\\\";\\n}\\n\\n/**\\n * @title iOVM_BondManager\\n */\\ninterface iOVM_BondManager {\\n\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n /// The lifecycle of a proposer's bond\\n enum State {\\n // Before depositing or after getting slashed, a user is uncollateralized\\n NOT_COLLATERALIZED,\\n // After depositing, a user is collateralized\\n COLLATERALIZED,\\n // After a user has initiated a withdrawal\\n WITHDRAWING\\n }\\n\\n /// A bond posted by a proposer\\n struct Bond {\\n // The user's state\\n State state;\\n // The timestamp at which a proposer issued their withdrawal request\\n uint32 withdrawalTimestamp;\\n // The time when the first disputed was initiated for this bond\\n uint256 firstDisputeAt;\\n // The earliest observed state root for this bond which has had fraud\\n bytes32 earliestDisputedStateRoot;\\n // The state root's timestamp\\n uint256 earliestTimestamp;\\n }\\n\\n // Per pre-state root, store the number of state provisions that were made\\n // and how many of these calls were made by each user. Payouts will then be\\n // claimed by users proportionally for that dispute.\\n struct Rewards {\\n // Flag to check if rewards for a fraud proof are claimable\\n bool canClaim;\\n // Total number of `recordGasSpent` calls made\\n uint256 total;\\n // The gas spent by each user to provide witness data. The sum of all\\n // values inside this map MUST be equal to the value of `total`\\n mapping(address => uint256) gasSpent;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function recordGasSpent(\\n bytes32 _preStateRoot,\\n bytes32 _txHash,\\n address _who,\\n uint256 _gasSpent\\n ) external;\\n\\n function finalize(\\n bytes32 _preStateRoot,\\n address _publisher,\\n uint256 _timestamp\\n ) external;\\n\\n function deposit() external;\\n\\n function startWithdrawal() external;\\n\\n function finalizeWithdrawal() external;\\n\\n function claim(\\n address _who\\n ) external;\\n\\n function isCollateralized(\\n address _who\\n ) external view returns (bool);\\n\\n function getGasSpent(\\n bytes32 _preStateRoot,\\n address _who\\n ) external view returns (uint256);\\n}\\n\",\"keccak256\":\"0x3c2a8a399487857158649db1896749d86e39cba545a8aeb2e2bb0f3bdfa7a5b1\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/verification/iOVM_FraudVerifier.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_StateTransitioner } from \\\"./iOVM_StateTransitioner.sol\\\";\\n\\n/**\\n * @title iOVM_FraudVerifier\\n */\\ninterface iOVM_FraudVerifier {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event FraudProofInitialized(\\n bytes32 _preStateRoot,\\n uint256 _preStateRootIndex,\\n bytes32 _transactionHash,\\n address _who\\n );\\n\\n event FraudProofFinalized(\\n bytes32 _preStateRoot,\\n uint256 _preStateRootIndex,\\n bytes32 _transactionHash,\\n address _who\\n );\\n\\n\\n /***************************************\\n * Public Functions: Transition Status *\\n ***************************************/\\n\\n function getStateTransitioner(bytes32 _preStateRoot, bytes32 _txHash) external view returns (iOVM_StateTransitioner _transitioner);\\n\\n\\n /****************************************\\n * Public Functions: Fraud Verification *\\n ****************************************/\\n\\n function initializeFraudVerification(\\n bytes32 _preStateRoot,\\n Lib_OVMCodec.ChainBatchHeader calldata _preStateRootBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof calldata _preStateRootProof,\\n Lib_OVMCodec.Transaction calldata _transaction,\\n Lib_OVMCodec.TransactionChainElement calldata _txChainElement,\\n Lib_OVMCodec.ChainBatchHeader calldata _transactionBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof calldata _transactionProof\\n ) external;\\n\\n function finalizeFraudVerification(\\n bytes32 _preStateRoot,\\n Lib_OVMCodec.ChainBatchHeader calldata _preStateRootBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof calldata _preStateRootProof,\\n bytes32 _txHash,\\n bytes32 _postStateRoot,\\n Lib_OVMCodec.ChainBatchHeader calldata _postStateRootBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof calldata _postStateRootProof\\n ) external;\\n}\\n\",\"keccak256\":\"0x5efd7bb18164bbd3e9d58379e8203fbf2a7ee802b1a48dff3ceaaec1523b1751\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/verification/iOVM_StateTransitioner.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title iOVM_StateTransitioner\\n */\\ninterface iOVM_StateTransitioner {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AccountCommitted(\\n address _address\\n );\\n\\n event ContractStorageCommitted(\\n address _address,\\n bytes32 _key\\n );\\n\\n\\n /**********************************\\n * Public Functions: State Access *\\n **********************************/\\n\\n function getPreStateRoot() external view returns (bytes32 _preStateRoot);\\n function getPostStateRoot() external view returns (bytes32 _postStateRoot);\\n function isComplete() external view returns (bool _complete);\\n\\n\\n /***********************************\\n * Public Functions: Pre-Execution *\\n ***********************************/\\n\\n function proveContractState(\\n address _ovmContractAddress,\\n address _ethContractAddress,\\n bytes calldata _stateTrieWitness\\n ) external;\\n\\n function proveStorageSlot(\\n address _ovmContractAddress,\\n bytes32 _key,\\n bytes calldata _storageTrieWitness\\n ) external;\\n\\n\\n /*******************************\\n * Public Functions: Execution *\\n *******************************/\\n\\n function applyTransaction(\\n Lib_OVMCodec.Transaction calldata _transaction\\n ) external;\\n\\n\\n /************************************\\n * Public Functions: Post-Execution *\\n ************************************/\\n\\n function commitContractState(\\n address _ovmContractAddress,\\n bytes calldata _stateTrieWitness\\n ) external;\\n\\n function commitStorageSlot(\\n address _ovmContractAddress,\\n bytes32 _key,\\n bytes calldata _storageTrieWitness\\n ) external;\\n\\n\\n /**********************************\\n * Public Functions: Finalization *\\n **********************************/\\n\\n function completeTransition() external;\\n}\\n\",\"keccak256\":\"0x3d044ac0a3bb6ad3d529f904b3191117511f9c379678ca03010e1ebdfcb5c34b\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/verification/iOVM_StateTransitionerFactory.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Contract Imports */\\nimport { iOVM_StateTransitioner } from \\\"./iOVM_StateTransitioner.sol\\\";\\n\\n/**\\n * @title iOVM_StateTransitionerFactory\\n */\\ninterface iOVM_StateTransitionerFactory {\\n\\n /***************************************\\n * Public Functions: Contract Creation *\\n ***************************************/\\n\\n function create(\\n address _proxyManager,\\n uint256 _stateTransitionIndex,\\n bytes32 _preStateRoot,\\n bytes32 _transactionHash\\n )\\n external\\n returns (\\n iOVM_StateTransitioner _ovmStateTransitioner\\n );\\n}\\n\",\"keccak256\":\"0x60a0f0c104e4c0c7863268a93005762e8146d393f9cfddfdd6a2d6585c5911fc\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/codec/Lib_OVMCodec.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../utils/Lib_Bytes32Utils.sol\\\";\\nimport { Lib_SafeExecutionManagerWrapper } from \\\"../../libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\\\";\\n\\n/**\\n * @title Lib_OVMCodec\\n */\\nlibrary Lib_OVMCodec {\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum EOASignatureType {\\n EIP155_TRANSACTION,\\n ETH_SIGNED_MESSAGE\\n }\\n\\n enum QueueOrigin {\\n SEQUENCER_QUEUE,\\n L1TOL2_QUEUE\\n }\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Account {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n address ethAddress;\\n bool isFresh;\\n }\\n\\n struct EVMAccount {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n }\\n\\n struct ChainBatchHeader {\\n uint256 batchIndex;\\n bytes32 batchRoot;\\n uint256 batchSize;\\n uint256 prevTotalElements;\\n bytes extraData;\\n }\\n\\n struct ChainInclusionProof {\\n uint256 index;\\n bytes32[] siblings;\\n }\\n\\n struct Transaction {\\n uint256 timestamp;\\n uint256 blockNumber;\\n QueueOrigin l1QueueOrigin;\\n address l1TxOrigin;\\n address entrypoint;\\n uint256 gasLimit;\\n bytes data;\\n }\\n\\n struct TransactionChainElement {\\n bool isSequenced;\\n uint256 queueIndex; // QUEUED TX ONLY\\n uint256 timestamp; // SEQUENCER TX ONLY\\n uint256 blockNumber; // SEQUENCER TX ONLY\\n bytes txData; // SEQUENCER TX ONLY\\n }\\n\\n struct QueueElement {\\n bytes32 transactionHash;\\n uint40 timestamp;\\n uint40 blockNumber;\\n }\\n\\n struct EIP155Transaction {\\n uint256 nonce;\\n uint256 gasPrice;\\n uint256 gasLimit;\\n address to;\\n uint256 value;\\n bytes data;\\n uint256 chainId;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Decodes an EOA transaction (i.e., native Ethereum RLP encoding).\\n * @param _transaction Encoded EOA transaction.\\n * @return Transaction decoded into a struct.\\n */\\n function decodeEIP155Transaction(\\n bytes memory _transaction,\\n bool _isEthSignedMessage\\n )\\n internal\\n pure\\n returns (\\n EIP155Transaction memory\\n )\\n {\\n if (_isEthSignedMessage) {\\n (\\n uint256 _nonce,\\n uint256 _gasLimit,\\n uint256 _gasPrice,\\n uint256 _chainId,\\n address _to,\\n bytes memory _data\\n ) = abi.decode(\\n _transaction,\\n (uint256, uint256, uint256, uint256, address ,bytes)\\n );\\n return EIP155Transaction({\\n nonce: _nonce,\\n gasPrice: _gasPrice,\\n gasLimit: _gasLimit,\\n to: _to,\\n value: 0,\\n data: _data,\\n chainId: _chainId\\n });\\n } else {\\n Lib_RLPReader.RLPItem[] memory decoded = Lib_RLPReader.readList(_transaction);\\n\\n return EIP155Transaction({\\n nonce: Lib_RLPReader.readUint256(decoded[0]),\\n gasPrice: Lib_RLPReader.readUint256(decoded[1]),\\n gasLimit: Lib_RLPReader.readUint256(decoded[2]),\\n to: Lib_RLPReader.readAddress(decoded[3]),\\n value: Lib_RLPReader.readUint256(decoded[4]),\\n data: Lib_RLPReader.readBytes(decoded[5]),\\n chainId: Lib_RLPReader.readUint256(decoded[6])\\n });\\n }\\n }\\n\\n /**\\n * Decompresses a compressed EIP155 transaction.\\n * @param _transaction Compressed EIP155 transaction bytes.\\n * @return Transaction parsed into a struct.\\n */\\n function decompressEIP155Transaction(\\n bytes memory _transaction\\n )\\n internal\\n returns (\\n EIP155Transaction memory\\n )\\n {\\n return EIP155Transaction({\\n gasLimit: Lib_BytesUtils.toUint24(_transaction, 0),\\n gasPrice: uint256(Lib_BytesUtils.toUint24(_transaction, 3)) * 1000000,\\n nonce: Lib_BytesUtils.toUint24(_transaction, 6),\\n to: Lib_BytesUtils.toAddress(_transaction, 9),\\n data: Lib_BytesUtils.slice(_transaction, 29),\\n chainId: Lib_SafeExecutionManagerWrapper.safeCHAINID(),\\n value: 0\\n });\\n }\\n\\n /**\\n * Encodes an EOA transaction back into the original transaction.\\n * @param _transaction EIP155transaction to encode.\\n * @param _isEthSignedMessage Whether or not this was an eth signed message.\\n * @return Encoded transaction.\\n */\\n function encodeEIP155Transaction(\\n EIP155Transaction memory _transaction,\\n bool _isEthSignedMessage\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n if (_isEthSignedMessage) {\\n return abi.encode(\\n _transaction.nonce,\\n _transaction.gasLimit,\\n _transaction.gasPrice,\\n _transaction.chainId,\\n _transaction.to,\\n _transaction.data\\n );\\n } else {\\n bytes[] memory raw = new bytes[](9);\\n\\n raw[0] = Lib_RLPWriter.writeUint(_transaction.nonce);\\n raw[1] = Lib_RLPWriter.writeUint(_transaction.gasPrice);\\n raw[2] = Lib_RLPWriter.writeUint(_transaction.gasLimit);\\n if (_transaction.to == address(0)) {\\n raw[3] = Lib_RLPWriter.writeBytes('');\\n } else {\\n raw[3] = Lib_RLPWriter.writeAddress(_transaction.to);\\n }\\n raw[4] = Lib_RLPWriter.writeUint(0);\\n raw[5] = Lib_RLPWriter.writeBytes(_transaction.data);\\n raw[6] = Lib_RLPWriter.writeUint(_transaction.chainId);\\n raw[7] = Lib_RLPWriter.writeBytes(bytes(''));\\n raw[8] = Lib_RLPWriter.writeBytes(bytes(''));\\n\\n return Lib_RLPWriter.writeList(raw);\\n }\\n }\\n\\n /**\\n * Encodes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Encoded transaction bytes.\\n */\\n function encodeTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return abi.encodePacked(\\n _transaction.timestamp,\\n _transaction.blockNumber,\\n _transaction.l1QueueOrigin,\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n );\\n }\\n\\n /**\\n * Hashes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Hashed transaction\\n */\\n function hashTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(encodeTransaction(_transaction));\\n }\\n\\n /**\\n * Converts an OVM account to an EVM account.\\n * @param _in OVM account to convert.\\n * @return Converted EVM account.\\n */\\n function toEVMAccount(\\n Account memory _in\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n return EVMAccount({\\n nonce: _in.nonce,\\n balance: _in.balance,\\n storageRoot: _in.storageRoot,\\n codeHash: _in.codeHash\\n });\\n }\\n\\n /**\\n * @notice RLP-encodes an account state struct.\\n * @param _account Account state struct.\\n * @return RLP-encoded account state.\\n */\\n function encodeEVMAccount(\\n EVMAccount memory _account\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes[] memory raw = new bytes[](4);\\n\\n // Unfortunately we can't create this array outright because\\n // Lib_RLPWriter.writeList will reject fixed-size arrays. Assigning\\n // index-by-index circumvents this issue.\\n raw[0] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.nonce)\\n )\\n );\\n raw[1] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.balance)\\n )\\n );\\n raw[2] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.storageRoot));\\n raw[3] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.codeHash));\\n\\n return Lib_RLPWriter.writeList(raw);\\n }\\n\\n /**\\n * @notice Decodes an RLP-encoded account state into a useful struct.\\n * @param _encoded RLP-encoded account state.\\n * @return Account state struct.\\n */\\n function decodeEVMAccount(\\n bytes memory _encoded\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\\n\\n return EVMAccount({\\n nonce: Lib_RLPReader.readUint256(accountState[0]),\\n balance: Lib_RLPReader.readUint256(accountState[1]),\\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\\n });\\n }\\n\\n /**\\n * Calculates a hash for a given batch header.\\n * @param _batchHeader Header to hash.\\n * @return Hash of the header.\\n */\\n function hashBatchHeader(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(\\n abi.encode(\\n _batchHeader.batchRoot,\\n _batchHeader.batchSize,\\n _batchHeader.prevTotalElements,\\n _batchHeader.extraData\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0xe7e518ba7bba3fa28c532f8902576c1bb4dfc1ec4b62bed6da50623248ba17c3\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Contract Imports */\\nimport { Ownable } from \\\"./Lib_Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n /*******************************************\\n * Contract Variables: Internal Accounting *\\n *******************************************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n public\\n onlyOwner\\n {\\n emit AddressSet(_name, _address);\\n addresses[_getNameHash(_name)] = _address;\\n }\\n\\n function getAddress(\\n string memory _name\\n )\\n public\\n view\\n returns (address)\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32 _hash\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0x3a490595cc21ff170e4027843093670ff845d5972481fbfb956b722ea564bb06\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n\\n /*******************************************\\n * Contract Variables: Contract References *\\n *******************************************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(\\n address _libAddressManager\\n ) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function resolve(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address _contract\\n )\\n {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0xaa3ed342f6deb156c660fd83afa579a3b80db17eb465e8949cf5c1b114780143\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Ownable\\n * @dev Adapted from https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol\\n */\\nabstract contract Ownable {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n address public owner;\\n\\n\\n /**********\\n * Events *\\n **********/\\n\\n event OwnershipTransferred(\\n address indexed previousOwner,\\n address indexed newOwner\\n );\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n constructor() {\\n owner = msg.sender;\\n emit OwnershipTransferred(address(0), owner);\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n owner == msg.sender,\\n \\\"Ownable: caller is not the owner\\\"\\n );\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function renounceOwnership()\\n public\\n virtual\\n onlyOwner\\n {\\n emit OwnershipTransferred(owner, address(0));\\n owner = address(0);\\n }\\n\\n function transferOwnership(address _newOwner)\\n public\\n virtual\\n onlyOwner\\n {\\n require(\\n _newOwner != address(0),\\n \\\"Ownable: new owner cannot be the zero address\\\"\\n );\\n\\n emit OwnershipTransferred(owner, _newOwner);\\n owner = _newOwner;\\n }\\n}\\n\",\"keccak256\":\"0xd9dfd9264e5b5fedd53a5b10fdf179c3f367614b0fe69179bce4e45119f5b739\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPReader.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_RLPReader\\n * @dev Adapted from \\\"RLPReader\\\" by Hamdi Allam (hamdi.allam97@gmail.com).\\n */\\nlibrary Lib_RLPReader {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 constant internal MAX_LIST_LENGTH = 32;\\n\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum RLPItemType {\\n DATA_ITEM,\\n LIST_ITEM\\n }\\n\\n \\n /***********\\n * Structs *\\n ***********/\\n\\n struct RLPItem {\\n uint256 length;\\n uint256 ptr;\\n }\\n \\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n \\n /**\\n * Converts bytes to a reference to memory position and length.\\n * @param _in Input bytes to convert.\\n * @return Output memory reference.\\n */\\n function toRLPItem(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem memory\\n )\\n {\\n uint256 ptr;\\n assembly {\\n ptr := add(_in, 32)\\n }\\n\\n return RLPItem({\\n length: _in.length,\\n ptr: ptr\\n });\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n (\\n uint256 listOffset,\\n ,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.LIST_ITEM,\\n \\\"Invalid RLP list value.\\\"\\n );\\n\\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\\n // writing to the length. Since we can't know the number of RLP items without looping over\\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\\n // simply set a reasonable maximum list length and decrease the size before we finish.\\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\\n\\n uint256 itemCount = 0;\\n uint256 offset = listOffset;\\n while (offset < _in.length) {\\n require(\\n itemCount < MAX_LIST_LENGTH,\\n \\\"Provided RLP list exceeds max list length.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n ) = _decodeLength(RLPItem({\\n length: _in.length - offset,\\n ptr: _in.ptr + offset\\n }));\\n\\n out[itemCount] = RLPItem({\\n length: itemLength + itemOffset,\\n ptr: _in.ptr + offset\\n });\\n\\n itemCount += 1;\\n offset += itemOffset + itemLength;\\n }\\n\\n // Decrease the array size to match the actual item count.\\n assembly {\\n mstore(out, itemCount)\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n return readList(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes value.\\\"\\n );\\n\\n return _copy(_in.ptr, itemOffset, itemLength);\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return readBytes(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return string(readBytes(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return readString(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n require(\\n _in.length <= 33,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr + itemOffset;\\n bytes32 out;\\n assembly {\\n out := mload(ptr)\\n\\n // Shift the bytes over to match the item size.\\n if lt(itemLength, 32) {\\n out := div(out, exp(256, sub(32, itemLength)))\\n }\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return readBytes32(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return uint256(readBytes32(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return readUint256(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n require(\\n _in.length == 1,\\n \\\"Invalid RLP boolean value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 out;\\n assembly {\\n out := byte(0, mload(ptr))\\n }\\n\\n require(\\n out == 0 || out == 1,\\n \\\"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\\\"\\n );\\n\\n return out != 0;\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return readBool(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n if (_in.length == 1) {\\n return address(0);\\n }\\n\\n require(\\n _in.length == 21,\\n \\\"Invalid RLP address value.\\\"\\n );\\n\\n return address(readUint256(_in));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return readAddress(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads the raw bytes of an RLP item.\\n * @param _in RLP item to read.\\n * @return Raw RLP bytes.\\n */\\n function readRawBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in);\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Decodes the length of an RLP item.\\n * @param _in RLP item to decode.\\n * @return Offset of the encoded data.\\n * @return Length of the encoded data.\\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\\n */\\n function _decodeLength(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n uint256,\\n uint256,\\n RLPItemType\\n )\\n {\\n require(\\n _in.length > 0,\\n \\\"RLP item cannot be null.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 prefix;\\n assembly {\\n prefix := byte(0, mload(ptr))\\n }\\n\\n if (prefix <= 0x7f) {\\n // Single byte.\\n\\n return (0, 1, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xb7) {\\n // Short string.\\n\\n uint256 strLen = prefix - 0x80;\\n \\n require(\\n _in.length > strLen,\\n \\\"Invalid RLP short string.\\\"\\n );\\n\\n return (1, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xbf) {\\n // Long string.\\n uint256 lenOfStrLen = prefix - 0xb7;\\n\\n require(\\n _in.length > lenOfStrLen,\\n \\\"Invalid RLP long string length.\\\"\\n );\\n\\n uint256 strLen;\\n assembly {\\n // Pick out the string length.\\n strLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfStrLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfStrLen + strLen,\\n \\\"Invalid RLP long string.\\\"\\n );\\n\\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xf7) {\\n // Short list.\\n uint256 listLen = prefix - 0xc0;\\n\\n require(\\n _in.length > listLen,\\n \\\"Invalid RLP short list.\\\"\\n );\\n\\n return (1, listLen, RLPItemType.LIST_ITEM);\\n } else {\\n // Long list.\\n uint256 lenOfListLen = prefix - 0xf7;\\n\\n require(\\n _in.length > lenOfListLen,\\n \\\"Invalid RLP long list length.\\\"\\n );\\n\\n uint256 listLen;\\n assembly {\\n // Pick out the list length.\\n listLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfListLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfListLen + listLen,\\n \\\"Invalid RLP long list.\\\"\\n );\\n\\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\\n }\\n }\\n\\n /**\\n * Copies the bytes from a memory location.\\n * @param _src Pointer to the location to read from.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Copied bytes.\\n */\\n function _copy(\\n uint256 _src,\\n uint256 _offset,\\n uint256 _length\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out = new bytes(_length);\\n if (out.length == 0) {\\n return out;\\n }\\n\\n uint256 src = _src + _offset;\\n uint256 dest;\\n assembly {\\n dest := add(out, 32)\\n }\\n\\n // Copy over as many complete words as we can.\\n for (uint256 i = 0; i < _length / 32; i++) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n\\n src += 32;\\n dest += 32;\\n }\\n\\n // Pick out the remaining bytes.\\n uint256 mask = 256 ** (32 - (_length % 32)) - 1;\\n assembly {\\n mstore(\\n dest,\\n or(\\n and(mload(src), not(mask)),\\n and(mload(dest), mask)\\n )\\n )\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Copies an RLP item into bytes.\\n * @param _in RLP item to copy.\\n * @return Copied bytes.\\n */\\n function _copy(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in.ptr, 0, _in.length);\\n }\\n}\\n\",\"keccak256\":\"0xbdb8fae0ca2483b4cc07607a5070fc25e33c54b4e4462b99e7c0b13aac48a09b\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPWriter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\n\\n/**\\n * @title Lib_RLPWriter\\n * @author Bakaoh (with modifications)\\n */\\nlibrary Lib_RLPWriter {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * RLP encodes a byte string.\\n * @param _in The byte string to encode.\\n * @return _out The RLP encoded string in bytes.\\n */\\n function writeBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n bytes memory encoded;\\n\\n if (_in.length == 1 && uint8(_in[0]) < 128) {\\n encoded = _in;\\n } else {\\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * RLP encodes a list of RLP encoded byte byte strings.\\n * @param _in The list of RLP encoded byte strings.\\n * @return _out The RLP encoded list of items in bytes.\\n */\\n function writeList(\\n bytes[] memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n bytes memory list = _flatten(_in);\\n return abi.encodePacked(_writeLength(list.length, 192), list);\\n }\\n\\n /**\\n * RLP encodes a string.\\n * @param _in The string to encode.\\n * @return _out The RLP encoded string in bytes.\\n */\\n function writeString(\\n string memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(bytes(_in));\\n }\\n\\n /**\\n * RLP encodes an address.\\n * @param _in The address to encode.\\n * @return _out The RLP encoded address in bytes.\\n */\\n function writeAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a uint.\\n * @param _in The uint256 to encode.\\n * @return _out The RLP encoded uint256 in bytes.\\n */\\n function writeUint(\\n uint256 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(_toBinary(_in));\\n }\\n\\n /**\\n * RLP encodes a bool.\\n * @param _in The bool to encode.\\n * @return _out The RLP encoded bool in bytes.\\n */\\n function writeBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n bytes memory encoded = new bytes(1);\\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\\n return encoded;\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\\n * @param _len The length of the string or the payload.\\n * @param _offset 128 if item is string, 192 if item is list.\\n * @return _encoded RLP encoded bytes.\\n */\\n function _writeLength(\\n uint256 _len,\\n uint256 _offset\\n )\\n private\\n pure\\n returns (\\n bytes memory _encoded\\n )\\n {\\n bytes memory encoded;\\n\\n if (_len < 56) {\\n encoded = new bytes(1);\\n encoded[0] = byte(uint8(_len) + uint8(_offset));\\n } else {\\n uint256 lenLen;\\n uint256 i = 1;\\n while (_len / i != 0) {\\n lenLen++;\\n i *= 256;\\n }\\n\\n encoded = new bytes(lenLen + 1);\\n encoded[0] = byte(uint8(lenLen) + uint8(_offset) + 55);\\n for(i = 1; i <= lenLen; i++) {\\n encoded[i] = byte(uint8((_len / (256**(lenLen-i))) % 256));\\n }\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * Encode integer in big endian binary form with no leading zeroes.\\n * @notice TODO: This should be optimized with assembly to save gas costs.\\n * @param _x The integer to encode.\\n * @return _binary RLP encoded bytes.\\n */\\n function _toBinary(\\n uint256 _x\\n )\\n private\\n pure\\n returns (\\n bytes memory _binary\\n )\\n {\\n bytes memory b = abi.encodePacked(_x);\\n\\n uint256 i = 0;\\n for (; i < 32; i++) {\\n if (b[i] != 0) {\\n break;\\n }\\n }\\n\\n bytes memory res = new bytes(32 - i);\\n for (uint256 j = 0; j < res.length; j++) {\\n res[j] = b[i++];\\n }\\n\\n return res;\\n }\\n\\n /**\\n * Copies a piece of memory to another location.\\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\\n * @param _dest Destination location.\\n * @param _src Source location.\\n * @param _len Length of memory to copy.\\n */\\n function _memcpy(\\n uint256 _dest,\\n uint256 _src,\\n uint256 _len\\n )\\n private\\n pure\\n {\\n uint256 dest = _dest;\\n uint256 src = _src;\\n uint256 len = _len;\\n\\n for(; len >= 32; len -= 32) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n dest += 32;\\n src += 32;\\n }\\n\\n uint256 mask = 256 ** (32 - len) - 1;\\n assembly {\\n let srcpart := and(mload(src), not(mask))\\n let destpart := and(mload(dest), mask)\\n mstore(dest, or(destpart, srcpart))\\n }\\n }\\n\\n /**\\n * Flattens a list of byte strings into one byte string.\\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\\n * @param _list List of byte strings to flatten.\\n * @return _flattened The flattened byte string.\\n */\\n function _flatten(\\n bytes[] memory _list\\n )\\n private\\n pure\\n returns (\\n bytes memory _flattened\\n )\\n {\\n if (_list.length == 0) {\\n return new bytes(0);\\n }\\n\\n uint256 len;\\n uint256 i = 0;\\n for (; i < _list.length; i++) {\\n len += _list[i].length;\\n }\\n\\n bytes memory flattened = new bytes(len);\\n uint256 flattenedPtr;\\n assembly { flattenedPtr := add(flattened, 0x20) }\\n\\n for(i = 0; i < _list.length; i++) {\\n bytes memory item = _list[i];\\n\\n uint256 listPtr;\\n assembly { listPtr := add(item, 0x20)}\\n\\n _memcpy(flattenedPtr, listPtr, item.length);\\n flattenedPtr += _list[i].length;\\n }\\n\\n return flattened;\\n }\\n}\",\"keccak256\":\"0xbcb24619c1758cb0d9f3fe5c79495950045a9087046a02b9ce01df46ae09ae5b\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_Bytes32Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_Byte32Utils\\n */\\nlibrary Lib_Bytes32Utils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \\\"true.\\\"\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as a boolean.\\n */\\n function toBool(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return _in != 0;\\n }\\n\\n /**\\n * Converts a boolean to a bytes32 value.\\n * @param _in Input boolean value.\\n * @return Boolean as a bytes32.\\n */\\n function fromBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in ? 1 : 0));\\n }\\n\\n /**\\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as an address.\\n */\\n function toAddress(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return address(uint160(uint256(_in)));\\n }\\n\\n /**\\n * Converts an address to a bytes32.\\n * @param _in Input address value.\\n * @return Address as a bytes32.\\n */\\n function fromAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in));\\n }\\n\\n /**\\n * Removes the leading zeros from a bytes32 value and returns a new (smaller) bytes value.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 without any leading zeros.\\n */\\n function removeLeadingZeros(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out;\\n\\n assembly {\\n // Figure out how many leading zero bytes to remove.\\n let shift := 0\\n for { let i := 0 } and(lt(i, 32), eq(byte(i, _in), 0)) { i := add(i, 1) } {\\n shift := add(shift, 1)\\n }\\n\\n // Reserve some space for our output and fix the free memory pointer.\\n out := mload(0x40)\\n mstore(0x40, add(out, 0x40))\\n\\n // Shift the value and store it into the output bytes.\\n mstore(add(out, 0x20), shl(mul(shift, 8), _in))\\n\\n // Store the new size (with leading zero bytes removed) in the output byte size.\\n mstore(out, sub(32, shift))\\n }\\n\\n return out;\\n }\\n}\\n\",\"keccak256\":\"0xfa2def593e3fc56a31852c3744aefdaa93cec74e721bfcfeb1e5d166c7c60b64\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_BytesUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_BytesUtils\\n */\\nlibrary Lib_BytesUtils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_start + _length >= _start, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n if (_bytes.length - _start == 0) {\\n return bytes('');\\n }\\n\\n return slice(_bytes, _start, _bytes.length - _start);\\n }\\n\\n function toBytes32PadLeft(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes32)\\n {\\n bytes32 ret;\\n uint256 len = _bytes.length <= 32 ? _bytes.length : 32;\\n assembly {\\n ret := shr(mul(sub(32, len), 8), mload(add(_bytes, 32)))\\n }\\n return ret;\\n }\\n\\n function toBytes32(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes32)\\n {\\n if (_bytes.length < 32) {\\n bytes32 ret;\\n assembly {\\n ret := mload(add(_bytes, 32))\\n }\\n return ret;\\n }\\n\\n return abi.decode(_bytes,(bytes32)); // will truncate if input length > 32 bytes\\n }\\n\\n function toUint256(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (uint256)\\n {\\n return uint256(toBytes32(_bytes));\\n }\\n\\n function toUint24(bytes memory _bytes, uint256 _start) internal pure returns (uint24) {\\n require(_start + 3 >= _start, \\\"toUint24_overflow\\\");\\n require(_bytes.length >= _start + 3 , \\\"toUint24_outOfBounds\\\");\\n uint24 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x3), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toUint8(bytes memory _bytes, uint256 _start) internal pure returns (uint8) {\\n require(_start + 1 >= _start, \\\"toUint8_overflow\\\");\\n require(_bytes.length >= _start + 1 , \\\"toUint8_outOfBounds\\\");\\n uint8 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x1), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toAddress(bytes memory _bytes, uint256 _start) internal pure returns (address) {\\n require(_start + 20 >= _start, \\\"toAddress_overflow\\\");\\n require(_bytes.length >= _start + 20, \\\"toAddress_outOfBounds\\\");\\n address tempAddress;\\n\\n assembly {\\n tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000)\\n }\\n\\n return tempAddress;\\n }\\n\\n function toNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n bytes memory nibbles = new bytes(_bytes.length * 2);\\n\\n for (uint256 i = 0; i < _bytes.length; i++) {\\n nibbles[i * 2] = _bytes[i] >> 4;\\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\\n }\\n\\n return nibbles;\\n }\\n\\n function fromNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n bytes memory ret = new bytes(_bytes.length / 2);\\n\\n for (uint256 i = 0; i < ret.length; i++) {\\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\\n }\\n\\n return ret;\\n }\\n\\n function equal(\\n bytes memory _bytes,\\n bytes memory _other\\n )\\n internal\\n pure\\n returns (bool)\\n {\\n return keccak256(_bytes) == keccak256(_other);\\n }\\n}\\n\",\"keccak256\":\"0x0adf22e1b22ba09911e859f64cb3b484e992be4f9fd3b09088e6225bf8d06ce0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_ErrorUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/**\\n * @title Lib_ErrorUtils\\n */\\nlibrary Lib_ErrorUtils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Encodes an error string into raw solidity-style revert data.\\n * (i.e. ascii bytes, prefixed with bytes4(keccak(\\\"Error(string))\\\"))\\n * Ref: https://docs.soliditylang.org/en/v0.8.2/control-structures.html?highlight=Error(string)#panic-via-assert-and-error-via-require\\n * @param _reason Reason for the reversion.\\n * @return Standard solidity revert data for the given reason.\\n */\\n function encodeRevertString(\\n string memory _reason\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return abi.encodeWithSignature(\\n \\\"Error(string)\\\",\\n _reason\\n );\\n }\\n}\\n\",\"keccak256\":\"0xfc64ec4a81fb50865b502a0004ed154e8598e1a313db77303fc95e41f536e6b7\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_ErrorUtils } from \\\"../utils/Lib_ErrorUtils.sol\\\";\\n\\n/**\\n * @title Lib_SafeExecutionManagerWrapper\\n * @dev The Safe Execution Manager Wrapper provides functions which facilitate writing OVM safe \\n * code using the standard solidity compiler, by routing all its operations through the Execution \\n * Manager.\\n * \\n * Compiler used: solc\\n * Runtime target: OVM\\n */\\nlibrary Lib_SafeExecutionManagerWrapper {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Performs a safe ovmCALL.\\n * @param _gasLimit Gas limit for the call.\\n * @param _target Address to call.\\n * @param _calldata Data to send to the call.\\n * @return _success Whether or not the call reverted.\\n * @return _returndata Data returned by the call.\\n */\\n function safeCALL(\\n uint256 _gasLimit,\\n address _target,\\n bytes memory _calldata\\n )\\n internal\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCALL(uint256,address,bytes)\\\",\\n _gasLimit,\\n _target,\\n _calldata\\n )\\n );\\n\\n return abi.decode(returndata, (bool, bytes));\\n }\\n\\n /**\\n * Performs a safe ovmDELEGATECALL.\\n * @param _gasLimit Gas limit for the call.\\n * @param _target Address to call.\\n * @param _calldata Data to send to the call.\\n * @return _success Whether or not the call reverted.\\n * @return _returndata Data returned by the call.\\n */\\n function safeDELEGATECALL(\\n uint256 _gasLimit,\\n address _target,\\n bytes memory _calldata\\n )\\n internal\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmDELEGATECALL(uint256,address,bytes)\\\",\\n _gasLimit,\\n _target,\\n _calldata\\n )\\n );\\n\\n return abi.decode(returndata, (bool, bytes));\\n }\\n\\n /**\\n * Performs a safe ovmCREATE call.\\n * @param _gasLimit Gas limit for the creation.\\n * @param _bytecode Code for the new contract.\\n * @return _contract Address of the created contract.\\n */\\n function safeCREATE(\\n uint256 _gasLimit,\\n bytes memory _bytecode\\n )\\n internal\\n returns (\\n address,\\n bytes memory\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n _gasLimit,\\n abi.encodeWithSignature(\\n \\\"ovmCREATE(bytes)\\\",\\n _bytecode\\n )\\n );\\n\\n return abi.decode(returndata, (address, bytes));\\n }\\n\\n /**\\n * Performs a safe ovmEXTCODESIZE call.\\n * @param _contract Address of the contract to query the size of.\\n * @return _EXTCODESIZE Size of the requested contract in bytes.\\n */\\n function safeEXTCODESIZE(\\n address _contract\\n )\\n internal\\n returns (\\n uint256 _EXTCODESIZE\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmEXTCODESIZE(address)\\\",\\n _contract\\n )\\n );\\n\\n return abi.decode(returndata, (uint256));\\n }\\n\\n /**\\n * Performs a safe ovmCHAINID call.\\n * @return _CHAINID Result of calling ovmCHAINID.\\n */\\n function safeCHAINID()\\n internal\\n returns (\\n uint256 _CHAINID\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCHAINID()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (uint256));\\n }\\n\\n /**\\n * Performs a safe ovmCALLER call.\\n * @return _CALLER Result of calling ovmCALLER.\\n */\\n function safeCALLER()\\n internal\\n returns (\\n address _CALLER\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCALLER()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (address));\\n }\\n\\n /**\\n * Performs a safe ovmADDRESS call.\\n * @return _ADDRESS Result of calling ovmADDRESS.\\n */\\n function safeADDRESS()\\n internal\\n returns (\\n address _ADDRESS\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmADDRESS()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (address));\\n }\\n\\n /**\\n * Performs a safe ovmGETNONCE call.\\n * @return _nonce Result of calling ovmGETNONCE.\\n */\\n function safeGETNONCE()\\n internal\\n returns (\\n uint256 _nonce\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmGETNONCE()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (uint256));\\n }\\n\\n /**\\n * Performs a safe ovmINCREMENTNONCE call.\\n */\\n function safeINCREMENTNONCE()\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmINCREMENTNONCE()\\\"\\n )\\n );\\n }\\n\\n /**\\n * Performs a safe ovmCREATEEOA call.\\n * @param _messageHash Message hash which was signed by EOA\\n * @param _v v value of signature (0 or 1)\\n * @param _r r value of signature\\n * @param _s s value of signature\\n */\\n function safeCREATEEOA(\\n bytes32 _messageHash,\\n uint8 _v,\\n bytes32 _r,\\n bytes32 _s\\n )\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCREATEEOA(bytes32,uint8,bytes32,bytes32)\\\",\\n _messageHash,\\n _v,\\n _r,\\n _s\\n )\\n );\\n }\\n\\n /**\\n * Performs a safe REVERT.\\n * @param _reason String revert reason to pass along with the REVERT.\\n */\\n function safeREVERT(\\n string memory _reason\\n )\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmREVERT(bytes)\\\",\\n Lib_ErrorUtils.encodeRevertString(\\n _reason\\n )\\n )\\n );\\n }\\n\\n /**\\n * Performs a safe \\\"require\\\".\\n * @param _condition Boolean condition that must be true or will revert.\\n * @param _reason String revert reason to pass along with the REVERT.\\n */\\n function safeREQUIRE(\\n bool _condition,\\n string memory _reason\\n )\\n internal\\n {\\n if (!_condition) {\\n safeREVERT(\\n _reason\\n );\\n }\\n }\\n\\n /**\\n * Performs a safe ovmSLOAD call.\\n */\\n function safeSLOAD(\\n bytes32 _key\\n )\\n internal\\n returns (\\n bytes32\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmSLOAD(bytes32)\\\",\\n _key\\n )\\n );\\n\\n return abi.decode(returndata, (bytes32));\\n }\\n\\n /**\\n * Performs a safe ovmSSTORE call.\\n */\\n function safeSSTORE(\\n bytes32 _key,\\n bytes32 _value\\n )\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmSSTORE(bytes32,bytes32)\\\",\\n _key,\\n _value\\n )\\n );\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Performs an ovm interaction and the necessary safety checks.\\n * @param _gasLimit Gas limit for the interaction.\\n * @param _calldata Data to send to the OVM_ExecutionManager (encoded with sighash).\\n * @return _returndata Data sent back by the OVM_ExecutionManager.\\n */\\n function _safeExecutionManagerInteraction(\\n uint256 _gasLimit,\\n bytes memory _calldata\\n )\\n private\\n returns (\\n bytes memory _returndata\\n )\\n {\\n address ovmExecutionManager = msg.sender;\\n (\\n bool success,\\n bytes memory returndata\\n ) = ovmExecutionManager.call{gas: _gasLimit}(_calldata);\\n\\n if (success == false) {\\n assembly {\\n revert(add(returndata, 0x20), mload(returndata))\\n }\\n } else if (returndata.length == 1) {\\n assembly {\\n return(0, 1)\\n }\\n } else {\\n return returndata;\\n }\\n }\\n\\n function _safeExecutionManagerInteraction(\\n bytes memory _calldata\\n )\\n private\\n returns (\\n bytes memory _returndata\\n )\\n {\\n return _safeExecutionManagerInteraction(\\n gasleft(),\\n _calldata\\n );\\n }\\n}\\n\",\"keccak256\":\"0x41e146e7912af794a17cd43c5a276674be956bfa8f3ca5b451bcb82d81e6f492\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x608060405234801561001057600080fd5b5060405161181838038061181883398101604081905261002f91610054565b600080546001600160a01b0319166001600160a01b0392909216919091179055610082565b600060208284031215610065578081fd5b81516001600160a01b038116811461007b578182fd5b9392505050565b611787806100916000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c8063299ca4781461005c578063461a44781461007a57806398d8867d1461008d578063a286ba1c146100a2578063b48ec820146100b5575b600080fd5b6100646100c8565b6040516100719190611306565b60405180910390f35b610064610088366004611101565b6100d7565b6100a061009b366004611029565b6101b5565b005b6100a06100b0366004610f64565b6104f4565b6100646100c3366004610f43565b6108bb565b6000546001600160a01b031681565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b8381101561013757818101518382015260200161011f565b50505050905090810190601f1680156101645780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561018157600080fd5b505afa158015610195573d6000803e3d6000fd5b505050506040513d60208110156101ab57600080fd5b505190505b919050565b866101bf8561090a565b60005a905060006101cf8861090a565b90506101db8b82610923565b156101e65750610432565b60006102216040518060400160405280601881526020017727ab26afa9ba30ba32a1b7b6b6b4ba36b2b73a21b430b4b760411b8152506100d7565b905060006102636040518060400160405280601d81526020017f4f564d5f43616e6f6e6963616c5472616e73616374696f6e436861696e0000008152506100d7565b9050816001600160a01b0316634d69ee578e8e8e6040518463ffffffff1660e01b81526004016102959392919061135f565b60206040518083038186803b1580156102ad57600080fd5b505afa1580156102c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102e59190610f0f565b61030a5760405162461bcd60e51b8152600401610301906115e7565b60405180910390fd5b6040516326f2b4e760e11b81526001600160a01b03821690634de569ce9061033c908d908d908d908d90600401611641565b60206040518083038186803b15801561035457600080fd5b505afa158015610368573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061038c9190610f0f565b6103a85760405162461bcd60e51b815260040161030190611499565b86600001518860600151018b600001518d6060015101600101146103de5760405162461bcd60e51b815260040161030190611525565b6103ed8d848d60000151610942565b7f41a48bde2468fac6f670f39b66d7b91f311053e1f28eab9d75056546e6eaac958d8c6000015185336040516104269493929190611394565b60405180910390a15050505b60005a820390506104696040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506100d7565b6001600160a01b0316631e16e92f858533856040518563ffffffff1660e01b815260040180858152602001848152602001836001600160a01b03168152602001828152602001945050505050600060405180830381600087803b1580156104cf57600080fd5b505af11580156104e3573d6000803e3d6000fd5b505050505050505050505050505050565b868460005a905060006105078b896108bb565b905060006105446040518060400160405280601881526020017727ab26afa9ba30ba32a1b7b6b6b4ba36b2b73a21b430b4b760411b8152506100d7565b9050816001600160a01b031663b2fa1c9e6040518163ffffffff1660e01b815260040160206040518083038186803b15801561057f57600080fd5b505afa158015610593573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b79190610f0f565b15156001146105d85760405162461bcd60e51b8152600401610301906113b8565b89600001518b606001510160010186600001518860600151011461060e5760405162461bcd60e51b81526004016103019061141f565b604051634d69ee5760e01b81526001600160a01b03821690634d69ee579061063e908f908f908f9060040161135f565b60206040518083038186803b15801561065657600080fd5b505afa15801561066a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061068e9190610f0f565b6106aa5760405162461bcd60e51b8152600401610301906115e7565b604051634d69ee5760e01b81526001600160a01b03821690634d69ee57906106da908b908b908b9060040161135f565b60206040518083038186803b1580156106f257600080fd5b505afa158015610706573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061072a9190610f0f565b6107465760405162461bcd60e51b8152600401610301906114dd565b816001600160a01b031663c1c618b86040518163ffffffff1660e01b815260040160206040518083038186803b15801561077f57600080fd5b505afa158015610793573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107b79190610f2b565b8814156107d65760405162461bcd60e51b815260040161030190611597565b6107e0878d610a6d565b6000600160008e8c6040516020016107f9929190611289565b60405160208183030381529060405280519060200120815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b031602179055507f1e5fff3c23daf51ea67aaa3bbc738bcedaa98be5a5503f0e63a336a004b075b18c8b600001518b3360405161087a9493929190611394565b60405180910390a1505060005a820390506104696040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506100d7565b60006001600084846040516020016108d4929190611289565b60408051808303601f19018152918152815160209283012083529082019290925201600020546001600160a01b03169392505050565b600061091582610bc7565b805190602001209050919050565b60008061093084846108bb565b6001600160a01b031614159392505050565b6109806040518060400160405280601c81526020017f4f564d5f53746174655472616e736974696f6e6572466163746f7279000000008152506100d7565b600054604051631168a38160e11b81526001600160a01b03928316926322d14702926109b79291169085908890889060040161131a565b602060405180830381600087803b1580156109d157600080fd5b505af11580156109e5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a0991906110e5565b600160008585604051602001610a20929190611289565b60405160208183030381529060405280519060200120815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b03160217905550505050565b6000610aa86040518060400160405280601881526020017727ab26afa9ba30ba32a1b7b6b6b4ba36b2b73a21b430b4b760411b8152506100d7565b90506000610adc6040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506100d7565b604051632e38626b60e21b81529091506001600160a01b0383169063b8e189ac90610b0b90879060040161162e565b600060405180830381600087803b158015610b2557600080fd5b505af1158015610b39573d6000803e3d6000fd5b505050506000808560800151806020019051810190610b58919061114f565b60405163abfbbe1360e01b815291935091506001600160a01b0384169063abfbbe1390610b8d90889085908790600401611340565b600060405180830381600087803b158015610ba757600080fd5b505af1158015610bbb573d6000803e3d6000fd5b50505050505050505050565b6060816000015182602001518360400151846060015185608001518660a001518760c00151604051602001610c029796959493929190611297565b6040516020818303038152906040529050919050565b600067ffffffffffffffff831115610c2c57fe5b610c3f601f8401601f1916602001611700565b9050828152838383011115610c5357600080fd5b828260208301376000602084830101529392505050565b80356101b081611754565b600082601f830112610c85578081fd5b610c9483833560208501610c18565b9392505050565b8035600281106101b057600080fd5b600060a08284031215610cbb578081fd5b60405160a0810167ffffffffffffffff8282108183111715610cd957fe5b81604052829350843583526020850135602084015260408501356040840152606085013560608401526080850135915080821115610d1657600080fd5b50610d2385828601610c75565b6080830152505092915050565b600060408284031215610d41578081fd5b6040516040810167ffffffffffffffff8282108183111715610d5f57fe5b8160405282935084358352602091508185013581811115610d7f57600080fd5b8501601f81018713610d9057600080fd5b803582811115610d9c57fe5b8381029250610dac848401611700565b8181528481019083860185850187018b1015610dc757600080fd5b600095505b83861015610dea578035835260019590950194918601918601610dcc565b5080868801525050505050505092915050565b600060a08284031215610e0e578081fd5b60405160a0810167ffffffffffffffff8282108183111715610e2c57fe5b8160405282935084359150610e408261176c565b8183526020850135602084015260408501356040840152606085013560608401526080850135915080821115610d1657600080fd5b600060e08284031215610e86578081fd5b610e9060e0611700565b90508135815260208201356020820152610eac60408301610c9b565b6040820152610ebd60608301610c6a565b6060820152610ece60808301610c6a565b608082015260a082013560a082015260c082013567ffffffffffffffff811115610ef757600080fd5b610f0384828501610c75565b60c08301525092915050565b600060208284031215610f20578081fd5b8151610c948161176c565b600060208284031215610f3c578081fd5b5051919050565b60008060408385031215610f55578081fd5b50508035926020909101359150565b600080600080600080600060e0888a031215610f7e578283fd5b87359650602088013567ffffffffffffffff80821115610f9c578485fd5b610fa88b838c01610caa565b975060408a0135915080821115610fbd578485fd5b610fc98b838c01610d30565b965060608a0135955060808a0135945060a08a0135915080821115610fec578384fd5b610ff88b838c01610caa565b935060c08a013591508082111561100d578283fd5b5061101a8a828b01610d30565b91505092959891949750929550565b600080600080600080600060e0888a031215611043578081fd5b87359650602088013567ffffffffffffffff80821115611061578283fd5b61106d8b838c01610caa565b975060408a0135915080821115611082578283fd5b61108e8b838c01610d30565b965060608a01359150808211156110a3578283fd5b6110af8b838c01610e75565b955060808a01359150808211156110c4578283fd5b6110d08b838c01610dfd565b945060a08a0135915080821115610fec578283fd5b6000602082840312156110f6578081fd5b8151610c9481611754565b600060208284031215611112578081fd5b813567ffffffffffffffff811115611128578182fd5b8201601f81018413611138578182fd5b61114784823560208401610c18565b949350505050565b60008060408385031215611161578182fd5b82519150602083015161117381611754565b809150509250929050565b6001600160a01b03169052565b600081518084526111a3816020860160208601611724565b601f01601f19169290920160200192915050565b600081518352602082015160208401526040820151604084015260608201516060840152608082015160a0608085015261114760a085018261118b565b6000604083018251845260208084015160408287015282815180855260608801915083830194508592505b8083101561123f578451825293830193600192909201919083019061121f565b509695505050505050565b6000815115158352602082015160208401526040820151604084015260608201516060840152608082015160a0608085015261114760a085018261118b565b918252602082015260400190565b6000888252876020830152600287106112ac57fe5b8660f81b60408301526bffffffffffffffffffffffff19808760601b166041840152808660601b1660558401525083606983015282516112f3816089850160208701611724565b9190910160890198975050505050505050565b6001600160a01b0391909116815260200190565b6001600160a01b0394909416845260208401929092526040830152606082015260800190565b9283526001600160a01b03919091166020830152604082015260600190565b60008482526060602083015261137860608301856111b7565b828103604084015261138a81856111f4565b9695505050505050565b938452602084019290925260408301526001600160a01b0316606082015260800190565b60208082526041908201527f5374617465207472616e736974696f6e2070726f63657373206d75737420626560408201527f20636f6d706c65746564207072696f7220746f2066696e616c697a6174696f6e6060820152601760f91b608082015260a00190565b60208082526054908201527f506f73742d737461746520726f6f7420676c6f62616c20696e646578206d757360408201527f7420657175616c20746f207468652070726520737461746520726f6f7420676c60608201527337b130b61034b73232bc1038363ab99037b7329760611b608082015260a00190565b60208082526024908201527f496e76616c6964207472616e73616374696f6e20696e636c7573696f6e20707260408201526337b7b31760e11b606082015260800190565b60208082526028908201527f496e76616c696420706f73742d737461746520726f6f7420696e636c7573696f6040820152673710383937b7b31760c11b606082015260800190565b6020808252604c908201527f5072652d737461746520726f6f7420676c6f62616c20696e646578206d75737460408201527f20657175616c20746f20746865207472616e73616374696f6e20726f6f74206760608201526b3637b130b61034b73232bc1760a11b608082015260a00190565b60208082526030908201527f5374617465207472616e736974696f6e20686173206e6f74206265656e20707260408201526f37bb32b710333930bab23ab632b73a1760811b606082015260800190565b60208082526027908201527f496e76616c6964207072652d737461746520726f6f7420696e636c7573696f6e60408201526610383937b7b31760c91b606082015260800190565b600060208252610c9460208301846111b7565b60006080825285516080830152602086015160a083015260408601516002811061166757fe5b60c083015260608601516001600160a01b031660e0830152608086015161169261010084018261117e565b5060a086015161012083015260c086015160e06101408401526116b961016084018261118b565b905082810360208401526116cd818761124a565b905082810360408401526116e181866111b7565b905082810360608401526116f581856111f4565b979650505050505050565b60405181810167ffffffffffffffff8111828210171561171c57fe5b604052919050565b60005b8381101561173f578181015183820152602001611727565b8381111561174e576000848401525b50505050565b6001600160a01b038116811461176957600080fd5b50565b801515811461176957600080fdfea164736f6c6343000706000a", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100575760003560e01c8063299ca4781461005c578063461a44781461007a57806398d8867d1461008d578063a286ba1c146100a2578063b48ec820146100b5575b600080fd5b6100646100c8565b6040516100719190611306565b60405180910390f35b610064610088366004611101565b6100d7565b6100a061009b366004611029565b6101b5565b005b6100a06100b0366004610f64565b6104f4565b6100646100c3366004610f43565b6108bb565b6000546001600160a01b031681565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b8381101561013757818101518382015260200161011f565b50505050905090810190601f1680156101645780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561018157600080fd5b505afa158015610195573d6000803e3d6000fd5b505050506040513d60208110156101ab57600080fd5b505190505b919050565b866101bf8561090a565b60005a905060006101cf8861090a565b90506101db8b82610923565b156101e65750610432565b60006102216040518060400160405280601881526020017727ab26afa9ba30ba32a1b7b6b6b4ba36b2b73a21b430b4b760411b8152506100d7565b905060006102636040518060400160405280601d81526020017f4f564d5f43616e6f6e6963616c5472616e73616374696f6e436861696e0000008152506100d7565b9050816001600160a01b0316634d69ee578e8e8e6040518463ffffffff1660e01b81526004016102959392919061135f565b60206040518083038186803b1580156102ad57600080fd5b505afa1580156102c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102e59190610f0f565b61030a5760405162461bcd60e51b8152600401610301906115e7565b60405180910390fd5b6040516326f2b4e760e11b81526001600160a01b03821690634de569ce9061033c908d908d908d908d90600401611641565b60206040518083038186803b15801561035457600080fd5b505afa158015610368573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061038c9190610f0f565b6103a85760405162461bcd60e51b815260040161030190611499565b86600001518860600151018b600001518d6060015101600101146103de5760405162461bcd60e51b815260040161030190611525565b6103ed8d848d60000151610942565b7f41a48bde2468fac6f670f39b66d7b91f311053e1f28eab9d75056546e6eaac958d8c6000015185336040516104269493929190611394565b60405180910390a15050505b60005a820390506104696040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506100d7565b6001600160a01b0316631e16e92f858533856040518563ffffffff1660e01b815260040180858152602001848152602001836001600160a01b03168152602001828152602001945050505050600060405180830381600087803b1580156104cf57600080fd5b505af11580156104e3573d6000803e3d6000fd5b505050505050505050505050505050565b868460005a905060006105078b896108bb565b905060006105446040518060400160405280601881526020017727ab26afa9ba30ba32a1b7b6b6b4ba36b2b73a21b430b4b760411b8152506100d7565b9050816001600160a01b031663b2fa1c9e6040518163ffffffff1660e01b815260040160206040518083038186803b15801561057f57600080fd5b505afa158015610593573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b79190610f0f565b15156001146105d85760405162461bcd60e51b8152600401610301906113b8565b89600001518b606001510160010186600001518860600151011461060e5760405162461bcd60e51b81526004016103019061141f565b604051634d69ee5760e01b81526001600160a01b03821690634d69ee579061063e908f908f908f9060040161135f565b60206040518083038186803b15801561065657600080fd5b505afa15801561066a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061068e9190610f0f565b6106aa5760405162461bcd60e51b8152600401610301906115e7565b604051634d69ee5760e01b81526001600160a01b03821690634d69ee57906106da908b908b908b9060040161135f565b60206040518083038186803b1580156106f257600080fd5b505afa158015610706573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061072a9190610f0f565b6107465760405162461bcd60e51b8152600401610301906114dd565b816001600160a01b031663c1c618b86040518163ffffffff1660e01b815260040160206040518083038186803b15801561077f57600080fd5b505afa158015610793573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107b79190610f2b565b8814156107d65760405162461bcd60e51b815260040161030190611597565b6107e0878d610a6d565b6000600160008e8c6040516020016107f9929190611289565b60405160208183030381529060405280519060200120815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b031602179055507f1e5fff3c23daf51ea67aaa3bbc738bcedaa98be5a5503f0e63a336a004b075b18c8b600001518b3360405161087a9493929190611394565b60405180910390a1505060005a820390506104696040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506100d7565b60006001600084846040516020016108d4929190611289565b60408051808303601f19018152918152815160209283012083529082019290925201600020546001600160a01b03169392505050565b600061091582610bc7565b805190602001209050919050565b60008061093084846108bb565b6001600160a01b031614159392505050565b6109806040518060400160405280601c81526020017f4f564d5f53746174655472616e736974696f6e6572466163746f7279000000008152506100d7565b600054604051631168a38160e11b81526001600160a01b03928316926322d14702926109b79291169085908890889060040161131a565b602060405180830381600087803b1580156109d157600080fd5b505af11580156109e5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a0991906110e5565b600160008585604051602001610a20929190611289565b60405160208183030381529060405280519060200120815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b03160217905550505050565b6000610aa86040518060400160405280601881526020017727ab26afa9ba30ba32a1b7b6b6b4ba36b2b73a21b430b4b760411b8152506100d7565b90506000610adc6040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506100d7565b604051632e38626b60e21b81529091506001600160a01b0383169063b8e189ac90610b0b90879060040161162e565b600060405180830381600087803b158015610b2557600080fd5b505af1158015610b39573d6000803e3d6000fd5b505050506000808560800151806020019051810190610b58919061114f565b60405163abfbbe1360e01b815291935091506001600160a01b0384169063abfbbe1390610b8d90889085908790600401611340565b600060405180830381600087803b158015610ba757600080fd5b505af1158015610bbb573d6000803e3d6000fd5b50505050505050505050565b6060816000015182602001518360400151846060015185608001518660a001518760c00151604051602001610c029796959493929190611297565b6040516020818303038152906040529050919050565b600067ffffffffffffffff831115610c2c57fe5b610c3f601f8401601f1916602001611700565b9050828152838383011115610c5357600080fd5b828260208301376000602084830101529392505050565b80356101b081611754565b600082601f830112610c85578081fd5b610c9483833560208501610c18565b9392505050565b8035600281106101b057600080fd5b600060a08284031215610cbb578081fd5b60405160a0810167ffffffffffffffff8282108183111715610cd957fe5b81604052829350843583526020850135602084015260408501356040840152606085013560608401526080850135915080821115610d1657600080fd5b50610d2385828601610c75565b6080830152505092915050565b600060408284031215610d41578081fd5b6040516040810167ffffffffffffffff8282108183111715610d5f57fe5b8160405282935084358352602091508185013581811115610d7f57600080fd5b8501601f81018713610d9057600080fd5b803582811115610d9c57fe5b8381029250610dac848401611700565b8181528481019083860185850187018b1015610dc757600080fd5b600095505b83861015610dea578035835260019590950194918601918601610dcc565b5080868801525050505050505092915050565b600060a08284031215610e0e578081fd5b60405160a0810167ffffffffffffffff8282108183111715610e2c57fe5b8160405282935084359150610e408261176c565b8183526020850135602084015260408501356040840152606085013560608401526080850135915080821115610d1657600080fd5b600060e08284031215610e86578081fd5b610e9060e0611700565b90508135815260208201356020820152610eac60408301610c9b565b6040820152610ebd60608301610c6a565b6060820152610ece60808301610c6a565b608082015260a082013560a082015260c082013567ffffffffffffffff811115610ef757600080fd5b610f0384828501610c75565b60c08301525092915050565b600060208284031215610f20578081fd5b8151610c948161176c565b600060208284031215610f3c578081fd5b5051919050565b60008060408385031215610f55578081fd5b50508035926020909101359150565b600080600080600080600060e0888a031215610f7e578283fd5b87359650602088013567ffffffffffffffff80821115610f9c578485fd5b610fa88b838c01610caa565b975060408a0135915080821115610fbd578485fd5b610fc98b838c01610d30565b965060608a0135955060808a0135945060a08a0135915080821115610fec578384fd5b610ff88b838c01610caa565b935060c08a013591508082111561100d578283fd5b5061101a8a828b01610d30565b91505092959891949750929550565b600080600080600080600060e0888a031215611043578081fd5b87359650602088013567ffffffffffffffff80821115611061578283fd5b61106d8b838c01610caa565b975060408a0135915080821115611082578283fd5b61108e8b838c01610d30565b965060608a01359150808211156110a3578283fd5b6110af8b838c01610e75565b955060808a01359150808211156110c4578283fd5b6110d08b838c01610dfd565b945060a08a0135915080821115610fec578283fd5b6000602082840312156110f6578081fd5b8151610c9481611754565b600060208284031215611112578081fd5b813567ffffffffffffffff811115611128578182fd5b8201601f81018413611138578182fd5b61114784823560208401610c18565b949350505050565b60008060408385031215611161578182fd5b82519150602083015161117381611754565b809150509250929050565b6001600160a01b03169052565b600081518084526111a3816020860160208601611724565b601f01601f19169290920160200192915050565b600081518352602082015160208401526040820151604084015260608201516060840152608082015160a0608085015261114760a085018261118b565b6000604083018251845260208084015160408287015282815180855260608801915083830194508592505b8083101561123f578451825293830193600192909201919083019061121f565b509695505050505050565b6000815115158352602082015160208401526040820151604084015260608201516060840152608082015160a0608085015261114760a085018261118b565b918252602082015260400190565b6000888252876020830152600287106112ac57fe5b8660f81b60408301526bffffffffffffffffffffffff19808760601b166041840152808660601b1660558401525083606983015282516112f3816089850160208701611724565b9190910160890198975050505050505050565b6001600160a01b0391909116815260200190565b6001600160a01b0394909416845260208401929092526040830152606082015260800190565b9283526001600160a01b03919091166020830152604082015260600190565b60008482526060602083015261137860608301856111b7565b828103604084015261138a81856111f4565b9695505050505050565b938452602084019290925260408301526001600160a01b0316606082015260800190565b60208082526041908201527f5374617465207472616e736974696f6e2070726f63657373206d75737420626560408201527f20636f6d706c65746564207072696f7220746f2066696e616c697a6174696f6e6060820152601760f91b608082015260a00190565b60208082526054908201527f506f73742d737461746520726f6f7420676c6f62616c20696e646578206d757360408201527f7420657175616c20746f207468652070726520737461746520726f6f7420676c60608201527337b130b61034b73232bc1038363ab99037b7329760611b608082015260a00190565b60208082526024908201527f496e76616c6964207472616e73616374696f6e20696e636c7573696f6e20707260408201526337b7b31760e11b606082015260800190565b60208082526028908201527f496e76616c696420706f73742d737461746520726f6f7420696e636c7573696f6040820152673710383937b7b31760c11b606082015260800190565b6020808252604c908201527f5072652d737461746520726f6f7420676c6f62616c20696e646578206d75737460408201527f20657175616c20746f20746865207472616e73616374696f6e20726f6f74206760608201526b3637b130b61034b73232bc1760a11b608082015260a00190565b60208082526030908201527f5374617465207472616e736974696f6e20686173206e6f74206265656e20707260408201526f37bb32b710333930bab23ab632b73a1760811b606082015260800190565b60208082526027908201527f496e76616c6964207072652d737461746520726f6f7420696e636c7573696f6e60408201526610383937b7b31760c91b606082015260800190565b600060208252610c9460208301846111b7565b60006080825285516080830152602086015160a083015260408601516002811061166757fe5b60c083015260608601516001600160a01b031660e0830152608086015161169261010084018261117e565b5060a086015161012083015260c086015160e06101408401526116b961016084018261118b565b905082810360208401526116cd818761124a565b905082810360408401526116e181866111b7565b905082810360608401526116f581856111f4565b979650505050505050565b60405181810167ffffffffffffffff8111828210171561171c57fe5b604052919050565b60005b8381101561173f578181015183820152602001611727565b8381111561174e576000848401525b50505050565b6001600160a01b038116811461176957600080fd5b50565b801515811461176957600080fdfea164736f6c6343000706000a", + "solcInputHash": "f2bdab652d5102f5f11e78dae866798d", + "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"_preStateRoot\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_preStateRootIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"_transactionHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_who\",\"type\":\"address\"}],\"name\":\"FraudProofFinalized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"_preStateRoot\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_preStateRootIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"_transactionHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_who\",\"type\":\"address\"}],\"name\":\"FraudProofInitialized\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_preStateRoot\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"_preStateRootBatchHeader\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"siblings\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct Lib_OVMCodec.ChainInclusionProof\",\"name\":\"_preStateRootProof\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"_txHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"_postStateRoot\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"_postStateRootBatchHeader\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"siblings\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct Lib_OVMCodec.ChainInclusionProof\",\"name\":\"_postStateRootProof\",\"type\":\"tuple\"}],\"name\":\"finalizeFraudVerification\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_preStateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"_txHash\",\"type\":\"bytes32\"}],\"name\":\"getStateTransitioner\",\"outputs\":[{\"internalType\":\"contract iOVM_StateTransitioner\",\"name\":\"_transitioner\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_preStateRoot\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"_preStateRootBatchHeader\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"siblings\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct Lib_OVMCodec.ChainInclusionProof\",\"name\":\"_preStateRootProof\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"enum Lib_OVMCodec.QueueOrigin\",\"name\":\"l1QueueOrigin\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"l1TxOrigin\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"entrypoint\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.Transaction\",\"name\":\"_transaction\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isSequenced\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"queueIndex\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"txData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.TransactionChainElement\",\"name\":\"_txChainElement\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"_transactionBatchHeader\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"siblings\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct Lib_OVMCodec.ChainInclusionProof\",\"name\":\"_transactionProof\",\"type\":\"tuple\"}],\"name\":\"initializeFraudVerification\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The Fraud Verifier contract coordinates the entire fraud proof verification process. If the fraud proof was successful it prunes any state batches from State Commitment Chain which were published after the fraudulent state root. Compiler used: solc Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\"}},\"finalizeFraudVerification(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes32,bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))\":{\"params\":{\"_postStateRoot\":\"State root after the fraudulent transaction.\",\"_postStateRootBatchHeader\":\"Batch header for the provided post-state root.\",\"_postStateRootProof\":\"Inclusion proof for the provided post-state root.\",\"_preStateRoot\":\"State root before the fraudulent transaction.\",\"_preStateRootBatchHeader\":\"Batch header for the provided pre-state root.\",\"_preStateRootProof\":\"Inclusion proof for the provided pre-state root.\",\"_txHash\":\"The transaction for the state root\"}},\"getStateTransitioner(bytes32,bytes32)\":{\"params\":{\"_preStateRoot\":\"State root to query a transitioner for.\"},\"returns\":{\"_transitioner\":\"Corresponding state transitioner contract.\"}},\"initializeFraudVerification(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),(uint256,uint256,uint8,address,address,uint256,bytes),(bool,uint256,uint256,uint256,bytes),(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))\":{\"params\":{\"_preStateRoot\":\"State root before the fraudulent transaction.\",\"_preStateRootBatchHeader\":\"Batch header for the provided pre-state root.\",\"_preStateRootProof\":\"Inclusion proof for the provided pre-state root.\",\"_transaction\":\"OVM transaction claimed to be fraudulent.\",\"_transactionBatchHeader\":\"Batch header for the provided transaction.\",\"_transactionProof\":\"Inclusion proof for the provided transaction.\",\"_txChainElement\":\"OVM transaction chain element.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}}},\"title\":\"OVM_FraudVerifier\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"finalizeFraudVerification(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes32,bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))\":{\"notice\":\"Finalizes the fraud verification process.\"},\"getStateTransitioner(bytes32,bytes32)\":{\"notice\":\"Retrieves the state transitioner for a given root.\"},\"initializeFraudVerification(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),(uint256,uint256,uint8,address,address,uint256,bytes),(bool,uint256,uint256,uint256,bytes),(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))\":{\"notice\":\"Begins the fraud verification process.\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/OVM/verification/OVM_FraudVerifier.sol\":\"OVM_FraudVerifier\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor () internal {\\n address msgSender = _msgSender();\\n _owner = msgSender;\\n emit OwnershipTransferred(address(0), msgSender);\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n emit OwnershipTransferred(_owner, address(0));\\n _owner = address(0);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n emit OwnershipTransferred(_owner, newOwner);\\n _owner = newOwner;\\n }\\n}\\n\",\"keccak256\":\"0x15e2d5bd4c28a88548074c54d220e8086f638a71ed07e6b3ba5a70066fcf458d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with GSN meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address payable) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes memory) {\\n this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x8d3cb350f04ff49cfb10aef08d87f19dcbaecc8027b0bed12f3275cd12f38cf0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/verification/Abs_FraudContributor.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\nimport { iOVM_BondManager } from \\\"../../iOVM/verification/iOVM_BondManager.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/// Minimal contract to be inherited by contracts consumed by users that provide\\n/// data for fraud proofs\\nabstract contract Abs_FraudContributor is Lib_AddressResolver {\\n /// Decorate your functions with this modifier to store how much total gas was\\n /// consumed by the sender, to reward users fairly\\n modifier contributesToFraudProof(bytes32 preStateRoot, bytes32 txHash) {\\n uint256 startGas = gasleft();\\n _;\\n uint256 gasSpent = startGas - gasleft();\\n iOVM_BondManager(resolve('OVM_BondManager')).recordGasSpent(preStateRoot, txHash, msg.sender, gasSpent);\\n }\\n}\\n\",\"keccak256\":\"0x6c27d089a297103cb93b30f7649ab68691cc6b948c315f1037e5de1fe9bf5903\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/verification/OVM_FraudVerifier.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_FraudVerifier } from \\\"../../iOVM/verification/iOVM_FraudVerifier.sol\\\";\\nimport { iOVM_StateTransitioner } from \\\"../../iOVM/verification/iOVM_StateTransitioner.sol\\\";\\nimport { iOVM_StateTransitionerFactory } from \\\"../../iOVM/verification/iOVM_StateTransitionerFactory.sol\\\";\\nimport { iOVM_BondManager } from \\\"../../iOVM/verification/iOVM_BondManager.sol\\\";\\nimport { iOVM_StateCommitmentChain } from \\\"../../iOVM/chain/iOVM_StateCommitmentChain.sol\\\";\\nimport { iOVM_CanonicalTransactionChain } from \\\"../../iOVM/chain/iOVM_CanonicalTransactionChain.sol\\\";\\n\\n/* Contract Imports */\\nimport { Abs_FraudContributor } from \\\"./Abs_FraudContributor.sol\\\";\\n\\n\\n\\n/**\\n * @title OVM_FraudVerifier\\n * @dev The Fraud Verifier contract coordinates the entire fraud proof verification process.\\n * If the fraud proof was successful it prunes any state batches from State Commitment Chain\\n * which were published after the fraudulent state root.\\n *\\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract OVM_FraudVerifier is Lib_AddressResolver, Abs_FraudContributor, iOVM_FraudVerifier {\\n\\n /*******************************************\\n * Contract Variables: Internal Accounting *\\n *******************************************/\\n\\n mapping (bytes32 => iOVM_StateTransitioner) internal transitioners;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n */\\n constructor(\\n address _libAddressManager\\n )\\n Lib_AddressResolver(_libAddressManager)\\n {}\\n\\n\\n /***************************************\\n * Public Functions: Transition Status *\\n ***************************************/\\n\\n /**\\n * Retrieves the state transitioner for a given root.\\n * @param _preStateRoot State root to query a transitioner for.\\n * @return _transitioner Corresponding state transitioner contract.\\n */\\n function getStateTransitioner(\\n bytes32 _preStateRoot,\\n bytes32 _txHash\\n )\\n override\\n public\\n view\\n returns (\\n iOVM_StateTransitioner _transitioner\\n )\\n {\\n return transitioners[keccak256(abi.encodePacked(_preStateRoot, _txHash))];\\n }\\n\\n\\n /****************************************\\n * Public Functions: Fraud Verification *\\n ****************************************/\\n\\n /**\\n * Begins the fraud verification process.\\n * @param _preStateRoot State root before the fraudulent transaction.\\n * @param _preStateRootBatchHeader Batch header for the provided pre-state root.\\n * @param _preStateRootProof Inclusion proof for the provided pre-state root.\\n * @param _transaction OVM transaction claimed to be fraudulent.\\n * @param _txChainElement OVM transaction chain element.\\n * @param _transactionBatchHeader Batch header for the provided transaction.\\n * @param _transactionProof Inclusion proof for the provided transaction.\\n */\\n function initializeFraudVerification(\\n bytes32 _preStateRoot,\\n Lib_OVMCodec.ChainBatchHeader memory _preStateRootBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _preStateRootProof,\\n Lib_OVMCodec.Transaction memory _transaction,\\n Lib_OVMCodec.TransactionChainElement memory _txChainElement,\\n Lib_OVMCodec.ChainBatchHeader memory _transactionBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _transactionProof\\n )\\n override\\n public\\n contributesToFraudProof(_preStateRoot, Lib_OVMCodec.hashTransaction(_transaction))\\n {\\n bytes32 _txHash = Lib_OVMCodec.hashTransaction(_transaction);\\n\\n if (_hasStateTransitioner(_preStateRoot, _txHash)) {\\n return;\\n }\\n\\n iOVM_StateCommitmentChain ovmStateCommitmentChain = iOVM_StateCommitmentChain(resolve(\\\"OVM_StateCommitmentChain\\\"));\\n iOVM_CanonicalTransactionChain ovmCanonicalTransactionChain = iOVM_CanonicalTransactionChain(resolve(\\\"OVM_CanonicalTransactionChain\\\"));\\n\\n require(\\n ovmStateCommitmentChain.verifyStateCommitment(\\n _preStateRoot,\\n _preStateRootBatchHeader,\\n _preStateRootProof\\n ),\\n \\\"Invalid pre-state root inclusion proof.\\\"\\n );\\n\\n require(\\n ovmCanonicalTransactionChain.verifyTransaction(\\n _transaction,\\n _txChainElement,\\n _transactionBatchHeader,\\n _transactionProof\\n ),\\n \\\"Invalid transaction inclusion proof.\\\"\\n );\\n\\n require (\\n _preStateRootBatchHeader.prevTotalElements + _preStateRootProof.index + 1 == _transactionBatchHeader.prevTotalElements + _transactionProof.index,\\n \\\"Pre-state root global index must equal to the transaction root global index.\\\"\\n );\\n\\n _deployTransitioner(_preStateRoot, _txHash, _preStateRootProof.index);\\n\\n emit FraudProofInitialized(\\n _preStateRoot,\\n _preStateRootProof.index,\\n _txHash,\\n msg.sender\\n );\\n }\\n\\n /**\\n * Finalizes the fraud verification process.\\n * @param _preStateRoot State root before the fraudulent transaction.\\n * @param _preStateRootBatchHeader Batch header for the provided pre-state root.\\n * @param _preStateRootProof Inclusion proof for the provided pre-state root.\\n * @param _txHash The transaction for the state root\\n * @param _postStateRoot State root after the fraudulent transaction.\\n * @param _postStateRootBatchHeader Batch header for the provided post-state root.\\n * @param _postStateRootProof Inclusion proof for the provided post-state root.\\n */\\n function finalizeFraudVerification(\\n bytes32 _preStateRoot,\\n Lib_OVMCodec.ChainBatchHeader memory _preStateRootBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _preStateRootProof,\\n bytes32 _txHash,\\n bytes32 _postStateRoot,\\n Lib_OVMCodec.ChainBatchHeader memory _postStateRootBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _postStateRootProof\\n )\\n override\\n public\\n contributesToFraudProof(_preStateRoot, _txHash)\\n {\\n iOVM_StateTransitioner transitioner = getStateTransitioner(_preStateRoot, _txHash);\\n iOVM_StateCommitmentChain ovmStateCommitmentChain = iOVM_StateCommitmentChain(resolve(\\\"OVM_StateCommitmentChain\\\"));\\n\\n require(\\n transitioner.isComplete() == true,\\n \\\"State transition process must be completed prior to finalization.\\\"\\n );\\n\\n require (\\n _postStateRootBatchHeader.prevTotalElements + _postStateRootProof.index == _preStateRootBatchHeader.prevTotalElements + _preStateRootProof.index + 1,\\n \\\"Post-state root global index must equal to the pre state root global index plus one.\\\"\\n );\\n\\n require(\\n ovmStateCommitmentChain.verifyStateCommitment(\\n _preStateRoot,\\n _preStateRootBatchHeader,\\n _preStateRootProof\\n ),\\n \\\"Invalid pre-state root inclusion proof.\\\"\\n );\\n\\n require(\\n ovmStateCommitmentChain.verifyStateCommitment(\\n _postStateRoot,\\n _postStateRootBatchHeader,\\n _postStateRootProof\\n ),\\n \\\"Invalid post-state root inclusion proof.\\\"\\n );\\n\\n // If the post state root did not match, then there was fraud and we should delete the batch\\n require(\\n _postStateRoot != transitioner.getPostStateRoot(),\\n \\\"State transition has not been proven fraudulent.\\\"\\n );\\n\\n _cancelStateTransition(_postStateRootBatchHeader, _preStateRoot);\\n\\n // TEMPORARY: Remove the transitioner; for minnet.\\n transitioners[keccak256(abi.encodePacked(_preStateRoot, _txHash))] = iOVM_StateTransitioner(0x0000000000000000000000000000000000000000);\\n\\n emit FraudProofFinalized(\\n _preStateRoot,\\n _preStateRootProof.index,\\n _txHash,\\n msg.sender\\n );\\n }\\n\\n\\n /************************************\\n * Internal Functions: Verification *\\n ************************************/\\n\\n /**\\n * Checks whether a transitioner already exists for a given pre-state root.\\n * @param _preStateRoot Pre-state root to check.\\n * @return _exists Whether or not we already have a transitioner for the root.\\n */\\n function _hasStateTransitioner(\\n bytes32 _preStateRoot,\\n bytes32 _txHash\\n )\\n internal\\n view\\n returns (\\n bool _exists\\n )\\n {\\n return address(getStateTransitioner(_preStateRoot, _txHash)) != address(0);\\n }\\n\\n /**\\n * Deploys a new state transitioner.\\n * @param _preStateRoot Pre-state root to initialize the transitioner with.\\n * @param _txHash Hash of the transaction this transitioner will execute.\\n * @param _stateTransitionIndex Index of the transaction in the chain.\\n */\\n function _deployTransitioner(\\n bytes32 _preStateRoot,\\n bytes32 _txHash,\\n uint256 _stateTransitionIndex\\n )\\n internal\\n {\\n transitioners[keccak256(abi.encodePacked(_preStateRoot, _txHash))] = iOVM_StateTransitionerFactory(\\n resolve(\\\"OVM_StateTransitionerFactory\\\")\\n ).create(\\n address(libAddressManager),\\n _stateTransitionIndex,\\n _preStateRoot,\\n _txHash\\n );\\n }\\n\\n /**\\n * Removes a state transition from the state commitment chain.\\n * @param _postStateRootBatchHeader Header for the post-state root.\\n * @param _preStateRoot Pre-state root hash.\\n */\\n function _cancelStateTransition(\\n Lib_OVMCodec.ChainBatchHeader memory _postStateRootBatchHeader,\\n bytes32 _preStateRoot\\n )\\n internal\\n {\\n iOVM_StateCommitmentChain ovmStateCommitmentChain = iOVM_StateCommitmentChain(resolve(\\\"OVM_StateCommitmentChain\\\"));\\n iOVM_BondManager ovmBondManager = iOVM_BondManager(resolve(\\\"OVM_BondManager\\\"));\\n\\n // Delete the state batch.\\n ovmStateCommitmentChain.deleteStateBatch(\\n _postStateRootBatchHeader\\n );\\n\\n // Get the timestamp and publisher for that block.\\n (uint256 timestamp, address publisher) = abi.decode(_postStateRootBatchHeader.extraData, (uint256, address));\\n\\n // Slash the bonds at the bond manager.\\n ovmBondManager.finalize(\\n _preStateRoot,\\n publisher,\\n timestamp\\n );\\n }\\n}\\n\",\"keccak256\":\"0x879cef57019254ad958a75db64f0b58eb0a6fcf74f386ed958f75384b860dd35\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_CanonicalTransactionChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_ChainStorageContainer } from \\\"./iOVM_ChainStorageContainer.sol\\\";\\n\\n/**\\n * @title iOVM_CanonicalTransactionChain\\n */\\ninterface iOVM_CanonicalTransactionChain {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event TransactionEnqueued(\\n address _l1TxOrigin,\\n address _target,\\n uint256 _gasLimit,\\n bytes _data,\\n uint256 _queueIndex,\\n uint256 _timestamp\\n );\\n\\n event QueueBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event SequencerBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event TransactionBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct BatchContext {\\n uint256 numSequencedTransactions;\\n uint256 numSubsequentQueueTransactions;\\n uint256 timestamp;\\n uint256 blockNumber;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n\\n /**\\n * Accesses the batch storage container.\\n * @return Reference to the batch storage container.\\n */\\n function batches()\\n external\\n view\\n returns (\\n iOVM_ChainStorageContainer\\n );\\n\\n /**\\n * Accesses the queue storage container.\\n * @return Reference to the queue storage container.\\n */\\n function queue()\\n external\\n view\\n returns (\\n iOVM_ChainStorageContainer\\n );\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements()\\n external\\n view\\n returns (\\n uint256 _totalElements\\n );\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches()\\n external\\n view\\n returns (\\n uint256 _totalBatches\\n );\\n\\n /**\\n * Returns the index of the next element to be enqueued.\\n * @return Index for the next queue element.\\n */\\n function getNextQueueIndex()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Gets the queue element at a particular index.\\n * @param _index Index of the queue element to access.\\n * @return _element Queue element at the given index.\\n */\\n function getQueueElement(\\n uint256 _index\\n )\\n external\\n view\\n returns (\\n Lib_OVMCodec.QueueElement memory _element\\n );\\n\\n /**\\n * Returns the timestamp of the last transaction.\\n * @return Timestamp for the last transaction.\\n */\\n function getLastTimestamp()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Returns the blocknumber of the last transaction.\\n * @return Blocknumber for the last transaction.\\n */\\n function getLastBlockNumber()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Get the number of queue elements which have not yet been included.\\n * @return Number of pending queue elements.\\n */\\n function getNumPendingQueueElements()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Retrieves the length of the queue, including\\n * both pending and canonical transactions.\\n * @return Length of the queue.\\n */\\n function getQueueLength()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n\\n /**\\n * Adds a transaction to the queue.\\n * @param _target Target contract to send the transaction to.\\n * @param _gasLimit Gas limit for the given transaction.\\n * @param _data Transaction data.\\n */\\n function enqueue(\\n address _target,\\n uint256 _gasLimit,\\n bytes memory _data\\n )\\n external;\\n\\n /**\\n * Appends a given number of queued transactions as a single batch.\\n * @param _numQueuedTransactions Number of transactions to append.\\n */\\n function appendQueueBatch(\\n uint256 _numQueuedTransactions\\n )\\n external;\\n\\n /**\\n * Allows the sequencer to append a batch of transactions.\\n * @dev This function uses a custom encoding scheme for efficiency reasons.\\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\\n * .param _contexts Array of batch contexts.\\n * .param _transactionDataFields Array of raw transaction data.\\n */\\n function appendSequencerBatch(\\n // uint40 _shouldStartAtElement,\\n // uint24 _totalElementsToAppend,\\n // BatchContext[] _contexts,\\n // bytes[] _transactionDataFields\\n )\\n external;\\n\\n /**\\n * Verifies whether a transaction is included in the chain.\\n * @param _transaction Transaction to verify.\\n * @param _txChainElement Transaction chain element corresponding to the transaction.\\n * @param _batchHeader Header of the batch the transaction was included in.\\n * @param _inclusionProof Inclusion proof for the provided transaction chain element.\\n * @return True if the transaction exists in the CTC, false if not.\\n */\\n function verifyTransaction(\\n Lib_OVMCodec.Transaction memory _transaction,\\n Lib_OVMCodec.TransactionChainElement memory _txChainElement,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _inclusionProof\\n )\\n external\\n view\\n returns (\\n bool\\n );\\n}\\n\",\"keccak256\":\"0xb5e55488a1982841c07cdf5ff475da4789596f111dd48f01b1918ee4c775cf3a\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_ChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title iOVM_ChainStorageContainer\\n */\\ninterface iOVM_ChainStorageContainer {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata()\\n external\\n view\\n returns (\\n bytes27\\n );\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length()\\n external\\n view\\n returns (\\n uint256\\n );\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(\\n bytes32 _object\\n )\\n external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(\\n bytes32 _object,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(\\n uint256 _index\\n )\\n external\\n view\\n returns (\\n bytes32\\n );\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index\\n )\\n external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Marks an index as overwritable, meaing the underlying buffer can start to write values over\\n * any objects before and including the given index.\\n */\\n function setNextOverwritableIndex(\\n uint256 _index\\n )\\n external;\\n}\\n\",\"keccak256\":\"0x2d7973a0ad84c23ec62624d3f1e3aeb198cc72686ff1e6cfa17155556b320c94\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_StateCommitmentChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title iOVM_StateCommitmentChain\\n */\\ninterface iOVM_StateCommitmentChain {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event StateBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n event StateBatchDeleted(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot\\n );\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements()\\n external\\n view\\n returns (\\n uint256 _totalElements\\n );\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches()\\n external\\n view\\n returns (\\n uint256 _totalBatches\\n );\\n\\n /**\\n * Retrieves the timestamp of the last batch submitted by the sequencer.\\n * @return _lastSequencerTimestamp Last sequencer batch timestamp.\\n */\\n function getLastSequencerTimestamp()\\n external\\n view\\n returns (\\n uint256 _lastSequencerTimestamp\\n );\\n\\n /**\\n * Appends a batch of state roots to the chain.\\n * @param _batch Batch of state roots.\\n * @param _shouldStartAtElement Index of the element at which this batch should start.\\n */\\n function appendStateBatch(\\n bytes32[] calldata _batch,\\n uint256 _shouldStartAtElement\\n )\\n external;\\n\\n /**\\n * Deletes all state roots after (and including) a given batch.\\n * @param _batchHeader Header of the batch to start deleting from.\\n */\\n function deleteStateBatch(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n external;\\n\\n /**\\n * Verifies a batch inclusion proof.\\n * @param _element Hash of the element to verify a proof for.\\n * @param _batchHeader Header of the batch in which the element was included.\\n * @param _proof Merkle inclusion proof for the element.\\n */\\n function verifyStateCommitment(\\n bytes32 _element,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _proof\\n )\\n external\\n view\\n returns (\\n bool _verified\\n );\\n\\n /**\\n * Checks whether a given batch is still inside its fraud proof window.\\n * @param _batchHeader Header of the batch to check.\\n * @return _inside Whether or not the batch is inside the fraud proof window.\\n */\\n function insideFraudProofWindow(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n external\\n view\\n returns (\\n bool _inside\\n );\\n}\\n\",\"keccak256\":\"0x6646d6ff392b81aab52a7a277e91540819464751de0af5afd1962094b2e92448\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/verification/iOVM_BondManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\ninterface ERC20 {\\n function transfer(address, uint256) external returns (bool);\\n function transferFrom(address, address, uint256) external returns (bool);\\n}\\n\\n/// All the errors which may be encountered on the bond manager\\nlibrary Errors {\\n string constant ERC20_ERR = \\\"BondManager: Could not post bond\\\";\\n string constant ALREADY_FINALIZED = \\\"BondManager: Fraud proof for this pre-state root has already been finalized\\\";\\n string constant SLASHED = \\\"BondManager: Cannot finalize withdrawal, you probably got slashed\\\";\\n string constant WRONG_STATE = \\\"BondManager: Wrong bond state for proposer\\\";\\n string constant CANNOT_CLAIM = \\\"BondManager: Cannot claim yet. Dispute must be finalized first\\\";\\n\\n string constant WITHDRAWAL_PENDING = \\\"BondManager: Withdrawal already pending\\\";\\n string constant TOO_EARLY = \\\"BondManager: Too early to finalize your withdrawal\\\";\\n\\n string constant ONLY_TRANSITIONER = \\\"BondManager: Only the transitioner for this pre-state root may call this function\\\";\\n string constant ONLY_FRAUD_VERIFIER = \\\"BondManager: Only the fraud verifier may call this function\\\";\\n string constant ONLY_STATE_COMMITMENT_CHAIN = \\\"BondManager: Only the state commitment chain may call this function\\\";\\n string constant WAIT_FOR_DISPUTES = \\\"BondManager: Wait for other potential disputes\\\";\\n}\\n\\n/**\\n * @title iOVM_BondManager\\n */\\ninterface iOVM_BondManager {\\n\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n /// The lifecycle of a proposer's bond\\n enum State {\\n // Before depositing or after getting slashed, a user is uncollateralized\\n NOT_COLLATERALIZED,\\n // After depositing, a user is collateralized\\n COLLATERALIZED,\\n // After a user has initiated a withdrawal\\n WITHDRAWING\\n }\\n\\n /// A bond posted by a proposer\\n struct Bond {\\n // The user's state\\n State state;\\n // The timestamp at which a proposer issued their withdrawal request\\n uint32 withdrawalTimestamp;\\n // The time when the first disputed was initiated for this bond\\n uint256 firstDisputeAt;\\n // The earliest observed state root for this bond which has had fraud\\n bytes32 earliestDisputedStateRoot;\\n // The state root's timestamp\\n uint256 earliestTimestamp;\\n }\\n\\n // Per pre-state root, store the number of state provisions that were made\\n // and how many of these calls were made by each user. Payouts will then be\\n // claimed by users proportionally for that dispute.\\n struct Rewards {\\n // Flag to check if rewards for a fraud proof are claimable\\n bool canClaim;\\n // Total number of `recordGasSpent` calls made\\n uint256 total;\\n // The gas spent by each user to provide witness data. The sum of all\\n // values inside this map MUST be equal to the value of `total`\\n mapping(address => uint256) gasSpent;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function recordGasSpent(\\n bytes32 _preStateRoot,\\n bytes32 _txHash,\\n address _who,\\n uint256 _gasSpent\\n ) external;\\n\\n function finalize(\\n bytes32 _preStateRoot,\\n address _publisher,\\n uint256 _timestamp\\n ) external;\\n\\n function deposit() external;\\n\\n function startWithdrawal() external;\\n\\n function finalizeWithdrawal() external;\\n\\n function claim(\\n address _who\\n ) external;\\n\\n function isCollateralized(\\n address _who\\n ) external view returns (bool);\\n\\n function getGasSpent(\\n bytes32 _preStateRoot,\\n address _who\\n ) external view returns (uint256);\\n}\\n\",\"keccak256\":\"0x3c2a8a399487857158649db1896749d86e39cba545a8aeb2e2bb0f3bdfa7a5b1\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/verification/iOVM_FraudVerifier.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_StateTransitioner } from \\\"./iOVM_StateTransitioner.sol\\\";\\n\\n/**\\n * @title iOVM_FraudVerifier\\n */\\ninterface iOVM_FraudVerifier {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event FraudProofInitialized(\\n bytes32 _preStateRoot,\\n uint256 _preStateRootIndex,\\n bytes32 _transactionHash,\\n address _who\\n );\\n\\n event FraudProofFinalized(\\n bytes32 _preStateRoot,\\n uint256 _preStateRootIndex,\\n bytes32 _transactionHash,\\n address _who\\n );\\n\\n\\n /***************************************\\n * Public Functions: Transition Status *\\n ***************************************/\\n\\n function getStateTransitioner(bytes32 _preStateRoot, bytes32 _txHash) external view returns (iOVM_StateTransitioner _transitioner);\\n\\n\\n /****************************************\\n * Public Functions: Fraud Verification *\\n ****************************************/\\n\\n function initializeFraudVerification(\\n bytes32 _preStateRoot,\\n Lib_OVMCodec.ChainBatchHeader calldata _preStateRootBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof calldata _preStateRootProof,\\n Lib_OVMCodec.Transaction calldata _transaction,\\n Lib_OVMCodec.TransactionChainElement calldata _txChainElement,\\n Lib_OVMCodec.ChainBatchHeader calldata _transactionBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof calldata _transactionProof\\n ) external;\\n\\n function finalizeFraudVerification(\\n bytes32 _preStateRoot,\\n Lib_OVMCodec.ChainBatchHeader calldata _preStateRootBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof calldata _preStateRootProof,\\n bytes32 _txHash,\\n bytes32 _postStateRoot,\\n Lib_OVMCodec.ChainBatchHeader calldata _postStateRootBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof calldata _postStateRootProof\\n ) external;\\n}\\n\",\"keccak256\":\"0x5efd7bb18164bbd3e9d58379e8203fbf2a7ee802b1a48dff3ceaaec1523b1751\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/verification/iOVM_StateTransitioner.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title iOVM_StateTransitioner\\n */\\ninterface iOVM_StateTransitioner {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AccountCommitted(\\n address _address\\n );\\n\\n event ContractStorageCommitted(\\n address _address,\\n bytes32 _key\\n );\\n\\n\\n /**********************************\\n * Public Functions: State Access *\\n **********************************/\\n\\n function getPreStateRoot() external view returns (bytes32 _preStateRoot);\\n function getPostStateRoot() external view returns (bytes32 _postStateRoot);\\n function isComplete() external view returns (bool _complete);\\n\\n\\n /***********************************\\n * Public Functions: Pre-Execution *\\n ***********************************/\\n\\n function proveContractState(\\n address _ovmContractAddress,\\n address _ethContractAddress,\\n bytes calldata _stateTrieWitness\\n ) external;\\n\\n function proveStorageSlot(\\n address _ovmContractAddress,\\n bytes32 _key,\\n bytes calldata _storageTrieWitness\\n ) external;\\n\\n\\n /*******************************\\n * Public Functions: Execution *\\n *******************************/\\n\\n function applyTransaction(\\n Lib_OVMCodec.Transaction calldata _transaction\\n ) external;\\n\\n\\n /************************************\\n * Public Functions: Post-Execution *\\n ************************************/\\n\\n function commitContractState(\\n address _ovmContractAddress,\\n bytes calldata _stateTrieWitness\\n ) external;\\n\\n function commitStorageSlot(\\n address _ovmContractAddress,\\n bytes32 _key,\\n bytes calldata _storageTrieWitness\\n ) external;\\n\\n\\n /**********************************\\n * Public Functions: Finalization *\\n **********************************/\\n\\n function completeTransition() external;\\n}\\n\",\"keccak256\":\"0x3d044ac0a3bb6ad3d529f904b3191117511f9c379678ca03010e1ebdfcb5c34b\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/verification/iOVM_StateTransitionerFactory.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Contract Imports */\\nimport { iOVM_StateTransitioner } from \\\"./iOVM_StateTransitioner.sol\\\";\\n\\n/**\\n * @title iOVM_StateTransitionerFactory\\n */\\ninterface iOVM_StateTransitionerFactory {\\n\\n /***************************************\\n * Public Functions: Contract Creation *\\n ***************************************/\\n\\n function create(\\n address _proxyManager,\\n uint256 _stateTransitionIndex,\\n bytes32 _preStateRoot,\\n bytes32 _transactionHash\\n )\\n external\\n returns (\\n iOVM_StateTransitioner _ovmStateTransitioner\\n );\\n}\\n\",\"keccak256\":\"0x60a0f0c104e4c0c7863268a93005762e8146d393f9cfddfdd6a2d6585c5911fc\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/codec/Lib_OVMCodec.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../utils/Lib_Bytes32Utils.sol\\\";\\n\\n/**\\n * @title Lib_OVMCodec\\n */\\nlibrary Lib_OVMCodec {\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum QueueOrigin {\\n SEQUENCER_QUEUE,\\n L1TOL2_QUEUE\\n }\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Account {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n address ethAddress;\\n bool isFresh;\\n }\\n\\n struct EVMAccount {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n }\\n\\n struct ChainBatchHeader {\\n uint256 batchIndex;\\n bytes32 batchRoot;\\n uint256 batchSize;\\n uint256 prevTotalElements;\\n bytes extraData;\\n }\\n\\n struct ChainInclusionProof {\\n uint256 index;\\n bytes32[] siblings;\\n }\\n\\n struct Transaction {\\n uint256 timestamp;\\n uint256 blockNumber;\\n QueueOrigin l1QueueOrigin;\\n address l1TxOrigin;\\n address entrypoint;\\n uint256 gasLimit;\\n bytes data;\\n }\\n\\n struct TransactionChainElement {\\n bool isSequenced;\\n uint256 queueIndex; // QUEUED TX ONLY\\n uint256 timestamp; // SEQUENCER TX ONLY\\n uint256 blockNumber; // SEQUENCER TX ONLY\\n bytes txData; // SEQUENCER TX ONLY\\n }\\n\\n struct QueueElement {\\n bytes32 transactionHash;\\n uint40 timestamp;\\n uint40 blockNumber;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Encodes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Encoded transaction bytes.\\n */\\n function encodeTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return abi.encodePacked(\\n _transaction.timestamp,\\n _transaction.blockNumber,\\n _transaction.l1QueueOrigin,\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n );\\n }\\n\\n /**\\n * Hashes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Hashed transaction\\n */\\n function hashTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(encodeTransaction(_transaction));\\n }\\n\\n /**\\n * Converts an OVM account to an EVM account.\\n * @param _in OVM account to convert.\\n * @return Converted EVM account.\\n */\\n function toEVMAccount(\\n Account memory _in\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n return EVMAccount({\\n nonce: _in.nonce,\\n balance: _in.balance,\\n storageRoot: _in.storageRoot,\\n codeHash: _in.codeHash\\n });\\n }\\n\\n /**\\n * @notice RLP-encodes an account state struct.\\n * @param _account Account state struct.\\n * @return RLP-encoded account state.\\n */\\n function encodeEVMAccount(\\n EVMAccount memory _account\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes[] memory raw = new bytes[](4);\\n\\n // Unfortunately we can't create this array outright because\\n // Lib_RLPWriter.writeList will reject fixed-size arrays. Assigning\\n // index-by-index circumvents this issue.\\n raw[0] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.nonce)\\n )\\n );\\n raw[1] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.balance)\\n )\\n );\\n raw[2] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.storageRoot));\\n raw[3] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.codeHash));\\n\\n return Lib_RLPWriter.writeList(raw);\\n }\\n\\n /**\\n * @notice Decodes an RLP-encoded account state into a useful struct.\\n * @param _encoded RLP-encoded account state.\\n * @return Account state struct.\\n */\\n function decodeEVMAccount(\\n bytes memory _encoded\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\\n\\n return EVMAccount({\\n nonce: Lib_RLPReader.readUint256(accountState[0]),\\n balance: Lib_RLPReader.readUint256(accountState[1]),\\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\\n });\\n }\\n\\n /**\\n * Calculates a hash for a given batch header.\\n * @param _batchHeader Header to hash.\\n * @return Hash of the header.\\n */\\n function hashBatchHeader(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(\\n abi.encode(\\n _batchHeader.batchRoot,\\n _batchHeader.batchSize,\\n _batchHeader.prevTotalElements,\\n _batchHeader.extraData\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0xd85ba2066057a2677926f484b938c7c2ef33ff3853f3b71cda252f4a54f30e05\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n external\\n onlyOwner\\n {\\n addresses[_getNameHash(_name)] = _address;\\n\\n emit AddressSet(\\n _name,\\n _address\\n );\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(\\n string memory _name\\n )\\n external\\n view\\n returns (\\n address\\n )\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xcc9fc5c64f1101a5c6c397594086b1608189a9edc5c9635e1ac38f70aeeeecbf\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(\\n address _libAddressManager\\n ) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x65981feeabff6a81783ea97d44baf988a18a86c8cb374c46fdb71819cbacc7c0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPReader.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_RLPReader\\n * @dev Adapted from \\\"RLPReader\\\" by Hamdi Allam (hamdi.allam97@gmail.com).\\n */\\nlibrary Lib_RLPReader {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 constant internal MAX_LIST_LENGTH = 32;\\n\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum RLPItemType {\\n DATA_ITEM,\\n LIST_ITEM\\n }\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct RLPItem {\\n uint256 length;\\n uint256 ptr;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts bytes to a reference to memory position and length.\\n * @param _in Input bytes to convert.\\n * @return Output memory reference.\\n */\\n function toRLPItem(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem memory\\n )\\n {\\n uint256 ptr;\\n assembly {\\n ptr := add(_in, 32)\\n }\\n\\n return RLPItem({\\n length: _in.length,\\n ptr: ptr\\n });\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n (\\n uint256 listOffset,\\n ,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.LIST_ITEM,\\n \\\"Invalid RLP list value.\\\"\\n );\\n\\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\\n // writing to the length. Since we can't know the number of RLP items without looping over\\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\\n // simply set a reasonable maximum list length and decrease the size before we finish.\\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\\n\\n uint256 itemCount = 0;\\n uint256 offset = listOffset;\\n while (offset < _in.length) {\\n require(\\n itemCount < MAX_LIST_LENGTH,\\n \\\"Provided RLP list exceeds max list length.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n ) = _decodeLength(RLPItem({\\n length: _in.length - offset,\\n ptr: _in.ptr + offset\\n }));\\n\\n out[itemCount] = RLPItem({\\n length: itemLength + itemOffset,\\n ptr: _in.ptr + offset\\n });\\n\\n itemCount += 1;\\n offset += itemOffset + itemLength;\\n }\\n\\n // Decrease the array size to match the actual item count.\\n assembly {\\n mstore(out, itemCount)\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n return readList(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes value.\\\"\\n );\\n\\n return _copy(_in.ptr, itemOffset, itemLength);\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return readBytes(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return string(readBytes(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return readString(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n require(\\n _in.length <= 33,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr + itemOffset;\\n bytes32 out;\\n assembly {\\n out := mload(ptr)\\n\\n // Shift the bytes over to match the item size.\\n if lt(itemLength, 32) {\\n out := div(out, exp(256, sub(32, itemLength)))\\n }\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return readBytes32(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return uint256(readBytes32(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return readUint256(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n require(\\n _in.length == 1,\\n \\\"Invalid RLP boolean value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 out;\\n assembly {\\n out := byte(0, mload(ptr))\\n }\\n\\n require(\\n out == 0 || out == 1,\\n \\\"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\\\"\\n );\\n\\n return out != 0;\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return readBool(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n if (_in.length == 1) {\\n return address(0);\\n }\\n\\n require(\\n _in.length == 21,\\n \\\"Invalid RLP address value.\\\"\\n );\\n\\n return address(readUint256(_in));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return readAddress(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads the raw bytes of an RLP item.\\n * @param _in RLP item to read.\\n * @return Raw RLP bytes.\\n */\\n function readRawBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in);\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Decodes the length of an RLP item.\\n * @param _in RLP item to decode.\\n * @return Offset of the encoded data.\\n * @return Length of the encoded data.\\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\\n */\\n function _decodeLength(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n uint256,\\n uint256,\\n RLPItemType\\n )\\n {\\n require(\\n _in.length > 0,\\n \\\"RLP item cannot be null.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 prefix;\\n assembly {\\n prefix := byte(0, mload(ptr))\\n }\\n\\n if (prefix <= 0x7f) {\\n // Single byte.\\n\\n return (0, 1, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xb7) {\\n // Short string.\\n\\n uint256 strLen = prefix - 0x80;\\n\\n require(\\n _in.length > strLen,\\n \\\"Invalid RLP short string.\\\"\\n );\\n\\n return (1, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xbf) {\\n // Long string.\\n uint256 lenOfStrLen = prefix - 0xb7;\\n\\n require(\\n _in.length > lenOfStrLen,\\n \\\"Invalid RLP long string length.\\\"\\n );\\n\\n uint256 strLen;\\n assembly {\\n // Pick out the string length.\\n strLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfStrLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfStrLen + strLen,\\n \\\"Invalid RLP long string.\\\"\\n );\\n\\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xf7) {\\n // Short list.\\n uint256 listLen = prefix - 0xc0;\\n\\n require(\\n _in.length > listLen,\\n \\\"Invalid RLP short list.\\\"\\n );\\n\\n return (1, listLen, RLPItemType.LIST_ITEM);\\n } else {\\n // Long list.\\n uint256 lenOfListLen = prefix - 0xf7;\\n\\n require(\\n _in.length > lenOfListLen,\\n \\\"Invalid RLP long list length.\\\"\\n );\\n\\n uint256 listLen;\\n assembly {\\n // Pick out the list length.\\n listLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfListLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfListLen + listLen,\\n \\\"Invalid RLP long list.\\\"\\n );\\n\\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\\n }\\n }\\n\\n /**\\n * Copies the bytes from a memory location.\\n * @param _src Pointer to the location to read from.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Copied bytes.\\n */\\n function _copy(\\n uint256 _src,\\n uint256 _offset,\\n uint256 _length\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out = new bytes(_length);\\n if (out.length == 0) {\\n return out;\\n }\\n\\n uint256 src = _src + _offset;\\n uint256 dest;\\n assembly {\\n dest := add(out, 32)\\n }\\n\\n // Copy over as many complete words as we can.\\n for (uint256 i = 0; i < _length / 32; i++) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n\\n src += 32;\\n dest += 32;\\n }\\n\\n // Pick out the remaining bytes.\\n uint256 mask = 256 ** (32 - (_length % 32)) - 1;\\n assembly {\\n mstore(\\n dest,\\n or(\\n and(mload(src), not(mask)),\\n and(mload(dest), mask)\\n )\\n )\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Copies an RLP item into bytes.\\n * @param _in RLP item to copy.\\n * @return Copied bytes.\\n */\\n function _copy(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in.ptr, 0, _in.length);\\n }\\n}\\n\",\"keccak256\":\"0x829174c61216dce35fdb888383b6022e0365eb7fbdc71ad79d98b108091969fe\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPWriter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/**\\n * @title Lib_RLPWriter\\n * @author Bakaoh (with modifications)\\n */\\nlibrary Lib_RLPWriter {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * RLP encodes a byte string.\\n * @param _in The byte string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded;\\n\\n if (_in.length == 1 && uint8(_in[0]) < 128) {\\n encoded = _in;\\n } else {\\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * RLP encodes a list of RLP encoded byte byte strings.\\n * @param _in The list of RLP encoded byte strings.\\n * @return The RLP encoded list of items in bytes.\\n */\\n function writeList(\\n bytes[] memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory list = _flatten(_in);\\n return abi.encodePacked(_writeLength(list.length, 192), list);\\n }\\n\\n /**\\n * RLP encodes a string.\\n * @param _in The string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeString(\\n string memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(bytes(_in));\\n }\\n\\n /**\\n * RLP encodes an address.\\n * @param _in The address to encode.\\n * @return The RLP encoded address in bytes.\\n */\\n function writeAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a bytes32 value.\\n * @param _in The bytes32 to encode.\\n * @return _out The RLP encoded bytes32 in bytes.\\n */\\n function writeBytes32(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a uint.\\n * @param _in The uint256 to encode.\\n * @return The RLP encoded uint256 in bytes.\\n */\\n function writeUint(\\n uint256 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(_toBinary(_in));\\n }\\n\\n /**\\n * RLP encodes a bool.\\n * @param _in The bool to encode.\\n * @return The RLP encoded bool in bytes.\\n */\\n function writeBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded = new bytes(1);\\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\\n return encoded;\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\\n * @param _len The length of the string or the payload.\\n * @param _offset 128 if item is string, 192 if item is list.\\n * @return RLP encoded bytes.\\n */\\n function _writeLength(\\n uint256 _len,\\n uint256 _offset\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded;\\n\\n if (_len < 56) {\\n encoded = new bytes(1);\\n encoded[0] = byte(uint8(_len) + uint8(_offset));\\n } else {\\n uint256 lenLen;\\n uint256 i = 1;\\n while (_len / i != 0) {\\n lenLen++;\\n i *= 256;\\n }\\n\\n encoded = new bytes(lenLen + 1);\\n encoded[0] = byte(uint8(lenLen) + uint8(_offset) + 55);\\n for(i = 1; i <= lenLen; i++) {\\n encoded[i] = byte(uint8((_len / (256**(lenLen-i))) % 256));\\n }\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * Encode integer in big endian binary form with no leading zeroes.\\n * @notice TODO: This should be optimized with assembly to save gas costs.\\n * @param _x The integer to encode.\\n * @return RLP encoded bytes.\\n */\\n function _toBinary(\\n uint256 _x\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory b = abi.encodePacked(_x);\\n\\n uint256 i = 0;\\n for (; i < 32; i++) {\\n if (b[i] != 0) {\\n break;\\n }\\n }\\n\\n bytes memory res = new bytes(32 - i);\\n for (uint256 j = 0; j < res.length; j++) {\\n res[j] = b[i++];\\n }\\n\\n return res;\\n }\\n\\n /**\\n * Copies a piece of memory to another location.\\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\\n * @param _dest Destination location.\\n * @param _src Source location.\\n * @param _len Length of memory to copy.\\n */\\n function _memcpy(\\n uint256 _dest,\\n uint256 _src,\\n uint256 _len\\n )\\n private\\n pure\\n {\\n uint256 dest = _dest;\\n uint256 src = _src;\\n uint256 len = _len;\\n\\n for(; len >= 32; len -= 32) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n dest += 32;\\n src += 32;\\n }\\n\\n uint256 mask = 256 ** (32 - len) - 1;\\n assembly {\\n let srcpart := and(mload(src), not(mask))\\n let destpart := and(mload(dest), mask)\\n mstore(dest, or(destpart, srcpart))\\n }\\n }\\n\\n /**\\n * Flattens a list of byte strings into one byte string.\\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\\n * @param _list List of byte strings to flatten.\\n * @return The flattened byte string.\\n */\\n function _flatten(\\n bytes[] memory _list\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n if (_list.length == 0) {\\n return new bytes(0);\\n }\\n\\n uint256 len;\\n uint256 i = 0;\\n for (; i < _list.length; i++) {\\n len += _list[i].length;\\n }\\n\\n bytes memory flattened = new bytes(len);\\n uint256 flattenedPtr;\\n assembly { flattenedPtr := add(flattened, 0x20) }\\n\\n for(i = 0; i < _list.length; i++) {\\n bytes memory item = _list[i];\\n\\n uint256 listPtr;\\n assembly { listPtr := add(item, 0x20)}\\n\\n _memcpy(flattenedPtr, listPtr, item.length);\\n flattenedPtr += _list[i].length;\\n }\\n\\n return flattened;\\n }\\n}\\n\",\"keccak256\":\"0xb60ee4b03ad372c3deff21d454ab714dd0c18ee3e6f9d45532e209fc59d5a54d\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_Bytes32Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_Byte32Utils\\n */\\nlibrary Lib_Bytes32Utils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \\\"true.\\\"\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as a boolean.\\n */\\n function toBool(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return _in != 0;\\n }\\n\\n /**\\n * Converts a boolean to a bytes32 value.\\n * @param _in Input boolean value.\\n * @return Boolean as a bytes32.\\n */\\n function fromBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in ? 1 : 0));\\n }\\n\\n /**\\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as an address.\\n */\\n function toAddress(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return address(uint160(uint256(_in)));\\n }\\n\\n /**\\n * Converts an address to a bytes32.\\n * @param _in Input address value.\\n * @return Address as a bytes32.\\n */\\n function fromAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in));\\n }\\n\\n /**\\n * Removes the leading zeros from a bytes32 value and returns a new (smaller) bytes value.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 without any leading zeros.\\n */\\n function removeLeadingZeros(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out;\\n\\n assembly {\\n // Figure out how many leading zero bytes to remove.\\n let shift := 0\\n for { let i := 0 } and(lt(i, 32), eq(byte(i, _in), 0)) { i := add(i, 1) } {\\n shift := add(shift, 1)\\n }\\n\\n // Reserve some space for our output and fix the free memory pointer.\\n out := mload(0x40)\\n mstore(0x40, add(out, 0x40))\\n\\n // Shift the value and store it into the output bytes.\\n mstore(add(out, 0x20), shl(mul(shift, 8), _in))\\n\\n // Store the new size (with leading zero bytes removed) in the output byte size.\\n mstore(out, sub(32, shift))\\n }\\n\\n return out;\\n }\\n}\\n\",\"keccak256\":\"0xfa2def593e3fc56a31852c3744aefdaa93cec74e721bfcfeb1e5d166c7c60b64\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_BytesUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_BytesUtils\\n */\\nlibrary Lib_BytesUtils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_start + _length >= _start, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n if (_start >= _bytes.length) {\\n return bytes('');\\n }\\n\\n return slice(_bytes, _start, _bytes.length - _start);\\n }\\n\\n function toBytes32PadLeft(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n bytes32 ret;\\n uint256 len = _bytes.length <= 32 ? _bytes.length : 32;\\n assembly {\\n ret := shr(mul(sub(32, len), 8), mload(add(_bytes, 32)))\\n }\\n return ret;\\n }\\n\\n function toBytes32(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n if (_bytes.length < 32) {\\n bytes32 ret;\\n assembly {\\n ret := mload(add(_bytes, 32))\\n }\\n return ret;\\n }\\n\\n return abi.decode(_bytes,(bytes32)); // will truncate if input length > 32 bytes\\n }\\n\\n function toUint256(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return uint256(toBytes32(_bytes));\\n }\\n\\n function toUint24(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n uint24\\n )\\n {\\n require(_start + 3 >= _start, \\\"toUint24_overflow\\\");\\n require(_bytes.length >= _start + 3 , \\\"toUint24_outOfBounds\\\");\\n uint24 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x3), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toUint8(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n uint8\\n )\\n {\\n require(_start + 1 >= _start, \\\"toUint8_overflow\\\");\\n require(_bytes.length >= _start + 1 , \\\"toUint8_outOfBounds\\\");\\n uint8 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x1), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toAddress(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n require(_start + 20 >= _start, \\\"toAddress_overflow\\\");\\n require(_bytes.length >= _start + 20, \\\"toAddress_outOfBounds\\\");\\n address tempAddress;\\n\\n assembly {\\n tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000)\\n }\\n\\n return tempAddress;\\n }\\n\\n function toNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory nibbles = new bytes(_bytes.length * 2);\\n\\n for (uint256 i = 0; i < _bytes.length; i++) {\\n nibbles[i * 2] = _bytes[i] >> 4;\\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\\n }\\n\\n return nibbles;\\n }\\n\\n function fromNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory ret = new bytes(_bytes.length / 2);\\n\\n for (uint256 i = 0; i < ret.length; i++) {\\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\\n }\\n\\n return ret;\\n }\\n\\n function equal(\\n bytes memory _bytes,\\n bytes memory _other\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return keccak256(_bytes) == keccak256(_other);\\n }\\n}\\n\",\"keccak256\":\"0xd27e37973f1e0f64798725b7a0de12989dac992fba0d72970249d7e1f70e17c5\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x608060405234801561001057600080fd5b5060405161184138038061184183398101604081905261002f91610054565b600080546001600160a01b0319166001600160a01b0392909216919091179055610082565b600060208284031215610065578081fd5b81516001600160a01b038116811461007b578182fd5b9392505050565b6117b0806100916000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c8063299ca4781461005c578063461a44781461007a57806398d8867d1461008d578063a286ba1c146100a2578063b48ec820146100b5575b600080fd5b6100646100c8565b6040516100719190611306565b60405180910390f35b610064610088366004611101565b6100d7565b6100a061009b366004611029565b6101b5565b005b6100a06100b0366004610f64565b6104f4565b6100646100c3366004610f43565b6108bb565b6000546001600160a01b031681565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b8381101561013757818101518382015260200161011f565b50505050905090810190601f1680156101645780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561018157600080fd5b505afa158015610195573d6000803e3d6000fd5b505050506040513d60208110156101ab57600080fd5b505190505b919050565b866101bf8561090a565b60005a905060006101cf8861090a565b90506101db8b82610923565b156101e65750610432565b60006102216040518060400160405280601881526020017727ab26afa9ba30ba32a1b7b6b6b4ba36b2b73a21b430b4b760411b8152506100d7565b905060006102636040518060400160405280601d81526020017f4f564d5f43616e6f6e6963616c5472616e73616374696f6e436861696e0000008152506100d7565b9050816001600160a01b0316634d69ee578e8e8e6040518463ffffffff1660e01b81526004016102959392919061135f565b60206040518083038186803b1580156102ad57600080fd5b505afa1580156102c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102e59190610f0f565b61030a5760405162461bcd60e51b8152600401610301906115e7565b60405180910390fd5b6040516326f2b4e760e11b81526001600160a01b03821690634de569ce9061033c908d908d908d908d90600401611641565b60206040518083038186803b15801561035457600080fd5b505afa158015610368573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061038c9190610f0f565b6103a85760405162461bcd60e51b815260040161030190611499565b86600001518860600151018b600001518d6060015101600101146103de5760405162461bcd60e51b815260040161030190611525565b6103ed8d848d60000151610942565b7f41a48bde2468fac6f670f39b66d7b91f311053e1f28eab9d75056546e6eaac958d8c6000015185336040516104269493929190611394565b60405180910390a15050505b60005a820390506104696040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506100d7565b6001600160a01b0316631e16e92f858533856040518563ffffffff1660e01b815260040180858152602001848152602001836001600160a01b03168152602001828152602001945050505050600060405180830381600087803b1580156104cf57600080fd5b505af11580156104e3573d6000803e3d6000fd5b505050505050505050505050505050565b868460005a905060006105078b896108bb565b905060006105446040518060400160405280601881526020017727ab26afa9ba30ba32a1b7b6b6b4ba36b2b73a21b430b4b760411b8152506100d7565b9050816001600160a01b031663b2fa1c9e6040518163ffffffff1660e01b815260040160206040518083038186803b15801561057f57600080fd5b505afa158015610593573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b79190610f0f565b15156001146105d85760405162461bcd60e51b8152600401610301906113b8565b89600001518b606001510160010186600001518860600151011461060e5760405162461bcd60e51b81526004016103019061141f565b604051634d69ee5760e01b81526001600160a01b03821690634d69ee579061063e908f908f908f9060040161135f565b60206040518083038186803b15801561065657600080fd5b505afa15801561066a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061068e9190610f0f565b6106aa5760405162461bcd60e51b8152600401610301906115e7565b604051634d69ee5760e01b81526001600160a01b03821690634d69ee57906106da908b908b908b9060040161135f565b60206040518083038186803b1580156106f257600080fd5b505afa158015610706573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061072a9190610f0f565b6107465760405162461bcd60e51b8152600401610301906114dd565b816001600160a01b031663c1c618b86040518163ffffffff1660e01b815260040160206040518083038186803b15801561077f57600080fd5b505afa158015610793573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107b79190610f2b565b8814156107d65760405162461bcd60e51b815260040161030190611597565b6107e0878d610a6d565b6000600160008e8c6040516020016107f9929190611289565b60405160208183030381529060405280519060200120815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b031602179055507f1e5fff3c23daf51ea67aaa3bbc738bcedaa98be5a5503f0e63a336a004b075b18c8b600001518b3360405161087a9493929190611394565b60405180910390a1505060005a820390506104696040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506100d7565b60006001600084846040516020016108d4929190611289565b60408051808303601f19018152918152815160209283012083529082019290925201600020546001600160a01b03169392505050565b600061091582610bc7565b805190602001209050919050565b60008061093084846108bb565b6001600160a01b031614159392505050565b6109806040518060400160405280601c81526020017f4f564d5f53746174655472616e736974696f6e6572466163746f7279000000008152506100d7565b600054604051631168a38160e11b81526001600160a01b03928316926322d14702926109b79291169085908890889060040161131a565b602060405180830381600087803b1580156109d157600080fd5b505af11580156109e5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a0991906110e5565b600160008585604051602001610a20929190611289565b60405160208183030381529060405280519060200120815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b03160217905550505050565b6000610aa86040518060400160405280601881526020017727ab26afa9ba30ba32a1b7b6b6b4ba36b2b73a21b430b4b760411b8152506100d7565b90506000610adc6040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506100d7565b604051632e38626b60e21b81529091506001600160a01b0383169063b8e189ac90610b0b90879060040161162e565b600060405180830381600087803b158015610b2557600080fd5b505af1158015610b39573d6000803e3d6000fd5b505050506000808560800151806020019051810190610b58919061114f565b60405163abfbbe1360e01b815291935091506001600160a01b0384169063abfbbe1390610b8d90889085908790600401611340565b600060405180830381600087803b158015610ba757600080fd5b505af1158015610bbb573d6000803e3d6000fd5b50505050505050505050565b6060816000015182602001518360400151846060015185608001518660a001518760c00151604051602001610c029796959493929190611297565b6040516020818303038152906040529050919050565b600067ffffffffffffffff831115610c2c57fe5b610c3f601f8401601f1916602001611700565b9050828152838383011115610c5357600080fd5b828260208301376000602084830101529392505050565b80356101b081611754565b600082601f830112610c85578081fd5b610c9483833560208501610c18565b9392505050565b8035600281106101b057600080fd5b600060a08284031215610cbb578081fd5b60405160a0810167ffffffffffffffff8282108183111715610cd957fe5b81604052829350843583526020850135602084015260408501356040840152606085013560608401526080850135915080821115610d1657600080fd5b50610d2385828601610c75565b6080830152505092915050565b600060408284031215610d41578081fd5b6040516040810167ffffffffffffffff8282108183111715610d5f57fe5b8160405282935084358352602091508185013581811115610d7f57600080fd5b8501601f81018713610d9057600080fd5b803582811115610d9c57fe5b8381029250610dac848401611700565b8181528481019083860185850187018b1015610dc757600080fd5b600095505b83861015610dea578035835260019590950194918601918601610dcc565b5080868801525050505050505092915050565b600060a08284031215610e0e578081fd5b60405160a0810167ffffffffffffffff8282108183111715610e2c57fe5b8160405282935084359150610e408261176c565b8183526020850135602084015260408501356040840152606085013560608401526080850135915080821115610d1657600080fd5b600060e08284031215610e86578081fd5b610e9060e0611700565b90508135815260208201356020820152610eac60408301610c9b565b6040820152610ebd60608301610c6a565b6060820152610ece60808301610c6a565b608082015260a082013560a082015260c082013567ffffffffffffffff811115610ef757600080fd5b610f0384828501610c75565b60c08301525092915050565b600060208284031215610f20578081fd5b8151610c948161176c565b600060208284031215610f3c578081fd5b5051919050565b60008060408385031215610f55578081fd5b50508035926020909101359150565b600080600080600080600060e0888a031215610f7e578283fd5b87359650602088013567ffffffffffffffff80821115610f9c578485fd5b610fa88b838c01610caa565b975060408a0135915080821115610fbd578485fd5b610fc98b838c01610d30565b965060608a0135955060808a0135945060a08a0135915080821115610fec578384fd5b610ff88b838c01610caa565b935060c08a013591508082111561100d578283fd5b5061101a8a828b01610d30565b91505092959891949750929550565b600080600080600080600060e0888a031215611043578081fd5b87359650602088013567ffffffffffffffff80821115611061578283fd5b61106d8b838c01610caa565b975060408a0135915080821115611082578283fd5b61108e8b838c01610d30565b965060608a01359150808211156110a3578283fd5b6110af8b838c01610e75565b955060808a01359150808211156110c4578283fd5b6110d08b838c01610dfd565b945060a08a0135915080821115610fec578283fd5b6000602082840312156110f6578081fd5b8151610c9481611754565b600060208284031215611112578081fd5b813567ffffffffffffffff811115611128578182fd5b8201601f81018413611138578182fd5b61114784823560208401610c18565b949350505050565b60008060408385031215611161578182fd5b82519150602083015161117381611754565b809150509250929050565b6001600160a01b03169052565b600081518084526111a3816020860160208601611724565b601f01601f19169290920160200192915050565b600081518352602082015160208401526040820151604084015260608201516060840152608082015160a0608085015261114760a085018261118b565b6000604083018251845260208084015160408287015282815180855260608801915083830194508592505b8083101561123f578451825293830193600192909201919083019061121f565b509695505050505050565b6000815115158352602082015160208401526040820151604084015260608201516060840152608082015160a0608085015261114760a085018261118b565b918252602082015260400190565b6000888252876020830152600287106112ac57fe5b8660f81b60408301526bffffffffffffffffffffffff19808760601b166041840152808660601b1660558401525083606983015282516112f3816089850160208701611724565b9190910160890198975050505050505050565b6001600160a01b0391909116815260200190565b6001600160a01b0394909416845260208401929092526040830152606082015260800190565b9283526001600160a01b03919091166020830152604082015260600190565b60008482526060602083015261137860608301856111b7565b828103604084015261138a81856111f4565b9695505050505050565b938452602084019290925260408301526001600160a01b0316606082015260800190565b60208082526041908201527f5374617465207472616e736974696f6e2070726f63657373206d75737420626560408201527f20636f6d706c65746564207072696f7220746f2066696e616c697a6174696f6e6060820152601760f91b608082015260a00190565b60208082526054908201527f506f73742d737461746520726f6f7420676c6f62616c20696e646578206d757360408201527f7420657175616c20746f207468652070726520737461746520726f6f7420676c60608201527337b130b61034b73232bc1038363ab99037b7329760611b608082015260a00190565b60208082526024908201527f496e76616c6964207472616e73616374696f6e20696e636c7573696f6e20707260408201526337b7b31760e11b606082015260800190565b60208082526028908201527f496e76616c696420706f73742d737461746520726f6f7420696e636c7573696f6040820152673710383937b7b31760c11b606082015260800190565b6020808252604c908201527f5072652d737461746520726f6f7420676c6f62616c20696e646578206d75737460408201527f20657175616c20746f20746865207472616e73616374696f6e20726f6f74206760608201526b3637b130b61034b73232bc1760a11b608082015260a00190565b60208082526030908201527f5374617465207472616e736974696f6e20686173206e6f74206265656e20707260408201526f37bb32b710333930bab23ab632b73a1760811b606082015260800190565b60208082526027908201527f496e76616c6964207072652d737461746520726f6f7420696e636c7573696f6e60408201526610383937b7b31760c91b606082015260800190565b600060208252610c9460208301846111b7565b60006080825285516080830152602086015160a083015260408601516002811061166757fe5b60c083015260608601516001600160a01b031660e0830152608086015161169261010084018261117e565b5060a086015161012083015260c086015160e06101408401526116b961016084018261118b565b905082810360208401526116cd818761124a565b905082810360408401526116e181866111b7565b905082810360608401526116f581856111f4565b979650505050505050565b60405181810167ffffffffffffffff8111828210171561171c57fe5b604052919050565b60005b8381101561173f578181015183820152602001611727565b8381111561174e576000848401525b50505050565b6001600160a01b038116811461176957600080fd5b50565b801515811461176957600080fdfea26469706673582212201bddb6e25a2ac8766d59ad23945a559f5d002a1c7940103e2fd0834ca70c019464736f6c63430007060033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100575760003560e01c8063299ca4781461005c578063461a44781461007a57806398d8867d1461008d578063a286ba1c146100a2578063b48ec820146100b5575b600080fd5b6100646100c8565b6040516100719190611306565b60405180910390f35b610064610088366004611101565b6100d7565b6100a061009b366004611029565b6101b5565b005b6100a06100b0366004610f64565b6104f4565b6100646100c3366004610f43565b6108bb565b6000546001600160a01b031681565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b8381101561013757818101518382015260200161011f565b50505050905090810190601f1680156101645780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561018157600080fd5b505afa158015610195573d6000803e3d6000fd5b505050506040513d60208110156101ab57600080fd5b505190505b919050565b866101bf8561090a565b60005a905060006101cf8861090a565b90506101db8b82610923565b156101e65750610432565b60006102216040518060400160405280601881526020017727ab26afa9ba30ba32a1b7b6b6b4ba36b2b73a21b430b4b760411b8152506100d7565b905060006102636040518060400160405280601d81526020017f4f564d5f43616e6f6e6963616c5472616e73616374696f6e436861696e0000008152506100d7565b9050816001600160a01b0316634d69ee578e8e8e6040518463ffffffff1660e01b81526004016102959392919061135f565b60206040518083038186803b1580156102ad57600080fd5b505afa1580156102c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102e59190610f0f565b61030a5760405162461bcd60e51b8152600401610301906115e7565b60405180910390fd5b6040516326f2b4e760e11b81526001600160a01b03821690634de569ce9061033c908d908d908d908d90600401611641565b60206040518083038186803b15801561035457600080fd5b505afa158015610368573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061038c9190610f0f565b6103a85760405162461bcd60e51b815260040161030190611499565b86600001518860600151018b600001518d6060015101600101146103de5760405162461bcd60e51b815260040161030190611525565b6103ed8d848d60000151610942565b7f41a48bde2468fac6f670f39b66d7b91f311053e1f28eab9d75056546e6eaac958d8c6000015185336040516104269493929190611394565b60405180910390a15050505b60005a820390506104696040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506100d7565b6001600160a01b0316631e16e92f858533856040518563ffffffff1660e01b815260040180858152602001848152602001836001600160a01b03168152602001828152602001945050505050600060405180830381600087803b1580156104cf57600080fd5b505af11580156104e3573d6000803e3d6000fd5b505050505050505050505050505050565b868460005a905060006105078b896108bb565b905060006105446040518060400160405280601881526020017727ab26afa9ba30ba32a1b7b6b6b4ba36b2b73a21b430b4b760411b8152506100d7565b9050816001600160a01b031663b2fa1c9e6040518163ffffffff1660e01b815260040160206040518083038186803b15801561057f57600080fd5b505afa158015610593573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b79190610f0f565b15156001146105d85760405162461bcd60e51b8152600401610301906113b8565b89600001518b606001510160010186600001518860600151011461060e5760405162461bcd60e51b81526004016103019061141f565b604051634d69ee5760e01b81526001600160a01b03821690634d69ee579061063e908f908f908f9060040161135f565b60206040518083038186803b15801561065657600080fd5b505afa15801561066a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061068e9190610f0f565b6106aa5760405162461bcd60e51b8152600401610301906115e7565b604051634d69ee5760e01b81526001600160a01b03821690634d69ee57906106da908b908b908b9060040161135f565b60206040518083038186803b1580156106f257600080fd5b505afa158015610706573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061072a9190610f0f565b6107465760405162461bcd60e51b8152600401610301906114dd565b816001600160a01b031663c1c618b86040518163ffffffff1660e01b815260040160206040518083038186803b15801561077f57600080fd5b505afa158015610793573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107b79190610f2b565b8814156107d65760405162461bcd60e51b815260040161030190611597565b6107e0878d610a6d565b6000600160008e8c6040516020016107f9929190611289565b60405160208183030381529060405280519060200120815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b031602179055507f1e5fff3c23daf51ea67aaa3bbc738bcedaa98be5a5503f0e63a336a004b075b18c8b600001518b3360405161087a9493929190611394565b60405180910390a1505060005a820390506104696040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506100d7565b60006001600084846040516020016108d4929190611289565b60408051808303601f19018152918152815160209283012083529082019290925201600020546001600160a01b03169392505050565b600061091582610bc7565b805190602001209050919050565b60008061093084846108bb565b6001600160a01b031614159392505050565b6109806040518060400160405280601c81526020017f4f564d5f53746174655472616e736974696f6e6572466163746f7279000000008152506100d7565b600054604051631168a38160e11b81526001600160a01b03928316926322d14702926109b79291169085908890889060040161131a565b602060405180830381600087803b1580156109d157600080fd5b505af11580156109e5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a0991906110e5565b600160008585604051602001610a20929190611289565b60405160208183030381529060405280519060200120815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b03160217905550505050565b6000610aa86040518060400160405280601881526020017727ab26afa9ba30ba32a1b7b6b6b4ba36b2b73a21b430b4b760411b8152506100d7565b90506000610adc6040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506100d7565b604051632e38626b60e21b81529091506001600160a01b0383169063b8e189ac90610b0b90879060040161162e565b600060405180830381600087803b158015610b2557600080fd5b505af1158015610b39573d6000803e3d6000fd5b505050506000808560800151806020019051810190610b58919061114f565b60405163abfbbe1360e01b815291935091506001600160a01b0384169063abfbbe1390610b8d90889085908790600401611340565b600060405180830381600087803b158015610ba757600080fd5b505af1158015610bbb573d6000803e3d6000fd5b50505050505050505050565b6060816000015182602001518360400151846060015185608001518660a001518760c00151604051602001610c029796959493929190611297565b6040516020818303038152906040529050919050565b600067ffffffffffffffff831115610c2c57fe5b610c3f601f8401601f1916602001611700565b9050828152838383011115610c5357600080fd5b828260208301376000602084830101529392505050565b80356101b081611754565b600082601f830112610c85578081fd5b610c9483833560208501610c18565b9392505050565b8035600281106101b057600080fd5b600060a08284031215610cbb578081fd5b60405160a0810167ffffffffffffffff8282108183111715610cd957fe5b81604052829350843583526020850135602084015260408501356040840152606085013560608401526080850135915080821115610d1657600080fd5b50610d2385828601610c75565b6080830152505092915050565b600060408284031215610d41578081fd5b6040516040810167ffffffffffffffff8282108183111715610d5f57fe5b8160405282935084358352602091508185013581811115610d7f57600080fd5b8501601f81018713610d9057600080fd5b803582811115610d9c57fe5b8381029250610dac848401611700565b8181528481019083860185850187018b1015610dc757600080fd5b600095505b83861015610dea578035835260019590950194918601918601610dcc565b5080868801525050505050505092915050565b600060a08284031215610e0e578081fd5b60405160a0810167ffffffffffffffff8282108183111715610e2c57fe5b8160405282935084359150610e408261176c565b8183526020850135602084015260408501356040840152606085013560608401526080850135915080821115610d1657600080fd5b600060e08284031215610e86578081fd5b610e9060e0611700565b90508135815260208201356020820152610eac60408301610c9b565b6040820152610ebd60608301610c6a565b6060820152610ece60808301610c6a565b608082015260a082013560a082015260c082013567ffffffffffffffff811115610ef757600080fd5b610f0384828501610c75565b60c08301525092915050565b600060208284031215610f20578081fd5b8151610c948161176c565b600060208284031215610f3c578081fd5b5051919050565b60008060408385031215610f55578081fd5b50508035926020909101359150565b600080600080600080600060e0888a031215610f7e578283fd5b87359650602088013567ffffffffffffffff80821115610f9c578485fd5b610fa88b838c01610caa565b975060408a0135915080821115610fbd578485fd5b610fc98b838c01610d30565b965060608a0135955060808a0135945060a08a0135915080821115610fec578384fd5b610ff88b838c01610caa565b935060c08a013591508082111561100d578283fd5b5061101a8a828b01610d30565b91505092959891949750929550565b600080600080600080600060e0888a031215611043578081fd5b87359650602088013567ffffffffffffffff80821115611061578283fd5b61106d8b838c01610caa565b975060408a0135915080821115611082578283fd5b61108e8b838c01610d30565b965060608a01359150808211156110a3578283fd5b6110af8b838c01610e75565b955060808a01359150808211156110c4578283fd5b6110d08b838c01610dfd565b945060a08a0135915080821115610fec578283fd5b6000602082840312156110f6578081fd5b8151610c9481611754565b600060208284031215611112578081fd5b813567ffffffffffffffff811115611128578182fd5b8201601f81018413611138578182fd5b61114784823560208401610c18565b949350505050565b60008060408385031215611161578182fd5b82519150602083015161117381611754565b809150509250929050565b6001600160a01b03169052565b600081518084526111a3816020860160208601611724565b601f01601f19169290920160200192915050565b600081518352602082015160208401526040820151604084015260608201516060840152608082015160a0608085015261114760a085018261118b565b6000604083018251845260208084015160408287015282815180855260608801915083830194508592505b8083101561123f578451825293830193600192909201919083019061121f565b509695505050505050565b6000815115158352602082015160208401526040820151604084015260608201516060840152608082015160a0608085015261114760a085018261118b565b918252602082015260400190565b6000888252876020830152600287106112ac57fe5b8660f81b60408301526bffffffffffffffffffffffff19808760601b166041840152808660601b1660558401525083606983015282516112f3816089850160208701611724565b9190910160890198975050505050505050565b6001600160a01b0391909116815260200190565b6001600160a01b0394909416845260208401929092526040830152606082015260800190565b9283526001600160a01b03919091166020830152604082015260600190565b60008482526060602083015261137860608301856111b7565b828103604084015261138a81856111f4565b9695505050505050565b938452602084019290925260408301526001600160a01b0316606082015260800190565b60208082526041908201527f5374617465207472616e736974696f6e2070726f63657373206d75737420626560408201527f20636f6d706c65746564207072696f7220746f2066696e616c697a6174696f6e6060820152601760f91b608082015260a00190565b60208082526054908201527f506f73742d737461746520726f6f7420676c6f62616c20696e646578206d757360408201527f7420657175616c20746f207468652070726520737461746520726f6f7420676c60608201527337b130b61034b73232bc1038363ab99037b7329760611b608082015260a00190565b60208082526024908201527f496e76616c6964207472616e73616374696f6e20696e636c7573696f6e20707260408201526337b7b31760e11b606082015260800190565b60208082526028908201527f496e76616c696420706f73742d737461746520726f6f7420696e636c7573696f6040820152673710383937b7b31760c11b606082015260800190565b6020808252604c908201527f5072652d737461746520726f6f7420676c6f62616c20696e646578206d75737460408201527f20657175616c20746f20746865207472616e73616374696f6e20726f6f74206760608201526b3637b130b61034b73232bc1760a11b608082015260a00190565b60208082526030908201527f5374617465207472616e736974696f6e20686173206e6f74206265656e20707260408201526f37bb32b710333930bab23ab632b73a1760811b606082015260800190565b60208082526027908201527f496e76616c6964207072652d737461746520726f6f7420696e636c7573696f6e60408201526610383937b7b31760c91b606082015260800190565b600060208252610c9460208301846111b7565b60006080825285516080830152602086015160a083015260408601516002811061166757fe5b60c083015260608601516001600160a01b031660e0830152608086015161169261010084018261117e565b5060a086015161012083015260c086015160e06101408401526116b961016084018261118b565b905082810360208401526116cd818761124a565b905082810360408401526116e181866111b7565b905082810360608401526116f581856111f4565b979650505050505050565b60405181810167ffffffffffffffff8111828210171561171c57fe5b604052919050565b60005b8381101561173f578181015183820152602001611727565b8381111561174e576000848401525b50505050565b6001600160a01b038116811461176957600080fd5b50565b801515811461176957600080fdfea26469706673582212201bddb6e25a2ac8766d59ad23945a559f5d002a1c7940103e2fd0834ca70c019464736f6c63430007060033", "devdoc": { - "details": "The Fraud Verifier contract coordinates the entire fraud proof verification process. If the fraud proof was successful it prunes any state batches from State Commitment Chain which were published after the fraudulent state root. Compiler used: solc Runtime target: EVM", + "details": "The Fraud Verifier contract coordinates the entire fraud proof verification process. If the fraud proof was successful it prunes any state batches from State Commitment Chain which were published after the fraudulent state root. Compiler used: solc Runtime target: EVM", "kind": "dev", "methods": { "constructor": { @@ -498,6 +498,14 @@ "_transactionProof": "Inclusion proof for the provided transaction.", "_txChainElement": "OVM transaction chain element." } + }, + "resolve(string)": { + "params": { + "_name": "Name to resolve an address for." + }, + "returns": { + "_0": "Address associated with the given name." + } } }, "title": "OVM_FraudVerifier", @@ -514,6 +522,9 @@ }, "initializeFraudVerification(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),(uint256,uint256,uint8,address,address,uint256,bytes),(bool,uint256,uint256,uint256,bytes),(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))": { "notice": "Begins the fraud verification process." + }, + "resolve(string)": { + "notice": "Resolves the address associated with a given name." } }, "version": 1 @@ -521,20 +532,20 @@ "storageLayout": { "storage": [ { - "astId": 12554, + "astId": 12856, "contract": "contracts/optimistic-ethereum/OVM/verification/OVM_FraudVerifier.sol:OVM_FraudVerifier", "label": "libAddressManager", "offset": 0, "slot": "0", - "type": "t_contract(Lib_AddressManager)12547" + "type": "t_contract(Lib_AddressManager)12849" }, { - "astId": 9171, + "astId": 9447, "contract": "contracts/optimistic-ethereum/OVM/verification/OVM_FraudVerifier.sol:OVM_FraudVerifier", "label": "transitioners", "offset": 0, "slot": "1", - "type": "t_mapping(t_bytes32,t_contract(iOVM_StateTransitioner)11744)" + "type": "t_mapping(t_bytes32,t_contract(iOVM_StateTransitioner)12018)" } ], "types": { @@ -543,22 +554,22 @@ "label": "bytes32", "numberOfBytes": "32" }, - "t_contract(Lib_AddressManager)12547": { + "t_contract(Lib_AddressManager)12849": { "encoding": "inplace", "label": "contract Lib_AddressManager", "numberOfBytes": "20" }, - "t_contract(iOVM_StateTransitioner)11744": { + "t_contract(iOVM_StateTransitioner)12018": { "encoding": "inplace", "label": "contract iOVM_StateTransitioner", "numberOfBytes": "20" }, - "t_mapping(t_bytes32,t_contract(iOVM_StateTransitioner)11744)": { + "t_mapping(t_bytes32,t_contract(iOVM_StateTransitioner)12018)": { "encoding": "mapping", "key": "t_bytes32", "label": "mapping(bytes32 => contract iOVM_StateTransitioner)", "numberOfBytes": "32", - "value": "t_contract(iOVM_StateTransitioner)11744" + "value": "t_contract(iOVM_StateTransitioner)12018" } } } diff --git a/packages/contracts/deployments/mainnet/OVM_L1CrossDomainMessenger.json b/packages/contracts/deployments/mainnet/OVM_L1CrossDomainMessenger.json index 31613e3279549..db33aedb8462e 100644 --- a/packages/contracts/deployments/mainnet/OVM_L1CrossDomainMessenger.json +++ b/packages/contracts/deployments/mainnet/OVM_L1CrossDomainMessenger.json @@ -1,11 +1,82 @@ { - "address": "0xeec700E5a793e28B068537c7dd95d632B603440A", + "address": "0x598F2b19e983910529affAb7D219724a019339CC", "abi": [ { "inputs": [], "stateMutability": "nonpayable", "type": "constructor" }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes32", + "name": "msgHash", + "type": "bytes32" + } + ], + "name": "FailedRelayedMessage", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "_xDomainCalldataHash", + "type": "bytes32" + } + ], + "name": "MessageAllowed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "_xDomainCalldataHash", + "type": "bytes32" + } + ], + "name": "MessageBlocked", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "Paused", + "type": "event" + }, { "anonymous": false, "inputs": [ @@ -32,6 +103,64 @@ "name": "SentMessage", "type": "event" }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "Unpaused", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_xDomainCalldataHash", + "type": "bytes32" + } + ], + "name": "allowMessage", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_xDomainCalldataHash", + "type": "bytes32" + } + ], + "name": "blockMessage", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "name": "blockedMessages", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { @@ -71,6 +200,39 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "pause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "paused", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { @@ -189,6 +351,13 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [ { @@ -234,7 +403,7 @@ "outputs": [ { "internalType": "address", - "name": "_contract", + "name": "", "type": "address" } ], @@ -302,6 +471,19 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [], "name": "xDomainMessageSender", @@ -316,36 +498,52 @@ "type": "function" } ], - "transactionHash": "0x31cfc0b742da949835c646e3794868f9b08b5cb94abc2c2cb7cfe85b3c61e0f0", + "transactionHash": "0x47b0d51d9fe4e2e865817d3059ecfae9f4cf6d95ad3060ccd53e374ec2185fec", "receipt": { "to": null, - "from": "0x77C4c8f491e5ff22a2C0E18b005c3BA0Fe36c1Bc", - "contractAddress": "0xeec700E5a793e28B068537c7dd95d632B603440A", - "transactionIndex": 31, - "gasUsed": "2210921", + "from": "0xd033f09cB85621F98F7A84C64dB381ac16Eff818", + "contractAddress": "0x598F2b19e983910529affAb7D219724a019339CC", + "transactionIndex": 266, + "gasUsed": "2796916", "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0x31846ff21375847462837fe04a6b0b291b2324844daf51455488c49668a2f795", - "transactionHash": "0x31cfc0b742da949835c646e3794868f9b08b5cb94abc2c2cb7cfe85b3c61e0f0", + "blockHash": "0x86b6880928a67328d4b0d6db33534a245c0eb37f88f3eb72840f24e41bc9d0f5", + "transactionHash": "0x47b0d51d9fe4e2e865817d3059ecfae9f4cf6d95ad3060ccd53e374ec2185fec", "logs": [], - "blockNumber": 12207809, - "cumulativeGasUsed": "4015107", + "blockNumber": 12410826, + "cumulativeGasUsed": "12515038", "status": 1, "byzantium": true }, "args": [], - "solcInputHash": "43ee6bb8ef92595aa6d0e22a6c464dff", - "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"msgHash\",\"type\":\"bytes32\"}],\"name\":\"RelayedMessage\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"}],\"name\":\"SentMessage\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"messageNonce\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_sender\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_message\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"_messageNonce\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"stateRootBatchHeader\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"siblings\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct Lib_OVMCodec.ChainInclusionProof\",\"name\":\"stateRootProof\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"stateTrieWitness\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"storageTrieWitness\",\"type\":\"bytes\"}],\"internalType\":\"struct iOVM_L1CrossDomainMessenger.L2MessageInclusionProof\",\"name\":\"_proof\",\"type\":\"tuple\"}],\"name\":\"relayMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"relayedMessages\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_sender\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_message\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"_messageNonce\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"_gasLimit\",\"type\":\"uint32\"}],\"name\":\"replayMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"_contract\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_message\",\"type\":\"bytes\"},{\"internalType\":\"uint32\",\"name\":\"_gasLimit\",\"type\":\"uint32\"}],\"name\":\"sendMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"sentMessages\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"successfulMessages\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"xDomainMessageSender\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The L1 Cross Domain Messenger contract sends messages from L1 to L2, and relays messages from L2 onto L1. In the event that a message sent from L1 to L2 is rejected for exceeding the L2 epoch gas limit, it can be resubmitted via this contract's replay function. Compiler used: solc Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"initialize(address)\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\"}},\"relayMessage(address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))\":{\"params\":{\"_message\":\"Message to send to the target.\",\"_messageNonce\":\"Nonce for the provided message.\",\"_proof\":\"Inclusion proof for the given message.\",\"_sender\":\"Message sender address.\",\"_target\":\"Target contract address.\"}},\"replayMessage(address,address,bytes,uint256,uint32)\":{\"params\":{\"_gasLimit\":\"Gas limit for the provided message.\",\"_message\":\"Message to send to the target.\",\"_messageNonce\":\"Nonce for the provided message.\",\"_sender\":\"Original sender address.\",\"_target\":\"Target contract address.\"}},\"sendMessage(address,bytes,uint32)\":{\"params\":{\"_gasLimit\":\"Gas limit for the provided message.\",\"_message\":\"Message to send to the target.\",\"_target\":\"Target contract address.\"}}},\"title\":\"OVM_L1CrossDomainMessenger\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"constructor\":{\"notice\":\"Pass a default zero address to the address resolver. This will be updated when initialized.\"},\"relayMessage(address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))\":{\"notice\":\"Relays a cross domain message to a contract.\"},\"replayMessage(address,address,bytes,uint256,uint32)\":{\"notice\":\"Replays a cross domain message to the target messenger.\"},\"sendMessage(address,bytes,uint32)\":{\"notice\":\"Sends a cross domain message to the target messenger.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1CrossDomainMessenger.sol\":\"OVM_L1CrossDomainMessenger\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/optimistic-ethereum/OVM/bridge/messaging/Abs_BaseCrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Interface Imports */\\nimport { iAbs_BaseCrossDomainMessenger } from \\\"../../../iOVM/bridge/messaging/iAbs_BaseCrossDomainMessenger.sol\\\";\\n\\n/* Library Imports */\\nimport { Lib_ReentrancyGuard } from \\\"../../../libraries/utils/Lib_ReentrancyGuard.sol\\\";\\n\\n/**\\n * @title Abs_BaseCrossDomainMessenger\\n * @dev The Base Cross Domain Messenger is an abstract contract providing the interface and common functionality used in the\\n * L1 and L2 Cross Domain Messengers. It can also serve as a template for developers wishing to implement a custom bridge \\n * contract to suit their needs.\\n *\\n * Compiler used: defined by child contract\\n * Runtime target: defined by child contract\\n */\\nabstract contract Abs_BaseCrossDomainMessenger is iAbs_BaseCrossDomainMessenger, Lib_ReentrancyGuard {\\n /**************\\n * Constants *\\n **************/\\n\\n // The default x-domain message sender being set to a non-zero value makes\\n // deployment a bit more expensive, but in exchange the refund on every call to\\n // `relayMessage` by the L1 and L2 messengers will be higher.\\n address internal constant DEFAULT_XDOMAIN_SENDER = 0x000000000000000000000000000000000000dEaD;\\n\\n /**********************\\n * Contract Variables *\\n **********************/\\n\\n mapping (bytes32 => bool) public relayedMessages;\\n mapping (bytes32 => bool) public successfulMessages;\\n mapping (bytes32 => bool) public sentMessages;\\n uint256 public messageNonce;\\n address internal xDomainMsgSender = DEFAULT_XDOMAIN_SENDER;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n constructor() Lib_ReentrancyGuard() {}\\n\\n function xDomainMessageSender() public override view returns (address) {\\n require(xDomainMsgSender != DEFAULT_XDOMAIN_SENDER, \\\"xDomainMessageSender is not set\\\");\\n return xDomainMsgSender;\\n }\\n\\n /**\\n * Sends a cross domain message to the target messenger.\\n * @param _target Target contract address.\\n * @param _message Message to send to the target.\\n * @param _gasLimit Gas limit for the provided message.\\n */\\n function sendMessage(\\n address _target,\\n bytes memory _message,\\n uint32 _gasLimit\\n )\\n override\\n public\\n {\\n bytes memory xDomainCalldata = _getXDomainCalldata(\\n _target,\\n msg.sender,\\n _message,\\n messageNonce\\n );\\n\\n messageNonce += 1;\\n sentMessages[keccak256(xDomainCalldata)] = true;\\n\\n _sendXDomainMessage(xDomainCalldata, _gasLimit);\\n emit SentMessage(xDomainCalldata);\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Generates the correct cross domain calldata for a message.\\n * @param _target Target contract address.\\n * @param _sender Message sender address.\\n * @param _message Message to send to the target.\\n * @param _messageNonce Nonce for the provided message.\\n * @return ABI encoded cross domain calldata.\\n */\\n function _getXDomainCalldata(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _messageNonce\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return abi.encodeWithSignature(\\n \\\"relayMessage(address,address,bytes,uint256)\\\",\\n _target,\\n _sender,\\n _message,\\n _messageNonce\\n );\\n }\\n\\n /**\\n * Sends a cross domain message.\\n * param // Message to send.\\n * param // Gas limit for the provided message.\\n */\\n function _sendXDomainMessage(\\n bytes memory, // _message,\\n uint256 // _gasLimit\\n )\\n virtual\\n internal\\n {\\n revert(\\\"Implement me in child contracts!\\\");\\n }\\n}\\n\",\"keccak256\":\"0xe6fa23a72685870720dcc4c2b4b6ff7f40aec284c3e1a02251f2369703a87260\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1CrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../../libraries/resolver/Lib_AddressResolver.sol\\\";\\nimport { Lib_AddressManager } from \\\"../../../libraries/resolver/Lib_AddressManager.sol\\\";\\nimport { Lib_SecureMerkleTrie } from \\\"../../../libraries/trie/Lib_SecureMerkleTrie.sol\\\";\\nimport { Lib_ReentrancyGuard } from \\\"../../../libraries/utils/Lib_ReentrancyGuard.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_L1CrossDomainMessenger } from \\\"../../../iOVM/bridge/messaging/iOVM_L1CrossDomainMessenger.sol\\\";\\nimport { iOVM_CanonicalTransactionChain } from \\\"../../../iOVM/chain/iOVM_CanonicalTransactionChain.sol\\\";\\nimport { iOVM_StateCommitmentChain } from \\\"../../../iOVM/chain/iOVM_StateCommitmentChain.sol\\\";\\n\\n/* Contract Imports */\\nimport { Abs_BaseCrossDomainMessenger } from \\\"./Abs_BaseCrossDomainMessenger.sol\\\";\\n\\n/**\\n * @title OVM_L1CrossDomainMessenger\\n * @dev The L1 Cross Domain Messenger contract sends messages from L1 to L2, and relays messages from L2 onto L1.\\n * In the event that a message sent from L1 to L2 is rejected for exceeding the L2 epoch gas limit, it can be resubmitted\\n * via this contract's replay function.\\n *\\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract OVM_L1CrossDomainMessenger is iOVM_L1CrossDomainMessenger, Abs_BaseCrossDomainMessenger, Lib_AddressResolver {\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * Pass a default zero address to the address resolver. This will be updated when initialized.\\n */\\n constructor()\\n Lib_AddressResolver(address(0))\\n {}\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n */\\n function initialize(\\n address _libAddressManager\\n )\\n public\\n {\\n require(address(libAddressManager) == address(0), \\\"L1CrossDomainMessenger already intialized.\\\");\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n xDomainMsgSender = DEFAULT_XDOMAIN_SENDER;\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n /**\\n * Modifier to enforce that, if configured, only the OVM_L2MessageRelayer contract may successfully call a method.\\n */\\n modifier onlyRelayer() {\\n address relayer = resolve(\\\"OVM_L2MessageRelayer\\\");\\n if (relayer != address(0)) {\\n require(\\n msg.sender == relayer,\\n \\\"Only OVM_L2MessageRelayer can relay L2-to-L1 messages.\\\"\\n );\\n }\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Relays a cross domain message to a contract.\\n * @inheritdoc iOVM_L1CrossDomainMessenger\\n */\\n function relayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _messageNonce,\\n L2MessageInclusionProof memory _proof\\n )\\n override\\n public\\n nonReentrant\\n onlyRelayer()\\n {\\n bytes memory xDomainCalldata = _getXDomainCalldata(\\n _target,\\n _sender,\\n _message,\\n _messageNonce\\n );\\n\\n require(\\n _verifyXDomainMessage(\\n xDomainCalldata,\\n _proof\\n ) == true,\\n \\\"Provided message could not be verified.\\\"\\n );\\n\\n bytes32 xDomainCalldataHash = keccak256(xDomainCalldata);\\n\\n require(\\n successfulMessages[xDomainCalldataHash] == false,\\n \\\"Provided message has already been received.\\\"\\n );\\n\\n xDomainMsgSender = _sender;\\n (bool success, ) = _target.call(_message);\\n xDomainMsgSender = DEFAULT_XDOMAIN_SENDER;\\n\\n // Mark the message as received if the call was successful. Ensures that a message can be\\n // relayed multiple times in the case that the call reverted.\\n if (success == true) {\\n successfulMessages[xDomainCalldataHash] = true;\\n emit RelayedMessage(xDomainCalldataHash);\\n }\\n\\n // Store an identifier that can be used to prove that the given message was relayed by some\\n // user. Gives us an easy way to pay relayers for their work.\\n bytes32 relayId = keccak256(\\n abi.encodePacked(\\n xDomainCalldata,\\n msg.sender,\\n block.number\\n )\\n );\\n relayedMessages[relayId] = true;\\n }\\n\\n /**\\n * Replays a cross domain message to the target messenger.\\n * @inheritdoc iOVM_L1CrossDomainMessenger\\n */\\n function replayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _messageNonce,\\n uint32 _gasLimit\\n )\\n override\\n public\\n {\\n bytes memory xDomainCalldata = _getXDomainCalldata(\\n _target,\\n _sender,\\n _message,\\n _messageNonce\\n );\\n\\n require(\\n sentMessages[keccak256(xDomainCalldata)] == true,\\n \\\"Provided message has not already been sent.\\\"\\n );\\n\\n _sendXDomainMessage(xDomainCalldata, _gasLimit);\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Verifies that the given message is valid.\\n * @param _xDomainCalldata Calldata to verify.\\n * @param _proof Inclusion proof for the message.\\n * @return Whether or not the provided message is valid.\\n */\\n function _verifyXDomainMessage(\\n bytes memory _xDomainCalldata,\\n L2MessageInclusionProof memory _proof\\n )\\n internal\\n view\\n returns (\\n bool\\n )\\n {\\n return (\\n _verifyStateRootProof(_proof)\\n && _verifyStorageProof(_xDomainCalldata, _proof)\\n );\\n }\\n\\n /**\\n * Verifies that the state root within an inclusion proof is valid.\\n * @param _proof Message inclusion proof.\\n * @return Whether or not the provided proof is valid.\\n */\\n function _verifyStateRootProof(\\n L2MessageInclusionProof memory _proof\\n )\\n internal\\n view\\n returns (\\n bool\\n )\\n {\\n iOVM_StateCommitmentChain ovmStateCommitmentChain = iOVM_StateCommitmentChain(resolve(\\\"OVM_StateCommitmentChain\\\"));\\n\\n return (\\n ovmStateCommitmentChain.insideFraudProofWindow(_proof.stateRootBatchHeader) == false\\n && ovmStateCommitmentChain.verifyStateCommitment(\\n _proof.stateRoot,\\n _proof.stateRootBatchHeader,\\n _proof.stateRootProof\\n )\\n );\\n }\\n\\n /**\\n * Verifies that the storage proof within an inclusion proof is valid.\\n * @param _xDomainCalldata Encoded message calldata.\\n * @param _proof Message inclusion proof.\\n * @return Whether or not the provided proof is valid.\\n */\\n function _verifyStorageProof(\\n bytes memory _xDomainCalldata,\\n L2MessageInclusionProof memory _proof\\n )\\n internal\\n view\\n returns (\\n bool\\n )\\n {\\n bytes32 storageKey = keccak256(\\n abi.encodePacked(\\n keccak256(\\n abi.encodePacked(\\n _xDomainCalldata,\\n resolve(\\\"OVM_L2CrossDomainMessenger\\\")\\n )\\n ),\\n uint256(0)\\n )\\n );\\n\\n (\\n bool exists,\\n bytes memory encodedMessagePassingAccount\\n ) = Lib_SecureMerkleTrie.get(\\n abi.encodePacked(0x4200000000000000000000000000000000000000),\\n _proof.stateTrieWitness,\\n _proof.stateRoot\\n );\\n\\n require(\\n exists == true,\\n \\\"Message passing predeploy has not been initialized or invalid proof provided.\\\"\\n );\\n\\n Lib_OVMCodec.EVMAccount memory account = Lib_OVMCodec.decodeEVMAccount(\\n encodedMessagePassingAccount\\n );\\n\\n return Lib_SecureMerkleTrie.verifyInclusionProof(\\n abi.encodePacked(storageKey),\\n abi.encodePacked(uint8(1)),\\n _proof.storageTrieWitness,\\n account.storageRoot\\n );\\n }\\n\\n /**\\n * Sends a cross domain message.\\n * @param _message Message to send.\\n * @param _gasLimit OVM gas limit for the message.\\n */\\n function _sendXDomainMessage(\\n bytes memory _message,\\n uint256 _gasLimit\\n )\\n override\\n internal\\n {\\n iOVM_CanonicalTransactionChain(resolve(\\\"OVM_CanonicalTransactionChain\\\")).enqueue(\\n resolve(\\\"OVM_L2CrossDomainMessenger\\\"),\\n _gasLimit,\\n _message\\n );\\n }\\n}\\n\",\"keccak256\":\"0xf1ffb01c7274d1fde7713cc1e6c5ee5c77edfb0849b94d34a7ac0c26d795c478\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/bridge/messaging/iAbs_BaseCrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/**\\n * @title iAbs_BaseCrossDomainMessenger\\n */\\ninterface iAbs_BaseCrossDomainMessenger {\\n\\n /**********\\n * Events *\\n **********/\\n event SentMessage(bytes message);\\n event RelayedMessage(bytes32 msgHash);\\n\\n /**********************\\n * Contract Variables *\\n **********************/\\n function xDomainMessageSender() external view returns (address);\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sends a cross domain message to the target messenger.\\n * @param _target Target contract address.\\n * @param _message Message to send to the target.\\n * @param _gasLimit Gas limit for the provided message.\\n */\\n function sendMessage(\\n address _target,\\n bytes calldata _message,\\n uint32 _gasLimit\\n ) external;\\n}\\n\",\"keccak256\":\"0xc2bd6b373daae2ede34281f4be5938d02b9d1cfb056b40d65ff70b7f16ce3c86\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/bridge/messaging/iOVM_L1CrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { iAbs_BaseCrossDomainMessenger } from \\\"./iAbs_BaseCrossDomainMessenger.sol\\\";\\n\\n/**\\n * @title iOVM_L1CrossDomainMessenger\\n */\\ninterface iOVM_L1CrossDomainMessenger is iAbs_BaseCrossDomainMessenger {\\n\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n struct L2MessageInclusionProof {\\n bytes32 stateRoot;\\n Lib_OVMCodec.ChainBatchHeader stateRootBatchHeader;\\n Lib_OVMCodec.ChainInclusionProof stateRootProof;\\n bytes stateTrieWitness;\\n bytes storageTrieWitness;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Relays a cross domain message to a contract.\\n * @param _target Target contract address.\\n * @param _sender Message sender address.\\n * @param _message Message to send to the target.\\n * @param _messageNonce Nonce for the provided message.\\n * @param _proof Inclusion proof for the given message.\\n */\\n function relayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _messageNonce,\\n L2MessageInclusionProof memory _proof\\n ) external;\\n\\n /**\\n * Replays a cross domain message to the target messenger.\\n * @param _target Target contract address.\\n * @param _sender Original sender address.\\n * @param _message Message to send to the target.\\n * @param _messageNonce Nonce for the provided message.\\n * @param _gasLimit Gas limit for the provided message.\\n */\\n function replayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _messageNonce,\\n uint32 _gasLimit\\n ) external;\\n}\\n\",\"keccak256\":\"0xdcd239d0b215e400674d78e8db4ac12ba18efc34fa78e24c2ff867f61062dba2\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_CanonicalTransactionChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_ChainStorageContainer } from \\\"./iOVM_ChainStorageContainer.sol\\\";\\n\\n/**\\n * @title iOVM_CanonicalTransactionChain\\n */\\ninterface iOVM_CanonicalTransactionChain {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event TransactionEnqueued(\\n address _l1TxOrigin,\\n address _target,\\n uint256 _gasLimit,\\n bytes _data,\\n uint256 _queueIndex,\\n uint256 _timestamp\\n );\\n\\n event QueueBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event SequencerBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event TransactionBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct BatchContext {\\n uint256 numSequencedTransactions;\\n uint256 numSubsequentQueueTransactions;\\n uint256 timestamp;\\n uint256 blockNumber;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n\\n /**\\n * Accesses the batch storage container.\\n * @return Reference to the batch storage container.\\n */\\n function batches()\\n external\\n view\\n returns (\\n iOVM_ChainStorageContainer\\n );\\n\\n /**\\n * Accesses the queue storage container.\\n * @return Reference to the queue storage container.\\n */\\n function queue()\\n external\\n view\\n returns (\\n iOVM_ChainStorageContainer\\n );\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements()\\n external\\n view\\n returns (\\n uint256 _totalElements\\n );\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches()\\n external\\n view\\n returns (\\n uint256 _totalBatches\\n );\\n\\n /**\\n * Returns the index of the next element to be enqueued.\\n * @return Index for the next queue element.\\n */\\n function getNextQueueIndex()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Gets the queue element at a particular index.\\n * @param _index Index of the queue element to access.\\n * @return _element Queue element at the given index.\\n */\\n function getQueueElement(\\n uint256 _index\\n )\\n external\\n view\\n returns (\\n Lib_OVMCodec.QueueElement memory _element\\n );\\n\\n /**\\n * Returns the timestamp of the last transaction.\\n * @return Timestamp for the last transaction.\\n */\\n function getLastTimestamp()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Returns the blocknumber of the last transaction.\\n * @return Blocknumber for the last transaction.\\n */\\n function getLastBlockNumber()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Get the number of queue elements which have not yet been included.\\n * @return Number of pending queue elements.\\n */\\n function getNumPendingQueueElements()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Retrieves the length of the queue, including\\n * both pending and canonical transactions.\\n * @return Length of the queue.\\n */\\n function getQueueLength()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n\\n /**\\n * Adds a transaction to the queue.\\n * @param _target Target contract to send the transaction to.\\n * @param _gasLimit Gas limit for the given transaction.\\n * @param _data Transaction data.\\n */\\n function enqueue(\\n address _target,\\n uint256 _gasLimit,\\n bytes memory _data\\n )\\n external;\\n\\n /**\\n * Appends a given number of queued transactions as a single batch.\\n * @param _numQueuedTransactions Number of transactions to append.\\n */\\n function appendQueueBatch(\\n uint256 _numQueuedTransactions\\n )\\n external;\\n\\n /**\\n * Allows the sequencer to append a batch of transactions.\\n * @dev This function uses a custom encoding scheme for efficiency reasons.\\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\\n * .param _contexts Array of batch contexts.\\n * .param _transactionDataFields Array of raw transaction data.\\n */\\n function appendSequencerBatch(\\n // uint40 _shouldStartAtElement,\\n // uint24 _totalElementsToAppend,\\n // BatchContext[] _contexts,\\n // bytes[] _transactionDataFields\\n )\\n external;\\n\\n /**\\n * Verifies whether a transaction is included in the chain.\\n * @param _transaction Transaction to verify.\\n * @param _txChainElement Transaction chain element corresponding to the transaction.\\n * @param _batchHeader Header of the batch the transaction was included in.\\n * @param _inclusionProof Inclusion proof for the provided transaction chain element.\\n * @return True if the transaction exists in the CTC, false if not.\\n */\\n function verifyTransaction(\\n Lib_OVMCodec.Transaction memory _transaction,\\n Lib_OVMCodec.TransactionChainElement memory _txChainElement,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _inclusionProof\\n )\\n external\\n view\\n returns (\\n bool\\n );\\n}\\n\",\"keccak256\":\"0xb5e55488a1982841c07cdf5ff475da4789596f111dd48f01b1918ee4c775cf3a\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_ChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title iOVM_ChainStorageContainer\\n */\\ninterface iOVM_ChainStorageContainer {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata()\\n external\\n view\\n returns (\\n bytes27\\n );\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length()\\n external\\n view\\n returns (\\n uint256\\n );\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(\\n bytes32 _object\\n )\\n external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(\\n bytes32 _object,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(\\n uint256 _index\\n )\\n external\\n view\\n returns (\\n bytes32\\n );\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index\\n )\\n external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Marks an index as overwritable, meaing the underlying buffer can start to write values over\\n * any objects before and including the given index.\\n */\\n function setNextOverwritableIndex(\\n uint256 _index\\n )\\n external;\\n}\\n\",\"keccak256\":\"0x2d7973a0ad84c23ec62624d3f1e3aeb198cc72686ff1e6cfa17155556b320c94\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_StateCommitmentChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title iOVM_StateCommitmentChain\\n */\\ninterface iOVM_StateCommitmentChain {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event StateBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n event StateBatchDeleted(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot\\n );\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements()\\n external\\n view\\n returns (\\n uint256 _totalElements\\n );\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches()\\n external\\n view\\n returns (\\n uint256 _totalBatches\\n );\\n\\n /**\\n * Retrieves the timestamp of the last batch submitted by the sequencer.\\n * @return _lastSequencerTimestamp Last sequencer batch timestamp.\\n */\\n function getLastSequencerTimestamp()\\n external\\n view\\n returns (\\n uint256 _lastSequencerTimestamp\\n );\\n\\n /**\\n * Appends a batch of state roots to the chain.\\n * @param _batch Batch of state roots.\\n * @param _shouldStartAtElement Index of the element at which this batch should start.\\n */\\n function appendStateBatch(\\n bytes32[] calldata _batch,\\n uint256 _shouldStartAtElement\\n )\\n external;\\n\\n /**\\n * Deletes all state roots after (and including) a given batch.\\n * @param _batchHeader Header of the batch to start deleting from.\\n */\\n function deleteStateBatch(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n external;\\n\\n /**\\n * Verifies a batch inclusion proof.\\n * @param _element Hash of the element to verify a proof for.\\n * @param _batchHeader Header of the batch in which the element was included.\\n * @param _proof Merkle inclusion proof for the element.\\n */\\n function verifyStateCommitment(\\n bytes32 _element,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _proof\\n )\\n external\\n view\\n returns (\\n bool _verified\\n );\\n\\n /**\\n * Checks whether a given batch is still inside its fraud proof window.\\n * @param _batchHeader Header of the batch to check.\\n * @return _inside Whether or not the batch is inside the fraud proof window.\\n */\\n function insideFraudProofWindow(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n external\\n view\\n returns (\\n bool _inside\\n );\\n}\\n\",\"keccak256\":\"0x6646d6ff392b81aab52a7a277e91540819464751de0af5afd1962094b2e92448\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/codec/Lib_OVMCodec.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../utils/Lib_Bytes32Utils.sol\\\";\\nimport { Lib_SafeExecutionManagerWrapper } from \\\"../../libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\\\";\\n\\n/**\\n * @title Lib_OVMCodec\\n */\\nlibrary Lib_OVMCodec {\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum EOASignatureType {\\n EIP155_TRANSACTION,\\n ETH_SIGNED_MESSAGE\\n }\\n\\n enum QueueOrigin {\\n SEQUENCER_QUEUE,\\n L1TOL2_QUEUE\\n }\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Account {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n address ethAddress;\\n bool isFresh;\\n }\\n\\n struct EVMAccount {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n }\\n\\n struct ChainBatchHeader {\\n uint256 batchIndex;\\n bytes32 batchRoot;\\n uint256 batchSize;\\n uint256 prevTotalElements;\\n bytes extraData;\\n }\\n\\n struct ChainInclusionProof {\\n uint256 index;\\n bytes32[] siblings;\\n }\\n\\n struct Transaction {\\n uint256 timestamp;\\n uint256 blockNumber;\\n QueueOrigin l1QueueOrigin;\\n address l1TxOrigin;\\n address entrypoint;\\n uint256 gasLimit;\\n bytes data;\\n }\\n\\n struct TransactionChainElement {\\n bool isSequenced;\\n uint256 queueIndex; // QUEUED TX ONLY\\n uint256 timestamp; // SEQUENCER TX ONLY\\n uint256 blockNumber; // SEQUENCER TX ONLY\\n bytes txData; // SEQUENCER TX ONLY\\n }\\n\\n struct QueueElement {\\n bytes32 transactionHash;\\n uint40 timestamp;\\n uint40 blockNumber;\\n }\\n\\n struct EIP155Transaction {\\n uint256 nonce;\\n uint256 gasPrice;\\n uint256 gasLimit;\\n address to;\\n uint256 value;\\n bytes data;\\n uint256 chainId;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Decodes an EOA transaction (i.e., native Ethereum RLP encoding).\\n * @param _transaction Encoded EOA transaction.\\n * @return Transaction decoded into a struct.\\n */\\n function decodeEIP155Transaction(\\n bytes memory _transaction,\\n bool _isEthSignedMessage\\n )\\n internal\\n pure\\n returns (\\n EIP155Transaction memory\\n )\\n {\\n if (_isEthSignedMessage) {\\n (\\n uint256 _nonce,\\n uint256 _gasLimit,\\n uint256 _gasPrice,\\n uint256 _chainId,\\n address _to,\\n bytes memory _data\\n ) = abi.decode(\\n _transaction,\\n (uint256, uint256, uint256, uint256, address ,bytes)\\n );\\n return EIP155Transaction({\\n nonce: _nonce,\\n gasPrice: _gasPrice,\\n gasLimit: _gasLimit,\\n to: _to,\\n value: 0,\\n data: _data,\\n chainId: _chainId\\n });\\n } else {\\n Lib_RLPReader.RLPItem[] memory decoded = Lib_RLPReader.readList(_transaction);\\n\\n return EIP155Transaction({\\n nonce: Lib_RLPReader.readUint256(decoded[0]),\\n gasPrice: Lib_RLPReader.readUint256(decoded[1]),\\n gasLimit: Lib_RLPReader.readUint256(decoded[2]),\\n to: Lib_RLPReader.readAddress(decoded[3]),\\n value: Lib_RLPReader.readUint256(decoded[4]),\\n data: Lib_RLPReader.readBytes(decoded[5]),\\n chainId: Lib_RLPReader.readUint256(decoded[6])\\n });\\n }\\n }\\n\\n /**\\n * Decompresses a compressed EIP155 transaction.\\n * @param _transaction Compressed EIP155 transaction bytes.\\n * @return Transaction parsed into a struct.\\n */\\n function decompressEIP155Transaction(\\n bytes memory _transaction\\n )\\n internal\\n returns (\\n EIP155Transaction memory\\n )\\n {\\n return EIP155Transaction({\\n gasLimit: Lib_BytesUtils.toUint24(_transaction, 0),\\n gasPrice: uint256(Lib_BytesUtils.toUint24(_transaction, 3)) * 1000000,\\n nonce: Lib_BytesUtils.toUint24(_transaction, 6),\\n to: Lib_BytesUtils.toAddress(_transaction, 9),\\n data: Lib_BytesUtils.slice(_transaction, 29),\\n chainId: Lib_SafeExecutionManagerWrapper.safeCHAINID(),\\n value: 0\\n });\\n }\\n\\n /**\\n * Encodes an EOA transaction back into the original transaction.\\n * @param _transaction EIP155transaction to encode.\\n * @param _isEthSignedMessage Whether or not this was an eth signed message.\\n * @return Encoded transaction.\\n */\\n function encodeEIP155Transaction(\\n EIP155Transaction memory _transaction,\\n bool _isEthSignedMessage\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n if (_isEthSignedMessage) {\\n return abi.encode(\\n _transaction.nonce,\\n _transaction.gasLimit,\\n _transaction.gasPrice,\\n _transaction.chainId,\\n _transaction.to,\\n _transaction.data\\n );\\n } else {\\n bytes[] memory raw = new bytes[](9);\\n\\n raw[0] = Lib_RLPWriter.writeUint(_transaction.nonce);\\n raw[1] = Lib_RLPWriter.writeUint(_transaction.gasPrice);\\n raw[2] = Lib_RLPWriter.writeUint(_transaction.gasLimit);\\n if (_transaction.to == address(0)) {\\n raw[3] = Lib_RLPWriter.writeBytes('');\\n } else {\\n raw[3] = Lib_RLPWriter.writeAddress(_transaction.to);\\n }\\n raw[4] = Lib_RLPWriter.writeUint(0);\\n raw[5] = Lib_RLPWriter.writeBytes(_transaction.data);\\n raw[6] = Lib_RLPWriter.writeUint(_transaction.chainId);\\n raw[7] = Lib_RLPWriter.writeBytes(bytes(''));\\n raw[8] = Lib_RLPWriter.writeBytes(bytes(''));\\n\\n return Lib_RLPWriter.writeList(raw);\\n }\\n }\\n\\n /**\\n * Encodes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Encoded transaction bytes.\\n */\\n function encodeTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return abi.encodePacked(\\n _transaction.timestamp,\\n _transaction.blockNumber,\\n _transaction.l1QueueOrigin,\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n );\\n }\\n\\n /**\\n * Hashes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Hashed transaction\\n */\\n function hashTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(encodeTransaction(_transaction));\\n }\\n\\n /**\\n * Converts an OVM account to an EVM account.\\n * @param _in OVM account to convert.\\n * @return Converted EVM account.\\n */\\n function toEVMAccount(\\n Account memory _in\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n return EVMAccount({\\n nonce: _in.nonce,\\n balance: _in.balance,\\n storageRoot: _in.storageRoot,\\n codeHash: _in.codeHash\\n });\\n }\\n\\n /**\\n * @notice RLP-encodes an account state struct.\\n * @param _account Account state struct.\\n * @return RLP-encoded account state.\\n */\\n function encodeEVMAccount(\\n EVMAccount memory _account\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes[] memory raw = new bytes[](4);\\n\\n // Unfortunately we can't create this array outright because\\n // Lib_RLPWriter.writeList will reject fixed-size arrays. Assigning\\n // index-by-index circumvents this issue.\\n raw[0] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.nonce)\\n )\\n );\\n raw[1] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.balance)\\n )\\n );\\n raw[2] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.storageRoot));\\n raw[3] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.codeHash));\\n\\n return Lib_RLPWriter.writeList(raw);\\n }\\n\\n /**\\n * @notice Decodes an RLP-encoded account state into a useful struct.\\n * @param _encoded RLP-encoded account state.\\n * @return Account state struct.\\n */\\n function decodeEVMAccount(\\n bytes memory _encoded\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\\n\\n return EVMAccount({\\n nonce: Lib_RLPReader.readUint256(accountState[0]),\\n balance: Lib_RLPReader.readUint256(accountState[1]),\\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\\n });\\n }\\n\\n /**\\n * Calculates a hash for a given batch header.\\n * @param _batchHeader Header to hash.\\n * @return Hash of the header.\\n */\\n function hashBatchHeader(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(\\n abi.encode(\\n _batchHeader.batchRoot,\\n _batchHeader.batchSize,\\n _batchHeader.prevTotalElements,\\n _batchHeader.extraData\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0xe7e518ba7bba3fa28c532f8902576c1bb4dfc1ec4b62bed6da50623248ba17c3\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Contract Imports */\\nimport { Ownable } from \\\"./Lib_Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n /*******************************************\\n * Contract Variables: Internal Accounting *\\n *******************************************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n public\\n onlyOwner\\n {\\n emit AddressSet(_name, _address);\\n addresses[_getNameHash(_name)] = _address;\\n }\\n\\n function getAddress(\\n string memory _name\\n )\\n public\\n view\\n returns (address)\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32 _hash\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0x3a490595cc21ff170e4027843093670ff845d5972481fbfb956b722ea564bb06\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n\\n /*******************************************\\n * Contract Variables: Contract References *\\n *******************************************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(\\n address _libAddressManager\\n ) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function resolve(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address _contract\\n )\\n {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0xaa3ed342f6deb156c660fd83afa579a3b80db17eb465e8949cf5c1b114780143\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Ownable\\n * @dev Adapted from https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol\\n */\\nabstract contract Ownable {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n address public owner;\\n\\n\\n /**********\\n * Events *\\n **********/\\n\\n event OwnershipTransferred(\\n address indexed previousOwner,\\n address indexed newOwner\\n );\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n constructor() {\\n owner = msg.sender;\\n emit OwnershipTransferred(address(0), owner);\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n owner == msg.sender,\\n \\\"Ownable: caller is not the owner\\\"\\n );\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function renounceOwnership()\\n public\\n virtual\\n onlyOwner\\n {\\n emit OwnershipTransferred(owner, address(0));\\n owner = address(0);\\n }\\n\\n function transferOwnership(address _newOwner)\\n public\\n virtual\\n onlyOwner\\n {\\n require(\\n _newOwner != address(0),\\n \\\"Ownable: new owner cannot be the zero address\\\"\\n );\\n\\n emit OwnershipTransferred(owner, _newOwner);\\n owner = _newOwner;\\n }\\n}\\n\",\"keccak256\":\"0xd9dfd9264e5b5fedd53a5b10fdf179c3f367614b0fe69179bce4e45119f5b739\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPReader.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_RLPReader\\n * @dev Adapted from \\\"RLPReader\\\" by Hamdi Allam (hamdi.allam97@gmail.com).\\n */\\nlibrary Lib_RLPReader {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 constant internal MAX_LIST_LENGTH = 32;\\n\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum RLPItemType {\\n DATA_ITEM,\\n LIST_ITEM\\n }\\n\\n \\n /***********\\n * Structs *\\n ***********/\\n\\n struct RLPItem {\\n uint256 length;\\n uint256 ptr;\\n }\\n \\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n \\n /**\\n * Converts bytes to a reference to memory position and length.\\n * @param _in Input bytes to convert.\\n * @return Output memory reference.\\n */\\n function toRLPItem(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem memory\\n )\\n {\\n uint256 ptr;\\n assembly {\\n ptr := add(_in, 32)\\n }\\n\\n return RLPItem({\\n length: _in.length,\\n ptr: ptr\\n });\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n (\\n uint256 listOffset,\\n ,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.LIST_ITEM,\\n \\\"Invalid RLP list value.\\\"\\n );\\n\\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\\n // writing to the length. Since we can't know the number of RLP items without looping over\\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\\n // simply set a reasonable maximum list length and decrease the size before we finish.\\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\\n\\n uint256 itemCount = 0;\\n uint256 offset = listOffset;\\n while (offset < _in.length) {\\n require(\\n itemCount < MAX_LIST_LENGTH,\\n \\\"Provided RLP list exceeds max list length.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n ) = _decodeLength(RLPItem({\\n length: _in.length - offset,\\n ptr: _in.ptr + offset\\n }));\\n\\n out[itemCount] = RLPItem({\\n length: itemLength + itemOffset,\\n ptr: _in.ptr + offset\\n });\\n\\n itemCount += 1;\\n offset += itemOffset + itemLength;\\n }\\n\\n // Decrease the array size to match the actual item count.\\n assembly {\\n mstore(out, itemCount)\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n return readList(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes value.\\\"\\n );\\n\\n return _copy(_in.ptr, itemOffset, itemLength);\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return readBytes(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return string(readBytes(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return readString(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n require(\\n _in.length <= 33,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr + itemOffset;\\n bytes32 out;\\n assembly {\\n out := mload(ptr)\\n\\n // Shift the bytes over to match the item size.\\n if lt(itemLength, 32) {\\n out := div(out, exp(256, sub(32, itemLength)))\\n }\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return readBytes32(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return uint256(readBytes32(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return readUint256(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n require(\\n _in.length == 1,\\n \\\"Invalid RLP boolean value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 out;\\n assembly {\\n out := byte(0, mload(ptr))\\n }\\n\\n require(\\n out == 0 || out == 1,\\n \\\"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\\\"\\n );\\n\\n return out != 0;\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return readBool(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n if (_in.length == 1) {\\n return address(0);\\n }\\n\\n require(\\n _in.length == 21,\\n \\\"Invalid RLP address value.\\\"\\n );\\n\\n return address(readUint256(_in));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return readAddress(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads the raw bytes of an RLP item.\\n * @param _in RLP item to read.\\n * @return Raw RLP bytes.\\n */\\n function readRawBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in);\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Decodes the length of an RLP item.\\n * @param _in RLP item to decode.\\n * @return Offset of the encoded data.\\n * @return Length of the encoded data.\\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\\n */\\n function _decodeLength(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n uint256,\\n uint256,\\n RLPItemType\\n )\\n {\\n require(\\n _in.length > 0,\\n \\\"RLP item cannot be null.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 prefix;\\n assembly {\\n prefix := byte(0, mload(ptr))\\n }\\n\\n if (prefix <= 0x7f) {\\n // Single byte.\\n\\n return (0, 1, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xb7) {\\n // Short string.\\n\\n uint256 strLen = prefix - 0x80;\\n \\n require(\\n _in.length > strLen,\\n \\\"Invalid RLP short string.\\\"\\n );\\n\\n return (1, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xbf) {\\n // Long string.\\n uint256 lenOfStrLen = prefix - 0xb7;\\n\\n require(\\n _in.length > lenOfStrLen,\\n \\\"Invalid RLP long string length.\\\"\\n );\\n\\n uint256 strLen;\\n assembly {\\n // Pick out the string length.\\n strLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfStrLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfStrLen + strLen,\\n \\\"Invalid RLP long string.\\\"\\n );\\n\\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xf7) {\\n // Short list.\\n uint256 listLen = prefix - 0xc0;\\n\\n require(\\n _in.length > listLen,\\n \\\"Invalid RLP short list.\\\"\\n );\\n\\n return (1, listLen, RLPItemType.LIST_ITEM);\\n } else {\\n // Long list.\\n uint256 lenOfListLen = prefix - 0xf7;\\n\\n require(\\n _in.length > lenOfListLen,\\n \\\"Invalid RLP long list length.\\\"\\n );\\n\\n uint256 listLen;\\n assembly {\\n // Pick out the list length.\\n listLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfListLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfListLen + listLen,\\n \\\"Invalid RLP long list.\\\"\\n );\\n\\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\\n }\\n }\\n\\n /**\\n * Copies the bytes from a memory location.\\n * @param _src Pointer to the location to read from.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Copied bytes.\\n */\\n function _copy(\\n uint256 _src,\\n uint256 _offset,\\n uint256 _length\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out = new bytes(_length);\\n if (out.length == 0) {\\n return out;\\n }\\n\\n uint256 src = _src + _offset;\\n uint256 dest;\\n assembly {\\n dest := add(out, 32)\\n }\\n\\n // Copy over as many complete words as we can.\\n for (uint256 i = 0; i < _length / 32; i++) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n\\n src += 32;\\n dest += 32;\\n }\\n\\n // Pick out the remaining bytes.\\n uint256 mask = 256 ** (32 - (_length % 32)) - 1;\\n assembly {\\n mstore(\\n dest,\\n or(\\n and(mload(src), not(mask)),\\n and(mload(dest), mask)\\n )\\n )\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Copies an RLP item into bytes.\\n * @param _in RLP item to copy.\\n * @return Copied bytes.\\n */\\n function _copy(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in.ptr, 0, _in.length);\\n }\\n}\\n\",\"keccak256\":\"0xbdb8fae0ca2483b4cc07607a5070fc25e33c54b4e4462b99e7c0b13aac48a09b\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPWriter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\n\\n/**\\n * @title Lib_RLPWriter\\n * @author Bakaoh (with modifications)\\n */\\nlibrary Lib_RLPWriter {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * RLP encodes a byte string.\\n * @param _in The byte string to encode.\\n * @return _out The RLP encoded string in bytes.\\n */\\n function writeBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n bytes memory encoded;\\n\\n if (_in.length == 1 && uint8(_in[0]) < 128) {\\n encoded = _in;\\n } else {\\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * RLP encodes a list of RLP encoded byte byte strings.\\n * @param _in The list of RLP encoded byte strings.\\n * @return _out The RLP encoded list of items in bytes.\\n */\\n function writeList(\\n bytes[] memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n bytes memory list = _flatten(_in);\\n return abi.encodePacked(_writeLength(list.length, 192), list);\\n }\\n\\n /**\\n * RLP encodes a string.\\n * @param _in The string to encode.\\n * @return _out The RLP encoded string in bytes.\\n */\\n function writeString(\\n string memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(bytes(_in));\\n }\\n\\n /**\\n * RLP encodes an address.\\n * @param _in The address to encode.\\n * @return _out The RLP encoded address in bytes.\\n */\\n function writeAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a uint.\\n * @param _in The uint256 to encode.\\n * @return _out The RLP encoded uint256 in bytes.\\n */\\n function writeUint(\\n uint256 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(_toBinary(_in));\\n }\\n\\n /**\\n * RLP encodes a bool.\\n * @param _in The bool to encode.\\n * @return _out The RLP encoded bool in bytes.\\n */\\n function writeBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n bytes memory encoded = new bytes(1);\\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\\n return encoded;\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\\n * @param _len The length of the string or the payload.\\n * @param _offset 128 if item is string, 192 if item is list.\\n * @return _encoded RLP encoded bytes.\\n */\\n function _writeLength(\\n uint256 _len,\\n uint256 _offset\\n )\\n private\\n pure\\n returns (\\n bytes memory _encoded\\n )\\n {\\n bytes memory encoded;\\n\\n if (_len < 56) {\\n encoded = new bytes(1);\\n encoded[0] = byte(uint8(_len) + uint8(_offset));\\n } else {\\n uint256 lenLen;\\n uint256 i = 1;\\n while (_len / i != 0) {\\n lenLen++;\\n i *= 256;\\n }\\n\\n encoded = new bytes(lenLen + 1);\\n encoded[0] = byte(uint8(lenLen) + uint8(_offset) + 55);\\n for(i = 1; i <= lenLen; i++) {\\n encoded[i] = byte(uint8((_len / (256**(lenLen-i))) % 256));\\n }\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * Encode integer in big endian binary form with no leading zeroes.\\n * @notice TODO: This should be optimized with assembly to save gas costs.\\n * @param _x The integer to encode.\\n * @return _binary RLP encoded bytes.\\n */\\n function _toBinary(\\n uint256 _x\\n )\\n private\\n pure\\n returns (\\n bytes memory _binary\\n )\\n {\\n bytes memory b = abi.encodePacked(_x);\\n\\n uint256 i = 0;\\n for (; i < 32; i++) {\\n if (b[i] != 0) {\\n break;\\n }\\n }\\n\\n bytes memory res = new bytes(32 - i);\\n for (uint256 j = 0; j < res.length; j++) {\\n res[j] = b[i++];\\n }\\n\\n return res;\\n }\\n\\n /**\\n * Copies a piece of memory to another location.\\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\\n * @param _dest Destination location.\\n * @param _src Source location.\\n * @param _len Length of memory to copy.\\n */\\n function _memcpy(\\n uint256 _dest,\\n uint256 _src,\\n uint256 _len\\n )\\n private\\n pure\\n {\\n uint256 dest = _dest;\\n uint256 src = _src;\\n uint256 len = _len;\\n\\n for(; len >= 32; len -= 32) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n dest += 32;\\n src += 32;\\n }\\n\\n uint256 mask = 256 ** (32 - len) - 1;\\n assembly {\\n let srcpart := and(mload(src), not(mask))\\n let destpart := and(mload(dest), mask)\\n mstore(dest, or(destpart, srcpart))\\n }\\n }\\n\\n /**\\n * Flattens a list of byte strings into one byte string.\\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\\n * @param _list List of byte strings to flatten.\\n * @return _flattened The flattened byte string.\\n */\\n function _flatten(\\n bytes[] memory _list\\n )\\n private\\n pure\\n returns (\\n bytes memory _flattened\\n )\\n {\\n if (_list.length == 0) {\\n return new bytes(0);\\n }\\n\\n uint256 len;\\n uint256 i = 0;\\n for (; i < _list.length; i++) {\\n len += _list[i].length;\\n }\\n\\n bytes memory flattened = new bytes(len);\\n uint256 flattenedPtr;\\n assembly { flattenedPtr := add(flattened, 0x20) }\\n\\n for(i = 0; i < _list.length; i++) {\\n bytes memory item = _list[i];\\n\\n uint256 listPtr;\\n assembly { listPtr := add(item, 0x20)}\\n\\n _memcpy(flattenedPtr, listPtr, item.length);\\n flattenedPtr += _list[i].length;\\n }\\n\\n return flattened;\\n }\\n}\",\"keccak256\":\"0xbcb24619c1758cb0d9f3fe5c79495950045a9087046a02b9ce01df46ae09ae5b\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/trie/Lib_MerkleTrie.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\n\\n/**\\n * @title Lib_MerkleTrie\\n */\\nlibrary Lib_MerkleTrie {\\n\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n enum NodeType {\\n BranchNode,\\n ExtensionNode,\\n LeafNode\\n }\\n\\n struct TrieNode {\\n bytes encoded;\\n Lib_RLPReader.RLPItem[] decoded;\\n }\\n\\n\\n /**********************\\n * Contract Constants *\\n **********************/\\n\\n // TREE_RADIX determines the number of elements per branch node.\\n uint256 constant TREE_RADIX = 16;\\n // Branch nodes have TREE_RADIX elements plus an additional `value` slot.\\n uint256 constant BRANCH_NODE_LENGTH = TREE_RADIX + 1;\\n // Leaf nodes and extension nodes always have two elements, a `path` and a `value`.\\n uint256 constant LEAF_OR_EXTENSION_NODE_LENGTH = 2;\\n\\n // Prefixes are prepended to the `path` within a leaf or extension node and\\n // allow us to differentiate between the two node types. `ODD` or `EVEN` is\\n // determined by the number of nibbles within the unprefixed `path`. If the\\n // number of nibbles if even, we need to insert an extra padding nibble so\\n // the resulting prefixed `path` has an even number of nibbles.\\n uint8 constant PREFIX_EXTENSION_EVEN = 0;\\n uint8 constant PREFIX_EXTENSION_ODD = 1;\\n uint8 constant PREFIX_LEAF_EVEN = 2;\\n uint8 constant PREFIX_LEAF_ODD = 3;\\n\\n // Just a utility constant. RLP represents `NULL` as 0x80.\\n bytes1 constant RLP_NULL = bytes1(0x80);\\n bytes constant RLP_NULL_BYTES = hex'80';\\n bytes32 constant internal KECCAK256_RLP_NULL_BYTES = keccak256(RLP_NULL_BYTES);\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * @notice Verifies a proof that a given key/value pair is present in the\\n * Merkle trie.\\n * @param _key Key of the node to search for, as a hex string.\\n * @param _value Value of the node to search for, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the desired node. Unlike\\n * traditional Merkle trees, this proof is executed top-down and consists\\n * of a list of RLP-encoded nodes that make a path down to the target node.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _verified `true` if the k/v pair exists in the trie, `false` otherwise.\\n */\\n function verifyInclusionProof(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bool _verified\\n )\\n {\\n (\\n bool exists,\\n bytes memory value\\n ) = get(_key, _proof, _root);\\n\\n return (\\n exists && Lib_BytesUtils.equal(_value, value)\\n );\\n }\\n\\n /**\\n * @notice Verifies a proof that a given key is *not* present in\\n * the Merkle trie.\\n * @param _key Key of the node to search for, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\\n * target node.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _verified `true` if the key is absent in the trie, `false` otherwise.\\n */\\n function verifyExclusionProof(\\n bytes memory _key,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bool _verified\\n )\\n {\\n (\\n bool exists,\\n ) = get(_key, _proof, _root);\\n\\n return exists == false;\\n }\\n\\n /**\\n * @notice Updates a Merkle trie and returns a new root hash.\\n * @param _key Key of the node to update, as a hex string.\\n * @param _value Value of the node to update, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\\n * target node. If the key exists, we can simply update the value.\\n * Otherwise, we need to modify the trie to handle the new k/v pair.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _updatedRoot Root hash of the newly constructed trie.\\n */\\n function update(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bytes32 _updatedRoot\\n )\\n {\\n // Special case when inserting the very first node.\\n if (_root == KECCAK256_RLP_NULL_BYTES) {\\n return getSingleNodeRootHash(_key, _value);\\n }\\n\\n TrieNode[] memory proof = _parseProof(_proof);\\n (uint256 pathLength, bytes memory keyRemainder, ) = _walkNodePath(proof, _key, _root);\\n TrieNode[] memory newPath = _getNewPath(proof, pathLength, keyRemainder, _value);\\n\\n return _getUpdatedTrieRoot(newPath, _key);\\n }\\n\\n /**\\n * @notice Retrieves the value associated with a given key.\\n * @param _key Key to search for, as hex bytes.\\n * @param _proof Merkle trie inclusion proof for the key.\\n * @param _root Known root of the Merkle trie.\\n * @return _exists Whether or not the key exists.\\n * @return _value Value of the key if it exists.\\n */\\n function get(\\n bytes memory _key,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bool _exists,\\n bytes memory _value\\n )\\n {\\n TrieNode[] memory proof = _parseProof(_proof);\\n (uint256 pathLength, bytes memory keyRemainder, bool isFinalNode) = _walkNodePath(proof, _key, _root);\\n\\n bool exists = keyRemainder.length == 0;\\n\\n require(\\n exists || isFinalNode,\\n \\\"Provided proof is invalid.\\\"\\n );\\n\\n bytes memory value = exists ? _getNodeValue(proof[pathLength - 1]) : bytes('');\\n\\n return (\\n exists,\\n value\\n );\\n }\\n\\n /**\\n * Computes the root hash for a trie with a single node.\\n * @param _key Key for the single node.\\n * @param _value Value for the single node.\\n * @return _updatedRoot Hash of the trie.\\n */\\n function getSingleNodeRootHash(\\n bytes memory _key,\\n bytes memory _value\\n )\\n internal\\n pure\\n returns (\\n bytes32 _updatedRoot\\n )\\n {\\n return keccak256(_makeLeafNode(\\n Lib_BytesUtils.toNibbles(_key),\\n _value\\n ).encoded);\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * @notice Walks through a proof using a provided key.\\n * @param _proof Inclusion proof to walk through.\\n * @param _key Key to use for the walk.\\n * @param _root Known root of the trie.\\n * @return _pathLength Length of the final path\\n * @return _keyRemainder Portion of the key remaining after the walk.\\n * @return _isFinalNode Whether or not we've hit a dead end.\\n */\\n function _walkNodePath(\\n TrieNode[] memory _proof,\\n bytes memory _key,\\n bytes32 _root\\n )\\n private\\n pure\\n returns (\\n uint256 _pathLength,\\n bytes memory _keyRemainder,\\n bool _isFinalNode\\n )\\n {\\n uint256 pathLength = 0;\\n bytes memory key = Lib_BytesUtils.toNibbles(_key);\\n\\n bytes32 currentNodeID = _root;\\n uint256 currentKeyIndex = 0;\\n uint256 currentKeyIncrement = 0;\\n TrieNode memory currentNode;\\n\\n // Proof is top-down, so we start at the first element (root).\\n for (uint256 i = 0; i < _proof.length; i++) {\\n currentNode = _proof[i];\\n currentKeyIndex += currentKeyIncrement;\\n\\n // Keep track of the proof elements we actually need.\\n // It's expensive to resize arrays, so this simply reduces gas costs.\\n pathLength += 1;\\n\\n if (currentKeyIndex == 0) {\\n // First proof element is always the root node.\\n require(\\n keccak256(currentNode.encoded) == currentNodeID,\\n \\\"Invalid root hash\\\"\\n );\\n } else if (currentNode.encoded.length >= 32) {\\n // Nodes 32 bytes or larger are hashed inside branch nodes.\\n require(\\n keccak256(currentNode.encoded) == currentNodeID,\\n \\\"Invalid large internal hash\\\"\\n );\\n } else {\\n // Nodes smaller than 31 bytes aren't hashed.\\n require(\\n Lib_BytesUtils.toBytes32(currentNode.encoded) == currentNodeID,\\n \\\"Invalid internal node hash\\\"\\n );\\n }\\n\\n if (currentNode.decoded.length == BRANCH_NODE_LENGTH) {\\n if (currentKeyIndex == key.length) {\\n // We've hit the end of the key, meaning the value should be within this branch node.\\n break;\\n } else {\\n // We're not at the end of the key yet.\\n // Figure out what the next node ID should be and continue.\\n uint8 branchKey = uint8(key[currentKeyIndex]);\\n Lib_RLPReader.RLPItem memory nextNode = currentNode.decoded[branchKey];\\n currentNodeID = _getNodeID(nextNode);\\n currentKeyIncrement = 1;\\n continue;\\n }\\n } else if (currentNode.decoded.length == LEAF_OR_EXTENSION_NODE_LENGTH) {\\n bytes memory path = _getNodePath(currentNode);\\n uint8 prefix = uint8(path[0]);\\n uint8 offset = 2 - prefix % 2;\\n bytes memory pathRemainder = Lib_BytesUtils.slice(path, offset);\\n bytes memory keyRemainder = Lib_BytesUtils.slice(key, currentKeyIndex);\\n uint256 sharedNibbleLength = _getSharedNibbleLength(pathRemainder, keyRemainder);\\n\\n if (prefix == PREFIX_LEAF_EVEN || prefix == PREFIX_LEAF_ODD) {\\n if (\\n pathRemainder.length == sharedNibbleLength &&\\n keyRemainder.length == sharedNibbleLength\\n ) {\\n // The key within this leaf matches our key exactly.\\n // Increment the key index to reflect that we have no remainder.\\n currentKeyIndex += sharedNibbleLength;\\n }\\n\\n // We've hit a leaf node, so our next node should be NULL.\\n currentNodeID = bytes32(RLP_NULL);\\n break;\\n } else if (prefix == PREFIX_EXTENSION_EVEN || prefix == PREFIX_EXTENSION_ODD) {\\n if (sharedNibbleLength == 0) {\\n // Our extension node doesn't share any part of our key.\\n // We've hit the end of this path, updates will need to modify this extension.\\n currentNodeID = bytes32(RLP_NULL);\\n break;\\n } else {\\n // Our extension shares some nibbles.\\n // Carry on to the next node.\\n currentNodeID = _getNodeID(currentNode.decoded[1]);\\n currentKeyIncrement = sharedNibbleLength;\\n continue;\\n }\\n } else {\\n revert(\\\"Received a node with an unknown prefix\\\");\\n }\\n } else {\\n revert(\\\"Received an unparseable node.\\\");\\n }\\n }\\n\\n // If our node ID is NULL, then we're at a dead end.\\n bool isFinalNode = currentNodeID == bytes32(RLP_NULL);\\n return (pathLength, Lib_BytesUtils.slice(key, currentKeyIndex), isFinalNode);\\n }\\n\\n /**\\n * @notice Creates new nodes to support a k/v pair insertion into a given\\n * Merkle trie path.\\n * @param _path Path to the node nearest the k/v pair.\\n * @param _pathLength Length of the path. Necessary because the provided\\n * path may include additional nodes (e.g., it comes directly from a proof)\\n * and we can't resize in-memory arrays without costly duplication.\\n * @param _keyRemainder Portion of the initial key that must be inserted\\n * into the trie.\\n * @param _value Value to insert at the given key.\\n * @return _newPath A new path with the inserted k/v pair and extra supporting nodes.\\n */\\n function _getNewPath(\\n TrieNode[] memory _path,\\n uint256 _pathLength,\\n bytes memory _keyRemainder,\\n bytes memory _value\\n )\\n private\\n pure\\n returns (\\n TrieNode[] memory _newPath\\n )\\n {\\n bytes memory keyRemainder = _keyRemainder;\\n\\n // Most of our logic depends on the status of the last node in the path.\\n TrieNode memory lastNode = _path[_pathLength - 1];\\n NodeType lastNodeType = _getNodeType(lastNode);\\n\\n // Create an array for newly created nodes.\\n // We need up to three new nodes, depending on the contents of the last node.\\n // Since array resizing is expensive, we'll keep track of the size manually.\\n // We're using an explicit `totalNewNodes += 1` after insertions for clarity.\\n TrieNode[] memory newNodes = new TrieNode[](3);\\n uint256 totalNewNodes = 0;\\n\\n if (keyRemainder.length == 0 && lastNodeType == NodeType.LeafNode) {\\n // We've found a leaf node with the given key.\\n // Simply need to update the value of the node to match.\\n newNodes[totalNewNodes] = _makeLeafNode(_getNodeKey(lastNode), _value);\\n totalNewNodes += 1;\\n } else if (lastNodeType == NodeType.BranchNode) {\\n if (keyRemainder.length == 0) {\\n // We've found a branch node with the given key.\\n // Simply need to update the value of the node to match.\\n newNodes[totalNewNodes] = _editBranchValue(lastNode, _value);\\n totalNewNodes += 1;\\n } else {\\n // We've found a branch node, but it doesn't contain our key.\\n // Reinsert the old branch for now.\\n newNodes[totalNewNodes] = lastNode;\\n totalNewNodes += 1;\\n // Create a new leaf node, slicing our remainder since the first byte points\\n // to our branch node.\\n newNodes[totalNewNodes] = _makeLeafNode(Lib_BytesUtils.slice(keyRemainder, 1), _value);\\n totalNewNodes += 1;\\n }\\n } else {\\n // Our last node is either an extension node or a leaf node with a different key.\\n bytes memory lastNodeKey = _getNodeKey(lastNode);\\n uint256 sharedNibbleLength = _getSharedNibbleLength(lastNodeKey, keyRemainder);\\n\\n if (sharedNibbleLength != 0) {\\n // We've got some shared nibbles between the last node and our key remainder.\\n // We'll need to insert an extension node that covers these shared nibbles.\\n bytes memory nextNodeKey = Lib_BytesUtils.slice(lastNodeKey, 0, sharedNibbleLength);\\n newNodes[totalNewNodes] = _makeExtensionNode(nextNodeKey, _getNodeHash(_value));\\n totalNewNodes += 1;\\n\\n // Cut down the keys since we've just covered these shared nibbles.\\n lastNodeKey = Lib_BytesUtils.slice(lastNodeKey, sharedNibbleLength);\\n keyRemainder = Lib_BytesUtils.slice(keyRemainder, sharedNibbleLength);\\n }\\n\\n // Create an empty branch to fill in.\\n TrieNode memory newBranch = _makeEmptyBranchNode();\\n\\n if (lastNodeKey.length == 0) {\\n // Key remainder was larger than the key for our last node.\\n // The value within our last node is therefore going to be shifted into\\n // a branch value slot.\\n newBranch = _editBranchValue(newBranch, _getNodeValue(lastNode));\\n } else {\\n // Last node key was larger than the key remainder.\\n // We're going to modify some index of our branch.\\n uint8 branchKey = uint8(lastNodeKey[0]);\\n // Move on to the next nibble.\\n lastNodeKey = Lib_BytesUtils.slice(lastNodeKey, 1);\\n\\n if (lastNodeType == NodeType.LeafNode) {\\n // We're dealing with a leaf node.\\n // We'll modify the key and insert the old leaf node into the branch index.\\n TrieNode memory modifiedLastNode = _makeLeafNode(lastNodeKey, _getNodeValue(lastNode));\\n newBranch = _editBranchIndex(newBranch, branchKey, _getNodeHash(modifiedLastNode.encoded));\\n } else if (lastNodeKey.length != 0) {\\n // We're dealing with a shrinking extension node.\\n // We need to modify the node to decrease the size of the key.\\n TrieNode memory modifiedLastNode = _makeExtensionNode(lastNodeKey, _getNodeValue(lastNode));\\n newBranch = _editBranchIndex(newBranch, branchKey, _getNodeHash(modifiedLastNode.encoded));\\n } else {\\n // We're dealing with an unnecessary extension node.\\n // We're going to delete the node entirely.\\n // Simply insert its current value into the branch index.\\n newBranch = _editBranchIndex(newBranch, branchKey, _getNodeValue(lastNode));\\n }\\n }\\n\\n if (keyRemainder.length == 0) {\\n // We've got nothing left in the key remainder.\\n // Simply insert the value into the branch value slot.\\n newBranch = _editBranchValue(newBranch, _value);\\n // Push the branch into the list of new nodes.\\n newNodes[totalNewNodes] = newBranch;\\n totalNewNodes += 1;\\n } else {\\n // We've got some key remainder to work with.\\n // We'll be inserting a leaf node into the trie.\\n // First, move on to the next nibble.\\n keyRemainder = Lib_BytesUtils.slice(keyRemainder, 1);\\n // Push the branch into the list of new nodes.\\n newNodes[totalNewNodes] = newBranch;\\n totalNewNodes += 1;\\n // Push a new leaf node for our k/v pair.\\n newNodes[totalNewNodes] = _makeLeafNode(keyRemainder, _value);\\n totalNewNodes += 1;\\n }\\n }\\n\\n // Finally, join the old path with our newly created nodes.\\n // Since we're overwriting the last node in the path, we use `_pathLength - 1`.\\n return _joinNodeArrays(_path, _pathLength - 1, newNodes, totalNewNodes);\\n }\\n\\n /**\\n * @notice Computes the trie root from a given path.\\n * @param _nodes Path to some k/v pair.\\n * @param _key Key for the k/v pair.\\n * @return _updatedRoot Root hash for the updated trie.\\n */\\n function _getUpdatedTrieRoot(\\n TrieNode[] memory _nodes,\\n bytes memory _key\\n )\\n private\\n pure\\n returns (\\n bytes32 _updatedRoot\\n )\\n {\\n bytes memory key = Lib_BytesUtils.toNibbles(_key);\\n\\n // Some variables to keep track of during iteration.\\n TrieNode memory currentNode;\\n NodeType currentNodeType;\\n bytes memory previousNodeHash;\\n\\n // Run through the path backwards to rebuild our root hash.\\n for (uint256 i = _nodes.length; i > 0; i--) {\\n // Pick out the current node.\\n currentNode = _nodes[i - 1];\\n currentNodeType = _getNodeType(currentNode);\\n\\n if (currentNodeType == NodeType.LeafNode) {\\n // Leaf nodes are already correctly encoded.\\n // Shift the key over to account for the nodes key.\\n bytes memory nodeKey = _getNodeKey(currentNode);\\n key = Lib_BytesUtils.slice(key, 0, key.length - nodeKey.length);\\n } else if (currentNodeType == NodeType.ExtensionNode) {\\n // Shift the key over to account for the nodes key.\\n bytes memory nodeKey = _getNodeKey(currentNode);\\n key = Lib_BytesUtils.slice(key, 0, key.length - nodeKey.length);\\n\\n // If this node is the last element in the path, it'll be correctly encoded\\n // and we can skip this part.\\n if (previousNodeHash.length > 0) {\\n // Re-encode the node based on the previous node.\\n currentNode = _makeExtensionNode(nodeKey, previousNodeHash);\\n }\\n } else if (currentNodeType == NodeType.BranchNode) {\\n // If this node is the last element in the path, it'll be correctly encoded\\n // and we can skip this part.\\n if (previousNodeHash.length > 0) {\\n // Re-encode the node based on the previous node.\\n uint8 branchKey = uint8(key[key.length - 1]);\\n key = Lib_BytesUtils.slice(key, 0, key.length - 1);\\n currentNode = _editBranchIndex(currentNode, branchKey, previousNodeHash);\\n }\\n }\\n\\n // Compute the node hash for the next iteration.\\n previousNodeHash = _getNodeHash(currentNode.encoded);\\n }\\n\\n // Current node should be the root at this point.\\n // Simply return the hash of its encoding.\\n return keccak256(currentNode.encoded);\\n }\\n\\n /**\\n * @notice Parses an RLP-encoded proof into something more useful.\\n * @param _proof RLP-encoded proof to parse.\\n * @return _parsed Proof parsed into easily accessible structs.\\n */\\n function _parseProof(\\n bytes memory _proof\\n )\\n private\\n pure\\n returns (\\n TrieNode[] memory _parsed\\n )\\n {\\n Lib_RLPReader.RLPItem[] memory nodes = Lib_RLPReader.readList(_proof);\\n TrieNode[] memory proof = new TrieNode[](nodes.length);\\n\\n for (uint256 i = 0; i < nodes.length; i++) {\\n bytes memory encoded = Lib_RLPReader.readBytes(nodes[i]);\\n proof[i] = TrieNode({\\n encoded: encoded,\\n decoded: Lib_RLPReader.readList(encoded)\\n });\\n }\\n\\n return proof;\\n }\\n\\n /**\\n * @notice Picks out the ID for a node. Node ID is referred to as the\\n * \\\"hash\\\" within the specification, but nodes < 32 bytes are not actually\\n * hashed.\\n * @param _node Node to pull an ID for.\\n * @return _nodeID ID for the node, depending on the size of its contents.\\n */\\n function _getNodeID(\\n Lib_RLPReader.RLPItem memory _node\\n )\\n private\\n pure\\n returns (\\n bytes32 _nodeID\\n )\\n {\\n bytes memory nodeID;\\n\\n if (_node.length < 32) {\\n // Nodes smaller than 32 bytes are RLP encoded.\\n nodeID = Lib_RLPReader.readRawBytes(_node);\\n } else {\\n // Nodes 32 bytes or larger are hashed.\\n nodeID = Lib_RLPReader.readBytes(_node);\\n }\\n\\n return Lib_BytesUtils.toBytes32(nodeID);\\n }\\n\\n /**\\n * @notice Gets the path for a leaf or extension node.\\n * @param _node Node to get a path for.\\n * @return _path Node path, converted to an array of nibbles.\\n */\\n function _getNodePath(\\n TrieNode memory _node\\n )\\n private\\n pure\\n returns (\\n bytes memory _path\\n )\\n {\\n return Lib_BytesUtils.toNibbles(Lib_RLPReader.readBytes(_node.decoded[0]));\\n }\\n\\n /**\\n * @notice Gets the key for a leaf or extension node. Keys are essentially\\n * just paths without any prefix.\\n * @param _node Node to get a key for.\\n * @return _key Node key, converted to an array of nibbles.\\n */\\n function _getNodeKey(\\n TrieNode memory _node\\n )\\n private\\n pure\\n returns (\\n bytes memory _key\\n )\\n {\\n return _removeHexPrefix(_getNodePath(_node));\\n }\\n\\n /**\\n * @notice Gets the path for a node.\\n * @param _node Node to get a value for.\\n * @return _value Node value, as hex bytes.\\n */\\n function _getNodeValue(\\n TrieNode memory _node\\n )\\n private\\n pure\\n returns (\\n bytes memory _value\\n )\\n {\\n return Lib_RLPReader.readBytes(_node.decoded[_node.decoded.length - 1]);\\n }\\n\\n /**\\n * @notice Computes the node hash for an encoded node. Nodes < 32 bytes\\n * are not hashed, all others are keccak256 hashed.\\n * @param _encoded Encoded node to hash.\\n * @return _hash Hash of the encoded node. Simply the input if < 32 bytes.\\n */\\n function _getNodeHash(\\n bytes memory _encoded\\n )\\n private\\n pure\\n returns (\\n bytes memory _hash\\n )\\n {\\n if (_encoded.length < 32) {\\n return _encoded;\\n } else {\\n return abi.encodePacked(keccak256(_encoded));\\n }\\n }\\n\\n /**\\n * @notice Determines the type for a given node.\\n * @param _node Node to determine a type for.\\n * @return _type Type of the node; BranchNode/ExtensionNode/LeafNode.\\n */\\n function _getNodeType(\\n TrieNode memory _node\\n )\\n private\\n pure\\n returns (\\n NodeType _type\\n )\\n {\\n if (_node.decoded.length == BRANCH_NODE_LENGTH) {\\n return NodeType.BranchNode;\\n } else if (_node.decoded.length == LEAF_OR_EXTENSION_NODE_LENGTH) {\\n bytes memory path = _getNodePath(_node);\\n uint8 prefix = uint8(path[0]);\\n\\n if (prefix == PREFIX_LEAF_EVEN || prefix == PREFIX_LEAF_ODD) {\\n return NodeType.LeafNode;\\n } else if (prefix == PREFIX_EXTENSION_EVEN || prefix == PREFIX_EXTENSION_ODD) {\\n return NodeType.ExtensionNode;\\n }\\n }\\n\\n revert(\\\"Invalid node type\\\");\\n }\\n\\n /**\\n * @notice Utility; determines the number of nibbles shared between two\\n * nibble arrays.\\n * @param _a First nibble array.\\n * @param _b Second nibble array.\\n * @return _shared Number of shared nibbles.\\n */\\n function _getSharedNibbleLength(\\n bytes memory _a,\\n bytes memory _b\\n )\\n private\\n pure\\n returns (\\n uint256 _shared\\n )\\n {\\n uint256 i = 0;\\n while (_a.length > i && _b.length > i && _a[i] == _b[i]) {\\n i++;\\n }\\n return i;\\n }\\n\\n /**\\n * @notice Utility; converts an RLP-encoded node into our nice struct.\\n * @param _raw RLP-encoded node to convert.\\n * @return _node Node as a TrieNode struct.\\n */\\n function _makeNode(\\n bytes[] memory _raw\\n )\\n private\\n pure\\n returns (\\n TrieNode memory _node\\n )\\n {\\n bytes memory encoded = Lib_RLPWriter.writeList(_raw);\\n\\n return TrieNode({\\n encoded: encoded,\\n decoded: Lib_RLPReader.readList(encoded)\\n });\\n }\\n\\n /**\\n * @notice Utility; converts an RLP-decoded node into our nice struct.\\n * @param _items RLP-decoded node to convert.\\n * @return _node Node as a TrieNode struct.\\n */\\n function _makeNode(\\n Lib_RLPReader.RLPItem[] memory _items\\n )\\n private\\n pure\\n returns (\\n TrieNode memory _node\\n )\\n {\\n bytes[] memory raw = new bytes[](_items.length);\\n for (uint256 i = 0; i < _items.length; i++) {\\n raw[i] = Lib_RLPReader.readRawBytes(_items[i]);\\n }\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Creates a new extension node.\\n * @param _key Key for the extension node, unprefixed.\\n * @param _value Value for the extension node.\\n * @return _node New extension node with the given k/v pair.\\n */\\n function _makeExtensionNode(\\n bytes memory _key,\\n bytes memory _value\\n )\\n private\\n pure\\n returns (\\n TrieNode memory _node\\n )\\n {\\n bytes[] memory raw = new bytes[](2);\\n bytes memory key = _addHexPrefix(_key, false);\\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\\n raw[1] = Lib_RLPWriter.writeBytes(_value);\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Creates a new leaf node.\\n * @dev This function is essentially identical to `_makeExtensionNode`.\\n * Although we could route both to a single method with a flag, it's\\n * more gas efficient to keep them separate and duplicate the logic.\\n * @param _key Key for the leaf node, unprefixed.\\n * @param _value Value for the leaf node.\\n * @return _node New leaf node with the given k/v pair.\\n */\\n function _makeLeafNode(\\n bytes memory _key,\\n bytes memory _value\\n )\\n private\\n pure\\n returns (\\n TrieNode memory _node\\n )\\n {\\n bytes[] memory raw = new bytes[](2);\\n bytes memory key = _addHexPrefix(_key, true);\\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\\n raw[1] = Lib_RLPWriter.writeBytes(_value);\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Creates an empty branch node.\\n * @return _node Empty branch node as a TrieNode struct.\\n */\\n function _makeEmptyBranchNode()\\n private\\n pure\\n returns (\\n TrieNode memory _node\\n )\\n {\\n bytes[] memory raw = new bytes[](BRANCH_NODE_LENGTH);\\n for (uint256 i = 0; i < raw.length; i++) {\\n raw[i] = RLP_NULL_BYTES;\\n }\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Modifies the value slot for a given branch.\\n * @param _branch Branch node to modify.\\n * @param _value Value to insert into the branch.\\n * @return _updatedNode Modified branch node.\\n */\\n function _editBranchValue(\\n TrieNode memory _branch,\\n bytes memory _value\\n )\\n private\\n pure\\n returns (\\n TrieNode memory _updatedNode\\n )\\n {\\n bytes memory encoded = Lib_RLPWriter.writeBytes(_value);\\n _branch.decoded[_branch.decoded.length - 1] = Lib_RLPReader.toRLPItem(encoded);\\n return _makeNode(_branch.decoded);\\n }\\n\\n /**\\n * @notice Modifies a slot at an index for a given branch.\\n * @param _branch Branch node to modify.\\n * @param _index Slot index to modify.\\n * @param _value Value to insert into the slot.\\n * @return _updatedNode Modified branch node.\\n */\\n function _editBranchIndex(\\n TrieNode memory _branch,\\n uint8 _index,\\n bytes memory _value\\n )\\n private\\n pure\\n returns (\\n TrieNode memory _updatedNode\\n )\\n {\\n bytes memory encoded = _value.length < 32 ? _value : Lib_RLPWriter.writeBytes(_value);\\n _branch.decoded[_index] = Lib_RLPReader.toRLPItem(encoded);\\n return _makeNode(_branch.decoded);\\n }\\n\\n /**\\n * @notice Utility; adds a prefix to a key.\\n * @param _key Key to prefix.\\n * @param _isLeaf Whether or not the key belongs to a leaf.\\n * @return _prefixedKey Prefixed key.\\n */\\n function _addHexPrefix(\\n bytes memory _key,\\n bool _isLeaf\\n )\\n private\\n pure\\n returns (\\n bytes memory _prefixedKey\\n )\\n {\\n uint8 prefix = _isLeaf ? uint8(0x02) : uint8(0x00);\\n uint8 offset = uint8(_key.length % 2);\\n bytes memory prefixed = new bytes(2 - offset);\\n prefixed[0] = bytes1(prefix + offset);\\n return abi.encodePacked(prefixed, _key);\\n }\\n\\n /**\\n * @notice Utility; removes a prefix from a path.\\n * @param _path Path to remove the prefix from.\\n * @return _unprefixedKey Unprefixed key.\\n */\\n function _removeHexPrefix(\\n bytes memory _path\\n )\\n private\\n pure\\n returns (\\n bytes memory _unprefixedKey\\n )\\n {\\n if (uint8(_path[0]) % 2 == 0) {\\n return Lib_BytesUtils.slice(_path, 2);\\n } else {\\n return Lib_BytesUtils.slice(_path, 1);\\n }\\n }\\n\\n /**\\n * @notice Utility; combines two node arrays. Array lengths are required\\n * because the actual lengths may be longer than the filled lengths.\\n * Array resizing is extremely costly and should be avoided.\\n * @param _a First array to join.\\n * @param _aLength Length of the first array.\\n * @param _b Second array to join.\\n * @param _bLength Length of the second array.\\n * @return _joined Combined node array.\\n */\\n function _joinNodeArrays(\\n TrieNode[] memory _a,\\n uint256 _aLength,\\n TrieNode[] memory _b,\\n uint256 _bLength\\n )\\n private\\n pure\\n returns (\\n TrieNode[] memory _joined\\n )\\n {\\n TrieNode[] memory ret = new TrieNode[](_aLength + _bLength);\\n\\n // Copy elements from the first array.\\n for (uint256 i = 0; i < _aLength; i++) {\\n ret[i] = _a[i];\\n }\\n\\n // Copy elements from the second array.\\n for (uint256 i = 0; i < _bLength; i++) {\\n ret[i + _aLength] = _b[i];\\n }\\n\\n return ret;\\n }\\n}\\n\",\"keccak256\":\"0x161f65220b8c5cf295232f8c58c2744fbc898bf77da5f9d9c5b2dd673dafc6f6\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/trie/Lib_SecureMerkleTrie.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_MerkleTrie } from \\\"./Lib_MerkleTrie.sol\\\";\\n\\n/**\\n * @title Lib_SecureMerkleTrie\\n */\\nlibrary Lib_SecureMerkleTrie {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * @notice Verifies a proof that a given key/value pair is present in the\\n * Merkle trie.\\n * @param _key Key of the node to search for, as a hex string.\\n * @param _value Value of the node to search for, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the desired node. Unlike\\n * traditional Merkle trees, this proof is executed top-down and consists\\n * of a list of RLP-encoded nodes that make a path down to the target node.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _verified `true` if the k/v pair exists in the trie, `false` otherwise.\\n */\\n function verifyInclusionProof(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bool _verified\\n )\\n {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.verifyInclusionProof(key, _value, _proof, _root);\\n }\\n\\n /**\\n * @notice Verifies a proof that a given key is *not* present in\\n * the Merkle trie.\\n * @param _key Key of the node to search for, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\\n * target node.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _verified `true` if the key is not present in the trie, `false` otherwise.\\n */\\n function verifyExclusionProof(\\n bytes memory _key,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bool _verified\\n )\\n {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.verifyExclusionProof(key, _proof, _root);\\n }\\n\\n /**\\n * @notice Updates a Merkle trie and returns a new root hash.\\n * @param _key Key of the node to update, as a hex string.\\n * @param _value Value of the node to update, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\\n * target node. If the key exists, we can simply update the value.\\n * Otherwise, we need to modify the trie to handle the new k/v pair.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _updatedRoot Root hash of the newly constructed trie.\\n */\\n function update(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bytes32 _updatedRoot\\n )\\n {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.update(key, _value, _proof, _root);\\n }\\n\\n /**\\n * @notice Retrieves the value associated with a given key.\\n * @param _key Key to search for, as hex bytes.\\n * @param _proof Merkle trie inclusion proof for the key.\\n * @param _root Known root of the Merkle trie.\\n * @return _exists Whether or not the key exists.\\n * @return _value Value of the key if it exists.\\n */\\n function get(\\n bytes memory _key,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bool _exists,\\n bytes memory _value\\n )\\n {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.get(key, _proof, _root);\\n }\\n\\n /**\\n * Computes the root hash for a trie with a single node.\\n * @param _key Key for the single node.\\n * @param _value Value for the single node.\\n * @return _updatedRoot Hash of the trie.\\n */\\n function getSingleNodeRootHash(\\n bytes memory _key,\\n bytes memory _value\\n )\\n internal\\n pure\\n returns (\\n bytes32 _updatedRoot\\n )\\n {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.getSingleNodeRootHash(key, _value);\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Computes the secure counterpart to a key.\\n * @param _key Key to get a secure key from.\\n * @return _secureKey Secure version of the key.\\n */\\n function _getSecureKey(\\n bytes memory _key\\n )\\n private\\n pure\\n returns (\\n bytes memory _secureKey\\n )\\n {\\n return abi.encodePacked(keccak256(_key));\\n }\\n}\",\"keccak256\":\"0x79355346f74bb1eb9eeb733cb5d9677d50115c4f390307cbf608fe071a1ada0c\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_Bytes32Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_Byte32Utils\\n */\\nlibrary Lib_Bytes32Utils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \\\"true.\\\"\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as a boolean.\\n */\\n function toBool(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return _in != 0;\\n }\\n\\n /**\\n * Converts a boolean to a bytes32 value.\\n * @param _in Input boolean value.\\n * @return Boolean as a bytes32.\\n */\\n function fromBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in ? 1 : 0));\\n }\\n\\n /**\\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as an address.\\n */\\n function toAddress(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return address(uint160(uint256(_in)));\\n }\\n\\n /**\\n * Converts an address to a bytes32.\\n * @param _in Input address value.\\n * @return Address as a bytes32.\\n */\\n function fromAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in));\\n }\\n\\n /**\\n * Removes the leading zeros from a bytes32 value and returns a new (smaller) bytes value.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 without any leading zeros.\\n */\\n function removeLeadingZeros(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out;\\n\\n assembly {\\n // Figure out how many leading zero bytes to remove.\\n let shift := 0\\n for { let i := 0 } and(lt(i, 32), eq(byte(i, _in), 0)) { i := add(i, 1) } {\\n shift := add(shift, 1)\\n }\\n\\n // Reserve some space for our output and fix the free memory pointer.\\n out := mload(0x40)\\n mstore(0x40, add(out, 0x40))\\n\\n // Shift the value and store it into the output bytes.\\n mstore(add(out, 0x20), shl(mul(shift, 8), _in))\\n\\n // Store the new size (with leading zero bytes removed) in the output byte size.\\n mstore(out, sub(32, shift))\\n }\\n\\n return out;\\n }\\n}\\n\",\"keccak256\":\"0xfa2def593e3fc56a31852c3744aefdaa93cec74e721bfcfeb1e5d166c7c60b64\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_BytesUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_BytesUtils\\n */\\nlibrary Lib_BytesUtils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_start + _length >= _start, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n if (_bytes.length - _start == 0) {\\n return bytes('');\\n }\\n\\n return slice(_bytes, _start, _bytes.length - _start);\\n }\\n\\n function toBytes32PadLeft(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes32)\\n {\\n bytes32 ret;\\n uint256 len = _bytes.length <= 32 ? _bytes.length : 32;\\n assembly {\\n ret := shr(mul(sub(32, len), 8), mload(add(_bytes, 32)))\\n }\\n return ret;\\n }\\n\\n function toBytes32(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes32)\\n {\\n if (_bytes.length < 32) {\\n bytes32 ret;\\n assembly {\\n ret := mload(add(_bytes, 32))\\n }\\n return ret;\\n }\\n\\n return abi.decode(_bytes,(bytes32)); // will truncate if input length > 32 bytes\\n }\\n\\n function toUint256(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (uint256)\\n {\\n return uint256(toBytes32(_bytes));\\n }\\n\\n function toUint24(bytes memory _bytes, uint256 _start) internal pure returns (uint24) {\\n require(_start + 3 >= _start, \\\"toUint24_overflow\\\");\\n require(_bytes.length >= _start + 3 , \\\"toUint24_outOfBounds\\\");\\n uint24 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x3), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toUint8(bytes memory _bytes, uint256 _start) internal pure returns (uint8) {\\n require(_start + 1 >= _start, \\\"toUint8_overflow\\\");\\n require(_bytes.length >= _start + 1 , \\\"toUint8_outOfBounds\\\");\\n uint8 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x1), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toAddress(bytes memory _bytes, uint256 _start) internal pure returns (address) {\\n require(_start + 20 >= _start, \\\"toAddress_overflow\\\");\\n require(_bytes.length >= _start + 20, \\\"toAddress_outOfBounds\\\");\\n address tempAddress;\\n\\n assembly {\\n tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000)\\n }\\n\\n return tempAddress;\\n }\\n\\n function toNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n bytes memory nibbles = new bytes(_bytes.length * 2);\\n\\n for (uint256 i = 0; i < _bytes.length; i++) {\\n nibbles[i * 2] = _bytes[i] >> 4;\\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\\n }\\n\\n return nibbles;\\n }\\n\\n function fromNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n bytes memory ret = new bytes(_bytes.length / 2);\\n\\n for (uint256 i = 0; i < ret.length; i++) {\\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\\n }\\n\\n return ret;\\n }\\n\\n function equal(\\n bytes memory _bytes,\\n bytes memory _other\\n )\\n internal\\n pure\\n returns (bool)\\n {\\n return keccak256(_bytes) == keccak256(_other);\\n }\\n}\\n\",\"keccak256\":\"0x0adf22e1b22ba09911e859f64cb3b484e992be4f9fd3b09088e6225bf8d06ce0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_ErrorUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/**\\n * @title Lib_ErrorUtils\\n */\\nlibrary Lib_ErrorUtils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Encodes an error string into raw solidity-style revert data.\\n * (i.e. ascii bytes, prefixed with bytes4(keccak(\\\"Error(string))\\\"))\\n * Ref: https://docs.soliditylang.org/en/v0.8.2/control-structures.html?highlight=Error(string)#panic-via-assert-and-error-via-require\\n * @param _reason Reason for the reversion.\\n * @return Standard solidity revert data for the given reason.\\n */\\n function encodeRevertString(\\n string memory _reason\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return abi.encodeWithSignature(\\n \\\"Error(string)\\\",\\n _reason\\n );\\n }\\n}\\n\",\"keccak256\":\"0xfc64ec4a81fb50865b502a0004ed154e8598e1a313db77303fc95e41f536e6b7\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_ReentrancyGuard.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @dev Contract module that helps prevent reentrant calls to a function.\\n *\\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\\n * available, which can be applied to functions to make sure there are no nested\\n * (reentrant) calls to them.\\n *\\n * Note that because there is a single `nonReentrant` guard, functions marked as\\n * `nonReentrant` may not call one another. This can be worked around by making\\n * those functions `private`, and then adding `external` `nonReentrant` entry\\n * points to them.\\n *\\n * TIP: If you would like to learn more about reentrancy and alternative ways\\n * to protect against it, check out our blog post\\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\\n */\\nabstract contract Lib_ReentrancyGuard {\\n // Booleans are more expensive than uint256 or any type that takes up a full\\n // word because each write operation emits an extra SLOAD to first read the\\n // slot's contents, replace the bits taken up by the boolean, and then write\\n // back. This is the compiler's defense against contract upgrades and\\n // pointer aliasing, and it cannot be disabled.\\n\\n // The values being non-zero value makes deployment a bit more expensive,\\n // but in exchange the refund on every call to nonReentrant will be lower in\\n // amount. Since refunds are capped to a percentage of the total\\n // transaction's gas, it is best to keep them low in cases like this one, to\\n // increase the likelihood of the full refund coming into effect.\\n uint256 private constant _NOT_ENTERED = 1;\\n uint256 private constant _ENTERED = 2;\\n\\n uint256 private _status;\\n\\n constructor () {\\n _status = _NOT_ENTERED;\\n }\\n\\n /**\\n * @dev Prevents a contract from calling itself, directly or indirectly.\\n * Calling a `nonReentrant` function from another `nonReentrant`\\n * function is not supported. It is possible to prevent this from happening\\n * by making the `nonReentrant` function external, and make it call a\\n * `private` function that does the actual work.\\n */\\n modifier nonReentrant() {\\n // On the first call to nonReentrant, _notEntered will be true\\n require(_status != _ENTERED, \\\"ReentrancyGuard: reentrant call\\\");\\n\\n // Any calls to nonReentrant after this point will fail\\n _status = _ENTERED;\\n\\n _;\\n\\n // By storing the original value once again, a refund is triggered (see\\n // https://eips.ethereum.org/EIPS/eip-2200)\\n _status = _NOT_ENTERED;\\n }\\n}\\n\",\"keccak256\":\"0x4e1727687288cb1db2a4df3b056626f1bf0513520c3651667b1762f579c4ca7f\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_ErrorUtils } from \\\"../utils/Lib_ErrorUtils.sol\\\";\\n\\n/**\\n * @title Lib_SafeExecutionManagerWrapper\\n * @dev The Safe Execution Manager Wrapper provides functions which facilitate writing OVM safe \\n * code using the standard solidity compiler, by routing all its operations through the Execution \\n * Manager.\\n * \\n * Compiler used: solc\\n * Runtime target: OVM\\n */\\nlibrary Lib_SafeExecutionManagerWrapper {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Performs a safe ovmCALL.\\n * @param _gasLimit Gas limit for the call.\\n * @param _target Address to call.\\n * @param _calldata Data to send to the call.\\n * @return _success Whether or not the call reverted.\\n * @return _returndata Data returned by the call.\\n */\\n function safeCALL(\\n uint256 _gasLimit,\\n address _target,\\n bytes memory _calldata\\n )\\n internal\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCALL(uint256,address,bytes)\\\",\\n _gasLimit,\\n _target,\\n _calldata\\n )\\n );\\n\\n return abi.decode(returndata, (bool, bytes));\\n }\\n\\n /**\\n * Performs a safe ovmDELEGATECALL.\\n * @param _gasLimit Gas limit for the call.\\n * @param _target Address to call.\\n * @param _calldata Data to send to the call.\\n * @return _success Whether or not the call reverted.\\n * @return _returndata Data returned by the call.\\n */\\n function safeDELEGATECALL(\\n uint256 _gasLimit,\\n address _target,\\n bytes memory _calldata\\n )\\n internal\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmDELEGATECALL(uint256,address,bytes)\\\",\\n _gasLimit,\\n _target,\\n _calldata\\n )\\n );\\n\\n return abi.decode(returndata, (bool, bytes));\\n }\\n\\n /**\\n * Performs a safe ovmCREATE call.\\n * @param _gasLimit Gas limit for the creation.\\n * @param _bytecode Code for the new contract.\\n * @return _contract Address of the created contract.\\n */\\n function safeCREATE(\\n uint256 _gasLimit,\\n bytes memory _bytecode\\n )\\n internal\\n returns (\\n address,\\n bytes memory\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n _gasLimit,\\n abi.encodeWithSignature(\\n \\\"ovmCREATE(bytes)\\\",\\n _bytecode\\n )\\n );\\n\\n return abi.decode(returndata, (address, bytes));\\n }\\n\\n /**\\n * Performs a safe ovmEXTCODESIZE call.\\n * @param _contract Address of the contract to query the size of.\\n * @return _EXTCODESIZE Size of the requested contract in bytes.\\n */\\n function safeEXTCODESIZE(\\n address _contract\\n )\\n internal\\n returns (\\n uint256 _EXTCODESIZE\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmEXTCODESIZE(address)\\\",\\n _contract\\n )\\n );\\n\\n return abi.decode(returndata, (uint256));\\n }\\n\\n /**\\n * Performs a safe ovmCHAINID call.\\n * @return _CHAINID Result of calling ovmCHAINID.\\n */\\n function safeCHAINID()\\n internal\\n returns (\\n uint256 _CHAINID\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCHAINID()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (uint256));\\n }\\n\\n /**\\n * Performs a safe ovmCALLER call.\\n * @return _CALLER Result of calling ovmCALLER.\\n */\\n function safeCALLER()\\n internal\\n returns (\\n address _CALLER\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCALLER()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (address));\\n }\\n\\n /**\\n * Performs a safe ovmADDRESS call.\\n * @return _ADDRESS Result of calling ovmADDRESS.\\n */\\n function safeADDRESS()\\n internal\\n returns (\\n address _ADDRESS\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmADDRESS()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (address));\\n }\\n\\n /**\\n * Performs a safe ovmGETNONCE call.\\n * @return _nonce Result of calling ovmGETNONCE.\\n */\\n function safeGETNONCE()\\n internal\\n returns (\\n uint256 _nonce\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmGETNONCE()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (uint256));\\n }\\n\\n /**\\n * Performs a safe ovmINCREMENTNONCE call.\\n */\\n function safeINCREMENTNONCE()\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmINCREMENTNONCE()\\\"\\n )\\n );\\n }\\n\\n /**\\n * Performs a safe ovmCREATEEOA call.\\n * @param _messageHash Message hash which was signed by EOA\\n * @param _v v value of signature (0 or 1)\\n * @param _r r value of signature\\n * @param _s s value of signature\\n */\\n function safeCREATEEOA(\\n bytes32 _messageHash,\\n uint8 _v,\\n bytes32 _r,\\n bytes32 _s\\n )\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCREATEEOA(bytes32,uint8,bytes32,bytes32)\\\",\\n _messageHash,\\n _v,\\n _r,\\n _s\\n )\\n );\\n }\\n\\n /**\\n * Performs a safe REVERT.\\n * @param _reason String revert reason to pass along with the REVERT.\\n */\\n function safeREVERT(\\n string memory _reason\\n )\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmREVERT(bytes)\\\",\\n Lib_ErrorUtils.encodeRevertString(\\n _reason\\n )\\n )\\n );\\n }\\n\\n /**\\n * Performs a safe \\\"require\\\".\\n * @param _condition Boolean condition that must be true or will revert.\\n * @param _reason String revert reason to pass along with the REVERT.\\n */\\n function safeREQUIRE(\\n bool _condition,\\n string memory _reason\\n )\\n internal\\n {\\n if (!_condition) {\\n safeREVERT(\\n _reason\\n );\\n }\\n }\\n\\n /**\\n * Performs a safe ovmSLOAD call.\\n */\\n function safeSLOAD(\\n bytes32 _key\\n )\\n internal\\n returns (\\n bytes32\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmSLOAD(bytes32)\\\",\\n _key\\n )\\n );\\n\\n return abi.decode(returndata, (bytes32));\\n }\\n\\n /**\\n * Performs a safe ovmSSTORE call.\\n */\\n function safeSSTORE(\\n bytes32 _key,\\n bytes32 _value\\n )\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmSSTORE(bytes32,bytes32)\\\",\\n _key,\\n _value\\n )\\n );\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Performs an ovm interaction and the necessary safety checks.\\n * @param _gasLimit Gas limit for the interaction.\\n * @param _calldata Data to send to the OVM_ExecutionManager (encoded with sighash).\\n * @return _returndata Data sent back by the OVM_ExecutionManager.\\n */\\n function _safeExecutionManagerInteraction(\\n uint256 _gasLimit,\\n bytes memory _calldata\\n )\\n private\\n returns (\\n bytes memory _returndata\\n )\\n {\\n address ovmExecutionManager = msg.sender;\\n (\\n bool success,\\n bytes memory returndata\\n ) = ovmExecutionManager.call{gas: _gasLimit}(_calldata);\\n\\n if (success == false) {\\n assembly {\\n revert(add(returndata, 0x20), mload(returndata))\\n }\\n } else if (returndata.length == 1) {\\n assembly {\\n return(0, 1)\\n }\\n } else {\\n return returndata;\\n }\\n }\\n\\n function _safeExecutionManagerInteraction(\\n bytes memory _calldata\\n )\\n private\\n returns (\\n bytes memory _returndata\\n )\\n {\\n return _safeExecutionManagerInteraction(\\n gasleft(),\\n _calldata\\n );\\n }\\n}\\n\",\"keccak256\":\"0x41e146e7912af794a17cd43c5a276674be956bfa8f3ca5b451bcb82d81e6f492\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x6080604052600580546001600160a01b03191661dead17905534801561002457600080fd5b506001600055600680546001600160a01b0319169055612644806100496000396000f3fe608060405234801561001057600080fd5b50600436106100a95760003560e01c8063706ceab611610071578063706ceab61461011c57806382e3702d1461012f578063b1b1b20914610142578063c4d66de814610155578063d7fd19dd14610168578063ecc704281461017b576100a9565b806321d800ec146100ae578063299ca478146100d75780633dbb202b146100ec578063461a4478146101015780636e296e4514610114575b600080fd5b6100c16100bc3660046120ae565b610190565b6040516100ce91906122c4565b60405180910390f35b6100df6101a5565b6040516100ce919061224c565b6100ff6100fa366004612032565b6101b4565b005b6100df61010f3660046120c6565b610243565b6100df61031f565b6100ff61012a366004611fbb565b610368565b6100c161013d3660046120ae565b6103cf565b6100c16101503660046120ae565b6103e4565b6100ff610163366004611e72565b6103f9565b6100ff610176366004611e8c565b61044f565b6101836106d0565b6040516100ce9190612195565b60016020526000908152604090205460ff1681565b6006546001600160a01b031681565b60006101c48433856004546106d6565b60048054600190810190915581516020808401919091206000908152600390915260409020805460ff1916909117905590506102068163ffffffff8416610723565b7f0ee9ffdb2334d78de97ffb066b23a352a4d35180cefb36589d663fbb1eb6f326816040516102359190612346565b60405180910390a150505050565b60065460405163bf40fac160e01b81526020600482018181528451602484015284516000946001600160a01b03169363bf40fac1938793928392604401918501908083838b5b838110156102a1578181015183820152602001610289565b50505050905090810190601f1680156102ce5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b1580156102eb57600080fd5b505afa1580156102ff573d6000803e3d6000fd5b505050506040513d602081101561031557600080fd5b505190505b919050565b6005546000906001600160a01b031661dead14156103585760405162461bcd60e51b815260040161034f90612359565b60405180910390fd5b506005546001600160a01b031690565b6000610376868686866106d6565b805160208083019190912060009081526003909152604090205490915060ff1615156001146103b75760405162461bcd60e51b815260040161034f9061244e565b6103c7818363ffffffff16610723565b505050505050565b60036020526000908152604090205460ff1681565b60026020526000908152604090205460ff1681565b6006546001600160a01b0316156104225760405162461bcd60e51b815260040161034f90612536565b600680546001600160a01b039092166001600160a01b03199283161790556005805490911661dead179055565b600260005414156104a7576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6002600090815560408051808201909152601481527327ab26afa61926b2b9b9b0b3b2a932b630bcb2b960611b60208201526104e290610243565b90506001600160a01b0381161561051b57336001600160a01b0382161461051b5760405162461bcd60e51b815260040161034f90612499565b6000610529878787876106d6565b905061053581846107fb565b15156001146105565760405162461bcd60e51b815260040161034f906124ef565b80516020808301919091206000818152600290925260409091205460ff16156105915760405162461bcd60e51b815260040161034f90612390565b600580546001600160a01b0319166001600160a01b03898116919091179091556040516000918a16906105c59089906121ac565b6000604051808303816000865af19150503d8060008114610602576040519150601f19603f3d011682016040523d82523d6000602084013e610607565b606091505b5050600580546001600160a01b03191661dead17905590508015156001141561067c5760008281526002602052604090819020805460ff19166001179055517f4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c90610673908490612195565b60405180910390a15b6000833343604051602001610693939291906121fa565b60408051601f1981840301815291815281516020928301206000908152600192839052908120805460ff1916831790555550505050505050505050565b60045481565b6060848484846040516024016106ef9493929190612260565b60408051601f198184030181529190526020810180516001600160e01b031663cbd4ece960e01b1790529050949350505050565b6107616040518060400160405280601d81526020017f4f564d5f43616e6f6e6963616c5472616e73616374696f6e436861696e000000815250610243565b6001600160a01b0316636fee07e06107ad6040518060400160405280601a81526020017f4f564d5f4c3243726f7373446f6d61696e4d657373656e676572000000000000815250610243565b83856040518463ffffffff1660e01b81526004016107cd9392919061229d565b600060405180830381600087803b1580156107e757600080fd5b505af11580156103c7573d6000803e3d6000fd5b600061080682610820565b80156108175750610817838361097d565b90505b92915050565b6000806108616040518060400160405280601881526020017f4f564d5f5374617465436f6d6d69746d656e74436861696e0000000000000000815250610243565b6020840151604051639418bddd60e01b81529192506001600160a01b03831691639418bddd9161089391600401612580565b60206040518083038186803b1580156108ab57600080fd5b505afa1580156108bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108e3919061208e565b1580156109765750825160208401516040808601519051634d69ee5760e01b81526001600160a01b03851693634d69ee57936109269391929091906004016122cf565b60206040518083038186803b15801561093e57600080fd5b505afa158015610952573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610976919061208e565b9392505050565b600080836109bf6040518060400160405280601a81526020017f4f564d5f4c3243726f7373446f6d61696e4d657373656e676572000000000000815250610243565b6040516020016109d09291906121c8565b6040516020818303038152906040528051906020012060006040516020016109f992919061219e565b604051602081830303815290604052805190602001209050600080610a48602160991b604051602001610a2c919061217d565b60408051601f1981840301815291905260608701518751610ada565b9092509050600182151514610a6f5760405162461bcd60e51b815260040161034f906123db565b6000610a7a82610b03565b9050610acf84604051602001610a909190612195565b6040516020818303038152906040526001604051602001610ab19190612234565b60405160208183030381529060405288608001518460400151610b95565b979650505050505050565b600060606000610ae986610bb9565b9050610af6818686610be9565b9250925050935093915050565b610b0b611c28565b6000610b1683610cbc565b90506040518060800160405280610b4083600081518110610b3357fe5b6020026020010151610ccf565b8152602001610b5583600181518110610b3357fe5b8152602001610b7783600281518110610b6a57fe5b6020026020010151610cd6565b8152602001610b8c83600381518110610b6a57fe5b90529392505050565b600080610ba186610bb9565b9050610baf81868686610dcf565b9695505050505050565b60608180519060200120604051602001610bd39190612195565b6040516020818303038152906040529050919050565b600060606000610bf885610df5565b90506000806000610c0a848a89610ecc565b81519295509093509150158080610c1e5750815b610c6f576040805162461bcd60e51b815260206004820152601a60248201527f50726f76696465642070726f6f6620697320696e76616c69642e000000000000604482015290519081900360640190fd5b600081610c8b5760405180602001604052806000815250610caa565b610caa866001870381518110610c9d57fe5b602002602001015161126f565b919b919a509098505050505050505050565b606061081a610cca8361128b565b6112b0565b600061081a825b6000602182600001511115610d32576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e000000000000604482015290519081900360640190fd5b6000806000610d4085611426565b919450925090506000816001811115610d5557fe5b14610da7576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e000000000000604482015290519081900360640190fd5b602080860151840180519091841015610baf5760208490036101000a90049695505050505050565b6000806000610ddf878686610be9565b91509150818015610acf5750610acf868261174f565b60606000610e0283610cbc565b90506000815167ffffffffffffffff81118015610e1e57600080fd5b50604051908082528060200260200182016040528015610e5857816020015b610e45611c4f565b815260200190600190039081610e3d5790505b50905060005b8251811015610ec4576000610e85848381518110610e7857fe5b6020026020010151611765565b90506040518060400160405280828152602001610ea183610cbc565b815250838381518110610eb057fe5b602090810291909101015250600101610e5e565b509392505050565b60006060818080610edc876117f4565b905085600080610eea611c4f565b60005b8c51811015611247578c8181518110610f0257fe5b6020026020010151915082840193506001870196508360001415610f7657815180516020909101208514610f71576040805162461bcd60e51b8152602060048201526011602482015270092dcecc2d8d2c840e4dedee840d0c2e6d607b1b604482015290519081900360640190fd5b61103d565b815151602011610fdd57815180516020909101208514610f71576040805162461bcd60e51b815260206004820152601b60248201527f496e76616c6964206c6172676520696e7465726e616c20686173680000000000604482015290519081900360640190fd5b84610feb83600001516118f1565b1461103d576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420696e7465726e616c206e6f64652068617368000000000000604482015290519081900360640190fd5b602082015151601114156110ac57855184141561105957611247565b600086858151811061106757fe5b602001015160f81c60f81b60f81c9050600083602001518260ff168151811061108c57fe5b6020026020010151905061109f8161191d565b965060019450505061123f565b600282602001515114156111f25760006110c583611953565b90506000816000815181106110d657fe5b016020015160f81c90506001811660020360006110f68460ff8416611971565b905060006111048b8a611971565b9050600061111283836119a2565b905060ff851660021480611129575060ff85166003145b1561115b5780835114801561113e5750808251145b1561114857988901985b50600160ff1b9950611247945050505050565b60ff8516158061116e575060ff85166001145b156111bb578061118b5750600160ff1b9950611247945050505050565b6111ac886020015160018151811061119f57fe5b602002602001015161191d565b9a50975061123f945050505050565b60405162461bcd60e51b81526004018080602001828103825260268152602001806126126026913960400191505060405180910390fd5b6040805162461bcd60e51b815260206004820152601d60248201527f526563656976656420616e20756e706172736561626c65206e6f64652e000000604482015290519081900360640190fd5b600101610eed565b50600160ff1b84148661125a8786611971565b909e909d50909b509950505050505050505050565b6020810151805160609161081a916000198101908110610e7857fe5b611293611c69565b506040805180820190915281518152602082810190820152919050565b60606000806112be84611426565b919350909150600190508160018111156112d457fe5b14611326576040805162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c50206c6973742076616c75652e000000000000000000604482015290519081900360640190fd5b6040805160208082526104208201909252600091816020015b611347611c69565b81526020019060019003908161133f5790505090506000835b865181101561141b57602082106113a85760405162461bcd60e51b815260040180806020018281038252602a8152602001806125e8602a913960400191505060405180910390fd5b6000806113d46040518060400160405280858c60000151038152602001858c6020015101815250611426565b509150915060405180604001604052808383018152602001848b602001510181525085858151811061140257fe5b6020908102919091010152600193909301920101611360565b508152949350505050565b600080600080846000015111611483576040805162461bcd60e51b815260206004820152601860248201527f524c50206974656d2063616e6e6f74206265206e756c6c2e0000000000000000604482015290519081900360640190fd5b6020840151805160001a607f81116114a8576000600160009450945094505050611748565b60b7811161151d578551607f19820190811061150b576040805162461bcd60e51b815260206004820152601960248201527f496e76616c696420524c502073686f727420737472696e672e00000000000000604482015290519081900360640190fd5b60019550935060009250611748915050565b60bf811161160157855160b6198201908110611580576040805162461bcd60e51b815260206004820152601f60248201527f496e76616c696420524c50206c6f6e6720737472696e67206c656e6774682e00604482015290519081900360640190fd5b6000816020036101000a60018501510490508082018860000151116115ec576040805162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c50206c6f6e6720737472696e672e0000000000000000604482015290519081900360640190fd5b60019091019550935060009250611748915050565b60f7811161167557855160bf198201908110611664576040805162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c502073686f7274206c6973742e000000000000000000604482015290519081900360640190fd5b600195509350849250611748915050565b855160f61982019081106116d0576040805162461bcd60e51b815260206004820152601d60248201527f496e76616c696420524c50206c6f6e67206c697374206c656e6774682e000000604482015290519081900360640190fd5b6000816020036101000a6001850151049050808201886000015111611735576040805162461bcd60e51b815260206004820152601660248201527524b73b30b634b210292628103637b733903634b9ba1760511b604482015290519081900360640190fd5b6001918201965094509250611748915050565b9193909250565b8051602091820120825192909101919091201490565b6060600080600061177585611426565b91945092509050600081600181111561178a57fe5b146117dc576040805162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c502062797465732076616c75652e0000000000000000604482015290519081900360640190fd5b6117eb85602001518484611a08565b95945050505050565b60606000825160020267ffffffffffffffff8111801561181357600080fd5b506040519080825280601f01601f19166020018201604052801561183e576020820181803683370190505b50905060005b83518110156118ea57600484828151811061185b57fe5b602001015160f81c60f81b6001600160f81b031916901c82826002028151811061188157fe5b60200101906001600160f81b031916908160001a90535060108482815181106118a657fe5b016020015160f81c816118b557fe5b0660f81b8282600202600101815181106118cb57fe5b60200101906001600160f81b031916908160001a905350600101611844565b5092915050565b60006020825110156119085750602081015161031a565b81806020019051602081101561031557600080fd5b6000606060208360000151101561193e5761193783611ab6565b905061194a565b61194783611765565b90505b610976816118f1565b606061081a61196c8360200151600081518110610e7857fe5b6117f4565b60608183510360001415611994575060408051602081019091526000815261081a565b610817838384865103611ac1565b6000805b8084511180156119b65750808351115b80156119fb57508281815181106119c957fe5b602001015160f81c60f81b6001600160f81b0319168482815181106119ea57fe5b01602001516001600160f81b031916145b15610817576001016119a6565b606060008267ffffffffffffffff81118015611a2357600080fd5b506040519080825280601f01601f191660200182016040528015611a4e576020820181803683370190505b509050805160001415611a62579050610976565b8484016020820160005b60208604811015611a8d578251825260209283019290910190600101611a6c565b5080519151601f959095166020036101000a600019019182169119909416179092525092915050565b606061081a82611c12565b60608182601f011015611b0c576040805162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b604482015290519081900360640190fd5b828284011015611b54576040805162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b604482015290519081900360640190fd5b81830184511015611ba0576040805162461bcd60e51b8152602060048201526011602482015270736c6963655f6f75744f66426f756e647360781b604482015290519081900360640190fd5b606082158015611bbf5760405191506000825260208201604052611c09565b6040519150601f8416801560200281840101858101878315602002848b0101015b81831015611bf8578051835260209283019201611be0565b5050858452601f01601f1916604052505b50949350505050565b606061081a826020015160008460000151611a08565b60408051608081018252600080825260208201819052918101829052606081019190915290565b604051806040016040528060608152602001606081525090565b604051806040016040528060008152602001600081525090565b600067ffffffffffffffff831115611c9757fe5b611caa601f8401601f1916602001612593565b9050828152838383011115611cbe57600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b038116811461031a57600080fd5b600082601f830112611cfc578081fd5b61081783833560208501611c83565b600060a08284031215611d1c578081fd5b60405160a0810167ffffffffffffffff8282108183111715611d3a57fe5b81604052829350843583526020850135602084015260408501356040840152606085013560608401526080850135915080821115611d7757600080fd5b50611d8485828601611cec565b6080830152505092915050565b600060408284031215611da2578081fd5b6040516040810167ffffffffffffffff8282108183111715611dc057fe5b8160405282935084358352602091508185013581811115611de057600080fd5b8501601f81018713611df157600080fd5b803582811115611dfd57fe5b8381029250611e0d848401612593565b8181528481019083860185850187018b1015611e2857600080fd5b600095505b83861015611e4b578035835260019590950194918601918601611e2d565b5080868801525050505050505092915050565b803563ffffffff8116811461031a57600080fd5b600060208284031215611e83578081fd5b61081782611cd5565b600080600080600060a08688031215611ea3578081fd5b611eac86611cd5565b9450611eba60208701611cd5565b9350604086013567ffffffffffffffff80821115611ed6578283fd5b611ee289838a01611cec565b9450606088013593506080880135915080821115611efe578283fd5b9087019060a0828a031215611f11578283fd5b611f1b60a0612593565b82358152602083013582811115611f30578485fd5b611f3c8b828601611d0b565b602083015250604083013582811115611f53578485fd5b611f5f8b828601611d91565b604083015250606083013582811115611f76578485fd5b611f828b828601611cec565b606083015250608083013582811115611f99578485fd5b611fa58b828601611cec565b6080830152508093505050509295509295909350565b600080600080600060a08688031215611fd2578081fd5b611fdb86611cd5565b9450611fe960208701611cd5565b9350604086013567ffffffffffffffff811115612004578182fd5b61201088828901611cec565b9350506060860135915061202660808701611e5e565b90509295509295909350565b600080600060608486031215612046578283fd5b61204f84611cd5565b9250602084013567ffffffffffffffff81111561206a578283fd5b61207686828701611cec565b92505061208560408501611e5e565b90509250925092565b60006020828403121561209f578081fd5b81518015158114610817578182fd5b6000602082840312156120bf578081fd5b5035919050565b6000602082840312156120d7578081fd5b813567ffffffffffffffff8111156120ed578182fd5b8201601f810184136120fd578182fd5b61210c84823560208401611c83565b949350505050565b6000815180845261212c8160208601602086016125b7565b601f01601f19169290920160200192915050565b600081518352602082015160208401526040820151604084015260608201516060840152608082015160a0608085015261210c60a0850182612114565b60609190911b6001600160601b031916815260140190565b90815260200190565b918252602082015260400190565b600082516121be8184602087016125b7565b9190910192915050565b600083516121da8184602088016125b7565b60609390931b6001600160601b0319169190920190815260140192915050565b6000845161220c8184602089016125b7565b60609490941b6001600160601b03191691909301908152601481019190915260340192915050565b60f89190911b6001600160f81b031916815260010190565b6001600160a01b0391909116815260200190565b6001600160a01b0385811682528416602082015260806040820181905260009061228c90830185612114565b905082606083015295945050505050565b600060018060a01b0385168252836020830152606060408301526117eb6060830184612114565b901515815260200190565b600084825260206060818401526122e96060840186612140565b838103604085015260408101855182528286015160408484015281815180845260608501915085830194508693505b808410156123385784518252938501936001939093019290850190612318565b509998505050505050505050565b6000602082526108176020830184612114565b6020808252601f908201527f78446f6d61696e4d65737361676553656e646572206973206e6f742073657400604082015260600190565b6020808252602b908201527f50726f7669646564206d6573736167652068617320616c72656164792062656560408201526a37103932b1b2b4bb32b21760a91b606082015260800190565b6020808252604d908201527f4d6573736167652070617373696e67207072656465706c6f7920686173206e6f60408201527f74206265656e20696e697469616c697a6564206f7220696e76616c696420707260608201526c37b7b310383937bb34b232b21760991b608082015260a00190565b6020808252602b908201527f50726f7669646564206d65737361676520686173206e6f7420616c726561647960408201526a103132b2b71039b2b73a1760a91b606082015260800190565b60208082526036908201527f4f6e6c79204f564d5f4c324d65737361676552656c617965722063616e2072656040820152753630bc90261916ba3796a6189036b2b9b9b0b3b2b99760511b606082015260800190565b60208082526027908201527f50726f7669646564206d65737361676520636f756c64206e6f742062652076656040820152663934b334b2b21760c91b606082015260800190565b6020808252602a908201527f4c3143726f7373446f6d61696e4d657373656e67657220616c72656164792069604082015269373a34b0b634bd32b21760b11b606082015260800190565b6000602082526108176020830184612140565b60405181810167ffffffffffffffff811182821017156125af57fe5b604052919050565b60005b838110156125d25781810151838201526020016125ba565b838111156125e1576000848401525b5050505056fe50726f766964656420524c50206c6973742065786365656473206d6178206c697374206c656e6774682e52656365697665642061206e6f6465207769746820616e20756e6b6e6f776e20707265666978a164736f6c6343000706000a", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100a95760003560e01c8063706ceab611610071578063706ceab61461011c57806382e3702d1461012f578063b1b1b20914610142578063c4d66de814610155578063d7fd19dd14610168578063ecc704281461017b576100a9565b806321d800ec146100ae578063299ca478146100d75780633dbb202b146100ec578063461a4478146101015780636e296e4514610114575b600080fd5b6100c16100bc3660046120ae565b610190565b6040516100ce91906122c4565b60405180910390f35b6100df6101a5565b6040516100ce919061224c565b6100ff6100fa366004612032565b6101b4565b005b6100df61010f3660046120c6565b610243565b6100df61031f565b6100ff61012a366004611fbb565b610368565b6100c161013d3660046120ae565b6103cf565b6100c16101503660046120ae565b6103e4565b6100ff610163366004611e72565b6103f9565b6100ff610176366004611e8c565b61044f565b6101836106d0565b6040516100ce9190612195565b60016020526000908152604090205460ff1681565b6006546001600160a01b031681565b60006101c48433856004546106d6565b60048054600190810190915581516020808401919091206000908152600390915260409020805460ff1916909117905590506102068163ffffffff8416610723565b7f0ee9ffdb2334d78de97ffb066b23a352a4d35180cefb36589d663fbb1eb6f326816040516102359190612346565b60405180910390a150505050565b60065460405163bf40fac160e01b81526020600482018181528451602484015284516000946001600160a01b03169363bf40fac1938793928392604401918501908083838b5b838110156102a1578181015183820152602001610289565b50505050905090810190601f1680156102ce5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b1580156102eb57600080fd5b505afa1580156102ff573d6000803e3d6000fd5b505050506040513d602081101561031557600080fd5b505190505b919050565b6005546000906001600160a01b031661dead14156103585760405162461bcd60e51b815260040161034f90612359565b60405180910390fd5b506005546001600160a01b031690565b6000610376868686866106d6565b805160208083019190912060009081526003909152604090205490915060ff1615156001146103b75760405162461bcd60e51b815260040161034f9061244e565b6103c7818363ffffffff16610723565b505050505050565b60036020526000908152604090205460ff1681565b60026020526000908152604090205460ff1681565b6006546001600160a01b0316156104225760405162461bcd60e51b815260040161034f90612536565b600680546001600160a01b039092166001600160a01b03199283161790556005805490911661dead179055565b600260005414156104a7576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6002600090815560408051808201909152601481527327ab26afa61926b2b9b9b0b3b2a932b630bcb2b960611b60208201526104e290610243565b90506001600160a01b0381161561051b57336001600160a01b0382161461051b5760405162461bcd60e51b815260040161034f90612499565b6000610529878787876106d6565b905061053581846107fb565b15156001146105565760405162461bcd60e51b815260040161034f906124ef565b80516020808301919091206000818152600290925260409091205460ff16156105915760405162461bcd60e51b815260040161034f90612390565b600580546001600160a01b0319166001600160a01b03898116919091179091556040516000918a16906105c59089906121ac565b6000604051808303816000865af19150503d8060008114610602576040519150601f19603f3d011682016040523d82523d6000602084013e610607565b606091505b5050600580546001600160a01b03191661dead17905590508015156001141561067c5760008281526002602052604090819020805460ff19166001179055517f4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c90610673908490612195565b60405180910390a15b6000833343604051602001610693939291906121fa565b60408051601f1981840301815291815281516020928301206000908152600192839052908120805460ff1916831790555550505050505050505050565b60045481565b6060848484846040516024016106ef9493929190612260565b60408051601f198184030181529190526020810180516001600160e01b031663cbd4ece960e01b1790529050949350505050565b6107616040518060400160405280601d81526020017f4f564d5f43616e6f6e6963616c5472616e73616374696f6e436861696e000000815250610243565b6001600160a01b0316636fee07e06107ad6040518060400160405280601a81526020017f4f564d5f4c3243726f7373446f6d61696e4d657373656e676572000000000000815250610243565b83856040518463ffffffff1660e01b81526004016107cd9392919061229d565b600060405180830381600087803b1580156107e757600080fd5b505af11580156103c7573d6000803e3d6000fd5b600061080682610820565b80156108175750610817838361097d565b90505b92915050565b6000806108616040518060400160405280601881526020017f4f564d5f5374617465436f6d6d69746d656e74436861696e0000000000000000815250610243565b6020840151604051639418bddd60e01b81529192506001600160a01b03831691639418bddd9161089391600401612580565b60206040518083038186803b1580156108ab57600080fd5b505afa1580156108bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108e3919061208e565b1580156109765750825160208401516040808601519051634d69ee5760e01b81526001600160a01b03851693634d69ee57936109269391929091906004016122cf565b60206040518083038186803b15801561093e57600080fd5b505afa158015610952573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610976919061208e565b9392505050565b600080836109bf6040518060400160405280601a81526020017f4f564d5f4c3243726f7373446f6d61696e4d657373656e676572000000000000815250610243565b6040516020016109d09291906121c8565b6040516020818303038152906040528051906020012060006040516020016109f992919061219e565b604051602081830303815290604052805190602001209050600080610a48602160991b604051602001610a2c919061217d565b60408051601f1981840301815291905260608701518751610ada565b9092509050600182151514610a6f5760405162461bcd60e51b815260040161034f906123db565b6000610a7a82610b03565b9050610acf84604051602001610a909190612195565b6040516020818303038152906040526001604051602001610ab19190612234565b60405160208183030381529060405288608001518460400151610b95565b979650505050505050565b600060606000610ae986610bb9565b9050610af6818686610be9565b9250925050935093915050565b610b0b611c28565b6000610b1683610cbc565b90506040518060800160405280610b4083600081518110610b3357fe5b6020026020010151610ccf565b8152602001610b5583600181518110610b3357fe5b8152602001610b7783600281518110610b6a57fe5b6020026020010151610cd6565b8152602001610b8c83600381518110610b6a57fe5b90529392505050565b600080610ba186610bb9565b9050610baf81868686610dcf565b9695505050505050565b60608180519060200120604051602001610bd39190612195565b6040516020818303038152906040529050919050565b600060606000610bf885610df5565b90506000806000610c0a848a89610ecc565b81519295509093509150158080610c1e5750815b610c6f576040805162461bcd60e51b815260206004820152601a60248201527f50726f76696465642070726f6f6620697320696e76616c69642e000000000000604482015290519081900360640190fd5b600081610c8b5760405180602001604052806000815250610caa565b610caa866001870381518110610c9d57fe5b602002602001015161126f565b919b919a509098505050505050505050565b606061081a610cca8361128b565b6112b0565b600061081a825b6000602182600001511115610d32576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e000000000000604482015290519081900360640190fd5b6000806000610d4085611426565b919450925090506000816001811115610d5557fe5b14610da7576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e000000000000604482015290519081900360640190fd5b602080860151840180519091841015610baf5760208490036101000a90049695505050505050565b6000806000610ddf878686610be9565b91509150818015610acf5750610acf868261174f565b60606000610e0283610cbc565b90506000815167ffffffffffffffff81118015610e1e57600080fd5b50604051908082528060200260200182016040528015610e5857816020015b610e45611c4f565b815260200190600190039081610e3d5790505b50905060005b8251811015610ec4576000610e85848381518110610e7857fe5b6020026020010151611765565b90506040518060400160405280828152602001610ea183610cbc565b815250838381518110610eb057fe5b602090810291909101015250600101610e5e565b509392505050565b60006060818080610edc876117f4565b905085600080610eea611c4f565b60005b8c51811015611247578c8181518110610f0257fe5b6020026020010151915082840193506001870196508360001415610f7657815180516020909101208514610f71576040805162461bcd60e51b8152602060048201526011602482015270092dcecc2d8d2c840e4dedee840d0c2e6d607b1b604482015290519081900360640190fd5b61103d565b815151602011610fdd57815180516020909101208514610f71576040805162461bcd60e51b815260206004820152601b60248201527f496e76616c6964206c6172676520696e7465726e616c20686173680000000000604482015290519081900360640190fd5b84610feb83600001516118f1565b1461103d576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420696e7465726e616c206e6f64652068617368000000000000604482015290519081900360640190fd5b602082015151601114156110ac57855184141561105957611247565b600086858151811061106757fe5b602001015160f81c60f81b60f81c9050600083602001518260ff168151811061108c57fe5b6020026020010151905061109f8161191d565b965060019450505061123f565b600282602001515114156111f25760006110c583611953565b90506000816000815181106110d657fe5b016020015160f81c90506001811660020360006110f68460ff8416611971565b905060006111048b8a611971565b9050600061111283836119a2565b905060ff851660021480611129575060ff85166003145b1561115b5780835114801561113e5750808251145b1561114857988901985b50600160ff1b9950611247945050505050565b60ff8516158061116e575060ff85166001145b156111bb578061118b5750600160ff1b9950611247945050505050565b6111ac886020015160018151811061119f57fe5b602002602001015161191d565b9a50975061123f945050505050565b60405162461bcd60e51b81526004018080602001828103825260268152602001806126126026913960400191505060405180910390fd5b6040805162461bcd60e51b815260206004820152601d60248201527f526563656976656420616e20756e706172736561626c65206e6f64652e000000604482015290519081900360640190fd5b600101610eed565b50600160ff1b84148661125a8786611971565b909e909d50909b509950505050505050505050565b6020810151805160609161081a916000198101908110610e7857fe5b611293611c69565b506040805180820190915281518152602082810190820152919050565b60606000806112be84611426565b919350909150600190508160018111156112d457fe5b14611326576040805162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c50206c6973742076616c75652e000000000000000000604482015290519081900360640190fd5b6040805160208082526104208201909252600091816020015b611347611c69565b81526020019060019003908161133f5790505090506000835b865181101561141b57602082106113a85760405162461bcd60e51b815260040180806020018281038252602a8152602001806125e8602a913960400191505060405180910390fd5b6000806113d46040518060400160405280858c60000151038152602001858c6020015101815250611426565b509150915060405180604001604052808383018152602001848b602001510181525085858151811061140257fe5b6020908102919091010152600193909301920101611360565b508152949350505050565b600080600080846000015111611483576040805162461bcd60e51b815260206004820152601860248201527f524c50206974656d2063616e6e6f74206265206e756c6c2e0000000000000000604482015290519081900360640190fd5b6020840151805160001a607f81116114a8576000600160009450945094505050611748565b60b7811161151d578551607f19820190811061150b576040805162461bcd60e51b815260206004820152601960248201527f496e76616c696420524c502073686f727420737472696e672e00000000000000604482015290519081900360640190fd5b60019550935060009250611748915050565b60bf811161160157855160b6198201908110611580576040805162461bcd60e51b815260206004820152601f60248201527f496e76616c696420524c50206c6f6e6720737472696e67206c656e6774682e00604482015290519081900360640190fd5b6000816020036101000a60018501510490508082018860000151116115ec576040805162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c50206c6f6e6720737472696e672e0000000000000000604482015290519081900360640190fd5b60019091019550935060009250611748915050565b60f7811161167557855160bf198201908110611664576040805162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c502073686f7274206c6973742e000000000000000000604482015290519081900360640190fd5b600195509350849250611748915050565b855160f61982019081106116d0576040805162461bcd60e51b815260206004820152601d60248201527f496e76616c696420524c50206c6f6e67206c697374206c656e6774682e000000604482015290519081900360640190fd5b6000816020036101000a6001850151049050808201886000015111611735576040805162461bcd60e51b815260206004820152601660248201527524b73b30b634b210292628103637b733903634b9ba1760511b604482015290519081900360640190fd5b6001918201965094509250611748915050565b9193909250565b8051602091820120825192909101919091201490565b6060600080600061177585611426565b91945092509050600081600181111561178a57fe5b146117dc576040805162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c502062797465732076616c75652e0000000000000000604482015290519081900360640190fd5b6117eb85602001518484611a08565b95945050505050565b60606000825160020267ffffffffffffffff8111801561181357600080fd5b506040519080825280601f01601f19166020018201604052801561183e576020820181803683370190505b50905060005b83518110156118ea57600484828151811061185b57fe5b602001015160f81c60f81b6001600160f81b031916901c82826002028151811061188157fe5b60200101906001600160f81b031916908160001a90535060108482815181106118a657fe5b016020015160f81c816118b557fe5b0660f81b8282600202600101815181106118cb57fe5b60200101906001600160f81b031916908160001a905350600101611844565b5092915050565b60006020825110156119085750602081015161031a565b81806020019051602081101561031557600080fd5b6000606060208360000151101561193e5761193783611ab6565b905061194a565b61194783611765565b90505b610976816118f1565b606061081a61196c8360200151600081518110610e7857fe5b6117f4565b60608183510360001415611994575060408051602081019091526000815261081a565b610817838384865103611ac1565b6000805b8084511180156119b65750808351115b80156119fb57508281815181106119c957fe5b602001015160f81c60f81b6001600160f81b0319168482815181106119ea57fe5b01602001516001600160f81b031916145b15610817576001016119a6565b606060008267ffffffffffffffff81118015611a2357600080fd5b506040519080825280601f01601f191660200182016040528015611a4e576020820181803683370190505b509050805160001415611a62579050610976565b8484016020820160005b60208604811015611a8d578251825260209283019290910190600101611a6c565b5080519151601f959095166020036101000a600019019182169119909416179092525092915050565b606061081a82611c12565b60608182601f011015611b0c576040805162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b604482015290519081900360640190fd5b828284011015611b54576040805162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b604482015290519081900360640190fd5b81830184511015611ba0576040805162461bcd60e51b8152602060048201526011602482015270736c6963655f6f75744f66426f756e647360781b604482015290519081900360640190fd5b606082158015611bbf5760405191506000825260208201604052611c09565b6040519150601f8416801560200281840101858101878315602002848b0101015b81831015611bf8578051835260209283019201611be0565b5050858452601f01601f1916604052505b50949350505050565b606061081a826020015160008460000151611a08565b60408051608081018252600080825260208201819052918101829052606081019190915290565b604051806040016040528060608152602001606081525090565b604051806040016040528060008152602001600081525090565b600067ffffffffffffffff831115611c9757fe5b611caa601f8401601f1916602001612593565b9050828152838383011115611cbe57600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b038116811461031a57600080fd5b600082601f830112611cfc578081fd5b61081783833560208501611c83565b600060a08284031215611d1c578081fd5b60405160a0810167ffffffffffffffff8282108183111715611d3a57fe5b81604052829350843583526020850135602084015260408501356040840152606085013560608401526080850135915080821115611d7757600080fd5b50611d8485828601611cec565b6080830152505092915050565b600060408284031215611da2578081fd5b6040516040810167ffffffffffffffff8282108183111715611dc057fe5b8160405282935084358352602091508185013581811115611de057600080fd5b8501601f81018713611df157600080fd5b803582811115611dfd57fe5b8381029250611e0d848401612593565b8181528481019083860185850187018b1015611e2857600080fd5b600095505b83861015611e4b578035835260019590950194918601918601611e2d565b5080868801525050505050505092915050565b803563ffffffff8116811461031a57600080fd5b600060208284031215611e83578081fd5b61081782611cd5565b600080600080600060a08688031215611ea3578081fd5b611eac86611cd5565b9450611eba60208701611cd5565b9350604086013567ffffffffffffffff80821115611ed6578283fd5b611ee289838a01611cec565b9450606088013593506080880135915080821115611efe578283fd5b9087019060a0828a031215611f11578283fd5b611f1b60a0612593565b82358152602083013582811115611f30578485fd5b611f3c8b828601611d0b565b602083015250604083013582811115611f53578485fd5b611f5f8b828601611d91565b604083015250606083013582811115611f76578485fd5b611f828b828601611cec565b606083015250608083013582811115611f99578485fd5b611fa58b828601611cec565b6080830152508093505050509295509295909350565b600080600080600060a08688031215611fd2578081fd5b611fdb86611cd5565b9450611fe960208701611cd5565b9350604086013567ffffffffffffffff811115612004578182fd5b61201088828901611cec565b9350506060860135915061202660808701611e5e565b90509295509295909350565b600080600060608486031215612046578283fd5b61204f84611cd5565b9250602084013567ffffffffffffffff81111561206a578283fd5b61207686828701611cec565b92505061208560408501611e5e565b90509250925092565b60006020828403121561209f578081fd5b81518015158114610817578182fd5b6000602082840312156120bf578081fd5b5035919050565b6000602082840312156120d7578081fd5b813567ffffffffffffffff8111156120ed578182fd5b8201601f810184136120fd578182fd5b61210c84823560208401611c83565b949350505050565b6000815180845261212c8160208601602086016125b7565b601f01601f19169290920160200192915050565b600081518352602082015160208401526040820151604084015260608201516060840152608082015160a0608085015261210c60a0850182612114565b60609190911b6001600160601b031916815260140190565b90815260200190565b918252602082015260400190565b600082516121be8184602087016125b7565b9190910192915050565b600083516121da8184602088016125b7565b60609390931b6001600160601b0319169190920190815260140192915050565b6000845161220c8184602089016125b7565b60609490941b6001600160601b03191691909301908152601481019190915260340192915050565b60f89190911b6001600160f81b031916815260010190565b6001600160a01b0391909116815260200190565b6001600160a01b0385811682528416602082015260806040820181905260009061228c90830185612114565b905082606083015295945050505050565b600060018060a01b0385168252836020830152606060408301526117eb6060830184612114565b901515815260200190565b600084825260206060818401526122e96060840186612140565b838103604085015260408101855182528286015160408484015281815180845260608501915085830194508693505b808410156123385784518252938501936001939093019290850190612318565b509998505050505050505050565b6000602082526108176020830184612114565b6020808252601f908201527f78446f6d61696e4d65737361676553656e646572206973206e6f742073657400604082015260600190565b6020808252602b908201527f50726f7669646564206d6573736167652068617320616c72656164792062656560408201526a37103932b1b2b4bb32b21760a91b606082015260800190565b6020808252604d908201527f4d6573736167652070617373696e67207072656465706c6f7920686173206e6f60408201527f74206265656e20696e697469616c697a6564206f7220696e76616c696420707260608201526c37b7b310383937bb34b232b21760991b608082015260a00190565b6020808252602b908201527f50726f7669646564206d65737361676520686173206e6f7420616c726561647960408201526a103132b2b71039b2b73a1760a91b606082015260800190565b60208082526036908201527f4f6e6c79204f564d5f4c324d65737361676552656c617965722063616e2072656040820152753630bc90261916ba3796a6189036b2b9b9b0b3b2b99760511b606082015260800190565b60208082526027908201527f50726f7669646564206d65737361676520636f756c64206e6f742062652076656040820152663934b334b2b21760c91b606082015260800190565b6020808252602a908201527f4c3143726f7373446f6d61696e4d657373656e67657220616c72656164792069604082015269373a34b0b634bd32b21760b11b606082015260800190565b6000602082526108176020830184612140565b60405181810167ffffffffffffffff811182821017156125af57fe5b604052919050565b60005b838110156125d25781810151838201526020016125ba565b838111156125e1576000848401525b5050505056fe50726f766964656420524c50206c6973742065786365656473206d6178206c697374206c656e6774682e52656365697665642061206e6f6465207769746820616e20756e6b6e6f776e20707265666978a164736f6c6343000706000a", + "solcInputHash": "f2bdab652d5102f5f11e78dae866798d", + "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"msgHash\",\"type\":\"bytes32\"}],\"name\":\"FailedRelayedMessage\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"_xDomainCalldataHash\",\"type\":\"bytes32\"}],\"name\":\"MessageAllowed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"_xDomainCalldataHash\",\"type\":\"bytes32\"}],\"name\":\"MessageBlocked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Paused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"msgHash\",\"type\":\"bytes32\"}],\"name\":\"RelayedMessage\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"}],\"name\":\"SentMessage\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Unpaused\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_xDomainCalldataHash\",\"type\":\"bytes32\"}],\"name\":\"allowMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_xDomainCalldataHash\",\"type\":\"bytes32\"}],\"name\":\"blockMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"blockedMessages\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"messageNonce\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"paused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_sender\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_message\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"_messageNonce\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"stateRootBatchHeader\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"siblings\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct Lib_OVMCodec.ChainInclusionProof\",\"name\":\"stateRootProof\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"stateTrieWitness\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"storageTrieWitness\",\"type\":\"bytes\"}],\"internalType\":\"struct iOVM_L1CrossDomainMessenger.L2MessageInclusionProof\",\"name\":\"_proof\",\"type\":\"tuple\"}],\"name\":\"relayMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"relayedMessages\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_sender\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_message\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"_messageNonce\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"_gasLimit\",\"type\":\"uint32\"}],\"name\":\"replayMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_message\",\"type\":\"bytes\"},{\"internalType\":\"uint32\",\"name\":\"_gasLimit\",\"type\":\"uint32\"}],\"name\":\"sendMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"sentMessages\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"successfulMessages\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"xDomainMessageSender\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The L1 Cross Domain Messenger contract sends messages from L1 to L2, and relays messages from L2 onto L1. In the event that a message sent from L1 to L2 is rejected for exceeding the L2 epoch gas limit, it can be resubmitted via this contract's replay function. Compiler used: solc Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"allowMessage(bytes32)\":{\"params\":{\"_xDomainCalldataHash\":\"Hash of the message to block.\"}},\"blockMessage(bytes32)\":{\"params\":{\"_xDomainCalldataHash\":\"Hash of the message to block.\"}},\"initialize(address)\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"paused()\":{\"details\":\"Returns true if the contract is paused, and false otherwise.\"},\"relayMessage(address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))\":{\"params\":{\"_message\":\"Message to send to the target.\",\"_messageNonce\":\"Nonce for the provided message.\",\"_proof\":\"Inclusion proof for the given message.\",\"_sender\":\"Message sender address.\",\"_target\":\"Target contract address.\"}},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner.\"},\"replayMessage(address,address,bytes,uint256,uint32)\":{\"params\":{\"_gasLimit\":\"Gas limit for the provided message.\",\"_message\":\"Message to send to the target.\",\"_messageNonce\":\"Nonce for the provided message.\",\"_sender\":\"Original sender address.\",\"_target\":\"Target contract address.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}},\"sendMessage(address,bytes,uint32)\":{\"params\":{\"_gasLimit\":\"Gas limit for the provided message.\",\"_message\":\"Message to send to the target.\",\"_target\":\"Target contract address.\"}},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"}},\"title\":\"OVM_L1CrossDomainMessenger\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"allowMessage(bytes32)\":{\"notice\":\"Allow a message.\"},\"blockMessage(bytes32)\":{\"notice\":\"Block a message.\"},\"constructor\":{\"notice\":\"This contract is intended to be behind a delegate proxy. We pass the zero address to the address resolver just to satisfy the constructor. We still need to set this value in initialize().\"},\"pause()\":{\"notice\":\"Pause relaying.\"},\"relayMessage(address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))\":{\"notice\":\"Relays a cross domain message to a contract.\"},\"replayMessage(address,address,bytes,uint256,uint32)\":{\"notice\":\"Replays a cross domain message to the target messenger.\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"},\"sendMessage(address,bytes,uint32)\":{\"notice\":\"Sends a cross domain message to the target messenger.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1CrossDomainMessenger.sol\":\"OVM_L1CrossDomainMessenger\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../utils/ContextUpgradeable.sol\\\";\\nimport \\\"../proxy/Initializable.sol\\\";\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n function __Ownable_init() internal initializer {\\n __Context_init_unchained();\\n __Ownable_init_unchained();\\n }\\n\\n function __Ownable_init_unchained() internal initializer {\\n address msgSender = _msgSender();\\n _owner = msgSender;\\n emit OwnershipTransferred(address(0), msgSender);\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n emit OwnershipTransferred(_owner, address(0));\\n _owner = address(0);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n emit OwnershipTransferred(_owner, newOwner);\\n _owner = newOwner;\\n }\\n uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0xb419e68addcb82ecda3ad3974b0d2db76435ce9b08435a04d5b119a0c5d45ea5\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\n// solhint-disable-next-line compiler-version\\npragma solidity >=0.4.24 <0.8.0;\\n\\nimport \\\"../utils/AddressUpgradeable.sol\\\";\\n\\n/**\\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\\n * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an\\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\\n *\\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\\n * possible by providing the encoded function call as the `_data` argument to {UpgradeableProxy-constructor}.\\n *\\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\\n */\\nabstract contract Initializable {\\n\\n /**\\n * @dev Indicates that the contract has been initialized.\\n */\\n bool private _initialized;\\n\\n /**\\n * @dev Indicates that the contract is in the process of being initialized.\\n */\\n bool private _initializing;\\n\\n /**\\n * @dev Modifier to protect an initializer function from being invoked twice.\\n */\\n modifier initializer() {\\n require(_initializing || _isConstructor() || !_initialized, \\\"Initializable: contract is already initialized\\\");\\n\\n bool isTopLevelCall = !_initializing;\\n if (isTopLevelCall) {\\n _initializing = true;\\n _initialized = true;\\n }\\n\\n _;\\n\\n if (isTopLevelCall) {\\n _initializing = false;\\n }\\n }\\n\\n /// @dev Returns true if and only if the function is running in the constructor\\n function _isConstructor() private view returns (bool) {\\n return !AddressUpgradeable.isContract(address(this));\\n }\\n}\\n\",\"keccak256\":\"0xd8e4eb08dcc1d1860fb347ba5ffd595242b9a1b66d49a47f2b4cb51c3f35017e\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.2 <0.8.0;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary AddressUpgradeable {\\n /**\\n * @dev Returns true if `account` is a contract.\\n *\\n * [IMPORTANT]\\n * ====\\n * It is unsafe to assume that an address for which this function returns\\n * false is an externally-owned account (EOA) and not a contract.\\n *\\n * Among others, `isContract` will return false for the following\\n * types of addresses:\\n *\\n * - an externally-owned account\\n * - a contract in construction\\n * - an address where a contract will be created\\n * - an address where a contract lived, but was destroyed\\n * ====\\n */\\n function isContract(address account) internal view returns (bool) {\\n // This method relies on extcodesize, which returns 0 for contracts in\\n // construction, since the code is only stored at the end of the\\n // constructor execution.\\n\\n uint256 size;\\n // solhint-disable-next-line no-inline-assembly\\n assembly { size := extcodesize(account) }\\n return size > 0;\\n }\\n\\n /**\\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n * `recipient`, forwarding all available gas and reverting on errors.\\n *\\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n * imposed by `transfer`, making them unable to receive funds via\\n * `transfer`. {sendValue} removes this limitation.\\n *\\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n *\\n * IMPORTANT: because control is transferred to `recipient`, care must be\\n * taken to not create reentrancy vulnerabilities. Consider using\\n * {ReentrancyGuard} or the\\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n */\\n function sendValue(address payable recipient, uint256 amount) internal {\\n require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n // solhint-disable-next-line avoid-low-level-calls, avoid-call-value\\n (bool success, ) = recipient.call{ value: amount }(\\\"\\\");\\n require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n }\\n\\n /**\\n * @dev Performs a Solidity function call using a low level `call`. A\\n * plain`call` is an unsafe replacement for a function call: use this\\n * function instead.\\n *\\n * If `target` reverts with a revert reason, it is bubbled up by this\\n * function (like regular Solidity function calls).\\n *\\n * Returns the raw returned data. To convert to the expected return value,\\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n *\\n * Requirements:\\n *\\n * - `target` must be a contract.\\n * - calling `target` with `data` must not revert.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionCall(target, data, \\\"Address: low-level call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n * `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but also transferring `value` wei to `target`.\\n *\\n * Requirements:\\n *\\n * - the calling contract must have an ETH balance of at least `value`.\\n * - the called Solidity function must be `payable`.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n * with `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {\\n require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n require(isContract(target), \\\"Address: call to non-contract\\\");\\n\\n // solhint-disable-next-line avoid-low-level-calls\\n (bool success, bytes memory returndata) = target.call{ value: value }(data);\\n return _verifyCallResult(success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {\\n require(isContract(target), \\\"Address: static call to non-contract\\\");\\n\\n // solhint-disable-next-line avoid-low-level-calls\\n (bool success, bytes memory returndata) = target.staticcall(data);\\n return _verifyCallResult(success, returndata, errorMessage);\\n }\\n\\n function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {\\n if (success) {\\n return returndata;\\n } else {\\n // Look for revert reason and bubble it up if present\\n if (returndata.length > 0) {\\n // The easiest way to bubble the revert reason is using memory via assembly\\n\\n // solhint-disable-next-line no-inline-assembly\\n assembly {\\n let returndata_size := mload(returndata)\\n revert(add(32, returndata), returndata_size)\\n }\\n } else {\\n revert(errorMessage);\\n }\\n }\\n }\\n}\\n\",\"keccak256\":\"0xfc5ea91fa9ceb1961023b2a6c978b902888c52b90847ac7813fe3b79524165f6\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with GSN meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract ContextUpgradeable is Initializable {\\n function __Context_init() internal initializer {\\n __Context_init_unchained();\\n }\\n\\n function __Context_init_unchained() internal initializer {\\n }\\n function _msgSender() internal view virtual returns (address payable) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes memory) {\\n this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n return msg.data;\\n }\\n uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0xbbf8a21b9a66c48d45ff771b8563c6df19ba451d63dfb8380a865c1e1f29d1a0\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"./ContextUpgradeable.sol\\\";\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev Contract module which allows children to implement an emergency stop\\n * mechanism that can be triggered by an authorized account.\\n *\\n * This module is used through inheritance. It will make available the\\n * modifiers `whenNotPaused` and `whenPaused`, which can be applied to\\n * the functions of your contract. Note that they will not be pausable by\\n * simply including this module, only once the modifiers are put in place.\\n */\\nabstract contract PausableUpgradeable is Initializable, ContextUpgradeable {\\n /**\\n * @dev Emitted when the pause is triggered by `account`.\\n */\\n event Paused(address account);\\n\\n /**\\n * @dev Emitted when the pause is lifted by `account`.\\n */\\n event Unpaused(address account);\\n\\n bool private _paused;\\n\\n /**\\n * @dev Initializes the contract in unpaused state.\\n */\\n function __Pausable_init() internal initializer {\\n __Context_init_unchained();\\n __Pausable_init_unchained();\\n }\\n\\n function __Pausable_init_unchained() internal initializer {\\n _paused = false;\\n }\\n\\n /**\\n * @dev Returns true if the contract is paused, and false otherwise.\\n */\\n function paused() public view virtual returns (bool) {\\n return _paused;\\n }\\n\\n /**\\n * @dev Modifier to make a function callable only when the contract is not paused.\\n *\\n * Requirements:\\n *\\n * - The contract must not be paused.\\n */\\n modifier whenNotPaused() {\\n require(!paused(), \\\"Pausable: paused\\\");\\n _;\\n }\\n\\n /**\\n * @dev Modifier to make a function callable only when the contract is paused.\\n *\\n * Requirements:\\n *\\n * - The contract must be paused.\\n */\\n modifier whenPaused() {\\n require(paused(), \\\"Pausable: not paused\\\");\\n _;\\n }\\n\\n /**\\n * @dev Triggers stopped state.\\n *\\n * Requirements:\\n *\\n * - The contract must not be paused.\\n */\\n function _pause() internal virtual whenNotPaused {\\n _paused = true;\\n emit Paused(_msgSender());\\n }\\n\\n /**\\n * @dev Returns to normal state.\\n *\\n * Requirements:\\n *\\n * - The contract must be paused.\\n */\\n function _unpause() internal virtual whenPaused {\\n _paused = false;\\n emit Unpaused(_msgSender());\\n }\\n uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0x73bef0a5dec3efde8183c4858d90f683ed2771656c4329647b4d5b0f89498fd5\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev Contract module that helps prevent reentrant calls to a function.\\n *\\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\\n * available, which can be applied to functions to make sure there are no nested\\n * (reentrant) calls to them.\\n *\\n * Note that because there is a single `nonReentrant` guard, functions marked as\\n * `nonReentrant` may not call one another. This can be worked around by making\\n * those functions `private`, and then adding `external` `nonReentrant` entry\\n * points to them.\\n *\\n * TIP: If you would like to learn more about reentrancy and alternative ways\\n * to protect against it, check out our blog post\\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\\n */\\nabstract contract ReentrancyGuardUpgradeable is Initializable {\\n // Booleans are more expensive than uint256 or any type that takes up a full\\n // word because each write operation emits an extra SLOAD to first read the\\n // slot's contents, replace the bits taken up by the boolean, and then write\\n // back. This is the compiler's defense against contract upgrades and\\n // pointer aliasing, and it cannot be disabled.\\n\\n // The values being non-zero value makes deployment a bit more expensive,\\n // but in exchange the refund on every call to nonReentrant will be lower in\\n // amount. Since refunds are capped to a percentage of the total\\n // transaction's gas, it is best to keep them low in cases like this one, to\\n // increase the likelihood of the full refund coming into effect.\\n uint256 private constant _NOT_ENTERED = 1;\\n uint256 private constant _ENTERED = 2;\\n\\n uint256 private _status;\\n\\n function __ReentrancyGuard_init() internal initializer {\\n __ReentrancyGuard_init_unchained();\\n }\\n\\n function __ReentrancyGuard_init_unchained() internal initializer {\\n _status = _NOT_ENTERED;\\n }\\n\\n /**\\n * @dev Prevents a contract from calling itself, directly or indirectly.\\n * Calling a `nonReentrant` function from another `nonReentrant`\\n * function is not supported. It is possible to prevent this from happening\\n * by making the `nonReentrant` function external, and make it call a\\n * `private` function that does the actual work.\\n */\\n modifier nonReentrant() {\\n // On the first call to nonReentrant, _notEntered will be true\\n require(_status != _ENTERED, \\\"ReentrancyGuard: reentrant call\\\");\\n\\n // Any calls to nonReentrant after this point will fail\\n _status = _ENTERED;\\n\\n _;\\n\\n // By storing the original value once again, a refund is triggered (see\\n // https://eips.ethereum.org/EIPS/eip-2200)\\n _status = _NOT_ENTERED;\\n }\\n uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0x46034cd5cca740f636345c8f7aebae0f78adfd4b70e31e6f888cccbe1086586e\",\"license\":\"MIT\"},\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor () internal {\\n address msgSender = _msgSender();\\n _owner = msgSender;\\n emit OwnershipTransferred(address(0), msgSender);\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n emit OwnershipTransferred(_owner, address(0));\\n _owner = address(0);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n emit OwnershipTransferred(_owner, newOwner);\\n _owner = newOwner;\\n }\\n}\\n\",\"keccak256\":\"0x15e2d5bd4c28a88548074c54d220e8086f638a71ed07e6b3ba5a70066fcf458d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with GSN meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address payable) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes memory) {\\n this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x8d3cb350f04ff49cfb10aef08d87f19dcbaecc8027b0bed12f3275cd12f38cf0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/bridge/messaging/Abs_BaseCrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Interface Imports */\\nimport { iAbs_BaseCrossDomainMessenger } from \\\"../../../iOVM/bridge/messaging/iAbs_BaseCrossDomainMessenger.sol\\\";\\n\\n/**\\n * @title Abs_BaseCrossDomainMessenger\\n * @dev The Base Cross Domain Messenger is an abstract contract providing the interface and common\\n * functionality used in the L1 and L2 Cross Domain Messengers. It can also serve as a template for\\n * developers wishing to implement a custom bridge contract to suit their needs.\\n *\\n * Compiler used: defined by child contract\\n * Runtime target: defined by child contract\\n */\\nabstract contract Abs_BaseCrossDomainMessenger is iAbs_BaseCrossDomainMessenger {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n // The default x-domain message sender being set to a non-zero value makes\\n // deployment a bit more expensive, but in exchange the refund on every call to\\n // `relayMessage` by the L1 and L2 messengers will be higher.\\n address internal constant DEFAULT_XDOMAIN_SENDER = 0x000000000000000000000000000000000000dEaD;\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping (bytes32 => bool) public relayedMessages;\\n mapping (bytes32 => bool) public successfulMessages;\\n mapping (bytes32 => bool) public sentMessages;\\n uint256 public messageNonce;\\n address internal xDomainMsgSender = DEFAULT_XDOMAIN_SENDER;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n constructor() {}\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function xDomainMessageSender()\\n public\\n override\\n view\\n returns (\\n address\\n )\\n {\\n require(xDomainMsgSender != DEFAULT_XDOMAIN_SENDER, \\\"xDomainMessageSender is not set\\\");\\n return xDomainMsgSender;\\n }\\n\\n /**\\n * Sends a cross domain message to the target messenger.\\n * @param _target Target contract address.\\n * @param _message Message to send to the target.\\n * @param _gasLimit Gas limit for the provided message.\\n */\\n function sendMessage(\\n address _target,\\n bytes memory _message,\\n uint32 _gasLimit\\n )\\n override\\n public\\n {\\n bytes memory xDomainCalldata = _getXDomainCalldata(\\n _target,\\n msg.sender,\\n _message,\\n messageNonce\\n );\\n\\n messageNonce += 1;\\n sentMessages[keccak256(xDomainCalldata)] = true;\\n\\n _sendXDomainMessage(xDomainCalldata, _gasLimit);\\n emit SentMessage(xDomainCalldata);\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Generates the correct cross domain calldata for a message.\\n * @param _target Target contract address.\\n * @param _sender Message sender address.\\n * @param _message Message to send to the target.\\n * @param _messageNonce Nonce for the provided message.\\n * @return ABI encoded cross domain calldata.\\n */\\n function _getXDomainCalldata(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _messageNonce\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return abi.encodeWithSignature(\\n \\\"relayMessage(address,address,bytes,uint256)\\\",\\n _target,\\n _sender,\\n _message,\\n _messageNonce\\n );\\n }\\n\\n /**\\n * Sends a cross domain message.\\n * param // Message to send.\\n * param // Gas limit for the provided message.\\n */\\n function _sendXDomainMessage(\\n bytes memory, // _message,\\n uint256 // _gasLimit\\n )\\n virtual\\n internal\\n {\\n revert(\\\"Implement me in child contracts!\\\");\\n }\\n}\\n\",\"keccak256\":\"0xed5dafa41fadfd461e33c042da3a721f2cce73e0d2418d170a44161f7714a439\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1CrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../../libraries/resolver/Lib_AddressResolver.sol\\\";\\nimport { Lib_AddressManager } from \\\"../../../libraries/resolver/Lib_AddressManager.sol\\\";\\nimport { Lib_SecureMerkleTrie } from \\\"../../../libraries/trie/Lib_SecureMerkleTrie.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_L1CrossDomainMessenger } from \\\"../../../iOVM/bridge/messaging/iOVM_L1CrossDomainMessenger.sol\\\";\\nimport { iOVM_CanonicalTransactionChain } from \\\"../../../iOVM/chain/iOVM_CanonicalTransactionChain.sol\\\";\\nimport { iOVM_StateCommitmentChain } from \\\"../../../iOVM/chain/iOVM_StateCommitmentChain.sol\\\";\\n\\n/* Contract Imports */\\nimport { Abs_BaseCrossDomainMessenger } from \\\"./Abs_BaseCrossDomainMessenger.sol\\\";\\n\\n/* External Imports */\\nimport { OwnableUpgradeable } from \\\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\\\";\\nimport { PausableUpgradeable } from \\\"@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol\\\";\\nimport { ReentrancyGuardUpgradeable } from \\\"@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol\\\";\\n\\n/**\\n * @title OVM_L1CrossDomainMessenger\\n * @dev The L1 Cross Domain Messenger contract sends messages from L1 to L2, and relays messages\\n * from L2 onto L1. In the event that a message sent from L1 to L2 is rejected for exceeding the L2\\n * epoch gas limit, it can be resubmitted via this contract's replay function.\\n *\\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract OVM_L1CrossDomainMessenger is\\n iOVM_L1CrossDomainMessenger,\\n Abs_BaseCrossDomainMessenger,\\n Lib_AddressResolver,\\n OwnableUpgradeable,\\n PausableUpgradeable,\\n ReentrancyGuardUpgradeable\\n{\\n\\n /**********\\n * Events *\\n **********/\\n\\n event MessageBlocked(\\n bytes32 indexed _xDomainCalldataHash\\n );\\n\\n event MessageAllowed(\\n bytes32 indexed _xDomainCalldataHash\\n );\\n\\n /**********************\\n * Contract Variables *\\n **********************/\\n\\n mapping (bytes32 => bool) public blockedMessages;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * This contract is intended to be behind a delegate proxy.\\n * We pass the zero address to the address resolver just to satisfy the constructor.\\n * We still need to set this value in initialize().\\n */\\n constructor()\\n Lib_AddressResolver(address(0))\\n {}\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n /**\\n * Modifier to enforce that, if configured, only the OVM_L2MessageRelayer contract may\\n * successfully call a method.\\n */\\n modifier onlyRelayer() {\\n address relayer = resolve(\\\"OVM_L2MessageRelayer\\\");\\n if (relayer != address(0)) {\\n require(\\n msg.sender == relayer,\\n \\\"Only OVM_L2MessageRelayer can relay L2-to-L1 messages.\\\"\\n );\\n }\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n */\\n function initialize(\\n address _libAddressManager\\n )\\n public\\n initializer\\n {\\n require(\\n address(libAddressManager) == address(0),\\n \\\"L1CrossDomainMessenger already intialized.\\\"\\n );\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n xDomainMsgSender = DEFAULT_XDOMAIN_SENDER;\\n\\n // Initialize upgradable OZ contracts\\n __Context_init_unchained(); // Context is a dependency for both Ownable and Pausable\\n __Ownable_init_unchained();\\n __Pausable_init_unchained();\\n __ReentrancyGuard_init_unchained();\\n }\\n\\n /**\\n * Pause relaying.\\n */\\n function pause()\\n external\\n onlyOwner\\n {\\n _pause();\\n }\\n\\n /**\\n * Block a message.\\n * @param _xDomainCalldataHash Hash of the message to block.\\n */\\n function blockMessage(\\n bytes32 _xDomainCalldataHash\\n )\\n external\\n onlyOwner\\n {\\n blockedMessages[_xDomainCalldataHash] = true;\\n emit MessageBlocked(_xDomainCalldataHash);\\n }\\n\\n /**\\n * Allow a message.\\n * @param _xDomainCalldataHash Hash of the message to block.\\n */\\n function allowMessage(\\n bytes32 _xDomainCalldataHash\\n )\\n external\\n onlyOwner\\n {\\n blockedMessages[_xDomainCalldataHash] = false;\\n emit MessageAllowed(_xDomainCalldataHash);\\n }\\n\\n /**\\n * Relays a cross domain message to a contract.\\n * @inheritdoc iOVM_L1CrossDomainMessenger\\n */\\n function relayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _messageNonce,\\n L2MessageInclusionProof memory _proof\\n )\\n override\\n public\\n nonReentrant\\n onlyRelayer\\n whenNotPaused\\n {\\n bytes memory xDomainCalldata = _getXDomainCalldata(\\n _target,\\n _sender,\\n _message,\\n _messageNonce\\n );\\n\\n require(\\n _verifyXDomainMessage(\\n xDomainCalldata,\\n _proof\\n ) == true,\\n \\\"Provided message could not be verified.\\\"\\n );\\n\\n bytes32 xDomainCalldataHash = keccak256(xDomainCalldata);\\n\\n require(\\n successfulMessages[xDomainCalldataHash] == false,\\n \\\"Provided message has already been received.\\\"\\n );\\n\\n require(\\n blockedMessages[xDomainCalldataHash] == false,\\n \\\"Provided message has been blocked.\\\"\\n );\\n\\n xDomainMsgSender = _sender;\\n (bool success, ) = _target.call(_message);\\n xDomainMsgSender = DEFAULT_XDOMAIN_SENDER;\\n\\n // Mark the message as received if the call was successful. Ensures that a message can be\\n // relayed multiple times in the case that the call reverted.\\n if (success == true) {\\n successfulMessages[xDomainCalldataHash] = true;\\n emit RelayedMessage(xDomainCalldataHash);\\n } else {\\n emit FailedRelayedMessage(xDomainCalldataHash);\\n }\\n\\n // Store an identifier that can be used to prove that the given message was relayed by some\\n // user. Gives us an easy way to pay relayers for their work.\\n bytes32 relayId = keccak256(\\n abi.encodePacked(\\n xDomainCalldata,\\n msg.sender,\\n block.number\\n )\\n );\\n relayedMessages[relayId] = true;\\n }\\n\\n /**\\n * Replays a cross domain message to the target messenger.\\n * @inheritdoc iOVM_L1CrossDomainMessenger\\n */\\n function replayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _messageNonce,\\n uint32 _gasLimit\\n )\\n override\\n public\\n {\\n bytes memory xDomainCalldata = _getXDomainCalldata(\\n _target,\\n _sender,\\n _message,\\n _messageNonce\\n );\\n\\n require(\\n sentMessages[keccak256(xDomainCalldata)] == true,\\n \\\"Provided message has not already been sent.\\\"\\n );\\n\\n _sendXDomainMessage(xDomainCalldata, _gasLimit);\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Verifies that the given message is valid.\\n * @param _xDomainCalldata Calldata to verify.\\n * @param _proof Inclusion proof for the message.\\n * @return Whether or not the provided message is valid.\\n */\\n function _verifyXDomainMessage(\\n bytes memory _xDomainCalldata,\\n L2MessageInclusionProof memory _proof\\n )\\n internal\\n view\\n returns (\\n bool\\n )\\n {\\n return (\\n _verifyStateRootProof(_proof)\\n && _verifyStorageProof(_xDomainCalldata, _proof)\\n );\\n }\\n\\n /**\\n * Verifies that the state root within an inclusion proof is valid.\\n * @param _proof Message inclusion proof.\\n * @return Whether or not the provided proof is valid.\\n */\\n function _verifyStateRootProof(\\n L2MessageInclusionProof memory _proof\\n )\\n internal\\n view\\n returns (\\n bool\\n )\\n {\\n iOVM_StateCommitmentChain ovmStateCommitmentChain = iOVM_StateCommitmentChain(\\n resolve(\\\"OVM_StateCommitmentChain\\\")\\n );\\n\\n return (\\n ovmStateCommitmentChain.insideFraudProofWindow(_proof.stateRootBatchHeader) == false\\n && ovmStateCommitmentChain.verifyStateCommitment(\\n _proof.stateRoot,\\n _proof.stateRootBatchHeader,\\n _proof.stateRootProof\\n )\\n );\\n }\\n\\n /**\\n * Verifies that the storage proof within an inclusion proof is valid.\\n * @param _xDomainCalldata Encoded message calldata.\\n * @param _proof Message inclusion proof.\\n * @return Whether or not the provided proof is valid.\\n */\\n function _verifyStorageProof(\\n bytes memory _xDomainCalldata,\\n L2MessageInclusionProof memory _proof\\n )\\n internal\\n view\\n returns (\\n bool\\n )\\n {\\n bytes32 storageKey = keccak256(\\n abi.encodePacked(\\n keccak256(\\n abi.encodePacked(\\n _xDomainCalldata,\\n resolve(\\\"OVM_L2CrossDomainMessenger\\\")\\n )\\n ),\\n uint256(0)\\n )\\n );\\n\\n (\\n bool exists,\\n bytes memory encodedMessagePassingAccount\\n ) = Lib_SecureMerkleTrie.get(\\n abi.encodePacked(0x4200000000000000000000000000000000000000),\\n _proof.stateTrieWitness,\\n _proof.stateRoot\\n );\\n\\n require(\\n exists == true,\\n \\\"Message passing predeploy has not been initialized or invalid proof provided.\\\"\\n );\\n\\n Lib_OVMCodec.EVMAccount memory account = Lib_OVMCodec.decodeEVMAccount(\\n encodedMessagePassingAccount\\n );\\n\\n return Lib_SecureMerkleTrie.verifyInclusionProof(\\n abi.encodePacked(storageKey),\\n abi.encodePacked(uint8(1)),\\n _proof.storageTrieWitness,\\n account.storageRoot\\n );\\n }\\n\\n /**\\n * Sends a cross domain message.\\n * @param _message Message to send.\\n * @param _gasLimit OVM gas limit for the message.\\n */\\n function _sendXDomainMessage(\\n bytes memory _message,\\n uint256 _gasLimit\\n )\\n override\\n internal\\n {\\n iOVM_CanonicalTransactionChain(resolve(\\\"OVM_CanonicalTransactionChain\\\")).enqueue(\\n resolve(\\\"OVM_L2CrossDomainMessenger\\\"),\\n _gasLimit,\\n _message\\n );\\n }\\n}\\n\",\"keccak256\":\"0xba49f550a93c91448340fdb85ad8e4d4dff523532eb1524add38ee2825cc0442\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/bridge/messaging/iAbs_BaseCrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/**\\n * @title iAbs_BaseCrossDomainMessenger\\n */\\ninterface iAbs_BaseCrossDomainMessenger {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event SentMessage(bytes message);\\n event RelayedMessage(bytes32 msgHash);\\n event FailedRelayedMessage(bytes32 msgHash);\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n function xDomainMessageSender() external view returns (address);\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sends a cross domain message to the target messenger.\\n * @param _target Target contract address.\\n * @param _message Message to send to the target.\\n * @param _gasLimit Gas limit for the provided message.\\n */\\n function sendMessage(\\n address _target,\\n bytes calldata _message,\\n uint32 _gasLimit\\n ) external;\\n}\\n\",\"keccak256\":\"0x89981ed48e99d6939cc6cdef827d484fa3e2292d66c0ba5056c7050cb6282d7e\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/bridge/messaging/iOVM_L1CrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { iAbs_BaseCrossDomainMessenger } from \\\"./iAbs_BaseCrossDomainMessenger.sol\\\";\\n\\n/**\\n * @title iOVM_L1CrossDomainMessenger\\n */\\ninterface iOVM_L1CrossDomainMessenger is iAbs_BaseCrossDomainMessenger {\\n\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n struct L2MessageInclusionProof {\\n bytes32 stateRoot;\\n Lib_OVMCodec.ChainBatchHeader stateRootBatchHeader;\\n Lib_OVMCodec.ChainInclusionProof stateRootProof;\\n bytes stateTrieWitness;\\n bytes storageTrieWitness;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Relays a cross domain message to a contract.\\n * @param _target Target contract address.\\n * @param _sender Message sender address.\\n * @param _message Message to send to the target.\\n * @param _messageNonce Nonce for the provided message.\\n * @param _proof Inclusion proof for the given message.\\n */\\n function relayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _messageNonce,\\n L2MessageInclusionProof memory _proof\\n ) external;\\n\\n /**\\n * Replays a cross domain message to the target messenger.\\n * @param _target Target contract address.\\n * @param _sender Original sender address.\\n * @param _message Message to send to the target.\\n * @param _messageNonce Nonce for the provided message.\\n * @param _gasLimit Gas limit for the provided message.\\n */\\n function replayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _messageNonce,\\n uint32 _gasLimit\\n ) external;\\n}\\n\",\"keccak256\":\"0xdcd239d0b215e400674d78e8db4ac12ba18efc34fa78e24c2ff867f61062dba2\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_CanonicalTransactionChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_ChainStorageContainer } from \\\"./iOVM_ChainStorageContainer.sol\\\";\\n\\n/**\\n * @title iOVM_CanonicalTransactionChain\\n */\\ninterface iOVM_CanonicalTransactionChain {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event TransactionEnqueued(\\n address _l1TxOrigin,\\n address _target,\\n uint256 _gasLimit,\\n bytes _data,\\n uint256 _queueIndex,\\n uint256 _timestamp\\n );\\n\\n event QueueBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event SequencerBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event TransactionBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct BatchContext {\\n uint256 numSequencedTransactions;\\n uint256 numSubsequentQueueTransactions;\\n uint256 timestamp;\\n uint256 blockNumber;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n\\n /**\\n * Accesses the batch storage container.\\n * @return Reference to the batch storage container.\\n */\\n function batches()\\n external\\n view\\n returns (\\n iOVM_ChainStorageContainer\\n );\\n\\n /**\\n * Accesses the queue storage container.\\n * @return Reference to the queue storage container.\\n */\\n function queue()\\n external\\n view\\n returns (\\n iOVM_ChainStorageContainer\\n );\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements()\\n external\\n view\\n returns (\\n uint256 _totalElements\\n );\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches()\\n external\\n view\\n returns (\\n uint256 _totalBatches\\n );\\n\\n /**\\n * Returns the index of the next element to be enqueued.\\n * @return Index for the next queue element.\\n */\\n function getNextQueueIndex()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Gets the queue element at a particular index.\\n * @param _index Index of the queue element to access.\\n * @return _element Queue element at the given index.\\n */\\n function getQueueElement(\\n uint256 _index\\n )\\n external\\n view\\n returns (\\n Lib_OVMCodec.QueueElement memory _element\\n );\\n\\n /**\\n * Returns the timestamp of the last transaction.\\n * @return Timestamp for the last transaction.\\n */\\n function getLastTimestamp()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Returns the blocknumber of the last transaction.\\n * @return Blocknumber for the last transaction.\\n */\\n function getLastBlockNumber()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Get the number of queue elements which have not yet been included.\\n * @return Number of pending queue elements.\\n */\\n function getNumPendingQueueElements()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Retrieves the length of the queue, including\\n * both pending and canonical transactions.\\n * @return Length of the queue.\\n */\\n function getQueueLength()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n\\n /**\\n * Adds a transaction to the queue.\\n * @param _target Target contract to send the transaction to.\\n * @param _gasLimit Gas limit for the given transaction.\\n * @param _data Transaction data.\\n */\\n function enqueue(\\n address _target,\\n uint256 _gasLimit,\\n bytes memory _data\\n )\\n external;\\n\\n /**\\n * Appends a given number of queued transactions as a single batch.\\n * @param _numQueuedTransactions Number of transactions to append.\\n */\\n function appendQueueBatch(\\n uint256 _numQueuedTransactions\\n )\\n external;\\n\\n /**\\n * Allows the sequencer to append a batch of transactions.\\n * @dev This function uses a custom encoding scheme for efficiency reasons.\\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\\n * .param _contexts Array of batch contexts.\\n * .param _transactionDataFields Array of raw transaction data.\\n */\\n function appendSequencerBatch(\\n // uint40 _shouldStartAtElement,\\n // uint24 _totalElementsToAppend,\\n // BatchContext[] _contexts,\\n // bytes[] _transactionDataFields\\n )\\n external;\\n\\n /**\\n * Verifies whether a transaction is included in the chain.\\n * @param _transaction Transaction to verify.\\n * @param _txChainElement Transaction chain element corresponding to the transaction.\\n * @param _batchHeader Header of the batch the transaction was included in.\\n * @param _inclusionProof Inclusion proof for the provided transaction chain element.\\n * @return True if the transaction exists in the CTC, false if not.\\n */\\n function verifyTransaction(\\n Lib_OVMCodec.Transaction memory _transaction,\\n Lib_OVMCodec.TransactionChainElement memory _txChainElement,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _inclusionProof\\n )\\n external\\n view\\n returns (\\n bool\\n );\\n}\\n\",\"keccak256\":\"0xb5e55488a1982841c07cdf5ff475da4789596f111dd48f01b1918ee4c775cf3a\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_ChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title iOVM_ChainStorageContainer\\n */\\ninterface iOVM_ChainStorageContainer {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata()\\n external\\n view\\n returns (\\n bytes27\\n );\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length()\\n external\\n view\\n returns (\\n uint256\\n );\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(\\n bytes32 _object\\n )\\n external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(\\n bytes32 _object,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(\\n uint256 _index\\n )\\n external\\n view\\n returns (\\n bytes32\\n );\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index\\n )\\n external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Marks an index as overwritable, meaing the underlying buffer can start to write values over\\n * any objects before and including the given index.\\n */\\n function setNextOverwritableIndex(\\n uint256 _index\\n )\\n external;\\n}\\n\",\"keccak256\":\"0x2d7973a0ad84c23ec62624d3f1e3aeb198cc72686ff1e6cfa17155556b320c94\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_StateCommitmentChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title iOVM_StateCommitmentChain\\n */\\ninterface iOVM_StateCommitmentChain {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event StateBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n event StateBatchDeleted(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot\\n );\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements()\\n external\\n view\\n returns (\\n uint256 _totalElements\\n );\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches()\\n external\\n view\\n returns (\\n uint256 _totalBatches\\n );\\n\\n /**\\n * Retrieves the timestamp of the last batch submitted by the sequencer.\\n * @return _lastSequencerTimestamp Last sequencer batch timestamp.\\n */\\n function getLastSequencerTimestamp()\\n external\\n view\\n returns (\\n uint256 _lastSequencerTimestamp\\n );\\n\\n /**\\n * Appends a batch of state roots to the chain.\\n * @param _batch Batch of state roots.\\n * @param _shouldStartAtElement Index of the element at which this batch should start.\\n */\\n function appendStateBatch(\\n bytes32[] calldata _batch,\\n uint256 _shouldStartAtElement\\n )\\n external;\\n\\n /**\\n * Deletes all state roots after (and including) a given batch.\\n * @param _batchHeader Header of the batch to start deleting from.\\n */\\n function deleteStateBatch(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n external;\\n\\n /**\\n * Verifies a batch inclusion proof.\\n * @param _element Hash of the element to verify a proof for.\\n * @param _batchHeader Header of the batch in which the element was included.\\n * @param _proof Merkle inclusion proof for the element.\\n */\\n function verifyStateCommitment(\\n bytes32 _element,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _proof\\n )\\n external\\n view\\n returns (\\n bool _verified\\n );\\n\\n /**\\n * Checks whether a given batch is still inside its fraud proof window.\\n * @param _batchHeader Header of the batch to check.\\n * @return _inside Whether or not the batch is inside the fraud proof window.\\n */\\n function insideFraudProofWindow(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n external\\n view\\n returns (\\n bool _inside\\n );\\n}\\n\",\"keccak256\":\"0x6646d6ff392b81aab52a7a277e91540819464751de0af5afd1962094b2e92448\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/codec/Lib_OVMCodec.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../utils/Lib_Bytes32Utils.sol\\\";\\n\\n/**\\n * @title Lib_OVMCodec\\n */\\nlibrary Lib_OVMCodec {\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum QueueOrigin {\\n SEQUENCER_QUEUE,\\n L1TOL2_QUEUE\\n }\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Account {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n address ethAddress;\\n bool isFresh;\\n }\\n\\n struct EVMAccount {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n }\\n\\n struct ChainBatchHeader {\\n uint256 batchIndex;\\n bytes32 batchRoot;\\n uint256 batchSize;\\n uint256 prevTotalElements;\\n bytes extraData;\\n }\\n\\n struct ChainInclusionProof {\\n uint256 index;\\n bytes32[] siblings;\\n }\\n\\n struct Transaction {\\n uint256 timestamp;\\n uint256 blockNumber;\\n QueueOrigin l1QueueOrigin;\\n address l1TxOrigin;\\n address entrypoint;\\n uint256 gasLimit;\\n bytes data;\\n }\\n\\n struct TransactionChainElement {\\n bool isSequenced;\\n uint256 queueIndex; // QUEUED TX ONLY\\n uint256 timestamp; // SEQUENCER TX ONLY\\n uint256 blockNumber; // SEQUENCER TX ONLY\\n bytes txData; // SEQUENCER TX ONLY\\n }\\n\\n struct QueueElement {\\n bytes32 transactionHash;\\n uint40 timestamp;\\n uint40 blockNumber;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Encodes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Encoded transaction bytes.\\n */\\n function encodeTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return abi.encodePacked(\\n _transaction.timestamp,\\n _transaction.blockNumber,\\n _transaction.l1QueueOrigin,\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n );\\n }\\n\\n /**\\n * Hashes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Hashed transaction\\n */\\n function hashTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(encodeTransaction(_transaction));\\n }\\n\\n /**\\n * Converts an OVM account to an EVM account.\\n * @param _in OVM account to convert.\\n * @return Converted EVM account.\\n */\\n function toEVMAccount(\\n Account memory _in\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n return EVMAccount({\\n nonce: _in.nonce,\\n balance: _in.balance,\\n storageRoot: _in.storageRoot,\\n codeHash: _in.codeHash\\n });\\n }\\n\\n /**\\n * @notice RLP-encodes an account state struct.\\n * @param _account Account state struct.\\n * @return RLP-encoded account state.\\n */\\n function encodeEVMAccount(\\n EVMAccount memory _account\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes[] memory raw = new bytes[](4);\\n\\n // Unfortunately we can't create this array outright because\\n // Lib_RLPWriter.writeList will reject fixed-size arrays. Assigning\\n // index-by-index circumvents this issue.\\n raw[0] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.nonce)\\n )\\n );\\n raw[1] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.balance)\\n )\\n );\\n raw[2] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.storageRoot));\\n raw[3] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.codeHash));\\n\\n return Lib_RLPWriter.writeList(raw);\\n }\\n\\n /**\\n * @notice Decodes an RLP-encoded account state into a useful struct.\\n * @param _encoded RLP-encoded account state.\\n * @return Account state struct.\\n */\\n function decodeEVMAccount(\\n bytes memory _encoded\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\\n\\n return EVMAccount({\\n nonce: Lib_RLPReader.readUint256(accountState[0]),\\n balance: Lib_RLPReader.readUint256(accountState[1]),\\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\\n });\\n }\\n\\n /**\\n * Calculates a hash for a given batch header.\\n * @param _batchHeader Header to hash.\\n * @return Hash of the header.\\n */\\n function hashBatchHeader(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(\\n abi.encode(\\n _batchHeader.batchRoot,\\n _batchHeader.batchSize,\\n _batchHeader.prevTotalElements,\\n _batchHeader.extraData\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0xd85ba2066057a2677926f484b938c7c2ef33ff3853f3b71cda252f4a54f30e05\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n external\\n onlyOwner\\n {\\n addresses[_getNameHash(_name)] = _address;\\n\\n emit AddressSet(\\n _name,\\n _address\\n );\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(\\n string memory _name\\n )\\n external\\n view\\n returns (\\n address\\n )\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xcc9fc5c64f1101a5c6c397594086b1608189a9edc5c9635e1ac38f70aeeeecbf\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(\\n address _libAddressManager\\n ) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x65981feeabff6a81783ea97d44baf988a18a86c8cb374c46fdb71819cbacc7c0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPReader.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_RLPReader\\n * @dev Adapted from \\\"RLPReader\\\" by Hamdi Allam (hamdi.allam97@gmail.com).\\n */\\nlibrary Lib_RLPReader {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 constant internal MAX_LIST_LENGTH = 32;\\n\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum RLPItemType {\\n DATA_ITEM,\\n LIST_ITEM\\n }\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct RLPItem {\\n uint256 length;\\n uint256 ptr;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts bytes to a reference to memory position and length.\\n * @param _in Input bytes to convert.\\n * @return Output memory reference.\\n */\\n function toRLPItem(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem memory\\n )\\n {\\n uint256 ptr;\\n assembly {\\n ptr := add(_in, 32)\\n }\\n\\n return RLPItem({\\n length: _in.length,\\n ptr: ptr\\n });\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n (\\n uint256 listOffset,\\n ,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.LIST_ITEM,\\n \\\"Invalid RLP list value.\\\"\\n );\\n\\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\\n // writing to the length. Since we can't know the number of RLP items without looping over\\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\\n // simply set a reasonable maximum list length and decrease the size before we finish.\\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\\n\\n uint256 itemCount = 0;\\n uint256 offset = listOffset;\\n while (offset < _in.length) {\\n require(\\n itemCount < MAX_LIST_LENGTH,\\n \\\"Provided RLP list exceeds max list length.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n ) = _decodeLength(RLPItem({\\n length: _in.length - offset,\\n ptr: _in.ptr + offset\\n }));\\n\\n out[itemCount] = RLPItem({\\n length: itemLength + itemOffset,\\n ptr: _in.ptr + offset\\n });\\n\\n itemCount += 1;\\n offset += itemOffset + itemLength;\\n }\\n\\n // Decrease the array size to match the actual item count.\\n assembly {\\n mstore(out, itemCount)\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n return readList(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes value.\\\"\\n );\\n\\n return _copy(_in.ptr, itemOffset, itemLength);\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return readBytes(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return string(readBytes(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return readString(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n require(\\n _in.length <= 33,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr + itemOffset;\\n bytes32 out;\\n assembly {\\n out := mload(ptr)\\n\\n // Shift the bytes over to match the item size.\\n if lt(itemLength, 32) {\\n out := div(out, exp(256, sub(32, itemLength)))\\n }\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return readBytes32(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return uint256(readBytes32(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return readUint256(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n require(\\n _in.length == 1,\\n \\\"Invalid RLP boolean value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 out;\\n assembly {\\n out := byte(0, mload(ptr))\\n }\\n\\n require(\\n out == 0 || out == 1,\\n \\\"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\\\"\\n );\\n\\n return out != 0;\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return readBool(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n if (_in.length == 1) {\\n return address(0);\\n }\\n\\n require(\\n _in.length == 21,\\n \\\"Invalid RLP address value.\\\"\\n );\\n\\n return address(readUint256(_in));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return readAddress(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads the raw bytes of an RLP item.\\n * @param _in RLP item to read.\\n * @return Raw RLP bytes.\\n */\\n function readRawBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in);\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Decodes the length of an RLP item.\\n * @param _in RLP item to decode.\\n * @return Offset of the encoded data.\\n * @return Length of the encoded data.\\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\\n */\\n function _decodeLength(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n uint256,\\n uint256,\\n RLPItemType\\n )\\n {\\n require(\\n _in.length > 0,\\n \\\"RLP item cannot be null.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 prefix;\\n assembly {\\n prefix := byte(0, mload(ptr))\\n }\\n\\n if (prefix <= 0x7f) {\\n // Single byte.\\n\\n return (0, 1, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xb7) {\\n // Short string.\\n\\n uint256 strLen = prefix - 0x80;\\n\\n require(\\n _in.length > strLen,\\n \\\"Invalid RLP short string.\\\"\\n );\\n\\n return (1, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xbf) {\\n // Long string.\\n uint256 lenOfStrLen = prefix - 0xb7;\\n\\n require(\\n _in.length > lenOfStrLen,\\n \\\"Invalid RLP long string length.\\\"\\n );\\n\\n uint256 strLen;\\n assembly {\\n // Pick out the string length.\\n strLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfStrLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfStrLen + strLen,\\n \\\"Invalid RLP long string.\\\"\\n );\\n\\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xf7) {\\n // Short list.\\n uint256 listLen = prefix - 0xc0;\\n\\n require(\\n _in.length > listLen,\\n \\\"Invalid RLP short list.\\\"\\n );\\n\\n return (1, listLen, RLPItemType.LIST_ITEM);\\n } else {\\n // Long list.\\n uint256 lenOfListLen = prefix - 0xf7;\\n\\n require(\\n _in.length > lenOfListLen,\\n \\\"Invalid RLP long list length.\\\"\\n );\\n\\n uint256 listLen;\\n assembly {\\n // Pick out the list length.\\n listLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfListLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfListLen + listLen,\\n \\\"Invalid RLP long list.\\\"\\n );\\n\\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\\n }\\n }\\n\\n /**\\n * Copies the bytes from a memory location.\\n * @param _src Pointer to the location to read from.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Copied bytes.\\n */\\n function _copy(\\n uint256 _src,\\n uint256 _offset,\\n uint256 _length\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out = new bytes(_length);\\n if (out.length == 0) {\\n return out;\\n }\\n\\n uint256 src = _src + _offset;\\n uint256 dest;\\n assembly {\\n dest := add(out, 32)\\n }\\n\\n // Copy over as many complete words as we can.\\n for (uint256 i = 0; i < _length / 32; i++) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n\\n src += 32;\\n dest += 32;\\n }\\n\\n // Pick out the remaining bytes.\\n uint256 mask = 256 ** (32 - (_length % 32)) - 1;\\n assembly {\\n mstore(\\n dest,\\n or(\\n and(mload(src), not(mask)),\\n and(mload(dest), mask)\\n )\\n )\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Copies an RLP item into bytes.\\n * @param _in RLP item to copy.\\n * @return Copied bytes.\\n */\\n function _copy(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in.ptr, 0, _in.length);\\n }\\n}\\n\",\"keccak256\":\"0x829174c61216dce35fdb888383b6022e0365eb7fbdc71ad79d98b108091969fe\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPWriter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/**\\n * @title Lib_RLPWriter\\n * @author Bakaoh (with modifications)\\n */\\nlibrary Lib_RLPWriter {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * RLP encodes a byte string.\\n * @param _in The byte string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded;\\n\\n if (_in.length == 1 && uint8(_in[0]) < 128) {\\n encoded = _in;\\n } else {\\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * RLP encodes a list of RLP encoded byte byte strings.\\n * @param _in The list of RLP encoded byte strings.\\n * @return The RLP encoded list of items in bytes.\\n */\\n function writeList(\\n bytes[] memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory list = _flatten(_in);\\n return abi.encodePacked(_writeLength(list.length, 192), list);\\n }\\n\\n /**\\n * RLP encodes a string.\\n * @param _in The string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeString(\\n string memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(bytes(_in));\\n }\\n\\n /**\\n * RLP encodes an address.\\n * @param _in The address to encode.\\n * @return The RLP encoded address in bytes.\\n */\\n function writeAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a bytes32 value.\\n * @param _in The bytes32 to encode.\\n * @return _out The RLP encoded bytes32 in bytes.\\n */\\n function writeBytes32(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a uint.\\n * @param _in The uint256 to encode.\\n * @return The RLP encoded uint256 in bytes.\\n */\\n function writeUint(\\n uint256 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(_toBinary(_in));\\n }\\n\\n /**\\n * RLP encodes a bool.\\n * @param _in The bool to encode.\\n * @return The RLP encoded bool in bytes.\\n */\\n function writeBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded = new bytes(1);\\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\\n return encoded;\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\\n * @param _len The length of the string or the payload.\\n * @param _offset 128 if item is string, 192 if item is list.\\n * @return RLP encoded bytes.\\n */\\n function _writeLength(\\n uint256 _len,\\n uint256 _offset\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded;\\n\\n if (_len < 56) {\\n encoded = new bytes(1);\\n encoded[0] = byte(uint8(_len) + uint8(_offset));\\n } else {\\n uint256 lenLen;\\n uint256 i = 1;\\n while (_len / i != 0) {\\n lenLen++;\\n i *= 256;\\n }\\n\\n encoded = new bytes(lenLen + 1);\\n encoded[0] = byte(uint8(lenLen) + uint8(_offset) + 55);\\n for(i = 1; i <= lenLen; i++) {\\n encoded[i] = byte(uint8((_len / (256**(lenLen-i))) % 256));\\n }\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * Encode integer in big endian binary form with no leading zeroes.\\n * @notice TODO: This should be optimized with assembly to save gas costs.\\n * @param _x The integer to encode.\\n * @return RLP encoded bytes.\\n */\\n function _toBinary(\\n uint256 _x\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory b = abi.encodePacked(_x);\\n\\n uint256 i = 0;\\n for (; i < 32; i++) {\\n if (b[i] != 0) {\\n break;\\n }\\n }\\n\\n bytes memory res = new bytes(32 - i);\\n for (uint256 j = 0; j < res.length; j++) {\\n res[j] = b[i++];\\n }\\n\\n return res;\\n }\\n\\n /**\\n * Copies a piece of memory to another location.\\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\\n * @param _dest Destination location.\\n * @param _src Source location.\\n * @param _len Length of memory to copy.\\n */\\n function _memcpy(\\n uint256 _dest,\\n uint256 _src,\\n uint256 _len\\n )\\n private\\n pure\\n {\\n uint256 dest = _dest;\\n uint256 src = _src;\\n uint256 len = _len;\\n\\n for(; len >= 32; len -= 32) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n dest += 32;\\n src += 32;\\n }\\n\\n uint256 mask = 256 ** (32 - len) - 1;\\n assembly {\\n let srcpart := and(mload(src), not(mask))\\n let destpart := and(mload(dest), mask)\\n mstore(dest, or(destpart, srcpart))\\n }\\n }\\n\\n /**\\n * Flattens a list of byte strings into one byte string.\\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\\n * @param _list List of byte strings to flatten.\\n * @return The flattened byte string.\\n */\\n function _flatten(\\n bytes[] memory _list\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n if (_list.length == 0) {\\n return new bytes(0);\\n }\\n\\n uint256 len;\\n uint256 i = 0;\\n for (; i < _list.length; i++) {\\n len += _list[i].length;\\n }\\n\\n bytes memory flattened = new bytes(len);\\n uint256 flattenedPtr;\\n assembly { flattenedPtr := add(flattened, 0x20) }\\n\\n for(i = 0; i < _list.length; i++) {\\n bytes memory item = _list[i];\\n\\n uint256 listPtr;\\n assembly { listPtr := add(item, 0x20)}\\n\\n _memcpy(flattenedPtr, listPtr, item.length);\\n flattenedPtr += _list[i].length;\\n }\\n\\n return flattened;\\n }\\n}\\n\",\"keccak256\":\"0xb60ee4b03ad372c3deff21d454ab714dd0c18ee3e6f9d45532e209fc59d5a54d\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/trie/Lib_MerkleTrie.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\n\\n/**\\n * @title Lib_MerkleTrie\\n */\\nlibrary Lib_MerkleTrie {\\n\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n enum NodeType {\\n BranchNode,\\n ExtensionNode,\\n LeafNode\\n }\\n\\n struct TrieNode {\\n bytes encoded;\\n Lib_RLPReader.RLPItem[] decoded;\\n }\\n\\n\\n /**********************\\n * Contract Constants *\\n **********************/\\n\\n // TREE_RADIX determines the number of elements per branch node.\\n uint256 constant TREE_RADIX = 16;\\n // Branch nodes have TREE_RADIX elements plus an additional `value` slot.\\n uint256 constant BRANCH_NODE_LENGTH = TREE_RADIX + 1;\\n // Leaf nodes and extension nodes always have two elements, a `path` and a `value`.\\n uint256 constant LEAF_OR_EXTENSION_NODE_LENGTH = 2;\\n\\n // Prefixes are prepended to the `path` within a leaf or extension node and\\n // allow us to differentiate between the two node types. `ODD` or `EVEN` is\\n // determined by the number of nibbles within the unprefixed `path`. If the\\n // number of nibbles if even, we need to insert an extra padding nibble so\\n // the resulting prefixed `path` has an even number of nibbles.\\n uint8 constant PREFIX_EXTENSION_EVEN = 0;\\n uint8 constant PREFIX_EXTENSION_ODD = 1;\\n uint8 constant PREFIX_LEAF_EVEN = 2;\\n uint8 constant PREFIX_LEAF_ODD = 3;\\n\\n // Just a utility constant. RLP represents `NULL` as 0x80.\\n bytes1 constant RLP_NULL = bytes1(0x80);\\n bytes constant RLP_NULL_BYTES = hex'80';\\n bytes32 constant internal KECCAK256_RLP_NULL_BYTES = keccak256(RLP_NULL_BYTES);\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * @notice Verifies a proof that a given key/value pair is present in the\\n * Merkle trie.\\n * @param _key Key of the node to search for, as a hex string.\\n * @param _value Value of the node to search for, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the desired node. Unlike\\n * traditional Merkle trees, this proof is executed top-down and consists\\n * of a list of RLP-encoded nodes that make a path down to the target node.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _verified `true` if the k/v pair exists in the trie, `false` otherwise.\\n */\\n function verifyInclusionProof(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bool _verified\\n )\\n {\\n (\\n bool exists,\\n bytes memory value\\n ) = get(_key, _proof, _root);\\n\\n return (\\n exists && Lib_BytesUtils.equal(_value, value)\\n );\\n }\\n\\n /**\\n * @notice Updates a Merkle trie and returns a new root hash.\\n * @param _key Key of the node to update, as a hex string.\\n * @param _value Value of the node to update, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\\n * target node. If the key exists, we can simply update the value.\\n * Otherwise, we need to modify the trie to handle the new k/v pair.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _updatedRoot Root hash of the newly constructed trie.\\n */\\n function update(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bytes32 _updatedRoot\\n )\\n {\\n // Special case when inserting the very first node.\\n if (_root == KECCAK256_RLP_NULL_BYTES) {\\n return getSingleNodeRootHash(_key, _value);\\n }\\n\\n TrieNode[] memory proof = _parseProof(_proof);\\n (uint256 pathLength, bytes memory keyRemainder, ) = _walkNodePath(proof, _key, _root);\\n TrieNode[] memory newPath = _getNewPath(proof, pathLength, _key, keyRemainder, _value);\\n\\n return _getUpdatedTrieRoot(newPath, _key);\\n }\\n\\n /**\\n * @notice Retrieves the value associated with a given key.\\n * @param _key Key to search for, as hex bytes.\\n * @param _proof Merkle trie inclusion proof for the key.\\n * @param _root Known root of the Merkle trie.\\n * @return _exists Whether or not the key exists.\\n * @return _value Value of the key if it exists.\\n */\\n function get(\\n bytes memory _key,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bool _exists,\\n bytes memory _value\\n )\\n {\\n TrieNode[] memory proof = _parseProof(_proof);\\n (uint256 pathLength, bytes memory keyRemainder, bool isFinalNode) = _walkNodePath(proof, _key, _root);\\n\\n bool exists = keyRemainder.length == 0;\\n\\n require(\\n exists || isFinalNode,\\n \\\"Provided proof is invalid.\\\"\\n );\\n\\n bytes memory value = exists ? _getNodeValue(proof[pathLength - 1]) : bytes('');\\n\\n return (\\n exists,\\n value\\n );\\n }\\n\\n /**\\n * Computes the root hash for a trie with a single node.\\n * @param _key Key for the single node.\\n * @param _value Value for the single node.\\n * @return _updatedRoot Hash of the trie.\\n */\\n function getSingleNodeRootHash(\\n bytes memory _key,\\n bytes memory _value\\n )\\n internal\\n pure\\n returns (\\n bytes32 _updatedRoot\\n )\\n {\\n return keccak256(_makeLeafNode(\\n Lib_BytesUtils.toNibbles(_key),\\n _value\\n ).encoded);\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * @notice Walks through a proof using a provided key.\\n * @param _proof Inclusion proof to walk through.\\n * @param _key Key to use for the walk.\\n * @param _root Known root of the trie.\\n * @return _pathLength Length of the final path\\n * @return _keyRemainder Portion of the key remaining after the walk.\\n * @return _isFinalNode Whether or not we've hit a dead end.\\n */\\n function _walkNodePath(\\n TrieNode[] memory _proof,\\n bytes memory _key,\\n bytes32 _root\\n )\\n private\\n pure\\n returns (\\n uint256 _pathLength,\\n bytes memory _keyRemainder,\\n bool _isFinalNode\\n )\\n {\\n uint256 pathLength = 0;\\n bytes memory key = Lib_BytesUtils.toNibbles(_key);\\n\\n bytes32 currentNodeID = _root;\\n uint256 currentKeyIndex = 0;\\n uint256 currentKeyIncrement = 0;\\n TrieNode memory currentNode;\\n\\n // Proof is top-down, so we start at the first element (root).\\n for (uint256 i = 0; i < _proof.length; i++) {\\n currentNode = _proof[i];\\n currentKeyIndex += currentKeyIncrement;\\n\\n // Keep track of the proof elements we actually need.\\n // It's expensive to resize arrays, so this simply reduces gas costs.\\n pathLength += 1;\\n\\n if (currentKeyIndex == 0) {\\n // First proof element is always the root node.\\n require(\\n keccak256(currentNode.encoded) == currentNodeID,\\n \\\"Invalid root hash\\\"\\n );\\n } else if (currentNode.encoded.length >= 32) {\\n // Nodes 32 bytes or larger are hashed inside branch nodes.\\n require(\\n keccak256(currentNode.encoded) == currentNodeID,\\n \\\"Invalid large internal hash\\\"\\n );\\n } else {\\n // Nodes smaller than 31 bytes aren't hashed.\\n require(\\n Lib_BytesUtils.toBytes32(currentNode.encoded) == currentNodeID,\\n \\\"Invalid internal node hash\\\"\\n );\\n }\\n\\n if (currentNode.decoded.length == BRANCH_NODE_LENGTH) {\\n if (currentKeyIndex == key.length) {\\n // We've hit the end of the key, meaning the value should be within this branch node.\\n break;\\n } else {\\n // We're not at the end of the key yet.\\n // Figure out what the next node ID should be and continue.\\n uint8 branchKey = uint8(key[currentKeyIndex]);\\n Lib_RLPReader.RLPItem memory nextNode = currentNode.decoded[branchKey];\\n currentNodeID = _getNodeID(nextNode);\\n currentKeyIncrement = 1;\\n continue;\\n }\\n } else if (currentNode.decoded.length == LEAF_OR_EXTENSION_NODE_LENGTH) {\\n bytes memory path = _getNodePath(currentNode);\\n uint8 prefix = uint8(path[0]);\\n uint8 offset = 2 - prefix % 2;\\n bytes memory pathRemainder = Lib_BytesUtils.slice(path, offset);\\n bytes memory keyRemainder = Lib_BytesUtils.slice(key, currentKeyIndex);\\n uint256 sharedNibbleLength = _getSharedNibbleLength(pathRemainder, keyRemainder);\\n\\n if (prefix == PREFIX_LEAF_EVEN || prefix == PREFIX_LEAF_ODD) {\\n if (\\n pathRemainder.length == sharedNibbleLength &&\\n keyRemainder.length == sharedNibbleLength\\n ) {\\n // The key within this leaf matches our key exactly.\\n // Increment the key index to reflect that we have no remainder.\\n currentKeyIndex += sharedNibbleLength;\\n }\\n\\n // We've hit a leaf node, so our next node should be NULL.\\n currentNodeID = bytes32(RLP_NULL);\\n break;\\n } else if (prefix == PREFIX_EXTENSION_EVEN || prefix == PREFIX_EXTENSION_ODD) {\\n if (sharedNibbleLength != pathRemainder.length) {\\n // Our extension node is not identical to the remainder.\\n // We've hit the end of this path, updates will need to modify this extension.\\n currentNodeID = bytes32(RLP_NULL);\\n break;\\n } else {\\n // Our extension shares some nibbles.\\n // Carry on to the next node.\\n currentNodeID = _getNodeID(currentNode.decoded[1]);\\n currentKeyIncrement = sharedNibbleLength;\\n continue;\\n }\\n } else {\\n revert(\\\"Received a node with an unknown prefix\\\");\\n }\\n } else {\\n revert(\\\"Received an unparseable node.\\\");\\n }\\n }\\n\\n // If our node ID is NULL, then we're at a dead end.\\n bool isFinalNode = currentNodeID == bytes32(RLP_NULL);\\n return (pathLength, Lib_BytesUtils.slice(key, currentKeyIndex), isFinalNode);\\n }\\n\\n /**\\n * @notice Creates new nodes to support a k/v pair insertion into a given Merkle trie path.\\n * @param _path Path to the node nearest the k/v pair.\\n * @param _pathLength Length of the path. Necessary because the provided path may include\\n * additional nodes (e.g., it comes directly from a proof) and we can't resize in-memory\\n * arrays without costly duplication.\\n * @param _key Full original key.\\n * @param _keyRemainder Portion of the initial key that must be inserted into the trie.\\n * @param _value Value to insert at the given key.\\n * @return _newPath A new path with the inserted k/v pair and extra supporting nodes.\\n */\\n function _getNewPath(\\n TrieNode[] memory _path,\\n uint256 _pathLength,\\n bytes memory _key,\\n bytes memory _keyRemainder,\\n bytes memory _value\\n )\\n private\\n pure\\n returns (\\n TrieNode[] memory _newPath\\n )\\n {\\n bytes memory keyRemainder = _keyRemainder;\\n\\n // Most of our logic depends on the status of the last node in the path.\\n TrieNode memory lastNode = _path[_pathLength - 1];\\n NodeType lastNodeType = _getNodeType(lastNode);\\n\\n // Create an array for newly created nodes.\\n // We need up to three new nodes, depending on the contents of the last node.\\n // Since array resizing is expensive, we'll keep track of the size manually.\\n // We're using an explicit `totalNewNodes += 1` after insertions for clarity.\\n TrieNode[] memory newNodes = new TrieNode[](3);\\n uint256 totalNewNodes = 0;\\n\\n // Reference: https://github.com/ethereumjs/merkle-patricia-tree/blob/c0a10395aab37d42c175a47114ebfcbd7efcf059/src/baseTrie.ts#L294-L313\\n bool matchLeaf = false;\\n if (lastNodeType == NodeType.LeafNode) {\\n uint256 l = 0;\\n if (_path.length > 0) {\\n for (uint256 i = 0; i < _path.length - 1; i++) {\\n if (_getNodeType(_path[i]) == NodeType.BranchNode) {\\n l++;\\n } else {\\n l += _getNodeKey(_path[i]).length;\\n }\\n }\\n }\\n\\n if (\\n _getSharedNibbleLength(\\n _getNodeKey(lastNode),\\n Lib_BytesUtils.slice(Lib_BytesUtils.toNibbles(_key), l)\\n ) == _getNodeKey(lastNode).length\\n && keyRemainder.length == 0\\n ) {\\n matchLeaf = true;\\n }\\n }\\n\\n if (matchLeaf) {\\n // We've found a leaf node with the given key.\\n // Simply need to update the value of the node to match.\\n newNodes[totalNewNodes] = _makeLeafNode(_getNodeKey(lastNode), _value);\\n totalNewNodes += 1;\\n } else if (lastNodeType == NodeType.BranchNode) {\\n if (keyRemainder.length == 0) {\\n // We've found a branch node with the given key.\\n // Simply need to update the value of the node to match.\\n newNodes[totalNewNodes] = _editBranchValue(lastNode, _value);\\n totalNewNodes += 1;\\n } else {\\n // We've found a branch node, but it doesn't contain our key.\\n // Reinsert the old branch for now.\\n newNodes[totalNewNodes] = lastNode;\\n totalNewNodes += 1;\\n // Create a new leaf node, slicing our remainder since the first byte points\\n // to our branch node.\\n newNodes[totalNewNodes] = _makeLeafNode(Lib_BytesUtils.slice(keyRemainder, 1), _value);\\n totalNewNodes += 1;\\n }\\n } else {\\n // Our last node is either an extension node or a leaf node with a different key.\\n bytes memory lastNodeKey = _getNodeKey(lastNode);\\n uint256 sharedNibbleLength = _getSharedNibbleLength(lastNodeKey, keyRemainder);\\n\\n if (sharedNibbleLength != 0) {\\n // We've got some shared nibbles between the last node and our key remainder.\\n // We'll need to insert an extension node that covers these shared nibbles.\\n bytes memory nextNodeKey = Lib_BytesUtils.slice(lastNodeKey, 0, sharedNibbleLength);\\n newNodes[totalNewNodes] = _makeExtensionNode(nextNodeKey, _getNodeHash(_value));\\n totalNewNodes += 1;\\n\\n // Cut down the keys since we've just covered these shared nibbles.\\n lastNodeKey = Lib_BytesUtils.slice(lastNodeKey, sharedNibbleLength);\\n keyRemainder = Lib_BytesUtils.slice(keyRemainder, sharedNibbleLength);\\n }\\n\\n // Create an empty branch to fill in.\\n TrieNode memory newBranch = _makeEmptyBranchNode();\\n\\n if (lastNodeKey.length == 0) {\\n // Key remainder was larger than the key for our last node.\\n // The value within our last node is therefore going to be shifted into\\n // a branch value slot.\\n newBranch = _editBranchValue(newBranch, _getNodeValue(lastNode));\\n } else {\\n // Last node key was larger than the key remainder.\\n // We're going to modify some index of our branch.\\n uint8 branchKey = uint8(lastNodeKey[0]);\\n // Move on to the next nibble.\\n lastNodeKey = Lib_BytesUtils.slice(lastNodeKey, 1);\\n\\n if (lastNodeType == NodeType.LeafNode) {\\n // We're dealing with a leaf node.\\n // We'll modify the key and insert the old leaf node into the branch index.\\n TrieNode memory modifiedLastNode = _makeLeafNode(lastNodeKey, _getNodeValue(lastNode));\\n newBranch = _editBranchIndex(newBranch, branchKey, _getNodeHash(modifiedLastNode.encoded));\\n } else if (lastNodeKey.length != 0) {\\n // We're dealing with a shrinking extension node.\\n // We need to modify the node to decrease the size of the key.\\n TrieNode memory modifiedLastNode = _makeExtensionNode(lastNodeKey, _getNodeValue(lastNode));\\n newBranch = _editBranchIndex(newBranch, branchKey, _getNodeHash(modifiedLastNode.encoded));\\n } else {\\n // We're dealing with an unnecessary extension node.\\n // We're going to delete the node entirely.\\n // Simply insert its current value into the branch index.\\n newBranch = _editBranchIndex(newBranch, branchKey, _getNodeValue(lastNode));\\n }\\n }\\n\\n if (keyRemainder.length == 0) {\\n // We've got nothing left in the key remainder.\\n // Simply insert the value into the branch value slot.\\n newBranch = _editBranchValue(newBranch, _value);\\n // Push the branch into the list of new nodes.\\n newNodes[totalNewNodes] = newBranch;\\n totalNewNodes += 1;\\n } else {\\n // We've got some key remainder to work with.\\n // We'll be inserting a leaf node into the trie.\\n // First, move on to the next nibble.\\n keyRemainder = Lib_BytesUtils.slice(keyRemainder, 1);\\n // Push the branch into the list of new nodes.\\n newNodes[totalNewNodes] = newBranch;\\n totalNewNodes += 1;\\n // Push a new leaf node for our k/v pair.\\n newNodes[totalNewNodes] = _makeLeafNode(keyRemainder, _value);\\n totalNewNodes += 1;\\n }\\n }\\n\\n // Finally, join the old path with our newly created nodes.\\n // Since we're overwriting the last node in the path, we use `_pathLength - 1`.\\n return _joinNodeArrays(_path, _pathLength - 1, newNodes, totalNewNodes);\\n }\\n\\n /**\\n * @notice Computes the trie root from a given path.\\n * @param _nodes Path to some k/v pair.\\n * @param _key Key for the k/v pair.\\n * @return _updatedRoot Root hash for the updated trie.\\n */\\n function _getUpdatedTrieRoot(\\n TrieNode[] memory _nodes,\\n bytes memory _key\\n )\\n private\\n pure\\n returns (\\n bytes32 _updatedRoot\\n )\\n {\\n bytes memory key = Lib_BytesUtils.toNibbles(_key);\\n\\n // Some variables to keep track of during iteration.\\n TrieNode memory currentNode;\\n NodeType currentNodeType;\\n bytes memory previousNodeHash;\\n\\n // Run through the path backwards to rebuild our root hash.\\n for (uint256 i = _nodes.length; i > 0; i--) {\\n // Pick out the current node.\\n currentNode = _nodes[i - 1];\\n currentNodeType = _getNodeType(currentNode);\\n\\n if (currentNodeType == NodeType.LeafNode) {\\n // Leaf nodes are already correctly encoded.\\n // Shift the key over to account for the nodes key.\\n bytes memory nodeKey = _getNodeKey(currentNode);\\n key = Lib_BytesUtils.slice(key, 0, key.length - nodeKey.length);\\n } else if (currentNodeType == NodeType.ExtensionNode) {\\n // Shift the key over to account for the nodes key.\\n bytes memory nodeKey = _getNodeKey(currentNode);\\n key = Lib_BytesUtils.slice(key, 0, key.length - nodeKey.length);\\n\\n // If this node is the last element in the path, it'll be correctly encoded\\n // and we can skip this part.\\n if (previousNodeHash.length > 0) {\\n // Re-encode the node based on the previous node.\\n currentNode = _editExtensionNodeValue(currentNode, previousNodeHash);\\n }\\n } else if (currentNodeType == NodeType.BranchNode) {\\n // If this node is the last element in the path, it'll be correctly encoded\\n // and we can skip this part.\\n if (previousNodeHash.length > 0) {\\n // Re-encode the node based on the previous node.\\n uint8 branchKey = uint8(key[key.length - 1]);\\n key = Lib_BytesUtils.slice(key, 0, key.length - 1);\\n currentNode = _editBranchIndex(currentNode, branchKey, previousNodeHash);\\n }\\n }\\n\\n // Compute the node hash for the next iteration.\\n previousNodeHash = _getNodeHash(currentNode.encoded);\\n }\\n\\n // Current node should be the root at this point.\\n // Simply return the hash of its encoding.\\n return keccak256(currentNode.encoded);\\n }\\n\\n /**\\n * @notice Parses an RLP-encoded proof into something more useful.\\n * @param _proof RLP-encoded proof to parse.\\n * @return _parsed Proof parsed into easily accessible structs.\\n */\\n function _parseProof(\\n bytes memory _proof\\n )\\n private\\n pure\\n returns (\\n TrieNode[] memory _parsed\\n )\\n {\\n Lib_RLPReader.RLPItem[] memory nodes = Lib_RLPReader.readList(_proof);\\n TrieNode[] memory proof = new TrieNode[](nodes.length);\\n\\n for (uint256 i = 0; i < nodes.length; i++) {\\n bytes memory encoded = Lib_RLPReader.readBytes(nodes[i]);\\n proof[i] = TrieNode({\\n encoded: encoded,\\n decoded: Lib_RLPReader.readList(encoded)\\n });\\n }\\n\\n return proof;\\n }\\n\\n /**\\n * @notice Picks out the ID for a node. Node ID is referred to as the\\n * \\\"hash\\\" within the specification, but nodes < 32 bytes are not actually\\n * hashed.\\n * @param _node Node to pull an ID for.\\n * @return _nodeID ID for the node, depending on the size of its contents.\\n */\\n function _getNodeID(\\n Lib_RLPReader.RLPItem memory _node\\n )\\n private\\n pure\\n returns (\\n bytes32 _nodeID\\n )\\n {\\n bytes memory nodeID;\\n\\n if (_node.length < 32) {\\n // Nodes smaller than 32 bytes are RLP encoded.\\n nodeID = Lib_RLPReader.readRawBytes(_node);\\n } else {\\n // Nodes 32 bytes or larger are hashed.\\n nodeID = Lib_RLPReader.readBytes(_node);\\n }\\n\\n return Lib_BytesUtils.toBytes32(nodeID);\\n }\\n\\n /**\\n * @notice Gets the path for a leaf or extension node.\\n * @param _node Node to get a path for.\\n * @return _path Node path, converted to an array of nibbles.\\n */\\n function _getNodePath(\\n TrieNode memory _node\\n )\\n private\\n pure\\n returns (\\n bytes memory _path\\n )\\n {\\n return Lib_BytesUtils.toNibbles(Lib_RLPReader.readBytes(_node.decoded[0]));\\n }\\n\\n /**\\n * @notice Gets the key for a leaf or extension node. Keys are essentially\\n * just paths without any prefix.\\n * @param _node Node to get a key for.\\n * @return _key Node key, converted to an array of nibbles.\\n */\\n function _getNodeKey(\\n TrieNode memory _node\\n )\\n private\\n pure\\n returns (\\n bytes memory _key\\n )\\n {\\n return _removeHexPrefix(_getNodePath(_node));\\n }\\n\\n /**\\n * @notice Gets the path for a node.\\n * @param _node Node to get a value for.\\n * @return _value Node value, as hex bytes.\\n */\\n function _getNodeValue(\\n TrieNode memory _node\\n )\\n private\\n pure\\n returns (\\n bytes memory _value\\n )\\n {\\n return Lib_RLPReader.readBytes(_node.decoded[_node.decoded.length - 1]);\\n }\\n\\n /**\\n * @notice Computes the node hash for an encoded node. Nodes < 32 bytes\\n * are not hashed, all others are keccak256 hashed.\\n * @param _encoded Encoded node to hash.\\n * @return _hash Hash of the encoded node. Simply the input if < 32 bytes.\\n */\\n function _getNodeHash(\\n bytes memory _encoded\\n )\\n private\\n pure\\n returns (\\n bytes memory _hash\\n )\\n {\\n if (_encoded.length < 32) {\\n return _encoded;\\n } else {\\n return abi.encodePacked(keccak256(_encoded));\\n }\\n }\\n\\n /**\\n * @notice Determines the type for a given node.\\n * @param _node Node to determine a type for.\\n * @return _type Type of the node; BranchNode/ExtensionNode/LeafNode.\\n */\\n function _getNodeType(\\n TrieNode memory _node\\n )\\n private\\n pure\\n returns (\\n NodeType _type\\n )\\n {\\n if (_node.decoded.length == BRANCH_NODE_LENGTH) {\\n return NodeType.BranchNode;\\n } else if (_node.decoded.length == LEAF_OR_EXTENSION_NODE_LENGTH) {\\n bytes memory path = _getNodePath(_node);\\n uint8 prefix = uint8(path[0]);\\n\\n if (prefix == PREFIX_LEAF_EVEN || prefix == PREFIX_LEAF_ODD) {\\n return NodeType.LeafNode;\\n } else if (prefix == PREFIX_EXTENSION_EVEN || prefix == PREFIX_EXTENSION_ODD) {\\n return NodeType.ExtensionNode;\\n }\\n }\\n\\n revert(\\\"Invalid node type\\\");\\n }\\n\\n /**\\n * @notice Utility; determines the number of nibbles shared between two\\n * nibble arrays.\\n * @param _a First nibble array.\\n * @param _b Second nibble array.\\n * @return _shared Number of shared nibbles.\\n */\\n function _getSharedNibbleLength(\\n bytes memory _a,\\n bytes memory _b\\n )\\n private\\n pure\\n returns (\\n uint256 _shared\\n )\\n {\\n uint256 i = 0;\\n while (_a.length > i && _b.length > i && _a[i] == _b[i]) {\\n i++;\\n }\\n return i;\\n }\\n\\n /**\\n * @notice Utility; converts an RLP-encoded node into our nice struct.\\n * @param _raw RLP-encoded node to convert.\\n * @return _node Node as a TrieNode struct.\\n */\\n function _makeNode(\\n bytes[] memory _raw\\n )\\n private\\n pure\\n returns (\\n TrieNode memory _node\\n )\\n {\\n bytes memory encoded = Lib_RLPWriter.writeList(_raw);\\n\\n return TrieNode({\\n encoded: encoded,\\n decoded: Lib_RLPReader.readList(encoded)\\n });\\n }\\n\\n /**\\n * @notice Utility; converts an RLP-decoded node into our nice struct.\\n * @param _items RLP-decoded node to convert.\\n * @return _node Node as a TrieNode struct.\\n */\\n function _makeNode(\\n Lib_RLPReader.RLPItem[] memory _items\\n )\\n private\\n pure\\n returns (\\n TrieNode memory _node\\n )\\n {\\n bytes[] memory raw = new bytes[](_items.length);\\n for (uint256 i = 0; i < _items.length; i++) {\\n raw[i] = Lib_RLPReader.readRawBytes(_items[i]);\\n }\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Creates a new extension node.\\n * @param _key Key for the extension node, unprefixed.\\n * @param _value Value for the extension node.\\n * @return _node New extension node with the given k/v pair.\\n */\\n function _makeExtensionNode(\\n bytes memory _key,\\n bytes memory _value\\n )\\n private\\n pure\\n returns (\\n TrieNode memory _node\\n )\\n {\\n bytes[] memory raw = new bytes[](2);\\n bytes memory key = _addHexPrefix(_key, false);\\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\\n raw[1] = Lib_RLPWriter.writeBytes(_value);\\n return _makeNode(raw);\\n }\\n\\n /**\\n * Creates a new extension node with the same key but a different value.\\n * @param _node Extension node to copy and modify.\\n * @param _value New value for the extension node.\\n * @return New node with the same key and different value.\\n */\\n function _editExtensionNodeValue(\\n TrieNode memory _node,\\n bytes memory _value\\n )\\n private\\n pure\\n returns (\\n TrieNode memory\\n )\\n {\\n bytes[] memory raw = new bytes[](2);\\n bytes memory key = _addHexPrefix(_getNodeKey(_node), false);\\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\\n if (_value.length < 32) {\\n raw[1] = _value;\\n } else {\\n raw[1] = Lib_RLPWriter.writeBytes(_value);\\n }\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Creates a new leaf node.\\n * @dev This function is essentially identical to `_makeExtensionNode`.\\n * Although we could route both to a single method with a flag, it's\\n * more gas efficient to keep them separate and duplicate the logic.\\n * @param _key Key for the leaf node, unprefixed.\\n * @param _value Value for the leaf node.\\n * @return _node New leaf node with the given k/v pair.\\n */\\n function _makeLeafNode(\\n bytes memory _key,\\n bytes memory _value\\n )\\n private\\n pure\\n returns (\\n TrieNode memory _node\\n )\\n {\\n bytes[] memory raw = new bytes[](2);\\n bytes memory key = _addHexPrefix(_key, true);\\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\\n raw[1] = Lib_RLPWriter.writeBytes(_value);\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Creates an empty branch node.\\n * @return _node Empty branch node as a TrieNode struct.\\n */\\n function _makeEmptyBranchNode()\\n private\\n pure\\n returns (\\n TrieNode memory _node\\n )\\n {\\n bytes[] memory raw = new bytes[](BRANCH_NODE_LENGTH);\\n for (uint256 i = 0; i < raw.length; i++) {\\n raw[i] = RLP_NULL_BYTES;\\n }\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Modifies the value slot for a given branch.\\n * @param _branch Branch node to modify.\\n * @param _value Value to insert into the branch.\\n * @return _updatedNode Modified branch node.\\n */\\n function _editBranchValue(\\n TrieNode memory _branch,\\n bytes memory _value\\n )\\n private\\n pure\\n returns (\\n TrieNode memory _updatedNode\\n )\\n {\\n bytes memory encoded = Lib_RLPWriter.writeBytes(_value);\\n _branch.decoded[_branch.decoded.length - 1] = Lib_RLPReader.toRLPItem(encoded);\\n return _makeNode(_branch.decoded);\\n }\\n\\n /**\\n * @notice Modifies a slot at an index for a given branch.\\n * @param _branch Branch node to modify.\\n * @param _index Slot index to modify.\\n * @param _value Value to insert into the slot.\\n * @return _updatedNode Modified branch node.\\n */\\n function _editBranchIndex(\\n TrieNode memory _branch,\\n uint8 _index,\\n bytes memory _value\\n )\\n private\\n pure\\n returns (\\n TrieNode memory _updatedNode\\n )\\n {\\n bytes memory encoded = _value.length < 32 ? _value : Lib_RLPWriter.writeBytes(_value);\\n _branch.decoded[_index] = Lib_RLPReader.toRLPItem(encoded);\\n return _makeNode(_branch.decoded);\\n }\\n\\n /**\\n * @notice Utility; adds a prefix to a key.\\n * @param _key Key to prefix.\\n * @param _isLeaf Whether or not the key belongs to a leaf.\\n * @return _prefixedKey Prefixed key.\\n */\\n function _addHexPrefix(\\n bytes memory _key,\\n bool _isLeaf\\n )\\n private\\n pure\\n returns (\\n bytes memory _prefixedKey\\n )\\n {\\n uint8 prefix = _isLeaf ? uint8(0x02) : uint8(0x00);\\n uint8 offset = uint8(_key.length % 2);\\n bytes memory prefixed = new bytes(2 - offset);\\n prefixed[0] = bytes1(prefix + offset);\\n return abi.encodePacked(prefixed, _key);\\n }\\n\\n /**\\n * @notice Utility; removes a prefix from a path.\\n * @param _path Path to remove the prefix from.\\n * @return _unprefixedKey Unprefixed key.\\n */\\n function _removeHexPrefix(\\n bytes memory _path\\n )\\n private\\n pure\\n returns (\\n bytes memory _unprefixedKey\\n )\\n {\\n if (uint8(_path[0]) % 2 == 0) {\\n return Lib_BytesUtils.slice(_path, 2);\\n } else {\\n return Lib_BytesUtils.slice(_path, 1);\\n }\\n }\\n\\n /**\\n * @notice Utility; combines two node arrays. Array lengths are required\\n * because the actual lengths may be longer than the filled lengths.\\n * Array resizing is extremely costly and should be avoided.\\n * @param _a First array to join.\\n * @param _aLength Length of the first array.\\n * @param _b Second array to join.\\n * @param _bLength Length of the second array.\\n * @return _joined Combined node array.\\n */\\n function _joinNodeArrays(\\n TrieNode[] memory _a,\\n uint256 _aLength,\\n TrieNode[] memory _b,\\n uint256 _bLength\\n )\\n private\\n pure\\n returns (\\n TrieNode[] memory _joined\\n )\\n {\\n TrieNode[] memory ret = new TrieNode[](_aLength + _bLength);\\n\\n // Copy elements from the first array.\\n for (uint256 i = 0; i < _aLength; i++) {\\n ret[i] = _a[i];\\n }\\n\\n // Copy elements from the second array.\\n for (uint256 i = 0; i < _bLength; i++) {\\n ret[i + _aLength] = _b[i];\\n }\\n\\n return ret;\\n }\\n}\\n\",\"keccak256\":\"0x4bb09d0b4f965b57cdc6b3ace49967bcfe7f2580fa0b7863dfe288081247d876\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/trie/Lib_SecureMerkleTrie.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_MerkleTrie } from \\\"./Lib_MerkleTrie.sol\\\";\\n\\n/**\\n * @title Lib_SecureMerkleTrie\\n */\\nlibrary Lib_SecureMerkleTrie {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * @notice Verifies a proof that a given key/value pair is present in the\\n * Merkle trie.\\n * @param _key Key of the node to search for, as a hex string.\\n * @param _value Value of the node to search for, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the desired node. Unlike\\n * traditional Merkle trees, this proof is executed top-down and consists\\n * of a list of RLP-encoded nodes that make a path down to the target node.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _verified `true` if the k/v pair exists in the trie, `false` otherwise.\\n */\\n function verifyInclusionProof(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bool _verified\\n )\\n {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.verifyInclusionProof(key, _value, _proof, _root);\\n }\\n\\n /**\\n * @notice Updates a Merkle trie and returns a new root hash.\\n * @param _key Key of the node to update, as a hex string.\\n * @param _value Value of the node to update, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\\n * target node. If the key exists, we can simply update the value.\\n * Otherwise, we need to modify the trie to handle the new k/v pair.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _updatedRoot Root hash of the newly constructed trie.\\n */\\n function update(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bytes32 _updatedRoot\\n )\\n {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.update(key, _value, _proof, _root);\\n }\\n\\n /**\\n * @notice Retrieves the value associated with a given key.\\n * @param _key Key to search for, as hex bytes.\\n * @param _proof Merkle trie inclusion proof for the key.\\n * @param _root Known root of the Merkle trie.\\n * @return _exists Whether or not the key exists.\\n * @return _value Value of the key if it exists.\\n */\\n function get(\\n bytes memory _key,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bool _exists,\\n bytes memory _value\\n )\\n {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.get(key, _proof, _root);\\n }\\n\\n /**\\n * Computes the root hash for a trie with a single node.\\n * @param _key Key for the single node.\\n * @param _value Value for the single node.\\n * @return _updatedRoot Hash of the trie.\\n */\\n function getSingleNodeRootHash(\\n bytes memory _key,\\n bytes memory _value\\n )\\n internal\\n pure\\n returns (\\n bytes32 _updatedRoot\\n )\\n {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.getSingleNodeRootHash(key, _value);\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Computes the secure counterpart to a key.\\n * @param _key Key to get a secure key from.\\n * @return _secureKey Secure version of the key.\\n */\\n function _getSecureKey(\\n bytes memory _key\\n )\\n private\\n pure\\n returns (\\n bytes memory _secureKey\\n )\\n {\\n return abi.encodePacked(keccak256(_key));\\n }\\n}\",\"keccak256\":\"0xbbdd600165307d2131340599afa9dc0991f8f63727ba3a834bca5a3d7f501da8\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_Bytes32Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_Byte32Utils\\n */\\nlibrary Lib_Bytes32Utils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \\\"true.\\\"\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as a boolean.\\n */\\n function toBool(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return _in != 0;\\n }\\n\\n /**\\n * Converts a boolean to a bytes32 value.\\n * @param _in Input boolean value.\\n * @return Boolean as a bytes32.\\n */\\n function fromBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in ? 1 : 0));\\n }\\n\\n /**\\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as an address.\\n */\\n function toAddress(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return address(uint160(uint256(_in)));\\n }\\n\\n /**\\n * Converts an address to a bytes32.\\n * @param _in Input address value.\\n * @return Address as a bytes32.\\n */\\n function fromAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in));\\n }\\n\\n /**\\n * Removes the leading zeros from a bytes32 value and returns a new (smaller) bytes value.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 without any leading zeros.\\n */\\n function removeLeadingZeros(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out;\\n\\n assembly {\\n // Figure out how many leading zero bytes to remove.\\n let shift := 0\\n for { let i := 0 } and(lt(i, 32), eq(byte(i, _in), 0)) { i := add(i, 1) } {\\n shift := add(shift, 1)\\n }\\n\\n // Reserve some space for our output and fix the free memory pointer.\\n out := mload(0x40)\\n mstore(0x40, add(out, 0x40))\\n\\n // Shift the value and store it into the output bytes.\\n mstore(add(out, 0x20), shl(mul(shift, 8), _in))\\n\\n // Store the new size (with leading zero bytes removed) in the output byte size.\\n mstore(out, sub(32, shift))\\n }\\n\\n return out;\\n }\\n}\\n\",\"keccak256\":\"0xfa2def593e3fc56a31852c3744aefdaa93cec74e721bfcfeb1e5d166c7c60b64\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_BytesUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_BytesUtils\\n */\\nlibrary Lib_BytesUtils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_start + _length >= _start, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n if (_start >= _bytes.length) {\\n return bytes('');\\n }\\n\\n return slice(_bytes, _start, _bytes.length - _start);\\n }\\n\\n function toBytes32PadLeft(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n bytes32 ret;\\n uint256 len = _bytes.length <= 32 ? _bytes.length : 32;\\n assembly {\\n ret := shr(mul(sub(32, len), 8), mload(add(_bytes, 32)))\\n }\\n return ret;\\n }\\n\\n function toBytes32(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n if (_bytes.length < 32) {\\n bytes32 ret;\\n assembly {\\n ret := mload(add(_bytes, 32))\\n }\\n return ret;\\n }\\n\\n return abi.decode(_bytes,(bytes32)); // will truncate if input length > 32 bytes\\n }\\n\\n function toUint256(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return uint256(toBytes32(_bytes));\\n }\\n\\n function toUint24(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n uint24\\n )\\n {\\n require(_start + 3 >= _start, \\\"toUint24_overflow\\\");\\n require(_bytes.length >= _start + 3 , \\\"toUint24_outOfBounds\\\");\\n uint24 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x3), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toUint8(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n uint8\\n )\\n {\\n require(_start + 1 >= _start, \\\"toUint8_overflow\\\");\\n require(_bytes.length >= _start + 1 , \\\"toUint8_outOfBounds\\\");\\n uint8 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x1), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toAddress(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n require(_start + 20 >= _start, \\\"toAddress_overflow\\\");\\n require(_bytes.length >= _start + 20, \\\"toAddress_outOfBounds\\\");\\n address tempAddress;\\n\\n assembly {\\n tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000)\\n }\\n\\n return tempAddress;\\n }\\n\\n function toNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory nibbles = new bytes(_bytes.length * 2);\\n\\n for (uint256 i = 0; i < _bytes.length; i++) {\\n nibbles[i * 2] = _bytes[i] >> 4;\\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\\n }\\n\\n return nibbles;\\n }\\n\\n function fromNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory ret = new bytes(_bytes.length / 2);\\n\\n for (uint256 i = 0; i < ret.length; i++) {\\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\\n }\\n\\n return ret;\\n }\\n\\n function equal(\\n bytes memory _bytes,\\n bytes memory _other\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return keccak256(_bytes) == keccak256(_other);\\n }\\n}\\n\",\"keccak256\":\"0xd27e37973f1e0f64798725b7a0de12989dac992fba0d72970249d7e1f70e17c5\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x6080604052600480546001600160a01b03191661dead17905534801561002457600080fd5b50600580546001600160a01b031916905561312e806100446000396000f3fe608060405234801561001057600080fd5b50600436106101215760003560e01c806381ada46c116100ad578063c4d66de811610071578063c4d66de814610213578063c6b94ab014610226578063d7fd19dd14610239578063ecc704281461024c578063f2fde38b1461026157610121565b806381ada46c146101ca57806382e3702d146101dd5780638456cb59146101f05780638da5cb5b146101f8578063b1b1b2091461020057610121565b8063461a4478116100f4578063461a44781461018c5780635c975abb1461019f5780636e296e45146101a7578063706ceab6146101af578063715018a6146101c257610121565b80630ecf2eea1461012657806321d800ec1461013b578063299ca478146101645780633dbb202b14610179575b600080fd5b610139610134366004612ab9565b610274565b005b61014e610149366004612ab9565b610319565b60405161015b9190612ccf565b60405180910390f35b61016c61032e565b60405161015b9190612c57565b610139610187366004612a3d565b61033d565b61016c61019a366004612ad1565b6103cc565b61014e6104a8565b61016c6104b1565b6101396101bd3660046129c6565b6104fa565b610139610561565b6101396101d8366004612ab9565b61060d565b61014e6101eb366004612ab9565b6106af565b6101396106c4565b61016c610730565b61014e61020e366004612ab9565b61073f565b61013961022136600461287d565b610754565b61014e610234366004612ab9565b610882565b610139610247366004612897565b610897565b610254610bd6565b60405161015b9190612ba0565b61013961026f36600461287d565b610bdc565b61027c610cdf565b6001600160a01b031661028d610730565b6001600160a01b0316146102d6576040805162461bcd60e51b815260206004820181905260248201526000805160206130d9833981519152604482015290519081900360640190fd5b600081815260ce6020526040808220805460ff191660011790555182917ff52508d5339edf0d7e5060a416df98db067af561bdc60872d29c0439eaa13a0291a250565b60006020819052908152604090205460ff1681565b6005546001600160a01b031681565b600061034d843385600354610ce3565b60038054600190810190915581516020808401919091206000908152600290915260409020805460ff19169091179055905061038f8163ffffffff8416610d30565b7f0ee9ffdb2334d78de97ffb066b23a352a4d35180cefb36589d663fbb1eb6f326816040516103be9190612d51565b60405180910390a150505050565b60055460405163bf40fac160e01b81526020600482018181528451602484015284516000946001600160a01b03169363bf40fac1938793928392604401918501908083838b5b8381101561042a578181015183820152602001610412565b50505050905090810190601f1680156104575780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561047457600080fd5b505afa158015610488573d6000803e3d6000fd5b505050506040513d602081101561049e57600080fd5b505190505b919050565b606a5460ff1690565b6004546000906001600160a01b031661dead14156104ea5760405162461bcd60e51b81526004016104e190612d64565b60405180910390fd5b506004546001600160a01b031690565b600061050886868686610ce3565b805160208083019190912060009081526002909152604090205490915060ff1615156001146105495760405162461bcd60e51b81526004016104e190612e59565b610559818363ffffffff16610d30565b505050505050565b610569610cdf565b6001600160a01b031661057a610730565b6001600160a01b0316146105c3576040805162461bcd60e51b815260206004820181905260248201526000805160206130d9833981519152604482015290519081900360640190fd5b6038546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3603880546001600160a01b0319169055565b610615610cdf565b6001600160a01b0316610626610730565b6001600160a01b03161461066f576040805162461bcd60e51b815260206004820181905260248201526000805160206130d9833981519152604482015290519081900360640190fd5b600081815260ce6020526040808220805460ff191690555182917f52c8a2680a9f4cc0ad0bf88f32096eadbebf0646ea611d93a0ce6a29a024040591a250565b60026020526000908152604090205460ff1681565b6106cc610cdf565b6001600160a01b03166106dd610730565b6001600160a01b031614610726576040805162461bcd60e51b815260206004820181905260248201526000805160206130d9833981519152604482015290519081900360640190fd5b61072e610e08565b565b6038546001600160a01b031690565b60016020526000908152604090205460ff1681565b600554600160a81b900460ff168061076f575061076f610ea8565b806107845750600554600160a01b900460ff16155b6107bf5760405162461bcd60e51b815260040180806020018281038252602e815260200180613085602e913960400191505060405180910390fd5b600554600160a81b900460ff161580156107f6576005805460ff60a01b1960ff60a81b19909116600160a81b1716600160a01b1790555b6005546001600160a01b03161561081f5760405162461bcd60e51b81526004016104e190612f83565b600580546001600160a01b0384166001600160a01b0319918216179091556004805490911661dead179055610852610eb9565b61085a610f72565b610862611082565b61086a611144565b801561087e576005805460ff60a81b191690555b5050565b60ce6020526000908152604090205460ff1681565b6002609c5414156108ef576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6002609c5560408051808201909152601481527327ab26afa61926b2b9b9b0b3b2a932b630bcb2b960611b602082015260009061092b906103cc565b90506001600160a01b0381161561096457336001600160a01b038216146109645760405162461bcd60e51b81526004016104e190612ee6565b61096c6104a8565b156109b1576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b60006109bf87878787610ce3565b90506109cb8184611201565b15156001146109ec5760405162461bcd60e51b81526004016104e190612f3c565b80516020808301919091206000818152600190925260409091205460ff1615610a275760405162461bcd60e51b81526004016104e190612d9b565b600081815260ce602052604090205460ff1615610a565760405162461bcd60e51b81526004016104e190612ea4565b600480546001600160a01b0319166001600160a01b03898116919091179091556040516000918a1690610a8a908990612bb7565b6000604051808303816000865af19150503d8060008114610ac7576040519150601f19603f3d011682016040523d82523d6000602084013e610acc565b606091505b5050600480546001600160a01b03191661dead179055905080151560011415610b4757600082815260016020819052604091829020805460ff19169091179055517f4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c90610b3a908490612ba0565b60405180910390a1610b7f565b7f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f82604051610b769190612ba0565b60405180910390a15b6000833343604051602001610b9693929190612c05565b60408051601f1981840301815291815281516020928301206000908152918290529020805460ff19166001908117909155609c5550505050505050505050565b60035481565b610be4610cdf565b6001600160a01b0316610bf5610730565b6001600160a01b031614610c3e576040805162461bcd60e51b815260206004820181905260248201526000805160206130d9833981519152604482015290519081900360640190fd5b6001600160a01b038116610c835760405162461bcd60e51b81526004018080602001828103825260268152602001806130356026913960400191505060405180910390fd5b6038546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3603880546001600160a01b0319166001600160a01b0392909216919091179055565b3390565b606084848484604051602401610cfc9493929190612c6b565b60408051601f198184030181529190526020810180516001600160e01b031663cbd4ece960e01b1790529050949350505050565b610d6e6040518060400160405280601d81526020017f4f564d5f43616e6f6e6963616c5472616e73616374696f6e436861696e0000008152506103cc565b6001600160a01b0316636fee07e0610dba6040518060400160405280601a81526020017f4f564d5f4c3243726f7373446f6d61696e4d657373656e6765720000000000008152506103cc565b83856040518463ffffffff1660e01b8152600401610dda93929190612ca8565b600060405180830381600087803b158015610df457600080fd5b505af1158015610559573d6000803e3d6000fd5b610e106104a8565b15610e55576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b606a805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258610e8b610cdf565b604080516001600160a01b039092168252519081900360200190a1565b6000610eb330611226565b15905090565b600554600160a81b900460ff1680610ed45750610ed4610ea8565b80610ee95750600554600160a01b900460ff16155b610f245760405162461bcd60e51b815260040180806020018281038252602e815260200180613085602e913960400191505060405180910390fd5b600554600160a81b900460ff16158015610f5b576005805460ff60a01b1960ff60a81b19909116600160a81b1716600160a01b1790555b8015610f6f576005805460ff60a81b191690555b50565b600554600160a81b900460ff1680610f8d5750610f8d610ea8565b80610fa25750600554600160a01b900460ff16155b610fdd5760405162461bcd60e51b815260040180806020018281038252602e815260200180613085602e913960400191505060405180910390fd5b600554600160a81b900460ff16158015611014576005805460ff60a01b1960ff60a81b19909116600160a81b1716600160a01b1790555b600061101e610cdf565b603880546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3508015610f6f576005805460ff60a81b1916905550565b600554600160a81b900460ff168061109d575061109d610ea8565b806110b25750600554600160a01b900460ff16155b6110ed5760405162461bcd60e51b815260040180806020018281038252602e815260200180613085602e913960400191505060405180910390fd5b600554600160a81b900460ff16158015611124576005805460ff60a01b1960ff60a81b19909116600160a81b1716600160a01b1790555b606a805460ff191690558015610f6f576005805460ff60a81b1916905550565b600554600160a81b900460ff168061115f575061115f610ea8565b806111745750600554600160a01b900460ff16155b6111af5760405162461bcd60e51b815260040180806020018281038252602e815260200180613085602e913960400191505060405180910390fd5b600554600160a81b900460ff161580156111e6576005805460ff60a01b1960ff60a81b19909116600160a81b1716600160a01b1790555b6001609c558015610f6f576005805460ff60a81b1916905550565b600061120c8261122c565b801561121d575061121d8383611389565b90505b92915050565b3b151590565b60008061126d6040518060400160405280601881526020017f4f564d5f5374617465436f6d6d69746d656e74436861696e00000000000000008152506103cc565b6020840151604051639418bddd60e01b81529192506001600160a01b03831691639418bddd9161129f91600401612fcd565b60206040518083038186803b1580156112b757600080fd5b505afa1580156112cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112ef9190612a99565b1580156113825750825160208401516040808601519051634d69ee5760e01b81526001600160a01b03851693634d69ee5793611332939192909190600401612cda565b60206040518083038186803b15801561134a57600080fd5b505afa15801561135e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113829190612a99565b9392505050565b600080836113cb6040518060400160405280601a81526020017f4f564d5f4c3243726f7373446f6d61696e4d657373656e6765720000000000008152506103cc565b6040516020016113dc929190612bd3565b604051602081830303815290604052805190602001206000604051602001611405929190612ba9565b604051602081830303815290604052805190602001209050600080611454602160991b6040516020016114389190612b88565b60408051601f19818403018152919052606087015187516114e6565b909250905060018215151461147b5760405162461bcd60e51b81526004016104e190612de6565b60006114868261150f565b90506114db8460405160200161149c9190612ba0565b60405160208183030381529060405260016040516020016114bd9190612c3f565b604051602081830303815290604052886080015184604001516115a1565b979650505050505050565b6000606060006114f5866115c5565b90506115028186866115f5565b9250925050935093915050565b611517612633565b6000611522836116c8565b9050604051806080016040528061154c8360008151811061153f57fe5b60200260200101516116db565b81526020016115618360018151811061153f57fe5b81526020016115838360028151811061157657fe5b60200260200101516116e2565b81526020016115988360038151811061157657fe5b90529392505050565b6000806115ad866115c5565b90506115bb818686866117db565b9695505050505050565b606081805190602001206040516020016115df9190612ba0565b6040516020818303038152906040529050919050565b60006060600061160485611801565b90506000806000611616848a896118d8565b8151929550909350915015808061162a5750815b61167b576040805162461bcd60e51b815260206004820152601a60248201527f50726f76696465642070726f6f6620697320696e76616c69642e000000000000604482015290519081900360640190fd5b60008161169757604051806020016040528060008152506116b6565b6116b68660018703815181106116a957fe5b6020026020010151611c7e565b919b919a509098505050505050505050565b60606112206116d683611c9a565b611cbf565b6000611220825b600060218260000151111561173e576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e000000000000604482015290519081900360640190fd5b600080600061174c85611e35565b91945092509050600081600181111561176157fe5b146117b3576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e000000000000604482015290519081900360640190fd5b6020808601518401805190918410156115bb5760208490036101000a90049695505050505050565b60008060006117eb8786866115f5565b915091508180156114db57506114db868261215e565b6060600061180e836116c8565b90506000815167ffffffffffffffff8111801561182a57600080fd5b5060405190808252806020026020018201604052801561186457816020015b61185161265a565b8152602001906001900390816118495790505b50905060005b82518110156118d057600061189184838151811061188457fe5b6020026020010151612174565b905060405180604001604052808281526020016118ad836116c8565b8152508383815181106118bc57fe5b60209081029190910101525060010161186a565b509392505050565b600060608180806118e887612203565b9050856000806118f661265a565b60005b8c51811015611c56578c818151811061190e57fe5b60200260200101519150828401935060018701965083600014156119825781518051602090910120851461197d576040805162461bcd60e51b8152602060048201526011602482015270092dcecc2d8d2c840e4dedee840d0c2e6d607b1b604482015290519081900360640190fd5b611a49565b8151516020116119e95781518051602090910120851461197d576040805162461bcd60e51b815260206004820152601b60248201527f496e76616c6964206c6172676520696e7465726e616c20686173680000000000604482015290519081900360640190fd5b846119f78360000151612300565b14611a49576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420696e7465726e616c206e6f64652068617368000000000000604482015290519081900360640190fd5b60208201515160111415611ab8578551841415611a6557611c56565b6000868581518110611a7357fe5b602001015160f81c60f81b60f81c9050600083602001518260ff1681518110611a9857fe5b60200260200101519050611aab8161232c565b9650600194505050611c4e565b60028260200151511415611c01576000611ad183612362565b9050600081600081518110611ae257fe5b016020015160f81c9050600181166002036000611b028460ff8416612380565b90506000611b108b8a612380565b90506000611b1e83836123ad565b905060ff851660021480611b35575060ff85166003145b15611b6757808351148015611b4a5750808251145b15611b5457988901985b50600160ff1b9950611c56945050505050565b60ff85161580611b7a575060ff85166001145b15611bca5782518114611b9a5750600160ff1b9950611c56945050505050565b611bbb8860200151600181518110611bae57fe5b602002602001015161232c565b9a509750611c4e945050505050565b60405162461bcd60e51b81526004018080602001828103825260268152602001806130b36026913960400191505060405180910390fd5b6040805162461bcd60e51b815260206004820152601d60248201527f526563656976656420616e20756e706172736561626c65206e6f64652e000000604482015290519081900360640190fd5b6001016118f9565b50600160ff1b841486611c698786612380565b909e909d50909b509950505050505050505050565b6020810151805160609161122091600019810190811061188457fe5b611ca2612674565b506040805180820190915281518152602082810190820152919050565b6060600080611ccd84611e35565b91935090915060019050816001811115611ce357fe5b14611d35576040805162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c50206c6973742076616c75652e000000000000000000604482015290519081900360640190fd5b6040805160208082526104208201909252600091816020015b611d56612674565b815260200190600190039081611d4e5790505090506000835b8651811015611e2a5760208210611db75760405162461bcd60e51b815260040180806020018281038252602a81526020018061305b602a913960400191505060405180910390fd5b600080611de36040518060400160405280858c60000151038152602001858c6020015101815250611e35565b509150915060405180604001604052808383018152602001848b6020015101815250858581518110611e1157fe5b6020908102919091010152600193909301920101611d6f565b508152949350505050565b600080600080846000015111611e92576040805162461bcd60e51b815260206004820152601860248201527f524c50206974656d2063616e6e6f74206265206e756c6c2e0000000000000000604482015290519081900360640190fd5b6020840151805160001a607f8111611eb7576000600160009450945094505050612157565b60b78111611f2c578551607f198201908110611f1a576040805162461bcd60e51b815260206004820152601960248201527f496e76616c696420524c502073686f727420737472696e672e00000000000000604482015290519081900360640190fd5b60019550935060009250612157915050565b60bf811161201057855160b6198201908110611f8f576040805162461bcd60e51b815260206004820152601f60248201527f496e76616c696420524c50206c6f6e6720737472696e67206c656e6774682e00604482015290519081900360640190fd5b6000816020036101000a6001850151049050808201886000015111611ffb576040805162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c50206c6f6e6720737472696e672e0000000000000000604482015290519081900360640190fd5b60019091019550935060009250612157915050565b60f7811161208457855160bf198201908110612073576040805162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c502073686f7274206c6973742e000000000000000000604482015290519081900360640190fd5b600195509350849250612157915050565b855160f61982019081106120df576040805162461bcd60e51b815260206004820152601d60248201527f496e76616c696420524c50206c6f6e67206c697374206c656e6774682e000000604482015290519081900360640190fd5b6000816020036101000a6001850151049050808201886000015111612144576040805162461bcd60e51b815260206004820152601660248201527524b73b30b634b210292628103637b733903634b9ba1760511b604482015290519081900360640190fd5b6001918201965094509250612157915050565b9193909250565b8051602091820120825192909101919091201490565b6060600080600061218485611e35565b91945092509050600081600181111561219957fe5b146121eb576040805162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c502062797465732076616c75652e0000000000000000604482015290519081900360640190fd5b6121fa85602001518484612413565b95945050505050565b60606000825160020267ffffffffffffffff8111801561222257600080fd5b506040519080825280601f01601f19166020018201604052801561224d576020820181803683370190505b50905060005b83518110156122f957600484828151811061226a57fe5b602001015160f81c60f81b6001600160f81b031916901c82826002028151811061229057fe5b60200101906001600160f81b031916908160001a90535060108482815181106122b557fe5b016020015160f81c816122c457fe5b0660f81b8282600202600101815181106122da57fe5b60200101906001600160f81b031916908160001a905350600101612253565b5092915050565b6000602082511015612317575060208101516104a3565b81806020019051602081101561049e57600080fd5b6000606060208360000151101561234d57612346836124c1565b9050612359565b61235683612174565b90505b61138281612300565b606061122061237b836020015160008151811061188457fe5b612203565b60608251821061239f5750604080516020810190915260008152611220565b61121d8383848651036124cc565b6000805b8084511180156123c15750808351115b801561240657508281815181106123d457fe5b602001015160f81c60f81b6001600160f81b0319168482815181106123f557fe5b01602001516001600160f81b031916145b1561121d576001016123b1565b606060008267ffffffffffffffff8111801561242e57600080fd5b506040519080825280601f01601f191660200182016040528015612459576020820181803683370190505b50905080516000141561246d579050611382565b8484016020820160005b60208604811015612498578251825260209283019290910190600101612477565b5080519151601f959095166020036101000a600019019182169119909416179092525092915050565b60606112208261261d565b60608182601f011015612517576040805162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b604482015290519081900360640190fd5b82828401101561255f576040805162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b604482015290519081900360640190fd5b818301845110156125ab576040805162461bcd60e51b8152602060048201526011602482015270736c6963655f6f75744f66426f756e647360781b604482015290519081900360640190fd5b6060821580156125ca5760405191506000825260208201604052612614565b6040519150601f8416801560200281840101858101878315602002848b0101015b818310156126035780518352602092830192016125eb565b5050858452601f01601f1916604052505b50949350505050565b6060611220826020015160008460000151612413565b60408051608081018252600080825260208201819052918101829052606081019190915290565b604051806040016040528060608152602001606081525090565b604051806040016040528060008152602001600081525090565b600067ffffffffffffffff8311156126a257fe5b6126b5601f8401601f1916602001612fe0565b90508281528383830111156126c957600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b03811681146104a357600080fd5b600082601f830112612707578081fd5b61121d8383356020850161268e565b600060a08284031215612727578081fd5b60405160a0810167ffffffffffffffff828210818311171561274557fe5b8160405282935084358352602085013560208401526040850135604084015260608501356060840152608085013591508082111561278257600080fd5b5061278f858286016126f7565b6080830152505092915050565b6000604082840312156127ad578081fd5b6040516040810167ffffffffffffffff82821081831117156127cb57fe5b81604052829350843583526020915081850135818111156127eb57600080fd5b8501601f810187136127fc57600080fd5b80358281111561280857fe5b8381029250612818848401612fe0565b8181528481019083860185850187018b101561283357600080fd5b600095505b83861015612856578035835260019590950194918601918601612838565b5080868801525050505050505092915050565b803563ffffffff811681146104a357600080fd5b60006020828403121561288e578081fd5b61121d826126e0565b600080600080600060a086880312156128ae578081fd5b6128b7866126e0565b94506128c5602087016126e0565b9350604086013567ffffffffffffffff808211156128e1578283fd5b6128ed89838a016126f7565b9450606088013593506080880135915080821115612909578283fd5b9087019060a0828a03121561291c578283fd5b61292660a0612fe0565b8235815260208301358281111561293b578485fd5b6129478b828601612716565b60208301525060408301358281111561295e578485fd5b61296a8b82860161279c565b604083015250606083013582811115612981578485fd5b61298d8b8286016126f7565b6060830152506080830135828111156129a4578485fd5b6129b08b8286016126f7565b6080830152508093505050509295509295909350565b600080600080600060a086880312156129dd578081fd5b6129e6866126e0565b94506129f4602087016126e0565b9350604086013567ffffffffffffffff811115612a0f578182fd5b612a1b888289016126f7565b93505060608601359150612a3160808701612869565b90509295509295909350565b600080600060608486031215612a51578283fd5b612a5a846126e0565b9250602084013567ffffffffffffffff811115612a75578283fd5b612a81868287016126f7565b925050612a9060408501612869565b90509250925092565b600060208284031215612aaa578081fd5b8151801515811461121d578182fd5b600060208284031215612aca578081fd5b5035919050565b600060208284031215612ae2578081fd5b813567ffffffffffffffff811115612af8578182fd5b8201601f81018413612b08578182fd5b612b178482356020840161268e565b949350505050565b60008151808452612b37816020860160208601613004565b601f01601f19169290920160200192915050565b600081518352602082015160208401526040820151604084015260608201516060840152608082015160a06080850152612b1760a0850182612b1f565b60609190911b6001600160601b031916815260140190565b90815260200190565b918252602082015260400190565b60008251612bc9818460208701613004565b9190910192915050565b60008351612be5818460208801613004565b60609390931b6001600160601b0319169190920190815260140192915050565b60008451612c17818460208901613004565b60609490941b6001600160601b03191691909301908152601481019190915260340192915050565b60f89190911b6001600160f81b031916815260010190565b6001600160a01b0391909116815260200190565b6001600160a01b03858116825284166020820152608060408201819052600090612c9790830185612b1f565b905082606083015295945050505050565b600060018060a01b0385168252836020830152606060408301526121fa6060830184612b1f565b901515815260200190565b60008482526020606081840152612cf46060840186612b4b565b838103604085015260408101855182528286015160408484015281815180845260608501915085830194508693505b80841015612d435784518252938501936001939093019290850190612d23565b509998505050505050505050565b60006020825261121d6020830184612b1f565b6020808252601f908201527f78446f6d61696e4d65737361676553656e646572206973206e6f742073657400604082015260600190565b6020808252602b908201527f50726f7669646564206d6573736167652068617320616c72656164792062656560408201526a37103932b1b2b4bb32b21760a91b606082015260800190565b6020808252604d908201527f4d6573736167652070617373696e67207072656465706c6f7920686173206e6f60408201527f74206265656e20696e697469616c697a6564206f7220696e76616c696420707260608201526c37b7b310383937bb34b232b21760991b608082015260a00190565b6020808252602b908201527f50726f7669646564206d65737361676520686173206e6f7420616c726561647960408201526a103132b2b71039b2b73a1760a91b606082015260800190565b60208082526022908201527f50726f7669646564206d65737361676520686173206265656e20626c6f636b65604082015261321760f11b606082015260800190565b60208082526036908201527f4f6e6c79204f564d5f4c324d65737361676552656c617965722063616e2072656040820152753630bc90261916ba3796a6189036b2b9b9b0b3b2b99760511b606082015260800190565b60208082526027908201527f50726f7669646564206d65737361676520636f756c64206e6f742062652076656040820152663934b334b2b21760c91b606082015260800190565b6020808252602a908201527f4c3143726f7373446f6d61696e4d657373656e67657220616c72656164792069604082015269373a34b0b634bd32b21760b11b606082015260800190565b60006020825261121d6020830184612b4b565b60405181810167ffffffffffffffff81118282101715612ffc57fe5b604052919050565b60005b8381101561301f578181015183820152602001613007565b8381111561302e576000848401525b5050505056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737350726f766964656420524c50206c6973742065786365656473206d6178206c697374206c656e6774682e496e697469616c697a61626c653a20636f6e747261637420697320616c726561647920696e697469616c697a656452656365697665642061206e6f6465207769746820616e20756e6b6e6f776e207072656669784f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a264697066735822122087bd533eeb6152e30fa62837ea031390739b59998c6635383a25ecccc63fce9e64736f6c63430007060033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101215760003560e01c806381ada46c116100ad578063c4d66de811610071578063c4d66de814610213578063c6b94ab014610226578063d7fd19dd14610239578063ecc704281461024c578063f2fde38b1461026157610121565b806381ada46c146101ca57806382e3702d146101dd5780638456cb59146101f05780638da5cb5b146101f8578063b1b1b2091461020057610121565b8063461a4478116100f4578063461a44781461018c5780635c975abb1461019f5780636e296e45146101a7578063706ceab6146101af578063715018a6146101c257610121565b80630ecf2eea1461012657806321d800ec1461013b578063299ca478146101645780633dbb202b14610179575b600080fd5b610139610134366004612ab9565b610274565b005b61014e610149366004612ab9565b610319565b60405161015b9190612ccf565b60405180910390f35b61016c61032e565b60405161015b9190612c57565b610139610187366004612a3d565b61033d565b61016c61019a366004612ad1565b6103cc565b61014e6104a8565b61016c6104b1565b6101396101bd3660046129c6565b6104fa565b610139610561565b6101396101d8366004612ab9565b61060d565b61014e6101eb366004612ab9565b6106af565b6101396106c4565b61016c610730565b61014e61020e366004612ab9565b61073f565b61013961022136600461287d565b610754565b61014e610234366004612ab9565b610882565b610139610247366004612897565b610897565b610254610bd6565b60405161015b9190612ba0565b61013961026f36600461287d565b610bdc565b61027c610cdf565b6001600160a01b031661028d610730565b6001600160a01b0316146102d6576040805162461bcd60e51b815260206004820181905260248201526000805160206130d9833981519152604482015290519081900360640190fd5b600081815260ce6020526040808220805460ff191660011790555182917ff52508d5339edf0d7e5060a416df98db067af561bdc60872d29c0439eaa13a0291a250565b60006020819052908152604090205460ff1681565b6005546001600160a01b031681565b600061034d843385600354610ce3565b60038054600190810190915581516020808401919091206000908152600290915260409020805460ff19169091179055905061038f8163ffffffff8416610d30565b7f0ee9ffdb2334d78de97ffb066b23a352a4d35180cefb36589d663fbb1eb6f326816040516103be9190612d51565b60405180910390a150505050565b60055460405163bf40fac160e01b81526020600482018181528451602484015284516000946001600160a01b03169363bf40fac1938793928392604401918501908083838b5b8381101561042a578181015183820152602001610412565b50505050905090810190601f1680156104575780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561047457600080fd5b505afa158015610488573d6000803e3d6000fd5b505050506040513d602081101561049e57600080fd5b505190505b919050565b606a5460ff1690565b6004546000906001600160a01b031661dead14156104ea5760405162461bcd60e51b81526004016104e190612d64565b60405180910390fd5b506004546001600160a01b031690565b600061050886868686610ce3565b805160208083019190912060009081526002909152604090205490915060ff1615156001146105495760405162461bcd60e51b81526004016104e190612e59565b610559818363ffffffff16610d30565b505050505050565b610569610cdf565b6001600160a01b031661057a610730565b6001600160a01b0316146105c3576040805162461bcd60e51b815260206004820181905260248201526000805160206130d9833981519152604482015290519081900360640190fd5b6038546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3603880546001600160a01b0319169055565b610615610cdf565b6001600160a01b0316610626610730565b6001600160a01b03161461066f576040805162461bcd60e51b815260206004820181905260248201526000805160206130d9833981519152604482015290519081900360640190fd5b600081815260ce6020526040808220805460ff191690555182917f52c8a2680a9f4cc0ad0bf88f32096eadbebf0646ea611d93a0ce6a29a024040591a250565b60026020526000908152604090205460ff1681565b6106cc610cdf565b6001600160a01b03166106dd610730565b6001600160a01b031614610726576040805162461bcd60e51b815260206004820181905260248201526000805160206130d9833981519152604482015290519081900360640190fd5b61072e610e08565b565b6038546001600160a01b031690565b60016020526000908152604090205460ff1681565b600554600160a81b900460ff168061076f575061076f610ea8565b806107845750600554600160a01b900460ff16155b6107bf5760405162461bcd60e51b815260040180806020018281038252602e815260200180613085602e913960400191505060405180910390fd5b600554600160a81b900460ff161580156107f6576005805460ff60a01b1960ff60a81b19909116600160a81b1716600160a01b1790555b6005546001600160a01b03161561081f5760405162461bcd60e51b81526004016104e190612f83565b600580546001600160a01b0384166001600160a01b0319918216179091556004805490911661dead179055610852610eb9565b61085a610f72565b610862611082565b61086a611144565b801561087e576005805460ff60a81b191690555b5050565b60ce6020526000908152604090205460ff1681565b6002609c5414156108ef576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6002609c5560408051808201909152601481527327ab26afa61926b2b9b9b0b3b2a932b630bcb2b960611b602082015260009061092b906103cc565b90506001600160a01b0381161561096457336001600160a01b038216146109645760405162461bcd60e51b81526004016104e190612ee6565b61096c6104a8565b156109b1576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b60006109bf87878787610ce3565b90506109cb8184611201565b15156001146109ec5760405162461bcd60e51b81526004016104e190612f3c565b80516020808301919091206000818152600190925260409091205460ff1615610a275760405162461bcd60e51b81526004016104e190612d9b565b600081815260ce602052604090205460ff1615610a565760405162461bcd60e51b81526004016104e190612ea4565b600480546001600160a01b0319166001600160a01b03898116919091179091556040516000918a1690610a8a908990612bb7565b6000604051808303816000865af19150503d8060008114610ac7576040519150601f19603f3d011682016040523d82523d6000602084013e610acc565b606091505b5050600480546001600160a01b03191661dead179055905080151560011415610b4757600082815260016020819052604091829020805460ff19169091179055517f4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c90610b3a908490612ba0565b60405180910390a1610b7f565b7f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f82604051610b769190612ba0565b60405180910390a15b6000833343604051602001610b9693929190612c05565b60408051601f1981840301815291815281516020928301206000908152918290529020805460ff19166001908117909155609c5550505050505050505050565b60035481565b610be4610cdf565b6001600160a01b0316610bf5610730565b6001600160a01b031614610c3e576040805162461bcd60e51b815260206004820181905260248201526000805160206130d9833981519152604482015290519081900360640190fd5b6001600160a01b038116610c835760405162461bcd60e51b81526004018080602001828103825260268152602001806130356026913960400191505060405180910390fd5b6038546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3603880546001600160a01b0319166001600160a01b0392909216919091179055565b3390565b606084848484604051602401610cfc9493929190612c6b565b60408051601f198184030181529190526020810180516001600160e01b031663cbd4ece960e01b1790529050949350505050565b610d6e6040518060400160405280601d81526020017f4f564d5f43616e6f6e6963616c5472616e73616374696f6e436861696e0000008152506103cc565b6001600160a01b0316636fee07e0610dba6040518060400160405280601a81526020017f4f564d5f4c3243726f7373446f6d61696e4d657373656e6765720000000000008152506103cc565b83856040518463ffffffff1660e01b8152600401610dda93929190612ca8565b600060405180830381600087803b158015610df457600080fd5b505af1158015610559573d6000803e3d6000fd5b610e106104a8565b15610e55576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b606a805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258610e8b610cdf565b604080516001600160a01b039092168252519081900360200190a1565b6000610eb330611226565b15905090565b600554600160a81b900460ff1680610ed45750610ed4610ea8565b80610ee95750600554600160a01b900460ff16155b610f245760405162461bcd60e51b815260040180806020018281038252602e815260200180613085602e913960400191505060405180910390fd5b600554600160a81b900460ff16158015610f5b576005805460ff60a01b1960ff60a81b19909116600160a81b1716600160a01b1790555b8015610f6f576005805460ff60a81b191690555b50565b600554600160a81b900460ff1680610f8d5750610f8d610ea8565b80610fa25750600554600160a01b900460ff16155b610fdd5760405162461bcd60e51b815260040180806020018281038252602e815260200180613085602e913960400191505060405180910390fd5b600554600160a81b900460ff16158015611014576005805460ff60a01b1960ff60a81b19909116600160a81b1716600160a01b1790555b600061101e610cdf565b603880546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3508015610f6f576005805460ff60a81b1916905550565b600554600160a81b900460ff168061109d575061109d610ea8565b806110b25750600554600160a01b900460ff16155b6110ed5760405162461bcd60e51b815260040180806020018281038252602e815260200180613085602e913960400191505060405180910390fd5b600554600160a81b900460ff16158015611124576005805460ff60a01b1960ff60a81b19909116600160a81b1716600160a01b1790555b606a805460ff191690558015610f6f576005805460ff60a81b1916905550565b600554600160a81b900460ff168061115f575061115f610ea8565b806111745750600554600160a01b900460ff16155b6111af5760405162461bcd60e51b815260040180806020018281038252602e815260200180613085602e913960400191505060405180910390fd5b600554600160a81b900460ff161580156111e6576005805460ff60a01b1960ff60a81b19909116600160a81b1716600160a01b1790555b6001609c558015610f6f576005805460ff60a81b1916905550565b600061120c8261122c565b801561121d575061121d8383611389565b90505b92915050565b3b151590565b60008061126d6040518060400160405280601881526020017f4f564d5f5374617465436f6d6d69746d656e74436861696e00000000000000008152506103cc565b6020840151604051639418bddd60e01b81529192506001600160a01b03831691639418bddd9161129f91600401612fcd565b60206040518083038186803b1580156112b757600080fd5b505afa1580156112cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112ef9190612a99565b1580156113825750825160208401516040808601519051634d69ee5760e01b81526001600160a01b03851693634d69ee5793611332939192909190600401612cda565b60206040518083038186803b15801561134a57600080fd5b505afa15801561135e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113829190612a99565b9392505050565b600080836113cb6040518060400160405280601a81526020017f4f564d5f4c3243726f7373446f6d61696e4d657373656e6765720000000000008152506103cc565b6040516020016113dc929190612bd3565b604051602081830303815290604052805190602001206000604051602001611405929190612ba9565b604051602081830303815290604052805190602001209050600080611454602160991b6040516020016114389190612b88565b60408051601f19818403018152919052606087015187516114e6565b909250905060018215151461147b5760405162461bcd60e51b81526004016104e190612de6565b60006114868261150f565b90506114db8460405160200161149c9190612ba0565b60405160208183030381529060405260016040516020016114bd9190612c3f565b604051602081830303815290604052886080015184604001516115a1565b979650505050505050565b6000606060006114f5866115c5565b90506115028186866115f5565b9250925050935093915050565b611517612633565b6000611522836116c8565b9050604051806080016040528061154c8360008151811061153f57fe5b60200260200101516116db565b81526020016115618360018151811061153f57fe5b81526020016115838360028151811061157657fe5b60200260200101516116e2565b81526020016115988360038151811061157657fe5b90529392505050565b6000806115ad866115c5565b90506115bb818686866117db565b9695505050505050565b606081805190602001206040516020016115df9190612ba0565b6040516020818303038152906040529050919050565b60006060600061160485611801565b90506000806000611616848a896118d8565b8151929550909350915015808061162a5750815b61167b576040805162461bcd60e51b815260206004820152601a60248201527f50726f76696465642070726f6f6620697320696e76616c69642e000000000000604482015290519081900360640190fd5b60008161169757604051806020016040528060008152506116b6565b6116b68660018703815181106116a957fe5b6020026020010151611c7e565b919b919a509098505050505050505050565b60606112206116d683611c9a565b611cbf565b6000611220825b600060218260000151111561173e576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e000000000000604482015290519081900360640190fd5b600080600061174c85611e35565b91945092509050600081600181111561176157fe5b146117b3576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e000000000000604482015290519081900360640190fd5b6020808601518401805190918410156115bb5760208490036101000a90049695505050505050565b60008060006117eb8786866115f5565b915091508180156114db57506114db868261215e565b6060600061180e836116c8565b90506000815167ffffffffffffffff8111801561182a57600080fd5b5060405190808252806020026020018201604052801561186457816020015b61185161265a565b8152602001906001900390816118495790505b50905060005b82518110156118d057600061189184838151811061188457fe5b6020026020010151612174565b905060405180604001604052808281526020016118ad836116c8565b8152508383815181106118bc57fe5b60209081029190910101525060010161186a565b509392505050565b600060608180806118e887612203565b9050856000806118f661265a565b60005b8c51811015611c56578c818151811061190e57fe5b60200260200101519150828401935060018701965083600014156119825781518051602090910120851461197d576040805162461bcd60e51b8152602060048201526011602482015270092dcecc2d8d2c840e4dedee840d0c2e6d607b1b604482015290519081900360640190fd5b611a49565b8151516020116119e95781518051602090910120851461197d576040805162461bcd60e51b815260206004820152601b60248201527f496e76616c6964206c6172676520696e7465726e616c20686173680000000000604482015290519081900360640190fd5b846119f78360000151612300565b14611a49576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420696e7465726e616c206e6f64652068617368000000000000604482015290519081900360640190fd5b60208201515160111415611ab8578551841415611a6557611c56565b6000868581518110611a7357fe5b602001015160f81c60f81b60f81c9050600083602001518260ff1681518110611a9857fe5b60200260200101519050611aab8161232c565b9650600194505050611c4e565b60028260200151511415611c01576000611ad183612362565b9050600081600081518110611ae257fe5b016020015160f81c9050600181166002036000611b028460ff8416612380565b90506000611b108b8a612380565b90506000611b1e83836123ad565b905060ff851660021480611b35575060ff85166003145b15611b6757808351148015611b4a5750808251145b15611b5457988901985b50600160ff1b9950611c56945050505050565b60ff85161580611b7a575060ff85166001145b15611bca5782518114611b9a5750600160ff1b9950611c56945050505050565b611bbb8860200151600181518110611bae57fe5b602002602001015161232c565b9a509750611c4e945050505050565b60405162461bcd60e51b81526004018080602001828103825260268152602001806130b36026913960400191505060405180910390fd5b6040805162461bcd60e51b815260206004820152601d60248201527f526563656976656420616e20756e706172736561626c65206e6f64652e000000604482015290519081900360640190fd5b6001016118f9565b50600160ff1b841486611c698786612380565b909e909d50909b509950505050505050505050565b6020810151805160609161122091600019810190811061188457fe5b611ca2612674565b506040805180820190915281518152602082810190820152919050565b6060600080611ccd84611e35565b91935090915060019050816001811115611ce357fe5b14611d35576040805162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c50206c6973742076616c75652e000000000000000000604482015290519081900360640190fd5b6040805160208082526104208201909252600091816020015b611d56612674565b815260200190600190039081611d4e5790505090506000835b8651811015611e2a5760208210611db75760405162461bcd60e51b815260040180806020018281038252602a81526020018061305b602a913960400191505060405180910390fd5b600080611de36040518060400160405280858c60000151038152602001858c6020015101815250611e35565b509150915060405180604001604052808383018152602001848b6020015101815250858581518110611e1157fe5b6020908102919091010152600193909301920101611d6f565b508152949350505050565b600080600080846000015111611e92576040805162461bcd60e51b815260206004820152601860248201527f524c50206974656d2063616e6e6f74206265206e756c6c2e0000000000000000604482015290519081900360640190fd5b6020840151805160001a607f8111611eb7576000600160009450945094505050612157565b60b78111611f2c578551607f198201908110611f1a576040805162461bcd60e51b815260206004820152601960248201527f496e76616c696420524c502073686f727420737472696e672e00000000000000604482015290519081900360640190fd5b60019550935060009250612157915050565b60bf811161201057855160b6198201908110611f8f576040805162461bcd60e51b815260206004820152601f60248201527f496e76616c696420524c50206c6f6e6720737472696e67206c656e6774682e00604482015290519081900360640190fd5b6000816020036101000a6001850151049050808201886000015111611ffb576040805162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c50206c6f6e6720737472696e672e0000000000000000604482015290519081900360640190fd5b60019091019550935060009250612157915050565b60f7811161208457855160bf198201908110612073576040805162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c502073686f7274206c6973742e000000000000000000604482015290519081900360640190fd5b600195509350849250612157915050565b855160f61982019081106120df576040805162461bcd60e51b815260206004820152601d60248201527f496e76616c696420524c50206c6f6e67206c697374206c656e6774682e000000604482015290519081900360640190fd5b6000816020036101000a6001850151049050808201886000015111612144576040805162461bcd60e51b815260206004820152601660248201527524b73b30b634b210292628103637b733903634b9ba1760511b604482015290519081900360640190fd5b6001918201965094509250612157915050565b9193909250565b8051602091820120825192909101919091201490565b6060600080600061218485611e35565b91945092509050600081600181111561219957fe5b146121eb576040805162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c502062797465732076616c75652e0000000000000000604482015290519081900360640190fd5b6121fa85602001518484612413565b95945050505050565b60606000825160020267ffffffffffffffff8111801561222257600080fd5b506040519080825280601f01601f19166020018201604052801561224d576020820181803683370190505b50905060005b83518110156122f957600484828151811061226a57fe5b602001015160f81c60f81b6001600160f81b031916901c82826002028151811061229057fe5b60200101906001600160f81b031916908160001a90535060108482815181106122b557fe5b016020015160f81c816122c457fe5b0660f81b8282600202600101815181106122da57fe5b60200101906001600160f81b031916908160001a905350600101612253565b5092915050565b6000602082511015612317575060208101516104a3565b81806020019051602081101561049e57600080fd5b6000606060208360000151101561234d57612346836124c1565b9050612359565b61235683612174565b90505b61138281612300565b606061122061237b836020015160008151811061188457fe5b612203565b60608251821061239f5750604080516020810190915260008152611220565b61121d8383848651036124cc565b6000805b8084511180156123c15750808351115b801561240657508281815181106123d457fe5b602001015160f81c60f81b6001600160f81b0319168482815181106123f557fe5b01602001516001600160f81b031916145b1561121d576001016123b1565b606060008267ffffffffffffffff8111801561242e57600080fd5b506040519080825280601f01601f191660200182016040528015612459576020820181803683370190505b50905080516000141561246d579050611382565b8484016020820160005b60208604811015612498578251825260209283019290910190600101612477565b5080519151601f959095166020036101000a600019019182169119909416179092525092915050565b60606112208261261d565b60608182601f011015612517576040805162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b604482015290519081900360640190fd5b82828401101561255f576040805162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b604482015290519081900360640190fd5b818301845110156125ab576040805162461bcd60e51b8152602060048201526011602482015270736c6963655f6f75744f66426f756e647360781b604482015290519081900360640190fd5b6060821580156125ca5760405191506000825260208201604052612614565b6040519150601f8416801560200281840101858101878315602002848b0101015b818310156126035780518352602092830192016125eb565b5050858452601f01601f1916604052505b50949350505050565b6060611220826020015160008460000151612413565b60408051608081018252600080825260208201819052918101829052606081019190915290565b604051806040016040528060608152602001606081525090565b604051806040016040528060008152602001600081525090565b600067ffffffffffffffff8311156126a257fe5b6126b5601f8401601f1916602001612fe0565b90508281528383830111156126c957600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b03811681146104a357600080fd5b600082601f830112612707578081fd5b61121d8383356020850161268e565b600060a08284031215612727578081fd5b60405160a0810167ffffffffffffffff828210818311171561274557fe5b8160405282935084358352602085013560208401526040850135604084015260608501356060840152608085013591508082111561278257600080fd5b5061278f858286016126f7565b6080830152505092915050565b6000604082840312156127ad578081fd5b6040516040810167ffffffffffffffff82821081831117156127cb57fe5b81604052829350843583526020915081850135818111156127eb57600080fd5b8501601f810187136127fc57600080fd5b80358281111561280857fe5b8381029250612818848401612fe0565b8181528481019083860185850187018b101561283357600080fd5b600095505b83861015612856578035835260019590950194918601918601612838565b5080868801525050505050505092915050565b803563ffffffff811681146104a357600080fd5b60006020828403121561288e578081fd5b61121d826126e0565b600080600080600060a086880312156128ae578081fd5b6128b7866126e0565b94506128c5602087016126e0565b9350604086013567ffffffffffffffff808211156128e1578283fd5b6128ed89838a016126f7565b9450606088013593506080880135915080821115612909578283fd5b9087019060a0828a03121561291c578283fd5b61292660a0612fe0565b8235815260208301358281111561293b578485fd5b6129478b828601612716565b60208301525060408301358281111561295e578485fd5b61296a8b82860161279c565b604083015250606083013582811115612981578485fd5b61298d8b8286016126f7565b6060830152506080830135828111156129a4578485fd5b6129b08b8286016126f7565b6080830152508093505050509295509295909350565b600080600080600060a086880312156129dd578081fd5b6129e6866126e0565b94506129f4602087016126e0565b9350604086013567ffffffffffffffff811115612a0f578182fd5b612a1b888289016126f7565b93505060608601359150612a3160808701612869565b90509295509295909350565b600080600060608486031215612a51578283fd5b612a5a846126e0565b9250602084013567ffffffffffffffff811115612a75578283fd5b612a81868287016126f7565b925050612a9060408501612869565b90509250925092565b600060208284031215612aaa578081fd5b8151801515811461121d578182fd5b600060208284031215612aca578081fd5b5035919050565b600060208284031215612ae2578081fd5b813567ffffffffffffffff811115612af8578182fd5b8201601f81018413612b08578182fd5b612b178482356020840161268e565b949350505050565b60008151808452612b37816020860160208601613004565b601f01601f19169290920160200192915050565b600081518352602082015160208401526040820151604084015260608201516060840152608082015160a06080850152612b1760a0850182612b1f565b60609190911b6001600160601b031916815260140190565b90815260200190565b918252602082015260400190565b60008251612bc9818460208701613004565b9190910192915050565b60008351612be5818460208801613004565b60609390931b6001600160601b0319169190920190815260140192915050565b60008451612c17818460208901613004565b60609490941b6001600160601b03191691909301908152601481019190915260340192915050565b60f89190911b6001600160f81b031916815260010190565b6001600160a01b0391909116815260200190565b6001600160a01b03858116825284166020820152608060408201819052600090612c9790830185612b1f565b905082606083015295945050505050565b600060018060a01b0385168252836020830152606060408301526121fa6060830184612b1f565b901515815260200190565b60008482526020606081840152612cf46060840186612b4b565b838103604085015260408101855182528286015160408484015281815180845260608501915085830194508693505b80841015612d435784518252938501936001939093019290850190612d23565b509998505050505050505050565b60006020825261121d6020830184612b1f565b6020808252601f908201527f78446f6d61696e4d65737361676553656e646572206973206e6f742073657400604082015260600190565b6020808252602b908201527f50726f7669646564206d6573736167652068617320616c72656164792062656560408201526a37103932b1b2b4bb32b21760a91b606082015260800190565b6020808252604d908201527f4d6573736167652070617373696e67207072656465706c6f7920686173206e6f60408201527f74206265656e20696e697469616c697a6564206f7220696e76616c696420707260608201526c37b7b310383937bb34b232b21760991b608082015260a00190565b6020808252602b908201527f50726f7669646564206d65737361676520686173206e6f7420616c726561647960408201526a103132b2b71039b2b73a1760a91b606082015260800190565b60208082526022908201527f50726f7669646564206d65737361676520686173206265656e20626c6f636b65604082015261321760f11b606082015260800190565b60208082526036908201527f4f6e6c79204f564d5f4c324d65737361676552656c617965722063616e2072656040820152753630bc90261916ba3796a6189036b2b9b9b0b3b2b99760511b606082015260800190565b60208082526027908201527f50726f7669646564206d65737361676520636f756c64206e6f742062652076656040820152663934b334b2b21760c91b606082015260800190565b6020808252602a908201527f4c3143726f7373446f6d61696e4d657373656e67657220616c72656164792069604082015269373a34b0b634bd32b21760b11b606082015260800190565b60006020825261121d6020830184612b4b565b60405181810167ffffffffffffffff81118282101715612ffc57fe5b604052919050565b60005b8381101561301f578181015183820152602001613007565b8381111561302e576000848401525b5050505056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737350726f766964656420524c50206c6973742065786365656473206d6178206c697374206c656e6774682e496e697469616c697a61626c653a20636f6e747261637420697320616c726561647920696e697469616c697a656452656365697665642061206e6f6465207769746820616e20756e6b6e6f776e207072656669784f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a264697066735822122087bd533eeb6152e30fa62837ea031390739b59998c6635383a25ecccc63fce9e64736f6c63430007060033", "devdoc": { "details": "The L1 Cross Domain Messenger contract sends messages from L1 to L2, and relays messages from L2 onto L1. In the event that a message sent from L1 to L2 is rejected for exceeding the L2 epoch gas limit, it can be resubmitted via this contract's replay function. Compiler used: solc Runtime target: EVM", "kind": "dev", "methods": { + "allowMessage(bytes32)": { + "params": { + "_xDomainCalldataHash": "Hash of the message to block." + } + }, + "blockMessage(bytes32)": { + "params": { + "_xDomainCalldataHash": "Hash of the message to block." + } + }, "initialize(address)": { "params": { "_libAddressManager": "Address of the Address Manager." } }, + "owner()": { + "details": "Returns the address of the current owner." + }, + "paused()": { + "details": "Returns true if the contract is paused, and false otherwise." + }, "relayMessage(address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))": { "params": { "_message": "Message to send to the target.", @@ -355,6 +553,9 @@ "_target": "Target contract address." } }, + "renounceOwnership()": { + "details": "Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner." + }, "replayMessage(address,address,bytes,uint256,uint32)": { "params": { "_gasLimit": "Gas limit for the provided message.", @@ -364,12 +565,23 @@ "_target": "Target contract address." } }, + "resolve(string)": { + "params": { + "_name": "Name to resolve an address for." + }, + "returns": { + "_0": "Address associated with the given name." + } + }, "sendMessage(address,bytes,uint32)": { "params": { "_gasLimit": "Gas limit for the provided message.", "_message": "Message to send to the target.", "_target": "Target contract address." } + }, + "transferOwnership(address)": { + "details": "Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner." } }, "title": "OVM_L1CrossDomainMessenger", @@ -378,8 +590,17 @@ "userdoc": { "kind": "user", "methods": { + "allowMessage(bytes32)": { + "notice": "Allow a message." + }, + "blockMessage(bytes32)": { + "notice": "Block a message." + }, "constructor": { - "notice": "Pass a default zero address to the address resolver. This will be updated when initialized." + "notice": "This contract is intended to be behind a delegate proxy. We pass the zero address to the address resolver just to satisfy the constructor. We still need to set this value in initialize()." + }, + "pause()": { + "notice": "Pause relaying." }, "relayMessage(address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))": { "notice": "Relays a cross domain message to a contract." @@ -387,6 +608,9 @@ "replayMessage(address,address,bytes,uint256,uint32)": { "notice": "Replays a cross domain message to the target messenger." }, + "resolve(string)": { + "notice": "Resolves the address associated with a given name." + }, "sendMessage(address,bytes,uint32)": { "notice": "Sends a cross domain message to the target messenger." } @@ -396,60 +620,132 @@ "storageLayout": { "storage": [ { - "astId": 17772, + "astId": 1272, "contract": "contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1CrossDomainMessenger.sol:OVM_L1CrossDomainMessenger", - "label": "_status", + "label": "relayedMessages", "offset": 0, "slot": "0", - "type": "t_uint256" + "type": "t_mapping(t_bytes32,t_bool)" }, { - "astId": 686, + "astId": 1276, "contract": "contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1CrossDomainMessenger.sol:OVM_L1CrossDomainMessenger", - "label": "relayedMessages", + "label": "successfulMessages", "offset": 0, "slot": "1", "type": "t_mapping(t_bytes32,t_bool)" }, { - "astId": 690, + "astId": 1280, "contract": "contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1CrossDomainMessenger.sol:OVM_L1CrossDomainMessenger", - "label": "successfulMessages", + "label": "sentMessages", "offset": 0, "slot": "2", "type": "t_mapping(t_bytes32,t_bool)" }, { - "astId": 694, + "astId": 1282, "contract": "contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1CrossDomainMessenger.sol:OVM_L1CrossDomainMessenger", - "label": "sentMessages", + "label": "messageNonce", "offset": 0, "slot": "3", - "type": "t_mapping(t_bytes32,t_bool)" + "type": "t_uint256" }, { - "astId": 696, + "astId": 1285, "contract": "contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1CrossDomainMessenger.sol:OVM_L1CrossDomainMessenger", - "label": "messageNonce", + "label": "xDomainMsgSender", "offset": 0, "slot": "4", - "type": "t_uint256" + "type": "t_address" }, { - "astId": 699, + "astId": 12856, "contract": "contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1CrossDomainMessenger.sol:OVM_L1CrossDomainMessenger", - "label": "xDomainMsgSender", + "label": "libAddressManager", "offset": 0, "slot": "5", - "type": "t_address" + "type": "t_contract(Lib_AddressManager)12849" }, { - "astId": 12554, + "astId": 137, "contract": "contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1CrossDomainMessenger.sol:OVM_L1CrossDomainMessenger", - "label": "libAddressManager", + "label": "_initialized", + "offset": 20, + "slot": "5", + "type": "t_bool" + }, + { + "astId": 140, + "contract": "contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1CrossDomainMessenger.sol:OVM_L1CrossDomainMessenger", + "label": "_initializing", + "offset": 21, + "slot": "5", + "type": "t_bool" + }, + { + "astId": 484, + "contract": "contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1CrossDomainMessenger.sol:OVM_L1CrossDomainMessenger", + "label": "__gap", "offset": 0, "slot": "6", - "type": "t_contract(Lib_AddressManager)12547" + "type": "t_array(t_uint256)50_storage" + }, + { + "astId": 10, + "contract": "contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1CrossDomainMessenger.sol:OVM_L1CrossDomainMessenger", + "label": "_owner", + "offset": 0, + "slot": "56", + "type": "t_address" + }, + { + "astId": 129, + "contract": "contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1CrossDomainMessenger.sol:OVM_L1CrossDomainMessenger", + "label": "__gap", + "offset": 0, + "slot": "57", + "type": "t_array(t_uint256)49_storage" + }, + { + "astId": 506, + "contract": "contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1CrossDomainMessenger.sol:OVM_L1CrossDomainMessenger", + "label": "_paused", + "offset": 0, + "slot": "106", + "type": "t_bool" + }, + { + "astId": 597, + "contract": "contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1CrossDomainMessenger.sol:OVM_L1CrossDomainMessenger", + "label": "__gap", + "offset": 0, + "slot": "107", + "type": "t_array(t_uint256)49_storage" + }, + { + "astId": 612, + "contract": "contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1CrossDomainMessenger.sol:OVM_L1CrossDomainMessenger", + "label": "_status", + "offset": 0, + "slot": "156", + "type": "t_uint256" + }, + { + "astId": 655, + "contract": "contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1CrossDomainMessenger.sol:OVM_L1CrossDomainMessenger", + "label": "__gap", + "offset": 0, + "slot": "157", + "type": "t_array(t_uint256)49_storage" + }, + { + "astId": 1436, + "contract": "contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1CrossDomainMessenger.sol:OVM_L1CrossDomainMessenger", + "label": "blockedMessages", + "offset": 0, + "slot": "206", + "type": "t_mapping(t_bytes32,t_bool)" } ], "types": { @@ -458,6 +754,18 @@ "label": "address", "numberOfBytes": "20" }, + "t_array(t_uint256)49_storage": { + "base": "t_uint256", + "encoding": "inplace", + "label": "uint256[49]", + "numberOfBytes": "1568" + }, + "t_array(t_uint256)50_storage": { + "base": "t_uint256", + "encoding": "inplace", + "label": "uint256[50]", + "numberOfBytes": "1600" + }, "t_bool": { "encoding": "inplace", "label": "bool", @@ -468,7 +776,7 @@ "label": "bytes32", "numberOfBytes": "32" }, - "t_contract(Lib_AddressManager)12547": { + "t_contract(Lib_AddressManager)12849": { "encoding": "inplace", "label": "contract Lib_AddressManager", "numberOfBytes": "20" diff --git a/packages/contracts/deployments/mainnet/OVM_L1ETHGateway.json b/packages/contracts/deployments/mainnet/OVM_L1ETHGateway.json index 3120f60908de9..a8f084ce78de6 100644 --- a/packages/contracts/deployments/mainnet/OVM_L1ETHGateway.json +++ b/packages/contracts/deployments/mainnet/OVM_L1ETHGateway.json @@ -1,5 +1,5 @@ { - "address": "0x384bC62a4bb9aE617c8dD0eC351d7780444EFDc0", + "address": "0x40c9067ec8087EcF101FC10d2673636955b81A32", "abi": [ { "inputs": [], @@ -70,6 +70,13 @@ "stateMutability": "payable", "type": "function" }, + { + "inputs": [], + "name": "donateETH", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, { "inputs": [ { @@ -145,6 +152,19 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [ + { + "internalType": "address payable", + "name": "_to", + "type": "address" + } + ], + "name": "migrateEth", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [], "name": "ovmEth", @@ -170,7 +190,7 @@ "outputs": [ { "internalType": "address", - "name": "_contract", + "name": "", "type": "address" } ], @@ -182,27 +202,27 @@ "type": "receive" } ], - "transactionHash": "0xa573fb68f6e9c62b7b5df7796822c181efdcfc05efd3d9d34a119121b54765d0", + "transactionHash": "0xac7e6ccfa141ea21c7b61df91f8fa959c3511a03620f9454eb30127db36d4728", "receipt": { "to": null, - "from": "0x77C4c8f491e5ff22a2C0E18b005c3BA0Fe36c1Bc", - "contractAddress": "0x384bC62a4bb9aE617c8dD0eC351d7780444EFDc0", - "transactionIndex": 186, - "gasUsed": "599914", + "from": "0xd033f09cB85621F98F7A84C64dB381ac16Eff818", + "contractAddress": "0x40c9067ec8087EcF101FC10d2673636955b81A32", + "transactionIndex": 226, + "gasUsed": "698930", "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0xea2f409173c3b697f9badb641ba910536bf708d8f9cafa603890671e2e08d493", - "transactionHash": "0xa573fb68f6e9c62b7b5df7796822c181efdcfc05efd3d9d34a119121b54765d0", + "blockHash": "0x90752aa20b2cd9833bae07978ff62448296af979223745e985082ec1815dc60d", + "transactionHash": "0xac7e6ccfa141ea21c7b61df91f8fa959c3511a03620f9454eb30127db36d4728", "logs": [], - "blockNumber": 12208108, - "cumulativeGasUsed": "12426887", + "blockNumber": 12410915, + "cumulativeGasUsed": "12706291", "status": 1, "byzantium": true }, "args": [], - "solcInputHash": "43ee6bb8ef92595aa6d0e22a6c464dff", - "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"DepositInitiated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"WithdrawalFinalized\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"deposit\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"}],\"name\":\"depositTo\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"finalizeWithdrawal\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getFinalizeDepositL2Gas\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_ovmEth\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"messenger\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ovmEth\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"_contract\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"details\":\"The L1 ETH Gateway is a contract which stores deposited ETH that is in use on L2. Compiler used: solc Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"deposit()\":{\"details\":\"deposit an amount of the ETH to the caller's balance on L2\"},\"depositTo(address)\":{\"details\":\"deposit an amount of ETH to a recipients's balance on L2\",\"params\":{\"_to\":\"L2 address to credit the withdrawal to\"}},\"finalizeWithdrawal(address,uint256)\":{\"details\":\"Complete a withdrawal from L2 to L1, and credit funds to the recipient's balance of the L1 ETH token. Since only the xDomainMessenger can call this function, it will never be called before the withdrawal is finalized. \",\"params\":{\"_amount\":\"Amount of the ETH to withdraw\",\"_to\":\"L1 address to credit the withdrawal to\"}},\"initialize(address,address)\":{\"params\":{\"_libAddressManager\":\"Address manager for this OE deployment\",\"_ovmEth\":\"L2 OVM_ETH implementation of iOVM_DepositedToken\"}}},\"title\":\"OVM_L1ETHGateway\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/OVM/bridge/tokens/OVM_L1ETHGateway.sol\":\"OVM_L1ETHGateway\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/optimistic-ethereum/OVM/bridge/tokens/OVM_L1ETHGateway.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// @unsupported: ovm\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Interface Imports */\\nimport { iOVM_L1ETHGateway } from \\\"../../../iOVM/bridge/tokens/iOVM_L1ETHGateway.sol\\\";\\nimport { iOVM_L2DepositedToken } from \\\"../../../iOVM/bridge/tokens/iOVM_L2DepositedToken.sol\\\";\\n\\n/* Library Imports */\\nimport { OVM_CrossDomainEnabled } from \\\"../../../libraries/bridge/OVM_CrossDomainEnabled.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../../libraries/resolver/Lib_AddressResolver.sol\\\";\\nimport { Lib_AddressManager } from \\\"../../../libraries/resolver/Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title OVM_L1ETHGateway\\n * @dev The L1 ETH Gateway is a contract which stores deposited ETH that is in use on L2.\\n *\\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract OVM_L1ETHGateway is iOVM_L1ETHGateway, OVM_CrossDomainEnabled, Lib_AddressResolver {\\n\\n /********************\\n * Public Constants *\\n ********************/\\n\\n uint32 public constant override getFinalizeDepositL2Gas = 1200000;\\n\\n /********************************\\n * External Contract References *\\n ********************************/\\n\\n address public ovmEth;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n // This contract lives behind a proxy, so the constructor parameters will go unused.\\n constructor()\\n OVM_CrossDomainEnabled(address(0))\\n Lib_AddressResolver(address(0))\\n public\\n {}\\n\\n /******************\\n * Initialization *\\n ******************/\\n\\n /**\\n * @param _libAddressManager Address manager for this OE deployment\\n * @param _ovmEth L2 OVM_ETH implementation of iOVM_DepositedToken\\n */\\n function initialize(\\n address _libAddressManager,\\n address _ovmEth\\n )\\n public\\n {\\n require(libAddressManager == Lib_AddressManager(0), \\\"Contract has already been initialized.\\\");\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n ovmEth = _ovmEth;\\n messenger = resolve(\\\"Proxy__OVM_L1CrossDomainMessenger\\\");\\n }\\n\\n /**************\\n * Depositing *\\n **************/\\n\\n receive()\\n external\\n payable\\n {\\n _initiateDeposit(msg.sender, msg.sender);\\n }\\n\\n /**\\n * @dev deposit an amount of the ETH to the caller's balance on L2\\n */\\n function deposit() \\n external\\n override\\n payable\\n {\\n _initiateDeposit(msg.sender, msg.sender);\\n }\\n\\n /**\\n * @dev deposit an amount of ETH to a recipients's balance on L2\\n * @param _to L2 address to credit the withdrawal to\\n */\\n function depositTo(\\n address _to\\n )\\n external\\n override\\n payable\\n {\\n _initiateDeposit(msg.sender, _to);\\n }\\n\\n /**\\n * @dev Performs the logic for deposits by storing the ETH and informing the L2 ETH Gateway of the deposit.\\n *\\n * @param _from Account to pull the deposit from on L1\\n * @param _to Account to give the deposit to on L2\\n */\\n function _initiateDeposit(\\n address _from,\\n address _to\\n )\\n internal\\n {\\n // Construct calldata for l2ETHGateway.finalizeDeposit(_to, _amount)\\n bytes memory data =\\n abi.encodeWithSelector(\\n iOVM_L2DepositedToken.finalizeDeposit.selector,\\n _to,\\n msg.value\\n );\\n\\n // Send calldata into L2\\n sendCrossDomainMessage(\\n ovmEth,\\n data,\\n getFinalizeDepositL2Gas\\n );\\n\\n emit DepositInitiated(_from, _to, msg.value);\\n }\\n\\n /*************************\\n * Cross-chain Functions *\\n *************************/\\n\\n /**\\n * @dev Complete a withdrawal from L2 to L1, and credit funds to the recipient's balance of the\\n * L1 ETH token.\\n * Since only the xDomainMessenger can call this function, it will never be called before the withdrawal is finalized. \\n *\\n * @param _to L1 address to credit the withdrawal to\\n * @param _amount Amount of the ETH to withdraw\\n */\\n function finalizeWithdrawal(\\n address _to,\\n uint256 _amount\\n )\\n external\\n override\\n onlyFromCrossDomainAccount(ovmEth)\\n {\\n _safeTransferETH(_to, _amount);\\n\\n emit WithdrawalFinalized(_to, _amount);\\n }\\n\\n /**********************************\\n * Internal Functions: Accounting *\\n **********************************/\\n\\n /**\\n * @dev Internal accounting function for moving around L1 ETH.\\n *\\n * @param _to L1 address to transfer ETH to\\n * @param _value Amount of ETH to send to\\n */\\n function _safeTransferETH(\\n address _to,\\n uint256 _value\\n )\\n internal\\n {\\n (bool success, ) = _to.call{value: _value}(new bytes(0));\\n require(success, 'TransferHelper::safeTransferETH: ETH transfer failed');\\n }\\n}\\n\",\"keccak256\":\"0x2fff613bf362d01f05d8653247fe46b07dd7bb21c460a30e471d45b7ebd0e627\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/bridge/messaging/iAbs_BaseCrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/**\\n * @title iAbs_BaseCrossDomainMessenger\\n */\\ninterface iAbs_BaseCrossDomainMessenger {\\n\\n /**********\\n * Events *\\n **********/\\n event SentMessage(bytes message);\\n event RelayedMessage(bytes32 msgHash);\\n\\n /**********************\\n * Contract Variables *\\n **********************/\\n function xDomainMessageSender() external view returns (address);\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sends a cross domain message to the target messenger.\\n * @param _target Target contract address.\\n * @param _message Message to send to the target.\\n * @param _gasLimit Gas limit for the provided message.\\n */\\n function sendMessage(\\n address _target,\\n bytes calldata _message,\\n uint32 _gasLimit\\n ) external;\\n}\\n\",\"keccak256\":\"0xc2bd6b373daae2ede34281f4be5938d02b9d1cfb056b40d65ff70b7f16ce3c86\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/bridge/tokens/iOVM_L1ETHGateway.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0;\\npragma experimental ABIEncoderV2;\\n\\n/**\\n * @title iOVM_L1ETHGateway\\n */\\ninterface iOVM_L1ETHGateway {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event DepositInitiated(\\n address indexed _from,\\n address _to,\\n uint256 _amount\\n );\\n\\n event WithdrawalFinalized(\\n address indexed _to,\\n uint256 _amount\\n );\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function deposit()\\n external\\n payable;\\n\\n function depositTo(\\n address _to\\n )\\n external\\n payable;\\n\\n /*************************\\n * Cross-chain Functions *\\n *************************/\\n\\n function finalizeWithdrawal(\\n address _to,\\n uint _amount\\n )\\n external;\\n\\n function getFinalizeDepositL2Gas()\\n external\\n view\\n returns(\\n uint32\\n );\\n}\\n\",\"keccak256\":\"0x7e6805c5cacfd159410c7cd57a3d586e0fc5810bc46600bbd840a252e243e5ba\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/bridge/tokens/iOVM_L2DepositedToken.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0;\\npragma experimental ABIEncoderV2;\\n\\n/**\\n * @title iOVM_L2DepositedToken\\n */\\ninterface iOVM_L2DepositedToken {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event WithdrawalInitiated(\\n address indexed _from,\\n address _to,\\n uint256 _amount\\n );\\n\\n event DepositFinalized(\\n address indexed _to,\\n uint256 _amount\\n ); \\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function withdraw(\\n uint _amount\\n )\\n external;\\n\\n function withdrawTo(\\n address _to,\\n uint _amount\\n )\\n external;\\n\\n\\n /*************************\\n * Cross-chain Functions *\\n *************************/\\n\\n function finalizeDeposit(\\n address _to,\\n uint _amount\\n )\\n external;\\n}\\n\",\"keccak256\":\"0xaa874355e98c444a58712179acaf5ca344296dfa8229577a38a1d14160ce46f8\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/bridge/OVM_CrossDomainEnabled.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n/* Interface Imports */\\nimport { iAbs_BaseCrossDomainMessenger } from \\\"../../iOVM/bridge/messaging/iAbs_BaseCrossDomainMessenger.sol\\\";\\n\\n/**\\n * @title OVM_CrossDomainEnabled\\n * @dev Helper contract for contracts performing cross-domain communications\\n *\\n * Compiler used: defined by inheriting contract\\n * Runtime target: defined by inheriting contract\\n */\\ncontract OVM_CrossDomainEnabled {\\n // Messenger contract used to send and recieve messages from the other domain.\\n address public messenger;\\n\\n /***************\\n * Constructor *\\n ***************/ \\n constructor(\\n address _messenger\\n ) {\\n messenger = _messenger;\\n }\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n /**\\n * @notice Enforces that the modified function is only callable by a specific cross-domain account.\\n * @param _sourceDomainAccount The only account on the originating domain which is authenticated to call this function.\\n */\\n modifier onlyFromCrossDomainAccount(\\n address _sourceDomainAccount\\n ) {\\n require(\\n msg.sender == address(getCrossDomainMessenger()),\\n \\\"OVM_XCHAIN: messenger contract unauthenticated\\\"\\n );\\n\\n require(\\n getCrossDomainMessenger().xDomainMessageSender() == _sourceDomainAccount,\\n \\\"OVM_XCHAIN: wrong sender of cross-domain message\\\"\\n );\\n\\n _;\\n }\\n \\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * @notice Gets the messenger, usually from storage. This function is exposed in case a child contract needs to override.\\n * @return The address of the cross-domain messenger contract which should be used. \\n */\\n function getCrossDomainMessenger()\\n internal\\n virtual\\n returns(\\n iAbs_BaseCrossDomainMessenger\\n )\\n {\\n return iAbs_BaseCrossDomainMessenger(messenger);\\n }\\n\\n /**\\n * @notice Sends a message to an account on another domain\\n * @param _crossDomainTarget The intended recipient on the destination domain\\n * @param _data The data to send to the target (usually calldata to a function with `onlyFromCrossDomainAccount()`)\\n * @param _gasLimit The gasLimit for the receipt of the message on the target domain.\\n */\\n function sendCrossDomainMessage(\\n address _crossDomainTarget,\\n bytes memory _data,\\n uint32 _gasLimit\\n ) internal {\\n getCrossDomainMessenger().sendMessage(_crossDomainTarget, _data, _gasLimit);\\n }\\n}\\n\",\"keccak256\":\"0x1b1c5adbb359f3f46ca9e43b366a80563c031560e9f1f24ab4742b2d79403ce7\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Contract Imports */\\nimport { Ownable } from \\\"./Lib_Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n /*******************************************\\n * Contract Variables: Internal Accounting *\\n *******************************************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n public\\n onlyOwner\\n {\\n emit AddressSet(_name, _address);\\n addresses[_getNameHash(_name)] = _address;\\n }\\n\\n function getAddress(\\n string memory _name\\n )\\n public\\n view\\n returns (address)\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32 _hash\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0x3a490595cc21ff170e4027843093670ff845d5972481fbfb956b722ea564bb06\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n\\n /*******************************************\\n * Contract Variables: Contract References *\\n *******************************************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(\\n address _libAddressManager\\n ) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function resolve(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address _contract\\n )\\n {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0xaa3ed342f6deb156c660fd83afa579a3b80db17eb465e8949cf5c1b114780143\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Ownable\\n * @dev Adapted from https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol\\n */\\nabstract contract Ownable {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n address public owner;\\n\\n\\n /**********\\n * Events *\\n **********/\\n\\n event OwnershipTransferred(\\n address indexed previousOwner,\\n address indexed newOwner\\n );\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n constructor() {\\n owner = msg.sender;\\n emit OwnershipTransferred(address(0), owner);\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n owner == msg.sender,\\n \\\"Ownable: caller is not the owner\\\"\\n );\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function renounceOwnership()\\n public\\n virtual\\n onlyOwner\\n {\\n emit OwnershipTransferred(owner, address(0));\\n owner = address(0);\\n }\\n\\n function transferOwnership(address _newOwner)\\n public\\n virtual\\n onlyOwner\\n {\\n require(\\n _newOwner != address(0),\\n \\\"Ownable: new owner cannot be the zero address\\\"\\n );\\n\\n emit OwnershipTransferred(owner, _newOwner);\\n owner = _newOwner;\\n }\\n}\\n\",\"keccak256\":\"0xd9dfd9264e5b5fedd53a5b10fdf179c3f367614b0fe69179bce4e45119f5b739\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x608060405234801561001057600080fd5b50600080546001600160a01b03199081169091556001805490911690556109d28061003c6000396000f3fe60806040526004361061008a5760003560e01c8063485cc95511610059578063485cc95514610122578063490b5b7814610142578063b760faf914610157578063d0e30db01461016a578063f4f7b41a146101725761009b565b80631273a090146100a0578063299ca478146100cb5780633cb747bf146100ed578063461a4478146101025761009b565b3661009b576100993333610192565b005b600080fd5b3480156100ac57600080fd5b506100b5610246565b6040516100c29190610935565b60405180910390f35b3480156100d757600080fd5b506100e061024d565b6040516100c29190610865565b3480156100f957600080fd5b506100e061025c565b34801561010e57600080fd5b506100e061011d366004610797565b61026b565b34801561012e57600080fd5b5061009961013d36600461073c565b610347565b34801561014e57600080fd5b506100e06103ef565b61009961016536600461071b565b6103fe565b61009961040b565b34801561017e57600080fd5b5061009961018d36600461076e565b610417565b6000638d6e9a5b60e01b82346040516024016101af929190610879565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526002549091506101fe906001600160a01b03168262124f80610578565b826001600160a01b03167ff531653a5819e21265de50358610d55dbe6594c61605b209dfa4280d277938c18334604051610239929190610879565b60405180910390a2505050565b62124f8081565b6001546001600160a01b031681565b6000546001600160a01b031681565b60015460405163bf40fac160e01b81526020600482018181528451602484015284516000946001600160a01b03169363bf40fac1938793928392604401918501908083838b5b838110156102c95781810151838201526020016102b1565b50505050905090810190601f1680156102f65780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561031357600080fd5b505afa158015610327573d6000803e3d6000fd5b505050506040513d602081101561033d57600080fd5b505190505b919050565b6001546001600160a01b0316156103795760405162461bcd60e51b8152600401610370906108e6565b60405180910390fd5b600180546001600160a01b038085166001600160a01b0319928316179092556002805492841692909116919091179055604080516060810190915260218082526103cb91906109a5602083013961026b565b600080546001600160a01b0319166001600160a01b03929092169190911790555050565b6002546001600160a01b031681565b6104083382610192565b50565b6104153333610192565b565b6002546001600160a01b031661042b610663565b6001600160a01b0316336001600160a01b03161461047a5760405162461bcd60e51b815260040180806020018281038252602e815260200180610947602e913960400191505060405180910390fd5b806001600160a01b031661048c610663565b6001600160a01b0316636e296e456040518163ffffffff1660e01b815260040160206040518083038186803b1580156104c457600080fd5b505afa1580156104d8573d6000803e3d6000fd5b505050506040513d60208110156104ee57600080fd5b50516001600160a01b0316146105355760405162461bcd60e51b81526004018080602001828103825260308152602001806109756030913960400191505060405180910390fd5b61053f8383610672565b826001600160a01b03167f9e5c4f9f4e46b8629d3dda85f43a69194f50254404a72dc62b9e932d9c94eda883604051610239919061092c565b610580610663565b6001600160a01b0316633dbb202b8484846040518463ffffffff1660e01b815260040180846001600160a01b03168152602001806020018363ffffffff168152602001828103825284818151815260200191508051906020019080838360005b838110156105f85781810151838201526020016105e0565b50505050905090810190601f1680156106255780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b15801561064657600080fd5b505af115801561065a573d6000803e3d6000fd5b50505050505050565b6000546001600160a01b031690565b604080516000808252602082019092526001600160a01b03841690839060405161069c919061082c565b60006040518083038185875af1925050503d80600081146106d9576040519150601f19603f3d011682016040523d82523d6000602084013e6106de565b606091505b50509050806106ff5760405162461bcd60e51b815260040161037090610892565b505050565b80356001600160a01b038116811461034257600080fd5b60006020828403121561072c578081fd5b61073582610704565b9392505050565b6000806040838503121561074e578081fd5b61075783610704565b915061076560208401610704565b90509250929050565b60008060408385031215610780578182fd5b61078983610704565b946020939093013593505050565b600060208083850312156107a9578182fd5b823567ffffffffffffffff808211156107c0578384fd5b818501915085601f8301126107d3578384fd5b8135818111156107df57fe5b604051601f8201601f19168101850183811182821017156107fc57fe5b6040528181528382018501881015610812578586fd5b818585018683013790810190930193909352509392505050565b60008251815b8181101561084c5760208186018101518583015201610832565b8181111561085a5782828501525b509190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b60208082526034908201527f5472616e7366657248656c7065723a3a736166655472616e736665724554483a60408201527308115512081d1c985b9cd9995c8819985a5b195960621b606082015260800190565b60208082526026908201527f436f6e74726163742068617320616c7265616479206265656e20696e697469616040820152653634bd32b21760d11b606082015260800190565b90815260200190565b63ffffffff9190911681526020019056fe4f564d5f58434841494e3a206d657373656e67657220636f6e747261637420756e61757468656e746963617465644f564d5f58434841494e3a2077726f6e672073656e646572206f662063726f73732d646f6d61696e206d65737361676550726f78795f5f4f564d5f4c3143726f7373446f6d61696e4d657373656e676572a164736f6c6343000706000a", - "deployedBytecode": "0x60806040526004361061008a5760003560e01c8063485cc95511610059578063485cc95514610122578063490b5b7814610142578063b760faf914610157578063d0e30db01461016a578063f4f7b41a146101725761009b565b80631273a090146100a0578063299ca478146100cb5780633cb747bf146100ed578063461a4478146101025761009b565b3661009b576100993333610192565b005b600080fd5b3480156100ac57600080fd5b506100b5610246565b6040516100c29190610935565b60405180910390f35b3480156100d757600080fd5b506100e061024d565b6040516100c29190610865565b3480156100f957600080fd5b506100e061025c565b34801561010e57600080fd5b506100e061011d366004610797565b61026b565b34801561012e57600080fd5b5061009961013d36600461073c565b610347565b34801561014e57600080fd5b506100e06103ef565b61009961016536600461071b565b6103fe565b61009961040b565b34801561017e57600080fd5b5061009961018d36600461076e565b610417565b6000638d6e9a5b60e01b82346040516024016101af929190610879565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526002549091506101fe906001600160a01b03168262124f80610578565b826001600160a01b03167ff531653a5819e21265de50358610d55dbe6594c61605b209dfa4280d277938c18334604051610239929190610879565b60405180910390a2505050565b62124f8081565b6001546001600160a01b031681565b6000546001600160a01b031681565b60015460405163bf40fac160e01b81526020600482018181528451602484015284516000946001600160a01b03169363bf40fac1938793928392604401918501908083838b5b838110156102c95781810151838201526020016102b1565b50505050905090810190601f1680156102f65780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561031357600080fd5b505afa158015610327573d6000803e3d6000fd5b505050506040513d602081101561033d57600080fd5b505190505b919050565b6001546001600160a01b0316156103795760405162461bcd60e51b8152600401610370906108e6565b60405180910390fd5b600180546001600160a01b038085166001600160a01b0319928316179092556002805492841692909116919091179055604080516060810190915260218082526103cb91906109a5602083013961026b565b600080546001600160a01b0319166001600160a01b03929092169190911790555050565b6002546001600160a01b031681565b6104083382610192565b50565b6104153333610192565b565b6002546001600160a01b031661042b610663565b6001600160a01b0316336001600160a01b03161461047a5760405162461bcd60e51b815260040180806020018281038252602e815260200180610947602e913960400191505060405180910390fd5b806001600160a01b031661048c610663565b6001600160a01b0316636e296e456040518163ffffffff1660e01b815260040160206040518083038186803b1580156104c457600080fd5b505afa1580156104d8573d6000803e3d6000fd5b505050506040513d60208110156104ee57600080fd5b50516001600160a01b0316146105355760405162461bcd60e51b81526004018080602001828103825260308152602001806109756030913960400191505060405180910390fd5b61053f8383610672565b826001600160a01b03167f9e5c4f9f4e46b8629d3dda85f43a69194f50254404a72dc62b9e932d9c94eda883604051610239919061092c565b610580610663565b6001600160a01b0316633dbb202b8484846040518463ffffffff1660e01b815260040180846001600160a01b03168152602001806020018363ffffffff168152602001828103825284818151815260200191508051906020019080838360005b838110156105f85781810151838201526020016105e0565b50505050905090810190601f1680156106255780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b15801561064657600080fd5b505af115801561065a573d6000803e3d6000fd5b50505050505050565b6000546001600160a01b031690565b604080516000808252602082019092526001600160a01b03841690839060405161069c919061082c565b60006040518083038185875af1925050503d80600081146106d9576040519150601f19603f3d011682016040523d82523d6000602084013e6106de565b606091505b50509050806106ff5760405162461bcd60e51b815260040161037090610892565b505050565b80356001600160a01b038116811461034257600080fd5b60006020828403121561072c578081fd5b61073582610704565b9392505050565b6000806040838503121561074e578081fd5b61075783610704565b915061076560208401610704565b90509250929050565b60008060408385031215610780578182fd5b61078983610704565b946020939093013593505050565b600060208083850312156107a9578182fd5b823567ffffffffffffffff808211156107c0578384fd5b818501915085601f8301126107d3578384fd5b8135818111156107df57fe5b604051601f8201601f19168101850183811182821017156107fc57fe5b6040528181528382018501881015610812578586fd5b818585018683013790810190930193909352509392505050565b60008251815b8181101561084c5760208186018101518583015201610832565b8181111561085a5782828501525b509190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b60208082526034908201527f5472616e7366657248656c7065723a3a736166655472616e736665724554483a60408201527308115512081d1c985b9cd9995c8819985a5b195960621b606082015260800190565b60208082526026908201527f436f6e74726163742068617320616c7265616479206265656e20696e697469616040820152653634bd32b21760d11b606082015260800190565b90815260200190565b63ffffffff9190911681526020019056fe4f564d5f58434841494e3a206d657373656e67657220636f6e747261637420756e61757468656e746963617465644f564d5f58434841494e3a2077726f6e672073656e646572206f662063726f73732d646f6d61696e206d65737361676550726f78795f5f4f564d5f4c3143726f7373446f6d61696e4d657373656e676572a164736f6c6343000706000a", + "solcInputHash": "f2bdab652d5102f5f11e78dae866798d", + "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"DepositInitiated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"WithdrawalFinalized\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"deposit\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"}],\"name\":\"depositTo\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"donateETH\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"finalizeWithdrawal\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getFinalizeDepositL2Gas\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_ovmEth\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"messenger\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable\",\"name\":\"_to\",\"type\":\"address\"}],\"name\":\"migrateEth\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ovmEth\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"details\":\"The L1 ETH Gateway is a contract which stores deposited ETH that is in use on L2. Compiler used: solc Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"deposit()\":{\"details\":\"deposit an amount of the ETH to the caller's balance on L2\"},\"depositTo(address)\":{\"details\":\"deposit an amount of ETH to a recipients's balance on L2\",\"params\":{\"_to\":\"L2 address to credit the withdrawal to\"}},\"donateETH()\":{\"details\":\"Adds ETH balance to the account. This is meant to allow for ETH to be migrated from an old gateway to a new gateway\"},\"finalizeWithdrawal(address,uint256)\":{\"details\":\"Complete a withdrawal from L2 to L1, and credit funds to the recipient's balance of the L1 ETH token. Since only the xDomainMessenger can call this function, it will never be called before the withdrawal is finalized.\",\"params\":{\"_amount\":\"Amount of the ETH to withdraw\",\"_to\":\"L1 address to credit the withdrawal to\"}},\"initialize(address,address)\":{\"params\":{\"_libAddressManager\":\"Address manager for this OE deployment\",\"_ovmEth\":\"L2 OVM_ETH implementation of iOVM_DepositedToken\"}},\"migrateEth(address)\":{\"details\":\"Migrates entire ETH balance to another gateway\",\"params\":{\"_to\":\"Gateway Proxy address to migrate ETH to\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}}},\"title\":\"OVM_L1ETHGateway\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/OVM/bridge/tokens/OVM_L1ETHGateway.sol\":\"OVM_L1ETHGateway\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor () internal {\\n address msgSender = _msgSender();\\n _owner = msgSender;\\n emit OwnershipTransferred(address(0), msgSender);\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n emit OwnershipTransferred(_owner, address(0));\\n _owner = address(0);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n emit OwnershipTransferred(_owner, newOwner);\\n _owner = newOwner;\\n }\\n}\\n\",\"keccak256\":\"0x15e2d5bd4c28a88548074c54d220e8086f638a71ed07e6b3ba5a70066fcf458d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with GSN meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address payable) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes memory) {\\n this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x8d3cb350f04ff49cfb10aef08d87f19dcbaecc8027b0bed12f3275cd12f38cf0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/bridge/tokens/OVM_L1ETHGateway.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// @unsupported: ovm\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Interface Imports */\\nimport { iOVM_L1ETHGateway } from \\\"../../../iOVM/bridge/tokens/iOVM_L1ETHGateway.sol\\\";\\nimport { iOVM_L2DepositedToken } from \\\"../../../iOVM/bridge/tokens/iOVM_L2DepositedToken.sol\\\";\\n\\n/* Library Imports */\\nimport { OVM_CrossDomainEnabled } from \\\"../../../libraries/bridge/OVM_CrossDomainEnabled.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../../libraries/resolver/Lib_AddressResolver.sol\\\";\\nimport { Lib_AddressManager } from \\\"../../../libraries/resolver/Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title OVM_L1ETHGateway\\n * @dev The L1 ETH Gateway is a contract which stores deposited ETH that is in use on L2.\\n *\\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract OVM_L1ETHGateway is iOVM_L1ETHGateway, OVM_CrossDomainEnabled, Lib_AddressResolver {\\n\\n /********************\\n * Public Constants *\\n ********************/\\n\\n uint32 public constant override getFinalizeDepositL2Gas = 1200000;\\n\\n /********************************\\n * External Contract References *\\n ********************************/\\n\\n address public ovmEth;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n // This contract lives behind a proxy, so the constructor parameters will go unused.\\n constructor()\\n OVM_CrossDomainEnabled(address(0))\\n Lib_AddressResolver(address(0))\\n public\\n {}\\n\\n /******************\\n * Initialization *\\n ******************/\\n\\n /**\\n * @param _libAddressManager Address manager for this OE deployment\\n * @param _ovmEth L2 OVM_ETH implementation of iOVM_DepositedToken\\n */\\n function initialize(\\n address _libAddressManager,\\n address _ovmEth\\n )\\n public\\n {\\n require(libAddressManager == Lib_AddressManager(0), \\\"Contract has already been initialized.\\\");\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n ovmEth = _ovmEth;\\n messenger = resolve(\\\"Proxy__OVM_L1CrossDomainMessenger\\\");\\n }\\n\\n /**************\\n * Depositing *\\n **************/\\n\\n receive()\\n external\\n payable\\n {\\n _initiateDeposit(msg.sender, msg.sender);\\n }\\n\\n /**\\n * @dev deposit an amount of the ETH to the caller's balance on L2\\n */\\n function deposit()\\n external\\n override\\n payable\\n {\\n _initiateDeposit(msg.sender, msg.sender);\\n }\\n\\n /**\\n * @dev deposit an amount of ETH to a recipients's balance on L2\\n * @param _to L2 address to credit the withdrawal to\\n */\\n function depositTo(\\n address _to\\n )\\n external\\n override\\n payable\\n {\\n _initiateDeposit(msg.sender, _to);\\n }\\n\\n /**\\n * @dev Performs the logic for deposits by storing the ETH and informing the L2 ETH Gateway of the deposit.\\n *\\n * @param _from Account to pull the deposit from on L1\\n * @param _to Account to give the deposit to on L2\\n */\\n function _initiateDeposit(\\n address _from,\\n address _to\\n )\\n internal\\n {\\n // Construct calldata for l2ETHGateway.finalizeDeposit(_to, _amount)\\n bytes memory data =\\n abi.encodeWithSelector(\\n iOVM_L2DepositedToken.finalizeDeposit.selector,\\n _to,\\n msg.value\\n );\\n\\n // Send calldata into L2\\n sendCrossDomainMessage(\\n ovmEth,\\n data,\\n getFinalizeDepositL2Gas\\n );\\n\\n emit DepositInitiated(_from, _to, msg.value);\\n }\\n\\n /*************************\\n * Cross-chain Functions *\\n *************************/\\n\\n /**\\n * @dev Complete a withdrawal from L2 to L1, and credit funds to the recipient's balance of the\\n * L1 ETH token.\\n * Since only the xDomainMessenger can call this function, it will never be called before the withdrawal is finalized.\\n *\\n * @param _to L1 address to credit the withdrawal to\\n * @param _amount Amount of the ETH to withdraw\\n */\\n function finalizeWithdrawal(\\n address _to,\\n uint256 _amount\\n )\\n external\\n override\\n onlyFromCrossDomainAccount(ovmEth)\\n {\\n _safeTransferETH(_to, _amount);\\n\\n emit WithdrawalFinalized(_to, _amount);\\n }\\n\\n /**********************************\\n * Internal Functions: Accounting *\\n **********************************/\\n\\n /**\\n * @dev Internal accounting function for moving around L1 ETH.\\n *\\n * @param _to L1 address to transfer ETH to\\n * @param _value Amount of ETH to send to\\n */\\n function _safeTransferETH(\\n address _to,\\n uint256 _value\\n )\\n internal\\n {\\n (bool success, ) = _to.call{value: _value}(new bytes(0));\\n require(success, 'TransferHelper::safeTransferETH: ETH transfer failed');\\n }\\n\\n /*****************************\\n * Temporary - Migrating ETH *\\n *****************************/\\n\\n /**\\n * @dev Migrates entire ETH balance to another gateway\\n * @param _to Gateway Proxy address to migrate ETH to\\n */\\n function migrateEth(address payable _to) external {\\n address owner = Lib_AddressManager(libAddressManager).owner();\\n require(msg.sender == owner, \\\"Only the owner can migrate ETH\\\");\\n uint256 balance = address(this).balance;\\n OVM_L1ETHGateway(_to).donateETH{value:balance}();\\n }\\n\\n /**\\n * @dev Adds ETH balance to the account. This is meant to allow for ETH\\n * to be migrated from an old gateway to a new gateway\\n */\\n function donateETH() external payable {}\\n}\\n\",\"keccak256\":\"0x87dd8c00176be3bde93cb69d7a1af0b2e7cac0a6db72eb69353a1ac1e0c969be\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/bridge/messaging/iAbs_BaseCrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/**\\n * @title iAbs_BaseCrossDomainMessenger\\n */\\ninterface iAbs_BaseCrossDomainMessenger {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event SentMessage(bytes message);\\n event RelayedMessage(bytes32 msgHash);\\n event FailedRelayedMessage(bytes32 msgHash);\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n function xDomainMessageSender() external view returns (address);\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sends a cross domain message to the target messenger.\\n * @param _target Target contract address.\\n * @param _message Message to send to the target.\\n * @param _gasLimit Gas limit for the provided message.\\n */\\n function sendMessage(\\n address _target,\\n bytes calldata _message,\\n uint32 _gasLimit\\n ) external;\\n}\\n\",\"keccak256\":\"0x89981ed48e99d6939cc6cdef827d484fa3e2292d66c0ba5056c7050cb6282d7e\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/bridge/tokens/iOVM_L1ETHGateway.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0;\\npragma experimental ABIEncoderV2;\\n\\n/**\\n * @title iOVM_L1ETHGateway\\n */\\ninterface iOVM_L1ETHGateway {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event DepositInitiated(\\n address indexed _from,\\n address _to,\\n uint256 _amount\\n );\\n\\n event WithdrawalFinalized(\\n address indexed _to,\\n uint256 _amount\\n );\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function deposit()\\n external\\n payable;\\n\\n function depositTo(\\n address _to\\n )\\n external\\n payable;\\n\\n /*************************\\n * Cross-chain Functions *\\n *************************/\\n\\n function finalizeWithdrawal(\\n address _to,\\n uint _amount\\n )\\n external;\\n\\n function getFinalizeDepositL2Gas()\\n external\\n view\\n returns(\\n uint32\\n );\\n}\\n\",\"keccak256\":\"0x7e6805c5cacfd159410c7cd57a3d586e0fc5810bc46600bbd840a252e243e5ba\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/bridge/tokens/iOVM_L2DepositedToken.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0;\\npragma experimental ABIEncoderV2;\\n\\n/**\\n * @title iOVM_L2DepositedToken\\n */\\ninterface iOVM_L2DepositedToken {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event WithdrawalInitiated(\\n address indexed _from,\\n address _to,\\n uint256 _amount\\n );\\n\\n event DepositFinalized(\\n address indexed _to,\\n uint256 _amount\\n );\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function withdraw(\\n uint _amount\\n )\\n external;\\n\\n function withdrawTo(\\n address _to,\\n uint _amount\\n )\\n external;\\n\\n\\n /*************************\\n * Cross-chain Functions *\\n *************************/\\n\\n function finalizeDeposit(\\n address _to,\\n uint _amount\\n )\\n external;\\n}\\n\",\"keccak256\":\"0x59c807dfb01dbc00409431820457c350681af30d2f972a065231483a8ec926c4\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/bridge/OVM_CrossDomainEnabled.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Interface Imports */\\nimport { iAbs_BaseCrossDomainMessenger } from \\\"../../iOVM/bridge/messaging/iAbs_BaseCrossDomainMessenger.sol\\\";\\n\\n/**\\n * @title OVM_CrossDomainEnabled\\n * @dev Helper contract for contracts performing cross-domain communications\\n *\\n * Compiler used: defined by inheriting contract\\n * Runtime target: defined by inheriting contract\\n */\\ncontract OVM_CrossDomainEnabled {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n // Messenger contract used to send and recieve messages from the other domain.\\n address public messenger;\\n\\n\\n /***************\\n * Constructor *\\n ***************/ \\n\\n /**\\n * @param _messenger Address of the CrossDomainMessenger on the current layer.\\n */\\n constructor(\\n address _messenger\\n ) {\\n messenger = _messenger;\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n /**\\n * Enforces that the modified function is only callable by a specific cross-domain account.\\n * @param _sourceDomainAccount The only account on the originating domain which is\\n * authenticated to call this function.\\n */\\n modifier onlyFromCrossDomainAccount(\\n address _sourceDomainAccount\\n ) {\\n require(\\n msg.sender == address(getCrossDomainMessenger()),\\n \\\"OVM_XCHAIN: messenger contract unauthenticated\\\"\\n );\\n\\n require(\\n getCrossDomainMessenger().xDomainMessageSender() == _sourceDomainAccount,\\n \\\"OVM_XCHAIN: wrong sender of cross-domain message\\\"\\n );\\n\\n _;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Gets the messenger, usually from storage. This function is exposed in case a child contract\\n * needs to override.\\n * @return The address of the cross-domain messenger contract which should be used. \\n */\\n function getCrossDomainMessenger()\\n internal\\n virtual\\n returns (\\n iAbs_BaseCrossDomainMessenger\\n )\\n {\\n return iAbs_BaseCrossDomainMessenger(messenger);\\n }\\n\\n /**\\n * Sends a message to an account on another domain\\n * @param _crossDomainTarget The intended recipient on the destination domain\\n * @param _data The data to send to the target (usually calldata to a function with\\n * `onlyFromCrossDomainAccount()`)\\n * @param _gasLimit The gasLimit for the receipt of the message on the target domain.\\n */\\n function sendCrossDomainMessage(\\n address _crossDomainTarget,\\n bytes memory _data,\\n uint32 _gasLimit\\n )\\n internal\\n {\\n getCrossDomainMessenger().sendMessage(_crossDomainTarget, _data, _gasLimit);\\n }\\n}\\n\",\"keccak256\":\"0x054c802a5c1318566b7727ff5327a1ad4dc0f18038a4586b7ada467cc6b08761\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n external\\n onlyOwner\\n {\\n addresses[_getNameHash(_name)] = _address;\\n\\n emit AddressSet(\\n _name,\\n _address\\n );\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(\\n string memory _name\\n )\\n external\\n view\\n returns (\\n address\\n )\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xcc9fc5c64f1101a5c6c397594086b1608189a9edc5c9635e1ac38f70aeeeecbf\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(\\n address _libAddressManager\\n ) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x65981feeabff6a81783ea97d44baf988a18a86c8cb374c46fdb71819cbacc7c0\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x608060405234801561001057600080fd5b50600080546001600160a01b0319908116909155600180549091169055610b978061003c6000396000f3fe6080604052600436106100a05760003560e01c8063485cc95511610064578063485cc95514610158578063490b5b78146101785780638b4c40b01461018d578063b760faf914610195578063d0e30db0146101a8578063f4f7b41a146101b0576100b1565b80631273a090146100b6578063175dc507146100e1578063299ca478146101015780633cb747bf14610123578063461a447814610138576100b1565b366100b1576100af33336101d0565b005b600080fd5b3480156100c257600080fd5b506100cb610284565b6040516100d89190610abc565b60405180910390f35b3480156100ed57600080fd5b506100af6100fc366004610845565b61028b565b34801561010d57600080fd5b50610116610399565b6040516100d891906109b5565b34801561012f57600080fd5b506101166103a8565b34801561014457600080fd5b506101166101533660046108e7565b6103b7565b34801561016457600080fd5b506100af610173366004610884565b610491565b34801561018457600080fd5b50610116610530565b6100af61053f565b6100af6101a3366004610845565b610541565b6100af61054e565b3480156101bc57600080fd5b506100af6101cb3660046108bc565b610558565b6000638d6e9a5b60e01b82346040516024016101ed9291906109c9565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915260025490915061023c906001600160a01b03168262124f806106b9565b826001600160a01b03167ff531653a5819e21265de50358610d55dbe6594c61605b209dfa4280d277938c183346040516102779291906109c9565b60405180910390a2505050565b62124f8081565b60015460408051638da5cb5b60e01b815290516000926001600160a01b031691638da5cb5b916004808301926020929190829003018186803b1580156102d057600080fd5b505afa1580156102e4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103089190610868565b9050336001600160a01b0382161461033b5760405162461bcd60e51b8152600401610332906109e2565b60405180910390fd5b6000479050826001600160a01b0316638b4c40b0826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561037b57600080fd5b505af115801561038f573d6000803e3d6000fd5b5050505050505050565b6001546001600160a01b031681565b6000546001600160a01b031681565b60015460405163bf40fac160e01b81526020600482018181528451602484015284516000946001600160a01b03169363bf40fac1938793928392604401918501908083838b5b838110156104155781810151838201526020016103fd565b50505050905090810190601f1680156104425780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561045f57600080fd5b505afa158015610473573d6000803e3d6000fd5b505050506040513d602081101561048957600080fd5b505192915050565b6001546001600160a01b0316156104ba5760405162461bcd60e51b815260040161033290610a6d565b600180546001600160a01b038085166001600160a01b03199283161790925560028054928416929091169190911790556040805160608101909152602180825261050c9190610b4160208301396103b7565b600080546001600160a01b0319166001600160a01b03929092169190911790555050565b6002546001600160a01b031681565b565b61054b33826101d0565b50565b61053f33336101d0565b6002546001600160a01b031661056c6107a4565b6001600160a01b0316336001600160a01b0316146105bb5760405162461bcd60e51b815260040180806020018281038252602e815260200180610ae3602e913960400191505060405180910390fd5b806001600160a01b03166105cd6107a4565b6001600160a01b0316636e296e456040518163ffffffff1660e01b815260040160206040518083038186803b15801561060557600080fd5b505afa158015610619573d6000803e3d6000fd5b505050506040513d602081101561062f57600080fd5b50516001600160a01b0316146106765760405162461bcd60e51b8152600401808060200182810382526030815260200180610b116030913960400191505060405180910390fd5b61068083836107b3565b826001600160a01b03167f9e5c4f9f4e46b8629d3dda85f43a69194f50254404a72dc62b9e932d9c94eda8836040516102779190610ab3565b6106c16107a4565b6001600160a01b0316633dbb202b8484846040518463ffffffff1660e01b815260040180846001600160a01b03168152602001806020018363ffffffff168152602001828103825284818151815260200191508051906020019080838360005b83811015610739578181015183820152602001610721565b50505050905090810190601f1680156107665780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b15801561078757600080fd5b505af115801561079b573d6000803e3d6000fd5b50505050505050565b6000546001600160a01b031690565b604080516000808252602082019092526001600160a01b0384169083906040516107dd919061097c565b60006040518083038185875af1925050503d806000811461081a576040519150601f19603f3d011682016040523d82523d6000602084013e61081f565b606091505b50509050806108405760405162461bcd60e51b815260040161033290610a19565b505050565b600060208284031215610856578081fd5b813561086181610acd565b9392505050565b600060208284031215610879578081fd5b815161086181610acd565b60008060408385031215610896578081fd5b82356108a181610acd565b915060208301356108b181610acd565b809150509250929050565b600080604083850312156108ce578182fd5b82356108d981610acd565b946020939093013593505050565b600060208083850312156108f9578182fd5b823567ffffffffffffffff80821115610910578384fd5b818501915085601f830112610923578384fd5b81358181111561092f57fe5b604051601f8201601f191681018501838111828210171561094c57fe5b6040528181528382018501881015610962578586fd5b818585018683013790810190930193909352509392505050565b60008251815b8181101561099c5760208186018101518583015201610982565b818111156109aa5782828501525b509190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6020808252601e908201527f4f6e6c7920746865206f776e65722063616e206d696772617465204554480000604082015260600190565b60208082526034908201527f5472616e7366657248656c7065723a3a736166655472616e736665724554483a60408201527308115512081d1c985b9cd9995c8819985a5b195960621b606082015260800190565b60208082526026908201527f436f6e74726163742068617320616c7265616479206265656e20696e697469616040820152653634bd32b21760d11b606082015260800190565b90815260200190565b63ffffffff91909116815260200190565b6001600160a01b038116811461054b57600080fdfe4f564d5f58434841494e3a206d657373656e67657220636f6e747261637420756e61757468656e746963617465644f564d5f58434841494e3a2077726f6e672073656e646572206f662063726f73732d646f6d61696e206d65737361676550726f78795f5f4f564d5f4c3143726f7373446f6d61696e4d657373656e676572a26469706673582212206941c23a3d320250801ba2fad4fc6bf0aa38a77f09cc5358b9733f6cce18c7a264736f6c63430007060033", + "deployedBytecode": "0x6080604052600436106100a05760003560e01c8063485cc95511610064578063485cc95514610158578063490b5b78146101785780638b4c40b01461018d578063b760faf914610195578063d0e30db0146101a8578063f4f7b41a146101b0576100b1565b80631273a090146100b6578063175dc507146100e1578063299ca478146101015780633cb747bf14610123578063461a447814610138576100b1565b366100b1576100af33336101d0565b005b600080fd5b3480156100c257600080fd5b506100cb610284565b6040516100d89190610abc565b60405180910390f35b3480156100ed57600080fd5b506100af6100fc366004610845565b61028b565b34801561010d57600080fd5b50610116610399565b6040516100d891906109b5565b34801561012f57600080fd5b506101166103a8565b34801561014457600080fd5b506101166101533660046108e7565b6103b7565b34801561016457600080fd5b506100af610173366004610884565b610491565b34801561018457600080fd5b50610116610530565b6100af61053f565b6100af6101a3366004610845565b610541565b6100af61054e565b3480156101bc57600080fd5b506100af6101cb3660046108bc565b610558565b6000638d6e9a5b60e01b82346040516024016101ed9291906109c9565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915260025490915061023c906001600160a01b03168262124f806106b9565b826001600160a01b03167ff531653a5819e21265de50358610d55dbe6594c61605b209dfa4280d277938c183346040516102779291906109c9565b60405180910390a2505050565b62124f8081565b60015460408051638da5cb5b60e01b815290516000926001600160a01b031691638da5cb5b916004808301926020929190829003018186803b1580156102d057600080fd5b505afa1580156102e4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103089190610868565b9050336001600160a01b0382161461033b5760405162461bcd60e51b8152600401610332906109e2565b60405180910390fd5b6000479050826001600160a01b0316638b4c40b0826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561037b57600080fd5b505af115801561038f573d6000803e3d6000fd5b5050505050505050565b6001546001600160a01b031681565b6000546001600160a01b031681565b60015460405163bf40fac160e01b81526020600482018181528451602484015284516000946001600160a01b03169363bf40fac1938793928392604401918501908083838b5b838110156104155781810151838201526020016103fd565b50505050905090810190601f1680156104425780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561045f57600080fd5b505afa158015610473573d6000803e3d6000fd5b505050506040513d602081101561048957600080fd5b505192915050565b6001546001600160a01b0316156104ba5760405162461bcd60e51b815260040161033290610a6d565b600180546001600160a01b038085166001600160a01b03199283161790925560028054928416929091169190911790556040805160608101909152602180825261050c9190610b4160208301396103b7565b600080546001600160a01b0319166001600160a01b03929092169190911790555050565b6002546001600160a01b031681565b565b61054b33826101d0565b50565b61053f33336101d0565b6002546001600160a01b031661056c6107a4565b6001600160a01b0316336001600160a01b0316146105bb5760405162461bcd60e51b815260040180806020018281038252602e815260200180610ae3602e913960400191505060405180910390fd5b806001600160a01b03166105cd6107a4565b6001600160a01b0316636e296e456040518163ffffffff1660e01b815260040160206040518083038186803b15801561060557600080fd5b505afa158015610619573d6000803e3d6000fd5b505050506040513d602081101561062f57600080fd5b50516001600160a01b0316146106765760405162461bcd60e51b8152600401808060200182810382526030815260200180610b116030913960400191505060405180910390fd5b61068083836107b3565b826001600160a01b03167f9e5c4f9f4e46b8629d3dda85f43a69194f50254404a72dc62b9e932d9c94eda8836040516102779190610ab3565b6106c16107a4565b6001600160a01b0316633dbb202b8484846040518463ffffffff1660e01b815260040180846001600160a01b03168152602001806020018363ffffffff168152602001828103825284818151815260200191508051906020019080838360005b83811015610739578181015183820152602001610721565b50505050905090810190601f1680156107665780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b15801561078757600080fd5b505af115801561079b573d6000803e3d6000fd5b50505050505050565b6000546001600160a01b031690565b604080516000808252602082019092526001600160a01b0384169083906040516107dd919061097c565b60006040518083038185875af1925050503d806000811461081a576040519150601f19603f3d011682016040523d82523d6000602084013e61081f565b606091505b50509050806108405760405162461bcd60e51b815260040161033290610a19565b505050565b600060208284031215610856578081fd5b813561086181610acd565b9392505050565b600060208284031215610879578081fd5b815161086181610acd565b60008060408385031215610896578081fd5b82356108a181610acd565b915060208301356108b181610acd565b809150509250929050565b600080604083850312156108ce578182fd5b82356108d981610acd565b946020939093013593505050565b600060208083850312156108f9578182fd5b823567ffffffffffffffff80821115610910578384fd5b818501915085601f830112610923578384fd5b81358181111561092f57fe5b604051601f8201601f191681018501838111828210171561094c57fe5b6040528181528382018501881015610962578586fd5b818585018683013790810190930193909352509392505050565b60008251815b8181101561099c5760208186018101518583015201610982565b818111156109aa5782828501525b509190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6020808252601e908201527f4f6e6c7920746865206f776e65722063616e206d696772617465204554480000604082015260600190565b60208082526034908201527f5472616e7366657248656c7065723a3a736166655472616e736665724554483a60408201527308115512081d1c985b9cd9995c8819985a5b195960621b606082015260800190565b60208082526026908201527f436f6e74726163742068617320616c7265616479206265656e20696e697469616040820152653634bd32b21760d11b606082015260800190565b90815260200190565b63ffffffff91909116815260200190565b6001600160a01b038116811461054b57600080fdfe4f564d5f58434841494e3a206d657373656e67657220636f6e747261637420756e61757468656e746963617465644f564d5f58434841494e3a2077726f6e672073656e646572206f662063726f73732d646f6d61696e206d65737361676550726f78795f5f4f564d5f4c3143726f7373446f6d61696e4d657373656e676572a26469706673582212206941c23a3d320250801ba2fad4fc6bf0aa38a77f09cc5358b9733f6cce18c7a264736f6c63430007060033", "devdoc": { "details": "The L1 ETH Gateway is a contract which stores deposited ETH that is in use on L2. Compiler used: solc Runtime target: EVM", "kind": "dev", @@ -216,8 +236,11 @@ "_to": "L2 address to credit the withdrawal to" } }, + "donateETH()": { + "details": "Adds ETH balance to the account. This is meant to allow for ETH to be migrated from an old gateway to a new gateway" + }, "finalizeWithdrawal(address,uint256)": { - "details": "Complete a withdrawal from L2 to L1, and credit funds to the recipient's balance of the L1 ETH token. Since only the xDomainMessenger can call this function, it will never be called before the withdrawal is finalized. ", + "details": "Complete a withdrawal from L2 to L1, and credit funds to the recipient's balance of the L1 ETH token. Since only the xDomainMessenger can call this function, it will never be called before the withdrawal is finalized.", "params": { "_amount": "Amount of the ETH to withdraw", "_to": "L1 address to credit the withdrawal to" @@ -228,6 +251,20 @@ "_libAddressManager": "Address manager for this OE deployment", "_ovmEth": "L2 OVM_ETH implementation of iOVM_DepositedToken" } + }, + "migrateEth(address)": { + "details": "Migrates entire ETH balance to another gateway", + "params": { + "_to": "Gateway Proxy address to migrate ETH to" + } + }, + "resolve(string)": { + "params": { + "_name": "Name to resolve an address for." + }, + "returns": { + "_0": "Address associated with the given name." + } } }, "title": "OVM_L1ETHGateway", @@ -235,13 +272,17 @@ }, "userdoc": { "kind": "user", - "methods": {}, + "methods": { + "resolve(string)": { + "notice": "Resolves the address associated with a given name." + } + }, "version": 1 }, "storageLayout": { "storage": [ { - "astId": 11770, + "astId": 12044, "contract": "contracts/optimistic-ethereum/OVM/bridge/tokens/OVM_L1ETHGateway.sol:OVM_L1ETHGateway", "label": "messenger", "offset": 0, @@ -249,15 +290,15 @@ "type": "t_address" }, { - "astId": 12554, + "astId": 12856, "contract": "contracts/optimistic-ethereum/OVM/bridge/tokens/OVM_L1ETHGateway.sol:OVM_L1ETHGateway", "label": "libAddressManager", "offset": 0, "slot": "1", - "type": "t_contract(Lib_AddressManager)12547" + "type": "t_contract(Lib_AddressManager)12849" }, { - "astId": 1967, + "astId": 2661, "contract": "contracts/optimistic-ethereum/OVM/bridge/tokens/OVM_L1ETHGateway.sol:OVM_L1ETHGateway", "label": "ovmEth", "offset": 0, @@ -271,7 +312,7 @@ "label": "address", "numberOfBytes": "20" }, - "t_contract(Lib_AddressManager)12547": { + "t_contract(Lib_AddressManager)12849": { "encoding": "inplace", "label": "contract Lib_AddressManager", "numberOfBytes": "20" diff --git a/packages/contracts/deployments/mainnet/OVM_L1MultiMessageRelayer.json b/packages/contracts/deployments/mainnet/OVM_L1MultiMessageRelayer.json index b2f6a04a62284..f50158678fe9f 100644 --- a/packages/contracts/deployments/mainnet/OVM_L1MultiMessageRelayer.json +++ b/packages/contracts/deployments/mainnet/OVM_L1MultiMessageRelayer.json @@ -1,5 +1,5 @@ { - "address": "0x22adc8A1152B090721E253Ee88CC12a15bcF9222", + "address": "0xc34F5B7279A9276A9D02491c59630fa725B7c36B", "abi": [ { "inputs": [ @@ -143,7 +143,7 @@ "outputs": [ { "internalType": "address", - "name": "_contract", + "name": "", "type": "address" } ], @@ -151,37 +151,50 @@ "type": "function" } ], - "transactionHash": "0xc890fd35bfd9c84cc1fc134599abe26f1379a23b7fff1a0ab524085e83b4040b", + "transactionHash": "0x0ebd01c007713958d1b343f492ebcfc6296adf54e7b18b8682f17e262f32f5e9", "receipt": { "to": null, - "from": "0x77C4c8f491e5ff22a2C0E18b005c3BA0Fe36c1Bc", - "contractAddress": "0x22adc8A1152B090721E253Ee88CC12a15bcF9222", - "transactionIndex": 65, - "gasUsed": "596327", + "from": "0xd033f09cB85621F98F7A84C64dB381ac16Eff818", + "contractAddress": "0xc34F5B7279A9276A9D02491c59630fa725B7c36B", + "transactionIndex": 159, + "gasUsed": "606489", "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0xb04d4d170239f9a4eb4a98a875070b561c35a73c4d619bbe87c695bc25485109", - "transactionHash": "0xc890fd35bfd9c84cc1fc134599abe26f1379a23b7fff1a0ab524085e83b4040b", + "blockHash": "0x6345aebe9ce7e9b618d0ae52783e8560b5a2e6810ba413e256033ca69c29d026", + "transactionHash": "0x0ebd01c007713958d1b343f492ebcfc6296adf54e7b18b8682f17e262f32f5e9", "logs": [], - "blockNumber": 12208100, - "cumulativeGasUsed": "4777268", + "blockNumber": 12410908, + "cumulativeGasUsed": "10534115", "status": 1, "byzantium": true }, "args": [ - "0xd3EeD86464Ff13B4BFD81a3bB1e753b7ceBA3A39" + "0x668E5b997b9aE88a56cd40409119d4Db9e6d752E" ], - "solcInputHash": "43ee6bb8ef92595aa6d0e22a6c464dff", - "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"messageNonce\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"stateRootBatchHeader\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"siblings\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct Lib_OVMCodec.ChainInclusionProof\",\"name\":\"stateRootProof\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"stateTrieWitness\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"storageTrieWitness\",\"type\":\"bytes\"}],\"internalType\":\"struct iOVM_L1CrossDomainMessenger.L2MessageInclusionProof\",\"name\":\"proof\",\"type\":\"tuple\"}],\"internalType\":\"struct iOVM_L1MultiMessageRelayer.L2ToL1Message[]\",\"name\":\"_messages\",\"type\":\"tuple[]\"}],\"name\":\"batchRelayMessages\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"_contract\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The L1 Multi-Message Relayer contract is a gas efficiency optimization which enables the relayer to submit multiple messages in a single transaction to be relayed by the L1 Cross Domain Message Sender. Compiler used: solc Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"batchRelayMessages((address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))[])\":{\"params\":{\"_messages\":\"An array of L2 to L1 messages\"}}},\"title\":\"OVM_L1MultiMessageRelayer\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"batchRelayMessages((address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))[])\":{\"notice\":\"Forwards multiple cross domain messages to the L1 Cross Domain Messenger for relaying\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1MultiMessageRelayer.sol\":\"OVM_L1MultiMessageRelayer\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1MultiMessageRelayer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// @unsupported: ovm\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n/* Interface Imports */\\nimport { iOVM_L1CrossDomainMessenger } from \\\"../../../iOVM/bridge/messaging/iOVM_L1CrossDomainMessenger.sol\\\";\\nimport { iOVM_L1MultiMessageRelayer } from \\\"../../../iOVM/bridge/messaging/iOVM_L1MultiMessageRelayer.sol\\\";\\n\\n/* Contract Imports */\\nimport { Lib_AddressResolver } from \\\"../../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n\\n/**\\n * @title OVM_L1MultiMessageRelayer\\n * @dev The L1 Multi-Message Relayer contract is a gas efficiency optimization which enables the \\n * relayer to submit multiple messages in a single transaction to be relayed by the L1 Cross Domain\\n * Message Sender.\\n *\\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract OVM_L1MultiMessageRelayer is iOVM_L1MultiMessageRelayer, Lib_AddressResolver {\\n\\n /***************\\n * Constructor *\\n ***************/\\n constructor(\\n address _libAddressManager\\n ) \\n Lib_AddressResolver(_libAddressManager)\\n {}\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyBatchRelayer() {\\n require(\\n msg.sender == resolve(\\\"OVM_L2BatchMessageRelayer\\\"),\\n \\\"OVM_L1MultiMessageRelayer: Function can only be called by the OVM_L2BatchMessageRelayer\\\"\\n );\\n _;\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * @notice Forwards multiple cross domain messages to the L1 Cross Domain Messenger for relaying\\n * @param _messages An array of L2 to L1 messages\\n */\\n function batchRelayMessages(L2ToL1Message[] calldata _messages) \\n override\\n external\\n onlyBatchRelayer \\n {\\n iOVM_L1CrossDomainMessenger messenger = iOVM_L1CrossDomainMessenger(resolve(\\\"Proxy__OVM_L1CrossDomainMessenger\\\"));\\n for (uint256 i = 0; i < _messages.length; i++) {\\n L2ToL1Message memory message = _messages[i];\\n messenger.relayMessage(\\n message.target,\\n message.sender,\\n message.message,\\n message.messageNonce,\\n message.proof\\n );\\n }\\n }\\n}\\n\",\"keccak256\":\"0xbccd671aae35ef04fa45b3019f0a9d8d3e1d7b60a6261d979579f93f9c508725\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/bridge/messaging/iAbs_BaseCrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/**\\n * @title iAbs_BaseCrossDomainMessenger\\n */\\ninterface iAbs_BaseCrossDomainMessenger {\\n\\n /**********\\n * Events *\\n **********/\\n event SentMessage(bytes message);\\n event RelayedMessage(bytes32 msgHash);\\n\\n /**********************\\n * Contract Variables *\\n **********************/\\n function xDomainMessageSender() external view returns (address);\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sends a cross domain message to the target messenger.\\n * @param _target Target contract address.\\n * @param _message Message to send to the target.\\n * @param _gasLimit Gas limit for the provided message.\\n */\\n function sendMessage(\\n address _target,\\n bytes calldata _message,\\n uint32 _gasLimit\\n ) external;\\n}\\n\",\"keccak256\":\"0xc2bd6b373daae2ede34281f4be5938d02b9d1cfb056b40d65ff70b7f16ce3c86\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/bridge/messaging/iOVM_L1CrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { iAbs_BaseCrossDomainMessenger } from \\\"./iAbs_BaseCrossDomainMessenger.sol\\\";\\n\\n/**\\n * @title iOVM_L1CrossDomainMessenger\\n */\\ninterface iOVM_L1CrossDomainMessenger is iAbs_BaseCrossDomainMessenger {\\n\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n struct L2MessageInclusionProof {\\n bytes32 stateRoot;\\n Lib_OVMCodec.ChainBatchHeader stateRootBatchHeader;\\n Lib_OVMCodec.ChainInclusionProof stateRootProof;\\n bytes stateTrieWitness;\\n bytes storageTrieWitness;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Relays a cross domain message to a contract.\\n * @param _target Target contract address.\\n * @param _sender Message sender address.\\n * @param _message Message to send to the target.\\n * @param _messageNonce Nonce for the provided message.\\n * @param _proof Inclusion proof for the given message.\\n */\\n function relayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _messageNonce,\\n L2MessageInclusionProof memory _proof\\n ) external;\\n\\n /**\\n * Replays a cross domain message to the target messenger.\\n * @param _target Target contract address.\\n * @param _sender Original sender address.\\n * @param _message Message to send to the target.\\n * @param _messageNonce Nonce for the provided message.\\n * @param _gasLimit Gas limit for the provided message.\\n */\\n function replayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _messageNonce,\\n uint32 _gasLimit\\n ) external;\\n}\\n\",\"keccak256\":\"0xdcd239d0b215e400674d78e8db4ac12ba18efc34fa78e24c2ff867f61062dba2\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/bridge/messaging/iOVM_L1MultiMessageRelayer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Interface Imports */\\nimport { iOVM_L1CrossDomainMessenger } from \\\"../../../iOVM/bridge/messaging/iOVM_L1CrossDomainMessenger.sol\\\";\\ninterface iOVM_L1MultiMessageRelayer {\\n\\n struct L2ToL1Message {\\n address target;\\n address sender;\\n bytes message;\\n uint256 messageNonce;\\n iOVM_L1CrossDomainMessenger.L2MessageInclusionProof proof;\\n }\\n\\n function batchRelayMessages(L2ToL1Message[] calldata _messages) external; \\n}\\n\",\"keccak256\":\"0xed86c23182a66b1a6c90c3f484b5d7264069e1a3849eb2fdd3608f9686282687\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/codec/Lib_OVMCodec.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../utils/Lib_Bytes32Utils.sol\\\";\\nimport { Lib_SafeExecutionManagerWrapper } from \\\"../../libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\\\";\\n\\n/**\\n * @title Lib_OVMCodec\\n */\\nlibrary Lib_OVMCodec {\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum EOASignatureType {\\n EIP155_TRANSACTION,\\n ETH_SIGNED_MESSAGE\\n }\\n\\n enum QueueOrigin {\\n SEQUENCER_QUEUE,\\n L1TOL2_QUEUE\\n }\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Account {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n address ethAddress;\\n bool isFresh;\\n }\\n\\n struct EVMAccount {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n }\\n\\n struct ChainBatchHeader {\\n uint256 batchIndex;\\n bytes32 batchRoot;\\n uint256 batchSize;\\n uint256 prevTotalElements;\\n bytes extraData;\\n }\\n\\n struct ChainInclusionProof {\\n uint256 index;\\n bytes32[] siblings;\\n }\\n\\n struct Transaction {\\n uint256 timestamp;\\n uint256 blockNumber;\\n QueueOrigin l1QueueOrigin;\\n address l1TxOrigin;\\n address entrypoint;\\n uint256 gasLimit;\\n bytes data;\\n }\\n\\n struct TransactionChainElement {\\n bool isSequenced;\\n uint256 queueIndex; // QUEUED TX ONLY\\n uint256 timestamp; // SEQUENCER TX ONLY\\n uint256 blockNumber; // SEQUENCER TX ONLY\\n bytes txData; // SEQUENCER TX ONLY\\n }\\n\\n struct QueueElement {\\n bytes32 transactionHash;\\n uint40 timestamp;\\n uint40 blockNumber;\\n }\\n\\n struct EIP155Transaction {\\n uint256 nonce;\\n uint256 gasPrice;\\n uint256 gasLimit;\\n address to;\\n uint256 value;\\n bytes data;\\n uint256 chainId;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Decodes an EOA transaction (i.e., native Ethereum RLP encoding).\\n * @param _transaction Encoded EOA transaction.\\n * @return Transaction decoded into a struct.\\n */\\n function decodeEIP155Transaction(\\n bytes memory _transaction,\\n bool _isEthSignedMessage\\n )\\n internal\\n pure\\n returns (\\n EIP155Transaction memory\\n )\\n {\\n if (_isEthSignedMessage) {\\n (\\n uint256 _nonce,\\n uint256 _gasLimit,\\n uint256 _gasPrice,\\n uint256 _chainId,\\n address _to,\\n bytes memory _data\\n ) = abi.decode(\\n _transaction,\\n (uint256, uint256, uint256, uint256, address ,bytes)\\n );\\n return EIP155Transaction({\\n nonce: _nonce,\\n gasPrice: _gasPrice,\\n gasLimit: _gasLimit,\\n to: _to,\\n value: 0,\\n data: _data,\\n chainId: _chainId\\n });\\n } else {\\n Lib_RLPReader.RLPItem[] memory decoded = Lib_RLPReader.readList(_transaction);\\n\\n return EIP155Transaction({\\n nonce: Lib_RLPReader.readUint256(decoded[0]),\\n gasPrice: Lib_RLPReader.readUint256(decoded[1]),\\n gasLimit: Lib_RLPReader.readUint256(decoded[2]),\\n to: Lib_RLPReader.readAddress(decoded[3]),\\n value: Lib_RLPReader.readUint256(decoded[4]),\\n data: Lib_RLPReader.readBytes(decoded[5]),\\n chainId: Lib_RLPReader.readUint256(decoded[6])\\n });\\n }\\n }\\n\\n /**\\n * Decompresses a compressed EIP155 transaction.\\n * @param _transaction Compressed EIP155 transaction bytes.\\n * @return Transaction parsed into a struct.\\n */\\n function decompressEIP155Transaction(\\n bytes memory _transaction\\n )\\n internal\\n returns (\\n EIP155Transaction memory\\n )\\n {\\n return EIP155Transaction({\\n gasLimit: Lib_BytesUtils.toUint24(_transaction, 0),\\n gasPrice: uint256(Lib_BytesUtils.toUint24(_transaction, 3)) * 1000000,\\n nonce: Lib_BytesUtils.toUint24(_transaction, 6),\\n to: Lib_BytesUtils.toAddress(_transaction, 9),\\n data: Lib_BytesUtils.slice(_transaction, 29),\\n chainId: Lib_SafeExecutionManagerWrapper.safeCHAINID(),\\n value: 0\\n });\\n }\\n\\n /**\\n * Encodes an EOA transaction back into the original transaction.\\n * @param _transaction EIP155transaction to encode.\\n * @param _isEthSignedMessage Whether or not this was an eth signed message.\\n * @return Encoded transaction.\\n */\\n function encodeEIP155Transaction(\\n EIP155Transaction memory _transaction,\\n bool _isEthSignedMessage\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n if (_isEthSignedMessage) {\\n return abi.encode(\\n _transaction.nonce,\\n _transaction.gasLimit,\\n _transaction.gasPrice,\\n _transaction.chainId,\\n _transaction.to,\\n _transaction.data\\n );\\n } else {\\n bytes[] memory raw = new bytes[](9);\\n\\n raw[0] = Lib_RLPWriter.writeUint(_transaction.nonce);\\n raw[1] = Lib_RLPWriter.writeUint(_transaction.gasPrice);\\n raw[2] = Lib_RLPWriter.writeUint(_transaction.gasLimit);\\n if (_transaction.to == address(0)) {\\n raw[3] = Lib_RLPWriter.writeBytes('');\\n } else {\\n raw[3] = Lib_RLPWriter.writeAddress(_transaction.to);\\n }\\n raw[4] = Lib_RLPWriter.writeUint(0);\\n raw[5] = Lib_RLPWriter.writeBytes(_transaction.data);\\n raw[6] = Lib_RLPWriter.writeUint(_transaction.chainId);\\n raw[7] = Lib_RLPWriter.writeBytes(bytes(''));\\n raw[8] = Lib_RLPWriter.writeBytes(bytes(''));\\n\\n return Lib_RLPWriter.writeList(raw);\\n }\\n }\\n\\n /**\\n * Encodes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Encoded transaction bytes.\\n */\\n function encodeTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return abi.encodePacked(\\n _transaction.timestamp,\\n _transaction.blockNumber,\\n _transaction.l1QueueOrigin,\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n );\\n }\\n\\n /**\\n * Hashes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Hashed transaction\\n */\\n function hashTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(encodeTransaction(_transaction));\\n }\\n\\n /**\\n * Converts an OVM account to an EVM account.\\n * @param _in OVM account to convert.\\n * @return Converted EVM account.\\n */\\n function toEVMAccount(\\n Account memory _in\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n return EVMAccount({\\n nonce: _in.nonce,\\n balance: _in.balance,\\n storageRoot: _in.storageRoot,\\n codeHash: _in.codeHash\\n });\\n }\\n\\n /**\\n * @notice RLP-encodes an account state struct.\\n * @param _account Account state struct.\\n * @return RLP-encoded account state.\\n */\\n function encodeEVMAccount(\\n EVMAccount memory _account\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes[] memory raw = new bytes[](4);\\n\\n // Unfortunately we can't create this array outright because\\n // Lib_RLPWriter.writeList will reject fixed-size arrays. Assigning\\n // index-by-index circumvents this issue.\\n raw[0] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.nonce)\\n )\\n );\\n raw[1] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.balance)\\n )\\n );\\n raw[2] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.storageRoot));\\n raw[3] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.codeHash));\\n\\n return Lib_RLPWriter.writeList(raw);\\n }\\n\\n /**\\n * @notice Decodes an RLP-encoded account state into a useful struct.\\n * @param _encoded RLP-encoded account state.\\n * @return Account state struct.\\n */\\n function decodeEVMAccount(\\n bytes memory _encoded\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\\n\\n return EVMAccount({\\n nonce: Lib_RLPReader.readUint256(accountState[0]),\\n balance: Lib_RLPReader.readUint256(accountState[1]),\\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\\n });\\n }\\n\\n /**\\n * Calculates a hash for a given batch header.\\n * @param _batchHeader Header to hash.\\n * @return Hash of the header.\\n */\\n function hashBatchHeader(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(\\n abi.encode(\\n _batchHeader.batchRoot,\\n _batchHeader.batchSize,\\n _batchHeader.prevTotalElements,\\n _batchHeader.extraData\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0xe7e518ba7bba3fa28c532f8902576c1bb4dfc1ec4b62bed6da50623248ba17c3\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Contract Imports */\\nimport { Ownable } from \\\"./Lib_Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n /*******************************************\\n * Contract Variables: Internal Accounting *\\n *******************************************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n public\\n onlyOwner\\n {\\n emit AddressSet(_name, _address);\\n addresses[_getNameHash(_name)] = _address;\\n }\\n\\n function getAddress(\\n string memory _name\\n )\\n public\\n view\\n returns (address)\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32 _hash\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0x3a490595cc21ff170e4027843093670ff845d5972481fbfb956b722ea564bb06\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n\\n /*******************************************\\n * Contract Variables: Contract References *\\n *******************************************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(\\n address _libAddressManager\\n ) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function resolve(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address _contract\\n )\\n {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0xaa3ed342f6deb156c660fd83afa579a3b80db17eb465e8949cf5c1b114780143\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Ownable\\n * @dev Adapted from https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol\\n */\\nabstract contract Ownable {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n address public owner;\\n\\n\\n /**********\\n * Events *\\n **********/\\n\\n event OwnershipTransferred(\\n address indexed previousOwner,\\n address indexed newOwner\\n );\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n constructor() {\\n owner = msg.sender;\\n emit OwnershipTransferred(address(0), owner);\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n owner == msg.sender,\\n \\\"Ownable: caller is not the owner\\\"\\n );\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function renounceOwnership()\\n public\\n virtual\\n onlyOwner\\n {\\n emit OwnershipTransferred(owner, address(0));\\n owner = address(0);\\n }\\n\\n function transferOwnership(address _newOwner)\\n public\\n virtual\\n onlyOwner\\n {\\n require(\\n _newOwner != address(0),\\n \\\"Ownable: new owner cannot be the zero address\\\"\\n );\\n\\n emit OwnershipTransferred(owner, _newOwner);\\n owner = _newOwner;\\n }\\n}\\n\",\"keccak256\":\"0xd9dfd9264e5b5fedd53a5b10fdf179c3f367614b0fe69179bce4e45119f5b739\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPReader.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_RLPReader\\n * @dev Adapted from \\\"RLPReader\\\" by Hamdi Allam (hamdi.allam97@gmail.com).\\n */\\nlibrary Lib_RLPReader {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 constant internal MAX_LIST_LENGTH = 32;\\n\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum RLPItemType {\\n DATA_ITEM,\\n LIST_ITEM\\n }\\n\\n \\n /***********\\n * Structs *\\n ***********/\\n\\n struct RLPItem {\\n uint256 length;\\n uint256 ptr;\\n }\\n \\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n \\n /**\\n * Converts bytes to a reference to memory position and length.\\n * @param _in Input bytes to convert.\\n * @return Output memory reference.\\n */\\n function toRLPItem(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem memory\\n )\\n {\\n uint256 ptr;\\n assembly {\\n ptr := add(_in, 32)\\n }\\n\\n return RLPItem({\\n length: _in.length,\\n ptr: ptr\\n });\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n (\\n uint256 listOffset,\\n ,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.LIST_ITEM,\\n \\\"Invalid RLP list value.\\\"\\n );\\n\\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\\n // writing to the length. Since we can't know the number of RLP items without looping over\\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\\n // simply set a reasonable maximum list length and decrease the size before we finish.\\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\\n\\n uint256 itemCount = 0;\\n uint256 offset = listOffset;\\n while (offset < _in.length) {\\n require(\\n itemCount < MAX_LIST_LENGTH,\\n \\\"Provided RLP list exceeds max list length.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n ) = _decodeLength(RLPItem({\\n length: _in.length - offset,\\n ptr: _in.ptr + offset\\n }));\\n\\n out[itemCount] = RLPItem({\\n length: itemLength + itemOffset,\\n ptr: _in.ptr + offset\\n });\\n\\n itemCount += 1;\\n offset += itemOffset + itemLength;\\n }\\n\\n // Decrease the array size to match the actual item count.\\n assembly {\\n mstore(out, itemCount)\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n return readList(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes value.\\\"\\n );\\n\\n return _copy(_in.ptr, itemOffset, itemLength);\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return readBytes(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return string(readBytes(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return readString(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n require(\\n _in.length <= 33,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr + itemOffset;\\n bytes32 out;\\n assembly {\\n out := mload(ptr)\\n\\n // Shift the bytes over to match the item size.\\n if lt(itemLength, 32) {\\n out := div(out, exp(256, sub(32, itemLength)))\\n }\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return readBytes32(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return uint256(readBytes32(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return readUint256(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n require(\\n _in.length == 1,\\n \\\"Invalid RLP boolean value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 out;\\n assembly {\\n out := byte(0, mload(ptr))\\n }\\n\\n require(\\n out == 0 || out == 1,\\n \\\"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\\\"\\n );\\n\\n return out != 0;\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return readBool(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n if (_in.length == 1) {\\n return address(0);\\n }\\n\\n require(\\n _in.length == 21,\\n \\\"Invalid RLP address value.\\\"\\n );\\n\\n return address(readUint256(_in));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return readAddress(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads the raw bytes of an RLP item.\\n * @param _in RLP item to read.\\n * @return Raw RLP bytes.\\n */\\n function readRawBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in);\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Decodes the length of an RLP item.\\n * @param _in RLP item to decode.\\n * @return Offset of the encoded data.\\n * @return Length of the encoded data.\\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\\n */\\n function _decodeLength(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n uint256,\\n uint256,\\n RLPItemType\\n )\\n {\\n require(\\n _in.length > 0,\\n \\\"RLP item cannot be null.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 prefix;\\n assembly {\\n prefix := byte(0, mload(ptr))\\n }\\n\\n if (prefix <= 0x7f) {\\n // Single byte.\\n\\n return (0, 1, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xb7) {\\n // Short string.\\n\\n uint256 strLen = prefix - 0x80;\\n \\n require(\\n _in.length > strLen,\\n \\\"Invalid RLP short string.\\\"\\n );\\n\\n return (1, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xbf) {\\n // Long string.\\n uint256 lenOfStrLen = prefix - 0xb7;\\n\\n require(\\n _in.length > lenOfStrLen,\\n \\\"Invalid RLP long string length.\\\"\\n );\\n\\n uint256 strLen;\\n assembly {\\n // Pick out the string length.\\n strLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfStrLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfStrLen + strLen,\\n \\\"Invalid RLP long string.\\\"\\n );\\n\\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xf7) {\\n // Short list.\\n uint256 listLen = prefix - 0xc0;\\n\\n require(\\n _in.length > listLen,\\n \\\"Invalid RLP short list.\\\"\\n );\\n\\n return (1, listLen, RLPItemType.LIST_ITEM);\\n } else {\\n // Long list.\\n uint256 lenOfListLen = prefix - 0xf7;\\n\\n require(\\n _in.length > lenOfListLen,\\n \\\"Invalid RLP long list length.\\\"\\n );\\n\\n uint256 listLen;\\n assembly {\\n // Pick out the list length.\\n listLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfListLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfListLen + listLen,\\n \\\"Invalid RLP long list.\\\"\\n );\\n\\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\\n }\\n }\\n\\n /**\\n * Copies the bytes from a memory location.\\n * @param _src Pointer to the location to read from.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Copied bytes.\\n */\\n function _copy(\\n uint256 _src,\\n uint256 _offset,\\n uint256 _length\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out = new bytes(_length);\\n if (out.length == 0) {\\n return out;\\n }\\n\\n uint256 src = _src + _offset;\\n uint256 dest;\\n assembly {\\n dest := add(out, 32)\\n }\\n\\n // Copy over as many complete words as we can.\\n for (uint256 i = 0; i < _length / 32; i++) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n\\n src += 32;\\n dest += 32;\\n }\\n\\n // Pick out the remaining bytes.\\n uint256 mask = 256 ** (32 - (_length % 32)) - 1;\\n assembly {\\n mstore(\\n dest,\\n or(\\n and(mload(src), not(mask)),\\n and(mload(dest), mask)\\n )\\n )\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Copies an RLP item into bytes.\\n * @param _in RLP item to copy.\\n * @return Copied bytes.\\n */\\n function _copy(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in.ptr, 0, _in.length);\\n }\\n}\\n\",\"keccak256\":\"0xbdb8fae0ca2483b4cc07607a5070fc25e33c54b4e4462b99e7c0b13aac48a09b\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPWriter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\n\\n/**\\n * @title Lib_RLPWriter\\n * @author Bakaoh (with modifications)\\n */\\nlibrary Lib_RLPWriter {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * RLP encodes a byte string.\\n * @param _in The byte string to encode.\\n * @return _out The RLP encoded string in bytes.\\n */\\n function writeBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n bytes memory encoded;\\n\\n if (_in.length == 1 && uint8(_in[0]) < 128) {\\n encoded = _in;\\n } else {\\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * RLP encodes a list of RLP encoded byte byte strings.\\n * @param _in The list of RLP encoded byte strings.\\n * @return _out The RLP encoded list of items in bytes.\\n */\\n function writeList(\\n bytes[] memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n bytes memory list = _flatten(_in);\\n return abi.encodePacked(_writeLength(list.length, 192), list);\\n }\\n\\n /**\\n * RLP encodes a string.\\n * @param _in The string to encode.\\n * @return _out The RLP encoded string in bytes.\\n */\\n function writeString(\\n string memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(bytes(_in));\\n }\\n\\n /**\\n * RLP encodes an address.\\n * @param _in The address to encode.\\n * @return _out The RLP encoded address in bytes.\\n */\\n function writeAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a uint.\\n * @param _in The uint256 to encode.\\n * @return _out The RLP encoded uint256 in bytes.\\n */\\n function writeUint(\\n uint256 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(_toBinary(_in));\\n }\\n\\n /**\\n * RLP encodes a bool.\\n * @param _in The bool to encode.\\n * @return _out The RLP encoded bool in bytes.\\n */\\n function writeBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n bytes memory encoded = new bytes(1);\\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\\n return encoded;\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\\n * @param _len The length of the string or the payload.\\n * @param _offset 128 if item is string, 192 if item is list.\\n * @return _encoded RLP encoded bytes.\\n */\\n function _writeLength(\\n uint256 _len,\\n uint256 _offset\\n )\\n private\\n pure\\n returns (\\n bytes memory _encoded\\n )\\n {\\n bytes memory encoded;\\n\\n if (_len < 56) {\\n encoded = new bytes(1);\\n encoded[0] = byte(uint8(_len) + uint8(_offset));\\n } else {\\n uint256 lenLen;\\n uint256 i = 1;\\n while (_len / i != 0) {\\n lenLen++;\\n i *= 256;\\n }\\n\\n encoded = new bytes(lenLen + 1);\\n encoded[0] = byte(uint8(lenLen) + uint8(_offset) + 55);\\n for(i = 1; i <= lenLen; i++) {\\n encoded[i] = byte(uint8((_len / (256**(lenLen-i))) % 256));\\n }\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * Encode integer in big endian binary form with no leading zeroes.\\n * @notice TODO: This should be optimized with assembly to save gas costs.\\n * @param _x The integer to encode.\\n * @return _binary RLP encoded bytes.\\n */\\n function _toBinary(\\n uint256 _x\\n )\\n private\\n pure\\n returns (\\n bytes memory _binary\\n )\\n {\\n bytes memory b = abi.encodePacked(_x);\\n\\n uint256 i = 0;\\n for (; i < 32; i++) {\\n if (b[i] != 0) {\\n break;\\n }\\n }\\n\\n bytes memory res = new bytes(32 - i);\\n for (uint256 j = 0; j < res.length; j++) {\\n res[j] = b[i++];\\n }\\n\\n return res;\\n }\\n\\n /**\\n * Copies a piece of memory to another location.\\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\\n * @param _dest Destination location.\\n * @param _src Source location.\\n * @param _len Length of memory to copy.\\n */\\n function _memcpy(\\n uint256 _dest,\\n uint256 _src,\\n uint256 _len\\n )\\n private\\n pure\\n {\\n uint256 dest = _dest;\\n uint256 src = _src;\\n uint256 len = _len;\\n\\n for(; len >= 32; len -= 32) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n dest += 32;\\n src += 32;\\n }\\n\\n uint256 mask = 256 ** (32 - len) - 1;\\n assembly {\\n let srcpart := and(mload(src), not(mask))\\n let destpart := and(mload(dest), mask)\\n mstore(dest, or(destpart, srcpart))\\n }\\n }\\n\\n /**\\n * Flattens a list of byte strings into one byte string.\\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\\n * @param _list List of byte strings to flatten.\\n * @return _flattened The flattened byte string.\\n */\\n function _flatten(\\n bytes[] memory _list\\n )\\n private\\n pure\\n returns (\\n bytes memory _flattened\\n )\\n {\\n if (_list.length == 0) {\\n return new bytes(0);\\n }\\n\\n uint256 len;\\n uint256 i = 0;\\n for (; i < _list.length; i++) {\\n len += _list[i].length;\\n }\\n\\n bytes memory flattened = new bytes(len);\\n uint256 flattenedPtr;\\n assembly { flattenedPtr := add(flattened, 0x20) }\\n\\n for(i = 0; i < _list.length; i++) {\\n bytes memory item = _list[i];\\n\\n uint256 listPtr;\\n assembly { listPtr := add(item, 0x20)}\\n\\n _memcpy(flattenedPtr, listPtr, item.length);\\n flattenedPtr += _list[i].length;\\n }\\n\\n return flattened;\\n }\\n}\",\"keccak256\":\"0xbcb24619c1758cb0d9f3fe5c79495950045a9087046a02b9ce01df46ae09ae5b\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_Bytes32Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_Byte32Utils\\n */\\nlibrary Lib_Bytes32Utils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \\\"true.\\\"\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as a boolean.\\n */\\n function toBool(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return _in != 0;\\n }\\n\\n /**\\n * Converts a boolean to a bytes32 value.\\n * @param _in Input boolean value.\\n * @return Boolean as a bytes32.\\n */\\n function fromBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in ? 1 : 0));\\n }\\n\\n /**\\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as an address.\\n */\\n function toAddress(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return address(uint160(uint256(_in)));\\n }\\n\\n /**\\n * Converts an address to a bytes32.\\n * @param _in Input address value.\\n * @return Address as a bytes32.\\n */\\n function fromAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in));\\n }\\n\\n /**\\n * Removes the leading zeros from a bytes32 value and returns a new (smaller) bytes value.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 without any leading zeros.\\n */\\n function removeLeadingZeros(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out;\\n\\n assembly {\\n // Figure out how many leading zero bytes to remove.\\n let shift := 0\\n for { let i := 0 } and(lt(i, 32), eq(byte(i, _in), 0)) { i := add(i, 1) } {\\n shift := add(shift, 1)\\n }\\n\\n // Reserve some space for our output and fix the free memory pointer.\\n out := mload(0x40)\\n mstore(0x40, add(out, 0x40))\\n\\n // Shift the value and store it into the output bytes.\\n mstore(add(out, 0x20), shl(mul(shift, 8), _in))\\n\\n // Store the new size (with leading zero bytes removed) in the output byte size.\\n mstore(out, sub(32, shift))\\n }\\n\\n return out;\\n }\\n}\\n\",\"keccak256\":\"0xfa2def593e3fc56a31852c3744aefdaa93cec74e721bfcfeb1e5d166c7c60b64\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_BytesUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_BytesUtils\\n */\\nlibrary Lib_BytesUtils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_start + _length >= _start, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n if (_bytes.length - _start == 0) {\\n return bytes('');\\n }\\n\\n return slice(_bytes, _start, _bytes.length - _start);\\n }\\n\\n function toBytes32PadLeft(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes32)\\n {\\n bytes32 ret;\\n uint256 len = _bytes.length <= 32 ? _bytes.length : 32;\\n assembly {\\n ret := shr(mul(sub(32, len), 8), mload(add(_bytes, 32)))\\n }\\n return ret;\\n }\\n\\n function toBytes32(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes32)\\n {\\n if (_bytes.length < 32) {\\n bytes32 ret;\\n assembly {\\n ret := mload(add(_bytes, 32))\\n }\\n return ret;\\n }\\n\\n return abi.decode(_bytes,(bytes32)); // will truncate if input length > 32 bytes\\n }\\n\\n function toUint256(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (uint256)\\n {\\n return uint256(toBytes32(_bytes));\\n }\\n\\n function toUint24(bytes memory _bytes, uint256 _start) internal pure returns (uint24) {\\n require(_start + 3 >= _start, \\\"toUint24_overflow\\\");\\n require(_bytes.length >= _start + 3 , \\\"toUint24_outOfBounds\\\");\\n uint24 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x3), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toUint8(bytes memory _bytes, uint256 _start) internal pure returns (uint8) {\\n require(_start + 1 >= _start, \\\"toUint8_overflow\\\");\\n require(_bytes.length >= _start + 1 , \\\"toUint8_outOfBounds\\\");\\n uint8 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x1), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toAddress(bytes memory _bytes, uint256 _start) internal pure returns (address) {\\n require(_start + 20 >= _start, \\\"toAddress_overflow\\\");\\n require(_bytes.length >= _start + 20, \\\"toAddress_outOfBounds\\\");\\n address tempAddress;\\n\\n assembly {\\n tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000)\\n }\\n\\n return tempAddress;\\n }\\n\\n function toNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n bytes memory nibbles = new bytes(_bytes.length * 2);\\n\\n for (uint256 i = 0; i < _bytes.length; i++) {\\n nibbles[i * 2] = _bytes[i] >> 4;\\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\\n }\\n\\n return nibbles;\\n }\\n\\n function fromNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n bytes memory ret = new bytes(_bytes.length / 2);\\n\\n for (uint256 i = 0; i < ret.length; i++) {\\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\\n }\\n\\n return ret;\\n }\\n\\n function equal(\\n bytes memory _bytes,\\n bytes memory _other\\n )\\n internal\\n pure\\n returns (bool)\\n {\\n return keccak256(_bytes) == keccak256(_other);\\n }\\n}\\n\",\"keccak256\":\"0x0adf22e1b22ba09911e859f64cb3b484e992be4f9fd3b09088e6225bf8d06ce0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_ErrorUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/**\\n * @title Lib_ErrorUtils\\n */\\nlibrary Lib_ErrorUtils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Encodes an error string into raw solidity-style revert data.\\n * (i.e. ascii bytes, prefixed with bytes4(keccak(\\\"Error(string))\\\"))\\n * Ref: https://docs.soliditylang.org/en/v0.8.2/control-structures.html?highlight=Error(string)#panic-via-assert-and-error-via-require\\n * @param _reason Reason for the reversion.\\n * @return Standard solidity revert data for the given reason.\\n */\\n function encodeRevertString(\\n string memory _reason\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return abi.encodeWithSignature(\\n \\\"Error(string)\\\",\\n _reason\\n );\\n }\\n}\\n\",\"keccak256\":\"0xfc64ec4a81fb50865b502a0004ed154e8598e1a313db77303fc95e41f536e6b7\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_ErrorUtils } from \\\"../utils/Lib_ErrorUtils.sol\\\";\\n\\n/**\\n * @title Lib_SafeExecutionManagerWrapper\\n * @dev The Safe Execution Manager Wrapper provides functions which facilitate writing OVM safe \\n * code using the standard solidity compiler, by routing all its operations through the Execution \\n * Manager.\\n * \\n * Compiler used: solc\\n * Runtime target: OVM\\n */\\nlibrary Lib_SafeExecutionManagerWrapper {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Performs a safe ovmCALL.\\n * @param _gasLimit Gas limit for the call.\\n * @param _target Address to call.\\n * @param _calldata Data to send to the call.\\n * @return _success Whether or not the call reverted.\\n * @return _returndata Data returned by the call.\\n */\\n function safeCALL(\\n uint256 _gasLimit,\\n address _target,\\n bytes memory _calldata\\n )\\n internal\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCALL(uint256,address,bytes)\\\",\\n _gasLimit,\\n _target,\\n _calldata\\n )\\n );\\n\\n return abi.decode(returndata, (bool, bytes));\\n }\\n\\n /**\\n * Performs a safe ovmDELEGATECALL.\\n * @param _gasLimit Gas limit for the call.\\n * @param _target Address to call.\\n * @param _calldata Data to send to the call.\\n * @return _success Whether or not the call reverted.\\n * @return _returndata Data returned by the call.\\n */\\n function safeDELEGATECALL(\\n uint256 _gasLimit,\\n address _target,\\n bytes memory _calldata\\n )\\n internal\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmDELEGATECALL(uint256,address,bytes)\\\",\\n _gasLimit,\\n _target,\\n _calldata\\n )\\n );\\n\\n return abi.decode(returndata, (bool, bytes));\\n }\\n\\n /**\\n * Performs a safe ovmCREATE call.\\n * @param _gasLimit Gas limit for the creation.\\n * @param _bytecode Code for the new contract.\\n * @return _contract Address of the created contract.\\n */\\n function safeCREATE(\\n uint256 _gasLimit,\\n bytes memory _bytecode\\n )\\n internal\\n returns (\\n address,\\n bytes memory\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n _gasLimit,\\n abi.encodeWithSignature(\\n \\\"ovmCREATE(bytes)\\\",\\n _bytecode\\n )\\n );\\n\\n return abi.decode(returndata, (address, bytes));\\n }\\n\\n /**\\n * Performs a safe ovmEXTCODESIZE call.\\n * @param _contract Address of the contract to query the size of.\\n * @return _EXTCODESIZE Size of the requested contract in bytes.\\n */\\n function safeEXTCODESIZE(\\n address _contract\\n )\\n internal\\n returns (\\n uint256 _EXTCODESIZE\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmEXTCODESIZE(address)\\\",\\n _contract\\n )\\n );\\n\\n return abi.decode(returndata, (uint256));\\n }\\n\\n /**\\n * Performs a safe ovmCHAINID call.\\n * @return _CHAINID Result of calling ovmCHAINID.\\n */\\n function safeCHAINID()\\n internal\\n returns (\\n uint256 _CHAINID\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCHAINID()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (uint256));\\n }\\n\\n /**\\n * Performs a safe ovmCALLER call.\\n * @return _CALLER Result of calling ovmCALLER.\\n */\\n function safeCALLER()\\n internal\\n returns (\\n address _CALLER\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCALLER()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (address));\\n }\\n\\n /**\\n * Performs a safe ovmADDRESS call.\\n * @return _ADDRESS Result of calling ovmADDRESS.\\n */\\n function safeADDRESS()\\n internal\\n returns (\\n address _ADDRESS\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmADDRESS()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (address));\\n }\\n\\n /**\\n * Performs a safe ovmGETNONCE call.\\n * @return _nonce Result of calling ovmGETNONCE.\\n */\\n function safeGETNONCE()\\n internal\\n returns (\\n uint256 _nonce\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmGETNONCE()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (uint256));\\n }\\n\\n /**\\n * Performs a safe ovmINCREMENTNONCE call.\\n */\\n function safeINCREMENTNONCE()\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmINCREMENTNONCE()\\\"\\n )\\n );\\n }\\n\\n /**\\n * Performs a safe ovmCREATEEOA call.\\n * @param _messageHash Message hash which was signed by EOA\\n * @param _v v value of signature (0 or 1)\\n * @param _r r value of signature\\n * @param _s s value of signature\\n */\\n function safeCREATEEOA(\\n bytes32 _messageHash,\\n uint8 _v,\\n bytes32 _r,\\n bytes32 _s\\n )\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCREATEEOA(bytes32,uint8,bytes32,bytes32)\\\",\\n _messageHash,\\n _v,\\n _r,\\n _s\\n )\\n );\\n }\\n\\n /**\\n * Performs a safe REVERT.\\n * @param _reason String revert reason to pass along with the REVERT.\\n */\\n function safeREVERT(\\n string memory _reason\\n )\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmREVERT(bytes)\\\",\\n Lib_ErrorUtils.encodeRevertString(\\n _reason\\n )\\n )\\n );\\n }\\n\\n /**\\n * Performs a safe \\\"require\\\".\\n * @param _condition Boolean condition that must be true or will revert.\\n * @param _reason String revert reason to pass along with the REVERT.\\n */\\n function safeREQUIRE(\\n bool _condition,\\n string memory _reason\\n )\\n internal\\n {\\n if (!_condition) {\\n safeREVERT(\\n _reason\\n );\\n }\\n }\\n\\n /**\\n * Performs a safe ovmSLOAD call.\\n */\\n function safeSLOAD(\\n bytes32 _key\\n )\\n internal\\n returns (\\n bytes32\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmSLOAD(bytes32)\\\",\\n _key\\n )\\n );\\n\\n return abi.decode(returndata, (bytes32));\\n }\\n\\n /**\\n * Performs a safe ovmSSTORE call.\\n */\\n function safeSSTORE(\\n bytes32 _key,\\n bytes32 _value\\n )\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmSSTORE(bytes32,bytes32)\\\",\\n _key,\\n _value\\n )\\n );\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Performs an ovm interaction and the necessary safety checks.\\n * @param _gasLimit Gas limit for the interaction.\\n * @param _calldata Data to send to the OVM_ExecutionManager (encoded with sighash).\\n * @return _returndata Data sent back by the OVM_ExecutionManager.\\n */\\n function _safeExecutionManagerInteraction(\\n uint256 _gasLimit,\\n bytes memory _calldata\\n )\\n private\\n returns (\\n bytes memory _returndata\\n )\\n {\\n address ovmExecutionManager = msg.sender;\\n (\\n bool success,\\n bytes memory returndata\\n ) = ovmExecutionManager.call{gas: _gasLimit}(_calldata);\\n\\n if (success == false) {\\n assembly {\\n revert(add(returndata, 0x20), mload(returndata))\\n }\\n } else if (returndata.length == 1) {\\n assembly {\\n return(0, 1)\\n }\\n } else {\\n return returndata;\\n }\\n }\\n\\n function _safeExecutionManagerInteraction(\\n bytes memory _calldata\\n )\\n private\\n returns (\\n bytes memory _returndata\\n )\\n {\\n return _safeExecutionManagerInteraction(\\n gasleft(),\\n _calldata\\n );\\n }\\n}\\n\",\"keccak256\":\"0x41e146e7912af794a17cd43c5a276674be956bfa8f3ca5b451bcb82d81e6f492\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x608060405234801561001057600080fd5b506040516109f93803806109f983398101604081905261002f91610054565b600080546001600160a01b0319166001600160a01b0392909216919091179055610082565b600060208284031215610065578081fd5b81516001600160a01b038116811461007b578182fd5b9392505050565b610968806100916000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c806316e9cd9b14610046578063299ca4781461005b578063461a447814610079575b600080fd5b61005961005436600461057d565b61008c565b005b6100636101ea565b60405161007091906106db565b60405180910390f35b6100636100873660046105ec565b6101f9565b6100ca6040518060400160405280601981526020017f4f564d5f4c3242617463684d65737361676552656c61796572000000000000008152506101f9565b6001600160a01b0316336001600160a01b0316146101035760405162461bcd60e51b81526004016100fa906107d7565b60405180910390fd5b600061012660405180606001604052806021815260200161093b602191396101f9565b905060005b828110156101e457600084848381811061014157fe5b9050602002810190610153919061085a565b61015c9061089d565b8051602082015160408084015160608501516080860151925163d7fd19dd60e01b81529596506001600160a01b0389169563d7fd19dd956101a5959094909392916004016106ef565b600060405180830381600087803b1580156101bf57600080fd5b505af11580156101d3573d6000803e3d6000fd5b50506001909301925061012b915050565b50505050565b6000546001600160a01b031681565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b83811015610259578181015183820152602001610241565b50505050905090810190601f1680156102865780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b1580156102a357600080fd5b505afa1580156102b7573d6000803e3d6000fd5b505050506040513d60208110156102cd57600080fd5b505190505b919050565b600067ffffffffffffffff8311156102eb57fe5b6102fe601f8401601f1916602001610879565b905082815283838301111561031257600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b03811681146102d257600080fd5b600082601f830112610350578081fd5b61035f838335602085016102d7565b9392505050565b600060a08284031215610377578081fd5b60405160a0810167ffffffffffffffff828210818311171561039557fe5b816040528293508435835260208501356020840152604085013560408401526060850135606084015260808501359150808211156103d257600080fd5b506103df85828601610340565b6080830152505092915050565b6000604082840312156103fd578081fd5b6040516040810167ffffffffffffffff828210818311171561041b57fe5b816040528293508435835260209150818501358181111561043b57600080fd5b8501601f8101871361044c57600080fd5b80358281111561045857fe5b8381029250610468848401610879565b8181528481019083860185850187018b101561048357600080fd5b600095505b838610156104a6578035835260019590950194918601918601610488565b5080868801525050505050505092915050565b600060a082840312156104ca578081fd5b6104d460a0610879565b905081358152602082013567ffffffffffffffff808211156104f557600080fd5b61050185838601610366565b6020840152604084013591508082111561051a57600080fd5b610526858386016103ec565b6040840152606084013591508082111561053f57600080fd5b61054b85838601610340565b6060840152608084013591508082111561056457600080fd5b5061057184828501610340565b60808301525092915050565b6000806020838503121561058f578182fd5b823567ffffffffffffffff808211156105a6578384fd5b818501915085601f8301126105b9578384fd5b8135818111156105c7578485fd5b86602080830285010111156105da578485fd5b60209290920196919550909350505050565b6000602082840312156105fd578081fd5b813567ffffffffffffffff811115610613578182fd5b8201601f81018413610623578182fd5b610632848235602084016102d7565b949350505050565b60008151808452815b8181101561065f57602081850181015186830182015201610643565b818111156106705782602083870101525b50601f01601f19169290920160200192915050565b6000604083018251845260208084015160408287015282815180855260608801915083830194508592505b808310156106d057845182529383019360019290920191908301906106b0565b509695505050505050565b6001600160a01b0391909116815260200190565b6001600160a01b0386811682528516602082015260a06040820181905260009061071b9083018661063a565b846060840152828103608084015283518152602084015160a06020830152805160a0830152602081015160c0830152604081015160e083015260608101516101008301526080810151905060a061012083015261077c61014083018261063a565b9050604085015182820360408401526107958282610685565b915050606085015182820360608401526107af828261063a565b915050608085015182820360808401526107c9828261063a565b9a9950505050505050505050565b60208082526057908201527f4f564d5f4c314d756c74694d65737361676552656c617965723a2046756e637460408201527f696f6e2063616e206f6e6c792062652063616c6c656420627920746865204f5660608201527f4d5f4c3242617463684d65737361676552656c61796572000000000000000000608082015260a00190565b60008235609e1983360301811261086f578182fd5b9190910192915050565b60405181810167ffffffffffffffff8111828210171561089557fe5b604052919050565b600060a082360312156108ae578081fd5b60405160a0810167ffffffffffffffff82821081831117156108cc57fe5b816040526108d985610329565b83526108e760208601610329565b602084015260408501359150808211156108ff578384fd5b61090b36838701610340565b604084015260608501356060840152608085013591508082111561092d578384fd5b50610571368286016104b956fe50726f78795f5f4f564d5f4c3143726f7373446f6d61696e4d657373656e676572a164736f6c6343000706000a", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100415760003560e01c806316e9cd9b14610046578063299ca4781461005b578063461a447814610079575b600080fd5b61005961005436600461057d565b61008c565b005b6100636101ea565b60405161007091906106db565b60405180910390f35b6100636100873660046105ec565b6101f9565b6100ca6040518060400160405280601981526020017f4f564d5f4c3242617463684d65737361676552656c61796572000000000000008152506101f9565b6001600160a01b0316336001600160a01b0316146101035760405162461bcd60e51b81526004016100fa906107d7565b60405180910390fd5b600061012660405180606001604052806021815260200161093b602191396101f9565b905060005b828110156101e457600084848381811061014157fe5b9050602002810190610153919061085a565b61015c9061089d565b8051602082015160408084015160608501516080860151925163d7fd19dd60e01b81529596506001600160a01b0389169563d7fd19dd956101a5959094909392916004016106ef565b600060405180830381600087803b1580156101bf57600080fd5b505af11580156101d3573d6000803e3d6000fd5b50506001909301925061012b915050565b50505050565b6000546001600160a01b031681565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b83811015610259578181015183820152602001610241565b50505050905090810190601f1680156102865780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b1580156102a357600080fd5b505afa1580156102b7573d6000803e3d6000fd5b505050506040513d60208110156102cd57600080fd5b505190505b919050565b600067ffffffffffffffff8311156102eb57fe5b6102fe601f8401601f1916602001610879565b905082815283838301111561031257600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b03811681146102d257600080fd5b600082601f830112610350578081fd5b61035f838335602085016102d7565b9392505050565b600060a08284031215610377578081fd5b60405160a0810167ffffffffffffffff828210818311171561039557fe5b816040528293508435835260208501356020840152604085013560408401526060850135606084015260808501359150808211156103d257600080fd5b506103df85828601610340565b6080830152505092915050565b6000604082840312156103fd578081fd5b6040516040810167ffffffffffffffff828210818311171561041b57fe5b816040528293508435835260209150818501358181111561043b57600080fd5b8501601f8101871361044c57600080fd5b80358281111561045857fe5b8381029250610468848401610879565b8181528481019083860185850187018b101561048357600080fd5b600095505b838610156104a6578035835260019590950194918601918601610488565b5080868801525050505050505092915050565b600060a082840312156104ca578081fd5b6104d460a0610879565b905081358152602082013567ffffffffffffffff808211156104f557600080fd5b61050185838601610366565b6020840152604084013591508082111561051a57600080fd5b610526858386016103ec565b6040840152606084013591508082111561053f57600080fd5b61054b85838601610340565b6060840152608084013591508082111561056457600080fd5b5061057184828501610340565b60808301525092915050565b6000806020838503121561058f578182fd5b823567ffffffffffffffff808211156105a6578384fd5b818501915085601f8301126105b9578384fd5b8135818111156105c7578485fd5b86602080830285010111156105da578485fd5b60209290920196919550909350505050565b6000602082840312156105fd578081fd5b813567ffffffffffffffff811115610613578182fd5b8201601f81018413610623578182fd5b610632848235602084016102d7565b949350505050565b60008151808452815b8181101561065f57602081850181015186830182015201610643565b818111156106705782602083870101525b50601f01601f19169290920160200192915050565b6000604083018251845260208084015160408287015282815180855260608801915083830194508592505b808310156106d057845182529383019360019290920191908301906106b0565b509695505050505050565b6001600160a01b0391909116815260200190565b6001600160a01b0386811682528516602082015260a06040820181905260009061071b9083018661063a565b846060840152828103608084015283518152602084015160a06020830152805160a0830152602081015160c0830152604081015160e083015260608101516101008301526080810151905060a061012083015261077c61014083018261063a565b9050604085015182820360408401526107958282610685565b915050606085015182820360608401526107af828261063a565b915050608085015182820360808401526107c9828261063a565b9a9950505050505050505050565b60208082526057908201527f4f564d5f4c314d756c74694d65737361676552656c617965723a2046756e637460408201527f696f6e2063616e206f6e6c792062652063616c6c656420627920746865204f5660608201527f4d5f4c3242617463684d65737361676552656c61796572000000000000000000608082015260a00190565b60008235609e1983360301811261086f578182fd5b9190910192915050565b60405181810167ffffffffffffffff8111828210171561089557fe5b604052919050565b600060a082360312156108ae578081fd5b60405160a0810167ffffffffffffffff82821081831117156108cc57fe5b816040526108d985610329565b83526108e760208601610329565b602084015260408501359150808211156108ff578384fd5b61090b36838701610340565b604084015260608501356060840152608085013591508082111561092d578384fd5b50610571368286016104b956fe50726f78795f5f4f564d5f4c3143726f7373446f6d61696e4d657373656e676572a164736f6c6343000706000a", + "solcInputHash": "f2bdab652d5102f5f11e78dae866798d", + "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"messageNonce\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"stateRootBatchHeader\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"siblings\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct Lib_OVMCodec.ChainInclusionProof\",\"name\":\"stateRootProof\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"stateTrieWitness\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"storageTrieWitness\",\"type\":\"bytes\"}],\"internalType\":\"struct iOVM_L1CrossDomainMessenger.L2MessageInclusionProof\",\"name\":\"proof\",\"type\":\"tuple\"}],\"internalType\":\"struct iOVM_L1MultiMessageRelayer.L2ToL1Message[]\",\"name\":\"_messages\",\"type\":\"tuple[]\"}],\"name\":\"batchRelayMessages\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The L1 Multi-Message Relayer contract is a gas efficiency optimization which enables the relayer to submit multiple messages in a single transaction to be relayed by the L1 Cross Domain Message Sender. Compiler used: solc Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"batchRelayMessages((address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))[])\":{\"params\":{\"_messages\":\"An array of L2 to L1 messages\"}},\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}}},\"title\":\"OVM_L1MultiMessageRelayer\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"batchRelayMessages((address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))[])\":{\"notice\":\"Forwards multiple cross domain messages to the L1 Cross Domain Messenger for relaying\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1MultiMessageRelayer.sol\":\"OVM_L1MultiMessageRelayer\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor () internal {\\n address msgSender = _msgSender();\\n _owner = msgSender;\\n emit OwnershipTransferred(address(0), msgSender);\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n emit OwnershipTransferred(_owner, address(0));\\n _owner = address(0);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n emit OwnershipTransferred(_owner, newOwner);\\n _owner = newOwner;\\n }\\n}\\n\",\"keccak256\":\"0x15e2d5bd4c28a88548074c54d220e8086f638a71ed07e6b3ba5a70066fcf458d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with GSN meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address payable) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes memory) {\\n this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x8d3cb350f04ff49cfb10aef08d87f19dcbaecc8027b0bed12f3275cd12f38cf0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1MultiMessageRelayer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// @unsupported: ovm\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Interface Imports */\\nimport { iOVM_L1CrossDomainMessenger } from \\\"../../../iOVM/bridge/messaging/iOVM_L1CrossDomainMessenger.sol\\\";\\nimport { iOVM_L1MultiMessageRelayer } from \\\"../../../iOVM/bridge/messaging/iOVM_L1MultiMessageRelayer.sol\\\";\\n\\n/* Library Imports */\\nimport { Lib_AddressResolver } from \\\"../../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/**\\n * @title OVM_L1MultiMessageRelayer\\n * @dev The L1 Multi-Message Relayer contract is a gas efficiency optimization which enables the\\n * relayer to submit multiple messages in a single transaction to be relayed by the L1 Cross Domain\\n * Message Sender.\\n *\\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract OVM_L1MultiMessageRelayer is iOVM_L1MultiMessageRelayer, Lib_AddressResolver {\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n */\\n constructor(\\n address _libAddressManager\\n )\\n Lib_AddressResolver(_libAddressManager)\\n {}\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyBatchRelayer() {\\n require(\\n msg.sender == resolve(\\\"OVM_L2BatchMessageRelayer\\\"),\\n \\\"OVM_L1MultiMessageRelayer: Function can only be called by the OVM_L2BatchMessageRelayer\\\"\\n );\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * @notice Forwards multiple cross domain messages to the L1 Cross Domain Messenger for relaying\\n * @param _messages An array of L2 to L1 messages\\n */\\n function batchRelayMessages(\\n L2ToL1Message[] calldata _messages\\n ) \\n override\\n external\\n onlyBatchRelayer\\n {\\n iOVM_L1CrossDomainMessenger messenger = iOVM_L1CrossDomainMessenger(\\n resolve(\\\"Proxy__OVM_L1CrossDomainMessenger\\\")\\n );\\n\\n for (uint256 i = 0; i < _messages.length; i++) {\\n L2ToL1Message memory message = _messages[i];\\n messenger.relayMessage(\\n message.target,\\n message.sender,\\n message.message,\\n message.messageNonce,\\n message.proof\\n );\\n }\\n }\\n}\\n\",\"keccak256\":\"0xe698b8dbdcecd055ee77cc553963f966faebcdefbed1e586f7fd603fa816d9c6\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/bridge/messaging/iAbs_BaseCrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/**\\n * @title iAbs_BaseCrossDomainMessenger\\n */\\ninterface iAbs_BaseCrossDomainMessenger {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event SentMessage(bytes message);\\n event RelayedMessage(bytes32 msgHash);\\n event FailedRelayedMessage(bytes32 msgHash);\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n function xDomainMessageSender() external view returns (address);\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sends a cross domain message to the target messenger.\\n * @param _target Target contract address.\\n * @param _message Message to send to the target.\\n * @param _gasLimit Gas limit for the provided message.\\n */\\n function sendMessage(\\n address _target,\\n bytes calldata _message,\\n uint32 _gasLimit\\n ) external;\\n}\\n\",\"keccak256\":\"0x89981ed48e99d6939cc6cdef827d484fa3e2292d66c0ba5056c7050cb6282d7e\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/bridge/messaging/iOVM_L1CrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { iAbs_BaseCrossDomainMessenger } from \\\"./iAbs_BaseCrossDomainMessenger.sol\\\";\\n\\n/**\\n * @title iOVM_L1CrossDomainMessenger\\n */\\ninterface iOVM_L1CrossDomainMessenger is iAbs_BaseCrossDomainMessenger {\\n\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n struct L2MessageInclusionProof {\\n bytes32 stateRoot;\\n Lib_OVMCodec.ChainBatchHeader stateRootBatchHeader;\\n Lib_OVMCodec.ChainInclusionProof stateRootProof;\\n bytes stateTrieWitness;\\n bytes storageTrieWitness;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Relays a cross domain message to a contract.\\n * @param _target Target contract address.\\n * @param _sender Message sender address.\\n * @param _message Message to send to the target.\\n * @param _messageNonce Nonce for the provided message.\\n * @param _proof Inclusion proof for the given message.\\n */\\n function relayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _messageNonce,\\n L2MessageInclusionProof memory _proof\\n ) external;\\n\\n /**\\n * Replays a cross domain message to the target messenger.\\n * @param _target Target contract address.\\n * @param _sender Original sender address.\\n * @param _message Message to send to the target.\\n * @param _messageNonce Nonce for the provided message.\\n * @param _gasLimit Gas limit for the provided message.\\n */\\n function replayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _messageNonce,\\n uint32 _gasLimit\\n ) external;\\n}\\n\",\"keccak256\":\"0xdcd239d0b215e400674d78e8db4ac12ba18efc34fa78e24c2ff867f61062dba2\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/bridge/messaging/iOVM_L1MultiMessageRelayer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Interface Imports */\\nimport { iOVM_L1CrossDomainMessenger } from \\\"../../../iOVM/bridge/messaging/iOVM_L1CrossDomainMessenger.sol\\\";\\ninterface iOVM_L1MultiMessageRelayer {\\n\\n struct L2ToL1Message {\\n address target;\\n address sender;\\n bytes message;\\n uint256 messageNonce;\\n iOVM_L1CrossDomainMessenger.L2MessageInclusionProof proof;\\n }\\n\\n function batchRelayMessages(L2ToL1Message[] calldata _messages) external;\\n}\\n\",\"keccak256\":\"0x8bc1fb2a33dcac59ec307195f8b8358d1ae2ab021c70a1589038b366d1b949d7\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/codec/Lib_OVMCodec.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../utils/Lib_Bytes32Utils.sol\\\";\\n\\n/**\\n * @title Lib_OVMCodec\\n */\\nlibrary Lib_OVMCodec {\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum QueueOrigin {\\n SEQUENCER_QUEUE,\\n L1TOL2_QUEUE\\n }\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Account {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n address ethAddress;\\n bool isFresh;\\n }\\n\\n struct EVMAccount {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n }\\n\\n struct ChainBatchHeader {\\n uint256 batchIndex;\\n bytes32 batchRoot;\\n uint256 batchSize;\\n uint256 prevTotalElements;\\n bytes extraData;\\n }\\n\\n struct ChainInclusionProof {\\n uint256 index;\\n bytes32[] siblings;\\n }\\n\\n struct Transaction {\\n uint256 timestamp;\\n uint256 blockNumber;\\n QueueOrigin l1QueueOrigin;\\n address l1TxOrigin;\\n address entrypoint;\\n uint256 gasLimit;\\n bytes data;\\n }\\n\\n struct TransactionChainElement {\\n bool isSequenced;\\n uint256 queueIndex; // QUEUED TX ONLY\\n uint256 timestamp; // SEQUENCER TX ONLY\\n uint256 blockNumber; // SEQUENCER TX ONLY\\n bytes txData; // SEQUENCER TX ONLY\\n }\\n\\n struct QueueElement {\\n bytes32 transactionHash;\\n uint40 timestamp;\\n uint40 blockNumber;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Encodes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Encoded transaction bytes.\\n */\\n function encodeTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return abi.encodePacked(\\n _transaction.timestamp,\\n _transaction.blockNumber,\\n _transaction.l1QueueOrigin,\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n );\\n }\\n\\n /**\\n * Hashes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Hashed transaction\\n */\\n function hashTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(encodeTransaction(_transaction));\\n }\\n\\n /**\\n * Converts an OVM account to an EVM account.\\n * @param _in OVM account to convert.\\n * @return Converted EVM account.\\n */\\n function toEVMAccount(\\n Account memory _in\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n return EVMAccount({\\n nonce: _in.nonce,\\n balance: _in.balance,\\n storageRoot: _in.storageRoot,\\n codeHash: _in.codeHash\\n });\\n }\\n\\n /**\\n * @notice RLP-encodes an account state struct.\\n * @param _account Account state struct.\\n * @return RLP-encoded account state.\\n */\\n function encodeEVMAccount(\\n EVMAccount memory _account\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes[] memory raw = new bytes[](4);\\n\\n // Unfortunately we can't create this array outright because\\n // Lib_RLPWriter.writeList will reject fixed-size arrays. Assigning\\n // index-by-index circumvents this issue.\\n raw[0] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.nonce)\\n )\\n );\\n raw[1] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.balance)\\n )\\n );\\n raw[2] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.storageRoot));\\n raw[3] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.codeHash));\\n\\n return Lib_RLPWriter.writeList(raw);\\n }\\n\\n /**\\n * @notice Decodes an RLP-encoded account state into a useful struct.\\n * @param _encoded RLP-encoded account state.\\n * @return Account state struct.\\n */\\n function decodeEVMAccount(\\n bytes memory _encoded\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\\n\\n return EVMAccount({\\n nonce: Lib_RLPReader.readUint256(accountState[0]),\\n balance: Lib_RLPReader.readUint256(accountState[1]),\\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\\n });\\n }\\n\\n /**\\n * Calculates a hash for a given batch header.\\n * @param _batchHeader Header to hash.\\n * @return Hash of the header.\\n */\\n function hashBatchHeader(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(\\n abi.encode(\\n _batchHeader.batchRoot,\\n _batchHeader.batchSize,\\n _batchHeader.prevTotalElements,\\n _batchHeader.extraData\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0xd85ba2066057a2677926f484b938c7c2ef33ff3853f3b71cda252f4a54f30e05\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n external\\n onlyOwner\\n {\\n addresses[_getNameHash(_name)] = _address;\\n\\n emit AddressSet(\\n _name,\\n _address\\n );\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(\\n string memory _name\\n )\\n external\\n view\\n returns (\\n address\\n )\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xcc9fc5c64f1101a5c6c397594086b1608189a9edc5c9635e1ac38f70aeeeecbf\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(\\n address _libAddressManager\\n ) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x65981feeabff6a81783ea97d44baf988a18a86c8cb374c46fdb71819cbacc7c0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPReader.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_RLPReader\\n * @dev Adapted from \\\"RLPReader\\\" by Hamdi Allam (hamdi.allam97@gmail.com).\\n */\\nlibrary Lib_RLPReader {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 constant internal MAX_LIST_LENGTH = 32;\\n\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum RLPItemType {\\n DATA_ITEM,\\n LIST_ITEM\\n }\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct RLPItem {\\n uint256 length;\\n uint256 ptr;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts bytes to a reference to memory position and length.\\n * @param _in Input bytes to convert.\\n * @return Output memory reference.\\n */\\n function toRLPItem(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem memory\\n )\\n {\\n uint256 ptr;\\n assembly {\\n ptr := add(_in, 32)\\n }\\n\\n return RLPItem({\\n length: _in.length,\\n ptr: ptr\\n });\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n (\\n uint256 listOffset,\\n ,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.LIST_ITEM,\\n \\\"Invalid RLP list value.\\\"\\n );\\n\\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\\n // writing to the length. Since we can't know the number of RLP items without looping over\\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\\n // simply set a reasonable maximum list length and decrease the size before we finish.\\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\\n\\n uint256 itemCount = 0;\\n uint256 offset = listOffset;\\n while (offset < _in.length) {\\n require(\\n itemCount < MAX_LIST_LENGTH,\\n \\\"Provided RLP list exceeds max list length.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n ) = _decodeLength(RLPItem({\\n length: _in.length - offset,\\n ptr: _in.ptr + offset\\n }));\\n\\n out[itemCount] = RLPItem({\\n length: itemLength + itemOffset,\\n ptr: _in.ptr + offset\\n });\\n\\n itemCount += 1;\\n offset += itemOffset + itemLength;\\n }\\n\\n // Decrease the array size to match the actual item count.\\n assembly {\\n mstore(out, itemCount)\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n return readList(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes value.\\\"\\n );\\n\\n return _copy(_in.ptr, itemOffset, itemLength);\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return readBytes(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return string(readBytes(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return readString(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n require(\\n _in.length <= 33,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr + itemOffset;\\n bytes32 out;\\n assembly {\\n out := mload(ptr)\\n\\n // Shift the bytes over to match the item size.\\n if lt(itemLength, 32) {\\n out := div(out, exp(256, sub(32, itemLength)))\\n }\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return readBytes32(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return uint256(readBytes32(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return readUint256(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n require(\\n _in.length == 1,\\n \\\"Invalid RLP boolean value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 out;\\n assembly {\\n out := byte(0, mload(ptr))\\n }\\n\\n require(\\n out == 0 || out == 1,\\n \\\"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\\\"\\n );\\n\\n return out != 0;\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return readBool(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n if (_in.length == 1) {\\n return address(0);\\n }\\n\\n require(\\n _in.length == 21,\\n \\\"Invalid RLP address value.\\\"\\n );\\n\\n return address(readUint256(_in));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return readAddress(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads the raw bytes of an RLP item.\\n * @param _in RLP item to read.\\n * @return Raw RLP bytes.\\n */\\n function readRawBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in);\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Decodes the length of an RLP item.\\n * @param _in RLP item to decode.\\n * @return Offset of the encoded data.\\n * @return Length of the encoded data.\\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\\n */\\n function _decodeLength(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n uint256,\\n uint256,\\n RLPItemType\\n )\\n {\\n require(\\n _in.length > 0,\\n \\\"RLP item cannot be null.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 prefix;\\n assembly {\\n prefix := byte(0, mload(ptr))\\n }\\n\\n if (prefix <= 0x7f) {\\n // Single byte.\\n\\n return (0, 1, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xb7) {\\n // Short string.\\n\\n uint256 strLen = prefix - 0x80;\\n\\n require(\\n _in.length > strLen,\\n \\\"Invalid RLP short string.\\\"\\n );\\n\\n return (1, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xbf) {\\n // Long string.\\n uint256 lenOfStrLen = prefix - 0xb7;\\n\\n require(\\n _in.length > lenOfStrLen,\\n \\\"Invalid RLP long string length.\\\"\\n );\\n\\n uint256 strLen;\\n assembly {\\n // Pick out the string length.\\n strLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfStrLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfStrLen + strLen,\\n \\\"Invalid RLP long string.\\\"\\n );\\n\\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xf7) {\\n // Short list.\\n uint256 listLen = prefix - 0xc0;\\n\\n require(\\n _in.length > listLen,\\n \\\"Invalid RLP short list.\\\"\\n );\\n\\n return (1, listLen, RLPItemType.LIST_ITEM);\\n } else {\\n // Long list.\\n uint256 lenOfListLen = prefix - 0xf7;\\n\\n require(\\n _in.length > lenOfListLen,\\n \\\"Invalid RLP long list length.\\\"\\n );\\n\\n uint256 listLen;\\n assembly {\\n // Pick out the list length.\\n listLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfListLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfListLen + listLen,\\n \\\"Invalid RLP long list.\\\"\\n );\\n\\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\\n }\\n }\\n\\n /**\\n * Copies the bytes from a memory location.\\n * @param _src Pointer to the location to read from.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Copied bytes.\\n */\\n function _copy(\\n uint256 _src,\\n uint256 _offset,\\n uint256 _length\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out = new bytes(_length);\\n if (out.length == 0) {\\n return out;\\n }\\n\\n uint256 src = _src + _offset;\\n uint256 dest;\\n assembly {\\n dest := add(out, 32)\\n }\\n\\n // Copy over as many complete words as we can.\\n for (uint256 i = 0; i < _length / 32; i++) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n\\n src += 32;\\n dest += 32;\\n }\\n\\n // Pick out the remaining bytes.\\n uint256 mask = 256 ** (32 - (_length % 32)) - 1;\\n assembly {\\n mstore(\\n dest,\\n or(\\n and(mload(src), not(mask)),\\n and(mload(dest), mask)\\n )\\n )\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Copies an RLP item into bytes.\\n * @param _in RLP item to copy.\\n * @return Copied bytes.\\n */\\n function _copy(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in.ptr, 0, _in.length);\\n }\\n}\\n\",\"keccak256\":\"0x829174c61216dce35fdb888383b6022e0365eb7fbdc71ad79d98b108091969fe\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPWriter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/**\\n * @title Lib_RLPWriter\\n * @author Bakaoh (with modifications)\\n */\\nlibrary Lib_RLPWriter {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * RLP encodes a byte string.\\n * @param _in The byte string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded;\\n\\n if (_in.length == 1 && uint8(_in[0]) < 128) {\\n encoded = _in;\\n } else {\\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * RLP encodes a list of RLP encoded byte byte strings.\\n * @param _in The list of RLP encoded byte strings.\\n * @return The RLP encoded list of items in bytes.\\n */\\n function writeList(\\n bytes[] memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory list = _flatten(_in);\\n return abi.encodePacked(_writeLength(list.length, 192), list);\\n }\\n\\n /**\\n * RLP encodes a string.\\n * @param _in The string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeString(\\n string memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(bytes(_in));\\n }\\n\\n /**\\n * RLP encodes an address.\\n * @param _in The address to encode.\\n * @return The RLP encoded address in bytes.\\n */\\n function writeAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a bytes32 value.\\n * @param _in The bytes32 to encode.\\n * @return _out The RLP encoded bytes32 in bytes.\\n */\\n function writeBytes32(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a uint.\\n * @param _in The uint256 to encode.\\n * @return The RLP encoded uint256 in bytes.\\n */\\n function writeUint(\\n uint256 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(_toBinary(_in));\\n }\\n\\n /**\\n * RLP encodes a bool.\\n * @param _in The bool to encode.\\n * @return The RLP encoded bool in bytes.\\n */\\n function writeBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded = new bytes(1);\\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\\n return encoded;\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\\n * @param _len The length of the string or the payload.\\n * @param _offset 128 if item is string, 192 if item is list.\\n * @return RLP encoded bytes.\\n */\\n function _writeLength(\\n uint256 _len,\\n uint256 _offset\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded;\\n\\n if (_len < 56) {\\n encoded = new bytes(1);\\n encoded[0] = byte(uint8(_len) + uint8(_offset));\\n } else {\\n uint256 lenLen;\\n uint256 i = 1;\\n while (_len / i != 0) {\\n lenLen++;\\n i *= 256;\\n }\\n\\n encoded = new bytes(lenLen + 1);\\n encoded[0] = byte(uint8(lenLen) + uint8(_offset) + 55);\\n for(i = 1; i <= lenLen; i++) {\\n encoded[i] = byte(uint8((_len / (256**(lenLen-i))) % 256));\\n }\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * Encode integer in big endian binary form with no leading zeroes.\\n * @notice TODO: This should be optimized with assembly to save gas costs.\\n * @param _x The integer to encode.\\n * @return RLP encoded bytes.\\n */\\n function _toBinary(\\n uint256 _x\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory b = abi.encodePacked(_x);\\n\\n uint256 i = 0;\\n for (; i < 32; i++) {\\n if (b[i] != 0) {\\n break;\\n }\\n }\\n\\n bytes memory res = new bytes(32 - i);\\n for (uint256 j = 0; j < res.length; j++) {\\n res[j] = b[i++];\\n }\\n\\n return res;\\n }\\n\\n /**\\n * Copies a piece of memory to another location.\\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\\n * @param _dest Destination location.\\n * @param _src Source location.\\n * @param _len Length of memory to copy.\\n */\\n function _memcpy(\\n uint256 _dest,\\n uint256 _src,\\n uint256 _len\\n )\\n private\\n pure\\n {\\n uint256 dest = _dest;\\n uint256 src = _src;\\n uint256 len = _len;\\n\\n for(; len >= 32; len -= 32) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n dest += 32;\\n src += 32;\\n }\\n\\n uint256 mask = 256 ** (32 - len) - 1;\\n assembly {\\n let srcpart := and(mload(src), not(mask))\\n let destpart := and(mload(dest), mask)\\n mstore(dest, or(destpart, srcpart))\\n }\\n }\\n\\n /**\\n * Flattens a list of byte strings into one byte string.\\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\\n * @param _list List of byte strings to flatten.\\n * @return The flattened byte string.\\n */\\n function _flatten(\\n bytes[] memory _list\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n if (_list.length == 0) {\\n return new bytes(0);\\n }\\n\\n uint256 len;\\n uint256 i = 0;\\n for (; i < _list.length; i++) {\\n len += _list[i].length;\\n }\\n\\n bytes memory flattened = new bytes(len);\\n uint256 flattenedPtr;\\n assembly { flattenedPtr := add(flattened, 0x20) }\\n\\n for(i = 0; i < _list.length; i++) {\\n bytes memory item = _list[i];\\n\\n uint256 listPtr;\\n assembly { listPtr := add(item, 0x20)}\\n\\n _memcpy(flattenedPtr, listPtr, item.length);\\n flattenedPtr += _list[i].length;\\n }\\n\\n return flattened;\\n }\\n}\\n\",\"keccak256\":\"0xb60ee4b03ad372c3deff21d454ab714dd0c18ee3e6f9d45532e209fc59d5a54d\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_Bytes32Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_Byte32Utils\\n */\\nlibrary Lib_Bytes32Utils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \\\"true.\\\"\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as a boolean.\\n */\\n function toBool(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return _in != 0;\\n }\\n\\n /**\\n * Converts a boolean to a bytes32 value.\\n * @param _in Input boolean value.\\n * @return Boolean as a bytes32.\\n */\\n function fromBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in ? 1 : 0));\\n }\\n\\n /**\\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as an address.\\n */\\n function toAddress(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return address(uint160(uint256(_in)));\\n }\\n\\n /**\\n * Converts an address to a bytes32.\\n * @param _in Input address value.\\n * @return Address as a bytes32.\\n */\\n function fromAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in));\\n }\\n\\n /**\\n * Removes the leading zeros from a bytes32 value and returns a new (smaller) bytes value.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 without any leading zeros.\\n */\\n function removeLeadingZeros(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out;\\n\\n assembly {\\n // Figure out how many leading zero bytes to remove.\\n let shift := 0\\n for { let i := 0 } and(lt(i, 32), eq(byte(i, _in), 0)) { i := add(i, 1) } {\\n shift := add(shift, 1)\\n }\\n\\n // Reserve some space for our output and fix the free memory pointer.\\n out := mload(0x40)\\n mstore(0x40, add(out, 0x40))\\n\\n // Shift the value and store it into the output bytes.\\n mstore(add(out, 0x20), shl(mul(shift, 8), _in))\\n\\n // Store the new size (with leading zero bytes removed) in the output byte size.\\n mstore(out, sub(32, shift))\\n }\\n\\n return out;\\n }\\n}\\n\",\"keccak256\":\"0xfa2def593e3fc56a31852c3744aefdaa93cec74e721bfcfeb1e5d166c7c60b64\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_BytesUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_BytesUtils\\n */\\nlibrary Lib_BytesUtils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_start + _length >= _start, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n if (_start >= _bytes.length) {\\n return bytes('');\\n }\\n\\n return slice(_bytes, _start, _bytes.length - _start);\\n }\\n\\n function toBytes32PadLeft(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n bytes32 ret;\\n uint256 len = _bytes.length <= 32 ? _bytes.length : 32;\\n assembly {\\n ret := shr(mul(sub(32, len), 8), mload(add(_bytes, 32)))\\n }\\n return ret;\\n }\\n\\n function toBytes32(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n if (_bytes.length < 32) {\\n bytes32 ret;\\n assembly {\\n ret := mload(add(_bytes, 32))\\n }\\n return ret;\\n }\\n\\n return abi.decode(_bytes,(bytes32)); // will truncate if input length > 32 bytes\\n }\\n\\n function toUint256(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return uint256(toBytes32(_bytes));\\n }\\n\\n function toUint24(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n uint24\\n )\\n {\\n require(_start + 3 >= _start, \\\"toUint24_overflow\\\");\\n require(_bytes.length >= _start + 3 , \\\"toUint24_outOfBounds\\\");\\n uint24 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x3), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toUint8(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n uint8\\n )\\n {\\n require(_start + 1 >= _start, \\\"toUint8_overflow\\\");\\n require(_bytes.length >= _start + 1 , \\\"toUint8_outOfBounds\\\");\\n uint8 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x1), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toAddress(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n require(_start + 20 >= _start, \\\"toAddress_overflow\\\");\\n require(_bytes.length >= _start + 20, \\\"toAddress_outOfBounds\\\");\\n address tempAddress;\\n\\n assembly {\\n tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000)\\n }\\n\\n return tempAddress;\\n }\\n\\n function toNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory nibbles = new bytes(_bytes.length * 2);\\n\\n for (uint256 i = 0; i < _bytes.length; i++) {\\n nibbles[i * 2] = _bytes[i] >> 4;\\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\\n }\\n\\n return nibbles;\\n }\\n\\n function fromNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory ret = new bytes(_bytes.length / 2);\\n\\n for (uint256 i = 0; i < ret.length; i++) {\\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\\n }\\n\\n return ret;\\n }\\n\\n function equal(\\n bytes memory _bytes,\\n bytes memory _other\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return keccak256(_bytes) == keccak256(_other);\\n }\\n}\\n\",\"keccak256\":\"0xd27e37973f1e0f64798725b7a0de12989dac992fba0d72970249d7e1f70e17c5\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x608060405234801561001057600080fd5b50604051610a22380380610a2283398101604081905261002f91610054565b600080546001600160a01b0319166001600160a01b0392909216919091179055610082565b600060208284031215610065578081fd5b81516001600160a01b038116811461007b578182fd5b9392505050565b610991806100916000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c806316e9cd9b14610046578063299ca4781461005b578063461a447814610079575b600080fd5b61005961005436600461057d565b61008c565b005b6100636101ea565b60405161007091906106db565b60405180910390f35b6100636100873660046105ec565b6101f9565b6100ca6040518060400160405280601981526020017f4f564d5f4c3242617463684d65737361676552656c61796572000000000000008152506101f9565b6001600160a01b0316336001600160a01b0316146101035760405162461bcd60e51b81526004016100fa906107d7565b60405180910390fd5b600061012660405180606001604052806021815260200161093b602191396101f9565b905060005b828110156101e457600084848381811061014157fe5b9050602002810190610153919061085a565b61015c9061089d565b8051602082015160408084015160608501516080860151925163d7fd19dd60e01b81529596506001600160a01b0389169563d7fd19dd956101a5959094909392916004016106ef565b600060405180830381600087803b1580156101bf57600080fd5b505af11580156101d3573d6000803e3d6000fd5b50506001909301925061012b915050565b50505050565b6000546001600160a01b031681565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b83811015610259578181015183820152602001610241565b50505050905090810190601f1680156102865780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b1580156102a357600080fd5b505afa1580156102b7573d6000803e3d6000fd5b505050506040513d60208110156102cd57600080fd5b505190505b919050565b600067ffffffffffffffff8311156102eb57fe5b6102fe601f8401601f1916602001610879565b905082815283838301111561031257600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b03811681146102d257600080fd5b600082601f830112610350578081fd5b61035f838335602085016102d7565b9392505050565b600060a08284031215610377578081fd5b60405160a0810167ffffffffffffffff828210818311171561039557fe5b816040528293508435835260208501356020840152604085013560408401526060850135606084015260808501359150808211156103d257600080fd5b506103df85828601610340565b6080830152505092915050565b6000604082840312156103fd578081fd5b6040516040810167ffffffffffffffff828210818311171561041b57fe5b816040528293508435835260209150818501358181111561043b57600080fd5b8501601f8101871361044c57600080fd5b80358281111561045857fe5b8381029250610468848401610879565b8181528481019083860185850187018b101561048357600080fd5b600095505b838610156104a6578035835260019590950194918601918601610488565b5080868801525050505050505092915050565b600060a082840312156104ca578081fd5b6104d460a0610879565b905081358152602082013567ffffffffffffffff808211156104f557600080fd5b61050185838601610366565b6020840152604084013591508082111561051a57600080fd5b610526858386016103ec565b6040840152606084013591508082111561053f57600080fd5b61054b85838601610340565b6060840152608084013591508082111561056457600080fd5b5061057184828501610340565b60808301525092915050565b6000806020838503121561058f578182fd5b823567ffffffffffffffff808211156105a6578384fd5b818501915085601f8301126105b9578384fd5b8135818111156105c7578485fd5b86602080830285010111156105da578485fd5b60209290920196919550909350505050565b6000602082840312156105fd578081fd5b813567ffffffffffffffff811115610613578182fd5b8201601f81018413610623578182fd5b610632848235602084016102d7565b949350505050565b60008151808452815b8181101561065f57602081850181015186830182015201610643565b818111156106705782602083870101525b50601f01601f19169290920160200192915050565b6000604083018251845260208084015160408287015282815180855260608801915083830194508592505b808310156106d057845182529383019360019290920191908301906106b0565b509695505050505050565b6001600160a01b0391909116815260200190565b6001600160a01b0386811682528516602082015260a06040820181905260009061071b9083018661063a565b846060840152828103608084015283518152602084015160a06020830152805160a0830152602081015160c0830152604081015160e083015260608101516101008301526080810151905060a061012083015261077c61014083018261063a565b9050604085015182820360408401526107958282610685565b915050606085015182820360608401526107af828261063a565b915050608085015182820360808401526107c9828261063a565b9a9950505050505050505050565b60208082526057908201527f4f564d5f4c314d756c74694d65737361676552656c617965723a2046756e637460408201527f696f6e2063616e206f6e6c792062652063616c6c656420627920746865204f5660608201527f4d5f4c3242617463684d65737361676552656c61796572000000000000000000608082015260a00190565b60008235609e1983360301811261086f578182fd5b9190910192915050565b60405181810167ffffffffffffffff8111828210171561089557fe5b604052919050565b600060a082360312156108ae578081fd5b60405160a0810167ffffffffffffffff82821081831117156108cc57fe5b816040526108d985610329565b83526108e760208601610329565b602084015260408501359150808211156108ff578384fd5b61090b36838701610340565b604084015260608501356060840152608085013591508082111561092d578384fd5b50610571368286016104b956fe50726f78795f5f4f564d5f4c3143726f7373446f6d61696e4d657373656e676572a264697066735822122009eddc3ff04b76f7c0ac832d08a76adc227055f7bc6ab523f103ae9ee1d5c4fe64736f6c63430007060033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100415760003560e01c806316e9cd9b14610046578063299ca4781461005b578063461a447814610079575b600080fd5b61005961005436600461057d565b61008c565b005b6100636101ea565b60405161007091906106db565b60405180910390f35b6100636100873660046105ec565b6101f9565b6100ca6040518060400160405280601981526020017f4f564d5f4c3242617463684d65737361676552656c61796572000000000000008152506101f9565b6001600160a01b0316336001600160a01b0316146101035760405162461bcd60e51b81526004016100fa906107d7565b60405180910390fd5b600061012660405180606001604052806021815260200161093b602191396101f9565b905060005b828110156101e457600084848381811061014157fe5b9050602002810190610153919061085a565b61015c9061089d565b8051602082015160408084015160608501516080860151925163d7fd19dd60e01b81529596506001600160a01b0389169563d7fd19dd956101a5959094909392916004016106ef565b600060405180830381600087803b1580156101bf57600080fd5b505af11580156101d3573d6000803e3d6000fd5b50506001909301925061012b915050565b50505050565b6000546001600160a01b031681565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b83811015610259578181015183820152602001610241565b50505050905090810190601f1680156102865780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b1580156102a357600080fd5b505afa1580156102b7573d6000803e3d6000fd5b505050506040513d60208110156102cd57600080fd5b505190505b919050565b600067ffffffffffffffff8311156102eb57fe5b6102fe601f8401601f1916602001610879565b905082815283838301111561031257600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b03811681146102d257600080fd5b600082601f830112610350578081fd5b61035f838335602085016102d7565b9392505050565b600060a08284031215610377578081fd5b60405160a0810167ffffffffffffffff828210818311171561039557fe5b816040528293508435835260208501356020840152604085013560408401526060850135606084015260808501359150808211156103d257600080fd5b506103df85828601610340565b6080830152505092915050565b6000604082840312156103fd578081fd5b6040516040810167ffffffffffffffff828210818311171561041b57fe5b816040528293508435835260209150818501358181111561043b57600080fd5b8501601f8101871361044c57600080fd5b80358281111561045857fe5b8381029250610468848401610879565b8181528481019083860185850187018b101561048357600080fd5b600095505b838610156104a6578035835260019590950194918601918601610488565b5080868801525050505050505092915050565b600060a082840312156104ca578081fd5b6104d460a0610879565b905081358152602082013567ffffffffffffffff808211156104f557600080fd5b61050185838601610366565b6020840152604084013591508082111561051a57600080fd5b610526858386016103ec565b6040840152606084013591508082111561053f57600080fd5b61054b85838601610340565b6060840152608084013591508082111561056457600080fd5b5061057184828501610340565b60808301525092915050565b6000806020838503121561058f578182fd5b823567ffffffffffffffff808211156105a6578384fd5b818501915085601f8301126105b9578384fd5b8135818111156105c7578485fd5b86602080830285010111156105da578485fd5b60209290920196919550909350505050565b6000602082840312156105fd578081fd5b813567ffffffffffffffff811115610613578182fd5b8201601f81018413610623578182fd5b610632848235602084016102d7565b949350505050565b60008151808452815b8181101561065f57602081850181015186830182015201610643565b818111156106705782602083870101525b50601f01601f19169290920160200192915050565b6000604083018251845260208084015160408287015282815180855260608801915083830194508592505b808310156106d057845182529383019360019290920191908301906106b0565b509695505050505050565b6001600160a01b0391909116815260200190565b6001600160a01b0386811682528516602082015260a06040820181905260009061071b9083018661063a565b846060840152828103608084015283518152602084015160a06020830152805160a0830152602081015160c0830152604081015160e083015260608101516101008301526080810151905060a061012083015261077c61014083018261063a565b9050604085015182820360408401526107958282610685565b915050606085015182820360608401526107af828261063a565b915050608085015182820360808401526107c9828261063a565b9a9950505050505050505050565b60208082526057908201527f4f564d5f4c314d756c74694d65737361676552656c617965723a2046756e637460408201527f696f6e2063616e206f6e6c792062652063616c6c656420627920746865204f5660608201527f4d5f4c3242617463684d65737361676552656c61796572000000000000000000608082015260a00190565b60008235609e1983360301811261086f578182fd5b9190910192915050565b60405181810167ffffffffffffffff8111828210171561089557fe5b604052919050565b600060a082360312156108ae578081fd5b60405160a0810167ffffffffffffffff82821081831117156108cc57fe5b816040526108d985610329565b83526108e760208601610329565b602084015260408501359150808211156108ff578384fd5b61090b36838701610340565b604084015260608501356060840152608085013591508082111561092d578384fd5b50610571368286016104b956fe50726f78795f5f4f564d5f4c3143726f7373446f6d61696e4d657373656e676572a264697066735822122009eddc3ff04b76f7c0ac832d08a76adc227055f7bc6ab523f103ae9ee1d5c4fe64736f6c63430007060033", "devdoc": { - "details": "The L1 Multi-Message Relayer contract is a gas efficiency optimization which enables the relayer to submit multiple messages in a single transaction to be relayed by the L1 Cross Domain Message Sender. Compiler used: solc Runtime target: EVM", + "details": "The L1 Multi-Message Relayer contract is a gas efficiency optimization which enables the relayer to submit multiple messages in a single transaction to be relayed by the L1 Cross Domain Message Sender. Compiler used: solc Runtime target: EVM", "kind": "dev", "methods": { "batchRelayMessages((address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))[])": { "params": { "_messages": "An array of L2 to L1 messages" } + }, + "constructor": { + "params": { + "_libAddressManager": "Address of the Address Manager." + } + }, + "resolve(string)": { + "params": { + "_name": "Name to resolve an address for." + }, + "returns": { + "_0": "Address associated with the given name." + } } }, "title": "OVM_L1MultiMessageRelayer", @@ -192,6 +205,9 @@ "methods": { "batchRelayMessages((address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))[])": { "notice": "Forwards multiple cross domain messages to the L1 Cross Domain Messenger for relaying" + }, + "resolve(string)": { + "notice": "Resolves the address associated with a given name." } }, "version": 1 @@ -199,16 +215,16 @@ "storageLayout": { "storage": [ { - "astId": 12554, + "astId": 12856, "contract": "contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1MultiMessageRelayer.sol:OVM_L1MultiMessageRelayer", "label": "libAddressManager", "offset": 0, "slot": "0", - "type": "t_contract(Lib_AddressManager)12547" + "type": "t_contract(Lib_AddressManager)12849" } ], "types": { - "t_contract(Lib_AddressManager)12547": { + "t_contract(Lib_AddressManager)12849": { "encoding": "inplace", "label": "contract Lib_AddressManager", "numberOfBytes": "20" diff --git a/packages/contracts/deployments/mainnet/OVM_SafetyChecker.json b/packages/contracts/deployments/mainnet/OVM_SafetyChecker.json index 845f1744f15aa..da2aa8a78b6b1 100644 --- a/packages/contracts/deployments/mainnet/OVM_SafetyChecker.json +++ b/packages/contracts/deployments/mainnet/OVM_SafetyChecker.json @@ -1,5 +1,5 @@ { - "address": "0x4667c625b36Df62e393a9483BCfB2F00cA0708D1", + "address": "0xD87eFbBb82f1B7d25469641ee2E0E513f144394C", "abi": [ { "inputs": [ @@ -21,29 +21,29 @@ "type": "function" } ], - "transactionHash": "0xe5484c392dda889be19833aeb6383296e35e1bad24c67507d2f4a61ce349ef88", + "transactionHash": "0x2968f1ad5acf532a8e41953e5d2feb06ee4c81ddf364453b2e31f018d83463ea", "receipt": { "to": null, - "from": "0x77C4c8f491e5ff22a2C0E18b005c3BA0Fe36c1Bc", - "contractAddress": "0x4667c625b36Df62e393a9483BCfB2F00cA0708D1", - "transactionIndex": 33, - "gasUsed": "234686", + "from": "0xd033f09cB85621F98F7A84C64dB381ac16Eff818", + "contractAddress": "0xD87eFbBb82f1B7d25469641ee2E0E513f144394C", + "transactionIndex": 53, + "gasUsed": "243548", "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0x2bce69cd7d405ef5c24996ea8a0f677db85952d8b3ea79a8ec010bc0ec048657", - "transactionHash": "0xe5484c392dda889be19833aeb6383296e35e1bad24c67507d2f4a61ce349ef88", + "blockHash": "0x3916378de09329074abbb245a436330dfb8646cd9a1af7e5b7de1cd736f8aced", + "transactionHash": "0x2968f1ad5acf532a8e41953e5d2feb06ee4c81ddf364453b2e31f018d83463ea", "logs": [], - "blockNumber": 12208095, - "cumulativeGasUsed": "2623646", + "blockNumber": 12410855, + "cumulativeGasUsed": "5205613", "status": 1, "byzantium": true }, "args": [], - "solcInputHash": "43ee6bb8ef92595aa6d0e22a6c464dff", - "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_bytecode\",\"type\":\"bytes\"}],\"name\":\"isBytecodeSafe\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The Safety Checker verifies that contracts deployed on L2 do not contain any \\\"unsafe\\\" operations. An operation is considered unsafe if it would access state variables which are specific to the environment (ie. L1 or L2) in which it is executed, as this could be used to \\\"escape the sandbox\\\" of the OVM, resulting in non-deterministic fraud proofs. That is, an attacker would be able to \\\"prove fraud\\\" on an honestly applied transaction. Note that a \\\"safe\\\" contract requires opcodes to appear in a particular pattern; omission of \\\"unsafe\\\" opcodes is necessary, but not sufficient. Compiler used: solc Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"isBytecodeSafe(bytes)\":{\"params\":{\"_bytecode\":\"The bytecode to safety check.\"},\"returns\":{\"_0\":\"`true` if the bytecode is safe, `false` otherwise.\"}}},\"title\":\"OVM_SafetyChecker\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"isBytecodeSafe(bytes)\":{\"notice\":\"Returns whether or not all of the provided bytecode is safe.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/OVM/execution/OVM_SafetyChecker.sol\":\"OVM_SafetyChecker\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/optimistic-ethereum/OVM/execution/OVM_SafetyChecker.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Interface Imports */\\nimport { iOVM_SafetyChecker } from \\\"../../iOVM/execution/iOVM_SafetyChecker.sol\\\";\\n\\n/**\\n * @title OVM_SafetyChecker\\n * @dev The Safety Checker verifies that contracts deployed on L2 do not contain any\\n * \\\"unsafe\\\" operations. An operation is considered unsafe if it would access state variables which\\n * are specific to the environment (ie. L1 or L2) in which it is executed, as this could be used\\n * to \\\"escape the sandbox\\\" of the OVM, resulting in non-deterministic fraud proofs. \\n * That is, an attacker would be able to \\\"prove fraud\\\" on an honestly applied transaction.\\n * Note that a \\\"safe\\\" contract requires opcodes to appear in a particular pattern;\\n * omission of \\\"unsafe\\\" opcodes is necessary, but not sufficient.\\n *\\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract OVM_SafetyChecker is iOVM_SafetyChecker {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Returns whether or not all of the provided bytecode is safe.\\n * @param _bytecode The bytecode to safety check.\\n * @return `true` if the bytecode is safe, `false` otherwise.\\n */\\n function isBytecodeSafe(\\n bytes memory _bytecode\\n )\\n override\\n external\\n pure\\n returns (\\n bool\\n )\\n {\\n // autogenerated by gen_safety_checker_constants.py\\n // number of bytes to skip for each opcode\\n uint256[8] memory opcodeSkippableBytes = [\\n uint256(0x0001010101010101010101010000000001010101010101010101010101010000),\\n uint256(0x0100000000000000000000000000000000000000010101010101000000010100),\\n uint256(0x0000000000000000000000000000000001010101000000010101010100000000),\\n uint256(0x0203040500000000000000000000000000000000000000000000000000000000),\\n uint256(0x0101010101010101010101010101010101010101010101010101010101010101),\\n uint256(0x0101010101000000000000000000000000000000000000000000000000000000),\\n uint256(0x0000000000000000000000000000000000000000000000000000000000000000),\\n uint256(0x0000000000000000000000000000000000000000000000000000000000000000)\\n ];\\n // Mask to gate opcode specific cases\\n uint256 opcodeGateMask = ~uint256(0xffffffffffffffffffffffe000000000fffffffff070ffff9c0ffffec000f001);\\n // Halting opcodes\\n uint256 opcodeHaltingMask = ~uint256(0x4008000000000000000000000000000000000000004000000000000000000001);\\n // PUSH opcodes\\n uint256 opcodePushMask = ~uint256(0xffffffff000000000000000000000000);\\n\\n uint256 codeLength;\\n uint256 _pc;\\n assembly {\\n _pc := add(_bytecode, 0x20)\\n }\\n codeLength = _pc + _bytecode.length;\\n do {\\n // current opcode: 0x00...0xff\\n uint256 opNum;\\n\\n // inline assembly removes the extra add + bounds check\\n assembly {\\n let word := mload(_pc) //load the next 32 bytes at pc into word\\n\\n // Look up number of bytes to skip from opcodeSkippableBytes and then update indexInWord\\n // E.g. the 02030405 in opcodeSkippableBytes is the number of bytes to skip for PUSH1->4\\n // We repeat this 6 times, thus we can only skip bytes for up to PUSH4 ((1+4) * 6 = 30 < 32).\\n // If we see an opcode that is listed as 0 skippable bytes e.g. PUSH5,\\n // then we will get stuck on that indexInWord and then opNum will be set to the PUSH5 opcode.\\n let indexInWord := byte(0, mload(add(opcodeSkippableBytes, byte(0, word))))\\n indexInWord := add(indexInWord, byte(0, mload(add(opcodeSkippableBytes, byte(indexInWord, word)))))\\n indexInWord := add(indexInWord, byte(0, mload(add(opcodeSkippableBytes, byte(indexInWord, word)))))\\n indexInWord := add(indexInWord, byte(0, mload(add(opcodeSkippableBytes, byte(indexInWord, word)))))\\n indexInWord := add(indexInWord, byte(0, mload(add(opcodeSkippableBytes, byte(indexInWord, word)))))\\n indexInWord := add(indexInWord, byte(0, mload(add(opcodeSkippableBytes, byte(indexInWord, word)))))\\n _pc := add(_pc, indexInWord)\\n\\n opNum := byte(indexInWord, word)\\n }\\n\\n // + push opcodes\\n // + stop opcodes [STOP(0x00),JUMP(0x56),RETURN(0xf3),INVALID(0xfe)]\\n // + caller opcode CALLER(0x33)\\n // + blacklisted opcodes\\n uint256 opBit = 1 << opNum;\\n if (opBit & opcodeGateMask == 0) {\\n if (opBit & opcodePushMask == 0) {\\n // all pushes are valid opcodes\\n // subsequent bytes are not opcodes. Skip them.\\n _pc += (opNum - 0x5e); // PUSH1 is 0x60, so opNum-0x5f = PUSHed bytes and we +1 to\\n // skip the _pc++; line below in order to save gas ((-0x5f + 1) = -0x5e)\\n continue;\\n } else if (opBit & opcodeHaltingMask == 0) {\\n // STOP or JUMP or RETURN or INVALID (Note: REVERT is blacklisted, so not included here)\\n // We are now inside unreachable code until we hit a JUMPDEST!\\n do {\\n _pc++;\\n assembly {\\n opNum := byte(0, mload(_pc))\\n }\\n // encountered a JUMPDEST\\n if (opNum == 0x5b) break;\\n // skip PUSHed bytes\\n if ((1 << opNum) & opcodePushMask == 0) _pc += (opNum - 0x5f); // opNum-0x5f = PUSHed bytes (PUSH1 is 0x60)\\n } while (_pc < codeLength);\\n // opNum is 0x5b, so we don't continue here since the pc++ is fine\\n } else if (opNum == 0x33) { // Caller opcode\\n uint256 firstOps; // next 32 bytes of bytecode\\n uint256 secondOps; // following 32 bytes of bytecode\\n\\n assembly {\\n firstOps := mload(_pc)\\n // 37 bytes total, 5 left over --> 32 - 5 bytes = 27 bytes = 216 bits\\n secondOps := shr(216, mload(add(_pc, 0x20)))\\n }\\n\\n // Call identity precompile\\n // CALLER POP PUSH1 0x00 PUSH1 0x04 GAS CALL\\n // 32 - 8 bytes = 24 bytes = 192\\n if ((firstOps >> 192) == 0x3350600060045af1) {\\n _pc += 8;\\n // Call EM and abort execution if instructed\\n // CALLER PUSH1 0x00 SWAP1 GAS CALL PC PUSH1 0x0E ADD JUMPI RETURNDATASIZE PUSH1 0x00 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x00 REVERT JUMPDEST RETURNDATASIZE PUSH1 0x01 EQ ISZERO PC PUSH1 0x0a ADD JUMPI PUSH1 0x01 PUSH1 0x00 RETURN JUMPDEST \\n } else if (firstOps == 0x336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a015760 && secondOps == 0x016000f35b) {\\n _pc += 37;\\n } else {\\n return false;\\n }\\n continue;\\n } else {\\n // encountered a non-whitelisted opcode!\\n return false;\\n }\\n }\\n _pc++;\\n } while (_pc < codeLength);\\n return true;\\n }\\n}\\n\",\"keccak256\":\"0xb1578ea95da5f6e7d5f5428ccc5efe629b3b9ef88fed7625fa7b78cdb9539508\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/execution/iOVM_SafetyChecker.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title iOVM_SafetyChecker\\n */\\ninterface iOVM_SafetyChecker {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function isBytecodeSafe(bytes calldata _bytecode) external pure returns (bool);\\n}\\n\",\"keccak256\":\"0xde6639676d4ec4f77297652d5ede2429bc93e74e11fefd9e9de4bc92dd784878\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x608060405234801561001057600080fd5b5061034a806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063a44eb59a14610030575b600080fd5b6100d66004803603602081101561004657600080fd5b81019060208101813564010000000081111561006157600080fd5b82018360208201111561007357600080fd5b8035906020019184600183028401116401000000008311171561009557600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506100ea945050505050565b604080519115158252519081900360200190f35b60408051610100810182527e0101010101010101010101000000000101010101010101010101010101000081526b010101010101000000010100600160f81b016020808301919091526f0101010100000001010101010000000092820192909252630203040560e01b60608201527f0101010101010101010101010101010101010101010101010101010101010101608082015264010101010160d81b60a0820152600060c0820181905260e0820181905283519092741fffffffff000000000f8f000063f000013fff0ffe916a40000000000000000000026117ff60f31b039163ffffffff60601b1991870181019087015b8051600081811a880151811a82811a890151821a0182811a890151821a0182811a890151821a0182811a890151821a0182811a89015190911a01918201911a6001811b86811661032057808516610239575001605d1901610326565b80861661027e575b8280600101935050825160001a915081605b141561025e57610279565b6001821b851661027157918101605e1901915b838310610241575b610320565b816033141561030f578251602084015160d81c673350600060045af160c083901c14156102b057600885019450610306565b817f336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a0157601480156102e357508064016000f35b145b156102f357602585019450610306565b60009a5050505050505050505050610338565b50505050610326565b600098505050505050505050610338565b50506001015b8181106101dd57600196505050505050505b91905056fea164736f6c6343000706000a", - "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061002b5760003560e01c8063a44eb59a14610030575b600080fd5b6100d66004803603602081101561004657600080fd5b81019060208101813564010000000081111561006157600080fd5b82018360208201111561007357600080fd5b8035906020019184600183028401116401000000008311171561009557600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506100ea945050505050565b604080519115158252519081900360200190f35b60408051610100810182527e0101010101010101010101000000000101010101010101010101010101000081526b010101010101000000010100600160f81b016020808301919091526f0101010100000001010101010000000092820192909252630203040560e01b60608201527f0101010101010101010101010101010101010101010101010101010101010101608082015264010101010160d81b60a0820152600060c0820181905260e0820181905283519092741fffffffff000000000f8f000063f000013fff0ffe916a40000000000000000000026117ff60f31b039163ffffffff60601b1991870181019087015b8051600081811a880151811a82811a890151821a0182811a890151821a0182811a890151821a0182811a890151821a0182811a89015190911a01918201911a6001811b86811661032057808516610239575001605d1901610326565b80861661027e575b8280600101935050825160001a915081605b141561025e57610279565b6001821b851661027157918101605e1901915b838310610241575b610320565b816033141561030f578251602084015160d81c673350600060045af160c083901c14156102b057600885019450610306565b817f336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a0157601480156102e357508064016000f35b145b156102f357602585019450610306565b60009a5050505050505050505050610338565b50505050610326565b600098505050505050505050610338565b50506001015b8181106101dd57600196505050505050505b91905056fea164736f6c6343000706000a", + "solcInputHash": "f2bdab652d5102f5f11e78dae866798d", + "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_bytecode\",\"type\":\"bytes\"}],\"name\":\"isBytecodeSafe\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The Safety Checker verifies that contracts deployed on L2 do not contain any \\\"unsafe\\\" operations. An operation is considered unsafe if it would access state variables which are specific to the environment (ie. L1 or L2) in which it is executed, as this could be used to \\\"escape the sandbox\\\" of the OVM, resulting in non-deterministic fraud proofs. That is, an attacker would be able to \\\"prove fraud\\\" on an honestly applied transaction. Note that a \\\"safe\\\" contract requires opcodes to appear in a particular pattern; omission of \\\"unsafe\\\" opcodes is necessary, but not sufficient. Compiler used: solc Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"isBytecodeSafe(bytes)\":{\"params\":{\"_bytecode\":\"The bytecode to safety check.\"},\"returns\":{\"_0\":\"`true` if the bytecode is safe, `false` otherwise.\"}}},\"title\":\"OVM_SafetyChecker\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"isBytecodeSafe(bytes)\":{\"notice\":\"Returns whether or not all of the provided bytecode is safe.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/OVM/execution/OVM_SafetyChecker.sol\":\"OVM_SafetyChecker\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/optimistic-ethereum/OVM/execution/OVM_SafetyChecker.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Interface Imports */\\nimport { iOVM_SafetyChecker } from \\\"../../iOVM/execution/iOVM_SafetyChecker.sol\\\";\\n\\n/**\\n * @title OVM_SafetyChecker\\n * @dev The Safety Checker verifies that contracts deployed on L2 do not contain any\\n * \\\"unsafe\\\" operations. An operation is considered unsafe if it would access state variables which\\n * are specific to the environment (ie. L1 or L2) in which it is executed, as this could be used\\n * to \\\"escape the sandbox\\\" of the OVM, resulting in non-deterministic fraud proofs.\\n * That is, an attacker would be able to \\\"prove fraud\\\" on an honestly applied transaction.\\n * Note that a \\\"safe\\\" contract requires opcodes to appear in a particular pattern;\\n * omission of \\\"unsafe\\\" opcodes is necessary, but not sufficient.\\n *\\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract OVM_SafetyChecker is iOVM_SafetyChecker {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Returns whether or not all of the provided bytecode is safe.\\n * @param _bytecode The bytecode to safety check.\\n * @return `true` if the bytecode is safe, `false` otherwise.\\n */\\n function isBytecodeSafe(\\n bytes memory _bytecode\\n )\\n override\\n external\\n pure\\n returns (\\n bool\\n )\\n {\\n // autogenerated by gen_safety_checker_constants.py\\n // number of bytes to skip for each opcode\\n uint256[8] memory opcodeSkippableBytes = [\\n uint256(0x0001010101010101010101010000000001010101010101010101010101010000),\\n uint256(0x0100000000000000000000000000000000000000010101010101000000010100),\\n uint256(0x0000000000000000000000000000000001010101000000010101010100000000),\\n uint256(0x0203040500000000000000000000000000000000000000000000000000000000),\\n uint256(0x0101010101010101010101010101010101010101010101010101010101010101),\\n uint256(0x0101010101000000000000000000000000000000000000000000000000000000),\\n uint256(0x0000000000000000000000000000000000000000000000000000000000000000),\\n uint256(0x0000000000000000000000000000000000000000000000000000000000000000)\\n ];\\n // Mask to gate opcode specific cases\\n uint256 opcodeGateMask = ~uint256(0xffffffffffffffffffffffe000000000fffffffff070ffff9c0ffffec000f001);\\n // Halting opcodes\\n uint256 opcodeHaltingMask = ~uint256(0x4008000000000000000000000000000000000000004000000000000000000001);\\n // PUSH opcodes\\n uint256 opcodePushMask = ~uint256(0xffffffff000000000000000000000000);\\n\\n uint256 codeLength;\\n uint256 _pc;\\n assembly {\\n _pc := add(_bytecode, 0x20)\\n }\\n codeLength = _pc + _bytecode.length;\\n do {\\n // current opcode: 0x00...0xff\\n uint256 opNum;\\n\\n // inline assembly removes the extra add + bounds check\\n assembly {\\n let word := mload(_pc) //load the next 32 bytes at pc into word\\n\\n // Look up number of bytes to skip from opcodeSkippableBytes and then update indexInWord\\n // E.g. the 02030405 in opcodeSkippableBytes is the number of bytes to skip for PUSH1->4\\n // We repeat this 6 times, thus we can only skip bytes for up to PUSH4 ((1+4) * 6 = 30 < 32).\\n // If we see an opcode that is listed as 0 skippable bytes e.g. PUSH5,\\n // then we will get stuck on that indexInWord and then opNum will be set to the PUSH5 opcode.\\n let indexInWord := byte(0, mload(add(opcodeSkippableBytes, byte(0, word))))\\n indexInWord := add(indexInWord, byte(0, mload(add(opcodeSkippableBytes, byte(indexInWord, word)))))\\n indexInWord := add(indexInWord, byte(0, mload(add(opcodeSkippableBytes, byte(indexInWord, word)))))\\n indexInWord := add(indexInWord, byte(0, mload(add(opcodeSkippableBytes, byte(indexInWord, word)))))\\n indexInWord := add(indexInWord, byte(0, mload(add(opcodeSkippableBytes, byte(indexInWord, word)))))\\n indexInWord := add(indexInWord, byte(0, mload(add(opcodeSkippableBytes, byte(indexInWord, word)))))\\n _pc := add(_pc, indexInWord)\\n\\n opNum := byte(indexInWord, word)\\n }\\n\\n // + push opcodes\\n // + stop opcodes [STOP(0x00),JUMP(0x56),RETURN(0xf3),INVALID(0xfe)]\\n // + caller opcode CALLER(0x33)\\n // + blacklisted opcodes\\n uint256 opBit = 1 << opNum;\\n if (opBit & opcodeGateMask == 0) {\\n if (opBit & opcodePushMask == 0) {\\n // all pushes are valid opcodes\\n // subsequent bytes are not opcodes. Skip them.\\n _pc += (opNum - 0x5e); // PUSH1 is 0x60, so opNum-0x5f = PUSHed bytes and we +1 to\\n // skip the _pc++; line below in order to save gas ((-0x5f + 1) = -0x5e)\\n continue;\\n } else if (opBit & opcodeHaltingMask == 0) {\\n // STOP or JUMP or RETURN or INVALID (Note: REVERT is blacklisted, so not included here)\\n // We are now inside unreachable code until we hit a JUMPDEST!\\n do {\\n _pc++;\\n assembly {\\n opNum := byte(0, mload(_pc))\\n }\\n // encountered a JUMPDEST\\n if (opNum == 0x5b) break;\\n // skip PUSHed bytes\\n if ((1 << opNum) & opcodePushMask == 0) _pc += (opNum - 0x5f); // opNum-0x5f = PUSHed bytes (PUSH1 is 0x60)\\n } while (_pc < codeLength);\\n // opNum is 0x5b, so we don't continue here since the pc++ is fine\\n } else if (opNum == 0x33) { // Caller opcode\\n uint256 firstOps; // next 32 bytes of bytecode\\n uint256 secondOps; // following 32 bytes of bytecode\\n\\n assembly {\\n firstOps := mload(_pc)\\n // 37 bytes total, 5 left over --> 32 - 5 bytes = 27 bytes = 216 bits\\n secondOps := shr(216, mload(add(_pc, 0x20)))\\n }\\n\\n // Call identity precompile\\n // CALLER POP PUSH1 0x00 PUSH1 0x04 GAS CALL\\n // 32 - 8 bytes = 24 bytes = 192\\n if ((firstOps >> 192) == 0x3350600060045af1) {\\n _pc += 8;\\n // Call EM and abort execution if instructed\\n // CALLER PUSH1 0x00 SWAP1 GAS CALL PC PUSH1 0x0E ADD JUMPI RETURNDATASIZE PUSH1 0x00 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x00 REVERT JUMPDEST RETURNDATASIZE PUSH1 0x01 EQ ISZERO PC PUSH1 0x0a ADD JUMPI PUSH1 0x01 PUSH1 0x00 RETURN JUMPDEST\\n } else if (firstOps == 0x336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a015760 && secondOps == 0x016000f35b) {\\n _pc += 37;\\n } else {\\n return false;\\n }\\n continue;\\n } else {\\n // encountered a non-whitelisted opcode!\\n return false;\\n }\\n }\\n _pc++;\\n } while (_pc < codeLength);\\n return true;\\n }\\n}\\n\",\"keccak256\":\"0x44cd4fcdcb25a233fa98da5ba66706ce2f9fbf13359cf7f2891793739687a86f\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/execution/iOVM_SafetyChecker.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title iOVM_SafetyChecker\\n */\\ninterface iOVM_SafetyChecker {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function isBytecodeSafe(bytes calldata _bytecode) external pure returns (bool);\\n}\\n\",\"keccak256\":\"0xde6639676d4ec4f77297652d5ede2429bc93e74e11fefd9e9de4bc92dd784878\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x608060405234801561001057600080fd5b50610373806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063a44eb59a14610030575b600080fd5b6100d66004803603602081101561004657600080fd5b81019060208101813564010000000081111561006157600080fd5b82018360208201111561007357600080fd5b8035906020019184600183028401116401000000008311171561009557600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506100ea945050505050565b604080519115158252519081900360200190f35b60408051610100810182527e0101010101010101010101000000000101010101010101010101010101000081526b010101010101000000010100600160f81b016020808301919091526f0101010100000001010101010000000092820192909252630203040560e01b60608201527f0101010101010101010101010101010101010101010101010101010101010101608082015264010101010160d81b60a0820152600060c0820181905260e0820181905283519092741fffffffff000000000f8f000063f000013fff0ffe916a40000000000000000000026117ff60f31b039163ffffffff60601b1991870181019087015b8051600081811a880151811a82811a890151821a0182811a890151821a0182811a890151821a0182811a890151821a0182811a89015190911a01918201911a6001811b86811661032057808516610239575001605d1901610326565b80861661027e575b8280600101935050825160001a915081605b141561025e57610279565b6001821b851661027157918101605e1901915b838310610241575b610320565b816033141561030f578251602084015160d81c673350600060045af160c083901c14156102b057600885019450610306565b817f336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a0157601480156102e357508064016000f35b145b156102f357602585019450610306565b60009a5050505050505050505050610338565b50505050610326565b600098505050505050505050610338565b50506001015b8181106101dd57600196505050505050505b91905056fea26469706673582212209a836b268dcf58167a9f65bb872e3ddb5bd93b231f6b456f1c5e6d75b92a746364736f6c63430007060033", + "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061002b5760003560e01c8063a44eb59a14610030575b600080fd5b6100d66004803603602081101561004657600080fd5b81019060208101813564010000000081111561006157600080fd5b82018360208201111561007357600080fd5b8035906020019184600183028401116401000000008311171561009557600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506100ea945050505050565b604080519115158252519081900360200190f35b60408051610100810182527e0101010101010101010101000000000101010101010101010101010101000081526b010101010101000000010100600160f81b016020808301919091526f0101010100000001010101010000000092820192909252630203040560e01b60608201527f0101010101010101010101010101010101010101010101010101010101010101608082015264010101010160d81b60a0820152600060c0820181905260e0820181905283519092741fffffffff000000000f8f000063f000013fff0ffe916a40000000000000000000026117ff60f31b039163ffffffff60601b1991870181019087015b8051600081811a880151811a82811a890151821a0182811a890151821a0182811a890151821a0182811a890151821a0182811a89015190911a01918201911a6001811b86811661032057808516610239575001605d1901610326565b80861661027e575b8280600101935050825160001a915081605b141561025e57610279565b6001821b851661027157918101605e1901915b838310610241575b610320565b816033141561030f578251602084015160d81c673350600060045af160c083901c14156102b057600885019450610306565b817f336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a0157601480156102e357508064016000f35b145b156102f357602585019450610306565b60009a5050505050505050505050610338565b50505050610326565b600098505050505050505050610338565b50506001015b8181106101dd57600196505050505050505b91905056fea26469706673582212209a836b268dcf58167a9f65bb872e3ddb5bd93b231f6b456f1c5e6d75b92a746364736f6c63430007060033", "devdoc": { - "details": "The Safety Checker verifies that contracts deployed on L2 do not contain any \"unsafe\" operations. An operation is considered unsafe if it would access state variables which are specific to the environment (ie. L1 or L2) in which it is executed, as this could be used to \"escape the sandbox\" of the OVM, resulting in non-deterministic fraud proofs. That is, an attacker would be able to \"prove fraud\" on an honestly applied transaction. Note that a \"safe\" contract requires opcodes to appear in a particular pattern; omission of \"unsafe\" opcodes is necessary, but not sufficient. Compiler used: solc Runtime target: EVM", + "details": "The Safety Checker verifies that contracts deployed on L2 do not contain any \"unsafe\" operations. An operation is considered unsafe if it would access state variables which are specific to the environment (ie. L1 or L2) in which it is executed, as this could be used to \"escape the sandbox\" of the OVM, resulting in non-deterministic fraud proofs. That is, an attacker would be able to \"prove fraud\" on an honestly applied transaction. Note that a \"safe\" contract requires opcodes to appear in a particular pattern; omission of \"unsafe\" opcodes is necessary, but not sufficient. Compiler used: solc Runtime target: EVM", "kind": "dev", "methods": { "isBytecodeSafe(bytes)": { diff --git a/packages/contracts/deployments/mainnet/OVM_StateCommitmentChain.json b/packages/contracts/deployments/mainnet/OVM_StateCommitmentChain.json index e6ba31aecc5f5..e8ee7024245f3 100644 --- a/packages/contracts/deployments/mainnet/OVM_StateCommitmentChain.json +++ b/packages/contracts/deployments/mainnet/OVM_StateCommitmentChain.json @@ -1,5 +1,5 @@ { - "address": "0x1D0C46671E0696a4Ba800032D5195d5b0f8c60A3", + "address": "0x6786EB419547a4902d285F70c6acDbC9AefAdB6F", "abi": [ { "inputs": [ @@ -285,7 +285,7 @@ "outputs": [ { "internalType": "address", - "name": "_contract", + "name": "", "type": "address" } ], @@ -361,31 +361,31 @@ "type": "function" } ], - "transactionHash": "0x55c4bd0ef856cd6f3fa739cd315213942f827fe0174ff33db6e7e5628b64c545", + "transactionHash": "0x6835e7f23e2e75efc416767d52c468e23bb336602cc8f0e962ab5b2cb06f881c", "receipt": { "to": null, - "from": "0x77C4c8f491e5ff22a2C0E18b005c3BA0Fe36c1Bc", - "contractAddress": "0x1D0C46671E0696a4Ba800032D5195d5b0f8c60A3", - "transactionIndex": 83, - "gasUsed": "1615807", + "from": "0xd033f09cB85621F98F7A84C64dB381ac16Eff818", + "contractAddress": "0x6786EB419547a4902d285F70c6acDbC9AefAdB6F", + "transactionIndex": 175, + "gasUsed": "1630165", "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0x7b2a90c7c86cd2e35c2b2944cea61f8da0f7137460e7400c9ef13e62d520c7d9", - "transactionHash": "0x55c4bd0ef856cd6f3fa739cd315213942f827fe0174ff33db6e7e5628b64c545", + "blockHash": "0xfa4978a1df9e8790b1830bcbc4286faec9799b39dda0dd035ae59b8d54e8b6d4", + "transactionHash": "0x6835e7f23e2e75efc416767d52c468e23bb336602cc8f0e962ab5b2cb06f881c", "logs": [], - "blockNumber": 12207798, - "cumulativeGasUsed": "7328021", + "blockNumber": 12410815, + "cumulativeGasUsed": "9861812", "status": 1, "byzantium": true }, "args": [ - "0xd3EeD86464Ff13B4BFD81a3bB1e753b7ceBA3A39", - 600, - 18000000 + "0x668E5b997b9aE88a56cd40409119d4Db9e6d752E", + 604800, + 15770000 ], - "solcInputHash": "43ee6bb8ef92595aa6d0e22a6c464dff", - "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_fraudProofWindow\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_sequencerPublishWindow\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_batchIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"_batchRoot\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_batchSize\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_prevTotalElements\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"_extraData\",\"type\":\"bytes\"}],\"name\":\"StateBatchAppended\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_batchIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"_batchRoot\",\"type\":\"bytes32\"}],\"name\":\"StateBatchDeleted\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"FRAUD_PROOF_WINDOW\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"SEQUENCER_PUBLISH_WINDOW\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"_batch\",\"type\":\"bytes32[]\"},{\"internalType\":\"uint256\",\"name\":\"_shouldStartAtElement\",\"type\":\"uint256\"}],\"name\":\"appendStateBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"batches\",\"outputs\":[{\"internalType\":\"contract iOVM_ChainStorageContainer\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"_batchHeader\",\"type\":\"tuple\"}],\"name\":\"deleteStateBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLastSequencerTimestamp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_lastSequencerTimestamp\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTotalBatches\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_totalBatches\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTotalElements\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_totalElements\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"_batchHeader\",\"type\":\"tuple\"}],\"name\":\"insideFraudProofWindow\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"_inside\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"_contract\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_element\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"_batchHeader\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"siblings\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct Lib_OVMCodec.ChainInclusionProof\",\"name\":\"_proof\",\"type\":\"tuple\"}],\"name\":\"verifyStateCommitment\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The State Commitment Chain (SCC) contract contains a list of proposed state roots which Proposers assert to be a result of each transaction in the Canonical Transaction Chain (CTC). Elements here have a 1:1 correspondence with transactions in the CTC, and should be the unique state root calculated off-chain by applying the canonical transactions one by one. Compiler used: solc Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"appendStateBatch(bytes32[],uint256)\":{\"params\":{\"_batch\":\"Batch of state roots.\",\"_shouldStartAtElement\":\"Index of the element at which this batch should start.\"}},\"batches()\":{\"returns\":{\"_0\":\"Reference to the batch storage container.\"}},\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\"}},\"deleteStateBatch((uint256,bytes32,uint256,uint256,bytes))\":{\"params\":{\"_batchHeader\":\"Header of the batch to start deleting from.\"}},\"getLastSequencerTimestamp()\":{\"returns\":{\"_lastSequencerTimestamp\":\"Last sequencer batch timestamp.\"}},\"getTotalBatches()\":{\"returns\":{\"_totalBatches\":\"Total submitted batches.\"}},\"getTotalElements()\":{\"returns\":{\"_totalElements\":\"Total submitted elements.\"}},\"insideFraudProofWindow((uint256,bytes32,uint256,uint256,bytes))\":{\"params\":{\"_batchHeader\":\"Header of the batch to check.\"},\"returns\":{\"_inside\":\"Whether or not the batch is inside the fraud proof window.\"}},\"verifyStateCommitment(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))\":{\"params\":{\"_batchHeader\":\"Header of the batch in which the element was included.\",\"_element\":\"Hash of the element to verify a proof for.\",\"_proof\":\"Merkle inclusion proof for the element.\"}}},\"title\":\"OVM_StateCommitmentChain\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"appendStateBatch(bytes32[],uint256)\":{\"notice\":\"Appends a batch of state roots to the chain.\"},\"batches()\":{\"notice\":\"Accesses the batch storage container.\"},\"deleteStateBatch((uint256,bytes32,uint256,uint256,bytes))\":{\"notice\":\"Deletes all state roots after (and including) a given batch.\"},\"getLastSequencerTimestamp()\":{\"notice\":\"Retrieves the timestamp of the last batch submitted by the sequencer.\"},\"getTotalBatches()\":{\"notice\":\"Retrieves the total number of batches submitted.\"},\"getTotalElements()\":{\"notice\":\"Retrieves the total number of elements submitted.\"},\"insideFraudProofWindow((uint256,bytes32,uint256,uint256,bytes))\":{\"notice\":\"Checks whether a given batch is still inside its fraud proof window.\"},\"verifyStateCommitment(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))\":{\"notice\":\"Verifies a batch inclusion proof.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/OVM/chain/OVM_StateCommitmentChain.sol\":\"OVM_StateCommitmentChain\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/math/SafeMath.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\n * checks.\\n *\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\n * in bugs, because programmers usually assume that an overflow raises an\\n * error, which is the standard behavior in high level programming languages.\\n * `SafeMath` restores this intuition by reverting the transaction when an\\n * operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n */\\nlibrary SafeMath {\\n /**\\n * @dev Returns the addition of two unsigned integers, with an overflow flag.\\n *\\n * _Available since v3.4._\\n */\\n function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n uint256 c = a + b;\\n if (c < a) return (false, 0);\\n return (true, c);\\n }\\n\\n /**\\n * @dev Returns the substraction of two unsigned integers, with an overflow flag.\\n *\\n * _Available since v3.4._\\n */\\n function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n if (b > a) return (false, 0);\\n return (true, a - b);\\n }\\n\\n /**\\n * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\\n *\\n * _Available since v3.4._\\n */\\n function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\n // benefit is lost if 'b' is also tested.\\n // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\n if (a == 0) return (true, 0);\\n uint256 c = a * b;\\n if (c / a != b) return (false, 0);\\n return (true, c);\\n }\\n\\n /**\\n * @dev Returns the division of two unsigned integers, with a division by zero flag.\\n *\\n * _Available since v3.4._\\n */\\n function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n if (b == 0) return (false, 0);\\n return (true, a / b);\\n }\\n\\n /**\\n * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\\n *\\n * _Available since v3.4._\\n */\\n function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n if (b == 0) return (false, 0);\\n return (true, a % b);\\n }\\n\\n /**\\n * @dev Returns the addition of two unsigned integers, reverting on\\n * overflow.\\n *\\n * Counterpart to Solidity's `+` operator.\\n *\\n * Requirements:\\n *\\n * - Addition cannot overflow.\\n */\\n function add(uint256 a, uint256 b) internal pure returns (uint256) {\\n uint256 c = a + b;\\n require(c >= a, \\\"SafeMath: addition overflow\\\");\\n return c;\\n }\\n\\n /**\\n * @dev Returns the subtraction of two unsigned integers, reverting on\\n * overflow (when the result is negative).\\n *\\n * Counterpart to Solidity's `-` operator.\\n *\\n * Requirements:\\n *\\n * - Subtraction cannot overflow.\\n */\\n function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\n require(b <= a, \\\"SafeMath: subtraction overflow\\\");\\n return a - b;\\n }\\n\\n /**\\n * @dev Returns the multiplication of two unsigned integers, reverting on\\n * overflow.\\n *\\n * Counterpart to Solidity's `*` operator.\\n *\\n * Requirements:\\n *\\n * - Multiplication cannot overflow.\\n */\\n function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\n if (a == 0) return 0;\\n uint256 c = a * b;\\n require(c / a == b, \\\"SafeMath: multiplication overflow\\\");\\n return c;\\n }\\n\\n /**\\n * @dev Returns the integer division of two unsigned integers, reverting on\\n * division by zero. The result is rounded towards zero.\\n *\\n * Counterpart to Solidity's `/` operator. Note: this function uses a\\n * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n * uses an invalid opcode to revert (consuming all remaining gas).\\n *\\n * Requirements:\\n *\\n * - The divisor cannot be zero.\\n */\\n function div(uint256 a, uint256 b) internal pure returns (uint256) {\\n require(b > 0, \\\"SafeMath: division by zero\\\");\\n return a / b;\\n }\\n\\n /**\\n * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n * reverting when dividing by zero.\\n *\\n * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n * opcode (which leaves remaining gas untouched) while Solidity uses an\\n * invalid opcode to revert (consuming all remaining gas).\\n *\\n * Requirements:\\n *\\n * - The divisor cannot be zero.\\n */\\n function mod(uint256 a, uint256 b) internal pure returns (uint256) {\\n require(b > 0, \\\"SafeMath: modulo by zero\\\");\\n return a % b;\\n }\\n\\n /**\\n * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\n * overflow (when the result is negative).\\n *\\n * CAUTION: This function is deprecated because it requires allocating memory for the error\\n * message unnecessarily. For custom revert reasons use {trySub}.\\n *\\n * Counterpart to Solidity's `-` operator.\\n *\\n * Requirements:\\n *\\n * - Subtraction cannot overflow.\\n */\\n function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n require(b <= a, errorMessage);\\n return a - b;\\n }\\n\\n /**\\n * @dev Returns the integer division of two unsigned integers, reverting with custom message on\\n * division by zero. The result is rounded towards zero.\\n *\\n * CAUTION: This function is deprecated because it requires allocating memory for the error\\n * message unnecessarily. For custom revert reasons use {tryDiv}.\\n *\\n * Counterpart to Solidity's `/` operator. Note: this function uses a\\n * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n * uses an invalid opcode to revert (consuming all remaining gas).\\n *\\n * Requirements:\\n *\\n * - The divisor cannot be zero.\\n */\\n function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n require(b > 0, errorMessage);\\n return a / b;\\n }\\n\\n /**\\n * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n * reverting with custom message when dividing by zero.\\n *\\n * CAUTION: This function is deprecated because it requires allocating memory for the error\\n * message unnecessarily. For custom revert reasons use {tryMod}.\\n *\\n * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n * opcode (which leaves remaining gas untouched) while Solidity uses an\\n * invalid opcode to revert (consuming all remaining gas).\\n *\\n * Requirements:\\n *\\n * - The divisor cannot be zero.\\n */\\n function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n require(b > 0, errorMessage);\\n return a % b;\\n }\\n}\\n\",\"keccak256\":\"0xcc78a17dd88fa5a2edc60c8489e2f405c0913b377216a5b26b35656b2d0dab52\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/chain/OVM_StateCommitmentChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\nimport { Lib_MerkleTree } from \\\"../../libraries/utils/Lib_MerkleTree.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_FraudVerifier } from \\\"../../iOVM/verification/iOVM_FraudVerifier.sol\\\";\\nimport { iOVM_StateCommitmentChain } from \\\"../../iOVM/chain/iOVM_StateCommitmentChain.sol\\\";\\nimport { iOVM_CanonicalTransactionChain } from \\\"../../iOVM/chain/iOVM_CanonicalTransactionChain.sol\\\";\\nimport { iOVM_BondManager } from \\\"../../iOVM/verification/iOVM_BondManager.sol\\\";\\nimport { iOVM_ChainStorageContainer } from \\\"../../iOVM/chain/iOVM_ChainStorageContainer.sol\\\";\\n\\n/* External Imports */\\nimport '@openzeppelin/contracts/math/SafeMath.sol';\\n\\n/**\\n * @title OVM_StateCommitmentChain\\n * @dev The State Commitment Chain (SCC) contract contains a list of proposed state roots which\\n * Proposers assert to be a result of each transaction in the Canonical Transaction Chain (CTC).\\n * Elements here have a 1:1 correspondence with transactions in the CTC, and should be the unique\\n * state root calculated off-chain by applying the canonical transactions one by one.\\n *\\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract OVM_StateCommitmentChain is iOVM_StateCommitmentChain, Lib_AddressResolver {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 public FRAUD_PROOF_WINDOW;\\n uint256 public SEQUENCER_PUBLISH_WINDOW;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n */\\n constructor(\\n address _libAddressManager,\\n uint256 _fraudProofWindow,\\n uint256 _sequencerPublishWindow\\n )\\n Lib_AddressResolver(_libAddressManager)\\n {\\n FRAUD_PROOF_WINDOW = _fraudProofWindow;\\n SEQUENCER_PUBLISH_WINDOW = _sequencerPublishWindow;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Accesses the batch storage container.\\n * @return Reference to the batch storage container.\\n */\\n function batches()\\n public\\n view\\n returns (\\n iOVM_ChainStorageContainer\\n )\\n {\\n return iOVM_ChainStorageContainer(\\n resolve(\\\"OVM_ChainStorageContainer:SCC:batches\\\")\\n );\\n }\\n\\n /**\\n * @inheritdoc iOVM_StateCommitmentChain\\n */\\n function getTotalElements()\\n override\\n public\\n view\\n returns (\\n uint256 _totalElements\\n )\\n {\\n (uint40 totalElements, ) = _getBatchExtraData();\\n return uint256(totalElements);\\n }\\n\\n /**\\n * @inheritdoc iOVM_StateCommitmentChain\\n */\\n function getTotalBatches()\\n override\\n public\\n view\\n returns (\\n uint256 _totalBatches\\n )\\n {\\n return batches().length();\\n }\\n\\n /**\\n * @inheritdoc iOVM_StateCommitmentChain\\n */\\n function getLastSequencerTimestamp()\\n override\\n public\\n view\\n returns (\\n uint256 _lastSequencerTimestamp\\n )\\n {\\n (, uint40 lastSequencerTimestamp) = _getBatchExtraData();\\n return uint256(lastSequencerTimestamp);\\n }\\n\\n /**\\n * @inheritdoc iOVM_StateCommitmentChain\\n */\\n function appendStateBatch(\\n bytes32[] memory _batch,\\n uint256 _shouldStartAtElement\\n )\\n override\\n public\\n {\\n // Fail fast in to make sure our batch roots aren't accidentally made fraudulent by the\\n // publication of batches by some other user.\\n require(\\n _shouldStartAtElement == getTotalElements(),\\n \\\"Actual batch start index does not match expected start index.\\\"\\n );\\n\\n // Proposers must have previously staked at the BondManager\\n require(\\n iOVM_BondManager(resolve(\\\"OVM_BondManager\\\")).isCollateralized(msg.sender),\\n \\\"Proposer does not have enough collateral posted\\\"\\n );\\n\\n require(\\n _batch.length > 0,\\n \\\"Cannot submit an empty state batch.\\\"\\n );\\n\\n require(\\n getTotalElements() + _batch.length <= iOVM_CanonicalTransactionChain(resolve(\\\"OVM_CanonicalTransactionChain\\\")).getTotalElements(),\\n \\\"Number of state roots cannot exceed the number of canonical transactions.\\\"\\n );\\n\\n // Pass the block's timestamp and the publisher of the data\\n // to be used in the fraud proofs\\n _appendBatch(\\n _batch,\\n abi.encode(block.timestamp, msg.sender)\\n );\\n }\\n\\n /**\\n * @inheritdoc iOVM_StateCommitmentChain\\n */\\n function deleteStateBatch(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n override\\n public\\n {\\n require(\\n msg.sender == resolve(\\\"OVM_FraudVerifier\\\"),\\n \\\"State batches can only be deleted by the OVM_FraudVerifier.\\\"\\n );\\n\\n require(\\n _isValidBatchHeader(_batchHeader),\\n \\\"Invalid batch header.\\\"\\n );\\n\\n require(\\n insideFraudProofWindow(_batchHeader),\\n \\\"State batches can only be deleted within the fraud proof window.\\\"\\n );\\n\\n _deleteBatch(_batchHeader);\\n }\\n\\n /**\\n * @inheritdoc iOVM_StateCommitmentChain\\n */\\n function verifyStateCommitment(\\n bytes32 _element,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _proof\\n )\\n override\\n public\\n view\\n returns (\\n bool\\n )\\n {\\n require(\\n _isValidBatchHeader(_batchHeader),\\n \\\"Invalid batch header.\\\"\\n );\\n\\n require(\\n Lib_MerkleTree.verify(\\n _batchHeader.batchRoot,\\n _element,\\n _proof.index,\\n _proof.siblings,\\n _batchHeader.batchSize\\n ),\\n \\\"Invalid inclusion proof.\\\"\\n );\\n\\n return true;\\n }\\n\\n /**\\n * @inheritdoc iOVM_StateCommitmentChain\\n */\\n function insideFraudProofWindow(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n override\\n public\\n view\\n returns (\\n bool _inside\\n )\\n {\\n (uint256 timestamp,) = abi.decode(\\n _batchHeader.extraData,\\n (uint256, address)\\n );\\n\\n require(\\n timestamp != 0,\\n \\\"Batch header timestamp cannot be zero\\\"\\n );\\n return SafeMath.add(timestamp, FRAUD_PROOF_WINDOW) > block.timestamp;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Parses the batch context from the extra data.\\n * @return Total number of elements submitted.\\n * @return Timestamp of the last batch submitted by the sequencer.\\n */\\n function _getBatchExtraData()\\n internal\\n view\\n returns (\\n uint40,\\n uint40\\n )\\n {\\n bytes27 extraData = batches().getGlobalMetadata();\\n\\n uint40 totalElements;\\n uint40 lastSequencerTimestamp;\\n assembly {\\n extraData := shr(40, extraData)\\n totalElements := and(extraData, 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF)\\n lastSequencerTimestamp := shr(40, and(extraData, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000))\\n }\\n\\n return (\\n totalElements,\\n lastSequencerTimestamp\\n );\\n }\\n\\n /**\\n * Encodes the batch context for the extra data.\\n * @param _totalElements Total number of elements submitted.\\n * @param _lastSequencerTimestamp Timestamp of the last batch submitted by the sequencer.\\n * @return Encoded batch context.\\n */\\n function _makeBatchExtraData(\\n uint40 _totalElements,\\n uint40 _lastSequencerTimestamp\\n )\\n internal\\n pure\\n returns (\\n bytes27\\n )\\n {\\n bytes27 extraData;\\n assembly {\\n extraData := _totalElements\\n extraData := or(extraData, shl(40, _lastSequencerTimestamp))\\n extraData := shl(40, extraData)\\n }\\n\\n return extraData;\\n }\\n\\n /**\\n * Appends a batch to the chain.\\n * @param _batch Elements within the batch.\\n * @param _extraData Any extra data to append to the batch.\\n */\\n function _appendBatch(\\n bytes32[] memory _batch,\\n bytes memory _extraData\\n )\\n internal\\n {\\n address sequencer = resolve(\\\"OVM_Proposer\\\");\\n (uint40 totalElements, uint40 lastSequencerTimestamp) = _getBatchExtraData();\\n\\n if (msg.sender == sequencer) {\\n lastSequencerTimestamp = uint40(block.timestamp);\\n } else {\\n // We keep track of the last batch submitted by the sequencer so there's a window in\\n // which only the sequencer can publish state roots. A window like this just reduces\\n // the chance of \\\"system breaking\\\" state roots being published while we're still in\\n // testing mode. This window should be removed or significantly reduced in the future.\\n require(\\n lastSequencerTimestamp + SEQUENCER_PUBLISH_WINDOW < block.timestamp,\\n \\\"Cannot publish state roots within the sequencer publication window.\\\"\\n );\\n }\\n\\n // For efficiency reasons getMerkleRoot modifies the `_batch` argument in place\\n // while calculating the root hash therefore any arguments passed to it must not\\n // be used again afterwards\\n Lib_OVMCodec.ChainBatchHeader memory batchHeader = Lib_OVMCodec.ChainBatchHeader({\\n batchIndex: getTotalBatches(),\\n batchRoot: Lib_MerkleTree.getMerkleRoot(_batch),\\n batchSize: _batch.length,\\n prevTotalElements: totalElements,\\n extraData: _extraData\\n });\\n\\n emit StateBatchAppended(\\n batchHeader.batchIndex,\\n batchHeader.batchRoot,\\n batchHeader.batchSize,\\n batchHeader.prevTotalElements,\\n batchHeader.extraData\\n );\\n\\n batches().push(\\n Lib_OVMCodec.hashBatchHeader(batchHeader),\\n _makeBatchExtraData(\\n uint40(batchHeader.prevTotalElements + batchHeader.batchSize),\\n lastSequencerTimestamp\\n )\\n );\\n }\\n\\n /**\\n * Removes a batch and all subsequent batches from the chain.\\n * @param _batchHeader Header of the batch to remove.\\n */\\n function _deleteBatch(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n internal\\n {\\n require(\\n _batchHeader.batchIndex < batches().length(),\\n \\\"Invalid batch index.\\\"\\n );\\n\\n require(\\n _isValidBatchHeader(_batchHeader),\\n \\\"Invalid batch header.\\\"\\n );\\n\\n batches().deleteElementsAfterInclusive(\\n _batchHeader.batchIndex,\\n _makeBatchExtraData(\\n uint40(_batchHeader.prevTotalElements),\\n 0\\n )\\n );\\n\\n emit StateBatchDeleted(\\n _batchHeader.batchIndex,\\n _batchHeader.batchRoot\\n );\\n }\\n\\n /**\\n * Checks that a batch header matches the stored hash for the given index.\\n * @param _batchHeader Batch header to validate.\\n * @return Whether or not the header matches the stored one.\\n */\\n function _isValidBatchHeader(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n internal\\n view\\n returns (\\n bool\\n )\\n {\\n return Lib_OVMCodec.hashBatchHeader(_batchHeader) == batches().get(_batchHeader.batchIndex);\\n }\\n}\\n\",\"keccak256\":\"0x5b72c845f856a06c978880d3cb2db40dafebaebf399df100c6ac832eaf41d7bd\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_CanonicalTransactionChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_ChainStorageContainer } from \\\"./iOVM_ChainStorageContainer.sol\\\";\\n\\n/**\\n * @title iOVM_CanonicalTransactionChain\\n */\\ninterface iOVM_CanonicalTransactionChain {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event TransactionEnqueued(\\n address _l1TxOrigin,\\n address _target,\\n uint256 _gasLimit,\\n bytes _data,\\n uint256 _queueIndex,\\n uint256 _timestamp\\n );\\n\\n event QueueBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event SequencerBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event TransactionBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct BatchContext {\\n uint256 numSequencedTransactions;\\n uint256 numSubsequentQueueTransactions;\\n uint256 timestamp;\\n uint256 blockNumber;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n\\n /**\\n * Accesses the batch storage container.\\n * @return Reference to the batch storage container.\\n */\\n function batches()\\n external\\n view\\n returns (\\n iOVM_ChainStorageContainer\\n );\\n\\n /**\\n * Accesses the queue storage container.\\n * @return Reference to the queue storage container.\\n */\\n function queue()\\n external\\n view\\n returns (\\n iOVM_ChainStorageContainer\\n );\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements()\\n external\\n view\\n returns (\\n uint256 _totalElements\\n );\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches()\\n external\\n view\\n returns (\\n uint256 _totalBatches\\n );\\n\\n /**\\n * Returns the index of the next element to be enqueued.\\n * @return Index for the next queue element.\\n */\\n function getNextQueueIndex()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Gets the queue element at a particular index.\\n * @param _index Index of the queue element to access.\\n * @return _element Queue element at the given index.\\n */\\n function getQueueElement(\\n uint256 _index\\n )\\n external\\n view\\n returns (\\n Lib_OVMCodec.QueueElement memory _element\\n );\\n\\n /**\\n * Returns the timestamp of the last transaction.\\n * @return Timestamp for the last transaction.\\n */\\n function getLastTimestamp()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Returns the blocknumber of the last transaction.\\n * @return Blocknumber for the last transaction.\\n */\\n function getLastBlockNumber()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Get the number of queue elements which have not yet been included.\\n * @return Number of pending queue elements.\\n */\\n function getNumPendingQueueElements()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Retrieves the length of the queue, including\\n * both pending and canonical transactions.\\n * @return Length of the queue.\\n */\\n function getQueueLength()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n\\n /**\\n * Adds a transaction to the queue.\\n * @param _target Target contract to send the transaction to.\\n * @param _gasLimit Gas limit for the given transaction.\\n * @param _data Transaction data.\\n */\\n function enqueue(\\n address _target,\\n uint256 _gasLimit,\\n bytes memory _data\\n )\\n external;\\n\\n /**\\n * Appends a given number of queued transactions as a single batch.\\n * @param _numQueuedTransactions Number of transactions to append.\\n */\\n function appendQueueBatch(\\n uint256 _numQueuedTransactions\\n )\\n external;\\n\\n /**\\n * Allows the sequencer to append a batch of transactions.\\n * @dev This function uses a custom encoding scheme for efficiency reasons.\\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\\n * .param _contexts Array of batch contexts.\\n * .param _transactionDataFields Array of raw transaction data.\\n */\\n function appendSequencerBatch(\\n // uint40 _shouldStartAtElement,\\n // uint24 _totalElementsToAppend,\\n // BatchContext[] _contexts,\\n // bytes[] _transactionDataFields\\n )\\n external;\\n\\n /**\\n * Verifies whether a transaction is included in the chain.\\n * @param _transaction Transaction to verify.\\n * @param _txChainElement Transaction chain element corresponding to the transaction.\\n * @param _batchHeader Header of the batch the transaction was included in.\\n * @param _inclusionProof Inclusion proof for the provided transaction chain element.\\n * @return True if the transaction exists in the CTC, false if not.\\n */\\n function verifyTransaction(\\n Lib_OVMCodec.Transaction memory _transaction,\\n Lib_OVMCodec.TransactionChainElement memory _txChainElement,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _inclusionProof\\n )\\n external\\n view\\n returns (\\n bool\\n );\\n}\\n\",\"keccak256\":\"0xb5e55488a1982841c07cdf5ff475da4789596f111dd48f01b1918ee4c775cf3a\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_ChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title iOVM_ChainStorageContainer\\n */\\ninterface iOVM_ChainStorageContainer {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata()\\n external\\n view\\n returns (\\n bytes27\\n );\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length()\\n external\\n view\\n returns (\\n uint256\\n );\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(\\n bytes32 _object\\n )\\n external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(\\n bytes32 _object,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(\\n uint256 _index\\n )\\n external\\n view\\n returns (\\n bytes32\\n );\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index\\n )\\n external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Marks an index as overwritable, meaing the underlying buffer can start to write values over\\n * any objects before and including the given index.\\n */\\n function setNextOverwritableIndex(\\n uint256 _index\\n )\\n external;\\n}\\n\",\"keccak256\":\"0x2d7973a0ad84c23ec62624d3f1e3aeb198cc72686ff1e6cfa17155556b320c94\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_StateCommitmentChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title iOVM_StateCommitmentChain\\n */\\ninterface iOVM_StateCommitmentChain {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event StateBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n event StateBatchDeleted(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot\\n );\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements()\\n external\\n view\\n returns (\\n uint256 _totalElements\\n );\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches()\\n external\\n view\\n returns (\\n uint256 _totalBatches\\n );\\n\\n /**\\n * Retrieves the timestamp of the last batch submitted by the sequencer.\\n * @return _lastSequencerTimestamp Last sequencer batch timestamp.\\n */\\n function getLastSequencerTimestamp()\\n external\\n view\\n returns (\\n uint256 _lastSequencerTimestamp\\n );\\n\\n /**\\n * Appends a batch of state roots to the chain.\\n * @param _batch Batch of state roots.\\n * @param _shouldStartAtElement Index of the element at which this batch should start.\\n */\\n function appendStateBatch(\\n bytes32[] calldata _batch,\\n uint256 _shouldStartAtElement\\n )\\n external;\\n\\n /**\\n * Deletes all state roots after (and including) a given batch.\\n * @param _batchHeader Header of the batch to start deleting from.\\n */\\n function deleteStateBatch(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n external;\\n\\n /**\\n * Verifies a batch inclusion proof.\\n * @param _element Hash of the element to verify a proof for.\\n * @param _batchHeader Header of the batch in which the element was included.\\n * @param _proof Merkle inclusion proof for the element.\\n */\\n function verifyStateCommitment(\\n bytes32 _element,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _proof\\n )\\n external\\n view\\n returns (\\n bool _verified\\n );\\n\\n /**\\n * Checks whether a given batch is still inside its fraud proof window.\\n * @param _batchHeader Header of the batch to check.\\n * @return _inside Whether or not the batch is inside the fraud proof window.\\n */\\n function insideFraudProofWindow(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n external\\n view\\n returns (\\n bool _inside\\n );\\n}\\n\",\"keccak256\":\"0x6646d6ff392b81aab52a7a277e91540819464751de0af5afd1962094b2e92448\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/verification/iOVM_BondManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\ninterface ERC20 {\\n function transfer(address, uint256) external returns (bool);\\n function transferFrom(address, address, uint256) external returns (bool);\\n}\\n\\n/// All the errors which may be encountered on the bond manager\\nlibrary Errors {\\n string constant ERC20_ERR = \\\"BondManager: Could not post bond\\\";\\n string constant ALREADY_FINALIZED = \\\"BondManager: Fraud proof for this pre-state root has already been finalized\\\";\\n string constant SLASHED = \\\"BondManager: Cannot finalize withdrawal, you probably got slashed\\\";\\n string constant WRONG_STATE = \\\"BondManager: Wrong bond state for proposer\\\";\\n string constant CANNOT_CLAIM = \\\"BondManager: Cannot claim yet. Dispute must be finalized first\\\";\\n\\n string constant WITHDRAWAL_PENDING = \\\"BondManager: Withdrawal already pending\\\";\\n string constant TOO_EARLY = \\\"BondManager: Too early to finalize your withdrawal\\\";\\n\\n string constant ONLY_TRANSITIONER = \\\"BondManager: Only the transitioner for this pre-state root may call this function\\\";\\n string constant ONLY_FRAUD_VERIFIER = \\\"BondManager: Only the fraud verifier may call this function\\\";\\n string constant ONLY_STATE_COMMITMENT_CHAIN = \\\"BondManager: Only the state commitment chain may call this function\\\";\\n string constant WAIT_FOR_DISPUTES = \\\"BondManager: Wait for other potential disputes\\\";\\n}\\n\\n/**\\n * @title iOVM_BondManager\\n */\\ninterface iOVM_BondManager {\\n\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n /// The lifecycle of a proposer's bond\\n enum State {\\n // Before depositing or after getting slashed, a user is uncollateralized\\n NOT_COLLATERALIZED,\\n // After depositing, a user is collateralized\\n COLLATERALIZED,\\n // After a user has initiated a withdrawal\\n WITHDRAWING\\n }\\n\\n /// A bond posted by a proposer\\n struct Bond {\\n // The user's state\\n State state;\\n // The timestamp at which a proposer issued their withdrawal request\\n uint32 withdrawalTimestamp;\\n // The time when the first disputed was initiated for this bond\\n uint256 firstDisputeAt;\\n // The earliest observed state root for this bond which has had fraud\\n bytes32 earliestDisputedStateRoot;\\n // The state root's timestamp\\n uint256 earliestTimestamp;\\n }\\n\\n // Per pre-state root, store the number of state provisions that were made\\n // and how many of these calls were made by each user. Payouts will then be\\n // claimed by users proportionally for that dispute.\\n struct Rewards {\\n // Flag to check if rewards for a fraud proof are claimable\\n bool canClaim;\\n // Total number of `recordGasSpent` calls made\\n uint256 total;\\n // The gas spent by each user to provide witness data. The sum of all\\n // values inside this map MUST be equal to the value of `total`\\n mapping(address => uint256) gasSpent;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function recordGasSpent(\\n bytes32 _preStateRoot,\\n bytes32 _txHash,\\n address _who,\\n uint256 _gasSpent\\n ) external;\\n\\n function finalize(\\n bytes32 _preStateRoot,\\n address _publisher,\\n uint256 _timestamp\\n ) external;\\n\\n function deposit() external;\\n\\n function startWithdrawal() external;\\n\\n function finalizeWithdrawal() external;\\n\\n function claim(\\n address _who\\n ) external;\\n\\n function isCollateralized(\\n address _who\\n ) external view returns (bool);\\n\\n function getGasSpent(\\n bytes32 _preStateRoot,\\n address _who\\n ) external view returns (uint256);\\n}\\n\",\"keccak256\":\"0x3c2a8a399487857158649db1896749d86e39cba545a8aeb2e2bb0f3bdfa7a5b1\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/verification/iOVM_FraudVerifier.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_StateTransitioner } from \\\"./iOVM_StateTransitioner.sol\\\";\\n\\n/**\\n * @title iOVM_FraudVerifier\\n */\\ninterface iOVM_FraudVerifier {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event FraudProofInitialized(\\n bytes32 _preStateRoot,\\n uint256 _preStateRootIndex,\\n bytes32 _transactionHash,\\n address _who\\n );\\n\\n event FraudProofFinalized(\\n bytes32 _preStateRoot,\\n uint256 _preStateRootIndex,\\n bytes32 _transactionHash,\\n address _who\\n );\\n\\n\\n /***************************************\\n * Public Functions: Transition Status *\\n ***************************************/\\n\\n function getStateTransitioner(bytes32 _preStateRoot, bytes32 _txHash) external view returns (iOVM_StateTransitioner _transitioner);\\n\\n\\n /****************************************\\n * Public Functions: Fraud Verification *\\n ****************************************/\\n\\n function initializeFraudVerification(\\n bytes32 _preStateRoot,\\n Lib_OVMCodec.ChainBatchHeader calldata _preStateRootBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof calldata _preStateRootProof,\\n Lib_OVMCodec.Transaction calldata _transaction,\\n Lib_OVMCodec.TransactionChainElement calldata _txChainElement,\\n Lib_OVMCodec.ChainBatchHeader calldata _transactionBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof calldata _transactionProof\\n ) external;\\n\\n function finalizeFraudVerification(\\n bytes32 _preStateRoot,\\n Lib_OVMCodec.ChainBatchHeader calldata _preStateRootBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof calldata _preStateRootProof,\\n bytes32 _txHash,\\n bytes32 _postStateRoot,\\n Lib_OVMCodec.ChainBatchHeader calldata _postStateRootBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof calldata _postStateRootProof\\n ) external;\\n}\\n\",\"keccak256\":\"0x5efd7bb18164bbd3e9d58379e8203fbf2a7ee802b1a48dff3ceaaec1523b1751\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/verification/iOVM_StateTransitioner.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title iOVM_StateTransitioner\\n */\\ninterface iOVM_StateTransitioner {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AccountCommitted(\\n address _address\\n );\\n\\n event ContractStorageCommitted(\\n address _address,\\n bytes32 _key\\n );\\n\\n\\n /**********************************\\n * Public Functions: State Access *\\n **********************************/\\n\\n function getPreStateRoot() external view returns (bytes32 _preStateRoot);\\n function getPostStateRoot() external view returns (bytes32 _postStateRoot);\\n function isComplete() external view returns (bool _complete);\\n\\n\\n /***********************************\\n * Public Functions: Pre-Execution *\\n ***********************************/\\n\\n function proveContractState(\\n address _ovmContractAddress,\\n address _ethContractAddress,\\n bytes calldata _stateTrieWitness\\n ) external;\\n\\n function proveStorageSlot(\\n address _ovmContractAddress,\\n bytes32 _key,\\n bytes calldata _storageTrieWitness\\n ) external;\\n\\n\\n /*******************************\\n * Public Functions: Execution *\\n *******************************/\\n\\n function applyTransaction(\\n Lib_OVMCodec.Transaction calldata _transaction\\n ) external;\\n\\n\\n /************************************\\n * Public Functions: Post-Execution *\\n ************************************/\\n\\n function commitContractState(\\n address _ovmContractAddress,\\n bytes calldata _stateTrieWitness\\n ) external;\\n\\n function commitStorageSlot(\\n address _ovmContractAddress,\\n bytes32 _key,\\n bytes calldata _storageTrieWitness\\n ) external;\\n\\n\\n /**********************************\\n * Public Functions: Finalization *\\n **********************************/\\n\\n function completeTransition() external;\\n}\\n\",\"keccak256\":\"0x3d044ac0a3bb6ad3d529f904b3191117511f9c379678ca03010e1ebdfcb5c34b\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/codec/Lib_OVMCodec.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../utils/Lib_Bytes32Utils.sol\\\";\\nimport { Lib_SafeExecutionManagerWrapper } from \\\"../../libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\\\";\\n\\n/**\\n * @title Lib_OVMCodec\\n */\\nlibrary Lib_OVMCodec {\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum EOASignatureType {\\n EIP155_TRANSACTION,\\n ETH_SIGNED_MESSAGE\\n }\\n\\n enum QueueOrigin {\\n SEQUENCER_QUEUE,\\n L1TOL2_QUEUE\\n }\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Account {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n address ethAddress;\\n bool isFresh;\\n }\\n\\n struct EVMAccount {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n }\\n\\n struct ChainBatchHeader {\\n uint256 batchIndex;\\n bytes32 batchRoot;\\n uint256 batchSize;\\n uint256 prevTotalElements;\\n bytes extraData;\\n }\\n\\n struct ChainInclusionProof {\\n uint256 index;\\n bytes32[] siblings;\\n }\\n\\n struct Transaction {\\n uint256 timestamp;\\n uint256 blockNumber;\\n QueueOrigin l1QueueOrigin;\\n address l1TxOrigin;\\n address entrypoint;\\n uint256 gasLimit;\\n bytes data;\\n }\\n\\n struct TransactionChainElement {\\n bool isSequenced;\\n uint256 queueIndex; // QUEUED TX ONLY\\n uint256 timestamp; // SEQUENCER TX ONLY\\n uint256 blockNumber; // SEQUENCER TX ONLY\\n bytes txData; // SEQUENCER TX ONLY\\n }\\n\\n struct QueueElement {\\n bytes32 transactionHash;\\n uint40 timestamp;\\n uint40 blockNumber;\\n }\\n\\n struct EIP155Transaction {\\n uint256 nonce;\\n uint256 gasPrice;\\n uint256 gasLimit;\\n address to;\\n uint256 value;\\n bytes data;\\n uint256 chainId;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Decodes an EOA transaction (i.e., native Ethereum RLP encoding).\\n * @param _transaction Encoded EOA transaction.\\n * @return Transaction decoded into a struct.\\n */\\n function decodeEIP155Transaction(\\n bytes memory _transaction,\\n bool _isEthSignedMessage\\n )\\n internal\\n pure\\n returns (\\n EIP155Transaction memory\\n )\\n {\\n if (_isEthSignedMessage) {\\n (\\n uint256 _nonce,\\n uint256 _gasLimit,\\n uint256 _gasPrice,\\n uint256 _chainId,\\n address _to,\\n bytes memory _data\\n ) = abi.decode(\\n _transaction,\\n (uint256, uint256, uint256, uint256, address ,bytes)\\n );\\n return EIP155Transaction({\\n nonce: _nonce,\\n gasPrice: _gasPrice,\\n gasLimit: _gasLimit,\\n to: _to,\\n value: 0,\\n data: _data,\\n chainId: _chainId\\n });\\n } else {\\n Lib_RLPReader.RLPItem[] memory decoded = Lib_RLPReader.readList(_transaction);\\n\\n return EIP155Transaction({\\n nonce: Lib_RLPReader.readUint256(decoded[0]),\\n gasPrice: Lib_RLPReader.readUint256(decoded[1]),\\n gasLimit: Lib_RLPReader.readUint256(decoded[2]),\\n to: Lib_RLPReader.readAddress(decoded[3]),\\n value: Lib_RLPReader.readUint256(decoded[4]),\\n data: Lib_RLPReader.readBytes(decoded[5]),\\n chainId: Lib_RLPReader.readUint256(decoded[6])\\n });\\n }\\n }\\n\\n /**\\n * Decompresses a compressed EIP155 transaction.\\n * @param _transaction Compressed EIP155 transaction bytes.\\n * @return Transaction parsed into a struct.\\n */\\n function decompressEIP155Transaction(\\n bytes memory _transaction\\n )\\n internal\\n returns (\\n EIP155Transaction memory\\n )\\n {\\n return EIP155Transaction({\\n gasLimit: Lib_BytesUtils.toUint24(_transaction, 0),\\n gasPrice: uint256(Lib_BytesUtils.toUint24(_transaction, 3)) * 1000000,\\n nonce: Lib_BytesUtils.toUint24(_transaction, 6),\\n to: Lib_BytesUtils.toAddress(_transaction, 9),\\n data: Lib_BytesUtils.slice(_transaction, 29),\\n chainId: Lib_SafeExecutionManagerWrapper.safeCHAINID(),\\n value: 0\\n });\\n }\\n\\n /**\\n * Encodes an EOA transaction back into the original transaction.\\n * @param _transaction EIP155transaction to encode.\\n * @param _isEthSignedMessage Whether or not this was an eth signed message.\\n * @return Encoded transaction.\\n */\\n function encodeEIP155Transaction(\\n EIP155Transaction memory _transaction,\\n bool _isEthSignedMessage\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n if (_isEthSignedMessage) {\\n return abi.encode(\\n _transaction.nonce,\\n _transaction.gasLimit,\\n _transaction.gasPrice,\\n _transaction.chainId,\\n _transaction.to,\\n _transaction.data\\n );\\n } else {\\n bytes[] memory raw = new bytes[](9);\\n\\n raw[0] = Lib_RLPWriter.writeUint(_transaction.nonce);\\n raw[1] = Lib_RLPWriter.writeUint(_transaction.gasPrice);\\n raw[2] = Lib_RLPWriter.writeUint(_transaction.gasLimit);\\n if (_transaction.to == address(0)) {\\n raw[3] = Lib_RLPWriter.writeBytes('');\\n } else {\\n raw[3] = Lib_RLPWriter.writeAddress(_transaction.to);\\n }\\n raw[4] = Lib_RLPWriter.writeUint(0);\\n raw[5] = Lib_RLPWriter.writeBytes(_transaction.data);\\n raw[6] = Lib_RLPWriter.writeUint(_transaction.chainId);\\n raw[7] = Lib_RLPWriter.writeBytes(bytes(''));\\n raw[8] = Lib_RLPWriter.writeBytes(bytes(''));\\n\\n return Lib_RLPWriter.writeList(raw);\\n }\\n }\\n\\n /**\\n * Encodes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Encoded transaction bytes.\\n */\\n function encodeTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return abi.encodePacked(\\n _transaction.timestamp,\\n _transaction.blockNumber,\\n _transaction.l1QueueOrigin,\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n );\\n }\\n\\n /**\\n * Hashes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Hashed transaction\\n */\\n function hashTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(encodeTransaction(_transaction));\\n }\\n\\n /**\\n * Converts an OVM account to an EVM account.\\n * @param _in OVM account to convert.\\n * @return Converted EVM account.\\n */\\n function toEVMAccount(\\n Account memory _in\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n return EVMAccount({\\n nonce: _in.nonce,\\n balance: _in.balance,\\n storageRoot: _in.storageRoot,\\n codeHash: _in.codeHash\\n });\\n }\\n\\n /**\\n * @notice RLP-encodes an account state struct.\\n * @param _account Account state struct.\\n * @return RLP-encoded account state.\\n */\\n function encodeEVMAccount(\\n EVMAccount memory _account\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes[] memory raw = new bytes[](4);\\n\\n // Unfortunately we can't create this array outright because\\n // Lib_RLPWriter.writeList will reject fixed-size arrays. Assigning\\n // index-by-index circumvents this issue.\\n raw[0] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.nonce)\\n )\\n );\\n raw[1] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.balance)\\n )\\n );\\n raw[2] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.storageRoot));\\n raw[3] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.codeHash));\\n\\n return Lib_RLPWriter.writeList(raw);\\n }\\n\\n /**\\n * @notice Decodes an RLP-encoded account state into a useful struct.\\n * @param _encoded RLP-encoded account state.\\n * @return Account state struct.\\n */\\n function decodeEVMAccount(\\n bytes memory _encoded\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\\n\\n return EVMAccount({\\n nonce: Lib_RLPReader.readUint256(accountState[0]),\\n balance: Lib_RLPReader.readUint256(accountState[1]),\\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\\n });\\n }\\n\\n /**\\n * Calculates a hash for a given batch header.\\n * @param _batchHeader Header to hash.\\n * @return Hash of the header.\\n */\\n function hashBatchHeader(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(\\n abi.encode(\\n _batchHeader.batchRoot,\\n _batchHeader.batchSize,\\n _batchHeader.prevTotalElements,\\n _batchHeader.extraData\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0xe7e518ba7bba3fa28c532f8902576c1bb4dfc1ec4b62bed6da50623248ba17c3\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Contract Imports */\\nimport { Ownable } from \\\"./Lib_Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n /*******************************************\\n * Contract Variables: Internal Accounting *\\n *******************************************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n public\\n onlyOwner\\n {\\n emit AddressSet(_name, _address);\\n addresses[_getNameHash(_name)] = _address;\\n }\\n\\n function getAddress(\\n string memory _name\\n )\\n public\\n view\\n returns (address)\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32 _hash\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0x3a490595cc21ff170e4027843093670ff845d5972481fbfb956b722ea564bb06\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n\\n /*******************************************\\n * Contract Variables: Contract References *\\n *******************************************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(\\n address _libAddressManager\\n ) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function resolve(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address _contract\\n )\\n {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0xaa3ed342f6deb156c660fd83afa579a3b80db17eb465e8949cf5c1b114780143\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Ownable\\n * @dev Adapted from https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol\\n */\\nabstract contract Ownable {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n address public owner;\\n\\n\\n /**********\\n * Events *\\n **********/\\n\\n event OwnershipTransferred(\\n address indexed previousOwner,\\n address indexed newOwner\\n );\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n constructor() {\\n owner = msg.sender;\\n emit OwnershipTransferred(address(0), owner);\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n owner == msg.sender,\\n \\\"Ownable: caller is not the owner\\\"\\n );\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function renounceOwnership()\\n public\\n virtual\\n onlyOwner\\n {\\n emit OwnershipTransferred(owner, address(0));\\n owner = address(0);\\n }\\n\\n function transferOwnership(address _newOwner)\\n public\\n virtual\\n onlyOwner\\n {\\n require(\\n _newOwner != address(0),\\n \\\"Ownable: new owner cannot be the zero address\\\"\\n );\\n\\n emit OwnershipTransferred(owner, _newOwner);\\n owner = _newOwner;\\n }\\n}\\n\",\"keccak256\":\"0xd9dfd9264e5b5fedd53a5b10fdf179c3f367614b0fe69179bce4e45119f5b739\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPReader.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_RLPReader\\n * @dev Adapted from \\\"RLPReader\\\" by Hamdi Allam (hamdi.allam97@gmail.com).\\n */\\nlibrary Lib_RLPReader {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 constant internal MAX_LIST_LENGTH = 32;\\n\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum RLPItemType {\\n DATA_ITEM,\\n LIST_ITEM\\n }\\n\\n \\n /***********\\n * Structs *\\n ***********/\\n\\n struct RLPItem {\\n uint256 length;\\n uint256 ptr;\\n }\\n \\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n \\n /**\\n * Converts bytes to a reference to memory position and length.\\n * @param _in Input bytes to convert.\\n * @return Output memory reference.\\n */\\n function toRLPItem(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem memory\\n )\\n {\\n uint256 ptr;\\n assembly {\\n ptr := add(_in, 32)\\n }\\n\\n return RLPItem({\\n length: _in.length,\\n ptr: ptr\\n });\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n (\\n uint256 listOffset,\\n ,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.LIST_ITEM,\\n \\\"Invalid RLP list value.\\\"\\n );\\n\\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\\n // writing to the length. Since we can't know the number of RLP items without looping over\\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\\n // simply set a reasonable maximum list length and decrease the size before we finish.\\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\\n\\n uint256 itemCount = 0;\\n uint256 offset = listOffset;\\n while (offset < _in.length) {\\n require(\\n itemCount < MAX_LIST_LENGTH,\\n \\\"Provided RLP list exceeds max list length.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n ) = _decodeLength(RLPItem({\\n length: _in.length - offset,\\n ptr: _in.ptr + offset\\n }));\\n\\n out[itemCount] = RLPItem({\\n length: itemLength + itemOffset,\\n ptr: _in.ptr + offset\\n });\\n\\n itemCount += 1;\\n offset += itemOffset + itemLength;\\n }\\n\\n // Decrease the array size to match the actual item count.\\n assembly {\\n mstore(out, itemCount)\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n return readList(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes value.\\\"\\n );\\n\\n return _copy(_in.ptr, itemOffset, itemLength);\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return readBytes(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return string(readBytes(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return readString(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n require(\\n _in.length <= 33,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr + itemOffset;\\n bytes32 out;\\n assembly {\\n out := mload(ptr)\\n\\n // Shift the bytes over to match the item size.\\n if lt(itemLength, 32) {\\n out := div(out, exp(256, sub(32, itemLength)))\\n }\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return readBytes32(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return uint256(readBytes32(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return readUint256(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n require(\\n _in.length == 1,\\n \\\"Invalid RLP boolean value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 out;\\n assembly {\\n out := byte(0, mload(ptr))\\n }\\n\\n require(\\n out == 0 || out == 1,\\n \\\"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\\\"\\n );\\n\\n return out != 0;\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return readBool(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n if (_in.length == 1) {\\n return address(0);\\n }\\n\\n require(\\n _in.length == 21,\\n \\\"Invalid RLP address value.\\\"\\n );\\n\\n return address(readUint256(_in));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return readAddress(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads the raw bytes of an RLP item.\\n * @param _in RLP item to read.\\n * @return Raw RLP bytes.\\n */\\n function readRawBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in);\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Decodes the length of an RLP item.\\n * @param _in RLP item to decode.\\n * @return Offset of the encoded data.\\n * @return Length of the encoded data.\\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\\n */\\n function _decodeLength(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n uint256,\\n uint256,\\n RLPItemType\\n )\\n {\\n require(\\n _in.length > 0,\\n \\\"RLP item cannot be null.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 prefix;\\n assembly {\\n prefix := byte(0, mload(ptr))\\n }\\n\\n if (prefix <= 0x7f) {\\n // Single byte.\\n\\n return (0, 1, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xb7) {\\n // Short string.\\n\\n uint256 strLen = prefix - 0x80;\\n \\n require(\\n _in.length > strLen,\\n \\\"Invalid RLP short string.\\\"\\n );\\n\\n return (1, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xbf) {\\n // Long string.\\n uint256 lenOfStrLen = prefix - 0xb7;\\n\\n require(\\n _in.length > lenOfStrLen,\\n \\\"Invalid RLP long string length.\\\"\\n );\\n\\n uint256 strLen;\\n assembly {\\n // Pick out the string length.\\n strLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfStrLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfStrLen + strLen,\\n \\\"Invalid RLP long string.\\\"\\n );\\n\\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xf7) {\\n // Short list.\\n uint256 listLen = prefix - 0xc0;\\n\\n require(\\n _in.length > listLen,\\n \\\"Invalid RLP short list.\\\"\\n );\\n\\n return (1, listLen, RLPItemType.LIST_ITEM);\\n } else {\\n // Long list.\\n uint256 lenOfListLen = prefix - 0xf7;\\n\\n require(\\n _in.length > lenOfListLen,\\n \\\"Invalid RLP long list length.\\\"\\n );\\n\\n uint256 listLen;\\n assembly {\\n // Pick out the list length.\\n listLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfListLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfListLen + listLen,\\n \\\"Invalid RLP long list.\\\"\\n );\\n\\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\\n }\\n }\\n\\n /**\\n * Copies the bytes from a memory location.\\n * @param _src Pointer to the location to read from.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Copied bytes.\\n */\\n function _copy(\\n uint256 _src,\\n uint256 _offset,\\n uint256 _length\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out = new bytes(_length);\\n if (out.length == 0) {\\n return out;\\n }\\n\\n uint256 src = _src + _offset;\\n uint256 dest;\\n assembly {\\n dest := add(out, 32)\\n }\\n\\n // Copy over as many complete words as we can.\\n for (uint256 i = 0; i < _length / 32; i++) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n\\n src += 32;\\n dest += 32;\\n }\\n\\n // Pick out the remaining bytes.\\n uint256 mask = 256 ** (32 - (_length % 32)) - 1;\\n assembly {\\n mstore(\\n dest,\\n or(\\n and(mload(src), not(mask)),\\n and(mload(dest), mask)\\n )\\n )\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Copies an RLP item into bytes.\\n * @param _in RLP item to copy.\\n * @return Copied bytes.\\n */\\n function _copy(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in.ptr, 0, _in.length);\\n }\\n}\\n\",\"keccak256\":\"0xbdb8fae0ca2483b4cc07607a5070fc25e33c54b4e4462b99e7c0b13aac48a09b\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPWriter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\n\\n/**\\n * @title Lib_RLPWriter\\n * @author Bakaoh (with modifications)\\n */\\nlibrary Lib_RLPWriter {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * RLP encodes a byte string.\\n * @param _in The byte string to encode.\\n * @return _out The RLP encoded string in bytes.\\n */\\n function writeBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n bytes memory encoded;\\n\\n if (_in.length == 1 && uint8(_in[0]) < 128) {\\n encoded = _in;\\n } else {\\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * RLP encodes a list of RLP encoded byte byte strings.\\n * @param _in The list of RLP encoded byte strings.\\n * @return _out The RLP encoded list of items in bytes.\\n */\\n function writeList(\\n bytes[] memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n bytes memory list = _flatten(_in);\\n return abi.encodePacked(_writeLength(list.length, 192), list);\\n }\\n\\n /**\\n * RLP encodes a string.\\n * @param _in The string to encode.\\n * @return _out The RLP encoded string in bytes.\\n */\\n function writeString(\\n string memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(bytes(_in));\\n }\\n\\n /**\\n * RLP encodes an address.\\n * @param _in The address to encode.\\n * @return _out The RLP encoded address in bytes.\\n */\\n function writeAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a uint.\\n * @param _in The uint256 to encode.\\n * @return _out The RLP encoded uint256 in bytes.\\n */\\n function writeUint(\\n uint256 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(_toBinary(_in));\\n }\\n\\n /**\\n * RLP encodes a bool.\\n * @param _in The bool to encode.\\n * @return _out The RLP encoded bool in bytes.\\n */\\n function writeBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n bytes memory encoded = new bytes(1);\\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\\n return encoded;\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\\n * @param _len The length of the string or the payload.\\n * @param _offset 128 if item is string, 192 if item is list.\\n * @return _encoded RLP encoded bytes.\\n */\\n function _writeLength(\\n uint256 _len,\\n uint256 _offset\\n )\\n private\\n pure\\n returns (\\n bytes memory _encoded\\n )\\n {\\n bytes memory encoded;\\n\\n if (_len < 56) {\\n encoded = new bytes(1);\\n encoded[0] = byte(uint8(_len) + uint8(_offset));\\n } else {\\n uint256 lenLen;\\n uint256 i = 1;\\n while (_len / i != 0) {\\n lenLen++;\\n i *= 256;\\n }\\n\\n encoded = new bytes(lenLen + 1);\\n encoded[0] = byte(uint8(lenLen) + uint8(_offset) + 55);\\n for(i = 1; i <= lenLen; i++) {\\n encoded[i] = byte(uint8((_len / (256**(lenLen-i))) % 256));\\n }\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * Encode integer in big endian binary form with no leading zeroes.\\n * @notice TODO: This should be optimized with assembly to save gas costs.\\n * @param _x The integer to encode.\\n * @return _binary RLP encoded bytes.\\n */\\n function _toBinary(\\n uint256 _x\\n )\\n private\\n pure\\n returns (\\n bytes memory _binary\\n )\\n {\\n bytes memory b = abi.encodePacked(_x);\\n\\n uint256 i = 0;\\n for (; i < 32; i++) {\\n if (b[i] != 0) {\\n break;\\n }\\n }\\n\\n bytes memory res = new bytes(32 - i);\\n for (uint256 j = 0; j < res.length; j++) {\\n res[j] = b[i++];\\n }\\n\\n return res;\\n }\\n\\n /**\\n * Copies a piece of memory to another location.\\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\\n * @param _dest Destination location.\\n * @param _src Source location.\\n * @param _len Length of memory to copy.\\n */\\n function _memcpy(\\n uint256 _dest,\\n uint256 _src,\\n uint256 _len\\n )\\n private\\n pure\\n {\\n uint256 dest = _dest;\\n uint256 src = _src;\\n uint256 len = _len;\\n\\n for(; len >= 32; len -= 32) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n dest += 32;\\n src += 32;\\n }\\n\\n uint256 mask = 256 ** (32 - len) - 1;\\n assembly {\\n let srcpart := and(mload(src), not(mask))\\n let destpart := and(mload(dest), mask)\\n mstore(dest, or(destpart, srcpart))\\n }\\n }\\n\\n /**\\n * Flattens a list of byte strings into one byte string.\\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\\n * @param _list List of byte strings to flatten.\\n * @return _flattened The flattened byte string.\\n */\\n function _flatten(\\n bytes[] memory _list\\n )\\n private\\n pure\\n returns (\\n bytes memory _flattened\\n )\\n {\\n if (_list.length == 0) {\\n return new bytes(0);\\n }\\n\\n uint256 len;\\n uint256 i = 0;\\n for (; i < _list.length; i++) {\\n len += _list[i].length;\\n }\\n\\n bytes memory flattened = new bytes(len);\\n uint256 flattenedPtr;\\n assembly { flattenedPtr := add(flattened, 0x20) }\\n\\n for(i = 0; i < _list.length; i++) {\\n bytes memory item = _list[i];\\n\\n uint256 listPtr;\\n assembly { listPtr := add(item, 0x20)}\\n\\n _memcpy(flattenedPtr, listPtr, item.length);\\n flattenedPtr += _list[i].length;\\n }\\n\\n return flattened;\\n }\\n}\",\"keccak256\":\"0xbcb24619c1758cb0d9f3fe5c79495950045a9087046a02b9ce01df46ae09ae5b\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_Bytes32Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_Byte32Utils\\n */\\nlibrary Lib_Bytes32Utils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \\\"true.\\\"\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as a boolean.\\n */\\n function toBool(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return _in != 0;\\n }\\n\\n /**\\n * Converts a boolean to a bytes32 value.\\n * @param _in Input boolean value.\\n * @return Boolean as a bytes32.\\n */\\n function fromBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in ? 1 : 0));\\n }\\n\\n /**\\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as an address.\\n */\\n function toAddress(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return address(uint160(uint256(_in)));\\n }\\n\\n /**\\n * Converts an address to a bytes32.\\n * @param _in Input address value.\\n * @return Address as a bytes32.\\n */\\n function fromAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in));\\n }\\n\\n /**\\n * Removes the leading zeros from a bytes32 value and returns a new (smaller) bytes value.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 without any leading zeros.\\n */\\n function removeLeadingZeros(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out;\\n\\n assembly {\\n // Figure out how many leading zero bytes to remove.\\n let shift := 0\\n for { let i := 0 } and(lt(i, 32), eq(byte(i, _in), 0)) { i := add(i, 1) } {\\n shift := add(shift, 1)\\n }\\n\\n // Reserve some space for our output and fix the free memory pointer.\\n out := mload(0x40)\\n mstore(0x40, add(out, 0x40))\\n\\n // Shift the value and store it into the output bytes.\\n mstore(add(out, 0x20), shl(mul(shift, 8), _in))\\n\\n // Store the new size (with leading zero bytes removed) in the output byte size.\\n mstore(out, sub(32, shift))\\n }\\n\\n return out;\\n }\\n}\\n\",\"keccak256\":\"0xfa2def593e3fc56a31852c3744aefdaa93cec74e721bfcfeb1e5d166c7c60b64\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_BytesUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_BytesUtils\\n */\\nlibrary Lib_BytesUtils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_start + _length >= _start, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n if (_bytes.length - _start == 0) {\\n return bytes('');\\n }\\n\\n return slice(_bytes, _start, _bytes.length - _start);\\n }\\n\\n function toBytes32PadLeft(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes32)\\n {\\n bytes32 ret;\\n uint256 len = _bytes.length <= 32 ? _bytes.length : 32;\\n assembly {\\n ret := shr(mul(sub(32, len), 8), mload(add(_bytes, 32)))\\n }\\n return ret;\\n }\\n\\n function toBytes32(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes32)\\n {\\n if (_bytes.length < 32) {\\n bytes32 ret;\\n assembly {\\n ret := mload(add(_bytes, 32))\\n }\\n return ret;\\n }\\n\\n return abi.decode(_bytes,(bytes32)); // will truncate if input length > 32 bytes\\n }\\n\\n function toUint256(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (uint256)\\n {\\n return uint256(toBytes32(_bytes));\\n }\\n\\n function toUint24(bytes memory _bytes, uint256 _start) internal pure returns (uint24) {\\n require(_start + 3 >= _start, \\\"toUint24_overflow\\\");\\n require(_bytes.length >= _start + 3 , \\\"toUint24_outOfBounds\\\");\\n uint24 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x3), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toUint8(bytes memory _bytes, uint256 _start) internal pure returns (uint8) {\\n require(_start + 1 >= _start, \\\"toUint8_overflow\\\");\\n require(_bytes.length >= _start + 1 , \\\"toUint8_outOfBounds\\\");\\n uint8 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x1), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toAddress(bytes memory _bytes, uint256 _start) internal pure returns (address) {\\n require(_start + 20 >= _start, \\\"toAddress_overflow\\\");\\n require(_bytes.length >= _start + 20, \\\"toAddress_outOfBounds\\\");\\n address tempAddress;\\n\\n assembly {\\n tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000)\\n }\\n\\n return tempAddress;\\n }\\n\\n function toNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n bytes memory nibbles = new bytes(_bytes.length * 2);\\n\\n for (uint256 i = 0; i < _bytes.length; i++) {\\n nibbles[i * 2] = _bytes[i] >> 4;\\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\\n }\\n\\n return nibbles;\\n }\\n\\n function fromNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n bytes memory ret = new bytes(_bytes.length / 2);\\n\\n for (uint256 i = 0; i < ret.length; i++) {\\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\\n }\\n\\n return ret;\\n }\\n\\n function equal(\\n bytes memory _bytes,\\n bytes memory _other\\n )\\n internal\\n pure\\n returns (bool)\\n {\\n return keccak256(_bytes) == keccak256(_other);\\n }\\n}\\n\",\"keccak256\":\"0x0adf22e1b22ba09911e859f64cb3b484e992be4f9fd3b09088e6225bf8d06ce0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_ErrorUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/**\\n * @title Lib_ErrorUtils\\n */\\nlibrary Lib_ErrorUtils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Encodes an error string into raw solidity-style revert data.\\n * (i.e. ascii bytes, prefixed with bytes4(keccak(\\\"Error(string))\\\"))\\n * Ref: https://docs.soliditylang.org/en/v0.8.2/control-structures.html?highlight=Error(string)#panic-via-assert-and-error-via-require\\n * @param _reason Reason for the reversion.\\n * @return Standard solidity revert data for the given reason.\\n */\\n function encodeRevertString(\\n string memory _reason\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return abi.encodeWithSignature(\\n \\\"Error(string)\\\",\\n _reason\\n );\\n }\\n}\\n\",\"keccak256\":\"0xfc64ec4a81fb50865b502a0004ed154e8598e1a313db77303fc95e41f536e6b7\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_MerkleTree.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_MerkleTree\\n * @author River Keefer\\n */\\nlibrary Lib_MerkleTree {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Calculates a merkle root for a list of 32-byte leaf hashes. WARNING: If the number\\n * of leaves passed in is not a power of two, it pads out the tree with zero hashes.\\n * If you do not know the original length of elements for the tree you are verifying,\\n * then this may allow empty leaves past _elements.length to pass a verification check down the line.\\n * Note that the _elements argument is modified, therefore it must not be used again afterwards\\n * @param _elements Array of hashes from which to generate a merkle root.\\n * @return Merkle root of the leaves, with zero hashes for non-powers-of-two (see above).\\n */\\n function getMerkleRoot(\\n bytes32[] memory _elements\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n require(\\n _elements.length > 0,\\n \\\"Lib_MerkleTree: Must provide at least one leaf hash.\\\"\\n );\\n\\n if (_elements.length == 1) {\\n return _elements[0];\\n }\\n\\n uint256[16] memory defaults = [\\n 0x290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563,\\n 0x633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d,\\n 0x890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d,\\n 0x3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd8,\\n 0xecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da,\\n 0xdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da5,\\n 0x617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d7,\\n 0x292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead,\\n 0xe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e10,\\n 0x7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f82,\\n 0xe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e83636516,\\n 0x3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c,\\n 0xad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e,\\n 0xa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab,\\n 0x4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c862,\\n 0x2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf10\\n ];\\n\\n // Reserve memory space for our hashes.\\n bytes memory buf = new bytes(64);\\n\\n // We'll need to keep track of left and right siblings.\\n bytes32 leftSibling;\\n bytes32 rightSibling;\\n\\n // Number of non-empty nodes at the current depth.\\n uint256 rowSize = _elements.length;\\n\\n // Current depth, counting from 0 at the leaves\\n uint256 depth = 0;\\n\\n // Common sub-expressions\\n uint256 halfRowSize; // rowSize / 2\\n bool rowSizeIsOdd; // rowSize % 2 == 1\\n\\n while (rowSize > 1) {\\n halfRowSize = rowSize / 2;\\n rowSizeIsOdd = rowSize % 2 == 1;\\n\\n for (uint256 i = 0; i < halfRowSize; i++) {\\n leftSibling = _elements[(2 * i) ];\\n rightSibling = _elements[(2 * i) + 1];\\n assembly {\\n mstore(add(buf, 32), leftSibling )\\n mstore(add(buf, 64), rightSibling)\\n }\\n\\n _elements[i] = keccak256(buf);\\n }\\n\\n if (rowSizeIsOdd) {\\n leftSibling = _elements[rowSize - 1];\\n rightSibling = bytes32(defaults[depth]);\\n assembly {\\n mstore(add(buf, 32), leftSibling)\\n mstore(add(buf, 64), rightSibling)\\n }\\n\\n _elements[halfRowSize] = keccak256(buf);\\n }\\n\\n rowSize = halfRowSize + (rowSizeIsOdd ? 1 : 0);\\n depth++;\\n }\\n\\n return _elements[0];\\n }\\n\\n /**\\n * Verifies a merkle branch for the given leaf hash. Assumes the original length\\n * of leaves generated is a known, correct input, and does not return true for indices\\n * extending past that index (even if _siblings would be otherwise valid.)\\n * @param _root The Merkle root to verify against.\\n * @param _leaf The leaf hash to verify inclusion of.\\n * @param _index The index in the tree of this leaf.\\n * @param _siblings Array of sibline nodes in the inclusion proof, starting from depth 0 (bottom of the tree).\\n * @param _totalLeaves The total number of leaves originally passed into.\\n * @return Whether or not the merkle branch and leaf passes verification.\\n */\\n function verify(\\n bytes32 _root,\\n bytes32 _leaf,\\n uint256 _index,\\n bytes32[] memory _siblings,\\n uint256 _totalLeaves\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n require(\\n _totalLeaves > 0,\\n \\\"Lib_MerkleTree: Total leaves must be greater than zero.\\\"\\n );\\n\\n require(\\n _index < _totalLeaves,\\n \\\"Lib_MerkleTree: Index out of bounds.\\\"\\n );\\n\\n require(\\n _siblings.length == _ceilLog2(_totalLeaves),\\n \\\"Lib_MerkleTree: Total siblings does not correctly correspond to total leaves.\\\"\\n );\\n\\n bytes32 computedRoot = _leaf;\\n\\n for (uint256 i = 0; i < _siblings.length; i++) {\\n if ((_index & 1) == 1) {\\n computedRoot = keccak256(\\n abi.encodePacked(\\n _siblings[i],\\n computedRoot\\n )\\n );\\n } else {\\n computedRoot = keccak256(\\n abi.encodePacked(\\n computedRoot,\\n _siblings[i]\\n )\\n );\\n }\\n\\n _index >>= 1;\\n }\\n\\n return _root == computedRoot;\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Calculates the integer ceiling of the log base 2 of an input.\\n * @param _in Unsigned input to calculate the log.\\n * @return ceil(log_base_2(_in))\\n */\\n function _ceilLog2(\\n uint256 _in\\n )\\n private\\n pure\\n returns (\\n uint256\\n )\\n {\\n require(\\n _in > 0,\\n \\\"Lib_MerkleTree: Cannot compute ceil(log_2) of 0.\\\"\\n );\\n\\n if (_in == 1) {\\n return 0;\\n }\\n\\n // Find the highest set bit (will be floor(log_2)).\\n // Borrowed with <3 from https://github.com/ethereum/solidity-examples\\n uint256 val = _in;\\n uint256 highest = 0;\\n for (uint256 i = 128; i >= 1; i >>= 1) {\\n if (val & (uint(1) << i) - 1 << i != 0) {\\n highest += i;\\n val >>= i;\\n }\\n }\\n\\n // Increment by one if this is not a perfect logarithm.\\n if ((uint(1) << highest) != _in) {\\n highest += 1;\\n }\\n\\n return highest;\\n }\\n}\\n\",\"keccak256\":\"0xa78edb9fbd34712771a1ebff05bc5e1abec7fc1e9a1bfb709d183099b44fa62a\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_ErrorUtils } from \\\"../utils/Lib_ErrorUtils.sol\\\";\\n\\n/**\\n * @title Lib_SafeExecutionManagerWrapper\\n * @dev The Safe Execution Manager Wrapper provides functions which facilitate writing OVM safe \\n * code using the standard solidity compiler, by routing all its operations through the Execution \\n * Manager.\\n * \\n * Compiler used: solc\\n * Runtime target: OVM\\n */\\nlibrary Lib_SafeExecutionManagerWrapper {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Performs a safe ovmCALL.\\n * @param _gasLimit Gas limit for the call.\\n * @param _target Address to call.\\n * @param _calldata Data to send to the call.\\n * @return _success Whether or not the call reverted.\\n * @return _returndata Data returned by the call.\\n */\\n function safeCALL(\\n uint256 _gasLimit,\\n address _target,\\n bytes memory _calldata\\n )\\n internal\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCALL(uint256,address,bytes)\\\",\\n _gasLimit,\\n _target,\\n _calldata\\n )\\n );\\n\\n return abi.decode(returndata, (bool, bytes));\\n }\\n\\n /**\\n * Performs a safe ovmDELEGATECALL.\\n * @param _gasLimit Gas limit for the call.\\n * @param _target Address to call.\\n * @param _calldata Data to send to the call.\\n * @return _success Whether or not the call reverted.\\n * @return _returndata Data returned by the call.\\n */\\n function safeDELEGATECALL(\\n uint256 _gasLimit,\\n address _target,\\n bytes memory _calldata\\n )\\n internal\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmDELEGATECALL(uint256,address,bytes)\\\",\\n _gasLimit,\\n _target,\\n _calldata\\n )\\n );\\n\\n return abi.decode(returndata, (bool, bytes));\\n }\\n\\n /**\\n * Performs a safe ovmCREATE call.\\n * @param _gasLimit Gas limit for the creation.\\n * @param _bytecode Code for the new contract.\\n * @return _contract Address of the created contract.\\n */\\n function safeCREATE(\\n uint256 _gasLimit,\\n bytes memory _bytecode\\n )\\n internal\\n returns (\\n address,\\n bytes memory\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n _gasLimit,\\n abi.encodeWithSignature(\\n \\\"ovmCREATE(bytes)\\\",\\n _bytecode\\n )\\n );\\n\\n return abi.decode(returndata, (address, bytes));\\n }\\n\\n /**\\n * Performs a safe ovmEXTCODESIZE call.\\n * @param _contract Address of the contract to query the size of.\\n * @return _EXTCODESIZE Size of the requested contract in bytes.\\n */\\n function safeEXTCODESIZE(\\n address _contract\\n )\\n internal\\n returns (\\n uint256 _EXTCODESIZE\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmEXTCODESIZE(address)\\\",\\n _contract\\n )\\n );\\n\\n return abi.decode(returndata, (uint256));\\n }\\n\\n /**\\n * Performs a safe ovmCHAINID call.\\n * @return _CHAINID Result of calling ovmCHAINID.\\n */\\n function safeCHAINID()\\n internal\\n returns (\\n uint256 _CHAINID\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCHAINID()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (uint256));\\n }\\n\\n /**\\n * Performs a safe ovmCALLER call.\\n * @return _CALLER Result of calling ovmCALLER.\\n */\\n function safeCALLER()\\n internal\\n returns (\\n address _CALLER\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCALLER()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (address));\\n }\\n\\n /**\\n * Performs a safe ovmADDRESS call.\\n * @return _ADDRESS Result of calling ovmADDRESS.\\n */\\n function safeADDRESS()\\n internal\\n returns (\\n address _ADDRESS\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmADDRESS()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (address));\\n }\\n\\n /**\\n * Performs a safe ovmGETNONCE call.\\n * @return _nonce Result of calling ovmGETNONCE.\\n */\\n function safeGETNONCE()\\n internal\\n returns (\\n uint256 _nonce\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmGETNONCE()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (uint256));\\n }\\n\\n /**\\n * Performs a safe ovmINCREMENTNONCE call.\\n */\\n function safeINCREMENTNONCE()\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmINCREMENTNONCE()\\\"\\n )\\n );\\n }\\n\\n /**\\n * Performs a safe ovmCREATEEOA call.\\n * @param _messageHash Message hash which was signed by EOA\\n * @param _v v value of signature (0 or 1)\\n * @param _r r value of signature\\n * @param _s s value of signature\\n */\\n function safeCREATEEOA(\\n bytes32 _messageHash,\\n uint8 _v,\\n bytes32 _r,\\n bytes32 _s\\n )\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCREATEEOA(bytes32,uint8,bytes32,bytes32)\\\",\\n _messageHash,\\n _v,\\n _r,\\n _s\\n )\\n );\\n }\\n\\n /**\\n * Performs a safe REVERT.\\n * @param _reason String revert reason to pass along with the REVERT.\\n */\\n function safeREVERT(\\n string memory _reason\\n )\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmREVERT(bytes)\\\",\\n Lib_ErrorUtils.encodeRevertString(\\n _reason\\n )\\n )\\n );\\n }\\n\\n /**\\n * Performs a safe \\\"require\\\".\\n * @param _condition Boolean condition that must be true or will revert.\\n * @param _reason String revert reason to pass along with the REVERT.\\n */\\n function safeREQUIRE(\\n bool _condition,\\n string memory _reason\\n )\\n internal\\n {\\n if (!_condition) {\\n safeREVERT(\\n _reason\\n );\\n }\\n }\\n\\n /**\\n * Performs a safe ovmSLOAD call.\\n */\\n function safeSLOAD(\\n bytes32 _key\\n )\\n internal\\n returns (\\n bytes32\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmSLOAD(bytes32)\\\",\\n _key\\n )\\n );\\n\\n return abi.decode(returndata, (bytes32));\\n }\\n\\n /**\\n * Performs a safe ovmSSTORE call.\\n */\\n function safeSSTORE(\\n bytes32 _key,\\n bytes32 _value\\n )\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmSSTORE(bytes32,bytes32)\\\",\\n _key,\\n _value\\n )\\n );\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Performs an ovm interaction and the necessary safety checks.\\n * @param _gasLimit Gas limit for the interaction.\\n * @param _calldata Data to send to the OVM_ExecutionManager (encoded with sighash).\\n * @return _returndata Data sent back by the OVM_ExecutionManager.\\n */\\n function _safeExecutionManagerInteraction(\\n uint256 _gasLimit,\\n bytes memory _calldata\\n )\\n private\\n returns (\\n bytes memory _returndata\\n )\\n {\\n address ovmExecutionManager = msg.sender;\\n (\\n bool success,\\n bytes memory returndata\\n ) = ovmExecutionManager.call{gas: _gasLimit}(_calldata);\\n\\n if (success == false) {\\n assembly {\\n revert(add(returndata, 0x20), mload(returndata))\\n }\\n } else if (returndata.length == 1) {\\n assembly {\\n return(0, 1)\\n }\\n } else {\\n return returndata;\\n }\\n }\\n\\n function _safeExecutionManagerInteraction(\\n bytes memory _calldata\\n )\\n private\\n returns (\\n bytes memory _returndata\\n )\\n {\\n return _safeExecutionManagerInteraction(\\n gasleft(),\\n _calldata\\n );\\n }\\n}\\n\",\"keccak256\":\"0x41e146e7912af794a17cd43c5a276674be956bfa8f3ca5b451bcb82d81e6f492\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x608060405234801561001057600080fd5b50604051611bc5380380611bc583398101604081905261002f9161005b565b600080546001600160a01b0319166001600160a01b03949094169390931790925560015560025561009c565b60008060006060848603121561006f578283fd5b83516001600160a01b0381168114610085578384fd5b602085015160409095015190969495509392505050565b611b1a806100ab6000396000f3fe608060405234801561001057600080fd5b50600436106100b45760003560e01c80638ca5cbb9116100715780638ca5cbb91461012f5780639418bddd14610144578063b8e189ac14610157578063c17b291b1461016a578063cfdf677e14610172578063e561dddc1461017a576100b4565b8063299ca478146100b9578063461a4478146100d75780634d69ee57146100ea5780637aa63a861461010a5780637ad168a01461011f57806381eb62ef14610127575b600080fd5b6100c1610182565b6040516100ce919061159f565b60405180910390f35b6100c16100e53660046114e3565b610191565b6100fd6100f8366004611431565b61026f565b6040516100ce91906115b3565b6101126102e2565b6040516100ce91906115be565b6101126102fb565b610112610314565b61014261013d366004611390565b61031a565b005b6100fd610152366004611531565b61052e565b610142610165366004611531565b61057e565b610112610636565b6100c161063c565b610112610664565b6000546001600160a01b031681565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b838110156101f15781810151838201526020016101d9565b50505050905090810190601f16801561021e5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561023b57600080fd5b505afa15801561024f573d6000803e3d6000fd5b505050506040513d602081101561026557600080fd5b505190505b919050565b600061027a836106de565b61029f5760405162461bcd60e51b815260040161029690611749565b60405180910390fd5b6102bc836020015185846000015185602001518760400151610776565b6102d85760405162461bcd60e51b8152600401610296906116b5565b5060019392505050565b6000806102ed6108fb565b5064ffffffffff1691505090565b6000806103066108fb565b64ffffffffff169250505090565b60025481565b6103226102e2565b81146103405760405162461bcd60e51b8152600401610296906116ec565b6103706040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b815250610191565b6001600160a01b03166302ad4d2a336040518263ffffffff1660e01b815260040161039b919061159f565b60206040518083038186803b1580156103b357600080fd5b505afa1580156103c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103eb91906113d3565b6104075760405162461bcd60e51b8152600401610296906118bb565b60008251116104285760405162461bcd60e51b815260040161029690611878565b6104666040518060400160405280601d81526020017f4f564d5f43616e6f6e6963616c5472616e73616374696f6e436861696e000000815250610191565b6001600160a01b0316637aa63a866040518163ffffffff1660e01b815260040160206040518083038186803b15801561049e57600080fd5b505afa1580156104b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104d69190611419565b82516104e06102e2565b0111156104ff5760405162461bcd60e51b815260040161029690611646565b61052a8242336040516020016105169291906119a1565b604051602081830303815290604052610990565b5050565b60008082608001518060200190518101906105499190611564565b509050806105695760405162461bcd60e51b815260040161029690611833565b4261057682600154610b31565b119392505050565b6105b06040518060400160405280601181526020017027ab26afa33930bab22b32b934b334b2b960791b815250610191565b6001600160a01b0316336001600160a01b0316146105e05760405162461bcd60e51b8152600401610296906117d6565b6105e9816106de565b6106055760405162461bcd60e51b815260040161029690611749565b61060e8161052e565b61062a5760405162461bcd60e51b815260040161029690611778565b61063381610b92565b50565b60015481565b600061065f604051806060016040528060258152602001611ab560259139610191565b905090565b600061066e61063c565b6001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b1580156106a657600080fd5b505afa1580156106ba573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061065f9190611419565b60006106e861063c565b8251604051634a83e9cd60e11b81526001600160a01b039290921691639507d39a91610716916004016115be565b60206040518083038186803b15801561072e57600080fd5b505afa158015610742573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107669190611419565b61076f83610d0a565b1492915050565b60008082116107b65760405162461bcd60e51b8152600401808060200182810382526037815260200180611a316037913960400191505060405180910390fd5b8184106107f45760405162461bcd60e51b81526004018080602001828103825260248152602001806119dd6024913960400191505060405180910390fd5b6107fd82610d50565b83511461083b5760405162461bcd60e51b815260040180806020018281038252604d815260200180611a68604d913960600191505060405180910390fd5b8460005b84518110156108ee57856001166001141561089d5784818151811061086057fe5b60200260200101518260405160200180838152602001828152602001925050506040516020818303038152906040528051906020012091506108e2565b818582815181106108aa57fe5b602002602001015160405160200180838152602001828152602001925050506040516020818303038152906040528051906020012091505b600195861c950161083f565b5090951495945050505050565b600080600061090861063c565b6001600160a01b031663ccf8f9696040518163ffffffff1660e01b815260040160206040518083038186803b15801561094057600080fd5b505afa158015610954573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061097891906113f3565b64ffffffffff602882901c16935060501c9150509091565b60006109bf6040518060400160405280600c81526020016b27ab26afa83937b837b9b2b960a11b815250610191565b90506000806109cc6108fb565b9092509050336001600160a01b03841614156109e9575042610a13565b426002548264ffffffffff160110610a135760405162461bcd60e51b81526004016102969061190a565b60006040518060a00160405280610a28610664565b8152602001610a3688610de6565b8152602001875181526020018464ffffffffff16815260200186815250905080600001517f16be4c5129a4e03cf3350262e181dc02ddfb4a6008d925368c0899fcd97ca9c58260200151836040015184606001518560800151604051610a9f94939291906115dd565b60405180910390a2610aaf61063c565b6001600160a01b0316632015276c610ac683610d0a565b610ada84604001518560600151018661121a565b6040518363ffffffff1660e01b8152600401610af79291906115c7565b600060405180830381600087803b158015610b1157600080fd5b505af1158015610b25573d6000803e3d6000fd5b50505050505050505050565b600082820183811015610b8b576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b610b9a61063c565b6001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b158015610bd257600080fd5b505afa158015610be6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c0a9190611419565b815110610c295760405162461bcd60e51b815260040161029690611973565b610c32816106de565b610c4e5760405162461bcd60e51b815260040161029690611749565b610c5661063c565b6001600160a01b031663167fd6818260000151610c788460600151600061121a565b6040518363ffffffff1660e01b8152600401610c959291906115c7565b600060405180830381600087803b158015610caf57600080fd5b505af1158015610cc3573d6000803e3d6000fd5b5050505080600001517f8747b69ce8fdb31c3b9b0a67bd8049ad8c1a69ea417b69b12174068abd9cbd648260200151604051610cff91906115be565b60405180910390a250565b60008160200151826040015183606001518460800151604051602001610d3394939291906115dd565b604051602081830303815290604052805190602001209050919050565b6000808211610d905760405162461bcd60e51b8152600401808060200182810382526030815260200180611a016030913960400191505060405180910390fd5b8160011415610da15750600061026a565b81600060805b60018110610dd1576000196001821b01811b831615610dc95791821c91908101905b60011c610da7565b506001811b8414610b8b576001019392505050565b600080825111610e275760405162461bcd60e51b8152600401808060200182810382526034815260200180611ada6034913960400191505060405180910390fd5b815160011415610e4d5781600081518110610e3e57fe5b6020026020010151905061026a565b60408051610200810182527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56381527f633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d60208201527f890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d818301527f3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd86060808301919091527fecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da60808301527fdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da560a08301527f617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d760c08301527f292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead60e08301527fe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e106101008301527f7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f826101208301527fe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e836365166101408301527f3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c6101608301527fad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e6101808301527fa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab6101a08301527f4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c8626101c08301527f2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf106101e083015282518381529081018352909160009190602082018180368337505085519192506000918291508180805b60018411156111f65750506002820460018084161460005b82811015611172578a816002028151811061111957fe5b602002602001015196508a816002026001018151811061113557fe5b6020026020010151955086602089015285604089015287805190602001208b828151811061115f57fe5b6020908102919091010152600101611102565b5080156111d55789600185038151811061118857fe5b6020026020010151955087836010811061119e57fe5b602002015160001b945085602088015284604088015286805190602001208a83815181106111c857fe5b6020026020010181815250505b806111e15760006111e4565b60015b60ff16820193506001909201916110ea565b8960008151811061120357fe5b602002602001015198505050505050505050919050565b602890811b91909117901b90565b600067ffffffffffffffff83111561123c57fe5b61124f601f8401601f19166020016119b8565b905082815283838301111561126357600080fd5b828260208301376000602084830101529392505050565b600082601f83011261128a578081fd5b8135602067ffffffffffffffff8211156112a057fe5b8082026112ae8282016119b8565b8381528281019086840183880185018910156112c8578687fd5b8693505b858410156112ea5780358352600193909301929184019184016112cc565b50979650505050505050565b600060a08284031215611307578081fd5b60405160a0810167ffffffffffffffff828210818311171561132557fe5b8160405282935084358352602085013560208401526040850135604084015260608501356060840152608085013591508082111561136257600080fd5b508301601f8101851361137457600080fd5b61138385823560208401611228565b6080830152505092915050565b600080604083850312156113a2578182fd5b823567ffffffffffffffff8111156113b8578283fd5b6113c48582860161127a565b95602094909401359450505050565b6000602082840312156113e4578081fd5b81518015158114610b8b578182fd5b600060208284031215611404578081fd5b815164ffffffffff1981168114610b8b578182fd5b60006020828403121561142a578081fd5b5051919050565b600080600060608486031215611445578081fd5b83359250602084013567ffffffffffffffff80821115611463578283fd5b61146f878388016112f6565b93506040860135915080821115611484578283fd5b9085019060408288031215611497578283fd5b6040516040810181811083821117156114ac57fe5b604052823581526020830135828111156114c4578485fd5b6114d08982860161127a565b6020830152508093505050509250925092565b6000602082840312156114f4578081fd5b813567ffffffffffffffff81111561150a578182fd5b8201601f8101841361151a578182fd5b61152984823560208401611228565b949350505050565b600060208284031215611542578081fd5b813567ffffffffffffffff811115611558578182fd5b611529848285016112f6565b60008060408385031215611576578182fd5b825160208401519092506001600160a01b0381168114611594578182fd5b809150509250929050565b6001600160a01b0391909116815260200190565b901515815260200190565b90815260200190565b91825264ffffffffff1916602082015260400190565b600085825260208581840152846040840152608060608401528351806080850152825b8181101561161c5785810183015185820160a001528201611600565b8181111561162d578360a083870101525b50601f01601f19169290920160a0019695505050505050565b60208082526049908201527f4e756d626572206f6620737461746520726f6f74732063616e6e6f742065786360408201527f65656420746865206e756d626572206f662063616e6f6e6963616c207472616e60608201526839b0b1ba34b7b7399760b91b608082015260a00190565b60208082526018908201527f496e76616c696420696e636c7573696f6e2070726f6f662e0000000000000000604082015260600190565b6020808252603d908201527f41637475616c20626174636820737461727420696e64657820646f6573206e6f60408201527f74206d6174636820657870656374656420737461727420696e6465782e000000606082015260800190565b60208082526015908201527424b73b30b634b2103130ba31b4103432b0b232b91760591b604082015260600190565b602080825260409082018190527f537461746520626174636865732063616e206f6e6c792062652064656c657465908201527f642077697468696e207468652066726175642070726f6f662077696e646f772e606082015260800190565b6020808252603b908201527f537461746520626174636865732063616e206f6e6c792062652064656c65746560408201527f6420627920746865204f564d5f467261756456657269666965722e0000000000606082015260800190565b60208082526025908201527f4261746368206865616465722074696d657374616d702063616e6e6f74206265604082015264207a65726f60d81b606082015260800190565b60208082526023908201527f43616e6e6f74207375626d697420616e20656d7074792073746174652062617460408201526231b41760e91b606082015260800190565b6020808252602f908201527f50726f706f73657220646f6573206e6f74206861766520656e6f75676820636f60408201526e1b1b185d195c985b081c1bdcdd1959608a1b606082015260800190565b60208082526043908201527f43616e6e6f74207075626c69736820737461746520726f6f747320776974686960408201527f6e207468652073657175656e636572207075626c69636174696f6e2077696e6460608201526237bb9760e91b608082015260a00190565b60208082526014908201527324b73b30b634b2103130ba31b41034b73232bc1760611b604082015260600190565b9182526001600160a01b0316602082015260400190565b60405181810167ffffffffffffffff811182821017156119d457fe5b60405291905056fe4c69625f4d65726b6c65547265653a20496e646578206f7574206f6620626f756e64732e4c69625f4d65726b6c65547265653a2043616e6e6f7420636f6d70757465206365696c286c6f675f3229206f6620302e4c69625f4d65726b6c65547265653a20546f74616c206c6561766573206d7573742062652067726561746572207468616e207a65726f2e4c69625f4d65726b6c65547265653a20546f74616c207369626c696e677320646f6573206e6f7420636f72726563746c7920636f72726573706f6e6420746f20746f74616c206c65617665732e4f564d5f436861696e53746f72616765436f6e7461696e65723a5343433a626174636865734c69625f4d65726b6c65547265653a204d7573742070726f76696465206174206c65617374206f6e65206c65616620686173682ea164736f6c6343000706000a", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100b45760003560e01c80638ca5cbb9116100715780638ca5cbb91461012f5780639418bddd14610144578063b8e189ac14610157578063c17b291b1461016a578063cfdf677e14610172578063e561dddc1461017a576100b4565b8063299ca478146100b9578063461a4478146100d75780634d69ee57146100ea5780637aa63a861461010a5780637ad168a01461011f57806381eb62ef14610127575b600080fd5b6100c1610182565b6040516100ce919061159f565b60405180910390f35b6100c16100e53660046114e3565b610191565b6100fd6100f8366004611431565b61026f565b6040516100ce91906115b3565b6101126102e2565b6040516100ce91906115be565b6101126102fb565b610112610314565b61014261013d366004611390565b61031a565b005b6100fd610152366004611531565b61052e565b610142610165366004611531565b61057e565b610112610636565b6100c161063c565b610112610664565b6000546001600160a01b031681565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b838110156101f15781810151838201526020016101d9565b50505050905090810190601f16801561021e5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561023b57600080fd5b505afa15801561024f573d6000803e3d6000fd5b505050506040513d602081101561026557600080fd5b505190505b919050565b600061027a836106de565b61029f5760405162461bcd60e51b815260040161029690611749565b60405180910390fd5b6102bc836020015185846000015185602001518760400151610776565b6102d85760405162461bcd60e51b8152600401610296906116b5565b5060019392505050565b6000806102ed6108fb565b5064ffffffffff1691505090565b6000806103066108fb565b64ffffffffff169250505090565b60025481565b6103226102e2565b81146103405760405162461bcd60e51b8152600401610296906116ec565b6103706040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b815250610191565b6001600160a01b03166302ad4d2a336040518263ffffffff1660e01b815260040161039b919061159f565b60206040518083038186803b1580156103b357600080fd5b505afa1580156103c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103eb91906113d3565b6104075760405162461bcd60e51b8152600401610296906118bb565b60008251116104285760405162461bcd60e51b815260040161029690611878565b6104666040518060400160405280601d81526020017f4f564d5f43616e6f6e6963616c5472616e73616374696f6e436861696e000000815250610191565b6001600160a01b0316637aa63a866040518163ffffffff1660e01b815260040160206040518083038186803b15801561049e57600080fd5b505afa1580156104b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104d69190611419565b82516104e06102e2565b0111156104ff5760405162461bcd60e51b815260040161029690611646565b61052a8242336040516020016105169291906119a1565b604051602081830303815290604052610990565b5050565b60008082608001518060200190518101906105499190611564565b509050806105695760405162461bcd60e51b815260040161029690611833565b4261057682600154610b31565b119392505050565b6105b06040518060400160405280601181526020017027ab26afa33930bab22b32b934b334b2b960791b815250610191565b6001600160a01b0316336001600160a01b0316146105e05760405162461bcd60e51b8152600401610296906117d6565b6105e9816106de565b6106055760405162461bcd60e51b815260040161029690611749565b61060e8161052e565b61062a5760405162461bcd60e51b815260040161029690611778565b61063381610b92565b50565b60015481565b600061065f604051806060016040528060258152602001611ab560259139610191565b905090565b600061066e61063c565b6001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b1580156106a657600080fd5b505afa1580156106ba573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061065f9190611419565b60006106e861063c565b8251604051634a83e9cd60e11b81526001600160a01b039290921691639507d39a91610716916004016115be565b60206040518083038186803b15801561072e57600080fd5b505afa158015610742573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107669190611419565b61076f83610d0a565b1492915050565b60008082116107b65760405162461bcd60e51b8152600401808060200182810382526037815260200180611a316037913960400191505060405180910390fd5b8184106107f45760405162461bcd60e51b81526004018080602001828103825260248152602001806119dd6024913960400191505060405180910390fd5b6107fd82610d50565b83511461083b5760405162461bcd60e51b815260040180806020018281038252604d815260200180611a68604d913960600191505060405180910390fd5b8460005b84518110156108ee57856001166001141561089d5784818151811061086057fe5b60200260200101518260405160200180838152602001828152602001925050506040516020818303038152906040528051906020012091506108e2565b818582815181106108aa57fe5b602002602001015160405160200180838152602001828152602001925050506040516020818303038152906040528051906020012091505b600195861c950161083f565b5090951495945050505050565b600080600061090861063c565b6001600160a01b031663ccf8f9696040518163ffffffff1660e01b815260040160206040518083038186803b15801561094057600080fd5b505afa158015610954573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061097891906113f3565b64ffffffffff602882901c16935060501c9150509091565b60006109bf6040518060400160405280600c81526020016b27ab26afa83937b837b9b2b960a11b815250610191565b90506000806109cc6108fb565b9092509050336001600160a01b03841614156109e9575042610a13565b426002548264ffffffffff160110610a135760405162461bcd60e51b81526004016102969061190a565b60006040518060a00160405280610a28610664565b8152602001610a3688610de6565b8152602001875181526020018464ffffffffff16815260200186815250905080600001517f16be4c5129a4e03cf3350262e181dc02ddfb4a6008d925368c0899fcd97ca9c58260200151836040015184606001518560800151604051610a9f94939291906115dd565b60405180910390a2610aaf61063c565b6001600160a01b0316632015276c610ac683610d0a565b610ada84604001518560600151018661121a565b6040518363ffffffff1660e01b8152600401610af79291906115c7565b600060405180830381600087803b158015610b1157600080fd5b505af1158015610b25573d6000803e3d6000fd5b50505050505050505050565b600082820183811015610b8b576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b610b9a61063c565b6001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b158015610bd257600080fd5b505afa158015610be6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c0a9190611419565b815110610c295760405162461bcd60e51b815260040161029690611973565b610c32816106de565b610c4e5760405162461bcd60e51b815260040161029690611749565b610c5661063c565b6001600160a01b031663167fd6818260000151610c788460600151600061121a565b6040518363ffffffff1660e01b8152600401610c959291906115c7565b600060405180830381600087803b158015610caf57600080fd5b505af1158015610cc3573d6000803e3d6000fd5b5050505080600001517f8747b69ce8fdb31c3b9b0a67bd8049ad8c1a69ea417b69b12174068abd9cbd648260200151604051610cff91906115be565b60405180910390a250565b60008160200151826040015183606001518460800151604051602001610d3394939291906115dd565b604051602081830303815290604052805190602001209050919050565b6000808211610d905760405162461bcd60e51b8152600401808060200182810382526030815260200180611a016030913960400191505060405180910390fd5b8160011415610da15750600061026a565b81600060805b60018110610dd1576000196001821b01811b831615610dc95791821c91908101905b60011c610da7565b506001811b8414610b8b576001019392505050565b600080825111610e275760405162461bcd60e51b8152600401808060200182810382526034815260200180611ada6034913960400191505060405180910390fd5b815160011415610e4d5781600081518110610e3e57fe5b6020026020010151905061026a565b60408051610200810182527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56381527f633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d60208201527f890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d818301527f3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd86060808301919091527fecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da60808301527fdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da560a08301527f617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d760c08301527f292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead60e08301527fe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e106101008301527f7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f826101208301527fe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e836365166101408301527f3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c6101608301527fad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e6101808301527fa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab6101a08301527f4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c8626101c08301527f2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf106101e083015282518381529081018352909160009190602082018180368337505085519192506000918291508180805b60018411156111f65750506002820460018084161460005b82811015611172578a816002028151811061111957fe5b602002602001015196508a816002026001018151811061113557fe5b6020026020010151955086602089015285604089015287805190602001208b828151811061115f57fe5b6020908102919091010152600101611102565b5080156111d55789600185038151811061118857fe5b6020026020010151955087836010811061119e57fe5b602002015160001b945085602088015284604088015286805190602001208a83815181106111c857fe5b6020026020010181815250505b806111e15760006111e4565b60015b60ff16820193506001909201916110ea565b8960008151811061120357fe5b602002602001015198505050505050505050919050565b602890811b91909117901b90565b600067ffffffffffffffff83111561123c57fe5b61124f601f8401601f19166020016119b8565b905082815283838301111561126357600080fd5b828260208301376000602084830101529392505050565b600082601f83011261128a578081fd5b8135602067ffffffffffffffff8211156112a057fe5b8082026112ae8282016119b8565b8381528281019086840183880185018910156112c8578687fd5b8693505b858410156112ea5780358352600193909301929184019184016112cc565b50979650505050505050565b600060a08284031215611307578081fd5b60405160a0810167ffffffffffffffff828210818311171561132557fe5b8160405282935084358352602085013560208401526040850135604084015260608501356060840152608085013591508082111561136257600080fd5b508301601f8101851361137457600080fd5b61138385823560208401611228565b6080830152505092915050565b600080604083850312156113a2578182fd5b823567ffffffffffffffff8111156113b8578283fd5b6113c48582860161127a565b95602094909401359450505050565b6000602082840312156113e4578081fd5b81518015158114610b8b578182fd5b600060208284031215611404578081fd5b815164ffffffffff1981168114610b8b578182fd5b60006020828403121561142a578081fd5b5051919050565b600080600060608486031215611445578081fd5b83359250602084013567ffffffffffffffff80821115611463578283fd5b61146f878388016112f6565b93506040860135915080821115611484578283fd5b9085019060408288031215611497578283fd5b6040516040810181811083821117156114ac57fe5b604052823581526020830135828111156114c4578485fd5b6114d08982860161127a565b6020830152508093505050509250925092565b6000602082840312156114f4578081fd5b813567ffffffffffffffff81111561150a578182fd5b8201601f8101841361151a578182fd5b61152984823560208401611228565b949350505050565b600060208284031215611542578081fd5b813567ffffffffffffffff811115611558578182fd5b611529848285016112f6565b60008060408385031215611576578182fd5b825160208401519092506001600160a01b0381168114611594578182fd5b809150509250929050565b6001600160a01b0391909116815260200190565b901515815260200190565b90815260200190565b91825264ffffffffff1916602082015260400190565b600085825260208581840152846040840152608060608401528351806080850152825b8181101561161c5785810183015185820160a001528201611600565b8181111561162d578360a083870101525b50601f01601f19169290920160a0019695505050505050565b60208082526049908201527f4e756d626572206f6620737461746520726f6f74732063616e6e6f742065786360408201527f65656420746865206e756d626572206f662063616e6f6e6963616c207472616e60608201526839b0b1ba34b7b7399760b91b608082015260a00190565b60208082526018908201527f496e76616c696420696e636c7573696f6e2070726f6f662e0000000000000000604082015260600190565b6020808252603d908201527f41637475616c20626174636820737461727420696e64657820646f6573206e6f60408201527f74206d6174636820657870656374656420737461727420696e6465782e000000606082015260800190565b60208082526015908201527424b73b30b634b2103130ba31b4103432b0b232b91760591b604082015260600190565b602080825260409082018190527f537461746520626174636865732063616e206f6e6c792062652064656c657465908201527f642077697468696e207468652066726175642070726f6f662077696e646f772e606082015260800190565b6020808252603b908201527f537461746520626174636865732063616e206f6e6c792062652064656c65746560408201527f6420627920746865204f564d5f467261756456657269666965722e0000000000606082015260800190565b60208082526025908201527f4261746368206865616465722074696d657374616d702063616e6e6f74206265604082015264207a65726f60d81b606082015260800190565b60208082526023908201527f43616e6e6f74207375626d697420616e20656d7074792073746174652062617460408201526231b41760e91b606082015260800190565b6020808252602f908201527f50726f706f73657220646f6573206e6f74206861766520656e6f75676820636f60408201526e1b1b185d195c985b081c1bdcdd1959608a1b606082015260800190565b60208082526043908201527f43616e6e6f74207075626c69736820737461746520726f6f747320776974686960408201527f6e207468652073657175656e636572207075626c69636174696f6e2077696e6460608201526237bb9760e91b608082015260a00190565b60208082526014908201527324b73b30b634b2103130ba31b41034b73232bc1760611b604082015260600190565b9182526001600160a01b0316602082015260400190565b60405181810167ffffffffffffffff811182821017156119d457fe5b60405291905056fe4c69625f4d65726b6c65547265653a20496e646578206f7574206f6620626f756e64732e4c69625f4d65726b6c65547265653a2043616e6e6f7420636f6d70757465206365696c286c6f675f3229206f6620302e4c69625f4d65726b6c65547265653a20546f74616c206c6561766573206d7573742062652067726561746572207468616e207a65726f2e4c69625f4d65726b6c65547265653a20546f74616c207369626c696e677320646f6573206e6f7420636f72726563746c7920636f72726573706f6e6420746f20746f74616c206c65617665732e4f564d5f436861696e53746f72616765436f6e7461696e65723a5343433a626174636865734c69625f4d65726b6c65547265653a204d7573742070726f76696465206174206c65617374206f6e65206c65616620686173682ea164736f6c6343000706000a", + "solcInputHash": "f2bdab652d5102f5f11e78dae866798d", + "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_fraudProofWindow\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_sequencerPublishWindow\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_batchIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"_batchRoot\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_batchSize\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_prevTotalElements\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"_extraData\",\"type\":\"bytes\"}],\"name\":\"StateBatchAppended\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_batchIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"_batchRoot\",\"type\":\"bytes32\"}],\"name\":\"StateBatchDeleted\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"FRAUD_PROOF_WINDOW\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"SEQUENCER_PUBLISH_WINDOW\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"_batch\",\"type\":\"bytes32[]\"},{\"internalType\":\"uint256\",\"name\":\"_shouldStartAtElement\",\"type\":\"uint256\"}],\"name\":\"appendStateBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"batches\",\"outputs\":[{\"internalType\":\"contract iOVM_ChainStorageContainer\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"_batchHeader\",\"type\":\"tuple\"}],\"name\":\"deleteStateBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLastSequencerTimestamp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_lastSequencerTimestamp\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTotalBatches\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_totalBatches\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTotalElements\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_totalElements\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"_batchHeader\",\"type\":\"tuple\"}],\"name\":\"insideFraudProofWindow\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"_inside\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_element\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"_batchHeader\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"siblings\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct Lib_OVMCodec.ChainInclusionProof\",\"name\":\"_proof\",\"type\":\"tuple\"}],\"name\":\"verifyStateCommitment\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The State Commitment Chain (SCC) contract contains a list of proposed state roots which Proposers assert to be a result of each transaction in the Canonical Transaction Chain (CTC). Elements here have a 1:1 correspondence with transactions in the CTC, and should be the unique state root calculated off-chain by applying the canonical transactions one by one. Compiler used: solc Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"appendStateBatch(bytes32[],uint256)\":{\"params\":{\"_batch\":\"Batch of state roots.\",\"_shouldStartAtElement\":\"Index of the element at which this batch should start.\"}},\"batches()\":{\"returns\":{\"_0\":\"Reference to the batch storage container.\"}},\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\"}},\"deleteStateBatch((uint256,bytes32,uint256,uint256,bytes))\":{\"params\":{\"_batchHeader\":\"Header of the batch to start deleting from.\"}},\"getLastSequencerTimestamp()\":{\"returns\":{\"_lastSequencerTimestamp\":\"Last sequencer batch timestamp.\"}},\"getTotalBatches()\":{\"returns\":{\"_totalBatches\":\"Total submitted batches.\"}},\"getTotalElements()\":{\"returns\":{\"_totalElements\":\"Total submitted elements.\"}},\"insideFraudProofWindow((uint256,bytes32,uint256,uint256,bytes))\":{\"params\":{\"_batchHeader\":\"Header of the batch to check.\"},\"returns\":{\"_inside\":\"Whether or not the batch is inside the fraud proof window.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}},\"verifyStateCommitment(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))\":{\"params\":{\"_batchHeader\":\"Header of the batch in which the element was included.\",\"_element\":\"Hash of the element to verify a proof for.\",\"_proof\":\"Merkle inclusion proof for the element.\"}}},\"title\":\"OVM_StateCommitmentChain\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"appendStateBatch(bytes32[],uint256)\":{\"notice\":\"Appends a batch of state roots to the chain.\"},\"batches()\":{\"notice\":\"Accesses the batch storage container.\"},\"deleteStateBatch((uint256,bytes32,uint256,uint256,bytes))\":{\"notice\":\"Deletes all state roots after (and including) a given batch.\"},\"getLastSequencerTimestamp()\":{\"notice\":\"Retrieves the timestamp of the last batch submitted by the sequencer.\"},\"getTotalBatches()\":{\"notice\":\"Retrieves the total number of batches submitted.\"},\"getTotalElements()\":{\"notice\":\"Retrieves the total number of elements submitted.\"},\"insideFraudProofWindow((uint256,bytes32,uint256,uint256,bytes))\":{\"notice\":\"Checks whether a given batch is still inside its fraud proof window.\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"},\"verifyStateCommitment(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))\":{\"notice\":\"Verifies a batch inclusion proof.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/OVM/chain/OVM_StateCommitmentChain.sol\":\"OVM_StateCommitmentChain\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor () internal {\\n address msgSender = _msgSender();\\n _owner = msgSender;\\n emit OwnershipTransferred(address(0), msgSender);\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n emit OwnershipTransferred(_owner, address(0));\\n _owner = address(0);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n emit OwnershipTransferred(_owner, newOwner);\\n _owner = newOwner;\\n }\\n}\\n\",\"keccak256\":\"0x15e2d5bd4c28a88548074c54d220e8086f638a71ed07e6b3ba5a70066fcf458d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/math/SafeMath.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\n * checks.\\n *\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\n * in bugs, because programmers usually assume that an overflow raises an\\n * error, which is the standard behavior in high level programming languages.\\n * `SafeMath` restores this intuition by reverting the transaction when an\\n * operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n */\\nlibrary SafeMath {\\n /**\\n * @dev Returns the addition of two unsigned integers, with an overflow flag.\\n *\\n * _Available since v3.4._\\n */\\n function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n uint256 c = a + b;\\n if (c < a) return (false, 0);\\n return (true, c);\\n }\\n\\n /**\\n * @dev Returns the substraction of two unsigned integers, with an overflow flag.\\n *\\n * _Available since v3.4._\\n */\\n function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n if (b > a) return (false, 0);\\n return (true, a - b);\\n }\\n\\n /**\\n * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\\n *\\n * _Available since v3.4._\\n */\\n function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\n // benefit is lost if 'b' is also tested.\\n // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\n if (a == 0) return (true, 0);\\n uint256 c = a * b;\\n if (c / a != b) return (false, 0);\\n return (true, c);\\n }\\n\\n /**\\n * @dev Returns the division of two unsigned integers, with a division by zero flag.\\n *\\n * _Available since v3.4._\\n */\\n function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n if (b == 0) return (false, 0);\\n return (true, a / b);\\n }\\n\\n /**\\n * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\\n *\\n * _Available since v3.4._\\n */\\n function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n if (b == 0) return (false, 0);\\n return (true, a % b);\\n }\\n\\n /**\\n * @dev Returns the addition of two unsigned integers, reverting on\\n * overflow.\\n *\\n * Counterpart to Solidity's `+` operator.\\n *\\n * Requirements:\\n *\\n * - Addition cannot overflow.\\n */\\n function add(uint256 a, uint256 b) internal pure returns (uint256) {\\n uint256 c = a + b;\\n require(c >= a, \\\"SafeMath: addition overflow\\\");\\n return c;\\n }\\n\\n /**\\n * @dev Returns the subtraction of two unsigned integers, reverting on\\n * overflow (when the result is negative).\\n *\\n * Counterpart to Solidity's `-` operator.\\n *\\n * Requirements:\\n *\\n * - Subtraction cannot overflow.\\n */\\n function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\n require(b <= a, \\\"SafeMath: subtraction overflow\\\");\\n return a - b;\\n }\\n\\n /**\\n * @dev Returns the multiplication of two unsigned integers, reverting on\\n * overflow.\\n *\\n * Counterpart to Solidity's `*` operator.\\n *\\n * Requirements:\\n *\\n * - Multiplication cannot overflow.\\n */\\n function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\n if (a == 0) return 0;\\n uint256 c = a * b;\\n require(c / a == b, \\\"SafeMath: multiplication overflow\\\");\\n return c;\\n }\\n\\n /**\\n * @dev Returns the integer division of two unsigned integers, reverting on\\n * division by zero. The result is rounded towards zero.\\n *\\n * Counterpart to Solidity's `/` operator. Note: this function uses a\\n * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n * uses an invalid opcode to revert (consuming all remaining gas).\\n *\\n * Requirements:\\n *\\n * - The divisor cannot be zero.\\n */\\n function div(uint256 a, uint256 b) internal pure returns (uint256) {\\n require(b > 0, \\\"SafeMath: division by zero\\\");\\n return a / b;\\n }\\n\\n /**\\n * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n * reverting when dividing by zero.\\n *\\n * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n * opcode (which leaves remaining gas untouched) while Solidity uses an\\n * invalid opcode to revert (consuming all remaining gas).\\n *\\n * Requirements:\\n *\\n * - The divisor cannot be zero.\\n */\\n function mod(uint256 a, uint256 b) internal pure returns (uint256) {\\n require(b > 0, \\\"SafeMath: modulo by zero\\\");\\n return a % b;\\n }\\n\\n /**\\n * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\n * overflow (when the result is negative).\\n *\\n * CAUTION: This function is deprecated because it requires allocating memory for the error\\n * message unnecessarily. For custom revert reasons use {trySub}.\\n *\\n * Counterpart to Solidity's `-` operator.\\n *\\n * Requirements:\\n *\\n * - Subtraction cannot overflow.\\n */\\n function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n require(b <= a, errorMessage);\\n return a - b;\\n }\\n\\n /**\\n * @dev Returns the integer division of two unsigned integers, reverting with custom message on\\n * division by zero. The result is rounded towards zero.\\n *\\n * CAUTION: This function is deprecated because it requires allocating memory for the error\\n * message unnecessarily. For custom revert reasons use {tryDiv}.\\n *\\n * Counterpart to Solidity's `/` operator. Note: this function uses a\\n * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n * uses an invalid opcode to revert (consuming all remaining gas).\\n *\\n * Requirements:\\n *\\n * - The divisor cannot be zero.\\n */\\n function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n require(b > 0, errorMessage);\\n return a / b;\\n }\\n\\n /**\\n * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n * reverting with custom message when dividing by zero.\\n *\\n * CAUTION: This function is deprecated because it requires allocating memory for the error\\n * message unnecessarily. For custom revert reasons use {tryMod}.\\n *\\n * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n * opcode (which leaves remaining gas untouched) while Solidity uses an\\n * invalid opcode to revert (consuming all remaining gas).\\n *\\n * Requirements:\\n *\\n * - The divisor cannot be zero.\\n */\\n function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n require(b > 0, errorMessage);\\n return a % b;\\n }\\n}\\n\",\"keccak256\":\"0xcc78a17dd88fa5a2edc60c8489e2f405c0913b377216a5b26b35656b2d0dab52\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with GSN meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address payable) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes memory) {\\n this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x8d3cb350f04ff49cfb10aef08d87f19dcbaecc8027b0bed12f3275cd12f38cf0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/chain/OVM_StateCommitmentChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\nimport { Lib_MerkleTree } from \\\"../../libraries/utils/Lib_MerkleTree.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_FraudVerifier } from \\\"../../iOVM/verification/iOVM_FraudVerifier.sol\\\";\\nimport { iOVM_StateCommitmentChain } from \\\"../../iOVM/chain/iOVM_StateCommitmentChain.sol\\\";\\nimport { iOVM_CanonicalTransactionChain } from \\\"../../iOVM/chain/iOVM_CanonicalTransactionChain.sol\\\";\\nimport { iOVM_BondManager } from \\\"../../iOVM/verification/iOVM_BondManager.sol\\\";\\nimport { iOVM_ChainStorageContainer } from \\\"../../iOVM/chain/iOVM_ChainStorageContainer.sol\\\";\\n\\n/* External Imports */\\nimport '@openzeppelin/contracts/math/SafeMath.sol';\\n\\n/**\\n * @title OVM_StateCommitmentChain\\n * @dev The State Commitment Chain (SCC) contract contains a list of proposed state roots which\\n * Proposers assert to be a result of each transaction in the Canonical Transaction Chain (CTC).\\n * Elements here have a 1:1 correspondence with transactions in the CTC, and should be the unique\\n * state root calculated off-chain by applying the canonical transactions one by one.\\n *\\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract OVM_StateCommitmentChain is iOVM_StateCommitmentChain, Lib_AddressResolver {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 public FRAUD_PROOF_WINDOW;\\n uint256 public SEQUENCER_PUBLISH_WINDOW;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n */\\n constructor(\\n address _libAddressManager,\\n uint256 _fraudProofWindow,\\n uint256 _sequencerPublishWindow\\n )\\n Lib_AddressResolver(_libAddressManager)\\n {\\n FRAUD_PROOF_WINDOW = _fraudProofWindow;\\n SEQUENCER_PUBLISH_WINDOW = _sequencerPublishWindow;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Accesses the batch storage container.\\n * @return Reference to the batch storage container.\\n */\\n function batches()\\n public\\n view\\n returns (\\n iOVM_ChainStorageContainer\\n )\\n {\\n return iOVM_ChainStorageContainer(\\n resolve(\\\"OVM_ChainStorageContainer:SCC:batches\\\")\\n );\\n }\\n\\n /**\\n * @inheritdoc iOVM_StateCommitmentChain\\n */\\n function getTotalElements()\\n override\\n public\\n view\\n returns (\\n uint256 _totalElements\\n )\\n {\\n (uint40 totalElements, ) = _getBatchExtraData();\\n return uint256(totalElements);\\n }\\n\\n /**\\n * @inheritdoc iOVM_StateCommitmentChain\\n */\\n function getTotalBatches()\\n override\\n public\\n view\\n returns (\\n uint256 _totalBatches\\n )\\n {\\n return batches().length();\\n }\\n\\n /**\\n * @inheritdoc iOVM_StateCommitmentChain\\n */\\n function getLastSequencerTimestamp()\\n override\\n public\\n view\\n returns (\\n uint256 _lastSequencerTimestamp\\n )\\n {\\n (, uint40 lastSequencerTimestamp) = _getBatchExtraData();\\n return uint256(lastSequencerTimestamp);\\n }\\n\\n /**\\n * @inheritdoc iOVM_StateCommitmentChain\\n */\\n function appendStateBatch(\\n bytes32[] memory _batch,\\n uint256 _shouldStartAtElement\\n )\\n override\\n public\\n {\\n // Fail fast in to make sure our batch roots aren't accidentally made fraudulent by the\\n // publication of batches by some other user.\\n require(\\n _shouldStartAtElement == getTotalElements(),\\n \\\"Actual batch start index does not match expected start index.\\\"\\n );\\n\\n // Proposers must have previously staked at the BondManager\\n require(\\n iOVM_BondManager(resolve(\\\"OVM_BondManager\\\")).isCollateralized(msg.sender),\\n \\\"Proposer does not have enough collateral posted\\\"\\n );\\n\\n require(\\n _batch.length > 0,\\n \\\"Cannot submit an empty state batch.\\\"\\n );\\n\\n require(\\n getTotalElements() + _batch.length <= iOVM_CanonicalTransactionChain(resolve(\\\"OVM_CanonicalTransactionChain\\\")).getTotalElements(),\\n \\\"Number of state roots cannot exceed the number of canonical transactions.\\\"\\n );\\n\\n // Pass the block's timestamp and the publisher of the data\\n // to be used in the fraud proofs\\n _appendBatch(\\n _batch,\\n abi.encode(block.timestamp, msg.sender)\\n );\\n }\\n\\n /**\\n * @inheritdoc iOVM_StateCommitmentChain\\n */\\n function deleteStateBatch(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n override\\n public\\n {\\n require(\\n msg.sender == resolve(\\\"OVM_FraudVerifier\\\"),\\n \\\"State batches can only be deleted by the OVM_FraudVerifier.\\\"\\n );\\n\\n require(\\n _isValidBatchHeader(_batchHeader),\\n \\\"Invalid batch header.\\\"\\n );\\n\\n require(\\n insideFraudProofWindow(_batchHeader),\\n \\\"State batches can only be deleted within the fraud proof window.\\\"\\n );\\n\\n _deleteBatch(_batchHeader);\\n }\\n\\n /**\\n * @inheritdoc iOVM_StateCommitmentChain\\n */\\n function verifyStateCommitment(\\n bytes32 _element,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _proof\\n )\\n override\\n public\\n view\\n returns (\\n bool\\n )\\n {\\n require(\\n _isValidBatchHeader(_batchHeader),\\n \\\"Invalid batch header.\\\"\\n );\\n\\n require(\\n Lib_MerkleTree.verify(\\n _batchHeader.batchRoot,\\n _element,\\n _proof.index,\\n _proof.siblings,\\n _batchHeader.batchSize\\n ),\\n \\\"Invalid inclusion proof.\\\"\\n );\\n\\n return true;\\n }\\n\\n /**\\n * @inheritdoc iOVM_StateCommitmentChain\\n */\\n function insideFraudProofWindow(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n override\\n public\\n view\\n returns (\\n bool _inside\\n )\\n {\\n (uint256 timestamp,) = abi.decode(\\n _batchHeader.extraData,\\n (uint256, address)\\n );\\n\\n require(\\n timestamp != 0,\\n \\\"Batch header timestamp cannot be zero\\\"\\n );\\n return SafeMath.add(timestamp, FRAUD_PROOF_WINDOW) > block.timestamp;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Parses the batch context from the extra data.\\n * @return Total number of elements submitted.\\n * @return Timestamp of the last batch submitted by the sequencer.\\n */\\n function _getBatchExtraData()\\n internal\\n view\\n returns (\\n uint40,\\n uint40\\n )\\n {\\n bytes27 extraData = batches().getGlobalMetadata();\\n\\n uint40 totalElements;\\n uint40 lastSequencerTimestamp;\\n assembly {\\n extraData := shr(40, extraData)\\n totalElements := and(extraData, 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF)\\n lastSequencerTimestamp := shr(40, and(extraData, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000))\\n }\\n\\n return (\\n totalElements,\\n lastSequencerTimestamp\\n );\\n }\\n\\n /**\\n * Encodes the batch context for the extra data.\\n * @param _totalElements Total number of elements submitted.\\n * @param _lastSequencerTimestamp Timestamp of the last batch submitted by the sequencer.\\n * @return Encoded batch context.\\n */\\n function _makeBatchExtraData(\\n uint40 _totalElements,\\n uint40 _lastSequencerTimestamp\\n )\\n internal\\n pure\\n returns (\\n bytes27\\n )\\n {\\n bytes27 extraData;\\n assembly {\\n extraData := _totalElements\\n extraData := or(extraData, shl(40, _lastSequencerTimestamp))\\n extraData := shl(40, extraData)\\n }\\n\\n return extraData;\\n }\\n\\n /**\\n * Appends a batch to the chain.\\n * @param _batch Elements within the batch.\\n * @param _extraData Any extra data to append to the batch.\\n */\\n function _appendBatch(\\n bytes32[] memory _batch,\\n bytes memory _extraData\\n )\\n internal\\n {\\n address sequencer = resolve(\\\"OVM_Proposer\\\");\\n (uint40 totalElements, uint40 lastSequencerTimestamp) = _getBatchExtraData();\\n\\n if (msg.sender == sequencer) {\\n lastSequencerTimestamp = uint40(block.timestamp);\\n } else {\\n // We keep track of the last batch submitted by the sequencer so there's a window in\\n // which only the sequencer can publish state roots. A window like this just reduces\\n // the chance of \\\"system breaking\\\" state roots being published while we're still in\\n // testing mode. This window should be removed or significantly reduced in the future.\\n require(\\n lastSequencerTimestamp + SEQUENCER_PUBLISH_WINDOW < block.timestamp,\\n \\\"Cannot publish state roots within the sequencer publication window.\\\"\\n );\\n }\\n\\n // For efficiency reasons getMerkleRoot modifies the `_batch` argument in place\\n // while calculating the root hash therefore any arguments passed to it must not\\n // be used again afterwards\\n Lib_OVMCodec.ChainBatchHeader memory batchHeader = Lib_OVMCodec.ChainBatchHeader({\\n batchIndex: getTotalBatches(),\\n batchRoot: Lib_MerkleTree.getMerkleRoot(_batch),\\n batchSize: _batch.length,\\n prevTotalElements: totalElements,\\n extraData: _extraData\\n });\\n\\n emit StateBatchAppended(\\n batchHeader.batchIndex,\\n batchHeader.batchRoot,\\n batchHeader.batchSize,\\n batchHeader.prevTotalElements,\\n batchHeader.extraData\\n );\\n\\n batches().push(\\n Lib_OVMCodec.hashBatchHeader(batchHeader),\\n _makeBatchExtraData(\\n uint40(batchHeader.prevTotalElements + batchHeader.batchSize),\\n lastSequencerTimestamp\\n )\\n );\\n }\\n\\n /**\\n * Removes a batch and all subsequent batches from the chain.\\n * @param _batchHeader Header of the batch to remove.\\n */\\n function _deleteBatch(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n internal\\n {\\n require(\\n _batchHeader.batchIndex < batches().length(),\\n \\\"Invalid batch index.\\\"\\n );\\n\\n require(\\n _isValidBatchHeader(_batchHeader),\\n \\\"Invalid batch header.\\\"\\n );\\n\\n batches().deleteElementsAfterInclusive(\\n _batchHeader.batchIndex,\\n _makeBatchExtraData(\\n uint40(_batchHeader.prevTotalElements),\\n 0\\n )\\n );\\n\\n emit StateBatchDeleted(\\n _batchHeader.batchIndex,\\n _batchHeader.batchRoot\\n );\\n }\\n\\n /**\\n * Checks that a batch header matches the stored hash for the given index.\\n * @param _batchHeader Batch header to validate.\\n * @return Whether or not the header matches the stored one.\\n */\\n function _isValidBatchHeader(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n internal\\n view\\n returns (\\n bool\\n )\\n {\\n return Lib_OVMCodec.hashBatchHeader(_batchHeader) == batches().get(_batchHeader.batchIndex);\\n }\\n}\\n\",\"keccak256\":\"0x5b72c845f856a06c978880d3cb2db40dafebaebf399df100c6ac832eaf41d7bd\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_CanonicalTransactionChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_ChainStorageContainer } from \\\"./iOVM_ChainStorageContainer.sol\\\";\\n\\n/**\\n * @title iOVM_CanonicalTransactionChain\\n */\\ninterface iOVM_CanonicalTransactionChain {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event TransactionEnqueued(\\n address _l1TxOrigin,\\n address _target,\\n uint256 _gasLimit,\\n bytes _data,\\n uint256 _queueIndex,\\n uint256 _timestamp\\n );\\n\\n event QueueBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event SequencerBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event TransactionBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct BatchContext {\\n uint256 numSequencedTransactions;\\n uint256 numSubsequentQueueTransactions;\\n uint256 timestamp;\\n uint256 blockNumber;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n\\n /**\\n * Accesses the batch storage container.\\n * @return Reference to the batch storage container.\\n */\\n function batches()\\n external\\n view\\n returns (\\n iOVM_ChainStorageContainer\\n );\\n\\n /**\\n * Accesses the queue storage container.\\n * @return Reference to the queue storage container.\\n */\\n function queue()\\n external\\n view\\n returns (\\n iOVM_ChainStorageContainer\\n );\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements()\\n external\\n view\\n returns (\\n uint256 _totalElements\\n );\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches()\\n external\\n view\\n returns (\\n uint256 _totalBatches\\n );\\n\\n /**\\n * Returns the index of the next element to be enqueued.\\n * @return Index for the next queue element.\\n */\\n function getNextQueueIndex()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Gets the queue element at a particular index.\\n * @param _index Index of the queue element to access.\\n * @return _element Queue element at the given index.\\n */\\n function getQueueElement(\\n uint256 _index\\n )\\n external\\n view\\n returns (\\n Lib_OVMCodec.QueueElement memory _element\\n );\\n\\n /**\\n * Returns the timestamp of the last transaction.\\n * @return Timestamp for the last transaction.\\n */\\n function getLastTimestamp()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Returns the blocknumber of the last transaction.\\n * @return Blocknumber for the last transaction.\\n */\\n function getLastBlockNumber()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Get the number of queue elements which have not yet been included.\\n * @return Number of pending queue elements.\\n */\\n function getNumPendingQueueElements()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Retrieves the length of the queue, including\\n * both pending and canonical transactions.\\n * @return Length of the queue.\\n */\\n function getQueueLength()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n\\n /**\\n * Adds a transaction to the queue.\\n * @param _target Target contract to send the transaction to.\\n * @param _gasLimit Gas limit for the given transaction.\\n * @param _data Transaction data.\\n */\\n function enqueue(\\n address _target,\\n uint256 _gasLimit,\\n bytes memory _data\\n )\\n external;\\n\\n /**\\n * Appends a given number of queued transactions as a single batch.\\n * @param _numQueuedTransactions Number of transactions to append.\\n */\\n function appendQueueBatch(\\n uint256 _numQueuedTransactions\\n )\\n external;\\n\\n /**\\n * Allows the sequencer to append a batch of transactions.\\n * @dev This function uses a custom encoding scheme for efficiency reasons.\\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\\n * .param _contexts Array of batch contexts.\\n * .param _transactionDataFields Array of raw transaction data.\\n */\\n function appendSequencerBatch(\\n // uint40 _shouldStartAtElement,\\n // uint24 _totalElementsToAppend,\\n // BatchContext[] _contexts,\\n // bytes[] _transactionDataFields\\n )\\n external;\\n\\n /**\\n * Verifies whether a transaction is included in the chain.\\n * @param _transaction Transaction to verify.\\n * @param _txChainElement Transaction chain element corresponding to the transaction.\\n * @param _batchHeader Header of the batch the transaction was included in.\\n * @param _inclusionProof Inclusion proof for the provided transaction chain element.\\n * @return True if the transaction exists in the CTC, false if not.\\n */\\n function verifyTransaction(\\n Lib_OVMCodec.Transaction memory _transaction,\\n Lib_OVMCodec.TransactionChainElement memory _txChainElement,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _inclusionProof\\n )\\n external\\n view\\n returns (\\n bool\\n );\\n}\\n\",\"keccak256\":\"0xb5e55488a1982841c07cdf5ff475da4789596f111dd48f01b1918ee4c775cf3a\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_ChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title iOVM_ChainStorageContainer\\n */\\ninterface iOVM_ChainStorageContainer {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata()\\n external\\n view\\n returns (\\n bytes27\\n );\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length()\\n external\\n view\\n returns (\\n uint256\\n );\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(\\n bytes32 _object\\n )\\n external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(\\n bytes32 _object,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(\\n uint256 _index\\n )\\n external\\n view\\n returns (\\n bytes32\\n );\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index\\n )\\n external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Marks an index as overwritable, meaing the underlying buffer can start to write values over\\n * any objects before and including the given index.\\n */\\n function setNextOverwritableIndex(\\n uint256 _index\\n )\\n external;\\n}\\n\",\"keccak256\":\"0x2d7973a0ad84c23ec62624d3f1e3aeb198cc72686ff1e6cfa17155556b320c94\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_StateCommitmentChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title iOVM_StateCommitmentChain\\n */\\ninterface iOVM_StateCommitmentChain {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event StateBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n event StateBatchDeleted(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot\\n );\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements()\\n external\\n view\\n returns (\\n uint256 _totalElements\\n );\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches()\\n external\\n view\\n returns (\\n uint256 _totalBatches\\n );\\n\\n /**\\n * Retrieves the timestamp of the last batch submitted by the sequencer.\\n * @return _lastSequencerTimestamp Last sequencer batch timestamp.\\n */\\n function getLastSequencerTimestamp()\\n external\\n view\\n returns (\\n uint256 _lastSequencerTimestamp\\n );\\n\\n /**\\n * Appends a batch of state roots to the chain.\\n * @param _batch Batch of state roots.\\n * @param _shouldStartAtElement Index of the element at which this batch should start.\\n */\\n function appendStateBatch(\\n bytes32[] calldata _batch,\\n uint256 _shouldStartAtElement\\n )\\n external;\\n\\n /**\\n * Deletes all state roots after (and including) a given batch.\\n * @param _batchHeader Header of the batch to start deleting from.\\n */\\n function deleteStateBatch(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n external;\\n\\n /**\\n * Verifies a batch inclusion proof.\\n * @param _element Hash of the element to verify a proof for.\\n * @param _batchHeader Header of the batch in which the element was included.\\n * @param _proof Merkle inclusion proof for the element.\\n */\\n function verifyStateCommitment(\\n bytes32 _element,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _proof\\n )\\n external\\n view\\n returns (\\n bool _verified\\n );\\n\\n /**\\n * Checks whether a given batch is still inside its fraud proof window.\\n * @param _batchHeader Header of the batch to check.\\n * @return _inside Whether or not the batch is inside the fraud proof window.\\n */\\n function insideFraudProofWindow(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n external\\n view\\n returns (\\n bool _inside\\n );\\n}\\n\",\"keccak256\":\"0x6646d6ff392b81aab52a7a277e91540819464751de0af5afd1962094b2e92448\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/verification/iOVM_BondManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\ninterface ERC20 {\\n function transfer(address, uint256) external returns (bool);\\n function transferFrom(address, address, uint256) external returns (bool);\\n}\\n\\n/// All the errors which may be encountered on the bond manager\\nlibrary Errors {\\n string constant ERC20_ERR = \\\"BondManager: Could not post bond\\\";\\n string constant ALREADY_FINALIZED = \\\"BondManager: Fraud proof for this pre-state root has already been finalized\\\";\\n string constant SLASHED = \\\"BondManager: Cannot finalize withdrawal, you probably got slashed\\\";\\n string constant WRONG_STATE = \\\"BondManager: Wrong bond state for proposer\\\";\\n string constant CANNOT_CLAIM = \\\"BondManager: Cannot claim yet. Dispute must be finalized first\\\";\\n\\n string constant WITHDRAWAL_PENDING = \\\"BondManager: Withdrawal already pending\\\";\\n string constant TOO_EARLY = \\\"BondManager: Too early to finalize your withdrawal\\\";\\n\\n string constant ONLY_TRANSITIONER = \\\"BondManager: Only the transitioner for this pre-state root may call this function\\\";\\n string constant ONLY_FRAUD_VERIFIER = \\\"BondManager: Only the fraud verifier may call this function\\\";\\n string constant ONLY_STATE_COMMITMENT_CHAIN = \\\"BondManager: Only the state commitment chain may call this function\\\";\\n string constant WAIT_FOR_DISPUTES = \\\"BondManager: Wait for other potential disputes\\\";\\n}\\n\\n/**\\n * @title iOVM_BondManager\\n */\\ninterface iOVM_BondManager {\\n\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n /// The lifecycle of a proposer's bond\\n enum State {\\n // Before depositing or after getting slashed, a user is uncollateralized\\n NOT_COLLATERALIZED,\\n // After depositing, a user is collateralized\\n COLLATERALIZED,\\n // After a user has initiated a withdrawal\\n WITHDRAWING\\n }\\n\\n /// A bond posted by a proposer\\n struct Bond {\\n // The user's state\\n State state;\\n // The timestamp at which a proposer issued their withdrawal request\\n uint32 withdrawalTimestamp;\\n // The time when the first disputed was initiated for this bond\\n uint256 firstDisputeAt;\\n // The earliest observed state root for this bond which has had fraud\\n bytes32 earliestDisputedStateRoot;\\n // The state root's timestamp\\n uint256 earliestTimestamp;\\n }\\n\\n // Per pre-state root, store the number of state provisions that were made\\n // and how many of these calls were made by each user. Payouts will then be\\n // claimed by users proportionally for that dispute.\\n struct Rewards {\\n // Flag to check if rewards for a fraud proof are claimable\\n bool canClaim;\\n // Total number of `recordGasSpent` calls made\\n uint256 total;\\n // The gas spent by each user to provide witness data. The sum of all\\n // values inside this map MUST be equal to the value of `total`\\n mapping(address => uint256) gasSpent;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function recordGasSpent(\\n bytes32 _preStateRoot,\\n bytes32 _txHash,\\n address _who,\\n uint256 _gasSpent\\n ) external;\\n\\n function finalize(\\n bytes32 _preStateRoot,\\n address _publisher,\\n uint256 _timestamp\\n ) external;\\n\\n function deposit() external;\\n\\n function startWithdrawal() external;\\n\\n function finalizeWithdrawal() external;\\n\\n function claim(\\n address _who\\n ) external;\\n\\n function isCollateralized(\\n address _who\\n ) external view returns (bool);\\n\\n function getGasSpent(\\n bytes32 _preStateRoot,\\n address _who\\n ) external view returns (uint256);\\n}\\n\",\"keccak256\":\"0x3c2a8a399487857158649db1896749d86e39cba545a8aeb2e2bb0f3bdfa7a5b1\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/verification/iOVM_FraudVerifier.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_StateTransitioner } from \\\"./iOVM_StateTransitioner.sol\\\";\\n\\n/**\\n * @title iOVM_FraudVerifier\\n */\\ninterface iOVM_FraudVerifier {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event FraudProofInitialized(\\n bytes32 _preStateRoot,\\n uint256 _preStateRootIndex,\\n bytes32 _transactionHash,\\n address _who\\n );\\n\\n event FraudProofFinalized(\\n bytes32 _preStateRoot,\\n uint256 _preStateRootIndex,\\n bytes32 _transactionHash,\\n address _who\\n );\\n\\n\\n /***************************************\\n * Public Functions: Transition Status *\\n ***************************************/\\n\\n function getStateTransitioner(bytes32 _preStateRoot, bytes32 _txHash) external view returns (iOVM_StateTransitioner _transitioner);\\n\\n\\n /****************************************\\n * Public Functions: Fraud Verification *\\n ****************************************/\\n\\n function initializeFraudVerification(\\n bytes32 _preStateRoot,\\n Lib_OVMCodec.ChainBatchHeader calldata _preStateRootBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof calldata _preStateRootProof,\\n Lib_OVMCodec.Transaction calldata _transaction,\\n Lib_OVMCodec.TransactionChainElement calldata _txChainElement,\\n Lib_OVMCodec.ChainBatchHeader calldata _transactionBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof calldata _transactionProof\\n ) external;\\n\\n function finalizeFraudVerification(\\n bytes32 _preStateRoot,\\n Lib_OVMCodec.ChainBatchHeader calldata _preStateRootBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof calldata _preStateRootProof,\\n bytes32 _txHash,\\n bytes32 _postStateRoot,\\n Lib_OVMCodec.ChainBatchHeader calldata _postStateRootBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof calldata _postStateRootProof\\n ) external;\\n}\\n\",\"keccak256\":\"0x5efd7bb18164bbd3e9d58379e8203fbf2a7ee802b1a48dff3ceaaec1523b1751\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/verification/iOVM_StateTransitioner.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title iOVM_StateTransitioner\\n */\\ninterface iOVM_StateTransitioner {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AccountCommitted(\\n address _address\\n );\\n\\n event ContractStorageCommitted(\\n address _address,\\n bytes32 _key\\n );\\n\\n\\n /**********************************\\n * Public Functions: State Access *\\n **********************************/\\n\\n function getPreStateRoot() external view returns (bytes32 _preStateRoot);\\n function getPostStateRoot() external view returns (bytes32 _postStateRoot);\\n function isComplete() external view returns (bool _complete);\\n\\n\\n /***********************************\\n * Public Functions: Pre-Execution *\\n ***********************************/\\n\\n function proveContractState(\\n address _ovmContractAddress,\\n address _ethContractAddress,\\n bytes calldata _stateTrieWitness\\n ) external;\\n\\n function proveStorageSlot(\\n address _ovmContractAddress,\\n bytes32 _key,\\n bytes calldata _storageTrieWitness\\n ) external;\\n\\n\\n /*******************************\\n * Public Functions: Execution *\\n *******************************/\\n\\n function applyTransaction(\\n Lib_OVMCodec.Transaction calldata _transaction\\n ) external;\\n\\n\\n /************************************\\n * Public Functions: Post-Execution *\\n ************************************/\\n\\n function commitContractState(\\n address _ovmContractAddress,\\n bytes calldata _stateTrieWitness\\n ) external;\\n\\n function commitStorageSlot(\\n address _ovmContractAddress,\\n bytes32 _key,\\n bytes calldata _storageTrieWitness\\n ) external;\\n\\n\\n /**********************************\\n * Public Functions: Finalization *\\n **********************************/\\n\\n function completeTransition() external;\\n}\\n\",\"keccak256\":\"0x3d044ac0a3bb6ad3d529f904b3191117511f9c379678ca03010e1ebdfcb5c34b\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/codec/Lib_OVMCodec.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../utils/Lib_Bytes32Utils.sol\\\";\\n\\n/**\\n * @title Lib_OVMCodec\\n */\\nlibrary Lib_OVMCodec {\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum QueueOrigin {\\n SEQUENCER_QUEUE,\\n L1TOL2_QUEUE\\n }\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Account {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n address ethAddress;\\n bool isFresh;\\n }\\n\\n struct EVMAccount {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n }\\n\\n struct ChainBatchHeader {\\n uint256 batchIndex;\\n bytes32 batchRoot;\\n uint256 batchSize;\\n uint256 prevTotalElements;\\n bytes extraData;\\n }\\n\\n struct ChainInclusionProof {\\n uint256 index;\\n bytes32[] siblings;\\n }\\n\\n struct Transaction {\\n uint256 timestamp;\\n uint256 blockNumber;\\n QueueOrigin l1QueueOrigin;\\n address l1TxOrigin;\\n address entrypoint;\\n uint256 gasLimit;\\n bytes data;\\n }\\n\\n struct TransactionChainElement {\\n bool isSequenced;\\n uint256 queueIndex; // QUEUED TX ONLY\\n uint256 timestamp; // SEQUENCER TX ONLY\\n uint256 blockNumber; // SEQUENCER TX ONLY\\n bytes txData; // SEQUENCER TX ONLY\\n }\\n\\n struct QueueElement {\\n bytes32 transactionHash;\\n uint40 timestamp;\\n uint40 blockNumber;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Encodes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Encoded transaction bytes.\\n */\\n function encodeTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return abi.encodePacked(\\n _transaction.timestamp,\\n _transaction.blockNumber,\\n _transaction.l1QueueOrigin,\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n );\\n }\\n\\n /**\\n * Hashes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Hashed transaction\\n */\\n function hashTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(encodeTransaction(_transaction));\\n }\\n\\n /**\\n * Converts an OVM account to an EVM account.\\n * @param _in OVM account to convert.\\n * @return Converted EVM account.\\n */\\n function toEVMAccount(\\n Account memory _in\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n return EVMAccount({\\n nonce: _in.nonce,\\n balance: _in.balance,\\n storageRoot: _in.storageRoot,\\n codeHash: _in.codeHash\\n });\\n }\\n\\n /**\\n * @notice RLP-encodes an account state struct.\\n * @param _account Account state struct.\\n * @return RLP-encoded account state.\\n */\\n function encodeEVMAccount(\\n EVMAccount memory _account\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes[] memory raw = new bytes[](4);\\n\\n // Unfortunately we can't create this array outright because\\n // Lib_RLPWriter.writeList will reject fixed-size arrays. Assigning\\n // index-by-index circumvents this issue.\\n raw[0] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.nonce)\\n )\\n );\\n raw[1] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.balance)\\n )\\n );\\n raw[2] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.storageRoot));\\n raw[3] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.codeHash));\\n\\n return Lib_RLPWriter.writeList(raw);\\n }\\n\\n /**\\n * @notice Decodes an RLP-encoded account state into a useful struct.\\n * @param _encoded RLP-encoded account state.\\n * @return Account state struct.\\n */\\n function decodeEVMAccount(\\n bytes memory _encoded\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\\n\\n return EVMAccount({\\n nonce: Lib_RLPReader.readUint256(accountState[0]),\\n balance: Lib_RLPReader.readUint256(accountState[1]),\\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\\n });\\n }\\n\\n /**\\n * Calculates a hash for a given batch header.\\n * @param _batchHeader Header to hash.\\n * @return Hash of the header.\\n */\\n function hashBatchHeader(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(\\n abi.encode(\\n _batchHeader.batchRoot,\\n _batchHeader.batchSize,\\n _batchHeader.prevTotalElements,\\n _batchHeader.extraData\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0xd85ba2066057a2677926f484b938c7c2ef33ff3853f3b71cda252f4a54f30e05\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n external\\n onlyOwner\\n {\\n addresses[_getNameHash(_name)] = _address;\\n\\n emit AddressSet(\\n _name,\\n _address\\n );\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(\\n string memory _name\\n )\\n external\\n view\\n returns (\\n address\\n )\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xcc9fc5c64f1101a5c6c397594086b1608189a9edc5c9635e1ac38f70aeeeecbf\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(\\n address _libAddressManager\\n ) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x65981feeabff6a81783ea97d44baf988a18a86c8cb374c46fdb71819cbacc7c0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPReader.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_RLPReader\\n * @dev Adapted from \\\"RLPReader\\\" by Hamdi Allam (hamdi.allam97@gmail.com).\\n */\\nlibrary Lib_RLPReader {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 constant internal MAX_LIST_LENGTH = 32;\\n\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum RLPItemType {\\n DATA_ITEM,\\n LIST_ITEM\\n }\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct RLPItem {\\n uint256 length;\\n uint256 ptr;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts bytes to a reference to memory position and length.\\n * @param _in Input bytes to convert.\\n * @return Output memory reference.\\n */\\n function toRLPItem(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem memory\\n )\\n {\\n uint256 ptr;\\n assembly {\\n ptr := add(_in, 32)\\n }\\n\\n return RLPItem({\\n length: _in.length,\\n ptr: ptr\\n });\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n (\\n uint256 listOffset,\\n ,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.LIST_ITEM,\\n \\\"Invalid RLP list value.\\\"\\n );\\n\\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\\n // writing to the length. Since we can't know the number of RLP items without looping over\\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\\n // simply set a reasonable maximum list length and decrease the size before we finish.\\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\\n\\n uint256 itemCount = 0;\\n uint256 offset = listOffset;\\n while (offset < _in.length) {\\n require(\\n itemCount < MAX_LIST_LENGTH,\\n \\\"Provided RLP list exceeds max list length.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n ) = _decodeLength(RLPItem({\\n length: _in.length - offset,\\n ptr: _in.ptr + offset\\n }));\\n\\n out[itemCount] = RLPItem({\\n length: itemLength + itemOffset,\\n ptr: _in.ptr + offset\\n });\\n\\n itemCount += 1;\\n offset += itemOffset + itemLength;\\n }\\n\\n // Decrease the array size to match the actual item count.\\n assembly {\\n mstore(out, itemCount)\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n return readList(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes value.\\\"\\n );\\n\\n return _copy(_in.ptr, itemOffset, itemLength);\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return readBytes(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return string(readBytes(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return readString(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n require(\\n _in.length <= 33,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr + itemOffset;\\n bytes32 out;\\n assembly {\\n out := mload(ptr)\\n\\n // Shift the bytes over to match the item size.\\n if lt(itemLength, 32) {\\n out := div(out, exp(256, sub(32, itemLength)))\\n }\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return readBytes32(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return uint256(readBytes32(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return readUint256(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n require(\\n _in.length == 1,\\n \\\"Invalid RLP boolean value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 out;\\n assembly {\\n out := byte(0, mload(ptr))\\n }\\n\\n require(\\n out == 0 || out == 1,\\n \\\"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\\\"\\n );\\n\\n return out != 0;\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return readBool(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n if (_in.length == 1) {\\n return address(0);\\n }\\n\\n require(\\n _in.length == 21,\\n \\\"Invalid RLP address value.\\\"\\n );\\n\\n return address(readUint256(_in));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return readAddress(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads the raw bytes of an RLP item.\\n * @param _in RLP item to read.\\n * @return Raw RLP bytes.\\n */\\n function readRawBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in);\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Decodes the length of an RLP item.\\n * @param _in RLP item to decode.\\n * @return Offset of the encoded data.\\n * @return Length of the encoded data.\\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\\n */\\n function _decodeLength(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n uint256,\\n uint256,\\n RLPItemType\\n )\\n {\\n require(\\n _in.length > 0,\\n \\\"RLP item cannot be null.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 prefix;\\n assembly {\\n prefix := byte(0, mload(ptr))\\n }\\n\\n if (prefix <= 0x7f) {\\n // Single byte.\\n\\n return (0, 1, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xb7) {\\n // Short string.\\n\\n uint256 strLen = prefix - 0x80;\\n\\n require(\\n _in.length > strLen,\\n \\\"Invalid RLP short string.\\\"\\n );\\n\\n return (1, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xbf) {\\n // Long string.\\n uint256 lenOfStrLen = prefix - 0xb7;\\n\\n require(\\n _in.length > lenOfStrLen,\\n \\\"Invalid RLP long string length.\\\"\\n );\\n\\n uint256 strLen;\\n assembly {\\n // Pick out the string length.\\n strLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfStrLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfStrLen + strLen,\\n \\\"Invalid RLP long string.\\\"\\n );\\n\\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xf7) {\\n // Short list.\\n uint256 listLen = prefix - 0xc0;\\n\\n require(\\n _in.length > listLen,\\n \\\"Invalid RLP short list.\\\"\\n );\\n\\n return (1, listLen, RLPItemType.LIST_ITEM);\\n } else {\\n // Long list.\\n uint256 lenOfListLen = prefix - 0xf7;\\n\\n require(\\n _in.length > lenOfListLen,\\n \\\"Invalid RLP long list length.\\\"\\n );\\n\\n uint256 listLen;\\n assembly {\\n // Pick out the list length.\\n listLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfListLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfListLen + listLen,\\n \\\"Invalid RLP long list.\\\"\\n );\\n\\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\\n }\\n }\\n\\n /**\\n * Copies the bytes from a memory location.\\n * @param _src Pointer to the location to read from.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Copied bytes.\\n */\\n function _copy(\\n uint256 _src,\\n uint256 _offset,\\n uint256 _length\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out = new bytes(_length);\\n if (out.length == 0) {\\n return out;\\n }\\n\\n uint256 src = _src + _offset;\\n uint256 dest;\\n assembly {\\n dest := add(out, 32)\\n }\\n\\n // Copy over as many complete words as we can.\\n for (uint256 i = 0; i < _length / 32; i++) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n\\n src += 32;\\n dest += 32;\\n }\\n\\n // Pick out the remaining bytes.\\n uint256 mask = 256 ** (32 - (_length % 32)) - 1;\\n assembly {\\n mstore(\\n dest,\\n or(\\n and(mload(src), not(mask)),\\n and(mload(dest), mask)\\n )\\n )\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Copies an RLP item into bytes.\\n * @param _in RLP item to copy.\\n * @return Copied bytes.\\n */\\n function _copy(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in.ptr, 0, _in.length);\\n }\\n}\\n\",\"keccak256\":\"0x829174c61216dce35fdb888383b6022e0365eb7fbdc71ad79d98b108091969fe\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPWriter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/**\\n * @title Lib_RLPWriter\\n * @author Bakaoh (with modifications)\\n */\\nlibrary Lib_RLPWriter {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * RLP encodes a byte string.\\n * @param _in The byte string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded;\\n\\n if (_in.length == 1 && uint8(_in[0]) < 128) {\\n encoded = _in;\\n } else {\\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * RLP encodes a list of RLP encoded byte byte strings.\\n * @param _in The list of RLP encoded byte strings.\\n * @return The RLP encoded list of items in bytes.\\n */\\n function writeList(\\n bytes[] memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory list = _flatten(_in);\\n return abi.encodePacked(_writeLength(list.length, 192), list);\\n }\\n\\n /**\\n * RLP encodes a string.\\n * @param _in The string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeString(\\n string memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(bytes(_in));\\n }\\n\\n /**\\n * RLP encodes an address.\\n * @param _in The address to encode.\\n * @return The RLP encoded address in bytes.\\n */\\n function writeAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a bytes32 value.\\n * @param _in The bytes32 to encode.\\n * @return _out The RLP encoded bytes32 in bytes.\\n */\\n function writeBytes32(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a uint.\\n * @param _in The uint256 to encode.\\n * @return The RLP encoded uint256 in bytes.\\n */\\n function writeUint(\\n uint256 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(_toBinary(_in));\\n }\\n\\n /**\\n * RLP encodes a bool.\\n * @param _in The bool to encode.\\n * @return The RLP encoded bool in bytes.\\n */\\n function writeBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded = new bytes(1);\\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\\n return encoded;\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\\n * @param _len The length of the string or the payload.\\n * @param _offset 128 if item is string, 192 if item is list.\\n * @return RLP encoded bytes.\\n */\\n function _writeLength(\\n uint256 _len,\\n uint256 _offset\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded;\\n\\n if (_len < 56) {\\n encoded = new bytes(1);\\n encoded[0] = byte(uint8(_len) + uint8(_offset));\\n } else {\\n uint256 lenLen;\\n uint256 i = 1;\\n while (_len / i != 0) {\\n lenLen++;\\n i *= 256;\\n }\\n\\n encoded = new bytes(lenLen + 1);\\n encoded[0] = byte(uint8(lenLen) + uint8(_offset) + 55);\\n for(i = 1; i <= lenLen; i++) {\\n encoded[i] = byte(uint8((_len / (256**(lenLen-i))) % 256));\\n }\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * Encode integer in big endian binary form with no leading zeroes.\\n * @notice TODO: This should be optimized with assembly to save gas costs.\\n * @param _x The integer to encode.\\n * @return RLP encoded bytes.\\n */\\n function _toBinary(\\n uint256 _x\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory b = abi.encodePacked(_x);\\n\\n uint256 i = 0;\\n for (; i < 32; i++) {\\n if (b[i] != 0) {\\n break;\\n }\\n }\\n\\n bytes memory res = new bytes(32 - i);\\n for (uint256 j = 0; j < res.length; j++) {\\n res[j] = b[i++];\\n }\\n\\n return res;\\n }\\n\\n /**\\n * Copies a piece of memory to another location.\\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\\n * @param _dest Destination location.\\n * @param _src Source location.\\n * @param _len Length of memory to copy.\\n */\\n function _memcpy(\\n uint256 _dest,\\n uint256 _src,\\n uint256 _len\\n )\\n private\\n pure\\n {\\n uint256 dest = _dest;\\n uint256 src = _src;\\n uint256 len = _len;\\n\\n for(; len >= 32; len -= 32) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n dest += 32;\\n src += 32;\\n }\\n\\n uint256 mask = 256 ** (32 - len) - 1;\\n assembly {\\n let srcpart := and(mload(src), not(mask))\\n let destpart := and(mload(dest), mask)\\n mstore(dest, or(destpart, srcpart))\\n }\\n }\\n\\n /**\\n * Flattens a list of byte strings into one byte string.\\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\\n * @param _list List of byte strings to flatten.\\n * @return The flattened byte string.\\n */\\n function _flatten(\\n bytes[] memory _list\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n if (_list.length == 0) {\\n return new bytes(0);\\n }\\n\\n uint256 len;\\n uint256 i = 0;\\n for (; i < _list.length; i++) {\\n len += _list[i].length;\\n }\\n\\n bytes memory flattened = new bytes(len);\\n uint256 flattenedPtr;\\n assembly { flattenedPtr := add(flattened, 0x20) }\\n\\n for(i = 0; i < _list.length; i++) {\\n bytes memory item = _list[i];\\n\\n uint256 listPtr;\\n assembly { listPtr := add(item, 0x20)}\\n\\n _memcpy(flattenedPtr, listPtr, item.length);\\n flattenedPtr += _list[i].length;\\n }\\n\\n return flattened;\\n }\\n}\\n\",\"keccak256\":\"0xb60ee4b03ad372c3deff21d454ab714dd0c18ee3e6f9d45532e209fc59d5a54d\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_Bytes32Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_Byte32Utils\\n */\\nlibrary Lib_Bytes32Utils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \\\"true.\\\"\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as a boolean.\\n */\\n function toBool(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return _in != 0;\\n }\\n\\n /**\\n * Converts a boolean to a bytes32 value.\\n * @param _in Input boolean value.\\n * @return Boolean as a bytes32.\\n */\\n function fromBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in ? 1 : 0));\\n }\\n\\n /**\\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as an address.\\n */\\n function toAddress(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return address(uint160(uint256(_in)));\\n }\\n\\n /**\\n * Converts an address to a bytes32.\\n * @param _in Input address value.\\n * @return Address as a bytes32.\\n */\\n function fromAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in));\\n }\\n\\n /**\\n * Removes the leading zeros from a bytes32 value and returns a new (smaller) bytes value.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 without any leading zeros.\\n */\\n function removeLeadingZeros(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out;\\n\\n assembly {\\n // Figure out how many leading zero bytes to remove.\\n let shift := 0\\n for { let i := 0 } and(lt(i, 32), eq(byte(i, _in), 0)) { i := add(i, 1) } {\\n shift := add(shift, 1)\\n }\\n\\n // Reserve some space for our output and fix the free memory pointer.\\n out := mload(0x40)\\n mstore(0x40, add(out, 0x40))\\n\\n // Shift the value and store it into the output bytes.\\n mstore(add(out, 0x20), shl(mul(shift, 8), _in))\\n\\n // Store the new size (with leading zero bytes removed) in the output byte size.\\n mstore(out, sub(32, shift))\\n }\\n\\n return out;\\n }\\n}\\n\",\"keccak256\":\"0xfa2def593e3fc56a31852c3744aefdaa93cec74e721bfcfeb1e5d166c7c60b64\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_BytesUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_BytesUtils\\n */\\nlibrary Lib_BytesUtils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_start + _length >= _start, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n if (_start >= _bytes.length) {\\n return bytes('');\\n }\\n\\n return slice(_bytes, _start, _bytes.length - _start);\\n }\\n\\n function toBytes32PadLeft(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n bytes32 ret;\\n uint256 len = _bytes.length <= 32 ? _bytes.length : 32;\\n assembly {\\n ret := shr(mul(sub(32, len), 8), mload(add(_bytes, 32)))\\n }\\n return ret;\\n }\\n\\n function toBytes32(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n if (_bytes.length < 32) {\\n bytes32 ret;\\n assembly {\\n ret := mload(add(_bytes, 32))\\n }\\n return ret;\\n }\\n\\n return abi.decode(_bytes,(bytes32)); // will truncate if input length > 32 bytes\\n }\\n\\n function toUint256(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return uint256(toBytes32(_bytes));\\n }\\n\\n function toUint24(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n uint24\\n )\\n {\\n require(_start + 3 >= _start, \\\"toUint24_overflow\\\");\\n require(_bytes.length >= _start + 3 , \\\"toUint24_outOfBounds\\\");\\n uint24 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x3), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toUint8(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n uint8\\n )\\n {\\n require(_start + 1 >= _start, \\\"toUint8_overflow\\\");\\n require(_bytes.length >= _start + 1 , \\\"toUint8_outOfBounds\\\");\\n uint8 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x1), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toAddress(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n require(_start + 20 >= _start, \\\"toAddress_overflow\\\");\\n require(_bytes.length >= _start + 20, \\\"toAddress_outOfBounds\\\");\\n address tempAddress;\\n\\n assembly {\\n tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000)\\n }\\n\\n return tempAddress;\\n }\\n\\n function toNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory nibbles = new bytes(_bytes.length * 2);\\n\\n for (uint256 i = 0; i < _bytes.length; i++) {\\n nibbles[i * 2] = _bytes[i] >> 4;\\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\\n }\\n\\n return nibbles;\\n }\\n\\n function fromNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory ret = new bytes(_bytes.length / 2);\\n\\n for (uint256 i = 0; i < ret.length; i++) {\\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\\n }\\n\\n return ret;\\n }\\n\\n function equal(\\n bytes memory _bytes,\\n bytes memory _other\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return keccak256(_bytes) == keccak256(_other);\\n }\\n}\\n\",\"keccak256\":\"0xd27e37973f1e0f64798725b7a0de12989dac992fba0d72970249d7e1f70e17c5\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_MerkleTree.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_MerkleTree\\n * @author River Keefer\\n */\\nlibrary Lib_MerkleTree {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Calculates a merkle root for a list of 32-byte leaf hashes. WARNING: If the number\\n * of leaves passed in is not a power of two, it pads out the tree with zero hashes.\\n * If you do not know the original length of elements for the tree you are verifying,\\n * then this may allow empty leaves past _elements.length to pass a verification check down the line.\\n * Note that the _elements argument is modified, therefore it must not be used again afterwards\\n * @param _elements Array of hashes from which to generate a merkle root.\\n * @return Merkle root of the leaves, with zero hashes for non-powers-of-two (see above).\\n */\\n function getMerkleRoot(\\n bytes32[] memory _elements\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n require(\\n _elements.length > 0,\\n \\\"Lib_MerkleTree: Must provide at least one leaf hash.\\\"\\n );\\n\\n if (_elements.length == 1) {\\n return _elements[0];\\n }\\n\\n uint256[16] memory defaults = [\\n 0x290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563,\\n 0x633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d,\\n 0x890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d,\\n 0x3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd8,\\n 0xecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da,\\n 0xdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da5,\\n 0x617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d7,\\n 0x292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead,\\n 0xe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e10,\\n 0x7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f82,\\n 0xe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e83636516,\\n 0x3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c,\\n 0xad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e,\\n 0xa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab,\\n 0x4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c862,\\n 0x2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf10\\n ];\\n\\n // Reserve memory space for our hashes.\\n bytes memory buf = new bytes(64);\\n\\n // We'll need to keep track of left and right siblings.\\n bytes32 leftSibling;\\n bytes32 rightSibling;\\n\\n // Number of non-empty nodes at the current depth.\\n uint256 rowSize = _elements.length;\\n\\n // Current depth, counting from 0 at the leaves\\n uint256 depth = 0;\\n\\n // Common sub-expressions\\n uint256 halfRowSize; // rowSize / 2\\n bool rowSizeIsOdd; // rowSize % 2 == 1\\n\\n while (rowSize > 1) {\\n halfRowSize = rowSize / 2;\\n rowSizeIsOdd = rowSize % 2 == 1;\\n\\n for (uint256 i = 0; i < halfRowSize; i++) {\\n leftSibling = _elements[(2 * i) ];\\n rightSibling = _elements[(2 * i) + 1];\\n assembly {\\n mstore(add(buf, 32), leftSibling )\\n mstore(add(buf, 64), rightSibling)\\n }\\n\\n _elements[i] = keccak256(buf);\\n }\\n\\n if (rowSizeIsOdd) {\\n leftSibling = _elements[rowSize - 1];\\n rightSibling = bytes32(defaults[depth]);\\n assembly {\\n mstore(add(buf, 32), leftSibling)\\n mstore(add(buf, 64), rightSibling)\\n }\\n\\n _elements[halfRowSize] = keccak256(buf);\\n }\\n\\n rowSize = halfRowSize + (rowSizeIsOdd ? 1 : 0);\\n depth++;\\n }\\n\\n return _elements[0];\\n }\\n\\n /**\\n * Verifies a merkle branch for the given leaf hash. Assumes the original length\\n * of leaves generated is a known, correct input, and does not return true for indices\\n * extending past that index (even if _siblings would be otherwise valid.)\\n * @param _root The Merkle root to verify against.\\n * @param _leaf The leaf hash to verify inclusion of.\\n * @param _index The index in the tree of this leaf.\\n * @param _siblings Array of sibline nodes in the inclusion proof, starting from depth 0 (bottom of the tree).\\n * @param _totalLeaves The total number of leaves originally passed into.\\n * @return Whether or not the merkle branch and leaf passes verification.\\n */\\n function verify(\\n bytes32 _root,\\n bytes32 _leaf,\\n uint256 _index,\\n bytes32[] memory _siblings,\\n uint256 _totalLeaves\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n require(\\n _totalLeaves > 0,\\n \\\"Lib_MerkleTree: Total leaves must be greater than zero.\\\"\\n );\\n\\n require(\\n _index < _totalLeaves,\\n \\\"Lib_MerkleTree: Index out of bounds.\\\"\\n );\\n\\n require(\\n _siblings.length == _ceilLog2(_totalLeaves),\\n \\\"Lib_MerkleTree: Total siblings does not correctly correspond to total leaves.\\\"\\n );\\n\\n bytes32 computedRoot = _leaf;\\n\\n for (uint256 i = 0; i < _siblings.length; i++) {\\n if ((_index & 1) == 1) {\\n computedRoot = keccak256(\\n abi.encodePacked(\\n _siblings[i],\\n computedRoot\\n )\\n );\\n } else {\\n computedRoot = keccak256(\\n abi.encodePacked(\\n computedRoot,\\n _siblings[i]\\n )\\n );\\n }\\n\\n _index >>= 1;\\n }\\n\\n return _root == computedRoot;\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Calculates the integer ceiling of the log base 2 of an input.\\n * @param _in Unsigned input to calculate the log.\\n * @return ceil(log_base_2(_in))\\n */\\n function _ceilLog2(\\n uint256 _in\\n )\\n private\\n pure\\n returns (\\n uint256\\n )\\n {\\n require(\\n _in > 0,\\n \\\"Lib_MerkleTree: Cannot compute ceil(log_2) of 0.\\\"\\n );\\n\\n if (_in == 1) {\\n return 0;\\n }\\n\\n // Find the highest set bit (will be floor(log_2)).\\n // Borrowed with <3 from https://github.com/ethereum/solidity-examples\\n uint256 val = _in;\\n uint256 highest = 0;\\n for (uint256 i = 128; i >= 1; i >>= 1) {\\n if (val & (uint(1) << i) - 1 << i != 0) {\\n highest += i;\\n val >>= i;\\n }\\n }\\n\\n // Increment by one if this is not a perfect logarithm.\\n if ((uint(1) << highest) != _in) {\\n highest += 1;\\n }\\n\\n return highest;\\n }\\n}\\n\",\"keccak256\":\"0xa78edb9fbd34712771a1ebff05bc5e1abec7fc1e9a1bfb709d183099b44fa62a\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x608060405234801561001057600080fd5b50604051611bee380380611bee83398101604081905261002f9161005b565b600080546001600160a01b0319166001600160a01b03949094169390931790925560015560025561009c565b60008060006060848603121561006f578283fd5b83516001600160a01b0381168114610085578384fd5b602085015160409095015190969495509392505050565b611b43806100ab6000396000f3fe608060405234801561001057600080fd5b50600436106100b45760003560e01c80638ca5cbb9116100715780638ca5cbb91461012f5780639418bddd14610144578063b8e189ac14610157578063c17b291b1461016a578063cfdf677e14610172578063e561dddc1461017a576100b4565b8063299ca478146100b9578063461a4478146100d75780634d69ee57146100ea5780637aa63a861461010a5780637ad168a01461011f57806381eb62ef14610127575b600080fd5b6100c1610182565b6040516100ce919061159f565b60405180910390f35b6100c16100e53660046114e3565b610191565b6100fd6100f8366004611431565b61026f565b6040516100ce91906115b3565b6101126102e2565b6040516100ce91906115be565b6101126102fb565b610112610314565b61014261013d366004611390565b61031a565b005b6100fd610152366004611531565b61052e565b610142610165366004611531565b61057e565b610112610636565b6100c161063c565b610112610664565b6000546001600160a01b031681565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b838110156101f15781810151838201526020016101d9565b50505050905090810190601f16801561021e5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561023b57600080fd5b505afa15801561024f573d6000803e3d6000fd5b505050506040513d602081101561026557600080fd5b505190505b919050565b600061027a836106de565b61029f5760405162461bcd60e51b815260040161029690611749565b60405180910390fd5b6102bc836020015185846000015185602001518760400151610776565b6102d85760405162461bcd60e51b8152600401610296906116b5565b5060019392505050565b6000806102ed6108fb565b5064ffffffffff1691505090565b6000806103066108fb565b64ffffffffff169250505090565b60025481565b6103226102e2565b81146103405760405162461bcd60e51b8152600401610296906116ec565b6103706040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b815250610191565b6001600160a01b03166302ad4d2a336040518263ffffffff1660e01b815260040161039b919061159f565b60206040518083038186803b1580156103b357600080fd5b505afa1580156103c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103eb91906113d3565b6104075760405162461bcd60e51b8152600401610296906118bb565b60008251116104285760405162461bcd60e51b815260040161029690611878565b6104666040518060400160405280601d81526020017f4f564d5f43616e6f6e6963616c5472616e73616374696f6e436861696e000000815250610191565b6001600160a01b0316637aa63a866040518163ffffffff1660e01b815260040160206040518083038186803b15801561049e57600080fd5b505afa1580156104b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104d69190611419565b82516104e06102e2565b0111156104ff5760405162461bcd60e51b815260040161029690611646565b61052a8242336040516020016105169291906119a1565b604051602081830303815290604052610990565b5050565b60008082608001518060200190518101906105499190611564565b509050806105695760405162461bcd60e51b815260040161029690611833565b4261057682600154610b31565b119392505050565b6105b06040518060400160405280601181526020017027ab26afa33930bab22b32b934b334b2b960791b815250610191565b6001600160a01b0316336001600160a01b0316146105e05760405162461bcd60e51b8152600401610296906117d6565b6105e9816106de565b6106055760405162461bcd60e51b815260040161029690611749565b61060e8161052e565b61062a5760405162461bcd60e51b815260040161029690611778565b61063381610b92565b50565b60015481565b600061065f604051806060016040528060258152602001611ab560259139610191565b905090565b600061066e61063c565b6001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b1580156106a657600080fd5b505afa1580156106ba573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061065f9190611419565b60006106e861063c565b8251604051634a83e9cd60e11b81526001600160a01b039290921691639507d39a91610716916004016115be565b60206040518083038186803b15801561072e57600080fd5b505afa158015610742573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107669190611419565b61076f83610d0a565b1492915050565b60008082116107b65760405162461bcd60e51b8152600401808060200182810382526037815260200180611a316037913960400191505060405180910390fd5b8184106107f45760405162461bcd60e51b81526004018080602001828103825260248152602001806119dd6024913960400191505060405180910390fd5b6107fd82610d50565b83511461083b5760405162461bcd60e51b815260040180806020018281038252604d815260200180611a68604d913960600191505060405180910390fd5b8460005b84518110156108ee57856001166001141561089d5784818151811061086057fe5b60200260200101518260405160200180838152602001828152602001925050506040516020818303038152906040528051906020012091506108e2565b818582815181106108aa57fe5b602002602001015160405160200180838152602001828152602001925050506040516020818303038152906040528051906020012091505b600195861c950161083f565b5090951495945050505050565b600080600061090861063c565b6001600160a01b031663ccf8f9696040518163ffffffff1660e01b815260040160206040518083038186803b15801561094057600080fd5b505afa158015610954573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061097891906113f3565b64ffffffffff602882901c16935060501c9150509091565b60006109bf6040518060400160405280600c81526020016b27ab26afa83937b837b9b2b960a11b815250610191565b90506000806109cc6108fb565b9092509050336001600160a01b03841614156109e9575042610a13565b426002548264ffffffffff160110610a135760405162461bcd60e51b81526004016102969061190a565b60006040518060a00160405280610a28610664565b8152602001610a3688610de6565b8152602001875181526020018464ffffffffff16815260200186815250905080600001517f16be4c5129a4e03cf3350262e181dc02ddfb4a6008d925368c0899fcd97ca9c58260200151836040015184606001518560800151604051610a9f94939291906115dd565b60405180910390a2610aaf61063c565b6001600160a01b0316632015276c610ac683610d0a565b610ada84604001518560600151018661121a565b6040518363ffffffff1660e01b8152600401610af79291906115c7565b600060405180830381600087803b158015610b1157600080fd5b505af1158015610b25573d6000803e3d6000fd5b50505050505050505050565b600082820183811015610b8b576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b610b9a61063c565b6001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b158015610bd257600080fd5b505afa158015610be6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c0a9190611419565b815110610c295760405162461bcd60e51b815260040161029690611973565b610c32816106de565b610c4e5760405162461bcd60e51b815260040161029690611749565b610c5661063c565b6001600160a01b031663167fd6818260000151610c788460600151600061121a565b6040518363ffffffff1660e01b8152600401610c959291906115c7565b600060405180830381600087803b158015610caf57600080fd5b505af1158015610cc3573d6000803e3d6000fd5b5050505080600001517f8747b69ce8fdb31c3b9b0a67bd8049ad8c1a69ea417b69b12174068abd9cbd648260200151604051610cff91906115be565b60405180910390a250565b60008160200151826040015183606001518460800151604051602001610d3394939291906115dd565b604051602081830303815290604052805190602001209050919050565b6000808211610d905760405162461bcd60e51b8152600401808060200182810382526030815260200180611a016030913960400191505060405180910390fd5b8160011415610da15750600061026a565b81600060805b60018110610dd1576000196001821b01811b831615610dc95791821c91908101905b60011c610da7565b506001811b8414610b8b576001019392505050565b600080825111610e275760405162461bcd60e51b8152600401808060200182810382526034815260200180611ada6034913960400191505060405180910390fd5b815160011415610e4d5781600081518110610e3e57fe5b6020026020010151905061026a565b60408051610200810182527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56381527f633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d60208201527f890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d818301527f3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd86060808301919091527fecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da60808301527fdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da560a08301527f617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d760c08301527f292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead60e08301527fe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e106101008301527f7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f826101208301527fe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e836365166101408301527f3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c6101608301527fad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e6101808301527fa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab6101a08301527f4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c8626101c08301527f2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf106101e083015282518381529081018352909160009190602082018180368337505085519192506000918291508180805b60018411156111f65750506002820460018084161460005b82811015611172578a816002028151811061111957fe5b602002602001015196508a816002026001018151811061113557fe5b6020026020010151955086602089015285604089015287805190602001208b828151811061115f57fe5b6020908102919091010152600101611102565b5080156111d55789600185038151811061118857fe5b6020026020010151955087836010811061119e57fe5b602002015160001b945085602088015284604088015286805190602001208a83815181106111c857fe5b6020026020010181815250505b806111e15760006111e4565b60015b60ff16820193506001909201916110ea565b8960008151811061120357fe5b602002602001015198505050505050505050919050565b602890811b91909117901b90565b600067ffffffffffffffff83111561123c57fe5b61124f601f8401601f19166020016119b8565b905082815283838301111561126357600080fd5b828260208301376000602084830101529392505050565b600082601f83011261128a578081fd5b8135602067ffffffffffffffff8211156112a057fe5b8082026112ae8282016119b8565b8381528281019086840183880185018910156112c8578687fd5b8693505b858410156112ea5780358352600193909301929184019184016112cc565b50979650505050505050565b600060a08284031215611307578081fd5b60405160a0810167ffffffffffffffff828210818311171561132557fe5b8160405282935084358352602085013560208401526040850135604084015260608501356060840152608085013591508082111561136257600080fd5b508301601f8101851361137457600080fd5b61138385823560208401611228565b6080830152505092915050565b600080604083850312156113a2578182fd5b823567ffffffffffffffff8111156113b8578283fd5b6113c48582860161127a565b95602094909401359450505050565b6000602082840312156113e4578081fd5b81518015158114610b8b578182fd5b600060208284031215611404578081fd5b815164ffffffffff1981168114610b8b578182fd5b60006020828403121561142a578081fd5b5051919050565b600080600060608486031215611445578081fd5b83359250602084013567ffffffffffffffff80821115611463578283fd5b61146f878388016112f6565b93506040860135915080821115611484578283fd5b9085019060408288031215611497578283fd5b6040516040810181811083821117156114ac57fe5b604052823581526020830135828111156114c4578485fd5b6114d08982860161127a565b6020830152508093505050509250925092565b6000602082840312156114f4578081fd5b813567ffffffffffffffff81111561150a578182fd5b8201601f8101841361151a578182fd5b61152984823560208401611228565b949350505050565b600060208284031215611542578081fd5b813567ffffffffffffffff811115611558578182fd5b611529848285016112f6565b60008060408385031215611576578182fd5b825160208401519092506001600160a01b0381168114611594578182fd5b809150509250929050565b6001600160a01b0391909116815260200190565b901515815260200190565b90815260200190565b91825264ffffffffff1916602082015260400190565b600085825260208581840152846040840152608060608401528351806080850152825b8181101561161c5785810183015185820160a001528201611600565b8181111561162d578360a083870101525b50601f01601f19169290920160a0019695505050505050565b60208082526049908201527f4e756d626572206f6620737461746520726f6f74732063616e6e6f742065786360408201527f65656420746865206e756d626572206f662063616e6f6e6963616c207472616e60608201526839b0b1ba34b7b7399760b91b608082015260a00190565b60208082526018908201527f496e76616c696420696e636c7573696f6e2070726f6f662e0000000000000000604082015260600190565b6020808252603d908201527f41637475616c20626174636820737461727420696e64657820646f6573206e6f60408201527f74206d6174636820657870656374656420737461727420696e6465782e000000606082015260800190565b60208082526015908201527424b73b30b634b2103130ba31b4103432b0b232b91760591b604082015260600190565b602080825260409082018190527f537461746520626174636865732063616e206f6e6c792062652064656c657465908201527f642077697468696e207468652066726175642070726f6f662077696e646f772e606082015260800190565b6020808252603b908201527f537461746520626174636865732063616e206f6e6c792062652064656c65746560408201527f6420627920746865204f564d5f467261756456657269666965722e0000000000606082015260800190565b60208082526025908201527f4261746368206865616465722074696d657374616d702063616e6e6f74206265604082015264207a65726f60d81b606082015260800190565b60208082526023908201527f43616e6e6f74207375626d697420616e20656d7074792073746174652062617460408201526231b41760e91b606082015260800190565b6020808252602f908201527f50726f706f73657220646f6573206e6f74206861766520656e6f75676820636f60408201526e1b1b185d195c985b081c1bdcdd1959608a1b606082015260800190565b60208082526043908201527f43616e6e6f74207075626c69736820737461746520726f6f747320776974686960408201527f6e207468652073657175656e636572207075626c69636174696f6e2077696e6460608201526237bb9760e91b608082015260a00190565b60208082526014908201527324b73b30b634b2103130ba31b41034b73232bc1760611b604082015260600190565b9182526001600160a01b0316602082015260400190565b60405181810167ffffffffffffffff811182821017156119d457fe5b60405291905056fe4c69625f4d65726b6c65547265653a20496e646578206f7574206f6620626f756e64732e4c69625f4d65726b6c65547265653a2043616e6e6f7420636f6d70757465206365696c286c6f675f3229206f6620302e4c69625f4d65726b6c65547265653a20546f74616c206c6561766573206d7573742062652067726561746572207468616e207a65726f2e4c69625f4d65726b6c65547265653a20546f74616c207369626c696e677320646f6573206e6f7420636f72726563746c7920636f72726573706f6e6420746f20746f74616c206c65617665732e4f564d5f436861696e53746f72616765436f6e7461696e65723a5343433a626174636865734c69625f4d65726b6c65547265653a204d7573742070726f76696465206174206c65617374206f6e65206c65616620686173682ea2646970667358221220506037c0b14007945d0021e871906eec23207a206b7ab0e885c015d836e1dcac64736f6c63430007060033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100b45760003560e01c80638ca5cbb9116100715780638ca5cbb91461012f5780639418bddd14610144578063b8e189ac14610157578063c17b291b1461016a578063cfdf677e14610172578063e561dddc1461017a576100b4565b8063299ca478146100b9578063461a4478146100d75780634d69ee57146100ea5780637aa63a861461010a5780637ad168a01461011f57806381eb62ef14610127575b600080fd5b6100c1610182565b6040516100ce919061159f565b60405180910390f35b6100c16100e53660046114e3565b610191565b6100fd6100f8366004611431565b61026f565b6040516100ce91906115b3565b6101126102e2565b6040516100ce91906115be565b6101126102fb565b610112610314565b61014261013d366004611390565b61031a565b005b6100fd610152366004611531565b61052e565b610142610165366004611531565b61057e565b610112610636565b6100c161063c565b610112610664565b6000546001600160a01b031681565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b838110156101f15781810151838201526020016101d9565b50505050905090810190601f16801561021e5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561023b57600080fd5b505afa15801561024f573d6000803e3d6000fd5b505050506040513d602081101561026557600080fd5b505190505b919050565b600061027a836106de565b61029f5760405162461bcd60e51b815260040161029690611749565b60405180910390fd5b6102bc836020015185846000015185602001518760400151610776565b6102d85760405162461bcd60e51b8152600401610296906116b5565b5060019392505050565b6000806102ed6108fb565b5064ffffffffff1691505090565b6000806103066108fb565b64ffffffffff169250505090565b60025481565b6103226102e2565b81146103405760405162461bcd60e51b8152600401610296906116ec565b6103706040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b815250610191565b6001600160a01b03166302ad4d2a336040518263ffffffff1660e01b815260040161039b919061159f565b60206040518083038186803b1580156103b357600080fd5b505afa1580156103c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103eb91906113d3565b6104075760405162461bcd60e51b8152600401610296906118bb565b60008251116104285760405162461bcd60e51b815260040161029690611878565b6104666040518060400160405280601d81526020017f4f564d5f43616e6f6e6963616c5472616e73616374696f6e436861696e000000815250610191565b6001600160a01b0316637aa63a866040518163ffffffff1660e01b815260040160206040518083038186803b15801561049e57600080fd5b505afa1580156104b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104d69190611419565b82516104e06102e2565b0111156104ff5760405162461bcd60e51b815260040161029690611646565b61052a8242336040516020016105169291906119a1565b604051602081830303815290604052610990565b5050565b60008082608001518060200190518101906105499190611564565b509050806105695760405162461bcd60e51b815260040161029690611833565b4261057682600154610b31565b119392505050565b6105b06040518060400160405280601181526020017027ab26afa33930bab22b32b934b334b2b960791b815250610191565b6001600160a01b0316336001600160a01b0316146105e05760405162461bcd60e51b8152600401610296906117d6565b6105e9816106de565b6106055760405162461bcd60e51b815260040161029690611749565b61060e8161052e565b61062a5760405162461bcd60e51b815260040161029690611778565b61063381610b92565b50565b60015481565b600061065f604051806060016040528060258152602001611ab560259139610191565b905090565b600061066e61063c565b6001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b1580156106a657600080fd5b505afa1580156106ba573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061065f9190611419565b60006106e861063c565b8251604051634a83e9cd60e11b81526001600160a01b039290921691639507d39a91610716916004016115be565b60206040518083038186803b15801561072e57600080fd5b505afa158015610742573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107669190611419565b61076f83610d0a565b1492915050565b60008082116107b65760405162461bcd60e51b8152600401808060200182810382526037815260200180611a316037913960400191505060405180910390fd5b8184106107f45760405162461bcd60e51b81526004018080602001828103825260248152602001806119dd6024913960400191505060405180910390fd5b6107fd82610d50565b83511461083b5760405162461bcd60e51b815260040180806020018281038252604d815260200180611a68604d913960600191505060405180910390fd5b8460005b84518110156108ee57856001166001141561089d5784818151811061086057fe5b60200260200101518260405160200180838152602001828152602001925050506040516020818303038152906040528051906020012091506108e2565b818582815181106108aa57fe5b602002602001015160405160200180838152602001828152602001925050506040516020818303038152906040528051906020012091505b600195861c950161083f565b5090951495945050505050565b600080600061090861063c565b6001600160a01b031663ccf8f9696040518163ffffffff1660e01b815260040160206040518083038186803b15801561094057600080fd5b505afa158015610954573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061097891906113f3565b64ffffffffff602882901c16935060501c9150509091565b60006109bf6040518060400160405280600c81526020016b27ab26afa83937b837b9b2b960a11b815250610191565b90506000806109cc6108fb565b9092509050336001600160a01b03841614156109e9575042610a13565b426002548264ffffffffff160110610a135760405162461bcd60e51b81526004016102969061190a565b60006040518060a00160405280610a28610664565b8152602001610a3688610de6565b8152602001875181526020018464ffffffffff16815260200186815250905080600001517f16be4c5129a4e03cf3350262e181dc02ddfb4a6008d925368c0899fcd97ca9c58260200151836040015184606001518560800151604051610a9f94939291906115dd565b60405180910390a2610aaf61063c565b6001600160a01b0316632015276c610ac683610d0a565b610ada84604001518560600151018661121a565b6040518363ffffffff1660e01b8152600401610af79291906115c7565b600060405180830381600087803b158015610b1157600080fd5b505af1158015610b25573d6000803e3d6000fd5b50505050505050505050565b600082820183811015610b8b576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b610b9a61063c565b6001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b158015610bd257600080fd5b505afa158015610be6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c0a9190611419565b815110610c295760405162461bcd60e51b815260040161029690611973565b610c32816106de565b610c4e5760405162461bcd60e51b815260040161029690611749565b610c5661063c565b6001600160a01b031663167fd6818260000151610c788460600151600061121a565b6040518363ffffffff1660e01b8152600401610c959291906115c7565b600060405180830381600087803b158015610caf57600080fd5b505af1158015610cc3573d6000803e3d6000fd5b5050505080600001517f8747b69ce8fdb31c3b9b0a67bd8049ad8c1a69ea417b69b12174068abd9cbd648260200151604051610cff91906115be565b60405180910390a250565b60008160200151826040015183606001518460800151604051602001610d3394939291906115dd565b604051602081830303815290604052805190602001209050919050565b6000808211610d905760405162461bcd60e51b8152600401808060200182810382526030815260200180611a016030913960400191505060405180910390fd5b8160011415610da15750600061026a565b81600060805b60018110610dd1576000196001821b01811b831615610dc95791821c91908101905b60011c610da7565b506001811b8414610b8b576001019392505050565b600080825111610e275760405162461bcd60e51b8152600401808060200182810382526034815260200180611ada6034913960400191505060405180910390fd5b815160011415610e4d5781600081518110610e3e57fe5b6020026020010151905061026a565b60408051610200810182527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56381527f633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d60208201527f890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d818301527f3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd86060808301919091527fecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da60808301527fdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da560a08301527f617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d760c08301527f292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead60e08301527fe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e106101008301527f7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f826101208301527fe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e836365166101408301527f3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c6101608301527fad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e6101808301527fa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab6101a08301527f4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c8626101c08301527f2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf106101e083015282518381529081018352909160009190602082018180368337505085519192506000918291508180805b60018411156111f65750506002820460018084161460005b82811015611172578a816002028151811061111957fe5b602002602001015196508a816002026001018151811061113557fe5b6020026020010151955086602089015285604089015287805190602001208b828151811061115f57fe5b6020908102919091010152600101611102565b5080156111d55789600185038151811061118857fe5b6020026020010151955087836010811061119e57fe5b602002015160001b945085602088015284604088015286805190602001208a83815181106111c857fe5b6020026020010181815250505b806111e15760006111e4565b60015b60ff16820193506001909201916110ea565b8960008151811061120357fe5b602002602001015198505050505050505050919050565b602890811b91909117901b90565b600067ffffffffffffffff83111561123c57fe5b61124f601f8401601f19166020016119b8565b905082815283838301111561126357600080fd5b828260208301376000602084830101529392505050565b600082601f83011261128a578081fd5b8135602067ffffffffffffffff8211156112a057fe5b8082026112ae8282016119b8565b8381528281019086840183880185018910156112c8578687fd5b8693505b858410156112ea5780358352600193909301929184019184016112cc565b50979650505050505050565b600060a08284031215611307578081fd5b60405160a0810167ffffffffffffffff828210818311171561132557fe5b8160405282935084358352602085013560208401526040850135604084015260608501356060840152608085013591508082111561136257600080fd5b508301601f8101851361137457600080fd5b61138385823560208401611228565b6080830152505092915050565b600080604083850312156113a2578182fd5b823567ffffffffffffffff8111156113b8578283fd5b6113c48582860161127a565b95602094909401359450505050565b6000602082840312156113e4578081fd5b81518015158114610b8b578182fd5b600060208284031215611404578081fd5b815164ffffffffff1981168114610b8b578182fd5b60006020828403121561142a578081fd5b5051919050565b600080600060608486031215611445578081fd5b83359250602084013567ffffffffffffffff80821115611463578283fd5b61146f878388016112f6565b93506040860135915080821115611484578283fd5b9085019060408288031215611497578283fd5b6040516040810181811083821117156114ac57fe5b604052823581526020830135828111156114c4578485fd5b6114d08982860161127a565b6020830152508093505050509250925092565b6000602082840312156114f4578081fd5b813567ffffffffffffffff81111561150a578182fd5b8201601f8101841361151a578182fd5b61152984823560208401611228565b949350505050565b600060208284031215611542578081fd5b813567ffffffffffffffff811115611558578182fd5b611529848285016112f6565b60008060408385031215611576578182fd5b825160208401519092506001600160a01b0381168114611594578182fd5b809150509250929050565b6001600160a01b0391909116815260200190565b901515815260200190565b90815260200190565b91825264ffffffffff1916602082015260400190565b600085825260208581840152846040840152608060608401528351806080850152825b8181101561161c5785810183015185820160a001528201611600565b8181111561162d578360a083870101525b50601f01601f19169290920160a0019695505050505050565b60208082526049908201527f4e756d626572206f6620737461746520726f6f74732063616e6e6f742065786360408201527f65656420746865206e756d626572206f662063616e6f6e6963616c207472616e60608201526839b0b1ba34b7b7399760b91b608082015260a00190565b60208082526018908201527f496e76616c696420696e636c7573696f6e2070726f6f662e0000000000000000604082015260600190565b6020808252603d908201527f41637475616c20626174636820737461727420696e64657820646f6573206e6f60408201527f74206d6174636820657870656374656420737461727420696e6465782e000000606082015260800190565b60208082526015908201527424b73b30b634b2103130ba31b4103432b0b232b91760591b604082015260600190565b602080825260409082018190527f537461746520626174636865732063616e206f6e6c792062652064656c657465908201527f642077697468696e207468652066726175642070726f6f662077696e646f772e606082015260800190565b6020808252603b908201527f537461746520626174636865732063616e206f6e6c792062652064656c65746560408201527f6420627920746865204f564d5f467261756456657269666965722e0000000000606082015260800190565b60208082526025908201527f4261746368206865616465722074696d657374616d702063616e6e6f74206265604082015264207a65726f60d81b606082015260800190565b60208082526023908201527f43616e6e6f74207375626d697420616e20656d7074792073746174652062617460408201526231b41760e91b606082015260800190565b6020808252602f908201527f50726f706f73657220646f6573206e6f74206861766520656e6f75676820636f60408201526e1b1b185d195c985b081c1bdcdd1959608a1b606082015260800190565b60208082526043908201527f43616e6e6f74207075626c69736820737461746520726f6f747320776974686960408201527f6e207468652073657175656e636572207075626c69636174696f6e2077696e6460608201526237bb9760e91b608082015260a00190565b60208082526014908201527324b73b30b634b2103130ba31b41034b73232bc1760611b604082015260600190565b9182526001600160a01b0316602082015260400190565b60405181810167ffffffffffffffff811182821017156119d457fe5b60405291905056fe4c69625f4d65726b6c65547265653a20496e646578206f7574206f6620626f756e64732e4c69625f4d65726b6c65547265653a2043616e6e6f7420636f6d70757465206365696c286c6f675f3229206f6620302e4c69625f4d65726b6c65547265653a20546f74616c206c6561766573206d7573742062652067726561746572207468616e207a65726f2e4c69625f4d65726b6c65547265653a20546f74616c207369626c696e677320646f6573206e6f7420636f72726563746c7920636f72726573706f6e6420746f20746f74616c206c65617665732e4f564d5f436861696e53746f72616765436f6e7461696e65723a5343433a626174636865734c69625f4d65726b6c65547265653a204d7573742070726f76696465206174206c65617374206f6e65206c65616620686173682ea2646970667358221220506037c0b14007945d0021e871906eec23207a206b7ab0e885c015d836e1dcac64736f6c63430007060033", "devdoc": { "details": "The State Commitment Chain (SCC) contract contains a list of proposed state roots which Proposers assert to be a result of each transaction in the Canonical Transaction Chain (CTC). Elements here have a 1:1 correspondence with transactions in the CTC, and should be the unique state root calculated off-chain by applying the canonical transactions one by one. Compiler used: solc Runtime target: EVM", "kind": "dev", @@ -434,6 +434,14 @@ "_inside": "Whether or not the batch is inside the fraud proof window." } }, + "resolve(string)": { + "params": { + "_name": "Name to resolve an address for." + }, + "returns": { + "_0": "Address associated with the given name." + } + }, "verifyStateCommitment(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))": { "params": { "_batchHeader": "Header of the batch in which the element was included.", @@ -469,6 +477,9 @@ "insideFraudProofWindow((uint256,bytes32,uint256,uint256,bytes))": { "notice": "Checks whether a given batch is still inside its fraud proof window." }, + "resolve(string)": { + "notice": "Resolves the address associated with a given name." + }, "verifyStateCommitment(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))": { "notice": "Verifies a batch inclusion proof." } @@ -478,15 +489,15 @@ "storageLayout": { "storage": [ { - "astId": 12554, + "astId": 12856, "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_StateCommitmentChain.sol:OVM_StateCommitmentChain", "label": "libAddressManager", "offset": 0, "slot": "0", - "type": "t_contract(Lib_AddressManager)12547" + "type": "t_contract(Lib_AddressManager)12849" }, { - "astId": 3984, + "astId": 4722, "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_StateCommitmentChain.sol:OVM_StateCommitmentChain", "label": "FRAUD_PROOF_WINDOW", "offset": 0, @@ -494,7 +505,7 @@ "type": "t_uint256" }, { - "astId": 3986, + "astId": 4724, "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_StateCommitmentChain.sol:OVM_StateCommitmentChain", "label": "SEQUENCER_PUBLISH_WINDOW", "offset": 0, @@ -503,7 +514,7 @@ } ], "types": { - "t_contract(Lib_AddressManager)12547": { + "t_contract(Lib_AddressManager)12849": { "encoding": "inplace", "label": "contract Lib_AddressManager", "numberOfBytes": "20" diff --git a/packages/contracts/deployments/mainnet/OVM_StateManagerFactory.json b/packages/contracts/deployments/mainnet/OVM_StateManagerFactory.json index 6a489262dafe8..21c4d1f254d34 100644 --- a/packages/contracts/deployments/mainnet/OVM_StateManagerFactory.json +++ b/packages/contracts/deployments/mainnet/OVM_StateManagerFactory.json @@ -1,5 +1,5 @@ { - "address": "0xc43AB03567A18CC75CD4B75ABDBEb6DfC2192fF3", + "address": "0xA4C213C1E2bF5594baB0BCdF071ed5B0E946b19e", "abi": [ { "inputs": [ @@ -21,29 +21,29 @@ "type": "function" } ], - "transactionHash": "0xc0d3ce8d2bf3995853dddf8ccc338be8f46d89b9c7dd48b449914dcc224e5f38", + "transactionHash": "0x3eb51c18e23caff11a345482b4f5ba332d783cd2937218e8f03cb92fc112ba14", "receipt": { "to": null, - "from": "0x77C4c8f491e5ff22a2C0E18b005c3BA0Fe36c1Bc", - "contractAddress": "0xc43AB03567A18CC75CD4B75ABDBEb6DfC2192fF3", - "transactionIndex": 115, - "gasUsed": "1153245", + "from": "0xd033f09cB85621F98F7A84C64dB381ac16Eff818", + "contractAddress": "0xA4C213C1E2bF5594baB0BCdF071ed5B0E946b19e", + "transactionIndex": 185, + "gasUsed": "1170970", "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0x91ba884029e7428e0ca8a0f7894ea5dfa92166f93966ee4e745540a014f867e1", - "transactionHash": "0xc0d3ce8d2bf3995853dddf8ccc338be8f46d89b9c7dd48b449914dcc224e5f38", + "blockHash": "0x81540961200bc28f697df473ce437473ce7b9e4bdba345530d81da098497e568", + "transactionHash": "0x3eb51c18e23caff11a345482b4f5ba332d783cd2937218e8f03cb92fc112ba14", "logs": [], - "blockNumber": 12207884, - "cumulativeGasUsed": "9648387", + "blockNumber": 12410846, + "cumulativeGasUsed": "8261242", "status": 1, "byzantium": true }, "args": [], - "solcInputHash": "43ee6bb8ef92595aa6d0e22a6c464dff", - "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"}],\"name\":\"create\",\"outputs\":[{\"internalType\":\"contract iOVM_StateManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The State Manager Factory is called by a State Transitioner's init code, to create a new State Manager for use in the Fraud Verification process. Compiler used: solc Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"create(address)\":{\"params\":{\"_owner\":\"Owner of the created contract.\"},\"returns\":{\"_0\":\"New OVM_StateManager instance.\"}}},\"title\":\"OVM_StateManagerFactory\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"create(address)\":{\"notice\":\"Creates a new OVM_StateManager\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/OVM/execution/OVM_StateManagerFactory.sol\":\"OVM_StateManagerFactory\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/optimistic-ethereum/OVM/execution/OVM_StateManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_StateManager } from \\\"../../iOVM/execution/iOVM_StateManager.sol\\\";\\n\\n/**\\n * @title OVM_StateManager\\n * @dev The State Manager contract holds all storage values for contracts in the OVM. It can only be written to by the\\n * the Execution Manager and State Transitioner. It runs on L1 during the setup and execution of a fraud proof.\\n * The same logic runs on L2, but has been implemented as a precompile in the L2 go-ethereum client\\n * (see https://github.com/ethereum-optimism/go-ethereum/blob/master/core/vm/ovm_state_manager.go).\\n * \\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract OVM_StateManager is iOVM_StateManager {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n bytes32 constant internal EMPTY_ACCOUNT_STORAGE_ROOT = 0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421;\\n bytes32 constant internal EMPTY_ACCOUNT_CODE_HASH = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;\\n bytes32 constant internal STORAGE_XOR_VALUE = 0xFEEDFACECAFEBEEFFEEDFACECAFEBEEFFEEDFACECAFEBEEFFEEDFACECAFEBEEF;\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n address override public owner;\\n address override public ovmExecutionManager;\\n mapping (address => Lib_OVMCodec.Account) internal accounts;\\n mapping (address => mapping (bytes32 => bytes32)) internal contractStorage;\\n mapping (address => mapping (bytes32 => bool)) internal verifiedContractStorage;\\n mapping (bytes32 => ItemState) internal itemStates;\\n uint256 internal totalUncommittedAccounts;\\n uint256 internal totalUncommittedContractStorage;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _owner Address of the owner of this contract.\\n */\\n constructor(\\n address _owner\\n )\\n {\\n owner = _owner;\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n /**\\n * Simple authentication, this contract should only be accessible to the owner (which is expected to be the State Transitioner during `PRE_EXECUTION` \\n * or the OVM_ExecutionManager during transaction execution.\\n */\\n modifier authenticated() {\\n // owner is the State Transitioner\\n require(\\n msg.sender == owner || msg.sender == ovmExecutionManager,\\n \\\"Function can only be called by authenticated addresses\\\"\\n );\\n _;\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Checks whether a given address is allowed to modify this contract.\\n * @param _address Address to check.\\n * @return Whether or not the address can modify this contract.\\n */\\n function isAuthenticated(\\n address _address\\n )\\n override\\n public\\n view\\n returns (\\n bool\\n )\\n {\\n return (_address == owner || _address == ovmExecutionManager);\\n }\\n\\n /**\\n * Sets the address of the OVM_ExecutionManager.\\n * @param _ovmExecutionManager Address of the OVM_ExecutionManager.\\n */\\n function setExecutionManager(\\n address _ovmExecutionManager\\n )\\n override\\n public\\n authenticated\\n {\\n ovmExecutionManager = _ovmExecutionManager;\\n }\\n\\n /**\\n * Inserts an account into the state.\\n * @param _address Address of the account to insert.\\n * @param _account Account to insert for the given address.\\n */\\n function putAccount(\\n address _address,\\n Lib_OVMCodec.Account memory _account\\n )\\n override\\n public\\n authenticated\\n {\\n accounts[_address] = _account;\\n }\\n\\n /**\\n * Marks an account as empty.\\n * @param _address Address of the account to mark.\\n */\\n function putEmptyAccount(\\n address _address\\n )\\n override\\n public\\n authenticated\\n {\\n Lib_OVMCodec.Account storage account = accounts[_address];\\n account.storageRoot = EMPTY_ACCOUNT_STORAGE_ROOT;\\n account.codeHash = EMPTY_ACCOUNT_CODE_HASH;\\n }\\n\\n /**\\n * Retrieves an account from the state.\\n * @param _address Address of the account to retrieve.\\n * @return Account for the given address.\\n */\\n function getAccount(\\n address _address\\n )\\n override\\n public\\n view\\n returns (\\n Lib_OVMCodec.Account memory\\n )\\n {\\n return accounts[_address];\\n }\\n\\n /**\\n * Checks whether the state has a given account.\\n * @param _address Address of the account to check.\\n * @return Whether or not the state has the account.\\n */\\n function hasAccount(\\n address _address\\n )\\n override\\n public\\n view\\n returns (\\n bool\\n )\\n {\\n return accounts[_address].codeHash != bytes32(0);\\n }\\n\\n /**\\n * Checks whether the state has a given known empty account.\\n * @param _address Address of the account to check.\\n * @return Whether or not the state has the empty account.\\n */\\n function hasEmptyAccount(\\n address _address\\n )\\n override\\n public\\n view\\n returns (\\n bool\\n )\\n {\\n return (\\n accounts[_address].codeHash == EMPTY_ACCOUNT_CODE_HASH\\n && accounts[_address].nonce == 0\\n );\\n }\\n\\n /**\\n * Sets the nonce of an account.\\n * @param _address Address of the account to modify.\\n * @param _nonce New account nonce.\\n */\\n function setAccountNonce(\\n address _address,\\n uint256 _nonce\\n )\\n override\\n public\\n authenticated\\n {\\n accounts[_address].nonce = _nonce;\\n }\\n\\n /**\\n * Gets the nonce of an account.\\n * @param _address Address of the account to access.\\n * @return Nonce of the account.\\n */\\n function getAccountNonce(\\n address _address\\n )\\n override\\n public\\n view\\n returns (\\n uint256\\n )\\n {\\n return accounts[_address].nonce;\\n }\\n\\n /**\\n * Retrieves the Ethereum address of an account.\\n * @param _address Address of the account to access.\\n * @return Corresponding Ethereum address.\\n */\\n function getAccountEthAddress(\\n address _address\\n )\\n override\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return accounts[_address].ethAddress;\\n }\\n\\n /**\\n * Retrieves the storage root of an account.\\n * @param _address Address of the account to access.\\n * @return Corresponding storage root.\\n */\\n function getAccountStorageRoot(\\n address _address\\n )\\n override\\n public\\n view\\n returns (\\n bytes32\\n )\\n {\\n return accounts[_address].storageRoot;\\n }\\n\\n /**\\n * Initializes a pending account (during CREATE or CREATE2) with the default values.\\n * @param _address Address of the account to initialize.\\n */\\n function initPendingAccount(\\n address _address\\n )\\n override\\n public\\n authenticated\\n {\\n Lib_OVMCodec.Account storage account = accounts[_address];\\n account.nonce = 1;\\n account.storageRoot = EMPTY_ACCOUNT_STORAGE_ROOT;\\n account.codeHash = EMPTY_ACCOUNT_CODE_HASH;\\n account.isFresh = true;\\n }\\n\\n /**\\n * Finalizes the creation of a pending account (during CREATE or CREATE2).\\n * @param _address Address of the account to finalize.\\n * @param _ethAddress Address of the account's associated contract on Ethereum.\\n * @param _codeHash Hash of the account's code.\\n */\\n function commitPendingAccount(\\n address _address,\\n address _ethAddress,\\n bytes32 _codeHash\\n )\\n override\\n public\\n authenticated\\n {\\n Lib_OVMCodec.Account storage account = accounts[_address];\\n account.ethAddress = _ethAddress;\\n account.codeHash = _codeHash;\\n }\\n\\n /**\\n * Checks whether an account has already been retrieved, and marks it as retrieved if not.\\n * @param _address Address of the account to check.\\n * @return Whether or not the account was already loaded.\\n */\\n function testAndSetAccountLoaded(\\n address _address\\n )\\n override\\n public\\n authenticated\\n returns (\\n bool\\n )\\n {\\n return _testAndSetItemState(\\n _getItemHash(_address),\\n ItemState.ITEM_LOADED\\n );\\n }\\n\\n /**\\n * Checks whether an account has already been modified, and marks it as modified if not.\\n * @param _address Address of the account to check.\\n * @return Whether or not the account was already modified.\\n */\\n function testAndSetAccountChanged(\\n address _address\\n )\\n override\\n public\\n authenticated\\n returns (\\n bool\\n )\\n {\\n return _testAndSetItemState(\\n _getItemHash(_address),\\n ItemState.ITEM_CHANGED\\n );\\n }\\n\\n /**\\n * Attempts to mark an account as committed.\\n * @param _address Address of the account to commit.\\n * @return Whether or not the account was committed.\\n */\\n function commitAccount(\\n address _address\\n )\\n override\\n public\\n authenticated\\n returns (\\n bool\\n )\\n {\\n bytes32 item = _getItemHash(_address);\\n if (itemStates[item] != ItemState.ITEM_CHANGED) {\\n return false;\\n }\\n\\n itemStates[item] = ItemState.ITEM_COMMITTED;\\n totalUncommittedAccounts -= 1;\\n\\n return true;\\n }\\n\\n /**\\n * Increments the total number of uncommitted accounts.\\n */\\n function incrementTotalUncommittedAccounts()\\n override\\n public\\n authenticated\\n {\\n totalUncommittedAccounts += 1;\\n }\\n\\n /**\\n * Gets the total number of uncommitted accounts.\\n * @return Total uncommitted accounts.\\n */\\n function getTotalUncommittedAccounts()\\n override\\n public\\n view\\n returns (\\n uint256\\n )\\n {\\n return totalUncommittedAccounts;\\n }\\n\\n /**\\n * Checks whether a given account was changed during execution.\\n * @param _address Address to check.\\n * @return Whether or not the account was changed.\\n */\\n function wasAccountChanged(\\n address _address\\n )\\n override\\n public\\n view\\n returns (\\n bool\\n )\\n {\\n bytes32 item = _getItemHash(_address);\\n return itemStates[item] >= ItemState.ITEM_CHANGED;\\n }\\n\\n /**\\n * Checks whether a given account was committed after execution.\\n * @param _address Address to check.\\n * @return Whether or not the account was committed.\\n */\\n function wasAccountCommitted(\\n address _address\\n )\\n override\\n public\\n view\\n returns (\\n bool\\n )\\n {\\n bytes32 item = _getItemHash(_address);\\n return itemStates[item] >= ItemState.ITEM_COMMITTED;\\n }\\n\\n\\n /************************************\\n * Public Functions: Storage Access *\\n ************************************/\\n\\n /**\\n * Changes a contract storage slot value.\\n * @param _contract Address of the contract to modify.\\n * @param _key 32 byte storage slot key.\\n * @param _value 32 byte storage slot value.\\n */\\n function putContractStorage(\\n address _contract,\\n bytes32 _key,\\n bytes32 _value\\n )\\n override\\n public\\n authenticated\\n {\\n // A hilarious optimization. `SSTORE`ing a value of `bytes32(0)` is common enough that it's\\n // worth populating this with a non-zero value in advance (during the fraud proof\\n // initialization phase) to cut the execution-time cost down to 5000 gas.\\n contractStorage[_contract][_key] = _value ^ STORAGE_XOR_VALUE;\\n\\n // Only used when initially populating the contract storage. OVM_ExecutionManager will\\n // perform a `hasContractStorage` INVALID_STATE_ACCESS check before putting any contract\\n // storage because writing to zero when the actual value is nonzero causes a gas\\n // discrepancy. Could be moved into a new `putVerifiedContractStorage` function, or\\n // something along those lines.\\n if (verifiedContractStorage[_contract][_key] == false) {\\n verifiedContractStorage[_contract][_key] = true;\\n }\\n }\\n\\n /**\\n * Retrieves a contract storage slot value.\\n * @param _contract Address of the contract to access.\\n * @param _key 32 byte storage slot key.\\n * @return 32 byte storage slot value.\\n */\\n function getContractStorage(\\n address _contract,\\n bytes32 _key\\n )\\n override\\n public\\n view\\n returns (\\n bytes32\\n )\\n {\\n // Storage XOR system doesn't work for newly created contracts that haven't set this\\n // storage slot value yet.\\n if (\\n verifiedContractStorage[_contract][_key] == false\\n && accounts[_contract].isFresh\\n ) {\\n return bytes32(0);\\n }\\n\\n // See `putContractStorage` for more information about the XOR here.\\n return contractStorage[_contract][_key] ^ STORAGE_XOR_VALUE;\\n }\\n\\n /**\\n * Checks whether a contract storage slot exists in the state.\\n * @param _contract Address of the contract to access.\\n * @param _key 32 byte storage slot key.\\n * @return Whether or not the key was set in the state.\\n */\\n function hasContractStorage(\\n address _contract,\\n bytes32 _key\\n )\\n override\\n public\\n view\\n returns (\\n bool\\n )\\n {\\n return verifiedContractStorage[_contract][_key] || accounts[_contract].isFresh;\\n }\\n\\n /**\\n * Checks whether a storage slot has already been retrieved, and marks it as retrieved if not.\\n * @param _contract Address of the contract to check.\\n * @param _key 32 byte storage slot key.\\n * @return Whether or not the slot was already loaded.\\n */\\n function testAndSetContractStorageLoaded(\\n address _contract,\\n bytes32 _key\\n )\\n override\\n public\\n authenticated\\n returns (\\n bool\\n )\\n {\\n return _testAndSetItemState(\\n _getItemHash(_contract, _key),\\n ItemState.ITEM_LOADED\\n );\\n }\\n\\n /**\\n * Checks whether a storage slot has already been modified, and marks it as modified if not.\\n * @param _contract Address of the contract to check.\\n * @param _key 32 byte storage slot key.\\n * @return Whether or not the slot was already modified.\\n */\\n function testAndSetContractStorageChanged(\\n address _contract,\\n bytes32 _key\\n )\\n override\\n public\\n authenticated\\n returns (\\n bool\\n )\\n {\\n return _testAndSetItemState(\\n _getItemHash(_contract, _key),\\n ItemState.ITEM_CHANGED\\n );\\n }\\n\\n /**\\n * Attempts to mark a storage slot as committed.\\n * @param _contract Address of the account to commit.\\n * @param _key 32 byte slot key to commit.\\n * @return Whether or not the slot was committed.\\n */\\n function commitContractStorage(\\n address _contract,\\n bytes32 _key\\n )\\n override\\n public\\n authenticated\\n returns (\\n bool\\n )\\n {\\n bytes32 item = _getItemHash(_contract, _key);\\n if (itemStates[item] != ItemState.ITEM_CHANGED) {\\n return false;\\n }\\n\\n itemStates[item] = ItemState.ITEM_COMMITTED;\\n totalUncommittedContractStorage -= 1;\\n\\n return true;\\n }\\n\\n /**\\n * Increments the total number of uncommitted storage slots.\\n */\\n function incrementTotalUncommittedContractStorage()\\n override\\n public\\n authenticated\\n {\\n totalUncommittedContractStorage += 1;\\n }\\n\\n /**\\n * Gets the total number of uncommitted storage slots.\\n * @return Total uncommitted storage slots.\\n */\\n function getTotalUncommittedContractStorage()\\n override\\n public\\n view\\n returns (\\n uint256\\n )\\n {\\n return totalUncommittedContractStorage;\\n }\\n\\n /**\\n * Checks whether a given storage slot was changed during execution.\\n * @param _contract Address to check.\\n * @param _key Key of the storage slot to check.\\n * @return Whether or not the storage slot was changed.\\n */\\n function wasContractStorageChanged(\\n address _contract,\\n bytes32 _key\\n )\\n override\\n public\\n view\\n returns (\\n bool\\n )\\n {\\n bytes32 item = _getItemHash(_contract, _key);\\n return itemStates[item] >= ItemState.ITEM_CHANGED;\\n }\\n\\n /**\\n * Checks whether a given storage slot was committed after execution.\\n * @param _contract Address to check.\\n * @param _key Key of the storage slot to check.\\n * @return Whether or not the storage slot was committed.\\n */\\n function wasContractStorageCommitted(\\n address _contract,\\n bytes32 _key\\n )\\n override\\n public\\n view\\n returns (\\n bool\\n )\\n {\\n bytes32 item = _getItemHash(_contract, _key);\\n return itemStates[item] >= ItemState.ITEM_COMMITTED;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Generates a unique hash for an address.\\n * @param _address Address to generate a hash for.\\n * @return Unique hash for the given address.\\n */\\n function _getItemHash(\\n address _address\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(abi.encodePacked(_address));\\n }\\n\\n /**\\n * Generates a unique hash for an address/key pair.\\n * @param _contract Address to generate a hash for.\\n * @param _key Key to generate a hash for.\\n * @return Unique hash for the given pair.\\n */\\n function _getItemHash(\\n address _contract,\\n bytes32 _key\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(abi.encodePacked(\\n _contract,\\n _key\\n ));\\n }\\n\\n /**\\n * Checks whether an item is in a particular state (ITEM_LOADED or ITEM_CHANGED) and sets the\\n * item to the provided state if not.\\n * @param _item 32 byte item ID to check.\\n * @param _minItemState Minimum state that must be satisfied by the item.\\n * @return Whether or not the item was already in the state.\\n */\\n function _testAndSetItemState(\\n bytes32 _item,\\n ItemState _minItemState\\n )\\n internal\\n returns (\\n bool\\n )\\n {\\n bool wasItemState = itemStates[_item] >= _minItemState;\\n\\n if (wasItemState == false) {\\n itemStates[_item] = _minItemState;\\n }\\n\\n return wasItemState;\\n }\\n}\\n\",\"keccak256\":\"0x8509e24a2c361ce37710e637800cf46ed97482ab5d12d32b5f1ef8adeb474814\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/execution/OVM_StateManagerFactory.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Interface Imports */\\nimport { iOVM_StateManager } from \\\"../../iOVM/execution/iOVM_StateManager.sol\\\";\\nimport { iOVM_StateManagerFactory } from \\\"../../iOVM/execution/iOVM_StateManagerFactory.sol\\\";\\n\\n/* Contract Imports */\\nimport { OVM_StateManager } from \\\"./OVM_StateManager.sol\\\";\\n\\n/**\\n * @title OVM_StateManagerFactory\\n * @dev The State Manager Factory is called by a State Transitioner's init code, to create a new\\n * State Manager for use in the Fraud Verification process.\\n * \\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract OVM_StateManagerFactory is iOVM_StateManagerFactory {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Creates a new OVM_StateManager\\n * @param _owner Owner of the created contract.\\n * @return New OVM_StateManager instance.\\n */\\n function create(\\n address _owner\\n )\\n override\\n public\\n returns (\\n iOVM_StateManager\\n )\\n {\\n return new OVM_StateManager(_owner);\\n }\\n}\\n\",\"keccak256\":\"0xe2576f2a2ef4e829464216212d919f4aa4bda7144b5454d111f6eaca4aaf4a33\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/execution/iOVM_StateManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title iOVM_StateManager\\n */\\ninterface iOVM_StateManager {\\n\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n enum ItemState {\\n ITEM_UNTOUCHED,\\n ITEM_LOADED,\\n ITEM_CHANGED,\\n ITEM_COMMITTED\\n }\\n\\n /***************************\\n * Public Functions: Misc *\\n ***************************/\\n\\n function isAuthenticated(address _address) external view returns (bool);\\n\\n /***************************\\n * Public Functions: Setup *\\n ***************************/\\n\\n function owner() external view returns (address _owner);\\n function ovmExecutionManager() external view returns (address _ovmExecutionManager);\\n function setExecutionManager(address _ovmExecutionManager) external;\\n\\n\\n /************************************\\n * Public Functions: Account Access *\\n ************************************/\\n\\n function putAccount(address _address, Lib_OVMCodec.Account memory _account) external;\\n function putEmptyAccount(address _address) external;\\n function getAccount(address _address) external view returns (Lib_OVMCodec.Account memory _account);\\n function hasAccount(address _address) external view returns (bool _exists);\\n function hasEmptyAccount(address _address) external view returns (bool _exists);\\n function setAccountNonce(address _address, uint256 _nonce) external;\\n function getAccountNonce(address _address) external view returns (uint256 _nonce);\\n function getAccountEthAddress(address _address) external view returns (address _ethAddress);\\n function getAccountStorageRoot(address _address) external view returns (bytes32 _storageRoot);\\n function initPendingAccount(address _address) external;\\n function commitPendingAccount(address _address, address _ethAddress, bytes32 _codeHash) external;\\n function testAndSetAccountLoaded(address _address) external returns (bool _wasAccountAlreadyLoaded);\\n function testAndSetAccountChanged(address _address) external returns (bool _wasAccountAlreadyChanged);\\n function commitAccount(address _address) external returns (bool _wasAccountCommitted);\\n function incrementTotalUncommittedAccounts() external;\\n function getTotalUncommittedAccounts() external view returns (uint256 _total);\\n function wasAccountChanged(address _address) external view returns (bool);\\n function wasAccountCommitted(address _address) external view returns (bool);\\n\\n\\n /************************************\\n * Public Functions: Storage Access *\\n ************************************/\\n\\n function putContractStorage(address _contract, bytes32 _key, bytes32 _value) external;\\n function getContractStorage(address _contract, bytes32 _key) external view returns (bytes32 _value);\\n function hasContractStorage(address _contract, bytes32 _key) external view returns (bool _exists);\\n function testAndSetContractStorageLoaded(address _contract, bytes32 _key) external returns (bool _wasContractStorageAlreadyLoaded);\\n function testAndSetContractStorageChanged(address _contract, bytes32 _key) external returns (bool _wasContractStorageAlreadyChanged);\\n function commitContractStorage(address _contract, bytes32 _key) external returns (bool _wasContractStorageCommitted);\\n function incrementTotalUncommittedContractStorage() external;\\n function getTotalUncommittedContractStorage() external view returns (uint256 _total);\\n function wasContractStorageChanged(address _contract, bytes32 _key) external view returns (bool);\\n function wasContractStorageCommitted(address _contract, bytes32 _key) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x7a11dbd1f61593ba34debe07e39eef59967307f7f372ba9855bee0953585d08d\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/execution/iOVM_StateManagerFactory.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Contract Imports */\\nimport { iOVM_StateManager } from \\\"./iOVM_StateManager.sol\\\";\\n\\n/**\\n * @title iOVM_StateManagerFactory\\n */\\ninterface iOVM_StateManagerFactory {\\n\\n /***************************************\\n * Public Functions: Contract Creation *\\n ***************************************/\\n\\n function create(\\n address _owner\\n )\\n external\\n returns (\\n iOVM_StateManager _ovmStateManager\\n );\\n}\\n\",\"keccak256\":\"0x27a90fc43889d0c7d1db50f37907ef7386d9b415d15a1e91a0a068cba59afd36\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/codec/Lib_OVMCodec.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../utils/Lib_Bytes32Utils.sol\\\";\\nimport { Lib_SafeExecutionManagerWrapper } from \\\"../../libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\\\";\\n\\n/**\\n * @title Lib_OVMCodec\\n */\\nlibrary Lib_OVMCodec {\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum EOASignatureType {\\n EIP155_TRANSACTION,\\n ETH_SIGNED_MESSAGE\\n }\\n\\n enum QueueOrigin {\\n SEQUENCER_QUEUE,\\n L1TOL2_QUEUE\\n }\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Account {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n address ethAddress;\\n bool isFresh;\\n }\\n\\n struct EVMAccount {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n }\\n\\n struct ChainBatchHeader {\\n uint256 batchIndex;\\n bytes32 batchRoot;\\n uint256 batchSize;\\n uint256 prevTotalElements;\\n bytes extraData;\\n }\\n\\n struct ChainInclusionProof {\\n uint256 index;\\n bytes32[] siblings;\\n }\\n\\n struct Transaction {\\n uint256 timestamp;\\n uint256 blockNumber;\\n QueueOrigin l1QueueOrigin;\\n address l1TxOrigin;\\n address entrypoint;\\n uint256 gasLimit;\\n bytes data;\\n }\\n\\n struct TransactionChainElement {\\n bool isSequenced;\\n uint256 queueIndex; // QUEUED TX ONLY\\n uint256 timestamp; // SEQUENCER TX ONLY\\n uint256 blockNumber; // SEQUENCER TX ONLY\\n bytes txData; // SEQUENCER TX ONLY\\n }\\n\\n struct QueueElement {\\n bytes32 transactionHash;\\n uint40 timestamp;\\n uint40 blockNumber;\\n }\\n\\n struct EIP155Transaction {\\n uint256 nonce;\\n uint256 gasPrice;\\n uint256 gasLimit;\\n address to;\\n uint256 value;\\n bytes data;\\n uint256 chainId;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Decodes an EOA transaction (i.e., native Ethereum RLP encoding).\\n * @param _transaction Encoded EOA transaction.\\n * @return Transaction decoded into a struct.\\n */\\n function decodeEIP155Transaction(\\n bytes memory _transaction,\\n bool _isEthSignedMessage\\n )\\n internal\\n pure\\n returns (\\n EIP155Transaction memory\\n )\\n {\\n if (_isEthSignedMessage) {\\n (\\n uint256 _nonce,\\n uint256 _gasLimit,\\n uint256 _gasPrice,\\n uint256 _chainId,\\n address _to,\\n bytes memory _data\\n ) = abi.decode(\\n _transaction,\\n (uint256, uint256, uint256, uint256, address ,bytes)\\n );\\n return EIP155Transaction({\\n nonce: _nonce,\\n gasPrice: _gasPrice,\\n gasLimit: _gasLimit,\\n to: _to,\\n value: 0,\\n data: _data,\\n chainId: _chainId\\n });\\n } else {\\n Lib_RLPReader.RLPItem[] memory decoded = Lib_RLPReader.readList(_transaction);\\n\\n return EIP155Transaction({\\n nonce: Lib_RLPReader.readUint256(decoded[0]),\\n gasPrice: Lib_RLPReader.readUint256(decoded[1]),\\n gasLimit: Lib_RLPReader.readUint256(decoded[2]),\\n to: Lib_RLPReader.readAddress(decoded[3]),\\n value: Lib_RLPReader.readUint256(decoded[4]),\\n data: Lib_RLPReader.readBytes(decoded[5]),\\n chainId: Lib_RLPReader.readUint256(decoded[6])\\n });\\n }\\n }\\n\\n /**\\n * Decompresses a compressed EIP155 transaction.\\n * @param _transaction Compressed EIP155 transaction bytes.\\n * @return Transaction parsed into a struct.\\n */\\n function decompressEIP155Transaction(\\n bytes memory _transaction\\n )\\n internal\\n returns (\\n EIP155Transaction memory\\n )\\n {\\n return EIP155Transaction({\\n gasLimit: Lib_BytesUtils.toUint24(_transaction, 0),\\n gasPrice: uint256(Lib_BytesUtils.toUint24(_transaction, 3)) * 1000000,\\n nonce: Lib_BytesUtils.toUint24(_transaction, 6),\\n to: Lib_BytesUtils.toAddress(_transaction, 9),\\n data: Lib_BytesUtils.slice(_transaction, 29),\\n chainId: Lib_SafeExecutionManagerWrapper.safeCHAINID(),\\n value: 0\\n });\\n }\\n\\n /**\\n * Encodes an EOA transaction back into the original transaction.\\n * @param _transaction EIP155transaction to encode.\\n * @param _isEthSignedMessage Whether or not this was an eth signed message.\\n * @return Encoded transaction.\\n */\\n function encodeEIP155Transaction(\\n EIP155Transaction memory _transaction,\\n bool _isEthSignedMessage\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n if (_isEthSignedMessage) {\\n return abi.encode(\\n _transaction.nonce,\\n _transaction.gasLimit,\\n _transaction.gasPrice,\\n _transaction.chainId,\\n _transaction.to,\\n _transaction.data\\n );\\n } else {\\n bytes[] memory raw = new bytes[](9);\\n\\n raw[0] = Lib_RLPWriter.writeUint(_transaction.nonce);\\n raw[1] = Lib_RLPWriter.writeUint(_transaction.gasPrice);\\n raw[2] = Lib_RLPWriter.writeUint(_transaction.gasLimit);\\n if (_transaction.to == address(0)) {\\n raw[3] = Lib_RLPWriter.writeBytes('');\\n } else {\\n raw[3] = Lib_RLPWriter.writeAddress(_transaction.to);\\n }\\n raw[4] = Lib_RLPWriter.writeUint(0);\\n raw[5] = Lib_RLPWriter.writeBytes(_transaction.data);\\n raw[6] = Lib_RLPWriter.writeUint(_transaction.chainId);\\n raw[7] = Lib_RLPWriter.writeBytes(bytes(''));\\n raw[8] = Lib_RLPWriter.writeBytes(bytes(''));\\n\\n return Lib_RLPWriter.writeList(raw);\\n }\\n }\\n\\n /**\\n * Encodes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Encoded transaction bytes.\\n */\\n function encodeTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return abi.encodePacked(\\n _transaction.timestamp,\\n _transaction.blockNumber,\\n _transaction.l1QueueOrigin,\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n );\\n }\\n\\n /**\\n * Hashes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Hashed transaction\\n */\\n function hashTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(encodeTransaction(_transaction));\\n }\\n\\n /**\\n * Converts an OVM account to an EVM account.\\n * @param _in OVM account to convert.\\n * @return Converted EVM account.\\n */\\n function toEVMAccount(\\n Account memory _in\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n return EVMAccount({\\n nonce: _in.nonce,\\n balance: _in.balance,\\n storageRoot: _in.storageRoot,\\n codeHash: _in.codeHash\\n });\\n }\\n\\n /**\\n * @notice RLP-encodes an account state struct.\\n * @param _account Account state struct.\\n * @return RLP-encoded account state.\\n */\\n function encodeEVMAccount(\\n EVMAccount memory _account\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes[] memory raw = new bytes[](4);\\n\\n // Unfortunately we can't create this array outright because\\n // Lib_RLPWriter.writeList will reject fixed-size arrays. Assigning\\n // index-by-index circumvents this issue.\\n raw[0] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.nonce)\\n )\\n );\\n raw[1] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.balance)\\n )\\n );\\n raw[2] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.storageRoot));\\n raw[3] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.codeHash));\\n\\n return Lib_RLPWriter.writeList(raw);\\n }\\n\\n /**\\n * @notice Decodes an RLP-encoded account state into a useful struct.\\n * @param _encoded RLP-encoded account state.\\n * @return Account state struct.\\n */\\n function decodeEVMAccount(\\n bytes memory _encoded\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\\n\\n return EVMAccount({\\n nonce: Lib_RLPReader.readUint256(accountState[0]),\\n balance: Lib_RLPReader.readUint256(accountState[1]),\\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\\n });\\n }\\n\\n /**\\n * Calculates a hash for a given batch header.\\n * @param _batchHeader Header to hash.\\n * @return Hash of the header.\\n */\\n function hashBatchHeader(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(\\n abi.encode(\\n _batchHeader.batchRoot,\\n _batchHeader.batchSize,\\n _batchHeader.prevTotalElements,\\n _batchHeader.extraData\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0xe7e518ba7bba3fa28c532f8902576c1bb4dfc1ec4b62bed6da50623248ba17c3\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPReader.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_RLPReader\\n * @dev Adapted from \\\"RLPReader\\\" by Hamdi Allam (hamdi.allam97@gmail.com).\\n */\\nlibrary Lib_RLPReader {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 constant internal MAX_LIST_LENGTH = 32;\\n\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum RLPItemType {\\n DATA_ITEM,\\n LIST_ITEM\\n }\\n\\n \\n /***********\\n * Structs *\\n ***********/\\n\\n struct RLPItem {\\n uint256 length;\\n uint256 ptr;\\n }\\n \\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n \\n /**\\n * Converts bytes to a reference to memory position and length.\\n * @param _in Input bytes to convert.\\n * @return Output memory reference.\\n */\\n function toRLPItem(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem memory\\n )\\n {\\n uint256 ptr;\\n assembly {\\n ptr := add(_in, 32)\\n }\\n\\n return RLPItem({\\n length: _in.length,\\n ptr: ptr\\n });\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n (\\n uint256 listOffset,\\n ,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.LIST_ITEM,\\n \\\"Invalid RLP list value.\\\"\\n );\\n\\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\\n // writing to the length. Since we can't know the number of RLP items without looping over\\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\\n // simply set a reasonable maximum list length and decrease the size before we finish.\\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\\n\\n uint256 itemCount = 0;\\n uint256 offset = listOffset;\\n while (offset < _in.length) {\\n require(\\n itemCount < MAX_LIST_LENGTH,\\n \\\"Provided RLP list exceeds max list length.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n ) = _decodeLength(RLPItem({\\n length: _in.length - offset,\\n ptr: _in.ptr + offset\\n }));\\n\\n out[itemCount] = RLPItem({\\n length: itemLength + itemOffset,\\n ptr: _in.ptr + offset\\n });\\n\\n itemCount += 1;\\n offset += itemOffset + itemLength;\\n }\\n\\n // Decrease the array size to match the actual item count.\\n assembly {\\n mstore(out, itemCount)\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n return readList(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes value.\\\"\\n );\\n\\n return _copy(_in.ptr, itemOffset, itemLength);\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return readBytes(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return string(readBytes(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return readString(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n require(\\n _in.length <= 33,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr + itemOffset;\\n bytes32 out;\\n assembly {\\n out := mload(ptr)\\n\\n // Shift the bytes over to match the item size.\\n if lt(itemLength, 32) {\\n out := div(out, exp(256, sub(32, itemLength)))\\n }\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return readBytes32(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return uint256(readBytes32(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return readUint256(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n require(\\n _in.length == 1,\\n \\\"Invalid RLP boolean value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 out;\\n assembly {\\n out := byte(0, mload(ptr))\\n }\\n\\n require(\\n out == 0 || out == 1,\\n \\\"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\\\"\\n );\\n\\n return out != 0;\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return readBool(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n if (_in.length == 1) {\\n return address(0);\\n }\\n\\n require(\\n _in.length == 21,\\n \\\"Invalid RLP address value.\\\"\\n );\\n\\n return address(readUint256(_in));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return readAddress(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads the raw bytes of an RLP item.\\n * @param _in RLP item to read.\\n * @return Raw RLP bytes.\\n */\\n function readRawBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in);\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Decodes the length of an RLP item.\\n * @param _in RLP item to decode.\\n * @return Offset of the encoded data.\\n * @return Length of the encoded data.\\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\\n */\\n function _decodeLength(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n uint256,\\n uint256,\\n RLPItemType\\n )\\n {\\n require(\\n _in.length > 0,\\n \\\"RLP item cannot be null.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 prefix;\\n assembly {\\n prefix := byte(0, mload(ptr))\\n }\\n\\n if (prefix <= 0x7f) {\\n // Single byte.\\n\\n return (0, 1, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xb7) {\\n // Short string.\\n\\n uint256 strLen = prefix - 0x80;\\n \\n require(\\n _in.length > strLen,\\n \\\"Invalid RLP short string.\\\"\\n );\\n\\n return (1, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xbf) {\\n // Long string.\\n uint256 lenOfStrLen = prefix - 0xb7;\\n\\n require(\\n _in.length > lenOfStrLen,\\n \\\"Invalid RLP long string length.\\\"\\n );\\n\\n uint256 strLen;\\n assembly {\\n // Pick out the string length.\\n strLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfStrLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfStrLen + strLen,\\n \\\"Invalid RLP long string.\\\"\\n );\\n\\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xf7) {\\n // Short list.\\n uint256 listLen = prefix - 0xc0;\\n\\n require(\\n _in.length > listLen,\\n \\\"Invalid RLP short list.\\\"\\n );\\n\\n return (1, listLen, RLPItemType.LIST_ITEM);\\n } else {\\n // Long list.\\n uint256 lenOfListLen = prefix - 0xf7;\\n\\n require(\\n _in.length > lenOfListLen,\\n \\\"Invalid RLP long list length.\\\"\\n );\\n\\n uint256 listLen;\\n assembly {\\n // Pick out the list length.\\n listLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfListLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfListLen + listLen,\\n \\\"Invalid RLP long list.\\\"\\n );\\n\\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\\n }\\n }\\n\\n /**\\n * Copies the bytes from a memory location.\\n * @param _src Pointer to the location to read from.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Copied bytes.\\n */\\n function _copy(\\n uint256 _src,\\n uint256 _offset,\\n uint256 _length\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out = new bytes(_length);\\n if (out.length == 0) {\\n return out;\\n }\\n\\n uint256 src = _src + _offset;\\n uint256 dest;\\n assembly {\\n dest := add(out, 32)\\n }\\n\\n // Copy over as many complete words as we can.\\n for (uint256 i = 0; i < _length / 32; i++) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n\\n src += 32;\\n dest += 32;\\n }\\n\\n // Pick out the remaining bytes.\\n uint256 mask = 256 ** (32 - (_length % 32)) - 1;\\n assembly {\\n mstore(\\n dest,\\n or(\\n and(mload(src), not(mask)),\\n and(mload(dest), mask)\\n )\\n )\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Copies an RLP item into bytes.\\n * @param _in RLP item to copy.\\n * @return Copied bytes.\\n */\\n function _copy(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in.ptr, 0, _in.length);\\n }\\n}\\n\",\"keccak256\":\"0xbdb8fae0ca2483b4cc07607a5070fc25e33c54b4e4462b99e7c0b13aac48a09b\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPWriter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\n\\n/**\\n * @title Lib_RLPWriter\\n * @author Bakaoh (with modifications)\\n */\\nlibrary Lib_RLPWriter {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * RLP encodes a byte string.\\n * @param _in The byte string to encode.\\n * @return _out The RLP encoded string in bytes.\\n */\\n function writeBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n bytes memory encoded;\\n\\n if (_in.length == 1 && uint8(_in[0]) < 128) {\\n encoded = _in;\\n } else {\\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * RLP encodes a list of RLP encoded byte byte strings.\\n * @param _in The list of RLP encoded byte strings.\\n * @return _out The RLP encoded list of items in bytes.\\n */\\n function writeList(\\n bytes[] memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n bytes memory list = _flatten(_in);\\n return abi.encodePacked(_writeLength(list.length, 192), list);\\n }\\n\\n /**\\n * RLP encodes a string.\\n * @param _in The string to encode.\\n * @return _out The RLP encoded string in bytes.\\n */\\n function writeString(\\n string memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(bytes(_in));\\n }\\n\\n /**\\n * RLP encodes an address.\\n * @param _in The address to encode.\\n * @return _out The RLP encoded address in bytes.\\n */\\n function writeAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a uint.\\n * @param _in The uint256 to encode.\\n * @return _out The RLP encoded uint256 in bytes.\\n */\\n function writeUint(\\n uint256 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(_toBinary(_in));\\n }\\n\\n /**\\n * RLP encodes a bool.\\n * @param _in The bool to encode.\\n * @return _out The RLP encoded bool in bytes.\\n */\\n function writeBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n bytes memory encoded = new bytes(1);\\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\\n return encoded;\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\\n * @param _len The length of the string or the payload.\\n * @param _offset 128 if item is string, 192 if item is list.\\n * @return _encoded RLP encoded bytes.\\n */\\n function _writeLength(\\n uint256 _len,\\n uint256 _offset\\n )\\n private\\n pure\\n returns (\\n bytes memory _encoded\\n )\\n {\\n bytes memory encoded;\\n\\n if (_len < 56) {\\n encoded = new bytes(1);\\n encoded[0] = byte(uint8(_len) + uint8(_offset));\\n } else {\\n uint256 lenLen;\\n uint256 i = 1;\\n while (_len / i != 0) {\\n lenLen++;\\n i *= 256;\\n }\\n\\n encoded = new bytes(lenLen + 1);\\n encoded[0] = byte(uint8(lenLen) + uint8(_offset) + 55);\\n for(i = 1; i <= lenLen; i++) {\\n encoded[i] = byte(uint8((_len / (256**(lenLen-i))) % 256));\\n }\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * Encode integer in big endian binary form with no leading zeroes.\\n * @notice TODO: This should be optimized with assembly to save gas costs.\\n * @param _x The integer to encode.\\n * @return _binary RLP encoded bytes.\\n */\\n function _toBinary(\\n uint256 _x\\n )\\n private\\n pure\\n returns (\\n bytes memory _binary\\n )\\n {\\n bytes memory b = abi.encodePacked(_x);\\n\\n uint256 i = 0;\\n for (; i < 32; i++) {\\n if (b[i] != 0) {\\n break;\\n }\\n }\\n\\n bytes memory res = new bytes(32 - i);\\n for (uint256 j = 0; j < res.length; j++) {\\n res[j] = b[i++];\\n }\\n\\n return res;\\n }\\n\\n /**\\n * Copies a piece of memory to another location.\\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\\n * @param _dest Destination location.\\n * @param _src Source location.\\n * @param _len Length of memory to copy.\\n */\\n function _memcpy(\\n uint256 _dest,\\n uint256 _src,\\n uint256 _len\\n )\\n private\\n pure\\n {\\n uint256 dest = _dest;\\n uint256 src = _src;\\n uint256 len = _len;\\n\\n for(; len >= 32; len -= 32) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n dest += 32;\\n src += 32;\\n }\\n\\n uint256 mask = 256 ** (32 - len) - 1;\\n assembly {\\n let srcpart := and(mload(src), not(mask))\\n let destpart := and(mload(dest), mask)\\n mstore(dest, or(destpart, srcpart))\\n }\\n }\\n\\n /**\\n * Flattens a list of byte strings into one byte string.\\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\\n * @param _list List of byte strings to flatten.\\n * @return _flattened The flattened byte string.\\n */\\n function _flatten(\\n bytes[] memory _list\\n )\\n private\\n pure\\n returns (\\n bytes memory _flattened\\n )\\n {\\n if (_list.length == 0) {\\n return new bytes(0);\\n }\\n\\n uint256 len;\\n uint256 i = 0;\\n for (; i < _list.length; i++) {\\n len += _list[i].length;\\n }\\n\\n bytes memory flattened = new bytes(len);\\n uint256 flattenedPtr;\\n assembly { flattenedPtr := add(flattened, 0x20) }\\n\\n for(i = 0; i < _list.length; i++) {\\n bytes memory item = _list[i];\\n\\n uint256 listPtr;\\n assembly { listPtr := add(item, 0x20)}\\n\\n _memcpy(flattenedPtr, listPtr, item.length);\\n flattenedPtr += _list[i].length;\\n }\\n\\n return flattened;\\n }\\n}\",\"keccak256\":\"0xbcb24619c1758cb0d9f3fe5c79495950045a9087046a02b9ce01df46ae09ae5b\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_Bytes32Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_Byte32Utils\\n */\\nlibrary Lib_Bytes32Utils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \\\"true.\\\"\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as a boolean.\\n */\\n function toBool(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return _in != 0;\\n }\\n\\n /**\\n * Converts a boolean to a bytes32 value.\\n * @param _in Input boolean value.\\n * @return Boolean as a bytes32.\\n */\\n function fromBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in ? 1 : 0));\\n }\\n\\n /**\\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as an address.\\n */\\n function toAddress(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return address(uint160(uint256(_in)));\\n }\\n\\n /**\\n * Converts an address to a bytes32.\\n * @param _in Input address value.\\n * @return Address as a bytes32.\\n */\\n function fromAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in));\\n }\\n\\n /**\\n * Removes the leading zeros from a bytes32 value and returns a new (smaller) bytes value.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 without any leading zeros.\\n */\\n function removeLeadingZeros(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out;\\n\\n assembly {\\n // Figure out how many leading zero bytes to remove.\\n let shift := 0\\n for { let i := 0 } and(lt(i, 32), eq(byte(i, _in), 0)) { i := add(i, 1) } {\\n shift := add(shift, 1)\\n }\\n\\n // Reserve some space for our output and fix the free memory pointer.\\n out := mload(0x40)\\n mstore(0x40, add(out, 0x40))\\n\\n // Shift the value and store it into the output bytes.\\n mstore(add(out, 0x20), shl(mul(shift, 8), _in))\\n\\n // Store the new size (with leading zero bytes removed) in the output byte size.\\n mstore(out, sub(32, shift))\\n }\\n\\n return out;\\n }\\n}\\n\",\"keccak256\":\"0xfa2def593e3fc56a31852c3744aefdaa93cec74e721bfcfeb1e5d166c7c60b64\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_BytesUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_BytesUtils\\n */\\nlibrary Lib_BytesUtils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_start + _length >= _start, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n if (_bytes.length - _start == 0) {\\n return bytes('');\\n }\\n\\n return slice(_bytes, _start, _bytes.length - _start);\\n }\\n\\n function toBytes32PadLeft(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes32)\\n {\\n bytes32 ret;\\n uint256 len = _bytes.length <= 32 ? _bytes.length : 32;\\n assembly {\\n ret := shr(mul(sub(32, len), 8), mload(add(_bytes, 32)))\\n }\\n return ret;\\n }\\n\\n function toBytes32(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes32)\\n {\\n if (_bytes.length < 32) {\\n bytes32 ret;\\n assembly {\\n ret := mload(add(_bytes, 32))\\n }\\n return ret;\\n }\\n\\n return abi.decode(_bytes,(bytes32)); // will truncate if input length > 32 bytes\\n }\\n\\n function toUint256(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (uint256)\\n {\\n return uint256(toBytes32(_bytes));\\n }\\n\\n function toUint24(bytes memory _bytes, uint256 _start) internal pure returns (uint24) {\\n require(_start + 3 >= _start, \\\"toUint24_overflow\\\");\\n require(_bytes.length >= _start + 3 , \\\"toUint24_outOfBounds\\\");\\n uint24 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x3), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toUint8(bytes memory _bytes, uint256 _start) internal pure returns (uint8) {\\n require(_start + 1 >= _start, \\\"toUint8_overflow\\\");\\n require(_bytes.length >= _start + 1 , \\\"toUint8_outOfBounds\\\");\\n uint8 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x1), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toAddress(bytes memory _bytes, uint256 _start) internal pure returns (address) {\\n require(_start + 20 >= _start, \\\"toAddress_overflow\\\");\\n require(_bytes.length >= _start + 20, \\\"toAddress_outOfBounds\\\");\\n address tempAddress;\\n\\n assembly {\\n tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000)\\n }\\n\\n return tempAddress;\\n }\\n\\n function toNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n bytes memory nibbles = new bytes(_bytes.length * 2);\\n\\n for (uint256 i = 0; i < _bytes.length; i++) {\\n nibbles[i * 2] = _bytes[i] >> 4;\\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\\n }\\n\\n return nibbles;\\n }\\n\\n function fromNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n bytes memory ret = new bytes(_bytes.length / 2);\\n\\n for (uint256 i = 0; i < ret.length; i++) {\\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\\n }\\n\\n return ret;\\n }\\n\\n function equal(\\n bytes memory _bytes,\\n bytes memory _other\\n )\\n internal\\n pure\\n returns (bool)\\n {\\n return keccak256(_bytes) == keccak256(_other);\\n }\\n}\\n\",\"keccak256\":\"0x0adf22e1b22ba09911e859f64cb3b484e992be4f9fd3b09088e6225bf8d06ce0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_ErrorUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/**\\n * @title Lib_ErrorUtils\\n */\\nlibrary Lib_ErrorUtils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Encodes an error string into raw solidity-style revert data.\\n * (i.e. ascii bytes, prefixed with bytes4(keccak(\\\"Error(string))\\\"))\\n * Ref: https://docs.soliditylang.org/en/v0.8.2/control-structures.html?highlight=Error(string)#panic-via-assert-and-error-via-require\\n * @param _reason Reason for the reversion.\\n * @return Standard solidity revert data for the given reason.\\n */\\n function encodeRevertString(\\n string memory _reason\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return abi.encodeWithSignature(\\n \\\"Error(string)\\\",\\n _reason\\n );\\n }\\n}\\n\",\"keccak256\":\"0xfc64ec4a81fb50865b502a0004ed154e8598e1a313db77303fc95e41f536e6b7\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_ErrorUtils } from \\\"../utils/Lib_ErrorUtils.sol\\\";\\n\\n/**\\n * @title Lib_SafeExecutionManagerWrapper\\n * @dev The Safe Execution Manager Wrapper provides functions which facilitate writing OVM safe \\n * code using the standard solidity compiler, by routing all its operations through the Execution \\n * Manager.\\n * \\n * Compiler used: solc\\n * Runtime target: OVM\\n */\\nlibrary Lib_SafeExecutionManagerWrapper {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Performs a safe ovmCALL.\\n * @param _gasLimit Gas limit for the call.\\n * @param _target Address to call.\\n * @param _calldata Data to send to the call.\\n * @return _success Whether or not the call reverted.\\n * @return _returndata Data returned by the call.\\n */\\n function safeCALL(\\n uint256 _gasLimit,\\n address _target,\\n bytes memory _calldata\\n )\\n internal\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCALL(uint256,address,bytes)\\\",\\n _gasLimit,\\n _target,\\n _calldata\\n )\\n );\\n\\n return abi.decode(returndata, (bool, bytes));\\n }\\n\\n /**\\n * Performs a safe ovmDELEGATECALL.\\n * @param _gasLimit Gas limit for the call.\\n * @param _target Address to call.\\n * @param _calldata Data to send to the call.\\n * @return _success Whether or not the call reverted.\\n * @return _returndata Data returned by the call.\\n */\\n function safeDELEGATECALL(\\n uint256 _gasLimit,\\n address _target,\\n bytes memory _calldata\\n )\\n internal\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmDELEGATECALL(uint256,address,bytes)\\\",\\n _gasLimit,\\n _target,\\n _calldata\\n )\\n );\\n\\n return abi.decode(returndata, (bool, bytes));\\n }\\n\\n /**\\n * Performs a safe ovmCREATE call.\\n * @param _gasLimit Gas limit for the creation.\\n * @param _bytecode Code for the new contract.\\n * @return _contract Address of the created contract.\\n */\\n function safeCREATE(\\n uint256 _gasLimit,\\n bytes memory _bytecode\\n )\\n internal\\n returns (\\n address,\\n bytes memory\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n _gasLimit,\\n abi.encodeWithSignature(\\n \\\"ovmCREATE(bytes)\\\",\\n _bytecode\\n )\\n );\\n\\n return abi.decode(returndata, (address, bytes));\\n }\\n\\n /**\\n * Performs a safe ovmEXTCODESIZE call.\\n * @param _contract Address of the contract to query the size of.\\n * @return _EXTCODESIZE Size of the requested contract in bytes.\\n */\\n function safeEXTCODESIZE(\\n address _contract\\n )\\n internal\\n returns (\\n uint256 _EXTCODESIZE\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmEXTCODESIZE(address)\\\",\\n _contract\\n )\\n );\\n\\n return abi.decode(returndata, (uint256));\\n }\\n\\n /**\\n * Performs a safe ovmCHAINID call.\\n * @return _CHAINID Result of calling ovmCHAINID.\\n */\\n function safeCHAINID()\\n internal\\n returns (\\n uint256 _CHAINID\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCHAINID()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (uint256));\\n }\\n\\n /**\\n * Performs a safe ovmCALLER call.\\n * @return _CALLER Result of calling ovmCALLER.\\n */\\n function safeCALLER()\\n internal\\n returns (\\n address _CALLER\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCALLER()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (address));\\n }\\n\\n /**\\n * Performs a safe ovmADDRESS call.\\n * @return _ADDRESS Result of calling ovmADDRESS.\\n */\\n function safeADDRESS()\\n internal\\n returns (\\n address _ADDRESS\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmADDRESS()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (address));\\n }\\n\\n /**\\n * Performs a safe ovmGETNONCE call.\\n * @return _nonce Result of calling ovmGETNONCE.\\n */\\n function safeGETNONCE()\\n internal\\n returns (\\n uint256 _nonce\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmGETNONCE()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (uint256));\\n }\\n\\n /**\\n * Performs a safe ovmINCREMENTNONCE call.\\n */\\n function safeINCREMENTNONCE()\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmINCREMENTNONCE()\\\"\\n )\\n );\\n }\\n\\n /**\\n * Performs a safe ovmCREATEEOA call.\\n * @param _messageHash Message hash which was signed by EOA\\n * @param _v v value of signature (0 or 1)\\n * @param _r r value of signature\\n * @param _s s value of signature\\n */\\n function safeCREATEEOA(\\n bytes32 _messageHash,\\n uint8 _v,\\n bytes32 _r,\\n bytes32 _s\\n )\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCREATEEOA(bytes32,uint8,bytes32,bytes32)\\\",\\n _messageHash,\\n _v,\\n _r,\\n _s\\n )\\n );\\n }\\n\\n /**\\n * Performs a safe REVERT.\\n * @param _reason String revert reason to pass along with the REVERT.\\n */\\n function safeREVERT(\\n string memory _reason\\n )\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmREVERT(bytes)\\\",\\n Lib_ErrorUtils.encodeRevertString(\\n _reason\\n )\\n )\\n );\\n }\\n\\n /**\\n * Performs a safe \\\"require\\\".\\n * @param _condition Boolean condition that must be true or will revert.\\n * @param _reason String revert reason to pass along with the REVERT.\\n */\\n function safeREQUIRE(\\n bool _condition,\\n string memory _reason\\n )\\n internal\\n {\\n if (!_condition) {\\n safeREVERT(\\n _reason\\n );\\n }\\n }\\n\\n /**\\n * Performs a safe ovmSLOAD call.\\n */\\n function safeSLOAD(\\n bytes32 _key\\n )\\n internal\\n returns (\\n bytes32\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmSLOAD(bytes32)\\\",\\n _key\\n )\\n );\\n\\n return abi.decode(returndata, (bytes32));\\n }\\n\\n /**\\n * Performs a safe ovmSSTORE call.\\n */\\n function safeSSTORE(\\n bytes32 _key,\\n bytes32 _value\\n )\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmSSTORE(bytes32,bytes32)\\\",\\n _key,\\n _value\\n )\\n );\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Performs an ovm interaction and the necessary safety checks.\\n * @param _gasLimit Gas limit for the interaction.\\n * @param _calldata Data to send to the OVM_ExecutionManager (encoded with sighash).\\n * @return _returndata Data sent back by the OVM_ExecutionManager.\\n */\\n function _safeExecutionManagerInteraction(\\n uint256 _gasLimit,\\n bytes memory _calldata\\n )\\n private\\n returns (\\n bytes memory _returndata\\n )\\n {\\n address ovmExecutionManager = msg.sender;\\n (\\n bool success,\\n bytes memory returndata\\n ) = ovmExecutionManager.call{gas: _gasLimit}(_calldata);\\n\\n if (success == false) {\\n assembly {\\n revert(add(returndata, 0x20), mload(returndata))\\n }\\n } else if (returndata.length == 1) {\\n assembly {\\n return(0, 1)\\n }\\n } else {\\n return returndata;\\n }\\n }\\n\\n function _safeExecutionManagerInteraction(\\n bytes memory _calldata\\n )\\n private\\n returns (\\n bytes memory _returndata\\n )\\n {\\n return _safeExecutionManagerInteraction(\\n gasleft(),\\n _calldata\\n );\\n }\\n}\\n\",\"keccak256\":\"0x41e146e7912af794a17cd43c5a276674be956bfa8f3ca5b451bcb82d81e6f492\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x608060405234801561001057600080fd5b506113e5806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c80639ed9331814610030575b600080fd5b6100566004803603602081101561004657600080fd5b50356001600160a01b0316610072565b604080516001600160a01b039092168252519081900360200190f35b600081604051610081906100b5565b6001600160a01b03909116815260405190819003602001906000f0801580156100ae573d6000803e3d6000fd5b5092915050565b611316806100c38339019056fe608060405234801561001057600080fd5b5060405161131638038061131683398101604081905261002f91610054565b600080546001600160a01b0319166001600160a01b0392909216919091179055610082565b600060208284031215610065578081fd5b81516001600160a01b038116811461007b578182fd5b9392505050565b611285806100916000396000f3fe608060405234801561001057600080fd5b50600436106101f05760003560e01c80638f3b96471161010f578063d126199f116100a2578063e90abb8611610071578063e90abb86146103f9578063fb37b31c1461040c578063fbcbc0f11461041f578063fcf149a21461043f576101f0565b8063d126199f146103b8578063d15d4150146103cb578063d54414c8146103de578063d7bd4a2a146103f1576101f0565b8063c3fd9b25116100de578063c3fd9b2514610377578063c7650bf21461037f578063c8e40fbf14610392578063d0a215f2146103a5576101f0565b80638f3b96471461033657806399056ba914610349578063af37b86414610351578063af3dc01114610364576101f0565b806333f94305116101875780636f3c75af116101565780636f3c75af146102f55780637c8ee703146103085780637e86faa81461031b5780638da5cb5b1461032e576101f0565b806333f94305146102b25780635c17d629146102ba5780636b18e4e8146102cd5780636c87ad20146102e0576101f0565b8063167020d2116101c3578063167020d2146102595780631aaf392f1461026c5780631b208a5a1461028c57806326dc5b121461029f576101f0565b806307a12945146101f55780630ad226791461021e57806311b1f790146102315780631381ba4d14610244575b600080fd5b61020861020336600461101d565b610452565b60405161021591906111c4565b60405180910390f35b61020861022c366004611072565b6104ba565b61020861023f36600461101d565b610517565b61025761025236600461101d565b610573565b005b61020861026736600461101d565b6105d4565b61027f61027a366004611072565b610679565b60405161021591906111cf565b61020861029a36600461101d565b610727565b61027f6102ad36600461101d565b61075e565b61025761077d565b6102576102c836600461109b565b6107c7565b6102576102db36600461101d565b61089a565b6102e8610944565b60405161021591906111b0565b610208610303366004611072565b610953565b6102e861031636600461101d565b61098c565b610208610329366004611072565b6109ad565b6102e86109c3565b6102576103443660046110cd565b6109d2565b61027f610a88565b61020861035f366004611072565b610a8e565b610208610372366004611072565b610ae2565b610257610b2f565b61020861038d366004611072565b610b79565b6102086103a036600461101d565b610c20565b6102576103b3366004611037565b610c40565b61027f6103c636600461101d565b610cb9565b6102086103d936600461101d565b610cd4565b6102086103ec36600461101d565b610d01565b61027f610d16565b610257610407366004611072565b610d1c565b61020861041a36600461101d565b610d77565b61043261042d36600461101d565b610dc3565b604051610215919061122e565b61025761044d36600461101d565b610e37565b6001600160a01b0381166000908152600260205260408120600301547fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4701480156104b257506001600160a01b038216600090815260026020526040902054155b90505b919050565b6001600160a01b038216600090815260046020908152604080832084845290915281205460ff168061050e57506001600160a01b038316600090815260026020526040902060040154600160a01b900460ff165b90505b92915050565b600080546001600160a01b031633148061053b57506001546001600160a01b031633145b6105605760405162461bcd60e51b8152600401610557906111d8565b60405180910390fd5b6104b261056c83610ef8565b6002610f28565b6000546001600160a01b031633148061059657506001546001600160a01b031633145b6105b25760405162461bcd60e51b8152600401610557906111d8565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b600080546001600160a01b03163314806105f857506001546001600160a01b031633145b6106145760405162461bcd60e51b8152600401610557906111d8565b600061061f83610ef8565b9050600260008281526005602052604090205460ff16600381111561064057fe5b1461064f5760009150506104b5565b6000908152600560205260409020805460ff19166003179055505060068054600019019055600190565b6001600160a01b038216600090815260046020908152604080832084845290915281205460ff161580156106cf57506001600160a01b038316600090815260026020526040902060040154600160a01b900460ff165b156106dc57506000610511565b506001600160a01b0391909116600090815260036020908152604080832093835292905220547ffeedfacecafebeeffeedfacecafebeeffeedfacecafebeeffeedfacecafebeef1890565b60008061073383610ef8565b905060025b60008281526005602052604090205460ff16600381111561075557fe5b10159392505050565b6001600160a01b03166000908152600260208190526040909120015490565b6000546001600160a01b03163314806107a057506001546001600160a01b031633145b6107bc5760405162461bcd60e51b8152600401610557906111d8565b600680546001019055565b6000546001600160a01b03163314806107ea57506001546001600160a01b031633145b6108065760405162461bcd60e51b8152600401610557906111d8565b6001600160a01b038316600081815260036020908152604080832086845282528083207ffeedfacecafebeeffeedfacecafebeeffeedfacecafebeeffeedfacecafebeef86189055928252600481528282208583529052205460ff16610895576001600160a01b03831660009081526004602090815260408083208584529091529020805460ff191660011790555b505050565b6000546001600160a01b03163314806108bd57506001546001600160a01b031633145b6108d95760405162461bcd60e51b8152600401610557906111d8565b6001600160a01b031660009081526002602081905260409091207f56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421918101919091557fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470600390910155565b6001546001600160a01b031681565b6000806109608484610f8e565b905060025b60008281526005602052604090205460ff16600381111561098257fe5b1015949350505050565b6001600160a01b039081166000908152600260205260409020600401541690565b6000806109ba8484610f8e565b90506003610965565b6000546001600160a01b031681565b6000546001600160a01b03163314806109f557506001546001600160a01b031633145b610a115760405162461bcd60e51b8152600401610557906111d8565b6001600160a01b039182166000908152600260208181526040928390208451815590840151600182015591830151908201556060820151600382015560808201516004909101805460a0909301516001600160a01b0319909316919093161760ff60a01b1916600160a01b91151591909102179055565b60075490565b600080546001600160a01b0316331480610ab257506001546001600160a01b031633145b610ace5760405162461bcd60e51b8152600401610557906111d8565b61050e610adb8484610f8e565b6001610f28565b600080546001600160a01b0316331480610b0657506001546001600160a01b031633145b610b225760405162461bcd60e51b8152600401610557906111d8565b61050e61056c8484610f8e565b6000546001600160a01b0316331480610b5257506001546001600160a01b031633145b610b6e5760405162461bcd60e51b8152600401610557906111d8565b600780546001019055565b600080546001600160a01b0316331480610b9d57506001546001600160a01b031633145b610bb95760405162461bcd60e51b8152600401610557906111d8565b6000610bc58484610f8e565b9050600260008281526005602052604090205460ff166003811115610be657fe5b14610bf5576000915050610511565b6000908152600560205260409020805460ff1916600317905550506007805460001901905550600190565b6001600160a01b0316600090815260026020526040902060030154151590565b6000546001600160a01b0316331480610c6357506001546001600160a01b031633145b610c7f5760405162461bcd60e51b8152600401610557906111d8565b6001600160a01b0392831660009081526002602052604090206004810180546001600160a01b031916939094169290921790925560030155565b6001600160a01b031660009081526002602052604090205490565b600080546001600160a01b03838116911614806104b25750506001546001600160a01b0390811691161490565b600080610d0d83610ef8565b90506003610738565b60065490565b6000546001600160a01b0316331480610d3f57506001546001600160a01b031633145b610d5b5760405162461bcd60e51b8152600401610557906111d8565b6001600160a01b03909116600090815260026020526040902055565b600080546001600160a01b0316331480610d9b57506001546001600160a01b031633145b610db75760405162461bcd60e51b8152600401610557906111d8565b6104b2610adb83610ef8565b610dcb610fc1565b506001600160a01b03908116600090815260026020818152604092839020835160c08101855281548152600182015492810192909252918201549281019290925260038101546060830152600401549182166080820152600160a01b90910460ff16151560a082015290565b6000546001600160a01b0316331480610e5a57506001546001600160a01b031633145b610e765760405162461bcd60e51b8152600401610557906111d8565b6001600160a01b03166000908152600260208190526040909120600181557f56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421918101919091557fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4706003820155600401805460ff60a01b1916600160a01b179055565b600081604051602001610f0b9190611171565b604051602081830303815290604052805190602001209050919050565b600080826003811115610f3757fe5b60008581526005602052604090205460ff166003811115610f5457fe5b101590508061050e576000848152600560205260409020805484919060ff19166001836003811115610f8257fe5b02179055509392505050565b60008282604051602001610fa392919061118e565b60405160208183030381529060405280519060200120905092915050565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081019190915290565b80356001600160a01b03811681146104b557600080fd5b803580151581146104b557600080fd5b60006020828403121561102e578081fd5b61050e82610ff6565b60008060006060848603121561104b578182fd5b61105484610ff6565b925061106260208501610ff6565b9150604084013590509250925092565b60008060408385031215611084578182fd5b61108d83610ff6565b946020939093013593505050565b6000806000606084860312156110af578283fd5b6110b884610ff6565b95602085013595506040909401359392505050565b60008082840360e08112156110e0578283fd5b6110e984610ff6565b925060c0601f19820112156110fc578182fd5b5060405160c0810181811067ffffffffffffffff8211171561111a57fe5b80604052506020840135815260408401356020820152606084013560408201526080840135606082015261115060a08501610ff6565b608082015261116160c0850161100d565b60a0820152809150509250929050565b60609190911b6bffffffffffffffffffffffff1916815260140190565b60609290921b6bffffffffffffffffffffffff19168252601482015260340190565b6001600160a01b0391909116815260200190565b901515815260200190565b90815260200190565b60208082526036908201527f46756e6374696f6e2063616e206f6e6c792062652063616c6c65642062792061604082015275757468656e746963617465642061646472657373657360501b606082015260800190565b815181526020808301519082015260408083015190820152606080830151908201526080808301516001600160a01b03169082015260a09182015115159181019190915260c0019056fea164736f6c6343000706000aa164736f6c6343000706000a", - "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061002b5760003560e01c80639ed9331814610030575b600080fd5b6100566004803603602081101561004657600080fd5b50356001600160a01b0316610072565b604080516001600160a01b039092168252519081900360200190f35b600081604051610081906100b5565b6001600160a01b03909116815260405190819003602001906000f0801580156100ae573d6000803e3d6000fd5b5092915050565b611316806100c38339019056fe608060405234801561001057600080fd5b5060405161131638038061131683398101604081905261002f91610054565b600080546001600160a01b0319166001600160a01b0392909216919091179055610082565b600060208284031215610065578081fd5b81516001600160a01b038116811461007b578182fd5b9392505050565b611285806100916000396000f3fe608060405234801561001057600080fd5b50600436106101f05760003560e01c80638f3b96471161010f578063d126199f116100a2578063e90abb8611610071578063e90abb86146103f9578063fb37b31c1461040c578063fbcbc0f11461041f578063fcf149a21461043f576101f0565b8063d126199f146103b8578063d15d4150146103cb578063d54414c8146103de578063d7bd4a2a146103f1576101f0565b8063c3fd9b25116100de578063c3fd9b2514610377578063c7650bf21461037f578063c8e40fbf14610392578063d0a215f2146103a5576101f0565b80638f3b96471461033657806399056ba914610349578063af37b86414610351578063af3dc01114610364576101f0565b806333f94305116101875780636f3c75af116101565780636f3c75af146102f55780637c8ee703146103085780637e86faa81461031b5780638da5cb5b1461032e576101f0565b806333f94305146102b25780635c17d629146102ba5780636b18e4e8146102cd5780636c87ad20146102e0576101f0565b8063167020d2116101c3578063167020d2146102595780631aaf392f1461026c5780631b208a5a1461028c57806326dc5b121461029f576101f0565b806307a12945146101f55780630ad226791461021e57806311b1f790146102315780631381ba4d14610244575b600080fd5b61020861020336600461101d565b610452565b60405161021591906111c4565b60405180910390f35b61020861022c366004611072565b6104ba565b61020861023f36600461101d565b610517565b61025761025236600461101d565b610573565b005b61020861026736600461101d565b6105d4565b61027f61027a366004611072565b610679565b60405161021591906111cf565b61020861029a36600461101d565b610727565b61027f6102ad36600461101d565b61075e565b61025761077d565b6102576102c836600461109b565b6107c7565b6102576102db36600461101d565b61089a565b6102e8610944565b60405161021591906111b0565b610208610303366004611072565b610953565b6102e861031636600461101d565b61098c565b610208610329366004611072565b6109ad565b6102e86109c3565b6102576103443660046110cd565b6109d2565b61027f610a88565b61020861035f366004611072565b610a8e565b610208610372366004611072565b610ae2565b610257610b2f565b61020861038d366004611072565b610b79565b6102086103a036600461101d565b610c20565b6102576103b3366004611037565b610c40565b61027f6103c636600461101d565b610cb9565b6102086103d936600461101d565b610cd4565b6102086103ec36600461101d565b610d01565b61027f610d16565b610257610407366004611072565b610d1c565b61020861041a36600461101d565b610d77565b61043261042d36600461101d565b610dc3565b604051610215919061122e565b61025761044d36600461101d565b610e37565b6001600160a01b0381166000908152600260205260408120600301547fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4701480156104b257506001600160a01b038216600090815260026020526040902054155b90505b919050565b6001600160a01b038216600090815260046020908152604080832084845290915281205460ff168061050e57506001600160a01b038316600090815260026020526040902060040154600160a01b900460ff165b90505b92915050565b600080546001600160a01b031633148061053b57506001546001600160a01b031633145b6105605760405162461bcd60e51b8152600401610557906111d8565b60405180910390fd5b6104b261056c83610ef8565b6002610f28565b6000546001600160a01b031633148061059657506001546001600160a01b031633145b6105b25760405162461bcd60e51b8152600401610557906111d8565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b600080546001600160a01b03163314806105f857506001546001600160a01b031633145b6106145760405162461bcd60e51b8152600401610557906111d8565b600061061f83610ef8565b9050600260008281526005602052604090205460ff16600381111561064057fe5b1461064f5760009150506104b5565b6000908152600560205260409020805460ff19166003179055505060068054600019019055600190565b6001600160a01b038216600090815260046020908152604080832084845290915281205460ff161580156106cf57506001600160a01b038316600090815260026020526040902060040154600160a01b900460ff165b156106dc57506000610511565b506001600160a01b0391909116600090815260036020908152604080832093835292905220547ffeedfacecafebeeffeedfacecafebeeffeedfacecafebeeffeedfacecafebeef1890565b60008061073383610ef8565b905060025b60008281526005602052604090205460ff16600381111561075557fe5b10159392505050565b6001600160a01b03166000908152600260208190526040909120015490565b6000546001600160a01b03163314806107a057506001546001600160a01b031633145b6107bc5760405162461bcd60e51b8152600401610557906111d8565b600680546001019055565b6000546001600160a01b03163314806107ea57506001546001600160a01b031633145b6108065760405162461bcd60e51b8152600401610557906111d8565b6001600160a01b038316600081815260036020908152604080832086845282528083207ffeedfacecafebeeffeedfacecafebeeffeedfacecafebeeffeedfacecafebeef86189055928252600481528282208583529052205460ff16610895576001600160a01b03831660009081526004602090815260408083208584529091529020805460ff191660011790555b505050565b6000546001600160a01b03163314806108bd57506001546001600160a01b031633145b6108d95760405162461bcd60e51b8152600401610557906111d8565b6001600160a01b031660009081526002602081905260409091207f56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421918101919091557fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470600390910155565b6001546001600160a01b031681565b6000806109608484610f8e565b905060025b60008281526005602052604090205460ff16600381111561098257fe5b1015949350505050565b6001600160a01b039081166000908152600260205260409020600401541690565b6000806109ba8484610f8e565b90506003610965565b6000546001600160a01b031681565b6000546001600160a01b03163314806109f557506001546001600160a01b031633145b610a115760405162461bcd60e51b8152600401610557906111d8565b6001600160a01b039182166000908152600260208181526040928390208451815590840151600182015591830151908201556060820151600382015560808201516004909101805460a0909301516001600160a01b0319909316919093161760ff60a01b1916600160a01b91151591909102179055565b60075490565b600080546001600160a01b0316331480610ab257506001546001600160a01b031633145b610ace5760405162461bcd60e51b8152600401610557906111d8565b61050e610adb8484610f8e565b6001610f28565b600080546001600160a01b0316331480610b0657506001546001600160a01b031633145b610b225760405162461bcd60e51b8152600401610557906111d8565b61050e61056c8484610f8e565b6000546001600160a01b0316331480610b5257506001546001600160a01b031633145b610b6e5760405162461bcd60e51b8152600401610557906111d8565b600780546001019055565b600080546001600160a01b0316331480610b9d57506001546001600160a01b031633145b610bb95760405162461bcd60e51b8152600401610557906111d8565b6000610bc58484610f8e565b9050600260008281526005602052604090205460ff166003811115610be657fe5b14610bf5576000915050610511565b6000908152600560205260409020805460ff1916600317905550506007805460001901905550600190565b6001600160a01b0316600090815260026020526040902060030154151590565b6000546001600160a01b0316331480610c6357506001546001600160a01b031633145b610c7f5760405162461bcd60e51b8152600401610557906111d8565b6001600160a01b0392831660009081526002602052604090206004810180546001600160a01b031916939094169290921790925560030155565b6001600160a01b031660009081526002602052604090205490565b600080546001600160a01b03838116911614806104b25750506001546001600160a01b0390811691161490565b600080610d0d83610ef8565b90506003610738565b60065490565b6000546001600160a01b0316331480610d3f57506001546001600160a01b031633145b610d5b5760405162461bcd60e51b8152600401610557906111d8565b6001600160a01b03909116600090815260026020526040902055565b600080546001600160a01b0316331480610d9b57506001546001600160a01b031633145b610db75760405162461bcd60e51b8152600401610557906111d8565b6104b2610adb83610ef8565b610dcb610fc1565b506001600160a01b03908116600090815260026020818152604092839020835160c08101855281548152600182015492810192909252918201549281019290925260038101546060830152600401549182166080820152600160a01b90910460ff16151560a082015290565b6000546001600160a01b0316331480610e5a57506001546001600160a01b031633145b610e765760405162461bcd60e51b8152600401610557906111d8565b6001600160a01b03166000908152600260208190526040909120600181557f56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421918101919091557fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4706003820155600401805460ff60a01b1916600160a01b179055565b600081604051602001610f0b9190611171565b604051602081830303815290604052805190602001209050919050565b600080826003811115610f3757fe5b60008581526005602052604090205460ff166003811115610f5457fe5b101590508061050e576000848152600560205260409020805484919060ff19166001836003811115610f8257fe5b02179055509392505050565b60008282604051602001610fa392919061118e565b60405160208183030381529060405280519060200120905092915050565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081019190915290565b80356001600160a01b03811681146104b557600080fd5b803580151581146104b557600080fd5b60006020828403121561102e578081fd5b61050e82610ff6565b60008060006060848603121561104b578182fd5b61105484610ff6565b925061106260208501610ff6565b9150604084013590509250925092565b60008060408385031215611084578182fd5b61108d83610ff6565b946020939093013593505050565b6000806000606084860312156110af578283fd5b6110b884610ff6565b95602085013595506040909401359392505050565b60008082840360e08112156110e0578283fd5b6110e984610ff6565b925060c0601f19820112156110fc578182fd5b5060405160c0810181811067ffffffffffffffff8211171561111a57fe5b80604052506020840135815260408401356020820152606084013560408201526080840135606082015261115060a08501610ff6565b608082015261116160c0850161100d565b60a0820152809150509250929050565b60609190911b6bffffffffffffffffffffffff1916815260140190565b60609290921b6bffffffffffffffffffffffff19168252601482015260340190565b6001600160a01b0391909116815260200190565b901515815260200190565b90815260200190565b60208082526036908201527f46756e6374696f6e2063616e206f6e6c792062652063616c6c65642062792061604082015275757468656e746963617465642061646472657373657360501b606082015260800190565b815181526020808301519082015260408083015190820152606080830151908201526080808301516001600160a01b03169082015260a09182015115159181019190915260c0019056fea164736f6c6343000706000aa164736f6c6343000706000a", + "solcInputHash": "f2bdab652d5102f5f11e78dae866798d", + "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"}],\"name\":\"create\",\"outputs\":[{\"internalType\":\"contract iOVM_StateManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The State Manager Factory is called by a State Transitioner's init code, to create a new State Manager for use in the Fraud Verification process. Compiler used: solc Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"create(address)\":{\"params\":{\"_owner\":\"Owner of the created contract.\"},\"returns\":{\"_0\":\"New OVM_StateManager instance.\"}}},\"title\":\"OVM_StateManagerFactory\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"create(address)\":{\"notice\":\"Creates a new OVM_StateManager\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/OVM/execution/OVM_StateManagerFactory.sol\":\"OVM_StateManagerFactory\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/optimistic-ethereum/OVM/execution/OVM_StateManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_StateManager } from \\\"../../iOVM/execution/iOVM_StateManager.sol\\\";\\n\\n/**\\n * @title OVM_StateManager\\n * @dev The State Manager contract holds all storage values for contracts in the OVM. It can only be written to by the\\n * the Execution Manager and State Transitioner. It runs on L1 during the setup and execution of a fraud proof.\\n * The same logic runs on L2, but has been implemented as a precompile in the L2 go-ethereum client\\n * (see https://github.com/ethereum-optimism/go-ethereum/blob/master/core/vm/ovm_state_manager.go).\\n *\\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract OVM_StateManager is iOVM_StateManager {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n bytes32 constant internal EMPTY_ACCOUNT_STORAGE_ROOT = 0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421;\\n bytes32 constant internal EMPTY_ACCOUNT_CODE_HASH = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;\\n bytes32 constant internal STORAGE_XOR_VALUE = 0xFEEDFACECAFEBEEFFEEDFACECAFEBEEFFEEDFACECAFEBEEFFEEDFACECAFEBEEF;\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n address override public owner;\\n address override public ovmExecutionManager;\\n mapping (address => Lib_OVMCodec.Account) internal accounts;\\n mapping (address => mapping (bytes32 => bytes32)) internal contractStorage;\\n mapping (address => mapping (bytes32 => bool)) internal verifiedContractStorage;\\n mapping (bytes32 => ItemState) internal itemStates;\\n uint256 internal totalUncommittedAccounts;\\n uint256 internal totalUncommittedContractStorage;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _owner Address of the owner of this contract.\\n */\\n constructor(\\n address _owner\\n )\\n {\\n owner = _owner;\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n /**\\n * Simple authentication, this contract should only be accessible to the owner (which is expected to be the State Transitioner during `PRE_EXECUTION`\\n * or the OVM_ExecutionManager during transaction execution.\\n */\\n modifier authenticated() {\\n // owner is the State Transitioner\\n require(\\n msg.sender == owner || msg.sender == ovmExecutionManager,\\n \\\"Function can only be called by authenticated addresses\\\"\\n );\\n _;\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Checks whether a given address is allowed to modify this contract.\\n * @param _address Address to check.\\n * @return Whether or not the address can modify this contract.\\n */\\n function isAuthenticated(\\n address _address\\n )\\n override\\n public\\n view\\n returns (\\n bool\\n )\\n {\\n return (_address == owner || _address == ovmExecutionManager);\\n }\\n\\n /**\\n * Sets the address of the OVM_ExecutionManager.\\n * @param _ovmExecutionManager Address of the OVM_ExecutionManager.\\n */\\n function setExecutionManager(\\n address _ovmExecutionManager\\n )\\n override\\n public\\n authenticated\\n {\\n ovmExecutionManager = _ovmExecutionManager;\\n }\\n\\n /**\\n * Inserts an account into the state.\\n * @param _address Address of the account to insert.\\n * @param _account Account to insert for the given address.\\n */\\n function putAccount(\\n address _address,\\n Lib_OVMCodec.Account memory _account\\n )\\n override\\n public\\n authenticated\\n {\\n accounts[_address] = _account;\\n }\\n\\n /**\\n * Marks an account as empty.\\n * @param _address Address of the account to mark.\\n */\\n function putEmptyAccount(\\n address _address\\n )\\n override\\n public\\n authenticated\\n {\\n Lib_OVMCodec.Account storage account = accounts[_address];\\n account.storageRoot = EMPTY_ACCOUNT_STORAGE_ROOT;\\n account.codeHash = EMPTY_ACCOUNT_CODE_HASH;\\n }\\n\\n /**\\n * Retrieves an account from the state.\\n * @param _address Address of the account to retrieve.\\n * @return Account for the given address.\\n */\\n function getAccount(\\n address _address\\n )\\n override\\n public\\n view\\n returns (\\n Lib_OVMCodec.Account memory\\n )\\n {\\n return accounts[_address];\\n }\\n\\n /**\\n * Checks whether the state has a given account.\\n * @param _address Address of the account to check.\\n * @return Whether or not the state has the account.\\n */\\n function hasAccount(\\n address _address\\n )\\n override\\n public\\n view\\n returns (\\n bool\\n )\\n {\\n return accounts[_address].codeHash != bytes32(0);\\n }\\n\\n /**\\n * Checks whether the state has a given known empty account.\\n * @param _address Address of the account to check.\\n * @return Whether or not the state has the empty account.\\n */\\n function hasEmptyAccount(\\n address _address\\n )\\n override\\n public\\n view\\n returns (\\n bool\\n )\\n {\\n return (\\n accounts[_address].codeHash == EMPTY_ACCOUNT_CODE_HASH\\n && accounts[_address].nonce == 0\\n );\\n }\\n\\n /**\\n * Sets the nonce of an account.\\n * @param _address Address of the account to modify.\\n * @param _nonce New account nonce.\\n */\\n function setAccountNonce(\\n address _address,\\n uint256 _nonce\\n )\\n override\\n public\\n authenticated\\n {\\n accounts[_address].nonce = _nonce;\\n }\\n\\n /**\\n * Gets the nonce of an account.\\n * @param _address Address of the account to access.\\n * @return Nonce of the account.\\n */\\n function getAccountNonce(\\n address _address\\n )\\n override\\n public\\n view\\n returns (\\n uint256\\n )\\n {\\n return accounts[_address].nonce;\\n }\\n\\n /**\\n * Retrieves the Ethereum address of an account.\\n * @param _address Address of the account to access.\\n * @return Corresponding Ethereum address.\\n */\\n function getAccountEthAddress(\\n address _address\\n )\\n override\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return accounts[_address].ethAddress;\\n }\\n\\n /**\\n * Retrieves the storage root of an account.\\n * @param _address Address of the account to access.\\n * @return Corresponding storage root.\\n */\\n function getAccountStorageRoot(\\n address _address\\n )\\n override\\n public\\n view\\n returns (\\n bytes32\\n )\\n {\\n return accounts[_address].storageRoot;\\n }\\n\\n /**\\n * Initializes a pending account (during CREATE or CREATE2) with the default values.\\n * @param _address Address of the account to initialize.\\n */\\n function initPendingAccount(\\n address _address\\n )\\n override\\n public\\n authenticated\\n {\\n Lib_OVMCodec.Account storage account = accounts[_address];\\n account.nonce = 1;\\n account.storageRoot = EMPTY_ACCOUNT_STORAGE_ROOT;\\n account.codeHash = EMPTY_ACCOUNT_CODE_HASH;\\n account.isFresh = true;\\n }\\n\\n /**\\n * Finalizes the creation of a pending account (during CREATE or CREATE2).\\n * @param _address Address of the account to finalize.\\n * @param _ethAddress Address of the account's associated contract on Ethereum.\\n * @param _codeHash Hash of the account's code.\\n */\\n function commitPendingAccount(\\n address _address,\\n address _ethAddress,\\n bytes32 _codeHash\\n )\\n override\\n public\\n authenticated\\n {\\n Lib_OVMCodec.Account storage account = accounts[_address];\\n account.ethAddress = _ethAddress;\\n account.codeHash = _codeHash;\\n }\\n\\n /**\\n * Checks whether an account has already been retrieved, and marks it as retrieved if not.\\n * @param _address Address of the account to check.\\n * @return Whether or not the account was already loaded.\\n */\\n function testAndSetAccountLoaded(\\n address _address\\n )\\n override\\n public\\n authenticated\\n returns (\\n bool\\n )\\n {\\n return _testAndSetItemState(\\n _getItemHash(_address),\\n ItemState.ITEM_LOADED\\n );\\n }\\n\\n /**\\n * Checks whether an account has already been modified, and marks it as modified if not.\\n * @param _address Address of the account to check.\\n * @return Whether or not the account was already modified.\\n */\\n function testAndSetAccountChanged(\\n address _address\\n )\\n override\\n public\\n authenticated\\n returns (\\n bool\\n )\\n {\\n return _testAndSetItemState(\\n _getItemHash(_address),\\n ItemState.ITEM_CHANGED\\n );\\n }\\n\\n /**\\n * Attempts to mark an account as committed.\\n * @param _address Address of the account to commit.\\n * @return Whether or not the account was committed.\\n */\\n function commitAccount(\\n address _address\\n )\\n override\\n public\\n authenticated\\n returns (\\n bool\\n )\\n {\\n bytes32 item = _getItemHash(_address);\\n if (itemStates[item] != ItemState.ITEM_CHANGED) {\\n return false;\\n }\\n\\n itemStates[item] = ItemState.ITEM_COMMITTED;\\n totalUncommittedAccounts -= 1;\\n\\n return true;\\n }\\n\\n /**\\n * Increments the total number of uncommitted accounts.\\n */\\n function incrementTotalUncommittedAccounts()\\n override\\n public\\n authenticated\\n {\\n totalUncommittedAccounts += 1;\\n }\\n\\n /**\\n * Gets the total number of uncommitted accounts.\\n * @return Total uncommitted accounts.\\n */\\n function getTotalUncommittedAccounts()\\n override\\n public\\n view\\n returns (\\n uint256\\n )\\n {\\n return totalUncommittedAccounts;\\n }\\n\\n /**\\n * Checks whether a given account was changed during execution.\\n * @param _address Address to check.\\n * @return Whether or not the account was changed.\\n */\\n function wasAccountChanged(\\n address _address\\n )\\n override\\n public\\n view\\n returns (\\n bool\\n )\\n {\\n bytes32 item = _getItemHash(_address);\\n return itemStates[item] >= ItemState.ITEM_CHANGED;\\n }\\n\\n /**\\n * Checks whether a given account was committed after execution.\\n * @param _address Address to check.\\n * @return Whether or not the account was committed.\\n */\\n function wasAccountCommitted(\\n address _address\\n )\\n override\\n public\\n view\\n returns (\\n bool\\n )\\n {\\n bytes32 item = _getItemHash(_address);\\n return itemStates[item] >= ItemState.ITEM_COMMITTED;\\n }\\n\\n\\n /************************************\\n * Public Functions: Storage Access *\\n ************************************/\\n\\n /**\\n * Changes a contract storage slot value.\\n * @param _contract Address of the contract to modify.\\n * @param _key 32 byte storage slot key.\\n * @param _value 32 byte storage slot value.\\n */\\n function putContractStorage(\\n address _contract,\\n bytes32 _key,\\n bytes32 _value\\n )\\n override\\n public\\n authenticated\\n {\\n // A hilarious optimization. `SSTORE`ing a value of `bytes32(0)` is common enough that it's\\n // worth populating this with a non-zero value in advance (during the fraud proof\\n // initialization phase) to cut the execution-time cost down to 5000 gas.\\n contractStorage[_contract][_key] = _value ^ STORAGE_XOR_VALUE;\\n\\n // Only used when initially populating the contract storage. OVM_ExecutionManager will\\n // perform a `hasContractStorage` INVALID_STATE_ACCESS check before putting any contract\\n // storage because writing to zero when the actual value is nonzero causes a gas\\n // discrepancy. Could be moved into a new `putVerifiedContractStorage` function, or\\n // something along those lines.\\n if (verifiedContractStorage[_contract][_key] == false) {\\n verifiedContractStorage[_contract][_key] = true;\\n }\\n }\\n\\n /**\\n * Retrieves a contract storage slot value.\\n * @param _contract Address of the contract to access.\\n * @param _key 32 byte storage slot key.\\n * @return 32 byte storage slot value.\\n */\\n function getContractStorage(\\n address _contract,\\n bytes32 _key\\n )\\n override\\n public\\n view\\n returns (\\n bytes32\\n )\\n {\\n // Storage XOR system doesn't work for newly created contracts that haven't set this\\n // storage slot value yet.\\n if (\\n verifiedContractStorage[_contract][_key] == false\\n && accounts[_contract].isFresh\\n ) {\\n return bytes32(0);\\n }\\n\\n // See `putContractStorage` for more information about the XOR here.\\n return contractStorage[_contract][_key] ^ STORAGE_XOR_VALUE;\\n }\\n\\n /**\\n * Checks whether a contract storage slot exists in the state.\\n * @param _contract Address of the contract to access.\\n * @param _key 32 byte storage slot key.\\n * @return Whether or not the key was set in the state.\\n */\\n function hasContractStorage(\\n address _contract,\\n bytes32 _key\\n )\\n override\\n public\\n view\\n returns (\\n bool\\n )\\n {\\n return verifiedContractStorage[_contract][_key] || accounts[_contract].isFresh;\\n }\\n\\n /**\\n * Checks whether a storage slot has already been retrieved, and marks it as retrieved if not.\\n * @param _contract Address of the contract to check.\\n * @param _key 32 byte storage slot key.\\n * @return Whether or not the slot was already loaded.\\n */\\n function testAndSetContractStorageLoaded(\\n address _contract,\\n bytes32 _key\\n )\\n override\\n public\\n authenticated\\n returns (\\n bool\\n )\\n {\\n return _testAndSetItemState(\\n _getItemHash(_contract, _key),\\n ItemState.ITEM_LOADED\\n );\\n }\\n\\n /**\\n * Checks whether a storage slot has already been modified, and marks it as modified if not.\\n * @param _contract Address of the contract to check.\\n * @param _key 32 byte storage slot key.\\n * @return Whether or not the slot was already modified.\\n */\\n function testAndSetContractStorageChanged(\\n address _contract,\\n bytes32 _key\\n )\\n override\\n public\\n authenticated\\n returns (\\n bool\\n )\\n {\\n return _testAndSetItemState(\\n _getItemHash(_contract, _key),\\n ItemState.ITEM_CHANGED\\n );\\n }\\n\\n /**\\n * Attempts to mark a storage slot as committed.\\n * @param _contract Address of the account to commit.\\n * @param _key 32 byte slot key to commit.\\n * @return Whether or not the slot was committed.\\n */\\n function commitContractStorage(\\n address _contract,\\n bytes32 _key\\n )\\n override\\n public\\n authenticated\\n returns (\\n bool\\n )\\n {\\n bytes32 item = _getItemHash(_contract, _key);\\n if (itemStates[item] != ItemState.ITEM_CHANGED) {\\n return false;\\n }\\n\\n itemStates[item] = ItemState.ITEM_COMMITTED;\\n totalUncommittedContractStorage -= 1;\\n\\n return true;\\n }\\n\\n /**\\n * Increments the total number of uncommitted storage slots.\\n */\\n function incrementTotalUncommittedContractStorage()\\n override\\n public\\n authenticated\\n {\\n totalUncommittedContractStorage += 1;\\n }\\n\\n /**\\n * Gets the total number of uncommitted storage slots.\\n * @return Total uncommitted storage slots.\\n */\\n function getTotalUncommittedContractStorage()\\n override\\n public\\n view\\n returns (\\n uint256\\n )\\n {\\n return totalUncommittedContractStorage;\\n }\\n\\n /**\\n * Checks whether a given storage slot was changed during execution.\\n * @param _contract Address to check.\\n * @param _key Key of the storage slot to check.\\n * @return Whether or not the storage slot was changed.\\n */\\n function wasContractStorageChanged(\\n address _contract,\\n bytes32 _key\\n )\\n override\\n public\\n view\\n returns (\\n bool\\n )\\n {\\n bytes32 item = _getItemHash(_contract, _key);\\n return itemStates[item] >= ItemState.ITEM_CHANGED;\\n }\\n\\n /**\\n * Checks whether a given storage slot was committed after execution.\\n * @param _contract Address to check.\\n * @param _key Key of the storage slot to check.\\n * @return Whether or not the storage slot was committed.\\n */\\n function wasContractStorageCommitted(\\n address _contract,\\n bytes32 _key\\n )\\n override\\n public\\n view\\n returns (\\n bool\\n )\\n {\\n bytes32 item = _getItemHash(_contract, _key);\\n return itemStates[item] >= ItemState.ITEM_COMMITTED;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Generates a unique hash for an address.\\n * @param _address Address to generate a hash for.\\n * @return Unique hash for the given address.\\n */\\n function _getItemHash(\\n address _address\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(abi.encodePacked(_address));\\n }\\n\\n /**\\n * Generates a unique hash for an address/key pair.\\n * @param _contract Address to generate a hash for.\\n * @param _key Key to generate a hash for.\\n * @return Unique hash for the given pair.\\n */\\n function _getItemHash(\\n address _contract,\\n bytes32 _key\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(abi.encodePacked(\\n _contract,\\n _key\\n ));\\n }\\n\\n /**\\n * Checks whether an item is in a particular state (ITEM_LOADED or ITEM_CHANGED) and sets the\\n * item to the provided state if not.\\n * @param _item 32 byte item ID to check.\\n * @param _minItemState Minimum state that must be satisfied by the item.\\n * @return Whether or not the item was already in the state.\\n */\\n function _testAndSetItemState(\\n bytes32 _item,\\n ItemState _minItemState\\n )\\n internal\\n returns (\\n bool\\n )\\n {\\n bool wasItemState = itemStates[_item] >= _minItemState;\\n\\n if (wasItemState == false) {\\n itemStates[_item] = _minItemState;\\n }\\n\\n return wasItemState;\\n }\\n}\\n\",\"keccak256\":\"0x0df9654f9f958038435c2b2a2c7793b20fa16afe866a69cbed32a371aaa4c78b\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/execution/OVM_StateManagerFactory.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Interface Imports */\\nimport { iOVM_StateManager } from \\\"../../iOVM/execution/iOVM_StateManager.sol\\\";\\nimport { iOVM_StateManagerFactory } from \\\"../../iOVM/execution/iOVM_StateManagerFactory.sol\\\";\\n\\n/* Contract Imports */\\nimport { OVM_StateManager } from \\\"./OVM_StateManager.sol\\\";\\n\\n/**\\n * @title OVM_StateManagerFactory\\n * @dev The State Manager Factory is called by a State Transitioner's init code, to create a new\\n * State Manager for use in the Fraud Verification process.\\n *\\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract OVM_StateManagerFactory is iOVM_StateManagerFactory {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Creates a new OVM_StateManager\\n * @param _owner Owner of the created contract.\\n * @return New OVM_StateManager instance.\\n */\\n function create(\\n address _owner\\n )\\n override\\n public\\n returns (\\n iOVM_StateManager\\n )\\n {\\n return new OVM_StateManager(_owner);\\n }\\n}\\n\",\"keccak256\":\"0xc557f05b8a82eee7b36a389795fe4acc0803bcf5ae33e15e9cba8226e9ab49fc\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/execution/iOVM_StateManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title iOVM_StateManager\\n */\\ninterface iOVM_StateManager {\\n\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n enum ItemState {\\n ITEM_UNTOUCHED,\\n ITEM_LOADED,\\n ITEM_CHANGED,\\n ITEM_COMMITTED\\n }\\n\\n /***************************\\n * Public Functions: Misc *\\n ***************************/\\n\\n function isAuthenticated(address _address) external view returns (bool);\\n\\n /***************************\\n * Public Functions: Setup *\\n ***************************/\\n\\n function owner() external view returns (address _owner);\\n function ovmExecutionManager() external view returns (address _ovmExecutionManager);\\n function setExecutionManager(address _ovmExecutionManager) external;\\n\\n\\n /************************************\\n * Public Functions: Account Access *\\n ************************************/\\n\\n function putAccount(address _address, Lib_OVMCodec.Account memory _account) external;\\n function putEmptyAccount(address _address) external;\\n function getAccount(address _address) external view returns (Lib_OVMCodec.Account memory _account);\\n function hasAccount(address _address) external view returns (bool _exists);\\n function hasEmptyAccount(address _address) external view returns (bool _exists);\\n function setAccountNonce(address _address, uint256 _nonce) external;\\n function getAccountNonce(address _address) external view returns (uint256 _nonce);\\n function getAccountEthAddress(address _address) external view returns (address _ethAddress);\\n function getAccountStorageRoot(address _address) external view returns (bytes32 _storageRoot);\\n function initPendingAccount(address _address) external;\\n function commitPendingAccount(address _address, address _ethAddress, bytes32 _codeHash) external;\\n function testAndSetAccountLoaded(address _address) external returns (bool _wasAccountAlreadyLoaded);\\n function testAndSetAccountChanged(address _address) external returns (bool _wasAccountAlreadyChanged);\\n function commitAccount(address _address) external returns (bool _wasAccountCommitted);\\n function incrementTotalUncommittedAccounts() external;\\n function getTotalUncommittedAccounts() external view returns (uint256 _total);\\n function wasAccountChanged(address _address) external view returns (bool);\\n function wasAccountCommitted(address _address) external view returns (bool);\\n\\n\\n /************************************\\n * Public Functions: Storage Access *\\n ************************************/\\n\\n function putContractStorage(address _contract, bytes32 _key, bytes32 _value) external;\\n function getContractStorage(address _contract, bytes32 _key) external view returns (bytes32 _value);\\n function hasContractStorage(address _contract, bytes32 _key) external view returns (bool _exists);\\n function testAndSetContractStorageLoaded(address _contract, bytes32 _key) external returns (bool _wasContractStorageAlreadyLoaded);\\n function testAndSetContractStorageChanged(address _contract, bytes32 _key) external returns (bool _wasContractStorageAlreadyChanged);\\n function commitContractStorage(address _contract, bytes32 _key) external returns (bool _wasContractStorageCommitted);\\n function incrementTotalUncommittedContractStorage() external;\\n function getTotalUncommittedContractStorage() external view returns (uint256 _total);\\n function wasContractStorageChanged(address _contract, bytes32 _key) external view returns (bool);\\n function wasContractStorageCommitted(address _contract, bytes32 _key) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x7a11dbd1f61593ba34debe07e39eef59967307f7f372ba9855bee0953585d08d\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/execution/iOVM_StateManagerFactory.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Contract Imports */\\nimport { iOVM_StateManager } from \\\"./iOVM_StateManager.sol\\\";\\n\\n/**\\n * @title iOVM_StateManagerFactory\\n */\\ninterface iOVM_StateManagerFactory {\\n\\n /***************************************\\n * Public Functions: Contract Creation *\\n ***************************************/\\n\\n function create(\\n address _owner\\n )\\n external\\n returns (\\n iOVM_StateManager _ovmStateManager\\n );\\n}\\n\",\"keccak256\":\"0x27a90fc43889d0c7d1db50f37907ef7386d9b415d15a1e91a0a068cba59afd36\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/codec/Lib_OVMCodec.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../utils/Lib_Bytes32Utils.sol\\\";\\n\\n/**\\n * @title Lib_OVMCodec\\n */\\nlibrary Lib_OVMCodec {\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum QueueOrigin {\\n SEQUENCER_QUEUE,\\n L1TOL2_QUEUE\\n }\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Account {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n address ethAddress;\\n bool isFresh;\\n }\\n\\n struct EVMAccount {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n }\\n\\n struct ChainBatchHeader {\\n uint256 batchIndex;\\n bytes32 batchRoot;\\n uint256 batchSize;\\n uint256 prevTotalElements;\\n bytes extraData;\\n }\\n\\n struct ChainInclusionProof {\\n uint256 index;\\n bytes32[] siblings;\\n }\\n\\n struct Transaction {\\n uint256 timestamp;\\n uint256 blockNumber;\\n QueueOrigin l1QueueOrigin;\\n address l1TxOrigin;\\n address entrypoint;\\n uint256 gasLimit;\\n bytes data;\\n }\\n\\n struct TransactionChainElement {\\n bool isSequenced;\\n uint256 queueIndex; // QUEUED TX ONLY\\n uint256 timestamp; // SEQUENCER TX ONLY\\n uint256 blockNumber; // SEQUENCER TX ONLY\\n bytes txData; // SEQUENCER TX ONLY\\n }\\n\\n struct QueueElement {\\n bytes32 transactionHash;\\n uint40 timestamp;\\n uint40 blockNumber;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Encodes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Encoded transaction bytes.\\n */\\n function encodeTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return abi.encodePacked(\\n _transaction.timestamp,\\n _transaction.blockNumber,\\n _transaction.l1QueueOrigin,\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n );\\n }\\n\\n /**\\n * Hashes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Hashed transaction\\n */\\n function hashTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(encodeTransaction(_transaction));\\n }\\n\\n /**\\n * Converts an OVM account to an EVM account.\\n * @param _in OVM account to convert.\\n * @return Converted EVM account.\\n */\\n function toEVMAccount(\\n Account memory _in\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n return EVMAccount({\\n nonce: _in.nonce,\\n balance: _in.balance,\\n storageRoot: _in.storageRoot,\\n codeHash: _in.codeHash\\n });\\n }\\n\\n /**\\n * @notice RLP-encodes an account state struct.\\n * @param _account Account state struct.\\n * @return RLP-encoded account state.\\n */\\n function encodeEVMAccount(\\n EVMAccount memory _account\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes[] memory raw = new bytes[](4);\\n\\n // Unfortunately we can't create this array outright because\\n // Lib_RLPWriter.writeList will reject fixed-size arrays. Assigning\\n // index-by-index circumvents this issue.\\n raw[0] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.nonce)\\n )\\n );\\n raw[1] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.balance)\\n )\\n );\\n raw[2] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.storageRoot));\\n raw[3] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.codeHash));\\n\\n return Lib_RLPWriter.writeList(raw);\\n }\\n\\n /**\\n * @notice Decodes an RLP-encoded account state into a useful struct.\\n * @param _encoded RLP-encoded account state.\\n * @return Account state struct.\\n */\\n function decodeEVMAccount(\\n bytes memory _encoded\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\\n\\n return EVMAccount({\\n nonce: Lib_RLPReader.readUint256(accountState[0]),\\n balance: Lib_RLPReader.readUint256(accountState[1]),\\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\\n });\\n }\\n\\n /**\\n * Calculates a hash for a given batch header.\\n * @param _batchHeader Header to hash.\\n * @return Hash of the header.\\n */\\n function hashBatchHeader(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(\\n abi.encode(\\n _batchHeader.batchRoot,\\n _batchHeader.batchSize,\\n _batchHeader.prevTotalElements,\\n _batchHeader.extraData\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0xd85ba2066057a2677926f484b938c7c2ef33ff3853f3b71cda252f4a54f30e05\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPReader.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_RLPReader\\n * @dev Adapted from \\\"RLPReader\\\" by Hamdi Allam (hamdi.allam97@gmail.com).\\n */\\nlibrary Lib_RLPReader {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 constant internal MAX_LIST_LENGTH = 32;\\n\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum RLPItemType {\\n DATA_ITEM,\\n LIST_ITEM\\n }\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct RLPItem {\\n uint256 length;\\n uint256 ptr;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts bytes to a reference to memory position and length.\\n * @param _in Input bytes to convert.\\n * @return Output memory reference.\\n */\\n function toRLPItem(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem memory\\n )\\n {\\n uint256 ptr;\\n assembly {\\n ptr := add(_in, 32)\\n }\\n\\n return RLPItem({\\n length: _in.length,\\n ptr: ptr\\n });\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n (\\n uint256 listOffset,\\n ,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.LIST_ITEM,\\n \\\"Invalid RLP list value.\\\"\\n );\\n\\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\\n // writing to the length. Since we can't know the number of RLP items without looping over\\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\\n // simply set a reasonable maximum list length and decrease the size before we finish.\\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\\n\\n uint256 itemCount = 0;\\n uint256 offset = listOffset;\\n while (offset < _in.length) {\\n require(\\n itemCount < MAX_LIST_LENGTH,\\n \\\"Provided RLP list exceeds max list length.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n ) = _decodeLength(RLPItem({\\n length: _in.length - offset,\\n ptr: _in.ptr + offset\\n }));\\n\\n out[itemCount] = RLPItem({\\n length: itemLength + itemOffset,\\n ptr: _in.ptr + offset\\n });\\n\\n itemCount += 1;\\n offset += itemOffset + itemLength;\\n }\\n\\n // Decrease the array size to match the actual item count.\\n assembly {\\n mstore(out, itemCount)\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n return readList(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes value.\\\"\\n );\\n\\n return _copy(_in.ptr, itemOffset, itemLength);\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return readBytes(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return string(readBytes(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return readString(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n require(\\n _in.length <= 33,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr + itemOffset;\\n bytes32 out;\\n assembly {\\n out := mload(ptr)\\n\\n // Shift the bytes over to match the item size.\\n if lt(itemLength, 32) {\\n out := div(out, exp(256, sub(32, itemLength)))\\n }\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return readBytes32(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return uint256(readBytes32(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return readUint256(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n require(\\n _in.length == 1,\\n \\\"Invalid RLP boolean value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 out;\\n assembly {\\n out := byte(0, mload(ptr))\\n }\\n\\n require(\\n out == 0 || out == 1,\\n \\\"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\\\"\\n );\\n\\n return out != 0;\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return readBool(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n if (_in.length == 1) {\\n return address(0);\\n }\\n\\n require(\\n _in.length == 21,\\n \\\"Invalid RLP address value.\\\"\\n );\\n\\n return address(readUint256(_in));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return readAddress(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads the raw bytes of an RLP item.\\n * @param _in RLP item to read.\\n * @return Raw RLP bytes.\\n */\\n function readRawBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in);\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Decodes the length of an RLP item.\\n * @param _in RLP item to decode.\\n * @return Offset of the encoded data.\\n * @return Length of the encoded data.\\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\\n */\\n function _decodeLength(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n uint256,\\n uint256,\\n RLPItemType\\n )\\n {\\n require(\\n _in.length > 0,\\n \\\"RLP item cannot be null.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 prefix;\\n assembly {\\n prefix := byte(0, mload(ptr))\\n }\\n\\n if (prefix <= 0x7f) {\\n // Single byte.\\n\\n return (0, 1, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xb7) {\\n // Short string.\\n\\n uint256 strLen = prefix - 0x80;\\n\\n require(\\n _in.length > strLen,\\n \\\"Invalid RLP short string.\\\"\\n );\\n\\n return (1, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xbf) {\\n // Long string.\\n uint256 lenOfStrLen = prefix - 0xb7;\\n\\n require(\\n _in.length > lenOfStrLen,\\n \\\"Invalid RLP long string length.\\\"\\n );\\n\\n uint256 strLen;\\n assembly {\\n // Pick out the string length.\\n strLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfStrLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfStrLen + strLen,\\n \\\"Invalid RLP long string.\\\"\\n );\\n\\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xf7) {\\n // Short list.\\n uint256 listLen = prefix - 0xc0;\\n\\n require(\\n _in.length > listLen,\\n \\\"Invalid RLP short list.\\\"\\n );\\n\\n return (1, listLen, RLPItemType.LIST_ITEM);\\n } else {\\n // Long list.\\n uint256 lenOfListLen = prefix - 0xf7;\\n\\n require(\\n _in.length > lenOfListLen,\\n \\\"Invalid RLP long list length.\\\"\\n );\\n\\n uint256 listLen;\\n assembly {\\n // Pick out the list length.\\n listLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfListLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfListLen + listLen,\\n \\\"Invalid RLP long list.\\\"\\n );\\n\\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\\n }\\n }\\n\\n /**\\n * Copies the bytes from a memory location.\\n * @param _src Pointer to the location to read from.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Copied bytes.\\n */\\n function _copy(\\n uint256 _src,\\n uint256 _offset,\\n uint256 _length\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out = new bytes(_length);\\n if (out.length == 0) {\\n return out;\\n }\\n\\n uint256 src = _src + _offset;\\n uint256 dest;\\n assembly {\\n dest := add(out, 32)\\n }\\n\\n // Copy over as many complete words as we can.\\n for (uint256 i = 0; i < _length / 32; i++) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n\\n src += 32;\\n dest += 32;\\n }\\n\\n // Pick out the remaining bytes.\\n uint256 mask = 256 ** (32 - (_length % 32)) - 1;\\n assembly {\\n mstore(\\n dest,\\n or(\\n and(mload(src), not(mask)),\\n and(mload(dest), mask)\\n )\\n )\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Copies an RLP item into bytes.\\n * @param _in RLP item to copy.\\n * @return Copied bytes.\\n */\\n function _copy(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in.ptr, 0, _in.length);\\n }\\n}\\n\",\"keccak256\":\"0x829174c61216dce35fdb888383b6022e0365eb7fbdc71ad79d98b108091969fe\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPWriter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/**\\n * @title Lib_RLPWriter\\n * @author Bakaoh (with modifications)\\n */\\nlibrary Lib_RLPWriter {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * RLP encodes a byte string.\\n * @param _in The byte string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded;\\n\\n if (_in.length == 1 && uint8(_in[0]) < 128) {\\n encoded = _in;\\n } else {\\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * RLP encodes a list of RLP encoded byte byte strings.\\n * @param _in The list of RLP encoded byte strings.\\n * @return The RLP encoded list of items in bytes.\\n */\\n function writeList(\\n bytes[] memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory list = _flatten(_in);\\n return abi.encodePacked(_writeLength(list.length, 192), list);\\n }\\n\\n /**\\n * RLP encodes a string.\\n * @param _in The string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeString(\\n string memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(bytes(_in));\\n }\\n\\n /**\\n * RLP encodes an address.\\n * @param _in The address to encode.\\n * @return The RLP encoded address in bytes.\\n */\\n function writeAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a bytes32 value.\\n * @param _in The bytes32 to encode.\\n * @return _out The RLP encoded bytes32 in bytes.\\n */\\n function writeBytes32(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a uint.\\n * @param _in The uint256 to encode.\\n * @return The RLP encoded uint256 in bytes.\\n */\\n function writeUint(\\n uint256 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(_toBinary(_in));\\n }\\n\\n /**\\n * RLP encodes a bool.\\n * @param _in The bool to encode.\\n * @return The RLP encoded bool in bytes.\\n */\\n function writeBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded = new bytes(1);\\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\\n return encoded;\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\\n * @param _len The length of the string or the payload.\\n * @param _offset 128 if item is string, 192 if item is list.\\n * @return RLP encoded bytes.\\n */\\n function _writeLength(\\n uint256 _len,\\n uint256 _offset\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded;\\n\\n if (_len < 56) {\\n encoded = new bytes(1);\\n encoded[0] = byte(uint8(_len) + uint8(_offset));\\n } else {\\n uint256 lenLen;\\n uint256 i = 1;\\n while (_len / i != 0) {\\n lenLen++;\\n i *= 256;\\n }\\n\\n encoded = new bytes(lenLen + 1);\\n encoded[0] = byte(uint8(lenLen) + uint8(_offset) + 55);\\n for(i = 1; i <= lenLen; i++) {\\n encoded[i] = byte(uint8((_len / (256**(lenLen-i))) % 256));\\n }\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * Encode integer in big endian binary form with no leading zeroes.\\n * @notice TODO: This should be optimized with assembly to save gas costs.\\n * @param _x The integer to encode.\\n * @return RLP encoded bytes.\\n */\\n function _toBinary(\\n uint256 _x\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory b = abi.encodePacked(_x);\\n\\n uint256 i = 0;\\n for (; i < 32; i++) {\\n if (b[i] != 0) {\\n break;\\n }\\n }\\n\\n bytes memory res = new bytes(32 - i);\\n for (uint256 j = 0; j < res.length; j++) {\\n res[j] = b[i++];\\n }\\n\\n return res;\\n }\\n\\n /**\\n * Copies a piece of memory to another location.\\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\\n * @param _dest Destination location.\\n * @param _src Source location.\\n * @param _len Length of memory to copy.\\n */\\n function _memcpy(\\n uint256 _dest,\\n uint256 _src,\\n uint256 _len\\n )\\n private\\n pure\\n {\\n uint256 dest = _dest;\\n uint256 src = _src;\\n uint256 len = _len;\\n\\n for(; len >= 32; len -= 32) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n dest += 32;\\n src += 32;\\n }\\n\\n uint256 mask = 256 ** (32 - len) - 1;\\n assembly {\\n let srcpart := and(mload(src), not(mask))\\n let destpart := and(mload(dest), mask)\\n mstore(dest, or(destpart, srcpart))\\n }\\n }\\n\\n /**\\n * Flattens a list of byte strings into one byte string.\\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\\n * @param _list List of byte strings to flatten.\\n * @return The flattened byte string.\\n */\\n function _flatten(\\n bytes[] memory _list\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n if (_list.length == 0) {\\n return new bytes(0);\\n }\\n\\n uint256 len;\\n uint256 i = 0;\\n for (; i < _list.length; i++) {\\n len += _list[i].length;\\n }\\n\\n bytes memory flattened = new bytes(len);\\n uint256 flattenedPtr;\\n assembly { flattenedPtr := add(flattened, 0x20) }\\n\\n for(i = 0; i < _list.length; i++) {\\n bytes memory item = _list[i];\\n\\n uint256 listPtr;\\n assembly { listPtr := add(item, 0x20)}\\n\\n _memcpy(flattenedPtr, listPtr, item.length);\\n flattenedPtr += _list[i].length;\\n }\\n\\n return flattened;\\n }\\n}\\n\",\"keccak256\":\"0xb60ee4b03ad372c3deff21d454ab714dd0c18ee3e6f9d45532e209fc59d5a54d\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_Bytes32Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_Byte32Utils\\n */\\nlibrary Lib_Bytes32Utils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \\\"true.\\\"\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as a boolean.\\n */\\n function toBool(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return _in != 0;\\n }\\n\\n /**\\n * Converts a boolean to a bytes32 value.\\n * @param _in Input boolean value.\\n * @return Boolean as a bytes32.\\n */\\n function fromBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in ? 1 : 0));\\n }\\n\\n /**\\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as an address.\\n */\\n function toAddress(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return address(uint160(uint256(_in)));\\n }\\n\\n /**\\n * Converts an address to a bytes32.\\n * @param _in Input address value.\\n * @return Address as a bytes32.\\n */\\n function fromAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in));\\n }\\n\\n /**\\n * Removes the leading zeros from a bytes32 value and returns a new (smaller) bytes value.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 without any leading zeros.\\n */\\n function removeLeadingZeros(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out;\\n\\n assembly {\\n // Figure out how many leading zero bytes to remove.\\n let shift := 0\\n for { let i := 0 } and(lt(i, 32), eq(byte(i, _in), 0)) { i := add(i, 1) } {\\n shift := add(shift, 1)\\n }\\n\\n // Reserve some space for our output and fix the free memory pointer.\\n out := mload(0x40)\\n mstore(0x40, add(out, 0x40))\\n\\n // Shift the value and store it into the output bytes.\\n mstore(add(out, 0x20), shl(mul(shift, 8), _in))\\n\\n // Store the new size (with leading zero bytes removed) in the output byte size.\\n mstore(out, sub(32, shift))\\n }\\n\\n return out;\\n }\\n}\\n\",\"keccak256\":\"0xfa2def593e3fc56a31852c3744aefdaa93cec74e721bfcfeb1e5d166c7c60b64\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_BytesUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_BytesUtils\\n */\\nlibrary Lib_BytesUtils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_start + _length >= _start, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n if (_start >= _bytes.length) {\\n return bytes('');\\n }\\n\\n return slice(_bytes, _start, _bytes.length - _start);\\n }\\n\\n function toBytes32PadLeft(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n bytes32 ret;\\n uint256 len = _bytes.length <= 32 ? _bytes.length : 32;\\n assembly {\\n ret := shr(mul(sub(32, len), 8), mload(add(_bytes, 32)))\\n }\\n return ret;\\n }\\n\\n function toBytes32(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n if (_bytes.length < 32) {\\n bytes32 ret;\\n assembly {\\n ret := mload(add(_bytes, 32))\\n }\\n return ret;\\n }\\n\\n return abi.decode(_bytes,(bytes32)); // will truncate if input length > 32 bytes\\n }\\n\\n function toUint256(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return uint256(toBytes32(_bytes));\\n }\\n\\n function toUint24(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n uint24\\n )\\n {\\n require(_start + 3 >= _start, \\\"toUint24_overflow\\\");\\n require(_bytes.length >= _start + 3 , \\\"toUint24_outOfBounds\\\");\\n uint24 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x3), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toUint8(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n uint8\\n )\\n {\\n require(_start + 1 >= _start, \\\"toUint8_overflow\\\");\\n require(_bytes.length >= _start + 1 , \\\"toUint8_outOfBounds\\\");\\n uint8 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x1), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toAddress(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n require(_start + 20 >= _start, \\\"toAddress_overflow\\\");\\n require(_bytes.length >= _start + 20, \\\"toAddress_outOfBounds\\\");\\n address tempAddress;\\n\\n assembly {\\n tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000)\\n }\\n\\n return tempAddress;\\n }\\n\\n function toNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory nibbles = new bytes(_bytes.length * 2);\\n\\n for (uint256 i = 0; i < _bytes.length; i++) {\\n nibbles[i * 2] = _bytes[i] >> 4;\\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\\n }\\n\\n return nibbles;\\n }\\n\\n function fromNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory ret = new bytes(_bytes.length / 2);\\n\\n for (uint256 i = 0; i < ret.length; i++) {\\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\\n }\\n\\n return ret;\\n }\\n\\n function equal(\\n bytes memory _bytes,\\n bytes memory _other\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return keccak256(_bytes) == keccak256(_other);\\n }\\n}\\n\",\"keccak256\":\"0xd27e37973f1e0f64798725b7a0de12989dac992fba0d72970249d7e1f70e17c5\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x608060405234801561001057600080fd5b50611437806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c80639ed9331814610030575b600080fd5b6100566004803603602081101561004657600080fd5b50356001600160a01b0316610072565b604080516001600160a01b039092168252519081900360200190f35b600081604051610081906100b5565b6001600160a01b03909116815260405190819003602001906000f0801580156100ae573d6000803e3d6000fd5b5092915050565b61133f806100c38339019056fe608060405234801561001057600080fd5b5060405161133f38038061133f83398101604081905261002f91610054565b600080546001600160a01b0319166001600160a01b0392909216919091179055610082565b600060208284031215610065578081fd5b81516001600160a01b038116811461007b578182fd5b9392505050565b6112ae806100916000396000f3fe608060405234801561001057600080fd5b50600436106101f05760003560e01c80638f3b96471161010f578063d126199f116100a2578063e90abb8611610071578063e90abb86146103f9578063fb37b31c1461040c578063fbcbc0f11461041f578063fcf149a21461043f576101f0565b8063d126199f146103b8578063d15d4150146103cb578063d54414c8146103de578063d7bd4a2a146103f1576101f0565b8063c3fd9b25116100de578063c3fd9b2514610377578063c7650bf21461037f578063c8e40fbf14610392578063d0a215f2146103a5576101f0565b80638f3b96471461033657806399056ba914610349578063af37b86414610351578063af3dc01114610364576101f0565b806333f94305116101875780636f3c75af116101565780636f3c75af146102f55780637c8ee703146103085780637e86faa81461031b5780638da5cb5b1461032e576101f0565b806333f94305146102b25780635c17d629146102ba5780636b18e4e8146102cd5780636c87ad20146102e0576101f0565b8063167020d2116101c3578063167020d2146102595780631aaf392f1461026c5780631b208a5a1461028c57806326dc5b121461029f576101f0565b806307a12945146101f55780630ad226791461021e57806311b1f790146102315780631381ba4d14610244575b600080fd5b61020861020336600461101d565b610452565b60405161021591906111c4565b60405180910390f35b61020861022c366004611072565b6104ba565b61020861023f36600461101d565b610517565b61025761025236600461101d565b610573565b005b61020861026736600461101d565b6105d4565b61027f61027a366004611072565b610679565b60405161021591906111cf565b61020861029a36600461101d565b610727565b61027f6102ad36600461101d565b61075e565b61025761077d565b6102576102c836600461109b565b6107c7565b6102576102db36600461101d565b61089a565b6102e8610944565b60405161021591906111b0565b610208610303366004611072565b610953565b6102e861031636600461101d565b61098c565b610208610329366004611072565b6109ad565b6102e86109c3565b6102576103443660046110cd565b6109d2565b61027f610a88565b61020861035f366004611072565b610a8e565b610208610372366004611072565b610ae2565b610257610b2f565b61020861038d366004611072565b610b79565b6102086103a036600461101d565b610c20565b6102576103b3366004611037565b610c40565b61027f6103c636600461101d565b610cb9565b6102086103d936600461101d565b610cd4565b6102086103ec36600461101d565b610d01565b61027f610d16565b610257610407366004611072565b610d1c565b61020861041a36600461101d565b610d77565b61043261042d36600461101d565b610dc3565b604051610215919061122e565b61025761044d36600461101d565b610e37565b6001600160a01b0381166000908152600260205260408120600301547fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4701480156104b257506001600160a01b038216600090815260026020526040902054155b90505b919050565b6001600160a01b038216600090815260046020908152604080832084845290915281205460ff168061050e57506001600160a01b038316600090815260026020526040902060040154600160a01b900460ff165b90505b92915050565b600080546001600160a01b031633148061053b57506001546001600160a01b031633145b6105605760405162461bcd60e51b8152600401610557906111d8565b60405180910390fd5b6104b261056c83610ef8565b6002610f28565b6000546001600160a01b031633148061059657506001546001600160a01b031633145b6105b25760405162461bcd60e51b8152600401610557906111d8565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b600080546001600160a01b03163314806105f857506001546001600160a01b031633145b6106145760405162461bcd60e51b8152600401610557906111d8565b600061061f83610ef8565b9050600260008281526005602052604090205460ff16600381111561064057fe5b1461064f5760009150506104b5565b6000908152600560205260409020805460ff19166003179055505060068054600019019055600190565b6001600160a01b038216600090815260046020908152604080832084845290915281205460ff161580156106cf57506001600160a01b038316600090815260026020526040902060040154600160a01b900460ff165b156106dc57506000610511565b506001600160a01b0391909116600090815260036020908152604080832093835292905220547ffeedfacecafebeeffeedfacecafebeeffeedfacecafebeeffeedfacecafebeef1890565b60008061073383610ef8565b905060025b60008281526005602052604090205460ff16600381111561075557fe5b10159392505050565b6001600160a01b03166000908152600260208190526040909120015490565b6000546001600160a01b03163314806107a057506001546001600160a01b031633145b6107bc5760405162461bcd60e51b8152600401610557906111d8565b600680546001019055565b6000546001600160a01b03163314806107ea57506001546001600160a01b031633145b6108065760405162461bcd60e51b8152600401610557906111d8565b6001600160a01b038316600081815260036020908152604080832086845282528083207ffeedfacecafebeeffeedfacecafebeeffeedfacecafebeeffeedfacecafebeef86189055928252600481528282208583529052205460ff16610895576001600160a01b03831660009081526004602090815260408083208584529091529020805460ff191660011790555b505050565b6000546001600160a01b03163314806108bd57506001546001600160a01b031633145b6108d95760405162461bcd60e51b8152600401610557906111d8565b6001600160a01b031660009081526002602081905260409091207f56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421918101919091557fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470600390910155565b6001546001600160a01b031681565b6000806109608484610f8e565b905060025b60008281526005602052604090205460ff16600381111561098257fe5b1015949350505050565b6001600160a01b039081166000908152600260205260409020600401541690565b6000806109ba8484610f8e565b90506003610965565b6000546001600160a01b031681565b6000546001600160a01b03163314806109f557506001546001600160a01b031633145b610a115760405162461bcd60e51b8152600401610557906111d8565b6001600160a01b039182166000908152600260208181526040928390208451815590840151600182015591830151908201556060820151600382015560808201516004909101805460a0909301516001600160a01b0319909316919093161760ff60a01b1916600160a01b91151591909102179055565b60075490565b600080546001600160a01b0316331480610ab257506001546001600160a01b031633145b610ace5760405162461bcd60e51b8152600401610557906111d8565b61050e610adb8484610f8e565b6001610f28565b600080546001600160a01b0316331480610b0657506001546001600160a01b031633145b610b225760405162461bcd60e51b8152600401610557906111d8565b61050e61056c8484610f8e565b6000546001600160a01b0316331480610b5257506001546001600160a01b031633145b610b6e5760405162461bcd60e51b8152600401610557906111d8565b600780546001019055565b600080546001600160a01b0316331480610b9d57506001546001600160a01b031633145b610bb95760405162461bcd60e51b8152600401610557906111d8565b6000610bc58484610f8e565b9050600260008281526005602052604090205460ff166003811115610be657fe5b14610bf5576000915050610511565b6000908152600560205260409020805460ff1916600317905550506007805460001901905550600190565b6001600160a01b0316600090815260026020526040902060030154151590565b6000546001600160a01b0316331480610c6357506001546001600160a01b031633145b610c7f5760405162461bcd60e51b8152600401610557906111d8565b6001600160a01b0392831660009081526002602052604090206004810180546001600160a01b031916939094169290921790925560030155565b6001600160a01b031660009081526002602052604090205490565b600080546001600160a01b03838116911614806104b25750506001546001600160a01b0390811691161490565b600080610d0d83610ef8565b90506003610738565b60065490565b6000546001600160a01b0316331480610d3f57506001546001600160a01b031633145b610d5b5760405162461bcd60e51b8152600401610557906111d8565b6001600160a01b03909116600090815260026020526040902055565b600080546001600160a01b0316331480610d9b57506001546001600160a01b031633145b610db75760405162461bcd60e51b8152600401610557906111d8565b6104b2610adb83610ef8565b610dcb610fc1565b506001600160a01b03908116600090815260026020818152604092839020835160c08101855281548152600182015492810192909252918201549281019290925260038101546060830152600401549182166080820152600160a01b90910460ff16151560a082015290565b6000546001600160a01b0316331480610e5a57506001546001600160a01b031633145b610e765760405162461bcd60e51b8152600401610557906111d8565b6001600160a01b03166000908152600260208190526040909120600181557f56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421918101919091557fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4706003820155600401805460ff60a01b1916600160a01b179055565b600081604051602001610f0b9190611171565b604051602081830303815290604052805190602001209050919050565b600080826003811115610f3757fe5b60008581526005602052604090205460ff166003811115610f5457fe5b101590508061050e576000848152600560205260409020805484919060ff19166001836003811115610f8257fe5b02179055509392505050565b60008282604051602001610fa392919061118e565b60405160208183030381529060405280519060200120905092915050565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081019190915290565b80356001600160a01b03811681146104b557600080fd5b803580151581146104b557600080fd5b60006020828403121561102e578081fd5b61050e82610ff6565b60008060006060848603121561104b578182fd5b61105484610ff6565b925061106260208501610ff6565b9150604084013590509250925092565b60008060408385031215611084578182fd5b61108d83610ff6565b946020939093013593505050565b6000806000606084860312156110af578283fd5b6110b884610ff6565b95602085013595506040909401359392505050565b60008082840360e08112156110e0578283fd5b6110e984610ff6565b925060c0601f19820112156110fc578182fd5b5060405160c0810181811067ffffffffffffffff8211171561111a57fe5b80604052506020840135815260408401356020820152606084013560408201526080840135606082015261115060a08501610ff6565b608082015261116160c0850161100d565b60a0820152809150509250929050565b60609190911b6bffffffffffffffffffffffff1916815260140190565b60609290921b6bffffffffffffffffffffffff19168252601482015260340190565b6001600160a01b0391909116815260200190565b901515815260200190565b90815260200190565b60208082526036908201527f46756e6374696f6e2063616e206f6e6c792062652063616c6c65642062792061604082015275757468656e746963617465642061646472657373657360501b606082015260800190565b815181526020808301519082015260408083015190820152606080830151908201526080808301516001600160a01b03169082015260a09182015115159181019190915260c0019056fea2646970667358221220831108797bd578e5207b0f7717657875894fce501cf25b4109f65121461461ca64736f6c63430007060033a2646970667358221220c3b6fe114c6da51f019d7729cc2ec959a0decd1375f627f7e6327030359bac6264736f6c63430007060033", + "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061002b5760003560e01c80639ed9331814610030575b600080fd5b6100566004803603602081101561004657600080fd5b50356001600160a01b0316610072565b604080516001600160a01b039092168252519081900360200190f35b600081604051610081906100b5565b6001600160a01b03909116815260405190819003602001906000f0801580156100ae573d6000803e3d6000fd5b5092915050565b61133f806100c38339019056fe608060405234801561001057600080fd5b5060405161133f38038061133f83398101604081905261002f91610054565b600080546001600160a01b0319166001600160a01b0392909216919091179055610082565b600060208284031215610065578081fd5b81516001600160a01b038116811461007b578182fd5b9392505050565b6112ae806100916000396000f3fe608060405234801561001057600080fd5b50600436106101f05760003560e01c80638f3b96471161010f578063d126199f116100a2578063e90abb8611610071578063e90abb86146103f9578063fb37b31c1461040c578063fbcbc0f11461041f578063fcf149a21461043f576101f0565b8063d126199f146103b8578063d15d4150146103cb578063d54414c8146103de578063d7bd4a2a146103f1576101f0565b8063c3fd9b25116100de578063c3fd9b2514610377578063c7650bf21461037f578063c8e40fbf14610392578063d0a215f2146103a5576101f0565b80638f3b96471461033657806399056ba914610349578063af37b86414610351578063af3dc01114610364576101f0565b806333f94305116101875780636f3c75af116101565780636f3c75af146102f55780637c8ee703146103085780637e86faa81461031b5780638da5cb5b1461032e576101f0565b806333f94305146102b25780635c17d629146102ba5780636b18e4e8146102cd5780636c87ad20146102e0576101f0565b8063167020d2116101c3578063167020d2146102595780631aaf392f1461026c5780631b208a5a1461028c57806326dc5b121461029f576101f0565b806307a12945146101f55780630ad226791461021e57806311b1f790146102315780631381ba4d14610244575b600080fd5b61020861020336600461101d565b610452565b60405161021591906111c4565b60405180910390f35b61020861022c366004611072565b6104ba565b61020861023f36600461101d565b610517565b61025761025236600461101d565b610573565b005b61020861026736600461101d565b6105d4565b61027f61027a366004611072565b610679565b60405161021591906111cf565b61020861029a36600461101d565b610727565b61027f6102ad36600461101d565b61075e565b61025761077d565b6102576102c836600461109b565b6107c7565b6102576102db36600461101d565b61089a565b6102e8610944565b60405161021591906111b0565b610208610303366004611072565b610953565b6102e861031636600461101d565b61098c565b610208610329366004611072565b6109ad565b6102e86109c3565b6102576103443660046110cd565b6109d2565b61027f610a88565b61020861035f366004611072565b610a8e565b610208610372366004611072565b610ae2565b610257610b2f565b61020861038d366004611072565b610b79565b6102086103a036600461101d565b610c20565b6102576103b3366004611037565b610c40565b61027f6103c636600461101d565b610cb9565b6102086103d936600461101d565b610cd4565b6102086103ec36600461101d565b610d01565b61027f610d16565b610257610407366004611072565b610d1c565b61020861041a36600461101d565b610d77565b61043261042d36600461101d565b610dc3565b604051610215919061122e565b61025761044d36600461101d565b610e37565b6001600160a01b0381166000908152600260205260408120600301547fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4701480156104b257506001600160a01b038216600090815260026020526040902054155b90505b919050565b6001600160a01b038216600090815260046020908152604080832084845290915281205460ff168061050e57506001600160a01b038316600090815260026020526040902060040154600160a01b900460ff165b90505b92915050565b600080546001600160a01b031633148061053b57506001546001600160a01b031633145b6105605760405162461bcd60e51b8152600401610557906111d8565b60405180910390fd5b6104b261056c83610ef8565b6002610f28565b6000546001600160a01b031633148061059657506001546001600160a01b031633145b6105b25760405162461bcd60e51b8152600401610557906111d8565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b600080546001600160a01b03163314806105f857506001546001600160a01b031633145b6106145760405162461bcd60e51b8152600401610557906111d8565b600061061f83610ef8565b9050600260008281526005602052604090205460ff16600381111561064057fe5b1461064f5760009150506104b5565b6000908152600560205260409020805460ff19166003179055505060068054600019019055600190565b6001600160a01b038216600090815260046020908152604080832084845290915281205460ff161580156106cf57506001600160a01b038316600090815260026020526040902060040154600160a01b900460ff165b156106dc57506000610511565b506001600160a01b0391909116600090815260036020908152604080832093835292905220547ffeedfacecafebeeffeedfacecafebeeffeedfacecafebeeffeedfacecafebeef1890565b60008061073383610ef8565b905060025b60008281526005602052604090205460ff16600381111561075557fe5b10159392505050565b6001600160a01b03166000908152600260208190526040909120015490565b6000546001600160a01b03163314806107a057506001546001600160a01b031633145b6107bc5760405162461bcd60e51b8152600401610557906111d8565b600680546001019055565b6000546001600160a01b03163314806107ea57506001546001600160a01b031633145b6108065760405162461bcd60e51b8152600401610557906111d8565b6001600160a01b038316600081815260036020908152604080832086845282528083207ffeedfacecafebeeffeedfacecafebeeffeedfacecafebeeffeedfacecafebeef86189055928252600481528282208583529052205460ff16610895576001600160a01b03831660009081526004602090815260408083208584529091529020805460ff191660011790555b505050565b6000546001600160a01b03163314806108bd57506001546001600160a01b031633145b6108d95760405162461bcd60e51b8152600401610557906111d8565b6001600160a01b031660009081526002602081905260409091207f56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421918101919091557fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470600390910155565b6001546001600160a01b031681565b6000806109608484610f8e565b905060025b60008281526005602052604090205460ff16600381111561098257fe5b1015949350505050565b6001600160a01b039081166000908152600260205260409020600401541690565b6000806109ba8484610f8e565b90506003610965565b6000546001600160a01b031681565b6000546001600160a01b03163314806109f557506001546001600160a01b031633145b610a115760405162461bcd60e51b8152600401610557906111d8565b6001600160a01b039182166000908152600260208181526040928390208451815590840151600182015591830151908201556060820151600382015560808201516004909101805460a0909301516001600160a01b0319909316919093161760ff60a01b1916600160a01b91151591909102179055565b60075490565b600080546001600160a01b0316331480610ab257506001546001600160a01b031633145b610ace5760405162461bcd60e51b8152600401610557906111d8565b61050e610adb8484610f8e565b6001610f28565b600080546001600160a01b0316331480610b0657506001546001600160a01b031633145b610b225760405162461bcd60e51b8152600401610557906111d8565b61050e61056c8484610f8e565b6000546001600160a01b0316331480610b5257506001546001600160a01b031633145b610b6e5760405162461bcd60e51b8152600401610557906111d8565b600780546001019055565b600080546001600160a01b0316331480610b9d57506001546001600160a01b031633145b610bb95760405162461bcd60e51b8152600401610557906111d8565b6000610bc58484610f8e565b9050600260008281526005602052604090205460ff166003811115610be657fe5b14610bf5576000915050610511565b6000908152600560205260409020805460ff1916600317905550506007805460001901905550600190565b6001600160a01b0316600090815260026020526040902060030154151590565b6000546001600160a01b0316331480610c6357506001546001600160a01b031633145b610c7f5760405162461bcd60e51b8152600401610557906111d8565b6001600160a01b0392831660009081526002602052604090206004810180546001600160a01b031916939094169290921790925560030155565b6001600160a01b031660009081526002602052604090205490565b600080546001600160a01b03838116911614806104b25750506001546001600160a01b0390811691161490565b600080610d0d83610ef8565b90506003610738565b60065490565b6000546001600160a01b0316331480610d3f57506001546001600160a01b031633145b610d5b5760405162461bcd60e51b8152600401610557906111d8565b6001600160a01b03909116600090815260026020526040902055565b600080546001600160a01b0316331480610d9b57506001546001600160a01b031633145b610db75760405162461bcd60e51b8152600401610557906111d8565b6104b2610adb83610ef8565b610dcb610fc1565b506001600160a01b03908116600090815260026020818152604092839020835160c08101855281548152600182015492810192909252918201549281019290925260038101546060830152600401549182166080820152600160a01b90910460ff16151560a082015290565b6000546001600160a01b0316331480610e5a57506001546001600160a01b031633145b610e765760405162461bcd60e51b8152600401610557906111d8565b6001600160a01b03166000908152600260208190526040909120600181557f56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421918101919091557fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4706003820155600401805460ff60a01b1916600160a01b179055565b600081604051602001610f0b9190611171565b604051602081830303815290604052805190602001209050919050565b600080826003811115610f3757fe5b60008581526005602052604090205460ff166003811115610f5457fe5b101590508061050e576000848152600560205260409020805484919060ff19166001836003811115610f8257fe5b02179055509392505050565b60008282604051602001610fa392919061118e565b60405160208183030381529060405280519060200120905092915050565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081019190915290565b80356001600160a01b03811681146104b557600080fd5b803580151581146104b557600080fd5b60006020828403121561102e578081fd5b61050e82610ff6565b60008060006060848603121561104b578182fd5b61105484610ff6565b925061106260208501610ff6565b9150604084013590509250925092565b60008060408385031215611084578182fd5b61108d83610ff6565b946020939093013593505050565b6000806000606084860312156110af578283fd5b6110b884610ff6565b95602085013595506040909401359392505050565b60008082840360e08112156110e0578283fd5b6110e984610ff6565b925060c0601f19820112156110fc578182fd5b5060405160c0810181811067ffffffffffffffff8211171561111a57fe5b80604052506020840135815260408401356020820152606084013560408201526080840135606082015261115060a08501610ff6565b608082015261116160c0850161100d565b60a0820152809150509250929050565b60609190911b6bffffffffffffffffffffffff1916815260140190565b60609290921b6bffffffffffffffffffffffff19168252601482015260340190565b6001600160a01b0391909116815260200190565b901515815260200190565b90815260200190565b60208082526036908201527f46756e6374696f6e2063616e206f6e6c792062652063616c6c65642062792061604082015275757468656e746963617465642061646472657373657360501b606082015260800190565b815181526020808301519082015260408083015190820152606080830151908201526080808301516001600160a01b03169082015260a09182015115159181019190915260c0019056fea2646970667358221220831108797bd578e5207b0f7717657875894fce501cf25b4109f65121461461ca64736f6c63430007060033a2646970667358221220c3b6fe114c6da51f019d7729cc2ec959a0decd1375f627f7e6327030359bac6264736f6c63430007060033", "devdoc": { - "details": "The State Manager Factory is called by a State Transitioner's init code, to create a new State Manager for use in the Fraud Verification process. Compiler used: solc Runtime target: EVM", + "details": "The State Manager Factory is called by a State Transitioner's init code, to create a new State Manager for use in the Fraud Verification process. Compiler used: solc Runtime target: EVM", "kind": "dev", "methods": { "create(address)": { diff --git a/packages/contracts/deployments/mainnet/OVM_StateTransitionerFactory.json b/packages/contracts/deployments/mainnet/OVM_StateTransitionerFactory.json index 53071d1c20954..fac598a9a3c5e 100644 --- a/packages/contracts/deployments/mainnet/OVM_StateTransitionerFactory.json +++ b/packages/contracts/deployments/mainnet/OVM_StateTransitionerFactory.json @@ -1,5 +1,5 @@ { - "address": "0x8FA5bfeeb7786D2a241527E8aE8cA1d7511A0E10", + "address": "0xAe4ef5e45C42dA513d2B48E184B64A05c18d8154", "abi": [ { "inputs": [ @@ -71,7 +71,7 @@ "outputs": [ { "internalType": "address", - "name": "_contract", + "name": "", "type": "address" } ], @@ -79,31 +79,31 @@ "type": "function" } ], - "transactionHash": "0x32ce9e24c4f58a400a65acf1f0e955e7e262d307ffb52351da24e87fc29ebb1f", + "transactionHash": "0x48ded21f964908ff5fd32f2b5b6dd820218680d145577e87789ee6c4f4823e92", "receipt": { "to": null, - "from": "0x77C4c8f491e5ff22a2C0E18b005c3BA0Fe36c1Bc", - "contractAddress": "0x8FA5bfeeb7786D2a241527E8aE8cA1d7511A0E10", - "transactionIndex": 21, - "gasUsed": "4076323", + "from": "0xd033f09cB85621F98F7A84C64dB381ac16Eff818", + "contractAddress": "0xAe4ef5e45C42dA513d2B48E184B64A05c18d8154", + "transactionIndex": 101, + "gasUsed": "4209012", "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0xa16968075d2b47e35c15ac484379215070782ae9f3198140a373c08128fe8c8f", - "transactionHash": "0x32ce9e24c4f58a400a65acf1f0e955e7e262d307ffb52351da24e87fc29ebb1f", + "blockHash": "0xbc5cd27fe7a430f5560b1eded2d0f4aaf6f7098bd3a96fd809546ed514b71c4f", + "transactionHash": "0x48ded21f964908ff5fd32f2b5b6dd820218680d145577e87789ee6c4f4823e92", "logs": [], - "blockNumber": 12207895, - "cumulativeGasUsed": "6184557", + "blockNumber": 12410849, + "cumulativeGasUsed": "8881804", "status": 1, "byzantium": true }, "args": [ - "0xd3EeD86464Ff13B4BFD81a3bB1e753b7ceBA3A39" + "0x668E5b997b9aE88a56cd40409119d4Db9e6d752E" ], - "solcInputHash": "43ee6bb8ef92595aa6d0e22a6c464dff", - "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_stateTransitionIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"_preStateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"_transactionHash\",\"type\":\"bytes32\"}],\"name\":\"create\",\"outputs\":[{\"internalType\":\"contract iOVM_StateTransitioner\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"_contract\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The State Transitioner Factory is used by the Fraud Verifier to create a new State Transitioner during the initialization of a fraud proof. Compiler used: solc Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"create(address,uint256,bytes32,bytes32)\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\",\"_preStateRoot\":\"State root before the transition was executed.\",\"_stateTransitionIndex\":\"Index of the state transition being verified.\",\"_transactionHash\":\"Hash of the executed transaction.\"},\"returns\":{\"_0\":\"New OVM_StateTransitioner instance.\"}}},\"title\":\"OVM_StateTransitionerFactory\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"create(address,uint256,bytes32,bytes32)\":{\"notice\":\"Creates a new OVM_StateTransitioner\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/OVM/verification/OVM_StateTransitionerFactory.sol\":\"OVM_StateTransitionerFactory\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/optimistic-ethereum/OVM/verification/Abs_FraudContributor.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\nimport { iOVM_BondManager } from \\\"../../iOVM/verification/iOVM_BondManager.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/// Minimal contract to be inherited by contracts consumed by users that provide\\n/// data for fraud proofs\\nabstract contract Abs_FraudContributor is Lib_AddressResolver {\\n /// Decorate your functions with this modifier to store how much total gas was\\n /// consumed by the sender, to reward users fairly\\n modifier contributesToFraudProof(bytes32 preStateRoot, bytes32 txHash) {\\n uint256 startGas = gasleft();\\n _;\\n uint256 gasSpent = startGas - gasleft();\\n iOVM_BondManager(resolve('OVM_BondManager')).recordGasSpent(preStateRoot, txHash, msg.sender, gasSpent);\\n }\\n}\\n\",\"keccak256\":\"0x6c27d089a297103cb93b30f7649ab68691cc6b948c315f1037e5de1fe9bf5903\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/verification/OVM_StateTransitioner.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// @unsupported: ovm\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\nimport { Lib_EthUtils } from \\\"../../libraries/utils/Lib_EthUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../../libraries/utils/Lib_Bytes32Utils.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../../libraries/utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_SecureMerkleTrie } from \\\"../../libraries/trie/Lib_SecureMerkleTrie.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../../libraries/rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_RLPReader } from \\\"../../libraries/rlp/Lib_RLPReader.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_StateTransitioner } from \\\"../../iOVM/verification/iOVM_StateTransitioner.sol\\\";\\nimport { iOVM_BondManager } from \\\"../../iOVM/verification/iOVM_BondManager.sol\\\";\\nimport { iOVM_ExecutionManager } from \\\"../../iOVM/execution/iOVM_ExecutionManager.sol\\\";\\nimport { iOVM_StateManager } from \\\"../../iOVM/execution/iOVM_StateManager.sol\\\";\\nimport { iOVM_StateManagerFactory } from \\\"../../iOVM/execution/iOVM_StateManagerFactory.sol\\\";\\n\\n/* Contract Imports */\\nimport { Abs_FraudContributor } from \\\"./Abs_FraudContributor.sol\\\";\\n\\n/**\\n * @title OVM_StateTransitioner\\n * @dev The State Transitioner coordinates the execution of a state transition during the evaluation of a\\n * fraud proof. It feeds verified input to the Execution Manager's run(), and controls a State Manager (which is\\n * uniquely created for each fraud proof).\\n * Once a fraud proof has been initialized, this contract is provided with the pre-state root and verifies\\n * that the OVM storage slots committed to the State Mangager are contained in that state\\n * This contract controls the State Manager and Execution Manager, and uses them to calculate the\\n * post-state root by applying the transaction. The Fraud Verifier can then check for fraud by comparing\\n * the calculated post-state root with the proposed post-state root.\\n *\\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract OVM_StateTransitioner is Lib_AddressResolver, Abs_FraudContributor, iOVM_StateTransitioner {\\n\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n enum TransitionPhase {\\n PRE_EXECUTION,\\n POST_EXECUTION,\\n COMPLETE\\n }\\n\\n\\n /*******************************************\\n * Contract Variables: Contract References *\\n *******************************************/\\n\\n iOVM_StateManager public ovmStateManager;\\n\\n\\n /*******************************************\\n * Contract Variables: Internal Accounting *\\n *******************************************/\\n\\n bytes32 internal preStateRoot;\\n bytes32 internal postStateRoot;\\n TransitionPhase public phase;\\n uint256 internal stateTransitionIndex;\\n bytes32 internal transactionHash;\\n\\n\\n /*************\\n * Constants *\\n *************/\\n\\n bytes32 internal constant EMPTY_ACCOUNT_CODE_HASH = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;\\n bytes32 internal constant EMPTY_ACCOUNT_STORAGE_ROOT = 0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n * @param _stateTransitionIndex Index of the state transition being verified.\\n * @param _preStateRoot State root before the transition was executed.\\n * @param _transactionHash Hash of the executed transaction.\\n */\\n constructor(\\n address _libAddressManager,\\n uint256 _stateTransitionIndex,\\n bytes32 _preStateRoot,\\n bytes32 _transactionHash\\n )\\n Lib_AddressResolver(_libAddressManager)\\n {\\n stateTransitionIndex = _stateTransitionIndex;\\n preStateRoot = _preStateRoot;\\n postStateRoot = _preStateRoot;\\n transactionHash = _transactionHash;\\n\\n ovmStateManager = iOVM_StateManagerFactory(resolve(\\\"OVM_StateManagerFactory\\\")).create(address(this));\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n /**\\n * Checks that a function is only run during a specific phase.\\n * @param _phase Phase the function must run within.\\n */\\n modifier onlyDuringPhase(\\n TransitionPhase _phase\\n ) {\\n require(\\n phase == _phase,\\n \\\"Function must be called during the correct phase.\\\"\\n );\\n _;\\n }\\n\\n\\n /**********************************\\n * Public Functions: State Access *\\n **********************************/\\n\\n /**\\n * Retrieves the state root before execution.\\n * @return _preStateRoot State root before execution.\\n */\\n function getPreStateRoot()\\n override\\n public\\n view\\n returns (\\n bytes32 _preStateRoot\\n )\\n {\\n return preStateRoot;\\n }\\n\\n /**\\n * Retrieves the state root after execution.\\n * @return _postStateRoot State root after execution.\\n */\\n function getPostStateRoot()\\n override\\n public\\n view\\n returns (\\n bytes32 _postStateRoot\\n )\\n {\\n return postStateRoot;\\n }\\n\\n /**\\n * Checks whether the transitioner is complete.\\n * @return _complete Whether or not the transition process is finished.\\n */\\n function isComplete()\\n override\\n public\\n view\\n returns (\\n bool _complete\\n )\\n {\\n return phase == TransitionPhase.COMPLETE;\\n }\\n\\n\\n /***********************************\\n * Public Functions: Pre-Execution *\\n ***********************************/\\n\\n /**\\n * Allows a user to prove the initial state of a contract.\\n * @param _ovmContractAddress Address of the contract on the OVM.\\n * @param _ethContractAddress Address of the corresponding contract on L1.\\n * @param _stateTrieWitness Proof of the account state.\\n */\\n function proveContractState(\\n address _ovmContractAddress,\\n address _ethContractAddress,\\n bytes memory _stateTrieWitness\\n )\\n override\\n public\\n onlyDuringPhase(TransitionPhase.PRE_EXECUTION)\\n contributesToFraudProof(preStateRoot, transactionHash)\\n {\\n // Exit quickly to avoid unnecessary work.\\n require(\\n (\\n ovmStateManager.hasAccount(_ovmContractAddress) == false\\n && ovmStateManager.hasEmptyAccount(_ovmContractAddress) == false\\n ),\\n \\\"Account state has already been proven.\\\"\\n );\\n\\n // Function will fail if the proof is not a valid inclusion or exclusion proof.\\n (\\n bool exists,\\n bytes memory encodedAccount\\n ) = Lib_SecureMerkleTrie.get(\\n abi.encodePacked(_ovmContractAddress),\\n _stateTrieWitness,\\n preStateRoot\\n );\\n\\n if (exists == true) {\\n // Account exists, this was an inclusion proof.\\n Lib_OVMCodec.EVMAccount memory account = Lib_OVMCodec.decodeEVMAccount(\\n encodedAccount\\n );\\n\\n address ethContractAddress = _ethContractAddress;\\n if (account.codeHash == EMPTY_ACCOUNT_CODE_HASH) {\\n // Use a known empty contract to prevent an attack in which a user provides a\\n // contract address here and then later deploys code to it.\\n ethContractAddress = 0x0000000000000000000000000000000000000000;\\n } else {\\n // Otherwise, make sure that the code at the provided eth address matches the hash\\n // of the code stored on L2.\\n require(\\n Lib_EthUtils.getCodeHash(ethContractAddress) == account.codeHash,\\n \\\"OVM_StateTransitioner: Provided L1 contract code hash does not match L2 contract code hash.\\\"\\n );\\n }\\n\\n ovmStateManager.putAccount(\\n _ovmContractAddress,\\n Lib_OVMCodec.Account({\\n nonce: account.nonce,\\n balance: account.balance,\\n storageRoot: account.storageRoot,\\n codeHash: account.codeHash,\\n ethAddress: ethContractAddress,\\n isFresh: false\\n })\\n );\\n } else {\\n // Account does not exist, this was an exclusion proof.\\n ovmStateManager.putEmptyAccount(_ovmContractAddress);\\n }\\n }\\n\\n /**\\n * Allows a user to prove the initial state of a contract storage slot.\\n * @param _ovmContractAddress Address of the contract on the OVM.\\n * @param _key Claimed account slot key.\\n * @param _storageTrieWitness Proof of the storage slot.\\n */\\n function proveStorageSlot(\\n address _ovmContractAddress,\\n bytes32 _key,\\n bytes memory _storageTrieWitness\\n )\\n override\\n public\\n onlyDuringPhase(TransitionPhase.PRE_EXECUTION)\\n contributesToFraudProof(preStateRoot, transactionHash)\\n {\\n // Exit quickly to avoid unnecessary work.\\n require(\\n ovmStateManager.hasContractStorage(_ovmContractAddress, _key) == false,\\n \\\"Storage slot has already been proven.\\\"\\n );\\n\\n require(\\n ovmStateManager.hasAccount(_ovmContractAddress) == true,\\n \\\"Contract must be verified before proving a storage slot.\\\"\\n );\\n\\n bytes32 storageRoot = ovmStateManager.getAccountStorageRoot(_ovmContractAddress);\\n bytes32 value;\\n\\n if (storageRoot == EMPTY_ACCOUNT_STORAGE_ROOT) {\\n // Storage trie was empty, so the user is always allowed to insert zero-byte values.\\n value = bytes32(0);\\n } else {\\n // Function will fail if the proof is not a valid inclusion or exclusion proof.\\n (\\n bool exists,\\n bytes memory encodedValue\\n ) = Lib_SecureMerkleTrie.get(\\n abi.encodePacked(_key),\\n _storageTrieWitness,\\n storageRoot\\n );\\n\\n if (exists == true) {\\n // Inclusion proof.\\n // Stored values are RLP encoded, with leading zeros removed.\\n value = Lib_BytesUtils.toBytes32PadLeft(\\n Lib_RLPReader.readBytes(encodedValue)\\n );\\n } else {\\n // Exclusion proof, can only be zero bytes.\\n value = bytes32(0);\\n }\\n }\\n\\n ovmStateManager.putContractStorage(\\n _ovmContractAddress,\\n _key,\\n value\\n );\\n }\\n\\n\\n /*******************************\\n * Public Functions: Execution *\\n *******************************/\\n\\n /**\\n * Executes the state transition.\\n * @param _transaction OVM transaction to execute.\\n */\\n function applyTransaction(\\n Lib_OVMCodec.Transaction memory _transaction\\n )\\n override\\n public\\n onlyDuringPhase(TransitionPhase.PRE_EXECUTION)\\n contributesToFraudProof(preStateRoot, transactionHash)\\n {\\n require(\\n Lib_OVMCodec.hashTransaction(_transaction) == transactionHash,\\n \\\"Invalid transaction provided.\\\"\\n );\\n\\n // We require gas to complete the logic here in run() before/after execution,\\n // But must ensure the full _tx.gasLimit can be given to the ovmCALL (determinism)\\n // This includes 1/64 of the gas getting lost because of EIP-150 (lost twice--first\\n // going into EM, then going into the code contract).\\n require(\\n gasleft() >= 100000 + _transaction.gasLimit * 1032 / 1000, // 1032/1000 = 1.032 = (64/63)^2 rounded up\\n \\\"Not enough gas to execute transaction deterministically.\\\"\\n );\\n\\n iOVM_ExecutionManager ovmExecutionManager = iOVM_ExecutionManager(resolve(\\\"OVM_ExecutionManager\\\"));\\n\\n // We call `setExecutionManager` right before `run` (and not earlier) just in case the\\n // OVM_ExecutionManager address was updated between the time when this contract was created\\n // and when `applyTransaction` was called.\\n ovmStateManager.setExecutionManager(address(ovmExecutionManager));\\n\\n // `run` always succeeds *unless* the user hasn't provided enough gas to `applyTransaction`\\n // or an INVALID_STATE_ACCESS flag was triggered. Either way, we won't get beyond this line\\n // if that's the case.\\n ovmExecutionManager.run(_transaction, address(ovmStateManager));\\n\\n // Prevent the Execution Manager from calling this SM again.\\n ovmStateManager.setExecutionManager(address(0));\\n phase = TransitionPhase.POST_EXECUTION;\\n }\\n\\n\\n /************************************\\n * Public Functions: Post-Execution *\\n ************************************/\\n\\n /**\\n * Allows a user to commit the final state of a contract.\\n * @param _ovmContractAddress Address of the contract on the OVM.\\n * @param _stateTrieWitness Proof of the account state.\\n */\\n function commitContractState(\\n address _ovmContractAddress,\\n bytes memory _stateTrieWitness\\n )\\n override\\n public\\n onlyDuringPhase(TransitionPhase.POST_EXECUTION)\\n contributesToFraudProof(preStateRoot, transactionHash)\\n {\\n require(\\n ovmStateManager.getTotalUncommittedContractStorage() == 0,\\n \\\"All storage must be committed before committing account states.\\\"\\n );\\n\\n require (\\n ovmStateManager.commitAccount(_ovmContractAddress) == true,\\n \\\"Account state wasn't changed or has already been committed.\\\"\\n );\\n\\n Lib_OVMCodec.Account memory account = ovmStateManager.getAccount(_ovmContractAddress);\\n\\n postStateRoot = Lib_SecureMerkleTrie.update(\\n abi.encodePacked(_ovmContractAddress),\\n Lib_OVMCodec.encodeEVMAccount(\\n Lib_OVMCodec.toEVMAccount(account)\\n ),\\n _stateTrieWitness,\\n postStateRoot\\n );\\n\\n // Emit an event to help clients figure out the proof ordering.\\n emit AccountCommitted(\\n _ovmContractAddress\\n );\\n }\\n\\n /**\\n * Allows a user to commit the final state of a contract storage slot.\\n * @param _ovmContractAddress Address of the contract on the OVM.\\n * @param _key Claimed account slot key.\\n * @param _storageTrieWitness Proof of the storage slot.\\n */\\n function commitStorageSlot(\\n address _ovmContractAddress,\\n bytes32 _key,\\n bytes memory _storageTrieWitness\\n )\\n override\\n public\\n onlyDuringPhase(TransitionPhase.POST_EXECUTION)\\n contributesToFraudProof(preStateRoot, transactionHash)\\n {\\n require(\\n ovmStateManager.commitContractStorage(_ovmContractAddress, _key) == true,\\n \\\"Storage slot value wasn't changed or has already been committed.\\\"\\n );\\n\\n Lib_OVMCodec.Account memory account = ovmStateManager.getAccount(_ovmContractAddress);\\n bytes32 value = ovmStateManager.getContractStorage(_ovmContractAddress, _key);\\n\\n account.storageRoot = Lib_SecureMerkleTrie.update(\\n abi.encodePacked(_key),\\n Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(value)\\n ),\\n _storageTrieWitness,\\n account.storageRoot\\n );\\n\\n ovmStateManager.putAccount(_ovmContractAddress, account);\\n\\n // Emit an event to help clients figure out the proof ordering.\\n emit ContractStorageCommitted(\\n _ovmContractAddress,\\n _key\\n );\\n }\\n\\n\\n /**********************************\\n * Public Functions: Finalization *\\n **********************************/\\n\\n /**\\n * Finalizes the transition process.\\n */\\n function completeTransition()\\n override\\n public\\n onlyDuringPhase(TransitionPhase.POST_EXECUTION)\\n {\\n require(\\n ovmStateManager.getTotalUncommittedAccounts() == 0,\\n \\\"All accounts must be committed before completing a transition.\\\"\\n );\\n\\n require(\\n ovmStateManager.getTotalUncommittedContractStorage() == 0,\\n \\\"All storage must be committed before completing a transition.\\\"\\n );\\n\\n phase = TransitionPhase.COMPLETE;\\n }\\n}\\n\",\"keccak256\":\"0xc363807221625338a396c52a4bc3b7439e63972ac87521670c47745641e91fa6\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/verification/OVM_StateTransitionerFactory.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// @unsupported: ovm\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_StateTransitioner } from \\\"../../iOVM/verification/iOVM_StateTransitioner.sol\\\";\\nimport { iOVM_StateTransitionerFactory } from \\\"../../iOVM/verification/iOVM_StateTransitionerFactory.sol\\\";\\nimport { iOVM_FraudVerifier } from \\\"../../iOVM/verification/iOVM_FraudVerifier.sol\\\";\\n\\n/* Contract Imports */\\nimport { OVM_StateTransitioner } from \\\"./OVM_StateTransitioner.sol\\\";\\n\\n/**\\n * @title OVM_StateTransitionerFactory\\n * @dev The State Transitioner Factory is used by the Fraud Verifier to create a new State \\n * Transitioner during the initialization of a fraud proof.\\n * \\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract OVM_StateTransitionerFactory is iOVM_StateTransitionerFactory, Lib_AddressResolver {\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n constructor(\\n address _libAddressManager\\n )\\n Lib_AddressResolver(_libAddressManager)\\n {}\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Creates a new OVM_StateTransitioner\\n * @param _libAddressManager Address of the Address Manager.\\n * @param _stateTransitionIndex Index of the state transition being verified.\\n * @param _preStateRoot State root before the transition was executed.\\n * @param _transactionHash Hash of the executed transaction.\\n * @return New OVM_StateTransitioner instance.\\n */\\n function create(\\n address _libAddressManager,\\n uint256 _stateTransitionIndex,\\n bytes32 _preStateRoot,\\n bytes32 _transactionHash\\n )\\n override\\n public\\n returns (\\n iOVM_StateTransitioner\\n )\\n {\\n require(\\n msg.sender == resolve(\\\"OVM_FraudVerifier\\\"),\\n \\\"Create can only be done by the OVM_FraudVerifier.\\\"\\n );\\n\\n return new OVM_StateTransitioner(\\n _libAddressManager,\\n _stateTransitionIndex,\\n _preStateRoot,\\n _transactionHash\\n );\\n }\\n}\\n\",\"keccak256\":\"0xf9e4c100a38655d5198f13ae918b460244394f1cda29cddbd46b11b25aaafba5\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/execution/iOVM_ExecutionManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\ninterface iOVM_ExecutionManager {\\n /**********\\n * Enums *\\n *********/\\n\\n enum RevertFlag {\\n OUT_OF_GAS,\\n INTENTIONAL_REVERT,\\n EXCEEDS_NUISANCE_GAS,\\n INVALID_STATE_ACCESS,\\n UNSAFE_BYTECODE,\\n CREATE_COLLISION,\\n STATIC_VIOLATION,\\n CREATOR_NOT_ALLOWED\\n }\\n\\n enum GasMetadataKey {\\n CURRENT_EPOCH_START_TIMESTAMP,\\n CUMULATIVE_SEQUENCER_QUEUE_GAS,\\n CUMULATIVE_L1TOL2_QUEUE_GAS,\\n PREV_EPOCH_SEQUENCER_QUEUE_GAS,\\n PREV_EPOCH_L1TOL2_QUEUE_GAS\\n }\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct GasMeterConfig {\\n uint256 minTransactionGasLimit;\\n uint256 maxTransactionGasLimit;\\n uint256 maxGasPerQueuePerEpoch;\\n uint256 secondsPerEpoch;\\n }\\n\\n struct GlobalContext {\\n uint256 ovmCHAINID;\\n }\\n\\n struct TransactionContext {\\n Lib_OVMCodec.QueueOrigin ovmL1QUEUEORIGIN;\\n uint256 ovmTIMESTAMP;\\n uint256 ovmNUMBER;\\n uint256 ovmGASLIMIT;\\n uint256 ovmTXGASLIMIT;\\n address ovmL1TXORIGIN;\\n }\\n\\n struct TransactionRecord {\\n uint256 ovmGasRefund;\\n }\\n\\n struct MessageContext {\\n address ovmCALLER;\\n address ovmADDRESS;\\n bool isStatic;\\n }\\n\\n struct MessageRecord {\\n uint256 nuisanceGasLeft;\\n }\\n\\n\\n /************************************\\n * Transaction Execution Entrypoint *\\n ************************************/\\n\\n function run(\\n Lib_OVMCodec.Transaction calldata _transaction,\\n address _txStateManager\\n ) external;\\n\\n\\n /*******************\\n * Context Opcodes *\\n *******************/\\n\\n function ovmCALLER() external view returns (address _caller);\\n function ovmADDRESS() external view returns (address _address);\\n function ovmTIMESTAMP() external view returns (uint256 _timestamp);\\n function ovmNUMBER() external view returns (uint256 _number);\\n function ovmGASLIMIT() external view returns (uint256 _gasLimit);\\n function ovmCHAINID() external view returns (uint256 _chainId);\\n\\n\\n /**********************\\n * L2 Context Opcodes *\\n **********************/\\n\\n function ovmL1QUEUEORIGIN() external view returns (Lib_OVMCodec.QueueOrigin _queueOrigin);\\n function ovmL1TXORIGIN() external view returns (address _l1TxOrigin);\\n\\n\\n /*******************\\n * Halting Opcodes *\\n *******************/\\n\\n function ovmREVERT(bytes memory _data) external;\\n\\n\\n /*****************************\\n * Contract Creation Opcodes *\\n *****************************/\\n\\n function ovmCREATE(bytes memory _bytecode) external returns (address _contract, bytes memory _revertdata);\\n function ovmCREATE2(bytes memory _bytecode, bytes32 _salt) external returns (address _contract, bytes memory _revertdata);\\n\\n\\n /*******************************\\n * Account Abstraction Opcodes *\\n ******************************/\\n\\n function ovmGETNONCE() external returns (uint256 _nonce);\\n function ovmINCREMENTNONCE() external;\\n function ovmCREATEEOA(bytes32 _messageHash, uint8 _v, bytes32 _r, bytes32 _s) external;\\n\\n\\n /****************************\\n * Contract Calling Opcodes *\\n ****************************/\\n\\n function ovmCALL(uint256 _gasLimit, address _address, bytes memory _calldata) external returns (bool _success, bytes memory _returndata);\\n function ovmSTATICCALL(uint256 _gasLimit, address _address, bytes memory _calldata) external returns (bool _success, bytes memory _returndata);\\n function ovmDELEGATECALL(uint256 _gasLimit, address _address, bytes memory _calldata) external returns (bool _success, bytes memory _returndata);\\n\\n\\n /****************************\\n * Contract Storage Opcodes *\\n ****************************/\\n\\n function ovmSLOAD(bytes32 _key) external returns (bytes32 _value);\\n function ovmSSTORE(bytes32 _key, bytes32 _value) external;\\n\\n\\n /*************************\\n * Contract Code Opcodes *\\n *************************/\\n\\n function ovmEXTCODECOPY(address _contract, uint256 _offset, uint256 _length) external returns (bytes memory _code);\\n function ovmEXTCODESIZE(address _contract) external returns (uint256 _size);\\n function ovmEXTCODEHASH(address _contract) external returns (bytes32 _hash);\\n\\n\\n /***************************************\\n * Public Functions: Execution Context *\\n ***************************************/\\n\\n function getMaxTransactionGasLimit() external view returns (uint _maxTransactionGasLimit);\\n}\\n\",\"keccak256\":\"0xa613e2f578d56aa80f0916df538b487f8213a18933e78fdecb9efeedae02cf9c\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/execution/iOVM_StateManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title iOVM_StateManager\\n */\\ninterface iOVM_StateManager {\\n\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n enum ItemState {\\n ITEM_UNTOUCHED,\\n ITEM_LOADED,\\n ITEM_CHANGED,\\n ITEM_COMMITTED\\n }\\n\\n /***************************\\n * Public Functions: Misc *\\n ***************************/\\n\\n function isAuthenticated(address _address) external view returns (bool);\\n\\n /***************************\\n * Public Functions: Setup *\\n ***************************/\\n\\n function owner() external view returns (address _owner);\\n function ovmExecutionManager() external view returns (address _ovmExecutionManager);\\n function setExecutionManager(address _ovmExecutionManager) external;\\n\\n\\n /************************************\\n * Public Functions: Account Access *\\n ************************************/\\n\\n function putAccount(address _address, Lib_OVMCodec.Account memory _account) external;\\n function putEmptyAccount(address _address) external;\\n function getAccount(address _address) external view returns (Lib_OVMCodec.Account memory _account);\\n function hasAccount(address _address) external view returns (bool _exists);\\n function hasEmptyAccount(address _address) external view returns (bool _exists);\\n function setAccountNonce(address _address, uint256 _nonce) external;\\n function getAccountNonce(address _address) external view returns (uint256 _nonce);\\n function getAccountEthAddress(address _address) external view returns (address _ethAddress);\\n function getAccountStorageRoot(address _address) external view returns (bytes32 _storageRoot);\\n function initPendingAccount(address _address) external;\\n function commitPendingAccount(address _address, address _ethAddress, bytes32 _codeHash) external;\\n function testAndSetAccountLoaded(address _address) external returns (bool _wasAccountAlreadyLoaded);\\n function testAndSetAccountChanged(address _address) external returns (bool _wasAccountAlreadyChanged);\\n function commitAccount(address _address) external returns (bool _wasAccountCommitted);\\n function incrementTotalUncommittedAccounts() external;\\n function getTotalUncommittedAccounts() external view returns (uint256 _total);\\n function wasAccountChanged(address _address) external view returns (bool);\\n function wasAccountCommitted(address _address) external view returns (bool);\\n\\n\\n /************************************\\n * Public Functions: Storage Access *\\n ************************************/\\n\\n function putContractStorage(address _contract, bytes32 _key, bytes32 _value) external;\\n function getContractStorage(address _contract, bytes32 _key) external view returns (bytes32 _value);\\n function hasContractStorage(address _contract, bytes32 _key) external view returns (bool _exists);\\n function testAndSetContractStorageLoaded(address _contract, bytes32 _key) external returns (bool _wasContractStorageAlreadyLoaded);\\n function testAndSetContractStorageChanged(address _contract, bytes32 _key) external returns (bool _wasContractStorageAlreadyChanged);\\n function commitContractStorage(address _contract, bytes32 _key) external returns (bool _wasContractStorageCommitted);\\n function incrementTotalUncommittedContractStorage() external;\\n function getTotalUncommittedContractStorage() external view returns (uint256 _total);\\n function wasContractStorageChanged(address _contract, bytes32 _key) external view returns (bool);\\n function wasContractStorageCommitted(address _contract, bytes32 _key) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x7a11dbd1f61593ba34debe07e39eef59967307f7f372ba9855bee0953585d08d\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/execution/iOVM_StateManagerFactory.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Contract Imports */\\nimport { iOVM_StateManager } from \\\"./iOVM_StateManager.sol\\\";\\n\\n/**\\n * @title iOVM_StateManagerFactory\\n */\\ninterface iOVM_StateManagerFactory {\\n\\n /***************************************\\n * Public Functions: Contract Creation *\\n ***************************************/\\n\\n function create(\\n address _owner\\n )\\n external\\n returns (\\n iOVM_StateManager _ovmStateManager\\n );\\n}\\n\",\"keccak256\":\"0x27a90fc43889d0c7d1db50f37907ef7386d9b415d15a1e91a0a068cba59afd36\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/verification/iOVM_BondManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\ninterface ERC20 {\\n function transfer(address, uint256) external returns (bool);\\n function transferFrom(address, address, uint256) external returns (bool);\\n}\\n\\n/// All the errors which may be encountered on the bond manager\\nlibrary Errors {\\n string constant ERC20_ERR = \\\"BondManager: Could not post bond\\\";\\n string constant ALREADY_FINALIZED = \\\"BondManager: Fraud proof for this pre-state root has already been finalized\\\";\\n string constant SLASHED = \\\"BondManager: Cannot finalize withdrawal, you probably got slashed\\\";\\n string constant WRONG_STATE = \\\"BondManager: Wrong bond state for proposer\\\";\\n string constant CANNOT_CLAIM = \\\"BondManager: Cannot claim yet. Dispute must be finalized first\\\";\\n\\n string constant WITHDRAWAL_PENDING = \\\"BondManager: Withdrawal already pending\\\";\\n string constant TOO_EARLY = \\\"BondManager: Too early to finalize your withdrawal\\\";\\n\\n string constant ONLY_TRANSITIONER = \\\"BondManager: Only the transitioner for this pre-state root may call this function\\\";\\n string constant ONLY_FRAUD_VERIFIER = \\\"BondManager: Only the fraud verifier may call this function\\\";\\n string constant ONLY_STATE_COMMITMENT_CHAIN = \\\"BondManager: Only the state commitment chain may call this function\\\";\\n string constant WAIT_FOR_DISPUTES = \\\"BondManager: Wait for other potential disputes\\\";\\n}\\n\\n/**\\n * @title iOVM_BondManager\\n */\\ninterface iOVM_BondManager {\\n\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n /// The lifecycle of a proposer's bond\\n enum State {\\n // Before depositing or after getting slashed, a user is uncollateralized\\n NOT_COLLATERALIZED,\\n // After depositing, a user is collateralized\\n COLLATERALIZED,\\n // After a user has initiated a withdrawal\\n WITHDRAWING\\n }\\n\\n /// A bond posted by a proposer\\n struct Bond {\\n // The user's state\\n State state;\\n // The timestamp at which a proposer issued their withdrawal request\\n uint32 withdrawalTimestamp;\\n // The time when the first disputed was initiated for this bond\\n uint256 firstDisputeAt;\\n // The earliest observed state root for this bond which has had fraud\\n bytes32 earliestDisputedStateRoot;\\n // The state root's timestamp\\n uint256 earliestTimestamp;\\n }\\n\\n // Per pre-state root, store the number of state provisions that were made\\n // and how many of these calls were made by each user. Payouts will then be\\n // claimed by users proportionally for that dispute.\\n struct Rewards {\\n // Flag to check if rewards for a fraud proof are claimable\\n bool canClaim;\\n // Total number of `recordGasSpent` calls made\\n uint256 total;\\n // The gas spent by each user to provide witness data. The sum of all\\n // values inside this map MUST be equal to the value of `total`\\n mapping(address => uint256) gasSpent;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function recordGasSpent(\\n bytes32 _preStateRoot,\\n bytes32 _txHash,\\n address _who,\\n uint256 _gasSpent\\n ) external;\\n\\n function finalize(\\n bytes32 _preStateRoot,\\n address _publisher,\\n uint256 _timestamp\\n ) external;\\n\\n function deposit() external;\\n\\n function startWithdrawal() external;\\n\\n function finalizeWithdrawal() external;\\n\\n function claim(\\n address _who\\n ) external;\\n\\n function isCollateralized(\\n address _who\\n ) external view returns (bool);\\n\\n function getGasSpent(\\n bytes32 _preStateRoot,\\n address _who\\n ) external view returns (uint256);\\n}\\n\",\"keccak256\":\"0x3c2a8a399487857158649db1896749d86e39cba545a8aeb2e2bb0f3bdfa7a5b1\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/verification/iOVM_FraudVerifier.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_StateTransitioner } from \\\"./iOVM_StateTransitioner.sol\\\";\\n\\n/**\\n * @title iOVM_FraudVerifier\\n */\\ninterface iOVM_FraudVerifier {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event FraudProofInitialized(\\n bytes32 _preStateRoot,\\n uint256 _preStateRootIndex,\\n bytes32 _transactionHash,\\n address _who\\n );\\n\\n event FraudProofFinalized(\\n bytes32 _preStateRoot,\\n uint256 _preStateRootIndex,\\n bytes32 _transactionHash,\\n address _who\\n );\\n\\n\\n /***************************************\\n * Public Functions: Transition Status *\\n ***************************************/\\n\\n function getStateTransitioner(bytes32 _preStateRoot, bytes32 _txHash) external view returns (iOVM_StateTransitioner _transitioner);\\n\\n\\n /****************************************\\n * Public Functions: Fraud Verification *\\n ****************************************/\\n\\n function initializeFraudVerification(\\n bytes32 _preStateRoot,\\n Lib_OVMCodec.ChainBatchHeader calldata _preStateRootBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof calldata _preStateRootProof,\\n Lib_OVMCodec.Transaction calldata _transaction,\\n Lib_OVMCodec.TransactionChainElement calldata _txChainElement,\\n Lib_OVMCodec.ChainBatchHeader calldata _transactionBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof calldata _transactionProof\\n ) external;\\n\\n function finalizeFraudVerification(\\n bytes32 _preStateRoot,\\n Lib_OVMCodec.ChainBatchHeader calldata _preStateRootBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof calldata _preStateRootProof,\\n bytes32 _txHash,\\n bytes32 _postStateRoot,\\n Lib_OVMCodec.ChainBatchHeader calldata _postStateRootBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof calldata _postStateRootProof\\n ) external;\\n}\\n\",\"keccak256\":\"0x5efd7bb18164bbd3e9d58379e8203fbf2a7ee802b1a48dff3ceaaec1523b1751\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/verification/iOVM_StateTransitioner.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title iOVM_StateTransitioner\\n */\\ninterface iOVM_StateTransitioner {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AccountCommitted(\\n address _address\\n );\\n\\n event ContractStorageCommitted(\\n address _address,\\n bytes32 _key\\n );\\n\\n\\n /**********************************\\n * Public Functions: State Access *\\n **********************************/\\n\\n function getPreStateRoot() external view returns (bytes32 _preStateRoot);\\n function getPostStateRoot() external view returns (bytes32 _postStateRoot);\\n function isComplete() external view returns (bool _complete);\\n\\n\\n /***********************************\\n * Public Functions: Pre-Execution *\\n ***********************************/\\n\\n function proveContractState(\\n address _ovmContractAddress,\\n address _ethContractAddress,\\n bytes calldata _stateTrieWitness\\n ) external;\\n\\n function proveStorageSlot(\\n address _ovmContractAddress,\\n bytes32 _key,\\n bytes calldata _storageTrieWitness\\n ) external;\\n\\n\\n /*******************************\\n * Public Functions: Execution *\\n *******************************/\\n\\n function applyTransaction(\\n Lib_OVMCodec.Transaction calldata _transaction\\n ) external;\\n\\n\\n /************************************\\n * Public Functions: Post-Execution *\\n ************************************/\\n\\n function commitContractState(\\n address _ovmContractAddress,\\n bytes calldata _stateTrieWitness\\n ) external;\\n\\n function commitStorageSlot(\\n address _ovmContractAddress,\\n bytes32 _key,\\n bytes calldata _storageTrieWitness\\n ) external;\\n\\n\\n /**********************************\\n * Public Functions: Finalization *\\n **********************************/\\n\\n function completeTransition() external;\\n}\\n\",\"keccak256\":\"0x3d044ac0a3bb6ad3d529f904b3191117511f9c379678ca03010e1ebdfcb5c34b\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/verification/iOVM_StateTransitionerFactory.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Contract Imports */\\nimport { iOVM_StateTransitioner } from \\\"./iOVM_StateTransitioner.sol\\\";\\n\\n/**\\n * @title iOVM_StateTransitionerFactory\\n */\\ninterface iOVM_StateTransitionerFactory {\\n\\n /***************************************\\n * Public Functions: Contract Creation *\\n ***************************************/\\n\\n function create(\\n address _proxyManager,\\n uint256 _stateTransitionIndex,\\n bytes32 _preStateRoot,\\n bytes32 _transactionHash\\n )\\n external\\n returns (\\n iOVM_StateTransitioner _ovmStateTransitioner\\n );\\n}\\n\",\"keccak256\":\"0x60a0f0c104e4c0c7863268a93005762e8146d393f9cfddfdd6a2d6585c5911fc\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/codec/Lib_OVMCodec.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../utils/Lib_Bytes32Utils.sol\\\";\\nimport { Lib_SafeExecutionManagerWrapper } from \\\"../../libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\\\";\\n\\n/**\\n * @title Lib_OVMCodec\\n */\\nlibrary Lib_OVMCodec {\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum EOASignatureType {\\n EIP155_TRANSACTION,\\n ETH_SIGNED_MESSAGE\\n }\\n\\n enum QueueOrigin {\\n SEQUENCER_QUEUE,\\n L1TOL2_QUEUE\\n }\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Account {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n address ethAddress;\\n bool isFresh;\\n }\\n\\n struct EVMAccount {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n }\\n\\n struct ChainBatchHeader {\\n uint256 batchIndex;\\n bytes32 batchRoot;\\n uint256 batchSize;\\n uint256 prevTotalElements;\\n bytes extraData;\\n }\\n\\n struct ChainInclusionProof {\\n uint256 index;\\n bytes32[] siblings;\\n }\\n\\n struct Transaction {\\n uint256 timestamp;\\n uint256 blockNumber;\\n QueueOrigin l1QueueOrigin;\\n address l1TxOrigin;\\n address entrypoint;\\n uint256 gasLimit;\\n bytes data;\\n }\\n\\n struct TransactionChainElement {\\n bool isSequenced;\\n uint256 queueIndex; // QUEUED TX ONLY\\n uint256 timestamp; // SEQUENCER TX ONLY\\n uint256 blockNumber; // SEQUENCER TX ONLY\\n bytes txData; // SEQUENCER TX ONLY\\n }\\n\\n struct QueueElement {\\n bytes32 transactionHash;\\n uint40 timestamp;\\n uint40 blockNumber;\\n }\\n\\n struct EIP155Transaction {\\n uint256 nonce;\\n uint256 gasPrice;\\n uint256 gasLimit;\\n address to;\\n uint256 value;\\n bytes data;\\n uint256 chainId;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Decodes an EOA transaction (i.e., native Ethereum RLP encoding).\\n * @param _transaction Encoded EOA transaction.\\n * @return Transaction decoded into a struct.\\n */\\n function decodeEIP155Transaction(\\n bytes memory _transaction,\\n bool _isEthSignedMessage\\n )\\n internal\\n pure\\n returns (\\n EIP155Transaction memory\\n )\\n {\\n if (_isEthSignedMessage) {\\n (\\n uint256 _nonce,\\n uint256 _gasLimit,\\n uint256 _gasPrice,\\n uint256 _chainId,\\n address _to,\\n bytes memory _data\\n ) = abi.decode(\\n _transaction,\\n (uint256, uint256, uint256, uint256, address ,bytes)\\n );\\n return EIP155Transaction({\\n nonce: _nonce,\\n gasPrice: _gasPrice,\\n gasLimit: _gasLimit,\\n to: _to,\\n value: 0,\\n data: _data,\\n chainId: _chainId\\n });\\n } else {\\n Lib_RLPReader.RLPItem[] memory decoded = Lib_RLPReader.readList(_transaction);\\n\\n return EIP155Transaction({\\n nonce: Lib_RLPReader.readUint256(decoded[0]),\\n gasPrice: Lib_RLPReader.readUint256(decoded[1]),\\n gasLimit: Lib_RLPReader.readUint256(decoded[2]),\\n to: Lib_RLPReader.readAddress(decoded[3]),\\n value: Lib_RLPReader.readUint256(decoded[4]),\\n data: Lib_RLPReader.readBytes(decoded[5]),\\n chainId: Lib_RLPReader.readUint256(decoded[6])\\n });\\n }\\n }\\n\\n /**\\n * Decompresses a compressed EIP155 transaction.\\n * @param _transaction Compressed EIP155 transaction bytes.\\n * @return Transaction parsed into a struct.\\n */\\n function decompressEIP155Transaction(\\n bytes memory _transaction\\n )\\n internal\\n returns (\\n EIP155Transaction memory\\n )\\n {\\n return EIP155Transaction({\\n gasLimit: Lib_BytesUtils.toUint24(_transaction, 0),\\n gasPrice: uint256(Lib_BytesUtils.toUint24(_transaction, 3)) * 1000000,\\n nonce: Lib_BytesUtils.toUint24(_transaction, 6),\\n to: Lib_BytesUtils.toAddress(_transaction, 9),\\n data: Lib_BytesUtils.slice(_transaction, 29),\\n chainId: Lib_SafeExecutionManagerWrapper.safeCHAINID(),\\n value: 0\\n });\\n }\\n\\n /**\\n * Encodes an EOA transaction back into the original transaction.\\n * @param _transaction EIP155transaction to encode.\\n * @param _isEthSignedMessage Whether or not this was an eth signed message.\\n * @return Encoded transaction.\\n */\\n function encodeEIP155Transaction(\\n EIP155Transaction memory _transaction,\\n bool _isEthSignedMessage\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n if (_isEthSignedMessage) {\\n return abi.encode(\\n _transaction.nonce,\\n _transaction.gasLimit,\\n _transaction.gasPrice,\\n _transaction.chainId,\\n _transaction.to,\\n _transaction.data\\n );\\n } else {\\n bytes[] memory raw = new bytes[](9);\\n\\n raw[0] = Lib_RLPWriter.writeUint(_transaction.nonce);\\n raw[1] = Lib_RLPWriter.writeUint(_transaction.gasPrice);\\n raw[2] = Lib_RLPWriter.writeUint(_transaction.gasLimit);\\n if (_transaction.to == address(0)) {\\n raw[3] = Lib_RLPWriter.writeBytes('');\\n } else {\\n raw[3] = Lib_RLPWriter.writeAddress(_transaction.to);\\n }\\n raw[4] = Lib_RLPWriter.writeUint(0);\\n raw[5] = Lib_RLPWriter.writeBytes(_transaction.data);\\n raw[6] = Lib_RLPWriter.writeUint(_transaction.chainId);\\n raw[7] = Lib_RLPWriter.writeBytes(bytes(''));\\n raw[8] = Lib_RLPWriter.writeBytes(bytes(''));\\n\\n return Lib_RLPWriter.writeList(raw);\\n }\\n }\\n\\n /**\\n * Encodes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Encoded transaction bytes.\\n */\\n function encodeTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return abi.encodePacked(\\n _transaction.timestamp,\\n _transaction.blockNumber,\\n _transaction.l1QueueOrigin,\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n );\\n }\\n\\n /**\\n * Hashes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Hashed transaction\\n */\\n function hashTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(encodeTransaction(_transaction));\\n }\\n\\n /**\\n * Converts an OVM account to an EVM account.\\n * @param _in OVM account to convert.\\n * @return Converted EVM account.\\n */\\n function toEVMAccount(\\n Account memory _in\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n return EVMAccount({\\n nonce: _in.nonce,\\n balance: _in.balance,\\n storageRoot: _in.storageRoot,\\n codeHash: _in.codeHash\\n });\\n }\\n\\n /**\\n * @notice RLP-encodes an account state struct.\\n * @param _account Account state struct.\\n * @return RLP-encoded account state.\\n */\\n function encodeEVMAccount(\\n EVMAccount memory _account\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes[] memory raw = new bytes[](4);\\n\\n // Unfortunately we can't create this array outright because\\n // Lib_RLPWriter.writeList will reject fixed-size arrays. Assigning\\n // index-by-index circumvents this issue.\\n raw[0] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.nonce)\\n )\\n );\\n raw[1] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.balance)\\n )\\n );\\n raw[2] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.storageRoot));\\n raw[3] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.codeHash));\\n\\n return Lib_RLPWriter.writeList(raw);\\n }\\n\\n /**\\n * @notice Decodes an RLP-encoded account state into a useful struct.\\n * @param _encoded RLP-encoded account state.\\n * @return Account state struct.\\n */\\n function decodeEVMAccount(\\n bytes memory _encoded\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\\n\\n return EVMAccount({\\n nonce: Lib_RLPReader.readUint256(accountState[0]),\\n balance: Lib_RLPReader.readUint256(accountState[1]),\\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\\n });\\n }\\n\\n /**\\n * Calculates a hash for a given batch header.\\n * @param _batchHeader Header to hash.\\n * @return Hash of the header.\\n */\\n function hashBatchHeader(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(\\n abi.encode(\\n _batchHeader.batchRoot,\\n _batchHeader.batchSize,\\n _batchHeader.prevTotalElements,\\n _batchHeader.extraData\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0xe7e518ba7bba3fa28c532f8902576c1bb4dfc1ec4b62bed6da50623248ba17c3\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Contract Imports */\\nimport { Ownable } from \\\"./Lib_Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n /*******************************************\\n * Contract Variables: Internal Accounting *\\n *******************************************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n public\\n onlyOwner\\n {\\n emit AddressSet(_name, _address);\\n addresses[_getNameHash(_name)] = _address;\\n }\\n\\n function getAddress(\\n string memory _name\\n )\\n public\\n view\\n returns (address)\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32 _hash\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0x3a490595cc21ff170e4027843093670ff845d5972481fbfb956b722ea564bb06\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n\\n /*******************************************\\n * Contract Variables: Contract References *\\n *******************************************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(\\n address _libAddressManager\\n ) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function resolve(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address _contract\\n )\\n {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0xaa3ed342f6deb156c660fd83afa579a3b80db17eb465e8949cf5c1b114780143\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Ownable\\n * @dev Adapted from https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol\\n */\\nabstract contract Ownable {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n address public owner;\\n\\n\\n /**********\\n * Events *\\n **********/\\n\\n event OwnershipTransferred(\\n address indexed previousOwner,\\n address indexed newOwner\\n );\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n constructor() {\\n owner = msg.sender;\\n emit OwnershipTransferred(address(0), owner);\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n owner == msg.sender,\\n \\\"Ownable: caller is not the owner\\\"\\n );\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function renounceOwnership()\\n public\\n virtual\\n onlyOwner\\n {\\n emit OwnershipTransferred(owner, address(0));\\n owner = address(0);\\n }\\n\\n function transferOwnership(address _newOwner)\\n public\\n virtual\\n onlyOwner\\n {\\n require(\\n _newOwner != address(0),\\n \\\"Ownable: new owner cannot be the zero address\\\"\\n );\\n\\n emit OwnershipTransferred(owner, _newOwner);\\n owner = _newOwner;\\n }\\n}\\n\",\"keccak256\":\"0xd9dfd9264e5b5fedd53a5b10fdf179c3f367614b0fe69179bce4e45119f5b739\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPReader.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_RLPReader\\n * @dev Adapted from \\\"RLPReader\\\" by Hamdi Allam (hamdi.allam97@gmail.com).\\n */\\nlibrary Lib_RLPReader {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 constant internal MAX_LIST_LENGTH = 32;\\n\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum RLPItemType {\\n DATA_ITEM,\\n LIST_ITEM\\n }\\n\\n \\n /***********\\n * Structs *\\n ***********/\\n\\n struct RLPItem {\\n uint256 length;\\n uint256 ptr;\\n }\\n \\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n \\n /**\\n * Converts bytes to a reference to memory position and length.\\n * @param _in Input bytes to convert.\\n * @return Output memory reference.\\n */\\n function toRLPItem(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem memory\\n )\\n {\\n uint256 ptr;\\n assembly {\\n ptr := add(_in, 32)\\n }\\n\\n return RLPItem({\\n length: _in.length,\\n ptr: ptr\\n });\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n (\\n uint256 listOffset,\\n ,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.LIST_ITEM,\\n \\\"Invalid RLP list value.\\\"\\n );\\n\\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\\n // writing to the length. Since we can't know the number of RLP items without looping over\\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\\n // simply set a reasonable maximum list length and decrease the size before we finish.\\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\\n\\n uint256 itemCount = 0;\\n uint256 offset = listOffset;\\n while (offset < _in.length) {\\n require(\\n itemCount < MAX_LIST_LENGTH,\\n \\\"Provided RLP list exceeds max list length.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n ) = _decodeLength(RLPItem({\\n length: _in.length - offset,\\n ptr: _in.ptr + offset\\n }));\\n\\n out[itemCount] = RLPItem({\\n length: itemLength + itemOffset,\\n ptr: _in.ptr + offset\\n });\\n\\n itemCount += 1;\\n offset += itemOffset + itemLength;\\n }\\n\\n // Decrease the array size to match the actual item count.\\n assembly {\\n mstore(out, itemCount)\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n return readList(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes value.\\\"\\n );\\n\\n return _copy(_in.ptr, itemOffset, itemLength);\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return readBytes(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return string(readBytes(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return readString(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n require(\\n _in.length <= 33,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr + itemOffset;\\n bytes32 out;\\n assembly {\\n out := mload(ptr)\\n\\n // Shift the bytes over to match the item size.\\n if lt(itemLength, 32) {\\n out := div(out, exp(256, sub(32, itemLength)))\\n }\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return readBytes32(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return uint256(readBytes32(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return readUint256(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n require(\\n _in.length == 1,\\n \\\"Invalid RLP boolean value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 out;\\n assembly {\\n out := byte(0, mload(ptr))\\n }\\n\\n require(\\n out == 0 || out == 1,\\n \\\"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\\\"\\n );\\n\\n return out != 0;\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return readBool(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n if (_in.length == 1) {\\n return address(0);\\n }\\n\\n require(\\n _in.length == 21,\\n \\\"Invalid RLP address value.\\\"\\n );\\n\\n return address(readUint256(_in));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return readAddress(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads the raw bytes of an RLP item.\\n * @param _in RLP item to read.\\n * @return Raw RLP bytes.\\n */\\n function readRawBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in);\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Decodes the length of an RLP item.\\n * @param _in RLP item to decode.\\n * @return Offset of the encoded data.\\n * @return Length of the encoded data.\\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\\n */\\n function _decodeLength(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n uint256,\\n uint256,\\n RLPItemType\\n )\\n {\\n require(\\n _in.length > 0,\\n \\\"RLP item cannot be null.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 prefix;\\n assembly {\\n prefix := byte(0, mload(ptr))\\n }\\n\\n if (prefix <= 0x7f) {\\n // Single byte.\\n\\n return (0, 1, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xb7) {\\n // Short string.\\n\\n uint256 strLen = prefix - 0x80;\\n \\n require(\\n _in.length > strLen,\\n \\\"Invalid RLP short string.\\\"\\n );\\n\\n return (1, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xbf) {\\n // Long string.\\n uint256 lenOfStrLen = prefix - 0xb7;\\n\\n require(\\n _in.length > lenOfStrLen,\\n \\\"Invalid RLP long string length.\\\"\\n );\\n\\n uint256 strLen;\\n assembly {\\n // Pick out the string length.\\n strLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfStrLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfStrLen + strLen,\\n \\\"Invalid RLP long string.\\\"\\n );\\n\\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xf7) {\\n // Short list.\\n uint256 listLen = prefix - 0xc0;\\n\\n require(\\n _in.length > listLen,\\n \\\"Invalid RLP short list.\\\"\\n );\\n\\n return (1, listLen, RLPItemType.LIST_ITEM);\\n } else {\\n // Long list.\\n uint256 lenOfListLen = prefix - 0xf7;\\n\\n require(\\n _in.length > lenOfListLen,\\n \\\"Invalid RLP long list length.\\\"\\n );\\n\\n uint256 listLen;\\n assembly {\\n // Pick out the list length.\\n listLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfListLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfListLen + listLen,\\n \\\"Invalid RLP long list.\\\"\\n );\\n\\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\\n }\\n }\\n\\n /**\\n * Copies the bytes from a memory location.\\n * @param _src Pointer to the location to read from.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Copied bytes.\\n */\\n function _copy(\\n uint256 _src,\\n uint256 _offset,\\n uint256 _length\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out = new bytes(_length);\\n if (out.length == 0) {\\n return out;\\n }\\n\\n uint256 src = _src + _offset;\\n uint256 dest;\\n assembly {\\n dest := add(out, 32)\\n }\\n\\n // Copy over as many complete words as we can.\\n for (uint256 i = 0; i < _length / 32; i++) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n\\n src += 32;\\n dest += 32;\\n }\\n\\n // Pick out the remaining bytes.\\n uint256 mask = 256 ** (32 - (_length % 32)) - 1;\\n assembly {\\n mstore(\\n dest,\\n or(\\n and(mload(src), not(mask)),\\n and(mload(dest), mask)\\n )\\n )\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Copies an RLP item into bytes.\\n * @param _in RLP item to copy.\\n * @return Copied bytes.\\n */\\n function _copy(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in.ptr, 0, _in.length);\\n }\\n}\\n\",\"keccak256\":\"0xbdb8fae0ca2483b4cc07607a5070fc25e33c54b4e4462b99e7c0b13aac48a09b\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPWriter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\n\\n/**\\n * @title Lib_RLPWriter\\n * @author Bakaoh (with modifications)\\n */\\nlibrary Lib_RLPWriter {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * RLP encodes a byte string.\\n * @param _in The byte string to encode.\\n * @return _out The RLP encoded string in bytes.\\n */\\n function writeBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n bytes memory encoded;\\n\\n if (_in.length == 1 && uint8(_in[0]) < 128) {\\n encoded = _in;\\n } else {\\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * RLP encodes a list of RLP encoded byte byte strings.\\n * @param _in The list of RLP encoded byte strings.\\n * @return _out The RLP encoded list of items in bytes.\\n */\\n function writeList(\\n bytes[] memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n bytes memory list = _flatten(_in);\\n return abi.encodePacked(_writeLength(list.length, 192), list);\\n }\\n\\n /**\\n * RLP encodes a string.\\n * @param _in The string to encode.\\n * @return _out The RLP encoded string in bytes.\\n */\\n function writeString(\\n string memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(bytes(_in));\\n }\\n\\n /**\\n * RLP encodes an address.\\n * @param _in The address to encode.\\n * @return _out The RLP encoded address in bytes.\\n */\\n function writeAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a uint.\\n * @param _in The uint256 to encode.\\n * @return _out The RLP encoded uint256 in bytes.\\n */\\n function writeUint(\\n uint256 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(_toBinary(_in));\\n }\\n\\n /**\\n * RLP encodes a bool.\\n * @param _in The bool to encode.\\n * @return _out The RLP encoded bool in bytes.\\n */\\n function writeBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n bytes memory encoded = new bytes(1);\\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\\n return encoded;\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\\n * @param _len The length of the string or the payload.\\n * @param _offset 128 if item is string, 192 if item is list.\\n * @return _encoded RLP encoded bytes.\\n */\\n function _writeLength(\\n uint256 _len,\\n uint256 _offset\\n )\\n private\\n pure\\n returns (\\n bytes memory _encoded\\n )\\n {\\n bytes memory encoded;\\n\\n if (_len < 56) {\\n encoded = new bytes(1);\\n encoded[0] = byte(uint8(_len) + uint8(_offset));\\n } else {\\n uint256 lenLen;\\n uint256 i = 1;\\n while (_len / i != 0) {\\n lenLen++;\\n i *= 256;\\n }\\n\\n encoded = new bytes(lenLen + 1);\\n encoded[0] = byte(uint8(lenLen) + uint8(_offset) + 55);\\n for(i = 1; i <= lenLen; i++) {\\n encoded[i] = byte(uint8((_len / (256**(lenLen-i))) % 256));\\n }\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * Encode integer in big endian binary form with no leading zeroes.\\n * @notice TODO: This should be optimized with assembly to save gas costs.\\n * @param _x The integer to encode.\\n * @return _binary RLP encoded bytes.\\n */\\n function _toBinary(\\n uint256 _x\\n )\\n private\\n pure\\n returns (\\n bytes memory _binary\\n )\\n {\\n bytes memory b = abi.encodePacked(_x);\\n\\n uint256 i = 0;\\n for (; i < 32; i++) {\\n if (b[i] != 0) {\\n break;\\n }\\n }\\n\\n bytes memory res = new bytes(32 - i);\\n for (uint256 j = 0; j < res.length; j++) {\\n res[j] = b[i++];\\n }\\n\\n return res;\\n }\\n\\n /**\\n * Copies a piece of memory to another location.\\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\\n * @param _dest Destination location.\\n * @param _src Source location.\\n * @param _len Length of memory to copy.\\n */\\n function _memcpy(\\n uint256 _dest,\\n uint256 _src,\\n uint256 _len\\n )\\n private\\n pure\\n {\\n uint256 dest = _dest;\\n uint256 src = _src;\\n uint256 len = _len;\\n\\n for(; len >= 32; len -= 32) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n dest += 32;\\n src += 32;\\n }\\n\\n uint256 mask = 256 ** (32 - len) - 1;\\n assembly {\\n let srcpart := and(mload(src), not(mask))\\n let destpart := and(mload(dest), mask)\\n mstore(dest, or(destpart, srcpart))\\n }\\n }\\n\\n /**\\n * Flattens a list of byte strings into one byte string.\\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\\n * @param _list List of byte strings to flatten.\\n * @return _flattened The flattened byte string.\\n */\\n function _flatten(\\n bytes[] memory _list\\n )\\n private\\n pure\\n returns (\\n bytes memory _flattened\\n )\\n {\\n if (_list.length == 0) {\\n return new bytes(0);\\n }\\n\\n uint256 len;\\n uint256 i = 0;\\n for (; i < _list.length; i++) {\\n len += _list[i].length;\\n }\\n\\n bytes memory flattened = new bytes(len);\\n uint256 flattenedPtr;\\n assembly { flattenedPtr := add(flattened, 0x20) }\\n\\n for(i = 0; i < _list.length; i++) {\\n bytes memory item = _list[i];\\n\\n uint256 listPtr;\\n assembly { listPtr := add(item, 0x20)}\\n\\n _memcpy(flattenedPtr, listPtr, item.length);\\n flattenedPtr += _list[i].length;\\n }\\n\\n return flattened;\\n }\\n}\",\"keccak256\":\"0xbcb24619c1758cb0d9f3fe5c79495950045a9087046a02b9ce01df46ae09ae5b\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/trie/Lib_MerkleTrie.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\n\\n/**\\n * @title Lib_MerkleTrie\\n */\\nlibrary Lib_MerkleTrie {\\n\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n enum NodeType {\\n BranchNode,\\n ExtensionNode,\\n LeafNode\\n }\\n\\n struct TrieNode {\\n bytes encoded;\\n Lib_RLPReader.RLPItem[] decoded;\\n }\\n\\n\\n /**********************\\n * Contract Constants *\\n **********************/\\n\\n // TREE_RADIX determines the number of elements per branch node.\\n uint256 constant TREE_RADIX = 16;\\n // Branch nodes have TREE_RADIX elements plus an additional `value` slot.\\n uint256 constant BRANCH_NODE_LENGTH = TREE_RADIX + 1;\\n // Leaf nodes and extension nodes always have two elements, a `path` and a `value`.\\n uint256 constant LEAF_OR_EXTENSION_NODE_LENGTH = 2;\\n\\n // Prefixes are prepended to the `path` within a leaf or extension node and\\n // allow us to differentiate between the two node types. `ODD` or `EVEN` is\\n // determined by the number of nibbles within the unprefixed `path`. If the\\n // number of nibbles if even, we need to insert an extra padding nibble so\\n // the resulting prefixed `path` has an even number of nibbles.\\n uint8 constant PREFIX_EXTENSION_EVEN = 0;\\n uint8 constant PREFIX_EXTENSION_ODD = 1;\\n uint8 constant PREFIX_LEAF_EVEN = 2;\\n uint8 constant PREFIX_LEAF_ODD = 3;\\n\\n // Just a utility constant. RLP represents `NULL` as 0x80.\\n bytes1 constant RLP_NULL = bytes1(0x80);\\n bytes constant RLP_NULL_BYTES = hex'80';\\n bytes32 constant internal KECCAK256_RLP_NULL_BYTES = keccak256(RLP_NULL_BYTES);\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * @notice Verifies a proof that a given key/value pair is present in the\\n * Merkle trie.\\n * @param _key Key of the node to search for, as a hex string.\\n * @param _value Value of the node to search for, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the desired node. Unlike\\n * traditional Merkle trees, this proof is executed top-down and consists\\n * of a list of RLP-encoded nodes that make a path down to the target node.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _verified `true` if the k/v pair exists in the trie, `false` otherwise.\\n */\\n function verifyInclusionProof(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bool _verified\\n )\\n {\\n (\\n bool exists,\\n bytes memory value\\n ) = get(_key, _proof, _root);\\n\\n return (\\n exists && Lib_BytesUtils.equal(_value, value)\\n );\\n }\\n\\n /**\\n * @notice Verifies a proof that a given key is *not* present in\\n * the Merkle trie.\\n * @param _key Key of the node to search for, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\\n * target node.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _verified `true` if the key is absent in the trie, `false` otherwise.\\n */\\n function verifyExclusionProof(\\n bytes memory _key,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bool _verified\\n )\\n {\\n (\\n bool exists,\\n ) = get(_key, _proof, _root);\\n\\n return exists == false;\\n }\\n\\n /**\\n * @notice Updates a Merkle trie and returns a new root hash.\\n * @param _key Key of the node to update, as a hex string.\\n * @param _value Value of the node to update, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\\n * target node. If the key exists, we can simply update the value.\\n * Otherwise, we need to modify the trie to handle the new k/v pair.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _updatedRoot Root hash of the newly constructed trie.\\n */\\n function update(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bytes32 _updatedRoot\\n )\\n {\\n // Special case when inserting the very first node.\\n if (_root == KECCAK256_RLP_NULL_BYTES) {\\n return getSingleNodeRootHash(_key, _value);\\n }\\n\\n TrieNode[] memory proof = _parseProof(_proof);\\n (uint256 pathLength, bytes memory keyRemainder, ) = _walkNodePath(proof, _key, _root);\\n TrieNode[] memory newPath = _getNewPath(proof, pathLength, keyRemainder, _value);\\n\\n return _getUpdatedTrieRoot(newPath, _key);\\n }\\n\\n /**\\n * @notice Retrieves the value associated with a given key.\\n * @param _key Key to search for, as hex bytes.\\n * @param _proof Merkle trie inclusion proof for the key.\\n * @param _root Known root of the Merkle trie.\\n * @return _exists Whether or not the key exists.\\n * @return _value Value of the key if it exists.\\n */\\n function get(\\n bytes memory _key,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bool _exists,\\n bytes memory _value\\n )\\n {\\n TrieNode[] memory proof = _parseProof(_proof);\\n (uint256 pathLength, bytes memory keyRemainder, bool isFinalNode) = _walkNodePath(proof, _key, _root);\\n\\n bool exists = keyRemainder.length == 0;\\n\\n require(\\n exists || isFinalNode,\\n \\\"Provided proof is invalid.\\\"\\n );\\n\\n bytes memory value = exists ? _getNodeValue(proof[pathLength - 1]) : bytes('');\\n\\n return (\\n exists,\\n value\\n );\\n }\\n\\n /**\\n * Computes the root hash for a trie with a single node.\\n * @param _key Key for the single node.\\n * @param _value Value for the single node.\\n * @return _updatedRoot Hash of the trie.\\n */\\n function getSingleNodeRootHash(\\n bytes memory _key,\\n bytes memory _value\\n )\\n internal\\n pure\\n returns (\\n bytes32 _updatedRoot\\n )\\n {\\n return keccak256(_makeLeafNode(\\n Lib_BytesUtils.toNibbles(_key),\\n _value\\n ).encoded);\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * @notice Walks through a proof using a provided key.\\n * @param _proof Inclusion proof to walk through.\\n * @param _key Key to use for the walk.\\n * @param _root Known root of the trie.\\n * @return _pathLength Length of the final path\\n * @return _keyRemainder Portion of the key remaining after the walk.\\n * @return _isFinalNode Whether or not we've hit a dead end.\\n */\\n function _walkNodePath(\\n TrieNode[] memory _proof,\\n bytes memory _key,\\n bytes32 _root\\n )\\n private\\n pure\\n returns (\\n uint256 _pathLength,\\n bytes memory _keyRemainder,\\n bool _isFinalNode\\n )\\n {\\n uint256 pathLength = 0;\\n bytes memory key = Lib_BytesUtils.toNibbles(_key);\\n\\n bytes32 currentNodeID = _root;\\n uint256 currentKeyIndex = 0;\\n uint256 currentKeyIncrement = 0;\\n TrieNode memory currentNode;\\n\\n // Proof is top-down, so we start at the first element (root).\\n for (uint256 i = 0; i < _proof.length; i++) {\\n currentNode = _proof[i];\\n currentKeyIndex += currentKeyIncrement;\\n\\n // Keep track of the proof elements we actually need.\\n // It's expensive to resize arrays, so this simply reduces gas costs.\\n pathLength += 1;\\n\\n if (currentKeyIndex == 0) {\\n // First proof element is always the root node.\\n require(\\n keccak256(currentNode.encoded) == currentNodeID,\\n \\\"Invalid root hash\\\"\\n );\\n } else if (currentNode.encoded.length >= 32) {\\n // Nodes 32 bytes or larger are hashed inside branch nodes.\\n require(\\n keccak256(currentNode.encoded) == currentNodeID,\\n \\\"Invalid large internal hash\\\"\\n );\\n } else {\\n // Nodes smaller than 31 bytes aren't hashed.\\n require(\\n Lib_BytesUtils.toBytes32(currentNode.encoded) == currentNodeID,\\n \\\"Invalid internal node hash\\\"\\n );\\n }\\n\\n if (currentNode.decoded.length == BRANCH_NODE_LENGTH) {\\n if (currentKeyIndex == key.length) {\\n // We've hit the end of the key, meaning the value should be within this branch node.\\n break;\\n } else {\\n // We're not at the end of the key yet.\\n // Figure out what the next node ID should be and continue.\\n uint8 branchKey = uint8(key[currentKeyIndex]);\\n Lib_RLPReader.RLPItem memory nextNode = currentNode.decoded[branchKey];\\n currentNodeID = _getNodeID(nextNode);\\n currentKeyIncrement = 1;\\n continue;\\n }\\n } else if (currentNode.decoded.length == LEAF_OR_EXTENSION_NODE_LENGTH) {\\n bytes memory path = _getNodePath(currentNode);\\n uint8 prefix = uint8(path[0]);\\n uint8 offset = 2 - prefix % 2;\\n bytes memory pathRemainder = Lib_BytesUtils.slice(path, offset);\\n bytes memory keyRemainder = Lib_BytesUtils.slice(key, currentKeyIndex);\\n uint256 sharedNibbleLength = _getSharedNibbleLength(pathRemainder, keyRemainder);\\n\\n if (prefix == PREFIX_LEAF_EVEN || prefix == PREFIX_LEAF_ODD) {\\n if (\\n pathRemainder.length == sharedNibbleLength &&\\n keyRemainder.length == sharedNibbleLength\\n ) {\\n // The key within this leaf matches our key exactly.\\n // Increment the key index to reflect that we have no remainder.\\n currentKeyIndex += sharedNibbleLength;\\n }\\n\\n // We've hit a leaf node, so our next node should be NULL.\\n currentNodeID = bytes32(RLP_NULL);\\n break;\\n } else if (prefix == PREFIX_EXTENSION_EVEN || prefix == PREFIX_EXTENSION_ODD) {\\n if (sharedNibbleLength == 0) {\\n // Our extension node doesn't share any part of our key.\\n // We've hit the end of this path, updates will need to modify this extension.\\n currentNodeID = bytes32(RLP_NULL);\\n break;\\n } else {\\n // Our extension shares some nibbles.\\n // Carry on to the next node.\\n currentNodeID = _getNodeID(currentNode.decoded[1]);\\n currentKeyIncrement = sharedNibbleLength;\\n continue;\\n }\\n } else {\\n revert(\\\"Received a node with an unknown prefix\\\");\\n }\\n } else {\\n revert(\\\"Received an unparseable node.\\\");\\n }\\n }\\n\\n // If our node ID is NULL, then we're at a dead end.\\n bool isFinalNode = currentNodeID == bytes32(RLP_NULL);\\n return (pathLength, Lib_BytesUtils.slice(key, currentKeyIndex), isFinalNode);\\n }\\n\\n /**\\n * @notice Creates new nodes to support a k/v pair insertion into a given\\n * Merkle trie path.\\n * @param _path Path to the node nearest the k/v pair.\\n * @param _pathLength Length of the path. Necessary because the provided\\n * path may include additional nodes (e.g., it comes directly from a proof)\\n * and we can't resize in-memory arrays without costly duplication.\\n * @param _keyRemainder Portion of the initial key that must be inserted\\n * into the trie.\\n * @param _value Value to insert at the given key.\\n * @return _newPath A new path with the inserted k/v pair and extra supporting nodes.\\n */\\n function _getNewPath(\\n TrieNode[] memory _path,\\n uint256 _pathLength,\\n bytes memory _keyRemainder,\\n bytes memory _value\\n )\\n private\\n pure\\n returns (\\n TrieNode[] memory _newPath\\n )\\n {\\n bytes memory keyRemainder = _keyRemainder;\\n\\n // Most of our logic depends on the status of the last node in the path.\\n TrieNode memory lastNode = _path[_pathLength - 1];\\n NodeType lastNodeType = _getNodeType(lastNode);\\n\\n // Create an array for newly created nodes.\\n // We need up to three new nodes, depending on the contents of the last node.\\n // Since array resizing is expensive, we'll keep track of the size manually.\\n // We're using an explicit `totalNewNodes += 1` after insertions for clarity.\\n TrieNode[] memory newNodes = new TrieNode[](3);\\n uint256 totalNewNodes = 0;\\n\\n if (keyRemainder.length == 0 && lastNodeType == NodeType.LeafNode) {\\n // We've found a leaf node with the given key.\\n // Simply need to update the value of the node to match.\\n newNodes[totalNewNodes] = _makeLeafNode(_getNodeKey(lastNode), _value);\\n totalNewNodes += 1;\\n } else if (lastNodeType == NodeType.BranchNode) {\\n if (keyRemainder.length == 0) {\\n // We've found a branch node with the given key.\\n // Simply need to update the value of the node to match.\\n newNodes[totalNewNodes] = _editBranchValue(lastNode, _value);\\n totalNewNodes += 1;\\n } else {\\n // We've found a branch node, but it doesn't contain our key.\\n // Reinsert the old branch for now.\\n newNodes[totalNewNodes] = lastNode;\\n totalNewNodes += 1;\\n // Create a new leaf node, slicing our remainder since the first byte points\\n // to our branch node.\\n newNodes[totalNewNodes] = _makeLeafNode(Lib_BytesUtils.slice(keyRemainder, 1), _value);\\n totalNewNodes += 1;\\n }\\n } else {\\n // Our last node is either an extension node or a leaf node with a different key.\\n bytes memory lastNodeKey = _getNodeKey(lastNode);\\n uint256 sharedNibbleLength = _getSharedNibbleLength(lastNodeKey, keyRemainder);\\n\\n if (sharedNibbleLength != 0) {\\n // We've got some shared nibbles between the last node and our key remainder.\\n // We'll need to insert an extension node that covers these shared nibbles.\\n bytes memory nextNodeKey = Lib_BytesUtils.slice(lastNodeKey, 0, sharedNibbleLength);\\n newNodes[totalNewNodes] = _makeExtensionNode(nextNodeKey, _getNodeHash(_value));\\n totalNewNodes += 1;\\n\\n // Cut down the keys since we've just covered these shared nibbles.\\n lastNodeKey = Lib_BytesUtils.slice(lastNodeKey, sharedNibbleLength);\\n keyRemainder = Lib_BytesUtils.slice(keyRemainder, sharedNibbleLength);\\n }\\n\\n // Create an empty branch to fill in.\\n TrieNode memory newBranch = _makeEmptyBranchNode();\\n\\n if (lastNodeKey.length == 0) {\\n // Key remainder was larger than the key for our last node.\\n // The value within our last node is therefore going to be shifted into\\n // a branch value slot.\\n newBranch = _editBranchValue(newBranch, _getNodeValue(lastNode));\\n } else {\\n // Last node key was larger than the key remainder.\\n // We're going to modify some index of our branch.\\n uint8 branchKey = uint8(lastNodeKey[0]);\\n // Move on to the next nibble.\\n lastNodeKey = Lib_BytesUtils.slice(lastNodeKey, 1);\\n\\n if (lastNodeType == NodeType.LeafNode) {\\n // We're dealing with a leaf node.\\n // We'll modify the key and insert the old leaf node into the branch index.\\n TrieNode memory modifiedLastNode = _makeLeafNode(lastNodeKey, _getNodeValue(lastNode));\\n newBranch = _editBranchIndex(newBranch, branchKey, _getNodeHash(modifiedLastNode.encoded));\\n } else if (lastNodeKey.length != 0) {\\n // We're dealing with a shrinking extension node.\\n // We need to modify the node to decrease the size of the key.\\n TrieNode memory modifiedLastNode = _makeExtensionNode(lastNodeKey, _getNodeValue(lastNode));\\n newBranch = _editBranchIndex(newBranch, branchKey, _getNodeHash(modifiedLastNode.encoded));\\n } else {\\n // We're dealing with an unnecessary extension node.\\n // We're going to delete the node entirely.\\n // Simply insert its current value into the branch index.\\n newBranch = _editBranchIndex(newBranch, branchKey, _getNodeValue(lastNode));\\n }\\n }\\n\\n if (keyRemainder.length == 0) {\\n // We've got nothing left in the key remainder.\\n // Simply insert the value into the branch value slot.\\n newBranch = _editBranchValue(newBranch, _value);\\n // Push the branch into the list of new nodes.\\n newNodes[totalNewNodes] = newBranch;\\n totalNewNodes += 1;\\n } else {\\n // We've got some key remainder to work with.\\n // We'll be inserting a leaf node into the trie.\\n // First, move on to the next nibble.\\n keyRemainder = Lib_BytesUtils.slice(keyRemainder, 1);\\n // Push the branch into the list of new nodes.\\n newNodes[totalNewNodes] = newBranch;\\n totalNewNodes += 1;\\n // Push a new leaf node for our k/v pair.\\n newNodes[totalNewNodes] = _makeLeafNode(keyRemainder, _value);\\n totalNewNodes += 1;\\n }\\n }\\n\\n // Finally, join the old path with our newly created nodes.\\n // Since we're overwriting the last node in the path, we use `_pathLength - 1`.\\n return _joinNodeArrays(_path, _pathLength - 1, newNodes, totalNewNodes);\\n }\\n\\n /**\\n * @notice Computes the trie root from a given path.\\n * @param _nodes Path to some k/v pair.\\n * @param _key Key for the k/v pair.\\n * @return _updatedRoot Root hash for the updated trie.\\n */\\n function _getUpdatedTrieRoot(\\n TrieNode[] memory _nodes,\\n bytes memory _key\\n )\\n private\\n pure\\n returns (\\n bytes32 _updatedRoot\\n )\\n {\\n bytes memory key = Lib_BytesUtils.toNibbles(_key);\\n\\n // Some variables to keep track of during iteration.\\n TrieNode memory currentNode;\\n NodeType currentNodeType;\\n bytes memory previousNodeHash;\\n\\n // Run through the path backwards to rebuild our root hash.\\n for (uint256 i = _nodes.length; i > 0; i--) {\\n // Pick out the current node.\\n currentNode = _nodes[i - 1];\\n currentNodeType = _getNodeType(currentNode);\\n\\n if (currentNodeType == NodeType.LeafNode) {\\n // Leaf nodes are already correctly encoded.\\n // Shift the key over to account for the nodes key.\\n bytes memory nodeKey = _getNodeKey(currentNode);\\n key = Lib_BytesUtils.slice(key, 0, key.length - nodeKey.length);\\n } else if (currentNodeType == NodeType.ExtensionNode) {\\n // Shift the key over to account for the nodes key.\\n bytes memory nodeKey = _getNodeKey(currentNode);\\n key = Lib_BytesUtils.slice(key, 0, key.length - nodeKey.length);\\n\\n // If this node is the last element in the path, it'll be correctly encoded\\n // and we can skip this part.\\n if (previousNodeHash.length > 0) {\\n // Re-encode the node based on the previous node.\\n currentNode = _makeExtensionNode(nodeKey, previousNodeHash);\\n }\\n } else if (currentNodeType == NodeType.BranchNode) {\\n // If this node is the last element in the path, it'll be correctly encoded\\n // and we can skip this part.\\n if (previousNodeHash.length > 0) {\\n // Re-encode the node based on the previous node.\\n uint8 branchKey = uint8(key[key.length - 1]);\\n key = Lib_BytesUtils.slice(key, 0, key.length - 1);\\n currentNode = _editBranchIndex(currentNode, branchKey, previousNodeHash);\\n }\\n }\\n\\n // Compute the node hash for the next iteration.\\n previousNodeHash = _getNodeHash(currentNode.encoded);\\n }\\n\\n // Current node should be the root at this point.\\n // Simply return the hash of its encoding.\\n return keccak256(currentNode.encoded);\\n }\\n\\n /**\\n * @notice Parses an RLP-encoded proof into something more useful.\\n * @param _proof RLP-encoded proof to parse.\\n * @return _parsed Proof parsed into easily accessible structs.\\n */\\n function _parseProof(\\n bytes memory _proof\\n )\\n private\\n pure\\n returns (\\n TrieNode[] memory _parsed\\n )\\n {\\n Lib_RLPReader.RLPItem[] memory nodes = Lib_RLPReader.readList(_proof);\\n TrieNode[] memory proof = new TrieNode[](nodes.length);\\n\\n for (uint256 i = 0; i < nodes.length; i++) {\\n bytes memory encoded = Lib_RLPReader.readBytes(nodes[i]);\\n proof[i] = TrieNode({\\n encoded: encoded,\\n decoded: Lib_RLPReader.readList(encoded)\\n });\\n }\\n\\n return proof;\\n }\\n\\n /**\\n * @notice Picks out the ID for a node. Node ID is referred to as the\\n * \\\"hash\\\" within the specification, but nodes < 32 bytes are not actually\\n * hashed.\\n * @param _node Node to pull an ID for.\\n * @return _nodeID ID for the node, depending on the size of its contents.\\n */\\n function _getNodeID(\\n Lib_RLPReader.RLPItem memory _node\\n )\\n private\\n pure\\n returns (\\n bytes32 _nodeID\\n )\\n {\\n bytes memory nodeID;\\n\\n if (_node.length < 32) {\\n // Nodes smaller than 32 bytes are RLP encoded.\\n nodeID = Lib_RLPReader.readRawBytes(_node);\\n } else {\\n // Nodes 32 bytes or larger are hashed.\\n nodeID = Lib_RLPReader.readBytes(_node);\\n }\\n\\n return Lib_BytesUtils.toBytes32(nodeID);\\n }\\n\\n /**\\n * @notice Gets the path for a leaf or extension node.\\n * @param _node Node to get a path for.\\n * @return _path Node path, converted to an array of nibbles.\\n */\\n function _getNodePath(\\n TrieNode memory _node\\n )\\n private\\n pure\\n returns (\\n bytes memory _path\\n )\\n {\\n return Lib_BytesUtils.toNibbles(Lib_RLPReader.readBytes(_node.decoded[0]));\\n }\\n\\n /**\\n * @notice Gets the key for a leaf or extension node. Keys are essentially\\n * just paths without any prefix.\\n * @param _node Node to get a key for.\\n * @return _key Node key, converted to an array of nibbles.\\n */\\n function _getNodeKey(\\n TrieNode memory _node\\n )\\n private\\n pure\\n returns (\\n bytes memory _key\\n )\\n {\\n return _removeHexPrefix(_getNodePath(_node));\\n }\\n\\n /**\\n * @notice Gets the path for a node.\\n * @param _node Node to get a value for.\\n * @return _value Node value, as hex bytes.\\n */\\n function _getNodeValue(\\n TrieNode memory _node\\n )\\n private\\n pure\\n returns (\\n bytes memory _value\\n )\\n {\\n return Lib_RLPReader.readBytes(_node.decoded[_node.decoded.length - 1]);\\n }\\n\\n /**\\n * @notice Computes the node hash for an encoded node. Nodes < 32 bytes\\n * are not hashed, all others are keccak256 hashed.\\n * @param _encoded Encoded node to hash.\\n * @return _hash Hash of the encoded node. Simply the input if < 32 bytes.\\n */\\n function _getNodeHash(\\n bytes memory _encoded\\n )\\n private\\n pure\\n returns (\\n bytes memory _hash\\n )\\n {\\n if (_encoded.length < 32) {\\n return _encoded;\\n } else {\\n return abi.encodePacked(keccak256(_encoded));\\n }\\n }\\n\\n /**\\n * @notice Determines the type for a given node.\\n * @param _node Node to determine a type for.\\n * @return _type Type of the node; BranchNode/ExtensionNode/LeafNode.\\n */\\n function _getNodeType(\\n TrieNode memory _node\\n )\\n private\\n pure\\n returns (\\n NodeType _type\\n )\\n {\\n if (_node.decoded.length == BRANCH_NODE_LENGTH) {\\n return NodeType.BranchNode;\\n } else if (_node.decoded.length == LEAF_OR_EXTENSION_NODE_LENGTH) {\\n bytes memory path = _getNodePath(_node);\\n uint8 prefix = uint8(path[0]);\\n\\n if (prefix == PREFIX_LEAF_EVEN || prefix == PREFIX_LEAF_ODD) {\\n return NodeType.LeafNode;\\n } else if (prefix == PREFIX_EXTENSION_EVEN || prefix == PREFIX_EXTENSION_ODD) {\\n return NodeType.ExtensionNode;\\n }\\n }\\n\\n revert(\\\"Invalid node type\\\");\\n }\\n\\n /**\\n * @notice Utility; determines the number of nibbles shared between two\\n * nibble arrays.\\n * @param _a First nibble array.\\n * @param _b Second nibble array.\\n * @return _shared Number of shared nibbles.\\n */\\n function _getSharedNibbleLength(\\n bytes memory _a,\\n bytes memory _b\\n )\\n private\\n pure\\n returns (\\n uint256 _shared\\n )\\n {\\n uint256 i = 0;\\n while (_a.length > i && _b.length > i && _a[i] == _b[i]) {\\n i++;\\n }\\n return i;\\n }\\n\\n /**\\n * @notice Utility; converts an RLP-encoded node into our nice struct.\\n * @param _raw RLP-encoded node to convert.\\n * @return _node Node as a TrieNode struct.\\n */\\n function _makeNode(\\n bytes[] memory _raw\\n )\\n private\\n pure\\n returns (\\n TrieNode memory _node\\n )\\n {\\n bytes memory encoded = Lib_RLPWriter.writeList(_raw);\\n\\n return TrieNode({\\n encoded: encoded,\\n decoded: Lib_RLPReader.readList(encoded)\\n });\\n }\\n\\n /**\\n * @notice Utility; converts an RLP-decoded node into our nice struct.\\n * @param _items RLP-decoded node to convert.\\n * @return _node Node as a TrieNode struct.\\n */\\n function _makeNode(\\n Lib_RLPReader.RLPItem[] memory _items\\n )\\n private\\n pure\\n returns (\\n TrieNode memory _node\\n )\\n {\\n bytes[] memory raw = new bytes[](_items.length);\\n for (uint256 i = 0; i < _items.length; i++) {\\n raw[i] = Lib_RLPReader.readRawBytes(_items[i]);\\n }\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Creates a new extension node.\\n * @param _key Key for the extension node, unprefixed.\\n * @param _value Value for the extension node.\\n * @return _node New extension node with the given k/v pair.\\n */\\n function _makeExtensionNode(\\n bytes memory _key,\\n bytes memory _value\\n )\\n private\\n pure\\n returns (\\n TrieNode memory _node\\n )\\n {\\n bytes[] memory raw = new bytes[](2);\\n bytes memory key = _addHexPrefix(_key, false);\\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\\n raw[1] = Lib_RLPWriter.writeBytes(_value);\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Creates a new leaf node.\\n * @dev This function is essentially identical to `_makeExtensionNode`.\\n * Although we could route both to a single method with a flag, it's\\n * more gas efficient to keep them separate and duplicate the logic.\\n * @param _key Key for the leaf node, unprefixed.\\n * @param _value Value for the leaf node.\\n * @return _node New leaf node with the given k/v pair.\\n */\\n function _makeLeafNode(\\n bytes memory _key,\\n bytes memory _value\\n )\\n private\\n pure\\n returns (\\n TrieNode memory _node\\n )\\n {\\n bytes[] memory raw = new bytes[](2);\\n bytes memory key = _addHexPrefix(_key, true);\\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\\n raw[1] = Lib_RLPWriter.writeBytes(_value);\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Creates an empty branch node.\\n * @return _node Empty branch node as a TrieNode struct.\\n */\\n function _makeEmptyBranchNode()\\n private\\n pure\\n returns (\\n TrieNode memory _node\\n )\\n {\\n bytes[] memory raw = new bytes[](BRANCH_NODE_LENGTH);\\n for (uint256 i = 0; i < raw.length; i++) {\\n raw[i] = RLP_NULL_BYTES;\\n }\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Modifies the value slot for a given branch.\\n * @param _branch Branch node to modify.\\n * @param _value Value to insert into the branch.\\n * @return _updatedNode Modified branch node.\\n */\\n function _editBranchValue(\\n TrieNode memory _branch,\\n bytes memory _value\\n )\\n private\\n pure\\n returns (\\n TrieNode memory _updatedNode\\n )\\n {\\n bytes memory encoded = Lib_RLPWriter.writeBytes(_value);\\n _branch.decoded[_branch.decoded.length - 1] = Lib_RLPReader.toRLPItem(encoded);\\n return _makeNode(_branch.decoded);\\n }\\n\\n /**\\n * @notice Modifies a slot at an index for a given branch.\\n * @param _branch Branch node to modify.\\n * @param _index Slot index to modify.\\n * @param _value Value to insert into the slot.\\n * @return _updatedNode Modified branch node.\\n */\\n function _editBranchIndex(\\n TrieNode memory _branch,\\n uint8 _index,\\n bytes memory _value\\n )\\n private\\n pure\\n returns (\\n TrieNode memory _updatedNode\\n )\\n {\\n bytes memory encoded = _value.length < 32 ? _value : Lib_RLPWriter.writeBytes(_value);\\n _branch.decoded[_index] = Lib_RLPReader.toRLPItem(encoded);\\n return _makeNode(_branch.decoded);\\n }\\n\\n /**\\n * @notice Utility; adds a prefix to a key.\\n * @param _key Key to prefix.\\n * @param _isLeaf Whether or not the key belongs to a leaf.\\n * @return _prefixedKey Prefixed key.\\n */\\n function _addHexPrefix(\\n bytes memory _key,\\n bool _isLeaf\\n )\\n private\\n pure\\n returns (\\n bytes memory _prefixedKey\\n )\\n {\\n uint8 prefix = _isLeaf ? uint8(0x02) : uint8(0x00);\\n uint8 offset = uint8(_key.length % 2);\\n bytes memory prefixed = new bytes(2 - offset);\\n prefixed[0] = bytes1(prefix + offset);\\n return abi.encodePacked(prefixed, _key);\\n }\\n\\n /**\\n * @notice Utility; removes a prefix from a path.\\n * @param _path Path to remove the prefix from.\\n * @return _unprefixedKey Unprefixed key.\\n */\\n function _removeHexPrefix(\\n bytes memory _path\\n )\\n private\\n pure\\n returns (\\n bytes memory _unprefixedKey\\n )\\n {\\n if (uint8(_path[0]) % 2 == 0) {\\n return Lib_BytesUtils.slice(_path, 2);\\n } else {\\n return Lib_BytesUtils.slice(_path, 1);\\n }\\n }\\n\\n /**\\n * @notice Utility; combines two node arrays. Array lengths are required\\n * because the actual lengths may be longer than the filled lengths.\\n * Array resizing is extremely costly and should be avoided.\\n * @param _a First array to join.\\n * @param _aLength Length of the first array.\\n * @param _b Second array to join.\\n * @param _bLength Length of the second array.\\n * @return _joined Combined node array.\\n */\\n function _joinNodeArrays(\\n TrieNode[] memory _a,\\n uint256 _aLength,\\n TrieNode[] memory _b,\\n uint256 _bLength\\n )\\n private\\n pure\\n returns (\\n TrieNode[] memory _joined\\n )\\n {\\n TrieNode[] memory ret = new TrieNode[](_aLength + _bLength);\\n\\n // Copy elements from the first array.\\n for (uint256 i = 0; i < _aLength; i++) {\\n ret[i] = _a[i];\\n }\\n\\n // Copy elements from the second array.\\n for (uint256 i = 0; i < _bLength; i++) {\\n ret[i + _aLength] = _b[i];\\n }\\n\\n return ret;\\n }\\n}\\n\",\"keccak256\":\"0x161f65220b8c5cf295232f8c58c2744fbc898bf77da5f9d9c5b2dd673dafc6f6\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/trie/Lib_SecureMerkleTrie.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_MerkleTrie } from \\\"./Lib_MerkleTrie.sol\\\";\\n\\n/**\\n * @title Lib_SecureMerkleTrie\\n */\\nlibrary Lib_SecureMerkleTrie {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * @notice Verifies a proof that a given key/value pair is present in the\\n * Merkle trie.\\n * @param _key Key of the node to search for, as a hex string.\\n * @param _value Value of the node to search for, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the desired node. Unlike\\n * traditional Merkle trees, this proof is executed top-down and consists\\n * of a list of RLP-encoded nodes that make a path down to the target node.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _verified `true` if the k/v pair exists in the trie, `false` otherwise.\\n */\\n function verifyInclusionProof(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bool _verified\\n )\\n {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.verifyInclusionProof(key, _value, _proof, _root);\\n }\\n\\n /**\\n * @notice Verifies a proof that a given key is *not* present in\\n * the Merkle trie.\\n * @param _key Key of the node to search for, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\\n * target node.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _verified `true` if the key is not present in the trie, `false` otherwise.\\n */\\n function verifyExclusionProof(\\n bytes memory _key,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bool _verified\\n )\\n {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.verifyExclusionProof(key, _proof, _root);\\n }\\n\\n /**\\n * @notice Updates a Merkle trie and returns a new root hash.\\n * @param _key Key of the node to update, as a hex string.\\n * @param _value Value of the node to update, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\\n * target node. If the key exists, we can simply update the value.\\n * Otherwise, we need to modify the trie to handle the new k/v pair.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _updatedRoot Root hash of the newly constructed trie.\\n */\\n function update(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bytes32 _updatedRoot\\n )\\n {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.update(key, _value, _proof, _root);\\n }\\n\\n /**\\n * @notice Retrieves the value associated with a given key.\\n * @param _key Key to search for, as hex bytes.\\n * @param _proof Merkle trie inclusion proof for the key.\\n * @param _root Known root of the Merkle trie.\\n * @return _exists Whether or not the key exists.\\n * @return _value Value of the key if it exists.\\n */\\n function get(\\n bytes memory _key,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bool _exists,\\n bytes memory _value\\n )\\n {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.get(key, _proof, _root);\\n }\\n\\n /**\\n * Computes the root hash for a trie with a single node.\\n * @param _key Key for the single node.\\n * @param _value Value for the single node.\\n * @return _updatedRoot Hash of the trie.\\n */\\n function getSingleNodeRootHash(\\n bytes memory _key,\\n bytes memory _value\\n )\\n internal\\n pure\\n returns (\\n bytes32 _updatedRoot\\n )\\n {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.getSingleNodeRootHash(key, _value);\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Computes the secure counterpart to a key.\\n * @param _key Key to get a secure key from.\\n * @return _secureKey Secure version of the key.\\n */\\n function _getSecureKey(\\n bytes memory _key\\n )\\n private\\n pure\\n returns (\\n bytes memory _secureKey\\n )\\n {\\n return abi.encodePacked(keccak256(_key));\\n }\\n}\",\"keccak256\":\"0x79355346f74bb1eb9eeb733cb5d9677d50115c4f390307cbf608fe071a1ada0c\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_Bytes32Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_Byte32Utils\\n */\\nlibrary Lib_Bytes32Utils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \\\"true.\\\"\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as a boolean.\\n */\\n function toBool(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return _in != 0;\\n }\\n\\n /**\\n * Converts a boolean to a bytes32 value.\\n * @param _in Input boolean value.\\n * @return Boolean as a bytes32.\\n */\\n function fromBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in ? 1 : 0));\\n }\\n\\n /**\\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as an address.\\n */\\n function toAddress(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return address(uint160(uint256(_in)));\\n }\\n\\n /**\\n * Converts an address to a bytes32.\\n * @param _in Input address value.\\n * @return Address as a bytes32.\\n */\\n function fromAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in));\\n }\\n\\n /**\\n * Removes the leading zeros from a bytes32 value and returns a new (smaller) bytes value.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 without any leading zeros.\\n */\\n function removeLeadingZeros(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out;\\n\\n assembly {\\n // Figure out how many leading zero bytes to remove.\\n let shift := 0\\n for { let i := 0 } and(lt(i, 32), eq(byte(i, _in), 0)) { i := add(i, 1) } {\\n shift := add(shift, 1)\\n }\\n\\n // Reserve some space for our output and fix the free memory pointer.\\n out := mload(0x40)\\n mstore(0x40, add(out, 0x40))\\n\\n // Shift the value and store it into the output bytes.\\n mstore(add(out, 0x20), shl(mul(shift, 8), _in))\\n\\n // Store the new size (with leading zero bytes removed) in the output byte size.\\n mstore(out, sub(32, shift))\\n }\\n\\n return out;\\n }\\n}\\n\",\"keccak256\":\"0xfa2def593e3fc56a31852c3744aefdaa93cec74e721bfcfeb1e5d166c7c60b64\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_BytesUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_BytesUtils\\n */\\nlibrary Lib_BytesUtils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_start + _length >= _start, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n if (_bytes.length - _start == 0) {\\n return bytes('');\\n }\\n\\n return slice(_bytes, _start, _bytes.length - _start);\\n }\\n\\n function toBytes32PadLeft(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes32)\\n {\\n bytes32 ret;\\n uint256 len = _bytes.length <= 32 ? _bytes.length : 32;\\n assembly {\\n ret := shr(mul(sub(32, len), 8), mload(add(_bytes, 32)))\\n }\\n return ret;\\n }\\n\\n function toBytes32(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes32)\\n {\\n if (_bytes.length < 32) {\\n bytes32 ret;\\n assembly {\\n ret := mload(add(_bytes, 32))\\n }\\n return ret;\\n }\\n\\n return abi.decode(_bytes,(bytes32)); // will truncate if input length > 32 bytes\\n }\\n\\n function toUint256(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (uint256)\\n {\\n return uint256(toBytes32(_bytes));\\n }\\n\\n function toUint24(bytes memory _bytes, uint256 _start) internal pure returns (uint24) {\\n require(_start + 3 >= _start, \\\"toUint24_overflow\\\");\\n require(_bytes.length >= _start + 3 , \\\"toUint24_outOfBounds\\\");\\n uint24 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x3), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toUint8(bytes memory _bytes, uint256 _start) internal pure returns (uint8) {\\n require(_start + 1 >= _start, \\\"toUint8_overflow\\\");\\n require(_bytes.length >= _start + 1 , \\\"toUint8_outOfBounds\\\");\\n uint8 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x1), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toAddress(bytes memory _bytes, uint256 _start) internal pure returns (address) {\\n require(_start + 20 >= _start, \\\"toAddress_overflow\\\");\\n require(_bytes.length >= _start + 20, \\\"toAddress_outOfBounds\\\");\\n address tempAddress;\\n\\n assembly {\\n tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000)\\n }\\n\\n return tempAddress;\\n }\\n\\n function toNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n bytes memory nibbles = new bytes(_bytes.length * 2);\\n\\n for (uint256 i = 0; i < _bytes.length; i++) {\\n nibbles[i * 2] = _bytes[i] >> 4;\\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\\n }\\n\\n return nibbles;\\n }\\n\\n function fromNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n bytes memory ret = new bytes(_bytes.length / 2);\\n\\n for (uint256 i = 0; i < ret.length; i++) {\\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\\n }\\n\\n return ret;\\n }\\n\\n function equal(\\n bytes memory _bytes,\\n bytes memory _other\\n )\\n internal\\n pure\\n returns (bool)\\n {\\n return keccak256(_bytes) == keccak256(_other);\\n }\\n}\\n\",\"keccak256\":\"0x0adf22e1b22ba09911e859f64cb3b484e992be4f9fd3b09088e6225bf8d06ce0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_ErrorUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/**\\n * @title Lib_ErrorUtils\\n */\\nlibrary Lib_ErrorUtils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Encodes an error string into raw solidity-style revert data.\\n * (i.e. ascii bytes, prefixed with bytes4(keccak(\\\"Error(string))\\\"))\\n * Ref: https://docs.soliditylang.org/en/v0.8.2/control-structures.html?highlight=Error(string)#panic-via-assert-and-error-via-require\\n * @param _reason Reason for the reversion.\\n * @return Standard solidity revert data for the given reason.\\n */\\n function encodeRevertString(\\n string memory _reason\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return abi.encodeWithSignature(\\n \\\"Error(string)\\\",\\n _reason\\n );\\n }\\n}\\n\",\"keccak256\":\"0xfc64ec4a81fb50865b502a0004ed154e8598e1a313db77303fc95e41f536e6b7\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_EthUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// @unsupported: ovm\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"./Lib_Bytes32Utils.sol\\\";\\n\\n/**\\n * @title Lib_EthUtils\\n */\\nlibrary Lib_EthUtils {\\n\\n /***********************************\\n * Internal Functions: Code Access *\\n ***********************************/\\n\\n /**\\n * Gets the code for a given address.\\n * @param _address Address to get code for.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return _code Code read from the contract.\\n */\\n function getCode(\\n address _address,\\n uint256 _offset,\\n uint256 _length\\n )\\n internal\\n view\\n returns (\\n bytes memory _code\\n )\\n {\\n assembly {\\n _code := mload(0x40)\\n mstore(0x40, add(_code, add(_length, 0x20)))\\n mstore(_code, _length)\\n extcodecopy(_address, add(_code, 0x20), _offset, _length)\\n }\\n\\n return _code;\\n }\\n\\n /**\\n * Gets the full code for a given address.\\n * @param _address Address to get code for.\\n * @return _code Full code of the contract.\\n */\\n function getCode(\\n address _address\\n )\\n internal\\n view\\n returns (\\n bytes memory _code\\n )\\n {\\n return getCode(\\n _address,\\n 0,\\n getCodeSize(_address)\\n );\\n }\\n\\n /**\\n * Gets the size of a contract's code in bytes.\\n * @param _address Address to get code size for.\\n * @return _codeSize Size of the contract's code in bytes.\\n */\\n function getCodeSize(\\n address _address\\n )\\n internal\\n view\\n returns (\\n uint256 _codeSize\\n )\\n {\\n assembly {\\n _codeSize := extcodesize(_address)\\n }\\n\\n return _codeSize;\\n }\\n\\n /**\\n * Gets the hash of a contract's code.\\n * @param _address Address to get a code hash for.\\n * @return _codeHash Hash of the contract's code.\\n */\\n function getCodeHash(\\n address _address\\n )\\n internal\\n view\\n returns (\\n bytes32 _codeHash\\n )\\n {\\n assembly {\\n _codeHash := extcodehash(_address)\\n }\\n\\n return _codeHash;\\n }\\n\\n\\n /*****************************************\\n * Internal Functions: Contract Creation *\\n *****************************************/\\n\\n /**\\n * Creates a contract with some given initialization code.\\n * @param _code Contract initialization code.\\n * @return _created Address of the created contract.\\n */\\n function createContract(\\n bytes memory _code\\n )\\n internal\\n returns (\\n address _created\\n )\\n {\\n assembly {\\n _created := create(\\n 0,\\n add(_code, 0x20),\\n mload(_code)\\n )\\n }\\n\\n return _created;\\n }\\n\\n /**\\n * Computes the address that would be generated by CREATE.\\n * @param _creator Address creating the contract.\\n * @param _nonce Creator's nonce.\\n * @return _address Address to be generated by CREATE.\\n */\\n function getAddressForCREATE(\\n address _creator,\\n uint256 _nonce\\n )\\n internal\\n pure\\n returns (\\n address _address\\n )\\n {\\n bytes[] memory encoded = new bytes[](2);\\n encoded[0] = Lib_RLPWriter.writeAddress(_creator);\\n encoded[1] = Lib_RLPWriter.writeUint(_nonce);\\n\\n bytes memory encodedList = Lib_RLPWriter.writeList(encoded);\\n return Lib_Bytes32Utils.toAddress(keccak256(encodedList));\\n }\\n\\n /**\\n * Computes the address that would be generated by CREATE2.\\n * @param _creator Address creating the contract.\\n * @param _bytecode Bytecode of the contract to be created.\\n * @param _salt 32 byte salt value mixed into the hash.\\n * @return _address Address to be generated by CREATE2.\\n */\\n function getAddressForCREATE2(\\n address _creator,\\n bytes memory _bytecode,\\n bytes32 _salt\\n )\\n internal\\n pure\\n returns (address _address)\\n {\\n bytes32 hashedData = keccak256(abi.encodePacked(\\n byte(0xff),\\n _creator,\\n _salt,\\n keccak256(_bytecode)\\n ));\\n\\n return Lib_Bytes32Utils.toAddress(hashedData);\\n }\\n}\\n\",\"keccak256\":\"0x5fdf009da11f90cb5e99e5cd160d07bb744a5a2055774a646bdf277ad6910595\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_ErrorUtils } from \\\"../utils/Lib_ErrorUtils.sol\\\";\\n\\n/**\\n * @title Lib_SafeExecutionManagerWrapper\\n * @dev The Safe Execution Manager Wrapper provides functions which facilitate writing OVM safe \\n * code using the standard solidity compiler, by routing all its operations through the Execution \\n * Manager.\\n * \\n * Compiler used: solc\\n * Runtime target: OVM\\n */\\nlibrary Lib_SafeExecutionManagerWrapper {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Performs a safe ovmCALL.\\n * @param _gasLimit Gas limit for the call.\\n * @param _target Address to call.\\n * @param _calldata Data to send to the call.\\n * @return _success Whether or not the call reverted.\\n * @return _returndata Data returned by the call.\\n */\\n function safeCALL(\\n uint256 _gasLimit,\\n address _target,\\n bytes memory _calldata\\n )\\n internal\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCALL(uint256,address,bytes)\\\",\\n _gasLimit,\\n _target,\\n _calldata\\n )\\n );\\n\\n return abi.decode(returndata, (bool, bytes));\\n }\\n\\n /**\\n * Performs a safe ovmDELEGATECALL.\\n * @param _gasLimit Gas limit for the call.\\n * @param _target Address to call.\\n * @param _calldata Data to send to the call.\\n * @return _success Whether or not the call reverted.\\n * @return _returndata Data returned by the call.\\n */\\n function safeDELEGATECALL(\\n uint256 _gasLimit,\\n address _target,\\n bytes memory _calldata\\n )\\n internal\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmDELEGATECALL(uint256,address,bytes)\\\",\\n _gasLimit,\\n _target,\\n _calldata\\n )\\n );\\n\\n return abi.decode(returndata, (bool, bytes));\\n }\\n\\n /**\\n * Performs a safe ovmCREATE call.\\n * @param _gasLimit Gas limit for the creation.\\n * @param _bytecode Code for the new contract.\\n * @return _contract Address of the created contract.\\n */\\n function safeCREATE(\\n uint256 _gasLimit,\\n bytes memory _bytecode\\n )\\n internal\\n returns (\\n address,\\n bytes memory\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n _gasLimit,\\n abi.encodeWithSignature(\\n \\\"ovmCREATE(bytes)\\\",\\n _bytecode\\n )\\n );\\n\\n return abi.decode(returndata, (address, bytes));\\n }\\n\\n /**\\n * Performs a safe ovmEXTCODESIZE call.\\n * @param _contract Address of the contract to query the size of.\\n * @return _EXTCODESIZE Size of the requested contract in bytes.\\n */\\n function safeEXTCODESIZE(\\n address _contract\\n )\\n internal\\n returns (\\n uint256 _EXTCODESIZE\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmEXTCODESIZE(address)\\\",\\n _contract\\n )\\n );\\n\\n return abi.decode(returndata, (uint256));\\n }\\n\\n /**\\n * Performs a safe ovmCHAINID call.\\n * @return _CHAINID Result of calling ovmCHAINID.\\n */\\n function safeCHAINID()\\n internal\\n returns (\\n uint256 _CHAINID\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCHAINID()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (uint256));\\n }\\n\\n /**\\n * Performs a safe ovmCALLER call.\\n * @return _CALLER Result of calling ovmCALLER.\\n */\\n function safeCALLER()\\n internal\\n returns (\\n address _CALLER\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCALLER()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (address));\\n }\\n\\n /**\\n * Performs a safe ovmADDRESS call.\\n * @return _ADDRESS Result of calling ovmADDRESS.\\n */\\n function safeADDRESS()\\n internal\\n returns (\\n address _ADDRESS\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmADDRESS()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (address));\\n }\\n\\n /**\\n * Performs a safe ovmGETNONCE call.\\n * @return _nonce Result of calling ovmGETNONCE.\\n */\\n function safeGETNONCE()\\n internal\\n returns (\\n uint256 _nonce\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmGETNONCE()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (uint256));\\n }\\n\\n /**\\n * Performs a safe ovmINCREMENTNONCE call.\\n */\\n function safeINCREMENTNONCE()\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmINCREMENTNONCE()\\\"\\n )\\n );\\n }\\n\\n /**\\n * Performs a safe ovmCREATEEOA call.\\n * @param _messageHash Message hash which was signed by EOA\\n * @param _v v value of signature (0 or 1)\\n * @param _r r value of signature\\n * @param _s s value of signature\\n */\\n function safeCREATEEOA(\\n bytes32 _messageHash,\\n uint8 _v,\\n bytes32 _r,\\n bytes32 _s\\n )\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCREATEEOA(bytes32,uint8,bytes32,bytes32)\\\",\\n _messageHash,\\n _v,\\n _r,\\n _s\\n )\\n );\\n }\\n\\n /**\\n * Performs a safe REVERT.\\n * @param _reason String revert reason to pass along with the REVERT.\\n */\\n function safeREVERT(\\n string memory _reason\\n )\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmREVERT(bytes)\\\",\\n Lib_ErrorUtils.encodeRevertString(\\n _reason\\n )\\n )\\n );\\n }\\n\\n /**\\n * Performs a safe \\\"require\\\".\\n * @param _condition Boolean condition that must be true or will revert.\\n * @param _reason String revert reason to pass along with the REVERT.\\n */\\n function safeREQUIRE(\\n bool _condition,\\n string memory _reason\\n )\\n internal\\n {\\n if (!_condition) {\\n safeREVERT(\\n _reason\\n );\\n }\\n }\\n\\n /**\\n * Performs a safe ovmSLOAD call.\\n */\\n function safeSLOAD(\\n bytes32 _key\\n )\\n internal\\n returns (\\n bytes32\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmSLOAD(bytes32)\\\",\\n _key\\n )\\n );\\n\\n return abi.decode(returndata, (bytes32));\\n }\\n\\n /**\\n * Performs a safe ovmSSTORE call.\\n */\\n function safeSSTORE(\\n bytes32 _key,\\n bytes32 _value\\n )\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmSSTORE(bytes32,bytes32)\\\",\\n _key,\\n _value\\n )\\n );\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Performs an ovm interaction and the necessary safety checks.\\n * @param _gasLimit Gas limit for the interaction.\\n * @param _calldata Data to send to the OVM_ExecutionManager (encoded with sighash).\\n * @return _returndata Data sent back by the OVM_ExecutionManager.\\n */\\n function _safeExecutionManagerInteraction(\\n uint256 _gasLimit,\\n bytes memory _calldata\\n )\\n private\\n returns (\\n bytes memory _returndata\\n )\\n {\\n address ovmExecutionManager = msg.sender;\\n (\\n bool success,\\n bytes memory returndata\\n ) = ovmExecutionManager.call{gas: _gasLimit}(_calldata);\\n\\n if (success == false) {\\n assembly {\\n revert(add(returndata, 0x20), mload(returndata))\\n }\\n } else if (returndata.length == 1) {\\n assembly {\\n return(0, 1)\\n }\\n } else {\\n return returndata;\\n }\\n }\\n\\n function _safeExecutionManagerInteraction(\\n bytes memory _calldata\\n )\\n private\\n returns (\\n bytes memory _returndata\\n )\\n {\\n return _safeExecutionManagerInteraction(\\n gasleft(),\\n _calldata\\n );\\n }\\n}\\n\",\"keccak256\":\"0x41e146e7912af794a17cd43c5a276674be956bfa8f3ca5b451bcb82d81e6f492\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x608060405234801561001057600080fd5b506040516148cb3803806148cb8339818101604052602081101561003357600080fd5b5051600080546001600160a01b039092166001600160a01b0319909216919091179055614866806100656000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c806322d1470214610046578063299ca4781461009a578063461a4478146100a2575b600080fd5b61007e6004803603608081101561005c57600080fd5b506001600160a01b038135169060208101359060408101359060600135610148565b604080516001600160a01b039092168252519081900360200190f35b61007e610229565b61007e600480360360208110156100b857600080fd5b8101906020810181356401000000008111156100d357600080fd5b8201836020820111156100e557600080fd5b8035906020019184600183028401116401000000008311171561010757600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610238945050505050565b600061017c6040518060400160405280601181526020017027ab26afa33930bab22b32b934b334b2b960791b815250610238565b6001600160a01b0316336001600160a01b0316146101cb5760405162461bcd60e51b81526004018080602001828103825260318152602001806148296031913960400191505060405180910390fd5b848484846040516101db90610314565b80856001600160a01b03168152602001848152602001838152602001828152602001945050505050604051809103906000f08015801561021f573d6000803e3d6000fd5b5095945050505050565b6000546001600160a01b031681565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b83811015610298578181015183820152602001610280565b50505050905090810190601f1680156102c55780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b1580156102e257600080fd5b505afa1580156102f6573d6000803e3d6000fd5b505050506040513d602081101561030c57600080fd5b505192915050565b614507806103228339019056fe60806040523480156200001157600080fd5b506040516200450738038062004507833981016040819052620000349162000232565b600080546001600160a01b0319166001600160a01b038616179055600583905560028290556003829055600681905560408051808201909152601781527f4f564d5f53746174654d616e61676572466163746f72790000000000000000006020820152620000a29062000150565b6001600160a01b0316639ed93318306040518263ffffffff1660e01b8152600401620000cf919062000299565b602060405180830381600087803b158015620000ea57600080fd5b505af1158015620000ff573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000125919062000273565b600180546001600160a01b0319166001600160a01b039290921691909117905550620002c692505050565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b83811015620001b257818101518382015260200162000198565b50505050905090810190601f168015620001e05780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b158015620001fe57600080fd5b505afa15801562000213573d6000803e3d6000fd5b505050506040513d60208110156200022a57600080fd5b505192915050565b6000806000806080858703121562000248578384fd5b84516200025581620002ad565b60208601516040870151606090970151919890975090945092505050565b60006020828403121562000285578081fd5b81516200029281620002ad565b9392505050565b6001600160a01b0391909116815260200190565b6001600160a01b0381168114620002c357600080fd5b50565b61423180620002d66000396000f3fe608060405234801561001057600080fd5b50600436106100cf5760003560e01c8063845fe7a31161008c578063b2fa1c9e11610066578063b2fa1c9e14610185578063b52805711461019a578063b9194310146101a2578063c1c618b8146101b5576100cf565b8063845fe7a314610155578063a244316a14610168578063b1c9fe6e14610170576100cf565b8063299ca478146100d45780632e1ac36c146100f25780632eb1375814610107578063461a44781461011a578063732f960b1461012d578063805e9d3014610140575b600080fd5b6100dc6101bd565b6040516100e99190613bf9565b60405180910390f35b6101056101003660046138be565b6101cc565b005b6101056101153660046138fe565b610565565b6100dc61012836600461397d565b6108a1565b61010561013b366004613a41565b61097f565b610148610c4a565b6040516100e99190613b52565b6101056101633660046138be565b610c50565b610105610f7c565b610178611103565b6040516100e99190613cab565b61018d61110c565b6040516100e99190613ca0565b6100dc611127565b6101056101b036600461385f565b611136565b610148611450565b6000546001600160a01b031681565b60018060045460ff1660028111156101e057fe5b146102065760405162461bcd60e51b81526004016101fd90613ffc565b60405180910390fd5b60025460065460005a6001546040516363b285f960e11b81529192506001600160a01b03169063c7650bf290610242908a908a90600401613c0d565b602060405180830381600087803b15801561025c57600080fd5b505af1158015610270573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610294919061394b565b15156001146102b55760405162461bcd60e51b81526004016101fd90613da7565b60015460405163fbcbc0f160e01b81526000916001600160a01b03169063fbcbc0f1906102e6908b90600401613bf9565b60c06040518083038186803b1580156102fe57600080fd5b505afa158015610312573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061033691906139c2565b600154604051631aaf392f60e01b81529192506000916001600160a01b0390911690631aaf392f9061036e908c908c90600401613c0d565b60206040518083038186803b15801561038657600080fd5b505afa15801561039a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103be9190613965565b90506103ff886040516020016103d49190613b52565b6040516020818303038152906040526103f46103ef84611456565b61149f565b898560400151611509565b6040808401919091526001549051638f3b964760e01b81526001600160a01b0390911690638f3b964790610439908c908690600401613c47565b600060405180830381600087803b15801561045357600080fd5b505af1158015610467573d6000803e3d6000fd5b505050507f3e3ed1a676a2754a041b49bf752e0f167c8753495e36c320fe01d1ef7476253c898960405161049c929190613c0d565b60405180910390a1505060005a820390506104dd6040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506108a1565b6001600160a01b0316631e16e92f858533856040518563ffffffff1660e01b815260040180858152602001848152602001836001600160a01b03168152602001828152602001945050505050600060405180830381600087803b15801561054357600080fd5b505af1158015610557573d6000803e3d6000fd5b505050505050505050505050565b60018060045460ff16600281111561057957fe5b146105965760405162461bcd60e51b81526004016101fd90613ffc565b60025460065460005a9050600160009054906101000a90046001600160a01b03166001600160a01b03166399056ba96040518163ffffffff1660e01b815260040160206040518083038186803b1580156105ef57600080fd5b505afa158015610603573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106279190613965565b156106445760405162461bcd60e51b81526004016101fd90613e88565b600154604051630b38106960e11b81526001600160a01b039091169063167020d290610674908990600401613bf9565b602060405180830381600087803b15801561068e57600080fd5b505af11580156106a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106c6919061394b565b15156001146106e75760405162461bcd60e51b81526004016101fd90613f42565b60015460405163fbcbc0f160e01b81526000916001600160a01b03169063fbcbc0f190610718908a90600401613bf9565b60c06040518083038186803b15801561073057600080fd5b505afa158015610744573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061076891906139c2565b90506107a78760405160200161077e9190613b35565b60405160208183030381529060405261079e6107998461152f565b61156f565b88600354611509565b6003556040517fcec9ef675d775706a02b43afe48af52c5019bc50f99582e3208c6ff55d59c008906107da908990613bf9565b60405180910390a15060005a8203905061081a6040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506108a1565b6001600160a01b0316631e16e92f858533856040518563ffffffff1660e01b815260040180858152602001848152602001836001600160a01b03168152602001828152602001945050505050600060405180830381600087803b15801561088057600080fd5b505af1158015610894573d6000803e3d6000fd5b5050505050505050505050565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b838110156109015781810151838201526020016108e9565b50505050905090810190601f16801561092e5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561094b57600080fd5b505afa15801561095f573d6000803e3d6000fd5b505050506040513d602081101561097557600080fd5b505190505b919050565b60008060045460ff16600281111561099357fe5b146109b05760405162461bcd60e51b81526004016101fd90613ffc565b60025460065460005a90506006546109c786611678565b146109e45760405162461bcd60e51b81526004016101fd9061404d565b6103e88560a0015161040802816109f757fe5b04620186a0015a1015610a1c5760405162461bcd60e51b81526004016101fd90613ee5565b6000610a536040518060400160405280601481526020017327ab26afa2bc32b1baba34b7b726b0b730b3b2b960611b8152506108a1565b600154604051631381ba4d60e01b81529192506001600160a01b031690631381ba4d90610a84908490600401613bf9565b600060405180830381600087803b158015610a9e57600080fd5b505af1158015610ab2573d6000803e3d6000fd5b5050600154604051639be3ad6760e01b81526001600160a01b038086169450639be3ad679350610ae9928b929116906004016140e1565b600060405180830381600087803b158015610b0357600080fd5b505af1158015610b17573d6000803e3d6000fd5b5050600154604051631381ba4d60e01b81526001600160a01b039091169250631381ba4d9150610b4c90600090600401613bf9565b600060405180830381600087803b158015610b6657600080fd5b505af1158015610b7a573d6000803e3d6000fd5b50506004805460ff191660011790555060009150505a82039050610bc46040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506108a1565b6001600160a01b0316631e16e92f858533856040518563ffffffff1660e01b815260040180858152602001848152602001836001600160a01b03168152602001828152602001945050505050600060405180830381600087803b158015610c2a57600080fd5b505af1158015610c3e573d6000803e3d6000fd5b50505050505050505050565b60025490565b60008060045460ff166002811115610c6457fe5b14610c815760405162461bcd60e51b81526004016101fd90613ffc565b60025460065460005a600154604051630ad2267960e01b81529192506001600160a01b031690630ad2267990610cbd908a908a90600401613c0d565b60206040518083038186803b158015610cd557600080fd5b505afa158015610ce9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d0d919061394b565b15610d2a5760405162461bcd60e51b81526004016101fd90613cbf565b60015460405163c8e40fbf60e01b81526001600160a01b039091169063c8e40fbf90610d5a908a90600401613bf9565b60206040518083038186803b158015610d7257600080fd5b505afa158015610d86573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610daa919061394b565b1515600114610dcb5760405162461bcd60e51b81526004016101fd90614084565b60015460405163136e2d8960e11b81526000916001600160a01b0316906326dc5b1290610dfc908b90600401613bf9565b60206040518083038186803b158015610e1457600080fd5b505afa158015610e28573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e4c9190613965565b905060007f56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421821415610e8057506000610edd565b600080610ead8a604051602001610e979190613b52565b6040516020818303038152906040528a86611691565b909250905060018215151415610ed557610ece610ec9826116ba565b6116cd565b9250610eda565b600092505b50505b600154604051635c17d62960e01b81526001600160a01b0390911690635c17d62990610f11908c908c908690600401613c26565b600060405180830381600087803b158015610f2b57600080fd5b505af1158015610f3f573d6000803e3d6000fd5b50505050505060005a820390506104dd6040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506108a1565b60018060045460ff166002811115610f9057fe5b14610fad5760405162461bcd60e51b81526004016101fd90613ffc565b600160009054906101000a90046001600160a01b03166001600160a01b031663d7bd4a2a6040518163ffffffff1660e01b815260040160206040518083038186803b158015610ffb57600080fd5b505afa15801561100f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110339190613965565b156110505760405162461bcd60e51b81526004016101fd90613d4a565b600160009054906101000a90046001600160a01b03166001600160a01b03166399056ba96040518163ffffffff1660e01b815260040160206040518083038186803b15801561109e57600080fd5b505afa1580156110b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110d69190613965565b156110f35760405162461bcd60e51b81526004016101fd90613f9f565b506004805460ff19166002179055565b60045460ff1681565b6000600260045460ff16600281111561112157fe5b14905090565b6001546001600160a01b031681565b60008060045460ff16600281111561114a57fe5b146111675760405162461bcd60e51b81526004016101fd90613ffc565b60025460065460005a60015460405163c8e40fbf60e01b81529192506001600160a01b03169063c8e40fbf906111a1908a90600401613bf9565b60206040518083038186803b1580156111b957600080fd5b505afa1580156111cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111f1919061394b565b15801561127b57506001546040516307a1294560e01b81526001600160a01b03909116906307a1294590611229908a90600401613bf9565b60206040518083038186803b15801561124157600080fd5b505afa158015611255573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611279919061394b565b155b6112975760405162461bcd60e51b81526004016101fd90613d04565b6000806112c6896040516020016112ae9190613b35565b60405160208183030381529060405288600254611691565b9092509050600182151514156113e75760006112e1826116fc565b606081015190915089907fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470141561131a57506000611345565b81606001516113288261178e565b146113455760405162461bcd60e51b81526004016101fd90613e05565b6001546040805160c08101825284518152602080860151908201528482015181830152606080860151908201526001600160a01b038481166080830152600060a08301529151638f3b964760e01b81529190921691638f3b9647916113ae918f91600401613c47565b600060405180830381600087803b1580156113c857600080fd5b505af11580156113dc573d6000803e3d6000fd5b505050505050611417565b600154604051630d631c9d60e31b81526001600160a01b0390911690636b18e4e890610f11908c90600401613bf9565b505060005a820390506104dd6040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506108a1565b60035490565b6060806000805b6020811085821a151615611477576001918201910161145d565b5060405191506040820160405283600882021b60208301528060200382525080915050919050565b606080825160011480156114c757506080836000815181106114bd57fe5b016020015160f81c105b156114d3575081611503565b6114df83516080611792565b836040516020016114f1929190613b5b565b60405160208183030381529060405290505b92915050565b600080611515866118e1565b905061152381868686611911565b9150505b949350505050565b61153761376a565b604051806080016040528083600001518152602001836020015181526020018360400151815260200183606001518152509050919050565b60408051600480825260a0820190925260609160009190816020015b606081526020019060019003908161158b57505083519091506115b1906103ef90611456565b816000815181106115be57fe5b60200260200101819052506115dc6103ef846020015160001b611456565b816001815181106115e957fe5b6020026020010181905250611620836040015160405160200161160c9190613b52565b60405160208183030381529060405261149f565b8160028151811061162d57fe5b6020026020010181905250611650836060015160405160200161160c9190613b52565b8160038151811061165d57fe5b6020026020010181905250611671816119ac565b9392505050565b6000611683826119f0565b805190602001209050919050565b6000606060006116a0866118e1565b90506116ad818686611a2b565b9250925050935093915050565b60606115036116c883611afe565b611b23565b60008060006020845111156116e35760206116e6565b83515b6020858101519190036008021c92505050919050565b61170461376a565b600061170f83611bb2565b905060405180608001604052806117398360008151811061172c57fe5b6020026020010151611bc5565b815260200161174e8360018151811061172c57fe5b81526020016117708360028151811061176357fe5b6020026020010151611bcc565b81526020016117858360038151811061176357fe5b90529392505050565b3f90565b60608060388410156117ec576040805160018082528183019092529060208201818036833701905050905082840160f81b816000815181106117d057fe5b60200101906001600160f81b031916908160001a905350611671565b600060015b8086816117fa57fe5b041561180f57600190910190610100026117f1565b816001016001600160401b038111801561182857600080fd5b506040519080825280601f01601f191660200182016040528015611853576020820181803683370190505b50925084820160370160f81b8360008151811061186c57fe5b60200101906001600160f81b031916908160001a905350600190505b8181116118d8576101008183036101000a87816118a157fe5b04816118a957fe5b0660f81b8382815181106118b957fe5b60200101906001600160f81b031916908160001a905350600101611888565b50509392505050565b606081805190602001206040516020016118fb9190613b52565b6040516020818303038152906040529050919050565b6040805180820190915260018152600160ff1b60209091015260007f56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b4218214156119655761195e8585611cc6565b9050611527565b600061197084611cea565b9050600080611980838987611dc0565b509150915060006119938484848b612163565b905061199f818a61247b565b9998505050505050505050565b606060006119b9836125d4565b90506119c7815160c0611792565b816040516020016119d9929190613b5b565b604051602081830303815290604052915050919050565b6060816000015182602001518360400151846060015185608001518660a001518760c001516040516020016118fb9796959493929190613b8a565b600060606000611a3a85611cea565b90506000806000611a4c848a89611dc0565b81519295509093509150158080611a605750815b611ab1576040805162461bcd60e51b815260206004820152601a60248201527f50726f76696465642070726f6f6620697320696e76616c69642e000000000000604482015290519081900360640190fd5b600081611acd5760405180602001604052806000815250611aec565b611aec866001870381518110611adf57fe5b60200260200101516126dd565b919b919a509098505050505050505050565b611b06613791565b506040805180820190915281518152602082810190820152919050565b60606000806000611b33856126f9565b919450925090506000816001811115611b4857fe5b14611b9a576040805162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c502062797465732076616c75652e0000000000000000604482015290519081900360640190fd5b611ba985602001518484612a22565b95945050505050565b6060611503611bc083611afe565b612acf565b6000611503825b6000602182600001511115611c28576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e000000000000604482015290519081900360640190fd5b6000806000611c36856126f9565b919450925090506000816001811115611c4b57fe5b14611c9d576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e000000000000604482015290519081900360640190fd5b602080860151840180519091841015611cbc5760208490036101000a90045b9695505050505050565b6000611cda611cd484612c45565b83612d41565b5180516020909101209392505050565b60606000611cf783611bb2565b9050600081516001600160401b0381118015611d1257600080fd5b50604051908082528060200260200182016040528015611d4c57816020015b611d396137ab565b815260200190600190039081611d315790505b50905060005b8251811015611db8576000611d79848381518110611d6c57fe5b6020026020010151611b23565b90506040518060400160405280828152602001611d9583611bb2565b815250838381518110611da457fe5b602090810291909101015250600101611d52565b509392505050565b60006060818080611dd087612c45565b905085600080611dde6137ab565b60005b8c5181101561213b578c8181518110611df657fe5b6020026020010151915082840193506001870196508360001415611e6a57815180516020909101208514611e65576040805162461bcd60e51b8152602060048201526011602482015270092dcecc2d8d2c840e4dedee840d0c2e6d607b1b604482015290519081900360640190fd5b611f31565b815151602011611ed157815180516020909101208514611e65576040805162461bcd60e51b815260206004820152601b60248201527f496e76616c6964206c6172676520696e7465726e616c20686173680000000000604482015290519081900360640190fd5b84611edf8360000151612dd5565b14611f31576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420696e7465726e616c206e6f64652068617368000000000000604482015290519081900360640190fd5b60208201515160111415611fa0578551841415611f4d5761213b565b6000868581518110611f5b57fe5b602001015160f81c60f81b60f81c9050600083602001518260ff1681518110611f8057fe5b60200260200101519050611f9381612e01565b9650600194505050612133565b600282602001515114156120e6576000611fb983612e37565b9050600081600081518110611fca57fe5b016020015160f81c9050600181166002036000611fea8460ff8416612e55565b90506000611ff88b8a612e55565b905060006120068383612e86565b905060ff85166002148061201d575060ff85166003145b1561204f578083511480156120325750808251145b1561203c57988901985b50600160ff1b995061213b945050505050565b60ff85161580612062575060ff85166001145b156120af578061207f5750600160ff1b995061213b945050505050565b6120a0886020015160018151811061209357fe5b6020026020010151612e01565b9a509750612133945050505050565b60405162461bcd60e51b81526004018080602001828103825260268152602001806141ff6026913960400191505060405180910390fd5b6040805162461bcd60e51b815260206004820152601d60248201527f526563656976656420616e20756e706172736561626c65206e6f64652e000000604482015290519081900360640190fd5b600101611de1565b50600160ff1b84148661214e8786612e55565b909e909d50909b509950505050505050505050565b60606000839050600086600187038151811061217b57fe5b60200260200101519050600061219082612eec565b6040805160038082526080820190925291925060009190816020015b6121b46137ab565b8152602001906001900390816121ac5790505090506000845160001480156121e7575060028360028111156121e557fe5b145b1561221d576121fe6121f885612fc2565b88612d41565b82828151811061220a57fe5b602090810291909101015260010161245e565b600083600281111561222b57fe5b1415612291578451612260576122418488612fd5565b82828151811061224d57fe5b602090810291909101015260010161228c565b8382828151811061226d57fe5b60200260200101819052506001810190506121fe6121f8866001612e55565b61245e565b600061229c85612fc2565b905060006122aa8288612e86565b9050801561230b5760006122c083600084613020565b90506122d4816122cf8c613170565b6131b1565b8585815181106122e057fe5b60200260200101819052506001840193506122fb8383612e55565b92506123078883612e55565b9750505b60006123156131f5565b905082516000141561233a576123338161232e896126dd565b612fd5565b90506123d2565b60008360008151811061234957fe5b016020015160f81c905061235e846001612e55565b9350600287600281111561236e57fe5b14156123a9576000612388856123838b6126dd565b612d41565b90506123a1838361239c8460000151613170565b613282565b9250506123d0565b8351156123bf576000612388856122cf8b6126dd565b6123cd828261239c8b6126dd565b91505b505b8751612407576123e2818b612fd5565b9050808585815181106123f157fe5b602002602001018190525060018401935061245a565b612412886001612e55565b97508085858151811061242157fe5b602002602001018190525060018401935061243c888b612d41565b85858151811061244857fe5b60200260200101819052506001840193505b5050505b61246d8a60018b0384846132db565b9a9950505050505050505050565b60008061248783612c45565b90506124916137ab565b84516000906060905b80156125bf578760018203815181106124af57fe5b602002602001015193506124c284612eec565b925060028360028111156124d257fe5b14156124fd5760006124e385612fc2565b90506124f58660008351895103613020565b9550506125a9565b600183600281111561250b57fe5b141561254b57600061251c85612fc2565b905061252e8660008351895103613020565b8351909650156125455761254281846131b1565b94505b506125a9565b600083600281111561255957fe5b14156125a9578151156125a95760008560018751038151811061257857fe5b602001015160f81c60f81b60f81c90506125988660006001895103613020565b95506125a5858285613282565b9450505b83516125b490613170565b91506000190161249a565b50509051805160209091012095945050505050565b60608151600014156125f5575060408051600081526020810190915261097a565b6000805b83518110156126285783818151811061260e57fe5b6020026020010151518201915080806001019150506125f9565b6000826001600160401b038111801561264057600080fd5b506040519080825280601f01601f19166020018201604052801561266b576020820181803683370190505b50600092509050602081015b85518310156126d457600086848151811061268e57fe5b6020026020010151905060006020820190506126ac838284516133bd565b8785815181106126b857fe5b6020026020010151518301925050508280600101935050612677565b50949350505050565b60208101518051606091611503916000198101908110611d6c57fe5b600080600080846000015111612756576040805162461bcd60e51b815260206004820152601860248201527f524c50206974656d2063616e6e6f74206265206e756c6c2e0000000000000000604482015290519081900360640190fd5b6020840151805160001a607f811161277b576000600160009450945094505050612a1b565b60b781116127f0578551607f1982019081106127de576040805162461bcd60e51b815260206004820152601960248201527f496e76616c696420524c502073686f727420737472696e672e00000000000000604482015290519081900360640190fd5b60019550935060009250612a1b915050565b60bf81116128d457855160b6198201908110612853576040805162461bcd60e51b815260206004820152601f60248201527f496e76616c696420524c50206c6f6e6720737472696e67206c656e6774682e00604482015290519081900360640190fd5b6000816020036101000a60018501510490508082018860000151116128bf576040805162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c50206c6f6e6720737472696e672e0000000000000000604482015290519081900360640190fd5b60019091019550935060009250612a1b915050565b60f7811161294857855160bf198201908110612937576040805162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c502073686f7274206c6973742e000000000000000000604482015290519081900360640190fd5b600195509350849250612a1b915050565b855160f61982019081106129a3576040805162461bcd60e51b815260206004820152601d60248201527f496e76616c696420524c50206c6f6e67206c697374206c656e6774682e000000604482015290519081900360640190fd5b6000816020036101000a6001850151049050808201886000015111612a08576040805162461bcd60e51b815260206004820152601660248201527524b73b30b634b210292628103637b733903634b9ba1760511b604482015290519081900360640190fd5b6001918201965094509250612a1b915050565b9193909250565b60606000826001600160401b0381118015612a3c57600080fd5b506040519080825280601f01601f191660200182016040528015612a67576020820181803683370190505b509050805160001415612a7b579050611671565b8484016020820160005b60208604811015612aa6578251825260209283019290910190600101612a85565b5080519151601f959095166020036101000a600019019182169119909416179092525092915050565b6060600080612add846126f9565b91935090915060019050816001811115612af357fe5b14612b45576040805162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c50206c6973742076616c75652e000000000000000000604482015290519081900360640190fd5b6040805160208082526104208201909252600091816020015b612b66613791565b815260200190600190039081612b5e5790505090506000835b8651811015612c3a5760208210612bc75760405162461bcd60e51b815260040180806020018281038252602a8152602001806141d5602a913960400191505060405180910390fd5b600080612bf36040518060400160405280858c60000151038152602001858c60200151018152506126f9565b509150915060405180604001604052808383018152602001848b6020015101815250858581518110612c2157fe5b6020908102919091010152600193909301920101612b7f565b508152949350505050565b6060600082516002026001600160401b0381118015612c6357600080fd5b506040519080825280601f01601f191660200182016040528015612c8e576020820181803683370190505b50905060005b8351811015612d3a576004848281518110612cab57fe5b602001015160f81c60f81b6001600160f81b031916901c828260020281518110612cd157fe5b60200101906001600160f81b031916908160001a9053506010848281518110612cf657fe5b016020015160f81c81612d0557fe5b0660f81b828260020260010181518110612d1b57fe5b60200101906001600160f81b031916908160001a905350600101612c94565b5092915050565b612d496137ab565b60408051600280825260608201909252600091816020015b6060815260200190600190039081612d615790505090506000612d85856001613401565b9050612d936103ef82613558565b82600081518110612da057fe5b6020026020010181905250612db48461149f565b82600181518110612dc157fe5b6020026020010181905250611ba982613628565b6000602082511015612dec5750602081015161097a565b81806020019051602081101561097557600080fd5b60006060602083600001511015612e2257612e1b83613657565b9050612e2e565b612e2b83611b23565b90505b61167181612dd5565b6060611503612e508360200151600081518110611d6c57fe5b612c45565b60608183510360001415612e785750604080516020810190915260008152611503565b611671838384865103613020565b6000805b808451118015612e9a5750808351115b8015612edf5750828181518110612ead57fe5b602001015160f81c60f81b6001600160f81b031916848281518110612ece57fe5b01602001516001600160f81b031916145b1561167157600101612e8a565b60208101515160009060111415612f055750600061097a565b60028260200151511415612f81576000612f1e83612e37565b9050600081600081518110612f2f57fe5b016020015160f81c90506002811480612f4b575060ff81166003145b15612f5b5760029250505061097a565b60ff81161580612f6e575060ff81166001145b15612f7e5760019250505061097a565b50505b6040805162461bcd60e51b8152602060048201526011602482015270496e76616c6964206e6f6465207479706560781b604482015290519081900360640190fd5b6060611503612fd083612e37565b613662565b612fdd6137ab565b6000612fe88361149f565b9050612ff381611afe565b60208501518051600019810190811061300857fe5b602002602001018190525061152784602001516136ab565b60608182601f01101561306b576040805162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b604482015290519081900360640190fd5b8282840110156130b3576040805162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b604482015290519081900360640190fd5b818301845110156130ff576040805162461bcd60e51b8152602060048201526011602482015270736c6963655f6f75744f66426f756e647360781b604482015290519081900360640190fd5b60608215801561311e57604051915060008252602082016040526126d4565b6040519150601f8416801560200281840101858101878315602002848b0101015b8183101561315757805183526020928301920161313f565b5050858452601f01601f19166040525050949350505050565b606060208251101561318357508061097a565b818051906020012060405160200180828152602001915050604051602081830303815290604052905061097a565b6131b96137ab565b60408051600280825260608201909252600091816020015b60608152602001906001900390816131d15790505090506000612d85856000613401565b6131fd6137ab565b6040805160118082526102408201909252600091816020015b606081526020019060019003908161321657905050905060005b815181101561327257604051806040016040528060018152602001600160ff1b81525082828151811061325f57fe5b6020908102919091010152600101613230565b5061327c81613628565b91505090565b61328a6137ab565b600060208351106132a35761329e8361149f565b6132a5565b825b90506132b081611afe565b85602001518560ff16815181106132c357fe5b6020026020010181905250611ba985602001516136ab565b606060008285016001600160401b03811180156132f757600080fd5b5060405190808252806020026020018201604052801561333157816020015b61331e6137ab565b8152602001906001900390816133165790505b50905060005b858110156133725786818151811061334b57fe5b602002602001015182828151811061335f57fe5b6020908102919091010152600101613337565b5060005b838110156133b35784818151811061338a57fe5b602002602001015182878301815181106133a057fe5b6020908102919091010152600101613376565b5095945050505050565b8282825b602081106133e0578151835260209283019290910190601f19016133c1565b905182516020929092036101000a6000190180199091169116179052505050565b6060600082613411576000613414565b60025b90506000600285518161342357fe5b06905060008160020360ff166001600160401b038111801561344457600080fd5b506040519080825280601f01601f19166020018201604052801561346f576020820181803683370190505b50905081830160f81b8160008151811061348557fe5b60200101906001600160f81b031916908160001a90535080866040516020018083805190602001908083835b602083106134d05780518252601f1990920191602091820191016134b1565b51815160209384036101000a600019018019909216911617905285519190930192850191508083835b602083106135185780518252601f1990920191602091820191016134f9565b6001836020036101000a03801982511681845116808217855250505050505090500192505050604051602081830303815290604052935050505092915050565b60606000600283518161356757fe5b046001600160401b038111801561357d57600080fd5b506040519080825280601f01601f1916602001820160405280156135a8576020820181803683370190505b50905060005b8151811015612d3a578381600202600101815181106135c957fe5b602001015160f81c60f81b60048583600202815181106135e557fe5b602001015160f81c60f81b6001600160f81b031916901b1782828151811061360957fe5b60200101906001600160f81b031916908160001a9053506001016135ae565b6136306137ab565b600061363b836119ac565b9050604051806040016040528082815260200161178583611bb2565b606061150382613754565b606060028260008151811061367357fe5b016020015160f81c8161368257fe5b0660ff16600014156136a057613699826002612e55565b905061097a565b613699826001612e55565b6136b36137ab565b600082516001600160401b03811180156136cc57600080fd5b5060405190808252806020026020018201604052801561370057816020015b60608152602001906001900390816136eb5790505b50905060005b835181101561374a5761372b84828151811061371e57fe5b6020026020010151613657565b82828151811061373757fe5b6020908102919091010152600101613706565b5061167181613628565b6060611503826020015160008460000151612a22565b60408051608081018252600080825260208201819052918101829052606081019190915290565b604051806040016040528060008152602001600081525090565b604051806040016040528060608152602001606081525090565b60006001600160401b038311156137d857fe5b6137eb601f8401601f1916602001614169565b90508281528383830111156137ff57600080fd5b828260208301376000602084830101529392505050565b803561097a816141bc565b8051801515811461097a57600080fd5b600082601f830112613841578081fd5b611671838335602085016137c5565b80356002811061097a57600080fd5b600080600060608486031215613873578283fd5b833561387e816141bc565b9250602084013561388e816141bc565b915060408401356001600160401b038111156138a8578182fd5b6138b486828701613831565b9150509250925092565b6000806000606084860312156138d2578283fd5b83356138dd816141bc565b92506020840135915060408401356001600160401b038111156138a8578182fd5b60008060408385031215613910578182fd5b823561391b816141bc565b915060208301356001600160401b03811115613935578182fd5b61394185828601613831565b9150509250929050565b60006020828403121561395c578081fd5b61167182613821565b600060208284031215613976578081fd5b5051919050565b60006020828403121561398e578081fd5b81356001600160401b038111156139a3578182fd5b8201601f810184136139b3578182fd5b611527848235602084016137c5565b600060c082840312156139d3578081fd5b60405160c081018181106001600160401b03821117156139ef57fe5b8060405250825181526020830151602082015260408301516040820152606083015160608201526080830151613a24816141bc565b6080820152613a3560a08401613821565b60a08201529392505050565b600060208284031215613a52578081fd5b81356001600160401b0380821115613a68578283fd5b9083019060e08286031215613a7b578283fd5b613a8560e0614169565b8235815260208301356020820152613a9f60408401613850565b6040820152613ab060608401613816565b6060820152613ac160808401613816565b608082015260a083013560a082015260c083013582811115613ae1578485fd5b613aed87828601613831565b60c08301525095945050505050565b6001600160a01b03169052565b60008151808452613b2181602086016020860161418c565b601f01601f19169290920160200192915050565b60609190911b6bffffffffffffffffffffffff1916815260140190565b90815260200190565b60008351613b6d81846020880161418c565b835190830190613b8181836020880161418c565b01949350505050565b600088825287602083015260028710613b9f57fe5b8660f81b60408301526bffffffffffffffffffffffff19808760601b166041840152808660601b166055840152508360698301528251613be681608985016020870161418c565b9190910160890198975050505050505050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039390931683526020830191909152604082015260600190565b600060e08201905060018060a01b038085168352835160208401526020840151604084015260408401516060840152606084015160808401528060808501511660a08401525060a0830151151560c08301529392505050565b901515815260200190565b6020810160038310613cb957fe5b91905290565b60208082526025908201527f53746f7261676520736c6f742068617320616c7265616479206265656e20707260408201526437bb32b71760d91b606082015260800190565b60208082526026908201527f4163636f756e742073746174652068617320616c7265616479206265656e20706040820152653937bb32b71760d11b606082015260800190565b6020808252603e908201527f416c6c206163636f756e7473206d75737420626520636f6d6d6974746564206260408201527f65666f726520636f6d706c6574696e672061207472616e736974696f6e2e0000606082015260800190565b602080825260409082018190527f53746f7261676520736c6f742076616c7565207761736e2774206368616e6765908201527f64206f722068617320616c7265616479206265656e20636f6d6d69747465642e606082015260800190565b6020808252605b908201527f4f564d5f53746174655472616e736974696f6e65723a2050726f76696465642060408201527f4c3120636f6e747261637420636f6465206861736820646f6573206e6f74206d60608201527f61746368204c3220636f6e747261637420636f646520686173682e0000000000608082015260a00190565b6020808252603f908201527f416c6c2073746f72616765206d75737420626520636f6d6d697474656420626560408201527f666f726520636f6d6d697474696e67206163636f756e74207374617465732e00606082015260800190565b60208082526038908201527f4e6f7420656e6f7567682067617320746f2065786563757465207472616e736160408201527f6374696f6e2064657465726d696e6973746963616c6c792e0000000000000000606082015260800190565b6020808252603b908201527f4163636f756e74207374617465207761736e2774206368616e676564206f722060408201527f68617320616c7265616479206265656e20636f6d6d69747465642e0000000000606082015260800190565b6020808252603d908201527f416c6c2073746f72616765206d75737420626520636f6d6d697474656420626560408201527f666f726520636f6d706c6574696e672061207472616e736974696f6e2e000000606082015260800190565b60208082526031908201527f46756e6374696f6e206d7573742062652063616c6c656420647572696e67207460408201527034329031b7b93932b1ba10383430b9b29760791b606082015260800190565b6020808252601d908201527f496e76616c6964207472616e73616374696f6e2070726f76696465642e000000604082015260600190565b60208082526038908201527f436f6e7472616374206d757374206265207665726966696564206265666f726560408201527f2070726f76696e6720612073746f7261676520736c6f742e0000000000000000606082015260800190565b600060408252835160408301526020840151606083015260408401516002811061410757fe5b60808381019190915260608501516001600160a01b031660a084015284015161413360c0840182613afc565b5060a084015160e083015260c084015160e0610100840152614159610120840182613b09565b9150506116716020830184613afc565b6040518181016001600160401b038111828210171561418457fe5b604052919050565b60005b838110156141a757818101518382015260200161418f565b838111156141b6576000848401525b50505050565b6001600160a01b03811681146141d157600080fd5b5056fe50726f766964656420524c50206c6973742065786365656473206d6178206c697374206c656e6774682e52656365697665642061206e6f6465207769746820616e20756e6b6e6f776e20707265666978a164736f6c6343000706000a4372656174652063616e206f6e6c7920626520646f6e6520627920746865204f564d5f467261756456657269666965722ea164736f6c6343000706000a", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100415760003560e01c806322d1470214610046578063299ca4781461009a578063461a4478146100a2575b600080fd5b61007e6004803603608081101561005c57600080fd5b506001600160a01b038135169060208101359060408101359060600135610148565b604080516001600160a01b039092168252519081900360200190f35b61007e610229565b61007e600480360360208110156100b857600080fd5b8101906020810181356401000000008111156100d357600080fd5b8201836020820111156100e557600080fd5b8035906020019184600183028401116401000000008311171561010757600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610238945050505050565b600061017c6040518060400160405280601181526020017027ab26afa33930bab22b32b934b334b2b960791b815250610238565b6001600160a01b0316336001600160a01b0316146101cb5760405162461bcd60e51b81526004018080602001828103825260318152602001806148296031913960400191505060405180910390fd5b848484846040516101db90610314565b80856001600160a01b03168152602001848152602001838152602001828152602001945050505050604051809103906000f08015801561021f573d6000803e3d6000fd5b5095945050505050565b6000546001600160a01b031681565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b83811015610298578181015183820152602001610280565b50505050905090810190601f1680156102c55780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b1580156102e257600080fd5b505afa1580156102f6573d6000803e3d6000fd5b505050506040513d602081101561030c57600080fd5b505192915050565b614507806103228339019056fe60806040523480156200001157600080fd5b506040516200450738038062004507833981016040819052620000349162000232565b600080546001600160a01b0319166001600160a01b038616179055600583905560028290556003829055600681905560408051808201909152601781527f4f564d5f53746174654d616e61676572466163746f72790000000000000000006020820152620000a29062000150565b6001600160a01b0316639ed93318306040518263ffffffff1660e01b8152600401620000cf919062000299565b602060405180830381600087803b158015620000ea57600080fd5b505af1158015620000ff573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000125919062000273565b600180546001600160a01b0319166001600160a01b039290921691909117905550620002c692505050565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b83811015620001b257818101518382015260200162000198565b50505050905090810190601f168015620001e05780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b158015620001fe57600080fd5b505afa15801562000213573d6000803e3d6000fd5b505050506040513d60208110156200022a57600080fd5b505192915050565b6000806000806080858703121562000248578384fd5b84516200025581620002ad565b60208601516040870151606090970151919890975090945092505050565b60006020828403121562000285578081fd5b81516200029281620002ad565b9392505050565b6001600160a01b0391909116815260200190565b6001600160a01b0381168114620002c357600080fd5b50565b61423180620002d66000396000f3fe608060405234801561001057600080fd5b50600436106100cf5760003560e01c8063845fe7a31161008c578063b2fa1c9e11610066578063b2fa1c9e14610185578063b52805711461019a578063b9194310146101a2578063c1c618b8146101b5576100cf565b8063845fe7a314610155578063a244316a14610168578063b1c9fe6e14610170576100cf565b8063299ca478146100d45780632e1ac36c146100f25780632eb1375814610107578063461a44781461011a578063732f960b1461012d578063805e9d3014610140575b600080fd5b6100dc6101bd565b6040516100e99190613bf9565b60405180910390f35b6101056101003660046138be565b6101cc565b005b6101056101153660046138fe565b610565565b6100dc61012836600461397d565b6108a1565b61010561013b366004613a41565b61097f565b610148610c4a565b6040516100e99190613b52565b6101056101633660046138be565b610c50565b610105610f7c565b610178611103565b6040516100e99190613cab565b61018d61110c565b6040516100e99190613ca0565b6100dc611127565b6101056101b036600461385f565b611136565b610148611450565b6000546001600160a01b031681565b60018060045460ff1660028111156101e057fe5b146102065760405162461bcd60e51b81526004016101fd90613ffc565b60405180910390fd5b60025460065460005a6001546040516363b285f960e11b81529192506001600160a01b03169063c7650bf290610242908a908a90600401613c0d565b602060405180830381600087803b15801561025c57600080fd5b505af1158015610270573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610294919061394b565b15156001146102b55760405162461bcd60e51b81526004016101fd90613da7565b60015460405163fbcbc0f160e01b81526000916001600160a01b03169063fbcbc0f1906102e6908b90600401613bf9565b60c06040518083038186803b1580156102fe57600080fd5b505afa158015610312573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061033691906139c2565b600154604051631aaf392f60e01b81529192506000916001600160a01b0390911690631aaf392f9061036e908c908c90600401613c0d565b60206040518083038186803b15801561038657600080fd5b505afa15801561039a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103be9190613965565b90506103ff886040516020016103d49190613b52565b6040516020818303038152906040526103f46103ef84611456565b61149f565b898560400151611509565b6040808401919091526001549051638f3b964760e01b81526001600160a01b0390911690638f3b964790610439908c908690600401613c47565b600060405180830381600087803b15801561045357600080fd5b505af1158015610467573d6000803e3d6000fd5b505050507f3e3ed1a676a2754a041b49bf752e0f167c8753495e36c320fe01d1ef7476253c898960405161049c929190613c0d565b60405180910390a1505060005a820390506104dd6040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506108a1565b6001600160a01b0316631e16e92f858533856040518563ffffffff1660e01b815260040180858152602001848152602001836001600160a01b03168152602001828152602001945050505050600060405180830381600087803b15801561054357600080fd5b505af1158015610557573d6000803e3d6000fd5b505050505050505050505050565b60018060045460ff16600281111561057957fe5b146105965760405162461bcd60e51b81526004016101fd90613ffc565b60025460065460005a9050600160009054906101000a90046001600160a01b03166001600160a01b03166399056ba96040518163ffffffff1660e01b815260040160206040518083038186803b1580156105ef57600080fd5b505afa158015610603573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106279190613965565b156106445760405162461bcd60e51b81526004016101fd90613e88565b600154604051630b38106960e11b81526001600160a01b039091169063167020d290610674908990600401613bf9565b602060405180830381600087803b15801561068e57600080fd5b505af11580156106a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106c6919061394b565b15156001146106e75760405162461bcd60e51b81526004016101fd90613f42565b60015460405163fbcbc0f160e01b81526000916001600160a01b03169063fbcbc0f190610718908a90600401613bf9565b60c06040518083038186803b15801561073057600080fd5b505afa158015610744573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061076891906139c2565b90506107a78760405160200161077e9190613b35565b60405160208183030381529060405261079e6107998461152f565b61156f565b88600354611509565b6003556040517fcec9ef675d775706a02b43afe48af52c5019bc50f99582e3208c6ff55d59c008906107da908990613bf9565b60405180910390a15060005a8203905061081a6040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506108a1565b6001600160a01b0316631e16e92f858533856040518563ffffffff1660e01b815260040180858152602001848152602001836001600160a01b03168152602001828152602001945050505050600060405180830381600087803b15801561088057600080fd5b505af1158015610894573d6000803e3d6000fd5b5050505050505050505050565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b838110156109015781810151838201526020016108e9565b50505050905090810190601f16801561092e5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561094b57600080fd5b505afa15801561095f573d6000803e3d6000fd5b505050506040513d602081101561097557600080fd5b505190505b919050565b60008060045460ff16600281111561099357fe5b146109b05760405162461bcd60e51b81526004016101fd90613ffc565b60025460065460005a90506006546109c786611678565b146109e45760405162461bcd60e51b81526004016101fd9061404d565b6103e88560a0015161040802816109f757fe5b04620186a0015a1015610a1c5760405162461bcd60e51b81526004016101fd90613ee5565b6000610a536040518060400160405280601481526020017327ab26afa2bc32b1baba34b7b726b0b730b3b2b960611b8152506108a1565b600154604051631381ba4d60e01b81529192506001600160a01b031690631381ba4d90610a84908490600401613bf9565b600060405180830381600087803b158015610a9e57600080fd5b505af1158015610ab2573d6000803e3d6000fd5b5050600154604051639be3ad6760e01b81526001600160a01b038086169450639be3ad679350610ae9928b929116906004016140e1565b600060405180830381600087803b158015610b0357600080fd5b505af1158015610b17573d6000803e3d6000fd5b5050600154604051631381ba4d60e01b81526001600160a01b039091169250631381ba4d9150610b4c90600090600401613bf9565b600060405180830381600087803b158015610b6657600080fd5b505af1158015610b7a573d6000803e3d6000fd5b50506004805460ff191660011790555060009150505a82039050610bc46040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506108a1565b6001600160a01b0316631e16e92f858533856040518563ffffffff1660e01b815260040180858152602001848152602001836001600160a01b03168152602001828152602001945050505050600060405180830381600087803b158015610c2a57600080fd5b505af1158015610c3e573d6000803e3d6000fd5b50505050505050505050565b60025490565b60008060045460ff166002811115610c6457fe5b14610c815760405162461bcd60e51b81526004016101fd90613ffc565b60025460065460005a600154604051630ad2267960e01b81529192506001600160a01b031690630ad2267990610cbd908a908a90600401613c0d565b60206040518083038186803b158015610cd557600080fd5b505afa158015610ce9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d0d919061394b565b15610d2a5760405162461bcd60e51b81526004016101fd90613cbf565b60015460405163c8e40fbf60e01b81526001600160a01b039091169063c8e40fbf90610d5a908a90600401613bf9565b60206040518083038186803b158015610d7257600080fd5b505afa158015610d86573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610daa919061394b565b1515600114610dcb5760405162461bcd60e51b81526004016101fd90614084565b60015460405163136e2d8960e11b81526000916001600160a01b0316906326dc5b1290610dfc908b90600401613bf9565b60206040518083038186803b158015610e1457600080fd5b505afa158015610e28573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e4c9190613965565b905060007f56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421821415610e8057506000610edd565b600080610ead8a604051602001610e979190613b52565b6040516020818303038152906040528a86611691565b909250905060018215151415610ed557610ece610ec9826116ba565b6116cd565b9250610eda565b600092505b50505b600154604051635c17d62960e01b81526001600160a01b0390911690635c17d62990610f11908c908c908690600401613c26565b600060405180830381600087803b158015610f2b57600080fd5b505af1158015610f3f573d6000803e3d6000fd5b50505050505060005a820390506104dd6040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506108a1565b60018060045460ff166002811115610f9057fe5b14610fad5760405162461bcd60e51b81526004016101fd90613ffc565b600160009054906101000a90046001600160a01b03166001600160a01b031663d7bd4a2a6040518163ffffffff1660e01b815260040160206040518083038186803b158015610ffb57600080fd5b505afa15801561100f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110339190613965565b156110505760405162461bcd60e51b81526004016101fd90613d4a565b600160009054906101000a90046001600160a01b03166001600160a01b03166399056ba96040518163ffffffff1660e01b815260040160206040518083038186803b15801561109e57600080fd5b505afa1580156110b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110d69190613965565b156110f35760405162461bcd60e51b81526004016101fd90613f9f565b506004805460ff19166002179055565b60045460ff1681565b6000600260045460ff16600281111561112157fe5b14905090565b6001546001600160a01b031681565b60008060045460ff16600281111561114a57fe5b146111675760405162461bcd60e51b81526004016101fd90613ffc565b60025460065460005a60015460405163c8e40fbf60e01b81529192506001600160a01b03169063c8e40fbf906111a1908a90600401613bf9565b60206040518083038186803b1580156111b957600080fd5b505afa1580156111cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111f1919061394b565b15801561127b57506001546040516307a1294560e01b81526001600160a01b03909116906307a1294590611229908a90600401613bf9565b60206040518083038186803b15801561124157600080fd5b505afa158015611255573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611279919061394b565b155b6112975760405162461bcd60e51b81526004016101fd90613d04565b6000806112c6896040516020016112ae9190613b35565b60405160208183030381529060405288600254611691565b9092509050600182151514156113e75760006112e1826116fc565b606081015190915089907fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470141561131a57506000611345565b81606001516113288261178e565b146113455760405162461bcd60e51b81526004016101fd90613e05565b6001546040805160c08101825284518152602080860151908201528482015181830152606080860151908201526001600160a01b038481166080830152600060a08301529151638f3b964760e01b81529190921691638f3b9647916113ae918f91600401613c47565b600060405180830381600087803b1580156113c857600080fd5b505af11580156113dc573d6000803e3d6000fd5b505050505050611417565b600154604051630d631c9d60e31b81526001600160a01b0390911690636b18e4e890610f11908c90600401613bf9565b505060005a820390506104dd6040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506108a1565b60035490565b6060806000805b6020811085821a151615611477576001918201910161145d565b5060405191506040820160405283600882021b60208301528060200382525080915050919050565b606080825160011480156114c757506080836000815181106114bd57fe5b016020015160f81c105b156114d3575081611503565b6114df83516080611792565b836040516020016114f1929190613b5b565b60405160208183030381529060405290505b92915050565b600080611515866118e1565b905061152381868686611911565b9150505b949350505050565b61153761376a565b604051806080016040528083600001518152602001836020015181526020018360400151815260200183606001518152509050919050565b60408051600480825260a0820190925260609160009190816020015b606081526020019060019003908161158b57505083519091506115b1906103ef90611456565b816000815181106115be57fe5b60200260200101819052506115dc6103ef846020015160001b611456565b816001815181106115e957fe5b6020026020010181905250611620836040015160405160200161160c9190613b52565b60405160208183030381529060405261149f565b8160028151811061162d57fe5b6020026020010181905250611650836060015160405160200161160c9190613b52565b8160038151811061165d57fe5b6020026020010181905250611671816119ac565b9392505050565b6000611683826119f0565b805190602001209050919050565b6000606060006116a0866118e1565b90506116ad818686611a2b565b9250925050935093915050565b60606115036116c883611afe565b611b23565b60008060006020845111156116e35760206116e6565b83515b6020858101519190036008021c92505050919050565b61170461376a565b600061170f83611bb2565b905060405180608001604052806117398360008151811061172c57fe5b6020026020010151611bc5565b815260200161174e8360018151811061172c57fe5b81526020016117708360028151811061176357fe5b6020026020010151611bcc565b81526020016117858360038151811061176357fe5b90529392505050565b3f90565b60608060388410156117ec576040805160018082528183019092529060208201818036833701905050905082840160f81b816000815181106117d057fe5b60200101906001600160f81b031916908160001a905350611671565b600060015b8086816117fa57fe5b041561180f57600190910190610100026117f1565b816001016001600160401b038111801561182857600080fd5b506040519080825280601f01601f191660200182016040528015611853576020820181803683370190505b50925084820160370160f81b8360008151811061186c57fe5b60200101906001600160f81b031916908160001a905350600190505b8181116118d8576101008183036101000a87816118a157fe5b04816118a957fe5b0660f81b8382815181106118b957fe5b60200101906001600160f81b031916908160001a905350600101611888565b50509392505050565b606081805190602001206040516020016118fb9190613b52565b6040516020818303038152906040529050919050565b6040805180820190915260018152600160ff1b60209091015260007f56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b4218214156119655761195e8585611cc6565b9050611527565b600061197084611cea565b9050600080611980838987611dc0565b509150915060006119938484848b612163565b905061199f818a61247b565b9998505050505050505050565b606060006119b9836125d4565b90506119c7815160c0611792565b816040516020016119d9929190613b5b565b604051602081830303815290604052915050919050565b6060816000015182602001518360400151846060015185608001518660a001518760c001516040516020016118fb9796959493929190613b8a565b600060606000611a3a85611cea565b90506000806000611a4c848a89611dc0565b81519295509093509150158080611a605750815b611ab1576040805162461bcd60e51b815260206004820152601a60248201527f50726f76696465642070726f6f6620697320696e76616c69642e000000000000604482015290519081900360640190fd5b600081611acd5760405180602001604052806000815250611aec565b611aec866001870381518110611adf57fe5b60200260200101516126dd565b919b919a509098505050505050505050565b611b06613791565b506040805180820190915281518152602082810190820152919050565b60606000806000611b33856126f9565b919450925090506000816001811115611b4857fe5b14611b9a576040805162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c502062797465732076616c75652e0000000000000000604482015290519081900360640190fd5b611ba985602001518484612a22565b95945050505050565b6060611503611bc083611afe565b612acf565b6000611503825b6000602182600001511115611c28576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e000000000000604482015290519081900360640190fd5b6000806000611c36856126f9565b919450925090506000816001811115611c4b57fe5b14611c9d576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e000000000000604482015290519081900360640190fd5b602080860151840180519091841015611cbc5760208490036101000a90045b9695505050505050565b6000611cda611cd484612c45565b83612d41565b5180516020909101209392505050565b60606000611cf783611bb2565b9050600081516001600160401b0381118015611d1257600080fd5b50604051908082528060200260200182016040528015611d4c57816020015b611d396137ab565b815260200190600190039081611d315790505b50905060005b8251811015611db8576000611d79848381518110611d6c57fe5b6020026020010151611b23565b90506040518060400160405280828152602001611d9583611bb2565b815250838381518110611da457fe5b602090810291909101015250600101611d52565b509392505050565b60006060818080611dd087612c45565b905085600080611dde6137ab565b60005b8c5181101561213b578c8181518110611df657fe5b6020026020010151915082840193506001870196508360001415611e6a57815180516020909101208514611e65576040805162461bcd60e51b8152602060048201526011602482015270092dcecc2d8d2c840e4dedee840d0c2e6d607b1b604482015290519081900360640190fd5b611f31565b815151602011611ed157815180516020909101208514611e65576040805162461bcd60e51b815260206004820152601b60248201527f496e76616c6964206c6172676520696e7465726e616c20686173680000000000604482015290519081900360640190fd5b84611edf8360000151612dd5565b14611f31576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420696e7465726e616c206e6f64652068617368000000000000604482015290519081900360640190fd5b60208201515160111415611fa0578551841415611f4d5761213b565b6000868581518110611f5b57fe5b602001015160f81c60f81b60f81c9050600083602001518260ff1681518110611f8057fe5b60200260200101519050611f9381612e01565b9650600194505050612133565b600282602001515114156120e6576000611fb983612e37565b9050600081600081518110611fca57fe5b016020015160f81c9050600181166002036000611fea8460ff8416612e55565b90506000611ff88b8a612e55565b905060006120068383612e86565b905060ff85166002148061201d575060ff85166003145b1561204f578083511480156120325750808251145b1561203c57988901985b50600160ff1b995061213b945050505050565b60ff85161580612062575060ff85166001145b156120af578061207f5750600160ff1b995061213b945050505050565b6120a0886020015160018151811061209357fe5b6020026020010151612e01565b9a509750612133945050505050565b60405162461bcd60e51b81526004018080602001828103825260268152602001806141ff6026913960400191505060405180910390fd5b6040805162461bcd60e51b815260206004820152601d60248201527f526563656976656420616e20756e706172736561626c65206e6f64652e000000604482015290519081900360640190fd5b600101611de1565b50600160ff1b84148661214e8786612e55565b909e909d50909b509950505050505050505050565b60606000839050600086600187038151811061217b57fe5b60200260200101519050600061219082612eec565b6040805160038082526080820190925291925060009190816020015b6121b46137ab565b8152602001906001900390816121ac5790505090506000845160001480156121e7575060028360028111156121e557fe5b145b1561221d576121fe6121f885612fc2565b88612d41565b82828151811061220a57fe5b602090810291909101015260010161245e565b600083600281111561222b57fe5b1415612291578451612260576122418488612fd5565b82828151811061224d57fe5b602090810291909101015260010161228c565b8382828151811061226d57fe5b60200260200101819052506001810190506121fe6121f8866001612e55565b61245e565b600061229c85612fc2565b905060006122aa8288612e86565b9050801561230b5760006122c083600084613020565b90506122d4816122cf8c613170565b6131b1565b8585815181106122e057fe5b60200260200101819052506001840193506122fb8383612e55565b92506123078883612e55565b9750505b60006123156131f5565b905082516000141561233a576123338161232e896126dd565b612fd5565b90506123d2565b60008360008151811061234957fe5b016020015160f81c905061235e846001612e55565b9350600287600281111561236e57fe5b14156123a9576000612388856123838b6126dd565b612d41565b90506123a1838361239c8460000151613170565b613282565b9250506123d0565b8351156123bf576000612388856122cf8b6126dd565b6123cd828261239c8b6126dd565b91505b505b8751612407576123e2818b612fd5565b9050808585815181106123f157fe5b602002602001018190525060018401935061245a565b612412886001612e55565b97508085858151811061242157fe5b602002602001018190525060018401935061243c888b612d41565b85858151811061244857fe5b60200260200101819052506001840193505b5050505b61246d8a60018b0384846132db565b9a9950505050505050505050565b60008061248783612c45565b90506124916137ab565b84516000906060905b80156125bf578760018203815181106124af57fe5b602002602001015193506124c284612eec565b925060028360028111156124d257fe5b14156124fd5760006124e385612fc2565b90506124f58660008351895103613020565b9550506125a9565b600183600281111561250b57fe5b141561254b57600061251c85612fc2565b905061252e8660008351895103613020565b8351909650156125455761254281846131b1565b94505b506125a9565b600083600281111561255957fe5b14156125a9578151156125a95760008560018751038151811061257857fe5b602001015160f81c60f81b60f81c90506125988660006001895103613020565b95506125a5858285613282565b9450505b83516125b490613170565b91506000190161249a565b50509051805160209091012095945050505050565b60608151600014156125f5575060408051600081526020810190915261097a565b6000805b83518110156126285783818151811061260e57fe5b6020026020010151518201915080806001019150506125f9565b6000826001600160401b038111801561264057600080fd5b506040519080825280601f01601f19166020018201604052801561266b576020820181803683370190505b50600092509050602081015b85518310156126d457600086848151811061268e57fe5b6020026020010151905060006020820190506126ac838284516133bd565b8785815181106126b857fe5b6020026020010151518301925050508280600101935050612677565b50949350505050565b60208101518051606091611503916000198101908110611d6c57fe5b600080600080846000015111612756576040805162461bcd60e51b815260206004820152601860248201527f524c50206974656d2063616e6e6f74206265206e756c6c2e0000000000000000604482015290519081900360640190fd5b6020840151805160001a607f811161277b576000600160009450945094505050612a1b565b60b781116127f0578551607f1982019081106127de576040805162461bcd60e51b815260206004820152601960248201527f496e76616c696420524c502073686f727420737472696e672e00000000000000604482015290519081900360640190fd5b60019550935060009250612a1b915050565b60bf81116128d457855160b6198201908110612853576040805162461bcd60e51b815260206004820152601f60248201527f496e76616c696420524c50206c6f6e6720737472696e67206c656e6774682e00604482015290519081900360640190fd5b6000816020036101000a60018501510490508082018860000151116128bf576040805162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c50206c6f6e6720737472696e672e0000000000000000604482015290519081900360640190fd5b60019091019550935060009250612a1b915050565b60f7811161294857855160bf198201908110612937576040805162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c502073686f7274206c6973742e000000000000000000604482015290519081900360640190fd5b600195509350849250612a1b915050565b855160f61982019081106129a3576040805162461bcd60e51b815260206004820152601d60248201527f496e76616c696420524c50206c6f6e67206c697374206c656e6774682e000000604482015290519081900360640190fd5b6000816020036101000a6001850151049050808201886000015111612a08576040805162461bcd60e51b815260206004820152601660248201527524b73b30b634b210292628103637b733903634b9ba1760511b604482015290519081900360640190fd5b6001918201965094509250612a1b915050565b9193909250565b60606000826001600160401b0381118015612a3c57600080fd5b506040519080825280601f01601f191660200182016040528015612a67576020820181803683370190505b509050805160001415612a7b579050611671565b8484016020820160005b60208604811015612aa6578251825260209283019290910190600101612a85565b5080519151601f959095166020036101000a600019019182169119909416179092525092915050565b6060600080612add846126f9565b91935090915060019050816001811115612af357fe5b14612b45576040805162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c50206c6973742076616c75652e000000000000000000604482015290519081900360640190fd5b6040805160208082526104208201909252600091816020015b612b66613791565b815260200190600190039081612b5e5790505090506000835b8651811015612c3a5760208210612bc75760405162461bcd60e51b815260040180806020018281038252602a8152602001806141d5602a913960400191505060405180910390fd5b600080612bf36040518060400160405280858c60000151038152602001858c60200151018152506126f9565b509150915060405180604001604052808383018152602001848b6020015101815250858581518110612c2157fe5b6020908102919091010152600193909301920101612b7f565b508152949350505050565b6060600082516002026001600160401b0381118015612c6357600080fd5b506040519080825280601f01601f191660200182016040528015612c8e576020820181803683370190505b50905060005b8351811015612d3a576004848281518110612cab57fe5b602001015160f81c60f81b6001600160f81b031916901c828260020281518110612cd157fe5b60200101906001600160f81b031916908160001a9053506010848281518110612cf657fe5b016020015160f81c81612d0557fe5b0660f81b828260020260010181518110612d1b57fe5b60200101906001600160f81b031916908160001a905350600101612c94565b5092915050565b612d496137ab565b60408051600280825260608201909252600091816020015b6060815260200190600190039081612d615790505090506000612d85856001613401565b9050612d936103ef82613558565b82600081518110612da057fe5b6020026020010181905250612db48461149f565b82600181518110612dc157fe5b6020026020010181905250611ba982613628565b6000602082511015612dec5750602081015161097a565b81806020019051602081101561097557600080fd5b60006060602083600001511015612e2257612e1b83613657565b9050612e2e565b612e2b83611b23565b90505b61167181612dd5565b6060611503612e508360200151600081518110611d6c57fe5b612c45565b60608183510360001415612e785750604080516020810190915260008152611503565b611671838384865103613020565b6000805b808451118015612e9a5750808351115b8015612edf5750828181518110612ead57fe5b602001015160f81c60f81b6001600160f81b031916848281518110612ece57fe5b01602001516001600160f81b031916145b1561167157600101612e8a565b60208101515160009060111415612f055750600061097a565b60028260200151511415612f81576000612f1e83612e37565b9050600081600081518110612f2f57fe5b016020015160f81c90506002811480612f4b575060ff81166003145b15612f5b5760029250505061097a565b60ff81161580612f6e575060ff81166001145b15612f7e5760019250505061097a565b50505b6040805162461bcd60e51b8152602060048201526011602482015270496e76616c6964206e6f6465207479706560781b604482015290519081900360640190fd5b6060611503612fd083612e37565b613662565b612fdd6137ab565b6000612fe88361149f565b9050612ff381611afe565b60208501518051600019810190811061300857fe5b602002602001018190525061152784602001516136ab565b60608182601f01101561306b576040805162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b604482015290519081900360640190fd5b8282840110156130b3576040805162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b604482015290519081900360640190fd5b818301845110156130ff576040805162461bcd60e51b8152602060048201526011602482015270736c6963655f6f75744f66426f756e647360781b604482015290519081900360640190fd5b60608215801561311e57604051915060008252602082016040526126d4565b6040519150601f8416801560200281840101858101878315602002848b0101015b8183101561315757805183526020928301920161313f565b5050858452601f01601f19166040525050949350505050565b606060208251101561318357508061097a565b818051906020012060405160200180828152602001915050604051602081830303815290604052905061097a565b6131b96137ab565b60408051600280825260608201909252600091816020015b60608152602001906001900390816131d15790505090506000612d85856000613401565b6131fd6137ab565b6040805160118082526102408201909252600091816020015b606081526020019060019003908161321657905050905060005b815181101561327257604051806040016040528060018152602001600160ff1b81525082828151811061325f57fe5b6020908102919091010152600101613230565b5061327c81613628565b91505090565b61328a6137ab565b600060208351106132a35761329e8361149f565b6132a5565b825b90506132b081611afe565b85602001518560ff16815181106132c357fe5b6020026020010181905250611ba985602001516136ab565b606060008285016001600160401b03811180156132f757600080fd5b5060405190808252806020026020018201604052801561333157816020015b61331e6137ab565b8152602001906001900390816133165790505b50905060005b858110156133725786818151811061334b57fe5b602002602001015182828151811061335f57fe5b6020908102919091010152600101613337565b5060005b838110156133b35784818151811061338a57fe5b602002602001015182878301815181106133a057fe5b6020908102919091010152600101613376565b5095945050505050565b8282825b602081106133e0578151835260209283019290910190601f19016133c1565b905182516020929092036101000a6000190180199091169116179052505050565b6060600082613411576000613414565b60025b90506000600285518161342357fe5b06905060008160020360ff166001600160401b038111801561344457600080fd5b506040519080825280601f01601f19166020018201604052801561346f576020820181803683370190505b50905081830160f81b8160008151811061348557fe5b60200101906001600160f81b031916908160001a90535080866040516020018083805190602001908083835b602083106134d05780518252601f1990920191602091820191016134b1565b51815160209384036101000a600019018019909216911617905285519190930192850191508083835b602083106135185780518252601f1990920191602091820191016134f9565b6001836020036101000a03801982511681845116808217855250505050505090500192505050604051602081830303815290604052935050505092915050565b60606000600283518161356757fe5b046001600160401b038111801561357d57600080fd5b506040519080825280601f01601f1916602001820160405280156135a8576020820181803683370190505b50905060005b8151811015612d3a578381600202600101815181106135c957fe5b602001015160f81c60f81b60048583600202815181106135e557fe5b602001015160f81c60f81b6001600160f81b031916901b1782828151811061360957fe5b60200101906001600160f81b031916908160001a9053506001016135ae565b6136306137ab565b600061363b836119ac565b9050604051806040016040528082815260200161178583611bb2565b606061150382613754565b606060028260008151811061367357fe5b016020015160f81c8161368257fe5b0660ff16600014156136a057613699826002612e55565b905061097a565b613699826001612e55565b6136b36137ab565b600082516001600160401b03811180156136cc57600080fd5b5060405190808252806020026020018201604052801561370057816020015b60608152602001906001900390816136eb5790505b50905060005b835181101561374a5761372b84828151811061371e57fe5b6020026020010151613657565b82828151811061373757fe5b6020908102919091010152600101613706565b5061167181613628565b6060611503826020015160008460000151612a22565b60408051608081018252600080825260208201819052918101829052606081019190915290565b604051806040016040528060008152602001600081525090565b604051806040016040528060608152602001606081525090565b60006001600160401b038311156137d857fe5b6137eb601f8401601f1916602001614169565b90508281528383830111156137ff57600080fd5b828260208301376000602084830101529392505050565b803561097a816141bc565b8051801515811461097a57600080fd5b600082601f830112613841578081fd5b611671838335602085016137c5565b80356002811061097a57600080fd5b600080600060608486031215613873578283fd5b833561387e816141bc565b9250602084013561388e816141bc565b915060408401356001600160401b038111156138a8578182fd5b6138b486828701613831565b9150509250925092565b6000806000606084860312156138d2578283fd5b83356138dd816141bc565b92506020840135915060408401356001600160401b038111156138a8578182fd5b60008060408385031215613910578182fd5b823561391b816141bc565b915060208301356001600160401b03811115613935578182fd5b61394185828601613831565b9150509250929050565b60006020828403121561395c578081fd5b61167182613821565b600060208284031215613976578081fd5b5051919050565b60006020828403121561398e578081fd5b81356001600160401b038111156139a3578182fd5b8201601f810184136139b3578182fd5b611527848235602084016137c5565b600060c082840312156139d3578081fd5b60405160c081018181106001600160401b03821117156139ef57fe5b8060405250825181526020830151602082015260408301516040820152606083015160608201526080830151613a24816141bc565b6080820152613a3560a08401613821565b60a08201529392505050565b600060208284031215613a52578081fd5b81356001600160401b0380821115613a68578283fd5b9083019060e08286031215613a7b578283fd5b613a8560e0614169565b8235815260208301356020820152613a9f60408401613850565b6040820152613ab060608401613816565b6060820152613ac160808401613816565b608082015260a083013560a082015260c083013582811115613ae1578485fd5b613aed87828601613831565b60c08301525095945050505050565b6001600160a01b03169052565b60008151808452613b2181602086016020860161418c565b601f01601f19169290920160200192915050565b60609190911b6bffffffffffffffffffffffff1916815260140190565b90815260200190565b60008351613b6d81846020880161418c565b835190830190613b8181836020880161418c565b01949350505050565b600088825287602083015260028710613b9f57fe5b8660f81b60408301526bffffffffffffffffffffffff19808760601b166041840152808660601b166055840152508360698301528251613be681608985016020870161418c565b9190910160890198975050505050505050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039390931683526020830191909152604082015260600190565b600060e08201905060018060a01b038085168352835160208401526020840151604084015260408401516060840152606084015160808401528060808501511660a08401525060a0830151151560c08301529392505050565b901515815260200190565b6020810160038310613cb957fe5b91905290565b60208082526025908201527f53746f7261676520736c6f742068617320616c7265616479206265656e20707260408201526437bb32b71760d91b606082015260800190565b60208082526026908201527f4163636f756e742073746174652068617320616c7265616479206265656e20706040820152653937bb32b71760d11b606082015260800190565b6020808252603e908201527f416c6c206163636f756e7473206d75737420626520636f6d6d6974746564206260408201527f65666f726520636f6d706c6574696e672061207472616e736974696f6e2e0000606082015260800190565b602080825260409082018190527f53746f7261676520736c6f742076616c7565207761736e2774206368616e6765908201527f64206f722068617320616c7265616479206265656e20636f6d6d69747465642e606082015260800190565b6020808252605b908201527f4f564d5f53746174655472616e736974696f6e65723a2050726f76696465642060408201527f4c3120636f6e747261637420636f6465206861736820646f6573206e6f74206d60608201527f61746368204c3220636f6e747261637420636f646520686173682e0000000000608082015260a00190565b6020808252603f908201527f416c6c2073746f72616765206d75737420626520636f6d6d697474656420626560408201527f666f726520636f6d6d697474696e67206163636f756e74207374617465732e00606082015260800190565b60208082526038908201527f4e6f7420656e6f7567682067617320746f2065786563757465207472616e736160408201527f6374696f6e2064657465726d696e6973746963616c6c792e0000000000000000606082015260800190565b6020808252603b908201527f4163636f756e74207374617465207761736e2774206368616e676564206f722060408201527f68617320616c7265616479206265656e20636f6d6d69747465642e0000000000606082015260800190565b6020808252603d908201527f416c6c2073746f72616765206d75737420626520636f6d6d697474656420626560408201527f666f726520636f6d706c6574696e672061207472616e736974696f6e2e000000606082015260800190565b60208082526031908201527f46756e6374696f6e206d7573742062652063616c6c656420647572696e67207460408201527034329031b7b93932b1ba10383430b9b29760791b606082015260800190565b6020808252601d908201527f496e76616c6964207472616e73616374696f6e2070726f76696465642e000000604082015260600190565b60208082526038908201527f436f6e7472616374206d757374206265207665726966696564206265666f726560408201527f2070726f76696e6720612073746f7261676520736c6f742e0000000000000000606082015260800190565b600060408252835160408301526020840151606083015260408401516002811061410757fe5b60808381019190915260608501516001600160a01b031660a084015284015161413360c0840182613afc565b5060a084015160e083015260c084015160e0610100840152614159610120840182613b09565b9150506116716020830184613afc565b6040518181016001600160401b038111828210171561418457fe5b604052919050565b60005b838110156141a757818101518382015260200161418f565b838111156141b6576000848401525b50505050565b6001600160a01b03811681146141d157600080fd5b5056fe50726f766964656420524c50206c6973742065786365656473206d6178206c697374206c656e6774682e52656365697665642061206e6f6465207769746820616e20756e6b6e6f776e20707265666978a164736f6c6343000706000a4372656174652063616e206f6e6c7920626520646f6e6520627920746865204f564d5f467261756456657269666965722ea164736f6c6343000706000a", + "solcInputHash": "f2bdab652d5102f5f11e78dae866798d", + "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_stateTransitionIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"_preStateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"_transactionHash\",\"type\":\"bytes32\"}],\"name\":\"create\",\"outputs\":[{\"internalType\":\"contract iOVM_StateTransitioner\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The State Transitioner Factory is used by the Fraud Verifier to create a new State Transitioner during the initialization of a fraud proof. Compiler used: solc Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"create(address,uint256,bytes32,bytes32)\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\",\"_preStateRoot\":\"State root before the transition was executed.\",\"_stateTransitionIndex\":\"Index of the state transition being verified.\",\"_transactionHash\":\"Hash of the executed transaction.\"},\"returns\":{\"_0\":\"New OVM_StateTransitioner instance.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}}},\"title\":\"OVM_StateTransitionerFactory\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"create(address,uint256,bytes32,bytes32)\":{\"notice\":\"Creates a new OVM_StateTransitioner\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/OVM/verification/OVM_StateTransitionerFactory.sol\":\"OVM_StateTransitionerFactory\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor () internal {\\n address msgSender = _msgSender();\\n _owner = msgSender;\\n emit OwnershipTransferred(address(0), msgSender);\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n emit OwnershipTransferred(_owner, address(0));\\n _owner = address(0);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n emit OwnershipTransferred(_owner, newOwner);\\n _owner = newOwner;\\n }\\n}\\n\",\"keccak256\":\"0x15e2d5bd4c28a88548074c54d220e8086f638a71ed07e6b3ba5a70066fcf458d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with GSN meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address payable) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes memory) {\\n this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x8d3cb350f04ff49cfb10aef08d87f19dcbaecc8027b0bed12f3275cd12f38cf0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/verification/Abs_FraudContributor.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\nimport { iOVM_BondManager } from \\\"../../iOVM/verification/iOVM_BondManager.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/// Minimal contract to be inherited by contracts consumed by users that provide\\n/// data for fraud proofs\\nabstract contract Abs_FraudContributor is Lib_AddressResolver {\\n /// Decorate your functions with this modifier to store how much total gas was\\n /// consumed by the sender, to reward users fairly\\n modifier contributesToFraudProof(bytes32 preStateRoot, bytes32 txHash) {\\n uint256 startGas = gasleft();\\n _;\\n uint256 gasSpent = startGas - gasleft();\\n iOVM_BondManager(resolve('OVM_BondManager')).recordGasSpent(preStateRoot, txHash, msg.sender, gasSpent);\\n }\\n}\\n\",\"keccak256\":\"0x6c27d089a297103cb93b30f7649ab68691cc6b948c315f1037e5de1fe9bf5903\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/verification/OVM_StateTransitioner.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// @unsupported: ovm\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\nimport { Lib_EthUtils } from \\\"../../libraries/utils/Lib_EthUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../../libraries/utils/Lib_Bytes32Utils.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../../libraries/utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_SecureMerkleTrie } from \\\"../../libraries/trie/Lib_SecureMerkleTrie.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../../libraries/rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_RLPReader } from \\\"../../libraries/rlp/Lib_RLPReader.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_StateTransitioner } from \\\"../../iOVM/verification/iOVM_StateTransitioner.sol\\\";\\nimport { iOVM_BondManager } from \\\"../../iOVM/verification/iOVM_BondManager.sol\\\";\\nimport { iOVM_ExecutionManager } from \\\"../../iOVM/execution/iOVM_ExecutionManager.sol\\\";\\nimport { iOVM_StateManager } from \\\"../../iOVM/execution/iOVM_StateManager.sol\\\";\\nimport { iOVM_StateManagerFactory } from \\\"../../iOVM/execution/iOVM_StateManagerFactory.sol\\\";\\n\\n/* Contract Imports */\\nimport { Abs_FraudContributor } from \\\"./Abs_FraudContributor.sol\\\";\\n\\n/**\\n * @title OVM_StateTransitioner\\n * @dev The State Transitioner coordinates the execution of a state transition during the evaluation of a\\n * fraud proof. It feeds verified input to the Execution Manager's run(), and controls a State Manager (which is\\n * uniquely created for each fraud proof).\\n * Once a fraud proof has been initialized, this contract is provided with the pre-state root and verifies\\n * that the OVM storage slots committed to the State Mangager are contained in that state\\n * This contract controls the State Manager and Execution Manager, and uses them to calculate the\\n * post-state root by applying the transaction. The Fraud Verifier can then check for fraud by comparing\\n * the calculated post-state root with the proposed post-state root.\\n *\\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract OVM_StateTransitioner is Lib_AddressResolver, Abs_FraudContributor, iOVM_StateTransitioner {\\n\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n enum TransitionPhase {\\n PRE_EXECUTION,\\n POST_EXECUTION,\\n COMPLETE\\n }\\n\\n\\n /*******************************************\\n * Contract Variables: Contract References *\\n *******************************************/\\n\\n iOVM_StateManager public ovmStateManager;\\n\\n\\n /*******************************************\\n * Contract Variables: Internal Accounting *\\n *******************************************/\\n\\n bytes32 internal preStateRoot;\\n bytes32 internal postStateRoot;\\n TransitionPhase public phase;\\n uint256 internal stateTransitionIndex;\\n bytes32 internal transactionHash;\\n\\n\\n /*************\\n * Constants *\\n *************/\\n\\n bytes32 internal constant EMPTY_ACCOUNT_CODE_HASH = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;\\n bytes32 internal constant EMPTY_ACCOUNT_STORAGE_ROOT = 0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n * @param _stateTransitionIndex Index of the state transition being verified.\\n * @param _preStateRoot State root before the transition was executed.\\n * @param _transactionHash Hash of the executed transaction.\\n */\\n constructor(\\n address _libAddressManager,\\n uint256 _stateTransitionIndex,\\n bytes32 _preStateRoot,\\n bytes32 _transactionHash\\n )\\n Lib_AddressResolver(_libAddressManager)\\n {\\n stateTransitionIndex = _stateTransitionIndex;\\n preStateRoot = _preStateRoot;\\n postStateRoot = _preStateRoot;\\n transactionHash = _transactionHash;\\n\\n ovmStateManager = iOVM_StateManagerFactory(resolve(\\\"OVM_StateManagerFactory\\\")).create(address(this));\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n /**\\n * Checks that a function is only run during a specific phase.\\n * @param _phase Phase the function must run within.\\n */\\n modifier onlyDuringPhase(\\n TransitionPhase _phase\\n ) {\\n require(\\n phase == _phase,\\n \\\"Function must be called during the correct phase.\\\"\\n );\\n _;\\n }\\n\\n\\n /**********************************\\n * Public Functions: State Access *\\n **********************************/\\n\\n /**\\n * Retrieves the state root before execution.\\n * @return _preStateRoot State root before execution.\\n */\\n function getPreStateRoot()\\n override\\n external\\n view\\n returns (\\n bytes32 _preStateRoot\\n )\\n {\\n return preStateRoot;\\n }\\n\\n /**\\n * Retrieves the state root after execution.\\n * @return _postStateRoot State root after execution.\\n */\\n function getPostStateRoot()\\n override\\n external\\n view\\n returns (\\n bytes32 _postStateRoot\\n )\\n {\\n return postStateRoot;\\n }\\n\\n /**\\n * Checks whether the transitioner is complete.\\n * @return _complete Whether or not the transition process is finished.\\n */\\n function isComplete()\\n override\\n external\\n view\\n returns (\\n bool _complete\\n )\\n {\\n return phase == TransitionPhase.COMPLETE;\\n }\\n\\n\\n /***********************************\\n * Public Functions: Pre-Execution *\\n ***********************************/\\n\\n /**\\n * Allows a user to prove the initial state of a contract.\\n * @param _ovmContractAddress Address of the contract on the OVM.\\n * @param _ethContractAddress Address of the corresponding contract on L1.\\n * @param _stateTrieWitness Proof of the account state.\\n */\\n function proveContractState(\\n address _ovmContractAddress,\\n address _ethContractAddress,\\n bytes memory _stateTrieWitness\\n )\\n override\\n external\\n onlyDuringPhase(TransitionPhase.PRE_EXECUTION)\\n contributesToFraudProof(preStateRoot, transactionHash)\\n {\\n // Exit quickly to avoid unnecessary work.\\n require(\\n (\\n ovmStateManager.hasAccount(_ovmContractAddress) == false\\n && ovmStateManager.hasEmptyAccount(_ovmContractAddress) == false\\n ),\\n \\\"Account state has already been proven.\\\"\\n );\\n\\n // Function will fail if the proof is not a valid inclusion or exclusion proof.\\n (\\n bool exists,\\n bytes memory encodedAccount\\n ) = Lib_SecureMerkleTrie.get(\\n abi.encodePacked(_ovmContractAddress),\\n _stateTrieWitness,\\n preStateRoot\\n );\\n\\n if (exists == true) {\\n // Account exists, this was an inclusion proof.\\n Lib_OVMCodec.EVMAccount memory account = Lib_OVMCodec.decodeEVMAccount(\\n encodedAccount\\n );\\n\\n address ethContractAddress = _ethContractAddress;\\n if (account.codeHash == EMPTY_ACCOUNT_CODE_HASH) {\\n // Use a known empty contract to prevent an attack in which a user provides a\\n // contract address here and then later deploys code to it.\\n ethContractAddress = 0x0000000000000000000000000000000000000000;\\n } else {\\n // Otherwise, make sure that the code at the provided eth address matches the hash\\n // of the code stored on L2.\\n require(\\n Lib_EthUtils.getCodeHash(ethContractAddress) == account.codeHash,\\n \\\"OVM_StateTransitioner: Provided L1 contract code hash does not match L2 contract code hash.\\\"\\n );\\n }\\n\\n ovmStateManager.putAccount(\\n _ovmContractAddress,\\n Lib_OVMCodec.Account({\\n nonce: account.nonce,\\n balance: account.balance,\\n storageRoot: account.storageRoot,\\n codeHash: account.codeHash,\\n ethAddress: ethContractAddress,\\n isFresh: false\\n })\\n );\\n } else {\\n // Account does not exist, this was an exclusion proof.\\n ovmStateManager.putEmptyAccount(_ovmContractAddress);\\n }\\n }\\n\\n /**\\n * Allows a user to prove the initial state of a contract storage slot.\\n * @param _ovmContractAddress Address of the contract on the OVM.\\n * @param _key Claimed account slot key.\\n * @param _storageTrieWitness Proof of the storage slot.\\n */\\n function proveStorageSlot(\\n address _ovmContractAddress,\\n bytes32 _key,\\n bytes memory _storageTrieWitness\\n )\\n override\\n external\\n onlyDuringPhase(TransitionPhase.PRE_EXECUTION)\\n contributesToFraudProof(preStateRoot, transactionHash)\\n {\\n // Exit quickly to avoid unnecessary work.\\n require(\\n ovmStateManager.hasContractStorage(_ovmContractAddress, _key) == false,\\n \\\"Storage slot has already been proven.\\\"\\n );\\n\\n require(\\n ovmStateManager.hasAccount(_ovmContractAddress) == true,\\n \\\"Contract must be verified before proving a storage slot.\\\"\\n );\\n\\n bytes32 storageRoot = ovmStateManager.getAccountStorageRoot(_ovmContractAddress);\\n bytes32 value;\\n\\n if (storageRoot == EMPTY_ACCOUNT_STORAGE_ROOT) {\\n // Storage trie was empty, so the user is always allowed to insert zero-byte values.\\n value = bytes32(0);\\n } else {\\n // Function will fail if the proof is not a valid inclusion or exclusion proof.\\n (\\n bool exists,\\n bytes memory encodedValue\\n ) = Lib_SecureMerkleTrie.get(\\n abi.encodePacked(_key),\\n _storageTrieWitness,\\n storageRoot\\n );\\n\\n if (exists == true) {\\n // Inclusion proof.\\n // Stored values are RLP encoded, with leading zeros removed.\\n value = Lib_BytesUtils.toBytes32PadLeft(\\n Lib_RLPReader.readBytes(encodedValue)\\n );\\n } else {\\n // Exclusion proof, can only be zero bytes.\\n value = bytes32(0);\\n }\\n }\\n\\n ovmStateManager.putContractStorage(\\n _ovmContractAddress,\\n _key,\\n value\\n );\\n }\\n\\n\\n /*******************************\\n * Public Functions: Execution *\\n *******************************/\\n\\n /**\\n * Executes the state transition.\\n * @param _transaction OVM transaction to execute.\\n */\\n function applyTransaction(\\n Lib_OVMCodec.Transaction memory _transaction\\n )\\n override\\n external\\n onlyDuringPhase(TransitionPhase.PRE_EXECUTION)\\n contributesToFraudProof(preStateRoot, transactionHash)\\n {\\n require(\\n Lib_OVMCodec.hashTransaction(_transaction) == transactionHash,\\n \\\"Invalid transaction provided.\\\"\\n );\\n\\n // We require gas to complete the logic here in run() before/after execution,\\n // But must ensure the full _tx.gasLimit can be given to the ovmCALL (determinism)\\n // This includes 1/64 of the gas getting lost because of EIP-150 (lost twice--first\\n // going into EM, then going into the code contract).\\n require(\\n gasleft() >= 100000 + _transaction.gasLimit * 1032 / 1000, // 1032/1000 = 1.032 = (64/63)^2 rounded up\\n \\\"Not enough gas to execute transaction deterministically.\\\"\\n );\\n\\n iOVM_ExecutionManager ovmExecutionManager = iOVM_ExecutionManager(resolve(\\\"OVM_ExecutionManager\\\"));\\n\\n // We call `setExecutionManager` right before `run` (and not earlier) just in case the\\n // OVM_ExecutionManager address was updated between the time when this contract was created\\n // and when `applyTransaction` was called.\\n ovmStateManager.setExecutionManager(address(ovmExecutionManager));\\n\\n // `run` always succeeds *unless* the user hasn't provided enough gas to `applyTransaction`\\n // or an INVALID_STATE_ACCESS flag was triggered. Either way, we won't get beyond this line\\n // if that's the case.\\n ovmExecutionManager.run(_transaction, address(ovmStateManager));\\n\\n // Prevent the Execution Manager from calling this SM again.\\n ovmStateManager.setExecutionManager(address(0));\\n phase = TransitionPhase.POST_EXECUTION;\\n }\\n\\n\\n /************************************\\n * Public Functions: Post-Execution *\\n ************************************/\\n\\n /**\\n * Allows a user to commit the final state of a contract.\\n * @param _ovmContractAddress Address of the contract on the OVM.\\n * @param _stateTrieWitness Proof of the account state.\\n */\\n function commitContractState(\\n address _ovmContractAddress,\\n bytes memory _stateTrieWitness\\n )\\n override\\n external\\n onlyDuringPhase(TransitionPhase.POST_EXECUTION)\\n contributesToFraudProof(preStateRoot, transactionHash)\\n {\\n require(\\n ovmStateManager.getTotalUncommittedContractStorage() == 0,\\n \\\"All storage must be committed before committing account states.\\\"\\n );\\n\\n require (\\n ovmStateManager.commitAccount(_ovmContractAddress) == true,\\n \\\"Account state wasn't changed or has already been committed.\\\"\\n );\\n\\n Lib_OVMCodec.Account memory account = ovmStateManager.getAccount(_ovmContractAddress);\\n\\n postStateRoot = Lib_SecureMerkleTrie.update(\\n abi.encodePacked(_ovmContractAddress),\\n Lib_OVMCodec.encodeEVMAccount(\\n Lib_OVMCodec.toEVMAccount(account)\\n ),\\n _stateTrieWitness,\\n postStateRoot\\n );\\n\\n // Emit an event to help clients figure out the proof ordering.\\n emit AccountCommitted(\\n _ovmContractAddress\\n );\\n }\\n\\n /**\\n * Allows a user to commit the final state of a contract storage slot.\\n * @param _ovmContractAddress Address of the contract on the OVM.\\n * @param _key Claimed account slot key.\\n * @param _storageTrieWitness Proof of the storage slot.\\n */\\n function commitStorageSlot(\\n address _ovmContractAddress,\\n bytes32 _key,\\n bytes memory _storageTrieWitness\\n )\\n override\\n external\\n onlyDuringPhase(TransitionPhase.POST_EXECUTION)\\n contributesToFraudProof(preStateRoot, transactionHash)\\n {\\n require(\\n ovmStateManager.commitContractStorage(_ovmContractAddress, _key) == true,\\n \\\"Storage slot value wasn't changed or has already been committed.\\\"\\n );\\n\\n Lib_OVMCodec.Account memory account = ovmStateManager.getAccount(_ovmContractAddress);\\n bytes32 value = ovmStateManager.getContractStorage(_ovmContractAddress, _key);\\n\\n account.storageRoot = Lib_SecureMerkleTrie.update(\\n abi.encodePacked(_key),\\n Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(value)\\n ),\\n _storageTrieWitness,\\n account.storageRoot\\n );\\n\\n ovmStateManager.putAccount(_ovmContractAddress, account);\\n\\n // Emit an event to help clients figure out the proof ordering.\\n emit ContractStorageCommitted(\\n _ovmContractAddress,\\n _key\\n );\\n }\\n\\n\\n /**********************************\\n * Public Functions: Finalization *\\n **********************************/\\n\\n /**\\n * Finalizes the transition process.\\n */\\n function completeTransition()\\n override\\n external\\n onlyDuringPhase(TransitionPhase.POST_EXECUTION)\\n {\\n require(\\n ovmStateManager.getTotalUncommittedAccounts() == 0,\\n \\\"All accounts must be committed before completing a transition.\\\"\\n );\\n\\n require(\\n ovmStateManager.getTotalUncommittedContractStorage() == 0,\\n \\\"All storage must be committed before completing a transition.\\\"\\n );\\n\\n phase = TransitionPhase.COMPLETE;\\n }\\n}\\n\",\"keccak256\":\"0x53231f64d413623b2b8c4ba1b596c9cbbe4712c9b406a42198aeaa8387a293d9\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/verification/OVM_StateTransitionerFactory.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// @unsupported: ovm\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_StateTransitioner } from \\\"../../iOVM/verification/iOVM_StateTransitioner.sol\\\";\\nimport { iOVM_StateTransitionerFactory } from \\\"../../iOVM/verification/iOVM_StateTransitionerFactory.sol\\\";\\nimport { iOVM_FraudVerifier } from \\\"../../iOVM/verification/iOVM_FraudVerifier.sol\\\";\\n\\n/* Contract Imports */\\nimport { OVM_StateTransitioner } from \\\"./OVM_StateTransitioner.sol\\\";\\n\\n/**\\n * @title OVM_StateTransitionerFactory\\n * @dev The State Transitioner Factory is used by the Fraud Verifier to create a new State\\n * Transitioner during the initialization of a fraud proof.\\n *\\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract OVM_StateTransitionerFactory is iOVM_StateTransitionerFactory, Lib_AddressResolver {\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n constructor(\\n address _libAddressManager\\n )\\n Lib_AddressResolver(_libAddressManager)\\n {}\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Creates a new OVM_StateTransitioner\\n * @param _libAddressManager Address of the Address Manager.\\n * @param _stateTransitionIndex Index of the state transition being verified.\\n * @param _preStateRoot State root before the transition was executed.\\n * @param _transactionHash Hash of the executed transaction.\\n * @return New OVM_StateTransitioner instance.\\n */\\n function create(\\n address _libAddressManager,\\n uint256 _stateTransitionIndex,\\n bytes32 _preStateRoot,\\n bytes32 _transactionHash\\n )\\n override\\n public\\n returns (\\n iOVM_StateTransitioner\\n )\\n {\\n require(\\n msg.sender == resolve(\\\"OVM_FraudVerifier\\\"),\\n \\\"Create can only be done by the OVM_FraudVerifier.\\\"\\n );\\n\\n return new OVM_StateTransitioner(\\n _libAddressManager,\\n _stateTransitionIndex,\\n _preStateRoot,\\n _transactionHash\\n );\\n }\\n}\\n\",\"keccak256\":\"0x65ef11334a2d6931b6d3a85e7b29c39c774d19443e7040e132a58be505e3b52c\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/execution/iOVM_ExecutionManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\ninterface iOVM_ExecutionManager {\\n /**********\\n * Enums *\\n *********/\\n\\n enum RevertFlag {\\n OUT_OF_GAS,\\n INTENTIONAL_REVERT,\\n EXCEEDS_NUISANCE_GAS,\\n INVALID_STATE_ACCESS,\\n UNSAFE_BYTECODE,\\n CREATE_COLLISION,\\n STATIC_VIOLATION,\\n CREATOR_NOT_ALLOWED\\n }\\n\\n enum GasMetadataKey {\\n CURRENT_EPOCH_START_TIMESTAMP,\\n CUMULATIVE_SEQUENCER_QUEUE_GAS,\\n CUMULATIVE_L1TOL2_QUEUE_GAS,\\n PREV_EPOCH_SEQUENCER_QUEUE_GAS,\\n PREV_EPOCH_L1TOL2_QUEUE_GAS\\n }\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct GasMeterConfig {\\n uint256 minTransactionGasLimit;\\n uint256 maxTransactionGasLimit;\\n uint256 maxGasPerQueuePerEpoch;\\n uint256 secondsPerEpoch;\\n }\\n\\n struct GlobalContext {\\n uint256 ovmCHAINID;\\n }\\n\\n struct TransactionContext {\\n Lib_OVMCodec.QueueOrigin ovmL1QUEUEORIGIN;\\n uint256 ovmTIMESTAMP;\\n uint256 ovmNUMBER;\\n uint256 ovmGASLIMIT;\\n uint256 ovmTXGASLIMIT;\\n address ovmL1TXORIGIN;\\n }\\n\\n struct TransactionRecord {\\n uint256 ovmGasRefund;\\n }\\n\\n struct MessageContext {\\n address ovmCALLER;\\n address ovmADDRESS;\\n bool isStatic;\\n }\\n\\n struct MessageRecord {\\n uint256 nuisanceGasLeft;\\n }\\n\\n\\n /************************************\\n * Transaction Execution Entrypoint *\\n ************************************/\\n\\n function run(\\n Lib_OVMCodec.Transaction calldata _transaction,\\n address _txStateManager\\n ) external returns (bytes memory);\\n\\n\\n /*******************\\n * Context Opcodes *\\n *******************/\\n\\n function ovmCALLER() external view returns (address _caller);\\n function ovmADDRESS() external view returns (address _address);\\n function ovmTIMESTAMP() external view returns (uint256 _timestamp);\\n function ovmNUMBER() external view returns (uint256 _number);\\n function ovmGASLIMIT() external view returns (uint256 _gasLimit);\\n function ovmCHAINID() external view returns (uint256 _chainId);\\n\\n\\n /**********************\\n * L2 Context Opcodes *\\n **********************/\\n\\n function ovmL1QUEUEORIGIN() external view returns (Lib_OVMCodec.QueueOrigin _queueOrigin);\\n function ovmL1TXORIGIN() external view returns (address _l1TxOrigin);\\n\\n\\n /*******************\\n * Halting Opcodes *\\n *******************/\\n\\n function ovmREVERT(bytes memory _data) external;\\n\\n\\n /*****************************\\n * Contract Creation Opcodes *\\n *****************************/\\n\\n function ovmCREATE(bytes memory _bytecode) external returns (address _contract, bytes memory _revertdata);\\n function ovmCREATE2(bytes memory _bytecode, bytes32 _salt) external returns (address _contract, bytes memory _revertdata);\\n\\n\\n /*******************************\\n * Account Abstraction Opcodes *\\n ******************************/\\n\\n function ovmGETNONCE() external returns (uint256 _nonce);\\n function ovmINCREMENTNONCE() external;\\n function ovmCREATEEOA(bytes32 _messageHash, uint8 _v, bytes32 _r, bytes32 _s) external;\\n\\n\\n /****************************\\n * Contract Calling Opcodes *\\n ****************************/\\n\\n function ovmCALL(uint256 _gasLimit, address _address, bytes memory _calldata) external returns (bool _success, bytes memory _returndata);\\n function ovmSTATICCALL(uint256 _gasLimit, address _address, bytes memory _calldata) external returns (bool _success, bytes memory _returndata);\\n function ovmDELEGATECALL(uint256 _gasLimit, address _address, bytes memory _calldata) external returns (bool _success, bytes memory _returndata);\\n\\n\\n /****************************\\n * Contract Storage Opcodes *\\n ****************************/\\n\\n function ovmSLOAD(bytes32 _key) external returns (bytes32 _value);\\n function ovmSSTORE(bytes32 _key, bytes32 _value) external;\\n\\n\\n /*************************\\n * Contract Code Opcodes *\\n *************************/\\n\\n function ovmEXTCODECOPY(address _contract, uint256 _offset, uint256 _length) external returns (bytes memory _code);\\n function ovmEXTCODESIZE(address _contract) external returns (uint256 _size);\\n function ovmEXTCODEHASH(address _contract) external returns (bytes32 _hash);\\n\\n\\n /***************************************\\n * Public Functions: Execution Context *\\n ***************************************/\\n\\n function getMaxTransactionGasLimit() external view returns (uint _maxTransactionGasLimit);\\n}\\n\",\"keccak256\":\"0xf023d5d6fc6a03bd52f7a57af6e21076de77e8925d065bb79db062e73e43b684\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/execution/iOVM_StateManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title iOVM_StateManager\\n */\\ninterface iOVM_StateManager {\\n\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n enum ItemState {\\n ITEM_UNTOUCHED,\\n ITEM_LOADED,\\n ITEM_CHANGED,\\n ITEM_COMMITTED\\n }\\n\\n /***************************\\n * Public Functions: Misc *\\n ***************************/\\n\\n function isAuthenticated(address _address) external view returns (bool);\\n\\n /***************************\\n * Public Functions: Setup *\\n ***************************/\\n\\n function owner() external view returns (address _owner);\\n function ovmExecutionManager() external view returns (address _ovmExecutionManager);\\n function setExecutionManager(address _ovmExecutionManager) external;\\n\\n\\n /************************************\\n * Public Functions: Account Access *\\n ************************************/\\n\\n function putAccount(address _address, Lib_OVMCodec.Account memory _account) external;\\n function putEmptyAccount(address _address) external;\\n function getAccount(address _address) external view returns (Lib_OVMCodec.Account memory _account);\\n function hasAccount(address _address) external view returns (bool _exists);\\n function hasEmptyAccount(address _address) external view returns (bool _exists);\\n function setAccountNonce(address _address, uint256 _nonce) external;\\n function getAccountNonce(address _address) external view returns (uint256 _nonce);\\n function getAccountEthAddress(address _address) external view returns (address _ethAddress);\\n function getAccountStorageRoot(address _address) external view returns (bytes32 _storageRoot);\\n function initPendingAccount(address _address) external;\\n function commitPendingAccount(address _address, address _ethAddress, bytes32 _codeHash) external;\\n function testAndSetAccountLoaded(address _address) external returns (bool _wasAccountAlreadyLoaded);\\n function testAndSetAccountChanged(address _address) external returns (bool _wasAccountAlreadyChanged);\\n function commitAccount(address _address) external returns (bool _wasAccountCommitted);\\n function incrementTotalUncommittedAccounts() external;\\n function getTotalUncommittedAccounts() external view returns (uint256 _total);\\n function wasAccountChanged(address _address) external view returns (bool);\\n function wasAccountCommitted(address _address) external view returns (bool);\\n\\n\\n /************************************\\n * Public Functions: Storage Access *\\n ************************************/\\n\\n function putContractStorage(address _contract, bytes32 _key, bytes32 _value) external;\\n function getContractStorage(address _contract, bytes32 _key) external view returns (bytes32 _value);\\n function hasContractStorage(address _contract, bytes32 _key) external view returns (bool _exists);\\n function testAndSetContractStorageLoaded(address _contract, bytes32 _key) external returns (bool _wasContractStorageAlreadyLoaded);\\n function testAndSetContractStorageChanged(address _contract, bytes32 _key) external returns (bool _wasContractStorageAlreadyChanged);\\n function commitContractStorage(address _contract, bytes32 _key) external returns (bool _wasContractStorageCommitted);\\n function incrementTotalUncommittedContractStorage() external;\\n function getTotalUncommittedContractStorage() external view returns (uint256 _total);\\n function wasContractStorageChanged(address _contract, bytes32 _key) external view returns (bool);\\n function wasContractStorageCommitted(address _contract, bytes32 _key) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x7a11dbd1f61593ba34debe07e39eef59967307f7f372ba9855bee0953585d08d\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/execution/iOVM_StateManagerFactory.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Contract Imports */\\nimport { iOVM_StateManager } from \\\"./iOVM_StateManager.sol\\\";\\n\\n/**\\n * @title iOVM_StateManagerFactory\\n */\\ninterface iOVM_StateManagerFactory {\\n\\n /***************************************\\n * Public Functions: Contract Creation *\\n ***************************************/\\n\\n function create(\\n address _owner\\n )\\n external\\n returns (\\n iOVM_StateManager _ovmStateManager\\n );\\n}\\n\",\"keccak256\":\"0x27a90fc43889d0c7d1db50f37907ef7386d9b415d15a1e91a0a068cba59afd36\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/verification/iOVM_BondManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\ninterface ERC20 {\\n function transfer(address, uint256) external returns (bool);\\n function transferFrom(address, address, uint256) external returns (bool);\\n}\\n\\n/// All the errors which may be encountered on the bond manager\\nlibrary Errors {\\n string constant ERC20_ERR = \\\"BondManager: Could not post bond\\\";\\n string constant ALREADY_FINALIZED = \\\"BondManager: Fraud proof for this pre-state root has already been finalized\\\";\\n string constant SLASHED = \\\"BondManager: Cannot finalize withdrawal, you probably got slashed\\\";\\n string constant WRONG_STATE = \\\"BondManager: Wrong bond state for proposer\\\";\\n string constant CANNOT_CLAIM = \\\"BondManager: Cannot claim yet. Dispute must be finalized first\\\";\\n\\n string constant WITHDRAWAL_PENDING = \\\"BondManager: Withdrawal already pending\\\";\\n string constant TOO_EARLY = \\\"BondManager: Too early to finalize your withdrawal\\\";\\n\\n string constant ONLY_TRANSITIONER = \\\"BondManager: Only the transitioner for this pre-state root may call this function\\\";\\n string constant ONLY_FRAUD_VERIFIER = \\\"BondManager: Only the fraud verifier may call this function\\\";\\n string constant ONLY_STATE_COMMITMENT_CHAIN = \\\"BondManager: Only the state commitment chain may call this function\\\";\\n string constant WAIT_FOR_DISPUTES = \\\"BondManager: Wait for other potential disputes\\\";\\n}\\n\\n/**\\n * @title iOVM_BondManager\\n */\\ninterface iOVM_BondManager {\\n\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n /// The lifecycle of a proposer's bond\\n enum State {\\n // Before depositing or after getting slashed, a user is uncollateralized\\n NOT_COLLATERALIZED,\\n // After depositing, a user is collateralized\\n COLLATERALIZED,\\n // After a user has initiated a withdrawal\\n WITHDRAWING\\n }\\n\\n /// A bond posted by a proposer\\n struct Bond {\\n // The user's state\\n State state;\\n // The timestamp at which a proposer issued their withdrawal request\\n uint32 withdrawalTimestamp;\\n // The time when the first disputed was initiated for this bond\\n uint256 firstDisputeAt;\\n // The earliest observed state root for this bond which has had fraud\\n bytes32 earliestDisputedStateRoot;\\n // The state root's timestamp\\n uint256 earliestTimestamp;\\n }\\n\\n // Per pre-state root, store the number of state provisions that were made\\n // and how many of these calls were made by each user. Payouts will then be\\n // claimed by users proportionally for that dispute.\\n struct Rewards {\\n // Flag to check if rewards for a fraud proof are claimable\\n bool canClaim;\\n // Total number of `recordGasSpent` calls made\\n uint256 total;\\n // The gas spent by each user to provide witness data. The sum of all\\n // values inside this map MUST be equal to the value of `total`\\n mapping(address => uint256) gasSpent;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function recordGasSpent(\\n bytes32 _preStateRoot,\\n bytes32 _txHash,\\n address _who,\\n uint256 _gasSpent\\n ) external;\\n\\n function finalize(\\n bytes32 _preStateRoot,\\n address _publisher,\\n uint256 _timestamp\\n ) external;\\n\\n function deposit() external;\\n\\n function startWithdrawal() external;\\n\\n function finalizeWithdrawal() external;\\n\\n function claim(\\n address _who\\n ) external;\\n\\n function isCollateralized(\\n address _who\\n ) external view returns (bool);\\n\\n function getGasSpent(\\n bytes32 _preStateRoot,\\n address _who\\n ) external view returns (uint256);\\n}\\n\",\"keccak256\":\"0x3c2a8a399487857158649db1896749d86e39cba545a8aeb2e2bb0f3bdfa7a5b1\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/verification/iOVM_FraudVerifier.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_StateTransitioner } from \\\"./iOVM_StateTransitioner.sol\\\";\\n\\n/**\\n * @title iOVM_FraudVerifier\\n */\\ninterface iOVM_FraudVerifier {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event FraudProofInitialized(\\n bytes32 _preStateRoot,\\n uint256 _preStateRootIndex,\\n bytes32 _transactionHash,\\n address _who\\n );\\n\\n event FraudProofFinalized(\\n bytes32 _preStateRoot,\\n uint256 _preStateRootIndex,\\n bytes32 _transactionHash,\\n address _who\\n );\\n\\n\\n /***************************************\\n * Public Functions: Transition Status *\\n ***************************************/\\n\\n function getStateTransitioner(bytes32 _preStateRoot, bytes32 _txHash) external view returns (iOVM_StateTransitioner _transitioner);\\n\\n\\n /****************************************\\n * Public Functions: Fraud Verification *\\n ****************************************/\\n\\n function initializeFraudVerification(\\n bytes32 _preStateRoot,\\n Lib_OVMCodec.ChainBatchHeader calldata _preStateRootBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof calldata _preStateRootProof,\\n Lib_OVMCodec.Transaction calldata _transaction,\\n Lib_OVMCodec.TransactionChainElement calldata _txChainElement,\\n Lib_OVMCodec.ChainBatchHeader calldata _transactionBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof calldata _transactionProof\\n ) external;\\n\\n function finalizeFraudVerification(\\n bytes32 _preStateRoot,\\n Lib_OVMCodec.ChainBatchHeader calldata _preStateRootBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof calldata _preStateRootProof,\\n bytes32 _txHash,\\n bytes32 _postStateRoot,\\n Lib_OVMCodec.ChainBatchHeader calldata _postStateRootBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof calldata _postStateRootProof\\n ) external;\\n}\\n\",\"keccak256\":\"0x5efd7bb18164bbd3e9d58379e8203fbf2a7ee802b1a48dff3ceaaec1523b1751\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/verification/iOVM_StateTransitioner.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title iOVM_StateTransitioner\\n */\\ninterface iOVM_StateTransitioner {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AccountCommitted(\\n address _address\\n );\\n\\n event ContractStorageCommitted(\\n address _address,\\n bytes32 _key\\n );\\n\\n\\n /**********************************\\n * Public Functions: State Access *\\n **********************************/\\n\\n function getPreStateRoot() external view returns (bytes32 _preStateRoot);\\n function getPostStateRoot() external view returns (bytes32 _postStateRoot);\\n function isComplete() external view returns (bool _complete);\\n\\n\\n /***********************************\\n * Public Functions: Pre-Execution *\\n ***********************************/\\n\\n function proveContractState(\\n address _ovmContractAddress,\\n address _ethContractAddress,\\n bytes calldata _stateTrieWitness\\n ) external;\\n\\n function proveStorageSlot(\\n address _ovmContractAddress,\\n bytes32 _key,\\n bytes calldata _storageTrieWitness\\n ) external;\\n\\n\\n /*******************************\\n * Public Functions: Execution *\\n *******************************/\\n\\n function applyTransaction(\\n Lib_OVMCodec.Transaction calldata _transaction\\n ) external;\\n\\n\\n /************************************\\n * Public Functions: Post-Execution *\\n ************************************/\\n\\n function commitContractState(\\n address _ovmContractAddress,\\n bytes calldata _stateTrieWitness\\n ) external;\\n\\n function commitStorageSlot(\\n address _ovmContractAddress,\\n bytes32 _key,\\n bytes calldata _storageTrieWitness\\n ) external;\\n\\n\\n /**********************************\\n * Public Functions: Finalization *\\n **********************************/\\n\\n function completeTransition() external;\\n}\\n\",\"keccak256\":\"0x3d044ac0a3bb6ad3d529f904b3191117511f9c379678ca03010e1ebdfcb5c34b\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/verification/iOVM_StateTransitionerFactory.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Contract Imports */\\nimport { iOVM_StateTransitioner } from \\\"./iOVM_StateTransitioner.sol\\\";\\n\\n/**\\n * @title iOVM_StateTransitionerFactory\\n */\\ninterface iOVM_StateTransitionerFactory {\\n\\n /***************************************\\n * Public Functions: Contract Creation *\\n ***************************************/\\n\\n function create(\\n address _proxyManager,\\n uint256 _stateTransitionIndex,\\n bytes32 _preStateRoot,\\n bytes32 _transactionHash\\n )\\n external\\n returns (\\n iOVM_StateTransitioner _ovmStateTransitioner\\n );\\n}\\n\",\"keccak256\":\"0x60a0f0c104e4c0c7863268a93005762e8146d393f9cfddfdd6a2d6585c5911fc\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/codec/Lib_OVMCodec.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../utils/Lib_Bytes32Utils.sol\\\";\\n\\n/**\\n * @title Lib_OVMCodec\\n */\\nlibrary Lib_OVMCodec {\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum QueueOrigin {\\n SEQUENCER_QUEUE,\\n L1TOL2_QUEUE\\n }\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Account {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n address ethAddress;\\n bool isFresh;\\n }\\n\\n struct EVMAccount {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n }\\n\\n struct ChainBatchHeader {\\n uint256 batchIndex;\\n bytes32 batchRoot;\\n uint256 batchSize;\\n uint256 prevTotalElements;\\n bytes extraData;\\n }\\n\\n struct ChainInclusionProof {\\n uint256 index;\\n bytes32[] siblings;\\n }\\n\\n struct Transaction {\\n uint256 timestamp;\\n uint256 blockNumber;\\n QueueOrigin l1QueueOrigin;\\n address l1TxOrigin;\\n address entrypoint;\\n uint256 gasLimit;\\n bytes data;\\n }\\n\\n struct TransactionChainElement {\\n bool isSequenced;\\n uint256 queueIndex; // QUEUED TX ONLY\\n uint256 timestamp; // SEQUENCER TX ONLY\\n uint256 blockNumber; // SEQUENCER TX ONLY\\n bytes txData; // SEQUENCER TX ONLY\\n }\\n\\n struct QueueElement {\\n bytes32 transactionHash;\\n uint40 timestamp;\\n uint40 blockNumber;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Encodes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Encoded transaction bytes.\\n */\\n function encodeTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return abi.encodePacked(\\n _transaction.timestamp,\\n _transaction.blockNumber,\\n _transaction.l1QueueOrigin,\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n );\\n }\\n\\n /**\\n * Hashes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Hashed transaction\\n */\\n function hashTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(encodeTransaction(_transaction));\\n }\\n\\n /**\\n * Converts an OVM account to an EVM account.\\n * @param _in OVM account to convert.\\n * @return Converted EVM account.\\n */\\n function toEVMAccount(\\n Account memory _in\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n return EVMAccount({\\n nonce: _in.nonce,\\n balance: _in.balance,\\n storageRoot: _in.storageRoot,\\n codeHash: _in.codeHash\\n });\\n }\\n\\n /**\\n * @notice RLP-encodes an account state struct.\\n * @param _account Account state struct.\\n * @return RLP-encoded account state.\\n */\\n function encodeEVMAccount(\\n EVMAccount memory _account\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes[] memory raw = new bytes[](4);\\n\\n // Unfortunately we can't create this array outright because\\n // Lib_RLPWriter.writeList will reject fixed-size arrays. Assigning\\n // index-by-index circumvents this issue.\\n raw[0] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.nonce)\\n )\\n );\\n raw[1] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.balance)\\n )\\n );\\n raw[2] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.storageRoot));\\n raw[3] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.codeHash));\\n\\n return Lib_RLPWriter.writeList(raw);\\n }\\n\\n /**\\n * @notice Decodes an RLP-encoded account state into a useful struct.\\n * @param _encoded RLP-encoded account state.\\n * @return Account state struct.\\n */\\n function decodeEVMAccount(\\n bytes memory _encoded\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\\n\\n return EVMAccount({\\n nonce: Lib_RLPReader.readUint256(accountState[0]),\\n balance: Lib_RLPReader.readUint256(accountState[1]),\\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\\n });\\n }\\n\\n /**\\n * Calculates a hash for a given batch header.\\n * @param _batchHeader Header to hash.\\n * @return Hash of the header.\\n */\\n function hashBatchHeader(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(\\n abi.encode(\\n _batchHeader.batchRoot,\\n _batchHeader.batchSize,\\n _batchHeader.prevTotalElements,\\n _batchHeader.extraData\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0xd85ba2066057a2677926f484b938c7c2ef33ff3853f3b71cda252f4a54f30e05\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n external\\n onlyOwner\\n {\\n addresses[_getNameHash(_name)] = _address;\\n\\n emit AddressSet(\\n _name,\\n _address\\n );\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(\\n string memory _name\\n )\\n external\\n view\\n returns (\\n address\\n )\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xcc9fc5c64f1101a5c6c397594086b1608189a9edc5c9635e1ac38f70aeeeecbf\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(\\n address _libAddressManager\\n ) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x65981feeabff6a81783ea97d44baf988a18a86c8cb374c46fdb71819cbacc7c0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPReader.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_RLPReader\\n * @dev Adapted from \\\"RLPReader\\\" by Hamdi Allam (hamdi.allam97@gmail.com).\\n */\\nlibrary Lib_RLPReader {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 constant internal MAX_LIST_LENGTH = 32;\\n\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum RLPItemType {\\n DATA_ITEM,\\n LIST_ITEM\\n }\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct RLPItem {\\n uint256 length;\\n uint256 ptr;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts bytes to a reference to memory position and length.\\n * @param _in Input bytes to convert.\\n * @return Output memory reference.\\n */\\n function toRLPItem(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem memory\\n )\\n {\\n uint256 ptr;\\n assembly {\\n ptr := add(_in, 32)\\n }\\n\\n return RLPItem({\\n length: _in.length,\\n ptr: ptr\\n });\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n (\\n uint256 listOffset,\\n ,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.LIST_ITEM,\\n \\\"Invalid RLP list value.\\\"\\n );\\n\\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\\n // writing to the length. Since we can't know the number of RLP items without looping over\\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\\n // simply set a reasonable maximum list length and decrease the size before we finish.\\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\\n\\n uint256 itemCount = 0;\\n uint256 offset = listOffset;\\n while (offset < _in.length) {\\n require(\\n itemCount < MAX_LIST_LENGTH,\\n \\\"Provided RLP list exceeds max list length.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n ) = _decodeLength(RLPItem({\\n length: _in.length - offset,\\n ptr: _in.ptr + offset\\n }));\\n\\n out[itemCount] = RLPItem({\\n length: itemLength + itemOffset,\\n ptr: _in.ptr + offset\\n });\\n\\n itemCount += 1;\\n offset += itemOffset + itemLength;\\n }\\n\\n // Decrease the array size to match the actual item count.\\n assembly {\\n mstore(out, itemCount)\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n return readList(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes value.\\\"\\n );\\n\\n return _copy(_in.ptr, itemOffset, itemLength);\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return readBytes(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return string(readBytes(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return readString(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n require(\\n _in.length <= 33,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr + itemOffset;\\n bytes32 out;\\n assembly {\\n out := mload(ptr)\\n\\n // Shift the bytes over to match the item size.\\n if lt(itemLength, 32) {\\n out := div(out, exp(256, sub(32, itemLength)))\\n }\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return readBytes32(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return uint256(readBytes32(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return readUint256(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n require(\\n _in.length == 1,\\n \\\"Invalid RLP boolean value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 out;\\n assembly {\\n out := byte(0, mload(ptr))\\n }\\n\\n require(\\n out == 0 || out == 1,\\n \\\"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\\\"\\n );\\n\\n return out != 0;\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return readBool(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n if (_in.length == 1) {\\n return address(0);\\n }\\n\\n require(\\n _in.length == 21,\\n \\\"Invalid RLP address value.\\\"\\n );\\n\\n return address(readUint256(_in));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return readAddress(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads the raw bytes of an RLP item.\\n * @param _in RLP item to read.\\n * @return Raw RLP bytes.\\n */\\n function readRawBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in);\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Decodes the length of an RLP item.\\n * @param _in RLP item to decode.\\n * @return Offset of the encoded data.\\n * @return Length of the encoded data.\\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\\n */\\n function _decodeLength(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n uint256,\\n uint256,\\n RLPItemType\\n )\\n {\\n require(\\n _in.length > 0,\\n \\\"RLP item cannot be null.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 prefix;\\n assembly {\\n prefix := byte(0, mload(ptr))\\n }\\n\\n if (prefix <= 0x7f) {\\n // Single byte.\\n\\n return (0, 1, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xb7) {\\n // Short string.\\n\\n uint256 strLen = prefix - 0x80;\\n\\n require(\\n _in.length > strLen,\\n \\\"Invalid RLP short string.\\\"\\n );\\n\\n return (1, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xbf) {\\n // Long string.\\n uint256 lenOfStrLen = prefix - 0xb7;\\n\\n require(\\n _in.length > lenOfStrLen,\\n \\\"Invalid RLP long string length.\\\"\\n );\\n\\n uint256 strLen;\\n assembly {\\n // Pick out the string length.\\n strLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfStrLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfStrLen + strLen,\\n \\\"Invalid RLP long string.\\\"\\n );\\n\\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xf7) {\\n // Short list.\\n uint256 listLen = prefix - 0xc0;\\n\\n require(\\n _in.length > listLen,\\n \\\"Invalid RLP short list.\\\"\\n );\\n\\n return (1, listLen, RLPItemType.LIST_ITEM);\\n } else {\\n // Long list.\\n uint256 lenOfListLen = prefix - 0xf7;\\n\\n require(\\n _in.length > lenOfListLen,\\n \\\"Invalid RLP long list length.\\\"\\n );\\n\\n uint256 listLen;\\n assembly {\\n // Pick out the list length.\\n listLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfListLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfListLen + listLen,\\n \\\"Invalid RLP long list.\\\"\\n );\\n\\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\\n }\\n }\\n\\n /**\\n * Copies the bytes from a memory location.\\n * @param _src Pointer to the location to read from.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Copied bytes.\\n */\\n function _copy(\\n uint256 _src,\\n uint256 _offset,\\n uint256 _length\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out = new bytes(_length);\\n if (out.length == 0) {\\n return out;\\n }\\n\\n uint256 src = _src + _offset;\\n uint256 dest;\\n assembly {\\n dest := add(out, 32)\\n }\\n\\n // Copy over as many complete words as we can.\\n for (uint256 i = 0; i < _length / 32; i++) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n\\n src += 32;\\n dest += 32;\\n }\\n\\n // Pick out the remaining bytes.\\n uint256 mask = 256 ** (32 - (_length % 32)) - 1;\\n assembly {\\n mstore(\\n dest,\\n or(\\n and(mload(src), not(mask)),\\n and(mload(dest), mask)\\n )\\n )\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Copies an RLP item into bytes.\\n * @param _in RLP item to copy.\\n * @return Copied bytes.\\n */\\n function _copy(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in.ptr, 0, _in.length);\\n }\\n}\\n\",\"keccak256\":\"0x829174c61216dce35fdb888383b6022e0365eb7fbdc71ad79d98b108091969fe\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPWriter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/**\\n * @title Lib_RLPWriter\\n * @author Bakaoh (with modifications)\\n */\\nlibrary Lib_RLPWriter {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * RLP encodes a byte string.\\n * @param _in The byte string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded;\\n\\n if (_in.length == 1 && uint8(_in[0]) < 128) {\\n encoded = _in;\\n } else {\\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * RLP encodes a list of RLP encoded byte byte strings.\\n * @param _in The list of RLP encoded byte strings.\\n * @return The RLP encoded list of items in bytes.\\n */\\n function writeList(\\n bytes[] memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory list = _flatten(_in);\\n return abi.encodePacked(_writeLength(list.length, 192), list);\\n }\\n\\n /**\\n * RLP encodes a string.\\n * @param _in The string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeString(\\n string memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(bytes(_in));\\n }\\n\\n /**\\n * RLP encodes an address.\\n * @param _in The address to encode.\\n * @return The RLP encoded address in bytes.\\n */\\n function writeAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a bytes32 value.\\n * @param _in The bytes32 to encode.\\n * @return _out The RLP encoded bytes32 in bytes.\\n */\\n function writeBytes32(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a uint.\\n * @param _in The uint256 to encode.\\n * @return The RLP encoded uint256 in bytes.\\n */\\n function writeUint(\\n uint256 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(_toBinary(_in));\\n }\\n\\n /**\\n * RLP encodes a bool.\\n * @param _in The bool to encode.\\n * @return The RLP encoded bool in bytes.\\n */\\n function writeBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded = new bytes(1);\\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\\n return encoded;\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\\n * @param _len The length of the string or the payload.\\n * @param _offset 128 if item is string, 192 if item is list.\\n * @return RLP encoded bytes.\\n */\\n function _writeLength(\\n uint256 _len,\\n uint256 _offset\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded;\\n\\n if (_len < 56) {\\n encoded = new bytes(1);\\n encoded[0] = byte(uint8(_len) + uint8(_offset));\\n } else {\\n uint256 lenLen;\\n uint256 i = 1;\\n while (_len / i != 0) {\\n lenLen++;\\n i *= 256;\\n }\\n\\n encoded = new bytes(lenLen + 1);\\n encoded[0] = byte(uint8(lenLen) + uint8(_offset) + 55);\\n for(i = 1; i <= lenLen; i++) {\\n encoded[i] = byte(uint8((_len / (256**(lenLen-i))) % 256));\\n }\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * Encode integer in big endian binary form with no leading zeroes.\\n * @notice TODO: This should be optimized with assembly to save gas costs.\\n * @param _x The integer to encode.\\n * @return RLP encoded bytes.\\n */\\n function _toBinary(\\n uint256 _x\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory b = abi.encodePacked(_x);\\n\\n uint256 i = 0;\\n for (; i < 32; i++) {\\n if (b[i] != 0) {\\n break;\\n }\\n }\\n\\n bytes memory res = new bytes(32 - i);\\n for (uint256 j = 0; j < res.length; j++) {\\n res[j] = b[i++];\\n }\\n\\n return res;\\n }\\n\\n /**\\n * Copies a piece of memory to another location.\\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\\n * @param _dest Destination location.\\n * @param _src Source location.\\n * @param _len Length of memory to copy.\\n */\\n function _memcpy(\\n uint256 _dest,\\n uint256 _src,\\n uint256 _len\\n )\\n private\\n pure\\n {\\n uint256 dest = _dest;\\n uint256 src = _src;\\n uint256 len = _len;\\n\\n for(; len >= 32; len -= 32) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n dest += 32;\\n src += 32;\\n }\\n\\n uint256 mask = 256 ** (32 - len) - 1;\\n assembly {\\n let srcpart := and(mload(src), not(mask))\\n let destpart := and(mload(dest), mask)\\n mstore(dest, or(destpart, srcpart))\\n }\\n }\\n\\n /**\\n * Flattens a list of byte strings into one byte string.\\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\\n * @param _list List of byte strings to flatten.\\n * @return The flattened byte string.\\n */\\n function _flatten(\\n bytes[] memory _list\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n if (_list.length == 0) {\\n return new bytes(0);\\n }\\n\\n uint256 len;\\n uint256 i = 0;\\n for (; i < _list.length; i++) {\\n len += _list[i].length;\\n }\\n\\n bytes memory flattened = new bytes(len);\\n uint256 flattenedPtr;\\n assembly { flattenedPtr := add(flattened, 0x20) }\\n\\n for(i = 0; i < _list.length; i++) {\\n bytes memory item = _list[i];\\n\\n uint256 listPtr;\\n assembly { listPtr := add(item, 0x20)}\\n\\n _memcpy(flattenedPtr, listPtr, item.length);\\n flattenedPtr += _list[i].length;\\n }\\n\\n return flattened;\\n }\\n}\\n\",\"keccak256\":\"0xb60ee4b03ad372c3deff21d454ab714dd0c18ee3e6f9d45532e209fc59d5a54d\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/trie/Lib_MerkleTrie.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\n\\n/**\\n * @title Lib_MerkleTrie\\n */\\nlibrary Lib_MerkleTrie {\\n\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n enum NodeType {\\n BranchNode,\\n ExtensionNode,\\n LeafNode\\n }\\n\\n struct TrieNode {\\n bytes encoded;\\n Lib_RLPReader.RLPItem[] decoded;\\n }\\n\\n\\n /**********************\\n * Contract Constants *\\n **********************/\\n\\n // TREE_RADIX determines the number of elements per branch node.\\n uint256 constant TREE_RADIX = 16;\\n // Branch nodes have TREE_RADIX elements plus an additional `value` slot.\\n uint256 constant BRANCH_NODE_LENGTH = TREE_RADIX + 1;\\n // Leaf nodes and extension nodes always have two elements, a `path` and a `value`.\\n uint256 constant LEAF_OR_EXTENSION_NODE_LENGTH = 2;\\n\\n // Prefixes are prepended to the `path` within a leaf or extension node and\\n // allow us to differentiate between the two node types. `ODD` or `EVEN` is\\n // determined by the number of nibbles within the unprefixed `path`. If the\\n // number of nibbles if even, we need to insert an extra padding nibble so\\n // the resulting prefixed `path` has an even number of nibbles.\\n uint8 constant PREFIX_EXTENSION_EVEN = 0;\\n uint8 constant PREFIX_EXTENSION_ODD = 1;\\n uint8 constant PREFIX_LEAF_EVEN = 2;\\n uint8 constant PREFIX_LEAF_ODD = 3;\\n\\n // Just a utility constant. RLP represents `NULL` as 0x80.\\n bytes1 constant RLP_NULL = bytes1(0x80);\\n bytes constant RLP_NULL_BYTES = hex'80';\\n bytes32 constant internal KECCAK256_RLP_NULL_BYTES = keccak256(RLP_NULL_BYTES);\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * @notice Verifies a proof that a given key/value pair is present in the\\n * Merkle trie.\\n * @param _key Key of the node to search for, as a hex string.\\n * @param _value Value of the node to search for, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the desired node. Unlike\\n * traditional Merkle trees, this proof is executed top-down and consists\\n * of a list of RLP-encoded nodes that make a path down to the target node.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _verified `true` if the k/v pair exists in the trie, `false` otherwise.\\n */\\n function verifyInclusionProof(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bool _verified\\n )\\n {\\n (\\n bool exists,\\n bytes memory value\\n ) = get(_key, _proof, _root);\\n\\n return (\\n exists && Lib_BytesUtils.equal(_value, value)\\n );\\n }\\n\\n /**\\n * @notice Updates a Merkle trie and returns a new root hash.\\n * @param _key Key of the node to update, as a hex string.\\n * @param _value Value of the node to update, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\\n * target node. If the key exists, we can simply update the value.\\n * Otherwise, we need to modify the trie to handle the new k/v pair.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _updatedRoot Root hash of the newly constructed trie.\\n */\\n function update(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bytes32 _updatedRoot\\n )\\n {\\n // Special case when inserting the very first node.\\n if (_root == KECCAK256_RLP_NULL_BYTES) {\\n return getSingleNodeRootHash(_key, _value);\\n }\\n\\n TrieNode[] memory proof = _parseProof(_proof);\\n (uint256 pathLength, bytes memory keyRemainder, ) = _walkNodePath(proof, _key, _root);\\n TrieNode[] memory newPath = _getNewPath(proof, pathLength, _key, keyRemainder, _value);\\n\\n return _getUpdatedTrieRoot(newPath, _key);\\n }\\n\\n /**\\n * @notice Retrieves the value associated with a given key.\\n * @param _key Key to search for, as hex bytes.\\n * @param _proof Merkle trie inclusion proof for the key.\\n * @param _root Known root of the Merkle trie.\\n * @return _exists Whether or not the key exists.\\n * @return _value Value of the key if it exists.\\n */\\n function get(\\n bytes memory _key,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bool _exists,\\n bytes memory _value\\n )\\n {\\n TrieNode[] memory proof = _parseProof(_proof);\\n (uint256 pathLength, bytes memory keyRemainder, bool isFinalNode) = _walkNodePath(proof, _key, _root);\\n\\n bool exists = keyRemainder.length == 0;\\n\\n require(\\n exists || isFinalNode,\\n \\\"Provided proof is invalid.\\\"\\n );\\n\\n bytes memory value = exists ? _getNodeValue(proof[pathLength - 1]) : bytes('');\\n\\n return (\\n exists,\\n value\\n );\\n }\\n\\n /**\\n * Computes the root hash for a trie with a single node.\\n * @param _key Key for the single node.\\n * @param _value Value for the single node.\\n * @return _updatedRoot Hash of the trie.\\n */\\n function getSingleNodeRootHash(\\n bytes memory _key,\\n bytes memory _value\\n )\\n internal\\n pure\\n returns (\\n bytes32 _updatedRoot\\n )\\n {\\n return keccak256(_makeLeafNode(\\n Lib_BytesUtils.toNibbles(_key),\\n _value\\n ).encoded);\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * @notice Walks through a proof using a provided key.\\n * @param _proof Inclusion proof to walk through.\\n * @param _key Key to use for the walk.\\n * @param _root Known root of the trie.\\n * @return _pathLength Length of the final path\\n * @return _keyRemainder Portion of the key remaining after the walk.\\n * @return _isFinalNode Whether or not we've hit a dead end.\\n */\\n function _walkNodePath(\\n TrieNode[] memory _proof,\\n bytes memory _key,\\n bytes32 _root\\n )\\n private\\n pure\\n returns (\\n uint256 _pathLength,\\n bytes memory _keyRemainder,\\n bool _isFinalNode\\n )\\n {\\n uint256 pathLength = 0;\\n bytes memory key = Lib_BytesUtils.toNibbles(_key);\\n\\n bytes32 currentNodeID = _root;\\n uint256 currentKeyIndex = 0;\\n uint256 currentKeyIncrement = 0;\\n TrieNode memory currentNode;\\n\\n // Proof is top-down, so we start at the first element (root).\\n for (uint256 i = 0; i < _proof.length; i++) {\\n currentNode = _proof[i];\\n currentKeyIndex += currentKeyIncrement;\\n\\n // Keep track of the proof elements we actually need.\\n // It's expensive to resize arrays, so this simply reduces gas costs.\\n pathLength += 1;\\n\\n if (currentKeyIndex == 0) {\\n // First proof element is always the root node.\\n require(\\n keccak256(currentNode.encoded) == currentNodeID,\\n \\\"Invalid root hash\\\"\\n );\\n } else if (currentNode.encoded.length >= 32) {\\n // Nodes 32 bytes or larger are hashed inside branch nodes.\\n require(\\n keccak256(currentNode.encoded) == currentNodeID,\\n \\\"Invalid large internal hash\\\"\\n );\\n } else {\\n // Nodes smaller than 31 bytes aren't hashed.\\n require(\\n Lib_BytesUtils.toBytes32(currentNode.encoded) == currentNodeID,\\n \\\"Invalid internal node hash\\\"\\n );\\n }\\n\\n if (currentNode.decoded.length == BRANCH_NODE_LENGTH) {\\n if (currentKeyIndex == key.length) {\\n // We've hit the end of the key, meaning the value should be within this branch node.\\n break;\\n } else {\\n // We're not at the end of the key yet.\\n // Figure out what the next node ID should be and continue.\\n uint8 branchKey = uint8(key[currentKeyIndex]);\\n Lib_RLPReader.RLPItem memory nextNode = currentNode.decoded[branchKey];\\n currentNodeID = _getNodeID(nextNode);\\n currentKeyIncrement = 1;\\n continue;\\n }\\n } else if (currentNode.decoded.length == LEAF_OR_EXTENSION_NODE_LENGTH) {\\n bytes memory path = _getNodePath(currentNode);\\n uint8 prefix = uint8(path[0]);\\n uint8 offset = 2 - prefix % 2;\\n bytes memory pathRemainder = Lib_BytesUtils.slice(path, offset);\\n bytes memory keyRemainder = Lib_BytesUtils.slice(key, currentKeyIndex);\\n uint256 sharedNibbleLength = _getSharedNibbleLength(pathRemainder, keyRemainder);\\n\\n if (prefix == PREFIX_LEAF_EVEN || prefix == PREFIX_LEAF_ODD) {\\n if (\\n pathRemainder.length == sharedNibbleLength &&\\n keyRemainder.length == sharedNibbleLength\\n ) {\\n // The key within this leaf matches our key exactly.\\n // Increment the key index to reflect that we have no remainder.\\n currentKeyIndex += sharedNibbleLength;\\n }\\n\\n // We've hit a leaf node, so our next node should be NULL.\\n currentNodeID = bytes32(RLP_NULL);\\n break;\\n } else if (prefix == PREFIX_EXTENSION_EVEN || prefix == PREFIX_EXTENSION_ODD) {\\n if (sharedNibbleLength != pathRemainder.length) {\\n // Our extension node is not identical to the remainder.\\n // We've hit the end of this path, updates will need to modify this extension.\\n currentNodeID = bytes32(RLP_NULL);\\n break;\\n } else {\\n // Our extension shares some nibbles.\\n // Carry on to the next node.\\n currentNodeID = _getNodeID(currentNode.decoded[1]);\\n currentKeyIncrement = sharedNibbleLength;\\n continue;\\n }\\n } else {\\n revert(\\\"Received a node with an unknown prefix\\\");\\n }\\n } else {\\n revert(\\\"Received an unparseable node.\\\");\\n }\\n }\\n\\n // If our node ID is NULL, then we're at a dead end.\\n bool isFinalNode = currentNodeID == bytes32(RLP_NULL);\\n return (pathLength, Lib_BytesUtils.slice(key, currentKeyIndex), isFinalNode);\\n }\\n\\n /**\\n * @notice Creates new nodes to support a k/v pair insertion into a given Merkle trie path.\\n * @param _path Path to the node nearest the k/v pair.\\n * @param _pathLength Length of the path. Necessary because the provided path may include\\n * additional nodes (e.g., it comes directly from a proof) and we can't resize in-memory\\n * arrays without costly duplication.\\n * @param _key Full original key.\\n * @param _keyRemainder Portion of the initial key that must be inserted into the trie.\\n * @param _value Value to insert at the given key.\\n * @return _newPath A new path with the inserted k/v pair and extra supporting nodes.\\n */\\n function _getNewPath(\\n TrieNode[] memory _path,\\n uint256 _pathLength,\\n bytes memory _key,\\n bytes memory _keyRemainder,\\n bytes memory _value\\n )\\n private\\n pure\\n returns (\\n TrieNode[] memory _newPath\\n )\\n {\\n bytes memory keyRemainder = _keyRemainder;\\n\\n // Most of our logic depends on the status of the last node in the path.\\n TrieNode memory lastNode = _path[_pathLength - 1];\\n NodeType lastNodeType = _getNodeType(lastNode);\\n\\n // Create an array for newly created nodes.\\n // We need up to three new nodes, depending on the contents of the last node.\\n // Since array resizing is expensive, we'll keep track of the size manually.\\n // We're using an explicit `totalNewNodes += 1` after insertions for clarity.\\n TrieNode[] memory newNodes = new TrieNode[](3);\\n uint256 totalNewNodes = 0;\\n\\n // Reference: https://github.com/ethereumjs/merkle-patricia-tree/blob/c0a10395aab37d42c175a47114ebfcbd7efcf059/src/baseTrie.ts#L294-L313\\n bool matchLeaf = false;\\n if (lastNodeType == NodeType.LeafNode) {\\n uint256 l = 0;\\n if (_path.length > 0) {\\n for (uint256 i = 0; i < _path.length - 1; i++) {\\n if (_getNodeType(_path[i]) == NodeType.BranchNode) {\\n l++;\\n } else {\\n l += _getNodeKey(_path[i]).length;\\n }\\n }\\n }\\n\\n if (\\n _getSharedNibbleLength(\\n _getNodeKey(lastNode),\\n Lib_BytesUtils.slice(Lib_BytesUtils.toNibbles(_key), l)\\n ) == _getNodeKey(lastNode).length\\n && keyRemainder.length == 0\\n ) {\\n matchLeaf = true;\\n }\\n }\\n\\n if (matchLeaf) {\\n // We've found a leaf node with the given key.\\n // Simply need to update the value of the node to match.\\n newNodes[totalNewNodes] = _makeLeafNode(_getNodeKey(lastNode), _value);\\n totalNewNodes += 1;\\n } else if (lastNodeType == NodeType.BranchNode) {\\n if (keyRemainder.length == 0) {\\n // We've found a branch node with the given key.\\n // Simply need to update the value of the node to match.\\n newNodes[totalNewNodes] = _editBranchValue(lastNode, _value);\\n totalNewNodes += 1;\\n } else {\\n // We've found a branch node, but it doesn't contain our key.\\n // Reinsert the old branch for now.\\n newNodes[totalNewNodes] = lastNode;\\n totalNewNodes += 1;\\n // Create a new leaf node, slicing our remainder since the first byte points\\n // to our branch node.\\n newNodes[totalNewNodes] = _makeLeafNode(Lib_BytesUtils.slice(keyRemainder, 1), _value);\\n totalNewNodes += 1;\\n }\\n } else {\\n // Our last node is either an extension node or a leaf node with a different key.\\n bytes memory lastNodeKey = _getNodeKey(lastNode);\\n uint256 sharedNibbleLength = _getSharedNibbleLength(lastNodeKey, keyRemainder);\\n\\n if (sharedNibbleLength != 0) {\\n // We've got some shared nibbles between the last node and our key remainder.\\n // We'll need to insert an extension node that covers these shared nibbles.\\n bytes memory nextNodeKey = Lib_BytesUtils.slice(lastNodeKey, 0, sharedNibbleLength);\\n newNodes[totalNewNodes] = _makeExtensionNode(nextNodeKey, _getNodeHash(_value));\\n totalNewNodes += 1;\\n\\n // Cut down the keys since we've just covered these shared nibbles.\\n lastNodeKey = Lib_BytesUtils.slice(lastNodeKey, sharedNibbleLength);\\n keyRemainder = Lib_BytesUtils.slice(keyRemainder, sharedNibbleLength);\\n }\\n\\n // Create an empty branch to fill in.\\n TrieNode memory newBranch = _makeEmptyBranchNode();\\n\\n if (lastNodeKey.length == 0) {\\n // Key remainder was larger than the key for our last node.\\n // The value within our last node is therefore going to be shifted into\\n // a branch value slot.\\n newBranch = _editBranchValue(newBranch, _getNodeValue(lastNode));\\n } else {\\n // Last node key was larger than the key remainder.\\n // We're going to modify some index of our branch.\\n uint8 branchKey = uint8(lastNodeKey[0]);\\n // Move on to the next nibble.\\n lastNodeKey = Lib_BytesUtils.slice(lastNodeKey, 1);\\n\\n if (lastNodeType == NodeType.LeafNode) {\\n // We're dealing with a leaf node.\\n // We'll modify the key and insert the old leaf node into the branch index.\\n TrieNode memory modifiedLastNode = _makeLeafNode(lastNodeKey, _getNodeValue(lastNode));\\n newBranch = _editBranchIndex(newBranch, branchKey, _getNodeHash(modifiedLastNode.encoded));\\n } else if (lastNodeKey.length != 0) {\\n // We're dealing with a shrinking extension node.\\n // We need to modify the node to decrease the size of the key.\\n TrieNode memory modifiedLastNode = _makeExtensionNode(lastNodeKey, _getNodeValue(lastNode));\\n newBranch = _editBranchIndex(newBranch, branchKey, _getNodeHash(modifiedLastNode.encoded));\\n } else {\\n // We're dealing with an unnecessary extension node.\\n // We're going to delete the node entirely.\\n // Simply insert its current value into the branch index.\\n newBranch = _editBranchIndex(newBranch, branchKey, _getNodeValue(lastNode));\\n }\\n }\\n\\n if (keyRemainder.length == 0) {\\n // We've got nothing left in the key remainder.\\n // Simply insert the value into the branch value slot.\\n newBranch = _editBranchValue(newBranch, _value);\\n // Push the branch into the list of new nodes.\\n newNodes[totalNewNodes] = newBranch;\\n totalNewNodes += 1;\\n } else {\\n // We've got some key remainder to work with.\\n // We'll be inserting a leaf node into the trie.\\n // First, move on to the next nibble.\\n keyRemainder = Lib_BytesUtils.slice(keyRemainder, 1);\\n // Push the branch into the list of new nodes.\\n newNodes[totalNewNodes] = newBranch;\\n totalNewNodes += 1;\\n // Push a new leaf node for our k/v pair.\\n newNodes[totalNewNodes] = _makeLeafNode(keyRemainder, _value);\\n totalNewNodes += 1;\\n }\\n }\\n\\n // Finally, join the old path with our newly created nodes.\\n // Since we're overwriting the last node in the path, we use `_pathLength - 1`.\\n return _joinNodeArrays(_path, _pathLength - 1, newNodes, totalNewNodes);\\n }\\n\\n /**\\n * @notice Computes the trie root from a given path.\\n * @param _nodes Path to some k/v pair.\\n * @param _key Key for the k/v pair.\\n * @return _updatedRoot Root hash for the updated trie.\\n */\\n function _getUpdatedTrieRoot(\\n TrieNode[] memory _nodes,\\n bytes memory _key\\n )\\n private\\n pure\\n returns (\\n bytes32 _updatedRoot\\n )\\n {\\n bytes memory key = Lib_BytesUtils.toNibbles(_key);\\n\\n // Some variables to keep track of during iteration.\\n TrieNode memory currentNode;\\n NodeType currentNodeType;\\n bytes memory previousNodeHash;\\n\\n // Run through the path backwards to rebuild our root hash.\\n for (uint256 i = _nodes.length; i > 0; i--) {\\n // Pick out the current node.\\n currentNode = _nodes[i - 1];\\n currentNodeType = _getNodeType(currentNode);\\n\\n if (currentNodeType == NodeType.LeafNode) {\\n // Leaf nodes are already correctly encoded.\\n // Shift the key over to account for the nodes key.\\n bytes memory nodeKey = _getNodeKey(currentNode);\\n key = Lib_BytesUtils.slice(key, 0, key.length - nodeKey.length);\\n } else if (currentNodeType == NodeType.ExtensionNode) {\\n // Shift the key over to account for the nodes key.\\n bytes memory nodeKey = _getNodeKey(currentNode);\\n key = Lib_BytesUtils.slice(key, 0, key.length - nodeKey.length);\\n\\n // If this node is the last element in the path, it'll be correctly encoded\\n // and we can skip this part.\\n if (previousNodeHash.length > 0) {\\n // Re-encode the node based on the previous node.\\n currentNode = _editExtensionNodeValue(currentNode, previousNodeHash);\\n }\\n } else if (currentNodeType == NodeType.BranchNode) {\\n // If this node is the last element in the path, it'll be correctly encoded\\n // and we can skip this part.\\n if (previousNodeHash.length > 0) {\\n // Re-encode the node based on the previous node.\\n uint8 branchKey = uint8(key[key.length - 1]);\\n key = Lib_BytesUtils.slice(key, 0, key.length - 1);\\n currentNode = _editBranchIndex(currentNode, branchKey, previousNodeHash);\\n }\\n }\\n\\n // Compute the node hash for the next iteration.\\n previousNodeHash = _getNodeHash(currentNode.encoded);\\n }\\n\\n // Current node should be the root at this point.\\n // Simply return the hash of its encoding.\\n return keccak256(currentNode.encoded);\\n }\\n\\n /**\\n * @notice Parses an RLP-encoded proof into something more useful.\\n * @param _proof RLP-encoded proof to parse.\\n * @return _parsed Proof parsed into easily accessible structs.\\n */\\n function _parseProof(\\n bytes memory _proof\\n )\\n private\\n pure\\n returns (\\n TrieNode[] memory _parsed\\n )\\n {\\n Lib_RLPReader.RLPItem[] memory nodes = Lib_RLPReader.readList(_proof);\\n TrieNode[] memory proof = new TrieNode[](nodes.length);\\n\\n for (uint256 i = 0; i < nodes.length; i++) {\\n bytes memory encoded = Lib_RLPReader.readBytes(nodes[i]);\\n proof[i] = TrieNode({\\n encoded: encoded,\\n decoded: Lib_RLPReader.readList(encoded)\\n });\\n }\\n\\n return proof;\\n }\\n\\n /**\\n * @notice Picks out the ID for a node. Node ID is referred to as the\\n * \\\"hash\\\" within the specification, but nodes < 32 bytes are not actually\\n * hashed.\\n * @param _node Node to pull an ID for.\\n * @return _nodeID ID for the node, depending on the size of its contents.\\n */\\n function _getNodeID(\\n Lib_RLPReader.RLPItem memory _node\\n )\\n private\\n pure\\n returns (\\n bytes32 _nodeID\\n )\\n {\\n bytes memory nodeID;\\n\\n if (_node.length < 32) {\\n // Nodes smaller than 32 bytes are RLP encoded.\\n nodeID = Lib_RLPReader.readRawBytes(_node);\\n } else {\\n // Nodes 32 bytes or larger are hashed.\\n nodeID = Lib_RLPReader.readBytes(_node);\\n }\\n\\n return Lib_BytesUtils.toBytes32(nodeID);\\n }\\n\\n /**\\n * @notice Gets the path for a leaf or extension node.\\n * @param _node Node to get a path for.\\n * @return _path Node path, converted to an array of nibbles.\\n */\\n function _getNodePath(\\n TrieNode memory _node\\n )\\n private\\n pure\\n returns (\\n bytes memory _path\\n )\\n {\\n return Lib_BytesUtils.toNibbles(Lib_RLPReader.readBytes(_node.decoded[0]));\\n }\\n\\n /**\\n * @notice Gets the key for a leaf or extension node. Keys are essentially\\n * just paths without any prefix.\\n * @param _node Node to get a key for.\\n * @return _key Node key, converted to an array of nibbles.\\n */\\n function _getNodeKey(\\n TrieNode memory _node\\n )\\n private\\n pure\\n returns (\\n bytes memory _key\\n )\\n {\\n return _removeHexPrefix(_getNodePath(_node));\\n }\\n\\n /**\\n * @notice Gets the path for a node.\\n * @param _node Node to get a value for.\\n * @return _value Node value, as hex bytes.\\n */\\n function _getNodeValue(\\n TrieNode memory _node\\n )\\n private\\n pure\\n returns (\\n bytes memory _value\\n )\\n {\\n return Lib_RLPReader.readBytes(_node.decoded[_node.decoded.length - 1]);\\n }\\n\\n /**\\n * @notice Computes the node hash for an encoded node. Nodes < 32 bytes\\n * are not hashed, all others are keccak256 hashed.\\n * @param _encoded Encoded node to hash.\\n * @return _hash Hash of the encoded node. Simply the input if < 32 bytes.\\n */\\n function _getNodeHash(\\n bytes memory _encoded\\n )\\n private\\n pure\\n returns (\\n bytes memory _hash\\n )\\n {\\n if (_encoded.length < 32) {\\n return _encoded;\\n } else {\\n return abi.encodePacked(keccak256(_encoded));\\n }\\n }\\n\\n /**\\n * @notice Determines the type for a given node.\\n * @param _node Node to determine a type for.\\n * @return _type Type of the node; BranchNode/ExtensionNode/LeafNode.\\n */\\n function _getNodeType(\\n TrieNode memory _node\\n )\\n private\\n pure\\n returns (\\n NodeType _type\\n )\\n {\\n if (_node.decoded.length == BRANCH_NODE_LENGTH) {\\n return NodeType.BranchNode;\\n } else if (_node.decoded.length == LEAF_OR_EXTENSION_NODE_LENGTH) {\\n bytes memory path = _getNodePath(_node);\\n uint8 prefix = uint8(path[0]);\\n\\n if (prefix == PREFIX_LEAF_EVEN || prefix == PREFIX_LEAF_ODD) {\\n return NodeType.LeafNode;\\n } else if (prefix == PREFIX_EXTENSION_EVEN || prefix == PREFIX_EXTENSION_ODD) {\\n return NodeType.ExtensionNode;\\n }\\n }\\n\\n revert(\\\"Invalid node type\\\");\\n }\\n\\n /**\\n * @notice Utility; determines the number of nibbles shared between two\\n * nibble arrays.\\n * @param _a First nibble array.\\n * @param _b Second nibble array.\\n * @return _shared Number of shared nibbles.\\n */\\n function _getSharedNibbleLength(\\n bytes memory _a,\\n bytes memory _b\\n )\\n private\\n pure\\n returns (\\n uint256 _shared\\n )\\n {\\n uint256 i = 0;\\n while (_a.length > i && _b.length > i && _a[i] == _b[i]) {\\n i++;\\n }\\n return i;\\n }\\n\\n /**\\n * @notice Utility; converts an RLP-encoded node into our nice struct.\\n * @param _raw RLP-encoded node to convert.\\n * @return _node Node as a TrieNode struct.\\n */\\n function _makeNode(\\n bytes[] memory _raw\\n )\\n private\\n pure\\n returns (\\n TrieNode memory _node\\n )\\n {\\n bytes memory encoded = Lib_RLPWriter.writeList(_raw);\\n\\n return TrieNode({\\n encoded: encoded,\\n decoded: Lib_RLPReader.readList(encoded)\\n });\\n }\\n\\n /**\\n * @notice Utility; converts an RLP-decoded node into our nice struct.\\n * @param _items RLP-decoded node to convert.\\n * @return _node Node as a TrieNode struct.\\n */\\n function _makeNode(\\n Lib_RLPReader.RLPItem[] memory _items\\n )\\n private\\n pure\\n returns (\\n TrieNode memory _node\\n )\\n {\\n bytes[] memory raw = new bytes[](_items.length);\\n for (uint256 i = 0; i < _items.length; i++) {\\n raw[i] = Lib_RLPReader.readRawBytes(_items[i]);\\n }\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Creates a new extension node.\\n * @param _key Key for the extension node, unprefixed.\\n * @param _value Value for the extension node.\\n * @return _node New extension node with the given k/v pair.\\n */\\n function _makeExtensionNode(\\n bytes memory _key,\\n bytes memory _value\\n )\\n private\\n pure\\n returns (\\n TrieNode memory _node\\n )\\n {\\n bytes[] memory raw = new bytes[](2);\\n bytes memory key = _addHexPrefix(_key, false);\\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\\n raw[1] = Lib_RLPWriter.writeBytes(_value);\\n return _makeNode(raw);\\n }\\n\\n /**\\n * Creates a new extension node with the same key but a different value.\\n * @param _node Extension node to copy and modify.\\n * @param _value New value for the extension node.\\n * @return New node with the same key and different value.\\n */\\n function _editExtensionNodeValue(\\n TrieNode memory _node,\\n bytes memory _value\\n )\\n private\\n pure\\n returns (\\n TrieNode memory\\n )\\n {\\n bytes[] memory raw = new bytes[](2);\\n bytes memory key = _addHexPrefix(_getNodeKey(_node), false);\\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\\n if (_value.length < 32) {\\n raw[1] = _value;\\n } else {\\n raw[1] = Lib_RLPWriter.writeBytes(_value);\\n }\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Creates a new leaf node.\\n * @dev This function is essentially identical to `_makeExtensionNode`.\\n * Although we could route both to a single method with a flag, it's\\n * more gas efficient to keep them separate and duplicate the logic.\\n * @param _key Key for the leaf node, unprefixed.\\n * @param _value Value for the leaf node.\\n * @return _node New leaf node with the given k/v pair.\\n */\\n function _makeLeafNode(\\n bytes memory _key,\\n bytes memory _value\\n )\\n private\\n pure\\n returns (\\n TrieNode memory _node\\n )\\n {\\n bytes[] memory raw = new bytes[](2);\\n bytes memory key = _addHexPrefix(_key, true);\\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\\n raw[1] = Lib_RLPWriter.writeBytes(_value);\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Creates an empty branch node.\\n * @return _node Empty branch node as a TrieNode struct.\\n */\\n function _makeEmptyBranchNode()\\n private\\n pure\\n returns (\\n TrieNode memory _node\\n )\\n {\\n bytes[] memory raw = new bytes[](BRANCH_NODE_LENGTH);\\n for (uint256 i = 0; i < raw.length; i++) {\\n raw[i] = RLP_NULL_BYTES;\\n }\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Modifies the value slot for a given branch.\\n * @param _branch Branch node to modify.\\n * @param _value Value to insert into the branch.\\n * @return _updatedNode Modified branch node.\\n */\\n function _editBranchValue(\\n TrieNode memory _branch,\\n bytes memory _value\\n )\\n private\\n pure\\n returns (\\n TrieNode memory _updatedNode\\n )\\n {\\n bytes memory encoded = Lib_RLPWriter.writeBytes(_value);\\n _branch.decoded[_branch.decoded.length - 1] = Lib_RLPReader.toRLPItem(encoded);\\n return _makeNode(_branch.decoded);\\n }\\n\\n /**\\n * @notice Modifies a slot at an index for a given branch.\\n * @param _branch Branch node to modify.\\n * @param _index Slot index to modify.\\n * @param _value Value to insert into the slot.\\n * @return _updatedNode Modified branch node.\\n */\\n function _editBranchIndex(\\n TrieNode memory _branch,\\n uint8 _index,\\n bytes memory _value\\n )\\n private\\n pure\\n returns (\\n TrieNode memory _updatedNode\\n )\\n {\\n bytes memory encoded = _value.length < 32 ? _value : Lib_RLPWriter.writeBytes(_value);\\n _branch.decoded[_index] = Lib_RLPReader.toRLPItem(encoded);\\n return _makeNode(_branch.decoded);\\n }\\n\\n /**\\n * @notice Utility; adds a prefix to a key.\\n * @param _key Key to prefix.\\n * @param _isLeaf Whether or not the key belongs to a leaf.\\n * @return _prefixedKey Prefixed key.\\n */\\n function _addHexPrefix(\\n bytes memory _key,\\n bool _isLeaf\\n )\\n private\\n pure\\n returns (\\n bytes memory _prefixedKey\\n )\\n {\\n uint8 prefix = _isLeaf ? uint8(0x02) : uint8(0x00);\\n uint8 offset = uint8(_key.length % 2);\\n bytes memory prefixed = new bytes(2 - offset);\\n prefixed[0] = bytes1(prefix + offset);\\n return abi.encodePacked(prefixed, _key);\\n }\\n\\n /**\\n * @notice Utility; removes a prefix from a path.\\n * @param _path Path to remove the prefix from.\\n * @return _unprefixedKey Unprefixed key.\\n */\\n function _removeHexPrefix(\\n bytes memory _path\\n )\\n private\\n pure\\n returns (\\n bytes memory _unprefixedKey\\n )\\n {\\n if (uint8(_path[0]) % 2 == 0) {\\n return Lib_BytesUtils.slice(_path, 2);\\n } else {\\n return Lib_BytesUtils.slice(_path, 1);\\n }\\n }\\n\\n /**\\n * @notice Utility; combines two node arrays. Array lengths are required\\n * because the actual lengths may be longer than the filled lengths.\\n * Array resizing is extremely costly and should be avoided.\\n * @param _a First array to join.\\n * @param _aLength Length of the first array.\\n * @param _b Second array to join.\\n * @param _bLength Length of the second array.\\n * @return _joined Combined node array.\\n */\\n function _joinNodeArrays(\\n TrieNode[] memory _a,\\n uint256 _aLength,\\n TrieNode[] memory _b,\\n uint256 _bLength\\n )\\n private\\n pure\\n returns (\\n TrieNode[] memory _joined\\n )\\n {\\n TrieNode[] memory ret = new TrieNode[](_aLength + _bLength);\\n\\n // Copy elements from the first array.\\n for (uint256 i = 0; i < _aLength; i++) {\\n ret[i] = _a[i];\\n }\\n\\n // Copy elements from the second array.\\n for (uint256 i = 0; i < _bLength; i++) {\\n ret[i + _aLength] = _b[i];\\n }\\n\\n return ret;\\n }\\n}\\n\",\"keccak256\":\"0x4bb09d0b4f965b57cdc6b3ace49967bcfe7f2580fa0b7863dfe288081247d876\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/trie/Lib_SecureMerkleTrie.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_MerkleTrie } from \\\"./Lib_MerkleTrie.sol\\\";\\n\\n/**\\n * @title Lib_SecureMerkleTrie\\n */\\nlibrary Lib_SecureMerkleTrie {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * @notice Verifies a proof that a given key/value pair is present in the\\n * Merkle trie.\\n * @param _key Key of the node to search for, as a hex string.\\n * @param _value Value of the node to search for, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the desired node. Unlike\\n * traditional Merkle trees, this proof is executed top-down and consists\\n * of a list of RLP-encoded nodes that make a path down to the target node.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _verified `true` if the k/v pair exists in the trie, `false` otherwise.\\n */\\n function verifyInclusionProof(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bool _verified\\n )\\n {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.verifyInclusionProof(key, _value, _proof, _root);\\n }\\n\\n /**\\n * @notice Updates a Merkle trie and returns a new root hash.\\n * @param _key Key of the node to update, as a hex string.\\n * @param _value Value of the node to update, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\\n * target node. If the key exists, we can simply update the value.\\n * Otherwise, we need to modify the trie to handle the new k/v pair.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _updatedRoot Root hash of the newly constructed trie.\\n */\\n function update(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bytes32 _updatedRoot\\n )\\n {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.update(key, _value, _proof, _root);\\n }\\n\\n /**\\n * @notice Retrieves the value associated with a given key.\\n * @param _key Key to search for, as hex bytes.\\n * @param _proof Merkle trie inclusion proof for the key.\\n * @param _root Known root of the Merkle trie.\\n * @return _exists Whether or not the key exists.\\n * @return _value Value of the key if it exists.\\n */\\n function get(\\n bytes memory _key,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bool _exists,\\n bytes memory _value\\n )\\n {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.get(key, _proof, _root);\\n }\\n\\n /**\\n * Computes the root hash for a trie with a single node.\\n * @param _key Key for the single node.\\n * @param _value Value for the single node.\\n * @return _updatedRoot Hash of the trie.\\n */\\n function getSingleNodeRootHash(\\n bytes memory _key,\\n bytes memory _value\\n )\\n internal\\n pure\\n returns (\\n bytes32 _updatedRoot\\n )\\n {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.getSingleNodeRootHash(key, _value);\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Computes the secure counterpart to a key.\\n * @param _key Key to get a secure key from.\\n * @return _secureKey Secure version of the key.\\n */\\n function _getSecureKey(\\n bytes memory _key\\n )\\n private\\n pure\\n returns (\\n bytes memory _secureKey\\n )\\n {\\n return abi.encodePacked(keccak256(_key));\\n }\\n}\",\"keccak256\":\"0xbbdd600165307d2131340599afa9dc0991f8f63727ba3a834bca5a3d7f501da8\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_Bytes32Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_Byte32Utils\\n */\\nlibrary Lib_Bytes32Utils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \\\"true.\\\"\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as a boolean.\\n */\\n function toBool(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return _in != 0;\\n }\\n\\n /**\\n * Converts a boolean to a bytes32 value.\\n * @param _in Input boolean value.\\n * @return Boolean as a bytes32.\\n */\\n function fromBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in ? 1 : 0));\\n }\\n\\n /**\\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as an address.\\n */\\n function toAddress(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return address(uint160(uint256(_in)));\\n }\\n\\n /**\\n * Converts an address to a bytes32.\\n * @param _in Input address value.\\n * @return Address as a bytes32.\\n */\\n function fromAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in));\\n }\\n\\n /**\\n * Removes the leading zeros from a bytes32 value and returns a new (smaller) bytes value.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 without any leading zeros.\\n */\\n function removeLeadingZeros(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out;\\n\\n assembly {\\n // Figure out how many leading zero bytes to remove.\\n let shift := 0\\n for { let i := 0 } and(lt(i, 32), eq(byte(i, _in), 0)) { i := add(i, 1) } {\\n shift := add(shift, 1)\\n }\\n\\n // Reserve some space for our output and fix the free memory pointer.\\n out := mload(0x40)\\n mstore(0x40, add(out, 0x40))\\n\\n // Shift the value and store it into the output bytes.\\n mstore(add(out, 0x20), shl(mul(shift, 8), _in))\\n\\n // Store the new size (with leading zero bytes removed) in the output byte size.\\n mstore(out, sub(32, shift))\\n }\\n\\n return out;\\n }\\n}\\n\",\"keccak256\":\"0xfa2def593e3fc56a31852c3744aefdaa93cec74e721bfcfeb1e5d166c7c60b64\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_BytesUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_BytesUtils\\n */\\nlibrary Lib_BytesUtils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_start + _length >= _start, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n if (_start >= _bytes.length) {\\n return bytes('');\\n }\\n\\n return slice(_bytes, _start, _bytes.length - _start);\\n }\\n\\n function toBytes32PadLeft(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n bytes32 ret;\\n uint256 len = _bytes.length <= 32 ? _bytes.length : 32;\\n assembly {\\n ret := shr(mul(sub(32, len), 8), mload(add(_bytes, 32)))\\n }\\n return ret;\\n }\\n\\n function toBytes32(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n if (_bytes.length < 32) {\\n bytes32 ret;\\n assembly {\\n ret := mload(add(_bytes, 32))\\n }\\n return ret;\\n }\\n\\n return abi.decode(_bytes,(bytes32)); // will truncate if input length > 32 bytes\\n }\\n\\n function toUint256(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return uint256(toBytes32(_bytes));\\n }\\n\\n function toUint24(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n uint24\\n )\\n {\\n require(_start + 3 >= _start, \\\"toUint24_overflow\\\");\\n require(_bytes.length >= _start + 3 , \\\"toUint24_outOfBounds\\\");\\n uint24 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x3), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toUint8(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n uint8\\n )\\n {\\n require(_start + 1 >= _start, \\\"toUint8_overflow\\\");\\n require(_bytes.length >= _start + 1 , \\\"toUint8_outOfBounds\\\");\\n uint8 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x1), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toAddress(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n require(_start + 20 >= _start, \\\"toAddress_overflow\\\");\\n require(_bytes.length >= _start + 20, \\\"toAddress_outOfBounds\\\");\\n address tempAddress;\\n\\n assembly {\\n tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000)\\n }\\n\\n return tempAddress;\\n }\\n\\n function toNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory nibbles = new bytes(_bytes.length * 2);\\n\\n for (uint256 i = 0; i < _bytes.length; i++) {\\n nibbles[i * 2] = _bytes[i] >> 4;\\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\\n }\\n\\n return nibbles;\\n }\\n\\n function fromNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory ret = new bytes(_bytes.length / 2);\\n\\n for (uint256 i = 0; i < ret.length; i++) {\\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\\n }\\n\\n return ret;\\n }\\n\\n function equal(\\n bytes memory _bytes,\\n bytes memory _other\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return keccak256(_bytes) == keccak256(_other);\\n }\\n}\\n\",\"keccak256\":\"0xd27e37973f1e0f64798725b7a0de12989dac992fba0d72970249d7e1f70e17c5\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_EthUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// @unsupported: ovm\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"./Lib_Bytes32Utils.sol\\\";\\n\\n/**\\n * @title Lib_EthUtils\\n */\\nlibrary Lib_EthUtils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Gets the code for a given address.\\n * @param _address Address to get code for.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Code read from the contract.\\n */\\n function getCode(\\n address _address,\\n uint256 _offset,\\n uint256 _length\\n )\\n internal\\n view\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory code;\\n assembly {\\n code := mload(0x40)\\n mstore(0x40, add(code, add(_length, 0x20)))\\n mstore(code, _length)\\n extcodecopy(_address, add(code, 0x20), _offset, _length)\\n }\\n\\n return code;\\n }\\n\\n /**\\n * Gets the full code for a given address.\\n * @param _address Address to get code for.\\n * @return Full code of the contract.\\n */\\n function getCode(\\n address _address\\n )\\n internal\\n view\\n returns (\\n bytes memory\\n )\\n {\\n return getCode(\\n _address,\\n 0,\\n getCodeSize(_address)\\n );\\n }\\n\\n /**\\n * Gets the size of a contract's code in bytes.\\n * @param _address Address to get code size for.\\n * @return Size of the contract's code in bytes.\\n */\\n function getCodeSize(\\n address _address\\n )\\n internal\\n view\\n returns (\\n uint256\\n )\\n {\\n uint256 codeSize;\\n assembly {\\n codeSize := extcodesize(_address)\\n }\\n\\n return codeSize;\\n }\\n\\n /**\\n * Gets the hash of a contract's code.\\n * @param _address Address to get a code hash for.\\n * @return Hash of the contract's code.\\n */\\n function getCodeHash(\\n address _address\\n )\\n internal\\n view\\n returns (\\n bytes32\\n )\\n {\\n bytes32 codeHash;\\n assembly {\\n codeHash := extcodehash(_address)\\n }\\n\\n return codeHash;\\n }\\n\\n /**\\n * Creates a contract with some given initialization code.\\n * @param _code Contract initialization code.\\n * @return Address of the created contract.\\n */\\n function createContract(\\n bytes memory _code\\n )\\n internal\\n returns (\\n address\\n )\\n {\\n address created;\\n assembly {\\n created := create(\\n 0,\\n add(_code, 0x20),\\n mload(_code)\\n )\\n }\\n\\n return created;\\n }\\n\\n /**\\n * Computes the address that would be generated by CREATE.\\n * @param _creator Address creating the contract.\\n * @param _nonce Creator's nonce.\\n * @return Address to be generated by CREATE.\\n */\\n function getAddressForCREATE(\\n address _creator,\\n uint256 _nonce\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n bytes[] memory encoded = new bytes[](2);\\n encoded[0] = Lib_RLPWriter.writeAddress(_creator);\\n encoded[1] = Lib_RLPWriter.writeUint(_nonce);\\n\\n bytes memory encodedList = Lib_RLPWriter.writeList(encoded);\\n return Lib_Bytes32Utils.toAddress(keccak256(encodedList));\\n }\\n\\n /**\\n * Computes the address that would be generated by CREATE2.\\n * @param _creator Address creating the contract.\\n * @param _bytecode Bytecode of the contract to be created.\\n * @param _salt 32 byte salt value mixed into the hash.\\n * @return Address to be generated by CREATE2.\\n */\\n function getAddressForCREATE2(\\n address _creator,\\n bytes memory _bytecode,\\n bytes32 _salt\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n bytes32 hashedData = keccak256(abi.encodePacked(\\n byte(0xff),\\n _creator,\\n _salt,\\n keccak256(_bytecode)\\n ));\\n\\n return Lib_Bytes32Utils.toAddress(hashedData);\\n }\\n}\\n\",\"keccak256\":\"0xf29a67d78e61cb472d524b779b32cfcb39a587f4096500d5419e6425ed367d49\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x608060405234801561001057600080fd5b50604051614b2b380380614b2b8339818101604052602081101561003357600080fd5b5051600080546001600160a01b039092166001600160a01b0319909216919091179055614ac6806100656000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c806322d1470214610046578063299ca4781461009a578063461a4478146100a2575b600080fd5b61007e6004803603608081101561005c57600080fd5b506001600160a01b038135169060208101359060408101359060600135610148565b604080516001600160a01b039092168252519081900360200190f35b61007e610229565b61007e600480360360208110156100b857600080fd5b8101906020810181356401000000008111156100d357600080fd5b8201836020820111156100e557600080fd5b8035906020019184600183028401116401000000008311171561010757600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610238945050505050565b600061017c6040518060400160405280601181526020017027ab26afa33930bab22b32b934b334b2b960791b815250610238565b6001600160a01b0316336001600160a01b0316146101cb5760405162461bcd60e51b8152600401808060200182810382526031815260200180614a606031913960400191505060405180910390fd5b848484846040516101db90610314565b80856001600160a01b03168152602001848152602001838152602001828152602001945050505050604051809103906000f08015801561021f573d6000803e3d6000fd5b5095945050505050565b6000546001600160a01b031681565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b83811015610298578181015183820152602001610280565b50505050905090810190601f1680156102c55780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b1580156102e257600080fd5b505afa1580156102f6573d6000803e3d6000fd5b505050506040513d602081101561030c57600080fd5b505192915050565b61473e806103228339019056fe60806040523480156200001157600080fd5b506040516200473e3803806200473e833981016040819052620000349162000232565b600080546001600160a01b0319166001600160a01b038616179055600583905560028290556003829055600681905560408051808201909152601781527f4f564d5f53746174654d616e61676572466163746f72790000000000000000006020820152620000a29062000150565b6001600160a01b0316639ed93318306040518263ffffffff1660e01b8152600401620000cf919062000299565b602060405180830381600087803b158015620000ea57600080fd5b505af1158015620000ff573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000125919062000273565b600180546001600160a01b0319166001600160a01b039290921691909117905550620002c692505050565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b83811015620001b257818101518382015260200162000198565b50505050905090810190601f168015620001e05780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b158015620001fe57600080fd5b505afa15801562000213573d6000803e3d6000fd5b505050506040513d60208110156200022a57600080fd5b505192915050565b6000806000806080858703121562000248578384fd5b84516200025581620002ad565b60208601516040870151606090970151919890975090945092505050565b60006020828403121562000285578081fd5b81516200029281620002ad565b9392505050565b6001600160a01b0391909116815260200190565b6001600160a01b0381168114620002c357600080fd5b50565b61446880620002d66000396000f3fe608060405234801561001057600080fd5b50600436106100cf5760003560e01c8063845fe7a31161008c578063b2fa1c9e11610066578063b2fa1c9e14610185578063b52805711461019a578063b9194310146101a2578063c1c618b8146101b5576100cf565b8063845fe7a314610155578063a244316a14610168578063b1c9fe6e14610170576100cf565b8063299ca478146100d45780632e1ac36c146100f25780632eb1375814610107578063461a44781461011a578063732f960b1461012d578063805e9d3014610140575b600080fd5b6100dc6101bd565b6040516100e99190613de6565b60405180910390f35b610105610100366004613a42565b6101cc565b005b610105610115366004613a82565b610565565b6100dc610128366004613b6a565b6108a1565b61010561013b366004613c2e565b61097f565b610148610c6f565b6040516100e99190613d3f565b610105610163366004613a42565b610c75565b610105610fa1565b610178611128565b6040516100e99190613e98565b61018d611131565b6040516100e99190613e8d565b6100dc61114c565b6101056101b03660046139e3565b61115b565b610148611475565b6000546001600160a01b031681565b60018060045460ff1660028111156101e057fe5b146102065760405162461bcd60e51b81526004016101fd906141e9565b60405180910390fd5b60025460065460005a6001546040516363b285f960e11b81529192506001600160a01b03169063c7650bf290610242908a908a90600401613dfa565b602060405180830381600087803b15801561025c57600080fd5b505af1158015610270573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102949190613acf565b15156001146102b55760405162461bcd60e51b81526004016101fd90613f94565b60015460405163fbcbc0f160e01b81526000916001600160a01b03169063fbcbc0f1906102e6908b90600401613de6565b60c06040518083038186803b1580156102fe57600080fd5b505afa158015610312573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103369190613baf565b600154604051631aaf392f60e01b81529192506000916001600160a01b0390911690631aaf392f9061036e908c908c90600401613dfa565b60206040518083038186803b15801561038657600080fd5b505afa15801561039a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103be9190613ae9565b90506103ff886040516020016103d49190613d3f565b6040516020818303038152906040526103f46103ef8461147b565b6114c4565b89856040015161152e565b6040808401919091526001549051638f3b964760e01b81526001600160a01b0390911690638f3b964790610439908c908690600401613e34565b600060405180830381600087803b15801561045357600080fd5b505af1158015610467573d6000803e3d6000fd5b505050507f3e3ed1a676a2754a041b49bf752e0f167c8753495e36c320fe01d1ef7476253c898960405161049c929190613dfa565b60405180910390a1505060005a820390506104dd6040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506108a1565b6001600160a01b0316631e16e92f858533856040518563ffffffff1660e01b815260040180858152602001848152602001836001600160a01b03168152602001828152602001945050505050600060405180830381600087803b15801561054357600080fd5b505af1158015610557573d6000803e3d6000fd5b505050505050505050505050565b60018060045460ff16600281111561057957fe5b146105965760405162461bcd60e51b81526004016101fd906141e9565b60025460065460005a9050600160009054906101000a90046001600160a01b03166001600160a01b03166399056ba96040518163ffffffff1660e01b815260040160206040518083038186803b1580156105ef57600080fd5b505afa158015610603573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106279190613ae9565b156106445760405162461bcd60e51b81526004016101fd90614075565b600154604051630b38106960e11b81526001600160a01b039091169063167020d290610674908990600401613de6565b602060405180830381600087803b15801561068e57600080fd5b505af11580156106a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106c69190613acf565b15156001146106e75760405162461bcd60e51b81526004016101fd9061412f565b60015460405163fbcbc0f160e01b81526000916001600160a01b03169063fbcbc0f190610718908a90600401613de6565b60c06040518083038186803b15801561073057600080fd5b505afa158015610744573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107689190613baf565b90506107a78760405160200161077e9190613d22565b60405160208183030381529060405261079e61079984611554565b611594565b8860035461152e565b6003556040517fcec9ef675d775706a02b43afe48af52c5019bc50f99582e3208c6ff55d59c008906107da908990613de6565b60405180910390a15060005a8203905061081a6040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506108a1565b6001600160a01b0316631e16e92f858533856040518563ffffffff1660e01b815260040180858152602001848152602001836001600160a01b03168152602001828152602001945050505050600060405180830381600087803b15801561088057600080fd5b505af1158015610894573d6000803e3d6000fd5b5050505050505050505050565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b838110156109015781810151838201526020016108e9565b50505050905090810190601f16801561092e5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561094b57600080fd5b505afa15801561095f573d6000803e3d6000fd5b505050506040513d602081101561097557600080fd5b505190505b919050565b60008060045460ff16600281111561099357fe5b146109b05760405162461bcd60e51b81526004016101fd906141e9565b60025460065460005a90506006546109c78661169d565b146109e45760405162461bcd60e51b81526004016101fd9061423a565b6103e88560a0015161040802816109f757fe5b04620186a0015a1015610a1c5760405162461bcd60e51b81526004016101fd906140d2565b6000610a536040518060400160405280601481526020017327ab26afa2bc32b1baba34b7b726b0b730b3b2b960611b8152506108a1565b600154604051631381ba4d60e01b81529192506001600160a01b031690631381ba4d90610a84908490600401613de6565b600060405180830381600087803b158015610a9e57600080fd5b505af1158015610ab2573d6000803e3d6000fd5b5050600154604051639be3ad6760e01b81526001600160a01b038086169450639be3ad679350610ae9928b929116906004016142ce565b600060405180830381600087803b158015610b0357600080fd5b505af1158015610b17573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610b3f9190810190613b01565b50600154604051631381ba4d60e01b81526001600160a01b0390911690631381ba4d90610b7190600090600401613de6565b600060405180830381600087803b158015610b8b57600080fd5b505af1158015610b9f573d6000803e3d6000fd5b50506004805460ff191660011790555060009150505a82039050610be96040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506108a1565b6001600160a01b0316631e16e92f858533856040518563ffffffff1660e01b815260040180858152602001848152602001836001600160a01b03168152602001828152602001945050505050600060405180830381600087803b158015610c4f57600080fd5b505af1158015610c63573d6000803e3d6000fd5b50505050505050505050565b60025490565b60008060045460ff166002811115610c8957fe5b14610ca65760405162461bcd60e51b81526004016101fd906141e9565b60025460065460005a600154604051630ad2267960e01b81529192506001600160a01b031690630ad2267990610ce2908a908a90600401613dfa565b60206040518083038186803b158015610cfa57600080fd5b505afa158015610d0e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d329190613acf565b15610d4f5760405162461bcd60e51b81526004016101fd90613eac565b60015460405163c8e40fbf60e01b81526001600160a01b039091169063c8e40fbf90610d7f908a90600401613de6565b60206040518083038186803b158015610d9757600080fd5b505afa158015610dab573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dcf9190613acf565b1515600114610df05760405162461bcd60e51b81526004016101fd90614271565b60015460405163136e2d8960e11b81526000916001600160a01b0316906326dc5b1290610e21908b90600401613de6565b60206040518083038186803b158015610e3957600080fd5b505afa158015610e4d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e719190613ae9565b905060007f56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421821415610ea557506000610f02565b600080610ed28a604051602001610ebc9190613d3f565b6040516020818303038152906040528a866116b6565b909250905060018215151415610efa57610ef3610eee826116df565b6116f2565b9250610eff565b600092505b50505b600154604051635c17d62960e01b81526001600160a01b0390911690635c17d62990610f36908c908c908690600401613e13565b600060405180830381600087803b158015610f5057600080fd5b505af1158015610f64573d6000803e3d6000fd5b50505050505060005a820390506104dd6040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506108a1565b60018060045460ff166002811115610fb557fe5b14610fd25760405162461bcd60e51b81526004016101fd906141e9565b600160009054906101000a90046001600160a01b03166001600160a01b031663d7bd4a2a6040518163ffffffff1660e01b815260040160206040518083038186803b15801561102057600080fd5b505afa158015611034573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110589190613ae9565b156110755760405162461bcd60e51b81526004016101fd90613f37565b600160009054906101000a90046001600160a01b03166001600160a01b03166399056ba96040518163ffffffff1660e01b815260040160206040518083038186803b1580156110c357600080fd5b505afa1580156110d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110fb9190613ae9565b156111185760405162461bcd60e51b81526004016101fd9061418c565b506004805460ff19166002179055565b60045460ff1681565b6000600260045460ff16600281111561114657fe5b14905090565b6001546001600160a01b031681565b60008060045460ff16600281111561116f57fe5b1461118c5760405162461bcd60e51b81526004016101fd906141e9565b60025460065460005a60015460405163c8e40fbf60e01b81529192506001600160a01b03169063c8e40fbf906111c6908a90600401613de6565b60206040518083038186803b1580156111de57600080fd5b505afa1580156111f2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112169190613acf565b1580156112a057506001546040516307a1294560e01b81526001600160a01b03909116906307a129459061124e908a90600401613de6565b60206040518083038186803b15801561126657600080fd5b505afa15801561127a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061129e9190613acf565b155b6112bc5760405162461bcd60e51b81526004016101fd90613ef1565b6000806112eb896040516020016112d39190613d22565b604051602081830303815290604052886002546116b6565b90925090506001821515141561140c57600061130682611721565b606081015190915089907fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470141561133f5750600061136a565b816060015161134d826117b3565b1461136a5760405162461bcd60e51b81526004016101fd90613ff2565b6001546040805160c08101825284518152602080860151908201528482015181830152606080860151908201526001600160a01b038481166080830152600060a08301529151638f3b964760e01b81529190921691638f3b9647916113d3918f91600401613e34565b600060405180830381600087803b1580156113ed57600080fd5b505af1158015611401573d6000803e3d6000fd5b50505050505061143c565b600154604051630d631c9d60e31b81526001600160a01b0390911690636b18e4e890610f36908c90600401613de6565b505060005a820390506104dd6040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506108a1565b60035490565b6060806000805b6020811085821a15161561149c5760019182019101611482565b5060405191506040820160405283600882021b60208301528060200382525080915050919050565b606080825160011480156114ec57506080836000815181106114e257fe5b016020015160f81c105b156114f8575081611528565b611504835160806117b7565b83604051602001611516929190613d48565b60405160208183030381529060405290505b92915050565b60008061153a86611906565b905061154881868686611936565b9150505b949350505050565b61155c613901565b604051806080016040528083600001518152602001836020015181526020018360400151815260200183606001518152509050919050565b60408051600480825260a0820190925260609160009190816020015b60608152602001906001900390816115b057505083519091506115d6906103ef9061147b565b816000815181106115e357fe5b60200260200101819052506116016103ef846020015160001b61147b565b8160018151811061160e57fe5b602002602001018190525061164583604001516040516020016116319190613d3f565b6040516020818303038152906040526114c4565b8160028151811061165257fe5b602002602001018190525061167583606001516040516020016116319190613d3f565b8160038151811061168257fe5b6020026020010181905250611696816119d2565b9392505050565b60006116a882611a16565b805190602001209050919050565b6000606060006116c586611906565b90506116d2818686611a51565b9250925050935093915050565b60606115286116ed83611b24565b611b49565b600080600060208451111561170857602061170b565b83515b6020858101519190036008021c92505050919050565b611729613901565b600061173483611bd8565b9050604051806080016040528061175e8360008151811061175157fe5b6020026020010151611beb565b81526020016117738360018151811061175157fe5b81526020016117958360028151811061178857fe5b6020026020010151611bf2565b81526020016117aa8360038151811061178857fe5b90529392505050565b3f90565b6060806038841015611811576040805160018082528183019092529060208201818036833701905050905082840160f81b816000815181106117f557fe5b60200101906001600160f81b031916908160001a905350611696565b600060015b80868161181f57fe5b04156118345760019091019061010002611816565b816001016001600160401b038111801561184d57600080fd5b506040519080825280601f01601f191660200182016040528015611878576020820181803683370190505b50925084820160370160f81b8360008151811061189157fe5b60200101906001600160f81b031916908160001a905350600190505b8181116118fd576101008183036101000a87816118c657fe5b04816118ce57fe5b0660f81b8382815181106118de57fe5b60200101906001600160f81b031916908160001a9053506001016118ad565b50509392505050565b606081805190602001206040516020016119209190613d3f565b6040516020818303038152906040529050919050565b6040805180820190915260018152600160ff1b60209091015260007f56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42182141561198a576119838585611cec565b905061154c565b600061199584611d10565b90506000806119a5838987611de6565b509150915060006119b984848b858c61218c565b90506119c5818a61256a565b9998505050505050505050565b606060006119df836126c3565b90506119ed815160c06117b7565b816040516020016119ff929190613d48565b604051602081830303815290604052915050919050565b6060816000015182602001518360400151846060015185608001518660a001518760c001516040516020016119209796959493929190613d77565b600060606000611a6085611d10565b90506000806000611a72848a89611de6565b81519295509093509150158080611a865750815b611ad7576040805162461bcd60e51b815260206004820152601a60248201527f50726f76696465642070726f6f6620697320696e76616c69642e000000000000604482015290519081900360640190fd5b600081611af35760405180602001604052806000815250611b12565b611b12866001870381518110611b0557fe5b60200260200101516127cc565b919b919a509098505050505050505050565b611b2c613928565b506040805180820190915281518152602082810190820152919050565b60606000806000611b59856127e8565b919450925090506000816001811115611b6e57fe5b14611bc0576040805162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c502062797465732076616c75652e0000000000000000604482015290519081900360640190fd5b611bcf85602001518484612b11565b95945050505050565b6060611528611be683611b24565b612bbe565b6000611528825b6000602182600001511115611c4e576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e000000000000604482015290519081900360640190fd5b6000806000611c5c856127e8565b919450925090506000816001811115611c7157fe5b14611cc3576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e000000000000604482015290519081900360640190fd5b602080860151840180519091841015611ce25760208490036101000a90045b9695505050505050565b6000611d00611cfa84612d34565b83612e30565b5180516020909101209392505050565b60606000611d1d83611bd8565b9050600081516001600160401b0381118015611d3857600080fd5b50604051908082528060200260200182016040528015611d7257816020015b611d5f613942565b815260200190600190039081611d575790505b50905060005b8251811015611dde576000611d9f848381518110611d9257fe5b6020026020010151611b49565b90506040518060400160405280828152602001611dbb83611bd8565b815250838381518110611dca57fe5b602090810291909101015250600101611d78565b509392505050565b60006060818080611df687612d34565b905085600080611e04613942565b60005b8c51811015612164578c8181518110611e1c57fe5b6020026020010151915082840193506001870196508360001415611e9057815180516020909101208514611e8b576040805162461bcd60e51b8152602060048201526011602482015270092dcecc2d8d2c840e4dedee840d0c2e6d607b1b604482015290519081900360640190fd5b611f57565b815151602011611ef757815180516020909101208514611e8b576040805162461bcd60e51b815260206004820152601b60248201527f496e76616c6964206c6172676520696e7465726e616c20686173680000000000604482015290519081900360640190fd5b84611f058360000151612ec4565b14611f57576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420696e7465726e616c206e6f64652068617368000000000000604482015290519081900360640190fd5b60208201515160111415611fc6578551841415611f7357612164565b6000868581518110611f8157fe5b602001015160f81c60f81b60f81c9050600083602001518260ff1681518110611fa657fe5b60200260200101519050611fb981612ef0565b965060019450505061215c565b6002826020015151141561210f576000611fdf83612f26565b9050600081600081518110611ff057fe5b016020015160f81c90506001811660020360006120108460ff8416612f44565b9050600061201e8b8a612f44565b9050600061202c8383612f71565b905060ff851660021480612043575060ff85166003145b15612075578083511480156120585750808251145b1561206257988901985b50600160ff1b9950612164945050505050565b60ff85161580612088575060ff85166001145b156120d857825181146120a85750600160ff1b9950612164945050505050565b6120c988602001516001815181106120bc57fe5b6020026020010151612ef0565b9a50975061215c945050505050565b60405162461bcd60e51b815260040180806020018281038252602681526020018061440d6026913960400191505060405180910390fd5b6040805162461bcd60e51b815260206004820152601d60248201527f526563656976656420616e20756e706172736561626c65206e6f64652e000000604482015290519081900360640190fd5b600101611e07565b50600160ff1b8414866121778786612f44565b909e909d50909b509950505050505050505050565b6060600083905060008760018803815181106121a457fe5b6020026020010151905060006121b982612fd7565b6040805160038082526080820190925291925060009190816020015b6121dd613942565b8152602001906001900390816121d5579050509050600080600284600281111561220357fe5b14156122cd578b51600090156122885760005b60018e51038110156122865760006122408f838151811061223357fe5b6020026020010151612fd7565b600281111561224b57fe5b141561225c5760019091019061227e565b6122788e828151811061226b57fe5b60200260200101516130ad565b51820191505b600101612216565b505b612291866130ad565b516122b561229e886130ad565b6122b06122aa8f612d34565b85612f44565b612f71565b1480156122c157508651155b156122cb57600191505b505b8015612307576122e56122df866130ad565b89612e30565b8383815181106122f157fe5b602002602001018190525060018201915061254b565b600084600281111561231557fe5b141561237e57855161234d5761232b85896130c0565b83838151811061233757fe5b6020026020010181905250600182019150612379565b8483838151811061235a57fe5b60200260200101819052506001820191506122e56122df876001612f44565b61254b565b6000612389866130ad565b905060006123978289612f71565b905080156123f85760006123ad8360008461310b565b90506123c1816123bc8d61325b565b61329c565b8686815181106123cd57fe5b60200260200101819052506001850194506123e88383612f44565b92506123f48983612f44565b9850505b60006124026132e0565b9050825160001415612427576124208161241b8a6127cc565b6130c0565b90506124bf565b60008360008151811061243657fe5b016020015160f81c905061244b846001612f44565b9350600288600281111561245b57fe5b1415612496576000612475856124708c6127cc565b612e30565b905061248e8383612489846000015161325b565b61336d565b9250506124bd565b8351156124ac576000612475856123bc8c6127cc565b6124ba82826124898c6127cc565b91505b505b88516124f4576124cf818c6130c0565b9050808686815181106124de57fe5b6020026020010181905250600185019450612547565b6124ff896001612f44565b98508086868151811061250e57fe5b6020026020010181905250600185019450612529898c612e30565b86868151811061253557fe5b60200260200101819052506001850194505b5050505b61255a8c60018d0385856133c6565b9c9b505050505050505050505050565b60008061257683612d34565b9050612580613942565b84516000906060905b80156126ae5787600182038151811061259e57fe5b602002602001015193506125b184612fd7565b925060028360028111156125c157fe5b14156125ec5760006125d2856130ad565b90506125e4866000835189510361310b565b955050612698565b60018360028111156125fa57fe5b141561263a57600061260b856130ad565b905061261d866000835189510361310b565b8351909650156126345761263185846134a8565b94505b50612698565b600083600281111561264857fe5b1415612698578151156126985760008560018751038151811061266757fe5b602001015160f81c60f81b60f81c9050612687866000600189510361310b565b955061269485828561336d565b9450505b83516126a39061325b565b915060001901612589565b50509051805160209091012095945050505050565b60608151600014156126e4575060408051600081526020810190915261097a565b6000805b8351811015612717578381815181106126fd57fe5b6020026020010151518201915080806001019150506126e8565b6000826001600160401b038111801561272f57600080fd5b506040519080825280601f01601f19166020018201604052801561275a576020820181803683370190505b50600092509050602081015b85518310156127c357600086848151811061277d57fe5b60200260200101519050600060208201905061279b83828451613554565b8785815181106127a757fe5b6020026020010151518301925050508280600101935050612766565b50949350505050565b60208101518051606091611528916000198101908110611d9257fe5b600080600080846000015111612845576040805162461bcd60e51b815260206004820152601860248201527f524c50206974656d2063616e6e6f74206265206e756c6c2e0000000000000000604482015290519081900360640190fd5b6020840151805160001a607f811161286a576000600160009450945094505050612b0a565b60b781116128df578551607f1982019081106128cd576040805162461bcd60e51b815260206004820152601960248201527f496e76616c696420524c502073686f727420737472696e672e00000000000000604482015290519081900360640190fd5b60019550935060009250612b0a915050565b60bf81116129c357855160b6198201908110612942576040805162461bcd60e51b815260206004820152601f60248201527f496e76616c696420524c50206c6f6e6720737472696e67206c656e6774682e00604482015290519081900360640190fd5b6000816020036101000a60018501510490508082018860000151116129ae576040805162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c50206c6f6e6720737472696e672e0000000000000000604482015290519081900360640190fd5b60019091019550935060009250612b0a915050565b60f78111612a3757855160bf198201908110612a26576040805162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c502073686f7274206c6973742e000000000000000000604482015290519081900360640190fd5b600195509350849250612b0a915050565b855160f6198201908110612a92576040805162461bcd60e51b815260206004820152601d60248201527f496e76616c696420524c50206c6f6e67206c697374206c656e6774682e000000604482015290519081900360640190fd5b6000816020036101000a6001850151049050808201886000015111612af7576040805162461bcd60e51b815260206004820152601660248201527524b73b30b634b210292628103637b733903634b9ba1760511b604482015290519081900360640190fd5b6001918201965094509250612b0a915050565b9193909250565b60606000826001600160401b0381118015612b2b57600080fd5b506040519080825280601f01601f191660200182016040528015612b56576020820181803683370190505b509050805160001415612b6a579050611696565b8484016020820160005b60208604811015612b95578251825260209283019290910190600101612b74565b5080519151601f959095166020036101000a600019019182169119909416179092525092915050565b6060600080612bcc846127e8565b91935090915060019050816001811115612be257fe5b14612c34576040805162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c50206c6973742076616c75652e000000000000000000604482015290519081900360640190fd5b6040805160208082526104208201909252600091816020015b612c55613928565b815260200190600190039081612c4d5790505090506000835b8651811015612d295760208210612cb65760405162461bcd60e51b815260040180806020018281038252602a8152602001806143e3602a913960400191505060405180910390fd5b600080612ce26040518060400160405280858c60000151038152602001858c60200151018152506127e8565b509150915060405180604001604052808383018152602001848b6020015101815250858581518110612d1057fe5b6020908102919091010152600193909301920101612c6e565b508152949350505050565b6060600082516002026001600160401b0381118015612d5257600080fd5b506040519080825280601f01601f191660200182016040528015612d7d576020820181803683370190505b50905060005b8351811015612e29576004848281518110612d9a57fe5b602001015160f81c60f81b6001600160f81b031916901c828260020281518110612dc057fe5b60200101906001600160f81b031916908160001a9053506010848281518110612de557fe5b016020015160f81c81612df457fe5b0660f81b828260020260010181518110612e0a57fe5b60200101906001600160f81b031916908160001a905350600101612d83565b5092915050565b612e38613942565b60408051600280825260608201909252600091816020015b6060815260200190600190039081612e505790505090506000612e74856001613598565b9050612e826103ef826136ef565b82600081518110612e8f57fe5b6020026020010181905250612ea3846114c4565b82600181518110612eb057fe5b6020026020010181905250611bcf826137bf565b6000602082511015612edb5750602081015161097a565b81806020019051602081101561097557600080fd5b60006060602083600001511015612f1157612f0a836137ee565b9050612f1d565b612f1a83611b49565b90505b61169681612ec4565b6060611528612f3f8360200151600081518110611d9257fe5b612d34565b606082518210612f635750604080516020810190915260008152611528565b61169683838486510361310b565b6000805b808451118015612f855750808351115b8015612fca5750828181518110612f9857fe5b602001015160f81c60f81b6001600160f81b031916848281518110612fb957fe5b01602001516001600160f81b031916145b1561169657600101612f75565b60208101515160009060111415612ff05750600061097a565b6002826020015151141561306c57600061300983612f26565b905060008160008151811061301a57fe5b016020015160f81c90506002811480613036575060ff81166003145b156130465760029250505061097a565b60ff81161580613059575060ff81166001145b156130695760019250505061097a565b50505b6040805162461bcd60e51b8152602060048201526011602482015270496e76616c6964206e6f6465207479706560781b604482015290519081900360640190fd5b60606115286130bb83612f26565b6137f9565b6130c8613942565b60006130d3836114c4565b90506130de81611b24565b6020850151805160001981019081106130f357fe5b602002602001018190525061154c8460200151613842565b60608182601f011015613156576040805162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b604482015290519081900360640190fd5b82828401101561319e576040805162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b604482015290519081900360640190fd5b818301845110156131ea576040805162461bcd60e51b8152602060048201526011602482015270736c6963655f6f75744f66426f756e647360781b604482015290519081900360640190fd5b60608215801561320957604051915060008252602082016040526127c3565b6040519150601f8416801560200281840101858101878315602002848b0101015b8183101561324257805183526020928301920161322a565b5050858452601f01601f19166040525050949350505050565b606060208251101561326e57508061097a565b818051906020012060405160200180828152602001915050604051602081830303815290604052905061097a565b6132a4613942565b60408051600280825260608201909252600091816020015b60608152602001906001900390816132bc5790505090506000612e74856000613598565b6132e8613942565b6040805160118082526102408201909252600091816020015b606081526020019060019003908161330157905050905060005b815181101561335d57604051806040016040528060018152602001600160ff1b81525082828151811061334a57fe5b602090810291909101015260010161331b565b50613367816137bf565b91505090565b613375613942565b6000602083511061338e57613389836114c4565b613390565b825b905061339b81611b24565b85602001518560ff16815181106133ae57fe5b6020026020010181905250611bcf8560200151613842565b606060008285016001600160401b03811180156133e257600080fd5b5060405190808252806020026020018201604052801561341c57816020015b613409613942565b8152602001906001900390816134015790505b50905060005b8581101561345d5786818151811061343657fe5b602002602001015182828151811061344a57fe5b6020908102919091010152600101613422565b5060005b8381101561349e5784818151811061347557fe5b6020026020010151828783018151811061348b57fe5b6020908102919091010152600101613461565b5095945050505050565b6134b0613942565b60408051600280825260608201909252600091816020015b60608152602001906001900390816134c857905050905060006134f46134ed866130ad565b6000613598565b90506135026103ef826136ef565b8260008151811061350f57fe5b602002602001018190525060208451101561354257838260018151811061353257fe5b602002602001018190525061354b565b612ea3846114c4565b611bcf826137bf565b8282825b60208110613577578151835260209283019290910190601f1901613558565b905182516020929092036101000a6000190180199091169116179052505050565b60606000826135a85760006135ab565b60025b9050600060028551816135ba57fe5b06905060008160020360ff166001600160401b03811180156135db57600080fd5b506040519080825280601f01601f191660200182016040528015613606576020820181803683370190505b50905081830160f81b8160008151811061361c57fe5b60200101906001600160f81b031916908160001a90535080866040516020018083805190602001908083835b602083106136675780518252601f199092019160209182019101613648565b51815160209384036101000a600019018019909216911617905285519190930192850191508083835b602083106136af5780518252601f199092019160209182019101613690565b6001836020036101000a03801982511681845116808217855250505050505090500192505050604051602081830303815290604052935050505092915050565b6060600060028351816136fe57fe5b046001600160401b038111801561371457600080fd5b506040519080825280601f01601f19166020018201604052801561373f576020820181803683370190505b50905060005b8151811015612e295783816002026001018151811061376057fe5b602001015160f81c60f81b600485836002028151811061377c57fe5b602001015160f81c60f81b6001600160f81b031916901b178282815181106137a057fe5b60200101906001600160f81b031916908160001a905350600101613745565b6137c7613942565b60006137d2836119d2565b905060405180604001604052808281526020016117aa83611bd8565b6060611528826138eb565b606060028260008151811061380a57fe5b016020015160f81c8161381957fe5b0660ff166000141561383757613830826002612f44565b905061097a565b613830826001612f44565b61384a613942565b600082516001600160401b038111801561386357600080fd5b5060405190808252806020026020018201604052801561389757816020015b60608152602001906001900390816138825790505b50905060005b83518110156138e1576138c28482815181106138b557fe5b60200260200101516137ee565b8282815181106138ce57fe5b602090810291909101015260010161389d565b50611696816137bf565b6060611528826020015160008460000151612b11565b60408051608081018252600080825260208201819052918101829052606081019190915290565b604051806040016040528060008152602001600081525090565b604051806040016040528060608152602001606081525090565b600061396f61396a84614379565b614356565b905082815283838301111561398357600080fd5b828260208301376000602084830101529392505050565b803561097a816143ca565b8051801515811461097a57600080fd5b600082601f8301126139c5578081fd5b6116968383356020850161395c565b80356002811061097a57600080fd5b6000806000606084860312156139f7578283fd5b8335613a02816143ca565b92506020840135613a12816143ca565b915060408401356001600160401b03811115613a2c578182fd5b613a38868287016139b5565b9150509250925092565b600080600060608486031215613a56578283fd5b8335613a61816143ca565b92506020840135915060408401356001600160401b03811115613a2c578182fd5b60008060408385031215613a94578182fd5b8235613a9f816143ca565b915060208301356001600160401b03811115613ab9578182fd5b613ac5858286016139b5565b9150509250929050565b600060208284031215613ae0578081fd5b611696826139a5565b600060208284031215613afa578081fd5b5051919050565b600060208284031215613b12578081fd5b81516001600160401b03811115613b27578182fd5b8201601f81018413613b37578182fd5b8051613b4561396a82614379565b818152856020838501011115613b59578384fd5b611bcf82602083016020860161439a565b600060208284031215613b7b578081fd5b81356001600160401b03811115613b90578182fd5b8201601f81018413613ba0578182fd5b61154c8482356020840161395c565b600060c08284031215613bc0578081fd5b60405160c081018181106001600160401b0382111715613bdc57fe5b8060405250825181526020830151602082015260408301516040820152606083015160608201526080830151613c11816143ca565b6080820152613c2260a084016139a5565b60a08201529392505050565b600060208284031215613c3f578081fd5b81356001600160401b0380821115613c55578283fd5b9083019060e08286031215613c68578283fd5b613c7260e0614356565b8235815260208301356020820152613c8c604084016139d4565b6040820152613c9d6060840161399a565b6060820152613cae6080840161399a565b608082015260a083013560a082015260c083013582811115613cce578485fd5b613cda878286016139b5565b60c08301525095945050505050565b6001600160a01b03169052565b60008151808452613d0e81602086016020860161439a565b601f01601f19169290920160200192915050565b60609190911b6bffffffffffffffffffffffff1916815260140190565b90815260200190565b60008351613d5a81846020880161439a565b835190830190613d6e81836020880161439a565b01949350505050565b600088825287602083015260028710613d8c57fe5b8660f81b60408301526bffffffffffffffffffffffff19808760601b166041840152808660601b166055840152508360698301528251613dd381608985016020870161439a565b9190910160890198975050505050505050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039390931683526020830191909152604082015260600190565b600060e08201905060018060a01b038085168352835160208401526020840151604084015260408401516060840152606084015160808401528060808501511660a08401525060a0830151151560c08301529392505050565b901515815260200190565b6020810160038310613ea657fe5b91905290565b60208082526025908201527f53746f7261676520736c6f742068617320616c7265616479206265656e20707260408201526437bb32b71760d91b606082015260800190565b60208082526026908201527f4163636f756e742073746174652068617320616c7265616479206265656e20706040820152653937bb32b71760d11b606082015260800190565b6020808252603e908201527f416c6c206163636f756e7473206d75737420626520636f6d6d6974746564206260408201527f65666f726520636f6d706c6574696e672061207472616e736974696f6e2e0000606082015260800190565b602080825260409082018190527f53746f7261676520736c6f742076616c7565207761736e2774206368616e6765908201527f64206f722068617320616c7265616479206265656e20636f6d6d69747465642e606082015260800190565b6020808252605b908201527f4f564d5f53746174655472616e736974696f6e65723a2050726f76696465642060408201527f4c3120636f6e747261637420636f6465206861736820646f6573206e6f74206d60608201527f61746368204c3220636f6e747261637420636f646520686173682e0000000000608082015260a00190565b6020808252603f908201527f416c6c2073746f72616765206d75737420626520636f6d6d697474656420626560408201527f666f726520636f6d6d697474696e67206163636f756e74207374617465732e00606082015260800190565b60208082526038908201527f4e6f7420656e6f7567682067617320746f2065786563757465207472616e736160408201527f6374696f6e2064657465726d696e6973746963616c6c792e0000000000000000606082015260800190565b6020808252603b908201527f4163636f756e74207374617465207761736e2774206368616e676564206f722060408201527f68617320616c7265616479206265656e20636f6d6d69747465642e0000000000606082015260800190565b6020808252603d908201527f416c6c2073746f72616765206d75737420626520636f6d6d697474656420626560408201527f666f726520636f6d706c6574696e672061207472616e736974696f6e2e000000606082015260800190565b60208082526031908201527f46756e6374696f6e206d7573742062652063616c6c656420647572696e67207460408201527034329031b7b93932b1ba10383430b9b29760791b606082015260800190565b6020808252601d908201527f496e76616c6964207472616e73616374696f6e2070726f76696465642e000000604082015260600190565b60208082526038908201527f436f6e7472616374206d757374206265207665726966696564206265666f726560408201527f2070726f76696e6720612073746f7261676520736c6f742e0000000000000000606082015260800190565b60006040825283516040830152602084015160608301526040840151600281106142f457fe5b60808381019190915260608501516001600160a01b031660a084015284015161432060c0840182613ce9565b5060a084015160e083015260c084015160e0610100840152614346610120840182613cf6565b9150506116966020830184613ce9565b6040518181016001600160401b038111828210171561437157fe5b604052919050565b60006001600160401b0382111561438c57fe5b50601f01601f191660200190565b60005b838110156143b557818101518382015260200161439d565b838111156143c4576000848401525b50505050565b6001600160a01b03811681146143df57600080fd5b5056fe50726f766964656420524c50206c6973742065786365656473206d6178206c697374206c656e6774682e52656365697665642061206e6f6465207769746820616e20756e6b6e6f776e20707265666978a2646970667358221220e1e4d3b66fdb29cc31b98f8b28be1f1ae5444146eb6157e8e4757ceec746aba764736f6c634300070600334372656174652063616e206f6e6c7920626520646f6e6520627920746865204f564d5f467261756456657269666965722ea264697066735822122055726a03c626eda10428d6a8adff2cef3ee762aaa0d2c446eee2a007c7036add64736f6c63430007060033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100415760003560e01c806322d1470214610046578063299ca4781461009a578063461a4478146100a2575b600080fd5b61007e6004803603608081101561005c57600080fd5b506001600160a01b038135169060208101359060408101359060600135610148565b604080516001600160a01b039092168252519081900360200190f35b61007e610229565b61007e600480360360208110156100b857600080fd5b8101906020810181356401000000008111156100d357600080fd5b8201836020820111156100e557600080fd5b8035906020019184600183028401116401000000008311171561010757600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610238945050505050565b600061017c6040518060400160405280601181526020017027ab26afa33930bab22b32b934b334b2b960791b815250610238565b6001600160a01b0316336001600160a01b0316146101cb5760405162461bcd60e51b8152600401808060200182810382526031815260200180614a606031913960400191505060405180910390fd5b848484846040516101db90610314565b80856001600160a01b03168152602001848152602001838152602001828152602001945050505050604051809103906000f08015801561021f573d6000803e3d6000fd5b5095945050505050565b6000546001600160a01b031681565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b83811015610298578181015183820152602001610280565b50505050905090810190601f1680156102c55780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b1580156102e257600080fd5b505afa1580156102f6573d6000803e3d6000fd5b505050506040513d602081101561030c57600080fd5b505192915050565b61473e806103228339019056fe60806040523480156200001157600080fd5b506040516200473e3803806200473e833981016040819052620000349162000232565b600080546001600160a01b0319166001600160a01b038616179055600583905560028290556003829055600681905560408051808201909152601781527f4f564d5f53746174654d616e61676572466163746f72790000000000000000006020820152620000a29062000150565b6001600160a01b0316639ed93318306040518263ffffffff1660e01b8152600401620000cf919062000299565b602060405180830381600087803b158015620000ea57600080fd5b505af1158015620000ff573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000125919062000273565b600180546001600160a01b0319166001600160a01b039290921691909117905550620002c692505050565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b83811015620001b257818101518382015260200162000198565b50505050905090810190601f168015620001e05780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b158015620001fe57600080fd5b505afa15801562000213573d6000803e3d6000fd5b505050506040513d60208110156200022a57600080fd5b505192915050565b6000806000806080858703121562000248578384fd5b84516200025581620002ad565b60208601516040870151606090970151919890975090945092505050565b60006020828403121562000285578081fd5b81516200029281620002ad565b9392505050565b6001600160a01b0391909116815260200190565b6001600160a01b0381168114620002c357600080fd5b50565b61446880620002d66000396000f3fe608060405234801561001057600080fd5b50600436106100cf5760003560e01c8063845fe7a31161008c578063b2fa1c9e11610066578063b2fa1c9e14610185578063b52805711461019a578063b9194310146101a2578063c1c618b8146101b5576100cf565b8063845fe7a314610155578063a244316a14610168578063b1c9fe6e14610170576100cf565b8063299ca478146100d45780632e1ac36c146100f25780632eb1375814610107578063461a44781461011a578063732f960b1461012d578063805e9d3014610140575b600080fd5b6100dc6101bd565b6040516100e99190613de6565b60405180910390f35b610105610100366004613a42565b6101cc565b005b610105610115366004613a82565b610565565b6100dc610128366004613b6a565b6108a1565b61010561013b366004613c2e565b61097f565b610148610c6f565b6040516100e99190613d3f565b610105610163366004613a42565b610c75565b610105610fa1565b610178611128565b6040516100e99190613e98565b61018d611131565b6040516100e99190613e8d565b6100dc61114c565b6101056101b03660046139e3565b61115b565b610148611475565b6000546001600160a01b031681565b60018060045460ff1660028111156101e057fe5b146102065760405162461bcd60e51b81526004016101fd906141e9565b60405180910390fd5b60025460065460005a6001546040516363b285f960e11b81529192506001600160a01b03169063c7650bf290610242908a908a90600401613dfa565b602060405180830381600087803b15801561025c57600080fd5b505af1158015610270573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102949190613acf565b15156001146102b55760405162461bcd60e51b81526004016101fd90613f94565b60015460405163fbcbc0f160e01b81526000916001600160a01b03169063fbcbc0f1906102e6908b90600401613de6565b60c06040518083038186803b1580156102fe57600080fd5b505afa158015610312573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103369190613baf565b600154604051631aaf392f60e01b81529192506000916001600160a01b0390911690631aaf392f9061036e908c908c90600401613dfa565b60206040518083038186803b15801561038657600080fd5b505afa15801561039a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103be9190613ae9565b90506103ff886040516020016103d49190613d3f565b6040516020818303038152906040526103f46103ef8461147b565b6114c4565b89856040015161152e565b6040808401919091526001549051638f3b964760e01b81526001600160a01b0390911690638f3b964790610439908c908690600401613e34565b600060405180830381600087803b15801561045357600080fd5b505af1158015610467573d6000803e3d6000fd5b505050507f3e3ed1a676a2754a041b49bf752e0f167c8753495e36c320fe01d1ef7476253c898960405161049c929190613dfa565b60405180910390a1505060005a820390506104dd6040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506108a1565b6001600160a01b0316631e16e92f858533856040518563ffffffff1660e01b815260040180858152602001848152602001836001600160a01b03168152602001828152602001945050505050600060405180830381600087803b15801561054357600080fd5b505af1158015610557573d6000803e3d6000fd5b505050505050505050505050565b60018060045460ff16600281111561057957fe5b146105965760405162461bcd60e51b81526004016101fd906141e9565b60025460065460005a9050600160009054906101000a90046001600160a01b03166001600160a01b03166399056ba96040518163ffffffff1660e01b815260040160206040518083038186803b1580156105ef57600080fd5b505afa158015610603573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106279190613ae9565b156106445760405162461bcd60e51b81526004016101fd90614075565b600154604051630b38106960e11b81526001600160a01b039091169063167020d290610674908990600401613de6565b602060405180830381600087803b15801561068e57600080fd5b505af11580156106a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106c69190613acf565b15156001146106e75760405162461bcd60e51b81526004016101fd9061412f565b60015460405163fbcbc0f160e01b81526000916001600160a01b03169063fbcbc0f190610718908a90600401613de6565b60c06040518083038186803b15801561073057600080fd5b505afa158015610744573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107689190613baf565b90506107a78760405160200161077e9190613d22565b60405160208183030381529060405261079e61079984611554565b611594565b8860035461152e565b6003556040517fcec9ef675d775706a02b43afe48af52c5019bc50f99582e3208c6ff55d59c008906107da908990613de6565b60405180910390a15060005a8203905061081a6040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506108a1565b6001600160a01b0316631e16e92f858533856040518563ffffffff1660e01b815260040180858152602001848152602001836001600160a01b03168152602001828152602001945050505050600060405180830381600087803b15801561088057600080fd5b505af1158015610894573d6000803e3d6000fd5b5050505050505050505050565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b838110156109015781810151838201526020016108e9565b50505050905090810190601f16801561092e5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561094b57600080fd5b505afa15801561095f573d6000803e3d6000fd5b505050506040513d602081101561097557600080fd5b505190505b919050565b60008060045460ff16600281111561099357fe5b146109b05760405162461bcd60e51b81526004016101fd906141e9565b60025460065460005a90506006546109c78661169d565b146109e45760405162461bcd60e51b81526004016101fd9061423a565b6103e88560a0015161040802816109f757fe5b04620186a0015a1015610a1c5760405162461bcd60e51b81526004016101fd906140d2565b6000610a536040518060400160405280601481526020017327ab26afa2bc32b1baba34b7b726b0b730b3b2b960611b8152506108a1565b600154604051631381ba4d60e01b81529192506001600160a01b031690631381ba4d90610a84908490600401613de6565b600060405180830381600087803b158015610a9e57600080fd5b505af1158015610ab2573d6000803e3d6000fd5b5050600154604051639be3ad6760e01b81526001600160a01b038086169450639be3ad679350610ae9928b929116906004016142ce565b600060405180830381600087803b158015610b0357600080fd5b505af1158015610b17573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610b3f9190810190613b01565b50600154604051631381ba4d60e01b81526001600160a01b0390911690631381ba4d90610b7190600090600401613de6565b600060405180830381600087803b158015610b8b57600080fd5b505af1158015610b9f573d6000803e3d6000fd5b50506004805460ff191660011790555060009150505a82039050610be96040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506108a1565b6001600160a01b0316631e16e92f858533856040518563ffffffff1660e01b815260040180858152602001848152602001836001600160a01b03168152602001828152602001945050505050600060405180830381600087803b158015610c4f57600080fd5b505af1158015610c63573d6000803e3d6000fd5b50505050505050505050565b60025490565b60008060045460ff166002811115610c8957fe5b14610ca65760405162461bcd60e51b81526004016101fd906141e9565b60025460065460005a600154604051630ad2267960e01b81529192506001600160a01b031690630ad2267990610ce2908a908a90600401613dfa565b60206040518083038186803b158015610cfa57600080fd5b505afa158015610d0e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d329190613acf565b15610d4f5760405162461bcd60e51b81526004016101fd90613eac565b60015460405163c8e40fbf60e01b81526001600160a01b039091169063c8e40fbf90610d7f908a90600401613de6565b60206040518083038186803b158015610d9757600080fd5b505afa158015610dab573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dcf9190613acf565b1515600114610df05760405162461bcd60e51b81526004016101fd90614271565b60015460405163136e2d8960e11b81526000916001600160a01b0316906326dc5b1290610e21908b90600401613de6565b60206040518083038186803b158015610e3957600080fd5b505afa158015610e4d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e719190613ae9565b905060007f56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421821415610ea557506000610f02565b600080610ed28a604051602001610ebc9190613d3f565b6040516020818303038152906040528a866116b6565b909250905060018215151415610efa57610ef3610eee826116df565b6116f2565b9250610eff565b600092505b50505b600154604051635c17d62960e01b81526001600160a01b0390911690635c17d62990610f36908c908c908690600401613e13565b600060405180830381600087803b158015610f5057600080fd5b505af1158015610f64573d6000803e3d6000fd5b50505050505060005a820390506104dd6040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506108a1565b60018060045460ff166002811115610fb557fe5b14610fd25760405162461bcd60e51b81526004016101fd906141e9565b600160009054906101000a90046001600160a01b03166001600160a01b031663d7bd4a2a6040518163ffffffff1660e01b815260040160206040518083038186803b15801561102057600080fd5b505afa158015611034573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110589190613ae9565b156110755760405162461bcd60e51b81526004016101fd90613f37565b600160009054906101000a90046001600160a01b03166001600160a01b03166399056ba96040518163ffffffff1660e01b815260040160206040518083038186803b1580156110c357600080fd5b505afa1580156110d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110fb9190613ae9565b156111185760405162461bcd60e51b81526004016101fd9061418c565b506004805460ff19166002179055565b60045460ff1681565b6000600260045460ff16600281111561114657fe5b14905090565b6001546001600160a01b031681565b60008060045460ff16600281111561116f57fe5b1461118c5760405162461bcd60e51b81526004016101fd906141e9565b60025460065460005a60015460405163c8e40fbf60e01b81529192506001600160a01b03169063c8e40fbf906111c6908a90600401613de6565b60206040518083038186803b1580156111de57600080fd5b505afa1580156111f2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112169190613acf565b1580156112a057506001546040516307a1294560e01b81526001600160a01b03909116906307a129459061124e908a90600401613de6565b60206040518083038186803b15801561126657600080fd5b505afa15801561127a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061129e9190613acf565b155b6112bc5760405162461bcd60e51b81526004016101fd90613ef1565b6000806112eb896040516020016112d39190613d22565b604051602081830303815290604052886002546116b6565b90925090506001821515141561140c57600061130682611721565b606081015190915089907fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470141561133f5750600061136a565b816060015161134d826117b3565b1461136a5760405162461bcd60e51b81526004016101fd90613ff2565b6001546040805160c08101825284518152602080860151908201528482015181830152606080860151908201526001600160a01b038481166080830152600060a08301529151638f3b964760e01b81529190921691638f3b9647916113d3918f91600401613e34565b600060405180830381600087803b1580156113ed57600080fd5b505af1158015611401573d6000803e3d6000fd5b50505050505061143c565b600154604051630d631c9d60e31b81526001600160a01b0390911690636b18e4e890610f36908c90600401613de6565b505060005a820390506104dd6040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506108a1565b60035490565b6060806000805b6020811085821a15161561149c5760019182019101611482565b5060405191506040820160405283600882021b60208301528060200382525080915050919050565b606080825160011480156114ec57506080836000815181106114e257fe5b016020015160f81c105b156114f8575081611528565b611504835160806117b7565b83604051602001611516929190613d48565b60405160208183030381529060405290505b92915050565b60008061153a86611906565b905061154881868686611936565b9150505b949350505050565b61155c613901565b604051806080016040528083600001518152602001836020015181526020018360400151815260200183606001518152509050919050565b60408051600480825260a0820190925260609160009190816020015b60608152602001906001900390816115b057505083519091506115d6906103ef9061147b565b816000815181106115e357fe5b60200260200101819052506116016103ef846020015160001b61147b565b8160018151811061160e57fe5b602002602001018190525061164583604001516040516020016116319190613d3f565b6040516020818303038152906040526114c4565b8160028151811061165257fe5b602002602001018190525061167583606001516040516020016116319190613d3f565b8160038151811061168257fe5b6020026020010181905250611696816119d2565b9392505050565b60006116a882611a16565b805190602001209050919050565b6000606060006116c586611906565b90506116d2818686611a51565b9250925050935093915050565b60606115286116ed83611b24565b611b49565b600080600060208451111561170857602061170b565b83515b6020858101519190036008021c92505050919050565b611729613901565b600061173483611bd8565b9050604051806080016040528061175e8360008151811061175157fe5b6020026020010151611beb565b81526020016117738360018151811061175157fe5b81526020016117958360028151811061178857fe5b6020026020010151611bf2565b81526020016117aa8360038151811061178857fe5b90529392505050565b3f90565b6060806038841015611811576040805160018082528183019092529060208201818036833701905050905082840160f81b816000815181106117f557fe5b60200101906001600160f81b031916908160001a905350611696565b600060015b80868161181f57fe5b04156118345760019091019061010002611816565b816001016001600160401b038111801561184d57600080fd5b506040519080825280601f01601f191660200182016040528015611878576020820181803683370190505b50925084820160370160f81b8360008151811061189157fe5b60200101906001600160f81b031916908160001a905350600190505b8181116118fd576101008183036101000a87816118c657fe5b04816118ce57fe5b0660f81b8382815181106118de57fe5b60200101906001600160f81b031916908160001a9053506001016118ad565b50509392505050565b606081805190602001206040516020016119209190613d3f565b6040516020818303038152906040529050919050565b6040805180820190915260018152600160ff1b60209091015260007f56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42182141561198a576119838585611cec565b905061154c565b600061199584611d10565b90506000806119a5838987611de6565b509150915060006119b984848b858c61218c565b90506119c5818a61256a565b9998505050505050505050565b606060006119df836126c3565b90506119ed815160c06117b7565b816040516020016119ff929190613d48565b604051602081830303815290604052915050919050565b6060816000015182602001518360400151846060015185608001518660a001518760c001516040516020016119209796959493929190613d77565b600060606000611a6085611d10565b90506000806000611a72848a89611de6565b81519295509093509150158080611a865750815b611ad7576040805162461bcd60e51b815260206004820152601a60248201527f50726f76696465642070726f6f6620697320696e76616c69642e000000000000604482015290519081900360640190fd5b600081611af35760405180602001604052806000815250611b12565b611b12866001870381518110611b0557fe5b60200260200101516127cc565b919b919a509098505050505050505050565b611b2c613928565b506040805180820190915281518152602082810190820152919050565b60606000806000611b59856127e8565b919450925090506000816001811115611b6e57fe5b14611bc0576040805162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c502062797465732076616c75652e0000000000000000604482015290519081900360640190fd5b611bcf85602001518484612b11565b95945050505050565b6060611528611be683611b24565b612bbe565b6000611528825b6000602182600001511115611c4e576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e000000000000604482015290519081900360640190fd5b6000806000611c5c856127e8565b919450925090506000816001811115611c7157fe5b14611cc3576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e000000000000604482015290519081900360640190fd5b602080860151840180519091841015611ce25760208490036101000a90045b9695505050505050565b6000611d00611cfa84612d34565b83612e30565b5180516020909101209392505050565b60606000611d1d83611bd8565b9050600081516001600160401b0381118015611d3857600080fd5b50604051908082528060200260200182016040528015611d7257816020015b611d5f613942565b815260200190600190039081611d575790505b50905060005b8251811015611dde576000611d9f848381518110611d9257fe5b6020026020010151611b49565b90506040518060400160405280828152602001611dbb83611bd8565b815250838381518110611dca57fe5b602090810291909101015250600101611d78565b509392505050565b60006060818080611df687612d34565b905085600080611e04613942565b60005b8c51811015612164578c8181518110611e1c57fe5b6020026020010151915082840193506001870196508360001415611e9057815180516020909101208514611e8b576040805162461bcd60e51b8152602060048201526011602482015270092dcecc2d8d2c840e4dedee840d0c2e6d607b1b604482015290519081900360640190fd5b611f57565b815151602011611ef757815180516020909101208514611e8b576040805162461bcd60e51b815260206004820152601b60248201527f496e76616c6964206c6172676520696e7465726e616c20686173680000000000604482015290519081900360640190fd5b84611f058360000151612ec4565b14611f57576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420696e7465726e616c206e6f64652068617368000000000000604482015290519081900360640190fd5b60208201515160111415611fc6578551841415611f7357612164565b6000868581518110611f8157fe5b602001015160f81c60f81b60f81c9050600083602001518260ff1681518110611fa657fe5b60200260200101519050611fb981612ef0565b965060019450505061215c565b6002826020015151141561210f576000611fdf83612f26565b9050600081600081518110611ff057fe5b016020015160f81c90506001811660020360006120108460ff8416612f44565b9050600061201e8b8a612f44565b9050600061202c8383612f71565b905060ff851660021480612043575060ff85166003145b15612075578083511480156120585750808251145b1561206257988901985b50600160ff1b9950612164945050505050565b60ff85161580612088575060ff85166001145b156120d857825181146120a85750600160ff1b9950612164945050505050565b6120c988602001516001815181106120bc57fe5b6020026020010151612ef0565b9a50975061215c945050505050565b60405162461bcd60e51b815260040180806020018281038252602681526020018061440d6026913960400191505060405180910390fd5b6040805162461bcd60e51b815260206004820152601d60248201527f526563656976656420616e20756e706172736561626c65206e6f64652e000000604482015290519081900360640190fd5b600101611e07565b50600160ff1b8414866121778786612f44565b909e909d50909b509950505050505050505050565b6060600083905060008760018803815181106121a457fe5b6020026020010151905060006121b982612fd7565b6040805160038082526080820190925291925060009190816020015b6121dd613942565b8152602001906001900390816121d5579050509050600080600284600281111561220357fe5b14156122cd578b51600090156122885760005b60018e51038110156122865760006122408f838151811061223357fe5b6020026020010151612fd7565b600281111561224b57fe5b141561225c5760019091019061227e565b6122788e828151811061226b57fe5b60200260200101516130ad565b51820191505b600101612216565b505b612291866130ad565b516122b561229e886130ad565b6122b06122aa8f612d34565b85612f44565b612f71565b1480156122c157508651155b156122cb57600191505b505b8015612307576122e56122df866130ad565b89612e30565b8383815181106122f157fe5b602002602001018190525060018201915061254b565b600084600281111561231557fe5b141561237e57855161234d5761232b85896130c0565b83838151811061233757fe5b6020026020010181905250600182019150612379565b8483838151811061235a57fe5b60200260200101819052506001820191506122e56122df876001612f44565b61254b565b6000612389866130ad565b905060006123978289612f71565b905080156123f85760006123ad8360008461310b565b90506123c1816123bc8d61325b565b61329c565b8686815181106123cd57fe5b60200260200101819052506001850194506123e88383612f44565b92506123f48983612f44565b9850505b60006124026132e0565b9050825160001415612427576124208161241b8a6127cc565b6130c0565b90506124bf565b60008360008151811061243657fe5b016020015160f81c905061244b846001612f44565b9350600288600281111561245b57fe5b1415612496576000612475856124708c6127cc565b612e30565b905061248e8383612489846000015161325b565b61336d565b9250506124bd565b8351156124ac576000612475856123bc8c6127cc565b6124ba82826124898c6127cc565b91505b505b88516124f4576124cf818c6130c0565b9050808686815181106124de57fe5b6020026020010181905250600185019450612547565b6124ff896001612f44565b98508086868151811061250e57fe5b6020026020010181905250600185019450612529898c612e30565b86868151811061253557fe5b60200260200101819052506001850194505b5050505b61255a8c60018d0385856133c6565b9c9b505050505050505050505050565b60008061257683612d34565b9050612580613942565b84516000906060905b80156126ae5787600182038151811061259e57fe5b602002602001015193506125b184612fd7565b925060028360028111156125c157fe5b14156125ec5760006125d2856130ad565b90506125e4866000835189510361310b565b955050612698565b60018360028111156125fa57fe5b141561263a57600061260b856130ad565b905061261d866000835189510361310b565b8351909650156126345761263185846134a8565b94505b50612698565b600083600281111561264857fe5b1415612698578151156126985760008560018751038151811061266757fe5b602001015160f81c60f81b60f81c9050612687866000600189510361310b565b955061269485828561336d565b9450505b83516126a39061325b565b915060001901612589565b50509051805160209091012095945050505050565b60608151600014156126e4575060408051600081526020810190915261097a565b6000805b8351811015612717578381815181106126fd57fe5b6020026020010151518201915080806001019150506126e8565b6000826001600160401b038111801561272f57600080fd5b506040519080825280601f01601f19166020018201604052801561275a576020820181803683370190505b50600092509050602081015b85518310156127c357600086848151811061277d57fe5b60200260200101519050600060208201905061279b83828451613554565b8785815181106127a757fe5b6020026020010151518301925050508280600101935050612766565b50949350505050565b60208101518051606091611528916000198101908110611d9257fe5b600080600080846000015111612845576040805162461bcd60e51b815260206004820152601860248201527f524c50206974656d2063616e6e6f74206265206e756c6c2e0000000000000000604482015290519081900360640190fd5b6020840151805160001a607f811161286a576000600160009450945094505050612b0a565b60b781116128df578551607f1982019081106128cd576040805162461bcd60e51b815260206004820152601960248201527f496e76616c696420524c502073686f727420737472696e672e00000000000000604482015290519081900360640190fd5b60019550935060009250612b0a915050565b60bf81116129c357855160b6198201908110612942576040805162461bcd60e51b815260206004820152601f60248201527f496e76616c696420524c50206c6f6e6720737472696e67206c656e6774682e00604482015290519081900360640190fd5b6000816020036101000a60018501510490508082018860000151116129ae576040805162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c50206c6f6e6720737472696e672e0000000000000000604482015290519081900360640190fd5b60019091019550935060009250612b0a915050565b60f78111612a3757855160bf198201908110612a26576040805162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c502073686f7274206c6973742e000000000000000000604482015290519081900360640190fd5b600195509350849250612b0a915050565b855160f6198201908110612a92576040805162461bcd60e51b815260206004820152601d60248201527f496e76616c696420524c50206c6f6e67206c697374206c656e6774682e000000604482015290519081900360640190fd5b6000816020036101000a6001850151049050808201886000015111612af7576040805162461bcd60e51b815260206004820152601660248201527524b73b30b634b210292628103637b733903634b9ba1760511b604482015290519081900360640190fd5b6001918201965094509250612b0a915050565b9193909250565b60606000826001600160401b0381118015612b2b57600080fd5b506040519080825280601f01601f191660200182016040528015612b56576020820181803683370190505b509050805160001415612b6a579050611696565b8484016020820160005b60208604811015612b95578251825260209283019290910190600101612b74565b5080519151601f959095166020036101000a600019019182169119909416179092525092915050565b6060600080612bcc846127e8565b91935090915060019050816001811115612be257fe5b14612c34576040805162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c50206c6973742076616c75652e000000000000000000604482015290519081900360640190fd5b6040805160208082526104208201909252600091816020015b612c55613928565b815260200190600190039081612c4d5790505090506000835b8651811015612d295760208210612cb65760405162461bcd60e51b815260040180806020018281038252602a8152602001806143e3602a913960400191505060405180910390fd5b600080612ce26040518060400160405280858c60000151038152602001858c60200151018152506127e8565b509150915060405180604001604052808383018152602001848b6020015101815250858581518110612d1057fe5b6020908102919091010152600193909301920101612c6e565b508152949350505050565b6060600082516002026001600160401b0381118015612d5257600080fd5b506040519080825280601f01601f191660200182016040528015612d7d576020820181803683370190505b50905060005b8351811015612e29576004848281518110612d9a57fe5b602001015160f81c60f81b6001600160f81b031916901c828260020281518110612dc057fe5b60200101906001600160f81b031916908160001a9053506010848281518110612de557fe5b016020015160f81c81612df457fe5b0660f81b828260020260010181518110612e0a57fe5b60200101906001600160f81b031916908160001a905350600101612d83565b5092915050565b612e38613942565b60408051600280825260608201909252600091816020015b6060815260200190600190039081612e505790505090506000612e74856001613598565b9050612e826103ef826136ef565b82600081518110612e8f57fe5b6020026020010181905250612ea3846114c4565b82600181518110612eb057fe5b6020026020010181905250611bcf826137bf565b6000602082511015612edb5750602081015161097a565b81806020019051602081101561097557600080fd5b60006060602083600001511015612f1157612f0a836137ee565b9050612f1d565b612f1a83611b49565b90505b61169681612ec4565b6060611528612f3f8360200151600081518110611d9257fe5b612d34565b606082518210612f635750604080516020810190915260008152611528565b61169683838486510361310b565b6000805b808451118015612f855750808351115b8015612fca5750828181518110612f9857fe5b602001015160f81c60f81b6001600160f81b031916848281518110612fb957fe5b01602001516001600160f81b031916145b1561169657600101612f75565b60208101515160009060111415612ff05750600061097a565b6002826020015151141561306c57600061300983612f26565b905060008160008151811061301a57fe5b016020015160f81c90506002811480613036575060ff81166003145b156130465760029250505061097a565b60ff81161580613059575060ff81166001145b156130695760019250505061097a565b50505b6040805162461bcd60e51b8152602060048201526011602482015270496e76616c6964206e6f6465207479706560781b604482015290519081900360640190fd5b60606115286130bb83612f26565b6137f9565b6130c8613942565b60006130d3836114c4565b90506130de81611b24565b6020850151805160001981019081106130f357fe5b602002602001018190525061154c8460200151613842565b60608182601f011015613156576040805162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b604482015290519081900360640190fd5b82828401101561319e576040805162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b604482015290519081900360640190fd5b818301845110156131ea576040805162461bcd60e51b8152602060048201526011602482015270736c6963655f6f75744f66426f756e647360781b604482015290519081900360640190fd5b60608215801561320957604051915060008252602082016040526127c3565b6040519150601f8416801560200281840101858101878315602002848b0101015b8183101561324257805183526020928301920161322a565b5050858452601f01601f19166040525050949350505050565b606060208251101561326e57508061097a565b818051906020012060405160200180828152602001915050604051602081830303815290604052905061097a565b6132a4613942565b60408051600280825260608201909252600091816020015b60608152602001906001900390816132bc5790505090506000612e74856000613598565b6132e8613942565b6040805160118082526102408201909252600091816020015b606081526020019060019003908161330157905050905060005b815181101561335d57604051806040016040528060018152602001600160ff1b81525082828151811061334a57fe5b602090810291909101015260010161331b565b50613367816137bf565b91505090565b613375613942565b6000602083511061338e57613389836114c4565b613390565b825b905061339b81611b24565b85602001518560ff16815181106133ae57fe5b6020026020010181905250611bcf8560200151613842565b606060008285016001600160401b03811180156133e257600080fd5b5060405190808252806020026020018201604052801561341c57816020015b613409613942565b8152602001906001900390816134015790505b50905060005b8581101561345d5786818151811061343657fe5b602002602001015182828151811061344a57fe5b6020908102919091010152600101613422565b5060005b8381101561349e5784818151811061347557fe5b6020026020010151828783018151811061348b57fe5b6020908102919091010152600101613461565b5095945050505050565b6134b0613942565b60408051600280825260608201909252600091816020015b60608152602001906001900390816134c857905050905060006134f46134ed866130ad565b6000613598565b90506135026103ef826136ef565b8260008151811061350f57fe5b602002602001018190525060208451101561354257838260018151811061353257fe5b602002602001018190525061354b565b612ea3846114c4565b611bcf826137bf565b8282825b60208110613577578151835260209283019290910190601f1901613558565b905182516020929092036101000a6000190180199091169116179052505050565b60606000826135a85760006135ab565b60025b9050600060028551816135ba57fe5b06905060008160020360ff166001600160401b03811180156135db57600080fd5b506040519080825280601f01601f191660200182016040528015613606576020820181803683370190505b50905081830160f81b8160008151811061361c57fe5b60200101906001600160f81b031916908160001a90535080866040516020018083805190602001908083835b602083106136675780518252601f199092019160209182019101613648565b51815160209384036101000a600019018019909216911617905285519190930192850191508083835b602083106136af5780518252601f199092019160209182019101613690565b6001836020036101000a03801982511681845116808217855250505050505090500192505050604051602081830303815290604052935050505092915050565b6060600060028351816136fe57fe5b046001600160401b038111801561371457600080fd5b506040519080825280601f01601f19166020018201604052801561373f576020820181803683370190505b50905060005b8151811015612e295783816002026001018151811061376057fe5b602001015160f81c60f81b600485836002028151811061377c57fe5b602001015160f81c60f81b6001600160f81b031916901b178282815181106137a057fe5b60200101906001600160f81b031916908160001a905350600101613745565b6137c7613942565b60006137d2836119d2565b905060405180604001604052808281526020016117aa83611bd8565b6060611528826138eb565b606060028260008151811061380a57fe5b016020015160f81c8161381957fe5b0660ff166000141561383757613830826002612f44565b905061097a565b613830826001612f44565b61384a613942565b600082516001600160401b038111801561386357600080fd5b5060405190808252806020026020018201604052801561389757816020015b60608152602001906001900390816138825790505b50905060005b83518110156138e1576138c28482815181106138b557fe5b60200260200101516137ee565b8282815181106138ce57fe5b602090810291909101015260010161389d565b50611696816137bf565b6060611528826020015160008460000151612b11565b60408051608081018252600080825260208201819052918101829052606081019190915290565b604051806040016040528060008152602001600081525090565b604051806040016040528060608152602001606081525090565b600061396f61396a84614379565b614356565b905082815283838301111561398357600080fd5b828260208301376000602084830101529392505050565b803561097a816143ca565b8051801515811461097a57600080fd5b600082601f8301126139c5578081fd5b6116968383356020850161395c565b80356002811061097a57600080fd5b6000806000606084860312156139f7578283fd5b8335613a02816143ca565b92506020840135613a12816143ca565b915060408401356001600160401b03811115613a2c578182fd5b613a38868287016139b5565b9150509250925092565b600080600060608486031215613a56578283fd5b8335613a61816143ca565b92506020840135915060408401356001600160401b03811115613a2c578182fd5b60008060408385031215613a94578182fd5b8235613a9f816143ca565b915060208301356001600160401b03811115613ab9578182fd5b613ac5858286016139b5565b9150509250929050565b600060208284031215613ae0578081fd5b611696826139a5565b600060208284031215613afa578081fd5b5051919050565b600060208284031215613b12578081fd5b81516001600160401b03811115613b27578182fd5b8201601f81018413613b37578182fd5b8051613b4561396a82614379565b818152856020838501011115613b59578384fd5b611bcf82602083016020860161439a565b600060208284031215613b7b578081fd5b81356001600160401b03811115613b90578182fd5b8201601f81018413613ba0578182fd5b61154c8482356020840161395c565b600060c08284031215613bc0578081fd5b60405160c081018181106001600160401b0382111715613bdc57fe5b8060405250825181526020830151602082015260408301516040820152606083015160608201526080830151613c11816143ca565b6080820152613c2260a084016139a5565b60a08201529392505050565b600060208284031215613c3f578081fd5b81356001600160401b0380821115613c55578283fd5b9083019060e08286031215613c68578283fd5b613c7260e0614356565b8235815260208301356020820152613c8c604084016139d4565b6040820152613c9d6060840161399a565b6060820152613cae6080840161399a565b608082015260a083013560a082015260c083013582811115613cce578485fd5b613cda878286016139b5565b60c08301525095945050505050565b6001600160a01b03169052565b60008151808452613d0e81602086016020860161439a565b601f01601f19169290920160200192915050565b60609190911b6bffffffffffffffffffffffff1916815260140190565b90815260200190565b60008351613d5a81846020880161439a565b835190830190613d6e81836020880161439a565b01949350505050565b600088825287602083015260028710613d8c57fe5b8660f81b60408301526bffffffffffffffffffffffff19808760601b166041840152808660601b166055840152508360698301528251613dd381608985016020870161439a565b9190910160890198975050505050505050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039390931683526020830191909152604082015260600190565b600060e08201905060018060a01b038085168352835160208401526020840151604084015260408401516060840152606084015160808401528060808501511660a08401525060a0830151151560c08301529392505050565b901515815260200190565b6020810160038310613ea657fe5b91905290565b60208082526025908201527f53746f7261676520736c6f742068617320616c7265616479206265656e20707260408201526437bb32b71760d91b606082015260800190565b60208082526026908201527f4163636f756e742073746174652068617320616c7265616479206265656e20706040820152653937bb32b71760d11b606082015260800190565b6020808252603e908201527f416c6c206163636f756e7473206d75737420626520636f6d6d6974746564206260408201527f65666f726520636f6d706c6574696e672061207472616e736974696f6e2e0000606082015260800190565b602080825260409082018190527f53746f7261676520736c6f742076616c7565207761736e2774206368616e6765908201527f64206f722068617320616c7265616479206265656e20636f6d6d69747465642e606082015260800190565b6020808252605b908201527f4f564d5f53746174655472616e736974696f6e65723a2050726f76696465642060408201527f4c3120636f6e747261637420636f6465206861736820646f6573206e6f74206d60608201527f61746368204c3220636f6e747261637420636f646520686173682e0000000000608082015260a00190565b6020808252603f908201527f416c6c2073746f72616765206d75737420626520636f6d6d697474656420626560408201527f666f726520636f6d6d697474696e67206163636f756e74207374617465732e00606082015260800190565b60208082526038908201527f4e6f7420656e6f7567682067617320746f2065786563757465207472616e736160408201527f6374696f6e2064657465726d696e6973746963616c6c792e0000000000000000606082015260800190565b6020808252603b908201527f4163636f756e74207374617465207761736e2774206368616e676564206f722060408201527f68617320616c7265616479206265656e20636f6d6d69747465642e0000000000606082015260800190565b6020808252603d908201527f416c6c2073746f72616765206d75737420626520636f6d6d697474656420626560408201527f666f726520636f6d706c6574696e672061207472616e736974696f6e2e000000606082015260800190565b60208082526031908201527f46756e6374696f6e206d7573742062652063616c6c656420647572696e67207460408201527034329031b7b93932b1ba10383430b9b29760791b606082015260800190565b6020808252601d908201527f496e76616c6964207472616e73616374696f6e2070726f76696465642e000000604082015260600190565b60208082526038908201527f436f6e7472616374206d757374206265207665726966696564206265666f726560408201527f2070726f76696e6720612073746f7261676520736c6f742e0000000000000000606082015260800190565b60006040825283516040830152602084015160608301526040840151600281106142f457fe5b60808381019190915260608501516001600160a01b031660a084015284015161432060c0840182613ce9565b5060a084015160e083015260c084015160e0610100840152614346610120840182613cf6565b9150506116966020830184613ce9565b6040518181016001600160401b038111828210171561437157fe5b604052919050565b60006001600160401b0382111561438c57fe5b50601f01601f191660200190565b60005b838110156143b557818101518382015260200161439d565b838111156143c4576000848401525b50505050565b6001600160a01b03811681146143df57600080fd5b5056fe50726f766964656420524c50206c6973742065786365656473206d6178206c697374206c656e6774682e52656365697665642061206e6f6465207769746820616e20756e6b6e6f776e20707265666978a2646970667358221220e1e4d3b66fdb29cc31b98f8b28be1f1ae5444146eb6157e8e4757ceec746aba764736f6c634300070600334372656174652063616e206f6e6c7920626520646f6e6520627920746865204f564d5f467261756456657269666965722ea264697066735822122055726a03c626eda10428d6a8adff2cef3ee762aaa0d2c446eee2a007c7036add64736f6c63430007060033", "devdoc": { - "details": "The State Transitioner Factory is used by the Fraud Verifier to create a new State Transitioner during the initialization of a fraud proof. Compiler used: solc Runtime target: EVM", + "details": "The State Transitioner Factory is used by the Fraud Verifier to create a new State Transitioner during the initialization of a fraud proof. Compiler used: solc Runtime target: EVM", "kind": "dev", "methods": { "create(address,uint256,bytes32,bytes32)": { @@ -116,6 +116,14 @@ "returns": { "_0": "New OVM_StateTransitioner instance." } + }, + "resolve(string)": { + "params": { + "_name": "Name to resolve an address for." + }, + "returns": { + "_0": "Address associated with the given name." + } } }, "title": "OVM_StateTransitionerFactory", @@ -126,6 +134,9 @@ "methods": { "create(address,uint256,bytes32,bytes32)": { "notice": "Creates a new OVM_StateTransitioner" + }, + "resolve(string)": { + "notice": "Resolves the address associated with a given name." } }, "version": 1 @@ -133,16 +144,16 @@ "storageLayout": { "storage": [ { - "astId": 12554, + "astId": 12856, "contract": "contracts/optimistic-ethereum/OVM/verification/OVM_StateTransitionerFactory.sol:OVM_StateTransitionerFactory", "label": "libAddressManager", "offset": 0, "slot": "0", - "type": "t_contract(Lib_AddressManager)12547" + "type": "t_contract(Lib_AddressManager)12849" } ], "types": { - "t_contract(Lib_AddressManager)12547": { + "t_contract(Lib_AddressManager)12849": { "encoding": "inplace", "label": "contract Lib_AddressManager", "numberOfBytes": "20" diff --git a/packages/contracts/deployments/mainnet/Proxy__OVM_L1CrossDomainMessenger.json b/packages/contracts/deployments/mainnet/Proxy__OVM_L1CrossDomainMessenger.json index 8d1ba5e2b4b8a..4280247bb614d 100644 --- a/packages/contracts/deployments/mainnet/Proxy__OVM_L1CrossDomainMessenger.json +++ b/packages/contracts/deployments/mainnet/Proxy__OVM_L1CrossDomainMessenger.json @@ -1,5 +1,5 @@ { - "address": "0xD1EC7d40CCd01EB7A305b94cBa8AB6D17f6a9eFE", + "address": "0x902e5fF5A99C4eC1C21bbab089fdabE32EF0A5DF", "abi": [ { "inputs": [ @@ -22,30 +22,30 @@ "type": "fallback" } ], - "transactionHash": "0x640ba4de000f47e64d38bef4caa3a16ef9332340aa01accd0aed27d5b4f04ea5", + "transactionHash": "0xe198de44f75246ee2a816da72ac4da1b4d9481176a414783acd928e3738434b7", "receipt": { "to": null, - "from": "0x77C4c8f491e5ff22a2C0E18b005c3BA0Fe36c1Bc", - "contractAddress": "0xD1EC7d40CCd01EB7A305b94cBa8AB6D17f6a9eFE", - "transactionIndex": 96, - "gasUsed": "213556", + "from": "0xd033f09cB85621F98F7A84C64dB381ac16Eff818", + "contractAddress": "0x902e5fF5A99C4eC1C21bbab089fdabE32EF0A5DF", + "transactionIndex": 294, + "gasUsed": "225024", "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0xd33ffebe1a0e1651e29fb1331efc57b4546093d98c9b6e5bf2b1b6c5efc6094d", - "transactionHash": "0x640ba4de000f47e64d38bef4caa3a16ef9332340aa01accd0aed27d5b4f04ea5", + "blockHash": "0x62326c55decffcda8c36fab59693824c82c0f9ab5b90b76ed88c5090ae926052", + "transactionHash": "0xe198de44f75246ee2a816da72ac4da1b4d9481176a414783acd928e3738434b7", "logs": [], - "blockNumber": 12207818, - "cumulativeGasUsed": "6886723", + "blockNumber": 12410833, + "cumulativeGasUsed": "11217568", "status": 1, "byzantium": true }, "args": [ - "0xd3EeD86464Ff13B4BFD81a3bB1e753b7ceBA3A39", + "0x668E5b997b9aE88a56cd40409119d4Db9e6d752E", "OVM_L1CrossDomainMessenger" ], - "solcInputHash": "43ee6bb8ef92595aa6d0e22a6c464dff", - "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_implementationName\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"stateMutability\":\"payable\",\"type\":\"fallback\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_implementationName\":\"implementationName of the contract to proxy to.\",\"_libAddressManager\":\"Address of the Lib_AddressManager.\"}}},\"title\":\"Lib_ResolvedDelegateProxy\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/libraries/resolver/Lib_ResolvedDelegateProxy.sol\":\"Lib_ResolvedDelegateProxy\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Contract Imports */\\nimport { Ownable } from \\\"./Lib_Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n /*******************************************\\n * Contract Variables: Internal Accounting *\\n *******************************************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n public\\n onlyOwner\\n {\\n emit AddressSet(_name, _address);\\n addresses[_getNameHash(_name)] = _address;\\n }\\n\\n function getAddress(\\n string memory _name\\n )\\n public\\n view\\n returns (address)\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32 _hash\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0x3a490595cc21ff170e4027843093670ff845d5972481fbfb956b722ea564bb06\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Ownable\\n * @dev Adapted from https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol\\n */\\nabstract contract Ownable {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n address public owner;\\n\\n\\n /**********\\n * Events *\\n **********/\\n\\n event OwnershipTransferred(\\n address indexed previousOwner,\\n address indexed newOwner\\n );\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n constructor() {\\n owner = msg.sender;\\n emit OwnershipTransferred(address(0), owner);\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n owner == msg.sender,\\n \\\"Ownable: caller is not the owner\\\"\\n );\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function renounceOwnership()\\n public\\n virtual\\n onlyOwner\\n {\\n emit OwnershipTransferred(owner, address(0));\\n owner = address(0);\\n }\\n\\n function transferOwnership(address _newOwner)\\n public\\n virtual\\n onlyOwner\\n {\\n require(\\n _newOwner != address(0),\\n \\\"Ownable: new owner cannot be the zero address\\\"\\n );\\n\\n emit OwnershipTransferred(owner, _newOwner);\\n owner = _newOwner;\\n }\\n}\\n\",\"keccak256\":\"0xd9dfd9264e5b5fedd53a5b10fdf179c3f367614b0fe69179bce4e45119f5b739\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_ResolvedDelegateProxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_ResolvedDelegateProxy\\n */\\ncontract Lib_ResolvedDelegateProxy {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n // Using mappings to store fields to avoid overwriting storage slots in the\\n // implementation contract. For example, instead of storing these fields at\\n // storage slot `0` & `1`, they are stored at `keccak256(key + slot)`.\\n // See: https://solidity.readthedocs.io/en/v0.7.0/internals/layout_in_storage.html\\n // NOTE: Do not use this code in your own contract system. \\n // There is a known flaw in this contract, and we will remove it from the repository\\n // in the near future. Due to the very limited way that we are using it, this flaw is\\n // not an issue in our system. \\n mapping (address => string) private implementationName;\\n mapping (address => Lib_AddressManager) private addressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n * @param _implementationName implementationName of the contract to proxy to.\\n */\\n constructor(\\n address _libAddressManager,\\n string memory _implementationName\\n )\\n {\\n addressManager[address(this)] = Lib_AddressManager(_libAddressManager);\\n implementationName[address(this)] = _implementationName;\\n }\\n\\n\\n /*********************\\n * Fallback Function *\\n *********************/\\n\\n fallback()\\n external\\n payable\\n {\\n address target = addressManager[address(this)].getAddress(\\n (implementationName[address(this)])\\n );\\n\\n require(\\n target != address(0),\\n \\\"Target address must be initialized.\\\"\\n );\\n\\n (bool success, bytes memory returndata) = target.delegatecall(msg.data);\\n\\n if (success == true) {\\n assembly {\\n return(add(returndata, 0x20), mload(returndata))\\n }\\n } else {\\n assembly {\\n revert(add(returndata, 0x20), mload(returndata))\\n }\\n }\\n }\\n}\\n\",\"keccak256\":\"0x48ec601665fb10424fc0afbf0b288e123be72eaf5faecb5c440609d176b645a7\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x608060405234801561001057600080fd5b506040516103df3803806103df8339818101604052604081101561003357600080fd5b81516020830180516040519294929383019291908464010000000082111561005a57600080fd5b90830190602082018581111561006f57600080fd5b825164010000000081118282018810171561008957600080fd5b82525081516020918201929091019080838360005b838110156100b657818101518382015260200161009e565b50505050905090810190601f1680156100e35780820380516001836020036101000a031916815260200191505b5060409081523060009081526001602090815282822080546001600160a01b0319166001600160a01b038a16179055818152919020855161012c95509093509085019150610134565b5050506101d5565b828054600181600116156101000203166002900490600052602060002090601f01602090048101928261016a57600085556101b0565b82601f1061018357805160ff19168380011785556101b0565b828001600101855582156101b0579182015b828111156101b0578251825591602001919060010190610195565b506101bc9291506101c0565b5090565b5b808211156101bc57600081556001016101c1565b6101fb806101e46000396000f3fe60806040818152306000908152600160208181528383205483825293832063bf40fac160e01b909552608490815284546002610100938216159390930260001901169190910460a481905291936001600160a01b039093169263bf40fac192909190819060c490849080156100b55780601f1061008a576101008083540402835291602001916100b5565b820191906000526020600020905b81548152906001019060200180831161009857829003601f168201915b50509250505060206040518083038186803b1580156100d357600080fd5b505afa1580156100e7573d6000803e3d6000fd5b505050506040513d60208110156100fd57600080fd5b505190506001600160a01b0381166101465760405162461bcd60e51b81526004018080602001828103825260238152602001806101cc6023913960400191505060405180910390fd5b600080826001600160a01b03166000366040518083838082843760405192019450600093509091505080830381855af49150503d80600081146101a5576040519150601f19603f3d011682016040523d82523d6000602084013e6101aa565b606091505b509092509050600182151514156101c357805160208201f35b805160208201fdfe5461726765742061646472657373206d75737420626520696e697469616c697a65642ea164736f6c6343000706000a", - "deployedBytecode": "0x60806040818152306000908152600160208181528383205483825293832063bf40fac160e01b909552608490815284546002610100938216159390930260001901169190910460a481905291936001600160a01b039093169263bf40fac192909190819060c490849080156100b55780601f1061008a576101008083540402835291602001916100b5565b820191906000526020600020905b81548152906001019060200180831161009857829003601f168201915b50509250505060206040518083038186803b1580156100d357600080fd5b505afa1580156100e7573d6000803e3d6000fd5b505050506040513d60208110156100fd57600080fd5b505190506001600160a01b0381166101465760405162461bcd60e51b81526004018080602001828103825260238152602001806101cc6023913960400191505060405180910390fd5b600080826001600160a01b03166000366040518083838082843760405192019450600093509091505080830381855af49150503d80600081146101a5576040519150601f19603f3d011682016040523d82523d6000602084013e6101aa565b606091505b509092509050600182151514156101c357805160208201f35b805160208201fdfe5461726765742061646472657373206d75737420626520696e697469616c697a65642ea164736f6c6343000706000a", + "solcInputHash": "f2bdab652d5102f5f11e78dae866798d", + "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_implementationName\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"stateMutability\":\"payable\",\"type\":\"fallback\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_implementationName\":\"implementationName of the contract to proxy to.\",\"_libAddressManager\":\"Address of the Lib_AddressManager.\"}}},\"title\":\"Lib_ResolvedDelegateProxy\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/libraries/resolver/Lib_ResolvedDelegateProxy.sol\":\"Lib_ResolvedDelegateProxy\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor () internal {\\n address msgSender = _msgSender();\\n _owner = msgSender;\\n emit OwnershipTransferred(address(0), msgSender);\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n emit OwnershipTransferred(_owner, address(0));\\n _owner = address(0);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n emit OwnershipTransferred(_owner, newOwner);\\n _owner = newOwner;\\n }\\n}\\n\",\"keccak256\":\"0x15e2d5bd4c28a88548074c54d220e8086f638a71ed07e6b3ba5a70066fcf458d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with GSN meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address payable) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes memory) {\\n this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x8d3cb350f04ff49cfb10aef08d87f19dcbaecc8027b0bed12f3275cd12f38cf0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n external\\n onlyOwner\\n {\\n addresses[_getNameHash(_name)] = _address;\\n\\n emit AddressSet(\\n _name,\\n _address\\n );\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(\\n string memory _name\\n )\\n external\\n view\\n returns (\\n address\\n )\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xcc9fc5c64f1101a5c6c397594086b1608189a9edc5c9635e1ac38f70aeeeecbf\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_ResolvedDelegateProxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_ResolvedDelegateProxy\\n */\\ncontract Lib_ResolvedDelegateProxy {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n // Using mappings to store fields to avoid overwriting storage slots in the\\n // implementation contract. For example, instead of storing these fields at\\n // storage slot `0` & `1`, they are stored at `keccak256(key + slot)`.\\n // See: https://solidity.readthedocs.io/en/v0.7.0/internals/layout_in_storage.html\\n // NOTE: Do not use this code in your own contract system.\\n // There is a known flaw in this contract, and we will remove it from the repository\\n // in the near future. Due to the very limited way that we are using it, this flaw is\\n // not an issue in our system.\\n mapping (address => string) private implementationName;\\n mapping (address => Lib_AddressManager) private addressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n * @param _implementationName implementationName of the contract to proxy to.\\n */\\n constructor(\\n address _libAddressManager,\\n string memory _implementationName\\n ) {\\n addressManager[address(this)] = Lib_AddressManager(_libAddressManager);\\n implementationName[address(this)] = _implementationName;\\n }\\n\\n\\n /*********************\\n * Fallback Function *\\n *********************/\\n\\n fallback()\\n external\\n payable\\n {\\n address target = addressManager[address(this)].getAddress(\\n (implementationName[address(this)])\\n );\\n\\n require(\\n target != address(0),\\n \\\"Target address must be initialized.\\\"\\n );\\n\\n (bool success, bytes memory returndata) = target.delegatecall(msg.data);\\n\\n if (success == true) {\\n assembly {\\n return(add(returndata, 0x20), mload(returndata))\\n }\\n } else {\\n assembly {\\n revert(add(returndata, 0x20), mload(returndata))\\n }\\n }\\n }\\n}\\n\",\"keccak256\":\"0xfaecb051b37f1d87d588cafb17a575723cbdf7c3c2079772110f33e747e05027\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x608060405234801561001057600080fd5b506040516104083803806104088339818101604052604081101561003357600080fd5b81516020830180516040519294929383019291908464010000000082111561005a57600080fd5b90830190602082018581111561006f57600080fd5b825164010000000081118282018810171561008957600080fd5b82525081516020918201929091019080838360005b838110156100b657818101518382015260200161009e565b50505050905090810190601f1680156100e35780820380516001836020036101000a031916815260200191505b5060409081523060009081526001602090815282822080546001600160a01b0319166001600160a01b038a16179055818152919020855161012c95509093509085019150610134565b5050506101d5565b828054600181600116156101000203166002900490600052602060002090601f01602090048101928261016a57600085556101b0565b82601f1061018357805160ff19168380011785556101b0565b828001600101855582156101b0579182015b828111156101b0578251825591602001919060010190610195565b506101bc9291506101c0565b5090565b5b808211156101bc57600081556001016101c1565b610224806101e46000396000f3fe60806040818152306000908152600160208181528383205483825293832063bf40fac160e01b909552608490815284546002610100938216159390930260001901169190910460a481905291936001600160a01b039093169263bf40fac192909190819060c490849080156100b55780601f1061008a576101008083540402835291602001916100b5565b820191906000526020600020905b81548152906001019060200180831161009857829003601f168201915b50509250505060206040518083038186803b1580156100d357600080fd5b505afa1580156100e7573d6000803e3d6000fd5b505050506040513d60208110156100fd57600080fd5b505190506001600160a01b0381166101465760405162461bcd60e51b81526004018080602001828103825260238152602001806101cc6023913960400191505060405180910390fd5b600080826001600160a01b03166000366040518083838082843760405192019450600093509091505080830381855af49150503d80600081146101a5576040519150601f19603f3d011682016040523d82523d6000602084013e6101aa565b606091505b509092509050600182151514156101c357805160208201f35b805160208201fdfe5461726765742061646472657373206d75737420626520696e697469616c697a65642ea2646970667358221220ceebc7fc0b8eea3f2d3758756655b8c39c79670618f167c7b41c2b40b2e41b0964736f6c63430007060033", + "deployedBytecode": "0x60806040818152306000908152600160208181528383205483825293832063bf40fac160e01b909552608490815284546002610100938216159390930260001901169190910460a481905291936001600160a01b039093169263bf40fac192909190819060c490849080156100b55780601f1061008a576101008083540402835291602001916100b5565b820191906000526020600020905b81548152906001019060200180831161009857829003601f168201915b50509250505060206040518083038186803b1580156100d357600080fd5b505afa1580156100e7573d6000803e3d6000fd5b505050506040513d60208110156100fd57600080fd5b505190506001600160a01b0381166101465760405162461bcd60e51b81526004018080602001828103825260238152602001806101cc6023913960400191505060405180910390fd5b600080826001600160a01b03166000366040518083838082843760405192019450600093509091505080830381855af49150503d80600081146101a5576040519150601f19603f3d011682016040523d82523d6000602084013e6101aa565b606091505b509092509050600182151514156101c357805160208201f35b805160208201fdfe5461726765742061646472657373206d75737420626520696e697469616c697a65642ea2646970667358221220ceebc7fc0b8eea3f2d3758756655b8c39c79670618f167c7b41c2b40b2e41b0964736f6c63430007060033", "devdoc": { "kind": "dev", "methods": { @@ -67,7 +67,7 @@ "storageLayout": { "storage": [ { - "astId": 12679, + "astId": 12893, "contract": "contracts/optimistic-ethereum/libraries/resolver/Lib_ResolvedDelegateProxy.sol:Lib_ResolvedDelegateProxy", "label": "implementationName", "offset": 0, @@ -75,12 +75,12 @@ "type": "t_mapping(t_address,t_string_storage)" }, { - "astId": 12683, + "astId": 12897, "contract": "contracts/optimistic-ethereum/libraries/resolver/Lib_ResolvedDelegateProxy.sol:Lib_ResolvedDelegateProxy", "label": "addressManager", "offset": 0, "slot": "1", - "type": "t_mapping(t_address,t_contract(Lib_AddressManager)12547)" + "type": "t_mapping(t_address,t_contract(Lib_AddressManager)12849)" } ], "types": { @@ -89,17 +89,17 @@ "label": "address", "numberOfBytes": "20" }, - "t_contract(Lib_AddressManager)12547": { + "t_contract(Lib_AddressManager)12849": { "encoding": "inplace", "label": "contract Lib_AddressManager", "numberOfBytes": "20" }, - "t_mapping(t_address,t_contract(Lib_AddressManager)12547)": { + "t_mapping(t_address,t_contract(Lib_AddressManager)12849)": { "encoding": "mapping", "key": "t_address", "label": "mapping(address => contract Lib_AddressManager)", "numberOfBytes": "32", - "value": "t_contract(Lib_AddressManager)12547" + "value": "t_contract(Lib_AddressManager)12849" }, "t_mapping(t_address,t_string_storage)": { "encoding": "mapping", diff --git a/packages/contracts/deployments/mainnet/Proxy__OVM_L1ETHGateway.json b/packages/contracts/deployments/mainnet/Proxy__OVM_L1ETHGateway.json index 39bd451e0e1a3..62e8895e754ab 100644 --- a/packages/contracts/deployments/mainnet/Proxy__OVM_L1ETHGateway.json +++ b/packages/contracts/deployments/mainnet/Proxy__OVM_L1ETHGateway.json @@ -1,5 +1,5 @@ { - "address": "0xF20C38fCdDF0C790319Fd7431d17ea0c2bC9959c", + "address": "0xe681F80966a8b1fFadECf8068bD6F99034791c95", "abi": [ { "inputs": [ @@ -22,30 +22,30 @@ "type": "fallback" } ], - "transactionHash": "0x4cecb2f632310c09a8281c8545e25e587f22de10b4522abf0bd61d50eeb8170e", + "transactionHash": "0x7734ee79863cabbe3587b8817b53cdad9a8c642c0df1a76e629d04cc0f796d27", "receipt": { "to": null, - "from": "0x77C4c8f491e5ff22a2C0E18b005c3BA0Fe36c1Bc", - "contractAddress": "0xF20C38fCdDF0C790319Fd7431d17ea0c2bC9959c", - "transactionIndex": 110, - "gasUsed": "213436", + "from": "0xd033f09cB85621F98F7A84C64dB381ac16Eff818", + "contractAddress": "0xe681F80966a8b1fFadECf8068bD6F99034791c95", + "transactionIndex": 111, + "gasUsed": "224904", "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0x1e060e1668626f1ef230f6c183e739d1b98f5c439243eda9ef970e287493dcdd", - "transactionHash": "0x4cecb2f632310c09a8281c8545e25e587f22de10b4522abf0bd61d50eeb8170e", + "blockHash": "0xd2198877ffc22d8735ee15be1c92e4e7923af6048b0cbe6308b2e38ffe8bf0d8", + "transactionHash": "0x7734ee79863cabbe3587b8817b53cdad9a8c642c0df1a76e629d04cc0f796d27", "logs": [], - "blockNumber": 12208129, - "cumulativeGasUsed": "7794906", + "blockNumber": 12410958, + "cumulativeGasUsed": "6370527", "status": 1, "byzantium": true }, "args": [ - "0xd3EeD86464Ff13B4BFD81a3bB1e753b7ceBA3A39", + "0x668E5b997b9aE88a56cd40409119d4Db9e6d752E", "OVM_L1ETHGateway" ], - "solcInputHash": "43ee6bb8ef92595aa6d0e22a6c464dff", - "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_implementationName\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"stateMutability\":\"payable\",\"type\":\"fallback\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_implementationName\":\"implementationName of the contract to proxy to.\",\"_libAddressManager\":\"Address of the Lib_AddressManager.\"}}},\"title\":\"Lib_ResolvedDelegateProxy\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/libraries/resolver/Lib_ResolvedDelegateProxy.sol\":\"Lib_ResolvedDelegateProxy\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Contract Imports */\\nimport { Ownable } from \\\"./Lib_Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n /*******************************************\\n * Contract Variables: Internal Accounting *\\n *******************************************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n public\\n onlyOwner\\n {\\n emit AddressSet(_name, _address);\\n addresses[_getNameHash(_name)] = _address;\\n }\\n\\n function getAddress(\\n string memory _name\\n )\\n public\\n view\\n returns (address)\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32 _hash\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0x3a490595cc21ff170e4027843093670ff845d5972481fbfb956b722ea564bb06\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Ownable\\n * @dev Adapted from https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol\\n */\\nabstract contract Ownable {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n address public owner;\\n\\n\\n /**********\\n * Events *\\n **********/\\n\\n event OwnershipTransferred(\\n address indexed previousOwner,\\n address indexed newOwner\\n );\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n constructor() {\\n owner = msg.sender;\\n emit OwnershipTransferred(address(0), owner);\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n owner == msg.sender,\\n \\\"Ownable: caller is not the owner\\\"\\n );\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function renounceOwnership()\\n public\\n virtual\\n onlyOwner\\n {\\n emit OwnershipTransferred(owner, address(0));\\n owner = address(0);\\n }\\n\\n function transferOwnership(address _newOwner)\\n public\\n virtual\\n onlyOwner\\n {\\n require(\\n _newOwner != address(0),\\n \\\"Ownable: new owner cannot be the zero address\\\"\\n );\\n\\n emit OwnershipTransferred(owner, _newOwner);\\n owner = _newOwner;\\n }\\n}\\n\",\"keccak256\":\"0xd9dfd9264e5b5fedd53a5b10fdf179c3f367614b0fe69179bce4e45119f5b739\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_ResolvedDelegateProxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_ResolvedDelegateProxy\\n */\\ncontract Lib_ResolvedDelegateProxy {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n // Using mappings to store fields to avoid overwriting storage slots in the\\n // implementation contract. For example, instead of storing these fields at\\n // storage slot `0` & `1`, they are stored at `keccak256(key + slot)`.\\n // See: https://solidity.readthedocs.io/en/v0.7.0/internals/layout_in_storage.html\\n // NOTE: Do not use this code in your own contract system. \\n // There is a known flaw in this contract, and we will remove it from the repository\\n // in the near future. Due to the very limited way that we are using it, this flaw is\\n // not an issue in our system. \\n mapping (address => string) private implementationName;\\n mapping (address => Lib_AddressManager) private addressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n * @param _implementationName implementationName of the contract to proxy to.\\n */\\n constructor(\\n address _libAddressManager,\\n string memory _implementationName\\n )\\n {\\n addressManager[address(this)] = Lib_AddressManager(_libAddressManager);\\n implementationName[address(this)] = _implementationName;\\n }\\n\\n\\n /*********************\\n * Fallback Function *\\n *********************/\\n\\n fallback()\\n external\\n payable\\n {\\n address target = addressManager[address(this)].getAddress(\\n (implementationName[address(this)])\\n );\\n\\n require(\\n target != address(0),\\n \\\"Target address must be initialized.\\\"\\n );\\n\\n (bool success, bytes memory returndata) = target.delegatecall(msg.data);\\n\\n if (success == true) {\\n assembly {\\n return(add(returndata, 0x20), mload(returndata))\\n }\\n } else {\\n assembly {\\n revert(add(returndata, 0x20), mload(returndata))\\n }\\n }\\n }\\n}\\n\",\"keccak256\":\"0x48ec601665fb10424fc0afbf0b288e123be72eaf5faecb5c440609d176b645a7\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x608060405234801561001057600080fd5b506040516103df3803806103df8339818101604052604081101561003357600080fd5b81516020830180516040519294929383019291908464010000000082111561005a57600080fd5b90830190602082018581111561006f57600080fd5b825164010000000081118282018810171561008957600080fd5b82525081516020918201929091019080838360005b838110156100b657818101518382015260200161009e565b50505050905090810190601f1680156100e35780820380516001836020036101000a031916815260200191505b5060409081523060009081526001602090815282822080546001600160a01b0319166001600160a01b038a16179055818152919020855161012c95509093509085019150610134565b5050506101d5565b828054600181600116156101000203166002900490600052602060002090601f01602090048101928261016a57600085556101b0565b82601f1061018357805160ff19168380011785556101b0565b828001600101855582156101b0579182015b828111156101b0578251825591602001919060010190610195565b506101bc9291506101c0565b5090565b5b808211156101bc57600081556001016101c1565b6101fb806101e46000396000f3fe60806040818152306000908152600160208181528383205483825293832063bf40fac160e01b909552608490815284546002610100938216159390930260001901169190910460a481905291936001600160a01b039093169263bf40fac192909190819060c490849080156100b55780601f1061008a576101008083540402835291602001916100b5565b820191906000526020600020905b81548152906001019060200180831161009857829003601f168201915b50509250505060206040518083038186803b1580156100d357600080fd5b505afa1580156100e7573d6000803e3d6000fd5b505050506040513d60208110156100fd57600080fd5b505190506001600160a01b0381166101465760405162461bcd60e51b81526004018080602001828103825260238152602001806101cc6023913960400191505060405180910390fd5b600080826001600160a01b03166000366040518083838082843760405192019450600093509091505080830381855af49150503d80600081146101a5576040519150601f19603f3d011682016040523d82523d6000602084013e6101aa565b606091505b509092509050600182151514156101c357805160208201f35b805160208201fdfe5461726765742061646472657373206d75737420626520696e697469616c697a65642ea164736f6c6343000706000a", - "deployedBytecode": "0x60806040818152306000908152600160208181528383205483825293832063bf40fac160e01b909552608490815284546002610100938216159390930260001901169190910460a481905291936001600160a01b039093169263bf40fac192909190819060c490849080156100b55780601f1061008a576101008083540402835291602001916100b5565b820191906000526020600020905b81548152906001019060200180831161009857829003601f168201915b50509250505060206040518083038186803b1580156100d357600080fd5b505afa1580156100e7573d6000803e3d6000fd5b505050506040513d60208110156100fd57600080fd5b505190506001600160a01b0381166101465760405162461bcd60e51b81526004018080602001828103825260238152602001806101cc6023913960400191505060405180910390fd5b600080826001600160a01b03166000366040518083838082843760405192019450600093509091505080830381855af49150503d80600081146101a5576040519150601f19603f3d011682016040523d82523d6000602084013e6101aa565b606091505b509092509050600182151514156101c357805160208201f35b805160208201fdfe5461726765742061646472657373206d75737420626520696e697469616c697a65642ea164736f6c6343000706000a", + "solcInputHash": "f2bdab652d5102f5f11e78dae866798d", + "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_implementationName\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"stateMutability\":\"payable\",\"type\":\"fallback\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_implementationName\":\"implementationName of the contract to proxy to.\",\"_libAddressManager\":\"Address of the Lib_AddressManager.\"}}},\"title\":\"Lib_ResolvedDelegateProxy\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/libraries/resolver/Lib_ResolvedDelegateProxy.sol\":\"Lib_ResolvedDelegateProxy\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor () internal {\\n address msgSender = _msgSender();\\n _owner = msgSender;\\n emit OwnershipTransferred(address(0), msgSender);\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n emit OwnershipTransferred(_owner, address(0));\\n _owner = address(0);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n emit OwnershipTransferred(_owner, newOwner);\\n _owner = newOwner;\\n }\\n}\\n\",\"keccak256\":\"0x15e2d5bd4c28a88548074c54d220e8086f638a71ed07e6b3ba5a70066fcf458d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with GSN meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address payable) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes memory) {\\n this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x8d3cb350f04ff49cfb10aef08d87f19dcbaecc8027b0bed12f3275cd12f38cf0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n external\\n onlyOwner\\n {\\n addresses[_getNameHash(_name)] = _address;\\n\\n emit AddressSet(\\n _name,\\n _address\\n );\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(\\n string memory _name\\n )\\n external\\n view\\n returns (\\n address\\n )\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xcc9fc5c64f1101a5c6c397594086b1608189a9edc5c9635e1ac38f70aeeeecbf\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_ResolvedDelegateProxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_ResolvedDelegateProxy\\n */\\ncontract Lib_ResolvedDelegateProxy {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n // Using mappings to store fields to avoid overwriting storage slots in the\\n // implementation contract. For example, instead of storing these fields at\\n // storage slot `0` & `1`, they are stored at `keccak256(key + slot)`.\\n // See: https://solidity.readthedocs.io/en/v0.7.0/internals/layout_in_storage.html\\n // NOTE: Do not use this code in your own contract system.\\n // There is a known flaw in this contract, and we will remove it from the repository\\n // in the near future. Due to the very limited way that we are using it, this flaw is\\n // not an issue in our system.\\n mapping (address => string) private implementationName;\\n mapping (address => Lib_AddressManager) private addressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n * @param _implementationName implementationName of the contract to proxy to.\\n */\\n constructor(\\n address _libAddressManager,\\n string memory _implementationName\\n ) {\\n addressManager[address(this)] = Lib_AddressManager(_libAddressManager);\\n implementationName[address(this)] = _implementationName;\\n }\\n\\n\\n /*********************\\n * Fallback Function *\\n *********************/\\n\\n fallback()\\n external\\n payable\\n {\\n address target = addressManager[address(this)].getAddress(\\n (implementationName[address(this)])\\n );\\n\\n require(\\n target != address(0),\\n \\\"Target address must be initialized.\\\"\\n );\\n\\n (bool success, bytes memory returndata) = target.delegatecall(msg.data);\\n\\n if (success == true) {\\n assembly {\\n return(add(returndata, 0x20), mload(returndata))\\n }\\n } else {\\n assembly {\\n revert(add(returndata, 0x20), mload(returndata))\\n }\\n }\\n }\\n}\\n\",\"keccak256\":\"0xfaecb051b37f1d87d588cafb17a575723cbdf7c3c2079772110f33e747e05027\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x608060405234801561001057600080fd5b506040516104083803806104088339818101604052604081101561003357600080fd5b81516020830180516040519294929383019291908464010000000082111561005a57600080fd5b90830190602082018581111561006f57600080fd5b825164010000000081118282018810171561008957600080fd5b82525081516020918201929091019080838360005b838110156100b657818101518382015260200161009e565b50505050905090810190601f1680156100e35780820380516001836020036101000a031916815260200191505b5060409081523060009081526001602090815282822080546001600160a01b0319166001600160a01b038a16179055818152919020855161012c95509093509085019150610134565b5050506101d5565b828054600181600116156101000203166002900490600052602060002090601f01602090048101928261016a57600085556101b0565b82601f1061018357805160ff19168380011785556101b0565b828001600101855582156101b0579182015b828111156101b0578251825591602001919060010190610195565b506101bc9291506101c0565b5090565b5b808211156101bc57600081556001016101c1565b610224806101e46000396000f3fe60806040818152306000908152600160208181528383205483825293832063bf40fac160e01b909552608490815284546002610100938216159390930260001901169190910460a481905291936001600160a01b039093169263bf40fac192909190819060c490849080156100b55780601f1061008a576101008083540402835291602001916100b5565b820191906000526020600020905b81548152906001019060200180831161009857829003601f168201915b50509250505060206040518083038186803b1580156100d357600080fd5b505afa1580156100e7573d6000803e3d6000fd5b505050506040513d60208110156100fd57600080fd5b505190506001600160a01b0381166101465760405162461bcd60e51b81526004018080602001828103825260238152602001806101cc6023913960400191505060405180910390fd5b600080826001600160a01b03166000366040518083838082843760405192019450600093509091505080830381855af49150503d80600081146101a5576040519150601f19603f3d011682016040523d82523d6000602084013e6101aa565b606091505b509092509050600182151514156101c357805160208201f35b805160208201fdfe5461726765742061646472657373206d75737420626520696e697469616c697a65642ea2646970667358221220ceebc7fc0b8eea3f2d3758756655b8c39c79670618f167c7b41c2b40b2e41b0964736f6c63430007060033", + "deployedBytecode": "0x60806040818152306000908152600160208181528383205483825293832063bf40fac160e01b909552608490815284546002610100938216159390930260001901169190910460a481905291936001600160a01b039093169263bf40fac192909190819060c490849080156100b55780601f1061008a576101008083540402835291602001916100b5565b820191906000526020600020905b81548152906001019060200180831161009857829003601f168201915b50509250505060206040518083038186803b1580156100d357600080fd5b505afa1580156100e7573d6000803e3d6000fd5b505050506040513d60208110156100fd57600080fd5b505190506001600160a01b0381166101465760405162461bcd60e51b81526004018080602001828103825260238152602001806101cc6023913960400191505060405180910390fd5b600080826001600160a01b03166000366040518083838082843760405192019450600093509091505080830381855af49150503d80600081146101a5576040519150601f19603f3d011682016040523d82523d6000602084013e6101aa565b606091505b509092509050600182151514156101c357805160208201f35b805160208201fdfe5461726765742061646472657373206d75737420626520696e697469616c697a65642ea2646970667358221220ceebc7fc0b8eea3f2d3758756655b8c39c79670618f167c7b41c2b40b2e41b0964736f6c63430007060033", "devdoc": { "kind": "dev", "methods": { @@ -67,7 +67,7 @@ "storageLayout": { "storage": [ { - "astId": 12679, + "astId": 12893, "contract": "contracts/optimistic-ethereum/libraries/resolver/Lib_ResolvedDelegateProxy.sol:Lib_ResolvedDelegateProxy", "label": "implementationName", "offset": 0, @@ -75,12 +75,12 @@ "type": "t_mapping(t_address,t_string_storage)" }, { - "astId": 12683, + "astId": 12897, "contract": "contracts/optimistic-ethereum/libraries/resolver/Lib_ResolvedDelegateProxy.sol:Lib_ResolvedDelegateProxy", "label": "addressManager", "offset": 0, "slot": "1", - "type": "t_mapping(t_address,t_contract(Lib_AddressManager)12547)" + "type": "t_mapping(t_address,t_contract(Lib_AddressManager)12849)" } ], "types": { @@ -89,17 +89,17 @@ "label": "address", "numberOfBytes": "20" }, - "t_contract(Lib_AddressManager)12547": { + "t_contract(Lib_AddressManager)12849": { "encoding": "inplace", "label": "contract Lib_AddressManager", "numberOfBytes": "20" }, - "t_mapping(t_address,t_contract(Lib_AddressManager)12547)": { + "t_mapping(t_address,t_contract(Lib_AddressManager)12849)": { "encoding": "mapping", "key": "t_address", "label": "mapping(address => contract Lib_AddressManager)", "numberOfBytes": "32", - "value": "t_contract(Lib_AddressManager)12547" + "value": "t_contract(Lib_AddressManager)12849" }, "t_mapping(t_address,t_string_storage)": { "encoding": "mapping", diff --git a/packages/contracts/deployments/mainnet/mockOVM_BondManager.json b/packages/contracts/deployments/mainnet/mockOVM_BondManager.json index d83c957b0db05..a7e9ca474de3c 100644 --- a/packages/contracts/deployments/mainnet/mockOVM_BondManager.json +++ b/packages/contracts/deployments/mainnet/mockOVM_BondManager.json @@ -1,5 +1,5 @@ { - "address": "0x99EDa8472E93Aa28E5470eEDEc6e32081E14DaFC", + "address": "0x90c5F8d045bBcCc99d907f30E8707F06D95d065b", "abi": [ { "inputs": [ @@ -158,7 +158,7 @@ "outputs": [ { "internalType": "address", - "name": "_contract", + "name": "", "type": "address" } ], @@ -173,53 +173,66 @@ "type": "function" } ], - "transactionHash": "0x86a064087eb71581e0d3e1d758da8b6fa13af268ae2e7fffdc3ed74a871c6fc7", + "transactionHash": "0xadf883750d1fe05cb4526571830ad256c35c64c86a378e248f54c284d3fa266c", "receipt": { "to": null, - "from": "0x77C4c8f491e5ff22a2C0E18b005c3BA0Fe36c1Bc", - "contractAddress": "0x99EDa8472E93Aa28E5470eEDEc6e32081E14DaFC", - "transactionIndex": 60, - "gasUsed": "288329", + "from": "0xd033f09cB85621F98F7A84C64dB381ac16Eff818", + "contractAddress": "0x90c5F8d045bBcCc99d907f30E8707F06D95d065b", + "transactionIndex": 241, + "gasUsed": "298498", "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0xd93126d10c2b3dee217a0c998f20119fe1e6dada9e96980460fc0079385c64e5", - "transactionHash": "0x86a064087eb71581e0d3e1d758da8b6fa13af268ae2e7fffdc3ed74a871c6fc7", + "blockHash": "0x324cda21e491b7c979caf4a0b957c1e93e98779989ed66455d8521e06103478d", + "transactionHash": "0xadf883750d1fe05cb4526571830ad256c35c64c86a378e248f54c284d3fa266c", "logs": [], - "blockNumber": 12207803, - "cumulativeGasUsed": "10831678", + "blockNumber": 12410819, + "cumulativeGasUsed": "10713382", "status": 1, "byzantium": true }, "args": [ - "0xd3EeD86464Ff13B4BFD81a3bB1e753b7ceBA3A39" + "0x668E5b997b9aE88a56cd40409119d4Db9e6d752E" ], - "solcInputHash": "43ee6bb8ef92595aa6d0e22a6c464dff", - "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_who\",\"type\":\"address\"}],\"name\":\"claim\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"deposit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_preStateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"_publisher\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_timestamp\",\"type\":\"uint256\"}],\"name\":\"finalize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"finalizeWithdrawal\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"getGasSpent\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_who\",\"type\":\"address\"}],\"name\":\"isCollateralized\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_preStateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"_txHash\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"_who\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_gasSpent\",\"type\":\"uint256\"}],\"name\":\"recordGasSpent\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"_contract\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"startWithdrawal\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"title\":\"mockOVM_BondManager\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/mockOVM/verification/mockOVM_BondManager.sol\":\"mockOVM_BondManager\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/optimistic-ethereum/iOVM/verification/iOVM_BondManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\ninterface ERC20 {\\n function transfer(address, uint256) external returns (bool);\\n function transferFrom(address, address, uint256) external returns (bool);\\n}\\n\\n/// All the errors which may be encountered on the bond manager\\nlibrary Errors {\\n string constant ERC20_ERR = \\\"BondManager: Could not post bond\\\";\\n string constant ALREADY_FINALIZED = \\\"BondManager: Fraud proof for this pre-state root has already been finalized\\\";\\n string constant SLASHED = \\\"BondManager: Cannot finalize withdrawal, you probably got slashed\\\";\\n string constant WRONG_STATE = \\\"BondManager: Wrong bond state for proposer\\\";\\n string constant CANNOT_CLAIM = \\\"BondManager: Cannot claim yet. Dispute must be finalized first\\\";\\n\\n string constant WITHDRAWAL_PENDING = \\\"BondManager: Withdrawal already pending\\\";\\n string constant TOO_EARLY = \\\"BondManager: Too early to finalize your withdrawal\\\";\\n\\n string constant ONLY_TRANSITIONER = \\\"BondManager: Only the transitioner for this pre-state root may call this function\\\";\\n string constant ONLY_FRAUD_VERIFIER = \\\"BondManager: Only the fraud verifier may call this function\\\";\\n string constant ONLY_STATE_COMMITMENT_CHAIN = \\\"BondManager: Only the state commitment chain may call this function\\\";\\n string constant WAIT_FOR_DISPUTES = \\\"BondManager: Wait for other potential disputes\\\";\\n}\\n\\n/**\\n * @title iOVM_BondManager\\n */\\ninterface iOVM_BondManager {\\n\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n /// The lifecycle of a proposer's bond\\n enum State {\\n // Before depositing or after getting slashed, a user is uncollateralized\\n NOT_COLLATERALIZED,\\n // After depositing, a user is collateralized\\n COLLATERALIZED,\\n // After a user has initiated a withdrawal\\n WITHDRAWING\\n }\\n\\n /// A bond posted by a proposer\\n struct Bond {\\n // The user's state\\n State state;\\n // The timestamp at which a proposer issued their withdrawal request\\n uint32 withdrawalTimestamp;\\n // The time when the first disputed was initiated for this bond\\n uint256 firstDisputeAt;\\n // The earliest observed state root for this bond which has had fraud\\n bytes32 earliestDisputedStateRoot;\\n // The state root's timestamp\\n uint256 earliestTimestamp;\\n }\\n\\n // Per pre-state root, store the number of state provisions that were made\\n // and how many of these calls were made by each user. Payouts will then be\\n // claimed by users proportionally for that dispute.\\n struct Rewards {\\n // Flag to check if rewards for a fraud proof are claimable\\n bool canClaim;\\n // Total number of `recordGasSpent` calls made\\n uint256 total;\\n // The gas spent by each user to provide witness data. The sum of all\\n // values inside this map MUST be equal to the value of `total`\\n mapping(address => uint256) gasSpent;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function recordGasSpent(\\n bytes32 _preStateRoot,\\n bytes32 _txHash,\\n address _who,\\n uint256 _gasSpent\\n ) external;\\n\\n function finalize(\\n bytes32 _preStateRoot,\\n address _publisher,\\n uint256 _timestamp\\n ) external;\\n\\n function deposit() external;\\n\\n function startWithdrawal() external;\\n\\n function finalizeWithdrawal() external;\\n\\n function claim(\\n address _who\\n ) external;\\n\\n function isCollateralized(\\n address _who\\n ) external view returns (bool);\\n\\n function getGasSpent(\\n bytes32 _preStateRoot,\\n address _who\\n ) external view returns (uint256);\\n}\\n\",\"keccak256\":\"0x3c2a8a399487857158649db1896749d86e39cba545a8aeb2e2bb0f3bdfa7a5b1\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Contract Imports */\\nimport { Ownable } from \\\"./Lib_Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n /*******************************************\\n * Contract Variables: Internal Accounting *\\n *******************************************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n public\\n onlyOwner\\n {\\n emit AddressSet(_name, _address);\\n addresses[_getNameHash(_name)] = _address;\\n }\\n\\n function getAddress(\\n string memory _name\\n )\\n public\\n view\\n returns (address)\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32 _hash\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0x3a490595cc21ff170e4027843093670ff845d5972481fbfb956b722ea564bb06\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n\\n /*******************************************\\n * Contract Variables: Contract References *\\n *******************************************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(\\n address _libAddressManager\\n ) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function resolve(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address _contract\\n )\\n {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0xaa3ed342f6deb156c660fd83afa579a3b80db17eb465e8949cf5c1b114780143\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Ownable\\n * @dev Adapted from https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol\\n */\\nabstract contract Ownable {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n address public owner;\\n\\n\\n /**********\\n * Events *\\n **********/\\n\\n event OwnershipTransferred(\\n address indexed previousOwner,\\n address indexed newOwner\\n );\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n constructor() {\\n owner = msg.sender;\\n emit OwnershipTransferred(address(0), owner);\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n owner == msg.sender,\\n \\\"Ownable: caller is not the owner\\\"\\n );\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function renounceOwnership()\\n public\\n virtual\\n onlyOwner\\n {\\n emit OwnershipTransferred(owner, address(0));\\n owner = address(0);\\n }\\n\\n function transferOwnership(address _newOwner)\\n public\\n virtual\\n onlyOwner\\n {\\n require(\\n _newOwner != address(0),\\n \\\"Ownable: new owner cannot be the zero address\\\"\\n );\\n\\n emit OwnershipTransferred(owner, _newOwner);\\n owner = _newOwner;\\n }\\n}\\n\",\"keccak256\":\"0xd9dfd9264e5b5fedd53a5b10fdf179c3f367614b0fe69179bce4e45119f5b739\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/mockOVM/verification/mockOVM_BondManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Interface Imports */\\nimport { iOVM_BondManager } from \\\"../../iOVM/verification/iOVM_BondManager.sol\\\";\\n\\n/* Contract Imports */\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/**\\n * @title mockOVM_BondManager\\n */\\ncontract mockOVM_BondManager is iOVM_BondManager, Lib_AddressResolver {\\n constructor(\\n address _libAddressManager\\n )\\n Lib_AddressResolver(_libAddressManager)\\n {}\\n\\n function recordGasSpent(\\n bytes32 _preStateRoot,\\n bytes32 _txHash,\\n address _who,\\n uint256 _gasSpent\\n )\\n override\\n public\\n {}\\n\\n function finalize(\\n bytes32 _preStateRoot,\\n address _publisher,\\n uint256 _timestamp\\n )\\n override\\n public\\n {}\\n\\n function deposit()\\n override\\n public\\n {}\\n\\n function startWithdrawal()\\n override\\n public\\n {}\\n\\n function finalizeWithdrawal()\\n override\\n public\\n {}\\n\\n function claim(\\n address _who\\n )\\n override\\n public\\n {}\\n\\n function isCollateralized(\\n address _who\\n )\\n override\\n public\\n view\\n returns (\\n bool\\n )\\n {\\n // Only authenticate sequencer to submit state root batches.\\n return _who == resolve(\\\"OVM_Proposer\\\");\\n }\\n\\n function getGasSpent(\\n bytes32, // _preStateRoot,\\n address // _who\\n )\\n override\\n public\\n pure \\n returns (\\n uint256\\n )\\n {\\n return 0;\\n }\\n}\\n\",\"keccak256\":\"0x7742f2892255ca236320217d067f846bbd8f17d1561fae97f492de390598c667\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x608060405234801561001057600080fd5b5060405161043e38038061043e8339818101604052602081101561003357600080fd5b5051600080546001600160a01b039092166001600160a01b03199092169190911790556103d9806100656000396000f3fe608060405234801561001057600080fd5b506004361061009e5760003560e01c8063abfbbe1311610066578063abfbbe1314610207578063bc2f8dd814610239578063c5b6aa2f14610239578063d0e30db014610239578063dc6453dc146102415761009e565b806302ad4d2a146100a35780631e16e92f146100dd5780631e83409a14610117578063299ca4781461013d578063461a447814610161575b600080fd5b6100c9600480360360208110156100b957600080fd5b50356001600160a01b031661027f565b604080519115158252519081900360200190f35b610115600480360360808110156100f357600080fd5b508035906020810135906001600160a01b0360408201351690606001356102c9565b005b6101156004803603602081101561012d57600080fd5b50356001600160a01b03166102cf565b6101456102d2565b604080516001600160a01b039092168252519081900360200190f35b6101456004803603602081101561017757600080fd5b81019060208101813564010000000081111561019257600080fd5b8201836020820111156101a457600080fd5b803590602001918460018302840111640100000000831117156101c657600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506102e1945050505050565b6101156004803603606081101561021d57600080fd5b508035906001600160a01b0360208201351690604001356103bd565b6101156103c2565b61026d6004803603604081101561025757600080fd5b50803590602001356001600160a01b03166103c4565b60408051918252519081900360200190f35b60006102ae6040518060400160405280600c81526020016b27ab26afa83937b837b9b2b960a11b8152506102e1565b6001600160a01b0316826001600160a01b0316149050919050565b50505050565b50565b6000546001600160a01b031681565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b83811015610341578181015183820152602001610329565b50505050905090810190601f16801561036e5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561038b57600080fd5b505afa15801561039f573d6000803e3d6000fd5b505050506040513d60208110156103b557600080fd5b505192915050565b505050565b565b60009291505056fea164736f6c6343000706000a", - "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061009e5760003560e01c8063abfbbe1311610066578063abfbbe1314610207578063bc2f8dd814610239578063c5b6aa2f14610239578063d0e30db014610239578063dc6453dc146102415761009e565b806302ad4d2a146100a35780631e16e92f146100dd5780631e83409a14610117578063299ca4781461013d578063461a447814610161575b600080fd5b6100c9600480360360208110156100b957600080fd5b50356001600160a01b031661027f565b604080519115158252519081900360200190f35b610115600480360360808110156100f357600080fd5b508035906020810135906001600160a01b0360408201351690606001356102c9565b005b6101156004803603602081101561012d57600080fd5b50356001600160a01b03166102cf565b6101456102d2565b604080516001600160a01b039092168252519081900360200190f35b6101456004803603602081101561017757600080fd5b81019060208101813564010000000081111561019257600080fd5b8201836020820111156101a457600080fd5b803590602001918460018302840111640100000000831117156101c657600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506102e1945050505050565b6101156004803603606081101561021d57600080fd5b508035906001600160a01b0360208201351690604001356103bd565b6101156103c2565b61026d6004803603604081101561025757600080fd5b50803590602001356001600160a01b03166103c4565b60408051918252519081900360200190f35b60006102ae6040518060400160405280600c81526020016b27ab26afa83937b837b9b2b960a11b8152506102e1565b6001600160a01b0316826001600160a01b0316149050919050565b50505050565b50565b6000546001600160a01b031681565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b83811015610341578181015183820152602001610329565b50505050905090810190601f16801561036e5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561038b57600080fd5b505afa15801561039f573d6000803e3d6000fd5b505050506040513d60208110156103b557600080fd5b505192915050565b505050565b565b60009291505056fea164736f6c6343000706000a", + "solcInputHash": "f2bdab652d5102f5f11e78dae866798d", + "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_who\",\"type\":\"address\"}],\"name\":\"claim\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"deposit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_preStateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"_publisher\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_timestamp\",\"type\":\"uint256\"}],\"name\":\"finalize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"finalizeWithdrawal\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"getGasSpent\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_who\",\"type\":\"address\"}],\"name\":\"isCollateralized\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_preStateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"_txHash\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"_who\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_gasSpent\",\"type\":\"uint256\"}],\"name\":\"recordGasSpent\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"startWithdrawal\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}}},\"title\":\"mockOVM_BondManager\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/mockOVM/verification/mockOVM_BondManager.sol\":\"mockOVM_BondManager\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor () internal {\\n address msgSender = _msgSender();\\n _owner = msgSender;\\n emit OwnershipTransferred(address(0), msgSender);\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n emit OwnershipTransferred(_owner, address(0));\\n _owner = address(0);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n emit OwnershipTransferred(_owner, newOwner);\\n _owner = newOwner;\\n }\\n}\\n\",\"keccak256\":\"0x15e2d5bd4c28a88548074c54d220e8086f638a71ed07e6b3ba5a70066fcf458d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with GSN meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address payable) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes memory) {\\n this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x8d3cb350f04ff49cfb10aef08d87f19dcbaecc8027b0bed12f3275cd12f38cf0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/verification/iOVM_BondManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\ninterface ERC20 {\\n function transfer(address, uint256) external returns (bool);\\n function transferFrom(address, address, uint256) external returns (bool);\\n}\\n\\n/// All the errors which may be encountered on the bond manager\\nlibrary Errors {\\n string constant ERC20_ERR = \\\"BondManager: Could not post bond\\\";\\n string constant ALREADY_FINALIZED = \\\"BondManager: Fraud proof for this pre-state root has already been finalized\\\";\\n string constant SLASHED = \\\"BondManager: Cannot finalize withdrawal, you probably got slashed\\\";\\n string constant WRONG_STATE = \\\"BondManager: Wrong bond state for proposer\\\";\\n string constant CANNOT_CLAIM = \\\"BondManager: Cannot claim yet. Dispute must be finalized first\\\";\\n\\n string constant WITHDRAWAL_PENDING = \\\"BondManager: Withdrawal already pending\\\";\\n string constant TOO_EARLY = \\\"BondManager: Too early to finalize your withdrawal\\\";\\n\\n string constant ONLY_TRANSITIONER = \\\"BondManager: Only the transitioner for this pre-state root may call this function\\\";\\n string constant ONLY_FRAUD_VERIFIER = \\\"BondManager: Only the fraud verifier may call this function\\\";\\n string constant ONLY_STATE_COMMITMENT_CHAIN = \\\"BondManager: Only the state commitment chain may call this function\\\";\\n string constant WAIT_FOR_DISPUTES = \\\"BondManager: Wait for other potential disputes\\\";\\n}\\n\\n/**\\n * @title iOVM_BondManager\\n */\\ninterface iOVM_BondManager {\\n\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n /// The lifecycle of a proposer's bond\\n enum State {\\n // Before depositing or after getting slashed, a user is uncollateralized\\n NOT_COLLATERALIZED,\\n // After depositing, a user is collateralized\\n COLLATERALIZED,\\n // After a user has initiated a withdrawal\\n WITHDRAWING\\n }\\n\\n /// A bond posted by a proposer\\n struct Bond {\\n // The user's state\\n State state;\\n // The timestamp at which a proposer issued their withdrawal request\\n uint32 withdrawalTimestamp;\\n // The time when the first disputed was initiated for this bond\\n uint256 firstDisputeAt;\\n // The earliest observed state root for this bond which has had fraud\\n bytes32 earliestDisputedStateRoot;\\n // The state root's timestamp\\n uint256 earliestTimestamp;\\n }\\n\\n // Per pre-state root, store the number of state provisions that were made\\n // and how many of these calls were made by each user. Payouts will then be\\n // claimed by users proportionally for that dispute.\\n struct Rewards {\\n // Flag to check if rewards for a fraud proof are claimable\\n bool canClaim;\\n // Total number of `recordGasSpent` calls made\\n uint256 total;\\n // The gas spent by each user to provide witness data. The sum of all\\n // values inside this map MUST be equal to the value of `total`\\n mapping(address => uint256) gasSpent;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function recordGasSpent(\\n bytes32 _preStateRoot,\\n bytes32 _txHash,\\n address _who,\\n uint256 _gasSpent\\n ) external;\\n\\n function finalize(\\n bytes32 _preStateRoot,\\n address _publisher,\\n uint256 _timestamp\\n ) external;\\n\\n function deposit() external;\\n\\n function startWithdrawal() external;\\n\\n function finalizeWithdrawal() external;\\n\\n function claim(\\n address _who\\n ) external;\\n\\n function isCollateralized(\\n address _who\\n ) external view returns (bool);\\n\\n function getGasSpent(\\n bytes32 _preStateRoot,\\n address _who\\n ) external view returns (uint256);\\n}\\n\",\"keccak256\":\"0x3c2a8a399487857158649db1896749d86e39cba545a8aeb2e2bb0f3bdfa7a5b1\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n external\\n onlyOwner\\n {\\n addresses[_getNameHash(_name)] = _address;\\n\\n emit AddressSet(\\n _name,\\n _address\\n );\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(\\n string memory _name\\n )\\n external\\n view\\n returns (\\n address\\n )\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xcc9fc5c64f1101a5c6c397594086b1608189a9edc5c9635e1ac38f70aeeeecbf\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(\\n address _libAddressManager\\n ) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x65981feeabff6a81783ea97d44baf988a18a86c8cb374c46fdb71819cbacc7c0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/mockOVM/verification/mockOVM_BondManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Interface Imports */\\nimport { iOVM_BondManager } from \\\"../../iOVM/verification/iOVM_BondManager.sol\\\";\\n\\n/* Contract Imports */\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/**\\n * @title mockOVM_BondManager\\n */\\ncontract mockOVM_BondManager is iOVM_BondManager, Lib_AddressResolver {\\n constructor(\\n address _libAddressManager\\n )\\n Lib_AddressResolver(_libAddressManager)\\n {}\\n\\n function recordGasSpent(\\n bytes32 _preStateRoot,\\n bytes32 _txHash,\\n address _who,\\n uint256 _gasSpent\\n )\\n override\\n public\\n {}\\n\\n function finalize(\\n bytes32 _preStateRoot,\\n address _publisher,\\n uint256 _timestamp\\n )\\n override\\n public\\n {}\\n\\n function deposit()\\n override\\n public\\n {}\\n\\n function startWithdrawal()\\n override\\n public\\n {}\\n\\n function finalizeWithdrawal()\\n override\\n public\\n {}\\n\\n function claim(\\n address _who\\n )\\n override\\n public\\n {}\\n\\n function isCollateralized(\\n address _who\\n )\\n override\\n public\\n view\\n returns (\\n bool\\n )\\n {\\n // Only authenticate sequencer to submit state root batches.\\n return _who == resolve(\\\"OVM_Proposer\\\");\\n }\\n\\n function getGasSpent(\\n bytes32, // _preStateRoot,\\n address // _who\\n )\\n override\\n public\\n pure\\n returns (\\n uint256\\n )\\n {\\n return 0;\\n }\\n}\\n\",\"keccak256\":\"0xe649b49573ba5babca407f116e97dc13f24bf677cbcd03824a2eb98a7750c4e8\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x608060405234801561001057600080fd5b506040516104673803806104678339818101604052602081101561003357600080fd5b5051600080546001600160a01b039092166001600160a01b0319909216919091179055610402806100656000396000f3fe608060405234801561001057600080fd5b506004361061009e5760003560e01c8063abfbbe1311610066578063abfbbe1314610207578063bc2f8dd814610239578063c5b6aa2f14610239578063d0e30db014610239578063dc6453dc146102415761009e565b806302ad4d2a146100a35780631e16e92f146100dd5780631e83409a14610117578063299ca4781461013d578063461a447814610161575b600080fd5b6100c9600480360360208110156100b957600080fd5b50356001600160a01b031661027f565b604080519115158252519081900360200190f35b610115600480360360808110156100f357600080fd5b508035906020810135906001600160a01b0360408201351690606001356102c9565b005b6101156004803603602081101561012d57600080fd5b50356001600160a01b03166102cf565b6101456102d2565b604080516001600160a01b039092168252519081900360200190f35b6101456004803603602081101561017757600080fd5b81019060208101813564010000000081111561019257600080fd5b8201836020820111156101a457600080fd5b803590602001918460018302840111640100000000831117156101c657600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506102e1945050505050565b6101156004803603606081101561021d57600080fd5b508035906001600160a01b0360208201351690604001356103bd565b6101156103c2565b61026d6004803603604081101561025757600080fd5b50803590602001356001600160a01b03166103c4565b60408051918252519081900360200190f35b60006102ae6040518060400160405280600c81526020016b27ab26afa83937b837b9b2b960a11b8152506102e1565b6001600160a01b0316826001600160a01b0316149050919050565b50505050565b50565b6000546001600160a01b031681565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b83811015610341578181015183820152602001610329565b50505050905090810190601f16801561036e5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561038b57600080fd5b505afa15801561039f573d6000803e3d6000fd5b505050506040513d60208110156103b557600080fd5b505192915050565b505050565b565b60009291505056fea26469706673582212203c88b151a9098fd385f72116ea504d04ab99ce35bdd2be87a9d0b1a4e0f1717464736f6c63430007060033", + "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061009e5760003560e01c8063abfbbe1311610066578063abfbbe1314610207578063bc2f8dd814610239578063c5b6aa2f14610239578063d0e30db014610239578063dc6453dc146102415761009e565b806302ad4d2a146100a35780631e16e92f146100dd5780631e83409a14610117578063299ca4781461013d578063461a447814610161575b600080fd5b6100c9600480360360208110156100b957600080fd5b50356001600160a01b031661027f565b604080519115158252519081900360200190f35b610115600480360360808110156100f357600080fd5b508035906020810135906001600160a01b0360408201351690606001356102c9565b005b6101156004803603602081101561012d57600080fd5b50356001600160a01b03166102cf565b6101456102d2565b604080516001600160a01b039092168252519081900360200190f35b6101456004803603602081101561017757600080fd5b81019060208101813564010000000081111561019257600080fd5b8201836020820111156101a457600080fd5b803590602001918460018302840111640100000000831117156101c657600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506102e1945050505050565b6101156004803603606081101561021d57600080fd5b508035906001600160a01b0360208201351690604001356103bd565b6101156103c2565b61026d6004803603604081101561025757600080fd5b50803590602001356001600160a01b03166103c4565b60408051918252519081900360200190f35b60006102ae6040518060400160405280600c81526020016b27ab26afa83937b837b9b2b960a11b8152506102e1565b6001600160a01b0316826001600160a01b0316149050919050565b50505050565b50565b6000546001600160a01b031681565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b83811015610341578181015183820152602001610329565b50505050905090810190601f16801561036e5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561038b57600080fd5b505afa15801561039f573d6000803e3d6000fd5b505050506040513d60208110156103b557600080fd5b505192915050565b505050565b565b60009291505056fea26469706673582212203c88b151a9098fd385f72116ea504d04ab99ce35bdd2be87a9d0b1a4e0f1717464736f6c63430007060033", "devdoc": { "kind": "dev", - "methods": {}, + "methods": { + "resolve(string)": { + "params": { + "_name": "Name to resolve an address for." + }, + "returns": { + "_0": "Address associated with the given name." + } + } + }, "title": "mockOVM_BondManager", "version": 1 }, "userdoc": { "kind": "user", - "methods": {}, + "methods": { + "resolve(string)": { + "notice": "Resolves the address associated with a given name." + } + }, "version": 1 }, "storageLayout": { "storage": [ { - "astId": 12554, + "astId": 12856, "contract": "contracts/optimistic-ethereum/mockOVM/verification/mockOVM_BondManager.sol:mockOVM_BondManager", "label": "libAddressManager", "offset": 0, "slot": "0", - "type": "t_contract(Lib_AddressManager)12547" + "type": "t_contract(Lib_AddressManager)12849" } ], "types": { - "t_contract(Lib_AddressManager)12547": { + "t_contract(Lib_AddressManager)12849": { "encoding": "inplace", "label": "contract Lib_AddressManager", "numberOfBytes": "20" diff --git a/packages/contracts/deployments/mainnet/solcInputs/f2bdab652d5102f5f11e78dae866798d.json b/packages/contracts/deployments/mainnet/solcInputs/f2bdab652d5102f5f11e78dae866798d.json new file mode 100644 index 0000000000000..5f8bf8e6cf0a9 --- /dev/null +++ b/packages/contracts/deployments/mainnet/solcInputs/f2bdab652d5102f5f11e78dae866798d.json @@ -0,0 +1,308 @@ +{ + "language": "Solidity", + "sources": { + "contracts/optimistic-ethereum/iOVM/accounts/iOVM_ECDSAContractAccount.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/**\n * @title iOVM_ECDSAContractAccount\n */\ninterface iOVM_ECDSAContractAccount {\n\n /********************\n * Public Functions *\n ********************/\n\n function execute(\n bytes memory _encodedTransaction\n )\n external\n returns (\n bool,\n bytes memory\n );\n}\n" + }, + "contracts/optimistic-ethereum/libraries/codec/Lib_OVMCodec.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_RLPReader } from \"../rlp/Lib_RLPReader.sol\";\nimport { Lib_RLPWriter } from \"../rlp/Lib_RLPWriter.sol\";\nimport { Lib_BytesUtils } from \"../utils/Lib_BytesUtils.sol\";\nimport { Lib_Bytes32Utils } from \"../utils/Lib_Bytes32Utils.sol\";\n\n/**\n * @title Lib_OVMCodec\n */\nlibrary Lib_OVMCodec {\n\n /*********\n * Enums *\n *********/\n\n enum QueueOrigin {\n SEQUENCER_QUEUE,\n L1TOL2_QUEUE\n }\n\n\n /***********\n * Structs *\n ***********/\n\n struct Account {\n uint256 nonce;\n uint256 balance;\n bytes32 storageRoot;\n bytes32 codeHash;\n address ethAddress;\n bool isFresh;\n }\n\n struct EVMAccount {\n uint256 nonce;\n uint256 balance;\n bytes32 storageRoot;\n bytes32 codeHash;\n }\n\n struct ChainBatchHeader {\n uint256 batchIndex;\n bytes32 batchRoot;\n uint256 batchSize;\n uint256 prevTotalElements;\n bytes extraData;\n }\n\n struct ChainInclusionProof {\n uint256 index;\n bytes32[] siblings;\n }\n\n struct Transaction {\n uint256 timestamp;\n uint256 blockNumber;\n QueueOrigin l1QueueOrigin;\n address l1TxOrigin;\n address entrypoint;\n uint256 gasLimit;\n bytes data;\n }\n\n struct TransactionChainElement {\n bool isSequenced;\n uint256 queueIndex; // QUEUED TX ONLY\n uint256 timestamp; // SEQUENCER TX ONLY\n uint256 blockNumber; // SEQUENCER TX ONLY\n bytes txData; // SEQUENCER TX ONLY\n }\n\n struct QueueElement {\n bytes32 transactionHash;\n uint40 timestamp;\n uint40 blockNumber;\n }\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Encodes a standard OVM transaction.\n * @param _transaction OVM transaction to encode.\n * @return Encoded transaction bytes.\n */\n function encodeTransaction(\n Transaction memory _transaction\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n return abi.encodePacked(\n _transaction.timestamp,\n _transaction.blockNumber,\n _transaction.l1QueueOrigin,\n _transaction.l1TxOrigin,\n _transaction.entrypoint,\n _transaction.gasLimit,\n _transaction.data\n );\n }\n\n /**\n * Hashes a standard OVM transaction.\n * @param _transaction OVM transaction to encode.\n * @return Hashed transaction\n */\n function hashTransaction(\n Transaction memory _transaction\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n return keccak256(encodeTransaction(_transaction));\n }\n\n /**\n * Converts an OVM account to an EVM account.\n * @param _in OVM account to convert.\n * @return Converted EVM account.\n */\n function toEVMAccount(\n Account memory _in\n )\n internal\n pure\n returns (\n EVMAccount memory\n )\n {\n return EVMAccount({\n nonce: _in.nonce,\n balance: _in.balance,\n storageRoot: _in.storageRoot,\n codeHash: _in.codeHash\n });\n }\n\n /**\n * @notice RLP-encodes an account state struct.\n * @param _account Account state struct.\n * @return RLP-encoded account state.\n */\n function encodeEVMAccount(\n EVMAccount memory _account\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n bytes[] memory raw = new bytes[](4);\n\n // Unfortunately we can't create this array outright because\n // Lib_RLPWriter.writeList will reject fixed-size arrays. Assigning\n // index-by-index circumvents this issue.\n raw[0] = Lib_RLPWriter.writeBytes(\n Lib_Bytes32Utils.removeLeadingZeros(\n bytes32(_account.nonce)\n )\n );\n raw[1] = Lib_RLPWriter.writeBytes(\n Lib_Bytes32Utils.removeLeadingZeros(\n bytes32(_account.balance)\n )\n );\n raw[2] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.storageRoot));\n raw[3] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.codeHash));\n\n return Lib_RLPWriter.writeList(raw);\n }\n\n /**\n * @notice Decodes an RLP-encoded account state into a useful struct.\n * @param _encoded RLP-encoded account state.\n * @return Account state struct.\n */\n function decodeEVMAccount(\n bytes memory _encoded\n )\n internal\n pure\n returns (\n EVMAccount memory\n )\n {\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\n\n return EVMAccount({\n nonce: Lib_RLPReader.readUint256(accountState[0]),\n balance: Lib_RLPReader.readUint256(accountState[1]),\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\n });\n }\n\n /**\n * Calculates a hash for a given batch header.\n * @param _batchHeader Header to hash.\n * @return Hash of the header.\n */\n function hashBatchHeader(\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n return keccak256(\n abi.encode(\n _batchHeader.batchRoot,\n _batchHeader.batchSize,\n _batchHeader.prevTotalElements,\n _batchHeader.extraData\n )\n );\n }\n}\n" + }, + "contracts/optimistic-ethereum/libraries/rlp/Lib_RLPReader.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/**\n * @title Lib_RLPReader\n * @dev Adapted from \"RLPReader\" by Hamdi Allam (hamdi.allam97@gmail.com).\n */\nlibrary Lib_RLPReader {\n\n /*************\n * Constants *\n *************/\n\n uint256 constant internal MAX_LIST_LENGTH = 32;\n\n\n /*********\n * Enums *\n *********/\n\n enum RLPItemType {\n DATA_ITEM,\n LIST_ITEM\n }\n\n\n /***********\n * Structs *\n ***********/\n\n struct RLPItem {\n uint256 length;\n uint256 ptr;\n }\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Converts bytes to a reference to memory position and length.\n * @param _in Input bytes to convert.\n * @return Output memory reference.\n */\n function toRLPItem(\n bytes memory _in\n )\n internal\n pure\n returns (\n RLPItem memory\n )\n {\n uint256 ptr;\n assembly {\n ptr := add(_in, 32)\n }\n\n return RLPItem({\n length: _in.length,\n ptr: ptr\n });\n }\n\n /**\n * Reads an RLP list value into a list of RLP items.\n * @param _in RLP list value.\n * @return Decoded RLP list items.\n */\n function readList(\n RLPItem memory _in\n )\n internal\n pure\n returns (\n RLPItem[] memory\n )\n {\n (\n uint256 listOffset,\n ,\n RLPItemType itemType\n ) = _decodeLength(_in);\n\n require(\n itemType == RLPItemType.LIST_ITEM,\n \"Invalid RLP list value.\"\n );\n\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\n // writing to the length. Since we can't know the number of RLP items without looping over\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\n // simply set a reasonable maximum list length and decrease the size before we finish.\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\n\n uint256 itemCount = 0;\n uint256 offset = listOffset;\n while (offset < _in.length) {\n require(\n itemCount < MAX_LIST_LENGTH,\n \"Provided RLP list exceeds max list length.\"\n );\n\n (\n uint256 itemOffset,\n uint256 itemLength,\n ) = _decodeLength(RLPItem({\n length: _in.length - offset,\n ptr: _in.ptr + offset\n }));\n\n out[itemCount] = RLPItem({\n length: itemLength + itemOffset,\n ptr: _in.ptr + offset\n });\n\n itemCount += 1;\n offset += itemOffset + itemLength;\n }\n\n // Decrease the array size to match the actual item count.\n assembly {\n mstore(out, itemCount)\n }\n\n return out;\n }\n\n /**\n * Reads an RLP list value into a list of RLP items.\n * @param _in RLP list value.\n * @return Decoded RLP list items.\n */\n function readList(\n bytes memory _in\n )\n internal\n pure\n returns (\n RLPItem[] memory\n )\n {\n return readList(\n toRLPItem(_in)\n );\n }\n\n /**\n * Reads an RLP bytes value into bytes.\n * @param _in RLP bytes value.\n * @return Decoded bytes.\n */\n function readBytes(\n RLPItem memory _in\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n (\n uint256 itemOffset,\n uint256 itemLength,\n RLPItemType itemType\n ) = _decodeLength(_in);\n\n require(\n itemType == RLPItemType.DATA_ITEM,\n \"Invalid RLP bytes value.\"\n );\n\n return _copy(_in.ptr, itemOffset, itemLength);\n }\n\n /**\n * Reads an RLP bytes value into bytes.\n * @param _in RLP bytes value.\n * @return Decoded bytes.\n */\n function readBytes(\n bytes memory _in\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n return readBytes(\n toRLPItem(_in)\n );\n }\n\n /**\n * Reads an RLP string value into a string.\n * @param _in RLP string value.\n * @return Decoded string.\n */\n function readString(\n RLPItem memory _in\n )\n internal\n pure\n returns (\n string memory\n )\n {\n return string(readBytes(_in));\n }\n\n /**\n * Reads an RLP string value into a string.\n * @param _in RLP string value.\n * @return Decoded string.\n */\n function readString(\n bytes memory _in\n )\n internal\n pure\n returns (\n string memory\n )\n {\n return readString(\n toRLPItem(_in)\n );\n }\n\n /**\n * Reads an RLP bytes32 value into a bytes32.\n * @param _in RLP bytes32 value.\n * @return Decoded bytes32.\n */\n function readBytes32(\n RLPItem memory _in\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n require(\n _in.length <= 33,\n \"Invalid RLP bytes32 value.\"\n );\n\n (\n uint256 itemOffset,\n uint256 itemLength,\n RLPItemType itemType\n ) = _decodeLength(_in);\n\n require(\n itemType == RLPItemType.DATA_ITEM,\n \"Invalid RLP bytes32 value.\"\n );\n\n uint256 ptr = _in.ptr + itemOffset;\n bytes32 out;\n assembly {\n out := mload(ptr)\n\n // Shift the bytes over to match the item size.\n if lt(itemLength, 32) {\n out := div(out, exp(256, sub(32, itemLength)))\n }\n }\n\n return out;\n }\n\n /**\n * Reads an RLP bytes32 value into a bytes32.\n * @param _in RLP bytes32 value.\n * @return Decoded bytes32.\n */\n function readBytes32(\n bytes memory _in\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n return readBytes32(\n toRLPItem(_in)\n );\n }\n\n /**\n * Reads an RLP uint256 value into a uint256.\n * @param _in RLP uint256 value.\n * @return Decoded uint256.\n */\n function readUint256(\n RLPItem memory _in\n )\n internal\n pure\n returns (\n uint256\n )\n {\n return uint256(readBytes32(_in));\n }\n\n /**\n * Reads an RLP uint256 value into a uint256.\n * @param _in RLP uint256 value.\n * @return Decoded uint256.\n */\n function readUint256(\n bytes memory _in\n )\n internal\n pure\n returns (\n uint256\n )\n {\n return readUint256(\n toRLPItem(_in)\n );\n }\n\n /**\n * Reads an RLP bool value into a bool.\n * @param _in RLP bool value.\n * @return Decoded bool.\n */\n function readBool(\n RLPItem memory _in\n )\n internal\n pure\n returns (\n bool\n )\n {\n require(\n _in.length == 1,\n \"Invalid RLP boolean value.\"\n );\n\n uint256 ptr = _in.ptr;\n uint256 out;\n assembly {\n out := byte(0, mload(ptr))\n }\n\n require(\n out == 0 || out == 1,\n \"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\"\n );\n\n return out != 0;\n }\n\n /**\n * Reads an RLP bool value into a bool.\n * @param _in RLP bool value.\n * @return Decoded bool.\n */\n function readBool(\n bytes memory _in\n )\n internal\n pure\n returns (\n bool\n )\n {\n return readBool(\n toRLPItem(_in)\n );\n }\n\n /**\n * Reads an RLP address value into a address.\n * @param _in RLP address value.\n * @return Decoded address.\n */\n function readAddress(\n RLPItem memory _in\n )\n internal\n pure\n returns (\n address\n )\n {\n if (_in.length == 1) {\n return address(0);\n }\n\n require(\n _in.length == 21,\n \"Invalid RLP address value.\"\n );\n\n return address(readUint256(_in));\n }\n\n /**\n * Reads an RLP address value into a address.\n * @param _in RLP address value.\n * @return Decoded address.\n */\n function readAddress(\n bytes memory _in\n )\n internal\n pure\n returns (\n address\n )\n {\n return readAddress(\n toRLPItem(_in)\n );\n }\n\n /**\n * Reads the raw bytes of an RLP item.\n * @param _in RLP item to read.\n * @return Raw RLP bytes.\n */\n function readRawBytes(\n RLPItem memory _in\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n return _copy(_in);\n }\n\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * Decodes the length of an RLP item.\n * @param _in RLP item to decode.\n * @return Offset of the encoded data.\n * @return Length of the encoded data.\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\n */\n function _decodeLength(\n RLPItem memory _in\n )\n private\n pure\n returns (\n uint256,\n uint256,\n RLPItemType\n )\n {\n require(\n _in.length > 0,\n \"RLP item cannot be null.\"\n );\n\n uint256 ptr = _in.ptr;\n uint256 prefix;\n assembly {\n prefix := byte(0, mload(ptr))\n }\n\n if (prefix <= 0x7f) {\n // Single byte.\n\n return (0, 1, RLPItemType.DATA_ITEM);\n } else if (prefix <= 0xb7) {\n // Short string.\n\n uint256 strLen = prefix - 0x80;\n\n require(\n _in.length > strLen,\n \"Invalid RLP short string.\"\n );\n\n return (1, strLen, RLPItemType.DATA_ITEM);\n } else if (prefix <= 0xbf) {\n // Long string.\n uint256 lenOfStrLen = prefix - 0xb7;\n\n require(\n _in.length > lenOfStrLen,\n \"Invalid RLP long string length.\"\n );\n\n uint256 strLen;\n assembly {\n // Pick out the string length.\n strLen := div(\n mload(add(ptr, 1)),\n exp(256, sub(32, lenOfStrLen))\n )\n }\n\n require(\n _in.length > lenOfStrLen + strLen,\n \"Invalid RLP long string.\"\n );\n\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\n } else if (prefix <= 0xf7) {\n // Short list.\n uint256 listLen = prefix - 0xc0;\n\n require(\n _in.length > listLen,\n \"Invalid RLP short list.\"\n );\n\n return (1, listLen, RLPItemType.LIST_ITEM);\n } else {\n // Long list.\n uint256 lenOfListLen = prefix - 0xf7;\n\n require(\n _in.length > lenOfListLen,\n \"Invalid RLP long list length.\"\n );\n\n uint256 listLen;\n assembly {\n // Pick out the list length.\n listLen := div(\n mload(add(ptr, 1)),\n exp(256, sub(32, lenOfListLen))\n )\n }\n\n require(\n _in.length > lenOfListLen + listLen,\n \"Invalid RLP long list.\"\n );\n\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\n }\n }\n\n /**\n * Copies the bytes from a memory location.\n * @param _src Pointer to the location to read from.\n * @param _offset Offset to start reading from.\n * @param _length Number of bytes to read.\n * @return Copied bytes.\n */\n function _copy(\n uint256 _src,\n uint256 _offset,\n uint256 _length\n )\n private\n pure\n returns (\n bytes memory\n )\n {\n bytes memory out = new bytes(_length);\n if (out.length == 0) {\n return out;\n }\n\n uint256 src = _src + _offset;\n uint256 dest;\n assembly {\n dest := add(out, 32)\n }\n\n // Copy over as many complete words as we can.\n for (uint256 i = 0; i < _length / 32; i++) {\n assembly {\n mstore(dest, mload(src))\n }\n\n src += 32;\n dest += 32;\n }\n\n // Pick out the remaining bytes.\n uint256 mask = 256 ** (32 - (_length % 32)) - 1;\n assembly {\n mstore(\n dest,\n or(\n and(mload(src), not(mask)),\n and(mload(dest), mask)\n )\n )\n }\n\n return out;\n }\n\n /**\n * Copies an RLP item into bytes.\n * @param _in RLP item to copy.\n * @return Copied bytes.\n */\n function _copy(\n RLPItem memory _in\n )\n private\n pure\n returns (\n bytes memory\n )\n {\n return _copy(_in.ptr, 0, _in.length);\n }\n}\n" + }, + "contracts/optimistic-ethereum/libraries/rlp/Lib_RLPWriter.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/**\n * @title Lib_RLPWriter\n * @author Bakaoh (with modifications)\n */\nlibrary Lib_RLPWriter {\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * RLP encodes a byte string.\n * @param _in The byte string to encode.\n * @return The RLP encoded string in bytes.\n */\n function writeBytes(\n bytes memory _in\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n bytes memory encoded;\n\n if (_in.length == 1 && uint8(_in[0]) < 128) {\n encoded = _in;\n } else {\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\n }\n\n return encoded;\n }\n\n /**\n * RLP encodes a list of RLP encoded byte byte strings.\n * @param _in The list of RLP encoded byte strings.\n * @return The RLP encoded list of items in bytes.\n */\n function writeList(\n bytes[] memory _in\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n bytes memory list = _flatten(_in);\n return abi.encodePacked(_writeLength(list.length, 192), list);\n }\n\n /**\n * RLP encodes a string.\n * @param _in The string to encode.\n * @return The RLP encoded string in bytes.\n */\n function writeString(\n string memory _in\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n return writeBytes(bytes(_in));\n }\n\n /**\n * RLP encodes an address.\n * @param _in The address to encode.\n * @return The RLP encoded address in bytes.\n */\n function writeAddress(\n address _in\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n return writeBytes(abi.encodePacked(_in));\n }\n\n /**\n * RLP encodes a bytes32 value.\n * @param _in The bytes32 to encode.\n * @return _out The RLP encoded bytes32 in bytes.\n */\n function writeBytes32(\n bytes32 _in\n )\n internal\n pure\n returns (\n bytes memory _out\n )\n {\n return writeBytes(abi.encodePacked(_in));\n }\n\n /**\n * RLP encodes a uint.\n * @param _in The uint256 to encode.\n * @return The RLP encoded uint256 in bytes.\n */\n function writeUint(\n uint256 _in\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n return writeBytes(_toBinary(_in));\n }\n\n /**\n * RLP encodes a bool.\n * @param _in The bool to encode.\n * @return The RLP encoded bool in bytes.\n */\n function writeBool(\n bool _in\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n bytes memory encoded = new bytes(1);\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\n return encoded;\n }\n\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\n * @param _len The length of the string or the payload.\n * @param _offset 128 if item is string, 192 if item is list.\n * @return RLP encoded bytes.\n */\n function _writeLength(\n uint256 _len,\n uint256 _offset\n )\n private\n pure\n returns (\n bytes memory\n )\n {\n bytes memory encoded;\n\n if (_len < 56) {\n encoded = new bytes(1);\n encoded[0] = byte(uint8(_len) + uint8(_offset));\n } else {\n uint256 lenLen;\n uint256 i = 1;\n while (_len / i != 0) {\n lenLen++;\n i *= 256;\n }\n\n encoded = new bytes(lenLen + 1);\n encoded[0] = byte(uint8(lenLen) + uint8(_offset) + 55);\n for(i = 1; i <= lenLen; i++) {\n encoded[i] = byte(uint8((_len / (256**(lenLen-i))) % 256));\n }\n }\n\n return encoded;\n }\n\n /**\n * Encode integer in big endian binary form with no leading zeroes.\n * @notice TODO: This should be optimized with assembly to save gas costs.\n * @param _x The integer to encode.\n * @return RLP encoded bytes.\n */\n function _toBinary(\n uint256 _x\n )\n private\n pure\n returns (\n bytes memory\n )\n {\n bytes memory b = abi.encodePacked(_x);\n\n uint256 i = 0;\n for (; i < 32; i++) {\n if (b[i] != 0) {\n break;\n }\n }\n\n bytes memory res = new bytes(32 - i);\n for (uint256 j = 0; j < res.length; j++) {\n res[j] = b[i++];\n }\n\n return res;\n }\n\n /**\n * Copies a piece of memory to another location.\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\n * @param _dest Destination location.\n * @param _src Source location.\n * @param _len Length of memory to copy.\n */\n function _memcpy(\n uint256 _dest,\n uint256 _src,\n uint256 _len\n )\n private\n pure\n {\n uint256 dest = _dest;\n uint256 src = _src;\n uint256 len = _len;\n\n for(; len >= 32; len -= 32) {\n assembly {\n mstore(dest, mload(src))\n }\n dest += 32;\n src += 32;\n }\n\n uint256 mask = 256 ** (32 - len) - 1;\n assembly {\n let srcpart := and(mload(src), not(mask))\n let destpart := and(mload(dest), mask)\n mstore(dest, or(destpart, srcpart))\n }\n }\n\n /**\n * Flattens a list of byte strings into one byte string.\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\n * @param _list List of byte strings to flatten.\n * @return The flattened byte string.\n */\n function _flatten(\n bytes[] memory _list\n )\n private\n pure\n returns (\n bytes memory\n )\n {\n if (_list.length == 0) {\n return new bytes(0);\n }\n\n uint256 len;\n uint256 i = 0;\n for (; i < _list.length; i++) {\n len += _list[i].length;\n }\n\n bytes memory flattened = new bytes(len);\n uint256 flattenedPtr;\n assembly { flattenedPtr := add(flattened, 0x20) }\n\n for(i = 0; i < _list.length; i++) {\n bytes memory item = _list[i];\n\n uint256 listPtr;\n assembly { listPtr := add(item, 0x20)}\n\n _memcpy(flattenedPtr, listPtr, item.length);\n flattenedPtr += _list[i].length;\n }\n\n return flattened;\n }\n}\n" + }, + "contracts/optimistic-ethereum/libraries/utils/Lib_BytesUtils.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/**\n * @title Lib_BytesUtils\n */\nlibrary Lib_BytesUtils {\n\n /**********************\n * Internal Functions *\n **********************/\n\n function slice(\n bytes memory _bytes,\n uint256 _start,\n uint256 _length\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n require(_length + 31 >= _length, \"slice_overflow\");\n require(_start + _length >= _start, \"slice_overflow\");\n require(_bytes.length >= _start + _length, \"slice_outOfBounds\");\n\n bytes memory tempBytes;\n\n assembly {\n switch iszero(_length)\n case 0 {\n // Get a location of some free memory and store it in tempBytes as\n // Solidity does for memory variables.\n tempBytes := mload(0x40)\n\n // The first word of the slice result is potentially a partial\n // word read from the original array. To read it, we calculate\n // the length of that partial word and start copying that many\n // bytes into the array. The first word we copy will start with\n // data we don't care about, but the last `lengthmod` bytes will\n // land at the beginning of the contents of the new array. When\n // we're done copying, we overwrite the full first word with\n // the actual length of the slice.\n let lengthmod := and(_length, 31)\n\n // The multiplication in the next line is necessary\n // because when slicing multiples of 32 bytes (lengthmod == 0)\n // the following copy loop was copying the origin's length\n // and then ending prematurely not copying everything it should.\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\n let end := add(mc, _length)\n\n for {\n // The multiplication in the next line has the same exact purpose\n // as the one above.\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\n } lt(mc, end) {\n mc := add(mc, 0x20)\n cc := add(cc, 0x20)\n } {\n mstore(mc, mload(cc))\n }\n\n mstore(tempBytes, _length)\n\n //update free-memory pointer\n //allocating the array padded to 32 bytes like the compiler does now\n mstore(0x40, and(add(mc, 31), not(31)))\n }\n //if we want a zero-length slice let's just return a zero-length array\n default {\n tempBytes := mload(0x40)\n\n //zero out the 32 bytes slice we are about to return\n //we need to do it because Solidity does not garbage collect\n mstore(tempBytes, 0)\n\n mstore(0x40, add(tempBytes, 0x20))\n }\n }\n\n return tempBytes;\n }\n\n function slice(\n bytes memory _bytes,\n uint256 _start\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n if (_start >= _bytes.length) {\n return bytes('');\n }\n\n return slice(_bytes, _start, _bytes.length - _start);\n }\n\n function toBytes32PadLeft(\n bytes memory _bytes\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n bytes32 ret;\n uint256 len = _bytes.length <= 32 ? _bytes.length : 32;\n assembly {\n ret := shr(mul(sub(32, len), 8), mload(add(_bytes, 32)))\n }\n return ret;\n }\n\n function toBytes32(\n bytes memory _bytes\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n if (_bytes.length < 32) {\n bytes32 ret;\n assembly {\n ret := mload(add(_bytes, 32))\n }\n return ret;\n }\n\n return abi.decode(_bytes,(bytes32)); // will truncate if input length > 32 bytes\n }\n\n function toUint256(\n bytes memory _bytes\n )\n internal\n pure\n returns (\n uint256\n )\n {\n return uint256(toBytes32(_bytes));\n }\n\n function toUint24(\n bytes memory _bytes,\n uint256 _start\n )\n internal\n pure\n returns (\n uint24\n )\n {\n require(_start + 3 >= _start, \"toUint24_overflow\");\n require(_bytes.length >= _start + 3 , \"toUint24_outOfBounds\");\n uint24 tempUint;\n\n assembly {\n tempUint := mload(add(add(_bytes, 0x3), _start))\n }\n\n return tempUint;\n }\n\n function toUint8(\n bytes memory _bytes,\n uint256 _start\n )\n internal\n pure\n returns (\n uint8\n )\n {\n require(_start + 1 >= _start, \"toUint8_overflow\");\n require(_bytes.length >= _start + 1 , \"toUint8_outOfBounds\");\n uint8 tempUint;\n\n assembly {\n tempUint := mload(add(add(_bytes, 0x1), _start))\n }\n\n return tempUint;\n }\n\n function toAddress(\n bytes memory _bytes,\n uint256 _start\n )\n internal\n pure\n returns (\n address\n )\n {\n require(_start + 20 >= _start, \"toAddress_overflow\");\n require(_bytes.length >= _start + 20, \"toAddress_outOfBounds\");\n address tempAddress;\n\n assembly {\n tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000)\n }\n\n return tempAddress;\n }\n\n function toNibbles(\n bytes memory _bytes\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n bytes memory nibbles = new bytes(_bytes.length * 2);\n\n for (uint256 i = 0; i < _bytes.length; i++) {\n nibbles[i * 2] = _bytes[i] >> 4;\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\n }\n\n return nibbles;\n }\n\n function fromNibbles(\n bytes memory _bytes\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n bytes memory ret = new bytes(_bytes.length / 2);\n\n for (uint256 i = 0; i < ret.length; i++) {\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\n }\n\n return ret;\n }\n\n function equal(\n bytes memory _bytes,\n bytes memory _other\n )\n internal\n pure\n returns (\n bool\n )\n {\n return keccak256(_bytes) == keccak256(_other);\n }\n}\n" + }, + "contracts/optimistic-ethereum/libraries/utils/Lib_Bytes32Utils.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/**\n * @title Lib_Byte32Utils\n */\nlibrary Lib_Bytes32Utils {\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \"true.\"\n * @param _in Input bytes32 value.\n * @return Bytes32 as a boolean.\n */\n function toBool(\n bytes32 _in\n )\n internal\n pure\n returns (\n bool\n )\n {\n return _in != 0;\n }\n\n /**\n * Converts a boolean to a bytes32 value.\n * @param _in Input boolean value.\n * @return Boolean as a bytes32.\n */\n function fromBool(\n bool _in\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n return bytes32(uint256(_in ? 1 : 0));\n }\n\n /**\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\n * @param _in Input bytes32 value.\n * @return Bytes32 as an address.\n */\n function toAddress(\n bytes32 _in\n )\n internal\n pure\n returns (\n address\n )\n {\n return address(uint160(uint256(_in)));\n }\n\n /**\n * Converts an address to a bytes32.\n * @param _in Input address value.\n * @return Address as a bytes32.\n */\n function fromAddress(\n address _in\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n return bytes32(uint256(_in));\n }\n\n /**\n * Removes the leading zeros from a bytes32 value and returns a new (smaller) bytes value.\n * @param _in Input bytes32 value.\n * @return Bytes32 without any leading zeros.\n */\n function removeLeadingZeros(\n bytes32 _in\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n bytes memory out;\n\n assembly {\n // Figure out how many leading zero bytes to remove.\n let shift := 0\n for { let i := 0 } and(lt(i, 32), eq(byte(i, _in), 0)) { i := add(i, 1) } {\n shift := add(shift, 1)\n }\n\n // Reserve some space for our output and fix the free memory pointer.\n out := mload(0x40)\n mstore(0x40, add(out, 0x40))\n\n // Shift the value and store it into the output bytes.\n mstore(add(out, 0x20), shl(mul(shift, 8), _in))\n\n // Store the new size (with leading zero bytes removed) in the output byte size.\n mstore(out, sub(32, shift))\n }\n\n return out;\n }\n}\n" + }, + "contracts/optimistic-ethereum/libraries/codec/Lib_EIP155Tx.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_RLPReader } from \"../rlp/Lib_RLPReader.sol\";\nimport { Lib_RLPWriter } from \"../rlp/Lib_RLPWriter.sol\";\n\n/**\n * @title Lib_EIP155Tx\n * @dev A simple library for dealing with the transaction type defined by EIP155:\n * https://github.com/ethereum/EIPs/blob/master/EIPS/eip-155.md\n */\nlibrary Lib_EIP155Tx {\n\n /***********\n * Structs *\n ***********/\n\n // Struct representing an EIP155 transaction. See EIP link above for more information.\n struct EIP155Tx {\n // These fields correspond to the actual RLP-encoded fields specified by EIP155.\n uint256 nonce;\n uint256 gasPrice;\n uint256 gasLimit;\n address to;\n uint256 value;\n bytes data;\n uint8 v;\n bytes32 r;\n bytes32 s;\n\n // Chain ID to associate this transaction with. Used all over the place, seemed easier to\n // set this once when we create the transaction rather than providing it as an input to\n // each function. I don't see a strong need to have a transaction with a mutable chain ID.\n uint256 chainId;\n\n // The ECDSA \"recovery parameter,\" should always be 0 or 1. EIP155 specifies that:\n // `v = {0,1} + CHAIN_ID * 2 + 35`\n // Where `{0,1}` is a stand in for our `recovery_parameter`. Now computing our formula for\n // the recovery parameter:\n // 1. `v = {0,1} + CHAIN_ID * 2 + 35`\n // 2. `v = recovery_parameter + CHAIN_ID * 2 + 35`\n // 3. `v - CHAIN_ID * 2 - 35 = recovery_parameter`\n // So we're left with the final formula:\n // `recovery_parameter = v - CHAIN_ID * 2 - 35`\n // NOTE: This variable is a uint8 because `v` is inherently limited to a uint8. If we\n // didn't use a uint8, then recovery_parameter would always be a negative number for chain\n // IDs greater than 110 (`255 - 110 * 2 - 35 = 0`). So we need to wrap around to support\n // anything larger.\n uint8 recoveryParam; \n\n // Whether or not the transaction is a creation. Necessary because we can't make an address\n // \"nil\". Using the zero address creates a potential conflict if the user did actually\n // intend to send a transaction to the zero address.\n bool isCreate; \n }\n\n // Lets us use nicer syntax.\n using Lib_EIP155Tx for EIP155Tx;\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Decodes an EIP155 transaction and attaches a given Chain ID.\n * Transaction *must* be RLP-encoded.\n * @param _encoded RLP-encoded EIP155 transaction.\n * @param _chainId Chain ID to assocaite with this transaction.\n * @return Parsed transaction.\n */\n function decode(\n bytes memory _encoded,\n uint256 _chainId\n )\n internal\n pure\n returns (\n EIP155Tx memory\n )\n {\n Lib_RLPReader.RLPItem[] memory decoded = Lib_RLPReader.readList(_encoded);\n\n // Note formula above about how recoveryParam is computed.\n uint8 v = uint8(Lib_RLPReader.readUint256(decoded[6]));\n uint8 recoveryParam = uint8(v - 2 * _chainId - 35);\n\n // Recovery param being anything other than 0 or 1 indicates that we have the wrong chain\n // ID.\n require(\n recoveryParam < 2,\n \"Lib_EIP155Tx: Transaction signed with wrong chain ID\"\n );\n\n // Creations can be detected by looking at the byte length here.\n bool isCreate = Lib_RLPReader.readBytes(decoded[3]).length == 0;\n\n return EIP155Tx({\n nonce: Lib_RLPReader.readUint256(decoded[0]),\n gasPrice: Lib_RLPReader.readUint256(decoded[1]),\n gasLimit: Lib_RLPReader.readUint256(decoded[2]),\n to: Lib_RLPReader.readAddress(decoded[3]),\n value: Lib_RLPReader.readUint256(decoded[4]),\n data: Lib_RLPReader.readBytes(decoded[5]),\n v: v,\n r: Lib_RLPReader.readBytes32(decoded[7]),\n s: Lib_RLPReader.readBytes32(decoded[8]),\n chainId: _chainId,\n recoveryParam: recoveryParam,\n isCreate: isCreate\n });\n }\n\n /**\n * Encodes an EIP155 transaction into RLP.\n * @param _transaction EIP155 transaction to encode.\n * @param _includeSignature Whether or not to encode the signature.\n * @return RLP-encoded transaction.\n */\n function encode(\n EIP155Tx memory _transaction,\n bool _includeSignature\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n bytes[] memory raw = new bytes[](9);\n\n raw[0] = Lib_RLPWriter.writeUint(_transaction.nonce);\n raw[1] = Lib_RLPWriter.writeUint(_transaction.gasPrice);\n raw[2] = Lib_RLPWriter.writeUint(_transaction.gasLimit);\n\n // We write the encoding of empty bytes when the transaction is a creation, *not* the zero\n // address as one might assume.\n if (_transaction.isCreate) {\n raw[3] = Lib_RLPWriter.writeBytes('');\n } else {\n raw[3] = Lib_RLPWriter.writeAddress(_transaction.to);\n }\n\n raw[4] = Lib_RLPWriter.writeUint(_transaction.value);\n raw[5] = Lib_RLPWriter.writeBytes(_transaction.data);\n\n if (_includeSignature) {\n raw[6] = Lib_RLPWriter.writeUint(_transaction.v);\n raw[7] = Lib_RLPWriter.writeBytes32(_transaction.r);\n raw[8] = Lib_RLPWriter.writeBytes32(_transaction.s);\n } else {\n // Chain ID *is* included in the unsigned transaction.\n raw[6] = Lib_RLPWriter.writeUint(_transaction.chainId); \n raw[7] = Lib_RLPWriter.writeBytes('');\n raw[8] = Lib_RLPWriter.writeBytes('');\n }\n\n return Lib_RLPWriter.writeList(raw);\n }\n\n /**\n * Computes the hash of an EIP155 transaction. Assumes that you don't want to include the\n * signature in this hash because that's a very uncommon usecase. If you really want to include\n * the signature, just encode with the signature and take the hash yourself.\n */\n function hash(\n EIP155Tx memory _transaction\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n return keccak256(\n _transaction.encode(false)\n );\n }\n\n /**\n * Computes the sender of an EIP155 transaction.\n * @param _transaction EIP155 transaction to get a sender for.\n * @return Address corresponding to the private key that signed this transaction.\n */\n function sender(\n EIP155Tx memory _transaction\n )\n internal\n pure\n returns (\n address\n )\n {\n return ecrecover(\n _transaction.hash(),\n _transaction.recoveryParam + 27,\n _transaction.r,\n _transaction.s\n );\n }\n}\n" + }, + "contracts/optimistic-ethereum/OVM/predeploys/OVM_ETH.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Library Imports */\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/* Interface Imports */\nimport { iOVM_L1TokenGateway } from \"../../iOVM/bridge/tokens/iOVM_L1TokenGateway.sol\";\n\n/* Contract Imports */\nimport { OVM_L2DepositedERC20 } from \"../bridge/tokens/OVM_L2DepositedERC20.sol\";\n\n/**\n * @title OVM_ETH\n * @dev The ETH predeploy provides an ERC20 interface for ETH deposited to Layer 2. Note that\n * unlike on Layer 1, Layer 2 accounts do not have a balance field.\n *\n * Compiler used: optimistic-solc\n * Runtime target: OVM\n */\ncontract OVM_ETH is OVM_L2DepositedERC20 {\n constructor(\n address _l2CrossDomainMessenger,\n address _l1ETHGateway\n )\n OVM_L2DepositedERC20(\n _l2CrossDomainMessenger,\n \"Ether\",\n \"ETH\"\n )\n {\n init(iOVM_L1TokenGateway(_l1ETHGateway));\n }\n}\n" + }, + "@openzeppelin/contracts/math/SafeMath.sol": { + "content": "// SPDX-License-Identifier: MIT\n\npragma solidity >=0.6.0 <0.8.0;\n\n/**\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\n * checks.\n *\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\n * in bugs, because programmers usually assume that an overflow raises an\n * error, which is the standard behavior in high level programming languages.\n * `SafeMath` restores this intuition by reverting the transaction when an\n * operation overflows.\n *\n * Using this library instead of the unchecked operations eliminates an entire\n * class of bugs, so it's recommended to use it always.\n */\nlibrary SafeMath {\n /**\n * @dev Returns the addition of two unsigned integers, with an overflow flag.\n *\n * _Available since v3.4._\n */\n function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n uint256 c = a + b;\n if (c < a) return (false, 0);\n return (true, c);\n }\n\n /**\n * @dev Returns the substraction of two unsigned integers, with an overflow flag.\n *\n * _Available since v3.4._\n */\n function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n if (b > a) return (false, 0);\n return (true, a - b);\n }\n\n /**\n * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\n *\n * _Available since v3.4._\n */\n function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\n // benefit is lost if 'b' is also tested.\n // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\n if (a == 0) return (true, 0);\n uint256 c = a * b;\n if (c / a != b) return (false, 0);\n return (true, c);\n }\n\n /**\n * @dev Returns the division of two unsigned integers, with a division by zero flag.\n *\n * _Available since v3.4._\n */\n function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n if (b == 0) return (false, 0);\n return (true, a / b);\n }\n\n /**\n * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\n *\n * _Available since v3.4._\n */\n function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n if (b == 0) return (false, 0);\n return (true, a % b);\n }\n\n /**\n * @dev Returns the addition of two unsigned integers, reverting on\n * overflow.\n *\n * Counterpart to Solidity's `+` operator.\n *\n * Requirements:\n *\n * - Addition cannot overflow.\n */\n function add(uint256 a, uint256 b) internal pure returns (uint256) {\n uint256 c = a + b;\n require(c >= a, \"SafeMath: addition overflow\");\n return c;\n }\n\n /**\n * @dev Returns the subtraction of two unsigned integers, reverting on\n * overflow (when the result is negative).\n *\n * Counterpart to Solidity's `-` operator.\n *\n * Requirements:\n *\n * - Subtraction cannot overflow.\n */\n function sub(uint256 a, uint256 b) internal pure returns (uint256) {\n require(b <= a, \"SafeMath: subtraction overflow\");\n return a - b;\n }\n\n /**\n * @dev Returns the multiplication of two unsigned integers, reverting on\n * overflow.\n *\n * Counterpart to Solidity's `*` operator.\n *\n * Requirements:\n *\n * - Multiplication cannot overflow.\n */\n function mul(uint256 a, uint256 b) internal pure returns (uint256) {\n if (a == 0) return 0;\n uint256 c = a * b;\n require(c / a == b, \"SafeMath: multiplication overflow\");\n return c;\n }\n\n /**\n * @dev Returns the integer division of two unsigned integers, reverting on\n * division by zero. The result is rounded towards zero.\n *\n * Counterpart to Solidity's `/` operator. Note: this function uses a\n * `revert` opcode (which leaves remaining gas untouched) while Solidity\n * uses an invalid opcode to revert (consuming all remaining gas).\n *\n * Requirements:\n *\n * - The divisor cannot be zero.\n */\n function div(uint256 a, uint256 b) internal pure returns (uint256) {\n require(b > 0, \"SafeMath: division by zero\");\n return a / b;\n }\n\n /**\n * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\n * reverting when dividing by zero.\n *\n * Counterpart to Solidity's `%` operator. This function uses a `revert`\n * opcode (which leaves remaining gas untouched) while Solidity uses an\n * invalid opcode to revert (consuming all remaining gas).\n *\n * Requirements:\n *\n * - The divisor cannot be zero.\n */\n function mod(uint256 a, uint256 b) internal pure returns (uint256) {\n require(b > 0, \"SafeMath: modulo by zero\");\n return a % b;\n }\n\n /**\n * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\n * overflow (when the result is negative).\n *\n * CAUTION: This function is deprecated because it requires allocating memory for the error\n * message unnecessarily. For custom revert reasons use {trySub}.\n *\n * Counterpart to Solidity's `-` operator.\n *\n * Requirements:\n *\n * - Subtraction cannot overflow.\n */\n function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\n require(b <= a, errorMessage);\n return a - b;\n }\n\n /**\n * @dev Returns the integer division of two unsigned integers, reverting with custom message on\n * division by zero. The result is rounded towards zero.\n *\n * CAUTION: This function is deprecated because it requires allocating memory for the error\n * message unnecessarily. For custom revert reasons use {tryDiv}.\n *\n * Counterpart to Solidity's `/` operator. Note: this function uses a\n * `revert` opcode (which leaves remaining gas untouched) while Solidity\n * uses an invalid opcode to revert (consuming all remaining gas).\n *\n * Requirements:\n *\n * - The divisor cannot be zero.\n */\n function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\n require(b > 0, errorMessage);\n return a / b;\n }\n\n /**\n * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\n * reverting with custom message when dividing by zero.\n *\n * CAUTION: This function is deprecated because it requires allocating memory for the error\n * message unnecessarily. For custom revert reasons use {tryMod}.\n *\n * Counterpart to Solidity's `%` operator. This function uses a `revert`\n * opcode (which leaves remaining gas untouched) while Solidity uses an\n * invalid opcode to revert (consuming all remaining gas).\n *\n * Requirements:\n *\n * - The divisor cannot be zero.\n */\n function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\n require(b > 0, errorMessage);\n return a % b;\n }\n}\n" + }, + "contracts/optimistic-ethereum/libraries/utils/Lib_ErrorUtils.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/**\n * @title Lib_ErrorUtils\n */\nlibrary Lib_ErrorUtils {\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Encodes an error string into raw solidity-style revert data.\n * (i.e. ascii bytes, prefixed with bytes4(keccak(\"Error(string))\"))\n * Ref: https://docs.soliditylang.org/en/v0.8.2/control-structures.html?highlight=Error(string)#panic-via-assert-and-error-via-require\n * @param _reason Reason for the reversion.\n * @return Standard solidity revert data for the given reason.\n */\n function encodeRevertString(\n string memory _reason\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n return abi.encodeWithSignature(\n \"Error(string)\",\n _reason\n );\n }\n}\n" + }, + "contracts/optimistic-ethereum/libraries/resolver/Lib_AddressResolver.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Library Imports */\nimport { Lib_AddressManager } from \"./Lib_AddressManager.sol\";\n\n/**\n * @title Lib_AddressResolver\n */\nabstract contract Lib_AddressResolver {\n\n /*************\n * Variables *\n *************/\n\n Lib_AddressManager public libAddressManager;\n\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Lib_AddressManager.\n */\n constructor(\n address _libAddressManager\n ) {\n libAddressManager = Lib_AddressManager(_libAddressManager);\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Resolves the address associated with a given name.\n * @param _name Name to resolve an address for.\n * @return Address associated with the given name.\n */\n function resolve(\n string memory _name\n )\n public\n view\n returns (\n address\n )\n {\n return libAddressManager.getAddress(_name);\n }\n}\n" + }, + "contracts/optimistic-ethereum/iOVM/bridge/tokens/iOVM_L1TokenGateway.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0;\npragma experimental ABIEncoderV2;\n\n/**\n * @title iOVM_L1TokenGateway\n */\ninterface iOVM_L1TokenGateway {\n\n /**********\n * Events *\n **********/\n\n event DepositInitiated(\n address indexed _from,\n address _to,\n uint256 _amount\n );\n\n event WithdrawalFinalized(\n address indexed _to,\n uint256 _amount\n );\n\n\n /********************\n * Public Functions *\n ********************/\n\n function deposit(\n uint _amount\n )\n external;\n\n function depositTo(\n address _to,\n uint _amount\n )\n external;\n\n\n /*************************\n * Cross-chain Functions *\n *************************/\n\n function finalizeWithdrawal(\n address _to,\n uint _amount\n )\n external;\n}\n" + }, + "contracts/optimistic-ethereum/OVM/bridge/tokens/OVM_L2DepositedERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Interface Imports */\nimport { iOVM_L1TokenGateway } from \"../../../iOVM/bridge/tokens/iOVM_L1TokenGateway.sol\";\n\n/* Contract Imports */\nimport { UniswapV2ERC20 } from \"../../../libraries/standards/UniswapV2ERC20.sol\";\n\n/* Library Imports */\nimport { Abs_L2DepositedToken } from \"./Abs_L2DepositedToken.sol\";\n\n/**\n * @title OVM_L2DepositedERC20\n * @dev The L2 Deposited ERC20 is an ERC20 implementation which represents L1 assets deposited into L2.\n * This contract mints new tokens when it hears about deposits into the L1 ERC20 gateway.\n * This contract also burns the tokens intended for withdrawal, informing the L1 gateway to release L1 funds.\n *\n * NOTE: This contract implements the Abs_L2DepositedToken contract using Uniswap's ERC20 as the implementation.\n * Alternative implementations can be used in this similar manner.\n *\n * Compiler used: optimistic-solc\n * Runtime target: OVM\n */\ncontract OVM_L2DepositedERC20 is Abs_L2DepositedToken, UniswapV2ERC20 {\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _l2CrossDomainMessenger Cross-domain messenger used by this contract.\n * @param _name ERC20 name\n * @param _symbol ERC20 symbol\n */\n constructor(\n address _l2CrossDomainMessenger,\n string memory _name,\n string memory _symbol\n )\n Abs_L2DepositedToken(_l2CrossDomainMessenger)\n UniswapV2ERC20(_name, _symbol)\n {}\n\n // When a withdrawal is initiated, we burn the withdrawer's funds to prevent subsequent L2 usage.\n function _handleInitiateWithdrawal(\n address, // _to,\n uint _amount\n )\n internal\n override\n {\n _burn(msg.sender, _amount);\n }\n\n // When a deposit is finalized, we credit the account on L2 with the same amount of tokens.\n function _handleFinalizeDeposit(\n address _to,\n uint _amount\n )\n internal\n override\n {\n _mint(_to, _amount);\n }\n}\n" + }, + "contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* External Imports */\nimport { Ownable } from \"@openzeppelin/contracts/access/Ownable.sol\";\n\n/**\n * @title Lib_AddressManager\n */\ncontract Lib_AddressManager is Ownable {\n\n /**********\n * Events *\n **********/\n\n event AddressSet(\n string _name,\n address _newAddress\n );\n\n\n /*************\n * Variables *\n *************/\n\n mapping (bytes32 => address) private addresses;\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Changes the address associated with a particular name.\n * @param _name String name to associate an address with.\n * @param _address Address to associate with the name.\n */\n function setAddress(\n string memory _name,\n address _address\n )\n external\n onlyOwner\n {\n addresses[_getNameHash(_name)] = _address;\n\n emit AddressSet(\n _name,\n _address\n );\n }\n\n /**\n * Retrieves the address associated with a given name.\n * @param _name Name to retrieve an address for.\n * @return Address associated with the given name.\n */\n function getAddress(\n string memory _name\n )\n external\n view\n returns (\n address\n )\n {\n return addresses[_getNameHash(_name)];\n }\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Computes the hash of a name.\n * @param _name Name to compute a hash for.\n * @return Hash of the given name.\n */\n function _getNameHash(\n string memory _name\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n return keccak256(abi.encodePacked(_name));\n }\n}\n" + }, + "@openzeppelin/contracts/access/Ownable.sol": { + "content": "// SPDX-License-Identifier: MIT\n\npragma solidity >=0.6.0 <0.8.0;\n\nimport \"../utils/Context.sol\";\n/**\n * @dev Contract module which provides a basic access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * By default, the owner account will be the one that deploys the contract. This\n * can later be changed with {transferOwnership}.\n *\n * This module is used through inheritance. It will make available the modifier\n * `onlyOwner`, which can be applied to your functions to restrict their use to\n * the owner.\n */\nabstract contract Ownable is Context {\n address private _owner;\n\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n /**\n * @dev Initializes the contract setting the deployer as the initial owner.\n */\n constructor () internal {\n address msgSender = _msgSender();\n _owner = msgSender;\n emit OwnershipTransferred(address(0), msgSender);\n }\n\n /**\n * @dev Returns the address of the current owner.\n */\n function owner() public view virtual returns (address) {\n return _owner;\n }\n\n /**\n * @dev Throws if called by any account other than the owner.\n */\n modifier onlyOwner() {\n require(owner() == _msgSender(), \"Ownable: caller is not the owner\");\n _;\n }\n\n /**\n * @dev Leaves the contract without owner. It will not be possible to call\n * `onlyOwner` functions anymore. Can only be called by the current owner.\n *\n * NOTE: Renouncing ownership will leave the contract without an owner,\n * thereby removing any functionality that is only available to the owner.\n */\n function renounceOwnership() public virtual onlyOwner {\n emit OwnershipTransferred(_owner, address(0));\n _owner = address(0);\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Can only be called by the current owner.\n */\n function transferOwnership(address newOwner) public virtual onlyOwner {\n require(newOwner != address(0), \"Ownable: new owner is the zero address\");\n emit OwnershipTransferred(_owner, newOwner);\n _owner = newOwner;\n }\n}\n" + }, + "@openzeppelin/contracts/utils/Context.sol": { + "content": "// SPDX-License-Identifier: MIT\n\npragma solidity >=0.6.0 <0.8.0;\n\n/*\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with GSN meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract Context {\n function _msgSender() internal view virtual returns (address payable) {\n return msg.sender;\n }\n\n function _msgData() internal view virtual returns (bytes memory) {\n this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\n return msg.data;\n }\n}\n" + }, + "contracts/optimistic-ethereum/libraries/standards/UniswapV2ERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.5.16 <0.8.0;\n\nimport './IUniswapV2ERC20.sol';\nimport './UniSafeMath.sol';\n\ncontract UniswapV2ERC20 is IUniswapV2ERC20 {\n using UniSafeMath for uint;\n\n string public override name;\n string public override symbol;\n uint8 public constant override decimals = 18;\n uint public override totalSupply;\n mapping(address => uint) public override balanceOf;\n mapping(address => mapping(address => uint)) public override allowance;\n\n bytes32 public override DOMAIN_SEPARATOR;\n // keccak256(\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\");\n bytes32 public constant override PERMIT_TYPEHASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9;\n mapping(address => uint) public override nonces;\n\n constructor(\n string memory _name,\n string memory _symbol\n ) {\n name = _name;\n symbol = _symbol;\n\n uint chainId;\n assembly {\n chainId := chainid()\n }\n DOMAIN_SEPARATOR = keccak256(\n abi.encode(\n keccak256('EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)'),\n keccak256(bytes(name)),\n keccak256(bytes('1')),\n chainId,\n address(this)\n )\n );\n }\n\n function _mint(address to, uint value) internal {\n totalSupply = totalSupply.add(value);\n balanceOf[to] = balanceOf[to].add(value);\n emit Transfer(address(0), to, value);\n }\n\n function _burn(address from, uint value) internal {\n balanceOf[from] = balanceOf[from].sub(value);\n totalSupply = totalSupply.sub(value);\n emit Transfer(from, address(0), value);\n }\n\n function _approve(address owner, address spender, uint value) private {\n allowance[owner][spender] = value;\n emit Approval(owner, spender, value);\n }\n\n function _transfer(address from, address to, uint value) private {\n balanceOf[from] = balanceOf[from].sub(value);\n balanceOf[to] = balanceOf[to].add(value);\n emit Transfer(from, to, value);\n }\n\n function approve(address spender, uint value) external override returns (bool) {\n _approve(msg.sender, spender, value);\n return true;\n }\n\n function transfer(address to, uint value) external override returns (bool) {\n _transfer(msg.sender, to, value);\n return true;\n }\n\n function transferFrom(address from, address to, uint value) external override returns (bool) {\n if (allowance[from][msg.sender] != uint(-1)) {\n allowance[from][msg.sender] = allowance[from][msg.sender].sub(value);\n }\n _transfer(from, to, value);\n return true;\n }\n\n function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external override {\n require(deadline >= block.timestamp, 'UniswapV2: EXPIRED');\n bytes32 digest = keccak256(\n abi.encodePacked(\n '\\x19\\x01',\n DOMAIN_SEPARATOR,\n keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, value, nonces[owner]++, deadline))\n )\n );\n address recoveredAddress = ecrecover(digest, v, r, s);\n require(recoveredAddress != address(0) && recoveredAddress == owner, 'UniswapV2: INVALID_SIGNATURE');\n _approve(owner, spender, value);\n }\n}\n" + }, + "contracts/optimistic-ethereum/OVM/bridge/tokens/Abs_L2DepositedToken.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Interface Imports */\nimport { iOVM_L2DepositedToken } from \"../../../iOVM/bridge/tokens/iOVM_L2DepositedToken.sol\";\nimport { iOVM_L1TokenGateway } from \"../../../iOVM/bridge/tokens/iOVM_L1TokenGateway.sol\";\n\n/* Library Imports */\nimport { OVM_CrossDomainEnabled } from \"../../../libraries/bridge/OVM_CrossDomainEnabled.sol\";\n\n/**\n * @title Abs_L2DepositedToken\n * @dev An L2 Deposited Token is an L2 representation of funds which were deposited from L1.\n * Usually contract mints new tokens when it hears about deposits into the L1 ERC20 gateway.\n * This contract also burns the tokens intended for withdrawal, informing the L1 gateway to release L1 funds.\n *\n * NOTE: This abstract contract gives all the core functionality of a deposited token implementation except for the\n * token's internal accounting itself. This gives developers an easy way to implement children with their own token code.\n *\n * Compiler used: optimistic-solc\n * Runtime target: OVM\n */\nabstract contract Abs_L2DepositedToken is iOVM_L2DepositedToken, OVM_CrossDomainEnabled {\n\n /*******************\n * Contract Events *\n *******************/\n\n event Initialized(iOVM_L1TokenGateway _l1TokenGateway);\n\n /********************************\n * External Contract References *\n ********************************/\n\n iOVM_L1TokenGateway public l1TokenGateway;\n\n /********************************\n * Constructor & Initialization *\n ********************************/\n\n /**\n * @param _l2CrossDomainMessenger L1 Messenger address being used for cross-chain communications.\n */\n constructor(\n address _l2CrossDomainMessenger\n )\n OVM_CrossDomainEnabled(_l2CrossDomainMessenger)\n {}\n\n /**\n * @dev Initialize this contract with the L1 token gateway address.\n * The flow: 1) this contract gets deployed on L2, 2) the L1\n * gateway is deployed with addr from (1), 3) L1 gateway address passed here.\n *\n * @param _l1TokenGateway Address of the corresponding L1 gateway deployed to the main chain\n */\n function init(\n iOVM_L1TokenGateway _l1TokenGateway\n )\n public\n {\n require(address(l1TokenGateway) == address(0), \"Contract has already been initialized\");\n\n l1TokenGateway = _l1TokenGateway;\n\n emit Initialized(l1TokenGateway);\n }\n\n /**********************\n * Function Modifiers *\n **********************/\n\n modifier onlyInitialized() {\n require(address(l1TokenGateway) != address(0), \"Contract has not yet been initialized\");\n _;\n }\n\n /********************************\n * Overridable Accounting logic *\n ********************************/\n\n // Default gas value which can be overridden if more complex logic runs on L1.\n uint32 internal constant DEFAULT_FINALIZE_WITHDRAWAL_L1_GAS = 100000;\n\n /**\n * @dev Core logic to be performed when a withdrawal from L2 is initialized.\n * In most cases, this will simply burn the withdrawn L2 funds.\n *\n * param _to Address being withdrawn to\n * param _amount Amount being withdrawn\n */\n function _handleInitiateWithdrawal(\n address, // _to,\n uint // _amount\n )\n internal\n virtual\n {\n revert(\"Accounting must be implemented by child contract.\");\n }\n\n /**\n * @dev Core logic to be performed when a deposit from L2 is finalized on L2.\n * In most cases, this will simply _mint() to credit L2 funds to the recipient.\n *\n * param _to Address being deposited to on L2\n * param _amount Amount which was deposited on L1\n */\n function _handleFinalizeDeposit(\n address, // _to\n uint // _amount\n )\n internal\n virtual\n {\n revert(\"Accounting must be implemented by child contract.\");\n }\n\n /**\n * @dev Overridable getter for the *L1* gas limit of settling the withdrawal, in the case it may be\n * dynamic, and the above public constant does not suffice.\n */\n function getFinalizeWithdrawalL1Gas()\n public\n view\n virtual\n returns(\n uint32\n )\n {\n return DEFAULT_FINALIZE_WITHDRAWAL_L1_GAS;\n }\n\n\n /***************\n * Withdrawing *\n ***************/\n\n /**\n * @dev initiate a withdraw of some tokens to the caller's account on L1\n * @param _amount Amount of the token to withdraw\n */\n function withdraw(\n uint _amount\n )\n external\n override\n virtual\n onlyInitialized()\n {\n _initiateWithdrawal(msg.sender, _amount);\n }\n\n /**\n * @dev initiate a withdraw of some token to a recipient's account on L1\n * @param _to L1 adress to credit the withdrawal to\n * @param _amount Amount of the token to withdraw\n */\n function withdrawTo(\n address _to,\n uint _amount\n )\n external\n override\n virtual\n onlyInitialized()\n {\n _initiateWithdrawal(_to, _amount);\n }\n\n /**\n * @dev Performs the logic for deposits by storing the token and informing the L2 token Gateway of the deposit.\n *\n * @param _to Account to give the withdrawal to on L1\n * @param _amount Amount of the token to withdraw\n */\n function _initiateWithdrawal(\n address _to,\n uint _amount\n )\n internal\n {\n // Call our withdrawal accounting handler implemented by child contracts (usually a _burn)\n _handleInitiateWithdrawal(_to, _amount);\n\n // Construct calldata for l1TokenGateway.finalizeWithdrawal(_to, _amount)\n bytes memory data = abi.encodeWithSelector(\n iOVM_L1TokenGateway.finalizeWithdrawal.selector,\n _to,\n _amount\n );\n\n // Send message up to L1 gateway\n sendCrossDomainMessage(\n address(l1TokenGateway),\n data,\n getFinalizeWithdrawalL1Gas()\n );\n\n emit WithdrawalInitiated(msg.sender, _to, _amount);\n }\n\n /************************************\n * Cross-chain Function: Depositing *\n ************************************/\n\n /**\n * @dev Complete a deposit from L1 to L2, and credits funds to the recipient's balance of this\n * L2 token.\n * This call will fail if it did not originate from a corresponding deposit in OVM_l1TokenGateway.\n *\n * @param _to Address to receive the withdrawal at\n * @param _amount Amount of the token to withdraw\n */\n function finalizeDeposit(\n address _to,\n uint _amount\n )\n external\n override\n virtual\n onlyInitialized()\n onlyFromCrossDomainAccount(address(l1TokenGateway))\n {\n _handleFinalizeDeposit(_to, _amount);\n emit DepositFinalized(_to, _amount);\n }\n}\n" + }, + "contracts/optimistic-ethereum/libraries/standards/IUniswapV2ERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.5.16 <0.8.0;\n\ninterface IUniswapV2ERC20 {\n event Approval(address indexed owner, address indexed spender, uint value);\n event Transfer(address indexed from, address indexed to, uint value);\n\n function name() external view returns (string memory);\n function symbol() external view returns (string memory);\n function decimals() external view returns (uint8);\n function totalSupply() external view returns (uint);\n function balanceOf(address owner) external view returns (uint);\n function allowance(address owner, address spender) external view returns (uint);\n\n function approve(address spender, uint value) external returns (bool);\n function transfer(address to, uint value) external returns (bool);\n function transferFrom(address from, address to, uint value) external returns (bool);\n\n function DOMAIN_SEPARATOR() external view returns (bytes32);\n function PERMIT_TYPEHASH() external pure returns (bytes32);\n function nonces(address owner) external view returns (uint);\n\n function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;\n}\n" + }, + "contracts/optimistic-ethereum/libraries/standards/UniSafeMath.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.5.16 <0.8.0;\n\n// a library for performing overflow-safe math, courtesy of DappHub (https://github.com/dapphub/ds-math)\n\nlibrary UniSafeMath {\n function add(uint x, uint y) internal pure returns (uint z) {\n require((z = x + y) >= x, 'ds-math-add-overflow');\n }\n\n function sub(uint x, uint y) internal pure returns (uint z) {\n require((z = x - y) <= x, 'ds-math-sub-underflow');\n }\n\n function mul(uint x, uint y) internal pure returns (uint z) {\n require(y == 0 || (z = x * y) / y == x, 'ds-math-mul-overflow');\n }\n}\n" + }, + "contracts/optimistic-ethereum/iOVM/bridge/tokens/iOVM_L2DepositedToken.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0;\npragma experimental ABIEncoderV2;\n\n/**\n * @title iOVM_L2DepositedToken\n */\ninterface iOVM_L2DepositedToken {\n\n /**********\n * Events *\n **********/\n\n event WithdrawalInitiated(\n address indexed _from,\n address _to,\n uint256 _amount\n );\n\n event DepositFinalized(\n address indexed _to,\n uint256 _amount\n );\n\n\n /********************\n * Public Functions *\n ********************/\n\n function withdraw(\n uint _amount\n )\n external;\n\n function withdrawTo(\n address _to,\n uint _amount\n )\n external;\n\n\n /*************************\n * Cross-chain Functions *\n *************************/\n\n function finalizeDeposit(\n address _to,\n uint _amount\n )\n external;\n}\n" + }, + "contracts/optimistic-ethereum/libraries/bridge/OVM_CrossDomainEnabled.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Interface Imports */\nimport { iAbs_BaseCrossDomainMessenger } from \"../../iOVM/bridge/messaging/iAbs_BaseCrossDomainMessenger.sol\";\n\n/**\n * @title OVM_CrossDomainEnabled\n * @dev Helper contract for contracts performing cross-domain communications\n *\n * Compiler used: defined by inheriting contract\n * Runtime target: defined by inheriting contract\n */\ncontract OVM_CrossDomainEnabled {\n\n /*************\n * Variables *\n *************/\n\n // Messenger contract used to send and recieve messages from the other domain.\n address public messenger;\n\n\n /***************\n * Constructor *\n ***************/ \n\n /**\n * @param _messenger Address of the CrossDomainMessenger on the current layer.\n */\n constructor(\n address _messenger\n ) {\n messenger = _messenger;\n }\n\n\n /**********************\n * Function Modifiers *\n **********************/\n\n /**\n * Enforces that the modified function is only callable by a specific cross-domain account.\n * @param _sourceDomainAccount The only account on the originating domain which is\n * authenticated to call this function.\n */\n modifier onlyFromCrossDomainAccount(\n address _sourceDomainAccount\n ) {\n require(\n msg.sender == address(getCrossDomainMessenger()),\n \"OVM_XCHAIN: messenger contract unauthenticated\"\n );\n\n require(\n getCrossDomainMessenger().xDomainMessageSender() == _sourceDomainAccount,\n \"OVM_XCHAIN: wrong sender of cross-domain message\"\n );\n\n _;\n }\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Gets the messenger, usually from storage. This function is exposed in case a child contract\n * needs to override.\n * @return The address of the cross-domain messenger contract which should be used. \n */\n function getCrossDomainMessenger()\n internal\n virtual\n returns (\n iAbs_BaseCrossDomainMessenger\n )\n {\n return iAbs_BaseCrossDomainMessenger(messenger);\n }\n\n /**\n * Sends a message to an account on another domain\n * @param _crossDomainTarget The intended recipient on the destination domain\n * @param _data The data to send to the target (usually calldata to a function with\n * `onlyFromCrossDomainAccount()`)\n * @param _gasLimit The gasLimit for the receipt of the message on the target domain.\n */\n function sendCrossDomainMessage(\n address _crossDomainTarget,\n bytes memory _data,\n uint32 _gasLimit\n )\n internal\n {\n getCrossDomainMessenger().sendMessage(_crossDomainTarget, _data, _gasLimit);\n }\n}\n" + }, + "contracts/optimistic-ethereum/iOVM/bridge/messaging/iAbs_BaseCrossDomainMessenger.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/**\n * @title iAbs_BaseCrossDomainMessenger\n */\ninterface iAbs_BaseCrossDomainMessenger {\n\n /**********\n * Events *\n **********/\n\n event SentMessage(bytes message);\n event RelayedMessage(bytes32 msgHash);\n event FailedRelayedMessage(bytes32 msgHash);\n\n\n /*************\n * Variables *\n *************/\n\n function xDomainMessageSender() external view returns (address);\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Sends a cross domain message to the target messenger.\n * @param _target Target contract address.\n * @param _message Message to send to the target.\n * @param _gasLimit Gas limit for the provided message.\n */\n function sendMessage(\n address _target,\n bytes calldata _message,\n uint32 _gasLimit\n ) external;\n}\n" + }, + "contracts/optimistic-ethereum/OVM/chain/OVM_StateCommitmentChain.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\nimport { Lib_MerkleTree } from \"../../libraries/utils/Lib_MerkleTree.sol\";\n\n/* Interface Imports */\nimport { iOVM_FraudVerifier } from \"../../iOVM/verification/iOVM_FraudVerifier.sol\";\nimport { iOVM_StateCommitmentChain } from \"../../iOVM/chain/iOVM_StateCommitmentChain.sol\";\nimport { iOVM_CanonicalTransactionChain } from \"../../iOVM/chain/iOVM_CanonicalTransactionChain.sol\";\nimport { iOVM_BondManager } from \"../../iOVM/verification/iOVM_BondManager.sol\";\nimport { iOVM_ChainStorageContainer } from \"../../iOVM/chain/iOVM_ChainStorageContainer.sol\";\n\n/* External Imports */\nimport '@openzeppelin/contracts/math/SafeMath.sol';\n\n/**\n * @title OVM_StateCommitmentChain\n * @dev The State Commitment Chain (SCC) contract contains a list of proposed state roots which\n * Proposers assert to be a result of each transaction in the Canonical Transaction Chain (CTC).\n * Elements here have a 1:1 correspondence with transactions in the CTC, and should be the unique\n * state root calculated off-chain by applying the canonical transactions one by one.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract OVM_StateCommitmentChain is iOVM_StateCommitmentChain, Lib_AddressResolver {\n\n /*************\n * Constants *\n *************/\n\n uint256 public FRAUD_PROOF_WINDOW;\n uint256 public SEQUENCER_PUBLISH_WINDOW;\n\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n constructor(\n address _libAddressManager,\n uint256 _fraudProofWindow,\n uint256 _sequencerPublishWindow\n )\n Lib_AddressResolver(_libAddressManager)\n {\n FRAUD_PROOF_WINDOW = _fraudProofWindow;\n SEQUENCER_PUBLISH_WINDOW = _sequencerPublishWindow;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Accesses the batch storage container.\n * @return Reference to the batch storage container.\n */\n function batches()\n public\n view\n returns (\n iOVM_ChainStorageContainer\n )\n {\n return iOVM_ChainStorageContainer(\n resolve(\"OVM_ChainStorageContainer:SCC:batches\")\n );\n }\n\n /**\n * @inheritdoc iOVM_StateCommitmentChain\n */\n function getTotalElements()\n override\n public\n view\n returns (\n uint256 _totalElements\n )\n {\n (uint40 totalElements, ) = _getBatchExtraData();\n return uint256(totalElements);\n }\n\n /**\n * @inheritdoc iOVM_StateCommitmentChain\n */\n function getTotalBatches()\n override\n public\n view\n returns (\n uint256 _totalBatches\n )\n {\n return batches().length();\n }\n\n /**\n * @inheritdoc iOVM_StateCommitmentChain\n */\n function getLastSequencerTimestamp()\n override\n public\n view\n returns (\n uint256 _lastSequencerTimestamp\n )\n {\n (, uint40 lastSequencerTimestamp) = _getBatchExtraData();\n return uint256(lastSequencerTimestamp);\n }\n\n /**\n * @inheritdoc iOVM_StateCommitmentChain\n */\n function appendStateBatch(\n bytes32[] memory _batch,\n uint256 _shouldStartAtElement\n )\n override\n public\n {\n // Fail fast in to make sure our batch roots aren't accidentally made fraudulent by the\n // publication of batches by some other user.\n require(\n _shouldStartAtElement == getTotalElements(),\n \"Actual batch start index does not match expected start index.\"\n );\n\n // Proposers must have previously staked at the BondManager\n require(\n iOVM_BondManager(resolve(\"OVM_BondManager\")).isCollateralized(msg.sender),\n \"Proposer does not have enough collateral posted\"\n );\n\n require(\n _batch.length > 0,\n \"Cannot submit an empty state batch.\"\n );\n\n require(\n getTotalElements() + _batch.length <= iOVM_CanonicalTransactionChain(resolve(\"OVM_CanonicalTransactionChain\")).getTotalElements(),\n \"Number of state roots cannot exceed the number of canonical transactions.\"\n );\n\n // Pass the block's timestamp and the publisher of the data\n // to be used in the fraud proofs\n _appendBatch(\n _batch,\n abi.encode(block.timestamp, msg.sender)\n );\n }\n\n /**\n * @inheritdoc iOVM_StateCommitmentChain\n */\n function deleteStateBatch(\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\n )\n override\n public\n {\n require(\n msg.sender == resolve(\"OVM_FraudVerifier\"),\n \"State batches can only be deleted by the OVM_FraudVerifier.\"\n );\n\n require(\n _isValidBatchHeader(_batchHeader),\n \"Invalid batch header.\"\n );\n\n require(\n insideFraudProofWindow(_batchHeader),\n \"State batches can only be deleted within the fraud proof window.\"\n );\n\n _deleteBatch(_batchHeader);\n }\n\n /**\n * @inheritdoc iOVM_StateCommitmentChain\n */\n function verifyStateCommitment(\n bytes32 _element,\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _proof\n )\n override\n public\n view\n returns (\n bool\n )\n {\n require(\n _isValidBatchHeader(_batchHeader),\n \"Invalid batch header.\"\n );\n\n require(\n Lib_MerkleTree.verify(\n _batchHeader.batchRoot,\n _element,\n _proof.index,\n _proof.siblings,\n _batchHeader.batchSize\n ),\n \"Invalid inclusion proof.\"\n );\n\n return true;\n }\n\n /**\n * @inheritdoc iOVM_StateCommitmentChain\n */\n function insideFraudProofWindow(\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\n )\n override\n public\n view\n returns (\n bool _inside\n )\n {\n (uint256 timestamp,) = abi.decode(\n _batchHeader.extraData,\n (uint256, address)\n );\n\n require(\n timestamp != 0,\n \"Batch header timestamp cannot be zero\"\n );\n return SafeMath.add(timestamp, FRAUD_PROOF_WINDOW) > block.timestamp;\n }\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Parses the batch context from the extra data.\n * @return Total number of elements submitted.\n * @return Timestamp of the last batch submitted by the sequencer.\n */\n function _getBatchExtraData()\n internal\n view\n returns (\n uint40,\n uint40\n )\n {\n bytes27 extraData = batches().getGlobalMetadata();\n\n uint40 totalElements;\n uint40 lastSequencerTimestamp;\n assembly {\n extraData := shr(40, extraData)\n totalElements := and(extraData, 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF)\n lastSequencerTimestamp := shr(40, and(extraData, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000))\n }\n\n return (\n totalElements,\n lastSequencerTimestamp\n );\n }\n\n /**\n * Encodes the batch context for the extra data.\n * @param _totalElements Total number of elements submitted.\n * @param _lastSequencerTimestamp Timestamp of the last batch submitted by the sequencer.\n * @return Encoded batch context.\n */\n function _makeBatchExtraData(\n uint40 _totalElements,\n uint40 _lastSequencerTimestamp\n )\n internal\n pure\n returns (\n bytes27\n )\n {\n bytes27 extraData;\n assembly {\n extraData := _totalElements\n extraData := or(extraData, shl(40, _lastSequencerTimestamp))\n extraData := shl(40, extraData)\n }\n\n return extraData;\n }\n\n /**\n * Appends a batch to the chain.\n * @param _batch Elements within the batch.\n * @param _extraData Any extra data to append to the batch.\n */\n function _appendBatch(\n bytes32[] memory _batch,\n bytes memory _extraData\n )\n internal\n {\n address sequencer = resolve(\"OVM_Proposer\");\n (uint40 totalElements, uint40 lastSequencerTimestamp) = _getBatchExtraData();\n\n if (msg.sender == sequencer) {\n lastSequencerTimestamp = uint40(block.timestamp);\n } else {\n // We keep track of the last batch submitted by the sequencer so there's a window in\n // which only the sequencer can publish state roots. A window like this just reduces\n // the chance of \"system breaking\" state roots being published while we're still in\n // testing mode. This window should be removed or significantly reduced in the future.\n require(\n lastSequencerTimestamp + SEQUENCER_PUBLISH_WINDOW < block.timestamp,\n \"Cannot publish state roots within the sequencer publication window.\"\n );\n }\n\n // For efficiency reasons getMerkleRoot modifies the `_batch` argument in place\n // while calculating the root hash therefore any arguments passed to it must not\n // be used again afterwards\n Lib_OVMCodec.ChainBatchHeader memory batchHeader = Lib_OVMCodec.ChainBatchHeader({\n batchIndex: getTotalBatches(),\n batchRoot: Lib_MerkleTree.getMerkleRoot(_batch),\n batchSize: _batch.length,\n prevTotalElements: totalElements,\n extraData: _extraData\n });\n\n emit StateBatchAppended(\n batchHeader.batchIndex,\n batchHeader.batchRoot,\n batchHeader.batchSize,\n batchHeader.prevTotalElements,\n batchHeader.extraData\n );\n\n batches().push(\n Lib_OVMCodec.hashBatchHeader(batchHeader),\n _makeBatchExtraData(\n uint40(batchHeader.prevTotalElements + batchHeader.batchSize),\n lastSequencerTimestamp\n )\n );\n }\n\n /**\n * Removes a batch and all subsequent batches from the chain.\n * @param _batchHeader Header of the batch to remove.\n */\n function _deleteBatch(\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\n )\n internal\n {\n require(\n _batchHeader.batchIndex < batches().length(),\n \"Invalid batch index.\"\n );\n\n require(\n _isValidBatchHeader(_batchHeader),\n \"Invalid batch header.\"\n );\n\n batches().deleteElementsAfterInclusive(\n _batchHeader.batchIndex,\n _makeBatchExtraData(\n uint40(_batchHeader.prevTotalElements),\n 0\n )\n );\n\n emit StateBatchDeleted(\n _batchHeader.batchIndex,\n _batchHeader.batchRoot\n );\n }\n\n /**\n * Checks that a batch header matches the stored hash for the given index.\n * @param _batchHeader Batch header to validate.\n * @return Whether or not the header matches the stored one.\n */\n function _isValidBatchHeader(\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\n )\n internal\n view\n returns (\n bool\n )\n {\n return Lib_OVMCodec.hashBatchHeader(_batchHeader) == batches().get(_batchHeader.batchIndex);\n }\n}\n" + }, + "contracts/optimistic-ethereum/libraries/utils/Lib_MerkleTree.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/**\n * @title Lib_MerkleTree\n * @author River Keefer\n */\nlibrary Lib_MerkleTree {\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Calculates a merkle root for a list of 32-byte leaf hashes. WARNING: If the number\n * of leaves passed in is not a power of two, it pads out the tree with zero hashes.\n * If you do not know the original length of elements for the tree you are verifying,\n * then this may allow empty leaves past _elements.length to pass a verification check down the line.\n * Note that the _elements argument is modified, therefore it must not be used again afterwards\n * @param _elements Array of hashes from which to generate a merkle root.\n * @return Merkle root of the leaves, with zero hashes for non-powers-of-two (see above).\n */\n function getMerkleRoot(\n bytes32[] memory _elements\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n require(\n _elements.length > 0,\n \"Lib_MerkleTree: Must provide at least one leaf hash.\"\n );\n\n if (_elements.length == 1) {\n return _elements[0];\n }\n\n uint256[16] memory defaults = [\n 0x290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563,\n 0x633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d,\n 0x890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d,\n 0x3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd8,\n 0xecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da,\n 0xdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da5,\n 0x617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d7,\n 0x292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead,\n 0xe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e10,\n 0x7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f82,\n 0xe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e83636516,\n 0x3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c,\n 0xad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e,\n 0xa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab,\n 0x4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c862,\n 0x2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf10\n ];\n\n // Reserve memory space for our hashes.\n bytes memory buf = new bytes(64);\n\n // We'll need to keep track of left and right siblings.\n bytes32 leftSibling;\n bytes32 rightSibling;\n\n // Number of non-empty nodes at the current depth.\n uint256 rowSize = _elements.length;\n\n // Current depth, counting from 0 at the leaves\n uint256 depth = 0;\n\n // Common sub-expressions\n uint256 halfRowSize; // rowSize / 2\n bool rowSizeIsOdd; // rowSize % 2 == 1\n\n while (rowSize > 1) {\n halfRowSize = rowSize / 2;\n rowSizeIsOdd = rowSize % 2 == 1;\n\n for (uint256 i = 0; i < halfRowSize; i++) {\n leftSibling = _elements[(2 * i) ];\n rightSibling = _elements[(2 * i) + 1];\n assembly {\n mstore(add(buf, 32), leftSibling )\n mstore(add(buf, 64), rightSibling)\n }\n\n _elements[i] = keccak256(buf);\n }\n\n if (rowSizeIsOdd) {\n leftSibling = _elements[rowSize - 1];\n rightSibling = bytes32(defaults[depth]);\n assembly {\n mstore(add(buf, 32), leftSibling)\n mstore(add(buf, 64), rightSibling)\n }\n\n _elements[halfRowSize] = keccak256(buf);\n }\n\n rowSize = halfRowSize + (rowSizeIsOdd ? 1 : 0);\n depth++;\n }\n\n return _elements[0];\n }\n\n /**\n * Verifies a merkle branch for the given leaf hash. Assumes the original length\n * of leaves generated is a known, correct input, and does not return true for indices\n * extending past that index (even if _siblings would be otherwise valid.)\n * @param _root The Merkle root to verify against.\n * @param _leaf The leaf hash to verify inclusion of.\n * @param _index The index in the tree of this leaf.\n * @param _siblings Array of sibline nodes in the inclusion proof, starting from depth 0 (bottom of the tree).\n * @param _totalLeaves The total number of leaves originally passed into.\n * @return Whether or not the merkle branch and leaf passes verification.\n */\n function verify(\n bytes32 _root,\n bytes32 _leaf,\n uint256 _index,\n bytes32[] memory _siblings,\n uint256 _totalLeaves\n )\n internal\n pure\n returns (\n bool\n )\n {\n require(\n _totalLeaves > 0,\n \"Lib_MerkleTree: Total leaves must be greater than zero.\"\n );\n\n require(\n _index < _totalLeaves,\n \"Lib_MerkleTree: Index out of bounds.\"\n );\n\n require(\n _siblings.length == _ceilLog2(_totalLeaves),\n \"Lib_MerkleTree: Total siblings does not correctly correspond to total leaves.\"\n );\n\n bytes32 computedRoot = _leaf;\n\n for (uint256 i = 0; i < _siblings.length; i++) {\n if ((_index & 1) == 1) {\n computedRoot = keccak256(\n abi.encodePacked(\n _siblings[i],\n computedRoot\n )\n );\n } else {\n computedRoot = keccak256(\n abi.encodePacked(\n computedRoot,\n _siblings[i]\n )\n );\n }\n\n _index >>= 1;\n }\n\n return _root == computedRoot;\n }\n\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * Calculates the integer ceiling of the log base 2 of an input.\n * @param _in Unsigned input to calculate the log.\n * @return ceil(log_base_2(_in))\n */\n function _ceilLog2(\n uint256 _in\n )\n private\n pure\n returns (\n uint256\n )\n {\n require(\n _in > 0,\n \"Lib_MerkleTree: Cannot compute ceil(log_2) of 0.\"\n );\n\n if (_in == 1) {\n return 0;\n }\n\n // Find the highest set bit (will be floor(log_2)).\n // Borrowed with <3 from https://github.com/ethereum/solidity-examples\n uint256 val = _in;\n uint256 highest = 0;\n for (uint256 i = 128; i >= 1; i >>= 1) {\n if (val & (uint(1) << i) - 1 << i != 0) {\n highest += i;\n val >>= i;\n }\n }\n\n // Increment by one if this is not a perfect logarithm.\n if ((uint(1) << highest) != _in) {\n highest += 1;\n }\n\n return highest;\n }\n}\n" + }, + "contracts/optimistic-ethereum/iOVM/verification/iOVM_FraudVerifier.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/* Interface Imports */\nimport { iOVM_StateTransitioner } from \"./iOVM_StateTransitioner.sol\";\n\n/**\n * @title iOVM_FraudVerifier\n */\ninterface iOVM_FraudVerifier {\n\n /**********\n * Events *\n **********/\n\n event FraudProofInitialized(\n bytes32 _preStateRoot,\n uint256 _preStateRootIndex,\n bytes32 _transactionHash,\n address _who\n );\n\n event FraudProofFinalized(\n bytes32 _preStateRoot,\n uint256 _preStateRootIndex,\n bytes32 _transactionHash,\n address _who\n );\n\n\n /***************************************\n * Public Functions: Transition Status *\n ***************************************/\n\n function getStateTransitioner(bytes32 _preStateRoot, bytes32 _txHash) external view returns (iOVM_StateTransitioner _transitioner);\n\n\n /****************************************\n * Public Functions: Fraud Verification *\n ****************************************/\n\n function initializeFraudVerification(\n bytes32 _preStateRoot,\n Lib_OVMCodec.ChainBatchHeader calldata _preStateRootBatchHeader,\n Lib_OVMCodec.ChainInclusionProof calldata _preStateRootProof,\n Lib_OVMCodec.Transaction calldata _transaction,\n Lib_OVMCodec.TransactionChainElement calldata _txChainElement,\n Lib_OVMCodec.ChainBatchHeader calldata _transactionBatchHeader,\n Lib_OVMCodec.ChainInclusionProof calldata _transactionProof\n ) external;\n\n function finalizeFraudVerification(\n bytes32 _preStateRoot,\n Lib_OVMCodec.ChainBatchHeader calldata _preStateRootBatchHeader,\n Lib_OVMCodec.ChainInclusionProof calldata _preStateRootProof,\n bytes32 _txHash,\n bytes32 _postStateRoot,\n Lib_OVMCodec.ChainBatchHeader calldata _postStateRootBatchHeader,\n Lib_OVMCodec.ChainInclusionProof calldata _postStateRootProof\n ) external;\n}\n" + }, + "contracts/optimistic-ethereum/iOVM/chain/iOVM_StateCommitmentChain.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/**\n * @title iOVM_StateCommitmentChain\n */\ninterface iOVM_StateCommitmentChain {\n\n /**********\n * Events *\n **********/\n\n event StateBatchAppended(\n uint256 indexed _batchIndex,\n bytes32 _batchRoot,\n uint256 _batchSize,\n uint256 _prevTotalElements,\n bytes _extraData\n );\n\n event StateBatchDeleted(\n uint256 indexed _batchIndex,\n bytes32 _batchRoot\n );\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Retrieves the total number of elements submitted.\n * @return _totalElements Total submitted elements.\n */\n function getTotalElements()\n external\n view\n returns (\n uint256 _totalElements\n );\n\n /**\n * Retrieves the total number of batches submitted.\n * @return _totalBatches Total submitted batches.\n */\n function getTotalBatches()\n external\n view\n returns (\n uint256 _totalBatches\n );\n\n /**\n * Retrieves the timestamp of the last batch submitted by the sequencer.\n * @return _lastSequencerTimestamp Last sequencer batch timestamp.\n */\n function getLastSequencerTimestamp()\n external\n view\n returns (\n uint256 _lastSequencerTimestamp\n );\n\n /**\n * Appends a batch of state roots to the chain.\n * @param _batch Batch of state roots.\n * @param _shouldStartAtElement Index of the element at which this batch should start.\n */\n function appendStateBatch(\n bytes32[] calldata _batch,\n uint256 _shouldStartAtElement\n )\n external;\n\n /**\n * Deletes all state roots after (and including) a given batch.\n * @param _batchHeader Header of the batch to start deleting from.\n */\n function deleteStateBatch(\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\n )\n external;\n\n /**\n * Verifies a batch inclusion proof.\n * @param _element Hash of the element to verify a proof for.\n * @param _batchHeader Header of the batch in which the element was included.\n * @param _proof Merkle inclusion proof for the element.\n */\n function verifyStateCommitment(\n bytes32 _element,\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _proof\n )\n external\n view\n returns (\n bool _verified\n );\n\n /**\n * Checks whether a given batch is still inside its fraud proof window.\n * @param _batchHeader Header of the batch to check.\n * @return _inside Whether or not the batch is inside the fraud proof window.\n */\n function insideFraudProofWindow(\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\n )\n external\n view\n returns (\n bool _inside\n );\n}\n" + }, + "contracts/optimistic-ethereum/iOVM/chain/iOVM_CanonicalTransactionChain.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/* Interface Imports */\nimport { iOVM_ChainStorageContainer } from \"./iOVM_ChainStorageContainer.sol\";\n\n/**\n * @title iOVM_CanonicalTransactionChain\n */\ninterface iOVM_CanonicalTransactionChain {\n\n /**********\n * Events *\n **********/\n\n event TransactionEnqueued(\n address _l1TxOrigin,\n address _target,\n uint256 _gasLimit,\n bytes _data,\n uint256 _queueIndex,\n uint256 _timestamp\n );\n\n event QueueBatchAppended(\n uint256 _startingQueueIndex,\n uint256 _numQueueElements,\n uint256 _totalElements\n );\n\n event SequencerBatchAppended(\n uint256 _startingQueueIndex,\n uint256 _numQueueElements,\n uint256 _totalElements\n );\n\n event TransactionBatchAppended(\n uint256 indexed _batchIndex,\n bytes32 _batchRoot,\n uint256 _batchSize,\n uint256 _prevTotalElements,\n bytes _extraData\n );\n\n\n /***********\n * Structs *\n ***********/\n\n struct BatchContext {\n uint256 numSequencedTransactions;\n uint256 numSubsequentQueueTransactions;\n uint256 timestamp;\n uint256 blockNumber;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n\n /**\n * Accesses the batch storage container.\n * @return Reference to the batch storage container.\n */\n function batches()\n external\n view\n returns (\n iOVM_ChainStorageContainer\n );\n\n /**\n * Accesses the queue storage container.\n * @return Reference to the queue storage container.\n */\n function queue()\n external\n view\n returns (\n iOVM_ChainStorageContainer\n );\n\n /**\n * Retrieves the total number of elements submitted.\n * @return _totalElements Total submitted elements.\n */\n function getTotalElements()\n external\n view\n returns (\n uint256 _totalElements\n );\n\n /**\n * Retrieves the total number of batches submitted.\n * @return _totalBatches Total submitted batches.\n */\n function getTotalBatches()\n external\n view\n returns (\n uint256 _totalBatches\n );\n\n /**\n * Returns the index of the next element to be enqueued.\n * @return Index for the next queue element.\n */\n function getNextQueueIndex()\n external\n view\n returns (\n uint40\n );\n\n /**\n * Gets the queue element at a particular index.\n * @param _index Index of the queue element to access.\n * @return _element Queue element at the given index.\n */\n function getQueueElement(\n uint256 _index\n )\n external\n view\n returns (\n Lib_OVMCodec.QueueElement memory _element\n );\n\n /**\n * Returns the timestamp of the last transaction.\n * @return Timestamp for the last transaction.\n */\n function getLastTimestamp()\n external\n view\n returns (\n uint40\n );\n\n /**\n * Returns the blocknumber of the last transaction.\n * @return Blocknumber for the last transaction.\n */\n function getLastBlockNumber()\n external\n view\n returns (\n uint40\n );\n\n /**\n * Get the number of queue elements which have not yet been included.\n * @return Number of pending queue elements.\n */\n function getNumPendingQueueElements()\n external\n view\n returns (\n uint40\n );\n\n /**\n * Retrieves the length of the queue, including\n * both pending and canonical transactions.\n * @return Length of the queue.\n */\n function getQueueLength()\n external\n view\n returns (\n uint40\n );\n\n\n /**\n * Adds a transaction to the queue.\n * @param _target Target contract to send the transaction to.\n * @param _gasLimit Gas limit for the given transaction.\n * @param _data Transaction data.\n */\n function enqueue(\n address _target,\n uint256 _gasLimit,\n bytes memory _data\n )\n external;\n\n /**\n * Appends a given number of queued transactions as a single batch.\n * @param _numQueuedTransactions Number of transactions to append.\n */\n function appendQueueBatch(\n uint256 _numQueuedTransactions\n )\n external;\n\n /**\n * Allows the sequencer to append a batch of transactions.\n * @dev This function uses a custom encoding scheme for efficiency reasons.\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\n * .param _contexts Array of batch contexts.\n * .param _transactionDataFields Array of raw transaction data.\n */\n function appendSequencerBatch(\n // uint40 _shouldStartAtElement,\n // uint24 _totalElementsToAppend,\n // BatchContext[] _contexts,\n // bytes[] _transactionDataFields\n )\n external;\n\n /**\n * Verifies whether a transaction is included in the chain.\n * @param _transaction Transaction to verify.\n * @param _txChainElement Transaction chain element corresponding to the transaction.\n * @param _batchHeader Header of the batch the transaction was included in.\n * @param _inclusionProof Inclusion proof for the provided transaction chain element.\n * @return True if the transaction exists in the CTC, false if not.\n */\n function verifyTransaction(\n Lib_OVMCodec.Transaction memory _transaction,\n Lib_OVMCodec.TransactionChainElement memory _txChainElement,\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _inclusionProof\n )\n external\n view\n returns (\n bool\n );\n}\n" + }, + "contracts/optimistic-ethereum/iOVM/verification/iOVM_BondManager.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\ninterface ERC20 {\n function transfer(address, uint256) external returns (bool);\n function transferFrom(address, address, uint256) external returns (bool);\n}\n\n/// All the errors which may be encountered on the bond manager\nlibrary Errors {\n string constant ERC20_ERR = \"BondManager: Could not post bond\";\n string constant ALREADY_FINALIZED = \"BondManager: Fraud proof for this pre-state root has already been finalized\";\n string constant SLASHED = \"BondManager: Cannot finalize withdrawal, you probably got slashed\";\n string constant WRONG_STATE = \"BondManager: Wrong bond state for proposer\";\n string constant CANNOT_CLAIM = \"BondManager: Cannot claim yet. Dispute must be finalized first\";\n\n string constant WITHDRAWAL_PENDING = \"BondManager: Withdrawal already pending\";\n string constant TOO_EARLY = \"BondManager: Too early to finalize your withdrawal\";\n\n string constant ONLY_TRANSITIONER = \"BondManager: Only the transitioner for this pre-state root may call this function\";\n string constant ONLY_FRAUD_VERIFIER = \"BondManager: Only the fraud verifier may call this function\";\n string constant ONLY_STATE_COMMITMENT_CHAIN = \"BondManager: Only the state commitment chain may call this function\";\n string constant WAIT_FOR_DISPUTES = \"BondManager: Wait for other potential disputes\";\n}\n\n/**\n * @title iOVM_BondManager\n */\ninterface iOVM_BondManager {\n\n /*******************\n * Data Structures *\n *******************/\n\n /// The lifecycle of a proposer's bond\n enum State {\n // Before depositing or after getting slashed, a user is uncollateralized\n NOT_COLLATERALIZED,\n // After depositing, a user is collateralized\n COLLATERALIZED,\n // After a user has initiated a withdrawal\n WITHDRAWING\n }\n\n /// A bond posted by a proposer\n struct Bond {\n // The user's state\n State state;\n // The timestamp at which a proposer issued their withdrawal request\n uint32 withdrawalTimestamp;\n // The time when the first disputed was initiated for this bond\n uint256 firstDisputeAt;\n // The earliest observed state root for this bond which has had fraud\n bytes32 earliestDisputedStateRoot;\n // The state root's timestamp\n uint256 earliestTimestamp;\n }\n\n // Per pre-state root, store the number of state provisions that were made\n // and how many of these calls were made by each user. Payouts will then be\n // claimed by users proportionally for that dispute.\n struct Rewards {\n // Flag to check if rewards for a fraud proof are claimable\n bool canClaim;\n // Total number of `recordGasSpent` calls made\n uint256 total;\n // The gas spent by each user to provide witness data. The sum of all\n // values inside this map MUST be equal to the value of `total`\n mapping(address => uint256) gasSpent;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n function recordGasSpent(\n bytes32 _preStateRoot,\n bytes32 _txHash,\n address _who,\n uint256 _gasSpent\n ) external;\n\n function finalize(\n bytes32 _preStateRoot,\n address _publisher,\n uint256 _timestamp\n ) external;\n\n function deposit() external;\n\n function startWithdrawal() external;\n\n function finalizeWithdrawal() external;\n\n function claim(\n address _who\n ) external;\n\n function isCollateralized(\n address _who\n ) external view returns (bool);\n\n function getGasSpent(\n bytes32 _preStateRoot,\n address _who\n ) external view returns (uint256);\n}\n" + }, + "contracts/optimistic-ethereum/iOVM/chain/iOVM_ChainStorageContainer.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/**\n * @title iOVM_ChainStorageContainer\n */\ninterface iOVM_ChainStorageContainer {\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\n * 27 bytes to store arbitrary data.\n * @param _globalMetadata New global metadata to set.\n */\n function setGlobalMetadata(\n bytes27 _globalMetadata\n )\n external;\n\n /**\n * Retrieves the container's global metadata field.\n * @return Container global metadata field.\n */\n function getGlobalMetadata()\n external\n view\n returns (\n bytes27\n );\n\n /**\n * Retrieves the number of objects stored in the container.\n * @return Number of objects in the container.\n */\n function length()\n external\n view\n returns (\n uint256\n );\n\n /**\n * Pushes an object into the container.\n * @param _object A 32 byte value to insert into the container.\n */\n function push(\n bytes32 _object\n )\n external;\n\n /**\n * Pushes an object into the container. Function allows setting the global metadata since\n * we'll need to touch the \"length\" storage slot anyway, which also contains the global\n * metadata (it's an optimization).\n * @param _object A 32 byte value to insert into the container.\n * @param _globalMetadata New global metadata for the container.\n */\n function push(\n bytes32 _object,\n bytes27 _globalMetadata\n )\n external;\n\n /**\n * Retrieves an object from the container.\n * @param _index Index of the particular object to access.\n * @return 32 byte object value.\n */\n function get(\n uint256 _index\n )\n external\n view\n returns (\n bytes32\n );\n\n /**\n * Removes all objects after and including a given index.\n * @param _index Object index to delete from.\n */\n function deleteElementsAfterInclusive(\n uint256 _index\n )\n external;\n\n /**\n * Removes all objects after and including a given index. Also allows setting the global\n * metadata field.\n * @param _index Object index to delete from.\n * @param _globalMetadata New global metadata for the container.\n */\n function deleteElementsAfterInclusive(\n uint256 _index,\n bytes27 _globalMetadata\n )\n external;\n\n /**\n * Marks an index as overwritable, meaing the underlying buffer can start to write values over\n * any objects before and including the given index.\n */\n function setNextOverwritableIndex(\n uint256 _index\n )\n external;\n}\n" + }, + "contracts/optimistic-ethereum/iOVM/verification/iOVM_StateTransitioner.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/**\n * @title iOVM_StateTransitioner\n */\ninterface iOVM_StateTransitioner {\n\n /**********\n * Events *\n **********/\n\n event AccountCommitted(\n address _address\n );\n\n event ContractStorageCommitted(\n address _address,\n bytes32 _key\n );\n\n\n /**********************************\n * Public Functions: State Access *\n **********************************/\n\n function getPreStateRoot() external view returns (bytes32 _preStateRoot);\n function getPostStateRoot() external view returns (bytes32 _postStateRoot);\n function isComplete() external view returns (bool _complete);\n\n\n /***********************************\n * Public Functions: Pre-Execution *\n ***********************************/\n\n function proveContractState(\n address _ovmContractAddress,\n address _ethContractAddress,\n bytes calldata _stateTrieWitness\n ) external;\n\n function proveStorageSlot(\n address _ovmContractAddress,\n bytes32 _key,\n bytes calldata _storageTrieWitness\n ) external;\n\n\n /*******************************\n * Public Functions: Execution *\n *******************************/\n\n function applyTransaction(\n Lib_OVMCodec.Transaction calldata _transaction\n ) external;\n\n\n /************************************\n * Public Functions: Post-Execution *\n ************************************/\n\n function commitContractState(\n address _ovmContractAddress,\n bytes calldata _stateTrieWitness\n ) external;\n\n function commitStorageSlot(\n address _ovmContractAddress,\n bytes32 _key,\n bytes calldata _storageTrieWitness\n ) external;\n\n\n /**********************************\n * Public Functions: Finalization *\n **********************************/\n\n function completeTransition() external;\n}\n" + }, + "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Library Imports */\nimport { Lib_RingBuffer } from \"../../libraries/utils/Lib_RingBuffer.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/* Interface Imports */\nimport { iOVM_ChainStorageContainer } from \"../../iOVM/chain/iOVM_ChainStorageContainer.sol\";\n\n/**\n * @title OVM_ChainStorageContainer\n * @dev The Chain Storage Container provides its owner contract with read, write and delete functionality.\n * This provides gas efficiency gains by enabling it to overwrite storage slots which can no longer be used\n * in a fraud proof due to the fraud window having passed, and the associated chain state or\n * transactions being finalized.\n * Three distinct Chain Storage Containers will be deployed on Layer 1:\n * 1. Stores transaction batches for the Canonical Transaction Chain\n * 2. Stores queued transactions for the Canonical Transaction Chain\n * 3. Stores chain state batches for the State Commitment Chain\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract OVM_ChainStorageContainer is iOVM_ChainStorageContainer, Lib_AddressResolver {\n\n /*************\n * Libraries *\n *************/\n\n using Lib_RingBuffer for Lib_RingBuffer.RingBuffer;\n\n\n /*************\n * Variables *\n *************/\n\n string public owner;\n Lib_RingBuffer.RingBuffer internal buffer;\n\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n * @param _owner Name of the contract that owns this container (will be resolved later).\n */\n constructor(\n address _libAddressManager,\n string memory _owner\n )\n Lib_AddressResolver(_libAddressManager)\n {\n owner = _owner;\n }\n\n\n /**********************\n * Function Modifiers *\n **********************/\n\n modifier onlyOwner() {\n require(\n msg.sender == resolve(owner),\n \"OVM_ChainStorageContainer: Function can only be called by the owner.\"\n );\n _;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @inheritdoc iOVM_ChainStorageContainer\n */\n function setGlobalMetadata(\n bytes27 _globalMetadata\n )\n override\n public\n onlyOwner\n {\n return buffer.setExtraData(_globalMetadata);\n }\n\n /**\n * @inheritdoc iOVM_ChainStorageContainer\n */\n function getGlobalMetadata()\n override\n public\n view\n returns (\n bytes27\n )\n {\n return buffer.getExtraData();\n }\n\n /**\n * @inheritdoc iOVM_ChainStorageContainer\n */\n function length()\n override\n public\n view\n returns (\n uint256\n )\n {\n return uint256(buffer.getLength());\n }\n\n /**\n * @inheritdoc iOVM_ChainStorageContainer\n */\n function push(\n bytes32 _object\n )\n override\n public\n onlyOwner\n {\n buffer.push(_object);\n }\n\n /**\n * @inheritdoc iOVM_ChainStorageContainer\n */\n function push(\n bytes32 _object,\n bytes27 _globalMetadata\n )\n override\n public\n onlyOwner\n {\n buffer.push(_object, _globalMetadata);\n }\n\n /**\n * @inheritdoc iOVM_ChainStorageContainer\n */\n function get(\n uint256 _index\n )\n override\n public\n view\n returns (\n bytes32\n )\n {\n return buffer.get(uint40(_index));\n }\n\n /**\n * @inheritdoc iOVM_ChainStorageContainer\n */\n function deleteElementsAfterInclusive(\n uint256 _index\n )\n override\n public\n onlyOwner\n {\n buffer.deleteElementsAfterInclusive(\n uint40(_index)\n );\n }\n\n /**\n * @inheritdoc iOVM_ChainStorageContainer\n */\n function deleteElementsAfterInclusive(\n uint256 _index,\n bytes27 _globalMetadata\n )\n override\n public\n onlyOwner\n {\n buffer.deleteElementsAfterInclusive(\n uint40(_index),\n _globalMetadata\n );\n }\n\n /**\n * @inheritdoc iOVM_ChainStorageContainer\n */\n function setNextOverwritableIndex(\n uint256 _index\n )\n override\n public\n onlyOwner\n {\n buffer.nextOverwritableIndex = _index;\n }\n}\n" + }, + "contracts/optimistic-ethereum/libraries/utils/Lib_RingBuffer.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\nlibrary Lib_RingBuffer {\n using Lib_RingBuffer for RingBuffer;\n\n /***********\n * Structs *\n ***********/\n\n struct Buffer {\n uint256 length;\n mapping (uint256 => bytes32) buf;\n }\n\n struct RingBuffer {\n bytes32 contextA;\n bytes32 contextB;\n Buffer bufferA;\n Buffer bufferB;\n uint256 nextOverwritableIndex;\n }\n\n struct RingBufferContext {\n // contextA\n uint40 globalIndex;\n bytes27 extraData;\n\n // contextB\n uint64 currBufferIndex;\n uint40 prevResetIndex;\n uint40 currResetIndex;\n }\n\n\n /*************\n * Constants *\n *************/\n\n uint256 constant MIN_CAPACITY = 16;\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Pushes a single element to the buffer.\n * @param _self Buffer to access.\n * @param _value Value to push to the buffer.\n * @param _extraData Optional global extra data.\n */\n function push(\n RingBuffer storage _self,\n bytes32 _value,\n bytes27 _extraData\n )\n internal\n {\n RingBufferContext memory ctx = _self.getContext();\n Buffer storage currBuffer = _self.getBuffer(ctx.currBufferIndex);\n\n // Set a minimum capacity.\n if (currBuffer.length == 0) {\n currBuffer.length = MIN_CAPACITY;\n }\n\n // Check if we need to expand the buffer.\n if (ctx.globalIndex - ctx.currResetIndex >= currBuffer.length) {\n if (ctx.currResetIndex < _self.nextOverwritableIndex) {\n // We're going to overwrite the inactive buffer.\n // Bump the buffer index, reset the delete offset, and set our reset indices.\n ctx.currBufferIndex++;\n ctx.prevResetIndex = ctx.currResetIndex;\n ctx.currResetIndex = ctx.globalIndex;\n\n // Swap over to the next buffer.\n currBuffer = _self.getBuffer(ctx.currBufferIndex);\n } else {\n // We're not overwriting yet, double the length of the current buffer.\n currBuffer.length *= 2;\n }\n }\n\n // Index to write to is the difference of the global and reset indices.\n uint256 writeHead = ctx.globalIndex - ctx.currResetIndex;\n currBuffer.buf[writeHead] = _value;\n\n // Bump the global index and insert our extra data, then save the context.\n ctx.globalIndex++;\n ctx.extraData = _extraData;\n _self.setContext(ctx);\n }\n\n /**\n * Pushes a single element to the buffer.\n * @param _self Buffer to access.\n * @param _value Value to push to the buffer.\n */\n function push(\n RingBuffer storage _self,\n bytes32 _value\n )\n internal\n {\n RingBufferContext memory ctx = _self.getContext();\n\n _self.push(\n _value,\n ctx.extraData\n );\n }\n\n /**\n * Retrieves an element from the buffer.\n * @param _self Buffer to access.\n * @param _index Element index to retrieve.\n * @return Value of the element at the given index.\n */\n function get(\n RingBuffer storage _self,\n uint256 _index\n )\n internal\n view\n returns (\n bytes32\n )\n {\n RingBufferContext memory ctx = _self.getContext();\n\n require(\n _index < ctx.globalIndex,\n \"Index out of bounds.\"\n );\n\n Buffer storage currBuffer = _self.getBuffer(ctx.currBufferIndex);\n Buffer storage prevBuffer = _self.getBuffer(ctx.currBufferIndex + 1);\n\n if (_index >= ctx.currResetIndex) {\n // We're trying to load an element from the current buffer.\n // Relative index is just the difference from the reset index.\n uint256 relativeIndex = _index - ctx.currResetIndex;\n\n // Shouldn't happen but why not check.\n require(\n relativeIndex < currBuffer.length,\n \"Index out of bounds.\"\n );\n\n return currBuffer.buf[relativeIndex];\n } else {\n // We're trying to load an element from the previous buffer.\n // Relative index is the difference from the reset index in the other direction.\n uint256 relativeIndex = ctx.currResetIndex - _index;\n\n // Condition only fails in the case that we deleted and flipped buffers.\n require(\n ctx.currResetIndex > ctx.prevResetIndex,\n \"Index out of bounds.\"\n );\n\n // Make sure we're not trying to read beyond the array.\n require(\n relativeIndex <= prevBuffer.length,\n \"Index out of bounds.\"\n );\n\n return prevBuffer.buf[prevBuffer.length - relativeIndex];\n }\n }\n\n /**\n * Deletes all elements after (and including) a given index.\n * @param _self Buffer to access.\n * @param _index Index of the element to delete from (inclusive).\n * @param _extraData Optional global extra data.\n */\n function deleteElementsAfterInclusive(\n RingBuffer storage _self,\n uint40 _index,\n bytes27 _extraData\n )\n internal\n {\n RingBufferContext memory ctx = _self.getContext();\n\n require(\n _index < ctx.globalIndex && _index >= ctx.prevResetIndex,\n \"Index out of bounds.\"\n );\n\n if (_index < ctx.currResetIndex) {\n // We're switching back to the previous buffer.\n // Reduce the buffer index, set the current reset index back to match the previous one.\n // We use the equality of these two values to prevent reading beyond this buffer.\n ctx.currBufferIndex--;\n ctx.currResetIndex = ctx.prevResetIndex;\n }\n\n // Set our global index and extra data, save the context.\n ctx.globalIndex = _index;\n ctx.extraData = _extraData;\n _self.setContext(ctx);\n }\n\n /**\n * Deletes all elements after (and including) a given index.\n * @param _self Buffer to access.\n * @param _index Index of the element to delete from (inclusive).\n */\n function deleteElementsAfterInclusive(\n RingBuffer storage _self,\n uint40 _index\n )\n internal\n {\n RingBufferContext memory ctx = _self.getContext();\n _self.deleteElementsAfterInclusive(\n _index,\n ctx.extraData\n );\n }\n\n /**\n * Retrieves the current global index.\n * @param _self Buffer to access.\n * @return Current global index.\n */\n function getLength(\n RingBuffer storage _self\n )\n internal\n view\n returns (\n uint40\n )\n {\n RingBufferContext memory ctx = _self.getContext();\n return ctx.globalIndex;\n }\n\n /**\n * Changes current global extra data.\n * @param _self Buffer to access.\n * @param _extraData New global extra data.\n */\n function setExtraData(\n RingBuffer storage _self,\n bytes27 _extraData\n )\n internal\n {\n RingBufferContext memory ctx = _self.getContext();\n ctx.extraData = _extraData;\n _self.setContext(ctx);\n }\n\n /**\n * Retrieves the current global extra data.\n * @param _self Buffer to access.\n * @return Current global extra data.\n */\n function getExtraData(\n RingBuffer storage _self\n )\n internal\n view\n returns (\n bytes27\n )\n {\n RingBufferContext memory ctx = _self.getContext();\n return ctx.extraData;\n }\n\n /**\n * Sets the current ring buffer context.\n * @param _self Buffer to access.\n * @param _ctx Current ring buffer context.\n */\n function setContext(\n RingBuffer storage _self,\n RingBufferContext memory _ctx\n )\n internal\n {\n bytes32 contextA;\n bytes32 contextB;\n\n uint40 globalIndex = _ctx.globalIndex;\n bytes27 extraData = _ctx.extraData;\n assembly {\n contextA := globalIndex\n contextA := or(contextA, extraData)\n }\n\n uint64 currBufferIndex = _ctx.currBufferIndex;\n uint40 prevResetIndex = _ctx.prevResetIndex;\n uint40 currResetIndex = _ctx.currResetIndex;\n assembly {\n contextB := currBufferIndex\n contextB := or(contextB, shl(64, prevResetIndex))\n contextB := or(contextB, shl(104, currResetIndex))\n }\n\n if (_self.contextA != contextA) {\n _self.contextA = contextA;\n }\n\n if (_self.contextB != contextB) {\n _self.contextB = contextB;\n }\n }\n\n /**\n * Retrieves the current ring buffer context.\n * @param _self Buffer to access.\n * @return Current ring buffer context.\n */\n function getContext(\n RingBuffer storage _self\n )\n internal\n view\n returns (\n RingBufferContext memory\n )\n {\n bytes32 contextA = _self.contextA;\n bytes32 contextB = _self.contextB;\n\n uint40 globalIndex;\n bytes27 extraData;\n assembly {\n globalIndex := and(contextA, 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF)\n extraData := and(contextA, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000)\n }\n\n uint64 currBufferIndex;\n uint40 prevResetIndex;\n uint40 currResetIndex;\n assembly {\n currBufferIndex := and(contextB, 0x000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF)\n prevResetIndex := shr(64, and(contextB, 0x00000000000000000000000000000000000000FFFFFFFFFF0000000000000000))\n currResetIndex := shr(104, and(contextB, 0x0000000000000000000000000000FFFFFFFFFF00000000000000000000000000))\n }\n\n return RingBufferContext({\n globalIndex: globalIndex,\n extraData: extraData,\n currBufferIndex: currBufferIndex,\n prevResetIndex: prevResetIndex,\n currResetIndex: currResetIndex\n });\n }\n\n /**\n * Retrieves the a buffer from the ring buffer by index.\n * @param _self Buffer to access.\n * @param _which Index of the sub buffer to access.\n * @return Sub buffer for the index.\n */\n function getBuffer(\n RingBuffer storage _self,\n uint256 _which\n )\n internal\n view\n returns (\n Buffer storage\n )\n {\n return _which % 2 == 0 ? _self.bufferA : _self.bufferB;\n }\n}\n" + }, + "contracts/optimistic-ethereum/OVM/verification/OVM_StateTransitionerFactory.sol": { + "content": "// SPDX-License-Identifier: MIT\n// @unsupported: ovm\npragma solidity >0.5.0 <0.8.0;\n\n/* Library Imports */\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/* Interface Imports */\nimport { iOVM_StateTransitioner } from \"../../iOVM/verification/iOVM_StateTransitioner.sol\";\nimport { iOVM_StateTransitionerFactory } from \"../../iOVM/verification/iOVM_StateTransitionerFactory.sol\";\nimport { iOVM_FraudVerifier } from \"../../iOVM/verification/iOVM_FraudVerifier.sol\";\n\n/* Contract Imports */\nimport { OVM_StateTransitioner } from \"./OVM_StateTransitioner.sol\";\n\n/**\n * @title OVM_StateTransitionerFactory\n * @dev The State Transitioner Factory is used by the Fraud Verifier to create a new State\n * Transitioner during the initialization of a fraud proof.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract OVM_StateTransitionerFactory is iOVM_StateTransitionerFactory, Lib_AddressResolver {\n\n /***************\n * Constructor *\n ***************/\n\n constructor(\n address _libAddressManager\n )\n Lib_AddressResolver(_libAddressManager)\n {}\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Creates a new OVM_StateTransitioner\n * @param _libAddressManager Address of the Address Manager.\n * @param _stateTransitionIndex Index of the state transition being verified.\n * @param _preStateRoot State root before the transition was executed.\n * @param _transactionHash Hash of the executed transaction.\n * @return New OVM_StateTransitioner instance.\n */\n function create(\n address _libAddressManager,\n uint256 _stateTransitionIndex,\n bytes32 _preStateRoot,\n bytes32 _transactionHash\n )\n override\n public\n returns (\n iOVM_StateTransitioner\n )\n {\n require(\n msg.sender == resolve(\"OVM_FraudVerifier\"),\n \"Create can only be done by the OVM_FraudVerifier.\"\n );\n\n return new OVM_StateTransitioner(\n _libAddressManager,\n _stateTransitionIndex,\n _preStateRoot,\n _transactionHash\n );\n }\n}\n" + }, + "contracts/optimistic-ethereum/iOVM/verification/iOVM_StateTransitionerFactory.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Contract Imports */\nimport { iOVM_StateTransitioner } from \"./iOVM_StateTransitioner.sol\";\n\n/**\n * @title iOVM_StateTransitionerFactory\n */\ninterface iOVM_StateTransitionerFactory {\n\n /***************************************\n * Public Functions: Contract Creation *\n ***************************************/\n\n function create(\n address _proxyManager,\n uint256 _stateTransitionIndex,\n bytes32 _preStateRoot,\n bytes32 _transactionHash\n )\n external\n returns (\n iOVM_StateTransitioner _ovmStateTransitioner\n );\n}\n" + }, + "contracts/optimistic-ethereum/OVM/verification/OVM_StateTransitioner.sol": { + "content": "// SPDX-License-Identifier: MIT\n// @unsupported: ovm\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\nimport { Lib_EthUtils } from \"../../libraries/utils/Lib_EthUtils.sol\";\nimport { Lib_Bytes32Utils } from \"../../libraries/utils/Lib_Bytes32Utils.sol\";\nimport { Lib_BytesUtils } from \"../../libraries/utils/Lib_BytesUtils.sol\";\nimport { Lib_SecureMerkleTrie } from \"../../libraries/trie/Lib_SecureMerkleTrie.sol\";\nimport { Lib_RLPWriter } from \"../../libraries/rlp/Lib_RLPWriter.sol\";\nimport { Lib_RLPReader } from \"../../libraries/rlp/Lib_RLPReader.sol\";\n\n/* Interface Imports */\nimport { iOVM_StateTransitioner } from \"../../iOVM/verification/iOVM_StateTransitioner.sol\";\nimport { iOVM_BondManager } from \"../../iOVM/verification/iOVM_BondManager.sol\";\nimport { iOVM_ExecutionManager } from \"../../iOVM/execution/iOVM_ExecutionManager.sol\";\nimport { iOVM_StateManager } from \"../../iOVM/execution/iOVM_StateManager.sol\";\nimport { iOVM_StateManagerFactory } from \"../../iOVM/execution/iOVM_StateManagerFactory.sol\";\n\n/* Contract Imports */\nimport { Abs_FraudContributor } from \"./Abs_FraudContributor.sol\";\n\n/**\n * @title OVM_StateTransitioner\n * @dev The State Transitioner coordinates the execution of a state transition during the evaluation of a\n * fraud proof. It feeds verified input to the Execution Manager's run(), and controls a State Manager (which is\n * uniquely created for each fraud proof).\n * Once a fraud proof has been initialized, this contract is provided with the pre-state root and verifies\n * that the OVM storage slots committed to the State Mangager are contained in that state\n * This contract controls the State Manager and Execution Manager, and uses them to calculate the\n * post-state root by applying the transaction. The Fraud Verifier can then check for fraud by comparing\n * the calculated post-state root with the proposed post-state root.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract OVM_StateTransitioner is Lib_AddressResolver, Abs_FraudContributor, iOVM_StateTransitioner {\n\n /*******************\n * Data Structures *\n *******************/\n\n enum TransitionPhase {\n PRE_EXECUTION,\n POST_EXECUTION,\n COMPLETE\n }\n\n\n /*******************************************\n * Contract Variables: Contract References *\n *******************************************/\n\n iOVM_StateManager public ovmStateManager;\n\n\n /*******************************************\n * Contract Variables: Internal Accounting *\n *******************************************/\n\n bytes32 internal preStateRoot;\n bytes32 internal postStateRoot;\n TransitionPhase public phase;\n uint256 internal stateTransitionIndex;\n bytes32 internal transactionHash;\n\n\n /*************\n * Constants *\n *************/\n\n bytes32 internal constant EMPTY_ACCOUNT_CODE_HASH = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;\n bytes32 internal constant EMPTY_ACCOUNT_STORAGE_ROOT = 0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421;\n\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n * @param _stateTransitionIndex Index of the state transition being verified.\n * @param _preStateRoot State root before the transition was executed.\n * @param _transactionHash Hash of the executed transaction.\n */\n constructor(\n address _libAddressManager,\n uint256 _stateTransitionIndex,\n bytes32 _preStateRoot,\n bytes32 _transactionHash\n )\n Lib_AddressResolver(_libAddressManager)\n {\n stateTransitionIndex = _stateTransitionIndex;\n preStateRoot = _preStateRoot;\n postStateRoot = _preStateRoot;\n transactionHash = _transactionHash;\n\n ovmStateManager = iOVM_StateManagerFactory(resolve(\"OVM_StateManagerFactory\")).create(address(this));\n }\n\n\n /**********************\n * Function Modifiers *\n **********************/\n\n /**\n * Checks that a function is only run during a specific phase.\n * @param _phase Phase the function must run within.\n */\n modifier onlyDuringPhase(\n TransitionPhase _phase\n ) {\n require(\n phase == _phase,\n \"Function must be called during the correct phase.\"\n );\n _;\n }\n\n\n /**********************************\n * Public Functions: State Access *\n **********************************/\n\n /**\n * Retrieves the state root before execution.\n * @return _preStateRoot State root before execution.\n */\n function getPreStateRoot()\n override\n external\n view\n returns (\n bytes32 _preStateRoot\n )\n {\n return preStateRoot;\n }\n\n /**\n * Retrieves the state root after execution.\n * @return _postStateRoot State root after execution.\n */\n function getPostStateRoot()\n override\n external\n view\n returns (\n bytes32 _postStateRoot\n )\n {\n return postStateRoot;\n }\n\n /**\n * Checks whether the transitioner is complete.\n * @return _complete Whether or not the transition process is finished.\n */\n function isComplete()\n override\n external\n view\n returns (\n bool _complete\n )\n {\n return phase == TransitionPhase.COMPLETE;\n }\n\n\n /***********************************\n * Public Functions: Pre-Execution *\n ***********************************/\n\n /**\n * Allows a user to prove the initial state of a contract.\n * @param _ovmContractAddress Address of the contract on the OVM.\n * @param _ethContractAddress Address of the corresponding contract on L1.\n * @param _stateTrieWitness Proof of the account state.\n */\n function proveContractState(\n address _ovmContractAddress,\n address _ethContractAddress,\n bytes memory _stateTrieWitness\n )\n override\n external\n onlyDuringPhase(TransitionPhase.PRE_EXECUTION)\n contributesToFraudProof(preStateRoot, transactionHash)\n {\n // Exit quickly to avoid unnecessary work.\n require(\n (\n ovmStateManager.hasAccount(_ovmContractAddress) == false\n && ovmStateManager.hasEmptyAccount(_ovmContractAddress) == false\n ),\n \"Account state has already been proven.\"\n );\n\n // Function will fail if the proof is not a valid inclusion or exclusion proof.\n (\n bool exists,\n bytes memory encodedAccount\n ) = Lib_SecureMerkleTrie.get(\n abi.encodePacked(_ovmContractAddress),\n _stateTrieWitness,\n preStateRoot\n );\n\n if (exists == true) {\n // Account exists, this was an inclusion proof.\n Lib_OVMCodec.EVMAccount memory account = Lib_OVMCodec.decodeEVMAccount(\n encodedAccount\n );\n\n address ethContractAddress = _ethContractAddress;\n if (account.codeHash == EMPTY_ACCOUNT_CODE_HASH) {\n // Use a known empty contract to prevent an attack in which a user provides a\n // contract address here and then later deploys code to it.\n ethContractAddress = 0x0000000000000000000000000000000000000000;\n } else {\n // Otherwise, make sure that the code at the provided eth address matches the hash\n // of the code stored on L2.\n require(\n Lib_EthUtils.getCodeHash(ethContractAddress) == account.codeHash,\n \"OVM_StateTransitioner: Provided L1 contract code hash does not match L2 contract code hash.\"\n );\n }\n\n ovmStateManager.putAccount(\n _ovmContractAddress,\n Lib_OVMCodec.Account({\n nonce: account.nonce,\n balance: account.balance,\n storageRoot: account.storageRoot,\n codeHash: account.codeHash,\n ethAddress: ethContractAddress,\n isFresh: false\n })\n );\n } else {\n // Account does not exist, this was an exclusion proof.\n ovmStateManager.putEmptyAccount(_ovmContractAddress);\n }\n }\n\n /**\n * Allows a user to prove the initial state of a contract storage slot.\n * @param _ovmContractAddress Address of the contract on the OVM.\n * @param _key Claimed account slot key.\n * @param _storageTrieWitness Proof of the storage slot.\n */\n function proveStorageSlot(\n address _ovmContractAddress,\n bytes32 _key,\n bytes memory _storageTrieWitness\n )\n override\n external\n onlyDuringPhase(TransitionPhase.PRE_EXECUTION)\n contributesToFraudProof(preStateRoot, transactionHash)\n {\n // Exit quickly to avoid unnecessary work.\n require(\n ovmStateManager.hasContractStorage(_ovmContractAddress, _key) == false,\n \"Storage slot has already been proven.\"\n );\n\n require(\n ovmStateManager.hasAccount(_ovmContractAddress) == true,\n \"Contract must be verified before proving a storage slot.\"\n );\n\n bytes32 storageRoot = ovmStateManager.getAccountStorageRoot(_ovmContractAddress);\n bytes32 value;\n\n if (storageRoot == EMPTY_ACCOUNT_STORAGE_ROOT) {\n // Storage trie was empty, so the user is always allowed to insert zero-byte values.\n value = bytes32(0);\n } else {\n // Function will fail if the proof is not a valid inclusion or exclusion proof.\n (\n bool exists,\n bytes memory encodedValue\n ) = Lib_SecureMerkleTrie.get(\n abi.encodePacked(_key),\n _storageTrieWitness,\n storageRoot\n );\n\n if (exists == true) {\n // Inclusion proof.\n // Stored values are RLP encoded, with leading zeros removed.\n value = Lib_BytesUtils.toBytes32PadLeft(\n Lib_RLPReader.readBytes(encodedValue)\n );\n } else {\n // Exclusion proof, can only be zero bytes.\n value = bytes32(0);\n }\n }\n\n ovmStateManager.putContractStorage(\n _ovmContractAddress,\n _key,\n value\n );\n }\n\n\n /*******************************\n * Public Functions: Execution *\n *******************************/\n\n /**\n * Executes the state transition.\n * @param _transaction OVM transaction to execute.\n */\n function applyTransaction(\n Lib_OVMCodec.Transaction memory _transaction\n )\n override\n external\n onlyDuringPhase(TransitionPhase.PRE_EXECUTION)\n contributesToFraudProof(preStateRoot, transactionHash)\n {\n require(\n Lib_OVMCodec.hashTransaction(_transaction) == transactionHash,\n \"Invalid transaction provided.\"\n );\n\n // We require gas to complete the logic here in run() before/after execution,\n // But must ensure the full _tx.gasLimit can be given to the ovmCALL (determinism)\n // This includes 1/64 of the gas getting lost because of EIP-150 (lost twice--first\n // going into EM, then going into the code contract).\n require(\n gasleft() >= 100000 + _transaction.gasLimit * 1032 / 1000, // 1032/1000 = 1.032 = (64/63)^2 rounded up\n \"Not enough gas to execute transaction deterministically.\"\n );\n\n iOVM_ExecutionManager ovmExecutionManager = iOVM_ExecutionManager(resolve(\"OVM_ExecutionManager\"));\n\n // We call `setExecutionManager` right before `run` (and not earlier) just in case the\n // OVM_ExecutionManager address was updated between the time when this contract was created\n // and when `applyTransaction` was called.\n ovmStateManager.setExecutionManager(address(ovmExecutionManager));\n\n // `run` always succeeds *unless* the user hasn't provided enough gas to `applyTransaction`\n // or an INVALID_STATE_ACCESS flag was triggered. Either way, we won't get beyond this line\n // if that's the case.\n ovmExecutionManager.run(_transaction, address(ovmStateManager));\n\n // Prevent the Execution Manager from calling this SM again.\n ovmStateManager.setExecutionManager(address(0));\n phase = TransitionPhase.POST_EXECUTION;\n }\n\n\n /************************************\n * Public Functions: Post-Execution *\n ************************************/\n\n /**\n * Allows a user to commit the final state of a contract.\n * @param _ovmContractAddress Address of the contract on the OVM.\n * @param _stateTrieWitness Proof of the account state.\n */\n function commitContractState(\n address _ovmContractAddress,\n bytes memory _stateTrieWitness\n )\n override\n external\n onlyDuringPhase(TransitionPhase.POST_EXECUTION)\n contributesToFraudProof(preStateRoot, transactionHash)\n {\n require(\n ovmStateManager.getTotalUncommittedContractStorage() == 0,\n \"All storage must be committed before committing account states.\"\n );\n\n require (\n ovmStateManager.commitAccount(_ovmContractAddress) == true,\n \"Account state wasn't changed or has already been committed.\"\n );\n\n Lib_OVMCodec.Account memory account = ovmStateManager.getAccount(_ovmContractAddress);\n\n postStateRoot = Lib_SecureMerkleTrie.update(\n abi.encodePacked(_ovmContractAddress),\n Lib_OVMCodec.encodeEVMAccount(\n Lib_OVMCodec.toEVMAccount(account)\n ),\n _stateTrieWitness,\n postStateRoot\n );\n\n // Emit an event to help clients figure out the proof ordering.\n emit AccountCommitted(\n _ovmContractAddress\n );\n }\n\n /**\n * Allows a user to commit the final state of a contract storage slot.\n * @param _ovmContractAddress Address of the contract on the OVM.\n * @param _key Claimed account slot key.\n * @param _storageTrieWitness Proof of the storage slot.\n */\n function commitStorageSlot(\n address _ovmContractAddress,\n bytes32 _key,\n bytes memory _storageTrieWitness\n )\n override\n external\n onlyDuringPhase(TransitionPhase.POST_EXECUTION)\n contributesToFraudProof(preStateRoot, transactionHash)\n {\n require(\n ovmStateManager.commitContractStorage(_ovmContractAddress, _key) == true,\n \"Storage slot value wasn't changed or has already been committed.\"\n );\n\n Lib_OVMCodec.Account memory account = ovmStateManager.getAccount(_ovmContractAddress);\n bytes32 value = ovmStateManager.getContractStorage(_ovmContractAddress, _key);\n\n account.storageRoot = Lib_SecureMerkleTrie.update(\n abi.encodePacked(_key),\n Lib_RLPWriter.writeBytes(\n Lib_Bytes32Utils.removeLeadingZeros(value)\n ),\n _storageTrieWitness,\n account.storageRoot\n );\n\n ovmStateManager.putAccount(_ovmContractAddress, account);\n\n // Emit an event to help clients figure out the proof ordering.\n emit ContractStorageCommitted(\n _ovmContractAddress,\n _key\n );\n }\n\n\n /**********************************\n * Public Functions: Finalization *\n **********************************/\n\n /**\n * Finalizes the transition process.\n */\n function completeTransition()\n override\n external\n onlyDuringPhase(TransitionPhase.POST_EXECUTION)\n {\n require(\n ovmStateManager.getTotalUncommittedAccounts() == 0,\n \"All accounts must be committed before completing a transition.\"\n );\n\n require(\n ovmStateManager.getTotalUncommittedContractStorage() == 0,\n \"All storage must be committed before completing a transition.\"\n );\n\n phase = TransitionPhase.COMPLETE;\n }\n}\n" + }, + "contracts/optimistic-ethereum/libraries/utils/Lib_EthUtils.sol": { + "content": "// SPDX-License-Identifier: MIT\n// @unsupported: ovm\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_RLPWriter } from \"../rlp/Lib_RLPWriter.sol\";\nimport { Lib_Bytes32Utils } from \"./Lib_Bytes32Utils.sol\";\n\n/**\n * @title Lib_EthUtils\n */\nlibrary Lib_EthUtils {\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Gets the code for a given address.\n * @param _address Address to get code for.\n * @param _offset Offset to start reading from.\n * @param _length Number of bytes to read.\n * @return Code read from the contract.\n */\n function getCode(\n address _address,\n uint256 _offset,\n uint256 _length\n )\n internal\n view\n returns (\n bytes memory\n )\n {\n bytes memory code;\n assembly {\n code := mload(0x40)\n mstore(0x40, add(code, add(_length, 0x20)))\n mstore(code, _length)\n extcodecopy(_address, add(code, 0x20), _offset, _length)\n }\n\n return code;\n }\n\n /**\n * Gets the full code for a given address.\n * @param _address Address to get code for.\n * @return Full code of the contract.\n */\n function getCode(\n address _address\n )\n internal\n view\n returns (\n bytes memory\n )\n {\n return getCode(\n _address,\n 0,\n getCodeSize(_address)\n );\n }\n\n /**\n * Gets the size of a contract's code in bytes.\n * @param _address Address to get code size for.\n * @return Size of the contract's code in bytes.\n */\n function getCodeSize(\n address _address\n )\n internal\n view\n returns (\n uint256\n )\n {\n uint256 codeSize;\n assembly {\n codeSize := extcodesize(_address)\n }\n\n return codeSize;\n }\n\n /**\n * Gets the hash of a contract's code.\n * @param _address Address to get a code hash for.\n * @return Hash of the contract's code.\n */\n function getCodeHash(\n address _address\n )\n internal\n view\n returns (\n bytes32\n )\n {\n bytes32 codeHash;\n assembly {\n codeHash := extcodehash(_address)\n }\n\n return codeHash;\n }\n\n /**\n * Creates a contract with some given initialization code.\n * @param _code Contract initialization code.\n * @return Address of the created contract.\n */\n function createContract(\n bytes memory _code\n )\n internal\n returns (\n address\n )\n {\n address created;\n assembly {\n created := create(\n 0,\n add(_code, 0x20),\n mload(_code)\n )\n }\n\n return created;\n }\n\n /**\n * Computes the address that would be generated by CREATE.\n * @param _creator Address creating the contract.\n * @param _nonce Creator's nonce.\n * @return Address to be generated by CREATE.\n */\n function getAddressForCREATE(\n address _creator,\n uint256 _nonce\n )\n internal\n pure\n returns (\n address\n )\n {\n bytes[] memory encoded = new bytes[](2);\n encoded[0] = Lib_RLPWriter.writeAddress(_creator);\n encoded[1] = Lib_RLPWriter.writeUint(_nonce);\n\n bytes memory encodedList = Lib_RLPWriter.writeList(encoded);\n return Lib_Bytes32Utils.toAddress(keccak256(encodedList));\n }\n\n /**\n * Computes the address that would be generated by CREATE2.\n * @param _creator Address creating the contract.\n * @param _bytecode Bytecode of the contract to be created.\n * @param _salt 32 byte salt value mixed into the hash.\n * @return Address to be generated by CREATE2.\n */\n function getAddressForCREATE2(\n address _creator,\n bytes memory _bytecode,\n bytes32 _salt\n )\n internal\n pure\n returns (\n address\n )\n {\n bytes32 hashedData = keccak256(abi.encodePacked(\n byte(0xff),\n _creator,\n _salt,\n keccak256(_bytecode)\n ));\n\n return Lib_Bytes32Utils.toAddress(hashedData);\n }\n}\n" + }, + "contracts/optimistic-ethereum/libraries/trie/Lib_SecureMerkleTrie.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_MerkleTrie } from \"./Lib_MerkleTrie.sol\";\n\n/**\n * @title Lib_SecureMerkleTrie\n */\nlibrary Lib_SecureMerkleTrie {\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * @notice Verifies a proof that a given key/value pair is present in the\n * Merkle trie.\n * @param _key Key of the node to search for, as a hex string.\n * @param _value Value of the node to search for, as a hex string.\n * @param _proof Merkle trie inclusion proof for the desired node. Unlike\n * traditional Merkle trees, this proof is executed top-down and consists\n * of a list of RLP-encoded nodes that make a path down to the target node.\n * @param _root Known root of the Merkle trie. Used to verify that the\n * included proof is correctly constructed.\n * @return _verified `true` if the k/v pair exists in the trie, `false` otherwise.\n */\n function verifyInclusionProof(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n )\n internal\n pure\n returns (\n bool _verified\n )\n {\n bytes memory key = _getSecureKey(_key);\n return Lib_MerkleTrie.verifyInclusionProof(key, _value, _proof, _root);\n }\n\n /**\n * @notice Updates a Merkle trie and returns a new root hash.\n * @param _key Key of the node to update, as a hex string.\n * @param _value Value of the node to update, as a hex string.\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\n * target node. If the key exists, we can simply update the value.\n * Otherwise, we need to modify the trie to handle the new k/v pair.\n * @param _root Known root of the Merkle trie. Used to verify that the\n * included proof is correctly constructed.\n * @return _updatedRoot Root hash of the newly constructed trie.\n */\n function update(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n )\n internal\n pure\n returns (\n bytes32 _updatedRoot\n )\n {\n bytes memory key = _getSecureKey(_key);\n return Lib_MerkleTrie.update(key, _value, _proof, _root);\n }\n\n /**\n * @notice Retrieves the value associated with a given key.\n * @param _key Key to search for, as hex bytes.\n * @param _proof Merkle trie inclusion proof for the key.\n * @param _root Known root of the Merkle trie.\n * @return _exists Whether or not the key exists.\n * @return _value Value of the key if it exists.\n */\n function get(\n bytes memory _key,\n bytes memory _proof,\n bytes32 _root\n )\n internal\n pure\n returns (\n bool _exists,\n bytes memory _value\n )\n {\n bytes memory key = _getSecureKey(_key);\n return Lib_MerkleTrie.get(key, _proof, _root);\n }\n\n /**\n * Computes the root hash for a trie with a single node.\n * @param _key Key for the single node.\n * @param _value Value for the single node.\n * @return _updatedRoot Hash of the trie.\n */\n function getSingleNodeRootHash(\n bytes memory _key,\n bytes memory _value\n )\n internal\n pure\n returns (\n bytes32 _updatedRoot\n )\n {\n bytes memory key = _getSecureKey(_key);\n return Lib_MerkleTrie.getSingleNodeRootHash(key, _value);\n }\n\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * Computes the secure counterpart to a key.\n * @param _key Key to get a secure key from.\n * @return _secureKey Secure version of the key.\n */\n function _getSecureKey(\n bytes memory _key\n )\n private\n pure\n returns (\n bytes memory _secureKey\n )\n {\n return abi.encodePacked(keccak256(_key));\n }\n}" + }, + "contracts/optimistic-ethereum/iOVM/execution/iOVM_ExecutionManager.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\ninterface iOVM_ExecutionManager {\n /**********\n * Enums *\n *********/\n\n enum RevertFlag {\n OUT_OF_GAS,\n INTENTIONAL_REVERT,\n EXCEEDS_NUISANCE_GAS,\n INVALID_STATE_ACCESS,\n UNSAFE_BYTECODE,\n CREATE_COLLISION,\n STATIC_VIOLATION,\n CREATOR_NOT_ALLOWED\n }\n\n enum GasMetadataKey {\n CURRENT_EPOCH_START_TIMESTAMP,\n CUMULATIVE_SEQUENCER_QUEUE_GAS,\n CUMULATIVE_L1TOL2_QUEUE_GAS,\n PREV_EPOCH_SEQUENCER_QUEUE_GAS,\n PREV_EPOCH_L1TOL2_QUEUE_GAS\n }\n\n /***********\n * Structs *\n ***********/\n\n struct GasMeterConfig {\n uint256 minTransactionGasLimit;\n uint256 maxTransactionGasLimit;\n uint256 maxGasPerQueuePerEpoch;\n uint256 secondsPerEpoch;\n }\n\n struct GlobalContext {\n uint256 ovmCHAINID;\n }\n\n struct TransactionContext {\n Lib_OVMCodec.QueueOrigin ovmL1QUEUEORIGIN;\n uint256 ovmTIMESTAMP;\n uint256 ovmNUMBER;\n uint256 ovmGASLIMIT;\n uint256 ovmTXGASLIMIT;\n address ovmL1TXORIGIN;\n }\n\n struct TransactionRecord {\n uint256 ovmGasRefund;\n }\n\n struct MessageContext {\n address ovmCALLER;\n address ovmADDRESS;\n bool isStatic;\n }\n\n struct MessageRecord {\n uint256 nuisanceGasLeft;\n }\n\n\n /************************************\n * Transaction Execution Entrypoint *\n ************************************/\n\n function run(\n Lib_OVMCodec.Transaction calldata _transaction,\n address _txStateManager\n ) external returns (bytes memory);\n\n\n /*******************\n * Context Opcodes *\n *******************/\n\n function ovmCALLER() external view returns (address _caller);\n function ovmADDRESS() external view returns (address _address);\n function ovmTIMESTAMP() external view returns (uint256 _timestamp);\n function ovmNUMBER() external view returns (uint256 _number);\n function ovmGASLIMIT() external view returns (uint256 _gasLimit);\n function ovmCHAINID() external view returns (uint256 _chainId);\n\n\n /**********************\n * L2 Context Opcodes *\n **********************/\n\n function ovmL1QUEUEORIGIN() external view returns (Lib_OVMCodec.QueueOrigin _queueOrigin);\n function ovmL1TXORIGIN() external view returns (address _l1TxOrigin);\n\n\n /*******************\n * Halting Opcodes *\n *******************/\n\n function ovmREVERT(bytes memory _data) external;\n\n\n /*****************************\n * Contract Creation Opcodes *\n *****************************/\n\n function ovmCREATE(bytes memory _bytecode) external returns (address _contract, bytes memory _revertdata);\n function ovmCREATE2(bytes memory _bytecode, bytes32 _salt) external returns (address _contract, bytes memory _revertdata);\n\n\n /*******************************\n * Account Abstraction Opcodes *\n ******************************/\n\n function ovmGETNONCE() external returns (uint256 _nonce);\n function ovmINCREMENTNONCE() external;\n function ovmCREATEEOA(bytes32 _messageHash, uint8 _v, bytes32 _r, bytes32 _s) external;\n\n\n /****************************\n * Contract Calling Opcodes *\n ****************************/\n\n function ovmCALL(uint256 _gasLimit, address _address, bytes memory _calldata) external returns (bool _success, bytes memory _returndata);\n function ovmSTATICCALL(uint256 _gasLimit, address _address, bytes memory _calldata) external returns (bool _success, bytes memory _returndata);\n function ovmDELEGATECALL(uint256 _gasLimit, address _address, bytes memory _calldata) external returns (bool _success, bytes memory _returndata);\n\n\n /****************************\n * Contract Storage Opcodes *\n ****************************/\n\n function ovmSLOAD(bytes32 _key) external returns (bytes32 _value);\n function ovmSSTORE(bytes32 _key, bytes32 _value) external;\n\n\n /*************************\n * Contract Code Opcodes *\n *************************/\n\n function ovmEXTCODECOPY(address _contract, uint256 _offset, uint256 _length) external returns (bytes memory _code);\n function ovmEXTCODESIZE(address _contract) external returns (uint256 _size);\n function ovmEXTCODEHASH(address _contract) external returns (bytes32 _hash);\n\n\n /***************************************\n * Public Functions: Execution Context *\n ***************************************/\n\n function getMaxTransactionGasLimit() external view returns (uint _maxTransactionGasLimit);\n}\n" + }, + "contracts/optimistic-ethereum/iOVM/execution/iOVM_StateManager.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/**\n * @title iOVM_StateManager\n */\ninterface iOVM_StateManager {\n\n /*******************\n * Data Structures *\n *******************/\n\n enum ItemState {\n ITEM_UNTOUCHED,\n ITEM_LOADED,\n ITEM_CHANGED,\n ITEM_COMMITTED\n }\n\n /***************************\n * Public Functions: Misc *\n ***************************/\n\n function isAuthenticated(address _address) external view returns (bool);\n\n /***************************\n * Public Functions: Setup *\n ***************************/\n\n function owner() external view returns (address _owner);\n function ovmExecutionManager() external view returns (address _ovmExecutionManager);\n function setExecutionManager(address _ovmExecutionManager) external;\n\n\n /************************************\n * Public Functions: Account Access *\n ************************************/\n\n function putAccount(address _address, Lib_OVMCodec.Account memory _account) external;\n function putEmptyAccount(address _address) external;\n function getAccount(address _address) external view returns (Lib_OVMCodec.Account memory _account);\n function hasAccount(address _address) external view returns (bool _exists);\n function hasEmptyAccount(address _address) external view returns (bool _exists);\n function setAccountNonce(address _address, uint256 _nonce) external;\n function getAccountNonce(address _address) external view returns (uint256 _nonce);\n function getAccountEthAddress(address _address) external view returns (address _ethAddress);\n function getAccountStorageRoot(address _address) external view returns (bytes32 _storageRoot);\n function initPendingAccount(address _address) external;\n function commitPendingAccount(address _address, address _ethAddress, bytes32 _codeHash) external;\n function testAndSetAccountLoaded(address _address) external returns (bool _wasAccountAlreadyLoaded);\n function testAndSetAccountChanged(address _address) external returns (bool _wasAccountAlreadyChanged);\n function commitAccount(address _address) external returns (bool _wasAccountCommitted);\n function incrementTotalUncommittedAccounts() external;\n function getTotalUncommittedAccounts() external view returns (uint256 _total);\n function wasAccountChanged(address _address) external view returns (bool);\n function wasAccountCommitted(address _address) external view returns (bool);\n\n\n /************************************\n * Public Functions: Storage Access *\n ************************************/\n\n function putContractStorage(address _contract, bytes32 _key, bytes32 _value) external;\n function getContractStorage(address _contract, bytes32 _key) external view returns (bytes32 _value);\n function hasContractStorage(address _contract, bytes32 _key) external view returns (bool _exists);\n function testAndSetContractStorageLoaded(address _contract, bytes32 _key) external returns (bool _wasContractStorageAlreadyLoaded);\n function testAndSetContractStorageChanged(address _contract, bytes32 _key) external returns (bool _wasContractStorageAlreadyChanged);\n function commitContractStorage(address _contract, bytes32 _key) external returns (bool _wasContractStorageCommitted);\n function incrementTotalUncommittedContractStorage() external;\n function getTotalUncommittedContractStorage() external view returns (uint256 _total);\n function wasContractStorageChanged(address _contract, bytes32 _key) external view returns (bool);\n function wasContractStorageCommitted(address _contract, bytes32 _key) external view returns (bool);\n}\n" + }, + "contracts/optimistic-ethereum/iOVM/execution/iOVM_StateManagerFactory.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Contract Imports */\nimport { iOVM_StateManager } from \"./iOVM_StateManager.sol\";\n\n/**\n * @title iOVM_StateManagerFactory\n */\ninterface iOVM_StateManagerFactory {\n\n /***************************************\n * Public Functions: Contract Creation *\n ***************************************/\n\n function create(\n address _owner\n )\n external\n returns (\n iOVM_StateManager _ovmStateManager\n );\n}\n" + }, + "contracts/optimistic-ethereum/OVM/verification/Abs_FraudContributor.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\nimport { iOVM_BondManager } from \"../../iOVM/verification/iOVM_BondManager.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/// Minimal contract to be inherited by contracts consumed by users that provide\n/// data for fraud proofs\nabstract contract Abs_FraudContributor is Lib_AddressResolver {\n /// Decorate your functions with this modifier to store how much total gas was\n /// consumed by the sender, to reward users fairly\n modifier contributesToFraudProof(bytes32 preStateRoot, bytes32 txHash) {\n uint256 startGas = gasleft();\n _;\n uint256 gasSpent = startGas - gasleft();\n iOVM_BondManager(resolve('OVM_BondManager')).recordGasSpent(preStateRoot, txHash, msg.sender, gasSpent);\n }\n}\n" + }, + "contracts/optimistic-ethereum/libraries/trie/Lib_MerkleTrie.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Library Imports */\nimport { Lib_BytesUtils } from \"../utils/Lib_BytesUtils.sol\";\nimport { Lib_RLPReader } from \"../rlp/Lib_RLPReader.sol\";\nimport { Lib_RLPWriter } from \"../rlp/Lib_RLPWriter.sol\";\n\n/**\n * @title Lib_MerkleTrie\n */\nlibrary Lib_MerkleTrie {\n\n /*******************\n * Data Structures *\n *******************/\n\n enum NodeType {\n BranchNode,\n ExtensionNode,\n LeafNode\n }\n\n struct TrieNode {\n bytes encoded;\n Lib_RLPReader.RLPItem[] decoded;\n }\n\n\n /**********************\n * Contract Constants *\n **********************/\n\n // TREE_RADIX determines the number of elements per branch node.\n uint256 constant TREE_RADIX = 16;\n // Branch nodes have TREE_RADIX elements plus an additional `value` slot.\n uint256 constant BRANCH_NODE_LENGTH = TREE_RADIX + 1;\n // Leaf nodes and extension nodes always have two elements, a `path` and a `value`.\n uint256 constant LEAF_OR_EXTENSION_NODE_LENGTH = 2;\n\n // Prefixes are prepended to the `path` within a leaf or extension node and\n // allow us to differentiate between the two node types. `ODD` or `EVEN` is\n // determined by the number of nibbles within the unprefixed `path`. If the\n // number of nibbles if even, we need to insert an extra padding nibble so\n // the resulting prefixed `path` has an even number of nibbles.\n uint8 constant PREFIX_EXTENSION_EVEN = 0;\n uint8 constant PREFIX_EXTENSION_ODD = 1;\n uint8 constant PREFIX_LEAF_EVEN = 2;\n uint8 constant PREFIX_LEAF_ODD = 3;\n\n // Just a utility constant. RLP represents `NULL` as 0x80.\n bytes1 constant RLP_NULL = bytes1(0x80);\n bytes constant RLP_NULL_BYTES = hex'80';\n bytes32 constant internal KECCAK256_RLP_NULL_BYTES = keccak256(RLP_NULL_BYTES);\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * @notice Verifies a proof that a given key/value pair is present in the\n * Merkle trie.\n * @param _key Key of the node to search for, as a hex string.\n * @param _value Value of the node to search for, as a hex string.\n * @param _proof Merkle trie inclusion proof for the desired node. Unlike\n * traditional Merkle trees, this proof is executed top-down and consists\n * of a list of RLP-encoded nodes that make a path down to the target node.\n * @param _root Known root of the Merkle trie. Used to verify that the\n * included proof is correctly constructed.\n * @return _verified `true` if the k/v pair exists in the trie, `false` otherwise.\n */\n function verifyInclusionProof(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n )\n internal\n pure\n returns (\n bool _verified\n )\n {\n (\n bool exists,\n bytes memory value\n ) = get(_key, _proof, _root);\n\n return (\n exists && Lib_BytesUtils.equal(_value, value)\n );\n }\n\n /**\n * @notice Updates a Merkle trie and returns a new root hash.\n * @param _key Key of the node to update, as a hex string.\n * @param _value Value of the node to update, as a hex string.\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\n * target node. If the key exists, we can simply update the value.\n * Otherwise, we need to modify the trie to handle the new k/v pair.\n * @param _root Known root of the Merkle trie. Used to verify that the\n * included proof is correctly constructed.\n * @return _updatedRoot Root hash of the newly constructed trie.\n */\n function update(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n )\n internal\n pure\n returns (\n bytes32 _updatedRoot\n )\n {\n // Special case when inserting the very first node.\n if (_root == KECCAK256_RLP_NULL_BYTES) {\n return getSingleNodeRootHash(_key, _value);\n }\n\n TrieNode[] memory proof = _parseProof(_proof);\n (uint256 pathLength, bytes memory keyRemainder, ) = _walkNodePath(proof, _key, _root);\n TrieNode[] memory newPath = _getNewPath(proof, pathLength, _key, keyRemainder, _value);\n\n return _getUpdatedTrieRoot(newPath, _key);\n }\n\n /**\n * @notice Retrieves the value associated with a given key.\n * @param _key Key to search for, as hex bytes.\n * @param _proof Merkle trie inclusion proof for the key.\n * @param _root Known root of the Merkle trie.\n * @return _exists Whether or not the key exists.\n * @return _value Value of the key if it exists.\n */\n function get(\n bytes memory _key,\n bytes memory _proof,\n bytes32 _root\n )\n internal\n pure\n returns (\n bool _exists,\n bytes memory _value\n )\n {\n TrieNode[] memory proof = _parseProof(_proof);\n (uint256 pathLength, bytes memory keyRemainder, bool isFinalNode) = _walkNodePath(proof, _key, _root);\n\n bool exists = keyRemainder.length == 0;\n\n require(\n exists || isFinalNode,\n \"Provided proof is invalid.\"\n );\n\n bytes memory value = exists ? _getNodeValue(proof[pathLength - 1]) : bytes('');\n\n return (\n exists,\n value\n );\n }\n\n /**\n * Computes the root hash for a trie with a single node.\n * @param _key Key for the single node.\n * @param _value Value for the single node.\n * @return _updatedRoot Hash of the trie.\n */\n function getSingleNodeRootHash(\n bytes memory _key,\n bytes memory _value\n )\n internal\n pure\n returns (\n bytes32 _updatedRoot\n )\n {\n return keccak256(_makeLeafNode(\n Lib_BytesUtils.toNibbles(_key),\n _value\n ).encoded);\n }\n\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * @notice Walks through a proof using a provided key.\n * @param _proof Inclusion proof to walk through.\n * @param _key Key to use for the walk.\n * @param _root Known root of the trie.\n * @return _pathLength Length of the final path\n * @return _keyRemainder Portion of the key remaining after the walk.\n * @return _isFinalNode Whether or not we've hit a dead end.\n */\n function _walkNodePath(\n TrieNode[] memory _proof,\n bytes memory _key,\n bytes32 _root\n )\n private\n pure\n returns (\n uint256 _pathLength,\n bytes memory _keyRemainder,\n bool _isFinalNode\n )\n {\n uint256 pathLength = 0;\n bytes memory key = Lib_BytesUtils.toNibbles(_key);\n\n bytes32 currentNodeID = _root;\n uint256 currentKeyIndex = 0;\n uint256 currentKeyIncrement = 0;\n TrieNode memory currentNode;\n\n // Proof is top-down, so we start at the first element (root).\n for (uint256 i = 0; i < _proof.length; i++) {\n currentNode = _proof[i];\n currentKeyIndex += currentKeyIncrement;\n\n // Keep track of the proof elements we actually need.\n // It's expensive to resize arrays, so this simply reduces gas costs.\n pathLength += 1;\n\n if (currentKeyIndex == 0) {\n // First proof element is always the root node.\n require(\n keccak256(currentNode.encoded) == currentNodeID,\n \"Invalid root hash\"\n );\n } else if (currentNode.encoded.length >= 32) {\n // Nodes 32 bytes or larger are hashed inside branch nodes.\n require(\n keccak256(currentNode.encoded) == currentNodeID,\n \"Invalid large internal hash\"\n );\n } else {\n // Nodes smaller than 31 bytes aren't hashed.\n require(\n Lib_BytesUtils.toBytes32(currentNode.encoded) == currentNodeID,\n \"Invalid internal node hash\"\n );\n }\n\n if (currentNode.decoded.length == BRANCH_NODE_LENGTH) {\n if (currentKeyIndex == key.length) {\n // We've hit the end of the key, meaning the value should be within this branch node.\n break;\n } else {\n // We're not at the end of the key yet.\n // Figure out what the next node ID should be and continue.\n uint8 branchKey = uint8(key[currentKeyIndex]);\n Lib_RLPReader.RLPItem memory nextNode = currentNode.decoded[branchKey];\n currentNodeID = _getNodeID(nextNode);\n currentKeyIncrement = 1;\n continue;\n }\n } else if (currentNode.decoded.length == LEAF_OR_EXTENSION_NODE_LENGTH) {\n bytes memory path = _getNodePath(currentNode);\n uint8 prefix = uint8(path[0]);\n uint8 offset = 2 - prefix % 2;\n bytes memory pathRemainder = Lib_BytesUtils.slice(path, offset);\n bytes memory keyRemainder = Lib_BytesUtils.slice(key, currentKeyIndex);\n uint256 sharedNibbleLength = _getSharedNibbleLength(pathRemainder, keyRemainder);\n\n if (prefix == PREFIX_LEAF_EVEN || prefix == PREFIX_LEAF_ODD) {\n if (\n pathRemainder.length == sharedNibbleLength &&\n keyRemainder.length == sharedNibbleLength\n ) {\n // The key within this leaf matches our key exactly.\n // Increment the key index to reflect that we have no remainder.\n currentKeyIndex += sharedNibbleLength;\n }\n\n // We've hit a leaf node, so our next node should be NULL.\n currentNodeID = bytes32(RLP_NULL);\n break;\n } else if (prefix == PREFIX_EXTENSION_EVEN || prefix == PREFIX_EXTENSION_ODD) {\n if (sharedNibbleLength != pathRemainder.length) {\n // Our extension node is not identical to the remainder.\n // We've hit the end of this path, updates will need to modify this extension.\n currentNodeID = bytes32(RLP_NULL);\n break;\n } else {\n // Our extension shares some nibbles.\n // Carry on to the next node.\n currentNodeID = _getNodeID(currentNode.decoded[1]);\n currentKeyIncrement = sharedNibbleLength;\n continue;\n }\n } else {\n revert(\"Received a node with an unknown prefix\");\n }\n } else {\n revert(\"Received an unparseable node.\");\n }\n }\n\n // If our node ID is NULL, then we're at a dead end.\n bool isFinalNode = currentNodeID == bytes32(RLP_NULL);\n return (pathLength, Lib_BytesUtils.slice(key, currentKeyIndex), isFinalNode);\n }\n\n /**\n * @notice Creates new nodes to support a k/v pair insertion into a given Merkle trie path.\n * @param _path Path to the node nearest the k/v pair.\n * @param _pathLength Length of the path. Necessary because the provided path may include\n * additional nodes (e.g., it comes directly from a proof) and we can't resize in-memory\n * arrays without costly duplication.\n * @param _key Full original key.\n * @param _keyRemainder Portion of the initial key that must be inserted into the trie.\n * @param _value Value to insert at the given key.\n * @return _newPath A new path with the inserted k/v pair and extra supporting nodes.\n */\n function _getNewPath(\n TrieNode[] memory _path,\n uint256 _pathLength,\n bytes memory _key,\n bytes memory _keyRemainder,\n bytes memory _value\n )\n private\n pure\n returns (\n TrieNode[] memory _newPath\n )\n {\n bytes memory keyRemainder = _keyRemainder;\n\n // Most of our logic depends on the status of the last node in the path.\n TrieNode memory lastNode = _path[_pathLength - 1];\n NodeType lastNodeType = _getNodeType(lastNode);\n\n // Create an array for newly created nodes.\n // We need up to three new nodes, depending on the contents of the last node.\n // Since array resizing is expensive, we'll keep track of the size manually.\n // We're using an explicit `totalNewNodes += 1` after insertions for clarity.\n TrieNode[] memory newNodes = new TrieNode[](3);\n uint256 totalNewNodes = 0;\n\n // Reference: https://github.com/ethereumjs/merkle-patricia-tree/blob/c0a10395aab37d42c175a47114ebfcbd7efcf059/src/baseTrie.ts#L294-L313\n bool matchLeaf = false;\n if (lastNodeType == NodeType.LeafNode) {\n uint256 l = 0;\n if (_path.length > 0) {\n for (uint256 i = 0; i < _path.length - 1; i++) {\n if (_getNodeType(_path[i]) == NodeType.BranchNode) {\n l++;\n } else {\n l += _getNodeKey(_path[i]).length;\n }\n }\n }\n\n if (\n _getSharedNibbleLength(\n _getNodeKey(lastNode),\n Lib_BytesUtils.slice(Lib_BytesUtils.toNibbles(_key), l)\n ) == _getNodeKey(lastNode).length\n && keyRemainder.length == 0\n ) {\n matchLeaf = true;\n }\n }\n\n if (matchLeaf) {\n // We've found a leaf node with the given key.\n // Simply need to update the value of the node to match.\n newNodes[totalNewNodes] = _makeLeafNode(_getNodeKey(lastNode), _value);\n totalNewNodes += 1;\n } else if (lastNodeType == NodeType.BranchNode) {\n if (keyRemainder.length == 0) {\n // We've found a branch node with the given key.\n // Simply need to update the value of the node to match.\n newNodes[totalNewNodes] = _editBranchValue(lastNode, _value);\n totalNewNodes += 1;\n } else {\n // We've found a branch node, but it doesn't contain our key.\n // Reinsert the old branch for now.\n newNodes[totalNewNodes] = lastNode;\n totalNewNodes += 1;\n // Create a new leaf node, slicing our remainder since the first byte points\n // to our branch node.\n newNodes[totalNewNodes] = _makeLeafNode(Lib_BytesUtils.slice(keyRemainder, 1), _value);\n totalNewNodes += 1;\n }\n } else {\n // Our last node is either an extension node or a leaf node with a different key.\n bytes memory lastNodeKey = _getNodeKey(lastNode);\n uint256 sharedNibbleLength = _getSharedNibbleLength(lastNodeKey, keyRemainder);\n\n if (sharedNibbleLength != 0) {\n // We've got some shared nibbles between the last node and our key remainder.\n // We'll need to insert an extension node that covers these shared nibbles.\n bytes memory nextNodeKey = Lib_BytesUtils.slice(lastNodeKey, 0, sharedNibbleLength);\n newNodes[totalNewNodes] = _makeExtensionNode(nextNodeKey, _getNodeHash(_value));\n totalNewNodes += 1;\n\n // Cut down the keys since we've just covered these shared nibbles.\n lastNodeKey = Lib_BytesUtils.slice(lastNodeKey, sharedNibbleLength);\n keyRemainder = Lib_BytesUtils.slice(keyRemainder, sharedNibbleLength);\n }\n\n // Create an empty branch to fill in.\n TrieNode memory newBranch = _makeEmptyBranchNode();\n\n if (lastNodeKey.length == 0) {\n // Key remainder was larger than the key for our last node.\n // The value within our last node is therefore going to be shifted into\n // a branch value slot.\n newBranch = _editBranchValue(newBranch, _getNodeValue(lastNode));\n } else {\n // Last node key was larger than the key remainder.\n // We're going to modify some index of our branch.\n uint8 branchKey = uint8(lastNodeKey[0]);\n // Move on to the next nibble.\n lastNodeKey = Lib_BytesUtils.slice(lastNodeKey, 1);\n\n if (lastNodeType == NodeType.LeafNode) {\n // We're dealing with a leaf node.\n // We'll modify the key and insert the old leaf node into the branch index.\n TrieNode memory modifiedLastNode = _makeLeafNode(lastNodeKey, _getNodeValue(lastNode));\n newBranch = _editBranchIndex(newBranch, branchKey, _getNodeHash(modifiedLastNode.encoded));\n } else if (lastNodeKey.length != 0) {\n // We're dealing with a shrinking extension node.\n // We need to modify the node to decrease the size of the key.\n TrieNode memory modifiedLastNode = _makeExtensionNode(lastNodeKey, _getNodeValue(lastNode));\n newBranch = _editBranchIndex(newBranch, branchKey, _getNodeHash(modifiedLastNode.encoded));\n } else {\n // We're dealing with an unnecessary extension node.\n // We're going to delete the node entirely.\n // Simply insert its current value into the branch index.\n newBranch = _editBranchIndex(newBranch, branchKey, _getNodeValue(lastNode));\n }\n }\n\n if (keyRemainder.length == 0) {\n // We've got nothing left in the key remainder.\n // Simply insert the value into the branch value slot.\n newBranch = _editBranchValue(newBranch, _value);\n // Push the branch into the list of new nodes.\n newNodes[totalNewNodes] = newBranch;\n totalNewNodes += 1;\n } else {\n // We've got some key remainder to work with.\n // We'll be inserting a leaf node into the trie.\n // First, move on to the next nibble.\n keyRemainder = Lib_BytesUtils.slice(keyRemainder, 1);\n // Push the branch into the list of new nodes.\n newNodes[totalNewNodes] = newBranch;\n totalNewNodes += 1;\n // Push a new leaf node for our k/v pair.\n newNodes[totalNewNodes] = _makeLeafNode(keyRemainder, _value);\n totalNewNodes += 1;\n }\n }\n\n // Finally, join the old path with our newly created nodes.\n // Since we're overwriting the last node in the path, we use `_pathLength - 1`.\n return _joinNodeArrays(_path, _pathLength - 1, newNodes, totalNewNodes);\n }\n\n /**\n * @notice Computes the trie root from a given path.\n * @param _nodes Path to some k/v pair.\n * @param _key Key for the k/v pair.\n * @return _updatedRoot Root hash for the updated trie.\n */\n function _getUpdatedTrieRoot(\n TrieNode[] memory _nodes,\n bytes memory _key\n )\n private\n pure\n returns (\n bytes32 _updatedRoot\n )\n {\n bytes memory key = Lib_BytesUtils.toNibbles(_key);\n\n // Some variables to keep track of during iteration.\n TrieNode memory currentNode;\n NodeType currentNodeType;\n bytes memory previousNodeHash;\n\n // Run through the path backwards to rebuild our root hash.\n for (uint256 i = _nodes.length; i > 0; i--) {\n // Pick out the current node.\n currentNode = _nodes[i - 1];\n currentNodeType = _getNodeType(currentNode);\n\n if (currentNodeType == NodeType.LeafNode) {\n // Leaf nodes are already correctly encoded.\n // Shift the key over to account for the nodes key.\n bytes memory nodeKey = _getNodeKey(currentNode);\n key = Lib_BytesUtils.slice(key, 0, key.length - nodeKey.length);\n } else if (currentNodeType == NodeType.ExtensionNode) {\n // Shift the key over to account for the nodes key.\n bytes memory nodeKey = _getNodeKey(currentNode);\n key = Lib_BytesUtils.slice(key, 0, key.length - nodeKey.length);\n\n // If this node is the last element in the path, it'll be correctly encoded\n // and we can skip this part.\n if (previousNodeHash.length > 0) {\n // Re-encode the node based on the previous node.\n currentNode = _editExtensionNodeValue(currentNode, previousNodeHash);\n }\n } else if (currentNodeType == NodeType.BranchNode) {\n // If this node is the last element in the path, it'll be correctly encoded\n // and we can skip this part.\n if (previousNodeHash.length > 0) {\n // Re-encode the node based on the previous node.\n uint8 branchKey = uint8(key[key.length - 1]);\n key = Lib_BytesUtils.slice(key, 0, key.length - 1);\n currentNode = _editBranchIndex(currentNode, branchKey, previousNodeHash);\n }\n }\n\n // Compute the node hash for the next iteration.\n previousNodeHash = _getNodeHash(currentNode.encoded);\n }\n\n // Current node should be the root at this point.\n // Simply return the hash of its encoding.\n return keccak256(currentNode.encoded);\n }\n\n /**\n * @notice Parses an RLP-encoded proof into something more useful.\n * @param _proof RLP-encoded proof to parse.\n * @return _parsed Proof parsed into easily accessible structs.\n */\n function _parseProof(\n bytes memory _proof\n )\n private\n pure\n returns (\n TrieNode[] memory _parsed\n )\n {\n Lib_RLPReader.RLPItem[] memory nodes = Lib_RLPReader.readList(_proof);\n TrieNode[] memory proof = new TrieNode[](nodes.length);\n\n for (uint256 i = 0; i < nodes.length; i++) {\n bytes memory encoded = Lib_RLPReader.readBytes(nodes[i]);\n proof[i] = TrieNode({\n encoded: encoded,\n decoded: Lib_RLPReader.readList(encoded)\n });\n }\n\n return proof;\n }\n\n /**\n * @notice Picks out the ID for a node. Node ID is referred to as the\n * \"hash\" within the specification, but nodes < 32 bytes are not actually\n * hashed.\n * @param _node Node to pull an ID for.\n * @return _nodeID ID for the node, depending on the size of its contents.\n */\n function _getNodeID(\n Lib_RLPReader.RLPItem memory _node\n )\n private\n pure\n returns (\n bytes32 _nodeID\n )\n {\n bytes memory nodeID;\n\n if (_node.length < 32) {\n // Nodes smaller than 32 bytes are RLP encoded.\n nodeID = Lib_RLPReader.readRawBytes(_node);\n } else {\n // Nodes 32 bytes or larger are hashed.\n nodeID = Lib_RLPReader.readBytes(_node);\n }\n\n return Lib_BytesUtils.toBytes32(nodeID);\n }\n\n /**\n * @notice Gets the path for a leaf or extension node.\n * @param _node Node to get a path for.\n * @return _path Node path, converted to an array of nibbles.\n */\n function _getNodePath(\n TrieNode memory _node\n )\n private\n pure\n returns (\n bytes memory _path\n )\n {\n return Lib_BytesUtils.toNibbles(Lib_RLPReader.readBytes(_node.decoded[0]));\n }\n\n /**\n * @notice Gets the key for a leaf or extension node. Keys are essentially\n * just paths without any prefix.\n * @param _node Node to get a key for.\n * @return _key Node key, converted to an array of nibbles.\n */\n function _getNodeKey(\n TrieNode memory _node\n )\n private\n pure\n returns (\n bytes memory _key\n )\n {\n return _removeHexPrefix(_getNodePath(_node));\n }\n\n /**\n * @notice Gets the path for a node.\n * @param _node Node to get a value for.\n * @return _value Node value, as hex bytes.\n */\n function _getNodeValue(\n TrieNode memory _node\n )\n private\n pure\n returns (\n bytes memory _value\n )\n {\n return Lib_RLPReader.readBytes(_node.decoded[_node.decoded.length - 1]);\n }\n\n /**\n * @notice Computes the node hash for an encoded node. Nodes < 32 bytes\n * are not hashed, all others are keccak256 hashed.\n * @param _encoded Encoded node to hash.\n * @return _hash Hash of the encoded node. Simply the input if < 32 bytes.\n */\n function _getNodeHash(\n bytes memory _encoded\n )\n private\n pure\n returns (\n bytes memory _hash\n )\n {\n if (_encoded.length < 32) {\n return _encoded;\n } else {\n return abi.encodePacked(keccak256(_encoded));\n }\n }\n\n /**\n * @notice Determines the type for a given node.\n * @param _node Node to determine a type for.\n * @return _type Type of the node; BranchNode/ExtensionNode/LeafNode.\n */\n function _getNodeType(\n TrieNode memory _node\n )\n private\n pure\n returns (\n NodeType _type\n )\n {\n if (_node.decoded.length == BRANCH_NODE_LENGTH) {\n return NodeType.BranchNode;\n } else if (_node.decoded.length == LEAF_OR_EXTENSION_NODE_LENGTH) {\n bytes memory path = _getNodePath(_node);\n uint8 prefix = uint8(path[0]);\n\n if (prefix == PREFIX_LEAF_EVEN || prefix == PREFIX_LEAF_ODD) {\n return NodeType.LeafNode;\n } else if (prefix == PREFIX_EXTENSION_EVEN || prefix == PREFIX_EXTENSION_ODD) {\n return NodeType.ExtensionNode;\n }\n }\n\n revert(\"Invalid node type\");\n }\n\n /**\n * @notice Utility; determines the number of nibbles shared between two\n * nibble arrays.\n * @param _a First nibble array.\n * @param _b Second nibble array.\n * @return _shared Number of shared nibbles.\n */\n function _getSharedNibbleLength(\n bytes memory _a,\n bytes memory _b\n )\n private\n pure\n returns (\n uint256 _shared\n )\n {\n uint256 i = 0;\n while (_a.length > i && _b.length > i && _a[i] == _b[i]) {\n i++;\n }\n return i;\n }\n\n /**\n * @notice Utility; converts an RLP-encoded node into our nice struct.\n * @param _raw RLP-encoded node to convert.\n * @return _node Node as a TrieNode struct.\n */\n function _makeNode(\n bytes[] memory _raw\n )\n private\n pure\n returns (\n TrieNode memory _node\n )\n {\n bytes memory encoded = Lib_RLPWriter.writeList(_raw);\n\n return TrieNode({\n encoded: encoded,\n decoded: Lib_RLPReader.readList(encoded)\n });\n }\n\n /**\n * @notice Utility; converts an RLP-decoded node into our nice struct.\n * @param _items RLP-decoded node to convert.\n * @return _node Node as a TrieNode struct.\n */\n function _makeNode(\n Lib_RLPReader.RLPItem[] memory _items\n )\n private\n pure\n returns (\n TrieNode memory _node\n )\n {\n bytes[] memory raw = new bytes[](_items.length);\n for (uint256 i = 0; i < _items.length; i++) {\n raw[i] = Lib_RLPReader.readRawBytes(_items[i]);\n }\n return _makeNode(raw);\n }\n\n /**\n * @notice Creates a new extension node.\n * @param _key Key for the extension node, unprefixed.\n * @param _value Value for the extension node.\n * @return _node New extension node with the given k/v pair.\n */\n function _makeExtensionNode(\n bytes memory _key,\n bytes memory _value\n )\n private\n pure\n returns (\n TrieNode memory _node\n )\n {\n bytes[] memory raw = new bytes[](2);\n bytes memory key = _addHexPrefix(_key, false);\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\n raw[1] = Lib_RLPWriter.writeBytes(_value);\n return _makeNode(raw);\n }\n\n /**\n * Creates a new extension node with the same key but a different value.\n * @param _node Extension node to copy and modify.\n * @param _value New value for the extension node.\n * @return New node with the same key and different value.\n */\n function _editExtensionNodeValue(\n TrieNode memory _node,\n bytes memory _value\n )\n private\n pure\n returns (\n TrieNode memory\n )\n {\n bytes[] memory raw = new bytes[](2);\n bytes memory key = _addHexPrefix(_getNodeKey(_node), false);\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\n if (_value.length < 32) {\n raw[1] = _value;\n } else {\n raw[1] = Lib_RLPWriter.writeBytes(_value);\n }\n return _makeNode(raw);\n }\n\n /**\n * @notice Creates a new leaf node.\n * @dev This function is essentially identical to `_makeExtensionNode`.\n * Although we could route both to a single method with a flag, it's\n * more gas efficient to keep them separate and duplicate the logic.\n * @param _key Key for the leaf node, unprefixed.\n * @param _value Value for the leaf node.\n * @return _node New leaf node with the given k/v pair.\n */\n function _makeLeafNode(\n bytes memory _key,\n bytes memory _value\n )\n private\n pure\n returns (\n TrieNode memory _node\n )\n {\n bytes[] memory raw = new bytes[](2);\n bytes memory key = _addHexPrefix(_key, true);\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\n raw[1] = Lib_RLPWriter.writeBytes(_value);\n return _makeNode(raw);\n }\n\n /**\n * @notice Creates an empty branch node.\n * @return _node Empty branch node as a TrieNode struct.\n */\n function _makeEmptyBranchNode()\n private\n pure\n returns (\n TrieNode memory _node\n )\n {\n bytes[] memory raw = new bytes[](BRANCH_NODE_LENGTH);\n for (uint256 i = 0; i < raw.length; i++) {\n raw[i] = RLP_NULL_BYTES;\n }\n return _makeNode(raw);\n }\n\n /**\n * @notice Modifies the value slot for a given branch.\n * @param _branch Branch node to modify.\n * @param _value Value to insert into the branch.\n * @return _updatedNode Modified branch node.\n */\n function _editBranchValue(\n TrieNode memory _branch,\n bytes memory _value\n )\n private\n pure\n returns (\n TrieNode memory _updatedNode\n )\n {\n bytes memory encoded = Lib_RLPWriter.writeBytes(_value);\n _branch.decoded[_branch.decoded.length - 1] = Lib_RLPReader.toRLPItem(encoded);\n return _makeNode(_branch.decoded);\n }\n\n /**\n * @notice Modifies a slot at an index for a given branch.\n * @param _branch Branch node to modify.\n * @param _index Slot index to modify.\n * @param _value Value to insert into the slot.\n * @return _updatedNode Modified branch node.\n */\n function _editBranchIndex(\n TrieNode memory _branch,\n uint8 _index,\n bytes memory _value\n )\n private\n pure\n returns (\n TrieNode memory _updatedNode\n )\n {\n bytes memory encoded = _value.length < 32 ? _value : Lib_RLPWriter.writeBytes(_value);\n _branch.decoded[_index] = Lib_RLPReader.toRLPItem(encoded);\n return _makeNode(_branch.decoded);\n }\n\n /**\n * @notice Utility; adds a prefix to a key.\n * @param _key Key to prefix.\n * @param _isLeaf Whether or not the key belongs to a leaf.\n * @return _prefixedKey Prefixed key.\n */\n function _addHexPrefix(\n bytes memory _key,\n bool _isLeaf\n )\n private\n pure\n returns (\n bytes memory _prefixedKey\n )\n {\n uint8 prefix = _isLeaf ? uint8(0x02) : uint8(0x00);\n uint8 offset = uint8(_key.length % 2);\n bytes memory prefixed = new bytes(2 - offset);\n prefixed[0] = bytes1(prefix + offset);\n return abi.encodePacked(prefixed, _key);\n }\n\n /**\n * @notice Utility; removes a prefix from a path.\n * @param _path Path to remove the prefix from.\n * @return _unprefixedKey Unprefixed key.\n */\n function _removeHexPrefix(\n bytes memory _path\n )\n private\n pure\n returns (\n bytes memory _unprefixedKey\n )\n {\n if (uint8(_path[0]) % 2 == 0) {\n return Lib_BytesUtils.slice(_path, 2);\n } else {\n return Lib_BytesUtils.slice(_path, 1);\n }\n }\n\n /**\n * @notice Utility; combines two node arrays. Array lengths are required\n * because the actual lengths may be longer than the filled lengths.\n * Array resizing is extremely costly and should be avoided.\n * @param _a First array to join.\n * @param _aLength Length of the first array.\n * @param _b Second array to join.\n * @param _bLength Length of the second array.\n * @return _joined Combined node array.\n */\n function _joinNodeArrays(\n TrieNode[] memory _a,\n uint256 _aLength,\n TrieNode[] memory _b,\n uint256 _bLength\n )\n private\n pure\n returns (\n TrieNode[] memory _joined\n )\n {\n TrieNode[] memory ret = new TrieNode[](_aLength + _bLength);\n\n // Copy elements from the first array.\n for (uint256 i = 0; i < _aLength; i++) {\n ret[i] = _a[i];\n }\n\n // Copy elements from the second array.\n for (uint256 i = 0; i < _bLength; i++) {\n ret[i + _aLength] = _b[i];\n }\n\n return ret;\n }\n}\n" + }, + "contracts/optimistic-ethereum/OVM/verification/OVM_FraudVerifier.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/* Interface Imports */\nimport { iOVM_FraudVerifier } from \"../../iOVM/verification/iOVM_FraudVerifier.sol\";\nimport { iOVM_StateTransitioner } from \"../../iOVM/verification/iOVM_StateTransitioner.sol\";\nimport { iOVM_StateTransitionerFactory } from \"../../iOVM/verification/iOVM_StateTransitionerFactory.sol\";\nimport { iOVM_BondManager } from \"../../iOVM/verification/iOVM_BondManager.sol\";\nimport { iOVM_StateCommitmentChain } from \"../../iOVM/chain/iOVM_StateCommitmentChain.sol\";\nimport { iOVM_CanonicalTransactionChain } from \"../../iOVM/chain/iOVM_CanonicalTransactionChain.sol\";\n\n/* Contract Imports */\nimport { Abs_FraudContributor } from \"./Abs_FraudContributor.sol\";\n\n\n\n/**\n * @title OVM_FraudVerifier\n * @dev The Fraud Verifier contract coordinates the entire fraud proof verification process.\n * If the fraud proof was successful it prunes any state batches from State Commitment Chain\n * which were published after the fraudulent state root.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract OVM_FraudVerifier is Lib_AddressResolver, Abs_FraudContributor, iOVM_FraudVerifier {\n\n /*******************************************\n * Contract Variables: Internal Accounting *\n *******************************************/\n\n mapping (bytes32 => iOVM_StateTransitioner) internal transitioners;\n\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n constructor(\n address _libAddressManager\n )\n Lib_AddressResolver(_libAddressManager)\n {}\n\n\n /***************************************\n * Public Functions: Transition Status *\n ***************************************/\n\n /**\n * Retrieves the state transitioner for a given root.\n * @param _preStateRoot State root to query a transitioner for.\n * @return _transitioner Corresponding state transitioner contract.\n */\n function getStateTransitioner(\n bytes32 _preStateRoot,\n bytes32 _txHash\n )\n override\n public\n view\n returns (\n iOVM_StateTransitioner _transitioner\n )\n {\n return transitioners[keccak256(abi.encodePacked(_preStateRoot, _txHash))];\n }\n\n\n /****************************************\n * Public Functions: Fraud Verification *\n ****************************************/\n\n /**\n * Begins the fraud verification process.\n * @param _preStateRoot State root before the fraudulent transaction.\n * @param _preStateRootBatchHeader Batch header for the provided pre-state root.\n * @param _preStateRootProof Inclusion proof for the provided pre-state root.\n * @param _transaction OVM transaction claimed to be fraudulent.\n * @param _txChainElement OVM transaction chain element.\n * @param _transactionBatchHeader Batch header for the provided transaction.\n * @param _transactionProof Inclusion proof for the provided transaction.\n */\n function initializeFraudVerification(\n bytes32 _preStateRoot,\n Lib_OVMCodec.ChainBatchHeader memory _preStateRootBatchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _preStateRootProof,\n Lib_OVMCodec.Transaction memory _transaction,\n Lib_OVMCodec.TransactionChainElement memory _txChainElement,\n Lib_OVMCodec.ChainBatchHeader memory _transactionBatchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _transactionProof\n )\n override\n public\n contributesToFraudProof(_preStateRoot, Lib_OVMCodec.hashTransaction(_transaction))\n {\n bytes32 _txHash = Lib_OVMCodec.hashTransaction(_transaction);\n\n if (_hasStateTransitioner(_preStateRoot, _txHash)) {\n return;\n }\n\n iOVM_StateCommitmentChain ovmStateCommitmentChain = iOVM_StateCommitmentChain(resolve(\"OVM_StateCommitmentChain\"));\n iOVM_CanonicalTransactionChain ovmCanonicalTransactionChain = iOVM_CanonicalTransactionChain(resolve(\"OVM_CanonicalTransactionChain\"));\n\n require(\n ovmStateCommitmentChain.verifyStateCommitment(\n _preStateRoot,\n _preStateRootBatchHeader,\n _preStateRootProof\n ),\n \"Invalid pre-state root inclusion proof.\"\n );\n\n require(\n ovmCanonicalTransactionChain.verifyTransaction(\n _transaction,\n _txChainElement,\n _transactionBatchHeader,\n _transactionProof\n ),\n \"Invalid transaction inclusion proof.\"\n );\n\n require (\n _preStateRootBatchHeader.prevTotalElements + _preStateRootProof.index + 1 == _transactionBatchHeader.prevTotalElements + _transactionProof.index,\n \"Pre-state root global index must equal to the transaction root global index.\"\n );\n\n _deployTransitioner(_preStateRoot, _txHash, _preStateRootProof.index);\n\n emit FraudProofInitialized(\n _preStateRoot,\n _preStateRootProof.index,\n _txHash,\n msg.sender\n );\n }\n\n /**\n * Finalizes the fraud verification process.\n * @param _preStateRoot State root before the fraudulent transaction.\n * @param _preStateRootBatchHeader Batch header for the provided pre-state root.\n * @param _preStateRootProof Inclusion proof for the provided pre-state root.\n * @param _txHash The transaction for the state root\n * @param _postStateRoot State root after the fraudulent transaction.\n * @param _postStateRootBatchHeader Batch header for the provided post-state root.\n * @param _postStateRootProof Inclusion proof for the provided post-state root.\n */\n function finalizeFraudVerification(\n bytes32 _preStateRoot,\n Lib_OVMCodec.ChainBatchHeader memory _preStateRootBatchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _preStateRootProof,\n bytes32 _txHash,\n bytes32 _postStateRoot,\n Lib_OVMCodec.ChainBatchHeader memory _postStateRootBatchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _postStateRootProof\n )\n override\n public\n contributesToFraudProof(_preStateRoot, _txHash)\n {\n iOVM_StateTransitioner transitioner = getStateTransitioner(_preStateRoot, _txHash);\n iOVM_StateCommitmentChain ovmStateCommitmentChain = iOVM_StateCommitmentChain(resolve(\"OVM_StateCommitmentChain\"));\n\n require(\n transitioner.isComplete() == true,\n \"State transition process must be completed prior to finalization.\"\n );\n\n require (\n _postStateRootBatchHeader.prevTotalElements + _postStateRootProof.index == _preStateRootBatchHeader.prevTotalElements + _preStateRootProof.index + 1,\n \"Post-state root global index must equal to the pre state root global index plus one.\"\n );\n\n require(\n ovmStateCommitmentChain.verifyStateCommitment(\n _preStateRoot,\n _preStateRootBatchHeader,\n _preStateRootProof\n ),\n \"Invalid pre-state root inclusion proof.\"\n );\n\n require(\n ovmStateCommitmentChain.verifyStateCommitment(\n _postStateRoot,\n _postStateRootBatchHeader,\n _postStateRootProof\n ),\n \"Invalid post-state root inclusion proof.\"\n );\n\n // If the post state root did not match, then there was fraud and we should delete the batch\n require(\n _postStateRoot != transitioner.getPostStateRoot(),\n \"State transition has not been proven fraudulent.\"\n );\n\n _cancelStateTransition(_postStateRootBatchHeader, _preStateRoot);\n\n // TEMPORARY: Remove the transitioner; for minnet.\n transitioners[keccak256(abi.encodePacked(_preStateRoot, _txHash))] = iOVM_StateTransitioner(0x0000000000000000000000000000000000000000);\n\n emit FraudProofFinalized(\n _preStateRoot,\n _preStateRootProof.index,\n _txHash,\n msg.sender\n );\n }\n\n\n /************************************\n * Internal Functions: Verification *\n ************************************/\n\n /**\n * Checks whether a transitioner already exists for a given pre-state root.\n * @param _preStateRoot Pre-state root to check.\n * @return _exists Whether or not we already have a transitioner for the root.\n */\n function _hasStateTransitioner(\n bytes32 _preStateRoot,\n bytes32 _txHash\n )\n internal\n view\n returns (\n bool _exists\n )\n {\n return address(getStateTransitioner(_preStateRoot, _txHash)) != address(0);\n }\n\n /**\n * Deploys a new state transitioner.\n * @param _preStateRoot Pre-state root to initialize the transitioner with.\n * @param _txHash Hash of the transaction this transitioner will execute.\n * @param _stateTransitionIndex Index of the transaction in the chain.\n */\n function _deployTransitioner(\n bytes32 _preStateRoot,\n bytes32 _txHash,\n uint256 _stateTransitionIndex\n )\n internal\n {\n transitioners[keccak256(abi.encodePacked(_preStateRoot, _txHash))] = iOVM_StateTransitionerFactory(\n resolve(\"OVM_StateTransitionerFactory\")\n ).create(\n address(libAddressManager),\n _stateTransitionIndex,\n _preStateRoot,\n _txHash\n );\n }\n\n /**\n * Removes a state transition from the state commitment chain.\n * @param _postStateRootBatchHeader Header for the post-state root.\n * @param _preStateRoot Pre-state root hash.\n */\n function _cancelStateTransition(\n Lib_OVMCodec.ChainBatchHeader memory _postStateRootBatchHeader,\n bytes32 _preStateRoot\n )\n internal\n {\n iOVM_StateCommitmentChain ovmStateCommitmentChain = iOVM_StateCommitmentChain(resolve(\"OVM_StateCommitmentChain\"));\n iOVM_BondManager ovmBondManager = iOVM_BondManager(resolve(\"OVM_BondManager\"));\n\n // Delete the state batch.\n ovmStateCommitmentChain.deleteStateBatch(\n _postStateRootBatchHeader\n );\n\n // Get the timestamp and publisher for that block.\n (uint256 timestamp, address publisher) = abi.decode(_postStateRootBatchHeader.extraData, (uint256, address));\n\n // Slash the bonds at the bond manager.\n ovmBondManager.finalize(\n _preStateRoot,\n publisher,\n timestamp\n );\n }\n}\n" + }, + "contracts/optimistic-ethereum/OVM/chain/OVM_CanonicalTransactionChain.sol": { + "content": "// SPDX-License-Identifier: MIT\n// @unsupported: ovm\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\nimport { Lib_MerkleTree } from \"../../libraries/utils/Lib_MerkleTree.sol\";\n\n/* Interface Imports */\nimport { iOVM_CanonicalTransactionChain } from \"../../iOVM/chain/iOVM_CanonicalTransactionChain.sol\";\nimport { iOVM_ChainStorageContainer } from \"../../iOVM/chain/iOVM_ChainStorageContainer.sol\";\n\n/* Contract Imports */\nimport { OVM_ExecutionManager } from \"../execution/OVM_ExecutionManager.sol\";\n\n/* External Imports */\nimport { Math } from \"@openzeppelin/contracts/math/Math.sol\";\n\n/**\n * @title OVM_CanonicalTransactionChain\n * @dev The Canonical Transaction Chain (CTC) contract is an append-only log of transactions\n * which must be applied to the rollup state. It defines the ordering of rollup transactions by\n * writing them to the 'CTC:batches' instance of the Chain Storage Container.\n * The CTC also allows any account to 'enqueue' an L2 transaction, which will require that the Sequencer\n * will eventually append it to the rollup state.\n * If the Sequencer does not include an enqueued transaction within the 'force inclusion period',\n * then any account may force it to be included by calling appendQueueBatch().\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract OVM_CanonicalTransactionChain is iOVM_CanonicalTransactionChain, Lib_AddressResolver {\n\n /*************\n * Constants *\n *************/\n\n // L2 tx gas-related\n uint256 constant public MIN_ROLLUP_TX_GAS = 100000;\n uint256 constant public MAX_ROLLUP_TX_SIZE = 50000;\n uint256 constant public L2_GAS_DISCOUNT_DIVISOR = 32;\n\n // Encoding-related (all in bytes)\n uint256 constant internal BATCH_CONTEXT_SIZE = 16;\n uint256 constant internal BATCH_CONTEXT_LENGTH_POS = 12;\n uint256 constant internal BATCH_CONTEXT_START_POS = 15;\n uint256 constant internal TX_DATA_HEADER_SIZE = 3;\n uint256 constant internal BYTES_TILL_TX_DATA = 65;\n\n\n /*************\n * Variables *\n *************/\n\n uint256 public forceInclusionPeriodSeconds;\n uint256 public forceInclusionPeriodBlocks;\n uint256 public maxTransactionGasLimit;\n\n\n /***************\n * Constructor *\n ***************/\n\n constructor(\n address _libAddressManager,\n uint256 _forceInclusionPeriodSeconds,\n uint256 _forceInclusionPeriodBlocks,\n uint256 _maxTransactionGasLimit\n )\n Lib_AddressResolver(_libAddressManager)\n {\n forceInclusionPeriodSeconds = _forceInclusionPeriodSeconds;\n forceInclusionPeriodBlocks = _forceInclusionPeriodBlocks;\n maxTransactionGasLimit = _maxTransactionGasLimit;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Accesses the batch storage container.\n * @return Reference to the batch storage container.\n */\n function batches()\n override\n public\n view\n returns (\n iOVM_ChainStorageContainer\n )\n {\n return iOVM_ChainStorageContainer(\n resolve(\"OVM_ChainStorageContainer:CTC:batches\")\n );\n }\n\n /**\n * Accesses the queue storage container.\n * @return Reference to the queue storage container.\n */\n function queue()\n override\n public\n view\n returns (\n iOVM_ChainStorageContainer\n )\n {\n return iOVM_ChainStorageContainer(\n resolve(\"OVM_ChainStorageContainer:CTC:queue\")\n );\n }\n\n /**\n * Retrieves the total number of elements submitted.\n * @return _totalElements Total submitted elements.\n */\n function getTotalElements()\n override\n public\n view\n returns (\n uint256 _totalElements\n )\n {\n (uint40 totalElements,,,) = _getBatchExtraData();\n return uint256(totalElements);\n }\n\n /**\n * Retrieves the total number of batches submitted.\n * @return _totalBatches Total submitted batches.\n */\n function getTotalBatches()\n override\n public\n view\n returns (\n uint256 _totalBatches\n )\n {\n return batches().length();\n }\n\n /**\n * Returns the index of the next element to be enqueued.\n * @return Index for the next queue element.\n */\n function getNextQueueIndex()\n override\n public\n view\n returns (\n uint40\n )\n {\n (,uint40 nextQueueIndex,,) = _getBatchExtraData();\n return nextQueueIndex;\n }\n\n /**\n * Returns the timestamp of the last transaction.\n * @return Timestamp for the last transaction.\n */\n function getLastTimestamp()\n override\n public\n view\n returns (\n uint40\n )\n {\n (,,uint40 lastTimestamp,) = _getBatchExtraData();\n return lastTimestamp;\n }\n\n /**\n * Returns the blocknumber of the last transaction.\n * @return Blocknumber for the last transaction.\n */\n function getLastBlockNumber()\n override\n public\n view\n returns (\n uint40\n )\n {\n (,,,uint40 lastBlockNumber) = _getBatchExtraData();\n return lastBlockNumber;\n }\n\n /**\n * Gets the queue element at a particular index.\n * @param _index Index of the queue element to access.\n * @return _element Queue element at the given index.\n */\n function getQueueElement(\n uint256 _index\n )\n override\n public\n view\n returns (\n Lib_OVMCodec.QueueElement memory _element\n )\n {\n return _getQueueElement(\n _index,\n queue()\n );\n }\n\n /**\n * Get the number of queue elements which have not yet been included.\n * @return Number of pending queue elements.\n */\n function getNumPendingQueueElements()\n override\n public\n view\n returns (\n uint40\n )\n {\n return getQueueLength() - getNextQueueIndex();\n }\n\n /**\n * Retrieves the length of the queue, including\n * both pending and canonical transactions.\n * @return Length of the queue.\n */\n function getQueueLength()\n override\n public\n view\n returns (\n uint40\n )\n {\n return _getQueueLength(\n queue()\n );\n }\n\n /**\n * Adds a transaction to the queue.\n * @param _target Target L2 contract to send the transaction to.\n * @param _gasLimit Gas limit for the enqueued L2 transaction.\n * @param _data Transaction data.\n */\n function enqueue(\n address _target,\n uint256 _gasLimit,\n bytes memory _data\n )\n override\n public\n {\n require(\n _data.length <= MAX_ROLLUP_TX_SIZE,\n \"Transaction data size exceeds maximum for rollup transaction.\"\n );\n\n require(\n _gasLimit <= maxTransactionGasLimit,\n \"Transaction gas limit exceeds maximum for rollup transaction.\"\n );\n\n require(\n _gasLimit >= MIN_ROLLUP_TX_GAS,\n \"Transaction gas limit too low to enqueue.\"\n );\n\n // We need to consume some amount of L1 gas in order to rate limit transactions going into\n // L2. However, L2 is cheaper than L1 so we only need to burn some small proportion of the\n // provided L1 gas.\n uint256 gasToConsume = _gasLimit/L2_GAS_DISCOUNT_DIVISOR;\n uint256 startingGas = gasleft();\n\n // Although this check is not necessary (burn below will run out of gas if not true), it\n // gives the user an explicit reason as to why the enqueue attempt failed.\n require(\n startingGas > gasToConsume,\n \"Insufficient gas for L2 rate limiting burn.\"\n );\n\n // Here we do some \"dumb\" work in order to burn gas, although we should probably replace\n // this with something like minting gas token later on.\n uint256 i;\n while(startingGas - gasleft() < gasToConsume) {\n i++;\n }\n\n bytes32 transactionHash = keccak256(\n abi.encode(\n msg.sender,\n _target,\n _gasLimit,\n _data\n )\n );\n\n bytes32 timestampAndBlockNumber;\n assembly {\n timestampAndBlockNumber := timestamp()\n timestampAndBlockNumber := or(timestampAndBlockNumber, shl(40, number()))\n }\n\n iOVM_ChainStorageContainer queueRef = queue();\n\n queueRef.push(transactionHash);\n queueRef.push(timestampAndBlockNumber);\n\n // The underlying queue data structure stores 2 elements\n // per insertion, so to get the real queue length we need\n // to divide by 2 and subtract 1.\n uint256 queueIndex = queueRef.length() / 2 - 1;\n emit TransactionEnqueued(\n msg.sender,\n _target,\n _gasLimit,\n _data,\n queueIndex,\n block.timestamp\n );\n }\n\n /**\n * Appends a given number of queued transactions as a single batch.\n * param _numQueuedTransactions Number of transactions to append.\n */\n function appendQueueBatch(\n uint256 // _numQueuedTransactions\n )\n override\n public\n pure\n {\n // TEMPORARY: Disable `appendQueueBatch` for minnet\n revert(\"appendQueueBatch is currently disabled.\");\n\n // _numQueuedTransactions = Math.min(_numQueuedTransactions, getNumPendingQueueElements());\n // require(\n // _numQueuedTransactions > 0,\n // \"Must append more than zero transactions.\"\n // );\n\n // bytes32[] memory leaves = new bytes32[](_numQueuedTransactions);\n // uint40 nextQueueIndex = getNextQueueIndex();\n\n // for (uint256 i = 0; i < _numQueuedTransactions; i++) {\n // if (msg.sender != resolve(\"OVM_Sequencer\")) {\n // Lib_OVMCodec.QueueElement memory el = getQueueElement(nextQueueIndex);\n // require(\n // el.timestamp + forceInclusionPeriodSeconds < block.timestamp,\n // \"Queue transactions cannot be submitted during the sequencer inclusion period.\"\n // );\n // }\n // leaves[i] = _getQueueLeafHash(nextQueueIndex);\n // nextQueueIndex++;\n // }\n\n // Lib_OVMCodec.QueueElement memory lastElement = getQueueElement(nextQueueIndex - 1);\n\n // _appendBatch(\n // Lib_MerkleTree.getMerkleRoot(leaves),\n // _numQueuedTransactions,\n // _numQueuedTransactions,\n // lastElement.timestamp,\n // lastElement.blockNumber\n // );\n\n // emit QueueBatchAppended(\n // nextQueueIndex - _numQueuedTransactions,\n // _numQueuedTransactions,\n // getTotalElements()\n // );\n }\n\n /**\n * Allows the sequencer to append a batch of transactions.\n * @dev This function uses a custom encoding scheme for efficiency reasons.\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\n * .param _contexts Array of batch contexts.\n * .param _transactionDataFields Array of raw transaction data.\n */\n function appendSequencerBatch()\n override\n public\n {\n uint40 shouldStartAtElement;\n uint24 totalElementsToAppend;\n uint24 numContexts;\n assembly {\n shouldStartAtElement := shr(216, calldataload(4))\n totalElementsToAppend := shr(232, calldataload(9))\n numContexts := shr(232, calldataload(12))\n }\n\n require(\n shouldStartAtElement == getTotalElements(),\n \"Actual batch start index does not match expected start index.\"\n );\n\n require(\n msg.sender == resolve(\"OVM_Sequencer\"),\n \"Function can only be called by the Sequencer.\"\n );\n\n require(\n numContexts > 0,\n \"Must provide at least one batch context.\"\n );\n\n require(\n totalElementsToAppend > 0,\n \"Must append at least one element.\"\n );\n\n uint40 nextTransactionPtr = uint40(BATCH_CONTEXT_START_POS + BATCH_CONTEXT_SIZE * numContexts);\n\n require(\n msg.data.length >= nextTransactionPtr,\n \"Not enough BatchContexts provided.\"\n );\n\n // Take a reference to the queue and its length so we don't have to keep resolving it.\n // Length isn't going to change during the course of execution, so it's fine to simply\n // resolve this once at the start. Saves gas.\n iOVM_ChainStorageContainer queueRef = queue();\n uint40 queueLength = _getQueueLength(queueRef);\n\n // Reserve some memory to save gas on hashing later on. This is a relatively safe estimate\n // for the average transaction size that will prevent having to resize this chunk of memory\n // later on. Saves gas.\n bytes memory hashMemory = new bytes((msg.data.length / totalElementsToAppend) * 2);\n\n // Initialize the array of canonical chain leaves that we will append.\n bytes32[] memory leaves = new bytes32[](totalElementsToAppend);\n\n // Each leaf index corresponds to a tx, either sequenced or enqueued.\n uint32 leafIndex = 0;\n\n // Counter for number of sequencer transactions appended so far.\n uint32 numSequencerTransactions = 0;\n\n // We will sequentially append leaves which are pointers to the queue.\n // The initial queue index is what is currently in storage.\n uint40 nextQueueIndex = getNextQueueIndex();\n\n BatchContext memory curContext;\n for (uint32 i = 0; i < numContexts; i++) {\n BatchContext memory nextContext = _getBatchContext(i);\n\n if (i == 0) {\n // Execute a special check for the first batch.\n _validateFirstBatchContext(nextContext);\n }\n\n // Execute this check on every single batch, including the first one.\n _validateNextBatchContext(\n curContext,\n nextContext,\n nextQueueIndex,\n queueRef\n );\n\n // Now we can update our current context.\n curContext = nextContext;\n\n // Process sequencer transactions first.\n for (uint32 j = 0; j < curContext.numSequencedTransactions; j++) {\n uint256 txDataLength;\n assembly {\n txDataLength := shr(232, calldataload(nextTransactionPtr))\n }\n require(\n txDataLength <= MAX_ROLLUP_TX_SIZE,\n \"Transaction data size exceeds maximum for rollup transaction.\"\n );\n\n leaves[leafIndex] = _getSequencerLeafHash(\n curContext,\n nextTransactionPtr,\n txDataLength,\n hashMemory\n );\n\n nextTransactionPtr += uint40(TX_DATA_HEADER_SIZE + txDataLength);\n numSequencerTransactions++;\n leafIndex++;\n }\n\n // Now process any subsequent queue transactions.\n for (uint32 j = 0; j < curContext.numSubsequentQueueTransactions; j++) {\n require(\n nextQueueIndex < queueLength,\n \"Not enough queued transactions to append.\"\n );\n\n leaves[leafIndex] = _getQueueLeafHash(nextQueueIndex);\n nextQueueIndex++;\n leafIndex++;\n }\n }\n\n _validateFinalBatchContext(\n curContext,\n nextQueueIndex,\n queueLength,\n queueRef\n );\n\n require(\n msg.data.length == nextTransactionPtr,\n \"Not all sequencer transactions were processed.\"\n );\n\n require(\n leafIndex == totalElementsToAppend,\n \"Actual transaction index does not match expected total elements to append.\"\n );\n\n // Generate the required metadata that we need to append this batch\n uint40 numQueuedTransactions = totalElementsToAppend - numSequencerTransactions;\n uint40 blockTimestamp;\n uint40 blockNumber;\n if (curContext.numSubsequentQueueTransactions == 0) {\n // The last element is a sequencer tx, therefore pull timestamp and block number from the last context.\n blockTimestamp = uint40(curContext.timestamp);\n blockNumber = uint40(curContext.blockNumber);\n } else {\n // The last element is a queue tx, therefore pull timestamp and block number from the queue element.\n // curContext.numSubsequentQueueTransactions > 0 which means that we've processed at least one queue element.\n // We increment nextQueueIndex after processing each queue element,\n // so the index of the last element we processed is nextQueueIndex - 1.\n Lib_OVMCodec.QueueElement memory lastElement = _getQueueElement(\n nextQueueIndex - 1,\n queueRef\n );\n\n blockTimestamp = lastElement.timestamp;\n blockNumber = lastElement.blockNumber;\n }\n\n // For efficiency reasons getMerkleRoot modifies the `leaves` argument in place\n // while calculating the root hash therefore any arguments passed to it must not\n // be used again afterwards\n _appendBatch(\n Lib_MerkleTree.getMerkleRoot(leaves),\n totalElementsToAppend,\n numQueuedTransactions,\n blockTimestamp,\n blockNumber\n );\n\n emit SequencerBatchAppended(\n nextQueueIndex - numQueuedTransactions,\n numQueuedTransactions,\n getTotalElements()\n );\n }\n\n /**\n * Verifies whether a transaction is included in the chain.\n * @param _transaction Transaction to verify.\n * @param _txChainElement Transaction chain element corresponding to the transaction.\n * @param _batchHeader Header of the batch the transaction was included in.\n * @param _inclusionProof Inclusion proof for the provided transaction chain element.\n * @return True if the transaction exists in the CTC, false if not.\n */\n function verifyTransaction(\n Lib_OVMCodec.Transaction memory _transaction,\n Lib_OVMCodec.TransactionChainElement memory _txChainElement,\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _inclusionProof\n )\n override\n public\n view\n returns (\n bool\n )\n {\n if (_txChainElement.isSequenced == true) {\n return _verifySequencerTransaction(\n _transaction,\n _txChainElement,\n _batchHeader,\n _inclusionProof\n );\n } else {\n return _verifyQueueTransaction(\n _transaction,\n _txChainElement.queueIndex,\n _batchHeader,\n _inclusionProof\n );\n }\n }\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Returns the BatchContext located at a particular index.\n * @param _index The index of the BatchContext\n * @return The BatchContext at the specified index.\n */\n function _getBatchContext(\n uint256 _index\n )\n internal\n pure\n returns (\n BatchContext memory\n )\n {\n uint256 contextPtr = 15 + _index * BATCH_CONTEXT_SIZE;\n uint256 numSequencedTransactions;\n uint256 numSubsequentQueueTransactions;\n uint256 ctxTimestamp;\n uint256 ctxBlockNumber;\n\n assembly {\n numSequencedTransactions := shr(232, calldataload(contextPtr))\n numSubsequentQueueTransactions := shr(232, calldataload(add(contextPtr, 3)))\n ctxTimestamp := shr(216, calldataload(add(contextPtr, 6)))\n ctxBlockNumber := shr(216, calldataload(add(contextPtr, 11)))\n }\n\n return BatchContext({\n numSequencedTransactions: numSequencedTransactions,\n numSubsequentQueueTransactions: numSubsequentQueueTransactions,\n timestamp: ctxTimestamp,\n blockNumber: ctxBlockNumber\n });\n }\n\n /**\n * Parses the batch context from the extra data.\n * @return Total number of elements submitted.\n * @return Index of the next queue element.\n */\n function _getBatchExtraData()\n internal\n view\n returns (\n uint40,\n uint40,\n uint40,\n uint40\n )\n {\n bytes27 extraData = batches().getGlobalMetadata();\n\n uint40 totalElements;\n uint40 nextQueueIndex;\n uint40 lastTimestamp;\n uint40 lastBlockNumber;\n assembly {\n extraData := shr(40, extraData)\n totalElements := and(extraData, 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF)\n nextQueueIndex := shr(40, and(extraData, 0x00000000000000000000000000000000000000000000FFFFFFFFFF0000000000))\n lastTimestamp := shr(80, and(extraData, 0x0000000000000000000000000000000000FFFFFFFFFF00000000000000000000))\n lastBlockNumber := shr(120, and(extraData, 0x000000000000000000000000FFFFFFFFFF000000000000000000000000000000))\n }\n\n return (\n totalElements,\n nextQueueIndex,\n lastTimestamp,\n lastBlockNumber\n );\n }\n\n /**\n * Encodes the batch context for the extra data.\n * @param _totalElements Total number of elements submitted.\n * @param _nextQueueIndex Index of the next queue element.\n * @param _timestamp Timestamp for the last batch.\n * @param _blockNumber Block number of the last batch.\n * @return Encoded batch context.\n */\n function _makeBatchExtraData(\n uint40 _totalElements,\n uint40 _nextQueueIndex,\n uint40 _timestamp,\n uint40 _blockNumber\n )\n internal\n pure\n returns (\n bytes27\n )\n {\n bytes27 extraData;\n assembly {\n extraData := _totalElements\n extraData := or(extraData, shl(40, _nextQueueIndex))\n extraData := or(extraData, shl(80, _timestamp))\n extraData := or(extraData, shl(120, _blockNumber))\n extraData := shl(40, extraData)\n }\n\n return extraData;\n }\n\n /**\n * Retrieves the hash of a queue element.\n * @param _index Index of the queue element to retrieve a hash for.\n * @return Hash of the queue element.\n */\n function _getQueueLeafHash(\n uint256 _index\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n return _hashTransactionChainElement(\n Lib_OVMCodec.TransactionChainElement({\n isSequenced: false,\n queueIndex: _index,\n timestamp: 0,\n blockNumber: 0,\n txData: hex\"\"\n })\n );\n }\n\n /**\n * Gets the queue element at a particular index.\n * @param _index Index of the queue element to access.\n * @return _element Queue element at the given index.\n */\n function _getQueueElement(\n uint256 _index,\n iOVM_ChainStorageContainer _queueRef\n )\n internal\n view\n returns (\n Lib_OVMCodec.QueueElement memory _element\n )\n {\n // The underlying queue data structure stores 2 elements\n // per insertion, so to get the actual desired queue index\n // we need to multiply by 2.\n uint40 trueIndex = uint40(_index * 2);\n bytes32 transactionHash = _queueRef.get(trueIndex);\n bytes32 timestampAndBlockNumber = _queueRef.get(trueIndex + 1);\n\n uint40 elementTimestamp;\n uint40 elementBlockNumber;\n assembly {\n elementTimestamp := and(timestampAndBlockNumber, 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF)\n elementBlockNumber := shr(40, and(timestampAndBlockNumber, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000))\n }\n\n return Lib_OVMCodec.QueueElement({\n transactionHash: transactionHash,\n timestamp: elementTimestamp,\n blockNumber: elementBlockNumber\n });\n }\n\n /**\n * Retrieves the length of the queue.\n * @return Length of the queue.\n */\n function _getQueueLength(\n iOVM_ChainStorageContainer _queueRef\n )\n internal\n view\n returns (\n uint40\n )\n {\n // The underlying queue data structure stores 2 elements\n // per insertion, so to get the real queue length we need\n // to divide by 2.\n return uint40(_queueRef.length() / 2);\n }\n\n /**\n * Retrieves the hash of a sequencer element.\n * @param _context Batch context for the given element.\n * @param _nextTransactionPtr Pointer to the next transaction in the calldata.\n * @param _txDataLength Length of the transaction item.\n * @return Hash of the sequencer element.\n */\n function _getSequencerLeafHash(\n BatchContext memory _context,\n uint256 _nextTransactionPtr,\n uint256 _txDataLength,\n bytes memory _hashMemory\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n // Only allocate more memory if we didn't reserve enough to begin with.\n if (BYTES_TILL_TX_DATA + _txDataLength > _hashMemory.length) {\n _hashMemory = new bytes(BYTES_TILL_TX_DATA + _txDataLength);\n }\n\n uint256 ctxTimestamp = _context.timestamp;\n uint256 ctxBlockNumber = _context.blockNumber;\n\n bytes32 leafHash;\n assembly {\n let chainElementStart := add(_hashMemory, 0x20)\n\n // Set the first byte equal to `1` to indicate this is a sequencer chain element.\n // This distinguishes sequencer ChainElements from queue ChainElements because\n // all queue ChainElements are ABI encoded and the first byte of ABI encoded\n // elements is always zero\n mstore8(chainElementStart, 1)\n\n mstore(add(chainElementStart, 1), ctxTimestamp)\n mstore(add(chainElementStart, 33), ctxBlockNumber)\n\n calldatacopy(add(chainElementStart, BYTES_TILL_TX_DATA), add(_nextTransactionPtr, 3), _txDataLength)\n\n leafHash := keccak256(chainElementStart, add(BYTES_TILL_TX_DATA, _txDataLength))\n }\n\n return leafHash;\n }\n\n /**\n * Retrieves the hash of a sequencer element.\n * @param _txChainElement The chain element which is hashed to calculate the leaf.\n * @return Hash of the sequencer element.\n */\n function _getSequencerLeafHash(\n Lib_OVMCodec.TransactionChainElement memory _txChainElement\n )\n internal\n view\n returns(\n bytes32\n )\n {\n bytes memory txData = _txChainElement.txData;\n uint256 txDataLength = _txChainElement.txData.length;\n\n bytes memory chainElement = new bytes(BYTES_TILL_TX_DATA + txDataLength);\n uint256 ctxTimestamp = _txChainElement.timestamp;\n uint256 ctxBlockNumber = _txChainElement.blockNumber;\n\n bytes32 leafHash;\n assembly {\n let chainElementStart := add(chainElement, 0x20)\n\n // Set the first byte equal to `1` to indicate this is a sequencer chain element.\n // This distinguishes sequencer ChainElements from queue ChainElements because\n // all queue ChainElements are ABI encoded and the first byte of ABI encoded\n // elements is always zero\n mstore8(chainElementStart, 1)\n\n mstore(add(chainElementStart, 1), ctxTimestamp)\n mstore(add(chainElementStart, 33), ctxBlockNumber)\n\n pop(staticcall(gas(), 0x04, add(txData, 0x20), txDataLength, add(chainElementStart, BYTES_TILL_TX_DATA), txDataLength))\n\n leafHash := keccak256(chainElementStart, add(BYTES_TILL_TX_DATA, txDataLength))\n }\n\n return leafHash;\n }\n\n /**\n * Inserts a batch into the chain of batches.\n * @param _transactionRoot Root of the transaction tree for this batch.\n * @param _batchSize Number of elements in the batch.\n * @param _numQueuedTransactions Number of queue transactions in the batch.\n * @param _timestamp The latest batch timestamp.\n * @param _blockNumber The latest batch blockNumber.\n */\n function _appendBatch(\n bytes32 _transactionRoot,\n uint256 _batchSize,\n uint256 _numQueuedTransactions,\n uint40 _timestamp,\n uint40 _blockNumber\n )\n internal\n {\n iOVM_ChainStorageContainer batchesRef = batches();\n (uint40 totalElements, uint40 nextQueueIndex,,) = _getBatchExtraData();\n\n Lib_OVMCodec.ChainBatchHeader memory header = Lib_OVMCodec.ChainBatchHeader({\n batchIndex: batchesRef.length(),\n batchRoot: _transactionRoot,\n batchSize: _batchSize,\n prevTotalElements: totalElements,\n extraData: hex\"\"\n });\n\n emit TransactionBatchAppended(\n header.batchIndex,\n header.batchRoot,\n header.batchSize,\n header.prevTotalElements,\n header.extraData\n );\n\n bytes32 batchHeaderHash = Lib_OVMCodec.hashBatchHeader(header);\n bytes27 latestBatchContext = _makeBatchExtraData(\n totalElements + uint40(header.batchSize),\n nextQueueIndex + uint40(_numQueuedTransactions),\n _timestamp,\n _blockNumber\n );\n\n batchesRef.push(batchHeaderHash, latestBatchContext);\n }\n\n /**\n * Checks that the first batch context in a sequencer submission is valid\n * @param _firstContext The batch context to validate.\n */\n function _validateFirstBatchContext(\n BatchContext memory _firstContext\n )\n internal\n view\n {\n // If there are existing elements, this batch must have the same context\n // or a later timestamp and block number.\n if (getTotalElements() > 0) {\n (,, uint40 lastTimestamp, uint40 lastBlockNumber) = _getBatchExtraData();\n\n require(\n _firstContext.blockNumber >= lastBlockNumber,\n \"Context block number is lower than last submitted.\"\n );\n\n require(\n _firstContext.timestamp >= lastTimestamp,\n \"Context timestamp is lower than last submitted.\"\n );\n }\n\n // Sequencer cannot submit contexts which are more than the force inclusion period old.\n require(\n _firstContext.timestamp + forceInclusionPeriodSeconds >= block.timestamp,\n \"Context timestamp too far in the past.\"\n );\n\n require(\n _firstContext.blockNumber + forceInclusionPeriodBlocks >= block.number,\n \"Context block number too far in the past.\"\n );\n }\n\n /**\n * Checks that a given batch context has a time context which is below a given que element\n * @param _context The batch context to validate has values lower.\n * @param _queueIndex Index of the queue element we are validating came later than the context.\n * @param _queueRef The storage container for the queue.\n */\n function _validateContextBeforeEnqueue(\n BatchContext memory _context,\n uint40 _queueIndex,\n iOVM_ChainStorageContainer _queueRef\n )\n internal\n view\n {\n Lib_OVMCodec.QueueElement memory nextQueueElement = _getQueueElement(\n _queueIndex,\n _queueRef\n );\n\n // If the force inclusion period has passed for an enqueued transaction, it MUST be the next chain element.\n require(\n block.timestamp < nextQueueElement.timestamp + forceInclusionPeriodSeconds,\n \"Previously enqueued batches have expired and must be appended before a new sequencer batch.\"\n );\n\n // Just like sequencer transaction times must be increasing relative to each other,\n // We also require that they be increasing relative to any interspersed queue elements.\n require(\n _context.timestamp <= nextQueueElement.timestamp,\n \"Sequencer transaction timestamp exceeds that of next queue element.\"\n );\n\n require(\n _context.blockNumber <= nextQueueElement.blockNumber,\n \"Sequencer transaction blockNumber exceeds that of next queue element.\"\n );\n }\n\n /**\n * Checks that a given batch context is valid based on its previous context, and the next queue elemtent.\n * @param _prevContext The previously validated batch context.\n * @param _nextContext The batch context to validate with this call.\n * @param _nextQueueIndex Index of the next queue element to process for the _nextContext's subsequentQueueElements.\n * @param _queueRef The storage container for the queue.\n */\n function _validateNextBatchContext(\n BatchContext memory _prevContext,\n BatchContext memory _nextContext,\n uint40 _nextQueueIndex,\n iOVM_ChainStorageContainer _queueRef\n )\n internal\n view\n {\n // All sequencer transactions' times must be greater than or equal to the previous ones.\n require(\n _nextContext.timestamp >= _prevContext.timestamp,\n \"Context timestamp values must monotonically increase.\"\n );\n\n require(\n _nextContext.blockNumber >= _prevContext.blockNumber,\n \"Context blockNumber values must monotonically increase.\"\n );\n\n // If there is going to be a queue element pulled in from this context:\n if (_nextContext.numSubsequentQueueTransactions > 0) {\n _validateContextBeforeEnqueue(\n _nextContext,\n _nextQueueIndex,\n _queueRef\n );\n }\n }\n\n /**\n * Checks that the final batch context in a sequencer submission is valid.\n * @param _finalContext The batch context to validate.\n * @param _queueLength The length of the queue at the start of the batchAppend call.\n * @param _nextQueueIndex The next element in the queue that will be pulled into the CTC.\n * @param _queueRef The storage container for the queue.\n */\n function _validateFinalBatchContext(\n BatchContext memory _finalContext,\n uint40 _nextQueueIndex,\n uint40 _queueLength,\n iOVM_ChainStorageContainer _queueRef\n )\n internal\n view\n {\n // If the queue is not now empty, check the mononoticity of whatever the next batch that will come in is.\n if (_queueLength - _nextQueueIndex > 0 && _finalContext.numSubsequentQueueTransactions == 0) {\n _validateContextBeforeEnqueue(\n _finalContext,\n _nextQueueIndex,\n _queueRef\n );\n }\n // Batches cannot be added from the future, or subsequent enqueue() contexts would violate monotonicity.\n require(_finalContext.timestamp <= block.timestamp, \"Context timestamp is from the future.\");\n require(_finalContext.blockNumber <= block.number, \"Context block number is from the future.\");\n }\n\n /**\n * Hashes a transaction chain element.\n * @param _element Chain element to hash.\n * @return Hash of the chain element.\n */\n function _hashTransactionChainElement(\n Lib_OVMCodec.TransactionChainElement memory _element\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n return keccak256(\n abi.encode(\n _element.isSequenced,\n _element.queueIndex,\n _element.timestamp,\n _element.blockNumber,\n _element.txData\n )\n );\n }\n\n /**\n * Verifies a sequencer transaction, returning true if it was indeed included in the CTC\n * @param _transaction The transaction we are verifying inclusion of.\n * @param _txChainElement The chain element that the transaction is claimed to be a part of.\n * @param _batchHeader Header of the batch the transaction was included in.\n * @param _inclusionProof An inclusion proof into the CTC at a particular index.\n * @return True if the transaction was included in the specified location, else false.\n */\n function _verifySequencerTransaction(\n Lib_OVMCodec.Transaction memory _transaction,\n Lib_OVMCodec.TransactionChainElement memory _txChainElement,\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _inclusionProof\n )\n internal\n view\n returns (\n bool\n )\n {\n OVM_ExecutionManager ovmExecutionManager = OVM_ExecutionManager(resolve(\"OVM_ExecutionManager\"));\n uint256 gasLimit = ovmExecutionManager.getMaxTransactionGasLimit();\n bytes32 leafHash = _getSequencerLeafHash(_txChainElement);\n\n require(\n _verifyElement(\n leafHash,\n _batchHeader,\n _inclusionProof\n ),\n \"Invalid Sequencer transaction inclusion proof.\"\n );\n\n require(\n _transaction.blockNumber == _txChainElement.blockNumber\n && _transaction.timestamp == _txChainElement.timestamp\n && _transaction.entrypoint == resolve(\"OVM_DecompressionPrecompileAddress\")\n && _transaction.gasLimit == gasLimit\n && _transaction.l1TxOrigin == address(0)\n && _transaction.l1QueueOrigin == Lib_OVMCodec.QueueOrigin.SEQUENCER_QUEUE\n && keccak256(_transaction.data) == keccak256(_txChainElement.txData),\n \"Invalid Sequencer transaction.\"\n );\n\n return true;\n }\n\n /**\n * Verifies a queue transaction, returning true if it was indeed included in the CTC\n * @param _transaction The transaction we are verifying inclusion of.\n * @param _queueIndex The queueIndex of the queued transaction.\n * @param _batchHeader Header of the batch the transaction was included in.\n * @param _inclusionProof An inclusion proof into the CTC at a particular index (should point to queue tx).\n * @return True if the transaction was included in the specified location, else false.\n */\n function _verifyQueueTransaction(\n Lib_OVMCodec.Transaction memory _transaction,\n uint256 _queueIndex,\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _inclusionProof\n )\n internal\n view\n returns (\n bool\n )\n {\n bytes32 leafHash = _getQueueLeafHash(_queueIndex);\n\n require(\n _verifyElement(\n leafHash,\n _batchHeader,\n _inclusionProof\n ),\n \"Invalid Queue transaction inclusion proof.\"\n );\n\n bytes32 transactionHash = keccak256(\n abi.encode(\n _transaction.l1TxOrigin,\n _transaction.entrypoint,\n _transaction.gasLimit,\n _transaction.data\n )\n );\n\n Lib_OVMCodec.QueueElement memory el = getQueueElement(_queueIndex);\n require(\n el.transactionHash == transactionHash\n && el.timestamp == _transaction.timestamp\n && el.blockNumber == _transaction.blockNumber,\n \"Invalid Queue transaction.\"\n );\n\n return true;\n }\n\n /**\n * Verifies a batch inclusion proof.\n * @param _element Hash of the element to verify a proof for.\n * @param _batchHeader Header of the batch in which the element was included.\n * @param _proof Merkle inclusion proof for the element.\n */\n function _verifyElement(\n bytes32 _element,\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _proof\n )\n internal\n view\n returns (\n bool\n )\n {\n require(\n Lib_OVMCodec.hashBatchHeader(_batchHeader) == batches().get(uint32(_batchHeader.batchIndex)),\n \"Invalid batch header.\"\n );\n\n require(\n Lib_MerkleTree.verify(\n _batchHeader.batchRoot,\n _element,\n _proof.index,\n _proof.siblings,\n _batchHeader.batchSize\n ),\n \"Invalid inclusion proof.\"\n );\n\n return true;\n }\n}\n" + }, + "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol": { + "content": "// SPDX-License-Identifier: MIT\n// @unsupported: ovm\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\nimport { Lib_EthUtils } from \"../../libraries/utils/Lib_EthUtils.sol\";\nimport { Lib_ErrorUtils } from \"../../libraries/utils/Lib_ErrorUtils.sol\";\n\n/* Interface Imports */\nimport { iOVM_ExecutionManager } from \"../../iOVM/execution/iOVM_ExecutionManager.sol\";\nimport { iOVM_StateManager } from \"../../iOVM/execution/iOVM_StateManager.sol\";\nimport { iOVM_SafetyChecker } from \"../../iOVM/execution/iOVM_SafetyChecker.sol\";\n\n/* Contract Imports */\nimport { OVM_DeployerWhitelist } from \"../predeploys/OVM_DeployerWhitelist.sol\";\n\n/**\n * @title OVM_ExecutionManager\n * @dev The Execution Manager (EM) is the core of our OVM implementation, and provides a sandboxed\n * environment allowing us to execute OVM transactions deterministically on either Layer 1 or\n * Layer 2.\n * The EM's run() function is the first function called during the execution of any\n * transaction on L2.\n * For each context-dependent EVM operation the EM has a function which implements a corresponding\n * OVM operation, which will read state from the State Manager contract.\n * The EM relies on the Safety Checker to verify that code deployed to Layer 2 does not contain any\n * context-dependent operations.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract OVM_ExecutionManager is iOVM_ExecutionManager, Lib_AddressResolver {\n\n /********************************\n * External Contract References *\n ********************************/\n\n iOVM_SafetyChecker internal ovmSafetyChecker;\n iOVM_StateManager internal ovmStateManager;\n\n\n /*******************************\n * Execution Context Variables *\n *******************************/\n\n GasMeterConfig internal gasMeterConfig;\n GlobalContext internal globalContext;\n TransactionContext internal transactionContext;\n MessageContext internal messageContext;\n TransactionRecord internal transactionRecord;\n MessageRecord internal messageRecord;\n\n\n /**************************\n * Gas Metering Constants *\n **************************/\n\n address constant GAS_METADATA_ADDRESS = 0x06a506A506a506A506a506a506A506A506A506A5;\n uint256 constant NUISANCE_GAS_SLOAD = 20000;\n uint256 constant NUISANCE_GAS_SSTORE = 20000;\n uint256 constant MIN_NUISANCE_GAS_PER_CONTRACT = 30000;\n uint256 constant NUISANCE_GAS_PER_CONTRACT_BYTE = 100;\n uint256 constant MIN_GAS_FOR_INVALID_STATE_ACCESS = 30000;\n\n /**************************\n * Default Context Values *\n **************************/\n\n uint256 constant DEFAULT_UINT256 = 0xdefa017defa017defa017defa017defa017defa017defa017defa017defa017d;\n address constant DEFAULT_ADDRESS = 0xdEfa017defA017DeFA017DEfa017DeFA017DeFa0;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n constructor(\n address _libAddressManager,\n GasMeterConfig memory _gasMeterConfig,\n GlobalContext memory _globalContext\n )\n Lib_AddressResolver(_libAddressManager)\n {\n ovmSafetyChecker = iOVM_SafetyChecker(resolve(\"OVM_SafetyChecker\"));\n gasMeterConfig = _gasMeterConfig;\n globalContext = _globalContext;\n _resetContext();\n }\n\n\n /**********************\n * Function Modifiers *\n **********************/\n\n /**\n * Applies dynamically-sized refund to a transaction to account for the difference in execution\n * between L1 and L2, so that the overall cost of the ovmOPCODE is fixed.\n * @param _cost Desired gas cost for the function after the refund.\n */\n modifier netGasCost(\n uint256 _cost\n ) {\n uint256 gasProvided = gasleft();\n _;\n uint256 gasUsed = gasProvided - gasleft();\n\n // We want to refund everything *except* the specified cost.\n if (_cost < gasUsed) {\n transactionRecord.ovmGasRefund += gasUsed - _cost;\n }\n }\n\n /**\n * Applies a fixed-size gas refund to a transaction to account for the difference in execution\n * between L1 and L2, so that the overall cost of an ovmOPCODE can be lowered.\n * @param _discount Amount of gas cost to refund for the ovmOPCODE.\n */\n modifier fixedGasDiscount(\n uint256 _discount\n ) {\n uint256 gasProvided = gasleft();\n _;\n uint256 gasUsed = gasProvided - gasleft();\n\n // We want to refund the specified _discount, unless this risks underflow.\n if (_discount < gasUsed) {\n transactionRecord.ovmGasRefund += _discount;\n } else {\n // refund all we can without risking underflow.\n transactionRecord.ovmGasRefund += gasUsed;\n }\n }\n\n /**\n * Makes sure we're not inside a static context.\n */\n modifier notStatic() {\n if (messageContext.isStatic == true) {\n _revertWithFlag(RevertFlag.STATIC_VIOLATION);\n }\n _;\n }\n\n\n /************************************\n * Transaction Execution Entrypoint *\n ************************************/\n\n /**\n * Starts the execution of a transaction via the OVM_ExecutionManager.\n * @param _transaction Transaction data to be executed.\n * @param _ovmStateManager iOVM_StateManager implementation providing account state.\n */\n function run(\n Lib_OVMCodec.Transaction memory _transaction,\n address _ovmStateManager\n )\n override\n external\n returns (\n bytes memory\n )\n {\n // Make sure that run() is not re-enterable. This condition should always be satisfied\n // Once run has been called once, due to the behavior of _isValidInput().\n if (transactionContext.ovmNUMBER != DEFAULT_UINT256) {\n return bytes(\"\");\n }\n\n // Store our OVM_StateManager instance (significantly easier than attempting to pass the\n // address around in calldata).\n ovmStateManager = iOVM_StateManager(_ovmStateManager);\n\n // Make sure this function can't be called by anyone except the owner of the\n // OVM_StateManager (expected to be an OVM_StateTransitioner). We can revert here because\n // this would make the `run` itself invalid.\n require(\n // This method may return false during fraud proofs, but always returns true in L2 nodes' State Manager precompile.\n ovmStateManager.isAuthenticated(msg.sender),\n \"Only authenticated addresses in ovmStateManager can call this function\"\n );\n\n // Initialize the execution context, must be initialized before we perform any gas metering\n // or we'll throw a nuisance gas error.\n _initContext(_transaction);\n\n // TEMPORARY: Gas metering is disabled for minnet.\n // // Check whether we need to start a new epoch, do so if necessary.\n // _checkNeedsNewEpoch(_transaction.timestamp);\n\n // Make sure the transaction's gas limit is valid. We don't revert here because we reserve\n // reverts for INVALID_STATE_ACCESS.\n if (_isValidInput(_transaction) == false) {\n _resetContext();\n return bytes(\"\");\n }\n\n // TEMPORARY: Gas metering is disabled for minnet.\n // // Check gas right before the call to get total gas consumed by OVM transaction.\n // uint256 gasProvided = gasleft();\n\n // Run the transaction, make sure to meter the gas usage.\n (, bytes memory returndata) = ovmCALL(\n _transaction.gasLimit - gasMeterConfig.minTransactionGasLimit,\n _transaction.entrypoint,\n _transaction.data\n );\n\n // TEMPORARY: Gas metering is disabled for minnet.\n // // Update the cumulative gas based on the amount of gas used.\n // uint256 gasUsed = gasProvided - gasleft();\n // _updateCumulativeGas(gasUsed, _transaction.l1QueueOrigin);\n\n // Wipe the execution context.\n _resetContext();\n\n return returndata;\n }\n\n\n /******************************\n * Opcodes: Execution Context *\n ******************************/\n\n /**\n * @notice Overrides CALLER.\n * @return _CALLER Address of the CALLER within the current message context.\n */\n function ovmCALLER()\n override\n external\n view\n returns (\n address _CALLER\n )\n {\n return messageContext.ovmCALLER;\n }\n\n /**\n * @notice Overrides ADDRESS.\n * @return _ADDRESS Active ADDRESS within the current message context.\n */\n function ovmADDRESS()\n override\n public\n view\n returns (\n address _ADDRESS\n )\n {\n return messageContext.ovmADDRESS;\n }\n\n /**\n * @notice Overrides TIMESTAMP.\n * @return _TIMESTAMP Value of the TIMESTAMP within the transaction context.\n */\n function ovmTIMESTAMP()\n override\n external\n view\n returns (\n uint256 _TIMESTAMP\n )\n {\n return transactionContext.ovmTIMESTAMP;\n }\n\n /**\n * @notice Overrides NUMBER.\n * @return _NUMBER Value of the NUMBER within the transaction context.\n */\n function ovmNUMBER()\n override\n external\n view\n returns (\n uint256 _NUMBER\n )\n {\n return transactionContext.ovmNUMBER;\n }\n\n /**\n * @notice Overrides GASLIMIT.\n * @return _GASLIMIT Value of the block's GASLIMIT within the transaction context.\n */\n function ovmGASLIMIT()\n override\n external\n view\n returns (\n uint256 _GASLIMIT\n )\n {\n return transactionContext.ovmGASLIMIT;\n }\n\n /**\n * @notice Overrides CHAINID.\n * @return _CHAINID Value of the chain's CHAINID within the global context.\n */\n function ovmCHAINID()\n override\n external\n view\n returns (\n uint256 _CHAINID\n )\n {\n return globalContext.ovmCHAINID;\n }\n\n /*********************************\n * Opcodes: L2 Execution Context *\n *********************************/\n\n /**\n * @notice Specifies from which source (Sequencer or Queue) this transaction originated from.\n * @return _queueOrigin Enum indicating the ovmL1QUEUEORIGIN within the current message context.\n */\n function ovmL1QUEUEORIGIN()\n override\n external\n view\n returns (\n Lib_OVMCodec.QueueOrigin _queueOrigin\n )\n {\n return transactionContext.ovmL1QUEUEORIGIN;\n }\n\n /**\n * @notice Specifies which L1 account, if any, sent this transaction by calling enqueue().\n * @return _l1TxOrigin Address of the account which sent the tx into L2 from L1.\n */\n function ovmL1TXORIGIN()\n override\n external\n view\n returns (\n address _l1TxOrigin\n )\n {\n return transactionContext.ovmL1TXORIGIN;\n }\n\n /********************\n * Opcodes: Halting *\n ********************/\n\n /**\n * @notice Overrides REVERT.\n * @param _data Bytes data to pass along with the REVERT.\n */\n function ovmREVERT(\n bytes memory _data\n )\n override\n public\n {\n _revertWithFlag(RevertFlag.INTENTIONAL_REVERT, _data);\n }\n\n\n /******************************\n * Opcodes: Contract Creation *\n ******************************/\n\n /**\n * @notice Overrides CREATE.\n * @param _bytecode Code to be used to CREATE a new contract.\n * @return Address of the created contract.\n * @return Revert data, if and only if the creation threw an exception.\n */\n function ovmCREATE(\n bytes memory _bytecode\n )\n override\n public\n notStatic\n fixedGasDiscount(40000)\n returns (\n address,\n bytes memory\n )\n {\n // Creator is always the current ADDRESS.\n address creator = ovmADDRESS();\n\n // Check that the deployer is whitelisted, or\n // that arbitrary contract deployment has been enabled.\n _checkDeployerAllowed(creator);\n\n // Generate the correct CREATE address.\n address contractAddress = Lib_EthUtils.getAddressForCREATE(\n creator,\n _getAccountNonce(creator)\n );\n\n return _createContract(\n contractAddress,\n _bytecode\n );\n }\n\n /**\n * @notice Overrides CREATE2.\n * @param _bytecode Code to be used to CREATE2 a new contract.\n * @param _salt Value used to determine the contract's address.\n * @return Address of the created contract.\n * @return Revert data, if and only if the creation threw an exception.\n */\n function ovmCREATE2(\n bytes memory _bytecode,\n bytes32 _salt\n )\n override\n external\n notStatic\n fixedGasDiscount(40000)\n returns (\n address,\n bytes memory\n )\n {\n // Creator is always the current ADDRESS.\n address creator = ovmADDRESS();\n\n // Check that the deployer is whitelisted, or\n // that arbitrary contract deployment has been enabled.\n _checkDeployerAllowed(creator);\n\n // Generate the correct CREATE2 address.\n address contractAddress = Lib_EthUtils.getAddressForCREATE2(\n creator,\n _bytecode,\n _salt\n );\n\n return _createContract(\n contractAddress,\n _bytecode\n );\n }\n\n\n /*******************************\n * Account Abstraction Opcodes *\n ******************************/\n\n /**\n * Retrieves the nonce of the current ovmADDRESS.\n * @return _nonce Nonce of the current contract.\n */\n function ovmGETNONCE()\n override\n external\n returns (\n uint256 _nonce\n )\n {\n return _getAccountNonce(ovmADDRESS());\n }\n\n /**\n * Bumps the nonce of the current ovmADDRESS by one.\n */\n function ovmINCREMENTNONCE()\n override\n external\n notStatic\n {\n address account = ovmADDRESS();\n uint256 nonce = _getAccountNonce(account);\n\n // Prevent overflow.\n if (nonce + 1 > nonce) {\n _setAccountNonce(account, nonce + 1);\n }\n }\n\n /**\n * Creates a new EOA contract account, for account abstraction.\n * @dev Essentially functions like ovmCREATE or ovmCREATE2, but we can bypass a lot of checks\n * because the contract we're creating is trusted (no need to do safety checking or to\n * handle unexpected reverts). Doesn't need to return an address because the address is\n * assumed to be the user's actual address.\n * @param _messageHash Hash of a message signed by some user, for verification.\n * @param _v Signature `v` parameter.\n * @param _r Signature `r` parameter.\n * @param _s Signature `s` parameter.\n */\n function ovmCREATEEOA(\n bytes32 _messageHash,\n uint8 _v,\n bytes32 _r,\n bytes32 _s\n )\n override\n public\n notStatic\n {\n // Recover the EOA address from the message hash and signature parameters. Since we do the\n // hashing in advance, we don't have handle different message hashing schemes. Even if this\n // function were to return the wrong address (rather than explicitly returning the zero\n // address), the rest of the transaction would simply fail (since there's no EOA account to\n // actually execute the transaction).\n address eoa = ecrecover(\n _messageHash,\n _v + 27,\n _r,\n _s\n );\n\n // Invalid signature is a case we proactively handle with a revert. We could alternatively\n // have this function return a `success` boolean, but this is just easier.\n if (eoa == address(0)) {\n ovmREVERT(bytes(\"Signature provided for EOA contract creation is invalid.\"));\n }\n\n // If the user already has an EOA account, then there's no need to perform this operation.\n if (_hasEmptyAccount(eoa) == false) {\n return;\n }\n\n // We always need to initialize the contract with the default account values.\n _initPendingAccount(eoa);\n\n // Temporarily set the current address so it's easier to access on L2.\n address prevADDRESS = messageContext.ovmADDRESS;\n messageContext.ovmADDRESS = eoa;\n\n // Creates a duplicate of the OVM_ProxyEOA located at 0x42....09. Uses the following\n // \"magic\" prefix to deploy an exact copy of the code:\n // PUSH1 0x0D # size of this prefix in bytes\n // CODESIZE\n // SUB # subtract prefix size from codesize\n // DUP1\n // PUSH1 0x0D\n // PUSH1 0x00\n // CODECOPY # copy everything after prefix into memory at pos 0\n // PUSH1 0x00\n // RETURN # return the copied code\n address proxyEOA = Lib_EthUtils.createContract(abi.encodePacked(\n hex\"600D380380600D6000396000f3\",\n ovmEXTCODECOPY(\n 0x4200000000000000000000000000000000000009,\n 0,\n ovmEXTCODESIZE(0x4200000000000000000000000000000000000009)\n )\n ));\n\n // Reset the address now that we're done deploying.\n messageContext.ovmADDRESS = prevADDRESS;\n\n // Commit the account with its final values.\n _commitPendingAccount(\n eoa,\n address(proxyEOA),\n keccak256(Lib_EthUtils.getCode(address(proxyEOA)))\n );\n\n _setAccountNonce(eoa, 0);\n }\n\n\n /*********************************\n * Opcodes: Contract Interaction *\n *********************************/\n\n /**\n * @notice Overrides CALL.\n * @param _gasLimit Amount of gas to be passed into this call.\n * @param _address Address of the contract to call.\n * @param _calldata Data to send along with the call.\n * @return _success Whether or not the call returned (rather than reverted).\n * @return _returndata Data returned by the call.\n */\n function ovmCALL(\n uint256 _gasLimit,\n address _address,\n bytes memory _calldata\n )\n override\n public\n fixedGasDiscount(100000)\n returns (\n bool _success,\n bytes memory _returndata\n )\n {\n // CALL updates the CALLER and ADDRESS.\n MessageContext memory nextMessageContext = messageContext;\n nextMessageContext.ovmCALLER = nextMessageContext.ovmADDRESS;\n nextMessageContext.ovmADDRESS = _address;\n\n return _callContract(\n nextMessageContext,\n _gasLimit,\n _address,\n _calldata\n );\n }\n\n /**\n * @notice Overrides STATICCALL.\n * @param _gasLimit Amount of gas to be passed into this call.\n * @param _address Address of the contract to call.\n * @param _calldata Data to send along with the call.\n * @return _success Whether or not the call returned (rather than reverted).\n * @return _returndata Data returned by the call.\n */\n function ovmSTATICCALL(\n uint256 _gasLimit,\n address _address,\n bytes memory _calldata\n )\n override\n external\n fixedGasDiscount(80000)\n returns (\n bool _success,\n bytes memory _returndata\n )\n {\n // STATICCALL updates the CALLER, updates the ADDRESS, and runs in a static context.\n MessageContext memory nextMessageContext = messageContext;\n nextMessageContext.ovmCALLER = nextMessageContext.ovmADDRESS;\n nextMessageContext.ovmADDRESS = _address;\n nextMessageContext.isStatic = true;\n\n return _callContract(\n nextMessageContext,\n _gasLimit,\n _address,\n _calldata\n );\n }\n\n /**\n * @notice Overrides DELEGATECALL.\n * @param _gasLimit Amount of gas to be passed into this call.\n * @param _address Address of the contract to call.\n * @param _calldata Data to send along with the call.\n * @return _success Whether or not the call returned (rather than reverted).\n * @return _returndata Data returned by the call.\n */\n function ovmDELEGATECALL(\n uint256 _gasLimit,\n address _address,\n bytes memory _calldata\n )\n override\n external\n fixedGasDiscount(40000)\n returns (\n bool _success,\n bytes memory _returndata\n )\n {\n // DELEGATECALL does not change anything about the message context.\n MessageContext memory nextMessageContext = messageContext;\n\n return _callContract(\n nextMessageContext,\n _gasLimit,\n _address,\n _calldata\n );\n }\n\n\n /************************************\n * Opcodes: Contract Storage Access *\n ************************************/\n\n /**\n * @notice Overrides SLOAD.\n * @param _key 32 byte key of the storage slot to load.\n * @return _value 32 byte value of the requested storage slot.\n */\n function ovmSLOAD(\n bytes32 _key\n )\n override\n external\n netGasCost(40000)\n returns (\n bytes32 _value\n )\n {\n // We always SLOAD from the storage of ADDRESS.\n address contractAddress = ovmADDRESS();\n\n return _getContractStorage(\n contractAddress,\n _key\n );\n }\n\n /**\n * @notice Overrides SSTORE.\n * @param _key 32 byte key of the storage slot to set.\n * @param _value 32 byte value for the storage slot.\n */\n function ovmSSTORE(\n bytes32 _key,\n bytes32 _value\n )\n override\n external\n notStatic\n netGasCost(60000)\n {\n // We always SSTORE to the storage of ADDRESS.\n address contractAddress = ovmADDRESS();\n\n _putContractStorage(\n contractAddress,\n _key,\n _value\n );\n }\n\n\n /*********************************\n * Opcodes: Contract Code Access *\n *********************************/\n\n /**\n * @notice Overrides EXTCODECOPY.\n * @param _contract Address of the contract to copy code from.\n * @param _offset Offset in bytes from the start of contract code to copy beyond.\n * @param _length Total number of bytes to copy from the contract's code.\n * @return _code Bytes of code copied from the requested contract.\n */\n function ovmEXTCODECOPY(\n address _contract,\n uint256 _offset,\n uint256 _length\n )\n override\n public\n returns (\n bytes memory _code\n )\n {\n return Lib_EthUtils.getCode(\n _getAccountEthAddress(_contract),\n _offset,\n _length\n );\n }\n\n /**\n * @notice Overrides EXTCODESIZE.\n * @param _contract Address of the contract to query the size of.\n * @return _EXTCODESIZE Size of the requested contract in bytes.\n */\n function ovmEXTCODESIZE(\n address _contract\n )\n override\n public\n returns (\n uint256 _EXTCODESIZE\n )\n {\n return Lib_EthUtils.getCodeSize(\n _getAccountEthAddress(_contract)\n );\n }\n\n /**\n * @notice Overrides EXTCODEHASH.\n * @param _contract Address of the contract to query the hash of.\n * @return _EXTCODEHASH Hash of the requested contract.\n */\n function ovmEXTCODEHASH(\n address _contract\n )\n override\n external\n returns (\n bytes32 _EXTCODEHASH\n )\n {\n return Lib_EthUtils.getCodeHash(\n _getAccountEthAddress(_contract)\n );\n }\n\n /***************************************\n * Public Functions: Execution Context *\n ***************************************/\n\n function getMaxTransactionGasLimit()\n external\n view\n override\n returns (\n uint256 _maxTransactionGasLimit\n )\n {\n return gasMeterConfig.maxTransactionGasLimit;\n }\n\n /********************************************\n * Public Functions: Deployment Whitelisting *\n ********************************************/\n\n /**\n * Checks whether the given address is on the whitelist to ovmCREATE/ovmCREATE2, and reverts if not.\n * @param _deployerAddress Address attempting to deploy a contract.\n */\n function _checkDeployerAllowed(\n address _deployerAddress\n )\n internal\n {\n // From an OVM semantics perspective, this will appear identical to\n // the deployer ovmCALLing the whitelist. This is fine--in a sense, we are forcing them to.\n (bool success, bytes memory data) = ovmCALL(\n gasleft(),\n 0x4200000000000000000000000000000000000002,\n abi.encodeWithSignature(\"isDeployerAllowed(address)\", _deployerAddress)\n );\n bool isAllowed = abi.decode(data, (bool));\n\n if (!isAllowed || !success) {\n _revertWithFlag(RevertFlag.CREATOR_NOT_ALLOWED);\n }\n }\n\n /********************************************\n * Internal Functions: Contract Interaction *\n ********************************************/\n\n /**\n * Creates a new contract and associates it with some contract address.\n * @param _contractAddress Address to associate the created contract with.\n * @param _bytecode Bytecode to be used to create the contract.\n * @return Final OVM contract address.\n * @return Revertdata, if and only if the creation threw an exception.\n */\n function _createContract(\n address _contractAddress,\n bytes memory _bytecode\n )\n internal\n returns (\n address,\n bytes memory\n )\n {\n // We always update the nonce of the creating account, even if the creation fails.\n _setAccountNonce(ovmADDRESS(), _getAccountNonce(ovmADDRESS()) + 1);\n\n // We're stepping into a CREATE or CREATE2, so we need to update ADDRESS to point\n // to the contract's associated address and CALLER to point to the previous ADDRESS.\n MessageContext memory nextMessageContext = messageContext;\n nextMessageContext.ovmCALLER = messageContext.ovmADDRESS;\n nextMessageContext.ovmADDRESS = _contractAddress;\n\n // Run the common logic which occurs between call-type and create-type messages,\n // passing in the creation bytecode and `true` to trigger create-specific logic.\n (bool success, bytes memory data) = _handleExternalMessage(\n nextMessageContext,\n gasleft(),\n _contractAddress,\n _bytecode,\n true\n );\n\n // Yellow paper requires that address returned is zero if the contract deployment fails.\n return (\n success ? _contractAddress : address(0),\n data\n );\n }\n\n /**\n * Calls the deployed contract associated with a given address.\n * @param _nextMessageContext Message context to be used for the call.\n * @param _gasLimit Amount of gas to be passed into this call.\n * @param _contract OVM address to be called.\n * @param _calldata Data to send along with the call.\n * @return _success Whether or not the call returned (rather than reverted).\n * @return _returndata Data returned by the call.\n */\n function _callContract(\n MessageContext memory _nextMessageContext,\n uint256 _gasLimit,\n address _contract,\n bytes memory _calldata\n )\n internal\n returns (\n bool _success,\n bytes memory _returndata\n )\n {\n // We reserve addresses of the form 0xdeaddeaddead...NNNN for the container contracts in L2 geth.\n // So, we block calls to these addresses since they are not safe to run as an OVM contract itself.\n if (\n (uint256(_contract) & uint256(0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000))\n == uint256(0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000)\n ) {\n // EVM does not return data in the success case, see: https://github.com/ethereum/go-ethereum/blob/aae7660410f0ef90279e14afaaf2f429fdc2a186/core/vm/instructions.go#L600-L604\n return (true, hex'');\n }\n\n // Both 0x0000... and the EVM precompiles have the same address on L1 and L2 --> no trie lookup needed.\n address codeContractAddress =\n uint(_contract) < 100\n ? _contract\n : _getAccountEthAddress(_contract);\n\n return _handleExternalMessage(\n _nextMessageContext,\n _gasLimit,\n codeContractAddress,\n _calldata,\n false\n );\n }\n\n /**\n * Handles all interactions which involve the execution manager calling out to untrusted code (both calls and creates).\n * Ensures that OVM-related measures are enforced, including L2 gas refunds, nuisance gas, and flagged reversions.\n *\n * @param _nextMessageContext Message context to be used for the external message.\n * @param _gasLimit Amount of gas to be passed into this message.\n * @param _contract OVM address being called or deployed to\n * @param _data Data for the message (either calldata or creation code)\n * @param _isCreate Whether this is a create-type message.\n * @return Whether or not the message (either a call or deployment) succeeded.\n * @return Data returned by the message.\n */\n function _handleExternalMessage(\n MessageContext memory _nextMessageContext,\n uint256 _gasLimit,\n address _contract,\n bytes memory _data,\n bool _isCreate\n )\n internal\n returns (\n bool,\n bytes memory\n )\n {\n // We need to switch over to our next message context for the duration of this call.\n MessageContext memory prevMessageContext = messageContext;\n _switchMessageContext(prevMessageContext, _nextMessageContext);\n\n // Nuisance gas is a system used to bound the ability for an attacker to make fraud proofs\n // expensive by touching a lot of different accounts or storage slots. Since most contracts\n // only use a few storage slots during any given transaction, this shouldn't be a limiting\n // factor.\n uint256 prevNuisanceGasLeft = messageRecord.nuisanceGasLeft;\n uint256 nuisanceGasLimit = _getNuisanceGasLimit(_gasLimit);\n messageRecord.nuisanceGasLeft = nuisanceGasLimit;\n\n // Make the call and make sure to pass in the gas limit. Another instance of hidden\n // complexity. `_contract` is guaranteed to be a safe contract, meaning its return/revert\n // behavior can be controlled. In particular, we enforce that flags are passed through\n // revert data as to retrieve execution metadata that would normally be reverted out of\n // existence.\n\n bool success;\n bytes memory returndata;\n if (_isCreate) {\n // safeCREATE() is a function which replicates a CREATE message, but uses return values\n // Which match that of CALL (i.e. bool, bytes). This allows many security checks to be\n // to be shared between untrusted call and create call frames.\n (success, returndata) = address(this).call(\n abi.encodeWithSelector(\n this.safeCREATE.selector,\n _gasLimit,\n _data,\n _contract\n )\n );\n } else {\n (success, returndata) = _contract.call{gas: _gasLimit}(_data);\n }\n\n // Switch back to the original message context now that we're out of the call.\n _switchMessageContext(_nextMessageContext, prevMessageContext);\n\n // Assuming there were no reverts, the message record should be accurate here. We'll update\n // this value in the case of a revert.\n uint256 nuisanceGasLeft = messageRecord.nuisanceGasLeft;\n\n // Reverts at this point are completely OK, but we need to make a few updates based on the\n // information passed through the revert.\n if (success == false) {\n (\n RevertFlag flag,\n uint256 nuisanceGasLeftPostRevert,\n uint256 ovmGasRefund,\n bytes memory returndataFromFlag\n ) = _decodeRevertData(returndata);\n\n // INVALID_STATE_ACCESS is the only flag that triggers an immediate abort of the\n // parent EVM message. This behavior is necessary because INVALID_STATE_ACCESS must\n // halt any further transaction execution that could impact the execution result.\n if (flag == RevertFlag.INVALID_STATE_ACCESS) {\n _revertWithFlag(flag);\n }\n\n // INTENTIONAL_REVERT, UNSAFE_BYTECODE, STATIC_VIOLATION, and CREATOR_NOT_ALLOWED aren't\n // dependent on the input state, so we can just handle them like standard reverts. Our only change here\n // is to record the gas refund reported by the call (enforced by safety checking).\n if (\n flag == RevertFlag.INTENTIONAL_REVERT\n || flag == RevertFlag.UNSAFE_BYTECODE\n || flag == RevertFlag.STATIC_VIOLATION\n || flag == RevertFlag.CREATOR_NOT_ALLOWED\n ) {\n transactionRecord.ovmGasRefund = ovmGasRefund;\n }\n\n // INTENTIONAL_REVERT needs to pass up the user-provided return data encoded into the\n // flag, *not* the full encoded flag. All other revert types return no data.\n if (\n flag == RevertFlag.INTENTIONAL_REVERT\n || _isCreate\n ) {\n returndata = returndataFromFlag;\n } else {\n returndata = hex'';\n }\n\n // Reverts mean we need to use up whatever \"nuisance gas\" was used by the call.\n // EXCEEDS_NUISANCE_GAS explicitly reduces the remaining nuisance gas for this message\n // to zero. OUT_OF_GAS is a \"pseudo\" flag given that messages return no data when they\n // run out of gas, so we have to treat this like EXCEEDS_NUISANCE_GAS. All other flags\n // will simply pass up the remaining nuisance gas.\n nuisanceGasLeft = nuisanceGasLeftPostRevert;\n }\n\n // We need to reset the nuisance gas back to its original value minus the amount used here.\n messageRecord.nuisanceGasLeft = prevNuisanceGasLeft - (nuisanceGasLimit - nuisanceGasLeft);\n\n return (\n success,\n returndata\n );\n }\n\n /**\n * Handles the creation-specific safety measures required for OVM contract deployment.\n * This function sanitizes the return types for creation messages to match calls (bool, bytes),\n * by being an external function which the EM can call, that mimics the success/fail case of the CREATE.\n * This allows for consistent handling of both types of messages in _handleExternalMessage().\n * Having this step occur as a separate call frame also allows us to easily revert the\n * contract deployment in the event that the code is unsafe.\n *\n * @param _gasLimit Amount of gas to be passed into this creation.\n * @param _creationCode Code to pass into CREATE for deployment.\n * @param _address OVM address being deployed to.\n */\n function safeCREATE(\n uint _gasLimit,\n bytes memory _creationCode,\n address _address\n )\n external\n {\n // The only way this should callable is from within _createContract(),\n // and it should DEFINITELY not be callable by a non-EM code contract.\n if (msg.sender != address(this)) {\n return;\n }\n // Check that there is not already code at this address.\n if (_hasEmptyAccount(_address) == false) {\n // Note: in the EVM, this case burns all allotted gas. For improved\n // developer experience, we do return the remaining gas.\n _revertWithFlag(\n RevertFlag.CREATE_COLLISION,\n Lib_ErrorUtils.encodeRevertString(\"A contract has already been deployed to this address\")\n );\n }\n\n // Check the creation bytecode against the OVM_SafetyChecker.\n if (ovmSafetyChecker.isBytecodeSafe(_creationCode) == false) {\n _revertWithFlag(\n RevertFlag.UNSAFE_BYTECODE,\n Lib_ErrorUtils.encodeRevertString(\"Contract creation code contains unsafe opcodes. Did you use the right compiler or pass an unsafe constructor argument?\")\n );\n }\n\n // We always need to initialize the contract with the default account values.\n _initPendingAccount(_address);\n\n // Actually execute the EVM create message.\n // NOTE: The inline assembly below means we can NOT make any evm calls between here and then.\n address ethAddress = Lib_EthUtils.createContract(_creationCode);\n\n if (ethAddress == address(0)) {\n // If the creation fails, the EVM lets us grab its revert data. This may contain a revert flag\n // to be used above in _handleExternalMessage, so we pass the revert data back up unmodified.\n assembly {\n returndatacopy(0,0,returndatasize())\n revert(0, returndatasize())\n }\n }\n\n // Again simply checking that the deployed code is safe too. Contracts can generate\n // arbitrary deployment code, so there's no easy way to analyze this beforehand.\n bytes memory deployedCode = Lib_EthUtils.getCode(ethAddress);\n if (ovmSafetyChecker.isBytecodeSafe(deployedCode) == false) {\n _revertWithFlag(\n RevertFlag.UNSAFE_BYTECODE,\n Lib_ErrorUtils.encodeRevertString(\"Constructor attempted to deploy unsafe bytecode.\")\n );\n }\n\n // Contract creation didn't need to be reverted and the bytecode is safe. We finish up by\n // associating the desired address with the newly created contract's code hash and address.\n _commitPendingAccount(\n _address,\n ethAddress,\n Lib_EthUtils.getCodeHash(ethAddress)\n );\n }\n\n /******************************************\n * Internal Functions: State Manipulation *\n ******************************************/\n\n /**\n * Checks whether an account exists within the OVM_StateManager.\n * @param _address Address of the account to check.\n * @return _exists Whether or not the account exists.\n */\n function _hasAccount(\n address _address\n )\n internal\n returns (\n bool _exists\n )\n {\n _checkAccountLoad(_address);\n return ovmStateManager.hasAccount(_address);\n }\n\n /**\n * Checks whether a known empty account exists within the OVM_StateManager.\n * @param _address Address of the account to check.\n * @return _exists Whether or not the account empty exists.\n */\n function _hasEmptyAccount(\n address _address\n )\n internal\n returns (\n bool _exists\n )\n {\n _checkAccountLoad(_address);\n return ovmStateManager.hasEmptyAccount(_address);\n }\n\n /**\n * Sets the nonce of an account.\n * @param _address Address of the account to modify.\n * @param _nonce New account nonce.\n */\n function _setAccountNonce(\n address _address,\n uint256 _nonce\n )\n internal\n {\n _checkAccountChange(_address);\n ovmStateManager.setAccountNonce(_address, _nonce);\n }\n\n /**\n * Gets the nonce of an account.\n * @param _address Address of the account to access.\n * @return _nonce Nonce of the account.\n */\n function _getAccountNonce(\n address _address\n )\n internal\n returns (\n uint256 _nonce\n )\n {\n _checkAccountLoad(_address);\n return ovmStateManager.getAccountNonce(_address);\n }\n\n /**\n * Retrieves the Ethereum address of an account.\n * @param _address Address of the account to access.\n * @return _ethAddress Corresponding Ethereum address.\n */\n function _getAccountEthAddress(\n address _address\n )\n internal\n returns (\n address _ethAddress\n )\n {\n _checkAccountLoad(_address);\n return ovmStateManager.getAccountEthAddress(_address);\n }\n\n /**\n * Creates the default account object for the given address.\n * @param _address Address of the account create.\n */\n function _initPendingAccount(\n address _address\n )\n internal\n {\n // Although it seems like `_checkAccountChange` would be more appropriate here, we don't\n // actually consider an account \"changed\" until it's inserted into the state (in this case\n // by `_commitPendingAccount`).\n _checkAccountLoad(_address);\n ovmStateManager.initPendingAccount(_address);\n }\n\n /**\n * Stores additional relevant data for a new account, thereby \"committing\" it to the state.\n * This function is only called during `ovmCREATE` and `ovmCREATE2` after a successful contract\n * creation.\n * @param _address Address of the account to commit.\n * @param _ethAddress Address of the associated deployed contract.\n * @param _codeHash Hash of the code stored at the address.\n */\n function _commitPendingAccount(\n address _address,\n address _ethAddress,\n bytes32 _codeHash\n )\n internal\n {\n _checkAccountChange(_address);\n ovmStateManager.commitPendingAccount(\n _address,\n _ethAddress,\n _codeHash\n );\n }\n\n /**\n * Retrieves the value of a storage slot.\n * @param _contract Address of the contract to query.\n * @param _key 32 byte key of the storage slot.\n * @return _value 32 byte storage slot value.\n */\n function _getContractStorage(\n address _contract,\n bytes32 _key\n )\n internal\n returns (\n bytes32 _value\n )\n {\n _checkContractStorageLoad(_contract, _key);\n return ovmStateManager.getContractStorage(_contract, _key);\n }\n\n /**\n * Sets the value of a storage slot.\n * @param _contract Address of the contract to modify.\n * @param _key 32 byte key of the storage slot.\n * @param _value 32 byte storage slot value.\n */\n function _putContractStorage(\n address _contract,\n bytes32 _key,\n bytes32 _value\n )\n internal\n {\n // We don't set storage if the value didn't change. Although this acts as a convenient\n // optimization, it's also necessary to avoid the case in which a contract with no storage\n // attempts to store the value \"0\" at any key. Putting this value (and therefore requiring\n // that the value be committed into the storage trie after execution) would incorrectly\n // modify the storage root.\n if (_getContractStorage(_contract, _key) == _value) {\n return;\n }\n\n _checkContractStorageChange(_contract, _key);\n ovmStateManager.putContractStorage(_contract, _key, _value);\n }\n\n /**\n * Validation whenever a contract needs to be loaded. Checks that the account exists, charges\n * nuisance gas if the account hasn't been loaded before.\n * @param _address Address of the account to load.\n */\n function _checkAccountLoad(\n address _address\n )\n internal\n {\n // See `_checkContractStorageLoad` for more information.\n if (gasleft() < MIN_GAS_FOR_INVALID_STATE_ACCESS) {\n _revertWithFlag(RevertFlag.OUT_OF_GAS);\n }\n\n // See `_checkContractStorageLoad` for more information.\n if (ovmStateManager.hasAccount(_address) == false) {\n _revertWithFlag(RevertFlag.INVALID_STATE_ACCESS);\n }\n\n // Check whether the account has been loaded before and mark it as loaded if not. We need\n // this because \"nuisance gas\" only applies to the first time that an account is loaded.\n (\n bool _wasAccountAlreadyLoaded\n ) = ovmStateManager.testAndSetAccountLoaded(_address);\n\n // If we hadn't already loaded the account, then we'll need to charge \"nuisance gas\" based\n // on the size of the contract code.\n if (_wasAccountAlreadyLoaded == false) {\n _useNuisanceGas(\n (Lib_EthUtils.getCodeSize(_getAccountEthAddress(_address)) * NUISANCE_GAS_PER_CONTRACT_BYTE) + MIN_NUISANCE_GAS_PER_CONTRACT\n );\n }\n }\n\n /**\n * Validation whenever a contract needs to be changed. Checks that the account exists, charges\n * nuisance gas if the account hasn't been changed before.\n * @param _address Address of the account to change.\n */\n function _checkAccountChange(\n address _address\n )\n internal\n {\n // Start by checking for a load as we only want to charge nuisance gas proportional to\n // contract size once.\n _checkAccountLoad(_address);\n\n // Check whether the account has been changed before and mark it as changed if not. We need\n // this because \"nuisance gas\" only applies to the first time that an account is changed.\n (\n bool _wasAccountAlreadyChanged\n ) = ovmStateManager.testAndSetAccountChanged(_address);\n\n // If we hadn't already loaded the account, then we'll need to charge \"nuisance gas\" based\n // on the size of the contract code.\n if (_wasAccountAlreadyChanged == false) {\n ovmStateManager.incrementTotalUncommittedAccounts();\n _useNuisanceGas(\n (Lib_EthUtils.getCodeSize(_getAccountEthAddress(_address)) * NUISANCE_GAS_PER_CONTRACT_BYTE) + MIN_NUISANCE_GAS_PER_CONTRACT\n );\n }\n }\n\n /**\n * Validation whenever a slot needs to be loaded. Checks that the account exists, charges\n * nuisance gas if the slot hasn't been loaded before.\n * @param _contract Address of the account to load from.\n * @param _key 32 byte key to load.\n */\n function _checkContractStorageLoad(\n address _contract,\n bytes32 _key\n )\n internal\n {\n // Another case of hidden complexity. If we didn't enforce this requirement, then a\n // contract could pass in just enough gas to cause the INVALID_STATE_ACCESS check to fail\n // on L1 but not on L2. A contract could use this behavior to prevent the\n // OVM_ExecutionManager from detecting an invalid state access. Reverting with OUT_OF_GAS\n // allows us to also charge for the full message nuisance gas, because you deserve that for\n // trying to break the contract in this way.\n if (gasleft() < MIN_GAS_FOR_INVALID_STATE_ACCESS) {\n _revertWithFlag(RevertFlag.OUT_OF_GAS);\n }\n\n // We need to make sure that the transaction isn't trying to access storage that hasn't\n // been provided to the OVM_StateManager. We'll immediately abort if this is the case.\n // We know that we have enough gas to do this check because of the above test.\n if (ovmStateManager.hasContractStorage(_contract, _key) == false) {\n _revertWithFlag(RevertFlag.INVALID_STATE_ACCESS);\n }\n\n // Check whether the slot has been loaded before and mark it as loaded if not. We need\n // this because \"nuisance gas\" only applies to the first time that a slot is loaded.\n (\n bool _wasContractStorageAlreadyLoaded\n ) = ovmStateManager.testAndSetContractStorageLoaded(_contract, _key);\n\n // If we hadn't already loaded the account, then we'll need to charge some fixed amount of\n // \"nuisance gas\".\n if (_wasContractStorageAlreadyLoaded == false) {\n _useNuisanceGas(NUISANCE_GAS_SLOAD);\n }\n }\n\n /**\n * Validation whenever a slot needs to be changed. Checks that the account exists, charges\n * nuisance gas if the slot hasn't been changed before.\n * @param _contract Address of the account to change.\n * @param _key 32 byte key to change.\n */\n function _checkContractStorageChange(\n address _contract,\n bytes32 _key\n )\n internal\n {\n // Start by checking for load to make sure we have the storage slot and that we charge the\n // \"nuisance gas\" necessary to prove the storage slot state.\n _checkContractStorageLoad(_contract, _key);\n\n // Check whether the slot has been changed before and mark it as changed if not. We need\n // this because \"nuisance gas\" only applies to the first time that a slot is changed.\n (\n bool _wasContractStorageAlreadyChanged\n ) = ovmStateManager.testAndSetContractStorageChanged(_contract, _key);\n\n // If we hadn't already changed the account, then we'll need to charge some fixed amount of\n // \"nuisance gas\".\n if (_wasContractStorageAlreadyChanged == false) {\n // Changing a storage slot means that we're also going to have to change the\n // corresponding account, so do an account change check.\n _checkAccountChange(_contract);\n\n ovmStateManager.incrementTotalUncommittedContractStorage();\n _useNuisanceGas(NUISANCE_GAS_SSTORE);\n }\n }\n\n\n /************************************\n * Internal Functions: Revert Logic *\n ************************************/\n\n /**\n * Simple encoding for revert data.\n * @param _flag Flag to revert with.\n * @param _data Additional user-provided revert data.\n * @return _revertdata Encoded revert data.\n */\n function _encodeRevertData(\n RevertFlag _flag,\n bytes memory _data\n )\n internal\n view\n returns (\n bytes memory _revertdata\n )\n {\n // Out of gas and create exceptions will fundamentally return no data, so simulating it shouldn't either.\n if (\n _flag == RevertFlag.OUT_OF_GAS\n ) {\n return bytes('');\n }\n\n // INVALID_STATE_ACCESS doesn't need to return any data other than the flag.\n if (_flag == RevertFlag.INVALID_STATE_ACCESS) {\n return abi.encode(\n _flag,\n 0,\n 0,\n bytes('')\n );\n }\n\n // Just ABI encode the rest of the parameters.\n return abi.encode(\n _flag,\n messageRecord.nuisanceGasLeft,\n transactionRecord.ovmGasRefund,\n _data\n );\n }\n\n /**\n * Simple decoding for revert data.\n * @param _revertdata Revert data to decode.\n * @return _flag Flag used to revert.\n * @return _nuisanceGasLeft Amount of nuisance gas unused by the message.\n * @return _ovmGasRefund Amount of gas refunded during the message.\n * @return _data Additional user-provided revert data.\n */\n function _decodeRevertData(\n bytes memory _revertdata\n )\n internal\n pure\n returns (\n RevertFlag _flag,\n uint256 _nuisanceGasLeft,\n uint256 _ovmGasRefund,\n bytes memory _data\n )\n {\n // A length of zero means the call ran out of gas, just return empty data.\n if (_revertdata.length == 0) {\n return (\n RevertFlag.OUT_OF_GAS,\n 0,\n 0,\n bytes('')\n );\n }\n\n // ABI decode the incoming data.\n return abi.decode(_revertdata, (RevertFlag, uint256, uint256, bytes));\n }\n\n /**\n * Causes a message to revert or abort.\n * @param _flag Flag to revert with.\n * @param _data Additional user-provided data.\n */\n function _revertWithFlag(\n RevertFlag _flag,\n bytes memory _data\n )\n internal\n view\n {\n bytes memory revertdata = _encodeRevertData(\n _flag,\n _data\n );\n\n assembly {\n revert(add(revertdata, 0x20), mload(revertdata))\n }\n }\n\n /**\n * Causes a message to revert or abort.\n * @param _flag Flag to revert with.\n */\n function _revertWithFlag(\n RevertFlag _flag\n )\n internal\n {\n _revertWithFlag(_flag, bytes(''));\n }\n\n\n /******************************************\n * Internal Functions: Nuisance Gas Logic *\n ******************************************/\n\n /**\n * Computes the nuisance gas limit from the gas limit.\n * @dev This function is currently using a naive implementation whereby the nuisance gas limit\n * is set to exactly equal the lesser of the gas limit or remaining gas. It's likely that\n * this implementation is perfectly fine, but we may change this formula later.\n * @param _gasLimit Gas limit to compute from.\n * @return _nuisanceGasLimit Computed nuisance gas limit.\n */\n function _getNuisanceGasLimit(\n uint256 _gasLimit\n )\n internal\n view\n returns (\n uint256 _nuisanceGasLimit\n )\n {\n return _gasLimit < gasleft() ? _gasLimit : gasleft();\n }\n\n /**\n * Uses a certain amount of nuisance gas.\n * @param _amount Amount of nuisance gas to use.\n */\n function _useNuisanceGas(\n uint256 _amount\n )\n internal\n {\n // Essentially the same as a standard OUT_OF_GAS, except we also retain a record of the gas\n // refund to be given at the end of the transaction.\n if (messageRecord.nuisanceGasLeft < _amount) {\n _revertWithFlag(RevertFlag.EXCEEDS_NUISANCE_GAS);\n }\n\n messageRecord.nuisanceGasLeft -= _amount;\n }\n\n\n /************************************\n * Internal Functions: Gas Metering *\n ************************************/\n\n /**\n * Checks whether a transaction needs to start a new epoch and does so if necessary.\n * @param _timestamp Transaction timestamp.\n */\n function _checkNeedsNewEpoch(\n uint256 _timestamp\n )\n internal\n {\n if (\n _timestamp >= (\n _getGasMetadata(GasMetadataKey.CURRENT_EPOCH_START_TIMESTAMP)\n + gasMeterConfig.secondsPerEpoch\n )\n ) {\n _putGasMetadata(\n GasMetadataKey.CURRENT_EPOCH_START_TIMESTAMP,\n _timestamp\n );\n\n _putGasMetadata(\n GasMetadataKey.PREV_EPOCH_SEQUENCER_QUEUE_GAS,\n _getGasMetadata(\n GasMetadataKey.CUMULATIVE_SEQUENCER_QUEUE_GAS\n )\n );\n\n _putGasMetadata(\n GasMetadataKey.PREV_EPOCH_L1TOL2_QUEUE_GAS,\n _getGasMetadata(\n GasMetadataKey.CUMULATIVE_L1TOL2_QUEUE_GAS\n )\n );\n }\n }\n\n /**\n * Validates the input values of a transaction.\n * @return _valid Whether or not the transaction data is valid.\n */\n function _isValidInput(\n Lib_OVMCodec.Transaction memory _transaction\n )\n view\n internal\n returns (\n bool\n )\n {\n // Prevent reentrancy to run():\n // This check prevents calling run with the default ovmNumber.\n // Combined with the first check in run():\n // if (transactionContext.ovmNUMBER != DEFAULT_UINT256) { return; }\n // It should be impossible to re-enter since run() returns before any other call frames are created.\n // Since this value is already being written to storage, we save much gas compared to\n // using the standard nonReentrant pattern.\n if (_transaction.blockNumber == DEFAULT_UINT256) {\n return false;\n }\n\n if (_isValidGasLimit(_transaction.gasLimit, _transaction.l1QueueOrigin) == false) {\n return false;\n }\n\n return true;\n }\n\n /**\n * Validates the gas limit for a given transaction.\n * @param _gasLimit Gas limit provided by the transaction.\n * param _queueOrigin Queue from which the transaction originated.\n * @return _valid Whether or not the gas limit is valid.\n */\n function _isValidGasLimit(\n uint256 _gasLimit,\n Lib_OVMCodec.QueueOrigin // _queueOrigin\n )\n view\n internal\n returns (\n bool _valid\n )\n {\n // Always have to be below the maximum gas limit.\n if (_gasLimit > gasMeterConfig.maxTransactionGasLimit) {\n return false;\n }\n\n // Always have to be above the minimum gas limit.\n if (_gasLimit < gasMeterConfig.minTransactionGasLimit) {\n return false;\n }\n\n // TEMPORARY: Gas metering is disabled for minnet.\n return true;\n // GasMetadataKey cumulativeGasKey;\n // GasMetadataKey prevEpochGasKey;\n // if (_queueOrigin == Lib_OVMCodec.QueueOrigin.SEQUENCER_QUEUE) {\n // cumulativeGasKey = GasMetadataKey.CUMULATIVE_SEQUENCER_QUEUE_GAS;\n // prevEpochGasKey = GasMetadataKey.PREV_EPOCH_SEQUENCER_QUEUE_GAS;\n // } else {\n // cumulativeGasKey = GasMetadataKey.CUMULATIVE_L1TOL2_QUEUE_GAS;\n // prevEpochGasKey = GasMetadataKey.PREV_EPOCH_L1TOL2_QUEUE_GAS;\n // }\n\n // return (\n // (\n // _getGasMetadata(cumulativeGasKey)\n // - _getGasMetadata(prevEpochGasKey)\n // + _gasLimit\n // ) < gasMeterConfig.maxGasPerQueuePerEpoch\n // );\n }\n\n /**\n * Updates the cumulative gas after a transaction.\n * @param _gasUsed Gas used by the transaction.\n * @param _queueOrigin Queue from which the transaction originated.\n */\n function _updateCumulativeGas(\n uint256 _gasUsed,\n Lib_OVMCodec.QueueOrigin _queueOrigin\n )\n internal\n {\n GasMetadataKey cumulativeGasKey;\n if (_queueOrigin == Lib_OVMCodec.QueueOrigin.SEQUENCER_QUEUE) {\n cumulativeGasKey = GasMetadataKey.CUMULATIVE_SEQUENCER_QUEUE_GAS;\n } else {\n cumulativeGasKey = GasMetadataKey.CUMULATIVE_L1TOL2_QUEUE_GAS;\n }\n\n _putGasMetadata(\n cumulativeGasKey,\n (\n _getGasMetadata(cumulativeGasKey)\n + gasMeterConfig.minTransactionGasLimit\n + _gasUsed\n - transactionRecord.ovmGasRefund\n )\n );\n }\n\n /**\n * Retrieves the value of a gas metadata key.\n * @param _key Gas metadata key to retrieve.\n * @return _value Value stored at the given key.\n */\n function _getGasMetadata(\n GasMetadataKey _key\n )\n internal\n returns (\n uint256 _value\n )\n {\n return uint256(_getContractStorage(\n GAS_METADATA_ADDRESS,\n bytes32(uint256(_key))\n ));\n }\n\n /**\n * Sets the value of a gas metadata key.\n * @param _key Gas metadata key to set.\n * @param _value Value to store at the given key.\n */\n function _putGasMetadata(\n GasMetadataKey _key,\n uint256 _value\n )\n internal\n {\n _putContractStorage(\n GAS_METADATA_ADDRESS,\n bytes32(uint256(_key)),\n bytes32(uint256(_value))\n );\n }\n\n\n /*****************************************\n * Internal Functions: Execution Context *\n *****************************************/\n\n /**\n * Swaps over to a new message context.\n * @param _prevMessageContext Context we're switching from.\n * @param _nextMessageContext Context we're switching to.\n */\n function _switchMessageContext(\n MessageContext memory _prevMessageContext,\n MessageContext memory _nextMessageContext\n )\n internal\n {\n // Avoid unnecessary the SSTORE.\n if (_prevMessageContext.ovmCALLER != _nextMessageContext.ovmCALLER) {\n messageContext.ovmCALLER = _nextMessageContext.ovmCALLER;\n }\n\n // Avoid unnecessary the SSTORE.\n if (_prevMessageContext.ovmADDRESS != _nextMessageContext.ovmADDRESS) {\n messageContext.ovmADDRESS = _nextMessageContext.ovmADDRESS;\n }\n\n // Avoid unnecessary the SSTORE.\n if (_prevMessageContext.isStatic != _nextMessageContext.isStatic) {\n messageContext.isStatic = _nextMessageContext.isStatic;\n }\n }\n\n /**\n * Initializes the execution context.\n * @param _transaction OVM transaction being executed.\n */\n function _initContext(\n Lib_OVMCodec.Transaction memory _transaction\n )\n internal\n {\n transactionContext.ovmTIMESTAMP = _transaction.timestamp;\n transactionContext.ovmNUMBER = _transaction.blockNumber;\n transactionContext.ovmTXGASLIMIT = _transaction.gasLimit;\n transactionContext.ovmL1QUEUEORIGIN = _transaction.l1QueueOrigin;\n transactionContext.ovmL1TXORIGIN = _transaction.l1TxOrigin;\n transactionContext.ovmGASLIMIT = gasMeterConfig.maxGasPerQueuePerEpoch;\n\n messageRecord.nuisanceGasLeft = _getNuisanceGasLimit(_transaction.gasLimit);\n }\n\n /**\n * Resets the transaction and message context.\n */\n function _resetContext()\n internal\n {\n transactionContext.ovmL1TXORIGIN = DEFAULT_ADDRESS;\n transactionContext.ovmTIMESTAMP = DEFAULT_UINT256;\n transactionContext.ovmNUMBER = DEFAULT_UINT256;\n transactionContext.ovmGASLIMIT = DEFAULT_UINT256;\n transactionContext.ovmTXGASLIMIT = DEFAULT_UINT256;\n transactionContext.ovmL1QUEUEORIGIN = Lib_OVMCodec.QueueOrigin.SEQUENCER_QUEUE;\n\n transactionRecord.ovmGasRefund = DEFAULT_UINT256;\n\n messageContext.ovmCALLER = DEFAULT_ADDRESS;\n messageContext.ovmADDRESS = DEFAULT_ADDRESS;\n messageContext.isStatic = false;\n\n messageRecord.nuisanceGasLeft = DEFAULT_UINT256;\n\n // Reset the ovmStateManager.\n ovmStateManager = iOVM_StateManager(address(0));\n }\n\n /*****************************\n * L2-only Helper Functions *\n *****************************/\n\n /**\n * Unreachable helper function for simulating eth_calls with an OVM message context.\n * This function will throw an exception in all cases other than when used as a custom entrypoint in L2 Geth to simulate eth_call.\n * @param _transaction the message transaction to simulate.\n * @param _from the OVM account the simulated call should be from.\n */\n function simulateMessage(\n Lib_OVMCodec.Transaction memory _transaction,\n address _from,\n iOVM_StateManager _ovmStateManager\n )\n external\n returns (\n bytes memory\n )\n {\n // Prevent this call from having any effect unless in a custom-set VM frame\n require(msg.sender == address(0));\n\n ovmStateManager = _ovmStateManager;\n _initContext(_transaction);\n messageRecord.nuisanceGasLeft = uint(-1);\n\n messageContext.ovmADDRESS = _from;\n\n bool isCreate = _transaction.entrypoint == address(0);\n if (isCreate) {\n (address created, bytes memory revertData) = ovmCREATE(_transaction.data);\n if (created == address(0)) {\n return abi.encode(false, revertData);\n } else {\n // The eth_call RPC endpoint for to = undefined will return the deployed bytecode\n // in the success case, differing from standard create messages.\n return abi.encode(true, Lib_EthUtils.getCode(created));\n }\n } else {\n (bool success, bytes memory returndata) = ovmCALL(\n _transaction.gasLimit,\n _transaction.entrypoint,\n _transaction.data\n );\n return abi.encode(success, returndata);\n }\n }\n}\n" + }, + "@openzeppelin/contracts/math/Math.sol": { + "content": "// SPDX-License-Identifier: MIT\n\npragma solidity >=0.6.0 <0.8.0;\n\n/**\n * @dev Standard math utilities missing in the Solidity language.\n */\nlibrary Math {\n /**\n * @dev Returns the largest of two numbers.\n */\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\n return a >= b ? a : b;\n }\n\n /**\n * @dev Returns the smallest of two numbers.\n */\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return a < b ? a : b;\n }\n\n /**\n * @dev Returns the average of two numbers. The result is rounded towards\n * zero.\n */\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b) / 2 can overflow, so we distribute\n return (a / 2) + (b / 2) + ((a % 2 + b % 2) / 2);\n }\n}\n" + }, + "contracts/optimistic-ethereum/iOVM/execution/iOVM_SafetyChecker.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/**\n * @title iOVM_SafetyChecker\n */\ninterface iOVM_SafetyChecker {\n\n /********************\n * Public Functions *\n ********************/\n\n function isBytecodeSafe(bytes calldata _bytecode) external pure returns (bool);\n}\n" + }, + "contracts/optimistic-ethereum/OVM/predeploys/OVM_DeployerWhitelist.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Interface Imports */\nimport { iOVM_DeployerWhitelist } from \"../../iOVM/predeploys/iOVM_DeployerWhitelist.sol\";\n\n/**\n * @title OVM_DeployerWhitelist\n * @dev The Deployer Whitelist is a temporary predeploy used to provide additional safety during the\n * initial phases of our mainnet roll out. It is owned by the Optimism team, and defines accounts\n * which are allowed to deploy contracts on Layer2. The Execution Manager will only allow an\n * ovmCREATE or ovmCREATE2 operation to proceed if the deployer's address whitelisted.\n *\n * Compiler used: optimistic-solc\n * Runtime target: OVM\n */\ncontract OVM_DeployerWhitelist is iOVM_DeployerWhitelist {\n\n /**********************\n * Contract Constants *\n **********************/\n\n bool public initialized;\n bool public allowArbitraryDeployment;\n address override public owner;\n mapping (address => bool) public whitelist;\n\n\n /**********************\n * Function Modifiers *\n **********************/\n\n /**\n * Blocks functions to anyone except the contract owner.\n */\n modifier onlyOwner() {\n require(\n msg.sender == owner,\n \"Function can only be called by the owner of this contract.\"\n );\n _;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Initializes the whitelist.\n * @param _owner Address of the owner for this contract.\n * @param _allowArbitraryDeployment Whether or not to allow arbitrary contract deployment.\n */\n function initialize(\n address _owner,\n bool _allowArbitraryDeployment\n )\n override\n external\n {\n if (initialized == true) {\n return;\n }\n\n initialized = true;\n allowArbitraryDeployment = _allowArbitraryDeployment;\n owner = _owner;\n }\n\n /**\n * Adds or removes an address from the deployment whitelist.\n * @param _deployer Address to update permissions for.\n * @param _isWhitelisted Whether or not the address is whitelisted.\n */\n function setWhitelistedDeployer(\n address _deployer,\n bool _isWhitelisted\n )\n override\n external\n onlyOwner\n {\n whitelist[_deployer] = _isWhitelisted;\n }\n\n /**\n * Updates the owner of this contract.\n * @param _owner Address of the new owner.\n */\n function setOwner(\n address _owner\n )\n override\n public\n onlyOwner\n {\n owner = _owner;\n }\n\n /**\n * Updates the arbitrary deployment flag.\n * @param _allowArbitraryDeployment Whether or not to allow arbitrary contract deployment.\n */\n function setAllowArbitraryDeployment(\n bool _allowArbitraryDeployment\n )\n override\n public\n onlyOwner\n {\n allowArbitraryDeployment = _allowArbitraryDeployment;\n }\n\n /**\n * Permanently enables arbitrary contract deployment and deletes the owner.\n */\n function enableArbitraryContractDeployment()\n override\n external\n onlyOwner\n {\n setAllowArbitraryDeployment(true);\n setOwner(address(0));\n }\n\n /**\n * Checks whether an address is allowed to deploy contracts.\n * @param _deployer Address to check.\n * @return _allowed Whether or not the address can deploy contracts.\n */\n function isDeployerAllowed(\n address _deployer\n )\n override\n external\n returns (\n bool\n )\n {\n return (\n initialized == false\n || allowArbitraryDeployment == true\n || whitelist[_deployer]\n );\n }\n}\n" + }, + "contracts/optimistic-ethereum/iOVM/predeploys/iOVM_DeployerWhitelist.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/**\n * @title iOVM_DeployerWhitelist\n */\ninterface iOVM_DeployerWhitelist {\n\n /********************\n * Public Functions *\n ********************/\n\n function initialize(address _owner, bool _allowArbitraryDeployment) external;\n function owner() external returns (address _owner);\n function setWhitelistedDeployer(address _deployer, bool _isWhitelisted) external;\n function setOwner(address _newOwner) external;\n function setAllowArbitraryDeployment(bool _allowArbitraryDeployment) external;\n function enableArbitraryContractDeployment() external;\n function isDeployerAllowed(address _deployer) external returns (bool _allowed);\n}\n" + }, + "contracts/optimistic-ethereum/OVM/execution/OVM_SafetyChecker.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Interface Imports */\nimport { iOVM_SafetyChecker } from \"../../iOVM/execution/iOVM_SafetyChecker.sol\";\n\n/**\n * @title OVM_SafetyChecker\n * @dev The Safety Checker verifies that contracts deployed on L2 do not contain any\n * \"unsafe\" operations. An operation is considered unsafe if it would access state variables which\n * are specific to the environment (ie. L1 or L2) in which it is executed, as this could be used\n * to \"escape the sandbox\" of the OVM, resulting in non-deterministic fraud proofs.\n * That is, an attacker would be able to \"prove fraud\" on an honestly applied transaction.\n * Note that a \"safe\" contract requires opcodes to appear in a particular pattern;\n * omission of \"unsafe\" opcodes is necessary, but not sufficient.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract OVM_SafetyChecker is iOVM_SafetyChecker {\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Returns whether or not all of the provided bytecode is safe.\n * @param _bytecode The bytecode to safety check.\n * @return `true` if the bytecode is safe, `false` otherwise.\n */\n function isBytecodeSafe(\n bytes memory _bytecode\n )\n override\n external\n pure\n returns (\n bool\n )\n {\n // autogenerated by gen_safety_checker_constants.py\n // number of bytes to skip for each opcode\n uint256[8] memory opcodeSkippableBytes = [\n uint256(0x0001010101010101010101010000000001010101010101010101010101010000),\n uint256(0x0100000000000000000000000000000000000000010101010101000000010100),\n uint256(0x0000000000000000000000000000000001010101000000010101010100000000),\n uint256(0x0203040500000000000000000000000000000000000000000000000000000000),\n uint256(0x0101010101010101010101010101010101010101010101010101010101010101),\n uint256(0x0101010101000000000000000000000000000000000000000000000000000000),\n uint256(0x0000000000000000000000000000000000000000000000000000000000000000),\n uint256(0x0000000000000000000000000000000000000000000000000000000000000000)\n ];\n // Mask to gate opcode specific cases\n uint256 opcodeGateMask = ~uint256(0xffffffffffffffffffffffe000000000fffffffff070ffff9c0ffffec000f001);\n // Halting opcodes\n uint256 opcodeHaltingMask = ~uint256(0x4008000000000000000000000000000000000000004000000000000000000001);\n // PUSH opcodes\n uint256 opcodePushMask = ~uint256(0xffffffff000000000000000000000000);\n\n uint256 codeLength;\n uint256 _pc;\n assembly {\n _pc := add(_bytecode, 0x20)\n }\n codeLength = _pc + _bytecode.length;\n do {\n // current opcode: 0x00...0xff\n uint256 opNum;\n\n // inline assembly removes the extra add + bounds check\n assembly {\n let word := mload(_pc) //load the next 32 bytes at pc into word\n\n // Look up number of bytes to skip from opcodeSkippableBytes and then update indexInWord\n // E.g. the 02030405 in opcodeSkippableBytes is the number of bytes to skip for PUSH1->4\n // We repeat this 6 times, thus we can only skip bytes for up to PUSH4 ((1+4) * 6 = 30 < 32).\n // If we see an opcode that is listed as 0 skippable bytes e.g. PUSH5,\n // then we will get stuck on that indexInWord and then opNum will be set to the PUSH5 opcode.\n let indexInWord := byte(0, mload(add(opcodeSkippableBytes, byte(0, word))))\n indexInWord := add(indexInWord, byte(0, mload(add(opcodeSkippableBytes, byte(indexInWord, word)))))\n indexInWord := add(indexInWord, byte(0, mload(add(opcodeSkippableBytes, byte(indexInWord, word)))))\n indexInWord := add(indexInWord, byte(0, mload(add(opcodeSkippableBytes, byte(indexInWord, word)))))\n indexInWord := add(indexInWord, byte(0, mload(add(opcodeSkippableBytes, byte(indexInWord, word)))))\n indexInWord := add(indexInWord, byte(0, mload(add(opcodeSkippableBytes, byte(indexInWord, word)))))\n _pc := add(_pc, indexInWord)\n\n opNum := byte(indexInWord, word)\n }\n\n // + push opcodes\n // + stop opcodes [STOP(0x00),JUMP(0x56),RETURN(0xf3),INVALID(0xfe)]\n // + caller opcode CALLER(0x33)\n // + blacklisted opcodes\n uint256 opBit = 1 << opNum;\n if (opBit & opcodeGateMask == 0) {\n if (opBit & opcodePushMask == 0) {\n // all pushes are valid opcodes\n // subsequent bytes are not opcodes. Skip them.\n _pc += (opNum - 0x5e); // PUSH1 is 0x60, so opNum-0x5f = PUSHed bytes and we +1 to\n // skip the _pc++; line below in order to save gas ((-0x5f + 1) = -0x5e)\n continue;\n } else if (opBit & opcodeHaltingMask == 0) {\n // STOP or JUMP or RETURN or INVALID (Note: REVERT is blacklisted, so not included here)\n // We are now inside unreachable code until we hit a JUMPDEST!\n do {\n _pc++;\n assembly {\n opNum := byte(0, mload(_pc))\n }\n // encountered a JUMPDEST\n if (opNum == 0x5b) break;\n // skip PUSHed bytes\n if ((1 << opNum) & opcodePushMask == 0) _pc += (opNum - 0x5f); // opNum-0x5f = PUSHed bytes (PUSH1 is 0x60)\n } while (_pc < codeLength);\n // opNum is 0x5b, so we don't continue here since the pc++ is fine\n } else if (opNum == 0x33) { // Caller opcode\n uint256 firstOps; // next 32 bytes of bytecode\n uint256 secondOps; // following 32 bytes of bytecode\n\n assembly {\n firstOps := mload(_pc)\n // 37 bytes total, 5 left over --> 32 - 5 bytes = 27 bytes = 216 bits\n secondOps := shr(216, mload(add(_pc, 0x20)))\n }\n\n // Call identity precompile\n // CALLER POP PUSH1 0x00 PUSH1 0x04 GAS CALL\n // 32 - 8 bytes = 24 bytes = 192\n if ((firstOps >> 192) == 0x3350600060045af1) {\n _pc += 8;\n // Call EM and abort execution if instructed\n // CALLER PUSH1 0x00 SWAP1 GAS CALL PC PUSH1 0x0E ADD JUMPI RETURNDATASIZE PUSH1 0x00 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x00 REVERT JUMPDEST RETURNDATASIZE PUSH1 0x01 EQ ISZERO PC PUSH1 0x0a ADD JUMPI PUSH1 0x01 PUSH1 0x00 RETURN JUMPDEST\n } else if (firstOps == 0x336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a015760 && secondOps == 0x016000f35b) {\n _pc += 37;\n } else {\n return false;\n }\n continue;\n } else {\n // encountered a non-whitelisted opcode!\n return false;\n }\n }\n _pc++;\n } while (_pc < codeLength);\n return true;\n }\n}\n" + }, + "contracts/optimistic-ethereum/OVM/execution/OVM_StateManagerFactory.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Interface Imports */\nimport { iOVM_StateManager } from \"../../iOVM/execution/iOVM_StateManager.sol\";\nimport { iOVM_StateManagerFactory } from \"../../iOVM/execution/iOVM_StateManagerFactory.sol\";\n\n/* Contract Imports */\nimport { OVM_StateManager } from \"./OVM_StateManager.sol\";\n\n/**\n * @title OVM_StateManagerFactory\n * @dev The State Manager Factory is called by a State Transitioner's init code, to create a new\n * State Manager for use in the Fraud Verification process.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract OVM_StateManagerFactory is iOVM_StateManagerFactory {\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Creates a new OVM_StateManager\n * @param _owner Owner of the created contract.\n * @return New OVM_StateManager instance.\n */\n function create(\n address _owner\n )\n override\n public\n returns (\n iOVM_StateManager\n )\n {\n return new OVM_StateManager(_owner);\n }\n}\n" + }, + "contracts/optimistic-ethereum/OVM/execution/OVM_StateManager.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/* Interface Imports */\nimport { iOVM_StateManager } from \"../../iOVM/execution/iOVM_StateManager.sol\";\n\n/**\n * @title OVM_StateManager\n * @dev The State Manager contract holds all storage values for contracts in the OVM. It can only be written to by the\n * the Execution Manager and State Transitioner. It runs on L1 during the setup and execution of a fraud proof.\n * The same logic runs on L2, but has been implemented as a precompile in the L2 go-ethereum client\n * (see https://github.com/ethereum-optimism/go-ethereum/blob/master/core/vm/ovm_state_manager.go).\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract OVM_StateManager is iOVM_StateManager {\n\n /*************\n * Constants *\n *************/\n\n bytes32 constant internal EMPTY_ACCOUNT_STORAGE_ROOT = 0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421;\n bytes32 constant internal EMPTY_ACCOUNT_CODE_HASH = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;\n bytes32 constant internal STORAGE_XOR_VALUE = 0xFEEDFACECAFEBEEFFEEDFACECAFEBEEFFEEDFACECAFEBEEFFEEDFACECAFEBEEF;\n\n\n /*************\n * Variables *\n *************/\n\n address override public owner;\n address override public ovmExecutionManager;\n mapping (address => Lib_OVMCodec.Account) internal accounts;\n mapping (address => mapping (bytes32 => bytes32)) internal contractStorage;\n mapping (address => mapping (bytes32 => bool)) internal verifiedContractStorage;\n mapping (bytes32 => ItemState) internal itemStates;\n uint256 internal totalUncommittedAccounts;\n uint256 internal totalUncommittedContractStorage;\n\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _owner Address of the owner of this contract.\n */\n constructor(\n address _owner\n )\n {\n owner = _owner;\n }\n\n\n /**********************\n * Function Modifiers *\n **********************/\n\n /**\n * Simple authentication, this contract should only be accessible to the owner (which is expected to be the State Transitioner during `PRE_EXECUTION`\n * or the OVM_ExecutionManager during transaction execution.\n */\n modifier authenticated() {\n // owner is the State Transitioner\n require(\n msg.sender == owner || msg.sender == ovmExecutionManager,\n \"Function can only be called by authenticated addresses\"\n );\n _;\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Checks whether a given address is allowed to modify this contract.\n * @param _address Address to check.\n * @return Whether or not the address can modify this contract.\n */\n function isAuthenticated(\n address _address\n )\n override\n public\n view\n returns (\n bool\n )\n {\n return (_address == owner || _address == ovmExecutionManager);\n }\n\n /**\n * Sets the address of the OVM_ExecutionManager.\n * @param _ovmExecutionManager Address of the OVM_ExecutionManager.\n */\n function setExecutionManager(\n address _ovmExecutionManager\n )\n override\n public\n authenticated\n {\n ovmExecutionManager = _ovmExecutionManager;\n }\n\n /**\n * Inserts an account into the state.\n * @param _address Address of the account to insert.\n * @param _account Account to insert for the given address.\n */\n function putAccount(\n address _address,\n Lib_OVMCodec.Account memory _account\n )\n override\n public\n authenticated\n {\n accounts[_address] = _account;\n }\n\n /**\n * Marks an account as empty.\n * @param _address Address of the account to mark.\n */\n function putEmptyAccount(\n address _address\n )\n override\n public\n authenticated\n {\n Lib_OVMCodec.Account storage account = accounts[_address];\n account.storageRoot = EMPTY_ACCOUNT_STORAGE_ROOT;\n account.codeHash = EMPTY_ACCOUNT_CODE_HASH;\n }\n\n /**\n * Retrieves an account from the state.\n * @param _address Address of the account to retrieve.\n * @return Account for the given address.\n */\n function getAccount(\n address _address\n )\n override\n public\n view\n returns (\n Lib_OVMCodec.Account memory\n )\n {\n return accounts[_address];\n }\n\n /**\n * Checks whether the state has a given account.\n * @param _address Address of the account to check.\n * @return Whether or not the state has the account.\n */\n function hasAccount(\n address _address\n )\n override\n public\n view\n returns (\n bool\n )\n {\n return accounts[_address].codeHash != bytes32(0);\n }\n\n /**\n * Checks whether the state has a given known empty account.\n * @param _address Address of the account to check.\n * @return Whether or not the state has the empty account.\n */\n function hasEmptyAccount(\n address _address\n )\n override\n public\n view\n returns (\n bool\n )\n {\n return (\n accounts[_address].codeHash == EMPTY_ACCOUNT_CODE_HASH\n && accounts[_address].nonce == 0\n );\n }\n\n /**\n * Sets the nonce of an account.\n * @param _address Address of the account to modify.\n * @param _nonce New account nonce.\n */\n function setAccountNonce(\n address _address,\n uint256 _nonce\n )\n override\n public\n authenticated\n {\n accounts[_address].nonce = _nonce;\n }\n\n /**\n * Gets the nonce of an account.\n * @param _address Address of the account to access.\n * @return Nonce of the account.\n */\n function getAccountNonce(\n address _address\n )\n override\n public\n view\n returns (\n uint256\n )\n {\n return accounts[_address].nonce;\n }\n\n /**\n * Retrieves the Ethereum address of an account.\n * @param _address Address of the account to access.\n * @return Corresponding Ethereum address.\n */\n function getAccountEthAddress(\n address _address\n )\n override\n public\n view\n returns (\n address\n )\n {\n return accounts[_address].ethAddress;\n }\n\n /**\n * Retrieves the storage root of an account.\n * @param _address Address of the account to access.\n * @return Corresponding storage root.\n */\n function getAccountStorageRoot(\n address _address\n )\n override\n public\n view\n returns (\n bytes32\n )\n {\n return accounts[_address].storageRoot;\n }\n\n /**\n * Initializes a pending account (during CREATE or CREATE2) with the default values.\n * @param _address Address of the account to initialize.\n */\n function initPendingAccount(\n address _address\n )\n override\n public\n authenticated\n {\n Lib_OVMCodec.Account storage account = accounts[_address];\n account.nonce = 1;\n account.storageRoot = EMPTY_ACCOUNT_STORAGE_ROOT;\n account.codeHash = EMPTY_ACCOUNT_CODE_HASH;\n account.isFresh = true;\n }\n\n /**\n * Finalizes the creation of a pending account (during CREATE or CREATE2).\n * @param _address Address of the account to finalize.\n * @param _ethAddress Address of the account's associated contract on Ethereum.\n * @param _codeHash Hash of the account's code.\n */\n function commitPendingAccount(\n address _address,\n address _ethAddress,\n bytes32 _codeHash\n )\n override\n public\n authenticated\n {\n Lib_OVMCodec.Account storage account = accounts[_address];\n account.ethAddress = _ethAddress;\n account.codeHash = _codeHash;\n }\n\n /**\n * Checks whether an account has already been retrieved, and marks it as retrieved if not.\n * @param _address Address of the account to check.\n * @return Whether or not the account was already loaded.\n */\n function testAndSetAccountLoaded(\n address _address\n )\n override\n public\n authenticated\n returns (\n bool\n )\n {\n return _testAndSetItemState(\n _getItemHash(_address),\n ItemState.ITEM_LOADED\n );\n }\n\n /**\n * Checks whether an account has already been modified, and marks it as modified if not.\n * @param _address Address of the account to check.\n * @return Whether or not the account was already modified.\n */\n function testAndSetAccountChanged(\n address _address\n )\n override\n public\n authenticated\n returns (\n bool\n )\n {\n return _testAndSetItemState(\n _getItemHash(_address),\n ItemState.ITEM_CHANGED\n );\n }\n\n /**\n * Attempts to mark an account as committed.\n * @param _address Address of the account to commit.\n * @return Whether or not the account was committed.\n */\n function commitAccount(\n address _address\n )\n override\n public\n authenticated\n returns (\n bool\n )\n {\n bytes32 item = _getItemHash(_address);\n if (itemStates[item] != ItemState.ITEM_CHANGED) {\n return false;\n }\n\n itemStates[item] = ItemState.ITEM_COMMITTED;\n totalUncommittedAccounts -= 1;\n\n return true;\n }\n\n /**\n * Increments the total number of uncommitted accounts.\n */\n function incrementTotalUncommittedAccounts()\n override\n public\n authenticated\n {\n totalUncommittedAccounts += 1;\n }\n\n /**\n * Gets the total number of uncommitted accounts.\n * @return Total uncommitted accounts.\n */\n function getTotalUncommittedAccounts()\n override\n public\n view\n returns (\n uint256\n )\n {\n return totalUncommittedAccounts;\n }\n\n /**\n * Checks whether a given account was changed during execution.\n * @param _address Address to check.\n * @return Whether or not the account was changed.\n */\n function wasAccountChanged(\n address _address\n )\n override\n public\n view\n returns (\n bool\n )\n {\n bytes32 item = _getItemHash(_address);\n return itemStates[item] >= ItemState.ITEM_CHANGED;\n }\n\n /**\n * Checks whether a given account was committed after execution.\n * @param _address Address to check.\n * @return Whether or not the account was committed.\n */\n function wasAccountCommitted(\n address _address\n )\n override\n public\n view\n returns (\n bool\n )\n {\n bytes32 item = _getItemHash(_address);\n return itemStates[item] >= ItemState.ITEM_COMMITTED;\n }\n\n\n /************************************\n * Public Functions: Storage Access *\n ************************************/\n\n /**\n * Changes a contract storage slot value.\n * @param _contract Address of the contract to modify.\n * @param _key 32 byte storage slot key.\n * @param _value 32 byte storage slot value.\n */\n function putContractStorage(\n address _contract,\n bytes32 _key,\n bytes32 _value\n )\n override\n public\n authenticated\n {\n // A hilarious optimization. `SSTORE`ing a value of `bytes32(0)` is common enough that it's\n // worth populating this with a non-zero value in advance (during the fraud proof\n // initialization phase) to cut the execution-time cost down to 5000 gas.\n contractStorage[_contract][_key] = _value ^ STORAGE_XOR_VALUE;\n\n // Only used when initially populating the contract storage. OVM_ExecutionManager will\n // perform a `hasContractStorage` INVALID_STATE_ACCESS check before putting any contract\n // storage because writing to zero when the actual value is nonzero causes a gas\n // discrepancy. Could be moved into a new `putVerifiedContractStorage` function, or\n // something along those lines.\n if (verifiedContractStorage[_contract][_key] == false) {\n verifiedContractStorage[_contract][_key] = true;\n }\n }\n\n /**\n * Retrieves a contract storage slot value.\n * @param _contract Address of the contract to access.\n * @param _key 32 byte storage slot key.\n * @return 32 byte storage slot value.\n */\n function getContractStorage(\n address _contract,\n bytes32 _key\n )\n override\n public\n view\n returns (\n bytes32\n )\n {\n // Storage XOR system doesn't work for newly created contracts that haven't set this\n // storage slot value yet.\n if (\n verifiedContractStorage[_contract][_key] == false\n && accounts[_contract].isFresh\n ) {\n return bytes32(0);\n }\n\n // See `putContractStorage` for more information about the XOR here.\n return contractStorage[_contract][_key] ^ STORAGE_XOR_VALUE;\n }\n\n /**\n * Checks whether a contract storage slot exists in the state.\n * @param _contract Address of the contract to access.\n * @param _key 32 byte storage slot key.\n * @return Whether or not the key was set in the state.\n */\n function hasContractStorage(\n address _contract,\n bytes32 _key\n )\n override\n public\n view\n returns (\n bool\n )\n {\n return verifiedContractStorage[_contract][_key] || accounts[_contract].isFresh;\n }\n\n /**\n * Checks whether a storage slot has already been retrieved, and marks it as retrieved if not.\n * @param _contract Address of the contract to check.\n * @param _key 32 byte storage slot key.\n * @return Whether or not the slot was already loaded.\n */\n function testAndSetContractStorageLoaded(\n address _contract,\n bytes32 _key\n )\n override\n public\n authenticated\n returns (\n bool\n )\n {\n return _testAndSetItemState(\n _getItemHash(_contract, _key),\n ItemState.ITEM_LOADED\n );\n }\n\n /**\n * Checks whether a storage slot has already been modified, and marks it as modified if not.\n * @param _contract Address of the contract to check.\n * @param _key 32 byte storage slot key.\n * @return Whether or not the slot was already modified.\n */\n function testAndSetContractStorageChanged(\n address _contract,\n bytes32 _key\n )\n override\n public\n authenticated\n returns (\n bool\n )\n {\n return _testAndSetItemState(\n _getItemHash(_contract, _key),\n ItemState.ITEM_CHANGED\n );\n }\n\n /**\n * Attempts to mark a storage slot as committed.\n * @param _contract Address of the account to commit.\n * @param _key 32 byte slot key to commit.\n * @return Whether or not the slot was committed.\n */\n function commitContractStorage(\n address _contract,\n bytes32 _key\n )\n override\n public\n authenticated\n returns (\n bool\n )\n {\n bytes32 item = _getItemHash(_contract, _key);\n if (itemStates[item] != ItemState.ITEM_CHANGED) {\n return false;\n }\n\n itemStates[item] = ItemState.ITEM_COMMITTED;\n totalUncommittedContractStorage -= 1;\n\n return true;\n }\n\n /**\n * Increments the total number of uncommitted storage slots.\n */\n function incrementTotalUncommittedContractStorage()\n override\n public\n authenticated\n {\n totalUncommittedContractStorage += 1;\n }\n\n /**\n * Gets the total number of uncommitted storage slots.\n * @return Total uncommitted storage slots.\n */\n function getTotalUncommittedContractStorage()\n override\n public\n view\n returns (\n uint256\n )\n {\n return totalUncommittedContractStorage;\n }\n\n /**\n * Checks whether a given storage slot was changed during execution.\n * @param _contract Address to check.\n * @param _key Key of the storage slot to check.\n * @return Whether or not the storage slot was changed.\n */\n function wasContractStorageChanged(\n address _contract,\n bytes32 _key\n )\n override\n public\n view\n returns (\n bool\n )\n {\n bytes32 item = _getItemHash(_contract, _key);\n return itemStates[item] >= ItemState.ITEM_CHANGED;\n }\n\n /**\n * Checks whether a given storage slot was committed after execution.\n * @param _contract Address to check.\n * @param _key Key of the storage slot to check.\n * @return Whether or not the storage slot was committed.\n */\n function wasContractStorageCommitted(\n address _contract,\n bytes32 _key\n )\n override\n public\n view\n returns (\n bool\n )\n {\n bytes32 item = _getItemHash(_contract, _key);\n return itemStates[item] >= ItemState.ITEM_COMMITTED;\n }\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Generates a unique hash for an address.\n * @param _address Address to generate a hash for.\n * @return Unique hash for the given address.\n */\n function _getItemHash(\n address _address\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n return keccak256(abi.encodePacked(_address));\n }\n\n /**\n * Generates a unique hash for an address/key pair.\n * @param _contract Address to generate a hash for.\n * @param _key Key to generate a hash for.\n * @return Unique hash for the given pair.\n */\n function _getItemHash(\n address _contract,\n bytes32 _key\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n return keccak256(abi.encodePacked(\n _contract,\n _key\n ));\n }\n\n /**\n * Checks whether an item is in a particular state (ITEM_LOADED or ITEM_CHANGED) and sets the\n * item to the provided state if not.\n * @param _item 32 byte item ID to check.\n * @param _minItemState Minimum state that must be satisfied by the item.\n * @return Whether or not the item was already in the state.\n */\n function _testAndSetItemState(\n bytes32 _item,\n ItemState _minItemState\n )\n internal\n returns (\n bool\n )\n {\n bool wasItemState = itemStates[_item] >= _minItemState;\n\n if (wasItemState == false) {\n itemStates[_item] = _minItemState;\n }\n\n return wasItemState;\n }\n}\n" + }, + "contracts/test-libraries/codec/TestLib_OVMCodec.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../optimistic-ethereum/libraries/codec/Lib_OVMCodec.sol\";\n\n/**\n * @title TestLib_OVMCodec\n */\ncontract TestLib_OVMCodec {\n function encodeTransaction(\n Lib_OVMCodec.Transaction memory _transaction\n )\n public\n pure\n returns (\n bytes memory _encoded\n )\n {\n return Lib_OVMCodec.encodeTransaction(_transaction);\n }\n\n function hashTransaction(\n Lib_OVMCodec.Transaction memory _transaction\n )\n public\n pure\n returns (\n bytes32 _hash\n )\n {\n return Lib_OVMCodec.hashTransaction(_transaction);\n }\n}\n" + }, + "contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1CrossDomainMessenger.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_AddressResolver } from \"../../../libraries/resolver/Lib_AddressResolver.sol\";\nimport { Lib_AddressManager } from \"../../../libraries/resolver/Lib_AddressManager.sol\";\nimport { Lib_SecureMerkleTrie } from \"../../../libraries/trie/Lib_SecureMerkleTrie.sol\";\n\n/* Interface Imports */\nimport { iOVM_L1CrossDomainMessenger } from \"../../../iOVM/bridge/messaging/iOVM_L1CrossDomainMessenger.sol\";\nimport { iOVM_CanonicalTransactionChain } from \"../../../iOVM/chain/iOVM_CanonicalTransactionChain.sol\";\nimport { iOVM_StateCommitmentChain } from \"../../../iOVM/chain/iOVM_StateCommitmentChain.sol\";\n\n/* Contract Imports */\nimport { Abs_BaseCrossDomainMessenger } from \"./Abs_BaseCrossDomainMessenger.sol\";\n\n/* External Imports */\nimport { OwnableUpgradeable } from \"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\";\nimport { PausableUpgradeable } from \"@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol\";\nimport { ReentrancyGuardUpgradeable } from \"@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol\";\n\n/**\n * @title OVM_L1CrossDomainMessenger\n * @dev The L1 Cross Domain Messenger contract sends messages from L1 to L2, and relays messages\n * from L2 onto L1. In the event that a message sent from L1 to L2 is rejected for exceeding the L2\n * epoch gas limit, it can be resubmitted via this contract's replay function.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract OVM_L1CrossDomainMessenger is\n iOVM_L1CrossDomainMessenger,\n Abs_BaseCrossDomainMessenger,\n Lib_AddressResolver,\n OwnableUpgradeable,\n PausableUpgradeable,\n ReentrancyGuardUpgradeable\n{\n\n /**********\n * Events *\n **********/\n\n event MessageBlocked(\n bytes32 indexed _xDomainCalldataHash\n );\n\n event MessageAllowed(\n bytes32 indexed _xDomainCalldataHash\n );\n\n /**********************\n * Contract Variables *\n **********************/\n\n mapping (bytes32 => bool) public blockedMessages;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * This contract is intended to be behind a delegate proxy.\n * We pass the zero address to the address resolver just to satisfy the constructor.\n * We still need to set this value in initialize().\n */\n constructor()\n Lib_AddressResolver(address(0))\n {}\n\n /**********************\n * Function Modifiers *\n **********************/\n\n /**\n * Modifier to enforce that, if configured, only the OVM_L2MessageRelayer contract may\n * successfully call a method.\n */\n modifier onlyRelayer() {\n address relayer = resolve(\"OVM_L2MessageRelayer\");\n if (relayer != address(0)) {\n require(\n msg.sender == relayer,\n \"Only OVM_L2MessageRelayer can relay L2-to-L1 messages.\"\n );\n }\n _;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n function initialize(\n address _libAddressManager\n )\n public\n initializer\n {\n require(\n address(libAddressManager) == address(0),\n \"L1CrossDomainMessenger already intialized.\"\n );\n libAddressManager = Lib_AddressManager(_libAddressManager);\n xDomainMsgSender = DEFAULT_XDOMAIN_SENDER;\n\n // Initialize upgradable OZ contracts\n __Context_init_unchained(); // Context is a dependency for both Ownable and Pausable\n __Ownable_init_unchained();\n __Pausable_init_unchained();\n __ReentrancyGuard_init_unchained();\n }\n\n /**\n * Pause relaying.\n */\n function pause()\n external\n onlyOwner\n {\n _pause();\n }\n\n /**\n * Block a message.\n * @param _xDomainCalldataHash Hash of the message to block.\n */\n function blockMessage(\n bytes32 _xDomainCalldataHash\n )\n external\n onlyOwner\n {\n blockedMessages[_xDomainCalldataHash] = true;\n emit MessageBlocked(_xDomainCalldataHash);\n }\n\n /**\n * Allow a message.\n * @param _xDomainCalldataHash Hash of the message to block.\n */\n function allowMessage(\n bytes32 _xDomainCalldataHash\n )\n external\n onlyOwner\n {\n blockedMessages[_xDomainCalldataHash] = false;\n emit MessageAllowed(_xDomainCalldataHash);\n }\n\n /**\n * Relays a cross domain message to a contract.\n * @inheritdoc iOVM_L1CrossDomainMessenger\n */\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce,\n L2MessageInclusionProof memory _proof\n )\n override\n public\n nonReentrant\n onlyRelayer\n whenNotPaused\n {\n bytes memory xDomainCalldata = _getXDomainCalldata(\n _target,\n _sender,\n _message,\n _messageNonce\n );\n\n require(\n _verifyXDomainMessage(\n xDomainCalldata,\n _proof\n ) == true,\n \"Provided message could not be verified.\"\n );\n\n bytes32 xDomainCalldataHash = keccak256(xDomainCalldata);\n\n require(\n successfulMessages[xDomainCalldataHash] == false,\n \"Provided message has already been received.\"\n );\n\n require(\n blockedMessages[xDomainCalldataHash] == false,\n \"Provided message has been blocked.\"\n );\n\n xDomainMsgSender = _sender;\n (bool success, ) = _target.call(_message);\n xDomainMsgSender = DEFAULT_XDOMAIN_SENDER;\n\n // Mark the message as received if the call was successful. Ensures that a message can be\n // relayed multiple times in the case that the call reverted.\n if (success == true) {\n successfulMessages[xDomainCalldataHash] = true;\n emit RelayedMessage(xDomainCalldataHash);\n } else {\n emit FailedRelayedMessage(xDomainCalldataHash);\n }\n\n // Store an identifier that can be used to prove that the given message was relayed by some\n // user. Gives us an easy way to pay relayers for their work.\n bytes32 relayId = keccak256(\n abi.encodePacked(\n xDomainCalldata,\n msg.sender,\n block.number\n )\n );\n relayedMessages[relayId] = true;\n }\n\n /**\n * Replays a cross domain message to the target messenger.\n * @inheritdoc iOVM_L1CrossDomainMessenger\n */\n function replayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce,\n uint32 _gasLimit\n )\n override\n public\n {\n bytes memory xDomainCalldata = _getXDomainCalldata(\n _target,\n _sender,\n _message,\n _messageNonce\n );\n\n require(\n sentMessages[keccak256(xDomainCalldata)] == true,\n \"Provided message has not already been sent.\"\n );\n\n _sendXDomainMessage(xDomainCalldata, _gasLimit);\n }\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Verifies that the given message is valid.\n * @param _xDomainCalldata Calldata to verify.\n * @param _proof Inclusion proof for the message.\n * @return Whether or not the provided message is valid.\n */\n function _verifyXDomainMessage(\n bytes memory _xDomainCalldata,\n L2MessageInclusionProof memory _proof\n )\n internal\n view\n returns (\n bool\n )\n {\n return (\n _verifyStateRootProof(_proof)\n && _verifyStorageProof(_xDomainCalldata, _proof)\n );\n }\n\n /**\n * Verifies that the state root within an inclusion proof is valid.\n * @param _proof Message inclusion proof.\n * @return Whether or not the provided proof is valid.\n */\n function _verifyStateRootProof(\n L2MessageInclusionProof memory _proof\n )\n internal\n view\n returns (\n bool\n )\n {\n iOVM_StateCommitmentChain ovmStateCommitmentChain = iOVM_StateCommitmentChain(\n resolve(\"OVM_StateCommitmentChain\")\n );\n\n return (\n ovmStateCommitmentChain.insideFraudProofWindow(_proof.stateRootBatchHeader) == false\n && ovmStateCommitmentChain.verifyStateCommitment(\n _proof.stateRoot,\n _proof.stateRootBatchHeader,\n _proof.stateRootProof\n )\n );\n }\n\n /**\n * Verifies that the storage proof within an inclusion proof is valid.\n * @param _xDomainCalldata Encoded message calldata.\n * @param _proof Message inclusion proof.\n * @return Whether or not the provided proof is valid.\n */\n function _verifyStorageProof(\n bytes memory _xDomainCalldata,\n L2MessageInclusionProof memory _proof\n )\n internal\n view\n returns (\n bool\n )\n {\n bytes32 storageKey = keccak256(\n abi.encodePacked(\n keccak256(\n abi.encodePacked(\n _xDomainCalldata,\n resolve(\"OVM_L2CrossDomainMessenger\")\n )\n ),\n uint256(0)\n )\n );\n\n (\n bool exists,\n bytes memory encodedMessagePassingAccount\n ) = Lib_SecureMerkleTrie.get(\n abi.encodePacked(0x4200000000000000000000000000000000000000),\n _proof.stateTrieWitness,\n _proof.stateRoot\n );\n\n require(\n exists == true,\n \"Message passing predeploy has not been initialized or invalid proof provided.\"\n );\n\n Lib_OVMCodec.EVMAccount memory account = Lib_OVMCodec.decodeEVMAccount(\n encodedMessagePassingAccount\n );\n\n return Lib_SecureMerkleTrie.verifyInclusionProof(\n abi.encodePacked(storageKey),\n abi.encodePacked(uint8(1)),\n _proof.storageTrieWitness,\n account.storageRoot\n );\n }\n\n /**\n * Sends a cross domain message.\n * @param _message Message to send.\n * @param _gasLimit OVM gas limit for the message.\n */\n function _sendXDomainMessage(\n bytes memory _message,\n uint256 _gasLimit\n )\n override\n internal\n {\n iOVM_CanonicalTransactionChain(resolve(\"OVM_CanonicalTransactionChain\")).enqueue(\n resolve(\"OVM_L2CrossDomainMessenger\"),\n _gasLimit,\n _message\n );\n }\n}\n" + }, + "contracts/optimistic-ethereum/iOVM/bridge/messaging/iOVM_L1CrossDomainMessenger.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../../libraries/codec/Lib_OVMCodec.sol\";\n\n/* Interface Imports */\nimport { iAbs_BaseCrossDomainMessenger } from \"./iAbs_BaseCrossDomainMessenger.sol\";\n\n/**\n * @title iOVM_L1CrossDomainMessenger\n */\ninterface iOVM_L1CrossDomainMessenger is iAbs_BaseCrossDomainMessenger {\n\n /*******************\n * Data Structures *\n *******************/\n\n struct L2MessageInclusionProof {\n bytes32 stateRoot;\n Lib_OVMCodec.ChainBatchHeader stateRootBatchHeader;\n Lib_OVMCodec.ChainInclusionProof stateRootProof;\n bytes stateTrieWitness;\n bytes storageTrieWitness;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Relays a cross domain message to a contract.\n * @param _target Target contract address.\n * @param _sender Message sender address.\n * @param _message Message to send to the target.\n * @param _messageNonce Nonce for the provided message.\n * @param _proof Inclusion proof for the given message.\n */\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce,\n L2MessageInclusionProof memory _proof\n ) external;\n\n /**\n * Replays a cross domain message to the target messenger.\n * @param _target Target contract address.\n * @param _sender Original sender address.\n * @param _message Message to send to the target.\n * @param _messageNonce Nonce for the provided message.\n * @param _gasLimit Gas limit for the provided message.\n */\n function replayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce,\n uint32 _gasLimit\n ) external;\n}\n" + }, + "contracts/optimistic-ethereum/OVM/bridge/messaging/Abs_BaseCrossDomainMessenger.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Interface Imports */\nimport { iAbs_BaseCrossDomainMessenger } from \"../../../iOVM/bridge/messaging/iAbs_BaseCrossDomainMessenger.sol\";\n\n/**\n * @title Abs_BaseCrossDomainMessenger\n * @dev The Base Cross Domain Messenger is an abstract contract providing the interface and common\n * functionality used in the L1 and L2 Cross Domain Messengers. It can also serve as a template for\n * developers wishing to implement a custom bridge contract to suit their needs.\n *\n * Compiler used: defined by child contract\n * Runtime target: defined by child contract\n */\nabstract contract Abs_BaseCrossDomainMessenger is iAbs_BaseCrossDomainMessenger {\n\n /*************\n * Constants *\n *************/\n\n // The default x-domain message sender being set to a non-zero value makes\n // deployment a bit more expensive, but in exchange the refund on every call to\n // `relayMessage` by the L1 and L2 messengers will be higher.\n address internal constant DEFAULT_XDOMAIN_SENDER = 0x000000000000000000000000000000000000dEaD;\n\n\n /*************\n * Variables *\n *************/\n\n mapping (bytes32 => bool) public relayedMessages;\n mapping (bytes32 => bool) public successfulMessages;\n mapping (bytes32 => bool) public sentMessages;\n uint256 public messageNonce;\n address internal xDomainMsgSender = DEFAULT_XDOMAIN_SENDER;\n\n\n /***************\n * Constructor *\n ***************/\n\n constructor() {}\n\n\n /********************\n * Public Functions *\n ********************/\n\n function xDomainMessageSender()\n public\n override\n view\n returns (\n address\n )\n {\n require(xDomainMsgSender != DEFAULT_XDOMAIN_SENDER, \"xDomainMessageSender is not set\");\n return xDomainMsgSender;\n }\n\n /**\n * Sends a cross domain message to the target messenger.\n * @param _target Target contract address.\n * @param _message Message to send to the target.\n * @param _gasLimit Gas limit for the provided message.\n */\n function sendMessage(\n address _target,\n bytes memory _message,\n uint32 _gasLimit\n )\n override\n public\n {\n bytes memory xDomainCalldata = _getXDomainCalldata(\n _target,\n msg.sender,\n _message,\n messageNonce\n );\n\n messageNonce += 1;\n sentMessages[keccak256(xDomainCalldata)] = true;\n\n _sendXDomainMessage(xDomainCalldata, _gasLimit);\n emit SentMessage(xDomainCalldata);\n }\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Generates the correct cross domain calldata for a message.\n * @param _target Target contract address.\n * @param _sender Message sender address.\n * @param _message Message to send to the target.\n * @param _messageNonce Nonce for the provided message.\n * @return ABI encoded cross domain calldata.\n */\n function _getXDomainCalldata(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n return abi.encodeWithSignature(\n \"relayMessage(address,address,bytes,uint256)\",\n _target,\n _sender,\n _message,\n _messageNonce\n );\n }\n\n /**\n * Sends a cross domain message.\n * param // Message to send.\n * param // Gas limit for the provided message.\n */\n function _sendXDomainMessage(\n bytes memory, // _message,\n uint256 // _gasLimit\n )\n virtual\n internal\n {\n revert(\"Implement me in child contracts!\");\n }\n}\n" + }, + "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n\npragma solidity >=0.6.0 <0.8.0;\n\nimport \"../utils/ContextUpgradeable.sol\";\nimport \"../proxy/Initializable.sol\";\n/**\n * @dev Contract module which provides a basic access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * By default, the owner account will be the one that deploys the contract. This\n * can later be changed with {transferOwnership}.\n *\n * This module is used through inheritance. It will make available the modifier\n * `onlyOwner`, which can be applied to your functions to restrict their use to\n * the owner.\n */\nabstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {\n address private _owner;\n\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n /**\n * @dev Initializes the contract setting the deployer as the initial owner.\n */\n function __Ownable_init() internal initializer {\n __Context_init_unchained();\n __Ownable_init_unchained();\n }\n\n function __Ownable_init_unchained() internal initializer {\n address msgSender = _msgSender();\n _owner = msgSender;\n emit OwnershipTransferred(address(0), msgSender);\n }\n\n /**\n * @dev Returns the address of the current owner.\n */\n function owner() public view virtual returns (address) {\n return _owner;\n }\n\n /**\n * @dev Throws if called by any account other than the owner.\n */\n modifier onlyOwner() {\n require(owner() == _msgSender(), \"Ownable: caller is not the owner\");\n _;\n }\n\n /**\n * @dev Leaves the contract without owner. It will not be possible to call\n * `onlyOwner` functions anymore. Can only be called by the current owner.\n *\n * NOTE: Renouncing ownership will leave the contract without an owner,\n * thereby removing any functionality that is only available to the owner.\n */\n function renounceOwnership() public virtual onlyOwner {\n emit OwnershipTransferred(_owner, address(0));\n _owner = address(0);\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Can only be called by the current owner.\n */\n function transferOwnership(address newOwner) public virtual onlyOwner {\n require(newOwner != address(0), \"Ownable: new owner is the zero address\");\n emit OwnershipTransferred(_owner, newOwner);\n _owner = newOwner;\n }\n uint256[49] private __gap;\n}\n" + }, + "@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n\npragma solidity >=0.6.0 <0.8.0;\n\nimport \"./ContextUpgradeable.sol\";\nimport \"../proxy/Initializable.sol\";\n\n/**\n * @dev Contract module which allows children to implement an emergency stop\n * mechanism that can be triggered by an authorized account.\n *\n * This module is used through inheritance. It will make available the\n * modifiers `whenNotPaused` and `whenPaused`, which can be applied to\n * the functions of your contract. Note that they will not be pausable by\n * simply including this module, only once the modifiers are put in place.\n */\nabstract contract PausableUpgradeable is Initializable, ContextUpgradeable {\n /**\n * @dev Emitted when the pause is triggered by `account`.\n */\n event Paused(address account);\n\n /**\n * @dev Emitted when the pause is lifted by `account`.\n */\n event Unpaused(address account);\n\n bool private _paused;\n\n /**\n * @dev Initializes the contract in unpaused state.\n */\n function __Pausable_init() internal initializer {\n __Context_init_unchained();\n __Pausable_init_unchained();\n }\n\n function __Pausable_init_unchained() internal initializer {\n _paused = false;\n }\n\n /**\n * @dev Returns true if the contract is paused, and false otherwise.\n */\n function paused() public view virtual returns (bool) {\n return _paused;\n }\n\n /**\n * @dev Modifier to make a function callable only when the contract is not paused.\n *\n * Requirements:\n *\n * - The contract must not be paused.\n */\n modifier whenNotPaused() {\n require(!paused(), \"Pausable: paused\");\n _;\n }\n\n /**\n * @dev Modifier to make a function callable only when the contract is paused.\n *\n * Requirements:\n *\n * - The contract must be paused.\n */\n modifier whenPaused() {\n require(paused(), \"Pausable: not paused\");\n _;\n }\n\n /**\n * @dev Triggers stopped state.\n *\n * Requirements:\n *\n * - The contract must not be paused.\n */\n function _pause() internal virtual whenNotPaused {\n _paused = true;\n emit Paused(_msgSender());\n }\n\n /**\n * @dev Returns to normal state.\n *\n * Requirements:\n *\n * - The contract must be paused.\n */\n function _unpause() internal virtual whenPaused {\n _paused = false;\n emit Unpaused(_msgSender());\n }\n uint256[49] private __gap;\n}\n" + }, + "@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n\npragma solidity >=0.6.0 <0.8.0;\nimport \"../proxy/Initializable.sol\";\n\n/**\n * @dev Contract module that helps prevent reentrant calls to a function.\n *\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\n * available, which can be applied to functions to make sure there are no nested\n * (reentrant) calls to them.\n *\n * Note that because there is a single `nonReentrant` guard, functions marked as\n * `nonReentrant` may not call one another. This can be worked around by making\n * those functions `private`, and then adding `external` `nonReentrant` entry\n * points to them.\n *\n * TIP: If you would like to learn more about reentrancy and alternative ways\n * to protect against it, check out our blog post\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\n */\nabstract contract ReentrancyGuardUpgradeable is Initializable {\n // Booleans are more expensive than uint256 or any type that takes up a full\n // word because each write operation emits an extra SLOAD to first read the\n // slot's contents, replace the bits taken up by the boolean, and then write\n // back. This is the compiler's defense against contract upgrades and\n // pointer aliasing, and it cannot be disabled.\n\n // The values being non-zero value makes deployment a bit more expensive,\n // but in exchange the refund on every call to nonReentrant will be lower in\n // amount. Since refunds are capped to a percentage of the total\n // transaction's gas, it is best to keep them low in cases like this one, to\n // increase the likelihood of the full refund coming into effect.\n uint256 private constant _NOT_ENTERED = 1;\n uint256 private constant _ENTERED = 2;\n\n uint256 private _status;\n\n function __ReentrancyGuard_init() internal initializer {\n __ReentrancyGuard_init_unchained();\n }\n\n function __ReentrancyGuard_init_unchained() internal initializer {\n _status = _NOT_ENTERED;\n }\n\n /**\n * @dev Prevents a contract from calling itself, directly or indirectly.\n * Calling a `nonReentrant` function from another `nonReentrant`\n * function is not supported. It is possible to prevent this from happening\n * by making the `nonReentrant` function external, and make it call a\n * `private` function that does the actual work.\n */\n modifier nonReentrant() {\n // On the first call to nonReentrant, _notEntered will be true\n require(_status != _ENTERED, \"ReentrancyGuard: reentrant call\");\n\n // Any calls to nonReentrant after this point will fail\n _status = _ENTERED;\n\n _;\n\n // By storing the original value once again, a refund is triggered (see\n // https://eips.ethereum.org/EIPS/eip-2200)\n _status = _NOT_ENTERED;\n }\n uint256[49] private __gap;\n}\n" + }, + "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n\npragma solidity >=0.6.0 <0.8.0;\nimport \"../proxy/Initializable.sol\";\n\n/*\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with GSN meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract ContextUpgradeable is Initializable {\n function __Context_init() internal initializer {\n __Context_init_unchained();\n }\n\n function __Context_init_unchained() internal initializer {\n }\n function _msgSender() internal view virtual returns (address payable) {\n return msg.sender;\n }\n\n function _msgData() internal view virtual returns (bytes memory) {\n this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\n return msg.data;\n }\n uint256[50] private __gap;\n}\n" + }, + "@openzeppelin/contracts-upgradeable/proxy/Initializable.sol": { + "content": "// SPDX-License-Identifier: MIT\n\n// solhint-disable-next-line compiler-version\npragma solidity >=0.4.24 <0.8.0;\n\nimport \"../utils/AddressUpgradeable.sol\";\n\n/**\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\n * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\n *\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\n * possible by providing the encoded function call as the `_data` argument to {UpgradeableProxy-constructor}.\n *\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\n */\nabstract contract Initializable {\n\n /**\n * @dev Indicates that the contract has been initialized.\n */\n bool private _initialized;\n\n /**\n * @dev Indicates that the contract is in the process of being initialized.\n */\n bool private _initializing;\n\n /**\n * @dev Modifier to protect an initializer function from being invoked twice.\n */\n modifier initializer() {\n require(_initializing || _isConstructor() || !_initialized, \"Initializable: contract is already initialized\");\n\n bool isTopLevelCall = !_initializing;\n if (isTopLevelCall) {\n _initializing = true;\n _initialized = true;\n }\n\n _;\n\n if (isTopLevelCall) {\n _initializing = false;\n }\n }\n\n /// @dev Returns true if and only if the function is running in the constructor\n function _isConstructor() private view returns (bool) {\n return !AddressUpgradeable.isContract(address(this));\n }\n}\n" + }, + "@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n\npragma solidity >=0.6.2 <0.8.0;\n\n/**\n * @dev Collection of functions related to the address type\n */\nlibrary AddressUpgradeable {\n /**\n * @dev Returns true if `account` is a contract.\n *\n * [IMPORTANT]\n * ====\n * It is unsafe to assume that an address for which this function returns\n * false is an externally-owned account (EOA) and not a contract.\n *\n * Among others, `isContract` will return false for the following\n * types of addresses:\n *\n * - an externally-owned account\n * - a contract in construction\n * - an address where a contract will be created\n * - an address where a contract lived, but was destroyed\n * ====\n */\n function isContract(address account) internal view returns (bool) {\n // This method relies on extcodesize, which returns 0 for contracts in\n // construction, since the code is only stored at the end of the\n // constructor execution.\n\n uint256 size;\n // solhint-disable-next-line no-inline-assembly\n assembly { size := extcodesize(account) }\n return size > 0;\n }\n\n /**\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\n * `recipient`, forwarding all available gas and reverting on errors.\n *\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\n * imposed by `transfer`, making them unable to receive funds via\n * `transfer`. {sendValue} removes this limitation.\n *\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\n *\n * IMPORTANT: because control is transferred to `recipient`, care must be\n * taken to not create reentrancy vulnerabilities. Consider using\n * {ReentrancyGuard} or the\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\n */\n function sendValue(address payable recipient, uint256 amount) internal {\n require(address(this).balance >= amount, \"Address: insufficient balance\");\n\n // solhint-disable-next-line avoid-low-level-calls, avoid-call-value\n (bool success, ) = recipient.call{ value: amount }(\"\");\n require(success, \"Address: unable to send value, recipient may have reverted\");\n }\n\n /**\n * @dev Performs a Solidity function call using a low level `call`. A\n * plain`call` is an unsafe replacement for a function call: use this\n * function instead.\n *\n * If `target` reverts with a revert reason, it is bubbled up by this\n * function (like regular Solidity function calls).\n *\n * Returns the raw returned data. To convert to the expected return value,\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\n *\n * Requirements:\n *\n * - `target` must be a contract.\n * - calling `target` with `data` must not revert.\n *\n * _Available since v3.1._\n */\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionCall(target, data, \"Address: low-level call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\n * `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\n return functionCallWithValue(target, data, 0, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but also transferring `value` wei to `target`.\n *\n * Requirements:\n *\n * - the calling contract must have an ETH balance of at least `value`.\n * - the called Solidity function must be `payable`.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\n return functionCallWithValue(target, data, value, \"Address: low-level call with value failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\n * with `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {\n require(address(this).balance >= value, \"Address: insufficient balance for call\");\n require(isContract(target), \"Address: call to non-contract\");\n\n // solhint-disable-next-line avoid-low-level-calls\n (bool success, bytes memory returndata) = target.call{ value: value }(data);\n return _verifyCallResult(success, returndata, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\n return functionStaticCall(target, data, \"Address: low-level static call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {\n require(isContract(target), \"Address: static call to non-contract\");\n\n // solhint-disable-next-line avoid-low-level-calls\n (bool success, bytes memory returndata) = target.staticcall(data);\n return _verifyCallResult(success, returndata, errorMessage);\n }\n\n function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {\n if (success) {\n return returndata;\n } else {\n // Look for revert reason and bubble it up if present\n if (returndata.length > 0) {\n // The easiest way to bubble the revert reason is using memory via assembly\n\n // solhint-disable-next-line no-inline-assembly\n assembly {\n let returndata_size := mload(returndata)\n revert(add(32, returndata), returndata_size)\n }\n } else {\n revert(errorMessage);\n }\n }\n }\n}\n" + }, + "contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L2CrossDomainMessenger.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_AddressResolver } from \"../../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/* Interface Imports */\nimport { iOVM_L2CrossDomainMessenger } from \"../../../iOVM/bridge/messaging/iOVM_L2CrossDomainMessenger.sol\";\nimport { iOVM_L1MessageSender } from \"../../../iOVM/predeploys/iOVM_L1MessageSender.sol\";\nimport { iOVM_L2ToL1MessagePasser } from \"../../../iOVM/predeploys/iOVM_L2ToL1MessagePasser.sol\";\n\n/* Contract Imports */\nimport { Abs_BaseCrossDomainMessenger } from \"./Abs_BaseCrossDomainMessenger.sol\";\n\n/* External Imports */\nimport { ReentrancyGuard } from \"@openzeppelin/contracts/utils/ReentrancyGuard.sol\";\n\n/**\n * @title OVM_L2CrossDomainMessenger\n * @dev The L2 Cross Domain Messenger contract sends messages from L2 to L1, and is the entry point\n * for L2 messages sent via the L1 Cross Domain Messenger.\n *\n * Compiler used: optimistic-solc\n * Runtime target: OVM\n */\ncontract OVM_L2CrossDomainMessenger is\n iOVM_L2CrossDomainMessenger,\n Abs_BaseCrossDomainMessenger,\n Lib_AddressResolver,\n ReentrancyGuard\n{\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n constructor(\n address _libAddressManager\n )\n Lib_AddressResolver(_libAddressManager)\n ReentrancyGuard()\n {}\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Relays a cross domain message to a contract.\n * @inheritdoc iOVM_L2CrossDomainMessenger\n */\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce\n )\n override\n nonReentrant\n public\n {\n require(\n _verifyXDomainMessage() == true,\n \"Provided message could not be verified.\"\n );\n\n bytes memory xDomainCalldata = _getXDomainCalldata(\n _target,\n _sender,\n _message,\n _messageNonce\n );\n\n bytes32 xDomainCalldataHash = keccak256(xDomainCalldata);\n\n require(\n successfulMessages[xDomainCalldataHash] == false,\n \"Provided message has already been received.\"\n );\n\n // Prevent calls to OVM_L2ToL1MessagePasser, which would enable\n // an attacker to maliciously craft the _message to spoof\n // a call from any L2 account.\n if(_target == resolve(\"OVM_L2ToL1MessagePasser\")){\n // Write to the successfulMessages mapping and return immediately.\n successfulMessages[xDomainCalldataHash] = true;\n return;\n }\n\n xDomainMsgSender = _sender;\n (bool success, ) = _target.call(_message);\n xDomainMsgSender = DEFAULT_XDOMAIN_SENDER;\n\n // Mark the message as received if the call was successful. Ensures that a message can be\n // relayed multiple times in the case that the call reverted.\n if (success == true) {\n successfulMessages[xDomainCalldataHash] = true;\n emit RelayedMessage(xDomainCalldataHash);\n } else {\n emit FailedRelayedMessage(xDomainCalldataHash);\n }\n\n // Store an identifier that can be used to prove that the given message was relayed by some\n // user. Gives us an easy way to pay relayers for their work.\n bytes32 relayId = keccak256(\n abi.encodePacked(\n xDomainCalldata,\n msg.sender,\n block.number\n )\n );\n\n relayedMessages[relayId] = true;\n }\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Verifies that a received cross domain message is valid.\n * @return _valid Whether or not the message is valid.\n */\n function _verifyXDomainMessage()\n view\n internal\n returns (\n bool _valid\n )\n {\n return (\n iOVM_L1MessageSender(\n resolve(\"OVM_L1MessageSender\")\n ).getL1MessageSender() == resolve(\"OVM_L1CrossDomainMessenger\")\n );\n }\n\n /**\n * Sends a cross domain message.\n * @param _message Message to send.\n * param _gasLimit Gas limit for the provided message.\n */\n function _sendXDomainMessage(\n bytes memory _message,\n uint256 // _gasLimit\n )\n override\n internal\n {\n iOVM_L2ToL1MessagePasser(resolve(\"OVM_L2ToL1MessagePasser\")).passMessageToL1(_message);\n }\n}\n" + }, + "contracts/optimistic-ethereum/iOVM/bridge/messaging/iOVM_L2CrossDomainMessenger.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Interface Imports */\nimport { iAbs_BaseCrossDomainMessenger } from \"./iAbs_BaseCrossDomainMessenger.sol\";\n\n/**\n * @title iOVM_L2CrossDomainMessenger\n */\ninterface iOVM_L2CrossDomainMessenger is iAbs_BaseCrossDomainMessenger {\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Relays a cross domain message to a contract.\n * @param _target Target contract address.\n * @param _sender Message sender address.\n * @param _message Message to send to the target.\n * @param _messageNonce Nonce for the provided message.\n */\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce\n ) external;\n}\n" + }, + "contracts/optimistic-ethereum/iOVM/predeploys/iOVM_L1MessageSender.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/**\n * @title iOVM_L1MessageSender\n */\ninterface iOVM_L1MessageSender {\n\n /********************\n * Public Functions *\n ********************/\n\n function getL1MessageSender() external view returns (address _l1MessageSender);\n}\n" + }, + "contracts/optimistic-ethereum/iOVM/predeploys/iOVM_L2ToL1MessagePasser.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/**\n * @title iOVM_L2ToL1MessagePasser\n */\ninterface iOVM_L2ToL1MessagePasser {\n\n /**********\n * Events *\n **********/\n\n event L2ToL1Message(\n uint256 _nonce,\n address _sender,\n bytes _data\n );\n\n\n /********************\n * Public Functions *\n ********************/\n\n function passMessageToL1(bytes calldata _message) external;\n}\n" + }, + "@openzeppelin/contracts/utils/ReentrancyGuard.sol": { + "content": "// SPDX-License-Identifier: MIT\n\npragma solidity >=0.6.0 <0.8.0;\n\n/**\n * @dev Contract module that helps prevent reentrant calls to a function.\n *\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\n * available, which can be applied to functions to make sure there are no nested\n * (reentrant) calls to them.\n *\n * Note that because there is a single `nonReentrant` guard, functions marked as\n * `nonReentrant` may not call one another. This can be worked around by making\n * those functions `private`, and then adding `external` `nonReentrant` entry\n * points to them.\n *\n * TIP: If you would like to learn more about reentrancy and alternative ways\n * to protect against it, check out our blog post\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\n */\nabstract contract ReentrancyGuard {\n // Booleans are more expensive than uint256 or any type that takes up a full\n // word because each write operation emits an extra SLOAD to first read the\n // slot's contents, replace the bits taken up by the boolean, and then write\n // back. This is the compiler's defense against contract upgrades and\n // pointer aliasing, and it cannot be disabled.\n\n // The values being non-zero value makes deployment a bit more expensive,\n // but in exchange the refund on every call to nonReentrant will be lower in\n // amount. Since refunds are capped to a percentage of the total\n // transaction's gas, it is best to keep them low in cases like this one, to\n // increase the likelihood of the full refund coming into effect.\n uint256 private constant _NOT_ENTERED = 1;\n uint256 private constant _ENTERED = 2;\n\n uint256 private _status;\n\n constructor () internal {\n _status = _NOT_ENTERED;\n }\n\n /**\n * @dev Prevents a contract from calling itself, directly or indirectly.\n * Calling a `nonReentrant` function from another `nonReentrant`\n * function is not supported. It is possible to prevent this from happening\n * by making the `nonReentrant` function external, and make it call a\n * `private` function that does the actual work.\n */\n modifier nonReentrant() {\n // On the first call to nonReentrant, _notEntered will be true\n require(_status != _ENTERED, \"ReentrancyGuard: reentrant call\");\n\n // Any calls to nonReentrant after this point will fail\n _status = _ENTERED;\n\n _;\n\n // By storing the original value once again, a refund is triggered (see\n // https://eips.ethereum.org/EIPS/eip-2200)\n _status = _NOT_ENTERED;\n }\n}\n" + }, + "contracts/optimistic-ethereum/OVM/predeploys/OVM_L2ToL1MessagePasser.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Interface Imports */\nimport { iOVM_L2ToL1MessagePasser } from \"../../iOVM/predeploys/iOVM_L2ToL1MessagePasser.sol\";\n\n/**\n * @title OVM_L2ToL1MessagePasser\n * @dev The L2 to L1 Message Passer is a utility contract which facilitate an L1 proof of the\n * of a message on L2. The L1 Cross Domain Messenger performs this proof in its\n * _verifyStorageProof function, which verifies the existence of the transaction hash in this\n * contract's `sentMessages` mapping.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract OVM_L2ToL1MessagePasser is iOVM_L2ToL1MessagePasser {\n\n /**********************\n * Contract Variables *\n **********************/\n\n mapping (bytes32 => bool) public sentMessages;\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Passes a message to L1.\n * @param _message Message to pass to L1.\n */\n function passMessageToL1(\n bytes memory _message\n )\n override\n public\n {\n // Note: although this function is public, only messages sent from the OVM_L2CrossDomainMessenger\n // will be relayed by the OVM_L1CrossDomainMessenger. This is enforced by a check in\n // OVM_L1CrossDomainMessenger._verifyStorageProof().\n sentMessages[keccak256(\n abi.encodePacked(\n _message,\n msg.sender\n )\n )] = true;\n }\n}\n" + }, + "contracts/optimistic-ethereum/OVM/predeploys/OVM_L1MessageSender.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Interface Imports */\nimport { iOVM_L1MessageSender } from \"../../iOVM/predeploys/iOVM_L1MessageSender.sol\";\nimport { iOVM_ExecutionManager } from \"../../iOVM/execution/iOVM_ExecutionManager.sol\";\n\n/**\n * @title OVM_L1MessageSender\n * @dev The L1MessageSender is a predeploy contract running on L2. During the execution of cross\n * domain transaction from L1 to L2, it returns the address of the L1 account (either an EOA or\n * contract) which sent the message to L2 via the Canonical Transaction Chain's `enqueue()`\n * function.\n *\n * This contract exclusively serves as a getter for the ovmL1TXORIGIN operation. This is necessary\n * because there is no corresponding operation in the EVM which the the optimistic solidity compiler\n * can be replaced with a call to the ExecutionManager's ovmL1TXORIGIN() function.\n *\n *\n * Compiler used: solc\n * Runtime target: OVM\n */\ncontract OVM_L1MessageSender is iOVM_L1MessageSender {\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @return _l1MessageSender L1 message sender address (msg.sender).\n */\n function getL1MessageSender()\n override\n public\n view\n returns (\n address _l1MessageSender\n )\n {\n // Note that on L2 msg.sender (ie. evmCALLER) will always be the Execution Manager\n return iOVM_ExecutionManager(msg.sender).ovmL1TXORIGIN();\n }\n}\n" + }, + "contracts/optimistic-ethereum/OVM/bridge/tokens/OVM_L1ETHGateway.sol": { + "content": "// SPDX-License-Identifier: MIT\n// @unsupported: ovm\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Interface Imports */\nimport { iOVM_L1ETHGateway } from \"../../../iOVM/bridge/tokens/iOVM_L1ETHGateway.sol\";\nimport { iOVM_L2DepositedToken } from \"../../../iOVM/bridge/tokens/iOVM_L2DepositedToken.sol\";\n\n/* Library Imports */\nimport { OVM_CrossDomainEnabled } from \"../../../libraries/bridge/OVM_CrossDomainEnabled.sol\";\nimport { Lib_AddressResolver } from \"../../../libraries/resolver/Lib_AddressResolver.sol\";\nimport { Lib_AddressManager } from \"../../../libraries/resolver/Lib_AddressManager.sol\";\n\n/**\n * @title OVM_L1ETHGateway\n * @dev The L1 ETH Gateway is a contract which stores deposited ETH that is in use on L2.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract OVM_L1ETHGateway is iOVM_L1ETHGateway, OVM_CrossDomainEnabled, Lib_AddressResolver {\n\n /********************\n * Public Constants *\n ********************/\n\n uint32 public constant override getFinalizeDepositL2Gas = 1200000;\n\n /********************************\n * External Contract References *\n ********************************/\n\n address public ovmEth;\n\n /***************\n * Constructor *\n ***************/\n\n // This contract lives behind a proxy, so the constructor parameters will go unused.\n constructor()\n OVM_CrossDomainEnabled(address(0))\n Lib_AddressResolver(address(0))\n public\n {}\n\n /******************\n * Initialization *\n ******************/\n\n /**\n * @param _libAddressManager Address manager for this OE deployment\n * @param _ovmEth L2 OVM_ETH implementation of iOVM_DepositedToken\n */\n function initialize(\n address _libAddressManager,\n address _ovmEth\n )\n public\n {\n require(libAddressManager == Lib_AddressManager(0), \"Contract has already been initialized.\");\n libAddressManager = Lib_AddressManager(_libAddressManager);\n ovmEth = _ovmEth;\n messenger = resolve(\"Proxy__OVM_L1CrossDomainMessenger\");\n }\n\n /**************\n * Depositing *\n **************/\n\n receive()\n external\n payable\n {\n _initiateDeposit(msg.sender, msg.sender);\n }\n\n /**\n * @dev deposit an amount of the ETH to the caller's balance on L2\n */\n function deposit()\n external\n override\n payable\n {\n _initiateDeposit(msg.sender, msg.sender);\n }\n\n /**\n * @dev deposit an amount of ETH to a recipients's balance on L2\n * @param _to L2 address to credit the withdrawal to\n */\n function depositTo(\n address _to\n )\n external\n override\n payable\n {\n _initiateDeposit(msg.sender, _to);\n }\n\n /**\n * @dev Performs the logic for deposits by storing the ETH and informing the L2 ETH Gateway of the deposit.\n *\n * @param _from Account to pull the deposit from on L1\n * @param _to Account to give the deposit to on L2\n */\n function _initiateDeposit(\n address _from,\n address _to\n )\n internal\n {\n // Construct calldata for l2ETHGateway.finalizeDeposit(_to, _amount)\n bytes memory data =\n abi.encodeWithSelector(\n iOVM_L2DepositedToken.finalizeDeposit.selector,\n _to,\n msg.value\n );\n\n // Send calldata into L2\n sendCrossDomainMessage(\n ovmEth,\n data,\n getFinalizeDepositL2Gas\n );\n\n emit DepositInitiated(_from, _to, msg.value);\n }\n\n /*************************\n * Cross-chain Functions *\n *************************/\n\n /**\n * @dev Complete a withdrawal from L2 to L1, and credit funds to the recipient's balance of the\n * L1 ETH token.\n * Since only the xDomainMessenger can call this function, it will never be called before the withdrawal is finalized.\n *\n * @param _to L1 address to credit the withdrawal to\n * @param _amount Amount of the ETH to withdraw\n */\n function finalizeWithdrawal(\n address _to,\n uint256 _amount\n )\n external\n override\n onlyFromCrossDomainAccount(ovmEth)\n {\n _safeTransferETH(_to, _amount);\n\n emit WithdrawalFinalized(_to, _amount);\n }\n\n /**********************************\n * Internal Functions: Accounting *\n **********************************/\n\n /**\n * @dev Internal accounting function for moving around L1 ETH.\n *\n * @param _to L1 address to transfer ETH to\n * @param _value Amount of ETH to send to\n */\n function _safeTransferETH(\n address _to,\n uint256 _value\n )\n internal\n {\n (bool success, ) = _to.call{value: _value}(new bytes(0));\n require(success, 'TransferHelper::safeTransferETH: ETH transfer failed');\n }\n\n /*****************************\n * Temporary - Migrating ETH *\n *****************************/\n\n /**\n * @dev Migrates entire ETH balance to another gateway\n * @param _to Gateway Proxy address to migrate ETH to\n */\n function migrateEth(address payable _to) external {\n address owner = Lib_AddressManager(libAddressManager).owner();\n require(msg.sender == owner, \"Only the owner can migrate ETH\");\n uint256 balance = address(this).balance;\n OVM_L1ETHGateway(_to).donateETH{value:balance}();\n }\n\n /**\n * @dev Adds ETH balance to the account. This is meant to allow for ETH\n * to be migrated from an old gateway to a new gateway\n */\n function donateETH() external payable {}\n}\n" + }, + "contracts/optimistic-ethereum/iOVM/bridge/tokens/iOVM_L1ETHGateway.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0;\npragma experimental ABIEncoderV2;\n\n/**\n * @title iOVM_L1ETHGateway\n */\ninterface iOVM_L1ETHGateway {\n\n /**********\n * Events *\n **********/\n\n event DepositInitiated(\n address indexed _from,\n address _to,\n uint256 _amount\n );\n\n event WithdrawalFinalized(\n address indexed _to,\n uint256 _amount\n );\n\n /********************\n * Public Functions *\n ********************/\n\n function deposit()\n external\n payable;\n\n function depositTo(\n address _to\n )\n external\n payable;\n\n /*************************\n * Cross-chain Functions *\n *************************/\n\n function finalizeWithdrawal(\n address _to,\n uint _amount\n )\n external;\n\n function getFinalizeDepositL2Gas()\n external\n view\n returns(\n uint32\n );\n}\n" + }, + "contracts/optimistic-ethereum/libraries/resolver/Lib_ResolvedDelegateProxy.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Library Imports */\nimport { Lib_AddressManager } from \"./Lib_AddressManager.sol\";\n\n/**\n * @title Lib_ResolvedDelegateProxy\n */\ncontract Lib_ResolvedDelegateProxy {\n\n /*************\n * Variables *\n *************/\n\n // Using mappings to store fields to avoid overwriting storage slots in the\n // implementation contract. For example, instead of storing these fields at\n // storage slot `0` & `1`, they are stored at `keccak256(key + slot)`.\n // See: https://solidity.readthedocs.io/en/v0.7.0/internals/layout_in_storage.html\n // NOTE: Do not use this code in your own contract system.\n // There is a known flaw in this contract, and we will remove it from the repository\n // in the near future. Due to the very limited way that we are using it, this flaw is\n // not an issue in our system.\n mapping (address => string) private implementationName;\n mapping (address => Lib_AddressManager) private addressManager;\n\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Lib_AddressManager.\n * @param _implementationName implementationName of the contract to proxy to.\n */\n constructor(\n address _libAddressManager,\n string memory _implementationName\n ) {\n addressManager[address(this)] = Lib_AddressManager(_libAddressManager);\n implementationName[address(this)] = _implementationName;\n }\n\n\n /*********************\n * Fallback Function *\n *********************/\n\n fallback()\n external\n payable\n {\n address target = addressManager[address(this)].getAddress(\n (implementationName[address(this)])\n );\n\n require(\n target != address(0),\n \"Target address must be initialized.\"\n );\n\n (bool success, bytes memory returndata) = target.delegatecall(msg.data);\n\n if (success == true) {\n assembly {\n return(add(returndata, 0x20), mload(returndata))\n }\n } else {\n assembly {\n revert(add(returndata, 0x20), mload(returndata))\n }\n }\n }\n}\n" + }, + "contracts/optimistic-ethereum/OVM/bridge/tokens/Abs_L1TokenGateway.sol": { + "content": "// SPDX-License-Identifier: MIT\n// @unsupported: ovm\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Interface Imports */\nimport { iOVM_L1TokenGateway } from \"../../../iOVM/bridge/tokens/iOVM_L1TokenGateway.sol\";\nimport { iOVM_L2DepositedToken } from \"../../../iOVM/bridge/tokens/iOVM_L2DepositedToken.sol\";\n\n/* Library Imports */\nimport { OVM_CrossDomainEnabled } from \"../../../libraries/bridge/OVM_CrossDomainEnabled.sol\";\n\n/**\n * @title Abs_L1TokenGateway\n * @dev An L1 Token Gateway is a contract which stores deposited L1 funds that are in use on L2.\n * It synchronizes a corresponding L2 representation of the \"deposited token\", informing it\n * of new deposits and releasing L1 funds when there are newly finalized withdrawals.\n *\n * NOTE: This abstract contract gives all the core functionality of an L1 token gateway,\n * but provides easy hooks in case developers need extensions in child contracts.\n * In many cases, the default OVM_L1ERC20Gateway will suffice.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\nabstract contract Abs_L1TokenGateway is iOVM_L1TokenGateway, OVM_CrossDomainEnabled {\n\n /********************************\n * External Contract References *\n ********************************/\n\n address public l2DepositedToken;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _l2DepositedToken iOVM_L2DepositedToken-compatible address on the chain being deposited into.\n * @param _l1messenger L1 Messenger address being used for cross-chain communications.\n */\n constructor(\n address _l2DepositedToken,\n address _l1messenger\n )\n OVM_CrossDomainEnabled(_l1messenger)\n {\n l2DepositedToken = _l2DepositedToken;\n }\n\n /********************************\n * Overridable Accounting logic *\n ********************************/\n\n // Default gas value which can be overridden if more complex logic runs on L2.\n uint32 internal constant DEFAULT_FINALIZE_DEPOSIT_L2_GAS = 1200000;\n\n /**\n * @dev Core logic to be performed when a withdrawal is finalized on L1.\n * In most cases, this will simply send locked funds to the withdrawer.\n *\n * param _to Address being withdrawn to.\n * param _amount Amount being withdrawn.\n */\n function _handleFinalizeWithdrawal(\n address, // _to,\n uint256 // _amount\n )\n internal\n virtual\n {\n revert(\"Implement me in child contracts\");\n }\n\n /**\n * @dev Core logic to be performed when a deposit is initiated on L1.\n * In most cases, this will simply send locked funds to the withdrawer.\n *\n * param _from Address being deposited from on L1.\n * param _to Address being deposited into on L2.\n * param _amount Amount being deposited.\n */\n function _handleInitiateDeposit(\n address, // _from,\n address, // _to,\n uint256 // _amount\n )\n internal\n virtual\n {\n revert(\"Implement me in child contracts\");\n }\n\n /**\n * @dev Overridable getter for the L2 gas limit, in the case it may be\n * dynamic, and the above public constant does not suffice.\n *\n */\n function getFinalizeDepositL2Gas()\n public\n view\n virtual\n returns(\n uint32\n )\n {\n return DEFAULT_FINALIZE_DEPOSIT_L2_GAS;\n }\n\n /**************\n * Depositing *\n **************/\n\n /**\n * @dev deposit an amount of the ERC20 to the caller's balance on L2\n * @param _amount Amount of the ERC20 to deposit\n */\n function deposit(\n uint _amount\n )\n external\n override\n virtual\n {\n _initiateDeposit(msg.sender, msg.sender, _amount);\n }\n\n /**\n * @dev deposit an amount of ERC20 to a recipients's balance on L2\n * @param _to L2 address to credit the withdrawal to\n * @param _amount Amount of the ERC20 to deposit\n */\n function depositTo(\n address _to,\n uint _amount\n )\n external\n override\n virtual\n {\n _initiateDeposit(msg.sender, _to, _amount);\n }\n\n /**\n * @dev Performs the logic for deposits by informing the L2 Deposited Token\n * contract of the deposit and calling a handler to lock the L1 funds. (e.g. transferFrom)\n *\n * @param _from Account to pull the deposit from on L1\n * @param _to Account to give the deposit to on L2\n * @param _amount Amount of the ERC20 to deposit.\n */\n function _initiateDeposit(\n address _from,\n address _to,\n uint _amount\n )\n internal\n {\n // Call our deposit accounting handler implemented by child contracts.\n _handleInitiateDeposit(\n _from,\n _to,\n _amount\n );\n\n // Construct calldata for l2DepositedToken.finalizeDeposit(_to, _amount)\n bytes memory data = abi.encodeWithSelector(\n iOVM_L2DepositedToken.finalizeDeposit.selector,\n _to,\n _amount\n );\n\n // Send calldata into L2\n sendCrossDomainMessage(\n l2DepositedToken,\n data,\n getFinalizeDepositL2Gas()\n );\n\n emit DepositInitiated(_from, _to, _amount);\n }\n\n /*************************\n * Cross-chain Functions *\n *************************/\n\n /**\n * @dev Complete a withdrawal from L2 to L1, and credit funds to the recipient's balance of the\n * L1 ERC20 token.\n * This call will fail if the initialized withdrawal from L2 has not been finalized.\n *\n * @param _to L1 address to credit the withdrawal to\n * @param _amount Amount of the ERC20 to withdraw\n */\n function finalizeWithdrawal(\n address _to,\n uint _amount\n )\n external\n override\n virtual\n onlyFromCrossDomainAccount(l2DepositedToken)\n {\n // Call our withdrawal accounting handler implemented by child contracts.\n _handleFinalizeWithdrawal(\n _to,\n _amount\n );\n\n emit WithdrawalFinalized(_to, _amount);\n }\n}\n" + }, + "contracts/optimistic-ethereum/OVM/bridge/tokens/OVM_L1ERC20Gateway.sol": { + "content": "// SPDX-License-Identifier: MIT\n// @unsupported: ovm\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Interface Imports */\nimport { iOVM_L1TokenGateway } from \"../../../iOVM/bridge/tokens/iOVM_L1TokenGateway.sol\";\nimport { Abs_L1TokenGateway } from \"./Abs_L1TokenGateway.sol\";\nimport { iOVM_ERC20 } from \"../../../iOVM/predeploys/iOVM_ERC20.sol\";\n\n/**\n * @title OVM_L1ERC20Gateway\n * @dev The L1 ERC20 Gateway is a contract which stores deposited L1 funds that are in use on L2.\n * It synchronizes a corresponding L2 ERC20 Gateway, informing it of deposits, and listening to it\n * for newly finalized withdrawals.\n *\n * NOTE: This contract extends Abs_L1TokenGateway, which is where we\n * takes care of most of the initialization and the cross-chain logic.\n * If you are looking to implement your own deposit/withdrawal contracts, you\n * may also want to extend the abstract contract in a similar manner.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract OVM_L1ERC20Gateway is Abs_L1TokenGateway {\n\n /********************************\n * External Contract References *\n ********************************/\n\n iOVM_ERC20 public l1ERC20;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _l1ERC20 L1 ERC20 address this contract stores deposits for\n * @param _l2DepositedERC20 L2 Gateway address on the chain being deposited into\n */\n constructor(\n iOVM_ERC20 _l1ERC20,\n address _l2DepositedERC20,\n address _l1messenger\n )\n Abs_L1TokenGateway(\n _l2DepositedERC20,\n _l1messenger\n )\n {\n l1ERC20 = _l1ERC20;\n }\n\n\n /**************\n * Accounting *\n **************/\n\n /**\n * @dev When a deposit is initiated on L1, the L1 Gateway\n * transfers the funds to itself for future withdrawals\n *\n * @param _from L1 address ETH is being deposited from\n * param _to L2 address that the ETH is being deposited to\n * @param _amount Amount of ERC20 to send\n */\n function _handleInitiateDeposit(\n address _from,\n address, // _to,\n uint256 _amount\n )\n internal\n override\n {\n // Hold on to the newly deposited funds\n l1ERC20.transferFrom(\n _from,\n address(this),\n _amount\n );\n }\n\n /**\n * @dev When a withdrawal is finalized on L1, the L1 Gateway\n * transfers the funds to the withdrawer\n *\n * @param _to L1 address that the ERC20 is being withdrawn to\n * @param _amount Amount of ERC20 to send\n */\n function _handleFinalizeWithdrawal(\n address _to,\n uint _amount\n )\n internal\n override\n {\n // Transfer withdrawn funds out to withdrawer\n l1ERC20.transfer(_to, _amount);\n }\n}\n" + }, + "contracts/optimistic-ethereum/iOVM/predeploys/iOVM_ERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/**\n * @title iOVM_ERC20\n */\ninterface iOVM_ERC20 {\n /* This is a slight change to the ERC20 base standard.\n function totalSupply() constant returns (uint256 supply);\n is replaced with:\n uint256 public totalSupply;\n This automatically creates a getter function for the totalSupply.\n This is moved to the base contract since public getter functions are not\n currently recognised as an implementation of the matching abstract\n function by the compiler.\n */\n /// total amount of tokens\n function totalSupply() external view returns (uint256);\n\n /// @param _owner The address from which the balance will be retrieved\n /// @return balance The balance\n function balanceOf(address _owner) external view returns (uint256 balance);\n\n /// @notice send `_value` token to `_to` from `msg.sender`\n /// @param _to The address of the recipient\n /// @param _value The amount of token to be transferred\n /// @return success Whether the transfer was successful or not\n function transfer(address _to, uint256 _value) external returns (bool success);\n\n /// @notice send `_value` token to `_to` from `_from` on the condition it is approved by `_from`\n /// @param _from The address of the sender\n /// @param _to The address of the recipient\n /// @param _value The amount of token to be transferred\n /// @return success Whether the transfer was successful or not\n function transferFrom(address _from, address _to, uint256 _value) external returns (bool success);\n\n /// @notice `msg.sender` approves `_spender` to spend `_value` tokens\n /// @param _spender The address of the account able to transfer the tokens\n /// @param _value The amount of tokens to be approved for transfer\n /// @return success Whether the approval was successful or not\n function approve(address _spender, uint256 _value) external returns (bool success);\n\n /// @param _owner The address of the account owning tokens\n /// @param _spender The address of the account able to transfer the tokens\n /// @return remaining Amount of remaining tokens allowed to spent\n function allowance(address _owner, address _spender) external view returns (uint256 remaining);\n\n // solhint-disable-next-line no-simple-event-func-name\n event Transfer(address indexed _from, address indexed _to, uint256 _value);\n event Approval(address indexed _owner, address indexed _spender, uint256 _value);\n event Mint(address indexed _account, uint256 _amount);\n event Burn(address indexed _account, uint256 _amount);\n}\n" + }, + "contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1MultiMessageRelayer.sol": { + "content": "// SPDX-License-Identifier: MIT\n// @unsupported: ovm\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Interface Imports */\nimport { iOVM_L1CrossDomainMessenger } from \"../../../iOVM/bridge/messaging/iOVM_L1CrossDomainMessenger.sol\";\nimport { iOVM_L1MultiMessageRelayer } from \"../../../iOVM/bridge/messaging/iOVM_L1MultiMessageRelayer.sol\";\n\n/* Library Imports */\nimport { Lib_AddressResolver } from \"../../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/**\n * @title OVM_L1MultiMessageRelayer\n * @dev The L1 Multi-Message Relayer contract is a gas efficiency optimization which enables the\n * relayer to submit multiple messages in a single transaction to be relayed by the L1 Cross Domain\n * Message Sender.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract OVM_L1MultiMessageRelayer is iOVM_L1MultiMessageRelayer, Lib_AddressResolver {\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n constructor(\n address _libAddressManager\n )\n Lib_AddressResolver(_libAddressManager)\n {}\n\n\n /**********************\n * Function Modifiers *\n **********************/\n\n modifier onlyBatchRelayer() {\n require(\n msg.sender == resolve(\"OVM_L2BatchMessageRelayer\"),\n \"OVM_L1MultiMessageRelayer: Function can only be called by the OVM_L2BatchMessageRelayer\"\n );\n _;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @notice Forwards multiple cross domain messages to the L1 Cross Domain Messenger for relaying\n * @param _messages An array of L2 to L1 messages\n */\n function batchRelayMessages(\n L2ToL1Message[] calldata _messages\n ) \n override\n external\n onlyBatchRelayer\n {\n iOVM_L1CrossDomainMessenger messenger = iOVM_L1CrossDomainMessenger(\n resolve(\"Proxy__OVM_L1CrossDomainMessenger\")\n );\n\n for (uint256 i = 0; i < _messages.length; i++) {\n L2ToL1Message memory message = _messages[i];\n messenger.relayMessage(\n message.target,\n message.sender,\n message.message,\n message.messageNonce,\n message.proof\n );\n }\n }\n}\n" + }, + "contracts/optimistic-ethereum/iOVM/bridge/messaging/iOVM_L1MultiMessageRelayer.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Interface Imports */\nimport { iOVM_L1CrossDomainMessenger } from \"../../../iOVM/bridge/messaging/iOVM_L1CrossDomainMessenger.sol\";\ninterface iOVM_L1MultiMessageRelayer {\n\n struct L2ToL1Message {\n address target;\n address sender;\n bytes message;\n uint256 messageNonce;\n iOVM_L1CrossDomainMessenger.L2MessageInclusionProof proof;\n }\n\n function batchRelayMessages(L2ToL1Message[] calldata _messages) external;\n}\n" + }, + "contracts/test-libraries/trie/TestLib_SecureMerkleTrie.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_SecureMerkleTrie } from \"../../optimistic-ethereum/libraries/trie/Lib_SecureMerkleTrie.sol\";\n\n/**\n * @title TestLib_SecureMerkleTrie\n */\ncontract TestLib_SecureMerkleTrie {\n\n function verifyInclusionProof(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n )\n public\n pure\n returns (\n bool\n )\n {\n return Lib_SecureMerkleTrie.verifyInclusionProof(\n _key,\n _value,\n _proof,\n _root\n );\n }\n\n function update(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n )\n public\n pure\n returns (\n bytes32\n )\n {\n return Lib_SecureMerkleTrie.update(\n _key,\n _value,\n _proof,\n _root\n );\n }\n\n function get(\n bytes memory _key,\n bytes memory _proof,\n bytes32 _root\n )\n public\n pure\n returns (\n bool,\n bytes memory\n )\n {\n return Lib_SecureMerkleTrie.get(\n _key,\n _proof,\n _root\n );\n }\n\n function getSingleNodeRootHash(\n bytes memory _key,\n bytes memory _value\n )\n public\n pure\n returns (\n bytes32\n )\n {\n return Lib_SecureMerkleTrie.getSingleNodeRootHash(\n _key,\n _value\n );\n }\n}\n" + }, + "contracts/test-libraries/trie/TestLib_MerkleTrie.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Library Imports */\nimport { Lib_MerkleTrie } from \"../../optimistic-ethereum/libraries/trie/Lib_MerkleTrie.sol\";\n\n/**\n * @title TestLib_MerkleTrie\n */\ncontract TestLib_MerkleTrie {\n\n function verifyInclusionProof(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n )\n public\n pure\n returns (\n bool\n )\n {\n return Lib_MerkleTrie.verifyInclusionProof(\n _key,\n _value,\n _proof,\n _root\n );\n }\n\n function update(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n )\n public\n pure\n returns (\n bytes32\n )\n {\n return Lib_MerkleTrie.update(\n _key,\n _value,\n _proof,\n _root\n );\n }\n\n function get(\n bytes memory _key,\n bytes memory _proof,\n bytes32 _root\n )\n public\n pure\n returns (\n bool,\n bytes memory\n )\n {\n return Lib_MerkleTrie.get(\n _key,\n _proof,\n _root\n );\n }\n\n function getSingleNodeRootHash(\n bytes memory _key,\n bytes memory _value\n )\n public\n pure\n returns (\n bytes32\n )\n {\n return Lib_MerkleTrie.getSingleNodeRootHash(\n _key,\n _value\n );\n }\n}\n" + }, + "contracts/test-libraries/rlp/TestLib_RLPWriter.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_RLPWriter } from \"../../optimistic-ethereum/libraries/rlp/Lib_RLPWriter.sol\";\nimport { TestERC20 } from \"../../test-helpers/TestERC20.sol\";\n\n/**\n * @title TestLib_RLPWriter\n */\ncontract TestLib_RLPWriter {\n\n function writeBytes(\n bytes memory _in\n )\n public\n pure\n returns (\n bytes memory _out\n )\n {\n return Lib_RLPWriter.writeBytes(_in);\n }\n\n function writeList(\n bytes[] memory _in\n )\n public\n pure\n returns (\n bytes memory _out\n )\n {\n return Lib_RLPWriter.writeList(_in);\n }\n\n function writeString(\n string memory _in\n )\n public\n pure\n returns (\n bytes memory _out\n )\n {\n return Lib_RLPWriter.writeString(_in);\n }\n\n function writeAddress(\n address _in\n )\n public\n pure\n returns (\n bytes memory _out\n )\n {\n return Lib_RLPWriter.writeAddress(_in);\n }\n\n function writeUint(\n uint256 _in\n )\n public\n pure\n returns (\n bytes memory _out\n )\n {\n return Lib_RLPWriter.writeUint(_in);\n }\n\n function writeBool(\n bool _in\n )\n public\n pure\n returns (\n bytes memory _out\n )\n {\n return Lib_RLPWriter.writeBool(_in);\n }\n\n function writeAddressWithTaintedMemory(\n address _in\n )\n public\n returns (\n bytes memory _out\n )\n {\n new TestERC20();\n return Lib_RLPWriter.writeAddress(_in);\n }\n}\n" + }, + "contracts/test-helpers/TestERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n// a test ERC20 token with an open mint function\ncontract TestERC20 {\n using SafeMath for uint;\n\n string public constant name = 'Test';\n string public constant symbol = 'TST';\n uint8 public constant decimals = 18;\n uint256 public totalSupply;\n mapping(address => uint) public balanceOf;\n mapping(address => mapping(address => uint)) public allowance;\n\n event Approval(address indexed owner, address indexed spender, uint256 value);\n event Transfer(address indexed from, address indexed to, uint256 value);\n\n constructor() {}\n\n function mint(address to, uint256 value) public {\n totalSupply = totalSupply.add(value);\n balanceOf[to] = balanceOf[to].add(value);\n emit Transfer(address(0), to, value);\n }\n\n function _approve(address owner, address spender, uint256 value) private {\n allowance[owner][spender] = value;\n emit Approval(owner, spender, value);\n }\n\n function _transfer(address from, address to, uint256 value) private {\n balanceOf[from] = balanceOf[from].sub(value);\n balanceOf[to] = balanceOf[to].add(value);\n emit Transfer(from, to, value);\n }\n\n function approve(address spender, uint256 value) external returns (bool) {\n _approve(msg.sender, spender, value);\n return true;\n }\n\n function transfer(address to, uint256 value) external returns (bool) {\n _transfer(msg.sender, to, value);\n return true;\n }\n\n function transferFrom(address from, address to, uint256 value) external returns (bool) {\n if (allowance[from][msg.sender] != uint(-1)) {\n allowance[from][msg.sender] = allowance[from][msg.sender].sub(value);\n }\n _transfer(from, to, value);\n return true;\n }\n}\n\nlibrary SafeMath {\n function add(uint256 x, uint256 y) internal pure returns (uint256 z) {\n require((z = x + y) >= x, 'ds-math-add-overflow');\n }\n\n function sub(uint256 x, uint256 y) internal pure returns (uint256 z) {\n require((z = x - y) <= x, 'ds-math-sub-underflow');\n }\n\n function mul(uint256 x, uint256 y) internal pure returns (uint256 z) {\n require(y == 0 || (z = x * y) / y == x, 'ds-math-mul-overflow');\n }\n}\n" + }, + "contracts/test-libraries/utils/TestLib_BytesUtils.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_BytesUtils } from \"../../optimistic-ethereum/libraries/utils/Lib_BytesUtils.sol\";\nimport { TestERC20 } from \"../../test-helpers/TestERC20.sol\";\n\n/**\n * @title TestLib_BytesUtils\n */\ncontract TestLib_BytesUtils {\n\n function concat(\n bytes memory _preBytes,\n bytes memory _postBytes\n )\n public\n pure\n returns (bytes memory)\n {\n return abi.encodePacked(\n _preBytes,\n _postBytes\n );\n }\n\n function slice(\n bytes memory _bytes,\n uint256 _start,\n uint256 _length\n )\n public\n pure\n returns (bytes memory)\n {\n return Lib_BytesUtils.slice(\n _bytes,\n _start,\n _length\n );\n }\n\n function toBytes32(\n bytes memory _bytes\n )\n public\n pure\n returns (bytes32)\n {\n return Lib_BytesUtils.toBytes32(\n _bytes\n );\n }\n\n function toUint256(\n bytes memory _bytes\n )\n public\n pure\n returns (uint256)\n {\n return Lib_BytesUtils.toUint256(\n _bytes\n );\n }\n\n function toNibbles(\n bytes memory _bytes\n )\n public\n pure\n returns (bytes memory)\n {\n return Lib_BytesUtils.toNibbles(\n _bytes\n );\n }\n\n function fromNibbles(\n bytes memory _bytes\n )\n public\n pure\n returns (bytes memory)\n {\n return Lib_BytesUtils.fromNibbles(\n _bytes\n );\n }\n\n function equal(\n bytes memory _bytes,\n bytes memory _other\n )\n public\n pure\n returns (bool)\n {\n return Lib_BytesUtils.equal(\n _bytes,\n _other\n );\n }\n\n function sliceWithTaintedMemory(\n bytes memory _bytes,\n uint256 _start,\n uint256 _length\n )\n public\n returns (bytes memory)\n {\n new TestERC20();\n return Lib_BytesUtils.slice(\n _bytes,\n _start,\n _length\n );\n }\n}\n" + }, + "contracts/test-libraries/utils/TestLib_EthUtils.sol": { + "content": "// SPDX-License-Identifier: MIT\n// @unsupported: ovm\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_EthUtils } from \"../../optimistic-ethereum/libraries/utils/Lib_EthUtils.sol\";\n\n/**\n * @title TestLib_EthUtils\n */\ncontract TestLib_EthUtils {\n\n function getCode(\n address _address,\n uint256 _offset,\n uint256 _length\n )\n public\n view\n returns (\n bytes memory _code\n )\n {\n return Lib_EthUtils.getCode(\n _address,\n _offset,\n _length\n );\n }\n\n function getCode(\n address _address\n )\n public\n view\n returns (\n bytes memory _code\n )\n {\n return Lib_EthUtils.getCode(\n _address\n );\n }\n\n function getCodeSize(\n address _address\n )\n public\n view\n returns (\n uint256 _codeSize\n )\n {\n return Lib_EthUtils.getCodeSize(\n _address\n );\n }\n\n function getCodeHash(\n address _address\n )\n public\n view\n returns (\n bytes32 _codeHash\n )\n {\n return Lib_EthUtils.getCodeHash(\n _address\n );\n }\n\n function createContract(\n bytes memory _code\n )\n public\n returns (\n address _created\n )\n {\n return Lib_EthUtils.createContract(\n _code\n );\n }\n\n function getAddressForCREATE(\n address _creator,\n uint256 _nonce\n )\n public\n pure\n returns (\n address _address\n )\n {\n return Lib_EthUtils.getAddressForCREATE(\n _creator,\n _nonce\n );\n }\n\n function getAddressForCREATE2(\n address _creator,\n bytes memory _bytecode,\n bytes32 _salt\n )\n public\n pure\n returns (address _address)\n {\n return Lib_EthUtils.getAddressForCREATE2(\n _creator,\n _bytecode,\n _salt\n );\n }\n}\n" + }, + "contracts/test-libraries/utils/TestLib_Bytes32Utils.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Library Imports */\nimport { Lib_Bytes32Utils } from \"../../optimistic-ethereum/libraries/utils/Lib_Bytes32Utils.sol\";\n\n/**\n * @title TestLib_Byte32Utils\n */\ncontract TestLib_Bytes32Utils {\n\n function toBool(\n bytes32 _in\n )\n public\n pure\n returns (\n bool _out\n )\n {\n return Lib_Bytes32Utils.toBool(_in);\n }\n\n function fromBool(\n bool _in\n )\n public\n pure\n returns (\n bytes32 _out\n )\n {\n return Lib_Bytes32Utils.fromBool(_in);\n }\n\n function toAddress(\n bytes32 _in\n )\n public\n pure\n returns (\n address _out\n )\n {\n return Lib_Bytes32Utils.toAddress(_in);\n }\n\n function fromAddress(\n address _in\n )\n public\n pure\n returns (\n bytes32 _out\n )\n {\n return Lib_Bytes32Utils.fromAddress(_in);\n }\n}\n" + }, + "contracts/test-libraries/codec/TestLib_EIP155Tx.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_EIP155Tx } from \"../../optimistic-ethereum/libraries/codec/Lib_EIP155Tx.sol\";\n\n/**\n * @title TestLib_EIP155Tx\n */\ncontract TestLib_EIP155Tx {\n function decode(\n bytes memory _encoded,\n uint256 _chainId\n )\n public\n pure\n returns (\n Lib_EIP155Tx.EIP155Tx memory\n )\n {\n return Lib_EIP155Tx.decode(\n _encoded,\n _chainId\n );\n }\n\n function encode(\n Lib_EIP155Tx.EIP155Tx memory _transaction,\n bool _includeSignature\n )\n public\n pure\n returns (\n bytes memory\n )\n {\n return Lib_EIP155Tx.encode(\n _transaction,\n _includeSignature\n );\n }\n\n function hash(\n Lib_EIP155Tx.EIP155Tx memory _transaction\n )\n public\n pure\n returns (\n bytes32\n )\n {\n return Lib_EIP155Tx.hash(\n _transaction\n );\n }\n\n function sender(\n Lib_EIP155Tx.EIP155Tx memory _transaction\n )\n public\n pure\n returns (\n address\n )\n {\n return Lib_EIP155Tx.sender(\n _transaction\n );\n }\n}\n" + }, + "contracts/test-libraries/rlp/TestLib_RLPReader.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_RLPReader } from \"../../optimistic-ethereum/libraries/rlp/Lib_RLPReader.sol\";\n\n/**\n * @title TestLib_RLPReader\n */\ncontract TestLib_RLPReader {\n\n function readList(\n bytes memory _in\n )\n public\n pure\n returns (\n bytes[] memory\n )\n {\n Lib_RLPReader.RLPItem[] memory decoded = Lib_RLPReader.readList(_in);\n bytes[] memory out = new bytes[](decoded.length);\n for (uint256 i = 0; i < out.length; i++) {\n out[i] = Lib_RLPReader.readRawBytes(decoded[i]);\n }\n return out;\n }\n\n function readString(\n bytes memory _in\n )\n public\n pure\n returns (\n string memory\n )\n {\n return Lib_RLPReader.readString(_in);\n }\n\n function readBytes(\n bytes memory _in\n )\n public\n pure\n returns (\n bytes memory\n )\n {\n return Lib_RLPReader.readBytes(_in);\n }\n\n function readBytes32(\n bytes memory _in\n )\n public\n pure\n returns (\n bytes32\n )\n {\n return Lib_RLPReader.readBytes32(_in);\n }\n\n function readUint256(\n bytes memory _in\n )\n public\n pure\n returns (\n uint256\n )\n {\n return Lib_RLPReader.readUint256(_in);\n }\n\n function readBool(\n bytes memory _in\n )\n public\n pure\n returns (\n bool\n )\n {\n return Lib_RLPReader.readBool(_in);\n }\n\n function readAddress(\n bytes memory _in\n )\n public\n pure\n returns (\n address\n )\n {\n return Lib_RLPReader.readAddress(_in);\n }\n}\n" + }, + "contracts/optimistic-ethereum/OVM/verification/OVM_BondManager.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Library Imports */\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/* Interface Imports */\nimport { iOVM_BondManager, Errors, ERC20 } from \"../../iOVM/verification/iOVM_BondManager.sol\";\nimport { iOVM_FraudVerifier } from \"../../iOVM/verification/iOVM_FraudVerifier.sol\";\n\n/**\n * @title OVM_BondManager\n * @dev The Bond Manager contract handles deposits in the form of an ERC20 token from bonded\n * Proposers. It also handles the accounting of gas costs spent by a Verifier during the course of a\n * fraud proof. In the event of a successful fraud proof, the fraudulent Proposer's bond is slashed,\n * and the Verifier's gas costs are refunded.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract OVM_BondManager is iOVM_BondManager, Lib_AddressResolver {\n\n /****************************\n * Constants and Parameters *\n ****************************/\n\n /// The period to find the earliest fraud proof for a publisher\n uint256 public constant multiFraudProofPeriod = 7 days;\n\n /// The dispute period\n uint256 public constant disputePeriodSeconds = 7 days;\n\n /// The minimum collateral a sequencer must post\n uint256 public constant requiredCollateral = 1 ether;\n\n\n /*******************************************\n * Contract Variables: Contract References *\n *******************************************/\n\n /// The bond token\n ERC20 immutable public token;\n\n\n /********************************************\n * Contract Variables: Internal Accounting *\n *******************************************/\n\n /// The bonds posted by each proposer\n mapping(address => Bond) public bonds;\n\n /// For each pre-state root, there's an array of witnessProviders that must be rewarded\n /// for posting witnesses\n mapping(bytes32 => Rewards) public witnessProviders;\n\n\n /***************\n * Constructor *\n ***************/\n\n /// Initializes with a ERC20 token to be used for the fidelity bonds\n /// and with the Address Manager\n constructor(\n ERC20 _token,\n address _libAddressManager\n )\n Lib_AddressResolver(_libAddressManager)\n {\n token = _token;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n /// Adds `who` to the list of witnessProviders for the provided `preStateRoot`.\n function recordGasSpent(bytes32 _preStateRoot, bytes32 _txHash, address who, uint256 gasSpent) override public {\n // The sender must be the transitioner that corresponds to the claimed pre-state root\n address transitioner = address(iOVM_FraudVerifier(resolve(\"OVM_FraudVerifier\")).getStateTransitioner(_preStateRoot, _txHash));\n require(transitioner == msg.sender, Errors.ONLY_TRANSITIONER);\n\n witnessProviders[_preStateRoot].total += gasSpent;\n witnessProviders[_preStateRoot].gasSpent[who] += gasSpent;\n }\n\n /// Slashes + distributes rewards or frees up the sequencer's bond, only called by\n /// `FraudVerifier.finalizeFraudVerification`\n function finalize(bytes32 _preStateRoot, address publisher, uint256 timestamp) override public {\n require(msg.sender == resolve(\"OVM_FraudVerifier\"), Errors.ONLY_FRAUD_VERIFIER);\n require(witnessProviders[_preStateRoot].canClaim == false, Errors.ALREADY_FINALIZED);\n\n // allow users to claim from that state root's\n // pool of collateral (effectively slashing the sequencer)\n witnessProviders[_preStateRoot].canClaim = true;\n\n Bond storage bond = bonds[publisher];\n if (bond.firstDisputeAt == 0) {\n bond.firstDisputeAt = block.timestamp;\n bond.earliestDisputedStateRoot = _preStateRoot;\n bond.earliestTimestamp = timestamp;\n } else if (\n // only update the disputed state root for the publisher if it's within\n // the dispute period _and_ if it's before the previous one\n block.timestamp < bond.firstDisputeAt + multiFraudProofPeriod &&\n timestamp < bond.earliestTimestamp\n ) {\n bond.earliestDisputedStateRoot = _preStateRoot;\n bond.earliestTimestamp = timestamp;\n }\n\n // if the fraud proof's dispute period does not intersect with the\n // withdrawal's timestamp, then the user should not be slashed\n // e.g if a user at day 10 submits a withdrawal, and a fraud proof\n // from day 1 gets published, the user won't be slashed since day 8 (1d + 7d)\n // is before the user started their withdrawal. on the contrary, if the user\n // had started their withdrawal at, say, day 6, they would be slashed\n if (\n bond.withdrawalTimestamp != 0 &&\n uint256(bond.withdrawalTimestamp) > timestamp + disputePeriodSeconds &&\n bond.state == State.WITHDRAWING\n ) {\n return;\n }\n\n // slash!\n bond.state = State.NOT_COLLATERALIZED;\n }\n\n /// Sequencers call this function to post collateral which will be used for\n /// the `appendBatch` call\n function deposit() override public {\n require(\n token.transferFrom(msg.sender, address(this), requiredCollateral),\n Errors.ERC20_ERR\n );\n\n // This cannot overflow\n bonds[msg.sender].state = State.COLLATERALIZED;\n }\n\n /// Starts the withdrawal for a publisher\n function startWithdrawal() override public {\n Bond storage bond = bonds[msg.sender];\n require(bond.withdrawalTimestamp == 0, Errors.WITHDRAWAL_PENDING);\n require(bond.state == State.COLLATERALIZED, Errors.WRONG_STATE);\n\n bond.state = State.WITHDRAWING;\n bond.withdrawalTimestamp = uint32(block.timestamp);\n }\n\n /// Finalizes a pending withdrawal from a publisher\n function finalizeWithdrawal() override public {\n Bond storage bond = bonds[msg.sender];\n\n require(\n block.timestamp >= uint256(bond.withdrawalTimestamp) + disputePeriodSeconds,\n Errors.TOO_EARLY\n );\n require(bond.state == State.WITHDRAWING, Errors.SLASHED);\n\n // refunds!\n bond.state = State.NOT_COLLATERALIZED;\n bond.withdrawalTimestamp = 0;\n\n require(\n token.transfer(msg.sender, requiredCollateral),\n Errors.ERC20_ERR\n );\n }\n\n /// Claims the user's reward for the witnesses they provided for the earliest\n /// disputed state root of the designated publisher\n function claim(address who) override public {\n Bond storage bond = bonds[who];\n require(\n block.timestamp >= bond.firstDisputeAt + multiFraudProofPeriod,\n Errors.WAIT_FOR_DISPUTES\n );\n\n // reward the earliest state root for this publisher\n bytes32 _preStateRoot = bond.earliestDisputedStateRoot;\n Rewards storage rewards = witnessProviders[_preStateRoot];\n\n // only allow claiming if fraud was proven in `finalize`\n require(rewards.canClaim, Errors.CANNOT_CLAIM);\n\n // proportional allocation - only reward 50% (rest gets locked in the\n // contract forever\n uint256 amount = (requiredCollateral * rewards.gasSpent[msg.sender]) / (2 * rewards.total);\n\n // reset the user's spent gas so they cannot double claim\n rewards.gasSpent[msg.sender] = 0;\n\n // transfer\n require(token.transfer(msg.sender, amount), Errors.ERC20_ERR);\n }\n\n /// Checks if the user is collateralized\n function isCollateralized(address who) override public view returns (bool) {\n return bonds[who].state == State.COLLATERALIZED;\n }\n\n /// Gets how many witnesses the user has provided for the state root\n function getGasSpent(bytes32 preStateRoot, address who) override public view returns (uint256) {\n return witnessProviders[preStateRoot].gasSpent[who];\n }\n}\n" + }, + "contracts/test-helpers/Mock_FraudVerifier.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\nimport { OVM_BondManager } from \"./../optimistic-ethereum/OVM/verification/OVM_BondManager.sol\";\n\ncontract Mock_FraudVerifier {\n OVM_BondManager bondManager;\n\n mapping (bytes32 => address) transitioners;\n\n function setBondManager(OVM_BondManager _bondManager) public {\n bondManager = _bondManager;\n }\n\n function setStateTransitioner(bytes32 preStateRoot, bytes32 txHash, address addr) public {\n transitioners[keccak256(abi.encodePacked(preStateRoot, txHash))] = addr;\n }\n\n function getStateTransitioner(\n bytes32 _preStateRoot,\n bytes32 _txHash\n )\n public\n view\n returns (\n address\n )\n {\n return transitioners[keccak256(abi.encodePacked(_preStateRoot, _txHash))];\n }\n\n function finalize(bytes32 _preStateRoot, address publisher, uint256 timestamp) public {\n bondManager.finalize(_preStateRoot, publisher, timestamp);\n }\n}\n" + }, + "contracts/optimistic-ethereum/mockOVM/verification/mockOVM_BondManager.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Interface Imports */\nimport { iOVM_BondManager } from \"../../iOVM/verification/iOVM_BondManager.sol\";\n\n/* Contract Imports */\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/**\n * @title mockOVM_BondManager\n */\ncontract mockOVM_BondManager is iOVM_BondManager, Lib_AddressResolver {\n constructor(\n address _libAddressManager\n )\n Lib_AddressResolver(_libAddressManager)\n {}\n\n function recordGasSpent(\n bytes32 _preStateRoot,\n bytes32 _txHash,\n address _who,\n uint256 _gasSpent\n )\n override\n public\n {}\n\n function finalize(\n bytes32 _preStateRoot,\n address _publisher,\n uint256 _timestamp\n )\n override\n public\n {}\n\n function deposit()\n override\n public\n {}\n\n function startWithdrawal()\n override\n public\n {}\n\n function finalizeWithdrawal()\n override\n public\n {}\n\n function claim(\n address _who\n )\n override\n public\n {}\n\n function isCollateralized(\n address _who\n )\n override\n public\n view\n returns (\n bool\n )\n {\n // Only authenticate sequencer to submit state root batches.\n return _who == resolve(\"OVM_Proposer\");\n }\n\n function getGasSpent(\n bytes32, // _preStateRoot,\n address // _who\n )\n override\n public\n pure\n returns (\n uint256\n )\n {\n return 0;\n }\n}\n" + }, + "contracts/test-libraries/utils/TestLib_MerkleTree.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_MerkleTree } from \"../../optimistic-ethereum/libraries/utils/Lib_MerkleTree.sol\";\n\n/**\n * @title TestLib_MerkleTree\n */\ncontract TestLib_MerkleTree {\n\n function getMerkleRoot(\n bytes32[] memory _elements\n )\n public\n pure\n returns (\n bytes32\n )\n {\n return Lib_MerkleTree.getMerkleRoot(\n _elements\n );\n }\n\n function verify(\n bytes32 _root,\n bytes32 _leaf,\n uint256 _index,\n bytes32[] memory _siblings,\n uint256 _totalLeaves\n )\n public\n pure\n returns (\n bool\n )\n {\n return Lib_MerkleTree.verify(\n _root,\n _leaf,\n _index,\n _siblings,\n _totalLeaves\n );\n }\n}\n" + }, + "contracts/test-libraries/utils/TestLib_RingBuffer.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_RingBuffer } from \"../../optimistic-ethereum/libraries/utils/Lib_RingBuffer.sol\";\n\n/**\n * @title TestLib_RingBuffer\n */\ncontract TestLib_RingBuffer {\n using Lib_RingBuffer for Lib_RingBuffer.RingBuffer;\n\n Lib_RingBuffer.RingBuffer internal buf;\n\n function push(\n bytes32 _value,\n bytes27 _extraData\n )\n public\n {\n buf.push(\n _value,\n _extraData\n );\n }\n\n function get(\n uint256 _index\n )\n public\n view\n returns (\n bytes32\n )\n {\n return buf.get(_index);\n }\n\n function deleteElementsAfterInclusive(\n uint40 _index,\n bytes27 _extraData\n )\n internal\n {\n return buf.deleteElementsAfterInclusive(\n _index,\n _extraData\n );\n }\n\n function getLength()\n internal\n view\n returns (\n uint40\n )\n {\n return buf.getLength();\n }\n\n function getExtraData()\n internal\n view\n returns (\n bytes27\n )\n {\n return buf.getExtraData();\n }\n}\n" + } + }, + "settings": { + "optimizer": { + "enabled": true, + "runs": 200 + }, + "outputSelection": { + "*": { + "*": [ + "storageLayout", + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata", + "devdoc", + "userdoc", + "evm.gasEstimates" + ], + "": [ + "ast" + ] + } + }, + "metadata": { + "useLiteralContent": true + } + } +} \ No newline at end of file From 4390321ac92bbe7054383c1aee90a46373c1f5bd Mon Sep 17 00:00:00 2001 From: Matt Masurka Date: Wed, 12 May 2021 10:57:21 -0700 Subject: [PATCH 71/81] Contracts: Removes '-v3' from kovan and goerli contracts folders (#844) * Removes '-v3' from kovan and goerli contracts folders * Generatees new README --- packages/contracts/deployments/README.md | 28 +- .../{goerli-v3 => goerli}/.chainId | 0 .../Lib_AddressManager.json | 0 .../OVM_CanonicalTransactionChain.json | 0 ...OVM_ChainStorageContainer:CTC:batches.json | 0 .../OVM_ChainStorageContainer:CTC:queue.json | 0 ...OVM_ChainStorageContainer:SCC:batches.json | 0 .../OVM_ExecutionManager.json | 0 .../OVM_FraudVerifier.json | 0 .../OVM_L1CrossDomainMessenger.json | 0 .../OVM_L1ETHGateway.json | 0 .../OVM_L1MultiMessageRelayer.json | 0 .../OVM_SafetyChecker.json | 0 .../OVM_StateCommitmentChain.json | 0 .../OVM_StateManagerFactory.json | 0 .../OVM_StateTransitionerFactory.json | 0 .../Proxy__OVM_L1CrossDomainMessenger.json | 0 .../Proxy__OVM_L1ETHGateway.json | 0 .../mockOVM_BondManager.json | 0 .../dde656dd41f49cad9eac9bc7065fd6a7.json | 0 .../contracts/deployments/kovan-v3/.chainId | 1 - .../kovan-v3/Lib_AddressManager.json | 230 --- .../OVM_CanonicalTransactionChain.json | 819 ----------- .../kovan-v3/OVM_ExecutionManager.json | 1269 ----------------- .../kovan-v3/OVM_FraudVerifier.json | 576 -------- .../kovan-v3/OVM_L1CrossDomainMessenger.json | 798 ----------- .../kovan-v3/OVM_L1ETHGateway.json | 293 ---- .../kovan-v3/OVM_L1MultiMessageRelayer.json | 234 --- .../kovan-v3/OVM_SafetyChecker.json | 74 - .../kovan-v3/OVM_StateCommitmentChain.json | 529 ------- .../kovan-v3/OVM_StateManagerFactory.json | 74 - .../OVM_StateTransitionerFactory.json | 163 --- .../Proxy__OVM_L1CrossDomainMessenger.json | 118 -- .../kovan-v3/Proxy__OVM_L1ETHGateway.json | 118 -- .../kovan-v3/mockOVM_BondManager.json | 242 ---- .../deployments/kovan/Lib_AddressManager.json | 83 +- .../kovan/OVM_CanonicalTransactionChain.json | 55 +- ...OVM_ChainStorageContainer-CTC-batches.json | 442 ------ .../OVM_ChainStorageContainer-CTC-queue.json | 442 ------ ...OVM_ChainStorageContainer-SCC-batches.json | 442 ------ ...OVM_ChainStorageContainer:CTC:batches.json | 0 .../OVM_ChainStorageContainer:CTC:queue.json | 0 ...OVM_ChainStorageContainer:SCC:batches.json | 0 .../kovan/OVM_ExecutionManager.json | 176 ++- .../deployments/kovan/OVM_FraudVerifier.json | 59 +- .../kovan/OVM_L1CrossDomainMessenger.json | 378 ++++- .../deployments/kovan/OVM_L1ETHGateway.json | 52 +- .../kovan/OVM_L1MultiMessageRelayer.json | 54 +- .../deployments/kovan/OVM_SafetyChecker.json | 26 +- .../kovan/OVM_StateCommitmentChain.json | 53 +- .../kovan/OVM_StateManagerFactory.json | 28 +- .../kovan/OVM_StateTransitionerFactory.json | 49 +- .../Proxy__OVM_L1CrossDomainMessenger.json | 38 +- .../kovan/Proxy__OVM_L1ETHGateway.json | 40 +- .../kovan/mockOVM_BondManager.json | 53 +- .../03aed03b958b1d37f90bd88d0f56dd85.json | 312 ---- .../5ee8e508e2c54cb5ac6783b4855b1558.json | 0 57 files changed, 811 insertions(+), 7537 deletions(-) rename packages/contracts/deployments/{goerli-v3 => goerli}/.chainId (100%) rename packages/contracts/deployments/{goerli-v3 => goerli}/Lib_AddressManager.json (100%) rename packages/contracts/deployments/{goerli-v3 => goerli}/OVM_CanonicalTransactionChain.json (100%) rename packages/contracts/deployments/{goerli-v3 => goerli}/OVM_ChainStorageContainer:CTC:batches.json (100%) rename packages/contracts/deployments/{goerli-v3 => goerli}/OVM_ChainStorageContainer:CTC:queue.json (100%) rename packages/contracts/deployments/{goerli-v3 => goerli}/OVM_ChainStorageContainer:SCC:batches.json (100%) rename packages/contracts/deployments/{goerli-v3 => goerli}/OVM_ExecutionManager.json (100%) rename packages/contracts/deployments/{goerli-v3 => goerli}/OVM_FraudVerifier.json (100%) rename packages/contracts/deployments/{goerli-v3 => goerli}/OVM_L1CrossDomainMessenger.json (100%) rename packages/contracts/deployments/{goerli-v3 => goerli}/OVM_L1ETHGateway.json (100%) rename packages/contracts/deployments/{goerli-v3 => goerli}/OVM_L1MultiMessageRelayer.json (100%) rename packages/contracts/deployments/{goerli-v3 => goerli}/OVM_SafetyChecker.json (100%) rename packages/contracts/deployments/{goerli-v3 => goerli}/OVM_StateCommitmentChain.json (100%) rename packages/contracts/deployments/{goerli-v3 => goerli}/OVM_StateManagerFactory.json (100%) rename packages/contracts/deployments/{goerli-v3 => goerli}/OVM_StateTransitionerFactory.json (100%) rename packages/contracts/deployments/{goerli-v3 => goerli}/Proxy__OVM_L1CrossDomainMessenger.json (100%) rename packages/contracts/deployments/{goerli-v3 => goerli}/Proxy__OVM_L1ETHGateway.json (100%) rename packages/contracts/deployments/{goerli-v3 => goerli}/mockOVM_BondManager.json (100%) rename packages/contracts/deployments/{goerli-v3 => goerli}/solcInputs/dde656dd41f49cad9eac9bc7065fd6a7.json (100%) delete mode 100644 packages/contracts/deployments/kovan-v3/.chainId delete mode 100644 packages/contracts/deployments/kovan-v3/Lib_AddressManager.json delete mode 100644 packages/contracts/deployments/kovan-v3/OVM_CanonicalTransactionChain.json delete mode 100644 packages/contracts/deployments/kovan-v3/OVM_ExecutionManager.json delete mode 100644 packages/contracts/deployments/kovan-v3/OVM_FraudVerifier.json delete mode 100644 packages/contracts/deployments/kovan-v3/OVM_L1CrossDomainMessenger.json delete mode 100644 packages/contracts/deployments/kovan-v3/OVM_L1ETHGateway.json delete mode 100644 packages/contracts/deployments/kovan-v3/OVM_L1MultiMessageRelayer.json delete mode 100644 packages/contracts/deployments/kovan-v3/OVM_SafetyChecker.json delete mode 100644 packages/contracts/deployments/kovan-v3/OVM_StateCommitmentChain.json delete mode 100644 packages/contracts/deployments/kovan-v3/OVM_StateManagerFactory.json delete mode 100644 packages/contracts/deployments/kovan-v3/OVM_StateTransitionerFactory.json delete mode 100644 packages/contracts/deployments/kovan-v3/Proxy__OVM_L1CrossDomainMessenger.json delete mode 100644 packages/contracts/deployments/kovan-v3/Proxy__OVM_L1ETHGateway.json delete mode 100644 packages/contracts/deployments/kovan-v3/mockOVM_BondManager.json delete mode 100644 packages/contracts/deployments/kovan/OVM_ChainStorageContainer-CTC-batches.json delete mode 100644 packages/contracts/deployments/kovan/OVM_ChainStorageContainer-CTC-queue.json delete mode 100644 packages/contracts/deployments/kovan/OVM_ChainStorageContainer-SCC-batches.json rename packages/contracts/deployments/{kovan-v3 => kovan}/OVM_ChainStorageContainer:CTC:batches.json (100%) rename packages/contracts/deployments/{kovan-v3 => kovan}/OVM_ChainStorageContainer:CTC:queue.json (100%) rename packages/contracts/deployments/{kovan-v3 => kovan}/OVM_ChainStorageContainer:SCC:batches.json (100%) delete mode 100644 packages/contracts/deployments/kovan/solcInputs/03aed03b958b1d37f90bd88d0f56dd85.json rename packages/contracts/deployments/{kovan-v3 => kovan}/solcInputs/5ee8e508e2c54cb5ac6783b4855b1558.json (100%) diff --git a/packages/contracts/deployments/README.md b/packages/contracts/deployments/README.md index 3de3435179e12..16ba51c260200 100644 --- a/packages/contracts/deployments/README.md +++ b/packages/contracts/deployments/README.md @@ -49,7 +49,7 @@ Network : __mainnet (chain id: 1)__ |Proxy__OVM_L1ETHGateway|[0xe681F80966a8b1fFadECf8068bD6F99034791c95](https://etherscan.io/address/0xe681F80966a8b1fFadECf8068bD6F99034791c95)| |mockOVM_BondManager|[0x90c5F8d045bBcCc99d907f30E8707F06D95d065b](https://etherscan.io/address/0x90c5F8d045bBcCc99d907f30E8707F06D95d065b)| --- -## KOVAN-V3 +## KOVAN Network : __kovan (chain id: 42)__ @@ -73,31 +73,7 @@ Network : __kovan (chain id: 42)__ |Proxy__OVM_L1ETHGateway|[0xB191d67F69e823445cD59e5A88953a82be73b9C6](https://kovan.etherscan.io/address/0xB191d67F69e823445cD59e5A88953a82be73b9C6)| |mockOVM_BondManager|[0x8ECe272C9f83041bcb1Cd57AC49Ca6494776bE01](https://kovan.etherscan.io/address/0x8ECe272C9f83041bcb1Cd57AC49Ca6494776bE01)| --- -## KOVAN - -Network : __kovan (chain id: 42)__ - -|Contract|Address| -|--|--| -|Lib_AddressManager|[0xFaf27b24ba54C6910C12CFF5C9453C0e8D634e05](https://kovan.etherscan.io/address/0xFaf27b24ba54C6910C12CFF5C9453C0e8D634e05)| -|OVM_CanonicalTransactionChain|[0xeBD8F6ACF629f27AC7dDDD0603df3359a4f063E3](https://kovan.etherscan.io/address/0xeBD8F6ACF629f27AC7dDDD0603df3359a4f063E3)| -|OVM_ChainStorageContainer-CTC-batches|[0x18bA855471f10B74851C0e133db597075Dff128d](https://kovan.etherscan.io/address/0x18bA855471f10B74851C0e133db597075Dff128d)| -|OVM_ChainStorageContainer-CTC-queue|[0xf388A98F640baB14e5Cd343B1c27817811aDd682](https://kovan.etherscan.io/address/0xf388A98F640baB14e5Cd343B1c27817811aDd682)| -|OVM_ChainStorageContainer-SCC-batches|[0xDC1f37ec1eeBF9fe5087c24f889E15AB228FDD22](https://kovan.etherscan.io/address/0xDC1f37ec1eeBF9fe5087c24f889E15AB228FDD22)| -|OVM_ExecutionManager|[0x1e9d3f68422b50d3Fc413cb6a79C4144089cf64A](https://kovan.etherscan.io/address/0x1e9d3f68422b50d3Fc413cb6a79C4144089cf64A)| -|OVM_FraudVerifier|[0x139D12963897129D48C99402Cc481e8C0E8FD0BC](https://kovan.etherscan.io/address/0x139D12963897129D48C99402Cc481e8C0E8FD0BC)| -|OVM_L1CrossDomainMessenger|[0xDBafb4AB19eafE27aF30Dd9C811a1BF4F64b603b](https://kovan.etherscan.io/address/0xDBafb4AB19eafE27aF30Dd9C811a1BF4F64b603b)| -|OVM_L1ETHGateway|[0x0E8917aF9eB7812c7819EF4e80D2217679d11324](https://kovan.etherscan.io/address/0x0E8917aF9eB7812c7819EF4e80D2217679d11324)| -|OVM_L1MultiMessageRelayer|[0xf56d4FAeD6F52c4ce14e44885084dAFc5c440138](https://kovan.etherscan.io/address/0xf56d4FAeD6F52c4ce14e44885084dAFc5c440138)| -|OVM_SafetyChecker|[0xeb91D9059761aFa197deD7b1FB4228F7ea921d3e](https://kovan.etherscan.io/address/0xeb91D9059761aFa197deD7b1FB4228F7ea921d3e)| -|OVM_StateCommitmentChain|[0x41f707A213FB83010586860f81A4BF2F0FEbe56D](https://kovan.etherscan.io/address/0x41f707A213FB83010586860f81A4BF2F0FEbe56D)| -|OVM_StateManagerFactory|[0xda9Da06A7b7D902A746649cA1304665C83a465F8](https://kovan.etherscan.io/address/0xda9Da06A7b7D902A746649cA1304665C83a465F8)| -|OVM_StateTransitionerFactory|[0xE77250c2663d4E81a0Cd7B321f0BB270694A4851](https://kovan.etherscan.io/address/0xE77250c2663d4E81a0Cd7B321f0BB270694A4851)| -|Proxy__OVM_L1CrossDomainMessenger|[0x48062eD9b6488EC41c4CfbF2f568D7773819d8C9](https://kovan.etherscan.io/address/0x48062eD9b6488EC41c4CfbF2f568D7773819d8C9)| -|Proxy__OVM_L1ETHGateway|[0xf3902e50dA095bD2e954AB320E8eafDA6152dFDa](https://kovan.etherscan.io/address/0xf3902e50dA095bD2e954AB320E8eafDA6152dFDa)| -|mockOVM_BondManager|[0x77e244ec49014cFb9c4572453568eCC3AbB70A2d](https://kovan.etherscan.io/address/0x77e244ec49014cFb9c4572453568eCC3AbB70A2d)| ---- -## GOERLI-V3 +## GOERLI Network : __goerli (chain id: 5)__ diff --git a/packages/contracts/deployments/goerli-v3/.chainId b/packages/contracts/deployments/goerli/.chainId similarity index 100% rename from packages/contracts/deployments/goerli-v3/.chainId rename to packages/contracts/deployments/goerli/.chainId diff --git a/packages/contracts/deployments/goerli-v3/Lib_AddressManager.json b/packages/contracts/deployments/goerli/Lib_AddressManager.json similarity index 100% rename from packages/contracts/deployments/goerli-v3/Lib_AddressManager.json rename to packages/contracts/deployments/goerli/Lib_AddressManager.json diff --git a/packages/contracts/deployments/goerli-v3/OVM_CanonicalTransactionChain.json b/packages/contracts/deployments/goerli/OVM_CanonicalTransactionChain.json similarity index 100% rename from packages/contracts/deployments/goerli-v3/OVM_CanonicalTransactionChain.json rename to packages/contracts/deployments/goerli/OVM_CanonicalTransactionChain.json diff --git a/packages/contracts/deployments/goerli-v3/OVM_ChainStorageContainer:CTC:batches.json b/packages/contracts/deployments/goerli/OVM_ChainStorageContainer:CTC:batches.json similarity index 100% rename from packages/contracts/deployments/goerli-v3/OVM_ChainStorageContainer:CTC:batches.json rename to packages/contracts/deployments/goerli/OVM_ChainStorageContainer:CTC:batches.json diff --git a/packages/contracts/deployments/goerli-v3/OVM_ChainStorageContainer:CTC:queue.json b/packages/contracts/deployments/goerli/OVM_ChainStorageContainer:CTC:queue.json similarity index 100% rename from packages/contracts/deployments/goerli-v3/OVM_ChainStorageContainer:CTC:queue.json rename to packages/contracts/deployments/goerli/OVM_ChainStorageContainer:CTC:queue.json diff --git a/packages/contracts/deployments/goerli-v3/OVM_ChainStorageContainer:SCC:batches.json b/packages/contracts/deployments/goerli/OVM_ChainStorageContainer:SCC:batches.json similarity index 100% rename from packages/contracts/deployments/goerli-v3/OVM_ChainStorageContainer:SCC:batches.json rename to packages/contracts/deployments/goerli/OVM_ChainStorageContainer:SCC:batches.json diff --git a/packages/contracts/deployments/goerli-v3/OVM_ExecutionManager.json b/packages/contracts/deployments/goerli/OVM_ExecutionManager.json similarity index 100% rename from packages/contracts/deployments/goerli-v3/OVM_ExecutionManager.json rename to packages/contracts/deployments/goerli/OVM_ExecutionManager.json diff --git a/packages/contracts/deployments/goerli-v3/OVM_FraudVerifier.json b/packages/contracts/deployments/goerli/OVM_FraudVerifier.json similarity index 100% rename from packages/contracts/deployments/goerli-v3/OVM_FraudVerifier.json rename to packages/contracts/deployments/goerli/OVM_FraudVerifier.json diff --git a/packages/contracts/deployments/goerli-v3/OVM_L1CrossDomainMessenger.json b/packages/contracts/deployments/goerli/OVM_L1CrossDomainMessenger.json similarity index 100% rename from packages/contracts/deployments/goerli-v3/OVM_L1CrossDomainMessenger.json rename to packages/contracts/deployments/goerli/OVM_L1CrossDomainMessenger.json diff --git a/packages/contracts/deployments/goerli-v3/OVM_L1ETHGateway.json b/packages/contracts/deployments/goerli/OVM_L1ETHGateway.json similarity index 100% rename from packages/contracts/deployments/goerli-v3/OVM_L1ETHGateway.json rename to packages/contracts/deployments/goerli/OVM_L1ETHGateway.json diff --git a/packages/contracts/deployments/goerli-v3/OVM_L1MultiMessageRelayer.json b/packages/contracts/deployments/goerli/OVM_L1MultiMessageRelayer.json similarity index 100% rename from packages/contracts/deployments/goerli-v3/OVM_L1MultiMessageRelayer.json rename to packages/contracts/deployments/goerli/OVM_L1MultiMessageRelayer.json diff --git a/packages/contracts/deployments/goerli-v3/OVM_SafetyChecker.json b/packages/contracts/deployments/goerli/OVM_SafetyChecker.json similarity index 100% rename from packages/contracts/deployments/goerli-v3/OVM_SafetyChecker.json rename to packages/contracts/deployments/goerli/OVM_SafetyChecker.json diff --git a/packages/contracts/deployments/goerli-v3/OVM_StateCommitmentChain.json b/packages/contracts/deployments/goerli/OVM_StateCommitmentChain.json similarity index 100% rename from packages/contracts/deployments/goerli-v3/OVM_StateCommitmentChain.json rename to packages/contracts/deployments/goerli/OVM_StateCommitmentChain.json diff --git a/packages/contracts/deployments/goerli-v3/OVM_StateManagerFactory.json b/packages/contracts/deployments/goerli/OVM_StateManagerFactory.json similarity index 100% rename from packages/contracts/deployments/goerli-v3/OVM_StateManagerFactory.json rename to packages/contracts/deployments/goerli/OVM_StateManagerFactory.json diff --git a/packages/contracts/deployments/goerli-v3/OVM_StateTransitionerFactory.json b/packages/contracts/deployments/goerli/OVM_StateTransitionerFactory.json similarity index 100% rename from packages/contracts/deployments/goerli-v3/OVM_StateTransitionerFactory.json rename to packages/contracts/deployments/goerli/OVM_StateTransitionerFactory.json diff --git a/packages/contracts/deployments/goerli-v3/Proxy__OVM_L1CrossDomainMessenger.json b/packages/contracts/deployments/goerli/Proxy__OVM_L1CrossDomainMessenger.json similarity index 100% rename from packages/contracts/deployments/goerli-v3/Proxy__OVM_L1CrossDomainMessenger.json rename to packages/contracts/deployments/goerli/Proxy__OVM_L1CrossDomainMessenger.json diff --git a/packages/contracts/deployments/goerli-v3/Proxy__OVM_L1ETHGateway.json b/packages/contracts/deployments/goerli/Proxy__OVM_L1ETHGateway.json similarity index 100% rename from packages/contracts/deployments/goerli-v3/Proxy__OVM_L1ETHGateway.json rename to packages/contracts/deployments/goerli/Proxy__OVM_L1ETHGateway.json diff --git a/packages/contracts/deployments/goerli-v3/mockOVM_BondManager.json b/packages/contracts/deployments/goerli/mockOVM_BondManager.json similarity index 100% rename from packages/contracts/deployments/goerli-v3/mockOVM_BondManager.json rename to packages/contracts/deployments/goerli/mockOVM_BondManager.json diff --git a/packages/contracts/deployments/goerli-v3/solcInputs/dde656dd41f49cad9eac9bc7065fd6a7.json b/packages/contracts/deployments/goerli/solcInputs/dde656dd41f49cad9eac9bc7065fd6a7.json similarity index 100% rename from packages/contracts/deployments/goerli-v3/solcInputs/dde656dd41f49cad9eac9bc7065fd6a7.json rename to packages/contracts/deployments/goerli/solcInputs/dde656dd41f49cad9eac9bc7065fd6a7.json diff --git a/packages/contracts/deployments/kovan-v3/.chainId b/packages/contracts/deployments/kovan-v3/.chainId deleted file mode 100644 index f70d7bba4ae1f..0000000000000 --- a/packages/contracts/deployments/kovan-v3/.chainId +++ /dev/null @@ -1 +0,0 @@ -42 \ No newline at end of file diff --git a/packages/contracts/deployments/kovan-v3/Lib_AddressManager.json b/packages/contracts/deployments/kovan-v3/Lib_AddressManager.json deleted file mode 100644 index 6f254b77797c1..0000000000000 --- a/packages/contracts/deployments/kovan-v3/Lib_AddressManager.json +++ /dev/null @@ -1,230 +0,0 @@ -{ - "address": "0xd56F695e73286ac252A37593DD4E7c14270eC1Df", - "abi": [ - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "string", - "name": "_name", - "type": "string" - }, - { - "indexed": false, - "internalType": "address", - "name": "_newAddress", - "type": "address" - } - ], - "name": "AddressSet", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "previousOwner", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "newOwner", - "type": "address" - } - ], - "name": "OwnershipTransferred", - "type": "event" - }, - { - "inputs": [ - { - "internalType": "string", - "name": "_name", - "type": "string" - } - ], - "name": "getAddress", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "owner", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "renounceOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "string", - "name": "_name", - "type": "string" - }, - { - "internalType": "address", - "name": "_address", - "type": "address" - } - ], - "name": "setAddress", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "newOwner", - "type": "address" - } - ], - "name": "transferOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - } - ], - "transactionHash": "0x3f80c75882bf9b2b74d3153cdc8d205e473891a8056604c361c32822f88a1a04", - "receipt": { - "to": null, - "from": "0x18394B52d3Cb931dfA76F63251919D051953413d", - "contractAddress": "0xd56F695e73286ac252A37593DD4E7c14270eC1Df", - "transactionIndex": 5, - "gasUsed": "425977", - "logsBloom": "0x00000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000001000000000000000000000000020000000000020000000000000000000800000000000000000000000000000000400000000000000000000000000000000000000000000080000000000000000000000000000000000000010000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000020000080000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0x570e3192ef23218091f6ad7d48a122cd3d4dc06792cb1c4f6523bdbbe3d88b0c", - "transactionHash": "0x3f80c75882bf9b2b74d3153cdc8d205e473891a8056604c361c32822f88a1a04", - "logs": [ - { - "transactionIndex": 5, - "blockNumber": 24572757, - "transactionHash": "0x3f80c75882bf9b2b74d3153cdc8d205e473891a8056604c361c32822f88a1a04", - "address": "0xd56F695e73286ac252A37593DD4E7c14270eC1Df", - "topics": [ - "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x00000000000000000000000018394b52d3cb931dfa76f63251919d051953413d" - ], - "data": "0x", - "logIndex": 10, - "blockHash": "0x570e3192ef23218091f6ad7d48a122cd3d4dc06792cb1c4f6523bdbbe3d88b0c" - } - ], - "blockNumber": 24572757, - "cumulativeGasUsed": "863778", - "status": 1, - "byzantium": true - }, - "args": [], - "solcInputHash": "5ee8e508e2c54cb5ac6783b4855b1558", - "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_newAddress\",\"type\":\"address\"}],\"name\":\"AddressSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"getAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"_address\",\"type\":\"address\"}],\"name\":\"setAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"getAddress(string)\":{\"params\":{\"_name\":\"Name to retrieve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner.\"},\"setAddress(string,address)\":{\"params\":{\"_address\":\"Address to associate with the name.\",\"_name\":\"String name to associate an address with.\"}},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"}},\"title\":\"Lib_AddressManager\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"getAddress(string)\":{\"notice\":\"Retrieves the address associated with a given name.\"},\"setAddress(string,address)\":{\"notice\":\"Changes the address associated with a particular name.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":\"Lib_AddressManager\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor () internal {\\n address msgSender = _msgSender();\\n _owner = msgSender;\\n emit OwnershipTransferred(address(0), msgSender);\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n emit OwnershipTransferred(_owner, address(0));\\n _owner = address(0);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n emit OwnershipTransferred(_owner, newOwner);\\n _owner = newOwner;\\n }\\n}\\n\",\"keccak256\":\"0x15e2d5bd4c28a88548074c54d220e8086f638a71ed07e6b3ba5a70066fcf458d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with GSN meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address payable) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes memory) {\\n this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x8d3cb350f04ff49cfb10aef08d87f19dcbaecc8027b0bed12f3275cd12f38cf0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n public\\n onlyOwner\\n {\\n addresses[_getNameHash(_name)] = _address;\\n\\n emit AddressSet(\\n _name,\\n _address\\n );\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0x2ce671a0e004df88b136bea5a3c59d0732cea8887c8496da1d509e0200b03d7d\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x608060405234801561001057600080fd5b50600061001b61006a565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35061006e565b3390565b6106508061007d6000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c8063715018a61461005c5780638da5cb5b146100665780639b2ea4bd1461008a578063bf40fac11461013b578063f2fde38b146101e1575b600080fd5b610064610207565b005b61006e6102c5565b604080516001600160a01b039092168252519081900360200190f35b610064600480360360408110156100a057600080fd5b8101906020810181356401000000008111156100bb57600080fd5b8201836020820111156100cd57600080fd5b803590602001918460018302840111640100000000831117156100ef57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550505090356001600160a01b031691506102d49050565b61006e6004803603602081101561015157600080fd5b81019060208101813564010000000081111561016c57600080fd5b82018360208201111561017e57600080fd5b803590602001918460018302840111640100000000831117156101a057600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610436945050505050565b610064600480360360208110156101f757600080fd5b50356001600160a01b0316610465565b61020f610579565b6001600160a01b03166102206102c5565b6001600160a01b03161461027b576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b031690565b6102dc610579565b6001600160a01b03166102ed6102c5565b6001600160a01b031614610348576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b80600160006103568561057d565b815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b031602179055507f188466739ff00cc68bfb2367d23ae4b855264264fe1624caa8884399af23454c82826040518080602001836001600160a01b03168152602001828103825284818151815260200191508051906020019080838360005b838110156103f75781810151838201526020016103df565b50505050905090810190601f1680156104245780820380516001836020036101000a031916815260200191505b50935050505060405180910390a15050565b6000600160006104458461057d565b81526020810191909152604001600020546001600160a01b031692915050565b61046d610579565b6001600160a01b031661047e6102c5565b6001600160a01b0316146104d9576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b03811661051e5760405162461bcd60e51b81526004018080602001828103825260268152602001806105f56026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b3390565b6000816040516020018082805190602001908083835b602083106105b25780518252601f199092019160209182019101610593565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120905091905056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373a26469706673582212209107a301dfba06b8649cc1baf4f5d6df1fb45110fdd8dc25d143490e81f3587e64736f6c63430007060033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100575760003560e01c8063715018a61461005c5780638da5cb5b146100665780639b2ea4bd1461008a578063bf40fac11461013b578063f2fde38b146101e1575b600080fd5b610064610207565b005b61006e6102c5565b604080516001600160a01b039092168252519081900360200190f35b610064600480360360408110156100a057600080fd5b8101906020810181356401000000008111156100bb57600080fd5b8201836020820111156100cd57600080fd5b803590602001918460018302840111640100000000831117156100ef57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550505090356001600160a01b031691506102d49050565b61006e6004803603602081101561015157600080fd5b81019060208101813564010000000081111561016c57600080fd5b82018360208201111561017e57600080fd5b803590602001918460018302840111640100000000831117156101a057600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610436945050505050565b610064600480360360208110156101f757600080fd5b50356001600160a01b0316610465565b61020f610579565b6001600160a01b03166102206102c5565b6001600160a01b03161461027b576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b031690565b6102dc610579565b6001600160a01b03166102ed6102c5565b6001600160a01b031614610348576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b80600160006103568561057d565b815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b031602179055507f188466739ff00cc68bfb2367d23ae4b855264264fe1624caa8884399af23454c82826040518080602001836001600160a01b03168152602001828103825284818151815260200191508051906020019080838360005b838110156103f75781810151838201526020016103df565b50505050905090810190601f1680156104245780820380516001836020036101000a031916815260200191505b50935050505060405180910390a15050565b6000600160006104458461057d565b81526020810191909152604001600020546001600160a01b031692915050565b61046d610579565b6001600160a01b031661047e6102c5565b6001600160a01b0316146104d9576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b03811661051e5760405162461bcd60e51b81526004018080602001828103825260268152602001806105f56026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b3390565b6000816040516020018082805190602001908083835b602083106105b25780518252601f199092019160209182019101610593565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120905091905056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373a26469706673582212209107a301dfba06b8649cc1baf4f5d6df1fb45110fdd8dc25d143490e81f3587e64736f6c63430007060033", - "devdoc": { - "kind": "dev", - "methods": { - "getAddress(string)": { - "params": { - "_name": "Name to retrieve an address for." - }, - "returns": { - "_0": "Address associated with the given name." - } - }, - "owner()": { - "details": "Returns the address of the current owner." - }, - "renounceOwnership()": { - "details": "Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner." - }, - "setAddress(string,address)": { - "params": { - "_address": "Address to associate with the name.", - "_name": "String name to associate an address with." - } - }, - "transferOwnership(address)": { - "details": "Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner." - } - }, - "title": "Lib_AddressManager", - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": { - "getAddress(string)": { - "notice": "Retrieves the address associated with a given name." - }, - "setAddress(string,address)": { - "notice": "Changes the address associated with a particular name." - } - }, - "version": 1 - }, - "storageLayout": { - "storage": [ - { - "astId": 664, - "contract": "contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol:Lib_AddressManager", - "label": "_owner", - "offset": 0, - "slot": "0", - "type": "t_address" - }, - { - "astId": 12737, - "contract": "contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol:Lib_AddressManager", - "label": "addresses", - "offset": 0, - "slot": "1", - "type": "t_mapping(t_bytes32,t_address)" - } - ], - "types": { - "t_address": { - "encoding": "inplace", - "label": "address", - "numberOfBytes": "20" - }, - "t_bytes32": { - "encoding": "inplace", - "label": "bytes32", - "numberOfBytes": "32" - }, - "t_mapping(t_bytes32,t_address)": { - "encoding": "mapping", - "key": "t_bytes32", - "label": "mapping(bytes32 => address)", - "numberOfBytes": "32", - "value": "t_address" - } - } - } -} \ No newline at end of file diff --git a/packages/contracts/deployments/kovan-v3/OVM_CanonicalTransactionChain.json b/packages/contracts/deployments/kovan-v3/OVM_CanonicalTransactionChain.json deleted file mode 100644 index 16c213ccae639..0000000000000 --- a/packages/contracts/deployments/kovan-v3/OVM_CanonicalTransactionChain.json +++ /dev/null @@ -1,819 +0,0 @@ -{ - "address": "0x895eabB95D684c15fa46Dc00a6b7557450083DEF", - "abi": [ - { - "inputs": [ - { - "internalType": "address", - "name": "_libAddressManager", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_forceInclusionPeriodSeconds", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_forceInclusionPeriodBlocks", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_maxTransactionGasLimit", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint256", - "name": "_startingQueueIndex", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_numQueueElements", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_totalElements", - "type": "uint256" - } - ], - "name": "QueueBatchAppended", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint256", - "name": "_startingQueueIndex", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_numQueueElements", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_totalElements", - "type": "uint256" - } - ], - "name": "SequencerBatchAppended", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "_batchIndex", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "bytes32", - "name": "_batchRoot", - "type": "bytes32" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_batchSize", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_prevTotalElements", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "bytes", - "name": "_extraData", - "type": "bytes" - } - ], - "name": "TransactionBatchAppended", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "address", - "name": "_l1TxOrigin", - "type": "address" - }, - { - "indexed": false, - "internalType": "address", - "name": "_target", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_gasLimit", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "bytes", - "name": "_data", - "type": "bytes" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_queueIndex", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_timestamp", - "type": "uint256" - } - ], - "name": "TransactionEnqueued", - "type": "event" - }, - { - "inputs": [], - "name": "L2_GAS_DISCOUNT_DIVISOR", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "MAX_ROLLUP_TX_SIZE", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "MIN_ROLLUP_TX_GAS", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "name": "appendQueueBatch", - "outputs": [], - "stateMutability": "pure", - "type": "function" - }, - { - "inputs": [], - "name": "appendSequencerBatch", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "batches", - "outputs": [ - { - "internalType": "contract iOVM_ChainStorageContainer", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_target", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_gasLimit", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "_data", - "type": "bytes" - } - ], - "name": "enqueue", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "forceInclusionPeriodBlocks", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "forceInclusionPeriodSeconds", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getLastBlockNumber", - "outputs": [ - { - "internalType": "uint40", - "name": "", - "type": "uint40" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getLastTimestamp", - "outputs": [ - { - "internalType": "uint40", - "name": "", - "type": "uint40" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getNextQueueIndex", - "outputs": [ - { - "internalType": "uint40", - "name": "", - "type": "uint40" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getNumPendingQueueElements", - "outputs": [ - { - "internalType": "uint40", - "name": "", - "type": "uint40" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_index", - "type": "uint256" - } - ], - "name": "getQueueElement", - "outputs": [ - { - "components": [ - { - "internalType": "bytes32", - "name": "transactionHash", - "type": "bytes32" - }, - { - "internalType": "uint40", - "name": "timestamp", - "type": "uint40" - }, - { - "internalType": "uint40", - "name": "blockNumber", - "type": "uint40" - } - ], - "internalType": "struct Lib_OVMCodec.QueueElement", - "name": "_element", - "type": "tuple" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getQueueLength", - "outputs": [ - { - "internalType": "uint40", - "name": "", - "type": "uint40" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getTotalBatches", - "outputs": [ - { - "internalType": "uint256", - "name": "_totalBatches", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getTotalElements", - "outputs": [ - { - "internalType": "uint256", - "name": "_totalElements", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "libAddressManager", - "outputs": [ - { - "internalType": "contract Lib_AddressManager", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "maxTransactionGasLimit", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "queue", - "outputs": [ - { - "internalType": "contract iOVM_ChainStorageContainer", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "string", - "name": "_name", - "type": "string" - } - ], - "name": "resolve", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "components": [ - { - "internalType": "uint256", - "name": "timestamp", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "blockNumber", - "type": "uint256" - }, - { - "internalType": "enum Lib_OVMCodec.QueueOrigin", - "name": "l1QueueOrigin", - "type": "uint8" - }, - { - "internalType": "address", - "name": "l1TxOrigin", - "type": "address" - }, - { - "internalType": "address", - "name": "entrypoint", - "type": "address" - }, - { - "internalType": "uint256", - "name": "gasLimit", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "data", - "type": "bytes" - } - ], - "internalType": "struct Lib_OVMCodec.Transaction", - "name": "_transaction", - "type": "tuple" - }, - { - "components": [ - { - "internalType": "bool", - "name": "isSequenced", - "type": "bool" - }, - { - "internalType": "uint256", - "name": "queueIndex", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "timestamp", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "blockNumber", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "txData", - "type": "bytes" - } - ], - "internalType": "struct Lib_OVMCodec.TransactionChainElement", - "name": "_txChainElement", - "type": "tuple" - }, - { - "components": [ - { - "internalType": "uint256", - "name": "batchIndex", - "type": "uint256" - }, - { - "internalType": "bytes32", - "name": "batchRoot", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "batchSize", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "prevTotalElements", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "extraData", - "type": "bytes" - } - ], - "internalType": "struct Lib_OVMCodec.ChainBatchHeader", - "name": "_batchHeader", - "type": "tuple" - }, - { - "components": [ - { - "internalType": "uint256", - "name": "index", - "type": "uint256" - }, - { - "internalType": "bytes32[]", - "name": "siblings", - "type": "bytes32[]" - } - ], - "internalType": "struct Lib_OVMCodec.ChainInclusionProof", - "name": "_inclusionProof", - "type": "tuple" - } - ], - "name": "verifyTransaction", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - } - ], - "transactionHash": "0x87f51aeb050ec2c556d14cdc38b30125a66e88689373f727d2f03debbc1313fd", - "receipt": { - "to": null, - "from": "0x18394B52d3Cb931dfA76F63251919D051953413d", - "contractAddress": "0x895eabB95D684c15fa46Dc00a6b7557450083DEF", - "transactionIndex": 1, - "gasUsed": "2823402", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0x611066b262d0e72ca9d3d3d00a26327bc03a751fe0ffa189133486a0bd7e3eac", - "transactionHash": "0x87f51aeb050ec2c556d14cdc38b30125a66e88689373f727d2f03debbc1313fd", - "logs": [], - "blockNumber": 24572808, - "cumulativeGasUsed": "2868217", - "status": 1, - "byzantium": true - }, - "args": [ - "0xd56F695e73286ac252A37593DD4E7c14270eC1Df", - 2592000, - 172800, - 9000000 - ], - "solcInputHash": "5ee8e508e2c54cb5ac6783b4855b1558", - "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_forceInclusionPeriodSeconds\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_forceInclusionPeriodBlocks\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_maxTransactionGasLimit\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_startingQueueIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_numQueueElements\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_totalElements\",\"type\":\"uint256\"}],\"name\":\"QueueBatchAppended\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_startingQueueIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_numQueueElements\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_totalElements\",\"type\":\"uint256\"}],\"name\":\"SequencerBatchAppended\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_batchIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"_batchRoot\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_batchSize\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_prevTotalElements\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"_extraData\",\"type\":\"bytes\"}],\"name\":\"TransactionBatchAppended\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_l1TxOrigin\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_queueIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_timestamp\",\"type\":\"uint256\"}],\"name\":\"TransactionEnqueued\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"L2_GAS_DISCOUNT_DIVISOR\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAX_ROLLUP_TX_SIZE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MIN_ROLLUP_TX_GAS\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"appendQueueBatch\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"appendSequencerBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"batches\",\"outputs\":[{\"internalType\":\"contract iOVM_ChainStorageContainer\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"enqueue\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"forceInclusionPeriodBlocks\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"forceInclusionPeriodSeconds\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLastBlockNumber\",\"outputs\":[{\"internalType\":\"uint40\",\"name\":\"\",\"type\":\"uint40\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLastTimestamp\",\"outputs\":[{\"internalType\":\"uint40\",\"name\":\"\",\"type\":\"uint40\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getNextQueueIndex\",\"outputs\":[{\"internalType\":\"uint40\",\"name\":\"\",\"type\":\"uint40\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getNumPendingQueueElements\",\"outputs\":[{\"internalType\":\"uint40\",\"name\":\"\",\"type\":\"uint40\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"getQueueElement\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"transactionHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint40\",\"name\":\"timestamp\",\"type\":\"uint40\"},{\"internalType\":\"uint40\",\"name\":\"blockNumber\",\"type\":\"uint40\"}],\"internalType\":\"struct Lib_OVMCodec.QueueElement\",\"name\":\"_element\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getQueueLength\",\"outputs\":[{\"internalType\":\"uint40\",\"name\":\"\",\"type\":\"uint40\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTotalBatches\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_totalBatches\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTotalElements\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_totalElements\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maxTransactionGasLimit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"queue\",\"outputs\":[{\"internalType\":\"contract iOVM_ChainStorageContainer\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"enum Lib_OVMCodec.QueueOrigin\",\"name\":\"l1QueueOrigin\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"l1TxOrigin\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"entrypoint\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.Transaction\",\"name\":\"_transaction\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isSequenced\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"queueIndex\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"txData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.TransactionChainElement\",\"name\":\"_txChainElement\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"_batchHeader\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"siblings\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct Lib_OVMCodec.ChainInclusionProof\",\"name\":\"_inclusionProof\",\"type\":\"tuple\"}],\"name\":\"verifyTransaction\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The Canonical Transaction Chain (CTC) contract is an append-only log of transactions which must be applied to the rollup state. It defines the ordering of rollup transactions by writing them to the 'CTC:batches' instance of the Chain Storage Container. The CTC also allows any account to 'enqueue' an L2 transaction, which will require that the Sequencer will eventually append it to the rollup state. If the Sequencer does not include an enqueued transaction within the 'force inclusion period', then any account may force it to be included by calling appendQueueBatch(). Compiler used: solc Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"appendSequencerBatch()\":{\"details\":\"This function uses a custom encoding scheme for efficiency reasons. .param _shouldStartAtElement Specific batch we expect to start appending to. .param _totalElementsToAppend Total number of batch elements we expect to append. .param _contexts Array of batch contexts. .param _transactionDataFields Array of raw transaction data.\"},\"batches()\":{\"returns\":{\"_0\":\"Reference to the batch storage container.\"}},\"enqueue(address,uint256,bytes)\":{\"params\":{\"_data\":\"Transaction data.\",\"_gasLimit\":\"Gas limit for the enqueued L2 transaction.\",\"_target\":\"Target L2 contract to send the transaction to.\"}},\"getLastBlockNumber()\":{\"returns\":{\"_0\":\"Blocknumber for the last transaction.\"}},\"getLastTimestamp()\":{\"returns\":{\"_0\":\"Timestamp for the last transaction.\"}},\"getNextQueueIndex()\":{\"returns\":{\"_0\":\"Index for the next queue element.\"}},\"getNumPendingQueueElements()\":{\"returns\":{\"_0\":\"Number of pending queue elements.\"}},\"getQueueElement(uint256)\":{\"params\":{\"_index\":\"Index of the queue element to access.\"},\"returns\":{\"_element\":\"Queue element at the given index.\"}},\"getQueueLength()\":{\"returns\":{\"_0\":\"Length of the queue.\"}},\"getTotalBatches()\":{\"returns\":{\"_totalBatches\":\"Total submitted batches.\"}},\"getTotalElements()\":{\"returns\":{\"_totalElements\":\"Total submitted elements.\"}},\"queue()\":{\"returns\":{\"_0\":\"Reference to the queue storage container.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}},\"verifyTransaction((uint256,uint256,uint8,address,address,uint256,bytes),(bool,uint256,uint256,uint256,bytes),(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))\":{\"params\":{\"_batchHeader\":\"Header of the batch the transaction was included in.\",\"_inclusionProof\":\"Inclusion proof for the provided transaction chain element.\",\"_transaction\":\"Transaction to verify.\",\"_txChainElement\":\"Transaction chain element corresponding to the transaction.\"},\"returns\":{\"_0\":\"True if the transaction exists in the CTC, false if not.\"}}},\"title\":\"OVM_CanonicalTransactionChain\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"appendQueueBatch(uint256)\":{\"notice\":\"Appends a given number of queued transactions as a single batch. param _numQueuedTransactions Number of transactions to append.\"},\"appendSequencerBatch()\":{\"notice\":\"Allows the sequencer to append a batch of transactions.\"},\"batches()\":{\"notice\":\"Accesses the batch storage container.\"},\"enqueue(address,uint256,bytes)\":{\"notice\":\"Adds a transaction to the queue.\"},\"getLastBlockNumber()\":{\"notice\":\"Returns the blocknumber of the last transaction.\"},\"getLastTimestamp()\":{\"notice\":\"Returns the timestamp of the last transaction.\"},\"getNextQueueIndex()\":{\"notice\":\"Returns the index of the next element to be enqueued.\"},\"getNumPendingQueueElements()\":{\"notice\":\"Get the number of queue elements which have not yet been included.\"},\"getQueueElement(uint256)\":{\"notice\":\"Gets the queue element at a particular index.\"},\"getQueueLength()\":{\"notice\":\"Retrieves the length of the queue, including both pending and canonical transactions.\"},\"getTotalBatches()\":{\"notice\":\"Retrieves the total number of batches submitted.\"},\"getTotalElements()\":{\"notice\":\"Retrieves the total number of elements submitted.\"},\"queue()\":{\"notice\":\"Accesses the queue storage container.\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"},\"verifyTransaction((uint256,uint256,uint8,address,address,uint256,bytes),(bool,uint256,uint256,uint256,bytes),(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))\":{\"notice\":\"Verifies whether a transaction is included in the chain.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/OVM/chain/OVM_CanonicalTransactionChain.sol\":\"OVM_CanonicalTransactionChain\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor () internal {\\n address msgSender = _msgSender();\\n _owner = msgSender;\\n emit OwnershipTransferred(address(0), msgSender);\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n emit OwnershipTransferred(_owner, address(0));\\n _owner = address(0);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n emit OwnershipTransferred(_owner, newOwner);\\n _owner = newOwner;\\n }\\n}\\n\",\"keccak256\":\"0x15e2d5bd4c28a88548074c54d220e8086f638a71ed07e6b3ba5a70066fcf458d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a >= b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two numbers.\\n */\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two numbers. The result is rounded towards\\n * zero.\\n */\\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b) / 2 can overflow, so we distribute\\n return (a / 2) + (b / 2) + ((a % 2 + b % 2) / 2);\\n }\\n}\\n\",\"keccak256\":\"0x363bd3b45201f07c9b71c2edc96533468cf14a3d029fabd82fddceb1eb3ebd9c\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with GSN meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address payable) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes memory) {\\n this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x8d3cb350f04ff49cfb10aef08d87f19dcbaecc8027b0bed12f3275cd12f38cf0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/chain/OVM_CanonicalTransactionChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// @unsupported: ovm\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\nimport { Lib_MerkleTree } from \\\"../../libraries/utils/Lib_MerkleTree.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_CanonicalTransactionChain } from \\\"../../iOVM/chain/iOVM_CanonicalTransactionChain.sol\\\";\\nimport { iOVM_ChainStorageContainer } from \\\"../../iOVM/chain/iOVM_ChainStorageContainer.sol\\\";\\n\\n/* Contract Imports */\\nimport { OVM_ExecutionManager } from \\\"../execution/OVM_ExecutionManager.sol\\\";\\n\\n/* External Imports */\\nimport { Math } from \\\"@openzeppelin/contracts/math/Math.sol\\\";\\n\\n/**\\n * @title OVM_CanonicalTransactionChain\\n * @dev The Canonical Transaction Chain (CTC) contract is an append-only log of transactions\\n * which must be applied to the rollup state. It defines the ordering of rollup transactions by\\n * writing them to the 'CTC:batches' instance of the Chain Storage Container.\\n * The CTC also allows any account to 'enqueue' an L2 transaction, which will require that the Sequencer\\n * will eventually append it to the rollup state.\\n * If the Sequencer does not include an enqueued transaction within the 'force inclusion period',\\n * then any account may force it to be included by calling appendQueueBatch().\\n *\\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract OVM_CanonicalTransactionChain is iOVM_CanonicalTransactionChain, Lib_AddressResolver {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n // L2 tx gas-related\\n uint256 constant public MIN_ROLLUP_TX_GAS = 100000;\\n uint256 constant public MAX_ROLLUP_TX_SIZE = 50000;\\n uint256 constant public L2_GAS_DISCOUNT_DIVISOR = 32;\\n\\n // Encoding-related (all in bytes)\\n uint256 constant internal BATCH_CONTEXT_SIZE = 16;\\n uint256 constant internal BATCH_CONTEXT_LENGTH_POS = 12;\\n uint256 constant internal BATCH_CONTEXT_START_POS = 15;\\n uint256 constant internal TX_DATA_HEADER_SIZE = 3;\\n uint256 constant internal BYTES_TILL_TX_DATA = 65;\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n uint256 public forceInclusionPeriodSeconds;\\n uint256 public forceInclusionPeriodBlocks;\\n uint256 public maxTransactionGasLimit;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n constructor(\\n address _libAddressManager,\\n uint256 _forceInclusionPeriodSeconds,\\n uint256 _forceInclusionPeriodBlocks,\\n uint256 _maxTransactionGasLimit\\n )\\n Lib_AddressResolver(_libAddressManager)\\n {\\n forceInclusionPeriodSeconds = _forceInclusionPeriodSeconds;\\n forceInclusionPeriodBlocks = _forceInclusionPeriodBlocks;\\n maxTransactionGasLimit = _maxTransactionGasLimit;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Accesses the batch storage container.\\n * @return Reference to the batch storage container.\\n */\\n function batches()\\n override\\n public\\n view\\n returns (\\n iOVM_ChainStorageContainer\\n )\\n {\\n return iOVM_ChainStorageContainer(\\n resolve(\\\"OVM_ChainStorageContainer:CTC:batches\\\")\\n );\\n }\\n\\n /**\\n * Accesses the queue storage container.\\n * @return Reference to the queue storage container.\\n */\\n function queue()\\n override\\n public\\n view\\n returns (\\n iOVM_ChainStorageContainer\\n )\\n {\\n return iOVM_ChainStorageContainer(\\n resolve(\\\"OVM_ChainStorageContainer:CTC:queue\\\")\\n );\\n }\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements()\\n override\\n public\\n view\\n returns (\\n uint256 _totalElements\\n )\\n {\\n (uint40 totalElements,,,) = _getBatchExtraData();\\n return uint256(totalElements);\\n }\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches()\\n override\\n public\\n view\\n returns (\\n uint256 _totalBatches\\n )\\n {\\n return batches().length();\\n }\\n\\n /**\\n * Returns the index of the next element to be enqueued.\\n * @return Index for the next queue element.\\n */\\n function getNextQueueIndex()\\n override\\n public\\n view\\n returns (\\n uint40\\n )\\n {\\n (,uint40 nextQueueIndex,,) = _getBatchExtraData();\\n return nextQueueIndex;\\n }\\n\\n /**\\n * Returns the timestamp of the last transaction.\\n * @return Timestamp for the last transaction.\\n */\\n function getLastTimestamp()\\n override\\n public\\n view\\n returns (\\n uint40\\n )\\n {\\n (,,uint40 lastTimestamp,) = _getBatchExtraData();\\n return lastTimestamp;\\n }\\n\\n /**\\n * Returns the blocknumber of the last transaction.\\n * @return Blocknumber for the last transaction.\\n */\\n function getLastBlockNumber()\\n override\\n public\\n view\\n returns (\\n uint40\\n )\\n {\\n (,,,uint40 lastBlockNumber) = _getBatchExtraData();\\n return lastBlockNumber;\\n }\\n\\n /**\\n * Gets the queue element at a particular index.\\n * @param _index Index of the queue element to access.\\n * @return _element Queue element at the given index.\\n */\\n function getQueueElement(\\n uint256 _index\\n )\\n override\\n public\\n view\\n returns (\\n Lib_OVMCodec.QueueElement memory _element\\n )\\n {\\n return _getQueueElement(\\n _index,\\n queue()\\n );\\n }\\n\\n /**\\n * Get the number of queue elements which have not yet been included.\\n * @return Number of pending queue elements.\\n */\\n function getNumPendingQueueElements()\\n override\\n public\\n view\\n returns (\\n uint40\\n )\\n {\\n return getQueueLength() - getNextQueueIndex();\\n }\\n\\n /**\\n * Retrieves the length of the queue, including\\n * both pending and canonical transactions.\\n * @return Length of the queue.\\n */\\n function getQueueLength()\\n override\\n public\\n view\\n returns (\\n uint40\\n )\\n {\\n return _getQueueLength(\\n queue()\\n );\\n }\\n\\n /**\\n * Adds a transaction to the queue.\\n * @param _target Target L2 contract to send the transaction to.\\n * @param _gasLimit Gas limit for the enqueued L2 transaction.\\n * @param _data Transaction data.\\n */\\n function enqueue(\\n address _target,\\n uint256 _gasLimit,\\n bytes memory _data\\n )\\n override\\n public\\n {\\n require(\\n _data.length <= MAX_ROLLUP_TX_SIZE,\\n \\\"Transaction data size exceeds maximum for rollup transaction.\\\"\\n );\\n\\n require(\\n _gasLimit <= maxTransactionGasLimit,\\n \\\"Transaction gas limit exceeds maximum for rollup transaction.\\\"\\n );\\n\\n require(\\n _gasLimit >= MIN_ROLLUP_TX_GAS,\\n \\\"Transaction gas limit too low to enqueue.\\\"\\n );\\n\\n // We need to consume some amount of L1 gas in order to rate limit transactions going into\\n // L2. However, L2 is cheaper than L1 so we only need to burn some small proportion of the\\n // provided L1 gas.\\n uint256 gasToConsume = _gasLimit/L2_GAS_DISCOUNT_DIVISOR;\\n uint256 startingGas = gasleft();\\n\\n // Although this check is not necessary (burn below will run out of gas if not true), it\\n // gives the user an explicit reason as to why the enqueue attempt failed.\\n require(\\n startingGas > gasToConsume,\\n \\\"Insufficient gas for L2 rate limiting burn.\\\"\\n );\\n\\n // Here we do some \\\"dumb\\\" work in order to burn gas, although we should probably replace\\n // this with something like minting gas token later on.\\n uint256 i;\\n while(startingGas - gasleft() < gasToConsume) {\\n i++;\\n }\\n\\n bytes32 transactionHash = keccak256(\\n abi.encode(\\n msg.sender,\\n _target,\\n _gasLimit,\\n _data\\n )\\n );\\n\\n bytes32 timestampAndBlockNumber;\\n assembly {\\n timestampAndBlockNumber := timestamp()\\n timestampAndBlockNumber := or(timestampAndBlockNumber, shl(40, number()))\\n }\\n\\n iOVM_ChainStorageContainer queueRef = queue();\\n\\n queueRef.push(transactionHash);\\n queueRef.push(timestampAndBlockNumber);\\n\\n // The underlying queue data structure stores 2 elements\\n // per insertion, so to get the real queue length we need\\n // to divide by 2 and subtract 1.\\n uint256 queueIndex = queueRef.length() / 2 - 1;\\n emit TransactionEnqueued(\\n msg.sender,\\n _target,\\n _gasLimit,\\n _data,\\n queueIndex,\\n block.timestamp\\n );\\n }\\n\\n /**\\n * Appends a given number of queued transactions as a single batch.\\n * param _numQueuedTransactions Number of transactions to append.\\n */\\n function appendQueueBatch(\\n uint256 // _numQueuedTransactions\\n )\\n override\\n public\\n pure\\n {\\n // TEMPORARY: Disable `appendQueueBatch` for minnet\\n revert(\\\"appendQueueBatch is currently disabled.\\\");\\n\\n // _numQueuedTransactions = Math.min(_numQueuedTransactions, getNumPendingQueueElements());\\n // require(\\n // _numQueuedTransactions > 0,\\n // \\\"Must append more than zero transactions.\\\"\\n // );\\n\\n // bytes32[] memory leaves = new bytes32[](_numQueuedTransactions);\\n // uint40 nextQueueIndex = getNextQueueIndex();\\n\\n // for (uint256 i = 0; i < _numQueuedTransactions; i++) {\\n // if (msg.sender != resolve(\\\"OVM_Sequencer\\\")) {\\n // Lib_OVMCodec.QueueElement memory el = getQueueElement(nextQueueIndex);\\n // require(\\n // el.timestamp + forceInclusionPeriodSeconds < block.timestamp,\\n // \\\"Queue transactions cannot be submitted during the sequencer inclusion period.\\\"\\n // );\\n // }\\n // leaves[i] = _getQueueLeafHash(nextQueueIndex);\\n // nextQueueIndex++;\\n // }\\n\\n // Lib_OVMCodec.QueueElement memory lastElement = getQueueElement(nextQueueIndex - 1);\\n\\n // _appendBatch(\\n // Lib_MerkleTree.getMerkleRoot(leaves),\\n // _numQueuedTransactions,\\n // _numQueuedTransactions,\\n // lastElement.timestamp,\\n // lastElement.blockNumber\\n // );\\n\\n // emit QueueBatchAppended(\\n // nextQueueIndex - _numQueuedTransactions,\\n // _numQueuedTransactions,\\n // getTotalElements()\\n // );\\n }\\n\\n /**\\n * Allows the sequencer to append a batch of transactions.\\n * @dev This function uses a custom encoding scheme for efficiency reasons.\\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\\n * .param _contexts Array of batch contexts.\\n * .param _transactionDataFields Array of raw transaction data.\\n */\\n function appendSequencerBatch()\\n override\\n public\\n {\\n uint40 shouldStartAtElement;\\n uint24 totalElementsToAppend;\\n uint24 numContexts;\\n assembly {\\n shouldStartAtElement := shr(216, calldataload(4))\\n totalElementsToAppend := shr(232, calldataload(9))\\n numContexts := shr(232, calldataload(12))\\n }\\n\\n require(\\n shouldStartAtElement == getTotalElements(),\\n \\\"Actual batch start index does not match expected start index.\\\"\\n );\\n\\n require(\\n msg.sender == resolve(\\\"OVM_Sequencer\\\"),\\n \\\"Function can only be called by the Sequencer.\\\"\\n );\\n\\n require(\\n numContexts > 0,\\n \\\"Must provide at least one batch context.\\\"\\n );\\n\\n require(\\n totalElementsToAppend > 0,\\n \\\"Must append at least one element.\\\"\\n );\\n\\n uint40 nextTransactionPtr = uint40(BATCH_CONTEXT_START_POS + BATCH_CONTEXT_SIZE * numContexts);\\n\\n require(\\n msg.data.length >= nextTransactionPtr,\\n \\\"Not enough BatchContexts provided.\\\"\\n );\\n\\n // Take a reference to the queue and its length so we don't have to keep resolving it.\\n // Length isn't going to change during the course of execution, so it's fine to simply\\n // resolve this once at the start. Saves gas.\\n iOVM_ChainStorageContainer queueRef = queue();\\n uint40 queueLength = _getQueueLength(queueRef);\\n\\n // Reserve some memory to save gas on hashing later on. This is a relatively safe estimate\\n // for the average transaction size that will prevent having to resize this chunk of memory\\n // later on. Saves gas.\\n bytes memory hashMemory = new bytes((msg.data.length / totalElementsToAppend) * 2);\\n\\n // Initialize the array of canonical chain leaves that we will append.\\n bytes32[] memory leaves = new bytes32[](totalElementsToAppend);\\n\\n // Each leaf index corresponds to a tx, either sequenced or enqueued.\\n uint32 leafIndex = 0;\\n\\n // Counter for number of sequencer transactions appended so far.\\n uint32 numSequencerTransactions = 0;\\n\\n // We will sequentially append leaves which are pointers to the queue.\\n // The initial queue index is what is currently in storage.\\n uint40 nextQueueIndex = getNextQueueIndex();\\n\\n BatchContext memory curContext;\\n for (uint32 i = 0; i < numContexts; i++) {\\n BatchContext memory nextContext = _getBatchContext(i);\\n\\n if (i == 0) {\\n // Execute a special check for the first batch.\\n _validateFirstBatchContext(nextContext);\\n }\\n\\n // Execute this check on every single batch, including the first one.\\n _validateNextBatchContext(\\n curContext,\\n nextContext,\\n nextQueueIndex,\\n queueRef\\n );\\n\\n // Now we can update our current context.\\n curContext = nextContext;\\n\\n // Process sequencer transactions first.\\n for (uint32 j = 0; j < curContext.numSequencedTransactions; j++) {\\n uint256 txDataLength;\\n assembly {\\n txDataLength := shr(232, calldataload(nextTransactionPtr))\\n }\\n require(\\n txDataLength <= MAX_ROLLUP_TX_SIZE,\\n \\\"Transaction data size exceeds maximum for rollup transaction.\\\"\\n );\\n\\n leaves[leafIndex] = _getSequencerLeafHash(\\n curContext,\\n nextTransactionPtr,\\n txDataLength,\\n hashMemory\\n );\\n\\n nextTransactionPtr += uint40(TX_DATA_HEADER_SIZE + txDataLength);\\n numSequencerTransactions++;\\n leafIndex++;\\n }\\n\\n // Now process any subsequent queue transactions.\\n for (uint32 j = 0; j < curContext.numSubsequentQueueTransactions; j++) {\\n require(\\n nextQueueIndex < queueLength,\\n \\\"Not enough queued transactions to append.\\\"\\n );\\n\\n leaves[leafIndex] = _getQueueLeafHash(nextQueueIndex);\\n nextQueueIndex++;\\n leafIndex++;\\n }\\n }\\n\\n _validateFinalBatchContext(\\n curContext,\\n nextQueueIndex,\\n queueLength,\\n queueRef\\n );\\n\\n require(\\n msg.data.length == nextTransactionPtr,\\n \\\"Not all sequencer transactions were processed.\\\"\\n );\\n\\n require(\\n leafIndex == totalElementsToAppend,\\n \\\"Actual transaction index does not match expected total elements to append.\\\"\\n );\\n\\n // Generate the required metadata that we need to append this batch\\n uint40 numQueuedTransactions = totalElementsToAppend - numSequencerTransactions;\\n uint40 blockTimestamp;\\n uint40 blockNumber;\\n if (curContext.numSubsequentQueueTransactions == 0) {\\n // The last element is a sequencer tx, therefore pull timestamp and block number from the last context.\\n blockTimestamp = uint40(curContext.timestamp);\\n blockNumber = uint40(curContext.blockNumber);\\n } else {\\n // The last element is a queue tx, therefore pull timestamp and block number from the queue element.\\n // curContext.numSubsequentQueueTransactions > 0 which means that we've processed at least one queue element.\\n // We increment nextQueueIndex after processing each queue element,\\n // so the index of the last element we processed is nextQueueIndex - 1.\\n Lib_OVMCodec.QueueElement memory lastElement = _getQueueElement(\\n nextQueueIndex - 1,\\n queueRef\\n );\\n\\n blockTimestamp = lastElement.timestamp;\\n blockNumber = lastElement.blockNumber;\\n }\\n\\n // For efficiency reasons getMerkleRoot modifies the `leaves` argument in place\\n // while calculating the root hash therefore any arguments passed to it must not\\n // be used again afterwards\\n _appendBatch(\\n Lib_MerkleTree.getMerkleRoot(leaves),\\n totalElementsToAppend,\\n numQueuedTransactions,\\n blockTimestamp,\\n blockNumber\\n );\\n\\n emit SequencerBatchAppended(\\n nextQueueIndex - numQueuedTransactions,\\n numQueuedTransactions,\\n getTotalElements()\\n );\\n }\\n\\n /**\\n * Verifies whether a transaction is included in the chain.\\n * @param _transaction Transaction to verify.\\n * @param _txChainElement Transaction chain element corresponding to the transaction.\\n * @param _batchHeader Header of the batch the transaction was included in.\\n * @param _inclusionProof Inclusion proof for the provided transaction chain element.\\n * @return True if the transaction exists in the CTC, false if not.\\n */\\n function verifyTransaction(\\n Lib_OVMCodec.Transaction memory _transaction,\\n Lib_OVMCodec.TransactionChainElement memory _txChainElement,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _inclusionProof\\n )\\n override\\n public\\n view\\n returns (\\n bool\\n )\\n {\\n if (_txChainElement.isSequenced == true) {\\n return _verifySequencerTransaction(\\n _transaction,\\n _txChainElement,\\n _batchHeader,\\n _inclusionProof\\n );\\n } else {\\n return _verifyQueueTransaction(\\n _transaction,\\n _txChainElement.queueIndex,\\n _batchHeader,\\n _inclusionProof\\n );\\n }\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Returns the BatchContext located at a particular index.\\n * @param _index The index of the BatchContext\\n * @return The BatchContext at the specified index.\\n */\\n function _getBatchContext(\\n uint256 _index\\n )\\n internal\\n pure\\n returns (\\n BatchContext memory\\n )\\n {\\n uint256 contextPtr = 15 + _index * BATCH_CONTEXT_SIZE;\\n uint256 numSequencedTransactions;\\n uint256 numSubsequentQueueTransactions;\\n uint256 ctxTimestamp;\\n uint256 ctxBlockNumber;\\n\\n assembly {\\n numSequencedTransactions := shr(232, calldataload(contextPtr))\\n numSubsequentQueueTransactions := shr(232, calldataload(add(contextPtr, 3)))\\n ctxTimestamp := shr(216, calldataload(add(contextPtr, 6)))\\n ctxBlockNumber := shr(216, calldataload(add(contextPtr, 11)))\\n }\\n\\n return BatchContext({\\n numSequencedTransactions: numSequencedTransactions,\\n numSubsequentQueueTransactions: numSubsequentQueueTransactions,\\n timestamp: ctxTimestamp,\\n blockNumber: ctxBlockNumber\\n });\\n }\\n\\n /**\\n * Parses the batch context from the extra data.\\n * @return Total number of elements submitted.\\n * @return Index of the next queue element.\\n */\\n function _getBatchExtraData()\\n internal\\n view\\n returns (\\n uint40,\\n uint40,\\n uint40,\\n uint40\\n )\\n {\\n bytes27 extraData = batches().getGlobalMetadata();\\n\\n uint40 totalElements;\\n uint40 nextQueueIndex;\\n uint40 lastTimestamp;\\n uint40 lastBlockNumber;\\n assembly {\\n extraData := shr(40, extraData)\\n totalElements := and(extraData, 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF)\\n nextQueueIndex := shr(40, and(extraData, 0x00000000000000000000000000000000000000000000FFFFFFFFFF0000000000))\\n lastTimestamp := shr(80, and(extraData, 0x0000000000000000000000000000000000FFFFFFFFFF00000000000000000000))\\n lastBlockNumber := shr(120, and(extraData, 0x000000000000000000000000FFFFFFFFFF000000000000000000000000000000))\\n }\\n\\n return (\\n totalElements,\\n nextQueueIndex,\\n lastTimestamp,\\n lastBlockNumber\\n );\\n }\\n\\n /**\\n * Encodes the batch context for the extra data.\\n * @param _totalElements Total number of elements submitted.\\n * @param _nextQueueIndex Index of the next queue element.\\n * @param _timestamp Timestamp for the last batch.\\n * @param _blockNumber Block number of the last batch.\\n * @return Encoded batch context.\\n */\\n function _makeBatchExtraData(\\n uint40 _totalElements,\\n uint40 _nextQueueIndex,\\n uint40 _timestamp,\\n uint40 _blockNumber\\n )\\n internal\\n pure\\n returns (\\n bytes27\\n )\\n {\\n bytes27 extraData;\\n assembly {\\n extraData := _totalElements\\n extraData := or(extraData, shl(40, _nextQueueIndex))\\n extraData := or(extraData, shl(80, _timestamp))\\n extraData := or(extraData, shl(120, _blockNumber))\\n extraData := shl(40, extraData)\\n }\\n\\n return extraData;\\n }\\n\\n /**\\n * Retrieves the hash of a queue element.\\n * @param _index Index of the queue element to retrieve a hash for.\\n * @return Hash of the queue element.\\n */\\n function _getQueueLeafHash(\\n uint256 _index\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return _hashTransactionChainElement(\\n Lib_OVMCodec.TransactionChainElement({\\n isSequenced: false,\\n queueIndex: _index,\\n timestamp: 0,\\n blockNumber: 0,\\n txData: hex\\\"\\\"\\n })\\n );\\n }\\n\\n /**\\n * Gets the queue element at a particular index.\\n * @param _index Index of the queue element to access.\\n * @return _element Queue element at the given index.\\n */\\n function _getQueueElement(\\n uint256 _index,\\n iOVM_ChainStorageContainer _queueRef\\n )\\n internal\\n view\\n returns (\\n Lib_OVMCodec.QueueElement memory _element\\n )\\n {\\n // The underlying queue data structure stores 2 elements\\n // per insertion, so to get the actual desired queue index\\n // we need to multiply by 2.\\n uint40 trueIndex = uint40(_index * 2);\\n bytes32 transactionHash = _queueRef.get(trueIndex);\\n bytes32 timestampAndBlockNumber = _queueRef.get(trueIndex + 1);\\n\\n uint40 elementTimestamp;\\n uint40 elementBlockNumber;\\n assembly {\\n elementTimestamp := and(timestampAndBlockNumber, 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF)\\n elementBlockNumber := shr(40, and(timestampAndBlockNumber, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000))\\n }\\n\\n return Lib_OVMCodec.QueueElement({\\n transactionHash: transactionHash,\\n timestamp: elementTimestamp,\\n blockNumber: elementBlockNumber\\n });\\n }\\n\\n /**\\n * Retrieves the length of the queue.\\n * @return Length of the queue.\\n */\\n function _getQueueLength(\\n iOVM_ChainStorageContainer _queueRef\\n )\\n internal\\n view\\n returns (\\n uint40\\n )\\n {\\n // The underlying queue data structure stores 2 elements\\n // per insertion, so to get the real queue length we need\\n // to divide by 2.\\n return uint40(_queueRef.length() / 2);\\n }\\n\\n /**\\n * Retrieves the hash of a sequencer element.\\n * @param _context Batch context for the given element.\\n * @param _nextTransactionPtr Pointer to the next transaction in the calldata.\\n * @param _txDataLength Length of the transaction item.\\n * @return Hash of the sequencer element.\\n */\\n function _getSequencerLeafHash(\\n BatchContext memory _context,\\n uint256 _nextTransactionPtr,\\n uint256 _txDataLength,\\n bytes memory _hashMemory\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n // Only allocate more memory if we didn't reserve enough to begin with.\\n if (BYTES_TILL_TX_DATA + _txDataLength > _hashMemory.length) {\\n _hashMemory = new bytes(BYTES_TILL_TX_DATA + _txDataLength);\\n }\\n\\n uint256 ctxTimestamp = _context.timestamp;\\n uint256 ctxBlockNumber = _context.blockNumber;\\n\\n bytes32 leafHash;\\n assembly {\\n let chainElementStart := add(_hashMemory, 0x20)\\n\\n // Set the first byte equal to `1` to indicate this is a sequencer chain element.\\n // This distinguishes sequencer ChainElements from queue ChainElements because\\n // all queue ChainElements are ABI encoded and the first byte of ABI encoded\\n // elements is always zero\\n mstore8(chainElementStart, 1)\\n\\n mstore(add(chainElementStart, 1), ctxTimestamp)\\n mstore(add(chainElementStart, 33), ctxBlockNumber)\\n\\n calldatacopy(add(chainElementStart, BYTES_TILL_TX_DATA), add(_nextTransactionPtr, 3), _txDataLength)\\n\\n leafHash := keccak256(chainElementStart, add(BYTES_TILL_TX_DATA, _txDataLength))\\n }\\n\\n return leafHash;\\n }\\n\\n /**\\n * Retrieves the hash of a sequencer element.\\n * @param _txChainElement The chain element which is hashed to calculate the leaf.\\n * @return Hash of the sequencer element.\\n */\\n function _getSequencerLeafHash(\\n Lib_OVMCodec.TransactionChainElement memory _txChainElement\\n )\\n internal\\n view\\n returns(\\n bytes32\\n )\\n {\\n bytes memory txData = _txChainElement.txData;\\n uint256 txDataLength = _txChainElement.txData.length;\\n\\n bytes memory chainElement = new bytes(BYTES_TILL_TX_DATA + txDataLength);\\n uint256 ctxTimestamp = _txChainElement.timestamp;\\n uint256 ctxBlockNumber = _txChainElement.blockNumber;\\n\\n bytes32 leafHash;\\n assembly {\\n let chainElementStart := add(chainElement, 0x20)\\n\\n // Set the first byte equal to `1` to indicate this is a sequencer chain element.\\n // This distinguishes sequencer ChainElements from queue ChainElements because\\n // all queue ChainElements are ABI encoded and the first byte of ABI encoded\\n // elements is always zero\\n mstore8(chainElementStart, 1)\\n\\n mstore(add(chainElementStart, 1), ctxTimestamp)\\n mstore(add(chainElementStart, 33), ctxBlockNumber)\\n\\n pop(staticcall(gas(), 0x04, add(txData, 0x20), txDataLength, add(chainElementStart, BYTES_TILL_TX_DATA), txDataLength))\\n\\n leafHash := keccak256(chainElementStart, add(BYTES_TILL_TX_DATA, txDataLength))\\n }\\n\\n return leafHash;\\n }\\n\\n /**\\n * Inserts a batch into the chain of batches.\\n * @param _transactionRoot Root of the transaction tree for this batch.\\n * @param _batchSize Number of elements in the batch.\\n * @param _numQueuedTransactions Number of queue transactions in the batch.\\n * @param _timestamp The latest batch timestamp.\\n * @param _blockNumber The latest batch blockNumber.\\n */\\n function _appendBatch(\\n bytes32 _transactionRoot,\\n uint256 _batchSize,\\n uint256 _numQueuedTransactions,\\n uint40 _timestamp,\\n uint40 _blockNumber\\n )\\n internal\\n {\\n iOVM_ChainStorageContainer batchesRef = batches();\\n (uint40 totalElements, uint40 nextQueueIndex,,) = _getBatchExtraData();\\n\\n Lib_OVMCodec.ChainBatchHeader memory header = Lib_OVMCodec.ChainBatchHeader({\\n batchIndex: batchesRef.length(),\\n batchRoot: _transactionRoot,\\n batchSize: _batchSize,\\n prevTotalElements: totalElements,\\n extraData: hex\\\"\\\"\\n });\\n\\n emit TransactionBatchAppended(\\n header.batchIndex,\\n header.batchRoot,\\n header.batchSize,\\n header.prevTotalElements,\\n header.extraData\\n );\\n\\n bytes32 batchHeaderHash = Lib_OVMCodec.hashBatchHeader(header);\\n bytes27 latestBatchContext = _makeBatchExtraData(\\n totalElements + uint40(header.batchSize),\\n nextQueueIndex + uint40(_numQueuedTransactions),\\n _timestamp,\\n _blockNumber\\n );\\n\\n batchesRef.push(batchHeaderHash, latestBatchContext);\\n }\\n\\n /**\\n * Checks that the first batch context in a sequencer submission is valid\\n * @param _firstContext The batch context to validate.\\n */\\n function _validateFirstBatchContext(\\n BatchContext memory _firstContext\\n )\\n internal\\n view\\n {\\n // If there are existing elements, this batch must have the same context\\n // or a later timestamp and block number.\\n if (getTotalElements() > 0) {\\n (,, uint40 lastTimestamp, uint40 lastBlockNumber) = _getBatchExtraData();\\n\\n require(\\n _firstContext.blockNumber >= lastBlockNumber,\\n \\\"Context block number is lower than last submitted.\\\"\\n );\\n\\n require(\\n _firstContext.timestamp >= lastTimestamp,\\n \\\"Context timestamp is lower than last submitted.\\\"\\n );\\n }\\n\\n // Sequencer cannot submit contexts which are more than the force inclusion period old.\\n require(\\n _firstContext.timestamp + forceInclusionPeriodSeconds >= block.timestamp,\\n \\\"Context timestamp too far in the past.\\\"\\n );\\n\\n require(\\n _firstContext.blockNumber + forceInclusionPeriodBlocks >= block.number,\\n \\\"Context block number too far in the past.\\\"\\n );\\n }\\n\\n /**\\n * Checks that a given batch context has a time context which is below a given que element\\n * @param _context The batch context to validate has values lower.\\n * @param _queueIndex Index of the queue element we are validating came later than the context.\\n * @param _queueRef The storage container for the queue.\\n */\\n function _validateContextBeforeEnqueue(\\n BatchContext memory _context,\\n uint40 _queueIndex,\\n iOVM_ChainStorageContainer _queueRef\\n )\\n internal\\n view\\n {\\n Lib_OVMCodec.QueueElement memory nextQueueElement = _getQueueElement(\\n _queueIndex,\\n _queueRef\\n );\\n\\n // If the force inclusion period has passed for an enqueued transaction, it MUST be the next chain element.\\n require(\\n block.timestamp < nextQueueElement.timestamp + forceInclusionPeriodSeconds,\\n \\\"Previously enqueued batches have expired and must be appended before a new sequencer batch.\\\"\\n );\\n\\n // Just like sequencer transaction times must be increasing relative to each other,\\n // We also require that they be increasing relative to any interspersed queue elements.\\n require(\\n _context.timestamp <= nextQueueElement.timestamp,\\n \\\"Sequencer transaction timestamp exceeds that of next queue element.\\\"\\n );\\n\\n require(\\n _context.blockNumber <= nextQueueElement.blockNumber,\\n \\\"Sequencer transaction blockNumber exceeds that of next queue element.\\\"\\n );\\n }\\n\\n /**\\n * Checks that a given batch context is valid based on its previous context, and the next queue elemtent.\\n * @param _prevContext The previously validated batch context.\\n * @param _nextContext The batch context to validate with this call.\\n * @param _nextQueueIndex Index of the next queue element to process for the _nextContext's subsequentQueueElements.\\n * @param _queueRef The storage container for the queue.\\n */\\n function _validateNextBatchContext(\\n BatchContext memory _prevContext,\\n BatchContext memory _nextContext,\\n uint40 _nextQueueIndex,\\n iOVM_ChainStorageContainer _queueRef\\n )\\n internal\\n view\\n {\\n // All sequencer transactions' times must be greater than or equal to the previous ones.\\n require(\\n _nextContext.timestamp >= _prevContext.timestamp,\\n \\\"Context timestamp values must monotonically increase.\\\"\\n );\\n\\n require(\\n _nextContext.blockNumber >= _prevContext.blockNumber,\\n \\\"Context blockNumber values must monotonically increase.\\\"\\n );\\n\\n // If there is going to be a queue element pulled in from this context:\\n if (_nextContext.numSubsequentQueueTransactions > 0) {\\n _validateContextBeforeEnqueue(\\n _nextContext,\\n _nextQueueIndex,\\n _queueRef\\n );\\n }\\n }\\n\\n /**\\n * Checks that the final batch context in a sequencer submission is valid.\\n * @param _finalContext The batch context to validate.\\n * @param _queueLength The length of the queue at the start of the batchAppend call.\\n * @param _nextQueueIndex The next element in the queue that will be pulled into the CTC.\\n * @param _queueRef The storage container for the queue.\\n */\\n function _validateFinalBatchContext(\\n BatchContext memory _finalContext,\\n uint40 _nextQueueIndex,\\n uint40 _queueLength,\\n iOVM_ChainStorageContainer _queueRef\\n )\\n internal\\n view\\n {\\n // If the queue is not now empty, check the mononoticity of whatever the next batch that will come in is.\\n if (_queueLength - _nextQueueIndex > 0 && _finalContext.numSubsequentQueueTransactions == 0) {\\n _validateContextBeforeEnqueue(\\n _finalContext,\\n _nextQueueIndex,\\n _queueRef\\n );\\n }\\n // Batches cannot be added from the future, or subsequent enqueue() contexts would violate monotonicity.\\n require(_finalContext.timestamp <= block.timestamp, \\\"Context timestamp is from the future.\\\");\\n require(_finalContext.blockNumber <= block.number, \\\"Context block number is from the future.\\\");\\n }\\n\\n /**\\n * Hashes a transaction chain element.\\n * @param _element Chain element to hash.\\n * @return Hash of the chain element.\\n */\\n function _hashTransactionChainElement(\\n Lib_OVMCodec.TransactionChainElement memory _element\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(\\n abi.encode(\\n _element.isSequenced,\\n _element.queueIndex,\\n _element.timestamp,\\n _element.blockNumber,\\n _element.txData\\n )\\n );\\n }\\n\\n /**\\n * Verifies a sequencer transaction, returning true if it was indeed included in the CTC\\n * @param _transaction The transaction we are verifying inclusion of.\\n * @param _txChainElement The chain element that the transaction is claimed to be a part of.\\n * @param _batchHeader Header of the batch the transaction was included in.\\n * @param _inclusionProof An inclusion proof into the CTC at a particular index.\\n * @return True if the transaction was included in the specified location, else false.\\n */\\n function _verifySequencerTransaction(\\n Lib_OVMCodec.Transaction memory _transaction,\\n Lib_OVMCodec.TransactionChainElement memory _txChainElement,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _inclusionProof\\n )\\n internal\\n view\\n returns (\\n bool\\n )\\n {\\n OVM_ExecutionManager ovmExecutionManager = OVM_ExecutionManager(resolve(\\\"OVM_ExecutionManager\\\"));\\n uint256 gasLimit = ovmExecutionManager.getMaxTransactionGasLimit();\\n bytes32 leafHash = _getSequencerLeafHash(_txChainElement);\\n\\n require(\\n _verifyElement(\\n leafHash,\\n _batchHeader,\\n _inclusionProof\\n ),\\n \\\"Invalid Sequencer transaction inclusion proof.\\\"\\n );\\n\\n require(\\n _transaction.blockNumber == _txChainElement.blockNumber\\n && _transaction.timestamp == _txChainElement.timestamp\\n && _transaction.entrypoint == resolve(\\\"OVM_DecompressionPrecompileAddress\\\")\\n && _transaction.gasLimit == gasLimit\\n && _transaction.l1TxOrigin == address(0)\\n && _transaction.l1QueueOrigin == Lib_OVMCodec.QueueOrigin.SEQUENCER_QUEUE\\n && keccak256(_transaction.data) == keccak256(_txChainElement.txData),\\n \\\"Invalid Sequencer transaction.\\\"\\n );\\n\\n return true;\\n }\\n\\n /**\\n * Verifies a queue transaction, returning true if it was indeed included in the CTC\\n * @param _transaction The transaction we are verifying inclusion of.\\n * @param _queueIndex The queueIndex of the queued transaction.\\n * @param _batchHeader Header of the batch the transaction was included in.\\n * @param _inclusionProof An inclusion proof into the CTC at a particular index (should point to queue tx).\\n * @return True if the transaction was included in the specified location, else false.\\n */\\n function _verifyQueueTransaction(\\n Lib_OVMCodec.Transaction memory _transaction,\\n uint256 _queueIndex,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _inclusionProof\\n )\\n internal\\n view\\n returns (\\n bool\\n )\\n {\\n bytes32 leafHash = _getQueueLeafHash(_queueIndex);\\n\\n require(\\n _verifyElement(\\n leafHash,\\n _batchHeader,\\n _inclusionProof\\n ),\\n \\\"Invalid Queue transaction inclusion proof.\\\"\\n );\\n\\n bytes32 transactionHash = keccak256(\\n abi.encode(\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n )\\n );\\n\\n Lib_OVMCodec.QueueElement memory el = getQueueElement(_queueIndex);\\n require(\\n el.transactionHash == transactionHash\\n && el.timestamp == _transaction.timestamp\\n && el.blockNumber == _transaction.blockNumber,\\n \\\"Invalid Queue transaction.\\\"\\n );\\n\\n return true;\\n }\\n\\n /**\\n * Verifies a batch inclusion proof.\\n * @param _element Hash of the element to verify a proof for.\\n * @param _batchHeader Header of the batch in which the element was included.\\n * @param _proof Merkle inclusion proof for the element.\\n */\\n function _verifyElement(\\n bytes32 _element,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _proof\\n )\\n internal\\n view\\n returns (\\n bool\\n )\\n {\\n require(\\n Lib_OVMCodec.hashBatchHeader(_batchHeader) == batches().get(uint32(_batchHeader.batchIndex)),\\n \\\"Invalid batch header.\\\"\\n );\\n\\n require(\\n Lib_MerkleTree.verify(\\n _batchHeader.batchRoot,\\n _element,\\n _proof.index,\\n _proof.siblings,\\n _batchHeader.batchSize\\n ),\\n \\\"Invalid inclusion proof.\\\"\\n );\\n\\n return true;\\n }\\n}\\n\",\"keccak256\":\"0xdc5f311b6840476027f597b9b6ff6c7673988cfed9c9ace625c705175b27abe3\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// @unsupported: ovm\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\nimport { Lib_EthUtils } from \\\"../../libraries/utils/Lib_EthUtils.sol\\\";\\nimport { Lib_ErrorUtils } from \\\"../../libraries/utils/Lib_ErrorUtils.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_ExecutionManager } from \\\"../../iOVM/execution/iOVM_ExecutionManager.sol\\\";\\nimport { iOVM_StateManager } from \\\"../../iOVM/execution/iOVM_StateManager.sol\\\";\\nimport { iOVM_SafetyChecker } from \\\"../../iOVM/execution/iOVM_SafetyChecker.sol\\\";\\n\\n/* Contract Imports */\\nimport { OVM_DeployerWhitelist } from \\\"../predeploys/OVM_DeployerWhitelist.sol\\\";\\n\\n/**\\n * @title OVM_ExecutionManager\\n * @dev The Execution Manager (EM) is the core of our OVM implementation, and provides a sandboxed\\n * environment allowing us to execute OVM transactions deterministically on either Layer 1 or\\n * Layer 2.\\n * The EM's run() function is the first function called during the execution of any\\n * transaction on L2.\\n * For each context-dependent EVM operation the EM has a function which implements a corresponding\\n * OVM operation, which will read state from the State Manager contract.\\n * The EM relies on the Safety Checker to verify that code deployed to Layer 2 does not contain any\\n * context-dependent operations.\\n *\\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract OVM_ExecutionManager is iOVM_ExecutionManager, Lib_AddressResolver {\\n\\n /********************************\\n * External Contract References *\\n ********************************/\\n\\n iOVM_SafetyChecker internal ovmSafetyChecker;\\n iOVM_StateManager internal ovmStateManager;\\n\\n\\n /*******************************\\n * Execution Context Variables *\\n *******************************/\\n\\n GasMeterConfig internal gasMeterConfig;\\n GlobalContext internal globalContext;\\n TransactionContext internal transactionContext;\\n MessageContext internal messageContext;\\n TransactionRecord internal transactionRecord;\\n MessageRecord internal messageRecord;\\n\\n\\n /**************************\\n * Gas Metering Constants *\\n **************************/\\n\\n address constant GAS_METADATA_ADDRESS = 0x06a506A506a506A506a506a506A506A506A506A5;\\n uint256 constant NUISANCE_GAS_SLOAD = 20000;\\n uint256 constant NUISANCE_GAS_SSTORE = 20000;\\n uint256 constant MIN_NUISANCE_GAS_PER_CONTRACT = 30000;\\n uint256 constant NUISANCE_GAS_PER_CONTRACT_BYTE = 100;\\n uint256 constant MIN_GAS_FOR_INVALID_STATE_ACCESS = 30000;\\n\\n /**************************\\n * Default Context Values *\\n **************************/\\n\\n uint256 constant DEFAULT_UINT256 = 0xdefa017defa017defa017defa017defa017defa017defa017defa017defa017d;\\n address constant DEFAULT_ADDRESS = 0xdEfa017defA017DeFA017DEfa017DeFA017DeFa0;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n */\\n constructor(\\n address _libAddressManager,\\n GasMeterConfig memory _gasMeterConfig,\\n GlobalContext memory _globalContext\\n )\\n Lib_AddressResolver(_libAddressManager)\\n {\\n ovmSafetyChecker = iOVM_SafetyChecker(resolve(\\\"OVM_SafetyChecker\\\"));\\n gasMeterConfig = _gasMeterConfig;\\n globalContext = _globalContext;\\n _resetContext();\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n /**\\n * Applies dynamically-sized refund to a transaction to account for the difference in execution\\n * between L1 and L2, so that the overall cost of the ovmOPCODE is fixed.\\n * @param _cost Desired gas cost for the function after the refund.\\n */\\n modifier netGasCost(\\n uint256 _cost\\n ) {\\n uint256 gasProvided = gasleft();\\n _;\\n uint256 gasUsed = gasProvided - gasleft();\\n\\n // We want to refund everything *except* the specified cost.\\n if (_cost < gasUsed) {\\n transactionRecord.ovmGasRefund += gasUsed - _cost;\\n }\\n }\\n\\n /**\\n * Applies a fixed-size gas refund to a transaction to account for the difference in execution\\n * between L1 and L2, so that the overall cost of an ovmOPCODE can be lowered.\\n * @param _discount Amount of gas cost to refund for the ovmOPCODE.\\n */\\n modifier fixedGasDiscount(\\n uint256 _discount\\n ) {\\n uint256 gasProvided = gasleft();\\n _;\\n uint256 gasUsed = gasProvided - gasleft();\\n\\n // We want to refund the specified _discount, unless this risks underflow.\\n if (_discount < gasUsed) {\\n transactionRecord.ovmGasRefund += _discount;\\n } else {\\n // refund all we can without risking underflow.\\n transactionRecord.ovmGasRefund += gasUsed;\\n }\\n }\\n\\n /**\\n * Makes sure we're not inside a static context.\\n */\\n modifier notStatic() {\\n if (messageContext.isStatic == true) {\\n _revertWithFlag(RevertFlag.STATIC_VIOLATION);\\n }\\n _;\\n }\\n\\n\\n /************************************\\n * Transaction Execution Entrypoint *\\n ************************************/\\n\\n /**\\n * Starts the execution of a transaction via the OVM_ExecutionManager.\\n * @param _transaction Transaction data to be executed.\\n * @param _ovmStateManager iOVM_StateManager implementation providing account state.\\n */\\n function run(\\n Lib_OVMCodec.Transaction memory _transaction,\\n address _ovmStateManager\\n )\\n override\\n public\\n returns (\\n bytes memory\\n )\\n {\\n // Make sure that run() is not re-enterable. This condition should always be satisfied\\n // Once run has been called once, due to the behavior of _isValidInput().\\n if (transactionContext.ovmNUMBER != DEFAULT_UINT256) {\\n return bytes(\\\"\\\");\\n }\\n\\n // Store our OVM_StateManager instance (significantly easier than attempting to pass the\\n // address around in calldata).\\n ovmStateManager = iOVM_StateManager(_ovmStateManager);\\n\\n // Make sure this function can't be called by anyone except the owner of the\\n // OVM_StateManager (expected to be an OVM_StateTransitioner). We can revert here because\\n // this would make the `run` itself invalid.\\n require(\\n // This method may return false during fraud proofs, but always returns true in L2 nodes' State Manager precompile.\\n ovmStateManager.isAuthenticated(msg.sender),\\n \\\"Only authenticated addresses in ovmStateManager can call this function\\\"\\n );\\n\\n // Initialize the execution context, must be initialized before we perform any gas metering\\n // or we'll throw a nuisance gas error.\\n _initContext(_transaction);\\n\\n // TEMPORARY: Gas metering is disabled for minnet.\\n // // Check whether we need to start a new epoch, do so if necessary.\\n // _checkNeedsNewEpoch(_transaction.timestamp);\\n\\n // Make sure the transaction's gas limit is valid. We don't revert here because we reserve\\n // reverts for INVALID_STATE_ACCESS.\\n if (_isValidInput(_transaction) == false) {\\n _resetContext();\\n return bytes(\\\"\\\");\\n }\\n\\n // TEMPORARY: Gas metering is disabled for minnet.\\n // // Check gas right before the call to get total gas consumed by OVM transaction.\\n // uint256 gasProvided = gasleft();\\n\\n // Run the transaction, make sure to meter the gas usage.\\n (, bytes memory returndata) = ovmCALL(\\n _transaction.gasLimit - gasMeterConfig.minTransactionGasLimit,\\n _transaction.entrypoint,\\n _transaction.data\\n );\\n\\n // TEMPORARY: Gas metering is disabled for minnet.\\n // // Update the cumulative gas based on the amount of gas used.\\n // uint256 gasUsed = gasProvided - gasleft();\\n // _updateCumulativeGas(gasUsed, _transaction.l1QueueOrigin);\\n\\n // Wipe the execution context.\\n _resetContext();\\n\\n return returndata;\\n }\\n\\n\\n /******************************\\n * Opcodes: Execution Context *\\n ******************************/\\n\\n /**\\n * @notice Overrides CALLER.\\n * @return _CALLER Address of the CALLER within the current message context.\\n */\\n function ovmCALLER()\\n override\\n public\\n view\\n returns (\\n address _CALLER\\n )\\n {\\n return messageContext.ovmCALLER;\\n }\\n\\n /**\\n * @notice Overrides ADDRESS.\\n * @return _ADDRESS Active ADDRESS within the current message context.\\n */\\n function ovmADDRESS()\\n override\\n public\\n view\\n returns (\\n address _ADDRESS\\n )\\n {\\n return messageContext.ovmADDRESS;\\n }\\n\\n /**\\n * @notice Overrides TIMESTAMP.\\n * @return _TIMESTAMP Value of the TIMESTAMP within the transaction context.\\n */\\n function ovmTIMESTAMP()\\n override\\n public\\n view\\n returns (\\n uint256 _TIMESTAMP\\n )\\n {\\n return transactionContext.ovmTIMESTAMP;\\n }\\n\\n /**\\n * @notice Overrides NUMBER.\\n * @return _NUMBER Value of the NUMBER within the transaction context.\\n */\\n function ovmNUMBER()\\n override\\n public\\n view\\n returns (\\n uint256 _NUMBER\\n )\\n {\\n return transactionContext.ovmNUMBER;\\n }\\n\\n /**\\n * @notice Overrides GASLIMIT.\\n * @return _GASLIMIT Value of the block's GASLIMIT within the transaction context.\\n */\\n function ovmGASLIMIT()\\n override\\n public\\n view\\n returns (\\n uint256 _GASLIMIT\\n )\\n {\\n return transactionContext.ovmGASLIMIT;\\n }\\n\\n /**\\n * @notice Overrides CHAINID.\\n * @return _CHAINID Value of the chain's CHAINID within the global context.\\n */\\n function ovmCHAINID()\\n override\\n public\\n view\\n returns (\\n uint256 _CHAINID\\n )\\n {\\n return globalContext.ovmCHAINID;\\n }\\n\\n /*********************************\\n * Opcodes: L2 Execution Context *\\n *********************************/\\n\\n /**\\n * @notice Specifies from which source (Sequencer or Queue) this transaction originated from.\\n * @return _queueOrigin Enum indicating the ovmL1QUEUEORIGIN within the current message context.\\n */\\n function ovmL1QUEUEORIGIN()\\n override\\n public\\n view\\n returns (\\n Lib_OVMCodec.QueueOrigin _queueOrigin\\n )\\n {\\n return transactionContext.ovmL1QUEUEORIGIN;\\n }\\n\\n /**\\n * @notice Specifies which L1 account, if any, sent this transaction by calling enqueue().\\n * @return _l1TxOrigin Address of the account which sent the tx into L2 from L1.\\n */\\n function ovmL1TXORIGIN()\\n override\\n public\\n view\\n returns (\\n address _l1TxOrigin\\n )\\n {\\n return transactionContext.ovmL1TXORIGIN;\\n }\\n\\n /********************\\n * Opcodes: Halting *\\n ********************/\\n\\n /**\\n * @notice Overrides REVERT.\\n * @param _data Bytes data to pass along with the REVERT.\\n */\\n function ovmREVERT(\\n bytes memory _data\\n )\\n override\\n public\\n {\\n _revertWithFlag(RevertFlag.INTENTIONAL_REVERT, _data);\\n }\\n\\n\\n /******************************\\n * Opcodes: Contract Creation *\\n ******************************/\\n\\n /**\\n * @notice Overrides CREATE.\\n * @param _bytecode Code to be used to CREATE a new contract.\\n * @return Address of the created contract.\\n * @return Revert data, if and only if the creation threw an exception.\\n */\\n function ovmCREATE(\\n bytes memory _bytecode\\n )\\n override\\n public\\n notStatic\\n fixedGasDiscount(40000)\\n returns (\\n address,\\n bytes memory\\n )\\n {\\n // Creator is always the current ADDRESS.\\n address creator = ovmADDRESS();\\n\\n // Check that the deployer is whitelisted, or\\n // that arbitrary contract deployment has been enabled.\\n _checkDeployerAllowed(creator);\\n\\n // Generate the correct CREATE address.\\n address contractAddress = Lib_EthUtils.getAddressForCREATE(\\n creator,\\n _getAccountNonce(creator)\\n );\\n\\n return _createContract(\\n contractAddress,\\n _bytecode\\n );\\n }\\n\\n /**\\n * @notice Overrides CREATE2.\\n * @param _bytecode Code to be used to CREATE2 a new contract.\\n * @param _salt Value used to determine the contract's address.\\n * @return Address of the created contract.\\n * @return Revert data, if and only if the creation threw an exception.\\n */\\n function ovmCREATE2(\\n bytes memory _bytecode,\\n bytes32 _salt\\n )\\n override\\n public\\n notStatic\\n fixedGasDiscount(40000)\\n returns (\\n address,\\n bytes memory\\n )\\n {\\n // Creator is always the current ADDRESS.\\n address creator = ovmADDRESS();\\n\\n // Check that the deployer is whitelisted, or\\n // that arbitrary contract deployment has been enabled.\\n _checkDeployerAllowed(creator);\\n\\n // Generate the correct CREATE2 address.\\n address contractAddress = Lib_EthUtils.getAddressForCREATE2(\\n creator,\\n _bytecode,\\n _salt\\n );\\n\\n return _createContract(\\n contractAddress,\\n _bytecode\\n );\\n }\\n\\n\\n /*******************************\\n * Account Abstraction Opcodes *\\n ******************************/\\n\\n /**\\n * Retrieves the nonce of the current ovmADDRESS.\\n * @return _nonce Nonce of the current contract.\\n */\\n function ovmGETNONCE()\\n override\\n public\\n returns (\\n uint256 _nonce\\n )\\n {\\n return _getAccountNonce(ovmADDRESS());\\n }\\n\\n /**\\n * Bumps the nonce of the current ovmADDRESS by one.\\n */\\n function ovmINCREMENTNONCE()\\n override\\n public\\n notStatic\\n {\\n address account = ovmADDRESS();\\n uint256 nonce = _getAccountNonce(account);\\n\\n // Prevent overflow.\\n if (nonce + 1 > nonce) {\\n _setAccountNonce(account, nonce + 1);\\n }\\n }\\n\\n /**\\n * Creates a new EOA contract account, for account abstraction.\\n * @dev Essentially functions like ovmCREATE or ovmCREATE2, but we can bypass a lot of checks\\n * because the contract we're creating is trusted (no need to do safety checking or to\\n * handle unexpected reverts). Doesn't need to return an address because the address is\\n * assumed to be the user's actual address.\\n * @param _messageHash Hash of a message signed by some user, for verification.\\n * @param _v Signature `v` parameter.\\n * @param _r Signature `r` parameter.\\n * @param _s Signature `s` parameter.\\n */\\n function ovmCREATEEOA(\\n bytes32 _messageHash,\\n uint8 _v,\\n bytes32 _r,\\n bytes32 _s\\n )\\n override\\n public\\n notStatic\\n {\\n // Recover the EOA address from the message hash and signature parameters. Since we do the\\n // hashing in advance, we don't have handle different message hashing schemes. Even if this\\n // function were to return the wrong address (rather than explicitly returning the zero\\n // address), the rest of the transaction would simply fail (since there's no EOA account to\\n // actually execute the transaction).\\n address eoa = ecrecover(\\n _messageHash,\\n _v + 27,\\n _r,\\n _s\\n );\\n\\n // Invalid signature is a case we proactively handle with a revert. We could alternatively\\n // have this function return a `success` boolean, but this is just easier.\\n if (eoa == address(0)) {\\n ovmREVERT(bytes(\\\"Signature provided for EOA contract creation is invalid.\\\"));\\n }\\n\\n // If the user already has an EOA account, then there's no need to perform this operation.\\n if (_hasEmptyAccount(eoa) == false) {\\n return;\\n }\\n\\n // We always need to initialize the contract with the default account values.\\n _initPendingAccount(eoa);\\n\\n // Temporarily set the current address so it's easier to access on L2.\\n address prevADDRESS = messageContext.ovmADDRESS;\\n messageContext.ovmADDRESS = eoa;\\n\\n // Creates a duplicate of the OVM_ProxyEOA located at 0x42....09. Uses the following\\n // \\\"magic\\\" prefix to deploy an exact copy of the code:\\n // PUSH1 0x0D # size of this prefix in bytes\\n // CODESIZE\\n // SUB # subtract prefix size from codesize\\n // DUP1\\n // PUSH1 0x0D\\n // PUSH1 0x00\\n // CODECOPY # copy everything after prefix into memory at pos 0\\n // PUSH1 0x00\\n // RETURN # return the copied code\\n address proxyEOA = Lib_EthUtils.createContract(abi.encodePacked(\\n hex\\\"600D380380600D6000396000f3\\\",\\n ovmEXTCODECOPY(\\n 0x4200000000000000000000000000000000000009,\\n 0,\\n ovmEXTCODESIZE(0x4200000000000000000000000000000000000009)\\n )\\n ));\\n\\n // Reset the address now that we're done deploying.\\n messageContext.ovmADDRESS = prevADDRESS;\\n\\n // Commit the account with its final values.\\n _commitPendingAccount(\\n eoa,\\n address(proxyEOA),\\n keccak256(Lib_EthUtils.getCode(address(proxyEOA)))\\n );\\n\\n _setAccountNonce(eoa, 0);\\n }\\n\\n\\n /*********************************\\n * Opcodes: Contract Interaction *\\n *********************************/\\n\\n /**\\n * @notice Overrides CALL.\\n * @param _gasLimit Amount of gas to be passed into this call.\\n * @param _address Address of the contract to call.\\n * @param _calldata Data to send along with the call.\\n * @return _success Whether or not the call returned (rather than reverted).\\n * @return _returndata Data returned by the call.\\n */\\n function ovmCALL(\\n uint256 _gasLimit,\\n address _address,\\n bytes memory _calldata\\n )\\n override\\n public\\n fixedGasDiscount(100000)\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n // CALL updates the CALLER and ADDRESS.\\n MessageContext memory nextMessageContext = messageContext;\\n nextMessageContext.ovmCALLER = nextMessageContext.ovmADDRESS;\\n nextMessageContext.ovmADDRESS = _address;\\n\\n return _callContract(\\n nextMessageContext,\\n _gasLimit,\\n _address,\\n _calldata\\n );\\n }\\n\\n /**\\n * @notice Overrides STATICCALL.\\n * @param _gasLimit Amount of gas to be passed into this call.\\n * @param _address Address of the contract to call.\\n * @param _calldata Data to send along with the call.\\n * @return _success Whether or not the call returned (rather than reverted).\\n * @return _returndata Data returned by the call.\\n */\\n function ovmSTATICCALL(\\n uint256 _gasLimit,\\n address _address,\\n bytes memory _calldata\\n )\\n override\\n public\\n fixedGasDiscount(80000)\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n // STATICCALL updates the CALLER, updates the ADDRESS, and runs in a static context.\\n MessageContext memory nextMessageContext = messageContext;\\n nextMessageContext.ovmCALLER = nextMessageContext.ovmADDRESS;\\n nextMessageContext.ovmADDRESS = _address;\\n nextMessageContext.isStatic = true;\\n\\n return _callContract(\\n nextMessageContext,\\n _gasLimit,\\n _address,\\n _calldata\\n );\\n }\\n\\n /**\\n * @notice Overrides DELEGATECALL.\\n * @param _gasLimit Amount of gas to be passed into this call.\\n * @param _address Address of the contract to call.\\n * @param _calldata Data to send along with the call.\\n * @return _success Whether or not the call returned (rather than reverted).\\n * @return _returndata Data returned by the call.\\n */\\n function ovmDELEGATECALL(\\n uint256 _gasLimit,\\n address _address,\\n bytes memory _calldata\\n )\\n override\\n public\\n fixedGasDiscount(40000)\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n // DELEGATECALL does not change anything about the message context.\\n MessageContext memory nextMessageContext = messageContext;\\n\\n return _callContract(\\n nextMessageContext,\\n _gasLimit,\\n _address,\\n _calldata\\n );\\n }\\n\\n\\n /************************************\\n * Opcodes: Contract Storage Access *\\n ************************************/\\n\\n /**\\n * @notice Overrides SLOAD.\\n * @param _key 32 byte key of the storage slot to load.\\n * @return _value 32 byte value of the requested storage slot.\\n */\\n function ovmSLOAD(\\n bytes32 _key\\n )\\n override\\n public\\n netGasCost(40000)\\n returns (\\n bytes32 _value\\n )\\n {\\n // We always SLOAD from the storage of ADDRESS.\\n address contractAddress = ovmADDRESS();\\n\\n return _getContractStorage(\\n contractAddress,\\n _key\\n );\\n }\\n\\n /**\\n * @notice Overrides SSTORE.\\n * @param _key 32 byte key of the storage slot to set.\\n * @param _value 32 byte value for the storage slot.\\n */\\n function ovmSSTORE(\\n bytes32 _key,\\n bytes32 _value\\n )\\n override\\n public\\n notStatic\\n netGasCost(60000)\\n {\\n // We always SSTORE to the storage of ADDRESS.\\n address contractAddress = ovmADDRESS();\\n\\n _putContractStorage(\\n contractAddress,\\n _key,\\n _value\\n );\\n }\\n\\n\\n /*********************************\\n * Opcodes: Contract Code Access *\\n *********************************/\\n\\n /**\\n * @notice Overrides EXTCODECOPY.\\n * @param _contract Address of the contract to copy code from.\\n * @param _offset Offset in bytes from the start of contract code to copy beyond.\\n * @param _length Total number of bytes to copy from the contract's code.\\n * @return _code Bytes of code copied from the requested contract.\\n */\\n function ovmEXTCODECOPY(\\n address _contract,\\n uint256 _offset,\\n uint256 _length\\n )\\n override\\n public\\n returns (\\n bytes memory _code\\n )\\n {\\n return Lib_EthUtils.getCode(\\n _getAccountEthAddress(_contract),\\n _offset,\\n _length\\n );\\n }\\n\\n /**\\n * @notice Overrides EXTCODESIZE.\\n * @param _contract Address of the contract to query the size of.\\n * @return _EXTCODESIZE Size of the requested contract in bytes.\\n */\\n function ovmEXTCODESIZE(\\n address _contract\\n )\\n override\\n public\\n returns (\\n uint256 _EXTCODESIZE\\n )\\n {\\n return Lib_EthUtils.getCodeSize(\\n _getAccountEthAddress(_contract)\\n );\\n }\\n\\n /**\\n * @notice Overrides EXTCODEHASH.\\n * @param _contract Address of the contract to query the hash of.\\n * @return _EXTCODEHASH Hash of the requested contract.\\n */\\n function ovmEXTCODEHASH(\\n address _contract\\n )\\n override\\n public\\n returns (\\n bytes32 _EXTCODEHASH\\n )\\n {\\n return Lib_EthUtils.getCodeHash(\\n _getAccountEthAddress(_contract)\\n );\\n }\\n\\n /***************************************\\n * Public Functions: Execution Context *\\n ***************************************/\\n\\n function getMaxTransactionGasLimit()\\n external\\n view\\n override\\n returns (\\n uint256 _maxTransactionGasLimit\\n )\\n {\\n return gasMeterConfig.maxTransactionGasLimit;\\n }\\n\\n /********************************************\\n * Public Functions: Deployment Whitelisting *\\n ********************************************/\\n\\n /**\\n * Checks whether the given address is on the whitelist to ovmCREATE/ovmCREATE2, and reverts if not.\\n * @param _deployerAddress Address attempting to deploy a contract.\\n */\\n function _checkDeployerAllowed(\\n address _deployerAddress\\n )\\n internal\\n {\\n // From an OVM semantics perspective, this will appear identical to\\n // the deployer ovmCALLing the whitelist. This is fine--in a sense, we are forcing them to.\\n (bool success, bytes memory data) = ovmCALL(\\n gasleft(),\\n 0x4200000000000000000000000000000000000002,\\n abi.encodeWithSignature(\\\"isDeployerAllowed(address)\\\", _deployerAddress)\\n );\\n bool isAllowed = abi.decode(data, (bool));\\n\\n if (!isAllowed || !success) {\\n _revertWithFlag(RevertFlag.CREATOR_NOT_ALLOWED);\\n }\\n }\\n\\n /********************************************\\n * Internal Functions: Contract Interaction *\\n ********************************************/\\n\\n /**\\n * Creates a new contract and associates it with some contract address.\\n * @param _contractAddress Address to associate the created contract with.\\n * @param _bytecode Bytecode to be used to create the contract.\\n * @return Final OVM contract address.\\n * @return Revertdata, if and only if the creation threw an exception.\\n */\\n function _createContract(\\n address _contractAddress,\\n bytes memory _bytecode\\n )\\n internal\\n returns (\\n address,\\n bytes memory\\n )\\n {\\n // We always update the nonce of the creating account, even if the creation fails.\\n _setAccountNonce(ovmADDRESS(), _getAccountNonce(ovmADDRESS()) + 1);\\n\\n // We're stepping into a CREATE or CREATE2, so we need to update ADDRESS to point\\n // to the contract's associated address and CALLER to point to the previous ADDRESS.\\n MessageContext memory nextMessageContext = messageContext;\\n nextMessageContext.ovmCALLER = messageContext.ovmADDRESS;\\n nextMessageContext.ovmADDRESS = _contractAddress;\\n\\n // Run the common logic which occurs between call-type and create-type messages,\\n // passing in the creation bytecode and `true` to trigger create-specific logic.\\n (bool success, bytes memory data) = _handleExternalMessage(\\n nextMessageContext,\\n gasleft(),\\n _contractAddress,\\n _bytecode,\\n true\\n );\\n\\n // Yellow paper requires that address returned is zero if the contract deployment fails.\\n return (\\n success ? _contractAddress : address(0),\\n data\\n );\\n }\\n\\n /**\\n * Calls the deployed contract associated with a given address.\\n * @param _nextMessageContext Message context to be used for the call.\\n * @param _gasLimit Amount of gas to be passed into this call.\\n * @param _contract OVM address to be called.\\n * @param _calldata Data to send along with the call.\\n * @return _success Whether or not the call returned (rather than reverted).\\n * @return _returndata Data returned by the call.\\n */\\n function _callContract(\\n MessageContext memory _nextMessageContext,\\n uint256 _gasLimit,\\n address _contract,\\n bytes memory _calldata\\n )\\n internal\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n // We reserve addresses of the form 0xdeaddeaddead...NNNN for the container contracts in L2 geth.\\n // So, we block calls to these addresses since they are not safe to run as an OVM contract itself.\\n if (\\n (uint256(_contract) & uint256(0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000))\\n == uint256(0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000)\\n ) {\\n // EVM does not return data in the success case, see: https://github.com/ethereum/go-ethereum/blob/aae7660410f0ef90279e14afaaf2f429fdc2a186/core/vm/instructions.go#L600-L604\\n return (true, hex'');\\n }\\n\\n // Both 0x0000... and the EVM precompiles have the same address on L1 and L2 --> no trie lookup needed.\\n address codeContractAddress =\\n uint(_contract) < 100\\n ? _contract\\n : _getAccountEthAddress(_contract);\\n\\n return _handleExternalMessage(\\n _nextMessageContext,\\n _gasLimit,\\n codeContractAddress,\\n _calldata,\\n false\\n );\\n }\\n\\n /**\\n * Handles all interactions which involve the execution manager calling out to untrusted code (both calls and creates).\\n * Ensures that OVM-related measures are enforced, including L2 gas refunds, nuisance gas, and flagged reversions.\\n *\\n * @param _nextMessageContext Message context to be used for the external message.\\n * @param _gasLimit Amount of gas to be passed into this message.\\n * @param _contract OVM address being called or deployed to\\n * @param _data Data for the message (either calldata or creation code)\\n * @param _isCreate Whether this is a create-type message.\\n * @return Whether or not the message (either a call or deployment) succeeded.\\n * @return Data returned by the message.\\n */\\n function _handleExternalMessage(\\n MessageContext memory _nextMessageContext,\\n uint256 _gasLimit,\\n address _contract,\\n bytes memory _data,\\n bool _isCreate\\n )\\n internal\\n returns (\\n bool,\\n bytes memory\\n )\\n {\\n // We need to switch over to our next message context for the duration of this call.\\n MessageContext memory prevMessageContext = messageContext;\\n _switchMessageContext(prevMessageContext, _nextMessageContext);\\n\\n // Nuisance gas is a system used to bound the ability for an attacker to make fraud proofs\\n // expensive by touching a lot of different accounts or storage slots. Since most contracts\\n // only use a few storage slots during any given transaction, this shouldn't be a limiting\\n // factor.\\n uint256 prevNuisanceGasLeft = messageRecord.nuisanceGasLeft;\\n uint256 nuisanceGasLimit = _getNuisanceGasLimit(_gasLimit);\\n messageRecord.nuisanceGasLeft = nuisanceGasLimit;\\n\\n // Make the call and make sure to pass in the gas limit. Another instance of hidden\\n // complexity. `_contract` is guaranteed to be a safe contract, meaning its return/revert\\n // behavior can be controlled. In particular, we enforce that flags are passed through\\n // revert data as to retrieve execution metadata that would normally be reverted out of\\n // existence.\\n\\n bool success;\\n bytes memory returndata;\\n if (_isCreate) {\\n // safeCREATE() is a function which replicates a CREATE message, but uses return values\\n // Which match that of CALL (i.e. bool, bytes). This allows many security checks to be\\n // to be shared between untrusted call and create call frames.\\n (success, returndata) = address(this).call(\\n abi.encodeWithSelector(\\n this.safeCREATE.selector,\\n _gasLimit,\\n _data,\\n _contract\\n )\\n );\\n } else {\\n (success, returndata) = _contract.call{gas: _gasLimit}(_data);\\n }\\n\\n // Switch back to the original message context now that we're out of the call.\\n _switchMessageContext(_nextMessageContext, prevMessageContext);\\n\\n // Assuming there were no reverts, the message record should be accurate here. We'll update\\n // this value in the case of a revert.\\n uint256 nuisanceGasLeft = messageRecord.nuisanceGasLeft;\\n\\n // Reverts at this point are completely OK, but we need to make a few updates based on the\\n // information passed through the revert.\\n if (success == false) {\\n (\\n RevertFlag flag,\\n uint256 nuisanceGasLeftPostRevert,\\n uint256 ovmGasRefund,\\n bytes memory returndataFromFlag\\n ) = _decodeRevertData(returndata);\\n\\n // INVALID_STATE_ACCESS is the only flag that triggers an immediate abort of the\\n // parent EVM message. This behavior is necessary because INVALID_STATE_ACCESS must\\n // halt any further transaction execution that could impact the execution result.\\n if (flag == RevertFlag.INVALID_STATE_ACCESS) {\\n _revertWithFlag(flag);\\n }\\n\\n // INTENTIONAL_REVERT, UNSAFE_BYTECODE, STATIC_VIOLATION, and CREATOR_NOT_ALLOWED aren't\\n // dependent on the input state, so we can just handle them like standard reverts. Our only change here\\n // is to record the gas refund reported by the call (enforced by safety checking).\\n if (\\n flag == RevertFlag.INTENTIONAL_REVERT\\n || flag == RevertFlag.UNSAFE_BYTECODE\\n || flag == RevertFlag.STATIC_VIOLATION\\n || flag == RevertFlag.CREATOR_NOT_ALLOWED\\n ) {\\n transactionRecord.ovmGasRefund = ovmGasRefund;\\n }\\n\\n // INTENTIONAL_REVERT needs to pass up the user-provided return data encoded into the\\n // flag, *not* the full encoded flag. All other revert types return no data.\\n if (\\n flag == RevertFlag.INTENTIONAL_REVERT\\n || _isCreate\\n ) {\\n returndata = returndataFromFlag;\\n } else {\\n returndata = hex'';\\n }\\n\\n // Reverts mean we need to use up whatever \\\"nuisance gas\\\" was used by the call.\\n // EXCEEDS_NUISANCE_GAS explicitly reduces the remaining nuisance gas for this message\\n // to zero. OUT_OF_GAS is a \\\"pseudo\\\" flag given that messages return no data when they\\n // run out of gas, so we have to treat this like EXCEEDS_NUISANCE_GAS. All other flags\\n // will simply pass up the remaining nuisance gas.\\n nuisanceGasLeft = nuisanceGasLeftPostRevert;\\n }\\n\\n // We need to reset the nuisance gas back to its original value minus the amount used here.\\n messageRecord.nuisanceGasLeft = prevNuisanceGasLeft - (nuisanceGasLimit - nuisanceGasLeft);\\n\\n return (\\n success,\\n returndata\\n );\\n }\\n\\n /**\\n * Handles the creation-specific safety measures required for OVM contract deployment.\\n * This function sanitizes the return types for creation messages to match calls (bool, bytes),\\n * by being an external function which the EM can call, that mimics the success/fail case of the CREATE.\\n * This allows for consistent handling of both types of messages in _handleExternalMessage().\\n * Having this step occur as a separate call frame also allows us to easily revert the\\n * contract deployment in the event that the code is unsafe.\\n *\\n * @param _gasLimit Amount of gas to be passed into this creation.\\n * @param _creationCode Code to pass into CREATE for deployment.\\n * @param _address OVM address being deployed to.\\n */\\n function safeCREATE(\\n uint _gasLimit,\\n bytes memory _creationCode,\\n address _address\\n )\\n external\\n {\\n // The only way this should callable is from within _createContract(),\\n // and it should DEFINITELY not be callable by a non-EM code contract.\\n if (msg.sender != address(this)) {\\n return;\\n }\\n // Check that there is not already code at this address.\\n if (_hasEmptyAccount(_address) == false) {\\n // Note: in the EVM, this case burns all allotted gas. For improved\\n // developer experience, we do return the remaining gas.\\n _revertWithFlag(\\n RevertFlag.CREATE_COLLISION,\\n Lib_ErrorUtils.encodeRevertString(\\\"A contract has already been deployed to this address\\\")\\n );\\n }\\n\\n // Check the creation bytecode against the OVM_SafetyChecker.\\n if (ovmSafetyChecker.isBytecodeSafe(_creationCode) == false) {\\n _revertWithFlag(\\n RevertFlag.UNSAFE_BYTECODE,\\n Lib_ErrorUtils.encodeRevertString(\\\"Contract creation code contains unsafe opcodes. Did you use the right compiler or pass an unsafe constructor argument?\\\")\\n );\\n }\\n\\n // We always need to initialize the contract with the default account values.\\n _initPendingAccount(_address);\\n\\n // Actually execute the EVM create message.\\n // NOTE: The inline assembly below means we can NOT make any evm calls between here and then.\\n address ethAddress = Lib_EthUtils.createContract(_creationCode);\\n\\n if (ethAddress == address(0)) {\\n // If the creation fails, the EVM lets us grab its revert data. This may contain a revert flag\\n // to be used above in _handleExternalMessage, so we pass the revert data back up unmodified.\\n assembly {\\n returndatacopy(0,0,returndatasize())\\n revert(0, returndatasize())\\n }\\n }\\n\\n // Again simply checking that the deployed code is safe too. Contracts can generate\\n // arbitrary deployment code, so there's no easy way to analyze this beforehand.\\n bytes memory deployedCode = Lib_EthUtils.getCode(ethAddress);\\n if (ovmSafetyChecker.isBytecodeSafe(deployedCode) == false) {\\n _revertWithFlag(\\n RevertFlag.UNSAFE_BYTECODE,\\n Lib_ErrorUtils.encodeRevertString(\\\"Constructor attempted to deploy unsafe bytecode.\\\")\\n );\\n }\\n\\n // Contract creation didn't need to be reverted and the bytecode is safe. We finish up by\\n // associating the desired address with the newly created contract's code hash and address.\\n _commitPendingAccount(\\n _address,\\n ethAddress,\\n Lib_EthUtils.getCodeHash(ethAddress)\\n );\\n }\\n\\n /******************************************\\n * Internal Functions: State Manipulation *\\n ******************************************/\\n\\n /**\\n * Checks whether an account exists within the OVM_StateManager.\\n * @param _address Address of the account to check.\\n * @return _exists Whether or not the account exists.\\n */\\n function _hasAccount(\\n address _address\\n )\\n internal\\n returns (\\n bool _exists\\n )\\n {\\n _checkAccountLoad(_address);\\n return ovmStateManager.hasAccount(_address);\\n }\\n\\n /**\\n * Checks whether a known empty account exists within the OVM_StateManager.\\n * @param _address Address of the account to check.\\n * @return _exists Whether or not the account empty exists.\\n */\\n function _hasEmptyAccount(\\n address _address\\n )\\n internal\\n returns (\\n bool _exists\\n )\\n {\\n _checkAccountLoad(_address);\\n return ovmStateManager.hasEmptyAccount(_address);\\n }\\n\\n /**\\n * Sets the nonce of an account.\\n * @param _address Address of the account to modify.\\n * @param _nonce New account nonce.\\n */\\n function _setAccountNonce(\\n address _address,\\n uint256 _nonce\\n )\\n internal\\n {\\n _checkAccountChange(_address);\\n ovmStateManager.setAccountNonce(_address, _nonce);\\n }\\n\\n /**\\n * Gets the nonce of an account.\\n * @param _address Address of the account to access.\\n * @return _nonce Nonce of the account.\\n */\\n function _getAccountNonce(\\n address _address\\n )\\n internal\\n returns (\\n uint256 _nonce\\n )\\n {\\n _checkAccountLoad(_address);\\n return ovmStateManager.getAccountNonce(_address);\\n }\\n\\n /**\\n * Retrieves the Ethereum address of an account.\\n * @param _address Address of the account to access.\\n * @return _ethAddress Corresponding Ethereum address.\\n */\\n function _getAccountEthAddress(\\n address _address\\n )\\n internal\\n returns (\\n address _ethAddress\\n )\\n {\\n _checkAccountLoad(_address);\\n return ovmStateManager.getAccountEthAddress(_address);\\n }\\n\\n /**\\n * Creates the default account object for the given address.\\n * @param _address Address of the account create.\\n */\\n function _initPendingAccount(\\n address _address\\n )\\n internal\\n {\\n // Although it seems like `_checkAccountChange` would be more appropriate here, we don't\\n // actually consider an account \\\"changed\\\" until it's inserted into the state (in this case\\n // by `_commitPendingAccount`).\\n _checkAccountLoad(_address);\\n ovmStateManager.initPendingAccount(_address);\\n }\\n\\n /**\\n * Stores additional relevant data for a new account, thereby \\\"committing\\\" it to the state.\\n * This function is only called during `ovmCREATE` and `ovmCREATE2` after a successful contract\\n * creation.\\n * @param _address Address of the account to commit.\\n * @param _ethAddress Address of the associated deployed contract.\\n * @param _codeHash Hash of the code stored at the address.\\n */\\n function _commitPendingAccount(\\n address _address,\\n address _ethAddress,\\n bytes32 _codeHash\\n )\\n internal\\n {\\n _checkAccountChange(_address);\\n ovmStateManager.commitPendingAccount(\\n _address,\\n _ethAddress,\\n _codeHash\\n );\\n }\\n\\n /**\\n * Retrieves the value of a storage slot.\\n * @param _contract Address of the contract to query.\\n * @param _key 32 byte key of the storage slot.\\n * @return _value 32 byte storage slot value.\\n */\\n function _getContractStorage(\\n address _contract,\\n bytes32 _key\\n )\\n internal\\n returns (\\n bytes32 _value\\n )\\n {\\n _checkContractStorageLoad(_contract, _key);\\n return ovmStateManager.getContractStorage(_contract, _key);\\n }\\n\\n /**\\n * Sets the value of a storage slot.\\n * @param _contract Address of the contract to modify.\\n * @param _key 32 byte key of the storage slot.\\n * @param _value 32 byte storage slot value.\\n */\\n function _putContractStorage(\\n address _contract,\\n bytes32 _key,\\n bytes32 _value\\n )\\n internal\\n {\\n // We don't set storage if the value didn't change. Although this acts as a convenient\\n // optimization, it's also necessary to avoid the case in which a contract with no storage\\n // attempts to store the value \\\"0\\\" at any key. Putting this value (and therefore requiring\\n // that the value be committed into the storage trie after execution) would incorrectly\\n // modify the storage root.\\n if (_getContractStorage(_contract, _key) == _value) {\\n return;\\n }\\n\\n _checkContractStorageChange(_contract, _key);\\n ovmStateManager.putContractStorage(_contract, _key, _value);\\n }\\n\\n /**\\n * Validation whenever a contract needs to be loaded. Checks that the account exists, charges\\n * nuisance gas if the account hasn't been loaded before.\\n * @param _address Address of the account to load.\\n */\\n function _checkAccountLoad(\\n address _address\\n )\\n internal\\n {\\n // See `_checkContractStorageLoad` for more information.\\n if (gasleft() < MIN_GAS_FOR_INVALID_STATE_ACCESS) {\\n _revertWithFlag(RevertFlag.OUT_OF_GAS);\\n }\\n\\n // See `_checkContractStorageLoad` for more information.\\n if (ovmStateManager.hasAccount(_address) == false) {\\n _revertWithFlag(RevertFlag.INVALID_STATE_ACCESS);\\n }\\n\\n // Check whether the account has been loaded before and mark it as loaded if not. We need\\n // this because \\\"nuisance gas\\\" only applies to the first time that an account is loaded.\\n (\\n bool _wasAccountAlreadyLoaded\\n ) = ovmStateManager.testAndSetAccountLoaded(_address);\\n\\n // If we hadn't already loaded the account, then we'll need to charge \\\"nuisance gas\\\" based\\n // on the size of the contract code.\\n if (_wasAccountAlreadyLoaded == false) {\\n _useNuisanceGas(\\n (Lib_EthUtils.getCodeSize(_getAccountEthAddress(_address)) * NUISANCE_GAS_PER_CONTRACT_BYTE) + MIN_NUISANCE_GAS_PER_CONTRACT\\n );\\n }\\n }\\n\\n /**\\n * Validation whenever a contract needs to be changed. Checks that the account exists, charges\\n * nuisance gas if the account hasn't been changed before.\\n * @param _address Address of the account to change.\\n */\\n function _checkAccountChange(\\n address _address\\n )\\n internal\\n {\\n // Start by checking for a load as we only want to charge nuisance gas proportional to\\n // contract size once.\\n _checkAccountLoad(_address);\\n\\n // Check whether the account has been changed before and mark it as changed if not. We need\\n // this because \\\"nuisance gas\\\" only applies to the first time that an account is changed.\\n (\\n bool _wasAccountAlreadyChanged\\n ) = ovmStateManager.testAndSetAccountChanged(_address);\\n\\n // If we hadn't already loaded the account, then we'll need to charge \\\"nuisance gas\\\" based\\n // on the size of the contract code.\\n if (_wasAccountAlreadyChanged == false) {\\n ovmStateManager.incrementTotalUncommittedAccounts();\\n _useNuisanceGas(\\n (Lib_EthUtils.getCodeSize(_getAccountEthAddress(_address)) * NUISANCE_GAS_PER_CONTRACT_BYTE) + MIN_NUISANCE_GAS_PER_CONTRACT\\n );\\n }\\n }\\n\\n /**\\n * Validation whenever a slot needs to be loaded. Checks that the account exists, charges\\n * nuisance gas if the slot hasn't been loaded before.\\n * @param _contract Address of the account to load from.\\n * @param _key 32 byte key to load.\\n */\\n function _checkContractStorageLoad(\\n address _contract,\\n bytes32 _key\\n )\\n internal\\n {\\n // Another case of hidden complexity. If we didn't enforce this requirement, then a\\n // contract could pass in just enough gas to cause the INVALID_STATE_ACCESS check to fail\\n // on L1 but not on L2. A contract could use this behavior to prevent the\\n // OVM_ExecutionManager from detecting an invalid state access. Reverting with OUT_OF_GAS\\n // allows us to also charge for the full message nuisance gas, because you deserve that for\\n // trying to break the contract in this way.\\n if (gasleft() < MIN_GAS_FOR_INVALID_STATE_ACCESS) {\\n _revertWithFlag(RevertFlag.OUT_OF_GAS);\\n }\\n\\n // We need to make sure that the transaction isn't trying to access storage that hasn't\\n // been provided to the OVM_StateManager. We'll immediately abort if this is the case.\\n // We know that we have enough gas to do this check because of the above test.\\n if (ovmStateManager.hasContractStorage(_contract, _key) == false) {\\n _revertWithFlag(RevertFlag.INVALID_STATE_ACCESS);\\n }\\n\\n // Check whether the slot has been loaded before and mark it as loaded if not. We need\\n // this because \\\"nuisance gas\\\" only applies to the first time that a slot is loaded.\\n (\\n bool _wasContractStorageAlreadyLoaded\\n ) = ovmStateManager.testAndSetContractStorageLoaded(_contract, _key);\\n\\n // If we hadn't already loaded the account, then we'll need to charge some fixed amount of\\n // \\\"nuisance gas\\\".\\n if (_wasContractStorageAlreadyLoaded == false) {\\n _useNuisanceGas(NUISANCE_GAS_SLOAD);\\n }\\n }\\n\\n /**\\n * Validation whenever a slot needs to be changed. Checks that the account exists, charges\\n * nuisance gas if the slot hasn't been changed before.\\n * @param _contract Address of the account to change.\\n * @param _key 32 byte key to change.\\n */\\n function _checkContractStorageChange(\\n address _contract,\\n bytes32 _key\\n )\\n internal\\n {\\n // Start by checking for load to make sure we have the storage slot and that we charge the\\n // \\\"nuisance gas\\\" necessary to prove the storage slot state.\\n _checkContractStorageLoad(_contract, _key);\\n\\n // Check whether the slot has been changed before and mark it as changed if not. We need\\n // this because \\\"nuisance gas\\\" only applies to the first time that a slot is changed.\\n (\\n bool _wasContractStorageAlreadyChanged\\n ) = ovmStateManager.testAndSetContractStorageChanged(_contract, _key);\\n\\n // If we hadn't already changed the account, then we'll need to charge some fixed amount of\\n // \\\"nuisance gas\\\".\\n if (_wasContractStorageAlreadyChanged == false) {\\n // Changing a storage slot means that we're also going to have to change the\\n // corresponding account, so do an account change check.\\n _checkAccountChange(_contract);\\n\\n ovmStateManager.incrementTotalUncommittedContractStorage();\\n _useNuisanceGas(NUISANCE_GAS_SSTORE);\\n }\\n }\\n\\n\\n /************************************\\n * Internal Functions: Revert Logic *\\n ************************************/\\n\\n /**\\n * Simple encoding for revert data.\\n * @param _flag Flag to revert with.\\n * @param _data Additional user-provided revert data.\\n * @return _revertdata Encoded revert data.\\n */\\n function _encodeRevertData(\\n RevertFlag _flag,\\n bytes memory _data\\n )\\n internal\\n view\\n returns (\\n bytes memory _revertdata\\n )\\n {\\n // Out of gas and create exceptions will fundamentally return no data, so simulating it shouldn't either.\\n if (\\n _flag == RevertFlag.OUT_OF_GAS\\n ) {\\n return bytes('');\\n }\\n\\n // INVALID_STATE_ACCESS doesn't need to return any data other than the flag.\\n if (_flag == RevertFlag.INVALID_STATE_ACCESS) {\\n return abi.encode(\\n _flag,\\n 0,\\n 0,\\n bytes('')\\n );\\n }\\n\\n // Just ABI encode the rest of the parameters.\\n return abi.encode(\\n _flag,\\n messageRecord.nuisanceGasLeft,\\n transactionRecord.ovmGasRefund,\\n _data\\n );\\n }\\n\\n /**\\n * Simple decoding for revert data.\\n * @param _revertdata Revert data to decode.\\n * @return _flag Flag used to revert.\\n * @return _nuisanceGasLeft Amount of nuisance gas unused by the message.\\n * @return _ovmGasRefund Amount of gas refunded during the message.\\n * @return _data Additional user-provided revert data.\\n */\\n function _decodeRevertData(\\n bytes memory _revertdata\\n )\\n internal\\n pure\\n returns (\\n RevertFlag _flag,\\n uint256 _nuisanceGasLeft,\\n uint256 _ovmGasRefund,\\n bytes memory _data\\n )\\n {\\n // A length of zero means the call ran out of gas, just return empty data.\\n if (_revertdata.length == 0) {\\n return (\\n RevertFlag.OUT_OF_GAS,\\n 0,\\n 0,\\n bytes('')\\n );\\n }\\n\\n // ABI decode the incoming data.\\n return abi.decode(_revertdata, (RevertFlag, uint256, uint256, bytes));\\n }\\n\\n /**\\n * Causes a message to revert or abort.\\n * @param _flag Flag to revert with.\\n * @param _data Additional user-provided data.\\n */\\n function _revertWithFlag(\\n RevertFlag _flag,\\n bytes memory _data\\n )\\n internal\\n view\\n {\\n bytes memory revertdata = _encodeRevertData(\\n _flag,\\n _data\\n );\\n\\n assembly {\\n revert(add(revertdata, 0x20), mload(revertdata))\\n }\\n }\\n\\n /**\\n * Causes a message to revert or abort.\\n * @param _flag Flag to revert with.\\n */\\n function _revertWithFlag(\\n RevertFlag _flag\\n )\\n internal\\n {\\n _revertWithFlag(_flag, bytes(''));\\n }\\n\\n\\n /******************************************\\n * Internal Functions: Nuisance Gas Logic *\\n ******************************************/\\n\\n /**\\n * Computes the nuisance gas limit from the gas limit.\\n * @dev This function is currently using a naive implementation whereby the nuisance gas limit\\n * is set to exactly equal the lesser of the gas limit or remaining gas. It's likely that\\n * this implementation is perfectly fine, but we may change this formula later.\\n * @param _gasLimit Gas limit to compute from.\\n * @return _nuisanceGasLimit Computed nuisance gas limit.\\n */\\n function _getNuisanceGasLimit(\\n uint256 _gasLimit\\n )\\n internal\\n view\\n returns (\\n uint256 _nuisanceGasLimit\\n )\\n {\\n return _gasLimit < gasleft() ? _gasLimit : gasleft();\\n }\\n\\n /**\\n * Uses a certain amount of nuisance gas.\\n * @param _amount Amount of nuisance gas to use.\\n */\\n function _useNuisanceGas(\\n uint256 _amount\\n )\\n internal\\n {\\n // Essentially the same as a standard OUT_OF_GAS, except we also retain a record of the gas\\n // refund to be given at the end of the transaction.\\n if (messageRecord.nuisanceGasLeft < _amount) {\\n _revertWithFlag(RevertFlag.EXCEEDS_NUISANCE_GAS);\\n }\\n\\n messageRecord.nuisanceGasLeft -= _amount;\\n }\\n\\n\\n /************************************\\n * Internal Functions: Gas Metering *\\n ************************************/\\n\\n /**\\n * Checks whether a transaction needs to start a new epoch and does so if necessary.\\n * @param _timestamp Transaction timestamp.\\n */\\n function _checkNeedsNewEpoch(\\n uint256 _timestamp\\n )\\n internal\\n {\\n if (\\n _timestamp >= (\\n _getGasMetadata(GasMetadataKey.CURRENT_EPOCH_START_TIMESTAMP)\\n + gasMeterConfig.secondsPerEpoch\\n )\\n ) {\\n _putGasMetadata(\\n GasMetadataKey.CURRENT_EPOCH_START_TIMESTAMP,\\n _timestamp\\n );\\n\\n _putGasMetadata(\\n GasMetadataKey.PREV_EPOCH_SEQUENCER_QUEUE_GAS,\\n _getGasMetadata(\\n GasMetadataKey.CUMULATIVE_SEQUENCER_QUEUE_GAS\\n )\\n );\\n\\n _putGasMetadata(\\n GasMetadataKey.PREV_EPOCH_L1TOL2_QUEUE_GAS,\\n _getGasMetadata(\\n GasMetadataKey.CUMULATIVE_L1TOL2_QUEUE_GAS\\n )\\n );\\n }\\n }\\n\\n /**\\n * Validates the input values of a transaction.\\n * @return _valid Whether or not the transaction data is valid.\\n */\\n function _isValidInput(\\n Lib_OVMCodec.Transaction memory _transaction\\n )\\n view\\n internal\\n returns (\\n bool\\n )\\n {\\n // Prevent reentrancy to run():\\n // This check prevents calling run with the default ovmNumber.\\n // Combined with the first check in run():\\n // if (transactionContext.ovmNUMBER != DEFAULT_UINT256) { return; }\\n // It should be impossible to re-enter since run() returns before any other call frames are created.\\n // Since this value is already being written to storage, we save much gas compared to\\n // using the standard nonReentrant pattern.\\n if (_transaction.blockNumber == DEFAULT_UINT256) {\\n return false;\\n }\\n\\n if (_isValidGasLimit(_transaction.gasLimit, _transaction.l1QueueOrigin) == false) {\\n return false;\\n }\\n\\n return true;\\n }\\n\\n /**\\n * Validates the gas limit for a given transaction.\\n * @param _gasLimit Gas limit provided by the transaction.\\n * param _queueOrigin Queue from which the transaction originated.\\n * @return _valid Whether or not the gas limit is valid.\\n */\\n function _isValidGasLimit(\\n uint256 _gasLimit,\\n Lib_OVMCodec.QueueOrigin // _queueOrigin\\n )\\n view\\n internal\\n returns (\\n bool _valid\\n )\\n {\\n // Always have to be below the maximum gas limit.\\n if (_gasLimit > gasMeterConfig.maxTransactionGasLimit) {\\n return false;\\n }\\n\\n // Always have to be above the minimum gas limit.\\n if (_gasLimit < gasMeterConfig.minTransactionGasLimit) {\\n return false;\\n }\\n\\n // TEMPORARY: Gas metering is disabled for minnet.\\n return true;\\n // GasMetadataKey cumulativeGasKey;\\n // GasMetadataKey prevEpochGasKey;\\n // if (_queueOrigin == Lib_OVMCodec.QueueOrigin.SEQUENCER_QUEUE) {\\n // cumulativeGasKey = GasMetadataKey.CUMULATIVE_SEQUENCER_QUEUE_GAS;\\n // prevEpochGasKey = GasMetadataKey.PREV_EPOCH_SEQUENCER_QUEUE_GAS;\\n // } else {\\n // cumulativeGasKey = GasMetadataKey.CUMULATIVE_L1TOL2_QUEUE_GAS;\\n // prevEpochGasKey = GasMetadataKey.PREV_EPOCH_L1TOL2_QUEUE_GAS;\\n // }\\n\\n // return (\\n // (\\n // _getGasMetadata(cumulativeGasKey)\\n // - _getGasMetadata(prevEpochGasKey)\\n // + _gasLimit\\n // ) < gasMeterConfig.maxGasPerQueuePerEpoch\\n // );\\n }\\n\\n /**\\n * Updates the cumulative gas after a transaction.\\n * @param _gasUsed Gas used by the transaction.\\n * @param _queueOrigin Queue from which the transaction originated.\\n */\\n function _updateCumulativeGas(\\n uint256 _gasUsed,\\n Lib_OVMCodec.QueueOrigin _queueOrigin\\n )\\n internal\\n {\\n GasMetadataKey cumulativeGasKey;\\n if (_queueOrigin == Lib_OVMCodec.QueueOrigin.SEQUENCER_QUEUE) {\\n cumulativeGasKey = GasMetadataKey.CUMULATIVE_SEQUENCER_QUEUE_GAS;\\n } else {\\n cumulativeGasKey = GasMetadataKey.CUMULATIVE_L1TOL2_QUEUE_GAS;\\n }\\n\\n _putGasMetadata(\\n cumulativeGasKey,\\n (\\n _getGasMetadata(cumulativeGasKey)\\n + gasMeterConfig.minTransactionGasLimit\\n + _gasUsed\\n - transactionRecord.ovmGasRefund\\n )\\n );\\n }\\n\\n /**\\n * Retrieves the value of a gas metadata key.\\n * @param _key Gas metadata key to retrieve.\\n * @return _value Value stored at the given key.\\n */\\n function _getGasMetadata(\\n GasMetadataKey _key\\n )\\n internal\\n returns (\\n uint256 _value\\n )\\n {\\n return uint256(_getContractStorage(\\n GAS_METADATA_ADDRESS,\\n bytes32(uint256(_key))\\n ));\\n }\\n\\n /**\\n * Sets the value of a gas metadata key.\\n * @param _key Gas metadata key to set.\\n * @param _value Value to store at the given key.\\n */\\n function _putGasMetadata(\\n GasMetadataKey _key,\\n uint256 _value\\n )\\n internal\\n {\\n _putContractStorage(\\n GAS_METADATA_ADDRESS,\\n bytes32(uint256(_key)),\\n bytes32(uint256(_value))\\n );\\n }\\n\\n\\n /*****************************************\\n * Internal Functions: Execution Context *\\n *****************************************/\\n\\n /**\\n * Swaps over to a new message context.\\n * @param _prevMessageContext Context we're switching from.\\n * @param _nextMessageContext Context we're switching to.\\n */\\n function _switchMessageContext(\\n MessageContext memory _prevMessageContext,\\n MessageContext memory _nextMessageContext\\n )\\n internal\\n {\\n // Avoid unnecessary the SSTORE.\\n if (_prevMessageContext.ovmCALLER != _nextMessageContext.ovmCALLER) {\\n messageContext.ovmCALLER = _nextMessageContext.ovmCALLER;\\n }\\n\\n // Avoid unnecessary the SSTORE.\\n if (_prevMessageContext.ovmADDRESS != _nextMessageContext.ovmADDRESS) {\\n messageContext.ovmADDRESS = _nextMessageContext.ovmADDRESS;\\n }\\n\\n // Avoid unnecessary the SSTORE.\\n if (_prevMessageContext.isStatic != _nextMessageContext.isStatic) {\\n messageContext.isStatic = _nextMessageContext.isStatic;\\n }\\n }\\n\\n /**\\n * Initializes the execution context.\\n * @param _transaction OVM transaction being executed.\\n */\\n function _initContext(\\n Lib_OVMCodec.Transaction memory _transaction\\n )\\n internal\\n {\\n transactionContext.ovmTIMESTAMP = _transaction.timestamp;\\n transactionContext.ovmNUMBER = _transaction.blockNumber;\\n transactionContext.ovmTXGASLIMIT = _transaction.gasLimit;\\n transactionContext.ovmL1QUEUEORIGIN = _transaction.l1QueueOrigin;\\n transactionContext.ovmL1TXORIGIN = _transaction.l1TxOrigin;\\n transactionContext.ovmGASLIMIT = gasMeterConfig.maxGasPerQueuePerEpoch;\\n\\n messageRecord.nuisanceGasLeft = _getNuisanceGasLimit(_transaction.gasLimit);\\n }\\n\\n /**\\n * Resets the transaction and message context.\\n */\\n function _resetContext()\\n internal\\n {\\n transactionContext.ovmL1TXORIGIN = DEFAULT_ADDRESS;\\n transactionContext.ovmTIMESTAMP = DEFAULT_UINT256;\\n transactionContext.ovmNUMBER = DEFAULT_UINT256;\\n transactionContext.ovmGASLIMIT = DEFAULT_UINT256;\\n transactionContext.ovmTXGASLIMIT = DEFAULT_UINT256;\\n transactionContext.ovmL1QUEUEORIGIN = Lib_OVMCodec.QueueOrigin.SEQUENCER_QUEUE;\\n\\n transactionRecord.ovmGasRefund = DEFAULT_UINT256;\\n\\n messageContext.ovmCALLER = DEFAULT_ADDRESS;\\n messageContext.ovmADDRESS = DEFAULT_ADDRESS;\\n messageContext.isStatic = false;\\n\\n messageRecord.nuisanceGasLeft = DEFAULT_UINT256;\\n\\n // Reset the ovmStateManager.\\n ovmStateManager = iOVM_StateManager(address(0));\\n }\\n\\n /*****************************\\n * L2-only Helper Functions *\\n *****************************/\\n\\n /**\\n * Unreachable helper function for simulating eth_calls with an OVM message context.\\n * This function will throw an exception in all cases other than when used as a custom entrypoint in L2 Geth to simulate eth_call.\\n * @param _transaction the message transaction to simulate.\\n * @param _from the OVM account the simulated call should be from.\\n */\\n function simulateMessage(\\n Lib_OVMCodec.Transaction memory _transaction,\\n address _from,\\n iOVM_StateManager _ovmStateManager\\n )\\n external\\n returns (\\n bool,\\n bytes memory\\n )\\n {\\n // Prevent this call from having any effect unless in a custom-set VM frame\\n require(msg.sender == address(0));\\n\\n ovmStateManager = _ovmStateManager;\\n _initContext(_transaction);\\n messageRecord.nuisanceGasLeft = uint(-1);\\n\\n messageContext.ovmADDRESS = _from;\\n\\n bool isCreate = _transaction.entrypoint == address(0);\\n if (isCreate) {\\n (address created, bytes memory revertData) = ovmCREATE(_transaction.data);\\n if (created == address(0)) {\\n return (false, revertData);\\n } else {\\n // The eth_call RPC endpoint for to = undefined will return the deployed bytecode\\n // in the success case, differing from standard create messages.\\n return (true, Lib_EthUtils.getCode(created));\\n }\\n } else {\\n return ovmCALL(\\n _transaction.gasLimit,\\n _transaction.entrypoint,\\n _transaction.data\\n );\\n }\\n }\\n}\\n\",\"keccak256\":\"0x229011db3d21b69e16814325f8e5debbdf6219b3dffb4011a24f2a6540a0d98e\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/predeploys/OVM_DeployerWhitelist.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Interface Imports */\\nimport { iOVM_DeployerWhitelist } from \\\"../../iOVM/predeploys/iOVM_DeployerWhitelist.sol\\\";\\n\\n/**\\n * @title OVM_DeployerWhitelist\\n * @dev The Deployer Whitelist is a temporary predeploy used to provide additional safety during the\\n * initial phases of our mainnet roll out. It is owned by the Optimism team, and defines accounts\\n * which are allowed to deploy contracts on Layer2. The Execution Manager will only allow an\\n * ovmCREATE or ovmCREATE2 operation to proceed if the deployer's address whitelisted.\\n *\\n * Compiler used: optimistic-solc\\n * Runtime target: OVM\\n */\\ncontract OVM_DeployerWhitelist is iOVM_DeployerWhitelist {\\n\\n /**********************\\n * Contract Constants *\\n **********************/\\n\\n bool public initialized;\\n bool public allowArbitraryDeployment;\\n address override public owner;\\n mapping (address => bool) public whitelist;\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n /**\\n * Blocks functions to anyone except the contract owner.\\n */\\n modifier onlyOwner() {\\n require(\\n msg.sender == owner,\\n \\\"Function can only be called by the owner of this contract.\\\"\\n );\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Initializes the whitelist.\\n * @param _owner Address of the owner for this contract.\\n * @param _allowArbitraryDeployment Whether or not to allow arbitrary contract deployment.\\n */\\n function initialize(\\n address _owner,\\n bool _allowArbitraryDeployment\\n )\\n override\\n public\\n {\\n if (initialized == true) {\\n return;\\n }\\n\\n initialized = true;\\n allowArbitraryDeployment = _allowArbitraryDeployment;\\n owner = _owner;\\n }\\n\\n /**\\n * Adds or removes an address from the deployment whitelist.\\n * @param _deployer Address to update permissions for.\\n * @param _isWhitelisted Whether or not the address is whitelisted.\\n */\\n function setWhitelistedDeployer(\\n address _deployer,\\n bool _isWhitelisted\\n )\\n override\\n public\\n onlyOwner\\n {\\n whitelist[_deployer] = _isWhitelisted;\\n }\\n\\n /**\\n * Updates the owner of this contract.\\n * @param _owner Address of the new owner.\\n */\\n function setOwner(\\n address _owner\\n )\\n override\\n public\\n onlyOwner\\n {\\n owner = _owner;\\n }\\n\\n /**\\n * Updates the arbitrary deployment flag.\\n * @param _allowArbitraryDeployment Whether or not to allow arbitrary contract deployment.\\n */\\n function setAllowArbitraryDeployment(\\n bool _allowArbitraryDeployment\\n )\\n override\\n public\\n onlyOwner\\n {\\n allowArbitraryDeployment = _allowArbitraryDeployment;\\n }\\n\\n /**\\n * Permanently enables arbitrary contract deployment and deletes the owner.\\n */\\n function enableArbitraryContractDeployment()\\n override\\n public\\n onlyOwner\\n {\\n setAllowArbitraryDeployment(true);\\n setOwner(address(0));\\n }\\n\\n /**\\n * Checks whether an address is allowed to deploy contracts.\\n * @param _deployer Address to check.\\n * @return _allowed Whether or not the address can deploy contracts.\\n */\\n function isDeployerAllowed(\\n address _deployer\\n )\\n override\\n public\\n returns (\\n bool\\n )\\n {\\n return (\\n initialized == false\\n || allowArbitraryDeployment == true\\n || whitelist[_deployer]\\n );\\n }\\n}\\n\",\"keccak256\":\"0x371e3d3ca1dd4177738b55eead9ad6f8278280e568694df6b42ee01f5558ccb2\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_CanonicalTransactionChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_ChainStorageContainer } from \\\"./iOVM_ChainStorageContainer.sol\\\";\\n\\n/**\\n * @title iOVM_CanonicalTransactionChain\\n */\\ninterface iOVM_CanonicalTransactionChain {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event TransactionEnqueued(\\n address _l1TxOrigin,\\n address _target,\\n uint256 _gasLimit,\\n bytes _data,\\n uint256 _queueIndex,\\n uint256 _timestamp\\n );\\n\\n event QueueBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event SequencerBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event TransactionBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct BatchContext {\\n uint256 numSequencedTransactions;\\n uint256 numSubsequentQueueTransactions;\\n uint256 timestamp;\\n uint256 blockNumber;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n\\n /**\\n * Accesses the batch storage container.\\n * @return Reference to the batch storage container.\\n */\\n function batches()\\n external\\n view\\n returns (\\n iOVM_ChainStorageContainer\\n );\\n\\n /**\\n * Accesses the queue storage container.\\n * @return Reference to the queue storage container.\\n */\\n function queue()\\n external\\n view\\n returns (\\n iOVM_ChainStorageContainer\\n );\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements()\\n external\\n view\\n returns (\\n uint256 _totalElements\\n );\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches()\\n external\\n view\\n returns (\\n uint256 _totalBatches\\n );\\n\\n /**\\n * Returns the index of the next element to be enqueued.\\n * @return Index for the next queue element.\\n */\\n function getNextQueueIndex()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Gets the queue element at a particular index.\\n * @param _index Index of the queue element to access.\\n * @return _element Queue element at the given index.\\n */\\n function getQueueElement(\\n uint256 _index\\n )\\n external\\n view\\n returns (\\n Lib_OVMCodec.QueueElement memory _element\\n );\\n\\n /**\\n * Returns the timestamp of the last transaction.\\n * @return Timestamp for the last transaction.\\n */\\n function getLastTimestamp()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Returns the blocknumber of the last transaction.\\n * @return Blocknumber for the last transaction.\\n */\\n function getLastBlockNumber()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Get the number of queue elements which have not yet been included.\\n * @return Number of pending queue elements.\\n */\\n function getNumPendingQueueElements()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Retrieves the length of the queue, including\\n * both pending and canonical transactions.\\n * @return Length of the queue.\\n */\\n function getQueueLength()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n\\n /**\\n * Adds a transaction to the queue.\\n * @param _target Target contract to send the transaction to.\\n * @param _gasLimit Gas limit for the given transaction.\\n * @param _data Transaction data.\\n */\\n function enqueue(\\n address _target,\\n uint256 _gasLimit,\\n bytes memory _data\\n )\\n external;\\n\\n /**\\n * Appends a given number of queued transactions as a single batch.\\n * @param _numQueuedTransactions Number of transactions to append.\\n */\\n function appendQueueBatch(\\n uint256 _numQueuedTransactions\\n )\\n external;\\n\\n /**\\n * Allows the sequencer to append a batch of transactions.\\n * @dev This function uses a custom encoding scheme for efficiency reasons.\\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\\n * .param _contexts Array of batch contexts.\\n * .param _transactionDataFields Array of raw transaction data.\\n */\\n function appendSequencerBatch(\\n // uint40 _shouldStartAtElement,\\n // uint24 _totalElementsToAppend,\\n // BatchContext[] _contexts,\\n // bytes[] _transactionDataFields\\n )\\n external;\\n\\n /**\\n * Verifies whether a transaction is included in the chain.\\n * @param _transaction Transaction to verify.\\n * @param _txChainElement Transaction chain element corresponding to the transaction.\\n * @param _batchHeader Header of the batch the transaction was included in.\\n * @param _inclusionProof Inclusion proof for the provided transaction chain element.\\n * @return True if the transaction exists in the CTC, false if not.\\n */\\n function verifyTransaction(\\n Lib_OVMCodec.Transaction memory _transaction,\\n Lib_OVMCodec.TransactionChainElement memory _txChainElement,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _inclusionProof\\n )\\n external\\n view\\n returns (\\n bool\\n );\\n}\\n\",\"keccak256\":\"0xb5e55488a1982841c07cdf5ff475da4789596f111dd48f01b1918ee4c775cf3a\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_ChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title iOVM_ChainStorageContainer\\n */\\ninterface iOVM_ChainStorageContainer {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata()\\n external\\n view\\n returns (\\n bytes27\\n );\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length()\\n external\\n view\\n returns (\\n uint256\\n );\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(\\n bytes32 _object\\n )\\n external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(\\n bytes32 _object,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(\\n uint256 _index\\n )\\n external\\n view\\n returns (\\n bytes32\\n );\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index\\n )\\n external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Marks an index as overwritable, meaing the underlying buffer can start to write values over\\n * any objects before and including the given index.\\n */\\n function setNextOverwritableIndex(\\n uint256 _index\\n )\\n external;\\n}\\n\",\"keccak256\":\"0x2d7973a0ad84c23ec62624d3f1e3aeb198cc72686ff1e6cfa17155556b320c94\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/execution/iOVM_ExecutionManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\ninterface iOVM_ExecutionManager {\\n /**********\\n * Enums *\\n *********/\\n\\n enum RevertFlag {\\n OUT_OF_GAS,\\n INTENTIONAL_REVERT,\\n EXCEEDS_NUISANCE_GAS,\\n INVALID_STATE_ACCESS,\\n UNSAFE_BYTECODE,\\n CREATE_COLLISION,\\n STATIC_VIOLATION,\\n CREATOR_NOT_ALLOWED\\n }\\n\\n enum GasMetadataKey {\\n CURRENT_EPOCH_START_TIMESTAMP,\\n CUMULATIVE_SEQUENCER_QUEUE_GAS,\\n CUMULATIVE_L1TOL2_QUEUE_GAS,\\n PREV_EPOCH_SEQUENCER_QUEUE_GAS,\\n PREV_EPOCH_L1TOL2_QUEUE_GAS\\n }\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct GasMeterConfig {\\n uint256 minTransactionGasLimit;\\n uint256 maxTransactionGasLimit;\\n uint256 maxGasPerQueuePerEpoch;\\n uint256 secondsPerEpoch;\\n }\\n\\n struct GlobalContext {\\n uint256 ovmCHAINID;\\n }\\n\\n struct TransactionContext {\\n Lib_OVMCodec.QueueOrigin ovmL1QUEUEORIGIN;\\n uint256 ovmTIMESTAMP;\\n uint256 ovmNUMBER;\\n uint256 ovmGASLIMIT;\\n uint256 ovmTXGASLIMIT;\\n address ovmL1TXORIGIN;\\n }\\n\\n struct TransactionRecord {\\n uint256 ovmGasRefund;\\n }\\n\\n struct MessageContext {\\n address ovmCALLER;\\n address ovmADDRESS;\\n bool isStatic;\\n }\\n\\n struct MessageRecord {\\n uint256 nuisanceGasLeft;\\n }\\n\\n\\n /************************************\\n * Transaction Execution Entrypoint *\\n ************************************/\\n\\n function run(\\n Lib_OVMCodec.Transaction calldata _transaction,\\n address _txStateManager\\n ) external returns (bytes memory);\\n\\n\\n /*******************\\n * Context Opcodes *\\n *******************/\\n\\n function ovmCALLER() external view returns (address _caller);\\n function ovmADDRESS() external view returns (address _address);\\n function ovmTIMESTAMP() external view returns (uint256 _timestamp);\\n function ovmNUMBER() external view returns (uint256 _number);\\n function ovmGASLIMIT() external view returns (uint256 _gasLimit);\\n function ovmCHAINID() external view returns (uint256 _chainId);\\n\\n\\n /**********************\\n * L2 Context Opcodes *\\n **********************/\\n\\n function ovmL1QUEUEORIGIN() external view returns (Lib_OVMCodec.QueueOrigin _queueOrigin);\\n function ovmL1TXORIGIN() external view returns (address _l1TxOrigin);\\n\\n\\n /*******************\\n * Halting Opcodes *\\n *******************/\\n\\n function ovmREVERT(bytes memory _data) external;\\n\\n\\n /*****************************\\n * Contract Creation Opcodes *\\n *****************************/\\n\\n function ovmCREATE(bytes memory _bytecode) external returns (address _contract, bytes memory _revertdata);\\n function ovmCREATE2(bytes memory _bytecode, bytes32 _salt) external returns (address _contract, bytes memory _revertdata);\\n\\n\\n /*******************************\\n * Account Abstraction Opcodes *\\n ******************************/\\n\\n function ovmGETNONCE() external returns (uint256 _nonce);\\n function ovmINCREMENTNONCE() external;\\n function ovmCREATEEOA(bytes32 _messageHash, uint8 _v, bytes32 _r, bytes32 _s) external;\\n\\n\\n /****************************\\n * Contract Calling Opcodes *\\n ****************************/\\n\\n function ovmCALL(uint256 _gasLimit, address _address, bytes memory _calldata) external returns (bool _success, bytes memory _returndata);\\n function ovmSTATICCALL(uint256 _gasLimit, address _address, bytes memory _calldata) external returns (bool _success, bytes memory _returndata);\\n function ovmDELEGATECALL(uint256 _gasLimit, address _address, bytes memory _calldata) external returns (bool _success, bytes memory _returndata);\\n\\n\\n /****************************\\n * Contract Storage Opcodes *\\n ****************************/\\n\\n function ovmSLOAD(bytes32 _key) external returns (bytes32 _value);\\n function ovmSSTORE(bytes32 _key, bytes32 _value) external;\\n\\n\\n /*************************\\n * Contract Code Opcodes *\\n *************************/\\n\\n function ovmEXTCODECOPY(address _contract, uint256 _offset, uint256 _length) external returns (bytes memory _code);\\n function ovmEXTCODESIZE(address _contract) external returns (uint256 _size);\\n function ovmEXTCODEHASH(address _contract) external returns (bytes32 _hash);\\n\\n\\n /***************************************\\n * Public Functions: Execution Context *\\n ***************************************/\\n\\n function getMaxTransactionGasLimit() external view returns (uint _maxTransactionGasLimit);\\n}\\n\",\"keccak256\":\"0xf023d5d6fc6a03bd52f7a57af6e21076de77e8925d065bb79db062e73e43b684\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/execution/iOVM_SafetyChecker.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title iOVM_SafetyChecker\\n */\\ninterface iOVM_SafetyChecker {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function isBytecodeSafe(bytes calldata _bytecode) external pure returns (bool);\\n}\\n\",\"keccak256\":\"0xde6639676d4ec4f77297652d5ede2429bc93e74e11fefd9e9de4bc92dd784878\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/execution/iOVM_StateManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title iOVM_StateManager\\n */\\ninterface iOVM_StateManager {\\n\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n enum ItemState {\\n ITEM_UNTOUCHED,\\n ITEM_LOADED,\\n ITEM_CHANGED,\\n ITEM_COMMITTED\\n }\\n\\n /***************************\\n * Public Functions: Misc *\\n ***************************/\\n\\n function isAuthenticated(address _address) external view returns (bool);\\n\\n /***************************\\n * Public Functions: Setup *\\n ***************************/\\n\\n function owner() external view returns (address _owner);\\n function ovmExecutionManager() external view returns (address _ovmExecutionManager);\\n function setExecutionManager(address _ovmExecutionManager) external;\\n\\n\\n /************************************\\n * Public Functions: Account Access *\\n ************************************/\\n\\n function putAccount(address _address, Lib_OVMCodec.Account memory _account) external;\\n function putEmptyAccount(address _address) external;\\n function getAccount(address _address) external view returns (Lib_OVMCodec.Account memory _account);\\n function hasAccount(address _address) external view returns (bool _exists);\\n function hasEmptyAccount(address _address) external view returns (bool _exists);\\n function setAccountNonce(address _address, uint256 _nonce) external;\\n function getAccountNonce(address _address) external view returns (uint256 _nonce);\\n function getAccountEthAddress(address _address) external view returns (address _ethAddress);\\n function getAccountStorageRoot(address _address) external view returns (bytes32 _storageRoot);\\n function initPendingAccount(address _address) external;\\n function commitPendingAccount(address _address, address _ethAddress, bytes32 _codeHash) external;\\n function testAndSetAccountLoaded(address _address) external returns (bool _wasAccountAlreadyLoaded);\\n function testAndSetAccountChanged(address _address) external returns (bool _wasAccountAlreadyChanged);\\n function commitAccount(address _address) external returns (bool _wasAccountCommitted);\\n function incrementTotalUncommittedAccounts() external;\\n function getTotalUncommittedAccounts() external view returns (uint256 _total);\\n function wasAccountChanged(address _address) external view returns (bool);\\n function wasAccountCommitted(address _address) external view returns (bool);\\n\\n\\n /************************************\\n * Public Functions: Storage Access *\\n ************************************/\\n\\n function putContractStorage(address _contract, bytes32 _key, bytes32 _value) external;\\n function getContractStorage(address _contract, bytes32 _key) external view returns (bytes32 _value);\\n function hasContractStorage(address _contract, bytes32 _key) external view returns (bool _exists);\\n function testAndSetContractStorageLoaded(address _contract, bytes32 _key) external returns (bool _wasContractStorageAlreadyLoaded);\\n function testAndSetContractStorageChanged(address _contract, bytes32 _key) external returns (bool _wasContractStorageAlreadyChanged);\\n function commitContractStorage(address _contract, bytes32 _key) external returns (bool _wasContractStorageCommitted);\\n function incrementTotalUncommittedContractStorage() external;\\n function getTotalUncommittedContractStorage() external view returns (uint256 _total);\\n function wasContractStorageChanged(address _contract, bytes32 _key) external view returns (bool);\\n function wasContractStorageCommitted(address _contract, bytes32 _key) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x7a11dbd1f61593ba34debe07e39eef59967307f7f372ba9855bee0953585d08d\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/predeploys/iOVM_DeployerWhitelist.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title iOVM_DeployerWhitelist\\n */\\ninterface iOVM_DeployerWhitelist {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function initialize(address _owner, bool _allowArbitraryDeployment) external;\\n function owner() external returns (address _owner);\\n function setWhitelistedDeployer(address _deployer, bool _isWhitelisted) external;\\n function setOwner(address _newOwner) external;\\n function setAllowArbitraryDeployment(bool _allowArbitraryDeployment) external;\\n function enableArbitraryContractDeployment() external;\\n function isDeployerAllowed(address _deployer) external returns (bool _allowed);\\n}\\n\",\"keccak256\":\"0xdf1f27faf0d26d416bf6d408d146a16de32b4e1772a292c65d39eb7ec2b53ceb\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/codec/Lib_OVMCodec.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../utils/Lib_Bytes32Utils.sol\\\";\\n\\n/**\\n * @title Lib_OVMCodec\\n */\\nlibrary Lib_OVMCodec {\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum QueueOrigin {\\n SEQUENCER_QUEUE,\\n L1TOL2_QUEUE\\n }\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Account {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n address ethAddress;\\n bool isFresh;\\n }\\n\\n struct EVMAccount {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n }\\n\\n struct ChainBatchHeader {\\n uint256 batchIndex;\\n bytes32 batchRoot;\\n uint256 batchSize;\\n uint256 prevTotalElements;\\n bytes extraData;\\n }\\n\\n struct ChainInclusionProof {\\n uint256 index;\\n bytes32[] siblings;\\n }\\n\\n struct Transaction {\\n uint256 timestamp;\\n uint256 blockNumber;\\n QueueOrigin l1QueueOrigin;\\n address l1TxOrigin;\\n address entrypoint;\\n uint256 gasLimit;\\n bytes data;\\n }\\n\\n struct TransactionChainElement {\\n bool isSequenced;\\n uint256 queueIndex; // QUEUED TX ONLY\\n uint256 timestamp; // SEQUENCER TX ONLY\\n uint256 blockNumber; // SEQUENCER TX ONLY\\n bytes txData; // SEQUENCER TX ONLY\\n }\\n\\n struct QueueElement {\\n bytes32 transactionHash;\\n uint40 timestamp;\\n uint40 blockNumber;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Encodes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Encoded transaction bytes.\\n */\\n function encodeTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return abi.encodePacked(\\n _transaction.timestamp,\\n _transaction.blockNumber,\\n _transaction.l1QueueOrigin,\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n );\\n }\\n\\n /**\\n * Hashes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Hashed transaction\\n */\\n function hashTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(encodeTransaction(_transaction));\\n }\\n\\n /**\\n * Converts an OVM account to an EVM account.\\n * @param _in OVM account to convert.\\n * @return Converted EVM account.\\n */\\n function toEVMAccount(\\n Account memory _in\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n return EVMAccount({\\n nonce: _in.nonce,\\n balance: _in.balance,\\n storageRoot: _in.storageRoot,\\n codeHash: _in.codeHash\\n });\\n }\\n\\n /**\\n * @notice RLP-encodes an account state struct.\\n * @param _account Account state struct.\\n * @return RLP-encoded account state.\\n */\\n function encodeEVMAccount(\\n EVMAccount memory _account\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes[] memory raw = new bytes[](4);\\n\\n // Unfortunately we can't create this array outright because\\n // Lib_RLPWriter.writeList will reject fixed-size arrays. Assigning\\n // index-by-index circumvents this issue.\\n raw[0] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.nonce)\\n )\\n );\\n raw[1] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.balance)\\n )\\n );\\n raw[2] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.storageRoot));\\n raw[3] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.codeHash));\\n\\n return Lib_RLPWriter.writeList(raw);\\n }\\n\\n /**\\n * @notice Decodes an RLP-encoded account state into a useful struct.\\n * @param _encoded RLP-encoded account state.\\n * @return Account state struct.\\n */\\n function decodeEVMAccount(\\n bytes memory _encoded\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\\n\\n return EVMAccount({\\n nonce: Lib_RLPReader.readUint256(accountState[0]),\\n balance: Lib_RLPReader.readUint256(accountState[1]),\\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\\n });\\n }\\n\\n /**\\n * Calculates a hash for a given batch header.\\n * @param _batchHeader Header to hash.\\n * @return Hash of the header.\\n */\\n function hashBatchHeader(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(\\n abi.encode(\\n _batchHeader.batchRoot,\\n _batchHeader.batchSize,\\n _batchHeader.prevTotalElements,\\n _batchHeader.extraData\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0xd85ba2066057a2677926f484b938c7c2ef33ff3853f3b71cda252f4a54f30e05\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n public\\n onlyOwner\\n {\\n addresses[_getNameHash(_name)] = _address;\\n\\n emit AddressSet(\\n _name,\\n _address\\n );\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0x2ce671a0e004df88b136bea5a3c59d0732cea8887c8496da1d509e0200b03d7d\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(\\n address _libAddressManager\\n ) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x65981feeabff6a81783ea97d44baf988a18a86c8cb374c46fdb71819cbacc7c0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPReader.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_RLPReader\\n * @dev Adapted from \\\"RLPReader\\\" by Hamdi Allam (hamdi.allam97@gmail.com).\\n */\\nlibrary Lib_RLPReader {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 constant internal MAX_LIST_LENGTH = 32;\\n\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum RLPItemType {\\n DATA_ITEM,\\n LIST_ITEM\\n }\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct RLPItem {\\n uint256 length;\\n uint256 ptr;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts bytes to a reference to memory position and length.\\n * @param _in Input bytes to convert.\\n * @return Output memory reference.\\n */\\n function toRLPItem(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem memory\\n )\\n {\\n uint256 ptr;\\n assembly {\\n ptr := add(_in, 32)\\n }\\n\\n return RLPItem({\\n length: _in.length,\\n ptr: ptr\\n });\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n (\\n uint256 listOffset,\\n ,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.LIST_ITEM,\\n \\\"Invalid RLP list value.\\\"\\n );\\n\\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\\n // writing to the length. Since we can't know the number of RLP items without looping over\\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\\n // simply set a reasonable maximum list length and decrease the size before we finish.\\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\\n\\n uint256 itemCount = 0;\\n uint256 offset = listOffset;\\n while (offset < _in.length) {\\n require(\\n itemCount < MAX_LIST_LENGTH,\\n \\\"Provided RLP list exceeds max list length.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n ) = _decodeLength(RLPItem({\\n length: _in.length - offset,\\n ptr: _in.ptr + offset\\n }));\\n\\n out[itemCount] = RLPItem({\\n length: itemLength + itemOffset,\\n ptr: _in.ptr + offset\\n });\\n\\n itemCount += 1;\\n offset += itemOffset + itemLength;\\n }\\n\\n // Decrease the array size to match the actual item count.\\n assembly {\\n mstore(out, itemCount)\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n return readList(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes value.\\\"\\n );\\n\\n return _copy(_in.ptr, itemOffset, itemLength);\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return readBytes(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return string(readBytes(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return readString(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n require(\\n _in.length <= 33,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr + itemOffset;\\n bytes32 out;\\n assembly {\\n out := mload(ptr)\\n\\n // Shift the bytes over to match the item size.\\n if lt(itemLength, 32) {\\n out := div(out, exp(256, sub(32, itemLength)))\\n }\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return readBytes32(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return uint256(readBytes32(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return readUint256(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n require(\\n _in.length == 1,\\n \\\"Invalid RLP boolean value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 out;\\n assembly {\\n out := byte(0, mload(ptr))\\n }\\n\\n require(\\n out == 0 || out == 1,\\n \\\"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\\\"\\n );\\n\\n return out != 0;\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return readBool(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n if (_in.length == 1) {\\n return address(0);\\n }\\n\\n require(\\n _in.length == 21,\\n \\\"Invalid RLP address value.\\\"\\n );\\n\\n return address(readUint256(_in));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return readAddress(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads the raw bytes of an RLP item.\\n * @param _in RLP item to read.\\n * @return Raw RLP bytes.\\n */\\n function readRawBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in);\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Decodes the length of an RLP item.\\n * @param _in RLP item to decode.\\n * @return Offset of the encoded data.\\n * @return Length of the encoded data.\\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\\n */\\n function _decodeLength(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n uint256,\\n uint256,\\n RLPItemType\\n )\\n {\\n require(\\n _in.length > 0,\\n \\\"RLP item cannot be null.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 prefix;\\n assembly {\\n prefix := byte(0, mload(ptr))\\n }\\n\\n if (prefix <= 0x7f) {\\n // Single byte.\\n\\n return (0, 1, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xb7) {\\n // Short string.\\n\\n uint256 strLen = prefix - 0x80;\\n\\n require(\\n _in.length > strLen,\\n \\\"Invalid RLP short string.\\\"\\n );\\n\\n return (1, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xbf) {\\n // Long string.\\n uint256 lenOfStrLen = prefix - 0xb7;\\n\\n require(\\n _in.length > lenOfStrLen,\\n \\\"Invalid RLP long string length.\\\"\\n );\\n\\n uint256 strLen;\\n assembly {\\n // Pick out the string length.\\n strLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfStrLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfStrLen + strLen,\\n \\\"Invalid RLP long string.\\\"\\n );\\n\\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xf7) {\\n // Short list.\\n uint256 listLen = prefix - 0xc0;\\n\\n require(\\n _in.length > listLen,\\n \\\"Invalid RLP short list.\\\"\\n );\\n\\n return (1, listLen, RLPItemType.LIST_ITEM);\\n } else {\\n // Long list.\\n uint256 lenOfListLen = prefix - 0xf7;\\n\\n require(\\n _in.length > lenOfListLen,\\n \\\"Invalid RLP long list length.\\\"\\n );\\n\\n uint256 listLen;\\n assembly {\\n // Pick out the list length.\\n listLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfListLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfListLen + listLen,\\n \\\"Invalid RLP long list.\\\"\\n );\\n\\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\\n }\\n }\\n\\n /**\\n * Copies the bytes from a memory location.\\n * @param _src Pointer to the location to read from.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Copied bytes.\\n */\\n function _copy(\\n uint256 _src,\\n uint256 _offset,\\n uint256 _length\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out = new bytes(_length);\\n if (out.length == 0) {\\n return out;\\n }\\n\\n uint256 src = _src + _offset;\\n uint256 dest;\\n assembly {\\n dest := add(out, 32)\\n }\\n\\n // Copy over as many complete words as we can.\\n for (uint256 i = 0; i < _length / 32; i++) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n\\n src += 32;\\n dest += 32;\\n }\\n\\n // Pick out the remaining bytes.\\n uint256 mask = 256 ** (32 - (_length % 32)) - 1;\\n assembly {\\n mstore(\\n dest,\\n or(\\n and(mload(src), not(mask)),\\n and(mload(dest), mask)\\n )\\n )\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Copies an RLP item into bytes.\\n * @param _in RLP item to copy.\\n * @return Copied bytes.\\n */\\n function _copy(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in.ptr, 0, _in.length);\\n }\\n}\\n\",\"keccak256\":\"0x829174c61216dce35fdb888383b6022e0365eb7fbdc71ad79d98b108091969fe\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPWriter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/**\\n * @title Lib_RLPWriter\\n * @author Bakaoh (with modifications)\\n */\\nlibrary Lib_RLPWriter {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * RLP encodes a byte string.\\n * @param _in The byte string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded;\\n\\n if (_in.length == 1 && uint8(_in[0]) < 128) {\\n encoded = _in;\\n } else {\\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * RLP encodes a list of RLP encoded byte byte strings.\\n * @param _in The list of RLP encoded byte strings.\\n * @return The RLP encoded list of items in bytes.\\n */\\n function writeList(\\n bytes[] memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory list = _flatten(_in);\\n return abi.encodePacked(_writeLength(list.length, 192), list);\\n }\\n\\n /**\\n * RLP encodes a string.\\n * @param _in The string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeString(\\n string memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(bytes(_in));\\n }\\n\\n /**\\n * RLP encodes an address.\\n * @param _in The address to encode.\\n * @return The RLP encoded address in bytes.\\n */\\n function writeAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a bytes32 value.\\n * @param _in The bytes32 to encode.\\n * @return _out The RLP encoded bytes32 in bytes.\\n */\\n function writeBytes32(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a uint.\\n * @param _in The uint256 to encode.\\n * @return The RLP encoded uint256 in bytes.\\n */\\n function writeUint(\\n uint256 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(_toBinary(_in));\\n }\\n\\n /**\\n * RLP encodes a bool.\\n * @param _in The bool to encode.\\n * @return The RLP encoded bool in bytes.\\n */\\n function writeBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded = new bytes(1);\\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\\n return encoded;\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\\n * @param _len The length of the string or the payload.\\n * @param _offset 128 if item is string, 192 if item is list.\\n * @return RLP encoded bytes.\\n */\\n function _writeLength(\\n uint256 _len,\\n uint256 _offset\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded;\\n\\n if (_len < 56) {\\n encoded = new bytes(1);\\n encoded[0] = byte(uint8(_len) + uint8(_offset));\\n } else {\\n uint256 lenLen;\\n uint256 i = 1;\\n while (_len / i != 0) {\\n lenLen++;\\n i *= 256;\\n }\\n\\n encoded = new bytes(lenLen + 1);\\n encoded[0] = byte(uint8(lenLen) + uint8(_offset) + 55);\\n for(i = 1; i <= lenLen; i++) {\\n encoded[i] = byte(uint8((_len / (256**(lenLen-i))) % 256));\\n }\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * Encode integer in big endian binary form with no leading zeroes.\\n * @notice TODO: This should be optimized with assembly to save gas costs.\\n * @param _x The integer to encode.\\n * @return RLP encoded bytes.\\n */\\n function _toBinary(\\n uint256 _x\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory b = abi.encodePacked(_x);\\n\\n uint256 i = 0;\\n for (; i < 32; i++) {\\n if (b[i] != 0) {\\n break;\\n }\\n }\\n\\n bytes memory res = new bytes(32 - i);\\n for (uint256 j = 0; j < res.length; j++) {\\n res[j] = b[i++];\\n }\\n\\n return res;\\n }\\n\\n /**\\n * Copies a piece of memory to another location.\\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\\n * @param _dest Destination location.\\n * @param _src Source location.\\n * @param _len Length of memory to copy.\\n */\\n function _memcpy(\\n uint256 _dest,\\n uint256 _src,\\n uint256 _len\\n )\\n private\\n pure\\n {\\n uint256 dest = _dest;\\n uint256 src = _src;\\n uint256 len = _len;\\n\\n for(; len >= 32; len -= 32) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n dest += 32;\\n src += 32;\\n }\\n\\n uint256 mask = 256 ** (32 - len) - 1;\\n assembly {\\n let srcpart := and(mload(src), not(mask))\\n let destpart := and(mload(dest), mask)\\n mstore(dest, or(destpart, srcpart))\\n }\\n }\\n\\n /**\\n * Flattens a list of byte strings into one byte string.\\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\\n * @param _list List of byte strings to flatten.\\n * @return The flattened byte string.\\n */\\n function _flatten(\\n bytes[] memory _list\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n if (_list.length == 0) {\\n return new bytes(0);\\n }\\n\\n uint256 len;\\n uint256 i = 0;\\n for (; i < _list.length; i++) {\\n len += _list[i].length;\\n }\\n\\n bytes memory flattened = new bytes(len);\\n uint256 flattenedPtr;\\n assembly { flattenedPtr := add(flattened, 0x20) }\\n\\n for(i = 0; i < _list.length; i++) {\\n bytes memory item = _list[i];\\n\\n uint256 listPtr;\\n assembly { listPtr := add(item, 0x20)}\\n\\n _memcpy(flattenedPtr, listPtr, item.length);\\n flattenedPtr += _list[i].length;\\n }\\n\\n return flattened;\\n }\\n}\\n\",\"keccak256\":\"0xb60ee4b03ad372c3deff21d454ab714dd0c18ee3e6f9d45532e209fc59d5a54d\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_Bytes32Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_Byte32Utils\\n */\\nlibrary Lib_Bytes32Utils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \\\"true.\\\"\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as a boolean.\\n */\\n function toBool(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return _in != 0;\\n }\\n\\n /**\\n * Converts a boolean to a bytes32 value.\\n * @param _in Input boolean value.\\n * @return Boolean as a bytes32.\\n */\\n function fromBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in ? 1 : 0));\\n }\\n\\n /**\\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as an address.\\n */\\n function toAddress(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return address(uint160(uint256(_in)));\\n }\\n\\n /**\\n * Converts an address to a bytes32.\\n * @param _in Input address value.\\n * @return Address as a bytes32.\\n */\\n function fromAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in));\\n }\\n\\n /**\\n * Removes the leading zeros from a bytes32 value and returns a new (smaller) bytes value.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 without any leading zeros.\\n */\\n function removeLeadingZeros(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out;\\n\\n assembly {\\n // Figure out how many leading zero bytes to remove.\\n let shift := 0\\n for { let i := 0 } and(lt(i, 32), eq(byte(i, _in), 0)) { i := add(i, 1) } {\\n shift := add(shift, 1)\\n }\\n\\n // Reserve some space for our output and fix the free memory pointer.\\n out := mload(0x40)\\n mstore(0x40, add(out, 0x40))\\n\\n // Shift the value and store it into the output bytes.\\n mstore(add(out, 0x20), shl(mul(shift, 8), _in))\\n\\n // Store the new size (with leading zero bytes removed) in the output byte size.\\n mstore(out, sub(32, shift))\\n }\\n\\n return out;\\n }\\n}\\n\",\"keccak256\":\"0xfa2def593e3fc56a31852c3744aefdaa93cec74e721bfcfeb1e5d166c7c60b64\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_BytesUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_BytesUtils\\n */\\nlibrary Lib_BytesUtils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_start + _length >= _start, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n if (_bytes.length - _start == 0) {\\n return bytes('');\\n }\\n\\n return slice(_bytes, _start, _bytes.length - _start);\\n }\\n\\n function toBytes32PadLeft(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n bytes32 ret;\\n uint256 len = _bytes.length <= 32 ? _bytes.length : 32;\\n assembly {\\n ret := shr(mul(sub(32, len), 8), mload(add(_bytes, 32)))\\n }\\n return ret;\\n }\\n\\n function toBytes32(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n if (_bytes.length < 32) {\\n bytes32 ret;\\n assembly {\\n ret := mload(add(_bytes, 32))\\n }\\n return ret;\\n }\\n\\n return abi.decode(_bytes,(bytes32)); // will truncate if input length > 32 bytes\\n }\\n\\n function toUint256(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return uint256(toBytes32(_bytes));\\n }\\n\\n function toUint24(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n uint24\\n )\\n {\\n require(_start + 3 >= _start, \\\"toUint24_overflow\\\");\\n require(_bytes.length >= _start + 3 , \\\"toUint24_outOfBounds\\\");\\n uint24 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x3), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toUint8(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n uint8\\n )\\n {\\n require(_start + 1 >= _start, \\\"toUint8_overflow\\\");\\n require(_bytes.length >= _start + 1 , \\\"toUint8_outOfBounds\\\");\\n uint8 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x1), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toAddress(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n require(_start + 20 >= _start, \\\"toAddress_overflow\\\");\\n require(_bytes.length >= _start + 20, \\\"toAddress_outOfBounds\\\");\\n address tempAddress;\\n\\n assembly {\\n tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000)\\n }\\n\\n return tempAddress;\\n }\\n\\n function toNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory nibbles = new bytes(_bytes.length * 2);\\n\\n for (uint256 i = 0; i < _bytes.length; i++) {\\n nibbles[i * 2] = _bytes[i] >> 4;\\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\\n }\\n\\n return nibbles;\\n }\\n\\n function fromNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory ret = new bytes(_bytes.length / 2);\\n\\n for (uint256 i = 0; i < ret.length; i++) {\\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\\n }\\n\\n return ret;\\n }\\n\\n function equal(\\n bytes memory _bytes,\\n bytes memory _other\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return keccak256(_bytes) == keccak256(_other);\\n }\\n}\\n\",\"keccak256\":\"0xa5195afe32fb2cf104d156e8f4bd39df1ec79bf6ba232097b9e8e0ee14fbc298\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_ErrorUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/**\\n * @title Lib_ErrorUtils\\n */\\nlibrary Lib_ErrorUtils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Encodes an error string into raw solidity-style revert data.\\n * (i.e. ascii bytes, prefixed with bytes4(keccak(\\\"Error(string))\\\"))\\n * Ref: https://docs.soliditylang.org/en/v0.8.2/control-structures.html?highlight=Error(string)#panic-via-assert-and-error-via-require\\n * @param _reason Reason for the reversion.\\n * @return Standard solidity revert data for the given reason.\\n */\\n function encodeRevertString(\\n string memory _reason\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return abi.encodeWithSignature(\\n \\\"Error(string)\\\",\\n _reason\\n );\\n }\\n}\\n\",\"keccak256\":\"0xfc64ec4a81fb50865b502a0004ed154e8598e1a313db77303fc95e41f536e6b7\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_EthUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// @unsupported: ovm\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"./Lib_Bytes32Utils.sol\\\";\\n\\n/**\\n * @title Lib_EthUtils\\n */\\nlibrary Lib_EthUtils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Gets the code for a given address.\\n * @param _address Address to get code for.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Code read from the contract.\\n */\\n function getCode(\\n address _address,\\n uint256 _offset,\\n uint256 _length\\n )\\n internal\\n view\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory code;\\n assembly {\\n code := mload(0x40)\\n mstore(0x40, add(code, add(_length, 0x20)))\\n mstore(code, _length)\\n extcodecopy(_address, add(code, 0x20), _offset, _length)\\n }\\n\\n return code;\\n }\\n\\n /**\\n * Gets the full code for a given address.\\n * @param _address Address to get code for.\\n * @return Full code of the contract.\\n */\\n function getCode(\\n address _address\\n )\\n internal\\n view\\n returns (\\n bytes memory\\n )\\n {\\n return getCode(\\n _address,\\n 0,\\n getCodeSize(_address)\\n );\\n }\\n\\n /**\\n * Gets the size of a contract's code in bytes.\\n * @param _address Address to get code size for.\\n * @return Size of the contract's code in bytes.\\n */\\n function getCodeSize(\\n address _address\\n )\\n internal\\n view\\n returns (\\n uint256\\n )\\n {\\n uint256 codeSize;\\n assembly {\\n codeSize := extcodesize(_address)\\n }\\n\\n return codeSize;\\n }\\n\\n /**\\n * Gets the hash of a contract's code.\\n * @param _address Address to get a code hash for.\\n * @return Hash of the contract's code.\\n */\\n function getCodeHash(\\n address _address\\n )\\n internal\\n view\\n returns (\\n bytes32\\n )\\n {\\n bytes32 codeHash;\\n assembly {\\n codeHash := extcodehash(_address)\\n }\\n\\n return codeHash;\\n }\\n\\n /**\\n * Creates a contract with some given initialization code.\\n * @param _code Contract initialization code.\\n * @return Address of the created contract.\\n */\\n function createContract(\\n bytes memory _code\\n )\\n internal\\n returns (\\n address\\n )\\n {\\n address created;\\n assembly {\\n created := create(\\n 0,\\n add(_code, 0x20),\\n mload(_code)\\n )\\n }\\n\\n return created;\\n }\\n\\n /**\\n * Computes the address that would be generated by CREATE.\\n * @param _creator Address creating the contract.\\n * @param _nonce Creator's nonce.\\n * @return Address to be generated by CREATE.\\n */\\n function getAddressForCREATE(\\n address _creator,\\n uint256 _nonce\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n bytes[] memory encoded = new bytes[](2);\\n encoded[0] = Lib_RLPWriter.writeAddress(_creator);\\n encoded[1] = Lib_RLPWriter.writeUint(_nonce);\\n\\n bytes memory encodedList = Lib_RLPWriter.writeList(encoded);\\n return Lib_Bytes32Utils.toAddress(keccak256(encodedList));\\n }\\n\\n /**\\n * Computes the address that would be generated by CREATE2.\\n * @param _creator Address creating the contract.\\n * @param _bytecode Bytecode of the contract to be created.\\n * @param _salt 32 byte salt value mixed into the hash.\\n * @return Address to be generated by CREATE2.\\n */\\n function getAddressForCREATE2(\\n address _creator,\\n bytes memory _bytecode,\\n bytes32 _salt\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n bytes32 hashedData = keccak256(abi.encodePacked(\\n byte(0xff),\\n _creator,\\n _salt,\\n keccak256(_bytecode)\\n ));\\n\\n return Lib_Bytes32Utils.toAddress(hashedData);\\n }\\n}\\n\",\"keccak256\":\"0xf29a67d78e61cb472d524b779b32cfcb39a587f4096500d5419e6425ed367d49\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_MerkleTree.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_MerkleTree\\n * @author River Keefer\\n */\\nlibrary Lib_MerkleTree {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Calculates a merkle root for a list of 32-byte leaf hashes. WARNING: If the number\\n * of leaves passed in is not a power of two, it pads out the tree with zero hashes.\\n * If you do not know the original length of elements for the tree you are verifying,\\n * then this may allow empty leaves past _elements.length to pass a verification check down the line.\\n * Note that the _elements argument is modified, therefore it must not be used again afterwards\\n * @param _elements Array of hashes from which to generate a merkle root.\\n * @return Merkle root of the leaves, with zero hashes for non-powers-of-two (see above).\\n */\\n function getMerkleRoot(\\n bytes32[] memory _elements\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n require(\\n _elements.length > 0,\\n \\\"Lib_MerkleTree: Must provide at least one leaf hash.\\\"\\n );\\n\\n if (_elements.length == 1) {\\n return _elements[0];\\n }\\n\\n uint256[16] memory defaults = [\\n 0x290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563,\\n 0x633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d,\\n 0x890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d,\\n 0x3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd8,\\n 0xecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da,\\n 0xdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da5,\\n 0x617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d7,\\n 0x292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead,\\n 0xe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e10,\\n 0x7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f82,\\n 0xe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e83636516,\\n 0x3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c,\\n 0xad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e,\\n 0xa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab,\\n 0x4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c862,\\n 0x2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf10\\n ];\\n\\n // Reserve memory space for our hashes.\\n bytes memory buf = new bytes(64);\\n\\n // We'll need to keep track of left and right siblings.\\n bytes32 leftSibling;\\n bytes32 rightSibling;\\n\\n // Number of non-empty nodes at the current depth.\\n uint256 rowSize = _elements.length;\\n\\n // Current depth, counting from 0 at the leaves\\n uint256 depth = 0;\\n\\n // Common sub-expressions\\n uint256 halfRowSize; // rowSize / 2\\n bool rowSizeIsOdd; // rowSize % 2 == 1\\n\\n while (rowSize > 1) {\\n halfRowSize = rowSize / 2;\\n rowSizeIsOdd = rowSize % 2 == 1;\\n\\n for (uint256 i = 0; i < halfRowSize; i++) {\\n leftSibling = _elements[(2 * i) ];\\n rightSibling = _elements[(2 * i) + 1];\\n assembly {\\n mstore(add(buf, 32), leftSibling )\\n mstore(add(buf, 64), rightSibling)\\n }\\n\\n _elements[i] = keccak256(buf);\\n }\\n\\n if (rowSizeIsOdd) {\\n leftSibling = _elements[rowSize - 1];\\n rightSibling = bytes32(defaults[depth]);\\n assembly {\\n mstore(add(buf, 32), leftSibling)\\n mstore(add(buf, 64), rightSibling)\\n }\\n\\n _elements[halfRowSize] = keccak256(buf);\\n }\\n\\n rowSize = halfRowSize + (rowSizeIsOdd ? 1 : 0);\\n depth++;\\n }\\n\\n return _elements[0];\\n }\\n\\n /**\\n * Verifies a merkle branch for the given leaf hash. Assumes the original length\\n * of leaves generated is a known, correct input, and does not return true for indices\\n * extending past that index (even if _siblings would be otherwise valid.)\\n * @param _root The Merkle root to verify against.\\n * @param _leaf The leaf hash to verify inclusion of.\\n * @param _index The index in the tree of this leaf.\\n * @param _siblings Array of sibline nodes in the inclusion proof, starting from depth 0 (bottom of the tree).\\n * @param _totalLeaves The total number of leaves originally passed into.\\n * @return Whether or not the merkle branch and leaf passes verification.\\n */\\n function verify(\\n bytes32 _root,\\n bytes32 _leaf,\\n uint256 _index,\\n bytes32[] memory _siblings,\\n uint256 _totalLeaves\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n require(\\n _totalLeaves > 0,\\n \\\"Lib_MerkleTree: Total leaves must be greater than zero.\\\"\\n );\\n\\n require(\\n _index < _totalLeaves,\\n \\\"Lib_MerkleTree: Index out of bounds.\\\"\\n );\\n\\n require(\\n _siblings.length == _ceilLog2(_totalLeaves),\\n \\\"Lib_MerkleTree: Total siblings does not correctly correspond to total leaves.\\\"\\n );\\n\\n bytes32 computedRoot = _leaf;\\n\\n for (uint256 i = 0; i < _siblings.length; i++) {\\n if ((_index & 1) == 1) {\\n computedRoot = keccak256(\\n abi.encodePacked(\\n _siblings[i],\\n computedRoot\\n )\\n );\\n } else {\\n computedRoot = keccak256(\\n abi.encodePacked(\\n computedRoot,\\n _siblings[i]\\n )\\n );\\n }\\n\\n _index >>= 1;\\n }\\n\\n return _root == computedRoot;\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Calculates the integer ceiling of the log base 2 of an input.\\n * @param _in Unsigned input to calculate the log.\\n * @return ceil(log_base_2(_in))\\n */\\n function _ceilLog2(\\n uint256 _in\\n )\\n private\\n pure\\n returns (\\n uint256\\n )\\n {\\n require(\\n _in > 0,\\n \\\"Lib_MerkleTree: Cannot compute ceil(log_2) of 0.\\\"\\n );\\n\\n if (_in == 1) {\\n return 0;\\n }\\n\\n // Find the highest set bit (will be floor(log_2)).\\n // Borrowed with <3 from https://github.com/ethereum/solidity-examples\\n uint256 val = _in;\\n uint256 highest = 0;\\n for (uint256 i = 128; i >= 1; i >>= 1) {\\n if (val & (uint(1) << i) - 1 << i != 0) {\\n highest += i;\\n val >>= i;\\n }\\n }\\n\\n // Increment by one if this is not a perfect logarithm.\\n if ((uint(1) << highest) != _in) {\\n highest += 1;\\n }\\n\\n return highest;\\n }\\n}\\n\",\"keccak256\":\"0xa78edb9fbd34712771a1ebff05bc5e1abec7fc1e9a1bfb709d183099b44fa62a\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x60806040523480156200001157600080fd5b506040516200315338038062003153833981016040819052620000349162000067565b600080546001600160a01b0319166001600160a01b039590951694909417909355600191909155600255600355620000b2565b600080600080608085870312156200007d578384fd5b84516001600160a01b038116811462000094578485fd5b60208601516040870151606090970151919890975090945092505050565b61309180620000c26000396000f3fe608060405234801561001057600080fd5b50600436106101425760003560e01c8063876ed5cb116100b8578063cfdf677e1161007c578063cfdf677e1461023f578063d0f8934414610247578063e10d29ee1461024f578063e561dddc14610257578063f722b41a1461025f578063facdc5da1461026757610142565b8063876ed5cb146102175780638d38c6c11461021f578063b8f7700514610227578063c139eb151461022f578063c2cf696f1461023757610142565b80634de569ce1161010a5780634de569ce146101c25780635ae6256d146101e25780636fee07e0146101ea57806378f4b2f2146101ff5780637a167a8a146102075780637aa63a861461020f57610142565b8063138387a414610147578063299ca478146101655780632a7f18be1461017a578063378997701461019a578063461a4478146101af575b600080fd5b61014f61027a565b60405161015c91906124c7565b60405180910390f35b61016d610280565b60405161015c91906123eb565b61018d610188366004612388565b61028f565b60405161015c9190612e4e565b6101a26102b0565b60405161015c9190612e8d565b61016d6101bd36600461221b565b6102c4565b6101d56101d0366004612261565b6103a0565b60405161015c9190612484565b6101a26103da565b6101fd6101f8366004612188565b6103ee565b005b61014f61066d565b6101a2610674565b61014f610689565b61014f6106a4565b61014f6106aa565b6101a26106b0565b61014f6106c7565b61014f6106cd565b61016d6106d2565b6101fd6106f5565b61016d610b69565b61014f610b8c565b6101a2610c06565b6101fd610275366004612388565b610c1e565b60025481565b6000546001600160a01b031681565b610297611ed9565b6102a8826102a3610b69565b610c36565b90505b919050565b6000806102bb610d76565b50935050505090565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b8381101561032457818101518382015260200161030c565b50505050905090810190601f1680156103515780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561036e57600080fd5b505afa158015610382573d6000803e3d6000fd5b505050506040513d602081101561039857600080fd5b505192915050565b82516000901515600114156103c2576103bb85858585610e24565b90506103d2565b6103bb8585602001518585610fef565b949350505050565b6000806103e5610d76565b94505050505090565b61c3508151111561041a5760405162461bcd60e51b81526004016104119061259b565b60405180910390fd5b60035482111561043c5760405162461bcd60e51b8152600401610411906127a1565b620186a082101561045f5760405162461bcd60e51b815260040161041190612983565b6020820460005a90508181116104875760405162461bcd60e51b815260040161041190612b8a565b60005b825a8303101561049c5760010161048a565b6000338787876040516020016104b594939291906123ff565b60408051601f19818403018152919052805160209091012090504360281b421760006104df610b69565b60405163b298e36b60e01b81529091506001600160a01b0382169063b298e36b9061050e9086906004016124c7565b600060405180830381600087803b15801561052857600080fd5b505af115801561053c573d6000803e3d6000fd5b505060405163b298e36b60e01b81526001600160a01b038416925063b298e36b915061056c9085906004016124c7565b600060405180830381600087803b15801561058657600080fd5b505af115801561059a573d6000803e3d6000fd5b50505050600060016002836001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b1580156105dd57600080fd5b505afa1580156105f1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106159190612203565b8161061c57fe5b040390507f4b388aecf9fa6cc92253704e5975a6129a4f735bdbd99567df4ed0094ee4ceb5338b8b8b85426040516106599695949392919061243c565b60405180910390a150505050505050505050565b620186a081565b60008061067f610d76565b5090935050505090565b600080610694610d76565b50505064ffffffffff1692915050565b61c35081565b60035481565b60006106c26106bd610b69565b6110c4565b905090565b60015481565b602081565b60006106c2604051806060016040528060258152602001613003602591396102c4565b60043560d81c60093560e890811c90600c35901c610711610689565b8364ffffffffff16146107365760405162461bcd60e51b815260040161041190612a35565b6107646040518060400160405280600d81526020016c27ab26afa9b2b8bab2b731b2b960991b8152506102c4565b6001600160a01b0316336001600160a01b0316146107945760405162461bcd60e51b815260040161041190612a92565b60008162ffffff16116107b95760405162461bcd60e51b8152600401610411906127fe565b60008262ffffff16116107de5760405162461bcd60e51b815260040161041190612cdf565b600f601062ffffff8316020164ffffffffff81163610156108115760405162461bcd60e51b815260040161041190612d66565b600061081b610b69565b90506000610828826110c4565b9050600062ffffff8616368161083a57fe5b0460020267ffffffffffffffff8111801561085457600080fd5b506040519080825280601f01601f19166020018201604052801561087f576020820181803683370190505b50905060008662ffffff1667ffffffffffffffff811180156108a057600080fd5b506040519080825280602002602001820160405280156108ca578160200160208202803683370190505b50905060008060006108da610674565b90506108e4611ef9565b60005b8a62ffffff168163ffffffff161015610a3b57600061090b8263ffffffff16611147565b905063ffffffff82166109215761092181611197565b61092d8382868d611264565b80925060005b835163ffffffff821610156109b1578b3560e81c61c3508111156109695760405162461bcd60e51b81526004016104119061259b565b61097c858e64ffffffffff16838d6112cf565b898963ffffffff168151811061098e57fe5b60209081029190910101529b909b016003019a6001968701969586019501610933565b5060005b83602001518163ffffffff161015610a31578964ffffffffff168564ffffffffff16106109f45760405162461bcd60e51b815260040161041190612da8565b610a048564ffffffffff16611363565b888863ffffffff1681518110610a1657fe5b602090810291909101015260019687019694850194016109b5565b50506001016108e7565b50610a488183898b6113a8565b3664ffffffffff8a1614610a6e5760405162461bcd60e51b815260040161041190612846565b8a62ffffff168463ffffffff1614610a985760405162461bcd60e51b815260040161041190612894565b6000838c62ffffff160363ffffffff169050600080836020015160001415610acb57505060408201516060830151610af3565b6000610ae16001870364ffffffffff168d610c36565b90508060200151925080604001519150505b610b14610aff8961141b565b8f62ffffff168564ffffffffff16858561184f565b7f602f1aeac0ca2e7a13e281a9ef0ad7838542712ce16780fa2ecffd351f05f89983860384610b41610689565b604051610b5093929190612e9f565b60405180910390a1505050505050505050505050505050565b60006106c2604051806060016040528060238152602001612ee6602391396102c4565b6000610b966106d2565b6001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b158015610bce57600080fd5b505afa158015610be2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106c29190612203565b6000610c10610674565b610c186106b0565b03905090565b60405162461bcd60e51b81526004016104119061250b565b610c3e611ed9565b604051634a83e9cd60e11b815260028402906000906001600160a01b03851690639507d39a90610c72908590600401612e8d565b60206040518083038186803b158015610c8a57600080fd5b505afa158015610c9e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cc29190612203565b90506000846001600160a01b0316639507d39a846001016040518263ffffffff1660e01b8152600401610cf59190612e8d565b60206040518083038186803b158015610d0d57600080fd5b505afa158015610d21573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d459190612203565b6040805160608101825293845264ffffffffff828116602086015260289290921c9091169083015250949350505050565b6000806000806000610d866106d2565b6001600160a01b031663ccf8f9696040518163ffffffff1660e01b815260040160206040518083038186803b158015610dbe57600080fd5b505afa158015610dd2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610df691906121dd565b64ffffffffff602882901c811697605083901c82169750607883901c8216965060a09290921c169350915050565b600080610e5c6040518060400160405280601481526020017327ab26afa2bc32b1baba34b7b726b0b730b3b2b960611b8152506102c4565b90506000816001600160a01b0316631c4712a76040518163ffffffff1660e01b815260040160206040518083038186803b158015610e9957600080fd5b505afa158015610ead573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ed19190612203565b90506000610ede87611a02565b9050610eeb818787611a9b565b610f075760405162461bcd60e51b8152600401610411906126ca565b86606001518860200151148015610f22575060408701518851145b8015610f635750610f4a604051806060016040528060228152602001612f09602291396102c4565b6001600160a01b031688608001516001600160a01b0316145b8015610f725750818860a00151145b8015610f89575060608801516001600160a01b0316155b8015610fa45750600088604001516001811115610fa257fe5b145b8015610fc557508660800151805190602001208860c0015180519060200120145b610fe15760405162461bcd60e51b81526004016104119061276a565b506001979650505050505050565b600080610ffb85611363565b9050611008818585611a9b565b6110245760405162461bcd60e51b815260040161041190612c2a565b6000866060015187608001518860a001518960c0015160405160200161104d94939291906123ff565b60405160208183030381529060405280519060200120905060006110708761028f565b80519091508214801561108e57508751602082015164ffffffffff16145b80156110a857508760200151816040015164ffffffffff16145b610fe15760405162461bcd60e51b815260040161041190612adf565b60006002826001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b15801561110157600080fd5b505afa158015611115573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111399190612203565b8161114057fe5b0492915050565b61114f611ef9565b5060408051608081018252601092909202600f81013560e890811c84526012820135901c6020840152601581013560d890811c92840192909252601a0135901c606082015290565b60006111a1610689565b1115611211576000806111b2610d76565b9350935050508064ffffffffff16836060015110156111e35760405162461bcd60e51b815260040161041190612718565b8164ffffffffff168360400151101561120e5760405162461bcd60e51b8152600401610411906125f8565b50505b4260015482604001510110156112395760405162461bcd60e51b815260040161041190612d20565b4360025482606001510110156112615760405162461bcd60e51b815260040161041190612552565b50565b83604001518360400151101561128c5760405162461bcd60e51b815260040161041190612bd5565b8360600151836060015110156112b45760405162461bcd60e51b815260040161041190612df1565b6020830151156112c9576112c9838383611b8c565b50505050565b60008151836041011115611326578260410167ffffffffffffffff811180156112f757600080fd5b506040519080825280601f01601f191660200182016040528015611322576020820181803683370190505b5091505b6040850151606086015160006020850160018153836001820152826021820152866003890160418301376041870190209350505050949350505050565b60006102a86040518060a00160405280600015158152602001848152602001600081526020016000815260200160405180602001604052806000815250815250611c2d565b600083830364ffffffffff161180156113c357506020840151155b156113d3576113d3848483611b8c565b42846040015111156113f75760405162461bcd60e51b815260040161041190612b45565b43846060015111156112c95760405162461bcd60e51b815260040161041190612904565b60008082511161145c5760405162461bcd60e51b81526004018080602001828103825260348152602001806130286034913960400191505060405180910390fd5b815160011415611482578160008151811061147357fe5b602002602001015190506102ab565b60408051610200810182527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56381527f633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d60208201527f890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d818301527f3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd86060808301919091527fecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da60808301527fdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da560a08301527f617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d760c08301527f292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead60e08301527fe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e106101008301527f7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f826101208301527fe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e836365166101408301527f3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c6101608301527fad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e6101808301527fa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab6101a08301527f4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c8626101c08301527f2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf106101e083015282518381529081018352909160009190602082018180368337505085519192506000918291508180805b600184111561182b5750506002820460018084161460005b828110156117a7578a816002028151811061174e57fe5b602002602001015196508a816002026001018151811061176a57fe5b6020026020010151955086602089015285604089015287805190602001208b828151811061179457fe5b6020908102919091010152600101611737565b50801561180a578960018503815181106117bd57fe5b602002602001015195508783601081106117d357fe5b602002015160001b945085602088015284604088015286805190602001208a83815181106117fd57fe5b6020026020010181815250505b80611816576000611819565b60015b60ff168201935060019092019161171f565b8960008151811061183857fe5b602002602001015198505050505050505050919050565b60006118596106d2565b9050600080611866610d76565b50509150915060006040518060a00160405280856001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b1580156118b257600080fd5b505afa1580156118c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118ea9190612203565b81526020018a81526020018981526020018464ffffffffff16815260200160405180602001604052806000815250815250905080600001517f127186556e7be68c7e31263195225b4de02820707889540969f62c05cf73525e826020015183604001518460600151856080015160405161196794939291906124e6565b60405180910390a2600061197a82611c75565b90506000611992836040015186018a86018a8a611c9e565b60405163080549db60e21b81529091506001600160a01b03871690632015276c906119c390859085906004016124d0565b600060405180830381600087803b1580156119dd57600080fd5b505af11580156119f1573d6000803e3d6000fd5b505050505050505050505050505050565b6080810151805160009190826041820167ffffffffffffffff81118015611a2857600080fd5b506040519080825280601f01601f191660200182016040528015611a53576020820181803683370190505b5060408601516060870151919250906000602084016001815383600182015282602182015285604182018760208a0160045afa50604190950190942095505050505050919050565b6000611aa56106d2565b8351604051634a83e9cd60e11b81526001600160a01b039290921691639507d39a91611ad391600401612e7c565b60206040518083038186803b158015611aeb57600080fd5b505afa158015611aff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b239190612203565b611b2c84611c75565b14611b495760405162461bcd60e51b815260040161041190612b16565b611b66836020015185846000015185602001518760400151611cbd565b611b825760405162461bcd60e51b81526004016104119061294c565b5060019392505050565b6000611b9f8364ffffffffff1683610c36565b9050600154816020015164ffffffffff16014210611bcf5760405162461bcd60e51b815260040161041190612647565b806020015164ffffffffff1684604001511115611bfe5760405162461bcd60e51b8152600401610411906129cc565b806040015164ffffffffff16846060015111156112c95760405162461bcd60e51b815260040161041190612c74565b8051602080830151604080850151606086015160808701519251600096611c5896909594910161248f565b604051602081830303815290604052805190602001209050919050565b60008160200151826040015183606001518460800151604051602001611c5894939291906124e6565b602892831b9390931760509190911b1760789290921b91909117901b90565b6000808211611cfd5760405162461bcd60e51b8152600401808060200182810382526037815260200180612f7f6037913960400191505060405180910390fd5b818410611d3b5760405162461bcd60e51b8152600401808060200182810382526024815260200180612f2b6024913960400191505060405180910390fd5b611d4482611e42565b835114611d825760405162461bcd60e51b815260040180806020018281038252604d815260200180612fb6604d913960600191505060405180910390fd5b8460005b8451811015611e35578560011660011415611de457848181518110611da757fe5b6020026020010151826040516020018083815260200182815260200192505050604051602081830303815290604052805190602001209150611e29565b81858281518110611df157fe5b602002602001015160405160200180838152602001828152602001925050506040516020818303038152906040528051906020012091505b600195861c9501611d86565b5090951495945050505050565b6000808211611e825760405162461bcd60e51b8152600401808060200182810382526030815260200180612f4f6030913960400191505060405180910390fd5b8160011415611e93575060006102ab565b81600060805b60018110611ec3576000196001821b01811b831615611ebb5791821c91908101905b60011c611e99565b506001811b8414611ed2576001015b9392505050565b604080516060810182526000808252602082018190529181019190915290565b6040518060800160405280600081526020016000815260200160008152602001600081525090565b600067ffffffffffffffff831115611f3557fe5b611f48601f8401601f1916602001612ec1565b9050828152838383011115611f5c57600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b03811681146102ab57600080fd5b600082601f830112611f9a578081fd5b611ed283833560208501611f21565b8035600281106102ab57600080fd5b600060a08284031215611fc9578081fd5b60405160a0810167ffffffffffffffff8282108183111715611fe757fe5b8160405282935084358352602085013560208401526040850135604084015260608501356060840152608085013591508082111561202457600080fd5b5061203185828601611f8a565b6080830152505092915050565b60006040828403121561204f578081fd5b6040516040810167ffffffffffffffff828210818311171561206d57fe5b816040528293508435835260209150818501358181111561208d57600080fd5b8501601f8101871361209e57600080fd5b8035828111156120aa57fe5b83810292506120ba848401612ec1565b8181528481019083860185850187018b10156120d557600080fd5b600095505b838610156120f85780358352600195909501949186019186016120da565b5080868801525050505050505092915050565b600060a0828403121561211c578081fd5b60405160a0810167ffffffffffffffff828210818311171561213a57fe5b8160405282935084359150811515821461215357600080fd5b818352602085013560208401526040850135604084015260608501356060840152608085013591508082111561202457600080fd5b60008060006060848603121561219c578283fd5b6121a584611f73565b925060208401359150604084013567ffffffffffffffff8111156121c7578182fd5b6121d386828701611f8a565b9150509250925092565b6000602082840312156121ee578081fd5b815164ffffffffff1981168114611ed2578182fd5b600060208284031215612214578081fd5b5051919050565b60006020828403121561222c578081fd5b813567ffffffffffffffff811115612242578182fd5b8201601f81018413612252578182fd5b6103d284823560208401611f21565b60008060008060808587031215612276578081fd5b843567ffffffffffffffff8082111561228d578283fd5b9086019060e082890312156122a0578283fd5b6122aa60e0612ec1565b82358152602083013560208201526122c460408401611fa9565b60408201526122d560608401611f73565b60608201526122e660808401611f73565b608082015260a083013560a082015260c083013582811115612306578485fd5b6123128a828601611f8a565b60c0830152509550602087013591508082111561232d578283fd5b6123398883890161210b565b9450604087013591508082111561234e578283fd5b61235a88838901611fb8565b9350606087013591508082111561236f578283fd5b5061237c8782880161203e565b91505092959194509250565b600060208284031215612399578081fd5b5035919050565b60008151808452815b818110156123c5576020818501810151868301820152016123a9565b818111156123d65782602083870101525b50601f01601f19169290920160200192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612432908301846123a0565b9695505050505050565b6001600160a01b038781168252861660208201526040810185905260c06060820181905260009061246f908301866123a0565b60808301949094525060a00152949350505050565b901515815260200190565b6000861515825285602083015284604083015283606083015260a060808301526124bc60a08301846123a0565b979650505050505050565b90815260200190565b91825264ffffffffff1916602082015260400190565b60008582528460208301528360408301526080606083015261243260808301846123a0565b60208082526027908201527f617070656e64517565756542617463682069732063757272656e746c7920646960408201526639b0b13632b21760c91b606082015260800190565b60208082526029908201527f436f6e7465787420626c6f636b206e756d62657220746f6f2066617220696e206040820152683a3432903830b9ba1760b91b606082015260800190565b6020808252603d908201527f5472616e73616374696f6e20646174612073697a652065786365656473206d6160408201527f78696d756d20666f7220726f6c6c7570207472616e73616374696f6e2e000000606082015260800190565b6020808252602f908201527f436f6e746578742074696d657374616d70206973206c6f776572207468616e2060408201526e3630b9ba1039bab136b4ba3a32b21760891b606082015260800190565b6020808252605b908201527f50726576696f75736c7920656e7175657565642062617463686573206861766560408201527f206578706972656420616e64206d75737420626520617070656e64656420626560608201527f666f72652061206e65772073657175656e6365722062617463682e0000000000608082015260a00190565b6020808252602e908201527f496e76616c69642053657175656e636572207472616e73616374696f6e20696e60408201526d31b63ab9b4b7b710383937b7b31760911b606082015260800190565b60208082526032908201527f436f6e7465787420626c6f636b206e756d626572206973206c6f77657220746860408201527130b7103630b9ba1039bab136b4ba3a32b21760711b606082015260800190565b6020808252601e908201527f496e76616c69642053657175656e636572207472616e73616374696f6e2e0000604082015260600190565b6020808252603d908201527f5472616e73616374696f6e20676173206c696d69742065786365656473206d6160408201527f78696d756d20666f7220726f6c6c7570207472616e73616374696f6e2e000000606082015260800190565b60208082526028908201527f4d7573742070726f76696465206174206c65617374206f6e652062617463682060408201526731b7b73a32bc3a1760c11b606082015260800190565b6020808252602e908201527f4e6f7420616c6c2073657175656e636572207472616e73616374696f6e73207760408201526d32b93290383937b1b2b9b9b2b21760911b606082015260800190565b6020808252604a908201527f41637475616c207472616e73616374696f6e20696e64657820646f6573206e6f60408201527f74206d6174636820657870656374656420746f74616c20656c656d656e7473206060820152693a379030b83832b7321760b11b608082015260a00190565b60208082526028908201527f436f6e7465787420626c6f636b206e756d6265722069732066726f6d2074686560408201526710333aba3ab9329760c11b606082015260800190565b60208082526018908201527f496e76616c696420696e636c7573696f6e2070726f6f662e0000000000000000604082015260600190565b60208082526029908201527f5472616e73616374696f6e20676173206c696d697420746f6f206c6f7720746f6040820152681032b738bab2bab29760b91b606082015260800190565b60208082526043908201527f53657175656e636572207472616e73616374696f6e2074696d657374616d702060408201527f657863656564732074686174206f66206e65787420717565756520656c656d65606082015262373a1760e91b608082015260a00190565b6020808252603d908201527f41637475616c20626174636820737461727420696e64657820646f6573206e6f60408201527f74206d6174636820657870656374656420737461727420696e6465782e000000606082015260800190565b6020808252602d908201527f46756e6374696f6e2063616e206f6e6c792062652063616c6c6564206279207460408201526c34329029b2b8bab2b731b2b91760991b606082015260800190565b6020808252601a908201527f496e76616c6964205175657565207472616e73616374696f6e2e000000000000604082015260600190565b60208082526015908201527424b73b30b634b2103130ba31b4103432b0b232b91760591b604082015260600190565b60208082526025908201527f436f6e746578742074696d657374616d702069732066726f6d207468652066756040820152643a3ab9329760d91b606082015260800190565b6020808252602b908201527f496e73756666696369656e742067617320666f72204c322072617465206c696d60408201526a34ba34b73390313ab9371760a91b606082015260800190565b60208082526035908201527f436f6e746578742074696d657374616d702076616c756573206d757374206d6f6040820152743737ba37b734b1b0b6363c9034b731b932b0b9b29760591b606082015260800190565b6020808252602a908201527f496e76616c6964205175657565207472616e73616374696f6e20696e636c757360408201526934b7b710383937b7b31760b11b606082015260800190565b60208082526045908201527f53657175656e636572207472616e73616374696f6e20626c6f636b4e756d626560408201527f7220657863656564732074686174206f66206e65787420717565756520656c6560608201526436b2b73a1760d91b608082015260a00190565b60208082526021908201527f4d75737420617070656e64206174206c65617374206f6e6520656c656d656e746040820152601760f91b606082015260800190565b60208082526026908201527f436f6e746578742074696d657374616d7020746f6f2066617220696e20746865604082015265103830b9ba1760d11b606082015260800190565b60208082526022908201527f4e6f7420656e6f756768204261746368436f6e74657874732070726f76696465604082015261321760f11b606082015260800190565b60208082526029908201527f4e6f7420656e6f75676820717565756564207472616e73616374696f6e732074604082015268379030b83832b7321760b91b606082015260800190565b60208082526037908201527f436f6e7465787420626c6f636b4e756d6265722076616c756573206d7573742060408201527f6d6f6e6f746f6e6963616c6c7920696e6372656173652e000000000000000000606082015260800190565b8151815260208083015164ffffffffff90811691830191909152604092830151169181019190915260600190565b63ffffffff91909116815260200190565b64ffffffffff91909116815260200190565b64ffffffffff9384168152919092166020820152604081019190915260600190565b60405181810167ffffffffffffffff81118282101715612edd57fe5b60405291905056fe4f564d5f436861696e53746f72616765436f6e7461696e65723a4354433a71756575654f564d5f4465636f6d7072657373696f6e507265636f6d70696c65416464726573734c69625f4d65726b6c65547265653a20496e646578206f7574206f6620626f756e64732e4c69625f4d65726b6c65547265653a2043616e6e6f7420636f6d70757465206365696c286c6f675f3229206f6620302e4c69625f4d65726b6c65547265653a20546f74616c206c6561766573206d7573742062652067726561746572207468616e207a65726f2e4c69625f4d65726b6c65547265653a20546f74616c207369626c696e677320646f6573206e6f7420636f72726563746c7920636f72726573706f6e6420746f20746f74616c206c65617665732e4f564d5f436861696e53746f72616765436f6e7461696e65723a4354433a626174636865734c69625f4d65726b6c65547265653a204d7573742070726f76696465206174206c65617374206f6e65206c65616620686173682ea2646970667358221220e5d77a6634733b27dcdabf781fd1df7c095b7f821616f55c1b31d62a7238f9d764736f6c63430007060033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101425760003560e01c8063876ed5cb116100b8578063cfdf677e1161007c578063cfdf677e1461023f578063d0f8934414610247578063e10d29ee1461024f578063e561dddc14610257578063f722b41a1461025f578063facdc5da1461026757610142565b8063876ed5cb146102175780638d38c6c11461021f578063b8f7700514610227578063c139eb151461022f578063c2cf696f1461023757610142565b80634de569ce1161010a5780634de569ce146101c25780635ae6256d146101e25780636fee07e0146101ea57806378f4b2f2146101ff5780637a167a8a146102075780637aa63a861461020f57610142565b8063138387a414610147578063299ca478146101655780632a7f18be1461017a578063378997701461019a578063461a4478146101af575b600080fd5b61014f61027a565b60405161015c91906124c7565b60405180910390f35b61016d610280565b60405161015c91906123eb565b61018d610188366004612388565b61028f565b60405161015c9190612e4e565b6101a26102b0565b60405161015c9190612e8d565b61016d6101bd36600461221b565b6102c4565b6101d56101d0366004612261565b6103a0565b60405161015c9190612484565b6101a26103da565b6101fd6101f8366004612188565b6103ee565b005b61014f61066d565b6101a2610674565b61014f610689565b61014f6106a4565b61014f6106aa565b6101a26106b0565b61014f6106c7565b61014f6106cd565b61016d6106d2565b6101fd6106f5565b61016d610b69565b61014f610b8c565b6101a2610c06565b6101fd610275366004612388565b610c1e565b60025481565b6000546001600160a01b031681565b610297611ed9565b6102a8826102a3610b69565b610c36565b90505b919050565b6000806102bb610d76565b50935050505090565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b8381101561032457818101518382015260200161030c565b50505050905090810190601f1680156103515780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561036e57600080fd5b505afa158015610382573d6000803e3d6000fd5b505050506040513d602081101561039857600080fd5b505192915050565b82516000901515600114156103c2576103bb85858585610e24565b90506103d2565b6103bb8585602001518585610fef565b949350505050565b6000806103e5610d76565b94505050505090565b61c3508151111561041a5760405162461bcd60e51b81526004016104119061259b565b60405180910390fd5b60035482111561043c5760405162461bcd60e51b8152600401610411906127a1565b620186a082101561045f5760405162461bcd60e51b815260040161041190612983565b6020820460005a90508181116104875760405162461bcd60e51b815260040161041190612b8a565b60005b825a8303101561049c5760010161048a565b6000338787876040516020016104b594939291906123ff565b60408051601f19818403018152919052805160209091012090504360281b421760006104df610b69565b60405163b298e36b60e01b81529091506001600160a01b0382169063b298e36b9061050e9086906004016124c7565b600060405180830381600087803b15801561052857600080fd5b505af115801561053c573d6000803e3d6000fd5b505060405163b298e36b60e01b81526001600160a01b038416925063b298e36b915061056c9085906004016124c7565b600060405180830381600087803b15801561058657600080fd5b505af115801561059a573d6000803e3d6000fd5b50505050600060016002836001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b1580156105dd57600080fd5b505afa1580156105f1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106159190612203565b8161061c57fe5b040390507f4b388aecf9fa6cc92253704e5975a6129a4f735bdbd99567df4ed0094ee4ceb5338b8b8b85426040516106599695949392919061243c565b60405180910390a150505050505050505050565b620186a081565b60008061067f610d76565b5090935050505090565b600080610694610d76565b50505064ffffffffff1692915050565b61c35081565b60035481565b60006106c26106bd610b69565b6110c4565b905090565b60015481565b602081565b60006106c2604051806060016040528060258152602001613003602591396102c4565b60043560d81c60093560e890811c90600c35901c610711610689565b8364ffffffffff16146107365760405162461bcd60e51b815260040161041190612a35565b6107646040518060400160405280600d81526020016c27ab26afa9b2b8bab2b731b2b960991b8152506102c4565b6001600160a01b0316336001600160a01b0316146107945760405162461bcd60e51b815260040161041190612a92565b60008162ffffff16116107b95760405162461bcd60e51b8152600401610411906127fe565b60008262ffffff16116107de5760405162461bcd60e51b815260040161041190612cdf565b600f601062ffffff8316020164ffffffffff81163610156108115760405162461bcd60e51b815260040161041190612d66565b600061081b610b69565b90506000610828826110c4565b9050600062ffffff8616368161083a57fe5b0460020267ffffffffffffffff8111801561085457600080fd5b506040519080825280601f01601f19166020018201604052801561087f576020820181803683370190505b50905060008662ffffff1667ffffffffffffffff811180156108a057600080fd5b506040519080825280602002602001820160405280156108ca578160200160208202803683370190505b50905060008060006108da610674565b90506108e4611ef9565b60005b8a62ffffff168163ffffffff161015610a3b57600061090b8263ffffffff16611147565b905063ffffffff82166109215761092181611197565b61092d8382868d611264565b80925060005b835163ffffffff821610156109b1578b3560e81c61c3508111156109695760405162461bcd60e51b81526004016104119061259b565b61097c858e64ffffffffff16838d6112cf565b898963ffffffff168151811061098e57fe5b60209081029190910101529b909b016003019a6001968701969586019501610933565b5060005b83602001518163ffffffff161015610a31578964ffffffffff168564ffffffffff16106109f45760405162461bcd60e51b815260040161041190612da8565b610a048564ffffffffff16611363565b888863ffffffff1681518110610a1657fe5b602090810291909101015260019687019694850194016109b5565b50506001016108e7565b50610a488183898b6113a8565b3664ffffffffff8a1614610a6e5760405162461bcd60e51b815260040161041190612846565b8a62ffffff168463ffffffff1614610a985760405162461bcd60e51b815260040161041190612894565b6000838c62ffffff160363ffffffff169050600080836020015160001415610acb57505060408201516060830151610af3565b6000610ae16001870364ffffffffff168d610c36565b90508060200151925080604001519150505b610b14610aff8961141b565b8f62ffffff168564ffffffffff16858561184f565b7f602f1aeac0ca2e7a13e281a9ef0ad7838542712ce16780fa2ecffd351f05f89983860384610b41610689565b604051610b5093929190612e9f565b60405180910390a1505050505050505050505050505050565b60006106c2604051806060016040528060238152602001612ee6602391396102c4565b6000610b966106d2565b6001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b158015610bce57600080fd5b505afa158015610be2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106c29190612203565b6000610c10610674565b610c186106b0565b03905090565b60405162461bcd60e51b81526004016104119061250b565b610c3e611ed9565b604051634a83e9cd60e11b815260028402906000906001600160a01b03851690639507d39a90610c72908590600401612e8d565b60206040518083038186803b158015610c8a57600080fd5b505afa158015610c9e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cc29190612203565b90506000846001600160a01b0316639507d39a846001016040518263ffffffff1660e01b8152600401610cf59190612e8d565b60206040518083038186803b158015610d0d57600080fd5b505afa158015610d21573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d459190612203565b6040805160608101825293845264ffffffffff828116602086015260289290921c9091169083015250949350505050565b6000806000806000610d866106d2565b6001600160a01b031663ccf8f9696040518163ffffffff1660e01b815260040160206040518083038186803b158015610dbe57600080fd5b505afa158015610dd2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610df691906121dd565b64ffffffffff602882901c811697605083901c82169750607883901c8216965060a09290921c169350915050565b600080610e5c6040518060400160405280601481526020017327ab26afa2bc32b1baba34b7b726b0b730b3b2b960611b8152506102c4565b90506000816001600160a01b0316631c4712a76040518163ffffffff1660e01b815260040160206040518083038186803b158015610e9957600080fd5b505afa158015610ead573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ed19190612203565b90506000610ede87611a02565b9050610eeb818787611a9b565b610f075760405162461bcd60e51b8152600401610411906126ca565b86606001518860200151148015610f22575060408701518851145b8015610f635750610f4a604051806060016040528060228152602001612f09602291396102c4565b6001600160a01b031688608001516001600160a01b0316145b8015610f725750818860a00151145b8015610f89575060608801516001600160a01b0316155b8015610fa45750600088604001516001811115610fa257fe5b145b8015610fc557508660800151805190602001208860c0015180519060200120145b610fe15760405162461bcd60e51b81526004016104119061276a565b506001979650505050505050565b600080610ffb85611363565b9050611008818585611a9b565b6110245760405162461bcd60e51b815260040161041190612c2a565b6000866060015187608001518860a001518960c0015160405160200161104d94939291906123ff565b60405160208183030381529060405280519060200120905060006110708761028f565b80519091508214801561108e57508751602082015164ffffffffff16145b80156110a857508760200151816040015164ffffffffff16145b610fe15760405162461bcd60e51b815260040161041190612adf565b60006002826001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b15801561110157600080fd5b505afa158015611115573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111399190612203565b8161114057fe5b0492915050565b61114f611ef9565b5060408051608081018252601092909202600f81013560e890811c84526012820135901c6020840152601581013560d890811c92840192909252601a0135901c606082015290565b60006111a1610689565b1115611211576000806111b2610d76565b9350935050508064ffffffffff16836060015110156111e35760405162461bcd60e51b815260040161041190612718565b8164ffffffffff168360400151101561120e5760405162461bcd60e51b8152600401610411906125f8565b50505b4260015482604001510110156112395760405162461bcd60e51b815260040161041190612d20565b4360025482606001510110156112615760405162461bcd60e51b815260040161041190612552565b50565b83604001518360400151101561128c5760405162461bcd60e51b815260040161041190612bd5565b8360600151836060015110156112b45760405162461bcd60e51b815260040161041190612df1565b6020830151156112c9576112c9838383611b8c565b50505050565b60008151836041011115611326578260410167ffffffffffffffff811180156112f757600080fd5b506040519080825280601f01601f191660200182016040528015611322576020820181803683370190505b5091505b6040850151606086015160006020850160018153836001820152826021820152866003890160418301376041870190209350505050949350505050565b60006102a86040518060a00160405280600015158152602001848152602001600081526020016000815260200160405180602001604052806000815250815250611c2d565b600083830364ffffffffff161180156113c357506020840151155b156113d3576113d3848483611b8c565b42846040015111156113f75760405162461bcd60e51b815260040161041190612b45565b43846060015111156112c95760405162461bcd60e51b815260040161041190612904565b60008082511161145c5760405162461bcd60e51b81526004018080602001828103825260348152602001806130286034913960400191505060405180910390fd5b815160011415611482578160008151811061147357fe5b602002602001015190506102ab565b60408051610200810182527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56381527f633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d60208201527f890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d818301527f3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd86060808301919091527fecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da60808301527fdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da560a08301527f617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d760c08301527f292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead60e08301527fe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e106101008301527f7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f826101208301527fe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e836365166101408301527f3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c6101608301527fad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e6101808301527fa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab6101a08301527f4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c8626101c08301527f2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf106101e083015282518381529081018352909160009190602082018180368337505085519192506000918291508180805b600184111561182b5750506002820460018084161460005b828110156117a7578a816002028151811061174e57fe5b602002602001015196508a816002026001018151811061176a57fe5b6020026020010151955086602089015285604089015287805190602001208b828151811061179457fe5b6020908102919091010152600101611737565b50801561180a578960018503815181106117bd57fe5b602002602001015195508783601081106117d357fe5b602002015160001b945085602088015284604088015286805190602001208a83815181106117fd57fe5b6020026020010181815250505b80611816576000611819565b60015b60ff168201935060019092019161171f565b8960008151811061183857fe5b602002602001015198505050505050505050919050565b60006118596106d2565b9050600080611866610d76565b50509150915060006040518060a00160405280856001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b1580156118b257600080fd5b505afa1580156118c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118ea9190612203565b81526020018a81526020018981526020018464ffffffffff16815260200160405180602001604052806000815250815250905080600001517f127186556e7be68c7e31263195225b4de02820707889540969f62c05cf73525e826020015183604001518460600151856080015160405161196794939291906124e6565b60405180910390a2600061197a82611c75565b90506000611992836040015186018a86018a8a611c9e565b60405163080549db60e21b81529091506001600160a01b03871690632015276c906119c390859085906004016124d0565b600060405180830381600087803b1580156119dd57600080fd5b505af11580156119f1573d6000803e3d6000fd5b505050505050505050505050505050565b6080810151805160009190826041820167ffffffffffffffff81118015611a2857600080fd5b506040519080825280601f01601f191660200182016040528015611a53576020820181803683370190505b5060408601516060870151919250906000602084016001815383600182015282602182015285604182018760208a0160045afa50604190950190942095505050505050919050565b6000611aa56106d2565b8351604051634a83e9cd60e11b81526001600160a01b039290921691639507d39a91611ad391600401612e7c565b60206040518083038186803b158015611aeb57600080fd5b505afa158015611aff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b239190612203565b611b2c84611c75565b14611b495760405162461bcd60e51b815260040161041190612b16565b611b66836020015185846000015185602001518760400151611cbd565b611b825760405162461bcd60e51b81526004016104119061294c565b5060019392505050565b6000611b9f8364ffffffffff1683610c36565b9050600154816020015164ffffffffff16014210611bcf5760405162461bcd60e51b815260040161041190612647565b806020015164ffffffffff1684604001511115611bfe5760405162461bcd60e51b8152600401610411906129cc565b806040015164ffffffffff16846060015111156112c95760405162461bcd60e51b815260040161041190612c74565b8051602080830151604080850151606086015160808701519251600096611c5896909594910161248f565b604051602081830303815290604052805190602001209050919050565b60008160200151826040015183606001518460800151604051602001611c5894939291906124e6565b602892831b9390931760509190911b1760789290921b91909117901b90565b6000808211611cfd5760405162461bcd60e51b8152600401808060200182810382526037815260200180612f7f6037913960400191505060405180910390fd5b818410611d3b5760405162461bcd60e51b8152600401808060200182810382526024815260200180612f2b6024913960400191505060405180910390fd5b611d4482611e42565b835114611d825760405162461bcd60e51b815260040180806020018281038252604d815260200180612fb6604d913960600191505060405180910390fd5b8460005b8451811015611e35578560011660011415611de457848181518110611da757fe5b6020026020010151826040516020018083815260200182815260200192505050604051602081830303815290604052805190602001209150611e29565b81858281518110611df157fe5b602002602001015160405160200180838152602001828152602001925050506040516020818303038152906040528051906020012091505b600195861c9501611d86565b5090951495945050505050565b6000808211611e825760405162461bcd60e51b8152600401808060200182810382526030815260200180612f4f6030913960400191505060405180910390fd5b8160011415611e93575060006102ab565b81600060805b60018110611ec3576000196001821b01811b831615611ebb5791821c91908101905b60011c611e99565b506001811b8414611ed2576001015b9392505050565b604080516060810182526000808252602082018190529181019190915290565b6040518060800160405280600081526020016000815260200160008152602001600081525090565b600067ffffffffffffffff831115611f3557fe5b611f48601f8401601f1916602001612ec1565b9050828152838383011115611f5c57600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b03811681146102ab57600080fd5b600082601f830112611f9a578081fd5b611ed283833560208501611f21565b8035600281106102ab57600080fd5b600060a08284031215611fc9578081fd5b60405160a0810167ffffffffffffffff8282108183111715611fe757fe5b8160405282935084358352602085013560208401526040850135604084015260608501356060840152608085013591508082111561202457600080fd5b5061203185828601611f8a565b6080830152505092915050565b60006040828403121561204f578081fd5b6040516040810167ffffffffffffffff828210818311171561206d57fe5b816040528293508435835260209150818501358181111561208d57600080fd5b8501601f8101871361209e57600080fd5b8035828111156120aa57fe5b83810292506120ba848401612ec1565b8181528481019083860185850187018b10156120d557600080fd5b600095505b838610156120f85780358352600195909501949186019186016120da565b5080868801525050505050505092915050565b600060a0828403121561211c578081fd5b60405160a0810167ffffffffffffffff828210818311171561213a57fe5b8160405282935084359150811515821461215357600080fd5b818352602085013560208401526040850135604084015260608501356060840152608085013591508082111561202457600080fd5b60008060006060848603121561219c578283fd5b6121a584611f73565b925060208401359150604084013567ffffffffffffffff8111156121c7578182fd5b6121d386828701611f8a565b9150509250925092565b6000602082840312156121ee578081fd5b815164ffffffffff1981168114611ed2578182fd5b600060208284031215612214578081fd5b5051919050565b60006020828403121561222c578081fd5b813567ffffffffffffffff811115612242578182fd5b8201601f81018413612252578182fd5b6103d284823560208401611f21565b60008060008060808587031215612276578081fd5b843567ffffffffffffffff8082111561228d578283fd5b9086019060e082890312156122a0578283fd5b6122aa60e0612ec1565b82358152602083013560208201526122c460408401611fa9565b60408201526122d560608401611f73565b60608201526122e660808401611f73565b608082015260a083013560a082015260c083013582811115612306578485fd5b6123128a828601611f8a565b60c0830152509550602087013591508082111561232d578283fd5b6123398883890161210b565b9450604087013591508082111561234e578283fd5b61235a88838901611fb8565b9350606087013591508082111561236f578283fd5b5061237c8782880161203e565b91505092959194509250565b600060208284031215612399578081fd5b5035919050565b60008151808452815b818110156123c5576020818501810151868301820152016123a9565b818111156123d65782602083870101525b50601f01601f19169290920160200192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612432908301846123a0565b9695505050505050565b6001600160a01b038781168252861660208201526040810185905260c06060820181905260009061246f908301866123a0565b60808301949094525060a00152949350505050565b901515815260200190565b6000861515825285602083015284604083015283606083015260a060808301526124bc60a08301846123a0565b979650505050505050565b90815260200190565b91825264ffffffffff1916602082015260400190565b60008582528460208301528360408301526080606083015261243260808301846123a0565b60208082526027908201527f617070656e64517565756542617463682069732063757272656e746c7920646960408201526639b0b13632b21760c91b606082015260800190565b60208082526029908201527f436f6e7465787420626c6f636b206e756d62657220746f6f2066617220696e206040820152683a3432903830b9ba1760b91b606082015260800190565b6020808252603d908201527f5472616e73616374696f6e20646174612073697a652065786365656473206d6160408201527f78696d756d20666f7220726f6c6c7570207472616e73616374696f6e2e000000606082015260800190565b6020808252602f908201527f436f6e746578742074696d657374616d70206973206c6f776572207468616e2060408201526e3630b9ba1039bab136b4ba3a32b21760891b606082015260800190565b6020808252605b908201527f50726576696f75736c7920656e7175657565642062617463686573206861766560408201527f206578706972656420616e64206d75737420626520617070656e64656420626560608201527f666f72652061206e65772073657175656e6365722062617463682e0000000000608082015260a00190565b6020808252602e908201527f496e76616c69642053657175656e636572207472616e73616374696f6e20696e60408201526d31b63ab9b4b7b710383937b7b31760911b606082015260800190565b60208082526032908201527f436f6e7465787420626c6f636b206e756d626572206973206c6f77657220746860408201527130b7103630b9ba1039bab136b4ba3a32b21760711b606082015260800190565b6020808252601e908201527f496e76616c69642053657175656e636572207472616e73616374696f6e2e0000604082015260600190565b6020808252603d908201527f5472616e73616374696f6e20676173206c696d69742065786365656473206d6160408201527f78696d756d20666f7220726f6c6c7570207472616e73616374696f6e2e000000606082015260800190565b60208082526028908201527f4d7573742070726f76696465206174206c65617374206f6e652062617463682060408201526731b7b73a32bc3a1760c11b606082015260800190565b6020808252602e908201527f4e6f7420616c6c2073657175656e636572207472616e73616374696f6e73207760408201526d32b93290383937b1b2b9b9b2b21760911b606082015260800190565b6020808252604a908201527f41637475616c207472616e73616374696f6e20696e64657820646f6573206e6f60408201527f74206d6174636820657870656374656420746f74616c20656c656d656e7473206060820152693a379030b83832b7321760b11b608082015260a00190565b60208082526028908201527f436f6e7465787420626c6f636b206e756d6265722069732066726f6d2074686560408201526710333aba3ab9329760c11b606082015260800190565b60208082526018908201527f496e76616c696420696e636c7573696f6e2070726f6f662e0000000000000000604082015260600190565b60208082526029908201527f5472616e73616374696f6e20676173206c696d697420746f6f206c6f7720746f6040820152681032b738bab2bab29760b91b606082015260800190565b60208082526043908201527f53657175656e636572207472616e73616374696f6e2074696d657374616d702060408201527f657863656564732074686174206f66206e65787420717565756520656c656d65606082015262373a1760e91b608082015260a00190565b6020808252603d908201527f41637475616c20626174636820737461727420696e64657820646f6573206e6f60408201527f74206d6174636820657870656374656420737461727420696e6465782e000000606082015260800190565b6020808252602d908201527f46756e6374696f6e2063616e206f6e6c792062652063616c6c6564206279207460408201526c34329029b2b8bab2b731b2b91760991b606082015260800190565b6020808252601a908201527f496e76616c6964205175657565207472616e73616374696f6e2e000000000000604082015260600190565b60208082526015908201527424b73b30b634b2103130ba31b4103432b0b232b91760591b604082015260600190565b60208082526025908201527f436f6e746578742074696d657374616d702069732066726f6d207468652066756040820152643a3ab9329760d91b606082015260800190565b6020808252602b908201527f496e73756666696369656e742067617320666f72204c322072617465206c696d60408201526a34ba34b73390313ab9371760a91b606082015260800190565b60208082526035908201527f436f6e746578742074696d657374616d702076616c756573206d757374206d6f6040820152743737ba37b734b1b0b6363c9034b731b932b0b9b29760591b606082015260800190565b6020808252602a908201527f496e76616c6964205175657565207472616e73616374696f6e20696e636c757360408201526934b7b710383937b7b31760b11b606082015260800190565b60208082526045908201527f53657175656e636572207472616e73616374696f6e20626c6f636b4e756d626560408201527f7220657863656564732074686174206f66206e65787420717565756520656c6560608201526436b2b73a1760d91b608082015260a00190565b60208082526021908201527f4d75737420617070656e64206174206c65617374206f6e6520656c656d656e746040820152601760f91b606082015260800190565b60208082526026908201527f436f6e746578742074696d657374616d7020746f6f2066617220696e20746865604082015265103830b9ba1760d11b606082015260800190565b60208082526022908201527f4e6f7420656e6f756768204261746368436f6e74657874732070726f76696465604082015261321760f11b606082015260800190565b60208082526029908201527f4e6f7420656e6f75676820717565756564207472616e73616374696f6e732074604082015268379030b83832b7321760b91b606082015260800190565b60208082526037908201527f436f6e7465787420626c6f636b4e756d6265722076616c756573206d7573742060408201527f6d6f6e6f746f6e6963616c6c7920696e6372656173652e000000000000000000606082015260800190565b8151815260208083015164ffffffffff90811691830191909152604092830151169181019190915260600190565b63ffffffff91909116815260200190565b64ffffffffff91909116815260200190565b64ffffffffff9384168152919092166020820152604081019190915260600190565b60405181810167ffffffffffffffff81118282101715612edd57fe5b60405291905056fe4f564d5f436861696e53746f72616765436f6e7461696e65723a4354433a71756575654f564d5f4465636f6d7072657373696f6e507265636f6d70696c65416464726573734c69625f4d65726b6c65547265653a20496e646578206f7574206f6620626f756e64732e4c69625f4d65726b6c65547265653a2043616e6e6f7420636f6d70757465206365696c286c6f675f3229206f6620302e4c69625f4d65726b6c65547265653a20546f74616c206c6561766573206d7573742062652067726561746572207468616e207a65726f2e4c69625f4d65726b6c65547265653a20546f74616c207369626c696e677320646f6573206e6f7420636f72726563746c7920636f72726573706f6e6420746f20746f74616c206c65617665732e4f564d5f436861696e53746f72616765436f6e7461696e65723a4354433a626174636865734c69625f4d65726b6c65547265653a204d7573742070726f76696465206174206c65617374206f6e65206c65616620686173682ea2646970667358221220e5d77a6634733b27dcdabf781fd1df7c095b7f821616f55c1b31d62a7238f9d764736f6c63430007060033", - "devdoc": { - "details": "The Canonical Transaction Chain (CTC) contract is an append-only log of transactions which must be applied to the rollup state. It defines the ordering of rollup transactions by writing them to the 'CTC:batches' instance of the Chain Storage Container. The CTC also allows any account to 'enqueue' an L2 transaction, which will require that the Sequencer will eventually append it to the rollup state. If the Sequencer does not include an enqueued transaction within the 'force inclusion period', then any account may force it to be included by calling appendQueueBatch(). Compiler used: solc Runtime target: EVM", - "kind": "dev", - "methods": { - "appendSequencerBatch()": { - "details": "This function uses a custom encoding scheme for efficiency reasons. .param _shouldStartAtElement Specific batch we expect to start appending to. .param _totalElementsToAppend Total number of batch elements we expect to append. .param _contexts Array of batch contexts. .param _transactionDataFields Array of raw transaction data." - }, - "batches()": { - "returns": { - "_0": "Reference to the batch storage container." - } - }, - "enqueue(address,uint256,bytes)": { - "params": { - "_data": "Transaction data.", - "_gasLimit": "Gas limit for the enqueued L2 transaction.", - "_target": "Target L2 contract to send the transaction to." - } - }, - "getLastBlockNumber()": { - "returns": { - "_0": "Blocknumber for the last transaction." - } - }, - "getLastTimestamp()": { - "returns": { - "_0": "Timestamp for the last transaction." - } - }, - "getNextQueueIndex()": { - "returns": { - "_0": "Index for the next queue element." - } - }, - "getNumPendingQueueElements()": { - "returns": { - "_0": "Number of pending queue elements." - } - }, - "getQueueElement(uint256)": { - "params": { - "_index": "Index of the queue element to access." - }, - "returns": { - "_element": "Queue element at the given index." - } - }, - "getQueueLength()": { - "returns": { - "_0": "Length of the queue." - } - }, - "getTotalBatches()": { - "returns": { - "_totalBatches": "Total submitted batches." - } - }, - "getTotalElements()": { - "returns": { - "_totalElements": "Total submitted elements." - } - }, - "queue()": { - "returns": { - "_0": "Reference to the queue storage container." - } - }, - "resolve(string)": { - "params": { - "_name": "Name to resolve an address for." - }, - "returns": { - "_0": "Address associated with the given name." - } - }, - "verifyTransaction((uint256,uint256,uint8,address,address,uint256,bytes),(bool,uint256,uint256,uint256,bytes),(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))": { - "params": { - "_batchHeader": "Header of the batch the transaction was included in.", - "_inclusionProof": "Inclusion proof for the provided transaction chain element.", - "_transaction": "Transaction to verify.", - "_txChainElement": "Transaction chain element corresponding to the transaction." - }, - "returns": { - "_0": "True if the transaction exists in the CTC, false if not." - } - } - }, - "title": "OVM_CanonicalTransactionChain", - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": { - "appendQueueBatch(uint256)": { - "notice": "Appends a given number of queued transactions as a single batch. param _numQueuedTransactions Number of transactions to append." - }, - "appendSequencerBatch()": { - "notice": "Allows the sequencer to append a batch of transactions." - }, - "batches()": { - "notice": "Accesses the batch storage container." - }, - "enqueue(address,uint256,bytes)": { - "notice": "Adds a transaction to the queue." - }, - "getLastBlockNumber()": { - "notice": "Returns the blocknumber of the last transaction." - }, - "getLastTimestamp()": { - "notice": "Returns the timestamp of the last transaction." - }, - "getNextQueueIndex()": { - "notice": "Returns the index of the next element to be enqueued." - }, - "getNumPendingQueueElements()": { - "notice": "Get the number of queue elements which have not yet been included." - }, - "getQueueElement(uint256)": { - "notice": "Gets the queue element at a particular index." - }, - "getQueueLength()": { - "notice": "Retrieves the length of the queue, including both pending and canonical transactions." - }, - "getTotalBatches()": { - "notice": "Retrieves the total number of batches submitted." - }, - "getTotalElements()": { - "notice": "Retrieves the total number of elements submitted." - }, - "queue()": { - "notice": "Accesses the queue storage container." - }, - "resolve(string)": { - "notice": "Resolves the address associated with a given name." - }, - "verifyTransaction((uint256,uint256,uint8,address,address,uint256,bytes),(bool,uint256,uint256,uint256,bytes),(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))": { - "notice": "Verifies whether a transaction is included in the chain." - } - }, - "version": 1 - }, - "storageLayout": { - "storage": [ - { - "astId": 12800, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_CanonicalTransactionChain.sol:OVM_CanonicalTransactionChain", - "label": "libAddressManager", - "offset": 0, - "slot": "0", - "type": "t_contract(Lib_AddressManager)12793" - }, - { - "astId": 2943, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_CanonicalTransactionChain.sol:OVM_CanonicalTransactionChain", - "label": "forceInclusionPeriodSeconds", - "offset": 0, - "slot": "1", - "type": "t_uint256" - }, - { - "astId": 2945, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_CanonicalTransactionChain.sol:OVM_CanonicalTransactionChain", - "label": "forceInclusionPeriodBlocks", - "offset": 0, - "slot": "2", - "type": "t_uint256" - }, - { - "astId": 2947, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_CanonicalTransactionChain.sol:OVM_CanonicalTransactionChain", - "label": "maxTransactionGasLimit", - "offset": 0, - "slot": "3", - "type": "t_uint256" - } - ], - "types": { - "t_contract(Lib_AddressManager)12793": { - "encoding": "inplace", - "label": "contract Lib_AddressManager", - "numberOfBytes": "20" - }, - "t_uint256": { - "encoding": "inplace", - "label": "uint256", - "numberOfBytes": "32" - } - } - } -} \ No newline at end of file diff --git a/packages/contracts/deployments/kovan-v3/OVM_ExecutionManager.json b/packages/contracts/deployments/kovan-v3/OVM_ExecutionManager.json deleted file mode 100644 index 2a066f76e0024..0000000000000 --- a/packages/contracts/deployments/kovan-v3/OVM_ExecutionManager.json +++ /dev/null @@ -1,1269 +0,0 @@ -{ - "address": "0xa2EB1961183a04157fF707Fa2Be2249e149c8FAB", - "abi": [ - { - "inputs": [ - { - "internalType": "address", - "name": "_libAddressManager", - "type": "address" - }, - { - "components": [ - { - "internalType": "uint256", - "name": "minTransactionGasLimit", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "maxTransactionGasLimit", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "maxGasPerQueuePerEpoch", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "secondsPerEpoch", - "type": "uint256" - } - ], - "internalType": "struct iOVM_ExecutionManager.GasMeterConfig", - "name": "_gasMeterConfig", - "type": "tuple" - }, - { - "components": [ - { - "internalType": "uint256", - "name": "ovmCHAINID", - "type": "uint256" - } - ], - "internalType": "struct iOVM_ExecutionManager.GlobalContext", - "name": "_globalContext", - "type": "tuple" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "inputs": [], - "name": "getMaxTransactionGasLimit", - "outputs": [ - { - "internalType": "uint256", - "name": "_maxTransactionGasLimit", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "libAddressManager", - "outputs": [ - { - "internalType": "contract Lib_AddressManager", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "ovmADDRESS", - "outputs": [ - { - "internalType": "address", - "name": "_ADDRESS", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_gasLimit", - "type": "uint256" - }, - { - "internalType": "address", - "name": "_address", - "type": "address" - }, - { - "internalType": "bytes", - "name": "_calldata", - "type": "bytes" - } - ], - "name": "ovmCALL", - "outputs": [ - { - "internalType": "bool", - "name": "_success", - "type": "bool" - }, - { - "internalType": "bytes", - "name": "_returndata", - "type": "bytes" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "ovmCALLER", - "outputs": [ - { - "internalType": "address", - "name": "_CALLER", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "ovmCHAINID", - "outputs": [ - { - "internalType": "uint256", - "name": "_CHAINID", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes", - "name": "_bytecode", - "type": "bytes" - } - ], - "name": "ovmCREATE", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - }, - { - "internalType": "bytes", - "name": "", - "type": "bytes" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes", - "name": "_bytecode", - "type": "bytes" - }, - { - "internalType": "bytes32", - "name": "_salt", - "type": "bytes32" - } - ], - "name": "ovmCREATE2", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - }, - { - "internalType": "bytes", - "name": "", - "type": "bytes" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "_messageHash", - "type": "bytes32" - }, - { - "internalType": "uint8", - "name": "_v", - "type": "uint8" - }, - { - "internalType": "bytes32", - "name": "_r", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "_s", - "type": "bytes32" - } - ], - "name": "ovmCREATEEOA", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_gasLimit", - "type": "uint256" - }, - { - "internalType": "address", - "name": "_address", - "type": "address" - }, - { - "internalType": "bytes", - "name": "_calldata", - "type": "bytes" - } - ], - "name": "ovmDELEGATECALL", - "outputs": [ - { - "internalType": "bool", - "name": "_success", - "type": "bool" - }, - { - "internalType": "bytes", - "name": "_returndata", - "type": "bytes" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_contract", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_offset", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_length", - "type": "uint256" - } - ], - "name": "ovmEXTCODECOPY", - "outputs": [ - { - "internalType": "bytes", - "name": "_code", - "type": "bytes" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_contract", - "type": "address" - } - ], - "name": "ovmEXTCODEHASH", - "outputs": [ - { - "internalType": "bytes32", - "name": "_EXTCODEHASH", - "type": "bytes32" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_contract", - "type": "address" - } - ], - "name": "ovmEXTCODESIZE", - "outputs": [ - { - "internalType": "uint256", - "name": "_EXTCODESIZE", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "ovmGASLIMIT", - "outputs": [ - { - "internalType": "uint256", - "name": "_GASLIMIT", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "ovmGETNONCE", - "outputs": [ - { - "internalType": "uint256", - "name": "_nonce", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "ovmINCREMENTNONCE", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "ovmL1QUEUEORIGIN", - "outputs": [ - { - "internalType": "enum Lib_OVMCodec.QueueOrigin", - "name": "_queueOrigin", - "type": "uint8" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "ovmL1TXORIGIN", - "outputs": [ - { - "internalType": "address", - "name": "_l1TxOrigin", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "ovmNUMBER", - "outputs": [ - { - "internalType": "uint256", - "name": "_NUMBER", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes", - "name": "_data", - "type": "bytes" - } - ], - "name": "ovmREVERT", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "_key", - "type": "bytes32" - } - ], - "name": "ovmSLOAD", - "outputs": [ - { - "internalType": "bytes32", - "name": "_value", - "type": "bytes32" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "_key", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "_value", - "type": "bytes32" - } - ], - "name": "ovmSSTORE", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_gasLimit", - "type": "uint256" - }, - { - "internalType": "address", - "name": "_address", - "type": "address" - }, - { - "internalType": "bytes", - "name": "_calldata", - "type": "bytes" - } - ], - "name": "ovmSTATICCALL", - "outputs": [ - { - "internalType": "bool", - "name": "_success", - "type": "bool" - }, - { - "internalType": "bytes", - "name": "_returndata", - "type": "bytes" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "ovmTIMESTAMP", - "outputs": [ - { - "internalType": "uint256", - "name": "_TIMESTAMP", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "string", - "name": "_name", - "type": "string" - } - ], - "name": "resolve", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "components": [ - { - "internalType": "uint256", - "name": "timestamp", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "blockNumber", - "type": "uint256" - }, - { - "internalType": "enum Lib_OVMCodec.QueueOrigin", - "name": "l1QueueOrigin", - "type": "uint8" - }, - { - "internalType": "address", - "name": "l1TxOrigin", - "type": "address" - }, - { - "internalType": "address", - "name": "entrypoint", - "type": "address" - }, - { - "internalType": "uint256", - "name": "gasLimit", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "data", - "type": "bytes" - } - ], - "internalType": "struct Lib_OVMCodec.Transaction", - "name": "_transaction", - "type": "tuple" - }, - { - "internalType": "address", - "name": "_ovmStateManager", - "type": "address" - } - ], - "name": "run", - "outputs": [ - { - "internalType": "bytes", - "name": "", - "type": "bytes" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_gasLimit", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "_creationCode", - "type": "bytes" - }, - { - "internalType": "address", - "name": "_address", - "type": "address" - } - ], - "name": "safeCREATE", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "components": [ - { - "internalType": "uint256", - "name": "timestamp", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "blockNumber", - "type": "uint256" - }, - { - "internalType": "enum Lib_OVMCodec.QueueOrigin", - "name": "l1QueueOrigin", - "type": "uint8" - }, - { - "internalType": "address", - "name": "l1TxOrigin", - "type": "address" - }, - { - "internalType": "address", - "name": "entrypoint", - "type": "address" - }, - { - "internalType": "uint256", - "name": "gasLimit", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "data", - "type": "bytes" - } - ], - "internalType": "struct Lib_OVMCodec.Transaction", - "name": "_transaction", - "type": "tuple" - }, - { - "internalType": "address", - "name": "_from", - "type": "address" - }, - { - "internalType": "contract iOVM_StateManager", - "name": "_ovmStateManager", - "type": "address" - } - ], - "name": "simulateMessage", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - }, - { - "internalType": "bytes", - "name": "", - "type": "bytes" - } - ], - "stateMutability": "nonpayable", - "type": "function" - } - ], - "transactionHash": "0x8da706bbdc66066481106f6452161e0f6ad95f928a10f6a86b7175a52f2057c5", - "receipt": { - "to": null, - "from": "0x18394B52d3Cb931dfA76F63251919D051953413d", - "contractAddress": "0xa2EB1961183a04157fF707Fa2Be2249e149c8FAB", - "transactionIndex": 1, - "gasUsed": "2901234", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0xe33c92c8c1fef82666476fb549221769ae5c6ec66490489f8c123a07b6a0d115", - "transactionHash": "0x8da706bbdc66066481106f6452161e0f6ad95f928a10f6a86b7175a52f2057c5", - "logs": [], - "blockNumber": 24572845, - "cumulativeGasUsed": "3041792", - "status": 1, - "byzantium": true - }, - "args": [ - "0xd56F695e73286ac252A37593DD4E7c14270eC1Df", - { - "minTransactionGasLimit": 50000, - "maxTransactionGasLimit": 9000000, - "maxGasPerQueuePerEpoch": 250000000, - "secondsPerEpoch": 0 - }, - { - "ovmCHAINID": 420 - } - ], - "solcInputHash": "5ee8e508e2c54cb5ac6783b4855b1558", - "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"minTransactionGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxTransactionGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxGasPerQueuePerEpoch\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"secondsPerEpoch\",\"type\":\"uint256\"}],\"internalType\":\"struct iOVM_ExecutionManager.GasMeterConfig\",\"name\":\"_gasMeterConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"ovmCHAINID\",\"type\":\"uint256\"}],\"internalType\":\"struct iOVM_ExecutionManager.GlobalContext\",\"name\":\"_globalContext\",\"type\":\"tuple\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"getMaxTransactionGasLimit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_maxTransactionGasLimit\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ovmADDRESS\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"_ADDRESS\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_address\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_calldata\",\"type\":\"bytes\"}],\"name\":\"ovmCALL\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"_success\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"_returndata\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ovmCALLER\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"_CALLER\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ovmCHAINID\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_CHAINID\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_bytecode\",\"type\":\"bytes\"}],\"name\":\"ovmCREATE\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_bytecode\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"_salt\",\"type\":\"bytes32\"}],\"name\":\"ovmCREATE2\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_messageHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint8\",\"name\":\"_v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"_r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"_s\",\"type\":\"bytes32\"}],\"name\":\"ovmCREATEEOA\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_address\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_calldata\",\"type\":\"bytes\"}],\"name\":\"ovmDELEGATECALL\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"_success\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"_returndata\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_contract\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_offset\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_length\",\"type\":\"uint256\"}],\"name\":\"ovmEXTCODECOPY\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"_code\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_contract\",\"type\":\"address\"}],\"name\":\"ovmEXTCODEHASH\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"_EXTCODEHASH\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_contract\",\"type\":\"address\"}],\"name\":\"ovmEXTCODESIZE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_EXTCODESIZE\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ovmGASLIMIT\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_GASLIMIT\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ovmGETNONCE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_nonce\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ovmINCREMENTNONCE\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ovmL1QUEUEORIGIN\",\"outputs\":[{\"internalType\":\"enum Lib_OVMCodec.QueueOrigin\",\"name\":\"_queueOrigin\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ovmL1TXORIGIN\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"_l1TxOrigin\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ovmNUMBER\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_NUMBER\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"ovmREVERT\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_key\",\"type\":\"bytes32\"}],\"name\":\"ovmSLOAD\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"_value\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_key\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"_value\",\"type\":\"bytes32\"}],\"name\":\"ovmSSTORE\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_address\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_calldata\",\"type\":\"bytes\"}],\"name\":\"ovmSTATICCALL\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"_success\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"_returndata\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ovmTIMESTAMP\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_TIMESTAMP\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"enum Lib_OVMCodec.QueueOrigin\",\"name\":\"l1QueueOrigin\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"l1TxOrigin\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"entrypoint\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.Transaction\",\"name\":\"_transaction\",\"type\":\"tuple\"},{\"internalType\":\"address\",\"name\":\"_ovmStateManager\",\"type\":\"address\"}],\"name\":\"run\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_creationCode\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"_address\",\"type\":\"address\"}],\"name\":\"safeCREATE\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"enum Lib_OVMCodec.QueueOrigin\",\"name\":\"l1QueueOrigin\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"l1TxOrigin\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"entrypoint\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.Transaction\",\"name\":\"_transaction\",\"type\":\"tuple\"},{\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"internalType\":\"contract iOVM_StateManager\",\"name\":\"_ovmStateManager\",\"type\":\"address\"}],\"name\":\"simulateMessage\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The Execution Manager (EM) is the core of our OVM implementation, and provides a sandboxed environment allowing us to execute OVM transactions deterministically on either Layer 1 or Layer 2. The EM's run() function is the first function called during the execution of any transaction on L2. For each context-dependent EVM operation the EM has a function which implements a corresponding OVM operation, which will read state from the State Manager contract. The EM relies on the Safety Checker to verify that code deployed to Layer 2 does not contain any context-dependent operations. Compiler used: solc Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\"}},\"ovmADDRESS()\":{\"returns\":{\"_ADDRESS\":\"Active ADDRESS within the current message context.\"}},\"ovmCALL(uint256,address,bytes)\":{\"params\":{\"_address\":\"Address of the contract to call.\",\"_calldata\":\"Data to send along with the call.\",\"_gasLimit\":\"Amount of gas to be passed into this call.\"},\"returns\":{\"_returndata\":\"Data returned by the call.\",\"_success\":\"Whether or not the call returned (rather than reverted).\"}},\"ovmCALLER()\":{\"returns\":{\"_CALLER\":\"Address of the CALLER within the current message context.\"}},\"ovmCHAINID()\":{\"returns\":{\"_CHAINID\":\"Value of the chain's CHAINID within the global context.\"}},\"ovmCREATE(bytes)\":{\"params\":{\"_bytecode\":\"Code to be used to CREATE a new contract.\"},\"returns\":{\"_0\":\"Address of the created contract.\",\"_1\":\"Revert data, if and only if the creation threw an exception.\"}},\"ovmCREATE2(bytes,bytes32)\":{\"params\":{\"_bytecode\":\"Code to be used to CREATE2 a new contract.\",\"_salt\":\"Value used to determine the contract's address.\"},\"returns\":{\"_0\":\"Address of the created contract.\",\"_1\":\"Revert data, if and only if the creation threw an exception.\"}},\"ovmCREATEEOA(bytes32,uint8,bytes32,bytes32)\":{\"details\":\"Essentially functions like ovmCREATE or ovmCREATE2, but we can bypass a lot of checks because the contract we're creating is trusted (no need to do safety checking or to handle unexpected reverts). Doesn't need to return an address because the address is assumed to be the user's actual address.\",\"params\":{\"_messageHash\":\"Hash of a message signed by some user, for verification.\",\"_r\":\"Signature `r` parameter.\",\"_s\":\"Signature `s` parameter.\",\"_v\":\"Signature `v` parameter.\"}},\"ovmDELEGATECALL(uint256,address,bytes)\":{\"params\":{\"_address\":\"Address of the contract to call.\",\"_calldata\":\"Data to send along with the call.\",\"_gasLimit\":\"Amount of gas to be passed into this call.\"},\"returns\":{\"_returndata\":\"Data returned by the call.\",\"_success\":\"Whether or not the call returned (rather than reverted).\"}},\"ovmEXTCODECOPY(address,uint256,uint256)\":{\"params\":{\"_contract\":\"Address of the contract to copy code from.\",\"_length\":\"Total number of bytes to copy from the contract's code.\",\"_offset\":\"Offset in bytes from the start of contract code to copy beyond.\"},\"returns\":{\"_code\":\"Bytes of code copied from the requested contract.\"}},\"ovmEXTCODEHASH(address)\":{\"params\":{\"_contract\":\"Address of the contract to query the hash of.\"},\"returns\":{\"_EXTCODEHASH\":\"Hash of the requested contract.\"}},\"ovmEXTCODESIZE(address)\":{\"params\":{\"_contract\":\"Address of the contract to query the size of.\"},\"returns\":{\"_EXTCODESIZE\":\"Size of the requested contract in bytes.\"}},\"ovmGASLIMIT()\":{\"returns\":{\"_GASLIMIT\":\"Value of the block's GASLIMIT within the transaction context.\"}},\"ovmGETNONCE()\":{\"returns\":{\"_nonce\":\"Nonce of the current contract.\"}},\"ovmL1QUEUEORIGIN()\":{\"returns\":{\"_queueOrigin\":\"Enum indicating the ovmL1QUEUEORIGIN within the current message context.\"}},\"ovmL1TXORIGIN()\":{\"returns\":{\"_l1TxOrigin\":\"Address of the account which sent the tx into L2 from L1.\"}},\"ovmNUMBER()\":{\"returns\":{\"_NUMBER\":\"Value of the NUMBER within the transaction context.\"}},\"ovmREVERT(bytes)\":{\"params\":{\"_data\":\"Bytes data to pass along with the REVERT.\"}},\"ovmSLOAD(bytes32)\":{\"params\":{\"_key\":\"32 byte key of the storage slot to load.\"},\"returns\":{\"_value\":\"32 byte value of the requested storage slot.\"}},\"ovmSSTORE(bytes32,bytes32)\":{\"params\":{\"_key\":\"32 byte key of the storage slot to set.\",\"_value\":\"32 byte value for the storage slot.\"}},\"ovmSTATICCALL(uint256,address,bytes)\":{\"params\":{\"_address\":\"Address of the contract to call.\",\"_calldata\":\"Data to send along with the call.\",\"_gasLimit\":\"Amount of gas to be passed into this call.\"},\"returns\":{\"_returndata\":\"Data returned by the call.\",\"_success\":\"Whether or not the call returned (rather than reverted).\"}},\"ovmTIMESTAMP()\":{\"returns\":{\"_TIMESTAMP\":\"Value of the TIMESTAMP within the transaction context.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}},\"run((uint256,uint256,uint8,address,address,uint256,bytes),address)\":{\"params\":{\"_ovmStateManager\":\"iOVM_StateManager implementation providing account state.\",\"_transaction\":\"Transaction data to be executed.\"}},\"safeCREATE(uint256,bytes,address)\":{\"params\":{\"_address\":\"OVM address being deployed to.\",\"_creationCode\":\"Code to pass into CREATE for deployment.\",\"_gasLimit\":\"Amount of gas to be passed into this creation.\"}},\"simulateMessage((uint256,uint256,uint8,address,address,uint256,bytes),address,address)\":{\"params\":{\"_from\":\"the OVM account the simulated call should be from.\",\"_transaction\":\"the message transaction to simulate.\"}}},\"title\":\"OVM_ExecutionManager\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"ovmADDRESS()\":{\"notice\":\"Overrides ADDRESS.\"},\"ovmCALL(uint256,address,bytes)\":{\"notice\":\"Overrides CALL.\"},\"ovmCALLER()\":{\"notice\":\"Overrides CALLER.\"},\"ovmCHAINID()\":{\"notice\":\"Overrides CHAINID.\"},\"ovmCREATE(bytes)\":{\"notice\":\"Overrides CREATE.\"},\"ovmCREATE2(bytes,bytes32)\":{\"notice\":\"Overrides CREATE2.\"},\"ovmCREATEEOA(bytes32,uint8,bytes32,bytes32)\":{\"notice\":\"Creates a new EOA contract account, for account abstraction.\"},\"ovmDELEGATECALL(uint256,address,bytes)\":{\"notice\":\"Overrides DELEGATECALL.\"},\"ovmEXTCODECOPY(address,uint256,uint256)\":{\"notice\":\"Overrides EXTCODECOPY.\"},\"ovmEXTCODEHASH(address)\":{\"notice\":\"Overrides EXTCODEHASH.\"},\"ovmEXTCODESIZE(address)\":{\"notice\":\"Overrides EXTCODESIZE.\"},\"ovmGASLIMIT()\":{\"notice\":\"Overrides GASLIMIT.\"},\"ovmGETNONCE()\":{\"notice\":\"Retrieves the nonce of the current ovmADDRESS.\"},\"ovmINCREMENTNONCE()\":{\"notice\":\"Bumps the nonce of the current ovmADDRESS by one.\"},\"ovmL1QUEUEORIGIN()\":{\"notice\":\"Specifies from which source (Sequencer or Queue) this transaction originated from.\"},\"ovmL1TXORIGIN()\":{\"notice\":\"Specifies which L1 account, if any, sent this transaction by calling enqueue().\"},\"ovmNUMBER()\":{\"notice\":\"Overrides NUMBER.\"},\"ovmREVERT(bytes)\":{\"notice\":\"Overrides REVERT.\"},\"ovmSLOAD(bytes32)\":{\"notice\":\"Overrides SLOAD.\"},\"ovmSSTORE(bytes32,bytes32)\":{\"notice\":\"Overrides SSTORE.\"},\"ovmSTATICCALL(uint256,address,bytes)\":{\"notice\":\"Overrides STATICCALL.\"},\"ovmTIMESTAMP()\":{\"notice\":\"Overrides TIMESTAMP.\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"},\"run((uint256,uint256,uint8,address,address,uint256,bytes),address)\":{\"notice\":\"Starts the execution of a transaction via the OVM_ExecutionManager.\"},\"safeCREATE(uint256,bytes,address)\":{\"notice\":\"Handles the creation-specific safety measures required for OVM contract deployment. This function sanitizes the return types for creation messages to match calls (bool, bytes), by being an external function which the EM can call, that mimics the success/fail case of the CREATE. This allows for consistent handling of both types of messages in _handleExternalMessage(). Having this step occur as a separate call frame also allows us to easily revert the contract deployment in the event that the code is unsafe.\"},\"simulateMessage((uint256,uint256,uint8,address,address,uint256,bytes),address,address)\":{\"notice\":\"Unreachable helper function for simulating eth_calls with an OVM message context. This function will throw an exception in all cases other than when used as a custom entrypoint in L2 Geth to simulate eth_call.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol\":\"OVM_ExecutionManager\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor () internal {\\n address msgSender = _msgSender();\\n _owner = msgSender;\\n emit OwnershipTransferred(address(0), msgSender);\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n emit OwnershipTransferred(_owner, address(0));\\n _owner = address(0);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n emit OwnershipTransferred(_owner, newOwner);\\n _owner = newOwner;\\n }\\n}\\n\",\"keccak256\":\"0x15e2d5bd4c28a88548074c54d220e8086f638a71ed07e6b3ba5a70066fcf458d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with GSN meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address payable) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes memory) {\\n this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x8d3cb350f04ff49cfb10aef08d87f19dcbaecc8027b0bed12f3275cd12f38cf0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// @unsupported: ovm\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\nimport { Lib_EthUtils } from \\\"../../libraries/utils/Lib_EthUtils.sol\\\";\\nimport { Lib_ErrorUtils } from \\\"../../libraries/utils/Lib_ErrorUtils.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_ExecutionManager } from \\\"../../iOVM/execution/iOVM_ExecutionManager.sol\\\";\\nimport { iOVM_StateManager } from \\\"../../iOVM/execution/iOVM_StateManager.sol\\\";\\nimport { iOVM_SafetyChecker } from \\\"../../iOVM/execution/iOVM_SafetyChecker.sol\\\";\\n\\n/* Contract Imports */\\nimport { OVM_DeployerWhitelist } from \\\"../predeploys/OVM_DeployerWhitelist.sol\\\";\\n\\n/**\\n * @title OVM_ExecutionManager\\n * @dev The Execution Manager (EM) is the core of our OVM implementation, and provides a sandboxed\\n * environment allowing us to execute OVM transactions deterministically on either Layer 1 or\\n * Layer 2.\\n * The EM's run() function is the first function called during the execution of any\\n * transaction on L2.\\n * For each context-dependent EVM operation the EM has a function which implements a corresponding\\n * OVM operation, which will read state from the State Manager contract.\\n * The EM relies on the Safety Checker to verify that code deployed to Layer 2 does not contain any\\n * context-dependent operations.\\n *\\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract OVM_ExecutionManager is iOVM_ExecutionManager, Lib_AddressResolver {\\n\\n /********************************\\n * External Contract References *\\n ********************************/\\n\\n iOVM_SafetyChecker internal ovmSafetyChecker;\\n iOVM_StateManager internal ovmStateManager;\\n\\n\\n /*******************************\\n * Execution Context Variables *\\n *******************************/\\n\\n GasMeterConfig internal gasMeterConfig;\\n GlobalContext internal globalContext;\\n TransactionContext internal transactionContext;\\n MessageContext internal messageContext;\\n TransactionRecord internal transactionRecord;\\n MessageRecord internal messageRecord;\\n\\n\\n /**************************\\n * Gas Metering Constants *\\n **************************/\\n\\n address constant GAS_METADATA_ADDRESS = 0x06a506A506a506A506a506a506A506A506A506A5;\\n uint256 constant NUISANCE_GAS_SLOAD = 20000;\\n uint256 constant NUISANCE_GAS_SSTORE = 20000;\\n uint256 constant MIN_NUISANCE_GAS_PER_CONTRACT = 30000;\\n uint256 constant NUISANCE_GAS_PER_CONTRACT_BYTE = 100;\\n uint256 constant MIN_GAS_FOR_INVALID_STATE_ACCESS = 30000;\\n\\n /**************************\\n * Default Context Values *\\n **************************/\\n\\n uint256 constant DEFAULT_UINT256 = 0xdefa017defa017defa017defa017defa017defa017defa017defa017defa017d;\\n address constant DEFAULT_ADDRESS = 0xdEfa017defA017DeFA017DEfa017DeFA017DeFa0;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n */\\n constructor(\\n address _libAddressManager,\\n GasMeterConfig memory _gasMeterConfig,\\n GlobalContext memory _globalContext\\n )\\n Lib_AddressResolver(_libAddressManager)\\n {\\n ovmSafetyChecker = iOVM_SafetyChecker(resolve(\\\"OVM_SafetyChecker\\\"));\\n gasMeterConfig = _gasMeterConfig;\\n globalContext = _globalContext;\\n _resetContext();\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n /**\\n * Applies dynamically-sized refund to a transaction to account for the difference in execution\\n * between L1 and L2, so that the overall cost of the ovmOPCODE is fixed.\\n * @param _cost Desired gas cost for the function after the refund.\\n */\\n modifier netGasCost(\\n uint256 _cost\\n ) {\\n uint256 gasProvided = gasleft();\\n _;\\n uint256 gasUsed = gasProvided - gasleft();\\n\\n // We want to refund everything *except* the specified cost.\\n if (_cost < gasUsed) {\\n transactionRecord.ovmGasRefund += gasUsed - _cost;\\n }\\n }\\n\\n /**\\n * Applies a fixed-size gas refund to a transaction to account for the difference in execution\\n * between L1 and L2, so that the overall cost of an ovmOPCODE can be lowered.\\n * @param _discount Amount of gas cost to refund for the ovmOPCODE.\\n */\\n modifier fixedGasDiscount(\\n uint256 _discount\\n ) {\\n uint256 gasProvided = gasleft();\\n _;\\n uint256 gasUsed = gasProvided - gasleft();\\n\\n // We want to refund the specified _discount, unless this risks underflow.\\n if (_discount < gasUsed) {\\n transactionRecord.ovmGasRefund += _discount;\\n } else {\\n // refund all we can without risking underflow.\\n transactionRecord.ovmGasRefund += gasUsed;\\n }\\n }\\n\\n /**\\n * Makes sure we're not inside a static context.\\n */\\n modifier notStatic() {\\n if (messageContext.isStatic == true) {\\n _revertWithFlag(RevertFlag.STATIC_VIOLATION);\\n }\\n _;\\n }\\n\\n\\n /************************************\\n * Transaction Execution Entrypoint *\\n ************************************/\\n\\n /**\\n * Starts the execution of a transaction via the OVM_ExecutionManager.\\n * @param _transaction Transaction data to be executed.\\n * @param _ovmStateManager iOVM_StateManager implementation providing account state.\\n */\\n function run(\\n Lib_OVMCodec.Transaction memory _transaction,\\n address _ovmStateManager\\n )\\n override\\n public\\n returns (\\n bytes memory\\n )\\n {\\n // Make sure that run() is not re-enterable. This condition should always be satisfied\\n // Once run has been called once, due to the behavior of _isValidInput().\\n if (transactionContext.ovmNUMBER != DEFAULT_UINT256) {\\n return bytes(\\\"\\\");\\n }\\n\\n // Store our OVM_StateManager instance (significantly easier than attempting to pass the\\n // address around in calldata).\\n ovmStateManager = iOVM_StateManager(_ovmStateManager);\\n\\n // Make sure this function can't be called by anyone except the owner of the\\n // OVM_StateManager (expected to be an OVM_StateTransitioner). We can revert here because\\n // this would make the `run` itself invalid.\\n require(\\n // This method may return false during fraud proofs, but always returns true in L2 nodes' State Manager precompile.\\n ovmStateManager.isAuthenticated(msg.sender),\\n \\\"Only authenticated addresses in ovmStateManager can call this function\\\"\\n );\\n\\n // Initialize the execution context, must be initialized before we perform any gas metering\\n // or we'll throw a nuisance gas error.\\n _initContext(_transaction);\\n\\n // TEMPORARY: Gas metering is disabled for minnet.\\n // // Check whether we need to start a new epoch, do so if necessary.\\n // _checkNeedsNewEpoch(_transaction.timestamp);\\n\\n // Make sure the transaction's gas limit is valid. We don't revert here because we reserve\\n // reverts for INVALID_STATE_ACCESS.\\n if (_isValidInput(_transaction) == false) {\\n _resetContext();\\n return bytes(\\\"\\\");\\n }\\n\\n // TEMPORARY: Gas metering is disabled for minnet.\\n // // Check gas right before the call to get total gas consumed by OVM transaction.\\n // uint256 gasProvided = gasleft();\\n\\n // Run the transaction, make sure to meter the gas usage.\\n (, bytes memory returndata) = ovmCALL(\\n _transaction.gasLimit - gasMeterConfig.minTransactionGasLimit,\\n _transaction.entrypoint,\\n _transaction.data\\n );\\n\\n // TEMPORARY: Gas metering is disabled for minnet.\\n // // Update the cumulative gas based on the amount of gas used.\\n // uint256 gasUsed = gasProvided - gasleft();\\n // _updateCumulativeGas(gasUsed, _transaction.l1QueueOrigin);\\n\\n // Wipe the execution context.\\n _resetContext();\\n\\n return returndata;\\n }\\n\\n\\n /******************************\\n * Opcodes: Execution Context *\\n ******************************/\\n\\n /**\\n * @notice Overrides CALLER.\\n * @return _CALLER Address of the CALLER within the current message context.\\n */\\n function ovmCALLER()\\n override\\n public\\n view\\n returns (\\n address _CALLER\\n )\\n {\\n return messageContext.ovmCALLER;\\n }\\n\\n /**\\n * @notice Overrides ADDRESS.\\n * @return _ADDRESS Active ADDRESS within the current message context.\\n */\\n function ovmADDRESS()\\n override\\n public\\n view\\n returns (\\n address _ADDRESS\\n )\\n {\\n return messageContext.ovmADDRESS;\\n }\\n\\n /**\\n * @notice Overrides TIMESTAMP.\\n * @return _TIMESTAMP Value of the TIMESTAMP within the transaction context.\\n */\\n function ovmTIMESTAMP()\\n override\\n public\\n view\\n returns (\\n uint256 _TIMESTAMP\\n )\\n {\\n return transactionContext.ovmTIMESTAMP;\\n }\\n\\n /**\\n * @notice Overrides NUMBER.\\n * @return _NUMBER Value of the NUMBER within the transaction context.\\n */\\n function ovmNUMBER()\\n override\\n public\\n view\\n returns (\\n uint256 _NUMBER\\n )\\n {\\n return transactionContext.ovmNUMBER;\\n }\\n\\n /**\\n * @notice Overrides GASLIMIT.\\n * @return _GASLIMIT Value of the block's GASLIMIT within the transaction context.\\n */\\n function ovmGASLIMIT()\\n override\\n public\\n view\\n returns (\\n uint256 _GASLIMIT\\n )\\n {\\n return transactionContext.ovmGASLIMIT;\\n }\\n\\n /**\\n * @notice Overrides CHAINID.\\n * @return _CHAINID Value of the chain's CHAINID within the global context.\\n */\\n function ovmCHAINID()\\n override\\n public\\n view\\n returns (\\n uint256 _CHAINID\\n )\\n {\\n return globalContext.ovmCHAINID;\\n }\\n\\n /*********************************\\n * Opcodes: L2 Execution Context *\\n *********************************/\\n\\n /**\\n * @notice Specifies from which source (Sequencer or Queue) this transaction originated from.\\n * @return _queueOrigin Enum indicating the ovmL1QUEUEORIGIN within the current message context.\\n */\\n function ovmL1QUEUEORIGIN()\\n override\\n public\\n view\\n returns (\\n Lib_OVMCodec.QueueOrigin _queueOrigin\\n )\\n {\\n return transactionContext.ovmL1QUEUEORIGIN;\\n }\\n\\n /**\\n * @notice Specifies which L1 account, if any, sent this transaction by calling enqueue().\\n * @return _l1TxOrigin Address of the account which sent the tx into L2 from L1.\\n */\\n function ovmL1TXORIGIN()\\n override\\n public\\n view\\n returns (\\n address _l1TxOrigin\\n )\\n {\\n return transactionContext.ovmL1TXORIGIN;\\n }\\n\\n /********************\\n * Opcodes: Halting *\\n ********************/\\n\\n /**\\n * @notice Overrides REVERT.\\n * @param _data Bytes data to pass along with the REVERT.\\n */\\n function ovmREVERT(\\n bytes memory _data\\n )\\n override\\n public\\n {\\n _revertWithFlag(RevertFlag.INTENTIONAL_REVERT, _data);\\n }\\n\\n\\n /******************************\\n * Opcodes: Contract Creation *\\n ******************************/\\n\\n /**\\n * @notice Overrides CREATE.\\n * @param _bytecode Code to be used to CREATE a new contract.\\n * @return Address of the created contract.\\n * @return Revert data, if and only if the creation threw an exception.\\n */\\n function ovmCREATE(\\n bytes memory _bytecode\\n )\\n override\\n public\\n notStatic\\n fixedGasDiscount(40000)\\n returns (\\n address,\\n bytes memory\\n )\\n {\\n // Creator is always the current ADDRESS.\\n address creator = ovmADDRESS();\\n\\n // Check that the deployer is whitelisted, or\\n // that arbitrary contract deployment has been enabled.\\n _checkDeployerAllowed(creator);\\n\\n // Generate the correct CREATE address.\\n address contractAddress = Lib_EthUtils.getAddressForCREATE(\\n creator,\\n _getAccountNonce(creator)\\n );\\n\\n return _createContract(\\n contractAddress,\\n _bytecode\\n );\\n }\\n\\n /**\\n * @notice Overrides CREATE2.\\n * @param _bytecode Code to be used to CREATE2 a new contract.\\n * @param _salt Value used to determine the contract's address.\\n * @return Address of the created contract.\\n * @return Revert data, if and only if the creation threw an exception.\\n */\\n function ovmCREATE2(\\n bytes memory _bytecode,\\n bytes32 _salt\\n )\\n override\\n public\\n notStatic\\n fixedGasDiscount(40000)\\n returns (\\n address,\\n bytes memory\\n )\\n {\\n // Creator is always the current ADDRESS.\\n address creator = ovmADDRESS();\\n\\n // Check that the deployer is whitelisted, or\\n // that arbitrary contract deployment has been enabled.\\n _checkDeployerAllowed(creator);\\n\\n // Generate the correct CREATE2 address.\\n address contractAddress = Lib_EthUtils.getAddressForCREATE2(\\n creator,\\n _bytecode,\\n _salt\\n );\\n\\n return _createContract(\\n contractAddress,\\n _bytecode\\n );\\n }\\n\\n\\n /*******************************\\n * Account Abstraction Opcodes *\\n ******************************/\\n\\n /**\\n * Retrieves the nonce of the current ovmADDRESS.\\n * @return _nonce Nonce of the current contract.\\n */\\n function ovmGETNONCE()\\n override\\n public\\n returns (\\n uint256 _nonce\\n )\\n {\\n return _getAccountNonce(ovmADDRESS());\\n }\\n\\n /**\\n * Bumps the nonce of the current ovmADDRESS by one.\\n */\\n function ovmINCREMENTNONCE()\\n override\\n public\\n notStatic\\n {\\n address account = ovmADDRESS();\\n uint256 nonce = _getAccountNonce(account);\\n\\n // Prevent overflow.\\n if (nonce + 1 > nonce) {\\n _setAccountNonce(account, nonce + 1);\\n }\\n }\\n\\n /**\\n * Creates a new EOA contract account, for account abstraction.\\n * @dev Essentially functions like ovmCREATE or ovmCREATE2, but we can bypass a lot of checks\\n * because the contract we're creating is trusted (no need to do safety checking or to\\n * handle unexpected reverts). Doesn't need to return an address because the address is\\n * assumed to be the user's actual address.\\n * @param _messageHash Hash of a message signed by some user, for verification.\\n * @param _v Signature `v` parameter.\\n * @param _r Signature `r` parameter.\\n * @param _s Signature `s` parameter.\\n */\\n function ovmCREATEEOA(\\n bytes32 _messageHash,\\n uint8 _v,\\n bytes32 _r,\\n bytes32 _s\\n )\\n override\\n public\\n notStatic\\n {\\n // Recover the EOA address from the message hash and signature parameters. Since we do the\\n // hashing in advance, we don't have handle different message hashing schemes. Even if this\\n // function were to return the wrong address (rather than explicitly returning the zero\\n // address), the rest of the transaction would simply fail (since there's no EOA account to\\n // actually execute the transaction).\\n address eoa = ecrecover(\\n _messageHash,\\n _v + 27,\\n _r,\\n _s\\n );\\n\\n // Invalid signature is a case we proactively handle with a revert. We could alternatively\\n // have this function return a `success` boolean, but this is just easier.\\n if (eoa == address(0)) {\\n ovmREVERT(bytes(\\\"Signature provided for EOA contract creation is invalid.\\\"));\\n }\\n\\n // If the user already has an EOA account, then there's no need to perform this operation.\\n if (_hasEmptyAccount(eoa) == false) {\\n return;\\n }\\n\\n // We always need to initialize the contract with the default account values.\\n _initPendingAccount(eoa);\\n\\n // Temporarily set the current address so it's easier to access on L2.\\n address prevADDRESS = messageContext.ovmADDRESS;\\n messageContext.ovmADDRESS = eoa;\\n\\n // Creates a duplicate of the OVM_ProxyEOA located at 0x42....09. Uses the following\\n // \\\"magic\\\" prefix to deploy an exact copy of the code:\\n // PUSH1 0x0D # size of this prefix in bytes\\n // CODESIZE\\n // SUB # subtract prefix size from codesize\\n // DUP1\\n // PUSH1 0x0D\\n // PUSH1 0x00\\n // CODECOPY # copy everything after prefix into memory at pos 0\\n // PUSH1 0x00\\n // RETURN # return the copied code\\n address proxyEOA = Lib_EthUtils.createContract(abi.encodePacked(\\n hex\\\"600D380380600D6000396000f3\\\",\\n ovmEXTCODECOPY(\\n 0x4200000000000000000000000000000000000009,\\n 0,\\n ovmEXTCODESIZE(0x4200000000000000000000000000000000000009)\\n )\\n ));\\n\\n // Reset the address now that we're done deploying.\\n messageContext.ovmADDRESS = prevADDRESS;\\n\\n // Commit the account with its final values.\\n _commitPendingAccount(\\n eoa,\\n address(proxyEOA),\\n keccak256(Lib_EthUtils.getCode(address(proxyEOA)))\\n );\\n\\n _setAccountNonce(eoa, 0);\\n }\\n\\n\\n /*********************************\\n * Opcodes: Contract Interaction *\\n *********************************/\\n\\n /**\\n * @notice Overrides CALL.\\n * @param _gasLimit Amount of gas to be passed into this call.\\n * @param _address Address of the contract to call.\\n * @param _calldata Data to send along with the call.\\n * @return _success Whether or not the call returned (rather than reverted).\\n * @return _returndata Data returned by the call.\\n */\\n function ovmCALL(\\n uint256 _gasLimit,\\n address _address,\\n bytes memory _calldata\\n )\\n override\\n public\\n fixedGasDiscount(100000)\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n // CALL updates the CALLER and ADDRESS.\\n MessageContext memory nextMessageContext = messageContext;\\n nextMessageContext.ovmCALLER = nextMessageContext.ovmADDRESS;\\n nextMessageContext.ovmADDRESS = _address;\\n\\n return _callContract(\\n nextMessageContext,\\n _gasLimit,\\n _address,\\n _calldata\\n );\\n }\\n\\n /**\\n * @notice Overrides STATICCALL.\\n * @param _gasLimit Amount of gas to be passed into this call.\\n * @param _address Address of the contract to call.\\n * @param _calldata Data to send along with the call.\\n * @return _success Whether or not the call returned (rather than reverted).\\n * @return _returndata Data returned by the call.\\n */\\n function ovmSTATICCALL(\\n uint256 _gasLimit,\\n address _address,\\n bytes memory _calldata\\n )\\n override\\n public\\n fixedGasDiscount(80000)\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n // STATICCALL updates the CALLER, updates the ADDRESS, and runs in a static context.\\n MessageContext memory nextMessageContext = messageContext;\\n nextMessageContext.ovmCALLER = nextMessageContext.ovmADDRESS;\\n nextMessageContext.ovmADDRESS = _address;\\n nextMessageContext.isStatic = true;\\n\\n return _callContract(\\n nextMessageContext,\\n _gasLimit,\\n _address,\\n _calldata\\n );\\n }\\n\\n /**\\n * @notice Overrides DELEGATECALL.\\n * @param _gasLimit Amount of gas to be passed into this call.\\n * @param _address Address of the contract to call.\\n * @param _calldata Data to send along with the call.\\n * @return _success Whether or not the call returned (rather than reverted).\\n * @return _returndata Data returned by the call.\\n */\\n function ovmDELEGATECALL(\\n uint256 _gasLimit,\\n address _address,\\n bytes memory _calldata\\n )\\n override\\n public\\n fixedGasDiscount(40000)\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n // DELEGATECALL does not change anything about the message context.\\n MessageContext memory nextMessageContext = messageContext;\\n\\n return _callContract(\\n nextMessageContext,\\n _gasLimit,\\n _address,\\n _calldata\\n );\\n }\\n\\n\\n /************************************\\n * Opcodes: Contract Storage Access *\\n ************************************/\\n\\n /**\\n * @notice Overrides SLOAD.\\n * @param _key 32 byte key of the storage slot to load.\\n * @return _value 32 byte value of the requested storage slot.\\n */\\n function ovmSLOAD(\\n bytes32 _key\\n )\\n override\\n public\\n netGasCost(40000)\\n returns (\\n bytes32 _value\\n )\\n {\\n // We always SLOAD from the storage of ADDRESS.\\n address contractAddress = ovmADDRESS();\\n\\n return _getContractStorage(\\n contractAddress,\\n _key\\n );\\n }\\n\\n /**\\n * @notice Overrides SSTORE.\\n * @param _key 32 byte key of the storage slot to set.\\n * @param _value 32 byte value for the storage slot.\\n */\\n function ovmSSTORE(\\n bytes32 _key,\\n bytes32 _value\\n )\\n override\\n public\\n notStatic\\n netGasCost(60000)\\n {\\n // We always SSTORE to the storage of ADDRESS.\\n address contractAddress = ovmADDRESS();\\n\\n _putContractStorage(\\n contractAddress,\\n _key,\\n _value\\n );\\n }\\n\\n\\n /*********************************\\n * Opcodes: Contract Code Access *\\n *********************************/\\n\\n /**\\n * @notice Overrides EXTCODECOPY.\\n * @param _contract Address of the contract to copy code from.\\n * @param _offset Offset in bytes from the start of contract code to copy beyond.\\n * @param _length Total number of bytes to copy from the contract's code.\\n * @return _code Bytes of code copied from the requested contract.\\n */\\n function ovmEXTCODECOPY(\\n address _contract,\\n uint256 _offset,\\n uint256 _length\\n )\\n override\\n public\\n returns (\\n bytes memory _code\\n )\\n {\\n return Lib_EthUtils.getCode(\\n _getAccountEthAddress(_contract),\\n _offset,\\n _length\\n );\\n }\\n\\n /**\\n * @notice Overrides EXTCODESIZE.\\n * @param _contract Address of the contract to query the size of.\\n * @return _EXTCODESIZE Size of the requested contract in bytes.\\n */\\n function ovmEXTCODESIZE(\\n address _contract\\n )\\n override\\n public\\n returns (\\n uint256 _EXTCODESIZE\\n )\\n {\\n return Lib_EthUtils.getCodeSize(\\n _getAccountEthAddress(_contract)\\n );\\n }\\n\\n /**\\n * @notice Overrides EXTCODEHASH.\\n * @param _contract Address of the contract to query the hash of.\\n * @return _EXTCODEHASH Hash of the requested contract.\\n */\\n function ovmEXTCODEHASH(\\n address _contract\\n )\\n override\\n public\\n returns (\\n bytes32 _EXTCODEHASH\\n )\\n {\\n return Lib_EthUtils.getCodeHash(\\n _getAccountEthAddress(_contract)\\n );\\n }\\n\\n /***************************************\\n * Public Functions: Execution Context *\\n ***************************************/\\n\\n function getMaxTransactionGasLimit()\\n external\\n view\\n override\\n returns (\\n uint256 _maxTransactionGasLimit\\n )\\n {\\n return gasMeterConfig.maxTransactionGasLimit;\\n }\\n\\n /********************************************\\n * Public Functions: Deployment Whitelisting *\\n ********************************************/\\n\\n /**\\n * Checks whether the given address is on the whitelist to ovmCREATE/ovmCREATE2, and reverts if not.\\n * @param _deployerAddress Address attempting to deploy a contract.\\n */\\n function _checkDeployerAllowed(\\n address _deployerAddress\\n )\\n internal\\n {\\n // From an OVM semantics perspective, this will appear identical to\\n // the deployer ovmCALLing the whitelist. This is fine--in a sense, we are forcing them to.\\n (bool success, bytes memory data) = ovmCALL(\\n gasleft(),\\n 0x4200000000000000000000000000000000000002,\\n abi.encodeWithSignature(\\\"isDeployerAllowed(address)\\\", _deployerAddress)\\n );\\n bool isAllowed = abi.decode(data, (bool));\\n\\n if (!isAllowed || !success) {\\n _revertWithFlag(RevertFlag.CREATOR_NOT_ALLOWED);\\n }\\n }\\n\\n /********************************************\\n * Internal Functions: Contract Interaction *\\n ********************************************/\\n\\n /**\\n * Creates a new contract and associates it with some contract address.\\n * @param _contractAddress Address to associate the created contract with.\\n * @param _bytecode Bytecode to be used to create the contract.\\n * @return Final OVM contract address.\\n * @return Revertdata, if and only if the creation threw an exception.\\n */\\n function _createContract(\\n address _contractAddress,\\n bytes memory _bytecode\\n )\\n internal\\n returns (\\n address,\\n bytes memory\\n )\\n {\\n // We always update the nonce of the creating account, even if the creation fails.\\n _setAccountNonce(ovmADDRESS(), _getAccountNonce(ovmADDRESS()) + 1);\\n\\n // We're stepping into a CREATE or CREATE2, so we need to update ADDRESS to point\\n // to the contract's associated address and CALLER to point to the previous ADDRESS.\\n MessageContext memory nextMessageContext = messageContext;\\n nextMessageContext.ovmCALLER = messageContext.ovmADDRESS;\\n nextMessageContext.ovmADDRESS = _contractAddress;\\n\\n // Run the common logic which occurs between call-type and create-type messages,\\n // passing in the creation bytecode and `true` to trigger create-specific logic.\\n (bool success, bytes memory data) = _handleExternalMessage(\\n nextMessageContext,\\n gasleft(),\\n _contractAddress,\\n _bytecode,\\n true\\n );\\n\\n // Yellow paper requires that address returned is zero if the contract deployment fails.\\n return (\\n success ? _contractAddress : address(0),\\n data\\n );\\n }\\n\\n /**\\n * Calls the deployed contract associated with a given address.\\n * @param _nextMessageContext Message context to be used for the call.\\n * @param _gasLimit Amount of gas to be passed into this call.\\n * @param _contract OVM address to be called.\\n * @param _calldata Data to send along with the call.\\n * @return _success Whether or not the call returned (rather than reverted).\\n * @return _returndata Data returned by the call.\\n */\\n function _callContract(\\n MessageContext memory _nextMessageContext,\\n uint256 _gasLimit,\\n address _contract,\\n bytes memory _calldata\\n )\\n internal\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n // We reserve addresses of the form 0xdeaddeaddead...NNNN for the container contracts in L2 geth.\\n // So, we block calls to these addresses since they are not safe to run as an OVM contract itself.\\n if (\\n (uint256(_contract) & uint256(0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000))\\n == uint256(0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000)\\n ) {\\n // EVM does not return data in the success case, see: https://github.com/ethereum/go-ethereum/blob/aae7660410f0ef90279e14afaaf2f429fdc2a186/core/vm/instructions.go#L600-L604\\n return (true, hex'');\\n }\\n\\n // Both 0x0000... and the EVM precompiles have the same address on L1 and L2 --> no trie lookup needed.\\n address codeContractAddress =\\n uint(_contract) < 100\\n ? _contract\\n : _getAccountEthAddress(_contract);\\n\\n return _handleExternalMessage(\\n _nextMessageContext,\\n _gasLimit,\\n codeContractAddress,\\n _calldata,\\n false\\n );\\n }\\n\\n /**\\n * Handles all interactions which involve the execution manager calling out to untrusted code (both calls and creates).\\n * Ensures that OVM-related measures are enforced, including L2 gas refunds, nuisance gas, and flagged reversions.\\n *\\n * @param _nextMessageContext Message context to be used for the external message.\\n * @param _gasLimit Amount of gas to be passed into this message.\\n * @param _contract OVM address being called or deployed to\\n * @param _data Data for the message (either calldata or creation code)\\n * @param _isCreate Whether this is a create-type message.\\n * @return Whether or not the message (either a call or deployment) succeeded.\\n * @return Data returned by the message.\\n */\\n function _handleExternalMessage(\\n MessageContext memory _nextMessageContext,\\n uint256 _gasLimit,\\n address _contract,\\n bytes memory _data,\\n bool _isCreate\\n )\\n internal\\n returns (\\n bool,\\n bytes memory\\n )\\n {\\n // We need to switch over to our next message context for the duration of this call.\\n MessageContext memory prevMessageContext = messageContext;\\n _switchMessageContext(prevMessageContext, _nextMessageContext);\\n\\n // Nuisance gas is a system used to bound the ability for an attacker to make fraud proofs\\n // expensive by touching a lot of different accounts or storage slots. Since most contracts\\n // only use a few storage slots during any given transaction, this shouldn't be a limiting\\n // factor.\\n uint256 prevNuisanceGasLeft = messageRecord.nuisanceGasLeft;\\n uint256 nuisanceGasLimit = _getNuisanceGasLimit(_gasLimit);\\n messageRecord.nuisanceGasLeft = nuisanceGasLimit;\\n\\n // Make the call and make sure to pass in the gas limit. Another instance of hidden\\n // complexity. `_contract` is guaranteed to be a safe contract, meaning its return/revert\\n // behavior can be controlled. In particular, we enforce that flags are passed through\\n // revert data as to retrieve execution metadata that would normally be reverted out of\\n // existence.\\n\\n bool success;\\n bytes memory returndata;\\n if (_isCreate) {\\n // safeCREATE() is a function which replicates a CREATE message, but uses return values\\n // Which match that of CALL (i.e. bool, bytes). This allows many security checks to be\\n // to be shared between untrusted call and create call frames.\\n (success, returndata) = address(this).call(\\n abi.encodeWithSelector(\\n this.safeCREATE.selector,\\n _gasLimit,\\n _data,\\n _contract\\n )\\n );\\n } else {\\n (success, returndata) = _contract.call{gas: _gasLimit}(_data);\\n }\\n\\n // Switch back to the original message context now that we're out of the call.\\n _switchMessageContext(_nextMessageContext, prevMessageContext);\\n\\n // Assuming there were no reverts, the message record should be accurate here. We'll update\\n // this value in the case of a revert.\\n uint256 nuisanceGasLeft = messageRecord.nuisanceGasLeft;\\n\\n // Reverts at this point are completely OK, but we need to make a few updates based on the\\n // information passed through the revert.\\n if (success == false) {\\n (\\n RevertFlag flag,\\n uint256 nuisanceGasLeftPostRevert,\\n uint256 ovmGasRefund,\\n bytes memory returndataFromFlag\\n ) = _decodeRevertData(returndata);\\n\\n // INVALID_STATE_ACCESS is the only flag that triggers an immediate abort of the\\n // parent EVM message. This behavior is necessary because INVALID_STATE_ACCESS must\\n // halt any further transaction execution that could impact the execution result.\\n if (flag == RevertFlag.INVALID_STATE_ACCESS) {\\n _revertWithFlag(flag);\\n }\\n\\n // INTENTIONAL_REVERT, UNSAFE_BYTECODE, STATIC_VIOLATION, and CREATOR_NOT_ALLOWED aren't\\n // dependent on the input state, so we can just handle them like standard reverts. Our only change here\\n // is to record the gas refund reported by the call (enforced by safety checking).\\n if (\\n flag == RevertFlag.INTENTIONAL_REVERT\\n || flag == RevertFlag.UNSAFE_BYTECODE\\n || flag == RevertFlag.STATIC_VIOLATION\\n || flag == RevertFlag.CREATOR_NOT_ALLOWED\\n ) {\\n transactionRecord.ovmGasRefund = ovmGasRefund;\\n }\\n\\n // INTENTIONAL_REVERT needs to pass up the user-provided return data encoded into the\\n // flag, *not* the full encoded flag. All other revert types return no data.\\n if (\\n flag == RevertFlag.INTENTIONAL_REVERT\\n || _isCreate\\n ) {\\n returndata = returndataFromFlag;\\n } else {\\n returndata = hex'';\\n }\\n\\n // Reverts mean we need to use up whatever \\\"nuisance gas\\\" was used by the call.\\n // EXCEEDS_NUISANCE_GAS explicitly reduces the remaining nuisance gas for this message\\n // to zero. OUT_OF_GAS is a \\\"pseudo\\\" flag given that messages return no data when they\\n // run out of gas, so we have to treat this like EXCEEDS_NUISANCE_GAS. All other flags\\n // will simply pass up the remaining nuisance gas.\\n nuisanceGasLeft = nuisanceGasLeftPostRevert;\\n }\\n\\n // We need to reset the nuisance gas back to its original value minus the amount used here.\\n messageRecord.nuisanceGasLeft = prevNuisanceGasLeft - (nuisanceGasLimit - nuisanceGasLeft);\\n\\n return (\\n success,\\n returndata\\n );\\n }\\n\\n /**\\n * Handles the creation-specific safety measures required for OVM contract deployment.\\n * This function sanitizes the return types for creation messages to match calls (bool, bytes),\\n * by being an external function which the EM can call, that mimics the success/fail case of the CREATE.\\n * This allows for consistent handling of both types of messages in _handleExternalMessage().\\n * Having this step occur as a separate call frame also allows us to easily revert the\\n * contract deployment in the event that the code is unsafe.\\n *\\n * @param _gasLimit Amount of gas to be passed into this creation.\\n * @param _creationCode Code to pass into CREATE for deployment.\\n * @param _address OVM address being deployed to.\\n */\\n function safeCREATE(\\n uint _gasLimit,\\n bytes memory _creationCode,\\n address _address\\n )\\n external\\n {\\n // The only way this should callable is from within _createContract(),\\n // and it should DEFINITELY not be callable by a non-EM code contract.\\n if (msg.sender != address(this)) {\\n return;\\n }\\n // Check that there is not already code at this address.\\n if (_hasEmptyAccount(_address) == false) {\\n // Note: in the EVM, this case burns all allotted gas. For improved\\n // developer experience, we do return the remaining gas.\\n _revertWithFlag(\\n RevertFlag.CREATE_COLLISION,\\n Lib_ErrorUtils.encodeRevertString(\\\"A contract has already been deployed to this address\\\")\\n );\\n }\\n\\n // Check the creation bytecode against the OVM_SafetyChecker.\\n if (ovmSafetyChecker.isBytecodeSafe(_creationCode) == false) {\\n _revertWithFlag(\\n RevertFlag.UNSAFE_BYTECODE,\\n Lib_ErrorUtils.encodeRevertString(\\\"Contract creation code contains unsafe opcodes. Did you use the right compiler or pass an unsafe constructor argument?\\\")\\n );\\n }\\n\\n // We always need to initialize the contract with the default account values.\\n _initPendingAccount(_address);\\n\\n // Actually execute the EVM create message.\\n // NOTE: The inline assembly below means we can NOT make any evm calls between here and then.\\n address ethAddress = Lib_EthUtils.createContract(_creationCode);\\n\\n if (ethAddress == address(0)) {\\n // If the creation fails, the EVM lets us grab its revert data. This may contain a revert flag\\n // to be used above in _handleExternalMessage, so we pass the revert data back up unmodified.\\n assembly {\\n returndatacopy(0,0,returndatasize())\\n revert(0, returndatasize())\\n }\\n }\\n\\n // Again simply checking that the deployed code is safe too. Contracts can generate\\n // arbitrary deployment code, so there's no easy way to analyze this beforehand.\\n bytes memory deployedCode = Lib_EthUtils.getCode(ethAddress);\\n if (ovmSafetyChecker.isBytecodeSafe(deployedCode) == false) {\\n _revertWithFlag(\\n RevertFlag.UNSAFE_BYTECODE,\\n Lib_ErrorUtils.encodeRevertString(\\\"Constructor attempted to deploy unsafe bytecode.\\\")\\n );\\n }\\n\\n // Contract creation didn't need to be reverted and the bytecode is safe. We finish up by\\n // associating the desired address with the newly created contract's code hash and address.\\n _commitPendingAccount(\\n _address,\\n ethAddress,\\n Lib_EthUtils.getCodeHash(ethAddress)\\n );\\n }\\n\\n /******************************************\\n * Internal Functions: State Manipulation *\\n ******************************************/\\n\\n /**\\n * Checks whether an account exists within the OVM_StateManager.\\n * @param _address Address of the account to check.\\n * @return _exists Whether or not the account exists.\\n */\\n function _hasAccount(\\n address _address\\n )\\n internal\\n returns (\\n bool _exists\\n )\\n {\\n _checkAccountLoad(_address);\\n return ovmStateManager.hasAccount(_address);\\n }\\n\\n /**\\n * Checks whether a known empty account exists within the OVM_StateManager.\\n * @param _address Address of the account to check.\\n * @return _exists Whether or not the account empty exists.\\n */\\n function _hasEmptyAccount(\\n address _address\\n )\\n internal\\n returns (\\n bool _exists\\n )\\n {\\n _checkAccountLoad(_address);\\n return ovmStateManager.hasEmptyAccount(_address);\\n }\\n\\n /**\\n * Sets the nonce of an account.\\n * @param _address Address of the account to modify.\\n * @param _nonce New account nonce.\\n */\\n function _setAccountNonce(\\n address _address,\\n uint256 _nonce\\n )\\n internal\\n {\\n _checkAccountChange(_address);\\n ovmStateManager.setAccountNonce(_address, _nonce);\\n }\\n\\n /**\\n * Gets the nonce of an account.\\n * @param _address Address of the account to access.\\n * @return _nonce Nonce of the account.\\n */\\n function _getAccountNonce(\\n address _address\\n )\\n internal\\n returns (\\n uint256 _nonce\\n )\\n {\\n _checkAccountLoad(_address);\\n return ovmStateManager.getAccountNonce(_address);\\n }\\n\\n /**\\n * Retrieves the Ethereum address of an account.\\n * @param _address Address of the account to access.\\n * @return _ethAddress Corresponding Ethereum address.\\n */\\n function _getAccountEthAddress(\\n address _address\\n )\\n internal\\n returns (\\n address _ethAddress\\n )\\n {\\n _checkAccountLoad(_address);\\n return ovmStateManager.getAccountEthAddress(_address);\\n }\\n\\n /**\\n * Creates the default account object for the given address.\\n * @param _address Address of the account create.\\n */\\n function _initPendingAccount(\\n address _address\\n )\\n internal\\n {\\n // Although it seems like `_checkAccountChange` would be more appropriate here, we don't\\n // actually consider an account \\\"changed\\\" until it's inserted into the state (in this case\\n // by `_commitPendingAccount`).\\n _checkAccountLoad(_address);\\n ovmStateManager.initPendingAccount(_address);\\n }\\n\\n /**\\n * Stores additional relevant data for a new account, thereby \\\"committing\\\" it to the state.\\n * This function is only called during `ovmCREATE` and `ovmCREATE2` after a successful contract\\n * creation.\\n * @param _address Address of the account to commit.\\n * @param _ethAddress Address of the associated deployed contract.\\n * @param _codeHash Hash of the code stored at the address.\\n */\\n function _commitPendingAccount(\\n address _address,\\n address _ethAddress,\\n bytes32 _codeHash\\n )\\n internal\\n {\\n _checkAccountChange(_address);\\n ovmStateManager.commitPendingAccount(\\n _address,\\n _ethAddress,\\n _codeHash\\n );\\n }\\n\\n /**\\n * Retrieves the value of a storage slot.\\n * @param _contract Address of the contract to query.\\n * @param _key 32 byte key of the storage slot.\\n * @return _value 32 byte storage slot value.\\n */\\n function _getContractStorage(\\n address _contract,\\n bytes32 _key\\n )\\n internal\\n returns (\\n bytes32 _value\\n )\\n {\\n _checkContractStorageLoad(_contract, _key);\\n return ovmStateManager.getContractStorage(_contract, _key);\\n }\\n\\n /**\\n * Sets the value of a storage slot.\\n * @param _contract Address of the contract to modify.\\n * @param _key 32 byte key of the storage slot.\\n * @param _value 32 byte storage slot value.\\n */\\n function _putContractStorage(\\n address _contract,\\n bytes32 _key,\\n bytes32 _value\\n )\\n internal\\n {\\n // We don't set storage if the value didn't change. Although this acts as a convenient\\n // optimization, it's also necessary to avoid the case in which a contract with no storage\\n // attempts to store the value \\\"0\\\" at any key. Putting this value (and therefore requiring\\n // that the value be committed into the storage trie after execution) would incorrectly\\n // modify the storage root.\\n if (_getContractStorage(_contract, _key) == _value) {\\n return;\\n }\\n\\n _checkContractStorageChange(_contract, _key);\\n ovmStateManager.putContractStorage(_contract, _key, _value);\\n }\\n\\n /**\\n * Validation whenever a contract needs to be loaded. Checks that the account exists, charges\\n * nuisance gas if the account hasn't been loaded before.\\n * @param _address Address of the account to load.\\n */\\n function _checkAccountLoad(\\n address _address\\n )\\n internal\\n {\\n // See `_checkContractStorageLoad` for more information.\\n if (gasleft() < MIN_GAS_FOR_INVALID_STATE_ACCESS) {\\n _revertWithFlag(RevertFlag.OUT_OF_GAS);\\n }\\n\\n // See `_checkContractStorageLoad` for more information.\\n if (ovmStateManager.hasAccount(_address) == false) {\\n _revertWithFlag(RevertFlag.INVALID_STATE_ACCESS);\\n }\\n\\n // Check whether the account has been loaded before and mark it as loaded if not. We need\\n // this because \\\"nuisance gas\\\" only applies to the first time that an account is loaded.\\n (\\n bool _wasAccountAlreadyLoaded\\n ) = ovmStateManager.testAndSetAccountLoaded(_address);\\n\\n // If we hadn't already loaded the account, then we'll need to charge \\\"nuisance gas\\\" based\\n // on the size of the contract code.\\n if (_wasAccountAlreadyLoaded == false) {\\n _useNuisanceGas(\\n (Lib_EthUtils.getCodeSize(_getAccountEthAddress(_address)) * NUISANCE_GAS_PER_CONTRACT_BYTE) + MIN_NUISANCE_GAS_PER_CONTRACT\\n );\\n }\\n }\\n\\n /**\\n * Validation whenever a contract needs to be changed. Checks that the account exists, charges\\n * nuisance gas if the account hasn't been changed before.\\n * @param _address Address of the account to change.\\n */\\n function _checkAccountChange(\\n address _address\\n )\\n internal\\n {\\n // Start by checking for a load as we only want to charge nuisance gas proportional to\\n // contract size once.\\n _checkAccountLoad(_address);\\n\\n // Check whether the account has been changed before and mark it as changed if not. We need\\n // this because \\\"nuisance gas\\\" only applies to the first time that an account is changed.\\n (\\n bool _wasAccountAlreadyChanged\\n ) = ovmStateManager.testAndSetAccountChanged(_address);\\n\\n // If we hadn't already loaded the account, then we'll need to charge \\\"nuisance gas\\\" based\\n // on the size of the contract code.\\n if (_wasAccountAlreadyChanged == false) {\\n ovmStateManager.incrementTotalUncommittedAccounts();\\n _useNuisanceGas(\\n (Lib_EthUtils.getCodeSize(_getAccountEthAddress(_address)) * NUISANCE_GAS_PER_CONTRACT_BYTE) + MIN_NUISANCE_GAS_PER_CONTRACT\\n );\\n }\\n }\\n\\n /**\\n * Validation whenever a slot needs to be loaded. Checks that the account exists, charges\\n * nuisance gas if the slot hasn't been loaded before.\\n * @param _contract Address of the account to load from.\\n * @param _key 32 byte key to load.\\n */\\n function _checkContractStorageLoad(\\n address _contract,\\n bytes32 _key\\n )\\n internal\\n {\\n // Another case of hidden complexity. If we didn't enforce this requirement, then a\\n // contract could pass in just enough gas to cause the INVALID_STATE_ACCESS check to fail\\n // on L1 but not on L2. A contract could use this behavior to prevent the\\n // OVM_ExecutionManager from detecting an invalid state access. Reverting with OUT_OF_GAS\\n // allows us to also charge for the full message nuisance gas, because you deserve that for\\n // trying to break the contract in this way.\\n if (gasleft() < MIN_GAS_FOR_INVALID_STATE_ACCESS) {\\n _revertWithFlag(RevertFlag.OUT_OF_GAS);\\n }\\n\\n // We need to make sure that the transaction isn't trying to access storage that hasn't\\n // been provided to the OVM_StateManager. We'll immediately abort if this is the case.\\n // We know that we have enough gas to do this check because of the above test.\\n if (ovmStateManager.hasContractStorage(_contract, _key) == false) {\\n _revertWithFlag(RevertFlag.INVALID_STATE_ACCESS);\\n }\\n\\n // Check whether the slot has been loaded before and mark it as loaded if not. We need\\n // this because \\\"nuisance gas\\\" only applies to the first time that a slot is loaded.\\n (\\n bool _wasContractStorageAlreadyLoaded\\n ) = ovmStateManager.testAndSetContractStorageLoaded(_contract, _key);\\n\\n // If we hadn't already loaded the account, then we'll need to charge some fixed amount of\\n // \\\"nuisance gas\\\".\\n if (_wasContractStorageAlreadyLoaded == false) {\\n _useNuisanceGas(NUISANCE_GAS_SLOAD);\\n }\\n }\\n\\n /**\\n * Validation whenever a slot needs to be changed. Checks that the account exists, charges\\n * nuisance gas if the slot hasn't been changed before.\\n * @param _contract Address of the account to change.\\n * @param _key 32 byte key to change.\\n */\\n function _checkContractStorageChange(\\n address _contract,\\n bytes32 _key\\n )\\n internal\\n {\\n // Start by checking for load to make sure we have the storage slot and that we charge the\\n // \\\"nuisance gas\\\" necessary to prove the storage slot state.\\n _checkContractStorageLoad(_contract, _key);\\n\\n // Check whether the slot has been changed before and mark it as changed if not. We need\\n // this because \\\"nuisance gas\\\" only applies to the first time that a slot is changed.\\n (\\n bool _wasContractStorageAlreadyChanged\\n ) = ovmStateManager.testAndSetContractStorageChanged(_contract, _key);\\n\\n // If we hadn't already changed the account, then we'll need to charge some fixed amount of\\n // \\\"nuisance gas\\\".\\n if (_wasContractStorageAlreadyChanged == false) {\\n // Changing a storage slot means that we're also going to have to change the\\n // corresponding account, so do an account change check.\\n _checkAccountChange(_contract);\\n\\n ovmStateManager.incrementTotalUncommittedContractStorage();\\n _useNuisanceGas(NUISANCE_GAS_SSTORE);\\n }\\n }\\n\\n\\n /************************************\\n * Internal Functions: Revert Logic *\\n ************************************/\\n\\n /**\\n * Simple encoding for revert data.\\n * @param _flag Flag to revert with.\\n * @param _data Additional user-provided revert data.\\n * @return _revertdata Encoded revert data.\\n */\\n function _encodeRevertData(\\n RevertFlag _flag,\\n bytes memory _data\\n )\\n internal\\n view\\n returns (\\n bytes memory _revertdata\\n )\\n {\\n // Out of gas and create exceptions will fundamentally return no data, so simulating it shouldn't either.\\n if (\\n _flag == RevertFlag.OUT_OF_GAS\\n ) {\\n return bytes('');\\n }\\n\\n // INVALID_STATE_ACCESS doesn't need to return any data other than the flag.\\n if (_flag == RevertFlag.INVALID_STATE_ACCESS) {\\n return abi.encode(\\n _flag,\\n 0,\\n 0,\\n bytes('')\\n );\\n }\\n\\n // Just ABI encode the rest of the parameters.\\n return abi.encode(\\n _flag,\\n messageRecord.nuisanceGasLeft,\\n transactionRecord.ovmGasRefund,\\n _data\\n );\\n }\\n\\n /**\\n * Simple decoding for revert data.\\n * @param _revertdata Revert data to decode.\\n * @return _flag Flag used to revert.\\n * @return _nuisanceGasLeft Amount of nuisance gas unused by the message.\\n * @return _ovmGasRefund Amount of gas refunded during the message.\\n * @return _data Additional user-provided revert data.\\n */\\n function _decodeRevertData(\\n bytes memory _revertdata\\n )\\n internal\\n pure\\n returns (\\n RevertFlag _flag,\\n uint256 _nuisanceGasLeft,\\n uint256 _ovmGasRefund,\\n bytes memory _data\\n )\\n {\\n // A length of zero means the call ran out of gas, just return empty data.\\n if (_revertdata.length == 0) {\\n return (\\n RevertFlag.OUT_OF_GAS,\\n 0,\\n 0,\\n bytes('')\\n );\\n }\\n\\n // ABI decode the incoming data.\\n return abi.decode(_revertdata, (RevertFlag, uint256, uint256, bytes));\\n }\\n\\n /**\\n * Causes a message to revert or abort.\\n * @param _flag Flag to revert with.\\n * @param _data Additional user-provided data.\\n */\\n function _revertWithFlag(\\n RevertFlag _flag,\\n bytes memory _data\\n )\\n internal\\n view\\n {\\n bytes memory revertdata = _encodeRevertData(\\n _flag,\\n _data\\n );\\n\\n assembly {\\n revert(add(revertdata, 0x20), mload(revertdata))\\n }\\n }\\n\\n /**\\n * Causes a message to revert or abort.\\n * @param _flag Flag to revert with.\\n */\\n function _revertWithFlag(\\n RevertFlag _flag\\n )\\n internal\\n {\\n _revertWithFlag(_flag, bytes(''));\\n }\\n\\n\\n /******************************************\\n * Internal Functions: Nuisance Gas Logic *\\n ******************************************/\\n\\n /**\\n * Computes the nuisance gas limit from the gas limit.\\n * @dev This function is currently using a naive implementation whereby the nuisance gas limit\\n * is set to exactly equal the lesser of the gas limit or remaining gas. It's likely that\\n * this implementation is perfectly fine, but we may change this formula later.\\n * @param _gasLimit Gas limit to compute from.\\n * @return _nuisanceGasLimit Computed nuisance gas limit.\\n */\\n function _getNuisanceGasLimit(\\n uint256 _gasLimit\\n )\\n internal\\n view\\n returns (\\n uint256 _nuisanceGasLimit\\n )\\n {\\n return _gasLimit < gasleft() ? _gasLimit : gasleft();\\n }\\n\\n /**\\n * Uses a certain amount of nuisance gas.\\n * @param _amount Amount of nuisance gas to use.\\n */\\n function _useNuisanceGas(\\n uint256 _amount\\n )\\n internal\\n {\\n // Essentially the same as a standard OUT_OF_GAS, except we also retain a record of the gas\\n // refund to be given at the end of the transaction.\\n if (messageRecord.nuisanceGasLeft < _amount) {\\n _revertWithFlag(RevertFlag.EXCEEDS_NUISANCE_GAS);\\n }\\n\\n messageRecord.nuisanceGasLeft -= _amount;\\n }\\n\\n\\n /************************************\\n * Internal Functions: Gas Metering *\\n ************************************/\\n\\n /**\\n * Checks whether a transaction needs to start a new epoch and does so if necessary.\\n * @param _timestamp Transaction timestamp.\\n */\\n function _checkNeedsNewEpoch(\\n uint256 _timestamp\\n )\\n internal\\n {\\n if (\\n _timestamp >= (\\n _getGasMetadata(GasMetadataKey.CURRENT_EPOCH_START_TIMESTAMP)\\n + gasMeterConfig.secondsPerEpoch\\n )\\n ) {\\n _putGasMetadata(\\n GasMetadataKey.CURRENT_EPOCH_START_TIMESTAMP,\\n _timestamp\\n );\\n\\n _putGasMetadata(\\n GasMetadataKey.PREV_EPOCH_SEQUENCER_QUEUE_GAS,\\n _getGasMetadata(\\n GasMetadataKey.CUMULATIVE_SEQUENCER_QUEUE_GAS\\n )\\n );\\n\\n _putGasMetadata(\\n GasMetadataKey.PREV_EPOCH_L1TOL2_QUEUE_GAS,\\n _getGasMetadata(\\n GasMetadataKey.CUMULATIVE_L1TOL2_QUEUE_GAS\\n )\\n );\\n }\\n }\\n\\n /**\\n * Validates the input values of a transaction.\\n * @return _valid Whether or not the transaction data is valid.\\n */\\n function _isValidInput(\\n Lib_OVMCodec.Transaction memory _transaction\\n )\\n view\\n internal\\n returns (\\n bool\\n )\\n {\\n // Prevent reentrancy to run():\\n // This check prevents calling run with the default ovmNumber.\\n // Combined with the first check in run():\\n // if (transactionContext.ovmNUMBER != DEFAULT_UINT256) { return; }\\n // It should be impossible to re-enter since run() returns before any other call frames are created.\\n // Since this value is already being written to storage, we save much gas compared to\\n // using the standard nonReentrant pattern.\\n if (_transaction.blockNumber == DEFAULT_UINT256) {\\n return false;\\n }\\n\\n if (_isValidGasLimit(_transaction.gasLimit, _transaction.l1QueueOrigin) == false) {\\n return false;\\n }\\n\\n return true;\\n }\\n\\n /**\\n * Validates the gas limit for a given transaction.\\n * @param _gasLimit Gas limit provided by the transaction.\\n * param _queueOrigin Queue from which the transaction originated.\\n * @return _valid Whether or not the gas limit is valid.\\n */\\n function _isValidGasLimit(\\n uint256 _gasLimit,\\n Lib_OVMCodec.QueueOrigin // _queueOrigin\\n )\\n view\\n internal\\n returns (\\n bool _valid\\n )\\n {\\n // Always have to be below the maximum gas limit.\\n if (_gasLimit > gasMeterConfig.maxTransactionGasLimit) {\\n return false;\\n }\\n\\n // Always have to be above the minimum gas limit.\\n if (_gasLimit < gasMeterConfig.minTransactionGasLimit) {\\n return false;\\n }\\n\\n // TEMPORARY: Gas metering is disabled for minnet.\\n return true;\\n // GasMetadataKey cumulativeGasKey;\\n // GasMetadataKey prevEpochGasKey;\\n // if (_queueOrigin == Lib_OVMCodec.QueueOrigin.SEQUENCER_QUEUE) {\\n // cumulativeGasKey = GasMetadataKey.CUMULATIVE_SEQUENCER_QUEUE_GAS;\\n // prevEpochGasKey = GasMetadataKey.PREV_EPOCH_SEQUENCER_QUEUE_GAS;\\n // } else {\\n // cumulativeGasKey = GasMetadataKey.CUMULATIVE_L1TOL2_QUEUE_GAS;\\n // prevEpochGasKey = GasMetadataKey.PREV_EPOCH_L1TOL2_QUEUE_GAS;\\n // }\\n\\n // return (\\n // (\\n // _getGasMetadata(cumulativeGasKey)\\n // - _getGasMetadata(prevEpochGasKey)\\n // + _gasLimit\\n // ) < gasMeterConfig.maxGasPerQueuePerEpoch\\n // );\\n }\\n\\n /**\\n * Updates the cumulative gas after a transaction.\\n * @param _gasUsed Gas used by the transaction.\\n * @param _queueOrigin Queue from which the transaction originated.\\n */\\n function _updateCumulativeGas(\\n uint256 _gasUsed,\\n Lib_OVMCodec.QueueOrigin _queueOrigin\\n )\\n internal\\n {\\n GasMetadataKey cumulativeGasKey;\\n if (_queueOrigin == Lib_OVMCodec.QueueOrigin.SEQUENCER_QUEUE) {\\n cumulativeGasKey = GasMetadataKey.CUMULATIVE_SEQUENCER_QUEUE_GAS;\\n } else {\\n cumulativeGasKey = GasMetadataKey.CUMULATIVE_L1TOL2_QUEUE_GAS;\\n }\\n\\n _putGasMetadata(\\n cumulativeGasKey,\\n (\\n _getGasMetadata(cumulativeGasKey)\\n + gasMeterConfig.minTransactionGasLimit\\n + _gasUsed\\n - transactionRecord.ovmGasRefund\\n )\\n );\\n }\\n\\n /**\\n * Retrieves the value of a gas metadata key.\\n * @param _key Gas metadata key to retrieve.\\n * @return _value Value stored at the given key.\\n */\\n function _getGasMetadata(\\n GasMetadataKey _key\\n )\\n internal\\n returns (\\n uint256 _value\\n )\\n {\\n return uint256(_getContractStorage(\\n GAS_METADATA_ADDRESS,\\n bytes32(uint256(_key))\\n ));\\n }\\n\\n /**\\n * Sets the value of a gas metadata key.\\n * @param _key Gas metadata key to set.\\n * @param _value Value to store at the given key.\\n */\\n function _putGasMetadata(\\n GasMetadataKey _key,\\n uint256 _value\\n )\\n internal\\n {\\n _putContractStorage(\\n GAS_METADATA_ADDRESS,\\n bytes32(uint256(_key)),\\n bytes32(uint256(_value))\\n );\\n }\\n\\n\\n /*****************************************\\n * Internal Functions: Execution Context *\\n *****************************************/\\n\\n /**\\n * Swaps over to a new message context.\\n * @param _prevMessageContext Context we're switching from.\\n * @param _nextMessageContext Context we're switching to.\\n */\\n function _switchMessageContext(\\n MessageContext memory _prevMessageContext,\\n MessageContext memory _nextMessageContext\\n )\\n internal\\n {\\n // Avoid unnecessary the SSTORE.\\n if (_prevMessageContext.ovmCALLER != _nextMessageContext.ovmCALLER) {\\n messageContext.ovmCALLER = _nextMessageContext.ovmCALLER;\\n }\\n\\n // Avoid unnecessary the SSTORE.\\n if (_prevMessageContext.ovmADDRESS != _nextMessageContext.ovmADDRESS) {\\n messageContext.ovmADDRESS = _nextMessageContext.ovmADDRESS;\\n }\\n\\n // Avoid unnecessary the SSTORE.\\n if (_prevMessageContext.isStatic != _nextMessageContext.isStatic) {\\n messageContext.isStatic = _nextMessageContext.isStatic;\\n }\\n }\\n\\n /**\\n * Initializes the execution context.\\n * @param _transaction OVM transaction being executed.\\n */\\n function _initContext(\\n Lib_OVMCodec.Transaction memory _transaction\\n )\\n internal\\n {\\n transactionContext.ovmTIMESTAMP = _transaction.timestamp;\\n transactionContext.ovmNUMBER = _transaction.blockNumber;\\n transactionContext.ovmTXGASLIMIT = _transaction.gasLimit;\\n transactionContext.ovmL1QUEUEORIGIN = _transaction.l1QueueOrigin;\\n transactionContext.ovmL1TXORIGIN = _transaction.l1TxOrigin;\\n transactionContext.ovmGASLIMIT = gasMeterConfig.maxGasPerQueuePerEpoch;\\n\\n messageRecord.nuisanceGasLeft = _getNuisanceGasLimit(_transaction.gasLimit);\\n }\\n\\n /**\\n * Resets the transaction and message context.\\n */\\n function _resetContext()\\n internal\\n {\\n transactionContext.ovmL1TXORIGIN = DEFAULT_ADDRESS;\\n transactionContext.ovmTIMESTAMP = DEFAULT_UINT256;\\n transactionContext.ovmNUMBER = DEFAULT_UINT256;\\n transactionContext.ovmGASLIMIT = DEFAULT_UINT256;\\n transactionContext.ovmTXGASLIMIT = DEFAULT_UINT256;\\n transactionContext.ovmL1QUEUEORIGIN = Lib_OVMCodec.QueueOrigin.SEQUENCER_QUEUE;\\n\\n transactionRecord.ovmGasRefund = DEFAULT_UINT256;\\n\\n messageContext.ovmCALLER = DEFAULT_ADDRESS;\\n messageContext.ovmADDRESS = DEFAULT_ADDRESS;\\n messageContext.isStatic = false;\\n\\n messageRecord.nuisanceGasLeft = DEFAULT_UINT256;\\n\\n // Reset the ovmStateManager.\\n ovmStateManager = iOVM_StateManager(address(0));\\n }\\n\\n /*****************************\\n * L2-only Helper Functions *\\n *****************************/\\n\\n /**\\n * Unreachable helper function for simulating eth_calls with an OVM message context.\\n * This function will throw an exception in all cases other than when used as a custom entrypoint in L2 Geth to simulate eth_call.\\n * @param _transaction the message transaction to simulate.\\n * @param _from the OVM account the simulated call should be from.\\n */\\n function simulateMessage(\\n Lib_OVMCodec.Transaction memory _transaction,\\n address _from,\\n iOVM_StateManager _ovmStateManager\\n )\\n external\\n returns (\\n bool,\\n bytes memory\\n )\\n {\\n // Prevent this call from having any effect unless in a custom-set VM frame\\n require(msg.sender == address(0));\\n\\n ovmStateManager = _ovmStateManager;\\n _initContext(_transaction);\\n messageRecord.nuisanceGasLeft = uint(-1);\\n\\n messageContext.ovmADDRESS = _from;\\n\\n bool isCreate = _transaction.entrypoint == address(0);\\n if (isCreate) {\\n (address created, bytes memory revertData) = ovmCREATE(_transaction.data);\\n if (created == address(0)) {\\n return (false, revertData);\\n } else {\\n // The eth_call RPC endpoint for to = undefined will return the deployed bytecode\\n // in the success case, differing from standard create messages.\\n return (true, Lib_EthUtils.getCode(created));\\n }\\n } else {\\n return ovmCALL(\\n _transaction.gasLimit,\\n _transaction.entrypoint,\\n _transaction.data\\n );\\n }\\n }\\n}\\n\",\"keccak256\":\"0x229011db3d21b69e16814325f8e5debbdf6219b3dffb4011a24f2a6540a0d98e\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/predeploys/OVM_DeployerWhitelist.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Interface Imports */\\nimport { iOVM_DeployerWhitelist } from \\\"../../iOVM/predeploys/iOVM_DeployerWhitelist.sol\\\";\\n\\n/**\\n * @title OVM_DeployerWhitelist\\n * @dev The Deployer Whitelist is a temporary predeploy used to provide additional safety during the\\n * initial phases of our mainnet roll out. It is owned by the Optimism team, and defines accounts\\n * which are allowed to deploy contracts on Layer2. The Execution Manager will only allow an\\n * ovmCREATE or ovmCREATE2 operation to proceed if the deployer's address whitelisted.\\n *\\n * Compiler used: optimistic-solc\\n * Runtime target: OVM\\n */\\ncontract OVM_DeployerWhitelist is iOVM_DeployerWhitelist {\\n\\n /**********************\\n * Contract Constants *\\n **********************/\\n\\n bool public initialized;\\n bool public allowArbitraryDeployment;\\n address override public owner;\\n mapping (address => bool) public whitelist;\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n /**\\n * Blocks functions to anyone except the contract owner.\\n */\\n modifier onlyOwner() {\\n require(\\n msg.sender == owner,\\n \\\"Function can only be called by the owner of this contract.\\\"\\n );\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Initializes the whitelist.\\n * @param _owner Address of the owner for this contract.\\n * @param _allowArbitraryDeployment Whether or not to allow arbitrary contract deployment.\\n */\\n function initialize(\\n address _owner,\\n bool _allowArbitraryDeployment\\n )\\n override\\n public\\n {\\n if (initialized == true) {\\n return;\\n }\\n\\n initialized = true;\\n allowArbitraryDeployment = _allowArbitraryDeployment;\\n owner = _owner;\\n }\\n\\n /**\\n * Adds or removes an address from the deployment whitelist.\\n * @param _deployer Address to update permissions for.\\n * @param _isWhitelisted Whether or not the address is whitelisted.\\n */\\n function setWhitelistedDeployer(\\n address _deployer,\\n bool _isWhitelisted\\n )\\n override\\n public\\n onlyOwner\\n {\\n whitelist[_deployer] = _isWhitelisted;\\n }\\n\\n /**\\n * Updates the owner of this contract.\\n * @param _owner Address of the new owner.\\n */\\n function setOwner(\\n address _owner\\n )\\n override\\n public\\n onlyOwner\\n {\\n owner = _owner;\\n }\\n\\n /**\\n * Updates the arbitrary deployment flag.\\n * @param _allowArbitraryDeployment Whether or not to allow arbitrary contract deployment.\\n */\\n function setAllowArbitraryDeployment(\\n bool _allowArbitraryDeployment\\n )\\n override\\n public\\n onlyOwner\\n {\\n allowArbitraryDeployment = _allowArbitraryDeployment;\\n }\\n\\n /**\\n * Permanently enables arbitrary contract deployment and deletes the owner.\\n */\\n function enableArbitraryContractDeployment()\\n override\\n public\\n onlyOwner\\n {\\n setAllowArbitraryDeployment(true);\\n setOwner(address(0));\\n }\\n\\n /**\\n * Checks whether an address is allowed to deploy contracts.\\n * @param _deployer Address to check.\\n * @return _allowed Whether or not the address can deploy contracts.\\n */\\n function isDeployerAllowed(\\n address _deployer\\n )\\n override\\n public\\n returns (\\n bool\\n )\\n {\\n return (\\n initialized == false\\n || allowArbitraryDeployment == true\\n || whitelist[_deployer]\\n );\\n }\\n}\\n\",\"keccak256\":\"0x371e3d3ca1dd4177738b55eead9ad6f8278280e568694df6b42ee01f5558ccb2\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/execution/iOVM_ExecutionManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\ninterface iOVM_ExecutionManager {\\n /**********\\n * Enums *\\n *********/\\n\\n enum RevertFlag {\\n OUT_OF_GAS,\\n INTENTIONAL_REVERT,\\n EXCEEDS_NUISANCE_GAS,\\n INVALID_STATE_ACCESS,\\n UNSAFE_BYTECODE,\\n CREATE_COLLISION,\\n STATIC_VIOLATION,\\n CREATOR_NOT_ALLOWED\\n }\\n\\n enum GasMetadataKey {\\n CURRENT_EPOCH_START_TIMESTAMP,\\n CUMULATIVE_SEQUENCER_QUEUE_GAS,\\n CUMULATIVE_L1TOL2_QUEUE_GAS,\\n PREV_EPOCH_SEQUENCER_QUEUE_GAS,\\n PREV_EPOCH_L1TOL2_QUEUE_GAS\\n }\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct GasMeterConfig {\\n uint256 minTransactionGasLimit;\\n uint256 maxTransactionGasLimit;\\n uint256 maxGasPerQueuePerEpoch;\\n uint256 secondsPerEpoch;\\n }\\n\\n struct GlobalContext {\\n uint256 ovmCHAINID;\\n }\\n\\n struct TransactionContext {\\n Lib_OVMCodec.QueueOrigin ovmL1QUEUEORIGIN;\\n uint256 ovmTIMESTAMP;\\n uint256 ovmNUMBER;\\n uint256 ovmGASLIMIT;\\n uint256 ovmTXGASLIMIT;\\n address ovmL1TXORIGIN;\\n }\\n\\n struct TransactionRecord {\\n uint256 ovmGasRefund;\\n }\\n\\n struct MessageContext {\\n address ovmCALLER;\\n address ovmADDRESS;\\n bool isStatic;\\n }\\n\\n struct MessageRecord {\\n uint256 nuisanceGasLeft;\\n }\\n\\n\\n /************************************\\n * Transaction Execution Entrypoint *\\n ************************************/\\n\\n function run(\\n Lib_OVMCodec.Transaction calldata _transaction,\\n address _txStateManager\\n ) external returns (bytes memory);\\n\\n\\n /*******************\\n * Context Opcodes *\\n *******************/\\n\\n function ovmCALLER() external view returns (address _caller);\\n function ovmADDRESS() external view returns (address _address);\\n function ovmTIMESTAMP() external view returns (uint256 _timestamp);\\n function ovmNUMBER() external view returns (uint256 _number);\\n function ovmGASLIMIT() external view returns (uint256 _gasLimit);\\n function ovmCHAINID() external view returns (uint256 _chainId);\\n\\n\\n /**********************\\n * L2 Context Opcodes *\\n **********************/\\n\\n function ovmL1QUEUEORIGIN() external view returns (Lib_OVMCodec.QueueOrigin _queueOrigin);\\n function ovmL1TXORIGIN() external view returns (address _l1TxOrigin);\\n\\n\\n /*******************\\n * Halting Opcodes *\\n *******************/\\n\\n function ovmREVERT(bytes memory _data) external;\\n\\n\\n /*****************************\\n * Contract Creation Opcodes *\\n *****************************/\\n\\n function ovmCREATE(bytes memory _bytecode) external returns (address _contract, bytes memory _revertdata);\\n function ovmCREATE2(bytes memory _bytecode, bytes32 _salt) external returns (address _contract, bytes memory _revertdata);\\n\\n\\n /*******************************\\n * Account Abstraction Opcodes *\\n ******************************/\\n\\n function ovmGETNONCE() external returns (uint256 _nonce);\\n function ovmINCREMENTNONCE() external;\\n function ovmCREATEEOA(bytes32 _messageHash, uint8 _v, bytes32 _r, bytes32 _s) external;\\n\\n\\n /****************************\\n * Contract Calling Opcodes *\\n ****************************/\\n\\n function ovmCALL(uint256 _gasLimit, address _address, bytes memory _calldata) external returns (bool _success, bytes memory _returndata);\\n function ovmSTATICCALL(uint256 _gasLimit, address _address, bytes memory _calldata) external returns (bool _success, bytes memory _returndata);\\n function ovmDELEGATECALL(uint256 _gasLimit, address _address, bytes memory _calldata) external returns (bool _success, bytes memory _returndata);\\n\\n\\n /****************************\\n * Contract Storage Opcodes *\\n ****************************/\\n\\n function ovmSLOAD(bytes32 _key) external returns (bytes32 _value);\\n function ovmSSTORE(bytes32 _key, bytes32 _value) external;\\n\\n\\n /*************************\\n * Contract Code Opcodes *\\n *************************/\\n\\n function ovmEXTCODECOPY(address _contract, uint256 _offset, uint256 _length) external returns (bytes memory _code);\\n function ovmEXTCODESIZE(address _contract) external returns (uint256 _size);\\n function ovmEXTCODEHASH(address _contract) external returns (bytes32 _hash);\\n\\n\\n /***************************************\\n * Public Functions: Execution Context *\\n ***************************************/\\n\\n function getMaxTransactionGasLimit() external view returns (uint _maxTransactionGasLimit);\\n}\\n\",\"keccak256\":\"0xf023d5d6fc6a03bd52f7a57af6e21076de77e8925d065bb79db062e73e43b684\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/execution/iOVM_SafetyChecker.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title iOVM_SafetyChecker\\n */\\ninterface iOVM_SafetyChecker {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function isBytecodeSafe(bytes calldata _bytecode) external pure returns (bool);\\n}\\n\",\"keccak256\":\"0xde6639676d4ec4f77297652d5ede2429bc93e74e11fefd9e9de4bc92dd784878\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/execution/iOVM_StateManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title iOVM_StateManager\\n */\\ninterface iOVM_StateManager {\\n\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n enum ItemState {\\n ITEM_UNTOUCHED,\\n ITEM_LOADED,\\n ITEM_CHANGED,\\n ITEM_COMMITTED\\n }\\n\\n /***************************\\n * Public Functions: Misc *\\n ***************************/\\n\\n function isAuthenticated(address _address) external view returns (bool);\\n\\n /***************************\\n * Public Functions: Setup *\\n ***************************/\\n\\n function owner() external view returns (address _owner);\\n function ovmExecutionManager() external view returns (address _ovmExecutionManager);\\n function setExecutionManager(address _ovmExecutionManager) external;\\n\\n\\n /************************************\\n * Public Functions: Account Access *\\n ************************************/\\n\\n function putAccount(address _address, Lib_OVMCodec.Account memory _account) external;\\n function putEmptyAccount(address _address) external;\\n function getAccount(address _address) external view returns (Lib_OVMCodec.Account memory _account);\\n function hasAccount(address _address) external view returns (bool _exists);\\n function hasEmptyAccount(address _address) external view returns (bool _exists);\\n function setAccountNonce(address _address, uint256 _nonce) external;\\n function getAccountNonce(address _address) external view returns (uint256 _nonce);\\n function getAccountEthAddress(address _address) external view returns (address _ethAddress);\\n function getAccountStorageRoot(address _address) external view returns (bytes32 _storageRoot);\\n function initPendingAccount(address _address) external;\\n function commitPendingAccount(address _address, address _ethAddress, bytes32 _codeHash) external;\\n function testAndSetAccountLoaded(address _address) external returns (bool _wasAccountAlreadyLoaded);\\n function testAndSetAccountChanged(address _address) external returns (bool _wasAccountAlreadyChanged);\\n function commitAccount(address _address) external returns (bool _wasAccountCommitted);\\n function incrementTotalUncommittedAccounts() external;\\n function getTotalUncommittedAccounts() external view returns (uint256 _total);\\n function wasAccountChanged(address _address) external view returns (bool);\\n function wasAccountCommitted(address _address) external view returns (bool);\\n\\n\\n /************************************\\n * Public Functions: Storage Access *\\n ************************************/\\n\\n function putContractStorage(address _contract, bytes32 _key, bytes32 _value) external;\\n function getContractStorage(address _contract, bytes32 _key) external view returns (bytes32 _value);\\n function hasContractStorage(address _contract, bytes32 _key) external view returns (bool _exists);\\n function testAndSetContractStorageLoaded(address _contract, bytes32 _key) external returns (bool _wasContractStorageAlreadyLoaded);\\n function testAndSetContractStorageChanged(address _contract, bytes32 _key) external returns (bool _wasContractStorageAlreadyChanged);\\n function commitContractStorage(address _contract, bytes32 _key) external returns (bool _wasContractStorageCommitted);\\n function incrementTotalUncommittedContractStorage() external;\\n function getTotalUncommittedContractStorage() external view returns (uint256 _total);\\n function wasContractStorageChanged(address _contract, bytes32 _key) external view returns (bool);\\n function wasContractStorageCommitted(address _contract, bytes32 _key) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x7a11dbd1f61593ba34debe07e39eef59967307f7f372ba9855bee0953585d08d\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/predeploys/iOVM_DeployerWhitelist.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title iOVM_DeployerWhitelist\\n */\\ninterface iOVM_DeployerWhitelist {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function initialize(address _owner, bool _allowArbitraryDeployment) external;\\n function owner() external returns (address _owner);\\n function setWhitelistedDeployer(address _deployer, bool _isWhitelisted) external;\\n function setOwner(address _newOwner) external;\\n function setAllowArbitraryDeployment(bool _allowArbitraryDeployment) external;\\n function enableArbitraryContractDeployment() external;\\n function isDeployerAllowed(address _deployer) external returns (bool _allowed);\\n}\\n\",\"keccak256\":\"0xdf1f27faf0d26d416bf6d408d146a16de32b4e1772a292c65d39eb7ec2b53ceb\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/codec/Lib_OVMCodec.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../utils/Lib_Bytes32Utils.sol\\\";\\n\\n/**\\n * @title Lib_OVMCodec\\n */\\nlibrary Lib_OVMCodec {\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum QueueOrigin {\\n SEQUENCER_QUEUE,\\n L1TOL2_QUEUE\\n }\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Account {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n address ethAddress;\\n bool isFresh;\\n }\\n\\n struct EVMAccount {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n }\\n\\n struct ChainBatchHeader {\\n uint256 batchIndex;\\n bytes32 batchRoot;\\n uint256 batchSize;\\n uint256 prevTotalElements;\\n bytes extraData;\\n }\\n\\n struct ChainInclusionProof {\\n uint256 index;\\n bytes32[] siblings;\\n }\\n\\n struct Transaction {\\n uint256 timestamp;\\n uint256 blockNumber;\\n QueueOrigin l1QueueOrigin;\\n address l1TxOrigin;\\n address entrypoint;\\n uint256 gasLimit;\\n bytes data;\\n }\\n\\n struct TransactionChainElement {\\n bool isSequenced;\\n uint256 queueIndex; // QUEUED TX ONLY\\n uint256 timestamp; // SEQUENCER TX ONLY\\n uint256 blockNumber; // SEQUENCER TX ONLY\\n bytes txData; // SEQUENCER TX ONLY\\n }\\n\\n struct QueueElement {\\n bytes32 transactionHash;\\n uint40 timestamp;\\n uint40 blockNumber;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Encodes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Encoded transaction bytes.\\n */\\n function encodeTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return abi.encodePacked(\\n _transaction.timestamp,\\n _transaction.blockNumber,\\n _transaction.l1QueueOrigin,\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n );\\n }\\n\\n /**\\n * Hashes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Hashed transaction\\n */\\n function hashTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(encodeTransaction(_transaction));\\n }\\n\\n /**\\n * Converts an OVM account to an EVM account.\\n * @param _in OVM account to convert.\\n * @return Converted EVM account.\\n */\\n function toEVMAccount(\\n Account memory _in\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n return EVMAccount({\\n nonce: _in.nonce,\\n balance: _in.balance,\\n storageRoot: _in.storageRoot,\\n codeHash: _in.codeHash\\n });\\n }\\n\\n /**\\n * @notice RLP-encodes an account state struct.\\n * @param _account Account state struct.\\n * @return RLP-encoded account state.\\n */\\n function encodeEVMAccount(\\n EVMAccount memory _account\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes[] memory raw = new bytes[](4);\\n\\n // Unfortunately we can't create this array outright because\\n // Lib_RLPWriter.writeList will reject fixed-size arrays. Assigning\\n // index-by-index circumvents this issue.\\n raw[0] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.nonce)\\n )\\n );\\n raw[1] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.balance)\\n )\\n );\\n raw[2] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.storageRoot));\\n raw[3] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.codeHash));\\n\\n return Lib_RLPWriter.writeList(raw);\\n }\\n\\n /**\\n * @notice Decodes an RLP-encoded account state into a useful struct.\\n * @param _encoded RLP-encoded account state.\\n * @return Account state struct.\\n */\\n function decodeEVMAccount(\\n bytes memory _encoded\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\\n\\n return EVMAccount({\\n nonce: Lib_RLPReader.readUint256(accountState[0]),\\n balance: Lib_RLPReader.readUint256(accountState[1]),\\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\\n });\\n }\\n\\n /**\\n * Calculates a hash for a given batch header.\\n * @param _batchHeader Header to hash.\\n * @return Hash of the header.\\n */\\n function hashBatchHeader(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(\\n abi.encode(\\n _batchHeader.batchRoot,\\n _batchHeader.batchSize,\\n _batchHeader.prevTotalElements,\\n _batchHeader.extraData\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0xd85ba2066057a2677926f484b938c7c2ef33ff3853f3b71cda252f4a54f30e05\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n public\\n onlyOwner\\n {\\n addresses[_getNameHash(_name)] = _address;\\n\\n emit AddressSet(\\n _name,\\n _address\\n );\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0x2ce671a0e004df88b136bea5a3c59d0732cea8887c8496da1d509e0200b03d7d\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(\\n address _libAddressManager\\n ) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x65981feeabff6a81783ea97d44baf988a18a86c8cb374c46fdb71819cbacc7c0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPReader.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_RLPReader\\n * @dev Adapted from \\\"RLPReader\\\" by Hamdi Allam (hamdi.allam97@gmail.com).\\n */\\nlibrary Lib_RLPReader {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 constant internal MAX_LIST_LENGTH = 32;\\n\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum RLPItemType {\\n DATA_ITEM,\\n LIST_ITEM\\n }\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct RLPItem {\\n uint256 length;\\n uint256 ptr;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts bytes to a reference to memory position and length.\\n * @param _in Input bytes to convert.\\n * @return Output memory reference.\\n */\\n function toRLPItem(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem memory\\n )\\n {\\n uint256 ptr;\\n assembly {\\n ptr := add(_in, 32)\\n }\\n\\n return RLPItem({\\n length: _in.length,\\n ptr: ptr\\n });\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n (\\n uint256 listOffset,\\n ,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.LIST_ITEM,\\n \\\"Invalid RLP list value.\\\"\\n );\\n\\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\\n // writing to the length. Since we can't know the number of RLP items without looping over\\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\\n // simply set a reasonable maximum list length and decrease the size before we finish.\\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\\n\\n uint256 itemCount = 0;\\n uint256 offset = listOffset;\\n while (offset < _in.length) {\\n require(\\n itemCount < MAX_LIST_LENGTH,\\n \\\"Provided RLP list exceeds max list length.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n ) = _decodeLength(RLPItem({\\n length: _in.length - offset,\\n ptr: _in.ptr + offset\\n }));\\n\\n out[itemCount] = RLPItem({\\n length: itemLength + itemOffset,\\n ptr: _in.ptr + offset\\n });\\n\\n itemCount += 1;\\n offset += itemOffset + itemLength;\\n }\\n\\n // Decrease the array size to match the actual item count.\\n assembly {\\n mstore(out, itemCount)\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n return readList(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes value.\\\"\\n );\\n\\n return _copy(_in.ptr, itemOffset, itemLength);\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return readBytes(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return string(readBytes(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return readString(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n require(\\n _in.length <= 33,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr + itemOffset;\\n bytes32 out;\\n assembly {\\n out := mload(ptr)\\n\\n // Shift the bytes over to match the item size.\\n if lt(itemLength, 32) {\\n out := div(out, exp(256, sub(32, itemLength)))\\n }\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return readBytes32(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return uint256(readBytes32(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return readUint256(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n require(\\n _in.length == 1,\\n \\\"Invalid RLP boolean value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 out;\\n assembly {\\n out := byte(0, mload(ptr))\\n }\\n\\n require(\\n out == 0 || out == 1,\\n \\\"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\\\"\\n );\\n\\n return out != 0;\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return readBool(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n if (_in.length == 1) {\\n return address(0);\\n }\\n\\n require(\\n _in.length == 21,\\n \\\"Invalid RLP address value.\\\"\\n );\\n\\n return address(readUint256(_in));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return readAddress(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads the raw bytes of an RLP item.\\n * @param _in RLP item to read.\\n * @return Raw RLP bytes.\\n */\\n function readRawBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in);\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Decodes the length of an RLP item.\\n * @param _in RLP item to decode.\\n * @return Offset of the encoded data.\\n * @return Length of the encoded data.\\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\\n */\\n function _decodeLength(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n uint256,\\n uint256,\\n RLPItemType\\n )\\n {\\n require(\\n _in.length > 0,\\n \\\"RLP item cannot be null.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 prefix;\\n assembly {\\n prefix := byte(0, mload(ptr))\\n }\\n\\n if (prefix <= 0x7f) {\\n // Single byte.\\n\\n return (0, 1, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xb7) {\\n // Short string.\\n\\n uint256 strLen = prefix - 0x80;\\n\\n require(\\n _in.length > strLen,\\n \\\"Invalid RLP short string.\\\"\\n );\\n\\n return (1, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xbf) {\\n // Long string.\\n uint256 lenOfStrLen = prefix - 0xb7;\\n\\n require(\\n _in.length > lenOfStrLen,\\n \\\"Invalid RLP long string length.\\\"\\n );\\n\\n uint256 strLen;\\n assembly {\\n // Pick out the string length.\\n strLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfStrLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfStrLen + strLen,\\n \\\"Invalid RLP long string.\\\"\\n );\\n\\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xf7) {\\n // Short list.\\n uint256 listLen = prefix - 0xc0;\\n\\n require(\\n _in.length > listLen,\\n \\\"Invalid RLP short list.\\\"\\n );\\n\\n return (1, listLen, RLPItemType.LIST_ITEM);\\n } else {\\n // Long list.\\n uint256 lenOfListLen = prefix - 0xf7;\\n\\n require(\\n _in.length > lenOfListLen,\\n \\\"Invalid RLP long list length.\\\"\\n );\\n\\n uint256 listLen;\\n assembly {\\n // Pick out the list length.\\n listLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfListLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfListLen + listLen,\\n \\\"Invalid RLP long list.\\\"\\n );\\n\\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\\n }\\n }\\n\\n /**\\n * Copies the bytes from a memory location.\\n * @param _src Pointer to the location to read from.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Copied bytes.\\n */\\n function _copy(\\n uint256 _src,\\n uint256 _offset,\\n uint256 _length\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out = new bytes(_length);\\n if (out.length == 0) {\\n return out;\\n }\\n\\n uint256 src = _src + _offset;\\n uint256 dest;\\n assembly {\\n dest := add(out, 32)\\n }\\n\\n // Copy over as many complete words as we can.\\n for (uint256 i = 0; i < _length / 32; i++) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n\\n src += 32;\\n dest += 32;\\n }\\n\\n // Pick out the remaining bytes.\\n uint256 mask = 256 ** (32 - (_length % 32)) - 1;\\n assembly {\\n mstore(\\n dest,\\n or(\\n and(mload(src), not(mask)),\\n and(mload(dest), mask)\\n )\\n )\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Copies an RLP item into bytes.\\n * @param _in RLP item to copy.\\n * @return Copied bytes.\\n */\\n function _copy(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in.ptr, 0, _in.length);\\n }\\n}\\n\",\"keccak256\":\"0x829174c61216dce35fdb888383b6022e0365eb7fbdc71ad79d98b108091969fe\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPWriter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/**\\n * @title Lib_RLPWriter\\n * @author Bakaoh (with modifications)\\n */\\nlibrary Lib_RLPWriter {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * RLP encodes a byte string.\\n * @param _in The byte string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded;\\n\\n if (_in.length == 1 && uint8(_in[0]) < 128) {\\n encoded = _in;\\n } else {\\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * RLP encodes a list of RLP encoded byte byte strings.\\n * @param _in The list of RLP encoded byte strings.\\n * @return The RLP encoded list of items in bytes.\\n */\\n function writeList(\\n bytes[] memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory list = _flatten(_in);\\n return abi.encodePacked(_writeLength(list.length, 192), list);\\n }\\n\\n /**\\n * RLP encodes a string.\\n * @param _in The string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeString(\\n string memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(bytes(_in));\\n }\\n\\n /**\\n * RLP encodes an address.\\n * @param _in The address to encode.\\n * @return The RLP encoded address in bytes.\\n */\\n function writeAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a bytes32 value.\\n * @param _in The bytes32 to encode.\\n * @return _out The RLP encoded bytes32 in bytes.\\n */\\n function writeBytes32(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a uint.\\n * @param _in The uint256 to encode.\\n * @return The RLP encoded uint256 in bytes.\\n */\\n function writeUint(\\n uint256 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(_toBinary(_in));\\n }\\n\\n /**\\n * RLP encodes a bool.\\n * @param _in The bool to encode.\\n * @return The RLP encoded bool in bytes.\\n */\\n function writeBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded = new bytes(1);\\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\\n return encoded;\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\\n * @param _len The length of the string or the payload.\\n * @param _offset 128 if item is string, 192 if item is list.\\n * @return RLP encoded bytes.\\n */\\n function _writeLength(\\n uint256 _len,\\n uint256 _offset\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded;\\n\\n if (_len < 56) {\\n encoded = new bytes(1);\\n encoded[0] = byte(uint8(_len) + uint8(_offset));\\n } else {\\n uint256 lenLen;\\n uint256 i = 1;\\n while (_len / i != 0) {\\n lenLen++;\\n i *= 256;\\n }\\n\\n encoded = new bytes(lenLen + 1);\\n encoded[0] = byte(uint8(lenLen) + uint8(_offset) + 55);\\n for(i = 1; i <= lenLen; i++) {\\n encoded[i] = byte(uint8((_len / (256**(lenLen-i))) % 256));\\n }\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * Encode integer in big endian binary form with no leading zeroes.\\n * @notice TODO: This should be optimized with assembly to save gas costs.\\n * @param _x The integer to encode.\\n * @return RLP encoded bytes.\\n */\\n function _toBinary(\\n uint256 _x\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory b = abi.encodePacked(_x);\\n\\n uint256 i = 0;\\n for (; i < 32; i++) {\\n if (b[i] != 0) {\\n break;\\n }\\n }\\n\\n bytes memory res = new bytes(32 - i);\\n for (uint256 j = 0; j < res.length; j++) {\\n res[j] = b[i++];\\n }\\n\\n return res;\\n }\\n\\n /**\\n * Copies a piece of memory to another location.\\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\\n * @param _dest Destination location.\\n * @param _src Source location.\\n * @param _len Length of memory to copy.\\n */\\n function _memcpy(\\n uint256 _dest,\\n uint256 _src,\\n uint256 _len\\n )\\n private\\n pure\\n {\\n uint256 dest = _dest;\\n uint256 src = _src;\\n uint256 len = _len;\\n\\n for(; len >= 32; len -= 32) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n dest += 32;\\n src += 32;\\n }\\n\\n uint256 mask = 256 ** (32 - len) - 1;\\n assembly {\\n let srcpart := and(mload(src), not(mask))\\n let destpart := and(mload(dest), mask)\\n mstore(dest, or(destpart, srcpart))\\n }\\n }\\n\\n /**\\n * Flattens a list of byte strings into one byte string.\\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\\n * @param _list List of byte strings to flatten.\\n * @return The flattened byte string.\\n */\\n function _flatten(\\n bytes[] memory _list\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n if (_list.length == 0) {\\n return new bytes(0);\\n }\\n\\n uint256 len;\\n uint256 i = 0;\\n for (; i < _list.length; i++) {\\n len += _list[i].length;\\n }\\n\\n bytes memory flattened = new bytes(len);\\n uint256 flattenedPtr;\\n assembly { flattenedPtr := add(flattened, 0x20) }\\n\\n for(i = 0; i < _list.length; i++) {\\n bytes memory item = _list[i];\\n\\n uint256 listPtr;\\n assembly { listPtr := add(item, 0x20)}\\n\\n _memcpy(flattenedPtr, listPtr, item.length);\\n flattenedPtr += _list[i].length;\\n }\\n\\n return flattened;\\n }\\n}\\n\",\"keccak256\":\"0xb60ee4b03ad372c3deff21d454ab714dd0c18ee3e6f9d45532e209fc59d5a54d\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_Bytes32Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_Byte32Utils\\n */\\nlibrary Lib_Bytes32Utils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \\\"true.\\\"\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as a boolean.\\n */\\n function toBool(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return _in != 0;\\n }\\n\\n /**\\n * Converts a boolean to a bytes32 value.\\n * @param _in Input boolean value.\\n * @return Boolean as a bytes32.\\n */\\n function fromBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in ? 1 : 0));\\n }\\n\\n /**\\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as an address.\\n */\\n function toAddress(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return address(uint160(uint256(_in)));\\n }\\n\\n /**\\n * Converts an address to a bytes32.\\n * @param _in Input address value.\\n * @return Address as a bytes32.\\n */\\n function fromAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in));\\n }\\n\\n /**\\n * Removes the leading zeros from a bytes32 value and returns a new (smaller) bytes value.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 without any leading zeros.\\n */\\n function removeLeadingZeros(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out;\\n\\n assembly {\\n // Figure out how many leading zero bytes to remove.\\n let shift := 0\\n for { let i := 0 } and(lt(i, 32), eq(byte(i, _in), 0)) { i := add(i, 1) } {\\n shift := add(shift, 1)\\n }\\n\\n // Reserve some space for our output and fix the free memory pointer.\\n out := mload(0x40)\\n mstore(0x40, add(out, 0x40))\\n\\n // Shift the value and store it into the output bytes.\\n mstore(add(out, 0x20), shl(mul(shift, 8), _in))\\n\\n // Store the new size (with leading zero bytes removed) in the output byte size.\\n mstore(out, sub(32, shift))\\n }\\n\\n return out;\\n }\\n}\\n\",\"keccak256\":\"0xfa2def593e3fc56a31852c3744aefdaa93cec74e721bfcfeb1e5d166c7c60b64\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_BytesUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_BytesUtils\\n */\\nlibrary Lib_BytesUtils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_start + _length >= _start, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n if (_bytes.length - _start == 0) {\\n return bytes('');\\n }\\n\\n return slice(_bytes, _start, _bytes.length - _start);\\n }\\n\\n function toBytes32PadLeft(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n bytes32 ret;\\n uint256 len = _bytes.length <= 32 ? _bytes.length : 32;\\n assembly {\\n ret := shr(mul(sub(32, len), 8), mload(add(_bytes, 32)))\\n }\\n return ret;\\n }\\n\\n function toBytes32(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n if (_bytes.length < 32) {\\n bytes32 ret;\\n assembly {\\n ret := mload(add(_bytes, 32))\\n }\\n return ret;\\n }\\n\\n return abi.decode(_bytes,(bytes32)); // will truncate if input length > 32 bytes\\n }\\n\\n function toUint256(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return uint256(toBytes32(_bytes));\\n }\\n\\n function toUint24(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n uint24\\n )\\n {\\n require(_start + 3 >= _start, \\\"toUint24_overflow\\\");\\n require(_bytes.length >= _start + 3 , \\\"toUint24_outOfBounds\\\");\\n uint24 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x3), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toUint8(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n uint8\\n )\\n {\\n require(_start + 1 >= _start, \\\"toUint8_overflow\\\");\\n require(_bytes.length >= _start + 1 , \\\"toUint8_outOfBounds\\\");\\n uint8 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x1), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toAddress(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n require(_start + 20 >= _start, \\\"toAddress_overflow\\\");\\n require(_bytes.length >= _start + 20, \\\"toAddress_outOfBounds\\\");\\n address tempAddress;\\n\\n assembly {\\n tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000)\\n }\\n\\n return tempAddress;\\n }\\n\\n function toNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory nibbles = new bytes(_bytes.length * 2);\\n\\n for (uint256 i = 0; i < _bytes.length; i++) {\\n nibbles[i * 2] = _bytes[i] >> 4;\\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\\n }\\n\\n return nibbles;\\n }\\n\\n function fromNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory ret = new bytes(_bytes.length / 2);\\n\\n for (uint256 i = 0; i < ret.length; i++) {\\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\\n }\\n\\n return ret;\\n }\\n\\n function equal(\\n bytes memory _bytes,\\n bytes memory _other\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return keccak256(_bytes) == keccak256(_other);\\n }\\n}\\n\",\"keccak256\":\"0xa5195afe32fb2cf104d156e8f4bd39df1ec79bf6ba232097b9e8e0ee14fbc298\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_ErrorUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/**\\n * @title Lib_ErrorUtils\\n */\\nlibrary Lib_ErrorUtils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Encodes an error string into raw solidity-style revert data.\\n * (i.e. ascii bytes, prefixed with bytes4(keccak(\\\"Error(string))\\\"))\\n * Ref: https://docs.soliditylang.org/en/v0.8.2/control-structures.html?highlight=Error(string)#panic-via-assert-and-error-via-require\\n * @param _reason Reason for the reversion.\\n * @return Standard solidity revert data for the given reason.\\n */\\n function encodeRevertString(\\n string memory _reason\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return abi.encodeWithSignature(\\n \\\"Error(string)\\\",\\n _reason\\n );\\n }\\n}\\n\",\"keccak256\":\"0xfc64ec4a81fb50865b502a0004ed154e8598e1a313db77303fc95e41f536e6b7\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_EthUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// @unsupported: ovm\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"./Lib_Bytes32Utils.sol\\\";\\n\\n/**\\n * @title Lib_EthUtils\\n */\\nlibrary Lib_EthUtils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Gets the code for a given address.\\n * @param _address Address to get code for.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Code read from the contract.\\n */\\n function getCode(\\n address _address,\\n uint256 _offset,\\n uint256 _length\\n )\\n internal\\n view\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory code;\\n assembly {\\n code := mload(0x40)\\n mstore(0x40, add(code, add(_length, 0x20)))\\n mstore(code, _length)\\n extcodecopy(_address, add(code, 0x20), _offset, _length)\\n }\\n\\n return code;\\n }\\n\\n /**\\n * Gets the full code for a given address.\\n * @param _address Address to get code for.\\n * @return Full code of the contract.\\n */\\n function getCode(\\n address _address\\n )\\n internal\\n view\\n returns (\\n bytes memory\\n )\\n {\\n return getCode(\\n _address,\\n 0,\\n getCodeSize(_address)\\n );\\n }\\n\\n /**\\n * Gets the size of a contract's code in bytes.\\n * @param _address Address to get code size for.\\n * @return Size of the contract's code in bytes.\\n */\\n function getCodeSize(\\n address _address\\n )\\n internal\\n view\\n returns (\\n uint256\\n )\\n {\\n uint256 codeSize;\\n assembly {\\n codeSize := extcodesize(_address)\\n }\\n\\n return codeSize;\\n }\\n\\n /**\\n * Gets the hash of a contract's code.\\n * @param _address Address to get a code hash for.\\n * @return Hash of the contract's code.\\n */\\n function getCodeHash(\\n address _address\\n )\\n internal\\n view\\n returns (\\n bytes32\\n )\\n {\\n bytes32 codeHash;\\n assembly {\\n codeHash := extcodehash(_address)\\n }\\n\\n return codeHash;\\n }\\n\\n /**\\n * Creates a contract with some given initialization code.\\n * @param _code Contract initialization code.\\n * @return Address of the created contract.\\n */\\n function createContract(\\n bytes memory _code\\n )\\n internal\\n returns (\\n address\\n )\\n {\\n address created;\\n assembly {\\n created := create(\\n 0,\\n add(_code, 0x20),\\n mload(_code)\\n )\\n }\\n\\n return created;\\n }\\n\\n /**\\n * Computes the address that would be generated by CREATE.\\n * @param _creator Address creating the contract.\\n * @param _nonce Creator's nonce.\\n * @return Address to be generated by CREATE.\\n */\\n function getAddressForCREATE(\\n address _creator,\\n uint256 _nonce\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n bytes[] memory encoded = new bytes[](2);\\n encoded[0] = Lib_RLPWriter.writeAddress(_creator);\\n encoded[1] = Lib_RLPWriter.writeUint(_nonce);\\n\\n bytes memory encodedList = Lib_RLPWriter.writeList(encoded);\\n return Lib_Bytes32Utils.toAddress(keccak256(encodedList));\\n }\\n\\n /**\\n * Computes the address that would be generated by CREATE2.\\n * @param _creator Address creating the contract.\\n * @param _bytecode Bytecode of the contract to be created.\\n * @param _salt 32 byte salt value mixed into the hash.\\n * @return Address to be generated by CREATE2.\\n */\\n function getAddressForCREATE2(\\n address _creator,\\n bytes memory _bytecode,\\n bytes32 _salt\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n bytes32 hashedData = keccak256(abi.encodePacked(\\n byte(0xff),\\n _creator,\\n _salt,\\n keccak256(_bytecode)\\n ));\\n\\n return Lib_Bytes32Utils.toAddress(hashedData);\\n }\\n}\\n\",\"keccak256\":\"0xf29a67d78e61cb472d524b779b32cfcb39a587f4096500d5419e6425ed367d49\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x60806040523480156200001157600080fd5b506040516200313838038062003138833981016040819052620000349162000292565b600080546001600160a01b0319166001600160a01b03851617905560408051808201909152601181527027ab26afa9b0b332ba3ca1b432b1b5b2b960791b60208201526200008290620000d7565b600180546001600160a01b0319166001600160a01b039290921691909117905581516003556020820151600455604082015160055560608201516006558051600755620000ce620001b9565b50505062000337565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b83811015620001395781810151838201526020016200011f565b50505050905090810190601f168015620001675780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b1580156200018557600080fd5b505afa1580156200019a573d6000803e3d6000fd5b505050506040513d6020811015620001b157600080fd5b505192915050565b600d80546001600160a01b031990811673defa017defa017defa017defa017defa017defa09081179092557fdefa017defa017defa017defa017defa017defa017defa017defa017defa017d6009819055600a819055600b819055600c8190556008805460ff191690556010819055600e8054831684179055600f8054831690931760ff60a01b1916909255601191909155600280549091169055565b60006020828403121562000268578081fd5b604051602081016001600160401b03811182821017156200028557fe5b6040529151825250919050565b600080600083850360c0811215620002a8578384fd5b84516001600160a01b0381168114620002bf578485fd5b93506080601f1982011215620002d3578283fd5b50604051608081016001600160401b0381118282101715620002f157fe5b806040525060208501518152604085015160208201526060850151604082015260808501516060820152809250506200032e8560a0860162000256565b90509250925092565b612df180620003476000396000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c80637cebbe94116100f957806399ccd98b11610097578063bdbf8c3611610071578063bdbf8c361461037e578063c1fb2ea214610386578063fcb6829b1461038e578063ffe73914146103a1576101c4565b806399ccd98b146103505780639be3ad67146103635780639dc9dc9314610376576101c4565b806385979f76116100d357806385979f761461031a5780638bb42e151461032d5780639058025614610340578063996d79a514610348576101c4565b80637cebbe94146102de5780638435035b146102e65780638540661f146102f9576101c4565b8063299ca478116101665780635a98c361116101405780635a98c3611461029b57806373509064146102a3578063741a33eb146102ab578063746c32f1146102be576101c4565b8063299ca478146102605780632a2a7adb14610275578063461a447814610288576101c4565b80631c4712a7116101a25780631c4712a71461022857806320160f3a1461023057806322bd64c01461023857806324749d5c1461024d576101c4565b806303daa959146101c9578063101185a4146101f257806314aa2ff714610207575b600080fd5b6101dc6101d73660046125d4565b6103b4565b6040516101e99190612a20565b60405180910390f35b6101fa6103f9565b6040516101e99190612b0b565b61021a610215366004612666565b610402565b6040516101e9929190612a9b565b6101dc61049a565b6101dc6104a0565b61024b610246366004612604565b6104a6565b005b6101dc61025b366004612548565b610509565b610268610524565b6040516101e99190612a29565b61024b610283366004612666565b610533565b610268610296366004612777565b610541565b6101dc61061d565b610268610623565b61024b6102b9366004612625565b610632565b6102d16102cc366004612580565b61079f565b6040516101e99190612af8565b61024b6107bc565b6101dc6102f4366004612548565b610813565b61030c61030736600461286c565b610826565b6040516101e9929190612abf565b61030c61032836600461286c565b61089f565b61030c61033b36600461280b565b6108ee565b6101dc6109c1565b6102686109c7565b61021a61035e366004612698565b6109d6565b6102d16103713660046127bc565b610a69565b610268610bcb565b6101dc610bda565b6101dc610be0565b61024b61039c3660046128c2565b610bf7565b61030c6103af36600461286c565b610de1565b6000619c4060005a905060006103c86109c7565b90506103d48186610e32565b93505060005a82039050808310156103f157601080548483030190555b505050919050565b60085460ff1690565b600f5460009060609060ff600160a01b9091041615156001141561042a5761042a6006610ec0565b619c4060005a9050600061043c6109c7565b905061044781610ed9565b600061045b8261045684610f5e565b610fe9565b90506104678188611083565b95509550505060005a8203905080831015610489576010805484019055610492565b60108054820190555b505050915091565b60045490565b600b5490565b600f5460ff600160a01b909104161515600114156104c8576104c86006610ec0565b61ea6060005a905060006104da6109c7565b90506104e7818686611109565b5060005a820390508083101561050257601080548483030190555b5050505050565b600061051c6105178361118b565b611216565b90505b919050565b6000546001600160a01b031681565b61053e60018261121a565b50565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b838110156105a1578181015183820152602001610589565b50505050905090810190601f1680156105ce5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b1580156105eb57600080fd5b505afa1580156105ff573d6000803e3d6000fd5b505050506040513d602081101561061557600080fd5b505192915050565b600a5490565b600e546001600160a01b031690565b600f5460ff600160a01b90910416151560011415610654576106546006610ec0565b600060018585601b0185856040516000815260200160405260405161067c9493929190612ada565b6020604051602081039080840390855afa15801561069e573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166106da576106da604051806060016040528060388152602001612caa60389139610533565b6106e381611230565b6106ed5750610799565b6106f6816112bb565b600f80546001600160a01b038381166001600160a01b031983161790925516600061075361072f6009602160991b01836102cc82610813565b60405160200161073f91906129ea565b604051602081830303815290604052611322565b600f80546001600160a01b0319166001600160a01b038516179055905061078a838261077e81611335565b8051906020012061134b565b610795836000611388565b5050505b50505050565b60606107b46107ad8561118b565b84846113f9565b949350505050565b600f5460ff600160a01b909104161515600114156107de576107de6006610ec0565b60006107e86109c7565b905060006107f582610f5e565b90508081600101111561080f5761080f8282600101611388565b5050565b600061051c6108218361118b565b61141d565b600060606201388060005a60408051606081018252600f546001600160a01b0390811682528916602082015260019181019190915290915061086a81898989611421565b945094505060005a820390508083101561088b576010805484019055610894565b60108054820190555b505050935093915050565b60006060620186a060005a60408051606081018252600f5460ff600160a01b8204161515928201929092526001600160a01b039182168152908816602082015290915061086a81898989611421565b6000606033156108fd57600080fd5b600280546001600160a01b0319166001600160a01b038516179055610921856114b2565b600019601155600f80546001600160a01b0319166001600160a01b038681169190911790915560808601511615801561099c576000806109648860c00151610402565b90925090506001600160a01b038216610985576000945092506109b9915050565b600161099083611335565b945094505050506109b9565b6109b38660a0015187608001518860c0015161089f565b92509250505b935093915050565b60075490565b600f546001600160a01b031690565b600f5460009060609060ff600160a01b909104161515600114156109fe576109fe6006610ec0565b619c4060005a90506000610a106109c7565b9050610a1b81610ed9565b6000610a28828989611524565b9050610a348189611083565b95509550505060005a8203905080831015610a56576010805484019055610a5f565b60108054820190555b5050509250929050565b600a546060907fdefa017defa017defa017defa017defa017defa017defa017defa017defa017d14610aaa5750604080516020810190915260008152610bc5565b600280546001600160a01b0319166001600160a01b038481169190911791829055604051630d15d41560e41b815291169063d15d415090610aef903390600401612a29565b60206040518083038186803b158015610b0757600080fd5b505afa158015610b1b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b3f91906125b4565b610b645760405162461bcd60e51b8152600401610b5b90612b87565b60405180910390fd5b610b6d836114b2565b610b768361156a565b610b9757610b826115c6565b50604080516020810190915260008152610bc5565b6000610bb76003600001548560a001510385608001518660c0015161089f565b915050610bc26115c6565b90505b92915050565b600d546001600160a01b031690565b60095490565b6000610bf2610bed6109c7565b610f5e565b905090565b333014610c0357610ddc565b610c0c81611230565b610c3b57610c3b6005610c36604051806060016040528060348152602001612d5860349139611663565b61121a565b6001546040516352275acd60e11b81526001600160a01b039091169063a44eb59a90610c6b908590600401612af8565b60206040518083038186803b158015610c8357600080fd5b505afa158015610c97573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cbb91906125b4565b610ce557610ce56004610c366040518060a0016040528060768152602001612ce260769139611663565b610cee816112bb565b6000610cf983611322565b90506001600160a01b038116610d13573d6000803e3d6000fd5b6000610d1e82611335565b6001546040516352275acd60e11b81529192506001600160a01b03169063a44eb59a90610d4f908490600401612af8565b60206040518083038186803b158015610d6757600080fd5b505afa158015610d7b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d9f91906125b4565b610dc957610dc96004610c36604051806060016040528060308152602001612d8c60309139611663565b6105028383610dd785611216565b61134b565b505050565b60006060619c4060005a60408051606081018252600e546001600160a01b039081168252600f549081166020830152600160a01b900460ff1615159181019190915290915061086a81898989611421565b6000610e3e83836116a6565b600254604051631aaf392f60e01b81526001600160a01b0390911690631aaf392f90610e709086908690600401612a61565b60206040518083038186803b158015610e8857600080fd5b505afa158015610e9c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bc291906125ec565b61053e816040518060200160405280600081525061121a565b600080610f285a6002602160991b0185604051602401610ef99190612a29565b60408051601f198184030181529190526020810180516001600160e01b031663b1540a0160e01b17905261089f565b91509150600081806020019051810190610f4291906125b4565b9050801580610f4f575082155b15610799576107996007610ec0565b6000610f69826117e1565b60025460405163d126199f60e01b81526001600160a01b039091169063d126199f90610f99908590600401612a29565b60206040518083038186803b158015610fb157600080fd5b505afa158015610fc5573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061051c91906125ec565b60408051600280825260608201909252600091829190816020015b606081526020019060019003908161100457905050905061102484611928565b8160008151811061103157fe5b602002602001018190525061104583611952565b8160018151811061105257fe5b6020026020010181905250600061106882611965565b905061107a81805190602001206119a9565b95945050505050565b600060606110a56110926109c7565b61109d610bed6109c7565b600101611388565b60408051606081018252600f5460ff600160a01b8204161515928201929092526001600160a01b03918216815290851660208201526000806110eb835a898960016119ac565b91509150816110fb5760006110fd565b865b97909650945050505050565b806111148484610e32565b141561111f57610ddc565b6111298383611c1a565b600254604051635c17d62960e01b81526001600160a01b0390911690635c17d6299061115d90869086908690600401612a7a565b600060405180830381600087803b15801561117757600080fd5b505af1158015610795573d6000803e3d6000fd5b6000611196826117e1565b600254604051637c8ee70360e01b81526001600160a01b0390911690637c8ee703906111c6908590600401612a29565b60206040518083038186803b1580156111de57600080fd5b505afa1580156111f2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061051c9190612564565b3f90565b60006112268383611d2c565b9050805160208201fd5b600061123b826117e1565b6002546040516307a1294560e01b81526001600160a01b03909116906307a129459061126b908590600401612a29565b60206040518083038186803b15801561128357600080fd5b505afa158015611297573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061051c91906125b4565b6112c4816117e1565b600254604051637e78a4d160e11b81526001600160a01b039091169063fcf149a2906112f4908490600401612a29565b600060405180830381600087803b15801561130e57600080fd5b505af1158015610502573d6000803e3d6000fd5b6000808251602084016000f09392505050565b606061051c8260006113468561141d565b6113f9565b61135483611dd5565b6002546040516368510af960e11b81526001600160a01b039091169063d0a215f29061115d90869086908690600401612a3d565b61139182611dd5565b6002546040516374855dc360e11b81526001600160a01b039091169063e90abb86906113c39085908590600401612a61565b600060405180830381600087803b1580156113dd57600080fd5b505af11580156113f1573d6000803e3d6000fd5b505050505050565b6060806040519050602083018101604052828152828460208301873c949350505050565b3b90565b6000606073ffffffffffffffffffffffffffffffffffff0000841673deaddeaddeaddeaddeaddeaddeaddeaddead000014156114705750506040805160208101909152600081526001906114a9565b60006064856001600160a01b0316106114915761148c8561118b565b611493565b845b90506114a38787838760006119ac565b92509250505b94509492505050565b80516009556020810151600a5560a0810151600c5560408101516008805460ff1916600183818111156114e157fe5b02179055506060810151600d80546001600160a01b0319166001600160a01b03909216919091179055600554600b5560a081015161151e90611ee4565b60115550565b60008060ff60f81b858486805190602001206040516020016115499493929190612966565b60405160208183030381529060405280519060200120905061107a816119a9565b60007fdefa017defa017defa017defa017defa017defa017defa017defa017defa017d826020015114156115a05750600061051f565b6115b28260a001518360400151611ef7565b6115be5750600061051f565b506001919050565b600d80546001600160a01b031990811673defa017defa017defa017defa017defa017defa09081179092557fdefa017defa017defa017defa017defa017defa017defa017defa017defa017d6009819055600a819055600b819055600c8190556008805460ff191690556010819055600e8054831684179055600f8054831690931760ff60a01b1916909255601191909155600280549091169055565b6060816040516024016116769190612af8565b60408051601f198184030181529190526020810180516001600160e01b031662461bcd60e51b1790529050919050565b6175305a10156116ba576116ba6000610ec0565b600254604051630ad2267960e01b81526001600160a01b0390911690630ad22679906116ec9085908590600401612a61565b60206040518083038186803b15801561170457600080fd5b505afa158015611718573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061173c91906125b4565b61174a5761174a6003610ec0565b600254604051632bcdee1960e21b81526000916001600160a01b03169063af37b8649061177d9086908690600401612a61565b602060405180830381600087803b15801561179757600080fd5b505af11580156117ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117cf91906125b4565b905080610ddc57610ddc614e20611f27565b6175305a10156117f5576117f56000610ec0565b60025460405163c8e40fbf60e01b81526001600160a01b039091169063c8e40fbf90611825908490600401612a29565b60206040518083038186803b15801561183d57600080fd5b505afa158015611851573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061187591906125b4565b611883576118836003610ec0565b600254604051633ecdecc760e21b81526000916001600160a01b03169063fb37b31c906118b4908590600401612a29565b602060405180830381600087803b1580156118ce57600080fd5b505af11580156118e2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061190691906125b4565b90508061080f5761080f61753060646119216108218661118b565b0201611f27565b606061051c8260405160200161193e9190612949565b604051602081830303815290604052611f47565b606061051c61196083611f99565b611f47565b606060006119728361209d565b9050611980815160c061219d565b816040516020016119929291906129bb565b604051602081830303815290604052915050919050565b90565b6040805160608082018352600e546001600160a01b039081168352600f549081166020840152600160a01b900460ff16151592820192909252600091906119f381896122ed565b6011546000611a0189611ee4565b60118190559050600060608715611abd57604051309063fcb6829b60e01b90611a32908e908d908f90602401612bf3565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909416939093179092529051611a70919061299f565b6000604051808303816000865af19150503d8060008114611aad576040519150601f19603f3d011682016040523d82523d6000602084013e611ab2565b606091505b509092509050611b20565b896001600160a01b03168b8a604051611ad6919061299f565b60006040518083038160008787f1925050503d8060008114611b14576040519150601f19603f3d011682016040523d82523d6000602084013e611b19565b606091505b5090925090505b611b2a8c866122ed565b60115482611c0257600080600080611b41866123a1565b929650909450925090506003846007811115611b5957fe5b1415611b6857611b6884610ec0565b6001846007811115611b7657fe5b1480611b8d57506004846007811115611b8b57fe5b145b80611ba357506006846007811115611ba157fe5b145b80611bb957506007846007811115611bb757fe5b145b15611bc45760108290555b6001846007811115611bd257fe5b1480611bdb57508c5b15611be857809550611bfb565b6040518060200160405280600081525095505b5090925050505b90920390920360115590999098509650505050505050565b611c2482826116a6565b60025460405163af3dc01160e01b81526000916001600160a01b03169063af3dc01190611c579086908690600401612a61565b602060405180830381600087803b158015611c7157600080fd5b505af1158015611c85573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ca991906125b4565b905080610ddc57611cb983611dd5565b600260009054906101000a90046001600160a01b03166001600160a01b031663c3fd9b256040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611d0957600080fd5b505af1158015611d1d573d6000803e3d6000fd5b50505050610ddc614e20611f27565b60606000836007811115611d3c57fe5b1415611d575750604080516020810190915260008152610bc5565b6003836007811115611d6557fe5b1415611da357604080516020808201835260008083529251611d8d9387939092839201612b1f565b6040516020818303038152906040529050610bc5565b601154601054604051611dbe92869290918690602001612b5b565b604051602081830303815290604052905092915050565b611dde816117e1565b60025460405163011b1f7960e41b81526000916001600160a01b0316906311b1f79090611e0f908590600401612a29565b602060405180830381600087803b158015611e2957600080fd5b505af1158015611e3d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e6191906125b4565b90508061080f57600260009054906101000a90046001600160a01b03166001600160a01b03166333f943056040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611eb857600080fd5b505af1158015611ecc573d6000803e3d6000fd5b5050505061080f61753060646119216108218661118b565b60005a8210611ef3575a61051c565b5090565b600454600090831115611f0c57506000610bc5565b600354831015611f1e57506000610bc5565b50600192915050565b601154811115611f3b57611f3b6002610ec0565b60118054919091039055565b60608082516001148015611f6f5750608083600081518110611f6557fe5b016020015160f81c105b15611f7b57508161051c565b611f878351608061219d565b83604051602001611dbe9291906129bb565b6060600082604051602001611fae9190612a20565b604051602081830303815290604052905060005b6020811015611ff857818181518110611fd757fe5b01602001516001600160f81b03191615611ff057611ff8565b600101611fc2565b6000816020036001600160401b038111801561201357600080fd5b506040519080825280601f01601f19166020018201604052801561203e576020820181803683370190505b50905060005b815181101561209457835160018401938591811061205e57fe5b602001015160f81c60f81b82828151811061207557fe5b60200101906001600160f81b031916908160001a905350600101612044565b50949350505050565b60608151600014156120be575060408051600081526020810190915261051f565b6000805b83518110156120f1578381815181106120d757fe5b6020026020010151518201915080806001019150506120c2565b6000826001600160401b038111801561210957600080fd5b506040519080825280601f01601f191660200182016040528015612134576020820181803683370190505b50600092509050602081015b855183101561209457600086848151811061215757fe5b602002602001015190506000602082019050612175838284516123f4565b87858151811061218157fe5b6020026020010151518301925050508280600101935050612140565b60608060388410156121f7576040805160018082528183019092529060208201818036833701905050905082840160f81b816000815181106121db57fe5b60200101906001600160f81b031916908160001a905350610bc2565b600060015b80868161220557fe5b041561221a57600190910190610100026121fc565b816001016001600160401b038111801561223357600080fd5b506040519080825280601f01601f19166020018201604052801561225e576020820181803683370190505b50925084820160370160f81b8360008151811061227757fe5b60200101906001600160f81b031916908160001a905350600190505b8181116122e3576101008183036101000a87816122ac57fe5b04816122b457fe5b0660f81b8382815181106122c457fe5b60200101906001600160f81b031916908160001a905350600101612293565b5050905092915050565b805182516001600160a01b03908116911614612325578051600e80546001600160a01b0319166001600160a01b039092169190911790555b80602001516001600160a01b031682602001516001600160a01b03161461236b576020810151600f80546001600160a01b0319166001600160a01b039092169190911790555b80604001511515826040015115151461080f5760400151600f8054911515600160a01b0260ff60a01b1990921691909117905550565b600080600060608451600014156123d057505060408051602081019091526000808252925082915081906123ed565b848060200190518101906123e491906126da565b93509350935093505b9193509193565b8282825b60208110612417578151835260209283019290910190601f19016123f8565b905182516020929092036101000a6000190180199091169116179052505050565b600061244b61244684612c47565b612c24565b905082815283838301111561245f57600080fd5b828260208301376000602084830101529392505050565b803561051f81612c94565b600082601f830112612491578081fd5b610bc283833560208501612438565b80356002811061051f57600080fd5b600060e082840312156124c0578081fd5b6124ca60e0612c24565b905081358152602082013560208201526124e6604083016124a0565b60408201526124f760608301612476565b606082015261250860808301612476565b608082015260a082013560a082015260c08201356001600160401b0381111561253057600080fd5b61253c84828501612481565b60c08301525092915050565b600060208284031215612559578081fd5b8135610bc281612c94565b600060208284031215612575578081fd5b8151610bc281612c94565b600080600060608486031215612594578182fd5b833561259f81612c94565b95602085013595506040909401359392505050565b6000602082840312156125c5578081fd5b81518015158114610bc2578182fd5b6000602082840312156125e5578081fd5b5035919050565b6000602082840312156125fd578081fd5b5051919050565b60008060408385031215612616578182fd5b50508035926020909101359150565b6000806000806080858703121561263a578081fd5b84359350602085013560ff81168114612651578182fd5b93969395505050506040820135916060013590565b600060208284031215612677578081fd5b81356001600160401b0381111561268c578182fd5b6107b484828501612481565b600080604083850312156126aa578182fd5b82356001600160401b038111156126bf578283fd5b6126cb85828601612481565b95602094909401359450505050565b600080600080608085870312156126ef578182fd5b8451600881106126fd578283fd5b80945050602085015192506040850151915060608501516001600160401b03811115612727578182fd5b8501601f81018713612737578182fd5b805161274561244682612c47565b818152886020838501011115612759578384fd5b61276a826020830160208601612c68565b9598949750929550505050565b600060208284031215612788578081fd5b81356001600160401b0381111561279d578182fd5b8201601f810184136127ad578182fd5b6107b484823560208401612438565b600080604083850312156127ce578182fd5b82356001600160401b038111156127e3578283fd5b6127ef858286016124af565b925050602083013561280081612c94565b809150509250929050565b60008060006060848603121561281f578081fd5b83356001600160401b03811115612834578182fd5b612840868287016124af565b935050602084013561285181612c94565b9150604084013561286181612c94565b809150509250925092565b600080600060608486031215612880578081fd5b83359250602084013561289281612c94565b915060408401356001600160401b038111156128ac578182fd5b6128b886828701612481565b9150509250925092565b6000806000606084860312156128d6578081fd5b8335925060208401356001600160401b038111156128f2578182fd5b6128fe86828701612481565b925050604084013561286181612c94565b60008151808452612927816020860160208601612c68565b601f01601f19169290920160200192915050565b6008811061294557fe5b9052565b60609190911b6bffffffffffffffffffffffff1916815260140190565b6001600160f81b031994909416845260609290921b6bffffffffffffffffffffffff191660018401526015830152603582015260550190565b600082516129b1818460208701612c68565b9190910192915050565b600083516129cd818460208801612c68565b8351908301906129e1818360208801612c68565b01949350505050565b6c600d380380600d6000396000f360981b81528151600090612a1381600d850160208701612c68565b91909101600d0192915050565b90815260200190565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039390931683526020830191909152604082015260600190565b6001600160a01b03831681526040602082018190526000906107b49083018461290f565b60008315158252604060208301526107b4604083018461290f565b93845260ff9290921660208401526040830152606082015260800190565b600060208252610bc2602083018461290f565b6020810160028310612b1957fe5b91905290565b6000612b2b828761293b565b60ff8516602083015260ff8416604083015260806060830152612b51608083018461290f565b9695505050505050565b6000612b67828761293b565b84602083015283604083015260806060830152612b51608083018461290f565b60208082526046908201527f4f6e6c792061757468656e746963617465642061646472657373657320696e2060408201527f6f766d53746174654d616e616765722063616e2063616c6c20746869732066756060820152653731ba34b7b760d11b608082015260a00190565b600084825260606020830152612c0c606083018561290f565b905060018060a01b0383166040830152949350505050565b6040518181016001600160401b0381118282101715612c3f57fe5b604052919050565b60006001600160401b03821115612c5a57fe5b50601f01601f191660200190565b60005b83811015612c83578181015183820152602001612c6b565b838111156107995750506000910152565b6001600160a01b038116811461053e57600080fdfe5369676e61747572652070726f766964656420666f7220454f4120636f6e7472616374206372656174696f6e20697320696e76616c69642e436f6e7472616374206372656174696f6e20636f646520636f6e7461696e7320756e73616665206f70636f6465732e2044696420796f75207573652074686520726967687420636f6d70696c6572206f72207061737320616e20756e7361666520636f6e7374727563746f7220617267756d656e743f4120636f6e74726163742068617320616c7265616479206265656e206465706c6f79656420746f20746869732061646472657373436f6e7374727563746f7220617474656d7074656420746f206465706c6f7920756e736166652062797465636f64652ea2646970667358221220ba09f3066e98cffa8b50d7fb9822c62cac7bc36099454fe6dbe318573486c14d64736f6c63430007060033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101c45760003560e01c80637cebbe94116100f957806399ccd98b11610097578063bdbf8c3611610071578063bdbf8c361461037e578063c1fb2ea214610386578063fcb6829b1461038e578063ffe73914146103a1576101c4565b806399ccd98b146103505780639be3ad67146103635780639dc9dc9314610376576101c4565b806385979f76116100d357806385979f761461031a5780638bb42e151461032d5780639058025614610340578063996d79a514610348576101c4565b80637cebbe94146102de5780638435035b146102e65780638540661f146102f9576101c4565b8063299ca478116101665780635a98c361116101405780635a98c3611461029b57806373509064146102a3578063741a33eb146102ab578063746c32f1146102be576101c4565b8063299ca478146102605780632a2a7adb14610275578063461a447814610288576101c4565b80631c4712a7116101a25780631c4712a71461022857806320160f3a1461023057806322bd64c01461023857806324749d5c1461024d576101c4565b806303daa959146101c9578063101185a4146101f257806314aa2ff714610207575b600080fd5b6101dc6101d73660046125d4565b6103b4565b6040516101e99190612a20565b60405180910390f35b6101fa6103f9565b6040516101e99190612b0b565b61021a610215366004612666565b610402565b6040516101e9929190612a9b565b6101dc61049a565b6101dc6104a0565b61024b610246366004612604565b6104a6565b005b6101dc61025b366004612548565b610509565b610268610524565b6040516101e99190612a29565b61024b610283366004612666565b610533565b610268610296366004612777565b610541565b6101dc61061d565b610268610623565b61024b6102b9366004612625565b610632565b6102d16102cc366004612580565b61079f565b6040516101e99190612af8565b61024b6107bc565b6101dc6102f4366004612548565b610813565b61030c61030736600461286c565b610826565b6040516101e9929190612abf565b61030c61032836600461286c565b61089f565b61030c61033b36600461280b565b6108ee565b6101dc6109c1565b6102686109c7565b61021a61035e366004612698565b6109d6565b6102d16103713660046127bc565b610a69565b610268610bcb565b6101dc610bda565b6101dc610be0565b61024b61039c3660046128c2565b610bf7565b61030c6103af36600461286c565b610de1565b6000619c4060005a905060006103c86109c7565b90506103d48186610e32565b93505060005a82039050808310156103f157601080548483030190555b505050919050565b60085460ff1690565b600f5460009060609060ff600160a01b9091041615156001141561042a5761042a6006610ec0565b619c4060005a9050600061043c6109c7565b905061044781610ed9565b600061045b8261045684610f5e565b610fe9565b90506104678188611083565b95509550505060005a8203905080831015610489576010805484019055610492565b60108054820190555b505050915091565b60045490565b600b5490565b600f5460ff600160a01b909104161515600114156104c8576104c86006610ec0565b61ea6060005a905060006104da6109c7565b90506104e7818686611109565b5060005a820390508083101561050257601080548483030190555b5050505050565b600061051c6105178361118b565b611216565b90505b919050565b6000546001600160a01b031681565b61053e60018261121a565b50565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b838110156105a1578181015183820152602001610589565b50505050905090810190601f1680156105ce5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b1580156105eb57600080fd5b505afa1580156105ff573d6000803e3d6000fd5b505050506040513d602081101561061557600080fd5b505192915050565b600a5490565b600e546001600160a01b031690565b600f5460ff600160a01b90910416151560011415610654576106546006610ec0565b600060018585601b0185856040516000815260200160405260405161067c9493929190612ada565b6020604051602081039080840390855afa15801561069e573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166106da576106da604051806060016040528060388152602001612caa60389139610533565b6106e381611230565b6106ed5750610799565b6106f6816112bb565b600f80546001600160a01b038381166001600160a01b031983161790925516600061075361072f6009602160991b01836102cc82610813565b60405160200161073f91906129ea565b604051602081830303815290604052611322565b600f80546001600160a01b0319166001600160a01b038516179055905061078a838261077e81611335565b8051906020012061134b565b610795836000611388565b5050505b50505050565b60606107b46107ad8561118b565b84846113f9565b949350505050565b600f5460ff600160a01b909104161515600114156107de576107de6006610ec0565b60006107e86109c7565b905060006107f582610f5e565b90508081600101111561080f5761080f8282600101611388565b5050565b600061051c6108218361118b565b61141d565b600060606201388060005a60408051606081018252600f546001600160a01b0390811682528916602082015260019181019190915290915061086a81898989611421565b945094505060005a820390508083101561088b576010805484019055610894565b60108054820190555b505050935093915050565b60006060620186a060005a60408051606081018252600f5460ff600160a01b8204161515928201929092526001600160a01b039182168152908816602082015290915061086a81898989611421565b6000606033156108fd57600080fd5b600280546001600160a01b0319166001600160a01b038516179055610921856114b2565b600019601155600f80546001600160a01b0319166001600160a01b038681169190911790915560808601511615801561099c576000806109648860c00151610402565b90925090506001600160a01b038216610985576000945092506109b9915050565b600161099083611335565b945094505050506109b9565b6109b38660a0015187608001518860c0015161089f565b92509250505b935093915050565b60075490565b600f546001600160a01b031690565b600f5460009060609060ff600160a01b909104161515600114156109fe576109fe6006610ec0565b619c4060005a90506000610a106109c7565b9050610a1b81610ed9565b6000610a28828989611524565b9050610a348189611083565b95509550505060005a8203905080831015610a56576010805484019055610a5f565b60108054820190555b5050509250929050565b600a546060907fdefa017defa017defa017defa017defa017defa017defa017defa017defa017d14610aaa5750604080516020810190915260008152610bc5565b600280546001600160a01b0319166001600160a01b038481169190911791829055604051630d15d41560e41b815291169063d15d415090610aef903390600401612a29565b60206040518083038186803b158015610b0757600080fd5b505afa158015610b1b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b3f91906125b4565b610b645760405162461bcd60e51b8152600401610b5b90612b87565b60405180910390fd5b610b6d836114b2565b610b768361156a565b610b9757610b826115c6565b50604080516020810190915260008152610bc5565b6000610bb76003600001548560a001510385608001518660c0015161089f565b915050610bc26115c6565b90505b92915050565b600d546001600160a01b031690565b60095490565b6000610bf2610bed6109c7565b610f5e565b905090565b333014610c0357610ddc565b610c0c81611230565b610c3b57610c3b6005610c36604051806060016040528060348152602001612d5860349139611663565b61121a565b6001546040516352275acd60e11b81526001600160a01b039091169063a44eb59a90610c6b908590600401612af8565b60206040518083038186803b158015610c8357600080fd5b505afa158015610c97573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cbb91906125b4565b610ce557610ce56004610c366040518060a0016040528060768152602001612ce260769139611663565b610cee816112bb565b6000610cf983611322565b90506001600160a01b038116610d13573d6000803e3d6000fd5b6000610d1e82611335565b6001546040516352275acd60e11b81529192506001600160a01b03169063a44eb59a90610d4f908490600401612af8565b60206040518083038186803b158015610d6757600080fd5b505afa158015610d7b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d9f91906125b4565b610dc957610dc96004610c36604051806060016040528060308152602001612d8c60309139611663565b6105028383610dd785611216565b61134b565b505050565b60006060619c4060005a60408051606081018252600e546001600160a01b039081168252600f549081166020830152600160a01b900460ff1615159181019190915290915061086a81898989611421565b6000610e3e83836116a6565b600254604051631aaf392f60e01b81526001600160a01b0390911690631aaf392f90610e709086908690600401612a61565b60206040518083038186803b158015610e8857600080fd5b505afa158015610e9c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bc291906125ec565b61053e816040518060200160405280600081525061121a565b600080610f285a6002602160991b0185604051602401610ef99190612a29565b60408051601f198184030181529190526020810180516001600160e01b031663b1540a0160e01b17905261089f565b91509150600081806020019051810190610f4291906125b4565b9050801580610f4f575082155b15610799576107996007610ec0565b6000610f69826117e1565b60025460405163d126199f60e01b81526001600160a01b039091169063d126199f90610f99908590600401612a29565b60206040518083038186803b158015610fb157600080fd5b505afa158015610fc5573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061051c91906125ec565b60408051600280825260608201909252600091829190816020015b606081526020019060019003908161100457905050905061102484611928565b8160008151811061103157fe5b602002602001018190525061104583611952565b8160018151811061105257fe5b6020026020010181905250600061106882611965565b905061107a81805190602001206119a9565b95945050505050565b600060606110a56110926109c7565b61109d610bed6109c7565b600101611388565b60408051606081018252600f5460ff600160a01b8204161515928201929092526001600160a01b03918216815290851660208201526000806110eb835a898960016119ac565b91509150816110fb5760006110fd565b865b97909650945050505050565b806111148484610e32565b141561111f57610ddc565b6111298383611c1a565b600254604051635c17d62960e01b81526001600160a01b0390911690635c17d6299061115d90869086908690600401612a7a565b600060405180830381600087803b15801561117757600080fd5b505af1158015610795573d6000803e3d6000fd5b6000611196826117e1565b600254604051637c8ee70360e01b81526001600160a01b0390911690637c8ee703906111c6908590600401612a29565b60206040518083038186803b1580156111de57600080fd5b505afa1580156111f2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061051c9190612564565b3f90565b60006112268383611d2c565b9050805160208201fd5b600061123b826117e1565b6002546040516307a1294560e01b81526001600160a01b03909116906307a129459061126b908590600401612a29565b60206040518083038186803b15801561128357600080fd5b505afa158015611297573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061051c91906125b4565b6112c4816117e1565b600254604051637e78a4d160e11b81526001600160a01b039091169063fcf149a2906112f4908490600401612a29565b600060405180830381600087803b15801561130e57600080fd5b505af1158015610502573d6000803e3d6000fd5b6000808251602084016000f09392505050565b606061051c8260006113468561141d565b6113f9565b61135483611dd5565b6002546040516368510af960e11b81526001600160a01b039091169063d0a215f29061115d90869086908690600401612a3d565b61139182611dd5565b6002546040516374855dc360e11b81526001600160a01b039091169063e90abb86906113c39085908590600401612a61565b600060405180830381600087803b1580156113dd57600080fd5b505af11580156113f1573d6000803e3d6000fd5b505050505050565b6060806040519050602083018101604052828152828460208301873c949350505050565b3b90565b6000606073ffffffffffffffffffffffffffffffffffff0000841673deaddeaddeaddeaddeaddeaddeaddeaddead000014156114705750506040805160208101909152600081526001906114a9565b60006064856001600160a01b0316106114915761148c8561118b565b611493565b845b90506114a38787838760006119ac565b92509250505b94509492505050565b80516009556020810151600a5560a0810151600c5560408101516008805460ff1916600183818111156114e157fe5b02179055506060810151600d80546001600160a01b0319166001600160a01b03909216919091179055600554600b5560a081015161151e90611ee4565b60115550565b60008060ff60f81b858486805190602001206040516020016115499493929190612966565b60405160208183030381529060405280519060200120905061107a816119a9565b60007fdefa017defa017defa017defa017defa017defa017defa017defa017defa017d826020015114156115a05750600061051f565b6115b28260a001518360400151611ef7565b6115be5750600061051f565b506001919050565b600d80546001600160a01b031990811673defa017defa017defa017defa017defa017defa09081179092557fdefa017defa017defa017defa017defa017defa017defa017defa017defa017d6009819055600a819055600b819055600c8190556008805460ff191690556010819055600e8054831684179055600f8054831690931760ff60a01b1916909255601191909155600280549091169055565b6060816040516024016116769190612af8565b60408051601f198184030181529190526020810180516001600160e01b031662461bcd60e51b1790529050919050565b6175305a10156116ba576116ba6000610ec0565b600254604051630ad2267960e01b81526001600160a01b0390911690630ad22679906116ec9085908590600401612a61565b60206040518083038186803b15801561170457600080fd5b505afa158015611718573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061173c91906125b4565b61174a5761174a6003610ec0565b600254604051632bcdee1960e21b81526000916001600160a01b03169063af37b8649061177d9086908690600401612a61565b602060405180830381600087803b15801561179757600080fd5b505af11580156117ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117cf91906125b4565b905080610ddc57610ddc614e20611f27565b6175305a10156117f5576117f56000610ec0565b60025460405163c8e40fbf60e01b81526001600160a01b039091169063c8e40fbf90611825908490600401612a29565b60206040518083038186803b15801561183d57600080fd5b505afa158015611851573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061187591906125b4565b611883576118836003610ec0565b600254604051633ecdecc760e21b81526000916001600160a01b03169063fb37b31c906118b4908590600401612a29565b602060405180830381600087803b1580156118ce57600080fd5b505af11580156118e2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061190691906125b4565b90508061080f5761080f61753060646119216108218661118b565b0201611f27565b606061051c8260405160200161193e9190612949565b604051602081830303815290604052611f47565b606061051c61196083611f99565b611f47565b606060006119728361209d565b9050611980815160c061219d565b816040516020016119929291906129bb565b604051602081830303815290604052915050919050565b90565b6040805160608082018352600e546001600160a01b039081168352600f549081166020840152600160a01b900460ff16151592820192909252600091906119f381896122ed565b6011546000611a0189611ee4565b60118190559050600060608715611abd57604051309063fcb6829b60e01b90611a32908e908d908f90602401612bf3565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909416939093179092529051611a70919061299f565b6000604051808303816000865af19150503d8060008114611aad576040519150601f19603f3d011682016040523d82523d6000602084013e611ab2565b606091505b509092509050611b20565b896001600160a01b03168b8a604051611ad6919061299f565b60006040518083038160008787f1925050503d8060008114611b14576040519150601f19603f3d011682016040523d82523d6000602084013e611b19565b606091505b5090925090505b611b2a8c866122ed565b60115482611c0257600080600080611b41866123a1565b929650909450925090506003846007811115611b5957fe5b1415611b6857611b6884610ec0565b6001846007811115611b7657fe5b1480611b8d57506004846007811115611b8b57fe5b145b80611ba357506006846007811115611ba157fe5b145b80611bb957506007846007811115611bb757fe5b145b15611bc45760108290555b6001846007811115611bd257fe5b1480611bdb57508c5b15611be857809550611bfb565b6040518060200160405280600081525095505b5090925050505b90920390920360115590999098509650505050505050565b611c2482826116a6565b60025460405163af3dc01160e01b81526000916001600160a01b03169063af3dc01190611c579086908690600401612a61565b602060405180830381600087803b158015611c7157600080fd5b505af1158015611c85573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ca991906125b4565b905080610ddc57611cb983611dd5565b600260009054906101000a90046001600160a01b03166001600160a01b031663c3fd9b256040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611d0957600080fd5b505af1158015611d1d573d6000803e3d6000fd5b50505050610ddc614e20611f27565b60606000836007811115611d3c57fe5b1415611d575750604080516020810190915260008152610bc5565b6003836007811115611d6557fe5b1415611da357604080516020808201835260008083529251611d8d9387939092839201612b1f565b6040516020818303038152906040529050610bc5565b601154601054604051611dbe92869290918690602001612b5b565b604051602081830303815290604052905092915050565b611dde816117e1565b60025460405163011b1f7960e41b81526000916001600160a01b0316906311b1f79090611e0f908590600401612a29565b602060405180830381600087803b158015611e2957600080fd5b505af1158015611e3d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e6191906125b4565b90508061080f57600260009054906101000a90046001600160a01b03166001600160a01b03166333f943056040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611eb857600080fd5b505af1158015611ecc573d6000803e3d6000fd5b5050505061080f61753060646119216108218661118b565b60005a8210611ef3575a61051c565b5090565b600454600090831115611f0c57506000610bc5565b600354831015611f1e57506000610bc5565b50600192915050565b601154811115611f3b57611f3b6002610ec0565b60118054919091039055565b60608082516001148015611f6f5750608083600081518110611f6557fe5b016020015160f81c105b15611f7b57508161051c565b611f878351608061219d565b83604051602001611dbe9291906129bb565b6060600082604051602001611fae9190612a20565b604051602081830303815290604052905060005b6020811015611ff857818181518110611fd757fe5b01602001516001600160f81b03191615611ff057611ff8565b600101611fc2565b6000816020036001600160401b038111801561201357600080fd5b506040519080825280601f01601f19166020018201604052801561203e576020820181803683370190505b50905060005b815181101561209457835160018401938591811061205e57fe5b602001015160f81c60f81b82828151811061207557fe5b60200101906001600160f81b031916908160001a905350600101612044565b50949350505050565b60608151600014156120be575060408051600081526020810190915261051f565b6000805b83518110156120f1578381815181106120d757fe5b6020026020010151518201915080806001019150506120c2565b6000826001600160401b038111801561210957600080fd5b506040519080825280601f01601f191660200182016040528015612134576020820181803683370190505b50600092509050602081015b855183101561209457600086848151811061215757fe5b602002602001015190506000602082019050612175838284516123f4565b87858151811061218157fe5b6020026020010151518301925050508280600101935050612140565b60608060388410156121f7576040805160018082528183019092529060208201818036833701905050905082840160f81b816000815181106121db57fe5b60200101906001600160f81b031916908160001a905350610bc2565b600060015b80868161220557fe5b041561221a57600190910190610100026121fc565b816001016001600160401b038111801561223357600080fd5b506040519080825280601f01601f19166020018201604052801561225e576020820181803683370190505b50925084820160370160f81b8360008151811061227757fe5b60200101906001600160f81b031916908160001a905350600190505b8181116122e3576101008183036101000a87816122ac57fe5b04816122b457fe5b0660f81b8382815181106122c457fe5b60200101906001600160f81b031916908160001a905350600101612293565b5050905092915050565b805182516001600160a01b03908116911614612325578051600e80546001600160a01b0319166001600160a01b039092169190911790555b80602001516001600160a01b031682602001516001600160a01b03161461236b576020810151600f80546001600160a01b0319166001600160a01b039092169190911790555b80604001511515826040015115151461080f5760400151600f8054911515600160a01b0260ff60a01b1990921691909117905550565b600080600060608451600014156123d057505060408051602081019091526000808252925082915081906123ed565b848060200190518101906123e491906126da565b93509350935093505b9193509193565b8282825b60208110612417578151835260209283019290910190601f19016123f8565b905182516020929092036101000a6000190180199091169116179052505050565b600061244b61244684612c47565b612c24565b905082815283838301111561245f57600080fd5b828260208301376000602084830101529392505050565b803561051f81612c94565b600082601f830112612491578081fd5b610bc283833560208501612438565b80356002811061051f57600080fd5b600060e082840312156124c0578081fd5b6124ca60e0612c24565b905081358152602082013560208201526124e6604083016124a0565b60408201526124f760608301612476565b606082015261250860808301612476565b608082015260a082013560a082015260c08201356001600160401b0381111561253057600080fd5b61253c84828501612481565b60c08301525092915050565b600060208284031215612559578081fd5b8135610bc281612c94565b600060208284031215612575578081fd5b8151610bc281612c94565b600080600060608486031215612594578182fd5b833561259f81612c94565b95602085013595506040909401359392505050565b6000602082840312156125c5578081fd5b81518015158114610bc2578182fd5b6000602082840312156125e5578081fd5b5035919050565b6000602082840312156125fd578081fd5b5051919050565b60008060408385031215612616578182fd5b50508035926020909101359150565b6000806000806080858703121561263a578081fd5b84359350602085013560ff81168114612651578182fd5b93969395505050506040820135916060013590565b600060208284031215612677578081fd5b81356001600160401b0381111561268c578182fd5b6107b484828501612481565b600080604083850312156126aa578182fd5b82356001600160401b038111156126bf578283fd5b6126cb85828601612481565b95602094909401359450505050565b600080600080608085870312156126ef578182fd5b8451600881106126fd578283fd5b80945050602085015192506040850151915060608501516001600160401b03811115612727578182fd5b8501601f81018713612737578182fd5b805161274561244682612c47565b818152886020838501011115612759578384fd5b61276a826020830160208601612c68565b9598949750929550505050565b600060208284031215612788578081fd5b81356001600160401b0381111561279d578182fd5b8201601f810184136127ad578182fd5b6107b484823560208401612438565b600080604083850312156127ce578182fd5b82356001600160401b038111156127e3578283fd5b6127ef858286016124af565b925050602083013561280081612c94565b809150509250929050565b60008060006060848603121561281f578081fd5b83356001600160401b03811115612834578182fd5b612840868287016124af565b935050602084013561285181612c94565b9150604084013561286181612c94565b809150509250925092565b600080600060608486031215612880578081fd5b83359250602084013561289281612c94565b915060408401356001600160401b038111156128ac578182fd5b6128b886828701612481565b9150509250925092565b6000806000606084860312156128d6578081fd5b8335925060208401356001600160401b038111156128f2578182fd5b6128fe86828701612481565b925050604084013561286181612c94565b60008151808452612927816020860160208601612c68565b601f01601f19169290920160200192915050565b6008811061294557fe5b9052565b60609190911b6bffffffffffffffffffffffff1916815260140190565b6001600160f81b031994909416845260609290921b6bffffffffffffffffffffffff191660018401526015830152603582015260550190565b600082516129b1818460208701612c68565b9190910192915050565b600083516129cd818460208801612c68565b8351908301906129e1818360208801612c68565b01949350505050565b6c600d380380600d6000396000f360981b81528151600090612a1381600d850160208701612c68565b91909101600d0192915050565b90815260200190565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039390931683526020830191909152604082015260600190565b6001600160a01b03831681526040602082018190526000906107b49083018461290f565b60008315158252604060208301526107b4604083018461290f565b93845260ff9290921660208401526040830152606082015260800190565b600060208252610bc2602083018461290f565b6020810160028310612b1957fe5b91905290565b6000612b2b828761293b565b60ff8516602083015260ff8416604083015260806060830152612b51608083018461290f565b9695505050505050565b6000612b67828761293b565b84602083015283604083015260806060830152612b51608083018461290f565b60208082526046908201527f4f6e6c792061757468656e746963617465642061646472657373657320696e2060408201527f6f766d53746174654d616e616765722063616e2063616c6c20746869732066756060820152653731ba34b7b760d11b608082015260a00190565b600084825260606020830152612c0c606083018561290f565b905060018060a01b0383166040830152949350505050565b6040518181016001600160401b0381118282101715612c3f57fe5b604052919050565b60006001600160401b03821115612c5a57fe5b50601f01601f191660200190565b60005b83811015612c83578181015183820152602001612c6b565b838111156107995750506000910152565b6001600160a01b038116811461053e57600080fdfe5369676e61747572652070726f766964656420666f7220454f4120636f6e7472616374206372656174696f6e20697320696e76616c69642e436f6e7472616374206372656174696f6e20636f646520636f6e7461696e7320756e73616665206f70636f6465732e2044696420796f75207573652074686520726967687420636f6d70696c6572206f72207061737320616e20756e7361666520636f6e7374727563746f7220617267756d656e743f4120636f6e74726163742068617320616c7265616479206265656e206465706c6f79656420746f20746869732061646472657373436f6e7374727563746f7220617474656d7074656420746f206465706c6f7920756e736166652062797465636f64652ea2646970667358221220ba09f3066e98cffa8b50d7fb9822c62cac7bc36099454fe6dbe318573486c14d64736f6c63430007060033", - "devdoc": { - "details": "The Execution Manager (EM) is the core of our OVM implementation, and provides a sandboxed environment allowing us to execute OVM transactions deterministically on either Layer 1 or Layer 2. The EM's run() function is the first function called during the execution of any transaction on L2. For each context-dependent EVM operation the EM has a function which implements a corresponding OVM operation, which will read state from the State Manager contract. The EM relies on the Safety Checker to verify that code deployed to Layer 2 does not contain any context-dependent operations. Compiler used: solc Runtime target: EVM", - "kind": "dev", - "methods": { - "constructor": { - "params": { - "_libAddressManager": "Address of the Address Manager." - } - }, - "ovmADDRESS()": { - "returns": { - "_ADDRESS": "Active ADDRESS within the current message context." - } - }, - "ovmCALL(uint256,address,bytes)": { - "params": { - "_address": "Address of the contract to call.", - "_calldata": "Data to send along with the call.", - "_gasLimit": "Amount of gas to be passed into this call." - }, - "returns": { - "_returndata": "Data returned by the call.", - "_success": "Whether or not the call returned (rather than reverted)." - } - }, - "ovmCALLER()": { - "returns": { - "_CALLER": "Address of the CALLER within the current message context." - } - }, - "ovmCHAINID()": { - "returns": { - "_CHAINID": "Value of the chain's CHAINID within the global context." - } - }, - "ovmCREATE(bytes)": { - "params": { - "_bytecode": "Code to be used to CREATE a new contract." - }, - "returns": { - "_0": "Address of the created contract.", - "_1": "Revert data, if and only if the creation threw an exception." - } - }, - "ovmCREATE2(bytes,bytes32)": { - "params": { - "_bytecode": "Code to be used to CREATE2 a new contract.", - "_salt": "Value used to determine the contract's address." - }, - "returns": { - "_0": "Address of the created contract.", - "_1": "Revert data, if and only if the creation threw an exception." - } - }, - "ovmCREATEEOA(bytes32,uint8,bytes32,bytes32)": { - "details": "Essentially functions like ovmCREATE or ovmCREATE2, but we can bypass a lot of checks because the contract we're creating is trusted (no need to do safety checking or to handle unexpected reverts). Doesn't need to return an address because the address is assumed to be the user's actual address.", - "params": { - "_messageHash": "Hash of a message signed by some user, for verification.", - "_r": "Signature `r` parameter.", - "_s": "Signature `s` parameter.", - "_v": "Signature `v` parameter." - } - }, - "ovmDELEGATECALL(uint256,address,bytes)": { - "params": { - "_address": "Address of the contract to call.", - "_calldata": "Data to send along with the call.", - "_gasLimit": "Amount of gas to be passed into this call." - }, - "returns": { - "_returndata": "Data returned by the call.", - "_success": "Whether or not the call returned (rather than reverted)." - } - }, - "ovmEXTCODECOPY(address,uint256,uint256)": { - "params": { - "_contract": "Address of the contract to copy code from.", - "_length": "Total number of bytes to copy from the contract's code.", - "_offset": "Offset in bytes from the start of contract code to copy beyond." - }, - "returns": { - "_code": "Bytes of code copied from the requested contract." - } - }, - "ovmEXTCODEHASH(address)": { - "params": { - "_contract": "Address of the contract to query the hash of." - }, - "returns": { - "_EXTCODEHASH": "Hash of the requested contract." - } - }, - "ovmEXTCODESIZE(address)": { - "params": { - "_contract": "Address of the contract to query the size of." - }, - "returns": { - "_EXTCODESIZE": "Size of the requested contract in bytes." - } - }, - "ovmGASLIMIT()": { - "returns": { - "_GASLIMIT": "Value of the block's GASLIMIT within the transaction context." - } - }, - "ovmGETNONCE()": { - "returns": { - "_nonce": "Nonce of the current contract." - } - }, - "ovmL1QUEUEORIGIN()": { - "returns": { - "_queueOrigin": "Enum indicating the ovmL1QUEUEORIGIN within the current message context." - } - }, - "ovmL1TXORIGIN()": { - "returns": { - "_l1TxOrigin": "Address of the account which sent the tx into L2 from L1." - } - }, - "ovmNUMBER()": { - "returns": { - "_NUMBER": "Value of the NUMBER within the transaction context." - } - }, - "ovmREVERT(bytes)": { - "params": { - "_data": "Bytes data to pass along with the REVERT." - } - }, - "ovmSLOAD(bytes32)": { - "params": { - "_key": "32 byte key of the storage slot to load." - }, - "returns": { - "_value": "32 byte value of the requested storage slot." - } - }, - "ovmSSTORE(bytes32,bytes32)": { - "params": { - "_key": "32 byte key of the storage slot to set.", - "_value": "32 byte value for the storage slot." - } - }, - "ovmSTATICCALL(uint256,address,bytes)": { - "params": { - "_address": "Address of the contract to call.", - "_calldata": "Data to send along with the call.", - "_gasLimit": "Amount of gas to be passed into this call." - }, - "returns": { - "_returndata": "Data returned by the call.", - "_success": "Whether or not the call returned (rather than reverted)." - } - }, - "ovmTIMESTAMP()": { - "returns": { - "_TIMESTAMP": "Value of the TIMESTAMP within the transaction context." - } - }, - "resolve(string)": { - "params": { - "_name": "Name to resolve an address for." - }, - "returns": { - "_0": "Address associated with the given name." - } - }, - "run((uint256,uint256,uint8,address,address,uint256,bytes),address)": { - "params": { - "_ovmStateManager": "iOVM_StateManager implementation providing account state.", - "_transaction": "Transaction data to be executed." - } - }, - "safeCREATE(uint256,bytes,address)": { - "params": { - "_address": "OVM address being deployed to.", - "_creationCode": "Code to pass into CREATE for deployment.", - "_gasLimit": "Amount of gas to be passed into this creation." - } - }, - "simulateMessage((uint256,uint256,uint8,address,address,uint256,bytes),address,address)": { - "params": { - "_from": "the OVM account the simulated call should be from.", - "_transaction": "the message transaction to simulate." - } - } - }, - "title": "OVM_ExecutionManager", - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": { - "ovmADDRESS()": { - "notice": "Overrides ADDRESS." - }, - "ovmCALL(uint256,address,bytes)": { - "notice": "Overrides CALL." - }, - "ovmCALLER()": { - "notice": "Overrides CALLER." - }, - "ovmCHAINID()": { - "notice": "Overrides CHAINID." - }, - "ovmCREATE(bytes)": { - "notice": "Overrides CREATE." - }, - "ovmCREATE2(bytes,bytes32)": { - "notice": "Overrides CREATE2." - }, - "ovmCREATEEOA(bytes32,uint8,bytes32,bytes32)": { - "notice": "Creates a new EOA contract account, for account abstraction." - }, - "ovmDELEGATECALL(uint256,address,bytes)": { - "notice": "Overrides DELEGATECALL." - }, - "ovmEXTCODECOPY(address,uint256,uint256)": { - "notice": "Overrides EXTCODECOPY." - }, - "ovmEXTCODEHASH(address)": { - "notice": "Overrides EXTCODEHASH." - }, - "ovmEXTCODESIZE(address)": { - "notice": "Overrides EXTCODESIZE." - }, - "ovmGASLIMIT()": { - "notice": "Overrides GASLIMIT." - }, - "ovmGETNONCE()": { - "notice": "Retrieves the nonce of the current ovmADDRESS." - }, - "ovmINCREMENTNONCE()": { - "notice": "Bumps the nonce of the current ovmADDRESS by one." - }, - "ovmL1QUEUEORIGIN()": { - "notice": "Specifies from which source (Sequencer or Queue) this transaction originated from." - }, - "ovmL1TXORIGIN()": { - "notice": "Specifies which L1 account, if any, sent this transaction by calling enqueue()." - }, - "ovmNUMBER()": { - "notice": "Overrides NUMBER." - }, - "ovmREVERT(bytes)": { - "notice": "Overrides REVERT." - }, - "ovmSLOAD(bytes32)": { - "notice": "Overrides SLOAD." - }, - "ovmSSTORE(bytes32,bytes32)": { - "notice": "Overrides SSTORE." - }, - "ovmSTATICCALL(uint256,address,bytes)": { - "notice": "Overrides STATICCALL." - }, - "ovmTIMESTAMP()": { - "notice": "Overrides TIMESTAMP." - }, - "resolve(string)": { - "notice": "Resolves the address associated with a given name." - }, - "run((uint256,uint256,uint8,address,address,uint256,bytes),address)": { - "notice": "Starts the execution of a transaction via the OVM_ExecutionManager." - }, - "safeCREATE(uint256,bytes,address)": { - "notice": "Handles the creation-specific safety measures required for OVM contract deployment. This function sanitizes the return types for creation messages to match calls (bool, bytes), by being an external function which the EM can call, that mimics the success/fail case of the CREATE. This allows for consistent handling of both types of messages in _handleExternalMessage(). Having this step occur as a separate call frame also allows us to easily revert the contract deployment in the event that the code is unsafe." - }, - "simulateMessage((uint256,uint256,uint8,address,address,uint256,bytes),address,address)": { - "notice": "Unreachable helper function for simulating eth_calls with an OVM message context. This function will throw an exception in all cases other than when used as a custom entrypoint in L2 Geth to simulate eth_call." - } - }, - "version": 1 - }, - "storageLayout": { - "storage": [ - { - "astId": 12800, - "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", - "label": "libAddressManager", - "offset": 0, - "slot": "0", - "type": "t_contract(Lib_AddressManager)12793" - }, - { - "astId": 5184, - "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", - "label": "ovmSafetyChecker", - "offset": 0, - "slot": "1", - "type": "t_contract(iOVM_SafetyChecker)11280" - }, - { - "astId": 5186, - "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", - "label": "ovmStateManager", - "offset": 0, - "slot": "2", - "type": "t_contract(iOVM_StateManager)11512" - }, - { - "astId": 5188, - "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", - "label": "gasMeterConfig", - "offset": 0, - "slot": "3", - "type": "t_struct(GasMeterConfig)11063_storage" - }, - { - "astId": 5190, - "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", - "label": "globalContext", - "offset": 0, - "slot": "7", - "type": "t_struct(GlobalContext)11066_storage" - }, - { - "astId": 5192, - "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", - "label": "transactionContext", - "offset": 0, - "slot": "8", - "type": "t_struct(TransactionContext)11079_storage" - }, - { - "astId": 5194, - "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", - "label": "messageContext", - "offset": 0, - "slot": "14", - "type": "t_struct(MessageContext)11089_storage" - }, - { - "astId": 5196, - "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", - "label": "transactionRecord", - "offset": 0, - "slot": "16", - "type": "t_struct(TransactionRecord)11082_storage" - }, - { - "astId": 5198, - "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", - "label": "messageRecord", - "offset": 0, - "slot": "17", - "type": "t_struct(MessageRecord)11092_storage" - } - ], - "types": { - "t_address": { - "encoding": "inplace", - "label": "address", - "numberOfBytes": "20" - }, - "t_bool": { - "encoding": "inplace", - "label": "bool", - "numberOfBytes": "1" - }, - "t_contract(Lib_AddressManager)12793": { - "encoding": "inplace", - "label": "contract Lib_AddressManager", - "numberOfBytes": "20" - }, - "t_contract(iOVM_SafetyChecker)11280": { - "encoding": "inplace", - "label": "contract iOVM_SafetyChecker", - "numberOfBytes": "20" - }, - "t_contract(iOVM_StateManager)11512": { - "encoding": "inplace", - "label": "contract iOVM_StateManager", - "numberOfBytes": "20" - }, - "t_enum(QueueOrigin)12433": { - "encoding": "inplace", - "label": "enum Lib_OVMCodec.QueueOrigin", - "numberOfBytes": "1" - }, - "t_struct(GasMeterConfig)11063_storage": { - "encoding": "inplace", - "label": "struct iOVM_ExecutionManager.GasMeterConfig", - "members": [ - { - "astId": 11056, - "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", - "label": "minTransactionGasLimit", - "offset": 0, - "slot": "0", - "type": "t_uint256" - }, - { - "astId": 11058, - "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", - "label": "maxTransactionGasLimit", - "offset": 0, - "slot": "1", - "type": "t_uint256" - }, - { - "astId": 11060, - "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", - "label": "maxGasPerQueuePerEpoch", - "offset": 0, - "slot": "2", - "type": "t_uint256" - }, - { - "astId": 11062, - "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", - "label": "secondsPerEpoch", - "offset": 0, - "slot": "3", - "type": "t_uint256" - } - ], - "numberOfBytes": "128" - }, - "t_struct(GlobalContext)11066_storage": { - "encoding": "inplace", - "label": "struct iOVM_ExecutionManager.GlobalContext", - "members": [ - { - "astId": 11065, - "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", - "label": "ovmCHAINID", - "offset": 0, - "slot": "0", - "type": "t_uint256" - } - ], - "numberOfBytes": "32" - }, - "t_struct(MessageContext)11089_storage": { - "encoding": "inplace", - "label": "struct iOVM_ExecutionManager.MessageContext", - "members": [ - { - "astId": 11084, - "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", - "label": "ovmCALLER", - "offset": 0, - "slot": "0", - "type": "t_address" - }, - { - "astId": 11086, - "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", - "label": "ovmADDRESS", - "offset": 0, - "slot": "1", - "type": "t_address" - }, - { - "astId": 11088, - "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", - "label": "isStatic", - "offset": 20, - "slot": "1", - "type": "t_bool" - } - ], - "numberOfBytes": "64" - }, - "t_struct(MessageRecord)11092_storage": { - "encoding": "inplace", - "label": "struct iOVM_ExecutionManager.MessageRecord", - "members": [ - { - "astId": 11091, - "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", - "label": "nuisanceGasLeft", - "offset": 0, - "slot": "0", - "type": "t_uint256" - } - ], - "numberOfBytes": "32" - }, - "t_struct(TransactionContext)11079_storage": { - "encoding": "inplace", - "label": "struct iOVM_ExecutionManager.TransactionContext", - "members": [ - { - "astId": 11068, - "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", - "label": "ovmL1QUEUEORIGIN", - "offset": 0, - "slot": "0", - "type": "t_enum(QueueOrigin)12433" - }, - { - "astId": 11070, - "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", - "label": "ovmTIMESTAMP", - "offset": 0, - "slot": "1", - "type": "t_uint256" - }, - { - "astId": 11072, - "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", - "label": "ovmNUMBER", - "offset": 0, - "slot": "2", - "type": "t_uint256" - }, - { - "astId": 11074, - "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", - "label": "ovmGASLIMIT", - "offset": 0, - "slot": "3", - "type": "t_uint256" - }, - { - "astId": 11076, - "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", - "label": "ovmTXGASLIMIT", - "offset": 0, - "slot": "4", - "type": "t_uint256" - }, - { - "astId": 11078, - "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", - "label": "ovmL1TXORIGIN", - "offset": 0, - "slot": "5", - "type": "t_address" - } - ], - "numberOfBytes": "192" - }, - "t_struct(TransactionRecord)11082_storage": { - "encoding": "inplace", - "label": "struct iOVM_ExecutionManager.TransactionRecord", - "members": [ - { - "astId": 11081, - "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", - "label": "ovmGasRefund", - "offset": 0, - "slot": "0", - "type": "t_uint256" - } - ], - "numberOfBytes": "32" - }, - "t_uint256": { - "encoding": "inplace", - "label": "uint256", - "numberOfBytes": "32" - } - } - } -} \ No newline at end of file diff --git a/packages/contracts/deployments/kovan-v3/OVM_FraudVerifier.json b/packages/contracts/deployments/kovan-v3/OVM_FraudVerifier.json deleted file mode 100644 index dafeec721864e..0000000000000 --- a/packages/contracts/deployments/kovan-v3/OVM_FraudVerifier.json +++ /dev/null @@ -1,576 +0,0 @@ -{ - "address": "0x4B2F74938Ddb8742C33b46aD1a402c85e9dABC44", - "abi": [ - { - "inputs": [ - { - "internalType": "address", - "name": "_libAddressManager", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "bytes32", - "name": "_preStateRoot", - "type": "bytes32" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_preStateRootIndex", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "bytes32", - "name": "_transactionHash", - "type": "bytes32" - }, - { - "indexed": false, - "internalType": "address", - "name": "_who", - "type": "address" - } - ], - "name": "FraudProofFinalized", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "bytes32", - "name": "_preStateRoot", - "type": "bytes32" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_preStateRootIndex", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "bytes32", - "name": "_transactionHash", - "type": "bytes32" - }, - { - "indexed": false, - "internalType": "address", - "name": "_who", - "type": "address" - } - ], - "name": "FraudProofInitialized", - "type": "event" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "_preStateRoot", - "type": "bytes32" - }, - { - "components": [ - { - "internalType": "uint256", - "name": "batchIndex", - "type": "uint256" - }, - { - "internalType": "bytes32", - "name": "batchRoot", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "batchSize", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "prevTotalElements", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "extraData", - "type": "bytes" - } - ], - "internalType": "struct Lib_OVMCodec.ChainBatchHeader", - "name": "_preStateRootBatchHeader", - "type": "tuple" - }, - { - "components": [ - { - "internalType": "uint256", - "name": "index", - "type": "uint256" - }, - { - "internalType": "bytes32[]", - "name": "siblings", - "type": "bytes32[]" - } - ], - "internalType": "struct Lib_OVMCodec.ChainInclusionProof", - "name": "_preStateRootProof", - "type": "tuple" - }, - { - "internalType": "bytes32", - "name": "_txHash", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "_postStateRoot", - "type": "bytes32" - }, - { - "components": [ - { - "internalType": "uint256", - "name": "batchIndex", - "type": "uint256" - }, - { - "internalType": "bytes32", - "name": "batchRoot", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "batchSize", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "prevTotalElements", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "extraData", - "type": "bytes" - } - ], - "internalType": "struct Lib_OVMCodec.ChainBatchHeader", - "name": "_postStateRootBatchHeader", - "type": "tuple" - }, - { - "components": [ - { - "internalType": "uint256", - "name": "index", - "type": "uint256" - }, - { - "internalType": "bytes32[]", - "name": "siblings", - "type": "bytes32[]" - } - ], - "internalType": "struct Lib_OVMCodec.ChainInclusionProof", - "name": "_postStateRootProof", - "type": "tuple" - } - ], - "name": "finalizeFraudVerification", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "_preStateRoot", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "_txHash", - "type": "bytes32" - } - ], - "name": "getStateTransitioner", - "outputs": [ - { - "internalType": "contract iOVM_StateTransitioner", - "name": "_transitioner", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "_preStateRoot", - "type": "bytes32" - }, - { - "components": [ - { - "internalType": "uint256", - "name": "batchIndex", - "type": "uint256" - }, - { - "internalType": "bytes32", - "name": "batchRoot", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "batchSize", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "prevTotalElements", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "extraData", - "type": "bytes" - } - ], - "internalType": "struct Lib_OVMCodec.ChainBatchHeader", - "name": "_preStateRootBatchHeader", - "type": "tuple" - }, - { - "components": [ - { - "internalType": "uint256", - "name": "index", - "type": "uint256" - }, - { - "internalType": "bytes32[]", - "name": "siblings", - "type": "bytes32[]" - } - ], - "internalType": "struct Lib_OVMCodec.ChainInclusionProof", - "name": "_preStateRootProof", - "type": "tuple" - }, - { - "components": [ - { - "internalType": "uint256", - "name": "timestamp", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "blockNumber", - "type": "uint256" - }, - { - "internalType": "enum Lib_OVMCodec.QueueOrigin", - "name": "l1QueueOrigin", - "type": "uint8" - }, - { - "internalType": "address", - "name": "l1TxOrigin", - "type": "address" - }, - { - "internalType": "address", - "name": "entrypoint", - "type": "address" - }, - { - "internalType": "uint256", - "name": "gasLimit", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "data", - "type": "bytes" - } - ], - "internalType": "struct Lib_OVMCodec.Transaction", - "name": "_transaction", - "type": "tuple" - }, - { - "components": [ - { - "internalType": "bool", - "name": "isSequenced", - "type": "bool" - }, - { - "internalType": "uint256", - "name": "queueIndex", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "timestamp", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "blockNumber", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "txData", - "type": "bytes" - } - ], - "internalType": "struct Lib_OVMCodec.TransactionChainElement", - "name": "_txChainElement", - "type": "tuple" - }, - { - "components": [ - { - "internalType": "uint256", - "name": "batchIndex", - "type": "uint256" - }, - { - "internalType": "bytes32", - "name": "batchRoot", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "batchSize", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "prevTotalElements", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "extraData", - "type": "bytes" - } - ], - "internalType": "struct Lib_OVMCodec.ChainBatchHeader", - "name": "_transactionBatchHeader", - "type": "tuple" - }, - { - "components": [ - { - "internalType": "uint256", - "name": "index", - "type": "uint256" - }, - { - "internalType": "bytes32[]", - "name": "siblings", - "type": "bytes32[]" - } - ], - "internalType": "struct Lib_OVMCodec.ChainInclusionProof", - "name": "_transactionProof", - "type": "tuple" - } - ], - "name": "initializeFraudVerification", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "libAddressManager", - "outputs": [ - { - "internalType": "contract Lib_AddressManager", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "string", - "name": "_name", - "type": "string" - } - ], - "name": "resolve", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - } - ], - "transactionHash": "0xb8082579bad0f835bc920bd0a9914c2579d22b880631c0d48e905bc30c4dc913", - "receipt": { - "to": null, - "from": "0x18394B52d3Cb931dfA76F63251919D051953413d", - "contractAddress": "0x4B2F74938Ddb8742C33b46aD1a402c85e9dABC44", - "transactionIndex": 2, - "gasUsed": "1385698", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0x064d3a146603fa300614898ab7c1d631f1f7bdda0144fa855991c6da4ce5103b", - "transactionHash": "0xb8082579bad0f835bc920bd0a9914c2579d22b880631c0d48e905bc30c4dc913", - "logs": [], - "blockNumber": 24572850, - "cumulativeGasUsed": "1633498", - "status": 1, - "byzantium": true - }, - "args": [ - "0xd56F695e73286ac252A37593DD4E7c14270eC1Df" - ], - "solcInputHash": "5ee8e508e2c54cb5ac6783b4855b1558", - "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"_preStateRoot\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_preStateRootIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"_transactionHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_who\",\"type\":\"address\"}],\"name\":\"FraudProofFinalized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"_preStateRoot\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_preStateRootIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"_transactionHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_who\",\"type\":\"address\"}],\"name\":\"FraudProofInitialized\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_preStateRoot\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"_preStateRootBatchHeader\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"siblings\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct Lib_OVMCodec.ChainInclusionProof\",\"name\":\"_preStateRootProof\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"_txHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"_postStateRoot\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"_postStateRootBatchHeader\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"siblings\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct Lib_OVMCodec.ChainInclusionProof\",\"name\":\"_postStateRootProof\",\"type\":\"tuple\"}],\"name\":\"finalizeFraudVerification\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_preStateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"_txHash\",\"type\":\"bytes32\"}],\"name\":\"getStateTransitioner\",\"outputs\":[{\"internalType\":\"contract iOVM_StateTransitioner\",\"name\":\"_transitioner\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_preStateRoot\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"_preStateRootBatchHeader\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"siblings\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct Lib_OVMCodec.ChainInclusionProof\",\"name\":\"_preStateRootProof\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"enum Lib_OVMCodec.QueueOrigin\",\"name\":\"l1QueueOrigin\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"l1TxOrigin\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"entrypoint\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.Transaction\",\"name\":\"_transaction\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isSequenced\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"queueIndex\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"txData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.TransactionChainElement\",\"name\":\"_txChainElement\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"_transactionBatchHeader\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"siblings\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct Lib_OVMCodec.ChainInclusionProof\",\"name\":\"_transactionProof\",\"type\":\"tuple\"}],\"name\":\"initializeFraudVerification\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The Fraud Verifier contract coordinates the entire fraud proof verification process. If the fraud proof was successful it prunes any state batches from State Commitment Chain which were published after the fraudulent state root. Compiler used: solc Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\"}},\"finalizeFraudVerification(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes32,bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))\":{\"params\":{\"_postStateRoot\":\"State root after the fraudulent transaction.\",\"_postStateRootBatchHeader\":\"Batch header for the provided post-state root.\",\"_postStateRootProof\":\"Inclusion proof for the provided post-state root.\",\"_preStateRoot\":\"State root before the fraudulent transaction.\",\"_preStateRootBatchHeader\":\"Batch header for the provided pre-state root.\",\"_preStateRootProof\":\"Inclusion proof for the provided pre-state root.\",\"_txHash\":\"The transaction for the state root\"}},\"getStateTransitioner(bytes32,bytes32)\":{\"params\":{\"_preStateRoot\":\"State root to query a transitioner for.\"},\"returns\":{\"_transitioner\":\"Corresponding state transitioner contract.\"}},\"initializeFraudVerification(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),(uint256,uint256,uint8,address,address,uint256,bytes),(bool,uint256,uint256,uint256,bytes),(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))\":{\"params\":{\"_preStateRoot\":\"State root before the fraudulent transaction.\",\"_preStateRootBatchHeader\":\"Batch header for the provided pre-state root.\",\"_preStateRootProof\":\"Inclusion proof for the provided pre-state root.\",\"_transaction\":\"OVM transaction claimed to be fraudulent.\",\"_transactionBatchHeader\":\"Batch header for the provided transaction.\",\"_transactionProof\":\"Inclusion proof for the provided transaction.\",\"_txChainElement\":\"OVM transaction chain element.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}}},\"title\":\"OVM_FraudVerifier\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"finalizeFraudVerification(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes32,bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))\":{\"notice\":\"Finalizes the fraud verification process.\"},\"getStateTransitioner(bytes32,bytes32)\":{\"notice\":\"Retrieves the state transitioner for a given root.\"},\"initializeFraudVerification(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),(uint256,uint256,uint8,address,address,uint256,bytes),(bool,uint256,uint256,uint256,bytes),(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))\":{\"notice\":\"Begins the fraud verification process.\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/OVM/verification/OVM_FraudVerifier.sol\":\"OVM_FraudVerifier\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor () internal {\\n address msgSender = _msgSender();\\n _owner = msgSender;\\n emit OwnershipTransferred(address(0), msgSender);\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n emit OwnershipTransferred(_owner, address(0));\\n _owner = address(0);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n emit OwnershipTransferred(_owner, newOwner);\\n _owner = newOwner;\\n }\\n}\\n\",\"keccak256\":\"0x15e2d5bd4c28a88548074c54d220e8086f638a71ed07e6b3ba5a70066fcf458d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with GSN meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address payable) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes memory) {\\n this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x8d3cb350f04ff49cfb10aef08d87f19dcbaecc8027b0bed12f3275cd12f38cf0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/verification/Abs_FraudContributor.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\nimport { iOVM_BondManager } from \\\"../../iOVM/verification/iOVM_BondManager.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/// Minimal contract to be inherited by contracts consumed by users that provide\\n/// data for fraud proofs\\nabstract contract Abs_FraudContributor is Lib_AddressResolver {\\n /// Decorate your functions with this modifier to store how much total gas was\\n /// consumed by the sender, to reward users fairly\\n modifier contributesToFraudProof(bytes32 preStateRoot, bytes32 txHash) {\\n uint256 startGas = gasleft();\\n _;\\n uint256 gasSpent = startGas - gasleft();\\n iOVM_BondManager(resolve('OVM_BondManager')).recordGasSpent(preStateRoot, txHash, msg.sender, gasSpent);\\n }\\n}\\n\",\"keccak256\":\"0x6c27d089a297103cb93b30f7649ab68691cc6b948c315f1037e5de1fe9bf5903\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/verification/OVM_FraudVerifier.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_FraudVerifier } from \\\"../../iOVM/verification/iOVM_FraudVerifier.sol\\\";\\nimport { iOVM_StateTransitioner } from \\\"../../iOVM/verification/iOVM_StateTransitioner.sol\\\";\\nimport { iOVM_StateTransitionerFactory } from \\\"../../iOVM/verification/iOVM_StateTransitionerFactory.sol\\\";\\nimport { iOVM_BondManager } from \\\"../../iOVM/verification/iOVM_BondManager.sol\\\";\\nimport { iOVM_StateCommitmentChain } from \\\"../../iOVM/chain/iOVM_StateCommitmentChain.sol\\\";\\nimport { iOVM_CanonicalTransactionChain } from \\\"../../iOVM/chain/iOVM_CanonicalTransactionChain.sol\\\";\\n\\n/* Contract Imports */\\nimport { Abs_FraudContributor } from \\\"./Abs_FraudContributor.sol\\\";\\n\\n\\n\\n/**\\n * @title OVM_FraudVerifier\\n * @dev The Fraud Verifier contract coordinates the entire fraud proof verification process.\\n * If the fraud proof was successful it prunes any state batches from State Commitment Chain\\n * which were published after the fraudulent state root.\\n *\\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract OVM_FraudVerifier is Lib_AddressResolver, Abs_FraudContributor, iOVM_FraudVerifier {\\n\\n /*******************************************\\n * Contract Variables: Internal Accounting *\\n *******************************************/\\n\\n mapping (bytes32 => iOVM_StateTransitioner) internal transitioners;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n */\\n constructor(\\n address _libAddressManager\\n )\\n Lib_AddressResolver(_libAddressManager)\\n {}\\n\\n\\n /***************************************\\n * Public Functions: Transition Status *\\n ***************************************/\\n\\n /**\\n * Retrieves the state transitioner for a given root.\\n * @param _preStateRoot State root to query a transitioner for.\\n * @return _transitioner Corresponding state transitioner contract.\\n */\\n function getStateTransitioner(\\n bytes32 _preStateRoot,\\n bytes32 _txHash\\n )\\n override\\n public\\n view\\n returns (\\n iOVM_StateTransitioner _transitioner\\n )\\n {\\n return transitioners[keccak256(abi.encodePacked(_preStateRoot, _txHash))];\\n }\\n\\n\\n /****************************************\\n * Public Functions: Fraud Verification *\\n ****************************************/\\n\\n /**\\n * Begins the fraud verification process.\\n * @param _preStateRoot State root before the fraudulent transaction.\\n * @param _preStateRootBatchHeader Batch header for the provided pre-state root.\\n * @param _preStateRootProof Inclusion proof for the provided pre-state root.\\n * @param _transaction OVM transaction claimed to be fraudulent.\\n * @param _txChainElement OVM transaction chain element.\\n * @param _transactionBatchHeader Batch header for the provided transaction.\\n * @param _transactionProof Inclusion proof for the provided transaction.\\n */\\n function initializeFraudVerification(\\n bytes32 _preStateRoot,\\n Lib_OVMCodec.ChainBatchHeader memory _preStateRootBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _preStateRootProof,\\n Lib_OVMCodec.Transaction memory _transaction,\\n Lib_OVMCodec.TransactionChainElement memory _txChainElement,\\n Lib_OVMCodec.ChainBatchHeader memory _transactionBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _transactionProof\\n )\\n override\\n public\\n contributesToFraudProof(_preStateRoot, Lib_OVMCodec.hashTransaction(_transaction))\\n {\\n bytes32 _txHash = Lib_OVMCodec.hashTransaction(_transaction);\\n\\n if (_hasStateTransitioner(_preStateRoot, _txHash)) {\\n return;\\n }\\n\\n iOVM_StateCommitmentChain ovmStateCommitmentChain = iOVM_StateCommitmentChain(resolve(\\\"OVM_StateCommitmentChain\\\"));\\n iOVM_CanonicalTransactionChain ovmCanonicalTransactionChain = iOVM_CanonicalTransactionChain(resolve(\\\"OVM_CanonicalTransactionChain\\\"));\\n\\n require(\\n ovmStateCommitmentChain.verifyStateCommitment(\\n _preStateRoot,\\n _preStateRootBatchHeader,\\n _preStateRootProof\\n ),\\n \\\"Invalid pre-state root inclusion proof.\\\"\\n );\\n\\n require(\\n ovmCanonicalTransactionChain.verifyTransaction(\\n _transaction,\\n _txChainElement,\\n _transactionBatchHeader,\\n _transactionProof\\n ),\\n \\\"Invalid transaction inclusion proof.\\\"\\n );\\n\\n require (\\n _preStateRootBatchHeader.prevTotalElements + _preStateRootProof.index + 1 == _transactionBatchHeader.prevTotalElements + _transactionProof.index,\\n \\\"Pre-state root global index must equal to the transaction root global index.\\\"\\n );\\n\\n _deployTransitioner(_preStateRoot, _txHash, _preStateRootProof.index);\\n\\n emit FraudProofInitialized(\\n _preStateRoot,\\n _preStateRootProof.index,\\n _txHash,\\n msg.sender\\n );\\n }\\n\\n /**\\n * Finalizes the fraud verification process.\\n * @param _preStateRoot State root before the fraudulent transaction.\\n * @param _preStateRootBatchHeader Batch header for the provided pre-state root.\\n * @param _preStateRootProof Inclusion proof for the provided pre-state root.\\n * @param _txHash The transaction for the state root\\n * @param _postStateRoot State root after the fraudulent transaction.\\n * @param _postStateRootBatchHeader Batch header for the provided post-state root.\\n * @param _postStateRootProof Inclusion proof for the provided post-state root.\\n */\\n function finalizeFraudVerification(\\n bytes32 _preStateRoot,\\n Lib_OVMCodec.ChainBatchHeader memory _preStateRootBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _preStateRootProof,\\n bytes32 _txHash,\\n bytes32 _postStateRoot,\\n Lib_OVMCodec.ChainBatchHeader memory _postStateRootBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _postStateRootProof\\n )\\n override\\n public\\n contributesToFraudProof(_preStateRoot, _txHash)\\n {\\n iOVM_StateTransitioner transitioner = getStateTransitioner(_preStateRoot, _txHash);\\n iOVM_StateCommitmentChain ovmStateCommitmentChain = iOVM_StateCommitmentChain(resolve(\\\"OVM_StateCommitmentChain\\\"));\\n\\n require(\\n transitioner.isComplete() == true,\\n \\\"State transition process must be completed prior to finalization.\\\"\\n );\\n\\n require (\\n _postStateRootBatchHeader.prevTotalElements + _postStateRootProof.index == _preStateRootBatchHeader.prevTotalElements + _preStateRootProof.index + 1,\\n \\\"Post-state root global index must equal to the pre state root global index plus one.\\\"\\n );\\n\\n require(\\n ovmStateCommitmentChain.verifyStateCommitment(\\n _preStateRoot,\\n _preStateRootBatchHeader,\\n _preStateRootProof\\n ),\\n \\\"Invalid pre-state root inclusion proof.\\\"\\n );\\n\\n require(\\n ovmStateCommitmentChain.verifyStateCommitment(\\n _postStateRoot,\\n _postStateRootBatchHeader,\\n _postStateRootProof\\n ),\\n \\\"Invalid post-state root inclusion proof.\\\"\\n );\\n\\n // If the post state root did not match, then there was fraud and we should delete the batch\\n require(\\n _postStateRoot != transitioner.getPostStateRoot(),\\n \\\"State transition has not been proven fraudulent.\\\"\\n );\\n\\n _cancelStateTransition(_postStateRootBatchHeader, _preStateRoot);\\n\\n // TEMPORARY: Remove the transitioner; for minnet.\\n transitioners[keccak256(abi.encodePacked(_preStateRoot, _txHash))] = iOVM_StateTransitioner(0x0000000000000000000000000000000000000000);\\n\\n emit FraudProofFinalized(\\n _preStateRoot,\\n _preStateRootProof.index,\\n _txHash,\\n msg.sender\\n );\\n }\\n\\n\\n /************************************\\n * Internal Functions: Verification *\\n ************************************/\\n\\n /**\\n * Checks whether a transitioner already exists for a given pre-state root.\\n * @param _preStateRoot Pre-state root to check.\\n * @return _exists Whether or not we already have a transitioner for the root.\\n */\\n function _hasStateTransitioner(\\n bytes32 _preStateRoot,\\n bytes32 _txHash\\n )\\n internal\\n view\\n returns (\\n bool _exists\\n )\\n {\\n return address(getStateTransitioner(_preStateRoot, _txHash)) != address(0);\\n }\\n\\n /**\\n * Deploys a new state transitioner.\\n * @param _preStateRoot Pre-state root to initialize the transitioner with.\\n * @param _txHash Hash of the transaction this transitioner will execute.\\n * @param _stateTransitionIndex Index of the transaction in the chain.\\n */\\n function _deployTransitioner(\\n bytes32 _preStateRoot,\\n bytes32 _txHash,\\n uint256 _stateTransitionIndex\\n )\\n internal\\n {\\n transitioners[keccak256(abi.encodePacked(_preStateRoot, _txHash))] = iOVM_StateTransitionerFactory(\\n resolve(\\\"OVM_StateTransitionerFactory\\\")\\n ).create(\\n address(libAddressManager),\\n _stateTransitionIndex,\\n _preStateRoot,\\n _txHash\\n );\\n }\\n\\n /**\\n * Removes a state transition from the state commitment chain.\\n * @param _postStateRootBatchHeader Header for the post-state root.\\n * @param _preStateRoot Pre-state root hash.\\n */\\n function _cancelStateTransition(\\n Lib_OVMCodec.ChainBatchHeader memory _postStateRootBatchHeader,\\n bytes32 _preStateRoot\\n )\\n internal\\n {\\n iOVM_StateCommitmentChain ovmStateCommitmentChain = iOVM_StateCommitmentChain(resolve(\\\"OVM_StateCommitmentChain\\\"));\\n iOVM_BondManager ovmBondManager = iOVM_BondManager(resolve(\\\"OVM_BondManager\\\"));\\n\\n // Delete the state batch.\\n ovmStateCommitmentChain.deleteStateBatch(\\n _postStateRootBatchHeader\\n );\\n\\n // Get the timestamp and publisher for that block.\\n (uint256 timestamp, address publisher) = abi.decode(_postStateRootBatchHeader.extraData, (uint256, address));\\n\\n // Slash the bonds at the bond manager.\\n ovmBondManager.finalize(\\n _preStateRoot,\\n publisher,\\n timestamp\\n );\\n }\\n}\\n\",\"keccak256\":\"0x879cef57019254ad958a75db64f0b58eb0a6fcf74f386ed958f75384b860dd35\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_CanonicalTransactionChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_ChainStorageContainer } from \\\"./iOVM_ChainStorageContainer.sol\\\";\\n\\n/**\\n * @title iOVM_CanonicalTransactionChain\\n */\\ninterface iOVM_CanonicalTransactionChain {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event TransactionEnqueued(\\n address _l1TxOrigin,\\n address _target,\\n uint256 _gasLimit,\\n bytes _data,\\n uint256 _queueIndex,\\n uint256 _timestamp\\n );\\n\\n event QueueBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event SequencerBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event TransactionBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct BatchContext {\\n uint256 numSequencedTransactions;\\n uint256 numSubsequentQueueTransactions;\\n uint256 timestamp;\\n uint256 blockNumber;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n\\n /**\\n * Accesses the batch storage container.\\n * @return Reference to the batch storage container.\\n */\\n function batches()\\n external\\n view\\n returns (\\n iOVM_ChainStorageContainer\\n );\\n\\n /**\\n * Accesses the queue storage container.\\n * @return Reference to the queue storage container.\\n */\\n function queue()\\n external\\n view\\n returns (\\n iOVM_ChainStorageContainer\\n );\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements()\\n external\\n view\\n returns (\\n uint256 _totalElements\\n );\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches()\\n external\\n view\\n returns (\\n uint256 _totalBatches\\n );\\n\\n /**\\n * Returns the index of the next element to be enqueued.\\n * @return Index for the next queue element.\\n */\\n function getNextQueueIndex()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Gets the queue element at a particular index.\\n * @param _index Index of the queue element to access.\\n * @return _element Queue element at the given index.\\n */\\n function getQueueElement(\\n uint256 _index\\n )\\n external\\n view\\n returns (\\n Lib_OVMCodec.QueueElement memory _element\\n );\\n\\n /**\\n * Returns the timestamp of the last transaction.\\n * @return Timestamp for the last transaction.\\n */\\n function getLastTimestamp()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Returns the blocknumber of the last transaction.\\n * @return Blocknumber for the last transaction.\\n */\\n function getLastBlockNumber()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Get the number of queue elements which have not yet been included.\\n * @return Number of pending queue elements.\\n */\\n function getNumPendingQueueElements()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Retrieves the length of the queue, including\\n * both pending and canonical transactions.\\n * @return Length of the queue.\\n */\\n function getQueueLength()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n\\n /**\\n * Adds a transaction to the queue.\\n * @param _target Target contract to send the transaction to.\\n * @param _gasLimit Gas limit for the given transaction.\\n * @param _data Transaction data.\\n */\\n function enqueue(\\n address _target,\\n uint256 _gasLimit,\\n bytes memory _data\\n )\\n external;\\n\\n /**\\n * Appends a given number of queued transactions as a single batch.\\n * @param _numQueuedTransactions Number of transactions to append.\\n */\\n function appendQueueBatch(\\n uint256 _numQueuedTransactions\\n )\\n external;\\n\\n /**\\n * Allows the sequencer to append a batch of transactions.\\n * @dev This function uses a custom encoding scheme for efficiency reasons.\\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\\n * .param _contexts Array of batch contexts.\\n * .param _transactionDataFields Array of raw transaction data.\\n */\\n function appendSequencerBatch(\\n // uint40 _shouldStartAtElement,\\n // uint24 _totalElementsToAppend,\\n // BatchContext[] _contexts,\\n // bytes[] _transactionDataFields\\n )\\n external;\\n\\n /**\\n * Verifies whether a transaction is included in the chain.\\n * @param _transaction Transaction to verify.\\n * @param _txChainElement Transaction chain element corresponding to the transaction.\\n * @param _batchHeader Header of the batch the transaction was included in.\\n * @param _inclusionProof Inclusion proof for the provided transaction chain element.\\n * @return True if the transaction exists in the CTC, false if not.\\n */\\n function verifyTransaction(\\n Lib_OVMCodec.Transaction memory _transaction,\\n Lib_OVMCodec.TransactionChainElement memory _txChainElement,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _inclusionProof\\n )\\n external\\n view\\n returns (\\n bool\\n );\\n}\\n\",\"keccak256\":\"0xb5e55488a1982841c07cdf5ff475da4789596f111dd48f01b1918ee4c775cf3a\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_ChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title iOVM_ChainStorageContainer\\n */\\ninterface iOVM_ChainStorageContainer {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata()\\n external\\n view\\n returns (\\n bytes27\\n );\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length()\\n external\\n view\\n returns (\\n uint256\\n );\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(\\n bytes32 _object\\n )\\n external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(\\n bytes32 _object,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(\\n uint256 _index\\n )\\n external\\n view\\n returns (\\n bytes32\\n );\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index\\n )\\n external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Marks an index as overwritable, meaing the underlying buffer can start to write values over\\n * any objects before and including the given index.\\n */\\n function setNextOverwritableIndex(\\n uint256 _index\\n )\\n external;\\n}\\n\",\"keccak256\":\"0x2d7973a0ad84c23ec62624d3f1e3aeb198cc72686ff1e6cfa17155556b320c94\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_StateCommitmentChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title iOVM_StateCommitmentChain\\n */\\ninterface iOVM_StateCommitmentChain {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event StateBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n event StateBatchDeleted(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot\\n );\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements()\\n external\\n view\\n returns (\\n uint256 _totalElements\\n );\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches()\\n external\\n view\\n returns (\\n uint256 _totalBatches\\n );\\n\\n /**\\n * Retrieves the timestamp of the last batch submitted by the sequencer.\\n * @return _lastSequencerTimestamp Last sequencer batch timestamp.\\n */\\n function getLastSequencerTimestamp()\\n external\\n view\\n returns (\\n uint256 _lastSequencerTimestamp\\n );\\n\\n /**\\n * Appends a batch of state roots to the chain.\\n * @param _batch Batch of state roots.\\n * @param _shouldStartAtElement Index of the element at which this batch should start.\\n */\\n function appendStateBatch(\\n bytes32[] calldata _batch,\\n uint256 _shouldStartAtElement\\n )\\n external;\\n\\n /**\\n * Deletes all state roots after (and including) a given batch.\\n * @param _batchHeader Header of the batch to start deleting from.\\n */\\n function deleteStateBatch(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n external;\\n\\n /**\\n * Verifies a batch inclusion proof.\\n * @param _element Hash of the element to verify a proof for.\\n * @param _batchHeader Header of the batch in which the element was included.\\n * @param _proof Merkle inclusion proof for the element.\\n */\\n function verifyStateCommitment(\\n bytes32 _element,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _proof\\n )\\n external\\n view\\n returns (\\n bool _verified\\n );\\n\\n /**\\n * Checks whether a given batch is still inside its fraud proof window.\\n * @param _batchHeader Header of the batch to check.\\n * @return _inside Whether or not the batch is inside the fraud proof window.\\n */\\n function insideFraudProofWindow(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n external\\n view\\n returns (\\n bool _inside\\n );\\n}\\n\",\"keccak256\":\"0x6646d6ff392b81aab52a7a277e91540819464751de0af5afd1962094b2e92448\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/verification/iOVM_BondManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\ninterface ERC20 {\\n function transfer(address, uint256) external returns (bool);\\n function transferFrom(address, address, uint256) external returns (bool);\\n}\\n\\n/// All the errors which may be encountered on the bond manager\\nlibrary Errors {\\n string constant ERC20_ERR = \\\"BondManager: Could not post bond\\\";\\n string constant ALREADY_FINALIZED = \\\"BondManager: Fraud proof for this pre-state root has already been finalized\\\";\\n string constant SLASHED = \\\"BondManager: Cannot finalize withdrawal, you probably got slashed\\\";\\n string constant WRONG_STATE = \\\"BondManager: Wrong bond state for proposer\\\";\\n string constant CANNOT_CLAIM = \\\"BondManager: Cannot claim yet. Dispute must be finalized first\\\";\\n\\n string constant WITHDRAWAL_PENDING = \\\"BondManager: Withdrawal already pending\\\";\\n string constant TOO_EARLY = \\\"BondManager: Too early to finalize your withdrawal\\\";\\n\\n string constant ONLY_TRANSITIONER = \\\"BondManager: Only the transitioner for this pre-state root may call this function\\\";\\n string constant ONLY_FRAUD_VERIFIER = \\\"BondManager: Only the fraud verifier may call this function\\\";\\n string constant ONLY_STATE_COMMITMENT_CHAIN = \\\"BondManager: Only the state commitment chain may call this function\\\";\\n string constant WAIT_FOR_DISPUTES = \\\"BondManager: Wait for other potential disputes\\\";\\n}\\n\\n/**\\n * @title iOVM_BondManager\\n */\\ninterface iOVM_BondManager {\\n\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n /// The lifecycle of a proposer's bond\\n enum State {\\n // Before depositing or after getting slashed, a user is uncollateralized\\n NOT_COLLATERALIZED,\\n // After depositing, a user is collateralized\\n COLLATERALIZED,\\n // After a user has initiated a withdrawal\\n WITHDRAWING\\n }\\n\\n /// A bond posted by a proposer\\n struct Bond {\\n // The user's state\\n State state;\\n // The timestamp at which a proposer issued their withdrawal request\\n uint32 withdrawalTimestamp;\\n // The time when the first disputed was initiated for this bond\\n uint256 firstDisputeAt;\\n // The earliest observed state root for this bond which has had fraud\\n bytes32 earliestDisputedStateRoot;\\n // The state root's timestamp\\n uint256 earliestTimestamp;\\n }\\n\\n // Per pre-state root, store the number of state provisions that were made\\n // and how many of these calls were made by each user. Payouts will then be\\n // claimed by users proportionally for that dispute.\\n struct Rewards {\\n // Flag to check if rewards for a fraud proof are claimable\\n bool canClaim;\\n // Total number of `recordGasSpent` calls made\\n uint256 total;\\n // The gas spent by each user to provide witness data. The sum of all\\n // values inside this map MUST be equal to the value of `total`\\n mapping(address => uint256) gasSpent;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function recordGasSpent(\\n bytes32 _preStateRoot,\\n bytes32 _txHash,\\n address _who,\\n uint256 _gasSpent\\n ) external;\\n\\n function finalize(\\n bytes32 _preStateRoot,\\n address _publisher,\\n uint256 _timestamp\\n ) external;\\n\\n function deposit() external;\\n\\n function startWithdrawal() external;\\n\\n function finalizeWithdrawal() external;\\n\\n function claim(\\n address _who\\n ) external;\\n\\n function isCollateralized(\\n address _who\\n ) external view returns (bool);\\n\\n function getGasSpent(\\n bytes32 _preStateRoot,\\n address _who\\n ) external view returns (uint256);\\n}\\n\",\"keccak256\":\"0x3c2a8a399487857158649db1896749d86e39cba545a8aeb2e2bb0f3bdfa7a5b1\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/verification/iOVM_FraudVerifier.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_StateTransitioner } from \\\"./iOVM_StateTransitioner.sol\\\";\\n\\n/**\\n * @title iOVM_FraudVerifier\\n */\\ninterface iOVM_FraudVerifier {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event FraudProofInitialized(\\n bytes32 _preStateRoot,\\n uint256 _preStateRootIndex,\\n bytes32 _transactionHash,\\n address _who\\n );\\n\\n event FraudProofFinalized(\\n bytes32 _preStateRoot,\\n uint256 _preStateRootIndex,\\n bytes32 _transactionHash,\\n address _who\\n );\\n\\n\\n /***************************************\\n * Public Functions: Transition Status *\\n ***************************************/\\n\\n function getStateTransitioner(bytes32 _preStateRoot, bytes32 _txHash) external view returns (iOVM_StateTransitioner _transitioner);\\n\\n\\n /****************************************\\n * Public Functions: Fraud Verification *\\n ****************************************/\\n\\n function initializeFraudVerification(\\n bytes32 _preStateRoot,\\n Lib_OVMCodec.ChainBatchHeader calldata _preStateRootBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof calldata _preStateRootProof,\\n Lib_OVMCodec.Transaction calldata _transaction,\\n Lib_OVMCodec.TransactionChainElement calldata _txChainElement,\\n Lib_OVMCodec.ChainBatchHeader calldata _transactionBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof calldata _transactionProof\\n ) external;\\n\\n function finalizeFraudVerification(\\n bytes32 _preStateRoot,\\n Lib_OVMCodec.ChainBatchHeader calldata _preStateRootBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof calldata _preStateRootProof,\\n bytes32 _txHash,\\n bytes32 _postStateRoot,\\n Lib_OVMCodec.ChainBatchHeader calldata _postStateRootBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof calldata _postStateRootProof\\n ) external;\\n}\\n\",\"keccak256\":\"0x5efd7bb18164bbd3e9d58379e8203fbf2a7ee802b1a48dff3ceaaec1523b1751\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/verification/iOVM_StateTransitioner.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title iOVM_StateTransitioner\\n */\\ninterface iOVM_StateTransitioner {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AccountCommitted(\\n address _address\\n );\\n\\n event ContractStorageCommitted(\\n address _address,\\n bytes32 _key\\n );\\n\\n\\n /**********************************\\n * Public Functions: State Access *\\n **********************************/\\n\\n function getPreStateRoot() external view returns (bytes32 _preStateRoot);\\n function getPostStateRoot() external view returns (bytes32 _postStateRoot);\\n function isComplete() external view returns (bool _complete);\\n\\n\\n /***********************************\\n * Public Functions: Pre-Execution *\\n ***********************************/\\n\\n function proveContractState(\\n address _ovmContractAddress,\\n address _ethContractAddress,\\n bytes calldata _stateTrieWitness\\n ) external;\\n\\n function proveStorageSlot(\\n address _ovmContractAddress,\\n bytes32 _key,\\n bytes calldata _storageTrieWitness\\n ) external;\\n\\n\\n /*******************************\\n * Public Functions: Execution *\\n *******************************/\\n\\n function applyTransaction(\\n Lib_OVMCodec.Transaction calldata _transaction\\n ) external;\\n\\n\\n /************************************\\n * Public Functions: Post-Execution *\\n ************************************/\\n\\n function commitContractState(\\n address _ovmContractAddress,\\n bytes calldata _stateTrieWitness\\n ) external;\\n\\n function commitStorageSlot(\\n address _ovmContractAddress,\\n bytes32 _key,\\n bytes calldata _storageTrieWitness\\n ) external;\\n\\n\\n /**********************************\\n * Public Functions: Finalization *\\n **********************************/\\n\\n function completeTransition() external;\\n}\\n\",\"keccak256\":\"0x3d044ac0a3bb6ad3d529f904b3191117511f9c379678ca03010e1ebdfcb5c34b\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/verification/iOVM_StateTransitionerFactory.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Contract Imports */\\nimport { iOVM_StateTransitioner } from \\\"./iOVM_StateTransitioner.sol\\\";\\n\\n/**\\n * @title iOVM_StateTransitionerFactory\\n */\\ninterface iOVM_StateTransitionerFactory {\\n\\n /***************************************\\n * Public Functions: Contract Creation *\\n ***************************************/\\n\\n function create(\\n address _proxyManager,\\n uint256 _stateTransitionIndex,\\n bytes32 _preStateRoot,\\n bytes32 _transactionHash\\n )\\n external\\n returns (\\n iOVM_StateTransitioner _ovmStateTransitioner\\n );\\n}\\n\",\"keccak256\":\"0x60a0f0c104e4c0c7863268a93005762e8146d393f9cfddfdd6a2d6585c5911fc\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/codec/Lib_OVMCodec.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../utils/Lib_Bytes32Utils.sol\\\";\\n\\n/**\\n * @title Lib_OVMCodec\\n */\\nlibrary Lib_OVMCodec {\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum QueueOrigin {\\n SEQUENCER_QUEUE,\\n L1TOL2_QUEUE\\n }\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Account {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n address ethAddress;\\n bool isFresh;\\n }\\n\\n struct EVMAccount {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n }\\n\\n struct ChainBatchHeader {\\n uint256 batchIndex;\\n bytes32 batchRoot;\\n uint256 batchSize;\\n uint256 prevTotalElements;\\n bytes extraData;\\n }\\n\\n struct ChainInclusionProof {\\n uint256 index;\\n bytes32[] siblings;\\n }\\n\\n struct Transaction {\\n uint256 timestamp;\\n uint256 blockNumber;\\n QueueOrigin l1QueueOrigin;\\n address l1TxOrigin;\\n address entrypoint;\\n uint256 gasLimit;\\n bytes data;\\n }\\n\\n struct TransactionChainElement {\\n bool isSequenced;\\n uint256 queueIndex; // QUEUED TX ONLY\\n uint256 timestamp; // SEQUENCER TX ONLY\\n uint256 blockNumber; // SEQUENCER TX ONLY\\n bytes txData; // SEQUENCER TX ONLY\\n }\\n\\n struct QueueElement {\\n bytes32 transactionHash;\\n uint40 timestamp;\\n uint40 blockNumber;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Encodes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Encoded transaction bytes.\\n */\\n function encodeTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return abi.encodePacked(\\n _transaction.timestamp,\\n _transaction.blockNumber,\\n _transaction.l1QueueOrigin,\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n );\\n }\\n\\n /**\\n * Hashes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Hashed transaction\\n */\\n function hashTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(encodeTransaction(_transaction));\\n }\\n\\n /**\\n * Converts an OVM account to an EVM account.\\n * @param _in OVM account to convert.\\n * @return Converted EVM account.\\n */\\n function toEVMAccount(\\n Account memory _in\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n return EVMAccount({\\n nonce: _in.nonce,\\n balance: _in.balance,\\n storageRoot: _in.storageRoot,\\n codeHash: _in.codeHash\\n });\\n }\\n\\n /**\\n * @notice RLP-encodes an account state struct.\\n * @param _account Account state struct.\\n * @return RLP-encoded account state.\\n */\\n function encodeEVMAccount(\\n EVMAccount memory _account\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes[] memory raw = new bytes[](4);\\n\\n // Unfortunately we can't create this array outright because\\n // Lib_RLPWriter.writeList will reject fixed-size arrays. Assigning\\n // index-by-index circumvents this issue.\\n raw[0] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.nonce)\\n )\\n );\\n raw[1] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.balance)\\n )\\n );\\n raw[2] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.storageRoot));\\n raw[3] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.codeHash));\\n\\n return Lib_RLPWriter.writeList(raw);\\n }\\n\\n /**\\n * @notice Decodes an RLP-encoded account state into a useful struct.\\n * @param _encoded RLP-encoded account state.\\n * @return Account state struct.\\n */\\n function decodeEVMAccount(\\n bytes memory _encoded\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\\n\\n return EVMAccount({\\n nonce: Lib_RLPReader.readUint256(accountState[0]),\\n balance: Lib_RLPReader.readUint256(accountState[1]),\\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\\n });\\n }\\n\\n /**\\n * Calculates a hash for a given batch header.\\n * @param _batchHeader Header to hash.\\n * @return Hash of the header.\\n */\\n function hashBatchHeader(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(\\n abi.encode(\\n _batchHeader.batchRoot,\\n _batchHeader.batchSize,\\n _batchHeader.prevTotalElements,\\n _batchHeader.extraData\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0xd85ba2066057a2677926f484b938c7c2ef33ff3853f3b71cda252f4a54f30e05\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n public\\n onlyOwner\\n {\\n addresses[_getNameHash(_name)] = _address;\\n\\n emit AddressSet(\\n _name,\\n _address\\n );\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0x2ce671a0e004df88b136bea5a3c59d0732cea8887c8496da1d509e0200b03d7d\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(\\n address _libAddressManager\\n ) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x65981feeabff6a81783ea97d44baf988a18a86c8cb374c46fdb71819cbacc7c0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPReader.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_RLPReader\\n * @dev Adapted from \\\"RLPReader\\\" by Hamdi Allam (hamdi.allam97@gmail.com).\\n */\\nlibrary Lib_RLPReader {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 constant internal MAX_LIST_LENGTH = 32;\\n\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum RLPItemType {\\n DATA_ITEM,\\n LIST_ITEM\\n }\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct RLPItem {\\n uint256 length;\\n uint256 ptr;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts bytes to a reference to memory position and length.\\n * @param _in Input bytes to convert.\\n * @return Output memory reference.\\n */\\n function toRLPItem(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem memory\\n )\\n {\\n uint256 ptr;\\n assembly {\\n ptr := add(_in, 32)\\n }\\n\\n return RLPItem({\\n length: _in.length,\\n ptr: ptr\\n });\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n (\\n uint256 listOffset,\\n ,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.LIST_ITEM,\\n \\\"Invalid RLP list value.\\\"\\n );\\n\\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\\n // writing to the length. Since we can't know the number of RLP items without looping over\\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\\n // simply set a reasonable maximum list length and decrease the size before we finish.\\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\\n\\n uint256 itemCount = 0;\\n uint256 offset = listOffset;\\n while (offset < _in.length) {\\n require(\\n itemCount < MAX_LIST_LENGTH,\\n \\\"Provided RLP list exceeds max list length.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n ) = _decodeLength(RLPItem({\\n length: _in.length - offset,\\n ptr: _in.ptr + offset\\n }));\\n\\n out[itemCount] = RLPItem({\\n length: itemLength + itemOffset,\\n ptr: _in.ptr + offset\\n });\\n\\n itemCount += 1;\\n offset += itemOffset + itemLength;\\n }\\n\\n // Decrease the array size to match the actual item count.\\n assembly {\\n mstore(out, itemCount)\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n return readList(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes value.\\\"\\n );\\n\\n return _copy(_in.ptr, itemOffset, itemLength);\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return readBytes(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return string(readBytes(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return readString(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n require(\\n _in.length <= 33,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr + itemOffset;\\n bytes32 out;\\n assembly {\\n out := mload(ptr)\\n\\n // Shift the bytes over to match the item size.\\n if lt(itemLength, 32) {\\n out := div(out, exp(256, sub(32, itemLength)))\\n }\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return readBytes32(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return uint256(readBytes32(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return readUint256(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n require(\\n _in.length == 1,\\n \\\"Invalid RLP boolean value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 out;\\n assembly {\\n out := byte(0, mload(ptr))\\n }\\n\\n require(\\n out == 0 || out == 1,\\n \\\"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\\\"\\n );\\n\\n return out != 0;\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return readBool(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n if (_in.length == 1) {\\n return address(0);\\n }\\n\\n require(\\n _in.length == 21,\\n \\\"Invalid RLP address value.\\\"\\n );\\n\\n return address(readUint256(_in));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return readAddress(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads the raw bytes of an RLP item.\\n * @param _in RLP item to read.\\n * @return Raw RLP bytes.\\n */\\n function readRawBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in);\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Decodes the length of an RLP item.\\n * @param _in RLP item to decode.\\n * @return Offset of the encoded data.\\n * @return Length of the encoded data.\\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\\n */\\n function _decodeLength(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n uint256,\\n uint256,\\n RLPItemType\\n )\\n {\\n require(\\n _in.length > 0,\\n \\\"RLP item cannot be null.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 prefix;\\n assembly {\\n prefix := byte(0, mload(ptr))\\n }\\n\\n if (prefix <= 0x7f) {\\n // Single byte.\\n\\n return (0, 1, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xb7) {\\n // Short string.\\n\\n uint256 strLen = prefix - 0x80;\\n\\n require(\\n _in.length > strLen,\\n \\\"Invalid RLP short string.\\\"\\n );\\n\\n return (1, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xbf) {\\n // Long string.\\n uint256 lenOfStrLen = prefix - 0xb7;\\n\\n require(\\n _in.length > lenOfStrLen,\\n \\\"Invalid RLP long string length.\\\"\\n );\\n\\n uint256 strLen;\\n assembly {\\n // Pick out the string length.\\n strLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfStrLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfStrLen + strLen,\\n \\\"Invalid RLP long string.\\\"\\n );\\n\\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xf7) {\\n // Short list.\\n uint256 listLen = prefix - 0xc0;\\n\\n require(\\n _in.length > listLen,\\n \\\"Invalid RLP short list.\\\"\\n );\\n\\n return (1, listLen, RLPItemType.LIST_ITEM);\\n } else {\\n // Long list.\\n uint256 lenOfListLen = prefix - 0xf7;\\n\\n require(\\n _in.length > lenOfListLen,\\n \\\"Invalid RLP long list length.\\\"\\n );\\n\\n uint256 listLen;\\n assembly {\\n // Pick out the list length.\\n listLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfListLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfListLen + listLen,\\n \\\"Invalid RLP long list.\\\"\\n );\\n\\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\\n }\\n }\\n\\n /**\\n * Copies the bytes from a memory location.\\n * @param _src Pointer to the location to read from.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Copied bytes.\\n */\\n function _copy(\\n uint256 _src,\\n uint256 _offset,\\n uint256 _length\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out = new bytes(_length);\\n if (out.length == 0) {\\n return out;\\n }\\n\\n uint256 src = _src + _offset;\\n uint256 dest;\\n assembly {\\n dest := add(out, 32)\\n }\\n\\n // Copy over as many complete words as we can.\\n for (uint256 i = 0; i < _length / 32; i++) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n\\n src += 32;\\n dest += 32;\\n }\\n\\n // Pick out the remaining bytes.\\n uint256 mask = 256 ** (32 - (_length % 32)) - 1;\\n assembly {\\n mstore(\\n dest,\\n or(\\n and(mload(src), not(mask)),\\n and(mload(dest), mask)\\n )\\n )\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Copies an RLP item into bytes.\\n * @param _in RLP item to copy.\\n * @return Copied bytes.\\n */\\n function _copy(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in.ptr, 0, _in.length);\\n }\\n}\\n\",\"keccak256\":\"0x829174c61216dce35fdb888383b6022e0365eb7fbdc71ad79d98b108091969fe\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPWriter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/**\\n * @title Lib_RLPWriter\\n * @author Bakaoh (with modifications)\\n */\\nlibrary Lib_RLPWriter {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * RLP encodes a byte string.\\n * @param _in The byte string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded;\\n\\n if (_in.length == 1 && uint8(_in[0]) < 128) {\\n encoded = _in;\\n } else {\\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * RLP encodes a list of RLP encoded byte byte strings.\\n * @param _in The list of RLP encoded byte strings.\\n * @return The RLP encoded list of items in bytes.\\n */\\n function writeList(\\n bytes[] memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory list = _flatten(_in);\\n return abi.encodePacked(_writeLength(list.length, 192), list);\\n }\\n\\n /**\\n * RLP encodes a string.\\n * @param _in The string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeString(\\n string memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(bytes(_in));\\n }\\n\\n /**\\n * RLP encodes an address.\\n * @param _in The address to encode.\\n * @return The RLP encoded address in bytes.\\n */\\n function writeAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a bytes32 value.\\n * @param _in The bytes32 to encode.\\n * @return _out The RLP encoded bytes32 in bytes.\\n */\\n function writeBytes32(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a uint.\\n * @param _in The uint256 to encode.\\n * @return The RLP encoded uint256 in bytes.\\n */\\n function writeUint(\\n uint256 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(_toBinary(_in));\\n }\\n\\n /**\\n * RLP encodes a bool.\\n * @param _in The bool to encode.\\n * @return The RLP encoded bool in bytes.\\n */\\n function writeBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded = new bytes(1);\\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\\n return encoded;\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\\n * @param _len The length of the string or the payload.\\n * @param _offset 128 if item is string, 192 if item is list.\\n * @return RLP encoded bytes.\\n */\\n function _writeLength(\\n uint256 _len,\\n uint256 _offset\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded;\\n\\n if (_len < 56) {\\n encoded = new bytes(1);\\n encoded[0] = byte(uint8(_len) + uint8(_offset));\\n } else {\\n uint256 lenLen;\\n uint256 i = 1;\\n while (_len / i != 0) {\\n lenLen++;\\n i *= 256;\\n }\\n\\n encoded = new bytes(lenLen + 1);\\n encoded[0] = byte(uint8(lenLen) + uint8(_offset) + 55);\\n for(i = 1; i <= lenLen; i++) {\\n encoded[i] = byte(uint8((_len / (256**(lenLen-i))) % 256));\\n }\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * Encode integer in big endian binary form with no leading zeroes.\\n * @notice TODO: This should be optimized with assembly to save gas costs.\\n * @param _x The integer to encode.\\n * @return RLP encoded bytes.\\n */\\n function _toBinary(\\n uint256 _x\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory b = abi.encodePacked(_x);\\n\\n uint256 i = 0;\\n for (; i < 32; i++) {\\n if (b[i] != 0) {\\n break;\\n }\\n }\\n\\n bytes memory res = new bytes(32 - i);\\n for (uint256 j = 0; j < res.length; j++) {\\n res[j] = b[i++];\\n }\\n\\n return res;\\n }\\n\\n /**\\n * Copies a piece of memory to another location.\\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\\n * @param _dest Destination location.\\n * @param _src Source location.\\n * @param _len Length of memory to copy.\\n */\\n function _memcpy(\\n uint256 _dest,\\n uint256 _src,\\n uint256 _len\\n )\\n private\\n pure\\n {\\n uint256 dest = _dest;\\n uint256 src = _src;\\n uint256 len = _len;\\n\\n for(; len >= 32; len -= 32) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n dest += 32;\\n src += 32;\\n }\\n\\n uint256 mask = 256 ** (32 - len) - 1;\\n assembly {\\n let srcpart := and(mload(src), not(mask))\\n let destpart := and(mload(dest), mask)\\n mstore(dest, or(destpart, srcpart))\\n }\\n }\\n\\n /**\\n * Flattens a list of byte strings into one byte string.\\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\\n * @param _list List of byte strings to flatten.\\n * @return The flattened byte string.\\n */\\n function _flatten(\\n bytes[] memory _list\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n if (_list.length == 0) {\\n return new bytes(0);\\n }\\n\\n uint256 len;\\n uint256 i = 0;\\n for (; i < _list.length; i++) {\\n len += _list[i].length;\\n }\\n\\n bytes memory flattened = new bytes(len);\\n uint256 flattenedPtr;\\n assembly { flattenedPtr := add(flattened, 0x20) }\\n\\n for(i = 0; i < _list.length; i++) {\\n bytes memory item = _list[i];\\n\\n uint256 listPtr;\\n assembly { listPtr := add(item, 0x20)}\\n\\n _memcpy(flattenedPtr, listPtr, item.length);\\n flattenedPtr += _list[i].length;\\n }\\n\\n return flattened;\\n }\\n}\\n\",\"keccak256\":\"0xb60ee4b03ad372c3deff21d454ab714dd0c18ee3e6f9d45532e209fc59d5a54d\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_Bytes32Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_Byte32Utils\\n */\\nlibrary Lib_Bytes32Utils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \\\"true.\\\"\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as a boolean.\\n */\\n function toBool(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return _in != 0;\\n }\\n\\n /**\\n * Converts a boolean to a bytes32 value.\\n * @param _in Input boolean value.\\n * @return Boolean as a bytes32.\\n */\\n function fromBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in ? 1 : 0));\\n }\\n\\n /**\\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as an address.\\n */\\n function toAddress(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return address(uint160(uint256(_in)));\\n }\\n\\n /**\\n * Converts an address to a bytes32.\\n * @param _in Input address value.\\n * @return Address as a bytes32.\\n */\\n function fromAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in));\\n }\\n\\n /**\\n * Removes the leading zeros from a bytes32 value and returns a new (smaller) bytes value.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 without any leading zeros.\\n */\\n function removeLeadingZeros(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out;\\n\\n assembly {\\n // Figure out how many leading zero bytes to remove.\\n let shift := 0\\n for { let i := 0 } and(lt(i, 32), eq(byte(i, _in), 0)) { i := add(i, 1) } {\\n shift := add(shift, 1)\\n }\\n\\n // Reserve some space for our output and fix the free memory pointer.\\n out := mload(0x40)\\n mstore(0x40, add(out, 0x40))\\n\\n // Shift the value and store it into the output bytes.\\n mstore(add(out, 0x20), shl(mul(shift, 8), _in))\\n\\n // Store the new size (with leading zero bytes removed) in the output byte size.\\n mstore(out, sub(32, shift))\\n }\\n\\n return out;\\n }\\n}\\n\",\"keccak256\":\"0xfa2def593e3fc56a31852c3744aefdaa93cec74e721bfcfeb1e5d166c7c60b64\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_BytesUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_BytesUtils\\n */\\nlibrary Lib_BytesUtils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_start + _length >= _start, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n if (_bytes.length - _start == 0) {\\n return bytes('');\\n }\\n\\n return slice(_bytes, _start, _bytes.length - _start);\\n }\\n\\n function toBytes32PadLeft(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n bytes32 ret;\\n uint256 len = _bytes.length <= 32 ? _bytes.length : 32;\\n assembly {\\n ret := shr(mul(sub(32, len), 8), mload(add(_bytes, 32)))\\n }\\n return ret;\\n }\\n\\n function toBytes32(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n if (_bytes.length < 32) {\\n bytes32 ret;\\n assembly {\\n ret := mload(add(_bytes, 32))\\n }\\n return ret;\\n }\\n\\n return abi.decode(_bytes,(bytes32)); // will truncate if input length > 32 bytes\\n }\\n\\n function toUint256(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return uint256(toBytes32(_bytes));\\n }\\n\\n function toUint24(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n uint24\\n )\\n {\\n require(_start + 3 >= _start, \\\"toUint24_overflow\\\");\\n require(_bytes.length >= _start + 3 , \\\"toUint24_outOfBounds\\\");\\n uint24 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x3), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toUint8(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n uint8\\n )\\n {\\n require(_start + 1 >= _start, \\\"toUint8_overflow\\\");\\n require(_bytes.length >= _start + 1 , \\\"toUint8_outOfBounds\\\");\\n uint8 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x1), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toAddress(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n require(_start + 20 >= _start, \\\"toAddress_overflow\\\");\\n require(_bytes.length >= _start + 20, \\\"toAddress_outOfBounds\\\");\\n address tempAddress;\\n\\n assembly {\\n tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000)\\n }\\n\\n return tempAddress;\\n }\\n\\n function toNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory nibbles = new bytes(_bytes.length * 2);\\n\\n for (uint256 i = 0; i < _bytes.length; i++) {\\n nibbles[i * 2] = _bytes[i] >> 4;\\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\\n }\\n\\n return nibbles;\\n }\\n\\n function fromNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory ret = new bytes(_bytes.length / 2);\\n\\n for (uint256 i = 0; i < ret.length; i++) {\\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\\n }\\n\\n return ret;\\n }\\n\\n function equal(\\n bytes memory _bytes,\\n bytes memory _other\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return keccak256(_bytes) == keccak256(_other);\\n }\\n}\\n\",\"keccak256\":\"0xa5195afe32fb2cf104d156e8f4bd39df1ec79bf6ba232097b9e8e0ee14fbc298\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x608060405234801561001057600080fd5b5060405161184138038061184183398101604081905261002f91610054565b600080546001600160a01b0319166001600160a01b0392909216919091179055610082565b600060208284031215610065578081fd5b81516001600160a01b038116811461007b578182fd5b9392505050565b6117b0806100916000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c8063299ca4781461005c578063461a44781461007a57806398d8867d1461008d578063a286ba1c146100a2578063b48ec820146100b5575b600080fd5b6100646100c8565b6040516100719190611306565b60405180910390f35b610064610088366004611101565b6100d7565b6100a061009b366004611029565b6101b5565b005b6100a06100b0366004610f64565b6104f4565b6100646100c3366004610f43565b6108bb565b6000546001600160a01b031681565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b8381101561013757818101518382015260200161011f565b50505050905090810190601f1680156101645780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561018157600080fd5b505afa158015610195573d6000803e3d6000fd5b505050506040513d60208110156101ab57600080fd5b505190505b919050565b866101bf8561090a565b60005a905060006101cf8861090a565b90506101db8b82610923565b156101e65750610432565b60006102216040518060400160405280601881526020017727ab26afa9ba30ba32a1b7b6b6b4ba36b2b73a21b430b4b760411b8152506100d7565b905060006102636040518060400160405280601d81526020017f4f564d5f43616e6f6e6963616c5472616e73616374696f6e436861696e0000008152506100d7565b9050816001600160a01b0316634d69ee578e8e8e6040518463ffffffff1660e01b81526004016102959392919061135f565b60206040518083038186803b1580156102ad57600080fd5b505afa1580156102c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102e59190610f0f565b61030a5760405162461bcd60e51b8152600401610301906115e7565b60405180910390fd5b6040516326f2b4e760e11b81526001600160a01b03821690634de569ce9061033c908d908d908d908d90600401611641565b60206040518083038186803b15801561035457600080fd5b505afa158015610368573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061038c9190610f0f565b6103a85760405162461bcd60e51b815260040161030190611499565b86600001518860600151018b600001518d6060015101600101146103de5760405162461bcd60e51b815260040161030190611525565b6103ed8d848d60000151610942565b7f41a48bde2468fac6f670f39b66d7b91f311053e1f28eab9d75056546e6eaac958d8c6000015185336040516104269493929190611394565b60405180910390a15050505b60005a820390506104696040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506100d7565b6001600160a01b0316631e16e92f858533856040518563ffffffff1660e01b815260040180858152602001848152602001836001600160a01b03168152602001828152602001945050505050600060405180830381600087803b1580156104cf57600080fd5b505af11580156104e3573d6000803e3d6000fd5b505050505050505050505050505050565b868460005a905060006105078b896108bb565b905060006105446040518060400160405280601881526020017727ab26afa9ba30ba32a1b7b6b6b4ba36b2b73a21b430b4b760411b8152506100d7565b9050816001600160a01b031663b2fa1c9e6040518163ffffffff1660e01b815260040160206040518083038186803b15801561057f57600080fd5b505afa158015610593573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b79190610f0f565b15156001146105d85760405162461bcd60e51b8152600401610301906113b8565b89600001518b606001510160010186600001518860600151011461060e5760405162461bcd60e51b81526004016103019061141f565b604051634d69ee5760e01b81526001600160a01b03821690634d69ee579061063e908f908f908f9060040161135f565b60206040518083038186803b15801561065657600080fd5b505afa15801561066a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061068e9190610f0f565b6106aa5760405162461bcd60e51b8152600401610301906115e7565b604051634d69ee5760e01b81526001600160a01b03821690634d69ee57906106da908b908b908b9060040161135f565b60206040518083038186803b1580156106f257600080fd5b505afa158015610706573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061072a9190610f0f565b6107465760405162461bcd60e51b8152600401610301906114dd565b816001600160a01b031663c1c618b86040518163ffffffff1660e01b815260040160206040518083038186803b15801561077f57600080fd5b505afa158015610793573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107b79190610f2b565b8814156107d65760405162461bcd60e51b815260040161030190611597565b6107e0878d610a6d565b6000600160008e8c6040516020016107f9929190611289565b60405160208183030381529060405280519060200120815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b031602179055507f1e5fff3c23daf51ea67aaa3bbc738bcedaa98be5a5503f0e63a336a004b075b18c8b600001518b3360405161087a9493929190611394565b60405180910390a1505060005a820390506104696040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506100d7565b60006001600084846040516020016108d4929190611289565b60408051808303601f19018152918152815160209283012083529082019290925201600020546001600160a01b03169392505050565b600061091582610bc7565b805190602001209050919050565b60008061093084846108bb565b6001600160a01b031614159392505050565b6109806040518060400160405280601c81526020017f4f564d5f53746174655472616e736974696f6e6572466163746f7279000000008152506100d7565b600054604051631168a38160e11b81526001600160a01b03928316926322d14702926109b79291169085908890889060040161131a565b602060405180830381600087803b1580156109d157600080fd5b505af11580156109e5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a0991906110e5565b600160008585604051602001610a20929190611289565b60405160208183030381529060405280519060200120815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b03160217905550505050565b6000610aa86040518060400160405280601881526020017727ab26afa9ba30ba32a1b7b6b6b4ba36b2b73a21b430b4b760411b8152506100d7565b90506000610adc6040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506100d7565b604051632e38626b60e21b81529091506001600160a01b0383169063b8e189ac90610b0b90879060040161162e565b600060405180830381600087803b158015610b2557600080fd5b505af1158015610b39573d6000803e3d6000fd5b505050506000808560800151806020019051810190610b58919061114f565b60405163abfbbe1360e01b815291935091506001600160a01b0384169063abfbbe1390610b8d90889085908790600401611340565b600060405180830381600087803b158015610ba757600080fd5b505af1158015610bbb573d6000803e3d6000fd5b50505050505050505050565b6060816000015182602001518360400151846060015185608001518660a001518760c00151604051602001610c029796959493929190611297565b6040516020818303038152906040529050919050565b600067ffffffffffffffff831115610c2c57fe5b610c3f601f8401601f1916602001611700565b9050828152838383011115610c5357600080fd5b828260208301376000602084830101529392505050565b80356101b081611754565b600082601f830112610c85578081fd5b610c9483833560208501610c18565b9392505050565b8035600281106101b057600080fd5b600060a08284031215610cbb578081fd5b60405160a0810167ffffffffffffffff8282108183111715610cd957fe5b81604052829350843583526020850135602084015260408501356040840152606085013560608401526080850135915080821115610d1657600080fd5b50610d2385828601610c75565b6080830152505092915050565b600060408284031215610d41578081fd5b6040516040810167ffffffffffffffff8282108183111715610d5f57fe5b8160405282935084358352602091508185013581811115610d7f57600080fd5b8501601f81018713610d9057600080fd5b803582811115610d9c57fe5b8381029250610dac848401611700565b8181528481019083860185850187018b1015610dc757600080fd5b600095505b83861015610dea578035835260019590950194918601918601610dcc565b5080868801525050505050505092915050565b600060a08284031215610e0e578081fd5b60405160a0810167ffffffffffffffff8282108183111715610e2c57fe5b8160405282935084359150610e408261176c565b8183526020850135602084015260408501356040840152606085013560608401526080850135915080821115610d1657600080fd5b600060e08284031215610e86578081fd5b610e9060e0611700565b90508135815260208201356020820152610eac60408301610c9b565b6040820152610ebd60608301610c6a565b6060820152610ece60808301610c6a565b608082015260a082013560a082015260c082013567ffffffffffffffff811115610ef757600080fd5b610f0384828501610c75565b60c08301525092915050565b600060208284031215610f20578081fd5b8151610c948161176c565b600060208284031215610f3c578081fd5b5051919050565b60008060408385031215610f55578081fd5b50508035926020909101359150565b600080600080600080600060e0888a031215610f7e578283fd5b87359650602088013567ffffffffffffffff80821115610f9c578485fd5b610fa88b838c01610caa565b975060408a0135915080821115610fbd578485fd5b610fc98b838c01610d30565b965060608a0135955060808a0135945060a08a0135915080821115610fec578384fd5b610ff88b838c01610caa565b935060c08a013591508082111561100d578283fd5b5061101a8a828b01610d30565b91505092959891949750929550565b600080600080600080600060e0888a031215611043578081fd5b87359650602088013567ffffffffffffffff80821115611061578283fd5b61106d8b838c01610caa565b975060408a0135915080821115611082578283fd5b61108e8b838c01610d30565b965060608a01359150808211156110a3578283fd5b6110af8b838c01610e75565b955060808a01359150808211156110c4578283fd5b6110d08b838c01610dfd565b945060a08a0135915080821115610fec578283fd5b6000602082840312156110f6578081fd5b8151610c9481611754565b600060208284031215611112578081fd5b813567ffffffffffffffff811115611128578182fd5b8201601f81018413611138578182fd5b61114784823560208401610c18565b949350505050565b60008060408385031215611161578182fd5b82519150602083015161117381611754565b809150509250929050565b6001600160a01b03169052565b600081518084526111a3816020860160208601611724565b601f01601f19169290920160200192915050565b600081518352602082015160208401526040820151604084015260608201516060840152608082015160a0608085015261114760a085018261118b565b6000604083018251845260208084015160408287015282815180855260608801915083830194508592505b8083101561123f578451825293830193600192909201919083019061121f565b509695505050505050565b6000815115158352602082015160208401526040820151604084015260608201516060840152608082015160a0608085015261114760a085018261118b565b918252602082015260400190565b6000888252876020830152600287106112ac57fe5b8660f81b60408301526bffffffffffffffffffffffff19808760601b166041840152808660601b1660558401525083606983015282516112f3816089850160208701611724565b9190910160890198975050505050505050565b6001600160a01b0391909116815260200190565b6001600160a01b0394909416845260208401929092526040830152606082015260800190565b9283526001600160a01b03919091166020830152604082015260600190565b60008482526060602083015261137860608301856111b7565b828103604084015261138a81856111f4565b9695505050505050565b938452602084019290925260408301526001600160a01b0316606082015260800190565b60208082526041908201527f5374617465207472616e736974696f6e2070726f63657373206d75737420626560408201527f20636f6d706c65746564207072696f7220746f2066696e616c697a6174696f6e6060820152601760f91b608082015260a00190565b60208082526054908201527f506f73742d737461746520726f6f7420676c6f62616c20696e646578206d757360408201527f7420657175616c20746f207468652070726520737461746520726f6f7420676c60608201527337b130b61034b73232bc1038363ab99037b7329760611b608082015260a00190565b60208082526024908201527f496e76616c6964207472616e73616374696f6e20696e636c7573696f6e20707260408201526337b7b31760e11b606082015260800190565b60208082526028908201527f496e76616c696420706f73742d737461746520726f6f7420696e636c7573696f6040820152673710383937b7b31760c11b606082015260800190565b6020808252604c908201527f5072652d737461746520726f6f7420676c6f62616c20696e646578206d75737460408201527f20657175616c20746f20746865207472616e73616374696f6e20726f6f74206760608201526b3637b130b61034b73232bc1760a11b608082015260a00190565b60208082526030908201527f5374617465207472616e736974696f6e20686173206e6f74206265656e20707260408201526f37bb32b710333930bab23ab632b73a1760811b606082015260800190565b60208082526027908201527f496e76616c6964207072652d737461746520726f6f7420696e636c7573696f6e60408201526610383937b7b31760c91b606082015260800190565b600060208252610c9460208301846111b7565b60006080825285516080830152602086015160a083015260408601516002811061166757fe5b60c083015260608601516001600160a01b031660e0830152608086015161169261010084018261117e565b5060a086015161012083015260c086015160e06101408401526116b961016084018261118b565b905082810360208401526116cd818761124a565b905082810360408401526116e181866111b7565b905082810360608401526116f581856111f4565b979650505050505050565b60405181810167ffffffffffffffff8111828210171561171c57fe5b604052919050565b60005b8381101561173f578181015183820152602001611727565b8381111561174e576000848401525b50505050565b6001600160a01b038116811461176957600080fd5b50565b801515811461176957600080fdfea26469706673582212205dbab94b86b7fa55149dd4efe74e8533d11e06735abd7d989856c9aa60c89c1064736f6c63430007060033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100575760003560e01c8063299ca4781461005c578063461a44781461007a57806398d8867d1461008d578063a286ba1c146100a2578063b48ec820146100b5575b600080fd5b6100646100c8565b6040516100719190611306565b60405180910390f35b610064610088366004611101565b6100d7565b6100a061009b366004611029565b6101b5565b005b6100a06100b0366004610f64565b6104f4565b6100646100c3366004610f43565b6108bb565b6000546001600160a01b031681565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b8381101561013757818101518382015260200161011f565b50505050905090810190601f1680156101645780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561018157600080fd5b505afa158015610195573d6000803e3d6000fd5b505050506040513d60208110156101ab57600080fd5b505190505b919050565b866101bf8561090a565b60005a905060006101cf8861090a565b90506101db8b82610923565b156101e65750610432565b60006102216040518060400160405280601881526020017727ab26afa9ba30ba32a1b7b6b6b4ba36b2b73a21b430b4b760411b8152506100d7565b905060006102636040518060400160405280601d81526020017f4f564d5f43616e6f6e6963616c5472616e73616374696f6e436861696e0000008152506100d7565b9050816001600160a01b0316634d69ee578e8e8e6040518463ffffffff1660e01b81526004016102959392919061135f565b60206040518083038186803b1580156102ad57600080fd5b505afa1580156102c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102e59190610f0f565b61030a5760405162461bcd60e51b8152600401610301906115e7565b60405180910390fd5b6040516326f2b4e760e11b81526001600160a01b03821690634de569ce9061033c908d908d908d908d90600401611641565b60206040518083038186803b15801561035457600080fd5b505afa158015610368573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061038c9190610f0f565b6103a85760405162461bcd60e51b815260040161030190611499565b86600001518860600151018b600001518d6060015101600101146103de5760405162461bcd60e51b815260040161030190611525565b6103ed8d848d60000151610942565b7f41a48bde2468fac6f670f39b66d7b91f311053e1f28eab9d75056546e6eaac958d8c6000015185336040516104269493929190611394565b60405180910390a15050505b60005a820390506104696040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506100d7565b6001600160a01b0316631e16e92f858533856040518563ffffffff1660e01b815260040180858152602001848152602001836001600160a01b03168152602001828152602001945050505050600060405180830381600087803b1580156104cf57600080fd5b505af11580156104e3573d6000803e3d6000fd5b505050505050505050505050505050565b868460005a905060006105078b896108bb565b905060006105446040518060400160405280601881526020017727ab26afa9ba30ba32a1b7b6b6b4ba36b2b73a21b430b4b760411b8152506100d7565b9050816001600160a01b031663b2fa1c9e6040518163ffffffff1660e01b815260040160206040518083038186803b15801561057f57600080fd5b505afa158015610593573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b79190610f0f565b15156001146105d85760405162461bcd60e51b8152600401610301906113b8565b89600001518b606001510160010186600001518860600151011461060e5760405162461bcd60e51b81526004016103019061141f565b604051634d69ee5760e01b81526001600160a01b03821690634d69ee579061063e908f908f908f9060040161135f565b60206040518083038186803b15801561065657600080fd5b505afa15801561066a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061068e9190610f0f565b6106aa5760405162461bcd60e51b8152600401610301906115e7565b604051634d69ee5760e01b81526001600160a01b03821690634d69ee57906106da908b908b908b9060040161135f565b60206040518083038186803b1580156106f257600080fd5b505afa158015610706573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061072a9190610f0f565b6107465760405162461bcd60e51b8152600401610301906114dd565b816001600160a01b031663c1c618b86040518163ffffffff1660e01b815260040160206040518083038186803b15801561077f57600080fd5b505afa158015610793573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107b79190610f2b565b8814156107d65760405162461bcd60e51b815260040161030190611597565b6107e0878d610a6d565b6000600160008e8c6040516020016107f9929190611289565b60405160208183030381529060405280519060200120815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b031602179055507f1e5fff3c23daf51ea67aaa3bbc738bcedaa98be5a5503f0e63a336a004b075b18c8b600001518b3360405161087a9493929190611394565b60405180910390a1505060005a820390506104696040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506100d7565b60006001600084846040516020016108d4929190611289565b60408051808303601f19018152918152815160209283012083529082019290925201600020546001600160a01b03169392505050565b600061091582610bc7565b805190602001209050919050565b60008061093084846108bb565b6001600160a01b031614159392505050565b6109806040518060400160405280601c81526020017f4f564d5f53746174655472616e736974696f6e6572466163746f7279000000008152506100d7565b600054604051631168a38160e11b81526001600160a01b03928316926322d14702926109b79291169085908890889060040161131a565b602060405180830381600087803b1580156109d157600080fd5b505af11580156109e5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a0991906110e5565b600160008585604051602001610a20929190611289565b60405160208183030381529060405280519060200120815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b03160217905550505050565b6000610aa86040518060400160405280601881526020017727ab26afa9ba30ba32a1b7b6b6b4ba36b2b73a21b430b4b760411b8152506100d7565b90506000610adc6040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506100d7565b604051632e38626b60e21b81529091506001600160a01b0383169063b8e189ac90610b0b90879060040161162e565b600060405180830381600087803b158015610b2557600080fd5b505af1158015610b39573d6000803e3d6000fd5b505050506000808560800151806020019051810190610b58919061114f565b60405163abfbbe1360e01b815291935091506001600160a01b0384169063abfbbe1390610b8d90889085908790600401611340565b600060405180830381600087803b158015610ba757600080fd5b505af1158015610bbb573d6000803e3d6000fd5b50505050505050505050565b6060816000015182602001518360400151846060015185608001518660a001518760c00151604051602001610c029796959493929190611297565b6040516020818303038152906040529050919050565b600067ffffffffffffffff831115610c2c57fe5b610c3f601f8401601f1916602001611700565b9050828152838383011115610c5357600080fd5b828260208301376000602084830101529392505050565b80356101b081611754565b600082601f830112610c85578081fd5b610c9483833560208501610c18565b9392505050565b8035600281106101b057600080fd5b600060a08284031215610cbb578081fd5b60405160a0810167ffffffffffffffff8282108183111715610cd957fe5b81604052829350843583526020850135602084015260408501356040840152606085013560608401526080850135915080821115610d1657600080fd5b50610d2385828601610c75565b6080830152505092915050565b600060408284031215610d41578081fd5b6040516040810167ffffffffffffffff8282108183111715610d5f57fe5b8160405282935084358352602091508185013581811115610d7f57600080fd5b8501601f81018713610d9057600080fd5b803582811115610d9c57fe5b8381029250610dac848401611700565b8181528481019083860185850187018b1015610dc757600080fd5b600095505b83861015610dea578035835260019590950194918601918601610dcc565b5080868801525050505050505092915050565b600060a08284031215610e0e578081fd5b60405160a0810167ffffffffffffffff8282108183111715610e2c57fe5b8160405282935084359150610e408261176c565b8183526020850135602084015260408501356040840152606085013560608401526080850135915080821115610d1657600080fd5b600060e08284031215610e86578081fd5b610e9060e0611700565b90508135815260208201356020820152610eac60408301610c9b565b6040820152610ebd60608301610c6a565b6060820152610ece60808301610c6a565b608082015260a082013560a082015260c082013567ffffffffffffffff811115610ef757600080fd5b610f0384828501610c75565b60c08301525092915050565b600060208284031215610f20578081fd5b8151610c948161176c565b600060208284031215610f3c578081fd5b5051919050565b60008060408385031215610f55578081fd5b50508035926020909101359150565b600080600080600080600060e0888a031215610f7e578283fd5b87359650602088013567ffffffffffffffff80821115610f9c578485fd5b610fa88b838c01610caa565b975060408a0135915080821115610fbd578485fd5b610fc98b838c01610d30565b965060608a0135955060808a0135945060a08a0135915080821115610fec578384fd5b610ff88b838c01610caa565b935060c08a013591508082111561100d578283fd5b5061101a8a828b01610d30565b91505092959891949750929550565b600080600080600080600060e0888a031215611043578081fd5b87359650602088013567ffffffffffffffff80821115611061578283fd5b61106d8b838c01610caa565b975060408a0135915080821115611082578283fd5b61108e8b838c01610d30565b965060608a01359150808211156110a3578283fd5b6110af8b838c01610e75565b955060808a01359150808211156110c4578283fd5b6110d08b838c01610dfd565b945060a08a0135915080821115610fec578283fd5b6000602082840312156110f6578081fd5b8151610c9481611754565b600060208284031215611112578081fd5b813567ffffffffffffffff811115611128578182fd5b8201601f81018413611138578182fd5b61114784823560208401610c18565b949350505050565b60008060408385031215611161578182fd5b82519150602083015161117381611754565b809150509250929050565b6001600160a01b03169052565b600081518084526111a3816020860160208601611724565b601f01601f19169290920160200192915050565b600081518352602082015160208401526040820151604084015260608201516060840152608082015160a0608085015261114760a085018261118b565b6000604083018251845260208084015160408287015282815180855260608801915083830194508592505b8083101561123f578451825293830193600192909201919083019061121f565b509695505050505050565b6000815115158352602082015160208401526040820151604084015260608201516060840152608082015160a0608085015261114760a085018261118b565b918252602082015260400190565b6000888252876020830152600287106112ac57fe5b8660f81b60408301526bffffffffffffffffffffffff19808760601b166041840152808660601b1660558401525083606983015282516112f3816089850160208701611724565b9190910160890198975050505050505050565b6001600160a01b0391909116815260200190565b6001600160a01b0394909416845260208401929092526040830152606082015260800190565b9283526001600160a01b03919091166020830152604082015260600190565b60008482526060602083015261137860608301856111b7565b828103604084015261138a81856111f4565b9695505050505050565b938452602084019290925260408301526001600160a01b0316606082015260800190565b60208082526041908201527f5374617465207472616e736974696f6e2070726f63657373206d75737420626560408201527f20636f6d706c65746564207072696f7220746f2066696e616c697a6174696f6e6060820152601760f91b608082015260a00190565b60208082526054908201527f506f73742d737461746520726f6f7420676c6f62616c20696e646578206d757360408201527f7420657175616c20746f207468652070726520737461746520726f6f7420676c60608201527337b130b61034b73232bc1038363ab99037b7329760611b608082015260a00190565b60208082526024908201527f496e76616c6964207472616e73616374696f6e20696e636c7573696f6e20707260408201526337b7b31760e11b606082015260800190565b60208082526028908201527f496e76616c696420706f73742d737461746520726f6f7420696e636c7573696f6040820152673710383937b7b31760c11b606082015260800190565b6020808252604c908201527f5072652d737461746520726f6f7420676c6f62616c20696e646578206d75737460408201527f20657175616c20746f20746865207472616e73616374696f6e20726f6f74206760608201526b3637b130b61034b73232bc1760a11b608082015260a00190565b60208082526030908201527f5374617465207472616e736974696f6e20686173206e6f74206265656e20707260408201526f37bb32b710333930bab23ab632b73a1760811b606082015260800190565b60208082526027908201527f496e76616c6964207072652d737461746520726f6f7420696e636c7573696f6e60408201526610383937b7b31760c91b606082015260800190565b600060208252610c9460208301846111b7565b60006080825285516080830152602086015160a083015260408601516002811061166757fe5b60c083015260608601516001600160a01b031660e0830152608086015161169261010084018261117e565b5060a086015161012083015260c086015160e06101408401526116b961016084018261118b565b905082810360208401526116cd818761124a565b905082810360408401526116e181866111b7565b905082810360608401526116f581856111f4565b979650505050505050565b60405181810167ffffffffffffffff8111828210171561171c57fe5b604052919050565b60005b8381101561173f578181015183820152602001611727565b8381111561174e576000848401525b50505050565b6001600160a01b038116811461176957600080fd5b50565b801515811461176957600080fdfea26469706673582212205dbab94b86b7fa55149dd4efe74e8533d11e06735abd7d989856c9aa60c89c1064736f6c63430007060033", - "devdoc": { - "details": "The Fraud Verifier contract coordinates the entire fraud proof verification process. If the fraud proof was successful it prunes any state batches from State Commitment Chain which were published after the fraudulent state root. Compiler used: solc Runtime target: EVM", - "kind": "dev", - "methods": { - "constructor": { - "params": { - "_libAddressManager": "Address of the Address Manager." - } - }, - "finalizeFraudVerification(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes32,bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))": { - "params": { - "_postStateRoot": "State root after the fraudulent transaction.", - "_postStateRootBatchHeader": "Batch header for the provided post-state root.", - "_postStateRootProof": "Inclusion proof for the provided post-state root.", - "_preStateRoot": "State root before the fraudulent transaction.", - "_preStateRootBatchHeader": "Batch header for the provided pre-state root.", - "_preStateRootProof": "Inclusion proof for the provided pre-state root.", - "_txHash": "The transaction for the state root" - } - }, - "getStateTransitioner(bytes32,bytes32)": { - "params": { - "_preStateRoot": "State root to query a transitioner for." - }, - "returns": { - "_transitioner": "Corresponding state transitioner contract." - } - }, - "initializeFraudVerification(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),(uint256,uint256,uint8,address,address,uint256,bytes),(bool,uint256,uint256,uint256,bytes),(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))": { - "params": { - "_preStateRoot": "State root before the fraudulent transaction.", - "_preStateRootBatchHeader": "Batch header for the provided pre-state root.", - "_preStateRootProof": "Inclusion proof for the provided pre-state root.", - "_transaction": "OVM transaction claimed to be fraudulent.", - "_transactionBatchHeader": "Batch header for the provided transaction.", - "_transactionProof": "Inclusion proof for the provided transaction.", - "_txChainElement": "OVM transaction chain element." - } - }, - "resolve(string)": { - "params": { - "_name": "Name to resolve an address for." - }, - "returns": { - "_0": "Address associated with the given name." - } - } - }, - "title": "OVM_FraudVerifier", - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": { - "finalizeFraudVerification(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes32,bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))": { - "notice": "Finalizes the fraud verification process." - }, - "getStateTransitioner(bytes32,bytes32)": { - "notice": "Retrieves the state transitioner for a given root." - }, - "initializeFraudVerification(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),(uint256,uint256,uint8,address,address,uint256,bytes),(bool,uint256,uint256,uint256,bytes),(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))": { - "notice": "Begins the fraud verification process." - }, - "resolve(string)": { - "notice": "Resolves the address associated with a given name." - } - }, - "version": 1 - }, - "storageLayout": { - "storage": [ - { - "astId": 12800, - "contract": "contracts/optimistic-ethereum/OVM/verification/OVM_FraudVerifier.sol:OVM_FraudVerifier", - "label": "libAddressManager", - "offset": 0, - "slot": "0", - "type": "t_contract(Lib_AddressManager)12793" - }, - { - "astId": 9391, - "contract": "contracts/optimistic-ethereum/OVM/verification/OVM_FraudVerifier.sol:OVM_FraudVerifier", - "label": "transitioners", - "offset": 0, - "slot": "1", - "type": "t_mapping(t_bytes32,t_contract(iOVM_StateTransitioner)11962)" - } - ], - "types": { - "t_bytes32": { - "encoding": "inplace", - "label": "bytes32", - "numberOfBytes": "32" - }, - "t_contract(Lib_AddressManager)12793": { - "encoding": "inplace", - "label": "contract Lib_AddressManager", - "numberOfBytes": "20" - }, - "t_contract(iOVM_StateTransitioner)11962": { - "encoding": "inplace", - "label": "contract iOVM_StateTransitioner", - "numberOfBytes": "20" - }, - "t_mapping(t_bytes32,t_contract(iOVM_StateTransitioner)11962)": { - "encoding": "mapping", - "key": "t_bytes32", - "label": "mapping(bytes32 => contract iOVM_StateTransitioner)", - "numberOfBytes": "32", - "value": "t_contract(iOVM_StateTransitioner)11962" - } - } - } -} \ No newline at end of file diff --git a/packages/contracts/deployments/kovan-v3/OVM_L1CrossDomainMessenger.json b/packages/contracts/deployments/kovan-v3/OVM_L1CrossDomainMessenger.json deleted file mode 100644 index ceb42bc0a5762..0000000000000 --- a/packages/contracts/deployments/kovan-v3/OVM_L1CrossDomainMessenger.json +++ /dev/null @@ -1,798 +0,0 @@ -{ - "address": "0xa9D9045E4A753c856Fc0053369E780f23559E0A1", - "abi": [ - { - "inputs": [], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "bytes32", - "name": "msgHash", - "type": "bytes32" - } - ], - "name": "FailedRelayedMessage", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "_xDomainCalldataHash", - "type": "bytes32" - } - ], - "name": "MessageAllowed", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "_xDomainCalldataHash", - "type": "bytes32" - } - ], - "name": "MessageBlocked", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "previousOwner", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "newOwner", - "type": "address" - } - ], - "name": "OwnershipTransferred", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "Paused", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "bytes32", - "name": "msgHash", - "type": "bytes32" - } - ], - "name": "RelayedMessage", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "bytes", - "name": "message", - "type": "bytes" - } - ], - "name": "SentMessage", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "Unpaused", - "type": "event" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "_xDomainCalldataHash", - "type": "bytes32" - } - ], - "name": "allowMessage", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "_xDomainCalldataHash", - "type": "bytes32" - } - ], - "name": "blockMessage", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "name": "blockedMessages", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_libAddressManager", - "type": "address" - } - ], - "name": "initialize", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "libAddressManager", - "outputs": [ - { - "internalType": "contract Lib_AddressManager", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "messageNonce", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "owner", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "pause", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "paused", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_target", - "type": "address" - }, - { - "internalType": "address", - "name": "_sender", - "type": "address" - }, - { - "internalType": "bytes", - "name": "_message", - "type": "bytes" - }, - { - "internalType": "uint256", - "name": "_messageNonce", - "type": "uint256" - }, - { - "components": [ - { - "internalType": "bytes32", - "name": "stateRoot", - "type": "bytes32" - }, - { - "components": [ - { - "internalType": "uint256", - "name": "batchIndex", - "type": "uint256" - }, - { - "internalType": "bytes32", - "name": "batchRoot", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "batchSize", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "prevTotalElements", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "extraData", - "type": "bytes" - } - ], - "internalType": "struct Lib_OVMCodec.ChainBatchHeader", - "name": "stateRootBatchHeader", - "type": "tuple" - }, - { - "components": [ - { - "internalType": "uint256", - "name": "index", - "type": "uint256" - }, - { - "internalType": "bytes32[]", - "name": "siblings", - "type": "bytes32[]" - } - ], - "internalType": "struct Lib_OVMCodec.ChainInclusionProof", - "name": "stateRootProof", - "type": "tuple" - }, - { - "internalType": "bytes", - "name": "stateTrieWitness", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "storageTrieWitness", - "type": "bytes" - } - ], - "internalType": "struct iOVM_L1CrossDomainMessenger.L2MessageInclusionProof", - "name": "_proof", - "type": "tuple" - } - ], - "name": "relayMessage", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "name": "relayedMessages", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "renounceOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_target", - "type": "address" - }, - { - "internalType": "address", - "name": "_sender", - "type": "address" - }, - { - "internalType": "bytes", - "name": "_message", - "type": "bytes" - }, - { - "internalType": "uint256", - "name": "_messageNonce", - "type": "uint256" - }, - { - "internalType": "uint32", - "name": "_gasLimit", - "type": "uint32" - } - ], - "name": "replayMessage", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "string", - "name": "_name", - "type": "string" - } - ], - "name": "resolve", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_target", - "type": "address" - }, - { - "internalType": "bytes", - "name": "_message", - "type": "bytes" - }, - { - "internalType": "uint32", - "name": "_gasLimit", - "type": "uint32" - } - ], - "name": "sendMessage", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "name": "sentMessages", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "name": "successfulMessages", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "newOwner", - "type": "address" - } - ], - "name": "transferOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "xDomainMessageSender", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - } - ], - "transactionHash": "0x1fb0b55a40eda69d78843a052c4874a608d32099c0bea4eefd52a100543ae5ed", - "receipt": { - "to": null, - "from": "0x18394B52d3Cb931dfA76F63251919D051953413d", - "contractAddress": "0xa9D9045E4A753c856Fc0053369E780f23559E0A1", - "transactionIndex": 0, - "gasUsed": "2795220", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0xea435110780744f5598fc90e58d58c96add2c612a30faface1580cf6aaf66882", - "transactionHash": "0x1fb0b55a40eda69d78843a052c4874a608d32099c0bea4eefd52a100543ae5ed", - "logs": [], - "blockNumber": 24572827, - "cumulativeGasUsed": "2795220", - "status": 1, - "byzantium": true - }, - "args": [], - "solcInputHash": "5ee8e508e2c54cb5ac6783b4855b1558", - "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"msgHash\",\"type\":\"bytes32\"}],\"name\":\"FailedRelayedMessage\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"_xDomainCalldataHash\",\"type\":\"bytes32\"}],\"name\":\"MessageAllowed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"_xDomainCalldataHash\",\"type\":\"bytes32\"}],\"name\":\"MessageBlocked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Paused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"msgHash\",\"type\":\"bytes32\"}],\"name\":\"RelayedMessage\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"}],\"name\":\"SentMessage\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Unpaused\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_xDomainCalldataHash\",\"type\":\"bytes32\"}],\"name\":\"allowMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_xDomainCalldataHash\",\"type\":\"bytes32\"}],\"name\":\"blockMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"blockedMessages\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"messageNonce\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"paused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_sender\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_message\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"_messageNonce\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"stateRootBatchHeader\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"siblings\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct Lib_OVMCodec.ChainInclusionProof\",\"name\":\"stateRootProof\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"stateTrieWitness\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"storageTrieWitness\",\"type\":\"bytes\"}],\"internalType\":\"struct iOVM_L1CrossDomainMessenger.L2MessageInclusionProof\",\"name\":\"_proof\",\"type\":\"tuple\"}],\"name\":\"relayMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"relayedMessages\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_sender\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_message\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"_messageNonce\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"_gasLimit\",\"type\":\"uint32\"}],\"name\":\"replayMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_message\",\"type\":\"bytes\"},{\"internalType\":\"uint32\",\"name\":\"_gasLimit\",\"type\":\"uint32\"}],\"name\":\"sendMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"sentMessages\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"successfulMessages\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"xDomainMessageSender\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The L1 Cross Domain Messenger contract sends messages from L1 to L2, and relays messages from L2 onto L1. In the event that a message sent from L1 to L2 is rejected for exceeding the L2 epoch gas limit, it can be resubmitted via this contract's replay function. Compiler used: solc Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"allowMessage(bytes32)\":{\"params\":{\"_xDomainCalldataHash\":\"Hash of the message to block.\"}},\"blockMessage(bytes32)\":{\"params\":{\"_xDomainCalldataHash\":\"Hash of the message to block.\"}},\"initialize(address)\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"paused()\":{\"details\":\"Returns true if the contract is paused, and false otherwise.\"},\"relayMessage(address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))\":{\"params\":{\"_message\":\"Message to send to the target.\",\"_messageNonce\":\"Nonce for the provided message.\",\"_proof\":\"Inclusion proof for the given message.\",\"_sender\":\"Message sender address.\",\"_target\":\"Target contract address.\"}},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner.\"},\"replayMessage(address,address,bytes,uint256,uint32)\":{\"params\":{\"_gasLimit\":\"Gas limit for the provided message.\",\"_message\":\"Message to send to the target.\",\"_messageNonce\":\"Nonce for the provided message.\",\"_sender\":\"Original sender address.\",\"_target\":\"Target contract address.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}},\"sendMessage(address,bytes,uint32)\":{\"params\":{\"_gasLimit\":\"Gas limit for the provided message.\",\"_message\":\"Message to send to the target.\",\"_target\":\"Target contract address.\"}},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"}},\"title\":\"OVM_L1CrossDomainMessenger\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"allowMessage(bytes32)\":{\"notice\":\"Allow a message.\"},\"blockMessage(bytes32)\":{\"notice\":\"Block a message.\"},\"constructor\":{\"notice\":\"This contract is intended to be behind a delegate proxy. We pass the zero address to the address resolver just to satisfy the constructor. We still need to set this value in initialize().\"},\"pause()\":{\"notice\":\"Pause relaying.\"},\"relayMessage(address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))\":{\"notice\":\"Relays a cross domain message to a contract.\"},\"replayMessage(address,address,bytes,uint256,uint32)\":{\"notice\":\"Replays a cross domain message to the target messenger.\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"},\"sendMessage(address,bytes,uint32)\":{\"notice\":\"Sends a cross domain message to the target messenger.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1CrossDomainMessenger.sol\":\"OVM_L1CrossDomainMessenger\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../utils/ContextUpgradeable.sol\\\";\\nimport \\\"../proxy/Initializable.sol\\\";\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n function __Ownable_init() internal initializer {\\n __Context_init_unchained();\\n __Ownable_init_unchained();\\n }\\n\\n function __Ownable_init_unchained() internal initializer {\\n address msgSender = _msgSender();\\n _owner = msgSender;\\n emit OwnershipTransferred(address(0), msgSender);\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n emit OwnershipTransferred(_owner, address(0));\\n _owner = address(0);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n emit OwnershipTransferred(_owner, newOwner);\\n _owner = newOwner;\\n }\\n uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0xb419e68addcb82ecda3ad3974b0d2db76435ce9b08435a04d5b119a0c5d45ea5\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\n// solhint-disable-next-line compiler-version\\npragma solidity >=0.4.24 <0.8.0;\\n\\nimport \\\"../utils/AddressUpgradeable.sol\\\";\\n\\n/**\\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\\n * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an\\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\\n *\\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\\n * possible by providing the encoded function call as the `_data` argument to {UpgradeableProxy-constructor}.\\n *\\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\\n */\\nabstract contract Initializable {\\n\\n /**\\n * @dev Indicates that the contract has been initialized.\\n */\\n bool private _initialized;\\n\\n /**\\n * @dev Indicates that the contract is in the process of being initialized.\\n */\\n bool private _initializing;\\n\\n /**\\n * @dev Modifier to protect an initializer function from being invoked twice.\\n */\\n modifier initializer() {\\n require(_initializing || _isConstructor() || !_initialized, \\\"Initializable: contract is already initialized\\\");\\n\\n bool isTopLevelCall = !_initializing;\\n if (isTopLevelCall) {\\n _initializing = true;\\n _initialized = true;\\n }\\n\\n _;\\n\\n if (isTopLevelCall) {\\n _initializing = false;\\n }\\n }\\n\\n /// @dev Returns true if and only if the function is running in the constructor\\n function _isConstructor() private view returns (bool) {\\n return !AddressUpgradeable.isContract(address(this));\\n }\\n}\\n\",\"keccak256\":\"0xd8e4eb08dcc1d1860fb347ba5ffd595242b9a1b66d49a47f2b4cb51c3f35017e\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.2 <0.8.0;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary AddressUpgradeable {\\n /**\\n * @dev Returns true if `account` is a contract.\\n *\\n * [IMPORTANT]\\n * ====\\n * It is unsafe to assume that an address for which this function returns\\n * false is an externally-owned account (EOA) and not a contract.\\n *\\n * Among others, `isContract` will return false for the following\\n * types of addresses:\\n *\\n * - an externally-owned account\\n * - a contract in construction\\n * - an address where a contract will be created\\n * - an address where a contract lived, but was destroyed\\n * ====\\n */\\n function isContract(address account) internal view returns (bool) {\\n // This method relies on extcodesize, which returns 0 for contracts in\\n // construction, since the code is only stored at the end of the\\n // constructor execution.\\n\\n uint256 size;\\n // solhint-disable-next-line no-inline-assembly\\n assembly { size := extcodesize(account) }\\n return size > 0;\\n }\\n\\n /**\\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n * `recipient`, forwarding all available gas and reverting on errors.\\n *\\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n * imposed by `transfer`, making them unable to receive funds via\\n * `transfer`. {sendValue} removes this limitation.\\n *\\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n *\\n * IMPORTANT: because control is transferred to `recipient`, care must be\\n * taken to not create reentrancy vulnerabilities. Consider using\\n * {ReentrancyGuard} or the\\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n */\\n function sendValue(address payable recipient, uint256 amount) internal {\\n require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n // solhint-disable-next-line avoid-low-level-calls, avoid-call-value\\n (bool success, ) = recipient.call{ value: amount }(\\\"\\\");\\n require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n }\\n\\n /**\\n * @dev Performs a Solidity function call using a low level `call`. A\\n * plain`call` is an unsafe replacement for a function call: use this\\n * function instead.\\n *\\n * If `target` reverts with a revert reason, it is bubbled up by this\\n * function (like regular Solidity function calls).\\n *\\n * Returns the raw returned data. To convert to the expected return value,\\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n *\\n * Requirements:\\n *\\n * - `target` must be a contract.\\n * - calling `target` with `data` must not revert.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionCall(target, data, \\\"Address: low-level call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n * `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but also transferring `value` wei to `target`.\\n *\\n * Requirements:\\n *\\n * - the calling contract must have an ETH balance of at least `value`.\\n * - the called Solidity function must be `payable`.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n * with `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {\\n require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n require(isContract(target), \\\"Address: call to non-contract\\\");\\n\\n // solhint-disable-next-line avoid-low-level-calls\\n (bool success, bytes memory returndata) = target.call{ value: value }(data);\\n return _verifyCallResult(success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {\\n require(isContract(target), \\\"Address: static call to non-contract\\\");\\n\\n // solhint-disable-next-line avoid-low-level-calls\\n (bool success, bytes memory returndata) = target.staticcall(data);\\n return _verifyCallResult(success, returndata, errorMessage);\\n }\\n\\n function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {\\n if (success) {\\n return returndata;\\n } else {\\n // Look for revert reason and bubble it up if present\\n if (returndata.length > 0) {\\n // The easiest way to bubble the revert reason is using memory via assembly\\n\\n // solhint-disable-next-line no-inline-assembly\\n assembly {\\n let returndata_size := mload(returndata)\\n revert(add(32, returndata), returndata_size)\\n }\\n } else {\\n revert(errorMessage);\\n }\\n }\\n }\\n}\\n\",\"keccak256\":\"0xfc5ea91fa9ceb1961023b2a6c978b902888c52b90847ac7813fe3b79524165f6\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with GSN meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract ContextUpgradeable is Initializable {\\n function __Context_init() internal initializer {\\n __Context_init_unchained();\\n }\\n\\n function __Context_init_unchained() internal initializer {\\n }\\n function _msgSender() internal view virtual returns (address payable) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes memory) {\\n this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n return msg.data;\\n }\\n uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0xbbf8a21b9a66c48d45ff771b8563c6df19ba451d63dfb8380a865c1e1f29d1a0\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"./ContextUpgradeable.sol\\\";\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev Contract module which allows children to implement an emergency stop\\n * mechanism that can be triggered by an authorized account.\\n *\\n * This module is used through inheritance. It will make available the\\n * modifiers `whenNotPaused` and `whenPaused`, which can be applied to\\n * the functions of your contract. Note that they will not be pausable by\\n * simply including this module, only once the modifiers are put in place.\\n */\\nabstract contract PausableUpgradeable is Initializable, ContextUpgradeable {\\n /**\\n * @dev Emitted when the pause is triggered by `account`.\\n */\\n event Paused(address account);\\n\\n /**\\n * @dev Emitted when the pause is lifted by `account`.\\n */\\n event Unpaused(address account);\\n\\n bool private _paused;\\n\\n /**\\n * @dev Initializes the contract in unpaused state.\\n */\\n function __Pausable_init() internal initializer {\\n __Context_init_unchained();\\n __Pausable_init_unchained();\\n }\\n\\n function __Pausable_init_unchained() internal initializer {\\n _paused = false;\\n }\\n\\n /**\\n * @dev Returns true if the contract is paused, and false otherwise.\\n */\\n function paused() public view virtual returns (bool) {\\n return _paused;\\n }\\n\\n /**\\n * @dev Modifier to make a function callable only when the contract is not paused.\\n *\\n * Requirements:\\n *\\n * - The contract must not be paused.\\n */\\n modifier whenNotPaused() {\\n require(!paused(), \\\"Pausable: paused\\\");\\n _;\\n }\\n\\n /**\\n * @dev Modifier to make a function callable only when the contract is paused.\\n *\\n * Requirements:\\n *\\n * - The contract must be paused.\\n */\\n modifier whenPaused() {\\n require(paused(), \\\"Pausable: not paused\\\");\\n _;\\n }\\n\\n /**\\n * @dev Triggers stopped state.\\n *\\n * Requirements:\\n *\\n * - The contract must not be paused.\\n */\\n function _pause() internal virtual whenNotPaused {\\n _paused = true;\\n emit Paused(_msgSender());\\n }\\n\\n /**\\n * @dev Returns to normal state.\\n *\\n * Requirements:\\n *\\n * - The contract must be paused.\\n */\\n function _unpause() internal virtual whenPaused {\\n _paused = false;\\n emit Unpaused(_msgSender());\\n }\\n uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0x73bef0a5dec3efde8183c4858d90f683ed2771656c4329647b4d5b0f89498fd5\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev Contract module that helps prevent reentrant calls to a function.\\n *\\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\\n * available, which can be applied to functions to make sure there are no nested\\n * (reentrant) calls to them.\\n *\\n * Note that because there is a single `nonReentrant` guard, functions marked as\\n * `nonReentrant` may not call one another. This can be worked around by making\\n * those functions `private`, and then adding `external` `nonReentrant` entry\\n * points to them.\\n *\\n * TIP: If you would like to learn more about reentrancy and alternative ways\\n * to protect against it, check out our blog post\\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\\n */\\nabstract contract ReentrancyGuardUpgradeable is Initializable {\\n // Booleans are more expensive than uint256 or any type that takes up a full\\n // word because each write operation emits an extra SLOAD to first read the\\n // slot's contents, replace the bits taken up by the boolean, and then write\\n // back. This is the compiler's defense against contract upgrades and\\n // pointer aliasing, and it cannot be disabled.\\n\\n // The values being non-zero value makes deployment a bit more expensive,\\n // but in exchange the refund on every call to nonReentrant will be lower in\\n // amount. Since refunds are capped to a percentage of the total\\n // transaction's gas, it is best to keep them low in cases like this one, to\\n // increase the likelihood of the full refund coming into effect.\\n uint256 private constant _NOT_ENTERED = 1;\\n uint256 private constant _ENTERED = 2;\\n\\n uint256 private _status;\\n\\n function __ReentrancyGuard_init() internal initializer {\\n __ReentrancyGuard_init_unchained();\\n }\\n\\n function __ReentrancyGuard_init_unchained() internal initializer {\\n _status = _NOT_ENTERED;\\n }\\n\\n /**\\n * @dev Prevents a contract from calling itself, directly or indirectly.\\n * Calling a `nonReentrant` function from another `nonReentrant`\\n * function is not supported. It is possible to prevent this from happening\\n * by making the `nonReentrant` function external, and make it call a\\n * `private` function that does the actual work.\\n */\\n modifier nonReentrant() {\\n // On the first call to nonReentrant, _notEntered will be true\\n require(_status != _ENTERED, \\\"ReentrancyGuard: reentrant call\\\");\\n\\n // Any calls to nonReentrant after this point will fail\\n _status = _ENTERED;\\n\\n _;\\n\\n // By storing the original value once again, a refund is triggered (see\\n // https://eips.ethereum.org/EIPS/eip-2200)\\n _status = _NOT_ENTERED;\\n }\\n uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0x46034cd5cca740f636345c8f7aebae0f78adfd4b70e31e6f888cccbe1086586e\",\"license\":\"MIT\"},\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor () internal {\\n address msgSender = _msgSender();\\n _owner = msgSender;\\n emit OwnershipTransferred(address(0), msgSender);\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n emit OwnershipTransferred(_owner, address(0));\\n _owner = address(0);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n emit OwnershipTransferred(_owner, newOwner);\\n _owner = newOwner;\\n }\\n}\\n\",\"keccak256\":\"0x15e2d5bd4c28a88548074c54d220e8086f638a71ed07e6b3ba5a70066fcf458d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with GSN meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address payable) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes memory) {\\n this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x8d3cb350f04ff49cfb10aef08d87f19dcbaecc8027b0bed12f3275cd12f38cf0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/bridge/messaging/Abs_BaseCrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Interface Imports */\\nimport { iAbs_BaseCrossDomainMessenger } from \\\"../../../iOVM/bridge/messaging/iAbs_BaseCrossDomainMessenger.sol\\\";\\n\\n/**\\n * @title Abs_BaseCrossDomainMessenger\\n * @dev The Base Cross Domain Messenger is an abstract contract providing the interface and common\\n * functionality used in the L1 and L2 Cross Domain Messengers. It can also serve as a template for\\n * developers wishing to implement a custom bridge contract to suit their needs.\\n *\\n * Compiler used: defined by child contract\\n * Runtime target: defined by child contract\\n */\\nabstract contract Abs_BaseCrossDomainMessenger is iAbs_BaseCrossDomainMessenger {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n // The default x-domain message sender being set to a non-zero value makes\\n // deployment a bit more expensive, but in exchange the refund on every call to\\n // `relayMessage` by the L1 and L2 messengers will be higher.\\n address internal constant DEFAULT_XDOMAIN_SENDER = 0x000000000000000000000000000000000000dEaD;\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping (bytes32 => bool) public relayedMessages;\\n mapping (bytes32 => bool) public successfulMessages;\\n mapping (bytes32 => bool) public sentMessages;\\n uint256 public messageNonce;\\n address internal xDomainMsgSender = DEFAULT_XDOMAIN_SENDER;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n constructor() {}\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function xDomainMessageSender()\\n public\\n override\\n view\\n returns (\\n address\\n )\\n {\\n require(xDomainMsgSender != DEFAULT_XDOMAIN_SENDER, \\\"xDomainMessageSender is not set\\\");\\n return xDomainMsgSender;\\n }\\n\\n /**\\n * Sends a cross domain message to the target messenger.\\n * @param _target Target contract address.\\n * @param _message Message to send to the target.\\n * @param _gasLimit Gas limit for the provided message.\\n */\\n function sendMessage(\\n address _target,\\n bytes memory _message,\\n uint32 _gasLimit\\n )\\n override\\n public\\n {\\n bytes memory xDomainCalldata = _getXDomainCalldata(\\n _target,\\n msg.sender,\\n _message,\\n messageNonce\\n );\\n\\n messageNonce += 1;\\n sentMessages[keccak256(xDomainCalldata)] = true;\\n\\n _sendXDomainMessage(xDomainCalldata, _gasLimit);\\n emit SentMessage(xDomainCalldata);\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Generates the correct cross domain calldata for a message.\\n * @param _target Target contract address.\\n * @param _sender Message sender address.\\n * @param _message Message to send to the target.\\n * @param _messageNonce Nonce for the provided message.\\n * @return ABI encoded cross domain calldata.\\n */\\n function _getXDomainCalldata(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _messageNonce\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return abi.encodeWithSignature(\\n \\\"relayMessage(address,address,bytes,uint256)\\\",\\n _target,\\n _sender,\\n _message,\\n _messageNonce\\n );\\n }\\n\\n /**\\n * Sends a cross domain message.\\n * param // Message to send.\\n * param // Gas limit for the provided message.\\n */\\n function _sendXDomainMessage(\\n bytes memory, // _message,\\n uint256 // _gasLimit\\n )\\n virtual\\n internal\\n {\\n revert(\\\"Implement me in child contracts!\\\");\\n }\\n}\\n\",\"keccak256\":\"0xed5dafa41fadfd461e33c042da3a721f2cce73e0d2418d170a44161f7714a439\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1CrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../../libraries/resolver/Lib_AddressResolver.sol\\\";\\nimport { Lib_AddressManager } from \\\"../../../libraries/resolver/Lib_AddressManager.sol\\\";\\nimport { Lib_SecureMerkleTrie } from \\\"../../../libraries/trie/Lib_SecureMerkleTrie.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_L1CrossDomainMessenger } from \\\"../../../iOVM/bridge/messaging/iOVM_L1CrossDomainMessenger.sol\\\";\\nimport { iOVM_CanonicalTransactionChain } from \\\"../../../iOVM/chain/iOVM_CanonicalTransactionChain.sol\\\";\\nimport { iOVM_StateCommitmentChain } from \\\"../../../iOVM/chain/iOVM_StateCommitmentChain.sol\\\";\\n\\n/* Contract Imports */\\nimport { Abs_BaseCrossDomainMessenger } from \\\"./Abs_BaseCrossDomainMessenger.sol\\\";\\n\\n/* External Imports */\\nimport { OwnableUpgradeable } from \\\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\\\";\\nimport { PausableUpgradeable } from \\\"@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol\\\";\\nimport { ReentrancyGuardUpgradeable } from \\\"@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol\\\";\\n\\n/**\\n * @title OVM_L1CrossDomainMessenger\\n * @dev The L1 Cross Domain Messenger contract sends messages from L1 to L2, and relays messages\\n * from L2 onto L1. In the event that a message sent from L1 to L2 is rejected for exceeding the L2\\n * epoch gas limit, it can be resubmitted via this contract's replay function.\\n *\\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract OVM_L1CrossDomainMessenger is\\n iOVM_L1CrossDomainMessenger,\\n Abs_BaseCrossDomainMessenger,\\n Lib_AddressResolver,\\n OwnableUpgradeable,\\n PausableUpgradeable,\\n ReentrancyGuardUpgradeable\\n{\\n\\n /**********\\n * Events *\\n **********/\\n\\n event MessageBlocked(\\n bytes32 indexed _xDomainCalldataHash\\n );\\n\\n event MessageAllowed(\\n bytes32 indexed _xDomainCalldataHash\\n );\\n\\n /**********************\\n * Contract Variables *\\n **********************/\\n\\n mapping (bytes32 => bool) public blockedMessages;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * This contract is intended to be behind a delegate proxy.\\n * We pass the zero address to the address resolver just to satisfy the constructor.\\n * We still need to set this value in initialize().\\n */\\n constructor()\\n Lib_AddressResolver(address(0))\\n {}\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n /**\\n * Modifier to enforce that, if configured, only the OVM_L2MessageRelayer contract may\\n * successfully call a method.\\n */\\n modifier onlyRelayer() {\\n address relayer = resolve(\\\"OVM_L2MessageRelayer\\\");\\n if (relayer != address(0)) {\\n require(\\n msg.sender == relayer,\\n \\\"Only OVM_L2MessageRelayer can relay L2-to-L1 messages.\\\"\\n );\\n }\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n */\\n function initialize(\\n address _libAddressManager\\n )\\n public\\n initializer\\n {\\n require(\\n address(libAddressManager) == address(0),\\n \\\"L1CrossDomainMessenger already intialized.\\\"\\n );\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n xDomainMsgSender = DEFAULT_XDOMAIN_SENDER;\\n\\n // Initialize upgradable OZ contracts\\n __Context_init_unchained(); // Context is a dependency for both Ownable and Pausable\\n __Ownable_init_unchained();\\n __Pausable_init_unchained();\\n __ReentrancyGuard_init_unchained();\\n }\\n\\n /**\\n * Pause relaying.\\n */\\n function pause()\\n external\\n onlyOwner\\n {\\n _pause();\\n }\\n\\n /**\\n * Block a message.\\n * @param _xDomainCalldataHash Hash of the message to block.\\n */\\n function blockMessage(\\n bytes32 _xDomainCalldataHash\\n )\\n external\\n onlyOwner\\n {\\n blockedMessages[_xDomainCalldataHash] = true;\\n emit MessageBlocked(_xDomainCalldataHash);\\n }\\n\\n /**\\n * Allow a message.\\n * @param _xDomainCalldataHash Hash of the message to block.\\n */\\n function allowMessage(\\n bytes32 _xDomainCalldataHash\\n )\\n external\\n onlyOwner\\n {\\n blockedMessages[_xDomainCalldataHash] = false;\\n emit MessageAllowed(_xDomainCalldataHash);\\n }\\n\\n /**\\n * Relays a cross domain message to a contract.\\n * @inheritdoc iOVM_L1CrossDomainMessenger\\n */\\n function relayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _messageNonce,\\n L2MessageInclusionProof memory _proof\\n )\\n override\\n public\\n nonReentrant\\n onlyRelayer\\n whenNotPaused\\n {\\n bytes memory xDomainCalldata = _getXDomainCalldata(\\n _target,\\n _sender,\\n _message,\\n _messageNonce\\n );\\n\\n require(\\n _verifyXDomainMessage(\\n xDomainCalldata,\\n _proof\\n ) == true,\\n \\\"Provided message could not be verified.\\\"\\n );\\n\\n bytes32 xDomainCalldataHash = keccak256(xDomainCalldata);\\n\\n require(\\n successfulMessages[xDomainCalldataHash] == false,\\n \\\"Provided message has already been received.\\\"\\n );\\n\\n require(\\n blockedMessages[xDomainCalldataHash] == false,\\n \\\"Provided message has been blocked.\\\"\\n );\\n\\n xDomainMsgSender = _sender;\\n (bool success, ) = _target.call(_message);\\n xDomainMsgSender = DEFAULT_XDOMAIN_SENDER;\\n\\n // Mark the message as received if the call was successful. Ensures that a message can be\\n // relayed multiple times in the case that the call reverted.\\n if (success == true) {\\n successfulMessages[xDomainCalldataHash] = true;\\n emit RelayedMessage(xDomainCalldataHash);\\n } else {\\n emit FailedRelayedMessage(xDomainCalldataHash);\\n }\\n\\n // Store an identifier that can be used to prove that the given message was relayed by some\\n // user. Gives us an easy way to pay relayers for their work.\\n bytes32 relayId = keccak256(\\n abi.encodePacked(\\n xDomainCalldata,\\n msg.sender,\\n block.number\\n )\\n );\\n relayedMessages[relayId] = true;\\n }\\n\\n /**\\n * Replays a cross domain message to the target messenger.\\n * @inheritdoc iOVM_L1CrossDomainMessenger\\n */\\n function replayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _messageNonce,\\n uint32 _gasLimit\\n )\\n override\\n public\\n {\\n bytes memory xDomainCalldata = _getXDomainCalldata(\\n _target,\\n _sender,\\n _message,\\n _messageNonce\\n );\\n\\n require(\\n sentMessages[keccak256(xDomainCalldata)] == true,\\n \\\"Provided message has not already been sent.\\\"\\n );\\n\\n _sendXDomainMessage(xDomainCalldata, _gasLimit);\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Verifies that the given message is valid.\\n * @param _xDomainCalldata Calldata to verify.\\n * @param _proof Inclusion proof for the message.\\n * @return Whether or not the provided message is valid.\\n */\\n function _verifyXDomainMessage(\\n bytes memory _xDomainCalldata,\\n L2MessageInclusionProof memory _proof\\n )\\n internal\\n view\\n returns (\\n bool\\n )\\n {\\n return (\\n _verifyStateRootProof(_proof)\\n && _verifyStorageProof(_xDomainCalldata, _proof)\\n );\\n }\\n\\n /**\\n * Verifies that the state root within an inclusion proof is valid.\\n * @param _proof Message inclusion proof.\\n * @return Whether or not the provided proof is valid.\\n */\\n function _verifyStateRootProof(\\n L2MessageInclusionProof memory _proof\\n )\\n internal\\n view\\n returns (\\n bool\\n )\\n {\\n iOVM_StateCommitmentChain ovmStateCommitmentChain = iOVM_StateCommitmentChain(\\n resolve(\\\"OVM_StateCommitmentChain\\\")\\n );\\n\\n return (\\n ovmStateCommitmentChain.insideFraudProofWindow(_proof.stateRootBatchHeader) == false\\n && ovmStateCommitmentChain.verifyStateCommitment(\\n _proof.stateRoot,\\n _proof.stateRootBatchHeader,\\n _proof.stateRootProof\\n )\\n );\\n }\\n\\n /**\\n * Verifies that the storage proof within an inclusion proof is valid.\\n * @param _xDomainCalldata Encoded message calldata.\\n * @param _proof Message inclusion proof.\\n * @return Whether or not the provided proof is valid.\\n */\\n function _verifyStorageProof(\\n bytes memory _xDomainCalldata,\\n L2MessageInclusionProof memory _proof\\n )\\n internal\\n view\\n returns (\\n bool\\n )\\n {\\n bytes32 storageKey = keccak256(\\n abi.encodePacked(\\n keccak256(\\n abi.encodePacked(\\n _xDomainCalldata,\\n resolve(\\\"OVM_L2CrossDomainMessenger\\\")\\n )\\n ),\\n uint256(0)\\n )\\n );\\n\\n (\\n bool exists,\\n bytes memory encodedMessagePassingAccount\\n ) = Lib_SecureMerkleTrie.get(\\n abi.encodePacked(0x4200000000000000000000000000000000000000),\\n _proof.stateTrieWitness,\\n _proof.stateRoot\\n );\\n\\n require(\\n exists == true,\\n \\\"Message passing predeploy has not been initialized or invalid proof provided.\\\"\\n );\\n\\n Lib_OVMCodec.EVMAccount memory account = Lib_OVMCodec.decodeEVMAccount(\\n encodedMessagePassingAccount\\n );\\n\\n return Lib_SecureMerkleTrie.verifyInclusionProof(\\n abi.encodePacked(storageKey),\\n abi.encodePacked(uint8(1)),\\n _proof.storageTrieWitness,\\n account.storageRoot\\n );\\n }\\n\\n /**\\n * Sends a cross domain message.\\n * @param _message Message to send.\\n * @param _gasLimit OVM gas limit for the message.\\n */\\n function _sendXDomainMessage(\\n bytes memory _message,\\n uint256 _gasLimit\\n )\\n override\\n internal\\n {\\n iOVM_CanonicalTransactionChain(resolve(\\\"OVM_CanonicalTransactionChain\\\")).enqueue(\\n resolve(\\\"OVM_L2CrossDomainMessenger\\\"),\\n _gasLimit,\\n _message\\n );\\n }\\n}\\n\",\"keccak256\":\"0xba49f550a93c91448340fdb85ad8e4d4dff523532eb1524add38ee2825cc0442\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/bridge/messaging/iAbs_BaseCrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/**\\n * @title iAbs_BaseCrossDomainMessenger\\n */\\ninterface iAbs_BaseCrossDomainMessenger {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event SentMessage(bytes message);\\n event RelayedMessage(bytes32 msgHash);\\n event FailedRelayedMessage(bytes32 msgHash);\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n function xDomainMessageSender() external view returns (address);\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sends a cross domain message to the target messenger.\\n * @param _target Target contract address.\\n * @param _message Message to send to the target.\\n * @param _gasLimit Gas limit for the provided message.\\n */\\n function sendMessage(\\n address _target,\\n bytes calldata _message,\\n uint32 _gasLimit\\n ) external;\\n}\\n\",\"keccak256\":\"0x89981ed48e99d6939cc6cdef827d484fa3e2292d66c0ba5056c7050cb6282d7e\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/bridge/messaging/iOVM_L1CrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { iAbs_BaseCrossDomainMessenger } from \\\"./iAbs_BaseCrossDomainMessenger.sol\\\";\\n\\n/**\\n * @title iOVM_L1CrossDomainMessenger\\n */\\ninterface iOVM_L1CrossDomainMessenger is iAbs_BaseCrossDomainMessenger {\\n\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n struct L2MessageInclusionProof {\\n bytes32 stateRoot;\\n Lib_OVMCodec.ChainBatchHeader stateRootBatchHeader;\\n Lib_OVMCodec.ChainInclusionProof stateRootProof;\\n bytes stateTrieWitness;\\n bytes storageTrieWitness;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Relays a cross domain message to a contract.\\n * @param _target Target contract address.\\n * @param _sender Message sender address.\\n * @param _message Message to send to the target.\\n * @param _messageNonce Nonce for the provided message.\\n * @param _proof Inclusion proof for the given message.\\n */\\n function relayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _messageNonce,\\n L2MessageInclusionProof memory _proof\\n ) external;\\n\\n /**\\n * Replays a cross domain message to the target messenger.\\n * @param _target Target contract address.\\n * @param _sender Original sender address.\\n * @param _message Message to send to the target.\\n * @param _messageNonce Nonce for the provided message.\\n * @param _gasLimit Gas limit for the provided message.\\n */\\n function replayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _messageNonce,\\n uint32 _gasLimit\\n ) external;\\n}\\n\",\"keccak256\":\"0xdcd239d0b215e400674d78e8db4ac12ba18efc34fa78e24c2ff867f61062dba2\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_CanonicalTransactionChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_ChainStorageContainer } from \\\"./iOVM_ChainStorageContainer.sol\\\";\\n\\n/**\\n * @title iOVM_CanonicalTransactionChain\\n */\\ninterface iOVM_CanonicalTransactionChain {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event TransactionEnqueued(\\n address _l1TxOrigin,\\n address _target,\\n uint256 _gasLimit,\\n bytes _data,\\n uint256 _queueIndex,\\n uint256 _timestamp\\n );\\n\\n event QueueBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event SequencerBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event TransactionBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct BatchContext {\\n uint256 numSequencedTransactions;\\n uint256 numSubsequentQueueTransactions;\\n uint256 timestamp;\\n uint256 blockNumber;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n\\n /**\\n * Accesses the batch storage container.\\n * @return Reference to the batch storage container.\\n */\\n function batches()\\n external\\n view\\n returns (\\n iOVM_ChainStorageContainer\\n );\\n\\n /**\\n * Accesses the queue storage container.\\n * @return Reference to the queue storage container.\\n */\\n function queue()\\n external\\n view\\n returns (\\n iOVM_ChainStorageContainer\\n );\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements()\\n external\\n view\\n returns (\\n uint256 _totalElements\\n );\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches()\\n external\\n view\\n returns (\\n uint256 _totalBatches\\n );\\n\\n /**\\n * Returns the index of the next element to be enqueued.\\n * @return Index for the next queue element.\\n */\\n function getNextQueueIndex()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Gets the queue element at a particular index.\\n * @param _index Index of the queue element to access.\\n * @return _element Queue element at the given index.\\n */\\n function getQueueElement(\\n uint256 _index\\n )\\n external\\n view\\n returns (\\n Lib_OVMCodec.QueueElement memory _element\\n );\\n\\n /**\\n * Returns the timestamp of the last transaction.\\n * @return Timestamp for the last transaction.\\n */\\n function getLastTimestamp()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Returns the blocknumber of the last transaction.\\n * @return Blocknumber for the last transaction.\\n */\\n function getLastBlockNumber()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Get the number of queue elements which have not yet been included.\\n * @return Number of pending queue elements.\\n */\\n function getNumPendingQueueElements()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Retrieves the length of the queue, including\\n * both pending and canonical transactions.\\n * @return Length of the queue.\\n */\\n function getQueueLength()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n\\n /**\\n * Adds a transaction to the queue.\\n * @param _target Target contract to send the transaction to.\\n * @param _gasLimit Gas limit for the given transaction.\\n * @param _data Transaction data.\\n */\\n function enqueue(\\n address _target,\\n uint256 _gasLimit,\\n bytes memory _data\\n )\\n external;\\n\\n /**\\n * Appends a given number of queued transactions as a single batch.\\n * @param _numQueuedTransactions Number of transactions to append.\\n */\\n function appendQueueBatch(\\n uint256 _numQueuedTransactions\\n )\\n external;\\n\\n /**\\n * Allows the sequencer to append a batch of transactions.\\n * @dev This function uses a custom encoding scheme for efficiency reasons.\\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\\n * .param _contexts Array of batch contexts.\\n * .param _transactionDataFields Array of raw transaction data.\\n */\\n function appendSequencerBatch(\\n // uint40 _shouldStartAtElement,\\n // uint24 _totalElementsToAppend,\\n // BatchContext[] _contexts,\\n // bytes[] _transactionDataFields\\n )\\n external;\\n\\n /**\\n * Verifies whether a transaction is included in the chain.\\n * @param _transaction Transaction to verify.\\n * @param _txChainElement Transaction chain element corresponding to the transaction.\\n * @param _batchHeader Header of the batch the transaction was included in.\\n * @param _inclusionProof Inclusion proof for the provided transaction chain element.\\n * @return True if the transaction exists in the CTC, false if not.\\n */\\n function verifyTransaction(\\n Lib_OVMCodec.Transaction memory _transaction,\\n Lib_OVMCodec.TransactionChainElement memory _txChainElement,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _inclusionProof\\n )\\n external\\n view\\n returns (\\n bool\\n );\\n}\\n\",\"keccak256\":\"0xb5e55488a1982841c07cdf5ff475da4789596f111dd48f01b1918ee4c775cf3a\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_ChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title iOVM_ChainStorageContainer\\n */\\ninterface iOVM_ChainStorageContainer {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata()\\n external\\n view\\n returns (\\n bytes27\\n );\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length()\\n external\\n view\\n returns (\\n uint256\\n );\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(\\n bytes32 _object\\n )\\n external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(\\n bytes32 _object,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(\\n uint256 _index\\n )\\n external\\n view\\n returns (\\n bytes32\\n );\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index\\n )\\n external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Marks an index as overwritable, meaing the underlying buffer can start to write values over\\n * any objects before and including the given index.\\n */\\n function setNextOverwritableIndex(\\n uint256 _index\\n )\\n external;\\n}\\n\",\"keccak256\":\"0x2d7973a0ad84c23ec62624d3f1e3aeb198cc72686ff1e6cfa17155556b320c94\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_StateCommitmentChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title iOVM_StateCommitmentChain\\n */\\ninterface iOVM_StateCommitmentChain {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event StateBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n event StateBatchDeleted(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot\\n );\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements()\\n external\\n view\\n returns (\\n uint256 _totalElements\\n );\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches()\\n external\\n view\\n returns (\\n uint256 _totalBatches\\n );\\n\\n /**\\n * Retrieves the timestamp of the last batch submitted by the sequencer.\\n * @return _lastSequencerTimestamp Last sequencer batch timestamp.\\n */\\n function getLastSequencerTimestamp()\\n external\\n view\\n returns (\\n uint256 _lastSequencerTimestamp\\n );\\n\\n /**\\n * Appends a batch of state roots to the chain.\\n * @param _batch Batch of state roots.\\n * @param _shouldStartAtElement Index of the element at which this batch should start.\\n */\\n function appendStateBatch(\\n bytes32[] calldata _batch,\\n uint256 _shouldStartAtElement\\n )\\n external;\\n\\n /**\\n * Deletes all state roots after (and including) a given batch.\\n * @param _batchHeader Header of the batch to start deleting from.\\n */\\n function deleteStateBatch(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n external;\\n\\n /**\\n * Verifies a batch inclusion proof.\\n * @param _element Hash of the element to verify a proof for.\\n * @param _batchHeader Header of the batch in which the element was included.\\n * @param _proof Merkle inclusion proof for the element.\\n */\\n function verifyStateCommitment(\\n bytes32 _element,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _proof\\n )\\n external\\n view\\n returns (\\n bool _verified\\n );\\n\\n /**\\n * Checks whether a given batch is still inside its fraud proof window.\\n * @param _batchHeader Header of the batch to check.\\n * @return _inside Whether or not the batch is inside the fraud proof window.\\n */\\n function insideFraudProofWindow(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n external\\n view\\n returns (\\n bool _inside\\n );\\n}\\n\",\"keccak256\":\"0x6646d6ff392b81aab52a7a277e91540819464751de0af5afd1962094b2e92448\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/codec/Lib_OVMCodec.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../utils/Lib_Bytes32Utils.sol\\\";\\n\\n/**\\n * @title Lib_OVMCodec\\n */\\nlibrary Lib_OVMCodec {\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum QueueOrigin {\\n SEQUENCER_QUEUE,\\n L1TOL2_QUEUE\\n }\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Account {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n address ethAddress;\\n bool isFresh;\\n }\\n\\n struct EVMAccount {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n }\\n\\n struct ChainBatchHeader {\\n uint256 batchIndex;\\n bytes32 batchRoot;\\n uint256 batchSize;\\n uint256 prevTotalElements;\\n bytes extraData;\\n }\\n\\n struct ChainInclusionProof {\\n uint256 index;\\n bytes32[] siblings;\\n }\\n\\n struct Transaction {\\n uint256 timestamp;\\n uint256 blockNumber;\\n QueueOrigin l1QueueOrigin;\\n address l1TxOrigin;\\n address entrypoint;\\n uint256 gasLimit;\\n bytes data;\\n }\\n\\n struct TransactionChainElement {\\n bool isSequenced;\\n uint256 queueIndex; // QUEUED TX ONLY\\n uint256 timestamp; // SEQUENCER TX ONLY\\n uint256 blockNumber; // SEQUENCER TX ONLY\\n bytes txData; // SEQUENCER TX ONLY\\n }\\n\\n struct QueueElement {\\n bytes32 transactionHash;\\n uint40 timestamp;\\n uint40 blockNumber;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Encodes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Encoded transaction bytes.\\n */\\n function encodeTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return abi.encodePacked(\\n _transaction.timestamp,\\n _transaction.blockNumber,\\n _transaction.l1QueueOrigin,\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n );\\n }\\n\\n /**\\n * Hashes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Hashed transaction\\n */\\n function hashTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(encodeTransaction(_transaction));\\n }\\n\\n /**\\n * Converts an OVM account to an EVM account.\\n * @param _in OVM account to convert.\\n * @return Converted EVM account.\\n */\\n function toEVMAccount(\\n Account memory _in\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n return EVMAccount({\\n nonce: _in.nonce,\\n balance: _in.balance,\\n storageRoot: _in.storageRoot,\\n codeHash: _in.codeHash\\n });\\n }\\n\\n /**\\n * @notice RLP-encodes an account state struct.\\n * @param _account Account state struct.\\n * @return RLP-encoded account state.\\n */\\n function encodeEVMAccount(\\n EVMAccount memory _account\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes[] memory raw = new bytes[](4);\\n\\n // Unfortunately we can't create this array outright because\\n // Lib_RLPWriter.writeList will reject fixed-size arrays. Assigning\\n // index-by-index circumvents this issue.\\n raw[0] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.nonce)\\n )\\n );\\n raw[1] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.balance)\\n )\\n );\\n raw[2] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.storageRoot));\\n raw[3] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.codeHash));\\n\\n return Lib_RLPWriter.writeList(raw);\\n }\\n\\n /**\\n * @notice Decodes an RLP-encoded account state into a useful struct.\\n * @param _encoded RLP-encoded account state.\\n * @return Account state struct.\\n */\\n function decodeEVMAccount(\\n bytes memory _encoded\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\\n\\n return EVMAccount({\\n nonce: Lib_RLPReader.readUint256(accountState[0]),\\n balance: Lib_RLPReader.readUint256(accountState[1]),\\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\\n });\\n }\\n\\n /**\\n * Calculates a hash for a given batch header.\\n * @param _batchHeader Header to hash.\\n * @return Hash of the header.\\n */\\n function hashBatchHeader(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(\\n abi.encode(\\n _batchHeader.batchRoot,\\n _batchHeader.batchSize,\\n _batchHeader.prevTotalElements,\\n _batchHeader.extraData\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0xd85ba2066057a2677926f484b938c7c2ef33ff3853f3b71cda252f4a54f30e05\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n public\\n onlyOwner\\n {\\n addresses[_getNameHash(_name)] = _address;\\n\\n emit AddressSet(\\n _name,\\n _address\\n );\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0x2ce671a0e004df88b136bea5a3c59d0732cea8887c8496da1d509e0200b03d7d\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(\\n address _libAddressManager\\n ) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x65981feeabff6a81783ea97d44baf988a18a86c8cb374c46fdb71819cbacc7c0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPReader.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_RLPReader\\n * @dev Adapted from \\\"RLPReader\\\" by Hamdi Allam (hamdi.allam97@gmail.com).\\n */\\nlibrary Lib_RLPReader {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 constant internal MAX_LIST_LENGTH = 32;\\n\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum RLPItemType {\\n DATA_ITEM,\\n LIST_ITEM\\n }\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct RLPItem {\\n uint256 length;\\n uint256 ptr;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts bytes to a reference to memory position and length.\\n * @param _in Input bytes to convert.\\n * @return Output memory reference.\\n */\\n function toRLPItem(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem memory\\n )\\n {\\n uint256 ptr;\\n assembly {\\n ptr := add(_in, 32)\\n }\\n\\n return RLPItem({\\n length: _in.length,\\n ptr: ptr\\n });\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n (\\n uint256 listOffset,\\n ,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.LIST_ITEM,\\n \\\"Invalid RLP list value.\\\"\\n );\\n\\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\\n // writing to the length. Since we can't know the number of RLP items without looping over\\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\\n // simply set a reasonable maximum list length and decrease the size before we finish.\\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\\n\\n uint256 itemCount = 0;\\n uint256 offset = listOffset;\\n while (offset < _in.length) {\\n require(\\n itemCount < MAX_LIST_LENGTH,\\n \\\"Provided RLP list exceeds max list length.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n ) = _decodeLength(RLPItem({\\n length: _in.length - offset,\\n ptr: _in.ptr + offset\\n }));\\n\\n out[itemCount] = RLPItem({\\n length: itemLength + itemOffset,\\n ptr: _in.ptr + offset\\n });\\n\\n itemCount += 1;\\n offset += itemOffset + itemLength;\\n }\\n\\n // Decrease the array size to match the actual item count.\\n assembly {\\n mstore(out, itemCount)\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n return readList(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes value.\\\"\\n );\\n\\n return _copy(_in.ptr, itemOffset, itemLength);\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return readBytes(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return string(readBytes(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return readString(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n require(\\n _in.length <= 33,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr + itemOffset;\\n bytes32 out;\\n assembly {\\n out := mload(ptr)\\n\\n // Shift the bytes over to match the item size.\\n if lt(itemLength, 32) {\\n out := div(out, exp(256, sub(32, itemLength)))\\n }\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return readBytes32(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return uint256(readBytes32(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return readUint256(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n require(\\n _in.length == 1,\\n \\\"Invalid RLP boolean value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 out;\\n assembly {\\n out := byte(0, mload(ptr))\\n }\\n\\n require(\\n out == 0 || out == 1,\\n \\\"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\\\"\\n );\\n\\n return out != 0;\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return readBool(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n if (_in.length == 1) {\\n return address(0);\\n }\\n\\n require(\\n _in.length == 21,\\n \\\"Invalid RLP address value.\\\"\\n );\\n\\n return address(readUint256(_in));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return readAddress(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads the raw bytes of an RLP item.\\n * @param _in RLP item to read.\\n * @return Raw RLP bytes.\\n */\\n function readRawBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in);\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Decodes the length of an RLP item.\\n * @param _in RLP item to decode.\\n * @return Offset of the encoded data.\\n * @return Length of the encoded data.\\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\\n */\\n function _decodeLength(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n uint256,\\n uint256,\\n RLPItemType\\n )\\n {\\n require(\\n _in.length > 0,\\n \\\"RLP item cannot be null.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 prefix;\\n assembly {\\n prefix := byte(0, mload(ptr))\\n }\\n\\n if (prefix <= 0x7f) {\\n // Single byte.\\n\\n return (0, 1, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xb7) {\\n // Short string.\\n\\n uint256 strLen = prefix - 0x80;\\n\\n require(\\n _in.length > strLen,\\n \\\"Invalid RLP short string.\\\"\\n );\\n\\n return (1, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xbf) {\\n // Long string.\\n uint256 lenOfStrLen = prefix - 0xb7;\\n\\n require(\\n _in.length > lenOfStrLen,\\n \\\"Invalid RLP long string length.\\\"\\n );\\n\\n uint256 strLen;\\n assembly {\\n // Pick out the string length.\\n strLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfStrLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfStrLen + strLen,\\n \\\"Invalid RLP long string.\\\"\\n );\\n\\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xf7) {\\n // Short list.\\n uint256 listLen = prefix - 0xc0;\\n\\n require(\\n _in.length > listLen,\\n \\\"Invalid RLP short list.\\\"\\n );\\n\\n return (1, listLen, RLPItemType.LIST_ITEM);\\n } else {\\n // Long list.\\n uint256 lenOfListLen = prefix - 0xf7;\\n\\n require(\\n _in.length > lenOfListLen,\\n \\\"Invalid RLP long list length.\\\"\\n );\\n\\n uint256 listLen;\\n assembly {\\n // Pick out the list length.\\n listLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfListLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfListLen + listLen,\\n \\\"Invalid RLP long list.\\\"\\n );\\n\\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\\n }\\n }\\n\\n /**\\n * Copies the bytes from a memory location.\\n * @param _src Pointer to the location to read from.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Copied bytes.\\n */\\n function _copy(\\n uint256 _src,\\n uint256 _offset,\\n uint256 _length\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out = new bytes(_length);\\n if (out.length == 0) {\\n return out;\\n }\\n\\n uint256 src = _src + _offset;\\n uint256 dest;\\n assembly {\\n dest := add(out, 32)\\n }\\n\\n // Copy over as many complete words as we can.\\n for (uint256 i = 0; i < _length / 32; i++) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n\\n src += 32;\\n dest += 32;\\n }\\n\\n // Pick out the remaining bytes.\\n uint256 mask = 256 ** (32 - (_length % 32)) - 1;\\n assembly {\\n mstore(\\n dest,\\n or(\\n and(mload(src), not(mask)),\\n and(mload(dest), mask)\\n )\\n )\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Copies an RLP item into bytes.\\n * @param _in RLP item to copy.\\n * @return Copied bytes.\\n */\\n function _copy(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in.ptr, 0, _in.length);\\n }\\n}\\n\",\"keccak256\":\"0x829174c61216dce35fdb888383b6022e0365eb7fbdc71ad79d98b108091969fe\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPWriter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/**\\n * @title Lib_RLPWriter\\n * @author Bakaoh (with modifications)\\n */\\nlibrary Lib_RLPWriter {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * RLP encodes a byte string.\\n * @param _in The byte string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded;\\n\\n if (_in.length == 1 && uint8(_in[0]) < 128) {\\n encoded = _in;\\n } else {\\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * RLP encodes a list of RLP encoded byte byte strings.\\n * @param _in The list of RLP encoded byte strings.\\n * @return The RLP encoded list of items in bytes.\\n */\\n function writeList(\\n bytes[] memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory list = _flatten(_in);\\n return abi.encodePacked(_writeLength(list.length, 192), list);\\n }\\n\\n /**\\n * RLP encodes a string.\\n * @param _in The string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeString(\\n string memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(bytes(_in));\\n }\\n\\n /**\\n * RLP encodes an address.\\n * @param _in The address to encode.\\n * @return The RLP encoded address in bytes.\\n */\\n function writeAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a bytes32 value.\\n * @param _in The bytes32 to encode.\\n * @return _out The RLP encoded bytes32 in bytes.\\n */\\n function writeBytes32(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a uint.\\n * @param _in The uint256 to encode.\\n * @return The RLP encoded uint256 in bytes.\\n */\\n function writeUint(\\n uint256 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(_toBinary(_in));\\n }\\n\\n /**\\n * RLP encodes a bool.\\n * @param _in The bool to encode.\\n * @return The RLP encoded bool in bytes.\\n */\\n function writeBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded = new bytes(1);\\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\\n return encoded;\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\\n * @param _len The length of the string or the payload.\\n * @param _offset 128 if item is string, 192 if item is list.\\n * @return RLP encoded bytes.\\n */\\n function _writeLength(\\n uint256 _len,\\n uint256 _offset\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded;\\n\\n if (_len < 56) {\\n encoded = new bytes(1);\\n encoded[0] = byte(uint8(_len) + uint8(_offset));\\n } else {\\n uint256 lenLen;\\n uint256 i = 1;\\n while (_len / i != 0) {\\n lenLen++;\\n i *= 256;\\n }\\n\\n encoded = new bytes(lenLen + 1);\\n encoded[0] = byte(uint8(lenLen) + uint8(_offset) + 55);\\n for(i = 1; i <= lenLen; i++) {\\n encoded[i] = byte(uint8((_len / (256**(lenLen-i))) % 256));\\n }\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * Encode integer in big endian binary form with no leading zeroes.\\n * @notice TODO: This should be optimized with assembly to save gas costs.\\n * @param _x The integer to encode.\\n * @return RLP encoded bytes.\\n */\\n function _toBinary(\\n uint256 _x\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory b = abi.encodePacked(_x);\\n\\n uint256 i = 0;\\n for (; i < 32; i++) {\\n if (b[i] != 0) {\\n break;\\n }\\n }\\n\\n bytes memory res = new bytes(32 - i);\\n for (uint256 j = 0; j < res.length; j++) {\\n res[j] = b[i++];\\n }\\n\\n return res;\\n }\\n\\n /**\\n * Copies a piece of memory to another location.\\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\\n * @param _dest Destination location.\\n * @param _src Source location.\\n * @param _len Length of memory to copy.\\n */\\n function _memcpy(\\n uint256 _dest,\\n uint256 _src,\\n uint256 _len\\n )\\n private\\n pure\\n {\\n uint256 dest = _dest;\\n uint256 src = _src;\\n uint256 len = _len;\\n\\n for(; len >= 32; len -= 32) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n dest += 32;\\n src += 32;\\n }\\n\\n uint256 mask = 256 ** (32 - len) - 1;\\n assembly {\\n let srcpart := and(mload(src), not(mask))\\n let destpart := and(mload(dest), mask)\\n mstore(dest, or(destpart, srcpart))\\n }\\n }\\n\\n /**\\n * Flattens a list of byte strings into one byte string.\\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\\n * @param _list List of byte strings to flatten.\\n * @return The flattened byte string.\\n */\\n function _flatten(\\n bytes[] memory _list\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n if (_list.length == 0) {\\n return new bytes(0);\\n }\\n\\n uint256 len;\\n uint256 i = 0;\\n for (; i < _list.length; i++) {\\n len += _list[i].length;\\n }\\n\\n bytes memory flattened = new bytes(len);\\n uint256 flattenedPtr;\\n assembly { flattenedPtr := add(flattened, 0x20) }\\n\\n for(i = 0; i < _list.length; i++) {\\n bytes memory item = _list[i];\\n\\n uint256 listPtr;\\n assembly { listPtr := add(item, 0x20)}\\n\\n _memcpy(flattenedPtr, listPtr, item.length);\\n flattenedPtr += _list[i].length;\\n }\\n\\n return flattened;\\n }\\n}\\n\",\"keccak256\":\"0xb60ee4b03ad372c3deff21d454ab714dd0c18ee3e6f9d45532e209fc59d5a54d\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/trie/Lib_MerkleTrie.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\n\\n/**\\n * @title Lib_MerkleTrie\\n */\\nlibrary Lib_MerkleTrie {\\n\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n enum NodeType {\\n BranchNode,\\n ExtensionNode,\\n LeafNode\\n }\\n\\n struct TrieNode {\\n bytes encoded;\\n Lib_RLPReader.RLPItem[] decoded;\\n }\\n\\n\\n /**********************\\n * Contract Constants *\\n **********************/\\n\\n // TREE_RADIX determines the number of elements per branch node.\\n uint256 constant TREE_RADIX = 16;\\n // Branch nodes have TREE_RADIX elements plus an additional `value` slot.\\n uint256 constant BRANCH_NODE_LENGTH = TREE_RADIX + 1;\\n // Leaf nodes and extension nodes always have two elements, a `path` and a `value`.\\n uint256 constant LEAF_OR_EXTENSION_NODE_LENGTH = 2;\\n\\n // Prefixes are prepended to the `path` within a leaf or extension node and\\n // allow us to differentiate between the two node types. `ODD` or `EVEN` is\\n // determined by the number of nibbles within the unprefixed `path`. If the\\n // number of nibbles if even, we need to insert an extra padding nibble so\\n // the resulting prefixed `path` has an even number of nibbles.\\n uint8 constant PREFIX_EXTENSION_EVEN = 0;\\n uint8 constant PREFIX_EXTENSION_ODD = 1;\\n uint8 constant PREFIX_LEAF_EVEN = 2;\\n uint8 constant PREFIX_LEAF_ODD = 3;\\n\\n // Just a utility constant. RLP represents `NULL` as 0x80.\\n bytes1 constant RLP_NULL = bytes1(0x80);\\n bytes constant RLP_NULL_BYTES = hex'80';\\n bytes32 constant internal KECCAK256_RLP_NULL_BYTES = keccak256(RLP_NULL_BYTES);\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * @notice Verifies a proof that a given key/value pair is present in the\\n * Merkle trie.\\n * @param _key Key of the node to search for, as a hex string.\\n * @param _value Value of the node to search for, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the desired node. Unlike\\n * traditional Merkle trees, this proof is executed top-down and consists\\n * of a list of RLP-encoded nodes that make a path down to the target node.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _verified `true` if the k/v pair exists in the trie, `false` otherwise.\\n */\\n function verifyInclusionProof(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bool _verified\\n )\\n {\\n (\\n bool exists,\\n bytes memory value\\n ) = get(_key, _proof, _root);\\n\\n return (\\n exists && Lib_BytesUtils.equal(_value, value)\\n );\\n }\\n\\n /**\\n * @notice Verifies a proof that a given key is *not* present in\\n * the Merkle trie.\\n * @param _key Key of the node to search for, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\\n * target node.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _verified `true` if the key is absent in the trie, `false` otherwise.\\n */\\n function verifyExclusionProof(\\n bytes memory _key,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bool _verified\\n )\\n {\\n (\\n bool exists,\\n ) = get(_key, _proof, _root);\\n\\n return exists == false;\\n }\\n\\n /**\\n * @notice Updates a Merkle trie and returns a new root hash.\\n * @param _key Key of the node to update, as a hex string.\\n * @param _value Value of the node to update, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\\n * target node. If the key exists, we can simply update the value.\\n * Otherwise, we need to modify the trie to handle the new k/v pair.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _updatedRoot Root hash of the newly constructed trie.\\n */\\n function update(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bytes32 _updatedRoot\\n )\\n {\\n // Special case when inserting the very first node.\\n if (_root == KECCAK256_RLP_NULL_BYTES) {\\n return getSingleNodeRootHash(_key, _value);\\n }\\n\\n TrieNode[] memory proof = _parseProof(_proof);\\n (uint256 pathLength, bytes memory keyRemainder, ) = _walkNodePath(proof, _key, _root);\\n TrieNode[] memory newPath = _getNewPath(proof, pathLength, keyRemainder, _value);\\n\\n return _getUpdatedTrieRoot(newPath, _key);\\n }\\n\\n /**\\n * @notice Retrieves the value associated with a given key.\\n * @param _key Key to search for, as hex bytes.\\n * @param _proof Merkle trie inclusion proof for the key.\\n * @param _root Known root of the Merkle trie.\\n * @return _exists Whether or not the key exists.\\n * @return _value Value of the key if it exists.\\n */\\n function get(\\n bytes memory _key,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bool _exists,\\n bytes memory _value\\n )\\n {\\n TrieNode[] memory proof = _parseProof(_proof);\\n (uint256 pathLength, bytes memory keyRemainder, bool isFinalNode) = _walkNodePath(proof, _key, _root);\\n\\n bool exists = keyRemainder.length == 0;\\n\\n require(\\n exists || isFinalNode,\\n \\\"Provided proof is invalid.\\\"\\n );\\n\\n bytes memory value = exists ? _getNodeValue(proof[pathLength - 1]) : bytes('');\\n\\n return (\\n exists,\\n value\\n );\\n }\\n\\n /**\\n * Computes the root hash for a trie with a single node.\\n * @param _key Key for the single node.\\n * @param _value Value for the single node.\\n * @return _updatedRoot Hash of the trie.\\n */\\n function getSingleNodeRootHash(\\n bytes memory _key,\\n bytes memory _value\\n )\\n internal\\n pure\\n returns (\\n bytes32 _updatedRoot\\n )\\n {\\n return keccak256(_makeLeafNode(\\n Lib_BytesUtils.toNibbles(_key),\\n _value\\n ).encoded);\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * @notice Walks through a proof using a provided key.\\n * @param _proof Inclusion proof to walk through.\\n * @param _key Key to use for the walk.\\n * @param _root Known root of the trie.\\n * @return _pathLength Length of the final path\\n * @return _keyRemainder Portion of the key remaining after the walk.\\n * @return _isFinalNode Whether or not we've hit a dead end.\\n */\\n function _walkNodePath(\\n TrieNode[] memory _proof,\\n bytes memory _key,\\n bytes32 _root\\n )\\n private\\n pure\\n returns (\\n uint256 _pathLength,\\n bytes memory _keyRemainder,\\n bool _isFinalNode\\n )\\n {\\n uint256 pathLength = 0;\\n bytes memory key = Lib_BytesUtils.toNibbles(_key);\\n\\n bytes32 currentNodeID = _root;\\n uint256 currentKeyIndex = 0;\\n uint256 currentKeyIncrement = 0;\\n TrieNode memory currentNode;\\n\\n // Proof is top-down, so we start at the first element (root).\\n for (uint256 i = 0; i < _proof.length; i++) {\\n currentNode = _proof[i];\\n currentKeyIndex += currentKeyIncrement;\\n\\n // Keep track of the proof elements we actually need.\\n // It's expensive to resize arrays, so this simply reduces gas costs.\\n pathLength += 1;\\n\\n if (currentKeyIndex == 0) {\\n // First proof element is always the root node.\\n require(\\n keccak256(currentNode.encoded) == currentNodeID,\\n \\\"Invalid root hash\\\"\\n );\\n } else if (currentNode.encoded.length >= 32) {\\n // Nodes 32 bytes or larger are hashed inside branch nodes.\\n require(\\n keccak256(currentNode.encoded) == currentNodeID,\\n \\\"Invalid large internal hash\\\"\\n );\\n } else {\\n // Nodes smaller than 31 bytes aren't hashed.\\n require(\\n Lib_BytesUtils.toBytes32(currentNode.encoded) == currentNodeID,\\n \\\"Invalid internal node hash\\\"\\n );\\n }\\n\\n if (currentNode.decoded.length == BRANCH_NODE_LENGTH) {\\n if (currentKeyIndex == key.length) {\\n // We've hit the end of the key, meaning the value should be within this branch node.\\n break;\\n } else {\\n // We're not at the end of the key yet.\\n // Figure out what the next node ID should be and continue.\\n uint8 branchKey = uint8(key[currentKeyIndex]);\\n Lib_RLPReader.RLPItem memory nextNode = currentNode.decoded[branchKey];\\n currentNodeID = _getNodeID(nextNode);\\n currentKeyIncrement = 1;\\n continue;\\n }\\n } else if (currentNode.decoded.length == LEAF_OR_EXTENSION_NODE_LENGTH) {\\n bytes memory path = _getNodePath(currentNode);\\n uint8 prefix = uint8(path[0]);\\n uint8 offset = 2 - prefix % 2;\\n bytes memory pathRemainder = Lib_BytesUtils.slice(path, offset);\\n bytes memory keyRemainder = Lib_BytesUtils.slice(key, currentKeyIndex);\\n uint256 sharedNibbleLength = _getSharedNibbleLength(pathRemainder, keyRemainder);\\n\\n if (prefix == PREFIX_LEAF_EVEN || prefix == PREFIX_LEAF_ODD) {\\n if (\\n pathRemainder.length == sharedNibbleLength &&\\n keyRemainder.length == sharedNibbleLength\\n ) {\\n // The key within this leaf matches our key exactly.\\n // Increment the key index to reflect that we have no remainder.\\n currentKeyIndex += sharedNibbleLength;\\n }\\n\\n // We've hit a leaf node, so our next node should be NULL.\\n currentNodeID = bytes32(RLP_NULL);\\n break;\\n } else if (prefix == PREFIX_EXTENSION_EVEN || prefix == PREFIX_EXTENSION_ODD) {\\n if (sharedNibbleLength == 0) {\\n // Our extension node doesn't share any part of our key.\\n // We've hit the end of this path, updates will need to modify this extension.\\n currentNodeID = bytes32(RLP_NULL);\\n break;\\n } else {\\n // Our extension shares some nibbles.\\n // Carry on to the next node.\\n currentNodeID = _getNodeID(currentNode.decoded[1]);\\n currentKeyIncrement = sharedNibbleLength;\\n continue;\\n }\\n } else {\\n revert(\\\"Received a node with an unknown prefix\\\");\\n }\\n } else {\\n revert(\\\"Received an unparseable node.\\\");\\n }\\n }\\n\\n // If our node ID is NULL, then we're at a dead end.\\n bool isFinalNode = currentNodeID == bytes32(RLP_NULL);\\n return (pathLength, Lib_BytesUtils.slice(key, currentKeyIndex), isFinalNode);\\n }\\n\\n /**\\n * @notice Creates new nodes to support a k/v pair insertion into a given\\n * Merkle trie path.\\n * @param _path Path to the node nearest the k/v pair.\\n * @param _pathLength Length of the path. Necessary because the provided\\n * path may include additional nodes (e.g., it comes directly from a proof)\\n * and we can't resize in-memory arrays without costly duplication.\\n * @param _keyRemainder Portion of the initial key that must be inserted\\n * into the trie.\\n * @param _value Value to insert at the given key.\\n * @return _newPath A new path with the inserted k/v pair and extra supporting nodes.\\n */\\n function _getNewPath(\\n TrieNode[] memory _path,\\n uint256 _pathLength,\\n bytes memory _keyRemainder,\\n bytes memory _value\\n )\\n private\\n pure\\n returns (\\n TrieNode[] memory _newPath\\n )\\n {\\n bytes memory keyRemainder = _keyRemainder;\\n\\n // Most of our logic depends on the status of the last node in the path.\\n TrieNode memory lastNode = _path[_pathLength - 1];\\n NodeType lastNodeType = _getNodeType(lastNode);\\n\\n // Create an array for newly created nodes.\\n // We need up to three new nodes, depending on the contents of the last node.\\n // Since array resizing is expensive, we'll keep track of the size manually.\\n // We're using an explicit `totalNewNodes += 1` after insertions for clarity.\\n TrieNode[] memory newNodes = new TrieNode[](3);\\n uint256 totalNewNodes = 0;\\n\\n if (keyRemainder.length == 0 && lastNodeType == NodeType.LeafNode) {\\n // We've found a leaf node with the given key.\\n // Simply need to update the value of the node to match.\\n newNodes[totalNewNodes] = _makeLeafNode(_getNodeKey(lastNode), _value);\\n totalNewNodes += 1;\\n } else if (lastNodeType == NodeType.BranchNode) {\\n if (keyRemainder.length == 0) {\\n // We've found a branch node with the given key.\\n // Simply need to update the value of the node to match.\\n newNodes[totalNewNodes] = _editBranchValue(lastNode, _value);\\n totalNewNodes += 1;\\n } else {\\n // We've found a branch node, but it doesn't contain our key.\\n // Reinsert the old branch for now.\\n newNodes[totalNewNodes] = lastNode;\\n totalNewNodes += 1;\\n // Create a new leaf node, slicing our remainder since the first byte points\\n // to our branch node.\\n newNodes[totalNewNodes] = _makeLeafNode(Lib_BytesUtils.slice(keyRemainder, 1), _value);\\n totalNewNodes += 1;\\n }\\n } else {\\n // Our last node is either an extension node or a leaf node with a different key.\\n bytes memory lastNodeKey = _getNodeKey(lastNode);\\n uint256 sharedNibbleLength = _getSharedNibbleLength(lastNodeKey, keyRemainder);\\n\\n if (sharedNibbleLength != 0) {\\n // We've got some shared nibbles between the last node and our key remainder.\\n // We'll need to insert an extension node that covers these shared nibbles.\\n bytes memory nextNodeKey = Lib_BytesUtils.slice(lastNodeKey, 0, sharedNibbleLength);\\n newNodes[totalNewNodes] = _makeExtensionNode(nextNodeKey, _getNodeHash(_value));\\n totalNewNodes += 1;\\n\\n // Cut down the keys since we've just covered these shared nibbles.\\n lastNodeKey = Lib_BytesUtils.slice(lastNodeKey, sharedNibbleLength);\\n keyRemainder = Lib_BytesUtils.slice(keyRemainder, sharedNibbleLength);\\n }\\n\\n // Create an empty branch to fill in.\\n TrieNode memory newBranch = _makeEmptyBranchNode();\\n\\n if (lastNodeKey.length == 0) {\\n // Key remainder was larger than the key for our last node.\\n // The value within our last node is therefore going to be shifted into\\n // a branch value slot.\\n newBranch = _editBranchValue(newBranch, _getNodeValue(lastNode));\\n } else {\\n // Last node key was larger than the key remainder.\\n // We're going to modify some index of our branch.\\n uint8 branchKey = uint8(lastNodeKey[0]);\\n // Move on to the next nibble.\\n lastNodeKey = Lib_BytesUtils.slice(lastNodeKey, 1);\\n\\n if (lastNodeType == NodeType.LeafNode) {\\n // We're dealing with a leaf node.\\n // We'll modify the key and insert the old leaf node into the branch index.\\n TrieNode memory modifiedLastNode = _makeLeafNode(lastNodeKey, _getNodeValue(lastNode));\\n newBranch = _editBranchIndex(newBranch, branchKey, _getNodeHash(modifiedLastNode.encoded));\\n } else if (lastNodeKey.length != 0) {\\n // We're dealing with a shrinking extension node.\\n // We need to modify the node to decrease the size of the key.\\n TrieNode memory modifiedLastNode = _makeExtensionNode(lastNodeKey, _getNodeValue(lastNode));\\n newBranch = _editBranchIndex(newBranch, branchKey, _getNodeHash(modifiedLastNode.encoded));\\n } else {\\n // We're dealing with an unnecessary extension node.\\n // We're going to delete the node entirely.\\n // Simply insert its current value into the branch index.\\n newBranch = _editBranchIndex(newBranch, branchKey, _getNodeValue(lastNode));\\n }\\n }\\n\\n if (keyRemainder.length == 0) {\\n // We've got nothing left in the key remainder.\\n // Simply insert the value into the branch value slot.\\n newBranch = _editBranchValue(newBranch, _value);\\n // Push the branch into the list of new nodes.\\n newNodes[totalNewNodes] = newBranch;\\n totalNewNodes += 1;\\n } else {\\n // We've got some key remainder to work with.\\n // We'll be inserting a leaf node into the trie.\\n // First, move on to the next nibble.\\n keyRemainder = Lib_BytesUtils.slice(keyRemainder, 1);\\n // Push the branch into the list of new nodes.\\n newNodes[totalNewNodes] = newBranch;\\n totalNewNodes += 1;\\n // Push a new leaf node for our k/v pair.\\n newNodes[totalNewNodes] = _makeLeafNode(keyRemainder, _value);\\n totalNewNodes += 1;\\n }\\n }\\n\\n // Finally, join the old path with our newly created nodes.\\n // Since we're overwriting the last node in the path, we use `_pathLength - 1`.\\n return _joinNodeArrays(_path, _pathLength - 1, newNodes, totalNewNodes);\\n }\\n\\n /**\\n * @notice Computes the trie root from a given path.\\n * @param _nodes Path to some k/v pair.\\n * @param _key Key for the k/v pair.\\n * @return _updatedRoot Root hash for the updated trie.\\n */\\n function _getUpdatedTrieRoot(\\n TrieNode[] memory _nodes,\\n bytes memory _key\\n )\\n private\\n pure\\n returns (\\n bytes32 _updatedRoot\\n )\\n {\\n bytes memory key = Lib_BytesUtils.toNibbles(_key);\\n\\n // Some variables to keep track of during iteration.\\n TrieNode memory currentNode;\\n NodeType currentNodeType;\\n bytes memory previousNodeHash;\\n\\n // Run through the path backwards to rebuild our root hash.\\n for (uint256 i = _nodes.length; i > 0; i--) {\\n // Pick out the current node.\\n currentNode = _nodes[i - 1];\\n currentNodeType = _getNodeType(currentNode);\\n\\n if (currentNodeType == NodeType.LeafNode) {\\n // Leaf nodes are already correctly encoded.\\n // Shift the key over to account for the nodes key.\\n bytes memory nodeKey = _getNodeKey(currentNode);\\n key = Lib_BytesUtils.slice(key, 0, key.length - nodeKey.length);\\n } else if (currentNodeType == NodeType.ExtensionNode) {\\n // Shift the key over to account for the nodes key.\\n bytes memory nodeKey = _getNodeKey(currentNode);\\n key = Lib_BytesUtils.slice(key, 0, key.length - nodeKey.length);\\n\\n // If this node is the last element in the path, it'll be correctly encoded\\n // and we can skip this part.\\n if (previousNodeHash.length > 0) {\\n // Re-encode the node based on the previous node.\\n currentNode = _makeExtensionNode(nodeKey, previousNodeHash);\\n }\\n } else if (currentNodeType == NodeType.BranchNode) {\\n // If this node is the last element in the path, it'll be correctly encoded\\n // and we can skip this part.\\n if (previousNodeHash.length > 0) {\\n // Re-encode the node based on the previous node.\\n uint8 branchKey = uint8(key[key.length - 1]);\\n key = Lib_BytesUtils.slice(key, 0, key.length - 1);\\n currentNode = _editBranchIndex(currentNode, branchKey, previousNodeHash);\\n }\\n }\\n\\n // Compute the node hash for the next iteration.\\n previousNodeHash = _getNodeHash(currentNode.encoded);\\n }\\n\\n // Current node should be the root at this point.\\n // Simply return the hash of its encoding.\\n return keccak256(currentNode.encoded);\\n }\\n\\n /**\\n * @notice Parses an RLP-encoded proof into something more useful.\\n * @param _proof RLP-encoded proof to parse.\\n * @return _parsed Proof parsed into easily accessible structs.\\n */\\n function _parseProof(\\n bytes memory _proof\\n )\\n private\\n pure\\n returns (\\n TrieNode[] memory _parsed\\n )\\n {\\n Lib_RLPReader.RLPItem[] memory nodes = Lib_RLPReader.readList(_proof);\\n TrieNode[] memory proof = new TrieNode[](nodes.length);\\n\\n for (uint256 i = 0; i < nodes.length; i++) {\\n bytes memory encoded = Lib_RLPReader.readBytes(nodes[i]);\\n proof[i] = TrieNode({\\n encoded: encoded,\\n decoded: Lib_RLPReader.readList(encoded)\\n });\\n }\\n\\n return proof;\\n }\\n\\n /**\\n * @notice Picks out the ID for a node. Node ID is referred to as the\\n * \\\"hash\\\" within the specification, but nodes < 32 bytes are not actually\\n * hashed.\\n * @param _node Node to pull an ID for.\\n * @return _nodeID ID for the node, depending on the size of its contents.\\n */\\n function _getNodeID(\\n Lib_RLPReader.RLPItem memory _node\\n )\\n private\\n pure\\n returns (\\n bytes32 _nodeID\\n )\\n {\\n bytes memory nodeID;\\n\\n if (_node.length < 32) {\\n // Nodes smaller than 32 bytes are RLP encoded.\\n nodeID = Lib_RLPReader.readRawBytes(_node);\\n } else {\\n // Nodes 32 bytes or larger are hashed.\\n nodeID = Lib_RLPReader.readBytes(_node);\\n }\\n\\n return Lib_BytesUtils.toBytes32(nodeID);\\n }\\n\\n /**\\n * @notice Gets the path for a leaf or extension node.\\n * @param _node Node to get a path for.\\n * @return _path Node path, converted to an array of nibbles.\\n */\\n function _getNodePath(\\n TrieNode memory _node\\n )\\n private\\n pure\\n returns (\\n bytes memory _path\\n )\\n {\\n return Lib_BytesUtils.toNibbles(Lib_RLPReader.readBytes(_node.decoded[0]));\\n }\\n\\n /**\\n * @notice Gets the key for a leaf or extension node. Keys are essentially\\n * just paths without any prefix.\\n * @param _node Node to get a key for.\\n * @return _key Node key, converted to an array of nibbles.\\n */\\n function _getNodeKey(\\n TrieNode memory _node\\n )\\n private\\n pure\\n returns (\\n bytes memory _key\\n )\\n {\\n return _removeHexPrefix(_getNodePath(_node));\\n }\\n\\n /**\\n * @notice Gets the path for a node.\\n * @param _node Node to get a value for.\\n * @return _value Node value, as hex bytes.\\n */\\n function _getNodeValue(\\n TrieNode memory _node\\n )\\n private\\n pure\\n returns (\\n bytes memory _value\\n )\\n {\\n return Lib_RLPReader.readBytes(_node.decoded[_node.decoded.length - 1]);\\n }\\n\\n /**\\n * @notice Computes the node hash for an encoded node. Nodes < 32 bytes\\n * are not hashed, all others are keccak256 hashed.\\n * @param _encoded Encoded node to hash.\\n * @return _hash Hash of the encoded node. Simply the input if < 32 bytes.\\n */\\n function _getNodeHash(\\n bytes memory _encoded\\n )\\n private\\n pure\\n returns (\\n bytes memory _hash\\n )\\n {\\n if (_encoded.length < 32) {\\n return _encoded;\\n } else {\\n return abi.encodePacked(keccak256(_encoded));\\n }\\n }\\n\\n /**\\n * @notice Determines the type for a given node.\\n * @param _node Node to determine a type for.\\n * @return _type Type of the node; BranchNode/ExtensionNode/LeafNode.\\n */\\n function _getNodeType(\\n TrieNode memory _node\\n )\\n private\\n pure\\n returns (\\n NodeType _type\\n )\\n {\\n if (_node.decoded.length == BRANCH_NODE_LENGTH) {\\n return NodeType.BranchNode;\\n } else if (_node.decoded.length == LEAF_OR_EXTENSION_NODE_LENGTH) {\\n bytes memory path = _getNodePath(_node);\\n uint8 prefix = uint8(path[0]);\\n\\n if (prefix == PREFIX_LEAF_EVEN || prefix == PREFIX_LEAF_ODD) {\\n return NodeType.LeafNode;\\n } else if (prefix == PREFIX_EXTENSION_EVEN || prefix == PREFIX_EXTENSION_ODD) {\\n return NodeType.ExtensionNode;\\n }\\n }\\n\\n revert(\\\"Invalid node type\\\");\\n }\\n\\n /**\\n * @notice Utility; determines the number of nibbles shared between two\\n * nibble arrays.\\n * @param _a First nibble array.\\n * @param _b Second nibble array.\\n * @return _shared Number of shared nibbles.\\n */\\n function _getSharedNibbleLength(\\n bytes memory _a,\\n bytes memory _b\\n )\\n private\\n pure\\n returns (\\n uint256 _shared\\n )\\n {\\n uint256 i = 0;\\n while (_a.length > i && _b.length > i && _a[i] == _b[i]) {\\n i++;\\n }\\n return i;\\n }\\n\\n /**\\n * @notice Utility; converts an RLP-encoded node into our nice struct.\\n * @param _raw RLP-encoded node to convert.\\n * @return _node Node as a TrieNode struct.\\n */\\n function _makeNode(\\n bytes[] memory _raw\\n )\\n private\\n pure\\n returns (\\n TrieNode memory _node\\n )\\n {\\n bytes memory encoded = Lib_RLPWriter.writeList(_raw);\\n\\n return TrieNode({\\n encoded: encoded,\\n decoded: Lib_RLPReader.readList(encoded)\\n });\\n }\\n\\n /**\\n * @notice Utility; converts an RLP-decoded node into our nice struct.\\n * @param _items RLP-decoded node to convert.\\n * @return _node Node as a TrieNode struct.\\n */\\n function _makeNode(\\n Lib_RLPReader.RLPItem[] memory _items\\n )\\n private\\n pure\\n returns (\\n TrieNode memory _node\\n )\\n {\\n bytes[] memory raw = new bytes[](_items.length);\\n for (uint256 i = 0; i < _items.length; i++) {\\n raw[i] = Lib_RLPReader.readRawBytes(_items[i]);\\n }\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Creates a new extension node.\\n * @param _key Key for the extension node, unprefixed.\\n * @param _value Value for the extension node.\\n * @return _node New extension node with the given k/v pair.\\n */\\n function _makeExtensionNode(\\n bytes memory _key,\\n bytes memory _value\\n )\\n private\\n pure\\n returns (\\n TrieNode memory _node\\n )\\n {\\n bytes[] memory raw = new bytes[](2);\\n bytes memory key = _addHexPrefix(_key, false);\\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\\n raw[1] = Lib_RLPWriter.writeBytes(_value);\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Creates a new leaf node.\\n * @dev This function is essentially identical to `_makeExtensionNode`.\\n * Although we could route both to a single method with a flag, it's\\n * more gas efficient to keep them separate and duplicate the logic.\\n * @param _key Key for the leaf node, unprefixed.\\n * @param _value Value for the leaf node.\\n * @return _node New leaf node with the given k/v pair.\\n */\\n function _makeLeafNode(\\n bytes memory _key,\\n bytes memory _value\\n )\\n private\\n pure\\n returns (\\n TrieNode memory _node\\n )\\n {\\n bytes[] memory raw = new bytes[](2);\\n bytes memory key = _addHexPrefix(_key, true);\\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\\n raw[1] = Lib_RLPWriter.writeBytes(_value);\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Creates an empty branch node.\\n * @return _node Empty branch node as a TrieNode struct.\\n */\\n function _makeEmptyBranchNode()\\n private\\n pure\\n returns (\\n TrieNode memory _node\\n )\\n {\\n bytes[] memory raw = new bytes[](BRANCH_NODE_LENGTH);\\n for (uint256 i = 0; i < raw.length; i++) {\\n raw[i] = RLP_NULL_BYTES;\\n }\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Modifies the value slot for a given branch.\\n * @param _branch Branch node to modify.\\n * @param _value Value to insert into the branch.\\n * @return _updatedNode Modified branch node.\\n */\\n function _editBranchValue(\\n TrieNode memory _branch,\\n bytes memory _value\\n )\\n private\\n pure\\n returns (\\n TrieNode memory _updatedNode\\n )\\n {\\n bytes memory encoded = Lib_RLPWriter.writeBytes(_value);\\n _branch.decoded[_branch.decoded.length - 1] = Lib_RLPReader.toRLPItem(encoded);\\n return _makeNode(_branch.decoded);\\n }\\n\\n /**\\n * @notice Modifies a slot at an index for a given branch.\\n * @param _branch Branch node to modify.\\n * @param _index Slot index to modify.\\n * @param _value Value to insert into the slot.\\n * @return _updatedNode Modified branch node.\\n */\\n function _editBranchIndex(\\n TrieNode memory _branch,\\n uint8 _index,\\n bytes memory _value\\n )\\n private\\n pure\\n returns (\\n TrieNode memory _updatedNode\\n )\\n {\\n bytes memory encoded = _value.length < 32 ? _value : Lib_RLPWriter.writeBytes(_value);\\n _branch.decoded[_index] = Lib_RLPReader.toRLPItem(encoded);\\n return _makeNode(_branch.decoded);\\n }\\n\\n /**\\n * @notice Utility; adds a prefix to a key.\\n * @param _key Key to prefix.\\n * @param _isLeaf Whether or not the key belongs to a leaf.\\n * @return _prefixedKey Prefixed key.\\n */\\n function _addHexPrefix(\\n bytes memory _key,\\n bool _isLeaf\\n )\\n private\\n pure\\n returns (\\n bytes memory _prefixedKey\\n )\\n {\\n uint8 prefix = _isLeaf ? uint8(0x02) : uint8(0x00);\\n uint8 offset = uint8(_key.length % 2);\\n bytes memory prefixed = new bytes(2 - offset);\\n prefixed[0] = bytes1(prefix + offset);\\n return abi.encodePacked(prefixed, _key);\\n }\\n\\n /**\\n * @notice Utility; removes a prefix from a path.\\n * @param _path Path to remove the prefix from.\\n * @return _unprefixedKey Unprefixed key.\\n */\\n function _removeHexPrefix(\\n bytes memory _path\\n )\\n private\\n pure\\n returns (\\n bytes memory _unprefixedKey\\n )\\n {\\n if (uint8(_path[0]) % 2 == 0) {\\n return Lib_BytesUtils.slice(_path, 2);\\n } else {\\n return Lib_BytesUtils.slice(_path, 1);\\n }\\n }\\n\\n /**\\n * @notice Utility; combines two node arrays. Array lengths are required\\n * because the actual lengths may be longer than the filled lengths.\\n * Array resizing is extremely costly and should be avoided.\\n * @param _a First array to join.\\n * @param _aLength Length of the first array.\\n * @param _b Second array to join.\\n * @param _bLength Length of the second array.\\n * @return _joined Combined node array.\\n */\\n function _joinNodeArrays(\\n TrieNode[] memory _a,\\n uint256 _aLength,\\n TrieNode[] memory _b,\\n uint256 _bLength\\n )\\n private\\n pure\\n returns (\\n TrieNode[] memory _joined\\n )\\n {\\n TrieNode[] memory ret = new TrieNode[](_aLength + _bLength);\\n\\n // Copy elements from the first array.\\n for (uint256 i = 0; i < _aLength; i++) {\\n ret[i] = _a[i];\\n }\\n\\n // Copy elements from the second array.\\n for (uint256 i = 0; i < _bLength; i++) {\\n ret[i + _aLength] = _b[i];\\n }\\n\\n return ret;\\n }\\n}\\n\",\"keccak256\":\"0x161f65220b8c5cf295232f8c58c2744fbc898bf77da5f9d9c5b2dd673dafc6f6\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/trie/Lib_SecureMerkleTrie.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_MerkleTrie } from \\\"./Lib_MerkleTrie.sol\\\";\\n\\n/**\\n * @title Lib_SecureMerkleTrie\\n */\\nlibrary Lib_SecureMerkleTrie {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * @notice Verifies a proof that a given key/value pair is present in the\\n * Merkle trie.\\n * @param _key Key of the node to search for, as a hex string.\\n * @param _value Value of the node to search for, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the desired node. Unlike\\n * traditional Merkle trees, this proof is executed top-down and consists\\n * of a list of RLP-encoded nodes that make a path down to the target node.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _verified `true` if the k/v pair exists in the trie, `false` otherwise.\\n */\\n function verifyInclusionProof(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bool _verified\\n )\\n {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.verifyInclusionProof(key, _value, _proof, _root);\\n }\\n\\n /**\\n * @notice Verifies a proof that a given key is *not* present in\\n * the Merkle trie.\\n * @param _key Key of the node to search for, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\\n * target node.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _verified `true` if the key is not present in the trie, `false` otherwise.\\n */\\n function verifyExclusionProof(\\n bytes memory _key,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bool _verified\\n )\\n {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.verifyExclusionProof(key, _proof, _root);\\n }\\n\\n /**\\n * @notice Updates a Merkle trie and returns a new root hash.\\n * @param _key Key of the node to update, as a hex string.\\n * @param _value Value of the node to update, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\\n * target node. If the key exists, we can simply update the value.\\n * Otherwise, we need to modify the trie to handle the new k/v pair.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _updatedRoot Root hash of the newly constructed trie.\\n */\\n function update(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bytes32 _updatedRoot\\n )\\n {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.update(key, _value, _proof, _root);\\n }\\n\\n /**\\n * @notice Retrieves the value associated with a given key.\\n * @param _key Key to search for, as hex bytes.\\n * @param _proof Merkle trie inclusion proof for the key.\\n * @param _root Known root of the Merkle trie.\\n * @return _exists Whether or not the key exists.\\n * @return _value Value of the key if it exists.\\n */\\n function get(\\n bytes memory _key,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bool _exists,\\n bytes memory _value\\n )\\n {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.get(key, _proof, _root);\\n }\\n\\n /**\\n * Computes the root hash for a trie with a single node.\\n * @param _key Key for the single node.\\n * @param _value Value for the single node.\\n * @return _updatedRoot Hash of the trie.\\n */\\n function getSingleNodeRootHash(\\n bytes memory _key,\\n bytes memory _value\\n )\\n internal\\n pure\\n returns (\\n bytes32 _updatedRoot\\n )\\n {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.getSingleNodeRootHash(key, _value);\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Computes the secure counterpart to a key.\\n * @param _key Key to get a secure key from.\\n * @return _secureKey Secure version of the key.\\n */\\n function _getSecureKey(\\n bytes memory _key\\n )\\n private\\n pure\\n returns (\\n bytes memory _secureKey\\n )\\n {\\n return abi.encodePacked(keccak256(_key));\\n }\\n}\",\"keccak256\":\"0x79355346f74bb1eb9eeb733cb5d9677d50115c4f390307cbf608fe071a1ada0c\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_Bytes32Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_Byte32Utils\\n */\\nlibrary Lib_Bytes32Utils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \\\"true.\\\"\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as a boolean.\\n */\\n function toBool(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return _in != 0;\\n }\\n\\n /**\\n * Converts a boolean to a bytes32 value.\\n * @param _in Input boolean value.\\n * @return Boolean as a bytes32.\\n */\\n function fromBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in ? 1 : 0));\\n }\\n\\n /**\\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as an address.\\n */\\n function toAddress(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return address(uint160(uint256(_in)));\\n }\\n\\n /**\\n * Converts an address to a bytes32.\\n * @param _in Input address value.\\n * @return Address as a bytes32.\\n */\\n function fromAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in));\\n }\\n\\n /**\\n * Removes the leading zeros from a bytes32 value and returns a new (smaller) bytes value.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 without any leading zeros.\\n */\\n function removeLeadingZeros(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out;\\n\\n assembly {\\n // Figure out how many leading zero bytes to remove.\\n let shift := 0\\n for { let i := 0 } and(lt(i, 32), eq(byte(i, _in), 0)) { i := add(i, 1) } {\\n shift := add(shift, 1)\\n }\\n\\n // Reserve some space for our output and fix the free memory pointer.\\n out := mload(0x40)\\n mstore(0x40, add(out, 0x40))\\n\\n // Shift the value and store it into the output bytes.\\n mstore(add(out, 0x20), shl(mul(shift, 8), _in))\\n\\n // Store the new size (with leading zero bytes removed) in the output byte size.\\n mstore(out, sub(32, shift))\\n }\\n\\n return out;\\n }\\n}\\n\",\"keccak256\":\"0xfa2def593e3fc56a31852c3744aefdaa93cec74e721bfcfeb1e5d166c7c60b64\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_BytesUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_BytesUtils\\n */\\nlibrary Lib_BytesUtils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_start + _length >= _start, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n if (_bytes.length - _start == 0) {\\n return bytes('');\\n }\\n\\n return slice(_bytes, _start, _bytes.length - _start);\\n }\\n\\n function toBytes32PadLeft(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n bytes32 ret;\\n uint256 len = _bytes.length <= 32 ? _bytes.length : 32;\\n assembly {\\n ret := shr(mul(sub(32, len), 8), mload(add(_bytes, 32)))\\n }\\n return ret;\\n }\\n\\n function toBytes32(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n if (_bytes.length < 32) {\\n bytes32 ret;\\n assembly {\\n ret := mload(add(_bytes, 32))\\n }\\n return ret;\\n }\\n\\n return abi.decode(_bytes,(bytes32)); // will truncate if input length > 32 bytes\\n }\\n\\n function toUint256(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return uint256(toBytes32(_bytes));\\n }\\n\\n function toUint24(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n uint24\\n )\\n {\\n require(_start + 3 >= _start, \\\"toUint24_overflow\\\");\\n require(_bytes.length >= _start + 3 , \\\"toUint24_outOfBounds\\\");\\n uint24 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x3), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toUint8(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n uint8\\n )\\n {\\n require(_start + 1 >= _start, \\\"toUint8_overflow\\\");\\n require(_bytes.length >= _start + 1 , \\\"toUint8_outOfBounds\\\");\\n uint8 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x1), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toAddress(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n require(_start + 20 >= _start, \\\"toAddress_overflow\\\");\\n require(_bytes.length >= _start + 20, \\\"toAddress_outOfBounds\\\");\\n address tempAddress;\\n\\n assembly {\\n tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000)\\n }\\n\\n return tempAddress;\\n }\\n\\n function toNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory nibbles = new bytes(_bytes.length * 2);\\n\\n for (uint256 i = 0; i < _bytes.length; i++) {\\n nibbles[i * 2] = _bytes[i] >> 4;\\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\\n }\\n\\n return nibbles;\\n }\\n\\n function fromNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory ret = new bytes(_bytes.length / 2);\\n\\n for (uint256 i = 0; i < ret.length; i++) {\\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\\n }\\n\\n return ret;\\n }\\n\\n function equal(\\n bytes memory _bytes,\\n bytes memory _other\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return keccak256(_bytes) == keccak256(_other);\\n }\\n}\\n\",\"keccak256\":\"0xa5195afe32fb2cf104d156e8f4bd39df1ec79bf6ba232097b9e8e0ee14fbc298\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x6080604052600480546001600160a01b03191661dead17905534801561002457600080fd5b50600580546001600160a01b031916905561312f806100446000396000f3fe608060405234801561001057600080fd5b50600436106101215760003560e01c806381ada46c116100ad578063c4d66de811610071578063c4d66de814610213578063c6b94ab014610226578063d7fd19dd14610239578063ecc704281461024c578063f2fde38b1461026157610121565b806381ada46c146101ca57806382e3702d146101dd5780638456cb59146101f05780638da5cb5b146101f8578063b1b1b2091461020057610121565b8063461a4478116100f4578063461a44781461018c5780635c975abb1461019f5780636e296e45146101a7578063706ceab6146101af578063715018a6146101c257610121565b80630ecf2eea1461012657806321d800ec1461013b578063299ca478146101645780633dbb202b14610179575b600080fd5b610139610134366004612aba565b610274565b005b61014e610149366004612aba565b610319565b60405161015b9190612cd0565b60405180910390f35b61016c61032e565b60405161015b9190612c58565b610139610187366004612a3e565b61033d565b61016c61019a366004612ad2565b6103cc565b61014e6104a8565b61016c6104b1565b6101396101bd3660046129c7565b6104fa565b610139610561565b6101396101d8366004612aba565b61060d565b61014e6101eb366004612aba565b6106af565b6101396106c4565b61016c610730565b61014e61020e366004612aba565b61073f565b61013961022136600461287e565b610754565b61014e610234366004612aba565b610882565b610139610247366004612898565b610897565b610254610bd6565b60405161015b9190612ba1565b61013961026f36600461287e565b610bdc565b61027c610cdf565b6001600160a01b031661028d610730565b6001600160a01b0316146102d6576040805162461bcd60e51b815260206004820181905260248201526000805160206130da833981519152604482015290519081900360640190fd5b600081815260ce6020526040808220805460ff191660011790555182917ff52508d5339edf0d7e5060a416df98db067af561bdc60872d29c0439eaa13a0291a250565b60006020819052908152604090205460ff1681565b6005546001600160a01b031681565b600061034d843385600354610ce3565b60038054600190810190915581516020808401919091206000908152600290915260409020805460ff19169091179055905061038f8163ffffffff8416610d30565b7f0ee9ffdb2334d78de97ffb066b23a352a4d35180cefb36589d663fbb1eb6f326816040516103be9190612d52565b60405180910390a150505050565b60055460405163bf40fac160e01b81526020600482018181528451602484015284516000946001600160a01b03169363bf40fac1938793928392604401918501908083838b5b8381101561042a578181015183820152602001610412565b50505050905090810190601f1680156104575780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561047457600080fd5b505afa158015610488573d6000803e3d6000fd5b505050506040513d602081101561049e57600080fd5b505190505b919050565b606a5460ff1690565b6004546000906001600160a01b031661dead14156104ea5760405162461bcd60e51b81526004016104e190612d65565b60405180910390fd5b506004546001600160a01b031690565b600061050886868686610ce3565b805160208083019190912060009081526002909152604090205490915060ff1615156001146105495760405162461bcd60e51b81526004016104e190612e5a565b610559818363ffffffff16610d30565b505050505050565b610569610cdf565b6001600160a01b031661057a610730565b6001600160a01b0316146105c3576040805162461bcd60e51b815260206004820181905260248201526000805160206130da833981519152604482015290519081900360640190fd5b6038546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3603880546001600160a01b0319169055565b610615610cdf565b6001600160a01b0316610626610730565b6001600160a01b03161461066f576040805162461bcd60e51b815260206004820181905260248201526000805160206130da833981519152604482015290519081900360640190fd5b600081815260ce6020526040808220805460ff191690555182917f52c8a2680a9f4cc0ad0bf88f32096eadbebf0646ea611d93a0ce6a29a024040591a250565b60026020526000908152604090205460ff1681565b6106cc610cdf565b6001600160a01b03166106dd610730565b6001600160a01b031614610726576040805162461bcd60e51b815260206004820181905260248201526000805160206130da833981519152604482015290519081900360640190fd5b61072e610e08565b565b6038546001600160a01b031690565b60016020526000908152604090205460ff1681565b600554600160a81b900460ff168061076f575061076f610ea8565b806107845750600554600160a01b900460ff16155b6107bf5760405162461bcd60e51b815260040180806020018281038252602e815260200180613086602e913960400191505060405180910390fd5b600554600160a81b900460ff161580156107f6576005805460ff60a01b1960ff60a81b19909116600160a81b1716600160a01b1790555b6005546001600160a01b03161561081f5760405162461bcd60e51b81526004016104e190612f84565b600580546001600160a01b0384166001600160a01b0319918216179091556004805490911661dead179055610852610eb9565b61085a610f72565b610862611082565b61086a611144565b801561087e576005805460ff60a81b191690555b5050565b60ce6020526000908152604090205460ff1681565b6002609c5414156108ef576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6002609c5560408051808201909152601481527327ab26afa61926b2b9b9b0b3b2a932b630bcb2b960611b602082015260009061092b906103cc565b90506001600160a01b0381161561096457336001600160a01b038216146109645760405162461bcd60e51b81526004016104e190612ee7565b61096c6104a8565b156109b1576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b60006109bf87878787610ce3565b90506109cb8184611201565b15156001146109ec5760405162461bcd60e51b81526004016104e190612f3d565b80516020808301919091206000818152600190925260409091205460ff1615610a275760405162461bcd60e51b81526004016104e190612d9c565b600081815260ce602052604090205460ff1615610a565760405162461bcd60e51b81526004016104e190612ea5565b600480546001600160a01b0319166001600160a01b03898116919091179091556040516000918a1690610a8a908990612bb8565b6000604051808303816000865af19150503d8060008114610ac7576040519150601f19603f3d011682016040523d82523d6000602084013e610acc565b606091505b5050600480546001600160a01b03191661dead179055905080151560011415610b4757600082815260016020819052604091829020805460ff19169091179055517f4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c90610b3a908490612ba1565b60405180910390a1610b7f565b7f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f82604051610b769190612ba1565b60405180910390a15b6000833343604051602001610b9693929190612c06565b60408051601f1981840301815291815281516020928301206000908152918290529020805460ff19166001908117909155609c5550505050505050505050565b60035481565b610be4610cdf565b6001600160a01b0316610bf5610730565b6001600160a01b031614610c3e576040805162461bcd60e51b815260206004820181905260248201526000805160206130da833981519152604482015290519081900360640190fd5b6001600160a01b038116610c835760405162461bcd60e51b81526004018080602001828103825260268152602001806130366026913960400191505060405180910390fd5b6038546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3603880546001600160a01b0319166001600160a01b0392909216919091179055565b3390565b606084848484604051602401610cfc9493929190612c6c565b60408051601f198184030181529190526020810180516001600160e01b031663cbd4ece960e01b1790529050949350505050565b610d6e6040518060400160405280601d81526020017f4f564d5f43616e6f6e6963616c5472616e73616374696f6e436861696e0000008152506103cc565b6001600160a01b0316636fee07e0610dba6040518060400160405280601a81526020017f4f564d5f4c3243726f7373446f6d61696e4d657373656e6765720000000000008152506103cc565b83856040518463ffffffff1660e01b8152600401610dda93929190612ca9565b600060405180830381600087803b158015610df457600080fd5b505af1158015610559573d6000803e3d6000fd5b610e106104a8565b15610e55576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b606a805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258610e8b610cdf565b604080516001600160a01b039092168252519081900360200190a1565b6000610eb330611226565b15905090565b600554600160a81b900460ff1680610ed45750610ed4610ea8565b80610ee95750600554600160a01b900460ff16155b610f245760405162461bcd60e51b815260040180806020018281038252602e815260200180613086602e913960400191505060405180910390fd5b600554600160a81b900460ff16158015610f5b576005805460ff60a01b1960ff60a81b19909116600160a81b1716600160a01b1790555b8015610f6f576005805460ff60a81b191690555b50565b600554600160a81b900460ff1680610f8d5750610f8d610ea8565b80610fa25750600554600160a01b900460ff16155b610fdd5760405162461bcd60e51b815260040180806020018281038252602e815260200180613086602e913960400191505060405180910390fd5b600554600160a81b900460ff16158015611014576005805460ff60a01b1960ff60a81b19909116600160a81b1716600160a01b1790555b600061101e610cdf565b603880546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3508015610f6f576005805460ff60a81b1916905550565b600554600160a81b900460ff168061109d575061109d610ea8565b806110b25750600554600160a01b900460ff16155b6110ed5760405162461bcd60e51b815260040180806020018281038252602e815260200180613086602e913960400191505060405180910390fd5b600554600160a81b900460ff16158015611124576005805460ff60a01b1960ff60a81b19909116600160a81b1716600160a01b1790555b606a805460ff191690558015610f6f576005805460ff60a81b1916905550565b600554600160a81b900460ff168061115f575061115f610ea8565b806111745750600554600160a01b900460ff16155b6111af5760405162461bcd60e51b815260040180806020018281038252602e815260200180613086602e913960400191505060405180910390fd5b600554600160a81b900460ff161580156111e6576005805460ff60a01b1960ff60a81b19909116600160a81b1716600160a01b1790555b6001609c558015610f6f576005805460ff60a81b1916905550565b600061120c8261122c565b801561121d575061121d8383611389565b90505b92915050565b3b151590565b60008061126d6040518060400160405280601881526020017f4f564d5f5374617465436f6d6d69746d656e74436861696e00000000000000008152506103cc565b6020840151604051639418bddd60e01b81529192506001600160a01b03831691639418bddd9161129f91600401612fce565b60206040518083038186803b1580156112b757600080fd5b505afa1580156112cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112ef9190612a9a565b1580156113825750825160208401516040808601519051634d69ee5760e01b81526001600160a01b03851693634d69ee5793611332939192909190600401612cdb565b60206040518083038186803b15801561134a57600080fd5b505afa15801561135e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113829190612a9a565b9392505050565b600080836113cb6040518060400160405280601a81526020017f4f564d5f4c3243726f7373446f6d61696e4d657373656e6765720000000000008152506103cc565b6040516020016113dc929190612bd4565b604051602081830303815290604052805190602001206000604051602001611405929190612baa565b604051602081830303815290604052805190602001209050600080611454602160991b6040516020016114389190612b89565b60408051601f19818403018152919052606087015187516114e6565b909250905060018215151461147b5760405162461bcd60e51b81526004016104e190612de7565b60006114868261150f565b90506114db8460405160200161149c9190612ba1565b60405160208183030381529060405260016040516020016114bd9190612c40565b604051602081830303815290604052886080015184604001516115a1565b979650505050505050565b6000606060006114f5866115c5565b90506115028186866115f5565b9250925050935093915050565b611517612634565b6000611522836116c8565b9050604051806080016040528061154c8360008151811061153f57fe5b60200260200101516116db565b81526020016115618360018151811061153f57fe5b81526020016115838360028151811061157657fe5b60200260200101516116e2565b81526020016115988360038151811061157657fe5b90529392505050565b6000806115ad866115c5565b90506115bb818686866117db565b9695505050505050565b606081805190602001206040516020016115df9190612ba1565b6040516020818303038152906040529050919050565b60006060600061160485611801565b90506000806000611616848a896118d8565b8151929550909350915015808061162a5750815b61167b576040805162461bcd60e51b815260206004820152601a60248201527f50726f76696465642070726f6f6620697320696e76616c69642e000000000000604482015290519081900360640190fd5b60008161169757604051806020016040528060008152506116b6565b6116b68660018703815181106116a957fe5b6020026020010151611c7b565b919b919a509098505050505050505050565b60606112206116d683611c97565b611cbc565b6000611220825b600060218260000151111561173e576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e000000000000604482015290519081900360640190fd5b600080600061174c85611e32565b91945092509050600081600181111561176157fe5b146117b3576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e000000000000604482015290519081900360640190fd5b6020808601518401805190918410156115bb5760208490036101000a90049695505050505050565b60008060006117eb8786866115f5565b915091508180156114db57506114db868261215b565b6060600061180e836116c8565b90506000815167ffffffffffffffff8111801561182a57600080fd5b5060405190808252806020026020018201604052801561186457816020015b61185161265b565b8152602001906001900390816118495790505b50905060005b82518110156118d057600061189184838151811061188457fe5b6020026020010151612171565b905060405180604001604052808281526020016118ad836116c8565b8152508383815181106118bc57fe5b60209081029190910101525060010161186a565b509392505050565b600060608180806118e887612200565b9050856000806118f661265b565b60005b8c51811015611c53578c818151811061190e57fe5b60200260200101519150828401935060018701965083600014156119825781518051602090910120851461197d576040805162461bcd60e51b8152602060048201526011602482015270092dcecc2d8d2c840e4dedee840d0c2e6d607b1b604482015290519081900360640190fd5b611a49565b8151516020116119e95781518051602090910120851461197d576040805162461bcd60e51b815260206004820152601b60248201527f496e76616c6964206c6172676520696e7465726e616c20686173680000000000604482015290519081900360640190fd5b846119f783600001516122fd565b14611a49576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420696e7465726e616c206e6f64652068617368000000000000604482015290519081900360640190fd5b60208201515160111415611ab8578551841415611a6557611c53565b6000868581518110611a7357fe5b602001015160f81c60f81b60f81c9050600083602001518260ff1681518110611a9857fe5b60200260200101519050611aab81612329565b9650600194505050611c4b565b60028260200151511415611bfe576000611ad18361235f565b9050600081600081518110611ae257fe5b016020015160f81c9050600181166002036000611b028460ff841661237d565b90506000611b108b8a61237d565b90506000611b1e83836123ae565b905060ff851660021480611b35575060ff85166003145b15611b6757808351148015611b4a5750808251145b15611b5457988901985b50600160ff1b9950611c53945050505050565b60ff85161580611b7a575060ff85166001145b15611bc75780611b975750600160ff1b9950611c53945050505050565b611bb88860200151600181518110611bab57fe5b6020026020010151612329565b9a509750611c4b945050505050565b60405162461bcd60e51b81526004018080602001828103825260268152602001806130b46026913960400191505060405180910390fd5b6040805162461bcd60e51b815260206004820152601d60248201527f526563656976656420616e20756e706172736561626c65206e6f64652e000000604482015290519081900360640190fd5b6001016118f9565b50600160ff1b841486611c66878661237d565b909e909d50909b509950505050505050505050565b6020810151805160609161122091600019810190811061188457fe5b611c9f612675565b506040805180820190915281518152602082810190820152919050565b6060600080611cca84611e32565b91935090915060019050816001811115611ce057fe5b14611d32576040805162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c50206c6973742076616c75652e000000000000000000604482015290519081900360640190fd5b6040805160208082526104208201909252600091816020015b611d53612675565b815260200190600190039081611d4b5790505090506000835b8651811015611e275760208210611db45760405162461bcd60e51b815260040180806020018281038252602a81526020018061305c602a913960400191505060405180910390fd5b600080611de06040518060400160405280858c60000151038152602001858c6020015101815250611e32565b509150915060405180604001604052808383018152602001848b6020015101815250858581518110611e0e57fe5b6020908102919091010152600193909301920101611d6c565b508152949350505050565b600080600080846000015111611e8f576040805162461bcd60e51b815260206004820152601860248201527f524c50206974656d2063616e6e6f74206265206e756c6c2e0000000000000000604482015290519081900360640190fd5b6020840151805160001a607f8111611eb4576000600160009450945094505050612154565b60b78111611f29578551607f198201908110611f17576040805162461bcd60e51b815260206004820152601960248201527f496e76616c696420524c502073686f727420737472696e672e00000000000000604482015290519081900360640190fd5b60019550935060009250612154915050565b60bf811161200d57855160b6198201908110611f8c576040805162461bcd60e51b815260206004820152601f60248201527f496e76616c696420524c50206c6f6e6720737472696e67206c656e6774682e00604482015290519081900360640190fd5b6000816020036101000a6001850151049050808201886000015111611ff8576040805162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c50206c6f6e6720737472696e672e0000000000000000604482015290519081900360640190fd5b60019091019550935060009250612154915050565b60f7811161208157855160bf198201908110612070576040805162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c502073686f7274206c6973742e000000000000000000604482015290519081900360640190fd5b600195509350849250612154915050565b855160f61982019081106120dc576040805162461bcd60e51b815260206004820152601d60248201527f496e76616c696420524c50206c6f6e67206c697374206c656e6774682e000000604482015290519081900360640190fd5b6000816020036101000a6001850151049050808201886000015111612141576040805162461bcd60e51b815260206004820152601660248201527524b73b30b634b210292628103637b733903634b9ba1760511b604482015290519081900360640190fd5b6001918201965094509250612154915050565b9193909250565b8051602091820120825192909101919091201490565b6060600080600061218185611e32565b91945092509050600081600181111561219657fe5b146121e8576040805162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c502062797465732076616c75652e0000000000000000604482015290519081900360640190fd5b6121f785602001518484612414565b95945050505050565b60606000825160020267ffffffffffffffff8111801561221f57600080fd5b506040519080825280601f01601f19166020018201604052801561224a576020820181803683370190505b50905060005b83518110156122f657600484828151811061226757fe5b602001015160f81c60f81b6001600160f81b031916901c82826002028151811061228d57fe5b60200101906001600160f81b031916908160001a90535060108482815181106122b257fe5b016020015160f81c816122c157fe5b0660f81b8282600202600101815181106122d757fe5b60200101906001600160f81b031916908160001a905350600101612250565b5092915050565b6000602082511015612314575060208101516104a3565b81806020019051602081101561049e57600080fd5b6000606060208360000151101561234a57612343836124c2565b9050612356565b61235383612171565b90505b611382816122fd565b6060611220612378836020015160008151811061188457fe5b612200565b606081835103600014156123a05750604080516020810190915260008152611220565b61121d8383848651036124cd565b6000805b8084511180156123c25750808351115b801561240757508281815181106123d557fe5b602001015160f81c60f81b6001600160f81b0319168482815181106123f657fe5b01602001516001600160f81b031916145b1561121d576001016123b2565b606060008267ffffffffffffffff8111801561242f57600080fd5b506040519080825280601f01601f19166020018201604052801561245a576020820181803683370190505b50905080516000141561246e579050611382565b8484016020820160005b60208604811015612499578251825260209283019290910190600101612478565b5080519151601f959095166020036101000a600019019182169119909416179092525092915050565b60606112208261261e565b60608182601f011015612518576040805162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b604482015290519081900360640190fd5b828284011015612560576040805162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b604482015290519081900360640190fd5b818301845110156125ac576040805162461bcd60e51b8152602060048201526011602482015270736c6963655f6f75744f66426f756e647360781b604482015290519081900360640190fd5b6060821580156125cb5760405191506000825260208201604052612615565b6040519150601f8416801560200281840101858101878315602002848b0101015b818310156126045780518352602092830192016125ec565b5050858452601f01601f1916604052505b50949350505050565b6060611220826020015160008460000151612414565b60408051608081018252600080825260208201819052918101829052606081019190915290565b604051806040016040528060608152602001606081525090565b604051806040016040528060008152602001600081525090565b600067ffffffffffffffff8311156126a357fe5b6126b6601f8401601f1916602001612fe1565b90508281528383830111156126ca57600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b03811681146104a357600080fd5b600082601f830112612708578081fd5b61121d8383356020850161268f565b600060a08284031215612728578081fd5b60405160a0810167ffffffffffffffff828210818311171561274657fe5b8160405282935084358352602085013560208401526040850135604084015260608501356060840152608085013591508082111561278357600080fd5b50612790858286016126f8565b6080830152505092915050565b6000604082840312156127ae578081fd5b6040516040810167ffffffffffffffff82821081831117156127cc57fe5b81604052829350843583526020915081850135818111156127ec57600080fd5b8501601f810187136127fd57600080fd5b80358281111561280957fe5b8381029250612819848401612fe1565b8181528481019083860185850187018b101561283457600080fd5b600095505b83861015612857578035835260019590950194918601918601612839565b5080868801525050505050505092915050565b803563ffffffff811681146104a357600080fd5b60006020828403121561288f578081fd5b61121d826126e1565b600080600080600060a086880312156128af578081fd5b6128b8866126e1565b94506128c6602087016126e1565b9350604086013567ffffffffffffffff808211156128e2578283fd5b6128ee89838a016126f8565b945060608801359350608088013591508082111561290a578283fd5b9087019060a0828a03121561291d578283fd5b61292760a0612fe1565b8235815260208301358281111561293c578485fd5b6129488b828601612717565b60208301525060408301358281111561295f578485fd5b61296b8b82860161279d565b604083015250606083013582811115612982578485fd5b61298e8b8286016126f8565b6060830152506080830135828111156129a5578485fd5b6129b18b8286016126f8565b6080830152508093505050509295509295909350565b600080600080600060a086880312156129de578081fd5b6129e7866126e1565b94506129f5602087016126e1565b9350604086013567ffffffffffffffff811115612a10578182fd5b612a1c888289016126f8565b93505060608601359150612a326080870161286a565b90509295509295909350565b600080600060608486031215612a52578283fd5b612a5b846126e1565b9250602084013567ffffffffffffffff811115612a76578283fd5b612a82868287016126f8565b925050612a916040850161286a565b90509250925092565b600060208284031215612aab578081fd5b8151801515811461121d578182fd5b600060208284031215612acb578081fd5b5035919050565b600060208284031215612ae3578081fd5b813567ffffffffffffffff811115612af9578182fd5b8201601f81018413612b09578182fd5b612b188482356020840161268f565b949350505050565b60008151808452612b38816020860160208601613005565b601f01601f19169290920160200192915050565b600081518352602082015160208401526040820151604084015260608201516060840152608082015160a06080850152612b1860a0850182612b20565b60609190911b6001600160601b031916815260140190565b90815260200190565b918252602082015260400190565b60008251612bca818460208701613005565b9190910192915050565b60008351612be6818460208801613005565b60609390931b6001600160601b0319169190920190815260140192915050565b60008451612c18818460208901613005565b60609490941b6001600160601b03191691909301908152601481019190915260340192915050565b60f89190911b6001600160f81b031916815260010190565b6001600160a01b0391909116815260200190565b6001600160a01b03858116825284166020820152608060408201819052600090612c9890830185612b20565b905082606083015295945050505050565b600060018060a01b0385168252836020830152606060408301526121f76060830184612b20565b901515815260200190565b60008482526020606081840152612cf56060840186612b4c565b838103604085015260408101855182528286015160408484015281815180845260608501915085830194508693505b80841015612d445784518252938501936001939093019290850190612d24565b509998505050505050505050565b60006020825261121d6020830184612b20565b6020808252601f908201527f78446f6d61696e4d65737361676553656e646572206973206e6f742073657400604082015260600190565b6020808252602b908201527f50726f7669646564206d6573736167652068617320616c72656164792062656560408201526a37103932b1b2b4bb32b21760a91b606082015260800190565b6020808252604d908201527f4d6573736167652070617373696e67207072656465706c6f7920686173206e6f60408201527f74206265656e20696e697469616c697a6564206f7220696e76616c696420707260608201526c37b7b310383937bb34b232b21760991b608082015260a00190565b6020808252602b908201527f50726f7669646564206d65737361676520686173206e6f7420616c726561647960408201526a103132b2b71039b2b73a1760a91b606082015260800190565b60208082526022908201527f50726f7669646564206d65737361676520686173206265656e20626c6f636b65604082015261321760f11b606082015260800190565b60208082526036908201527f4f6e6c79204f564d5f4c324d65737361676552656c617965722063616e2072656040820152753630bc90261916ba3796a6189036b2b9b9b0b3b2b99760511b606082015260800190565b60208082526027908201527f50726f7669646564206d65737361676520636f756c64206e6f742062652076656040820152663934b334b2b21760c91b606082015260800190565b6020808252602a908201527f4c3143726f7373446f6d61696e4d657373656e67657220616c72656164792069604082015269373a34b0b634bd32b21760b11b606082015260800190565b60006020825261121d6020830184612b4c565b60405181810167ffffffffffffffff81118282101715612ffd57fe5b604052919050565b60005b83811015613020578181015183820152602001613008565b8381111561302f576000848401525b5050505056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737350726f766964656420524c50206c6973742065786365656473206d6178206c697374206c656e6774682e496e697469616c697a61626c653a20636f6e747261637420697320616c726561647920696e697469616c697a656452656365697665642061206e6f6465207769746820616e20756e6b6e6f776e207072656669784f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a2646970667358221220c8b08248358fc9118d8d145603700ec8109487e93128f8f4b5dafd0a63cf3bad64736f6c63430007060033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101215760003560e01c806381ada46c116100ad578063c4d66de811610071578063c4d66de814610213578063c6b94ab014610226578063d7fd19dd14610239578063ecc704281461024c578063f2fde38b1461026157610121565b806381ada46c146101ca57806382e3702d146101dd5780638456cb59146101f05780638da5cb5b146101f8578063b1b1b2091461020057610121565b8063461a4478116100f4578063461a44781461018c5780635c975abb1461019f5780636e296e45146101a7578063706ceab6146101af578063715018a6146101c257610121565b80630ecf2eea1461012657806321d800ec1461013b578063299ca478146101645780633dbb202b14610179575b600080fd5b610139610134366004612aba565b610274565b005b61014e610149366004612aba565b610319565b60405161015b9190612cd0565b60405180910390f35b61016c61032e565b60405161015b9190612c58565b610139610187366004612a3e565b61033d565b61016c61019a366004612ad2565b6103cc565b61014e6104a8565b61016c6104b1565b6101396101bd3660046129c7565b6104fa565b610139610561565b6101396101d8366004612aba565b61060d565b61014e6101eb366004612aba565b6106af565b6101396106c4565b61016c610730565b61014e61020e366004612aba565b61073f565b61013961022136600461287e565b610754565b61014e610234366004612aba565b610882565b610139610247366004612898565b610897565b610254610bd6565b60405161015b9190612ba1565b61013961026f36600461287e565b610bdc565b61027c610cdf565b6001600160a01b031661028d610730565b6001600160a01b0316146102d6576040805162461bcd60e51b815260206004820181905260248201526000805160206130da833981519152604482015290519081900360640190fd5b600081815260ce6020526040808220805460ff191660011790555182917ff52508d5339edf0d7e5060a416df98db067af561bdc60872d29c0439eaa13a0291a250565b60006020819052908152604090205460ff1681565b6005546001600160a01b031681565b600061034d843385600354610ce3565b60038054600190810190915581516020808401919091206000908152600290915260409020805460ff19169091179055905061038f8163ffffffff8416610d30565b7f0ee9ffdb2334d78de97ffb066b23a352a4d35180cefb36589d663fbb1eb6f326816040516103be9190612d52565b60405180910390a150505050565b60055460405163bf40fac160e01b81526020600482018181528451602484015284516000946001600160a01b03169363bf40fac1938793928392604401918501908083838b5b8381101561042a578181015183820152602001610412565b50505050905090810190601f1680156104575780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561047457600080fd5b505afa158015610488573d6000803e3d6000fd5b505050506040513d602081101561049e57600080fd5b505190505b919050565b606a5460ff1690565b6004546000906001600160a01b031661dead14156104ea5760405162461bcd60e51b81526004016104e190612d65565b60405180910390fd5b506004546001600160a01b031690565b600061050886868686610ce3565b805160208083019190912060009081526002909152604090205490915060ff1615156001146105495760405162461bcd60e51b81526004016104e190612e5a565b610559818363ffffffff16610d30565b505050505050565b610569610cdf565b6001600160a01b031661057a610730565b6001600160a01b0316146105c3576040805162461bcd60e51b815260206004820181905260248201526000805160206130da833981519152604482015290519081900360640190fd5b6038546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3603880546001600160a01b0319169055565b610615610cdf565b6001600160a01b0316610626610730565b6001600160a01b03161461066f576040805162461bcd60e51b815260206004820181905260248201526000805160206130da833981519152604482015290519081900360640190fd5b600081815260ce6020526040808220805460ff191690555182917f52c8a2680a9f4cc0ad0bf88f32096eadbebf0646ea611d93a0ce6a29a024040591a250565b60026020526000908152604090205460ff1681565b6106cc610cdf565b6001600160a01b03166106dd610730565b6001600160a01b031614610726576040805162461bcd60e51b815260206004820181905260248201526000805160206130da833981519152604482015290519081900360640190fd5b61072e610e08565b565b6038546001600160a01b031690565b60016020526000908152604090205460ff1681565b600554600160a81b900460ff168061076f575061076f610ea8565b806107845750600554600160a01b900460ff16155b6107bf5760405162461bcd60e51b815260040180806020018281038252602e815260200180613086602e913960400191505060405180910390fd5b600554600160a81b900460ff161580156107f6576005805460ff60a01b1960ff60a81b19909116600160a81b1716600160a01b1790555b6005546001600160a01b03161561081f5760405162461bcd60e51b81526004016104e190612f84565b600580546001600160a01b0384166001600160a01b0319918216179091556004805490911661dead179055610852610eb9565b61085a610f72565b610862611082565b61086a611144565b801561087e576005805460ff60a81b191690555b5050565b60ce6020526000908152604090205460ff1681565b6002609c5414156108ef576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6002609c5560408051808201909152601481527327ab26afa61926b2b9b9b0b3b2a932b630bcb2b960611b602082015260009061092b906103cc565b90506001600160a01b0381161561096457336001600160a01b038216146109645760405162461bcd60e51b81526004016104e190612ee7565b61096c6104a8565b156109b1576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b60006109bf87878787610ce3565b90506109cb8184611201565b15156001146109ec5760405162461bcd60e51b81526004016104e190612f3d565b80516020808301919091206000818152600190925260409091205460ff1615610a275760405162461bcd60e51b81526004016104e190612d9c565b600081815260ce602052604090205460ff1615610a565760405162461bcd60e51b81526004016104e190612ea5565b600480546001600160a01b0319166001600160a01b03898116919091179091556040516000918a1690610a8a908990612bb8565b6000604051808303816000865af19150503d8060008114610ac7576040519150601f19603f3d011682016040523d82523d6000602084013e610acc565b606091505b5050600480546001600160a01b03191661dead179055905080151560011415610b4757600082815260016020819052604091829020805460ff19169091179055517f4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c90610b3a908490612ba1565b60405180910390a1610b7f565b7f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f82604051610b769190612ba1565b60405180910390a15b6000833343604051602001610b9693929190612c06565b60408051601f1981840301815291815281516020928301206000908152918290529020805460ff19166001908117909155609c5550505050505050505050565b60035481565b610be4610cdf565b6001600160a01b0316610bf5610730565b6001600160a01b031614610c3e576040805162461bcd60e51b815260206004820181905260248201526000805160206130da833981519152604482015290519081900360640190fd5b6001600160a01b038116610c835760405162461bcd60e51b81526004018080602001828103825260268152602001806130366026913960400191505060405180910390fd5b6038546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3603880546001600160a01b0319166001600160a01b0392909216919091179055565b3390565b606084848484604051602401610cfc9493929190612c6c565b60408051601f198184030181529190526020810180516001600160e01b031663cbd4ece960e01b1790529050949350505050565b610d6e6040518060400160405280601d81526020017f4f564d5f43616e6f6e6963616c5472616e73616374696f6e436861696e0000008152506103cc565b6001600160a01b0316636fee07e0610dba6040518060400160405280601a81526020017f4f564d5f4c3243726f7373446f6d61696e4d657373656e6765720000000000008152506103cc565b83856040518463ffffffff1660e01b8152600401610dda93929190612ca9565b600060405180830381600087803b158015610df457600080fd5b505af1158015610559573d6000803e3d6000fd5b610e106104a8565b15610e55576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b606a805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258610e8b610cdf565b604080516001600160a01b039092168252519081900360200190a1565b6000610eb330611226565b15905090565b600554600160a81b900460ff1680610ed45750610ed4610ea8565b80610ee95750600554600160a01b900460ff16155b610f245760405162461bcd60e51b815260040180806020018281038252602e815260200180613086602e913960400191505060405180910390fd5b600554600160a81b900460ff16158015610f5b576005805460ff60a01b1960ff60a81b19909116600160a81b1716600160a01b1790555b8015610f6f576005805460ff60a81b191690555b50565b600554600160a81b900460ff1680610f8d5750610f8d610ea8565b80610fa25750600554600160a01b900460ff16155b610fdd5760405162461bcd60e51b815260040180806020018281038252602e815260200180613086602e913960400191505060405180910390fd5b600554600160a81b900460ff16158015611014576005805460ff60a01b1960ff60a81b19909116600160a81b1716600160a01b1790555b600061101e610cdf565b603880546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3508015610f6f576005805460ff60a81b1916905550565b600554600160a81b900460ff168061109d575061109d610ea8565b806110b25750600554600160a01b900460ff16155b6110ed5760405162461bcd60e51b815260040180806020018281038252602e815260200180613086602e913960400191505060405180910390fd5b600554600160a81b900460ff16158015611124576005805460ff60a01b1960ff60a81b19909116600160a81b1716600160a01b1790555b606a805460ff191690558015610f6f576005805460ff60a81b1916905550565b600554600160a81b900460ff168061115f575061115f610ea8565b806111745750600554600160a01b900460ff16155b6111af5760405162461bcd60e51b815260040180806020018281038252602e815260200180613086602e913960400191505060405180910390fd5b600554600160a81b900460ff161580156111e6576005805460ff60a01b1960ff60a81b19909116600160a81b1716600160a01b1790555b6001609c558015610f6f576005805460ff60a81b1916905550565b600061120c8261122c565b801561121d575061121d8383611389565b90505b92915050565b3b151590565b60008061126d6040518060400160405280601881526020017f4f564d5f5374617465436f6d6d69746d656e74436861696e00000000000000008152506103cc565b6020840151604051639418bddd60e01b81529192506001600160a01b03831691639418bddd9161129f91600401612fce565b60206040518083038186803b1580156112b757600080fd5b505afa1580156112cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112ef9190612a9a565b1580156113825750825160208401516040808601519051634d69ee5760e01b81526001600160a01b03851693634d69ee5793611332939192909190600401612cdb565b60206040518083038186803b15801561134a57600080fd5b505afa15801561135e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113829190612a9a565b9392505050565b600080836113cb6040518060400160405280601a81526020017f4f564d5f4c3243726f7373446f6d61696e4d657373656e6765720000000000008152506103cc565b6040516020016113dc929190612bd4565b604051602081830303815290604052805190602001206000604051602001611405929190612baa565b604051602081830303815290604052805190602001209050600080611454602160991b6040516020016114389190612b89565b60408051601f19818403018152919052606087015187516114e6565b909250905060018215151461147b5760405162461bcd60e51b81526004016104e190612de7565b60006114868261150f565b90506114db8460405160200161149c9190612ba1565b60405160208183030381529060405260016040516020016114bd9190612c40565b604051602081830303815290604052886080015184604001516115a1565b979650505050505050565b6000606060006114f5866115c5565b90506115028186866115f5565b9250925050935093915050565b611517612634565b6000611522836116c8565b9050604051806080016040528061154c8360008151811061153f57fe5b60200260200101516116db565b81526020016115618360018151811061153f57fe5b81526020016115838360028151811061157657fe5b60200260200101516116e2565b81526020016115988360038151811061157657fe5b90529392505050565b6000806115ad866115c5565b90506115bb818686866117db565b9695505050505050565b606081805190602001206040516020016115df9190612ba1565b6040516020818303038152906040529050919050565b60006060600061160485611801565b90506000806000611616848a896118d8565b8151929550909350915015808061162a5750815b61167b576040805162461bcd60e51b815260206004820152601a60248201527f50726f76696465642070726f6f6620697320696e76616c69642e000000000000604482015290519081900360640190fd5b60008161169757604051806020016040528060008152506116b6565b6116b68660018703815181106116a957fe5b6020026020010151611c7b565b919b919a509098505050505050505050565b60606112206116d683611c97565b611cbc565b6000611220825b600060218260000151111561173e576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e000000000000604482015290519081900360640190fd5b600080600061174c85611e32565b91945092509050600081600181111561176157fe5b146117b3576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e000000000000604482015290519081900360640190fd5b6020808601518401805190918410156115bb5760208490036101000a90049695505050505050565b60008060006117eb8786866115f5565b915091508180156114db57506114db868261215b565b6060600061180e836116c8565b90506000815167ffffffffffffffff8111801561182a57600080fd5b5060405190808252806020026020018201604052801561186457816020015b61185161265b565b8152602001906001900390816118495790505b50905060005b82518110156118d057600061189184838151811061188457fe5b6020026020010151612171565b905060405180604001604052808281526020016118ad836116c8565b8152508383815181106118bc57fe5b60209081029190910101525060010161186a565b509392505050565b600060608180806118e887612200565b9050856000806118f661265b565b60005b8c51811015611c53578c818151811061190e57fe5b60200260200101519150828401935060018701965083600014156119825781518051602090910120851461197d576040805162461bcd60e51b8152602060048201526011602482015270092dcecc2d8d2c840e4dedee840d0c2e6d607b1b604482015290519081900360640190fd5b611a49565b8151516020116119e95781518051602090910120851461197d576040805162461bcd60e51b815260206004820152601b60248201527f496e76616c6964206c6172676520696e7465726e616c20686173680000000000604482015290519081900360640190fd5b846119f783600001516122fd565b14611a49576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420696e7465726e616c206e6f64652068617368000000000000604482015290519081900360640190fd5b60208201515160111415611ab8578551841415611a6557611c53565b6000868581518110611a7357fe5b602001015160f81c60f81b60f81c9050600083602001518260ff1681518110611a9857fe5b60200260200101519050611aab81612329565b9650600194505050611c4b565b60028260200151511415611bfe576000611ad18361235f565b9050600081600081518110611ae257fe5b016020015160f81c9050600181166002036000611b028460ff841661237d565b90506000611b108b8a61237d565b90506000611b1e83836123ae565b905060ff851660021480611b35575060ff85166003145b15611b6757808351148015611b4a5750808251145b15611b5457988901985b50600160ff1b9950611c53945050505050565b60ff85161580611b7a575060ff85166001145b15611bc75780611b975750600160ff1b9950611c53945050505050565b611bb88860200151600181518110611bab57fe5b6020026020010151612329565b9a509750611c4b945050505050565b60405162461bcd60e51b81526004018080602001828103825260268152602001806130b46026913960400191505060405180910390fd5b6040805162461bcd60e51b815260206004820152601d60248201527f526563656976656420616e20756e706172736561626c65206e6f64652e000000604482015290519081900360640190fd5b6001016118f9565b50600160ff1b841486611c66878661237d565b909e909d50909b509950505050505050505050565b6020810151805160609161122091600019810190811061188457fe5b611c9f612675565b506040805180820190915281518152602082810190820152919050565b6060600080611cca84611e32565b91935090915060019050816001811115611ce057fe5b14611d32576040805162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c50206c6973742076616c75652e000000000000000000604482015290519081900360640190fd5b6040805160208082526104208201909252600091816020015b611d53612675565b815260200190600190039081611d4b5790505090506000835b8651811015611e275760208210611db45760405162461bcd60e51b815260040180806020018281038252602a81526020018061305c602a913960400191505060405180910390fd5b600080611de06040518060400160405280858c60000151038152602001858c6020015101815250611e32565b509150915060405180604001604052808383018152602001848b6020015101815250858581518110611e0e57fe5b6020908102919091010152600193909301920101611d6c565b508152949350505050565b600080600080846000015111611e8f576040805162461bcd60e51b815260206004820152601860248201527f524c50206974656d2063616e6e6f74206265206e756c6c2e0000000000000000604482015290519081900360640190fd5b6020840151805160001a607f8111611eb4576000600160009450945094505050612154565b60b78111611f29578551607f198201908110611f17576040805162461bcd60e51b815260206004820152601960248201527f496e76616c696420524c502073686f727420737472696e672e00000000000000604482015290519081900360640190fd5b60019550935060009250612154915050565b60bf811161200d57855160b6198201908110611f8c576040805162461bcd60e51b815260206004820152601f60248201527f496e76616c696420524c50206c6f6e6720737472696e67206c656e6774682e00604482015290519081900360640190fd5b6000816020036101000a6001850151049050808201886000015111611ff8576040805162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c50206c6f6e6720737472696e672e0000000000000000604482015290519081900360640190fd5b60019091019550935060009250612154915050565b60f7811161208157855160bf198201908110612070576040805162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c502073686f7274206c6973742e000000000000000000604482015290519081900360640190fd5b600195509350849250612154915050565b855160f61982019081106120dc576040805162461bcd60e51b815260206004820152601d60248201527f496e76616c696420524c50206c6f6e67206c697374206c656e6774682e000000604482015290519081900360640190fd5b6000816020036101000a6001850151049050808201886000015111612141576040805162461bcd60e51b815260206004820152601660248201527524b73b30b634b210292628103637b733903634b9ba1760511b604482015290519081900360640190fd5b6001918201965094509250612154915050565b9193909250565b8051602091820120825192909101919091201490565b6060600080600061218185611e32565b91945092509050600081600181111561219657fe5b146121e8576040805162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c502062797465732076616c75652e0000000000000000604482015290519081900360640190fd5b6121f785602001518484612414565b95945050505050565b60606000825160020267ffffffffffffffff8111801561221f57600080fd5b506040519080825280601f01601f19166020018201604052801561224a576020820181803683370190505b50905060005b83518110156122f657600484828151811061226757fe5b602001015160f81c60f81b6001600160f81b031916901c82826002028151811061228d57fe5b60200101906001600160f81b031916908160001a90535060108482815181106122b257fe5b016020015160f81c816122c157fe5b0660f81b8282600202600101815181106122d757fe5b60200101906001600160f81b031916908160001a905350600101612250565b5092915050565b6000602082511015612314575060208101516104a3565b81806020019051602081101561049e57600080fd5b6000606060208360000151101561234a57612343836124c2565b9050612356565b61235383612171565b90505b611382816122fd565b6060611220612378836020015160008151811061188457fe5b612200565b606081835103600014156123a05750604080516020810190915260008152611220565b61121d8383848651036124cd565b6000805b8084511180156123c25750808351115b801561240757508281815181106123d557fe5b602001015160f81c60f81b6001600160f81b0319168482815181106123f657fe5b01602001516001600160f81b031916145b1561121d576001016123b2565b606060008267ffffffffffffffff8111801561242f57600080fd5b506040519080825280601f01601f19166020018201604052801561245a576020820181803683370190505b50905080516000141561246e579050611382565b8484016020820160005b60208604811015612499578251825260209283019290910190600101612478565b5080519151601f959095166020036101000a600019019182169119909416179092525092915050565b60606112208261261e565b60608182601f011015612518576040805162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b604482015290519081900360640190fd5b828284011015612560576040805162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b604482015290519081900360640190fd5b818301845110156125ac576040805162461bcd60e51b8152602060048201526011602482015270736c6963655f6f75744f66426f756e647360781b604482015290519081900360640190fd5b6060821580156125cb5760405191506000825260208201604052612615565b6040519150601f8416801560200281840101858101878315602002848b0101015b818310156126045780518352602092830192016125ec565b5050858452601f01601f1916604052505b50949350505050565b6060611220826020015160008460000151612414565b60408051608081018252600080825260208201819052918101829052606081019190915290565b604051806040016040528060608152602001606081525090565b604051806040016040528060008152602001600081525090565b600067ffffffffffffffff8311156126a357fe5b6126b6601f8401601f1916602001612fe1565b90508281528383830111156126ca57600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b03811681146104a357600080fd5b600082601f830112612708578081fd5b61121d8383356020850161268f565b600060a08284031215612728578081fd5b60405160a0810167ffffffffffffffff828210818311171561274657fe5b8160405282935084358352602085013560208401526040850135604084015260608501356060840152608085013591508082111561278357600080fd5b50612790858286016126f8565b6080830152505092915050565b6000604082840312156127ae578081fd5b6040516040810167ffffffffffffffff82821081831117156127cc57fe5b81604052829350843583526020915081850135818111156127ec57600080fd5b8501601f810187136127fd57600080fd5b80358281111561280957fe5b8381029250612819848401612fe1565b8181528481019083860185850187018b101561283457600080fd5b600095505b83861015612857578035835260019590950194918601918601612839565b5080868801525050505050505092915050565b803563ffffffff811681146104a357600080fd5b60006020828403121561288f578081fd5b61121d826126e1565b600080600080600060a086880312156128af578081fd5b6128b8866126e1565b94506128c6602087016126e1565b9350604086013567ffffffffffffffff808211156128e2578283fd5b6128ee89838a016126f8565b945060608801359350608088013591508082111561290a578283fd5b9087019060a0828a03121561291d578283fd5b61292760a0612fe1565b8235815260208301358281111561293c578485fd5b6129488b828601612717565b60208301525060408301358281111561295f578485fd5b61296b8b82860161279d565b604083015250606083013582811115612982578485fd5b61298e8b8286016126f8565b6060830152506080830135828111156129a5578485fd5b6129b18b8286016126f8565b6080830152508093505050509295509295909350565b600080600080600060a086880312156129de578081fd5b6129e7866126e1565b94506129f5602087016126e1565b9350604086013567ffffffffffffffff811115612a10578182fd5b612a1c888289016126f8565b93505060608601359150612a326080870161286a565b90509295509295909350565b600080600060608486031215612a52578283fd5b612a5b846126e1565b9250602084013567ffffffffffffffff811115612a76578283fd5b612a82868287016126f8565b925050612a916040850161286a565b90509250925092565b600060208284031215612aab578081fd5b8151801515811461121d578182fd5b600060208284031215612acb578081fd5b5035919050565b600060208284031215612ae3578081fd5b813567ffffffffffffffff811115612af9578182fd5b8201601f81018413612b09578182fd5b612b188482356020840161268f565b949350505050565b60008151808452612b38816020860160208601613005565b601f01601f19169290920160200192915050565b600081518352602082015160208401526040820151604084015260608201516060840152608082015160a06080850152612b1860a0850182612b20565b60609190911b6001600160601b031916815260140190565b90815260200190565b918252602082015260400190565b60008251612bca818460208701613005565b9190910192915050565b60008351612be6818460208801613005565b60609390931b6001600160601b0319169190920190815260140192915050565b60008451612c18818460208901613005565b60609490941b6001600160601b03191691909301908152601481019190915260340192915050565b60f89190911b6001600160f81b031916815260010190565b6001600160a01b0391909116815260200190565b6001600160a01b03858116825284166020820152608060408201819052600090612c9890830185612b20565b905082606083015295945050505050565b600060018060a01b0385168252836020830152606060408301526121f76060830184612b20565b901515815260200190565b60008482526020606081840152612cf56060840186612b4c565b838103604085015260408101855182528286015160408484015281815180845260608501915085830194508693505b80841015612d445784518252938501936001939093019290850190612d24565b509998505050505050505050565b60006020825261121d6020830184612b20565b6020808252601f908201527f78446f6d61696e4d65737361676553656e646572206973206e6f742073657400604082015260600190565b6020808252602b908201527f50726f7669646564206d6573736167652068617320616c72656164792062656560408201526a37103932b1b2b4bb32b21760a91b606082015260800190565b6020808252604d908201527f4d6573736167652070617373696e67207072656465706c6f7920686173206e6f60408201527f74206265656e20696e697469616c697a6564206f7220696e76616c696420707260608201526c37b7b310383937bb34b232b21760991b608082015260a00190565b6020808252602b908201527f50726f7669646564206d65737361676520686173206e6f7420616c726561647960408201526a103132b2b71039b2b73a1760a91b606082015260800190565b60208082526022908201527f50726f7669646564206d65737361676520686173206265656e20626c6f636b65604082015261321760f11b606082015260800190565b60208082526036908201527f4f6e6c79204f564d5f4c324d65737361676552656c617965722063616e2072656040820152753630bc90261916ba3796a6189036b2b9b9b0b3b2b99760511b606082015260800190565b60208082526027908201527f50726f7669646564206d65737361676520636f756c64206e6f742062652076656040820152663934b334b2b21760c91b606082015260800190565b6020808252602a908201527f4c3143726f7373446f6d61696e4d657373656e67657220616c72656164792069604082015269373a34b0b634bd32b21760b11b606082015260800190565b60006020825261121d6020830184612b4c565b60405181810167ffffffffffffffff81118282101715612ffd57fe5b604052919050565b60005b83811015613020578181015183820152602001613008565b8381111561302f576000848401525b5050505056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737350726f766964656420524c50206c6973742065786365656473206d6178206c697374206c656e6774682e496e697469616c697a61626c653a20636f6e747261637420697320616c726561647920696e697469616c697a656452656365697665642061206e6f6465207769746820616e20756e6b6e6f776e207072656669784f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a2646970667358221220c8b08248358fc9118d8d145603700ec8109487e93128f8f4b5dafd0a63cf3bad64736f6c63430007060033", - "devdoc": { - "details": "The L1 Cross Domain Messenger contract sends messages from L1 to L2, and relays messages from L2 onto L1. In the event that a message sent from L1 to L2 is rejected for exceeding the L2 epoch gas limit, it can be resubmitted via this contract's replay function. Compiler used: solc Runtime target: EVM", - "kind": "dev", - "methods": { - "allowMessage(bytes32)": { - "params": { - "_xDomainCalldataHash": "Hash of the message to block." - } - }, - "blockMessage(bytes32)": { - "params": { - "_xDomainCalldataHash": "Hash of the message to block." - } - }, - "initialize(address)": { - "params": { - "_libAddressManager": "Address of the Address Manager." - } - }, - "owner()": { - "details": "Returns the address of the current owner." - }, - "paused()": { - "details": "Returns true if the contract is paused, and false otherwise." - }, - "relayMessage(address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))": { - "params": { - "_message": "Message to send to the target.", - "_messageNonce": "Nonce for the provided message.", - "_proof": "Inclusion proof for the given message.", - "_sender": "Message sender address.", - "_target": "Target contract address." - } - }, - "renounceOwnership()": { - "details": "Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner." - }, - "replayMessage(address,address,bytes,uint256,uint32)": { - "params": { - "_gasLimit": "Gas limit for the provided message.", - "_message": "Message to send to the target.", - "_messageNonce": "Nonce for the provided message.", - "_sender": "Original sender address.", - "_target": "Target contract address." - } - }, - "resolve(string)": { - "params": { - "_name": "Name to resolve an address for." - }, - "returns": { - "_0": "Address associated with the given name." - } - }, - "sendMessage(address,bytes,uint32)": { - "params": { - "_gasLimit": "Gas limit for the provided message.", - "_message": "Message to send to the target.", - "_target": "Target contract address." - } - }, - "transferOwnership(address)": { - "details": "Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner." - } - }, - "title": "OVM_L1CrossDomainMessenger", - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": { - "allowMessage(bytes32)": { - "notice": "Allow a message." - }, - "blockMessage(bytes32)": { - "notice": "Block a message." - }, - "constructor": { - "notice": "This contract is intended to be behind a delegate proxy. We pass the zero address to the address resolver just to satisfy the constructor. We still need to set this value in initialize()." - }, - "pause()": { - "notice": "Pause relaying." - }, - "relayMessage(address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))": { - "notice": "Relays a cross domain message to a contract." - }, - "replayMessage(address,address,bytes,uint256,uint32)": { - "notice": "Replays a cross domain message to the target messenger." - }, - "resolve(string)": { - "notice": "Resolves the address associated with a given name." - }, - "sendMessage(address,bytes,uint32)": { - "notice": "Sends a cross domain message to the target messenger." - } - }, - "version": 1 - }, - "storageLayout": { - "storage": [ - { - "astId": 1272, - "contract": "contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1CrossDomainMessenger.sol:OVM_L1CrossDomainMessenger", - "label": "relayedMessages", - "offset": 0, - "slot": "0", - "type": "t_mapping(t_bytes32,t_bool)" - }, - { - "astId": 1276, - "contract": "contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1CrossDomainMessenger.sol:OVM_L1CrossDomainMessenger", - "label": "successfulMessages", - "offset": 0, - "slot": "1", - "type": "t_mapping(t_bytes32,t_bool)" - }, - { - "astId": 1280, - "contract": "contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1CrossDomainMessenger.sol:OVM_L1CrossDomainMessenger", - "label": "sentMessages", - "offset": 0, - "slot": "2", - "type": "t_mapping(t_bytes32,t_bool)" - }, - { - "astId": 1282, - "contract": "contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1CrossDomainMessenger.sol:OVM_L1CrossDomainMessenger", - "label": "messageNonce", - "offset": 0, - "slot": "3", - "type": "t_uint256" - }, - { - "astId": 1285, - "contract": "contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1CrossDomainMessenger.sol:OVM_L1CrossDomainMessenger", - "label": "xDomainMsgSender", - "offset": 0, - "slot": "4", - "type": "t_address" - }, - { - "astId": 12800, - "contract": "contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1CrossDomainMessenger.sol:OVM_L1CrossDomainMessenger", - "label": "libAddressManager", - "offset": 0, - "slot": "5", - "type": "t_contract(Lib_AddressManager)12793" - }, - { - "astId": 137, - "contract": "contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1CrossDomainMessenger.sol:OVM_L1CrossDomainMessenger", - "label": "_initialized", - "offset": 20, - "slot": "5", - "type": "t_bool" - }, - { - "astId": 140, - "contract": "contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1CrossDomainMessenger.sol:OVM_L1CrossDomainMessenger", - "label": "_initializing", - "offset": 21, - "slot": "5", - "type": "t_bool" - }, - { - "astId": 484, - "contract": "contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1CrossDomainMessenger.sol:OVM_L1CrossDomainMessenger", - "label": "__gap", - "offset": 0, - "slot": "6", - "type": "t_array(t_uint256)50_storage" - }, - { - "astId": 10, - "contract": "contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1CrossDomainMessenger.sol:OVM_L1CrossDomainMessenger", - "label": "_owner", - "offset": 0, - "slot": "56", - "type": "t_address" - }, - { - "astId": 129, - "contract": "contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1CrossDomainMessenger.sol:OVM_L1CrossDomainMessenger", - "label": "__gap", - "offset": 0, - "slot": "57", - "type": "t_array(t_uint256)49_storage" - }, - { - "astId": 506, - "contract": "contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1CrossDomainMessenger.sol:OVM_L1CrossDomainMessenger", - "label": "_paused", - "offset": 0, - "slot": "106", - "type": "t_bool" - }, - { - "astId": 597, - "contract": "contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1CrossDomainMessenger.sol:OVM_L1CrossDomainMessenger", - "label": "__gap", - "offset": 0, - "slot": "107", - "type": "t_array(t_uint256)49_storage" - }, - { - "astId": 612, - "contract": "contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1CrossDomainMessenger.sol:OVM_L1CrossDomainMessenger", - "label": "_status", - "offset": 0, - "slot": "156", - "type": "t_uint256" - }, - { - "astId": 655, - "contract": "contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1CrossDomainMessenger.sol:OVM_L1CrossDomainMessenger", - "label": "__gap", - "offset": 0, - "slot": "157", - "type": "t_array(t_uint256)49_storage" - }, - { - "astId": 1436, - "contract": "contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1CrossDomainMessenger.sol:OVM_L1CrossDomainMessenger", - "label": "blockedMessages", - "offset": 0, - "slot": "206", - "type": "t_mapping(t_bytes32,t_bool)" - } - ], - "types": { - "t_address": { - "encoding": "inplace", - "label": "address", - "numberOfBytes": "20" - }, - "t_array(t_uint256)49_storage": { - "base": "t_uint256", - "encoding": "inplace", - "label": "uint256[49]", - "numberOfBytes": "1568" - }, - "t_array(t_uint256)50_storage": { - "base": "t_uint256", - "encoding": "inplace", - "label": "uint256[50]", - "numberOfBytes": "1600" - }, - "t_bool": { - "encoding": "inplace", - "label": "bool", - "numberOfBytes": "1" - }, - "t_bytes32": { - "encoding": "inplace", - "label": "bytes32", - "numberOfBytes": "32" - }, - "t_contract(Lib_AddressManager)12793": { - "encoding": "inplace", - "label": "contract Lib_AddressManager", - "numberOfBytes": "20" - }, - "t_mapping(t_bytes32,t_bool)": { - "encoding": "mapping", - "key": "t_bytes32", - "label": "mapping(bytes32 => bool)", - "numberOfBytes": "32", - "value": "t_bool" - }, - "t_uint256": { - "encoding": "inplace", - "label": "uint256", - "numberOfBytes": "32" - } - } - } -} \ No newline at end of file diff --git a/packages/contracts/deployments/kovan-v3/OVM_L1ETHGateway.json b/packages/contracts/deployments/kovan-v3/OVM_L1ETHGateway.json deleted file mode 100644 index 71e3eabd74fbf..0000000000000 --- a/packages/contracts/deployments/kovan-v3/OVM_L1ETHGateway.json +++ /dev/null @@ -1,293 +0,0 @@ -{ - "address": "0x25bb69ee5665536Ce6aeb51094F0bed9e4DACc30", - "abi": [ - { - "inputs": [], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "_from", - "type": "address" - }, - { - "indexed": false, - "internalType": "address", - "name": "_to", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_amount", - "type": "uint256" - } - ], - "name": "DepositInitiated", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "_to", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_amount", - "type": "uint256" - } - ], - "name": "WithdrawalFinalized", - "type": "event" - }, - { - "inputs": [], - "name": "deposit", - "outputs": [], - "stateMutability": "payable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_to", - "type": "address" - } - ], - "name": "depositTo", - "outputs": [], - "stateMutability": "payable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_amount", - "type": "uint256" - } - ], - "name": "finalizeWithdrawal", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "getFinalizeDepositL2Gas", - "outputs": [ - { - "internalType": "uint32", - "name": "", - "type": "uint32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_libAddressManager", - "type": "address" - }, - { - "internalType": "address", - "name": "_ovmEth", - "type": "address" - } - ], - "name": "initialize", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "libAddressManager", - "outputs": [ - { - "internalType": "contract Lib_AddressManager", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "messenger", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "ovmEth", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "string", - "name": "_name", - "type": "string" - } - ], - "name": "resolve", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "stateMutability": "payable", - "type": "receive" - } - ], - "transactionHash": "0xdee55e4f063e0e623d64d84766a08cdff904d121126b845ebc3e565fad826f6b", - "receipt": { - "to": null, - "from": "0x18394B52d3Cb931dfA76F63251919D051953413d", - "contractAddress": "0x25bb69ee5665536Ce6aeb51094F0bed9e4DACc30", - "transactionIndex": 3, - "gasUsed": "608764", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0x7b251469ad62221d42e05992bb7fac0bb492bc2939a072d90039a585f58e524f", - "transactionHash": "0xdee55e4f063e0e623d64d84766a08cdff904d121126b845ebc3e565fad826f6b", - "logs": [], - "blockNumber": 24572892, - "cumulativeGasUsed": "752908", - "status": 1, - "byzantium": true - }, - "args": [], - "solcInputHash": "5ee8e508e2c54cb5ac6783b4855b1558", - "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"DepositInitiated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"WithdrawalFinalized\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"deposit\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"}],\"name\":\"depositTo\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"finalizeWithdrawal\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getFinalizeDepositL2Gas\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_ovmEth\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"messenger\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ovmEth\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"details\":\"The L1 ETH Gateway is a contract which stores deposited ETH that is in use on L2. Compiler used: solc Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"deposit()\":{\"details\":\"deposit an amount of the ETH to the caller's balance on L2\"},\"depositTo(address)\":{\"details\":\"deposit an amount of ETH to a recipients's balance on L2\",\"params\":{\"_to\":\"L2 address to credit the withdrawal to\"}},\"finalizeWithdrawal(address,uint256)\":{\"details\":\"Complete a withdrawal from L2 to L1, and credit funds to the recipient's balance of the L1 ETH token. Since only the xDomainMessenger can call this function, it will never be called before the withdrawal is finalized.\",\"params\":{\"_amount\":\"Amount of the ETH to withdraw\",\"_to\":\"L1 address to credit the withdrawal to\"}},\"initialize(address,address)\":{\"params\":{\"_libAddressManager\":\"Address manager for this OE deployment\",\"_ovmEth\":\"L2 OVM_ETH implementation of iOVM_DepositedToken\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}}},\"title\":\"OVM_L1ETHGateway\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/OVM/bridge/tokens/OVM_L1ETHGateway.sol\":\"OVM_L1ETHGateway\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor () internal {\\n address msgSender = _msgSender();\\n _owner = msgSender;\\n emit OwnershipTransferred(address(0), msgSender);\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n emit OwnershipTransferred(_owner, address(0));\\n _owner = address(0);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n emit OwnershipTransferred(_owner, newOwner);\\n _owner = newOwner;\\n }\\n}\\n\",\"keccak256\":\"0x15e2d5bd4c28a88548074c54d220e8086f638a71ed07e6b3ba5a70066fcf458d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with GSN meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address payable) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes memory) {\\n this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x8d3cb350f04ff49cfb10aef08d87f19dcbaecc8027b0bed12f3275cd12f38cf0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/bridge/tokens/OVM_L1ETHGateway.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// @unsupported: ovm\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Interface Imports */\\nimport { iOVM_L1ETHGateway } from \\\"../../../iOVM/bridge/tokens/iOVM_L1ETHGateway.sol\\\";\\nimport { iOVM_L2DepositedToken } from \\\"../../../iOVM/bridge/tokens/iOVM_L2DepositedToken.sol\\\";\\n\\n/* Library Imports */\\nimport { OVM_CrossDomainEnabled } from \\\"../../../libraries/bridge/OVM_CrossDomainEnabled.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../../libraries/resolver/Lib_AddressResolver.sol\\\";\\nimport { Lib_AddressManager } from \\\"../../../libraries/resolver/Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title OVM_L1ETHGateway\\n * @dev The L1 ETH Gateway is a contract which stores deposited ETH that is in use on L2.\\n *\\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract OVM_L1ETHGateway is iOVM_L1ETHGateway, OVM_CrossDomainEnabled, Lib_AddressResolver {\\n\\n /********************\\n * Public Constants *\\n ********************/\\n\\n uint32 public constant override getFinalizeDepositL2Gas = 1200000;\\n\\n /********************************\\n * External Contract References *\\n ********************************/\\n\\n address public ovmEth;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n // This contract lives behind a proxy, so the constructor parameters will go unused.\\n constructor()\\n OVM_CrossDomainEnabled(address(0))\\n Lib_AddressResolver(address(0))\\n public\\n {}\\n\\n /******************\\n * Initialization *\\n ******************/\\n\\n /**\\n * @param _libAddressManager Address manager for this OE deployment\\n * @param _ovmEth L2 OVM_ETH implementation of iOVM_DepositedToken\\n */\\n function initialize(\\n address _libAddressManager,\\n address _ovmEth\\n )\\n public\\n {\\n require(libAddressManager == Lib_AddressManager(0), \\\"Contract has already been initialized.\\\");\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n ovmEth = _ovmEth;\\n messenger = resolve(\\\"Proxy__OVM_L1CrossDomainMessenger\\\");\\n }\\n\\n /**************\\n * Depositing *\\n **************/\\n\\n receive()\\n external\\n payable\\n {\\n _initiateDeposit(msg.sender, msg.sender);\\n }\\n\\n /**\\n * @dev deposit an amount of the ETH to the caller's balance on L2\\n */\\n function deposit()\\n external\\n override\\n payable\\n {\\n _initiateDeposit(msg.sender, msg.sender);\\n }\\n\\n /**\\n * @dev deposit an amount of ETH to a recipients's balance on L2\\n * @param _to L2 address to credit the withdrawal to\\n */\\n function depositTo(\\n address _to\\n )\\n external\\n override\\n payable\\n {\\n _initiateDeposit(msg.sender, _to);\\n }\\n\\n /**\\n * @dev Performs the logic for deposits by storing the ETH and informing the L2 ETH Gateway of the deposit.\\n *\\n * @param _from Account to pull the deposit from on L1\\n * @param _to Account to give the deposit to on L2\\n */\\n function _initiateDeposit(\\n address _from,\\n address _to\\n )\\n internal\\n {\\n // Construct calldata for l2ETHGateway.finalizeDeposit(_to, _amount)\\n bytes memory data =\\n abi.encodeWithSelector(\\n iOVM_L2DepositedToken.finalizeDeposit.selector,\\n _to,\\n msg.value\\n );\\n\\n // Send calldata into L2\\n sendCrossDomainMessage(\\n ovmEth,\\n data,\\n getFinalizeDepositL2Gas\\n );\\n\\n emit DepositInitiated(_from, _to, msg.value);\\n }\\n\\n /*************************\\n * Cross-chain Functions *\\n *************************/\\n\\n /**\\n * @dev Complete a withdrawal from L2 to L1, and credit funds to the recipient's balance of the\\n * L1 ETH token.\\n * Since only the xDomainMessenger can call this function, it will never be called before the withdrawal is finalized.\\n *\\n * @param _to L1 address to credit the withdrawal to\\n * @param _amount Amount of the ETH to withdraw\\n */\\n function finalizeWithdrawal(\\n address _to,\\n uint256 _amount\\n )\\n external\\n override\\n onlyFromCrossDomainAccount(ovmEth)\\n {\\n _safeTransferETH(_to, _amount);\\n\\n emit WithdrawalFinalized(_to, _amount);\\n }\\n\\n /**********************************\\n * Internal Functions: Accounting *\\n **********************************/\\n\\n /**\\n * @dev Internal accounting function for moving around L1 ETH.\\n *\\n * @param _to L1 address to transfer ETH to\\n * @param _value Amount of ETH to send to\\n */\\n function _safeTransferETH(\\n address _to,\\n uint256 _value\\n )\\n internal\\n {\\n (bool success, ) = _to.call{value: _value}(new bytes(0));\\n require(success, 'TransferHelper::safeTransferETH: ETH transfer failed');\\n }\\n}\\n\",\"keccak256\":\"0xee7c0d4bea0e01b0de4def829c9c8aa313ad6a788a7150adcc62c1e4190831db\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/bridge/messaging/iAbs_BaseCrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/**\\n * @title iAbs_BaseCrossDomainMessenger\\n */\\ninterface iAbs_BaseCrossDomainMessenger {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event SentMessage(bytes message);\\n event RelayedMessage(bytes32 msgHash);\\n event FailedRelayedMessage(bytes32 msgHash);\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n function xDomainMessageSender() external view returns (address);\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sends a cross domain message to the target messenger.\\n * @param _target Target contract address.\\n * @param _message Message to send to the target.\\n * @param _gasLimit Gas limit for the provided message.\\n */\\n function sendMessage(\\n address _target,\\n bytes calldata _message,\\n uint32 _gasLimit\\n ) external;\\n}\\n\",\"keccak256\":\"0x89981ed48e99d6939cc6cdef827d484fa3e2292d66c0ba5056c7050cb6282d7e\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/bridge/tokens/iOVM_L1ETHGateway.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0;\\npragma experimental ABIEncoderV2;\\n\\n/**\\n * @title iOVM_L1ETHGateway\\n */\\ninterface iOVM_L1ETHGateway {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event DepositInitiated(\\n address indexed _from,\\n address _to,\\n uint256 _amount\\n );\\n\\n event WithdrawalFinalized(\\n address indexed _to,\\n uint256 _amount\\n );\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function deposit()\\n external\\n payable;\\n\\n function depositTo(\\n address _to\\n )\\n external\\n payable;\\n\\n /*************************\\n * Cross-chain Functions *\\n *************************/\\n\\n function finalizeWithdrawal(\\n address _to,\\n uint _amount\\n )\\n external;\\n\\n function getFinalizeDepositL2Gas()\\n external\\n view\\n returns(\\n uint32\\n );\\n}\\n\",\"keccak256\":\"0x7e6805c5cacfd159410c7cd57a3d586e0fc5810bc46600bbd840a252e243e5ba\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/bridge/tokens/iOVM_L2DepositedToken.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0;\\npragma experimental ABIEncoderV2;\\n\\n/**\\n * @title iOVM_L2DepositedToken\\n */\\ninterface iOVM_L2DepositedToken {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event WithdrawalInitiated(\\n address indexed _from,\\n address _to,\\n uint256 _amount\\n );\\n\\n event DepositFinalized(\\n address indexed _to,\\n uint256 _amount\\n );\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function withdraw(\\n uint _amount\\n )\\n external;\\n\\n function withdrawTo(\\n address _to,\\n uint _amount\\n )\\n external;\\n\\n\\n /*************************\\n * Cross-chain Functions *\\n *************************/\\n\\n function finalizeDeposit(\\n address _to,\\n uint _amount\\n )\\n external;\\n}\\n\",\"keccak256\":\"0x59c807dfb01dbc00409431820457c350681af30d2f972a065231483a8ec926c4\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/bridge/OVM_CrossDomainEnabled.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Interface Imports */\\nimport { iAbs_BaseCrossDomainMessenger } from \\\"../../iOVM/bridge/messaging/iAbs_BaseCrossDomainMessenger.sol\\\";\\n\\n/**\\n * @title OVM_CrossDomainEnabled\\n * @dev Helper contract for contracts performing cross-domain communications\\n *\\n * Compiler used: defined by inheriting contract\\n * Runtime target: defined by inheriting contract\\n */\\ncontract OVM_CrossDomainEnabled {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n // Messenger contract used to send and recieve messages from the other domain.\\n address public messenger;\\n\\n\\n /***************\\n * Constructor *\\n ***************/ \\n\\n /**\\n * @param _messenger Address of the CrossDomainMessenger on the current layer.\\n */\\n constructor(\\n address _messenger\\n ) {\\n messenger = _messenger;\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n /**\\n * Enforces that the modified function is only callable by a specific cross-domain account.\\n * @param _sourceDomainAccount The only account on the originating domain which is\\n * authenticated to call this function.\\n */\\n modifier onlyFromCrossDomainAccount(\\n address _sourceDomainAccount\\n ) {\\n require(\\n msg.sender == address(getCrossDomainMessenger()),\\n \\\"OVM_XCHAIN: messenger contract unauthenticated\\\"\\n );\\n\\n require(\\n getCrossDomainMessenger().xDomainMessageSender() == _sourceDomainAccount,\\n \\\"OVM_XCHAIN: wrong sender of cross-domain message\\\"\\n );\\n\\n _;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Gets the messenger, usually from storage. This function is exposed in case a child contract\\n * needs to override.\\n * @return The address of the cross-domain messenger contract which should be used. \\n */\\n function getCrossDomainMessenger()\\n internal\\n virtual\\n returns (\\n iAbs_BaseCrossDomainMessenger\\n )\\n {\\n return iAbs_BaseCrossDomainMessenger(messenger);\\n }\\n\\n /**\\n * Sends a message to an account on another domain\\n * @param _crossDomainTarget The intended recipient on the destination domain\\n * @param _data The data to send to the target (usually calldata to a function with\\n * `onlyFromCrossDomainAccount()`)\\n * @param _gasLimit The gasLimit for the receipt of the message on the target domain.\\n */\\n function sendCrossDomainMessage(\\n address _crossDomainTarget,\\n bytes memory _data,\\n uint32 _gasLimit\\n )\\n internal\\n {\\n getCrossDomainMessenger().sendMessage(_crossDomainTarget, _data, _gasLimit);\\n }\\n}\\n\",\"keccak256\":\"0x054c802a5c1318566b7727ff5327a1ad4dc0f18038a4586b7ada467cc6b08761\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n public\\n onlyOwner\\n {\\n addresses[_getNameHash(_name)] = _address;\\n\\n emit AddressSet(\\n _name,\\n _address\\n );\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0x2ce671a0e004df88b136bea5a3c59d0732cea8887c8496da1d509e0200b03d7d\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(\\n address _libAddressManager\\n ) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x65981feeabff6a81783ea97d44baf988a18a86c8cb374c46fdb71819cbacc7c0\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x608060405234801561001057600080fd5b50600080546001600160a01b03199081169091556001805490911690556109fb8061003c6000396000f3fe60806040526004361061008a5760003560e01c8063485cc95511610059578063485cc95514610122578063490b5b7814610142578063b760faf914610157578063d0e30db01461016a578063f4f7b41a146101725761009b565b80631273a090146100a0578063299ca478146100cb5780633cb747bf146100ed578063461a4478146101025761009b565b3661009b576100993333610192565b005b600080fd5b3480156100ac57600080fd5b506100b5610246565b6040516100c29190610935565b60405180910390f35b3480156100d757600080fd5b506100e061024d565b6040516100c29190610865565b3480156100f957600080fd5b506100e061025c565b34801561010e57600080fd5b506100e061011d366004610797565b61026b565b34801561012e57600080fd5b5061009961013d36600461073c565b610347565b34801561014e57600080fd5b506100e06103ef565b61009961016536600461071b565b6103fe565b61009961040b565b34801561017e57600080fd5b5061009961018d36600461076e565b610417565b6000638d6e9a5b60e01b82346040516024016101af929190610879565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526002549091506101fe906001600160a01b03168262124f80610578565b826001600160a01b03167ff531653a5819e21265de50358610d55dbe6594c61605b209dfa4280d277938c18334604051610239929190610879565b60405180910390a2505050565b62124f8081565b6001546001600160a01b031681565b6000546001600160a01b031681565b60015460405163bf40fac160e01b81526020600482018181528451602484015284516000946001600160a01b03169363bf40fac1938793928392604401918501908083838b5b838110156102c95781810151838201526020016102b1565b50505050905090810190601f1680156102f65780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561031357600080fd5b505afa158015610327573d6000803e3d6000fd5b505050506040513d602081101561033d57600080fd5b505190505b919050565b6001546001600160a01b0316156103795760405162461bcd60e51b8152600401610370906108e6565b60405180910390fd5b600180546001600160a01b038085166001600160a01b0319928316179092556002805492841692909116919091179055604080516060810190915260218082526103cb91906109a5602083013961026b565b600080546001600160a01b0319166001600160a01b03929092169190911790555050565b6002546001600160a01b031681565b6104083382610192565b50565b6104153333610192565b565b6002546001600160a01b031661042b610663565b6001600160a01b0316336001600160a01b03161461047a5760405162461bcd60e51b815260040180806020018281038252602e815260200180610947602e913960400191505060405180910390fd5b806001600160a01b031661048c610663565b6001600160a01b0316636e296e456040518163ffffffff1660e01b815260040160206040518083038186803b1580156104c457600080fd5b505afa1580156104d8573d6000803e3d6000fd5b505050506040513d60208110156104ee57600080fd5b50516001600160a01b0316146105355760405162461bcd60e51b81526004018080602001828103825260308152602001806109756030913960400191505060405180910390fd5b61053f8383610672565b826001600160a01b03167f9e5c4f9f4e46b8629d3dda85f43a69194f50254404a72dc62b9e932d9c94eda883604051610239919061092c565b610580610663565b6001600160a01b0316633dbb202b8484846040518463ffffffff1660e01b815260040180846001600160a01b03168152602001806020018363ffffffff168152602001828103825284818151815260200191508051906020019080838360005b838110156105f85781810151838201526020016105e0565b50505050905090810190601f1680156106255780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b15801561064657600080fd5b505af115801561065a573d6000803e3d6000fd5b50505050505050565b6000546001600160a01b031690565b604080516000808252602082019092526001600160a01b03841690839060405161069c919061082c565b60006040518083038185875af1925050503d80600081146106d9576040519150601f19603f3d011682016040523d82523d6000602084013e6106de565b606091505b50509050806106ff5760405162461bcd60e51b815260040161037090610892565b505050565b80356001600160a01b038116811461034257600080fd5b60006020828403121561072c578081fd5b61073582610704565b9392505050565b6000806040838503121561074e578081fd5b61075783610704565b915061076560208401610704565b90509250929050565b60008060408385031215610780578182fd5b61078983610704565b946020939093013593505050565b600060208083850312156107a9578182fd5b823567ffffffffffffffff808211156107c0578384fd5b818501915085601f8301126107d3578384fd5b8135818111156107df57fe5b604051601f8201601f19168101850183811182821017156107fc57fe5b6040528181528382018501881015610812578586fd5b818585018683013790810190930193909352509392505050565b60008251815b8181101561084c5760208186018101518583015201610832565b8181111561085a5782828501525b509190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b60208082526034908201527f5472616e7366657248656c7065723a3a736166655472616e736665724554483a60408201527308115512081d1c985b9cd9995c8819985a5b195960621b606082015260800190565b60208082526026908201527f436f6e74726163742068617320616c7265616479206265656e20696e697469616040820152653634bd32b21760d11b606082015260800190565b90815260200190565b63ffffffff9190911681526020019056fe4f564d5f58434841494e3a206d657373656e67657220636f6e747261637420756e61757468656e746963617465644f564d5f58434841494e3a2077726f6e672073656e646572206f662063726f73732d646f6d61696e206d65737361676550726f78795f5f4f564d5f4c3143726f7373446f6d61696e4d657373656e676572a2646970667358221220d8a6002280930d6eb8035b95d663889b1a8e3dbd1b07997ca03239bd5372e85b64736f6c63430007060033", - "deployedBytecode": "0x60806040526004361061008a5760003560e01c8063485cc95511610059578063485cc95514610122578063490b5b7814610142578063b760faf914610157578063d0e30db01461016a578063f4f7b41a146101725761009b565b80631273a090146100a0578063299ca478146100cb5780633cb747bf146100ed578063461a4478146101025761009b565b3661009b576100993333610192565b005b600080fd5b3480156100ac57600080fd5b506100b5610246565b6040516100c29190610935565b60405180910390f35b3480156100d757600080fd5b506100e061024d565b6040516100c29190610865565b3480156100f957600080fd5b506100e061025c565b34801561010e57600080fd5b506100e061011d366004610797565b61026b565b34801561012e57600080fd5b5061009961013d36600461073c565b610347565b34801561014e57600080fd5b506100e06103ef565b61009961016536600461071b565b6103fe565b61009961040b565b34801561017e57600080fd5b5061009961018d36600461076e565b610417565b6000638d6e9a5b60e01b82346040516024016101af929190610879565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526002549091506101fe906001600160a01b03168262124f80610578565b826001600160a01b03167ff531653a5819e21265de50358610d55dbe6594c61605b209dfa4280d277938c18334604051610239929190610879565b60405180910390a2505050565b62124f8081565b6001546001600160a01b031681565b6000546001600160a01b031681565b60015460405163bf40fac160e01b81526020600482018181528451602484015284516000946001600160a01b03169363bf40fac1938793928392604401918501908083838b5b838110156102c95781810151838201526020016102b1565b50505050905090810190601f1680156102f65780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561031357600080fd5b505afa158015610327573d6000803e3d6000fd5b505050506040513d602081101561033d57600080fd5b505190505b919050565b6001546001600160a01b0316156103795760405162461bcd60e51b8152600401610370906108e6565b60405180910390fd5b600180546001600160a01b038085166001600160a01b0319928316179092556002805492841692909116919091179055604080516060810190915260218082526103cb91906109a5602083013961026b565b600080546001600160a01b0319166001600160a01b03929092169190911790555050565b6002546001600160a01b031681565b6104083382610192565b50565b6104153333610192565b565b6002546001600160a01b031661042b610663565b6001600160a01b0316336001600160a01b03161461047a5760405162461bcd60e51b815260040180806020018281038252602e815260200180610947602e913960400191505060405180910390fd5b806001600160a01b031661048c610663565b6001600160a01b0316636e296e456040518163ffffffff1660e01b815260040160206040518083038186803b1580156104c457600080fd5b505afa1580156104d8573d6000803e3d6000fd5b505050506040513d60208110156104ee57600080fd5b50516001600160a01b0316146105355760405162461bcd60e51b81526004018080602001828103825260308152602001806109756030913960400191505060405180910390fd5b61053f8383610672565b826001600160a01b03167f9e5c4f9f4e46b8629d3dda85f43a69194f50254404a72dc62b9e932d9c94eda883604051610239919061092c565b610580610663565b6001600160a01b0316633dbb202b8484846040518463ffffffff1660e01b815260040180846001600160a01b03168152602001806020018363ffffffff168152602001828103825284818151815260200191508051906020019080838360005b838110156105f85781810151838201526020016105e0565b50505050905090810190601f1680156106255780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b15801561064657600080fd5b505af115801561065a573d6000803e3d6000fd5b50505050505050565b6000546001600160a01b031690565b604080516000808252602082019092526001600160a01b03841690839060405161069c919061082c565b60006040518083038185875af1925050503d80600081146106d9576040519150601f19603f3d011682016040523d82523d6000602084013e6106de565b606091505b50509050806106ff5760405162461bcd60e51b815260040161037090610892565b505050565b80356001600160a01b038116811461034257600080fd5b60006020828403121561072c578081fd5b61073582610704565b9392505050565b6000806040838503121561074e578081fd5b61075783610704565b915061076560208401610704565b90509250929050565b60008060408385031215610780578182fd5b61078983610704565b946020939093013593505050565b600060208083850312156107a9578182fd5b823567ffffffffffffffff808211156107c0578384fd5b818501915085601f8301126107d3578384fd5b8135818111156107df57fe5b604051601f8201601f19168101850183811182821017156107fc57fe5b6040528181528382018501881015610812578586fd5b818585018683013790810190930193909352509392505050565b60008251815b8181101561084c5760208186018101518583015201610832565b8181111561085a5782828501525b509190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b60208082526034908201527f5472616e7366657248656c7065723a3a736166655472616e736665724554483a60408201527308115512081d1c985b9cd9995c8819985a5b195960621b606082015260800190565b60208082526026908201527f436f6e74726163742068617320616c7265616479206265656e20696e697469616040820152653634bd32b21760d11b606082015260800190565b90815260200190565b63ffffffff9190911681526020019056fe4f564d5f58434841494e3a206d657373656e67657220636f6e747261637420756e61757468656e746963617465644f564d5f58434841494e3a2077726f6e672073656e646572206f662063726f73732d646f6d61696e206d65737361676550726f78795f5f4f564d5f4c3143726f7373446f6d61696e4d657373656e676572a2646970667358221220d8a6002280930d6eb8035b95d663889b1a8e3dbd1b07997ca03239bd5372e85b64736f6c63430007060033", - "devdoc": { - "details": "The L1 ETH Gateway is a contract which stores deposited ETH that is in use on L2. Compiler used: solc Runtime target: EVM", - "kind": "dev", - "methods": { - "deposit()": { - "details": "deposit an amount of the ETH to the caller's balance on L2" - }, - "depositTo(address)": { - "details": "deposit an amount of ETH to a recipients's balance on L2", - "params": { - "_to": "L2 address to credit the withdrawal to" - } - }, - "finalizeWithdrawal(address,uint256)": { - "details": "Complete a withdrawal from L2 to L1, and credit funds to the recipient's balance of the L1 ETH token. Since only the xDomainMessenger can call this function, it will never be called before the withdrawal is finalized.", - "params": { - "_amount": "Amount of the ETH to withdraw", - "_to": "L1 address to credit the withdrawal to" - } - }, - "initialize(address,address)": { - "params": { - "_libAddressManager": "Address manager for this OE deployment", - "_ovmEth": "L2 OVM_ETH implementation of iOVM_DepositedToken" - } - }, - "resolve(string)": { - "params": { - "_name": "Name to resolve an address for." - }, - "returns": { - "_0": "Address associated with the given name." - } - } - }, - "title": "OVM_L1ETHGateway", - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": { - "resolve(string)": { - "notice": "Resolves the address associated with a given name." - } - }, - "version": 1 - }, - "storageLayout": { - "storage": [ - { - "astId": 11988, - "contract": "contracts/optimistic-ethereum/OVM/bridge/tokens/OVM_L1ETHGateway.sol:OVM_L1ETHGateway", - "label": "messenger", - "offset": 0, - "slot": "0", - "type": "t_address" - }, - { - "astId": 12800, - "contract": "contracts/optimistic-ethereum/OVM/bridge/tokens/OVM_L1ETHGateway.sol:OVM_L1ETHGateway", - "label": "libAddressManager", - "offset": 0, - "slot": "1", - "type": "t_contract(Lib_AddressManager)12793" - }, - { - "astId": 2661, - "contract": "contracts/optimistic-ethereum/OVM/bridge/tokens/OVM_L1ETHGateway.sol:OVM_L1ETHGateway", - "label": "ovmEth", - "offset": 0, - "slot": "2", - "type": "t_address" - } - ], - "types": { - "t_address": { - "encoding": "inplace", - "label": "address", - "numberOfBytes": "20" - }, - "t_contract(Lib_AddressManager)12793": { - "encoding": "inplace", - "label": "contract Lib_AddressManager", - "numberOfBytes": "20" - } - } - } -} \ No newline at end of file diff --git a/packages/contracts/deployments/kovan-v3/OVM_L1MultiMessageRelayer.json b/packages/contracts/deployments/kovan-v3/OVM_L1MultiMessageRelayer.json deleted file mode 100644 index 62ca79e117c05..0000000000000 --- a/packages/contracts/deployments/kovan-v3/OVM_L1MultiMessageRelayer.json +++ /dev/null @@ -1,234 +0,0 @@ -{ - "address": "0x942b1B1CaF9e7654318CbfCfD1bca6727C716638", - "abi": [ - { - "inputs": [ - { - "internalType": "address", - "name": "_libAddressManager", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "inputs": [ - { - "components": [ - { - "internalType": "address", - "name": "target", - "type": "address" - }, - { - "internalType": "address", - "name": "sender", - "type": "address" - }, - { - "internalType": "bytes", - "name": "message", - "type": "bytes" - }, - { - "internalType": "uint256", - "name": "messageNonce", - "type": "uint256" - }, - { - "components": [ - { - "internalType": "bytes32", - "name": "stateRoot", - "type": "bytes32" - }, - { - "components": [ - { - "internalType": "uint256", - "name": "batchIndex", - "type": "uint256" - }, - { - "internalType": "bytes32", - "name": "batchRoot", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "batchSize", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "prevTotalElements", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "extraData", - "type": "bytes" - } - ], - "internalType": "struct Lib_OVMCodec.ChainBatchHeader", - "name": "stateRootBatchHeader", - "type": "tuple" - }, - { - "components": [ - { - "internalType": "uint256", - "name": "index", - "type": "uint256" - }, - { - "internalType": "bytes32[]", - "name": "siblings", - "type": "bytes32[]" - } - ], - "internalType": "struct Lib_OVMCodec.ChainInclusionProof", - "name": "stateRootProof", - "type": "tuple" - }, - { - "internalType": "bytes", - "name": "stateTrieWitness", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "storageTrieWitness", - "type": "bytes" - } - ], - "internalType": "struct iOVM_L1CrossDomainMessenger.L2MessageInclusionProof", - "name": "proof", - "type": "tuple" - } - ], - "internalType": "struct iOVM_L1MultiMessageRelayer.L2ToL1Message[]", - "name": "_messages", - "type": "tuple[]" - } - ], - "name": "batchRelayMessages", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "libAddressManager", - "outputs": [ - { - "internalType": "contract Lib_AddressManager", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "string", - "name": "_name", - "type": "string" - } - ], - "name": "resolve", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - } - ], - "transactionHash": "0xd93f806d3c8503f36c537f09883e9165dd32239e00b881f705a3441e13a3d510", - "receipt": { - "to": null, - "from": "0x18394B52d3Cb931dfA76F63251919D051953413d", - "contractAddress": "0x942b1B1CaF9e7654318CbfCfD1bca6727C716638", - "transactionIndex": 1, - "gasUsed": "605189", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0xc85c83fe27b2839cc9aee380d27e1fab4612af37f0d80a87aea6047caec2a0e1", - "transactionHash": "0xd93f806d3c8503f36c537f09883e9165dd32239e00b881f705a3441e13a3d510", - "logs": [], - "blockNumber": 24572884, - "cumulativeGasUsed": "674512", - "status": 1, - "byzantium": true - }, - "args": [ - "0xd56F695e73286ac252A37593DD4E7c14270eC1Df" - ], - "solcInputHash": "5ee8e508e2c54cb5ac6783b4855b1558", - "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"messageNonce\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"stateRootBatchHeader\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"siblings\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct Lib_OVMCodec.ChainInclusionProof\",\"name\":\"stateRootProof\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"stateTrieWitness\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"storageTrieWitness\",\"type\":\"bytes\"}],\"internalType\":\"struct iOVM_L1CrossDomainMessenger.L2MessageInclusionProof\",\"name\":\"proof\",\"type\":\"tuple\"}],\"internalType\":\"struct iOVM_L1MultiMessageRelayer.L2ToL1Message[]\",\"name\":\"_messages\",\"type\":\"tuple[]\"}],\"name\":\"batchRelayMessages\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The L1 Multi-Message Relayer contract is a gas efficiency optimization which enables the relayer to submit multiple messages in a single transaction to be relayed by the L1 Cross Domain Message Sender. Compiler used: solc Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"batchRelayMessages((address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))[])\":{\"params\":{\"_messages\":\"An array of L2 to L1 messages\"}},\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}}},\"title\":\"OVM_L1MultiMessageRelayer\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"batchRelayMessages((address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))[])\":{\"notice\":\"Forwards multiple cross domain messages to the L1 Cross Domain Messenger for relaying\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1MultiMessageRelayer.sol\":\"OVM_L1MultiMessageRelayer\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor () internal {\\n address msgSender = _msgSender();\\n _owner = msgSender;\\n emit OwnershipTransferred(address(0), msgSender);\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n emit OwnershipTransferred(_owner, address(0));\\n _owner = address(0);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n emit OwnershipTransferred(_owner, newOwner);\\n _owner = newOwner;\\n }\\n}\\n\",\"keccak256\":\"0x15e2d5bd4c28a88548074c54d220e8086f638a71ed07e6b3ba5a70066fcf458d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with GSN meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address payable) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes memory) {\\n this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x8d3cb350f04ff49cfb10aef08d87f19dcbaecc8027b0bed12f3275cd12f38cf0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1MultiMessageRelayer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// @unsupported: ovm\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Interface Imports */\\nimport { iOVM_L1CrossDomainMessenger } from \\\"../../../iOVM/bridge/messaging/iOVM_L1CrossDomainMessenger.sol\\\";\\nimport { iOVM_L1MultiMessageRelayer } from \\\"../../../iOVM/bridge/messaging/iOVM_L1MultiMessageRelayer.sol\\\";\\n\\n/* Library Imports */\\nimport { Lib_AddressResolver } from \\\"../../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/**\\n * @title OVM_L1MultiMessageRelayer\\n * @dev The L1 Multi-Message Relayer contract is a gas efficiency optimization which enables the\\n * relayer to submit multiple messages in a single transaction to be relayed by the L1 Cross Domain\\n * Message Sender.\\n *\\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract OVM_L1MultiMessageRelayer is iOVM_L1MultiMessageRelayer, Lib_AddressResolver {\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n */\\n constructor(\\n address _libAddressManager\\n )\\n Lib_AddressResolver(_libAddressManager)\\n {}\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyBatchRelayer() {\\n require(\\n msg.sender == resolve(\\\"OVM_L2BatchMessageRelayer\\\"),\\n \\\"OVM_L1MultiMessageRelayer: Function can only be called by the OVM_L2BatchMessageRelayer\\\"\\n );\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * @notice Forwards multiple cross domain messages to the L1 Cross Domain Messenger for relaying\\n * @param _messages An array of L2 to L1 messages\\n */\\n function batchRelayMessages(\\n L2ToL1Message[] calldata _messages\\n ) \\n override\\n external\\n onlyBatchRelayer\\n {\\n iOVM_L1CrossDomainMessenger messenger = iOVM_L1CrossDomainMessenger(\\n resolve(\\\"Proxy__OVM_L1CrossDomainMessenger\\\")\\n );\\n\\n for (uint256 i = 0; i < _messages.length; i++) {\\n L2ToL1Message memory message = _messages[i];\\n messenger.relayMessage(\\n message.target,\\n message.sender,\\n message.message,\\n message.messageNonce,\\n message.proof\\n );\\n }\\n }\\n}\\n\",\"keccak256\":\"0xe698b8dbdcecd055ee77cc553963f966faebcdefbed1e586f7fd603fa816d9c6\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/bridge/messaging/iAbs_BaseCrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/**\\n * @title iAbs_BaseCrossDomainMessenger\\n */\\ninterface iAbs_BaseCrossDomainMessenger {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event SentMessage(bytes message);\\n event RelayedMessage(bytes32 msgHash);\\n event FailedRelayedMessage(bytes32 msgHash);\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n function xDomainMessageSender() external view returns (address);\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sends a cross domain message to the target messenger.\\n * @param _target Target contract address.\\n * @param _message Message to send to the target.\\n * @param _gasLimit Gas limit for the provided message.\\n */\\n function sendMessage(\\n address _target,\\n bytes calldata _message,\\n uint32 _gasLimit\\n ) external;\\n}\\n\",\"keccak256\":\"0x89981ed48e99d6939cc6cdef827d484fa3e2292d66c0ba5056c7050cb6282d7e\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/bridge/messaging/iOVM_L1CrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { iAbs_BaseCrossDomainMessenger } from \\\"./iAbs_BaseCrossDomainMessenger.sol\\\";\\n\\n/**\\n * @title iOVM_L1CrossDomainMessenger\\n */\\ninterface iOVM_L1CrossDomainMessenger is iAbs_BaseCrossDomainMessenger {\\n\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n struct L2MessageInclusionProof {\\n bytes32 stateRoot;\\n Lib_OVMCodec.ChainBatchHeader stateRootBatchHeader;\\n Lib_OVMCodec.ChainInclusionProof stateRootProof;\\n bytes stateTrieWitness;\\n bytes storageTrieWitness;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Relays a cross domain message to a contract.\\n * @param _target Target contract address.\\n * @param _sender Message sender address.\\n * @param _message Message to send to the target.\\n * @param _messageNonce Nonce for the provided message.\\n * @param _proof Inclusion proof for the given message.\\n */\\n function relayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _messageNonce,\\n L2MessageInclusionProof memory _proof\\n ) external;\\n\\n /**\\n * Replays a cross domain message to the target messenger.\\n * @param _target Target contract address.\\n * @param _sender Original sender address.\\n * @param _message Message to send to the target.\\n * @param _messageNonce Nonce for the provided message.\\n * @param _gasLimit Gas limit for the provided message.\\n */\\n function replayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _messageNonce,\\n uint32 _gasLimit\\n ) external;\\n}\\n\",\"keccak256\":\"0xdcd239d0b215e400674d78e8db4ac12ba18efc34fa78e24c2ff867f61062dba2\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/bridge/messaging/iOVM_L1MultiMessageRelayer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Interface Imports */\\nimport { iOVM_L1CrossDomainMessenger } from \\\"../../../iOVM/bridge/messaging/iOVM_L1CrossDomainMessenger.sol\\\";\\ninterface iOVM_L1MultiMessageRelayer {\\n\\n struct L2ToL1Message {\\n address target;\\n address sender;\\n bytes message;\\n uint256 messageNonce;\\n iOVM_L1CrossDomainMessenger.L2MessageInclusionProof proof;\\n }\\n\\n function batchRelayMessages(L2ToL1Message[] calldata _messages) external;\\n}\\n\",\"keccak256\":\"0x8bc1fb2a33dcac59ec307195f8b8358d1ae2ab021c70a1589038b366d1b949d7\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/codec/Lib_OVMCodec.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../utils/Lib_Bytes32Utils.sol\\\";\\n\\n/**\\n * @title Lib_OVMCodec\\n */\\nlibrary Lib_OVMCodec {\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum QueueOrigin {\\n SEQUENCER_QUEUE,\\n L1TOL2_QUEUE\\n }\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Account {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n address ethAddress;\\n bool isFresh;\\n }\\n\\n struct EVMAccount {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n }\\n\\n struct ChainBatchHeader {\\n uint256 batchIndex;\\n bytes32 batchRoot;\\n uint256 batchSize;\\n uint256 prevTotalElements;\\n bytes extraData;\\n }\\n\\n struct ChainInclusionProof {\\n uint256 index;\\n bytes32[] siblings;\\n }\\n\\n struct Transaction {\\n uint256 timestamp;\\n uint256 blockNumber;\\n QueueOrigin l1QueueOrigin;\\n address l1TxOrigin;\\n address entrypoint;\\n uint256 gasLimit;\\n bytes data;\\n }\\n\\n struct TransactionChainElement {\\n bool isSequenced;\\n uint256 queueIndex; // QUEUED TX ONLY\\n uint256 timestamp; // SEQUENCER TX ONLY\\n uint256 blockNumber; // SEQUENCER TX ONLY\\n bytes txData; // SEQUENCER TX ONLY\\n }\\n\\n struct QueueElement {\\n bytes32 transactionHash;\\n uint40 timestamp;\\n uint40 blockNumber;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Encodes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Encoded transaction bytes.\\n */\\n function encodeTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return abi.encodePacked(\\n _transaction.timestamp,\\n _transaction.blockNumber,\\n _transaction.l1QueueOrigin,\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n );\\n }\\n\\n /**\\n * Hashes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Hashed transaction\\n */\\n function hashTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(encodeTransaction(_transaction));\\n }\\n\\n /**\\n * Converts an OVM account to an EVM account.\\n * @param _in OVM account to convert.\\n * @return Converted EVM account.\\n */\\n function toEVMAccount(\\n Account memory _in\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n return EVMAccount({\\n nonce: _in.nonce,\\n balance: _in.balance,\\n storageRoot: _in.storageRoot,\\n codeHash: _in.codeHash\\n });\\n }\\n\\n /**\\n * @notice RLP-encodes an account state struct.\\n * @param _account Account state struct.\\n * @return RLP-encoded account state.\\n */\\n function encodeEVMAccount(\\n EVMAccount memory _account\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes[] memory raw = new bytes[](4);\\n\\n // Unfortunately we can't create this array outright because\\n // Lib_RLPWriter.writeList will reject fixed-size arrays. Assigning\\n // index-by-index circumvents this issue.\\n raw[0] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.nonce)\\n )\\n );\\n raw[1] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.balance)\\n )\\n );\\n raw[2] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.storageRoot));\\n raw[3] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.codeHash));\\n\\n return Lib_RLPWriter.writeList(raw);\\n }\\n\\n /**\\n * @notice Decodes an RLP-encoded account state into a useful struct.\\n * @param _encoded RLP-encoded account state.\\n * @return Account state struct.\\n */\\n function decodeEVMAccount(\\n bytes memory _encoded\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\\n\\n return EVMAccount({\\n nonce: Lib_RLPReader.readUint256(accountState[0]),\\n balance: Lib_RLPReader.readUint256(accountState[1]),\\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\\n });\\n }\\n\\n /**\\n * Calculates a hash for a given batch header.\\n * @param _batchHeader Header to hash.\\n * @return Hash of the header.\\n */\\n function hashBatchHeader(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(\\n abi.encode(\\n _batchHeader.batchRoot,\\n _batchHeader.batchSize,\\n _batchHeader.prevTotalElements,\\n _batchHeader.extraData\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0xd85ba2066057a2677926f484b938c7c2ef33ff3853f3b71cda252f4a54f30e05\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n public\\n onlyOwner\\n {\\n addresses[_getNameHash(_name)] = _address;\\n\\n emit AddressSet(\\n _name,\\n _address\\n );\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0x2ce671a0e004df88b136bea5a3c59d0732cea8887c8496da1d509e0200b03d7d\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(\\n address _libAddressManager\\n ) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x65981feeabff6a81783ea97d44baf988a18a86c8cb374c46fdb71819cbacc7c0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPReader.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_RLPReader\\n * @dev Adapted from \\\"RLPReader\\\" by Hamdi Allam (hamdi.allam97@gmail.com).\\n */\\nlibrary Lib_RLPReader {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 constant internal MAX_LIST_LENGTH = 32;\\n\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum RLPItemType {\\n DATA_ITEM,\\n LIST_ITEM\\n }\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct RLPItem {\\n uint256 length;\\n uint256 ptr;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts bytes to a reference to memory position and length.\\n * @param _in Input bytes to convert.\\n * @return Output memory reference.\\n */\\n function toRLPItem(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem memory\\n )\\n {\\n uint256 ptr;\\n assembly {\\n ptr := add(_in, 32)\\n }\\n\\n return RLPItem({\\n length: _in.length,\\n ptr: ptr\\n });\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n (\\n uint256 listOffset,\\n ,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.LIST_ITEM,\\n \\\"Invalid RLP list value.\\\"\\n );\\n\\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\\n // writing to the length. Since we can't know the number of RLP items without looping over\\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\\n // simply set a reasonable maximum list length and decrease the size before we finish.\\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\\n\\n uint256 itemCount = 0;\\n uint256 offset = listOffset;\\n while (offset < _in.length) {\\n require(\\n itemCount < MAX_LIST_LENGTH,\\n \\\"Provided RLP list exceeds max list length.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n ) = _decodeLength(RLPItem({\\n length: _in.length - offset,\\n ptr: _in.ptr + offset\\n }));\\n\\n out[itemCount] = RLPItem({\\n length: itemLength + itemOffset,\\n ptr: _in.ptr + offset\\n });\\n\\n itemCount += 1;\\n offset += itemOffset + itemLength;\\n }\\n\\n // Decrease the array size to match the actual item count.\\n assembly {\\n mstore(out, itemCount)\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n return readList(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes value.\\\"\\n );\\n\\n return _copy(_in.ptr, itemOffset, itemLength);\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return readBytes(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return string(readBytes(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return readString(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n require(\\n _in.length <= 33,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr + itemOffset;\\n bytes32 out;\\n assembly {\\n out := mload(ptr)\\n\\n // Shift the bytes over to match the item size.\\n if lt(itemLength, 32) {\\n out := div(out, exp(256, sub(32, itemLength)))\\n }\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return readBytes32(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return uint256(readBytes32(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return readUint256(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n require(\\n _in.length == 1,\\n \\\"Invalid RLP boolean value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 out;\\n assembly {\\n out := byte(0, mload(ptr))\\n }\\n\\n require(\\n out == 0 || out == 1,\\n \\\"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\\\"\\n );\\n\\n return out != 0;\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return readBool(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n if (_in.length == 1) {\\n return address(0);\\n }\\n\\n require(\\n _in.length == 21,\\n \\\"Invalid RLP address value.\\\"\\n );\\n\\n return address(readUint256(_in));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return readAddress(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads the raw bytes of an RLP item.\\n * @param _in RLP item to read.\\n * @return Raw RLP bytes.\\n */\\n function readRawBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in);\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Decodes the length of an RLP item.\\n * @param _in RLP item to decode.\\n * @return Offset of the encoded data.\\n * @return Length of the encoded data.\\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\\n */\\n function _decodeLength(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n uint256,\\n uint256,\\n RLPItemType\\n )\\n {\\n require(\\n _in.length > 0,\\n \\\"RLP item cannot be null.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 prefix;\\n assembly {\\n prefix := byte(0, mload(ptr))\\n }\\n\\n if (prefix <= 0x7f) {\\n // Single byte.\\n\\n return (0, 1, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xb7) {\\n // Short string.\\n\\n uint256 strLen = prefix - 0x80;\\n\\n require(\\n _in.length > strLen,\\n \\\"Invalid RLP short string.\\\"\\n );\\n\\n return (1, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xbf) {\\n // Long string.\\n uint256 lenOfStrLen = prefix - 0xb7;\\n\\n require(\\n _in.length > lenOfStrLen,\\n \\\"Invalid RLP long string length.\\\"\\n );\\n\\n uint256 strLen;\\n assembly {\\n // Pick out the string length.\\n strLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfStrLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfStrLen + strLen,\\n \\\"Invalid RLP long string.\\\"\\n );\\n\\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xf7) {\\n // Short list.\\n uint256 listLen = prefix - 0xc0;\\n\\n require(\\n _in.length > listLen,\\n \\\"Invalid RLP short list.\\\"\\n );\\n\\n return (1, listLen, RLPItemType.LIST_ITEM);\\n } else {\\n // Long list.\\n uint256 lenOfListLen = prefix - 0xf7;\\n\\n require(\\n _in.length > lenOfListLen,\\n \\\"Invalid RLP long list length.\\\"\\n );\\n\\n uint256 listLen;\\n assembly {\\n // Pick out the list length.\\n listLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfListLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfListLen + listLen,\\n \\\"Invalid RLP long list.\\\"\\n );\\n\\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\\n }\\n }\\n\\n /**\\n * Copies the bytes from a memory location.\\n * @param _src Pointer to the location to read from.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Copied bytes.\\n */\\n function _copy(\\n uint256 _src,\\n uint256 _offset,\\n uint256 _length\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out = new bytes(_length);\\n if (out.length == 0) {\\n return out;\\n }\\n\\n uint256 src = _src + _offset;\\n uint256 dest;\\n assembly {\\n dest := add(out, 32)\\n }\\n\\n // Copy over as many complete words as we can.\\n for (uint256 i = 0; i < _length / 32; i++) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n\\n src += 32;\\n dest += 32;\\n }\\n\\n // Pick out the remaining bytes.\\n uint256 mask = 256 ** (32 - (_length % 32)) - 1;\\n assembly {\\n mstore(\\n dest,\\n or(\\n and(mload(src), not(mask)),\\n and(mload(dest), mask)\\n )\\n )\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Copies an RLP item into bytes.\\n * @param _in RLP item to copy.\\n * @return Copied bytes.\\n */\\n function _copy(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in.ptr, 0, _in.length);\\n }\\n}\\n\",\"keccak256\":\"0x829174c61216dce35fdb888383b6022e0365eb7fbdc71ad79d98b108091969fe\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPWriter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/**\\n * @title Lib_RLPWriter\\n * @author Bakaoh (with modifications)\\n */\\nlibrary Lib_RLPWriter {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * RLP encodes a byte string.\\n * @param _in The byte string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded;\\n\\n if (_in.length == 1 && uint8(_in[0]) < 128) {\\n encoded = _in;\\n } else {\\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * RLP encodes a list of RLP encoded byte byte strings.\\n * @param _in The list of RLP encoded byte strings.\\n * @return The RLP encoded list of items in bytes.\\n */\\n function writeList(\\n bytes[] memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory list = _flatten(_in);\\n return abi.encodePacked(_writeLength(list.length, 192), list);\\n }\\n\\n /**\\n * RLP encodes a string.\\n * @param _in The string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeString(\\n string memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(bytes(_in));\\n }\\n\\n /**\\n * RLP encodes an address.\\n * @param _in The address to encode.\\n * @return The RLP encoded address in bytes.\\n */\\n function writeAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a bytes32 value.\\n * @param _in The bytes32 to encode.\\n * @return _out The RLP encoded bytes32 in bytes.\\n */\\n function writeBytes32(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a uint.\\n * @param _in The uint256 to encode.\\n * @return The RLP encoded uint256 in bytes.\\n */\\n function writeUint(\\n uint256 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(_toBinary(_in));\\n }\\n\\n /**\\n * RLP encodes a bool.\\n * @param _in The bool to encode.\\n * @return The RLP encoded bool in bytes.\\n */\\n function writeBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded = new bytes(1);\\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\\n return encoded;\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\\n * @param _len The length of the string or the payload.\\n * @param _offset 128 if item is string, 192 if item is list.\\n * @return RLP encoded bytes.\\n */\\n function _writeLength(\\n uint256 _len,\\n uint256 _offset\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded;\\n\\n if (_len < 56) {\\n encoded = new bytes(1);\\n encoded[0] = byte(uint8(_len) + uint8(_offset));\\n } else {\\n uint256 lenLen;\\n uint256 i = 1;\\n while (_len / i != 0) {\\n lenLen++;\\n i *= 256;\\n }\\n\\n encoded = new bytes(lenLen + 1);\\n encoded[0] = byte(uint8(lenLen) + uint8(_offset) + 55);\\n for(i = 1; i <= lenLen; i++) {\\n encoded[i] = byte(uint8((_len / (256**(lenLen-i))) % 256));\\n }\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * Encode integer in big endian binary form with no leading zeroes.\\n * @notice TODO: This should be optimized with assembly to save gas costs.\\n * @param _x The integer to encode.\\n * @return RLP encoded bytes.\\n */\\n function _toBinary(\\n uint256 _x\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory b = abi.encodePacked(_x);\\n\\n uint256 i = 0;\\n for (; i < 32; i++) {\\n if (b[i] != 0) {\\n break;\\n }\\n }\\n\\n bytes memory res = new bytes(32 - i);\\n for (uint256 j = 0; j < res.length; j++) {\\n res[j] = b[i++];\\n }\\n\\n return res;\\n }\\n\\n /**\\n * Copies a piece of memory to another location.\\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\\n * @param _dest Destination location.\\n * @param _src Source location.\\n * @param _len Length of memory to copy.\\n */\\n function _memcpy(\\n uint256 _dest,\\n uint256 _src,\\n uint256 _len\\n )\\n private\\n pure\\n {\\n uint256 dest = _dest;\\n uint256 src = _src;\\n uint256 len = _len;\\n\\n for(; len >= 32; len -= 32) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n dest += 32;\\n src += 32;\\n }\\n\\n uint256 mask = 256 ** (32 - len) - 1;\\n assembly {\\n let srcpart := and(mload(src), not(mask))\\n let destpart := and(mload(dest), mask)\\n mstore(dest, or(destpart, srcpart))\\n }\\n }\\n\\n /**\\n * Flattens a list of byte strings into one byte string.\\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\\n * @param _list List of byte strings to flatten.\\n * @return The flattened byte string.\\n */\\n function _flatten(\\n bytes[] memory _list\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n if (_list.length == 0) {\\n return new bytes(0);\\n }\\n\\n uint256 len;\\n uint256 i = 0;\\n for (; i < _list.length; i++) {\\n len += _list[i].length;\\n }\\n\\n bytes memory flattened = new bytes(len);\\n uint256 flattenedPtr;\\n assembly { flattenedPtr := add(flattened, 0x20) }\\n\\n for(i = 0; i < _list.length; i++) {\\n bytes memory item = _list[i];\\n\\n uint256 listPtr;\\n assembly { listPtr := add(item, 0x20)}\\n\\n _memcpy(flattenedPtr, listPtr, item.length);\\n flattenedPtr += _list[i].length;\\n }\\n\\n return flattened;\\n }\\n}\\n\",\"keccak256\":\"0xb60ee4b03ad372c3deff21d454ab714dd0c18ee3e6f9d45532e209fc59d5a54d\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_Bytes32Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_Byte32Utils\\n */\\nlibrary Lib_Bytes32Utils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \\\"true.\\\"\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as a boolean.\\n */\\n function toBool(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return _in != 0;\\n }\\n\\n /**\\n * Converts a boolean to a bytes32 value.\\n * @param _in Input boolean value.\\n * @return Boolean as a bytes32.\\n */\\n function fromBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in ? 1 : 0));\\n }\\n\\n /**\\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as an address.\\n */\\n function toAddress(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return address(uint160(uint256(_in)));\\n }\\n\\n /**\\n * Converts an address to a bytes32.\\n * @param _in Input address value.\\n * @return Address as a bytes32.\\n */\\n function fromAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in));\\n }\\n\\n /**\\n * Removes the leading zeros from a bytes32 value and returns a new (smaller) bytes value.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 without any leading zeros.\\n */\\n function removeLeadingZeros(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out;\\n\\n assembly {\\n // Figure out how many leading zero bytes to remove.\\n let shift := 0\\n for { let i := 0 } and(lt(i, 32), eq(byte(i, _in), 0)) { i := add(i, 1) } {\\n shift := add(shift, 1)\\n }\\n\\n // Reserve some space for our output and fix the free memory pointer.\\n out := mload(0x40)\\n mstore(0x40, add(out, 0x40))\\n\\n // Shift the value and store it into the output bytes.\\n mstore(add(out, 0x20), shl(mul(shift, 8), _in))\\n\\n // Store the new size (with leading zero bytes removed) in the output byte size.\\n mstore(out, sub(32, shift))\\n }\\n\\n return out;\\n }\\n}\\n\",\"keccak256\":\"0xfa2def593e3fc56a31852c3744aefdaa93cec74e721bfcfeb1e5d166c7c60b64\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_BytesUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_BytesUtils\\n */\\nlibrary Lib_BytesUtils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_start + _length >= _start, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n if (_bytes.length - _start == 0) {\\n return bytes('');\\n }\\n\\n return slice(_bytes, _start, _bytes.length - _start);\\n }\\n\\n function toBytes32PadLeft(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n bytes32 ret;\\n uint256 len = _bytes.length <= 32 ? _bytes.length : 32;\\n assembly {\\n ret := shr(mul(sub(32, len), 8), mload(add(_bytes, 32)))\\n }\\n return ret;\\n }\\n\\n function toBytes32(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n if (_bytes.length < 32) {\\n bytes32 ret;\\n assembly {\\n ret := mload(add(_bytes, 32))\\n }\\n return ret;\\n }\\n\\n return abi.decode(_bytes,(bytes32)); // will truncate if input length > 32 bytes\\n }\\n\\n function toUint256(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return uint256(toBytes32(_bytes));\\n }\\n\\n function toUint24(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n uint24\\n )\\n {\\n require(_start + 3 >= _start, \\\"toUint24_overflow\\\");\\n require(_bytes.length >= _start + 3 , \\\"toUint24_outOfBounds\\\");\\n uint24 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x3), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toUint8(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n uint8\\n )\\n {\\n require(_start + 1 >= _start, \\\"toUint8_overflow\\\");\\n require(_bytes.length >= _start + 1 , \\\"toUint8_outOfBounds\\\");\\n uint8 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x1), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toAddress(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n require(_start + 20 >= _start, \\\"toAddress_overflow\\\");\\n require(_bytes.length >= _start + 20, \\\"toAddress_outOfBounds\\\");\\n address tempAddress;\\n\\n assembly {\\n tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000)\\n }\\n\\n return tempAddress;\\n }\\n\\n function toNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory nibbles = new bytes(_bytes.length * 2);\\n\\n for (uint256 i = 0; i < _bytes.length; i++) {\\n nibbles[i * 2] = _bytes[i] >> 4;\\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\\n }\\n\\n return nibbles;\\n }\\n\\n function fromNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory ret = new bytes(_bytes.length / 2);\\n\\n for (uint256 i = 0; i < ret.length; i++) {\\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\\n }\\n\\n return ret;\\n }\\n\\n function equal(\\n bytes memory _bytes,\\n bytes memory _other\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return keccak256(_bytes) == keccak256(_other);\\n }\\n}\\n\",\"keccak256\":\"0xa5195afe32fb2cf104d156e8f4bd39df1ec79bf6ba232097b9e8e0ee14fbc298\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x608060405234801561001057600080fd5b50604051610a22380380610a2283398101604081905261002f91610054565b600080546001600160a01b0319166001600160a01b0392909216919091179055610082565b600060208284031215610065578081fd5b81516001600160a01b038116811461007b578182fd5b9392505050565b610991806100916000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c806316e9cd9b14610046578063299ca4781461005b578063461a447814610079575b600080fd5b61005961005436600461057d565b61008c565b005b6100636101ea565b60405161007091906106db565b60405180910390f35b6100636100873660046105ec565b6101f9565b6100ca6040518060400160405280601981526020017f4f564d5f4c3242617463684d65737361676552656c61796572000000000000008152506101f9565b6001600160a01b0316336001600160a01b0316146101035760405162461bcd60e51b81526004016100fa906107d7565b60405180910390fd5b600061012660405180606001604052806021815260200161093b602191396101f9565b905060005b828110156101e457600084848381811061014157fe5b9050602002810190610153919061085a565b61015c9061089d565b8051602082015160408084015160608501516080860151925163d7fd19dd60e01b81529596506001600160a01b0389169563d7fd19dd956101a5959094909392916004016106ef565b600060405180830381600087803b1580156101bf57600080fd5b505af11580156101d3573d6000803e3d6000fd5b50506001909301925061012b915050565b50505050565b6000546001600160a01b031681565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b83811015610259578181015183820152602001610241565b50505050905090810190601f1680156102865780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b1580156102a357600080fd5b505afa1580156102b7573d6000803e3d6000fd5b505050506040513d60208110156102cd57600080fd5b505190505b919050565b600067ffffffffffffffff8311156102eb57fe5b6102fe601f8401601f1916602001610879565b905082815283838301111561031257600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b03811681146102d257600080fd5b600082601f830112610350578081fd5b61035f838335602085016102d7565b9392505050565b600060a08284031215610377578081fd5b60405160a0810167ffffffffffffffff828210818311171561039557fe5b816040528293508435835260208501356020840152604085013560408401526060850135606084015260808501359150808211156103d257600080fd5b506103df85828601610340565b6080830152505092915050565b6000604082840312156103fd578081fd5b6040516040810167ffffffffffffffff828210818311171561041b57fe5b816040528293508435835260209150818501358181111561043b57600080fd5b8501601f8101871361044c57600080fd5b80358281111561045857fe5b8381029250610468848401610879565b8181528481019083860185850187018b101561048357600080fd5b600095505b838610156104a6578035835260019590950194918601918601610488565b5080868801525050505050505092915050565b600060a082840312156104ca578081fd5b6104d460a0610879565b905081358152602082013567ffffffffffffffff808211156104f557600080fd5b61050185838601610366565b6020840152604084013591508082111561051a57600080fd5b610526858386016103ec565b6040840152606084013591508082111561053f57600080fd5b61054b85838601610340565b6060840152608084013591508082111561056457600080fd5b5061057184828501610340565b60808301525092915050565b6000806020838503121561058f578182fd5b823567ffffffffffffffff808211156105a6578384fd5b818501915085601f8301126105b9578384fd5b8135818111156105c7578485fd5b86602080830285010111156105da578485fd5b60209290920196919550909350505050565b6000602082840312156105fd578081fd5b813567ffffffffffffffff811115610613578182fd5b8201601f81018413610623578182fd5b610632848235602084016102d7565b949350505050565b60008151808452815b8181101561065f57602081850181015186830182015201610643565b818111156106705782602083870101525b50601f01601f19169290920160200192915050565b6000604083018251845260208084015160408287015282815180855260608801915083830194508592505b808310156106d057845182529383019360019290920191908301906106b0565b509695505050505050565b6001600160a01b0391909116815260200190565b6001600160a01b0386811682528516602082015260a06040820181905260009061071b9083018661063a565b846060840152828103608084015283518152602084015160a06020830152805160a0830152602081015160c0830152604081015160e083015260608101516101008301526080810151905060a061012083015261077c61014083018261063a565b9050604085015182820360408401526107958282610685565b915050606085015182820360608401526107af828261063a565b915050608085015182820360808401526107c9828261063a565b9a9950505050505050505050565b60208082526057908201527f4f564d5f4c314d756c74694d65737361676552656c617965723a2046756e637460408201527f696f6e2063616e206f6e6c792062652063616c6c656420627920746865204f5660608201527f4d5f4c3242617463684d65737361676552656c61796572000000000000000000608082015260a00190565b60008235609e1983360301811261086f578182fd5b9190910192915050565b60405181810167ffffffffffffffff8111828210171561089557fe5b604052919050565b600060a082360312156108ae578081fd5b60405160a0810167ffffffffffffffff82821081831117156108cc57fe5b816040526108d985610329565b83526108e760208601610329565b602084015260408501359150808211156108ff578384fd5b61090b36838701610340565b604084015260608501356060840152608085013591508082111561092d578384fd5b50610571368286016104b956fe50726f78795f5f4f564d5f4c3143726f7373446f6d61696e4d657373656e676572a264697066735822122054e57719bdaae865a83549e03668e0558acc8a0d1d5ba65034f61a02d9a35c6264736f6c63430007060033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100415760003560e01c806316e9cd9b14610046578063299ca4781461005b578063461a447814610079575b600080fd5b61005961005436600461057d565b61008c565b005b6100636101ea565b60405161007091906106db565b60405180910390f35b6100636100873660046105ec565b6101f9565b6100ca6040518060400160405280601981526020017f4f564d5f4c3242617463684d65737361676552656c61796572000000000000008152506101f9565b6001600160a01b0316336001600160a01b0316146101035760405162461bcd60e51b81526004016100fa906107d7565b60405180910390fd5b600061012660405180606001604052806021815260200161093b602191396101f9565b905060005b828110156101e457600084848381811061014157fe5b9050602002810190610153919061085a565b61015c9061089d565b8051602082015160408084015160608501516080860151925163d7fd19dd60e01b81529596506001600160a01b0389169563d7fd19dd956101a5959094909392916004016106ef565b600060405180830381600087803b1580156101bf57600080fd5b505af11580156101d3573d6000803e3d6000fd5b50506001909301925061012b915050565b50505050565b6000546001600160a01b031681565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b83811015610259578181015183820152602001610241565b50505050905090810190601f1680156102865780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b1580156102a357600080fd5b505afa1580156102b7573d6000803e3d6000fd5b505050506040513d60208110156102cd57600080fd5b505190505b919050565b600067ffffffffffffffff8311156102eb57fe5b6102fe601f8401601f1916602001610879565b905082815283838301111561031257600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b03811681146102d257600080fd5b600082601f830112610350578081fd5b61035f838335602085016102d7565b9392505050565b600060a08284031215610377578081fd5b60405160a0810167ffffffffffffffff828210818311171561039557fe5b816040528293508435835260208501356020840152604085013560408401526060850135606084015260808501359150808211156103d257600080fd5b506103df85828601610340565b6080830152505092915050565b6000604082840312156103fd578081fd5b6040516040810167ffffffffffffffff828210818311171561041b57fe5b816040528293508435835260209150818501358181111561043b57600080fd5b8501601f8101871361044c57600080fd5b80358281111561045857fe5b8381029250610468848401610879565b8181528481019083860185850187018b101561048357600080fd5b600095505b838610156104a6578035835260019590950194918601918601610488565b5080868801525050505050505092915050565b600060a082840312156104ca578081fd5b6104d460a0610879565b905081358152602082013567ffffffffffffffff808211156104f557600080fd5b61050185838601610366565b6020840152604084013591508082111561051a57600080fd5b610526858386016103ec565b6040840152606084013591508082111561053f57600080fd5b61054b85838601610340565b6060840152608084013591508082111561056457600080fd5b5061057184828501610340565b60808301525092915050565b6000806020838503121561058f578182fd5b823567ffffffffffffffff808211156105a6578384fd5b818501915085601f8301126105b9578384fd5b8135818111156105c7578485fd5b86602080830285010111156105da578485fd5b60209290920196919550909350505050565b6000602082840312156105fd578081fd5b813567ffffffffffffffff811115610613578182fd5b8201601f81018413610623578182fd5b610632848235602084016102d7565b949350505050565b60008151808452815b8181101561065f57602081850181015186830182015201610643565b818111156106705782602083870101525b50601f01601f19169290920160200192915050565b6000604083018251845260208084015160408287015282815180855260608801915083830194508592505b808310156106d057845182529383019360019290920191908301906106b0565b509695505050505050565b6001600160a01b0391909116815260200190565b6001600160a01b0386811682528516602082015260a06040820181905260009061071b9083018661063a565b846060840152828103608084015283518152602084015160a06020830152805160a0830152602081015160c0830152604081015160e083015260608101516101008301526080810151905060a061012083015261077c61014083018261063a565b9050604085015182820360408401526107958282610685565b915050606085015182820360608401526107af828261063a565b915050608085015182820360808401526107c9828261063a565b9a9950505050505050505050565b60208082526057908201527f4f564d5f4c314d756c74694d65737361676552656c617965723a2046756e637460408201527f696f6e2063616e206f6e6c792062652063616c6c656420627920746865204f5660608201527f4d5f4c3242617463684d65737361676552656c61796572000000000000000000608082015260a00190565b60008235609e1983360301811261086f578182fd5b9190910192915050565b60405181810167ffffffffffffffff8111828210171561089557fe5b604052919050565b600060a082360312156108ae578081fd5b60405160a0810167ffffffffffffffff82821081831117156108cc57fe5b816040526108d985610329565b83526108e760208601610329565b602084015260408501359150808211156108ff578384fd5b61090b36838701610340565b604084015260608501356060840152608085013591508082111561092d578384fd5b50610571368286016104b956fe50726f78795f5f4f564d5f4c3143726f7373446f6d61696e4d657373656e676572a264697066735822122054e57719bdaae865a83549e03668e0558acc8a0d1d5ba65034f61a02d9a35c6264736f6c63430007060033", - "devdoc": { - "details": "The L1 Multi-Message Relayer contract is a gas efficiency optimization which enables the relayer to submit multiple messages in a single transaction to be relayed by the L1 Cross Domain Message Sender. Compiler used: solc Runtime target: EVM", - "kind": "dev", - "methods": { - "batchRelayMessages((address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))[])": { - "params": { - "_messages": "An array of L2 to L1 messages" - } - }, - "constructor": { - "params": { - "_libAddressManager": "Address of the Address Manager." - } - }, - "resolve(string)": { - "params": { - "_name": "Name to resolve an address for." - }, - "returns": { - "_0": "Address associated with the given name." - } - } - }, - "title": "OVM_L1MultiMessageRelayer", - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": { - "batchRelayMessages((address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))[])": { - "notice": "Forwards multiple cross domain messages to the L1 Cross Domain Messenger for relaying" - }, - "resolve(string)": { - "notice": "Resolves the address associated with a given name." - } - }, - "version": 1 - }, - "storageLayout": { - "storage": [ - { - "astId": 12800, - "contract": "contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1MultiMessageRelayer.sol:OVM_L1MultiMessageRelayer", - "label": "libAddressManager", - "offset": 0, - "slot": "0", - "type": "t_contract(Lib_AddressManager)12793" - } - ], - "types": { - "t_contract(Lib_AddressManager)12793": { - "encoding": "inplace", - "label": "contract Lib_AddressManager", - "numberOfBytes": "20" - } - } - } -} \ No newline at end of file diff --git a/packages/contracts/deployments/kovan-v3/OVM_SafetyChecker.json b/packages/contracts/deployments/kovan-v3/OVM_SafetyChecker.json deleted file mode 100644 index aa5d39e753eab..0000000000000 --- a/packages/contracts/deployments/kovan-v3/OVM_SafetyChecker.json +++ /dev/null @@ -1,74 +0,0 @@ -{ - "address": "0xf0FaB0ce35a6d3F82b0B42f09A2734065908dB6a", - "abi": [ - { - "inputs": [ - { - "internalType": "bytes", - "name": "_bytecode", - "type": "bytes" - } - ], - "name": "isBytecodeSafe", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "pure", - "type": "function" - } - ], - "transactionHash": "0x3db100815c1e0b4b185f3eca0541d88c95348ba8e6a7beba8d0a96f6437544c3", - "receipt": { - "to": null, - "from": "0x18394B52d3Cb931dfA76F63251919D051953413d", - "contractAddress": "0xf0FaB0ce35a6d3F82b0B42f09A2734065908dB6a", - "transactionIndex": 1, - "gasUsed": "243548", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0xb26ad9738f8cc5da3a4e95a3e73bb4b26ca317503fa696d4dc1acdf8d12c63db", - "transactionHash": "0x3db100815c1e0b4b185f3eca0541d88c95348ba8e6a7beba8d0a96f6437544c3", - "logs": [], - "blockNumber": 24572875, - "cumulativeGasUsed": "288408", - "status": 1, - "byzantium": true - }, - "args": [], - "solcInputHash": "5ee8e508e2c54cb5ac6783b4855b1558", - "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_bytecode\",\"type\":\"bytes\"}],\"name\":\"isBytecodeSafe\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The Safety Checker verifies that contracts deployed on L2 do not contain any \\\"unsafe\\\" operations. An operation is considered unsafe if it would access state variables which are specific to the environment (ie. L1 or L2) in which it is executed, as this could be used to \\\"escape the sandbox\\\" of the OVM, resulting in non-deterministic fraud proofs. That is, an attacker would be able to \\\"prove fraud\\\" on an honestly applied transaction. Note that a \\\"safe\\\" contract requires opcodes to appear in a particular pattern; omission of \\\"unsafe\\\" opcodes is necessary, but not sufficient. Compiler used: solc Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"isBytecodeSafe(bytes)\":{\"params\":{\"_bytecode\":\"The bytecode to safety check.\"},\"returns\":{\"_0\":\"`true` if the bytecode is safe, `false` otherwise.\"}}},\"title\":\"OVM_SafetyChecker\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"isBytecodeSafe(bytes)\":{\"notice\":\"Returns whether or not all of the provided bytecode is safe.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/OVM/execution/OVM_SafetyChecker.sol\":\"OVM_SafetyChecker\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/optimistic-ethereum/OVM/execution/OVM_SafetyChecker.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Interface Imports */\\nimport { iOVM_SafetyChecker } from \\\"../../iOVM/execution/iOVM_SafetyChecker.sol\\\";\\n\\n/**\\n * @title OVM_SafetyChecker\\n * @dev The Safety Checker verifies that contracts deployed on L2 do not contain any\\n * \\\"unsafe\\\" operations. An operation is considered unsafe if it would access state variables which\\n * are specific to the environment (ie. L1 or L2) in which it is executed, as this could be used\\n * to \\\"escape the sandbox\\\" of the OVM, resulting in non-deterministic fraud proofs.\\n * That is, an attacker would be able to \\\"prove fraud\\\" on an honestly applied transaction.\\n * Note that a \\\"safe\\\" contract requires opcodes to appear in a particular pattern;\\n * omission of \\\"unsafe\\\" opcodes is necessary, but not sufficient.\\n *\\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract OVM_SafetyChecker is iOVM_SafetyChecker {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Returns whether or not all of the provided bytecode is safe.\\n * @param _bytecode The bytecode to safety check.\\n * @return `true` if the bytecode is safe, `false` otherwise.\\n */\\n function isBytecodeSafe(\\n bytes memory _bytecode\\n )\\n override\\n external\\n pure\\n returns (\\n bool\\n )\\n {\\n // autogenerated by gen_safety_checker_constants.py\\n // number of bytes to skip for each opcode\\n uint256[8] memory opcodeSkippableBytes = [\\n uint256(0x0001010101010101010101010000000001010101010101010101010101010000),\\n uint256(0x0100000000000000000000000000000000000000010101010101000000010100),\\n uint256(0x0000000000000000000000000000000001010101000000010101010100000000),\\n uint256(0x0203040500000000000000000000000000000000000000000000000000000000),\\n uint256(0x0101010101010101010101010101010101010101010101010101010101010101),\\n uint256(0x0101010101000000000000000000000000000000000000000000000000000000),\\n uint256(0x0000000000000000000000000000000000000000000000000000000000000000),\\n uint256(0x0000000000000000000000000000000000000000000000000000000000000000)\\n ];\\n // Mask to gate opcode specific cases\\n uint256 opcodeGateMask = ~uint256(0xffffffffffffffffffffffe000000000fffffffff070ffff9c0ffffec000f001);\\n // Halting opcodes\\n uint256 opcodeHaltingMask = ~uint256(0x4008000000000000000000000000000000000000004000000000000000000001);\\n // PUSH opcodes\\n uint256 opcodePushMask = ~uint256(0xffffffff000000000000000000000000);\\n\\n uint256 codeLength;\\n uint256 _pc;\\n assembly {\\n _pc := add(_bytecode, 0x20)\\n }\\n codeLength = _pc + _bytecode.length;\\n do {\\n // current opcode: 0x00...0xff\\n uint256 opNum;\\n\\n // inline assembly removes the extra add + bounds check\\n assembly {\\n let word := mload(_pc) //load the next 32 bytes at pc into word\\n\\n // Look up number of bytes to skip from opcodeSkippableBytes and then update indexInWord\\n // E.g. the 02030405 in opcodeSkippableBytes is the number of bytes to skip for PUSH1->4\\n // We repeat this 6 times, thus we can only skip bytes for up to PUSH4 ((1+4) * 6 = 30 < 32).\\n // If we see an opcode that is listed as 0 skippable bytes e.g. PUSH5,\\n // then we will get stuck on that indexInWord and then opNum will be set to the PUSH5 opcode.\\n let indexInWord := byte(0, mload(add(opcodeSkippableBytes, byte(0, word))))\\n indexInWord := add(indexInWord, byte(0, mload(add(opcodeSkippableBytes, byte(indexInWord, word)))))\\n indexInWord := add(indexInWord, byte(0, mload(add(opcodeSkippableBytes, byte(indexInWord, word)))))\\n indexInWord := add(indexInWord, byte(0, mload(add(opcodeSkippableBytes, byte(indexInWord, word)))))\\n indexInWord := add(indexInWord, byte(0, mload(add(opcodeSkippableBytes, byte(indexInWord, word)))))\\n indexInWord := add(indexInWord, byte(0, mload(add(opcodeSkippableBytes, byte(indexInWord, word)))))\\n _pc := add(_pc, indexInWord)\\n\\n opNum := byte(indexInWord, word)\\n }\\n\\n // + push opcodes\\n // + stop opcodes [STOP(0x00),JUMP(0x56),RETURN(0xf3),INVALID(0xfe)]\\n // + caller opcode CALLER(0x33)\\n // + blacklisted opcodes\\n uint256 opBit = 1 << opNum;\\n if (opBit & opcodeGateMask == 0) {\\n if (opBit & opcodePushMask == 0) {\\n // all pushes are valid opcodes\\n // subsequent bytes are not opcodes. Skip them.\\n _pc += (opNum - 0x5e); // PUSH1 is 0x60, so opNum-0x5f = PUSHed bytes and we +1 to\\n // skip the _pc++; line below in order to save gas ((-0x5f + 1) = -0x5e)\\n continue;\\n } else if (opBit & opcodeHaltingMask == 0) {\\n // STOP or JUMP or RETURN or INVALID (Note: REVERT is blacklisted, so not included here)\\n // We are now inside unreachable code until we hit a JUMPDEST!\\n do {\\n _pc++;\\n assembly {\\n opNum := byte(0, mload(_pc))\\n }\\n // encountered a JUMPDEST\\n if (opNum == 0x5b) break;\\n // skip PUSHed bytes\\n if ((1 << opNum) & opcodePushMask == 0) _pc += (opNum - 0x5f); // opNum-0x5f = PUSHed bytes (PUSH1 is 0x60)\\n } while (_pc < codeLength);\\n // opNum is 0x5b, so we don't continue here since the pc++ is fine\\n } else if (opNum == 0x33) { // Caller opcode\\n uint256 firstOps; // next 32 bytes of bytecode\\n uint256 secondOps; // following 32 bytes of bytecode\\n\\n assembly {\\n firstOps := mload(_pc)\\n // 37 bytes total, 5 left over --> 32 - 5 bytes = 27 bytes = 216 bits\\n secondOps := shr(216, mload(add(_pc, 0x20)))\\n }\\n\\n // Call identity precompile\\n // CALLER POP PUSH1 0x00 PUSH1 0x04 GAS CALL\\n // 32 - 8 bytes = 24 bytes = 192\\n if ((firstOps >> 192) == 0x3350600060045af1) {\\n _pc += 8;\\n // Call EM and abort execution if instructed\\n // CALLER PUSH1 0x00 SWAP1 GAS CALL PC PUSH1 0x0E ADD JUMPI RETURNDATASIZE PUSH1 0x00 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x00 REVERT JUMPDEST RETURNDATASIZE PUSH1 0x01 EQ ISZERO PC PUSH1 0x0a ADD JUMPI PUSH1 0x01 PUSH1 0x00 RETURN JUMPDEST\\n } else if (firstOps == 0x336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a015760 && secondOps == 0x016000f35b) {\\n _pc += 37;\\n } else {\\n return false;\\n }\\n continue;\\n } else {\\n // encountered a non-whitelisted opcode!\\n return false;\\n }\\n }\\n _pc++;\\n } while (_pc < codeLength);\\n return true;\\n }\\n}\\n\",\"keccak256\":\"0x44cd4fcdcb25a233fa98da5ba66706ce2f9fbf13359cf7f2891793739687a86f\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/execution/iOVM_SafetyChecker.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title iOVM_SafetyChecker\\n */\\ninterface iOVM_SafetyChecker {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function isBytecodeSafe(bytes calldata _bytecode) external pure returns (bool);\\n}\\n\",\"keccak256\":\"0xde6639676d4ec4f77297652d5ede2429bc93e74e11fefd9e9de4bc92dd784878\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x608060405234801561001057600080fd5b50610373806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063a44eb59a14610030575b600080fd5b6100d66004803603602081101561004657600080fd5b81019060208101813564010000000081111561006157600080fd5b82018360208201111561007357600080fd5b8035906020019184600183028401116401000000008311171561009557600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506100ea945050505050565b604080519115158252519081900360200190f35b60408051610100810182527e0101010101010101010101000000000101010101010101010101010101000081526b010101010101000000010100600160f81b016020808301919091526f0101010100000001010101010000000092820192909252630203040560e01b60608201527f0101010101010101010101010101010101010101010101010101010101010101608082015264010101010160d81b60a0820152600060c0820181905260e0820181905283519092741fffffffff000000000f8f000063f000013fff0ffe916a40000000000000000000026117ff60f31b039163ffffffff60601b1991870181019087015b8051600081811a880151811a82811a890151821a0182811a890151821a0182811a890151821a0182811a890151821a0182811a89015190911a01918201911a6001811b86811661032057808516610239575001605d1901610326565b80861661027e575b8280600101935050825160001a915081605b141561025e57610279565b6001821b851661027157918101605e1901915b838310610241575b610320565b816033141561030f578251602084015160d81c673350600060045af160c083901c14156102b057600885019450610306565b817f336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a0157601480156102e357508064016000f35b145b156102f357602585019450610306565b60009a5050505050505050505050610338565b50505050610326565b600098505050505050505050610338565b50506001015b8181106101dd57600196505050505050505b91905056fea26469706673582212209a836b268dcf58167a9f65bb872e3ddb5bd93b231f6b456f1c5e6d75b92a746364736f6c63430007060033", - "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061002b5760003560e01c8063a44eb59a14610030575b600080fd5b6100d66004803603602081101561004657600080fd5b81019060208101813564010000000081111561006157600080fd5b82018360208201111561007357600080fd5b8035906020019184600183028401116401000000008311171561009557600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506100ea945050505050565b604080519115158252519081900360200190f35b60408051610100810182527e0101010101010101010101000000000101010101010101010101010101000081526b010101010101000000010100600160f81b016020808301919091526f0101010100000001010101010000000092820192909252630203040560e01b60608201527f0101010101010101010101010101010101010101010101010101010101010101608082015264010101010160d81b60a0820152600060c0820181905260e0820181905283519092741fffffffff000000000f8f000063f000013fff0ffe916a40000000000000000000026117ff60f31b039163ffffffff60601b1991870181019087015b8051600081811a880151811a82811a890151821a0182811a890151821a0182811a890151821a0182811a890151821a0182811a89015190911a01918201911a6001811b86811661032057808516610239575001605d1901610326565b80861661027e575b8280600101935050825160001a915081605b141561025e57610279565b6001821b851661027157918101605e1901915b838310610241575b610320565b816033141561030f578251602084015160d81c673350600060045af160c083901c14156102b057600885019450610306565b817f336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a0157601480156102e357508064016000f35b145b156102f357602585019450610306565b60009a5050505050505050505050610338565b50505050610326565b600098505050505050505050610338565b50506001015b8181106101dd57600196505050505050505b91905056fea26469706673582212209a836b268dcf58167a9f65bb872e3ddb5bd93b231f6b456f1c5e6d75b92a746364736f6c63430007060033", - "devdoc": { - "details": "The Safety Checker verifies that contracts deployed on L2 do not contain any \"unsafe\" operations. An operation is considered unsafe if it would access state variables which are specific to the environment (ie. L1 or L2) in which it is executed, as this could be used to \"escape the sandbox\" of the OVM, resulting in non-deterministic fraud proofs. That is, an attacker would be able to \"prove fraud\" on an honestly applied transaction. Note that a \"safe\" contract requires opcodes to appear in a particular pattern; omission of \"unsafe\" opcodes is necessary, but not sufficient. Compiler used: solc Runtime target: EVM", - "kind": "dev", - "methods": { - "isBytecodeSafe(bytes)": { - "params": { - "_bytecode": "The bytecode to safety check." - }, - "returns": { - "_0": "`true` if the bytecode is safe, `false` otherwise." - } - } - }, - "title": "OVM_SafetyChecker", - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": { - "isBytecodeSafe(bytes)": { - "notice": "Returns whether or not all of the provided bytecode is safe." - } - }, - "version": 1 - }, - "storageLayout": { - "storage": [], - "types": null - } -} \ No newline at end of file diff --git a/packages/contracts/deployments/kovan-v3/OVM_StateCommitmentChain.json b/packages/contracts/deployments/kovan-v3/OVM_StateCommitmentChain.json deleted file mode 100644 index 1e34677174753..0000000000000 --- a/packages/contracts/deployments/kovan-v3/OVM_StateCommitmentChain.json +++ /dev/null @@ -1,529 +0,0 @@ -{ - "address": "0xdB1367bB36C34618778D492725C3eD11B508aC54", - "abi": [ - { - "inputs": [ - { - "internalType": "address", - "name": "_libAddressManager", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_fraudProofWindow", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_sequencerPublishWindow", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "_batchIndex", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "bytes32", - "name": "_batchRoot", - "type": "bytes32" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_batchSize", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_prevTotalElements", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "bytes", - "name": "_extraData", - "type": "bytes" - } - ], - "name": "StateBatchAppended", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "_batchIndex", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "bytes32", - "name": "_batchRoot", - "type": "bytes32" - } - ], - "name": "StateBatchDeleted", - "type": "event" - }, - { - "inputs": [], - "name": "FRAUD_PROOF_WINDOW", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "SEQUENCER_PUBLISH_WINDOW", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32[]", - "name": "_batch", - "type": "bytes32[]" - }, - { - "internalType": "uint256", - "name": "_shouldStartAtElement", - "type": "uint256" - } - ], - "name": "appendStateBatch", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "batches", - "outputs": [ - { - "internalType": "contract iOVM_ChainStorageContainer", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "components": [ - { - "internalType": "uint256", - "name": "batchIndex", - "type": "uint256" - }, - { - "internalType": "bytes32", - "name": "batchRoot", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "batchSize", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "prevTotalElements", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "extraData", - "type": "bytes" - } - ], - "internalType": "struct Lib_OVMCodec.ChainBatchHeader", - "name": "_batchHeader", - "type": "tuple" - } - ], - "name": "deleteStateBatch", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "getLastSequencerTimestamp", - "outputs": [ - { - "internalType": "uint256", - "name": "_lastSequencerTimestamp", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getTotalBatches", - "outputs": [ - { - "internalType": "uint256", - "name": "_totalBatches", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getTotalElements", - "outputs": [ - { - "internalType": "uint256", - "name": "_totalElements", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "components": [ - { - "internalType": "uint256", - "name": "batchIndex", - "type": "uint256" - }, - { - "internalType": "bytes32", - "name": "batchRoot", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "batchSize", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "prevTotalElements", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "extraData", - "type": "bytes" - } - ], - "internalType": "struct Lib_OVMCodec.ChainBatchHeader", - "name": "_batchHeader", - "type": "tuple" - } - ], - "name": "insideFraudProofWindow", - "outputs": [ - { - "internalType": "bool", - "name": "_inside", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "libAddressManager", - "outputs": [ - { - "internalType": "contract Lib_AddressManager", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "string", - "name": "_name", - "type": "string" - } - ], - "name": "resolve", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "_element", - "type": "bytes32" - }, - { - "components": [ - { - "internalType": "uint256", - "name": "batchIndex", - "type": "uint256" - }, - { - "internalType": "bytes32", - "name": "batchRoot", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "batchSize", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "prevTotalElements", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "extraData", - "type": "bytes" - } - ], - "internalType": "struct Lib_OVMCodec.ChainBatchHeader", - "name": "_batchHeader", - "type": "tuple" - }, - { - "components": [ - { - "internalType": "uint256", - "name": "index", - "type": "uint256" - }, - { - "internalType": "bytes32[]", - "name": "siblings", - "type": "bytes32[]" - } - ], - "internalType": "struct Lib_OVMCodec.ChainInclusionProof", - "name": "_proof", - "type": "tuple" - } - ], - "name": "verifyStateCommitment", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - } - ], - "transactionHash": "0x8c4c4052dc351f960e93b01fdd1e39be3b8dab99459b1be05254609d70df6c9f", - "receipt": { - "to": null, - "from": "0x18394B52d3Cb931dfA76F63251919D051953413d", - "contractAddress": "0xdB1367bB36C34618778D492725C3eD11B508aC54", - "transactionIndex": 1, - "gasUsed": "1624653", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0x82d155659e443e841339b8422848b42afa81a4fcb8e285c6e423b3e266ee431b", - "transactionHash": "0x8c4c4052dc351f960e93b01fdd1e39be3b8dab99459b1be05254609d70df6c9f", - "logs": [], - "blockNumber": 24572817, - "cumulativeGasUsed": "1667041", - "status": 1, - "byzantium": true - }, - "args": [ - "0xd56F695e73286ac252A37593DD4E7c14270eC1Df", - 60, - 15769999 - ], - "solcInputHash": "5ee8e508e2c54cb5ac6783b4855b1558", - "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_fraudProofWindow\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_sequencerPublishWindow\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_batchIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"_batchRoot\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_batchSize\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_prevTotalElements\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"_extraData\",\"type\":\"bytes\"}],\"name\":\"StateBatchAppended\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_batchIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"_batchRoot\",\"type\":\"bytes32\"}],\"name\":\"StateBatchDeleted\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"FRAUD_PROOF_WINDOW\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"SEQUENCER_PUBLISH_WINDOW\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"_batch\",\"type\":\"bytes32[]\"},{\"internalType\":\"uint256\",\"name\":\"_shouldStartAtElement\",\"type\":\"uint256\"}],\"name\":\"appendStateBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"batches\",\"outputs\":[{\"internalType\":\"contract iOVM_ChainStorageContainer\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"_batchHeader\",\"type\":\"tuple\"}],\"name\":\"deleteStateBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLastSequencerTimestamp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_lastSequencerTimestamp\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTotalBatches\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_totalBatches\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTotalElements\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_totalElements\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"_batchHeader\",\"type\":\"tuple\"}],\"name\":\"insideFraudProofWindow\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"_inside\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_element\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"_batchHeader\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"siblings\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct Lib_OVMCodec.ChainInclusionProof\",\"name\":\"_proof\",\"type\":\"tuple\"}],\"name\":\"verifyStateCommitment\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The State Commitment Chain (SCC) contract contains a list of proposed state roots which Proposers assert to be a result of each transaction in the Canonical Transaction Chain (CTC). Elements here have a 1:1 correspondence with transactions in the CTC, and should be the unique state root calculated off-chain by applying the canonical transactions one by one. Compiler used: solc Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"appendStateBatch(bytes32[],uint256)\":{\"params\":{\"_batch\":\"Batch of state roots.\",\"_shouldStartAtElement\":\"Index of the element at which this batch should start.\"}},\"batches()\":{\"returns\":{\"_0\":\"Reference to the batch storage container.\"}},\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\"}},\"deleteStateBatch((uint256,bytes32,uint256,uint256,bytes))\":{\"params\":{\"_batchHeader\":\"Header of the batch to start deleting from.\"}},\"getLastSequencerTimestamp()\":{\"returns\":{\"_lastSequencerTimestamp\":\"Last sequencer batch timestamp.\"}},\"getTotalBatches()\":{\"returns\":{\"_totalBatches\":\"Total submitted batches.\"}},\"getTotalElements()\":{\"returns\":{\"_totalElements\":\"Total submitted elements.\"}},\"insideFraudProofWindow((uint256,bytes32,uint256,uint256,bytes))\":{\"params\":{\"_batchHeader\":\"Header of the batch to check.\"},\"returns\":{\"_inside\":\"Whether or not the batch is inside the fraud proof window.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}},\"verifyStateCommitment(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))\":{\"params\":{\"_batchHeader\":\"Header of the batch in which the element was included.\",\"_element\":\"Hash of the element to verify a proof for.\",\"_proof\":\"Merkle inclusion proof for the element.\"}}},\"title\":\"OVM_StateCommitmentChain\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"appendStateBatch(bytes32[],uint256)\":{\"notice\":\"Appends a batch of state roots to the chain.\"},\"batches()\":{\"notice\":\"Accesses the batch storage container.\"},\"deleteStateBatch((uint256,bytes32,uint256,uint256,bytes))\":{\"notice\":\"Deletes all state roots after (and including) a given batch.\"},\"getLastSequencerTimestamp()\":{\"notice\":\"Retrieves the timestamp of the last batch submitted by the sequencer.\"},\"getTotalBatches()\":{\"notice\":\"Retrieves the total number of batches submitted.\"},\"getTotalElements()\":{\"notice\":\"Retrieves the total number of elements submitted.\"},\"insideFraudProofWindow((uint256,bytes32,uint256,uint256,bytes))\":{\"notice\":\"Checks whether a given batch is still inside its fraud proof window.\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"},\"verifyStateCommitment(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))\":{\"notice\":\"Verifies a batch inclusion proof.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/OVM/chain/OVM_StateCommitmentChain.sol\":\"OVM_StateCommitmentChain\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor () internal {\\n address msgSender = _msgSender();\\n _owner = msgSender;\\n emit OwnershipTransferred(address(0), msgSender);\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n emit OwnershipTransferred(_owner, address(0));\\n _owner = address(0);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n emit OwnershipTransferred(_owner, newOwner);\\n _owner = newOwner;\\n }\\n}\\n\",\"keccak256\":\"0x15e2d5bd4c28a88548074c54d220e8086f638a71ed07e6b3ba5a70066fcf458d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/math/SafeMath.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\n * checks.\\n *\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\n * in bugs, because programmers usually assume that an overflow raises an\\n * error, which is the standard behavior in high level programming languages.\\n * `SafeMath` restores this intuition by reverting the transaction when an\\n * operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n */\\nlibrary SafeMath {\\n /**\\n * @dev Returns the addition of two unsigned integers, with an overflow flag.\\n *\\n * _Available since v3.4._\\n */\\n function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n uint256 c = a + b;\\n if (c < a) return (false, 0);\\n return (true, c);\\n }\\n\\n /**\\n * @dev Returns the substraction of two unsigned integers, with an overflow flag.\\n *\\n * _Available since v3.4._\\n */\\n function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n if (b > a) return (false, 0);\\n return (true, a - b);\\n }\\n\\n /**\\n * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\\n *\\n * _Available since v3.4._\\n */\\n function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\n // benefit is lost if 'b' is also tested.\\n // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\n if (a == 0) return (true, 0);\\n uint256 c = a * b;\\n if (c / a != b) return (false, 0);\\n return (true, c);\\n }\\n\\n /**\\n * @dev Returns the division of two unsigned integers, with a division by zero flag.\\n *\\n * _Available since v3.4._\\n */\\n function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n if (b == 0) return (false, 0);\\n return (true, a / b);\\n }\\n\\n /**\\n * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\\n *\\n * _Available since v3.4._\\n */\\n function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n if (b == 0) return (false, 0);\\n return (true, a % b);\\n }\\n\\n /**\\n * @dev Returns the addition of two unsigned integers, reverting on\\n * overflow.\\n *\\n * Counterpart to Solidity's `+` operator.\\n *\\n * Requirements:\\n *\\n * - Addition cannot overflow.\\n */\\n function add(uint256 a, uint256 b) internal pure returns (uint256) {\\n uint256 c = a + b;\\n require(c >= a, \\\"SafeMath: addition overflow\\\");\\n return c;\\n }\\n\\n /**\\n * @dev Returns the subtraction of two unsigned integers, reverting on\\n * overflow (when the result is negative).\\n *\\n * Counterpart to Solidity's `-` operator.\\n *\\n * Requirements:\\n *\\n * - Subtraction cannot overflow.\\n */\\n function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\n require(b <= a, \\\"SafeMath: subtraction overflow\\\");\\n return a - b;\\n }\\n\\n /**\\n * @dev Returns the multiplication of two unsigned integers, reverting on\\n * overflow.\\n *\\n * Counterpart to Solidity's `*` operator.\\n *\\n * Requirements:\\n *\\n * - Multiplication cannot overflow.\\n */\\n function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\n if (a == 0) return 0;\\n uint256 c = a * b;\\n require(c / a == b, \\\"SafeMath: multiplication overflow\\\");\\n return c;\\n }\\n\\n /**\\n * @dev Returns the integer division of two unsigned integers, reverting on\\n * division by zero. The result is rounded towards zero.\\n *\\n * Counterpart to Solidity's `/` operator. Note: this function uses a\\n * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n * uses an invalid opcode to revert (consuming all remaining gas).\\n *\\n * Requirements:\\n *\\n * - The divisor cannot be zero.\\n */\\n function div(uint256 a, uint256 b) internal pure returns (uint256) {\\n require(b > 0, \\\"SafeMath: division by zero\\\");\\n return a / b;\\n }\\n\\n /**\\n * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n * reverting when dividing by zero.\\n *\\n * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n * opcode (which leaves remaining gas untouched) while Solidity uses an\\n * invalid opcode to revert (consuming all remaining gas).\\n *\\n * Requirements:\\n *\\n * - The divisor cannot be zero.\\n */\\n function mod(uint256 a, uint256 b) internal pure returns (uint256) {\\n require(b > 0, \\\"SafeMath: modulo by zero\\\");\\n return a % b;\\n }\\n\\n /**\\n * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\n * overflow (when the result is negative).\\n *\\n * CAUTION: This function is deprecated because it requires allocating memory for the error\\n * message unnecessarily. For custom revert reasons use {trySub}.\\n *\\n * Counterpart to Solidity's `-` operator.\\n *\\n * Requirements:\\n *\\n * - Subtraction cannot overflow.\\n */\\n function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n require(b <= a, errorMessage);\\n return a - b;\\n }\\n\\n /**\\n * @dev Returns the integer division of two unsigned integers, reverting with custom message on\\n * division by zero. The result is rounded towards zero.\\n *\\n * CAUTION: This function is deprecated because it requires allocating memory for the error\\n * message unnecessarily. For custom revert reasons use {tryDiv}.\\n *\\n * Counterpart to Solidity's `/` operator. Note: this function uses a\\n * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n * uses an invalid opcode to revert (consuming all remaining gas).\\n *\\n * Requirements:\\n *\\n * - The divisor cannot be zero.\\n */\\n function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n require(b > 0, errorMessage);\\n return a / b;\\n }\\n\\n /**\\n * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n * reverting with custom message when dividing by zero.\\n *\\n * CAUTION: This function is deprecated because it requires allocating memory for the error\\n * message unnecessarily. For custom revert reasons use {tryMod}.\\n *\\n * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n * opcode (which leaves remaining gas untouched) while Solidity uses an\\n * invalid opcode to revert (consuming all remaining gas).\\n *\\n * Requirements:\\n *\\n * - The divisor cannot be zero.\\n */\\n function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n require(b > 0, errorMessage);\\n return a % b;\\n }\\n}\\n\",\"keccak256\":\"0xcc78a17dd88fa5a2edc60c8489e2f405c0913b377216a5b26b35656b2d0dab52\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with GSN meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address payable) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes memory) {\\n this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x8d3cb350f04ff49cfb10aef08d87f19dcbaecc8027b0bed12f3275cd12f38cf0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/chain/OVM_StateCommitmentChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\nimport { Lib_MerkleTree } from \\\"../../libraries/utils/Lib_MerkleTree.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_FraudVerifier } from \\\"../../iOVM/verification/iOVM_FraudVerifier.sol\\\";\\nimport { iOVM_StateCommitmentChain } from \\\"../../iOVM/chain/iOVM_StateCommitmentChain.sol\\\";\\nimport { iOVM_CanonicalTransactionChain } from \\\"../../iOVM/chain/iOVM_CanonicalTransactionChain.sol\\\";\\nimport { iOVM_BondManager } from \\\"../../iOVM/verification/iOVM_BondManager.sol\\\";\\nimport { iOVM_ChainStorageContainer } from \\\"../../iOVM/chain/iOVM_ChainStorageContainer.sol\\\";\\n\\n/* External Imports */\\nimport '@openzeppelin/contracts/math/SafeMath.sol';\\n\\n/**\\n * @title OVM_StateCommitmentChain\\n * @dev The State Commitment Chain (SCC) contract contains a list of proposed state roots which\\n * Proposers assert to be a result of each transaction in the Canonical Transaction Chain (CTC).\\n * Elements here have a 1:1 correspondence with transactions in the CTC, and should be the unique\\n * state root calculated off-chain by applying the canonical transactions one by one.\\n *\\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract OVM_StateCommitmentChain is iOVM_StateCommitmentChain, Lib_AddressResolver {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 public FRAUD_PROOF_WINDOW;\\n uint256 public SEQUENCER_PUBLISH_WINDOW;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n */\\n constructor(\\n address _libAddressManager,\\n uint256 _fraudProofWindow,\\n uint256 _sequencerPublishWindow\\n )\\n Lib_AddressResolver(_libAddressManager)\\n {\\n FRAUD_PROOF_WINDOW = _fraudProofWindow;\\n SEQUENCER_PUBLISH_WINDOW = _sequencerPublishWindow;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Accesses the batch storage container.\\n * @return Reference to the batch storage container.\\n */\\n function batches()\\n public\\n view\\n returns (\\n iOVM_ChainStorageContainer\\n )\\n {\\n return iOVM_ChainStorageContainer(\\n resolve(\\\"OVM_ChainStorageContainer:SCC:batches\\\")\\n );\\n }\\n\\n /**\\n * @inheritdoc iOVM_StateCommitmentChain\\n */\\n function getTotalElements()\\n override\\n public\\n view\\n returns (\\n uint256 _totalElements\\n )\\n {\\n (uint40 totalElements, ) = _getBatchExtraData();\\n return uint256(totalElements);\\n }\\n\\n /**\\n * @inheritdoc iOVM_StateCommitmentChain\\n */\\n function getTotalBatches()\\n override\\n public\\n view\\n returns (\\n uint256 _totalBatches\\n )\\n {\\n return batches().length();\\n }\\n\\n /**\\n * @inheritdoc iOVM_StateCommitmentChain\\n */\\n function getLastSequencerTimestamp()\\n override\\n public\\n view\\n returns (\\n uint256 _lastSequencerTimestamp\\n )\\n {\\n (, uint40 lastSequencerTimestamp) = _getBatchExtraData();\\n return uint256(lastSequencerTimestamp);\\n }\\n\\n /**\\n * @inheritdoc iOVM_StateCommitmentChain\\n */\\n function appendStateBatch(\\n bytes32[] memory _batch,\\n uint256 _shouldStartAtElement\\n )\\n override\\n public\\n {\\n // Fail fast in to make sure our batch roots aren't accidentally made fraudulent by the\\n // publication of batches by some other user.\\n require(\\n _shouldStartAtElement == getTotalElements(),\\n \\\"Actual batch start index does not match expected start index.\\\"\\n );\\n\\n // Proposers must have previously staked at the BondManager\\n require(\\n iOVM_BondManager(resolve(\\\"OVM_BondManager\\\")).isCollateralized(msg.sender),\\n \\\"Proposer does not have enough collateral posted\\\"\\n );\\n\\n require(\\n _batch.length > 0,\\n \\\"Cannot submit an empty state batch.\\\"\\n );\\n\\n require(\\n getTotalElements() + _batch.length <= iOVM_CanonicalTransactionChain(resolve(\\\"OVM_CanonicalTransactionChain\\\")).getTotalElements(),\\n \\\"Number of state roots cannot exceed the number of canonical transactions.\\\"\\n );\\n\\n // Pass the block's timestamp and the publisher of the data\\n // to be used in the fraud proofs\\n _appendBatch(\\n _batch,\\n abi.encode(block.timestamp, msg.sender)\\n );\\n }\\n\\n /**\\n * @inheritdoc iOVM_StateCommitmentChain\\n */\\n function deleteStateBatch(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n override\\n public\\n {\\n require(\\n msg.sender == resolve(\\\"OVM_FraudVerifier\\\"),\\n \\\"State batches can only be deleted by the OVM_FraudVerifier.\\\"\\n );\\n\\n require(\\n _isValidBatchHeader(_batchHeader),\\n \\\"Invalid batch header.\\\"\\n );\\n\\n require(\\n insideFraudProofWindow(_batchHeader),\\n \\\"State batches can only be deleted within the fraud proof window.\\\"\\n );\\n\\n _deleteBatch(_batchHeader);\\n }\\n\\n /**\\n * @inheritdoc iOVM_StateCommitmentChain\\n */\\n function verifyStateCommitment(\\n bytes32 _element,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _proof\\n )\\n override\\n public\\n view\\n returns (\\n bool\\n )\\n {\\n require(\\n _isValidBatchHeader(_batchHeader),\\n \\\"Invalid batch header.\\\"\\n );\\n\\n require(\\n Lib_MerkleTree.verify(\\n _batchHeader.batchRoot,\\n _element,\\n _proof.index,\\n _proof.siblings,\\n _batchHeader.batchSize\\n ),\\n \\\"Invalid inclusion proof.\\\"\\n );\\n\\n return true;\\n }\\n\\n /**\\n * @inheritdoc iOVM_StateCommitmentChain\\n */\\n function insideFraudProofWindow(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n override\\n public\\n view\\n returns (\\n bool _inside\\n )\\n {\\n (uint256 timestamp,) = abi.decode(\\n _batchHeader.extraData,\\n (uint256, address)\\n );\\n\\n require(\\n timestamp != 0,\\n \\\"Batch header timestamp cannot be zero\\\"\\n );\\n return SafeMath.add(timestamp, FRAUD_PROOF_WINDOW) > block.timestamp;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Parses the batch context from the extra data.\\n * @return Total number of elements submitted.\\n * @return Timestamp of the last batch submitted by the sequencer.\\n */\\n function _getBatchExtraData()\\n internal\\n view\\n returns (\\n uint40,\\n uint40\\n )\\n {\\n bytes27 extraData = batches().getGlobalMetadata();\\n\\n uint40 totalElements;\\n uint40 lastSequencerTimestamp;\\n assembly {\\n extraData := shr(40, extraData)\\n totalElements := and(extraData, 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF)\\n lastSequencerTimestamp := shr(40, and(extraData, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000))\\n }\\n\\n return (\\n totalElements,\\n lastSequencerTimestamp\\n );\\n }\\n\\n /**\\n * Encodes the batch context for the extra data.\\n * @param _totalElements Total number of elements submitted.\\n * @param _lastSequencerTimestamp Timestamp of the last batch submitted by the sequencer.\\n * @return Encoded batch context.\\n */\\n function _makeBatchExtraData(\\n uint40 _totalElements,\\n uint40 _lastSequencerTimestamp\\n )\\n internal\\n pure\\n returns (\\n bytes27\\n )\\n {\\n bytes27 extraData;\\n assembly {\\n extraData := _totalElements\\n extraData := or(extraData, shl(40, _lastSequencerTimestamp))\\n extraData := shl(40, extraData)\\n }\\n\\n return extraData;\\n }\\n\\n /**\\n * Appends a batch to the chain.\\n * @param _batch Elements within the batch.\\n * @param _extraData Any extra data to append to the batch.\\n */\\n function _appendBatch(\\n bytes32[] memory _batch,\\n bytes memory _extraData\\n )\\n internal\\n {\\n address sequencer = resolve(\\\"OVM_Proposer\\\");\\n (uint40 totalElements, uint40 lastSequencerTimestamp) = _getBatchExtraData();\\n\\n if (msg.sender == sequencer) {\\n lastSequencerTimestamp = uint40(block.timestamp);\\n } else {\\n // We keep track of the last batch submitted by the sequencer so there's a window in\\n // which only the sequencer can publish state roots. A window like this just reduces\\n // the chance of \\\"system breaking\\\" state roots being published while we're still in\\n // testing mode. This window should be removed or significantly reduced in the future.\\n require(\\n lastSequencerTimestamp + SEQUENCER_PUBLISH_WINDOW < block.timestamp,\\n \\\"Cannot publish state roots within the sequencer publication window.\\\"\\n );\\n }\\n\\n // For efficiency reasons getMerkleRoot modifies the `_batch` argument in place\\n // while calculating the root hash therefore any arguments passed to it must not\\n // be used again afterwards\\n Lib_OVMCodec.ChainBatchHeader memory batchHeader = Lib_OVMCodec.ChainBatchHeader({\\n batchIndex: getTotalBatches(),\\n batchRoot: Lib_MerkleTree.getMerkleRoot(_batch),\\n batchSize: _batch.length,\\n prevTotalElements: totalElements,\\n extraData: _extraData\\n });\\n\\n emit StateBatchAppended(\\n batchHeader.batchIndex,\\n batchHeader.batchRoot,\\n batchHeader.batchSize,\\n batchHeader.prevTotalElements,\\n batchHeader.extraData\\n );\\n\\n batches().push(\\n Lib_OVMCodec.hashBatchHeader(batchHeader),\\n _makeBatchExtraData(\\n uint40(batchHeader.prevTotalElements + batchHeader.batchSize),\\n lastSequencerTimestamp\\n )\\n );\\n }\\n\\n /**\\n * Removes a batch and all subsequent batches from the chain.\\n * @param _batchHeader Header of the batch to remove.\\n */\\n function _deleteBatch(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n internal\\n {\\n require(\\n _batchHeader.batchIndex < batches().length(),\\n \\\"Invalid batch index.\\\"\\n );\\n\\n require(\\n _isValidBatchHeader(_batchHeader),\\n \\\"Invalid batch header.\\\"\\n );\\n\\n batches().deleteElementsAfterInclusive(\\n _batchHeader.batchIndex,\\n _makeBatchExtraData(\\n uint40(_batchHeader.prevTotalElements),\\n 0\\n )\\n );\\n\\n emit StateBatchDeleted(\\n _batchHeader.batchIndex,\\n _batchHeader.batchRoot\\n );\\n }\\n\\n /**\\n * Checks that a batch header matches the stored hash for the given index.\\n * @param _batchHeader Batch header to validate.\\n * @return Whether or not the header matches the stored one.\\n */\\n function _isValidBatchHeader(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n internal\\n view\\n returns (\\n bool\\n )\\n {\\n return Lib_OVMCodec.hashBatchHeader(_batchHeader) == batches().get(_batchHeader.batchIndex);\\n }\\n}\\n\",\"keccak256\":\"0x5b72c845f856a06c978880d3cb2db40dafebaebf399df100c6ac832eaf41d7bd\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_CanonicalTransactionChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_ChainStorageContainer } from \\\"./iOVM_ChainStorageContainer.sol\\\";\\n\\n/**\\n * @title iOVM_CanonicalTransactionChain\\n */\\ninterface iOVM_CanonicalTransactionChain {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event TransactionEnqueued(\\n address _l1TxOrigin,\\n address _target,\\n uint256 _gasLimit,\\n bytes _data,\\n uint256 _queueIndex,\\n uint256 _timestamp\\n );\\n\\n event QueueBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event SequencerBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event TransactionBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct BatchContext {\\n uint256 numSequencedTransactions;\\n uint256 numSubsequentQueueTransactions;\\n uint256 timestamp;\\n uint256 blockNumber;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n\\n /**\\n * Accesses the batch storage container.\\n * @return Reference to the batch storage container.\\n */\\n function batches()\\n external\\n view\\n returns (\\n iOVM_ChainStorageContainer\\n );\\n\\n /**\\n * Accesses the queue storage container.\\n * @return Reference to the queue storage container.\\n */\\n function queue()\\n external\\n view\\n returns (\\n iOVM_ChainStorageContainer\\n );\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements()\\n external\\n view\\n returns (\\n uint256 _totalElements\\n );\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches()\\n external\\n view\\n returns (\\n uint256 _totalBatches\\n );\\n\\n /**\\n * Returns the index of the next element to be enqueued.\\n * @return Index for the next queue element.\\n */\\n function getNextQueueIndex()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Gets the queue element at a particular index.\\n * @param _index Index of the queue element to access.\\n * @return _element Queue element at the given index.\\n */\\n function getQueueElement(\\n uint256 _index\\n )\\n external\\n view\\n returns (\\n Lib_OVMCodec.QueueElement memory _element\\n );\\n\\n /**\\n * Returns the timestamp of the last transaction.\\n * @return Timestamp for the last transaction.\\n */\\n function getLastTimestamp()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Returns the blocknumber of the last transaction.\\n * @return Blocknumber for the last transaction.\\n */\\n function getLastBlockNumber()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Get the number of queue elements which have not yet been included.\\n * @return Number of pending queue elements.\\n */\\n function getNumPendingQueueElements()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Retrieves the length of the queue, including\\n * both pending and canonical transactions.\\n * @return Length of the queue.\\n */\\n function getQueueLength()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n\\n /**\\n * Adds a transaction to the queue.\\n * @param _target Target contract to send the transaction to.\\n * @param _gasLimit Gas limit for the given transaction.\\n * @param _data Transaction data.\\n */\\n function enqueue(\\n address _target,\\n uint256 _gasLimit,\\n bytes memory _data\\n )\\n external;\\n\\n /**\\n * Appends a given number of queued transactions as a single batch.\\n * @param _numQueuedTransactions Number of transactions to append.\\n */\\n function appendQueueBatch(\\n uint256 _numQueuedTransactions\\n )\\n external;\\n\\n /**\\n * Allows the sequencer to append a batch of transactions.\\n * @dev This function uses a custom encoding scheme for efficiency reasons.\\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\\n * .param _contexts Array of batch contexts.\\n * .param _transactionDataFields Array of raw transaction data.\\n */\\n function appendSequencerBatch(\\n // uint40 _shouldStartAtElement,\\n // uint24 _totalElementsToAppend,\\n // BatchContext[] _contexts,\\n // bytes[] _transactionDataFields\\n )\\n external;\\n\\n /**\\n * Verifies whether a transaction is included in the chain.\\n * @param _transaction Transaction to verify.\\n * @param _txChainElement Transaction chain element corresponding to the transaction.\\n * @param _batchHeader Header of the batch the transaction was included in.\\n * @param _inclusionProof Inclusion proof for the provided transaction chain element.\\n * @return True if the transaction exists in the CTC, false if not.\\n */\\n function verifyTransaction(\\n Lib_OVMCodec.Transaction memory _transaction,\\n Lib_OVMCodec.TransactionChainElement memory _txChainElement,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _inclusionProof\\n )\\n external\\n view\\n returns (\\n bool\\n );\\n}\\n\",\"keccak256\":\"0xb5e55488a1982841c07cdf5ff475da4789596f111dd48f01b1918ee4c775cf3a\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_ChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title iOVM_ChainStorageContainer\\n */\\ninterface iOVM_ChainStorageContainer {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata()\\n external\\n view\\n returns (\\n bytes27\\n );\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length()\\n external\\n view\\n returns (\\n uint256\\n );\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(\\n bytes32 _object\\n )\\n external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(\\n bytes32 _object,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(\\n uint256 _index\\n )\\n external\\n view\\n returns (\\n bytes32\\n );\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index\\n )\\n external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Marks an index as overwritable, meaing the underlying buffer can start to write values over\\n * any objects before and including the given index.\\n */\\n function setNextOverwritableIndex(\\n uint256 _index\\n )\\n external;\\n}\\n\",\"keccak256\":\"0x2d7973a0ad84c23ec62624d3f1e3aeb198cc72686ff1e6cfa17155556b320c94\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_StateCommitmentChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title iOVM_StateCommitmentChain\\n */\\ninterface iOVM_StateCommitmentChain {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event StateBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n event StateBatchDeleted(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot\\n );\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements()\\n external\\n view\\n returns (\\n uint256 _totalElements\\n );\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches()\\n external\\n view\\n returns (\\n uint256 _totalBatches\\n );\\n\\n /**\\n * Retrieves the timestamp of the last batch submitted by the sequencer.\\n * @return _lastSequencerTimestamp Last sequencer batch timestamp.\\n */\\n function getLastSequencerTimestamp()\\n external\\n view\\n returns (\\n uint256 _lastSequencerTimestamp\\n );\\n\\n /**\\n * Appends a batch of state roots to the chain.\\n * @param _batch Batch of state roots.\\n * @param _shouldStartAtElement Index of the element at which this batch should start.\\n */\\n function appendStateBatch(\\n bytes32[] calldata _batch,\\n uint256 _shouldStartAtElement\\n )\\n external;\\n\\n /**\\n * Deletes all state roots after (and including) a given batch.\\n * @param _batchHeader Header of the batch to start deleting from.\\n */\\n function deleteStateBatch(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n external;\\n\\n /**\\n * Verifies a batch inclusion proof.\\n * @param _element Hash of the element to verify a proof for.\\n * @param _batchHeader Header of the batch in which the element was included.\\n * @param _proof Merkle inclusion proof for the element.\\n */\\n function verifyStateCommitment(\\n bytes32 _element,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _proof\\n )\\n external\\n view\\n returns (\\n bool _verified\\n );\\n\\n /**\\n * Checks whether a given batch is still inside its fraud proof window.\\n * @param _batchHeader Header of the batch to check.\\n * @return _inside Whether or not the batch is inside the fraud proof window.\\n */\\n function insideFraudProofWindow(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n external\\n view\\n returns (\\n bool _inside\\n );\\n}\\n\",\"keccak256\":\"0x6646d6ff392b81aab52a7a277e91540819464751de0af5afd1962094b2e92448\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/verification/iOVM_BondManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\ninterface ERC20 {\\n function transfer(address, uint256) external returns (bool);\\n function transferFrom(address, address, uint256) external returns (bool);\\n}\\n\\n/// All the errors which may be encountered on the bond manager\\nlibrary Errors {\\n string constant ERC20_ERR = \\\"BondManager: Could not post bond\\\";\\n string constant ALREADY_FINALIZED = \\\"BondManager: Fraud proof for this pre-state root has already been finalized\\\";\\n string constant SLASHED = \\\"BondManager: Cannot finalize withdrawal, you probably got slashed\\\";\\n string constant WRONG_STATE = \\\"BondManager: Wrong bond state for proposer\\\";\\n string constant CANNOT_CLAIM = \\\"BondManager: Cannot claim yet. Dispute must be finalized first\\\";\\n\\n string constant WITHDRAWAL_PENDING = \\\"BondManager: Withdrawal already pending\\\";\\n string constant TOO_EARLY = \\\"BondManager: Too early to finalize your withdrawal\\\";\\n\\n string constant ONLY_TRANSITIONER = \\\"BondManager: Only the transitioner for this pre-state root may call this function\\\";\\n string constant ONLY_FRAUD_VERIFIER = \\\"BondManager: Only the fraud verifier may call this function\\\";\\n string constant ONLY_STATE_COMMITMENT_CHAIN = \\\"BondManager: Only the state commitment chain may call this function\\\";\\n string constant WAIT_FOR_DISPUTES = \\\"BondManager: Wait for other potential disputes\\\";\\n}\\n\\n/**\\n * @title iOVM_BondManager\\n */\\ninterface iOVM_BondManager {\\n\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n /// The lifecycle of a proposer's bond\\n enum State {\\n // Before depositing or after getting slashed, a user is uncollateralized\\n NOT_COLLATERALIZED,\\n // After depositing, a user is collateralized\\n COLLATERALIZED,\\n // After a user has initiated a withdrawal\\n WITHDRAWING\\n }\\n\\n /// A bond posted by a proposer\\n struct Bond {\\n // The user's state\\n State state;\\n // The timestamp at which a proposer issued their withdrawal request\\n uint32 withdrawalTimestamp;\\n // The time when the first disputed was initiated for this bond\\n uint256 firstDisputeAt;\\n // The earliest observed state root for this bond which has had fraud\\n bytes32 earliestDisputedStateRoot;\\n // The state root's timestamp\\n uint256 earliestTimestamp;\\n }\\n\\n // Per pre-state root, store the number of state provisions that were made\\n // and how many of these calls were made by each user. Payouts will then be\\n // claimed by users proportionally for that dispute.\\n struct Rewards {\\n // Flag to check if rewards for a fraud proof are claimable\\n bool canClaim;\\n // Total number of `recordGasSpent` calls made\\n uint256 total;\\n // The gas spent by each user to provide witness data. The sum of all\\n // values inside this map MUST be equal to the value of `total`\\n mapping(address => uint256) gasSpent;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function recordGasSpent(\\n bytes32 _preStateRoot,\\n bytes32 _txHash,\\n address _who,\\n uint256 _gasSpent\\n ) external;\\n\\n function finalize(\\n bytes32 _preStateRoot,\\n address _publisher,\\n uint256 _timestamp\\n ) external;\\n\\n function deposit() external;\\n\\n function startWithdrawal() external;\\n\\n function finalizeWithdrawal() external;\\n\\n function claim(\\n address _who\\n ) external;\\n\\n function isCollateralized(\\n address _who\\n ) external view returns (bool);\\n\\n function getGasSpent(\\n bytes32 _preStateRoot,\\n address _who\\n ) external view returns (uint256);\\n}\\n\",\"keccak256\":\"0x3c2a8a399487857158649db1896749d86e39cba545a8aeb2e2bb0f3bdfa7a5b1\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/verification/iOVM_FraudVerifier.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_StateTransitioner } from \\\"./iOVM_StateTransitioner.sol\\\";\\n\\n/**\\n * @title iOVM_FraudVerifier\\n */\\ninterface iOVM_FraudVerifier {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event FraudProofInitialized(\\n bytes32 _preStateRoot,\\n uint256 _preStateRootIndex,\\n bytes32 _transactionHash,\\n address _who\\n );\\n\\n event FraudProofFinalized(\\n bytes32 _preStateRoot,\\n uint256 _preStateRootIndex,\\n bytes32 _transactionHash,\\n address _who\\n );\\n\\n\\n /***************************************\\n * Public Functions: Transition Status *\\n ***************************************/\\n\\n function getStateTransitioner(bytes32 _preStateRoot, bytes32 _txHash) external view returns (iOVM_StateTransitioner _transitioner);\\n\\n\\n /****************************************\\n * Public Functions: Fraud Verification *\\n ****************************************/\\n\\n function initializeFraudVerification(\\n bytes32 _preStateRoot,\\n Lib_OVMCodec.ChainBatchHeader calldata _preStateRootBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof calldata _preStateRootProof,\\n Lib_OVMCodec.Transaction calldata _transaction,\\n Lib_OVMCodec.TransactionChainElement calldata _txChainElement,\\n Lib_OVMCodec.ChainBatchHeader calldata _transactionBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof calldata _transactionProof\\n ) external;\\n\\n function finalizeFraudVerification(\\n bytes32 _preStateRoot,\\n Lib_OVMCodec.ChainBatchHeader calldata _preStateRootBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof calldata _preStateRootProof,\\n bytes32 _txHash,\\n bytes32 _postStateRoot,\\n Lib_OVMCodec.ChainBatchHeader calldata _postStateRootBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof calldata _postStateRootProof\\n ) external;\\n}\\n\",\"keccak256\":\"0x5efd7bb18164bbd3e9d58379e8203fbf2a7ee802b1a48dff3ceaaec1523b1751\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/verification/iOVM_StateTransitioner.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title iOVM_StateTransitioner\\n */\\ninterface iOVM_StateTransitioner {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AccountCommitted(\\n address _address\\n );\\n\\n event ContractStorageCommitted(\\n address _address,\\n bytes32 _key\\n );\\n\\n\\n /**********************************\\n * Public Functions: State Access *\\n **********************************/\\n\\n function getPreStateRoot() external view returns (bytes32 _preStateRoot);\\n function getPostStateRoot() external view returns (bytes32 _postStateRoot);\\n function isComplete() external view returns (bool _complete);\\n\\n\\n /***********************************\\n * Public Functions: Pre-Execution *\\n ***********************************/\\n\\n function proveContractState(\\n address _ovmContractAddress,\\n address _ethContractAddress,\\n bytes calldata _stateTrieWitness\\n ) external;\\n\\n function proveStorageSlot(\\n address _ovmContractAddress,\\n bytes32 _key,\\n bytes calldata _storageTrieWitness\\n ) external;\\n\\n\\n /*******************************\\n * Public Functions: Execution *\\n *******************************/\\n\\n function applyTransaction(\\n Lib_OVMCodec.Transaction calldata _transaction\\n ) external;\\n\\n\\n /************************************\\n * Public Functions: Post-Execution *\\n ************************************/\\n\\n function commitContractState(\\n address _ovmContractAddress,\\n bytes calldata _stateTrieWitness\\n ) external;\\n\\n function commitStorageSlot(\\n address _ovmContractAddress,\\n bytes32 _key,\\n bytes calldata _storageTrieWitness\\n ) external;\\n\\n\\n /**********************************\\n * Public Functions: Finalization *\\n **********************************/\\n\\n function completeTransition() external;\\n}\\n\",\"keccak256\":\"0x3d044ac0a3bb6ad3d529f904b3191117511f9c379678ca03010e1ebdfcb5c34b\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/codec/Lib_OVMCodec.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../utils/Lib_Bytes32Utils.sol\\\";\\n\\n/**\\n * @title Lib_OVMCodec\\n */\\nlibrary Lib_OVMCodec {\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum QueueOrigin {\\n SEQUENCER_QUEUE,\\n L1TOL2_QUEUE\\n }\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Account {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n address ethAddress;\\n bool isFresh;\\n }\\n\\n struct EVMAccount {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n }\\n\\n struct ChainBatchHeader {\\n uint256 batchIndex;\\n bytes32 batchRoot;\\n uint256 batchSize;\\n uint256 prevTotalElements;\\n bytes extraData;\\n }\\n\\n struct ChainInclusionProof {\\n uint256 index;\\n bytes32[] siblings;\\n }\\n\\n struct Transaction {\\n uint256 timestamp;\\n uint256 blockNumber;\\n QueueOrigin l1QueueOrigin;\\n address l1TxOrigin;\\n address entrypoint;\\n uint256 gasLimit;\\n bytes data;\\n }\\n\\n struct TransactionChainElement {\\n bool isSequenced;\\n uint256 queueIndex; // QUEUED TX ONLY\\n uint256 timestamp; // SEQUENCER TX ONLY\\n uint256 blockNumber; // SEQUENCER TX ONLY\\n bytes txData; // SEQUENCER TX ONLY\\n }\\n\\n struct QueueElement {\\n bytes32 transactionHash;\\n uint40 timestamp;\\n uint40 blockNumber;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Encodes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Encoded transaction bytes.\\n */\\n function encodeTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return abi.encodePacked(\\n _transaction.timestamp,\\n _transaction.blockNumber,\\n _transaction.l1QueueOrigin,\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n );\\n }\\n\\n /**\\n * Hashes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Hashed transaction\\n */\\n function hashTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(encodeTransaction(_transaction));\\n }\\n\\n /**\\n * Converts an OVM account to an EVM account.\\n * @param _in OVM account to convert.\\n * @return Converted EVM account.\\n */\\n function toEVMAccount(\\n Account memory _in\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n return EVMAccount({\\n nonce: _in.nonce,\\n balance: _in.balance,\\n storageRoot: _in.storageRoot,\\n codeHash: _in.codeHash\\n });\\n }\\n\\n /**\\n * @notice RLP-encodes an account state struct.\\n * @param _account Account state struct.\\n * @return RLP-encoded account state.\\n */\\n function encodeEVMAccount(\\n EVMAccount memory _account\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes[] memory raw = new bytes[](4);\\n\\n // Unfortunately we can't create this array outright because\\n // Lib_RLPWriter.writeList will reject fixed-size arrays. Assigning\\n // index-by-index circumvents this issue.\\n raw[0] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.nonce)\\n )\\n );\\n raw[1] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.balance)\\n )\\n );\\n raw[2] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.storageRoot));\\n raw[3] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.codeHash));\\n\\n return Lib_RLPWriter.writeList(raw);\\n }\\n\\n /**\\n * @notice Decodes an RLP-encoded account state into a useful struct.\\n * @param _encoded RLP-encoded account state.\\n * @return Account state struct.\\n */\\n function decodeEVMAccount(\\n bytes memory _encoded\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\\n\\n return EVMAccount({\\n nonce: Lib_RLPReader.readUint256(accountState[0]),\\n balance: Lib_RLPReader.readUint256(accountState[1]),\\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\\n });\\n }\\n\\n /**\\n * Calculates a hash for a given batch header.\\n * @param _batchHeader Header to hash.\\n * @return Hash of the header.\\n */\\n function hashBatchHeader(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(\\n abi.encode(\\n _batchHeader.batchRoot,\\n _batchHeader.batchSize,\\n _batchHeader.prevTotalElements,\\n _batchHeader.extraData\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0xd85ba2066057a2677926f484b938c7c2ef33ff3853f3b71cda252f4a54f30e05\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n public\\n onlyOwner\\n {\\n addresses[_getNameHash(_name)] = _address;\\n\\n emit AddressSet(\\n _name,\\n _address\\n );\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0x2ce671a0e004df88b136bea5a3c59d0732cea8887c8496da1d509e0200b03d7d\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(\\n address _libAddressManager\\n ) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x65981feeabff6a81783ea97d44baf988a18a86c8cb374c46fdb71819cbacc7c0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPReader.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_RLPReader\\n * @dev Adapted from \\\"RLPReader\\\" by Hamdi Allam (hamdi.allam97@gmail.com).\\n */\\nlibrary Lib_RLPReader {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 constant internal MAX_LIST_LENGTH = 32;\\n\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum RLPItemType {\\n DATA_ITEM,\\n LIST_ITEM\\n }\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct RLPItem {\\n uint256 length;\\n uint256 ptr;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts bytes to a reference to memory position and length.\\n * @param _in Input bytes to convert.\\n * @return Output memory reference.\\n */\\n function toRLPItem(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem memory\\n )\\n {\\n uint256 ptr;\\n assembly {\\n ptr := add(_in, 32)\\n }\\n\\n return RLPItem({\\n length: _in.length,\\n ptr: ptr\\n });\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n (\\n uint256 listOffset,\\n ,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.LIST_ITEM,\\n \\\"Invalid RLP list value.\\\"\\n );\\n\\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\\n // writing to the length. Since we can't know the number of RLP items without looping over\\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\\n // simply set a reasonable maximum list length and decrease the size before we finish.\\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\\n\\n uint256 itemCount = 0;\\n uint256 offset = listOffset;\\n while (offset < _in.length) {\\n require(\\n itemCount < MAX_LIST_LENGTH,\\n \\\"Provided RLP list exceeds max list length.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n ) = _decodeLength(RLPItem({\\n length: _in.length - offset,\\n ptr: _in.ptr + offset\\n }));\\n\\n out[itemCount] = RLPItem({\\n length: itemLength + itemOffset,\\n ptr: _in.ptr + offset\\n });\\n\\n itemCount += 1;\\n offset += itemOffset + itemLength;\\n }\\n\\n // Decrease the array size to match the actual item count.\\n assembly {\\n mstore(out, itemCount)\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n return readList(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes value.\\\"\\n );\\n\\n return _copy(_in.ptr, itemOffset, itemLength);\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return readBytes(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return string(readBytes(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return readString(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n require(\\n _in.length <= 33,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr + itemOffset;\\n bytes32 out;\\n assembly {\\n out := mload(ptr)\\n\\n // Shift the bytes over to match the item size.\\n if lt(itemLength, 32) {\\n out := div(out, exp(256, sub(32, itemLength)))\\n }\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return readBytes32(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return uint256(readBytes32(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return readUint256(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n require(\\n _in.length == 1,\\n \\\"Invalid RLP boolean value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 out;\\n assembly {\\n out := byte(0, mload(ptr))\\n }\\n\\n require(\\n out == 0 || out == 1,\\n \\\"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\\\"\\n );\\n\\n return out != 0;\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return readBool(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n if (_in.length == 1) {\\n return address(0);\\n }\\n\\n require(\\n _in.length == 21,\\n \\\"Invalid RLP address value.\\\"\\n );\\n\\n return address(readUint256(_in));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return readAddress(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads the raw bytes of an RLP item.\\n * @param _in RLP item to read.\\n * @return Raw RLP bytes.\\n */\\n function readRawBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in);\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Decodes the length of an RLP item.\\n * @param _in RLP item to decode.\\n * @return Offset of the encoded data.\\n * @return Length of the encoded data.\\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\\n */\\n function _decodeLength(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n uint256,\\n uint256,\\n RLPItemType\\n )\\n {\\n require(\\n _in.length > 0,\\n \\\"RLP item cannot be null.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 prefix;\\n assembly {\\n prefix := byte(0, mload(ptr))\\n }\\n\\n if (prefix <= 0x7f) {\\n // Single byte.\\n\\n return (0, 1, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xb7) {\\n // Short string.\\n\\n uint256 strLen = prefix - 0x80;\\n\\n require(\\n _in.length > strLen,\\n \\\"Invalid RLP short string.\\\"\\n );\\n\\n return (1, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xbf) {\\n // Long string.\\n uint256 lenOfStrLen = prefix - 0xb7;\\n\\n require(\\n _in.length > lenOfStrLen,\\n \\\"Invalid RLP long string length.\\\"\\n );\\n\\n uint256 strLen;\\n assembly {\\n // Pick out the string length.\\n strLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfStrLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfStrLen + strLen,\\n \\\"Invalid RLP long string.\\\"\\n );\\n\\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xf7) {\\n // Short list.\\n uint256 listLen = prefix - 0xc0;\\n\\n require(\\n _in.length > listLen,\\n \\\"Invalid RLP short list.\\\"\\n );\\n\\n return (1, listLen, RLPItemType.LIST_ITEM);\\n } else {\\n // Long list.\\n uint256 lenOfListLen = prefix - 0xf7;\\n\\n require(\\n _in.length > lenOfListLen,\\n \\\"Invalid RLP long list length.\\\"\\n );\\n\\n uint256 listLen;\\n assembly {\\n // Pick out the list length.\\n listLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfListLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfListLen + listLen,\\n \\\"Invalid RLP long list.\\\"\\n );\\n\\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\\n }\\n }\\n\\n /**\\n * Copies the bytes from a memory location.\\n * @param _src Pointer to the location to read from.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Copied bytes.\\n */\\n function _copy(\\n uint256 _src,\\n uint256 _offset,\\n uint256 _length\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out = new bytes(_length);\\n if (out.length == 0) {\\n return out;\\n }\\n\\n uint256 src = _src + _offset;\\n uint256 dest;\\n assembly {\\n dest := add(out, 32)\\n }\\n\\n // Copy over as many complete words as we can.\\n for (uint256 i = 0; i < _length / 32; i++) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n\\n src += 32;\\n dest += 32;\\n }\\n\\n // Pick out the remaining bytes.\\n uint256 mask = 256 ** (32 - (_length % 32)) - 1;\\n assembly {\\n mstore(\\n dest,\\n or(\\n and(mload(src), not(mask)),\\n and(mload(dest), mask)\\n )\\n )\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Copies an RLP item into bytes.\\n * @param _in RLP item to copy.\\n * @return Copied bytes.\\n */\\n function _copy(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in.ptr, 0, _in.length);\\n }\\n}\\n\",\"keccak256\":\"0x829174c61216dce35fdb888383b6022e0365eb7fbdc71ad79d98b108091969fe\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPWriter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/**\\n * @title Lib_RLPWriter\\n * @author Bakaoh (with modifications)\\n */\\nlibrary Lib_RLPWriter {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * RLP encodes a byte string.\\n * @param _in The byte string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded;\\n\\n if (_in.length == 1 && uint8(_in[0]) < 128) {\\n encoded = _in;\\n } else {\\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * RLP encodes a list of RLP encoded byte byte strings.\\n * @param _in The list of RLP encoded byte strings.\\n * @return The RLP encoded list of items in bytes.\\n */\\n function writeList(\\n bytes[] memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory list = _flatten(_in);\\n return abi.encodePacked(_writeLength(list.length, 192), list);\\n }\\n\\n /**\\n * RLP encodes a string.\\n * @param _in The string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeString(\\n string memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(bytes(_in));\\n }\\n\\n /**\\n * RLP encodes an address.\\n * @param _in The address to encode.\\n * @return The RLP encoded address in bytes.\\n */\\n function writeAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a bytes32 value.\\n * @param _in The bytes32 to encode.\\n * @return _out The RLP encoded bytes32 in bytes.\\n */\\n function writeBytes32(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a uint.\\n * @param _in The uint256 to encode.\\n * @return The RLP encoded uint256 in bytes.\\n */\\n function writeUint(\\n uint256 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(_toBinary(_in));\\n }\\n\\n /**\\n * RLP encodes a bool.\\n * @param _in The bool to encode.\\n * @return The RLP encoded bool in bytes.\\n */\\n function writeBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded = new bytes(1);\\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\\n return encoded;\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\\n * @param _len The length of the string or the payload.\\n * @param _offset 128 if item is string, 192 if item is list.\\n * @return RLP encoded bytes.\\n */\\n function _writeLength(\\n uint256 _len,\\n uint256 _offset\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded;\\n\\n if (_len < 56) {\\n encoded = new bytes(1);\\n encoded[0] = byte(uint8(_len) + uint8(_offset));\\n } else {\\n uint256 lenLen;\\n uint256 i = 1;\\n while (_len / i != 0) {\\n lenLen++;\\n i *= 256;\\n }\\n\\n encoded = new bytes(lenLen + 1);\\n encoded[0] = byte(uint8(lenLen) + uint8(_offset) + 55);\\n for(i = 1; i <= lenLen; i++) {\\n encoded[i] = byte(uint8((_len / (256**(lenLen-i))) % 256));\\n }\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * Encode integer in big endian binary form with no leading zeroes.\\n * @notice TODO: This should be optimized with assembly to save gas costs.\\n * @param _x The integer to encode.\\n * @return RLP encoded bytes.\\n */\\n function _toBinary(\\n uint256 _x\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory b = abi.encodePacked(_x);\\n\\n uint256 i = 0;\\n for (; i < 32; i++) {\\n if (b[i] != 0) {\\n break;\\n }\\n }\\n\\n bytes memory res = new bytes(32 - i);\\n for (uint256 j = 0; j < res.length; j++) {\\n res[j] = b[i++];\\n }\\n\\n return res;\\n }\\n\\n /**\\n * Copies a piece of memory to another location.\\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\\n * @param _dest Destination location.\\n * @param _src Source location.\\n * @param _len Length of memory to copy.\\n */\\n function _memcpy(\\n uint256 _dest,\\n uint256 _src,\\n uint256 _len\\n )\\n private\\n pure\\n {\\n uint256 dest = _dest;\\n uint256 src = _src;\\n uint256 len = _len;\\n\\n for(; len >= 32; len -= 32) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n dest += 32;\\n src += 32;\\n }\\n\\n uint256 mask = 256 ** (32 - len) - 1;\\n assembly {\\n let srcpart := and(mload(src), not(mask))\\n let destpart := and(mload(dest), mask)\\n mstore(dest, or(destpart, srcpart))\\n }\\n }\\n\\n /**\\n * Flattens a list of byte strings into one byte string.\\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\\n * @param _list List of byte strings to flatten.\\n * @return The flattened byte string.\\n */\\n function _flatten(\\n bytes[] memory _list\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n if (_list.length == 0) {\\n return new bytes(0);\\n }\\n\\n uint256 len;\\n uint256 i = 0;\\n for (; i < _list.length; i++) {\\n len += _list[i].length;\\n }\\n\\n bytes memory flattened = new bytes(len);\\n uint256 flattenedPtr;\\n assembly { flattenedPtr := add(flattened, 0x20) }\\n\\n for(i = 0; i < _list.length; i++) {\\n bytes memory item = _list[i];\\n\\n uint256 listPtr;\\n assembly { listPtr := add(item, 0x20)}\\n\\n _memcpy(flattenedPtr, listPtr, item.length);\\n flattenedPtr += _list[i].length;\\n }\\n\\n return flattened;\\n }\\n}\\n\",\"keccak256\":\"0xb60ee4b03ad372c3deff21d454ab714dd0c18ee3e6f9d45532e209fc59d5a54d\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_Bytes32Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_Byte32Utils\\n */\\nlibrary Lib_Bytes32Utils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \\\"true.\\\"\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as a boolean.\\n */\\n function toBool(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return _in != 0;\\n }\\n\\n /**\\n * Converts a boolean to a bytes32 value.\\n * @param _in Input boolean value.\\n * @return Boolean as a bytes32.\\n */\\n function fromBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in ? 1 : 0));\\n }\\n\\n /**\\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as an address.\\n */\\n function toAddress(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return address(uint160(uint256(_in)));\\n }\\n\\n /**\\n * Converts an address to a bytes32.\\n * @param _in Input address value.\\n * @return Address as a bytes32.\\n */\\n function fromAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in));\\n }\\n\\n /**\\n * Removes the leading zeros from a bytes32 value and returns a new (smaller) bytes value.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 without any leading zeros.\\n */\\n function removeLeadingZeros(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out;\\n\\n assembly {\\n // Figure out how many leading zero bytes to remove.\\n let shift := 0\\n for { let i := 0 } and(lt(i, 32), eq(byte(i, _in), 0)) { i := add(i, 1) } {\\n shift := add(shift, 1)\\n }\\n\\n // Reserve some space for our output and fix the free memory pointer.\\n out := mload(0x40)\\n mstore(0x40, add(out, 0x40))\\n\\n // Shift the value and store it into the output bytes.\\n mstore(add(out, 0x20), shl(mul(shift, 8), _in))\\n\\n // Store the new size (with leading zero bytes removed) in the output byte size.\\n mstore(out, sub(32, shift))\\n }\\n\\n return out;\\n }\\n}\\n\",\"keccak256\":\"0xfa2def593e3fc56a31852c3744aefdaa93cec74e721bfcfeb1e5d166c7c60b64\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_BytesUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_BytesUtils\\n */\\nlibrary Lib_BytesUtils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_start + _length >= _start, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n if (_bytes.length - _start == 0) {\\n return bytes('');\\n }\\n\\n return slice(_bytes, _start, _bytes.length - _start);\\n }\\n\\n function toBytes32PadLeft(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n bytes32 ret;\\n uint256 len = _bytes.length <= 32 ? _bytes.length : 32;\\n assembly {\\n ret := shr(mul(sub(32, len), 8), mload(add(_bytes, 32)))\\n }\\n return ret;\\n }\\n\\n function toBytes32(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n if (_bytes.length < 32) {\\n bytes32 ret;\\n assembly {\\n ret := mload(add(_bytes, 32))\\n }\\n return ret;\\n }\\n\\n return abi.decode(_bytes,(bytes32)); // will truncate if input length > 32 bytes\\n }\\n\\n function toUint256(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return uint256(toBytes32(_bytes));\\n }\\n\\n function toUint24(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n uint24\\n )\\n {\\n require(_start + 3 >= _start, \\\"toUint24_overflow\\\");\\n require(_bytes.length >= _start + 3 , \\\"toUint24_outOfBounds\\\");\\n uint24 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x3), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toUint8(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n uint8\\n )\\n {\\n require(_start + 1 >= _start, \\\"toUint8_overflow\\\");\\n require(_bytes.length >= _start + 1 , \\\"toUint8_outOfBounds\\\");\\n uint8 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x1), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toAddress(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n require(_start + 20 >= _start, \\\"toAddress_overflow\\\");\\n require(_bytes.length >= _start + 20, \\\"toAddress_outOfBounds\\\");\\n address tempAddress;\\n\\n assembly {\\n tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000)\\n }\\n\\n return tempAddress;\\n }\\n\\n function toNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory nibbles = new bytes(_bytes.length * 2);\\n\\n for (uint256 i = 0; i < _bytes.length; i++) {\\n nibbles[i * 2] = _bytes[i] >> 4;\\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\\n }\\n\\n return nibbles;\\n }\\n\\n function fromNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory ret = new bytes(_bytes.length / 2);\\n\\n for (uint256 i = 0; i < ret.length; i++) {\\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\\n }\\n\\n return ret;\\n }\\n\\n function equal(\\n bytes memory _bytes,\\n bytes memory _other\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return keccak256(_bytes) == keccak256(_other);\\n }\\n}\\n\",\"keccak256\":\"0xa5195afe32fb2cf104d156e8f4bd39df1ec79bf6ba232097b9e8e0ee14fbc298\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_MerkleTree.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_MerkleTree\\n * @author River Keefer\\n */\\nlibrary Lib_MerkleTree {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Calculates a merkle root for a list of 32-byte leaf hashes. WARNING: If the number\\n * of leaves passed in is not a power of two, it pads out the tree with zero hashes.\\n * If you do not know the original length of elements for the tree you are verifying,\\n * then this may allow empty leaves past _elements.length to pass a verification check down the line.\\n * Note that the _elements argument is modified, therefore it must not be used again afterwards\\n * @param _elements Array of hashes from which to generate a merkle root.\\n * @return Merkle root of the leaves, with zero hashes for non-powers-of-two (see above).\\n */\\n function getMerkleRoot(\\n bytes32[] memory _elements\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n require(\\n _elements.length > 0,\\n \\\"Lib_MerkleTree: Must provide at least one leaf hash.\\\"\\n );\\n\\n if (_elements.length == 1) {\\n return _elements[0];\\n }\\n\\n uint256[16] memory defaults = [\\n 0x290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563,\\n 0x633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d,\\n 0x890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d,\\n 0x3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd8,\\n 0xecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da,\\n 0xdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da5,\\n 0x617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d7,\\n 0x292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead,\\n 0xe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e10,\\n 0x7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f82,\\n 0xe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e83636516,\\n 0x3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c,\\n 0xad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e,\\n 0xa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab,\\n 0x4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c862,\\n 0x2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf10\\n ];\\n\\n // Reserve memory space for our hashes.\\n bytes memory buf = new bytes(64);\\n\\n // We'll need to keep track of left and right siblings.\\n bytes32 leftSibling;\\n bytes32 rightSibling;\\n\\n // Number of non-empty nodes at the current depth.\\n uint256 rowSize = _elements.length;\\n\\n // Current depth, counting from 0 at the leaves\\n uint256 depth = 0;\\n\\n // Common sub-expressions\\n uint256 halfRowSize; // rowSize / 2\\n bool rowSizeIsOdd; // rowSize % 2 == 1\\n\\n while (rowSize > 1) {\\n halfRowSize = rowSize / 2;\\n rowSizeIsOdd = rowSize % 2 == 1;\\n\\n for (uint256 i = 0; i < halfRowSize; i++) {\\n leftSibling = _elements[(2 * i) ];\\n rightSibling = _elements[(2 * i) + 1];\\n assembly {\\n mstore(add(buf, 32), leftSibling )\\n mstore(add(buf, 64), rightSibling)\\n }\\n\\n _elements[i] = keccak256(buf);\\n }\\n\\n if (rowSizeIsOdd) {\\n leftSibling = _elements[rowSize - 1];\\n rightSibling = bytes32(defaults[depth]);\\n assembly {\\n mstore(add(buf, 32), leftSibling)\\n mstore(add(buf, 64), rightSibling)\\n }\\n\\n _elements[halfRowSize] = keccak256(buf);\\n }\\n\\n rowSize = halfRowSize + (rowSizeIsOdd ? 1 : 0);\\n depth++;\\n }\\n\\n return _elements[0];\\n }\\n\\n /**\\n * Verifies a merkle branch for the given leaf hash. Assumes the original length\\n * of leaves generated is a known, correct input, and does not return true for indices\\n * extending past that index (even if _siblings would be otherwise valid.)\\n * @param _root The Merkle root to verify against.\\n * @param _leaf The leaf hash to verify inclusion of.\\n * @param _index The index in the tree of this leaf.\\n * @param _siblings Array of sibline nodes in the inclusion proof, starting from depth 0 (bottom of the tree).\\n * @param _totalLeaves The total number of leaves originally passed into.\\n * @return Whether or not the merkle branch and leaf passes verification.\\n */\\n function verify(\\n bytes32 _root,\\n bytes32 _leaf,\\n uint256 _index,\\n bytes32[] memory _siblings,\\n uint256 _totalLeaves\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n require(\\n _totalLeaves > 0,\\n \\\"Lib_MerkleTree: Total leaves must be greater than zero.\\\"\\n );\\n\\n require(\\n _index < _totalLeaves,\\n \\\"Lib_MerkleTree: Index out of bounds.\\\"\\n );\\n\\n require(\\n _siblings.length == _ceilLog2(_totalLeaves),\\n \\\"Lib_MerkleTree: Total siblings does not correctly correspond to total leaves.\\\"\\n );\\n\\n bytes32 computedRoot = _leaf;\\n\\n for (uint256 i = 0; i < _siblings.length; i++) {\\n if ((_index & 1) == 1) {\\n computedRoot = keccak256(\\n abi.encodePacked(\\n _siblings[i],\\n computedRoot\\n )\\n );\\n } else {\\n computedRoot = keccak256(\\n abi.encodePacked(\\n computedRoot,\\n _siblings[i]\\n )\\n );\\n }\\n\\n _index >>= 1;\\n }\\n\\n return _root == computedRoot;\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Calculates the integer ceiling of the log base 2 of an input.\\n * @param _in Unsigned input to calculate the log.\\n * @return ceil(log_base_2(_in))\\n */\\n function _ceilLog2(\\n uint256 _in\\n )\\n private\\n pure\\n returns (\\n uint256\\n )\\n {\\n require(\\n _in > 0,\\n \\\"Lib_MerkleTree: Cannot compute ceil(log_2) of 0.\\\"\\n );\\n\\n if (_in == 1) {\\n return 0;\\n }\\n\\n // Find the highest set bit (will be floor(log_2)).\\n // Borrowed with <3 from https://github.com/ethereum/solidity-examples\\n uint256 val = _in;\\n uint256 highest = 0;\\n for (uint256 i = 128; i >= 1; i >>= 1) {\\n if (val & (uint(1) << i) - 1 << i != 0) {\\n highest += i;\\n val >>= i;\\n }\\n }\\n\\n // Increment by one if this is not a perfect logarithm.\\n if ((uint(1) << highest) != _in) {\\n highest += 1;\\n }\\n\\n return highest;\\n }\\n}\\n\",\"keccak256\":\"0xa78edb9fbd34712771a1ebff05bc5e1abec7fc1e9a1bfb709d183099b44fa62a\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x608060405234801561001057600080fd5b50604051611bee380380611bee83398101604081905261002f9161005b565b600080546001600160a01b0319166001600160a01b03949094169390931790925560015560025561009c565b60008060006060848603121561006f578283fd5b83516001600160a01b0381168114610085578384fd5b602085015160409095015190969495509392505050565b611b43806100ab6000396000f3fe608060405234801561001057600080fd5b50600436106100b45760003560e01c80638ca5cbb9116100715780638ca5cbb91461012f5780639418bddd14610144578063b8e189ac14610157578063c17b291b1461016a578063cfdf677e14610172578063e561dddc1461017a576100b4565b8063299ca478146100b9578063461a4478146100d75780634d69ee57146100ea5780637aa63a861461010a5780637ad168a01461011f57806381eb62ef14610127575b600080fd5b6100c1610182565b6040516100ce919061159f565b60405180910390f35b6100c16100e53660046114e3565b610191565b6100fd6100f8366004611431565b61026f565b6040516100ce91906115b3565b6101126102e2565b6040516100ce91906115be565b6101126102fb565b610112610314565b61014261013d366004611390565b61031a565b005b6100fd610152366004611531565b61052e565b610142610165366004611531565b61057e565b610112610636565b6100c161063c565b610112610664565b6000546001600160a01b031681565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b838110156101f15781810151838201526020016101d9565b50505050905090810190601f16801561021e5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561023b57600080fd5b505afa15801561024f573d6000803e3d6000fd5b505050506040513d602081101561026557600080fd5b505190505b919050565b600061027a836106de565b61029f5760405162461bcd60e51b815260040161029690611749565b60405180910390fd5b6102bc836020015185846000015185602001518760400151610776565b6102d85760405162461bcd60e51b8152600401610296906116b5565b5060019392505050565b6000806102ed6108fb565b5064ffffffffff1691505090565b6000806103066108fb565b64ffffffffff169250505090565b60025481565b6103226102e2565b81146103405760405162461bcd60e51b8152600401610296906116ec565b6103706040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b815250610191565b6001600160a01b03166302ad4d2a336040518263ffffffff1660e01b815260040161039b919061159f565b60206040518083038186803b1580156103b357600080fd5b505afa1580156103c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103eb91906113d3565b6104075760405162461bcd60e51b8152600401610296906118bb565b60008251116104285760405162461bcd60e51b815260040161029690611878565b6104666040518060400160405280601d81526020017f4f564d5f43616e6f6e6963616c5472616e73616374696f6e436861696e000000815250610191565b6001600160a01b0316637aa63a866040518163ffffffff1660e01b815260040160206040518083038186803b15801561049e57600080fd5b505afa1580156104b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104d69190611419565b82516104e06102e2565b0111156104ff5760405162461bcd60e51b815260040161029690611646565b61052a8242336040516020016105169291906119a1565b604051602081830303815290604052610990565b5050565b60008082608001518060200190518101906105499190611564565b509050806105695760405162461bcd60e51b815260040161029690611833565b4261057682600154610b31565b119392505050565b6105b06040518060400160405280601181526020017027ab26afa33930bab22b32b934b334b2b960791b815250610191565b6001600160a01b0316336001600160a01b0316146105e05760405162461bcd60e51b8152600401610296906117d6565b6105e9816106de565b6106055760405162461bcd60e51b815260040161029690611749565b61060e8161052e565b61062a5760405162461bcd60e51b815260040161029690611778565b61063381610b92565b50565b60015481565b600061065f604051806060016040528060258152602001611ab560259139610191565b905090565b600061066e61063c565b6001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b1580156106a657600080fd5b505afa1580156106ba573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061065f9190611419565b60006106e861063c565b8251604051634a83e9cd60e11b81526001600160a01b039290921691639507d39a91610716916004016115be565b60206040518083038186803b15801561072e57600080fd5b505afa158015610742573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107669190611419565b61076f83610d0a565b1492915050565b60008082116107b65760405162461bcd60e51b8152600401808060200182810382526037815260200180611a316037913960400191505060405180910390fd5b8184106107f45760405162461bcd60e51b81526004018080602001828103825260248152602001806119dd6024913960400191505060405180910390fd5b6107fd82610d50565b83511461083b5760405162461bcd60e51b815260040180806020018281038252604d815260200180611a68604d913960600191505060405180910390fd5b8460005b84518110156108ee57856001166001141561089d5784818151811061086057fe5b60200260200101518260405160200180838152602001828152602001925050506040516020818303038152906040528051906020012091506108e2565b818582815181106108aa57fe5b602002602001015160405160200180838152602001828152602001925050506040516020818303038152906040528051906020012091505b600195861c950161083f565b5090951495945050505050565b600080600061090861063c565b6001600160a01b031663ccf8f9696040518163ffffffff1660e01b815260040160206040518083038186803b15801561094057600080fd5b505afa158015610954573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061097891906113f3565b64ffffffffff602882901c16935060501c9150509091565b60006109bf6040518060400160405280600c81526020016b27ab26afa83937b837b9b2b960a11b815250610191565b90506000806109cc6108fb565b9092509050336001600160a01b03841614156109e9575042610a13565b426002548264ffffffffff160110610a135760405162461bcd60e51b81526004016102969061190a565b60006040518060a00160405280610a28610664565b8152602001610a3688610de6565b8152602001875181526020018464ffffffffff16815260200186815250905080600001517f16be4c5129a4e03cf3350262e181dc02ddfb4a6008d925368c0899fcd97ca9c58260200151836040015184606001518560800151604051610a9f94939291906115dd565b60405180910390a2610aaf61063c565b6001600160a01b0316632015276c610ac683610d0a565b610ada84604001518560600151018661121a565b6040518363ffffffff1660e01b8152600401610af79291906115c7565b600060405180830381600087803b158015610b1157600080fd5b505af1158015610b25573d6000803e3d6000fd5b50505050505050505050565b600082820183811015610b8b576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b610b9a61063c565b6001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b158015610bd257600080fd5b505afa158015610be6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c0a9190611419565b815110610c295760405162461bcd60e51b815260040161029690611973565b610c32816106de565b610c4e5760405162461bcd60e51b815260040161029690611749565b610c5661063c565b6001600160a01b031663167fd6818260000151610c788460600151600061121a565b6040518363ffffffff1660e01b8152600401610c959291906115c7565b600060405180830381600087803b158015610caf57600080fd5b505af1158015610cc3573d6000803e3d6000fd5b5050505080600001517f8747b69ce8fdb31c3b9b0a67bd8049ad8c1a69ea417b69b12174068abd9cbd648260200151604051610cff91906115be565b60405180910390a250565b60008160200151826040015183606001518460800151604051602001610d3394939291906115dd565b604051602081830303815290604052805190602001209050919050565b6000808211610d905760405162461bcd60e51b8152600401808060200182810382526030815260200180611a016030913960400191505060405180910390fd5b8160011415610da15750600061026a565b81600060805b60018110610dd1576000196001821b01811b831615610dc95791821c91908101905b60011c610da7565b506001811b8414610b8b576001019392505050565b600080825111610e275760405162461bcd60e51b8152600401808060200182810382526034815260200180611ada6034913960400191505060405180910390fd5b815160011415610e4d5781600081518110610e3e57fe5b6020026020010151905061026a565b60408051610200810182527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56381527f633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d60208201527f890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d818301527f3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd86060808301919091527fecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da60808301527fdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da560a08301527f617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d760c08301527f292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead60e08301527fe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e106101008301527f7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f826101208301527fe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e836365166101408301527f3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c6101608301527fad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e6101808301527fa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab6101a08301527f4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c8626101c08301527f2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf106101e083015282518381529081018352909160009190602082018180368337505085519192506000918291508180805b60018411156111f65750506002820460018084161460005b82811015611172578a816002028151811061111957fe5b602002602001015196508a816002026001018151811061113557fe5b6020026020010151955086602089015285604089015287805190602001208b828151811061115f57fe5b6020908102919091010152600101611102565b5080156111d55789600185038151811061118857fe5b6020026020010151955087836010811061119e57fe5b602002015160001b945085602088015284604088015286805190602001208a83815181106111c857fe5b6020026020010181815250505b806111e15760006111e4565b60015b60ff16820193506001909201916110ea565b8960008151811061120357fe5b602002602001015198505050505050505050919050565b602890811b91909117901b90565b600067ffffffffffffffff83111561123c57fe5b61124f601f8401601f19166020016119b8565b905082815283838301111561126357600080fd5b828260208301376000602084830101529392505050565b600082601f83011261128a578081fd5b8135602067ffffffffffffffff8211156112a057fe5b8082026112ae8282016119b8565b8381528281019086840183880185018910156112c8578687fd5b8693505b858410156112ea5780358352600193909301929184019184016112cc565b50979650505050505050565b600060a08284031215611307578081fd5b60405160a0810167ffffffffffffffff828210818311171561132557fe5b8160405282935084358352602085013560208401526040850135604084015260608501356060840152608085013591508082111561136257600080fd5b508301601f8101851361137457600080fd5b61138385823560208401611228565b6080830152505092915050565b600080604083850312156113a2578182fd5b823567ffffffffffffffff8111156113b8578283fd5b6113c48582860161127a565b95602094909401359450505050565b6000602082840312156113e4578081fd5b81518015158114610b8b578182fd5b600060208284031215611404578081fd5b815164ffffffffff1981168114610b8b578182fd5b60006020828403121561142a578081fd5b5051919050565b600080600060608486031215611445578081fd5b83359250602084013567ffffffffffffffff80821115611463578283fd5b61146f878388016112f6565b93506040860135915080821115611484578283fd5b9085019060408288031215611497578283fd5b6040516040810181811083821117156114ac57fe5b604052823581526020830135828111156114c4578485fd5b6114d08982860161127a565b6020830152508093505050509250925092565b6000602082840312156114f4578081fd5b813567ffffffffffffffff81111561150a578182fd5b8201601f8101841361151a578182fd5b61152984823560208401611228565b949350505050565b600060208284031215611542578081fd5b813567ffffffffffffffff811115611558578182fd5b611529848285016112f6565b60008060408385031215611576578182fd5b825160208401519092506001600160a01b0381168114611594578182fd5b809150509250929050565b6001600160a01b0391909116815260200190565b901515815260200190565b90815260200190565b91825264ffffffffff1916602082015260400190565b600085825260208581840152846040840152608060608401528351806080850152825b8181101561161c5785810183015185820160a001528201611600565b8181111561162d578360a083870101525b50601f01601f19169290920160a0019695505050505050565b60208082526049908201527f4e756d626572206f6620737461746520726f6f74732063616e6e6f742065786360408201527f65656420746865206e756d626572206f662063616e6f6e6963616c207472616e60608201526839b0b1ba34b7b7399760b91b608082015260a00190565b60208082526018908201527f496e76616c696420696e636c7573696f6e2070726f6f662e0000000000000000604082015260600190565b6020808252603d908201527f41637475616c20626174636820737461727420696e64657820646f6573206e6f60408201527f74206d6174636820657870656374656420737461727420696e6465782e000000606082015260800190565b60208082526015908201527424b73b30b634b2103130ba31b4103432b0b232b91760591b604082015260600190565b602080825260409082018190527f537461746520626174636865732063616e206f6e6c792062652064656c657465908201527f642077697468696e207468652066726175642070726f6f662077696e646f772e606082015260800190565b6020808252603b908201527f537461746520626174636865732063616e206f6e6c792062652064656c65746560408201527f6420627920746865204f564d5f467261756456657269666965722e0000000000606082015260800190565b60208082526025908201527f4261746368206865616465722074696d657374616d702063616e6e6f74206265604082015264207a65726f60d81b606082015260800190565b60208082526023908201527f43616e6e6f74207375626d697420616e20656d7074792073746174652062617460408201526231b41760e91b606082015260800190565b6020808252602f908201527f50726f706f73657220646f6573206e6f74206861766520656e6f75676820636f60408201526e1b1b185d195c985b081c1bdcdd1959608a1b606082015260800190565b60208082526043908201527f43616e6e6f74207075626c69736820737461746520726f6f747320776974686960408201527f6e207468652073657175656e636572207075626c69636174696f6e2077696e6460608201526237bb9760e91b608082015260a00190565b60208082526014908201527324b73b30b634b2103130ba31b41034b73232bc1760611b604082015260600190565b9182526001600160a01b0316602082015260400190565b60405181810167ffffffffffffffff811182821017156119d457fe5b60405291905056fe4c69625f4d65726b6c65547265653a20496e646578206f7574206f6620626f756e64732e4c69625f4d65726b6c65547265653a2043616e6e6f7420636f6d70757465206365696c286c6f675f3229206f6620302e4c69625f4d65726b6c65547265653a20546f74616c206c6561766573206d7573742062652067726561746572207468616e207a65726f2e4c69625f4d65726b6c65547265653a20546f74616c207369626c696e677320646f6573206e6f7420636f72726563746c7920636f72726573706f6e6420746f20746f74616c206c65617665732e4f564d5f436861696e53746f72616765436f6e7461696e65723a5343433a626174636865734c69625f4d65726b6c65547265653a204d7573742070726f76696465206174206c65617374206f6e65206c65616620686173682ea26469706673582212209a79aee928c48a8e868127cc94d1fe1eb4eea95e98e6709cd65bda19d650209064736f6c63430007060033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100b45760003560e01c80638ca5cbb9116100715780638ca5cbb91461012f5780639418bddd14610144578063b8e189ac14610157578063c17b291b1461016a578063cfdf677e14610172578063e561dddc1461017a576100b4565b8063299ca478146100b9578063461a4478146100d75780634d69ee57146100ea5780637aa63a861461010a5780637ad168a01461011f57806381eb62ef14610127575b600080fd5b6100c1610182565b6040516100ce919061159f565b60405180910390f35b6100c16100e53660046114e3565b610191565b6100fd6100f8366004611431565b61026f565b6040516100ce91906115b3565b6101126102e2565b6040516100ce91906115be565b6101126102fb565b610112610314565b61014261013d366004611390565b61031a565b005b6100fd610152366004611531565b61052e565b610142610165366004611531565b61057e565b610112610636565b6100c161063c565b610112610664565b6000546001600160a01b031681565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b838110156101f15781810151838201526020016101d9565b50505050905090810190601f16801561021e5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561023b57600080fd5b505afa15801561024f573d6000803e3d6000fd5b505050506040513d602081101561026557600080fd5b505190505b919050565b600061027a836106de565b61029f5760405162461bcd60e51b815260040161029690611749565b60405180910390fd5b6102bc836020015185846000015185602001518760400151610776565b6102d85760405162461bcd60e51b8152600401610296906116b5565b5060019392505050565b6000806102ed6108fb565b5064ffffffffff1691505090565b6000806103066108fb565b64ffffffffff169250505090565b60025481565b6103226102e2565b81146103405760405162461bcd60e51b8152600401610296906116ec565b6103706040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b815250610191565b6001600160a01b03166302ad4d2a336040518263ffffffff1660e01b815260040161039b919061159f565b60206040518083038186803b1580156103b357600080fd5b505afa1580156103c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103eb91906113d3565b6104075760405162461bcd60e51b8152600401610296906118bb565b60008251116104285760405162461bcd60e51b815260040161029690611878565b6104666040518060400160405280601d81526020017f4f564d5f43616e6f6e6963616c5472616e73616374696f6e436861696e000000815250610191565b6001600160a01b0316637aa63a866040518163ffffffff1660e01b815260040160206040518083038186803b15801561049e57600080fd5b505afa1580156104b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104d69190611419565b82516104e06102e2565b0111156104ff5760405162461bcd60e51b815260040161029690611646565b61052a8242336040516020016105169291906119a1565b604051602081830303815290604052610990565b5050565b60008082608001518060200190518101906105499190611564565b509050806105695760405162461bcd60e51b815260040161029690611833565b4261057682600154610b31565b119392505050565b6105b06040518060400160405280601181526020017027ab26afa33930bab22b32b934b334b2b960791b815250610191565b6001600160a01b0316336001600160a01b0316146105e05760405162461bcd60e51b8152600401610296906117d6565b6105e9816106de565b6106055760405162461bcd60e51b815260040161029690611749565b61060e8161052e565b61062a5760405162461bcd60e51b815260040161029690611778565b61063381610b92565b50565b60015481565b600061065f604051806060016040528060258152602001611ab560259139610191565b905090565b600061066e61063c565b6001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b1580156106a657600080fd5b505afa1580156106ba573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061065f9190611419565b60006106e861063c565b8251604051634a83e9cd60e11b81526001600160a01b039290921691639507d39a91610716916004016115be565b60206040518083038186803b15801561072e57600080fd5b505afa158015610742573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107669190611419565b61076f83610d0a565b1492915050565b60008082116107b65760405162461bcd60e51b8152600401808060200182810382526037815260200180611a316037913960400191505060405180910390fd5b8184106107f45760405162461bcd60e51b81526004018080602001828103825260248152602001806119dd6024913960400191505060405180910390fd5b6107fd82610d50565b83511461083b5760405162461bcd60e51b815260040180806020018281038252604d815260200180611a68604d913960600191505060405180910390fd5b8460005b84518110156108ee57856001166001141561089d5784818151811061086057fe5b60200260200101518260405160200180838152602001828152602001925050506040516020818303038152906040528051906020012091506108e2565b818582815181106108aa57fe5b602002602001015160405160200180838152602001828152602001925050506040516020818303038152906040528051906020012091505b600195861c950161083f565b5090951495945050505050565b600080600061090861063c565b6001600160a01b031663ccf8f9696040518163ffffffff1660e01b815260040160206040518083038186803b15801561094057600080fd5b505afa158015610954573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061097891906113f3565b64ffffffffff602882901c16935060501c9150509091565b60006109bf6040518060400160405280600c81526020016b27ab26afa83937b837b9b2b960a11b815250610191565b90506000806109cc6108fb565b9092509050336001600160a01b03841614156109e9575042610a13565b426002548264ffffffffff160110610a135760405162461bcd60e51b81526004016102969061190a565b60006040518060a00160405280610a28610664565b8152602001610a3688610de6565b8152602001875181526020018464ffffffffff16815260200186815250905080600001517f16be4c5129a4e03cf3350262e181dc02ddfb4a6008d925368c0899fcd97ca9c58260200151836040015184606001518560800151604051610a9f94939291906115dd565b60405180910390a2610aaf61063c565b6001600160a01b0316632015276c610ac683610d0a565b610ada84604001518560600151018661121a565b6040518363ffffffff1660e01b8152600401610af79291906115c7565b600060405180830381600087803b158015610b1157600080fd5b505af1158015610b25573d6000803e3d6000fd5b50505050505050505050565b600082820183811015610b8b576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b610b9a61063c565b6001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b158015610bd257600080fd5b505afa158015610be6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c0a9190611419565b815110610c295760405162461bcd60e51b815260040161029690611973565b610c32816106de565b610c4e5760405162461bcd60e51b815260040161029690611749565b610c5661063c565b6001600160a01b031663167fd6818260000151610c788460600151600061121a565b6040518363ffffffff1660e01b8152600401610c959291906115c7565b600060405180830381600087803b158015610caf57600080fd5b505af1158015610cc3573d6000803e3d6000fd5b5050505080600001517f8747b69ce8fdb31c3b9b0a67bd8049ad8c1a69ea417b69b12174068abd9cbd648260200151604051610cff91906115be565b60405180910390a250565b60008160200151826040015183606001518460800151604051602001610d3394939291906115dd565b604051602081830303815290604052805190602001209050919050565b6000808211610d905760405162461bcd60e51b8152600401808060200182810382526030815260200180611a016030913960400191505060405180910390fd5b8160011415610da15750600061026a565b81600060805b60018110610dd1576000196001821b01811b831615610dc95791821c91908101905b60011c610da7565b506001811b8414610b8b576001019392505050565b600080825111610e275760405162461bcd60e51b8152600401808060200182810382526034815260200180611ada6034913960400191505060405180910390fd5b815160011415610e4d5781600081518110610e3e57fe5b6020026020010151905061026a565b60408051610200810182527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56381527f633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d60208201527f890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d818301527f3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd86060808301919091527fecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da60808301527fdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da560a08301527f617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d760c08301527f292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead60e08301527fe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e106101008301527f7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f826101208301527fe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e836365166101408301527f3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c6101608301527fad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e6101808301527fa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab6101a08301527f4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c8626101c08301527f2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf106101e083015282518381529081018352909160009190602082018180368337505085519192506000918291508180805b60018411156111f65750506002820460018084161460005b82811015611172578a816002028151811061111957fe5b602002602001015196508a816002026001018151811061113557fe5b6020026020010151955086602089015285604089015287805190602001208b828151811061115f57fe5b6020908102919091010152600101611102565b5080156111d55789600185038151811061118857fe5b6020026020010151955087836010811061119e57fe5b602002015160001b945085602088015284604088015286805190602001208a83815181106111c857fe5b6020026020010181815250505b806111e15760006111e4565b60015b60ff16820193506001909201916110ea565b8960008151811061120357fe5b602002602001015198505050505050505050919050565b602890811b91909117901b90565b600067ffffffffffffffff83111561123c57fe5b61124f601f8401601f19166020016119b8565b905082815283838301111561126357600080fd5b828260208301376000602084830101529392505050565b600082601f83011261128a578081fd5b8135602067ffffffffffffffff8211156112a057fe5b8082026112ae8282016119b8565b8381528281019086840183880185018910156112c8578687fd5b8693505b858410156112ea5780358352600193909301929184019184016112cc565b50979650505050505050565b600060a08284031215611307578081fd5b60405160a0810167ffffffffffffffff828210818311171561132557fe5b8160405282935084358352602085013560208401526040850135604084015260608501356060840152608085013591508082111561136257600080fd5b508301601f8101851361137457600080fd5b61138385823560208401611228565b6080830152505092915050565b600080604083850312156113a2578182fd5b823567ffffffffffffffff8111156113b8578283fd5b6113c48582860161127a565b95602094909401359450505050565b6000602082840312156113e4578081fd5b81518015158114610b8b578182fd5b600060208284031215611404578081fd5b815164ffffffffff1981168114610b8b578182fd5b60006020828403121561142a578081fd5b5051919050565b600080600060608486031215611445578081fd5b83359250602084013567ffffffffffffffff80821115611463578283fd5b61146f878388016112f6565b93506040860135915080821115611484578283fd5b9085019060408288031215611497578283fd5b6040516040810181811083821117156114ac57fe5b604052823581526020830135828111156114c4578485fd5b6114d08982860161127a565b6020830152508093505050509250925092565b6000602082840312156114f4578081fd5b813567ffffffffffffffff81111561150a578182fd5b8201601f8101841361151a578182fd5b61152984823560208401611228565b949350505050565b600060208284031215611542578081fd5b813567ffffffffffffffff811115611558578182fd5b611529848285016112f6565b60008060408385031215611576578182fd5b825160208401519092506001600160a01b0381168114611594578182fd5b809150509250929050565b6001600160a01b0391909116815260200190565b901515815260200190565b90815260200190565b91825264ffffffffff1916602082015260400190565b600085825260208581840152846040840152608060608401528351806080850152825b8181101561161c5785810183015185820160a001528201611600565b8181111561162d578360a083870101525b50601f01601f19169290920160a0019695505050505050565b60208082526049908201527f4e756d626572206f6620737461746520726f6f74732063616e6e6f742065786360408201527f65656420746865206e756d626572206f662063616e6f6e6963616c207472616e60608201526839b0b1ba34b7b7399760b91b608082015260a00190565b60208082526018908201527f496e76616c696420696e636c7573696f6e2070726f6f662e0000000000000000604082015260600190565b6020808252603d908201527f41637475616c20626174636820737461727420696e64657820646f6573206e6f60408201527f74206d6174636820657870656374656420737461727420696e6465782e000000606082015260800190565b60208082526015908201527424b73b30b634b2103130ba31b4103432b0b232b91760591b604082015260600190565b602080825260409082018190527f537461746520626174636865732063616e206f6e6c792062652064656c657465908201527f642077697468696e207468652066726175642070726f6f662077696e646f772e606082015260800190565b6020808252603b908201527f537461746520626174636865732063616e206f6e6c792062652064656c65746560408201527f6420627920746865204f564d5f467261756456657269666965722e0000000000606082015260800190565b60208082526025908201527f4261746368206865616465722074696d657374616d702063616e6e6f74206265604082015264207a65726f60d81b606082015260800190565b60208082526023908201527f43616e6e6f74207375626d697420616e20656d7074792073746174652062617460408201526231b41760e91b606082015260800190565b6020808252602f908201527f50726f706f73657220646f6573206e6f74206861766520656e6f75676820636f60408201526e1b1b185d195c985b081c1bdcdd1959608a1b606082015260800190565b60208082526043908201527f43616e6e6f74207075626c69736820737461746520726f6f747320776974686960408201527f6e207468652073657175656e636572207075626c69636174696f6e2077696e6460608201526237bb9760e91b608082015260a00190565b60208082526014908201527324b73b30b634b2103130ba31b41034b73232bc1760611b604082015260600190565b9182526001600160a01b0316602082015260400190565b60405181810167ffffffffffffffff811182821017156119d457fe5b60405291905056fe4c69625f4d65726b6c65547265653a20496e646578206f7574206f6620626f756e64732e4c69625f4d65726b6c65547265653a2043616e6e6f7420636f6d70757465206365696c286c6f675f3229206f6620302e4c69625f4d65726b6c65547265653a20546f74616c206c6561766573206d7573742062652067726561746572207468616e207a65726f2e4c69625f4d65726b6c65547265653a20546f74616c207369626c696e677320646f6573206e6f7420636f72726563746c7920636f72726573706f6e6420746f20746f74616c206c65617665732e4f564d5f436861696e53746f72616765436f6e7461696e65723a5343433a626174636865734c69625f4d65726b6c65547265653a204d7573742070726f76696465206174206c65617374206f6e65206c65616620686173682ea26469706673582212209a79aee928c48a8e868127cc94d1fe1eb4eea95e98e6709cd65bda19d650209064736f6c63430007060033", - "devdoc": { - "details": "The State Commitment Chain (SCC) contract contains a list of proposed state roots which Proposers assert to be a result of each transaction in the Canonical Transaction Chain (CTC). Elements here have a 1:1 correspondence with transactions in the CTC, and should be the unique state root calculated off-chain by applying the canonical transactions one by one. Compiler used: solc Runtime target: EVM", - "kind": "dev", - "methods": { - "appendStateBatch(bytes32[],uint256)": { - "params": { - "_batch": "Batch of state roots.", - "_shouldStartAtElement": "Index of the element at which this batch should start." - } - }, - "batches()": { - "returns": { - "_0": "Reference to the batch storage container." - } - }, - "constructor": { - "params": { - "_libAddressManager": "Address of the Address Manager." - } - }, - "deleteStateBatch((uint256,bytes32,uint256,uint256,bytes))": { - "params": { - "_batchHeader": "Header of the batch to start deleting from." - } - }, - "getLastSequencerTimestamp()": { - "returns": { - "_lastSequencerTimestamp": "Last sequencer batch timestamp." - } - }, - "getTotalBatches()": { - "returns": { - "_totalBatches": "Total submitted batches." - } - }, - "getTotalElements()": { - "returns": { - "_totalElements": "Total submitted elements." - } - }, - "insideFraudProofWindow((uint256,bytes32,uint256,uint256,bytes))": { - "params": { - "_batchHeader": "Header of the batch to check." - }, - "returns": { - "_inside": "Whether or not the batch is inside the fraud proof window." - } - }, - "resolve(string)": { - "params": { - "_name": "Name to resolve an address for." - }, - "returns": { - "_0": "Address associated with the given name." - } - }, - "verifyStateCommitment(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))": { - "params": { - "_batchHeader": "Header of the batch in which the element was included.", - "_element": "Hash of the element to verify a proof for.", - "_proof": "Merkle inclusion proof for the element." - } - } - }, - "title": "OVM_StateCommitmentChain", - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": { - "appendStateBatch(bytes32[],uint256)": { - "notice": "Appends a batch of state roots to the chain." - }, - "batches()": { - "notice": "Accesses the batch storage container." - }, - "deleteStateBatch((uint256,bytes32,uint256,uint256,bytes))": { - "notice": "Deletes all state roots after (and including) a given batch." - }, - "getLastSequencerTimestamp()": { - "notice": "Retrieves the timestamp of the last batch submitted by the sequencer." - }, - "getTotalBatches()": { - "notice": "Retrieves the total number of batches submitted." - }, - "getTotalElements()": { - "notice": "Retrieves the total number of elements submitted." - }, - "insideFraudProofWindow((uint256,bytes32,uint256,uint256,bytes))": { - "notice": "Checks whether a given batch is still inside its fraud proof window." - }, - "resolve(string)": { - "notice": "Resolves the address associated with a given name." - }, - "verifyStateCommitment(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))": { - "notice": "Verifies a batch inclusion proof." - } - }, - "version": 1 - }, - "storageLayout": { - "storage": [ - { - "astId": 12800, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_StateCommitmentChain.sol:OVM_StateCommitmentChain", - "label": "libAddressManager", - "offset": 0, - "slot": "0", - "type": "t_contract(Lib_AddressManager)12793" - }, - { - "astId": 4678, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_StateCommitmentChain.sol:OVM_StateCommitmentChain", - "label": "FRAUD_PROOF_WINDOW", - "offset": 0, - "slot": "1", - "type": "t_uint256" - }, - { - "astId": 4680, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_StateCommitmentChain.sol:OVM_StateCommitmentChain", - "label": "SEQUENCER_PUBLISH_WINDOW", - "offset": 0, - "slot": "2", - "type": "t_uint256" - } - ], - "types": { - "t_contract(Lib_AddressManager)12793": { - "encoding": "inplace", - "label": "contract Lib_AddressManager", - "numberOfBytes": "20" - }, - "t_uint256": { - "encoding": "inplace", - "label": "uint256", - "numberOfBytes": "32" - } - } - } -} \ No newline at end of file diff --git a/packages/contracts/deployments/kovan-v3/OVM_StateManagerFactory.json b/packages/contracts/deployments/kovan-v3/OVM_StateManagerFactory.json deleted file mode 100644 index bda9b91247e60..0000000000000 --- a/packages/contracts/deployments/kovan-v3/OVM_StateManagerFactory.json +++ /dev/null @@ -1,74 +0,0 @@ -{ - "address": "0x3b96673C9e24D362501e87B239F60543e20beD50", - "abi": [ - { - "inputs": [ - { - "internalType": "address", - "name": "_owner", - "type": "address" - } - ], - "name": "create", - "outputs": [ - { - "internalType": "contract iOVM_StateManager", - "name": "", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "function" - } - ], - "transactionHash": "0x9926548d5337a7b624a7c7aa3d4ea80c4e9a2fc3afaef0bfc634b19145bb56c1", - "receipt": { - "to": null, - "from": "0x18394B52d3Cb931dfA76F63251919D051953413d", - "contractAddress": "0x3b96673C9e24D362501e87B239F60543e20beD50", - "transactionIndex": 1, - "gasUsed": "1170970", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0x20e3b8b73d8c3667eed92aa3bc04339f6a2c45f7d7bc3e7887163bed2bde2240", - "transactionHash": "0x9926548d5337a7b624a7c7aa3d4ea80c4e9a2fc3afaef0bfc634b19145bb56c1", - "logs": [], - "blockNumber": 24572858, - "cumulativeGasUsed": "1215716", - "status": 1, - "byzantium": true - }, - "args": [], - "solcInputHash": "5ee8e508e2c54cb5ac6783b4855b1558", - "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"}],\"name\":\"create\",\"outputs\":[{\"internalType\":\"contract iOVM_StateManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The State Manager Factory is called by a State Transitioner's init code, to create a new State Manager for use in the Fraud Verification process. Compiler used: solc Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"create(address)\":{\"params\":{\"_owner\":\"Owner of the created contract.\"},\"returns\":{\"_0\":\"New OVM_StateManager instance.\"}}},\"title\":\"OVM_StateManagerFactory\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"create(address)\":{\"notice\":\"Creates a new OVM_StateManager\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/OVM/execution/OVM_StateManagerFactory.sol\":\"OVM_StateManagerFactory\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/optimistic-ethereum/OVM/execution/OVM_StateManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_StateManager } from \\\"../../iOVM/execution/iOVM_StateManager.sol\\\";\\n\\n/**\\n * @title OVM_StateManager\\n * @dev The State Manager contract holds all storage values for contracts in the OVM. It can only be written to by the\\n * the Execution Manager and State Transitioner. It runs on L1 during the setup and execution of a fraud proof.\\n * The same logic runs on L2, but has been implemented as a precompile in the L2 go-ethereum client\\n * (see https://github.com/ethereum-optimism/go-ethereum/blob/master/core/vm/ovm_state_manager.go).\\n *\\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract OVM_StateManager is iOVM_StateManager {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n bytes32 constant internal EMPTY_ACCOUNT_STORAGE_ROOT = 0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421;\\n bytes32 constant internal EMPTY_ACCOUNT_CODE_HASH = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;\\n bytes32 constant internal STORAGE_XOR_VALUE = 0xFEEDFACECAFEBEEFFEEDFACECAFEBEEFFEEDFACECAFEBEEFFEEDFACECAFEBEEF;\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n address override public owner;\\n address override public ovmExecutionManager;\\n mapping (address => Lib_OVMCodec.Account) internal accounts;\\n mapping (address => mapping (bytes32 => bytes32)) internal contractStorage;\\n mapping (address => mapping (bytes32 => bool)) internal verifiedContractStorage;\\n mapping (bytes32 => ItemState) internal itemStates;\\n uint256 internal totalUncommittedAccounts;\\n uint256 internal totalUncommittedContractStorage;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _owner Address of the owner of this contract.\\n */\\n constructor(\\n address _owner\\n )\\n {\\n owner = _owner;\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n /**\\n * Simple authentication, this contract should only be accessible to the owner (which is expected to be the State Transitioner during `PRE_EXECUTION`\\n * or the OVM_ExecutionManager during transaction execution.\\n */\\n modifier authenticated() {\\n // owner is the State Transitioner\\n require(\\n msg.sender == owner || msg.sender == ovmExecutionManager,\\n \\\"Function can only be called by authenticated addresses\\\"\\n );\\n _;\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Checks whether a given address is allowed to modify this contract.\\n * @param _address Address to check.\\n * @return Whether or not the address can modify this contract.\\n */\\n function isAuthenticated(\\n address _address\\n )\\n override\\n public\\n view\\n returns (\\n bool\\n )\\n {\\n return (_address == owner || _address == ovmExecutionManager);\\n }\\n\\n /**\\n * Sets the address of the OVM_ExecutionManager.\\n * @param _ovmExecutionManager Address of the OVM_ExecutionManager.\\n */\\n function setExecutionManager(\\n address _ovmExecutionManager\\n )\\n override\\n public\\n authenticated\\n {\\n ovmExecutionManager = _ovmExecutionManager;\\n }\\n\\n /**\\n * Inserts an account into the state.\\n * @param _address Address of the account to insert.\\n * @param _account Account to insert for the given address.\\n */\\n function putAccount(\\n address _address,\\n Lib_OVMCodec.Account memory _account\\n )\\n override\\n public\\n authenticated\\n {\\n accounts[_address] = _account;\\n }\\n\\n /**\\n * Marks an account as empty.\\n * @param _address Address of the account to mark.\\n */\\n function putEmptyAccount(\\n address _address\\n )\\n override\\n public\\n authenticated\\n {\\n Lib_OVMCodec.Account storage account = accounts[_address];\\n account.storageRoot = EMPTY_ACCOUNT_STORAGE_ROOT;\\n account.codeHash = EMPTY_ACCOUNT_CODE_HASH;\\n }\\n\\n /**\\n * Retrieves an account from the state.\\n * @param _address Address of the account to retrieve.\\n * @return Account for the given address.\\n */\\n function getAccount(\\n address _address\\n )\\n override\\n public\\n view\\n returns (\\n Lib_OVMCodec.Account memory\\n )\\n {\\n return accounts[_address];\\n }\\n\\n /**\\n * Checks whether the state has a given account.\\n * @param _address Address of the account to check.\\n * @return Whether or not the state has the account.\\n */\\n function hasAccount(\\n address _address\\n )\\n override\\n public\\n view\\n returns (\\n bool\\n )\\n {\\n return accounts[_address].codeHash != bytes32(0);\\n }\\n\\n /**\\n * Checks whether the state has a given known empty account.\\n * @param _address Address of the account to check.\\n * @return Whether or not the state has the empty account.\\n */\\n function hasEmptyAccount(\\n address _address\\n )\\n override\\n public\\n view\\n returns (\\n bool\\n )\\n {\\n return (\\n accounts[_address].codeHash == EMPTY_ACCOUNT_CODE_HASH\\n && accounts[_address].nonce == 0\\n );\\n }\\n\\n /**\\n * Sets the nonce of an account.\\n * @param _address Address of the account to modify.\\n * @param _nonce New account nonce.\\n */\\n function setAccountNonce(\\n address _address,\\n uint256 _nonce\\n )\\n override\\n public\\n authenticated\\n {\\n accounts[_address].nonce = _nonce;\\n }\\n\\n /**\\n * Gets the nonce of an account.\\n * @param _address Address of the account to access.\\n * @return Nonce of the account.\\n */\\n function getAccountNonce(\\n address _address\\n )\\n override\\n public\\n view\\n returns (\\n uint256\\n )\\n {\\n return accounts[_address].nonce;\\n }\\n\\n /**\\n * Retrieves the Ethereum address of an account.\\n * @param _address Address of the account to access.\\n * @return Corresponding Ethereum address.\\n */\\n function getAccountEthAddress(\\n address _address\\n )\\n override\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return accounts[_address].ethAddress;\\n }\\n\\n /**\\n * Retrieves the storage root of an account.\\n * @param _address Address of the account to access.\\n * @return Corresponding storage root.\\n */\\n function getAccountStorageRoot(\\n address _address\\n )\\n override\\n public\\n view\\n returns (\\n bytes32\\n )\\n {\\n return accounts[_address].storageRoot;\\n }\\n\\n /**\\n * Initializes a pending account (during CREATE or CREATE2) with the default values.\\n * @param _address Address of the account to initialize.\\n */\\n function initPendingAccount(\\n address _address\\n )\\n override\\n public\\n authenticated\\n {\\n Lib_OVMCodec.Account storage account = accounts[_address];\\n account.nonce = 1;\\n account.storageRoot = EMPTY_ACCOUNT_STORAGE_ROOT;\\n account.codeHash = EMPTY_ACCOUNT_CODE_HASH;\\n account.isFresh = true;\\n }\\n\\n /**\\n * Finalizes the creation of a pending account (during CREATE or CREATE2).\\n * @param _address Address of the account to finalize.\\n * @param _ethAddress Address of the account's associated contract on Ethereum.\\n * @param _codeHash Hash of the account's code.\\n */\\n function commitPendingAccount(\\n address _address,\\n address _ethAddress,\\n bytes32 _codeHash\\n )\\n override\\n public\\n authenticated\\n {\\n Lib_OVMCodec.Account storage account = accounts[_address];\\n account.ethAddress = _ethAddress;\\n account.codeHash = _codeHash;\\n }\\n\\n /**\\n * Checks whether an account has already been retrieved, and marks it as retrieved if not.\\n * @param _address Address of the account to check.\\n * @return Whether or not the account was already loaded.\\n */\\n function testAndSetAccountLoaded(\\n address _address\\n )\\n override\\n public\\n authenticated\\n returns (\\n bool\\n )\\n {\\n return _testAndSetItemState(\\n _getItemHash(_address),\\n ItemState.ITEM_LOADED\\n );\\n }\\n\\n /**\\n * Checks whether an account has already been modified, and marks it as modified if not.\\n * @param _address Address of the account to check.\\n * @return Whether or not the account was already modified.\\n */\\n function testAndSetAccountChanged(\\n address _address\\n )\\n override\\n public\\n authenticated\\n returns (\\n bool\\n )\\n {\\n return _testAndSetItemState(\\n _getItemHash(_address),\\n ItemState.ITEM_CHANGED\\n );\\n }\\n\\n /**\\n * Attempts to mark an account as committed.\\n * @param _address Address of the account to commit.\\n * @return Whether or not the account was committed.\\n */\\n function commitAccount(\\n address _address\\n )\\n override\\n public\\n authenticated\\n returns (\\n bool\\n )\\n {\\n bytes32 item = _getItemHash(_address);\\n if (itemStates[item] != ItemState.ITEM_CHANGED) {\\n return false;\\n }\\n\\n itemStates[item] = ItemState.ITEM_COMMITTED;\\n totalUncommittedAccounts -= 1;\\n\\n return true;\\n }\\n\\n /**\\n * Increments the total number of uncommitted accounts.\\n */\\n function incrementTotalUncommittedAccounts()\\n override\\n public\\n authenticated\\n {\\n totalUncommittedAccounts += 1;\\n }\\n\\n /**\\n * Gets the total number of uncommitted accounts.\\n * @return Total uncommitted accounts.\\n */\\n function getTotalUncommittedAccounts()\\n override\\n public\\n view\\n returns (\\n uint256\\n )\\n {\\n return totalUncommittedAccounts;\\n }\\n\\n /**\\n * Checks whether a given account was changed during execution.\\n * @param _address Address to check.\\n * @return Whether or not the account was changed.\\n */\\n function wasAccountChanged(\\n address _address\\n )\\n override\\n public\\n view\\n returns (\\n bool\\n )\\n {\\n bytes32 item = _getItemHash(_address);\\n return itemStates[item] >= ItemState.ITEM_CHANGED;\\n }\\n\\n /**\\n * Checks whether a given account was committed after execution.\\n * @param _address Address to check.\\n * @return Whether or not the account was committed.\\n */\\n function wasAccountCommitted(\\n address _address\\n )\\n override\\n public\\n view\\n returns (\\n bool\\n )\\n {\\n bytes32 item = _getItemHash(_address);\\n return itemStates[item] >= ItemState.ITEM_COMMITTED;\\n }\\n\\n\\n /************************************\\n * Public Functions: Storage Access *\\n ************************************/\\n\\n /**\\n * Changes a contract storage slot value.\\n * @param _contract Address of the contract to modify.\\n * @param _key 32 byte storage slot key.\\n * @param _value 32 byte storage slot value.\\n */\\n function putContractStorage(\\n address _contract,\\n bytes32 _key,\\n bytes32 _value\\n )\\n override\\n public\\n authenticated\\n {\\n // A hilarious optimization. `SSTORE`ing a value of `bytes32(0)` is common enough that it's\\n // worth populating this with a non-zero value in advance (during the fraud proof\\n // initialization phase) to cut the execution-time cost down to 5000 gas.\\n contractStorage[_contract][_key] = _value ^ STORAGE_XOR_VALUE;\\n\\n // Only used when initially populating the contract storage. OVM_ExecutionManager will\\n // perform a `hasContractStorage` INVALID_STATE_ACCESS check before putting any contract\\n // storage because writing to zero when the actual value is nonzero causes a gas\\n // discrepancy. Could be moved into a new `putVerifiedContractStorage` function, or\\n // something along those lines.\\n if (verifiedContractStorage[_contract][_key] == false) {\\n verifiedContractStorage[_contract][_key] = true;\\n }\\n }\\n\\n /**\\n * Retrieves a contract storage slot value.\\n * @param _contract Address of the contract to access.\\n * @param _key 32 byte storage slot key.\\n * @return 32 byte storage slot value.\\n */\\n function getContractStorage(\\n address _contract,\\n bytes32 _key\\n )\\n override\\n public\\n view\\n returns (\\n bytes32\\n )\\n {\\n // Storage XOR system doesn't work for newly created contracts that haven't set this\\n // storage slot value yet.\\n if (\\n verifiedContractStorage[_contract][_key] == false\\n && accounts[_contract].isFresh\\n ) {\\n return bytes32(0);\\n }\\n\\n // See `putContractStorage` for more information about the XOR here.\\n return contractStorage[_contract][_key] ^ STORAGE_XOR_VALUE;\\n }\\n\\n /**\\n * Checks whether a contract storage slot exists in the state.\\n * @param _contract Address of the contract to access.\\n * @param _key 32 byte storage slot key.\\n * @return Whether or not the key was set in the state.\\n */\\n function hasContractStorage(\\n address _contract,\\n bytes32 _key\\n )\\n override\\n public\\n view\\n returns (\\n bool\\n )\\n {\\n return verifiedContractStorage[_contract][_key] || accounts[_contract].isFresh;\\n }\\n\\n /**\\n * Checks whether a storage slot has already been retrieved, and marks it as retrieved if not.\\n * @param _contract Address of the contract to check.\\n * @param _key 32 byte storage slot key.\\n * @return Whether or not the slot was already loaded.\\n */\\n function testAndSetContractStorageLoaded(\\n address _contract,\\n bytes32 _key\\n )\\n override\\n public\\n authenticated\\n returns (\\n bool\\n )\\n {\\n return _testAndSetItemState(\\n _getItemHash(_contract, _key),\\n ItemState.ITEM_LOADED\\n );\\n }\\n\\n /**\\n * Checks whether a storage slot has already been modified, and marks it as modified if not.\\n * @param _contract Address of the contract to check.\\n * @param _key 32 byte storage slot key.\\n * @return Whether or not the slot was already modified.\\n */\\n function testAndSetContractStorageChanged(\\n address _contract,\\n bytes32 _key\\n )\\n override\\n public\\n authenticated\\n returns (\\n bool\\n )\\n {\\n return _testAndSetItemState(\\n _getItemHash(_contract, _key),\\n ItemState.ITEM_CHANGED\\n );\\n }\\n\\n /**\\n * Attempts to mark a storage slot as committed.\\n * @param _contract Address of the account to commit.\\n * @param _key 32 byte slot key to commit.\\n * @return Whether or not the slot was committed.\\n */\\n function commitContractStorage(\\n address _contract,\\n bytes32 _key\\n )\\n override\\n public\\n authenticated\\n returns (\\n bool\\n )\\n {\\n bytes32 item = _getItemHash(_contract, _key);\\n if (itemStates[item] != ItemState.ITEM_CHANGED) {\\n return false;\\n }\\n\\n itemStates[item] = ItemState.ITEM_COMMITTED;\\n totalUncommittedContractStorage -= 1;\\n\\n return true;\\n }\\n\\n /**\\n * Increments the total number of uncommitted storage slots.\\n */\\n function incrementTotalUncommittedContractStorage()\\n override\\n public\\n authenticated\\n {\\n totalUncommittedContractStorage += 1;\\n }\\n\\n /**\\n * Gets the total number of uncommitted storage slots.\\n * @return Total uncommitted storage slots.\\n */\\n function getTotalUncommittedContractStorage()\\n override\\n public\\n view\\n returns (\\n uint256\\n )\\n {\\n return totalUncommittedContractStorage;\\n }\\n\\n /**\\n * Checks whether a given storage slot was changed during execution.\\n * @param _contract Address to check.\\n * @param _key Key of the storage slot to check.\\n * @return Whether or not the storage slot was changed.\\n */\\n function wasContractStorageChanged(\\n address _contract,\\n bytes32 _key\\n )\\n override\\n public\\n view\\n returns (\\n bool\\n )\\n {\\n bytes32 item = _getItemHash(_contract, _key);\\n return itemStates[item] >= ItemState.ITEM_CHANGED;\\n }\\n\\n /**\\n * Checks whether a given storage slot was committed after execution.\\n * @param _contract Address to check.\\n * @param _key Key of the storage slot to check.\\n * @return Whether or not the storage slot was committed.\\n */\\n function wasContractStorageCommitted(\\n address _contract,\\n bytes32 _key\\n )\\n override\\n public\\n view\\n returns (\\n bool\\n )\\n {\\n bytes32 item = _getItemHash(_contract, _key);\\n return itemStates[item] >= ItemState.ITEM_COMMITTED;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Generates a unique hash for an address.\\n * @param _address Address to generate a hash for.\\n * @return Unique hash for the given address.\\n */\\n function _getItemHash(\\n address _address\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(abi.encodePacked(_address));\\n }\\n\\n /**\\n * Generates a unique hash for an address/key pair.\\n * @param _contract Address to generate a hash for.\\n * @param _key Key to generate a hash for.\\n * @return Unique hash for the given pair.\\n */\\n function _getItemHash(\\n address _contract,\\n bytes32 _key\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(abi.encodePacked(\\n _contract,\\n _key\\n ));\\n }\\n\\n /**\\n * Checks whether an item is in a particular state (ITEM_LOADED or ITEM_CHANGED) and sets the\\n * item to the provided state if not.\\n * @param _item 32 byte item ID to check.\\n * @param _minItemState Minimum state that must be satisfied by the item.\\n * @return Whether or not the item was already in the state.\\n */\\n function _testAndSetItemState(\\n bytes32 _item,\\n ItemState _minItemState\\n )\\n internal\\n returns (\\n bool\\n )\\n {\\n bool wasItemState = itemStates[_item] >= _minItemState;\\n\\n if (wasItemState == false) {\\n itemStates[_item] = _minItemState;\\n }\\n\\n return wasItemState;\\n }\\n}\\n\",\"keccak256\":\"0x0df9654f9f958038435c2b2a2c7793b20fa16afe866a69cbed32a371aaa4c78b\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/execution/OVM_StateManagerFactory.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Interface Imports */\\nimport { iOVM_StateManager } from \\\"../../iOVM/execution/iOVM_StateManager.sol\\\";\\nimport { iOVM_StateManagerFactory } from \\\"../../iOVM/execution/iOVM_StateManagerFactory.sol\\\";\\n\\n/* Contract Imports */\\nimport { OVM_StateManager } from \\\"./OVM_StateManager.sol\\\";\\n\\n/**\\n * @title OVM_StateManagerFactory\\n * @dev The State Manager Factory is called by a State Transitioner's init code, to create a new\\n * State Manager for use in the Fraud Verification process.\\n *\\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract OVM_StateManagerFactory is iOVM_StateManagerFactory {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Creates a new OVM_StateManager\\n * @param _owner Owner of the created contract.\\n * @return New OVM_StateManager instance.\\n */\\n function create(\\n address _owner\\n )\\n override\\n public\\n returns (\\n iOVM_StateManager\\n )\\n {\\n return new OVM_StateManager(_owner);\\n }\\n}\\n\",\"keccak256\":\"0xc557f05b8a82eee7b36a389795fe4acc0803bcf5ae33e15e9cba8226e9ab49fc\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/execution/iOVM_StateManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title iOVM_StateManager\\n */\\ninterface iOVM_StateManager {\\n\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n enum ItemState {\\n ITEM_UNTOUCHED,\\n ITEM_LOADED,\\n ITEM_CHANGED,\\n ITEM_COMMITTED\\n }\\n\\n /***************************\\n * Public Functions: Misc *\\n ***************************/\\n\\n function isAuthenticated(address _address) external view returns (bool);\\n\\n /***************************\\n * Public Functions: Setup *\\n ***************************/\\n\\n function owner() external view returns (address _owner);\\n function ovmExecutionManager() external view returns (address _ovmExecutionManager);\\n function setExecutionManager(address _ovmExecutionManager) external;\\n\\n\\n /************************************\\n * Public Functions: Account Access *\\n ************************************/\\n\\n function putAccount(address _address, Lib_OVMCodec.Account memory _account) external;\\n function putEmptyAccount(address _address) external;\\n function getAccount(address _address) external view returns (Lib_OVMCodec.Account memory _account);\\n function hasAccount(address _address) external view returns (bool _exists);\\n function hasEmptyAccount(address _address) external view returns (bool _exists);\\n function setAccountNonce(address _address, uint256 _nonce) external;\\n function getAccountNonce(address _address) external view returns (uint256 _nonce);\\n function getAccountEthAddress(address _address) external view returns (address _ethAddress);\\n function getAccountStorageRoot(address _address) external view returns (bytes32 _storageRoot);\\n function initPendingAccount(address _address) external;\\n function commitPendingAccount(address _address, address _ethAddress, bytes32 _codeHash) external;\\n function testAndSetAccountLoaded(address _address) external returns (bool _wasAccountAlreadyLoaded);\\n function testAndSetAccountChanged(address _address) external returns (bool _wasAccountAlreadyChanged);\\n function commitAccount(address _address) external returns (bool _wasAccountCommitted);\\n function incrementTotalUncommittedAccounts() external;\\n function getTotalUncommittedAccounts() external view returns (uint256 _total);\\n function wasAccountChanged(address _address) external view returns (bool);\\n function wasAccountCommitted(address _address) external view returns (bool);\\n\\n\\n /************************************\\n * Public Functions: Storage Access *\\n ************************************/\\n\\n function putContractStorage(address _contract, bytes32 _key, bytes32 _value) external;\\n function getContractStorage(address _contract, bytes32 _key) external view returns (bytes32 _value);\\n function hasContractStorage(address _contract, bytes32 _key) external view returns (bool _exists);\\n function testAndSetContractStorageLoaded(address _contract, bytes32 _key) external returns (bool _wasContractStorageAlreadyLoaded);\\n function testAndSetContractStorageChanged(address _contract, bytes32 _key) external returns (bool _wasContractStorageAlreadyChanged);\\n function commitContractStorage(address _contract, bytes32 _key) external returns (bool _wasContractStorageCommitted);\\n function incrementTotalUncommittedContractStorage() external;\\n function getTotalUncommittedContractStorage() external view returns (uint256 _total);\\n function wasContractStorageChanged(address _contract, bytes32 _key) external view returns (bool);\\n function wasContractStorageCommitted(address _contract, bytes32 _key) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x7a11dbd1f61593ba34debe07e39eef59967307f7f372ba9855bee0953585d08d\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/execution/iOVM_StateManagerFactory.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Contract Imports */\\nimport { iOVM_StateManager } from \\\"./iOVM_StateManager.sol\\\";\\n\\n/**\\n * @title iOVM_StateManagerFactory\\n */\\ninterface iOVM_StateManagerFactory {\\n\\n /***************************************\\n * Public Functions: Contract Creation *\\n ***************************************/\\n\\n function create(\\n address _owner\\n )\\n external\\n returns (\\n iOVM_StateManager _ovmStateManager\\n );\\n}\\n\",\"keccak256\":\"0x27a90fc43889d0c7d1db50f37907ef7386d9b415d15a1e91a0a068cba59afd36\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/codec/Lib_OVMCodec.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../utils/Lib_Bytes32Utils.sol\\\";\\n\\n/**\\n * @title Lib_OVMCodec\\n */\\nlibrary Lib_OVMCodec {\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum QueueOrigin {\\n SEQUENCER_QUEUE,\\n L1TOL2_QUEUE\\n }\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Account {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n address ethAddress;\\n bool isFresh;\\n }\\n\\n struct EVMAccount {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n }\\n\\n struct ChainBatchHeader {\\n uint256 batchIndex;\\n bytes32 batchRoot;\\n uint256 batchSize;\\n uint256 prevTotalElements;\\n bytes extraData;\\n }\\n\\n struct ChainInclusionProof {\\n uint256 index;\\n bytes32[] siblings;\\n }\\n\\n struct Transaction {\\n uint256 timestamp;\\n uint256 blockNumber;\\n QueueOrigin l1QueueOrigin;\\n address l1TxOrigin;\\n address entrypoint;\\n uint256 gasLimit;\\n bytes data;\\n }\\n\\n struct TransactionChainElement {\\n bool isSequenced;\\n uint256 queueIndex; // QUEUED TX ONLY\\n uint256 timestamp; // SEQUENCER TX ONLY\\n uint256 blockNumber; // SEQUENCER TX ONLY\\n bytes txData; // SEQUENCER TX ONLY\\n }\\n\\n struct QueueElement {\\n bytes32 transactionHash;\\n uint40 timestamp;\\n uint40 blockNumber;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Encodes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Encoded transaction bytes.\\n */\\n function encodeTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return abi.encodePacked(\\n _transaction.timestamp,\\n _transaction.blockNumber,\\n _transaction.l1QueueOrigin,\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n );\\n }\\n\\n /**\\n * Hashes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Hashed transaction\\n */\\n function hashTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(encodeTransaction(_transaction));\\n }\\n\\n /**\\n * Converts an OVM account to an EVM account.\\n * @param _in OVM account to convert.\\n * @return Converted EVM account.\\n */\\n function toEVMAccount(\\n Account memory _in\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n return EVMAccount({\\n nonce: _in.nonce,\\n balance: _in.balance,\\n storageRoot: _in.storageRoot,\\n codeHash: _in.codeHash\\n });\\n }\\n\\n /**\\n * @notice RLP-encodes an account state struct.\\n * @param _account Account state struct.\\n * @return RLP-encoded account state.\\n */\\n function encodeEVMAccount(\\n EVMAccount memory _account\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes[] memory raw = new bytes[](4);\\n\\n // Unfortunately we can't create this array outright because\\n // Lib_RLPWriter.writeList will reject fixed-size arrays. Assigning\\n // index-by-index circumvents this issue.\\n raw[0] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.nonce)\\n )\\n );\\n raw[1] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.balance)\\n )\\n );\\n raw[2] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.storageRoot));\\n raw[3] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.codeHash));\\n\\n return Lib_RLPWriter.writeList(raw);\\n }\\n\\n /**\\n * @notice Decodes an RLP-encoded account state into a useful struct.\\n * @param _encoded RLP-encoded account state.\\n * @return Account state struct.\\n */\\n function decodeEVMAccount(\\n bytes memory _encoded\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\\n\\n return EVMAccount({\\n nonce: Lib_RLPReader.readUint256(accountState[0]),\\n balance: Lib_RLPReader.readUint256(accountState[1]),\\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\\n });\\n }\\n\\n /**\\n * Calculates a hash for a given batch header.\\n * @param _batchHeader Header to hash.\\n * @return Hash of the header.\\n */\\n function hashBatchHeader(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(\\n abi.encode(\\n _batchHeader.batchRoot,\\n _batchHeader.batchSize,\\n _batchHeader.prevTotalElements,\\n _batchHeader.extraData\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0xd85ba2066057a2677926f484b938c7c2ef33ff3853f3b71cda252f4a54f30e05\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPReader.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_RLPReader\\n * @dev Adapted from \\\"RLPReader\\\" by Hamdi Allam (hamdi.allam97@gmail.com).\\n */\\nlibrary Lib_RLPReader {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 constant internal MAX_LIST_LENGTH = 32;\\n\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum RLPItemType {\\n DATA_ITEM,\\n LIST_ITEM\\n }\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct RLPItem {\\n uint256 length;\\n uint256 ptr;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts bytes to a reference to memory position and length.\\n * @param _in Input bytes to convert.\\n * @return Output memory reference.\\n */\\n function toRLPItem(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem memory\\n )\\n {\\n uint256 ptr;\\n assembly {\\n ptr := add(_in, 32)\\n }\\n\\n return RLPItem({\\n length: _in.length,\\n ptr: ptr\\n });\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n (\\n uint256 listOffset,\\n ,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.LIST_ITEM,\\n \\\"Invalid RLP list value.\\\"\\n );\\n\\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\\n // writing to the length. Since we can't know the number of RLP items without looping over\\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\\n // simply set a reasonable maximum list length and decrease the size before we finish.\\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\\n\\n uint256 itemCount = 0;\\n uint256 offset = listOffset;\\n while (offset < _in.length) {\\n require(\\n itemCount < MAX_LIST_LENGTH,\\n \\\"Provided RLP list exceeds max list length.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n ) = _decodeLength(RLPItem({\\n length: _in.length - offset,\\n ptr: _in.ptr + offset\\n }));\\n\\n out[itemCount] = RLPItem({\\n length: itemLength + itemOffset,\\n ptr: _in.ptr + offset\\n });\\n\\n itemCount += 1;\\n offset += itemOffset + itemLength;\\n }\\n\\n // Decrease the array size to match the actual item count.\\n assembly {\\n mstore(out, itemCount)\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n return readList(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes value.\\\"\\n );\\n\\n return _copy(_in.ptr, itemOffset, itemLength);\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return readBytes(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return string(readBytes(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return readString(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n require(\\n _in.length <= 33,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr + itemOffset;\\n bytes32 out;\\n assembly {\\n out := mload(ptr)\\n\\n // Shift the bytes over to match the item size.\\n if lt(itemLength, 32) {\\n out := div(out, exp(256, sub(32, itemLength)))\\n }\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return readBytes32(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return uint256(readBytes32(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return readUint256(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n require(\\n _in.length == 1,\\n \\\"Invalid RLP boolean value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 out;\\n assembly {\\n out := byte(0, mload(ptr))\\n }\\n\\n require(\\n out == 0 || out == 1,\\n \\\"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\\\"\\n );\\n\\n return out != 0;\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return readBool(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n if (_in.length == 1) {\\n return address(0);\\n }\\n\\n require(\\n _in.length == 21,\\n \\\"Invalid RLP address value.\\\"\\n );\\n\\n return address(readUint256(_in));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return readAddress(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads the raw bytes of an RLP item.\\n * @param _in RLP item to read.\\n * @return Raw RLP bytes.\\n */\\n function readRawBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in);\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Decodes the length of an RLP item.\\n * @param _in RLP item to decode.\\n * @return Offset of the encoded data.\\n * @return Length of the encoded data.\\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\\n */\\n function _decodeLength(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n uint256,\\n uint256,\\n RLPItemType\\n )\\n {\\n require(\\n _in.length > 0,\\n \\\"RLP item cannot be null.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 prefix;\\n assembly {\\n prefix := byte(0, mload(ptr))\\n }\\n\\n if (prefix <= 0x7f) {\\n // Single byte.\\n\\n return (0, 1, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xb7) {\\n // Short string.\\n\\n uint256 strLen = prefix - 0x80;\\n\\n require(\\n _in.length > strLen,\\n \\\"Invalid RLP short string.\\\"\\n );\\n\\n return (1, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xbf) {\\n // Long string.\\n uint256 lenOfStrLen = prefix - 0xb7;\\n\\n require(\\n _in.length > lenOfStrLen,\\n \\\"Invalid RLP long string length.\\\"\\n );\\n\\n uint256 strLen;\\n assembly {\\n // Pick out the string length.\\n strLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfStrLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfStrLen + strLen,\\n \\\"Invalid RLP long string.\\\"\\n );\\n\\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xf7) {\\n // Short list.\\n uint256 listLen = prefix - 0xc0;\\n\\n require(\\n _in.length > listLen,\\n \\\"Invalid RLP short list.\\\"\\n );\\n\\n return (1, listLen, RLPItemType.LIST_ITEM);\\n } else {\\n // Long list.\\n uint256 lenOfListLen = prefix - 0xf7;\\n\\n require(\\n _in.length > lenOfListLen,\\n \\\"Invalid RLP long list length.\\\"\\n );\\n\\n uint256 listLen;\\n assembly {\\n // Pick out the list length.\\n listLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfListLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfListLen + listLen,\\n \\\"Invalid RLP long list.\\\"\\n );\\n\\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\\n }\\n }\\n\\n /**\\n * Copies the bytes from a memory location.\\n * @param _src Pointer to the location to read from.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Copied bytes.\\n */\\n function _copy(\\n uint256 _src,\\n uint256 _offset,\\n uint256 _length\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out = new bytes(_length);\\n if (out.length == 0) {\\n return out;\\n }\\n\\n uint256 src = _src + _offset;\\n uint256 dest;\\n assembly {\\n dest := add(out, 32)\\n }\\n\\n // Copy over as many complete words as we can.\\n for (uint256 i = 0; i < _length / 32; i++) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n\\n src += 32;\\n dest += 32;\\n }\\n\\n // Pick out the remaining bytes.\\n uint256 mask = 256 ** (32 - (_length % 32)) - 1;\\n assembly {\\n mstore(\\n dest,\\n or(\\n and(mload(src), not(mask)),\\n and(mload(dest), mask)\\n )\\n )\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Copies an RLP item into bytes.\\n * @param _in RLP item to copy.\\n * @return Copied bytes.\\n */\\n function _copy(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in.ptr, 0, _in.length);\\n }\\n}\\n\",\"keccak256\":\"0x829174c61216dce35fdb888383b6022e0365eb7fbdc71ad79d98b108091969fe\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPWriter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/**\\n * @title Lib_RLPWriter\\n * @author Bakaoh (with modifications)\\n */\\nlibrary Lib_RLPWriter {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * RLP encodes a byte string.\\n * @param _in The byte string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded;\\n\\n if (_in.length == 1 && uint8(_in[0]) < 128) {\\n encoded = _in;\\n } else {\\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * RLP encodes a list of RLP encoded byte byte strings.\\n * @param _in The list of RLP encoded byte strings.\\n * @return The RLP encoded list of items in bytes.\\n */\\n function writeList(\\n bytes[] memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory list = _flatten(_in);\\n return abi.encodePacked(_writeLength(list.length, 192), list);\\n }\\n\\n /**\\n * RLP encodes a string.\\n * @param _in The string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeString(\\n string memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(bytes(_in));\\n }\\n\\n /**\\n * RLP encodes an address.\\n * @param _in The address to encode.\\n * @return The RLP encoded address in bytes.\\n */\\n function writeAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a bytes32 value.\\n * @param _in The bytes32 to encode.\\n * @return _out The RLP encoded bytes32 in bytes.\\n */\\n function writeBytes32(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a uint.\\n * @param _in The uint256 to encode.\\n * @return The RLP encoded uint256 in bytes.\\n */\\n function writeUint(\\n uint256 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(_toBinary(_in));\\n }\\n\\n /**\\n * RLP encodes a bool.\\n * @param _in The bool to encode.\\n * @return The RLP encoded bool in bytes.\\n */\\n function writeBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded = new bytes(1);\\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\\n return encoded;\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\\n * @param _len The length of the string or the payload.\\n * @param _offset 128 if item is string, 192 if item is list.\\n * @return RLP encoded bytes.\\n */\\n function _writeLength(\\n uint256 _len,\\n uint256 _offset\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded;\\n\\n if (_len < 56) {\\n encoded = new bytes(1);\\n encoded[0] = byte(uint8(_len) + uint8(_offset));\\n } else {\\n uint256 lenLen;\\n uint256 i = 1;\\n while (_len / i != 0) {\\n lenLen++;\\n i *= 256;\\n }\\n\\n encoded = new bytes(lenLen + 1);\\n encoded[0] = byte(uint8(lenLen) + uint8(_offset) + 55);\\n for(i = 1; i <= lenLen; i++) {\\n encoded[i] = byte(uint8((_len / (256**(lenLen-i))) % 256));\\n }\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * Encode integer in big endian binary form with no leading zeroes.\\n * @notice TODO: This should be optimized with assembly to save gas costs.\\n * @param _x The integer to encode.\\n * @return RLP encoded bytes.\\n */\\n function _toBinary(\\n uint256 _x\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory b = abi.encodePacked(_x);\\n\\n uint256 i = 0;\\n for (; i < 32; i++) {\\n if (b[i] != 0) {\\n break;\\n }\\n }\\n\\n bytes memory res = new bytes(32 - i);\\n for (uint256 j = 0; j < res.length; j++) {\\n res[j] = b[i++];\\n }\\n\\n return res;\\n }\\n\\n /**\\n * Copies a piece of memory to another location.\\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\\n * @param _dest Destination location.\\n * @param _src Source location.\\n * @param _len Length of memory to copy.\\n */\\n function _memcpy(\\n uint256 _dest,\\n uint256 _src,\\n uint256 _len\\n )\\n private\\n pure\\n {\\n uint256 dest = _dest;\\n uint256 src = _src;\\n uint256 len = _len;\\n\\n for(; len >= 32; len -= 32) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n dest += 32;\\n src += 32;\\n }\\n\\n uint256 mask = 256 ** (32 - len) - 1;\\n assembly {\\n let srcpart := and(mload(src), not(mask))\\n let destpart := and(mload(dest), mask)\\n mstore(dest, or(destpart, srcpart))\\n }\\n }\\n\\n /**\\n * Flattens a list of byte strings into one byte string.\\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\\n * @param _list List of byte strings to flatten.\\n * @return The flattened byte string.\\n */\\n function _flatten(\\n bytes[] memory _list\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n if (_list.length == 0) {\\n return new bytes(0);\\n }\\n\\n uint256 len;\\n uint256 i = 0;\\n for (; i < _list.length; i++) {\\n len += _list[i].length;\\n }\\n\\n bytes memory flattened = new bytes(len);\\n uint256 flattenedPtr;\\n assembly { flattenedPtr := add(flattened, 0x20) }\\n\\n for(i = 0; i < _list.length; i++) {\\n bytes memory item = _list[i];\\n\\n uint256 listPtr;\\n assembly { listPtr := add(item, 0x20)}\\n\\n _memcpy(flattenedPtr, listPtr, item.length);\\n flattenedPtr += _list[i].length;\\n }\\n\\n return flattened;\\n }\\n}\\n\",\"keccak256\":\"0xb60ee4b03ad372c3deff21d454ab714dd0c18ee3e6f9d45532e209fc59d5a54d\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_Bytes32Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_Byte32Utils\\n */\\nlibrary Lib_Bytes32Utils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \\\"true.\\\"\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as a boolean.\\n */\\n function toBool(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return _in != 0;\\n }\\n\\n /**\\n * Converts a boolean to a bytes32 value.\\n * @param _in Input boolean value.\\n * @return Boolean as a bytes32.\\n */\\n function fromBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in ? 1 : 0));\\n }\\n\\n /**\\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as an address.\\n */\\n function toAddress(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return address(uint160(uint256(_in)));\\n }\\n\\n /**\\n * Converts an address to a bytes32.\\n * @param _in Input address value.\\n * @return Address as a bytes32.\\n */\\n function fromAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in));\\n }\\n\\n /**\\n * Removes the leading zeros from a bytes32 value and returns a new (smaller) bytes value.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 without any leading zeros.\\n */\\n function removeLeadingZeros(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out;\\n\\n assembly {\\n // Figure out how many leading zero bytes to remove.\\n let shift := 0\\n for { let i := 0 } and(lt(i, 32), eq(byte(i, _in), 0)) { i := add(i, 1) } {\\n shift := add(shift, 1)\\n }\\n\\n // Reserve some space for our output and fix the free memory pointer.\\n out := mload(0x40)\\n mstore(0x40, add(out, 0x40))\\n\\n // Shift the value and store it into the output bytes.\\n mstore(add(out, 0x20), shl(mul(shift, 8), _in))\\n\\n // Store the new size (with leading zero bytes removed) in the output byte size.\\n mstore(out, sub(32, shift))\\n }\\n\\n return out;\\n }\\n}\\n\",\"keccak256\":\"0xfa2def593e3fc56a31852c3744aefdaa93cec74e721bfcfeb1e5d166c7c60b64\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_BytesUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_BytesUtils\\n */\\nlibrary Lib_BytesUtils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_start + _length >= _start, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n if (_bytes.length - _start == 0) {\\n return bytes('');\\n }\\n\\n return slice(_bytes, _start, _bytes.length - _start);\\n }\\n\\n function toBytes32PadLeft(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n bytes32 ret;\\n uint256 len = _bytes.length <= 32 ? _bytes.length : 32;\\n assembly {\\n ret := shr(mul(sub(32, len), 8), mload(add(_bytes, 32)))\\n }\\n return ret;\\n }\\n\\n function toBytes32(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n if (_bytes.length < 32) {\\n bytes32 ret;\\n assembly {\\n ret := mload(add(_bytes, 32))\\n }\\n return ret;\\n }\\n\\n return abi.decode(_bytes,(bytes32)); // will truncate if input length > 32 bytes\\n }\\n\\n function toUint256(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return uint256(toBytes32(_bytes));\\n }\\n\\n function toUint24(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n uint24\\n )\\n {\\n require(_start + 3 >= _start, \\\"toUint24_overflow\\\");\\n require(_bytes.length >= _start + 3 , \\\"toUint24_outOfBounds\\\");\\n uint24 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x3), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toUint8(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n uint8\\n )\\n {\\n require(_start + 1 >= _start, \\\"toUint8_overflow\\\");\\n require(_bytes.length >= _start + 1 , \\\"toUint8_outOfBounds\\\");\\n uint8 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x1), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toAddress(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n require(_start + 20 >= _start, \\\"toAddress_overflow\\\");\\n require(_bytes.length >= _start + 20, \\\"toAddress_outOfBounds\\\");\\n address tempAddress;\\n\\n assembly {\\n tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000)\\n }\\n\\n return tempAddress;\\n }\\n\\n function toNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory nibbles = new bytes(_bytes.length * 2);\\n\\n for (uint256 i = 0; i < _bytes.length; i++) {\\n nibbles[i * 2] = _bytes[i] >> 4;\\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\\n }\\n\\n return nibbles;\\n }\\n\\n function fromNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory ret = new bytes(_bytes.length / 2);\\n\\n for (uint256 i = 0; i < ret.length; i++) {\\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\\n }\\n\\n return ret;\\n }\\n\\n function equal(\\n bytes memory _bytes,\\n bytes memory _other\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return keccak256(_bytes) == keccak256(_other);\\n }\\n}\\n\",\"keccak256\":\"0xa5195afe32fb2cf104d156e8f4bd39df1ec79bf6ba232097b9e8e0ee14fbc298\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x608060405234801561001057600080fd5b50611437806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c80639ed9331814610030575b600080fd5b6100566004803603602081101561004657600080fd5b50356001600160a01b0316610072565b604080516001600160a01b039092168252519081900360200190f35b600081604051610081906100b5565b6001600160a01b03909116815260405190819003602001906000f0801580156100ae573d6000803e3d6000fd5b5092915050565b61133f806100c38339019056fe608060405234801561001057600080fd5b5060405161133f38038061133f83398101604081905261002f91610054565b600080546001600160a01b0319166001600160a01b0392909216919091179055610082565b600060208284031215610065578081fd5b81516001600160a01b038116811461007b578182fd5b9392505050565b6112ae806100916000396000f3fe608060405234801561001057600080fd5b50600436106101f05760003560e01c80638f3b96471161010f578063d126199f116100a2578063e90abb8611610071578063e90abb86146103f9578063fb37b31c1461040c578063fbcbc0f11461041f578063fcf149a21461043f576101f0565b8063d126199f146103b8578063d15d4150146103cb578063d54414c8146103de578063d7bd4a2a146103f1576101f0565b8063c3fd9b25116100de578063c3fd9b2514610377578063c7650bf21461037f578063c8e40fbf14610392578063d0a215f2146103a5576101f0565b80638f3b96471461033657806399056ba914610349578063af37b86414610351578063af3dc01114610364576101f0565b806333f94305116101875780636f3c75af116101565780636f3c75af146102f55780637c8ee703146103085780637e86faa81461031b5780638da5cb5b1461032e576101f0565b806333f94305146102b25780635c17d629146102ba5780636b18e4e8146102cd5780636c87ad20146102e0576101f0565b8063167020d2116101c3578063167020d2146102595780631aaf392f1461026c5780631b208a5a1461028c57806326dc5b121461029f576101f0565b806307a12945146101f55780630ad226791461021e57806311b1f790146102315780631381ba4d14610244575b600080fd5b61020861020336600461101d565b610452565b60405161021591906111c4565b60405180910390f35b61020861022c366004611072565b6104ba565b61020861023f36600461101d565b610517565b61025761025236600461101d565b610573565b005b61020861026736600461101d565b6105d4565b61027f61027a366004611072565b610679565b60405161021591906111cf565b61020861029a36600461101d565b610727565b61027f6102ad36600461101d565b61075e565b61025761077d565b6102576102c836600461109b565b6107c7565b6102576102db36600461101d565b61089a565b6102e8610944565b60405161021591906111b0565b610208610303366004611072565b610953565b6102e861031636600461101d565b61098c565b610208610329366004611072565b6109ad565b6102e86109c3565b6102576103443660046110cd565b6109d2565b61027f610a88565b61020861035f366004611072565b610a8e565b610208610372366004611072565b610ae2565b610257610b2f565b61020861038d366004611072565b610b79565b6102086103a036600461101d565b610c20565b6102576103b3366004611037565b610c40565b61027f6103c636600461101d565b610cb9565b6102086103d936600461101d565b610cd4565b6102086103ec36600461101d565b610d01565b61027f610d16565b610257610407366004611072565b610d1c565b61020861041a36600461101d565b610d77565b61043261042d36600461101d565b610dc3565b604051610215919061122e565b61025761044d36600461101d565b610e37565b6001600160a01b0381166000908152600260205260408120600301547fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4701480156104b257506001600160a01b038216600090815260026020526040902054155b90505b919050565b6001600160a01b038216600090815260046020908152604080832084845290915281205460ff168061050e57506001600160a01b038316600090815260026020526040902060040154600160a01b900460ff165b90505b92915050565b600080546001600160a01b031633148061053b57506001546001600160a01b031633145b6105605760405162461bcd60e51b8152600401610557906111d8565b60405180910390fd5b6104b261056c83610ef8565b6002610f28565b6000546001600160a01b031633148061059657506001546001600160a01b031633145b6105b25760405162461bcd60e51b8152600401610557906111d8565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b600080546001600160a01b03163314806105f857506001546001600160a01b031633145b6106145760405162461bcd60e51b8152600401610557906111d8565b600061061f83610ef8565b9050600260008281526005602052604090205460ff16600381111561064057fe5b1461064f5760009150506104b5565b6000908152600560205260409020805460ff19166003179055505060068054600019019055600190565b6001600160a01b038216600090815260046020908152604080832084845290915281205460ff161580156106cf57506001600160a01b038316600090815260026020526040902060040154600160a01b900460ff165b156106dc57506000610511565b506001600160a01b0391909116600090815260036020908152604080832093835292905220547ffeedfacecafebeeffeedfacecafebeeffeedfacecafebeeffeedfacecafebeef1890565b60008061073383610ef8565b905060025b60008281526005602052604090205460ff16600381111561075557fe5b10159392505050565b6001600160a01b03166000908152600260208190526040909120015490565b6000546001600160a01b03163314806107a057506001546001600160a01b031633145b6107bc5760405162461bcd60e51b8152600401610557906111d8565b600680546001019055565b6000546001600160a01b03163314806107ea57506001546001600160a01b031633145b6108065760405162461bcd60e51b8152600401610557906111d8565b6001600160a01b038316600081815260036020908152604080832086845282528083207ffeedfacecafebeeffeedfacecafebeeffeedfacecafebeeffeedfacecafebeef86189055928252600481528282208583529052205460ff16610895576001600160a01b03831660009081526004602090815260408083208584529091529020805460ff191660011790555b505050565b6000546001600160a01b03163314806108bd57506001546001600160a01b031633145b6108d95760405162461bcd60e51b8152600401610557906111d8565b6001600160a01b031660009081526002602081905260409091207f56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421918101919091557fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470600390910155565b6001546001600160a01b031681565b6000806109608484610f8e565b905060025b60008281526005602052604090205460ff16600381111561098257fe5b1015949350505050565b6001600160a01b039081166000908152600260205260409020600401541690565b6000806109ba8484610f8e565b90506003610965565b6000546001600160a01b031681565b6000546001600160a01b03163314806109f557506001546001600160a01b031633145b610a115760405162461bcd60e51b8152600401610557906111d8565b6001600160a01b039182166000908152600260208181526040928390208451815590840151600182015591830151908201556060820151600382015560808201516004909101805460a0909301516001600160a01b0319909316919093161760ff60a01b1916600160a01b91151591909102179055565b60075490565b600080546001600160a01b0316331480610ab257506001546001600160a01b031633145b610ace5760405162461bcd60e51b8152600401610557906111d8565b61050e610adb8484610f8e565b6001610f28565b600080546001600160a01b0316331480610b0657506001546001600160a01b031633145b610b225760405162461bcd60e51b8152600401610557906111d8565b61050e61056c8484610f8e565b6000546001600160a01b0316331480610b5257506001546001600160a01b031633145b610b6e5760405162461bcd60e51b8152600401610557906111d8565b600780546001019055565b600080546001600160a01b0316331480610b9d57506001546001600160a01b031633145b610bb95760405162461bcd60e51b8152600401610557906111d8565b6000610bc58484610f8e565b9050600260008281526005602052604090205460ff166003811115610be657fe5b14610bf5576000915050610511565b6000908152600560205260409020805460ff1916600317905550506007805460001901905550600190565b6001600160a01b0316600090815260026020526040902060030154151590565b6000546001600160a01b0316331480610c6357506001546001600160a01b031633145b610c7f5760405162461bcd60e51b8152600401610557906111d8565b6001600160a01b0392831660009081526002602052604090206004810180546001600160a01b031916939094169290921790925560030155565b6001600160a01b031660009081526002602052604090205490565b600080546001600160a01b03838116911614806104b25750506001546001600160a01b0390811691161490565b600080610d0d83610ef8565b90506003610738565b60065490565b6000546001600160a01b0316331480610d3f57506001546001600160a01b031633145b610d5b5760405162461bcd60e51b8152600401610557906111d8565b6001600160a01b03909116600090815260026020526040902055565b600080546001600160a01b0316331480610d9b57506001546001600160a01b031633145b610db75760405162461bcd60e51b8152600401610557906111d8565b6104b2610adb83610ef8565b610dcb610fc1565b506001600160a01b03908116600090815260026020818152604092839020835160c08101855281548152600182015492810192909252918201549281019290925260038101546060830152600401549182166080820152600160a01b90910460ff16151560a082015290565b6000546001600160a01b0316331480610e5a57506001546001600160a01b031633145b610e765760405162461bcd60e51b8152600401610557906111d8565b6001600160a01b03166000908152600260208190526040909120600181557f56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421918101919091557fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4706003820155600401805460ff60a01b1916600160a01b179055565b600081604051602001610f0b9190611171565b604051602081830303815290604052805190602001209050919050565b600080826003811115610f3757fe5b60008581526005602052604090205460ff166003811115610f5457fe5b101590508061050e576000848152600560205260409020805484919060ff19166001836003811115610f8257fe5b02179055509392505050565b60008282604051602001610fa392919061118e565b60405160208183030381529060405280519060200120905092915050565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081019190915290565b80356001600160a01b03811681146104b557600080fd5b803580151581146104b557600080fd5b60006020828403121561102e578081fd5b61050e82610ff6565b60008060006060848603121561104b578182fd5b61105484610ff6565b925061106260208501610ff6565b9150604084013590509250925092565b60008060408385031215611084578182fd5b61108d83610ff6565b946020939093013593505050565b6000806000606084860312156110af578283fd5b6110b884610ff6565b95602085013595506040909401359392505050565b60008082840360e08112156110e0578283fd5b6110e984610ff6565b925060c0601f19820112156110fc578182fd5b5060405160c0810181811067ffffffffffffffff8211171561111a57fe5b80604052506020840135815260408401356020820152606084013560408201526080840135606082015261115060a08501610ff6565b608082015261116160c0850161100d565b60a0820152809150509250929050565b60609190911b6bffffffffffffffffffffffff1916815260140190565b60609290921b6bffffffffffffffffffffffff19168252601482015260340190565b6001600160a01b0391909116815260200190565b901515815260200190565b90815260200190565b60208082526036908201527f46756e6374696f6e2063616e206f6e6c792062652063616c6c65642062792061604082015275757468656e746963617465642061646472657373657360501b606082015260800190565b815181526020808301519082015260408083015190820152606080830151908201526080808301516001600160a01b03169082015260a09182015115159181019190915260c0019056fea26469706673582212205bac84845119d44a384d804ab40cf5b8661877b394d879fd05cdd049485222d964736f6c63430007060033a264697066735822122049d6bdb64f1e5e1bffb7aba87ce3a0db62412188b801b3e899b8b558b75755a364736f6c63430007060033", - "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061002b5760003560e01c80639ed9331814610030575b600080fd5b6100566004803603602081101561004657600080fd5b50356001600160a01b0316610072565b604080516001600160a01b039092168252519081900360200190f35b600081604051610081906100b5565b6001600160a01b03909116815260405190819003602001906000f0801580156100ae573d6000803e3d6000fd5b5092915050565b61133f806100c38339019056fe608060405234801561001057600080fd5b5060405161133f38038061133f83398101604081905261002f91610054565b600080546001600160a01b0319166001600160a01b0392909216919091179055610082565b600060208284031215610065578081fd5b81516001600160a01b038116811461007b578182fd5b9392505050565b6112ae806100916000396000f3fe608060405234801561001057600080fd5b50600436106101f05760003560e01c80638f3b96471161010f578063d126199f116100a2578063e90abb8611610071578063e90abb86146103f9578063fb37b31c1461040c578063fbcbc0f11461041f578063fcf149a21461043f576101f0565b8063d126199f146103b8578063d15d4150146103cb578063d54414c8146103de578063d7bd4a2a146103f1576101f0565b8063c3fd9b25116100de578063c3fd9b2514610377578063c7650bf21461037f578063c8e40fbf14610392578063d0a215f2146103a5576101f0565b80638f3b96471461033657806399056ba914610349578063af37b86414610351578063af3dc01114610364576101f0565b806333f94305116101875780636f3c75af116101565780636f3c75af146102f55780637c8ee703146103085780637e86faa81461031b5780638da5cb5b1461032e576101f0565b806333f94305146102b25780635c17d629146102ba5780636b18e4e8146102cd5780636c87ad20146102e0576101f0565b8063167020d2116101c3578063167020d2146102595780631aaf392f1461026c5780631b208a5a1461028c57806326dc5b121461029f576101f0565b806307a12945146101f55780630ad226791461021e57806311b1f790146102315780631381ba4d14610244575b600080fd5b61020861020336600461101d565b610452565b60405161021591906111c4565b60405180910390f35b61020861022c366004611072565b6104ba565b61020861023f36600461101d565b610517565b61025761025236600461101d565b610573565b005b61020861026736600461101d565b6105d4565b61027f61027a366004611072565b610679565b60405161021591906111cf565b61020861029a36600461101d565b610727565b61027f6102ad36600461101d565b61075e565b61025761077d565b6102576102c836600461109b565b6107c7565b6102576102db36600461101d565b61089a565b6102e8610944565b60405161021591906111b0565b610208610303366004611072565b610953565b6102e861031636600461101d565b61098c565b610208610329366004611072565b6109ad565b6102e86109c3565b6102576103443660046110cd565b6109d2565b61027f610a88565b61020861035f366004611072565b610a8e565b610208610372366004611072565b610ae2565b610257610b2f565b61020861038d366004611072565b610b79565b6102086103a036600461101d565b610c20565b6102576103b3366004611037565b610c40565b61027f6103c636600461101d565b610cb9565b6102086103d936600461101d565b610cd4565b6102086103ec36600461101d565b610d01565b61027f610d16565b610257610407366004611072565b610d1c565b61020861041a36600461101d565b610d77565b61043261042d36600461101d565b610dc3565b604051610215919061122e565b61025761044d36600461101d565b610e37565b6001600160a01b0381166000908152600260205260408120600301547fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4701480156104b257506001600160a01b038216600090815260026020526040902054155b90505b919050565b6001600160a01b038216600090815260046020908152604080832084845290915281205460ff168061050e57506001600160a01b038316600090815260026020526040902060040154600160a01b900460ff165b90505b92915050565b600080546001600160a01b031633148061053b57506001546001600160a01b031633145b6105605760405162461bcd60e51b8152600401610557906111d8565b60405180910390fd5b6104b261056c83610ef8565b6002610f28565b6000546001600160a01b031633148061059657506001546001600160a01b031633145b6105b25760405162461bcd60e51b8152600401610557906111d8565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b600080546001600160a01b03163314806105f857506001546001600160a01b031633145b6106145760405162461bcd60e51b8152600401610557906111d8565b600061061f83610ef8565b9050600260008281526005602052604090205460ff16600381111561064057fe5b1461064f5760009150506104b5565b6000908152600560205260409020805460ff19166003179055505060068054600019019055600190565b6001600160a01b038216600090815260046020908152604080832084845290915281205460ff161580156106cf57506001600160a01b038316600090815260026020526040902060040154600160a01b900460ff165b156106dc57506000610511565b506001600160a01b0391909116600090815260036020908152604080832093835292905220547ffeedfacecafebeeffeedfacecafebeeffeedfacecafebeeffeedfacecafebeef1890565b60008061073383610ef8565b905060025b60008281526005602052604090205460ff16600381111561075557fe5b10159392505050565b6001600160a01b03166000908152600260208190526040909120015490565b6000546001600160a01b03163314806107a057506001546001600160a01b031633145b6107bc5760405162461bcd60e51b8152600401610557906111d8565b600680546001019055565b6000546001600160a01b03163314806107ea57506001546001600160a01b031633145b6108065760405162461bcd60e51b8152600401610557906111d8565b6001600160a01b038316600081815260036020908152604080832086845282528083207ffeedfacecafebeeffeedfacecafebeeffeedfacecafebeeffeedfacecafebeef86189055928252600481528282208583529052205460ff16610895576001600160a01b03831660009081526004602090815260408083208584529091529020805460ff191660011790555b505050565b6000546001600160a01b03163314806108bd57506001546001600160a01b031633145b6108d95760405162461bcd60e51b8152600401610557906111d8565b6001600160a01b031660009081526002602081905260409091207f56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421918101919091557fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470600390910155565b6001546001600160a01b031681565b6000806109608484610f8e565b905060025b60008281526005602052604090205460ff16600381111561098257fe5b1015949350505050565b6001600160a01b039081166000908152600260205260409020600401541690565b6000806109ba8484610f8e565b90506003610965565b6000546001600160a01b031681565b6000546001600160a01b03163314806109f557506001546001600160a01b031633145b610a115760405162461bcd60e51b8152600401610557906111d8565b6001600160a01b039182166000908152600260208181526040928390208451815590840151600182015591830151908201556060820151600382015560808201516004909101805460a0909301516001600160a01b0319909316919093161760ff60a01b1916600160a01b91151591909102179055565b60075490565b600080546001600160a01b0316331480610ab257506001546001600160a01b031633145b610ace5760405162461bcd60e51b8152600401610557906111d8565b61050e610adb8484610f8e565b6001610f28565b600080546001600160a01b0316331480610b0657506001546001600160a01b031633145b610b225760405162461bcd60e51b8152600401610557906111d8565b61050e61056c8484610f8e565b6000546001600160a01b0316331480610b5257506001546001600160a01b031633145b610b6e5760405162461bcd60e51b8152600401610557906111d8565b600780546001019055565b600080546001600160a01b0316331480610b9d57506001546001600160a01b031633145b610bb95760405162461bcd60e51b8152600401610557906111d8565b6000610bc58484610f8e565b9050600260008281526005602052604090205460ff166003811115610be657fe5b14610bf5576000915050610511565b6000908152600560205260409020805460ff1916600317905550506007805460001901905550600190565b6001600160a01b0316600090815260026020526040902060030154151590565b6000546001600160a01b0316331480610c6357506001546001600160a01b031633145b610c7f5760405162461bcd60e51b8152600401610557906111d8565b6001600160a01b0392831660009081526002602052604090206004810180546001600160a01b031916939094169290921790925560030155565b6001600160a01b031660009081526002602052604090205490565b600080546001600160a01b03838116911614806104b25750506001546001600160a01b0390811691161490565b600080610d0d83610ef8565b90506003610738565b60065490565b6000546001600160a01b0316331480610d3f57506001546001600160a01b031633145b610d5b5760405162461bcd60e51b8152600401610557906111d8565b6001600160a01b03909116600090815260026020526040902055565b600080546001600160a01b0316331480610d9b57506001546001600160a01b031633145b610db75760405162461bcd60e51b8152600401610557906111d8565b6104b2610adb83610ef8565b610dcb610fc1565b506001600160a01b03908116600090815260026020818152604092839020835160c08101855281548152600182015492810192909252918201549281019290925260038101546060830152600401549182166080820152600160a01b90910460ff16151560a082015290565b6000546001600160a01b0316331480610e5a57506001546001600160a01b031633145b610e765760405162461bcd60e51b8152600401610557906111d8565b6001600160a01b03166000908152600260208190526040909120600181557f56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421918101919091557fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4706003820155600401805460ff60a01b1916600160a01b179055565b600081604051602001610f0b9190611171565b604051602081830303815290604052805190602001209050919050565b600080826003811115610f3757fe5b60008581526005602052604090205460ff166003811115610f5457fe5b101590508061050e576000848152600560205260409020805484919060ff19166001836003811115610f8257fe5b02179055509392505050565b60008282604051602001610fa392919061118e565b60405160208183030381529060405280519060200120905092915050565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081019190915290565b80356001600160a01b03811681146104b557600080fd5b803580151581146104b557600080fd5b60006020828403121561102e578081fd5b61050e82610ff6565b60008060006060848603121561104b578182fd5b61105484610ff6565b925061106260208501610ff6565b9150604084013590509250925092565b60008060408385031215611084578182fd5b61108d83610ff6565b946020939093013593505050565b6000806000606084860312156110af578283fd5b6110b884610ff6565b95602085013595506040909401359392505050565b60008082840360e08112156110e0578283fd5b6110e984610ff6565b925060c0601f19820112156110fc578182fd5b5060405160c0810181811067ffffffffffffffff8211171561111a57fe5b80604052506020840135815260408401356020820152606084013560408201526080840135606082015261115060a08501610ff6565b608082015261116160c0850161100d565b60a0820152809150509250929050565b60609190911b6bffffffffffffffffffffffff1916815260140190565b60609290921b6bffffffffffffffffffffffff19168252601482015260340190565b6001600160a01b0391909116815260200190565b901515815260200190565b90815260200190565b60208082526036908201527f46756e6374696f6e2063616e206f6e6c792062652063616c6c65642062792061604082015275757468656e746963617465642061646472657373657360501b606082015260800190565b815181526020808301519082015260408083015190820152606080830151908201526080808301516001600160a01b03169082015260a09182015115159181019190915260c0019056fea26469706673582212205bac84845119d44a384d804ab40cf5b8661877b394d879fd05cdd049485222d964736f6c63430007060033a264697066735822122049d6bdb64f1e5e1bffb7aba87ce3a0db62412188b801b3e899b8b558b75755a364736f6c63430007060033", - "devdoc": { - "details": "The State Manager Factory is called by a State Transitioner's init code, to create a new State Manager for use in the Fraud Verification process. Compiler used: solc Runtime target: EVM", - "kind": "dev", - "methods": { - "create(address)": { - "params": { - "_owner": "Owner of the created contract." - }, - "returns": { - "_0": "New OVM_StateManager instance." - } - } - }, - "title": "OVM_StateManagerFactory", - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": { - "create(address)": { - "notice": "Creates a new OVM_StateManager" - } - }, - "version": 1 - }, - "storageLayout": { - "storage": [], - "types": null - } -} \ No newline at end of file diff --git a/packages/contracts/deployments/kovan-v3/OVM_StateTransitionerFactory.json b/packages/contracts/deployments/kovan-v3/OVM_StateTransitionerFactory.json deleted file mode 100644 index 8c6de8d67c0c3..0000000000000 --- a/packages/contracts/deployments/kovan-v3/OVM_StateTransitionerFactory.json +++ /dev/null @@ -1,163 +0,0 @@ -{ - "address": "0xd6eDb16a89A2EE4484fa8fdCDb11B8B5633c3687", - "abi": [ - { - "inputs": [ - { - "internalType": "address", - "name": "_libAddressManager", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_libAddressManager", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_stateTransitionIndex", - "type": "uint256" - }, - { - "internalType": "bytes32", - "name": "_preStateRoot", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "_transactionHash", - "type": "bytes32" - } - ], - "name": "create", - "outputs": [ - { - "internalType": "contract iOVM_StateTransitioner", - "name": "", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "libAddressManager", - "outputs": [ - { - "internalType": "contract Lib_AddressManager", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "string", - "name": "_name", - "type": "string" - } - ], - "name": "resolve", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - } - ], - "transactionHash": "0x36cca1310ad53537bb898174d480b15209ef5ad4c1be506c4516c6de43a39de9", - "receipt": { - "to": null, - "from": "0x18394B52d3Cb931dfA76F63251919D051953413d", - "contractAddress": "0xd6eDb16a89A2EE4484fa8fdCDb11B8B5633c3687", - "transactionIndex": 0, - "gasUsed": "4127740", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0x6d044d596657c12c5311fc0306f862a5f678a150f15ef785ab4546deb6f0e3b7", - "transactionHash": "0x36cca1310ad53537bb898174d480b15209ef5ad4c1be506c4516c6de43a39de9", - "logs": [], - "blockNumber": 24572864, - "cumulativeGasUsed": "4127740", - "status": 1, - "byzantium": true - }, - "args": [ - "0xd56F695e73286ac252A37593DD4E7c14270eC1Df" - ], - "solcInputHash": "5ee8e508e2c54cb5ac6783b4855b1558", - "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_stateTransitionIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"_preStateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"_transactionHash\",\"type\":\"bytes32\"}],\"name\":\"create\",\"outputs\":[{\"internalType\":\"contract iOVM_StateTransitioner\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The State Transitioner Factory is used by the Fraud Verifier to create a new State Transitioner during the initialization of a fraud proof. Compiler used: solc Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"create(address,uint256,bytes32,bytes32)\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\",\"_preStateRoot\":\"State root before the transition was executed.\",\"_stateTransitionIndex\":\"Index of the state transition being verified.\",\"_transactionHash\":\"Hash of the executed transaction.\"},\"returns\":{\"_0\":\"New OVM_StateTransitioner instance.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}}},\"title\":\"OVM_StateTransitionerFactory\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"create(address,uint256,bytes32,bytes32)\":{\"notice\":\"Creates a new OVM_StateTransitioner\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/OVM/verification/OVM_StateTransitionerFactory.sol\":\"OVM_StateTransitionerFactory\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor () internal {\\n address msgSender = _msgSender();\\n _owner = msgSender;\\n emit OwnershipTransferred(address(0), msgSender);\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n emit OwnershipTransferred(_owner, address(0));\\n _owner = address(0);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n emit OwnershipTransferred(_owner, newOwner);\\n _owner = newOwner;\\n }\\n}\\n\",\"keccak256\":\"0x15e2d5bd4c28a88548074c54d220e8086f638a71ed07e6b3ba5a70066fcf458d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with GSN meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address payable) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes memory) {\\n this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x8d3cb350f04ff49cfb10aef08d87f19dcbaecc8027b0bed12f3275cd12f38cf0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/verification/Abs_FraudContributor.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\nimport { iOVM_BondManager } from \\\"../../iOVM/verification/iOVM_BondManager.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/// Minimal contract to be inherited by contracts consumed by users that provide\\n/// data for fraud proofs\\nabstract contract Abs_FraudContributor is Lib_AddressResolver {\\n /// Decorate your functions with this modifier to store how much total gas was\\n /// consumed by the sender, to reward users fairly\\n modifier contributesToFraudProof(bytes32 preStateRoot, bytes32 txHash) {\\n uint256 startGas = gasleft();\\n _;\\n uint256 gasSpent = startGas - gasleft();\\n iOVM_BondManager(resolve('OVM_BondManager')).recordGasSpent(preStateRoot, txHash, msg.sender, gasSpent);\\n }\\n}\\n\",\"keccak256\":\"0x6c27d089a297103cb93b30f7649ab68691cc6b948c315f1037e5de1fe9bf5903\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/verification/OVM_StateTransitioner.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// @unsupported: ovm\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\nimport { Lib_EthUtils } from \\\"../../libraries/utils/Lib_EthUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../../libraries/utils/Lib_Bytes32Utils.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../../libraries/utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_SecureMerkleTrie } from \\\"../../libraries/trie/Lib_SecureMerkleTrie.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../../libraries/rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_RLPReader } from \\\"../../libraries/rlp/Lib_RLPReader.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_StateTransitioner } from \\\"../../iOVM/verification/iOVM_StateTransitioner.sol\\\";\\nimport { iOVM_BondManager } from \\\"../../iOVM/verification/iOVM_BondManager.sol\\\";\\nimport { iOVM_ExecutionManager } from \\\"../../iOVM/execution/iOVM_ExecutionManager.sol\\\";\\nimport { iOVM_StateManager } from \\\"../../iOVM/execution/iOVM_StateManager.sol\\\";\\nimport { iOVM_StateManagerFactory } from \\\"../../iOVM/execution/iOVM_StateManagerFactory.sol\\\";\\n\\n/* Contract Imports */\\nimport { Abs_FraudContributor } from \\\"./Abs_FraudContributor.sol\\\";\\n\\n/**\\n * @title OVM_StateTransitioner\\n * @dev The State Transitioner coordinates the execution of a state transition during the evaluation of a\\n * fraud proof. It feeds verified input to the Execution Manager's run(), and controls a State Manager (which is\\n * uniquely created for each fraud proof).\\n * Once a fraud proof has been initialized, this contract is provided with the pre-state root and verifies\\n * that the OVM storage slots committed to the State Mangager are contained in that state\\n * This contract controls the State Manager and Execution Manager, and uses them to calculate the\\n * post-state root by applying the transaction. The Fraud Verifier can then check for fraud by comparing\\n * the calculated post-state root with the proposed post-state root.\\n *\\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract OVM_StateTransitioner is Lib_AddressResolver, Abs_FraudContributor, iOVM_StateTransitioner {\\n\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n enum TransitionPhase {\\n PRE_EXECUTION,\\n POST_EXECUTION,\\n COMPLETE\\n }\\n\\n\\n /*******************************************\\n * Contract Variables: Contract References *\\n *******************************************/\\n\\n iOVM_StateManager public ovmStateManager;\\n\\n\\n /*******************************************\\n * Contract Variables: Internal Accounting *\\n *******************************************/\\n\\n bytes32 internal preStateRoot;\\n bytes32 internal postStateRoot;\\n TransitionPhase public phase;\\n uint256 internal stateTransitionIndex;\\n bytes32 internal transactionHash;\\n\\n\\n /*************\\n * Constants *\\n *************/\\n\\n bytes32 internal constant EMPTY_ACCOUNT_CODE_HASH = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;\\n bytes32 internal constant EMPTY_ACCOUNT_STORAGE_ROOT = 0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n * @param _stateTransitionIndex Index of the state transition being verified.\\n * @param _preStateRoot State root before the transition was executed.\\n * @param _transactionHash Hash of the executed transaction.\\n */\\n constructor(\\n address _libAddressManager,\\n uint256 _stateTransitionIndex,\\n bytes32 _preStateRoot,\\n bytes32 _transactionHash\\n )\\n Lib_AddressResolver(_libAddressManager)\\n {\\n stateTransitionIndex = _stateTransitionIndex;\\n preStateRoot = _preStateRoot;\\n postStateRoot = _preStateRoot;\\n transactionHash = _transactionHash;\\n\\n ovmStateManager = iOVM_StateManagerFactory(resolve(\\\"OVM_StateManagerFactory\\\")).create(address(this));\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n /**\\n * Checks that a function is only run during a specific phase.\\n * @param _phase Phase the function must run within.\\n */\\n modifier onlyDuringPhase(\\n TransitionPhase _phase\\n ) {\\n require(\\n phase == _phase,\\n \\\"Function must be called during the correct phase.\\\"\\n );\\n _;\\n }\\n\\n\\n /**********************************\\n * Public Functions: State Access *\\n **********************************/\\n\\n /**\\n * Retrieves the state root before execution.\\n * @return _preStateRoot State root before execution.\\n */\\n function getPreStateRoot()\\n override\\n public\\n view\\n returns (\\n bytes32 _preStateRoot\\n )\\n {\\n return preStateRoot;\\n }\\n\\n /**\\n * Retrieves the state root after execution.\\n * @return _postStateRoot State root after execution.\\n */\\n function getPostStateRoot()\\n override\\n public\\n view\\n returns (\\n bytes32 _postStateRoot\\n )\\n {\\n return postStateRoot;\\n }\\n\\n /**\\n * Checks whether the transitioner is complete.\\n * @return _complete Whether or not the transition process is finished.\\n */\\n function isComplete()\\n override\\n public\\n view\\n returns (\\n bool _complete\\n )\\n {\\n return phase == TransitionPhase.COMPLETE;\\n }\\n\\n\\n /***********************************\\n * Public Functions: Pre-Execution *\\n ***********************************/\\n\\n /**\\n * Allows a user to prove the initial state of a contract.\\n * @param _ovmContractAddress Address of the contract on the OVM.\\n * @param _ethContractAddress Address of the corresponding contract on L1.\\n * @param _stateTrieWitness Proof of the account state.\\n */\\n function proveContractState(\\n address _ovmContractAddress,\\n address _ethContractAddress,\\n bytes memory _stateTrieWitness\\n )\\n override\\n public\\n onlyDuringPhase(TransitionPhase.PRE_EXECUTION)\\n contributesToFraudProof(preStateRoot, transactionHash)\\n {\\n // Exit quickly to avoid unnecessary work.\\n require(\\n (\\n ovmStateManager.hasAccount(_ovmContractAddress) == false\\n && ovmStateManager.hasEmptyAccount(_ovmContractAddress) == false\\n ),\\n \\\"Account state has already been proven.\\\"\\n );\\n\\n // Function will fail if the proof is not a valid inclusion or exclusion proof.\\n (\\n bool exists,\\n bytes memory encodedAccount\\n ) = Lib_SecureMerkleTrie.get(\\n abi.encodePacked(_ovmContractAddress),\\n _stateTrieWitness,\\n preStateRoot\\n );\\n\\n if (exists == true) {\\n // Account exists, this was an inclusion proof.\\n Lib_OVMCodec.EVMAccount memory account = Lib_OVMCodec.decodeEVMAccount(\\n encodedAccount\\n );\\n\\n address ethContractAddress = _ethContractAddress;\\n if (account.codeHash == EMPTY_ACCOUNT_CODE_HASH) {\\n // Use a known empty contract to prevent an attack in which a user provides a\\n // contract address here and then later deploys code to it.\\n ethContractAddress = 0x0000000000000000000000000000000000000000;\\n } else {\\n // Otherwise, make sure that the code at the provided eth address matches the hash\\n // of the code stored on L2.\\n require(\\n Lib_EthUtils.getCodeHash(ethContractAddress) == account.codeHash,\\n \\\"OVM_StateTransitioner: Provided L1 contract code hash does not match L2 contract code hash.\\\"\\n );\\n }\\n\\n ovmStateManager.putAccount(\\n _ovmContractAddress,\\n Lib_OVMCodec.Account({\\n nonce: account.nonce,\\n balance: account.balance,\\n storageRoot: account.storageRoot,\\n codeHash: account.codeHash,\\n ethAddress: ethContractAddress,\\n isFresh: false\\n })\\n );\\n } else {\\n // Account does not exist, this was an exclusion proof.\\n ovmStateManager.putEmptyAccount(_ovmContractAddress);\\n }\\n }\\n\\n /**\\n * Allows a user to prove the initial state of a contract storage slot.\\n * @param _ovmContractAddress Address of the contract on the OVM.\\n * @param _key Claimed account slot key.\\n * @param _storageTrieWitness Proof of the storage slot.\\n */\\n function proveStorageSlot(\\n address _ovmContractAddress,\\n bytes32 _key,\\n bytes memory _storageTrieWitness\\n )\\n override\\n public\\n onlyDuringPhase(TransitionPhase.PRE_EXECUTION)\\n contributesToFraudProof(preStateRoot, transactionHash)\\n {\\n // Exit quickly to avoid unnecessary work.\\n require(\\n ovmStateManager.hasContractStorage(_ovmContractAddress, _key) == false,\\n \\\"Storage slot has already been proven.\\\"\\n );\\n\\n require(\\n ovmStateManager.hasAccount(_ovmContractAddress) == true,\\n \\\"Contract must be verified before proving a storage slot.\\\"\\n );\\n\\n bytes32 storageRoot = ovmStateManager.getAccountStorageRoot(_ovmContractAddress);\\n bytes32 value;\\n\\n if (storageRoot == EMPTY_ACCOUNT_STORAGE_ROOT) {\\n // Storage trie was empty, so the user is always allowed to insert zero-byte values.\\n value = bytes32(0);\\n } else {\\n // Function will fail if the proof is not a valid inclusion or exclusion proof.\\n (\\n bool exists,\\n bytes memory encodedValue\\n ) = Lib_SecureMerkleTrie.get(\\n abi.encodePacked(_key),\\n _storageTrieWitness,\\n storageRoot\\n );\\n\\n if (exists == true) {\\n // Inclusion proof.\\n // Stored values are RLP encoded, with leading zeros removed.\\n value = Lib_BytesUtils.toBytes32PadLeft(\\n Lib_RLPReader.readBytes(encodedValue)\\n );\\n } else {\\n // Exclusion proof, can only be zero bytes.\\n value = bytes32(0);\\n }\\n }\\n\\n ovmStateManager.putContractStorage(\\n _ovmContractAddress,\\n _key,\\n value\\n );\\n }\\n\\n\\n /*******************************\\n * Public Functions: Execution *\\n *******************************/\\n\\n /**\\n * Executes the state transition.\\n * @param _transaction OVM transaction to execute.\\n */\\n function applyTransaction(\\n Lib_OVMCodec.Transaction memory _transaction\\n )\\n override\\n public\\n onlyDuringPhase(TransitionPhase.PRE_EXECUTION)\\n contributesToFraudProof(preStateRoot, transactionHash)\\n {\\n require(\\n Lib_OVMCodec.hashTransaction(_transaction) == transactionHash,\\n \\\"Invalid transaction provided.\\\"\\n );\\n\\n // We require gas to complete the logic here in run() before/after execution,\\n // But must ensure the full _tx.gasLimit can be given to the ovmCALL (determinism)\\n // This includes 1/64 of the gas getting lost because of EIP-150 (lost twice--first\\n // going into EM, then going into the code contract).\\n require(\\n gasleft() >= 100000 + _transaction.gasLimit * 1032 / 1000, // 1032/1000 = 1.032 = (64/63)^2 rounded up\\n \\\"Not enough gas to execute transaction deterministically.\\\"\\n );\\n\\n iOVM_ExecutionManager ovmExecutionManager = iOVM_ExecutionManager(resolve(\\\"OVM_ExecutionManager\\\"));\\n\\n // We call `setExecutionManager` right before `run` (and not earlier) just in case the\\n // OVM_ExecutionManager address was updated between the time when this contract was created\\n // and when `applyTransaction` was called.\\n ovmStateManager.setExecutionManager(address(ovmExecutionManager));\\n\\n // `run` always succeeds *unless* the user hasn't provided enough gas to `applyTransaction`\\n // or an INVALID_STATE_ACCESS flag was triggered. Either way, we won't get beyond this line\\n // if that's the case.\\n ovmExecutionManager.run(_transaction, address(ovmStateManager));\\n\\n // Prevent the Execution Manager from calling this SM again.\\n ovmStateManager.setExecutionManager(address(0));\\n phase = TransitionPhase.POST_EXECUTION;\\n }\\n\\n\\n /************************************\\n * Public Functions: Post-Execution *\\n ************************************/\\n\\n /**\\n * Allows a user to commit the final state of a contract.\\n * @param _ovmContractAddress Address of the contract on the OVM.\\n * @param _stateTrieWitness Proof of the account state.\\n */\\n function commitContractState(\\n address _ovmContractAddress,\\n bytes memory _stateTrieWitness\\n )\\n override\\n public\\n onlyDuringPhase(TransitionPhase.POST_EXECUTION)\\n contributesToFraudProof(preStateRoot, transactionHash)\\n {\\n require(\\n ovmStateManager.getTotalUncommittedContractStorage() == 0,\\n \\\"All storage must be committed before committing account states.\\\"\\n );\\n\\n require (\\n ovmStateManager.commitAccount(_ovmContractAddress) == true,\\n \\\"Account state wasn't changed or has already been committed.\\\"\\n );\\n\\n Lib_OVMCodec.Account memory account = ovmStateManager.getAccount(_ovmContractAddress);\\n\\n postStateRoot = Lib_SecureMerkleTrie.update(\\n abi.encodePacked(_ovmContractAddress),\\n Lib_OVMCodec.encodeEVMAccount(\\n Lib_OVMCodec.toEVMAccount(account)\\n ),\\n _stateTrieWitness,\\n postStateRoot\\n );\\n\\n // Emit an event to help clients figure out the proof ordering.\\n emit AccountCommitted(\\n _ovmContractAddress\\n );\\n }\\n\\n /**\\n * Allows a user to commit the final state of a contract storage slot.\\n * @param _ovmContractAddress Address of the contract on the OVM.\\n * @param _key Claimed account slot key.\\n * @param _storageTrieWitness Proof of the storage slot.\\n */\\n function commitStorageSlot(\\n address _ovmContractAddress,\\n bytes32 _key,\\n bytes memory _storageTrieWitness\\n )\\n override\\n public\\n onlyDuringPhase(TransitionPhase.POST_EXECUTION)\\n contributesToFraudProof(preStateRoot, transactionHash)\\n {\\n require(\\n ovmStateManager.commitContractStorage(_ovmContractAddress, _key) == true,\\n \\\"Storage slot value wasn't changed or has already been committed.\\\"\\n );\\n\\n Lib_OVMCodec.Account memory account = ovmStateManager.getAccount(_ovmContractAddress);\\n bytes32 value = ovmStateManager.getContractStorage(_ovmContractAddress, _key);\\n\\n account.storageRoot = Lib_SecureMerkleTrie.update(\\n abi.encodePacked(_key),\\n Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(value)\\n ),\\n _storageTrieWitness,\\n account.storageRoot\\n );\\n\\n ovmStateManager.putAccount(_ovmContractAddress, account);\\n\\n // Emit an event to help clients figure out the proof ordering.\\n emit ContractStorageCommitted(\\n _ovmContractAddress,\\n _key\\n );\\n }\\n\\n\\n /**********************************\\n * Public Functions: Finalization *\\n **********************************/\\n\\n /**\\n * Finalizes the transition process.\\n */\\n function completeTransition()\\n override\\n public\\n onlyDuringPhase(TransitionPhase.POST_EXECUTION)\\n {\\n require(\\n ovmStateManager.getTotalUncommittedAccounts() == 0,\\n \\\"All accounts must be committed before completing a transition.\\\"\\n );\\n\\n require(\\n ovmStateManager.getTotalUncommittedContractStorage() == 0,\\n \\\"All storage must be committed before completing a transition.\\\"\\n );\\n\\n phase = TransitionPhase.COMPLETE;\\n }\\n}\\n\",\"keccak256\":\"0xc363807221625338a396c52a4bc3b7439e63972ac87521670c47745641e91fa6\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/verification/OVM_StateTransitionerFactory.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// @unsupported: ovm\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_StateTransitioner } from \\\"../../iOVM/verification/iOVM_StateTransitioner.sol\\\";\\nimport { iOVM_StateTransitionerFactory } from \\\"../../iOVM/verification/iOVM_StateTransitionerFactory.sol\\\";\\nimport { iOVM_FraudVerifier } from \\\"../../iOVM/verification/iOVM_FraudVerifier.sol\\\";\\n\\n/* Contract Imports */\\nimport { OVM_StateTransitioner } from \\\"./OVM_StateTransitioner.sol\\\";\\n\\n/**\\n * @title OVM_StateTransitionerFactory\\n * @dev The State Transitioner Factory is used by the Fraud Verifier to create a new State\\n * Transitioner during the initialization of a fraud proof.\\n *\\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract OVM_StateTransitionerFactory is iOVM_StateTransitionerFactory, Lib_AddressResolver {\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n constructor(\\n address _libAddressManager\\n )\\n Lib_AddressResolver(_libAddressManager)\\n {}\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Creates a new OVM_StateTransitioner\\n * @param _libAddressManager Address of the Address Manager.\\n * @param _stateTransitionIndex Index of the state transition being verified.\\n * @param _preStateRoot State root before the transition was executed.\\n * @param _transactionHash Hash of the executed transaction.\\n * @return New OVM_StateTransitioner instance.\\n */\\n function create(\\n address _libAddressManager,\\n uint256 _stateTransitionIndex,\\n bytes32 _preStateRoot,\\n bytes32 _transactionHash\\n )\\n override\\n public\\n returns (\\n iOVM_StateTransitioner\\n )\\n {\\n require(\\n msg.sender == resolve(\\\"OVM_FraudVerifier\\\"),\\n \\\"Create can only be done by the OVM_FraudVerifier.\\\"\\n );\\n\\n return new OVM_StateTransitioner(\\n _libAddressManager,\\n _stateTransitionIndex,\\n _preStateRoot,\\n _transactionHash\\n );\\n }\\n}\\n\",\"keccak256\":\"0x65ef11334a2d6931b6d3a85e7b29c39c774d19443e7040e132a58be505e3b52c\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/execution/iOVM_ExecutionManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\ninterface iOVM_ExecutionManager {\\n /**********\\n * Enums *\\n *********/\\n\\n enum RevertFlag {\\n OUT_OF_GAS,\\n INTENTIONAL_REVERT,\\n EXCEEDS_NUISANCE_GAS,\\n INVALID_STATE_ACCESS,\\n UNSAFE_BYTECODE,\\n CREATE_COLLISION,\\n STATIC_VIOLATION,\\n CREATOR_NOT_ALLOWED\\n }\\n\\n enum GasMetadataKey {\\n CURRENT_EPOCH_START_TIMESTAMP,\\n CUMULATIVE_SEQUENCER_QUEUE_GAS,\\n CUMULATIVE_L1TOL2_QUEUE_GAS,\\n PREV_EPOCH_SEQUENCER_QUEUE_GAS,\\n PREV_EPOCH_L1TOL2_QUEUE_GAS\\n }\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct GasMeterConfig {\\n uint256 minTransactionGasLimit;\\n uint256 maxTransactionGasLimit;\\n uint256 maxGasPerQueuePerEpoch;\\n uint256 secondsPerEpoch;\\n }\\n\\n struct GlobalContext {\\n uint256 ovmCHAINID;\\n }\\n\\n struct TransactionContext {\\n Lib_OVMCodec.QueueOrigin ovmL1QUEUEORIGIN;\\n uint256 ovmTIMESTAMP;\\n uint256 ovmNUMBER;\\n uint256 ovmGASLIMIT;\\n uint256 ovmTXGASLIMIT;\\n address ovmL1TXORIGIN;\\n }\\n\\n struct TransactionRecord {\\n uint256 ovmGasRefund;\\n }\\n\\n struct MessageContext {\\n address ovmCALLER;\\n address ovmADDRESS;\\n bool isStatic;\\n }\\n\\n struct MessageRecord {\\n uint256 nuisanceGasLeft;\\n }\\n\\n\\n /************************************\\n * Transaction Execution Entrypoint *\\n ************************************/\\n\\n function run(\\n Lib_OVMCodec.Transaction calldata _transaction,\\n address _txStateManager\\n ) external returns (bytes memory);\\n\\n\\n /*******************\\n * Context Opcodes *\\n *******************/\\n\\n function ovmCALLER() external view returns (address _caller);\\n function ovmADDRESS() external view returns (address _address);\\n function ovmTIMESTAMP() external view returns (uint256 _timestamp);\\n function ovmNUMBER() external view returns (uint256 _number);\\n function ovmGASLIMIT() external view returns (uint256 _gasLimit);\\n function ovmCHAINID() external view returns (uint256 _chainId);\\n\\n\\n /**********************\\n * L2 Context Opcodes *\\n **********************/\\n\\n function ovmL1QUEUEORIGIN() external view returns (Lib_OVMCodec.QueueOrigin _queueOrigin);\\n function ovmL1TXORIGIN() external view returns (address _l1TxOrigin);\\n\\n\\n /*******************\\n * Halting Opcodes *\\n *******************/\\n\\n function ovmREVERT(bytes memory _data) external;\\n\\n\\n /*****************************\\n * Contract Creation Opcodes *\\n *****************************/\\n\\n function ovmCREATE(bytes memory _bytecode) external returns (address _contract, bytes memory _revertdata);\\n function ovmCREATE2(bytes memory _bytecode, bytes32 _salt) external returns (address _contract, bytes memory _revertdata);\\n\\n\\n /*******************************\\n * Account Abstraction Opcodes *\\n ******************************/\\n\\n function ovmGETNONCE() external returns (uint256 _nonce);\\n function ovmINCREMENTNONCE() external;\\n function ovmCREATEEOA(bytes32 _messageHash, uint8 _v, bytes32 _r, bytes32 _s) external;\\n\\n\\n /****************************\\n * Contract Calling Opcodes *\\n ****************************/\\n\\n function ovmCALL(uint256 _gasLimit, address _address, bytes memory _calldata) external returns (bool _success, bytes memory _returndata);\\n function ovmSTATICCALL(uint256 _gasLimit, address _address, bytes memory _calldata) external returns (bool _success, bytes memory _returndata);\\n function ovmDELEGATECALL(uint256 _gasLimit, address _address, bytes memory _calldata) external returns (bool _success, bytes memory _returndata);\\n\\n\\n /****************************\\n * Contract Storage Opcodes *\\n ****************************/\\n\\n function ovmSLOAD(bytes32 _key) external returns (bytes32 _value);\\n function ovmSSTORE(bytes32 _key, bytes32 _value) external;\\n\\n\\n /*************************\\n * Contract Code Opcodes *\\n *************************/\\n\\n function ovmEXTCODECOPY(address _contract, uint256 _offset, uint256 _length) external returns (bytes memory _code);\\n function ovmEXTCODESIZE(address _contract) external returns (uint256 _size);\\n function ovmEXTCODEHASH(address _contract) external returns (bytes32 _hash);\\n\\n\\n /***************************************\\n * Public Functions: Execution Context *\\n ***************************************/\\n\\n function getMaxTransactionGasLimit() external view returns (uint _maxTransactionGasLimit);\\n}\\n\",\"keccak256\":\"0xf023d5d6fc6a03bd52f7a57af6e21076de77e8925d065bb79db062e73e43b684\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/execution/iOVM_StateManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title iOVM_StateManager\\n */\\ninterface iOVM_StateManager {\\n\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n enum ItemState {\\n ITEM_UNTOUCHED,\\n ITEM_LOADED,\\n ITEM_CHANGED,\\n ITEM_COMMITTED\\n }\\n\\n /***************************\\n * Public Functions: Misc *\\n ***************************/\\n\\n function isAuthenticated(address _address) external view returns (bool);\\n\\n /***************************\\n * Public Functions: Setup *\\n ***************************/\\n\\n function owner() external view returns (address _owner);\\n function ovmExecutionManager() external view returns (address _ovmExecutionManager);\\n function setExecutionManager(address _ovmExecutionManager) external;\\n\\n\\n /************************************\\n * Public Functions: Account Access *\\n ************************************/\\n\\n function putAccount(address _address, Lib_OVMCodec.Account memory _account) external;\\n function putEmptyAccount(address _address) external;\\n function getAccount(address _address) external view returns (Lib_OVMCodec.Account memory _account);\\n function hasAccount(address _address) external view returns (bool _exists);\\n function hasEmptyAccount(address _address) external view returns (bool _exists);\\n function setAccountNonce(address _address, uint256 _nonce) external;\\n function getAccountNonce(address _address) external view returns (uint256 _nonce);\\n function getAccountEthAddress(address _address) external view returns (address _ethAddress);\\n function getAccountStorageRoot(address _address) external view returns (bytes32 _storageRoot);\\n function initPendingAccount(address _address) external;\\n function commitPendingAccount(address _address, address _ethAddress, bytes32 _codeHash) external;\\n function testAndSetAccountLoaded(address _address) external returns (bool _wasAccountAlreadyLoaded);\\n function testAndSetAccountChanged(address _address) external returns (bool _wasAccountAlreadyChanged);\\n function commitAccount(address _address) external returns (bool _wasAccountCommitted);\\n function incrementTotalUncommittedAccounts() external;\\n function getTotalUncommittedAccounts() external view returns (uint256 _total);\\n function wasAccountChanged(address _address) external view returns (bool);\\n function wasAccountCommitted(address _address) external view returns (bool);\\n\\n\\n /************************************\\n * Public Functions: Storage Access *\\n ************************************/\\n\\n function putContractStorage(address _contract, bytes32 _key, bytes32 _value) external;\\n function getContractStorage(address _contract, bytes32 _key) external view returns (bytes32 _value);\\n function hasContractStorage(address _contract, bytes32 _key) external view returns (bool _exists);\\n function testAndSetContractStorageLoaded(address _contract, bytes32 _key) external returns (bool _wasContractStorageAlreadyLoaded);\\n function testAndSetContractStorageChanged(address _contract, bytes32 _key) external returns (bool _wasContractStorageAlreadyChanged);\\n function commitContractStorage(address _contract, bytes32 _key) external returns (bool _wasContractStorageCommitted);\\n function incrementTotalUncommittedContractStorage() external;\\n function getTotalUncommittedContractStorage() external view returns (uint256 _total);\\n function wasContractStorageChanged(address _contract, bytes32 _key) external view returns (bool);\\n function wasContractStorageCommitted(address _contract, bytes32 _key) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x7a11dbd1f61593ba34debe07e39eef59967307f7f372ba9855bee0953585d08d\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/execution/iOVM_StateManagerFactory.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Contract Imports */\\nimport { iOVM_StateManager } from \\\"./iOVM_StateManager.sol\\\";\\n\\n/**\\n * @title iOVM_StateManagerFactory\\n */\\ninterface iOVM_StateManagerFactory {\\n\\n /***************************************\\n * Public Functions: Contract Creation *\\n ***************************************/\\n\\n function create(\\n address _owner\\n )\\n external\\n returns (\\n iOVM_StateManager _ovmStateManager\\n );\\n}\\n\",\"keccak256\":\"0x27a90fc43889d0c7d1db50f37907ef7386d9b415d15a1e91a0a068cba59afd36\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/verification/iOVM_BondManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\ninterface ERC20 {\\n function transfer(address, uint256) external returns (bool);\\n function transferFrom(address, address, uint256) external returns (bool);\\n}\\n\\n/// All the errors which may be encountered on the bond manager\\nlibrary Errors {\\n string constant ERC20_ERR = \\\"BondManager: Could not post bond\\\";\\n string constant ALREADY_FINALIZED = \\\"BondManager: Fraud proof for this pre-state root has already been finalized\\\";\\n string constant SLASHED = \\\"BondManager: Cannot finalize withdrawal, you probably got slashed\\\";\\n string constant WRONG_STATE = \\\"BondManager: Wrong bond state for proposer\\\";\\n string constant CANNOT_CLAIM = \\\"BondManager: Cannot claim yet. Dispute must be finalized first\\\";\\n\\n string constant WITHDRAWAL_PENDING = \\\"BondManager: Withdrawal already pending\\\";\\n string constant TOO_EARLY = \\\"BondManager: Too early to finalize your withdrawal\\\";\\n\\n string constant ONLY_TRANSITIONER = \\\"BondManager: Only the transitioner for this pre-state root may call this function\\\";\\n string constant ONLY_FRAUD_VERIFIER = \\\"BondManager: Only the fraud verifier may call this function\\\";\\n string constant ONLY_STATE_COMMITMENT_CHAIN = \\\"BondManager: Only the state commitment chain may call this function\\\";\\n string constant WAIT_FOR_DISPUTES = \\\"BondManager: Wait for other potential disputes\\\";\\n}\\n\\n/**\\n * @title iOVM_BondManager\\n */\\ninterface iOVM_BondManager {\\n\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n /// The lifecycle of a proposer's bond\\n enum State {\\n // Before depositing or after getting slashed, a user is uncollateralized\\n NOT_COLLATERALIZED,\\n // After depositing, a user is collateralized\\n COLLATERALIZED,\\n // After a user has initiated a withdrawal\\n WITHDRAWING\\n }\\n\\n /// A bond posted by a proposer\\n struct Bond {\\n // The user's state\\n State state;\\n // The timestamp at which a proposer issued their withdrawal request\\n uint32 withdrawalTimestamp;\\n // The time when the first disputed was initiated for this bond\\n uint256 firstDisputeAt;\\n // The earliest observed state root for this bond which has had fraud\\n bytes32 earliestDisputedStateRoot;\\n // The state root's timestamp\\n uint256 earliestTimestamp;\\n }\\n\\n // Per pre-state root, store the number of state provisions that were made\\n // and how many of these calls were made by each user. Payouts will then be\\n // claimed by users proportionally for that dispute.\\n struct Rewards {\\n // Flag to check if rewards for a fraud proof are claimable\\n bool canClaim;\\n // Total number of `recordGasSpent` calls made\\n uint256 total;\\n // The gas spent by each user to provide witness data. The sum of all\\n // values inside this map MUST be equal to the value of `total`\\n mapping(address => uint256) gasSpent;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function recordGasSpent(\\n bytes32 _preStateRoot,\\n bytes32 _txHash,\\n address _who,\\n uint256 _gasSpent\\n ) external;\\n\\n function finalize(\\n bytes32 _preStateRoot,\\n address _publisher,\\n uint256 _timestamp\\n ) external;\\n\\n function deposit() external;\\n\\n function startWithdrawal() external;\\n\\n function finalizeWithdrawal() external;\\n\\n function claim(\\n address _who\\n ) external;\\n\\n function isCollateralized(\\n address _who\\n ) external view returns (bool);\\n\\n function getGasSpent(\\n bytes32 _preStateRoot,\\n address _who\\n ) external view returns (uint256);\\n}\\n\",\"keccak256\":\"0x3c2a8a399487857158649db1896749d86e39cba545a8aeb2e2bb0f3bdfa7a5b1\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/verification/iOVM_FraudVerifier.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_StateTransitioner } from \\\"./iOVM_StateTransitioner.sol\\\";\\n\\n/**\\n * @title iOVM_FraudVerifier\\n */\\ninterface iOVM_FraudVerifier {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event FraudProofInitialized(\\n bytes32 _preStateRoot,\\n uint256 _preStateRootIndex,\\n bytes32 _transactionHash,\\n address _who\\n );\\n\\n event FraudProofFinalized(\\n bytes32 _preStateRoot,\\n uint256 _preStateRootIndex,\\n bytes32 _transactionHash,\\n address _who\\n );\\n\\n\\n /***************************************\\n * Public Functions: Transition Status *\\n ***************************************/\\n\\n function getStateTransitioner(bytes32 _preStateRoot, bytes32 _txHash) external view returns (iOVM_StateTransitioner _transitioner);\\n\\n\\n /****************************************\\n * Public Functions: Fraud Verification *\\n ****************************************/\\n\\n function initializeFraudVerification(\\n bytes32 _preStateRoot,\\n Lib_OVMCodec.ChainBatchHeader calldata _preStateRootBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof calldata _preStateRootProof,\\n Lib_OVMCodec.Transaction calldata _transaction,\\n Lib_OVMCodec.TransactionChainElement calldata _txChainElement,\\n Lib_OVMCodec.ChainBatchHeader calldata _transactionBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof calldata _transactionProof\\n ) external;\\n\\n function finalizeFraudVerification(\\n bytes32 _preStateRoot,\\n Lib_OVMCodec.ChainBatchHeader calldata _preStateRootBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof calldata _preStateRootProof,\\n bytes32 _txHash,\\n bytes32 _postStateRoot,\\n Lib_OVMCodec.ChainBatchHeader calldata _postStateRootBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof calldata _postStateRootProof\\n ) external;\\n}\\n\",\"keccak256\":\"0x5efd7bb18164bbd3e9d58379e8203fbf2a7ee802b1a48dff3ceaaec1523b1751\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/verification/iOVM_StateTransitioner.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title iOVM_StateTransitioner\\n */\\ninterface iOVM_StateTransitioner {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AccountCommitted(\\n address _address\\n );\\n\\n event ContractStorageCommitted(\\n address _address,\\n bytes32 _key\\n );\\n\\n\\n /**********************************\\n * Public Functions: State Access *\\n **********************************/\\n\\n function getPreStateRoot() external view returns (bytes32 _preStateRoot);\\n function getPostStateRoot() external view returns (bytes32 _postStateRoot);\\n function isComplete() external view returns (bool _complete);\\n\\n\\n /***********************************\\n * Public Functions: Pre-Execution *\\n ***********************************/\\n\\n function proveContractState(\\n address _ovmContractAddress,\\n address _ethContractAddress,\\n bytes calldata _stateTrieWitness\\n ) external;\\n\\n function proveStorageSlot(\\n address _ovmContractAddress,\\n bytes32 _key,\\n bytes calldata _storageTrieWitness\\n ) external;\\n\\n\\n /*******************************\\n * Public Functions: Execution *\\n *******************************/\\n\\n function applyTransaction(\\n Lib_OVMCodec.Transaction calldata _transaction\\n ) external;\\n\\n\\n /************************************\\n * Public Functions: Post-Execution *\\n ************************************/\\n\\n function commitContractState(\\n address _ovmContractAddress,\\n bytes calldata _stateTrieWitness\\n ) external;\\n\\n function commitStorageSlot(\\n address _ovmContractAddress,\\n bytes32 _key,\\n bytes calldata _storageTrieWitness\\n ) external;\\n\\n\\n /**********************************\\n * Public Functions: Finalization *\\n **********************************/\\n\\n function completeTransition() external;\\n}\\n\",\"keccak256\":\"0x3d044ac0a3bb6ad3d529f904b3191117511f9c379678ca03010e1ebdfcb5c34b\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/verification/iOVM_StateTransitionerFactory.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Contract Imports */\\nimport { iOVM_StateTransitioner } from \\\"./iOVM_StateTransitioner.sol\\\";\\n\\n/**\\n * @title iOVM_StateTransitionerFactory\\n */\\ninterface iOVM_StateTransitionerFactory {\\n\\n /***************************************\\n * Public Functions: Contract Creation *\\n ***************************************/\\n\\n function create(\\n address _proxyManager,\\n uint256 _stateTransitionIndex,\\n bytes32 _preStateRoot,\\n bytes32 _transactionHash\\n )\\n external\\n returns (\\n iOVM_StateTransitioner _ovmStateTransitioner\\n );\\n}\\n\",\"keccak256\":\"0x60a0f0c104e4c0c7863268a93005762e8146d393f9cfddfdd6a2d6585c5911fc\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/codec/Lib_OVMCodec.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../utils/Lib_Bytes32Utils.sol\\\";\\n\\n/**\\n * @title Lib_OVMCodec\\n */\\nlibrary Lib_OVMCodec {\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum QueueOrigin {\\n SEQUENCER_QUEUE,\\n L1TOL2_QUEUE\\n }\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Account {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n address ethAddress;\\n bool isFresh;\\n }\\n\\n struct EVMAccount {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n }\\n\\n struct ChainBatchHeader {\\n uint256 batchIndex;\\n bytes32 batchRoot;\\n uint256 batchSize;\\n uint256 prevTotalElements;\\n bytes extraData;\\n }\\n\\n struct ChainInclusionProof {\\n uint256 index;\\n bytes32[] siblings;\\n }\\n\\n struct Transaction {\\n uint256 timestamp;\\n uint256 blockNumber;\\n QueueOrigin l1QueueOrigin;\\n address l1TxOrigin;\\n address entrypoint;\\n uint256 gasLimit;\\n bytes data;\\n }\\n\\n struct TransactionChainElement {\\n bool isSequenced;\\n uint256 queueIndex; // QUEUED TX ONLY\\n uint256 timestamp; // SEQUENCER TX ONLY\\n uint256 blockNumber; // SEQUENCER TX ONLY\\n bytes txData; // SEQUENCER TX ONLY\\n }\\n\\n struct QueueElement {\\n bytes32 transactionHash;\\n uint40 timestamp;\\n uint40 blockNumber;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Encodes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Encoded transaction bytes.\\n */\\n function encodeTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return abi.encodePacked(\\n _transaction.timestamp,\\n _transaction.blockNumber,\\n _transaction.l1QueueOrigin,\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n );\\n }\\n\\n /**\\n * Hashes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Hashed transaction\\n */\\n function hashTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(encodeTransaction(_transaction));\\n }\\n\\n /**\\n * Converts an OVM account to an EVM account.\\n * @param _in OVM account to convert.\\n * @return Converted EVM account.\\n */\\n function toEVMAccount(\\n Account memory _in\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n return EVMAccount({\\n nonce: _in.nonce,\\n balance: _in.balance,\\n storageRoot: _in.storageRoot,\\n codeHash: _in.codeHash\\n });\\n }\\n\\n /**\\n * @notice RLP-encodes an account state struct.\\n * @param _account Account state struct.\\n * @return RLP-encoded account state.\\n */\\n function encodeEVMAccount(\\n EVMAccount memory _account\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes[] memory raw = new bytes[](4);\\n\\n // Unfortunately we can't create this array outright because\\n // Lib_RLPWriter.writeList will reject fixed-size arrays. Assigning\\n // index-by-index circumvents this issue.\\n raw[0] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.nonce)\\n )\\n );\\n raw[1] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.balance)\\n )\\n );\\n raw[2] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.storageRoot));\\n raw[3] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.codeHash));\\n\\n return Lib_RLPWriter.writeList(raw);\\n }\\n\\n /**\\n * @notice Decodes an RLP-encoded account state into a useful struct.\\n * @param _encoded RLP-encoded account state.\\n * @return Account state struct.\\n */\\n function decodeEVMAccount(\\n bytes memory _encoded\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\\n\\n return EVMAccount({\\n nonce: Lib_RLPReader.readUint256(accountState[0]),\\n balance: Lib_RLPReader.readUint256(accountState[1]),\\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\\n });\\n }\\n\\n /**\\n * Calculates a hash for a given batch header.\\n * @param _batchHeader Header to hash.\\n * @return Hash of the header.\\n */\\n function hashBatchHeader(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(\\n abi.encode(\\n _batchHeader.batchRoot,\\n _batchHeader.batchSize,\\n _batchHeader.prevTotalElements,\\n _batchHeader.extraData\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0xd85ba2066057a2677926f484b938c7c2ef33ff3853f3b71cda252f4a54f30e05\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n public\\n onlyOwner\\n {\\n addresses[_getNameHash(_name)] = _address;\\n\\n emit AddressSet(\\n _name,\\n _address\\n );\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0x2ce671a0e004df88b136bea5a3c59d0732cea8887c8496da1d509e0200b03d7d\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(\\n address _libAddressManager\\n ) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x65981feeabff6a81783ea97d44baf988a18a86c8cb374c46fdb71819cbacc7c0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPReader.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_RLPReader\\n * @dev Adapted from \\\"RLPReader\\\" by Hamdi Allam (hamdi.allam97@gmail.com).\\n */\\nlibrary Lib_RLPReader {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 constant internal MAX_LIST_LENGTH = 32;\\n\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum RLPItemType {\\n DATA_ITEM,\\n LIST_ITEM\\n }\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct RLPItem {\\n uint256 length;\\n uint256 ptr;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts bytes to a reference to memory position and length.\\n * @param _in Input bytes to convert.\\n * @return Output memory reference.\\n */\\n function toRLPItem(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem memory\\n )\\n {\\n uint256 ptr;\\n assembly {\\n ptr := add(_in, 32)\\n }\\n\\n return RLPItem({\\n length: _in.length,\\n ptr: ptr\\n });\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n (\\n uint256 listOffset,\\n ,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.LIST_ITEM,\\n \\\"Invalid RLP list value.\\\"\\n );\\n\\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\\n // writing to the length. Since we can't know the number of RLP items without looping over\\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\\n // simply set a reasonable maximum list length and decrease the size before we finish.\\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\\n\\n uint256 itemCount = 0;\\n uint256 offset = listOffset;\\n while (offset < _in.length) {\\n require(\\n itemCount < MAX_LIST_LENGTH,\\n \\\"Provided RLP list exceeds max list length.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n ) = _decodeLength(RLPItem({\\n length: _in.length - offset,\\n ptr: _in.ptr + offset\\n }));\\n\\n out[itemCount] = RLPItem({\\n length: itemLength + itemOffset,\\n ptr: _in.ptr + offset\\n });\\n\\n itemCount += 1;\\n offset += itemOffset + itemLength;\\n }\\n\\n // Decrease the array size to match the actual item count.\\n assembly {\\n mstore(out, itemCount)\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n return readList(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes value.\\\"\\n );\\n\\n return _copy(_in.ptr, itemOffset, itemLength);\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return readBytes(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return string(readBytes(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return readString(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n require(\\n _in.length <= 33,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr + itemOffset;\\n bytes32 out;\\n assembly {\\n out := mload(ptr)\\n\\n // Shift the bytes over to match the item size.\\n if lt(itemLength, 32) {\\n out := div(out, exp(256, sub(32, itemLength)))\\n }\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return readBytes32(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return uint256(readBytes32(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return readUint256(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n require(\\n _in.length == 1,\\n \\\"Invalid RLP boolean value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 out;\\n assembly {\\n out := byte(0, mload(ptr))\\n }\\n\\n require(\\n out == 0 || out == 1,\\n \\\"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\\\"\\n );\\n\\n return out != 0;\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return readBool(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n if (_in.length == 1) {\\n return address(0);\\n }\\n\\n require(\\n _in.length == 21,\\n \\\"Invalid RLP address value.\\\"\\n );\\n\\n return address(readUint256(_in));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return readAddress(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads the raw bytes of an RLP item.\\n * @param _in RLP item to read.\\n * @return Raw RLP bytes.\\n */\\n function readRawBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in);\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Decodes the length of an RLP item.\\n * @param _in RLP item to decode.\\n * @return Offset of the encoded data.\\n * @return Length of the encoded data.\\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\\n */\\n function _decodeLength(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n uint256,\\n uint256,\\n RLPItemType\\n )\\n {\\n require(\\n _in.length > 0,\\n \\\"RLP item cannot be null.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 prefix;\\n assembly {\\n prefix := byte(0, mload(ptr))\\n }\\n\\n if (prefix <= 0x7f) {\\n // Single byte.\\n\\n return (0, 1, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xb7) {\\n // Short string.\\n\\n uint256 strLen = prefix - 0x80;\\n\\n require(\\n _in.length > strLen,\\n \\\"Invalid RLP short string.\\\"\\n );\\n\\n return (1, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xbf) {\\n // Long string.\\n uint256 lenOfStrLen = prefix - 0xb7;\\n\\n require(\\n _in.length > lenOfStrLen,\\n \\\"Invalid RLP long string length.\\\"\\n );\\n\\n uint256 strLen;\\n assembly {\\n // Pick out the string length.\\n strLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfStrLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfStrLen + strLen,\\n \\\"Invalid RLP long string.\\\"\\n );\\n\\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xf7) {\\n // Short list.\\n uint256 listLen = prefix - 0xc0;\\n\\n require(\\n _in.length > listLen,\\n \\\"Invalid RLP short list.\\\"\\n );\\n\\n return (1, listLen, RLPItemType.LIST_ITEM);\\n } else {\\n // Long list.\\n uint256 lenOfListLen = prefix - 0xf7;\\n\\n require(\\n _in.length > lenOfListLen,\\n \\\"Invalid RLP long list length.\\\"\\n );\\n\\n uint256 listLen;\\n assembly {\\n // Pick out the list length.\\n listLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfListLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfListLen + listLen,\\n \\\"Invalid RLP long list.\\\"\\n );\\n\\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\\n }\\n }\\n\\n /**\\n * Copies the bytes from a memory location.\\n * @param _src Pointer to the location to read from.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Copied bytes.\\n */\\n function _copy(\\n uint256 _src,\\n uint256 _offset,\\n uint256 _length\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out = new bytes(_length);\\n if (out.length == 0) {\\n return out;\\n }\\n\\n uint256 src = _src + _offset;\\n uint256 dest;\\n assembly {\\n dest := add(out, 32)\\n }\\n\\n // Copy over as many complete words as we can.\\n for (uint256 i = 0; i < _length / 32; i++) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n\\n src += 32;\\n dest += 32;\\n }\\n\\n // Pick out the remaining bytes.\\n uint256 mask = 256 ** (32 - (_length % 32)) - 1;\\n assembly {\\n mstore(\\n dest,\\n or(\\n and(mload(src), not(mask)),\\n and(mload(dest), mask)\\n )\\n )\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Copies an RLP item into bytes.\\n * @param _in RLP item to copy.\\n * @return Copied bytes.\\n */\\n function _copy(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in.ptr, 0, _in.length);\\n }\\n}\\n\",\"keccak256\":\"0x829174c61216dce35fdb888383b6022e0365eb7fbdc71ad79d98b108091969fe\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPWriter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/**\\n * @title Lib_RLPWriter\\n * @author Bakaoh (with modifications)\\n */\\nlibrary Lib_RLPWriter {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * RLP encodes a byte string.\\n * @param _in The byte string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded;\\n\\n if (_in.length == 1 && uint8(_in[0]) < 128) {\\n encoded = _in;\\n } else {\\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * RLP encodes a list of RLP encoded byte byte strings.\\n * @param _in The list of RLP encoded byte strings.\\n * @return The RLP encoded list of items in bytes.\\n */\\n function writeList(\\n bytes[] memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory list = _flatten(_in);\\n return abi.encodePacked(_writeLength(list.length, 192), list);\\n }\\n\\n /**\\n * RLP encodes a string.\\n * @param _in The string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeString(\\n string memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(bytes(_in));\\n }\\n\\n /**\\n * RLP encodes an address.\\n * @param _in The address to encode.\\n * @return The RLP encoded address in bytes.\\n */\\n function writeAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a bytes32 value.\\n * @param _in The bytes32 to encode.\\n * @return _out The RLP encoded bytes32 in bytes.\\n */\\n function writeBytes32(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a uint.\\n * @param _in The uint256 to encode.\\n * @return The RLP encoded uint256 in bytes.\\n */\\n function writeUint(\\n uint256 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(_toBinary(_in));\\n }\\n\\n /**\\n * RLP encodes a bool.\\n * @param _in The bool to encode.\\n * @return The RLP encoded bool in bytes.\\n */\\n function writeBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded = new bytes(1);\\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\\n return encoded;\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\\n * @param _len The length of the string or the payload.\\n * @param _offset 128 if item is string, 192 if item is list.\\n * @return RLP encoded bytes.\\n */\\n function _writeLength(\\n uint256 _len,\\n uint256 _offset\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded;\\n\\n if (_len < 56) {\\n encoded = new bytes(1);\\n encoded[0] = byte(uint8(_len) + uint8(_offset));\\n } else {\\n uint256 lenLen;\\n uint256 i = 1;\\n while (_len / i != 0) {\\n lenLen++;\\n i *= 256;\\n }\\n\\n encoded = new bytes(lenLen + 1);\\n encoded[0] = byte(uint8(lenLen) + uint8(_offset) + 55);\\n for(i = 1; i <= lenLen; i++) {\\n encoded[i] = byte(uint8((_len / (256**(lenLen-i))) % 256));\\n }\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * Encode integer in big endian binary form with no leading zeroes.\\n * @notice TODO: This should be optimized with assembly to save gas costs.\\n * @param _x The integer to encode.\\n * @return RLP encoded bytes.\\n */\\n function _toBinary(\\n uint256 _x\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory b = abi.encodePacked(_x);\\n\\n uint256 i = 0;\\n for (; i < 32; i++) {\\n if (b[i] != 0) {\\n break;\\n }\\n }\\n\\n bytes memory res = new bytes(32 - i);\\n for (uint256 j = 0; j < res.length; j++) {\\n res[j] = b[i++];\\n }\\n\\n return res;\\n }\\n\\n /**\\n * Copies a piece of memory to another location.\\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\\n * @param _dest Destination location.\\n * @param _src Source location.\\n * @param _len Length of memory to copy.\\n */\\n function _memcpy(\\n uint256 _dest,\\n uint256 _src,\\n uint256 _len\\n )\\n private\\n pure\\n {\\n uint256 dest = _dest;\\n uint256 src = _src;\\n uint256 len = _len;\\n\\n for(; len >= 32; len -= 32) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n dest += 32;\\n src += 32;\\n }\\n\\n uint256 mask = 256 ** (32 - len) - 1;\\n assembly {\\n let srcpart := and(mload(src), not(mask))\\n let destpart := and(mload(dest), mask)\\n mstore(dest, or(destpart, srcpart))\\n }\\n }\\n\\n /**\\n * Flattens a list of byte strings into one byte string.\\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\\n * @param _list List of byte strings to flatten.\\n * @return The flattened byte string.\\n */\\n function _flatten(\\n bytes[] memory _list\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n if (_list.length == 0) {\\n return new bytes(0);\\n }\\n\\n uint256 len;\\n uint256 i = 0;\\n for (; i < _list.length; i++) {\\n len += _list[i].length;\\n }\\n\\n bytes memory flattened = new bytes(len);\\n uint256 flattenedPtr;\\n assembly { flattenedPtr := add(flattened, 0x20) }\\n\\n for(i = 0; i < _list.length; i++) {\\n bytes memory item = _list[i];\\n\\n uint256 listPtr;\\n assembly { listPtr := add(item, 0x20)}\\n\\n _memcpy(flattenedPtr, listPtr, item.length);\\n flattenedPtr += _list[i].length;\\n }\\n\\n return flattened;\\n }\\n}\\n\",\"keccak256\":\"0xb60ee4b03ad372c3deff21d454ab714dd0c18ee3e6f9d45532e209fc59d5a54d\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/trie/Lib_MerkleTrie.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\n\\n/**\\n * @title Lib_MerkleTrie\\n */\\nlibrary Lib_MerkleTrie {\\n\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n enum NodeType {\\n BranchNode,\\n ExtensionNode,\\n LeafNode\\n }\\n\\n struct TrieNode {\\n bytes encoded;\\n Lib_RLPReader.RLPItem[] decoded;\\n }\\n\\n\\n /**********************\\n * Contract Constants *\\n **********************/\\n\\n // TREE_RADIX determines the number of elements per branch node.\\n uint256 constant TREE_RADIX = 16;\\n // Branch nodes have TREE_RADIX elements plus an additional `value` slot.\\n uint256 constant BRANCH_NODE_LENGTH = TREE_RADIX + 1;\\n // Leaf nodes and extension nodes always have two elements, a `path` and a `value`.\\n uint256 constant LEAF_OR_EXTENSION_NODE_LENGTH = 2;\\n\\n // Prefixes are prepended to the `path` within a leaf or extension node and\\n // allow us to differentiate between the two node types. `ODD` or `EVEN` is\\n // determined by the number of nibbles within the unprefixed `path`. If the\\n // number of nibbles if even, we need to insert an extra padding nibble so\\n // the resulting prefixed `path` has an even number of nibbles.\\n uint8 constant PREFIX_EXTENSION_EVEN = 0;\\n uint8 constant PREFIX_EXTENSION_ODD = 1;\\n uint8 constant PREFIX_LEAF_EVEN = 2;\\n uint8 constant PREFIX_LEAF_ODD = 3;\\n\\n // Just a utility constant. RLP represents `NULL` as 0x80.\\n bytes1 constant RLP_NULL = bytes1(0x80);\\n bytes constant RLP_NULL_BYTES = hex'80';\\n bytes32 constant internal KECCAK256_RLP_NULL_BYTES = keccak256(RLP_NULL_BYTES);\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * @notice Verifies a proof that a given key/value pair is present in the\\n * Merkle trie.\\n * @param _key Key of the node to search for, as a hex string.\\n * @param _value Value of the node to search for, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the desired node. Unlike\\n * traditional Merkle trees, this proof is executed top-down and consists\\n * of a list of RLP-encoded nodes that make a path down to the target node.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _verified `true` if the k/v pair exists in the trie, `false` otherwise.\\n */\\n function verifyInclusionProof(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bool _verified\\n )\\n {\\n (\\n bool exists,\\n bytes memory value\\n ) = get(_key, _proof, _root);\\n\\n return (\\n exists && Lib_BytesUtils.equal(_value, value)\\n );\\n }\\n\\n /**\\n * @notice Verifies a proof that a given key is *not* present in\\n * the Merkle trie.\\n * @param _key Key of the node to search for, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\\n * target node.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _verified `true` if the key is absent in the trie, `false` otherwise.\\n */\\n function verifyExclusionProof(\\n bytes memory _key,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bool _verified\\n )\\n {\\n (\\n bool exists,\\n ) = get(_key, _proof, _root);\\n\\n return exists == false;\\n }\\n\\n /**\\n * @notice Updates a Merkle trie and returns a new root hash.\\n * @param _key Key of the node to update, as a hex string.\\n * @param _value Value of the node to update, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\\n * target node. If the key exists, we can simply update the value.\\n * Otherwise, we need to modify the trie to handle the new k/v pair.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _updatedRoot Root hash of the newly constructed trie.\\n */\\n function update(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bytes32 _updatedRoot\\n )\\n {\\n // Special case when inserting the very first node.\\n if (_root == KECCAK256_RLP_NULL_BYTES) {\\n return getSingleNodeRootHash(_key, _value);\\n }\\n\\n TrieNode[] memory proof = _parseProof(_proof);\\n (uint256 pathLength, bytes memory keyRemainder, ) = _walkNodePath(proof, _key, _root);\\n TrieNode[] memory newPath = _getNewPath(proof, pathLength, keyRemainder, _value);\\n\\n return _getUpdatedTrieRoot(newPath, _key);\\n }\\n\\n /**\\n * @notice Retrieves the value associated with a given key.\\n * @param _key Key to search for, as hex bytes.\\n * @param _proof Merkle trie inclusion proof for the key.\\n * @param _root Known root of the Merkle trie.\\n * @return _exists Whether or not the key exists.\\n * @return _value Value of the key if it exists.\\n */\\n function get(\\n bytes memory _key,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bool _exists,\\n bytes memory _value\\n )\\n {\\n TrieNode[] memory proof = _parseProof(_proof);\\n (uint256 pathLength, bytes memory keyRemainder, bool isFinalNode) = _walkNodePath(proof, _key, _root);\\n\\n bool exists = keyRemainder.length == 0;\\n\\n require(\\n exists || isFinalNode,\\n \\\"Provided proof is invalid.\\\"\\n );\\n\\n bytes memory value = exists ? _getNodeValue(proof[pathLength - 1]) : bytes('');\\n\\n return (\\n exists,\\n value\\n );\\n }\\n\\n /**\\n * Computes the root hash for a trie with a single node.\\n * @param _key Key for the single node.\\n * @param _value Value for the single node.\\n * @return _updatedRoot Hash of the trie.\\n */\\n function getSingleNodeRootHash(\\n bytes memory _key,\\n bytes memory _value\\n )\\n internal\\n pure\\n returns (\\n bytes32 _updatedRoot\\n )\\n {\\n return keccak256(_makeLeafNode(\\n Lib_BytesUtils.toNibbles(_key),\\n _value\\n ).encoded);\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * @notice Walks through a proof using a provided key.\\n * @param _proof Inclusion proof to walk through.\\n * @param _key Key to use for the walk.\\n * @param _root Known root of the trie.\\n * @return _pathLength Length of the final path\\n * @return _keyRemainder Portion of the key remaining after the walk.\\n * @return _isFinalNode Whether or not we've hit a dead end.\\n */\\n function _walkNodePath(\\n TrieNode[] memory _proof,\\n bytes memory _key,\\n bytes32 _root\\n )\\n private\\n pure\\n returns (\\n uint256 _pathLength,\\n bytes memory _keyRemainder,\\n bool _isFinalNode\\n )\\n {\\n uint256 pathLength = 0;\\n bytes memory key = Lib_BytesUtils.toNibbles(_key);\\n\\n bytes32 currentNodeID = _root;\\n uint256 currentKeyIndex = 0;\\n uint256 currentKeyIncrement = 0;\\n TrieNode memory currentNode;\\n\\n // Proof is top-down, so we start at the first element (root).\\n for (uint256 i = 0; i < _proof.length; i++) {\\n currentNode = _proof[i];\\n currentKeyIndex += currentKeyIncrement;\\n\\n // Keep track of the proof elements we actually need.\\n // It's expensive to resize arrays, so this simply reduces gas costs.\\n pathLength += 1;\\n\\n if (currentKeyIndex == 0) {\\n // First proof element is always the root node.\\n require(\\n keccak256(currentNode.encoded) == currentNodeID,\\n \\\"Invalid root hash\\\"\\n );\\n } else if (currentNode.encoded.length >= 32) {\\n // Nodes 32 bytes or larger are hashed inside branch nodes.\\n require(\\n keccak256(currentNode.encoded) == currentNodeID,\\n \\\"Invalid large internal hash\\\"\\n );\\n } else {\\n // Nodes smaller than 31 bytes aren't hashed.\\n require(\\n Lib_BytesUtils.toBytes32(currentNode.encoded) == currentNodeID,\\n \\\"Invalid internal node hash\\\"\\n );\\n }\\n\\n if (currentNode.decoded.length == BRANCH_NODE_LENGTH) {\\n if (currentKeyIndex == key.length) {\\n // We've hit the end of the key, meaning the value should be within this branch node.\\n break;\\n } else {\\n // We're not at the end of the key yet.\\n // Figure out what the next node ID should be and continue.\\n uint8 branchKey = uint8(key[currentKeyIndex]);\\n Lib_RLPReader.RLPItem memory nextNode = currentNode.decoded[branchKey];\\n currentNodeID = _getNodeID(nextNode);\\n currentKeyIncrement = 1;\\n continue;\\n }\\n } else if (currentNode.decoded.length == LEAF_OR_EXTENSION_NODE_LENGTH) {\\n bytes memory path = _getNodePath(currentNode);\\n uint8 prefix = uint8(path[0]);\\n uint8 offset = 2 - prefix % 2;\\n bytes memory pathRemainder = Lib_BytesUtils.slice(path, offset);\\n bytes memory keyRemainder = Lib_BytesUtils.slice(key, currentKeyIndex);\\n uint256 sharedNibbleLength = _getSharedNibbleLength(pathRemainder, keyRemainder);\\n\\n if (prefix == PREFIX_LEAF_EVEN || prefix == PREFIX_LEAF_ODD) {\\n if (\\n pathRemainder.length == sharedNibbleLength &&\\n keyRemainder.length == sharedNibbleLength\\n ) {\\n // The key within this leaf matches our key exactly.\\n // Increment the key index to reflect that we have no remainder.\\n currentKeyIndex += sharedNibbleLength;\\n }\\n\\n // We've hit a leaf node, so our next node should be NULL.\\n currentNodeID = bytes32(RLP_NULL);\\n break;\\n } else if (prefix == PREFIX_EXTENSION_EVEN || prefix == PREFIX_EXTENSION_ODD) {\\n if (sharedNibbleLength == 0) {\\n // Our extension node doesn't share any part of our key.\\n // We've hit the end of this path, updates will need to modify this extension.\\n currentNodeID = bytes32(RLP_NULL);\\n break;\\n } else {\\n // Our extension shares some nibbles.\\n // Carry on to the next node.\\n currentNodeID = _getNodeID(currentNode.decoded[1]);\\n currentKeyIncrement = sharedNibbleLength;\\n continue;\\n }\\n } else {\\n revert(\\\"Received a node with an unknown prefix\\\");\\n }\\n } else {\\n revert(\\\"Received an unparseable node.\\\");\\n }\\n }\\n\\n // If our node ID is NULL, then we're at a dead end.\\n bool isFinalNode = currentNodeID == bytes32(RLP_NULL);\\n return (pathLength, Lib_BytesUtils.slice(key, currentKeyIndex), isFinalNode);\\n }\\n\\n /**\\n * @notice Creates new nodes to support a k/v pair insertion into a given\\n * Merkle trie path.\\n * @param _path Path to the node nearest the k/v pair.\\n * @param _pathLength Length of the path. Necessary because the provided\\n * path may include additional nodes (e.g., it comes directly from a proof)\\n * and we can't resize in-memory arrays without costly duplication.\\n * @param _keyRemainder Portion of the initial key that must be inserted\\n * into the trie.\\n * @param _value Value to insert at the given key.\\n * @return _newPath A new path with the inserted k/v pair and extra supporting nodes.\\n */\\n function _getNewPath(\\n TrieNode[] memory _path,\\n uint256 _pathLength,\\n bytes memory _keyRemainder,\\n bytes memory _value\\n )\\n private\\n pure\\n returns (\\n TrieNode[] memory _newPath\\n )\\n {\\n bytes memory keyRemainder = _keyRemainder;\\n\\n // Most of our logic depends on the status of the last node in the path.\\n TrieNode memory lastNode = _path[_pathLength - 1];\\n NodeType lastNodeType = _getNodeType(lastNode);\\n\\n // Create an array for newly created nodes.\\n // We need up to three new nodes, depending on the contents of the last node.\\n // Since array resizing is expensive, we'll keep track of the size manually.\\n // We're using an explicit `totalNewNodes += 1` after insertions for clarity.\\n TrieNode[] memory newNodes = new TrieNode[](3);\\n uint256 totalNewNodes = 0;\\n\\n if (keyRemainder.length == 0 && lastNodeType == NodeType.LeafNode) {\\n // We've found a leaf node with the given key.\\n // Simply need to update the value of the node to match.\\n newNodes[totalNewNodes] = _makeLeafNode(_getNodeKey(lastNode), _value);\\n totalNewNodes += 1;\\n } else if (lastNodeType == NodeType.BranchNode) {\\n if (keyRemainder.length == 0) {\\n // We've found a branch node with the given key.\\n // Simply need to update the value of the node to match.\\n newNodes[totalNewNodes] = _editBranchValue(lastNode, _value);\\n totalNewNodes += 1;\\n } else {\\n // We've found a branch node, but it doesn't contain our key.\\n // Reinsert the old branch for now.\\n newNodes[totalNewNodes] = lastNode;\\n totalNewNodes += 1;\\n // Create a new leaf node, slicing our remainder since the first byte points\\n // to our branch node.\\n newNodes[totalNewNodes] = _makeLeafNode(Lib_BytesUtils.slice(keyRemainder, 1), _value);\\n totalNewNodes += 1;\\n }\\n } else {\\n // Our last node is either an extension node or a leaf node with a different key.\\n bytes memory lastNodeKey = _getNodeKey(lastNode);\\n uint256 sharedNibbleLength = _getSharedNibbleLength(lastNodeKey, keyRemainder);\\n\\n if (sharedNibbleLength != 0) {\\n // We've got some shared nibbles between the last node and our key remainder.\\n // We'll need to insert an extension node that covers these shared nibbles.\\n bytes memory nextNodeKey = Lib_BytesUtils.slice(lastNodeKey, 0, sharedNibbleLength);\\n newNodes[totalNewNodes] = _makeExtensionNode(nextNodeKey, _getNodeHash(_value));\\n totalNewNodes += 1;\\n\\n // Cut down the keys since we've just covered these shared nibbles.\\n lastNodeKey = Lib_BytesUtils.slice(lastNodeKey, sharedNibbleLength);\\n keyRemainder = Lib_BytesUtils.slice(keyRemainder, sharedNibbleLength);\\n }\\n\\n // Create an empty branch to fill in.\\n TrieNode memory newBranch = _makeEmptyBranchNode();\\n\\n if (lastNodeKey.length == 0) {\\n // Key remainder was larger than the key for our last node.\\n // The value within our last node is therefore going to be shifted into\\n // a branch value slot.\\n newBranch = _editBranchValue(newBranch, _getNodeValue(lastNode));\\n } else {\\n // Last node key was larger than the key remainder.\\n // We're going to modify some index of our branch.\\n uint8 branchKey = uint8(lastNodeKey[0]);\\n // Move on to the next nibble.\\n lastNodeKey = Lib_BytesUtils.slice(lastNodeKey, 1);\\n\\n if (lastNodeType == NodeType.LeafNode) {\\n // We're dealing with a leaf node.\\n // We'll modify the key and insert the old leaf node into the branch index.\\n TrieNode memory modifiedLastNode = _makeLeafNode(lastNodeKey, _getNodeValue(lastNode));\\n newBranch = _editBranchIndex(newBranch, branchKey, _getNodeHash(modifiedLastNode.encoded));\\n } else if (lastNodeKey.length != 0) {\\n // We're dealing with a shrinking extension node.\\n // We need to modify the node to decrease the size of the key.\\n TrieNode memory modifiedLastNode = _makeExtensionNode(lastNodeKey, _getNodeValue(lastNode));\\n newBranch = _editBranchIndex(newBranch, branchKey, _getNodeHash(modifiedLastNode.encoded));\\n } else {\\n // We're dealing with an unnecessary extension node.\\n // We're going to delete the node entirely.\\n // Simply insert its current value into the branch index.\\n newBranch = _editBranchIndex(newBranch, branchKey, _getNodeValue(lastNode));\\n }\\n }\\n\\n if (keyRemainder.length == 0) {\\n // We've got nothing left in the key remainder.\\n // Simply insert the value into the branch value slot.\\n newBranch = _editBranchValue(newBranch, _value);\\n // Push the branch into the list of new nodes.\\n newNodes[totalNewNodes] = newBranch;\\n totalNewNodes += 1;\\n } else {\\n // We've got some key remainder to work with.\\n // We'll be inserting a leaf node into the trie.\\n // First, move on to the next nibble.\\n keyRemainder = Lib_BytesUtils.slice(keyRemainder, 1);\\n // Push the branch into the list of new nodes.\\n newNodes[totalNewNodes] = newBranch;\\n totalNewNodes += 1;\\n // Push a new leaf node for our k/v pair.\\n newNodes[totalNewNodes] = _makeLeafNode(keyRemainder, _value);\\n totalNewNodes += 1;\\n }\\n }\\n\\n // Finally, join the old path with our newly created nodes.\\n // Since we're overwriting the last node in the path, we use `_pathLength - 1`.\\n return _joinNodeArrays(_path, _pathLength - 1, newNodes, totalNewNodes);\\n }\\n\\n /**\\n * @notice Computes the trie root from a given path.\\n * @param _nodes Path to some k/v pair.\\n * @param _key Key for the k/v pair.\\n * @return _updatedRoot Root hash for the updated trie.\\n */\\n function _getUpdatedTrieRoot(\\n TrieNode[] memory _nodes,\\n bytes memory _key\\n )\\n private\\n pure\\n returns (\\n bytes32 _updatedRoot\\n )\\n {\\n bytes memory key = Lib_BytesUtils.toNibbles(_key);\\n\\n // Some variables to keep track of during iteration.\\n TrieNode memory currentNode;\\n NodeType currentNodeType;\\n bytes memory previousNodeHash;\\n\\n // Run through the path backwards to rebuild our root hash.\\n for (uint256 i = _nodes.length; i > 0; i--) {\\n // Pick out the current node.\\n currentNode = _nodes[i - 1];\\n currentNodeType = _getNodeType(currentNode);\\n\\n if (currentNodeType == NodeType.LeafNode) {\\n // Leaf nodes are already correctly encoded.\\n // Shift the key over to account for the nodes key.\\n bytes memory nodeKey = _getNodeKey(currentNode);\\n key = Lib_BytesUtils.slice(key, 0, key.length - nodeKey.length);\\n } else if (currentNodeType == NodeType.ExtensionNode) {\\n // Shift the key over to account for the nodes key.\\n bytes memory nodeKey = _getNodeKey(currentNode);\\n key = Lib_BytesUtils.slice(key, 0, key.length - nodeKey.length);\\n\\n // If this node is the last element in the path, it'll be correctly encoded\\n // and we can skip this part.\\n if (previousNodeHash.length > 0) {\\n // Re-encode the node based on the previous node.\\n currentNode = _makeExtensionNode(nodeKey, previousNodeHash);\\n }\\n } else if (currentNodeType == NodeType.BranchNode) {\\n // If this node is the last element in the path, it'll be correctly encoded\\n // and we can skip this part.\\n if (previousNodeHash.length > 0) {\\n // Re-encode the node based on the previous node.\\n uint8 branchKey = uint8(key[key.length - 1]);\\n key = Lib_BytesUtils.slice(key, 0, key.length - 1);\\n currentNode = _editBranchIndex(currentNode, branchKey, previousNodeHash);\\n }\\n }\\n\\n // Compute the node hash for the next iteration.\\n previousNodeHash = _getNodeHash(currentNode.encoded);\\n }\\n\\n // Current node should be the root at this point.\\n // Simply return the hash of its encoding.\\n return keccak256(currentNode.encoded);\\n }\\n\\n /**\\n * @notice Parses an RLP-encoded proof into something more useful.\\n * @param _proof RLP-encoded proof to parse.\\n * @return _parsed Proof parsed into easily accessible structs.\\n */\\n function _parseProof(\\n bytes memory _proof\\n )\\n private\\n pure\\n returns (\\n TrieNode[] memory _parsed\\n )\\n {\\n Lib_RLPReader.RLPItem[] memory nodes = Lib_RLPReader.readList(_proof);\\n TrieNode[] memory proof = new TrieNode[](nodes.length);\\n\\n for (uint256 i = 0; i < nodes.length; i++) {\\n bytes memory encoded = Lib_RLPReader.readBytes(nodes[i]);\\n proof[i] = TrieNode({\\n encoded: encoded,\\n decoded: Lib_RLPReader.readList(encoded)\\n });\\n }\\n\\n return proof;\\n }\\n\\n /**\\n * @notice Picks out the ID for a node. Node ID is referred to as the\\n * \\\"hash\\\" within the specification, but nodes < 32 bytes are not actually\\n * hashed.\\n * @param _node Node to pull an ID for.\\n * @return _nodeID ID for the node, depending on the size of its contents.\\n */\\n function _getNodeID(\\n Lib_RLPReader.RLPItem memory _node\\n )\\n private\\n pure\\n returns (\\n bytes32 _nodeID\\n )\\n {\\n bytes memory nodeID;\\n\\n if (_node.length < 32) {\\n // Nodes smaller than 32 bytes are RLP encoded.\\n nodeID = Lib_RLPReader.readRawBytes(_node);\\n } else {\\n // Nodes 32 bytes or larger are hashed.\\n nodeID = Lib_RLPReader.readBytes(_node);\\n }\\n\\n return Lib_BytesUtils.toBytes32(nodeID);\\n }\\n\\n /**\\n * @notice Gets the path for a leaf or extension node.\\n * @param _node Node to get a path for.\\n * @return _path Node path, converted to an array of nibbles.\\n */\\n function _getNodePath(\\n TrieNode memory _node\\n )\\n private\\n pure\\n returns (\\n bytes memory _path\\n )\\n {\\n return Lib_BytesUtils.toNibbles(Lib_RLPReader.readBytes(_node.decoded[0]));\\n }\\n\\n /**\\n * @notice Gets the key for a leaf or extension node. Keys are essentially\\n * just paths without any prefix.\\n * @param _node Node to get a key for.\\n * @return _key Node key, converted to an array of nibbles.\\n */\\n function _getNodeKey(\\n TrieNode memory _node\\n )\\n private\\n pure\\n returns (\\n bytes memory _key\\n )\\n {\\n return _removeHexPrefix(_getNodePath(_node));\\n }\\n\\n /**\\n * @notice Gets the path for a node.\\n * @param _node Node to get a value for.\\n * @return _value Node value, as hex bytes.\\n */\\n function _getNodeValue(\\n TrieNode memory _node\\n )\\n private\\n pure\\n returns (\\n bytes memory _value\\n )\\n {\\n return Lib_RLPReader.readBytes(_node.decoded[_node.decoded.length - 1]);\\n }\\n\\n /**\\n * @notice Computes the node hash for an encoded node. Nodes < 32 bytes\\n * are not hashed, all others are keccak256 hashed.\\n * @param _encoded Encoded node to hash.\\n * @return _hash Hash of the encoded node. Simply the input if < 32 bytes.\\n */\\n function _getNodeHash(\\n bytes memory _encoded\\n )\\n private\\n pure\\n returns (\\n bytes memory _hash\\n )\\n {\\n if (_encoded.length < 32) {\\n return _encoded;\\n } else {\\n return abi.encodePacked(keccak256(_encoded));\\n }\\n }\\n\\n /**\\n * @notice Determines the type for a given node.\\n * @param _node Node to determine a type for.\\n * @return _type Type of the node; BranchNode/ExtensionNode/LeafNode.\\n */\\n function _getNodeType(\\n TrieNode memory _node\\n )\\n private\\n pure\\n returns (\\n NodeType _type\\n )\\n {\\n if (_node.decoded.length == BRANCH_NODE_LENGTH) {\\n return NodeType.BranchNode;\\n } else if (_node.decoded.length == LEAF_OR_EXTENSION_NODE_LENGTH) {\\n bytes memory path = _getNodePath(_node);\\n uint8 prefix = uint8(path[0]);\\n\\n if (prefix == PREFIX_LEAF_EVEN || prefix == PREFIX_LEAF_ODD) {\\n return NodeType.LeafNode;\\n } else if (prefix == PREFIX_EXTENSION_EVEN || prefix == PREFIX_EXTENSION_ODD) {\\n return NodeType.ExtensionNode;\\n }\\n }\\n\\n revert(\\\"Invalid node type\\\");\\n }\\n\\n /**\\n * @notice Utility; determines the number of nibbles shared between two\\n * nibble arrays.\\n * @param _a First nibble array.\\n * @param _b Second nibble array.\\n * @return _shared Number of shared nibbles.\\n */\\n function _getSharedNibbleLength(\\n bytes memory _a,\\n bytes memory _b\\n )\\n private\\n pure\\n returns (\\n uint256 _shared\\n )\\n {\\n uint256 i = 0;\\n while (_a.length > i && _b.length > i && _a[i] == _b[i]) {\\n i++;\\n }\\n return i;\\n }\\n\\n /**\\n * @notice Utility; converts an RLP-encoded node into our nice struct.\\n * @param _raw RLP-encoded node to convert.\\n * @return _node Node as a TrieNode struct.\\n */\\n function _makeNode(\\n bytes[] memory _raw\\n )\\n private\\n pure\\n returns (\\n TrieNode memory _node\\n )\\n {\\n bytes memory encoded = Lib_RLPWriter.writeList(_raw);\\n\\n return TrieNode({\\n encoded: encoded,\\n decoded: Lib_RLPReader.readList(encoded)\\n });\\n }\\n\\n /**\\n * @notice Utility; converts an RLP-decoded node into our nice struct.\\n * @param _items RLP-decoded node to convert.\\n * @return _node Node as a TrieNode struct.\\n */\\n function _makeNode(\\n Lib_RLPReader.RLPItem[] memory _items\\n )\\n private\\n pure\\n returns (\\n TrieNode memory _node\\n )\\n {\\n bytes[] memory raw = new bytes[](_items.length);\\n for (uint256 i = 0; i < _items.length; i++) {\\n raw[i] = Lib_RLPReader.readRawBytes(_items[i]);\\n }\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Creates a new extension node.\\n * @param _key Key for the extension node, unprefixed.\\n * @param _value Value for the extension node.\\n * @return _node New extension node with the given k/v pair.\\n */\\n function _makeExtensionNode(\\n bytes memory _key,\\n bytes memory _value\\n )\\n private\\n pure\\n returns (\\n TrieNode memory _node\\n )\\n {\\n bytes[] memory raw = new bytes[](2);\\n bytes memory key = _addHexPrefix(_key, false);\\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\\n raw[1] = Lib_RLPWriter.writeBytes(_value);\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Creates a new leaf node.\\n * @dev This function is essentially identical to `_makeExtensionNode`.\\n * Although we could route both to a single method with a flag, it's\\n * more gas efficient to keep them separate and duplicate the logic.\\n * @param _key Key for the leaf node, unprefixed.\\n * @param _value Value for the leaf node.\\n * @return _node New leaf node with the given k/v pair.\\n */\\n function _makeLeafNode(\\n bytes memory _key,\\n bytes memory _value\\n )\\n private\\n pure\\n returns (\\n TrieNode memory _node\\n )\\n {\\n bytes[] memory raw = new bytes[](2);\\n bytes memory key = _addHexPrefix(_key, true);\\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\\n raw[1] = Lib_RLPWriter.writeBytes(_value);\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Creates an empty branch node.\\n * @return _node Empty branch node as a TrieNode struct.\\n */\\n function _makeEmptyBranchNode()\\n private\\n pure\\n returns (\\n TrieNode memory _node\\n )\\n {\\n bytes[] memory raw = new bytes[](BRANCH_NODE_LENGTH);\\n for (uint256 i = 0; i < raw.length; i++) {\\n raw[i] = RLP_NULL_BYTES;\\n }\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Modifies the value slot for a given branch.\\n * @param _branch Branch node to modify.\\n * @param _value Value to insert into the branch.\\n * @return _updatedNode Modified branch node.\\n */\\n function _editBranchValue(\\n TrieNode memory _branch,\\n bytes memory _value\\n )\\n private\\n pure\\n returns (\\n TrieNode memory _updatedNode\\n )\\n {\\n bytes memory encoded = Lib_RLPWriter.writeBytes(_value);\\n _branch.decoded[_branch.decoded.length - 1] = Lib_RLPReader.toRLPItem(encoded);\\n return _makeNode(_branch.decoded);\\n }\\n\\n /**\\n * @notice Modifies a slot at an index for a given branch.\\n * @param _branch Branch node to modify.\\n * @param _index Slot index to modify.\\n * @param _value Value to insert into the slot.\\n * @return _updatedNode Modified branch node.\\n */\\n function _editBranchIndex(\\n TrieNode memory _branch,\\n uint8 _index,\\n bytes memory _value\\n )\\n private\\n pure\\n returns (\\n TrieNode memory _updatedNode\\n )\\n {\\n bytes memory encoded = _value.length < 32 ? _value : Lib_RLPWriter.writeBytes(_value);\\n _branch.decoded[_index] = Lib_RLPReader.toRLPItem(encoded);\\n return _makeNode(_branch.decoded);\\n }\\n\\n /**\\n * @notice Utility; adds a prefix to a key.\\n * @param _key Key to prefix.\\n * @param _isLeaf Whether or not the key belongs to a leaf.\\n * @return _prefixedKey Prefixed key.\\n */\\n function _addHexPrefix(\\n bytes memory _key,\\n bool _isLeaf\\n )\\n private\\n pure\\n returns (\\n bytes memory _prefixedKey\\n )\\n {\\n uint8 prefix = _isLeaf ? uint8(0x02) : uint8(0x00);\\n uint8 offset = uint8(_key.length % 2);\\n bytes memory prefixed = new bytes(2 - offset);\\n prefixed[0] = bytes1(prefix + offset);\\n return abi.encodePacked(prefixed, _key);\\n }\\n\\n /**\\n * @notice Utility; removes a prefix from a path.\\n * @param _path Path to remove the prefix from.\\n * @return _unprefixedKey Unprefixed key.\\n */\\n function _removeHexPrefix(\\n bytes memory _path\\n )\\n private\\n pure\\n returns (\\n bytes memory _unprefixedKey\\n )\\n {\\n if (uint8(_path[0]) % 2 == 0) {\\n return Lib_BytesUtils.slice(_path, 2);\\n } else {\\n return Lib_BytesUtils.slice(_path, 1);\\n }\\n }\\n\\n /**\\n * @notice Utility; combines two node arrays. Array lengths are required\\n * because the actual lengths may be longer than the filled lengths.\\n * Array resizing is extremely costly and should be avoided.\\n * @param _a First array to join.\\n * @param _aLength Length of the first array.\\n * @param _b Second array to join.\\n * @param _bLength Length of the second array.\\n * @return _joined Combined node array.\\n */\\n function _joinNodeArrays(\\n TrieNode[] memory _a,\\n uint256 _aLength,\\n TrieNode[] memory _b,\\n uint256 _bLength\\n )\\n private\\n pure\\n returns (\\n TrieNode[] memory _joined\\n )\\n {\\n TrieNode[] memory ret = new TrieNode[](_aLength + _bLength);\\n\\n // Copy elements from the first array.\\n for (uint256 i = 0; i < _aLength; i++) {\\n ret[i] = _a[i];\\n }\\n\\n // Copy elements from the second array.\\n for (uint256 i = 0; i < _bLength; i++) {\\n ret[i + _aLength] = _b[i];\\n }\\n\\n return ret;\\n }\\n}\\n\",\"keccak256\":\"0x161f65220b8c5cf295232f8c58c2744fbc898bf77da5f9d9c5b2dd673dafc6f6\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/trie/Lib_SecureMerkleTrie.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_MerkleTrie } from \\\"./Lib_MerkleTrie.sol\\\";\\n\\n/**\\n * @title Lib_SecureMerkleTrie\\n */\\nlibrary Lib_SecureMerkleTrie {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * @notice Verifies a proof that a given key/value pair is present in the\\n * Merkle trie.\\n * @param _key Key of the node to search for, as a hex string.\\n * @param _value Value of the node to search for, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the desired node. Unlike\\n * traditional Merkle trees, this proof is executed top-down and consists\\n * of a list of RLP-encoded nodes that make a path down to the target node.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _verified `true` if the k/v pair exists in the trie, `false` otherwise.\\n */\\n function verifyInclusionProof(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bool _verified\\n )\\n {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.verifyInclusionProof(key, _value, _proof, _root);\\n }\\n\\n /**\\n * @notice Verifies a proof that a given key is *not* present in\\n * the Merkle trie.\\n * @param _key Key of the node to search for, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\\n * target node.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _verified `true` if the key is not present in the trie, `false` otherwise.\\n */\\n function verifyExclusionProof(\\n bytes memory _key,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bool _verified\\n )\\n {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.verifyExclusionProof(key, _proof, _root);\\n }\\n\\n /**\\n * @notice Updates a Merkle trie and returns a new root hash.\\n * @param _key Key of the node to update, as a hex string.\\n * @param _value Value of the node to update, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\\n * target node. If the key exists, we can simply update the value.\\n * Otherwise, we need to modify the trie to handle the new k/v pair.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _updatedRoot Root hash of the newly constructed trie.\\n */\\n function update(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bytes32 _updatedRoot\\n )\\n {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.update(key, _value, _proof, _root);\\n }\\n\\n /**\\n * @notice Retrieves the value associated with a given key.\\n * @param _key Key to search for, as hex bytes.\\n * @param _proof Merkle trie inclusion proof for the key.\\n * @param _root Known root of the Merkle trie.\\n * @return _exists Whether or not the key exists.\\n * @return _value Value of the key if it exists.\\n */\\n function get(\\n bytes memory _key,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bool _exists,\\n bytes memory _value\\n )\\n {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.get(key, _proof, _root);\\n }\\n\\n /**\\n * Computes the root hash for a trie with a single node.\\n * @param _key Key for the single node.\\n * @param _value Value for the single node.\\n * @return _updatedRoot Hash of the trie.\\n */\\n function getSingleNodeRootHash(\\n bytes memory _key,\\n bytes memory _value\\n )\\n internal\\n pure\\n returns (\\n bytes32 _updatedRoot\\n )\\n {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.getSingleNodeRootHash(key, _value);\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Computes the secure counterpart to a key.\\n * @param _key Key to get a secure key from.\\n * @return _secureKey Secure version of the key.\\n */\\n function _getSecureKey(\\n bytes memory _key\\n )\\n private\\n pure\\n returns (\\n bytes memory _secureKey\\n )\\n {\\n return abi.encodePacked(keccak256(_key));\\n }\\n}\",\"keccak256\":\"0x79355346f74bb1eb9eeb733cb5d9677d50115c4f390307cbf608fe071a1ada0c\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_Bytes32Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_Byte32Utils\\n */\\nlibrary Lib_Bytes32Utils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \\\"true.\\\"\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as a boolean.\\n */\\n function toBool(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return _in != 0;\\n }\\n\\n /**\\n * Converts a boolean to a bytes32 value.\\n * @param _in Input boolean value.\\n * @return Boolean as a bytes32.\\n */\\n function fromBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in ? 1 : 0));\\n }\\n\\n /**\\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as an address.\\n */\\n function toAddress(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return address(uint160(uint256(_in)));\\n }\\n\\n /**\\n * Converts an address to a bytes32.\\n * @param _in Input address value.\\n * @return Address as a bytes32.\\n */\\n function fromAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in));\\n }\\n\\n /**\\n * Removes the leading zeros from a bytes32 value and returns a new (smaller) bytes value.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 without any leading zeros.\\n */\\n function removeLeadingZeros(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out;\\n\\n assembly {\\n // Figure out how many leading zero bytes to remove.\\n let shift := 0\\n for { let i := 0 } and(lt(i, 32), eq(byte(i, _in), 0)) { i := add(i, 1) } {\\n shift := add(shift, 1)\\n }\\n\\n // Reserve some space for our output and fix the free memory pointer.\\n out := mload(0x40)\\n mstore(0x40, add(out, 0x40))\\n\\n // Shift the value and store it into the output bytes.\\n mstore(add(out, 0x20), shl(mul(shift, 8), _in))\\n\\n // Store the new size (with leading zero bytes removed) in the output byte size.\\n mstore(out, sub(32, shift))\\n }\\n\\n return out;\\n }\\n}\\n\",\"keccak256\":\"0xfa2def593e3fc56a31852c3744aefdaa93cec74e721bfcfeb1e5d166c7c60b64\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_BytesUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_BytesUtils\\n */\\nlibrary Lib_BytesUtils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_start + _length >= _start, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n if (_bytes.length - _start == 0) {\\n return bytes('');\\n }\\n\\n return slice(_bytes, _start, _bytes.length - _start);\\n }\\n\\n function toBytes32PadLeft(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n bytes32 ret;\\n uint256 len = _bytes.length <= 32 ? _bytes.length : 32;\\n assembly {\\n ret := shr(mul(sub(32, len), 8), mload(add(_bytes, 32)))\\n }\\n return ret;\\n }\\n\\n function toBytes32(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n if (_bytes.length < 32) {\\n bytes32 ret;\\n assembly {\\n ret := mload(add(_bytes, 32))\\n }\\n return ret;\\n }\\n\\n return abi.decode(_bytes,(bytes32)); // will truncate if input length > 32 bytes\\n }\\n\\n function toUint256(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return uint256(toBytes32(_bytes));\\n }\\n\\n function toUint24(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n uint24\\n )\\n {\\n require(_start + 3 >= _start, \\\"toUint24_overflow\\\");\\n require(_bytes.length >= _start + 3 , \\\"toUint24_outOfBounds\\\");\\n uint24 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x3), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toUint8(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n uint8\\n )\\n {\\n require(_start + 1 >= _start, \\\"toUint8_overflow\\\");\\n require(_bytes.length >= _start + 1 , \\\"toUint8_outOfBounds\\\");\\n uint8 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x1), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toAddress(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n require(_start + 20 >= _start, \\\"toAddress_overflow\\\");\\n require(_bytes.length >= _start + 20, \\\"toAddress_outOfBounds\\\");\\n address tempAddress;\\n\\n assembly {\\n tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000)\\n }\\n\\n return tempAddress;\\n }\\n\\n function toNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory nibbles = new bytes(_bytes.length * 2);\\n\\n for (uint256 i = 0; i < _bytes.length; i++) {\\n nibbles[i * 2] = _bytes[i] >> 4;\\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\\n }\\n\\n return nibbles;\\n }\\n\\n function fromNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory ret = new bytes(_bytes.length / 2);\\n\\n for (uint256 i = 0; i < ret.length; i++) {\\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\\n }\\n\\n return ret;\\n }\\n\\n function equal(\\n bytes memory _bytes,\\n bytes memory _other\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return keccak256(_bytes) == keccak256(_other);\\n }\\n}\\n\",\"keccak256\":\"0xa5195afe32fb2cf104d156e8f4bd39df1ec79bf6ba232097b9e8e0ee14fbc298\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_EthUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// @unsupported: ovm\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"./Lib_Bytes32Utils.sol\\\";\\n\\n/**\\n * @title Lib_EthUtils\\n */\\nlibrary Lib_EthUtils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Gets the code for a given address.\\n * @param _address Address to get code for.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Code read from the contract.\\n */\\n function getCode(\\n address _address,\\n uint256 _offset,\\n uint256 _length\\n )\\n internal\\n view\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory code;\\n assembly {\\n code := mload(0x40)\\n mstore(0x40, add(code, add(_length, 0x20)))\\n mstore(code, _length)\\n extcodecopy(_address, add(code, 0x20), _offset, _length)\\n }\\n\\n return code;\\n }\\n\\n /**\\n * Gets the full code for a given address.\\n * @param _address Address to get code for.\\n * @return Full code of the contract.\\n */\\n function getCode(\\n address _address\\n )\\n internal\\n view\\n returns (\\n bytes memory\\n )\\n {\\n return getCode(\\n _address,\\n 0,\\n getCodeSize(_address)\\n );\\n }\\n\\n /**\\n * Gets the size of a contract's code in bytes.\\n * @param _address Address to get code size for.\\n * @return Size of the contract's code in bytes.\\n */\\n function getCodeSize(\\n address _address\\n )\\n internal\\n view\\n returns (\\n uint256\\n )\\n {\\n uint256 codeSize;\\n assembly {\\n codeSize := extcodesize(_address)\\n }\\n\\n return codeSize;\\n }\\n\\n /**\\n * Gets the hash of a contract's code.\\n * @param _address Address to get a code hash for.\\n * @return Hash of the contract's code.\\n */\\n function getCodeHash(\\n address _address\\n )\\n internal\\n view\\n returns (\\n bytes32\\n )\\n {\\n bytes32 codeHash;\\n assembly {\\n codeHash := extcodehash(_address)\\n }\\n\\n return codeHash;\\n }\\n\\n /**\\n * Creates a contract with some given initialization code.\\n * @param _code Contract initialization code.\\n * @return Address of the created contract.\\n */\\n function createContract(\\n bytes memory _code\\n )\\n internal\\n returns (\\n address\\n )\\n {\\n address created;\\n assembly {\\n created := create(\\n 0,\\n add(_code, 0x20),\\n mload(_code)\\n )\\n }\\n\\n return created;\\n }\\n\\n /**\\n * Computes the address that would be generated by CREATE.\\n * @param _creator Address creating the contract.\\n * @param _nonce Creator's nonce.\\n * @return Address to be generated by CREATE.\\n */\\n function getAddressForCREATE(\\n address _creator,\\n uint256 _nonce\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n bytes[] memory encoded = new bytes[](2);\\n encoded[0] = Lib_RLPWriter.writeAddress(_creator);\\n encoded[1] = Lib_RLPWriter.writeUint(_nonce);\\n\\n bytes memory encodedList = Lib_RLPWriter.writeList(encoded);\\n return Lib_Bytes32Utils.toAddress(keccak256(encodedList));\\n }\\n\\n /**\\n * Computes the address that would be generated by CREATE2.\\n * @param _creator Address creating the contract.\\n * @param _bytecode Bytecode of the contract to be created.\\n * @param _salt 32 byte salt value mixed into the hash.\\n * @return Address to be generated by CREATE2.\\n */\\n function getAddressForCREATE2(\\n address _creator,\\n bytes memory _bytecode,\\n bytes32 _salt\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n bytes32 hashedData = keccak256(abi.encodePacked(\\n byte(0xff),\\n _creator,\\n _salt,\\n keccak256(_bytecode)\\n ));\\n\\n return Lib_Bytes32Utils.toAddress(hashedData);\\n }\\n}\\n\",\"keccak256\":\"0xf29a67d78e61cb472d524b779b32cfcb39a587f4096500d5419e6425ed367d49\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x608060405234801561001057600080fd5b506040516149b93803806149b98339818101604052602081101561003357600080fd5b5051600080546001600160a01b039092166001600160a01b0319909216919091179055614954806100656000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c806322d1470214610046578063299ca4781461009a578063461a4478146100a2575b600080fd5b61007e6004803603608081101561005c57600080fd5b506001600160a01b038135169060208101359060408101359060600135610148565b604080516001600160a01b039092168252519081900360200190f35b61007e610229565b61007e600480360360208110156100b857600080fd5b8101906020810181356401000000008111156100d357600080fd5b8201836020820111156100e557600080fd5b8035906020019184600183028401116401000000008311171561010757600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610238945050505050565b600061017c6040518060400160405280601181526020017027ab26afa33930bab22b32b934b334b2b960791b815250610238565b6001600160a01b0316336001600160a01b0316146101cb5760405162461bcd60e51b81526004018080602001828103825260318152602001806148ee6031913960400191505060405180910390fd5b848484846040516101db90610314565b80856001600160a01b03168152602001848152602001838152602001828152602001945050505050604051809103906000f08015801561021f573d6000803e3d6000fd5b5095945050505050565b6000546001600160a01b031681565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b83811015610298578181015183820152602001610280565b50505050905090810190601f1680156102c55780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b1580156102e257600080fd5b505afa1580156102f6573d6000803e3d6000fd5b505050506040513d602081101561030c57600080fd5b505192915050565b6145cc806103228339019056fe60806040523480156200001157600080fd5b50604051620045cc380380620045cc833981016040819052620000349162000232565b600080546001600160a01b0319166001600160a01b038616179055600583905560028290556003829055600681905560408051808201909152601781527f4f564d5f53746174654d616e61676572466163746f72790000000000000000006020820152620000a29062000150565b6001600160a01b0316639ed93318306040518263ffffffff1660e01b8152600401620000cf919062000299565b602060405180830381600087803b158015620000ea57600080fd5b505af1158015620000ff573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000125919062000273565b600180546001600160a01b0319166001600160a01b039290921691909117905550620002c692505050565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b83811015620001b257818101518382015260200162000198565b50505050905090810190601f168015620001e05780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b158015620001fe57600080fd5b505afa15801562000213573d6000803e3d6000fd5b505050506040513d60208110156200022a57600080fd5b505192915050565b6000806000806080858703121562000248578384fd5b84516200025581620002ad565b60208601516040870151606090970151919890975090945092505050565b60006020828403121562000285578081fd5b81516200029281620002ad565b9392505050565b6001600160a01b0391909116815260200190565b6001600160a01b0381168114620002c357600080fd5b50565b6142f680620002d66000396000f3fe608060405234801561001057600080fd5b50600436106100cf5760003560e01c8063845fe7a31161008c578063b2fa1c9e11610066578063b2fa1c9e14610185578063b52805711461019a578063b9194310146101a2578063c1c618b8146101b5576100cf565b8063845fe7a314610155578063a244316a14610168578063b1c9fe6e14610170576100cf565b8063299ca478146100d45780632e1ac36c146100f25780632eb1375814610107578063461a44781461011a578063732f960b1461012d578063805e9d3014610140575b600080fd5b6100dc6101bd565b6040516100e99190613c74565b60405180910390f35b6101056101003660046138d0565b6101cc565b005b610105610115366004613910565b610565565b6100dc6101283660046139f8565b6108a1565b61010561013b366004613abc565b61097f565b610148610c6f565b6040516100e99190613bcd565b6101056101633660046138d0565b610c75565b610105610fa1565b610178611128565b6040516100e99190613d26565b61018d611131565b6040516100e99190613d1b565b6100dc61114c565b6101056101b0366004613871565b61115b565b610148611475565b6000546001600160a01b031681565b60018060045460ff1660028111156101e057fe5b146102065760405162461bcd60e51b81526004016101fd90614077565b60405180910390fd5b60025460065460005a6001546040516363b285f960e11b81529192506001600160a01b03169063c7650bf290610242908a908a90600401613c88565b602060405180830381600087803b15801561025c57600080fd5b505af1158015610270573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610294919061395d565b15156001146102b55760405162461bcd60e51b81526004016101fd90613e22565b60015460405163fbcbc0f160e01b81526000916001600160a01b03169063fbcbc0f1906102e6908b90600401613c74565b60c06040518083038186803b1580156102fe57600080fd5b505afa158015610312573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103369190613a3d565b600154604051631aaf392f60e01b81529192506000916001600160a01b0390911690631aaf392f9061036e908c908c90600401613c88565b60206040518083038186803b15801561038657600080fd5b505afa15801561039a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103be9190613977565b90506103ff886040516020016103d49190613bcd565b6040516020818303038152906040526103f46103ef8461147b565b6114c4565b89856040015161152e565b6040808401919091526001549051638f3b964760e01b81526001600160a01b0390911690638f3b964790610439908c908690600401613cc2565b600060405180830381600087803b15801561045357600080fd5b505af1158015610467573d6000803e3d6000fd5b505050507f3e3ed1a676a2754a041b49bf752e0f167c8753495e36c320fe01d1ef7476253c898960405161049c929190613c88565b60405180910390a1505060005a820390506104dd6040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506108a1565b6001600160a01b0316631e16e92f858533856040518563ffffffff1660e01b815260040180858152602001848152602001836001600160a01b03168152602001828152602001945050505050600060405180830381600087803b15801561054357600080fd5b505af1158015610557573d6000803e3d6000fd5b505050505050505050505050565b60018060045460ff16600281111561057957fe5b146105965760405162461bcd60e51b81526004016101fd90614077565b60025460065460005a9050600160009054906101000a90046001600160a01b03166001600160a01b03166399056ba96040518163ffffffff1660e01b815260040160206040518083038186803b1580156105ef57600080fd5b505afa158015610603573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106279190613977565b156106445760405162461bcd60e51b81526004016101fd90613f03565b600154604051630b38106960e11b81526001600160a01b039091169063167020d290610674908990600401613c74565b602060405180830381600087803b15801561068e57600080fd5b505af11580156106a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106c6919061395d565b15156001146106e75760405162461bcd60e51b81526004016101fd90613fbd565b60015460405163fbcbc0f160e01b81526000916001600160a01b03169063fbcbc0f190610718908a90600401613c74565b60c06040518083038186803b15801561073057600080fd5b505afa158015610744573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107689190613a3d565b90506107a78760405160200161077e9190613bb0565b60405160208183030381529060405261079e61079984611554565b611594565b8860035461152e565b6003556040517fcec9ef675d775706a02b43afe48af52c5019bc50f99582e3208c6ff55d59c008906107da908990613c74565b60405180910390a15060005a8203905061081a6040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506108a1565b6001600160a01b0316631e16e92f858533856040518563ffffffff1660e01b815260040180858152602001848152602001836001600160a01b03168152602001828152602001945050505050600060405180830381600087803b15801561088057600080fd5b505af1158015610894573d6000803e3d6000fd5b5050505050505050505050565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b838110156109015781810151838201526020016108e9565b50505050905090810190601f16801561092e5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561094b57600080fd5b505afa15801561095f573d6000803e3d6000fd5b505050506040513d602081101561097557600080fd5b505190505b919050565b60008060045460ff16600281111561099357fe5b146109b05760405162461bcd60e51b81526004016101fd90614077565b60025460065460005a90506006546109c78661169d565b146109e45760405162461bcd60e51b81526004016101fd906140c8565b6103e88560a0015161040802816109f757fe5b04620186a0015a1015610a1c5760405162461bcd60e51b81526004016101fd90613f60565b6000610a536040518060400160405280601481526020017327ab26afa2bc32b1baba34b7b726b0b730b3b2b960611b8152506108a1565b600154604051631381ba4d60e01b81529192506001600160a01b031690631381ba4d90610a84908490600401613c74565b600060405180830381600087803b158015610a9e57600080fd5b505af1158015610ab2573d6000803e3d6000fd5b5050600154604051639be3ad6760e01b81526001600160a01b038086169450639be3ad679350610ae9928b9291169060040161415c565b600060405180830381600087803b158015610b0357600080fd5b505af1158015610b17573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610b3f919081019061398f565b50600154604051631381ba4d60e01b81526001600160a01b0390911690631381ba4d90610b7190600090600401613c74565b600060405180830381600087803b158015610b8b57600080fd5b505af1158015610b9f573d6000803e3d6000fd5b50506004805460ff191660011790555060009150505a82039050610be96040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506108a1565b6001600160a01b0316631e16e92f858533856040518563ffffffff1660e01b815260040180858152602001848152602001836001600160a01b03168152602001828152602001945050505050600060405180830381600087803b158015610c4f57600080fd5b505af1158015610c63573d6000803e3d6000fd5b50505050505050505050565b60025490565b60008060045460ff166002811115610c8957fe5b14610ca65760405162461bcd60e51b81526004016101fd90614077565b60025460065460005a600154604051630ad2267960e01b81529192506001600160a01b031690630ad2267990610ce2908a908a90600401613c88565b60206040518083038186803b158015610cfa57600080fd5b505afa158015610d0e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d32919061395d565b15610d4f5760405162461bcd60e51b81526004016101fd90613d3a565b60015460405163c8e40fbf60e01b81526001600160a01b039091169063c8e40fbf90610d7f908a90600401613c74565b60206040518083038186803b158015610d9757600080fd5b505afa158015610dab573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dcf919061395d565b1515600114610df05760405162461bcd60e51b81526004016101fd906140ff565b60015460405163136e2d8960e11b81526000916001600160a01b0316906326dc5b1290610e21908b90600401613c74565b60206040518083038186803b158015610e3957600080fd5b505afa158015610e4d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e719190613977565b905060007f56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421821415610ea557506000610f02565b600080610ed28a604051602001610ebc9190613bcd565b6040516020818303038152906040528a866116b6565b909250905060018215151415610efa57610ef3610eee826116df565b6116f2565b9250610eff565b600092505b50505b600154604051635c17d62960e01b81526001600160a01b0390911690635c17d62990610f36908c908c908690600401613ca1565b600060405180830381600087803b158015610f5057600080fd5b505af1158015610f64573d6000803e3d6000fd5b50505050505060005a820390506104dd6040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506108a1565b60018060045460ff166002811115610fb557fe5b14610fd25760405162461bcd60e51b81526004016101fd90614077565b600160009054906101000a90046001600160a01b03166001600160a01b031663d7bd4a2a6040518163ffffffff1660e01b815260040160206040518083038186803b15801561102057600080fd5b505afa158015611034573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110589190613977565b156110755760405162461bcd60e51b81526004016101fd90613dc5565b600160009054906101000a90046001600160a01b03166001600160a01b03166399056ba96040518163ffffffff1660e01b815260040160206040518083038186803b1580156110c357600080fd5b505afa1580156110d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110fb9190613977565b156111185760405162461bcd60e51b81526004016101fd9061401a565b506004805460ff19166002179055565b60045460ff1681565b6000600260045460ff16600281111561114657fe5b14905090565b6001546001600160a01b031681565b60008060045460ff16600281111561116f57fe5b1461118c5760405162461bcd60e51b81526004016101fd90614077565b60025460065460005a60015460405163c8e40fbf60e01b81529192506001600160a01b03169063c8e40fbf906111c6908a90600401613c74565b60206040518083038186803b1580156111de57600080fd5b505afa1580156111f2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611216919061395d565b1580156112a057506001546040516307a1294560e01b81526001600160a01b03909116906307a129459061124e908a90600401613c74565b60206040518083038186803b15801561126657600080fd5b505afa15801561127a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061129e919061395d565b155b6112bc5760405162461bcd60e51b81526004016101fd90613d7f565b6000806112eb896040516020016112d39190613bb0565b604051602081830303815290604052886002546116b6565b90925090506001821515141561140c57600061130682611721565b606081015190915089907fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470141561133f5750600061136a565b816060015161134d826117b3565b1461136a5760405162461bcd60e51b81526004016101fd90613e80565b6001546040805160c08101825284518152602080860151908201528482015181830152606080860151908201526001600160a01b038481166080830152600060a08301529151638f3b964760e01b81529190921691638f3b9647916113d3918f91600401613cc2565b600060405180830381600087803b1580156113ed57600080fd5b505af1158015611401573d6000803e3d6000fd5b50505050505061143c565b600154604051630d631c9d60e31b81526001600160a01b0390911690636b18e4e890610f36908c90600401613c74565b505060005a820390506104dd6040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506108a1565b60035490565b6060806000805b6020811085821a15161561149c5760019182019101611482565b5060405191506040820160405283600882021b60208301528060200382525080915050919050565b606080825160011480156114ec57506080836000815181106114e257fe5b016020015160f81c105b156114f8575081611528565b611504835160806117b7565b83604051602001611516929190613bd6565b60405160208183030381529060405290505b92915050565b60008061153a86611906565b905061154881868686611936565b9150505b949350505050565b61155c61378f565b604051806080016040528083600001518152602001836020015181526020018360400151815260200183606001518152509050919050565b60408051600480825260a0820190925260609160009190816020015b60608152602001906001900390816115b057505083519091506115d6906103ef9061147b565b816000815181106115e357fe5b60200260200101819052506116016103ef846020015160001b61147b565b8160018151811061160e57fe5b602002602001018190525061164583604001516040516020016116319190613bcd565b6040516020818303038152906040526114c4565b8160028151811061165257fe5b602002602001018190525061167583606001516040516020016116319190613bcd565b8160038151811061168257fe5b6020026020010181905250611696816119d1565b9392505050565b60006116a882611a15565b805190602001209050919050565b6000606060006116c586611906565b90506116d2818686611a50565b9250925050935093915050565b60606115286116ed83611b23565b611b48565b600080600060208451111561170857602061170b565b83515b6020858101519190036008021c92505050919050565b61172961378f565b600061173483611bd7565b9050604051806080016040528061175e8360008151811061175157fe5b6020026020010151611bea565b81526020016117738360018151811061175157fe5b81526020016117958360028151811061178857fe5b6020026020010151611bf1565b81526020016117aa8360038151811061178857fe5b90529392505050565b3f90565b6060806038841015611811576040805160018082528183019092529060208201818036833701905050905082840160f81b816000815181106117f557fe5b60200101906001600160f81b031916908160001a905350611696565b600060015b80868161181f57fe5b04156118345760019091019061010002611816565b816001016001600160401b038111801561184d57600080fd5b506040519080825280601f01601f191660200182016040528015611878576020820181803683370190505b50925084820160370160f81b8360008151811061189157fe5b60200101906001600160f81b031916908160001a905350600190505b8181116118fd576101008183036101000a87816118c657fe5b04816118ce57fe5b0660f81b8382815181106118de57fe5b60200101906001600160f81b031916908160001a9053506001016118ad565b50509392505050565b606081805190602001206040516020016119209190613bcd565b6040516020818303038152906040529050919050565b6040805180820190915260018152600160ff1b60209091015260007f56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42182141561198a576119838585611ceb565b905061154c565b600061199584611d0f565b90506000806119a5838987611de5565b509150915060006119b88484848b612188565b90506119c4818a6124a0565b9998505050505050505050565b606060006119de836125f9565b90506119ec815160c06117b7565b816040516020016119fe929190613bd6565b604051602081830303815290604052915050919050565b6060816000015182602001518360400151846060015185608001518660a001518760c001516040516020016119209796959493929190613c05565b600060606000611a5f85611d0f565b90506000806000611a71848a89611de5565b81519295509093509150158080611a855750815b611ad6576040805162461bcd60e51b815260206004820152601a60248201527f50726f76696465642070726f6f6620697320696e76616c69642e000000000000604482015290519081900360640190fd5b600081611af25760405180602001604052806000815250611b11565b611b11866001870381518110611b0457fe5b6020026020010151612702565b919b919a509098505050505050505050565b611b2b6137b6565b506040805180820190915281518152602082810190820152919050565b60606000806000611b588561271e565b919450925090506000816001811115611b6d57fe5b14611bbf576040805162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c502062797465732076616c75652e0000000000000000604482015290519081900360640190fd5b611bce85602001518484612a47565b95945050505050565b6060611528611be583611b23565b612af4565b6000611528825b6000602182600001511115611c4d576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e000000000000604482015290519081900360640190fd5b6000806000611c5b8561271e565b919450925090506000816001811115611c7057fe5b14611cc2576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e000000000000604482015290519081900360640190fd5b602080860151840180519091841015611ce15760208490036101000a90045b9695505050505050565b6000611cff611cf984612c6a565b83612d66565b5180516020909101209392505050565b60606000611d1c83611bd7565b9050600081516001600160401b0381118015611d3757600080fd5b50604051908082528060200260200182016040528015611d7157816020015b611d5e6137d0565b815260200190600190039081611d565790505b50905060005b8251811015611ddd576000611d9e848381518110611d9157fe5b6020026020010151611b48565b90506040518060400160405280828152602001611dba83611bd7565b815250838381518110611dc957fe5b602090810291909101015250600101611d77565b509392505050565b60006060818080611df587612c6a565b905085600080611e036137d0565b60005b8c51811015612160578c8181518110611e1b57fe5b6020026020010151915082840193506001870196508360001415611e8f57815180516020909101208514611e8a576040805162461bcd60e51b8152602060048201526011602482015270092dcecc2d8d2c840e4dedee840d0c2e6d607b1b604482015290519081900360640190fd5b611f56565b815151602011611ef657815180516020909101208514611e8a576040805162461bcd60e51b815260206004820152601b60248201527f496e76616c6964206c6172676520696e7465726e616c20686173680000000000604482015290519081900360640190fd5b84611f048360000151612dfa565b14611f56576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420696e7465726e616c206e6f64652068617368000000000000604482015290519081900360640190fd5b60208201515160111415611fc5578551841415611f7257612160565b6000868581518110611f8057fe5b602001015160f81c60f81b60f81c9050600083602001518260ff1681518110611fa557fe5b60200260200101519050611fb881612e26565b9650600194505050612158565b6002826020015151141561210b576000611fde83612e5c565b9050600081600081518110611fef57fe5b016020015160f81c905060018116600203600061200f8460ff8416612e7a565b9050600061201d8b8a612e7a565b9050600061202b8383612eab565b905060ff851660021480612042575060ff85166003145b15612074578083511480156120575750808251145b1561206157988901985b50600160ff1b9950612160945050505050565b60ff85161580612087575060ff85166001145b156120d457806120a45750600160ff1b9950612160945050505050565b6120c588602001516001815181106120b857fe5b6020026020010151612e26565b9a509750612158945050505050565b60405162461bcd60e51b815260040180806020018281038252602681526020018061429b6026913960400191505060405180910390fd5b6040805162461bcd60e51b815260206004820152601d60248201527f526563656976656420616e20756e706172736561626c65206e6f64652e000000604482015290519081900360640190fd5b600101611e06565b50600160ff1b8414866121738786612e7a565b909e909d50909b509950505050505050505050565b6060600083905060008660018703815181106121a057fe5b6020026020010151905060006121b582612f11565b6040805160038082526080820190925291925060009190816020015b6121d96137d0565b8152602001906001900390816121d157905050905060008451600014801561220c5750600283600281111561220a57fe5b145b156122425761222361221d85612fe7565b88612d66565b82828151811061222f57fe5b6020908102919091010152600101612483565b600083600281111561225057fe5b14156122b6578451612285576122668488612ffa565b82828151811061227257fe5b60209081029190910101526001016122b1565b8382828151811061229257fe5b602002602001018190525060018101905061222361221d866001612e7a565b612483565b60006122c185612fe7565b905060006122cf8288612eab565b905080156123305760006122e583600084613045565b90506122f9816122f48c613195565b6131d6565b85858151811061230557fe5b60200260200101819052506001840193506123208383612e7a565b925061232c8883612e7a565b9750505b600061233a61321a565b905082516000141561235f576123588161235389612702565b612ffa565b90506123f7565b60008360008151811061236e57fe5b016020015160f81c9050612383846001612e7a565b9350600287600281111561239357fe5b14156123ce5760006123ad856123a88b612702565b612d66565b90506123c683836123c18460000151613195565b6132a7565b9250506123f5565b8351156123e45760006123ad856122f48b612702565b6123f282826123c18b612702565b91505b505b875161242c57612407818b612ffa565b90508085858151811061241657fe5b602002602001018190525060018401935061247f565b612437886001612e7a565b97508085858151811061244657fe5b6020026020010181905250600184019350612461888b612d66565b85858151811061246d57fe5b60200260200101819052506001840193505b5050505b6124928a60018b038484613300565b9a9950505050505050505050565b6000806124ac83612c6a565b90506124b66137d0565b84516000906060905b80156125e4578760018203815181106124d457fe5b602002602001015193506124e784612f11565b925060028360028111156124f757fe5b141561252257600061250885612fe7565b905061251a8660008351895103613045565b9550506125ce565b600183600281111561253057fe5b141561257057600061254185612fe7565b90506125538660008351895103613045565b83519096501561256a5761256781846131d6565b94505b506125ce565b600083600281111561257e57fe5b14156125ce578151156125ce5760008560018751038151811061259d57fe5b602001015160f81c60f81b60f81c90506125bd8660006001895103613045565b95506125ca8582856132a7565b9450505b83516125d990613195565b9150600019016124bf565b50509051805160209091012095945050505050565b606081516000141561261a575060408051600081526020810190915261097a565b6000805b835181101561264d5783818151811061263357fe5b60200260200101515182019150808060010191505061261e565b6000826001600160401b038111801561266557600080fd5b506040519080825280601f01601f191660200182016040528015612690576020820181803683370190505b50600092509050602081015b85518310156126f95760008684815181106126b357fe5b6020026020010151905060006020820190506126d1838284516133e2565b8785815181106126dd57fe5b602002602001015151830192505050828060010193505061269c565b50949350505050565b60208101518051606091611528916000198101908110611d9157fe5b60008060008084600001511161277b576040805162461bcd60e51b815260206004820152601860248201527f524c50206974656d2063616e6e6f74206265206e756c6c2e0000000000000000604482015290519081900360640190fd5b6020840151805160001a607f81116127a0576000600160009450945094505050612a40565b60b78111612815578551607f198201908110612803576040805162461bcd60e51b815260206004820152601960248201527f496e76616c696420524c502073686f727420737472696e672e00000000000000604482015290519081900360640190fd5b60019550935060009250612a40915050565b60bf81116128f957855160b6198201908110612878576040805162461bcd60e51b815260206004820152601f60248201527f496e76616c696420524c50206c6f6e6720737472696e67206c656e6774682e00604482015290519081900360640190fd5b6000816020036101000a60018501510490508082018860000151116128e4576040805162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c50206c6f6e6720737472696e672e0000000000000000604482015290519081900360640190fd5b60019091019550935060009250612a40915050565b60f7811161296d57855160bf19820190811061295c576040805162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c502073686f7274206c6973742e000000000000000000604482015290519081900360640190fd5b600195509350849250612a40915050565b855160f61982019081106129c8576040805162461bcd60e51b815260206004820152601d60248201527f496e76616c696420524c50206c6f6e67206c697374206c656e6774682e000000604482015290519081900360640190fd5b6000816020036101000a6001850151049050808201886000015111612a2d576040805162461bcd60e51b815260206004820152601660248201527524b73b30b634b210292628103637b733903634b9ba1760511b604482015290519081900360640190fd5b6001918201965094509250612a40915050565b9193909250565b60606000826001600160401b0381118015612a6157600080fd5b506040519080825280601f01601f191660200182016040528015612a8c576020820181803683370190505b509050805160001415612aa0579050611696565b8484016020820160005b60208604811015612acb578251825260209283019290910190600101612aaa565b5080519151601f959095166020036101000a600019019182169119909416179092525092915050565b6060600080612b028461271e565b91935090915060019050816001811115612b1857fe5b14612b6a576040805162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c50206c6973742076616c75652e000000000000000000604482015290519081900360640190fd5b6040805160208082526104208201909252600091816020015b612b8b6137b6565b815260200190600190039081612b835790505090506000835b8651811015612c5f5760208210612bec5760405162461bcd60e51b815260040180806020018281038252602a815260200180614271602a913960400191505060405180910390fd5b600080612c186040518060400160405280858c60000151038152602001858c602001510181525061271e565b509150915060405180604001604052808383018152602001848b6020015101815250858581518110612c4657fe5b6020908102919091010152600193909301920101612ba4565b508152949350505050565b6060600082516002026001600160401b0381118015612c8857600080fd5b506040519080825280601f01601f191660200182016040528015612cb3576020820181803683370190505b50905060005b8351811015612d5f576004848281518110612cd057fe5b602001015160f81c60f81b6001600160f81b031916901c828260020281518110612cf657fe5b60200101906001600160f81b031916908160001a9053506010848281518110612d1b57fe5b016020015160f81c81612d2a57fe5b0660f81b828260020260010181518110612d4057fe5b60200101906001600160f81b031916908160001a905350600101612cb9565b5092915050565b612d6e6137d0565b60408051600280825260608201909252600091816020015b6060815260200190600190039081612d865790505090506000612daa856001613426565b9050612db86103ef8261357d565b82600081518110612dc557fe5b6020026020010181905250612dd9846114c4565b82600181518110612de657fe5b6020026020010181905250611bce8261364d565b6000602082511015612e115750602081015161097a565b81806020019051602081101561097557600080fd5b60006060602083600001511015612e4757612e408361367c565b9050612e53565b612e5083611b48565b90505b61169681612dfa565b6060611528612e758360200151600081518110611d9157fe5b612c6a565b60608183510360001415612e9d5750604080516020810190915260008152611528565b611696838384865103613045565b6000805b808451118015612ebf5750808351115b8015612f045750828181518110612ed257fe5b602001015160f81c60f81b6001600160f81b031916848281518110612ef357fe5b01602001516001600160f81b031916145b1561169657600101612eaf565b60208101515160009060111415612f2a5750600061097a565b60028260200151511415612fa6576000612f4383612e5c565b9050600081600081518110612f5457fe5b016020015160f81c90506002811480612f70575060ff81166003145b15612f805760029250505061097a565b60ff81161580612f93575060ff81166001145b15612fa35760019250505061097a565b50505b6040805162461bcd60e51b8152602060048201526011602482015270496e76616c6964206e6f6465207479706560781b604482015290519081900360640190fd5b6060611528612ff583612e5c565b613687565b6130026137d0565b600061300d836114c4565b905061301881611b23565b60208501518051600019810190811061302d57fe5b602002602001018190525061154c84602001516136d0565b60608182601f011015613090576040805162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b604482015290519081900360640190fd5b8282840110156130d8576040805162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b604482015290519081900360640190fd5b81830184511015613124576040805162461bcd60e51b8152602060048201526011602482015270736c6963655f6f75744f66426f756e647360781b604482015290519081900360640190fd5b60608215801561314357604051915060008252602082016040526126f9565b6040519150601f8416801560200281840101858101878315602002848b0101015b8183101561317c578051835260209283019201613164565b5050858452601f01601f19166040525050949350505050565b60606020825110156131a857508061097a565b818051906020012060405160200180828152602001915050604051602081830303815290604052905061097a565b6131de6137d0565b60408051600280825260608201909252600091816020015b60608152602001906001900390816131f65790505090506000612daa856000613426565b6132226137d0565b6040805160118082526102408201909252600091816020015b606081526020019060019003908161323b57905050905060005b815181101561329757604051806040016040528060018152602001600160ff1b81525082828151811061328457fe5b6020908102919091010152600101613255565b506132a18161364d565b91505090565b6132af6137d0565b600060208351106132c8576132c3836114c4565b6132ca565b825b90506132d581611b23565b85602001518560ff16815181106132e857fe5b6020026020010181905250611bce85602001516136d0565b606060008285016001600160401b038111801561331c57600080fd5b5060405190808252806020026020018201604052801561335657816020015b6133436137d0565b81526020019060019003908161333b5790505b50905060005b858110156133975786818151811061337057fe5b602002602001015182828151811061338457fe5b602090810291909101015260010161335c565b5060005b838110156133d8578481815181106133af57fe5b602002602001015182878301815181106133c557fe5b602090810291909101015260010161339b565b5095945050505050565b8282825b60208110613405578151835260209283019290910190601f19016133e6565b905182516020929092036101000a6000190180199091169116179052505050565b6060600082613436576000613439565b60025b90506000600285518161344857fe5b06905060008160020360ff166001600160401b038111801561346957600080fd5b506040519080825280601f01601f191660200182016040528015613494576020820181803683370190505b50905081830160f81b816000815181106134aa57fe5b60200101906001600160f81b031916908160001a90535080866040516020018083805190602001908083835b602083106134f55780518252601f1990920191602091820191016134d6565b51815160209384036101000a600019018019909216911617905285519190930192850191508083835b6020831061353d5780518252601f19909201916020918201910161351e565b6001836020036101000a03801982511681845116808217855250505050505090500192505050604051602081830303815290604052935050505092915050565b60606000600283518161358c57fe5b046001600160401b03811180156135a257600080fd5b506040519080825280601f01601f1916602001820160405280156135cd576020820181803683370190505b50905060005b8151811015612d5f578381600202600101815181106135ee57fe5b602001015160f81c60f81b600485836002028151811061360a57fe5b602001015160f81c60f81b6001600160f81b031916901b1782828151811061362e57fe5b60200101906001600160f81b031916908160001a9053506001016135d3565b6136556137d0565b6000613660836119d1565b905060405180604001604052808281526020016117aa83611bd7565b606061152882613779565b606060028260008151811061369857fe5b016020015160f81c816136a757fe5b0660ff16600014156136c5576136be826002612e7a565b905061097a565b6136be826001612e7a565b6136d86137d0565b600082516001600160401b03811180156136f157600080fd5b5060405190808252806020026020018201604052801561372557816020015b60608152602001906001900390816137105790505b50905060005b835181101561376f5761375084828151811061374357fe5b602002602001015161367c565b82828151811061375c57fe5b602090810291909101015260010161372b565b506116968161364d565b6060611528826020015160008460000151612a47565b60408051608081018252600080825260208201819052918101829052606081019190915290565b604051806040016040528060008152602001600081525090565b604051806040016040528060608152602001606081525090565b60006137fd6137f884614207565b6141e4565b905082815283838301111561381157600080fd5b828260208301376000602084830101529392505050565b803561097a81614258565b8051801515811461097a57600080fd5b600082601f830112613853578081fd5b611696838335602085016137ea565b80356002811061097a57600080fd5b600080600060608486031215613885578283fd5b833561389081614258565b925060208401356138a081614258565b915060408401356001600160401b038111156138ba578182fd5b6138c686828701613843565b9150509250925092565b6000806000606084860312156138e4578283fd5b83356138ef81614258565b92506020840135915060408401356001600160401b038111156138ba578182fd5b60008060408385031215613922578182fd5b823561392d81614258565b915060208301356001600160401b03811115613947578182fd5b61395385828601613843565b9150509250929050565b60006020828403121561396e578081fd5b61169682613833565b600060208284031215613988578081fd5b5051919050565b6000602082840312156139a0578081fd5b81516001600160401b038111156139b5578182fd5b8201601f810184136139c5578182fd5b80516139d36137f882614207565b8181528560208385010111156139e7578384fd5b611bce826020830160208601614228565b600060208284031215613a09578081fd5b81356001600160401b03811115613a1e578182fd5b8201601f81018413613a2e578182fd5b61154c848235602084016137ea565b600060c08284031215613a4e578081fd5b60405160c081018181106001600160401b0382111715613a6a57fe5b8060405250825181526020830151602082015260408301516040820152606083015160608201526080830151613a9f81614258565b6080820152613ab060a08401613833565b60a08201529392505050565b600060208284031215613acd578081fd5b81356001600160401b0380821115613ae3578283fd5b9083019060e08286031215613af6578283fd5b613b0060e06141e4565b8235815260208301356020820152613b1a60408401613862565b6040820152613b2b60608401613828565b6060820152613b3c60808401613828565b608082015260a083013560a082015260c083013582811115613b5c578485fd5b613b6887828601613843565b60c08301525095945050505050565b6001600160a01b03169052565b60008151808452613b9c816020860160208601614228565b601f01601f19169290920160200192915050565b60609190911b6bffffffffffffffffffffffff1916815260140190565b90815260200190565b60008351613be8818460208801614228565b835190830190613bfc818360208801614228565b01949350505050565b600088825287602083015260028710613c1a57fe5b8660f81b60408301526bffffffffffffffffffffffff19808760601b166041840152808660601b166055840152508360698301528251613c61816089850160208701614228565b9190910160890198975050505050505050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039390931683526020830191909152604082015260600190565b600060e08201905060018060a01b038085168352835160208401526020840151604084015260408401516060840152606084015160808401528060808501511660a08401525060a0830151151560c08301529392505050565b901515815260200190565b6020810160038310613d3457fe5b91905290565b60208082526025908201527f53746f7261676520736c6f742068617320616c7265616479206265656e20707260408201526437bb32b71760d91b606082015260800190565b60208082526026908201527f4163636f756e742073746174652068617320616c7265616479206265656e20706040820152653937bb32b71760d11b606082015260800190565b6020808252603e908201527f416c6c206163636f756e7473206d75737420626520636f6d6d6974746564206260408201527f65666f726520636f6d706c6574696e672061207472616e736974696f6e2e0000606082015260800190565b602080825260409082018190527f53746f7261676520736c6f742076616c7565207761736e2774206368616e6765908201527f64206f722068617320616c7265616479206265656e20636f6d6d69747465642e606082015260800190565b6020808252605b908201527f4f564d5f53746174655472616e736974696f6e65723a2050726f76696465642060408201527f4c3120636f6e747261637420636f6465206861736820646f6573206e6f74206d60608201527f61746368204c3220636f6e747261637420636f646520686173682e0000000000608082015260a00190565b6020808252603f908201527f416c6c2073746f72616765206d75737420626520636f6d6d697474656420626560408201527f666f726520636f6d6d697474696e67206163636f756e74207374617465732e00606082015260800190565b60208082526038908201527f4e6f7420656e6f7567682067617320746f2065786563757465207472616e736160408201527f6374696f6e2064657465726d696e6973746963616c6c792e0000000000000000606082015260800190565b6020808252603b908201527f4163636f756e74207374617465207761736e2774206368616e676564206f722060408201527f68617320616c7265616479206265656e20636f6d6d69747465642e0000000000606082015260800190565b6020808252603d908201527f416c6c2073746f72616765206d75737420626520636f6d6d697474656420626560408201527f666f726520636f6d706c6574696e672061207472616e736974696f6e2e000000606082015260800190565b60208082526031908201527f46756e6374696f6e206d7573742062652063616c6c656420647572696e67207460408201527034329031b7b93932b1ba10383430b9b29760791b606082015260800190565b6020808252601d908201527f496e76616c6964207472616e73616374696f6e2070726f76696465642e000000604082015260600190565b60208082526038908201527f436f6e7472616374206d757374206265207665726966696564206265666f726560408201527f2070726f76696e6720612073746f7261676520736c6f742e0000000000000000606082015260800190565b600060408252835160408301526020840151606083015260408401516002811061418257fe5b60808381019190915260608501516001600160a01b031660a08401528401516141ae60c0840182613b77565b5060a084015160e083015260c084015160e06101008401526141d4610120840182613b84565b9150506116966020830184613b77565b6040518181016001600160401b03811182821017156141ff57fe5b604052919050565b60006001600160401b0382111561421a57fe5b50601f01601f191660200190565b60005b8381101561424357818101518382015260200161422b565b83811115614252576000848401525b50505050565b6001600160a01b038116811461426d57600080fd5b5056fe50726f766964656420524c50206c6973742065786365656473206d6178206c697374206c656e6774682e52656365697665642061206e6f6465207769746820616e20756e6b6e6f776e20707265666978a2646970667358221220ce5bdf188c3574b3ab8fd8d954100f14bc36e9cb42e1ca798a8f556d7ace41f564736f6c634300070600334372656174652063616e206f6e6c7920626520646f6e6520627920746865204f564d5f467261756456657269666965722ea26469706673582212200d398ad651c22ef8f9239e5104dc8b8e30dec6c479966de4f2382a136a81db4864736f6c63430007060033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100415760003560e01c806322d1470214610046578063299ca4781461009a578063461a4478146100a2575b600080fd5b61007e6004803603608081101561005c57600080fd5b506001600160a01b038135169060208101359060408101359060600135610148565b604080516001600160a01b039092168252519081900360200190f35b61007e610229565b61007e600480360360208110156100b857600080fd5b8101906020810181356401000000008111156100d357600080fd5b8201836020820111156100e557600080fd5b8035906020019184600183028401116401000000008311171561010757600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610238945050505050565b600061017c6040518060400160405280601181526020017027ab26afa33930bab22b32b934b334b2b960791b815250610238565b6001600160a01b0316336001600160a01b0316146101cb5760405162461bcd60e51b81526004018080602001828103825260318152602001806148ee6031913960400191505060405180910390fd5b848484846040516101db90610314565b80856001600160a01b03168152602001848152602001838152602001828152602001945050505050604051809103906000f08015801561021f573d6000803e3d6000fd5b5095945050505050565b6000546001600160a01b031681565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b83811015610298578181015183820152602001610280565b50505050905090810190601f1680156102c55780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b1580156102e257600080fd5b505afa1580156102f6573d6000803e3d6000fd5b505050506040513d602081101561030c57600080fd5b505192915050565b6145cc806103228339019056fe60806040523480156200001157600080fd5b50604051620045cc380380620045cc833981016040819052620000349162000232565b600080546001600160a01b0319166001600160a01b038616179055600583905560028290556003829055600681905560408051808201909152601781527f4f564d5f53746174654d616e61676572466163746f72790000000000000000006020820152620000a29062000150565b6001600160a01b0316639ed93318306040518263ffffffff1660e01b8152600401620000cf919062000299565b602060405180830381600087803b158015620000ea57600080fd5b505af1158015620000ff573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000125919062000273565b600180546001600160a01b0319166001600160a01b039290921691909117905550620002c692505050565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b83811015620001b257818101518382015260200162000198565b50505050905090810190601f168015620001e05780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b158015620001fe57600080fd5b505afa15801562000213573d6000803e3d6000fd5b505050506040513d60208110156200022a57600080fd5b505192915050565b6000806000806080858703121562000248578384fd5b84516200025581620002ad565b60208601516040870151606090970151919890975090945092505050565b60006020828403121562000285578081fd5b81516200029281620002ad565b9392505050565b6001600160a01b0391909116815260200190565b6001600160a01b0381168114620002c357600080fd5b50565b6142f680620002d66000396000f3fe608060405234801561001057600080fd5b50600436106100cf5760003560e01c8063845fe7a31161008c578063b2fa1c9e11610066578063b2fa1c9e14610185578063b52805711461019a578063b9194310146101a2578063c1c618b8146101b5576100cf565b8063845fe7a314610155578063a244316a14610168578063b1c9fe6e14610170576100cf565b8063299ca478146100d45780632e1ac36c146100f25780632eb1375814610107578063461a44781461011a578063732f960b1461012d578063805e9d3014610140575b600080fd5b6100dc6101bd565b6040516100e99190613c74565b60405180910390f35b6101056101003660046138d0565b6101cc565b005b610105610115366004613910565b610565565b6100dc6101283660046139f8565b6108a1565b61010561013b366004613abc565b61097f565b610148610c6f565b6040516100e99190613bcd565b6101056101633660046138d0565b610c75565b610105610fa1565b610178611128565b6040516100e99190613d26565b61018d611131565b6040516100e99190613d1b565b6100dc61114c565b6101056101b0366004613871565b61115b565b610148611475565b6000546001600160a01b031681565b60018060045460ff1660028111156101e057fe5b146102065760405162461bcd60e51b81526004016101fd90614077565b60405180910390fd5b60025460065460005a6001546040516363b285f960e11b81529192506001600160a01b03169063c7650bf290610242908a908a90600401613c88565b602060405180830381600087803b15801561025c57600080fd5b505af1158015610270573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610294919061395d565b15156001146102b55760405162461bcd60e51b81526004016101fd90613e22565b60015460405163fbcbc0f160e01b81526000916001600160a01b03169063fbcbc0f1906102e6908b90600401613c74565b60c06040518083038186803b1580156102fe57600080fd5b505afa158015610312573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103369190613a3d565b600154604051631aaf392f60e01b81529192506000916001600160a01b0390911690631aaf392f9061036e908c908c90600401613c88565b60206040518083038186803b15801561038657600080fd5b505afa15801561039a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103be9190613977565b90506103ff886040516020016103d49190613bcd565b6040516020818303038152906040526103f46103ef8461147b565b6114c4565b89856040015161152e565b6040808401919091526001549051638f3b964760e01b81526001600160a01b0390911690638f3b964790610439908c908690600401613cc2565b600060405180830381600087803b15801561045357600080fd5b505af1158015610467573d6000803e3d6000fd5b505050507f3e3ed1a676a2754a041b49bf752e0f167c8753495e36c320fe01d1ef7476253c898960405161049c929190613c88565b60405180910390a1505060005a820390506104dd6040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506108a1565b6001600160a01b0316631e16e92f858533856040518563ffffffff1660e01b815260040180858152602001848152602001836001600160a01b03168152602001828152602001945050505050600060405180830381600087803b15801561054357600080fd5b505af1158015610557573d6000803e3d6000fd5b505050505050505050505050565b60018060045460ff16600281111561057957fe5b146105965760405162461bcd60e51b81526004016101fd90614077565b60025460065460005a9050600160009054906101000a90046001600160a01b03166001600160a01b03166399056ba96040518163ffffffff1660e01b815260040160206040518083038186803b1580156105ef57600080fd5b505afa158015610603573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106279190613977565b156106445760405162461bcd60e51b81526004016101fd90613f03565b600154604051630b38106960e11b81526001600160a01b039091169063167020d290610674908990600401613c74565b602060405180830381600087803b15801561068e57600080fd5b505af11580156106a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106c6919061395d565b15156001146106e75760405162461bcd60e51b81526004016101fd90613fbd565b60015460405163fbcbc0f160e01b81526000916001600160a01b03169063fbcbc0f190610718908a90600401613c74565b60c06040518083038186803b15801561073057600080fd5b505afa158015610744573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107689190613a3d565b90506107a78760405160200161077e9190613bb0565b60405160208183030381529060405261079e61079984611554565b611594565b8860035461152e565b6003556040517fcec9ef675d775706a02b43afe48af52c5019bc50f99582e3208c6ff55d59c008906107da908990613c74565b60405180910390a15060005a8203905061081a6040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506108a1565b6001600160a01b0316631e16e92f858533856040518563ffffffff1660e01b815260040180858152602001848152602001836001600160a01b03168152602001828152602001945050505050600060405180830381600087803b15801561088057600080fd5b505af1158015610894573d6000803e3d6000fd5b5050505050505050505050565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b838110156109015781810151838201526020016108e9565b50505050905090810190601f16801561092e5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561094b57600080fd5b505afa15801561095f573d6000803e3d6000fd5b505050506040513d602081101561097557600080fd5b505190505b919050565b60008060045460ff16600281111561099357fe5b146109b05760405162461bcd60e51b81526004016101fd90614077565b60025460065460005a90506006546109c78661169d565b146109e45760405162461bcd60e51b81526004016101fd906140c8565b6103e88560a0015161040802816109f757fe5b04620186a0015a1015610a1c5760405162461bcd60e51b81526004016101fd90613f60565b6000610a536040518060400160405280601481526020017327ab26afa2bc32b1baba34b7b726b0b730b3b2b960611b8152506108a1565b600154604051631381ba4d60e01b81529192506001600160a01b031690631381ba4d90610a84908490600401613c74565b600060405180830381600087803b158015610a9e57600080fd5b505af1158015610ab2573d6000803e3d6000fd5b5050600154604051639be3ad6760e01b81526001600160a01b038086169450639be3ad679350610ae9928b9291169060040161415c565b600060405180830381600087803b158015610b0357600080fd5b505af1158015610b17573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610b3f919081019061398f565b50600154604051631381ba4d60e01b81526001600160a01b0390911690631381ba4d90610b7190600090600401613c74565b600060405180830381600087803b158015610b8b57600080fd5b505af1158015610b9f573d6000803e3d6000fd5b50506004805460ff191660011790555060009150505a82039050610be96040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506108a1565b6001600160a01b0316631e16e92f858533856040518563ffffffff1660e01b815260040180858152602001848152602001836001600160a01b03168152602001828152602001945050505050600060405180830381600087803b158015610c4f57600080fd5b505af1158015610c63573d6000803e3d6000fd5b50505050505050505050565b60025490565b60008060045460ff166002811115610c8957fe5b14610ca65760405162461bcd60e51b81526004016101fd90614077565b60025460065460005a600154604051630ad2267960e01b81529192506001600160a01b031690630ad2267990610ce2908a908a90600401613c88565b60206040518083038186803b158015610cfa57600080fd5b505afa158015610d0e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d32919061395d565b15610d4f5760405162461bcd60e51b81526004016101fd90613d3a565b60015460405163c8e40fbf60e01b81526001600160a01b039091169063c8e40fbf90610d7f908a90600401613c74565b60206040518083038186803b158015610d9757600080fd5b505afa158015610dab573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dcf919061395d565b1515600114610df05760405162461bcd60e51b81526004016101fd906140ff565b60015460405163136e2d8960e11b81526000916001600160a01b0316906326dc5b1290610e21908b90600401613c74565b60206040518083038186803b158015610e3957600080fd5b505afa158015610e4d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e719190613977565b905060007f56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421821415610ea557506000610f02565b600080610ed28a604051602001610ebc9190613bcd565b6040516020818303038152906040528a866116b6565b909250905060018215151415610efa57610ef3610eee826116df565b6116f2565b9250610eff565b600092505b50505b600154604051635c17d62960e01b81526001600160a01b0390911690635c17d62990610f36908c908c908690600401613ca1565b600060405180830381600087803b158015610f5057600080fd5b505af1158015610f64573d6000803e3d6000fd5b50505050505060005a820390506104dd6040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506108a1565b60018060045460ff166002811115610fb557fe5b14610fd25760405162461bcd60e51b81526004016101fd90614077565b600160009054906101000a90046001600160a01b03166001600160a01b031663d7bd4a2a6040518163ffffffff1660e01b815260040160206040518083038186803b15801561102057600080fd5b505afa158015611034573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110589190613977565b156110755760405162461bcd60e51b81526004016101fd90613dc5565b600160009054906101000a90046001600160a01b03166001600160a01b03166399056ba96040518163ffffffff1660e01b815260040160206040518083038186803b1580156110c357600080fd5b505afa1580156110d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110fb9190613977565b156111185760405162461bcd60e51b81526004016101fd9061401a565b506004805460ff19166002179055565b60045460ff1681565b6000600260045460ff16600281111561114657fe5b14905090565b6001546001600160a01b031681565b60008060045460ff16600281111561116f57fe5b1461118c5760405162461bcd60e51b81526004016101fd90614077565b60025460065460005a60015460405163c8e40fbf60e01b81529192506001600160a01b03169063c8e40fbf906111c6908a90600401613c74565b60206040518083038186803b1580156111de57600080fd5b505afa1580156111f2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611216919061395d565b1580156112a057506001546040516307a1294560e01b81526001600160a01b03909116906307a129459061124e908a90600401613c74565b60206040518083038186803b15801561126657600080fd5b505afa15801561127a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061129e919061395d565b155b6112bc5760405162461bcd60e51b81526004016101fd90613d7f565b6000806112eb896040516020016112d39190613bb0565b604051602081830303815290604052886002546116b6565b90925090506001821515141561140c57600061130682611721565b606081015190915089907fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470141561133f5750600061136a565b816060015161134d826117b3565b1461136a5760405162461bcd60e51b81526004016101fd90613e80565b6001546040805160c08101825284518152602080860151908201528482015181830152606080860151908201526001600160a01b038481166080830152600060a08301529151638f3b964760e01b81529190921691638f3b9647916113d3918f91600401613cc2565b600060405180830381600087803b1580156113ed57600080fd5b505af1158015611401573d6000803e3d6000fd5b50505050505061143c565b600154604051630d631c9d60e31b81526001600160a01b0390911690636b18e4e890610f36908c90600401613c74565b505060005a820390506104dd6040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506108a1565b60035490565b6060806000805b6020811085821a15161561149c5760019182019101611482565b5060405191506040820160405283600882021b60208301528060200382525080915050919050565b606080825160011480156114ec57506080836000815181106114e257fe5b016020015160f81c105b156114f8575081611528565b611504835160806117b7565b83604051602001611516929190613bd6565b60405160208183030381529060405290505b92915050565b60008061153a86611906565b905061154881868686611936565b9150505b949350505050565b61155c61378f565b604051806080016040528083600001518152602001836020015181526020018360400151815260200183606001518152509050919050565b60408051600480825260a0820190925260609160009190816020015b60608152602001906001900390816115b057505083519091506115d6906103ef9061147b565b816000815181106115e357fe5b60200260200101819052506116016103ef846020015160001b61147b565b8160018151811061160e57fe5b602002602001018190525061164583604001516040516020016116319190613bcd565b6040516020818303038152906040526114c4565b8160028151811061165257fe5b602002602001018190525061167583606001516040516020016116319190613bcd565b8160038151811061168257fe5b6020026020010181905250611696816119d1565b9392505050565b60006116a882611a15565b805190602001209050919050565b6000606060006116c586611906565b90506116d2818686611a50565b9250925050935093915050565b60606115286116ed83611b23565b611b48565b600080600060208451111561170857602061170b565b83515b6020858101519190036008021c92505050919050565b61172961378f565b600061173483611bd7565b9050604051806080016040528061175e8360008151811061175157fe5b6020026020010151611bea565b81526020016117738360018151811061175157fe5b81526020016117958360028151811061178857fe5b6020026020010151611bf1565b81526020016117aa8360038151811061178857fe5b90529392505050565b3f90565b6060806038841015611811576040805160018082528183019092529060208201818036833701905050905082840160f81b816000815181106117f557fe5b60200101906001600160f81b031916908160001a905350611696565b600060015b80868161181f57fe5b04156118345760019091019061010002611816565b816001016001600160401b038111801561184d57600080fd5b506040519080825280601f01601f191660200182016040528015611878576020820181803683370190505b50925084820160370160f81b8360008151811061189157fe5b60200101906001600160f81b031916908160001a905350600190505b8181116118fd576101008183036101000a87816118c657fe5b04816118ce57fe5b0660f81b8382815181106118de57fe5b60200101906001600160f81b031916908160001a9053506001016118ad565b50509392505050565b606081805190602001206040516020016119209190613bcd565b6040516020818303038152906040529050919050565b6040805180820190915260018152600160ff1b60209091015260007f56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42182141561198a576119838585611ceb565b905061154c565b600061199584611d0f565b90506000806119a5838987611de5565b509150915060006119b88484848b612188565b90506119c4818a6124a0565b9998505050505050505050565b606060006119de836125f9565b90506119ec815160c06117b7565b816040516020016119fe929190613bd6565b604051602081830303815290604052915050919050565b6060816000015182602001518360400151846060015185608001518660a001518760c001516040516020016119209796959493929190613c05565b600060606000611a5f85611d0f565b90506000806000611a71848a89611de5565b81519295509093509150158080611a855750815b611ad6576040805162461bcd60e51b815260206004820152601a60248201527f50726f76696465642070726f6f6620697320696e76616c69642e000000000000604482015290519081900360640190fd5b600081611af25760405180602001604052806000815250611b11565b611b11866001870381518110611b0457fe5b6020026020010151612702565b919b919a509098505050505050505050565b611b2b6137b6565b506040805180820190915281518152602082810190820152919050565b60606000806000611b588561271e565b919450925090506000816001811115611b6d57fe5b14611bbf576040805162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c502062797465732076616c75652e0000000000000000604482015290519081900360640190fd5b611bce85602001518484612a47565b95945050505050565b6060611528611be583611b23565b612af4565b6000611528825b6000602182600001511115611c4d576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e000000000000604482015290519081900360640190fd5b6000806000611c5b8561271e565b919450925090506000816001811115611c7057fe5b14611cc2576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e000000000000604482015290519081900360640190fd5b602080860151840180519091841015611ce15760208490036101000a90045b9695505050505050565b6000611cff611cf984612c6a565b83612d66565b5180516020909101209392505050565b60606000611d1c83611bd7565b9050600081516001600160401b0381118015611d3757600080fd5b50604051908082528060200260200182016040528015611d7157816020015b611d5e6137d0565b815260200190600190039081611d565790505b50905060005b8251811015611ddd576000611d9e848381518110611d9157fe5b6020026020010151611b48565b90506040518060400160405280828152602001611dba83611bd7565b815250838381518110611dc957fe5b602090810291909101015250600101611d77565b509392505050565b60006060818080611df587612c6a565b905085600080611e036137d0565b60005b8c51811015612160578c8181518110611e1b57fe5b6020026020010151915082840193506001870196508360001415611e8f57815180516020909101208514611e8a576040805162461bcd60e51b8152602060048201526011602482015270092dcecc2d8d2c840e4dedee840d0c2e6d607b1b604482015290519081900360640190fd5b611f56565b815151602011611ef657815180516020909101208514611e8a576040805162461bcd60e51b815260206004820152601b60248201527f496e76616c6964206c6172676520696e7465726e616c20686173680000000000604482015290519081900360640190fd5b84611f048360000151612dfa565b14611f56576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420696e7465726e616c206e6f64652068617368000000000000604482015290519081900360640190fd5b60208201515160111415611fc5578551841415611f7257612160565b6000868581518110611f8057fe5b602001015160f81c60f81b60f81c9050600083602001518260ff1681518110611fa557fe5b60200260200101519050611fb881612e26565b9650600194505050612158565b6002826020015151141561210b576000611fde83612e5c565b9050600081600081518110611fef57fe5b016020015160f81c905060018116600203600061200f8460ff8416612e7a565b9050600061201d8b8a612e7a565b9050600061202b8383612eab565b905060ff851660021480612042575060ff85166003145b15612074578083511480156120575750808251145b1561206157988901985b50600160ff1b9950612160945050505050565b60ff85161580612087575060ff85166001145b156120d457806120a45750600160ff1b9950612160945050505050565b6120c588602001516001815181106120b857fe5b6020026020010151612e26565b9a509750612158945050505050565b60405162461bcd60e51b815260040180806020018281038252602681526020018061429b6026913960400191505060405180910390fd5b6040805162461bcd60e51b815260206004820152601d60248201527f526563656976656420616e20756e706172736561626c65206e6f64652e000000604482015290519081900360640190fd5b600101611e06565b50600160ff1b8414866121738786612e7a565b909e909d50909b509950505050505050505050565b6060600083905060008660018703815181106121a057fe5b6020026020010151905060006121b582612f11565b6040805160038082526080820190925291925060009190816020015b6121d96137d0565b8152602001906001900390816121d157905050905060008451600014801561220c5750600283600281111561220a57fe5b145b156122425761222361221d85612fe7565b88612d66565b82828151811061222f57fe5b6020908102919091010152600101612483565b600083600281111561225057fe5b14156122b6578451612285576122668488612ffa565b82828151811061227257fe5b60209081029190910101526001016122b1565b8382828151811061229257fe5b602002602001018190525060018101905061222361221d866001612e7a565b612483565b60006122c185612fe7565b905060006122cf8288612eab565b905080156123305760006122e583600084613045565b90506122f9816122f48c613195565b6131d6565b85858151811061230557fe5b60200260200101819052506001840193506123208383612e7a565b925061232c8883612e7a565b9750505b600061233a61321a565b905082516000141561235f576123588161235389612702565b612ffa565b90506123f7565b60008360008151811061236e57fe5b016020015160f81c9050612383846001612e7a565b9350600287600281111561239357fe5b14156123ce5760006123ad856123a88b612702565b612d66565b90506123c683836123c18460000151613195565b6132a7565b9250506123f5565b8351156123e45760006123ad856122f48b612702565b6123f282826123c18b612702565b91505b505b875161242c57612407818b612ffa565b90508085858151811061241657fe5b602002602001018190525060018401935061247f565b612437886001612e7a565b97508085858151811061244657fe5b6020026020010181905250600184019350612461888b612d66565b85858151811061246d57fe5b60200260200101819052506001840193505b5050505b6124928a60018b038484613300565b9a9950505050505050505050565b6000806124ac83612c6a565b90506124b66137d0565b84516000906060905b80156125e4578760018203815181106124d457fe5b602002602001015193506124e784612f11565b925060028360028111156124f757fe5b141561252257600061250885612fe7565b905061251a8660008351895103613045565b9550506125ce565b600183600281111561253057fe5b141561257057600061254185612fe7565b90506125538660008351895103613045565b83519096501561256a5761256781846131d6565b94505b506125ce565b600083600281111561257e57fe5b14156125ce578151156125ce5760008560018751038151811061259d57fe5b602001015160f81c60f81b60f81c90506125bd8660006001895103613045565b95506125ca8582856132a7565b9450505b83516125d990613195565b9150600019016124bf565b50509051805160209091012095945050505050565b606081516000141561261a575060408051600081526020810190915261097a565b6000805b835181101561264d5783818151811061263357fe5b60200260200101515182019150808060010191505061261e565b6000826001600160401b038111801561266557600080fd5b506040519080825280601f01601f191660200182016040528015612690576020820181803683370190505b50600092509050602081015b85518310156126f95760008684815181106126b357fe5b6020026020010151905060006020820190506126d1838284516133e2565b8785815181106126dd57fe5b602002602001015151830192505050828060010193505061269c565b50949350505050565b60208101518051606091611528916000198101908110611d9157fe5b60008060008084600001511161277b576040805162461bcd60e51b815260206004820152601860248201527f524c50206974656d2063616e6e6f74206265206e756c6c2e0000000000000000604482015290519081900360640190fd5b6020840151805160001a607f81116127a0576000600160009450945094505050612a40565b60b78111612815578551607f198201908110612803576040805162461bcd60e51b815260206004820152601960248201527f496e76616c696420524c502073686f727420737472696e672e00000000000000604482015290519081900360640190fd5b60019550935060009250612a40915050565b60bf81116128f957855160b6198201908110612878576040805162461bcd60e51b815260206004820152601f60248201527f496e76616c696420524c50206c6f6e6720737472696e67206c656e6774682e00604482015290519081900360640190fd5b6000816020036101000a60018501510490508082018860000151116128e4576040805162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c50206c6f6e6720737472696e672e0000000000000000604482015290519081900360640190fd5b60019091019550935060009250612a40915050565b60f7811161296d57855160bf19820190811061295c576040805162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c502073686f7274206c6973742e000000000000000000604482015290519081900360640190fd5b600195509350849250612a40915050565b855160f61982019081106129c8576040805162461bcd60e51b815260206004820152601d60248201527f496e76616c696420524c50206c6f6e67206c697374206c656e6774682e000000604482015290519081900360640190fd5b6000816020036101000a6001850151049050808201886000015111612a2d576040805162461bcd60e51b815260206004820152601660248201527524b73b30b634b210292628103637b733903634b9ba1760511b604482015290519081900360640190fd5b6001918201965094509250612a40915050565b9193909250565b60606000826001600160401b0381118015612a6157600080fd5b506040519080825280601f01601f191660200182016040528015612a8c576020820181803683370190505b509050805160001415612aa0579050611696565b8484016020820160005b60208604811015612acb578251825260209283019290910190600101612aaa565b5080519151601f959095166020036101000a600019019182169119909416179092525092915050565b6060600080612b028461271e565b91935090915060019050816001811115612b1857fe5b14612b6a576040805162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c50206c6973742076616c75652e000000000000000000604482015290519081900360640190fd5b6040805160208082526104208201909252600091816020015b612b8b6137b6565b815260200190600190039081612b835790505090506000835b8651811015612c5f5760208210612bec5760405162461bcd60e51b815260040180806020018281038252602a815260200180614271602a913960400191505060405180910390fd5b600080612c186040518060400160405280858c60000151038152602001858c602001510181525061271e565b509150915060405180604001604052808383018152602001848b6020015101815250858581518110612c4657fe5b6020908102919091010152600193909301920101612ba4565b508152949350505050565b6060600082516002026001600160401b0381118015612c8857600080fd5b506040519080825280601f01601f191660200182016040528015612cb3576020820181803683370190505b50905060005b8351811015612d5f576004848281518110612cd057fe5b602001015160f81c60f81b6001600160f81b031916901c828260020281518110612cf657fe5b60200101906001600160f81b031916908160001a9053506010848281518110612d1b57fe5b016020015160f81c81612d2a57fe5b0660f81b828260020260010181518110612d4057fe5b60200101906001600160f81b031916908160001a905350600101612cb9565b5092915050565b612d6e6137d0565b60408051600280825260608201909252600091816020015b6060815260200190600190039081612d865790505090506000612daa856001613426565b9050612db86103ef8261357d565b82600081518110612dc557fe5b6020026020010181905250612dd9846114c4565b82600181518110612de657fe5b6020026020010181905250611bce8261364d565b6000602082511015612e115750602081015161097a565b81806020019051602081101561097557600080fd5b60006060602083600001511015612e4757612e408361367c565b9050612e53565b612e5083611b48565b90505b61169681612dfa565b6060611528612e758360200151600081518110611d9157fe5b612c6a565b60608183510360001415612e9d5750604080516020810190915260008152611528565b611696838384865103613045565b6000805b808451118015612ebf5750808351115b8015612f045750828181518110612ed257fe5b602001015160f81c60f81b6001600160f81b031916848281518110612ef357fe5b01602001516001600160f81b031916145b1561169657600101612eaf565b60208101515160009060111415612f2a5750600061097a565b60028260200151511415612fa6576000612f4383612e5c565b9050600081600081518110612f5457fe5b016020015160f81c90506002811480612f70575060ff81166003145b15612f805760029250505061097a565b60ff81161580612f93575060ff81166001145b15612fa35760019250505061097a565b50505b6040805162461bcd60e51b8152602060048201526011602482015270496e76616c6964206e6f6465207479706560781b604482015290519081900360640190fd5b6060611528612ff583612e5c565b613687565b6130026137d0565b600061300d836114c4565b905061301881611b23565b60208501518051600019810190811061302d57fe5b602002602001018190525061154c84602001516136d0565b60608182601f011015613090576040805162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b604482015290519081900360640190fd5b8282840110156130d8576040805162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b604482015290519081900360640190fd5b81830184511015613124576040805162461bcd60e51b8152602060048201526011602482015270736c6963655f6f75744f66426f756e647360781b604482015290519081900360640190fd5b60608215801561314357604051915060008252602082016040526126f9565b6040519150601f8416801560200281840101858101878315602002848b0101015b8183101561317c578051835260209283019201613164565b5050858452601f01601f19166040525050949350505050565b60606020825110156131a857508061097a565b818051906020012060405160200180828152602001915050604051602081830303815290604052905061097a565b6131de6137d0565b60408051600280825260608201909252600091816020015b60608152602001906001900390816131f65790505090506000612daa856000613426565b6132226137d0565b6040805160118082526102408201909252600091816020015b606081526020019060019003908161323b57905050905060005b815181101561329757604051806040016040528060018152602001600160ff1b81525082828151811061328457fe5b6020908102919091010152600101613255565b506132a18161364d565b91505090565b6132af6137d0565b600060208351106132c8576132c3836114c4565b6132ca565b825b90506132d581611b23565b85602001518560ff16815181106132e857fe5b6020026020010181905250611bce85602001516136d0565b606060008285016001600160401b038111801561331c57600080fd5b5060405190808252806020026020018201604052801561335657816020015b6133436137d0565b81526020019060019003908161333b5790505b50905060005b858110156133975786818151811061337057fe5b602002602001015182828151811061338457fe5b602090810291909101015260010161335c565b5060005b838110156133d8578481815181106133af57fe5b602002602001015182878301815181106133c557fe5b602090810291909101015260010161339b565b5095945050505050565b8282825b60208110613405578151835260209283019290910190601f19016133e6565b905182516020929092036101000a6000190180199091169116179052505050565b6060600082613436576000613439565b60025b90506000600285518161344857fe5b06905060008160020360ff166001600160401b038111801561346957600080fd5b506040519080825280601f01601f191660200182016040528015613494576020820181803683370190505b50905081830160f81b816000815181106134aa57fe5b60200101906001600160f81b031916908160001a90535080866040516020018083805190602001908083835b602083106134f55780518252601f1990920191602091820191016134d6565b51815160209384036101000a600019018019909216911617905285519190930192850191508083835b6020831061353d5780518252601f19909201916020918201910161351e565b6001836020036101000a03801982511681845116808217855250505050505090500192505050604051602081830303815290604052935050505092915050565b60606000600283518161358c57fe5b046001600160401b03811180156135a257600080fd5b506040519080825280601f01601f1916602001820160405280156135cd576020820181803683370190505b50905060005b8151811015612d5f578381600202600101815181106135ee57fe5b602001015160f81c60f81b600485836002028151811061360a57fe5b602001015160f81c60f81b6001600160f81b031916901b1782828151811061362e57fe5b60200101906001600160f81b031916908160001a9053506001016135d3565b6136556137d0565b6000613660836119d1565b905060405180604001604052808281526020016117aa83611bd7565b606061152882613779565b606060028260008151811061369857fe5b016020015160f81c816136a757fe5b0660ff16600014156136c5576136be826002612e7a565b905061097a565b6136be826001612e7a565b6136d86137d0565b600082516001600160401b03811180156136f157600080fd5b5060405190808252806020026020018201604052801561372557816020015b60608152602001906001900390816137105790505b50905060005b835181101561376f5761375084828151811061374357fe5b602002602001015161367c565b82828151811061375c57fe5b602090810291909101015260010161372b565b506116968161364d565b6060611528826020015160008460000151612a47565b60408051608081018252600080825260208201819052918101829052606081019190915290565b604051806040016040528060008152602001600081525090565b604051806040016040528060608152602001606081525090565b60006137fd6137f884614207565b6141e4565b905082815283838301111561381157600080fd5b828260208301376000602084830101529392505050565b803561097a81614258565b8051801515811461097a57600080fd5b600082601f830112613853578081fd5b611696838335602085016137ea565b80356002811061097a57600080fd5b600080600060608486031215613885578283fd5b833561389081614258565b925060208401356138a081614258565b915060408401356001600160401b038111156138ba578182fd5b6138c686828701613843565b9150509250925092565b6000806000606084860312156138e4578283fd5b83356138ef81614258565b92506020840135915060408401356001600160401b038111156138ba578182fd5b60008060408385031215613922578182fd5b823561392d81614258565b915060208301356001600160401b03811115613947578182fd5b61395385828601613843565b9150509250929050565b60006020828403121561396e578081fd5b61169682613833565b600060208284031215613988578081fd5b5051919050565b6000602082840312156139a0578081fd5b81516001600160401b038111156139b5578182fd5b8201601f810184136139c5578182fd5b80516139d36137f882614207565b8181528560208385010111156139e7578384fd5b611bce826020830160208601614228565b600060208284031215613a09578081fd5b81356001600160401b03811115613a1e578182fd5b8201601f81018413613a2e578182fd5b61154c848235602084016137ea565b600060c08284031215613a4e578081fd5b60405160c081018181106001600160401b0382111715613a6a57fe5b8060405250825181526020830151602082015260408301516040820152606083015160608201526080830151613a9f81614258565b6080820152613ab060a08401613833565b60a08201529392505050565b600060208284031215613acd578081fd5b81356001600160401b0380821115613ae3578283fd5b9083019060e08286031215613af6578283fd5b613b0060e06141e4565b8235815260208301356020820152613b1a60408401613862565b6040820152613b2b60608401613828565b6060820152613b3c60808401613828565b608082015260a083013560a082015260c083013582811115613b5c578485fd5b613b6887828601613843565b60c08301525095945050505050565b6001600160a01b03169052565b60008151808452613b9c816020860160208601614228565b601f01601f19169290920160200192915050565b60609190911b6bffffffffffffffffffffffff1916815260140190565b90815260200190565b60008351613be8818460208801614228565b835190830190613bfc818360208801614228565b01949350505050565b600088825287602083015260028710613c1a57fe5b8660f81b60408301526bffffffffffffffffffffffff19808760601b166041840152808660601b166055840152508360698301528251613c61816089850160208701614228565b9190910160890198975050505050505050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039390931683526020830191909152604082015260600190565b600060e08201905060018060a01b038085168352835160208401526020840151604084015260408401516060840152606084015160808401528060808501511660a08401525060a0830151151560c08301529392505050565b901515815260200190565b6020810160038310613d3457fe5b91905290565b60208082526025908201527f53746f7261676520736c6f742068617320616c7265616479206265656e20707260408201526437bb32b71760d91b606082015260800190565b60208082526026908201527f4163636f756e742073746174652068617320616c7265616479206265656e20706040820152653937bb32b71760d11b606082015260800190565b6020808252603e908201527f416c6c206163636f756e7473206d75737420626520636f6d6d6974746564206260408201527f65666f726520636f6d706c6574696e672061207472616e736974696f6e2e0000606082015260800190565b602080825260409082018190527f53746f7261676520736c6f742076616c7565207761736e2774206368616e6765908201527f64206f722068617320616c7265616479206265656e20636f6d6d69747465642e606082015260800190565b6020808252605b908201527f4f564d5f53746174655472616e736974696f6e65723a2050726f76696465642060408201527f4c3120636f6e747261637420636f6465206861736820646f6573206e6f74206d60608201527f61746368204c3220636f6e747261637420636f646520686173682e0000000000608082015260a00190565b6020808252603f908201527f416c6c2073746f72616765206d75737420626520636f6d6d697474656420626560408201527f666f726520636f6d6d697474696e67206163636f756e74207374617465732e00606082015260800190565b60208082526038908201527f4e6f7420656e6f7567682067617320746f2065786563757465207472616e736160408201527f6374696f6e2064657465726d696e6973746963616c6c792e0000000000000000606082015260800190565b6020808252603b908201527f4163636f756e74207374617465207761736e2774206368616e676564206f722060408201527f68617320616c7265616479206265656e20636f6d6d69747465642e0000000000606082015260800190565b6020808252603d908201527f416c6c2073746f72616765206d75737420626520636f6d6d697474656420626560408201527f666f726520636f6d706c6574696e672061207472616e736974696f6e2e000000606082015260800190565b60208082526031908201527f46756e6374696f6e206d7573742062652063616c6c656420647572696e67207460408201527034329031b7b93932b1ba10383430b9b29760791b606082015260800190565b6020808252601d908201527f496e76616c6964207472616e73616374696f6e2070726f76696465642e000000604082015260600190565b60208082526038908201527f436f6e7472616374206d757374206265207665726966696564206265666f726560408201527f2070726f76696e6720612073746f7261676520736c6f742e0000000000000000606082015260800190565b600060408252835160408301526020840151606083015260408401516002811061418257fe5b60808381019190915260608501516001600160a01b031660a08401528401516141ae60c0840182613b77565b5060a084015160e083015260c084015160e06101008401526141d4610120840182613b84565b9150506116966020830184613b77565b6040518181016001600160401b03811182821017156141ff57fe5b604052919050565b60006001600160401b0382111561421a57fe5b50601f01601f191660200190565b60005b8381101561424357818101518382015260200161422b565b83811115614252576000848401525b50505050565b6001600160a01b038116811461426d57600080fd5b5056fe50726f766964656420524c50206c6973742065786365656473206d6178206c697374206c656e6774682e52656365697665642061206e6f6465207769746820616e20756e6b6e6f776e20707265666978a2646970667358221220ce5bdf188c3574b3ab8fd8d954100f14bc36e9cb42e1ca798a8f556d7ace41f564736f6c634300070600334372656174652063616e206f6e6c7920626520646f6e6520627920746865204f564d5f467261756456657269666965722ea26469706673582212200d398ad651c22ef8f9239e5104dc8b8e30dec6c479966de4f2382a136a81db4864736f6c63430007060033", - "devdoc": { - "details": "The State Transitioner Factory is used by the Fraud Verifier to create a new State Transitioner during the initialization of a fraud proof. Compiler used: solc Runtime target: EVM", - "kind": "dev", - "methods": { - "create(address,uint256,bytes32,bytes32)": { - "params": { - "_libAddressManager": "Address of the Address Manager.", - "_preStateRoot": "State root before the transition was executed.", - "_stateTransitionIndex": "Index of the state transition being verified.", - "_transactionHash": "Hash of the executed transaction." - }, - "returns": { - "_0": "New OVM_StateTransitioner instance." - } - }, - "resolve(string)": { - "params": { - "_name": "Name to resolve an address for." - }, - "returns": { - "_0": "Address associated with the given name." - } - } - }, - "title": "OVM_StateTransitionerFactory", - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": { - "create(address,uint256,bytes32,bytes32)": { - "notice": "Creates a new OVM_StateTransitioner" - }, - "resolve(string)": { - "notice": "Resolves the address associated with a given name." - } - }, - "version": 1 - }, - "storageLayout": { - "storage": [ - { - "astId": 12800, - "contract": "contracts/optimistic-ethereum/OVM/verification/OVM_StateTransitionerFactory.sol:OVM_StateTransitionerFactory", - "label": "libAddressManager", - "offset": 0, - "slot": "0", - "type": "t_contract(Lib_AddressManager)12793" - } - ], - "types": { - "t_contract(Lib_AddressManager)12793": { - "encoding": "inplace", - "label": "contract Lib_AddressManager", - "numberOfBytes": "20" - } - } - } -} \ No newline at end of file diff --git a/packages/contracts/deployments/kovan-v3/Proxy__OVM_L1CrossDomainMessenger.json b/packages/contracts/deployments/kovan-v3/Proxy__OVM_L1CrossDomainMessenger.json deleted file mode 100644 index c42f5d0bf1550..0000000000000 --- a/packages/contracts/deployments/kovan-v3/Proxy__OVM_L1CrossDomainMessenger.json +++ /dev/null @@ -1,118 +0,0 @@ -{ - "address": "0x78b88FD62FBdBf67b9C5C6528CF84E9d30BB28e0", - "abi": [ - { - "inputs": [ - { - "internalType": "address", - "name": "_libAddressManager", - "type": "address" - }, - { - "internalType": "string", - "name": "_implementationName", - "type": "string" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "stateMutability": "payable", - "type": "fallback" - } - ], - "transactionHash": "0xd175bdbcd00f66a7b3a247bf2d0c3719912b845f4898cfe6e09062cc7c33849f", - "receipt": { - "to": null, - "from": "0x18394B52d3Cb931dfA76F63251919D051953413d", - "contractAddress": "0x78b88FD62FBdBf67b9C5C6528CF84E9d30BB28e0", - "transactionIndex": 1, - "gasUsed": "222424", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0x1e1bc36b9553544c99025041f703c41760904c63ad443300a44e9ef0e2be7f56", - "transactionHash": "0xd175bdbcd00f66a7b3a247bf2d0c3719912b845f4898cfe6e09062cc7c33849f", - "logs": [], - "blockNumber": 24572837, - "cumulativeGasUsed": "252381", - "status": 1, - "byzantium": true - }, - "args": [ - "0xd56F695e73286ac252A37593DD4E7c14270eC1Df", - "OVM_L1CrossDomainMessenger" - ], - "solcInputHash": "5ee8e508e2c54cb5ac6783b4855b1558", - "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_implementationName\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"stateMutability\":\"payable\",\"type\":\"fallback\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_implementationName\":\"implementationName of the contract to proxy to.\",\"_libAddressManager\":\"Address of the Lib_AddressManager.\"}}},\"title\":\"Lib_ResolvedDelegateProxy\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/libraries/resolver/Lib_ResolvedDelegateProxy.sol\":\"Lib_ResolvedDelegateProxy\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor () internal {\\n address msgSender = _msgSender();\\n _owner = msgSender;\\n emit OwnershipTransferred(address(0), msgSender);\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n emit OwnershipTransferred(_owner, address(0));\\n _owner = address(0);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n emit OwnershipTransferred(_owner, newOwner);\\n _owner = newOwner;\\n }\\n}\\n\",\"keccak256\":\"0x15e2d5bd4c28a88548074c54d220e8086f638a71ed07e6b3ba5a70066fcf458d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with GSN meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address payable) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes memory) {\\n this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x8d3cb350f04ff49cfb10aef08d87f19dcbaecc8027b0bed12f3275cd12f38cf0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n public\\n onlyOwner\\n {\\n addresses[_getNameHash(_name)] = _address;\\n\\n emit AddressSet(\\n _name,\\n _address\\n );\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0x2ce671a0e004df88b136bea5a3c59d0732cea8887c8496da1d509e0200b03d7d\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_ResolvedDelegateProxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_ResolvedDelegateProxy\\n */\\ncontract Lib_ResolvedDelegateProxy {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n // Using mappings to store fields to avoid overwriting storage slots in the\\n // implementation contract. For example, instead of storing these fields at\\n // storage slot `0` & `1`, they are stored at `keccak256(key + slot)`.\\n // See: https://solidity.readthedocs.io/en/v0.7.0/internals/layout_in_storage.html\\n // NOTE: Do not use this code in your own contract system.\\n // There is a known flaw in this contract, and we will remove it from the repository\\n // in the near future. Due to the very limited way that we are using it, this flaw is\\n // not an issue in our system.\\n mapping (address => string) private implementationName;\\n mapping (address => Lib_AddressManager) private addressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n * @param _implementationName implementationName of the contract to proxy to.\\n */\\n constructor(\\n address _libAddressManager,\\n string memory _implementationName\\n ) {\\n addressManager[address(this)] = Lib_AddressManager(_libAddressManager);\\n implementationName[address(this)] = _implementationName;\\n }\\n\\n\\n /*********************\\n * Fallback Function *\\n *********************/\\n\\n fallback()\\n external\\n payable\\n {\\n address target = addressManager[address(this)].getAddress(\\n (implementationName[address(this)])\\n );\\n\\n require(\\n target != address(0),\\n \\\"Target address must be initialized.\\\"\\n );\\n\\n (bool success, bytes memory returndata) = target.delegatecall(msg.data);\\n\\n if (success == true) {\\n assembly {\\n return(add(returndata, 0x20), mload(returndata))\\n }\\n } else {\\n assembly {\\n revert(add(returndata, 0x20), mload(returndata))\\n }\\n }\\n }\\n}\\n\",\"keccak256\":\"0xfaecb051b37f1d87d588cafb17a575723cbdf7c3c2079772110f33e747e05027\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x608060405234801561001057600080fd5b506040516104083803806104088339818101604052604081101561003357600080fd5b81516020830180516040519294929383019291908464010000000082111561005a57600080fd5b90830190602082018581111561006f57600080fd5b825164010000000081118282018810171561008957600080fd5b82525081516020918201929091019080838360005b838110156100b657818101518382015260200161009e565b50505050905090810190601f1680156100e35780820380516001836020036101000a031916815260200191505b5060409081523060009081526001602090815282822080546001600160a01b0319166001600160a01b038a16179055818152919020855161012c95509093509085019150610134565b5050506101d5565b828054600181600116156101000203166002900490600052602060002090601f01602090048101928261016a57600085556101b0565b82601f1061018357805160ff19168380011785556101b0565b828001600101855582156101b0579182015b828111156101b0578251825591602001919060010190610195565b506101bc9291506101c0565b5090565b5b808211156101bc57600081556001016101c1565b610224806101e46000396000f3fe60806040818152306000908152600160208181528383205483825293832063bf40fac160e01b909552608490815284546002610100938216159390930260001901169190910460a481905291936001600160a01b039093169263bf40fac192909190819060c490849080156100b55780601f1061008a576101008083540402835291602001916100b5565b820191906000526020600020905b81548152906001019060200180831161009857829003601f168201915b50509250505060206040518083038186803b1580156100d357600080fd5b505afa1580156100e7573d6000803e3d6000fd5b505050506040513d60208110156100fd57600080fd5b505190506001600160a01b0381166101465760405162461bcd60e51b81526004018080602001828103825260238152602001806101cc6023913960400191505060405180910390fd5b600080826001600160a01b03166000366040518083838082843760405192019450600093509091505080830381855af49150503d80600081146101a5576040519150601f19603f3d011682016040523d82523d6000602084013e6101aa565b606091505b509092509050600182151514156101c357805160208201f35b805160208201fdfe5461726765742061646472657373206d75737420626520696e697469616c697a65642ea264697066735822122026d4992ed7562b49b7d3e306977cab94c29f8fb64a137b48d18960cc5ef1341d64736f6c63430007060033", - "deployedBytecode": "0x60806040818152306000908152600160208181528383205483825293832063bf40fac160e01b909552608490815284546002610100938216159390930260001901169190910460a481905291936001600160a01b039093169263bf40fac192909190819060c490849080156100b55780601f1061008a576101008083540402835291602001916100b5565b820191906000526020600020905b81548152906001019060200180831161009857829003601f168201915b50509250505060206040518083038186803b1580156100d357600080fd5b505afa1580156100e7573d6000803e3d6000fd5b505050506040513d60208110156100fd57600080fd5b505190506001600160a01b0381166101465760405162461bcd60e51b81526004018080602001828103825260238152602001806101cc6023913960400191505060405180910390fd5b600080826001600160a01b03166000366040518083838082843760405192019450600093509091505080830381855af49150503d80600081146101a5576040519150601f19603f3d011682016040523d82523d6000602084013e6101aa565b606091505b509092509050600182151514156101c357805160208201f35b805160208201fdfe5461726765742061646472657373206d75737420626520696e697469616c697a65642ea264697066735822122026d4992ed7562b49b7d3e306977cab94c29f8fb64a137b48d18960cc5ef1341d64736f6c63430007060033", - "devdoc": { - "kind": "dev", - "methods": { - "constructor": { - "params": { - "_implementationName": "implementationName of the contract to proxy to.", - "_libAddressManager": "Address of the Lib_AddressManager." - } - } - }, - "title": "Lib_ResolvedDelegateProxy", - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": {}, - "version": 1 - }, - "storageLayout": { - "storage": [ - { - "astId": 12837, - "contract": "contracts/optimistic-ethereum/libraries/resolver/Lib_ResolvedDelegateProxy.sol:Lib_ResolvedDelegateProxy", - "label": "implementationName", - "offset": 0, - "slot": "0", - "type": "t_mapping(t_address,t_string_storage)" - }, - { - "astId": 12841, - "contract": "contracts/optimistic-ethereum/libraries/resolver/Lib_ResolvedDelegateProxy.sol:Lib_ResolvedDelegateProxy", - "label": "addressManager", - "offset": 0, - "slot": "1", - "type": "t_mapping(t_address,t_contract(Lib_AddressManager)12793)" - } - ], - "types": { - "t_address": { - "encoding": "inplace", - "label": "address", - "numberOfBytes": "20" - }, - "t_contract(Lib_AddressManager)12793": { - "encoding": "inplace", - "label": "contract Lib_AddressManager", - "numberOfBytes": "20" - }, - "t_mapping(t_address,t_contract(Lib_AddressManager)12793)": { - "encoding": "mapping", - "key": "t_address", - "label": "mapping(address => contract Lib_AddressManager)", - "numberOfBytes": "32", - "value": "t_contract(Lib_AddressManager)12793" - }, - "t_mapping(t_address,t_string_storage)": { - "encoding": "mapping", - "key": "t_address", - "label": "mapping(address => string)", - "numberOfBytes": "32", - "value": "t_string_storage" - }, - "t_string_storage": { - "encoding": "bytes", - "label": "string", - "numberOfBytes": "32" - } - } - } -} \ No newline at end of file diff --git a/packages/contracts/deployments/kovan-v3/Proxy__OVM_L1ETHGateway.json b/packages/contracts/deployments/kovan-v3/Proxy__OVM_L1ETHGateway.json deleted file mode 100644 index 65948c09a9c25..0000000000000 --- a/packages/contracts/deployments/kovan-v3/Proxy__OVM_L1ETHGateway.json +++ /dev/null @@ -1,118 +0,0 @@ -{ - "address": "0xB191d67F69e823445cD59e5A88953a82be73b9C6", - "abi": [ - { - "inputs": [ - { - "internalType": "address", - "name": "_libAddressManager", - "type": "address" - }, - { - "internalType": "string", - "name": "_implementationName", - "type": "string" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "stateMutability": "payable", - "type": "fallback" - } - ], - "transactionHash": "0xbb58732ffd132b5fa62c010e3bdc4ee2a500adf82d3ced38f1175e2b00cd0afb", - "receipt": { - "to": null, - "from": "0x18394B52d3Cb931dfA76F63251919D051953413d", - "contractAddress": "0xB191d67F69e823445cD59e5A88953a82be73b9C6", - "transactionIndex": 1, - "gasUsed": "222304", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0x918daf79ddefb51f9a507188032a29c44ad2b8e42bd1d90fda2943895ad18806", - "transactionHash": "0xbb58732ffd132b5fa62c010e3bdc4ee2a500adf82d3ced38f1175e2b00cd0afb", - "logs": [], - "blockNumber": 24572909, - "cumulativeGasUsed": "267164", - "status": 1, - "byzantium": true - }, - "args": [ - "0xd56F695e73286ac252A37593DD4E7c14270eC1Df", - "OVM_L1ETHGateway" - ], - "solcInputHash": "5ee8e508e2c54cb5ac6783b4855b1558", - "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_implementationName\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"stateMutability\":\"payable\",\"type\":\"fallback\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_implementationName\":\"implementationName of the contract to proxy to.\",\"_libAddressManager\":\"Address of the Lib_AddressManager.\"}}},\"title\":\"Lib_ResolvedDelegateProxy\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/libraries/resolver/Lib_ResolvedDelegateProxy.sol\":\"Lib_ResolvedDelegateProxy\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor () internal {\\n address msgSender = _msgSender();\\n _owner = msgSender;\\n emit OwnershipTransferred(address(0), msgSender);\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n emit OwnershipTransferred(_owner, address(0));\\n _owner = address(0);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n emit OwnershipTransferred(_owner, newOwner);\\n _owner = newOwner;\\n }\\n}\\n\",\"keccak256\":\"0x15e2d5bd4c28a88548074c54d220e8086f638a71ed07e6b3ba5a70066fcf458d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with GSN meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address payable) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes memory) {\\n this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x8d3cb350f04ff49cfb10aef08d87f19dcbaecc8027b0bed12f3275cd12f38cf0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n public\\n onlyOwner\\n {\\n addresses[_getNameHash(_name)] = _address;\\n\\n emit AddressSet(\\n _name,\\n _address\\n );\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0x2ce671a0e004df88b136bea5a3c59d0732cea8887c8496da1d509e0200b03d7d\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_ResolvedDelegateProxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_ResolvedDelegateProxy\\n */\\ncontract Lib_ResolvedDelegateProxy {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n // Using mappings to store fields to avoid overwriting storage slots in the\\n // implementation contract. For example, instead of storing these fields at\\n // storage slot `0` & `1`, they are stored at `keccak256(key + slot)`.\\n // See: https://solidity.readthedocs.io/en/v0.7.0/internals/layout_in_storage.html\\n // NOTE: Do not use this code in your own contract system.\\n // There is a known flaw in this contract, and we will remove it from the repository\\n // in the near future. Due to the very limited way that we are using it, this flaw is\\n // not an issue in our system.\\n mapping (address => string) private implementationName;\\n mapping (address => Lib_AddressManager) private addressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n * @param _implementationName implementationName of the contract to proxy to.\\n */\\n constructor(\\n address _libAddressManager,\\n string memory _implementationName\\n ) {\\n addressManager[address(this)] = Lib_AddressManager(_libAddressManager);\\n implementationName[address(this)] = _implementationName;\\n }\\n\\n\\n /*********************\\n * Fallback Function *\\n *********************/\\n\\n fallback()\\n external\\n payable\\n {\\n address target = addressManager[address(this)].getAddress(\\n (implementationName[address(this)])\\n );\\n\\n require(\\n target != address(0),\\n \\\"Target address must be initialized.\\\"\\n );\\n\\n (bool success, bytes memory returndata) = target.delegatecall(msg.data);\\n\\n if (success == true) {\\n assembly {\\n return(add(returndata, 0x20), mload(returndata))\\n }\\n } else {\\n assembly {\\n revert(add(returndata, 0x20), mload(returndata))\\n }\\n }\\n }\\n}\\n\",\"keccak256\":\"0xfaecb051b37f1d87d588cafb17a575723cbdf7c3c2079772110f33e747e05027\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x608060405234801561001057600080fd5b506040516104083803806104088339818101604052604081101561003357600080fd5b81516020830180516040519294929383019291908464010000000082111561005a57600080fd5b90830190602082018581111561006f57600080fd5b825164010000000081118282018810171561008957600080fd5b82525081516020918201929091019080838360005b838110156100b657818101518382015260200161009e565b50505050905090810190601f1680156100e35780820380516001836020036101000a031916815260200191505b5060409081523060009081526001602090815282822080546001600160a01b0319166001600160a01b038a16179055818152919020855161012c95509093509085019150610134565b5050506101d5565b828054600181600116156101000203166002900490600052602060002090601f01602090048101928261016a57600085556101b0565b82601f1061018357805160ff19168380011785556101b0565b828001600101855582156101b0579182015b828111156101b0578251825591602001919060010190610195565b506101bc9291506101c0565b5090565b5b808211156101bc57600081556001016101c1565b610224806101e46000396000f3fe60806040818152306000908152600160208181528383205483825293832063bf40fac160e01b909552608490815284546002610100938216159390930260001901169190910460a481905291936001600160a01b039093169263bf40fac192909190819060c490849080156100b55780601f1061008a576101008083540402835291602001916100b5565b820191906000526020600020905b81548152906001019060200180831161009857829003601f168201915b50509250505060206040518083038186803b1580156100d357600080fd5b505afa1580156100e7573d6000803e3d6000fd5b505050506040513d60208110156100fd57600080fd5b505190506001600160a01b0381166101465760405162461bcd60e51b81526004018080602001828103825260238152602001806101cc6023913960400191505060405180910390fd5b600080826001600160a01b03166000366040518083838082843760405192019450600093509091505080830381855af49150503d80600081146101a5576040519150601f19603f3d011682016040523d82523d6000602084013e6101aa565b606091505b509092509050600182151514156101c357805160208201f35b805160208201fdfe5461726765742061646472657373206d75737420626520696e697469616c697a65642ea264697066735822122026d4992ed7562b49b7d3e306977cab94c29f8fb64a137b48d18960cc5ef1341d64736f6c63430007060033", - "deployedBytecode": "0x60806040818152306000908152600160208181528383205483825293832063bf40fac160e01b909552608490815284546002610100938216159390930260001901169190910460a481905291936001600160a01b039093169263bf40fac192909190819060c490849080156100b55780601f1061008a576101008083540402835291602001916100b5565b820191906000526020600020905b81548152906001019060200180831161009857829003601f168201915b50509250505060206040518083038186803b1580156100d357600080fd5b505afa1580156100e7573d6000803e3d6000fd5b505050506040513d60208110156100fd57600080fd5b505190506001600160a01b0381166101465760405162461bcd60e51b81526004018080602001828103825260238152602001806101cc6023913960400191505060405180910390fd5b600080826001600160a01b03166000366040518083838082843760405192019450600093509091505080830381855af49150503d80600081146101a5576040519150601f19603f3d011682016040523d82523d6000602084013e6101aa565b606091505b509092509050600182151514156101c357805160208201f35b805160208201fdfe5461726765742061646472657373206d75737420626520696e697469616c697a65642ea264697066735822122026d4992ed7562b49b7d3e306977cab94c29f8fb64a137b48d18960cc5ef1341d64736f6c63430007060033", - "devdoc": { - "kind": "dev", - "methods": { - "constructor": { - "params": { - "_implementationName": "implementationName of the contract to proxy to.", - "_libAddressManager": "Address of the Lib_AddressManager." - } - } - }, - "title": "Lib_ResolvedDelegateProxy", - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": {}, - "version": 1 - }, - "storageLayout": { - "storage": [ - { - "astId": 12837, - "contract": "contracts/optimistic-ethereum/libraries/resolver/Lib_ResolvedDelegateProxy.sol:Lib_ResolvedDelegateProxy", - "label": "implementationName", - "offset": 0, - "slot": "0", - "type": "t_mapping(t_address,t_string_storage)" - }, - { - "astId": 12841, - "contract": "contracts/optimistic-ethereum/libraries/resolver/Lib_ResolvedDelegateProxy.sol:Lib_ResolvedDelegateProxy", - "label": "addressManager", - "offset": 0, - "slot": "1", - "type": "t_mapping(t_address,t_contract(Lib_AddressManager)12793)" - } - ], - "types": { - "t_address": { - "encoding": "inplace", - "label": "address", - "numberOfBytes": "20" - }, - "t_contract(Lib_AddressManager)12793": { - "encoding": "inplace", - "label": "contract Lib_AddressManager", - "numberOfBytes": "20" - }, - "t_mapping(t_address,t_contract(Lib_AddressManager)12793)": { - "encoding": "mapping", - "key": "t_address", - "label": "mapping(address => contract Lib_AddressManager)", - "numberOfBytes": "32", - "value": "t_contract(Lib_AddressManager)12793" - }, - "t_mapping(t_address,t_string_storage)": { - "encoding": "mapping", - "key": "t_address", - "label": "mapping(address => string)", - "numberOfBytes": "32", - "value": "t_string_storage" - }, - "t_string_storage": { - "encoding": "bytes", - "label": "string", - "numberOfBytes": "32" - } - } - } -} \ No newline at end of file diff --git a/packages/contracts/deployments/kovan-v3/mockOVM_BondManager.json b/packages/contracts/deployments/kovan-v3/mockOVM_BondManager.json deleted file mode 100644 index 4ef5baaa33b78..0000000000000 --- a/packages/contracts/deployments/kovan-v3/mockOVM_BondManager.json +++ /dev/null @@ -1,242 +0,0 @@ -{ - "address": "0x8ECe272C9f83041bcb1Cd57AC49Ca6494776bE01", - "abi": [ - { - "inputs": [ - { - "internalType": "address", - "name": "_libAddressManager", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_who", - "type": "address" - } - ], - "name": "claim", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "deposit", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "_preStateRoot", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "_publisher", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_timestamp", - "type": "uint256" - } - ], - "name": "finalize", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "finalizeWithdrawal", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "name": "getGasSpent", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "pure", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_who", - "type": "address" - } - ], - "name": "isCollateralized", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "libAddressManager", - "outputs": [ - { - "internalType": "contract Lib_AddressManager", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "_preStateRoot", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "_txHash", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "_who", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_gasSpent", - "type": "uint256" - } - ], - "name": "recordGasSpent", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "string", - "name": "_name", - "type": "string" - } - ], - "name": "resolve", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "startWithdrawal", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - } - ], - "transactionHash": "0x51934b4913fc6cb446cb9b81b11c91393e8a00eb70ba44ac7fa1361fb8119deb", - "receipt": { - "to": null, - "from": "0x18394B52d3Cb931dfA76F63251919D051953413d", - "contractAddress": "0x8ECe272C9f83041bcb1Cd57AC49Ca6494776bE01", - "transactionIndex": 1, - "gasUsed": "297198", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0xd12c9c8a22bc6d6e515104cc5c8473933eb037f559f8ab725149f9dee9d5f25f", - "transactionHash": "0x51934b4913fc6cb446cb9b81b11c91393e8a00eb70ba44ac7fa1361fb8119deb", - "logs": [], - "blockNumber": 24572822, - "cumulativeGasUsed": "595662", - "status": 1, - "byzantium": true - }, - "args": [ - "0xd56F695e73286ac252A37593DD4E7c14270eC1Df" - ], - "solcInputHash": "5ee8e508e2c54cb5ac6783b4855b1558", - "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_who\",\"type\":\"address\"}],\"name\":\"claim\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"deposit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_preStateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"_publisher\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_timestamp\",\"type\":\"uint256\"}],\"name\":\"finalize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"finalizeWithdrawal\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"getGasSpent\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_who\",\"type\":\"address\"}],\"name\":\"isCollateralized\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_preStateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"_txHash\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"_who\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_gasSpent\",\"type\":\"uint256\"}],\"name\":\"recordGasSpent\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"startWithdrawal\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}}},\"title\":\"mockOVM_BondManager\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/mockOVM/verification/mockOVM_BondManager.sol\":\"mockOVM_BondManager\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor () internal {\\n address msgSender = _msgSender();\\n _owner = msgSender;\\n emit OwnershipTransferred(address(0), msgSender);\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n emit OwnershipTransferred(_owner, address(0));\\n _owner = address(0);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n emit OwnershipTransferred(_owner, newOwner);\\n _owner = newOwner;\\n }\\n}\\n\",\"keccak256\":\"0x15e2d5bd4c28a88548074c54d220e8086f638a71ed07e6b3ba5a70066fcf458d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with GSN meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address payable) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes memory) {\\n this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x8d3cb350f04ff49cfb10aef08d87f19dcbaecc8027b0bed12f3275cd12f38cf0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/verification/iOVM_BondManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\ninterface ERC20 {\\n function transfer(address, uint256) external returns (bool);\\n function transferFrom(address, address, uint256) external returns (bool);\\n}\\n\\n/// All the errors which may be encountered on the bond manager\\nlibrary Errors {\\n string constant ERC20_ERR = \\\"BondManager: Could not post bond\\\";\\n string constant ALREADY_FINALIZED = \\\"BondManager: Fraud proof for this pre-state root has already been finalized\\\";\\n string constant SLASHED = \\\"BondManager: Cannot finalize withdrawal, you probably got slashed\\\";\\n string constant WRONG_STATE = \\\"BondManager: Wrong bond state for proposer\\\";\\n string constant CANNOT_CLAIM = \\\"BondManager: Cannot claim yet. Dispute must be finalized first\\\";\\n\\n string constant WITHDRAWAL_PENDING = \\\"BondManager: Withdrawal already pending\\\";\\n string constant TOO_EARLY = \\\"BondManager: Too early to finalize your withdrawal\\\";\\n\\n string constant ONLY_TRANSITIONER = \\\"BondManager: Only the transitioner for this pre-state root may call this function\\\";\\n string constant ONLY_FRAUD_VERIFIER = \\\"BondManager: Only the fraud verifier may call this function\\\";\\n string constant ONLY_STATE_COMMITMENT_CHAIN = \\\"BondManager: Only the state commitment chain may call this function\\\";\\n string constant WAIT_FOR_DISPUTES = \\\"BondManager: Wait for other potential disputes\\\";\\n}\\n\\n/**\\n * @title iOVM_BondManager\\n */\\ninterface iOVM_BondManager {\\n\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n /// The lifecycle of a proposer's bond\\n enum State {\\n // Before depositing or after getting slashed, a user is uncollateralized\\n NOT_COLLATERALIZED,\\n // After depositing, a user is collateralized\\n COLLATERALIZED,\\n // After a user has initiated a withdrawal\\n WITHDRAWING\\n }\\n\\n /// A bond posted by a proposer\\n struct Bond {\\n // The user's state\\n State state;\\n // The timestamp at which a proposer issued their withdrawal request\\n uint32 withdrawalTimestamp;\\n // The time when the first disputed was initiated for this bond\\n uint256 firstDisputeAt;\\n // The earliest observed state root for this bond which has had fraud\\n bytes32 earliestDisputedStateRoot;\\n // The state root's timestamp\\n uint256 earliestTimestamp;\\n }\\n\\n // Per pre-state root, store the number of state provisions that were made\\n // and how many of these calls were made by each user. Payouts will then be\\n // claimed by users proportionally for that dispute.\\n struct Rewards {\\n // Flag to check if rewards for a fraud proof are claimable\\n bool canClaim;\\n // Total number of `recordGasSpent` calls made\\n uint256 total;\\n // The gas spent by each user to provide witness data. The sum of all\\n // values inside this map MUST be equal to the value of `total`\\n mapping(address => uint256) gasSpent;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function recordGasSpent(\\n bytes32 _preStateRoot,\\n bytes32 _txHash,\\n address _who,\\n uint256 _gasSpent\\n ) external;\\n\\n function finalize(\\n bytes32 _preStateRoot,\\n address _publisher,\\n uint256 _timestamp\\n ) external;\\n\\n function deposit() external;\\n\\n function startWithdrawal() external;\\n\\n function finalizeWithdrawal() external;\\n\\n function claim(\\n address _who\\n ) external;\\n\\n function isCollateralized(\\n address _who\\n ) external view returns (bool);\\n\\n function getGasSpent(\\n bytes32 _preStateRoot,\\n address _who\\n ) external view returns (uint256);\\n}\\n\",\"keccak256\":\"0x3c2a8a399487857158649db1896749d86e39cba545a8aeb2e2bb0f3bdfa7a5b1\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n public\\n onlyOwner\\n {\\n addresses[_getNameHash(_name)] = _address;\\n\\n emit AddressSet(\\n _name,\\n _address\\n );\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0x2ce671a0e004df88b136bea5a3c59d0732cea8887c8496da1d509e0200b03d7d\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(\\n address _libAddressManager\\n ) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x65981feeabff6a81783ea97d44baf988a18a86c8cb374c46fdb71819cbacc7c0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/mockOVM/verification/mockOVM_BondManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Interface Imports */\\nimport { iOVM_BondManager } from \\\"../../iOVM/verification/iOVM_BondManager.sol\\\";\\n\\n/* Contract Imports */\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/**\\n * @title mockOVM_BondManager\\n */\\ncontract mockOVM_BondManager is iOVM_BondManager, Lib_AddressResolver {\\n constructor(\\n address _libAddressManager\\n )\\n Lib_AddressResolver(_libAddressManager)\\n {}\\n\\n function recordGasSpent(\\n bytes32 _preStateRoot,\\n bytes32 _txHash,\\n address _who,\\n uint256 _gasSpent\\n )\\n override\\n public\\n {}\\n\\n function finalize(\\n bytes32 _preStateRoot,\\n address _publisher,\\n uint256 _timestamp\\n )\\n override\\n public\\n {}\\n\\n function deposit()\\n override\\n public\\n {}\\n\\n function startWithdrawal()\\n override\\n public\\n {}\\n\\n function finalizeWithdrawal()\\n override\\n public\\n {}\\n\\n function claim(\\n address _who\\n )\\n override\\n public\\n {}\\n\\n function isCollateralized(\\n address _who\\n )\\n override\\n public\\n view\\n returns (\\n bool\\n )\\n {\\n // Only authenticate sequencer to submit state root batches.\\n return _who == resolve(\\\"OVM_Proposer\\\");\\n }\\n\\n function getGasSpent(\\n bytes32, // _preStateRoot,\\n address // _who\\n )\\n override\\n public\\n pure\\n returns (\\n uint256\\n )\\n {\\n return 0;\\n }\\n}\\n\",\"keccak256\":\"0xe649b49573ba5babca407f116e97dc13f24bf677cbcd03824a2eb98a7750c4e8\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x608060405234801561001057600080fd5b506040516104673803806104678339818101604052602081101561003357600080fd5b5051600080546001600160a01b039092166001600160a01b0319909216919091179055610402806100656000396000f3fe608060405234801561001057600080fd5b506004361061009e5760003560e01c8063abfbbe1311610066578063abfbbe1314610207578063bc2f8dd814610239578063c5b6aa2f14610239578063d0e30db014610239578063dc6453dc146102415761009e565b806302ad4d2a146100a35780631e16e92f146100dd5780631e83409a14610117578063299ca4781461013d578063461a447814610161575b600080fd5b6100c9600480360360208110156100b957600080fd5b50356001600160a01b031661027f565b604080519115158252519081900360200190f35b610115600480360360808110156100f357600080fd5b508035906020810135906001600160a01b0360408201351690606001356102c9565b005b6101156004803603602081101561012d57600080fd5b50356001600160a01b03166102cf565b6101456102d2565b604080516001600160a01b039092168252519081900360200190f35b6101456004803603602081101561017757600080fd5b81019060208101813564010000000081111561019257600080fd5b8201836020820111156101a457600080fd5b803590602001918460018302840111640100000000831117156101c657600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506102e1945050505050565b6101156004803603606081101561021d57600080fd5b508035906001600160a01b0360208201351690604001356103bd565b6101156103c2565b61026d6004803603604081101561025757600080fd5b50803590602001356001600160a01b03166103c4565b60408051918252519081900360200190f35b60006102ae6040518060400160405280600c81526020016b27ab26afa83937b837b9b2b960a11b8152506102e1565b6001600160a01b0316826001600160a01b0316149050919050565b50505050565b50565b6000546001600160a01b031681565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b83811015610341578181015183820152602001610329565b50505050905090810190601f16801561036e5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561038b57600080fd5b505afa15801561039f573d6000803e3d6000fd5b505050506040513d60208110156103b557600080fd5b505192915050565b505050565b565b60009291505056fea264697066735822122023ce16ce6de3f7672940d40a33de4b777fbb7eaa3ec117bcace31640220db75d64736f6c63430007060033", - "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061009e5760003560e01c8063abfbbe1311610066578063abfbbe1314610207578063bc2f8dd814610239578063c5b6aa2f14610239578063d0e30db014610239578063dc6453dc146102415761009e565b806302ad4d2a146100a35780631e16e92f146100dd5780631e83409a14610117578063299ca4781461013d578063461a447814610161575b600080fd5b6100c9600480360360208110156100b957600080fd5b50356001600160a01b031661027f565b604080519115158252519081900360200190f35b610115600480360360808110156100f357600080fd5b508035906020810135906001600160a01b0360408201351690606001356102c9565b005b6101156004803603602081101561012d57600080fd5b50356001600160a01b03166102cf565b6101456102d2565b604080516001600160a01b039092168252519081900360200190f35b6101456004803603602081101561017757600080fd5b81019060208101813564010000000081111561019257600080fd5b8201836020820111156101a457600080fd5b803590602001918460018302840111640100000000831117156101c657600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506102e1945050505050565b6101156004803603606081101561021d57600080fd5b508035906001600160a01b0360208201351690604001356103bd565b6101156103c2565b61026d6004803603604081101561025757600080fd5b50803590602001356001600160a01b03166103c4565b60408051918252519081900360200190f35b60006102ae6040518060400160405280600c81526020016b27ab26afa83937b837b9b2b960a11b8152506102e1565b6001600160a01b0316826001600160a01b0316149050919050565b50505050565b50565b6000546001600160a01b031681565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b83811015610341578181015183820152602001610329565b50505050905090810190601f16801561036e5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561038b57600080fd5b505afa15801561039f573d6000803e3d6000fd5b505050506040513d60208110156103b557600080fd5b505192915050565b505050565b565b60009291505056fea264697066735822122023ce16ce6de3f7672940d40a33de4b777fbb7eaa3ec117bcace31640220db75d64736f6c63430007060033", - "devdoc": { - "kind": "dev", - "methods": { - "resolve(string)": { - "params": { - "_name": "Name to resolve an address for." - }, - "returns": { - "_0": "Address associated with the given name." - } - } - }, - "title": "mockOVM_BondManager", - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": { - "resolve(string)": { - "notice": "Resolves the address associated with a given name." - } - }, - "version": 1 - }, - "storageLayout": { - "storage": [ - { - "astId": 12800, - "contract": "contracts/optimistic-ethereum/mockOVM/verification/mockOVM_BondManager.sol:mockOVM_BondManager", - "label": "libAddressManager", - "offset": 0, - "slot": "0", - "type": "t_contract(Lib_AddressManager)12793" - } - ], - "types": { - "t_contract(Lib_AddressManager)12793": { - "encoding": "inplace", - "label": "contract Lib_AddressManager", - "numberOfBytes": "20" - } - } - } -} \ No newline at end of file diff --git a/packages/contracts/deployments/kovan/Lib_AddressManager.json b/packages/contracts/deployments/kovan/Lib_AddressManager.json index 370e9df1a7715..6f254b77797c1 100644 --- a/packages/contracts/deployments/kovan/Lib_AddressManager.json +++ b/packages/contracts/deployments/kovan/Lib_AddressManager.json @@ -1,5 +1,5 @@ { - "address": "0xFaf27b24ba54C6910C12CFF5C9453C0e8D634e05", + "address": "0xd56F695e73286ac252A37593DD4E7c14270eC1Df", "abi": [ { "anonymous": false, @@ -100,7 +100,7 @@ "inputs": [ { "internalType": "address", - "name": "_newOwner", + "name": "newOwner", "type": "address" } ], @@ -110,65 +110,96 @@ "type": "function" } ], - "transactionHash": "0x340254123e5f4a301056d2cd8741ef82cc1a2a80bb2632426861160b105d4844", + "transactionHash": "0x3f80c75882bf9b2b74d3153cdc8d205e473891a8056604c361c32822f88a1a04", "receipt": { "to": null, "from": "0x18394B52d3Cb931dfA76F63251919D051953413d", - "contractAddress": "0xFaf27b24ba54C6910C12CFF5C9453C0e8D634e05", - "transactionIndex": 0, - "gasUsed": "403788", - "logsBloom": "0x00000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000040000000000000000000000400000000000000000000000000001000000000000000000000000004000000000020000000000000000000800000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000040000000000000000000000000000000", - "blockHash": "0xdeee8a389bcb39a00c65846ba80ce91b69456e25cf1cc854d8c69554d090dcc9", - "transactionHash": "0x340254123e5f4a301056d2cd8741ef82cc1a2a80bb2632426861160b105d4844", + "contractAddress": "0xd56F695e73286ac252A37593DD4E7c14270eC1Df", + "transactionIndex": 5, + "gasUsed": "425977", + "logsBloom": "0x00000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000001000000000000000000000000020000000000020000000000000000000800000000000000000000000000000000400000000000000000000000000000000000000000000080000000000000000000000000000000000000010000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000020000080000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0x570e3192ef23218091f6ad7d48a122cd3d4dc06792cb1c4f6523bdbbe3d88b0c", + "transactionHash": "0x3f80c75882bf9b2b74d3153cdc8d205e473891a8056604c361c32822f88a1a04", "logs": [ { - "transactionIndex": 0, - "blockNumber": 24199460, - "transactionHash": "0x340254123e5f4a301056d2cd8741ef82cc1a2a80bb2632426861160b105d4844", - "address": "0xFaf27b24ba54C6910C12CFF5C9453C0e8D634e05", + "transactionIndex": 5, + "blockNumber": 24572757, + "transactionHash": "0x3f80c75882bf9b2b74d3153cdc8d205e473891a8056604c361c32822f88a1a04", + "address": "0xd56F695e73286ac252A37593DD4E7c14270eC1Df", "topics": [ "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x00000000000000000000000018394b52d3cb931dfa76f63251919d051953413d" ], "data": "0x", - "logIndex": 0, - "blockHash": "0xdeee8a389bcb39a00c65846ba80ce91b69456e25cf1cc854d8c69554d090dcc9" + "logIndex": 10, + "blockHash": "0x570e3192ef23218091f6ad7d48a122cd3d4dc06792cb1c4f6523bdbbe3d88b0c" } ], - "blockNumber": 24199460, - "cumulativeGasUsed": "403788", + "blockNumber": 24572757, + "cumulativeGasUsed": "863778", "status": 1, "byzantium": true }, "args": [], - "solcInputHash": "03aed03b958b1d37f90bd88d0f56dd85", - "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_newAddress\",\"type\":\"address\"}],\"name\":\"AddressSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"getAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"_address\",\"type\":\"address\"}],\"name\":\"setAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"title\":\"Lib_AddressManager\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":\"Lib_AddressManager\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Contract Imports */\\nimport { Ownable } from \\\"./Lib_Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n /*******************************************\\n * Contract Variables: Internal Accounting *\\n *******************************************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n public\\n onlyOwner\\n {\\n emit AddressSet(_name, _address);\\n addresses[_getNameHash(_name)] = _address;\\n }\\n\\n function getAddress(\\n string memory _name\\n )\\n public\\n view\\n returns (address)\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32 _hash\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0x3a490595cc21ff170e4027843093670ff845d5972481fbfb956b722ea564bb06\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Ownable\\n * @dev Adapted from https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol\\n */\\nabstract contract Ownable {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n address public owner;\\n\\n\\n /**********\\n * Events *\\n **********/\\n\\n event OwnershipTransferred(\\n address indexed previousOwner,\\n address indexed newOwner\\n );\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n constructor() {\\n owner = msg.sender;\\n emit OwnershipTransferred(address(0), owner);\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n owner == msg.sender,\\n \\\"Ownable: caller is not the owner\\\"\\n );\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function renounceOwnership()\\n public\\n virtual\\n onlyOwner\\n {\\n emit OwnershipTransferred(owner, address(0));\\n owner = address(0);\\n }\\n\\n function transferOwnership(address _newOwner)\\n public\\n virtual\\n onlyOwner\\n {\\n require(\\n _newOwner != address(0),\\n \\\"Ownable: new owner cannot be the zero address\\\"\\n );\\n\\n emit OwnershipTransferred(owner, _newOwner);\\n owner = _newOwner;\\n }\\n}\\n\",\"keccak256\":\"0xd9dfd9264e5b5fedd53a5b10fdf179c3f367614b0fe69179bce4e45119f5b739\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x608060405234801561001057600080fd5b50600080546001600160a01b03191633178082556040516001600160a01b039190911691907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a36105eb806100696000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c8063715018a61461005c5780638da5cb5b146100665780639b2ea4bd1461008a578063bf40fac11461013b578063f2fde38b146101e1575b600080fd5b610064610207565b005b61006e6102b0565b604080516001600160a01b039092168252519081900360200190f35b610064600480360360408110156100a057600080fd5b8101906020810181356401000000008111156100bb57600080fd5b8201836020820111156100cd57600080fd5b803590602001918460018302840111640100000000831117156100ef57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550505090356001600160a01b031691506102bf9050565b61006e6004803603602081101561015157600080fd5b81019060208101813564010000000081111561016c57600080fd5b82018360208201111561017e57600080fd5b803590602001918460018302840111640100000000831117156101a057600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061040c945050505050565b610064600480360360208110156101f757600080fd5b50356001600160a01b031661043b565b6000546001600160a01b03163314610266576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b031681565b6000546001600160a01b0316331461031e576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b7f188466739ff00cc68bfb2367d23ae4b855264264fe1624caa8884399af23454c82826040518080602001836001600160a01b03168152602001828103825284818151815260200191508051906020019080838360005b8381101561038d578181015183820152602001610375565b50505050905090810190601f1680156103ba5780820380516001836020036101000a031916815260200191505b50935050505060405180910390a180600160006103d68561053a565b815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b031602179055505050565b60006001600061041b8461053a565b81526020810191909152604001600020546001600160a01b031692915050565b6000546001600160a01b0316331461049a576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b0381166104df5760405162461bcd60e51b815260040180806020018281038252602d8152602001806105b2602d913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000816040516020018082805190602001908083835b6020831061056f5780518252601f199092019160209182019101610550565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120905091905056fe4f776e61626c653a206e6577206f776e65722063616e6e6f7420626520746865207a65726f2061646472657373a164736f6c6343000706000a", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100575760003560e01c8063715018a61461005c5780638da5cb5b146100665780639b2ea4bd1461008a578063bf40fac11461013b578063f2fde38b146101e1575b600080fd5b610064610207565b005b61006e6102b0565b604080516001600160a01b039092168252519081900360200190f35b610064600480360360408110156100a057600080fd5b8101906020810181356401000000008111156100bb57600080fd5b8201836020820111156100cd57600080fd5b803590602001918460018302840111640100000000831117156100ef57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550505090356001600160a01b031691506102bf9050565b61006e6004803603602081101561015157600080fd5b81019060208101813564010000000081111561016c57600080fd5b82018360208201111561017e57600080fd5b803590602001918460018302840111640100000000831117156101a057600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061040c945050505050565b610064600480360360208110156101f757600080fd5b50356001600160a01b031661043b565b6000546001600160a01b03163314610266576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b031681565b6000546001600160a01b0316331461031e576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b7f188466739ff00cc68bfb2367d23ae4b855264264fe1624caa8884399af23454c82826040518080602001836001600160a01b03168152602001828103825284818151815260200191508051906020019080838360005b8381101561038d578181015183820152602001610375565b50505050905090810190601f1680156103ba5780820380516001836020036101000a031916815260200191505b50935050505060405180910390a180600160006103d68561053a565b815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b031602179055505050565b60006001600061041b8461053a565b81526020810191909152604001600020546001600160a01b031692915050565b6000546001600160a01b0316331461049a576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b0381166104df5760405162461bcd60e51b815260040180806020018281038252602d8152602001806105b2602d913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000816040516020018082805190602001908083835b6020831061056f5780518252601f199092019160209182019101610550565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120905091905056fe4f776e61626c653a206e6577206f776e65722063616e6e6f7420626520746865207a65726f2061646472657373a164736f6c6343000706000a", + "solcInputHash": "5ee8e508e2c54cb5ac6783b4855b1558", + "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_newAddress\",\"type\":\"address\"}],\"name\":\"AddressSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"getAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"_address\",\"type\":\"address\"}],\"name\":\"setAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"getAddress(string)\":{\"params\":{\"_name\":\"Name to retrieve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner.\"},\"setAddress(string,address)\":{\"params\":{\"_address\":\"Address to associate with the name.\",\"_name\":\"String name to associate an address with.\"}},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"}},\"title\":\"Lib_AddressManager\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"getAddress(string)\":{\"notice\":\"Retrieves the address associated with a given name.\"},\"setAddress(string,address)\":{\"notice\":\"Changes the address associated with a particular name.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":\"Lib_AddressManager\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor () internal {\\n address msgSender = _msgSender();\\n _owner = msgSender;\\n emit OwnershipTransferred(address(0), msgSender);\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n emit OwnershipTransferred(_owner, address(0));\\n _owner = address(0);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n emit OwnershipTransferred(_owner, newOwner);\\n _owner = newOwner;\\n }\\n}\\n\",\"keccak256\":\"0x15e2d5bd4c28a88548074c54d220e8086f638a71ed07e6b3ba5a70066fcf458d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with GSN meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address payable) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes memory) {\\n this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x8d3cb350f04ff49cfb10aef08d87f19dcbaecc8027b0bed12f3275cd12f38cf0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n public\\n onlyOwner\\n {\\n addresses[_getNameHash(_name)] = _address;\\n\\n emit AddressSet(\\n _name,\\n _address\\n );\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0x2ce671a0e004df88b136bea5a3c59d0732cea8887c8496da1d509e0200b03d7d\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x608060405234801561001057600080fd5b50600061001b61006a565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35061006e565b3390565b6106508061007d6000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c8063715018a61461005c5780638da5cb5b146100665780639b2ea4bd1461008a578063bf40fac11461013b578063f2fde38b146101e1575b600080fd5b610064610207565b005b61006e6102c5565b604080516001600160a01b039092168252519081900360200190f35b610064600480360360408110156100a057600080fd5b8101906020810181356401000000008111156100bb57600080fd5b8201836020820111156100cd57600080fd5b803590602001918460018302840111640100000000831117156100ef57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550505090356001600160a01b031691506102d49050565b61006e6004803603602081101561015157600080fd5b81019060208101813564010000000081111561016c57600080fd5b82018360208201111561017e57600080fd5b803590602001918460018302840111640100000000831117156101a057600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610436945050505050565b610064600480360360208110156101f757600080fd5b50356001600160a01b0316610465565b61020f610579565b6001600160a01b03166102206102c5565b6001600160a01b03161461027b576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b031690565b6102dc610579565b6001600160a01b03166102ed6102c5565b6001600160a01b031614610348576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b80600160006103568561057d565b815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b031602179055507f188466739ff00cc68bfb2367d23ae4b855264264fe1624caa8884399af23454c82826040518080602001836001600160a01b03168152602001828103825284818151815260200191508051906020019080838360005b838110156103f75781810151838201526020016103df565b50505050905090810190601f1680156104245780820380516001836020036101000a031916815260200191505b50935050505060405180910390a15050565b6000600160006104458461057d565b81526020810191909152604001600020546001600160a01b031692915050565b61046d610579565b6001600160a01b031661047e6102c5565b6001600160a01b0316146104d9576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b03811661051e5760405162461bcd60e51b81526004018080602001828103825260268152602001806105f56026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b3390565b6000816040516020018082805190602001908083835b602083106105b25780518252601f199092019160209182019101610593565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120905091905056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373a26469706673582212209107a301dfba06b8649cc1baf4f5d6df1fb45110fdd8dc25d143490e81f3587e64736f6c63430007060033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100575760003560e01c8063715018a61461005c5780638da5cb5b146100665780639b2ea4bd1461008a578063bf40fac11461013b578063f2fde38b146101e1575b600080fd5b610064610207565b005b61006e6102c5565b604080516001600160a01b039092168252519081900360200190f35b610064600480360360408110156100a057600080fd5b8101906020810181356401000000008111156100bb57600080fd5b8201836020820111156100cd57600080fd5b803590602001918460018302840111640100000000831117156100ef57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550505090356001600160a01b031691506102d49050565b61006e6004803603602081101561015157600080fd5b81019060208101813564010000000081111561016c57600080fd5b82018360208201111561017e57600080fd5b803590602001918460018302840111640100000000831117156101a057600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610436945050505050565b610064600480360360208110156101f757600080fd5b50356001600160a01b0316610465565b61020f610579565b6001600160a01b03166102206102c5565b6001600160a01b03161461027b576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b031690565b6102dc610579565b6001600160a01b03166102ed6102c5565b6001600160a01b031614610348576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b80600160006103568561057d565b815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b031602179055507f188466739ff00cc68bfb2367d23ae4b855264264fe1624caa8884399af23454c82826040518080602001836001600160a01b03168152602001828103825284818151815260200191508051906020019080838360005b838110156103f75781810151838201526020016103df565b50505050905090810190601f1680156104245780820380516001836020036101000a031916815260200191505b50935050505060405180910390a15050565b6000600160006104458461057d565b81526020810191909152604001600020546001600160a01b031692915050565b61046d610579565b6001600160a01b031661047e6102c5565b6001600160a01b0316146104d9576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b03811661051e5760405162461bcd60e51b81526004018080602001828103825260268152602001806105f56026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b3390565b6000816040516020018082805190602001908083835b602083106105b25780518252601f199092019160209182019101610593565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120905091905056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373a26469706673582212209107a301dfba06b8649cc1baf4f5d6df1fb45110fdd8dc25d143490e81f3587e64736f6c63430007060033", "devdoc": { "kind": "dev", - "methods": {}, + "methods": { + "getAddress(string)": { + "params": { + "_name": "Name to retrieve an address for." + }, + "returns": { + "_0": "Address associated with the given name." + } + }, + "owner()": { + "details": "Returns the address of the current owner." + }, + "renounceOwnership()": { + "details": "Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner." + }, + "setAddress(string,address)": { + "params": { + "_address": "Address to associate with the name.", + "_name": "String name to associate an address with." + } + }, + "transferOwnership(address)": { + "details": "Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner." + } + }, "title": "Lib_AddressManager", "version": 1 }, "userdoc": { "kind": "user", - "methods": {}, + "methods": { + "getAddress(string)": { + "notice": "Retrieves the address associated with a given name." + }, + "setAddress(string,address)": { + "notice": "Changes the address associated with a particular name." + } + }, "version": 1 }, "storageLayout": { "storage": [ { - "astId": 12558, + "astId": 664, "contract": "contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol:Lib_AddressManager", - "label": "owner", + "label": "_owner", "offset": 0, "slot": "0", "type": "t_address" }, { - "astId": 12466, + "astId": 12737, "contract": "contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol:Lib_AddressManager", "label": "addresses", "offset": 0, diff --git a/packages/contracts/deployments/kovan/OVM_CanonicalTransactionChain.json b/packages/contracts/deployments/kovan/OVM_CanonicalTransactionChain.json index 28a7f03a027e9..16c213ccae639 100644 --- a/packages/contracts/deployments/kovan/OVM_CanonicalTransactionChain.json +++ b/packages/contracts/deployments/kovan/OVM_CanonicalTransactionChain.json @@ -1,5 +1,5 @@ { - "address": "0xeBD8F6ACF629f27AC7dDDD0603df3359a4f063E3", + "address": "0x895eabB95D684c15fa46Dc00a6b7557450083DEF", "abi": [ { "inputs": [ @@ -456,7 +456,7 @@ "outputs": [ { "internalType": "address", - "name": "_contract", + "name": "", "type": "address" } ], @@ -601,32 +601,32 @@ "type": "function" } ], - "transactionHash": "0xa0b030c7e123fbdd1a6c999558b83e8288bc91678a12b6b08a8f25a52d4255b6", + "transactionHash": "0x87f51aeb050ec2c556d14cdc38b30125a66e88689373f727d2f03debbc1313fd", "receipt": { "to": null, "from": "0x18394B52d3Cb931dfA76F63251919D051953413d", - "contractAddress": "0xeBD8F6ACF629f27AC7dDDD0603df3359a4f063E3", + "contractAddress": "0x895eabB95D684c15fa46Dc00a6b7557450083DEF", "transactionIndex": 1, - "gasUsed": "2814563", + "gasUsed": "2823402", "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0xc88ca5eaffd38fc8ed24d9a856ad2fa0c7bfaaa02fa2cb53d9da4fbe6d1bc876", - "transactionHash": "0xa0b030c7e123fbdd1a6c999558b83e8288bc91678a12b6b08a8f25a52d4255b6", + "blockHash": "0x611066b262d0e72ca9d3d3d00a26327bc03a751fe0ffa189133486a0bd7e3eac", + "transactionHash": "0x87f51aeb050ec2c556d14cdc38b30125a66e88689373f727d2f03debbc1313fd", "logs": [], - "blockNumber": 24199483, - "cumulativeGasUsed": "2881455", + "blockNumber": 24572808, + "cumulativeGasUsed": "2868217", "status": 1, "byzantium": true }, "args": [ - "0xFaf27b24ba54C6910C12CFF5C9453C0e8D634e05", - 315360000, - 21024000, + "0xd56F695e73286ac252A37593DD4E7c14270eC1Df", + 2592000, + 172800, 9000000 ], - "solcInputHash": "03aed03b958b1d37f90bd88d0f56dd85", - "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_forceInclusionPeriodSeconds\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_forceInclusionPeriodBlocks\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_maxTransactionGasLimit\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_startingQueueIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_numQueueElements\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_totalElements\",\"type\":\"uint256\"}],\"name\":\"QueueBatchAppended\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_startingQueueIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_numQueueElements\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_totalElements\",\"type\":\"uint256\"}],\"name\":\"SequencerBatchAppended\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_batchIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"_batchRoot\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_batchSize\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_prevTotalElements\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"_extraData\",\"type\":\"bytes\"}],\"name\":\"TransactionBatchAppended\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_l1TxOrigin\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_queueIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_timestamp\",\"type\":\"uint256\"}],\"name\":\"TransactionEnqueued\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"L2_GAS_DISCOUNT_DIVISOR\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAX_ROLLUP_TX_SIZE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MIN_ROLLUP_TX_GAS\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"appendQueueBatch\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"appendSequencerBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"batches\",\"outputs\":[{\"internalType\":\"contract iOVM_ChainStorageContainer\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"enqueue\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"forceInclusionPeriodBlocks\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"forceInclusionPeriodSeconds\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLastBlockNumber\",\"outputs\":[{\"internalType\":\"uint40\",\"name\":\"\",\"type\":\"uint40\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLastTimestamp\",\"outputs\":[{\"internalType\":\"uint40\",\"name\":\"\",\"type\":\"uint40\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getNextQueueIndex\",\"outputs\":[{\"internalType\":\"uint40\",\"name\":\"\",\"type\":\"uint40\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getNumPendingQueueElements\",\"outputs\":[{\"internalType\":\"uint40\",\"name\":\"\",\"type\":\"uint40\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"getQueueElement\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"transactionHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint40\",\"name\":\"timestamp\",\"type\":\"uint40\"},{\"internalType\":\"uint40\",\"name\":\"blockNumber\",\"type\":\"uint40\"}],\"internalType\":\"struct Lib_OVMCodec.QueueElement\",\"name\":\"_element\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getQueueLength\",\"outputs\":[{\"internalType\":\"uint40\",\"name\":\"\",\"type\":\"uint40\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTotalBatches\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_totalBatches\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTotalElements\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_totalElements\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maxTransactionGasLimit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"queue\",\"outputs\":[{\"internalType\":\"contract iOVM_ChainStorageContainer\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"_contract\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"enum Lib_OVMCodec.QueueOrigin\",\"name\":\"l1QueueOrigin\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"l1TxOrigin\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"entrypoint\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.Transaction\",\"name\":\"_transaction\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isSequenced\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"queueIndex\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"txData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.TransactionChainElement\",\"name\":\"_txChainElement\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"_batchHeader\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"siblings\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct Lib_OVMCodec.ChainInclusionProof\",\"name\":\"_inclusionProof\",\"type\":\"tuple\"}],\"name\":\"verifyTransaction\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The Canonical Transaction Chain (CTC) contract is an append-only log of transactions which must be applied to the rollup state. It defines the ordering of rollup transactions by writing them to the 'CTC:batches' instance of the Chain Storage Container. The CTC also allows any account to 'enqueue' an L2 transaction, which will require that the Sequencer will eventually append it to the rollup state. If the Sequencer does not include an enqueued transaction within the 'force inclusion period', then any account may force it to be included by calling appendQueueBatch(). Compiler used: solc Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"appendSequencerBatch()\":{\"details\":\"This function uses a custom encoding scheme for efficiency reasons. .param _shouldStartAtElement Specific batch we expect to start appending to. .param _totalElementsToAppend Total number of batch elements we expect to append. .param _contexts Array of batch contexts. .param _transactionDataFields Array of raw transaction data.\"},\"batches()\":{\"returns\":{\"_0\":\"Reference to the batch storage container.\"}},\"enqueue(address,uint256,bytes)\":{\"params\":{\"_data\":\"Transaction data.\",\"_gasLimit\":\"Gas limit for the enqueued L2 transaction.\",\"_target\":\"Target L2 contract to send the transaction to.\"}},\"getLastBlockNumber()\":{\"returns\":{\"_0\":\"Blocknumber for the last transaction.\"}},\"getLastTimestamp()\":{\"returns\":{\"_0\":\"Timestamp for the last transaction.\"}},\"getNextQueueIndex()\":{\"returns\":{\"_0\":\"Index for the next queue element.\"}},\"getNumPendingQueueElements()\":{\"returns\":{\"_0\":\"Number of pending queue elements.\"}},\"getQueueElement(uint256)\":{\"params\":{\"_index\":\"Index of the queue element to access.\"},\"returns\":{\"_element\":\"Queue element at the given index.\"}},\"getQueueLength()\":{\"returns\":{\"_0\":\"Length of the queue.\"}},\"getTotalBatches()\":{\"returns\":{\"_totalBatches\":\"Total submitted batches.\"}},\"getTotalElements()\":{\"returns\":{\"_totalElements\":\"Total submitted elements.\"}},\"queue()\":{\"returns\":{\"_0\":\"Reference to the queue storage container.\"}},\"verifyTransaction((uint256,uint256,uint8,address,address,uint256,bytes),(bool,uint256,uint256,uint256,bytes),(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))\":{\"params\":{\"_batchHeader\":\"Header of the batch the transaction was included in.\",\"_inclusionProof\":\"Inclusion proof for the provided transaction chain element.\",\"_transaction\":\"Transaction to verify.\",\"_txChainElement\":\"Transaction chain element corresponding to the transaction.\"},\"returns\":{\"_0\":\"True if the transaction exists in the CTC, false if not.\"}}},\"title\":\"OVM_CanonicalTransactionChain\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"appendQueueBatch(uint256)\":{\"notice\":\"Appends a given number of queued transactions as a single batch. param _numQueuedTransactions Number of transactions to append.\"},\"appendSequencerBatch()\":{\"notice\":\"Allows the sequencer to append a batch of transactions.\"},\"batches()\":{\"notice\":\"Accesses the batch storage container.\"},\"enqueue(address,uint256,bytes)\":{\"notice\":\"Adds a transaction to the queue.\"},\"getLastBlockNumber()\":{\"notice\":\"Returns the blocknumber of the last transaction.\"},\"getLastTimestamp()\":{\"notice\":\"Returns the timestamp of the last transaction.\"},\"getNextQueueIndex()\":{\"notice\":\"Returns the index of the next element to be enqueued.\"},\"getNumPendingQueueElements()\":{\"notice\":\"Get the number of queue elements which have not yet been included.\"},\"getQueueElement(uint256)\":{\"notice\":\"Gets the queue element at a particular index.\"},\"getQueueLength()\":{\"notice\":\"Retrieves the length of the queue, including both pending and canonical transactions.\"},\"getTotalBatches()\":{\"notice\":\"Retrieves the total number of batches submitted.\"},\"getTotalElements()\":{\"notice\":\"Retrieves the total number of elements submitted.\"},\"queue()\":{\"notice\":\"Accesses the queue storage container.\"},\"verifyTransaction((uint256,uint256,uint8,address,address,uint256,bytes),(bool,uint256,uint256,uint256,bytes),(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))\":{\"notice\":\"Verifies whether a transaction is included in the chain.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/OVM/chain/OVM_CanonicalTransactionChain.sol\":\"OVM_CanonicalTransactionChain\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/optimistic-ethereum/OVM/accounts/OVM_ECDSAContractAccount.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Interface Imports */\\nimport { iOVM_ECDSAContractAccount } from \\\"../../iOVM/accounts/iOVM_ECDSAContractAccount.sol\\\";\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { Lib_ECDSAUtils } from \\\"../../libraries/utils/Lib_ECDSAUtils.sol\\\";\\nimport { Lib_SafeExecutionManagerWrapper } from \\\"../../libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\\\";\\nimport { Lib_SafeMathWrapper } from \\\"../../libraries/wrappers/Lib_SafeMathWrapper.sol\\\";\\n\\n/**\\n * @title OVM_ECDSAContractAccount\\n * @dev The ECDSA Contract Account can be used as the implementation for a ProxyEOA deployed by the\\n * ovmCREATEEOA operation. It enables backwards compatibility with Ethereum's Layer 1, by \\n * providing eth_sign and EIP155 formatted transaction encodings.\\n *\\n * Compiler used: solc\\n * Runtime target: OVM\\n */\\ncontract OVM_ECDSAContractAccount is iOVM_ECDSAContractAccount {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n // TODO: should be the amount sufficient to cover the gas costs of all of the transactions up\\n // to and including the CALL/CREATE which forms the entrypoint of the transaction.\\n uint256 constant EXECUTION_VALIDATION_GAS_OVERHEAD = 25000;\\n address constant ETH_ERC20_ADDRESS = 0x4200000000000000000000000000000000000006;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Executes a signed transaction.\\n * @param _transaction Signed EOA transaction.\\n * @param _signatureType Hashing scheme used for the transaction (e.g., ETH signed message).\\n * @param _v Signature `v` parameter.\\n * @param _r Signature `r` parameter.\\n * @param _s Signature `s` parameter.\\n * @return Whether or not the call returned (rather than reverted).\\n * @return Data returned by the call.\\n */\\n function execute(\\n bytes memory _transaction,\\n Lib_OVMCodec.EOASignatureType _signatureType,\\n uint8 _v,\\n bytes32 _r,\\n bytes32 _s\\n )\\n override\\n public\\n returns (\\n bool,\\n bytes memory\\n )\\n {\\n bool isEthSign = _signatureType == Lib_OVMCodec.EOASignatureType.ETH_SIGNED_MESSAGE;\\n\\n // Address of this contract within the ovm (ovmADDRESS) should be the same as the\\n // recovered address of the user who signed this message. This is how we manage to shim\\n // account abstraction even though the user isn't a contract.\\n // Need to make sure that the transaction nonce is right and bump it if so.\\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(\\n Lib_ECDSAUtils.recover(\\n _transaction,\\n isEthSign,\\n _v,\\n _r,\\n _s\\n ) == Lib_SafeExecutionManagerWrapper.safeADDRESS(),\\n \\\"Signature provided for EOA transaction execution is invalid.\\\"\\n );\\n\\n Lib_OVMCodec.EIP155Transaction memory decodedTx = Lib_OVMCodec.decodeEIP155Transaction(_transaction, isEthSign);\\n\\n // Need to make sure that the transaction chainId is correct.\\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(\\n decodedTx.chainId == Lib_SafeExecutionManagerWrapper.safeCHAINID(),\\n \\\"Transaction chainId does not match expected OVM chainId.\\\"\\n );\\n\\n // Need to make sure that the transaction nonce is right.\\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(\\n decodedTx.nonce == Lib_SafeExecutionManagerWrapper.safeGETNONCE(),\\n \\\"Transaction nonce does not match the expected nonce.\\\"\\n );\\n\\n // TEMPORARY: Disable gas checks for mainnet.\\n // // Need to make sure that the gas is sufficient to execute the transaction.\\n // Lib_SafeExecutionManagerWrapper.safeREQUIRE(\\n // gasleft() >= Lib_SafeMathWrapper.add(decodedTx.gasLimit, EXECUTION_VALIDATION_GAS_OVERHEAD),\\n // \\\"Gas is not sufficient to execute the transaction.\\\"\\n // );\\n\\n // Transfer fee to relayer.\\n address relayer = Lib_SafeExecutionManagerWrapper.safeCALLER();\\n uint256 fee = Lib_SafeMathWrapper.mul(decodedTx.gasLimit, decodedTx.gasPrice);\\n (bool success, ) = Lib_SafeExecutionManagerWrapper.safeCALL(\\n gasleft(),\\n ETH_ERC20_ADDRESS,\\n abi.encodeWithSignature(\\\"transfer(address,uint256)\\\", relayer, fee)\\n );\\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(\\n success == true,\\n \\\"Fee was not transferred to relayer.\\\"\\n );\\n\\n // Contract creations are signalled by sending a transaction to the zero address.\\n if (decodedTx.to == address(0)) {\\n (address created, bytes memory revertData) = Lib_SafeExecutionManagerWrapper.safeCREATE(\\n gasleft(),\\n decodedTx.data\\n );\\n\\n // Return true if the contract creation succeeded, false w/ revertData otherwise.\\n if (created != address(0)) {\\n return (true, abi.encode(created));\\n } else {\\n return (false, revertData);\\n }\\n } else {\\n // We only want to bump the nonce for `ovmCALL` because `ovmCREATE` automatically bumps\\n // the nonce of the calling account. Normally an EOA would bump the nonce for both\\n // cases, but since this is a contract we'd end up bumping the nonce twice.\\n Lib_SafeExecutionManagerWrapper.safeINCREMENTNONCE();\\n\\n return Lib_SafeExecutionManagerWrapper.safeCALL(\\n gasleft(),\\n decodedTx.to,\\n decodedTx.data\\n );\\n }\\n }\\n}\\n\",\"keccak256\":\"0xcba0b593ad36291ec3d8c61ca254057c1bdcf1c9debf8ef920add32a51b14817\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/accounts/OVM_ProxyEOA.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_Bytes32Utils } from \\\"../../libraries/utils/Lib_Bytes32Utils.sol\\\";\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { Lib_ECDSAUtils } from \\\"../../libraries/utils/Lib_ECDSAUtils.sol\\\";\\nimport { Lib_SafeExecutionManagerWrapper } from \\\"../../libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\\\";\\n\\n/**\\n * @title OVM_ProxyEOA\\n * @dev The Proxy EOA contract uses a delegate call to execute the logic in an implementation contract.\\n * In combination with the logic implemented in the ECDSA Contract Account, this enables a form of upgradable \\n * 'account abstraction' on layer 2. \\n * \\n * Compiler used: solc\\n * Runtime target: OVM\\n */\\ncontract OVM_ProxyEOA {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n bytes32 constant IMPLEMENTATION_KEY = 0xdeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddead;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _implementation Address of the initial implementation contract.\\n */\\n constructor(\\n address _implementation\\n )\\n {\\n _setImplementation(_implementation);\\n }\\n\\n\\n /*********************\\n * Fallback Function *\\n *********************/\\n\\n fallback()\\n external\\n {\\n (bool success, bytes memory returndata) = Lib_SafeExecutionManagerWrapper.safeDELEGATECALL(\\n gasleft(),\\n getImplementation(),\\n msg.data\\n );\\n\\n if (success) {\\n assembly {\\n return(add(returndata, 0x20), mload(returndata))\\n }\\n } else {\\n Lib_SafeExecutionManagerWrapper.safeREVERT(\\n string(returndata)\\n );\\n }\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the implementation address.\\n * @param _implementation New implementation address.\\n */\\n function upgrade(\\n address _implementation\\n )\\n external\\n {\\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(\\n Lib_SafeExecutionManagerWrapper.safeADDRESS() == Lib_SafeExecutionManagerWrapper.safeCALLER(),\\n \\\"EOAs can only upgrade their own EOA implementation\\\"\\n );\\n\\n _setImplementation(_implementation);\\n }\\n\\n /**\\n * Gets the address of the current implementation.\\n * @return Current implementation address.\\n */\\n function getImplementation()\\n public\\n returns (\\n address\\n )\\n {\\n return Lib_Bytes32Utils.toAddress(\\n Lib_SafeExecutionManagerWrapper.safeSLOAD(\\n IMPLEMENTATION_KEY\\n )\\n );\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function _setImplementation(\\n address _implementation\\n )\\n internal\\n {\\n Lib_SafeExecutionManagerWrapper.safeSSTORE(\\n IMPLEMENTATION_KEY,\\n Lib_Bytes32Utils.fromAddress(_implementation)\\n );\\n }\\n}\\n\",\"keccak256\":\"0x220433074300f98c50f923df76050fbaa548e83926351b7a27f379aa851f70ec\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/chain/OVM_CanonicalTransactionChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// @unsupported: ovm\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\nimport { Lib_MerkleTree } from \\\"../../libraries/utils/Lib_MerkleTree.sol\\\";\\nimport { Lib_Math } from \\\"../../libraries/utils/Lib_Math.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_CanonicalTransactionChain } from \\\"../../iOVM/chain/iOVM_CanonicalTransactionChain.sol\\\";\\nimport { iOVM_ChainStorageContainer } from \\\"../../iOVM/chain/iOVM_ChainStorageContainer.sol\\\";\\n\\n/* Contract Imports */\\nimport { OVM_ExecutionManager } from \\\"../execution/OVM_ExecutionManager.sol\\\";\\n\\n\\n/**\\n * @title OVM_CanonicalTransactionChain\\n * @dev The Canonical Transaction Chain (CTC) contract is an append-only log of transactions\\n * which must be applied to the rollup state. It defines the ordering of rollup transactions by\\n * writing them to the 'CTC:batches' instance of the Chain Storage Container.\\n * The CTC also allows any account to 'enqueue' an L2 transaction, which will require that the Sequencer\\n * will eventually append it to the rollup state.\\n * If the Sequencer does not include an enqueued transaction within the 'force inclusion period',\\n * then any account may force it to be included by calling appendQueueBatch().\\n *\\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract OVM_CanonicalTransactionChain is iOVM_CanonicalTransactionChain, Lib_AddressResolver {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n // L2 tx gas-related\\n uint256 constant public MIN_ROLLUP_TX_GAS = 100000;\\n uint256 constant public MAX_ROLLUP_TX_SIZE = 50000;\\n uint256 constant public L2_GAS_DISCOUNT_DIVISOR = 32;\\n\\n // Encoding-related (all in bytes)\\n uint256 constant internal BATCH_CONTEXT_SIZE = 16;\\n uint256 constant internal BATCH_CONTEXT_LENGTH_POS = 12;\\n uint256 constant internal BATCH_CONTEXT_START_POS = 15;\\n uint256 constant internal TX_DATA_HEADER_SIZE = 3;\\n uint256 constant internal BYTES_TILL_TX_DATA = 65;\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n uint256 public forceInclusionPeriodSeconds;\\n uint256 public forceInclusionPeriodBlocks;\\n uint256 public maxTransactionGasLimit;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n constructor(\\n address _libAddressManager,\\n uint256 _forceInclusionPeriodSeconds,\\n uint256 _forceInclusionPeriodBlocks,\\n uint256 _maxTransactionGasLimit\\n )\\n Lib_AddressResolver(_libAddressManager)\\n {\\n forceInclusionPeriodSeconds = _forceInclusionPeriodSeconds;\\n forceInclusionPeriodBlocks = _forceInclusionPeriodBlocks;\\n maxTransactionGasLimit = _maxTransactionGasLimit;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Accesses the batch storage container.\\n * @return Reference to the batch storage container.\\n */\\n function batches()\\n override\\n public\\n view\\n returns (\\n iOVM_ChainStorageContainer\\n )\\n {\\n return iOVM_ChainStorageContainer(\\n resolve(\\\"OVM_ChainStorageContainer:CTC:batches\\\")\\n );\\n }\\n\\n /**\\n * Accesses the queue storage container.\\n * @return Reference to the queue storage container.\\n */\\n function queue()\\n override\\n public\\n view\\n returns (\\n iOVM_ChainStorageContainer\\n )\\n {\\n return iOVM_ChainStorageContainer(\\n resolve(\\\"OVM_ChainStorageContainer:CTC:queue\\\")\\n );\\n }\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements()\\n override\\n public\\n view\\n returns (\\n uint256 _totalElements\\n )\\n {\\n (uint40 totalElements,,,) = _getBatchExtraData();\\n return uint256(totalElements);\\n }\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches()\\n override\\n public\\n view\\n returns (\\n uint256 _totalBatches\\n )\\n {\\n return batches().length();\\n }\\n\\n /**\\n * Returns the index of the next element to be enqueued.\\n * @return Index for the next queue element.\\n */\\n function getNextQueueIndex()\\n override\\n public\\n view\\n returns (\\n uint40\\n )\\n {\\n (,uint40 nextQueueIndex,,) = _getBatchExtraData();\\n return nextQueueIndex;\\n }\\n\\n /**\\n * Returns the timestamp of the last transaction.\\n * @return Timestamp for the last transaction.\\n */\\n function getLastTimestamp()\\n override\\n public\\n view\\n returns (\\n uint40\\n )\\n {\\n (,,uint40 lastTimestamp,) = _getBatchExtraData();\\n return lastTimestamp;\\n }\\n\\n /**\\n * Returns the blocknumber of the last transaction.\\n * @return Blocknumber for the last transaction.\\n */\\n function getLastBlockNumber()\\n override\\n public\\n view\\n returns (\\n uint40\\n )\\n {\\n (,,,uint40 lastBlockNumber) = _getBatchExtraData();\\n return lastBlockNumber;\\n }\\n\\n /**\\n * Gets the queue element at a particular index.\\n * @param _index Index of the queue element to access.\\n * @return _element Queue element at the given index.\\n */\\n function getQueueElement(\\n uint256 _index\\n )\\n override\\n public\\n view\\n returns (\\n Lib_OVMCodec.QueueElement memory _element\\n )\\n {\\n return _getQueueElement(\\n _index,\\n queue()\\n );\\n }\\n\\n /**\\n * Get the number of queue elements which have not yet been included.\\n * @return Number of pending queue elements.\\n */\\n function getNumPendingQueueElements()\\n override\\n public\\n view\\n returns (\\n uint40\\n )\\n {\\n return getQueueLength() - getNextQueueIndex();\\n }\\n\\n /**\\n * Retrieves the length of the queue, including\\n * both pending and canonical transactions.\\n * @return Length of the queue.\\n */\\n function getQueueLength()\\n override\\n public\\n view\\n returns (\\n uint40\\n )\\n {\\n return _getQueueLength(\\n queue()\\n );\\n }\\n\\n /**\\n * Adds a transaction to the queue.\\n * @param _target Target L2 contract to send the transaction to.\\n * @param _gasLimit Gas limit for the enqueued L2 transaction.\\n * @param _data Transaction data.\\n */\\n function enqueue(\\n address _target,\\n uint256 _gasLimit,\\n bytes memory _data\\n )\\n override\\n public\\n {\\n require(\\n _data.length <= MAX_ROLLUP_TX_SIZE,\\n \\\"Transaction data size exceeds maximum for rollup transaction.\\\"\\n );\\n\\n require(\\n _gasLimit <= maxTransactionGasLimit,\\n \\\"Transaction gas limit exceeds maximum for rollup transaction.\\\"\\n );\\n\\n require(\\n _gasLimit >= MIN_ROLLUP_TX_GAS,\\n \\\"Transaction gas limit too low to enqueue.\\\"\\n );\\n\\n // We need to consume some amount of L1 gas in order to rate limit transactions going into\\n // L2. However, L2 is cheaper than L1 so we only need to burn some small proportion of the\\n // provided L1 gas.\\n uint256 gasToConsume = _gasLimit/L2_GAS_DISCOUNT_DIVISOR;\\n uint256 startingGas = gasleft();\\n\\n // Although this check is not necessary (burn below will run out of gas if not true), it\\n // gives the user an explicit reason as to why the enqueue attempt failed.\\n require(\\n startingGas > gasToConsume,\\n \\\"Insufficient gas for L2 rate limiting burn.\\\"\\n );\\n\\n // Here we do some \\\"dumb\\\" work in order to burn gas, although we should probably replace\\n // this with something like minting gas token later on.\\n uint256 i;\\n while(startingGas - gasleft() < gasToConsume) {\\n i++;\\n }\\n\\n bytes32 transactionHash = keccak256(\\n abi.encode(\\n msg.sender,\\n _target,\\n _gasLimit,\\n _data\\n )\\n );\\n\\n bytes32 timestampAndBlockNumber;\\n assembly {\\n timestampAndBlockNumber := timestamp()\\n timestampAndBlockNumber := or(timestampAndBlockNumber, shl(40, number()))\\n }\\n\\n iOVM_ChainStorageContainer queueRef = queue();\\n\\n queueRef.push(transactionHash);\\n queueRef.push(timestampAndBlockNumber);\\n\\n // The underlying queue data structure stores 2 elements\\n // per insertion, so to get the real queue length we need\\n // to divide by 2 and subtract 1.\\n uint256 queueIndex = queueRef.length() / 2 - 1;\\n emit TransactionEnqueued(\\n msg.sender,\\n _target,\\n _gasLimit,\\n _data,\\n queueIndex,\\n block.timestamp\\n );\\n }\\n\\n /**\\n * Appends a given number of queued transactions as a single batch.\\n * param _numQueuedTransactions Number of transactions to append.\\n */\\n function appendQueueBatch(\\n uint256 // _numQueuedTransactions\\n )\\n override\\n public\\n pure\\n {\\n // TEMPORARY: Disable `appendQueueBatch` for minnet\\n revert(\\\"appendQueueBatch is currently disabled.\\\");\\n\\n // _numQueuedTransactions = Lib_Math.min(_numQueuedTransactions, getNumPendingQueueElements());\\n // require(\\n // _numQueuedTransactions > 0,\\n // \\\"Must append more than zero transactions.\\\"\\n // );\\n\\n // bytes32[] memory leaves = new bytes32[](_numQueuedTransactions);\\n // uint40 nextQueueIndex = getNextQueueIndex();\\n\\n // for (uint256 i = 0; i < _numQueuedTransactions; i++) {\\n // if (msg.sender != resolve(\\\"OVM_Sequencer\\\")) {\\n // Lib_OVMCodec.QueueElement memory el = getQueueElement(nextQueueIndex);\\n // require(\\n // el.timestamp + forceInclusionPeriodSeconds < block.timestamp,\\n // \\\"Queue transactions cannot be submitted during the sequencer inclusion period.\\\"\\n // );\\n // }\\n // leaves[i] = _getQueueLeafHash(nextQueueIndex);\\n // nextQueueIndex++;\\n // }\\n\\n // Lib_OVMCodec.QueueElement memory lastElement = getQueueElement(nextQueueIndex - 1);\\n\\n // _appendBatch(\\n // Lib_MerkleTree.getMerkleRoot(leaves),\\n // _numQueuedTransactions,\\n // _numQueuedTransactions,\\n // lastElement.timestamp,\\n // lastElement.blockNumber\\n // );\\n\\n // emit QueueBatchAppended(\\n // nextQueueIndex - _numQueuedTransactions,\\n // _numQueuedTransactions,\\n // getTotalElements()\\n // );\\n }\\n\\n /**\\n * Allows the sequencer to append a batch of transactions.\\n * @dev This function uses a custom encoding scheme for efficiency reasons.\\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\\n * .param _contexts Array of batch contexts.\\n * .param _transactionDataFields Array of raw transaction data.\\n */\\n function appendSequencerBatch()\\n override\\n public\\n {\\n uint40 shouldStartAtElement;\\n uint24 totalElementsToAppend;\\n uint24 numContexts;\\n assembly {\\n shouldStartAtElement := shr(216, calldataload(4))\\n totalElementsToAppend := shr(232, calldataload(9))\\n numContexts := shr(232, calldataload(12))\\n }\\n\\n require(\\n shouldStartAtElement == getTotalElements(),\\n \\\"Actual batch start index does not match expected start index.\\\"\\n );\\n\\n require(\\n msg.sender == resolve(\\\"OVM_Sequencer\\\"),\\n \\\"Function can only be called by the Sequencer.\\\"\\n );\\n\\n require(\\n numContexts > 0,\\n \\\"Must provide at least one batch context.\\\"\\n );\\n\\n require(\\n totalElementsToAppend > 0,\\n \\\"Must append at least one element.\\\"\\n );\\n\\n uint40 nextTransactionPtr = uint40(BATCH_CONTEXT_START_POS + BATCH_CONTEXT_SIZE * numContexts);\\n\\n require(\\n msg.data.length >= nextTransactionPtr,\\n \\\"Not enough BatchContexts provided.\\\"\\n );\\n\\n // Take a reference to the queue and its length so we don't have to keep resolving it.\\n // Length isn't going to change during the course of execution, so it's fine to simply\\n // resolve this once at the start. Saves gas.\\n iOVM_ChainStorageContainer queueRef = queue();\\n uint40 queueLength = _getQueueLength(queueRef);\\n\\n // Reserve some memory to save gas on hashing later on. This is a relatively safe estimate\\n // for the average transaction size that will prevent having to resize this chunk of memory\\n // later on. Saves gas.\\n bytes memory hashMemory = new bytes((msg.data.length / totalElementsToAppend) * 2);\\n\\n // Initialize the array of canonical chain leaves that we will append.\\n bytes32[] memory leaves = new bytes32[](totalElementsToAppend);\\n\\n // Each leaf index corresponds to a tx, either sequenced or enqueued.\\n uint32 leafIndex = 0;\\n\\n // Counter for number of sequencer transactions appended so far.\\n uint32 numSequencerTransactions = 0;\\n\\n // We will sequentially append leaves which are pointers to the queue.\\n // The initial queue index is what is currently in storage.\\n uint40 nextQueueIndex = getNextQueueIndex();\\n\\n BatchContext memory curContext;\\n for (uint32 i = 0; i < numContexts; i++) {\\n BatchContext memory nextContext = _getBatchContext(i);\\n\\n if (i == 0) {\\n // Execute a special check for the first batch.\\n _validateFirstBatchContext(nextContext);\\n }\\n\\n // Execute this check on every single batch, including the first one.\\n _validateNextBatchContext(\\n curContext,\\n nextContext,\\n nextQueueIndex,\\n queueRef\\n );\\n\\n // Now we can update our current context.\\n curContext = nextContext;\\n\\n // Process sequencer transactions first.\\n for (uint32 j = 0; j < curContext.numSequencedTransactions; j++) {\\n uint256 txDataLength;\\n assembly {\\n txDataLength := shr(232, calldataload(nextTransactionPtr))\\n }\\n require(\\n txDataLength <= MAX_ROLLUP_TX_SIZE,\\n \\\"Transaction data size exceeds maximum for rollup transaction.\\\"\\n );\\n\\n leaves[leafIndex] = _getSequencerLeafHash(\\n curContext,\\n nextTransactionPtr,\\n txDataLength,\\n hashMemory\\n );\\n\\n nextTransactionPtr += uint40(TX_DATA_HEADER_SIZE + txDataLength);\\n numSequencerTransactions++;\\n leafIndex++;\\n }\\n\\n // Now process any subsequent queue transactions.\\n for (uint32 j = 0; j < curContext.numSubsequentQueueTransactions; j++) {\\n require(\\n nextQueueIndex < queueLength,\\n \\\"Not enough queued transactions to append.\\\"\\n );\\n\\n leaves[leafIndex] = _getQueueLeafHash(nextQueueIndex);\\n nextQueueIndex++;\\n leafIndex++;\\n }\\n }\\n\\n _validateFinalBatchContext(\\n curContext,\\n nextQueueIndex,\\n queueLength,\\n queueRef\\n );\\n\\n require(\\n msg.data.length == nextTransactionPtr,\\n \\\"Not all sequencer transactions were processed.\\\"\\n );\\n\\n require(\\n leafIndex == totalElementsToAppend,\\n \\\"Actual transaction index does not match expected total elements to append.\\\"\\n );\\n\\n // Generate the required metadata that we need to append this batch\\n uint40 numQueuedTransactions = totalElementsToAppend - numSequencerTransactions;\\n uint40 blockTimestamp;\\n uint40 blockNumber;\\n if (curContext.numSubsequentQueueTransactions == 0) {\\n // The last element is a sequencer tx, therefore pull timestamp and block number from the last context.\\n blockTimestamp = uint40(curContext.timestamp);\\n blockNumber = uint40(curContext.blockNumber);\\n } else {\\n // The last element is a queue tx, therefore pull timestamp and block number from the queue element.\\n // curContext.numSubsequentQueueTransactions > 0 which means that we've processed at least one queue element.\\n // We increment nextQueueIndex after processing each queue element,\\n // so the index of the last element we processed is nextQueueIndex - 1.\\n Lib_OVMCodec.QueueElement memory lastElement = _getQueueElement(\\n nextQueueIndex - 1,\\n queueRef\\n );\\n\\n blockTimestamp = lastElement.timestamp;\\n blockNumber = lastElement.blockNumber;\\n }\\n\\n // For efficiency reasons getMerkleRoot modifies the `leaves` argument in place\\n // while calculating the root hash therefore any arguments passed to it must not\\n // be used again afterwards\\n _appendBatch(\\n Lib_MerkleTree.getMerkleRoot(leaves),\\n totalElementsToAppend,\\n numQueuedTransactions,\\n blockTimestamp,\\n blockNumber\\n );\\n\\n emit SequencerBatchAppended(\\n nextQueueIndex - numQueuedTransactions,\\n numQueuedTransactions,\\n getTotalElements()\\n );\\n }\\n\\n /**\\n * Verifies whether a transaction is included in the chain.\\n * @param _transaction Transaction to verify.\\n * @param _txChainElement Transaction chain element corresponding to the transaction.\\n * @param _batchHeader Header of the batch the transaction was included in.\\n * @param _inclusionProof Inclusion proof for the provided transaction chain element.\\n * @return True if the transaction exists in the CTC, false if not.\\n */\\n function verifyTransaction(\\n Lib_OVMCodec.Transaction memory _transaction,\\n Lib_OVMCodec.TransactionChainElement memory _txChainElement,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _inclusionProof\\n )\\n override\\n public\\n view\\n returns (\\n bool\\n )\\n {\\n if (_txChainElement.isSequenced == true) {\\n return _verifySequencerTransaction(\\n _transaction,\\n _txChainElement,\\n _batchHeader,\\n _inclusionProof\\n );\\n } else {\\n return _verifyQueueTransaction(\\n _transaction,\\n _txChainElement.queueIndex,\\n _batchHeader,\\n _inclusionProof\\n );\\n }\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Returns the BatchContext located at a particular index.\\n * @param _index The index of the BatchContext\\n * @return The BatchContext at the specified index.\\n */\\n function _getBatchContext(\\n uint256 _index\\n )\\n internal\\n pure\\n returns (\\n BatchContext memory\\n )\\n {\\n uint256 contextPtr = 15 + _index * BATCH_CONTEXT_SIZE;\\n uint256 numSequencedTransactions;\\n uint256 numSubsequentQueueTransactions;\\n uint256 ctxTimestamp;\\n uint256 ctxBlockNumber;\\n\\n assembly {\\n numSequencedTransactions := shr(232, calldataload(contextPtr))\\n numSubsequentQueueTransactions := shr(232, calldataload(add(contextPtr, 3)))\\n ctxTimestamp := shr(216, calldataload(add(contextPtr, 6)))\\n ctxBlockNumber := shr(216, calldataload(add(contextPtr, 11)))\\n }\\n\\n return BatchContext({\\n numSequencedTransactions: numSequencedTransactions,\\n numSubsequentQueueTransactions: numSubsequentQueueTransactions,\\n timestamp: ctxTimestamp,\\n blockNumber: ctxBlockNumber\\n });\\n }\\n\\n /**\\n * Parses the batch context from the extra data.\\n * @return Total number of elements submitted.\\n * @return Index of the next queue element.\\n */\\n function _getBatchExtraData()\\n internal\\n view\\n returns (\\n uint40,\\n uint40,\\n uint40,\\n uint40\\n )\\n {\\n bytes27 extraData = batches().getGlobalMetadata();\\n\\n uint40 totalElements;\\n uint40 nextQueueIndex;\\n uint40 lastTimestamp;\\n uint40 lastBlockNumber;\\n assembly {\\n extraData := shr(40, extraData)\\n totalElements := and(extraData, 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF)\\n nextQueueIndex := shr(40, and(extraData, 0x00000000000000000000000000000000000000000000FFFFFFFFFF0000000000))\\n lastTimestamp := shr(80, and(extraData, 0x0000000000000000000000000000000000FFFFFFFFFF00000000000000000000))\\n lastBlockNumber := shr(120, and(extraData, 0x000000000000000000000000FFFFFFFFFF000000000000000000000000000000))\\n }\\n\\n return (\\n totalElements,\\n nextQueueIndex,\\n lastTimestamp,\\n lastBlockNumber\\n );\\n }\\n\\n /**\\n * Encodes the batch context for the extra data.\\n * @param _totalElements Total number of elements submitted.\\n * @param _nextQueueIndex Index of the next queue element.\\n * @param _timestamp Timestamp for the last batch.\\n * @param _blockNumber Block number of the last batch.\\n * @return Encoded batch context.\\n */\\n function _makeBatchExtraData(\\n uint40 _totalElements,\\n uint40 _nextQueueIndex,\\n uint40 _timestamp,\\n uint40 _blockNumber\\n )\\n internal\\n pure\\n returns (\\n bytes27\\n )\\n {\\n bytes27 extraData;\\n assembly {\\n extraData := _totalElements\\n extraData := or(extraData, shl(40, _nextQueueIndex))\\n extraData := or(extraData, shl(80, _timestamp))\\n extraData := or(extraData, shl(120, _blockNumber))\\n extraData := shl(40, extraData)\\n }\\n\\n return extraData;\\n }\\n\\n /**\\n * Retrieves the hash of a queue element.\\n * @param _index Index of the queue element to retrieve a hash for.\\n * @return Hash of the queue element.\\n */\\n function _getQueueLeafHash(\\n uint256 _index\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return _hashTransactionChainElement(\\n Lib_OVMCodec.TransactionChainElement({\\n isSequenced: false,\\n queueIndex: _index,\\n timestamp: 0,\\n blockNumber: 0,\\n txData: hex\\\"\\\"\\n })\\n );\\n }\\n\\n /**\\n * Gets the queue element at a particular index.\\n * @param _index Index of the queue element to access.\\n * @return _element Queue element at the given index.\\n */\\n function _getQueueElement(\\n uint256 _index,\\n iOVM_ChainStorageContainer _queueRef\\n )\\n internal\\n view\\n returns (\\n Lib_OVMCodec.QueueElement memory _element\\n )\\n {\\n // The underlying queue data structure stores 2 elements\\n // per insertion, so to get the actual desired queue index\\n // we need to multiply by 2.\\n uint40 trueIndex = uint40(_index * 2);\\n bytes32 transactionHash = _queueRef.get(trueIndex);\\n bytes32 timestampAndBlockNumber = _queueRef.get(trueIndex + 1);\\n\\n uint40 elementTimestamp;\\n uint40 elementBlockNumber;\\n assembly {\\n elementTimestamp := and(timestampAndBlockNumber, 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF)\\n elementBlockNumber := shr(40, and(timestampAndBlockNumber, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000))\\n }\\n\\n return Lib_OVMCodec.QueueElement({\\n transactionHash: transactionHash,\\n timestamp: elementTimestamp,\\n blockNumber: elementBlockNumber\\n });\\n }\\n\\n /**\\n * Retrieves the length of the queue.\\n * @return Length of the queue.\\n */\\n function _getQueueLength(\\n iOVM_ChainStorageContainer _queueRef\\n )\\n internal\\n view\\n returns (\\n uint40\\n )\\n {\\n // The underlying queue data structure stores 2 elements\\n // per insertion, so to get the real queue length we need\\n // to divide by 2.\\n return uint40(_queueRef.length() / 2);\\n }\\n\\n /**\\n * Retrieves the hash of a sequencer element.\\n * @param _context Batch context for the given element.\\n * @param _nextTransactionPtr Pointer to the next transaction in the calldata.\\n * @param _txDataLength Length of the transaction item.\\n * @return Hash of the sequencer element.\\n */\\n function _getSequencerLeafHash(\\n BatchContext memory _context,\\n uint256 _nextTransactionPtr,\\n uint256 _txDataLength,\\n bytes memory _hashMemory\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n // Only allocate more memory if we didn't reserve enough to begin with.\\n if (BYTES_TILL_TX_DATA + _txDataLength > _hashMemory.length) {\\n _hashMemory = new bytes(BYTES_TILL_TX_DATA + _txDataLength);\\n }\\n\\n uint256 ctxTimestamp = _context.timestamp;\\n uint256 ctxBlockNumber = _context.blockNumber;\\n\\n bytes32 leafHash;\\n assembly {\\n let chainElementStart := add(_hashMemory, 0x20)\\n\\n // Set the first byte equal to `1` to indicate this is a sequencer chain element.\\n // This distinguishes sequencer ChainElements from queue ChainElements because\\n // all queue ChainElements are ABI encoded and the first byte of ABI encoded\\n // elements is always zero\\n mstore8(chainElementStart, 1)\\n\\n mstore(add(chainElementStart, 1), ctxTimestamp)\\n mstore(add(chainElementStart, 33), ctxBlockNumber)\\n\\n calldatacopy(add(chainElementStart, BYTES_TILL_TX_DATA), add(_nextTransactionPtr, 3), _txDataLength)\\n\\n leafHash := keccak256(chainElementStart, add(BYTES_TILL_TX_DATA, _txDataLength))\\n }\\n\\n return leafHash;\\n }\\n\\n /**\\n * Retrieves the hash of a sequencer element.\\n * @param _txChainElement The chain element which is hashed to calculate the leaf.\\n * @return Hash of the sequencer element.\\n */\\n function _getSequencerLeafHash(\\n Lib_OVMCodec.TransactionChainElement memory _txChainElement\\n )\\n internal\\n view\\n returns(\\n bytes32\\n )\\n {\\n bytes memory txData = _txChainElement.txData;\\n uint256 txDataLength = _txChainElement.txData.length;\\n\\n bytes memory chainElement = new bytes(BYTES_TILL_TX_DATA + txDataLength);\\n uint256 ctxTimestamp = _txChainElement.timestamp;\\n uint256 ctxBlockNumber = _txChainElement.blockNumber;\\n\\n bytes32 leafHash;\\n assembly {\\n let chainElementStart := add(chainElement, 0x20)\\n\\n // Set the first byte equal to `1` to indicate this is a sequencer chain element.\\n // This distinguishes sequencer ChainElements from queue ChainElements because\\n // all queue ChainElements are ABI encoded and the first byte of ABI encoded\\n // elements is always zero\\n mstore8(chainElementStart, 1)\\n\\n mstore(add(chainElementStart, 1), ctxTimestamp)\\n mstore(add(chainElementStart, 33), ctxBlockNumber)\\n\\n pop(staticcall(gas(), 0x04, add(txData, 0x20), txDataLength, add(chainElementStart, BYTES_TILL_TX_DATA), txDataLength))\\n\\n leafHash := keccak256(chainElementStart, add(BYTES_TILL_TX_DATA, txDataLength))\\n }\\n\\n return leafHash;\\n }\\n\\n /**\\n * Inserts a batch into the chain of batches.\\n * @param _transactionRoot Root of the transaction tree for this batch.\\n * @param _batchSize Number of elements in the batch.\\n * @param _numQueuedTransactions Number of queue transactions in the batch.\\n * @param _timestamp The latest batch timestamp.\\n * @param _blockNumber The latest batch blockNumber.\\n */\\n function _appendBatch(\\n bytes32 _transactionRoot,\\n uint256 _batchSize,\\n uint256 _numQueuedTransactions,\\n uint40 _timestamp,\\n uint40 _blockNumber\\n )\\n internal\\n {\\n iOVM_ChainStorageContainer batchesRef = batches();\\n (uint40 totalElements, uint40 nextQueueIndex,,) = _getBatchExtraData();\\n\\n Lib_OVMCodec.ChainBatchHeader memory header = Lib_OVMCodec.ChainBatchHeader({\\n batchIndex: batchesRef.length(),\\n batchRoot: _transactionRoot,\\n batchSize: _batchSize,\\n prevTotalElements: totalElements,\\n extraData: hex\\\"\\\"\\n });\\n\\n emit TransactionBatchAppended(\\n header.batchIndex,\\n header.batchRoot,\\n header.batchSize,\\n header.prevTotalElements,\\n header.extraData\\n );\\n\\n bytes32 batchHeaderHash = Lib_OVMCodec.hashBatchHeader(header);\\n bytes27 latestBatchContext = _makeBatchExtraData(\\n totalElements + uint40(header.batchSize),\\n nextQueueIndex + uint40(_numQueuedTransactions),\\n _timestamp,\\n _blockNumber\\n );\\n\\n batchesRef.push(batchHeaderHash, latestBatchContext);\\n }\\n\\n /**\\n * Checks that the first batch context in a sequencer submission is valid\\n * @param _firstContext The batch context to validate.\\n */\\n function _validateFirstBatchContext(\\n BatchContext memory _firstContext\\n )\\n internal\\n view\\n {\\n // If there are existing elements, this batch must have the same context\\n // or a later timestamp and block number.\\n if (getTotalElements() > 0) {\\n (,, uint40 lastTimestamp, uint40 lastBlockNumber) = _getBatchExtraData();\\n\\n require(\\n _firstContext.blockNumber >= lastBlockNumber,\\n \\\"Context block number is lower than last submitted.\\\"\\n );\\n\\n require(\\n _firstContext.timestamp >= lastTimestamp,\\n \\\"Context timestamp is lower than last submitted.\\\"\\n );\\n }\\n\\n // Sequencer cannot submit contexts which are more than the force inclusion period old.\\n require(\\n _firstContext.timestamp + forceInclusionPeriodSeconds >= block.timestamp,\\n \\\"Context timestamp too far in the past.\\\"\\n );\\n\\n require(\\n _firstContext.blockNumber + forceInclusionPeriodBlocks >= block.number,\\n \\\"Context block number too far in the past.\\\"\\n );\\n }\\n\\n /**\\n * Checks that a given batch context has a time context which is below a given que element\\n * @param _context The batch context to validate has values lower.\\n * @param _queueIndex Index of the queue element we are validating came later than the context.\\n * @param _queueRef The storage container for the queue.\\n */\\n function _validateContextBeforeEnqueue(\\n BatchContext memory _context,\\n uint40 _queueIndex,\\n iOVM_ChainStorageContainer _queueRef\\n )\\n internal\\n view\\n {\\n Lib_OVMCodec.QueueElement memory nextQueueElement = _getQueueElement(\\n _queueIndex,\\n _queueRef\\n );\\n\\n // If the force inclusion period has passed for an enqueued transaction, it MUST be the next chain element.\\n require(\\n block.timestamp < nextQueueElement.timestamp + forceInclusionPeriodSeconds,\\n \\\"Previously enqueued batches have expired and must be appended before a new sequencer batch.\\\"\\n );\\n\\n // Just like sequencer transaction times must be increasing relative to each other,\\n // We also require that they be increasing relative to any interspersed queue elements.\\n require(\\n _context.timestamp <= nextQueueElement.timestamp,\\n \\\"Sequencer transaction timestamp exceeds that of next queue element.\\\"\\n );\\n\\n require(\\n _context.blockNumber <= nextQueueElement.blockNumber,\\n \\\"Sequencer transaction blockNumber exceeds that of next queue element.\\\"\\n );\\n }\\n\\n /**\\n * Checks that a given batch context is valid based on its previous context, and the next queue elemtent.\\n * @param _prevContext The previously validated batch context.\\n * @param _nextContext The batch context to validate with this call.\\n * @param _nextQueueIndex Index of the next queue element to process for the _nextContext's subsequentQueueElements.\\n * @param _queueRef The storage container for the queue.\\n */\\n function _validateNextBatchContext(\\n BatchContext memory _prevContext,\\n BatchContext memory _nextContext,\\n uint40 _nextQueueIndex,\\n iOVM_ChainStorageContainer _queueRef\\n )\\n internal\\n view\\n {\\n // All sequencer transactions' times must be greater than or equal to the previous ones.\\n require(\\n _nextContext.timestamp >= _prevContext.timestamp,\\n \\\"Context timestamp values must monotonically increase.\\\"\\n );\\n\\n require(\\n _nextContext.blockNumber >= _prevContext.blockNumber,\\n \\\"Context blockNumber values must monotonically increase.\\\"\\n );\\n\\n // If there is going to be a queue element pulled in from this context:\\n if (_nextContext.numSubsequentQueueTransactions > 0) {\\n _validateContextBeforeEnqueue(\\n _nextContext,\\n _nextQueueIndex,\\n _queueRef\\n );\\n }\\n }\\n\\n /**\\n * Checks that the final batch context in a sequencer submission is valid.\\n * @param _finalContext The batch context to validate.\\n * @param _queueLength The length of the queue at the start of the batchAppend call.\\n * @param _nextQueueIndex The next element in the queue that will be pulled into the CTC.\\n * @param _queueRef The storage container for the queue.\\n */\\n function _validateFinalBatchContext(\\n BatchContext memory _finalContext,\\n uint40 _nextQueueIndex,\\n uint40 _queueLength,\\n iOVM_ChainStorageContainer _queueRef\\n )\\n internal\\n view\\n {\\n // If the queue is not now empty, check the mononoticity of whatever the next batch that will come in is.\\n if (_queueLength - _nextQueueIndex > 0 && _finalContext.numSubsequentQueueTransactions == 0) {\\n _validateContextBeforeEnqueue(\\n _finalContext,\\n _nextQueueIndex,\\n _queueRef\\n );\\n }\\n // Batches cannot be added from the future, or subsequent enqueue() contexts would violate monotonicity.\\n require(_finalContext.timestamp <= block.timestamp, \\\"Context timestamp is from the future.\\\");\\n require(_finalContext.blockNumber <= block.number, \\\"Context block number is from the future.\\\");\\n }\\n\\n /**\\n * Hashes a transaction chain element.\\n * @param _element Chain element to hash.\\n * @return Hash of the chain element.\\n */\\n function _hashTransactionChainElement(\\n Lib_OVMCodec.TransactionChainElement memory _element\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(\\n abi.encode(\\n _element.isSequenced,\\n _element.queueIndex,\\n _element.timestamp,\\n _element.blockNumber,\\n _element.txData\\n )\\n );\\n }\\n\\n /**\\n * Verifies a sequencer transaction, returning true if it was indeed included in the CTC\\n * @param _transaction The transaction we are verifying inclusion of.\\n * @param _txChainElement The chain element that the transaction is claimed to be a part of.\\n * @param _batchHeader Header of the batch the transaction was included in.\\n * @param _inclusionProof An inclusion proof into the CTC at a particular index.\\n * @return True if the transaction was included in the specified location, else false.\\n */\\n function _verifySequencerTransaction(\\n Lib_OVMCodec.Transaction memory _transaction,\\n Lib_OVMCodec.TransactionChainElement memory _txChainElement,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _inclusionProof\\n )\\n internal\\n view\\n returns (\\n bool\\n )\\n {\\n OVM_ExecutionManager ovmExecutionManager = OVM_ExecutionManager(resolve(\\\"OVM_ExecutionManager\\\"));\\n uint256 gasLimit = ovmExecutionManager.getMaxTransactionGasLimit();\\n bytes32 leafHash = _getSequencerLeafHash(_txChainElement);\\n\\n require(\\n _verifyElement(\\n leafHash,\\n _batchHeader,\\n _inclusionProof\\n ),\\n \\\"Invalid Sequencer transaction inclusion proof.\\\"\\n );\\n\\n require(\\n _transaction.blockNumber == _txChainElement.blockNumber\\n && _transaction.timestamp == _txChainElement.timestamp\\n && _transaction.entrypoint == resolve(\\\"OVM_DecompressionPrecompileAddress\\\")\\n && _transaction.gasLimit == gasLimit\\n && _transaction.l1TxOrigin == address(0)\\n && _transaction.l1QueueOrigin == Lib_OVMCodec.QueueOrigin.SEQUENCER_QUEUE\\n && keccak256(_transaction.data) == keccak256(_txChainElement.txData),\\n \\\"Invalid Sequencer transaction.\\\"\\n );\\n\\n return true;\\n }\\n\\n /**\\n * Verifies a queue transaction, returning true if it was indeed included in the CTC\\n * @param _transaction The transaction we are verifying inclusion of.\\n * @param _queueIndex The queueIndex of the queued transaction.\\n * @param _batchHeader Header of the batch the transaction was included in.\\n * @param _inclusionProof An inclusion proof into the CTC at a particular index (should point to queue tx).\\n * @return True if the transaction was included in the specified location, else false.\\n */\\n function _verifyQueueTransaction(\\n Lib_OVMCodec.Transaction memory _transaction,\\n uint256 _queueIndex,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _inclusionProof\\n )\\n internal\\n view\\n returns (\\n bool\\n )\\n {\\n bytes32 leafHash = _getQueueLeafHash(_queueIndex);\\n\\n require(\\n _verifyElement(\\n leafHash,\\n _batchHeader,\\n _inclusionProof\\n ),\\n \\\"Invalid Queue transaction inclusion proof.\\\"\\n );\\n\\n bytes32 transactionHash = keccak256(\\n abi.encode(\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n )\\n );\\n\\n Lib_OVMCodec.QueueElement memory el = getQueueElement(_queueIndex);\\n require(\\n el.transactionHash == transactionHash\\n && el.timestamp == _transaction.timestamp\\n && el.blockNumber == _transaction.blockNumber,\\n \\\"Invalid Queue transaction.\\\"\\n );\\n\\n return true;\\n }\\n\\n /**\\n * Verifies a batch inclusion proof.\\n * @param _element Hash of the element to verify a proof for.\\n * @param _batchHeader Header of the batch in which the element was included.\\n * @param _proof Merkle inclusion proof for the element.\\n */\\n function _verifyElement(\\n bytes32 _element,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _proof\\n )\\n internal\\n view\\n returns (\\n bool\\n )\\n {\\n require(\\n Lib_OVMCodec.hashBatchHeader(_batchHeader) == batches().get(uint32(_batchHeader.batchIndex)),\\n \\\"Invalid batch header.\\\"\\n );\\n\\n require(\\n Lib_MerkleTree.verify(\\n _batchHeader.batchRoot,\\n _element,\\n _proof.index,\\n _proof.siblings,\\n _batchHeader.batchSize\\n ),\\n \\\"Invalid inclusion proof.\\\"\\n );\\n\\n return true;\\n }\\n}\\n\",\"keccak256\":\"0x70eb90b2f03d5b4c78af0b479d253eacdf311e760b80108710aafc0aa0b84941\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// @unsupported: ovm\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\nimport { Lib_EthUtils } from \\\"../../libraries/utils/Lib_EthUtils.sol\\\";\\nimport { Lib_ErrorUtils } from \\\"../../libraries/utils/Lib_ErrorUtils.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_ExecutionManager } from \\\"../../iOVM/execution/iOVM_ExecutionManager.sol\\\";\\nimport { iOVM_StateManager } from \\\"../../iOVM/execution/iOVM_StateManager.sol\\\";\\nimport { iOVM_SafetyChecker } from \\\"../../iOVM/execution/iOVM_SafetyChecker.sol\\\";\\n\\n/* Contract Imports */\\nimport { OVM_ECDSAContractAccount } from \\\"../accounts/OVM_ECDSAContractAccount.sol\\\";\\nimport { OVM_ProxyEOA } from \\\"../accounts/OVM_ProxyEOA.sol\\\";\\nimport { OVM_DeployerWhitelist } from \\\"../predeploys/OVM_DeployerWhitelist.sol\\\";\\n\\n/**\\n * @title OVM_ExecutionManager\\n * @dev The Execution Manager (EM) is the core of our OVM implementation, and provides a sandboxed\\n * environment allowing us to execute OVM transactions deterministically on either Layer 1 or\\n * Layer 2.\\n * The EM's run() function is the first function called during the execution of any\\n * transaction on L2.\\n * For each context-dependent EVM operation the EM has a function which implements a corresponding\\n * OVM operation, which will read state from the State Manager contract.\\n * The EM relies on the Safety Checker to verify that code deployed to Layer 2 does not contain any\\n * context-dependent operations.\\n *\\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract OVM_ExecutionManager is iOVM_ExecutionManager, Lib_AddressResolver {\\n\\n /********************************\\n * External Contract References *\\n ********************************/\\n\\n iOVM_SafetyChecker internal ovmSafetyChecker;\\n iOVM_StateManager internal ovmStateManager;\\n\\n\\n /*******************************\\n * Execution Context Variables *\\n *******************************/\\n\\n GasMeterConfig internal gasMeterConfig;\\n GlobalContext internal globalContext;\\n TransactionContext internal transactionContext;\\n MessageContext internal messageContext;\\n TransactionRecord internal transactionRecord;\\n MessageRecord internal messageRecord;\\n\\n\\n /**************************\\n * Gas Metering Constants *\\n **************************/\\n\\n address constant GAS_METADATA_ADDRESS = 0x06a506A506a506A506a506a506A506A506A506A5;\\n uint256 constant NUISANCE_GAS_SLOAD = 20000;\\n uint256 constant NUISANCE_GAS_SSTORE = 20000;\\n uint256 constant MIN_NUISANCE_GAS_PER_CONTRACT = 30000;\\n uint256 constant NUISANCE_GAS_PER_CONTRACT_BYTE = 100;\\n uint256 constant MIN_GAS_FOR_INVALID_STATE_ACCESS = 30000;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n */\\n constructor(\\n address _libAddressManager,\\n GasMeterConfig memory _gasMeterConfig,\\n GlobalContext memory _globalContext\\n )\\n Lib_AddressResolver(_libAddressManager)\\n {\\n ovmSafetyChecker = iOVM_SafetyChecker(resolve(\\\"OVM_SafetyChecker\\\"));\\n gasMeterConfig = _gasMeterConfig;\\n globalContext = _globalContext;\\n _resetContext();\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n /**\\n * Applies dynamically-sized refund to a transaction to account for the difference in execution\\n * between L1 and L2, so that the overall cost of the ovmOPCODE is fixed.\\n * @param _cost Desired gas cost for the function after the refund.\\n */\\n modifier netGasCost(\\n uint256 _cost\\n ) {\\n uint256 gasProvided = gasleft();\\n _;\\n uint256 gasUsed = gasProvided - gasleft();\\n\\n // We want to refund everything *except* the specified cost.\\n if (_cost < gasUsed) {\\n transactionRecord.ovmGasRefund += gasUsed - _cost;\\n }\\n }\\n\\n /**\\n * Applies a fixed-size gas refund to a transaction to account for the difference in execution\\n * between L1 and L2, so that the overall cost of an ovmOPCODE can be lowered.\\n * @param _discount Amount of gas cost to refund for the ovmOPCODE.\\n */\\n modifier fixedGasDiscount(\\n uint256 _discount\\n ) {\\n uint256 gasProvided = gasleft();\\n _;\\n uint256 gasUsed = gasProvided - gasleft();\\n\\n // We want to refund the specified _discount, unless this risks underflow.\\n if (_discount < gasUsed) {\\n transactionRecord.ovmGasRefund += _discount;\\n } else {\\n // refund all we can without risking underflow.\\n transactionRecord.ovmGasRefund += gasUsed;\\n }\\n }\\n\\n /**\\n * Makes sure we're not inside a static context.\\n */\\n modifier notStatic() {\\n if (messageContext.isStatic == true) {\\n _revertWithFlag(RevertFlag.STATIC_VIOLATION);\\n }\\n _;\\n }\\n\\n\\n /************************************\\n * Transaction Execution Entrypoint *\\n ************************************/\\n\\n /**\\n * Starts the execution of a transaction via the OVM_ExecutionManager.\\n * @param _transaction Transaction data to be executed.\\n * @param _ovmStateManager iOVM_StateManager implementation providing account state.\\n */\\n function run(\\n Lib_OVMCodec.Transaction memory _transaction,\\n address _ovmStateManager\\n )\\n override\\n public\\n {\\n require(transactionContext.ovmNUMBER == 0, \\\"Only callable at the start of a transaction\\\");\\n // Store our OVM_StateManager instance (significantly easier than attempting to pass the\\n // address around in calldata).\\n ovmStateManager = iOVM_StateManager(_ovmStateManager);\\n\\n // Make sure this function can't be called by anyone except the owner of the\\n // OVM_StateManager (expected to be an OVM_StateTransitioner). We can revert here because\\n // this would make the `run` itself invalid.\\n require(\\n // This method may return false during fraud proofs, but always returns true in L2 nodes' State Manager precompile.\\n ovmStateManager.isAuthenticated(msg.sender),\\n \\\"Only authenticated addresses in ovmStateManager can call this function\\\"\\n );\\n\\n // Initialize the execution context, must be initialized before we perform any gas metering\\n // or we'll throw a nuisance gas error.\\n _initContext(_transaction);\\n\\n // TEMPORARY: Gas metering is disabled for minnet.\\n // // Check whether we need to start a new epoch, do so if necessary.\\n // _checkNeedsNewEpoch(_transaction.timestamp);\\n\\n // Make sure the transaction's gas limit is valid. We don't revert here because we reserve\\n // reverts for INVALID_STATE_ACCESS.\\n if (_isValidGasLimit(_transaction.gasLimit, _transaction.l1QueueOrigin) == false) {\\n _resetContext();\\n return;\\n }\\n\\n // TEMPORARY: Gas metering is disabled for minnet.\\n // // Check gas right before the call to get total gas consumed by OVM transaction.\\n // uint256 gasProvided = gasleft();\\n\\n // Run the transaction, make sure to meter the gas usage.\\n ovmCALL(\\n _transaction.gasLimit - gasMeterConfig.minTransactionGasLimit,\\n _transaction.entrypoint,\\n _transaction.data\\n );\\n\\n // TEMPORARY: Gas metering is disabled for minnet.\\n // // Update the cumulative gas based on the amount of gas used.\\n // uint256 gasUsed = gasProvided - gasleft();\\n // _updateCumulativeGas(gasUsed, _transaction.l1QueueOrigin);\\n\\n // Wipe the execution context.\\n _resetContext();\\n }\\n\\n\\n /******************************\\n * Opcodes: Execution Context *\\n ******************************/\\n\\n /**\\n * @notice Overrides CALLER.\\n * @return _CALLER Address of the CALLER within the current message context.\\n */\\n function ovmCALLER()\\n override\\n public\\n view\\n returns (\\n address _CALLER\\n )\\n {\\n return messageContext.ovmCALLER;\\n }\\n\\n /**\\n * @notice Overrides ADDRESS.\\n * @return _ADDRESS Active ADDRESS within the current message context.\\n */\\n function ovmADDRESS()\\n override\\n public\\n view\\n returns (\\n address _ADDRESS\\n )\\n {\\n return messageContext.ovmADDRESS;\\n }\\n\\n /**\\n * @notice Overrides TIMESTAMP.\\n * @return _TIMESTAMP Value of the TIMESTAMP within the transaction context.\\n */\\n function ovmTIMESTAMP()\\n override\\n public\\n view\\n returns (\\n uint256 _TIMESTAMP\\n )\\n {\\n return transactionContext.ovmTIMESTAMP;\\n }\\n\\n /**\\n * @notice Overrides NUMBER.\\n * @return _NUMBER Value of the NUMBER within the transaction context.\\n */\\n function ovmNUMBER()\\n override\\n public\\n view\\n returns (\\n uint256 _NUMBER\\n )\\n {\\n return transactionContext.ovmNUMBER;\\n }\\n\\n /**\\n * @notice Overrides GASLIMIT.\\n * @return _GASLIMIT Value of the block's GASLIMIT within the transaction context.\\n */\\n function ovmGASLIMIT()\\n override\\n public\\n view\\n returns (\\n uint256 _GASLIMIT\\n )\\n {\\n return transactionContext.ovmGASLIMIT;\\n }\\n\\n /**\\n * @notice Overrides CHAINID.\\n * @return _CHAINID Value of the chain's CHAINID within the global context.\\n */\\n function ovmCHAINID()\\n override\\n public\\n view\\n returns (\\n uint256 _CHAINID\\n )\\n {\\n return globalContext.ovmCHAINID;\\n }\\n\\n /*********************************\\n * Opcodes: L2 Execution Context *\\n *********************************/\\n\\n /**\\n * @notice Specifies from which L1 rollup queue this transaction originated from.\\n * @return _queueOrigin Address of the ovmL1QUEUEORIGIN within the current message context.\\n */\\n function ovmL1QUEUEORIGIN()\\n override\\n public\\n view\\n returns (\\n Lib_OVMCodec.QueueOrigin _queueOrigin\\n )\\n {\\n return transactionContext.ovmL1QUEUEORIGIN;\\n }\\n\\n /**\\n * @notice Specifies which L1 account, if any, sent this transaction by calling enqueue().\\n * @return _l1TxOrigin Address of the account which sent the tx into L2 from L1.\\n */\\n function ovmL1TXORIGIN()\\n override\\n public\\n view\\n returns (\\n address _l1TxOrigin\\n )\\n {\\n return transactionContext.ovmL1TXORIGIN;\\n }\\n\\n /********************\\n * Opcodes: Halting *\\n ********************/\\n\\n /**\\n * @notice Overrides REVERT.\\n * @param _data Bytes data to pass along with the REVERT.\\n */\\n function ovmREVERT(\\n bytes memory _data\\n )\\n override\\n public\\n {\\n _revertWithFlag(RevertFlag.INTENTIONAL_REVERT, _data);\\n }\\n\\n\\n /******************************\\n * Opcodes: Contract Creation *\\n ******************************/\\n\\n /**\\n * @notice Overrides CREATE.\\n * @param _bytecode Code to be used to CREATE a new contract.\\n * @return Address of the created contract.\\n * @return Revert data, if and only if the creation threw an exception.\\n */\\n function ovmCREATE(\\n bytes memory _bytecode\\n )\\n override\\n public\\n notStatic\\n fixedGasDiscount(40000)\\n returns (\\n address,\\n bytes memory\\n )\\n {\\n // Creator is always the current ADDRESS.\\n address creator = ovmADDRESS();\\n\\n // Check that the deployer is whitelisted, or\\n // that arbitrary contract deployment has been enabled.\\n _checkDeployerAllowed(creator);\\n\\n // Generate the correct CREATE address.\\n address contractAddress = Lib_EthUtils.getAddressForCREATE(\\n creator,\\n _getAccountNonce(creator)\\n );\\n\\n return _createContract(\\n contractAddress,\\n _bytecode\\n );\\n }\\n\\n /**\\n * @notice Overrides CREATE2.\\n * @param _bytecode Code to be used to CREATE2 a new contract.\\n * @param _salt Value used to determine the contract's address.\\n * @return Address of the created contract.\\n * @return Revert data, if and only if the creation threw an exception.\\n */\\n function ovmCREATE2(\\n bytes memory _bytecode,\\n bytes32 _salt\\n )\\n override\\n public\\n notStatic\\n fixedGasDiscount(40000)\\n returns (\\n address,\\n bytes memory\\n )\\n {\\n // Creator is always the current ADDRESS.\\n address creator = ovmADDRESS();\\n\\n // Check that the deployer is whitelisted, or\\n // that arbitrary contract deployment has been enabled.\\n _checkDeployerAllowed(creator);\\n\\n // Generate the correct CREATE2 address.\\n address contractAddress = Lib_EthUtils.getAddressForCREATE2(\\n creator,\\n _bytecode,\\n _salt\\n );\\n\\n return _createContract(\\n contractAddress,\\n _bytecode\\n );\\n }\\n\\n\\n /*******************************\\n * Account Abstraction Opcodes *\\n ******************************/\\n\\n /**\\n * Retrieves the nonce of the current ovmADDRESS.\\n * @return _nonce Nonce of the current contract.\\n */\\n function ovmGETNONCE()\\n override\\n public\\n returns (\\n uint256 _nonce\\n )\\n {\\n return _getAccountNonce(ovmADDRESS());\\n }\\n\\n /**\\n * Bumps the nonce of the current ovmADDRESS by one.\\n */\\n function ovmINCREMENTNONCE()\\n override\\n public\\n notStatic\\n {\\n address account = ovmADDRESS();\\n uint256 nonce = _getAccountNonce(account);\\n\\n // Prevent overflow.\\n if (nonce + 1 > nonce) {\\n _setAccountNonce(account, nonce + 1);\\n }\\n }\\n\\n /**\\n * Creates a new EOA contract account, for account abstraction.\\n * @dev Essentially functions like ovmCREATE or ovmCREATE2, but we can bypass a lot of checks\\n * because the contract we're creating is trusted (no need to do safety checking or to\\n * handle unexpected reverts). Doesn't need to return an address because the address is\\n * assumed to be the user's actual address.\\n * @param _messageHash Hash of a message signed by some user, for verification.\\n * @param _v Signature `v` parameter.\\n * @param _r Signature `r` parameter.\\n * @param _s Signature `s` parameter.\\n */\\n function ovmCREATEEOA(\\n bytes32 _messageHash,\\n uint8 _v,\\n bytes32 _r,\\n bytes32 _s\\n )\\n override\\n public\\n notStatic\\n {\\n // Recover the EOA address from the message hash and signature parameters. Since we do the\\n // hashing in advance, we don't have handle different message hashing schemes. Even if this\\n // function were to return the wrong address (rather than explicitly returning the zero\\n // address), the rest of the transaction would simply fail (since there's no EOA account to\\n // actually execute the transaction).\\n address eoa = ecrecover(\\n _messageHash,\\n _v + 27,\\n _r,\\n _s\\n );\\n\\n // Invalid signature is a case we proactively handle with a revert. We could alternatively\\n // have this function return a `success` boolean, but this is just easier.\\n if (eoa == address(0)) {\\n ovmREVERT(bytes(\\\"Signature provided for EOA contract creation is invalid.\\\"));\\n }\\n\\n // If the user already has an EOA account, then there's no need to perform this operation.\\n if (_hasEmptyAccount(eoa) == false) {\\n return;\\n }\\n\\n // We always need to initialize the contract with the default account values.\\n _initPendingAccount(eoa);\\n\\n // Temporarily set the current address so it's easier to access on L2.\\n address prevADDRESS = messageContext.ovmADDRESS;\\n messageContext.ovmADDRESS = eoa;\\n\\n // Now actually create the account and get its bytecode. We're not worried about reverts\\n // (other than out of gas, which we can't capture anyway) because this contract is trusted.\\n OVM_ProxyEOA proxyEOA = new OVM_ProxyEOA(0x4200000000000000000000000000000000000003);\\n\\n // Reset the address now that we're done deploying.\\n messageContext.ovmADDRESS = prevADDRESS;\\n\\n // Commit the account with its final values.\\n _commitPendingAccount(\\n eoa,\\n address(proxyEOA),\\n keccak256(Lib_EthUtils.getCode(address(proxyEOA)))\\n );\\n\\n _setAccountNonce(eoa, 0);\\n }\\n\\n\\n /*********************************\\n * Opcodes: Contract Interaction *\\n *********************************/\\n\\n /**\\n * @notice Overrides CALL.\\n * @param _gasLimit Amount of gas to be passed into this call.\\n * @param _address Address of the contract to call.\\n * @param _calldata Data to send along with the call.\\n * @return _success Whether or not the call returned (rather than reverted).\\n * @return _returndata Data returned by the call.\\n */\\n function ovmCALL(\\n uint256 _gasLimit,\\n address _address,\\n bytes memory _calldata\\n )\\n override\\n public\\n fixedGasDiscount(100000)\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n // CALL updates the CALLER and ADDRESS.\\n MessageContext memory nextMessageContext = messageContext;\\n nextMessageContext.ovmCALLER = nextMessageContext.ovmADDRESS;\\n nextMessageContext.ovmADDRESS = _address;\\n\\n return _callContract(\\n nextMessageContext,\\n _gasLimit,\\n _address,\\n _calldata\\n );\\n }\\n\\n /**\\n * @notice Overrides STATICCALL.\\n * @param _gasLimit Amount of gas to be passed into this call.\\n * @param _address Address of the contract to call.\\n * @param _calldata Data to send along with the call.\\n * @return _success Whether or not the call returned (rather than reverted).\\n * @return _returndata Data returned by the call.\\n */\\n function ovmSTATICCALL(\\n uint256 _gasLimit,\\n address _address,\\n bytes memory _calldata\\n )\\n override\\n public\\n fixedGasDiscount(80000)\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n // STATICCALL updates the CALLER, updates the ADDRESS, and runs in a static context.\\n MessageContext memory nextMessageContext = messageContext;\\n nextMessageContext.ovmCALLER = nextMessageContext.ovmADDRESS;\\n nextMessageContext.ovmADDRESS = _address;\\n nextMessageContext.isStatic = true;\\n\\n return _callContract(\\n nextMessageContext,\\n _gasLimit,\\n _address,\\n _calldata\\n );\\n }\\n\\n /**\\n * @notice Overrides DELEGATECALL.\\n * @param _gasLimit Amount of gas to be passed into this call.\\n * @param _address Address of the contract to call.\\n * @param _calldata Data to send along with the call.\\n * @return _success Whether or not the call returned (rather than reverted).\\n * @return _returndata Data returned by the call.\\n */\\n function ovmDELEGATECALL(\\n uint256 _gasLimit,\\n address _address,\\n bytes memory _calldata\\n )\\n override\\n public\\n fixedGasDiscount(40000)\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n // DELEGATECALL does not change anything about the message context.\\n MessageContext memory nextMessageContext = messageContext;\\n\\n return _callContract(\\n nextMessageContext,\\n _gasLimit,\\n _address,\\n _calldata\\n );\\n }\\n\\n\\n /************************************\\n * Opcodes: Contract Storage Access *\\n ************************************/\\n\\n /**\\n * @notice Overrides SLOAD.\\n * @param _key 32 byte key of the storage slot to load.\\n * @return _value 32 byte value of the requested storage slot.\\n */\\n function ovmSLOAD(\\n bytes32 _key\\n )\\n override\\n public\\n netGasCost(40000)\\n returns (\\n bytes32 _value\\n )\\n {\\n // We always SLOAD from the storage of ADDRESS.\\n address contractAddress = ovmADDRESS();\\n\\n return _getContractStorage(\\n contractAddress,\\n _key\\n );\\n }\\n\\n /**\\n * @notice Overrides SSTORE.\\n * @param _key 32 byte key of the storage slot to set.\\n * @param _value 32 byte value for the storage slot.\\n */\\n function ovmSSTORE(\\n bytes32 _key,\\n bytes32 _value\\n )\\n override\\n public\\n notStatic\\n netGasCost(60000)\\n {\\n // We always SSTORE to the storage of ADDRESS.\\n address contractAddress = ovmADDRESS();\\n\\n _putContractStorage(\\n contractAddress,\\n _key,\\n _value\\n );\\n }\\n\\n\\n /*********************************\\n * Opcodes: Contract Code Access *\\n *********************************/\\n\\n /**\\n * @notice Overrides EXTCODECOPY.\\n * @param _contract Address of the contract to copy code from.\\n * @param _offset Offset in bytes from the start of contract code to copy beyond.\\n * @param _length Total number of bytes to copy from the contract's code.\\n * @return _code Bytes of code copied from the requested contract.\\n */\\n function ovmEXTCODECOPY(\\n address _contract,\\n uint256 _offset,\\n uint256 _length\\n )\\n override\\n public\\n returns (\\n bytes memory _code\\n )\\n {\\n // `ovmEXTCODECOPY` is the only overridden opcode capable of producing exactly one byte of\\n // return data. By blocking reads of one byte, we're able to use the condition that an\\n // OVM_ExecutionManager function return value having a length of exactly one byte indicates\\n // an error without an explicit revert. If users were able to read a single byte, they\\n // could forcibly trigger behavior that should only be available to this contract.\\n uint256 length = _length == 1 ? 2 : _length;\\n\\n return Lib_EthUtils.getCode(\\n _getAccountEthAddress(_contract),\\n _offset,\\n length\\n );\\n }\\n\\n /**\\n * @notice Overrides EXTCODESIZE.\\n * @param _contract Address of the contract to query the size of.\\n * @return _EXTCODESIZE Size of the requested contract in bytes.\\n */\\n function ovmEXTCODESIZE(\\n address _contract\\n )\\n override\\n public\\n returns (\\n uint256 _EXTCODESIZE\\n )\\n {\\n return Lib_EthUtils.getCodeSize(\\n _getAccountEthAddress(_contract)\\n );\\n }\\n\\n /**\\n * @notice Overrides EXTCODEHASH.\\n * @param _contract Address of the contract to query the hash of.\\n * @return _EXTCODEHASH Hash of the requested contract.\\n */\\n function ovmEXTCODEHASH(\\n address _contract\\n )\\n override\\n public\\n returns (\\n bytes32 _EXTCODEHASH\\n )\\n {\\n return Lib_EthUtils.getCodeHash(\\n _getAccountEthAddress(_contract)\\n );\\n }\\n\\n /***************************************\\n * Public Functions: Execution Context *\\n ***************************************/\\n\\n function getMaxTransactionGasLimit()\\n external\\n view\\n override\\n returns (\\n uint256 _maxTransactionGasLimit\\n )\\n {\\n return gasMeterConfig.maxTransactionGasLimit;\\n }\\n\\n /********************************************\\n * Public Functions: Deployment Whitelisting *\\n ********************************************/\\n\\n /**\\n * Checks whether the given address is on the whitelist to ovmCREATE/ovmCREATE2, and reverts if not.\\n * @param _deployerAddress Address attempting to deploy a contract.\\n */\\n function _checkDeployerAllowed(\\n address _deployerAddress\\n )\\n internal\\n {\\n // From an OVM semantics perspective, this will appear identical to\\n // the deployer ovmCALLing the whitelist. This is fine--in a sense, we are forcing them to.\\n (bool success, bytes memory data) = ovmCALL(\\n gasleft(),\\n 0x4200000000000000000000000000000000000002,\\n abi.encodeWithSignature(\\\"isDeployerAllowed(address)\\\", _deployerAddress)\\n );\\n bool isAllowed = abi.decode(data, (bool));\\n\\n if (!isAllowed || !success) {\\n _revertWithFlag(RevertFlag.CREATOR_NOT_ALLOWED);\\n }\\n }\\n\\n /********************************************\\n * Internal Functions: Contract Interaction *\\n ********************************************/\\n\\n /**\\n * Creates a new contract and associates it with some contract address.\\n * @param _contractAddress Address to associate the created contract with.\\n * @param _bytecode Bytecode to be used to create the contract.\\n * @return Final OVM contract address.\\n * @return Revertdata, if and only if the creation threw an exception.\\n */\\n function _createContract(\\n address _contractAddress,\\n bytes memory _bytecode\\n )\\n internal\\n returns (\\n address,\\n bytes memory\\n )\\n {\\n // We always update the nonce of the creating account, even if the creation fails.\\n _setAccountNonce(ovmADDRESS(), _getAccountNonce(ovmADDRESS()) + 1);\\n\\n // We're stepping into a CREATE or CREATE2, so we need to update ADDRESS to point\\n // to the contract's associated address and CALLER to point to the previous ADDRESS.\\n MessageContext memory nextMessageContext = messageContext;\\n nextMessageContext.ovmCALLER = messageContext.ovmADDRESS;\\n nextMessageContext.ovmADDRESS = _contractAddress;\\n\\n // Run the common logic which occurs between call-type and create-type messages,\\n // passing in the creation bytecode and `true` to trigger create-specific logic.\\n (bool success, bytes memory data) = _handleExternalMessage(\\n nextMessageContext,\\n gasleft(),\\n _contractAddress,\\n _bytecode,\\n true\\n );\\n\\n // Yellow paper requires that address returned is zero if the contract deployment fails.\\n return (\\n success ? _contractAddress : address(0),\\n data\\n );\\n }\\n\\n /**\\n * Calls the deployed contract associated with a given address.\\n * @param _nextMessageContext Message context to be used for the call.\\n * @param _gasLimit Amount of gas to be passed into this call.\\n * @param _contract OVM address to be called.\\n * @param _calldata Data to send along with the call.\\n * @return _success Whether or not the call returned (rather than reverted).\\n * @return _returndata Data returned by the call.\\n */\\n function _callContract(\\n MessageContext memory _nextMessageContext,\\n uint256 _gasLimit,\\n address _contract,\\n bytes memory _calldata\\n )\\n internal\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n // We reserve addresses of the form 0xdeaddeaddead...NNNN for the container contracts in L2 geth.\\n // So, we block calls to these addresses since they are not safe to run as an OVM contract itself.\\n if (\\n (uint256(_contract) & uint256(0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000))\\n == uint256(0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000)\\n ) {\\n // EVM does not return data in the success case, see: https://github.com/ethereum/go-ethereum/blob/aae7660410f0ef90279e14afaaf2f429fdc2a186/core/vm/instructions.go#L600-L604\\n return (true, hex'');\\n }\\n\\n // Both 0x0000... and the EVM precompiles have the same address on L1 and L2 --> no trie lookup needed.\\n address codeContractAddress =\\n uint(_contract) < 100\\n ? _contract\\n : _getAccountEthAddress(_contract);\\n\\n return _handleExternalMessage(\\n _nextMessageContext,\\n _gasLimit,\\n codeContractAddress,\\n _calldata,\\n false\\n );\\n }\\n\\n /**\\n * Handles all interactions which involve the execution manager calling out to untrusted code (both calls and creates).\\n * Ensures that OVM-related measures are enforced, including L2 gas refunds, nuisance gas, and flagged reversions.\\n *\\n * @param _nextMessageContext Message context to be used for the external message.\\n * @param _gasLimit Amount of gas to be passed into this message.\\n * @param _contract OVM address being called or deployed to\\n * @param _data Data for the message (either calldata or creation code)\\n * @param _isCreate Whether this is a create-type message.\\n * @return Whether or not the message (either a call or deployment) succeeded.\\n * @return Data returned by the message.\\n */\\n function _handleExternalMessage(\\n MessageContext memory _nextMessageContext,\\n uint256 _gasLimit,\\n address _contract,\\n bytes memory _data,\\n bool _isCreate\\n )\\n internal\\n returns (\\n bool,\\n bytes memory\\n )\\n {\\n // We need to switch over to our next message context for the duration of this call.\\n MessageContext memory prevMessageContext = messageContext;\\n _switchMessageContext(prevMessageContext, _nextMessageContext);\\n\\n // Nuisance gas is a system used to bound the ability for an attacker to make fraud proofs\\n // expensive by touching a lot of different accounts or storage slots. Since most contracts\\n // only use a few storage slots during any given transaction, this shouldn't be a limiting\\n // factor.\\n uint256 prevNuisanceGasLeft = messageRecord.nuisanceGasLeft;\\n uint256 nuisanceGasLimit = _getNuisanceGasLimit(_gasLimit);\\n messageRecord.nuisanceGasLeft = nuisanceGasLimit;\\n\\n // Make the call and make sure to pass in the gas limit. Another instance of hidden\\n // complexity. `_contract` is guaranteed to be a safe contract, meaning its return/revert\\n // behavior can be controlled. In particular, we enforce that flags are passed through\\n // revert data as to retrieve execution metadata that would normally be reverted out of\\n // existence.\\n\\n (bool success, bytes memory returndata) =\\n _isCreate\\n ? _handleContractCreation(_gasLimit, _data, _contract)\\n : _contract.call{gas: _gasLimit}(_data);\\n\\n // Switch back to the original message context now that we're out of the call.\\n _switchMessageContext(_nextMessageContext, prevMessageContext);\\n\\n // Assuming there were no reverts, the message record should be accurate here. We'll update\\n // this value in the case of a revert.\\n uint256 nuisanceGasLeft = messageRecord.nuisanceGasLeft;\\n\\n // Reverts at this point are completely OK, but we need to make a few updates based on the\\n // information passed through the revert.\\n if (success == false) {\\n (\\n RevertFlag flag,\\n uint256 nuisanceGasLeftPostRevert,\\n uint256 ovmGasRefund,\\n bytes memory returndataFromFlag\\n ) = _decodeRevertData(returndata);\\n\\n // INVALID_STATE_ACCESS is the only flag that triggers an immediate abort of the\\n // parent EVM message. This behavior is necessary because INVALID_STATE_ACCESS must\\n // halt any further transaction execution that could impact the execution result.\\n if (flag == RevertFlag.INVALID_STATE_ACCESS) {\\n _revertWithFlag(flag);\\n }\\n\\n // INTENTIONAL_REVERT, UNSAFE_BYTECODE, STATIC_VIOLATION, and CREATOR_NOT_ALLOWED aren't\\n // dependent on the input state, so we can just handle them like standard reverts. Our only change here\\n // is to record the gas refund reported by the call (enforced by safety checking).\\n if (\\n flag == RevertFlag.INTENTIONAL_REVERT\\n || flag == RevertFlag.UNSAFE_BYTECODE\\n || flag == RevertFlag.STATIC_VIOLATION\\n || flag == RevertFlag.CREATOR_NOT_ALLOWED\\n ) {\\n transactionRecord.ovmGasRefund = ovmGasRefund;\\n }\\n\\n // INTENTIONAL_REVERT needs to pass up the user-provided return data encoded into the\\n // flag, *not* the full encoded flag. All other revert types return no data.\\n if (\\n flag == RevertFlag.INTENTIONAL_REVERT\\n || _isCreate\\n ) {\\n returndata = returndataFromFlag;\\n } else {\\n returndata = hex'';\\n }\\n\\n // Reverts mean we need to use up whatever \\\"nuisance gas\\\" was used by the call.\\n // EXCEEDS_NUISANCE_GAS explicitly reduces the remaining nuisance gas for this message\\n // to zero. OUT_OF_GAS is a \\\"pseudo\\\" flag given that messages return no data when they\\n // run out of gas, so we have to treat this like EXCEEDS_NUISANCE_GAS. All other flags\\n // will simply pass up the remaining nuisance gas.\\n nuisanceGasLeft = nuisanceGasLeftPostRevert;\\n }\\n\\n // We need to reset the nuisance gas back to its original value minus the amount used here.\\n messageRecord.nuisanceGasLeft = prevNuisanceGasLeft - (nuisanceGasLimit - nuisanceGasLeft);\\n\\n return (\\n success,\\n returndata\\n );\\n }\\n\\n /**\\n * Handles the creation-specific safety measures required for OVM contract deployment.\\n * This function sanitizes the return types for creation messages to match calls (bool, bytes).\\n * This allows for consistent handling of both types of messages in _handleExternalMessage().\\n *\\n * @param _gasLimit Amount of gas to be passed into this creation.\\n * @param _creationCode Code to pass into CREATE for deployment.\\n * @param _address OVM address being deployed to.\\n * @return Whether or not the call succeeded.\\n * @return If creation fails: revert data. Otherwise: empty.\\n */\\n function _handleContractCreation(\\n uint _gasLimit,\\n bytes memory _creationCode,\\n address _address\\n )\\n internal\\n returns(\\n bool,\\n bytes memory\\n )\\n {\\n // Check that there is not already code at this address.\\n if (_hasEmptyAccount(_address) == false) {\\n // Note: in the EVM, this case burns all allotted gas. For improved\\n // developer experience, we do return the remaining ones.\\n return (\\n false,\\n _encodeRevertData(\\n RevertFlag.CREATE_COLLISION,\\n Lib_ErrorUtils.encodeRevertString(\\\"A contract has already been deployed to this address\\\")\\n )\\n );\\n }\\n\\n // Check the creation bytecode against the OVM_SafetyChecker.\\n if (ovmSafetyChecker.isBytecodeSafe(_creationCode) == false) {\\n return (\\n false,\\n _encodeRevertData(\\n RevertFlag.UNSAFE_BYTECODE,\\n Lib_ErrorUtils.encodeRevertString(\\\"Contract creation code contains unsafe opcodes. Did you use the right compiler or pass an unsafe constructor argument?\\\")\\n )\\n );\\n }\\n\\n // We always need to initialize the contract with the default account values.\\n _initPendingAccount(_address);\\n\\n // Actually execute the EVM create message,\\n address ethAddress = Lib_EthUtils.createContract(_creationCode);\\n\\n if (ethAddress == address(0)) {\\n // If the creation fails, the EVM lets us grab its revert data. This may contain a revert flag\\n // to be used above in _handleExternalMessage.\\n uint256 revertDataSize;\\n assembly { revertDataSize := returndatasize() }\\n bytes memory revertdata = new bytes(revertDataSize);\\n assembly {\\n returndatacopy(\\n add(revertdata, 0x20),\\n 0,\\n revertDataSize\\n )\\n }\\n // Return that the creation failed, and the data it reverted with.\\n return (false, revertdata);\\n }\\n\\n // Again simply checking that the deployed code is safe too. Contracts can generate\\n // arbitrary deployment code, so there's no easy way to analyze this beforehand.\\n bytes memory deployedCode = Lib_EthUtils.getCode(ethAddress);\\n if (ovmSafetyChecker.isBytecodeSafe(deployedCode) == false) {\\n return (\\n false,\\n _encodeRevertData(\\n RevertFlag.UNSAFE_BYTECODE,\\n Lib_ErrorUtils.encodeRevertString(\\\"Constructor attempted to deploy unsafe bytecode.\\\")\\n )\\n );\\n }\\n\\n // Contract creation didn't need to be reverted and the bytecode is safe. We finish up by\\n // associating the desired address with the newly created contract's code hash and address.\\n _commitPendingAccount(\\n _address,\\n ethAddress,\\n Lib_EthUtils.getCodeHash(ethAddress)\\n );\\n\\n // Successful deployments will not give access to returndata, in both the EVM and the OVM.\\n return (true, hex'');\\n }\\n\\n /******************************************\\n * Internal Functions: State Manipulation *\\n ******************************************/\\n\\n /**\\n * Checks whether an account exists within the OVM_StateManager.\\n * @param _address Address of the account to check.\\n * @return _exists Whether or not the account exists.\\n */\\n function _hasAccount(\\n address _address\\n )\\n internal\\n returns (\\n bool _exists\\n )\\n {\\n _checkAccountLoad(_address);\\n return ovmStateManager.hasAccount(_address);\\n }\\n\\n /**\\n * Checks whether a known empty account exists within the OVM_StateManager.\\n * @param _address Address of the account to check.\\n * @return _exists Whether or not the account empty exists.\\n */\\n function _hasEmptyAccount(\\n address _address\\n )\\n internal\\n returns (\\n bool _exists\\n )\\n {\\n _checkAccountLoad(_address);\\n return ovmStateManager.hasEmptyAccount(_address);\\n }\\n\\n /**\\n * Sets the nonce of an account.\\n * @param _address Address of the account to modify.\\n * @param _nonce New account nonce.\\n */\\n function _setAccountNonce(\\n address _address,\\n uint256 _nonce\\n )\\n internal\\n {\\n _checkAccountChange(_address);\\n ovmStateManager.setAccountNonce(_address, _nonce);\\n }\\n\\n /**\\n * Gets the nonce of an account.\\n * @param _address Address of the account to access.\\n * @return _nonce Nonce of the account.\\n */\\n function _getAccountNonce(\\n address _address\\n )\\n internal\\n returns (\\n uint256 _nonce\\n )\\n {\\n _checkAccountLoad(_address);\\n return ovmStateManager.getAccountNonce(_address);\\n }\\n\\n /**\\n * Retrieves the Ethereum address of an account.\\n * @param _address Address of the account to access.\\n * @return _ethAddress Corresponding Ethereum address.\\n */\\n function _getAccountEthAddress(\\n address _address\\n )\\n internal\\n returns (\\n address _ethAddress\\n )\\n {\\n _checkAccountLoad(_address);\\n return ovmStateManager.getAccountEthAddress(_address);\\n }\\n\\n /**\\n * Creates the default account object for the given address.\\n * @param _address Address of the account create.\\n */\\n function _initPendingAccount(\\n address _address\\n )\\n internal\\n {\\n // Although it seems like `_checkAccountChange` would be more appropriate here, we don't\\n // actually consider an account \\\"changed\\\" until it's inserted into the state (in this case\\n // by `_commitPendingAccount`).\\n _checkAccountLoad(_address);\\n ovmStateManager.initPendingAccount(_address);\\n }\\n\\n /**\\n * Stores additional relevant data for a new account, thereby \\\"committing\\\" it to the state.\\n * This function is only called during `ovmCREATE` and `ovmCREATE2` after a successful contract\\n * creation.\\n * @param _address Address of the account to commit.\\n * @param _ethAddress Address of the associated deployed contract.\\n * @param _codeHash Hash of the code stored at the address.\\n */\\n function _commitPendingAccount(\\n address _address,\\n address _ethAddress,\\n bytes32 _codeHash\\n )\\n internal\\n {\\n _checkAccountChange(_address);\\n ovmStateManager.commitPendingAccount(\\n _address,\\n _ethAddress,\\n _codeHash\\n );\\n }\\n\\n /**\\n * Retrieves the value of a storage slot.\\n * @param _contract Address of the contract to query.\\n * @param _key 32 byte key of the storage slot.\\n * @return _value 32 byte storage slot value.\\n */\\n function _getContractStorage(\\n address _contract,\\n bytes32 _key\\n )\\n internal\\n returns (\\n bytes32 _value\\n )\\n {\\n _checkContractStorageLoad(_contract, _key);\\n return ovmStateManager.getContractStorage(_contract, _key);\\n }\\n\\n /**\\n * Sets the value of a storage slot.\\n * @param _contract Address of the contract to modify.\\n * @param _key 32 byte key of the storage slot.\\n * @param _value 32 byte storage slot value.\\n */\\n function _putContractStorage(\\n address _contract,\\n bytes32 _key,\\n bytes32 _value\\n )\\n internal\\n {\\n // We don't set storage if the value didn't change. Although this acts as a convenient\\n // optimization, it's also necessary to avoid the case in which a contract with no storage\\n // attempts to store the value \\\"0\\\" at any key. Putting this value (and therefore requiring\\n // that the value be committed into the storage trie after execution) would incorrectly\\n // modify the storage root.\\n if (_getContractStorage(_contract, _key) == _value) {\\n return;\\n }\\n\\n _checkContractStorageChange(_contract, _key);\\n ovmStateManager.putContractStorage(_contract, _key, _value);\\n }\\n\\n /**\\n * Validation whenever a contract needs to be loaded. Checks that the account exists, charges\\n * nuisance gas if the account hasn't been loaded before.\\n * @param _address Address of the account to load.\\n */\\n function _checkAccountLoad(\\n address _address\\n )\\n internal\\n {\\n // See `_checkContractStorageLoad` for more information.\\n if (gasleft() < MIN_GAS_FOR_INVALID_STATE_ACCESS) {\\n _revertWithFlag(RevertFlag.OUT_OF_GAS);\\n }\\n\\n // See `_checkContractStorageLoad` for more information.\\n if (ovmStateManager.hasAccount(_address) == false) {\\n _revertWithFlag(RevertFlag.INVALID_STATE_ACCESS);\\n }\\n\\n // Check whether the account has been loaded before and mark it as loaded if not. We need\\n // this because \\\"nuisance gas\\\" only applies to the first time that an account is loaded.\\n (\\n bool _wasAccountAlreadyLoaded\\n ) = ovmStateManager.testAndSetAccountLoaded(_address);\\n\\n // If we hadn't already loaded the account, then we'll need to charge \\\"nuisance gas\\\" based\\n // on the size of the contract code.\\n if (_wasAccountAlreadyLoaded == false) {\\n _useNuisanceGas(\\n (Lib_EthUtils.getCodeSize(_getAccountEthAddress(_address)) * NUISANCE_GAS_PER_CONTRACT_BYTE) + MIN_NUISANCE_GAS_PER_CONTRACT\\n );\\n }\\n }\\n\\n /**\\n * Validation whenever a contract needs to be changed. Checks that the account exists, charges\\n * nuisance gas if the account hasn't been changed before.\\n * @param _address Address of the account to change.\\n */\\n function _checkAccountChange(\\n address _address\\n )\\n internal\\n {\\n // Start by checking for a load as we only want to charge nuisance gas proportional to\\n // contract size once.\\n _checkAccountLoad(_address);\\n\\n // Check whether the account has been changed before and mark it as changed if not. We need\\n // this because \\\"nuisance gas\\\" only applies to the first time that an account is changed.\\n (\\n bool _wasAccountAlreadyChanged\\n ) = ovmStateManager.testAndSetAccountChanged(_address);\\n\\n // If we hadn't already loaded the account, then we'll need to charge \\\"nuisance gas\\\" based\\n // on the size of the contract code.\\n if (_wasAccountAlreadyChanged == false) {\\n ovmStateManager.incrementTotalUncommittedAccounts();\\n _useNuisanceGas(\\n (Lib_EthUtils.getCodeSize(_getAccountEthAddress(_address)) * NUISANCE_GAS_PER_CONTRACT_BYTE) + MIN_NUISANCE_GAS_PER_CONTRACT\\n );\\n }\\n }\\n\\n /**\\n * Validation whenever a slot needs to be loaded. Checks that the account exists, charges\\n * nuisance gas if the slot hasn't been loaded before.\\n * @param _contract Address of the account to load from.\\n * @param _key 32 byte key to load.\\n */\\n function _checkContractStorageLoad(\\n address _contract,\\n bytes32 _key\\n )\\n internal\\n {\\n // Another case of hidden complexity. If we didn't enforce this requirement, then a\\n // contract could pass in just enough gas to cause the INVALID_STATE_ACCESS check to fail\\n // on L1 but not on L2. A contract could use this behavior to prevent the\\n // OVM_ExecutionManager from detecting an invalid state access. Reverting with OUT_OF_GAS\\n // allows us to also charge for the full message nuisance gas, because you deserve that for\\n // trying to break the contract in this way.\\n if (gasleft() < MIN_GAS_FOR_INVALID_STATE_ACCESS) {\\n _revertWithFlag(RevertFlag.OUT_OF_GAS);\\n }\\n\\n // We need to make sure that the transaction isn't trying to access storage that hasn't\\n // been provided to the OVM_StateManager. We'll immediately abort if this is the case.\\n // We know that we have enough gas to do this check because of the above test.\\n if (ovmStateManager.hasContractStorage(_contract, _key) == false) {\\n _revertWithFlag(RevertFlag.INVALID_STATE_ACCESS);\\n }\\n\\n // Check whether the slot has been loaded before and mark it as loaded if not. We need\\n // this because \\\"nuisance gas\\\" only applies to the first time that a slot is loaded.\\n (\\n bool _wasContractStorageAlreadyLoaded\\n ) = ovmStateManager.testAndSetContractStorageLoaded(_contract, _key);\\n\\n // If we hadn't already loaded the account, then we'll need to charge some fixed amount of\\n // \\\"nuisance gas\\\".\\n if (_wasContractStorageAlreadyLoaded == false) {\\n _useNuisanceGas(NUISANCE_GAS_SLOAD);\\n }\\n }\\n\\n /**\\n * Validation whenever a slot needs to be changed. Checks that the account exists, charges\\n * nuisance gas if the slot hasn't been changed before.\\n * @param _contract Address of the account to change.\\n * @param _key 32 byte key to change.\\n */\\n function _checkContractStorageChange(\\n address _contract,\\n bytes32 _key\\n )\\n internal\\n {\\n // Start by checking for load to make sure we have the storage slot and that we charge the\\n // \\\"nuisance gas\\\" necessary to prove the storage slot state.\\n _checkContractStorageLoad(_contract, _key);\\n\\n // Check whether the slot has been changed before and mark it as changed if not. We need\\n // this because \\\"nuisance gas\\\" only applies to the first time that a slot is changed.\\n (\\n bool _wasContractStorageAlreadyChanged\\n ) = ovmStateManager.testAndSetContractStorageChanged(_contract, _key);\\n\\n // If we hadn't already changed the account, then we'll need to charge some fixed amount of\\n // \\\"nuisance gas\\\".\\n if (_wasContractStorageAlreadyChanged == false) {\\n // Changing a storage slot means that we're also going to have to change the\\n // corresponding account, so do an account change check.\\n _checkAccountChange(_contract);\\n\\n ovmStateManager.incrementTotalUncommittedContractStorage();\\n _useNuisanceGas(NUISANCE_GAS_SSTORE);\\n }\\n }\\n\\n\\n /************************************\\n * Internal Functions: Revert Logic *\\n ************************************/\\n\\n /**\\n * Simple encoding for revert data.\\n * @param _flag Flag to revert with.\\n * @param _data Additional user-provided revert data.\\n * @return _revertdata Encoded revert data.\\n */\\n function _encodeRevertData(\\n RevertFlag _flag,\\n bytes memory _data\\n )\\n internal\\n view\\n returns (\\n bytes memory _revertdata\\n )\\n {\\n // Out of gas and create exceptions will fundamentally return no data, so simulating it shouldn't either.\\n if (\\n _flag == RevertFlag.OUT_OF_GAS\\n ) {\\n return bytes('');\\n }\\n\\n // INVALID_STATE_ACCESS doesn't need to return any data other than the flag.\\n if (_flag == RevertFlag.INVALID_STATE_ACCESS) {\\n return abi.encode(\\n _flag,\\n 0,\\n 0,\\n bytes('')\\n );\\n }\\n\\n // Just ABI encode the rest of the parameters.\\n return abi.encode(\\n _flag,\\n messageRecord.nuisanceGasLeft,\\n transactionRecord.ovmGasRefund,\\n _data\\n );\\n }\\n\\n /**\\n * Simple decoding for revert data.\\n * @param _revertdata Revert data to decode.\\n * @return _flag Flag used to revert.\\n * @return _nuisanceGasLeft Amount of nuisance gas unused by the message.\\n * @return _ovmGasRefund Amount of gas refunded during the message.\\n * @return _data Additional user-provided revert data.\\n */\\n function _decodeRevertData(\\n bytes memory _revertdata\\n )\\n internal\\n pure\\n returns (\\n RevertFlag _flag,\\n uint256 _nuisanceGasLeft,\\n uint256 _ovmGasRefund,\\n bytes memory _data\\n )\\n {\\n // A length of zero means the call ran out of gas, just return empty data.\\n if (_revertdata.length == 0) {\\n return (\\n RevertFlag.OUT_OF_GAS,\\n 0,\\n 0,\\n bytes('')\\n );\\n }\\n\\n // ABI decode the incoming data.\\n return abi.decode(_revertdata, (RevertFlag, uint256, uint256, bytes));\\n }\\n\\n /**\\n * Causes a message to revert or abort.\\n * @param _flag Flag to revert with.\\n * @param _data Additional user-provided data.\\n */\\n function _revertWithFlag(\\n RevertFlag _flag,\\n bytes memory _data\\n )\\n internal\\n view\\n {\\n bytes memory revertdata = _encodeRevertData(\\n _flag,\\n _data\\n );\\n\\n assembly {\\n revert(add(revertdata, 0x20), mload(revertdata))\\n }\\n }\\n\\n /**\\n * Causes a message to revert or abort.\\n * @param _flag Flag to revert with.\\n */\\n function _revertWithFlag(\\n RevertFlag _flag\\n )\\n internal\\n {\\n _revertWithFlag(_flag, bytes(''));\\n }\\n\\n\\n /******************************************\\n * Internal Functions: Nuisance Gas Logic *\\n ******************************************/\\n\\n /**\\n * Computes the nuisance gas limit from the gas limit.\\n * @dev This function is currently using a naive implementation whereby the nuisance gas limit\\n * is set to exactly equal the lesser of the gas limit or remaining gas. It's likely that\\n * this implementation is perfectly fine, but we may change this formula later.\\n * @param _gasLimit Gas limit to compute from.\\n * @return _nuisanceGasLimit Computed nuisance gas limit.\\n */\\n function _getNuisanceGasLimit(\\n uint256 _gasLimit\\n )\\n internal\\n view\\n returns (\\n uint256 _nuisanceGasLimit\\n )\\n {\\n return _gasLimit < gasleft() ? _gasLimit : gasleft();\\n }\\n\\n /**\\n * Uses a certain amount of nuisance gas.\\n * @param _amount Amount of nuisance gas to use.\\n */\\n function _useNuisanceGas(\\n uint256 _amount\\n )\\n internal\\n {\\n // Essentially the same as a standard OUT_OF_GAS, except we also retain a record of the gas\\n // refund to be given at the end of the transaction.\\n if (messageRecord.nuisanceGasLeft < _amount) {\\n _revertWithFlag(RevertFlag.EXCEEDS_NUISANCE_GAS);\\n }\\n\\n messageRecord.nuisanceGasLeft -= _amount;\\n }\\n\\n\\n /************************************\\n * Internal Functions: Gas Metering *\\n ************************************/\\n\\n /**\\n * Checks whether a transaction needs to start a new epoch and does so if necessary.\\n * @param _timestamp Transaction timestamp.\\n */\\n function _checkNeedsNewEpoch(\\n uint256 _timestamp\\n )\\n internal\\n {\\n if (\\n _timestamp >= (\\n _getGasMetadata(GasMetadataKey.CURRENT_EPOCH_START_TIMESTAMP)\\n + gasMeterConfig.secondsPerEpoch\\n )\\n ) {\\n _putGasMetadata(\\n GasMetadataKey.CURRENT_EPOCH_START_TIMESTAMP,\\n _timestamp\\n );\\n\\n _putGasMetadata(\\n GasMetadataKey.PREV_EPOCH_SEQUENCER_QUEUE_GAS,\\n _getGasMetadata(\\n GasMetadataKey.CUMULATIVE_SEQUENCER_QUEUE_GAS\\n )\\n );\\n\\n _putGasMetadata(\\n GasMetadataKey.PREV_EPOCH_L1TOL2_QUEUE_GAS,\\n _getGasMetadata(\\n GasMetadataKey.CUMULATIVE_L1TOL2_QUEUE_GAS\\n )\\n );\\n }\\n }\\n\\n /**\\n * Validates the gas limit for a given transaction.\\n * @param _gasLimit Gas limit provided by the transaction.\\n * param _queueOrigin Queue from which the transaction originated.\\n * @return _valid Whether or not the gas limit is valid.\\n */\\n function _isValidGasLimit(\\n uint256 _gasLimit,\\n Lib_OVMCodec.QueueOrigin // _queueOrigin\\n )\\n view\\n internal\\n returns (\\n bool _valid\\n )\\n {\\n // Always have to be below the maximum gas limit.\\n if (_gasLimit > gasMeterConfig.maxTransactionGasLimit) {\\n return false;\\n }\\n\\n // Always have to be above the minimum gas limit.\\n if (_gasLimit < gasMeterConfig.minTransactionGasLimit) {\\n return false;\\n }\\n\\n // TEMPORARY: Gas metering is disabled for minnet.\\n return true;\\n // GasMetadataKey cumulativeGasKey;\\n // GasMetadataKey prevEpochGasKey;\\n // if (_queueOrigin == Lib_OVMCodec.QueueOrigin.SEQUENCER_QUEUE) {\\n // cumulativeGasKey = GasMetadataKey.CUMULATIVE_SEQUENCER_QUEUE_GAS;\\n // prevEpochGasKey = GasMetadataKey.PREV_EPOCH_SEQUENCER_QUEUE_GAS;\\n // } else {\\n // cumulativeGasKey = GasMetadataKey.CUMULATIVE_L1TOL2_QUEUE_GAS;\\n // prevEpochGasKey = GasMetadataKey.PREV_EPOCH_L1TOL2_QUEUE_GAS;\\n // }\\n\\n // return (\\n // (\\n // _getGasMetadata(cumulativeGasKey)\\n // - _getGasMetadata(prevEpochGasKey)\\n // + _gasLimit\\n // ) < gasMeterConfig.maxGasPerQueuePerEpoch\\n // );\\n }\\n\\n /**\\n * Updates the cumulative gas after a transaction.\\n * @param _gasUsed Gas used by the transaction.\\n * @param _queueOrigin Queue from which the transaction originated.\\n */\\n function _updateCumulativeGas(\\n uint256 _gasUsed,\\n Lib_OVMCodec.QueueOrigin _queueOrigin\\n )\\n internal\\n {\\n GasMetadataKey cumulativeGasKey;\\n if (_queueOrigin == Lib_OVMCodec.QueueOrigin.SEQUENCER_QUEUE) {\\n cumulativeGasKey = GasMetadataKey.CUMULATIVE_SEQUENCER_QUEUE_GAS;\\n } else {\\n cumulativeGasKey = GasMetadataKey.CUMULATIVE_L1TOL2_QUEUE_GAS;\\n }\\n\\n _putGasMetadata(\\n cumulativeGasKey,\\n (\\n _getGasMetadata(cumulativeGasKey)\\n + gasMeterConfig.minTransactionGasLimit\\n + _gasUsed\\n - transactionRecord.ovmGasRefund\\n )\\n );\\n }\\n\\n /**\\n * Retrieves the value of a gas metadata key.\\n * @param _key Gas metadata key to retrieve.\\n * @return _value Value stored at the given key.\\n */\\n function _getGasMetadata(\\n GasMetadataKey _key\\n )\\n internal\\n returns (\\n uint256 _value\\n )\\n {\\n return uint256(_getContractStorage(\\n GAS_METADATA_ADDRESS,\\n bytes32(uint256(_key))\\n ));\\n }\\n\\n /**\\n * Sets the value of a gas metadata key.\\n * @param _key Gas metadata key to set.\\n * @param _value Value to store at the given key.\\n */\\n function _putGasMetadata(\\n GasMetadataKey _key,\\n uint256 _value\\n )\\n internal\\n {\\n _putContractStorage(\\n GAS_METADATA_ADDRESS,\\n bytes32(uint256(_key)),\\n bytes32(uint256(_value))\\n );\\n }\\n\\n\\n /*****************************************\\n * Internal Functions: Execution Context *\\n *****************************************/\\n\\n /**\\n * Swaps over to a new message context.\\n * @param _prevMessageContext Context we're switching from.\\n * @param _nextMessageContext Context we're switching to.\\n */\\n function _switchMessageContext(\\n MessageContext memory _prevMessageContext,\\n MessageContext memory _nextMessageContext\\n )\\n internal\\n {\\n // Avoid unnecessary the SSTORE.\\n if (_prevMessageContext.ovmCALLER != _nextMessageContext.ovmCALLER) {\\n messageContext.ovmCALLER = _nextMessageContext.ovmCALLER;\\n }\\n\\n // Avoid unnecessary the SSTORE.\\n if (_prevMessageContext.ovmADDRESS != _nextMessageContext.ovmADDRESS) {\\n messageContext.ovmADDRESS = _nextMessageContext.ovmADDRESS;\\n }\\n\\n // Avoid unnecessary the SSTORE.\\n if (_prevMessageContext.isStatic != _nextMessageContext.isStatic) {\\n messageContext.isStatic = _nextMessageContext.isStatic;\\n }\\n }\\n\\n /**\\n * Initializes the execution context.\\n * @param _transaction OVM transaction being executed.\\n */\\n function _initContext(\\n Lib_OVMCodec.Transaction memory _transaction\\n )\\n internal\\n {\\n transactionContext.ovmTIMESTAMP = _transaction.timestamp;\\n transactionContext.ovmNUMBER = _transaction.blockNumber;\\n transactionContext.ovmTXGASLIMIT = _transaction.gasLimit;\\n transactionContext.ovmL1QUEUEORIGIN = _transaction.l1QueueOrigin;\\n transactionContext.ovmL1TXORIGIN = _transaction.l1TxOrigin;\\n transactionContext.ovmGASLIMIT = gasMeterConfig.maxGasPerQueuePerEpoch;\\n\\n messageRecord.nuisanceGasLeft = _getNuisanceGasLimit(_transaction.gasLimit);\\n }\\n\\n /**\\n * Resets the transaction and message context.\\n */\\n function _resetContext()\\n internal\\n {\\n transactionContext.ovmL1TXORIGIN = address(0);\\n transactionContext.ovmTIMESTAMP = 0;\\n transactionContext.ovmNUMBER = 0;\\n transactionContext.ovmGASLIMIT = 0;\\n transactionContext.ovmTXGASLIMIT = 0;\\n transactionContext.ovmL1QUEUEORIGIN = Lib_OVMCodec.QueueOrigin.SEQUENCER_QUEUE;\\n\\n transactionRecord.ovmGasRefund = 0;\\n\\n messageContext.ovmCALLER = address(0);\\n messageContext.ovmADDRESS = address(0);\\n messageContext.isStatic = false;\\n\\n messageRecord.nuisanceGasLeft = 0;\\n\\n // Reset the ovmStateManager.\\n ovmStateManager = iOVM_StateManager(address(0));\\n }\\n\\n /*****************************\\n * L2-only Helper Functions *\\n *****************************/\\n\\n /**\\n * Unreachable helper function for simulating eth_calls with an OVM message context.\\n * This function will throw an exception in all cases other than when used as a custom entrypoint in L2 Geth to simulate eth_call.\\n * @param _transaction the message transaction to simulate.\\n * @param _from the OVM account the simulated call should be from.\\n */\\n function simulateMessage(\\n Lib_OVMCodec.Transaction memory _transaction,\\n address _from,\\n iOVM_StateManager _ovmStateManager\\n )\\n external\\n returns (\\n bool,\\n bytes memory\\n )\\n {\\n // Prevent this call from having any effect unless in a custom-set VM frame\\n require(msg.sender == address(0));\\n\\n ovmStateManager = _ovmStateManager;\\n _initContext(_transaction);\\n messageRecord.nuisanceGasLeft = uint(-1);\\n\\n messageContext.ovmADDRESS = _from;\\n\\n bool isCreate = _transaction.entrypoint == address(0);\\n if (isCreate) {\\n (address created, bytes memory revertData) = ovmCREATE(_transaction.data);\\n if (created == address(0)) {\\n return (false, revertData);\\n } else {\\n // The eth_call RPC endpoint for to = undefined will return the deployed bytecode\\n // in the success case, differing from standard create messages.\\n return (true, Lib_EthUtils.getCode(created));\\n }\\n } else {\\n return ovmCALL(\\n _transaction.gasLimit,\\n _transaction.entrypoint,\\n _transaction.data\\n );\\n }\\n }\\n}\\n\",\"keccak256\":\"0xbe55117367fc4c422cf41a8097705551a9b28d4774d774aa81a428526c85ec5c\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/predeploys/OVM_DeployerWhitelist.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_Bytes32Utils } from \\\"../../libraries/utils/Lib_Bytes32Utils.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_DeployerWhitelist } from \\\"../../iOVM/predeploys/iOVM_DeployerWhitelist.sol\\\";\\nimport { Lib_SafeExecutionManagerWrapper } from \\\"../../libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\\\";\\n\\n/**\\n * @title OVM_DeployerWhitelist\\n * @dev The Deployer Whitelist is a temporary predeploy used to provide additional safety during the\\n * initial phases of our mainnet roll out. It is owned by the Optimism team, and defines accounts\\n * which are allowed to deploy contracts on Layer2. The Execution Manager will only allow an \\n * ovmCREATE or ovmCREATE2 operation to proceed if the deployer's address whitelisted.\\n * \\n * Compiler used: solc\\n * Runtime target: OVM\\n */\\ncontract OVM_DeployerWhitelist is iOVM_DeployerWhitelist {\\n\\n /**********************\\n * Contract Constants *\\n **********************/\\n\\n bytes32 internal constant KEY_INITIALIZED = 0x0000000000000000000000000000000000000000000000000000000000000010;\\n bytes32 internal constant KEY_OWNER = 0x0000000000000000000000000000000000000000000000000000000000000011;\\n bytes32 internal constant KEY_ALLOW_ARBITRARY_DEPLOYMENT = 0x0000000000000000000000000000000000000000000000000000000000000012;\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n \\n /**\\n * Blocks functions to anyone except the contract owner.\\n */\\n modifier onlyOwner() {\\n address owner = Lib_Bytes32Utils.toAddress(\\n Lib_SafeExecutionManagerWrapper.safeSLOAD(\\n KEY_OWNER\\n )\\n );\\n\\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(\\n Lib_SafeExecutionManagerWrapper.safeCALLER() == owner,\\n \\\"Function can only be called by the owner of this contract.\\\"\\n );\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n \\n /**\\n * Initializes the whitelist.\\n * @param _owner Address of the owner for this contract.\\n * @param _allowArbitraryDeployment Whether or not to allow arbitrary contract deployment.\\n */\\n function initialize(\\n address _owner,\\n bool _allowArbitraryDeployment\\n )\\n override\\n public\\n {\\n bool initialized = Lib_Bytes32Utils.toBool(\\n Lib_SafeExecutionManagerWrapper.safeSLOAD(KEY_INITIALIZED)\\n );\\n\\n if (initialized == true) {\\n return;\\n }\\n\\n Lib_SafeExecutionManagerWrapper.safeSSTORE(\\n KEY_INITIALIZED,\\n Lib_Bytes32Utils.fromBool(true)\\n );\\n Lib_SafeExecutionManagerWrapper.safeSSTORE(\\n KEY_OWNER,\\n Lib_Bytes32Utils.fromAddress(_owner)\\n );\\n Lib_SafeExecutionManagerWrapper.safeSSTORE(\\n KEY_ALLOW_ARBITRARY_DEPLOYMENT,\\n Lib_Bytes32Utils.fromBool(_allowArbitraryDeployment)\\n );\\n }\\n\\n /**\\n * Gets the owner of the whitelist.\\n */\\n function getOwner()\\n override\\n public\\n returns(\\n address\\n )\\n {\\n return Lib_Bytes32Utils.toAddress(\\n Lib_SafeExecutionManagerWrapper.safeSLOAD(\\n KEY_OWNER\\n )\\n );\\n }\\n\\n /**\\n * Adds or removes an address from the deployment whitelist.\\n * @param _deployer Address to update permissions for.\\n * @param _isWhitelisted Whether or not the address is whitelisted.\\n */\\n function setWhitelistedDeployer(\\n address _deployer,\\n bool _isWhitelisted\\n )\\n override\\n public\\n onlyOwner\\n {\\n Lib_SafeExecutionManagerWrapper.safeSSTORE(\\n Lib_Bytes32Utils.fromAddress(_deployer),\\n Lib_Bytes32Utils.fromBool(_isWhitelisted)\\n );\\n }\\n\\n /**\\n * Updates the owner of this contract.\\n * @param _owner Address of the new owner.\\n */\\n function setOwner(\\n address _owner\\n )\\n override\\n public\\n onlyOwner\\n {\\n Lib_SafeExecutionManagerWrapper.safeSSTORE(\\n KEY_OWNER,\\n Lib_Bytes32Utils.fromAddress(_owner)\\n );\\n }\\n\\n /**\\n * Updates the arbitrary deployment flag.\\n * @param _allowArbitraryDeployment Whether or not to allow arbitrary contract deployment.\\n */\\n function setAllowArbitraryDeployment(\\n bool _allowArbitraryDeployment\\n )\\n override\\n public\\n onlyOwner\\n {\\n Lib_SafeExecutionManagerWrapper.safeSSTORE(\\n KEY_ALLOW_ARBITRARY_DEPLOYMENT,\\n Lib_Bytes32Utils.fromBool(_allowArbitraryDeployment)\\n );\\n }\\n\\n /**\\n * Permanently enables arbitrary contract deployment and deletes the owner.\\n */\\n function enableArbitraryContractDeployment()\\n override\\n public\\n onlyOwner\\n {\\n setAllowArbitraryDeployment(true);\\n setOwner(address(0));\\n }\\n\\n /**\\n * Checks whether an address is allowed to deploy contracts.\\n * @param _deployer Address to check.\\n * @return _allowed Whether or not the address can deploy contracts.\\n */\\n function isDeployerAllowed(\\n address _deployer\\n )\\n override\\n public\\n returns (\\n bool _allowed\\n )\\n {\\n bool initialized = Lib_Bytes32Utils.toBool(\\n Lib_SafeExecutionManagerWrapper.safeSLOAD(KEY_INITIALIZED)\\n );\\n\\n if (initialized == false) {\\n return true;\\n }\\n\\n bool allowArbitraryDeployment = Lib_Bytes32Utils.toBool(\\n Lib_SafeExecutionManagerWrapper.safeSLOAD(KEY_ALLOW_ARBITRARY_DEPLOYMENT)\\n );\\n\\n if (allowArbitraryDeployment == true) {\\n return true;\\n }\\n\\n bool isWhitelisted = Lib_Bytes32Utils.toBool(\\n Lib_SafeExecutionManagerWrapper.safeSLOAD(\\n Lib_Bytes32Utils.fromAddress(_deployer)\\n )\\n );\\n\\n return isWhitelisted; \\n }\\n}\\n\",\"keccak256\":\"0xe746e2a3f649d3d9760db8a0b6dccee5cdb267c9615268181285846277307084\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/accounts/iOVM_ECDSAContractAccount.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title iOVM_ECDSAContractAccount\\n */\\ninterface iOVM_ECDSAContractAccount {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function execute(\\n bytes memory _transaction,\\n Lib_OVMCodec.EOASignatureType _signatureType,\\n uint8 _v,\\n bytes32 _r,\\n bytes32 _s\\n ) external returns (bool _success, bytes memory _returndata);\\n}\\n\",\"keccak256\":\"0x308729bc62dcffb11ff1d840781105cf1bf0dd4cbcfb1af704b800bb0cfe9b85\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_CanonicalTransactionChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_ChainStorageContainer } from \\\"./iOVM_ChainStorageContainer.sol\\\";\\n\\n/**\\n * @title iOVM_CanonicalTransactionChain\\n */\\ninterface iOVM_CanonicalTransactionChain {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event TransactionEnqueued(\\n address _l1TxOrigin,\\n address _target,\\n uint256 _gasLimit,\\n bytes _data,\\n uint256 _queueIndex,\\n uint256 _timestamp\\n );\\n\\n event QueueBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event SequencerBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event TransactionBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct BatchContext {\\n uint256 numSequencedTransactions;\\n uint256 numSubsequentQueueTransactions;\\n uint256 timestamp;\\n uint256 blockNumber;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n\\n /**\\n * Accesses the batch storage container.\\n * @return Reference to the batch storage container.\\n */\\n function batches()\\n external\\n view\\n returns (\\n iOVM_ChainStorageContainer\\n );\\n\\n /**\\n * Accesses the queue storage container.\\n * @return Reference to the queue storage container.\\n */\\n function queue()\\n external\\n view\\n returns (\\n iOVM_ChainStorageContainer\\n );\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements()\\n external\\n view\\n returns (\\n uint256 _totalElements\\n );\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches()\\n external\\n view\\n returns (\\n uint256 _totalBatches\\n );\\n\\n /**\\n * Returns the index of the next element to be enqueued.\\n * @return Index for the next queue element.\\n */\\n function getNextQueueIndex()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Gets the queue element at a particular index.\\n * @param _index Index of the queue element to access.\\n * @return _element Queue element at the given index.\\n */\\n function getQueueElement(\\n uint256 _index\\n )\\n external\\n view\\n returns (\\n Lib_OVMCodec.QueueElement memory _element\\n );\\n\\n /**\\n * Returns the timestamp of the last transaction.\\n * @return Timestamp for the last transaction.\\n */\\n function getLastTimestamp()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Returns the blocknumber of the last transaction.\\n * @return Blocknumber for the last transaction.\\n */\\n function getLastBlockNumber()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Get the number of queue elements which have not yet been included.\\n * @return Number of pending queue elements.\\n */\\n function getNumPendingQueueElements()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Retrieves the length of the queue, including\\n * both pending and canonical transactions.\\n * @return Length of the queue.\\n */\\n function getQueueLength()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n\\n /**\\n * Adds a transaction to the queue.\\n * @param _target Target contract to send the transaction to.\\n * @param _gasLimit Gas limit for the given transaction.\\n * @param _data Transaction data.\\n */\\n function enqueue(\\n address _target,\\n uint256 _gasLimit,\\n bytes memory _data\\n )\\n external;\\n\\n /**\\n * Appends a given number of queued transactions as a single batch.\\n * @param _numQueuedTransactions Number of transactions to append.\\n */\\n function appendQueueBatch(\\n uint256 _numQueuedTransactions\\n )\\n external;\\n\\n /**\\n * Allows the sequencer to append a batch of transactions.\\n * @dev This function uses a custom encoding scheme for efficiency reasons.\\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\\n * .param _contexts Array of batch contexts.\\n * .param _transactionDataFields Array of raw transaction data.\\n */\\n function appendSequencerBatch(\\n // uint40 _shouldStartAtElement,\\n // uint24 _totalElementsToAppend,\\n // BatchContext[] _contexts,\\n // bytes[] _transactionDataFields\\n )\\n external;\\n\\n /**\\n * Verifies whether a transaction is included in the chain.\\n * @param _transaction Transaction to verify.\\n * @param _txChainElement Transaction chain element corresponding to the transaction.\\n * @param _batchHeader Header of the batch the transaction was included in.\\n * @param _inclusionProof Inclusion proof for the provided transaction chain element.\\n * @return True if the transaction exists in the CTC, false if not.\\n */\\n function verifyTransaction(\\n Lib_OVMCodec.Transaction memory _transaction,\\n Lib_OVMCodec.TransactionChainElement memory _txChainElement,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _inclusionProof\\n )\\n external\\n view\\n returns (\\n bool\\n );\\n}\\n\",\"keccak256\":\"0xb5e55488a1982841c07cdf5ff475da4789596f111dd48f01b1918ee4c775cf3a\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_ChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title iOVM_ChainStorageContainer\\n */\\ninterface iOVM_ChainStorageContainer {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata()\\n external\\n view\\n returns (\\n bytes27\\n );\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length()\\n external\\n view\\n returns (\\n uint256\\n );\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(\\n bytes32 _object\\n )\\n external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(\\n bytes32 _object,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(\\n uint256 _index\\n )\\n external\\n view\\n returns (\\n bytes32\\n );\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index\\n )\\n external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Marks an index as overwritable, meaing the underlying buffer can start to write values over\\n * any objects before and including the given index.\\n */\\n function setNextOverwritableIndex(\\n uint256 _index\\n )\\n external;\\n}\\n\",\"keccak256\":\"0x2d7973a0ad84c23ec62624d3f1e3aeb198cc72686ff1e6cfa17155556b320c94\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/execution/iOVM_ExecutionManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\ninterface iOVM_ExecutionManager {\\n /**********\\n * Enums *\\n *********/\\n\\n enum RevertFlag {\\n OUT_OF_GAS,\\n INTENTIONAL_REVERT,\\n EXCEEDS_NUISANCE_GAS,\\n INVALID_STATE_ACCESS,\\n UNSAFE_BYTECODE,\\n CREATE_COLLISION,\\n STATIC_VIOLATION,\\n CREATOR_NOT_ALLOWED\\n }\\n\\n enum GasMetadataKey {\\n CURRENT_EPOCH_START_TIMESTAMP,\\n CUMULATIVE_SEQUENCER_QUEUE_GAS,\\n CUMULATIVE_L1TOL2_QUEUE_GAS,\\n PREV_EPOCH_SEQUENCER_QUEUE_GAS,\\n PREV_EPOCH_L1TOL2_QUEUE_GAS\\n }\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct GasMeterConfig {\\n uint256 minTransactionGasLimit;\\n uint256 maxTransactionGasLimit;\\n uint256 maxGasPerQueuePerEpoch;\\n uint256 secondsPerEpoch;\\n }\\n\\n struct GlobalContext {\\n uint256 ovmCHAINID;\\n }\\n\\n struct TransactionContext {\\n Lib_OVMCodec.QueueOrigin ovmL1QUEUEORIGIN;\\n uint256 ovmTIMESTAMP;\\n uint256 ovmNUMBER;\\n uint256 ovmGASLIMIT;\\n uint256 ovmTXGASLIMIT;\\n address ovmL1TXORIGIN;\\n }\\n\\n struct TransactionRecord {\\n uint256 ovmGasRefund;\\n }\\n\\n struct MessageContext {\\n address ovmCALLER;\\n address ovmADDRESS;\\n bool isStatic;\\n }\\n\\n struct MessageRecord {\\n uint256 nuisanceGasLeft;\\n }\\n\\n\\n /************************************\\n * Transaction Execution Entrypoint *\\n ************************************/\\n\\n function run(\\n Lib_OVMCodec.Transaction calldata _transaction,\\n address _txStateManager\\n ) external;\\n\\n\\n /*******************\\n * Context Opcodes *\\n *******************/\\n\\n function ovmCALLER() external view returns (address _caller);\\n function ovmADDRESS() external view returns (address _address);\\n function ovmTIMESTAMP() external view returns (uint256 _timestamp);\\n function ovmNUMBER() external view returns (uint256 _number);\\n function ovmGASLIMIT() external view returns (uint256 _gasLimit);\\n function ovmCHAINID() external view returns (uint256 _chainId);\\n\\n\\n /**********************\\n * L2 Context Opcodes *\\n **********************/\\n\\n function ovmL1QUEUEORIGIN() external view returns (Lib_OVMCodec.QueueOrigin _queueOrigin);\\n function ovmL1TXORIGIN() external view returns (address _l1TxOrigin);\\n\\n\\n /*******************\\n * Halting Opcodes *\\n *******************/\\n\\n function ovmREVERT(bytes memory _data) external;\\n\\n\\n /*****************************\\n * Contract Creation Opcodes *\\n *****************************/\\n\\n function ovmCREATE(bytes memory _bytecode) external returns (address _contract, bytes memory _revertdata);\\n function ovmCREATE2(bytes memory _bytecode, bytes32 _salt) external returns (address _contract, bytes memory _revertdata);\\n\\n\\n /*******************************\\n * Account Abstraction Opcodes *\\n ******************************/\\n\\n function ovmGETNONCE() external returns (uint256 _nonce);\\n function ovmINCREMENTNONCE() external;\\n function ovmCREATEEOA(bytes32 _messageHash, uint8 _v, bytes32 _r, bytes32 _s) external;\\n\\n\\n /****************************\\n * Contract Calling Opcodes *\\n ****************************/\\n\\n function ovmCALL(uint256 _gasLimit, address _address, bytes memory _calldata) external returns (bool _success, bytes memory _returndata);\\n function ovmSTATICCALL(uint256 _gasLimit, address _address, bytes memory _calldata) external returns (bool _success, bytes memory _returndata);\\n function ovmDELEGATECALL(uint256 _gasLimit, address _address, bytes memory _calldata) external returns (bool _success, bytes memory _returndata);\\n\\n\\n /****************************\\n * Contract Storage Opcodes *\\n ****************************/\\n\\n function ovmSLOAD(bytes32 _key) external returns (bytes32 _value);\\n function ovmSSTORE(bytes32 _key, bytes32 _value) external;\\n\\n\\n /*************************\\n * Contract Code Opcodes *\\n *************************/\\n\\n function ovmEXTCODECOPY(address _contract, uint256 _offset, uint256 _length) external returns (bytes memory _code);\\n function ovmEXTCODESIZE(address _contract) external returns (uint256 _size);\\n function ovmEXTCODEHASH(address _contract) external returns (bytes32 _hash);\\n\\n\\n /***************************************\\n * Public Functions: Execution Context *\\n ***************************************/\\n\\n function getMaxTransactionGasLimit() external view returns (uint _maxTransactionGasLimit);\\n}\\n\",\"keccak256\":\"0xa613e2f578d56aa80f0916df538b487f8213a18933e78fdecb9efeedae02cf9c\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/execution/iOVM_SafetyChecker.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title iOVM_SafetyChecker\\n */\\ninterface iOVM_SafetyChecker {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function isBytecodeSafe(bytes calldata _bytecode) external pure returns (bool);\\n}\\n\",\"keccak256\":\"0xde6639676d4ec4f77297652d5ede2429bc93e74e11fefd9e9de4bc92dd784878\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/execution/iOVM_StateManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title iOVM_StateManager\\n */\\ninterface iOVM_StateManager {\\n\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n enum ItemState {\\n ITEM_UNTOUCHED,\\n ITEM_LOADED,\\n ITEM_CHANGED,\\n ITEM_COMMITTED\\n }\\n\\n /***************************\\n * Public Functions: Misc *\\n ***************************/\\n\\n function isAuthenticated(address _address) external view returns (bool);\\n\\n /***************************\\n * Public Functions: Setup *\\n ***************************/\\n\\n function owner() external view returns (address _owner);\\n function ovmExecutionManager() external view returns (address _ovmExecutionManager);\\n function setExecutionManager(address _ovmExecutionManager) external;\\n\\n\\n /************************************\\n * Public Functions: Account Access *\\n ************************************/\\n\\n function putAccount(address _address, Lib_OVMCodec.Account memory _account) external;\\n function putEmptyAccount(address _address) external;\\n function getAccount(address _address) external view returns (Lib_OVMCodec.Account memory _account);\\n function hasAccount(address _address) external view returns (bool _exists);\\n function hasEmptyAccount(address _address) external view returns (bool _exists);\\n function setAccountNonce(address _address, uint256 _nonce) external;\\n function getAccountNonce(address _address) external view returns (uint256 _nonce);\\n function getAccountEthAddress(address _address) external view returns (address _ethAddress);\\n function getAccountStorageRoot(address _address) external view returns (bytes32 _storageRoot);\\n function initPendingAccount(address _address) external;\\n function commitPendingAccount(address _address, address _ethAddress, bytes32 _codeHash) external;\\n function testAndSetAccountLoaded(address _address) external returns (bool _wasAccountAlreadyLoaded);\\n function testAndSetAccountChanged(address _address) external returns (bool _wasAccountAlreadyChanged);\\n function commitAccount(address _address) external returns (bool _wasAccountCommitted);\\n function incrementTotalUncommittedAccounts() external;\\n function getTotalUncommittedAccounts() external view returns (uint256 _total);\\n function wasAccountChanged(address _address) external view returns (bool);\\n function wasAccountCommitted(address _address) external view returns (bool);\\n\\n\\n /************************************\\n * Public Functions: Storage Access *\\n ************************************/\\n\\n function putContractStorage(address _contract, bytes32 _key, bytes32 _value) external;\\n function getContractStorage(address _contract, bytes32 _key) external view returns (bytes32 _value);\\n function hasContractStorage(address _contract, bytes32 _key) external view returns (bool _exists);\\n function testAndSetContractStorageLoaded(address _contract, bytes32 _key) external returns (bool _wasContractStorageAlreadyLoaded);\\n function testAndSetContractStorageChanged(address _contract, bytes32 _key) external returns (bool _wasContractStorageAlreadyChanged);\\n function commitContractStorage(address _contract, bytes32 _key) external returns (bool _wasContractStorageCommitted);\\n function incrementTotalUncommittedContractStorage() external;\\n function getTotalUncommittedContractStorage() external view returns (uint256 _total);\\n function wasContractStorageChanged(address _contract, bytes32 _key) external view returns (bool);\\n function wasContractStorageCommitted(address _contract, bytes32 _key) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x7a11dbd1f61593ba34debe07e39eef59967307f7f372ba9855bee0953585d08d\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/predeploys/iOVM_DeployerWhitelist.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title iOVM_DeployerWhitelist\\n */\\ninterface iOVM_DeployerWhitelist {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function initialize(address _owner, bool _allowArbitraryDeployment) external;\\n function getOwner() external returns (address _owner);\\n function setWhitelistedDeployer(address _deployer, bool _isWhitelisted) external;\\n function setOwner(address _newOwner) external;\\n function setAllowArbitraryDeployment(bool _allowArbitraryDeployment) external;\\n function enableArbitraryContractDeployment() external;\\n function isDeployerAllowed(address _deployer) external returns (bool _allowed);\\n}\\n\",\"keccak256\":\"0x969394371cacfc36493230150b6d629173ea72dfdf729330bede475b91d0f004\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/codec/Lib_OVMCodec.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../utils/Lib_Bytes32Utils.sol\\\";\\nimport { Lib_SafeExecutionManagerWrapper } from \\\"../../libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\\\";\\n\\n/**\\n * @title Lib_OVMCodec\\n */\\nlibrary Lib_OVMCodec {\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum EOASignatureType {\\n EIP155_TRANSACTION,\\n ETH_SIGNED_MESSAGE\\n }\\n\\n enum QueueOrigin {\\n SEQUENCER_QUEUE,\\n L1TOL2_QUEUE\\n }\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Account {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n address ethAddress;\\n bool isFresh;\\n }\\n\\n struct EVMAccount {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n }\\n\\n struct ChainBatchHeader {\\n uint256 batchIndex;\\n bytes32 batchRoot;\\n uint256 batchSize;\\n uint256 prevTotalElements;\\n bytes extraData;\\n }\\n\\n struct ChainInclusionProof {\\n uint256 index;\\n bytes32[] siblings;\\n }\\n\\n struct Transaction {\\n uint256 timestamp;\\n uint256 blockNumber;\\n QueueOrigin l1QueueOrigin;\\n address l1TxOrigin;\\n address entrypoint;\\n uint256 gasLimit;\\n bytes data;\\n }\\n\\n struct TransactionChainElement {\\n bool isSequenced;\\n uint256 queueIndex; // QUEUED TX ONLY\\n uint256 timestamp; // SEQUENCER TX ONLY\\n uint256 blockNumber; // SEQUENCER TX ONLY\\n bytes txData; // SEQUENCER TX ONLY\\n }\\n\\n struct QueueElement {\\n bytes32 transactionHash;\\n uint40 timestamp;\\n uint40 blockNumber;\\n }\\n\\n struct EIP155Transaction {\\n uint256 nonce;\\n uint256 gasPrice;\\n uint256 gasLimit;\\n address to;\\n uint256 value;\\n bytes data;\\n uint256 chainId;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Decodes an EOA transaction (i.e., native Ethereum RLP encoding).\\n * @param _transaction Encoded EOA transaction.\\n * @return Transaction decoded into a struct.\\n */\\n function decodeEIP155Transaction(\\n bytes memory _transaction,\\n bool _isEthSignedMessage\\n )\\n internal\\n pure\\n returns (\\n EIP155Transaction memory\\n )\\n {\\n if (_isEthSignedMessage) {\\n (\\n uint256 _nonce,\\n uint256 _gasLimit,\\n uint256 _gasPrice,\\n uint256 _chainId,\\n address _to,\\n bytes memory _data\\n ) = abi.decode(\\n _transaction,\\n (uint256, uint256, uint256, uint256, address ,bytes)\\n );\\n return EIP155Transaction({\\n nonce: _nonce,\\n gasPrice: _gasPrice,\\n gasLimit: _gasLimit,\\n to: _to,\\n value: 0,\\n data: _data,\\n chainId: _chainId\\n });\\n } else {\\n Lib_RLPReader.RLPItem[] memory decoded = Lib_RLPReader.readList(_transaction);\\n\\n return EIP155Transaction({\\n nonce: Lib_RLPReader.readUint256(decoded[0]),\\n gasPrice: Lib_RLPReader.readUint256(decoded[1]),\\n gasLimit: Lib_RLPReader.readUint256(decoded[2]),\\n to: Lib_RLPReader.readAddress(decoded[3]),\\n value: Lib_RLPReader.readUint256(decoded[4]),\\n data: Lib_RLPReader.readBytes(decoded[5]),\\n chainId: Lib_RLPReader.readUint256(decoded[6])\\n });\\n }\\n }\\n\\n /**\\n * Decompresses a compressed EIP155 transaction.\\n * @param _transaction Compressed EIP155 transaction bytes.\\n * @return Transaction parsed into a struct.\\n */\\n function decompressEIP155Transaction(\\n bytes memory _transaction\\n )\\n internal\\n returns (\\n EIP155Transaction memory\\n )\\n {\\n return EIP155Transaction({\\n gasLimit: Lib_BytesUtils.toUint24(_transaction, 0),\\n gasPrice: uint256(Lib_BytesUtils.toUint24(_transaction, 3)) * 1000000,\\n nonce: Lib_BytesUtils.toUint24(_transaction, 6),\\n to: Lib_BytesUtils.toAddress(_transaction, 9),\\n data: Lib_BytesUtils.slice(_transaction, 29),\\n chainId: Lib_SafeExecutionManagerWrapper.safeCHAINID(),\\n value: 0\\n });\\n }\\n\\n /**\\n * Encodes an EOA transaction back into the original transaction.\\n * @param _transaction EIP155transaction to encode.\\n * @param _isEthSignedMessage Whether or not this was an eth signed message.\\n * @return Encoded transaction.\\n */\\n function encodeEIP155Transaction(\\n EIP155Transaction memory _transaction,\\n bool _isEthSignedMessage\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n if (_isEthSignedMessage) {\\n return abi.encode(\\n _transaction.nonce,\\n _transaction.gasLimit,\\n _transaction.gasPrice,\\n _transaction.chainId,\\n _transaction.to,\\n _transaction.data\\n );\\n } else {\\n bytes[] memory raw = new bytes[](9);\\n\\n raw[0] = Lib_RLPWriter.writeUint(_transaction.nonce);\\n raw[1] = Lib_RLPWriter.writeUint(_transaction.gasPrice);\\n raw[2] = Lib_RLPWriter.writeUint(_transaction.gasLimit);\\n if (_transaction.to == address(0)) {\\n raw[3] = Lib_RLPWriter.writeBytes('');\\n } else {\\n raw[3] = Lib_RLPWriter.writeAddress(_transaction.to);\\n }\\n raw[4] = Lib_RLPWriter.writeUint(0);\\n raw[5] = Lib_RLPWriter.writeBytes(_transaction.data);\\n raw[6] = Lib_RLPWriter.writeUint(_transaction.chainId);\\n raw[7] = Lib_RLPWriter.writeBytes(bytes(''));\\n raw[8] = Lib_RLPWriter.writeBytes(bytes(''));\\n\\n return Lib_RLPWriter.writeList(raw);\\n }\\n }\\n\\n /**\\n * Encodes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Encoded transaction bytes.\\n */\\n function encodeTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return abi.encodePacked(\\n _transaction.timestamp,\\n _transaction.blockNumber,\\n _transaction.l1QueueOrigin,\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n );\\n }\\n\\n /**\\n * Hashes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Hashed transaction\\n */\\n function hashTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(encodeTransaction(_transaction));\\n }\\n\\n /**\\n * Converts an OVM account to an EVM account.\\n * @param _in OVM account to convert.\\n * @return Converted EVM account.\\n */\\n function toEVMAccount(\\n Account memory _in\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n return EVMAccount({\\n nonce: _in.nonce,\\n balance: _in.balance,\\n storageRoot: _in.storageRoot,\\n codeHash: _in.codeHash\\n });\\n }\\n\\n /**\\n * @notice RLP-encodes an account state struct.\\n * @param _account Account state struct.\\n * @return RLP-encoded account state.\\n */\\n function encodeEVMAccount(\\n EVMAccount memory _account\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes[] memory raw = new bytes[](4);\\n\\n // Unfortunately we can't create this array outright because\\n // Lib_RLPWriter.writeList will reject fixed-size arrays. Assigning\\n // index-by-index circumvents this issue.\\n raw[0] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.nonce)\\n )\\n );\\n raw[1] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.balance)\\n )\\n );\\n raw[2] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.storageRoot));\\n raw[3] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.codeHash));\\n\\n return Lib_RLPWriter.writeList(raw);\\n }\\n\\n /**\\n * @notice Decodes an RLP-encoded account state into a useful struct.\\n * @param _encoded RLP-encoded account state.\\n * @return Account state struct.\\n */\\n function decodeEVMAccount(\\n bytes memory _encoded\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\\n\\n return EVMAccount({\\n nonce: Lib_RLPReader.readUint256(accountState[0]),\\n balance: Lib_RLPReader.readUint256(accountState[1]),\\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\\n });\\n }\\n\\n /**\\n * Calculates a hash for a given batch header.\\n * @param _batchHeader Header to hash.\\n * @return Hash of the header.\\n */\\n function hashBatchHeader(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(\\n abi.encode(\\n _batchHeader.batchRoot,\\n _batchHeader.batchSize,\\n _batchHeader.prevTotalElements,\\n _batchHeader.extraData\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0xe7e518ba7bba3fa28c532f8902576c1bb4dfc1ec4b62bed6da50623248ba17c3\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Contract Imports */\\nimport { Ownable } from \\\"./Lib_Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n /*******************************************\\n * Contract Variables: Internal Accounting *\\n *******************************************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n public\\n onlyOwner\\n {\\n emit AddressSet(_name, _address);\\n addresses[_getNameHash(_name)] = _address;\\n }\\n\\n function getAddress(\\n string memory _name\\n )\\n public\\n view\\n returns (address)\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32 _hash\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0x3a490595cc21ff170e4027843093670ff845d5972481fbfb956b722ea564bb06\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n\\n /*******************************************\\n * Contract Variables: Contract References *\\n *******************************************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(\\n address _libAddressManager\\n ) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function resolve(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address _contract\\n )\\n {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0xaa3ed342f6deb156c660fd83afa579a3b80db17eb465e8949cf5c1b114780143\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Ownable\\n * @dev Adapted from https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol\\n */\\nabstract contract Ownable {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n address public owner;\\n\\n\\n /**********\\n * Events *\\n **********/\\n\\n event OwnershipTransferred(\\n address indexed previousOwner,\\n address indexed newOwner\\n );\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n constructor() {\\n owner = msg.sender;\\n emit OwnershipTransferred(address(0), owner);\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n owner == msg.sender,\\n \\\"Ownable: caller is not the owner\\\"\\n );\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function renounceOwnership()\\n public\\n virtual\\n onlyOwner\\n {\\n emit OwnershipTransferred(owner, address(0));\\n owner = address(0);\\n }\\n\\n function transferOwnership(address _newOwner)\\n public\\n virtual\\n onlyOwner\\n {\\n require(\\n _newOwner != address(0),\\n \\\"Ownable: new owner cannot be the zero address\\\"\\n );\\n\\n emit OwnershipTransferred(owner, _newOwner);\\n owner = _newOwner;\\n }\\n}\\n\",\"keccak256\":\"0xd9dfd9264e5b5fedd53a5b10fdf179c3f367614b0fe69179bce4e45119f5b739\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPReader.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_RLPReader\\n * @dev Adapted from \\\"RLPReader\\\" by Hamdi Allam (hamdi.allam97@gmail.com).\\n */\\nlibrary Lib_RLPReader {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 constant internal MAX_LIST_LENGTH = 32;\\n\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum RLPItemType {\\n DATA_ITEM,\\n LIST_ITEM\\n }\\n\\n \\n /***********\\n * Structs *\\n ***********/\\n\\n struct RLPItem {\\n uint256 length;\\n uint256 ptr;\\n }\\n \\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n \\n /**\\n * Converts bytes to a reference to memory position and length.\\n * @param _in Input bytes to convert.\\n * @return Output memory reference.\\n */\\n function toRLPItem(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem memory\\n )\\n {\\n uint256 ptr;\\n assembly {\\n ptr := add(_in, 32)\\n }\\n\\n return RLPItem({\\n length: _in.length,\\n ptr: ptr\\n });\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n (\\n uint256 listOffset,\\n ,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.LIST_ITEM,\\n \\\"Invalid RLP list value.\\\"\\n );\\n\\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\\n // writing to the length. Since we can't know the number of RLP items without looping over\\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\\n // simply set a reasonable maximum list length and decrease the size before we finish.\\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\\n\\n uint256 itemCount = 0;\\n uint256 offset = listOffset;\\n while (offset < _in.length) {\\n require(\\n itemCount < MAX_LIST_LENGTH,\\n \\\"Provided RLP list exceeds max list length.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n ) = _decodeLength(RLPItem({\\n length: _in.length - offset,\\n ptr: _in.ptr + offset\\n }));\\n\\n out[itemCount] = RLPItem({\\n length: itemLength + itemOffset,\\n ptr: _in.ptr + offset\\n });\\n\\n itemCount += 1;\\n offset += itemOffset + itemLength;\\n }\\n\\n // Decrease the array size to match the actual item count.\\n assembly {\\n mstore(out, itemCount)\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n return readList(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes value.\\\"\\n );\\n\\n return _copy(_in.ptr, itemOffset, itemLength);\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return readBytes(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return string(readBytes(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return readString(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n require(\\n _in.length <= 33,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr + itemOffset;\\n bytes32 out;\\n assembly {\\n out := mload(ptr)\\n\\n // Shift the bytes over to match the item size.\\n if lt(itemLength, 32) {\\n out := div(out, exp(256, sub(32, itemLength)))\\n }\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return readBytes32(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return uint256(readBytes32(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return readUint256(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n require(\\n _in.length == 1,\\n \\\"Invalid RLP boolean value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 out;\\n assembly {\\n out := byte(0, mload(ptr))\\n }\\n\\n require(\\n out == 0 || out == 1,\\n \\\"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\\\"\\n );\\n\\n return out != 0;\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return readBool(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n if (_in.length == 1) {\\n return address(0);\\n }\\n\\n require(\\n _in.length == 21,\\n \\\"Invalid RLP address value.\\\"\\n );\\n\\n return address(readUint256(_in));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return readAddress(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads the raw bytes of an RLP item.\\n * @param _in RLP item to read.\\n * @return Raw RLP bytes.\\n */\\n function readRawBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in);\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Decodes the length of an RLP item.\\n * @param _in RLP item to decode.\\n * @return Offset of the encoded data.\\n * @return Length of the encoded data.\\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\\n */\\n function _decodeLength(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n uint256,\\n uint256,\\n RLPItemType\\n )\\n {\\n require(\\n _in.length > 0,\\n \\\"RLP item cannot be null.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 prefix;\\n assembly {\\n prefix := byte(0, mload(ptr))\\n }\\n\\n if (prefix <= 0x7f) {\\n // Single byte.\\n\\n return (0, 1, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xb7) {\\n // Short string.\\n\\n uint256 strLen = prefix - 0x80;\\n \\n require(\\n _in.length > strLen,\\n \\\"Invalid RLP short string.\\\"\\n );\\n\\n return (1, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xbf) {\\n // Long string.\\n uint256 lenOfStrLen = prefix - 0xb7;\\n\\n require(\\n _in.length > lenOfStrLen,\\n \\\"Invalid RLP long string length.\\\"\\n );\\n\\n uint256 strLen;\\n assembly {\\n // Pick out the string length.\\n strLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfStrLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfStrLen + strLen,\\n \\\"Invalid RLP long string.\\\"\\n );\\n\\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xf7) {\\n // Short list.\\n uint256 listLen = prefix - 0xc0;\\n\\n require(\\n _in.length > listLen,\\n \\\"Invalid RLP short list.\\\"\\n );\\n\\n return (1, listLen, RLPItemType.LIST_ITEM);\\n } else {\\n // Long list.\\n uint256 lenOfListLen = prefix - 0xf7;\\n\\n require(\\n _in.length > lenOfListLen,\\n \\\"Invalid RLP long list length.\\\"\\n );\\n\\n uint256 listLen;\\n assembly {\\n // Pick out the list length.\\n listLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfListLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfListLen + listLen,\\n \\\"Invalid RLP long list.\\\"\\n );\\n\\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\\n }\\n }\\n\\n /**\\n * Copies the bytes from a memory location.\\n * @param _src Pointer to the location to read from.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Copied bytes.\\n */\\n function _copy(\\n uint256 _src,\\n uint256 _offset,\\n uint256 _length\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out = new bytes(_length);\\n if (out.length == 0) {\\n return out;\\n }\\n\\n uint256 src = _src + _offset;\\n uint256 dest;\\n assembly {\\n dest := add(out, 32)\\n }\\n\\n // Copy over as many complete words as we can.\\n for (uint256 i = 0; i < _length / 32; i++) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n\\n src += 32;\\n dest += 32;\\n }\\n\\n // Pick out the remaining bytes.\\n uint256 mask = 256 ** (32 - (_length % 32)) - 1;\\n assembly {\\n mstore(\\n dest,\\n or(\\n and(mload(src), not(mask)),\\n and(mload(dest), mask)\\n )\\n )\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Copies an RLP item into bytes.\\n * @param _in RLP item to copy.\\n * @return Copied bytes.\\n */\\n function _copy(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in.ptr, 0, _in.length);\\n }\\n}\\n\",\"keccak256\":\"0xbdb8fae0ca2483b4cc07607a5070fc25e33c54b4e4462b99e7c0b13aac48a09b\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPWriter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\n\\n/**\\n * @title Lib_RLPWriter\\n * @author Bakaoh (with modifications)\\n */\\nlibrary Lib_RLPWriter {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * RLP encodes a byte string.\\n * @param _in The byte string to encode.\\n * @return _out The RLP encoded string in bytes.\\n */\\n function writeBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n bytes memory encoded;\\n\\n if (_in.length == 1 && uint8(_in[0]) < 128) {\\n encoded = _in;\\n } else {\\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * RLP encodes a list of RLP encoded byte byte strings.\\n * @param _in The list of RLP encoded byte strings.\\n * @return _out The RLP encoded list of items in bytes.\\n */\\n function writeList(\\n bytes[] memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n bytes memory list = _flatten(_in);\\n return abi.encodePacked(_writeLength(list.length, 192), list);\\n }\\n\\n /**\\n * RLP encodes a string.\\n * @param _in The string to encode.\\n * @return _out The RLP encoded string in bytes.\\n */\\n function writeString(\\n string memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(bytes(_in));\\n }\\n\\n /**\\n * RLP encodes an address.\\n * @param _in The address to encode.\\n * @return _out The RLP encoded address in bytes.\\n */\\n function writeAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a uint.\\n * @param _in The uint256 to encode.\\n * @return _out The RLP encoded uint256 in bytes.\\n */\\n function writeUint(\\n uint256 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(_toBinary(_in));\\n }\\n\\n /**\\n * RLP encodes a bool.\\n * @param _in The bool to encode.\\n * @return _out The RLP encoded bool in bytes.\\n */\\n function writeBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n bytes memory encoded = new bytes(1);\\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\\n return encoded;\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\\n * @param _len The length of the string or the payload.\\n * @param _offset 128 if item is string, 192 if item is list.\\n * @return _encoded RLP encoded bytes.\\n */\\n function _writeLength(\\n uint256 _len,\\n uint256 _offset\\n )\\n private\\n pure\\n returns (\\n bytes memory _encoded\\n )\\n {\\n bytes memory encoded;\\n\\n if (_len < 56) {\\n encoded = new bytes(1);\\n encoded[0] = byte(uint8(_len) + uint8(_offset));\\n } else {\\n uint256 lenLen;\\n uint256 i = 1;\\n while (_len / i != 0) {\\n lenLen++;\\n i *= 256;\\n }\\n\\n encoded = new bytes(lenLen + 1);\\n encoded[0] = byte(uint8(lenLen) + uint8(_offset) + 55);\\n for(i = 1; i <= lenLen; i++) {\\n encoded[i] = byte(uint8((_len / (256**(lenLen-i))) % 256));\\n }\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * Encode integer in big endian binary form with no leading zeroes.\\n * @notice TODO: This should be optimized with assembly to save gas costs.\\n * @param _x The integer to encode.\\n * @return _binary RLP encoded bytes.\\n */\\n function _toBinary(\\n uint256 _x\\n )\\n private\\n pure\\n returns (\\n bytes memory _binary\\n )\\n {\\n bytes memory b = abi.encodePacked(_x);\\n\\n uint256 i = 0;\\n for (; i < 32; i++) {\\n if (b[i] != 0) {\\n break;\\n }\\n }\\n\\n bytes memory res = new bytes(32 - i);\\n for (uint256 j = 0; j < res.length; j++) {\\n res[j] = b[i++];\\n }\\n\\n return res;\\n }\\n\\n /**\\n * Copies a piece of memory to another location.\\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\\n * @param _dest Destination location.\\n * @param _src Source location.\\n * @param _len Length of memory to copy.\\n */\\n function _memcpy(\\n uint256 _dest,\\n uint256 _src,\\n uint256 _len\\n )\\n private\\n pure\\n {\\n uint256 dest = _dest;\\n uint256 src = _src;\\n uint256 len = _len;\\n\\n for(; len >= 32; len -= 32) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n dest += 32;\\n src += 32;\\n }\\n\\n uint256 mask = 256 ** (32 - len) - 1;\\n assembly {\\n let srcpart := and(mload(src), not(mask))\\n let destpart := and(mload(dest), mask)\\n mstore(dest, or(destpart, srcpart))\\n }\\n }\\n\\n /**\\n * Flattens a list of byte strings into one byte string.\\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\\n * @param _list List of byte strings to flatten.\\n * @return _flattened The flattened byte string.\\n */\\n function _flatten(\\n bytes[] memory _list\\n )\\n private\\n pure\\n returns (\\n bytes memory _flattened\\n )\\n {\\n if (_list.length == 0) {\\n return new bytes(0);\\n }\\n\\n uint256 len;\\n uint256 i = 0;\\n for (; i < _list.length; i++) {\\n len += _list[i].length;\\n }\\n\\n bytes memory flattened = new bytes(len);\\n uint256 flattenedPtr;\\n assembly { flattenedPtr := add(flattened, 0x20) }\\n\\n for(i = 0; i < _list.length; i++) {\\n bytes memory item = _list[i];\\n\\n uint256 listPtr;\\n assembly { listPtr := add(item, 0x20)}\\n\\n _memcpy(flattenedPtr, listPtr, item.length);\\n flattenedPtr += _list[i].length;\\n }\\n\\n return flattened;\\n }\\n}\",\"keccak256\":\"0xbcb24619c1758cb0d9f3fe5c79495950045a9087046a02b9ce01df46ae09ae5b\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_Bytes32Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_Byte32Utils\\n */\\nlibrary Lib_Bytes32Utils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \\\"true.\\\"\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as a boolean.\\n */\\n function toBool(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return _in != 0;\\n }\\n\\n /**\\n * Converts a boolean to a bytes32 value.\\n * @param _in Input boolean value.\\n * @return Boolean as a bytes32.\\n */\\n function fromBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in ? 1 : 0));\\n }\\n\\n /**\\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as an address.\\n */\\n function toAddress(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return address(uint160(uint256(_in)));\\n }\\n\\n /**\\n * Converts an address to a bytes32.\\n * @param _in Input address value.\\n * @return Address as a bytes32.\\n */\\n function fromAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in));\\n }\\n\\n /**\\n * Removes the leading zeros from a bytes32 value and returns a new (smaller) bytes value.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 without any leading zeros.\\n */\\n function removeLeadingZeros(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out;\\n\\n assembly {\\n // Figure out how many leading zero bytes to remove.\\n let shift := 0\\n for { let i := 0 } and(lt(i, 32), eq(byte(i, _in), 0)) { i := add(i, 1) } {\\n shift := add(shift, 1)\\n }\\n\\n // Reserve some space for our output and fix the free memory pointer.\\n out := mload(0x40)\\n mstore(0x40, add(out, 0x40))\\n\\n // Shift the value and store it into the output bytes.\\n mstore(add(out, 0x20), shl(mul(shift, 8), _in))\\n\\n // Store the new size (with leading zero bytes removed) in the output byte size.\\n mstore(out, sub(32, shift))\\n }\\n\\n return out;\\n }\\n}\\n\",\"keccak256\":\"0xfa2def593e3fc56a31852c3744aefdaa93cec74e721bfcfeb1e5d166c7c60b64\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_BytesUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_BytesUtils\\n */\\nlibrary Lib_BytesUtils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_start + _length >= _start, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n if (_bytes.length - _start == 0) {\\n return bytes('');\\n }\\n\\n return slice(_bytes, _start, _bytes.length - _start);\\n }\\n\\n function toBytes32PadLeft(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes32)\\n {\\n bytes32 ret;\\n uint256 len = _bytes.length <= 32 ? _bytes.length : 32;\\n assembly {\\n ret := shr(mul(sub(32, len), 8), mload(add(_bytes, 32)))\\n }\\n return ret;\\n }\\n\\n function toBytes32(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes32)\\n {\\n if (_bytes.length < 32) {\\n bytes32 ret;\\n assembly {\\n ret := mload(add(_bytes, 32))\\n }\\n return ret;\\n }\\n\\n return abi.decode(_bytes,(bytes32)); // will truncate if input length > 32 bytes\\n }\\n\\n function toUint256(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (uint256)\\n {\\n return uint256(toBytes32(_bytes));\\n }\\n\\n function toUint24(bytes memory _bytes, uint256 _start) internal pure returns (uint24) {\\n require(_start + 3 >= _start, \\\"toUint24_overflow\\\");\\n require(_bytes.length >= _start + 3 , \\\"toUint24_outOfBounds\\\");\\n uint24 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x3), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toUint8(bytes memory _bytes, uint256 _start) internal pure returns (uint8) {\\n require(_start + 1 >= _start, \\\"toUint8_overflow\\\");\\n require(_bytes.length >= _start + 1 , \\\"toUint8_outOfBounds\\\");\\n uint8 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x1), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toAddress(bytes memory _bytes, uint256 _start) internal pure returns (address) {\\n require(_start + 20 >= _start, \\\"toAddress_overflow\\\");\\n require(_bytes.length >= _start + 20, \\\"toAddress_outOfBounds\\\");\\n address tempAddress;\\n\\n assembly {\\n tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000)\\n }\\n\\n return tempAddress;\\n }\\n\\n function toNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n bytes memory nibbles = new bytes(_bytes.length * 2);\\n\\n for (uint256 i = 0; i < _bytes.length; i++) {\\n nibbles[i * 2] = _bytes[i] >> 4;\\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\\n }\\n\\n return nibbles;\\n }\\n\\n function fromNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n bytes memory ret = new bytes(_bytes.length / 2);\\n\\n for (uint256 i = 0; i < ret.length; i++) {\\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\\n }\\n\\n return ret;\\n }\\n\\n function equal(\\n bytes memory _bytes,\\n bytes memory _other\\n )\\n internal\\n pure\\n returns (bool)\\n {\\n return keccak256(_bytes) == keccak256(_other);\\n }\\n}\\n\",\"keccak256\":\"0x0adf22e1b22ba09911e859f64cb3b484e992be4f9fd3b09088e6225bf8d06ce0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_ECDSAUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_ECDSAUtils\\n */\\nlibrary Lib_ECDSAUtils {\\n\\n /**************************************\\n * Internal Functions: ECDSA Recovery *\\n **************************************/\\n\\n /**\\n * Recovers a signed address given a message and signature.\\n * @param _message Message that was originally signed.\\n * @param _isEthSignedMessage Whether or not the user used the `Ethereum Signed Message` prefix.\\n * @param _v Signature `v` parameter.\\n * @param _r Signature `r` parameter.\\n * @param _s Signature `s` parameter.\\n * @return _sender Signer address.\\n */\\n function recover(\\n bytes memory _message,\\n bool _isEthSignedMessage,\\n uint8 _v,\\n bytes32 _r,\\n bytes32 _s\\n )\\n internal\\n pure\\n returns (\\n address _sender\\n )\\n {\\n bytes32 messageHash = getMessageHash(_message, _isEthSignedMessage);\\n\\n return ecrecover(\\n messageHash,\\n _v + 27,\\n _r,\\n _s\\n );\\n }\\n\\n function getMessageHash(\\n bytes memory _message,\\n bool _isEthSignedMessage\\n )\\n internal\\n pure\\n returns (bytes32) {\\n if (_isEthSignedMessage) {\\n return getEthSignedMessageHash(_message);\\n }\\n return getNativeMessageHash(_message);\\n }\\n\\n\\n /*************************************\\n * Private Functions: ECDSA Recovery *\\n *************************************/\\n\\n /**\\n * Gets the native message hash (simple keccak256) for a message.\\n * @param _message Message to hash.\\n * @return _messageHash Native message hash.\\n */\\n function getNativeMessageHash(\\n bytes memory _message\\n )\\n private\\n pure\\n returns (\\n bytes32 _messageHash\\n )\\n {\\n return keccak256(_message);\\n }\\n\\n /**\\n * Gets the hash of a message with the `Ethereum Signed Message` prefix.\\n * @param _message Message to hash.\\n * @return _messageHash Prefixed message hash.\\n */\\n function getEthSignedMessageHash(\\n bytes memory _message\\n )\\n private\\n pure\\n returns (\\n bytes32 _messageHash\\n )\\n {\\n bytes memory prefix = \\\"\\\\x19Ethereum Signed Message:\\\\n32\\\";\\n bytes32 messageHash = keccak256(_message);\\n return keccak256(abi.encodePacked(prefix, messageHash));\\n }\\n}\",\"keccak256\":\"0xda865d8cc014940a4755e329db9c6272a31bd9a340000a4ecc005d46299a585c\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_ErrorUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/**\\n * @title Lib_ErrorUtils\\n */\\nlibrary Lib_ErrorUtils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Encodes an error string into raw solidity-style revert data.\\n * (i.e. ascii bytes, prefixed with bytes4(keccak(\\\"Error(string))\\\"))\\n * Ref: https://docs.soliditylang.org/en/v0.8.2/control-structures.html?highlight=Error(string)#panic-via-assert-and-error-via-require\\n * @param _reason Reason for the reversion.\\n * @return Standard solidity revert data for the given reason.\\n */\\n function encodeRevertString(\\n string memory _reason\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return abi.encodeWithSignature(\\n \\\"Error(string)\\\",\\n _reason\\n );\\n }\\n}\\n\",\"keccak256\":\"0xfc64ec4a81fb50865b502a0004ed154e8598e1a313db77303fc95e41f536e6b7\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_EthUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// @unsupported: ovm\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"./Lib_Bytes32Utils.sol\\\";\\n\\n/**\\n * @title Lib_EthUtils\\n */\\nlibrary Lib_EthUtils {\\n\\n /***********************************\\n * Internal Functions: Code Access *\\n ***********************************/\\n\\n /**\\n * Gets the code for a given address.\\n * @param _address Address to get code for.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return _code Code read from the contract.\\n */\\n function getCode(\\n address _address,\\n uint256 _offset,\\n uint256 _length\\n )\\n internal\\n view\\n returns (\\n bytes memory _code\\n )\\n {\\n assembly {\\n _code := mload(0x40)\\n mstore(0x40, add(_code, add(_length, 0x20)))\\n mstore(_code, _length)\\n extcodecopy(_address, add(_code, 0x20), _offset, _length)\\n }\\n\\n return _code;\\n }\\n\\n /**\\n * Gets the full code for a given address.\\n * @param _address Address to get code for.\\n * @return _code Full code of the contract.\\n */\\n function getCode(\\n address _address\\n )\\n internal\\n view\\n returns (\\n bytes memory _code\\n )\\n {\\n return getCode(\\n _address,\\n 0,\\n getCodeSize(_address)\\n );\\n }\\n\\n /**\\n * Gets the size of a contract's code in bytes.\\n * @param _address Address to get code size for.\\n * @return _codeSize Size of the contract's code in bytes.\\n */\\n function getCodeSize(\\n address _address\\n )\\n internal\\n view\\n returns (\\n uint256 _codeSize\\n )\\n {\\n assembly {\\n _codeSize := extcodesize(_address)\\n }\\n\\n return _codeSize;\\n }\\n\\n /**\\n * Gets the hash of a contract's code.\\n * @param _address Address to get a code hash for.\\n * @return _codeHash Hash of the contract's code.\\n */\\n function getCodeHash(\\n address _address\\n )\\n internal\\n view\\n returns (\\n bytes32 _codeHash\\n )\\n {\\n assembly {\\n _codeHash := extcodehash(_address)\\n }\\n\\n return _codeHash;\\n }\\n\\n\\n /*****************************************\\n * Internal Functions: Contract Creation *\\n *****************************************/\\n\\n /**\\n * Creates a contract with some given initialization code.\\n * @param _code Contract initialization code.\\n * @return _created Address of the created contract.\\n */\\n function createContract(\\n bytes memory _code\\n )\\n internal\\n returns (\\n address _created\\n )\\n {\\n assembly {\\n _created := create(\\n 0,\\n add(_code, 0x20),\\n mload(_code)\\n )\\n }\\n\\n return _created;\\n }\\n\\n /**\\n * Computes the address that would be generated by CREATE.\\n * @param _creator Address creating the contract.\\n * @param _nonce Creator's nonce.\\n * @return _address Address to be generated by CREATE.\\n */\\n function getAddressForCREATE(\\n address _creator,\\n uint256 _nonce\\n )\\n internal\\n pure\\n returns (\\n address _address\\n )\\n {\\n bytes[] memory encoded = new bytes[](2);\\n encoded[0] = Lib_RLPWriter.writeAddress(_creator);\\n encoded[1] = Lib_RLPWriter.writeUint(_nonce);\\n\\n bytes memory encodedList = Lib_RLPWriter.writeList(encoded);\\n return Lib_Bytes32Utils.toAddress(keccak256(encodedList));\\n }\\n\\n /**\\n * Computes the address that would be generated by CREATE2.\\n * @param _creator Address creating the contract.\\n * @param _bytecode Bytecode of the contract to be created.\\n * @param _salt 32 byte salt value mixed into the hash.\\n * @return _address Address to be generated by CREATE2.\\n */\\n function getAddressForCREATE2(\\n address _creator,\\n bytes memory _bytecode,\\n bytes32 _salt\\n )\\n internal\\n pure\\n returns (address _address)\\n {\\n bytes32 hashedData = keccak256(abi.encodePacked(\\n byte(0xff),\\n _creator,\\n _salt,\\n keccak256(_bytecode)\\n ));\\n\\n return Lib_Bytes32Utils.toAddress(hashedData);\\n }\\n}\\n\",\"keccak256\":\"0x5fdf009da11f90cb5e99e5cd160d07bb744a5a2055774a646bdf277ad6910595\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_Math\\n */\\nlibrary Lib_Math {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Calculates the minumum of two numbers.\\n * @param _x First number to compare.\\n * @param _y Second number to compare.\\n * @return Lesser of the two numbers.\\n */\\n function min(\\n uint256 _x,\\n uint256 _y\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n if (_x < _y) {\\n return _x;\\n }\\n\\n return _y;\\n }\\n}\\n\",\"keccak256\":\"0xcc36559529e708e99b8fd2ab0078fcba5a1f81787b08c1cf4cd46288ad64ee58\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_MerkleTree.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_MerkleTree\\n * @author River Keefer\\n */\\nlibrary Lib_MerkleTree {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Calculates a merkle root for a list of 32-byte leaf hashes. WARNING: If the number\\n * of leaves passed in is not a power of two, it pads out the tree with zero hashes.\\n * If you do not know the original length of elements for the tree you are verifying,\\n * then this may allow empty leaves past _elements.length to pass a verification check down the line.\\n * Note that the _elements argument is modified, therefore it must not be used again afterwards\\n * @param _elements Array of hashes from which to generate a merkle root.\\n * @return Merkle root of the leaves, with zero hashes for non-powers-of-two (see above).\\n */\\n function getMerkleRoot(\\n bytes32[] memory _elements\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n require(\\n _elements.length > 0,\\n \\\"Lib_MerkleTree: Must provide at least one leaf hash.\\\"\\n );\\n\\n if (_elements.length == 1) {\\n return _elements[0];\\n }\\n\\n uint256[16] memory defaults = [\\n 0x290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563,\\n 0x633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d,\\n 0x890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d,\\n 0x3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd8,\\n 0xecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da,\\n 0xdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da5,\\n 0x617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d7,\\n 0x292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead,\\n 0xe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e10,\\n 0x7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f82,\\n 0xe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e83636516,\\n 0x3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c,\\n 0xad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e,\\n 0xa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab,\\n 0x4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c862,\\n 0x2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf10\\n ];\\n\\n // Reserve memory space for our hashes.\\n bytes memory buf = new bytes(64);\\n\\n // We'll need to keep track of left and right siblings.\\n bytes32 leftSibling;\\n bytes32 rightSibling;\\n\\n // Number of non-empty nodes at the current depth.\\n uint256 rowSize = _elements.length;\\n\\n // Current depth, counting from 0 at the leaves\\n uint256 depth = 0;\\n\\n // Common sub-expressions\\n uint256 halfRowSize; // rowSize / 2\\n bool rowSizeIsOdd; // rowSize % 2 == 1\\n\\n while (rowSize > 1) {\\n halfRowSize = rowSize / 2;\\n rowSizeIsOdd = rowSize % 2 == 1;\\n\\n for (uint256 i = 0; i < halfRowSize; i++) {\\n leftSibling = _elements[(2 * i) ];\\n rightSibling = _elements[(2 * i) + 1];\\n assembly {\\n mstore(add(buf, 32), leftSibling )\\n mstore(add(buf, 64), rightSibling)\\n }\\n\\n _elements[i] = keccak256(buf);\\n }\\n\\n if (rowSizeIsOdd) {\\n leftSibling = _elements[rowSize - 1];\\n rightSibling = bytes32(defaults[depth]);\\n assembly {\\n mstore(add(buf, 32), leftSibling)\\n mstore(add(buf, 64), rightSibling)\\n }\\n\\n _elements[halfRowSize] = keccak256(buf);\\n }\\n\\n rowSize = halfRowSize + (rowSizeIsOdd ? 1 : 0);\\n depth++;\\n }\\n\\n return _elements[0];\\n }\\n\\n /**\\n * Verifies a merkle branch for the given leaf hash. Assumes the original length\\n * of leaves generated is a known, correct input, and does not return true for indices\\n * extending past that index (even if _siblings would be otherwise valid.)\\n * @param _root The Merkle root to verify against.\\n * @param _leaf The leaf hash to verify inclusion of.\\n * @param _index The index in the tree of this leaf.\\n * @param _siblings Array of sibline nodes in the inclusion proof, starting from depth 0 (bottom of the tree).\\n * @param _totalLeaves The total number of leaves originally passed into.\\n * @return Whether or not the merkle branch and leaf passes verification.\\n */\\n function verify(\\n bytes32 _root,\\n bytes32 _leaf,\\n uint256 _index,\\n bytes32[] memory _siblings,\\n uint256 _totalLeaves\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n require(\\n _totalLeaves > 0,\\n \\\"Lib_MerkleTree: Total leaves must be greater than zero.\\\"\\n );\\n\\n require(\\n _index < _totalLeaves,\\n \\\"Lib_MerkleTree: Index out of bounds.\\\"\\n );\\n\\n require(\\n _siblings.length == _ceilLog2(_totalLeaves),\\n \\\"Lib_MerkleTree: Total siblings does not correctly correspond to total leaves.\\\"\\n );\\n\\n bytes32 computedRoot = _leaf;\\n\\n for (uint256 i = 0; i < _siblings.length; i++) {\\n if ((_index & 1) == 1) {\\n computedRoot = keccak256(\\n abi.encodePacked(\\n _siblings[i],\\n computedRoot\\n )\\n );\\n } else {\\n computedRoot = keccak256(\\n abi.encodePacked(\\n computedRoot,\\n _siblings[i]\\n )\\n );\\n }\\n\\n _index >>= 1;\\n }\\n\\n return _root == computedRoot;\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Calculates the integer ceiling of the log base 2 of an input.\\n * @param _in Unsigned input to calculate the log.\\n * @return ceil(log_base_2(_in))\\n */\\n function _ceilLog2(\\n uint256 _in\\n )\\n private\\n pure\\n returns (\\n uint256\\n )\\n {\\n require(\\n _in > 0,\\n \\\"Lib_MerkleTree: Cannot compute ceil(log_2) of 0.\\\"\\n );\\n\\n if (_in == 1) {\\n return 0;\\n }\\n\\n // Find the highest set bit (will be floor(log_2)).\\n // Borrowed with <3 from https://github.com/ethereum/solidity-examples\\n uint256 val = _in;\\n uint256 highest = 0;\\n for (uint256 i = 128; i >= 1; i >>= 1) {\\n if (val & (uint(1) << i) - 1 << i != 0) {\\n highest += i;\\n val >>= i;\\n }\\n }\\n\\n // Increment by one if this is not a perfect logarithm.\\n if ((uint(1) << highest) != _in) {\\n highest += 1;\\n }\\n\\n return highest;\\n }\\n}\\n\",\"keccak256\":\"0xa78edb9fbd34712771a1ebff05bc5e1abec7fc1e9a1bfb709d183099b44fa62a\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_ErrorUtils } from \\\"../utils/Lib_ErrorUtils.sol\\\";\\n\\n/**\\n * @title Lib_SafeExecutionManagerWrapper\\n * @dev The Safe Execution Manager Wrapper provides functions which facilitate writing OVM safe \\n * code using the standard solidity compiler, by routing all its operations through the Execution \\n * Manager.\\n * \\n * Compiler used: solc\\n * Runtime target: OVM\\n */\\nlibrary Lib_SafeExecutionManagerWrapper {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Performs a safe ovmCALL.\\n * @param _gasLimit Gas limit for the call.\\n * @param _target Address to call.\\n * @param _calldata Data to send to the call.\\n * @return _success Whether or not the call reverted.\\n * @return _returndata Data returned by the call.\\n */\\n function safeCALL(\\n uint256 _gasLimit,\\n address _target,\\n bytes memory _calldata\\n )\\n internal\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCALL(uint256,address,bytes)\\\",\\n _gasLimit,\\n _target,\\n _calldata\\n )\\n );\\n\\n return abi.decode(returndata, (bool, bytes));\\n }\\n\\n /**\\n * Performs a safe ovmDELEGATECALL.\\n * @param _gasLimit Gas limit for the call.\\n * @param _target Address to call.\\n * @param _calldata Data to send to the call.\\n * @return _success Whether or not the call reverted.\\n * @return _returndata Data returned by the call.\\n */\\n function safeDELEGATECALL(\\n uint256 _gasLimit,\\n address _target,\\n bytes memory _calldata\\n )\\n internal\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmDELEGATECALL(uint256,address,bytes)\\\",\\n _gasLimit,\\n _target,\\n _calldata\\n )\\n );\\n\\n return abi.decode(returndata, (bool, bytes));\\n }\\n\\n /**\\n * Performs a safe ovmCREATE call.\\n * @param _gasLimit Gas limit for the creation.\\n * @param _bytecode Code for the new contract.\\n * @return _contract Address of the created contract.\\n */\\n function safeCREATE(\\n uint256 _gasLimit,\\n bytes memory _bytecode\\n )\\n internal\\n returns (\\n address,\\n bytes memory\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n _gasLimit,\\n abi.encodeWithSignature(\\n \\\"ovmCREATE(bytes)\\\",\\n _bytecode\\n )\\n );\\n\\n return abi.decode(returndata, (address, bytes));\\n }\\n\\n /**\\n * Performs a safe ovmEXTCODESIZE call.\\n * @param _contract Address of the contract to query the size of.\\n * @return _EXTCODESIZE Size of the requested contract in bytes.\\n */\\n function safeEXTCODESIZE(\\n address _contract\\n )\\n internal\\n returns (\\n uint256 _EXTCODESIZE\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmEXTCODESIZE(address)\\\",\\n _contract\\n )\\n );\\n\\n return abi.decode(returndata, (uint256));\\n }\\n\\n /**\\n * Performs a safe ovmCHAINID call.\\n * @return _CHAINID Result of calling ovmCHAINID.\\n */\\n function safeCHAINID()\\n internal\\n returns (\\n uint256 _CHAINID\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCHAINID()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (uint256));\\n }\\n\\n /**\\n * Performs a safe ovmCALLER call.\\n * @return _CALLER Result of calling ovmCALLER.\\n */\\n function safeCALLER()\\n internal\\n returns (\\n address _CALLER\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCALLER()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (address));\\n }\\n\\n /**\\n * Performs a safe ovmADDRESS call.\\n * @return _ADDRESS Result of calling ovmADDRESS.\\n */\\n function safeADDRESS()\\n internal\\n returns (\\n address _ADDRESS\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmADDRESS()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (address));\\n }\\n\\n /**\\n * Performs a safe ovmGETNONCE call.\\n * @return _nonce Result of calling ovmGETNONCE.\\n */\\n function safeGETNONCE()\\n internal\\n returns (\\n uint256 _nonce\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmGETNONCE()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (uint256));\\n }\\n\\n /**\\n * Performs a safe ovmINCREMENTNONCE call.\\n */\\n function safeINCREMENTNONCE()\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmINCREMENTNONCE()\\\"\\n )\\n );\\n }\\n\\n /**\\n * Performs a safe ovmCREATEEOA call.\\n * @param _messageHash Message hash which was signed by EOA\\n * @param _v v value of signature (0 or 1)\\n * @param _r r value of signature\\n * @param _s s value of signature\\n */\\n function safeCREATEEOA(\\n bytes32 _messageHash,\\n uint8 _v,\\n bytes32 _r,\\n bytes32 _s\\n )\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCREATEEOA(bytes32,uint8,bytes32,bytes32)\\\",\\n _messageHash,\\n _v,\\n _r,\\n _s\\n )\\n );\\n }\\n\\n /**\\n * Performs a safe REVERT.\\n * @param _reason String revert reason to pass along with the REVERT.\\n */\\n function safeREVERT(\\n string memory _reason\\n )\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmREVERT(bytes)\\\",\\n Lib_ErrorUtils.encodeRevertString(\\n _reason\\n )\\n )\\n );\\n }\\n\\n /**\\n * Performs a safe \\\"require\\\".\\n * @param _condition Boolean condition that must be true or will revert.\\n * @param _reason String revert reason to pass along with the REVERT.\\n */\\n function safeREQUIRE(\\n bool _condition,\\n string memory _reason\\n )\\n internal\\n {\\n if (!_condition) {\\n safeREVERT(\\n _reason\\n );\\n }\\n }\\n\\n /**\\n * Performs a safe ovmSLOAD call.\\n */\\n function safeSLOAD(\\n bytes32 _key\\n )\\n internal\\n returns (\\n bytes32\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmSLOAD(bytes32)\\\",\\n _key\\n )\\n );\\n\\n return abi.decode(returndata, (bytes32));\\n }\\n\\n /**\\n * Performs a safe ovmSSTORE call.\\n */\\n function safeSSTORE(\\n bytes32 _key,\\n bytes32 _value\\n )\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmSSTORE(bytes32,bytes32)\\\",\\n _key,\\n _value\\n )\\n );\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Performs an ovm interaction and the necessary safety checks.\\n * @param _gasLimit Gas limit for the interaction.\\n * @param _calldata Data to send to the OVM_ExecutionManager (encoded with sighash).\\n * @return _returndata Data sent back by the OVM_ExecutionManager.\\n */\\n function _safeExecutionManagerInteraction(\\n uint256 _gasLimit,\\n bytes memory _calldata\\n )\\n private\\n returns (\\n bytes memory _returndata\\n )\\n {\\n address ovmExecutionManager = msg.sender;\\n (\\n bool success,\\n bytes memory returndata\\n ) = ovmExecutionManager.call{gas: _gasLimit}(_calldata);\\n\\n if (success == false) {\\n assembly {\\n revert(add(returndata, 0x20), mload(returndata))\\n }\\n } else if (returndata.length == 1) {\\n assembly {\\n return(0, 1)\\n }\\n } else {\\n return returndata;\\n }\\n }\\n\\n function _safeExecutionManagerInteraction(\\n bytes memory _calldata\\n )\\n private\\n returns (\\n bytes memory _returndata\\n )\\n {\\n return _safeExecutionManagerInteraction(\\n gasleft(),\\n _calldata\\n );\\n }\\n}\\n\",\"keccak256\":\"0x41e146e7912af794a17cd43c5a276674be956bfa8f3ca5b451bcb82d81e6f492\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/wrappers/Lib_SafeMathWrapper.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// Pulled from @openzeppelin/contracts/math/SafeMath.sol\\n// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_SafeExecutionManagerWrapper } from \\\"./Lib_SafeExecutionManagerWrapper.sol\\\";\\n\\n/**\\n * @title Lib_SafeMathWrapper\\n */\\n\\n/**\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\n * checks.\\n *\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\n * in bugs, because programmers usually assume that an overflow raises an\\n * error, which is the standard behavior in high level programming languages.\\n * `SafeMath` restores this intuition by reverting the transaction when an\\n * operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n */\\n\\nlibrary Lib_SafeMathWrapper {\\n /**\\n * @dev Returns the addition of two unsigned integers, reverting on\\n * overflow.\\n *\\n * Counterpart to Solidity's `+` operator.\\n *\\n * Requirements:\\n *\\n * - Addition cannot overflow.\\n */\\n function add(uint256 a, uint256 b) internal returns (uint256) {\\n uint256 c = a + b;\\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(c >= a, \\\"Lib_SafeMathWrapper: addition overflow\\\");\\n\\n return c;\\n }\\n\\n /**\\n * @dev Returns the subtraction of two unsigned integers, reverting on\\n * overflow (when the result is negative).\\n *\\n * Counterpart to Solidity's `-` operator.\\n *\\n * Requirements:\\n *\\n * - Subtraction cannot overflow.\\n */\\n function sub(uint256 a, uint256 b) internal returns (uint256) {\\n return sub(a, b, \\\"Lib_SafeMathWrapper: subtraction overflow\\\");\\n }\\n\\n /**\\n * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\n * overflow (when the result is negative).\\n *\\n * Counterpart to Solidity's `-` operator.\\n *\\n * Requirements:\\n *\\n * - Subtraction cannot overflow.\\n */\\n function sub(uint256 a, uint256 b, string memory errorMessage) internal returns (uint256) {\\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(b <= a, errorMessage);\\n uint256 c = a - b;\\n\\n return c;\\n }\\n\\n /**\\n * @dev Returns the multiplication of two unsigned integers, reverting on\\n * overflow.\\n *\\n * Counterpart to Solidity's `*` operator.\\n *\\n * Requirements:\\n *\\n * - Multiplication cannot overflow.\\n */\\n function mul(uint256 a, uint256 b) internal returns (uint256) {\\n // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\n // benefit is lost if 'b' is also tested.\\n // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\n if (a == 0) {\\n return 0;\\n }\\n\\n uint256 c = a * b;\\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(c / a == b, \\\"Lib_SafeMathWrapper: multiplication overflow\\\");\\n\\n return c;\\n }\\n\\n /**\\n * @dev Returns the integer division of two unsigned integers. Reverts on\\n * division by zero. The result is rounded towards zero.\\n *\\n * Counterpart to Solidity's `/` operator. Note: this function uses a\\n * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n * uses an invalid opcode to revert (consuming all remaining gas).\\n *\\n * Requirements:\\n *\\n * - The divisor cannot be zero.\\n */\\n function div(uint256 a, uint256 b) internal returns (uint256) {\\n return div(a, b, \\\"Lib_SafeMathWrapper: division by zero\\\");\\n }\\n\\n /**\\n * @dev Returns the integer division of two unsigned integers. Reverts with custom message on\\n * division by zero. The result is rounded towards zero.\\n *\\n * Counterpart to Solidity's `/` operator. Note: this function uses a\\n * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n * uses an invalid opcode to revert (consuming all remaining gas).\\n *\\n * Requirements:\\n *\\n * - The divisor cannot be zero.\\n */\\n function div(uint256 a, uint256 b, string memory errorMessage) internal returns (uint256) {\\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(b > 0, errorMessage);\\n uint256 c = a / b;\\n // assert(a == b * c + a % b); // There is no case in which this doesn't hold\\n\\n return c;\\n }\\n\\n /**\\n * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n * Reverts when dividing by zero.\\n *\\n * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n * opcode (which leaves remaining gas untouched) while Solidity uses an\\n * invalid opcode to revert (consuming all remaining gas).\\n *\\n * Requirements:\\n *\\n * - The divisor cannot be zero.\\n */\\n function mod(uint256 a, uint256 b) internal returns (uint256) {\\n return mod(a, b, \\\"Lib_SafeMathWrapper: modulo by zero\\\");\\n }\\n\\n /**\\n * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n * Reverts with custom message when dividing by zero.\\n *\\n * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n * opcode (which leaves remaining gas untouched) while Solidity uses an\\n * invalid opcode to revert (consuming all remaining gas).\\n *\\n * Requirements:\\n *\\n * - The divisor cannot be zero.\\n */\\n function mod(uint256 a, uint256 b, string memory errorMessage) internal returns (uint256) {\\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(b != 0, errorMessage);\\n return a % b;\\n }\\n}\",\"keccak256\":\"0xc58aa064894677f65fc8205f79252d15e59a0f5e2794e5c2d069c7b2bc97a9e2\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x60806040523480156200001157600080fd5b506040516200312a3803806200312a833981016040819052620000349162000067565b600080546001600160a01b0319166001600160a01b039590951694909417909355600191909155600255600355620000b2565b600080600080608085870312156200007d578384fd5b84516001600160a01b038116811462000094578485fd5b60208601516040870151606090970151919890975090945092505050565b61306880620000c26000396000f3fe608060405234801561001057600080fd5b50600436106101425760003560e01c8063876ed5cb116100b8578063cfdf677e1161007c578063cfdf677e1461023f578063d0f8934414610247578063e10d29ee1461024f578063e561dddc14610257578063f722b41a1461025f578063facdc5da1461026757610142565b8063876ed5cb146102175780638d38c6c11461021f578063b8f7700514610227578063c139eb151461022f578063c2cf696f1461023757610142565b80634de569ce1161010a5780634de569ce146101c25780635ae6256d146101e25780636fee07e0146101ea57806378f4b2f2146101ff5780637a167a8a146102075780637aa63a861461020f57610142565b8063138387a414610147578063299ca478146101655780632a7f18be1461017a578063378997701461019a578063461a4478146101af575b600080fd5b61014f61027a565b60405161015c91906124c7565b60405180910390f35b61016d610280565b60405161015c91906123eb565b61018d610188366004612388565b61028f565b60405161015c9190612e4e565b6101a26102b0565b60405161015c9190612e8d565b61016d6101bd36600461221b565b6102c4565b6101d56101d0366004612261565b6103a0565b60405161015c9190612484565b6101a26103da565b6101fd6101f8366004612188565b6103ee565b005b61014f61066d565b6101a2610674565b61014f610689565b61014f6106a4565b61014f6106aa565b6101a26106b0565b61014f6106c7565b61014f6106cd565b61016d6106d2565b6101fd6106f5565b61016d610b69565b61014f610b8c565b6101a2610c06565b6101fd610275366004612388565b610c1e565b60025481565b6000546001600160a01b031681565b610297611ed9565b6102a8826102a3610b69565b610c36565b90505b919050565b6000806102bb610d76565b50935050505090565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b8381101561032457818101518382015260200161030c565b50505050905090810190601f1680156103515780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561036e57600080fd5b505afa158015610382573d6000803e3d6000fd5b505050506040513d602081101561039857600080fd5b505192915050565b82516000901515600114156103c2576103bb85858585610e24565b90506103d2565b6103bb8585602001518585610fef565b949350505050565b6000806103e5610d76565b94505050505090565b61c3508151111561041a5760405162461bcd60e51b81526004016104119061259b565b60405180910390fd5b60035482111561043c5760405162461bcd60e51b8152600401610411906127a1565b620186a082101561045f5760405162461bcd60e51b815260040161041190612983565b6020820460005a90508181116104875760405162461bcd60e51b815260040161041190612b8a565b60005b825a8303101561049c5760010161048a565b6000338787876040516020016104b594939291906123ff565b60408051601f19818403018152919052805160209091012090504360281b421760006104df610b69565b60405163b298e36b60e01b81529091506001600160a01b0382169063b298e36b9061050e9086906004016124c7565b600060405180830381600087803b15801561052857600080fd5b505af115801561053c573d6000803e3d6000fd5b505060405163b298e36b60e01b81526001600160a01b038416925063b298e36b915061056c9085906004016124c7565b600060405180830381600087803b15801561058657600080fd5b505af115801561059a573d6000803e3d6000fd5b50505050600060016002836001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b1580156105dd57600080fd5b505afa1580156105f1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106159190612203565b8161061c57fe5b040390507f4b388aecf9fa6cc92253704e5975a6129a4f735bdbd99567df4ed0094ee4ceb5338b8b8b85426040516106599695949392919061243c565b60405180910390a150505050505050505050565b620186a081565b60008061067f610d76565b5090935050505090565b600080610694610d76565b50505064ffffffffff1692915050565b61c35081565b60035481565b60006106c26106bd610b69565b6110c4565b905090565b60015481565b602081565b60006106c2604051806060016040528060258152602001613003602591396102c4565b60043560d81c60093560e890811c90600c35901c610711610689565b8364ffffffffff16146107365760405162461bcd60e51b815260040161041190612a35565b6107646040518060400160405280600d81526020016c27ab26afa9b2b8bab2b731b2b960991b8152506102c4565b6001600160a01b0316336001600160a01b0316146107945760405162461bcd60e51b815260040161041190612a92565b60008162ffffff16116107b95760405162461bcd60e51b8152600401610411906127fe565b60008262ffffff16116107de5760405162461bcd60e51b815260040161041190612cdf565b600f601062ffffff8316020164ffffffffff81163610156108115760405162461bcd60e51b815260040161041190612d66565b600061081b610b69565b90506000610828826110c4565b9050600062ffffff8616368161083a57fe5b0460020267ffffffffffffffff8111801561085457600080fd5b506040519080825280601f01601f19166020018201604052801561087f576020820181803683370190505b50905060008662ffffff1667ffffffffffffffff811180156108a057600080fd5b506040519080825280602002602001820160405280156108ca578160200160208202803683370190505b50905060008060006108da610674565b90506108e4611ef9565b60005b8a62ffffff168163ffffffff161015610a3b57600061090b8263ffffffff16611147565b905063ffffffff82166109215761092181611197565b61092d8382868d611264565b80925060005b835163ffffffff821610156109b1578b3560e81c61c3508111156109695760405162461bcd60e51b81526004016104119061259b565b61097c858e64ffffffffff16838d6112cf565b898963ffffffff168151811061098e57fe5b60209081029190910101529b909b016003019a6001968701969586019501610933565b5060005b83602001518163ffffffff161015610a31578964ffffffffff168564ffffffffff16106109f45760405162461bcd60e51b815260040161041190612da8565b610a048564ffffffffff16611363565b888863ffffffff1681518110610a1657fe5b602090810291909101015260019687019694850194016109b5565b50506001016108e7565b50610a488183898b6113a8565b3664ffffffffff8a1614610a6e5760405162461bcd60e51b815260040161041190612846565b8a62ffffff168463ffffffff1614610a985760405162461bcd60e51b815260040161041190612894565b6000838c62ffffff160363ffffffff169050600080836020015160001415610acb57505060408201516060830151610af3565b6000610ae16001870364ffffffffff168d610c36565b90508060200151925080604001519150505b610b14610aff8961141b565b8f62ffffff168564ffffffffff16858561184f565b7f602f1aeac0ca2e7a13e281a9ef0ad7838542712ce16780fa2ecffd351f05f89983860384610b41610689565b604051610b5093929190612e9f565b60405180910390a1505050505050505050505050505050565b60006106c2604051806060016040528060238152602001612ee6602391396102c4565b6000610b966106d2565b6001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b158015610bce57600080fd5b505afa158015610be2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106c29190612203565b6000610c10610674565b610c186106b0565b03905090565b60405162461bcd60e51b81526004016104119061250b565b610c3e611ed9565b604051634a83e9cd60e11b815260028402906000906001600160a01b03851690639507d39a90610c72908590600401612e8d565b60206040518083038186803b158015610c8a57600080fd5b505afa158015610c9e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cc29190612203565b90506000846001600160a01b0316639507d39a846001016040518263ffffffff1660e01b8152600401610cf59190612e8d565b60206040518083038186803b158015610d0d57600080fd5b505afa158015610d21573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d459190612203565b6040805160608101825293845264ffffffffff828116602086015260289290921c9091169083015250949350505050565b6000806000806000610d866106d2565b6001600160a01b031663ccf8f9696040518163ffffffff1660e01b815260040160206040518083038186803b158015610dbe57600080fd5b505afa158015610dd2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610df691906121dd565b64ffffffffff602882901c811697605083901c82169750607883901c8216965060a09290921c169350915050565b600080610e5c6040518060400160405280601481526020017327ab26afa2bc32b1baba34b7b726b0b730b3b2b960611b8152506102c4565b90506000816001600160a01b0316631c4712a76040518163ffffffff1660e01b815260040160206040518083038186803b158015610e9957600080fd5b505afa158015610ead573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ed19190612203565b90506000610ede87611a02565b9050610eeb818787611a9b565b610f075760405162461bcd60e51b8152600401610411906126ca565b86606001518860200151148015610f22575060408701518851145b8015610f635750610f4a604051806060016040528060228152602001612f09602291396102c4565b6001600160a01b031688608001516001600160a01b0316145b8015610f725750818860a00151145b8015610f89575060608801516001600160a01b0316155b8015610fa45750600088604001516001811115610fa257fe5b145b8015610fc557508660800151805190602001208860c0015180519060200120145b610fe15760405162461bcd60e51b81526004016104119061276a565b506001979650505050505050565b600080610ffb85611363565b9050611008818585611a9b565b6110245760405162461bcd60e51b815260040161041190612c2a565b6000866060015187608001518860a001518960c0015160405160200161104d94939291906123ff565b60405160208183030381529060405280519060200120905060006110708761028f565b80519091508214801561108e57508751602082015164ffffffffff16145b80156110a857508760200151816040015164ffffffffff16145b610fe15760405162461bcd60e51b815260040161041190612adf565b60006002826001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b15801561110157600080fd5b505afa158015611115573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111399190612203565b8161114057fe5b0492915050565b61114f611ef9565b5060408051608081018252601092909202600f81013560e890811c84526012820135901c6020840152601581013560d890811c92840192909252601a0135901c606082015290565b60006111a1610689565b1115611211576000806111b2610d76565b9350935050508064ffffffffff16836060015110156111e35760405162461bcd60e51b815260040161041190612718565b8164ffffffffff168360400151101561120e5760405162461bcd60e51b8152600401610411906125f8565b50505b4260015482604001510110156112395760405162461bcd60e51b815260040161041190612d20565b4360025482606001510110156112615760405162461bcd60e51b815260040161041190612552565b50565b83604001518360400151101561128c5760405162461bcd60e51b815260040161041190612bd5565b8360600151836060015110156112b45760405162461bcd60e51b815260040161041190612df1565b6020830151156112c9576112c9838383611b8c565b50505050565b60008151836041011115611326578260410167ffffffffffffffff811180156112f757600080fd5b506040519080825280601f01601f191660200182016040528015611322576020820181803683370190505b5091505b6040850151606086015160006020850160018153836001820152826021820152866003890160418301376041870190209350505050949350505050565b60006102a86040518060a00160405280600015158152602001848152602001600081526020016000815260200160405180602001604052806000815250815250611c2d565b600083830364ffffffffff161180156113c357506020840151155b156113d3576113d3848483611b8c565b42846040015111156113f75760405162461bcd60e51b815260040161041190612b45565b43846060015111156112c95760405162461bcd60e51b815260040161041190612904565b60008082511161145c5760405162461bcd60e51b81526004018080602001828103825260348152602001806130286034913960400191505060405180910390fd5b815160011415611482578160008151811061147357fe5b602002602001015190506102ab565b60408051610200810182527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56381527f633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d60208201527f890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d818301527f3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd86060808301919091527fecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da60808301527fdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da560a08301527f617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d760c08301527f292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead60e08301527fe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e106101008301527f7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f826101208301527fe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e836365166101408301527f3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c6101608301527fad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e6101808301527fa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab6101a08301527f4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c8626101c08301527f2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf106101e083015282518381529081018352909160009190602082018180368337505085519192506000918291508180805b600184111561182b5750506002820460018084161460005b828110156117a7578a816002028151811061174e57fe5b602002602001015196508a816002026001018151811061176a57fe5b6020026020010151955086602089015285604089015287805190602001208b828151811061179457fe5b6020908102919091010152600101611737565b50801561180a578960018503815181106117bd57fe5b602002602001015195508783601081106117d357fe5b602002015160001b945085602088015284604088015286805190602001208a83815181106117fd57fe5b6020026020010181815250505b80611816576000611819565b60015b60ff168201935060019092019161171f565b8960008151811061183857fe5b602002602001015198505050505050505050919050565b60006118596106d2565b9050600080611866610d76565b50509150915060006040518060a00160405280856001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b1580156118b257600080fd5b505afa1580156118c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118ea9190612203565b81526020018a81526020018981526020018464ffffffffff16815260200160405180602001604052806000815250815250905080600001517f127186556e7be68c7e31263195225b4de02820707889540969f62c05cf73525e826020015183604001518460600151856080015160405161196794939291906124e6565b60405180910390a2600061197a82611c75565b90506000611992836040015186018a86018a8a611c9e565b60405163080549db60e21b81529091506001600160a01b03871690632015276c906119c390859085906004016124d0565b600060405180830381600087803b1580156119dd57600080fd5b505af11580156119f1573d6000803e3d6000fd5b505050505050505050505050505050565b6080810151805160009190826041820167ffffffffffffffff81118015611a2857600080fd5b506040519080825280601f01601f191660200182016040528015611a53576020820181803683370190505b5060408601516060870151919250906000602084016001815383600182015282602182015285604182018760208a0160045afa50604190950190942095505050505050919050565b6000611aa56106d2565b8351604051634a83e9cd60e11b81526001600160a01b039290921691639507d39a91611ad391600401612e7c565b60206040518083038186803b158015611aeb57600080fd5b505afa158015611aff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b239190612203565b611b2c84611c75565b14611b495760405162461bcd60e51b815260040161041190612b16565b611b66836020015185846000015185602001518760400151611cbd565b611b825760405162461bcd60e51b81526004016104119061294c565b5060019392505050565b6000611b9f8364ffffffffff1683610c36565b9050600154816020015164ffffffffff16014210611bcf5760405162461bcd60e51b815260040161041190612647565b806020015164ffffffffff1684604001511115611bfe5760405162461bcd60e51b8152600401610411906129cc565b806040015164ffffffffff16846060015111156112c95760405162461bcd60e51b815260040161041190612c74565b8051602080830151604080850151606086015160808701519251600096611c5896909594910161248f565b604051602081830303815290604052805190602001209050919050565b60008160200151826040015183606001518460800151604051602001611c5894939291906124e6565b602892831b9390931760509190911b1760789290921b91909117901b90565b6000808211611cfd5760405162461bcd60e51b8152600401808060200182810382526037815260200180612f7f6037913960400191505060405180910390fd5b818410611d3b5760405162461bcd60e51b8152600401808060200182810382526024815260200180612f2b6024913960400191505060405180910390fd5b611d4482611e42565b835114611d825760405162461bcd60e51b815260040180806020018281038252604d815260200180612fb6604d913960600191505060405180910390fd5b8460005b8451811015611e35578560011660011415611de457848181518110611da757fe5b6020026020010151826040516020018083815260200182815260200192505050604051602081830303815290604052805190602001209150611e29565b81858281518110611df157fe5b602002602001015160405160200180838152602001828152602001925050506040516020818303038152906040528051906020012091505b600195861c9501611d86565b5090951495945050505050565b6000808211611e825760405162461bcd60e51b8152600401808060200182810382526030815260200180612f4f6030913960400191505060405180910390fd5b8160011415611e93575060006102ab565b81600060805b60018110611ec3576000196001821b01811b831615611ebb5791821c91908101905b60011c611e99565b506001811b8414611ed2576001015b9392505050565b604080516060810182526000808252602082018190529181019190915290565b6040518060800160405280600081526020016000815260200160008152602001600081525090565b600067ffffffffffffffff831115611f3557fe5b611f48601f8401601f1916602001612ec1565b9050828152838383011115611f5c57600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b03811681146102ab57600080fd5b600082601f830112611f9a578081fd5b611ed283833560208501611f21565b8035600281106102ab57600080fd5b600060a08284031215611fc9578081fd5b60405160a0810167ffffffffffffffff8282108183111715611fe757fe5b8160405282935084358352602085013560208401526040850135604084015260608501356060840152608085013591508082111561202457600080fd5b5061203185828601611f8a565b6080830152505092915050565b60006040828403121561204f578081fd5b6040516040810167ffffffffffffffff828210818311171561206d57fe5b816040528293508435835260209150818501358181111561208d57600080fd5b8501601f8101871361209e57600080fd5b8035828111156120aa57fe5b83810292506120ba848401612ec1565b8181528481019083860185850187018b10156120d557600080fd5b600095505b838610156120f85780358352600195909501949186019186016120da565b5080868801525050505050505092915050565b600060a0828403121561211c578081fd5b60405160a0810167ffffffffffffffff828210818311171561213a57fe5b8160405282935084359150811515821461215357600080fd5b818352602085013560208401526040850135604084015260608501356060840152608085013591508082111561202457600080fd5b60008060006060848603121561219c578283fd5b6121a584611f73565b925060208401359150604084013567ffffffffffffffff8111156121c7578182fd5b6121d386828701611f8a565b9150509250925092565b6000602082840312156121ee578081fd5b815164ffffffffff1981168114611ed2578182fd5b600060208284031215612214578081fd5b5051919050565b60006020828403121561222c578081fd5b813567ffffffffffffffff811115612242578182fd5b8201601f81018413612252578182fd5b6103d284823560208401611f21565b60008060008060808587031215612276578081fd5b843567ffffffffffffffff8082111561228d578283fd5b9086019060e082890312156122a0578283fd5b6122aa60e0612ec1565b82358152602083013560208201526122c460408401611fa9565b60408201526122d560608401611f73565b60608201526122e660808401611f73565b608082015260a083013560a082015260c083013582811115612306578485fd5b6123128a828601611f8a565b60c0830152509550602087013591508082111561232d578283fd5b6123398883890161210b565b9450604087013591508082111561234e578283fd5b61235a88838901611fb8565b9350606087013591508082111561236f578283fd5b5061237c8782880161203e565b91505092959194509250565b600060208284031215612399578081fd5b5035919050565b60008151808452815b818110156123c5576020818501810151868301820152016123a9565b818111156123d65782602083870101525b50601f01601f19169290920160200192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612432908301846123a0565b9695505050505050565b6001600160a01b038781168252861660208201526040810185905260c06060820181905260009061246f908301866123a0565b60808301949094525060a00152949350505050565b901515815260200190565b6000861515825285602083015284604083015283606083015260a060808301526124bc60a08301846123a0565b979650505050505050565b90815260200190565b91825264ffffffffff1916602082015260400190565b60008582528460208301528360408301526080606083015261243260808301846123a0565b60208082526027908201527f617070656e64517565756542617463682069732063757272656e746c7920646960408201526639b0b13632b21760c91b606082015260800190565b60208082526029908201527f436f6e7465787420626c6f636b206e756d62657220746f6f2066617220696e206040820152683a3432903830b9ba1760b91b606082015260800190565b6020808252603d908201527f5472616e73616374696f6e20646174612073697a652065786365656473206d6160408201527f78696d756d20666f7220726f6c6c7570207472616e73616374696f6e2e000000606082015260800190565b6020808252602f908201527f436f6e746578742074696d657374616d70206973206c6f776572207468616e2060408201526e3630b9ba1039bab136b4ba3a32b21760891b606082015260800190565b6020808252605b908201527f50726576696f75736c7920656e7175657565642062617463686573206861766560408201527f206578706972656420616e64206d75737420626520617070656e64656420626560608201527f666f72652061206e65772073657175656e6365722062617463682e0000000000608082015260a00190565b6020808252602e908201527f496e76616c69642053657175656e636572207472616e73616374696f6e20696e60408201526d31b63ab9b4b7b710383937b7b31760911b606082015260800190565b60208082526032908201527f436f6e7465787420626c6f636b206e756d626572206973206c6f77657220746860408201527130b7103630b9ba1039bab136b4ba3a32b21760711b606082015260800190565b6020808252601e908201527f496e76616c69642053657175656e636572207472616e73616374696f6e2e0000604082015260600190565b6020808252603d908201527f5472616e73616374696f6e20676173206c696d69742065786365656473206d6160408201527f78696d756d20666f7220726f6c6c7570207472616e73616374696f6e2e000000606082015260800190565b60208082526028908201527f4d7573742070726f76696465206174206c65617374206f6e652062617463682060408201526731b7b73a32bc3a1760c11b606082015260800190565b6020808252602e908201527f4e6f7420616c6c2073657175656e636572207472616e73616374696f6e73207760408201526d32b93290383937b1b2b9b9b2b21760911b606082015260800190565b6020808252604a908201527f41637475616c207472616e73616374696f6e20696e64657820646f6573206e6f60408201527f74206d6174636820657870656374656420746f74616c20656c656d656e7473206060820152693a379030b83832b7321760b11b608082015260a00190565b60208082526028908201527f436f6e7465787420626c6f636b206e756d6265722069732066726f6d2074686560408201526710333aba3ab9329760c11b606082015260800190565b60208082526018908201527f496e76616c696420696e636c7573696f6e2070726f6f662e0000000000000000604082015260600190565b60208082526029908201527f5472616e73616374696f6e20676173206c696d697420746f6f206c6f7720746f6040820152681032b738bab2bab29760b91b606082015260800190565b60208082526043908201527f53657175656e636572207472616e73616374696f6e2074696d657374616d702060408201527f657863656564732074686174206f66206e65787420717565756520656c656d65606082015262373a1760e91b608082015260a00190565b6020808252603d908201527f41637475616c20626174636820737461727420696e64657820646f6573206e6f60408201527f74206d6174636820657870656374656420737461727420696e6465782e000000606082015260800190565b6020808252602d908201527f46756e6374696f6e2063616e206f6e6c792062652063616c6c6564206279207460408201526c34329029b2b8bab2b731b2b91760991b606082015260800190565b6020808252601a908201527f496e76616c6964205175657565207472616e73616374696f6e2e000000000000604082015260600190565b60208082526015908201527424b73b30b634b2103130ba31b4103432b0b232b91760591b604082015260600190565b60208082526025908201527f436f6e746578742074696d657374616d702069732066726f6d207468652066756040820152643a3ab9329760d91b606082015260800190565b6020808252602b908201527f496e73756666696369656e742067617320666f72204c322072617465206c696d60408201526a34ba34b73390313ab9371760a91b606082015260800190565b60208082526035908201527f436f6e746578742074696d657374616d702076616c756573206d757374206d6f6040820152743737ba37b734b1b0b6363c9034b731b932b0b9b29760591b606082015260800190565b6020808252602a908201527f496e76616c6964205175657565207472616e73616374696f6e20696e636c757360408201526934b7b710383937b7b31760b11b606082015260800190565b60208082526045908201527f53657175656e636572207472616e73616374696f6e20626c6f636b4e756d626560408201527f7220657863656564732074686174206f66206e65787420717565756520656c6560608201526436b2b73a1760d91b608082015260a00190565b60208082526021908201527f4d75737420617070656e64206174206c65617374206f6e6520656c656d656e746040820152601760f91b606082015260800190565b60208082526026908201527f436f6e746578742074696d657374616d7020746f6f2066617220696e20746865604082015265103830b9ba1760d11b606082015260800190565b60208082526022908201527f4e6f7420656e6f756768204261746368436f6e74657874732070726f76696465604082015261321760f11b606082015260800190565b60208082526029908201527f4e6f7420656e6f75676820717565756564207472616e73616374696f6e732074604082015268379030b83832b7321760b91b606082015260800190565b60208082526037908201527f436f6e7465787420626c6f636b4e756d6265722076616c756573206d7573742060408201527f6d6f6e6f746f6e6963616c6c7920696e6372656173652e000000000000000000606082015260800190565b8151815260208083015164ffffffffff90811691830191909152604092830151169181019190915260600190565b63ffffffff91909116815260200190565b64ffffffffff91909116815260200190565b64ffffffffff9384168152919092166020820152604081019190915260600190565b60405181810167ffffffffffffffff81118282101715612edd57fe5b60405291905056fe4f564d5f436861696e53746f72616765436f6e7461696e65723a4354433a71756575654f564d5f4465636f6d7072657373696f6e507265636f6d70696c65416464726573734c69625f4d65726b6c65547265653a20496e646578206f7574206f6620626f756e64732e4c69625f4d65726b6c65547265653a2043616e6e6f7420636f6d70757465206365696c286c6f675f3229206f6620302e4c69625f4d65726b6c65547265653a20546f74616c206c6561766573206d7573742062652067726561746572207468616e207a65726f2e4c69625f4d65726b6c65547265653a20546f74616c207369626c696e677320646f6573206e6f7420636f72726563746c7920636f72726573706f6e6420746f20746f74616c206c65617665732e4f564d5f436861696e53746f72616765436f6e7461696e65723a4354433a626174636865734c69625f4d65726b6c65547265653a204d7573742070726f76696465206174206c65617374206f6e65206c65616620686173682ea164736f6c6343000706000a", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101425760003560e01c8063876ed5cb116100b8578063cfdf677e1161007c578063cfdf677e1461023f578063d0f8934414610247578063e10d29ee1461024f578063e561dddc14610257578063f722b41a1461025f578063facdc5da1461026757610142565b8063876ed5cb146102175780638d38c6c11461021f578063b8f7700514610227578063c139eb151461022f578063c2cf696f1461023757610142565b80634de569ce1161010a5780634de569ce146101c25780635ae6256d146101e25780636fee07e0146101ea57806378f4b2f2146101ff5780637a167a8a146102075780637aa63a861461020f57610142565b8063138387a414610147578063299ca478146101655780632a7f18be1461017a578063378997701461019a578063461a4478146101af575b600080fd5b61014f61027a565b60405161015c91906124c7565b60405180910390f35b61016d610280565b60405161015c91906123eb565b61018d610188366004612388565b61028f565b60405161015c9190612e4e565b6101a26102b0565b60405161015c9190612e8d565b61016d6101bd36600461221b565b6102c4565b6101d56101d0366004612261565b6103a0565b60405161015c9190612484565b6101a26103da565b6101fd6101f8366004612188565b6103ee565b005b61014f61066d565b6101a2610674565b61014f610689565b61014f6106a4565b61014f6106aa565b6101a26106b0565b61014f6106c7565b61014f6106cd565b61016d6106d2565b6101fd6106f5565b61016d610b69565b61014f610b8c565b6101a2610c06565b6101fd610275366004612388565b610c1e565b60025481565b6000546001600160a01b031681565b610297611ed9565b6102a8826102a3610b69565b610c36565b90505b919050565b6000806102bb610d76565b50935050505090565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b8381101561032457818101518382015260200161030c565b50505050905090810190601f1680156103515780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561036e57600080fd5b505afa158015610382573d6000803e3d6000fd5b505050506040513d602081101561039857600080fd5b505192915050565b82516000901515600114156103c2576103bb85858585610e24565b90506103d2565b6103bb8585602001518585610fef565b949350505050565b6000806103e5610d76565b94505050505090565b61c3508151111561041a5760405162461bcd60e51b81526004016104119061259b565b60405180910390fd5b60035482111561043c5760405162461bcd60e51b8152600401610411906127a1565b620186a082101561045f5760405162461bcd60e51b815260040161041190612983565b6020820460005a90508181116104875760405162461bcd60e51b815260040161041190612b8a565b60005b825a8303101561049c5760010161048a565b6000338787876040516020016104b594939291906123ff565b60408051601f19818403018152919052805160209091012090504360281b421760006104df610b69565b60405163b298e36b60e01b81529091506001600160a01b0382169063b298e36b9061050e9086906004016124c7565b600060405180830381600087803b15801561052857600080fd5b505af115801561053c573d6000803e3d6000fd5b505060405163b298e36b60e01b81526001600160a01b038416925063b298e36b915061056c9085906004016124c7565b600060405180830381600087803b15801561058657600080fd5b505af115801561059a573d6000803e3d6000fd5b50505050600060016002836001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b1580156105dd57600080fd5b505afa1580156105f1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106159190612203565b8161061c57fe5b040390507f4b388aecf9fa6cc92253704e5975a6129a4f735bdbd99567df4ed0094ee4ceb5338b8b8b85426040516106599695949392919061243c565b60405180910390a150505050505050505050565b620186a081565b60008061067f610d76565b5090935050505090565b600080610694610d76565b50505064ffffffffff1692915050565b61c35081565b60035481565b60006106c26106bd610b69565b6110c4565b905090565b60015481565b602081565b60006106c2604051806060016040528060258152602001613003602591396102c4565b60043560d81c60093560e890811c90600c35901c610711610689565b8364ffffffffff16146107365760405162461bcd60e51b815260040161041190612a35565b6107646040518060400160405280600d81526020016c27ab26afa9b2b8bab2b731b2b960991b8152506102c4565b6001600160a01b0316336001600160a01b0316146107945760405162461bcd60e51b815260040161041190612a92565b60008162ffffff16116107b95760405162461bcd60e51b8152600401610411906127fe565b60008262ffffff16116107de5760405162461bcd60e51b815260040161041190612cdf565b600f601062ffffff8316020164ffffffffff81163610156108115760405162461bcd60e51b815260040161041190612d66565b600061081b610b69565b90506000610828826110c4565b9050600062ffffff8616368161083a57fe5b0460020267ffffffffffffffff8111801561085457600080fd5b506040519080825280601f01601f19166020018201604052801561087f576020820181803683370190505b50905060008662ffffff1667ffffffffffffffff811180156108a057600080fd5b506040519080825280602002602001820160405280156108ca578160200160208202803683370190505b50905060008060006108da610674565b90506108e4611ef9565b60005b8a62ffffff168163ffffffff161015610a3b57600061090b8263ffffffff16611147565b905063ffffffff82166109215761092181611197565b61092d8382868d611264565b80925060005b835163ffffffff821610156109b1578b3560e81c61c3508111156109695760405162461bcd60e51b81526004016104119061259b565b61097c858e64ffffffffff16838d6112cf565b898963ffffffff168151811061098e57fe5b60209081029190910101529b909b016003019a6001968701969586019501610933565b5060005b83602001518163ffffffff161015610a31578964ffffffffff168564ffffffffff16106109f45760405162461bcd60e51b815260040161041190612da8565b610a048564ffffffffff16611363565b888863ffffffff1681518110610a1657fe5b602090810291909101015260019687019694850194016109b5565b50506001016108e7565b50610a488183898b6113a8565b3664ffffffffff8a1614610a6e5760405162461bcd60e51b815260040161041190612846565b8a62ffffff168463ffffffff1614610a985760405162461bcd60e51b815260040161041190612894565b6000838c62ffffff160363ffffffff169050600080836020015160001415610acb57505060408201516060830151610af3565b6000610ae16001870364ffffffffff168d610c36565b90508060200151925080604001519150505b610b14610aff8961141b565b8f62ffffff168564ffffffffff16858561184f565b7f602f1aeac0ca2e7a13e281a9ef0ad7838542712ce16780fa2ecffd351f05f89983860384610b41610689565b604051610b5093929190612e9f565b60405180910390a1505050505050505050505050505050565b60006106c2604051806060016040528060238152602001612ee6602391396102c4565b6000610b966106d2565b6001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b158015610bce57600080fd5b505afa158015610be2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106c29190612203565b6000610c10610674565b610c186106b0565b03905090565b60405162461bcd60e51b81526004016104119061250b565b610c3e611ed9565b604051634a83e9cd60e11b815260028402906000906001600160a01b03851690639507d39a90610c72908590600401612e8d565b60206040518083038186803b158015610c8a57600080fd5b505afa158015610c9e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cc29190612203565b90506000846001600160a01b0316639507d39a846001016040518263ffffffff1660e01b8152600401610cf59190612e8d565b60206040518083038186803b158015610d0d57600080fd5b505afa158015610d21573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d459190612203565b6040805160608101825293845264ffffffffff828116602086015260289290921c9091169083015250949350505050565b6000806000806000610d866106d2565b6001600160a01b031663ccf8f9696040518163ffffffff1660e01b815260040160206040518083038186803b158015610dbe57600080fd5b505afa158015610dd2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610df691906121dd565b64ffffffffff602882901c811697605083901c82169750607883901c8216965060a09290921c169350915050565b600080610e5c6040518060400160405280601481526020017327ab26afa2bc32b1baba34b7b726b0b730b3b2b960611b8152506102c4565b90506000816001600160a01b0316631c4712a76040518163ffffffff1660e01b815260040160206040518083038186803b158015610e9957600080fd5b505afa158015610ead573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ed19190612203565b90506000610ede87611a02565b9050610eeb818787611a9b565b610f075760405162461bcd60e51b8152600401610411906126ca565b86606001518860200151148015610f22575060408701518851145b8015610f635750610f4a604051806060016040528060228152602001612f09602291396102c4565b6001600160a01b031688608001516001600160a01b0316145b8015610f725750818860a00151145b8015610f89575060608801516001600160a01b0316155b8015610fa45750600088604001516001811115610fa257fe5b145b8015610fc557508660800151805190602001208860c0015180519060200120145b610fe15760405162461bcd60e51b81526004016104119061276a565b506001979650505050505050565b600080610ffb85611363565b9050611008818585611a9b565b6110245760405162461bcd60e51b815260040161041190612c2a565b6000866060015187608001518860a001518960c0015160405160200161104d94939291906123ff565b60405160208183030381529060405280519060200120905060006110708761028f565b80519091508214801561108e57508751602082015164ffffffffff16145b80156110a857508760200151816040015164ffffffffff16145b610fe15760405162461bcd60e51b815260040161041190612adf565b60006002826001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b15801561110157600080fd5b505afa158015611115573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111399190612203565b8161114057fe5b0492915050565b61114f611ef9565b5060408051608081018252601092909202600f81013560e890811c84526012820135901c6020840152601581013560d890811c92840192909252601a0135901c606082015290565b60006111a1610689565b1115611211576000806111b2610d76565b9350935050508064ffffffffff16836060015110156111e35760405162461bcd60e51b815260040161041190612718565b8164ffffffffff168360400151101561120e5760405162461bcd60e51b8152600401610411906125f8565b50505b4260015482604001510110156112395760405162461bcd60e51b815260040161041190612d20565b4360025482606001510110156112615760405162461bcd60e51b815260040161041190612552565b50565b83604001518360400151101561128c5760405162461bcd60e51b815260040161041190612bd5565b8360600151836060015110156112b45760405162461bcd60e51b815260040161041190612df1565b6020830151156112c9576112c9838383611b8c565b50505050565b60008151836041011115611326578260410167ffffffffffffffff811180156112f757600080fd5b506040519080825280601f01601f191660200182016040528015611322576020820181803683370190505b5091505b6040850151606086015160006020850160018153836001820152826021820152866003890160418301376041870190209350505050949350505050565b60006102a86040518060a00160405280600015158152602001848152602001600081526020016000815260200160405180602001604052806000815250815250611c2d565b600083830364ffffffffff161180156113c357506020840151155b156113d3576113d3848483611b8c565b42846040015111156113f75760405162461bcd60e51b815260040161041190612b45565b43846060015111156112c95760405162461bcd60e51b815260040161041190612904565b60008082511161145c5760405162461bcd60e51b81526004018080602001828103825260348152602001806130286034913960400191505060405180910390fd5b815160011415611482578160008151811061147357fe5b602002602001015190506102ab565b60408051610200810182527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56381527f633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d60208201527f890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d818301527f3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd86060808301919091527fecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da60808301527fdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da560a08301527f617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d760c08301527f292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead60e08301527fe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e106101008301527f7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f826101208301527fe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e836365166101408301527f3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c6101608301527fad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e6101808301527fa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab6101a08301527f4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c8626101c08301527f2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf106101e083015282518381529081018352909160009190602082018180368337505085519192506000918291508180805b600184111561182b5750506002820460018084161460005b828110156117a7578a816002028151811061174e57fe5b602002602001015196508a816002026001018151811061176a57fe5b6020026020010151955086602089015285604089015287805190602001208b828151811061179457fe5b6020908102919091010152600101611737565b50801561180a578960018503815181106117bd57fe5b602002602001015195508783601081106117d357fe5b602002015160001b945085602088015284604088015286805190602001208a83815181106117fd57fe5b6020026020010181815250505b80611816576000611819565b60015b60ff168201935060019092019161171f565b8960008151811061183857fe5b602002602001015198505050505050505050919050565b60006118596106d2565b9050600080611866610d76565b50509150915060006040518060a00160405280856001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b1580156118b257600080fd5b505afa1580156118c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118ea9190612203565b81526020018a81526020018981526020018464ffffffffff16815260200160405180602001604052806000815250815250905080600001517f127186556e7be68c7e31263195225b4de02820707889540969f62c05cf73525e826020015183604001518460600151856080015160405161196794939291906124e6565b60405180910390a2600061197a82611c75565b90506000611992836040015186018a86018a8a611c9e565b60405163080549db60e21b81529091506001600160a01b03871690632015276c906119c390859085906004016124d0565b600060405180830381600087803b1580156119dd57600080fd5b505af11580156119f1573d6000803e3d6000fd5b505050505050505050505050505050565b6080810151805160009190826041820167ffffffffffffffff81118015611a2857600080fd5b506040519080825280601f01601f191660200182016040528015611a53576020820181803683370190505b5060408601516060870151919250906000602084016001815383600182015282602182015285604182018760208a0160045afa50604190950190942095505050505050919050565b6000611aa56106d2565b8351604051634a83e9cd60e11b81526001600160a01b039290921691639507d39a91611ad391600401612e7c565b60206040518083038186803b158015611aeb57600080fd5b505afa158015611aff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b239190612203565b611b2c84611c75565b14611b495760405162461bcd60e51b815260040161041190612b16565b611b66836020015185846000015185602001518760400151611cbd565b611b825760405162461bcd60e51b81526004016104119061294c565b5060019392505050565b6000611b9f8364ffffffffff1683610c36565b9050600154816020015164ffffffffff16014210611bcf5760405162461bcd60e51b815260040161041190612647565b806020015164ffffffffff1684604001511115611bfe5760405162461bcd60e51b8152600401610411906129cc565b806040015164ffffffffff16846060015111156112c95760405162461bcd60e51b815260040161041190612c74565b8051602080830151604080850151606086015160808701519251600096611c5896909594910161248f565b604051602081830303815290604052805190602001209050919050565b60008160200151826040015183606001518460800151604051602001611c5894939291906124e6565b602892831b9390931760509190911b1760789290921b91909117901b90565b6000808211611cfd5760405162461bcd60e51b8152600401808060200182810382526037815260200180612f7f6037913960400191505060405180910390fd5b818410611d3b5760405162461bcd60e51b8152600401808060200182810382526024815260200180612f2b6024913960400191505060405180910390fd5b611d4482611e42565b835114611d825760405162461bcd60e51b815260040180806020018281038252604d815260200180612fb6604d913960600191505060405180910390fd5b8460005b8451811015611e35578560011660011415611de457848181518110611da757fe5b6020026020010151826040516020018083815260200182815260200192505050604051602081830303815290604052805190602001209150611e29565b81858281518110611df157fe5b602002602001015160405160200180838152602001828152602001925050506040516020818303038152906040528051906020012091505b600195861c9501611d86565b5090951495945050505050565b6000808211611e825760405162461bcd60e51b8152600401808060200182810382526030815260200180612f4f6030913960400191505060405180910390fd5b8160011415611e93575060006102ab565b81600060805b60018110611ec3576000196001821b01811b831615611ebb5791821c91908101905b60011c611e99565b506001811b8414611ed2576001015b9392505050565b604080516060810182526000808252602082018190529181019190915290565b6040518060800160405280600081526020016000815260200160008152602001600081525090565b600067ffffffffffffffff831115611f3557fe5b611f48601f8401601f1916602001612ec1565b9050828152838383011115611f5c57600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b03811681146102ab57600080fd5b600082601f830112611f9a578081fd5b611ed283833560208501611f21565b8035600281106102ab57600080fd5b600060a08284031215611fc9578081fd5b60405160a0810167ffffffffffffffff8282108183111715611fe757fe5b8160405282935084358352602085013560208401526040850135604084015260608501356060840152608085013591508082111561202457600080fd5b5061203185828601611f8a565b6080830152505092915050565b60006040828403121561204f578081fd5b6040516040810167ffffffffffffffff828210818311171561206d57fe5b816040528293508435835260209150818501358181111561208d57600080fd5b8501601f8101871361209e57600080fd5b8035828111156120aa57fe5b83810292506120ba848401612ec1565b8181528481019083860185850187018b10156120d557600080fd5b600095505b838610156120f85780358352600195909501949186019186016120da565b5080868801525050505050505092915050565b600060a0828403121561211c578081fd5b60405160a0810167ffffffffffffffff828210818311171561213a57fe5b8160405282935084359150811515821461215357600080fd5b818352602085013560208401526040850135604084015260608501356060840152608085013591508082111561202457600080fd5b60008060006060848603121561219c578283fd5b6121a584611f73565b925060208401359150604084013567ffffffffffffffff8111156121c7578182fd5b6121d386828701611f8a565b9150509250925092565b6000602082840312156121ee578081fd5b815164ffffffffff1981168114611ed2578182fd5b600060208284031215612214578081fd5b5051919050565b60006020828403121561222c578081fd5b813567ffffffffffffffff811115612242578182fd5b8201601f81018413612252578182fd5b6103d284823560208401611f21565b60008060008060808587031215612276578081fd5b843567ffffffffffffffff8082111561228d578283fd5b9086019060e082890312156122a0578283fd5b6122aa60e0612ec1565b82358152602083013560208201526122c460408401611fa9565b60408201526122d560608401611f73565b60608201526122e660808401611f73565b608082015260a083013560a082015260c083013582811115612306578485fd5b6123128a828601611f8a565b60c0830152509550602087013591508082111561232d578283fd5b6123398883890161210b565b9450604087013591508082111561234e578283fd5b61235a88838901611fb8565b9350606087013591508082111561236f578283fd5b5061237c8782880161203e565b91505092959194509250565b600060208284031215612399578081fd5b5035919050565b60008151808452815b818110156123c5576020818501810151868301820152016123a9565b818111156123d65782602083870101525b50601f01601f19169290920160200192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612432908301846123a0565b9695505050505050565b6001600160a01b038781168252861660208201526040810185905260c06060820181905260009061246f908301866123a0565b60808301949094525060a00152949350505050565b901515815260200190565b6000861515825285602083015284604083015283606083015260a060808301526124bc60a08301846123a0565b979650505050505050565b90815260200190565b91825264ffffffffff1916602082015260400190565b60008582528460208301528360408301526080606083015261243260808301846123a0565b60208082526027908201527f617070656e64517565756542617463682069732063757272656e746c7920646960408201526639b0b13632b21760c91b606082015260800190565b60208082526029908201527f436f6e7465787420626c6f636b206e756d62657220746f6f2066617220696e206040820152683a3432903830b9ba1760b91b606082015260800190565b6020808252603d908201527f5472616e73616374696f6e20646174612073697a652065786365656473206d6160408201527f78696d756d20666f7220726f6c6c7570207472616e73616374696f6e2e000000606082015260800190565b6020808252602f908201527f436f6e746578742074696d657374616d70206973206c6f776572207468616e2060408201526e3630b9ba1039bab136b4ba3a32b21760891b606082015260800190565b6020808252605b908201527f50726576696f75736c7920656e7175657565642062617463686573206861766560408201527f206578706972656420616e64206d75737420626520617070656e64656420626560608201527f666f72652061206e65772073657175656e6365722062617463682e0000000000608082015260a00190565b6020808252602e908201527f496e76616c69642053657175656e636572207472616e73616374696f6e20696e60408201526d31b63ab9b4b7b710383937b7b31760911b606082015260800190565b60208082526032908201527f436f6e7465787420626c6f636b206e756d626572206973206c6f77657220746860408201527130b7103630b9ba1039bab136b4ba3a32b21760711b606082015260800190565b6020808252601e908201527f496e76616c69642053657175656e636572207472616e73616374696f6e2e0000604082015260600190565b6020808252603d908201527f5472616e73616374696f6e20676173206c696d69742065786365656473206d6160408201527f78696d756d20666f7220726f6c6c7570207472616e73616374696f6e2e000000606082015260800190565b60208082526028908201527f4d7573742070726f76696465206174206c65617374206f6e652062617463682060408201526731b7b73a32bc3a1760c11b606082015260800190565b6020808252602e908201527f4e6f7420616c6c2073657175656e636572207472616e73616374696f6e73207760408201526d32b93290383937b1b2b9b9b2b21760911b606082015260800190565b6020808252604a908201527f41637475616c207472616e73616374696f6e20696e64657820646f6573206e6f60408201527f74206d6174636820657870656374656420746f74616c20656c656d656e7473206060820152693a379030b83832b7321760b11b608082015260a00190565b60208082526028908201527f436f6e7465787420626c6f636b206e756d6265722069732066726f6d2074686560408201526710333aba3ab9329760c11b606082015260800190565b60208082526018908201527f496e76616c696420696e636c7573696f6e2070726f6f662e0000000000000000604082015260600190565b60208082526029908201527f5472616e73616374696f6e20676173206c696d697420746f6f206c6f7720746f6040820152681032b738bab2bab29760b91b606082015260800190565b60208082526043908201527f53657175656e636572207472616e73616374696f6e2074696d657374616d702060408201527f657863656564732074686174206f66206e65787420717565756520656c656d65606082015262373a1760e91b608082015260a00190565b6020808252603d908201527f41637475616c20626174636820737461727420696e64657820646f6573206e6f60408201527f74206d6174636820657870656374656420737461727420696e6465782e000000606082015260800190565b6020808252602d908201527f46756e6374696f6e2063616e206f6e6c792062652063616c6c6564206279207460408201526c34329029b2b8bab2b731b2b91760991b606082015260800190565b6020808252601a908201527f496e76616c6964205175657565207472616e73616374696f6e2e000000000000604082015260600190565b60208082526015908201527424b73b30b634b2103130ba31b4103432b0b232b91760591b604082015260600190565b60208082526025908201527f436f6e746578742074696d657374616d702069732066726f6d207468652066756040820152643a3ab9329760d91b606082015260800190565b6020808252602b908201527f496e73756666696369656e742067617320666f72204c322072617465206c696d60408201526a34ba34b73390313ab9371760a91b606082015260800190565b60208082526035908201527f436f6e746578742074696d657374616d702076616c756573206d757374206d6f6040820152743737ba37b734b1b0b6363c9034b731b932b0b9b29760591b606082015260800190565b6020808252602a908201527f496e76616c6964205175657565207472616e73616374696f6e20696e636c757360408201526934b7b710383937b7b31760b11b606082015260800190565b60208082526045908201527f53657175656e636572207472616e73616374696f6e20626c6f636b4e756d626560408201527f7220657863656564732074686174206f66206e65787420717565756520656c6560608201526436b2b73a1760d91b608082015260a00190565b60208082526021908201527f4d75737420617070656e64206174206c65617374206f6e6520656c656d656e746040820152601760f91b606082015260800190565b60208082526026908201527f436f6e746578742074696d657374616d7020746f6f2066617220696e20746865604082015265103830b9ba1760d11b606082015260800190565b60208082526022908201527f4e6f7420656e6f756768204261746368436f6e74657874732070726f76696465604082015261321760f11b606082015260800190565b60208082526029908201527f4e6f7420656e6f75676820717565756564207472616e73616374696f6e732074604082015268379030b83832b7321760b91b606082015260800190565b60208082526037908201527f436f6e7465787420626c6f636b4e756d6265722076616c756573206d7573742060408201527f6d6f6e6f746f6e6963616c6c7920696e6372656173652e000000000000000000606082015260800190565b8151815260208083015164ffffffffff90811691830191909152604092830151169181019190915260600190565b63ffffffff91909116815260200190565b64ffffffffff91909116815260200190565b64ffffffffff9384168152919092166020820152604081019190915260600190565b60405181810167ffffffffffffffff81118282101715612edd57fe5b60405291905056fe4f564d5f436861696e53746f72616765436f6e7461696e65723a4354433a71756575654f564d5f4465636f6d7072657373696f6e507265636f6d70696c65416464726573734c69625f4d65726b6c65547265653a20496e646578206f7574206f6620626f756e64732e4c69625f4d65726b6c65547265653a2043616e6e6f7420636f6d70757465206365696c286c6f675f3229206f6620302e4c69625f4d65726b6c65547265653a20546f74616c206c6561766573206d7573742062652067726561746572207468616e207a65726f2e4c69625f4d65726b6c65547265653a20546f74616c207369626c696e677320646f6573206e6f7420636f72726563746c7920636f72726573706f6e6420746f20746f74616c206c65617665732e4f564d5f436861696e53746f72616765436f6e7461696e65723a4354433a626174636865734c69625f4d65726b6c65547265653a204d7573742070726f76696465206174206c65617374206f6e65206c65616620686173682ea164736f6c6343000706000a", + "solcInputHash": "5ee8e508e2c54cb5ac6783b4855b1558", + "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_forceInclusionPeriodSeconds\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_forceInclusionPeriodBlocks\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_maxTransactionGasLimit\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_startingQueueIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_numQueueElements\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_totalElements\",\"type\":\"uint256\"}],\"name\":\"QueueBatchAppended\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_startingQueueIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_numQueueElements\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_totalElements\",\"type\":\"uint256\"}],\"name\":\"SequencerBatchAppended\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_batchIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"_batchRoot\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_batchSize\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_prevTotalElements\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"_extraData\",\"type\":\"bytes\"}],\"name\":\"TransactionBatchAppended\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_l1TxOrigin\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_queueIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_timestamp\",\"type\":\"uint256\"}],\"name\":\"TransactionEnqueued\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"L2_GAS_DISCOUNT_DIVISOR\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAX_ROLLUP_TX_SIZE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MIN_ROLLUP_TX_GAS\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"appendQueueBatch\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"appendSequencerBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"batches\",\"outputs\":[{\"internalType\":\"contract iOVM_ChainStorageContainer\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"enqueue\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"forceInclusionPeriodBlocks\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"forceInclusionPeriodSeconds\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLastBlockNumber\",\"outputs\":[{\"internalType\":\"uint40\",\"name\":\"\",\"type\":\"uint40\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLastTimestamp\",\"outputs\":[{\"internalType\":\"uint40\",\"name\":\"\",\"type\":\"uint40\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getNextQueueIndex\",\"outputs\":[{\"internalType\":\"uint40\",\"name\":\"\",\"type\":\"uint40\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getNumPendingQueueElements\",\"outputs\":[{\"internalType\":\"uint40\",\"name\":\"\",\"type\":\"uint40\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"getQueueElement\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"transactionHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint40\",\"name\":\"timestamp\",\"type\":\"uint40\"},{\"internalType\":\"uint40\",\"name\":\"blockNumber\",\"type\":\"uint40\"}],\"internalType\":\"struct Lib_OVMCodec.QueueElement\",\"name\":\"_element\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getQueueLength\",\"outputs\":[{\"internalType\":\"uint40\",\"name\":\"\",\"type\":\"uint40\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTotalBatches\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_totalBatches\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTotalElements\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_totalElements\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maxTransactionGasLimit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"queue\",\"outputs\":[{\"internalType\":\"contract iOVM_ChainStorageContainer\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"enum Lib_OVMCodec.QueueOrigin\",\"name\":\"l1QueueOrigin\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"l1TxOrigin\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"entrypoint\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.Transaction\",\"name\":\"_transaction\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isSequenced\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"queueIndex\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"txData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.TransactionChainElement\",\"name\":\"_txChainElement\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"_batchHeader\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"siblings\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct Lib_OVMCodec.ChainInclusionProof\",\"name\":\"_inclusionProof\",\"type\":\"tuple\"}],\"name\":\"verifyTransaction\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The Canonical Transaction Chain (CTC) contract is an append-only log of transactions which must be applied to the rollup state. It defines the ordering of rollup transactions by writing them to the 'CTC:batches' instance of the Chain Storage Container. The CTC also allows any account to 'enqueue' an L2 transaction, which will require that the Sequencer will eventually append it to the rollup state. If the Sequencer does not include an enqueued transaction within the 'force inclusion period', then any account may force it to be included by calling appendQueueBatch(). Compiler used: solc Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"appendSequencerBatch()\":{\"details\":\"This function uses a custom encoding scheme for efficiency reasons. .param _shouldStartAtElement Specific batch we expect to start appending to. .param _totalElementsToAppend Total number of batch elements we expect to append. .param _contexts Array of batch contexts. .param _transactionDataFields Array of raw transaction data.\"},\"batches()\":{\"returns\":{\"_0\":\"Reference to the batch storage container.\"}},\"enqueue(address,uint256,bytes)\":{\"params\":{\"_data\":\"Transaction data.\",\"_gasLimit\":\"Gas limit for the enqueued L2 transaction.\",\"_target\":\"Target L2 contract to send the transaction to.\"}},\"getLastBlockNumber()\":{\"returns\":{\"_0\":\"Blocknumber for the last transaction.\"}},\"getLastTimestamp()\":{\"returns\":{\"_0\":\"Timestamp for the last transaction.\"}},\"getNextQueueIndex()\":{\"returns\":{\"_0\":\"Index for the next queue element.\"}},\"getNumPendingQueueElements()\":{\"returns\":{\"_0\":\"Number of pending queue elements.\"}},\"getQueueElement(uint256)\":{\"params\":{\"_index\":\"Index of the queue element to access.\"},\"returns\":{\"_element\":\"Queue element at the given index.\"}},\"getQueueLength()\":{\"returns\":{\"_0\":\"Length of the queue.\"}},\"getTotalBatches()\":{\"returns\":{\"_totalBatches\":\"Total submitted batches.\"}},\"getTotalElements()\":{\"returns\":{\"_totalElements\":\"Total submitted elements.\"}},\"queue()\":{\"returns\":{\"_0\":\"Reference to the queue storage container.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}},\"verifyTransaction((uint256,uint256,uint8,address,address,uint256,bytes),(bool,uint256,uint256,uint256,bytes),(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))\":{\"params\":{\"_batchHeader\":\"Header of the batch the transaction was included in.\",\"_inclusionProof\":\"Inclusion proof for the provided transaction chain element.\",\"_transaction\":\"Transaction to verify.\",\"_txChainElement\":\"Transaction chain element corresponding to the transaction.\"},\"returns\":{\"_0\":\"True if the transaction exists in the CTC, false if not.\"}}},\"title\":\"OVM_CanonicalTransactionChain\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"appendQueueBatch(uint256)\":{\"notice\":\"Appends a given number of queued transactions as a single batch. param _numQueuedTransactions Number of transactions to append.\"},\"appendSequencerBatch()\":{\"notice\":\"Allows the sequencer to append a batch of transactions.\"},\"batches()\":{\"notice\":\"Accesses the batch storage container.\"},\"enqueue(address,uint256,bytes)\":{\"notice\":\"Adds a transaction to the queue.\"},\"getLastBlockNumber()\":{\"notice\":\"Returns the blocknumber of the last transaction.\"},\"getLastTimestamp()\":{\"notice\":\"Returns the timestamp of the last transaction.\"},\"getNextQueueIndex()\":{\"notice\":\"Returns the index of the next element to be enqueued.\"},\"getNumPendingQueueElements()\":{\"notice\":\"Get the number of queue elements which have not yet been included.\"},\"getQueueElement(uint256)\":{\"notice\":\"Gets the queue element at a particular index.\"},\"getQueueLength()\":{\"notice\":\"Retrieves the length of the queue, including both pending and canonical transactions.\"},\"getTotalBatches()\":{\"notice\":\"Retrieves the total number of batches submitted.\"},\"getTotalElements()\":{\"notice\":\"Retrieves the total number of elements submitted.\"},\"queue()\":{\"notice\":\"Accesses the queue storage container.\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"},\"verifyTransaction((uint256,uint256,uint8,address,address,uint256,bytes),(bool,uint256,uint256,uint256,bytes),(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))\":{\"notice\":\"Verifies whether a transaction is included in the chain.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/OVM/chain/OVM_CanonicalTransactionChain.sol\":\"OVM_CanonicalTransactionChain\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor () internal {\\n address msgSender = _msgSender();\\n _owner = msgSender;\\n emit OwnershipTransferred(address(0), msgSender);\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n emit OwnershipTransferred(_owner, address(0));\\n _owner = address(0);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n emit OwnershipTransferred(_owner, newOwner);\\n _owner = newOwner;\\n }\\n}\\n\",\"keccak256\":\"0x15e2d5bd4c28a88548074c54d220e8086f638a71ed07e6b3ba5a70066fcf458d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a >= b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two numbers.\\n */\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two numbers. The result is rounded towards\\n * zero.\\n */\\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b) / 2 can overflow, so we distribute\\n return (a / 2) + (b / 2) + ((a % 2 + b % 2) / 2);\\n }\\n}\\n\",\"keccak256\":\"0x363bd3b45201f07c9b71c2edc96533468cf14a3d029fabd82fddceb1eb3ebd9c\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with GSN meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address payable) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes memory) {\\n this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x8d3cb350f04ff49cfb10aef08d87f19dcbaecc8027b0bed12f3275cd12f38cf0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/chain/OVM_CanonicalTransactionChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// @unsupported: ovm\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\nimport { Lib_MerkleTree } from \\\"../../libraries/utils/Lib_MerkleTree.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_CanonicalTransactionChain } from \\\"../../iOVM/chain/iOVM_CanonicalTransactionChain.sol\\\";\\nimport { iOVM_ChainStorageContainer } from \\\"../../iOVM/chain/iOVM_ChainStorageContainer.sol\\\";\\n\\n/* Contract Imports */\\nimport { OVM_ExecutionManager } from \\\"../execution/OVM_ExecutionManager.sol\\\";\\n\\n/* External Imports */\\nimport { Math } from \\\"@openzeppelin/contracts/math/Math.sol\\\";\\n\\n/**\\n * @title OVM_CanonicalTransactionChain\\n * @dev The Canonical Transaction Chain (CTC) contract is an append-only log of transactions\\n * which must be applied to the rollup state. It defines the ordering of rollup transactions by\\n * writing them to the 'CTC:batches' instance of the Chain Storage Container.\\n * The CTC also allows any account to 'enqueue' an L2 transaction, which will require that the Sequencer\\n * will eventually append it to the rollup state.\\n * If the Sequencer does not include an enqueued transaction within the 'force inclusion period',\\n * then any account may force it to be included by calling appendQueueBatch().\\n *\\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract OVM_CanonicalTransactionChain is iOVM_CanonicalTransactionChain, Lib_AddressResolver {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n // L2 tx gas-related\\n uint256 constant public MIN_ROLLUP_TX_GAS = 100000;\\n uint256 constant public MAX_ROLLUP_TX_SIZE = 50000;\\n uint256 constant public L2_GAS_DISCOUNT_DIVISOR = 32;\\n\\n // Encoding-related (all in bytes)\\n uint256 constant internal BATCH_CONTEXT_SIZE = 16;\\n uint256 constant internal BATCH_CONTEXT_LENGTH_POS = 12;\\n uint256 constant internal BATCH_CONTEXT_START_POS = 15;\\n uint256 constant internal TX_DATA_HEADER_SIZE = 3;\\n uint256 constant internal BYTES_TILL_TX_DATA = 65;\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n uint256 public forceInclusionPeriodSeconds;\\n uint256 public forceInclusionPeriodBlocks;\\n uint256 public maxTransactionGasLimit;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n constructor(\\n address _libAddressManager,\\n uint256 _forceInclusionPeriodSeconds,\\n uint256 _forceInclusionPeriodBlocks,\\n uint256 _maxTransactionGasLimit\\n )\\n Lib_AddressResolver(_libAddressManager)\\n {\\n forceInclusionPeriodSeconds = _forceInclusionPeriodSeconds;\\n forceInclusionPeriodBlocks = _forceInclusionPeriodBlocks;\\n maxTransactionGasLimit = _maxTransactionGasLimit;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Accesses the batch storage container.\\n * @return Reference to the batch storage container.\\n */\\n function batches()\\n override\\n public\\n view\\n returns (\\n iOVM_ChainStorageContainer\\n )\\n {\\n return iOVM_ChainStorageContainer(\\n resolve(\\\"OVM_ChainStorageContainer:CTC:batches\\\")\\n );\\n }\\n\\n /**\\n * Accesses the queue storage container.\\n * @return Reference to the queue storage container.\\n */\\n function queue()\\n override\\n public\\n view\\n returns (\\n iOVM_ChainStorageContainer\\n )\\n {\\n return iOVM_ChainStorageContainer(\\n resolve(\\\"OVM_ChainStorageContainer:CTC:queue\\\")\\n );\\n }\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements()\\n override\\n public\\n view\\n returns (\\n uint256 _totalElements\\n )\\n {\\n (uint40 totalElements,,,) = _getBatchExtraData();\\n return uint256(totalElements);\\n }\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches()\\n override\\n public\\n view\\n returns (\\n uint256 _totalBatches\\n )\\n {\\n return batches().length();\\n }\\n\\n /**\\n * Returns the index of the next element to be enqueued.\\n * @return Index for the next queue element.\\n */\\n function getNextQueueIndex()\\n override\\n public\\n view\\n returns (\\n uint40\\n )\\n {\\n (,uint40 nextQueueIndex,,) = _getBatchExtraData();\\n return nextQueueIndex;\\n }\\n\\n /**\\n * Returns the timestamp of the last transaction.\\n * @return Timestamp for the last transaction.\\n */\\n function getLastTimestamp()\\n override\\n public\\n view\\n returns (\\n uint40\\n )\\n {\\n (,,uint40 lastTimestamp,) = _getBatchExtraData();\\n return lastTimestamp;\\n }\\n\\n /**\\n * Returns the blocknumber of the last transaction.\\n * @return Blocknumber for the last transaction.\\n */\\n function getLastBlockNumber()\\n override\\n public\\n view\\n returns (\\n uint40\\n )\\n {\\n (,,,uint40 lastBlockNumber) = _getBatchExtraData();\\n return lastBlockNumber;\\n }\\n\\n /**\\n * Gets the queue element at a particular index.\\n * @param _index Index of the queue element to access.\\n * @return _element Queue element at the given index.\\n */\\n function getQueueElement(\\n uint256 _index\\n )\\n override\\n public\\n view\\n returns (\\n Lib_OVMCodec.QueueElement memory _element\\n )\\n {\\n return _getQueueElement(\\n _index,\\n queue()\\n );\\n }\\n\\n /**\\n * Get the number of queue elements which have not yet been included.\\n * @return Number of pending queue elements.\\n */\\n function getNumPendingQueueElements()\\n override\\n public\\n view\\n returns (\\n uint40\\n )\\n {\\n return getQueueLength() - getNextQueueIndex();\\n }\\n\\n /**\\n * Retrieves the length of the queue, including\\n * both pending and canonical transactions.\\n * @return Length of the queue.\\n */\\n function getQueueLength()\\n override\\n public\\n view\\n returns (\\n uint40\\n )\\n {\\n return _getQueueLength(\\n queue()\\n );\\n }\\n\\n /**\\n * Adds a transaction to the queue.\\n * @param _target Target L2 contract to send the transaction to.\\n * @param _gasLimit Gas limit for the enqueued L2 transaction.\\n * @param _data Transaction data.\\n */\\n function enqueue(\\n address _target,\\n uint256 _gasLimit,\\n bytes memory _data\\n )\\n override\\n public\\n {\\n require(\\n _data.length <= MAX_ROLLUP_TX_SIZE,\\n \\\"Transaction data size exceeds maximum for rollup transaction.\\\"\\n );\\n\\n require(\\n _gasLimit <= maxTransactionGasLimit,\\n \\\"Transaction gas limit exceeds maximum for rollup transaction.\\\"\\n );\\n\\n require(\\n _gasLimit >= MIN_ROLLUP_TX_GAS,\\n \\\"Transaction gas limit too low to enqueue.\\\"\\n );\\n\\n // We need to consume some amount of L1 gas in order to rate limit transactions going into\\n // L2. However, L2 is cheaper than L1 so we only need to burn some small proportion of the\\n // provided L1 gas.\\n uint256 gasToConsume = _gasLimit/L2_GAS_DISCOUNT_DIVISOR;\\n uint256 startingGas = gasleft();\\n\\n // Although this check is not necessary (burn below will run out of gas if not true), it\\n // gives the user an explicit reason as to why the enqueue attempt failed.\\n require(\\n startingGas > gasToConsume,\\n \\\"Insufficient gas for L2 rate limiting burn.\\\"\\n );\\n\\n // Here we do some \\\"dumb\\\" work in order to burn gas, although we should probably replace\\n // this with something like minting gas token later on.\\n uint256 i;\\n while(startingGas - gasleft() < gasToConsume) {\\n i++;\\n }\\n\\n bytes32 transactionHash = keccak256(\\n abi.encode(\\n msg.sender,\\n _target,\\n _gasLimit,\\n _data\\n )\\n );\\n\\n bytes32 timestampAndBlockNumber;\\n assembly {\\n timestampAndBlockNumber := timestamp()\\n timestampAndBlockNumber := or(timestampAndBlockNumber, shl(40, number()))\\n }\\n\\n iOVM_ChainStorageContainer queueRef = queue();\\n\\n queueRef.push(transactionHash);\\n queueRef.push(timestampAndBlockNumber);\\n\\n // The underlying queue data structure stores 2 elements\\n // per insertion, so to get the real queue length we need\\n // to divide by 2 and subtract 1.\\n uint256 queueIndex = queueRef.length() / 2 - 1;\\n emit TransactionEnqueued(\\n msg.sender,\\n _target,\\n _gasLimit,\\n _data,\\n queueIndex,\\n block.timestamp\\n );\\n }\\n\\n /**\\n * Appends a given number of queued transactions as a single batch.\\n * param _numQueuedTransactions Number of transactions to append.\\n */\\n function appendQueueBatch(\\n uint256 // _numQueuedTransactions\\n )\\n override\\n public\\n pure\\n {\\n // TEMPORARY: Disable `appendQueueBatch` for minnet\\n revert(\\\"appendQueueBatch is currently disabled.\\\");\\n\\n // _numQueuedTransactions = Math.min(_numQueuedTransactions, getNumPendingQueueElements());\\n // require(\\n // _numQueuedTransactions > 0,\\n // \\\"Must append more than zero transactions.\\\"\\n // );\\n\\n // bytes32[] memory leaves = new bytes32[](_numQueuedTransactions);\\n // uint40 nextQueueIndex = getNextQueueIndex();\\n\\n // for (uint256 i = 0; i < _numQueuedTransactions; i++) {\\n // if (msg.sender != resolve(\\\"OVM_Sequencer\\\")) {\\n // Lib_OVMCodec.QueueElement memory el = getQueueElement(nextQueueIndex);\\n // require(\\n // el.timestamp + forceInclusionPeriodSeconds < block.timestamp,\\n // \\\"Queue transactions cannot be submitted during the sequencer inclusion period.\\\"\\n // );\\n // }\\n // leaves[i] = _getQueueLeafHash(nextQueueIndex);\\n // nextQueueIndex++;\\n // }\\n\\n // Lib_OVMCodec.QueueElement memory lastElement = getQueueElement(nextQueueIndex - 1);\\n\\n // _appendBatch(\\n // Lib_MerkleTree.getMerkleRoot(leaves),\\n // _numQueuedTransactions,\\n // _numQueuedTransactions,\\n // lastElement.timestamp,\\n // lastElement.blockNumber\\n // );\\n\\n // emit QueueBatchAppended(\\n // nextQueueIndex - _numQueuedTransactions,\\n // _numQueuedTransactions,\\n // getTotalElements()\\n // );\\n }\\n\\n /**\\n * Allows the sequencer to append a batch of transactions.\\n * @dev This function uses a custom encoding scheme for efficiency reasons.\\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\\n * .param _contexts Array of batch contexts.\\n * .param _transactionDataFields Array of raw transaction data.\\n */\\n function appendSequencerBatch()\\n override\\n public\\n {\\n uint40 shouldStartAtElement;\\n uint24 totalElementsToAppend;\\n uint24 numContexts;\\n assembly {\\n shouldStartAtElement := shr(216, calldataload(4))\\n totalElementsToAppend := shr(232, calldataload(9))\\n numContexts := shr(232, calldataload(12))\\n }\\n\\n require(\\n shouldStartAtElement == getTotalElements(),\\n \\\"Actual batch start index does not match expected start index.\\\"\\n );\\n\\n require(\\n msg.sender == resolve(\\\"OVM_Sequencer\\\"),\\n \\\"Function can only be called by the Sequencer.\\\"\\n );\\n\\n require(\\n numContexts > 0,\\n \\\"Must provide at least one batch context.\\\"\\n );\\n\\n require(\\n totalElementsToAppend > 0,\\n \\\"Must append at least one element.\\\"\\n );\\n\\n uint40 nextTransactionPtr = uint40(BATCH_CONTEXT_START_POS + BATCH_CONTEXT_SIZE * numContexts);\\n\\n require(\\n msg.data.length >= nextTransactionPtr,\\n \\\"Not enough BatchContexts provided.\\\"\\n );\\n\\n // Take a reference to the queue and its length so we don't have to keep resolving it.\\n // Length isn't going to change during the course of execution, so it's fine to simply\\n // resolve this once at the start. Saves gas.\\n iOVM_ChainStorageContainer queueRef = queue();\\n uint40 queueLength = _getQueueLength(queueRef);\\n\\n // Reserve some memory to save gas on hashing later on. This is a relatively safe estimate\\n // for the average transaction size that will prevent having to resize this chunk of memory\\n // later on. Saves gas.\\n bytes memory hashMemory = new bytes((msg.data.length / totalElementsToAppend) * 2);\\n\\n // Initialize the array of canonical chain leaves that we will append.\\n bytes32[] memory leaves = new bytes32[](totalElementsToAppend);\\n\\n // Each leaf index corresponds to a tx, either sequenced or enqueued.\\n uint32 leafIndex = 0;\\n\\n // Counter for number of sequencer transactions appended so far.\\n uint32 numSequencerTransactions = 0;\\n\\n // We will sequentially append leaves which are pointers to the queue.\\n // The initial queue index is what is currently in storage.\\n uint40 nextQueueIndex = getNextQueueIndex();\\n\\n BatchContext memory curContext;\\n for (uint32 i = 0; i < numContexts; i++) {\\n BatchContext memory nextContext = _getBatchContext(i);\\n\\n if (i == 0) {\\n // Execute a special check for the first batch.\\n _validateFirstBatchContext(nextContext);\\n }\\n\\n // Execute this check on every single batch, including the first one.\\n _validateNextBatchContext(\\n curContext,\\n nextContext,\\n nextQueueIndex,\\n queueRef\\n );\\n\\n // Now we can update our current context.\\n curContext = nextContext;\\n\\n // Process sequencer transactions first.\\n for (uint32 j = 0; j < curContext.numSequencedTransactions; j++) {\\n uint256 txDataLength;\\n assembly {\\n txDataLength := shr(232, calldataload(nextTransactionPtr))\\n }\\n require(\\n txDataLength <= MAX_ROLLUP_TX_SIZE,\\n \\\"Transaction data size exceeds maximum for rollup transaction.\\\"\\n );\\n\\n leaves[leafIndex] = _getSequencerLeafHash(\\n curContext,\\n nextTransactionPtr,\\n txDataLength,\\n hashMemory\\n );\\n\\n nextTransactionPtr += uint40(TX_DATA_HEADER_SIZE + txDataLength);\\n numSequencerTransactions++;\\n leafIndex++;\\n }\\n\\n // Now process any subsequent queue transactions.\\n for (uint32 j = 0; j < curContext.numSubsequentQueueTransactions; j++) {\\n require(\\n nextQueueIndex < queueLength,\\n \\\"Not enough queued transactions to append.\\\"\\n );\\n\\n leaves[leafIndex] = _getQueueLeafHash(nextQueueIndex);\\n nextQueueIndex++;\\n leafIndex++;\\n }\\n }\\n\\n _validateFinalBatchContext(\\n curContext,\\n nextQueueIndex,\\n queueLength,\\n queueRef\\n );\\n\\n require(\\n msg.data.length == nextTransactionPtr,\\n \\\"Not all sequencer transactions were processed.\\\"\\n );\\n\\n require(\\n leafIndex == totalElementsToAppend,\\n \\\"Actual transaction index does not match expected total elements to append.\\\"\\n );\\n\\n // Generate the required metadata that we need to append this batch\\n uint40 numQueuedTransactions = totalElementsToAppend - numSequencerTransactions;\\n uint40 blockTimestamp;\\n uint40 blockNumber;\\n if (curContext.numSubsequentQueueTransactions == 0) {\\n // The last element is a sequencer tx, therefore pull timestamp and block number from the last context.\\n blockTimestamp = uint40(curContext.timestamp);\\n blockNumber = uint40(curContext.blockNumber);\\n } else {\\n // The last element is a queue tx, therefore pull timestamp and block number from the queue element.\\n // curContext.numSubsequentQueueTransactions > 0 which means that we've processed at least one queue element.\\n // We increment nextQueueIndex after processing each queue element,\\n // so the index of the last element we processed is nextQueueIndex - 1.\\n Lib_OVMCodec.QueueElement memory lastElement = _getQueueElement(\\n nextQueueIndex - 1,\\n queueRef\\n );\\n\\n blockTimestamp = lastElement.timestamp;\\n blockNumber = lastElement.blockNumber;\\n }\\n\\n // For efficiency reasons getMerkleRoot modifies the `leaves` argument in place\\n // while calculating the root hash therefore any arguments passed to it must not\\n // be used again afterwards\\n _appendBatch(\\n Lib_MerkleTree.getMerkleRoot(leaves),\\n totalElementsToAppend,\\n numQueuedTransactions,\\n blockTimestamp,\\n blockNumber\\n );\\n\\n emit SequencerBatchAppended(\\n nextQueueIndex - numQueuedTransactions,\\n numQueuedTransactions,\\n getTotalElements()\\n );\\n }\\n\\n /**\\n * Verifies whether a transaction is included in the chain.\\n * @param _transaction Transaction to verify.\\n * @param _txChainElement Transaction chain element corresponding to the transaction.\\n * @param _batchHeader Header of the batch the transaction was included in.\\n * @param _inclusionProof Inclusion proof for the provided transaction chain element.\\n * @return True if the transaction exists in the CTC, false if not.\\n */\\n function verifyTransaction(\\n Lib_OVMCodec.Transaction memory _transaction,\\n Lib_OVMCodec.TransactionChainElement memory _txChainElement,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _inclusionProof\\n )\\n override\\n public\\n view\\n returns (\\n bool\\n )\\n {\\n if (_txChainElement.isSequenced == true) {\\n return _verifySequencerTransaction(\\n _transaction,\\n _txChainElement,\\n _batchHeader,\\n _inclusionProof\\n );\\n } else {\\n return _verifyQueueTransaction(\\n _transaction,\\n _txChainElement.queueIndex,\\n _batchHeader,\\n _inclusionProof\\n );\\n }\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Returns the BatchContext located at a particular index.\\n * @param _index The index of the BatchContext\\n * @return The BatchContext at the specified index.\\n */\\n function _getBatchContext(\\n uint256 _index\\n )\\n internal\\n pure\\n returns (\\n BatchContext memory\\n )\\n {\\n uint256 contextPtr = 15 + _index * BATCH_CONTEXT_SIZE;\\n uint256 numSequencedTransactions;\\n uint256 numSubsequentQueueTransactions;\\n uint256 ctxTimestamp;\\n uint256 ctxBlockNumber;\\n\\n assembly {\\n numSequencedTransactions := shr(232, calldataload(contextPtr))\\n numSubsequentQueueTransactions := shr(232, calldataload(add(contextPtr, 3)))\\n ctxTimestamp := shr(216, calldataload(add(contextPtr, 6)))\\n ctxBlockNumber := shr(216, calldataload(add(contextPtr, 11)))\\n }\\n\\n return BatchContext({\\n numSequencedTransactions: numSequencedTransactions,\\n numSubsequentQueueTransactions: numSubsequentQueueTransactions,\\n timestamp: ctxTimestamp,\\n blockNumber: ctxBlockNumber\\n });\\n }\\n\\n /**\\n * Parses the batch context from the extra data.\\n * @return Total number of elements submitted.\\n * @return Index of the next queue element.\\n */\\n function _getBatchExtraData()\\n internal\\n view\\n returns (\\n uint40,\\n uint40,\\n uint40,\\n uint40\\n )\\n {\\n bytes27 extraData = batches().getGlobalMetadata();\\n\\n uint40 totalElements;\\n uint40 nextQueueIndex;\\n uint40 lastTimestamp;\\n uint40 lastBlockNumber;\\n assembly {\\n extraData := shr(40, extraData)\\n totalElements := and(extraData, 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF)\\n nextQueueIndex := shr(40, and(extraData, 0x00000000000000000000000000000000000000000000FFFFFFFFFF0000000000))\\n lastTimestamp := shr(80, and(extraData, 0x0000000000000000000000000000000000FFFFFFFFFF00000000000000000000))\\n lastBlockNumber := shr(120, and(extraData, 0x000000000000000000000000FFFFFFFFFF000000000000000000000000000000))\\n }\\n\\n return (\\n totalElements,\\n nextQueueIndex,\\n lastTimestamp,\\n lastBlockNumber\\n );\\n }\\n\\n /**\\n * Encodes the batch context for the extra data.\\n * @param _totalElements Total number of elements submitted.\\n * @param _nextQueueIndex Index of the next queue element.\\n * @param _timestamp Timestamp for the last batch.\\n * @param _blockNumber Block number of the last batch.\\n * @return Encoded batch context.\\n */\\n function _makeBatchExtraData(\\n uint40 _totalElements,\\n uint40 _nextQueueIndex,\\n uint40 _timestamp,\\n uint40 _blockNumber\\n )\\n internal\\n pure\\n returns (\\n bytes27\\n )\\n {\\n bytes27 extraData;\\n assembly {\\n extraData := _totalElements\\n extraData := or(extraData, shl(40, _nextQueueIndex))\\n extraData := or(extraData, shl(80, _timestamp))\\n extraData := or(extraData, shl(120, _blockNumber))\\n extraData := shl(40, extraData)\\n }\\n\\n return extraData;\\n }\\n\\n /**\\n * Retrieves the hash of a queue element.\\n * @param _index Index of the queue element to retrieve a hash for.\\n * @return Hash of the queue element.\\n */\\n function _getQueueLeafHash(\\n uint256 _index\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return _hashTransactionChainElement(\\n Lib_OVMCodec.TransactionChainElement({\\n isSequenced: false,\\n queueIndex: _index,\\n timestamp: 0,\\n blockNumber: 0,\\n txData: hex\\\"\\\"\\n })\\n );\\n }\\n\\n /**\\n * Gets the queue element at a particular index.\\n * @param _index Index of the queue element to access.\\n * @return _element Queue element at the given index.\\n */\\n function _getQueueElement(\\n uint256 _index,\\n iOVM_ChainStorageContainer _queueRef\\n )\\n internal\\n view\\n returns (\\n Lib_OVMCodec.QueueElement memory _element\\n )\\n {\\n // The underlying queue data structure stores 2 elements\\n // per insertion, so to get the actual desired queue index\\n // we need to multiply by 2.\\n uint40 trueIndex = uint40(_index * 2);\\n bytes32 transactionHash = _queueRef.get(trueIndex);\\n bytes32 timestampAndBlockNumber = _queueRef.get(trueIndex + 1);\\n\\n uint40 elementTimestamp;\\n uint40 elementBlockNumber;\\n assembly {\\n elementTimestamp := and(timestampAndBlockNumber, 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF)\\n elementBlockNumber := shr(40, and(timestampAndBlockNumber, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000))\\n }\\n\\n return Lib_OVMCodec.QueueElement({\\n transactionHash: transactionHash,\\n timestamp: elementTimestamp,\\n blockNumber: elementBlockNumber\\n });\\n }\\n\\n /**\\n * Retrieves the length of the queue.\\n * @return Length of the queue.\\n */\\n function _getQueueLength(\\n iOVM_ChainStorageContainer _queueRef\\n )\\n internal\\n view\\n returns (\\n uint40\\n )\\n {\\n // The underlying queue data structure stores 2 elements\\n // per insertion, so to get the real queue length we need\\n // to divide by 2.\\n return uint40(_queueRef.length() / 2);\\n }\\n\\n /**\\n * Retrieves the hash of a sequencer element.\\n * @param _context Batch context for the given element.\\n * @param _nextTransactionPtr Pointer to the next transaction in the calldata.\\n * @param _txDataLength Length of the transaction item.\\n * @return Hash of the sequencer element.\\n */\\n function _getSequencerLeafHash(\\n BatchContext memory _context,\\n uint256 _nextTransactionPtr,\\n uint256 _txDataLength,\\n bytes memory _hashMemory\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n // Only allocate more memory if we didn't reserve enough to begin with.\\n if (BYTES_TILL_TX_DATA + _txDataLength > _hashMemory.length) {\\n _hashMemory = new bytes(BYTES_TILL_TX_DATA + _txDataLength);\\n }\\n\\n uint256 ctxTimestamp = _context.timestamp;\\n uint256 ctxBlockNumber = _context.blockNumber;\\n\\n bytes32 leafHash;\\n assembly {\\n let chainElementStart := add(_hashMemory, 0x20)\\n\\n // Set the first byte equal to `1` to indicate this is a sequencer chain element.\\n // This distinguishes sequencer ChainElements from queue ChainElements because\\n // all queue ChainElements are ABI encoded and the first byte of ABI encoded\\n // elements is always zero\\n mstore8(chainElementStart, 1)\\n\\n mstore(add(chainElementStart, 1), ctxTimestamp)\\n mstore(add(chainElementStart, 33), ctxBlockNumber)\\n\\n calldatacopy(add(chainElementStart, BYTES_TILL_TX_DATA), add(_nextTransactionPtr, 3), _txDataLength)\\n\\n leafHash := keccak256(chainElementStart, add(BYTES_TILL_TX_DATA, _txDataLength))\\n }\\n\\n return leafHash;\\n }\\n\\n /**\\n * Retrieves the hash of a sequencer element.\\n * @param _txChainElement The chain element which is hashed to calculate the leaf.\\n * @return Hash of the sequencer element.\\n */\\n function _getSequencerLeafHash(\\n Lib_OVMCodec.TransactionChainElement memory _txChainElement\\n )\\n internal\\n view\\n returns(\\n bytes32\\n )\\n {\\n bytes memory txData = _txChainElement.txData;\\n uint256 txDataLength = _txChainElement.txData.length;\\n\\n bytes memory chainElement = new bytes(BYTES_TILL_TX_DATA + txDataLength);\\n uint256 ctxTimestamp = _txChainElement.timestamp;\\n uint256 ctxBlockNumber = _txChainElement.blockNumber;\\n\\n bytes32 leafHash;\\n assembly {\\n let chainElementStart := add(chainElement, 0x20)\\n\\n // Set the first byte equal to `1` to indicate this is a sequencer chain element.\\n // This distinguishes sequencer ChainElements from queue ChainElements because\\n // all queue ChainElements are ABI encoded and the first byte of ABI encoded\\n // elements is always zero\\n mstore8(chainElementStart, 1)\\n\\n mstore(add(chainElementStart, 1), ctxTimestamp)\\n mstore(add(chainElementStart, 33), ctxBlockNumber)\\n\\n pop(staticcall(gas(), 0x04, add(txData, 0x20), txDataLength, add(chainElementStart, BYTES_TILL_TX_DATA), txDataLength))\\n\\n leafHash := keccak256(chainElementStart, add(BYTES_TILL_TX_DATA, txDataLength))\\n }\\n\\n return leafHash;\\n }\\n\\n /**\\n * Inserts a batch into the chain of batches.\\n * @param _transactionRoot Root of the transaction tree for this batch.\\n * @param _batchSize Number of elements in the batch.\\n * @param _numQueuedTransactions Number of queue transactions in the batch.\\n * @param _timestamp The latest batch timestamp.\\n * @param _blockNumber The latest batch blockNumber.\\n */\\n function _appendBatch(\\n bytes32 _transactionRoot,\\n uint256 _batchSize,\\n uint256 _numQueuedTransactions,\\n uint40 _timestamp,\\n uint40 _blockNumber\\n )\\n internal\\n {\\n iOVM_ChainStorageContainer batchesRef = batches();\\n (uint40 totalElements, uint40 nextQueueIndex,,) = _getBatchExtraData();\\n\\n Lib_OVMCodec.ChainBatchHeader memory header = Lib_OVMCodec.ChainBatchHeader({\\n batchIndex: batchesRef.length(),\\n batchRoot: _transactionRoot,\\n batchSize: _batchSize,\\n prevTotalElements: totalElements,\\n extraData: hex\\\"\\\"\\n });\\n\\n emit TransactionBatchAppended(\\n header.batchIndex,\\n header.batchRoot,\\n header.batchSize,\\n header.prevTotalElements,\\n header.extraData\\n );\\n\\n bytes32 batchHeaderHash = Lib_OVMCodec.hashBatchHeader(header);\\n bytes27 latestBatchContext = _makeBatchExtraData(\\n totalElements + uint40(header.batchSize),\\n nextQueueIndex + uint40(_numQueuedTransactions),\\n _timestamp,\\n _blockNumber\\n );\\n\\n batchesRef.push(batchHeaderHash, latestBatchContext);\\n }\\n\\n /**\\n * Checks that the first batch context in a sequencer submission is valid\\n * @param _firstContext The batch context to validate.\\n */\\n function _validateFirstBatchContext(\\n BatchContext memory _firstContext\\n )\\n internal\\n view\\n {\\n // If there are existing elements, this batch must have the same context\\n // or a later timestamp and block number.\\n if (getTotalElements() > 0) {\\n (,, uint40 lastTimestamp, uint40 lastBlockNumber) = _getBatchExtraData();\\n\\n require(\\n _firstContext.blockNumber >= lastBlockNumber,\\n \\\"Context block number is lower than last submitted.\\\"\\n );\\n\\n require(\\n _firstContext.timestamp >= lastTimestamp,\\n \\\"Context timestamp is lower than last submitted.\\\"\\n );\\n }\\n\\n // Sequencer cannot submit contexts which are more than the force inclusion period old.\\n require(\\n _firstContext.timestamp + forceInclusionPeriodSeconds >= block.timestamp,\\n \\\"Context timestamp too far in the past.\\\"\\n );\\n\\n require(\\n _firstContext.blockNumber + forceInclusionPeriodBlocks >= block.number,\\n \\\"Context block number too far in the past.\\\"\\n );\\n }\\n\\n /**\\n * Checks that a given batch context has a time context which is below a given que element\\n * @param _context The batch context to validate has values lower.\\n * @param _queueIndex Index of the queue element we are validating came later than the context.\\n * @param _queueRef The storage container for the queue.\\n */\\n function _validateContextBeforeEnqueue(\\n BatchContext memory _context,\\n uint40 _queueIndex,\\n iOVM_ChainStorageContainer _queueRef\\n )\\n internal\\n view\\n {\\n Lib_OVMCodec.QueueElement memory nextQueueElement = _getQueueElement(\\n _queueIndex,\\n _queueRef\\n );\\n\\n // If the force inclusion period has passed for an enqueued transaction, it MUST be the next chain element.\\n require(\\n block.timestamp < nextQueueElement.timestamp + forceInclusionPeriodSeconds,\\n \\\"Previously enqueued batches have expired and must be appended before a new sequencer batch.\\\"\\n );\\n\\n // Just like sequencer transaction times must be increasing relative to each other,\\n // We also require that they be increasing relative to any interspersed queue elements.\\n require(\\n _context.timestamp <= nextQueueElement.timestamp,\\n \\\"Sequencer transaction timestamp exceeds that of next queue element.\\\"\\n );\\n\\n require(\\n _context.blockNumber <= nextQueueElement.blockNumber,\\n \\\"Sequencer transaction blockNumber exceeds that of next queue element.\\\"\\n );\\n }\\n\\n /**\\n * Checks that a given batch context is valid based on its previous context, and the next queue elemtent.\\n * @param _prevContext The previously validated batch context.\\n * @param _nextContext The batch context to validate with this call.\\n * @param _nextQueueIndex Index of the next queue element to process for the _nextContext's subsequentQueueElements.\\n * @param _queueRef The storage container for the queue.\\n */\\n function _validateNextBatchContext(\\n BatchContext memory _prevContext,\\n BatchContext memory _nextContext,\\n uint40 _nextQueueIndex,\\n iOVM_ChainStorageContainer _queueRef\\n )\\n internal\\n view\\n {\\n // All sequencer transactions' times must be greater than or equal to the previous ones.\\n require(\\n _nextContext.timestamp >= _prevContext.timestamp,\\n \\\"Context timestamp values must monotonically increase.\\\"\\n );\\n\\n require(\\n _nextContext.blockNumber >= _prevContext.blockNumber,\\n \\\"Context blockNumber values must monotonically increase.\\\"\\n );\\n\\n // If there is going to be a queue element pulled in from this context:\\n if (_nextContext.numSubsequentQueueTransactions > 0) {\\n _validateContextBeforeEnqueue(\\n _nextContext,\\n _nextQueueIndex,\\n _queueRef\\n );\\n }\\n }\\n\\n /**\\n * Checks that the final batch context in a sequencer submission is valid.\\n * @param _finalContext The batch context to validate.\\n * @param _queueLength The length of the queue at the start of the batchAppend call.\\n * @param _nextQueueIndex The next element in the queue that will be pulled into the CTC.\\n * @param _queueRef The storage container for the queue.\\n */\\n function _validateFinalBatchContext(\\n BatchContext memory _finalContext,\\n uint40 _nextQueueIndex,\\n uint40 _queueLength,\\n iOVM_ChainStorageContainer _queueRef\\n )\\n internal\\n view\\n {\\n // If the queue is not now empty, check the mononoticity of whatever the next batch that will come in is.\\n if (_queueLength - _nextQueueIndex > 0 && _finalContext.numSubsequentQueueTransactions == 0) {\\n _validateContextBeforeEnqueue(\\n _finalContext,\\n _nextQueueIndex,\\n _queueRef\\n );\\n }\\n // Batches cannot be added from the future, or subsequent enqueue() contexts would violate monotonicity.\\n require(_finalContext.timestamp <= block.timestamp, \\\"Context timestamp is from the future.\\\");\\n require(_finalContext.blockNumber <= block.number, \\\"Context block number is from the future.\\\");\\n }\\n\\n /**\\n * Hashes a transaction chain element.\\n * @param _element Chain element to hash.\\n * @return Hash of the chain element.\\n */\\n function _hashTransactionChainElement(\\n Lib_OVMCodec.TransactionChainElement memory _element\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(\\n abi.encode(\\n _element.isSequenced,\\n _element.queueIndex,\\n _element.timestamp,\\n _element.blockNumber,\\n _element.txData\\n )\\n );\\n }\\n\\n /**\\n * Verifies a sequencer transaction, returning true if it was indeed included in the CTC\\n * @param _transaction The transaction we are verifying inclusion of.\\n * @param _txChainElement The chain element that the transaction is claimed to be a part of.\\n * @param _batchHeader Header of the batch the transaction was included in.\\n * @param _inclusionProof An inclusion proof into the CTC at a particular index.\\n * @return True if the transaction was included in the specified location, else false.\\n */\\n function _verifySequencerTransaction(\\n Lib_OVMCodec.Transaction memory _transaction,\\n Lib_OVMCodec.TransactionChainElement memory _txChainElement,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _inclusionProof\\n )\\n internal\\n view\\n returns (\\n bool\\n )\\n {\\n OVM_ExecutionManager ovmExecutionManager = OVM_ExecutionManager(resolve(\\\"OVM_ExecutionManager\\\"));\\n uint256 gasLimit = ovmExecutionManager.getMaxTransactionGasLimit();\\n bytes32 leafHash = _getSequencerLeafHash(_txChainElement);\\n\\n require(\\n _verifyElement(\\n leafHash,\\n _batchHeader,\\n _inclusionProof\\n ),\\n \\\"Invalid Sequencer transaction inclusion proof.\\\"\\n );\\n\\n require(\\n _transaction.blockNumber == _txChainElement.blockNumber\\n && _transaction.timestamp == _txChainElement.timestamp\\n && _transaction.entrypoint == resolve(\\\"OVM_DecompressionPrecompileAddress\\\")\\n && _transaction.gasLimit == gasLimit\\n && _transaction.l1TxOrigin == address(0)\\n && _transaction.l1QueueOrigin == Lib_OVMCodec.QueueOrigin.SEQUENCER_QUEUE\\n && keccak256(_transaction.data) == keccak256(_txChainElement.txData),\\n \\\"Invalid Sequencer transaction.\\\"\\n );\\n\\n return true;\\n }\\n\\n /**\\n * Verifies a queue transaction, returning true if it was indeed included in the CTC\\n * @param _transaction The transaction we are verifying inclusion of.\\n * @param _queueIndex The queueIndex of the queued transaction.\\n * @param _batchHeader Header of the batch the transaction was included in.\\n * @param _inclusionProof An inclusion proof into the CTC at a particular index (should point to queue tx).\\n * @return True if the transaction was included in the specified location, else false.\\n */\\n function _verifyQueueTransaction(\\n Lib_OVMCodec.Transaction memory _transaction,\\n uint256 _queueIndex,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _inclusionProof\\n )\\n internal\\n view\\n returns (\\n bool\\n )\\n {\\n bytes32 leafHash = _getQueueLeafHash(_queueIndex);\\n\\n require(\\n _verifyElement(\\n leafHash,\\n _batchHeader,\\n _inclusionProof\\n ),\\n \\\"Invalid Queue transaction inclusion proof.\\\"\\n );\\n\\n bytes32 transactionHash = keccak256(\\n abi.encode(\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n )\\n );\\n\\n Lib_OVMCodec.QueueElement memory el = getQueueElement(_queueIndex);\\n require(\\n el.transactionHash == transactionHash\\n && el.timestamp == _transaction.timestamp\\n && el.blockNumber == _transaction.blockNumber,\\n \\\"Invalid Queue transaction.\\\"\\n );\\n\\n return true;\\n }\\n\\n /**\\n * Verifies a batch inclusion proof.\\n * @param _element Hash of the element to verify a proof for.\\n * @param _batchHeader Header of the batch in which the element was included.\\n * @param _proof Merkle inclusion proof for the element.\\n */\\n function _verifyElement(\\n bytes32 _element,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _proof\\n )\\n internal\\n view\\n returns (\\n bool\\n )\\n {\\n require(\\n Lib_OVMCodec.hashBatchHeader(_batchHeader) == batches().get(uint32(_batchHeader.batchIndex)),\\n \\\"Invalid batch header.\\\"\\n );\\n\\n require(\\n Lib_MerkleTree.verify(\\n _batchHeader.batchRoot,\\n _element,\\n _proof.index,\\n _proof.siblings,\\n _batchHeader.batchSize\\n ),\\n \\\"Invalid inclusion proof.\\\"\\n );\\n\\n return true;\\n }\\n}\\n\",\"keccak256\":\"0xdc5f311b6840476027f597b9b6ff6c7673988cfed9c9ace625c705175b27abe3\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// @unsupported: ovm\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\nimport { Lib_EthUtils } from \\\"../../libraries/utils/Lib_EthUtils.sol\\\";\\nimport { Lib_ErrorUtils } from \\\"../../libraries/utils/Lib_ErrorUtils.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_ExecutionManager } from \\\"../../iOVM/execution/iOVM_ExecutionManager.sol\\\";\\nimport { iOVM_StateManager } from \\\"../../iOVM/execution/iOVM_StateManager.sol\\\";\\nimport { iOVM_SafetyChecker } from \\\"../../iOVM/execution/iOVM_SafetyChecker.sol\\\";\\n\\n/* Contract Imports */\\nimport { OVM_DeployerWhitelist } from \\\"../predeploys/OVM_DeployerWhitelist.sol\\\";\\n\\n/**\\n * @title OVM_ExecutionManager\\n * @dev The Execution Manager (EM) is the core of our OVM implementation, and provides a sandboxed\\n * environment allowing us to execute OVM transactions deterministically on either Layer 1 or\\n * Layer 2.\\n * The EM's run() function is the first function called during the execution of any\\n * transaction on L2.\\n * For each context-dependent EVM operation the EM has a function which implements a corresponding\\n * OVM operation, which will read state from the State Manager contract.\\n * The EM relies on the Safety Checker to verify that code deployed to Layer 2 does not contain any\\n * context-dependent operations.\\n *\\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract OVM_ExecutionManager is iOVM_ExecutionManager, Lib_AddressResolver {\\n\\n /********************************\\n * External Contract References *\\n ********************************/\\n\\n iOVM_SafetyChecker internal ovmSafetyChecker;\\n iOVM_StateManager internal ovmStateManager;\\n\\n\\n /*******************************\\n * Execution Context Variables *\\n *******************************/\\n\\n GasMeterConfig internal gasMeterConfig;\\n GlobalContext internal globalContext;\\n TransactionContext internal transactionContext;\\n MessageContext internal messageContext;\\n TransactionRecord internal transactionRecord;\\n MessageRecord internal messageRecord;\\n\\n\\n /**************************\\n * Gas Metering Constants *\\n **************************/\\n\\n address constant GAS_METADATA_ADDRESS = 0x06a506A506a506A506a506a506A506A506A506A5;\\n uint256 constant NUISANCE_GAS_SLOAD = 20000;\\n uint256 constant NUISANCE_GAS_SSTORE = 20000;\\n uint256 constant MIN_NUISANCE_GAS_PER_CONTRACT = 30000;\\n uint256 constant NUISANCE_GAS_PER_CONTRACT_BYTE = 100;\\n uint256 constant MIN_GAS_FOR_INVALID_STATE_ACCESS = 30000;\\n\\n /**************************\\n * Default Context Values *\\n **************************/\\n\\n uint256 constant DEFAULT_UINT256 = 0xdefa017defa017defa017defa017defa017defa017defa017defa017defa017d;\\n address constant DEFAULT_ADDRESS = 0xdEfa017defA017DeFA017DEfa017DeFA017DeFa0;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n */\\n constructor(\\n address _libAddressManager,\\n GasMeterConfig memory _gasMeterConfig,\\n GlobalContext memory _globalContext\\n )\\n Lib_AddressResolver(_libAddressManager)\\n {\\n ovmSafetyChecker = iOVM_SafetyChecker(resolve(\\\"OVM_SafetyChecker\\\"));\\n gasMeterConfig = _gasMeterConfig;\\n globalContext = _globalContext;\\n _resetContext();\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n /**\\n * Applies dynamically-sized refund to a transaction to account for the difference in execution\\n * between L1 and L2, so that the overall cost of the ovmOPCODE is fixed.\\n * @param _cost Desired gas cost for the function after the refund.\\n */\\n modifier netGasCost(\\n uint256 _cost\\n ) {\\n uint256 gasProvided = gasleft();\\n _;\\n uint256 gasUsed = gasProvided - gasleft();\\n\\n // We want to refund everything *except* the specified cost.\\n if (_cost < gasUsed) {\\n transactionRecord.ovmGasRefund += gasUsed - _cost;\\n }\\n }\\n\\n /**\\n * Applies a fixed-size gas refund to a transaction to account for the difference in execution\\n * between L1 and L2, so that the overall cost of an ovmOPCODE can be lowered.\\n * @param _discount Amount of gas cost to refund for the ovmOPCODE.\\n */\\n modifier fixedGasDiscount(\\n uint256 _discount\\n ) {\\n uint256 gasProvided = gasleft();\\n _;\\n uint256 gasUsed = gasProvided - gasleft();\\n\\n // We want to refund the specified _discount, unless this risks underflow.\\n if (_discount < gasUsed) {\\n transactionRecord.ovmGasRefund += _discount;\\n } else {\\n // refund all we can without risking underflow.\\n transactionRecord.ovmGasRefund += gasUsed;\\n }\\n }\\n\\n /**\\n * Makes sure we're not inside a static context.\\n */\\n modifier notStatic() {\\n if (messageContext.isStatic == true) {\\n _revertWithFlag(RevertFlag.STATIC_VIOLATION);\\n }\\n _;\\n }\\n\\n\\n /************************************\\n * Transaction Execution Entrypoint *\\n ************************************/\\n\\n /**\\n * Starts the execution of a transaction via the OVM_ExecutionManager.\\n * @param _transaction Transaction data to be executed.\\n * @param _ovmStateManager iOVM_StateManager implementation providing account state.\\n */\\n function run(\\n Lib_OVMCodec.Transaction memory _transaction,\\n address _ovmStateManager\\n )\\n override\\n public\\n returns (\\n bytes memory\\n )\\n {\\n // Make sure that run() is not re-enterable. This condition should always be satisfied\\n // Once run has been called once, due to the behavior of _isValidInput().\\n if (transactionContext.ovmNUMBER != DEFAULT_UINT256) {\\n return bytes(\\\"\\\");\\n }\\n\\n // Store our OVM_StateManager instance (significantly easier than attempting to pass the\\n // address around in calldata).\\n ovmStateManager = iOVM_StateManager(_ovmStateManager);\\n\\n // Make sure this function can't be called by anyone except the owner of the\\n // OVM_StateManager (expected to be an OVM_StateTransitioner). We can revert here because\\n // this would make the `run` itself invalid.\\n require(\\n // This method may return false during fraud proofs, but always returns true in L2 nodes' State Manager precompile.\\n ovmStateManager.isAuthenticated(msg.sender),\\n \\\"Only authenticated addresses in ovmStateManager can call this function\\\"\\n );\\n\\n // Initialize the execution context, must be initialized before we perform any gas metering\\n // or we'll throw a nuisance gas error.\\n _initContext(_transaction);\\n\\n // TEMPORARY: Gas metering is disabled for minnet.\\n // // Check whether we need to start a new epoch, do so if necessary.\\n // _checkNeedsNewEpoch(_transaction.timestamp);\\n\\n // Make sure the transaction's gas limit is valid. We don't revert here because we reserve\\n // reverts for INVALID_STATE_ACCESS.\\n if (_isValidInput(_transaction) == false) {\\n _resetContext();\\n return bytes(\\\"\\\");\\n }\\n\\n // TEMPORARY: Gas metering is disabled for minnet.\\n // // Check gas right before the call to get total gas consumed by OVM transaction.\\n // uint256 gasProvided = gasleft();\\n\\n // Run the transaction, make sure to meter the gas usage.\\n (, bytes memory returndata) = ovmCALL(\\n _transaction.gasLimit - gasMeterConfig.minTransactionGasLimit,\\n _transaction.entrypoint,\\n _transaction.data\\n );\\n\\n // TEMPORARY: Gas metering is disabled for minnet.\\n // // Update the cumulative gas based on the amount of gas used.\\n // uint256 gasUsed = gasProvided - gasleft();\\n // _updateCumulativeGas(gasUsed, _transaction.l1QueueOrigin);\\n\\n // Wipe the execution context.\\n _resetContext();\\n\\n return returndata;\\n }\\n\\n\\n /******************************\\n * Opcodes: Execution Context *\\n ******************************/\\n\\n /**\\n * @notice Overrides CALLER.\\n * @return _CALLER Address of the CALLER within the current message context.\\n */\\n function ovmCALLER()\\n override\\n public\\n view\\n returns (\\n address _CALLER\\n )\\n {\\n return messageContext.ovmCALLER;\\n }\\n\\n /**\\n * @notice Overrides ADDRESS.\\n * @return _ADDRESS Active ADDRESS within the current message context.\\n */\\n function ovmADDRESS()\\n override\\n public\\n view\\n returns (\\n address _ADDRESS\\n )\\n {\\n return messageContext.ovmADDRESS;\\n }\\n\\n /**\\n * @notice Overrides TIMESTAMP.\\n * @return _TIMESTAMP Value of the TIMESTAMP within the transaction context.\\n */\\n function ovmTIMESTAMP()\\n override\\n public\\n view\\n returns (\\n uint256 _TIMESTAMP\\n )\\n {\\n return transactionContext.ovmTIMESTAMP;\\n }\\n\\n /**\\n * @notice Overrides NUMBER.\\n * @return _NUMBER Value of the NUMBER within the transaction context.\\n */\\n function ovmNUMBER()\\n override\\n public\\n view\\n returns (\\n uint256 _NUMBER\\n )\\n {\\n return transactionContext.ovmNUMBER;\\n }\\n\\n /**\\n * @notice Overrides GASLIMIT.\\n * @return _GASLIMIT Value of the block's GASLIMIT within the transaction context.\\n */\\n function ovmGASLIMIT()\\n override\\n public\\n view\\n returns (\\n uint256 _GASLIMIT\\n )\\n {\\n return transactionContext.ovmGASLIMIT;\\n }\\n\\n /**\\n * @notice Overrides CHAINID.\\n * @return _CHAINID Value of the chain's CHAINID within the global context.\\n */\\n function ovmCHAINID()\\n override\\n public\\n view\\n returns (\\n uint256 _CHAINID\\n )\\n {\\n return globalContext.ovmCHAINID;\\n }\\n\\n /*********************************\\n * Opcodes: L2 Execution Context *\\n *********************************/\\n\\n /**\\n * @notice Specifies from which source (Sequencer or Queue) this transaction originated from.\\n * @return _queueOrigin Enum indicating the ovmL1QUEUEORIGIN within the current message context.\\n */\\n function ovmL1QUEUEORIGIN()\\n override\\n public\\n view\\n returns (\\n Lib_OVMCodec.QueueOrigin _queueOrigin\\n )\\n {\\n return transactionContext.ovmL1QUEUEORIGIN;\\n }\\n\\n /**\\n * @notice Specifies which L1 account, if any, sent this transaction by calling enqueue().\\n * @return _l1TxOrigin Address of the account which sent the tx into L2 from L1.\\n */\\n function ovmL1TXORIGIN()\\n override\\n public\\n view\\n returns (\\n address _l1TxOrigin\\n )\\n {\\n return transactionContext.ovmL1TXORIGIN;\\n }\\n\\n /********************\\n * Opcodes: Halting *\\n ********************/\\n\\n /**\\n * @notice Overrides REVERT.\\n * @param _data Bytes data to pass along with the REVERT.\\n */\\n function ovmREVERT(\\n bytes memory _data\\n )\\n override\\n public\\n {\\n _revertWithFlag(RevertFlag.INTENTIONAL_REVERT, _data);\\n }\\n\\n\\n /******************************\\n * Opcodes: Contract Creation *\\n ******************************/\\n\\n /**\\n * @notice Overrides CREATE.\\n * @param _bytecode Code to be used to CREATE a new contract.\\n * @return Address of the created contract.\\n * @return Revert data, if and only if the creation threw an exception.\\n */\\n function ovmCREATE(\\n bytes memory _bytecode\\n )\\n override\\n public\\n notStatic\\n fixedGasDiscount(40000)\\n returns (\\n address,\\n bytes memory\\n )\\n {\\n // Creator is always the current ADDRESS.\\n address creator = ovmADDRESS();\\n\\n // Check that the deployer is whitelisted, or\\n // that arbitrary contract deployment has been enabled.\\n _checkDeployerAllowed(creator);\\n\\n // Generate the correct CREATE address.\\n address contractAddress = Lib_EthUtils.getAddressForCREATE(\\n creator,\\n _getAccountNonce(creator)\\n );\\n\\n return _createContract(\\n contractAddress,\\n _bytecode\\n );\\n }\\n\\n /**\\n * @notice Overrides CREATE2.\\n * @param _bytecode Code to be used to CREATE2 a new contract.\\n * @param _salt Value used to determine the contract's address.\\n * @return Address of the created contract.\\n * @return Revert data, if and only if the creation threw an exception.\\n */\\n function ovmCREATE2(\\n bytes memory _bytecode,\\n bytes32 _salt\\n )\\n override\\n public\\n notStatic\\n fixedGasDiscount(40000)\\n returns (\\n address,\\n bytes memory\\n )\\n {\\n // Creator is always the current ADDRESS.\\n address creator = ovmADDRESS();\\n\\n // Check that the deployer is whitelisted, or\\n // that arbitrary contract deployment has been enabled.\\n _checkDeployerAllowed(creator);\\n\\n // Generate the correct CREATE2 address.\\n address contractAddress = Lib_EthUtils.getAddressForCREATE2(\\n creator,\\n _bytecode,\\n _salt\\n );\\n\\n return _createContract(\\n contractAddress,\\n _bytecode\\n );\\n }\\n\\n\\n /*******************************\\n * Account Abstraction Opcodes *\\n ******************************/\\n\\n /**\\n * Retrieves the nonce of the current ovmADDRESS.\\n * @return _nonce Nonce of the current contract.\\n */\\n function ovmGETNONCE()\\n override\\n public\\n returns (\\n uint256 _nonce\\n )\\n {\\n return _getAccountNonce(ovmADDRESS());\\n }\\n\\n /**\\n * Bumps the nonce of the current ovmADDRESS by one.\\n */\\n function ovmINCREMENTNONCE()\\n override\\n public\\n notStatic\\n {\\n address account = ovmADDRESS();\\n uint256 nonce = _getAccountNonce(account);\\n\\n // Prevent overflow.\\n if (nonce + 1 > nonce) {\\n _setAccountNonce(account, nonce + 1);\\n }\\n }\\n\\n /**\\n * Creates a new EOA contract account, for account abstraction.\\n * @dev Essentially functions like ovmCREATE or ovmCREATE2, but we can bypass a lot of checks\\n * because the contract we're creating is trusted (no need to do safety checking or to\\n * handle unexpected reverts). Doesn't need to return an address because the address is\\n * assumed to be the user's actual address.\\n * @param _messageHash Hash of a message signed by some user, for verification.\\n * @param _v Signature `v` parameter.\\n * @param _r Signature `r` parameter.\\n * @param _s Signature `s` parameter.\\n */\\n function ovmCREATEEOA(\\n bytes32 _messageHash,\\n uint8 _v,\\n bytes32 _r,\\n bytes32 _s\\n )\\n override\\n public\\n notStatic\\n {\\n // Recover the EOA address from the message hash and signature parameters. Since we do the\\n // hashing in advance, we don't have handle different message hashing schemes. Even if this\\n // function were to return the wrong address (rather than explicitly returning the zero\\n // address), the rest of the transaction would simply fail (since there's no EOA account to\\n // actually execute the transaction).\\n address eoa = ecrecover(\\n _messageHash,\\n _v + 27,\\n _r,\\n _s\\n );\\n\\n // Invalid signature is a case we proactively handle with a revert. We could alternatively\\n // have this function return a `success` boolean, but this is just easier.\\n if (eoa == address(0)) {\\n ovmREVERT(bytes(\\\"Signature provided for EOA contract creation is invalid.\\\"));\\n }\\n\\n // If the user already has an EOA account, then there's no need to perform this operation.\\n if (_hasEmptyAccount(eoa) == false) {\\n return;\\n }\\n\\n // We always need to initialize the contract with the default account values.\\n _initPendingAccount(eoa);\\n\\n // Temporarily set the current address so it's easier to access on L2.\\n address prevADDRESS = messageContext.ovmADDRESS;\\n messageContext.ovmADDRESS = eoa;\\n\\n // Creates a duplicate of the OVM_ProxyEOA located at 0x42....09. Uses the following\\n // \\\"magic\\\" prefix to deploy an exact copy of the code:\\n // PUSH1 0x0D # size of this prefix in bytes\\n // CODESIZE\\n // SUB # subtract prefix size from codesize\\n // DUP1\\n // PUSH1 0x0D\\n // PUSH1 0x00\\n // CODECOPY # copy everything after prefix into memory at pos 0\\n // PUSH1 0x00\\n // RETURN # return the copied code\\n address proxyEOA = Lib_EthUtils.createContract(abi.encodePacked(\\n hex\\\"600D380380600D6000396000f3\\\",\\n ovmEXTCODECOPY(\\n 0x4200000000000000000000000000000000000009,\\n 0,\\n ovmEXTCODESIZE(0x4200000000000000000000000000000000000009)\\n )\\n ));\\n\\n // Reset the address now that we're done deploying.\\n messageContext.ovmADDRESS = prevADDRESS;\\n\\n // Commit the account with its final values.\\n _commitPendingAccount(\\n eoa,\\n address(proxyEOA),\\n keccak256(Lib_EthUtils.getCode(address(proxyEOA)))\\n );\\n\\n _setAccountNonce(eoa, 0);\\n }\\n\\n\\n /*********************************\\n * Opcodes: Contract Interaction *\\n *********************************/\\n\\n /**\\n * @notice Overrides CALL.\\n * @param _gasLimit Amount of gas to be passed into this call.\\n * @param _address Address of the contract to call.\\n * @param _calldata Data to send along with the call.\\n * @return _success Whether or not the call returned (rather than reverted).\\n * @return _returndata Data returned by the call.\\n */\\n function ovmCALL(\\n uint256 _gasLimit,\\n address _address,\\n bytes memory _calldata\\n )\\n override\\n public\\n fixedGasDiscount(100000)\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n // CALL updates the CALLER and ADDRESS.\\n MessageContext memory nextMessageContext = messageContext;\\n nextMessageContext.ovmCALLER = nextMessageContext.ovmADDRESS;\\n nextMessageContext.ovmADDRESS = _address;\\n\\n return _callContract(\\n nextMessageContext,\\n _gasLimit,\\n _address,\\n _calldata\\n );\\n }\\n\\n /**\\n * @notice Overrides STATICCALL.\\n * @param _gasLimit Amount of gas to be passed into this call.\\n * @param _address Address of the contract to call.\\n * @param _calldata Data to send along with the call.\\n * @return _success Whether or not the call returned (rather than reverted).\\n * @return _returndata Data returned by the call.\\n */\\n function ovmSTATICCALL(\\n uint256 _gasLimit,\\n address _address,\\n bytes memory _calldata\\n )\\n override\\n public\\n fixedGasDiscount(80000)\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n // STATICCALL updates the CALLER, updates the ADDRESS, and runs in a static context.\\n MessageContext memory nextMessageContext = messageContext;\\n nextMessageContext.ovmCALLER = nextMessageContext.ovmADDRESS;\\n nextMessageContext.ovmADDRESS = _address;\\n nextMessageContext.isStatic = true;\\n\\n return _callContract(\\n nextMessageContext,\\n _gasLimit,\\n _address,\\n _calldata\\n );\\n }\\n\\n /**\\n * @notice Overrides DELEGATECALL.\\n * @param _gasLimit Amount of gas to be passed into this call.\\n * @param _address Address of the contract to call.\\n * @param _calldata Data to send along with the call.\\n * @return _success Whether or not the call returned (rather than reverted).\\n * @return _returndata Data returned by the call.\\n */\\n function ovmDELEGATECALL(\\n uint256 _gasLimit,\\n address _address,\\n bytes memory _calldata\\n )\\n override\\n public\\n fixedGasDiscount(40000)\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n // DELEGATECALL does not change anything about the message context.\\n MessageContext memory nextMessageContext = messageContext;\\n\\n return _callContract(\\n nextMessageContext,\\n _gasLimit,\\n _address,\\n _calldata\\n );\\n }\\n\\n\\n /************************************\\n * Opcodes: Contract Storage Access *\\n ************************************/\\n\\n /**\\n * @notice Overrides SLOAD.\\n * @param _key 32 byte key of the storage slot to load.\\n * @return _value 32 byte value of the requested storage slot.\\n */\\n function ovmSLOAD(\\n bytes32 _key\\n )\\n override\\n public\\n netGasCost(40000)\\n returns (\\n bytes32 _value\\n )\\n {\\n // We always SLOAD from the storage of ADDRESS.\\n address contractAddress = ovmADDRESS();\\n\\n return _getContractStorage(\\n contractAddress,\\n _key\\n );\\n }\\n\\n /**\\n * @notice Overrides SSTORE.\\n * @param _key 32 byte key of the storage slot to set.\\n * @param _value 32 byte value for the storage slot.\\n */\\n function ovmSSTORE(\\n bytes32 _key,\\n bytes32 _value\\n )\\n override\\n public\\n notStatic\\n netGasCost(60000)\\n {\\n // We always SSTORE to the storage of ADDRESS.\\n address contractAddress = ovmADDRESS();\\n\\n _putContractStorage(\\n contractAddress,\\n _key,\\n _value\\n );\\n }\\n\\n\\n /*********************************\\n * Opcodes: Contract Code Access *\\n *********************************/\\n\\n /**\\n * @notice Overrides EXTCODECOPY.\\n * @param _contract Address of the contract to copy code from.\\n * @param _offset Offset in bytes from the start of contract code to copy beyond.\\n * @param _length Total number of bytes to copy from the contract's code.\\n * @return _code Bytes of code copied from the requested contract.\\n */\\n function ovmEXTCODECOPY(\\n address _contract,\\n uint256 _offset,\\n uint256 _length\\n )\\n override\\n public\\n returns (\\n bytes memory _code\\n )\\n {\\n return Lib_EthUtils.getCode(\\n _getAccountEthAddress(_contract),\\n _offset,\\n _length\\n );\\n }\\n\\n /**\\n * @notice Overrides EXTCODESIZE.\\n * @param _contract Address of the contract to query the size of.\\n * @return _EXTCODESIZE Size of the requested contract in bytes.\\n */\\n function ovmEXTCODESIZE(\\n address _contract\\n )\\n override\\n public\\n returns (\\n uint256 _EXTCODESIZE\\n )\\n {\\n return Lib_EthUtils.getCodeSize(\\n _getAccountEthAddress(_contract)\\n );\\n }\\n\\n /**\\n * @notice Overrides EXTCODEHASH.\\n * @param _contract Address of the contract to query the hash of.\\n * @return _EXTCODEHASH Hash of the requested contract.\\n */\\n function ovmEXTCODEHASH(\\n address _contract\\n )\\n override\\n public\\n returns (\\n bytes32 _EXTCODEHASH\\n )\\n {\\n return Lib_EthUtils.getCodeHash(\\n _getAccountEthAddress(_contract)\\n );\\n }\\n\\n /***************************************\\n * Public Functions: Execution Context *\\n ***************************************/\\n\\n function getMaxTransactionGasLimit()\\n external\\n view\\n override\\n returns (\\n uint256 _maxTransactionGasLimit\\n )\\n {\\n return gasMeterConfig.maxTransactionGasLimit;\\n }\\n\\n /********************************************\\n * Public Functions: Deployment Whitelisting *\\n ********************************************/\\n\\n /**\\n * Checks whether the given address is on the whitelist to ovmCREATE/ovmCREATE2, and reverts if not.\\n * @param _deployerAddress Address attempting to deploy a contract.\\n */\\n function _checkDeployerAllowed(\\n address _deployerAddress\\n )\\n internal\\n {\\n // From an OVM semantics perspective, this will appear identical to\\n // the deployer ovmCALLing the whitelist. This is fine--in a sense, we are forcing them to.\\n (bool success, bytes memory data) = ovmCALL(\\n gasleft(),\\n 0x4200000000000000000000000000000000000002,\\n abi.encodeWithSignature(\\\"isDeployerAllowed(address)\\\", _deployerAddress)\\n );\\n bool isAllowed = abi.decode(data, (bool));\\n\\n if (!isAllowed || !success) {\\n _revertWithFlag(RevertFlag.CREATOR_NOT_ALLOWED);\\n }\\n }\\n\\n /********************************************\\n * Internal Functions: Contract Interaction *\\n ********************************************/\\n\\n /**\\n * Creates a new contract and associates it with some contract address.\\n * @param _contractAddress Address to associate the created contract with.\\n * @param _bytecode Bytecode to be used to create the contract.\\n * @return Final OVM contract address.\\n * @return Revertdata, if and only if the creation threw an exception.\\n */\\n function _createContract(\\n address _contractAddress,\\n bytes memory _bytecode\\n )\\n internal\\n returns (\\n address,\\n bytes memory\\n )\\n {\\n // We always update the nonce of the creating account, even if the creation fails.\\n _setAccountNonce(ovmADDRESS(), _getAccountNonce(ovmADDRESS()) + 1);\\n\\n // We're stepping into a CREATE or CREATE2, so we need to update ADDRESS to point\\n // to the contract's associated address and CALLER to point to the previous ADDRESS.\\n MessageContext memory nextMessageContext = messageContext;\\n nextMessageContext.ovmCALLER = messageContext.ovmADDRESS;\\n nextMessageContext.ovmADDRESS = _contractAddress;\\n\\n // Run the common logic which occurs between call-type and create-type messages,\\n // passing in the creation bytecode and `true` to trigger create-specific logic.\\n (bool success, bytes memory data) = _handleExternalMessage(\\n nextMessageContext,\\n gasleft(),\\n _contractAddress,\\n _bytecode,\\n true\\n );\\n\\n // Yellow paper requires that address returned is zero if the contract deployment fails.\\n return (\\n success ? _contractAddress : address(0),\\n data\\n );\\n }\\n\\n /**\\n * Calls the deployed contract associated with a given address.\\n * @param _nextMessageContext Message context to be used for the call.\\n * @param _gasLimit Amount of gas to be passed into this call.\\n * @param _contract OVM address to be called.\\n * @param _calldata Data to send along with the call.\\n * @return _success Whether or not the call returned (rather than reverted).\\n * @return _returndata Data returned by the call.\\n */\\n function _callContract(\\n MessageContext memory _nextMessageContext,\\n uint256 _gasLimit,\\n address _contract,\\n bytes memory _calldata\\n )\\n internal\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n // We reserve addresses of the form 0xdeaddeaddead...NNNN for the container contracts in L2 geth.\\n // So, we block calls to these addresses since they are not safe to run as an OVM contract itself.\\n if (\\n (uint256(_contract) & uint256(0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000))\\n == uint256(0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000)\\n ) {\\n // EVM does not return data in the success case, see: https://github.com/ethereum/go-ethereum/blob/aae7660410f0ef90279e14afaaf2f429fdc2a186/core/vm/instructions.go#L600-L604\\n return (true, hex'');\\n }\\n\\n // Both 0x0000... and the EVM precompiles have the same address on L1 and L2 --> no trie lookup needed.\\n address codeContractAddress =\\n uint(_contract) < 100\\n ? _contract\\n : _getAccountEthAddress(_contract);\\n\\n return _handleExternalMessage(\\n _nextMessageContext,\\n _gasLimit,\\n codeContractAddress,\\n _calldata,\\n false\\n );\\n }\\n\\n /**\\n * Handles all interactions which involve the execution manager calling out to untrusted code (both calls and creates).\\n * Ensures that OVM-related measures are enforced, including L2 gas refunds, nuisance gas, and flagged reversions.\\n *\\n * @param _nextMessageContext Message context to be used for the external message.\\n * @param _gasLimit Amount of gas to be passed into this message.\\n * @param _contract OVM address being called or deployed to\\n * @param _data Data for the message (either calldata or creation code)\\n * @param _isCreate Whether this is a create-type message.\\n * @return Whether or not the message (either a call or deployment) succeeded.\\n * @return Data returned by the message.\\n */\\n function _handleExternalMessage(\\n MessageContext memory _nextMessageContext,\\n uint256 _gasLimit,\\n address _contract,\\n bytes memory _data,\\n bool _isCreate\\n )\\n internal\\n returns (\\n bool,\\n bytes memory\\n )\\n {\\n // We need to switch over to our next message context for the duration of this call.\\n MessageContext memory prevMessageContext = messageContext;\\n _switchMessageContext(prevMessageContext, _nextMessageContext);\\n\\n // Nuisance gas is a system used to bound the ability for an attacker to make fraud proofs\\n // expensive by touching a lot of different accounts or storage slots. Since most contracts\\n // only use a few storage slots during any given transaction, this shouldn't be a limiting\\n // factor.\\n uint256 prevNuisanceGasLeft = messageRecord.nuisanceGasLeft;\\n uint256 nuisanceGasLimit = _getNuisanceGasLimit(_gasLimit);\\n messageRecord.nuisanceGasLeft = nuisanceGasLimit;\\n\\n // Make the call and make sure to pass in the gas limit. Another instance of hidden\\n // complexity. `_contract` is guaranteed to be a safe contract, meaning its return/revert\\n // behavior can be controlled. In particular, we enforce that flags are passed through\\n // revert data as to retrieve execution metadata that would normally be reverted out of\\n // existence.\\n\\n bool success;\\n bytes memory returndata;\\n if (_isCreate) {\\n // safeCREATE() is a function which replicates a CREATE message, but uses return values\\n // Which match that of CALL (i.e. bool, bytes). This allows many security checks to be\\n // to be shared between untrusted call and create call frames.\\n (success, returndata) = address(this).call(\\n abi.encodeWithSelector(\\n this.safeCREATE.selector,\\n _gasLimit,\\n _data,\\n _contract\\n )\\n );\\n } else {\\n (success, returndata) = _contract.call{gas: _gasLimit}(_data);\\n }\\n\\n // Switch back to the original message context now that we're out of the call.\\n _switchMessageContext(_nextMessageContext, prevMessageContext);\\n\\n // Assuming there were no reverts, the message record should be accurate here. We'll update\\n // this value in the case of a revert.\\n uint256 nuisanceGasLeft = messageRecord.nuisanceGasLeft;\\n\\n // Reverts at this point are completely OK, but we need to make a few updates based on the\\n // information passed through the revert.\\n if (success == false) {\\n (\\n RevertFlag flag,\\n uint256 nuisanceGasLeftPostRevert,\\n uint256 ovmGasRefund,\\n bytes memory returndataFromFlag\\n ) = _decodeRevertData(returndata);\\n\\n // INVALID_STATE_ACCESS is the only flag that triggers an immediate abort of the\\n // parent EVM message. This behavior is necessary because INVALID_STATE_ACCESS must\\n // halt any further transaction execution that could impact the execution result.\\n if (flag == RevertFlag.INVALID_STATE_ACCESS) {\\n _revertWithFlag(flag);\\n }\\n\\n // INTENTIONAL_REVERT, UNSAFE_BYTECODE, STATIC_VIOLATION, and CREATOR_NOT_ALLOWED aren't\\n // dependent on the input state, so we can just handle them like standard reverts. Our only change here\\n // is to record the gas refund reported by the call (enforced by safety checking).\\n if (\\n flag == RevertFlag.INTENTIONAL_REVERT\\n || flag == RevertFlag.UNSAFE_BYTECODE\\n || flag == RevertFlag.STATIC_VIOLATION\\n || flag == RevertFlag.CREATOR_NOT_ALLOWED\\n ) {\\n transactionRecord.ovmGasRefund = ovmGasRefund;\\n }\\n\\n // INTENTIONAL_REVERT needs to pass up the user-provided return data encoded into the\\n // flag, *not* the full encoded flag. All other revert types return no data.\\n if (\\n flag == RevertFlag.INTENTIONAL_REVERT\\n || _isCreate\\n ) {\\n returndata = returndataFromFlag;\\n } else {\\n returndata = hex'';\\n }\\n\\n // Reverts mean we need to use up whatever \\\"nuisance gas\\\" was used by the call.\\n // EXCEEDS_NUISANCE_GAS explicitly reduces the remaining nuisance gas for this message\\n // to zero. OUT_OF_GAS is a \\\"pseudo\\\" flag given that messages return no data when they\\n // run out of gas, so we have to treat this like EXCEEDS_NUISANCE_GAS. All other flags\\n // will simply pass up the remaining nuisance gas.\\n nuisanceGasLeft = nuisanceGasLeftPostRevert;\\n }\\n\\n // We need to reset the nuisance gas back to its original value minus the amount used here.\\n messageRecord.nuisanceGasLeft = prevNuisanceGasLeft - (nuisanceGasLimit - nuisanceGasLeft);\\n\\n return (\\n success,\\n returndata\\n );\\n }\\n\\n /**\\n * Handles the creation-specific safety measures required for OVM contract deployment.\\n * This function sanitizes the return types for creation messages to match calls (bool, bytes),\\n * by being an external function which the EM can call, that mimics the success/fail case of the CREATE.\\n * This allows for consistent handling of both types of messages in _handleExternalMessage().\\n * Having this step occur as a separate call frame also allows us to easily revert the\\n * contract deployment in the event that the code is unsafe.\\n *\\n * @param _gasLimit Amount of gas to be passed into this creation.\\n * @param _creationCode Code to pass into CREATE for deployment.\\n * @param _address OVM address being deployed to.\\n */\\n function safeCREATE(\\n uint _gasLimit,\\n bytes memory _creationCode,\\n address _address\\n )\\n external\\n {\\n // The only way this should callable is from within _createContract(),\\n // and it should DEFINITELY not be callable by a non-EM code contract.\\n if (msg.sender != address(this)) {\\n return;\\n }\\n // Check that there is not already code at this address.\\n if (_hasEmptyAccount(_address) == false) {\\n // Note: in the EVM, this case burns all allotted gas. For improved\\n // developer experience, we do return the remaining gas.\\n _revertWithFlag(\\n RevertFlag.CREATE_COLLISION,\\n Lib_ErrorUtils.encodeRevertString(\\\"A contract has already been deployed to this address\\\")\\n );\\n }\\n\\n // Check the creation bytecode against the OVM_SafetyChecker.\\n if (ovmSafetyChecker.isBytecodeSafe(_creationCode) == false) {\\n _revertWithFlag(\\n RevertFlag.UNSAFE_BYTECODE,\\n Lib_ErrorUtils.encodeRevertString(\\\"Contract creation code contains unsafe opcodes. Did you use the right compiler or pass an unsafe constructor argument?\\\")\\n );\\n }\\n\\n // We always need to initialize the contract with the default account values.\\n _initPendingAccount(_address);\\n\\n // Actually execute the EVM create message.\\n // NOTE: The inline assembly below means we can NOT make any evm calls between here and then.\\n address ethAddress = Lib_EthUtils.createContract(_creationCode);\\n\\n if (ethAddress == address(0)) {\\n // If the creation fails, the EVM lets us grab its revert data. This may contain a revert flag\\n // to be used above in _handleExternalMessage, so we pass the revert data back up unmodified.\\n assembly {\\n returndatacopy(0,0,returndatasize())\\n revert(0, returndatasize())\\n }\\n }\\n\\n // Again simply checking that the deployed code is safe too. Contracts can generate\\n // arbitrary deployment code, so there's no easy way to analyze this beforehand.\\n bytes memory deployedCode = Lib_EthUtils.getCode(ethAddress);\\n if (ovmSafetyChecker.isBytecodeSafe(deployedCode) == false) {\\n _revertWithFlag(\\n RevertFlag.UNSAFE_BYTECODE,\\n Lib_ErrorUtils.encodeRevertString(\\\"Constructor attempted to deploy unsafe bytecode.\\\")\\n );\\n }\\n\\n // Contract creation didn't need to be reverted and the bytecode is safe. We finish up by\\n // associating the desired address with the newly created contract's code hash and address.\\n _commitPendingAccount(\\n _address,\\n ethAddress,\\n Lib_EthUtils.getCodeHash(ethAddress)\\n );\\n }\\n\\n /******************************************\\n * Internal Functions: State Manipulation *\\n ******************************************/\\n\\n /**\\n * Checks whether an account exists within the OVM_StateManager.\\n * @param _address Address of the account to check.\\n * @return _exists Whether or not the account exists.\\n */\\n function _hasAccount(\\n address _address\\n )\\n internal\\n returns (\\n bool _exists\\n )\\n {\\n _checkAccountLoad(_address);\\n return ovmStateManager.hasAccount(_address);\\n }\\n\\n /**\\n * Checks whether a known empty account exists within the OVM_StateManager.\\n * @param _address Address of the account to check.\\n * @return _exists Whether or not the account empty exists.\\n */\\n function _hasEmptyAccount(\\n address _address\\n )\\n internal\\n returns (\\n bool _exists\\n )\\n {\\n _checkAccountLoad(_address);\\n return ovmStateManager.hasEmptyAccount(_address);\\n }\\n\\n /**\\n * Sets the nonce of an account.\\n * @param _address Address of the account to modify.\\n * @param _nonce New account nonce.\\n */\\n function _setAccountNonce(\\n address _address,\\n uint256 _nonce\\n )\\n internal\\n {\\n _checkAccountChange(_address);\\n ovmStateManager.setAccountNonce(_address, _nonce);\\n }\\n\\n /**\\n * Gets the nonce of an account.\\n * @param _address Address of the account to access.\\n * @return _nonce Nonce of the account.\\n */\\n function _getAccountNonce(\\n address _address\\n )\\n internal\\n returns (\\n uint256 _nonce\\n )\\n {\\n _checkAccountLoad(_address);\\n return ovmStateManager.getAccountNonce(_address);\\n }\\n\\n /**\\n * Retrieves the Ethereum address of an account.\\n * @param _address Address of the account to access.\\n * @return _ethAddress Corresponding Ethereum address.\\n */\\n function _getAccountEthAddress(\\n address _address\\n )\\n internal\\n returns (\\n address _ethAddress\\n )\\n {\\n _checkAccountLoad(_address);\\n return ovmStateManager.getAccountEthAddress(_address);\\n }\\n\\n /**\\n * Creates the default account object for the given address.\\n * @param _address Address of the account create.\\n */\\n function _initPendingAccount(\\n address _address\\n )\\n internal\\n {\\n // Although it seems like `_checkAccountChange` would be more appropriate here, we don't\\n // actually consider an account \\\"changed\\\" until it's inserted into the state (in this case\\n // by `_commitPendingAccount`).\\n _checkAccountLoad(_address);\\n ovmStateManager.initPendingAccount(_address);\\n }\\n\\n /**\\n * Stores additional relevant data for a new account, thereby \\\"committing\\\" it to the state.\\n * This function is only called during `ovmCREATE` and `ovmCREATE2` after a successful contract\\n * creation.\\n * @param _address Address of the account to commit.\\n * @param _ethAddress Address of the associated deployed contract.\\n * @param _codeHash Hash of the code stored at the address.\\n */\\n function _commitPendingAccount(\\n address _address,\\n address _ethAddress,\\n bytes32 _codeHash\\n )\\n internal\\n {\\n _checkAccountChange(_address);\\n ovmStateManager.commitPendingAccount(\\n _address,\\n _ethAddress,\\n _codeHash\\n );\\n }\\n\\n /**\\n * Retrieves the value of a storage slot.\\n * @param _contract Address of the contract to query.\\n * @param _key 32 byte key of the storage slot.\\n * @return _value 32 byte storage slot value.\\n */\\n function _getContractStorage(\\n address _contract,\\n bytes32 _key\\n )\\n internal\\n returns (\\n bytes32 _value\\n )\\n {\\n _checkContractStorageLoad(_contract, _key);\\n return ovmStateManager.getContractStorage(_contract, _key);\\n }\\n\\n /**\\n * Sets the value of a storage slot.\\n * @param _contract Address of the contract to modify.\\n * @param _key 32 byte key of the storage slot.\\n * @param _value 32 byte storage slot value.\\n */\\n function _putContractStorage(\\n address _contract,\\n bytes32 _key,\\n bytes32 _value\\n )\\n internal\\n {\\n // We don't set storage if the value didn't change. Although this acts as a convenient\\n // optimization, it's also necessary to avoid the case in which a contract with no storage\\n // attempts to store the value \\\"0\\\" at any key. Putting this value (and therefore requiring\\n // that the value be committed into the storage trie after execution) would incorrectly\\n // modify the storage root.\\n if (_getContractStorage(_contract, _key) == _value) {\\n return;\\n }\\n\\n _checkContractStorageChange(_contract, _key);\\n ovmStateManager.putContractStorage(_contract, _key, _value);\\n }\\n\\n /**\\n * Validation whenever a contract needs to be loaded. Checks that the account exists, charges\\n * nuisance gas if the account hasn't been loaded before.\\n * @param _address Address of the account to load.\\n */\\n function _checkAccountLoad(\\n address _address\\n )\\n internal\\n {\\n // See `_checkContractStorageLoad` for more information.\\n if (gasleft() < MIN_GAS_FOR_INVALID_STATE_ACCESS) {\\n _revertWithFlag(RevertFlag.OUT_OF_GAS);\\n }\\n\\n // See `_checkContractStorageLoad` for more information.\\n if (ovmStateManager.hasAccount(_address) == false) {\\n _revertWithFlag(RevertFlag.INVALID_STATE_ACCESS);\\n }\\n\\n // Check whether the account has been loaded before and mark it as loaded if not. We need\\n // this because \\\"nuisance gas\\\" only applies to the first time that an account is loaded.\\n (\\n bool _wasAccountAlreadyLoaded\\n ) = ovmStateManager.testAndSetAccountLoaded(_address);\\n\\n // If we hadn't already loaded the account, then we'll need to charge \\\"nuisance gas\\\" based\\n // on the size of the contract code.\\n if (_wasAccountAlreadyLoaded == false) {\\n _useNuisanceGas(\\n (Lib_EthUtils.getCodeSize(_getAccountEthAddress(_address)) * NUISANCE_GAS_PER_CONTRACT_BYTE) + MIN_NUISANCE_GAS_PER_CONTRACT\\n );\\n }\\n }\\n\\n /**\\n * Validation whenever a contract needs to be changed. Checks that the account exists, charges\\n * nuisance gas if the account hasn't been changed before.\\n * @param _address Address of the account to change.\\n */\\n function _checkAccountChange(\\n address _address\\n )\\n internal\\n {\\n // Start by checking for a load as we only want to charge nuisance gas proportional to\\n // contract size once.\\n _checkAccountLoad(_address);\\n\\n // Check whether the account has been changed before and mark it as changed if not. We need\\n // this because \\\"nuisance gas\\\" only applies to the first time that an account is changed.\\n (\\n bool _wasAccountAlreadyChanged\\n ) = ovmStateManager.testAndSetAccountChanged(_address);\\n\\n // If we hadn't already loaded the account, then we'll need to charge \\\"nuisance gas\\\" based\\n // on the size of the contract code.\\n if (_wasAccountAlreadyChanged == false) {\\n ovmStateManager.incrementTotalUncommittedAccounts();\\n _useNuisanceGas(\\n (Lib_EthUtils.getCodeSize(_getAccountEthAddress(_address)) * NUISANCE_GAS_PER_CONTRACT_BYTE) + MIN_NUISANCE_GAS_PER_CONTRACT\\n );\\n }\\n }\\n\\n /**\\n * Validation whenever a slot needs to be loaded. Checks that the account exists, charges\\n * nuisance gas if the slot hasn't been loaded before.\\n * @param _contract Address of the account to load from.\\n * @param _key 32 byte key to load.\\n */\\n function _checkContractStorageLoad(\\n address _contract,\\n bytes32 _key\\n )\\n internal\\n {\\n // Another case of hidden complexity. If we didn't enforce this requirement, then a\\n // contract could pass in just enough gas to cause the INVALID_STATE_ACCESS check to fail\\n // on L1 but not on L2. A contract could use this behavior to prevent the\\n // OVM_ExecutionManager from detecting an invalid state access. Reverting with OUT_OF_GAS\\n // allows us to also charge for the full message nuisance gas, because you deserve that for\\n // trying to break the contract in this way.\\n if (gasleft() < MIN_GAS_FOR_INVALID_STATE_ACCESS) {\\n _revertWithFlag(RevertFlag.OUT_OF_GAS);\\n }\\n\\n // We need to make sure that the transaction isn't trying to access storage that hasn't\\n // been provided to the OVM_StateManager. We'll immediately abort if this is the case.\\n // We know that we have enough gas to do this check because of the above test.\\n if (ovmStateManager.hasContractStorage(_contract, _key) == false) {\\n _revertWithFlag(RevertFlag.INVALID_STATE_ACCESS);\\n }\\n\\n // Check whether the slot has been loaded before and mark it as loaded if not. We need\\n // this because \\\"nuisance gas\\\" only applies to the first time that a slot is loaded.\\n (\\n bool _wasContractStorageAlreadyLoaded\\n ) = ovmStateManager.testAndSetContractStorageLoaded(_contract, _key);\\n\\n // If we hadn't already loaded the account, then we'll need to charge some fixed amount of\\n // \\\"nuisance gas\\\".\\n if (_wasContractStorageAlreadyLoaded == false) {\\n _useNuisanceGas(NUISANCE_GAS_SLOAD);\\n }\\n }\\n\\n /**\\n * Validation whenever a slot needs to be changed. Checks that the account exists, charges\\n * nuisance gas if the slot hasn't been changed before.\\n * @param _contract Address of the account to change.\\n * @param _key 32 byte key to change.\\n */\\n function _checkContractStorageChange(\\n address _contract,\\n bytes32 _key\\n )\\n internal\\n {\\n // Start by checking for load to make sure we have the storage slot and that we charge the\\n // \\\"nuisance gas\\\" necessary to prove the storage slot state.\\n _checkContractStorageLoad(_contract, _key);\\n\\n // Check whether the slot has been changed before and mark it as changed if not. We need\\n // this because \\\"nuisance gas\\\" only applies to the first time that a slot is changed.\\n (\\n bool _wasContractStorageAlreadyChanged\\n ) = ovmStateManager.testAndSetContractStorageChanged(_contract, _key);\\n\\n // If we hadn't already changed the account, then we'll need to charge some fixed amount of\\n // \\\"nuisance gas\\\".\\n if (_wasContractStorageAlreadyChanged == false) {\\n // Changing a storage slot means that we're also going to have to change the\\n // corresponding account, so do an account change check.\\n _checkAccountChange(_contract);\\n\\n ovmStateManager.incrementTotalUncommittedContractStorage();\\n _useNuisanceGas(NUISANCE_GAS_SSTORE);\\n }\\n }\\n\\n\\n /************************************\\n * Internal Functions: Revert Logic *\\n ************************************/\\n\\n /**\\n * Simple encoding for revert data.\\n * @param _flag Flag to revert with.\\n * @param _data Additional user-provided revert data.\\n * @return _revertdata Encoded revert data.\\n */\\n function _encodeRevertData(\\n RevertFlag _flag,\\n bytes memory _data\\n )\\n internal\\n view\\n returns (\\n bytes memory _revertdata\\n )\\n {\\n // Out of gas and create exceptions will fundamentally return no data, so simulating it shouldn't either.\\n if (\\n _flag == RevertFlag.OUT_OF_GAS\\n ) {\\n return bytes('');\\n }\\n\\n // INVALID_STATE_ACCESS doesn't need to return any data other than the flag.\\n if (_flag == RevertFlag.INVALID_STATE_ACCESS) {\\n return abi.encode(\\n _flag,\\n 0,\\n 0,\\n bytes('')\\n );\\n }\\n\\n // Just ABI encode the rest of the parameters.\\n return abi.encode(\\n _flag,\\n messageRecord.nuisanceGasLeft,\\n transactionRecord.ovmGasRefund,\\n _data\\n );\\n }\\n\\n /**\\n * Simple decoding for revert data.\\n * @param _revertdata Revert data to decode.\\n * @return _flag Flag used to revert.\\n * @return _nuisanceGasLeft Amount of nuisance gas unused by the message.\\n * @return _ovmGasRefund Amount of gas refunded during the message.\\n * @return _data Additional user-provided revert data.\\n */\\n function _decodeRevertData(\\n bytes memory _revertdata\\n )\\n internal\\n pure\\n returns (\\n RevertFlag _flag,\\n uint256 _nuisanceGasLeft,\\n uint256 _ovmGasRefund,\\n bytes memory _data\\n )\\n {\\n // A length of zero means the call ran out of gas, just return empty data.\\n if (_revertdata.length == 0) {\\n return (\\n RevertFlag.OUT_OF_GAS,\\n 0,\\n 0,\\n bytes('')\\n );\\n }\\n\\n // ABI decode the incoming data.\\n return abi.decode(_revertdata, (RevertFlag, uint256, uint256, bytes));\\n }\\n\\n /**\\n * Causes a message to revert or abort.\\n * @param _flag Flag to revert with.\\n * @param _data Additional user-provided data.\\n */\\n function _revertWithFlag(\\n RevertFlag _flag,\\n bytes memory _data\\n )\\n internal\\n view\\n {\\n bytes memory revertdata = _encodeRevertData(\\n _flag,\\n _data\\n );\\n\\n assembly {\\n revert(add(revertdata, 0x20), mload(revertdata))\\n }\\n }\\n\\n /**\\n * Causes a message to revert or abort.\\n * @param _flag Flag to revert with.\\n */\\n function _revertWithFlag(\\n RevertFlag _flag\\n )\\n internal\\n {\\n _revertWithFlag(_flag, bytes(''));\\n }\\n\\n\\n /******************************************\\n * Internal Functions: Nuisance Gas Logic *\\n ******************************************/\\n\\n /**\\n * Computes the nuisance gas limit from the gas limit.\\n * @dev This function is currently using a naive implementation whereby the nuisance gas limit\\n * is set to exactly equal the lesser of the gas limit or remaining gas. It's likely that\\n * this implementation is perfectly fine, but we may change this formula later.\\n * @param _gasLimit Gas limit to compute from.\\n * @return _nuisanceGasLimit Computed nuisance gas limit.\\n */\\n function _getNuisanceGasLimit(\\n uint256 _gasLimit\\n )\\n internal\\n view\\n returns (\\n uint256 _nuisanceGasLimit\\n )\\n {\\n return _gasLimit < gasleft() ? _gasLimit : gasleft();\\n }\\n\\n /**\\n * Uses a certain amount of nuisance gas.\\n * @param _amount Amount of nuisance gas to use.\\n */\\n function _useNuisanceGas(\\n uint256 _amount\\n )\\n internal\\n {\\n // Essentially the same as a standard OUT_OF_GAS, except we also retain a record of the gas\\n // refund to be given at the end of the transaction.\\n if (messageRecord.nuisanceGasLeft < _amount) {\\n _revertWithFlag(RevertFlag.EXCEEDS_NUISANCE_GAS);\\n }\\n\\n messageRecord.nuisanceGasLeft -= _amount;\\n }\\n\\n\\n /************************************\\n * Internal Functions: Gas Metering *\\n ************************************/\\n\\n /**\\n * Checks whether a transaction needs to start a new epoch and does so if necessary.\\n * @param _timestamp Transaction timestamp.\\n */\\n function _checkNeedsNewEpoch(\\n uint256 _timestamp\\n )\\n internal\\n {\\n if (\\n _timestamp >= (\\n _getGasMetadata(GasMetadataKey.CURRENT_EPOCH_START_TIMESTAMP)\\n + gasMeterConfig.secondsPerEpoch\\n )\\n ) {\\n _putGasMetadata(\\n GasMetadataKey.CURRENT_EPOCH_START_TIMESTAMP,\\n _timestamp\\n );\\n\\n _putGasMetadata(\\n GasMetadataKey.PREV_EPOCH_SEQUENCER_QUEUE_GAS,\\n _getGasMetadata(\\n GasMetadataKey.CUMULATIVE_SEQUENCER_QUEUE_GAS\\n )\\n );\\n\\n _putGasMetadata(\\n GasMetadataKey.PREV_EPOCH_L1TOL2_QUEUE_GAS,\\n _getGasMetadata(\\n GasMetadataKey.CUMULATIVE_L1TOL2_QUEUE_GAS\\n )\\n );\\n }\\n }\\n\\n /**\\n * Validates the input values of a transaction.\\n * @return _valid Whether or not the transaction data is valid.\\n */\\n function _isValidInput(\\n Lib_OVMCodec.Transaction memory _transaction\\n )\\n view\\n internal\\n returns (\\n bool\\n )\\n {\\n // Prevent reentrancy to run():\\n // This check prevents calling run with the default ovmNumber.\\n // Combined with the first check in run():\\n // if (transactionContext.ovmNUMBER != DEFAULT_UINT256) { return; }\\n // It should be impossible to re-enter since run() returns before any other call frames are created.\\n // Since this value is already being written to storage, we save much gas compared to\\n // using the standard nonReentrant pattern.\\n if (_transaction.blockNumber == DEFAULT_UINT256) {\\n return false;\\n }\\n\\n if (_isValidGasLimit(_transaction.gasLimit, _transaction.l1QueueOrigin) == false) {\\n return false;\\n }\\n\\n return true;\\n }\\n\\n /**\\n * Validates the gas limit for a given transaction.\\n * @param _gasLimit Gas limit provided by the transaction.\\n * param _queueOrigin Queue from which the transaction originated.\\n * @return _valid Whether or not the gas limit is valid.\\n */\\n function _isValidGasLimit(\\n uint256 _gasLimit,\\n Lib_OVMCodec.QueueOrigin // _queueOrigin\\n )\\n view\\n internal\\n returns (\\n bool _valid\\n )\\n {\\n // Always have to be below the maximum gas limit.\\n if (_gasLimit > gasMeterConfig.maxTransactionGasLimit) {\\n return false;\\n }\\n\\n // Always have to be above the minimum gas limit.\\n if (_gasLimit < gasMeterConfig.minTransactionGasLimit) {\\n return false;\\n }\\n\\n // TEMPORARY: Gas metering is disabled for minnet.\\n return true;\\n // GasMetadataKey cumulativeGasKey;\\n // GasMetadataKey prevEpochGasKey;\\n // if (_queueOrigin == Lib_OVMCodec.QueueOrigin.SEQUENCER_QUEUE) {\\n // cumulativeGasKey = GasMetadataKey.CUMULATIVE_SEQUENCER_QUEUE_GAS;\\n // prevEpochGasKey = GasMetadataKey.PREV_EPOCH_SEQUENCER_QUEUE_GAS;\\n // } else {\\n // cumulativeGasKey = GasMetadataKey.CUMULATIVE_L1TOL2_QUEUE_GAS;\\n // prevEpochGasKey = GasMetadataKey.PREV_EPOCH_L1TOL2_QUEUE_GAS;\\n // }\\n\\n // return (\\n // (\\n // _getGasMetadata(cumulativeGasKey)\\n // - _getGasMetadata(prevEpochGasKey)\\n // + _gasLimit\\n // ) < gasMeterConfig.maxGasPerQueuePerEpoch\\n // );\\n }\\n\\n /**\\n * Updates the cumulative gas after a transaction.\\n * @param _gasUsed Gas used by the transaction.\\n * @param _queueOrigin Queue from which the transaction originated.\\n */\\n function _updateCumulativeGas(\\n uint256 _gasUsed,\\n Lib_OVMCodec.QueueOrigin _queueOrigin\\n )\\n internal\\n {\\n GasMetadataKey cumulativeGasKey;\\n if (_queueOrigin == Lib_OVMCodec.QueueOrigin.SEQUENCER_QUEUE) {\\n cumulativeGasKey = GasMetadataKey.CUMULATIVE_SEQUENCER_QUEUE_GAS;\\n } else {\\n cumulativeGasKey = GasMetadataKey.CUMULATIVE_L1TOL2_QUEUE_GAS;\\n }\\n\\n _putGasMetadata(\\n cumulativeGasKey,\\n (\\n _getGasMetadata(cumulativeGasKey)\\n + gasMeterConfig.minTransactionGasLimit\\n + _gasUsed\\n - transactionRecord.ovmGasRefund\\n )\\n );\\n }\\n\\n /**\\n * Retrieves the value of a gas metadata key.\\n * @param _key Gas metadata key to retrieve.\\n * @return _value Value stored at the given key.\\n */\\n function _getGasMetadata(\\n GasMetadataKey _key\\n )\\n internal\\n returns (\\n uint256 _value\\n )\\n {\\n return uint256(_getContractStorage(\\n GAS_METADATA_ADDRESS,\\n bytes32(uint256(_key))\\n ));\\n }\\n\\n /**\\n * Sets the value of a gas metadata key.\\n * @param _key Gas metadata key to set.\\n * @param _value Value to store at the given key.\\n */\\n function _putGasMetadata(\\n GasMetadataKey _key,\\n uint256 _value\\n )\\n internal\\n {\\n _putContractStorage(\\n GAS_METADATA_ADDRESS,\\n bytes32(uint256(_key)),\\n bytes32(uint256(_value))\\n );\\n }\\n\\n\\n /*****************************************\\n * Internal Functions: Execution Context *\\n *****************************************/\\n\\n /**\\n * Swaps over to a new message context.\\n * @param _prevMessageContext Context we're switching from.\\n * @param _nextMessageContext Context we're switching to.\\n */\\n function _switchMessageContext(\\n MessageContext memory _prevMessageContext,\\n MessageContext memory _nextMessageContext\\n )\\n internal\\n {\\n // Avoid unnecessary the SSTORE.\\n if (_prevMessageContext.ovmCALLER != _nextMessageContext.ovmCALLER) {\\n messageContext.ovmCALLER = _nextMessageContext.ovmCALLER;\\n }\\n\\n // Avoid unnecessary the SSTORE.\\n if (_prevMessageContext.ovmADDRESS != _nextMessageContext.ovmADDRESS) {\\n messageContext.ovmADDRESS = _nextMessageContext.ovmADDRESS;\\n }\\n\\n // Avoid unnecessary the SSTORE.\\n if (_prevMessageContext.isStatic != _nextMessageContext.isStatic) {\\n messageContext.isStatic = _nextMessageContext.isStatic;\\n }\\n }\\n\\n /**\\n * Initializes the execution context.\\n * @param _transaction OVM transaction being executed.\\n */\\n function _initContext(\\n Lib_OVMCodec.Transaction memory _transaction\\n )\\n internal\\n {\\n transactionContext.ovmTIMESTAMP = _transaction.timestamp;\\n transactionContext.ovmNUMBER = _transaction.blockNumber;\\n transactionContext.ovmTXGASLIMIT = _transaction.gasLimit;\\n transactionContext.ovmL1QUEUEORIGIN = _transaction.l1QueueOrigin;\\n transactionContext.ovmL1TXORIGIN = _transaction.l1TxOrigin;\\n transactionContext.ovmGASLIMIT = gasMeterConfig.maxGasPerQueuePerEpoch;\\n\\n messageRecord.nuisanceGasLeft = _getNuisanceGasLimit(_transaction.gasLimit);\\n }\\n\\n /**\\n * Resets the transaction and message context.\\n */\\n function _resetContext()\\n internal\\n {\\n transactionContext.ovmL1TXORIGIN = DEFAULT_ADDRESS;\\n transactionContext.ovmTIMESTAMP = DEFAULT_UINT256;\\n transactionContext.ovmNUMBER = DEFAULT_UINT256;\\n transactionContext.ovmGASLIMIT = DEFAULT_UINT256;\\n transactionContext.ovmTXGASLIMIT = DEFAULT_UINT256;\\n transactionContext.ovmL1QUEUEORIGIN = Lib_OVMCodec.QueueOrigin.SEQUENCER_QUEUE;\\n\\n transactionRecord.ovmGasRefund = DEFAULT_UINT256;\\n\\n messageContext.ovmCALLER = DEFAULT_ADDRESS;\\n messageContext.ovmADDRESS = DEFAULT_ADDRESS;\\n messageContext.isStatic = false;\\n\\n messageRecord.nuisanceGasLeft = DEFAULT_UINT256;\\n\\n // Reset the ovmStateManager.\\n ovmStateManager = iOVM_StateManager(address(0));\\n }\\n\\n /*****************************\\n * L2-only Helper Functions *\\n *****************************/\\n\\n /**\\n * Unreachable helper function for simulating eth_calls with an OVM message context.\\n * This function will throw an exception in all cases other than when used as a custom entrypoint in L2 Geth to simulate eth_call.\\n * @param _transaction the message transaction to simulate.\\n * @param _from the OVM account the simulated call should be from.\\n */\\n function simulateMessage(\\n Lib_OVMCodec.Transaction memory _transaction,\\n address _from,\\n iOVM_StateManager _ovmStateManager\\n )\\n external\\n returns (\\n bool,\\n bytes memory\\n )\\n {\\n // Prevent this call from having any effect unless in a custom-set VM frame\\n require(msg.sender == address(0));\\n\\n ovmStateManager = _ovmStateManager;\\n _initContext(_transaction);\\n messageRecord.nuisanceGasLeft = uint(-1);\\n\\n messageContext.ovmADDRESS = _from;\\n\\n bool isCreate = _transaction.entrypoint == address(0);\\n if (isCreate) {\\n (address created, bytes memory revertData) = ovmCREATE(_transaction.data);\\n if (created == address(0)) {\\n return (false, revertData);\\n } else {\\n // The eth_call RPC endpoint for to = undefined will return the deployed bytecode\\n // in the success case, differing from standard create messages.\\n return (true, Lib_EthUtils.getCode(created));\\n }\\n } else {\\n return ovmCALL(\\n _transaction.gasLimit,\\n _transaction.entrypoint,\\n _transaction.data\\n );\\n }\\n }\\n}\\n\",\"keccak256\":\"0x229011db3d21b69e16814325f8e5debbdf6219b3dffb4011a24f2a6540a0d98e\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/predeploys/OVM_DeployerWhitelist.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Interface Imports */\\nimport { iOVM_DeployerWhitelist } from \\\"../../iOVM/predeploys/iOVM_DeployerWhitelist.sol\\\";\\n\\n/**\\n * @title OVM_DeployerWhitelist\\n * @dev The Deployer Whitelist is a temporary predeploy used to provide additional safety during the\\n * initial phases of our mainnet roll out. It is owned by the Optimism team, and defines accounts\\n * which are allowed to deploy contracts on Layer2. The Execution Manager will only allow an\\n * ovmCREATE or ovmCREATE2 operation to proceed if the deployer's address whitelisted.\\n *\\n * Compiler used: optimistic-solc\\n * Runtime target: OVM\\n */\\ncontract OVM_DeployerWhitelist is iOVM_DeployerWhitelist {\\n\\n /**********************\\n * Contract Constants *\\n **********************/\\n\\n bool public initialized;\\n bool public allowArbitraryDeployment;\\n address override public owner;\\n mapping (address => bool) public whitelist;\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n /**\\n * Blocks functions to anyone except the contract owner.\\n */\\n modifier onlyOwner() {\\n require(\\n msg.sender == owner,\\n \\\"Function can only be called by the owner of this contract.\\\"\\n );\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Initializes the whitelist.\\n * @param _owner Address of the owner for this contract.\\n * @param _allowArbitraryDeployment Whether or not to allow arbitrary contract deployment.\\n */\\n function initialize(\\n address _owner,\\n bool _allowArbitraryDeployment\\n )\\n override\\n public\\n {\\n if (initialized == true) {\\n return;\\n }\\n\\n initialized = true;\\n allowArbitraryDeployment = _allowArbitraryDeployment;\\n owner = _owner;\\n }\\n\\n /**\\n * Adds or removes an address from the deployment whitelist.\\n * @param _deployer Address to update permissions for.\\n * @param _isWhitelisted Whether or not the address is whitelisted.\\n */\\n function setWhitelistedDeployer(\\n address _deployer,\\n bool _isWhitelisted\\n )\\n override\\n public\\n onlyOwner\\n {\\n whitelist[_deployer] = _isWhitelisted;\\n }\\n\\n /**\\n * Updates the owner of this contract.\\n * @param _owner Address of the new owner.\\n */\\n function setOwner(\\n address _owner\\n )\\n override\\n public\\n onlyOwner\\n {\\n owner = _owner;\\n }\\n\\n /**\\n * Updates the arbitrary deployment flag.\\n * @param _allowArbitraryDeployment Whether or not to allow arbitrary contract deployment.\\n */\\n function setAllowArbitraryDeployment(\\n bool _allowArbitraryDeployment\\n )\\n override\\n public\\n onlyOwner\\n {\\n allowArbitraryDeployment = _allowArbitraryDeployment;\\n }\\n\\n /**\\n * Permanently enables arbitrary contract deployment and deletes the owner.\\n */\\n function enableArbitraryContractDeployment()\\n override\\n public\\n onlyOwner\\n {\\n setAllowArbitraryDeployment(true);\\n setOwner(address(0));\\n }\\n\\n /**\\n * Checks whether an address is allowed to deploy contracts.\\n * @param _deployer Address to check.\\n * @return _allowed Whether or not the address can deploy contracts.\\n */\\n function isDeployerAllowed(\\n address _deployer\\n )\\n override\\n public\\n returns (\\n bool\\n )\\n {\\n return (\\n initialized == false\\n || allowArbitraryDeployment == true\\n || whitelist[_deployer]\\n );\\n }\\n}\\n\",\"keccak256\":\"0x371e3d3ca1dd4177738b55eead9ad6f8278280e568694df6b42ee01f5558ccb2\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_CanonicalTransactionChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_ChainStorageContainer } from \\\"./iOVM_ChainStorageContainer.sol\\\";\\n\\n/**\\n * @title iOVM_CanonicalTransactionChain\\n */\\ninterface iOVM_CanonicalTransactionChain {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event TransactionEnqueued(\\n address _l1TxOrigin,\\n address _target,\\n uint256 _gasLimit,\\n bytes _data,\\n uint256 _queueIndex,\\n uint256 _timestamp\\n );\\n\\n event QueueBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event SequencerBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event TransactionBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct BatchContext {\\n uint256 numSequencedTransactions;\\n uint256 numSubsequentQueueTransactions;\\n uint256 timestamp;\\n uint256 blockNumber;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n\\n /**\\n * Accesses the batch storage container.\\n * @return Reference to the batch storage container.\\n */\\n function batches()\\n external\\n view\\n returns (\\n iOVM_ChainStorageContainer\\n );\\n\\n /**\\n * Accesses the queue storage container.\\n * @return Reference to the queue storage container.\\n */\\n function queue()\\n external\\n view\\n returns (\\n iOVM_ChainStorageContainer\\n );\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements()\\n external\\n view\\n returns (\\n uint256 _totalElements\\n );\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches()\\n external\\n view\\n returns (\\n uint256 _totalBatches\\n );\\n\\n /**\\n * Returns the index of the next element to be enqueued.\\n * @return Index for the next queue element.\\n */\\n function getNextQueueIndex()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Gets the queue element at a particular index.\\n * @param _index Index of the queue element to access.\\n * @return _element Queue element at the given index.\\n */\\n function getQueueElement(\\n uint256 _index\\n )\\n external\\n view\\n returns (\\n Lib_OVMCodec.QueueElement memory _element\\n );\\n\\n /**\\n * Returns the timestamp of the last transaction.\\n * @return Timestamp for the last transaction.\\n */\\n function getLastTimestamp()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Returns the blocknumber of the last transaction.\\n * @return Blocknumber for the last transaction.\\n */\\n function getLastBlockNumber()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Get the number of queue elements which have not yet been included.\\n * @return Number of pending queue elements.\\n */\\n function getNumPendingQueueElements()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Retrieves the length of the queue, including\\n * both pending and canonical transactions.\\n * @return Length of the queue.\\n */\\n function getQueueLength()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n\\n /**\\n * Adds a transaction to the queue.\\n * @param _target Target contract to send the transaction to.\\n * @param _gasLimit Gas limit for the given transaction.\\n * @param _data Transaction data.\\n */\\n function enqueue(\\n address _target,\\n uint256 _gasLimit,\\n bytes memory _data\\n )\\n external;\\n\\n /**\\n * Appends a given number of queued transactions as a single batch.\\n * @param _numQueuedTransactions Number of transactions to append.\\n */\\n function appendQueueBatch(\\n uint256 _numQueuedTransactions\\n )\\n external;\\n\\n /**\\n * Allows the sequencer to append a batch of transactions.\\n * @dev This function uses a custom encoding scheme for efficiency reasons.\\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\\n * .param _contexts Array of batch contexts.\\n * .param _transactionDataFields Array of raw transaction data.\\n */\\n function appendSequencerBatch(\\n // uint40 _shouldStartAtElement,\\n // uint24 _totalElementsToAppend,\\n // BatchContext[] _contexts,\\n // bytes[] _transactionDataFields\\n )\\n external;\\n\\n /**\\n * Verifies whether a transaction is included in the chain.\\n * @param _transaction Transaction to verify.\\n * @param _txChainElement Transaction chain element corresponding to the transaction.\\n * @param _batchHeader Header of the batch the transaction was included in.\\n * @param _inclusionProof Inclusion proof for the provided transaction chain element.\\n * @return True if the transaction exists in the CTC, false if not.\\n */\\n function verifyTransaction(\\n Lib_OVMCodec.Transaction memory _transaction,\\n Lib_OVMCodec.TransactionChainElement memory _txChainElement,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _inclusionProof\\n )\\n external\\n view\\n returns (\\n bool\\n );\\n}\\n\",\"keccak256\":\"0xb5e55488a1982841c07cdf5ff475da4789596f111dd48f01b1918ee4c775cf3a\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_ChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title iOVM_ChainStorageContainer\\n */\\ninterface iOVM_ChainStorageContainer {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata()\\n external\\n view\\n returns (\\n bytes27\\n );\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length()\\n external\\n view\\n returns (\\n uint256\\n );\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(\\n bytes32 _object\\n )\\n external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(\\n bytes32 _object,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(\\n uint256 _index\\n )\\n external\\n view\\n returns (\\n bytes32\\n );\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index\\n )\\n external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Marks an index as overwritable, meaing the underlying buffer can start to write values over\\n * any objects before and including the given index.\\n */\\n function setNextOverwritableIndex(\\n uint256 _index\\n )\\n external;\\n}\\n\",\"keccak256\":\"0x2d7973a0ad84c23ec62624d3f1e3aeb198cc72686ff1e6cfa17155556b320c94\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/execution/iOVM_ExecutionManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\ninterface iOVM_ExecutionManager {\\n /**********\\n * Enums *\\n *********/\\n\\n enum RevertFlag {\\n OUT_OF_GAS,\\n INTENTIONAL_REVERT,\\n EXCEEDS_NUISANCE_GAS,\\n INVALID_STATE_ACCESS,\\n UNSAFE_BYTECODE,\\n CREATE_COLLISION,\\n STATIC_VIOLATION,\\n CREATOR_NOT_ALLOWED\\n }\\n\\n enum GasMetadataKey {\\n CURRENT_EPOCH_START_TIMESTAMP,\\n CUMULATIVE_SEQUENCER_QUEUE_GAS,\\n CUMULATIVE_L1TOL2_QUEUE_GAS,\\n PREV_EPOCH_SEQUENCER_QUEUE_GAS,\\n PREV_EPOCH_L1TOL2_QUEUE_GAS\\n }\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct GasMeterConfig {\\n uint256 minTransactionGasLimit;\\n uint256 maxTransactionGasLimit;\\n uint256 maxGasPerQueuePerEpoch;\\n uint256 secondsPerEpoch;\\n }\\n\\n struct GlobalContext {\\n uint256 ovmCHAINID;\\n }\\n\\n struct TransactionContext {\\n Lib_OVMCodec.QueueOrigin ovmL1QUEUEORIGIN;\\n uint256 ovmTIMESTAMP;\\n uint256 ovmNUMBER;\\n uint256 ovmGASLIMIT;\\n uint256 ovmTXGASLIMIT;\\n address ovmL1TXORIGIN;\\n }\\n\\n struct TransactionRecord {\\n uint256 ovmGasRefund;\\n }\\n\\n struct MessageContext {\\n address ovmCALLER;\\n address ovmADDRESS;\\n bool isStatic;\\n }\\n\\n struct MessageRecord {\\n uint256 nuisanceGasLeft;\\n }\\n\\n\\n /************************************\\n * Transaction Execution Entrypoint *\\n ************************************/\\n\\n function run(\\n Lib_OVMCodec.Transaction calldata _transaction,\\n address _txStateManager\\n ) external returns (bytes memory);\\n\\n\\n /*******************\\n * Context Opcodes *\\n *******************/\\n\\n function ovmCALLER() external view returns (address _caller);\\n function ovmADDRESS() external view returns (address _address);\\n function ovmTIMESTAMP() external view returns (uint256 _timestamp);\\n function ovmNUMBER() external view returns (uint256 _number);\\n function ovmGASLIMIT() external view returns (uint256 _gasLimit);\\n function ovmCHAINID() external view returns (uint256 _chainId);\\n\\n\\n /**********************\\n * L2 Context Opcodes *\\n **********************/\\n\\n function ovmL1QUEUEORIGIN() external view returns (Lib_OVMCodec.QueueOrigin _queueOrigin);\\n function ovmL1TXORIGIN() external view returns (address _l1TxOrigin);\\n\\n\\n /*******************\\n * Halting Opcodes *\\n *******************/\\n\\n function ovmREVERT(bytes memory _data) external;\\n\\n\\n /*****************************\\n * Contract Creation Opcodes *\\n *****************************/\\n\\n function ovmCREATE(bytes memory _bytecode) external returns (address _contract, bytes memory _revertdata);\\n function ovmCREATE2(bytes memory _bytecode, bytes32 _salt) external returns (address _contract, bytes memory _revertdata);\\n\\n\\n /*******************************\\n * Account Abstraction Opcodes *\\n ******************************/\\n\\n function ovmGETNONCE() external returns (uint256 _nonce);\\n function ovmINCREMENTNONCE() external;\\n function ovmCREATEEOA(bytes32 _messageHash, uint8 _v, bytes32 _r, bytes32 _s) external;\\n\\n\\n /****************************\\n * Contract Calling Opcodes *\\n ****************************/\\n\\n function ovmCALL(uint256 _gasLimit, address _address, bytes memory _calldata) external returns (bool _success, bytes memory _returndata);\\n function ovmSTATICCALL(uint256 _gasLimit, address _address, bytes memory _calldata) external returns (bool _success, bytes memory _returndata);\\n function ovmDELEGATECALL(uint256 _gasLimit, address _address, bytes memory _calldata) external returns (bool _success, bytes memory _returndata);\\n\\n\\n /****************************\\n * Contract Storage Opcodes *\\n ****************************/\\n\\n function ovmSLOAD(bytes32 _key) external returns (bytes32 _value);\\n function ovmSSTORE(bytes32 _key, bytes32 _value) external;\\n\\n\\n /*************************\\n * Contract Code Opcodes *\\n *************************/\\n\\n function ovmEXTCODECOPY(address _contract, uint256 _offset, uint256 _length) external returns (bytes memory _code);\\n function ovmEXTCODESIZE(address _contract) external returns (uint256 _size);\\n function ovmEXTCODEHASH(address _contract) external returns (bytes32 _hash);\\n\\n\\n /***************************************\\n * Public Functions: Execution Context *\\n ***************************************/\\n\\n function getMaxTransactionGasLimit() external view returns (uint _maxTransactionGasLimit);\\n}\\n\",\"keccak256\":\"0xf023d5d6fc6a03bd52f7a57af6e21076de77e8925d065bb79db062e73e43b684\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/execution/iOVM_SafetyChecker.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title iOVM_SafetyChecker\\n */\\ninterface iOVM_SafetyChecker {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function isBytecodeSafe(bytes calldata _bytecode) external pure returns (bool);\\n}\\n\",\"keccak256\":\"0xde6639676d4ec4f77297652d5ede2429bc93e74e11fefd9e9de4bc92dd784878\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/execution/iOVM_StateManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title iOVM_StateManager\\n */\\ninterface iOVM_StateManager {\\n\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n enum ItemState {\\n ITEM_UNTOUCHED,\\n ITEM_LOADED,\\n ITEM_CHANGED,\\n ITEM_COMMITTED\\n }\\n\\n /***************************\\n * Public Functions: Misc *\\n ***************************/\\n\\n function isAuthenticated(address _address) external view returns (bool);\\n\\n /***************************\\n * Public Functions: Setup *\\n ***************************/\\n\\n function owner() external view returns (address _owner);\\n function ovmExecutionManager() external view returns (address _ovmExecutionManager);\\n function setExecutionManager(address _ovmExecutionManager) external;\\n\\n\\n /************************************\\n * Public Functions: Account Access *\\n ************************************/\\n\\n function putAccount(address _address, Lib_OVMCodec.Account memory _account) external;\\n function putEmptyAccount(address _address) external;\\n function getAccount(address _address) external view returns (Lib_OVMCodec.Account memory _account);\\n function hasAccount(address _address) external view returns (bool _exists);\\n function hasEmptyAccount(address _address) external view returns (bool _exists);\\n function setAccountNonce(address _address, uint256 _nonce) external;\\n function getAccountNonce(address _address) external view returns (uint256 _nonce);\\n function getAccountEthAddress(address _address) external view returns (address _ethAddress);\\n function getAccountStorageRoot(address _address) external view returns (bytes32 _storageRoot);\\n function initPendingAccount(address _address) external;\\n function commitPendingAccount(address _address, address _ethAddress, bytes32 _codeHash) external;\\n function testAndSetAccountLoaded(address _address) external returns (bool _wasAccountAlreadyLoaded);\\n function testAndSetAccountChanged(address _address) external returns (bool _wasAccountAlreadyChanged);\\n function commitAccount(address _address) external returns (bool _wasAccountCommitted);\\n function incrementTotalUncommittedAccounts() external;\\n function getTotalUncommittedAccounts() external view returns (uint256 _total);\\n function wasAccountChanged(address _address) external view returns (bool);\\n function wasAccountCommitted(address _address) external view returns (bool);\\n\\n\\n /************************************\\n * Public Functions: Storage Access *\\n ************************************/\\n\\n function putContractStorage(address _contract, bytes32 _key, bytes32 _value) external;\\n function getContractStorage(address _contract, bytes32 _key) external view returns (bytes32 _value);\\n function hasContractStorage(address _contract, bytes32 _key) external view returns (bool _exists);\\n function testAndSetContractStorageLoaded(address _contract, bytes32 _key) external returns (bool _wasContractStorageAlreadyLoaded);\\n function testAndSetContractStorageChanged(address _contract, bytes32 _key) external returns (bool _wasContractStorageAlreadyChanged);\\n function commitContractStorage(address _contract, bytes32 _key) external returns (bool _wasContractStorageCommitted);\\n function incrementTotalUncommittedContractStorage() external;\\n function getTotalUncommittedContractStorage() external view returns (uint256 _total);\\n function wasContractStorageChanged(address _contract, bytes32 _key) external view returns (bool);\\n function wasContractStorageCommitted(address _contract, bytes32 _key) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x7a11dbd1f61593ba34debe07e39eef59967307f7f372ba9855bee0953585d08d\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/predeploys/iOVM_DeployerWhitelist.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title iOVM_DeployerWhitelist\\n */\\ninterface iOVM_DeployerWhitelist {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function initialize(address _owner, bool _allowArbitraryDeployment) external;\\n function owner() external returns (address _owner);\\n function setWhitelistedDeployer(address _deployer, bool _isWhitelisted) external;\\n function setOwner(address _newOwner) external;\\n function setAllowArbitraryDeployment(bool _allowArbitraryDeployment) external;\\n function enableArbitraryContractDeployment() external;\\n function isDeployerAllowed(address _deployer) external returns (bool _allowed);\\n}\\n\",\"keccak256\":\"0xdf1f27faf0d26d416bf6d408d146a16de32b4e1772a292c65d39eb7ec2b53ceb\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/codec/Lib_OVMCodec.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../utils/Lib_Bytes32Utils.sol\\\";\\n\\n/**\\n * @title Lib_OVMCodec\\n */\\nlibrary Lib_OVMCodec {\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum QueueOrigin {\\n SEQUENCER_QUEUE,\\n L1TOL2_QUEUE\\n }\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Account {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n address ethAddress;\\n bool isFresh;\\n }\\n\\n struct EVMAccount {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n }\\n\\n struct ChainBatchHeader {\\n uint256 batchIndex;\\n bytes32 batchRoot;\\n uint256 batchSize;\\n uint256 prevTotalElements;\\n bytes extraData;\\n }\\n\\n struct ChainInclusionProof {\\n uint256 index;\\n bytes32[] siblings;\\n }\\n\\n struct Transaction {\\n uint256 timestamp;\\n uint256 blockNumber;\\n QueueOrigin l1QueueOrigin;\\n address l1TxOrigin;\\n address entrypoint;\\n uint256 gasLimit;\\n bytes data;\\n }\\n\\n struct TransactionChainElement {\\n bool isSequenced;\\n uint256 queueIndex; // QUEUED TX ONLY\\n uint256 timestamp; // SEQUENCER TX ONLY\\n uint256 blockNumber; // SEQUENCER TX ONLY\\n bytes txData; // SEQUENCER TX ONLY\\n }\\n\\n struct QueueElement {\\n bytes32 transactionHash;\\n uint40 timestamp;\\n uint40 blockNumber;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Encodes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Encoded transaction bytes.\\n */\\n function encodeTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return abi.encodePacked(\\n _transaction.timestamp,\\n _transaction.blockNumber,\\n _transaction.l1QueueOrigin,\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n );\\n }\\n\\n /**\\n * Hashes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Hashed transaction\\n */\\n function hashTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(encodeTransaction(_transaction));\\n }\\n\\n /**\\n * Converts an OVM account to an EVM account.\\n * @param _in OVM account to convert.\\n * @return Converted EVM account.\\n */\\n function toEVMAccount(\\n Account memory _in\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n return EVMAccount({\\n nonce: _in.nonce,\\n balance: _in.balance,\\n storageRoot: _in.storageRoot,\\n codeHash: _in.codeHash\\n });\\n }\\n\\n /**\\n * @notice RLP-encodes an account state struct.\\n * @param _account Account state struct.\\n * @return RLP-encoded account state.\\n */\\n function encodeEVMAccount(\\n EVMAccount memory _account\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes[] memory raw = new bytes[](4);\\n\\n // Unfortunately we can't create this array outright because\\n // Lib_RLPWriter.writeList will reject fixed-size arrays. Assigning\\n // index-by-index circumvents this issue.\\n raw[0] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.nonce)\\n )\\n );\\n raw[1] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.balance)\\n )\\n );\\n raw[2] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.storageRoot));\\n raw[3] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.codeHash));\\n\\n return Lib_RLPWriter.writeList(raw);\\n }\\n\\n /**\\n * @notice Decodes an RLP-encoded account state into a useful struct.\\n * @param _encoded RLP-encoded account state.\\n * @return Account state struct.\\n */\\n function decodeEVMAccount(\\n bytes memory _encoded\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\\n\\n return EVMAccount({\\n nonce: Lib_RLPReader.readUint256(accountState[0]),\\n balance: Lib_RLPReader.readUint256(accountState[1]),\\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\\n });\\n }\\n\\n /**\\n * Calculates a hash for a given batch header.\\n * @param _batchHeader Header to hash.\\n * @return Hash of the header.\\n */\\n function hashBatchHeader(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(\\n abi.encode(\\n _batchHeader.batchRoot,\\n _batchHeader.batchSize,\\n _batchHeader.prevTotalElements,\\n _batchHeader.extraData\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0xd85ba2066057a2677926f484b938c7c2ef33ff3853f3b71cda252f4a54f30e05\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n public\\n onlyOwner\\n {\\n addresses[_getNameHash(_name)] = _address;\\n\\n emit AddressSet(\\n _name,\\n _address\\n );\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0x2ce671a0e004df88b136bea5a3c59d0732cea8887c8496da1d509e0200b03d7d\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(\\n address _libAddressManager\\n ) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x65981feeabff6a81783ea97d44baf988a18a86c8cb374c46fdb71819cbacc7c0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPReader.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_RLPReader\\n * @dev Adapted from \\\"RLPReader\\\" by Hamdi Allam (hamdi.allam97@gmail.com).\\n */\\nlibrary Lib_RLPReader {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 constant internal MAX_LIST_LENGTH = 32;\\n\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum RLPItemType {\\n DATA_ITEM,\\n LIST_ITEM\\n }\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct RLPItem {\\n uint256 length;\\n uint256 ptr;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts bytes to a reference to memory position and length.\\n * @param _in Input bytes to convert.\\n * @return Output memory reference.\\n */\\n function toRLPItem(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem memory\\n )\\n {\\n uint256 ptr;\\n assembly {\\n ptr := add(_in, 32)\\n }\\n\\n return RLPItem({\\n length: _in.length,\\n ptr: ptr\\n });\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n (\\n uint256 listOffset,\\n ,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.LIST_ITEM,\\n \\\"Invalid RLP list value.\\\"\\n );\\n\\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\\n // writing to the length. Since we can't know the number of RLP items without looping over\\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\\n // simply set a reasonable maximum list length and decrease the size before we finish.\\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\\n\\n uint256 itemCount = 0;\\n uint256 offset = listOffset;\\n while (offset < _in.length) {\\n require(\\n itemCount < MAX_LIST_LENGTH,\\n \\\"Provided RLP list exceeds max list length.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n ) = _decodeLength(RLPItem({\\n length: _in.length - offset,\\n ptr: _in.ptr + offset\\n }));\\n\\n out[itemCount] = RLPItem({\\n length: itemLength + itemOffset,\\n ptr: _in.ptr + offset\\n });\\n\\n itemCount += 1;\\n offset += itemOffset + itemLength;\\n }\\n\\n // Decrease the array size to match the actual item count.\\n assembly {\\n mstore(out, itemCount)\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n return readList(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes value.\\\"\\n );\\n\\n return _copy(_in.ptr, itemOffset, itemLength);\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return readBytes(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return string(readBytes(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return readString(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n require(\\n _in.length <= 33,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr + itemOffset;\\n bytes32 out;\\n assembly {\\n out := mload(ptr)\\n\\n // Shift the bytes over to match the item size.\\n if lt(itemLength, 32) {\\n out := div(out, exp(256, sub(32, itemLength)))\\n }\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return readBytes32(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return uint256(readBytes32(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return readUint256(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n require(\\n _in.length == 1,\\n \\\"Invalid RLP boolean value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 out;\\n assembly {\\n out := byte(0, mload(ptr))\\n }\\n\\n require(\\n out == 0 || out == 1,\\n \\\"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\\\"\\n );\\n\\n return out != 0;\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return readBool(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n if (_in.length == 1) {\\n return address(0);\\n }\\n\\n require(\\n _in.length == 21,\\n \\\"Invalid RLP address value.\\\"\\n );\\n\\n return address(readUint256(_in));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return readAddress(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads the raw bytes of an RLP item.\\n * @param _in RLP item to read.\\n * @return Raw RLP bytes.\\n */\\n function readRawBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in);\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Decodes the length of an RLP item.\\n * @param _in RLP item to decode.\\n * @return Offset of the encoded data.\\n * @return Length of the encoded data.\\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\\n */\\n function _decodeLength(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n uint256,\\n uint256,\\n RLPItemType\\n )\\n {\\n require(\\n _in.length > 0,\\n \\\"RLP item cannot be null.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 prefix;\\n assembly {\\n prefix := byte(0, mload(ptr))\\n }\\n\\n if (prefix <= 0x7f) {\\n // Single byte.\\n\\n return (0, 1, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xb7) {\\n // Short string.\\n\\n uint256 strLen = prefix - 0x80;\\n\\n require(\\n _in.length > strLen,\\n \\\"Invalid RLP short string.\\\"\\n );\\n\\n return (1, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xbf) {\\n // Long string.\\n uint256 lenOfStrLen = prefix - 0xb7;\\n\\n require(\\n _in.length > lenOfStrLen,\\n \\\"Invalid RLP long string length.\\\"\\n );\\n\\n uint256 strLen;\\n assembly {\\n // Pick out the string length.\\n strLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfStrLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfStrLen + strLen,\\n \\\"Invalid RLP long string.\\\"\\n );\\n\\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xf7) {\\n // Short list.\\n uint256 listLen = prefix - 0xc0;\\n\\n require(\\n _in.length > listLen,\\n \\\"Invalid RLP short list.\\\"\\n );\\n\\n return (1, listLen, RLPItemType.LIST_ITEM);\\n } else {\\n // Long list.\\n uint256 lenOfListLen = prefix - 0xf7;\\n\\n require(\\n _in.length > lenOfListLen,\\n \\\"Invalid RLP long list length.\\\"\\n );\\n\\n uint256 listLen;\\n assembly {\\n // Pick out the list length.\\n listLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfListLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfListLen + listLen,\\n \\\"Invalid RLP long list.\\\"\\n );\\n\\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\\n }\\n }\\n\\n /**\\n * Copies the bytes from a memory location.\\n * @param _src Pointer to the location to read from.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Copied bytes.\\n */\\n function _copy(\\n uint256 _src,\\n uint256 _offset,\\n uint256 _length\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out = new bytes(_length);\\n if (out.length == 0) {\\n return out;\\n }\\n\\n uint256 src = _src + _offset;\\n uint256 dest;\\n assembly {\\n dest := add(out, 32)\\n }\\n\\n // Copy over as many complete words as we can.\\n for (uint256 i = 0; i < _length / 32; i++) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n\\n src += 32;\\n dest += 32;\\n }\\n\\n // Pick out the remaining bytes.\\n uint256 mask = 256 ** (32 - (_length % 32)) - 1;\\n assembly {\\n mstore(\\n dest,\\n or(\\n and(mload(src), not(mask)),\\n and(mload(dest), mask)\\n )\\n )\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Copies an RLP item into bytes.\\n * @param _in RLP item to copy.\\n * @return Copied bytes.\\n */\\n function _copy(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in.ptr, 0, _in.length);\\n }\\n}\\n\",\"keccak256\":\"0x829174c61216dce35fdb888383b6022e0365eb7fbdc71ad79d98b108091969fe\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPWriter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/**\\n * @title Lib_RLPWriter\\n * @author Bakaoh (with modifications)\\n */\\nlibrary Lib_RLPWriter {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * RLP encodes a byte string.\\n * @param _in The byte string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded;\\n\\n if (_in.length == 1 && uint8(_in[0]) < 128) {\\n encoded = _in;\\n } else {\\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * RLP encodes a list of RLP encoded byte byte strings.\\n * @param _in The list of RLP encoded byte strings.\\n * @return The RLP encoded list of items in bytes.\\n */\\n function writeList(\\n bytes[] memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory list = _flatten(_in);\\n return abi.encodePacked(_writeLength(list.length, 192), list);\\n }\\n\\n /**\\n * RLP encodes a string.\\n * @param _in The string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeString(\\n string memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(bytes(_in));\\n }\\n\\n /**\\n * RLP encodes an address.\\n * @param _in The address to encode.\\n * @return The RLP encoded address in bytes.\\n */\\n function writeAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a bytes32 value.\\n * @param _in The bytes32 to encode.\\n * @return _out The RLP encoded bytes32 in bytes.\\n */\\n function writeBytes32(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a uint.\\n * @param _in The uint256 to encode.\\n * @return The RLP encoded uint256 in bytes.\\n */\\n function writeUint(\\n uint256 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(_toBinary(_in));\\n }\\n\\n /**\\n * RLP encodes a bool.\\n * @param _in The bool to encode.\\n * @return The RLP encoded bool in bytes.\\n */\\n function writeBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded = new bytes(1);\\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\\n return encoded;\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\\n * @param _len The length of the string or the payload.\\n * @param _offset 128 if item is string, 192 if item is list.\\n * @return RLP encoded bytes.\\n */\\n function _writeLength(\\n uint256 _len,\\n uint256 _offset\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded;\\n\\n if (_len < 56) {\\n encoded = new bytes(1);\\n encoded[0] = byte(uint8(_len) + uint8(_offset));\\n } else {\\n uint256 lenLen;\\n uint256 i = 1;\\n while (_len / i != 0) {\\n lenLen++;\\n i *= 256;\\n }\\n\\n encoded = new bytes(lenLen + 1);\\n encoded[0] = byte(uint8(lenLen) + uint8(_offset) + 55);\\n for(i = 1; i <= lenLen; i++) {\\n encoded[i] = byte(uint8((_len / (256**(lenLen-i))) % 256));\\n }\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * Encode integer in big endian binary form with no leading zeroes.\\n * @notice TODO: This should be optimized with assembly to save gas costs.\\n * @param _x The integer to encode.\\n * @return RLP encoded bytes.\\n */\\n function _toBinary(\\n uint256 _x\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory b = abi.encodePacked(_x);\\n\\n uint256 i = 0;\\n for (; i < 32; i++) {\\n if (b[i] != 0) {\\n break;\\n }\\n }\\n\\n bytes memory res = new bytes(32 - i);\\n for (uint256 j = 0; j < res.length; j++) {\\n res[j] = b[i++];\\n }\\n\\n return res;\\n }\\n\\n /**\\n * Copies a piece of memory to another location.\\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\\n * @param _dest Destination location.\\n * @param _src Source location.\\n * @param _len Length of memory to copy.\\n */\\n function _memcpy(\\n uint256 _dest,\\n uint256 _src,\\n uint256 _len\\n )\\n private\\n pure\\n {\\n uint256 dest = _dest;\\n uint256 src = _src;\\n uint256 len = _len;\\n\\n for(; len >= 32; len -= 32) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n dest += 32;\\n src += 32;\\n }\\n\\n uint256 mask = 256 ** (32 - len) - 1;\\n assembly {\\n let srcpart := and(mload(src), not(mask))\\n let destpart := and(mload(dest), mask)\\n mstore(dest, or(destpart, srcpart))\\n }\\n }\\n\\n /**\\n * Flattens a list of byte strings into one byte string.\\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\\n * @param _list List of byte strings to flatten.\\n * @return The flattened byte string.\\n */\\n function _flatten(\\n bytes[] memory _list\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n if (_list.length == 0) {\\n return new bytes(0);\\n }\\n\\n uint256 len;\\n uint256 i = 0;\\n for (; i < _list.length; i++) {\\n len += _list[i].length;\\n }\\n\\n bytes memory flattened = new bytes(len);\\n uint256 flattenedPtr;\\n assembly { flattenedPtr := add(flattened, 0x20) }\\n\\n for(i = 0; i < _list.length; i++) {\\n bytes memory item = _list[i];\\n\\n uint256 listPtr;\\n assembly { listPtr := add(item, 0x20)}\\n\\n _memcpy(flattenedPtr, listPtr, item.length);\\n flattenedPtr += _list[i].length;\\n }\\n\\n return flattened;\\n }\\n}\\n\",\"keccak256\":\"0xb60ee4b03ad372c3deff21d454ab714dd0c18ee3e6f9d45532e209fc59d5a54d\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_Bytes32Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_Byte32Utils\\n */\\nlibrary Lib_Bytes32Utils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \\\"true.\\\"\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as a boolean.\\n */\\n function toBool(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return _in != 0;\\n }\\n\\n /**\\n * Converts a boolean to a bytes32 value.\\n * @param _in Input boolean value.\\n * @return Boolean as a bytes32.\\n */\\n function fromBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in ? 1 : 0));\\n }\\n\\n /**\\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as an address.\\n */\\n function toAddress(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return address(uint160(uint256(_in)));\\n }\\n\\n /**\\n * Converts an address to a bytes32.\\n * @param _in Input address value.\\n * @return Address as a bytes32.\\n */\\n function fromAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in));\\n }\\n\\n /**\\n * Removes the leading zeros from a bytes32 value and returns a new (smaller) bytes value.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 without any leading zeros.\\n */\\n function removeLeadingZeros(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out;\\n\\n assembly {\\n // Figure out how many leading zero bytes to remove.\\n let shift := 0\\n for { let i := 0 } and(lt(i, 32), eq(byte(i, _in), 0)) { i := add(i, 1) } {\\n shift := add(shift, 1)\\n }\\n\\n // Reserve some space for our output and fix the free memory pointer.\\n out := mload(0x40)\\n mstore(0x40, add(out, 0x40))\\n\\n // Shift the value and store it into the output bytes.\\n mstore(add(out, 0x20), shl(mul(shift, 8), _in))\\n\\n // Store the new size (with leading zero bytes removed) in the output byte size.\\n mstore(out, sub(32, shift))\\n }\\n\\n return out;\\n }\\n}\\n\",\"keccak256\":\"0xfa2def593e3fc56a31852c3744aefdaa93cec74e721bfcfeb1e5d166c7c60b64\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_BytesUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_BytesUtils\\n */\\nlibrary Lib_BytesUtils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_start + _length >= _start, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n if (_bytes.length - _start == 0) {\\n return bytes('');\\n }\\n\\n return slice(_bytes, _start, _bytes.length - _start);\\n }\\n\\n function toBytes32PadLeft(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n bytes32 ret;\\n uint256 len = _bytes.length <= 32 ? _bytes.length : 32;\\n assembly {\\n ret := shr(mul(sub(32, len), 8), mload(add(_bytes, 32)))\\n }\\n return ret;\\n }\\n\\n function toBytes32(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n if (_bytes.length < 32) {\\n bytes32 ret;\\n assembly {\\n ret := mload(add(_bytes, 32))\\n }\\n return ret;\\n }\\n\\n return abi.decode(_bytes,(bytes32)); // will truncate if input length > 32 bytes\\n }\\n\\n function toUint256(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return uint256(toBytes32(_bytes));\\n }\\n\\n function toUint24(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n uint24\\n )\\n {\\n require(_start + 3 >= _start, \\\"toUint24_overflow\\\");\\n require(_bytes.length >= _start + 3 , \\\"toUint24_outOfBounds\\\");\\n uint24 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x3), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toUint8(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n uint8\\n )\\n {\\n require(_start + 1 >= _start, \\\"toUint8_overflow\\\");\\n require(_bytes.length >= _start + 1 , \\\"toUint8_outOfBounds\\\");\\n uint8 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x1), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toAddress(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n require(_start + 20 >= _start, \\\"toAddress_overflow\\\");\\n require(_bytes.length >= _start + 20, \\\"toAddress_outOfBounds\\\");\\n address tempAddress;\\n\\n assembly {\\n tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000)\\n }\\n\\n return tempAddress;\\n }\\n\\n function toNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory nibbles = new bytes(_bytes.length * 2);\\n\\n for (uint256 i = 0; i < _bytes.length; i++) {\\n nibbles[i * 2] = _bytes[i] >> 4;\\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\\n }\\n\\n return nibbles;\\n }\\n\\n function fromNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory ret = new bytes(_bytes.length / 2);\\n\\n for (uint256 i = 0; i < ret.length; i++) {\\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\\n }\\n\\n return ret;\\n }\\n\\n function equal(\\n bytes memory _bytes,\\n bytes memory _other\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return keccak256(_bytes) == keccak256(_other);\\n }\\n}\\n\",\"keccak256\":\"0xa5195afe32fb2cf104d156e8f4bd39df1ec79bf6ba232097b9e8e0ee14fbc298\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_ErrorUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/**\\n * @title Lib_ErrorUtils\\n */\\nlibrary Lib_ErrorUtils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Encodes an error string into raw solidity-style revert data.\\n * (i.e. ascii bytes, prefixed with bytes4(keccak(\\\"Error(string))\\\"))\\n * Ref: https://docs.soliditylang.org/en/v0.8.2/control-structures.html?highlight=Error(string)#panic-via-assert-and-error-via-require\\n * @param _reason Reason for the reversion.\\n * @return Standard solidity revert data for the given reason.\\n */\\n function encodeRevertString(\\n string memory _reason\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return abi.encodeWithSignature(\\n \\\"Error(string)\\\",\\n _reason\\n );\\n }\\n}\\n\",\"keccak256\":\"0xfc64ec4a81fb50865b502a0004ed154e8598e1a313db77303fc95e41f536e6b7\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_EthUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// @unsupported: ovm\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"./Lib_Bytes32Utils.sol\\\";\\n\\n/**\\n * @title Lib_EthUtils\\n */\\nlibrary Lib_EthUtils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Gets the code for a given address.\\n * @param _address Address to get code for.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Code read from the contract.\\n */\\n function getCode(\\n address _address,\\n uint256 _offset,\\n uint256 _length\\n )\\n internal\\n view\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory code;\\n assembly {\\n code := mload(0x40)\\n mstore(0x40, add(code, add(_length, 0x20)))\\n mstore(code, _length)\\n extcodecopy(_address, add(code, 0x20), _offset, _length)\\n }\\n\\n return code;\\n }\\n\\n /**\\n * Gets the full code for a given address.\\n * @param _address Address to get code for.\\n * @return Full code of the contract.\\n */\\n function getCode(\\n address _address\\n )\\n internal\\n view\\n returns (\\n bytes memory\\n )\\n {\\n return getCode(\\n _address,\\n 0,\\n getCodeSize(_address)\\n );\\n }\\n\\n /**\\n * Gets the size of a contract's code in bytes.\\n * @param _address Address to get code size for.\\n * @return Size of the contract's code in bytes.\\n */\\n function getCodeSize(\\n address _address\\n )\\n internal\\n view\\n returns (\\n uint256\\n )\\n {\\n uint256 codeSize;\\n assembly {\\n codeSize := extcodesize(_address)\\n }\\n\\n return codeSize;\\n }\\n\\n /**\\n * Gets the hash of a contract's code.\\n * @param _address Address to get a code hash for.\\n * @return Hash of the contract's code.\\n */\\n function getCodeHash(\\n address _address\\n )\\n internal\\n view\\n returns (\\n bytes32\\n )\\n {\\n bytes32 codeHash;\\n assembly {\\n codeHash := extcodehash(_address)\\n }\\n\\n return codeHash;\\n }\\n\\n /**\\n * Creates a contract with some given initialization code.\\n * @param _code Contract initialization code.\\n * @return Address of the created contract.\\n */\\n function createContract(\\n bytes memory _code\\n )\\n internal\\n returns (\\n address\\n )\\n {\\n address created;\\n assembly {\\n created := create(\\n 0,\\n add(_code, 0x20),\\n mload(_code)\\n )\\n }\\n\\n return created;\\n }\\n\\n /**\\n * Computes the address that would be generated by CREATE.\\n * @param _creator Address creating the contract.\\n * @param _nonce Creator's nonce.\\n * @return Address to be generated by CREATE.\\n */\\n function getAddressForCREATE(\\n address _creator,\\n uint256 _nonce\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n bytes[] memory encoded = new bytes[](2);\\n encoded[0] = Lib_RLPWriter.writeAddress(_creator);\\n encoded[1] = Lib_RLPWriter.writeUint(_nonce);\\n\\n bytes memory encodedList = Lib_RLPWriter.writeList(encoded);\\n return Lib_Bytes32Utils.toAddress(keccak256(encodedList));\\n }\\n\\n /**\\n * Computes the address that would be generated by CREATE2.\\n * @param _creator Address creating the contract.\\n * @param _bytecode Bytecode of the contract to be created.\\n * @param _salt 32 byte salt value mixed into the hash.\\n * @return Address to be generated by CREATE2.\\n */\\n function getAddressForCREATE2(\\n address _creator,\\n bytes memory _bytecode,\\n bytes32 _salt\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n bytes32 hashedData = keccak256(abi.encodePacked(\\n byte(0xff),\\n _creator,\\n _salt,\\n keccak256(_bytecode)\\n ));\\n\\n return Lib_Bytes32Utils.toAddress(hashedData);\\n }\\n}\\n\",\"keccak256\":\"0xf29a67d78e61cb472d524b779b32cfcb39a587f4096500d5419e6425ed367d49\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_MerkleTree.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_MerkleTree\\n * @author River Keefer\\n */\\nlibrary Lib_MerkleTree {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Calculates a merkle root for a list of 32-byte leaf hashes. WARNING: If the number\\n * of leaves passed in is not a power of two, it pads out the tree with zero hashes.\\n * If you do not know the original length of elements for the tree you are verifying,\\n * then this may allow empty leaves past _elements.length to pass a verification check down the line.\\n * Note that the _elements argument is modified, therefore it must not be used again afterwards\\n * @param _elements Array of hashes from which to generate a merkle root.\\n * @return Merkle root of the leaves, with zero hashes for non-powers-of-two (see above).\\n */\\n function getMerkleRoot(\\n bytes32[] memory _elements\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n require(\\n _elements.length > 0,\\n \\\"Lib_MerkleTree: Must provide at least one leaf hash.\\\"\\n );\\n\\n if (_elements.length == 1) {\\n return _elements[0];\\n }\\n\\n uint256[16] memory defaults = [\\n 0x290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563,\\n 0x633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d,\\n 0x890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d,\\n 0x3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd8,\\n 0xecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da,\\n 0xdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da5,\\n 0x617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d7,\\n 0x292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead,\\n 0xe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e10,\\n 0x7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f82,\\n 0xe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e83636516,\\n 0x3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c,\\n 0xad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e,\\n 0xa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab,\\n 0x4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c862,\\n 0x2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf10\\n ];\\n\\n // Reserve memory space for our hashes.\\n bytes memory buf = new bytes(64);\\n\\n // We'll need to keep track of left and right siblings.\\n bytes32 leftSibling;\\n bytes32 rightSibling;\\n\\n // Number of non-empty nodes at the current depth.\\n uint256 rowSize = _elements.length;\\n\\n // Current depth, counting from 0 at the leaves\\n uint256 depth = 0;\\n\\n // Common sub-expressions\\n uint256 halfRowSize; // rowSize / 2\\n bool rowSizeIsOdd; // rowSize % 2 == 1\\n\\n while (rowSize > 1) {\\n halfRowSize = rowSize / 2;\\n rowSizeIsOdd = rowSize % 2 == 1;\\n\\n for (uint256 i = 0; i < halfRowSize; i++) {\\n leftSibling = _elements[(2 * i) ];\\n rightSibling = _elements[(2 * i) + 1];\\n assembly {\\n mstore(add(buf, 32), leftSibling )\\n mstore(add(buf, 64), rightSibling)\\n }\\n\\n _elements[i] = keccak256(buf);\\n }\\n\\n if (rowSizeIsOdd) {\\n leftSibling = _elements[rowSize - 1];\\n rightSibling = bytes32(defaults[depth]);\\n assembly {\\n mstore(add(buf, 32), leftSibling)\\n mstore(add(buf, 64), rightSibling)\\n }\\n\\n _elements[halfRowSize] = keccak256(buf);\\n }\\n\\n rowSize = halfRowSize + (rowSizeIsOdd ? 1 : 0);\\n depth++;\\n }\\n\\n return _elements[0];\\n }\\n\\n /**\\n * Verifies a merkle branch for the given leaf hash. Assumes the original length\\n * of leaves generated is a known, correct input, and does not return true for indices\\n * extending past that index (even if _siblings would be otherwise valid.)\\n * @param _root The Merkle root to verify against.\\n * @param _leaf The leaf hash to verify inclusion of.\\n * @param _index The index in the tree of this leaf.\\n * @param _siblings Array of sibline nodes in the inclusion proof, starting from depth 0 (bottom of the tree).\\n * @param _totalLeaves The total number of leaves originally passed into.\\n * @return Whether or not the merkle branch and leaf passes verification.\\n */\\n function verify(\\n bytes32 _root,\\n bytes32 _leaf,\\n uint256 _index,\\n bytes32[] memory _siblings,\\n uint256 _totalLeaves\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n require(\\n _totalLeaves > 0,\\n \\\"Lib_MerkleTree: Total leaves must be greater than zero.\\\"\\n );\\n\\n require(\\n _index < _totalLeaves,\\n \\\"Lib_MerkleTree: Index out of bounds.\\\"\\n );\\n\\n require(\\n _siblings.length == _ceilLog2(_totalLeaves),\\n \\\"Lib_MerkleTree: Total siblings does not correctly correspond to total leaves.\\\"\\n );\\n\\n bytes32 computedRoot = _leaf;\\n\\n for (uint256 i = 0; i < _siblings.length; i++) {\\n if ((_index & 1) == 1) {\\n computedRoot = keccak256(\\n abi.encodePacked(\\n _siblings[i],\\n computedRoot\\n )\\n );\\n } else {\\n computedRoot = keccak256(\\n abi.encodePacked(\\n computedRoot,\\n _siblings[i]\\n )\\n );\\n }\\n\\n _index >>= 1;\\n }\\n\\n return _root == computedRoot;\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Calculates the integer ceiling of the log base 2 of an input.\\n * @param _in Unsigned input to calculate the log.\\n * @return ceil(log_base_2(_in))\\n */\\n function _ceilLog2(\\n uint256 _in\\n )\\n private\\n pure\\n returns (\\n uint256\\n )\\n {\\n require(\\n _in > 0,\\n \\\"Lib_MerkleTree: Cannot compute ceil(log_2) of 0.\\\"\\n );\\n\\n if (_in == 1) {\\n return 0;\\n }\\n\\n // Find the highest set bit (will be floor(log_2)).\\n // Borrowed with <3 from https://github.com/ethereum/solidity-examples\\n uint256 val = _in;\\n uint256 highest = 0;\\n for (uint256 i = 128; i >= 1; i >>= 1) {\\n if (val & (uint(1) << i) - 1 << i != 0) {\\n highest += i;\\n val >>= i;\\n }\\n }\\n\\n // Increment by one if this is not a perfect logarithm.\\n if ((uint(1) << highest) != _in) {\\n highest += 1;\\n }\\n\\n return highest;\\n }\\n}\\n\",\"keccak256\":\"0xa78edb9fbd34712771a1ebff05bc5e1abec7fc1e9a1bfb709d183099b44fa62a\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x60806040523480156200001157600080fd5b506040516200315338038062003153833981016040819052620000349162000067565b600080546001600160a01b0319166001600160a01b039590951694909417909355600191909155600255600355620000b2565b600080600080608085870312156200007d578384fd5b84516001600160a01b038116811462000094578485fd5b60208601516040870151606090970151919890975090945092505050565b61309180620000c26000396000f3fe608060405234801561001057600080fd5b50600436106101425760003560e01c8063876ed5cb116100b8578063cfdf677e1161007c578063cfdf677e1461023f578063d0f8934414610247578063e10d29ee1461024f578063e561dddc14610257578063f722b41a1461025f578063facdc5da1461026757610142565b8063876ed5cb146102175780638d38c6c11461021f578063b8f7700514610227578063c139eb151461022f578063c2cf696f1461023757610142565b80634de569ce1161010a5780634de569ce146101c25780635ae6256d146101e25780636fee07e0146101ea57806378f4b2f2146101ff5780637a167a8a146102075780637aa63a861461020f57610142565b8063138387a414610147578063299ca478146101655780632a7f18be1461017a578063378997701461019a578063461a4478146101af575b600080fd5b61014f61027a565b60405161015c91906124c7565b60405180910390f35b61016d610280565b60405161015c91906123eb565b61018d610188366004612388565b61028f565b60405161015c9190612e4e565b6101a26102b0565b60405161015c9190612e8d565b61016d6101bd36600461221b565b6102c4565b6101d56101d0366004612261565b6103a0565b60405161015c9190612484565b6101a26103da565b6101fd6101f8366004612188565b6103ee565b005b61014f61066d565b6101a2610674565b61014f610689565b61014f6106a4565b61014f6106aa565b6101a26106b0565b61014f6106c7565b61014f6106cd565b61016d6106d2565b6101fd6106f5565b61016d610b69565b61014f610b8c565b6101a2610c06565b6101fd610275366004612388565b610c1e565b60025481565b6000546001600160a01b031681565b610297611ed9565b6102a8826102a3610b69565b610c36565b90505b919050565b6000806102bb610d76565b50935050505090565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b8381101561032457818101518382015260200161030c565b50505050905090810190601f1680156103515780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561036e57600080fd5b505afa158015610382573d6000803e3d6000fd5b505050506040513d602081101561039857600080fd5b505192915050565b82516000901515600114156103c2576103bb85858585610e24565b90506103d2565b6103bb8585602001518585610fef565b949350505050565b6000806103e5610d76565b94505050505090565b61c3508151111561041a5760405162461bcd60e51b81526004016104119061259b565b60405180910390fd5b60035482111561043c5760405162461bcd60e51b8152600401610411906127a1565b620186a082101561045f5760405162461bcd60e51b815260040161041190612983565b6020820460005a90508181116104875760405162461bcd60e51b815260040161041190612b8a565b60005b825a8303101561049c5760010161048a565b6000338787876040516020016104b594939291906123ff565b60408051601f19818403018152919052805160209091012090504360281b421760006104df610b69565b60405163b298e36b60e01b81529091506001600160a01b0382169063b298e36b9061050e9086906004016124c7565b600060405180830381600087803b15801561052857600080fd5b505af115801561053c573d6000803e3d6000fd5b505060405163b298e36b60e01b81526001600160a01b038416925063b298e36b915061056c9085906004016124c7565b600060405180830381600087803b15801561058657600080fd5b505af115801561059a573d6000803e3d6000fd5b50505050600060016002836001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b1580156105dd57600080fd5b505afa1580156105f1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106159190612203565b8161061c57fe5b040390507f4b388aecf9fa6cc92253704e5975a6129a4f735bdbd99567df4ed0094ee4ceb5338b8b8b85426040516106599695949392919061243c565b60405180910390a150505050505050505050565b620186a081565b60008061067f610d76565b5090935050505090565b600080610694610d76565b50505064ffffffffff1692915050565b61c35081565b60035481565b60006106c26106bd610b69565b6110c4565b905090565b60015481565b602081565b60006106c2604051806060016040528060258152602001613003602591396102c4565b60043560d81c60093560e890811c90600c35901c610711610689565b8364ffffffffff16146107365760405162461bcd60e51b815260040161041190612a35565b6107646040518060400160405280600d81526020016c27ab26afa9b2b8bab2b731b2b960991b8152506102c4565b6001600160a01b0316336001600160a01b0316146107945760405162461bcd60e51b815260040161041190612a92565b60008162ffffff16116107b95760405162461bcd60e51b8152600401610411906127fe565b60008262ffffff16116107de5760405162461bcd60e51b815260040161041190612cdf565b600f601062ffffff8316020164ffffffffff81163610156108115760405162461bcd60e51b815260040161041190612d66565b600061081b610b69565b90506000610828826110c4565b9050600062ffffff8616368161083a57fe5b0460020267ffffffffffffffff8111801561085457600080fd5b506040519080825280601f01601f19166020018201604052801561087f576020820181803683370190505b50905060008662ffffff1667ffffffffffffffff811180156108a057600080fd5b506040519080825280602002602001820160405280156108ca578160200160208202803683370190505b50905060008060006108da610674565b90506108e4611ef9565b60005b8a62ffffff168163ffffffff161015610a3b57600061090b8263ffffffff16611147565b905063ffffffff82166109215761092181611197565b61092d8382868d611264565b80925060005b835163ffffffff821610156109b1578b3560e81c61c3508111156109695760405162461bcd60e51b81526004016104119061259b565b61097c858e64ffffffffff16838d6112cf565b898963ffffffff168151811061098e57fe5b60209081029190910101529b909b016003019a6001968701969586019501610933565b5060005b83602001518163ffffffff161015610a31578964ffffffffff168564ffffffffff16106109f45760405162461bcd60e51b815260040161041190612da8565b610a048564ffffffffff16611363565b888863ffffffff1681518110610a1657fe5b602090810291909101015260019687019694850194016109b5565b50506001016108e7565b50610a488183898b6113a8565b3664ffffffffff8a1614610a6e5760405162461bcd60e51b815260040161041190612846565b8a62ffffff168463ffffffff1614610a985760405162461bcd60e51b815260040161041190612894565b6000838c62ffffff160363ffffffff169050600080836020015160001415610acb57505060408201516060830151610af3565b6000610ae16001870364ffffffffff168d610c36565b90508060200151925080604001519150505b610b14610aff8961141b565b8f62ffffff168564ffffffffff16858561184f565b7f602f1aeac0ca2e7a13e281a9ef0ad7838542712ce16780fa2ecffd351f05f89983860384610b41610689565b604051610b5093929190612e9f565b60405180910390a1505050505050505050505050505050565b60006106c2604051806060016040528060238152602001612ee6602391396102c4565b6000610b966106d2565b6001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b158015610bce57600080fd5b505afa158015610be2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106c29190612203565b6000610c10610674565b610c186106b0565b03905090565b60405162461bcd60e51b81526004016104119061250b565b610c3e611ed9565b604051634a83e9cd60e11b815260028402906000906001600160a01b03851690639507d39a90610c72908590600401612e8d565b60206040518083038186803b158015610c8a57600080fd5b505afa158015610c9e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cc29190612203565b90506000846001600160a01b0316639507d39a846001016040518263ffffffff1660e01b8152600401610cf59190612e8d565b60206040518083038186803b158015610d0d57600080fd5b505afa158015610d21573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d459190612203565b6040805160608101825293845264ffffffffff828116602086015260289290921c9091169083015250949350505050565b6000806000806000610d866106d2565b6001600160a01b031663ccf8f9696040518163ffffffff1660e01b815260040160206040518083038186803b158015610dbe57600080fd5b505afa158015610dd2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610df691906121dd565b64ffffffffff602882901c811697605083901c82169750607883901c8216965060a09290921c169350915050565b600080610e5c6040518060400160405280601481526020017327ab26afa2bc32b1baba34b7b726b0b730b3b2b960611b8152506102c4565b90506000816001600160a01b0316631c4712a76040518163ffffffff1660e01b815260040160206040518083038186803b158015610e9957600080fd5b505afa158015610ead573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ed19190612203565b90506000610ede87611a02565b9050610eeb818787611a9b565b610f075760405162461bcd60e51b8152600401610411906126ca565b86606001518860200151148015610f22575060408701518851145b8015610f635750610f4a604051806060016040528060228152602001612f09602291396102c4565b6001600160a01b031688608001516001600160a01b0316145b8015610f725750818860a00151145b8015610f89575060608801516001600160a01b0316155b8015610fa45750600088604001516001811115610fa257fe5b145b8015610fc557508660800151805190602001208860c0015180519060200120145b610fe15760405162461bcd60e51b81526004016104119061276a565b506001979650505050505050565b600080610ffb85611363565b9050611008818585611a9b565b6110245760405162461bcd60e51b815260040161041190612c2a565b6000866060015187608001518860a001518960c0015160405160200161104d94939291906123ff565b60405160208183030381529060405280519060200120905060006110708761028f565b80519091508214801561108e57508751602082015164ffffffffff16145b80156110a857508760200151816040015164ffffffffff16145b610fe15760405162461bcd60e51b815260040161041190612adf565b60006002826001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b15801561110157600080fd5b505afa158015611115573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111399190612203565b8161114057fe5b0492915050565b61114f611ef9565b5060408051608081018252601092909202600f81013560e890811c84526012820135901c6020840152601581013560d890811c92840192909252601a0135901c606082015290565b60006111a1610689565b1115611211576000806111b2610d76565b9350935050508064ffffffffff16836060015110156111e35760405162461bcd60e51b815260040161041190612718565b8164ffffffffff168360400151101561120e5760405162461bcd60e51b8152600401610411906125f8565b50505b4260015482604001510110156112395760405162461bcd60e51b815260040161041190612d20565b4360025482606001510110156112615760405162461bcd60e51b815260040161041190612552565b50565b83604001518360400151101561128c5760405162461bcd60e51b815260040161041190612bd5565b8360600151836060015110156112b45760405162461bcd60e51b815260040161041190612df1565b6020830151156112c9576112c9838383611b8c565b50505050565b60008151836041011115611326578260410167ffffffffffffffff811180156112f757600080fd5b506040519080825280601f01601f191660200182016040528015611322576020820181803683370190505b5091505b6040850151606086015160006020850160018153836001820152826021820152866003890160418301376041870190209350505050949350505050565b60006102a86040518060a00160405280600015158152602001848152602001600081526020016000815260200160405180602001604052806000815250815250611c2d565b600083830364ffffffffff161180156113c357506020840151155b156113d3576113d3848483611b8c565b42846040015111156113f75760405162461bcd60e51b815260040161041190612b45565b43846060015111156112c95760405162461bcd60e51b815260040161041190612904565b60008082511161145c5760405162461bcd60e51b81526004018080602001828103825260348152602001806130286034913960400191505060405180910390fd5b815160011415611482578160008151811061147357fe5b602002602001015190506102ab565b60408051610200810182527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56381527f633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d60208201527f890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d818301527f3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd86060808301919091527fecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da60808301527fdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da560a08301527f617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d760c08301527f292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead60e08301527fe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e106101008301527f7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f826101208301527fe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e836365166101408301527f3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c6101608301527fad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e6101808301527fa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab6101a08301527f4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c8626101c08301527f2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf106101e083015282518381529081018352909160009190602082018180368337505085519192506000918291508180805b600184111561182b5750506002820460018084161460005b828110156117a7578a816002028151811061174e57fe5b602002602001015196508a816002026001018151811061176a57fe5b6020026020010151955086602089015285604089015287805190602001208b828151811061179457fe5b6020908102919091010152600101611737565b50801561180a578960018503815181106117bd57fe5b602002602001015195508783601081106117d357fe5b602002015160001b945085602088015284604088015286805190602001208a83815181106117fd57fe5b6020026020010181815250505b80611816576000611819565b60015b60ff168201935060019092019161171f565b8960008151811061183857fe5b602002602001015198505050505050505050919050565b60006118596106d2565b9050600080611866610d76565b50509150915060006040518060a00160405280856001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b1580156118b257600080fd5b505afa1580156118c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118ea9190612203565b81526020018a81526020018981526020018464ffffffffff16815260200160405180602001604052806000815250815250905080600001517f127186556e7be68c7e31263195225b4de02820707889540969f62c05cf73525e826020015183604001518460600151856080015160405161196794939291906124e6565b60405180910390a2600061197a82611c75565b90506000611992836040015186018a86018a8a611c9e565b60405163080549db60e21b81529091506001600160a01b03871690632015276c906119c390859085906004016124d0565b600060405180830381600087803b1580156119dd57600080fd5b505af11580156119f1573d6000803e3d6000fd5b505050505050505050505050505050565b6080810151805160009190826041820167ffffffffffffffff81118015611a2857600080fd5b506040519080825280601f01601f191660200182016040528015611a53576020820181803683370190505b5060408601516060870151919250906000602084016001815383600182015282602182015285604182018760208a0160045afa50604190950190942095505050505050919050565b6000611aa56106d2565b8351604051634a83e9cd60e11b81526001600160a01b039290921691639507d39a91611ad391600401612e7c565b60206040518083038186803b158015611aeb57600080fd5b505afa158015611aff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b239190612203565b611b2c84611c75565b14611b495760405162461bcd60e51b815260040161041190612b16565b611b66836020015185846000015185602001518760400151611cbd565b611b825760405162461bcd60e51b81526004016104119061294c565b5060019392505050565b6000611b9f8364ffffffffff1683610c36565b9050600154816020015164ffffffffff16014210611bcf5760405162461bcd60e51b815260040161041190612647565b806020015164ffffffffff1684604001511115611bfe5760405162461bcd60e51b8152600401610411906129cc565b806040015164ffffffffff16846060015111156112c95760405162461bcd60e51b815260040161041190612c74565b8051602080830151604080850151606086015160808701519251600096611c5896909594910161248f565b604051602081830303815290604052805190602001209050919050565b60008160200151826040015183606001518460800151604051602001611c5894939291906124e6565b602892831b9390931760509190911b1760789290921b91909117901b90565b6000808211611cfd5760405162461bcd60e51b8152600401808060200182810382526037815260200180612f7f6037913960400191505060405180910390fd5b818410611d3b5760405162461bcd60e51b8152600401808060200182810382526024815260200180612f2b6024913960400191505060405180910390fd5b611d4482611e42565b835114611d825760405162461bcd60e51b815260040180806020018281038252604d815260200180612fb6604d913960600191505060405180910390fd5b8460005b8451811015611e35578560011660011415611de457848181518110611da757fe5b6020026020010151826040516020018083815260200182815260200192505050604051602081830303815290604052805190602001209150611e29565b81858281518110611df157fe5b602002602001015160405160200180838152602001828152602001925050506040516020818303038152906040528051906020012091505b600195861c9501611d86565b5090951495945050505050565b6000808211611e825760405162461bcd60e51b8152600401808060200182810382526030815260200180612f4f6030913960400191505060405180910390fd5b8160011415611e93575060006102ab565b81600060805b60018110611ec3576000196001821b01811b831615611ebb5791821c91908101905b60011c611e99565b506001811b8414611ed2576001015b9392505050565b604080516060810182526000808252602082018190529181019190915290565b6040518060800160405280600081526020016000815260200160008152602001600081525090565b600067ffffffffffffffff831115611f3557fe5b611f48601f8401601f1916602001612ec1565b9050828152838383011115611f5c57600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b03811681146102ab57600080fd5b600082601f830112611f9a578081fd5b611ed283833560208501611f21565b8035600281106102ab57600080fd5b600060a08284031215611fc9578081fd5b60405160a0810167ffffffffffffffff8282108183111715611fe757fe5b8160405282935084358352602085013560208401526040850135604084015260608501356060840152608085013591508082111561202457600080fd5b5061203185828601611f8a565b6080830152505092915050565b60006040828403121561204f578081fd5b6040516040810167ffffffffffffffff828210818311171561206d57fe5b816040528293508435835260209150818501358181111561208d57600080fd5b8501601f8101871361209e57600080fd5b8035828111156120aa57fe5b83810292506120ba848401612ec1565b8181528481019083860185850187018b10156120d557600080fd5b600095505b838610156120f85780358352600195909501949186019186016120da565b5080868801525050505050505092915050565b600060a0828403121561211c578081fd5b60405160a0810167ffffffffffffffff828210818311171561213a57fe5b8160405282935084359150811515821461215357600080fd5b818352602085013560208401526040850135604084015260608501356060840152608085013591508082111561202457600080fd5b60008060006060848603121561219c578283fd5b6121a584611f73565b925060208401359150604084013567ffffffffffffffff8111156121c7578182fd5b6121d386828701611f8a565b9150509250925092565b6000602082840312156121ee578081fd5b815164ffffffffff1981168114611ed2578182fd5b600060208284031215612214578081fd5b5051919050565b60006020828403121561222c578081fd5b813567ffffffffffffffff811115612242578182fd5b8201601f81018413612252578182fd5b6103d284823560208401611f21565b60008060008060808587031215612276578081fd5b843567ffffffffffffffff8082111561228d578283fd5b9086019060e082890312156122a0578283fd5b6122aa60e0612ec1565b82358152602083013560208201526122c460408401611fa9565b60408201526122d560608401611f73565b60608201526122e660808401611f73565b608082015260a083013560a082015260c083013582811115612306578485fd5b6123128a828601611f8a565b60c0830152509550602087013591508082111561232d578283fd5b6123398883890161210b565b9450604087013591508082111561234e578283fd5b61235a88838901611fb8565b9350606087013591508082111561236f578283fd5b5061237c8782880161203e565b91505092959194509250565b600060208284031215612399578081fd5b5035919050565b60008151808452815b818110156123c5576020818501810151868301820152016123a9565b818111156123d65782602083870101525b50601f01601f19169290920160200192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612432908301846123a0565b9695505050505050565b6001600160a01b038781168252861660208201526040810185905260c06060820181905260009061246f908301866123a0565b60808301949094525060a00152949350505050565b901515815260200190565b6000861515825285602083015284604083015283606083015260a060808301526124bc60a08301846123a0565b979650505050505050565b90815260200190565b91825264ffffffffff1916602082015260400190565b60008582528460208301528360408301526080606083015261243260808301846123a0565b60208082526027908201527f617070656e64517565756542617463682069732063757272656e746c7920646960408201526639b0b13632b21760c91b606082015260800190565b60208082526029908201527f436f6e7465787420626c6f636b206e756d62657220746f6f2066617220696e206040820152683a3432903830b9ba1760b91b606082015260800190565b6020808252603d908201527f5472616e73616374696f6e20646174612073697a652065786365656473206d6160408201527f78696d756d20666f7220726f6c6c7570207472616e73616374696f6e2e000000606082015260800190565b6020808252602f908201527f436f6e746578742074696d657374616d70206973206c6f776572207468616e2060408201526e3630b9ba1039bab136b4ba3a32b21760891b606082015260800190565b6020808252605b908201527f50726576696f75736c7920656e7175657565642062617463686573206861766560408201527f206578706972656420616e64206d75737420626520617070656e64656420626560608201527f666f72652061206e65772073657175656e6365722062617463682e0000000000608082015260a00190565b6020808252602e908201527f496e76616c69642053657175656e636572207472616e73616374696f6e20696e60408201526d31b63ab9b4b7b710383937b7b31760911b606082015260800190565b60208082526032908201527f436f6e7465787420626c6f636b206e756d626572206973206c6f77657220746860408201527130b7103630b9ba1039bab136b4ba3a32b21760711b606082015260800190565b6020808252601e908201527f496e76616c69642053657175656e636572207472616e73616374696f6e2e0000604082015260600190565b6020808252603d908201527f5472616e73616374696f6e20676173206c696d69742065786365656473206d6160408201527f78696d756d20666f7220726f6c6c7570207472616e73616374696f6e2e000000606082015260800190565b60208082526028908201527f4d7573742070726f76696465206174206c65617374206f6e652062617463682060408201526731b7b73a32bc3a1760c11b606082015260800190565b6020808252602e908201527f4e6f7420616c6c2073657175656e636572207472616e73616374696f6e73207760408201526d32b93290383937b1b2b9b9b2b21760911b606082015260800190565b6020808252604a908201527f41637475616c207472616e73616374696f6e20696e64657820646f6573206e6f60408201527f74206d6174636820657870656374656420746f74616c20656c656d656e7473206060820152693a379030b83832b7321760b11b608082015260a00190565b60208082526028908201527f436f6e7465787420626c6f636b206e756d6265722069732066726f6d2074686560408201526710333aba3ab9329760c11b606082015260800190565b60208082526018908201527f496e76616c696420696e636c7573696f6e2070726f6f662e0000000000000000604082015260600190565b60208082526029908201527f5472616e73616374696f6e20676173206c696d697420746f6f206c6f7720746f6040820152681032b738bab2bab29760b91b606082015260800190565b60208082526043908201527f53657175656e636572207472616e73616374696f6e2074696d657374616d702060408201527f657863656564732074686174206f66206e65787420717565756520656c656d65606082015262373a1760e91b608082015260a00190565b6020808252603d908201527f41637475616c20626174636820737461727420696e64657820646f6573206e6f60408201527f74206d6174636820657870656374656420737461727420696e6465782e000000606082015260800190565b6020808252602d908201527f46756e6374696f6e2063616e206f6e6c792062652063616c6c6564206279207460408201526c34329029b2b8bab2b731b2b91760991b606082015260800190565b6020808252601a908201527f496e76616c6964205175657565207472616e73616374696f6e2e000000000000604082015260600190565b60208082526015908201527424b73b30b634b2103130ba31b4103432b0b232b91760591b604082015260600190565b60208082526025908201527f436f6e746578742074696d657374616d702069732066726f6d207468652066756040820152643a3ab9329760d91b606082015260800190565b6020808252602b908201527f496e73756666696369656e742067617320666f72204c322072617465206c696d60408201526a34ba34b73390313ab9371760a91b606082015260800190565b60208082526035908201527f436f6e746578742074696d657374616d702076616c756573206d757374206d6f6040820152743737ba37b734b1b0b6363c9034b731b932b0b9b29760591b606082015260800190565b6020808252602a908201527f496e76616c6964205175657565207472616e73616374696f6e20696e636c757360408201526934b7b710383937b7b31760b11b606082015260800190565b60208082526045908201527f53657175656e636572207472616e73616374696f6e20626c6f636b4e756d626560408201527f7220657863656564732074686174206f66206e65787420717565756520656c6560608201526436b2b73a1760d91b608082015260a00190565b60208082526021908201527f4d75737420617070656e64206174206c65617374206f6e6520656c656d656e746040820152601760f91b606082015260800190565b60208082526026908201527f436f6e746578742074696d657374616d7020746f6f2066617220696e20746865604082015265103830b9ba1760d11b606082015260800190565b60208082526022908201527f4e6f7420656e6f756768204261746368436f6e74657874732070726f76696465604082015261321760f11b606082015260800190565b60208082526029908201527f4e6f7420656e6f75676820717565756564207472616e73616374696f6e732074604082015268379030b83832b7321760b91b606082015260800190565b60208082526037908201527f436f6e7465787420626c6f636b4e756d6265722076616c756573206d7573742060408201527f6d6f6e6f746f6e6963616c6c7920696e6372656173652e000000000000000000606082015260800190565b8151815260208083015164ffffffffff90811691830191909152604092830151169181019190915260600190565b63ffffffff91909116815260200190565b64ffffffffff91909116815260200190565b64ffffffffff9384168152919092166020820152604081019190915260600190565b60405181810167ffffffffffffffff81118282101715612edd57fe5b60405291905056fe4f564d5f436861696e53746f72616765436f6e7461696e65723a4354433a71756575654f564d5f4465636f6d7072657373696f6e507265636f6d70696c65416464726573734c69625f4d65726b6c65547265653a20496e646578206f7574206f6620626f756e64732e4c69625f4d65726b6c65547265653a2043616e6e6f7420636f6d70757465206365696c286c6f675f3229206f6620302e4c69625f4d65726b6c65547265653a20546f74616c206c6561766573206d7573742062652067726561746572207468616e207a65726f2e4c69625f4d65726b6c65547265653a20546f74616c207369626c696e677320646f6573206e6f7420636f72726563746c7920636f72726573706f6e6420746f20746f74616c206c65617665732e4f564d5f436861696e53746f72616765436f6e7461696e65723a4354433a626174636865734c69625f4d65726b6c65547265653a204d7573742070726f76696465206174206c65617374206f6e65206c65616620686173682ea2646970667358221220e5d77a6634733b27dcdabf781fd1df7c095b7f821616f55c1b31d62a7238f9d764736f6c63430007060033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101425760003560e01c8063876ed5cb116100b8578063cfdf677e1161007c578063cfdf677e1461023f578063d0f8934414610247578063e10d29ee1461024f578063e561dddc14610257578063f722b41a1461025f578063facdc5da1461026757610142565b8063876ed5cb146102175780638d38c6c11461021f578063b8f7700514610227578063c139eb151461022f578063c2cf696f1461023757610142565b80634de569ce1161010a5780634de569ce146101c25780635ae6256d146101e25780636fee07e0146101ea57806378f4b2f2146101ff5780637a167a8a146102075780637aa63a861461020f57610142565b8063138387a414610147578063299ca478146101655780632a7f18be1461017a578063378997701461019a578063461a4478146101af575b600080fd5b61014f61027a565b60405161015c91906124c7565b60405180910390f35b61016d610280565b60405161015c91906123eb565b61018d610188366004612388565b61028f565b60405161015c9190612e4e565b6101a26102b0565b60405161015c9190612e8d565b61016d6101bd36600461221b565b6102c4565b6101d56101d0366004612261565b6103a0565b60405161015c9190612484565b6101a26103da565b6101fd6101f8366004612188565b6103ee565b005b61014f61066d565b6101a2610674565b61014f610689565b61014f6106a4565b61014f6106aa565b6101a26106b0565b61014f6106c7565b61014f6106cd565b61016d6106d2565b6101fd6106f5565b61016d610b69565b61014f610b8c565b6101a2610c06565b6101fd610275366004612388565b610c1e565b60025481565b6000546001600160a01b031681565b610297611ed9565b6102a8826102a3610b69565b610c36565b90505b919050565b6000806102bb610d76565b50935050505090565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b8381101561032457818101518382015260200161030c565b50505050905090810190601f1680156103515780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561036e57600080fd5b505afa158015610382573d6000803e3d6000fd5b505050506040513d602081101561039857600080fd5b505192915050565b82516000901515600114156103c2576103bb85858585610e24565b90506103d2565b6103bb8585602001518585610fef565b949350505050565b6000806103e5610d76565b94505050505090565b61c3508151111561041a5760405162461bcd60e51b81526004016104119061259b565b60405180910390fd5b60035482111561043c5760405162461bcd60e51b8152600401610411906127a1565b620186a082101561045f5760405162461bcd60e51b815260040161041190612983565b6020820460005a90508181116104875760405162461bcd60e51b815260040161041190612b8a565b60005b825a8303101561049c5760010161048a565b6000338787876040516020016104b594939291906123ff565b60408051601f19818403018152919052805160209091012090504360281b421760006104df610b69565b60405163b298e36b60e01b81529091506001600160a01b0382169063b298e36b9061050e9086906004016124c7565b600060405180830381600087803b15801561052857600080fd5b505af115801561053c573d6000803e3d6000fd5b505060405163b298e36b60e01b81526001600160a01b038416925063b298e36b915061056c9085906004016124c7565b600060405180830381600087803b15801561058657600080fd5b505af115801561059a573d6000803e3d6000fd5b50505050600060016002836001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b1580156105dd57600080fd5b505afa1580156105f1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106159190612203565b8161061c57fe5b040390507f4b388aecf9fa6cc92253704e5975a6129a4f735bdbd99567df4ed0094ee4ceb5338b8b8b85426040516106599695949392919061243c565b60405180910390a150505050505050505050565b620186a081565b60008061067f610d76565b5090935050505090565b600080610694610d76565b50505064ffffffffff1692915050565b61c35081565b60035481565b60006106c26106bd610b69565b6110c4565b905090565b60015481565b602081565b60006106c2604051806060016040528060258152602001613003602591396102c4565b60043560d81c60093560e890811c90600c35901c610711610689565b8364ffffffffff16146107365760405162461bcd60e51b815260040161041190612a35565b6107646040518060400160405280600d81526020016c27ab26afa9b2b8bab2b731b2b960991b8152506102c4565b6001600160a01b0316336001600160a01b0316146107945760405162461bcd60e51b815260040161041190612a92565b60008162ffffff16116107b95760405162461bcd60e51b8152600401610411906127fe565b60008262ffffff16116107de5760405162461bcd60e51b815260040161041190612cdf565b600f601062ffffff8316020164ffffffffff81163610156108115760405162461bcd60e51b815260040161041190612d66565b600061081b610b69565b90506000610828826110c4565b9050600062ffffff8616368161083a57fe5b0460020267ffffffffffffffff8111801561085457600080fd5b506040519080825280601f01601f19166020018201604052801561087f576020820181803683370190505b50905060008662ffffff1667ffffffffffffffff811180156108a057600080fd5b506040519080825280602002602001820160405280156108ca578160200160208202803683370190505b50905060008060006108da610674565b90506108e4611ef9565b60005b8a62ffffff168163ffffffff161015610a3b57600061090b8263ffffffff16611147565b905063ffffffff82166109215761092181611197565b61092d8382868d611264565b80925060005b835163ffffffff821610156109b1578b3560e81c61c3508111156109695760405162461bcd60e51b81526004016104119061259b565b61097c858e64ffffffffff16838d6112cf565b898963ffffffff168151811061098e57fe5b60209081029190910101529b909b016003019a6001968701969586019501610933565b5060005b83602001518163ffffffff161015610a31578964ffffffffff168564ffffffffff16106109f45760405162461bcd60e51b815260040161041190612da8565b610a048564ffffffffff16611363565b888863ffffffff1681518110610a1657fe5b602090810291909101015260019687019694850194016109b5565b50506001016108e7565b50610a488183898b6113a8565b3664ffffffffff8a1614610a6e5760405162461bcd60e51b815260040161041190612846565b8a62ffffff168463ffffffff1614610a985760405162461bcd60e51b815260040161041190612894565b6000838c62ffffff160363ffffffff169050600080836020015160001415610acb57505060408201516060830151610af3565b6000610ae16001870364ffffffffff168d610c36565b90508060200151925080604001519150505b610b14610aff8961141b565b8f62ffffff168564ffffffffff16858561184f565b7f602f1aeac0ca2e7a13e281a9ef0ad7838542712ce16780fa2ecffd351f05f89983860384610b41610689565b604051610b5093929190612e9f565b60405180910390a1505050505050505050505050505050565b60006106c2604051806060016040528060238152602001612ee6602391396102c4565b6000610b966106d2565b6001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b158015610bce57600080fd5b505afa158015610be2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106c29190612203565b6000610c10610674565b610c186106b0565b03905090565b60405162461bcd60e51b81526004016104119061250b565b610c3e611ed9565b604051634a83e9cd60e11b815260028402906000906001600160a01b03851690639507d39a90610c72908590600401612e8d565b60206040518083038186803b158015610c8a57600080fd5b505afa158015610c9e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cc29190612203565b90506000846001600160a01b0316639507d39a846001016040518263ffffffff1660e01b8152600401610cf59190612e8d565b60206040518083038186803b158015610d0d57600080fd5b505afa158015610d21573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d459190612203565b6040805160608101825293845264ffffffffff828116602086015260289290921c9091169083015250949350505050565b6000806000806000610d866106d2565b6001600160a01b031663ccf8f9696040518163ffffffff1660e01b815260040160206040518083038186803b158015610dbe57600080fd5b505afa158015610dd2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610df691906121dd565b64ffffffffff602882901c811697605083901c82169750607883901c8216965060a09290921c169350915050565b600080610e5c6040518060400160405280601481526020017327ab26afa2bc32b1baba34b7b726b0b730b3b2b960611b8152506102c4565b90506000816001600160a01b0316631c4712a76040518163ffffffff1660e01b815260040160206040518083038186803b158015610e9957600080fd5b505afa158015610ead573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ed19190612203565b90506000610ede87611a02565b9050610eeb818787611a9b565b610f075760405162461bcd60e51b8152600401610411906126ca565b86606001518860200151148015610f22575060408701518851145b8015610f635750610f4a604051806060016040528060228152602001612f09602291396102c4565b6001600160a01b031688608001516001600160a01b0316145b8015610f725750818860a00151145b8015610f89575060608801516001600160a01b0316155b8015610fa45750600088604001516001811115610fa257fe5b145b8015610fc557508660800151805190602001208860c0015180519060200120145b610fe15760405162461bcd60e51b81526004016104119061276a565b506001979650505050505050565b600080610ffb85611363565b9050611008818585611a9b565b6110245760405162461bcd60e51b815260040161041190612c2a565b6000866060015187608001518860a001518960c0015160405160200161104d94939291906123ff565b60405160208183030381529060405280519060200120905060006110708761028f565b80519091508214801561108e57508751602082015164ffffffffff16145b80156110a857508760200151816040015164ffffffffff16145b610fe15760405162461bcd60e51b815260040161041190612adf565b60006002826001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b15801561110157600080fd5b505afa158015611115573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111399190612203565b8161114057fe5b0492915050565b61114f611ef9565b5060408051608081018252601092909202600f81013560e890811c84526012820135901c6020840152601581013560d890811c92840192909252601a0135901c606082015290565b60006111a1610689565b1115611211576000806111b2610d76565b9350935050508064ffffffffff16836060015110156111e35760405162461bcd60e51b815260040161041190612718565b8164ffffffffff168360400151101561120e5760405162461bcd60e51b8152600401610411906125f8565b50505b4260015482604001510110156112395760405162461bcd60e51b815260040161041190612d20565b4360025482606001510110156112615760405162461bcd60e51b815260040161041190612552565b50565b83604001518360400151101561128c5760405162461bcd60e51b815260040161041190612bd5565b8360600151836060015110156112b45760405162461bcd60e51b815260040161041190612df1565b6020830151156112c9576112c9838383611b8c565b50505050565b60008151836041011115611326578260410167ffffffffffffffff811180156112f757600080fd5b506040519080825280601f01601f191660200182016040528015611322576020820181803683370190505b5091505b6040850151606086015160006020850160018153836001820152826021820152866003890160418301376041870190209350505050949350505050565b60006102a86040518060a00160405280600015158152602001848152602001600081526020016000815260200160405180602001604052806000815250815250611c2d565b600083830364ffffffffff161180156113c357506020840151155b156113d3576113d3848483611b8c565b42846040015111156113f75760405162461bcd60e51b815260040161041190612b45565b43846060015111156112c95760405162461bcd60e51b815260040161041190612904565b60008082511161145c5760405162461bcd60e51b81526004018080602001828103825260348152602001806130286034913960400191505060405180910390fd5b815160011415611482578160008151811061147357fe5b602002602001015190506102ab565b60408051610200810182527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56381527f633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d60208201527f890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d818301527f3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd86060808301919091527fecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da60808301527fdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da560a08301527f617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d760c08301527f292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead60e08301527fe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e106101008301527f7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f826101208301527fe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e836365166101408301527f3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c6101608301527fad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e6101808301527fa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab6101a08301527f4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c8626101c08301527f2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf106101e083015282518381529081018352909160009190602082018180368337505085519192506000918291508180805b600184111561182b5750506002820460018084161460005b828110156117a7578a816002028151811061174e57fe5b602002602001015196508a816002026001018151811061176a57fe5b6020026020010151955086602089015285604089015287805190602001208b828151811061179457fe5b6020908102919091010152600101611737565b50801561180a578960018503815181106117bd57fe5b602002602001015195508783601081106117d357fe5b602002015160001b945085602088015284604088015286805190602001208a83815181106117fd57fe5b6020026020010181815250505b80611816576000611819565b60015b60ff168201935060019092019161171f565b8960008151811061183857fe5b602002602001015198505050505050505050919050565b60006118596106d2565b9050600080611866610d76565b50509150915060006040518060a00160405280856001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b1580156118b257600080fd5b505afa1580156118c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118ea9190612203565b81526020018a81526020018981526020018464ffffffffff16815260200160405180602001604052806000815250815250905080600001517f127186556e7be68c7e31263195225b4de02820707889540969f62c05cf73525e826020015183604001518460600151856080015160405161196794939291906124e6565b60405180910390a2600061197a82611c75565b90506000611992836040015186018a86018a8a611c9e565b60405163080549db60e21b81529091506001600160a01b03871690632015276c906119c390859085906004016124d0565b600060405180830381600087803b1580156119dd57600080fd5b505af11580156119f1573d6000803e3d6000fd5b505050505050505050505050505050565b6080810151805160009190826041820167ffffffffffffffff81118015611a2857600080fd5b506040519080825280601f01601f191660200182016040528015611a53576020820181803683370190505b5060408601516060870151919250906000602084016001815383600182015282602182015285604182018760208a0160045afa50604190950190942095505050505050919050565b6000611aa56106d2565b8351604051634a83e9cd60e11b81526001600160a01b039290921691639507d39a91611ad391600401612e7c565b60206040518083038186803b158015611aeb57600080fd5b505afa158015611aff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b239190612203565b611b2c84611c75565b14611b495760405162461bcd60e51b815260040161041190612b16565b611b66836020015185846000015185602001518760400151611cbd565b611b825760405162461bcd60e51b81526004016104119061294c565b5060019392505050565b6000611b9f8364ffffffffff1683610c36565b9050600154816020015164ffffffffff16014210611bcf5760405162461bcd60e51b815260040161041190612647565b806020015164ffffffffff1684604001511115611bfe5760405162461bcd60e51b8152600401610411906129cc565b806040015164ffffffffff16846060015111156112c95760405162461bcd60e51b815260040161041190612c74565b8051602080830151604080850151606086015160808701519251600096611c5896909594910161248f565b604051602081830303815290604052805190602001209050919050565b60008160200151826040015183606001518460800151604051602001611c5894939291906124e6565b602892831b9390931760509190911b1760789290921b91909117901b90565b6000808211611cfd5760405162461bcd60e51b8152600401808060200182810382526037815260200180612f7f6037913960400191505060405180910390fd5b818410611d3b5760405162461bcd60e51b8152600401808060200182810382526024815260200180612f2b6024913960400191505060405180910390fd5b611d4482611e42565b835114611d825760405162461bcd60e51b815260040180806020018281038252604d815260200180612fb6604d913960600191505060405180910390fd5b8460005b8451811015611e35578560011660011415611de457848181518110611da757fe5b6020026020010151826040516020018083815260200182815260200192505050604051602081830303815290604052805190602001209150611e29565b81858281518110611df157fe5b602002602001015160405160200180838152602001828152602001925050506040516020818303038152906040528051906020012091505b600195861c9501611d86565b5090951495945050505050565b6000808211611e825760405162461bcd60e51b8152600401808060200182810382526030815260200180612f4f6030913960400191505060405180910390fd5b8160011415611e93575060006102ab565b81600060805b60018110611ec3576000196001821b01811b831615611ebb5791821c91908101905b60011c611e99565b506001811b8414611ed2576001015b9392505050565b604080516060810182526000808252602082018190529181019190915290565b6040518060800160405280600081526020016000815260200160008152602001600081525090565b600067ffffffffffffffff831115611f3557fe5b611f48601f8401601f1916602001612ec1565b9050828152838383011115611f5c57600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b03811681146102ab57600080fd5b600082601f830112611f9a578081fd5b611ed283833560208501611f21565b8035600281106102ab57600080fd5b600060a08284031215611fc9578081fd5b60405160a0810167ffffffffffffffff8282108183111715611fe757fe5b8160405282935084358352602085013560208401526040850135604084015260608501356060840152608085013591508082111561202457600080fd5b5061203185828601611f8a565b6080830152505092915050565b60006040828403121561204f578081fd5b6040516040810167ffffffffffffffff828210818311171561206d57fe5b816040528293508435835260209150818501358181111561208d57600080fd5b8501601f8101871361209e57600080fd5b8035828111156120aa57fe5b83810292506120ba848401612ec1565b8181528481019083860185850187018b10156120d557600080fd5b600095505b838610156120f85780358352600195909501949186019186016120da565b5080868801525050505050505092915050565b600060a0828403121561211c578081fd5b60405160a0810167ffffffffffffffff828210818311171561213a57fe5b8160405282935084359150811515821461215357600080fd5b818352602085013560208401526040850135604084015260608501356060840152608085013591508082111561202457600080fd5b60008060006060848603121561219c578283fd5b6121a584611f73565b925060208401359150604084013567ffffffffffffffff8111156121c7578182fd5b6121d386828701611f8a565b9150509250925092565b6000602082840312156121ee578081fd5b815164ffffffffff1981168114611ed2578182fd5b600060208284031215612214578081fd5b5051919050565b60006020828403121561222c578081fd5b813567ffffffffffffffff811115612242578182fd5b8201601f81018413612252578182fd5b6103d284823560208401611f21565b60008060008060808587031215612276578081fd5b843567ffffffffffffffff8082111561228d578283fd5b9086019060e082890312156122a0578283fd5b6122aa60e0612ec1565b82358152602083013560208201526122c460408401611fa9565b60408201526122d560608401611f73565b60608201526122e660808401611f73565b608082015260a083013560a082015260c083013582811115612306578485fd5b6123128a828601611f8a565b60c0830152509550602087013591508082111561232d578283fd5b6123398883890161210b565b9450604087013591508082111561234e578283fd5b61235a88838901611fb8565b9350606087013591508082111561236f578283fd5b5061237c8782880161203e565b91505092959194509250565b600060208284031215612399578081fd5b5035919050565b60008151808452815b818110156123c5576020818501810151868301820152016123a9565b818111156123d65782602083870101525b50601f01601f19169290920160200192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612432908301846123a0565b9695505050505050565b6001600160a01b038781168252861660208201526040810185905260c06060820181905260009061246f908301866123a0565b60808301949094525060a00152949350505050565b901515815260200190565b6000861515825285602083015284604083015283606083015260a060808301526124bc60a08301846123a0565b979650505050505050565b90815260200190565b91825264ffffffffff1916602082015260400190565b60008582528460208301528360408301526080606083015261243260808301846123a0565b60208082526027908201527f617070656e64517565756542617463682069732063757272656e746c7920646960408201526639b0b13632b21760c91b606082015260800190565b60208082526029908201527f436f6e7465787420626c6f636b206e756d62657220746f6f2066617220696e206040820152683a3432903830b9ba1760b91b606082015260800190565b6020808252603d908201527f5472616e73616374696f6e20646174612073697a652065786365656473206d6160408201527f78696d756d20666f7220726f6c6c7570207472616e73616374696f6e2e000000606082015260800190565b6020808252602f908201527f436f6e746578742074696d657374616d70206973206c6f776572207468616e2060408201526e3630b9ba1039bab136b4ba3a32b21760891b606082015260800190565b6020808252605b908201527f50726576696f75736c7920656e7175657565642062617463686573206861766560408201527f206578706972656420616e64206d75737420626520617070656e64656420626560608201527f666f72652061206e65772073657175656e6365722062617463682e0000000000608082015260a00190565b6020808252602e908201527f496e76616c69642053657175656e636572207472616e73616374696f6e20696e60408201526d31b63ab9b4b7b710383937b7b31760911b606082015260800190565b60208082526032908201527f436f6e7465787420626c6f636b206e756d626572206973206c6f77657220746860408201527130b7103630b9ba1039bab136b4ba3a32b21760711b606082015260800190565b6020808252601e908201527f496e76616c69642053657175656e636572207472616e73616374696f6e2e0000604082015260600190565b6020808252603d908201527f5472616e73616374696f6e20676173206c696d69742065786365656473206d6160408201527f78696d756d20666f7220726f6c6c7570207472616e73616374696f6e2e000000606082015260800190565b60208082526028908201527f4d7573742070726f76696465206174206c65617374206f6e652062617463682060408201526731b7b73a32bc3a1760c11b606082015260800190565b6020808252602e908201527f4e6f7420616c6c2073657175656e636572207472616e73616374696f6e73207760408201526d32b93290383937b1b2b9b9b2b21760911b606082015260800190565b6020808252604a908201527f41637475616c207472616e73616374696f6e20696e64657820646f6573206e6f60408201527f74206d6174636820657870656374656420746f74616c20656c656d656e7473206060820152693a379030b83832b7321760b11b608082015260a00190565b60208082526028908201527f436f6e7465787420626c6f636b206e756d6265722069732066726f6d2074686560408201526710333aba3ab9329760c11b606082015260800190565b60208082526018908201527f496e76616c696420696e636c7573696f6e2070726f6f662e0000000000000000604082015260600190565b60208082526029908201527f5472616e73616374696f6e20676173206c696d697420746f6f206c6f7720746f6040820152681032b738bab2bab29760b91b606082015260800190565b60208082526043908201527f53657175656e636572207472616e73616374696f6e2074696d657374616d702060408201527f657863656564732074686174206f66206e65787420717565756520656c656d65606082015262373a1760e91b608082015260a00190565b6020808252603d908201527f41637475616c20626174636820737461727420696e64657820646f6573206e6f60408201527f74206d6174636820657870656374656420737461727420696e6465782e000000606082015260800190565b6020808252602d908201527f46756e6374696f6e2063616e206f6e6c792062652063616c6c6564206279207460408201526c34329029b2b8bab2b731b2b91760991b606082015260800190565b6020808252601a908201527f496e76616c6964205175657565207472616e73616374696f6e2e000000000000604082015260600190565b60208082526015908201527424b73b30b634b2103130ba31b4103432b0b232b91760591b604082015260600190565b60208082526025908201527f436f6e746578742074696d657374616d702069732066726f6d207468652066756040820152643a3ab9329760d91b606082015260800190565b6020808252602b908201527f496e73756666696369656e742067617320666f72204c322072617465206c696d60408201526a34ba34b73390313ab9371760a91b606082015260800190565b60208082526035908201527f436f6e746578742074696d657374616d702076616c756573206d757374206d6f6040820152743737ba37b734b1b0b6363c9034b731b932b0b9b29760591b606082015260800190565b6020808252602a908201527f496e76616c6964205175657565207472616e73616374696f6e20696e636c757360408201526934b7b710383937b7b31760b11b606082015260800190565b60208082526045908201527f53657175656e636572207472616e73616374696f6e20626c6f636b4e756d626560408201527f7220657863656564732074686174206f66206e65787420717565756520656c6560608201526436b2b73a1760d91b608082015260a00190565b60208082526021908201527f4d75737420617070656e64206174206c65617374206f6e6520656c656d656e746040820152601760f91b606082015260800190565b60208082526026908201527f436f6e746578742074696d657374616d7020746f6f2066617220696e20746865604082015265103830b9ba1760d11b606082015260800190565b60208082526022908201527f4e6f7420656e6f756768204261746368436f6e74657874732070726f76696465604082015261321760f11b606082015260800190565b60208082526029908201527f4e6f7420656e6f75676820717565756564207472616e73616374696f6e732074604082015268379030b83832b7321760b91b606082015260800190565b60208082526037908201527f436f6e7465787420626c6f636b4e756d6265722076616c756573206d7573742060408201527f6d6f6e6f746f6e6963616c6c7920696e6372656173652e000000000000000000606082015260800190565b8151815260208083015164ffffffffff90811691830191909152604092830151169181019190915260600190565b63ffffffff91909116815260200190565b64ffffffffff91909116815260200190565b64ffffffffff9384168152919092166020820152604081019190915260600190565b60405181810167ffffffffffffffff81118282101715612edd57fe5b60405291905056fe4f564d5f436861696e53746f72616765436f6e7461696e65723a4354433a71756575654f564d5f4465636f6d7072657373696f6e507265636f6d70696c65416464726573734c69625f4d65726b6c65547265653a20496e646578206f7574206f6620626f756e64732e4c69625f4d65726b6c65547265653a2043616e6e6f7420636f6d70757465206365696c286c6f675f3229206f6620302e4c69625f4d65726b6c65547265653a20546f74616c206c6561766573206d7573742062652067726561746572207468616e207a65726f2e4c69625f4d65726b6c65547265653a20546f74616c207369626c696e677320646f6573206e6f7420636f72726563746c7920636f72726573706f6e6420746f20746f74616c206c65617665732e4f564d5f436861696e53746f72616765436f6e7461696e65723a4354433a626174636865734c69625f4d65726b6c65547265653a204d7573742070726f76696465206174206c65617374206f6e65206c65616620686173682ea2646970667358221220e5d77a6634733b27dcdabf781fd1df7c095b7f821616f55c1b31d62a7238f9d764736f6c63430007060033", "devdoc": { "details": "The Canonical Transaction Chain (CTC) contract is an append-only log of transactions which must be applied to the rollup state. It defines the ordering of rollup transactions by writing them to the 'CTC:batches' instance of the Chain Storage Container. The CTC also allows any account to 'enqueue' an L2 transaction, which will require that the Sequencer will eventually append it to the rollup state. If the Sequencer does not include an enqueued transaction within the 'force inclusion period', then any account may force it to be included by calling appendQueueBatch(). Compiler used: solc Runtime target: EVM", "kind": "dev", @@ -694,6 +694,14 @@ "_0": "Reference to the queue storage container." } }, + "resolve(string)": { + "params": { + "_name": "Name to resolve an address for." + }, + "returns": { + "_0": "Address associated with the given name." + } + }, "verifyTransaction((uint256,uint256,uint8,address,address,uint256,bytes),(bool,uint256,uint256,uint256,bytes),(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))": { "params": { "_batchHeader": "Header of the batch the transaction was included in.", @@ -751,6 +759,9 @@ "queue()": { "notice": "Accesses the queue storage container." }, + "resolve(string)": { + "notice": "Resolves the address associated with a given name." + }, "verifyTransaction((uint256,uint256,uint8,address,address,uint256,bytes),(bool,uint256,uint256,uint256,bytes),(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))": { "notice": "Verifies whether a transaction is included in the chain." } @@ -760,15 +771,15 @@ "storageLayout": { "storage": [ { - "astId": 12526, + "astId": 12800, "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_CanonicalTransactionChain.sol:OVM_CanonicalTransactionChain", "label": "libAddressManager", "offset": 0, "slot": "0", - "type": "t_contract(Lib_AddressManager)12519" + "type": "t_contract(Lib_AddressManager)12793" }, { - "astId": 2249, + "astId": 2943, "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_CanonicalTransactionChain.sol:OVM_CanonicalTransactionChain", "label": "forceInclusionPeriodSeconds", "offset": 0, @@ -776,7 +787,7 @@ "type": "t_uint256" }, { - "astId": 2251, + "astId": 2945, "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_CanonicalTransactionChain.sol:OVM_CanonicalTransactionChain", "label": "forceInclusionPeriodBlocks", "offset": 0, @@ -784,7 +795,7 @@ "type": "t_uint256" }, { - "astId": 2253, + "astId": 2947, "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_CanonicalTransactionChain.sol:OVM_CanonicalTransactionChain", "label": "maxTransactionGasLimit", "offset": 0, @@ -793,7 +804,7 @@ } ], "types": { - "t_contract(Lib_AddressManager)12519": { + "t_contract(Lib_AddressManager)12793": { "encoding": "inplace", "label": "contract Lib_AddressManager", "numberOfBytes": "20" diff --git a/packages/contracts/deployments/kovan/OVM_ChainStorageContainer-CTC-batches.json b/packages/contracts/deployments/kovan/OVM_ChainStorageContainer-CTC-batches.json deleted file mode 100644 index 5ad39b8e0bc30..0000000000000 --- a/packages/contracts/deployments/kovan/OVM_ChainStorageContainer-CTC-batches.json +++ /dev/null @@ -1,442 +0,0 @@ -{ - "address": "0x18bA855471f10B74851C0e133db597075Dff128d", - "abi": [ - { - "inputs": [ - { - "internalType": "address", - "name": "_libAddressManager", - "type": "address" - }, - { - "internalType": "string", - "name": "_owner", - "type": "string" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_index", - "type": "uint256" - }, - { - "internalType": "bytes27", - "name": "_globalMetadata", - "type": "bytes27" - } - ], - "name": "deleteElementsAfterInclusive", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_index", - "type": "uint256" - } - ], - "name": "deleteElementsAfterInclusive", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_index", - "type": "uint256" - } - ], - "name": "get", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getGlobalMetadata", - "outputs": [ - { - "internalType": "bytes27", - "name": "", - "type": "bytes27" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "length", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "libAddressManager", - "outputs": [ - { - "internalType": "contract Lib_AddressManager", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "owner", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "_object", - "type": "bytes32" - }, - { - "internalType": "bytes27", - "name": "_globalMetadata", - "type": "bytes27" - } - ], - "name": "push", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "_object", - "type": "bytes32" - } - ], - "name": "push", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "string", - "name": "_name", - "type": "string" - } - ], - "name": "resolve", - "outputs": [ - { - "internalType": "address", - "name": "_contract", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes27", - "name": "_globalMetadata", - "type": "bytes27" - } - ], - "name": "setGlobalMetadata", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_index", - "type": "uint256" - } - ], - "name": "setNextOverwritableIndex", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - } - ], - "transactionHash": "0x9aa3cdc8392330d8788d6f3e5ab1f9d90548e3ae331878388a2fae27ad840cfe", - "receipt": { - "to": null, - "from": "0x18394B52d3Cb931dfA76F63251919D051953413d", - "contractAddress": "0x18bA855471f10B74851C0e133db597075Dff128d", - "transactionIndex": 0, - "gasUsed": "959533", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0x5988dbd770a2d9178bcf597a93c14b9e91ec6c2150bd3d5e6ae0b713a5b4a92f", - "transactionHash": "0x9aa3cdc8392330d8788d6f3e5ab1f9d90548e3ae331878388a2fae27ad840cfe", - "logs": [], - "blockNumber": 24199471, - "cumulativeGasUsed": "959533", - "status": 1, - "byzantium": true - }, - "args": [ - "0xFaf27b24ba54C6910C12CFF5C9453C0e8D634e05", - "OVM_CanonicalTransactionChain" - ], - "solcInputHash": "03aed03b958b1d37f90bd88d0f56dd85", - "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_owner\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"get\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getGlobalMetadata\",\"outputs\":[{\"internalType\":\"bytes27\",\"name\":\"\",\"type\":\"bytes27\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"length\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"_contract\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"setGlobalMetadata\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"setNextOverwritableIndex\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The Chain Storage Container provides its owner contract with read, write and delete functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which can no longer be used in a fraud proof due to the fraud window having passed, and the associated chain state or transactions being finalized. Three distinct Chain Storage Containers will be deployed on Layer 1: 1. Stores transaction batches for the Canonical Transaction Chain 2. Stores queued transactions for the Canonical Transaction Chain 3. Stores chain state batches for the State Commitment Chain Compiler used: solc Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\",\"_owner\":\"Name of the contract that owns this container (will be resolved later).\"}},\"deleteElementsAfterInclusive(uint256)\":{\"params\":{\"_index\":\"Object index to delete from.\"}},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_index\":\"Object index to delete from.\"}},\"get(uint256)\":{\"params\":{\"_index\":\"Index of the particular object to access.\"},\"returns\":{\"_0\":\"32 byte object value.\"}},\"getGlobalMetadata()\":{\"returns\":{\"_0\":\"Container global metadata field.\"}},\"length()\":{\"returns\":{\"_0\":\"Number of objects in the container.\"}},\"push(bytes32)\":{\"params\":{\"_object\":\"A 32 byte value to insert into the container.\"}},\"push(bytes32,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_object\":\"A 32 byte value to insert into the container.\"}},\"setGlobalMetadata(bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata to set.\"}}},\"title\":\"OVM_ChainStorageContainer\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"deleteElementsAfterInclusive(uint256)\":{\"notice\":\"Removes all objects after and including a given index.\"},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"notice\":\"Removes all objects after and including a given index. Also allows setting the global metadata field.\"},\"get(uint256)\":{\"notice\":\"Retrieves an object from the container.\"},\"getGlobalMetadata()\":{\"notice\":\"Retrieves the container's global metadata field.\"},\"length()\":{\"notice\":\"Retrieves the number of objects stored in the container.\"},\"push(bytes32)\":{\"notice\":\"Pushes an object into the container.\"},\"push(bytes32,bytes27)\":{\"notice\":\"Pushes an object into the container. Function allows setting the global metadata since we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global metadata (it's an optimization).\"},\"setGlobalMetadata(bytes27)\":{\"notice\":\"Sets the container's global metadata field. We're using `bytes27` here because we use five bytes to maintain the length of the underlying data structure, meaning we have an extra 27 bytes to store arbitrary data.\"},\"setNextOverwritableIndex(uint256)\":{\"notice\":\"Marks an index as overwritable, meaing the underlying buffer can start to write values over any objects before and including the given index.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol\":\"OVM_ChainStorageContainer\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_RingBuffer } from \\\"../../libraries/utils/Lib_RingBuffer.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_ChainStorageContainer } from \\\"../../iOVM/chain/iOVM_ChainStorageContainer.sol\\\";\\n\\n/**\\n * @title OVM_ChainStorageContainer\\n * @dev The Chain Storage Container provides its owner contract with read, write and delete functionality.\\n * This provides gas efficiency gains by enabling it to overwrite storage slots which can no longer be used\\n * in a fraud proof due to the fraud window having passed, and the associated chain state or\\n * transactions being finalized.\\n * Three distinct Chain Storage Containers will be deployed on Layer 1:\\n * 1. Stores transaction batches for the Canonical Transaction Chain\\n * 2. Stores queued transactions for the Canonical Transaction Chain\\n * 3. Stores chain state batches for the State Commitment Chain\\n *\\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract OVM_ChainStorageContainer is iOVM_ChainStorageContainer, Lib_AddressResolver {\\n\\n /*************\\n * Libraries *\\n *************/\\n\\n using Lib_RingBuffer for Lib_RingBuffer.RingBuffer;\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n string public owner;\\n Lib_RingBuffer.RingBuffer internal buffer;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n * @param _owner Name of the contract that owns this container (will be resolved later).\\n */\\n constructor(\\n address _libAddressManager,\\n string memory _owner\\n )\\n Lib_AddressResolver(_libAddressManager)\\n {\\n owner = _owner;\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n msg.sender == resolve(owner),\\n \\\"OVM_ChainStorageContainer: Function can only be called by the owner.\\\"\\n );\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function setGlobalMetadata(\\n bytes27 _globalMetadata\\n )\\n override\\n public\\n onlyOwner\\n {\\n return buffer.setExtraData(_globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function getGlobalMetadata()\\n override\\n public\\n view\\n returns (\\n bytes27\\n )\\n {\\n return buffer.getExtraData();\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function length()\\n override\\n public\\n view\\n returns (\\n uint256\\n )\\n {\\n return uint256(buffer.getLength());\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function push(\\n bytes32 _object\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.push(_object);\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function push(\\n bytes32 _object,\\n bytes27 _globalMetadata\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.push(_object, _globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function get(\\n uint256 _index\\n )\\n override\\n public\\n view\\n returns (\\n bytes32\\n )\\n {\\n return buffer.get(uint40(_index));\\n }\\n \\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.deleteElementsAfterInclusive(\\n uint40(_index)\\n );\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index,\\n bytes27 _globalMetadata\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.deleteElementsAfterInclusive(\\n uint40(_index),\\n _globalMetadata\\n );\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function setNextOverwritableIndex(\\n uint256 _index\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.nextOverwritableIndex = _index;\\n }\\n}\\n\",\"keccak256\":\"0x52e3ef7166fe134d32997917067e3d74128173b12fb6231eec34132102ddbb50\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_ChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title iOVM_ChainStorageContainer\\n */\\ninterface iOVM_ChainStorageContainer {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata()\\n external\\n view\\n returns (\\n bytes27\\n );\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length()\\n external\\n view\\n returns (\\n uint256\\n );\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(\\n bytes32 _object\\n )\\n external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(\\n bytes32 _object,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(\\n uint256 _index\\n )\\n external\\n view\\n returns (\\n bytes32\\n );\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index\\n )\\n external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Marks an index as overwritable, meaing the underlying buffer can start to write values over\\n * any objects before and including the given index.\\n */\\n function setNextOverwritableIndex(\\n uint256 _index\\n )\\n external;\\n}\\n\",\"keccak256\":\"0x2d7973a0ad84c23ec62624d3f1e3aeb198cc72686ff1e6cfa17155556b320c94\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Contract Imports */\\nimport { Ownable } from \\\"./Lib_Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n /*******************************************\\n * Contract Variables: Internal Accounting *\\n *******************************************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n public\\n onlyOwner\\n {\\n emit AddressSet(_name, _address);\\n addresses[_getNameHash(_name)] = _address;\\n }\\n\\n function getAddress(\\n string memory _name\\n )\\n public\\n view\\n returns (address)\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32 _hash\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0x3a490595cc21ff170e4027843093670ff845d5972481fbfb956b722ea564bb06\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n\\n /*******************************************\\n * Contract Variables: Contract References *\\n *******************************************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(\\n address _libAddressManager\\n ) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function resolve(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address _contract\\n )\\n {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0xaa3ed342f6deb156c660fd83afa579a3b80db17eb465e8949cf5c1b114780143\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Ownable\\n * @dev Adapted from https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol\\n */\\nabstract contract Ownable {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n address public owner;\\n\\n\\n /**********\\n * Events *\\n **********/\\n\\n event OwnershipTransferred(\\n address indexed previousOwner,\\n address indexed newOwner\\n );\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n constructor() {\\n owner = msg.sender;\\n emit OwnershipTransferred(address(0), owner);\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n owner == msg.sender,\\n \\\"Ownable: caller is not the owner\\\"\\n );\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function renounceOwnership()\\n public\\n virtual\\n onlyOwner\\n {\\n emit OwnershipTransferred(owner, address(0));\\n owner = address(0);\\n }\\n\\n function transferOwnership(address _newOwner)\\n public\\n virtual\\n onlyOwner\\n {\\n require(\\n _newOwner != address(0),\\n \\\"Ownable: new owner cannot be the zero address\\\"\\n );\\n\\n emit OwnershipTransferred(owner, _newOwner);\\n owner = _newOwner;\\n }\\n}\\n\",\"keccak256\":\"0xd9dfd9264e5b5fedd53a5b10fdf179c3f367614b0fe69179bce4e45119f5b739\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_RingBuffer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\nlibrary Lib_RingBuffer {\\n using Lib_RingBuffer for RingBuffer;\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Buffer {\\n uint256 length;\\n mapping (uint256 => bytes32) buf;\\n }\\n\\n struct RingBuffer {\\n bytes32 contextA;\\n bytes32 contextB;\\n Buffer bufferA;\\n Buffer bufferB;\\n uint256 nextOverwritableIndex;\\n }\\n\\n struct RingBufferContext {\\n // contextA\\n uint40 globalIndex;\\n bytes27 extraData;\\n\\n // contextB\\n uint64 currBufferIndex;\\n uint40 prevResetIndex;\\n uint40 currResetIndex;\\n }\\n\\n\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 constant MIN_CAPACITY = 16;\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n * @param _extraData Optional global extra data.\\n */\\n function push(\\n RingBuffer storage _self,\\n bytes32 _value,\\n bytes27 _extraData\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n Buffer storage currBuffer = _self.getBuffer(ctx.currBufferIndex);\\n\\n // Set a minimum capacity.\\n if (currBuffer.length == 0) {\\n currBuffer.length = MIN_CAPACITY;\\n }\\n\\n // Check if we need to expand the buffer.\\n if (ctx.globalIndex - ctx.currResetIndex >= currBuffer.length) {\\n if (ctx.currResetIndex < _self.nextOverwritableIndex) {\\n // We're going to overwrite the inactive buffer.\\n // Bump the buffer index, reset the delete offset, and set our reset indices.\\n ctx.currBufferIndex++;\\n ctx.prevResetIndex = ctx.currResetIndex;\\n ctx.currResetIndex = ctx.globalIndex;\\n\\n // Swap over to the next buffer.\\n currBuffer = _self.getBuffer(ctx.currBufferIndex);\\n } else {\\n // We're not overwriting yet, double the length of the current buffer.\\n currBuffer.length *= 2;\\n }\\n }\\n\\n // Index to write to is the difference of the global and reset indices.\\n uint256 writeHead = ctx.globalIndex - ctx.currResetIndex;\\n currBuffer.buf[writeHead] = _value;\\n\\n // Bump the global index and insert our extra data, then save the context.\\n ctx.globalIndex++;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n */\\n function push(\\n RingBuffer storage _self,\\n bytes32 _value\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n \\n _self.push(\\n _value,\\n ctx.extraData\\n );\\n }\\n\\n /**\\n * Retrieves an element from the buffer.\\n * @param _self Buffer to access.\\n * @param _index Element index to retrieve.\\n * @return Value of the element at the given index.\\n */\\n function get(\\n RingBuffer storage _self,\\n uint256 _index\\n )\\n internal\\n view\\n returns (\\n bytes32 \\n )\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n\\n require(\\n _index < ctx.globalIndex,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n Buffer storage currBuffer = _self.getBuffer(ctx.currBufferIndex);\\n Buffer storage prevBuffer = _self.getBuffer(ctx.currBufferIndex + 1);\\n\\n if (_index >= ctx.currResetIndex) {\\n // We're trying to load an element from the current buffer.\\n // Relative index is just the difference from the reset index.\\n uint256 relativeIndex = _index - ctx.currResetIndex;\\n\\n // Shouldn't happen but why not check.\\n require(\\n relativeIndex < currBuffer.length,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n return currBuffer.buf[relativeIndex];\\n } else {\\n // We're trying to load an element from the previous buffer.\\n // Relative index is the difference from the reset index in the other direction.\\n uint256 relativeIndex = ctx.currResetIndex - _index;\\n\\n // Condition only fails in the case that we deleted and flipped buffers.\\n require(\\n ctx.currResetIndex > ctx.prevResetIndex,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n // Make sure we're not trying to read beyond the array.\\n require(\\n relativeIndex <= prevBuffer.length,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n return prevBuffer.buf[prevBuffer.length - relativeIndex];\\n }\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n * @param _extraData Optional global extra data.\\n */\\n function deleteElementsAfterInclusive(\\n RingBuffer storage _self,\\n uint40 _index,\\n bytes27 _extraData\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n\\n require(\\n _index < ctx.globalIndex && _index >= ctx.prevResetIndex,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n if (_index < ctx.currResetIndex) {\\n // We're switching back to the previous buffer.\\n // Reduce the buffer index, set the current reset index back to match the previous one.\\n // We use the equality of these two values to prevent reading beyond this buffer.\\n ctx.currBufferIndex--;\\n ctx.currResetIndex = ctx.prevResetIndex;\\n }\\n\\n // Set our global index and extra data, save the context.\\n ctx.globalIndex = _index;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n */\\n function deleteElementsAfterInclusive(\\n RingBuffer storage _self,\\n uint40 _index\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n _self.deleteElementsAfterInclusive(\\n _index,\\n ctx.extraData\\n );\\n }\\n\\n /**\\n * Retrieves the current global index.\\n * @param _self Buffer to access.\\n * @return Current global index.\\n */\\n function getLength(\\n RingBuffer storage _self\\n )\\n internal\\n view\\n returns (\\n uint40\\n )\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n return ctx.globalIndex;\\n }\\n\\n /**\\n * Changes current global extra data.\\n * @param _self Buffer to access.\\n * @param _extraData New global extra data.\\n */\\n function setExtraData(\\n RingBuffer storage _self,\\n bytes27 _extraData\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Retrieves the current global extra data.\\n * @param _self Buffer to access.\\n * @return Current global extra data.\\n */\\n function getExtraData(\\n RingBuffer storage _self\\n )\\n internal\\n view\\n returns (\\n bytes27\\n )\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n return ctx.extraData;\\n }\\n\\n /**\\n * Sets the current ring buffer context.\\n * @param _self Buffer to access.\\n * @param _ctx Current ring buffer context.\\n */\\n function setContext(\\n RingBuffer storage _self,\\n RingBufferContext memory _ctx\\n )\\n internal\\n {\\n bytes32 contextA;\\n bytes32 contextB;\\n\\n uint40 globalIndex = _ctx.globalIndex;\\n bytes27 extraData = _ctx.extraData;\\n assembly {\\n contextA := globalIndex\\n contextA := or(contextA, extraData)\\n }\\n\\n uint64 currBufferIndex = _ctx.currBufferIndex;\\n uint40 prevResetIndex = _ctx.prevResetIndex;\\n uint40 currResetIndex = _ctx.currResetIndex;\\n assembly {\\n contextB := currBufferIndex\\n contextB := or(contextB, shl(64, prevResetIndex))\\n contextB := or(contextB, shl(104, currResetIndex))\\n }\\n\\n if (_self.contextA != contextA) {\\n _self.contextA = contextA;\\n }\\n\\n if (_self.contextB != contextB) {\\n _self.contextB = contextB;\\n }\\n }\\n\\n /**\\n * Retrieves the current ring buffer context.\\n * @param _self Buffer to access.\\n * @return Current ring buffer context.\\n */\\n function getContext(\\n RingBuffer storage _self\\n )\\n internal\\n view\\n returns (\\n RingBufferContext memory\\n )\\n {\\n bytes32 contextA = _self.contextA;\\n bytes32 contextB = _self.contextB;\\n\\n uint40 globalIndex;\\n bytes27 extraData;\\n assembly {\\n globalIndex := and(contextA, 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF)\\n extraData := and(contextA, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000)\\n }\\n\\n uint64 currBufferIndex;\\n uint40 prevResetIndex;\\n uint40 currResetIndex;\\n assembly {\\n currBufferIndex := and(contextB, 0x000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF)\\n prevResetIndex := shr(64, and(contextB, 0x00000000000000000000000000000000000000FFFFFFFFFF0000000000000000))\\n currResetIndex := shr(104, and(contextB, 0x0000000000000000000000000000FFFFFFFFFF00000000000000000000000000))\\n }\\n\\n return RingBufferContext({\\n globalIndex: globalIndex,\\n extraData: extraData,\\n currBufferIndex: currBufferIndex,\\n prevResetIndex: prevResetIndex,\\n currResetIndex: currResetIndex\\n });\\n }\\n\\n /**\\n * Retrieves the a buffer from the ring buffer by index.\\n * @param _self Buffer to access.\\n * @param _which Index of the sub buffer to access.\\n * @return Sub buffer for the index.\\n */\\n function getBuffer(\\n RingBuffer storage _self,\\n uint256 _which\\n )\\n internal\\n view\\n returns (\\n Buffer storage\\n )\\n {\\n return _which % 2 == 0 ? _self.bufferA : _self.bufferB;\\n }\\n}\\n\",\"keccak256\":\"0xb38cb98da2d09f922d5cfe772bdbd36ede2b2267ade93128e949c9da21b89940\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x60806040523480156200001157600080fd5b506040516200116438038062001164833981810160405260408110156200003757600080fd5b8151602083018051604051929492938301929190846401000000008211156200005f57600080fd5b9083019060208201858111156200007557600080fd5b82516401000000008111828201881017156200009057600080fd5b82525081516020918201929091019080838360005b83811015620000bf578181015183820152602001620000a5565b50505050905090810190601f168015620000ed5780820380516001836020036101000a031916815260200191505b506040525050600080546001600160a01b0319166001600160a01b038516179055508051620001249060019060208401906200012d565b505050620001d9565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282620001655760008555620001b0565b82601f106200018057805160ff1916838001178555620001b0565b82800160010185558215620001b0579182015b82811115620001b057825182559160200191906001019062000193565b50620001be929150620001c2565b5090565b5b80821115620001be5760008155600101620001c3565b610f7b80620001e96000396000f3fe608060405234801561001057600080fd5b50600436106100b45760003560e01c80634651d91e116100715780634651d91e1461021a5780638da5cb5b146102375780639507d39a146102b4578063b298e36b146102d1578063ccf8f969146102ee578063fa9e936c14610311576100b4565b8063167fd681146100b95780631f7b6d32146100e65780632015276c1461010057806329061de21461012b578063299ca47814610150578063461a447814610174575b600080fd5b6100e4600480360360408110156100cf57600080fd5b508035906020013564ffffffffff191661032e565b005b6100ee610423565b60408051918252519081900360200190f35b6100e46004803603604081101561011657600080fd5b508035906020013564ffffffffff191661043b565b6100e46004803603602081101561014157600080fd5b503564ffffffffff19166104f7565b6101586105b5565b604080516001600160a01b039092168252519081900360200190f35b6101586004803603602081101561018a57600080fd5b8101906020810181356401000000008111156101a557600080fd5b8201836020820111156101b757600080fd5b803590602001918460018302840111640100000000831117156101d957600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506105c4945050505050565b6100e46004803603602081101561023057600080fd5b50356106a0565b61023f61075b565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610279578181015183820152602001610261565b50505050905090810190601f1680156102a65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6100ee600480360360208110156102ca57600080fd5b50356107e8565b6100e4600480360360208110156102e757600080fd5b5035610802565b6102f66108bd565b6040805164ffffffffff199092168252519081900360200190f35b6100e46004803603602081101561032757600080fd5b50356108ce565b60018054604080516020601f6002600019610100878916150201909516949094049384018190048102820181019092528281526103c493909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b820191906000526020600020905b81548152906001019060200180831161039d57829003601f168201915b50505050506105c4565b6001600160a01b0316336001600160a01b0316146104135760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b61041f60028383610983565b5050565b600061042f6002610a75565b64ffffffffff16905090565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261049c93909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146104eb5760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b61041f60028383610a89565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261055893909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146105a75760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b6105b2600282610b90565b50565b6000546001600160a01b031681565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b8381101561062457818101518382015260200161060c565b50505050905090810190601f1680156106515780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561066e57600080fd5b505afa158015610682573d6000803e3d6000fd5b505050506040513d602081101561069857600080fd5b505192915050565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261070193909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146107505760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b6105b2600282610bba565b60018054604080516020600284861615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156107e05780601f106107b5576101008083540402835291602001916107e0565b820191906000526020600020905b8154815290600101906020018083116107c357829003601f168201915b505050505081565b60006107fc600264ffffffffff8416610be0565b92915050565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261086393909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146108b25760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b6105b2600282610de9565b60006108c96002610e0f565b905090565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261092f93909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b03161461097e5760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b600855565b600061098e84610e26565b9050806000015164ffffffffff168364ffffffffff161080156109c35750806060015164ffffffffff168364ffffffffff1610155b610a0b576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b806080015164ffffffffff168364ffffffffff161015610a4d576040810180516000190167ffffffffffffffff169052606081015164ffffffffff1660808201525b64ffffffffff8316815264ffffffffff1982166020820152610a6f8482610e86565b50505050565b600080610a8183610e26565b519392505050565b6000610a9484610e26565b90506000610ab9826040015167ffffffffffffffff1686610edc90919063ffffffff16565b8054909150610ac757601081555b8054608083015183510364ffffffffff1610610b3e578460060154826080015164ffffffffff161015610b365760408201805160010167ffffffffffffffff169081905260808301805164ffffffffff90811660608601528451169052610b2f908690610edc565b9050610b3e565b805460020281555b608082015182510364ffffffffff9081166000818152600184810160209081526040909220889055855101909216845264ffffffffff19851691840191909152610b888684610e86565b505050505050565b6000610b9b83610e26565b64ffffffffff19831660208201529050610bb58382610e86565b505050565b6000610bc583610e26565b9050610bb5828260200151856109839092919063ffffffff16565b600080610bec84610e26565b805190915064ffffffffff168310610c42576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b6000610c65826040015167ffffffffffffffff1686610edc90919063ffffffff16565b90506000610c8d836040015160010167ffffffffffffffff1687610edc90919063ffffffff16565b9050826080015164ffffffffff168510610d1a576080830151825464ffffffffff9091168603908110610cfe576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b6000908152600190920160205250604090205491506107fc9050565b6080830151606084015164ffffffffff9182168781039290911610610d7d576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b8154811115610dca576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b81540360009081526001909101602052604090205492506107fc915050565b6000610df483610e26565b9050610bb582826020015185610a899092919063ffffffff16565b600080610e1b83610e26565b602001519392505050565b610e2e610efc565b5080546001909101546040805160a08101825264ffffffffff808516825264ffffffffff19909416602082015267ffffffffffffffff8316818301529082901c8316606082015260689190911c909116608082015290565b80516020820151604080840151606085015160808601518754858717969483901b8417606883901b1795939291908714610ebe578689555b85896001015414610ed157600189018690555b505050505050505050565b60006002820615610ef05782600401610ef5565b826002015b9392505050565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091529056fe4f564d5f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2063616e206f6e6c792062652063616c6c656420627920746865206f776e65722ea164736f6c6343000706000a", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100b45760003560e01c80634651d91e116100715780634651d91e1461021a5780638da5cb5b146102375780639507d39a146102b4578063b298e36b146102d1578063ccf8f969146102ee578063fa9e936c14610311576100b4565b8063167fd681146100b95780631f7b6d32146100e65780632015276c1461010057806329061de21461012b578063299ca47814610150578063461a447814610174575b600080fd5b6100e4600480360360408110156100cf57600080fd5b508035906020013564ffffffffff191661032e565b005b6100ee610423565b60408051918252519081900360200190f35b6100e46004803603604081101561011657600080fd5b508035906020013564ffffffffff191661043b565b6100e46004803603602081101561014157600080fd5b503564ffffffffff19166104f7565b6101586105b5565b604080516001600160a01b039092168252519081900360200190f35b6101586004803603602081101561018a57600080fd5b8101906020810181356401000000008111156101a557600080fd5b8201836020820111156101b757600080fd5b803590602001918460018302840111640100000000831117156101d957600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506105c4945050505050565b6100e46004803603602081101561023057600080fd5b50356106a0565b61023f61075b565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610279578181015183820152602001610261565b50505050905090810190601f1680156102a65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6100ee600480360360208110156102ca57600080fd5b50356107e8565b6100e4600480360360208110156102e757600080fd5b5035610802565b6102f66108bd565b6040805164ffffffffff199092168252519081900360200190f35b6100e46004803603602081101561032757600080fd5b50356108ce565b60018054604080516020601f6002600019610100878916150201909516949094049384018190048102820181019092528281526103c493909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b820191906000526020600020905b81548152906001019060200180831161039d57829003601f168201915b50505050506105c4565b6001600160a01b0316336001600160a01b0316146104135760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b61041f60028383610983565b5050565b600061042f6002610a75565b64ffffffffff16905090565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261049c93909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146104eb5760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b61041f60028383610a89565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261055893909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146105a75760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b6105b2600282610b90565b50565b6000546001600160a01b031681565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b8381101561062457818101518382015260200161060c565b50505050905090810190601f1680156106515780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561066e57600080fd5b505afa158015610682573d6000803e3d6000fd5b505050506040513d602081101561069857600080fd5b505192915050565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261070193909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146107505760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b6105b2600282610bba565b60018054604080516020600284861615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156107e05780601f106107b5576101008083540402835291602001916107e0565b820191906000526020600020905b8154815290600101906020018083116107c357829003601f168201915b505050505081565b60006107fc600264ffffffffff8416610be0565b92915050565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261086393909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146108b25760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b6105b2600282610de9565b60006108c96002610e0f565b905090565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261092f93909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b03161461097e5760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b600855565b600061098e84610e26565b9050806000015164ffffffffff168364ffffffffff161080156109c35750806060015164ffffffffff168364ffffffffff1610155b610a0b576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b806080015164ffffffffff168364ffffffffff161015610a4d576040810180516000190167ffffffffffffffff169052606081015164ffffffffff1660808201525b64ffffffffff8316815264ffffffffff1982166020820152610a6f8482610e86565b50505050565b600080610a8183610e26565b519392505050565b6000610a9484610e26565b90506000610ab9826040015167ffffffffffffffff1686610edc90919063ffffffff16565b8054909150610ac757601081555b8054608083015183510364ffffffffff1610610b3e578460060154826080015164ffffffffff161015610b365760408201805160010167ffffffffffffffff169081905260808301805164ffffffffff90811660608601528451169052610b2f908690610edc565b9050610b3e565b805460020281555b608082015182510364ffffffffff9081166000818152600184810160209081526040909220889055855101909216845264ffffffffff19851691840191909152610b888684610e86565b505050505050565b6000610b9b83610e26565b64ffffffffff19831660208201529050610bb58382610e86565b505050565b6000610bc583610e26565b9050610bb5828260200151856109839092919063ffffffff16565b600080610bec84610e26565b805190915064ffffffffff168310610c42576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b6000610c65826040015167ffffffffffffffff1686610edc90919063ffffffff16565b90506000610c8d836040015160010167ffffffffffffffff1687610edc90919063ffffffff16565b9050826080015164ffffffffff168510610d1a576080830151825464ffffffffff9091168603908110610cfe576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b6000908152600190920160205250604090205491506107fc9050565b6080830151606084015164ffffffffff9182168781039290911610610d7d576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b8154811115610dca576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b81540360009081526001909101602052604090205492506107fc915050565b6000610df483610e26565b9050610bb582826020015185610a899092919063ffffffff16565b600080610e1b83610e26565b602001519392505050565b610e2e610efc565b5080546001909101546040805160a08101825264ffffffffff808516825264ffffffffff19909416602082015267ffffffffffffffff8316818301529082901c8316606082015260689190911c909116608082015290565b80516020820151604080840151606085015160808601518754858717969483901b8417606883901b1795939291908714610ebe578689555b85896001015414610ed157600189018690555b505050505050505050565b60006002820615610ef05782600401610ef5565b826002015b9392505050565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091529056fe4f564d5f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2063616e206f6e6c792062652063616c6c656420627920746865206f776e65722ea164736f6c6343000706000a", - "devdoc": { - "details": "The Chain Storage Container provides its owner contract with read, write and delete functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which can no longer be used in a fraud proof due to the fraud window having passed, and the associated chain state or transactions being finalized. Three distinct Chain Storage Containers will be deployed on Layer 1: 1. Stores transaction batches for the Canonical Transaction Chain 2. Stores queued transactions for the Canonical Transaction Chain 3. Stores chain state batches for the State Commitment Chain Compiler used: solc Runtime target: EVM", - "kind": "dev", - "methods": { - "constructor": { - "params": { - "_libAddressManager": "Address of the Address Manager.", - "_owner": "Name of the contract that owns this container (will be resolved later)." - } - }, - "deleteElementsAfterInclusive(uint256)": { - "params": { - "_index": "Object index to delete from." - } - }, - "deleteElementsAfterInclusive(uint256,bytes27)": { - "params": { - "_globalMetadata": "New global metadata for the container.", - "_index": "Object index to delete from." - } - }, - "get(uint256)": { - "params": { - "_index": "Index of the particular object to access." - }, - "returns": { - "_0": "32 byte object value." - } - }, - "getGlobalMetadata()": { - "returns": { - "_0": "Container global metadata field." - } - }, - "length()": { - "returns": { - "_0": "Number of objects in the container." - } - }, - "push(bytes32)": { - "params": { - "_object": "A 32 byte value to insert into the container." - } - }, - "push(bytes32,bytes27)": { - "params": { - "_globalMetadata": "New global metadata for the container.", - "_object": "A 32 byte value to insert into the container." - } - }, - "setGlobalMetadata(bytes27)": { - "params": { - "_globalMetadata": "New global metadata to set." - } - } - }, - "title": "OVM_ChainStorageContainer", - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": { - "deleteElementsAfterInclusive(uint256)": { - "notice": "Removes all objects after and including a given index." - }, - "deleteElementsAfterInclusive(uint256,bytes27)": { - "notice": "Removes all objects after and including a given index. Also allows setting the global metadata field." - }, - "get(uint256)": { - "notice": "Retrieves an object from the container." - }, - "getGlobalMetadata()": { - "notice": "Retrieves the container's global metadata field." - }, - "length()": { - "notice": "Retrieves the number of objects stored in the container." - }, - "push(bytes32)": { - "notice": "Pushes an object into the container." - }, - "push(bytes32,bytes27)": { - "notice": "Pushes an object into the container. Function allows setting the global metadata since we'll need to touch the \"length\" storage slot anyway, which also contains the global metadata (it's an optimization)." - }, - "setGlobalMetadata(bytes27)": { - "notice": "Sets the container's global metadata field. We're using `bytes27` here because we use five bytes to maintain the length of the underlying data structure, meaning we have an extra 27 bytes to store arbitrary data." - }, - "setNextOverwritableIndex(uint256)": { - "notice": "Marks an index as overwritable, meaing the underlying buffer can start to write values over any objects before and including the given index." - } - }, - "version": 1 - }, - "storageLayout": { - "storage": [ - { - "astId": 12526, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "libAddressManager", - "offset": 0, - "slot": "0", - "type": "t_contract(Lib_AddressManager)12519" - }, - { - "astId": 3772, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "owner", - "offset": 0, - "slot": "1", - "type": "t_string_storage" - }, - { - "astId": 3774, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "buffer", - "offset": 0, - "slot": "2", - "type": "t_struct(RingBuffer)17796_storage" - } - ], - "types": { - "t_bytes32": { - "encoding": "inplace", - "label": "bytes32", - "numberOfBytes": "32" - }, - "t_contract(Lib_AddressManager)12519": { - "encoding": "inplace", - "label": "contract Lib_AddressManager", - "numberOfBytes": "20" - }, - "t_mapping(t_uint256,t_bytes32)": { - "encoding": "mapping", - "key": "t_uint256", - "label": "mapping(uint256 => bytes32)", - "numberOfBytes": "32", - "value": "t_bytes32" - }, - "t_string_storage": { - "encoding": "bytes", - "label": "string", - "numberOfBytes": "32" - }, - "t_struct(Buffer)17785_storage": { - "encoding": "inplace", - "label": "struct Lib_RingBuffer.Buffer", - "members": [ - { - "astId": 17780, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "length", - "offset": 0, - "slot": "0", - "type": "t_uint256" - }, - { - "astId": 17784, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "buf", - "offset": 0, - "slot": "1", - "type": "t_mapping(t_uint256,t_bytes32)" - } - ], - "numberOfBytes": "64" - }, - "t_struct(RingBuffer)17796_storage": { - "encoding": "inplace", - "label": "struct Lib_RingBuffer.RingBuffer", - "members": [ - { - "astId": 17787, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "contextA", - "offset": 0, - "slot": "0", - "type": "t_bytes32" - }, - { - "astId": 17789, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "contextB", - "offset": 0, - "slot": "1", - "type": "t_bytes32" - }, - { - "astId": 17791, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "bufferA", - "offset": 0, - "slot": "2", - "type": "t_struct(Buffer)17785_storage" - }, - { - "astId": 17793, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "bufferB", - "offset": 0, - "slot": "4", - "type": "t_struct(Buffer)17785_storage" - }, - { - "astId": 17795, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "nextOverwritableIndex", - "offset": 0, - "slot": "6", - "type": "t_uint256" - } - ], - "numberOfBytes": "224" - }, - "t_uint256": { - "encoding": "inplace", - "label": "uint256", - "numberOfBytes": "32" - } - } - } -} \ No newline at end of file diff --git a/packages/contracts/deployments/kovan/OVM_ChainStorageContainer-CTC-queue.json b/packages/contracts/deployments/kovan/OVM_ChainStorageContainer-CTC-queue.json deleted file mode 100644 index eab81605f20d2..0000000000000 --- a/packages/contracts/deployments/kovan/OVM_ChainStorageContainer-CTC-queue.json +++ /dev/null @@ -1,442 +0,0 @@ -{ - "address": "0xf388A98F640baB14e5Cd343B1c27817811aDd682", - "abi": [ - { - "inputs": [ - { - "internalType": "address", - "name": "_libAddressManager", - "type": "address" - }, - { - "internalType": "string", - "name": "_owner", - "type": "string" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_index", - "type": "uint256" - }, - { - "internalType": "bytes27", - "name": "_globalMetadata", - "type": "bytes27" - } - ], - "name": "deleteElementsAfterInclusive", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_index", - "type": "uint256" - } - ], - "name": "deleteElementsAfterInclusive", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_index", - "type": "uint256" - } - ], - "name": "get", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getGlobalMetadata", - "outputs": [ - { - "internalType": "bytes27", - "name": "", - "type": "bytes27" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "length", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "libAddressManager", - "outputs": [ - { - "internalType": "contract Lib_AddressManager", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "owner", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "_object", - "type": "bytes32" - }, - { - "internalType": "bytes27", - "name": "_globalMetadata", - "type": "bytes27" - } - ], - "name": "push", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "_object", - "type": "bytes32" - } - ], - "name": "push", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "string", - "name": "_name", - "type": "string" - } - ], - "name": "resolve", - "outputs": [ - { - "internalType": "address", - "name": "_contract", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes27", - "name": "_globalMetadata", - "type": "bytes27" - } - ], - "name": "setGlobalMetadata", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_index", - "type": "uint256" - } - ], - "name": "setNextOverwritableIndex", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - } - ], - "transactionHash": "0xf54a9e99acf81a7c75073a5b6e4d65ea87e157b68b1f3fc01e05fc083fddd379", - "receipt": { - "to": null, - "from": "0x18394B52d3Cb931dfA76F63251919D051953413d", - "contractAddress": "0xf388A98F640baB14e5Cd343B1c27817811aDd682", - "transactionIndex": 1, - "gasUsed": "959533", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0x0f33ed7a35b50766178118eb5fe12b171aa97744a139a44073d9cb42cc88d5de", - "transactionHash": "0xf54a9e99acf81a7c75073a5b6e4d65ea87e157b68b1f3fc01e05fc083fddd379", - "logs": [], - "blockNumber": 24199475, - "cumulativeGasUsed": "3525383", - "status": 1, - "byzantium": true - }, - "args": [ - "0xFaf27b24ba54C6910C12CFF5C9453C0e8D634e05", - "OVM_CanonicalTransactionChain" - ], - "solcInputHash": "03aed03b958b1d37f90bd88d0f56dd85", - "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_owner\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"get\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getGlobalMetadata\",\"outputs\":[{\"internalType\":\"bytes27\",\"name\":\"\",\"type\":\"bytes27\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"length\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"_contract\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"setGlobalMetadata\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"setNextOverwritableIndex\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The Chain Storage Container provides its owner contract with read, write and delete functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which can no longer be used in a fraud proof due to the fraud window having passed, and the associated chain state or transactions being finalized. Three distinct Chain Storage Containers will be deployed on Layer 1: 1. Stores transaction batches for the Canonical Transaction Chain 2. Stores queued transactions for the Canonical Transaction Chain 3. Stores chain state batches for the State Commitment Chain Compiler used: solc Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\",\"_owner\":\"Name of the contract that owns this container (will be resolved later).\"}},\"deleteElementsAfterInclusive(uint256)\":{\"params\":{\"_index\":\"Object index to delete from.\"}},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_index\":\"Object index to delete from.\"}},\"get(uint256)\":{\"params\":{\"_index\":\"Index of the particular object to access.\"},\"returns\":{\"_0\":\"32 byte object value.\"}},\"getGlobalMetadata()\":{\"returns\":{\"_0\":\"Container global metadata field.\"}},\"length()\":{\"returns\":{\"_0\":\"Number of objects in the container.\"}},\"push(bytes32)\":{\"params\":{\"_object\":\"A 32 byte value to insert into the container.\"}},\"push(bytes32,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_object\":\"A 32 byte value to insert into the container.\"}},\"setGlobalMetadata(bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata to set.\"}}},\"title\":\"OVM_ChainStorageContainer\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"deleteElementsAfterInclusive(uint256)\":{\"notice\":\"Removes all objects after and including a given index.\"},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"notice\":\"Removes all objects after and including a given index. Also allows setting the global metadata field.\"},\"get(uint256)\":{\"notice\":\"Retrieves an object from the container.\"},\"getGlobalMetadata()\":{\"notice\":\"Retrieves the container's global metadata field.\"},\"length()\":{\"notice\":\"Retrieves the number of objects stored in the container.\"},\"push(bytes32)\":{\"notice\":\"Pushes an object into the container.\"},\"push(bytes32,bytes27)\":{\"notice\":\"Pushes an object into the container. Function allows setting the global metadata since we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global metadata (it's an optimization).\"},\"setGlobalMetadata(bytes27)\":{\"notice\":\"Sets the container's global metadata field. We're using `bytes27` here because we use five bytes to maintain the length of the underlying data structure, meaning we have an extra 27 bytes to store arbitrary data.\"},\"setNextOverwritableIndex(uint256)\":{\"notice\":\"Marks an index as overwritable, meaing the underlying buffer can start to write values over any objects before and including the given index.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol\":\"OVM_ChainStorageContainer\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_RingBuffer } from \\\"../../libraries/utils/Lib_RingBuffer.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_ChainStorageContainer } from \\\"../../iOVM/chain/iOVM_ChainStorageContainer.sol\\\";\\n\\n/**\\n * @title OVM_ChainStorageContainer\\n * @dev The Chain Storage Container provides its owner contract with read, write and delete functionality.\\n * This provides gas efficiency gains by enabling it to overwrite storage slots which can no longer be used\\n * in a fraud proof due to the fraud window having passed, and the associated chain state or\\n * transactions being finalized.\\n * Three distinct Chain Storage Containers will be deployed on Layer 1:\\n * 1. Stores transaction batches for the Canonical Transaction Chain\\n * 2. Stores queued transactions for the Canonical Transaction Chain\\n * 3. Stores chain state batches for the State Commitment Chain\\n *\\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract OVM_ChainStorageContainer is iOVM_ChainStorageContainer, Lib_AddressResolver {\\n\\n /*************\\n * Libraries *\\n *************/\\n\\n using Lib_RingBuffer for Lib_RingBuffer.RingBuffer;\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n string public owner;\\n Lib_RingBuffer.RingBuffer internal buffer;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n * @param _owner Name of the contract that owns this container (will be resolved later).\\n */\\n constructor(\\n address _libAddressManager,\\n string memory _owner\\n )\\n Lib_AddressResolver(_libAddressManager)\\n {\\n owner = _owner;\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n msg.sender == resolve(owner),\\n \\\"OVM_ChainStorageContainer: Function can only be called by the owner.\\\"\\n );\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function setGlobalMetadata(\\n bytes27 _globalMetadata\\n )\\n override\\n public\\n onlyOwner\\n {\\n return buffer.setExtraData(_globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function getGlobalMetadata()\\n override\\n public\\n view\\n returns (\\n bytes27\\n )\\n {\\n return buffer.getExtraData();\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function length()\\n override\\n public\\n view\\n returns (\\n uint256\\n )\\n {\\n return uint256(buffer.getLength());\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function push(\\n bytes32 _object\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.push(_object);\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function push(\\n bytes32 _object,\\n bytes27 _globalMetadata\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.push(_object, _globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function get(\\n uint256 _index\\n )\\n override\\n public\\n view\\n returns (\\n bytes32\\n )\\n {\\n return buffer.get(uint40(_index));\\n }\\n \\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.deleteElementsAfterInclusive(\\n uint40(_index)\\n );\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index,\\n bytes27 _globalMetadata\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.deleteElementsAfterInclusive(\\n uint40(_index),\\n _globalMetadata\\n );\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function setNextOverwritableIndex(\\n uint256 _index\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.nextOverwritableIndex = _index;\\n }\\n}\\n\",\"keccak256\":\"0x52e3ef7166fe134d32997917067e3d74128173b12fb6231eec34132102ddbb50\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_ChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title iOVM_ChainStorageContainer\\n */\\ninterface iOVM_ChainStorageContainer {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata()\\n external\\n view\\n returns (\\n bytes27\\n );\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length()\\n external\\n view\\n returns (\\n uint256\\n );\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(\\n bytes32 _object\\n )\\n external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(\\n bytes32 _object,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(\\n uint256 _index\\n )\\n external\\n view\\n returns (\\n bytes32\\n );\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index\\n )\\n external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Marks an index as overwritable, meaing the underlying buffer can start to write values over\\n * any objects before and including the given index.\\n */\\n function setNextOverwritableIndex(\\n uint256 _index\\n )\\n external;\\n}\\n\",\"keccak256\":\"0x2d7973a0ad84c23ec62624d3f1e3aeb198cc72686ff1e6cfa17155556b320c94\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Contract Imports */\\nimport { Ownable } from \\\"./Lib_Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n /*******************************************\\n * Contract Variables: Internal Accounting *\\n *******************************************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n public\\n onlyOwner\\n {\\n emit AddressSet(_name, _address);\\n addresses[_getNameHash(_name)] = _address;\\n }\\n\\n function getAddress(\\n string memory _name\\n )\\n public\\n view\\n returns (address)\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32 _hash\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0x3a490595cc21ff170e4027843093670ff845d5972481fbfb956b722ea564bb06\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n\\n /*******************************************\\n * Contract Variables: Contract References *\\n *******************************************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(\\n address _libAddressManager\\n ) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function resolve(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address _contract\\n )\\n {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0xaa3ed342f6deb156c660fd83afa579a3b80db17eb465e8949cf5c1b114780143\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Ownable\\n * @dev Adapted from https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol\\n */\\nabstract contract Ownable {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n address public owner;\\n\\n\\n /**********\\n * Events *\\n **********/\\n\\n event OwnershipTransferred(\\n address indexed previousOwner,\\n address indexed newOwner\\n );\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n constructor() {\\n owner = msg.sender;\\n emit OwnershipTransferred(address(0), owner);\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n owner == msg.sender,\\n \\\"Ownable: caller is not the owner\\\"\\n );\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function renounceOwnership()\\n public\\n virtual\\n onlyOwner\\n {\\n emit OwnershipTransferred(owner, address(0));\\n owner = address(0);\\n }\\n\\n function transferOwnership(address _newOwner)\\n public\\n virtual\\n onlyOwner\\n {\\n require(\\n _newOwner != address(0),\\n \\\"Ownable: new owner cannot be the zero address\\\"\\n );\\n\\n emit OwnershipTransferred(owner, _newOwner);\\n owner = _newOwner;\\n }\\n}\\n\",\"keccak256\":\"0xd9dfd9264e5b5fedd53a5b10fdf179c3f367614b0fe69179bce4e45119f5b739\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_RingBuffer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\nlibrary Lib_RingBuffer {\\n using Lib_RingBuffer for RingBuffer;\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Buffer {\\n uint256 length;\\n mapping (uint256 => bytes32) buf;\\n }\\n\\n struct RingBuffer {\\n bytes32 contextA;\\n bytes32 contextB;\\n Buffer bufferA;\\n Buffer bufferB;\\n uint256 nextOverwritableIndex;\\n }\\n\\n struct RingBufferContext {\\n // contextA\\n uint40 globalIndex;\\n bytes27 extraData;\\n\\n // contextB\\n uint64 currBufferIndex;\\n uint40 prevResetIndex;\\n uint40 currResetIndex;\\n }\\n\\n\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 constant MIN_CAPACITY = 16;\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n * @param _extraData Optional global extra data.\\n */\\n function push(\\n RingBuffer storage _self,\\n bytes32 _value,\\n bytes27 _extraData\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n Buffer storage currBuffer = _self.getBuffer(ctx.currBufferIndex);\\n\\n // Set a minimum capacity.\\n if (currBuffer.length == 0) {\\n currBuffer.length = MIN_CAPACITY;\\n }\\n\\n // Check if we need to expand the buffer.\\n if (ctx.globalIndex - ctx.currResetIndex >= currBuffer.length) {\\n if (ctx.currResetIndex < _self.nextOverwritableIndex) {\\n // We're going to overwrite the inactive buffer.\\n // Bump the buffer index, reset the delete offset, and set our reset indices.\\n ctx.currBufferIndex++;\\n ctx.prevResetIndex = ctx.currResetIndex;\\n ctx.currResetIndex = ctx.globalIndex;\\n\\n // Swap over to the next buffer.\\n currBuffer = _self.getBuffer(ctx.currBufferIndex);\\n } else {\\n // We're not overwriting yet, double the length of the current buffer.\\n currBuffer.length *= 2;\\n }\\n }\\n\\n // Index to write to is the difference of the global and reset indices.\\n uint256 writeHead = ctx.globalIndex - ctx.currResetIndex;\\n currBuffer.buf[writeHead] = _value;\\n\\n // Bump the global index and insert our extra data, then save the context.\\n ctx.globalIndex++;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n */\\n function push(\\n RingBuffer storage _self,\\n bytes32 _value\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n \\n _self.push(\\n _value,\\n ctx.extraData\\n );\\n }\\n\\n /**\\n * Retrieves an element from the buffer.\\n * @param _self Buffer to access.\\n * @param _index Element index to retrieve.\\n * @return Value of the element at the given index.\\n */\\n function get(\\n RingBuffer storage _self,\\n uint256 _index\\n )\\n internal\\n view\\n returns (\\n bytes32 \\n )\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n\\n require(\\n _index < ctx.globalIndex,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n Buffer storage currBuffer = _self.getBuffer(ctx.currBufferIndex);\\n Buffer storage prevBuffer = _self.getBuffer(ctx.currBufferIndex + 1);\\n\\n if (_index >= ctx.currResetIndex) {\\n // We're trying to load an element from the current buffer.\\n // Relative index is just the difference from the reset index.\\n uint256 relativeIndex = _index - ctx.currResetIndex;\\n\\n // Shouldn't happen but why not check.\\n require(\\n relativeIndex < currBuffer.length,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n return currBuffer.buf[relativeIndex];\\n } else {\\n // We're trying to load an element from the previous buffer.\\n // Relative index is the difference from the reset index in the other direction.\\n uint256 relativeIndex = ctx.currResetIndex - _index;\\n\\n // Condition only fails in the case that we deleted and flipped buffers.\\n require(\\n ctx.currResetIndex > ctx.prevResetIndex,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n // Make sure we're not trying to read beyond the array.\\n require(\\n relativeIndex <= prevBuffer.length,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n return prevBuffer.buf[prevBuffer.length - relativeIndex];\\n }\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n * @param _extraData Optional global extra data.\\n */\\n function deleteElementsAfterInclusive(\\n RingBuffer storage _self,\\n uint40 _index,\\n bytes27 _extraData\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n\\n require(\\n _index < ctx.globalIndex && _index >= ctx.prevResetIndex,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n if (_index < ctx.currResetIndex) {\\n // We're switching back to the previous buffer.\\n // Reduce the buffer index, set the current reset index back to match the previous one.\\n // We use the equality of these two values to prevent reading beyond this buffer.\\n ctx.currBufferIndex--;\\n ctx.currResetIndex = ctx.prevResetIndex;\\n }\\n\\n // Set our global index and extra data, save the context.\\n ctx.globalIndex = _index;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n */\\n function deleteElementsAfterInclusive(\\n RingBuffer storage _self,\\n uint40 _index\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n _self.deleteElementsAfterInclusive(\\n _index,\\n ctx.extraData\\n );\\n }\\n\\n /**\\n * Retrieves the current global index.\\n * @param _self Buffer to access.\\n * @return Current global index.\\n */\\n function getLength(\\n RingBuffer storage _self\\n )\\n internal\\n view\\n returns (\\n uint40\\n )\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n return ctx.globalIndex;\\n }\\n\\n /**\\n * Changes current global extra data.\\n * @param _self Buffer to access.\\n * @param _extraData New global extra data.\\n */\\n function setExtraData(\\n RingBuffer storage _self,\\n bytes27 _extraData\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Retrieves the current global extra data.\\n * @param _self Buffer to access.\\n * @return Current global extra data.\\n */\\n function getExtraData(\\n RingBuffer storage _self\\n )\\n internal\\n view\\n returns (\\n bytes27\\n )\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n return ctx.extraData;\\n }\\n\\n /**\\n * Sets the current ring buffer context.\\n * @param _self Buffer to access.\\n * @param _ctx Current ring buffer context.\\n */\\n function setContext(\\n RingBuffer storage _self,\\n RingBufferContext memory _ctx\\n )\\n internal\\n {\\n bytes32 contextA;\\n bytes32 contextB;\\n\\n uint40 globalIndex = _ctx.globalIndex;\\n bytes27 extraData = _ctx.extraData;\\n assembly {\\n contextA := globalIndex\\n contextA := or(contextA, extraData)\\n }\\n\\n uint64 currBufferIndex = _ctx.currBufferIndex;\\n uint40 prevResetIndex = _ctx.prevResetIndex;\\n uint40 currResetIndex = _ctx.currResetIndex;\\n assembly {\\n contextB := currBufferIndex\\n contextB := or(contextB, shl(64, prevResetIndex))\\n contextB := or(contextB, shl(104, currResetIndex))\\n }\\n\\n if (_self.contextA != contextA) {\\n _self.contextA = contextA;\\n }\\n\\n if (_self.contextB != contextB) {\\n _self.contextB = contextB;\\n }\\n }\\n\\n /**\\n * Retrieves the current ring buffer context.\\n * @param _self Buffer to access.\\n * @return Current ring buffer context.\\n */\\n function getContext(\\n RingBuffer storage _self\\n )\\n internal\\n view\\n returns (\\n RingBufferContext memory\\n )\\n {\\n bytes32 contextA = _self.contextA;\\n bytes32 contextB = _self.contextB;\\n\\n uint40 globalIndex;\\n bytes27 extraData;\\n assembly {\\n globalIndex := and(contextA, 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF)\\n extraData := and(contextA, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000)\\n }\\n\\n uint64 currBufferIndex;\\n uint40 prevResetIndex;\\n uint40 currResetIndex;\\n assembly {\\n currBufferIndex := and(contextB, 0x000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF)\\n prevResetIndex := shr(64, and(contextB, 0x00000000000000000000000000000000000000FFFFFFFFFF0000000000000000))\\n currResetIndex := shr(104, and(contextB, 0x0000000000000000000000000000FFFFFFFFFF00000000000000000000000000))\\n }\\n\\n return RingBufferContext({\\n globalIndex: globalIndex,\\n extraData: extraData,\\n currBufferIndex: currBufferIndex,\\n prevResetIndex: prevResetIndex,\\n currResetIndex: currResetIndex\\n });\\n }\\n\\n /**\\n * Retrieves the a buffer from the ring buffer by index.\\n * @param _self Buffer to access.\\n * @param _which Index of the sub buffer to access.\\n * @return Sub buffer for the index.\\n */\\n function getBuffer(\\n RingBuffer storage _self,\\n uint256 _which\\n )\\n internal\\n view\\n returns (\\n Buffer storage\\n )\\n {\\n return _which % 2 == 0 ? _self.bufferA : _self.bufferB;\\n }\\n}\\n\",\"keccak256\":\"0xb38cb98da2d09f922d5cfe772bdbd36ede2b2267ade93128e949c9da21b89940\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x60806040523480156200001157600080fd5b506040516200116438038062001164833981810160405260408110156200003757600080fd5b8151602083018051604051929492938301929190846401000000008211156200005f57600080fd5b9083019060208201858111156200007557600080fd5b82516401000000008111828201881017156200009057600080fd5b82525081516020918201929091019080838360005b83811015620000bf578181015183820152602001620000a5565b50505050905090810190601f168015620000ed5780820380516001836020036101000a031916815260200191505b506040525050600080546001600160a01b0319166001600160a01b038516179055508051620001249060019060208401906200012d565b505050620001d9565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282620001655760008555620001b0565b82601f106200018057805160ff1916838001178555620001b0565b82800160010185558215620001b0579182015b82811115620001b057825182559160200191906001019062000193565b50620001be929150620001c2565b5090565b5b80821115620001be5760008155600101620001c3565b610f7b80620001e96000396000f3fe608060405234801561001057600080fd5b50600436106100b45760003560e01c80634651d91e116100715780634651d91e1461021a5780638da5cb5b146102375780639507d39a146102b4578063b298e36b146102d1578063ccf8f969146102ee578063fa9e936c14610311576100b4565b8063167fd681146100b95780631f7b6d32146100e65780632015276c1461010057806329061de21461012b578063299ca47814610150578063461a447814610174575b600080fd5b6100e4600480360360408110156100cf57600080fd5b508035906020013564ffffffffff191661032e565b005b6100ee610423565b60408051918252519081900360200190f35b6100e46004803603604081101561011657600080fd5b508035906020013564ffffffffff191661043b565b6100e46004803603602081101561014157600080fd5b503564ffffffffff19166104f7565b6101586105b5565b604080516001600160a01b039092168252519081900360200190f35b6101586004803603602081101561018a57600080fd5b8101906020810181356401000000008111156101a557600080fd5b8201836020820111156101b757600080fd5b803590602001918460018302840111640100000000831117156101d957600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506105c4945050505050565b6100e46004803603602081101561023057600080fd5b50356106a0565b61023f61075b565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610279578181015183820152602001610261565b50505050905090810190601f1680156102a65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6100ee600480360360208110156102ca57600080fd5b50356107e8565b6100e4600480360360208110156102e757600080fd5b5035610802565b6102f66108bd565b6040805164ffffffffff199092168252519081900360200190f35b6100e46004803603602081101561032757600080fd5b50356108ce565b60018054604080516020601f6002600019610100878916150201909516949094049384018190048102820181019092528281526103c493909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b820191906000526020600020905b81548152906001019060200180831161039d57829003601f168201915b50505050506105c4565b6001600160a01b0316336001600160a01b0316146104135760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b61041f60028383610983565b5050565b600061042f6002610a75565b64ffffffffff16905090565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261049c93909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146104eb5760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b61041f60028383610a89565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261055893909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146105a75760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b6105b2600282610b90565b50565b6000546001600160a01b031681565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b8381101561062457818101518382015260200161060c565b50505050905090810190601f1680156106515780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561066e57600080fd5b505afa158015610682573d6000803e3d6000fd5b505050506040513d602081101561069857600080fd5b505192915050565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261070193909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146107505760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b6105b2600282610bba565b60018054604080516020600284861615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156107e05780601f106107b5576101008083540402835291602001916107e0565b820191906000526020600020905b8154815290600101906020018083116107c357829003601f168201915b505050505081565b60006107fc600264ffffffffff8416610be0565b92915050565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261086393909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146108b25760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b6105b2600282610de9565b60006108c96002610e0f565b905090565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261092f93909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b03161461097e5760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b600855565b600061098e84610e26565b9050806000015164ffffffffff168364ffffffffff161080156109c35750806060015164ffffffffff168364ffffffffff1610155b610a0b576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b806080015164ffffffffff168364ffffffffff161015610a4d576040810180516000190167ffffffffffffffff169052606081015164ffffffffff1660808201525b64ffffffffff8316815264ffffffffff1982166020820152610a6f8482610e86565b50505050565b600080610a8183610e26565b519392505050565b6000610a9484610e26565b90506000610ab9826040015167ffffffffffffffff1686610edc90919063ffffffff16565b8054909150610ac757601081555b8054608083015183510364ffffffffff1610610b3e578460060154826080015164ffffffffff161015610b365760408201805160010167ffffffffffffffff169081905260808301805164ffffffffff90811660608601528451169052610b2f908690610edc565b9050610b3e565b805460020281555b608082015182510364ffffffffff9081166000818152600184810160209081526040909220889055855101909216845264ffffffffff19851691840191909152610b888684610e86565b505050505050565b6000610b9b83610e26565b64ffffffffff19831660208201529050610bb58382610e86565b505050565b6000610bc583610e26565b9050610bb5828260200151856109839092919063ffffffff16565b600080610bec84610e26565b805190915064ffffffffff168310610c42576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b6000610c65826040015167ffffffffffffffff1686610edc90919063ffffffff16565b90506000610c8d836040015160010167ffffffffffffffff1687610edc90919063ffffffff16565b9050826080015164ffffffffff168510610d1a576080830151825464ffffffffff9091168603908110610cfe576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b6000908152600190920160205250604090205491506107fc9050565b6080830151606084015164ffffffffff9182168781039290911610610d7d576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b8154811115610dca576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b81540360009081526001909101602052604090205492506107fc915050565b6000610df483610e26565b9050610bb582826020015185610a899092919063ffffffff16565b600080610e1b83610e26565b602001519392505050565b610e2e610efc565b5080546001909101546040805160a08101825264ffffffffff808516825264ffffffffff19909416602082015267ffffffffffffffff8316818301529082901c8316606082015260689190911c909116608082015290565b80516020820151604080840151606085015160808601518754858717969483901b8417606883901b1795939291908714610ebe578689555b85896001015414610ed157600189018690555b505050505050505050565b60006002820615610ef05782600401610ef5565b826002015b9392505050565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091529056fe4f564d5f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2063616e206f6e6c792062652063616c6c656420627920746865206f776e65722ea164736f6c6343000706000a", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100b45760003560e01c80634651d91e116100715780634651d91e1461021a5780638da5cb5b146102375780639507d39a146102b4578063b298e36b146102d1578063ccf8f969146102ee578063fa9e936c14610311576100b4565b8063167fd681146100b95780631f7b6d32146100e65780632015276c1461010057806329061de21461012b578063299ca47814610150578063461a447814610174575b600080fd5b6100e4600480360360408110156100cf57600080fd5b508035906020013564ffffffffff191661032e565b005b6100ee610423565b60408051918252519081900360200190f35b6100e46004803603604081101561011657600080fd5b508035906020013564ffffffffff191661043b565b6100e46004803603602081101561014157600080fd5b503564ffffffffff19166104f7565b6101586105b5565b604080516001600160a01b039092168252519081900360200190f35b6101586004803603602081101561018a57600080fd5b8101906020810181356401000000008111156101a557600080fd5b8201836020820111156101b757600080fd5b803590602001918460018302840111640100000000831117156101d957600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506105c4945050505050565b6100e46004803603602081101561023057600080fd5b50356106a0565b61023f61075b565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610279578181015183820152602001610261565b50505050905090810190601f1680156102a65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6100ee600480360360208110156102ca57600080fd5b50356107e8565b6100e4600480360360208110156102e757600080fd5b5035610802565b6102f66108bd565b6040805164ffffffffff199092168252519081900360200190f35b6100e46004803603602081101561032757600080fd5b50356108ce565b60018054604080516020601f6002600019610100878916150201909516949094049384018190048102820181019092528281526103c493909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b820191906000526020600020905b81548152906001019060200180831161039d57829003601f168201915b50505050506105c4565b6001600160a01b0316336001600160a01b0316146104135760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b61041f60028383610983565b5050565b600061042f6002610a75565b64ffffffffff16905090565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261049c93909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146104eb5760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b61041f60028383610a89565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261055893909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146105a75760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b6105b2600282610b90565b50565b6000546001600160a01b031681565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b8381101561062457818101518382015260200161060c565b50505050905090810190601f1680156106515780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561066e57600080fd5b505afa158015610682573d6000803e3d6000fd5b505050506040513d602081101561069857600080fd5b505192915050565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261070193909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146107505760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b6105b2600282610bba565b60018054604080516020600284861615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156107e05780601f106107b5576101008083540402835291602001916107e0565b820191906000526020600020905b8154815290600101906020018083116107c357829003601f168201915b505050505081565b60006107fc600264ffffffffff8416610be0565b92915050565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261086393909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146108b25760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b6105b2600282610de9565b60006108c96002610e0f565b905090565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261092f93909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b03161461097e5760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b600855565b600061098e84610e26565b9050806000015164ffffffffff168364ffffffffff161080156109c35750806060015164ffffffffff168364ffffffffff1610155b610a0b576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b806080015164ffffffffff168364ffffffffff161015610a4d576040810180516000190167ffffffffffffffff169052606081015164ffffffffff1660808201525b64ffffffffff8316815264ffffffffff1982166020820152610a6f8482610e86565b50505050565b600080610a8183610e26565b519392505050565b6000610a9484610e26565b90506000610ab9826040015167ffffffffffffffff1686610edc90919063ffffffff16565b8054909150610ac757601081555b8054608083015183510364ffffffffff1610610b3e578460060154826080015164ffffffffff161015610b365760408201805160010167ffffffffffffffff169081905260808301805164ffffffffff90811660608601528451169052610b2f908690610edc565b9050610b3e565b805460020281555b608082015182510364ffffffffff9081166000818152600184810160209081526040909220889055855101909216845264ffffffffff19851691840191909152610b888684610e86565b505050505050565b6000610b9b83610e26565b64ffffffffff19831660208201529050610bb58382610e86565b505050565b6000610bc583610e26565b9050610bb5828260200151856109839092919063ffffffff16565b600080610bec84610e26565b805190915064ffffffffff168310610c42576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b6000610c65826040015167ffffffffffffffff1686610edc90919063ffffffff16565b90506000610c8d836040015160010167ffffffffffffffff1687610edc90919063ffffffff16565b9050826080015164ffffffffff168510610d1a576080830151825464ffffffffff9091168603908110610cfe576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b6000908152600190920160205250604090205491506107fc9050565b6080830151606084015164ffffffffff9182168781039290911610610d7d576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b8154811115610dca576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b81540360009081526001909101602052604090205492506107fc915050565b6000610df483610e26565b9050610bb582826020015185610a899092919063ffffffff16565b600080610e1b83610e26565b602001519392505050565b610e2e610efc565b5080546001909101546040805160a08101825264ffffffffff808516825264ffffffffff19909416602082015267ffffffffffffffff8316818301529082901c8316606082015260689190911c909116608082015290565b80516020820151604080840151606085015160808601518754858717969483901b8417606883901b1795939291908714610ebe578689555b85896001015414610ed157600189018690555b505050505050505050565b60006002820615610ef05782600401610ef5565b826002015b9392505050565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091529056fe4f564d5f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2063616e206f6e6c792062652063616c6c656420627920746865206f776e65722ea164736f6c6343000706000a", - "devdoc": { - "details": "The Chain Storage Container provides its owner contract with read, write and delete functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which can no longer be used in a fraud proof due to the fraud window having passed, and the associated chain state or transactions being finalized. Three distinct Chain Storage Containers will be deployed on Layer 1: 1. Stores transaction batches for the Canonical Transaction Chain 2. Stores queued transactions for the Canonical Transaction Chain 3. Stores chain state batches for the State Commitment Chain Compiler used: solc Runtime target: EVM", - "kind": "dev", - "methods": { - "constructor": { - "params": { - "_libAddressManager": "Address of the Address Manager.", - "_owner": "Name of the contract that owns this container (will be resolved later)." - } - }, - "deleteElementsAfterInclusive(uint256)": { - "params": { - "_index": "Object index to delete from." - } - }, - "deleteElementsAfterInclusive(uint256,bytes27)": { - "params": { - "_globalMetadata": "New global metadata for the container.", - "_index": "Object index to delete from." - } - }, - "get(uint256)": { - "params": { - "_index": "Index of the particular object to access." - }, - "returns": { - "_0": "32 byte object value." - } - }, - "getGlobalMetadata()": { - "returns": { - "_0": "Container global metadata field." - } - }, - "length()": { - "returns": { - "_0": "Number of objects in the container." - } - }, - "push(bytes32)": { - "params": { - "_object": "A 32 byte value to insert into the container." - } - }, - "push(bytes32,bytes27)": { - "params": { - "_globalMetadata": "New global metadata for the container.", - "_object": "A 32 byte value to insert into the container." - } - }, - "setGlobalMetadata(bytes27)": { - "params": { - "_globalMetadata": "New global metadata to set." - } - } - }, - "title": "OVM_ChainStorageContainer", - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": { - "deleteElementsAfterInclusive(uint256)": { - "notice": "Removes all objects after and including a given index." - }, - "deleteElementsAfterInclusive(uint256,bytes27)": { - "notice": "Removes all objects after and including a given index. Also allows setting the global metadata field." - }, - "get(uint256)": { - "notice": "Retrieves an object from the container." - }, - "getGlobalMetadata()": { - "notice": "Retrieves the container's global metadata field." - }, - "length()": { - "notice": "Retrieves the number of objects stored in the container." - }, - "push(bytes32)": { - "notice": "Pushes an object into the container." - }, - "push(bytes32,bytes27)": { - "notice": "Pushes an object into the container. Function allows setting the global metadata since we'll need to touch the \"length\" storage slot anyway, which also contains the global metadata (it's an optimization)." - }, - "setGlobalMetadata(bytes27)": { - "notice": "Sets the container's global metadata field. We're using `bytes27` here because we use five bytes to maintain the length of the underlying data structure, meaning we have an extra 27 bytes to store arbitrary data." - }, - "setNextOverwritableIndex(uint256)": { - "notice": "Marks an index as overwritable, meaing the underlying buffer can start to write values over any objects before and including the given index." - } - }, - "version": 1 - }, - "storageLayout": { - "storage": [ - { - "astId": 12526, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "libAddressManager", - "offset": 0, - "slot": "0", - "type": "t_contract(Lib_AddressManager)12519" - }, - { - "astId": 3772, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "owner", - "offset": 0, - "slot": "1", - "type": "t_string_storage" - }, - { - "astId": 3774, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "buffer", - "offset": 0, - "slot": "2", - "type": "t_struct(RingBuffer)17796_storage" - } - ], - "types": { - "t_bytes32": { - "encoding": "inplace", - "label": "bytes32", - "numberOfBytes": "32" - }, - "t_contract(Lib_AddressManager)12519": { - "encoding": "inplace", - "label": "contract Lib_AddressManager", - "numberOfBytes": "20" - }, - "t_mapping(t_uint256,t_bytes32)": { - "encoding": "mapping", - "key": "t_uint256", - "label": "mapping(uint256 => bytes32)", - "numberOfBytes": "32", - "value": "t_bytes32" - }, - "t_string_storage": { - "encoding": "bytes", - "label": "string", - "numberOfBytes": "32" - }, - "t_struct(Buffer)17785_storage": { - "encoding": "inplace", - "label": "struct Lib_RingBuffer.Buffer", - "members": [ - { - "astId": 17780, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "length", - "offset": 0, - "slot": "0", - "type": "t_uint256" - }, - { - "astId": 17784, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "buf", - "offset": 0, - "slot": "1", - "type": "t_mapping(t_uint256,t_bytes32)" - } - ], - "numberOfBytes": "64" - }, - "t_struct(RingBuffer)17796_storage": { - "encoding": "inplace", - "label": "struct Lib_RingBuffer.RingBuffer", - "members": [ - { - "astId": 17787, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "contextA", - "offset": 0, - "slot": "0", - "type": "t_bytes32" - }, - { - "astId": 17789, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "contextB", - "offset": 0, - "slot": "1", - "type": "t_bytes32" - }, - { - "astId": 17791, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "bufferA", - "offset": 0, - "slot": "2", - "type": "t_struct(Buffer)17785_storage" - }, - { - "astId": 17793, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "bufferB", - "offset": 0, - "slot": "4", - "type": "t_struct(Buffer)17785_storage" - }, - { - "astId": 17795, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "nextOverwritableIndex", - "offset": 0, - "slot": "6", - "type": "t_uint256" - } - ], - "numberOfBytes": "224" - }, - "t_uint256": { - "encoding": "inplace", - "label": "uint256", - "numberOfBytes": "32" - } - } - } -} \ No newline at end of file diff --git a/packages/contracts/deployments/kovan/OVM_ChainStorageContainer-SCC-batches.json b/packages/contracts/deployments/kovan/OVM_ChainStorageContainer-SCC-batches.json deleted file mode 100644 index 3c26690082830..0000000000000 --- a/packages/contracts/deployments/kovan/OVM_ChainStorageContainer-SCC-batches.json +++ /dev/null @@ -1,442 +0,0 @@ -{ - "address": "0xDC1f37ec1eeBF9fe5087c24f889E15AB228FDD22", - "abi": [ - { - "inputs": [ - { - "internalType": "address", - "name": "_libAddressManager", - "type": "address" - }, - { - "internalType": "string", - "name": "_owner", - "type": "string" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_index", - "type": "uint256" - }, - { - "internalType": "bytes27", - "name": "_globalMetadata", - "type": "bytes27" - } - ], - "name": "deleteElementsAfterInclusive", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_index", - "type": "uint256" - } - ], - "name": "deleteElementsAfterInclusive", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_index", - "type": "uint256" - } - ], - "name": "get", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getGlobalMetadata", - "outputs": [ - { - "internalType": "bytes27", - "name": "", - "type": "bytes27" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "length", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "libAddressManager", - "outputs": [ - { - "internalType": "contract Lib_AddressManager", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "owner", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "_object", - "type": "bytes32" - }, - { - "internalType": "bytes27", - "name": "_globalMetadata", - "type": "bytes27" - } - ], - "name": "push", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "_object", - "type": "bytes32" - } - ], - "name": "push", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "string", - "name": "_name", - "type": "string" - } - ], - "name": "resolve", - "outputs": [ - { - "internalType": "address", - "name": "_contract", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes27", - "name": "_globalMetadata", - "type": "bytes27" - } - ], - "name": "setGlobalMetadata", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_index", - "type": "uint256" - } - ], - "name": "setNextOverwritableIndex", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - } - ], - "transactionHash": "0x6d7a62089c7d99506e0225f18c8e70ebe40d4404264d118ad5f6fd3032a310be", - "receipt": { - "to": null, - "from": "0x18394B52d3Cb931dfA76F63251919D051953413d", - "contractAddress": "0xDC1f37ec1eeBF9fe5087c24f889E15AB228FDD22", - "transactionIndex": 1, - "gasUsed": "959473", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0x3c641cd07d53e9a3ee8ae57156276953c8eef1df8e7fc6a68910e98896ce926e", - "transactionHash": "0x6d7a62089c7d99506e0225f18c8e70ebe40d4404264d118ad5f6fd3032a310be", - "logs": [], - "blockNumber": 24199479, - "cumulativeGasUsed": "1026353", - "status": 1, - "byzantium": true - }, - "args": [ - "0xFaf27b24ba54C6910C12CFF5C9453C0e8D634e05", - "OVM_StateCommitmentChain" - ], - "solcInputHash": "03aed03b958b1d37f90bd88d0f56dd85", - "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_owner\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"get\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getGlobalMetadata\",\"outputs\":[{\"internalType\":\"bytes27\",\"name\":\"\",\"type\":\"bytes27\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"length\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"_contract\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"setGlobalMetadata\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"setNextOverwritableIndex\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The Chain Storage Container provides its owner contract with read, write and delete functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which can no longer be used in a fraud proof due to the fraud window having passed, and the associated chain state or transactions being finalized. Three distinct Chain Storage Containers will be deployed on Layer 1: 1. Stores transaction batches for the Canonical Transaction Chain 2. Stores queued transactions for the Canonical Transaction Chain 3. Stores chain state batches for the State Commitment Chain Compiler used: solc Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\",\"_owner\":\"Name of the contract that owns this container (will be resolved later).\"}},\"deleteElementsAfterInclusive(uint256)\":{\"params\":{\"_index\":\"Object index to delete from.\"}},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_index\":\"Object index to delete from.\"}},\"get(uint256)\":{\"params\":{\"_index\":\"Index of the particular object to access.\"},\"returns\":{\"_0\":\"32 byte object value.\"}},\"getGlobalMetadata()\":{\"returns\":{\"_0\":\"Container global metadata field.\"}},\"length()\":{\"returns\":{\"_0\":\"Number of objects in the container.\"}},\"push(bytes32)\":{\"params\":{\"_object\":\"A 32 byte value to insert into the container.\"}},\"push(bytes32,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_object\":\"A 32 byte value to insert into the container.\"}},\"setGlobalMetadata(bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata to set.\"}}},\"title\":\"OVM_ChainStorageContainer\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"deleteElementsAfterInclusive(uint256)\":{\"notice\":\"Removes all objects after and including a given index.\"},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"notice\":\"Removes all objects after and including a given index. Also allows setting the global metadata field.\"},\"get(uint256)\":{\"notice\":\"Retrieves an object from the container.\"},\"getGlobalMetadata()\":{\"notice\":\"Retrieves the container's global metadata field.\"},\"length()\":{\"notice\":\"Retrieves the number of objects stored in the container.\"},\"push(bytes32)\":{\"notice\":\"Pushes an object into the container.\"},\"push(bytes32,bytes27)\":{\"notice\":\"Pushes an object into the container. Function allows setting the global metadata since we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global metadata (it's an optimization).\"},\"setGlobalMetadata(bytes27)\":{\"notice\":\"Sets the container's global metadata field. We're using `bytes27` here because we use five bytes to maintain the length of the underlying data structure, meaning we have an extra 27 bytes to store arbitrary data.\"},\"setNextOverwritableIndex(uint256)\":{\"notice\":\"Marks an index as overwritable, meaing the underlying buffer can start to write values over any objects before and including the given index.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol\":\"OVM_ChainStorageContainer\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_RingBuffer } from \\\"../../libraries/utils/Lib_RingBuffer.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_ChainStorageContainer } from \\\"../../iOVM/chain/iOVM_ChainStorageContainer.sol\\\";\\n\\n/**\\n * @title OVM_ChainStorageContainer\\n * @dev The Chain Storage Container provides its owner contract with read, write and delete functionality.\\n * This provides gas efficiency gains by enabling it to overwrite storage slots which can no longer be used\\n * in a fraud proof due to the fraud window having passed, and the associated chain state or\\n * transactions being finalized.\\n * Three distinct Chain Storage Containers will be deployed on Layer 1:\\n * 1. Stores transaction batches for the Canonical Transaction Chain\\n * 2. Stores queued transactions for the Canonical Transaction Chain\\n * 3. Stores chain state batches for the State Commitment Chain\\n *\\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract OVM_ChainStorageContainer is iOVM_ChainStorageContainer, Lib_AddressResolver {\\n\\n /*************\\n * Libraries *\\n *************/\\n\\n using Lib_RingBuffer for Lib_RingBuffer.RingBuffer;\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n string public owner;\\n Lib_RingBuffer.RingBuffer internal buffer;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n * @param _owner Name of the contract that owns this container (will be resolved later).\\n */\\n constructor(\\n address _libAddressManager,\\n string memory _owner\\n )\\n Lib_AddressResolver(_libAddressManager)\\n {\\n owner = _owner;\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n msg.sender == resolve(owner),\\n \\\"OVM_ChainStorageContainer: Function can only be called by the owner.\\\"\\n );\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function setGlobalMetadata(\\n bytes27 _globalMetadata\\n )\\n override\\n public\\n onlyOwner\\n {\\n return buffer.setExtraData(_globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function getGlobalMetadata()\\n override\\n public\\n view\\n returns (\\n bytes27\\n )\\n {\\n return buffer.getExtraData();\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function length()\\n override\\n public\\n view\\n returns (\\n uint256\\n )\\n {\\n return uint256(buffer.getLength());\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function push(\\n bytes32 _object\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.push(_object);\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function push(\\n bytes32 _object,\\n bytes27 _globalMetadata\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.push(_object, _globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function get(\\n uint256 _index\\n )\\n override\\n public\\n view\\n returns (\\n bytes32\\n )\\n {\\n return buffer.get(uint40(_index));\\n }\\n \\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.deleteElementsAfterInclusive(\\n uint40(_index)\\n );\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index,\\n bytes27 _globalMetadata\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.deleteElementsAfterInclusive(\\n uint40(_index),\\n _globalMetadata\\n );\\n }\\n\\n /**\\n * @inheritdoc iOVM_ChainStorageContainer\\n */\\n function setNextOverwritableIndex(\\n uint256 _index\\n )\\n override\\n public\\n onlyOwner\\n {\\n buffer.nextOverwritableIndex = _index;\\n }\\n}\\n\",\"keccak256\":\"0x52e3ef7166fe134d32997917067e3d74128173b12fb6231eec34132102ddbb50\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_ChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title iOVM_ChainStorageContainer\\n */\\ninterface iOVM_ChainStorageContainer {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata()\\n external\\n view\\n returns (\\n bytes27\\n );\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length()\\n external\\n view\\n returns (\\n uint256\\n );\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(\\n bytes32 _object\\n )\\n external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(\\n bytes32 _object,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(\\n uint256 _index\\n )\\n external\\n view\\n returns (\\n bytes32\\n );\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index\\n )\\n external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Marks an index as overwritable, meaing the underlying buffer can start to write values over\\n * any objects before and including the given index.\\n */\\n function setNextOverwritableIndex(\\n uint256 _index\\n )\\n external;\\n}\\n\",\"keccak256\":\"0x2d7973a0ad84c23ec62624d3f1e3aeb198cc72686ff1e6cfa17155556b320c94\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Contract Imports */\\nimport { Ownable } from \\\"./Lib_Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n /*******************************************\\n * Contract Variables: Internal Accounting *\\n *******************************************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n public\\n onlyOwner\\n {\\n emit AddressSet(_name, _address);\\n addresses[_getNameHash(_name)] = _address;\\n }\\n\\n function getAddress(\\n string memory _name\\n )\\n public\\n view\\n returns (address)\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32 _hash\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0x3a490595cc21ff170e4027843093670ff845d5972481fbfb956b722ea564bb06\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n\\n /*******************************************\\n * Contract Variables: Contract References *\\n *******************************************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(\\n address _libAddressManager\\n ) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function resolve(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address _contract\\n )\\n {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0xaa3ed342f6deb156c660fd83afa579a3b80db17eb465e8949cf5c1b114780143\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Ownable\\n * @dev Adapted from https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol\\n */\\nabstract contract Ownable {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n address public owner;\\n\\n\\n /**********\\n * Events *\\n **********/\\n\\n event OwnershipTransferred(\\n address indexed previousOwner,\\n address indexed newOwner\\n );\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n constructor() {\\n owner = msg.sender;\\n emit OwnershipTransferred(address(0), owner);\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n owner == msg.sender,\\n \\\"Ownable: caller is not the owner\\\"\\n );\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function renounceOwnership()\\n public\\n virtual\\n onlyOwner\\n {\\n emit OwnershipTransferred(owner, address(0));\\n owner = address(0);\\n }\\n\\n function transferOwnership(address _newOwner)\\n public\\n virtual\\n onlyOwner\\n {\\n require(\\n _newOwner != address(0),\\n \\\"Ownable: new owner cannot be the zero address\\\"\\n );\\n\\n emit OwnershipTransferred(owner, _newOwner);\\n owner = _newOwner;\\n }\\n}\\n\",\"keccak256\":\"0xd9dfd9264e5b5fedd53a5b10fdf179c3f367614b0fe69179bce4e45119f5b739\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_RingBuffer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\nlibrary Lib_RingBuffer {\\n using Lib_RingBuffer for RingBuffer;\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Buffer {\\n uint256 length;\\n mapping (uint256 => bytes32) buf;\\n }\\n\\n struct RingBuffer {\\n bytes32 contextA;\\n bytes32 contextB;\\n Buffer bufferA;\\n Buffer bufferB;\\n uint256 nextOverwritableIndex;\\n }\\n\\n struct RingBufferContext {\\n // contextA\\n uint40 globalIndex;\\n bytes27 extraData;\\n\\n // contextB\\n uint64 currBufferIndex;\\n uint40 prevResetIndex;\\n uint40 currResetIndex;\\n }\\n\\n\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 constant MIN_CAPACITY = 16;\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n * @param _extraData Optional global extra data.\\n */\\n function push(\\n RingBuffer storage _self,\\n bytes32 _value,\\n bytes27 _extraData\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n Buffer storage currBuffer = _self.getBuffer(ctx.currBufferIndex);\\n\\n // Set a minimum capacity.\\n if (currBuffer.length == 0) {\\n currBuffer.length = MIN_CAPACITY;\\n }\\n\\n // Check if we need to expand the buffer.\\n if (ctx.globalIndex - ctx.currResetIndex >= currBuffer.length) {\\n if (ctx.currResetIndex < _self.nextOverwritableIndex) {\\n // We're going to overwrite the inactive buffer.\\n // Bump the buffer index, reset the delete offset, and set our reset indices.\\n ctx.currBufferIndex++;\\n ctx.prevResetIndex = ctx.currResetIndex;\\n ctx.currResetIndex = ctx.globalIndex;\\n\\n // Swap over to the next buffer.\\n currBuffer = _self.getBuffer(ctx.currBufferIndex);\\n } else {\\n // We're not overwriting yet, double the length of the current buffer.\\n currBuffer.length *= 2;\\n }\\n }\\n\\n // Index to write to is the difference of the global and reset indices.\\n uint256 writeHead = ctx.globalIndex - ctx.currResetIndex;\\n currBuffer.buf[writeHead] = _value;\\n\\n // Bump the global index and insert our extra data, then save the context.\\n ctx.globalIndex++;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n */\\n function push(\\n RingBuffer storage _self,\\n bytes32 _value\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n \\n _self.push(\\n _value,\\n ctx.extraData\\n );\\n }\\n\\n /**\\n * Retrieves an element from the buffer.\\n * @param _self Buffer to access.\\n * @param _index Element index to retrieve.\\n * @return Value of the element at the given index.\\n */\\n function get(\\n RingBuffer storage _self,\\n uint256 _index\\n )\\n internal\\n view\\n returns (\\n bytes32 \\n )\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n\\n require(\\n _index < ctx.globalIndex,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n Buffer storage currBuffer = _self.getBuffer(ctx.currBufferIndex);\\n Buffer storage prevBuffer = _self.getBuffer(ctx.currBufferIndex + 1);\\n\\n if (_index >= ctx.currResetIndex) {\\n // We're trying to load an element from the current buffer.\\n // Relative index is just the difference from the reset index.\\n uint256 relativeIndex = _index - ctx.currResetIndex;\\n\\n // Shouldn't happen but why not check.\\n require(\\n relativeIndex < currBuffer.length,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n return currBuffer.buf[relativeIndex];\\n } else {\\n // We're trying to load an element from the previous buffer.\\n // Relative index is the difference from the reset index in the other direction.\\n uint256 relativeIndex = ctx.currResetIndex - _index;\\n\\n // Condition only fails in the case that we deleted and flipped buffers.\\n require(\\n ctx.currResetIndex > ctx.prevResetIndex,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n // Make sure we're not trying to read beyond the array.\\n require(\\n relativeIndex <= prevBuffer.length,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n return prevBuffer.buf[prevBuffer.length - relativeIndex];\\n }\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n * @param _extraData Optional global extra data.\\n */\\n function deleteElementsAfterInclusive(\\n RingBuffer storage _self,\\n uint40 _index,\\n bytes27 _extraData\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n\\n require(\\n _index < ctx.globalIndex && _index >= ctx.prevResetIndex,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n if (_index < ctx.currResetIndex) {\\n // We're switching back to the previous buffer.\\n // Reduce the buffer index, set the current reset index back to match the previous one.\\n // We use the equality of these two values to prevent reading beyond this buffer.\\n ctx.currBufferIndex--;\\n ctx.currResetIndex = ctx.prevResetIndex;\\n }\\n\\n // Set our global index and extra data, save the context.\\n ctx.globalIndex = _index;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n */\\n function deleteElementsAfterInclusive(\\n RingBuffer storage _self,\\n uint40 _index\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n _self.deleteElementsAfterInclusive(\\n _index,\\n ctx.extraData\\n );\\n }\\n\\n /**\\n * Retrieves the current global index.\\n * @param _self Buffer to access.\\n * @return Current global index.\\n */\\n function getLength(\\n RingBuffer storage _self\\n )\\n internal\\n view\\n returns (\\n uint40\\n )\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n return ctx.globalIndex;\\n }\\n\\n /**\\n * Changes current global extra data.\\n * @param _self Buffer to access.\\n * @param _extraData New global extra data.\\n */\\n function setExtraData(\\n RingBuffer storage _self,\\n bytes27 _extraData\\n )\\n internal\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Retrieves the current global extra data.\\n * @param _self Buffer to access.\\n * @return Current global extra data.\\n */\\n function getExtraData(\\n RingBuffer storage _self\\n )\\n internal\\n view\\n returns (\\n bytes27\\n )\\n {\\n RingBufferContext memory ctx = _self.getContext();\\n return ctx.extraData;\\n }\\n\\n /**\\n * Sets the current ring buffer context.\\n * @param _self Buffer to access.\\n * @param _ctx Current ring buffer context.\\n */\\n function setContext(\\n RingBuffer storage _self,\\n RingBufferContext memory _ctx\\n )\\n internal\\n {\\n bytes32 contextA;\\n bytes32 contextB;\\n\\n uint40 globalIndex = _ctx.globalIndex;\\n bytes27 extraData = _ctx.extraData;\\n assembly {\\n contextA := globalIndex\\n contextA := or(contextA, extraData)\\n }\\n\\n uint64 currBufferIndex = _ctx.currBufferIndex;\\n uint40 prevResetIndex = _ctx.prevResetIndex;\\n uint40 currResetIndex = _ctx.currResetIndex;\\n assembly {\\n contextB := currBufferIndex\\n contextB := or(contextB, shl(64, prevResetIndex))\\n contextB := or(contextB, shl(104, currResetIndex))\\n }\\n\\n if (_self.contextA != contextA) {\\n _self.contextA = contextA;\\n }\\n\\n if (_self.contextB != contextB) {\\n _self.contextB = contextB;\\n }\\n }\\n\\n /**\\n * Retrieves the current ring buffer context.\\n * @param _self Buffer to access.\\n * @return Current ring buffer context.\\n */\\n function getContext(\\n RingBuffer storage _self\\n )\\n internal\\n view\\n returns (\\n RingBufferContext memory\\n )\\n {\\n bytes32 contextA = _self.contextA;\\n bytes32 contextB = _self.contextB;\\n\\n uint40 globalIndex;\\n bytes27 extraData;\\n assembly {\\n globalIndex := and(contextA, 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF)\\n extraData := and(contextA, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000)\\n }\\n\\n uint64 currBufferIndex;\\n uint40 prevResetIndex;\\n uint40 currResetIndex;\\n assembly {\\n currBufferIndex := and(contextB, 0x000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF)\\n prevResetIndex := shr(64, and(contextB, 0x00000000000000000000000000000000000000FFFFFFFFFF0000000000000000))\\n currResetIndex := shr(104, and(contextB, 0x0000000000000000000000000000FFFFFFFFFF00000000000000000000000000))\\n }\\n\\n return RingBufferContext({\\n globalIndex: globalIndex,\\n extraData: extraData,\\n currBufferIndex: currBufferIndex,\\n prevResetIndex: prevResetIndex,\\n currResetIndex: currResetIndex\\n });\\n }\\n\\n /**\\n * Retrieves the a buffer from the ring buffer by index.\\n * @param _self Buffer to access.\\n * @param _which Index of the sub buffer to access.\\n * @return Sub buffer for the index.\\n */\\n function getBuffer(\\n RingBuffer storage _self,\\n uint256 _which\\n )\\n internal\\n view\\n returns (\\n Buffer storage\\n )\\n {\\n return _which % 2 == 0 ? _self.bufferA : _self.bufferB;\\n }\\n}\\n\",\"keccak256\":\"0xb38cb98da2d09f922d5cfe772bdbd36ede2b2267ade93128e949c9da21b89940\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x60806040523480156200001157600080fd5b506040516200116438038062001164833981810160405260408110156200003757600080fd5b8151602083018051604051929492938301929190846401000000008211156200005f57600080fd5b9083019060208201858111156200007557600080fd5b82516401000000008111828201881017156200009057600080fd5b82525081516020918201929091019080838360005b83811015620000bf578181015183820152602001620000a5565b50505050905090810190601f168015620000ed5780820380516001836020036101000a031916815260200191505b506040525050600080546001600160a01b0319166001600160a01b038516179055508051620001249060019060208401906200012d565b505050620001d9565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282620001655760008555620001b0565b82601f106200018057805160ff1916838001178555620001b0565b82800160010185558215620001b0579182015b82811115620001b057825182559160200191906001019062000193565b50620001be929150620001c2565b5090565b5b80821115620001be5760008155600101620001c3565b610f7b80620001e96000396000f3fe608060405234801561001057600080fd5b50600436106100b45760003560e01c80634651d91e116100715780634651d91e1461021a5780638da5cb5b146102375780639507d39a146102b4578063b298e36b146102d1578063ccf8f969146102ee578063fa9e936c14610311576100b4565b8063167fd681146100b95780631f7b6d32146100e65780632015276c1461010057806329061de21461012b578063299ca47814610150578063461a447814610174575b600080fd5b6100e4600480360360408110156100cf57600080fd5b508035906020013564ffffffffff191661032e565b005b6100ee610423565b60408051918252519081900360200190f35b6100e46004803603604081101561011657600080fd5b508035906020013564ffffffffff191661043b565b6100e46004803603602081101561014157600080fd5b503564ffffffffff19166104f7565b6101586105b5565b604080516001600160a01b039092168252519081900360200190f35b6101586004803603602081101561018a57600080fd5b8101906020810181356401000000008111156101a557600080fd5b8201836020820111156101b757600080fd5b803590602001918460018302840111640100000000831117156101d957600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506105c4945050505050565b6100e46004803603602081101561023057600080fd5b50356106a0565b61023f61075b565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610279578181015183820152602001610261565b50505050905090810190601f1680156102a65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6100ee600480360360208110156102ca57600080fd5b50356107e8565b6100e4600480360360208110156102e757600080fd5b5035610802565b6102f66108bd565b6040805164ffffffffff199092168252519081900360200190f35b6100e46004803603602081101561032757600080fd5b50356108ce565b60018054604080516020601f6002600019610100878916150201909516949094049384018190048102820181019092528281526103c493909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b820191906000526020600020905b81548152906001019060200180831161039d57829003601f168201915b50505050506105c4565b6001600160a01b0316336001600160a01b0316146104135760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b61041f60028383610983565b5050565b600061042f6002610a75565b64ffffffffff16905090565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261049c93909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146104eb5760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b61041f60028383610a89565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261055893909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146105a75760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b6105b2600282610b90565b50565b6000546001600160a01b031681565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b8381101561062457818101518382015260200161060c565b50505050905090810190601f1680156106515780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561066e57600080fd5b505afa158015610682573d6000803e3d6000fd5b505050506040513d602081101561069857600080fd5b505192915050565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261070193909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146107505760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b6105b2600282610bba565b60018054604080516020600284861615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156107e05780601f106107b5576101008083540402835291602001916107e0565b820191906000526020600020905b8154815290600101906020018083116107c357829003601f168201915b505050505081565b60006107fc600264ffffffffff8416610be0565b92915050565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261086393909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146108b25760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b6105b2600282610de9565b60006108c96002610e0f565b905090565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261092f93909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b03161461097e5760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b600855565b600061098e84610e26565b9050806000015164ffffffffff168364ffffffffff161080156109c35750806060015164ffffffffff168364ffffffffff1610155b610a0b576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b806080015164ffffffffff168364ffffffffff161015610a4d576040810180516000190167ffffffffffffffff169052606081015164ffffffffff1660808201525b64ffffffffff8316815264ffffffffff1982166020820152610a6f8482610e86565b50505050565b600080610a8183610e26565b519392505050565b6000610a9484610e26565b90506000610ab9826040015167ffffffffffffffff1686610edc90919063ffffffff16565b8054909150610ac757601081555b8054608083015183510364ffffffffff1610610b3e578460060154826080015164ffffffffff161015610b365760408201805160010167ffffffffffffffff169081905260808301805164ffffffffff90811660608601528451169052610b2f908690610edc565b9050610b3e565b805460020281555b608082015182510364ffffffffff9081166000818152600184810160209081526040909220889055855101909216845264ffffffffff19851691840191909152610b888684610e86565b505050505050565b6000610b9b83610e26565b64ffffffffff19831660208201529050610bb58382610e86565b505050565b6000610bc583610e26565b9050610bb5828260200151856109839092919063ffffffff16565b600080610bec84610e26565b805190915064ffffffffff168310610c42576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b6000610c65826040015167ffffffffffffffff1686610edc90919063ffffffff16565b90506000610c8d836040015160010167ffffffffffffffff1687610edc90919063ffffffff16565b9050826080015164ffffffffff168510610d1a576080830151825464ffffffffff9091168603908110610cfe576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b6000908152600190920160205250604090205491506107fc9050565b6080830151606084015164ffffffffff9182168781039290911610610d7d576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b8154811115610dca576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b81540360009081526001909101602052604090205492506107fc915050565b6000610df483610e26565b9050610bb582826020015185610a899092919063ffffffff16565b600080610e1b83610e26565b602001519392505050565b610e2e610efc565b5080546001909101546040805160a08101825264ffffffffff808516825264ffffffffff19909416602082015267ffffffffffffffff8316818301529082901c8316606082015260689190911c909116608082015290565b80516020820151604080840151606085015160808601518754858717969483901b8417606883901b1795939291908714610ebe578689555b85896001015414610ed157600189018690555b505050505050505050565b60006002820615610ef05782600401610ef5565b826002015b9392505050565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091529056fe4f564d5f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2063616e206f6e6c792062652063616c6c656420627920746865206f776e65722ea164736f6c6343000706000a", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100b45760003560e01c80634651d91e116100715780634651d91e1461021a5780638da5cb5b146102375780639507d39a146102b4578063b298e36b146102d1578063ccf8f969146102ee578063fa9e936c14610311576100b4565b8063167fd681146100b95780631f7b6d32146100e65780632015276c1461010057806329061de21461012b578063299ca47814610150578063461a447814610174575b600080fd5b6100e4600480360360408110156100cf57600080fd5b508035906020013564ffffffffff191661032e565b005b6100ee610423565b60408051918252519081900360200190f35b6100e46004803603604081101561011657600080fd5b508035906020013564ffffffffff191661043b565b6100e46004803603602081101561014157600080fd5b503564ffffffffff19166104f7565b6101586105b5565b604080516001600160a01b039092168252519081900360200190f35b6101586004803603602081101561018a57600080fd5b8101906020810181356401000000008111156101a557600080fd5b8201836020820111156101b757600080fd5b803590602001918460018302840111640100000000831117156101d957600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506105c4945050505050565b6100e46004803603602081101561023057600080fd5b50356106a0565b61023f61075b565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610279578181015183820152602001610261565b50505050905090810190601f1680156102a65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6100ee600480360360208110156102ca57600080fd5b50356107e8565b6100e4600480360360208110156102e757600080fd5b5035610802565b6102f66108bd565b6040805164ffffffffff199092168252519081900360200190f35b6100e46004803603602081101561032757600080fd5b50356108ce565b60018054604080516020601f6002600019610100878916150201909516949094049384018190048102820181019092528281526103c493909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b820191906000526020600020905b81548152906001019060200180831161039d57829003601f168201915b50505050506105c4565b6001600160a01b0316336001600160a01b0316146104135760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b61041f60028383610983565b5050565b600061042f6002610a75565b64ffffffffff16905090565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261049c93909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146104eb5760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b61041f60028383610a89565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261055893909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146105a75760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b6105b2600282610b90565b50565b6000546001600160a01b031681565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b8381101561062457818101518382015260200161060c565b50505050905090810190601f1680156106515780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561066e57600080fd5b505afa158015610682573d6000803e3d6000fd5b505050506040513d602081101561069857600080fd5b505192915050565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261070193909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146107505760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b6105b2600282610bba565b60018054604080516020600284861615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156107e05780601f106107b5576101008083540402835291602001916107e0565b820191906000526020600020905b8154815290600101906020018083116107c357829003601f168201915b505050505081565b60006107fc600264ffffffffff8416610be0565b92915050565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261086393909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b0316146108b25760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b6105b2600282610de9565b60006108c96002610e0f565b905090565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815261092f93909290918301828280156103ba5780601f1061038f576101008083540402835291602001916103ba565b6001600160a01b0316336001600160a01b03161461097e5760405162461bcd60e51b8152600401808060200182810382526044815260200180610f2b6044913960600191505060405180910390fd5b600855565b600061098e84610e26565b9050806000015164ffffffffff168364ffffffffff161080156109c35750806060015164ffffffffff168364ffffffffff1610155b610a0b576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b806080015164ffffffffff168364ffffffffff161015610a4d576040810180516000190167ffffffffffffffff169052606081015164ffffffffff1660808201525b64ffffffffff8316815264ffffffffff1982166020820152610a6f8482610e86565b50505050565b600080610a8183610e26565b519392505050565b6000610a9484610e26565b90506000610ab9826040015167ffffffffffffffff1686610edc90919063ffffffff16565b8054909150610ac757601081555b8054608083015183510364ffffffffff1610610b3e578460060154826080015164ffffffffff161015610b365760408201805160010167ffffffffffffffff169081905260808301805164ffffffffff90811660608601528451169052610b2f908690610edc565b9050610b3e565b805460020281555b608082015182510364ffffffffff9081166000818152600184810160209081526040909220889055855101909216845264ffffffffff19851691840191909152610b888684610e86565b505050505050565b6000610b9b83610e26565b64ffffffffff19831660208201529050610bb58382610e86565b505050565b6000610bc583610e26565b9050610bb5828260200151856109839092919063ffffffff16565b600080610bec84610e26565b805190915064ffffffffff168310610c42576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b6000610c65826040015167ffffffffffffffff1686610edc90919063ffffffff16565b90506000610c8d836040015160010167ffffffffffffffff1687610edc90919063ffffffff16565b9050826080015164ffffffffff168510610d1a576080830151825464ffffffffff9091168603908110610cfe576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b6000908152600190920160205250604090205491506107fc9050565b6080830151606084015164ffffffffff9182168781039290911610610d7d576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b8154811115610dca576040805162461bcd60e51b815260206004820152601460248201527324b73232bc1037baba1037b3103137bab732399760611b604482015290519081900360640190fd5b81540360009081526001909101602052604090205492506107fc915050565b6000610df483610e26565b9050610bb582826020015185610a899092919063ffffffff16565b600080610e1b83610e26565b602001519392505050565b610e2e610efc565b5080546001909101546040805160a08101825264ffffffffff808516825264ffffffffff19909416602082015267ffffffffffffffff8316818301529082901c8316606082015260689190911c909116608082015290565b80516020820151604080840151606085015160808601518754858717969483901b8417606883901b1795939291908714610ebe578689555b85896001015414610ed157600189018690555b505050505050505050565b60006002820615610ef05782600401610ef5565b826002015b9392505050565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091529056fe4f564d5f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2063616e206f6e6c792062652063616c6c656420627920746865206f776e65722ea164736f6c6343000706000a", - "devdoc": { - "details": "The Chain Storage Container provides its owner contract with read, write and delete functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which can no longer be used in a fraud proof due to the fraud window having passed, and the associated chain state or transactions being finalized. Three distinct Chain Storage Containers will be deployed on Layer 1: 1. Stores transaction batches for the Canonical Transaction Chain 2. Stores queued transactions for the Canonical Transaction Chain 3. Stores chain state batches for the State Commitment Chain Compiler used: solc Runtime target: EVM", - "kind": "dev", - "methods": { - "constructor": { - "params": { - "_libAddressManager": "Address of the Address Manager.", - "_owner": "Name of the contract that owns this container (will be resolved later)." - } - }, - "deleteElementsAfterInclusive(uint256)": { - "params": { - "_index": "Object index to delete from." - } - }, - "deleteElementsAfterInclusive(uint256,bytes27)": { - "params": { - "_globalMetadata": "New global metadata for the container.", - "_index": "Object index to delete from." - } - }, - "get(uint256)": { - "params": { - "_index": "Index of the particular object to access." - }, - "returns": { - "_0": "32 byte object value." - } - }, - "getGlobalMetadata()": { - "returns": { - "_0": "Container global metadata field." - } - }, - "length()": { - "returns": { - "_0": "Number of objects in the container." - } - }, - "push(bytes32)": { - "params": { - "_object": "A 32 byte value to insert into the container." - } - }, - "push(bytes32,bytes27)": { - "params": { - "_globalMetadata": "New global metadata for the container.", - "_object": "A 32 byte value to insert into the container." - } - }, - "setGlobalMetadata(bytes27)": { - "params": { - "_globalMetadata": "New global metadata to set." - } - } - }, - "title": "OVM_ChainStorageContainer", - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": { - "deleteElementsAfterInclusive(uint256)": { - "notice": "Removes all objects after and including a given index." - }, - "deleteElementsAfterInclusive(uint256,bytes27)": { - "notice": "Removes all objects after and including a given index. Also allows setting the global metadata field." - }, - "get(uint256)": { - "notice": "Retrieves an object from the container." - }, - "getGlobalMetadata()": { - "notice": "Retrieves the container's global metadata field." - }, - "length()": { - "notice": "Retrieves the number of objects stored in the container." - }, - "push(bytes32)": { - "notice": "Pushes an object into the container." - }, - "push(bytes32,bytes27)": { - "notice": "Pushes an object into the container. Function allows setting the global metadata since we'll need to touch the \"length\" storage slot anyway, which also contains the global metadata (it's an optimization)." - }, - "setGlobalMetadata(bytes27)": { - "notice": "Sets the container's global metadata field. We're using `bytes27` here because we use five bytes to maintain the length of the underlying data structure, meaning we have an extra 27 bytes to store arbitrary data." - }, - "setNextOverwritableIndex(uint256)": { - "notice": "Marks an index as overwritable, meaing the underlying buffer can start to write values over any objects before and including the given index." - } - }, - "version": 1 - }, - "storageLayout": { - "storage": [ - { - "astId": 12526, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "libAddressManager", - "offset": 0, - "slot": "0", - "type": "t_contract(Lib_AddressManager)12519" - }, - { - "astId": 3772, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "owner", - "offset": 0, - "slot": "1", - "type": "t_string_storage" - }, - { - "astId": 3774, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "buffer", - "offset": 0, - "slot": "2", - "type": "t_struct(RingBuffer)17796_storage" - } - ], - "types": { - "t_bytes32": { - "encoding": "inplace", - "label": "bytes32", - "numberOfBytes": "32" - }, - "t_contract(Lib_AddressManager)12519": { - "encoding": "inplace", - "label": "contract Lib_AddressManager", - "numberOfBytes": "20" - }, - "t_mapping(t_uint256,t_bytes32)": { - "encoding": "mapping", - "key": "t_uint256", - "label": "mapping(uint256 => bytes32)", - "numberOfBytes": "32", - "value": "t_bytes32" - }, - "t_string_storage": { - "encoding": "bytes", - "label": "string", - "numberOfBytes": "32" - }, - "t_struct(Buffer)17785_storage": { - "encoding": "inplace", - "label": "struct Lib_RingBuffer.Buffer", - "members": [ - { - "astId": 17780, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "length", - "offset": 0, - "slot": "0", - "type": "t_uint256" - }, - { - "astId": 17784, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "buf", - "offset": 0, - "slot": "1", - "type": "t_mapping(t_uint256,t_bytes32)" - } - ], - "numberOfBytes": "64" - }, - "t_struct(RingBuffer)17796_storage": { - "encoding": "inplace", - "label": "struct Lib_RingBuffer.RingBuffer", - "members": [ - { - "astId": 17787, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "contextA", - "offset": 0, - "slot": "0", - "type": "t_bytes32" - }, - { - "astId": 17789, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "contextB", - "offset": 0, - "slot": "1", - "type": "t_bytes32" - }, - { - "astId": 17791, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "bufferA", - "offset": 0, - "slot": "2", - "type": "t_struct(Buffer)17785_storage" - }, - { - "astId": 17793, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "bufferB", - "offset": 0, - "slot": "4", - "type": "t_struct(Buffer)17785_storage" - }, - { - "astId": 17795, - "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol:OVM_ChainStorageContainer", - "label": "nextOverwritableIndex", - "offset": 0, - "slot": "6", - "type": "t_uint256" - } - ], - "numberOfBytes": "224" - }, - "t_uint256": { - "encoding": "inplace", - "label": "uint256", - "numberOfBytes": "32" - } - } - } -} \ No newline at end of file diff --git a/packages/contracts/deployments/kovan-v3/OVM_ChainStorageContainer:CTC:batches.json b/packages/contracts/deployments/kovan/OVM_ChainStorageContainer:CTC:batches.json similarity index 100% rename from packages/contracts/deployments/kovan-v3/OVM_ChainStorageContainer:CTC:batches.json rename to packages/contracts/deployments/kovan/OVM_ChainStorageContainer:CTC:batches.json diff --git a/packages/contracts/deployments/kovan-v3/OVM_ChainStorageContainer:CTC:queue.json b/packages/contracts/deployments/kovan/OVM_ChainStorageContainer:CTC:queue.json similarity index 100% rename from packages/contracts/deployments/kovan-v3/OVM_ChainStorageContainer:CTC:queue.json rename to packages/contracts/deployments/kovan/OVM_ChainStorageContainer:CTC:queue.json diff --git a/packages/contracts/deployments/kovan-v3/OVM_ChainStorageContainer:SCC:batches.json b/packages/contracts/deployments/kovan/OVM_ChainStorageContainer:SCC:batches.json similarity index 100% rename from packages/contracts/deployments/kovan-v3/OVM_ChainStorageContainer:SCC:batches.json rename to packages/contracts/deployments/kovan/OVM_ChainStorageContainer:SCC:batches.json diff --git a/packages/contracts/deployments/kovan/OVM_ExecutionManager.json b/packages/contracts/deployments/kovan/OVM_ExecutionManager.json index 7711e2af9bad2..2a066f76e0024 100644 --- a/packages/contracts/deployments/kovan/OVM_ExecutionManager.json +++ b/packages/contracts/deployments/kovan/OVM_ExecutionManager.json @@ -1,5 +1,5 @@ { - "address": "0x1e9d3f68422b50d3Fc413cb6a79C4144089cf64A", + "address": "0xa2EB1961183a04157fF707Fa2Be2249e149c8FAB", "abi": [ { "inputs": [ @@ -513,7 +513,7 @@ "outputs": [ { "internalType": "address", - "name": "_contract", + "name": "", "type": "address" } ], @@ -571,6 +571,35 @@ } ], "name": "run", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_gasLimit", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "_creationCode", + "type": "bytes" + }, + { + "internalType": "address", + "name": "_address", + "type": "address" + } + ], + "name": "safeCREATE", "outputs": [], "stateMutability": "nonpayable", "type": "function" @@ -647,24 +676,24 @@ "type": "function" } ], - "transactionHash": "0xbdd44d365f41a8f1645f86ae7f02ebf64a8057329019efd16c5eb5e235b2e17c", + "transactionHash": "0x8da706bbdc66066481106f6452161e0f6ad95f928a10f6a86b7175a52f2057c5", "receipt": { "to": null, "from": "0x18394B52d3Cb931dfA76F63251919D051953413d", - "contractAddress": "0x1e9d3f68422b50d3Fc413cb6a79C4144089cf64A", - "transactionIndex": 2, - "gasUsed": "3296154", + "contractAddress": "0xa2EB1961183a04157fF707Fa2Be2249e149c8FAB", + "transactionIndex": 1, + "gasUsed": "2901234", "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0x5c809c68bb1e5bc0fc02f0a05343ad5e844f6e8a33be0c897bb1695cd8a70c1a", - "transactionHash": "0xbdd44d365f41a8f1645f86ae7f02ebf64a8057329019efd16c5eb5e235b2e17c", + "blockHash": "0xe33c92c8c1fef82666476fb549221769ae5c6ec66490489f8c123a07b6a0d115", + "transactionHash": "0x8da706bbdc66066481106f6452161e0f6ad95f928a10f6a86b7175a52f2057c5", "logs": [], - "blockNumber": 24199505, - "cumulativeGasUsed": "3572389", + "blockNumber": 24572845, + "cumulativeGasUsed": "3041792", "status": 1, "byzantium": true }, "args": [ - "0xFaf27b24ba54C6910C12CFF5C9453C0e8D634e05", + "0xd56F695e73286ac252A37593DD4E7c14270eC1Df", { "minTransactionGasLimit": 50000, "maxTransactionGasLimit": 9000000, @@ -672,13 +701,13 @@ "secondsPerEpoch": 0 }, { - "ovmCHAINID": 69 + "ovmCHAINID": 420 } ], - "solcInputHash": "03aed03b958b1d37f90bd88d0f56dd85", - "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"minTransactionGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxTransactionGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxGasPerQueuePerEpoch\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"secondsPerEpoch\",\"type\":\"uint256\"}],\"internalType\":\"struct iOVM_ExecutionManager.GasMeterConfig\",\"name\":\"_gasMeterConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"ovmCHAINID\",\"type\":\"uint256\"}],\"internalType\":\"struct iOVM_ExecutionManager.GlobalContext\",\"name\":\"_globalContext\",\"type\":\"tuple\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"getMaxTransactionGasLimit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_maxTransactionGasLimit\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ovmADDRESS\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"_ADDRESS\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_address\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_calldata\",\"type\":\"bytes\"}],\"name\":\"ovmCALL\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"_success\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"_returndata\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ovmCALLER\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"_CALLER\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ovmCHAINID\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_CHAINID\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_bytecode\",\"type\":\"bytes\"}],\"name\":\"ovmCREATE\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_bytecode\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"_salt\",\"type\":\"bytes32\"}],\"name\":\"ovmCREATE2\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_messageHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint8\",\"name\":\"_v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"_r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"_s\",\"type\":\"bytes32\"}],\"name\":\"ovmCREATEEOA\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_address\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_calldata\",\"type\":\"bytes\"}],\"name\":\"ovmDELEGATECALL\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"_success\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"_returndata\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_contract\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_offset\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_length\",\"type\":\"uint256\"}],\"name\":\"ovmEXTCODECOPY\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"_code\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_contract\",\"type\":\"address\"}],\"name\":\"ovmEXTCODEHASH\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"_EXTCODEHASH\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_contract\",\"type\":\"address\"}],\"name\":\"ovmEXTCODESIZE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_EXTCODESIZE\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ovmGASLIMIT\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_GASLIMIT\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ovmGETNONCE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_nonce\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ovmINCREMENTNONCE\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ovmL1QUEUEORIGIN\",\"outputs\":[{\"internalType\":\"enum Lib_OVMCodec.QueueOrigin\",\"name\":\"_queueOrigin\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ovmL1TXORIGIN\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"_l1TxOrigin\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ovmNUMBER\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_NUMBER\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"ovmREVERT\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_key\",\"type\":\"bytes32\"}],\"name\":\"ovmSLOAD\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"_value\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_key\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"_value\",\"type\":\"bytes32\"}],\"name\":\"ovmSSTORE\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_address\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_calldata\",\"type\":\"bytes\"}],\"name\":\"ovmSTATICCALL\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"_success\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"_returndata\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ovmTIMESTAMP\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_TIMESTAMP\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"_contract\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"enum Lib_OVMCodec.QueueOrigin\",\"name\":\"l1QueueOrigin\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"l1TxOrigin\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"entrypoint\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.Transaction\",\"name\":\"_transaction\",\"type\":\"tuple\"},{\"internalType\":\"address\",\"name\":\"_ovmStateManager\",\"type\":\"address\"}],\"name\":\"run\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"enum Lib_OVMCodec.QueueOrigin\",\"name\":\"l1QueueOrigin\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"l1TxOrigin\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"entrypoint\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.Transaction\",\"name\":\"_transaction\",\"type\":\"tuple\"},{\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"internalType\":\"contract iOVM_StateManager\",\"name\":\"_ovmStateManager\",\"type\":\"address\"}],\"name\":\"simulateMessage\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The Execution Manager (EM) is the core of our OVM implementation, and provides a sandboxed environment allowing us to execute OVM transactions deterministically on either Layer 1 or Layer 2. The EM's run() function is the first function called during the execution of any transaction on L2. For each context-dependent EVM operation the EM has a function which implements a corresponding OVM operation, which will read state from the State Manager contract. The EM relies on the Safety Checker to verify that code deployed to Layer 2 does not contain any context-dependent operations. Compiler used: solc Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\"}},\"ovmADDRESS()\":{\"returns\":{\"_ADDRESS\":\"Active ADDRESS within the current message context.\"}},\"ovmCALL(uint256,address,bytes)\":{\"params\":{\"_address\":\"Address of the contract to call.\",\"_calldata\":\"Data to send along with the call.\",\"_gasLimit\":\"Amount of gas to be passed into this call.\"},\"returns\":{\"_returndata\":\"Data returned by the call.\",\"_success\":\"Whether or not the call returned (rather than reverted).\"}},\"ovmCALLER()\":{\"returns\":{\"_CALLER\":\"Address of the CALLER within the current message context.\"}},\"ovmCHAINID()\":{\"returns\":{\"_CHAINID\":\"Value of the chain's CHAINID within the global context.\"}},\"ovmCREATE(bytes)\":{\"params\":{\"_bytecode\":\"Code to be used to CREATE a new contract.\"},\"returns\":{\"_0\":\"Address of the created contract.\",\"_1\":\"Revert data, if and only if the creation threw an exception.\"}},\"ovmCREATE2(bytes,bytes32)\":{\"params\":{\"_bytecode\":\"Code to be used to CREATE2 a new contract.\",\"_salt\":\"Value used to determine the contract's address.\"},\"returns\":{\"_0\":\"Address of the created contract.\",\"_1\":\"Revert data, if and only if the creation threw an exception.\"}},\"ovmCREATEEOA(bytes32,uint8,bytes32,bytes32)\":{\"details\":\"Essentially functions like ovmCREATE or ovmCREATE2, but we can bypass a lot of checks because the contract we're creating is trusted (no need to do safety checking or to handle unexpected reverts). Doesn't need to return an address because the address is assumed to be the user's actual address.\",\"params\":{\"_messageHash\":\"Hash of a message signed by some user, for verification.\",\"_r\":\"Signature `r` parameter.\",\"_s\":\"Signature `s` parameter.\",\"_v\":\"Signature `v` parameter.\"}},\"ovmDELEGATECALL(uint256,address,bytes)\":{\"params\":{\"_address\":\"Address of the contract to call.\",\"_calldata\":\"Data to send along with the call.\",\"_gasLimit\":\"Amount of gas to be passed into this call.\"},\"returns\":{\"_returndata\":\"Data returned by the call.\",\"_success\":\"Whether or not the call returned (rather than reverted).\"}},\"ovmEXTCODECOPY(address,uint256,uint256)\":{\"params\":{\"_contract\":\"Address of the contract to copy code from.\",\"_length\":\"Total number of bytes to copy from the contract's code.\",\"_offset\":\"Offset in bytes from the start of contract code to copy beyond.\"},\"returns\":{\"_code\":\"Bytes of code copied from the requested contract.\"}},\"ovmEXTCODEHASH(address)\":{\"params\":{\"_contract\":\"Address of the contract to query the hash of.\"},\"returns\":{\"_EXTCODEHASH\":\"Hash of the requested contract.\"}},\"ovmEXTCODESIZE(address)\":{\"params\":{\"_contract\":\"Address of the contract to query the size of.\"},\"returns\":{\"_EXTCODESIZE\":\"Size of the requested contract in bytes.\"}},\"ovmGASLIMIT()\":{\"returns\":{\"_GASLIMIT\":\"Value of the block's GASLIMIT within the transaction context.\"}},\"ovmGETNONCE()\":{\"returns\":{\"_nonce\":\"Nonce of the current contract.\"}},\"ovmL1QUEUEORIGIN()\":{\"returns\":{\"_queueOrigin\":\"Address of the ovmL1QUEUEORIGIN within the current message context.\"}},\"ovmL1TXORIGIN()\":{\"returns\":{\"_l1TxOrigin\":\"Address of the account which sent the tx into L2 from L1.\"}},\"ovmNUMBER()\":{\"returns\":{\"_NUMBER\":\"Value of the NUMBER within the transaction context.\"}},\"ovmREVERT(bytes)\":{\"params\":{\"_data\":\"Bytes data to pass along with the REVERT.\"}},\"ovmSLOAD(bytes32)\":{\"params\":{\"_key\":\"32 byte key of the storage slot to load.\"},\"returns\":{\"_value\":\"32 byte value of the requested storage slot.\"}},\"ovmSSTORE(bytes32,bytes32)\":{\"params\":{\"_key\":\"32 byte key of the storage slot to set.\",\"_value\":\"32 byte value for the storage slot.\"}},\"ovmSTATICCALL(uint256,address,bytes)\":{\"params\":{\"_address\":\"Address of the contract to call.\",\"_calldata\":\"Data to send along with the call.\",\"_gasLimit\":\"Amount of gas to be passed into this call.\"},\"returns\":{\"_returndata\":\"Data returned by the call.\",\"_success\":\"Whether or not the call returned (rather than reverted).\"}},\"ovmTIMESTAMP()\":{\"returns\":{\"_TIMESTAMP\":\"Value of the TIMESTAMP within the transaction context.\"}},\"run((uint256,uint256,uint8,address,address,uint256,bytes),address)\":{\"params\":{\"_ovmStateManager\":\"iOVM_StateManager implementation providing account state.\",\"_transaction\":\"Transaction data to be executed.\"}},\"simulateMessage((uint256,uint256,uint8,address,address,uint256,bytes),address,address)\":{\"params\":{\"_from\":\"the OVM account the simulated call should be from.\",\"_transaction\":\"the message transaction to simulate.\"}}},\"title\":\"OVM_ExecutionManager\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"ovmADDRESS()\":{\"notice\":\"Overrides ADDRESS.\"},\"ovmCALL(uint256,address,bytes)\":{\"notice\":\"Overrides CALL.\"},\"ovmCALLER()\":{\"notice\":\"Overrides CALLER.\"},\"ovmCHAINID()\":{\"notice\":\"Overrides CHAINID.\"},\"ovmCREATE(bytes)\":{\"notice\":\"Overrides CREATE.\"},\"ovmCREATE2(bytes,bytes32)\":{\"notice\":\"Overrides CREATE2.\"},\"ovmCREATEEOA(bytes32,uint8,bytes32,bytes32)\":{\"notice\":\"Creates a new EOA contract account, for account abstraction.\"},\"ovmDELEGATECALL(uint256,address,bytes)\":{\"notice\":\"Overrides DELEGATECALL.\"},\"ovmEXTCODECOPY(address,uint256,uint256)\":{\"notice\":\"Overrides EXTCODECOPY.\"},\"ovmEXTCODEHASH(address)\":{\"notice\":\"Overrides EXTCODEHASH.\"},\"ovmEXTCODESIZE(address)\":{\"notice\":\"Overrides EXTCODESIZE.\"},\"ovmGASLIMIT()\":{\"notice\":\"Overrides GASLIMIT.\"},\"ovmGETNONCE()\":{\"notice\":\"Retrieves the nonce of the current ovmADDRESS.\"},\"ovmINCREMENTNONCE()\":{\"notice\":\"Bumps the nonce of the current ovmADDRESS by one.\"},\"ovmL1QUEUEORIGIN()\":{\"notice\":\"Specifies from which L1 rollup queue this transaction originated from.\"},\"ovmL1TXORIGIN()\":{\"notice\":\"Specifies which L1 account, if any, sent this transaction by calling enqueue().\"},\"ovmNUMBER()\":{\"notice\":\"Overrides NUMBER.\"},\"ovmREVERT(bytes)\":{\"notice\":\"Overrides REVERT.\"},\"ovmSLOAD(bytes32)\":{\"notice\":\"Overrides SLOAD.\"},\"ovmSSTORE(bytes32,bytes32)\":{\"notice\":\"Overrides SSTORE.\"},\"ovmSTATICCALL(uint256,address,bytes)\":{\"notice\":\"Overrides STATICCALL.\"},\"ovmTIMESTAMP()\":{\"notice\":\"Overrides TIMESTAMP.\"},\"run((uint256,uint256,uint8,address,address,uint256,bytes),address)\":{\"notice\":\"Starts the execution of a transaction via the OVM_ExecutionManager.\"},\"simulateMessage((uint256,uint256,uint8,address,address,uint256,bytes),address,address)\":{\"notice\":\"Unreachable helper function for simulating eth_calls with an OVM message context. This function will throw an exception in all cases other than when used as a custom entrypoint in L2 Geth to simulate eth_call.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol\":\"OVM_ExecutionManager\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/optimistic-ethereum/OVM/accounts/OVM_ECDSAContractAccount.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Interface Imports */\\nimport { iOVM_ECDSAContractAccount } from \\\"../../iOVM/accounts/iOVM_ECDSAContractAccount.sol\\\";\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { Lib_ECDSAUtils } from \\\"../../libraries/utils/Lib_ECDSAUtils.sol\\\";\\nimport { Lib_SafeExecutionManagerWrapper } from \\\"../../libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\\\";\\nimport { Lib_SafeMathWrapper } from \\\"../../libraries/wrappers/Lib_SafeMathWrapper.sol\\\";\\n\\n/**\\n * @title OVM_ECDSAContractAccount\\n * @dev The ECDSA Contract Account can be used as the implementation for a ProxyEOA deployed by the\\n * ovmCREATEEOA operation. It enables backwards compatibility with Ethereum's Layer 1, by \\n * providing eth_sign and EIP155 formatted transaction encodings.\\n *\\n * Compiler used: solc\\n * Runtime target: OVM\\n */\\ncontract OVM_ECDSAContractAccount is iOVM_ECDSAContractAccount {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n // TODO: should be the amount sufficient to cover the gas costs of all of the transactions up\\n // to and including the CALL/CREATE which forms the entrypoint of the transaction.\\n uint256 constant EXECUTION_VALIDATION_GAS_OVERHEAD = 25000;\\n address constant ETH_ERC20_ADDRESS = 0x4200000000000000000000000000000000000006;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Executes a signed transaction.\\n * @param _transaction Signed EOA transaction.\\n * @param _signatureType Hashing scheme used for the transaction (e.g., ETH signed message).\\n * @param _v Signature `v` parameter.\\n * @param _r Signature `r` parameter.\\n * @param _s Signature `s` parameter.\\n * @return Whether or not the call returned (rather than reverted).\\n * @return Data returned by the call.\\n */\\n function execute(\\n bytes memory _transaction,\\n Lib_OVMCodec.EOASignatureType _signatureType,\\n uint8 _v,\\n bytes32 _r,\\n bytes32 _s\\n )\\n override\\n public\\n returns (\\n bool,\\n bytes memory\\n )\\n {\\n bool isEthSign = _signatureType == Lib_OVMCodec.EOASignatureType.ETH_SIGNED_MESSAGE;\\n\\n // Address of this contract within the ovm (ovmADDRESS) should be the same as the\\n // recovered address of the user who signed this message. This is how we manage to shim\\n // account abstraction even though the user isn't a contract.\\n // Need to make sure that the transaction nonce is right and bump it if so.\\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(\\n Lib_ECDSAUtils.recover(\\n _transaction,\\n isEthSign,\\n _v,\\n _r,\\n _s\\n ) == Lib_SafeExecutionManagerWrapper.safeADDRESS(),\\n \\\"Signature provided for EOA transaction execution is invalid.\\\"\\n );\\n\\n Lib_OVMCodec.EIP155Transaction memory decodedTx = Lib_OVMCodec.decodeEIP155Transaction(_transaction, isEthSign);\\n\\n // Need to make sure that the transaction chainId is correct.\\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(\\n decodedTx.chainId == Lib_SafeExecutionManagerWrapper.safeCHAINID(),\\n \\\"Transaction chainId does not match expected OVM chainId.\\\"\\n );\\n\\n // Need to make sure that the transaction nonce is right.\\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(\\n decodedTx.nonce == Lib_SafeExecutionManagerWrapper.safeGETNONCE(),\\n \\\"Transaction nonce does not match the expected nonce.\\\"\\n );\\n\\n // TEMPORARY: Disable gas checks for mainnet.\\n // // Need to make sure that the gas is sufficient to execute the transaction.\\n // Lib_SafeExecutionManagerWrapper.safeREQUIRE(\\n // gasleft() >= Lib_SafeMathWrapper.add(decodedTx.gasLimit, EXECUTION_VALIDATION_GAS_OVERHEAD),\\n // \\\"Gas is not sufficient to execute the transaction.\\\"\\n // );\\n\\n // Transfer fee to relayer.\\n address relayer = Lib_SafeExecutionManagerWrapper.safeCALLER();\\n uint256 fee = Lib_SafeMathWrapper.mul(decodedTx.gasLimit, decodedTx.gasPrice);\\n (bool success, ) = Lib_SafeExecutionManagerWrapper.safeCALL(\\n gasleft(),\\n ETH_ERC20_ADDRESS,\\n abi.encodeWithSignature(\\\"transfer(address,uint256)\\\", relayer, fee)\\n );\\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(\\n success == true,\\n \\\"Fee was not transferred to relayer.\\\"\\n );\\n\\n // Contract creations are signalled by sending a transaction to the zero address.\\n if (decodedTx.to == address(0)) {\\n (address created, bytes memory revertData) = Lib_SafeExecutionManagerWrapper.safeCREATE(\\n gasleft(),\\n decodedTx.data\\n );\\n\\n // Return true if the contract creation succeeded, false w/ revertData otherwise.\\n if (created != address(0)) {\\n return (true, abi.encode(created));\\n } else {\\n return (false, revertData);\\n }\\n } else {\\n // We only want to bump the nonce for `ovmCALL` because `ovmCREATE` automatically bumps\\n // the nonce of the calling account. Normally an EOA would bump the nonce for both\\n // cases, but since this is a contract we'd end up bumping the nonce twice.\\n Lib_SafeExecutionManagerWrapper.safeINCREMENTNONCE();\\n\\n return Lib_SafeExecutionManagerWrapper.safeCALL(\\n gasleft(),\\n decodedTx.to,\\n decodedTx.data\\n );\\n }\\n }\\n}\\n\",\"keccak256\":\"0xcba0b593ad36291ec3d8c61ca254057c1bdcf1c9debf8ef920add32a51b14817\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/accounts/OVM_ProxyEOA.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_Bytes32Utils } from \\\"../../libraries/utils/Lib_Bytes32Utils.sol\\\";\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { Lib_ECDSAUtils } from \\\"../../libraries/utils/Lib_ECDSAUtils.sol\\\";\\nimport { Lib_SafeExecutionManagerWrapper } from \\\"../../libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\\\";\\n\\n/**\\n * @title OVM_ProxyEOA\\n * @dev The Proxy EOA contract uses a delegate call to execute the logic in an implementation contract.\\n * In combination with the logic implemented in the ECDSA Contract Account, this enables a form of upgradable \\n * 'account abstraction' on layer 2. \\n * \\n * Compiler used: solc\\n * Runtime target: OVM\\n */\\ncontract OVM_ProxyEOA {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n bytes32 constant IMPLEMENTATION_KEY = 0xdeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddead;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _implementation Address of the initial implementation contract.\\n */\\n constructor(\\n address _implementation\\n )\\n {\\n _setImplementation(_implementation);\\n }\\n\\n\\n /*********************\\n * Fallback Function *\\n *********************/\\n\\n fallback()\\n external\\n {\\n (bool success, bytes memory returndata) = Lib_SafeExecutionManagerWrapper.safeDELEGATECALL(\\n gasleft(),\\n getImplementation(),\\n msg.data\\n );\\n\\n if (success) {\\n assembly {\\n return(add(returndata, 0x20), mload(returndata))\\n }\\n } else {\\n Lib_SafeExecutionManagerWrapper.safeREVERT(\\n string(returndata)\\n );\\n }\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the implementation address.\\n * @param _implementation New implementation address.\\n */\\n function upgrade(\\n address _implementation\\n )\\n external\\n {\\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(\\n Lib_SafeExecutionManagerWrapper.safeADDRESS() == Lib_SafeExecutionManagerWrapper.safeCALLER(),\\n \\\"EOAs can only upgrade their own EOA implementation\\\"\\n );\\n\\n _setImplementation(_implementation);\\n }\\n\\n /**\\n * Gets the address of the current implementation.\\n * @return Current implementation address.\\n */\\n function getImplementation()\\n public\\n returns (\\n address\\n )\\n {\\n return Lib_Bytes32Utils.toAddress(\\n Lib_SafeExecutionManagerWrapper.safeSLOAD(\\n IMPLEMENTATION_KEY\\n )\\n );\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function _setImplementation(\\n address _implementation\\n )\\n internal\\n {\\n Lib_SafeExecutionManagerWrapper.safeSSTORE(\\n IMPLEMENTATION_KEY,\\n Lib_Bytes32Utils.fromAddress(_implementation)\\n );\\n }\\n}\\n\",\"keccak256\":\"0x220433074300f98c50f923df76050fbaa548e83926351b7a27f379aa851f70ec\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// @unsupported: ovm\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\nimport { Lib_EthUtils } from \\\"../../libraries/utils/Lib_EthUtils.sol\\\";\\nimport { Lib_ErrorUtils } from \\\"../../libraries/utils/Lib_ErrorUtils.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_ExecutionManager } from \\\"../../iOVM/execution/iOVM_ExecutionManager.sol\\\";\\nimport { iOVM_StateManager } from \\\"../../iOVM/execution/iOVM_StateManager.sol\\\";\\nimport { iOVM_SafetyChecker } from \\\"../../iOVM/execution/iOVM_SafetyChecker.sol\\\";\\n\\n/* Contract Imports */\\nimport { OVM_ECDSAContractAccount } from \\\"../accounts/OVM_ECDSAContractAccount.sol\\\";\\nimport { OVM_ProxyEOA } from \\\"../accounts/OVM_ProxyEOA.sol\\\";\\nimport { OVM_DeployerWhitelist } from \\\"../predeploys/OVM_DeployerWhitelist.sol\\\";\\n\\n/**\\n * @title OVM_ExecutionManager\\n * @dev The Execution Manager (EM) is the core of our OVM implementation, and provides a sandboxed\\n * environment allowing us to execute OVM transactions deterministically on either Layer 1 or\\n * Layer 2.\\n * The EM's run() function is the first function called during the execution of any\\n * transaction on L2.\\n * For each context-dependent EVM operation the EM has a function which implements a corresponding\\n * OVM operation, which will read state from the State Manager contract.\\n * The EM relies on the Safety Checker to verify that code deployed to Layer 2 does not contain any\\n * context-dependent operations.\\n *\\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract OVM_ExecutionManager is iOVM_ExecutionManager, Lib_AddressResolver {\\n\\n /********************************\\n * External Contract References *\\n ********************************/\\n\\n iOVM_SafetyChecker internal ovmSafetyChecker;\\n iOVM_StateManager internal ovmStateManager;\\n\\n\\n /*******************************\\n * Execution Context Variables *\\n *******************************/\\n\\n GasMeterConfig internal gasMeterConfig;\\n GlobalContext internal globalContext;\\n TransactionContext internal transactionContext;\\n MessageContext internal messageContext;\\n TransactionRecord internal transactionRecord;\\n MessageRecord internal messageRecord;\\n\\n\\n /**************************\\n * Gas Metering Constants *\\n **************************/\\n\\n address constant GAS_METADATA_ADDRESS = 0x06a506A506a506A506a506a506A506A506A506A5;\\n uint256 constant NUISANCE_GAS_SLOAD = 20000;\\n uint256 constant NUISANCE_GAS_SSTORE = 20000;\\n uint256 constant MIN_NUISANCE_GAS_PER_CONTRACT = 30000;\\n uint256 constant NUISANCE_GAS_PER_CONTRACT_BYTE = 100;\\n uint256 constant MIN_GAS_FOR_INVALID_STATE_ACCESS = 30000;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n */\\n constructor(\\n address _libAddressManager,\\n GasMeterConfig memory _gasMeterConfig,\\n GlobalContext memory _globalContext\\n )\\n Lib_AddressResolver(_libAddressManager)\\n {\\n ovmSafetyChecker = iOVM_SafetyChecker(resolve(\\\"OVM_SafetyChecker\\\"));\\n gasMeterConfig = _gasMeterConfig;\\n globalContext = _globalContext;\\n _resetContext();\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n /**\\n * Applies dynamically-sized refund to a transaction to account for the difference in execution\\n * between L1 and L2, so that the overall cost of the ovmOPCODE is fixed.\\n * @param _cost Desired gas cost for the function after the refund.\\n */\\n modifier netGasCost(\\n uint256 _cost\\n ) {\\n uint256 gasProvided = gasleft();\\n _;\\n uint256 gasUsed = gasProvided - gasleft();\\n\\n // We want to refund everything *except* the specified cost.\\n if (_cost < gasUsed) {\\n transactionRecord.ovmGasRefund += gasUsed - _cost;\\n }\\n }\\n\\n /**\\n * Applies a fixed-size gas refund to a transaction to account for the difference in execution\\n * between L1 and L2, so that the overall cost of an ovmOPCODE can be lowered.\\n * @param _discount Amount of gas cost to refund for the ovmOPCODE.\\n */\\n modifier fixedGasDiscount(\\n uint256 _discount\\n ) {\\n uint256 gasProvided = gasleft();\\n _;\\n uint256 gasUsed = gasProvided - gasleft();\\n\\n // We want to refund the specified _discount, unless this risks underflow.\\n if (_discount < gasUsed) {\\n transactionRecord.ovmGasRefund += _discount;\\n } else {\\n // refund all we can without risking underflow.\\n transactionRecord.ovmGasRefund += gasUsed;\\n }\\n }\\n\\n /**\\n * Makes sure we're not inside a static context.\\n */\\n modifier notStatic() {\\n if (messageContext.isStatic == true) {\\n _revertWithFlag(RevertFlag.STATIC_VIOLATION);\\n }\\n _;\\n }\\n\\n\\n /************************************\\n * Transaction Execution Entrypoint *\\n ************************************/\\n\\n /**\\n * Starts the execution of a transaction via the OVM_ExecutionManager.\\n * @param _transaction Transaction data to be executed.\\n * @param _ovmStateManager iOVM_StateManager implementation providing account state.\\n */\\n function run(\\n Lib_OVMCodec.Transaction memory _transaction,\\n address _ovmStateManager\\n )\\n override\\n public\\n {\\n require(transactionContext.ovmNUMBER == 0, \\\"Only callable at the start of a transaction\\\");\\n // Store our OVM_StateManager instance (significantly easier than attempting to pass the\\n // address around in calldata).\\n ovmStateManager = iOVM_StateManager(_ovmStateManager);\\n\\n // Make sure this function can't be called by anyone except the owner of the\\n // OVM_StateManager (expected to be an OVM_StateTransitioner). We can revert here because\\n // this would make the `run` itself invalid.\\n require(\\n // This method may return false during fraud proofs, but always returns true in L2 nodes' State Manager precompile.\\n ovmStateManager.isAuthenticated(msg.sender),\\n \\\"Only authenticated addresses in ovmStateManager can call this function\\\"\\n );\\n\\n // Initialize the execution context, must be initialized before we perform any gas metering\\n // or we'll throw a nuisance gas error.\\n _initContext(_transaction);\\n\\n // TEMPORARY: Gas metering is disabled for minnet.\\n // // Check whether we need to start a new epoch, do so if necessary.\\n // _checkNeedsNewEpoch(_transaction.timestamp);\\n\\n // Make sure the transaction's gas limit is valid. We don't revert here because we reserve\\n // reverts for INVALID_STATE_ACCESS.\\n if (_isValidGasLimit(_transaction.gasLimit, _transaction.l1QueueOrigin) == false) {\\n _resetContext();\\n return;\\n }\\n\\n // TEMPORARY: Gas metering is disabled for minnet.\\n // // Check gas right before the call to get total gas consumed by OVM transaction.\\n // uint256 gasProvided = gasleft();\\n\\n // Run the transaction, make sure to meter the gas usage.\\n ovmCALL(\\n _transaction.gasLimit - gasMeterConfig.minTransactionGasLimit,\\n _transaction.entrypoint,\\n _transaction.data\\n );\\n\\n // TEMPORARY: Gas metering is disabled for minnet.\\n // // Update the cumulative gas based on the amount of gas used.\\n // uint256 gasUsed = gasProvided - gasleft();\\n // _updateCumulativeGas(gasUsed, _transaction.l1QueueOrigin);\\n\\n // Wipe the execution context.\\n _resetContext();\\n }\\n\\n\\n /******************************\\n * Opcodes: Execution Context *\\n ******************************/\\n\\n /**\\n * @notice Overrides CALLER.\\n * @return _CALLER Address of the CALLER within the current message context.\\n */\\n function ovmCALLER()\\n override\\n public\\n view\\n returns (\\n address _CALLER\\n )\\n {\\n return messageContext.ovmCALLER;\\n }\\n\\n /**\\n * @notice Overrides ADDRESS.\\n * @return _ADDRESS Active ADDRESS within the current message context.\\n */\\n function ovmADDRESS()\\n override\\n public\\n view\\n returns (\\n address _ADDRESS\\n )\\n {\\n return messageContext.ovmADDRESS;\\n }\\n\\n /**\\n * @notice Overrides TIMESTAMP.\\n * @return _TIMESTAMP Value of the TIMESTAMP within the transaction context.\\n */\\n function ovmTIMESTAMP()\\n override\\n public\\n view\\n returns (\\n uint256 _TIMESTAMP\\n )\\n {\\n return transactionContext.ovmTIMESTAMP;\\n }\\n\\n /**\\n * @notice Overrides NUMBER.\\n * @return _NUMBER Value of the NUMBER within the transaction context.\\n */\\n function ovmNUMBER()\\n override\\n public\\n view\\n returns (\\n uint256 _NUMBER\\n )\\n {\\n return transactionContext.ovmNUMBER;\\n }\\n\\n /**\\n * @notice Overrides GASLIMIT.\\n * @return _GASLIMIT Value of the block's GASLIMIT within the transaction context.\\n */\\n function ovmGASLIMIT()\\n override\\n public\\n view\\n returns (\\n uint256 _GASLIMIT\\n )\\n {\\n return transactionContext.ovmGASLIMIT;\\n }\\n\\n /**\\n * @notice Overrides CHAINID.\\n * @return _CHAINID Value of the chain's CHAINID within the global context.\\n */\\n function ovmCHAINID()\\n override\\n public\\n view\\n returns (\\n uint256 _CHAINID\\n )\\n {\\n return globalContext.ovmCHAINID;\\n }\\n\\n /*********************************\\n * Opcodes: L2 Execution Context *\\n *********************************/\\n\\n /**\\n * @notice Specifies from which L1 rollup queue this transaction originated from.\\n * @return _queueOrigin Address of the ovmL1QUEUEORIGIN within the current message context.\\n */\\n function ovmL1QUEUEORIGIN()\\n override\\n public\\n view\\n returns (\\n Lib_OVMCodec.QueueOrigin _queueOrigin\\n )\\n {\\n return transactionContext.ovmL1QUEUEORIGIN;\\n }\\n\\n /**\\n * @notice Specifies which L1 account, if any, sent this transaction by calling enqueue().\\n * @return _l1TxOrigin Address of the account which sent the tx into L2 from L1.\\n */\\n function ovmL1TXORIGIN()\\n override\\n public\\n view\\n returns (\\n address _l1TxOrigin\\n )\\n {\\n return transactionContext.ovmL1TXORIGIN;\\n }\\n\\n /********************\\n * Opcodes: Halting *\\n ********************/\\n\\n /**\\n * @notice Overrides REVERT.\\n * @param _data Bytes data to pass along with the REVERT.\\n */\\n function ovmREVERT(\\n bytes memory _data\\n )\\n override\\n public\\n {\\n _revertWithFlag(RevertFlag.INTENTIONAL_REVERT, _data);\\n }\\n\\n\\n /******************************\\n * Opcodes: Contract Creation *\\n ******************************/\\n\\n /**\\n * @notice Overrides CREATE.\\n * @param _bytecode Code to be used to CREATE a new contract.\\n * @return Address of the created contract.\\n * @return Revert data, if and only if the creation threw an exception.\\n */\\n function ovmCREATE(\\n bytes memory _bytecode\\n )\\n override\\n public\\n notStatic\\n fixedGasDiscount(40000)\\n returns (\\n address,\\n bytes memory\\n )\\n {\\n // Creator is always the current ADDRESS.\\n address creator = ovmADDRESS();\\n\\n // Check that the deployer is whitelisted, or\\n // that arbitrary contract deployment has been enabled.\\n _checkDeployerAllowed(creator);\\n\\n // Generate the correct CREATE address.\\n address contractAddress = Lib_EthUtils.getAddressForCREATE(\\n creator,\\n _getAccountNonce(creator)\\n );\\n\\n return _createContract(\\n contractAddress,\\n _bytecode\\n );\\n }\\n\\n /**\\n * @notice Overrides CREATE2.\\n * @param _bytecode Code to be used to CREATE2 a new contract.\\n * @param _salt Value used to determine the contract's address.\\n * @return Address of the created contract.\\n * @return Revert data, if and only if the creation threw an exception.\\n */\\n function ovmCREATE2(\\n bytes memory _bytecode,\\n bytes32 _salt\\n )\\n override\\n public\\n notStatic\\n fixedGasDiscount(40000)\\n returns (\\n address,\\n bytes memory\\n )\\n {\\n // Creator is always the current ADDRESS.\\n address creator = ovmADDRESS();\\n\\n // Check that the deployer is whitelisted, or\\n // that arbitrary contract deployment has been enabled.\\n _checkDeployerAllowed(creator);\\n\\n // Generate the correct CREATE2 address.\\n address contractAddress = Lib_EthUtils.getAddressForCREATE2(\\n creator,\\n _bytecode,\\n _salt\\n );\\n\\n return _createContract(\\n contractAddress,\\n _bytecode\\n );\\n }\\n\\n\\n /*******************************\\n * Account Abstraction Opcodes *\\n ******************************/\\n\\n /**\\n * Retrieves the nonce of the current ovmADDRESS.\\n * @return _nonce Nonce of the current contract.\\n */\\n function ovmGETNONCE()\\n override\\n public\\n returns (\\n uint256 _nonce\\n )\\n {\\n return _getAccountNonce(ovmADDRESS());\\n }\\n\\n /**\\n * Bumps the nonce of the current ovmADDRESS by one.\\n */\\n function ovmINCREMENTNONCE()\\n override\\n public\\n notStatic\\n {\\n address account = ovmADDRESS();\\n uint256 nonce = _getAccountNonce(account);\\n\\n // Prevent overflow.\\n if (nonce + 1 > nonce) {\\n _setAccountNonce(account, nonce + 1);\\n }\\n }\\n\\n /**\\n * Creates a new EOA contract account, for account abstraction.\\n * @dev Essentially functions like ovmCREATE or ovmCREATE2, but we can bypass a lot of checks\\n * because the contract we're creating is trusted (no need to do safety checking or to\\n * handle unexpected reverts). Doesn't need to return an address because the address is\\n * assumed to be the user's actual address.\\n * @param _messageHash Hash of a message signed by some user, for verification.\\n * @param _v Signature `v` parameter.\\n * @param _r Signature `r` parameter.\\n * @param _s Signature `s` parameter.\\n */\\n function ovmCREATEEOA(\\n bytes32 _messageHash,\\n uint8 _v,\\n bytes32 _r,\\n bytes32 _s\\n )\\n override\\n public\\n notStatic\\n {\\n // Recover the EOA address from the message hash and signature parameters. Since we do the\\n // hashing in advance, we don't have handle different message hashing schemes. Even if this\\n // function were to return the wrong address (rather than explicitly returning the zero\\n // address), the rest of the transaction would simply fail (since there's no EOA account to\\n // actually execute the transaction).\\n address eoa = ecrecover(\\n _messageHash,\\n _v + 27,\\n _r,\\n _s\\n );\\n\\n // Invalid signature is a case we proactively handle with a revert. We could alternatively\\n // have this function return a `success` boolean, but this is just easier.\\n if (eoa == address(0)) {\\n ovmREVERT(bytes(\\\"Signature provided for EOA contract creation is invalid.\\\"));\\n }\\n\\n // If the user already has an EOA account, then there's no need to perform this operation.\\n if (_hasEmptyAccount(eoa) == false) {\\n return;\\n }\\n\\n // We always need to initialize the contract with the default account values.\\n _initPendingAccount(eoa);\\n\\n // Temporarily set the current address so it's easier to access on L2.\\n address prevADDRESS = messageContext.ovmADDRESS;\\n messageContext.ovmADDRESS = eoa;\\n\\n // Now actually create the account and get its bytecode. We're not worried about reverts\\n // (other than out of gas, which we can't capture anyway) because this contract is trusted.\\n OVM_ProxyEOA proxyEOA = new OVM_ProxyEOA(0x4200000000000000000000000000000000000003);\\n\\n // Reset the address now that we're done deploying.\\n messageContext.ovmADDRESS = prevADDRESS;\\n\\n // Commit the account with its final values.\\n _commitPendingAccount(\\n eoa,\\n address(proxyEOA),\\n keccak256(Lib_EthUtils.getCode(address(proxyEOA)))\\n );\\n\\n _setAccountNonce(eoa, 0);\\n }\\n\\n\\n /*********************************\\n * Opcodes: Contract Interaction *\\n *********************************/\\n\\n /**\\n * @notice Overrides CALL.\\n * @param _gasLimit Amount of gas to be passed into this call.\\n * @param _address Address of the contract to call.\\n * @param _calldata Data to send along with the call.\\n * @return _success Whether or not the call returned (rather than reverted).\\n * @return _returndata Data returned by the call.\\n */\\n function ovmCALL(\\n uint256 _gasLimit,\\n address _address,\\n bytes memory _calldata\\n )\\n override\\n public\\n fixedGasDiscount(100000)\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n // CALL updates the CALLER and ADDRESS.\\n MessageContext memory nextMessageContext = messageContext;\\n nextMessageContext.ovmCALLER = nextMessageContext.ovmADDRESS;\\n nextMessageContext.ovmADDRESS = _address;\\n\\n return _callContract(\\n nextMessageContext,\\n _gasLimit,\\n _address,\\n _calldata\\n );\\n }\\n\\n /**\\n * @notice Overrides STATICCALL.\\n * @param _gasLimit Amount of gas to be passed into this call.\\n * @param _address Address of the contract to call.\\n * @param _calldata Data to send along with the call.\\n * @return _success Whether or not the call returned (rather than reverted).\\n * @return _returndata Data returned by the call.\\n */\\n function ovmSTATICCALL(\\n uint256 _gasLimit,\\n address _address,\\n bytes memory _calldata\\n )\\n override\\n public\\n fixedGasDiscount(80000)\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n // STATICCALL updates the CALLER, updates the ADDRESS, and runs in a static context.\\n MessageContext memory nextMessageContext = messageContext;\\n nextMessageContext.ovmCALLER = nextMessageContext.ovmADDRESS;\\n nextMessageContext.ovmADDRESS = _address;\\n nextMessageContext.isStatic = true;\\n\\n return _callContract(\\n nextMessageContext,\\n _gasLimit,\\n _address,\\n _calldata\\n );\\n }\\n\\n /**\\n * @notice Overrides DELEGATECALL.\\n * @param _gasLimit Amount of gas to be passed into this call.\\n * @param _address Address of the contract to call.\\n * @param _calldata Data to send along with the call.\\n * @return _success Whether or not the call returned (rather than reverted).\\n * @return _returndata Data returned by the call.\\n */\\n function ovmDELEGATECALL(\\n uint256 _gasLimit,\\n address _address,\\n bytes memory _calldata\\n )\\n override\\n public\\n fixedGasDiscount(40000)\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n // DELEGATECALL does not change anything about the message context.\\n MessageContext memory nextMessageContext = messageContext;\\n\\n return _callContract(\\n nextMessageContext,\\n _gasLimit,\\n _address,\\n _calldata\\n );\\n }\\n\\n\\n /************************************\\n * Opcodes: Contract Storage Access *\\n ************************************/\\n\\n /**\\n * @notice Overrides SLOAD.\\n * @param _key 32 byte key of the storage slot to load.\\n * @return _value 32 byte value of the requested storage slot.\\n */\\n function ovmSLOAD(\\n bytes32 _key\\n )\\n override\\n public\\n netGasCost(40000)\\n returns (\\n bytes32 _value\\n )\\n {\\n // We always SLOAD from the storage of ADDRESS.\\n address contractAddress = ovmADDRESS();\\n\\n return _getContractStorage(\\n contractAddress,\\n _key\\n );\\n }\\n\\n /**\\n * @notice Overrides SSTORE.\\n * @param _key 32 byte key of the storage slot to set.\\n * @param _value 32 byte value for the storage slot.\\n */\\n function ovmSSTORE(\\n bytes32 _key,\\n bytes32 _value\\n )\\n override\\n public\\n notStatic\\n netGasCost(60000)\\n {\\n // We always SSTORE to the storage of ADDRESS.\\n address contractAddress = ovmADDRESS();\\n\\n _putContractStorage(\\n contractAddress,\\n _key,\\n _value\\n );\\n }\\n\\n\\n /*********************************\\n * Opcodes: Contract Code Access *\\n *********************************/\\n\\n /**\\n * @notice Overrides EXTCODECOPY.\\n * @param _contract Address of the contract to copy code from.\\n * @param _offset Offset in bytes from the start of contract code to copy beyond.\\n * @param _length Total number of bytes to copy from the contract's code.\\n * @return _code Bytes of code copied from the requested contract.\\n */\\n function ovmEXTCODECOPY(\\n address _contract,\\n uint256 _offset,\\n uint256 _length\\n )\\n override\\n public\\n returns (\\n bytes memory _code\\n )\\n {\\n // `ovmEXTCODECOPY` is the only overridden opcode capable of producing exactly one byte of\\n // return data. By blocking reads of one byte, we're able to use the condition that an\\n // OVM_ExecutionManager function return value having a length of exactly one byte indicates\\n // an error without an explicit revert. If users were able to read a single byte, they\\n // could forcibly trigger behavior that should only be available to this contract.\\n uint256 length = _length == 1 ? 2 : _length;\\n\\n return Lib_EthUtils.getCode(\\n _getAccountEthAddress(_contract),\\n _offset,\\n length\\n );\\n }\\n\\n /**\\n * @notice Overrides EXTCODESIZE.\\n * @param _contract Address of the contract to query the size of.\\n * @return _EXTCODESIZE Size of the requested contract in bytes.\\n */\\n function ovmEXTCODESIZE(\\n address _contract\\n )\\n override\\n public\\n returns (\\n uint256 _EXTCODESIZE\\n )\\n {\\n return Lib_EthUtils.getCodeSize(\\n _getAccountEthAddress(_contract)\\n );\\n }\\n\\n /**\\n * @notice Overrides EXTCODEHASH.\\n * @param _contract Address of the contract to query the hash of.\\n * @return _EXTCODEHASH Hash of the requested contract.\\n */\\n function ovmEXTCODEHASH(\\n address _contract\\n )\\n override\\n public\\n returns (\\n bytes32 _EXTCODEHASH\\n )\\n {\\n return Lib_EthUtils.getCodeHash(\\n _getAccountEthAddress(_contract)\\n );\\n }\\n\\n /***************************************\\n * Public Functions: Execution Context *\\n ***************************************/\\n\\n function getMaxTransactionGasLimit()\\n external\\n view\\n override\\n returns (\\n uint256 _maxTransactionGasLimit\\n )\\n {\\n return gasMeterConfig.maxTransactionGasLimit;\\n }\\n\\n /********************************************\\n * Public Functions: Deployment Whitelisting *\\n ********************************************/\\n\\n /**\\n * Checks whether the given address is on the whitelist to ovmCREATE/ovmCREATE2, and reverts if not.\\n * @param _deployerAddress Address attempting to deploy a contract.\\n */\\n function _checkDeployerAllowed(\\n address _deployerAddress\\n )\\n internal\\n {\\n // From an OVM semantics perspective, this will appear identical to\\n // the deployer ovmCALLing the whitelist. This is fine--in a sense, we are forcing them to.\\n (bool success, bytes memory data) = ovmCALL(\\n gasleft(),\\n 0x4200000000000000000000000000000000000002,\\n abi.encodeWithSignature(\\\"isDeployerAllowed(address)\\\", _deployerAddress)\\n );\\n bool isAllowed = abi.decode(data, (bool));\\n\\n if (!isAllowed || !success) {\\n _revertWithFlag(RevertFlag.CREATOR_NOT_ALLOWED);\\n }\\n }\\n\\n /********************************************\\n * Internal Functions: Contract Interaction *\\n ********************************************/\\n\\n /**\\n * Creates a new contract and associates it with some contract address.\\n * @param _contractAddress Address to associate the created contract with.\\n * @param _bytecode Bytecode to be used to create the contract.\\n * @return Final OVM contract address.\\n * @return Revertdata, if and only if the creation threw an exception.\\n */\\n function _createContract(\\n address _contractAddress,\\n bytes memory _bytecode\\n )\\n internal\\n returns (\\n address,\\n bytes memory\\n )\\n {\\n // We always update the nonce of the creating account, even if the creation fails.\\n _setAccountNonce(ovmADDRESS(), _getAccountNonce(ovmADDRESS()) + 1);\\n\\n // We're stepping into a CREATE or CREATE2, so we need to update ADDRESS to point\\n // to the contract's associated address and CALLER to point to the previous ADDRESS.\\n MessageContext memory nextMessageContext = messageContext;\\n nextMessageContext.ovmCALLER = messageContext.ovmADDRESS;\\n nextMessageContext.ovmADDRESS = _contractAddress;\\n\\n // Run the common logic which occurs between call-type and create-type messages,\\n // passing in the creation bytecode and `true` to trigger create-specific logic.\\n (bool success, bytes memory data) = _handleExternalMessage(\\n nextMessageContext,\\n gasleft(),\\n _contractAddress,\\n _bytecode,\\n true\\n );\\n\\n // Yellow paper requires that address returned is zero if the contract deployment fails.\\n return (\\n success ? _contractAddress : address(0),\\n data\\n );\\n }\\n\\n /**\\n * Calls the deployed contract associated with a given address.\\n * @param _nextMessageContext Message context to be used for the call.\\n * @param _gasLimit Amount of gas to be passed into this call.\\n * @param _contract OVM address to be called.\\n * @param _calldata Data to send along with the call.\\n * @return _success Whether or not the call returned (rather than reverted).\\n * @return _returndata Data returned by the call.\\n */\\n function _callContract(\\n MessageContext memory _nextMessageContext,\\n uint256 _gasLimit,\\n address _contract,\\n bytes memory _calldata\\n )\\n internal\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n // We reserve addresses of the form 0xdeaddeaddead...NNNN for the container contracts in L2 geth.\\n // So, we block calls to these addresses since they are not safe to run as an OVM contract itself.\\n if (\\n (uint256(_contract) & uint256(0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000))\\n == uint256(0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000)\\n ) {\\n // EVM does not return data in the success case, see: https://github.com/ethereum/go-ethereum/blob/aae7660410f0ef90279e14afaaf2f429fdc2a186/core/vm/instructions.go#L600-L604\\n return (true, hex'');\\n }\\n\\n // Both 0x0000... and the EVM precompiles have the same address on L1 and L2 --> no trie lookup needed.\\n address codeContractAddress =\\n uint(_contract) < 100\\n ? _contract\\n : _getAccountEthAddress(_contract);\\n\\n return _handleExternalMessage(\\n _nextMessageContext,\\n _gasLimit,\\n codeContractAddress,\\n _calldata,\\n false\\n );\\n }\\n\\n /**\\n * Handles all interactions which involve the execution manager calling out to untrusted code (both calls and creates).\\n * Ensures that OVM-related measures are enforced, including L2 gas refunds, nuisance gas, and flagged reversions.\\n *\\n * @param _nextMessageContext Message context to be used for the external message.\\n * @param _gasLimit Amount of gas to be passed into this message.\\n * @param _contract OVM address being called or deployed to\\n * @param _data Data for the message (either calldata or creation code)\\n * @param _isCreate Whether this is a create-type message.\\n * @return Whether or not the message (either a call or deployment) succeeded.\\n * @return Data returned by the message.\\n */\\n function _handleExternalMessage(\\n MessageContext memory _nextMessageContext,\\n uint256 _gasLimit,\\n address _contract,\\n bytes memory _data,\\n bool _isCreate\\n )\\n internal\\n returns (\\n bool,\\n bytes memory\\n )\\n {\\n // We need to switch over to our next message context for the duration of this call.\\n MessageContext memory prevMessageContext = messageContext;\\n _switchMessageContext(prevMessageContext, _nextMessageContext);\\n\\n // Nuisance gas is a system used to bound the ability for an attacker to make fraud proofs\\n // expensive by touching a lot of different accounts or storage slots. Since most contracts\\n // only use a few storage slots during any given transaction, this shouldn't be a limiting\\n // factor.\\n uint256 prevNuisanceGasLeft = messageRecord.nuisanceGasLeft;\\n uint256 nuisanceGasLimit = _getNuisanceGasLimit(_gasLimit);\\n messageRecord.nuisanceGasLeft = nuisanceGasLimit;\\n\\n // Make the call and make sure to pass in the gas limit. Another instance of hidden\\n // complexity. `_contract` is guaranteed to be a safe contract, meaning its return/revert\\n // behavior can be controlled. In particular, we enforce that flags are passed through\\n // revert data as to retrieve execution metadata that would normally be reverted out of\\n // existence.\\n\\n (bool success, bytes memory returndata) =\\n _isCreate\\n ? _handleContractCreation(_gasLimit, _data, _contract)\\n : _contract.call{gas: _gasLimit}(_data);\\n\\n // Switch back to the original message context now that we're out of the call.\\n _switchMessageContext(_nextMessageContext, prevMessageContext);\\n\\n // Assuming there were no reverts, the message record should be accurate here. We'll update\\n // this value in the case of a revert.\\n uint256 nuisanceGasLeft = messageRecord.nuisanceGasLeft;\\n\\n // Reverts at this point are completely OK, but we need to make a few updates based on the\\n // information passed through the revert.\\n if (success == false) {\\n (\\n RevertFlag flag,\\n uint256 nuisanceGasLeftPostRevert,\\n uint256 ovmGasRefund,\\n bytes memory returndataFromFlag\\n ) = _decodeRevertData(returndata);\\n\\n // INVALID_STATE_ACCESS is the only flag that triggers an immediate abort of the\\n // parent EVM message. This behavior is necessary because INVALID_STATE_ACCESS must\\n // halt any further transaction execution that could impact the execution result.\\n if (flag == RevertFlag.INVALID_STATE_ACCESS) {\\n _revertWithFlag(flag);\\n }\\n\\n // INTENTIONAL_REVERT, UNSAFE_BYTECODE, STATIC_VIOLATION, and CREATOR_NOT_ALLOWED aren't\\n // dependent on the input state, so we can just handle them like standard reverts. Our only change here\\n // is to record the gas refund reported by the call (enforced by safety checking).\\n if (\\n flag == RevertFlag.INTENTIONAL_REVERT\\n || flag == RevertFlag.UNSAFE_BYTECODE\\n || flag == RevertFlag.STATIC_VIOLATION\\n || flag == RevertFlag.CREATOR_NOT_ALLOWED\\n ) {\\n transactionRecord.ovmGasRefund = ovmGasRefund;\\n }\\n\\n // INTENTIONAL_REVERT needs to pass up the user-provided return data encoded into the\\n // flag, *not* the full encoded flag. All other revert types return no data.\\n if (\\n flag == RevertFlag.INTENTIONAL_REVERT\\n || _isCreate\\n ) {\\n returndata = returndataFromFlag;\\n } else {\\n returndata = hex'';\\n }\\n\\n // Reverts mean we need to use up whatever \\\"nuisance gas\\\" was used by the call.\\n // EXCEEDS_NUISANCE_GAS explicitly reduces the remaining nuisance gas for this message\\n // to zero. OUT_OF_GAS is a \\\"pseudo\\\" flag given that messages return no data when they\\n // run out of gas, so we have to treat this like EXCEEDS_NUISANCE_GAS. All other flags\\n // will simply pass up the remaining nuisance gas.\\n nuisanceGasLeft = nuisanceGasLeftPostRevert;\\n }\\n\\n // We need to reset the nuisance gas back to its original value minus the amount used here.\\n messageRecord.nuisanceGasLeft = prevNuisanceGasLeft - (nuisanceGasLimit - nuisanceGasLeft);\\n\\n return (\\n success,\\n returndata\\n );\\n }\\n\\n /**\\n * Handles the creation-specific safety measures required for OVM contract deployment.\\n * This function sanitizes the return types for creation messages to match calls (bool, bytes).\\n * This allows for consistent handling of both types of messages in _handleExternalMessage().\\n *\\n * @param _gasLimit Amount of gas to be passed into this creation.\\n * @param _creationCode Code to pass into CREATE for deployment.\\n * @param _address OVM address being deployed to.\\n * @return Whether or not the call succeeded.\\n * @return If creation fails: revert data. Otherwise: empty.\\n */\\n function _handleContractCreation(\\n uint _gasLimit,\\n bytes memory _creationCode,\\n address _address\\n )\\n internal\\n returns(\\n bool,\\n bytes memory\\n )\\n {\\n // Check that there is not already code at this address.\\n if (_hasEmptyAccount(_address) == false) {\\n // Note: in the EVM, this case burns all allotted gas. For improved\\n // developer experience, we do return the remaining ones.\\n return (\\n false,\\n _encodeRevertData(\\n RevertFlag.CREATE_COLLISION,\\n Lib_ErrorUtils.encodeRevertString(\\\"A contract has already been deployed to this address\\\")\\n )\\n );\\n }\\n\\n // Check the creation bytecode against the OVM_SafetyChecker.\\n if (ovmSafetyChecker.isBytecodeSafe(_creationCode) == false) {\\n return (\\n false,\\n _encodeRevertData(\\n RevertFlag.UNSAFE_BYTECODE,\\n Lib_ErrorUtils.encodeRevertString(\\\"Contract creation code contains unsafe opcodes. Did you use the right compiler or pass an unsafe constructor argument?\\\")\\n )\\n );\\n }\\n\\n // We always need to initialize the contract with the default account values.\\n _initPendingAccount(_address);\\n\\n // Actually execute the EVM create message,\\n address ethAddress = Lib_EthUtils.createContract(_creationCode);\\n\\n if (ethAddress == address(0)) {\\n // If the creation fails, the EVM lets us grab its revert data. This may contain a revert flag\\n // to be used above in _handleExternalMessage.\\n uint256 revertDataSize;\\n assembly { revertDataSize := returndatasize() }\\n bytes memory revertdata = new bytes(revertDataSize);\\n assembly {\\n returndatacopy(\\n add(revertdata, 0x20),\\n 0,\\n revertDataSize\\n )\\n }\\n // Return that the creation failed, and the data it reverted with.\\n return (false, revertdata);\\n }\\n\\n // Again simply checking that the deployed code is safe too. Contracts can generate\\n // arbitrary deployment code, so there's no easy way to analyze this beforehand.\\n bytes memory deployedCode = Lib_EthUtils.getCode(ethAddress);\\n if (ovmSafetyChecker.isBytecodeSafe(deployedCode) == false) {\\n return (\\n false,\\n _encodeRevertData(\\n RevertFlag.UNSAFE_BYTECODE,\\n Lib_ErrorUtils.encodeRevertString(\\\"Constructor attempted to deploy unsafe bytecode.\\\")\\n )\\n );\\n }\\n\\n // Contract creation didn't need to be reverted and the bytecode is safe. We finish up by\\n // associating the desired address with the newly created contract's code hash and address.\\n _commitPendingAccount(\\n _address,\\n ethAddress,\\n Lib_EthUtils.getCodeHash(ethAddress)\\n );\\n\\n // Successful deployments will not give access to returndata, in both the EVM and the OVM.\\n return (true, hex'');\\n }\\n\\n /******************************************\\n * Internal Functions: State Manipulation *\\n ******************************************/\\n\\n /**\\n * Checks whether an account exists within the OVM_StateManager.\\n * @param _address Address of the account to check.\\n * @return _exists Whether or not the account exists.\\n */\\n function _hasAccount(\\n address _address\\n )\\n internal\\n returns (\\n bool _exists\\n )\\n {\\n _checkAccountLoad(_address);\\n return ovmStateManager.hasAccount(_address);\\n }\\n\\n /**\\n * Checks whether a known empty account exists within the OVM_StateManager.\\n * @param _address Address of the account to check.\\n * @return _exists Whether or not the account empty exists.\\n */\\n function _hasEmptyAccount(\\n address _address\\n )\\n internal\\n returns (\\n bool _exists\\n )\\n {\\n _checkAccountLoad(_address);\\n return ovmStateManager.hasEmptyAccount(_address);\\n }\\n\\n /**\\n * Sets the nonce of an account.\\n * @param _address Address of the account to modify.\\n * @param _nonce New account nonce.\\n */\\n function _setAccountNonce(\\n address _address,\\n uint256 _nonce\\n )\\n internal\\n {\\n _checkAccountChange(_address);\\n ovmStateManager.setAccountNonce(_address, _nonce);\\n }\\n\\n /**\\n * Gets the nonce of an account.\\n * @param _address Address of the account to access.\\n * @return _nonce Nonce of the account.\\n */\\n function _getAccountNonce(\\n address _address\\n )\\n internal\\n returns (\\n uint256 _nonce\\n )\\n {\\n _checkAccountLoad(_address);\\n return ovmStateManager.getAccountNonce(_address);\\n }\\n\\n /**\\n * Retrieves the Ethereum address of an account.\\n * @param _address Address of the account to access.\\n * @return _ethAddress Corresponding Ethereum address.\\n */\\n function _getAccountEthAddress(\\n address _address\\n )\\n internal\\n returns (\\n address _ethAddress\\n )\\n {\\n _checkAccountLoad(_address);\\n return ovmStateManager.getAccountEthAddress(_address);\\n }\\n\\n /**\\n * Creates the default account object for the given address.\\n * @param _address Address of the account create.\\n */\\n function _initPendingAccount(\\n address _address\\n )\\n internal\\n {\\n // Although it seems like `_checkAccountChange` would be more appropriate here, we don't\\n // actually consider an account \\\"changed\\\" until it's inserted into the state (in this case\\n // by `_commitPendingAccount`).\\n _checkAccountLoad(_address);\\n ovmStateManager.initPendingAccount(_address);\\n }\\n\\n /**\\n * Stores additional relevant data for a new account, thereby \\\"committing\\\" it to the state.\\n * This function is only called during `ovmCREATE` and `ovmCREATE2` after a successful contract\\n * creation.\\n * @param _address Address of the account to commit.\\n * @param _ethAddress Address of the associated deployed contract.\\n * @param _codeHash Hash of the code stored at the address.\\n */\\n function _commitPendingAccount(\\n address _address,\\n address _ethAddress,\\n bytes32 _codeHash\\n )\\n internal\\n {\\n _checkAccountChange(_address);\\n ovmStateManager.commitPendingAccount(\\n _address,\\n _ethAddress,\\n _codeHash\\n );\\n }\\n\\n /**\\n * Retrieves the value of a storage slot.\\n * @param _contract Address of the contract to query.\\n * @param _key 32 byte key of the storage slot.\\n * @return _value 32 byte storage slot value.\\n */\\n function _getContractStorage(\\n address _contract,\\n bytes32 _key\\n )\\n internal\\n returns (\\n bytes32 _value\\n )\\n {\\n _checkContractStorageLoad(_contract, _key);\\n return ovmStateManager.getContractStorage(_contract, _key);\\n }\\n\\n /**\\n * Sets the value of a storage slot.\\n * @param _contract Address of the contract to modify.\\n * @param _key 32 byte key of the storage slot.\\n * @param _value 32 byte storage slot value.\\n */\\n function _putContractStorage(\\n address _contract,\\n bytes32 _key,\\n bytes32 _value\\n )\\n internal\\n {\\n // We don't set storage if the value didn't change. Although this acts as a convenient\\n // optimization, it's also necessary to avoid the case in which a contract with no storage\\n // attempts to store the value \\\"0\\\" at any key. Putting this value (and therefore requiring\\n // that the value be committed into the storage trie after execution) would incorrectly\\n // modify the storage root.\\n if (_getContractStorage(_contract, _key) == _value) {\\n return;\\n }\\n\\n _checkContractStorageChange(_contract, _key);\\n ovmStateManager.putContractStorage(_contract, _key, _value);\\n }\\n\\n /**\\n * Validation whenever a contract needs to be loaded. Checks that the account exists, charges\\n * nuisance gas if the account hasn't been loaded before.\\n * @param _address Address of the account to load.\\n */\\n function _checkAccountLoad(\\n address _address\\n )\\n internal\\n {\\n // See `_checkContractStorageLoad` for more information.\\n if (gasleft() < MIN_GAS_FOR_INVALID_STATE_ACCESS) {\\n _revertWithFlag(RevertFlag.OUT_OF_GAS);\\n }\\n\\n // See `_checkContractStorageLoad` for more information.\\n if (ovmStateManager.hasAccount(_address) == false) {\\n _revertWithFlag(RevertFlag.INVALID_STATE_ACCESS);\\n }\\n\\n // Check whether the account has been loaded before and mark it as loaded if not. We need\\n // this because \\\"nuisance gas\\\" only applies to the first time that an account is loaded.\\n (\\n bool _wasAccountAlreadyLoaded\\n ) = ovmStateManager.testAndSetAccountLoaded(_address);\\n\\n // If we hadn't already loaded the account, then we'll need to charge \\\"nuisance gas\\\" based\\n // on the size of the contract code.\\n if (_wasAccountAlreadyLoaded == false) {\\n _useNuisanceGas(\\n (Lib_EthUtils.getCodeSize(_getAccountEthAddress(_address)) * NUISANCE_GAS_PER_CONTRACT_BYTE) + MIN_NUISANCE_GAS_PER_CONTRACT\\n );\\n }\\n }\\n\\n /**\\n * Validation whenever a contract needs to be changed. Checks that the account exists, charges\\n * nuisance gas if the account hasn't been changed before.\\n * @param _address Address of the account to change.\\n */\\n function _checkAccountChange(\\n address _address\\n )\\n internal\\n {\\n // Start by checking for a load as we only want to charge nuisance gas proportional to\\n // contract size once.\\n _checkAccountLoad(_address);\\n\\n // Check whether the account has been changed before and mark it as changed if not. We need\\n // this because \\\"nuisance gas\\\" only applies to the first time that an account is changed.\\n (\\n bool _wasAccountAlreadyChanged\\n ) = ovmStateManager.testAndSetAccountChanged(_address);\\n\\n // If we hadn't already loaded the account, then we'll need to charge \\\"nuisance gas\\\" based\\n // on the size of the contract code.\\n if (_wasAccountAlreadyChanged == false) {\\n ovmStateManager.incrementTotalUncommittedAccounts();\\n _useNuisanceGas(\\n (Lib_EthUtils.getCodeSize(_getAccountEthAddress(_address)) * NUISANCE_GAS_PER_CONTRACT_BYTE) + MIN_NUISANCE_GAS_PER_CONTRACT\\n );\\n }\\n }\\n\\n /**\\n * Validation whenever a slot needs to be loaded. Checks that the account exists, charges\\n * nuisance gas if the slot hasn't been loaded before.\\n * @param _contract Address of the account to load from.\\n * @param _key 32 byte key to load.\\n */\\n function _checkContractStorageLoad(\\n address _contract,\\n bytes32 _key\\n )\\n internal\\n {\\n // Another case of hidden complexity. If we didn't enforce this requirement, then a\\n // contract could pass in just enough gas to cause the INVALID_STATE_ACCESS check to fail\\n // on L1 but not on L2. A contract could use this behavior to prevent the\\n // OVM_ExecutionManager from detecting an invalid state access. Reverting with OUT_OF_GAS\\n // allows us to also charge for the full message nuisance gas, because you deserve that for\\n // trying to break the contract in this way.\\n if (gasleft() < MIN_GAS_FOR_INVALID_STATE_ACCESS) {\\n _revertWithFlag(RevertFlag.OUT_OF_GAS);\\n }\\n\\n // We need to make sure that the transaction isn't trying to access storage that hasn't\\n // been provided to the OVM_StateManager. We'll immediately abort if this is the case.\\n // We know that we have enough gas to do this check because of the above test.\\n if (ovmStateManager.hasContractStorage(_contract, _key) == false) {\\n _revertWithFlag(RevertFlag.INVALID_STATE_ACCESS);\\n }\\n\\n // Check whether the slot has been loaded before and mark it as loaded if not. We need\\n // this because \\\"nuisance gas\\\" only applies to the first time that a slot is loaded.\\n (\\n bool _wasContractStorageAlreadyLoaded\\n ) = ovmStateManager.testAndSetContractStorageLoaded(_contract, _key);\\n\\n // If we hadn't already loaded the account, then we'll need to charge some fixed amount of\\n // \\\"nuisance gas\\\".\\n if (_wasContractStorageAlreadyLoaded == false) {\\n _useNuisanceGas(NUISANCE_GAS_SLOAD);\\n }\\n }\\n\\n /**\\n * Validation whenever a slot needs to be changed. Checks that the account exists, charges\\n * nuisance gas if the slot hasn't been changed before.\\n * @param _contract Address of the account to change.\\n * @param _key 32 byte key to change.\\n */\\n function _checkContractStorageChange(\\n address _contract,\\n bytes32 _key\\n )\\n internal\\n {\\n // Start by checking for load to make sure we have the storage slot and that we charge the\\n // \\\"nuisance gas\\\" necessary to prove the storage slot state.\\n _checkContractStorageLoad(_contract, _key);\\n\\n // Check whether the slot has been changed before and mark it as changed if not. We need\\n // this because \\\"nuisance gas\\\" only applies to the first time that a slot is changed.\\n (\\n bool _wasContractStorageAlreadyChanged\\n ) = ovmStateManager.testAndSetContractStorageChanged(_contract, _key);\\n\\n // If we hadn't already changed the account, then we'll need to charge some fixed amount of\\n // \\\"nuisance gas\\\".\\n if (_wasContractStorageAlreadyChanged == false) {\\n // Changing a storage slot means that we're also going to have to change the\\n // corresponding account, so do an account change check.\\n _checkAccountChange(_contract);\\n\\n ovmStateManager.incrementTotalUncommittedContractStorage();\\n _useNuisanceGas(NUISANCE_GAS_SSTORE);\\n }\\n }\\n\\n\\n /************************************\\n * Internal Functions: Revert Logic *\\n ************************************/\\n\\n /**\\n * Simple encoding for revert data.\\n * @param _flag Flag to revert with.\\n * @param _data Additional user-provided revert data.\\n * @return _revertdata Encoded revert data.\\n */\\n function _encodeRevertData(\\n RevertFlag _flag,\\n bytes memory _data\\n )\\n internal\\n view\\n returns (\\n bytes memory _revertdata\\n )\\n {\\n // Out of gas and create exceptions will fundamentally return no data, so simulating it shouldn't either.\\n if (\\n _flag == RevertFlag.OUT_OF_GAS\\n ) {\\n return bytes('');\\n }\\n\\n // INVALID_STATE_ACCESS doesn't need to return any data other than the flag.\\n if (_flag == RevertFlag.INVALID_STATE_ACCESS) {\\n return abi.encode(\\n _flag,\\n 0,\\n 0,\\n bytes('')\\n );\\n }\\n\\n // Just ABI encode the rest of the parameters.\\n return abi.encode(\\n _flag,\\n messageRecord.nuisanceGasLeft,\\n transactionRecord.ovmGasRefund,\\n _data\\n );\\n }\\n\\n /**\\n * Simple decoding for revert data.\\n * @param _revertdata Revert data to decode.\\n * @return _flag Flag used to revert.\\n * @return _nuisanceGasLeft Amount of nuisance gas unused by the message.\\n * @return _ovmGasRefund Amount of gas refunded during the message.\\n * @return _data Additional user-provided revert data.\\n */\\n function _decodeRevertData(\\n bytes memory _revertdata\\n )\\n internal\\n pure\\n returns (\\n RevertFlag _flag,\\n uint256 _nuisanceGasLeft,\\n uint256 _ovmGasRefund,\\n bytes memory _data\\n )\\n {\\n // A length of zero means the call ran out of gas, just return empty data.\\n if (_revertdata.length == 0) {\\n return (\\n RevertFlag.OUT_OF_GAS,\\n 0,\\n 0,\\n bytes('')\\n );\\n }\\n\\n // ABI decode the incoming data.\\n return abi.decode(_revertdata, (RevertFlag, uint256, uint256, bytes));\\n }\\n\\n /**\\n * Causes a message to revert or abort.\\n * @param _flag Flag to revert with.\\n * @param _data Additional user-provided data.\\n */\\n function _revertWithFlag(\\n RevertFlag _flag,\\n bytes memory _data\\n )\\n internal\\n view\\n {\\n bytes memory revertdata = _encodeRevertData(\\n _flag,\\n _data\\n );\\n\\n assembly {\\n revert(add(revertdata, 0x20), mload(revertdata))\\n }\\n }\\n\\n /**\\n * Causes a message to revert or abort.\\n * @param _flag Flag to revert with.\\n */\\n function _revertWithFlag(\\n RevertFlag _flag\\n )\\n internal\\n {\\n _revertWithFlag(_flag, bytes(''));\\n }\\n\\n\\n /******************************************\\n * Internal Functions: Nuisance Gas Logic *\\n ******************************************/\\n\\n /**\\n * Computes the nuisance gas limit from the gas limit.\\n * @dev This function is currently using a naive implementation whereby the nuisance gas limit\\n * is set to exactly equal the lesser of the gas limit or remaining gas. It's likely that\\n * this implementation is perfectly fine, but we may change this formula later.\\n * @param _gasLimit Gas limit to compute from.\\n * @return _nuisanceGasLimit Computed nuisance gas limit.\\n */\\n function _getNuisanceGasLimit(\\n uint256 _gasLimit\\n )\\n internal\\n view\\n returns (\\n uint256 _nuisanceGasLimit\\n )\\n {\\n return _gasLimit < gasleft() ? _gasLimit : gasleft();\\n }\\n\\n /**\\n * Uses a certain amount of nuisance gas.\\n * @param _amount Amount of nuisance gas to use.\\n */\\n function _useNuisanceGas(\\n uint256 _amount\\n )\\n internal\\n {\\n // Essentially the same as a standard OUT_OF_GAS, except we also retain a record of the gas\\n // refund to be given at the end of the transaction.\\n if (messageRecord.nuisanceGasLeft < _amount) {\\n _revertWithFlag(RevertFlag.EXCEEDS_NUISANCE_GAS);\\n }\\n\\n messageRecord.nuisanceGasLeft -= _amount;\\n }\\n\\n\\n /************************************\\n * Internal Functions: Gas Metering *\\n ************************************/\\n\\n /**\\n * Checks whether a transaction needs to start a new epoch and does so if necessary.\\n * @param _timestamp Transaction timestamp.\\n */\\n function _checkNeedsNewEpoch(\\n uint256 _timestamp\\n )\\n internal\\n {\\n if (\\n _timestamp >= (\\n _getGasMetadata(GasMetadataKey.CURRENT_EPOCH_START_TIMESTAMP)\\n + gasMeterConfig.secondsPerEpoch\\n )\\n ) {\\n _putGasMetadata(\\n GasMetadataKey.CURRENT_EPOCH_START_TIMESTAMP,\\n _timestamp\\n );\\n\\n _putGasMetadata(\\n GasMetadataKey.PREV_EPOCH_SEQUENCER_QUEUE_GAS,\\n _getGasMetadata(\\n GasMetadataKey.CUMULATIVE_SEQUENCER_QUEUE_GAS\\n )\\n );\\n\\n _putGasMetadata(\\n GasMetadataKey.PREV_EPOCH_L1TOL2_QUEUE_GAS,\\n _getGasMetadata(\\n GasMetadataKey.CUMULATIVE_L1TOL2_QUEUE_GAS\\n )\\n );\\n }\\n }\\n\\n /**\\n * Validates the gas limit for a given transaction.\\n * @param _gasLimit Gas limit provided by the transaction.\\n * param _queueOrigin Queue from which the transaction originated.\\n * @return _valid Whether or not the gas limit is valid.\\n */\\n function _isValidGasLimit(\\n uint256 _gasLimit,\\n Lib_OVMCodec.QueueOrigin // _queueOrigin\\n )\\n view\\n internal\\n returns (\\n bool _valid\\n )\\n {\\n // Always have to be below the maximum gas limit.\\n if (_gasLimit > gasMeterConfig.maxTransactionGasLimit) {\\n return false;\\n }\\n\\n // Always have to be above the minimum gas limit.\\n if (_gasLimit < gasMeterConfig.minTransactionGasLimit) {\\n return false;\\n }\\n\\n // TEMPORARY: Gas metering is disabled for minnet.\\n return true;\\n // GasMetadataKey cumulativeGasKey;\\n // GasMetadataKey prevEpochGasKey;\\n // if (_queueOrigin == Lib_OVMCodec.QueueOrigin.SEQUENCER_QUEUE) {\\n // cumulativeGasKey = GasMetadataKey.CUMULATIVE_SEQUENCER_QUEUE_GAS;\\n // prevEpochGasKey = GasMetadataKey.PREV_EPOCH_SEQUENCER_QUEUE_GAS;\\n // } else {\\n // cumulativeGasKey = GasMetadataKey.CUMULATIVE_L1TOL2_QUEUE_GAS;\\n // prevEpochGasKey = GasMetadataKey.PREV_EPOCH_L1TOL2_QUEUE_GAS;\\n // }\\n\\n // return (\\n // (\\n // _getGasMetadata(cumulativeGasKey)\\n // - _getGasMetadata(prevEpochGasKey)\\n // + _gasLimit\\n // ) < gasMeterConfig.maxGasPerQueuePerEpoch\\n // );\\n }\\n\\n /**\\n * Updates the cumulative gas after a transaction.\\n * @param _gasUsed Gas used by the transaction.\\n * @param _queueOrigin Queue from which the transaction originated.\\n */\\n function _updateCumulativeGas(\\n uint256 _gasUsed,\\n Lib_OVMCodec.QueueOrigin _queueOrigin\\n )\\n internal\\n {\\n GasMetadataKey cumulativeGasKey;\\n if (_queueOrigin == Lib_OVMCodec.QueueOrigin.SEQUENCER_QUEUE) {\\n cumulativeGasKey = GasMetadataKey.CUMULATIVE_SEQUENCER_QUEUE_GAS;\\n } else {\\n cumulativeGasKey = GasMetadataKey.CUMULATIVE_L1TOL2_QUEUE_GAS;\\n }\\n\\n _putGasMetadata(\\n cumulativeGasKey,\\n (\\n _getGasMetadata(cumulativeGasKey)\\n + gasMeterConfig.minTransactionGasLimit\\n + _gasUsed\\n - transactionRecord.ovmGasRefund\\n )\\n );\\n }\\n\\n /**\\n * Retrieves the value of a gas metadata key.\\n * @param _key Gas metadata key to retrieve.\\n * @return _value Value stored at the given key.\\n */\\n function _getGasMetadata(\\n GasMetadataKey _key\\n )\\n internal\\n returns (\\n uint256 _value\\n )\\n {\\n return uint256(_getContractStorage(\\n GAS_METADATA_ADDRESS,\\n bytes32(uint256(_key))\\n ));\\n }\\n\\n /**\\n * Sets the value of a gas metadata key.\\n * @param _key Gas metadata key to set.\\n * @param _value Value to store at the given key.\\n */\\n function _putGasMetadata(\\n GasMetadataKey _key,\\n uint256 _value\\n )\\n internal\\n {\\n _putContractStorage(\\n GAS_METADATA_ADDRESS,\\n bytes32(uint256(_key)),\\n bytes32(uint256(_value))\\n );\\n }\\n\\n\\n /*****************************************\\n * Internal Functions: Execution Context *\\n *****************************************/\\n\\n /**\\n * Swaps over to a new message context.\\n * @param _prevMessageContext Context we're switching from.\\n * @param _nextMessageContext Context we're switching to.\\n */\\n function _switchMessageContext(\\n MessageContext memory _prevMessageContext,\\n MessageContext memory _nextMessageContext\\n )\\n internal\\n {\\n // Avoid unnecessary the SSTORE.\\n if (_prevMessageContext.ovmCALLER != _nextMessageContext.ovmCALLER) {\\n messageContext.ovmCALLER = _nextMessageContext.ovmCALLER;\\n }\\n\\n // Avoid unnecessary the SSTORE.\\n if (_prevMessageContext.ovmADDRESS != _nextMessageContext.ovmADDRESS) {\\n messageContext.ovmADDRESS = _nextMessageContext.ovmADDRESS;\\n }\\n\\n // Avoid unnecessary the SSTORE.\\n if (_prevMessageContext.isStatic != _nextMessageContext.isStatic) {\\n messageContext.isStatic = _nextMessageContext.isStatic;\\n }\\n }\\n\\n /**\\n * Initializes the execution context.\\n * @param _transaction OVM transaction being executed.\\n */\\n function _initContext(\\n Lib_OVMCodec.Transaction memory _transaction\\n )\\n internal\\n {\\n transactionContext.ovmTIMESTAMP = _transaction.timestamp;\\n transactionContext.ovmNUMBER = _transaction.blockNumber;\\n transactionContext.ovmTXGASLIMIT = _transaction.gasLimit;\\n transactionContext.ovmL1QUEUEORIGIN = _transaction.l1QueueOrigin;\\n transactionContext.ovmL1TXORIGIN = _transaction.l1TxOrigin;\\n transactionContext.ovmGASLIMIT = gasMeterConfig.maxGasPerQueuePerEpoch;\\n\\n messageRecord.nuisanceGasLeft = _getNuisanceGasLimit(_transaction.gasLimit);\\n }\\n\\n /**\\n * Resets the transaction and message context.\\n */\\n function _resetContext()\\n internal\\n {\\n transactionContext.ovmL1TXORIGIN = address(0);\\n transactionContext.ovmTIMESTAMP = 0;\\n transactionContext.ovmNUMBER = 0;\\n transactionContext.ovmGASLIMIT = 0;\\n transactionContext.ovmTXGASLIMIT = 0;\\n transactionContext.ovmL1QUEUEORIGIN = Lib_OVMCodec.QueueOrigin.SEQUENCER_QUEUE;\\n\\n transactionRecord.ovmGasRefund = 0;\\n\\n messageContext.ovmCALLER = address(0);\\n messageContext.ovmADDRESS = address(0);\\n messageContext.isStatic = false;\\n\\n messageRecord.nuisanceGasLeft = 0;\\n\\n // Reset the ovmStateManager.\\n ovmStateManager = iOVM_StateManager(address(0));\\n }\\n\\n /*****************************\\n * L2-only Helper Functions *\\n *****************************/\\n\\n /**\\n * Unreachable helper function for simulating eth_calls with an OVM message context.\\n * This function will throw an exception in all cases other than when used as a custom entrypoint in L2 Geth to simulate eth_call.\\n * @param _transaction the message transaction to simulate.\\n * @param _from the OVM account the simulated call should be from.\\n */\\n function simulateMessage(\\n Lib_OVMCodec.Transaction memory _transaction,\\n address _from,\\n iOVM_StateManager _ovmStateManager\\n )\\n external\\n returns (\\n bool,\\n bytes memory\\n )\\n {\\n // Prevent this call from having any effect unless in a custom-set VM frame\\n require(msg.sender == address(0));\\n\\n ovmStateManager = _ovmStateManager;\\n _initContext(_transaction);\\n messageRecord.nuisanceGasLeft = uint(-1);\\n\\n messageContext.ovmADDRESS = _from;\\n\\n bool isCreate = _transaction.entrypoint == address(0);\\n if (isCreate) {\\n (address created, bytes memory revertData) = ovmCREATE(_transaction.data);\\n if (created == address(0)) {\\n return (false, revertData);\\n } else {\\n // The eth_call RPC endpoint for to = undefined will return the deployed bytecode\\n // in the success case, differing from standard create messages.\\n return (true, Lib_EthUtils.getCode(created));\\n }\\n } else {\\n return ovmCALL(\\n _transaction.gasLimit,\\n _transaction.entrypoint,\\n _transaction.data\\n );\\n }\\n }\\n}\\n\",\"keccak256\":\"0xbe55117367fc4c422cf41a8097705551a9b28d4774d774aa81a428526c85ec5c\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/predeploys/OVM_DeployerWhitelist.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_Bytes32Utils } from \\\"../../libraries/utils/Lib_Bytes32Utils.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_DeployerWhitelist } from \\\"../../iOVM/predeploys/iOVM_DeployerWhitelist.sol\\\";\\nimport { Lib_SafeExecutionManagerWrapper } from \\\"../../libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\\\";\\n\\n/**\\n * @title OVM_DeployerWhitelist\\n * @dev The Deployer Whitelist is a temporary predeploy used to provide additional safety during the\\n * initial phases of our mainnet roll out. It is owned by the Optimism team, and defines accounts\\n * which are allowed to deploy contracts on Layer2. The Execution Manager will only allow an \\n * ovmCREATE or ovmCREATE2 operation to proceed if the deployer's address whitelisted.\\n * \\n * Compiler used: solc\\n * Runtime target: OVM\\n */\\ncontract OVM_DeployerWhitelist is iOVM_DeployerWhitelist {\\n\\n /**********************\\n * Contract Constants *\\n **********************/\\n\\n bytes32 internal constant KEY_INITIALIZED = 0x0000000000000000000000000000000000000000000000000000000000000010;\\n bytes32 internal constant KEY_OWNER = 0x0000000000000000000000000000000000000000000000000000000000000011;\\n bytes32 internal constant KEY_ALLOW_ARBITRARY_DEPLOYMENT = 0x0000000000000000000000000000000000000000000000000000000000000012;\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n \\n /**\\n * Blocks functions to anyone except the contract owner.\\n */\\n modifier onlyOwner() {\\n address owner = Lib_Bytes32Utils.toAddress(\\n Lib_SafeExecutionManagerWrapper.safeSLOAD(\\n KEY_OWNER\\n )\\n );\\n\\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(\\n Lib_SafeExecutionManagerWrapper.safeCALLER() == owner,\\n \\\"Function can only be called by the owner of this contract.\\\"\\n );\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n \\n /**\\n * Initializes the whitelist.\\n * @param _owner Address of the owner for this contract.\\n * @param _allowArbitraryDeployment Whether or not to allow arbitrary contract deployment.\\n */\\n function initialize(\\n address _owner,\\n bool _allowArbitraryDeployment\\n )\\n override\\n public\\n {\\n bool initialized = Lib_Bytes32Utils.toBool(\\n Lib_SafeExecutionManagerWrapper.safeSLOAD(KEY_INITIALIZED)\\n );\\n\\n if (initialized == true) {\\n return;\\n }\\n\\n Lib_SafeExecutionManagerWrapper.safeSSTORE(\\n KEY_INITIALIZED,\\n Lib_Bytes32Utils.fromBool(true)\\n );\\n Lib_SafeExecutionManagerWrapper.safeSSTORE(\\n KEY_OWNER,\\n Lib_Bytes32Utils.fromAddress(_owner)\\n );\\n Lib_SafeExecutionManagerWrapper.safeSSTORE(\\n KEY_ALLOW_ARBITRARY_DEPLOYMENT,\\n Lib_Bytes32Utils.fromBool(_allowArbitraryDeployment)\\n );\\n }\\n\\n /**\\n * Gets the owner of the whitelist.\\n */\\n function getOwner()\\n override\\n public\\n returns(\\n address\\n )\\n {\\n return Lib_Bytes32Utils.toAddress(\\n Lib_SafeExecutionManagerWrapper.safeSLOAD(\\n KEY_OWNER\\n )\\n );\\n }\\n\\n /**\\n * Adds or removes an address from the deployment whitelist.\\n * @param _deployer Address to update permissions for.\\n * @param _isWhitelisted Whether or not the address is whitelisted.\\n */\\n function setWhitelistedDeployer(\\n address _deployer,\\n bool _isWhitelisted\\n )\\n override\\n public\\n onlyOwner\\n {\\n Lib_SafeExecutionManagerWrapper.safeSSTORE(\\n Lib_Bytes32Utils.fromAddress(_deployer),\\n Lib_Bytes32Utils.fromBool(_isWhitelisted)\\n );\\n }\\n\\n /**\\n * Updates the owner of this contract.\\n * @param _owner Address of the new owner.\\n */\\n function setOwner(\\n address _owner\\n )\\n override\\n public\\n onlyOwner\\n {\\n Lib_SafeExecutionManagerWrapper.safeSSTORE(\\n KEY_OWNER,\\n Lib_Bytes32Utils.fromAddress(_owner)\\n );\\n }\\n\\n /**\\n * Updates the arbitrary deployment flag.\\n * @param _allowArbitraryDeployment Whether or not to allow arbitrary contract deployment.\\n */\\n function setAllowArbitraryDeployment(\\n bool _allowArbitraryDeployment\\n )\\n override\\n public\\n onlyOwner\\n {\\n Lib_SafeExecutionManagerWrapper.safeSSTORE(\\n KEY_ALLOW_ARBITRARY_DEPLOYMENT,\\n Lib_Bytes32Utils.fromBool(_allowArbitraryDeployment)\\n );\\n }\\n\\n /**\\n * Permanently enables arbitrary contract deployment and deletes the owner.\\n */\\n function enableArbitraryContractDeployment()\\n override\\n public\\n onlyOwner\\n {\\n setAllowArbitraryDeployment(true);\\n setOwner(address(0));\\n }\\n\\n /**\\n * Checks whether an address is allowed to deploy contracts.\\n * @param _deployer Address to check.\\n * @return _allowed Whether or not the address can deploy contracts.\\n */\\n function isDeployerAllowed(\\n address _deployer\\n )\\n override\\n public\\n returns (\\n bool _allowed\\n )\\n {\\n bool initialized = Lib_Bytes32Utils.toBool(\\n Lib_SafeExecutionManagerWrapper.safeSLOAD(KEY_INITIALIZED)\\n );\\n\\n if (initialized == false) {\\n return true;\\n }\\n\\n bool allowArbitraryDeployment = Lib_Bytes32Utils.toBool(\\n Lib_SafeExecutionManagerWrapper.safeSLOAD(KEY_ALLOW_ARBITRARY_DEPLOYMENT)\\n );\\n\\n if (allowArbitraryDeployment == true) {\\n return true;\\n }\\n\\n bool isWhitelisted = Lib_Bytes32Utils.toBool(\\n Lib_SafeExecutionManagerWrapper.safeSLOAD(\\n Lib_Bytes32Utils.fromAddress(_deployer)\\n )\\n );\\n\\n return isWhitelisted; \\n }\\n}\\n\",\"keccak256\":\"0xe746e2a3f649d3d9760db8a0b6dccee5cdb267c9615268181285846277307084\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/accounts/iOVM_ECDSAContractAccount.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title iOVM_ECDSAContractAccount\\n */\\ninterface iOVM_ECDSAContractAccount {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function execute(\\n bytes memory _transaction,\\n Lib_OVMCodec.EOASignatureType _signatureType,\\n uint8 _v,\\n bytes32 _r,\\n bytes32 _s\\n ) external returns (bool _success, bytes memory _returndata);\\n}\\n\",\"keccak256\":\"0x308729bc62dcffb11ff1d840781105cf1bf0dd4cbcfb1af704b800bb0cfe9b85\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/execution/iOVM_ExecutionManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\ninterface iOVM_ExecutionManager {\\n /**********\\n * Enums *\\n *********/\\n\\n enum RevertFlag {\\n OUT_OF_GAS,\\n INTENTIONAL_REVERT,\\n EXCEEDS_NUISANCE_GAS,\\n INVALID_STATE_ACCESS,\\n UNSAFE_BYTECODE,\\n CREATE_COLLISION,\\n STATIC_VIOLATION,\\n CREATOR_NOT_ALLOWED\\n }\\n\\n enum GasMetadataKey {\\n CURRENT_EPOCH_START_TIMESTAMP,\\n CUMULATIVE_SEQUENCER_QUEUE_GAS,\\n CUMULATIVE_L1TOL2_QUEUE_GAS,\\n PREV_EPOCH_SEQUENCER_QUEUE_GAS,\\n PREV_EPOCH_L1TOL2_QUEUE_GAS\\n }\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct GasMeterConfig {\\n uint256 minTransactionGasLimit;\\n uint256 maxTransactionGasLimit;\\n uint256 maxGasPerQueuePerEpoch;\\n uint256 secondsPerEpoch;\\n }\\n\\n struct GlobalContext {\\n uint256 ovmCHAINID;\\n }\\n\\n struct TransactionContext {\\n Lib_OVMCodec.QueueOrigin ovmL1QUEUEORIGIN;\\n uint256 ovmTIMESTAMP;\\n uint256 ovmNUMBER;\\n uint256 ovmGASLIMIT;\\n uint256 ovmTXGASLIMIT;\\n address ovmL1TXORIGIN;\\n }\\n\\n struct TransactionRecord {\\n uint256 ovmGasRefund;\\n }\\n\\n struct MessageContext {\\n address ovmCALLER;\\n address ovmADDRESS;\\n bool isStatic;\\n }\\n\\n struct MessageRecord {\\n uint256 nuisanceGasLeft;\\n }\\n\\n\\n /************************************\\n * Transaction Execution Entrypoint *\\n ************************************/\\n\\n function run(\\n Lib_OVMCodec.Transaction calldata _transaction,\\n address _txStateManager\\n ) external;\\n\\n\\n /*******************\\n * Context Opcodes *\\n *******************/\\n\\n function ovmCALLER() external view returns (address _caller);\\n function ovmADDRESS() external view returns (address _address);\\n function ovmTIMESTAMP() external view returns (uint256 _timestamp);\\n function ovmNUMBER() external view returns (uint256 _number);\\n function ovmGASLIMIT() external view returns (uint256 _gasLimit);\\n function ovmCHAINID() external view returns (uint256 _chainId);\\n\\n\\n /**********************\\n * L2 Context Opcodes *\\n **********************/\\n\\n function ovmL1QUEUEORIGIN() external view returns (Lib_OVMCodec.QueueOrigin _queueOrigin);\\n function ovmL1TXORIGIN() external view returns (address _l1TxOrigin);\\n\\n\\n /*******************\\n * Halting Opcodes *\\n *******************/\\n\\n function ovmREVERT(bytes memory _data) external;\\n\\n\\n /*****************************\\n * Contract Creation Opcodes *\\n *****************************/\\n\\n function ovmCREATE(bytes memory _bytecode) external returns (address _contract, bytes memory _revertdata);\\n function ovmCREATE2(bytes memory _bytecode, bytes32 _salt) external returns (address _contract, bytes memory _revertdata);\\n\\n\\n /*******************************\\n * Account Abstraction Opcodes *\\n ******************************/\\n\\n function ovmGETNONCE() external returns (uint256 _nonce);\\n function ovmINCREMENTNONCE() external;\\n function ovmCREATEEOA(bytes32 _messageHash, uint8 _v, bytes32 _r, bytes32 _s) external;\\n\\n\\n /****************************\\n * Contract Calling Opcodes *\\n ****************************/\\n\\n function ovmCALL(uint256 _gasLimit, address _address, bytes memory _calldata) external returns (bool _success, bytes memory _returndata);\\n function ovmSTATICCALL(uint256 _gasLimit, address _address, bytes memory _calldata) external returns (bool _success, bytes memory _returndata);\\n function ovmDELEGATECALL(uint256 _gasLimit, address _address, bytes memory _calldata) external returns (bool _success, bytes memory _returndata);\\n\\n\\n /****************************\\n * Contract Storage Opcodes *\\n ****************************/\\n\\n function ovmSLOAD(bytes32 _key) external returns (bytes32 _value);\\n function ovmSSTORE(bytes32 _key, bytes32 _value) external;\\n\\n\\n /*************************\\n * Contract Code Opcodes *\\n *************************/\\n\\n function ovmEXTCODECOPY(address _contract, uint256 _offset, uint256 _length) external returns (bytes memory _code);\\n function ovmEXTCODESIZE(address _contract) external returns (uint256 _size);\\n function ovmEXTCODEHASH(address _contract) external returns (bytes32 _hash);\\n\\n\\n /***************************************\\n * Public Functions: Execution Context *\\n ***************************************/\\n\\n function getMaxTransactionGasLimit() external view returns (uint _maxTransactionGasLimit);\\n}\\n\",\"keccak256\":\"0xa613e2f578d56aa80f0916df538b487f8213a18933e78fdecb9efeedae02cf9c\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/execution/iOVM_SafetyChecker.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title iOVM_SafetyChecker\\n */\\ninterface iOVM_SafetyChecker {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function isBytecodeSafe(bytes calldata _bytecode) external pure returns (bool);\\n}\\n\",\"keccak256\":\"0xde6639676d4ec4f77297652d5ede2429bc93e74e11fefd9e9de4bc92dd784878\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/execution/iOVM_StateManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title iOVM_StateManager\\n */\\ninterface iOVM_StateManager {\\n\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n enum ItemState {\\n ITEM_UNTOUCHED,\\n ITEM_LOADED,\\n ITEM_CHANGED,\\n ITEM_COMMITTED\\n }\\n\\n /***************************\\n * Public Functions: Misc *\\n ***************************/\\n\\n function isAuthenticated(address _address) external view returns (bool);\\n\\n /***************************\\n * Public Functions: Setup *\\n ***************************/\\n\\n function owner() external view returns (address _owner);\\n function ovmExecutionManager() external view returns (address _ovmExecutionManager);\\n function setExecutionManager(address _ovmExecutionManager) external;\\n\\n\\n /************************************\\n * Public Functions: Account Access *\\n ************************************/\\n\\n function putAccount(address _address, Lib_OVMCodec.Account memory _account) external;\\n function putEmptyAccount(address _address) external;\\n function getAccount(address _address) external view returns (Lib_OVMCodec.Account memory _account);\\n function hasAccount(address _address) external view returns (bool _exists);\\n function hasEmptyAccount(address _address) external view returns (bool _exists);\\n function setAccountNonce(address _address, uint256 _nonce) external;\\n function getAccountNonce(address _address) external view returns (uint256 _nonce);\\n function getAccountEthAddress(address _address) external view returns (address _ethAddress);\\n function getAccountStorageRoot(address _address) external view returns (bytes32 _storageRoot);\\n function initPendingAccount(address _address) external;\\n function commitPendingAccount(address _address, address _ethAddress, bytes32 _codeHash) external;\\n function testAndSetAccountLoaded(address _address) external returns (bool _wasAccountAlreadyLoaded);\\n function testAndSetAccountChanged(address _address) external returns (bool _wasAccountAlreadyChanged);\\n function commitAccount(address _address) external returns (bool _wasAccountCommitted);\\n function incrementTotalUncommittedAccounts() external;\\n function getTotalUncommittedAccounts() external view returns (uint256 _total);\\n function wasAccountChanged(address _address) external view returns (bool);\\n function wasAccountCommitted(address _address) external view returns (bool);\\n\\n\\n /************************************\\n * Public Functions: Storage Access *\\n ************************************/\\n\\n function putContractStorage(address _contract, bytes32 _key, bytes32 _value) external;\\n function getContractStorage(address _contract, bytes32 _key) external view returns (bytes32 _value);\\n function hasContractStorage(address _contract, bytes32 _key) external view returns (bool _exists);\\n function testAndSetContractStorageLoaded(address _contract, bytes32 _key) external returns (bool _wasContractStorageAlreadyLoaded);\\n function testAndSetContractStorageChanged(address _contract, bytes32 _key) external returns (bool _wasContractStorageAlreadyChanged);\\n function commitContractStorage(address _contract, bytes32 _key) external returns (bool _wasContractStorageCommitted);\\n function incrementTotalUncommittedContractStorage() external;\\n function getTotalUncommittedContractStorage() external view returns (uint256 _total);\\n function wasContractStorageChanged(address _contract, bytes32 _key) external view returns (bool);\\n function wasContractStorageCommitted(address _contract, bytes32 _key) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x7a11dbd1f61593ba34debe07e39eef59967307f7f372ba9855bee0953585d08d\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/predeploys/iOVM_DeployerWhitelist.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title iOVM_DeployerWhitelist\\n */\\ninterface iOVM_DeployerWhitelist {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function initialize(address _owner, bool _allowArbitraryDeployment) external;\\n function getOwner() external returns (address _owner);\\n function setWhitelistedDeployer(address _deployer, bool _isWhitelisted) external;\\n function setOwner(address _newOwner) external;\\n function setAllowArbitraryDeployment(bool _allowArbitraryDeployment) external;\\n function enableArbitraryContractDeployment() external;\\n function isDeployerAllowed(address _deployer) external returns (bool _allowed);\\n}\\n\",\"keccak256\":\"0x969394371cacfc36493230150b6d629173ea72dfdf729330bede475b91d0f004\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/codec/Lib_OVMCodec.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../utils/Lib_Bytes32Utils.sol\\\";\\nimport { Lib_SafeExecutionManagerWrapper } from \\\"../../libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\\\";\\n\\n/**\\n * @title Lib_OVMCodec\\n */\\nlibrary Lib_OVMCodec {\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum EOASignatureType {\\n EIP155_TRANSACTION,\\n ETH_SIGNED_MESSAGE\\n }\\n\\n enum QueueOrigin {\\n SEQUENCER_QUEUE,\\n L1TOL2_QUEUE\\n }\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Account {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n address ethAddress;\\n bool isFresh;\\n }\\n\\n struct EVMAccount {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n }\\n\\n struct ChainBatchHeader {\\n uint256 batchIndex;\\n bytes32 batchRoot;\\n uint256 batchSize;\\n uint256 prevTotalElements;\\n bytes extraData;\\n }\\n\\n struct ChainInclusionProof {\\n uint256 index;\\n bytes32[] siblings;\\n }\\n\\n struct Transaction {\\n uint256 timestamp;\\n uint256 blockNumber;\\n QueueOrigin l1QueueOrigin;\\n address l1TxOrigin;\\n address entrypoint;\\n uint256 gasLimit;\\n bytes data;\\n }\\n\\n struct TransactionChainElement {\\n bool isSequenced;\\n uint256 queueIndex; // QUEUED TX ONLY\\n uint256 timestamp; // SEQUENCER TX ONLY\\n uint256 blockNumber; // SEQUENCER TX ONLY\\n bytes txData; // SEQUENCER TX ONLY\\n }\\n\\n struct QueueElement {\\n bytes32 transactionHash;\\n uint40 timestamp;\\n uint40 blockNumber;\\n }\\n\\n struct EIP155Transaction {\\n uint256 nonce;\\n uint256 gasPrice;\\n uint256 gasLimit;\\n address to;\\n uint256 value;\\n bytes data;\\n uint256 chainId;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Decodes an EOA transaction (i.e., native Ethereum RLP encoding).\\n * @param _transaction Encoded EOA transaction.\\n * @return Transaction decoded into a struct.\\n */\\n function decodeEIP155Transaction(\\n bytes memory _transaction,\\n bool _isEthSignedMessage\\n )\\n internal\\n pure\\n returns (\\n EIP155Transaction memory\\n )\\n {\\n if (_isEthSignedMessage) {\\n (\\n uint256 _nonce,\\n uint256 _gasLimit,\\n uint256 _gasPrice,\\n uint256 _chainId,\\n address _to,\\n bytes memory _data\\n ) = abi.decode(\\n _transaction,\\n (uint256, uint256, uint256, uint256, address ,bytes)\\n );\\n return EIP155Transaction({\\n nonce: _nonce,\\n gasPrice: _gasPrice,\\n gasLimit: _gasLimit,\\n to: _to,\\n value: 0,\\n data: _data,\\n chainId: _chainId\\n });\\n } else {\\n Lib_RLPReader.RLPItem[] memory decoded = Lib_RLPReader.readList(_transaction);\\n\\n return EIP155Transaction({\\n nonce: Lib_RLPReader.readUint256(decoded[0]),\\n gasPrice: Lib_RLPReader.readUint256(decoded[1]),\\n gasLimit: Lib_RLPReader.readUint256(decoded[2]),\\n to: Lib_RLPReader.readAddress(decoded[3]),\\n value: Lib_RLPReader.readUint256(decoded[4]),\\n data: Lib_RLPReader.readBytes(decoded[5]),\\n chainId: Lib_RLPReader.readUint256(decoded[6])\\n });\\n }\\n }\\n\\n /**\\n * Decompresses a compressed EIP155 transaction.\\n * @param _transaction Compressed EIP155 transaction bytes.\\n * @return Transaction parsed into a struct.\\n */\\n function decompressEIP155Transaction(\\n bytes memory _transaction\\n )\\n internal\\n returns (\\n EIP155Transaction memory\\n )\\n {\\n return EIP155Transaction({\\n gasLimit: Lib_BytesUtils.toUint24(_transaction, 0),\\n gasPrice: uint256(Lib_BytesUtils.toUint24(_transaction, 3)) * 1000000,\\n nonce: Lib_BytesUtils.toUint24(_transaction, 6),\\n to: Lib_BytesUtils.toAddress(_transaction, 9),\\n data: Lib_BytesUtils.slice(_transaction, 29),\\n chainId: Lib_SafeExecutionManagerWrapper.safeCHAINID(),\\n value: 0\\n });\\n }\\n\\n /**\\n * Encodes an EOA transaction back into the original transaction.\\n * @param _transaction EIP155transaction to encode.\\n * @param _isEthSignedMessage Whether or not this was an eth signed message.\\n * @return Encoded transaction.\\n */\\n function encodeEIP155Transaction(\\n EIP155Transaction memory _transaction,\\n bool _isEthSignedMessage\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n if (_isEthSignedMessage) {\\n return abi.encode(\\n _transaction.nonce,\\n _transaction.gasLimit,\\n _transaction.gasPrice,\\n _transaction.chainId,\\n _transaction.to,\\n _transaction.data\\n );\\n } else {\\n bytes[] memory raw = new bytes[](9);\\n\\n raw[0] = Lib_RLPWriter.writeUint(_transaction.nonce);\\n raw[1] = Lib_RLPWriter.writeUint(_transaction.gasPrice);\\n raw[2] = Lib_RLPWriter.writeUint(_transaction.gasLimit);\\n if (_transaction.to == address(0)) {\\n raw[3] = Lib_RLPWriter.writeBytes('');\\n } else {\\n raw[3] = Lib_RLPWriter.writeAddress(_transaction.to);\\n }\\n raw[4] = Lib_RLPWriter.writeUint(0);\\n raw[5] = Lib_RLPWriter.writeBytes(_transaction.data);\\n raw[6] = Lib_RLPWriter.writeUint(_transaction.chainId);\\n raw[7] = Lib_RLPWriter.writeBytes(bytes(''));\\n raw[8] = Lib_RLPWriter.writeBytes(bytes(''));\\n\\n return Lib_RLPWriter.writeList(raw);\\n }\\n }\\n\\n /**\\n * Encodes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Encoded transaction bytes.\\n */\\n function encodeTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return abi.encodePacked(\\n _transaction.timestamp,\\n _transaction.blockNumber,\\n _transaction.l1QueueOrigin,\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n );\\n }\\n\\n /**\\n * Hashes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Hashed transaction\\n */\\n function hashTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(encodeTransaction(_transaction));\\n }\\n\\n /**\\n * Converts an OVM account to an EVM account.\\n * @param _in OVM account to convert.\\n * @return Converted EVM account.\\n */\\n function toEVMAccount(\\n Account memory _in\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n return EVMAccount({\\n nonce: _in.nonce,\\n balance: _in.balance,\\n storageRoot: _in.storageRoot,\\n codeHash: _in.codeHash\\n });\\n }\\n\\n /**\\n * @notice RLP-encodes an account state struct.\\n * @param _account Account state struct.\\n * @return RLP-encoded account state.\\n */\\n function encodeEVMAccount(\\n EVMAccount memory _account\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes[] memory raw = new bytes[](4);\\n\\n // Unfortunately we can't create this array outright because\\n // Lib_RLPWriter.writeList will reject fixed-size arrays. Assigning\\n // index-by-index circumvents this issue.\\n raw[0] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.nonce)\\n )\\n );\\n raw[1] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.balance)\\n )\\n );\\n raw[2] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.storageRoot));\\n raw[3] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.codeHash));\\n\\n return Lib_RLPWriter.writeList(raw);\\n }\\n\\n /**\\n * @notice Decodes an RLP-encoded account state into a useful struct.\\n * @param _encoded RLP-encoded account state.\\n * @return Account state struct.\\n */\\n function decodeEVMAccount(\\n bytes memory _encoded\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\\n\\n return EVMAccount({\\n nonce: Lib_RLPReader.readUint256(accountState[0]),\\n balance: Lib_RLPReader.readUint256(accountState[1]),\\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\\n });\\n }\\n\\n /**\\n * Calculates a hash for a given batch header.\\n * @param _batchHeader Header to hash.\\n * @return Hash of the header.\\n */\\n function hashBatchHeader(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(\\n abi.encode(\\n _batchHeader.batchRoot,\\n _batchHeader.batchSize,\\n _batchHeader.prevTotalElements,\\n _batchHeader.extraData\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0xe7e518ba7bba3fa28c532f8902576c1bb4dfc1ec4b62bed6da50623248ba17c3\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Contract Imports */\\nimport { Ownable } from \\\"./Lib_Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n /*******************************************\\n * Contract Variables: Internal Accounting *\\n *******************************************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n public\\n onlyOwner\\n {\\n emit AddressSet(_name, _address);\\n addresses[_getNameHash(_name)] = _address;\\n }\\n\\n function getAddress(\\n string memory _name\\n )\\n public\\n view\\n returns (address)\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32 _hash\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0x3a490595cc21ff170e4027843093670ff845d5972481fbfb956b722ea564bb06\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n\\n /*******************************************\\n * Contract Variables: Contract References *\\n *******************************************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(\\n address _libAddressManager\\n ) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function resolve(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address _contract\\n )\\n {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0xaa3ed342f6deb156c660fd83afa579a3b80db17eb465e8949cf5c1b114780143\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Ownable\\n * @dev Adapted from https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol\\n */\\nabstract contract Ownable {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n address public owner;\\n\\n\\n /**********\\n * Events *\\n **********/\\n\\n event OwnershipTransferred(\\n address indexed previousOwner,\\n address indexed newOwner\\n );\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n constructor() {\\n owner = msg.sender;\\n emit OwnershipTransferred(address(0), owner);\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n owner == msg.sender,\\n \\\"Ownable: caller is not the owner\\\"\\n );\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function renounceOwnership()\\n public\\n virtual\\n onlyOwner\\n {\\n emit OwnershipTransferred(owner, address(0));\\n owner = address(0);\\n }\\n\\n function transferOwnership(address _newOwner)\\n public\\n virtual\\n onlyOwner\\n {\\n require(\\n _newOwner != address(0),\\n \\\"Ownable: new owner cannot be the zero address\\\"\\n );\\n\\n emit OwnershipTransferred(owner, _newOwner);\\n owner = _newOwner;\\n }\\n}\\n\",\"keccak256\":\"0xd9dfd9264e5b5fedd53a5b10fdf179c3f367614b0fe69179bce4e45119f5b739\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPReader.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_RLPReader\\n * @dev Adapted from \\\"RLPReader\\\" by Hamdi Allam (hamdi.allam97@gmail.com).\\n */\\nlibrary Lib_RLPReader {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 constant internal MAX_LIST_LENGTH = 32;\\n\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum RLPItemType {\\n DATA_ITEM,\\n LIST_ITEM\\n }\\n\\n \\n /***********\\n * Structs *\\n ***********/\\n\\n struct RLPItem {\\n uint256 length;\\n uint256 ptr;\\n }\\n \\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n \\n /**\\n * Converts bytes to a reference to memory position and length.\\n * @param _in Input bytes to convert.\\n * @return Output memory reference.\\n */\\n function toRLPItem(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem memory\\n )\\n {\\n uint256 ptr;\\n assembly {\\n ptr := add(_in, 32)\\n }\\n\\n return RLPItem({\\n length: _in.length,\\n ptr: ptr\\n });\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n (\\n uint256 listOffset,\\n ,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.LIST_ITEM,\\n \\\"Invalid RLP list value.\\\"\\n );\\n\\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\\n // writing to the length. Since we can't know the number of RLP items without looping over\\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\\n // simply set a reasonable maximum list length and decrease the size before we finish.\\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\\n\\n uint256 itemCount = 0;\\n uint256 offset = listOffset;\\n while (offset < _in.length) {\\n require(\\n itemCount < MAX_LIST_LENGTH,\\n \\\"Provided RLP list exceeds max list length.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n ) = _decodeLength(RLPItem({\\n length: _in.length - offset,\\n ptr: _in.ptr + offset\\n }));\\n\\n out[itemCount] = RLPItem({\\n length: itemLength + itemOffset,\\n ptr: _in.ptr + offset\\n });\\n\\n itemCount += 1;\\n offset += itemOffset + itemLength;\\n }\\n\\n // Decrease the array size to match the actual item count.\\n assembly {\\n mstore(out, itemCount)\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n return readList(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes value.\\\"\\n );\\n\\n return _copy(_in.ptr, itemOffset, itemLength);\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return readBytes(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return string(readBytes(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return readString(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n require(\\n _in.length <= 33,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr + itemOffset;\\n bytes32 out;\\n assembly {\\n out := mload(ptr)\\n\\n // Shift the bytes over to match the item size.\\n if lt(itemLength, 32) {\\n out := div(out, exp(256, sub(32, itemLength)))\\n }\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return readBytes32(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return uint256(readBytes32(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return readUint256(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n require(\\n _in.length == 1,\\n \\\"Invalid RLP boolean value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 out;\\n assembly {\\n out := byte(0, mload(ptr))\\n }\\n\\n require(\\n out == 0 || out == 1,\\n \\\"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\\\"\\n );\\n\\n return out != 0;\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return readBool(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n if (_in.length == 1) {\\n return address(0);\\n }\\n\\n require(\\n _in.length == 21,\\n \\\"Invalid RLP address value.\\\"\\n );\\n\\n return address(readUint256(_in));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return readAddress(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads the raw bytes of an RLP item.\\n * @param _in RLP item to read.\\n * @return Raw RLP bytes.\\n */\\n function readRawBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in);\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Decodes the length of an RLP item.\\n * @param _in RLP item to decode.\\n * @return Offset of the encoded data.\\n * @return Length of the encoded data.\\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\\n */\\n function _decodeLength(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n uint256,\\n uint256,\\n RLPItemType\\n )\\n {\\n require(\\n _in.length > 0,\\n \\\"RLP item cannot be null.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 prefix;\\n assembly {\\n prefix := byte(0, mload(ptr))\\n }\\n\\n if (prefix <= 0x7f) {\\n // Single byte.\\n\\n return (0, 1, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xb7) {\\n // Short string.\\n\\n uint256 strLen = prefix - 0x80;\\n \\n require(\\n _in.length > strLen,\\n \\\"Invalid RLP short string.\\\"\\n );\\n\\n return (1, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xbf) {\\n // Long string.\\n uint256 lenOfStrLen = prefix - 0xb7;\\n\\n require(\\n _in.length > lenOfStrLen,\\n \\\"Invalid RLP long string length.\\\"\\n );\\n\\n uint256 strLen;\\n assembly {\\n // Pick out the string length.\\n strLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfStrLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfStrLen + strLen,\\n \\\"Invalid RLP long string.\\\"\\n );\\n\\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xf7) {\\n // Short list.\\n uint256 listLen = prefix - 0xc0;\\n\\n require(\\n _in.length > listLen,\\n \\\"Invalid RLP short list.\\\"\\n );\\n\\n return (1, listLen, RLPItemType.LIST_ITEM);\\n } else {\\n // Long list.\\n uint256 lenOfListLen = prefix - 0xf7;\\n\\n require(\\n _in.length > lenOfListLen,\\n \\\"Invalid RLP long list length.\\\"\\n );\\n\\n uint256 listLen;\\n assembly {\\n // Pick out the list length.\\n listLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfListLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfListLen + listLen,\\n \\\"Invalid RLP long list.\\\"\\n );\\n\\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\\n }\\n }\\n\\n /**\\n * Copies the bytes from a memory location.\\n * @param _src Pointer to the location to read from.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Copied bytes.\\n */\\n function _copy(\\n uint256 _src,\\n uint256 _offset,\\n uint256 _length\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out = new bytes(_length);\\n if (out.length == 0) {\\n return out;\\n }\\n\\n uint256 src = _src + _offset;\\n uint256 dest;\\n assembly {\\n dest := add(out, 32)\\n }\\n\\n // Copy over as many complete words as we can.\\n for (uint256 i = 0; i < _length / 32; i++) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n\\n src += 32;\\n dest += 32;\\n }\\n\\n // Pick out the remaining bytes.\\n uint256 mask = 256 ** (32 - (_length % 32)) - 1;\\n assembly {\\n mstore(\\n dest,\\n or(\\n and(mload(src), not(mask)),\\n and(mload(dest), mask)\\n )\\n )\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Copies an RLP item into bytes.\\n * @param _in RLP item to copy.\\n * @return Copied bytes.\\n */\\n function _copy(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in.ptr, 0, _in.length);\\n }\\n}\\n\",\"keccak256\":\"0xbdb8fae0ca2483b4cc07607a5070fc25e33c54b4e4462b99e7c0b13aac48a09b\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPWriter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\n\\n/**\\n * @title Lib_RLPWriter\\n * @author Bakaoh (with modifications)\\n */\\nlibrary Lib_RLPWriter {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * RLP encodes a byte string.\\n * @param _in The byte string to encode.\\n * @return _out The RLP encoded string in bytes.\\n */\\n function writeBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n bytes memory encoded;\\n\\n if (_in.length == 1 && uint8(_in[0]) < 128) {\\n encoded = _in;\\n } else {\\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * RLP encodes a list of RLP encoded byte byte strings.\\n * @param _in The list of RLP encoded byte strings.\\n * @return _out The RLP encoded list of items in bytes.\\n */\\n function writeList(\\n bytes[] memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n bytes memory list = _flatten(_in);\\n return abi.encodePacked(_writeLength(list.length, 192), list);\\n }\\n\\n /**\\n * RLP encodes a string.\\n * @param _in The string to encode.\\n * @return _out The RLP encoded string in bytes.\\n */\\n function writeString(\\n string memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(bytes(_in));\\n }\\n\\n /**\\n * RLP encodes an address.\\n * @param _in The address to encode.\\n * @return _out The RLP encoded address in bytes.\\n */\\n function writeAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a uint.\\n * @param _in The uint256 to encode.\\n * @return _out The RLP encoded uint256 in bytes.\\n */\\n function writeUint(\\n uint256 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(_toBinary(_in));\\n }\\n\\n /**\\n * RLP encodes a bool.\\n * @param _in The bool to encode.\\n * @return _out The RLP encoded bool in bytes.\\n */\\n function writeBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n bytes memory encoded = new bytes(1);\\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\\n return encoded;\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\\n * @param _len The length of the string or the payload.\\n * @param _offset 128 if item is string, 192 if item is list.\\n * @return _encoded RLP encoded bytes.\\n */\\n function _writeLength(\\n uint256 _len,\\n uint256 _offset\\n )\\n private\\n pure\\n returns (\\n bytes memory _encoded\\n )\\n {\\n bytes memory encoded;\\n\\n if (_len < 56) {\\n encoded = new bytes(1);\\n encoded[0] = byte(uint8(_len) + uint8(_offset));\\n } else {\\n uint256 lenLen;\\n uint256 i = 1;\\n while (_len / i != 0) {\\n lenLen++;\\n i *= 256;\\n }\\n\\n encoded = new bytes(lenLen + 1);\\n encoded[0] = byte(uint8(lenLen) + uint8(_offset) + 55);\\n for(i = 1; i <= lenLen; i++) {\\n encoded[i] = byte(uint8((_len / (256**(lenLen-i))) % 256));\\n }\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * Encode integer in big endian binary form with no leading zeroes.\\n * @notice TODO: This should be optimized with assembly to save gas costs.\\n * @param _x The integer to encode.\\n * @return _binary RLP encoded bytes.\\n */\\n function _toBinary(\\n uint256 _x\\n )\\n private\\n pure\\n returns (\\n bytes memory _binary\\n )\\n {\\n bytes memory b = abi.encodePacked(_x);\\n\\n uint256 i = 0;\\n for (; i < 32; i++) {\\n if (b[i] != 0) {\\n break;\\n }\\n }\\n\\n bytes memory res = new bytes(32 - i);\\n for (uint256 j = 0; j < res.length; j++) {\\n res[j] = b[i++];\\n }\\n\\n return res;\\n }\\n\\n /**\\n * Copies a piece of memory to another location.\\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\\n * @param _dest Destination location.\\n * @param _src Source location.\\n * @param _len Length of memory to copy.\\n */\\n function _memcpy(\\n uint256 _dest,\\n uint256 _src,\\n uint256 _len\\n )\\n private\\n pure\\n {\\n uint256 dest = _dest;\\n uint256 src = _src;\\n uint256 len = _len;\\n\\n for(; len >= 32; len -= 32) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n dest += 32;\\n src += 32;\\n }\\n\\n uint256 mask = 256 ** (32 - len) - 1;\\n assembly {\\n let srcpart := and(mload(src), not(mask))\\n let destpart := and(mload(dest), mask)\\n mstore(dest, or(destpart, srcpart))\\n }\\n }\\n\\n /**\\n * Flattens a list of byte strings into one byte string.\\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\\n * @param _list List of byte strings to flatten.\\n * @return _flattened The flattened byte string.\\n */\\n function _flatten(\\n bytes[] memory _list\\n )\\n private\\n pure\\n returns (\\n bytes memory _flattened\\n )\\n {\\n if (_list.length == 0) {\\n return new bytes(0);\\n }\\n\\n uint256 len;\\n uint256 i = 0;\\n for (; i < _list.length; i++) {\\n len += _list[i].length;\\n }\\n\\n bytes memory flattened = new bytes(len);\\n uint256 flattenedPtr;\\n assembly { flattenedPtr := add(flattened, 0x20) }\\n\\n for(i = 0; i < _list.length; i++) {\\n bytes memory item = _list[i];\\n\\n uint256 listPtr;\\n assembly { listPtr := add(item, 0x20)}\\n\\n _memcpy(flattenedPtr, listPtr, item.length);\\n flattenedPtr += _list[i].length;\\n }\\n\\n return flattened;\\n }\\n}\",\"keccak256\":\"0xbcb24619c1758cb0d9f3fe5c79495950045a9087046a02b9ce01df46ae09ae5b\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_Bytes32Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_Byte32Utils\\n */\\nlibrary Lib_Bytes32Utils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \\\"true.\\\"\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as a boolean.\\n */\\n function toBool(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return _in != 0;\\n }\\n\\n /**\\n * Converts a boolean to a bytes32 value.\\n * @param _in Input boolean value.\\n * @return Boolean as a bytes32.\\n */\\n function fromBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in ? 1 : 0));\\n }\\n\\n /**\\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as an address.\\n */\\n function toAddress(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return address(uint160(uint256(_in)));\\n }\\n\\n /**\\n * Converts an address to a bytes32.\\n * @param _in Input address value.\\n * @return Address as a bytes32.\\n */\\n function fromAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in));\\n }\\n\\n /**\\n * Removes the leading zeros from a bytes32 value and returns a new (smaller) bytes value.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 without any leading zeros.\\n */\\n function removeLeadingZeros(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out;\\n\\n assembly {\\n // Figure out how many leading zero bytes to remove.\\n let shift := 0\\n for { let i := 0 } and(lt(i, 32), eq(byte(i, _in), 0)) { i := add(i, 1) } {\\n shift := add(shift, 1)\\n }\\n\\n // Reserve some space for our output and fix the free memory pointer.\\n out := mload(0x40)\\n mstore(0x40, add(out, 0x40))\\n\\n // Shift the value and store it into the output bytes.\\n mstore(add(out, 0x20), shl(mul(shift, 8), _in))\\n\\n // Store the new size (with leading zero bytes removed) in the output byte size.\\n mstore(out, sub(32, shift))\\n }\\n\\n return out;\\n }\\n}\\n\",\"keccak256\":\"0xfa2def593e3fc56a31852c3744aefdaa93cec74e721bfcfeb1e5d166c7c60b64\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_BytesUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_BytesUtils\\n */\\nlibrary Lib_BytesUtils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_start + _length >= _start, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n if (_bytes.length - _start == 0) {\\n return bytes('');\\n }\\n\\n return slice(_bytes, _start, _bytes.length - _start);\\n }\\n\\n function toBytes32PadLeft(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes32)\\n {\\n bytes32 ret;\\n uint256 len = _bytes.length <= 32 ? _bytes.length : 32;\\n assembly {\\n ret := shr(mul(sub(32, len), 8), mload(add(_bytes, 32)))\\n }\\n return ret;\\n }\\n\\n function toBytes32(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes32)\\n {\\n if (_bytes.length < 32) {\\n bytes32 ret;\\n assembly {\\n ret := mload(add(_bytes, 32))\\n }\\n return ret;\\n }\\n\\n return abi.decode(_bytes,(bytes32)); // will truncate if input length > 32 bytes\\n }\\n\\n function toUint256(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (uint256)\\n {\\n return uint256(toBytes32(_bytes));\\n }\\n\\n function toUint24(bytes memory _bytes, uint256 _start) internal pure returns (uint24) {\\n require(_start + 3 >= _start, \\\"toUint24_overflow\\\");\\n require(_bytes.length >= _start + 3 , \\\"toUint24_outOfBounds\\\");\\n uint24 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x3), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toUint8(bytes memory _bytes, uint256 _start) internal pure returns (uint8) {\\n require(_start + 1 >= _start, \\\"toUint8_overflow\\\");\\n require(_bytes.length >= _start + 1 , \\\"toUint8_outOfBounds\\\");\\n uint8 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x1), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toAddress(bytes memory _bytes, uint256 _start) internal pure returns (address) {\\n require(_start + 20 >= _start, \\\"toAddress_overflow\\\");\\n require(_bytes.length >= _start + 20, \\\"toAddress_outOfBounds\\\");\\n address tempAddress;\\n\\n assembly {\\n tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000)\\n }\\n\\n return tempAddress;\\n }\\n\\n function toNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n bytes memory nibbles = new bytes(_bytes.length * 2);\\n\\n for (uint256 i = 0; i < _bytes.length; i++) {\\n nibbles[i * 2] = _bytes[i] >> 4;\\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\\n }\\n\\n return nibbles;\\n }\\n\\n function fromNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n bytes memory ret = new bytes(_bytes.length / 2);\\n\\n for (uint256 i = 0; i < ret.length; i++) {\\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\\n }\\n\\n return ret;\\n }\\n\\n function equal(\\n bytes memory _bytes,\\n bytes memory _other\\n )\\n internal\\n pure\\n returns (bool)\\n {\\n return keccak256(_bytes) == keccak256(_other);\\n }\\n}\\n\",\"keccak256\":\"0x0adf22e1b22ba09911e859f64cb3b484e992be4f9fd3b09088e6225bf8d06ce0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_ECDSAUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_ECDSAUtils\\n */\\nlibrary Lib_ECDSAUtils {\\n\\n /**************************************\\n * Internal Functions: ECDSA Recovery *\\n **************************************/\\n\\n /**\\n * Recovers a signed address given a message and signature.\\n * @param _message Message that was originally signed.\\n * @param _isEthSignedMessage Whether or not the user used the `Ethereum Signed Message` prefix.\\n * @param _v Signature `v` parameter.\\n * @param _r Signature `r` parameter.\\n * @param _s Signature `s` parameter.\\n * @return _sender Signer address.\\n */\\n function recover(\\n bytes memory _message,\\n bool _isEthSignedMessage,\\n uint8 _v,\\n bytes32 _r,\\n bytes32 _s\\n )\\n internal\\n pure\\n returns (\\n address _sender\\n )\\n {\\n bytes32 messageHash = getMessageHash(_message, _isEthSignedMessage);\\n\\n return ecrecover(\\n messageHash,\\n _v + 27,\\n _r,\\n _s\\n );\\n }\\n\\n function getMessageHash(\\n bytes memory _message,\\n bool _isEthSignedMessage\\n )\\n internal\\n pure\\n returns (bytes32) {\\n if (_isEthSignedMessage) {\\n return getEthSignedMessageHash(_message);\\n }\\n return getNativeMessageHash(_message);\\n }\\n\\n\\n /*************************************\\n * Private Functions: ECDSA Recovery *\\n *************************************/\\n\\n /**\\n * Gets the native message hash (simple keccak256) for a message.\\n * @param _message Message to hash.\\n * @return _messageHash Native message hash.\\n */\\n function getNativeMessageHash(\\n bytes memory _message\\n )\\n private\\n pure\\n returns (\\n bytes32 _messageHash\\n )\\n {\\n return keccak256(_message);\\n }\\n\\n /**\\n * Gets the hash of a message with the `Ethereum Signed Message` prefix.\\n * @param _message Message to hash.\\n * @return _messageHash Prefixed message hash.\\n */\\n function getEthSignedMessageHash(\\n bytes memory _message\\n )\\n private\\n pure\\n returns (\\n bytes32 _messageHash\\n )\\n {\\n bytes memory prefix = \\\"\\\\x19Ethereum Signed Message:\\\\n32\\\";\\n bytes32 messageHash = keccak256(_message);\\n return keccak256(abi.encodePacked(prefix, messageHash));\\n }\\n}\",\"keccak256\":\"0xda865d8cc014940a4755e329db9c6272a31bd9a340000a4ecc005d46299a585c\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_ErrorUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/**\\n * @title Lib_ErrorUtils\\n */\\nlibrary Lib_ErrorUtils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Encodes an error string into raw solidity-style revert data.\\n * (i.e. ascii bytes, prefixed with bytes4(keccak(\\\"Error(string))\\\"))\\n * Ref: https://docs.soliditylang.org/en/v0.8.2/control-structures.html?highlight=Error(string)#panic-via-assert-and-error-via-require\\n * @param _reason Reason for the reversion.\\n * @return Standard solidity revert data for the given reason.\\n */\\n function encodeRevertString(\\n string memory _reason\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return abi.encodeWithSignature(\\n \\\"Error(string)\\\",\\n _reason\\n );\\n }\\n}\\n\",\"keccak256\":\"0xfc64ec4a81fb50865b502a0004ed154e8598e1a313db77303fc95e41f536e6b7\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_EthUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// @unsupported: ovm\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"./Lib_Bytes32Utils.sol\\\";\\n\\n/**\\n * @title Lib_EthUtils\\n */\\nlibrary Lib_EthUtils {\\n\\n /***********************************\\n * Internal Functions: Code Access *\\n ***********************************/\\n\\n /**\\n * Gets the code for a given address.\\n * @param _address Address to get code for.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return _code Code read from the contract.\\n */\\n function getCode(\\n address _address,\\n uint256 _offset,\\n uint256 _length\\n )\\n internal\\n view\\n returns (\\n bytes memory _code\\n )\\n {\\n assembly {\\n _code := mload(0x40)\\n mstore(0x40, add(_code, add(_length, 0x20)))\\n mstore(_code, _length)\\n extcodecopy(_address, add(_code, 0x20), _offset, _length)\\n }\\n\\n return _code;\\n }\\n\\n /**\\n * Gets the full code for a given address.\\n * @param _address Address to get code for.\\n * @return _code Full code of the contract.\\n */\\n function getCode(\\n address _address\\n )\\n internal\\n view\\n returns (\\n bytes memory _code\\n )\\n {\\n return getCode(\\n _address,\\n 0,\\n getCodeSize(_address)\\n );\\n }\\n\\n /**\\n * Gets the size of a contract's code in bytes.\\n * @param _address Address to get code size for.\\n * @return _codeSize Size of the contract's code in bytes.\\n */\\n function getCodeSize(\\n address _address\\n )\\n internal\\n view\\n returns (\\n uint256 _codeSize\\n )\\n {\\n assembly {\\n _codeSize := extcodesize(_address)\\n }\\n\\n return _codeSize;\\n }\\n\\n /**\\n * Gets the hash of a contract's code.\\n * @param _address Address to get a code hash for.\\n * @return _codeHash Hash of the contract's code.\\n */\\n function getCodeHash(\\n address _address\\n )\\n internal\\n view\\n returns (\\n bytes32 _codeHash\\n )\\n {\\n assembly {\\n _codeHash := extcodehash(_address)\\n }\\n\\n return _codeHash;\\n }\\n\\n\\n /*****************************************\\n * Internal Functions: Contract Creation *\\n *****************************************/\\n\\n /**\\n * Creates a contract with some given initialization code.\\n * @param _code Contract initialization code.\\n * @return _created Address of the created contract.\\n */\\n function createContract(\\n bytes memory _code\\n )\\n internal\\n returns (\\n address _created\\n )\\n {\\n assembly {\\n _created := create(\\n 0,\\n add(_code, 0x20),\\n mload(_code)\\n )\\n }\\n\\n return _created;\\n }\\n\\n /**\\n * Computes the address that would be generated by CREATE.\\n * @param _creator Address creating the contract.\\n * @param _nonce Creator's nonce.\\n * @return _address Address to be generated by CREATE.\\n */\\n function getAddressForCREATE(\\n address _creator,\\n uint256 _nonce\\n )\\n internal\\n pure\\n returns (\\n address _address\\n )\\n {\\n bytes[] memory encoded = new bytes[](2);\\n encoded[0] = Lib_RLPWriter.writeAddress(_creator);\\n encoded[1] = Lib_RLPWriter.writeUint(_nonce);\\n\\n bytes memory encodedList = Lib_RLPWriter.writeList(encoded);\\n return Lib_Bytes32Utils.toAddress(keccak256(encodedList));\\n }\\n\\n /**\\n * Computes the address that would be generated by CREATE2.\\n * @param _creator Address creating the contract.\\n * @param _bytecode Bytecode of the contract to be created.\\n * @param _salt 32 byte salt value mixed into the hash.\\n * @return _address Address to be generated by CREATE2.\\n */\\n function getAddressForCREATE2(\\n address _creator,\\n bytes memory _bytecode,\\n bytes32 _salt\\n )\\n internal\\n pure\\n returns (address _address)\\n {\\n bytes32 hashedData = keccak256(abi.encodePacked(\\n byte(0xff),\\n _creator,\\n _salt,\\n keccak256(_bytecode)\\n ));\\n\\n return Lib_Bytes32Utils.toAddress(hashedData);\\n }\\n}\\n\",\"keccak256\":\"0x5fdf009da11f90cb5e99e5cd160d07bb744a5a2055774a646bdf277ad6910595\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_ErrorUtils } from \\\"../utils/Lib_ErrorUtils.sol\\\";\\n\\n/**\\n * @title Lib_SafeExecutionManagerWrapper\\n * @dev The Safe Execution Manager Wrapper provides functions which facilitate writing OVM safe \\n * code using the standard solidity compiler, by routing all its operations through the Execution \\n * Manager.\\n * \\n * Compiler used: solc\\n * Runtime target: OVM\\n */\\nlibrary Lib_SafeExecutionManagerWrapper {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Performs a safe ovmCALL.\\n * @param _gasLimit Gas limit for the call.\\n * @param _target Address to call.\\n * @param _calldata Data to send to the call.\\n * @return _success Whether or not the call reverted.\\n * @return _returndata Data returned by the call.\\n */\\n function safeCALL(\\n uint256 _gasLimit,\\n address _target,\\n bytes memory _calldata\\n )\\n internal\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCALL(uint256,address,bytes)\\\",\\n _gasLimit,\\n _target,\\n _calldata\\n )\\n );\\n\\n return abi.decode(returndata, (bool, bytes));\\n }\\n\\n /**\\n * Performs a safe ovmDELEGATECALL.\\n * @param _gasLimit Gas limit for the call.\\n * @param _target Address to call.\\n * @param _calldata Data to send to the call.\\n * @return _success Whether or not the call reverted.\\n * @return _returndata Data returned by the call.\\n */\\n function safeDELEGATECALL(\\n uint256 _gasLimit,\\n address _target,\\n bytes memory _calldata\\n )\\n internal\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmDELEGATECALL(uint256,address,bytes)\\\",\\n _gasLimit,\\n _target,\\n _calldata\\n )\\n );\\n\\n return abi.decode(returndata, (bool, bytes));\\n }\\n\\n /**\\n * Performs a safe ovmCREATE call.\\n * @param _gasLimit Gas limit for the creation.\\n * @param _bytecode Code for the new contract.\\n * @return _contract Address of the created contract.\\n */\\n function safeCREATE(\\n uint256 _gasLimit,\\n bytes memory _bytecode\\n )\\n internal\\n returns (\\n address,\\n bytes memory\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n _gasLimit,\\n abi.encodeWithSignature(\\n \\\"ovmCREATE(bytes)\\\",\\n _bytecode\\n )\\n );\\n\\n return abi.decode(returndata, (address, bytes));\\n }\\n\\n /**\\n * Performs a safe ovmEXTCODESIZE call.\\n * @param _contract Address of the contract to query the size of.\\n * @return _EXTCODESIZE Size of the requested contract in bytes.\\n */\\n function safeEXTCODESIZE(\\n address _contract\\n )\\n internal\\n returns (\\n uint256 _EXTCODESIZE\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmEXTCODESIZE(address)\\\",\\n _contract\\n )\\n );\\n\\n return abi.decode(returndata, (uint256));\\n }\\n\\n /**\\n * Performs a safe ovmCHAINID call.\\n * @return _CHAINID Result of calling ovmCHAINID.\\n */\\n function safeCHAINID()\\n internal\\n returns (\\n uint256 _CHAINID\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCHAINID()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (uint256));\\n }\\n\\n /**\\n * Performs a safe ovmCALLER call.\\n * @return _CALLER Result of calling ovmCALLER.\\n */\\n function safeCALLER()\\n internal\\n returns (\\n address _CALLER\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCALLER()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (address));\\n }\\n\\n /**\\n * Performs a safe ovmADDRESS call.\\n * @return _ADDRESS Result of calling ovmADDRESS.\\n */\\n function safeADDRESS()\\n internal\\n returns (\\n address _ADDRESS\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmADDRESS()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (address));\\n }\\n\\n /**\\n * Performs a safe ovmGETNONCE call.\\n * @return _nonce Result of calling ovmGETNONCE.\\n */\\n function safeGETNONCE()\\n internal\\n returns (\\n uint256 _nonce\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmGETNONCE()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (uint256));\\n }\\n\\n /**\\n * Performs a safe ovmINCREMENTNONCE call.\\n */\\n function safeINCREMENTNONCE()\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmINCREMENTNONCE()\\\"\\n )\\n );\\n }\\n\\n /**\\n * Performs a safe ovmCREATEEOA call.\\n * @param _messageHash Message hash which was signed by EOA\\n * @param _v v value of signature (0 or 1)\\n * @param _r r value of signature\\n * @param _s s value of signature\\n */\\n function safeCREATEEOA(\\n bytes32 _messageHash,\\n uint8 _v,\\n bytes32 _r,\\n bytes32 _s\\n )\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCREATEEOA(bytes32,uint8,bytes32,bytes32)\\\",\\n _messageHash,\\n _v,\\n _r,\\n _s\\n )\\n );\\n }\\n\\n /**\\n * Performs a safe REVERT.\\n * @param _reason String revert reason to pass along with the REVERT.\\n */\\n function safeREVERT(\\n string memory _reason\\n )\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmREVERT(bytes)\\\",\\n Lib_ErrorUtils.encodeRevertString(\\n _reason\\n )\\n )\\n );\\n }\\n\\n /**\\n * Performs a safe \\\"require\\\".\\n * @param _condition Boolean condition that must be true or will revert.\\n * @param _reason String revert reason to pass along with the REVERT.\\n */\\n function safeREQUIRE(\\n bool _condition,\\n string memory _reason\\n )\\n internal\\n {\\n if (!_condition) {\\n safeREVERT(\\n _reason\\n );\\n }\\n }\\n\\n /**\\n * Performs a safe ovmSLOAD call.\\n */\\n function safeSLOAD(\\n bytes32 _key\\n )\\n internal\\n returns (\\n bytes32\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmSLOAD(bytes32)\\\",\\n _key\\n )\\n );\\n\\n return abi.decode(returndata, (bytes32));\\n }\\n\\n /**\\n * Performs a safe ovmSSTORE call.\\n */\\n function safeSSTORE(\\n bytes32 _key,\\n bytes32 _value\\n )\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmSSTORE(bytes32,bytes32)\\\",\\n _key,\\n _value\\n )\\n );\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Performs an ovm interaction and the necessary safety checks.\\n * @param _gasLimit Gas limit for the interaction.\\n * @param _calldata Data to send to the OVM_ExecutionManager (encoded with sighash).\\n * @return _returndata Data sent back by the OVM_ExecutionManager.\\n */\\n function _safeExecutionManagerInteraction(\\n uint256 _gasLimit,\\n bytes memory _calldata\\n )\\n private\\n returns (\\n bytes memory _returndata\\n )\\n {\\n address ovmExecutionManager = msg.sender;\\n (\\n bool success,\\n bytes memory returndata\\n ) = ovmExecutionManager.call{gas: _gasLimit}(_calldata);\\n\\n if (success == false) {\\n assembly {\\n revert(add(returndata, 0x20), mload(returndata))\\n }\\n } else if (returndata.length == 1) {\\n assembly {\\n return(0, 1)\\n }\\n } else {\\n return returndata;\\n }\\n }\\n\\n function _safeExecutionManagerInteraction(\\n bytes memory _calldata\\n )\\n private\\n returns (\\n bytes memory _returndata\\n )\\n {\\n return _safeExecutionManagerInteraction(\\n gasleft(),\\n _calldata\\n );\\n }\\n}\\n\",\"keccak256\":\"0x41e146e7912af794a17cd43c5a276674be956bfa8f3ca5b451bcb82d81e6f492\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/wrappers/Lib_SafeMathWrapper.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// Pulled from @openzeppelin/contracts/math/SafeMath.sol\\n// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_SafeExecutionManagerWrapper } from \\\"./Lib_SafeExecutionManagerWrapper.sol\\\";\\n\\n/**\\n * @title Lib_SafeMathWrapper\\n */\\n\\n/**\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\n * checks.\\n *\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\n * in bugs, because programmers usually assume that an overflow raises an\\n * error, which is the standard behavior in high level programming languages.\\n * `SafeMath` restores this intuition by reverting the transaction when an\\n * operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n */\\n\\nlibrary Lib_SafeMathWrapper {\\n /**\\n * @dev Returns the addition of two unsigned integers, reverting on\\n * overflow.\\n *\\n * Counterpart to Solidity's `+` operator.\\n *\\n * Requirements:\\n *\\n * - Addition cannot overflow.\\n */\\n function add(uint256 a, uint256 b) internal returns (uint256) {\\n uint256 c = a + b;\\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(c >= a, \\\"Lib_SafeMathWrapper: addition overflow\\\");\\n\\n return c;\\n }\\n\\n /**\\n * @dev Returns the subtraction of two unsigned integers, reverting on\\n * overflow (when the result is negative).\\n *\\n * Counterpart to Solidity's `-` operator.\\n *\\n * Requirements:\\n *\\n * - Subtraction cannot overflow.\\n */\\n function sub(uint256 a, uint256 b) internal returns (uint256) {\\n return sub(a, b, \\\"Lib_SafeMathWrapper: subtraction overflow\\\");\\n }\\n\\n /**\\n * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\n * overflow (when the result is negative).\\n *\\n * Counterpart to Solidity's `-` operator.\\n *\\n * Requirements:\\n *\\n * - Subtraction cannot overflow.\\n */\\n function sub(uint256 a, uint256 b, string memory errorMessage) internal returns (uint256) {\\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(b <= a, errorMessage);\\n uint256 c = a - b;\\n\\n return c;\\n }\\n\\n /**\\n * @dev Returns the multiplication of two unsigned integers, reverting on\\n * overflow.\\n *\\n * Counterpart to Solidity's `*` operator.\\n *\\n * Requirements:\\n *\\n * - Multiplication cannot overflow.\\n */\\n function mul(uint256 a, uint256 b) internal returns (uint256) {\\n // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\n // benefit is lost if 'b' is also tested.\\n // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\n if (a == 0) {\\n return 0;\\n }\\n\\n uint256 c = a * b;\\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(c / a == b, \\\"Lib_SafeMathWrapper: multiplication overflow\\\");\\n\\n return c;\\n }\\n\\n /**\\n * @dev Returns the integer division of two unsigned integers. Reverts on\\n * division by zero. The result is rounded towards zero.\\n *\\n * Counterpart to Solidity's `/` operator. Note: this function uses a\\n * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n * uses an invalid opcode to revert (consuming all remaining gas).\\n *\\n * Requirements:\\n *\\n * - The divisor cannot be zero.\\n */\\n function div(uint256 a, uint256 b) internal returns (uint256) {\\n return div(a, b, \\\"Lib_SafeMathWrapper: division by zero\\\");\\n }\\n\\n /**\\n * @dev Returns the integer division of two unsigned integers. Reverts with custom message on\\n * division by zero. The result is rounded towards zero.\\n *\\n * Counterpart to Solidity's `/` operator. Note: this function uses a\\n * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n * uses an invalid opcode to revert (consuming all remaining gas).\\n *\\n * Requirements:\\n *\\n * - The divisor cannot be zero.\\n */\\n function div(uint256 a, uint256 b, string memory errorMessage) internal returns (uint256) {\\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(b > 0, errorMessage);\\n uint256 c = a / b;\\n // assert(a == b * c + a % b); // There is no case in which this doesn't hold\\n\\n return c;\\n }\\n\\n /**\\n * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n * Reverts when dividing by zero.\\n *\\n * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n * opcode (which leaves remaining gas untouched) while Solidity uses an\\n * invalid opcode to revert (consuming all remaining gas).\\n *\\n * Requirements:\\n *\\n * - The divisor cannot be zero.\\n */\\n function mod(uint256 a, uint256 b) internal returns (uint256) {\\n return mod(a, b, \\\"Lib_SafeMathWrapper: modulo by zero\\\");\\n }\\n\\n /**\\n * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n * Reverts with custom message when dividing by zero.\\n *\\n * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n * opcode (which leaves remaining gas untouched) while Solidity uses an\\n * invalid opcode to revert (consuming all remaining gas).\\n *\\n * Requirements:\\n *\\n * - The divisor cannot be zero.\\n */\\n function mod(uint256 a, uint256 b, string memory errorMessage) internal returns (uint256) {\\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(b != 0, errorMessage);\\n return a % b;\\n }\\n}\",\"keccak256\":\"0xc58aa064894677f65fc8205f79252d15e59a0f5e2794e5c2d069c7b2bc97a9e2\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x60806040523480156200001157600080fd5b5060405162003b6e38038062003b6e833981016040819052620000349162000253565b600080546001600160a01b0319166001600160a01b03851617905560408051808201909152601181527027ab26afa9b0b332ba3ca1b432b1b5b2b960791b60208201526200008290620000d7565b600180546001600160a01b0319166001600160a01b039290921691909117905581516003556020820151600455604082015160055560608201516006558051600755620000ce620001b9565b505050620002f8565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b83811015620001395781810151838201526020016200011f565b50505050905090810190601f168015620001675780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b1580156200018557600080fd5b505afa1580156200019a573d6000803e3d6000fd5b505050506040513d6020811015620001b157600080fd5b505192915050565b600d80546001600160a01b031990811690915560006009819055600a819055600b819055600c8190556008805460ff191690556010819055600e805483169055600f80546001600160a81b0319169055601155600280549091169055565b60006020828403121562000229578081fd5b604051602081016001600160401b03811182821017156200024657fe5b6040529151825250919050565b600080600083850360c081121562000269578384fd5b84516001600160a01b038116811462000280578485fd5b93506080601f198201121562000294578283fd5b50604051608081016001600160401b0381118282101715620002b257fe5b80604052506020850151815260408501516020820152606085015160408201526080850151606082015280925050620002ef8560a0860162000217565b90509250925092565b61386680620003086000396000f3fe60806040523480156200001157600080fd5b5060043610620001d25760003560e01c8063746c32f11162000111578063996d79a511620000a55780639dc9dc93116200007b5780639dc9dc9314620003da578063bdbf8c3614620003e4578063c1fb2ea214620003ee578063ffe7391414620003f857620001d2565b8063996d79a514620003a257806399ccd98b14620003ac5780639be3ad6714620003c357620001d2565b80638540661f11620000e75780638540661f146200034357806385979f76146200036a5780638bb42e15146200038157806390580256146200039857620001d2565b8063746c32f114620002fc5780637cebbe9414620003225780638435035b146200032c57620001d2565b806324749d5c1162000189578063461a4478116200015f578063461a447814620002ba5780635a98c36114620002d15780637350906414620002db578063741a33eb14620002e557620001d2565b806324749d5c1462000273578063299ca478146200028a5780632a2a7adb14620002a357620001d2565b806303daa95914620001d7578063101185a4146200020657806314aa2ff7146200021f5780631c4712a7146200024657806320160f3a146200025057806322bd64c0146200025a575b600080fd5b620001ee620001e836600462002784565b6200040f565b604051620001fd919062002b8e565b60405180910390f35b6200021062000459565b604051620001fd919062002c7f565b62000236620002303660046200281b565b62000462565b604051620001fd92919062002c09565b620001ee62000509565b620001ee6200050f565b620002716200026b366004620027b6565b62000515565b005b620001ee62000284366004620026ed565b62000580565b620002946200059f565b604051620001fd919062002b97565b62000271620002b43660046200281b565b620005ae565b62000294620002cb36600462002946565b620005be565b620001ee620006a0565b62000294620006a6565b62000271620002f6366004620027d8565b620006b5565b620003136200030d3660046200272b565b62000840565b604051620001fd919062002c6a565b6200027162000879565b620001ee6200033d366004620026ed565b620008da565b6200035a6200035436600462002a4e565b620008f1565b604051620001fd92919062002c2f565b6200035a6200037b36600462002a4e565b6200096e565b6200035a62000392366004620029e5565b620009bf565b620001ee62000a9f565b6200029462000aa5565b62000236620003bd36600462002859565b62000ab4565b62000271620003d436600462002990565b62000b54565b6200029462000c9a565b620001ee62000ca9565b620001ee62000caf565b6200035a6200040936600462002a4e565b62000cca565b6000619c4060005a905060006200042562000aa5565b905062000433818662000d1d565b93505060005a82039050808310156200045157601080548483030190555b505050919050565b60085460ff1690565b600f5460009060609060ff600160a01b909104161515600114156200048d576200048d600662000dbc565b619c4060005a90506000620004a162000aa5565b9050620004ae8162000dd7565b6000620004c682620004c08462000e66565b62000ef9565b9050620004d4818862000f95565b95509550505060005a8203905080831015620004f857601080548401905562000501565b60108054820190555b505050915091565b60045490565b600b5490565b600f5460ff600160a01b909104161515600114156200053a576200053a600662000dbc565b61ea6060005a905060006200054e62000aa5565b90506200055d81868662001026565b5060005a82039050808310156200057957601080548483030190555b5050505050565b6000620005976200059183620010b7565b6200114a565b90505b919050565b6000546001600160a01b031681565b620005bb6001826200114e565b50565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b838110156200062057818101518382015260200162000606565b50505050905090810190601f1680156200064e5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b1580156200066c57600080fd5b505afa15801562000681573d6000803e3d6000fd5b505050506040513d60208110156200069857600080fd5b505192915050565b600a5490565b600e546001600160a01b031690565b600f5460ff600160a01b90910416151560011415620006da57620006da600662000dbc565b600060018585601b0185856040516000815260200160405260405162000704949392919062002c4c565b6020604051602081039080840390855afa15801562000727573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166200076757620007676040518060600160405280603881526020016200374860389139620005ae565b620007728162001166565b6200077e57506200083a565b6200078981620011f9565b600f80546001600160a01b038381166001600160a01b03198316179092556040519116906000906003602160991b0190620007c490620025b8565b620007d0919062002b97565b604051809103906000f080158015620007ed573d6000803e3d6000fd5b50600f80546001600160a01b0319166001600160a01b03851617905590506200082983826200081c8162001266565b8051906020012062001280565b62000836836000620012c1565b5050505b50505050565b606060008260011462000854578262000857565b60025b9050620008706200086886620010b7565b858362001338565b95945050505050565b600f5460ff600160a01b909104161515600114156200089e576200089e600662000dbc565b6000620008aa62000aa5565b90506000620008b98262000e66565b905080816001011115620008d657620008d68282600101620012c1565b5050565b600062000597620008eb83620010b7565b6200135a565b600060606201388060005a60408051606081018252600f546001600160a01b0390811682528916602082015260019181019190915290915062000937818989896200135e565b945094505060005a82039050808310156200095a57601080548401905562000963565b60108054820190555b505050935093915050565b60006060620186a060005a60408051606081018252600f5460ff600160a01b8204161515928201929092526001600160a01b039182168152908816602082015290915062000937818989896200135e565b600060603315620009cf57600080fd5b600280546001600160a01b0319166001600160a01b038516179055620009f585620013f7565b600019601155600f80546001600160a01b0319166001600160a01b038681169190911790915560808601511615801562000a785760008062000a3b8860c0015162000462565b90925090506001600160a01b03821662000a5e5760009450925062000a97915050565b600162000a6b8362001266565b9450945050505062000a97565b62000a918660a0015187608001518860c001516200096e565b92509250505b935093915050565b60075490565b600f546001600160a01b031690565b600f5460009060609060ff600160a01b9091041615156001141562000adf5762000adf600662000dbc565b619c4060005a9050600062000af362000aa5565b905062000b008162000dd7565b600062000b0f8289896200146c565b905062000b1d818962000f95565b95509550505060005a820390508083101562000b4157601080548401905562000b4a565b60108054820190555b5050509250929050565b600a541562000b805760405162461bcd60e51b815260040162000b779062002d70565b60405180910390fd5b600280546001600160a01b0319166001600160a01b038381169190911791829055604051630d15d41560e41b815291169063d15d41509062000bc790339060040162002b97565b60206040518083038186803b15801562000be057600080fd5b505afa15801562000bf5573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000c1b919062002762565b62000c3a5760405162461bcd60e51b815260040162000b779062002d04565b62000c4582620013f7565b62000c598260a001518360400151620014b6565b62000c6e5762000c68620014ea565b620008d6565b62000c8e6003600001548360a001510383608001518460c001516200096e565b5050620008d6620014ea565b600d546001600160a01b031690565b60095490565b600062000cc562000cbf62000aa5565b62000e66565b905090565b60006060619c4060005a60408051606081018252600e546001600160a01b039081168252600f549081166020830152600160a01b900460ff1615159181019190915290915062000937818989896200135e565b600062000d2b838362001548565b600254604051631aaf392f60e01b81526001600160a01b0390911690631aaf392f9062000d5f908690869060040162002bcf565b60206040518083038186803b15801562000d7857600080fd5b505afa15801562000d8d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000db391906200279d565b90505b92915050565b620005bb81604051806020016040528060008152506200114e565b60008062000e2a5a6002602160991b018560405160240162000dfa919062002b97565b60408051601f198184030181529190526020810180516001600160e01b031663b1540a0160e01b1790526200096e565b9150915060008180602001905181019062000e46919062002762565b905080158062000e54575082155b156200083a576200083a600762000dbc565b600062000e738262001698565b60025460405163d126199f60e01b81526001600160a01b039091169063d126199f9062000ea590859060040162002b97565b60206040518083038186803b15801562000ebe57600080fd5b505afa15801562000ed3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200059791906200279d565b60408051600280825260608201909252600091829190816020015b606081526020019060019003908162000f1457905050905062000f3784620017f7565b8160008151811062000f4557fe5b602002602001018190525062000f5b8362001825565b8160018151811062000f6957fe5b6020026020010181905250600062000f81826200183c565b905062000870818051906020012062001886565b6000606062000fbe62000fa762000aa5565b62000fb562000cbf62000aa5565b600101620012c1565b60408051606081018252600f5460ff600160a01b8204161515928201929092526001600160a01b039182168152908516602082015260008062001006835a8989600162001889565b9150915081620010185760006200101a565b865b97909650945050505050565b8062001033848462000d1d565b14156200104057620010b2565b6200104c838362001a79565b600254604051635c17d62960e01b81526001600160a01b0390911690635c17d62990620010829086908690869060040162002be8565b600060405180830381600087803b1580156200109d57600080fd5b505af115801562000836573d6000803e3d6000fd5b505050565b6000620010c48262001698565b600254604051637c8ee70360e01b81526001600160a01b0390911690637c8ee70390620010f690859060040162002b97565b60206040518083038186803b1580156200110f57600080fd5b505afa15801562001124573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200059791906200270c565b3f90565b60006200115c838362001b9a565b9050805160208201fd5b6000620011738262001698565b6002546040516307a1294560e01b81526001600160a01b03909116906307a1294590620011a590859060040162002b97565b60206040518083038186803b158015620011be57600080fd5b505afa158015620011d3573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000597919062002762565b620012048162001698565b600254604051637e78a4d160e11b81526001600160a01b039091169063fcf149a2906200123690849060040162002b97565b600060405180830381600087803b1580156200125157600080fd5b505af115801562000579573d6000803e3d6000fd5b6060620005978260006200127a856200135a565b62001338565b6200128b8362001c4d565b6002546040516368510af960e11b81526001600160a01b039091169063d0a215f290620010829086908690869060040162002bab565b620012cc8262001c4d565b6002546040516374855dc360e11b81526001600160a01b039091169063e90abb869062001300908590859060040162002bcf565b600060405180830381600087803b1580156200131b57600080fd5b505af115801562001330573d6000803e3d6000fd5b505050505050565b60606040519050602082018101604052818152818360208301863c9392505050565b3b90565b6000606073ffffffffffffffffffffffffffffffffffff0000841673deaddeaddeaddeaddeaddeaddeaddeaddead00001415620013af575050604080516020810190915260008152600190620013ee565b60006064856001600160a01b031610620013d457620013ce85620010b7565b620013d6565b845b9050620013e887878387600062001889565b92509250505b94509492505050565b80516009556020810151600a5560a0810151600c5560408101516008805460ff1916600183818111156200142757fe5b02179055506060810151600d80546001600160a01b0319166001600160a01b03909216919091179055600554600b5560a0810151620014669062001d6b565b60115550565b60008060ff60f81b8584868051906020012060405160200162001493949392919062002b04565b604051602081830303815290604052805190602001209050620008708162001886565b600454600090831115620014cd5750600062000db6565b600354831015620014e15750600062000db6565b50600192915050565b600d80546001600160a01b031990811690915560006009819055600a819055600b819055600c8190556008805460ff191690556010819055600e805483169055600f80546001600160a81b0319169055601155600280549091169055565b6175305a10156200155f576200155f600062000dbc565b600254604051630ad2267960e01b81526001600160a01b0390911690630ad226799062001593908590859060040162002bcf565b60206040518083038186803b158015620015ac57600080fd5b505afa158015620015c1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620015e7919062002762565b620015f857620015f8600362000dbc565b600254604051632bcdee1960e21b81526000916001600160a01b03169063af37b864906200162d908690869060040162002bcf565b602060405180830381600087803b1580156200164857600080fd5b505af11580156200165d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001683919062002762565b905080620010b257620010b2614e2062001d80565b6175305a1015620016af57620016af600062000dbc565b60025460405163c8e40fbf60e01b81526001600160a01b039091169063c8e40fbf90620016e190849060040162002b97565b60206040518083038186803b158015620016fa57600080fd5b505afa1580156200170f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001735919062002762565b620017465762001746600362000dbc565b600254604051633ecdecc760e21b81526000916001600160a01b03169063fb37b31c906200177990859060040162002b97565b602060405180830381600087803b1580156200179457600080fd5b505af1158015620017a9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620017cf919062002762565b905080620008d657620008d66175306064620017ef620008eb86620010b7565b020162001d80565b6060620005978260405160200162001810919062002ae7565b60405160208183030381529060405262001da3565b606062000597620018368362001dfd565b62001da3565b606060006200184b8362001f0e565b90506200185b815160c06200201b565b816040516020016200186f92919062002b5b565b604051602081830303815290604052915050919050565b90565b6040805160608082018352600e546001600160a01b039081168352600f549081166020840152600160a01b900460ff1615159282019290925260009190620018d2818962002178565b6011546000620018e28962001d6b565b60118190559050600080876200195957896001600160a01b03168b8a6040516200190d919062002b3d565b60006040518083038160008787f1925050503d80600081146200194d576040519150601f19603f3d011682016040523d82523d6000602084013e62001952565b606091505b5062001966565b620019668b8a8c6200222f565b91509150620019768c8662002178565b6011548262001a61576000806000806200199086620024c5565b929650909450925090506003846007811115620019a957fe5b1415620019bb57620019bb8462000dbc565b6001846007811115620019ca57fe5b1480620019e357506004846007811115620019e157fe5b145b80620019fb57506006846007811115620019f957fe5b145b8062001a135750600784600781111562001a1157fe5b145b1562001a1f5760108290555b600184600781111562001a2e57fe5b148062001a3857508c5b1562001a475780955062001a5a565b6040518060200160405280600081525095505b5090925050505b90920390920360115590999098509650505050505050565b62001a85828262001548565b60025460405163af3dc01160e01b81526000916001600160a01b03169063af3dc0119062001aba908690869060040162002bcf565b602060405180830381600087803b15801562001ad557600080fd5b505af115801562001aea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001b10919062002762565b905080620010b25762001b238362001c4d565b600260009054906101000a90046001600160a01b03166001600160a01b031663c3fd9b256040518163ffffffff1660e01b8152600401600060405180830381600087803b15801562001b7457600080fd5b505af115801562001b89573d6000803e3d6000fd5b50505050620010b2614e2062001d80565b6060600083600781111562001bab57fe5b141562001bc8575060408051602081019091526000815262000db6565b600383600781111562001bd757fe5b141562001c195760408051602080820183526000808352925162001c02938793909283920162002c94565b604051602081830303815290604052905062000db6565b60115460105460405162001c369286929091869060200162002cd4565b604051602081830303815290604052905092915050565b62001c588162001698565b60025460405163011b1f7960e41b81526000916001600160a01b0316906311b1f7909062001c8b90859060040162002b97565b602060405180830381600087803b15801562001ca657600080fd5b505af115801562001cbb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001ce1919062002762565b905080620008d657600260009054906101000a90046001600160a01b03166001600160a01b03166333f943056040518163ffffffff1660e01b8152600401600060405180830381600087803b15801562001d3a57600080fd5b505af115801562001d4f573d6000803e3d6000fd5b50505050620008d66175306064620017ef620008eb86620010b7565b60005a821062001d7c575a62000597565b5090565b60115481111562001d975762001d97600262000dbc565b60118054919091039055565b6060808251600114801562001dcd575060808360008151811062001dc357fe5b016020015160f81c105b1562001ddb57508162000597565b62001de9835160806200201b565b8360405160200162001c3692919062002b5b565b606060008260405160200162001e14919062002b8e565b604051602081830303815290604052905060005b602081101562001e635781818151811062001e3f57fe5b01602001516001600160f81b0319161562001e5a5762001e63565b60010162001e28565b6000816020036001600160401b038111801562001e7f57600080fd5b506040519080825280601f01601f19166020018201604052801562001eab576020820181803683370190505b50905060005b815181101562001f0557835160018401938591811062001ecd57fe5b602001015160f81c60f81b82828151811062001ee557fe5b60200101906001600160f81b031916908160001a90535060010162001eb1565b50949350505050565b606081516000141562001f3157506040805160008152602081019091526200059a565b6000805b835181101562001f675783818151811062001f4c57fe5b60200260200101515182019150808060010191505062001f35565b6000826001600160401b038111801562001f8057600080fd5b506040519080825280601f01601f19166020018201604052801562001fac576020820181803683370190505b50600092509050602081015b855183101562001f0557600086848151811062001fd157fe5b60200260200101519050600060208201905062001ff1838284516200251c565b87858151811062001ffe57fe5b602002602001015151830192505050828060010193505062001fb8565b606080603884101562002078576040805160018082528183019092529060208201818036833701905050905082840160f81b816000815181106200205b57fe5b60200101906001600160f81b031916908160001a90535062000db3565b600060015b8086816200208757fe5b04156200209e57600190910190610100026200207d565b816001016001600160401b0381118015620020b857600080fd5b506040519080825280601f01601f191660200182016040528015620020e4576020820181803683370190505b50925084820160370160f81b83600081518110620020fe57fe5b60200101906001600160f81b031916908160001a905350600190505b8181116200216f576101008183036101000a87816200213557fe5b04816200213e57fe5b0660f81b8382815181106200214f57fe5b60200101906001600160f81b031916908160001a9053506001016200211a565b50509392505050565b805182516001600160a01b03908116911614620021b1578051600e80546001600160a01b0319166001600160a01b039092169190911790555b80602001516001600160a01b031682602001516001600160a01b031614620021f8576020810151600f80546001600160a01b0319166001600160a01b039092169190911790555b806040015115158260400151151514620008d65760400151600f8054911515600160a01b0260ff60a01b1990921691909117905550565b600060606200223e8362001166565b6200227f5760006200227560056200226f604051806060016040528060348152602001620037f66034913962002562565b62001b9a565b9150915062000a97565b6001546040516352275acd60e11b81526001600160a01b039091169063a44eb59a90620022b190879060040162002c6a565b60206040518083038186803b158015620022ca57600080fd5b505afa158015620022df573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062002305919062002762565b620023365760006200227560046200226f6040518060a0016040528060768152602001620037806076913962002562565b6200234183620011f9565b60006200234e85620025a7565b90506001600160a01b038116620023bf573d6000816001600160401b03811180156200237957600080fd5b506040519080825280601f01601f191660200182016040528015620023a5576020820181803683370190505b509050816000602083013e60009450925062000a97915050565b6000620023cc8262001266565b6001546040516352275acd60e11b81529192506001600160a01b03169063a44eb59a90620023ff90849060040162002c6a565b60206040518083038186803b1580156200241857600080fd5b505afa1580156200242d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062002453919062002762565b620024905760006200248460046200226f6040518060600160405280603081526020016200382a6030913962002562565b93509350505062000a97565b620024a78583620024a1856200114a565b62001280565b50506040805160208101909152600081526001969095509350505050565b60008060006060845160001415620024f6575050604080516020810190915260008082529250829150819062002515565b848060200190518101906200250c91906200289f565b93509350935093505b9193509193565b8282825b6020811062002541578151835260209283019290910190601f190162002520565b905182516020929092036101000a6000190180199091169116179052505050565b60608160405160240162002577919062002c6a565b60408051601f198184030181529190526020810180516001600160e01b031662461bcd60e51b1790529050919050565b60008151602083016000f092915050565b6109018062002e4783390190565b6000620025dd620025d78462002ddf565b62002dbb565b9050828152838383011115620025f257600080fd5b828260208301376000602084830101529392505050565b80356200059a8162002e30565b600082601f83011262002627578081fd5b62000db383833560208501620025c6565b8035600281106200059a57600080fd5b600060e082840312156200265a578081fd5b6200266660e062002dbb565b90508135815260208201356020820152620026846040830162002638565b6040820152620026976060830162002609565b6060820152620026aa6080830162002609565b608082015260a082013560a082015260c08201356001600160401b03811115620026d357600080fd5b620026e18482850162002616565b60c08301525092915050565b600060208284031215620026ff578081fd5b813562000db38162002e30565b6000602082840312156200271e578081fd5b815162000db38162002e30565b60008060006060848603121562002740578182fd5b83356200274d8162002e30565b95602085013595506040909401359392505050565b60006020828403121562002774578081fd5b8151801515811462000db3578182fd5b60006020828403121562002796578081fd5b5035919050565b600060208284031215620027af578081fd5b5051919050565b60008060408385031215620027c9578182fd5b50508035926020909101359150565b60008060008060808587031215620027ee578081fd5b84359350602085013560ff8116811462002806578182fd5b93969395505050506040820135916060013590565b6000602082840312156200282d578081fd5b81356001600160401b0381111562002843578182fd5b620028518482850162002616565b949350505050565b600080604083850312156200286c578182fd5b82356001600160401b0381111562002882578283fd5b620028908582860162002616565b95602094909401359450505050565b60008060008060808587031215620028b5578182fd5b845160088110620028c4578283fd5b80945050602085015192506040850151915060608501516001600160401b03811115620028ef578182fd5b8501601f8101871362002900578182fd5b805162002911620025d78262002ddf565b81815288602083850101111562002926578384fd5b6200293982602083016020860162002e01565b9598949750929550505050565b60006020828403121562002958578081fd5b81356001600160401b038111156200296e578182fd5b8201601f810184136200297f578182fd5b6200285184823560208401620025c6565b60008060408385031215620029a3578182fd5b82356001600160401b03811115620029b9578283fd5b620029c78582860162002648565b9250506020830135620029da8162002e30565b809150509250929050565b600080600060608486031215620029fa578081fd5b83356001600160401b0381111562002a10578182fd5b62002a1e8682870162002648565b935050602084013562002a318162002e30565b9150604084013562002a438162002e30565b809150509250925092565b60008060006060848603121562002a63578081fd5b83359250602084013562002a778162002e30565b915060408401356001600160401b0381111562002a92578182fd5b62002aa08682870162002616565b9150509250925092565b6000815180845262002ac481602086016020860162002e01565b601f01601f19169290920160200192915050565b6008811062002ae357fe5b9052565b60609190911b6bffffffffffffffffffffffff1916815260140190565b6001600160f81b031994909416845260609290921b6bffffffffffffffffffffffff191660018401526015830152603582015260550190565b6000825162002b5181846020870162002e01565b9190910192915050565b6000835162002b6f81846020880162002e01565b83519083019062002b8581836020880162002e01565b01949350505050565b90815260200190565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039390931683526020830191909152604082015260600190565b6001600160a01b0383168152604060208201819052600090620028519083018462002aaa565b600083151582526040602083015262002851604083018462002aaa565b93845260ff9290921660208401526040830152606082015260800190565b60006020825262000db3602083018462002aaa565b602081016002831062002c8e57fe5b91905290565b600062002ca2828762002ad8565b60ff8516602083015260ff841660408301526080606083015262002cca608083018462002aaa565b9695505050505050565b600062002ce2828762002ad8565b8460208301528360408301526080606083015262002cca608083018462002aaa565b60208082526046908201527f4f6e6c792061757468656e746963617465642061646472657373657320696e2060408201527f6f766d53746174654d616e616765722063616e2063616c6c20746869732066756060820152653731ba34b7b760d11b608082015260a00190565b6020808252602b908201527f4f6e6c792063616c6c61626c6520617420746865207374617274206f6620612060408201526a3a3930b739b0b1ba34b7b760a91b606082015260800190565b6040518181016001600160401b038111828210171562002dd757fe5b604052919050565b60006001600160401b0382111562002df357fe5b50601f01601f191660200190565b60005b8381101562002e1e57818101518382015260200162002e04565b838111156200083a5750506000910152565b6001600160a01b0381168114620005bb57600080fdfe608060405234801561001057600080fd5b506040516109013803806109018339818101604052602081101561003357600080fd5b505161003e81610044565b506101d9565b61008d7fdeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddead60001b61007e8361009060201b6103ca1760201c565b61009c60201b6103d61760201c565b50565b6001600160a01b031690565b604080516024810184905260448082018490528251808303909101815260649091019091526020810180516001600160e01b03908116628af59360e61b179091526100e891906100ed16565b505050565b60606100f95a836100ff565b92915050565b60606000339050600080826001600160a01b031686866040518082805190602001908083835b602083106101445780518252601f199092019160209182019101610125565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038160008787f1925050503d80600081146101a7576040519150601f19603f3d011682016040523d82523d6000602084013e6101ac565b606091505b509092509050816101bf57805160208201fd5b8051600114156101cf5760016000f35b92506100f9915050565b610719806101e86000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c80630900f010146100a1578063aaf10f42146100c9575b6000806100825a6100456100ed565b6000368080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061012592505050565b91509150811561009457805160208201f35b61009d816102c8565b5050005b6100c7600480360360208110156100b757600080fd5b50356001600160a01b031661037a565b005b6100d16100ed565b604080516001600160a01b039092168252519081900360200190f35b600061012061011b7fdeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddead610422565b610488565b905090565b6000606060006101ed86868660405160240180848152602001836001600160a01b0316815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561018657818101518382015260200161016e565b50505050905090810190601f1680156101b35780820380516001836020036101000a031916815260200191505b5060408051601f198184030181529190526020810180516001600160e01b03166001620631bb60e21b0319179052945061048b9350505050565b905080806020019051604081101561020457600080fd5b81516020830180516040519294929383019291908464010000000082111561022b57600080fd5b90830190602082018581111561024057600080fd5b825164010000000081118282018810171561025a57600080fd5b82525081516020918201929091019080838360005b8381101561028757818101518382015260200161026f565b50505050905090810190601f1680156102b45780820380516001836020036101000a031916815260200191505b506040525050509250925050935093915050565b6103766102d48261049d565b6040516024018080602001828103825283818151815260200191508051906020019080838360005b838110156103145781810151838201526020016102fc565b50505050905090810190601f1680156103415780820380516001836020036101000a031916815260200191505b5060408051601f198184030181529190526020810180516001600160e01b0316632a2a7adb60e01b179052925061048b915050565b5050565b6103be6103856104e0565b6001600160a01b0316610396610536565b6001600160a01b0316146040518060600160405280603281526020016106db6032913961056d565b6103c78161057b565b50565b6001600160a01b031690565b604080516024810184905260448082018490528251808303909101815260649091019091526020810180516001600160e01b0316628af59360e61b17905261041d9061048b565b505050565b6040805160248082018490528251808303909101815260449091019091526020810180516001600160e01b03166303daa95960e01b17905260009081906104689061048b565b905080806020019051602081101561047f57600080fd5b50519392505050565b90565b60606104975a836105ad565b92915050565b6060816040516024016104b09190610687565b60408051601f198184030181529190526020810180516001600160e01b031662461bcd60e51b1790529050919050565b6040805160048152602481019091526020810180516001600160e01b0316631cd4241960e21b17905260009081906105179061048b565b905080806020019051602081101561052e57600080fd5b505191505090565b6040805160048152602481019091526020810180516001600160e01b031663996d79a560e01b17905260009081906105179061048b565b8161037657610376816102c8565b6103c77fdeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddead6105a8836103ca565b6103d6565b60606000339050600080826001600160a01b031686866040518082805190602001908083835b602083106105f25780518252601f1990920191602091820191016105d3565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038160008787f1925050503d8060008114610655576040519150601f19603f3d011682016040523d82523d6000602084013e61065a565b606091505b5090925090508161066d57805160208201fd5b80516001141561067d5760016000f35b9250610497915050565b6000602080835283518082850152825b818110156106b357858101830151858201604001528201610697565b818111156106c45783604083870101525b50601f01601f191692909201604001939250505056fe454f41732063616e206f6e6c792075706772616465207468656972206f776e20454f4120696d706c656d656e746174696f6ea164736f6c6343000706000a5369676e61747572652070726f766964656420666f7220454f4120636f6e7472616374206372656174696f6e20697320696e76616c69642e436f6e7472616374206372656174696f6e20636f646520636f6e7461696e7320756e73616665206f70636f6465732e2044696420796f75207573652074686520726967687420636f6d70696c6572206f72207061737320616e20756e7361666520636f6e7374727563746f7220617267756d656e743f4120636f6e74726163742068617320616c7265616479206265656e206465706c6f79656420746f20746869732061646472657373436f6e7374727563746f7220617474656d7074656420746f206465706c6f7920756e736166652062797465636f64652ea164736f6c6343000706000a", - "deployedBytecode": "0x60806040523480156200001157600080fd5b5060043610620001d25760003560e01c8063746c32f11162000111578063996d79a511620000a55780639dc9dc93116200007b5780639dc9dc9314620003da578063bdbf8c3614620003e4578063c1fb2ea214620003ee578063ffe7391414620003f857620001d2565b8063996d79a514620003a257806399ccd98b14620003ac5780639be3ad6714620003c357620001d2565b80638540661f11620000e75780638540661f146200034357806385979f76146200036a5780638bb42e15146200038157806390580256146200039857620001d2565b8063746c32f114620002fc5780637cebbe9414620003225780638435035b146200032c57620001d2565b806324749d5c1162000189578063461a4478116200015f578063461a447814620002ba5780635a98c36114620002d15780637350906414620002db578063741a33eb14620002e557620001d2565b806324749d5c1462000273578063299ca478146200028a5780632a2a7adb14620002a357620001d2565b806303daa95914620001d7578063101185a4146200020657806314aa2ff7146200021f5780631c4712a7146200024657806320160f3a146200025057806322bd64c0146200025a575b600080fd5b620001ee620001e836600462002784565b6200040f565b604051620001fd919062002b8e565b60405180910390f35b6200021062000459565b604051620001fd919062002c7f565b62000236620002303660046200281b565b62000462565b604051620001fd92919062002c09565b620001ee62000509565b620001ee6200050f565b620002716200026b366004620027b6565b62000515565b005b620001ee62000284366004620026ed565b62000580565b620002946200059f565b604051620001fd919062002b97565b62000271620002b43660046200281b565b620005ae565b62000294620002cb36600462002946565b620005be565b620001ee620006a0565b62000294620006a6565b62000271620002f6366004620027d8565b620006b5565b620003136200030d3660046200272b565b62000840565b604051620001fd919062002c6a565b6200027162000879565b620001ee6200033d366004620026ed565b620008da565b6200035a6200035436600462002a4e565b620008f1565b604051620001fd92919062002c2f565b6200035a6200037b36600462002a4e565b6200096e565b6200035a62000392366004620029e5565b620009bf565b620001ee62000a9f565b6200029462000aa5565b62000236620003bd36600462002859565b62000ab4565b62000271620003d436600462002990565b62000b54565b6200029462000c9a565b620001ee62000ca9565b620001ee62000caf565b6200035a6200040936600462002a4e565b62000cca565b6000619c4060005a905060006200042562000aa5565b905062000433818662000d1d565b93505060005a82039050808310156200045157601080548483030190555b505050919050565b60085460ff1690565b600f5460009060609060ff600160a01b909104161515600114156200048d576200048d600662000dbc565b619c4060005a90506000620004a162000aa5565b9050620004ae8162000dd7565b6000620004c682620004c08462000e66565b62000ef9565b9050620004d4818862000f95565b95509550505060005a8203905080831015620004f857601080548401905562000501565b60108054820190555b505050915091565b60045490565b600b5490565b600f5460ff600160a01b909104161515600114156200053a576200053a600662000dbc565b61ea6060005a905060006200054e62000aa5565b90506200055d81868662001026565b5060005a82039050808310156200057957601080548483030190555b5050505050565b6000620005976200059183620010b7565b6200114a565b90505b919050565b6000546001600160a01b031681565b620005bb6001826200114e565b50565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b838110156200062057818101518382015260200162000606565b50505050905090810190601f1680156200064e5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b1580156200066c57600080fd5b505afa15801562000681573d6000803e3d6000fd5b505050506040513d60208110156200069857600080fd5b505192915050565b600a5490565b600e546001600160a01b031690565b600f5460ff600160a01b90910416151560011415620006da57620006da600662000dbc565b600060018585601b0185856040516000815260200160405260405162000704949392919062002c4c565b6020604051602081039080840390855afa15801562000727573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166200076757620007676040518060600160405280603881526020016200374860389139620005ae565b620007728162001166565b6200077e57506200083a565b6200078981620011f9565b600f80546001600160a01b038381166001600160a01b03198316179092556040519116906000906003602160991b0190620007c490620025b8565b620007d0919062002b97565b604051809103906000f080158015620007ed573d6000803e3d6000fd5b50600f80546001600160a01b0319166001600160a01b03851617905590506200082983826200081c8162001266565b8051906020012062001280565b62000836836000620012c1565b5050505b50505050565b606060008260011462000854578262000857565b60025b9050620008706200086886620010b7565b858362001338565b95945050505050565b600f5460ff600160a01b909104161515600114156200089e576200089e600662000dbc565b6000620008aa62000aa5565b90506000620008b98262000e66565b905080816001011115620008d657620008d68282600101620012c1565b5050565b600062000597620008eb83620010b7565b6200135a565b600060606201388060005a60408051606081018252600f546001600160a01b0390811682528916602082015260019181019190915290915062000937818989896200135e565b945094505060005a82039050808310156200095a57601080548401905562000963565b60108054820190555b505050935093915050565b60006060620186a060005a60408051606081018252600f5460ff600160a01b8204161515928201929092526001600160a01b039182168152908816602082015290915062000937818989896200135e565b600060603315620009cf57600080fd5b600280546001600160a01b0319166001600160a01b038516179055620009f585620013f7565b600019601155600f80546001600160a01b0319166001600160a01b038681169190911790915560808601511615801562000a785760008062000a3b8860c0015162000462565b90925090506001600160a01b03821662000a5e5760009450925062000a97915050565b600162000a6b8362001266565b9450945050505062000a97565b62000a918660a0015187608001518860c001516200096e565b92509250505b935093915050565b60075490565b600f546001600160a01b031690565b600f5460009060609060ff600160a01b9091041615156001141562000adf5762000adf600662000dbc565b619c4060005a9050600062000af362000aa5565b905062000b008162000dd7565b600062000b0f8289896200146c565b905062000b1d818962000f95565b95509550505060005a820390508083101562000b4157601080548401905562000b4a565b60108054820190555b5050509250929050565b600a541562000b805760405162461bcd60e51b815260040162000b779062002d70565b60405180910390fd5b600280546001600160a01b0319166001600160a01b038381169190911791829055604051630d15d41560e41b815291169063d15d41509062000bc790339060040162002b97565b60206040518083038186803b15801562000be057600080fd5b505afa15801562000bf5573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000c1b919062002762565b62000c3a5760405162461bcd60e51b815260040162000b779062002d04565b62000c4582620013f7565b62000c598260a001518360400151620014b6565b62000c6e5762000c68620014ea565b620008d6565b62000c8e6003600001548360a001510383608001518460c001516200096e565b5050620008d6620014ea565b600d546001600160a01b031690565b60095490565b600062000cc562000cbf62000aa5565b62000e66565b905090565b60006060619c4060005a60408051606081018252600e546001600160a01b039081168252600f549081166020830152600160a01b900460ff1615159181019190915290915062000937818989896200135e565b600062000d2b838362001548565b600254604051631aaf392f60e01b81526001600160a01b0390911690631aaf392f9062000d5f908690869060040162002bcf565b60206040518083038186803b15801562000d7857600080fd5b505afa15801562000d8d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000db391906200279d565b90505b92915050565b620005bb81604051806020016040528060008152506200114e565b60008062000e2a5a6002602160991b018560405160240162000dfa919062002b97565b60408051601f198184030181529190526020810180516001600160e01b031663b1540a0160e01b1790526200096e565b9150915060008180602001905181019062000e46919062002762565b905080158062000e54575082155b156200083a576200083a600762000dbc565b600062000e738262001698565b60025460405163d126199f60e01b81526001600160a01b039091169063d126199f9062000ea590859060040162002b97565b60206040518083038186803b15801562000ebe57600080fd5b505afa15801562000ed3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200059791906200279d565b60408051600280825260608201909252600091829190816020015b606081526020019060019003908162000f1457905050905062000f3784620017f7565b8160008151811062000f4557fe5b602002602001018190525062000f5b8362001825565b8160018151811062000f6957fe5b6020026020010181905250600062000f81826200183c565b905062000870818051906020012062001886565b6000606062000fbe62000fa762000aa5565b62000fb562000cbf62000aa5565b600101620012c1565b60408051606081018252600f5460ff600160a01b8204161515928201929092526001600160a01b039182168152908516602082015260008062001006835a8989600162001889565b9150915081620010185760006200101a565b865b97909650945050505050565b8062001033848462000d1d565b14156200104057620010b2565b6200104c838362001a79565b600254604051635c17d62960e01b81526001600160a01b0390911690635c17d62990620010829086908690869060040162002be8565b600060405180830381600087803b1580156200109d57600080fd5b505af115801562000836573d6000803e3d6000fd5b505050565b6000620010c48262001698565b600254604051637c8ee70360e01b81526001600160a01b0390911690637c8ee70390620010f690859060040162002b97565b60206040518083038186803b1580156200110f57600080fd5b505afa15801562001124573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200059791906200270c565b3f90565b60006200115c838362001b9a565b9050805160208201fd5b6000620011738262001698565b6002546040516307a1294560e01b81526001600160a01b03909116906307a1294590620011a590859060040162002b97565b60206040518083038186803b158015620011be57600080fd5b505afa158015620011d3573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000597919062002762565b620012048162001698565b600254604051637e78a4d160e11b81526001600160a01b039091169063fcf149a2906200123690849060040162002b97565b600060405180830381600087803b1580156200125157600080fd5b505af115801562000579573d6000803e3d6000fd5b6060620005978260006200127a856200135a565b62001338565b6200128b8362001c4d565b6002546040516368510af960e11b81526001600160a01b039091169063d0a215f290620010829086908690869060040162002bab565b620012cc8262001c4d565b6002546040516374855dc360e11b81526001600160a01b039091169063e90abb869062001300908590859060040162002bcf565b600060405180830381600087803b1580156200131b57600080fd5b505af115801562001330573d6000803e3d6000fd5b505050505050565b60606040519050602082018101604052818152818360208301863c9392505050565b3b90565b6000606073ffffffffffffffffffffffffffffffffffff0000841673deaddeaddeaddeaddeaddeaddeaddeaddead00001415620013af575050604080516020810190915260008152600190620013ee565b60006064856001600160a01b031610620013d457620013ce85620010b7565b620013d6565b845b9050620013e887878387600062001889565b92509250505b94509492505050565b80516009556020810151600a5560a0810151600c5560408101516008805460ff1916600183818111156200142757fe5b02179055506060810151600d80546001600160a01b0319166001600160a01b03909216919091179055600554600b5560a0810151620014669062001d6b565b60115550565b60008060ff60f81b8584868051906020012060405160200162001493949392919062002b04565b604051602081830303815290604052805190602001209050620008708162001886565b600454600090831115620014cd5750600062000db6565b600354831015620014e15750600062000db6565b50600192915050565b600d80546001600160a01b031990811690915560006009819055600a819055600b819055600c8190556008805460ff191690556010819055600e805483169055600f80546001600160a81b0319169055601155600280549091169055565b6175305a10156200155f576200155f600062000dbc565b600254604051630ad2267960e01b81526001600160a01b0390911690630ad226799062001593908590859060040162002bcf565b60206040518083038186803b158015620015ac57600080fd5b505afa158015620015c1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620015e7919062002762565b620015f857620015f8600362000dbc565b600254604051632bcdee1960e21b81526000916001600160a01b03169063af37b864906200162d908690869060040162002bcf565b602060405180830381600087803b1580156200164857600080fd5b505af11580156200165d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001683919062002762565b905080620010b257620010b2614e2062001d80565b6175305a1015620016af57620016af600062000dbc565b60025460405163c8e40fbf60e01b81526001600160a01b039091169063c8e40fbf90620016e190849060040162002b97565b60206040518083038186803b158015620016fa57600080fd5b505afa1580156200170f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001735919062002762565b620017465762001746600362000dbc565b600254604051633ecdecc760e21b81526000916001600160a01b03169063fb37b31c906200177990859060040162002b97565b602060405180830381600087803b1580156200179457600080fd5b505af1158015620017a9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620017cf919062002762565b905080620008d657620008d66175306064620017ef620008eb86620010b7565b020162001d80565b6060620005978260405160200162001810919062002ae7565b60405160208183030381529060405262001da3565b606062000597620018368362001dfd565b62001da3565b606060006200184b8362001f0e565b90506200185b815160c06200201b565b816040516020016200186f92919062002b5b565b604051602081830303815290604052915050919050565b90565b6040805160608082018352600e546001600160a01b039081168352600f549081166020840152600160a01b900460ff1615159282019290925260009190620018d2818962002178565b6011546000620018e28962001d6b565b60118190559050600080876200195957896001600160a01b03168b8a6040516200190d919062002b3d565b60006040518083038160008787f1925050503d80600081146200194d576040519150601f19603f3d011682016040523d82523d6000602084013e62001952565b606091505b5062001966565b620019668b8a8c6200222f565b91509150620019768c8662002178565b6011548262001a61576000806000806200199086620024c5565b929650909450925090506003846007811115620019a957fe5b1415620019bb57620019bb8462000dbc565b6001846007811115620019ca57fe5b1480620019e357506004846007811115620019e157fe5b145b80620019fb57506006846007811115620019f957fe5b145b8062001a135750600784600781111562001a1157fe5b145b1562001a1f5760108290555b600184600781111562001a2e57fe5b148062001a3857508c5b1562001a475780955062001a5a565b6040518060200160405280600081525095505b5090925050505b90920390920360115590999098509650505050505050565b62001a85828262001548565b60025460405163af3dc01160e01b81526000916001600160a01b03169063af3dc0119062001aba908690869060040162002bcf565b602060405180830381600087803b15801562001ad557600080fd5b505af115801562001aea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001b10919062002762565b905080620010b25762001b238362001c4d565b600260009054906101000a90046001600160a01b03166001600160a01b031663c3fd9b256040518163ffffffff1660e01b8152600401600060405180830381600087803b15801562001b7457600080fd5b505af115801562001b89573d6000803e3d6000fd5b50505050620010b2614e2062001d80565b6060600083600781111562001bab57fe5b141562001bc8575060408051602081019091526000815262000db6565b600383600781111562001bd757fe5b141562001c195760408051602080820183526000808352925162001c02938793909283920162002c94565b604051602081830303815290604052905062000db6565b60115460105460405162001c369286929091869060200162002cd4565b604051602081830303815290604052905092915050565b62001c588162001698565b60025460405163011b1f7960e41b81526000916001600160a01b0316906311b1f7909062001c8b90859060040162002b97565b602060405180830381600087803b15801562001ca657600080fd5b505af115801562001cbb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001ce1919062002762565b905080620008d657600260009054906101000a90046001600160a01b03166001600160a01b03166333f943056040518163ffffffff1660e01b8152600401600060405180830381600087803b15801562001d3a57600080fd5b505af115801562001d4f573d6000803e3d6000fd5b50505050620008d66175306064620017ef620008eb86620010b7565b60005a821062001d7c575a62000597565b5090565b60115481111562001d975762001d97600262000dbc565b60118054919091039055565b6060808251600114801562001dcd575060808360008151811062001dc357fe5b016020015160f81c105b1562001ddb57508162000597565b62001de9835160806200201b565b8360405160200162001c3692919062002b5b565b606060008260405160200162001e14919062002b8e565b604051602081830303815290604052905060005b602081101562001e635781818151811062001e3f57fe5b01602001516001600160f81b0319161562001e5a5762001e63565b60010162001e28565b6000816020036001600160401b038111801562001e7f57600080fd5b506040519080825280601f01601f19166020018201604052801562001eab576020820181803683370190505b50905060005b815181101562001f0557835160018401938591811062001ecd57fe5b602001015160f81c60f81b82828151811062001ee557fe5b60200101906001600160f81b031916908160001a90535060010162001eb1565b50949350505050565b606081516000141562001f3157506040805160008152602081019091526200059a565b6000805b835181101562001f675783818151811062001f4c57fe5b60200260200101515182019150808060010191505062001f35565b6000826001600160401b038111801562001f8057600080fd5b506040519080825280601f01601f19166020018201604052801562001fac576020820181803683370190505b50600092509050602081015b855183101562001f0557600086848151811062001fd157fe5b60200260200101519050600060208201905062001ff1838284516200251c565b87858151811062001ffe57fe5b602002602001015151830192505050828060010193505062001fb8565b606080603884101562002078576040805160018082528183019092529060208201818036833701905050905082840160f81b816000815181106200205b57fe5b60200101906001600160f81b031916908160001a90535062000db3565b600060015b8086816200208757fe5b04156200209e57600190910190610100026200207d565b816001016001600160401b0381118015620020b857600080fd5b506040519080825280601f01601f191660200182016040528015620020e4576020820181803683370190505b50925084820160370160f81b83600081518110620020fe57fe5b60200101906001600160f81b031916908160001a905350600190505b8181116200216f576101008183036101000a87816200213557fe5b04816200213e57fe5b0660f81b8382815181106200214f57fe5b60200101906001600160f81b031916908160001a9053506001016200211a565b50509392505050565b805182516001600160a01b03908116911614620021b1578051600e80546001600160a01b0319166001600160a01b039092169190911790555b80602001516001600160a01b031682602001516001600160a01b031614620021f8576020810151600f80546001600160a01b0319166001600160a01b039092169190911790555b806040015115158260400151151514620008d65760400151600f8054911515600160a01b0260ff60a01b1990921691909117905550565b600060606200223e8362001166565b6200227f5760006200227560056200226f604051806060016040528060348152602001620037f66034913962002562565b62001b9a565b9150915062000a97565b6001546040516352275acd60e11b81526001600160a01b039091169063a44eb59a90620022b190879060040162002c6a565b60206040518083038186803b158015620022ca57600080fd5b505afa158015620022df573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062002305919062002762565b620023365760006200227560046200226f6040518060a0016040528060768152602001620037806076913962002562565b6200234183620011f9565b60006200234e85620025a7565b90506001600160a01b038116620023bf573d6000816001600160401b03811180156200237957600080fd5b506040519080825280601f01601f191660200182016040528015620023a5576020820181803683370190505b509050816000602083013e60009450925062000a97915050565b6000620023cc8262001266565b6001546040516352275acd60e11b81529192506001600160a01b03169063a44eb59a90620023ff90849060040162002c6a565b60206040518083038186803b1580156200241857600080fd5b505afa1580156200242d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062002453919062002762565b620024905760006200248460046200226f6040518060600160405280603081526020016200382a6030913962002562565b93509350505062000a97565b620024a78583620024a1856200114a565b62001280565b50506040805160208101909152600081526001969095509350505050565b60008060006060845160001415620024f6575050604080516020810190915260008082529250829150819062002515565b848060200190518101906200250c91906200289f565b93509350935093505b9193509193565b8282825b6020811062002541578151835260209283019290910190601f190162002520565b905182516020929092036101000a6000190180199091169116179052505050565b60608160405160240162002577919062002c6a565b60408051601f198184030181529190526020810180516001600160e01b031662461bcd60e51b1790529050919050565b60008151602083016000f092915050565b6109018062002e4783390190565b6000620025dd620025d78462002ddf565b62002dbb565b9050828152838383011115620025f257600080fd5b828260208301376000602084830101529392505050565b80356200059a8162002e30565b600082601f83011262002627578081fd5b62000db383833560208501620025c6565b8035600281106200059a57600080fd5b600060e082840312156200265a578081fd5b6200266660e062002dbb565b90508135815260208201356020820152620026846040830162002638565b6040820152620026976060830162002609565b6060820152620026aa6080830162002609565b608082015260a082013560a082015260c08201356001600160401b03811115620026d357600080fd5b620026e18482850162002616565b60c08301525092915050565b600060208284031215620026ff578081fd5b813562000db38162002e30565b6000602082840312156200271e578081fd5b815162000db38162002e30565b60008060006060848603121562002740578182fd5b83356200274d8162002e30565b95602085013595506040909401359392505050565b60006020828403121562002774578081fd5b8151801515811462000db3578182fd5b60006020828403121562002796578081fd5b5035919050565b600060208284031215620027af578081fd5b5051919050565b60008060408385031215620027c9578182fd5b50508035926020909101359150565b60008060008060808587031215620027ee578081fd5b84359350602085013560ff8116811462002806578182fd5b93969395505050506040820135916060013590565b6000602082840312156200282d578081fd5b81356001600160401b0381111562002843578182fd5b620028518482850162002616565b949350505050565b600080604083850312156200286c578182fd5b82356001600160401b0381111562002882578283fd5b620028908582860162002616565b95602094909401359450505050565b60008060008060808587031215620028b5578182fd5b845160088110620028c4578283fd5b80945050602085015192506040850151915060608501516001600160401b03811115620028ef578182fd5b8501601f8101871362002900578182fd5b805162002911620025d78262002ddf565b81815288602083850101111562002926578384fd5b6200293982602083016020860162002e01565b9598949750929550505050565b60006020828403121562002958578081fd5b81356001600160401b038111156200296e578182fd5b8201601f810184136200297f578182fd5b6200285184823560208401620025c6565b60008060408385031215620029a3578182fd5b82356001600160401b03811115620029b9578283fd5b620029c78582860162002648565b9250506020830135620029da8162002e30565b809150509250929050565b600080600060608486031215620029fa578081fd5b83356001600160401b0381111562002a10578182fd5b62002a1e8682870162002648565b935050602084013562002a318162002e30565b9150604084013562002a438162002e30565b809150509250925092565b60008060006060848603121562002a63578081fd5b83359250602084013562002a778162002e30565b915060408401356001600160401b0381111562002a92578182fd5b62002aa08682870162002616565b9150509250925092565b6000815180845262002ac481602086016020860162002e01565b601f01601f19169290920160200192915050565b6008811062002ae357fe5b9052565b60609190911b6bffffffffffffffffffffffff1916815260140190565b6001600160f81b031994909416845260609290921b6bffffffffffffffffffffffff191660018401526015830152603582015260550190565b6000825162002b5181846020870162002e01565b9190910192915050565b6000835162002b6f81846020880162002e01565b83519083019062002b8581836020880162002e01565b01949350505050565b90815260200190565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039390931683526020830191909152604082015260600190565b6001600160a01b0383168152604060208201819052600090620028519083018462002aaa565b600083151582526040602083015262002851604083018462002aaa565b93845260ff9290921660208401526040830152606082015260800190565b60006020825262000db3602083018462002aaa565b602081016002831062002c8e57fe5b91905290565b600062002ca2828762002ad8565b60ff8516602083015260ff841660408301526080606083015262002cca608083018462002aaa565b9695505050505050565b600062002ce2828762002ad8565b8460208301528360408301526080606083015262002cca608083018462002aaa565b60208082526046908201527f4f6e6c792061757468656e746963617465642061646472657373657320696e2060408201527f6f766d53746174654d616e616765722063616e2063616c6c20746869732066756060820152653731ba34b7b760d11b608082015260a00190565b6020808252602b908201527f4f6e6c792063616c6c61626c6520617420746865207374617274206f6620612060408201526a3a3930b739b0b1ba34b7b760a91b606082015260800190565b6040518181016001600160401b038111828210171562002dd757fe5b604052919050565b60006001600160401b0382111562002df357fe5b50601f01601f191660200190565b60005b8381101562002e1e57818101518382015260200162002e04565b838111156200083a5750506000910152565b6001600160a01b0381168114620005bb57600080fdfe608060405234801561001057600080fd5b506040516109013803806109018339818101604052602081101561003357600080fd5b505161003e81610044565b506101d9565b61008d7fdeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddead60001b61007e8361009060201b6103ca1760201c565b61009c60201b6103d61760201c565b50565b6001600160a01b031690565b604080516024810184905260448082018490528251808303909101815260649091019091526020810180516001600160e01b03908116628af59360e61b179091526100e891906100ed16565b505050565b60606100f95a836100ff565b92915050565b60606000339050600080826001600160a01b031686866040518082805190602001908083835b602083106101445780518252601f199092019160209182019101610125565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038160008787f1925050503d80600081146101a7576040519150601f19603f3d011682016040523d82523d6000602084013e6101ac565b606091505b509092509050816101bf57805160208201fd5b8051600114156101cf5760016000f35b92506100f9915050565b610719806101e86000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c80630900f010146100a1578063aaf10f42146100c9575b6000806100825a6100456100ed565b6000368080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061012592505050565b91509150811561009457805160208201f35b61009d816102c8565b5050005b6100c7600480360360208110156100b757600080fd5b50356001600160a01b031661037a565b005b6100d16100ed565b604080516001600160a01b039092168252519081900360200190f35b600061012061011b7fdeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddead610422565b610488565b905090565b6000606060006101ed86868660405160240180848152602001836001600160a01b0316815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561018657818101518382015260200161016e565b50505050905090810190601f1680156101b35780820380516001836020036101000a031916815260200191505b5060408051601f198184030181529190526020810180516001600160e01b03166001620631bb60e21b0319179052945061048b9350505050565b905080806020019051604081101561020457600080fd5b81516020830180516040519294929383019291908464010000000082111561022b57600080fd5b90830190602082018581111561024057600080fd5b825164010000000081118282018810171561025a57600080fd5b82525081516020918201929091019080838360005b8381101561028757818101518382015260200161026f565b50505050905090810190601f1680156102b45780820380516001836020036101000a031916815260200191505b506040525050509250925050935093915050565b6103766102d48261049d565b6040516024018080602001828103825283818151815260200191508051906020019080838360005b838110156103145781810151838201526020016102fc565b50505050905090810190601f1680156103415780820380516001836020036101000a031916815260200191505b5060408051601f198184030181529190526020810180516001600160e01b0316632a2a7adb60e01b179052925061048b915050565b5050565b6103be6103856104e0565b6001600160a01b0316610396610536565b6001600160a01b0316146040518060600160405280603281526020016106db6032913961056d565b6103c78161057b565b50565b6001600160a01b031690565b604080516024810184905260448082018490528251808303909101815260649091019091526020810180516001600160e01b0316628af59360e61b17905261041d9061048b565b505050565b6040805160248082018490528251808303909101815260449091019091526020810180516001600160e01b03166303daa95960e01b17905260009081906104689061048b565b905080806020019051602081101561047f57600080fd5b50519392505050565b90565b60606104975a836105ad565b92915050565b6060816040516024016104b09190610687565b60408051601f198184030181529190526020810180516001600160e01b031662461bcd60e51b1790529050919050565b6040805160048152602481019091526020810180516001600160e01b0316631cd4241960e21b17905260009081906105179061048b565b905080806020019051602081101561052e57600080fd5b505191505090565b6040805160048152602481019091526020810180516001600160e01b031663996d79a560e01b17905260009081906105179061048b565b8161037657610376816102c8565b6103c77fdeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddead6105a8836103ca565b6103d6565b60606000339050600080826001600160a01b031686866040518082805190602001908083835b602083106105f25780518252601f1990920191602091820191016105d3565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038160008787f1925050503d8060008114610655576040519150601f19603f3d011682016040523d82523d6000602084013e61065a565b606091505b5090925090508161066d57805160208201fd5b80516001141561067d5760016000f35b9250610497915050565b6000602080835283518082850152825b818110156106b357858101830151858201604001528201610697565b818111156106c45783604083870101525b50601f01601f191692909201604001939250505056fe454f41732063616e206f6e6c792075706772616465207468656972206f776e20454f4120696d706c656d656e746174696f6ea164736f6c6343000706000a5369676e61747572652070726f766964656420666f7220454f4120636f6e7472616374206372656174696f6e20697320696e76616c69642e436f6e7472616374206372656174696f6e20636f646520636f6e7461696e7320756e73616665206f70636f6465732e2044696420796f75207573652074686520726967687420636f6d70696c6572206f72207061737320616e20756e7361666520636f6e7374727563746f7220617267756d656e743f4120636f6e74726163742068617320616c7265616479206265656e206465706c6f79656420746f20746869732061646472657373436f6e7374727563746f7220617474656d7074656420746f206465706c6f7920756e736166652062797465636f64652ea164736f6c6343000706000a", + "solcInputHash": "5ee8e508e2c54cb5ac6783b4855b1558", + "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"minTransactionGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxTransactionGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxGasPerQueuePerEpoch\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"secondsPerEpoch\",\"type\":\"uint256\"}],\"internalType\":\"struct iOVM_ExecutionManager.GasMeterConfig\",\"name\":\"_gasMeterConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"ovmCHAINID\",\"type\":\"uint256\"}],\"internalType\":\"struct iOVM_ExecutionManager.GlobalContext\",\"name\":\"_globalContext\",\"type\":\"tuple\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"getMaxTransactionGasLimit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_maxTransactionGasLimit\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ovmADDRESS\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"_ADDRESS\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_address\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_calldata\",\"type\":\"bytes\"}],\"name\":\"ovmCALL\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"_success\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"_returndata\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ovmCALLER\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"_CALLER\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ovmCHAINID\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_CHAINID\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_bytecode\",\"type\":\"bytes\"}],\"name\":\"ovmCREATE\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_bytecode\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"_salt\",\"type\":\"bytes32\"}],\"name\":\"ovmCREATE2\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_messageHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint8\",\"name\":\"_v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"_r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"_s\",\"type\":\"bytes32\"}],\"name\":\"ovmCREATEEOA\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_address\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_calldata\",\"type\":\"bytes\"}],\"name\":\"ovmDELEGATECALL\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"_success\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"_returndata\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_contract\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_offset\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_length\",\"type\":\"uint256\"}],\"name\":\"ovmEXTCODECOPY\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"_code\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_contract\",\"type\":\"address\"}],\"name\":\"ovmEXTCODEHASH\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"_EXTCODEHASH\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_contract\",\"type\":\"address\"}],\"name\":\"ovmEXTCODESIZE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_EXTCODESIZE\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ovmGASLIMIT\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_GASLIMIT\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ovmGETNONCE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_nonce\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ovmINCREMENTNONCE\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ovmL1QUEUEORIGIN\",\"outputs\":[{\"internalType\":\"enum Lib_OVMCodec.QueueOrigin\",\"name\":\"_queueOrigin\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ovmL1TXORIGIN\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"_l1TxOrigin\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ovmNUMBER\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_NUMBER\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"ovmREVERT\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_key\",\"type\":\"bytes32\"}],\"name\":\"ovmSLOAD\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"_value\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_key\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"_value\",\"type\":\"bytes32\"}],\"name\":\"ovmSSTORE\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_address\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_calldata\",\"type\":\"bytes\"}],\"name\":\"ovmSTATICCALL\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"_success\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"_returndata\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ovmTIMESTAMP\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_TIMESTAMP\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"enum Lib_OVMCodec.QueueOrigin\",\"name\":\"l1QueueOrigin\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"l1TxOrigin\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"entrypoint\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.Transaction\",\"name\":\"_transaction\",\"type\":\"tuple\"},{\"internalType\":\"address\",\"name\":\"_ovmStateManager\",\"type\":\"address\"}],\"name\":\"run\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_creationCode\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"_address\",\"type\":\"address\"}],\"name\":\"safeCREATE\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"enum Lib_OVMCodec.QueueOrigin\",\"name\":\"l1QueueOrigin\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"l1TxOrigin\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"entrypoint\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.Transaction\",\"name\":\"_transaction\",\"type\":\"tuple\"},{\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"internalType\":\"contract iOVM_StateManager\",\"name\":\"_ovmStateManager\",\"type\":\"address\"}],\"name\":\"simulateMessage\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The Execution Manager (EM) is the core of our OVM implementation, and provides a sandboxed environment allowing us to execute OVM transactions deterministically on either Layer 1 or Layer 2. The EM's run() function is the first function called during the execution of any transaction on L2. For each context-dependent EVM operation the EM has a function which implements a corresponding OVM operation, which will read state from the State Manager contract. The EM relies on the Safety Checker to verify that code deployed to Layer 2 does not contain any context-dependent operations. Compiler used: solc Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\"}},\"ovmADDRESS()\":{\"returns\":{\"_ADDRESS\":\"Active ADDRESS within the current message context.\"}},\"ovmCALL(uint256,address,bytes)\":{\"params\":{\"_address\":\"Address of the contract to call.\",\"_calldata\":\"Data to send along with the call.\",\"_gasLimit\":\"Amount of gas to be passed into this call.\"},\"returns\":{\"_returndata\":\"Data returned by the call.\",\"_success\":\"Whether or not the call returned (rather than reverted).\"}},\"ovmCALLER()\":{\"returns\":{\"_CALLER\":\"Address of the CALLER within the current message context.\"}},\"ovmCHAINID()\":{\"returns\":{\"_CHAINID\":\"Value of the chain's CHAINID within the global context.\"}},\"ovmCREATE(bytes)\":{\"params\":{\"_bytecode\":\"Code to be used to CREATE a new contract.\"},\"returns\":{\"_0\":\"Address of the created contract.\",\"_1\":\"Revert data, if and only if the creation threw an exception.\"}},\"ovmCREATE2(bytes,bytes32)\":{\"params\":{\"_bytecode\":\"Code to be used to CREATE2 a new contract.\",\"_salt\":\"Value used to determine the contract's address.\"},\"returns\":{\"_0\":\"Address of the created contract.\",\"_1\":\"Revert data, if and only if the creation threw an exception.\"}},\"ovmCREATEEOA(bytes32,uint8,bytes32,bytes32)\":{\"details\":\"Essentially functions like ovmCREATE or ovmCREATE2, but we can bypass a lot of checks because the contract we're creating is trusted (no need to do safety checking or to handle unexpected reverts). Doesn't need to return an address because the address is assumed to be the user's actual address.\",\"params\":{\"_messageHash\":\"Hash of a message signed by some user, for verification.\",\"_r\":\"Signature `r` parameter.\",\"_s\":\"Signature `s` parameter.\",\"_v\":\"Signature `v` parameter.\"}},\"ovmDELEGATECALL(uint256,address,bytes)\":{\"params\":{\"_address\":\"Address of the contract to call.\",\"_calldata\":\"Data to send along with the call.\",\"_gasLimit\":\"Amount of gas to be passed into this call.\"},\"returns\":{\"_returndata\":\"Data returned by the call.\",\"_success\":\"Whether or not the call returned (rather than reverted).\"}},\"ovmEXTCODECOPY(address,uint256,uint256)\":{\"params\":{\"_contract\":\"Address of the contract to copy code from.\",\"_length\":\"Total number of bytes to copy from the contract's code.\",\"_offset\":\"Offset in bytes from the start of contract code to copy beyond.\"},\"returns\":{\"_code\":\"Bytes of code copied from the requested contract.\"}},\"ovmEXTCODEHASH(address)\":{\"params\":{\"_contract\":\"Address of the contract to query the hash of.\"},\"returns\":{\"_EXTCODEHASH\":\"Hash of the requested contract.\"}},\"ovmEXTCODESIZE(address)\":{\"params\":{\"_contract\":\"Address of the contract to query the size of.\"},\"returns\":{\"_EXTCODESIZE\":\"Size of the requested contract in bytes.\"}},\"ovmGASLIMIT()\":{\"returns\":{\"_GASLIMIT\":\"Value of the block's GASLIMIT within the transaction context.\"}},\"ovmGETNONCE()\":{\"returns\":{\"_nonce\":\"Nonce of the current contract.\"}},\"ovmL1QUEUEORIGIN()\":{\"returns\":{\"_queueOrigin\":\"Enum indicating the ovmL1QUEUEORIGIN within the current message context.\"}},\"ovmL1TXORIGIN()\":{\"returns\":{\"_l1TxOrigin\":\"Address of the account which sent the tx into L2 from L1.\"}},\"ovmNUMBER()\":{\"returns\":{\"_NUMBER\":\"Value of the NUMBER within the transaction context.\"}},\"ovmREVERT(bytes)\":{\"params\":{\"_data\":\"Bytes data to pass along with the REVERT.\"}},\"ovmSLOAD(bytes32)\":{\"params\":{\"_key\":\"32 byte key of the storage slot to load.\"},\"returns\":{\"_value\":\"32 byte value of the requested storage slot.\"}},\"ovmSSTORE(bytes32,bytes32)\":{\"params\":{\"_key\":\"32 byte key of the storage slot to set.\",\"_value\":\"32 byte value for the storage slot.\"}},\"ovmSTATICCALL(uint256,address,bytes)\":{\"params\":{\"_address\":\"Address of the contract to call.\",\"_calldata\":\"Data to send along with the call.\",\"_gasLimit\":\"Amount of gas to be passed into this call.\"},\"returns\":{\"_returndata\":\"Data returned by the call.\",\"_success\":\"Whether or not the call returned (rather than reverted).\"}},\"ovmTIMESTAMP()\":{\"returns\":{\"_TIMESTAMP\":\"Value of the TIMESTAMP within the transaction context.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}},\"run((uint256,uint256,uint8,address,address,uint256,bytes),address)\":{\"params\":{\"_ovmStateManager\":\"iOVM_StateManager implementation providing account state.\",\"_transaction\":\"Transaction data to be executed.\"}},\"safeCREATE(uint256,bytes,address)\":{\"params\":{\"_address\":\"OVM address being deployed to.\",\"_creationCode\":\"Code to pass into CREATE for deployment.\",\"_gasLimit\":\"Amount of gas to be passed into this creation.\"}},\"simulateMessage((uint256,uint256,uint8,address,address,uint256,bytes),address,address)\":{\"params\":{\"_from\":\"the OVM account the simulated call should be from.\",\"_transaction\":\"the message transaction to simulate.\"}}},\"title\":\"OVM_ExecutionManager\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"ovmADDRESS()\":{\"notice\":\"Overrides ADDRESS.\"},\"ovmCALL(uint256,address,bytes)\":{\"notice\":\"Overrides CALL.\"},\"ovmCALLER()\":{\"notice\":\"Overrides CALLER.\"},\"ovmCHAINID()\":{\"notice\":\"Overrides CHAINID.\"},\"ovmCREATE(bytes)\":{\"notice\":\"Overrides CREATE.\"},\"ovmCREATE2(bytes,bytes32)\":{\"notice\":\"Overrides CREATE2.\"},\"ovmCREATEEOA(bytes32,uint8,bytes32,bytes32)\":{\"notice\":\"Creates a new EOA contract account, for account abstraction.\"},\"ovmDELEGATECALL(uint256,address,bytes)\":{\"notice\":\"Overrides DELEGATECALL.\"},\"ovmEXTCODECOPY(address,uint256,uint256)\":{\"notice\":\"Overrides EXTCODECOPY.\"},\"ovmEXTCODEHASH(address)\":{\"notice\":\"Overrides EXTCODEHASH.\"},\"ovmEXTCODESIZE(address)\":{\"notice\":\"Overrides EXTCODESIZE.\"},\"ovmGASLIMIT()\":{\"notice\":\"Overrides GASLIMIT.\"},\"ovmGETNONCE()\":{\"notice\":\"Retrieves the nonce of the current ovmADDRESS.\"},\"ovmINCREMENTNONCE()\":{\"notice\":\"Bumps the nonce of the current ovmADDRESS by one.\"},\"ovmL1QUEUEORIGIN()\":{\"notice\":\"Specifies from which source (Sequencer or Queue) this transaction originated from.\"},\"ovmL1TXORIGIN()\":{\"notice\":\"Specifies which L1 account, if any, sent this transaction by calling enqueue().\"},\"ovmNUMBER()\":{\"notice\":\"Overrides NUMBER.\"},\"ovmREVERT(bytes)\":{\"notice\":\"Overrides REVERT.\"},\"ovmSLOAD(bytes32)\":{\"notice\":\"Overrides SLOAD.\"},\"ovmSSTORE(bytes32,bytes32)\":{\"notice\":\"Overrides SSTORE.\"},\"ovmSTATICCALL(uint256,address,bytes)\":{\"notice\":\"Overrides STATICCALL.\"},\"ovmTIMESTAMP()\":{\"notice\":\"Overrides TIMESTAMP.\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"},\"run((uint256,uint256,uint8,address,address,uint256,bytes),address)\":{\"notice\":\"Starts the execution of a transaction via the OVM_ExecutionManager.\"},\"safeCREATE(uint256,bytes,address)\":{\"notice\":\"Handles the creation-specific safety measures required for OVM contract deployment. This function sanitizes the return types for creation messages to match calls (bool, bytes), by being an external function which the EM can call, that mimics the success/fail case of the CREATE. This allows for consistent handling of both types of messages in _handleExternalMessage(). Having this step occur as a separate call frame also allows us to easily revert the contract deployment in the event that the code is unsafe.\"},\"simulateMessage((uint256,uint256,uint8,address,address,uint256,bytes),address,address)\":{\"notice\":\"Unreachable helper function for simulating eth_calls with an OVM message context. This function will throw an exception in all cases other than when used as a custom entrypoint in L2 Geth to simulate eth_call.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol\":\"OVM_ExecutionManager\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor () internal {\\n address msgSender = _msgSender();\\n _owner = msgSender;\\n emit OwnershipTransferred(address(0), msgSender);\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n emit OwnershipTransferred(_owner, address(0));\\n _owner = address(0);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n emit OwnershipTransferred(_owner, newOwner);\\n _owner = newOwner;\\n }\\n}\\n\",\"keccak256\":\"0x15e2d5bd4c28a88548074c54d220e8086f638a71ed07e6b3ba5a70066fcf458d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with GSN meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address payable) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes memory) {\\n this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x8d3cb350f04ff49cfb10aef08d87f19dcbaecc8027b0bed12f3275cd12f38cf0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// @unsupported: ovm\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\nimport { Lib_EthUtils } from \\\"../../libraries/utils/Lib_EthUtils.sol\\\";\\nimport { Lib_ErrorUtils } from \\\"../../libraries/utils/Lib_ErrorUtils.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_ExecutionManager } from \\\"../../iOVM/execution/iOVM_ExecutionManager.sol\\\";\\nimport { iOVM_StateManager } from \\\"../../iOVM/execution/iOVM_StateManager.sol\\\";\\nimport { iOVM_SafetyChecker } from \\\"../../iOVM/execution/iOVM_SafetyChecker.sol\\\";\\n\\n/* Contract Imports */\\nimport { OVM_DeployerWhitelist } from \\\"../predeploys/OVM_DeployerWhitelist.sol\\\";\\n\\n/**\\n * @title OVM_ExecutionManager\\n * @dev The Execution Manager (EM) is the core of our OVM implementation, and provides a sandboxed\\n * environment allowing us to execute OVM transactions deterministically on either Layer 1 or\\n * Layer 2.\\n * The EM's run() function is the first function called during the execution of any\\n * transaction on L2.\\n * For each context-dependent EVM operation the EM has a function which implements a corresponding\\n * OVM operation, which will read state from the State Manager contract.\\n * The EM relies on the Safety Checker to verify that code deployed to Layer 2 does not contain any\\n * context-dependent operations.\\n *\\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract OVM_ExecutionManager is iOVM_ExecutionManager, Lib_AddressResolver {\\n\\n /********************************\\n * External Contract References *\\n ********************************/\\n\\n iOVM_SafetyChecker internal ovmSafetyChecker;\\n iOVM_StateManager internal ovmStateManager;\\n\\n\\n /*******************************\\n * Execution Context Variables *\\n *******************************/\\n\\n GasMeterConfig internal gasMeterConfig;\\n GlobalContext internal globalContext;\\n TransactionContext internal transactionContext;\\n MessageContext internal messageContext;\\n TransactionRecord internal transactionRecord;\\n MessageRecord internal messageRecord;\\n\\n\\n /**************************\\n * Gas Metering Constants *\\n **************************/\\n\\n address constant GAS_METADATA_ADDRESS = 0x06a506A506a506A506a506a506A506A506A506A5;\\n uint256 constant NUISANCE_GAS_SLOAD = 20000;\\n uint256 constant NUISANCE_GAS_SSTORE = 20000;\\n uint256 constant MIN_NUISANCE_GAS_PER_CONTRACT = 30000;\\n uint256 constant NUISANCE_GAS_PER_CONTRACT_BYTE = 100;\\n uint256 constant MIN_GAS_FOR_INVALID_STATE_ACCESS = 30000;\\n\\n /**************************\\n * Default Context Values *\\n **************************/\\n\\n uint256 constant DEFAULT_UINT256 = 0xdefa017defa017defa017defa017defa017defa017defa017defa017defa017d;\\n address constant DEFAULT_ADDRESS = 0xdEfa017defA017DeFA017DEfa017DeFA017DeFa0;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n */\\n constructor(\\n address _libAddressManager,\\n GasMeterConfig memory _gasMeterConfig,\\n GlobalContext memory _globalContext\\n )\\n Lib_AddressResolver(_libAddressManager)\\n {\\n ovmSafetyChecker = iOVM_SafetyChecker(resolve(\\\"OVM_SafetyChecker\\\"));\\n gasMeterConfig = _gasMeterConfig;\\n globalContext = _globalContext;\\n _resetContext();\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n /**\\n * Applies dynamically-sized refund to a transaction to account for the difference in execution\\n * between L1 and L2, so that the overall cost of the ovmOPCODE is fixed.\\n * @param _cost Desired gas cost for the function after the refund.\\n */\\n modifier netGasCost(\\n uint256 _cost\\n ) {\\n uint256 gasProvided = gasleft();\\n _;\\n uint256 gasUsed = gasProvided - gasleft();\\n\\n // We want to refund everything *except* the specified cost.\\n if (_cost < gasUsed) {\\n transactionRecord.ovmGasRefund += gasUsed - _cost;\\n }\\n }\\n\\n /**\\n * Applies a fixed-size gas refund to a transaction to account for the difference in execution\\n * between L1 and L2, so that the overall cost of an ovmOPCODE can be lowered.\\n * @param _discount Amount of gas cost to refund for the ovmOPCODE.\\n */\\n modifier fixedGasDiscount(\\n uint256 _discount\\n ) {\\n uint256 gasProvided = gasleft();\\n _;\\n uint256 gasUsed = gasProvided - gasleft();\\n\\n // We want to refund the specified _discount, unless this risks underflow.\\n if (_discount < gasUsed) {\\n transactionRecord.ovmGasRefund += _discount;\\n } else {\\n // refund all we can without risking underflow.\\n transactionRecord.ovmGasRefund += gasUsed;\\n }\\n }\\n\\n /**\\n * Makes sure we're not inside a static context.\\n */\\n modifier notStatic() {\\n if (messageContext.isStatic == true) {\\n _revertWithFlag(RevertFlag.STATIC_VIOLATION);\\n }\\n _;\\n }\\n\\n\\n /************************************\\n * Transaction Execution Entrypoint *\\n ************************************/\\n\\n /**\\n * Starts the execution of a transaction via the OVM_ExecutionManager.\\n * @param _transaction Transaction data to be executed.\\n * @param _ovmStateManager iOVM_StateManager implementation providing account state.\\n */\\n function run(\\n Lib_OVMCodec.Transaction memory _transaction,\\n address _ovmStateManager\\n )\\n override\\n public\\n returns (\\n bytes memory\\n )\\n {\\n // Make sure that run() is not re-enterable. This condition should always be satisfied\\n // Once run has been called once, due to the behavior of _isValidInput().\\n if (transactionContext.ovmNUMBER != DEFAULT_UINT256) {\\n return bytes(\\\"\\\");\\n }\\n\\n // Store our OVM_StateManager instance (significantly easier than attempting to pass the\\n // address around in calldata).\\n ovmStateManager = iOVM_StateManager(_ovmStateManager);\\n\\n // Make sure this function can't be called by anyone except the owner of the\\n // OVM_StateManager (expected to be an OVM_StateTransitioner). We can revert here because\\n // this would make the `run` itself invalid.\\n require(\\n // This method may return false during fraud proofs, but always returns true in L2 nodes' State Manager precompile.\\n ovmStateManager.isAuthenticated(msg.sender),\\n \\\"Only authenticated addresses in ovmStateManager can call this function\\\"\\n );\\n\\n // Initialize the execution context, must be initialized before we perform any gas metering\\n // or we'll throw a nuisance gas error.\\n _initContext(_transaction);\\n\\n // TEMPORARY: Gas metering is disabled for minnet.\\n // // Check whether we need to start a new epoch, do so if necessary.\\n // _checkNeedsNewEpoch(_transaction.timestamp);\\n\\n // Make sure the transaction's gas limit is valid. We don't revert here because we reserve\\n // reverts for INVALID_STATE_ACCESS.\\n if (_isValidInput(_transaction) == false) {\\n _resetContext();\\n return bytes(\\\"\\\");\\n }\\n\\n // TEMPORARY: Gas metering is disabled for minnet.\\n // // Check gas right before the call to get total gas consumed by OVM transaction.\\n // uint256 gasProvided = gasleft();\\n\\n // Run the transaction, make sure to meter the gas usage.\\n (, bytes memory returndata) = ovmCALL(\\n _transaction.gasLimit - gasMeterConfig.minTransactionGasLimit,\\n _transaction.entrypoint,\\n _transaction.data\\n );\\n\\n // TEMPORARY: Gas metering is disabled for minnet.\\n // // Update the cumulative gas based on the amount of gas used.\\n // uint256 gasUsed = gasProvided - gasleft();\\n // _updateCumulativeGas(gasUsed, _transaction.l1QueueOrigin);\\n\\n // Wipe the execution context.\\n _resetContext();\\n\\n return returndata;\\n }\\n\\n\\n /******************************\\n * Opcodes: Execution Context *\\n ******************************/\\n\\n /**\\n * @notice Overrides CALLER.\\n * @return _CALLER Address of the CALLER within the current message context.\\n */\\n function ovmCALLER()\\n override\\n public\\n view\\n returns (\\n address _CALLER\\n )\\n {\\n return messageContext.ovmCALLER;\\n }\\n\\n /**\\n * @notice Overrides ADDRESS.\\n * @return _ADDRESS Active ADDRESS within the current message context.\\n */\\n function ovmADDRESS()\\n override\\n public\\n view\\n returns (\\n address _ADDRESS\\n )\\n {\\n return messageContext.ovmADDRESS;\\n }\\n\\n /**\\n * @notice Overrides TIMESTAMP.\\n * @return _TIMESTAMP Value of the TIMESTAMP within the transaction context.\\n */\\n function ovmTIMESTAMP()\\n override\\n public\\n view\\n returns (\\n uint256 _TIMESTAMP\\n )\\n {\\n return transactionContext.ovmTIMESTAMP;\\n }\\n\\n /**\\n * @notice Overrides NUMBER.\\n * @return _NUMBER Value of the NUMBER within the transaction context.\\n */\\n function ovmNUMBER()\\n override\\n public\\n view\\n returns (\\n uint256 _NUMBER\\n )\\n {\\n return transactionContext.ovmNUMBER;\\n }\\n\\n /**\\n * @notice Overrides GASLIMIT.\\n * @return _GASLIMIT Value of the block's GASLIMIT within the transaction context.\\n */\\n function ovmGASLIMIT()\\n override\\n public\\n view\\n returns (\\n uint256 _GASLIMIT\\n )\\n {\\n return transactionContext.ovmGASLIMIT;\\n }\\n\\n /**\\n * @notice Overrides CHAINID.\\n * @return _CHAINID Value of the chain's CHAINID within the global context.\\n */\\n function ovmCHAINID()\\n override\\n public\\n view\\n returns (\\n uint256 _CHAINID\\n )\\n {\\n return globalContext.ovmCHAINID;\\n }\\n\\n /*********************************\\n * Opcodes: L2 Execution Context *\\n *********************************/\\n\\n /**\\n * @notice Specifies from which source (Sequencer or Queue) this transaction originated from.\\n * @return _queueOrigin Enum indicating the ovmL1QUEUEORIGIN within the current message context.\\n */\\n function ovmL1QUEUEORIGIN()\\n override\\n public\\n view\\n returns (\\n Lib_OVMCodec.QueueOrigin _queueOrigin\\n )\\n {\\n return transactionContext.ovmL1QUEUEORIGIN;\\n }\\n\\n /**\\n * @notice Specifies which L1 account, if any, sent this transaction by calling enqueue().\\n * @return _l1TxOrigin Address of the account which sent the tx into L2 from L1.\\n */\\n function ovmL1TXORIGIN()\\n override\\n public\\n view\\n returns (\\n address _l1TxOrigin\\n )\\n {\\n return transactionContext.ovmL1TXORIGIN;\\n }\\n\\n /********************\\n * Opcodes: Halting *\\n ********************/\\n\\n /**\\n * @notice Overrides REVERT.\\n * @param _data Bytes data to pass along with the REVERT.\\n */\\n function ovmREVERT(\\n bytes memory _data\\n )\\n override\\n public\\n {\\n _revertWithFlag(RevertFlag.INTENTIONAL_REVERT, _data);\\n }\\n\\n\\n /******************************\\n * Opcodes: Contract Creation *\\n ******************************/\\n\\n /**\\n * @notice Overrides CREATE.\\n * @param _bytecode Code to be used to CREATE a new contract.\\n * @return Address of the created contract.\\n * @return Revert data, if and only if the creation threw an exception.\\n */\\n function ovmCREATE(\\n bytes memory _bytecode\\n )\\n override\\n public\\n notStatic\\n fixedGasDiscount(40000)\\n returns (\\n address,\\n bytes memory\\n )\\n {\\n // Creator is always the current ADDRESS.\\n address creator = ovmADDRESS();\\n\\n // Check that the deployer is whitelisted, or\\n // that arbitrary contract deployment has been enabled.\\n _checkDeployerAllowed(creator);\\n\\n // Generate the correct CREATE address.\\n address contractAddress = Lib_EthUtils.getAddressForCREATE(\\n creator,\\n _getAccountNonce(creator)\\n );\\n\\n return _createContract(\\n contractAddress,\\n _bytecode\\n );\\n }\\n\\n /**\\n * @notice Overrides CREATE2.\\n * @param _bytecode Code to be used to CREATE2 a new contract.\\n * @param _salt Value used to determine the contract's address.\\n * @return Address of the created contract.\\n * @return Revert data, if and only if the creation threw an exception.\\n */\\n function ovmCREATE2(\\n bytes memory _bytecode,\\n bytes32 _salt\\n )\\n override\\n public\\n notStatic\\n fixedGasDiscount(40000)\\n returns (\\n address,\\n bytes memory\\n )\\n {\\n // Creator is always the current ADDRESS.\\n address creator = ovmADDRESS();\\n\\n // Check that the deployer is whitelisted, or\\n // that arbitrary contract deployment has been enabled.\\n _checkDeployerAllowed(creator);\\n\\n // Generate the correct CREATE2 address.\\n address contractAddress = Lib_EthUtils.getAddressForCREATE2(\\n creator,\\n _bytecode,\\n _salt\\n );\\n\\n return _createContract(\\n contractAddress,\\n _bytecode\\n );\\n }\\n\\n\\n /*******************************\\n * Account Abstraction Opcodes *\\n ******************************/\\n\\n /**\\n * Retrieves the nonce of the current ovmADDRESS.\\n * @return _nonce Nonce of the current contract.\\n */\\n function ovmGETNONCE()\\n override\\n public\\n returns (\\n uint256 _nonce\\n )\\n {\\n return _getAccountNonce(ovmADDRESS());\\n }\\n\\n /**\\n * Bumps the nonce of the current ovmADDRESS by one.\\n */\\n function ovmINCREMENTNONCE()\\n override\\n public\\n notStatic\\n {\\n address account = ovmADDRESS();\\n uint256 nonce = _getAccountNonce(account);\\n\\n // Prevent overflow.\\n if (nonce + 1 > nonce) {\\n _setAccountNonce(account, nonce + 1);\\n }\\n }\\n\\n /**\\n * Creates a new EOA contract account, for account abstraction.\\n * @dev Essentially functions like ovmCREATE or ovmCREATE2, but we can bypass a lot of checks\\n * because the contract we're creating is trusted (no need to do safety checking or to\\n * handle unexpected reverts). Doesn't need to return an address because the address is\\n * assumed to be the user's actual address.\\n * @param _messageHash Hash of a message signed by some user, for verification.\\n * @param _v Signature `v` parameter.\\n * @param _r Signature `r` parameter.\\n * @param _s Signature `s` parameter.\\n */\\n function ovmCREATEEOA(\\n bytes32 _messageHash,\\n uint8 _v,\\n bytes32 _r,\\n bytes32 _s\\n )\\n override\\n public\\n notStatic\\n {\\n // Recover the EOA address from the message hash and signature parameters. Since we do the\\n // hashing in advance, we don't have handle different message hashing schemes. Even if this\\n // function were to return the wrong address (rather than explicitly returning the zero\\n // address), the rest of the transaction would simply fail (since there's no EOA account to\\n // actually execute the transaction).\\n address eoa = ecrecover(\\n _messageHash,\\n _v + 27,\\n _r,\\n _s\\n );\\n\\n // Invalid signature is a case we proactively handle with a revert. We could alternatively\\n // have this function return a `success` boolean, but this is just easier.\\n if (eoa == address(0)) {\\n ovmREVERT(bytes(\\\"Signature provided for EOA contract creation is invalid.\\\"));\\n }\\n\\n // If the user already has an EOA account, then there's no need to perform this operation.\\n if (_hasEmptyAccount(eoa) == false) {\\n return;\\n }\\n\\n // We always need to initialize the contract with the default account values.\\n _initPendingAccount(eoa);\\n\\n // Temporarily set the current address so it's easier to access on L2.\\n address prevADDRESS = messageContext.ovmADDRESS;\\n messageContext.ovmADDRESS = eoa;\\n\\n // Creates a duplicate of the OVM_ProxyEOA located at 0x42....09. Uses the following\\n // \\\"magic\\\" prefix to deploy an exact copy of the code:\\n // PUSH1 0x0D # size of this prefix in bytes\\n // CODESIZE\\n // SUB # subtract prefix size from codesize\\n // DUP1\\n // PUSH1 0x0D\\n // PUSH1 0x00\\n // CODECOPY # copy everything after prefix into memory at pos 0\\n // PUSH1 0x00\\n // RETURN # return the copied code\\n address proxyEOA = Lib_EthUtils.createContract(abi.encodePacked(\\n hex\\\"600D380380600D6000396000f3\\\",\\n ovmEXTCODECOPY(\\n 0x4200000000000000000000000000000000000009,\\n 0,\\n ovmEXTCODESIZE(0x4200000000000000000000000000000000000009)\\n )\\n ));\\n\\n // Reset the address now that we're done deploying.\\n messageContext.ovmADDRESS = prevADDRESS;\\n\\n // Commit the account with its final values.\\n _commitPendingAccount(\\n eoa,\\n address(proxyEOA),\\n keccak256(Lib_EthUtils.getCode(address(proxyEOA)))\\n );\\n\\n _setAccountNonce(eoa, 0);\\n }\\n\\n\\n /*********************************\\n * Opcodes: Contract Interaction *\\n *********************************/\\n\\n /**\\n * @notice Overrides CALL.\\n * @param _gasLimit Amount of gas to be passed into this call.\\n * @param _address Address of the contract to call.\\n * @param _calldata Data to send along with the call.\\n * @return _success Whether or not the call returned (rather than reverted).\\n * @return _returndata Data returned by the call.\\n */\\n function ovmCALL(\\n uint256 _gasLimit,\\n address _address,\\n bytes memory _calldata\\n )\\n override\\n public\\n fixedGasDiscount(100000)\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n // CALL updates the CALLER and ADDRESS.\\n MessageContext memory nextMessageContext = messageContext;\\n nextMessageContext.ovmCALLER = nextMessageContext.ovmADDRESS;\\n nextMessageContext.ovmADDRESS = _address;\\n\\n return _callContract(\\n nextMessageContext,\\n _gasLimit,\\n _address,\\n _calldata\\n );\\n }\\n\\n /**\\n * @notice Overrides STATICCALL.\\n * @param _gasLimit Amount of gas to be passed into this call.\\n * @param _address Address of the contract to call.\\n * @param _calldata Data to send along with the call.\\n * @return _success Whether or not the call returned (rather than reverted).\\n * @return _returndata Data returned by the call.\\n */\\n function ovmSTATICCALL(\\n uint256 _gasLimit,\\n address _address,\\n bytes memory _calldata\\n )\\n override\\n public\\n fixedGasDiscount(80000)\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n // STATICCALL updates the CALLER, updates the ADDRESS, and runs in a static context.\\n MessageContext memory nextMessageContext = messageContext;\\n nextMessageContext.ovmCALLER = nextMessageContext.ovmADDRESS;\\n nextMessageContext.ovmADDRESS = _address;\\n nextMessageContext.isStatic = true;\\n\\n return _callContract(\\n nextMessageContext,\\n _gasLimit,\\n _address,\\n _calldata\\n );\\n }\\n\\n /**\\n * @notice Overrides DELEGATECALL.\\n * @param _gasLimit Amount of gas to be passed into this call.\\n * @param _address Address of the contract to call.\\n * @param _calldata Data to send along with the call.\\n * @return _success Whether or not the call returned (rather than reverted).\\n * @return _returndata Data returned by the call.\\n */\\n function ovmDELEGATECALL(\\n uint256 _gasLimit,\\n address _address,\\n bytes memory _calldata\\n )\\n override\\n public\\n fixedGasDiscount(40000)\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n // DELEGATECALL does not change anything about the message context.\\n MessageContext memory nextMessageContext = messageContext;\\n\\n return _callContract(\\n nextMessageContext,\\n _gasLimit,\\n _address,\\n _calldata\\n );\\n }\\n\\n\\n /************************************\\n * Opcodes: Contract Storage Access *\\n ************************************/\\n\\n /**\\n * @notice Overrides SLOAD.\\n * @param _key 32 byte key of the storage slot to load.\\n * @return _value 32 byte value of the requested storage slot.\\n */\\n function ovmSLOAD(\\n bytes32 _key\\n )\\n override\\n public\\n netGasCost(40000)\\n returns (\\n bytes32 _value\\n )\\n {\\n // We always SLOAD from the storage of ADDRESS.\\n address contractAddress = ovmADDRESS();\\n\\n return _getContractStorage(\\n contractAddress,\\n _key\\n );\\n }\\n\\n /**\\n * @notice Overrides SSTORE.\\n * @param _key 32 byte key of the storage slot to set.\\n * @param _value 32 byte value for the storage slot.\\n */\\n function ovmSSTORE(\\n bytes32 _key,\\n bytes32 _value\\n )\\n override\\n public\\n notStatic\\n netGasCost(60000)\\n {\\n // We always SSTORE to the storage of ADDRESS.\\n address contractAddress = ovmADDRESS();\\n\\n _putContractStorage(\\n contractAddress,\\n _key,\\n _value\\n );\\n }\\n\\n\\n /*********************************\\n * Opcodes: Contract Code Access *\\n *********************************/\\n\\n /**\\n * @notice Overrides EXTCODECOPY.\\n * @param _contract Address of the contract to copy code from.\\n * @param _offset Offset in bytes from the start of contract code to copy beyond.\\n * @param _length Total number of bytes to copy from the contract's code.\\n * @return _code Bytes of code copied from the requested contract.\\n */\\n function ovmEXTCODECOPY(\\n address _contract,\\n uint256 _offset,\\n uint256 _length\\n )\\n override\\n public\\n returns (\\n bytes memory _code\\n )\\n {\\n return Lib_EthUtils.getCode(\\n _getAccountEthAddress(_contract),\\n _offset,\\n _length\\n );\\n }\\n\\n /**\\n * @notice Overrides EXTCODESIZE.\\n * @param _contract Address of the contract to query the size of.\\n * @return _EXTCODESIZE Size of the requested contract in bytes.\\n */\\n function ovmEXTCODESIZE(\\n address _contract\\n )\\n override\\n public\\n returns (\\n uint256 _EXTCODESIZE\\n )\\n {\\n return Lib_EthUtils.getCodeSize(\\n _getAccountEthAddress(_contract)\\n );\\n }\\n\\n /**\\n * @notice Overrides EXTCODEHASH.\\n * @param _contract Address of the contract to query the hash of.\\n * @return _EXTCODEHASH Hash of the requested contract.\\n */\\n function ovmEXTCODEHASH(\\n address _contract\\n )\\n override\\n public\\n returns (\\n bytes32 _EXTCODEHASH\\n )\\n {\\n return Lib_EthUtils.getCodeHash(\\n _getAccountEthAddress(_contract)\\n );\\n }\\n\\n /***************************************\\n * Public Functions: Execution Context *\\n ***************************************/\\n\\n function getMaxTransactionGasLimit()\\n external\\n view\\n override\\n returns (\\n uint256 _maxTransactionGasLimit\\n )\\n {\\n return gasMeterConfig.maxTransactionGasLimit;\\n }\\n\\n /********************************************\\n * Public Functions: Deployment Whitelisting *\\n ********************************************/\\n\\n /**\\n * Checks whether the given address is on the whitelist to ovmCREATE/ovmCREATE2, and reverts if not.\\n * @param _deployerAddress Address attempting to deploy a contract.\\n */\\n function _checkDeployerAllowed(\\n address _deployerAddress\\n )\\n internal\\n {\\n // From an OVM semantics perspective, this will appear identical to\\n // the deployer ovmCALLing the whitelist. This is fine--in a sense, we are forcing them to.\\n (bool success, bytes memory data) = ovmCALL(\\n gasleft(),\\n 0x4200000000000000000000000000000000000002,\\n abi.encodeWithSignature(\\\"isDeployerAllowed(address)\\\", _deployerAddress)\\n );\\n bool isAllowed = abi.decode(data, (bool));\\n\\n if (!isAllowed || !success) {\\n _revertWithFlag(RevertFlag.CREATOR_NOT_ALLOWED);\\n }\\n }\\n\\n /********************************************\\n * Internal Functions: Contract Interaction *\\n ********************************************/\\n\\n /**\\n * Creates a new contract and associates it with some contract address.\\n * @param _contractAddress Address to associate the created contract with.\\n * @param _bytecode Bytecode to be used to create the contract.\\n * @return Final OVM contract address.\\n * @return Revertdata, if and only if the creation threw an exception.\\n */\\n function _createContract(\\n address _contractAddress,\\n bytes memory _bytecode\\n )\\n internal\\n returns (\\n address,\\n bytes memory\\n )\\n {\\n // We always update the nonce of the creating account, even if the creation fails.\\n _setAccountNonce(ovmADDRESS(), _getAccountNonce(ovmADDRESS()) + 1);\\n\\n // We're stepping into a CREATE or CREATE2, so we need to update ADDRESS to point\\n // to the contract's associated address and CALLER to point to the previous ADDRESS.\\n MessageContext memory nextMessageContext = messageContext;\\n nextMessageContext.ovmCALLER = messageContext.ovmADDRESS;\\n nextMessageContext.ovmADDRESS = _contractAddress;\\n\\n // Run the common logic which occurs between call-type and create-type messages,\\n // passing in the creation bytecode and `true` to trigger create-specific logic.\\n (bool success, bytes memory data) = _handleExternalMessage(\\n nextMessageContext,\\n gasleft(),\\n _contractAddress,\\n _bytecode,\\n true\\n );\\n\\n // Yellow paper requires that address returned is zero if the contract deployment fails.\\n return (\\n success ? _contractAddress : address(0),\\n data\\n );\\n }\\n\\n /**\\n * Calls the deployed contract associated with a given address.\\n * @param _nextMessageContext Message context to be used for the call.\\n * @param _gasLimit Amount of gas to be passed into this call.\\n * @param _contract OVM address to be called.\\n * @param _calldata Data to send along with the call.\\n * @return _success Whether or not the call returned (rather than reverted).\\n * @return _returndata Data returned by the call.\\n */\\n function _callContract(\\n MessageContext memory _nextMessageContext,\\n uint256 _gasLimit,\\n address _contract,\\n bytes memory _calldata\\n )\\n internal\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n // We reserve addresses of the form 0xdeaddeaddead...NNNN for the container contracts in L2 geth.\\n // So, we block calls to these addresses since they are not safe to run as an OVM contract itself.\\n if (\\n (uint256(_contract) & uint256(0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000))\\n == uint256(0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000)\\n ) {\\n // EVM does not return data in the success case, see: https://github.com/ethereum/go-ethereum/blob/aae7660410f0ef90279e14afaaf2f429fdc2a186/core/vm/instructions.go#L600-L604\\n return (true, hex'');\\n }\\n\\n // Both 0x0000... and the EVM precompiles have the same address on L1 and L2 --> no trie lookup needed.\\n address codeContractAddress =\\n uint(_contract) < 100\\n ? _contract\\n : _getAccountEthAddress(_contract);\\n\\n return _handleExternalMessage(\\n _nextMessageContext,\\n _gasLimit,\\n codeContractAddress,\\n _calldata,\\n false\\n );\\n }\\n\\n /**\\n * Handles all interactions which involve the execution manager calling out to untrusted code (both calls and creates).\\n * Ensures that OVM-related measures are enforced, including L2 gas refunds, nuisance gas, and flagged reversions.\\n *\\n * @param _nextMessageContext Message context to be used for the external message.\\n * @param _gasLimit Amount of gas to be passed into this message.\\n * @param _contract OVM address being called or deployed to\\n * @param _data Data for the message (either calldata or creation code)\\n * @param _isCreate Whether this is a create-type message.\\n * @return Whether or not the message (either a call or deployment) succeeded.\\n * @return Data returned by the message.\\n */\\n function _handleExternalMessage(\\n MessageContext memory _nextMessageContext,\\n uint256 _gasLimit,\\n address _contract,\\n bytes memory _data,\\n bool _isCreate\\n )\\n internal\\n returns (\\n bool,\\n bytes memory\\n )\\n {\\n // We need to switch over to our next message context for the duration of this call.\\n MessageContext memory prevMessageContext = messageContext;\\n _switchMessageContext(prevMessageContext, _nextMessageContext);\\n\\n // Nuisance gas is a system used to bound the ability for an attacker to make fraud proofs\\n // expensive by touching a lot of different accounts or storage slots. Since most contracts\\n // only use a few storage slots during any given transaction, this shouldn't be a limiting\\n // factor.\\n uint256 prevNuisanceGasLeft = messageRecord.nuisanceGasLeft;\\n uint256 nuisanceGasLimit = _getNuisanceGasLimit(_gasLimit);\\n messageRecord.nuisanceGasLeft = nuisanceGasLimit;\\n\\n // Make the call and make sure to pass in the gas limit. Another instance of hidden\\n // complexity. `_contract` is guaranteed to be a safe contract, meaning its return/revert\\n // behavior can be controlled. In particular, we enforce that flags are passed through\\n // revert data as to retrieve execution metadata that would normally be reverted out of\\n // existence.\\n\\n bool success;\\n bytes memory returndata;\\n if (_isCreate) {\\n // safeCREATE() is a function which replicates a CREATE message, but uses return values\\n // Which match that of CALL (i.e. bool, bytes). This allows many security checks to be\\n // to be shared between untrusted call and create call frames.\\n (success, returndata) = address(this).call(\\n abi.encodeWithSelector(\\n this.safeCREATE.selector,\\n _gasLimit,\\n _data,\\n _contract\\n )\\n );\\n } else {\\n (success, returndata) = _contract.call{gas: _gasLimit}(_data);\\n }\\n\\n // Switch back to the original message context now that we're out of the call.\\n _switchMessageContext(_nextMessageContext, prevMessageContext);\\n\\n // Assuming there were no reverts, the message record should be accurate here. We'll update\\n // this value in the case of a revert.\\n uint256 nuisanceGasLeft = messageRecord.nuisanceGasLeft;\\n\\n // Reverts at this point are completely OK, but we need to make a few updates based on the\\n // information passed through the revert.\\n if (success == false) {\\n (\\n RevertFlag flag,\\n uint256 nuisanceGasLeftPostRevert,\\n uint256 ovmGasRefund,\\n bytes memory returndataFromFlag\\n ) = _decodeRevertData(returndata);\\n\\n // INVALID_STATE_ACCESS is the only flag that triggers an immediate abort of the\\n // parent EVM message. This behavior is necessary because INVALID_STATE_ACCESS must\\n // halt any further transaction execution that could impact the execution result.\\n if (flag == RevertFlag.INVALID_STATE_ACCESS) {\\n _revertWithFlag(flag);\\n }\\n\\n // INTENTIONAL_REVERT, UNSAFE_BYTECODE, STATIC_VIOLATION, and CREATOR_NOT_ALLOWED aren't\\n // dependent on the input state, so we can just handle them like standard reverts. Our only change here\\n // is to record the gas refund reported by the call (enforced by safety checking).\\n if (\\n flag == RevertFlag.INTENTIONAL_REVERT\\n || flag == RevertFlag.UNSAFE_BYTECODE\\n || flag == RevertFlag.STATIC_VIOLATION\\n || flag == RevertFlag.CREATOR_NOT_ALLOWED\\n ) {\\n transactionRecord.ovmGasRefund = ovmGasRefund;\\n }\\n\\n // INTENTIONAL_REVERT needs to pass up the user-provided return data encoded into the\\n // flag, *not* the full encoded flag. All other revert types return no data.\\n if (\\n flag == RevertFlag.INTENTIONAL_REVERT\\n || _isCreate\\n ) {\\n returndata = returndataFromFlag;\\n } else {\\n returndata = hex'';\\n }\\n\\n // Reverts mean we need to use up whatever \\\"nuisance gas\\\" was used by the call.\\n // EXCEEDS_NUISANCE_GAS explicitly reduces the remaining nuisance gas for this message\\n // to zero. OUT_OF_GAS is a \\\"pseudo\\\" flag given that messages return no data when they\\n // run out of gas, so we have to treat this like EXCEEDS_NUISANCE_GAS. All other flags\\n // will simply pass up the remaining nuisance gas.\\n nuisanceGasLeft = nuisanceGasLeftPostRevert;\\n }\\n\\n // We need to reset the nuisance gas back to its original value minus the amount used here.\\n messageRecord.nuisanceGasLeft = prevNuisanceGasLeft - (nuisanceGasLimit - nuisanceGasLeft);\\n\\n return (\\n success,\\n returndata\\n );\\n }\\n\\n /**\\n * Handles the creation-specific safety measures required for OVM contract deployment.\\n * This function sanitizes the return types for creation messages to match calls (bool, bytes),\\n * by being an external function which the EM can call, that mimics the success/fail case of the CREATE.\\n * This allows for consistent handling of both types of messages in _handleExternalMessage().\\n * Having this step occur as a separate call frame also allows us to easily revert the\\n * contract deployment in the event that the code is unsafe.\\n *\\n * @param _gasLimit Amount of gas to be passed into this creation.\\n * @param _creationCode Code to pass into CREATE for deployment.\\n * @param _address OVM address being deployed to.\\n */\\n function safeCREATE(\\n uint _gasLimit,\\n bytes memory _creationCode,\\n address _address\\n )\\n external\\n {\\n // The only way this should callable is from within _createContract(),\\n // and it should DEFINITELY not be callable by a non-EM code contract.\\n if (msg.sender != address(this)) {\\n return;\\n }\\n // Check that there is not already code at this address.\\n if (_hasEmptyAccount(_address) == false) {\\n // Note: in the EVM, this case burns all allotted gas. For improved\\n // developer experience, we do return the remaining gas.\\n _revertWithFlag(\\n RevertFlag.CREATE_COLLISION,\\n Lib_ErrorUtils.encodeRevertString(\\\"A contract has already been deployed to this address\\\")\\n );\\n }\\n\\n // Check the creation bytecode against the OVM_SafetyChecker.\\n if (ovmSafetyChecker.isBytecodeSafe(_creationCode) == false) {\\n _revertWithFlag(\\n RevertFlag.UNSAFE_BYTECODE,\\n Lib_ErrorUtils.encodeRevertString(\\\"Contract creation code contains unsafe opcodes. Did you use the right compiler or pass an unsafe constructor argument?\\\")\\n );\\n }\\n\\n // We always need to initialize the contract with the default account values.\\n _initPendingAccount(_address);\\n\\n // Actually execute the EVM create message.\\n // NOTE: The inline assembly below means we can NOT make any evm calls between here and then.\\n address ethAddress = Lib_EthUtils.createContract(_creationCode);\\n\\n if (ethAddress == address(0)) {\\n // If the creation fails, the EVM lets us grab its revert data. This may contain a revert flag\\n // to be used above in _handleExternalMessage, so we pass the revert data back up unmodified.\\n assembly {\\n returndatacopy(0,0,returndatasize())\\n revert(0, returndatasize())\\n }\\n }\\n\\n // Again simply checking that the deployed code is safe too. Contracts can generate\\n // arbitrary deployment code, so there's no easy way to analyze this beforehand.\\n bytes memory deployedCode = Lib_EthUtils.getCode(ethAddress);\\n if (ovmSafetyChecker.isBytecodeSafe(deployedCode) == false) {\\n _revertWithFlag(\\n RevertFlag.UNSAFE_BYTECODE,\\n Lib_ErrorUtils.encodeRevertString(\\\"Constructor attempted to deploy unsafe bytecode.\\\")\\n );\\n }\\n\\n // Contract creation didn't need to be reverted and the bytecode is safe. We finish up by\\n // associating the desired address with the newly created contract's code hash and address.\\n _commitPendingAccount(\\n _address,\\n ethAddress,\\n Lib_EthUtils.getCodeHash(ethAddress)\\n );\\n }\\n\\n /******************************************\\n * Internal Functions: State Manipulation *\\n ******************************************/\\n\\n /**\\n * Checks whether an account exists within the OVM_StateManager.\\n * @param _address Address of the account to check.\\n * @return _exists Whether or not the account exists.\\n */\\n function _hasAccount(\\n address _address\\n )\\n internal\\n returns (\\n bool _exists\\n )\\n {\\n _checkAccountLoad(_address);\\n return ovmStateManager.hasAccount(_address);\\n }\\n\\n /**\\n * Checks whether a known empty account exists within the OVM_StateManager.\\n * @param _address Address of the account to check.\\n * @return _exists Whether or not the account empty exists.\\n */\\n function _hasEmptyAccount(\\n address _address\\n )\\n internal\\n returns (\\n bool _exists\\n )\\n {\\n _checkAccountLoad(_address);\\n return ovmStateManager.hasEmptyAccount(_address);\\n }\\n\\n /**\\n * Sets the nonce of an account.\\n * @param _address Address of the account to modify.\\n * @param _nonce New account nonce.\\n */\\n function _setAccountNonce(\\n address _address,\\n uint256 _nonce\\n )\\n internal\\n {\\n _checkAccountChange(_address);\\n ovmStateManager.setAccountNonce(_address, _nonce);\\n }\\n\\n /**\\n * Gets the nonce of an account.\\n * @param _address Address of the account to access.\\n * @return _nonce Nonce of the account.\\n */\\n function _getAccountNonce(\\n address _address\\n )\\n internal\\n returns (\\n uint256 _nonce\\n )\\n {\\n _checkAccountLoad(_address);\\n return ovmStateManager.getAccountNonce(_address);\\n }\\n\\n /**\\n * Retrieves the Ethereum address of an account.\\n * @param _address Address of the account to access.\\n * @return _ethAddress Corresponding Ethereum address.\\n */\\n function _getAccountEthAddress(\\n address _address\\n )\\n internal\\n returns (\\n address _ethAddress\\n )\\n {\\n _checkAccountLoad(_address);\\n return ovmStateManager.getAccountEthAddress(_address);\\n }\\n\\n /**\\n * Creates the default account object for the given address.\\n * @param _address Address of the account create.\\n */\\n function _initPendingAccount(\\n address _address\\n )\\n internal\\n {\\n // Although it seems like `_checkAccountChange` would be more appropriate here, we don't\\n // actually consider an account \\\"changed\\\" until it's inserted into the state (in this case\\n // by `_commitPendingAccount`).\\n _checkAccountLoad(_address);\\n ovmStateManager.initPendingAccount(_address);\\n }\\n\\n /**\\n * Stores additional relevant data for a new account, thereby \\\"committing\\\" it to the state.\\n * This function is only called during `ovmCREATE` and `ovmCREATE2` after a successful contract\\n * creation.\\n * @param _address Address of the account to commit.\\n * @param _ethAddress Address of the associated deployed contract.\\n * @param _codeHash Hash of the code stored at the address.\\n */\\n function _commitPendingAccount(\\n address _address,\\n address _ethAddress,\\n bytes32 _codeHash\\n )\\n internal\\n {\\n _checkAccountChange(_address);\\n ovmStateManager.commitPendingAccount(\\n _address,\\n _ethAddress,\\n _codeHash\\n );\\n }\\n\\n /**\\n * Retrieves the value of a storage slot.\\n * @param _contract Address of the contract to query.\\n * @param _key 32 byte key of the storage slot.\\n * @return _value 32 byte storage slot value.\\n */\\n function _getContractStorage(\\n address _contract,\\n bytes32 _key\\n )\\n internal\\n returns (\\n bytes32 _value\\n )\\n {\\n _checkContractStorageLoad(_contract, _key);\\n return ovmStateManager.getContractStorage(_contract, _key);\\n }\\n\\n /**\\n * Sets the value of a storage slot.\\n * @param _contract Address of the contract to modify.\\n * @param _key 32 byte key of the storage slot.\\n * @param _value 32 byte storage slot value.\\n */\\n function _putContractStorage(\\n address _contract,\\n bytes32 _key,\\n bytes32 _value\\n )\\n internal\\n {\\n // We don't set storage if the value didn't change. Although this acts as a convenient\\n // optimization, it's also necessary to avoid the case in which a contract with no storage\\n // attempts to store the value \\\"0\\\" at any key. Putting this value (and therefore requiring\\n // that the value be committed into the storage trie after execution) would incorrectly\\n // modify the storage root.\\n if (_getContractStorage(_contract, _key) == _value) {\\n return;\\n }\\n\\n _checkContractStorageChange(_contract, _key);\\n ovmStateManager.putContractStorage(_contract, _key, _value);\\n }\\n\\n /**\\n * Validation whenever a contract needs to be loaded. Checks that the account exists, charges\\n * nuisance gas if the account hasn't been loaded before.\\n * @param _address Address of the account to load.\\n */\\n function _checkAccountLoad(\\n address _address\\n )\\n internal\\n {\\n // See `_checkContractStorageLoad` for more information.\\n if (gasleft() < MIN_GAS_FOR_INVALID_STATE_ACCESS) {\\n _revertWithFlag(RevertFlag.OUT_OF_GAS);\\n }\\n\\n // See `_checkContractStorageLoad` for more information.\\n if (ovmStateManager.hasAccount(_address) == false) {\\n _revertWithFlag(RevertFlag.INVALID_STATE_ACCESS);\\n }\\n\\n // Check whether the account has been loaded before and mark it as loaded if not. We need\\n // this because \\\"nuisance gas\\\" only applies to the first time that an account is loaded.\\n (\\n bool _wasAccountAlreadyLoaded\\n ) = ovmStateManager.testAndSetAccountLoaded(_address);\\n\\n // If we hadn't already loaded the account, then we'll need to charge \\\"nuisance gas\\\" based\\n // on the size of the contract code.\\n if (_wasAccountAlreadyLoaded == false) {\\n _useNuisanceGas(\\n (Lib_EthUtils.getCodeSize(_getAccountEthAddress(_address)) * NUISANCE_GAS_PER_CONTRACT_BYTE) + MIN_NUISANCE_GAS_PER_CONTRACT\\n );\\n }\\n }\\n\\n /**\\n * Validation whenever a contract needs to be changed. Checks that the account exists, charges\\n * nuisance gas if the account hasn't been changed before.\\n * @param _address Address of the account to change.\\n */\\n function _checkAccountChange(\\n address _address\\n )\\n internal\\n {\\n // Start by checking for a load as we only want to charge nuisance gas proportional to\\n // contract size once.\\n _checkAccountLoad(_address);\\n\\n // Check whether the account has been changed before and mark it as changed if not. We need\\n // this because \\\"nuisance gas\\\" only applies to the first time that an account is changed.\\n (\\n bool _wasAccountAlreadyChanged\\n ) = ovmStateManager.testAndSetAccountChanged(_address);\\n\\n // If we hadn't already loaded the account, then we'll need to charge \\\"nuisance gas\\\" based\\n // on the size of the contract code.\\n if (_wasAccountAlreadyChanged == false) {\\n ovmStateManager.incrementTotalUncommittedAccounts();\\n _useNuisanceGas(\\n (Lib_EthUtils.getCodeSize(_getAccountEthAddress(_address)) * NUISANCE_GAS_PER_CONTRACT_BYTE) + MIN_NUISANCE_GAS_PER_CONTRACT\\n );\\n }\\n }\\n\\n /**\\n * Validation whenever a slot needs to be loaded. Checks that the account exists, charges\\n * nuisance gas if the slot hasn't been loaded before.\\n * @param _contract Address of the account to load from.\\n * @param _key 32 byte key to load.\\n */\\n function _checkContractStorageLoad(\\n address _contract,\\n bytes32 _key\\n )\\n internal\\n {\\n // Another case of hidden complexity. If we didn't enforce this requirement, then a\\n // contract could pass in just enough gas to cause the INVALID_STATE_ACCESS check to fail\\n // on L1 but not on L2. A contract could use this behavior to prevent the\\n // OVM_ExecutionManager from detecting an invalid state access. Reverting with OUT_OF_GAS\\n // allows us to also charge for the full message nuisance gas, because you deserve that for\\n // trying to break the contract in this way.\\n if (gasleft() < MIN_GAS_FOR_INVALID_STATE_ACCESS) {\\n _revertWithFlag(RevertFlag.OUT_OF_GAS);\\n }\\n\\n // We need to make sure that the transaction isn't trying to access storage that hasn't\\n // been provided to the OVM_StateManager. We'll immediately abort if this is the case.\\n // We know that we have enough gas to do this check because of the above test.\\n if (ovmStateManager.hasContractStorage(_contract, _key) == false) {\\n _revertWithFlag(RevertFlag.INVALID_STATE_ACCESS);\\n }\\n\\n // Check whether the slot has been loaded before and mark it as loaded if not. We need\\n // this because \\\"nuisance gas\\\" only applies to the first time that a slot is loaded.\\n (\\n bool _wasContractStorageAlreadyLoaded\\n ) = ovmStateManager.testAndSetContractStorageLoaded(_contract, _key);\\n\\n // If we hadn't already loaded the account, then we'll need to charge some fixed amount of\\n // \\\"nuisance gas\\\".\\n if (_wasContractStorageAlreadyLoaded == false) {\\n _useNuisanceGas(NUISANCE_GAS_SLOAD);\\n }\\n }\\n\\n /**\\n * Validation whenever a slot needs to be changed. Checks that the account exists, charges\\n * nuisance gas if the slot hasn't been changed before.\\n * @param _contract Address of the account to change.\\n * @param _key 32 byte key to change.\\n */\\n function _checkContractStorageChange(\\n address _contract,\\n bytes32 _key\\n )\\n internal\\n {\\n // Start by checking for load to make sure we have the storage slot and that we charge the\\n // \\\"nuisance gas\\\" necessary to prove the storage slot state.\\n _checkContractStorageLoad(_contract, _key);\\n\\n // Check whether the slot has been changed before and mark it as changed if not. We need\\n // this because \\\"nuisance gas\\\" only applies to the first time that a slot is changed.\\n (\\n bool _wasContractStorageAlreadyChanged\\n ) = ovmStateManager.testAndSetContractStorageChanged(_contract, _key);\\n\\n // If we hadn't already changed the account, then we'll need to charge some fixed amount of\\n // \\\"nuisance gas\\\".\\n if (_wasContractStorageAlreadyChanged == false) {\\n // Changing a storage slot means that we're also going to have to change the\\n // corresponding account, so do an account change check.\\n _checkAccountChange(_contract);\\n\\n ovmStateManager.incrementTotalUncommittedContractStorage();\\n _useNuisanceGas(NUISANCE_GAS_SSTORE);\\n }\\n }\\n\\n\\n /************************************\\n * Internal Functions: Revert Logic *\\n ************************************/\\n\\n /**\\n * Simple encoding for revert data.\\n * @param _flag Flag to revert with.\\n * @param _data Additional user-provided revert data.\\n * @return _revertdata Encoded revert data.\\n */\\n function _encodeRevertData(\\n RevertFlag _flag,\\n bytes memory _data\\n )\\n internal\\n view\\n returns (\\n bytes memory _revertdata\\n )\\n {\\n // Out of gas and create exceptions will fundamentally return no data, so simulating it shouldn't either.\\n if (\\n _flag == RevertFlag.OUT_OF_GAS\\n ) {\\n return bytes('');\\n }\\n\\n // INVALID_STATE_ACCESS doesn't need to return any data other than the flag.\\n if (_flag == RevertFlag.INVALID_STATE_ACCESS) {\\n return abi.encode(\\n _flag,\\n 0,\\n 0,\\n bytes('')\\n );\\n }\\n\\n // Just ABI encode the rest of the parameters.\\n return abi.encode(\\n _flag,\\n messageRecord.nuisanceGasLeft,\\n transactionRecord.ovmGasRefund,\\n _data\\n );\\n }\\n\\n /**\\n * Simple decoding for revert data.\\n * @param _revertdata Revert data to decode.\\n * @return _flag Flag used to revert.\\n * @return _nuisanceGasLeft Amount of nuisance gas unused by the message.\\n * @return _ovmGasRefund Amount of gas refunded during the message.\\n * @return _data Additional user-provided revert data.\\n */\\n function _decodeRevertData(\\n bytes memory _revertdata\\n )\\n internal\\n pure\\n returns (\\n RevertFlag _flag,\\n uint256 _nuisanceGasLeft,\\n uint256 _ovmGasRefund,\\n bytes memory _data\\n )\\n {\\n // A length of zero means the call ran out of gas, just return empty data.\\n if (_revertdata.length == 0) {\\n return (\\n RevertFlag.OUT_OF_GAS,\\n 0,\\n 0,\\n bytes('')\\n );\\n }\\n\\n // ABI decode the incoming data.\\n return abi.decode(_revertdata, (RevertFlag, uint256, uint256, bytes));\\n }\\n\\n /**\\n * Causes a message to revert or abort.\\n * @param _flag Flag to revert with.\\n * @param _data Additional user-provided data.\\n */\\n function _revertWithFlag(\\n RevertFlag _flag,\\n bytes memory _data\\n )\\n internal\\n view\\n {\\n bytes memory revertdata = _encodeRevertData(\\n _flag,\\n _data\\n );\\n\\n assembly {\\n revert(add(revertdata, 0x20), mload(revertdata))\\n }\\n }\\n\\n /**\\n * Causes a message to revert or abort.\\n * @param _flag Flag to revert with.\\n */\\n function _revertWithFlag(\\n RevertFlag _flag\\n )\\n internal\\n {\\n _revertWithFlag(_flag, bytes(''));\\n }\\n\\n\\n /******************************************\\n * Internal Functions: Nuisance Gas Logic *\\n ******************************************/\\n\\n /**\\n * Computes the nuisance gas limit from the gas limit.\\n * @dev This function is currently using a naive implementation whereby the nuisance gas limit\\n * is set to exactly equal the lesser of the gas limit or remaining gas. It's likely that\\n * this implementation is perfectly fine, but we may change this formula later.\\n * @param _gasLimit Gas limit to compute from.\\n * @return _nuisanceGasLimit Computed nuisance gas limit.\\n */\\n function _getNuisanceGasLimit(\\n uint256 _gasLimit\\n )\\n internal\\n view\\n returns (\\n uint256 _nuisanceGasLimit\\n )\\n {\\n return _gasLimit < gasleft() ? _gasLimit : gasleft();\\n }\\n\\n /**\\n * Uses a certain amount of nuisance gas.\\n * @param _amount Amount of nuisance gas to use.\\n */\\n function _useNuisanceGas(\\n uint256 _amount\\n )\\n internal\\n {\\n // Essentially the same as a standard OUT_OF_GAS, except we also retain a record of the gas\\n // refund to be given at the end of the transaction.\\n if (messageRecord.nuisanceGasLeft < _amount) {\\n _revertWithFlag(RevertFlag.EXCEEDS_NUISANCE_GAS);\\n }\\n\\n messageRecord.nuisanceGasLeft -= _amount;\\n }\\n\\n\\n /************************************\\n * Internal Functions: Gas Metering *\\n ************************************/\\n\\n /**\\n * Checks whether a transaction needs to start a new epoch and does so if necessary.\\n * @param _timestamp Transaction timestamp.\\n */\\n function _checkNeedsNewEpoch(\\n uint256 _timestamp\\n )\\n internal\\n {\\n if (\\n _timestamp >= (\\n _getGasMetadata(GasMetadataKey.CURRENT_EPOCH_START_TIMESTAMP)\\n + gasMeterConfig.secondsPerEpoch\\n )\\n ) {\\n _putGasMetadata(\\n GasMetadataKey.CURRENT_EPOCH_START_TIMESTAMP,\\n _timestamp\\n );\\n\\n _putGasMetadata(\\n GasMetadataKey.PREV_EPOCH_SEQUENCER_QUEUE_GAS,\\n _getGasMetadata(\\n GasMetadataKey.CUMULATIVE_SEQUENCER_QUEUE_GAS\\n )\\n );\\n\\n _putGasMetadata(\\n GasMetadataKey.PREV_EPOCH_L1TOL2_QUEUE_GAS,\\n _getGasMetadata(\\n GasMetadataKey.CUMULATIVE_L1TOL2_QUEUE_GAS\\n )\\n );\\n }\\n }\\n\\n /**\\n * Validates the input values of a transaction.\\n * @return _valid Whether or not the transaction data is valid.\\n */\\n function _isValidInput(\\n Lib_OVMCodec.Transaction memory _transaction\\n )\\n view\\n internal\\n returns (\\n bool\\n )\\n {\\n // Prevent reentrancy to run():\\n // This check prevents calling run with the default ovmNumber.\\n // Combined with the first check in run():\\n // if (transactionContext.ovmNUMBER != DEFAULT_UINT256) { return; }\\n // It should be impossible to re-enter since run() returns before any other call frames are created.\\n // Since this value is already being written to storage, we save much gas compared to\\n // using the standard nonReentrant pattern.\\n if (_transaction.blockNumber == DEFAULT_UINT256) {\\n return false;\\n }\\n\\n if (_isValidGasLimit(_transaction.gasLimit, _transaction.l1QueueOrigin) == false) {\\n return false;\\n }\\n\\n return true;\\n }\\n\\n /**\\n * Validates the gas limit for a given transaction.\\n * @param _gasLimit Gas limit provided by the transaction.\\n * param _queueOrigin Queue from which the transaction originated.\\n * @return _valid Whether or not the gas limit is valid.\\n */\\n function _isValidGasLimit(\\n uint256 _gasLimit,\\n Lib_OVMCodec.QueueOrigin // _queueOrigin\\n )\\n view\\n internal\\n returns (\\n bool _valid\\n )\\n {\\n // Always have to be below the maximum gas limit.\\n if (_gasLimit > gasMeterConfig.maxTransactionGasLimit) {\\n return false;\\n }\\n\\n // Always have to be above the minimum gas limit.\\n if (_gasLimit < gasMeterConfig.minTransactionGasLimit) {\\n return false;\\n }\\n\\n // TEMPORARY: Gas metering is disabled for minnet.\\n return true;\\n // GasMetadataKey cumulativeGasKey;\\n // GasMetadataKey prevEpochGasKey;\\n // if (_queueOrigin == Lib_OVMCodec.QueueOrigin.SEQUENCER_QUEUE) {\\n // cumulativeGasKey = GasMetadataKey.CUMULATIVE_SEQUENCER_QUEUE_GAS;\\n // prevEpochGasKey = GasMetadataKey.PREV_EPOCH_SEQUENCER_QUEUE_GAS;\\n // } else {\\n // cumulativeGasKey = GasMetadataKey.CUMULATIVE_L1TOL2_QUEUE_GAS;\\n // prevEpochGasKey = GasMetadataKey.PREV_EPOCH_L1TOL2_QUEUE_GAS;\\n // }\\n\\n // return (\\n // (\\n // _getGasMetadata(cumulativeGasKey)\\n // - _getGasMetadata(prevEpochGasKey)\\n // + _gasLimit\\n // ) < gasMeterConfig.maxGasPerQueuePerEpoch\\n // );\\n }\\n\\n /**\\n * Updates the cumulative gas after a transaction.\\n * @param _gasUsed Gas used by the transaction.\\n * @param _queueOrigin Queue from which the transaction originated.\\n */\\n function _updateCumulativeGas(\\n uint256 _gasUsed,\\n Lib_OVMCodec.QueueOrigin _queueOrigin\\n )\\n internal\\n {\\n GasMetadataKey cumulativeGasKey;\\n if (_queueOrigin == Lib_OVMCodec.QueueOrigin.SEQUENCER_QUEUE) {\\n cumulativeGasKey = GasMetadataKey.CUMULATIVE_SEQUENCER_QUEUE_GAS;\\n } else {\\n cumulativeGasKey = GasMetadataKey.CUMULATIVE_L1TOL2_QUEUE_GAS;\\n }\\n\\n _putGasMetadata(\\n cumulativeGasKey,\\n (\\n _getGasMetadata(cumulativeGasKey)\\n + gasMeterConfig.minTransactionGasLimit\\n + _gasUsed\\n - transactionRecord.ovmGasRefund\\n )\\n );\\n }\\n\\n /**\\n * Retrieves the value of a gas metadata key.\\n * @param _key Gas metadata key to retrieve.\\n * @return _value Value stored at the given key.\\n */\\n function _getGasMetadata(\\n GasMetadataKey _key\\n )\\n internal\\n returns (\\n uint256 _value\\n )\\n {\\n return uint256(_getContractStorage(\\n GAS_METADATA_ADDRESS,\\n bytes32(uint256(_key))\\n ));\\n }\\n\\n /**\\n * Sets the value of a gas metadata key.\\n * @param _key Gas metadata key to set.\\n * @param _value Value to store at the given key.\\n */\\n function _putGasMetadata(\\n GasMetadataKey _key,\\n uint256 _value\\n )\\n internal\\n {\\n _putContractStorage(\\n GAS_METADATA_ADDRESS,\\n bytes32(uint256(_key)),\\n bytes32(uint256(_value))\\n );\\n }\\n\\n\\n /*****************************************\\n * Internal Functions: Execution Context *\\n *****************************************/\\n\\n /**\\n * Swaps over to a new message context.\\n * @param _prevMessageContext Context we're switching from.\\n * @param _nextMessageContext Context we're switching to.\\n */\\n function _switchMessageContext(\\n MessageContext memory _prevMessageContext,\\n MessageContext memory _nextMessageContext\\n )\\n internal\\n {\\n // Avoid unnecessary the SSTORE.\\n if (_prevMessageContext.ovmCALLER != _nextMessageContext.ovmCALLER) {\\n messageContext.ovmCALLER = _nextMessageContext.ovmCALLER;\\n }\\n\\n // Avoid unnecessary the SSTORE.\\n if (_prevMessageContext.ovmADDRESS != _nextMessageContext.ovmADDRESS) {\\n messageContext.ovmADDRESS = _nextMessageContext.ovmADDRESS;\\n }\\n\\n // Avoid unnecessary the SSTORE.\\n if (_prevMessageContext.isStatic != _nextMessageContext.isStatic) {\\n messageContext.isStatic = _nextMessageContext.isStatic;\\n }\\n }\\n\\n /**\\n * Initializes the execution context.\\n * @param _transaction OVM transaction being executed.\\n */\\n function _initContext(\\n Lib_OVMCodec.Transaction memory _transaction\\n )\\n internal\\n {\\n transactionContext.ovmTIMESTAMP = _transaction.timestamp;\\n transactionContext.ovmNUMBER = _transaction.blockNumber;\\n transactionContext.ovmTXGASLIMIT = _transaction.gasLimit;\\n transactionContext.ovmL1QUEUEORIGIN = _transaction.l1QueueOrigin;\\n transactionContext.ovmL1TXORIGIN = _transaction.l1TxOrigin;\\n transactionContext.ovmGASLIMIT = gasMeterConfig.maxGasPerQueuePerEpoch;\\n\\n messageRecord.nuisanceGasLeft = _getNuisanceGasLimit(_transaction.gasLimit);\\n }\\n\\n /**\\n * Resets the transaction and message context.\\n */\\n function _resetContext()\\n internal\\n {\\n transactionContext.ovmL1TXORIGIN = DEFAULT_ADDRESS;\\n transactionContext.ovmTIMESTAMP = DEFAULT_UINT256;\\n transactionContext.ovmNUMBER = DEFAULT_UINT256;\\n transactionContext.ovmGASLIMIT = DEFAULT_UINT256;\\n transactionContext.ovmTXGASLIMIT = DEFAULT_UINT256;\\n transactionContext.ovmL1QUEUEORIGIN = Lib_OVMCodec.QueueOrigin.SEQUENCER_QUEUE;\\n\\n transactionRecord.ovmGasRefund = DEFAULT_UINT256;\\n\\n messageContext.ovmCALLER = DEFAULT_ADDRESS;\\n messageContext.ovmADDRESS = DEFAULT_ADDRESS;\\n messageContext.isStatic = false;\\n\\n messageRecord.nuisanceGasLeft = DEFAULT_UINT256;\\n\\n // Reset the ovmStateManager.\\n ovmStateManager = iOVM_StateManager(address(0));\\n }\\n\\n /*****************************\\n * L2-only Helper Functions *\\n *****************************/\\n\\n /**\\n * Unreachable helper function for simulating eth_calls with an OVM message context.\\n * This function will throw an exception in all cases other than when used as a custom entrypoint in L2 Geth to simulate eth_call.\\n * @param _transaction the message transaction to simulate.\\n * @param _from the OVM account the simulated call should be from.\\n */\\n function simulateMessage(\\n Lib_OVMCodec.Transaction memory _transaction,\\n address _from,\\n iOVM_StateManager _ovmStateManager\\n )\\n external\\n returns (\\n bool,\\n bytes memory\\n )\\n {\\n // Prevent this call from having any effect unless in a custom-set VM frame\\n require(msg.sender == address(0));\\n\\n ovmStateManager = _ovmStateManager;\\n _initContext(_transaction);\\n messageRecord.nuisanceGasLeft = uint(-1);\\n\\n messageContext.ovmADDRESS = _from;\\n\\n bool isCreate = _transaction.entrypoint == address(0);\\n if (isCreate) {\\n (address created, bytes memory revertData) = ovmCREATE(_transaction.data);\\n if (created == address(0)) {\\n return (false, revertData);\\n } else {\\n // The eth_call RPC endpoint for to = undefined will return the deployed bytecode\\n // in the success case, differing from standard create messages.\\n return (true, Lib_EthUtils.getCode(created));\\n }\\n } else {\\n return ovmCALL(\\n _transaction.gasLimit,\\n _transaction.entrypoint,\\n _transaction.data\\n );\\n }\\n }\\n}\\n\",\"keccak256\":\"0x229011db3d21b69e16814325f8e5debbdf6219b3dffb4011a24f2a6540a0d98e\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/predeploys/OVM_DeployerWhitelist.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Interface Imports */\\nimport { iOVM_DeployerWhitelist } from \\\"../../iOVM/predeploys/iOVM_DeployerWhitelist.sol\\\";\\n\\n/**\\n * @title OVM_DeployerWhitelist\\n * @dev The Deployer Whitelist is a temporary predeploy used to provide additional safety during the\\n * initial phases of our mainnet roll out. It is owned by the Optimism team, and defines accounts\\n * which are allowed to deploy contracts on Layer2. The Execution Manager will only allow an\\n * ovmCREATE or ovmCREATE2 operation to proceed if the deployer's address whitelisted.\\n *\\n * Compiler used: optimistic-solc\\n * Runtime target: OVM\\n */\\ncontract OVM_DeployerWhitelist is iOVM_DeployerWhitelist {\\n\\n /**********************\\n * Contract Constants *\\n **********************/\\n\\n bool public initialized;\\n bool public allowArbitraryDeployment;\\n address override public owner;\\n mapping (address => bool) public whitelist;\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n /**\\n * Blocks functions to anyone except the contract owner.\\n */\\n modifier onlyOwner() {\\n require(\\n msg.sender == owner,\\n \\\"Function can only be called by the owner of this contract.\\\"\\n );\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Initializes the whitelist.\\n * @param _owner Address of the owner for this contract.\\n * @param _allowArbitraryDeployment Whether or not to allow arbitrary contract deployment.\\n */\\n function initialize(\\n address _owner,\\n bool _allowArbitraryDeployment\\n )\\n override\\n public\\n {\\n if (initialized == true) {\\n return;\\n }\\n\\n initialized = true;\\n allowArbitraryDeployment = _allowArbitraryDeployment;\\n owner = _owner;\\n }\\n\\n /**\\n * Adds or removes an address from the deployment whitelist.\\n * @param _deployer Address to update permissions for.\\n * @param _isWhitelisted Whether or not the address is whitelisted.\\n */\\n function setWhitelistedDeployer(\\n address _deployer,\\n bool _isWhitelisted\\n )\\n override\\n public\\n onlyOwner\\n {\\n whitelist[_deployer] = _isWhitelisted;\\n }\\n\\n /**\\n * Updates the owner of this contract.\\n * @param _owner Address of the new owner.\\n */\\n function setOwner(\\n address _owner\\n )\\n override\\n public\\n onlyOwner\\n {\\n owner = _owner;\\n }\\n\\n /**\\n * Updates the arbitrary deployment flag.\\n * @param _allowArbitraryDeployment Whether or not to allow arbitrary contract deployment.\\n */\\n function setAllowArbitraryDeployment(\\n bool _allowArbitraryDeployment\\n )\\n override\\n public\\n onlyOwner\\n {\\n allowArbitraryDeployment = _allowArbitraryDeployment;\\n }\\n\\n /**\\n * Permanently enables arbitrary contract deployment and deletes the owner.\\n */\\n function enableArbitraryContractDeployment()\\n override\\n public\\n onlyOwner\\n {\\n setAllowArbitraryDeployment(true);\\n setOwner(address(0));\\n }\\n\\n /**\\n * Checks whether an address is allowed to deploy contracts.\\n * @param _deployer Address to check.\\n * @return _allowed Whether or not the address can deploy contracts.\\n */\\n function isDeployerAllowed(\\n address _deployer\\n )\\n override\\n public\\n returns (\\n bool\\n )\\n {\\n return (\\n initialized == false\\n || allowArbitraryDeployment == true\\n || whitelist[_deployer]\\n );\\n }\\n}\\n\",\"keccak256\":\"0x371e3d3ca1dd4177738b55eead9ad6f8278280e568694df6b42ee01f5558ccb2\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/execution/iOVM_ExecutionManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\ninterface iOVM_ExecutionManager {\\n /**********\\n * Enums *\\n *********/\\n\\n enum RevertFlag {\\n OUT_OF_GAS,\\n INTENTIONAL_REVERT,\\n EXCEEDS_NUISANCE_GAS,\\n INVALID_STATE_ACCESS,\\n UNSAFE_BYTECODE,\\n CREATE_COLLISION,\\n STATIC_VIOLATION,\\n CREATOR_NOT_ALLOWED\\n }\\n\\n enum GasMetadataKey {\\n CURRENT_EPOCH_START_TIMESTAMP,\\n CUMULATIVE_SEQUENCER_QUEUE_GAS,\\n CUMULATIVE_L1TOL2_QUEUE_GAS,\\n PREV_EPOCH_SEQUENCER_QUEUE_GAS,\\n PREV_EPOCH_L1TOL2_QUEUE_GAS\\n }\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct GasMeterConfig {\\n uint256 minTransactionGasLimit;\\n uint256 maxTransactionGasLimit;\\n uint256 maxGasPerQueuePerEpoch;\\n uint256 secondsPerEpoch;\\n }\\n\\n struct GlobalContext {\\n uint256 ovmCHAINID;\\n }\\n\\n struct TransactionContext {\\n Lib_OVMCodec.QueueOrigin ovmL1QUEUEORIGIN;\\n uint256 ovmTIMESTAMP;\\n uint256 ovmNUMBER;\\n uint256 ovmGASLIMIT;\\n uint256 ovmTXGASLIMIT;\\n address ovmL1TXORIGIN;\\n }\\n\\n struct TransactionRecord {\\n uint256 ovmGasRefund;\\n }\\n\\n struct MessageContext {\\n address ovmCALLER;\\n address ovmADDRESS;\\n bool isStatic;\\n }\\n\\n struct MessageRecord {\\n uint256 nuisanceGasLeft;\\n }\\n\\n\\n /************************************\\n * Transaction Execution Entrypoint *\\n ************************************/\\n\\n function run(\\n Lib_OVMCodec.Transaction calldata _transaction,\\n address _txStateManager\\n ) external returns (bytes memory);\\n\\n\\n /*******************\\n * Context Opcodes *\\n *******************/\\n\\n function ovmCALLER() external view returns (address _caller);\\n function ovmADDRESS() external view returns (address _address);\\n function ovmTIMESTAMP() external view returns (uint256 _timestamp);\\n function ovmNUMBER() external view returns (uint256 _number);\\n function ovmGASLIMIT() external view returns (uint256 _gasLimit);\\n function ovmCHAINID() external view returns (uint256 _chainId);\\n\\n\\n /**********************\\n * L2 Context Opcodes *\\n **********************/\\n\\n function ovmL1QUEUEORIGIN() external view returns (Lib_OVMCodec.QueueOrigin _queueOrigin);\\n function ovmL1TXORIGIN() external view returns (address _l1TxOrigin);\\n\\n\\n /*******************\\n * Halting Opcodes *\\n *******************/\\n\\n function ovmREVERT(bytes memory _data) external;\\n\\n\\n /*****************************\\n * Contract Creation Opcodes *\\n *****************************/\\n\\n function ovmCREATE(bytes memory _bytecode) external returns (address _contract, bytes memory _revertdata);\\n function ovmCREATE2(bytes memory _bytecode, bytes32 _salt) external returns (address _contract, bytes memory _revertdata);\\n\\n\\n /*******************************\\n * Account Abstraction Opcodes *\\n ******************************/\\n\\n function ovmGETNONCE() external returns (uint256 _nonce);\\n function ovmINCREMENTNONCE() external;\\n function ovmCREATEEOA(bytes32 _messageHash, uint8 _v, bytes32 _r, bytes32 _s) external;\\n\\n\\n /****************************\\n * Contract Calling Opcodes *\\n ****************************/\\n\\n function ovmCALL(uint256 _gasLimit, address _address, bytes memory _calldata) external returns (bool _success, bytes memory _returndata);\\n function ovmSTATICCALL(uint256 _gasLimit, address _address, bytes memory _calldata) external returns (bool _success, bytes memory _returndata);\\n function ovmDELEGATECALL(uint256 _gasLimit, address _address, bytes memory _calldata) external returns (bool _success, bytes memory _returndata);\\n\\n\\n /****************************\\n * Contract Storage Opcodes *\\n ****************************/\\n\\n function ovmSLOAD(bytes32 _key) external returns (bytes32 _value);\\n function ovmSSTORE(bytes32 _key, bytes32 _value) external;\\n\\n\\n /*************************\\n * Contract Code Opcodes *\\n *************************/\\n\\n function ovmEXTCODECOPY(address _contract, uint256 _offset, uint256 _length) external returns (bytes memory _code);\\n function ovmEXTCODESIZE(address _contract) external returns (uint256 _size);\\n function ovmEXTCODEHASH(address _contract) external returns (bytes32 _hash);\\n\\n\\n /***************************************\\n * Public Functions: Execution Context *\\n ***************************************/\\n\\n function getMaxTransactionGasLimit() external view returns (uint _maxTransactionGasLimit);\\n}\\n\",\"keccak256\":\"0xf023d5d6fc6a03bd52f7a57af6e21076de77e8925d065bb79db062e73e43b684\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/execution/iOVM_SafetyChecker.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title iOVM_SafetyChecker\\n */\\ninterface iOVM_SafetyChecker {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function isBytecodeSafe(bytes calldata _bytecode) external pure returns (bool);\\n}\\n\",\"keccak256\":\"0xde6639676d4ec4f77297652d5ede2429bc93e74e11fefd9e9de4bc92dd784878\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/execution/iOVM_StateManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title iOVM_StateManager\\n */\\ninterface iOVM_StateManager {\\n\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n enum ItemState {\\n ITEM_UNTOUCHED,\\n ITEM_LOADED,\\n ITEM_CHANGED,\\n ITEM_COMMITTED\\n }\\n\\n /***************************\\n * Public Functions: Misc *\\n ***************************/\\n\\n function isAuthenticated(address _address) external view returns (bool);\\n\\n /***************************\\n * Public Functions: Setup *\\n ***************************/\\n\\n function owner() external view returns (address _owner);\\n function ovmExecutionManager() external view returns (address _ovmExecutionManager);\\n function setExecutionManager(address _ovmExecutionManager) external;\\n\\n\\n /************************************\\n * Public Functions: Account Access *\\n ************************************/\\n\\n function putAccount(address _address, Lib_OVMCodec.Account memory _account) external;\\n function putEmptyAccount(address _address) external;\\n function getAccount(address _address) external view returns (Lib_OVMCodec.Account memory _account);\\n function hasAccount(address _address) external view returns (bool _exists);\\n function hasEmptyAccount(address _address) external view returns (bool _exists);\\n function setAccountNonce(address _address, uint256 _nonce) external;\\n function getAccountNonce(address _address) external view returns (uint256 _nonce);\\n function getAccountEthAddress(address _address) external view returns (address _ethAddress);\\n function getAccountStorageRoot(address _address) external view returns (bytes32 _storageRoot);\\n function initPendingAccount(address _address) external;\\n function commitPendingAccount(address _address, address _ethAddress, bytes32 _codeHash) external;\\n function testAndSetAccountLoaded(address _address) external returns (bool _wasAccountAlreadyLoaded);\\n function testAndSetAccountChanged(address _address) external returns (bool _wasAccountAlreadyChanged);\\n function commitAccount(address _address) external returns (bool _wasAccountCommitted);\\n function incrementTotalUncommittedAccounts() external;\\n function getTotalUncommittedAccounts() external view returns (uint256 _total);\\n function wasAccountChanged(address _address) external view returns (bool);\\n function wasAccountCommitted(address _address) external view returns (bool);\\n\\n\\n /************************************\\n * Public Functions: Storage Access *\\n ************************************/\\n\\n function putContractStorage(address _contract, bytes32 _key, bytes32 _value) external;\\n function getContractStorage(address _contract, bytes32 _key) external view returns (bytes32 _value);\\n function hasContractStorage(address _contract, bytes32 _key) external view returns (bool _exists);\\n function testAndSetContractStorageLoaded(address _contract, bytes32 _key) external returns (bool _wasContractStorageAlreadyLoaded);\\n function testAndSetContractStorageChanged(address _contract, bytes32 _key) external returns (bool _wasContractStorageAlreadyChanged);\\n function commitContractStorage(address _contract, bytes32 _key) external returns (bool _wasContractStorageCommitted);\\n function incrementTotalUncommittedContractStorage() external;\\n function getTotalUncommittedContractStorage() external view returns (uint256 _total);\\n function wasContractStorageChanged(address _contract, bytes32 _key) external view returns (bool);\\n function wasContractStorageCommitted(address _contract, bytes32 _key) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x7a11dbd1f61593ba34debe07e39eef59967307f7f372ba9855bee0953585d08d\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/predeploys/iOVM_DeployerWhitelist.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title iOVM_DeployerWhitelist\\n */\\ninterface iOVM_DeployerWhitelist {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function initialize(address _owner, bool _allowArbitraryDeployment) external;\\n function owner() external returns (address _owner);\\n function setWhitelistedDeployer(address _deployer, bool _isWhitelisted) external;\\n function setOwner(address _newOwner) external;\\n function setAllowArbitraryDeployment(bool _allowArbitraryDeployment) external;\\n function enableArbitraryContractDeployment() external;\\n function isDeployerAllowed(address _deployer) external returns (bool _allowed);\\n}\\n\",\"keccak256\":\"0xdf1f27faf0d26d416bf6d408d146a16de32b4e1772a292c65d39eb7ec2b53ceb\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/codec/Lib_OVMCodec.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../utils/Lib_Bytes32Utils.sol\\\";\\n\\n/**\\n * @title Lib_OVMCodec\\n */\\nlibrary Lib_OVMCodec {\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum QueueOrigin {\\n SEQUENCER_QUEUE,\\n L1TOL2_QUEUE\\n }\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Account {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n address ethAddress;\\n bool isFresh;\\n }\\n\\n struct EVMAccount {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n }\\n\\n struct ChainBatchHeader {\\n uint256 batchIndex;\\n bytes32 batchRoot;\\n uint256 batchSize;\\n uint256 prevTotalElements;\\n bytes extraData;\\n }\\n\\n struct ChainInclusionProof {\\n uint256 index;\\n bytes32[] siblings;\\n }\\n\\n struct Transaction {\\n uint256 timestamp;\\n uint256 blockNumber;\\n QueueOrigin l1QueueOrigin;\\n address l1TxOrigin;\\n address entrypoint;\\n uint256 gasLimit;\\n bytes data;\\n }\\n\\n struct TransactionChainElement {\\n bool isSequenced;\\n uint256 queueIndex; // QUEUED TX ONLY\\n uint256 timestamp; // SEQUENCER TX ONLY\\n uint256 blockNumber; // SEQUENCER TX ONLY\\n bytes txData; // SEQUENCER TX ONLY\\n }\\n\\n struct QueueElement {\\n bytes32 transactionHash;\\n uint40 timestamp;\\n uint40 blockNumber;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Encodes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Encoded transaction bytes.\\n */\\n function encodeTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return abi.encodePacked(\\n _transaction.timestamp,\\n _transaction.blockNumber,\\n _transaction.l1QueueOrigin,\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n );\\n }\\n\\n /**\\n * Hashes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Hashed transaction\\n */\\n function hashTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(encodeTransaction(_transaction));\\n }\\n\\n /**\\n * Converts an OVM account to an EVM account.\\n * @param _in OVM account to convert.\\n * @return Converted EVM account.\\n */\\n function toEVMAccount(\\n Account memory _in\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n return EVMAccount({\\n nonce: _in.nonce,\\n balance: _in.balance,\\n storageRoot: _in.storageRoot,\\n codeHash: _in.codeHash\\n });\\n }\\n\\n /**\\n * @notice RLP-encodes an account state struct.\\n * @param _account Account state struct.\\n * @return RLP-encoded account state.\\n */\\n function encodeEVMAccount(\\n EVMAccount memory _account\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes[] memory raw = new bytes[](4);\\n\\n // Unfortunately we can't create this array outright because\\n // Lib_RLPWriter.writeList will reject fixed-size arrays. Assigning\\n // index-by-index circumvents this issue.\\n raw[0] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.nonce)\\n )\\n );\\n raw[1] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.balance)\\n )\\n );\\n raw[2] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.storageRoot));\\n raw[3] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.codeHash));\\n\\n return Lib_RLPWriter.writeList(raw);\\n }\\n\\n /**\\n * @notice Decodes an RLP-encoded account state into a useful struct.\\n * @param _encoded RLP-encoded account state.\\n * @return Account state struct.\\n */\\n function decodeEVMAccount(\\n bytes memory _encoded\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\\n\\n return EVMAccount({\\n nonce: Lib_RLPReader.readUint256(accountState[0]),\\n balance: Lib_RLPReader.readUint256(accountState[1]),\\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\\n });\\n }\\n\\n /**\\n * Calculates a hash for a given batch header.\\n * @param _batchHeader Header to hash.\\n * @return Hash of the header.\\n */\\n function hashBatchHeader(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(\\n abi.encode(\\n _batchHeader.batchRoot,\\n _batchHeader.batchSize,\\n _batchHeader.prevTotalElements,\\n _batchHeader.extraData\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0xd85ba2066057a2677926f484b938c7c2ef33ff3853f3b71cda252f4a54f30e05\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n public\\n onlyOwner\\n {\\n addresses[_getNameHash(_name)] = _address;\\n\\n emit AddressSet(\\n _name,\\n _address\\n );\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0x2ce671a0e004df88b136bea5a3c59d0732cea8887c8496da1d509e0200b03d7d\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(\\n address _libAddressManager\\n ) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x65981feeabff6a81783ea97d44baf988a18a86c8cb374c46fdb71819cbacc7c0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPReader.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_RLPReader\\n * @dev Adapted from \\\"RLPReader\\\" by Hamdi Allam (hamdi.allam97@gmail.com).\\n */\\nlibrary Lib_RLPReader {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 constant internal MAX_LIST_LENGTH = 32;\\n\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum RLPItemType {\\n DATA_ITEM,\\n LIST_ITEM\\n }\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct RLPItem {\\n uint256 length;\\n uint256 ptr;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts bytes to a reference to memory position and length.\\n * @param _in Input bytes to convert.\\n * @return Output memory reference.\\n */\\n function toRLPItem(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem memory\\n )\\n {\\n uint256 ptr;\\n assembly {\\n ptr := add(_in, 32)\\n }\\n\\n return RLPItem({\\n length: _in.length,\\n ptr: ptr\\n });\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n (\\n uint256 listOffset,\\n ,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.LIST_ITEM,\\n \\\"Invalid RLP list value.\\\"\\n );\\n\\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\\n // writing to the length. Since we can't know the number of RLP items without looping over\\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\\n // simply set a reasonable maximum list length and decrease the size before we finish.\\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\\n\\n uint256 itemCount = 0;\\n uint256 offset = listOffset;\\n while (offset < _in.length) {\\n require(\\n itemCount < MAX_LIST_LENGTH,\\n \\\"Provided RLP list exceeds max list length.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n ) = _decodeLength(RLPItem({\\n length: _in.length - offset,\\n ptr: _in.ptr + offset\\n }));\\n\\n out[itemCount] = RLPItem({\\n length: itemLength + itemOffset,\\n ptr: _in.ptr + offset\\n });\\n\\n itemCount += 1;\\n offset += itemOffset + itemLength;\\n }\\n\\n // Decrease the array size to match the actual item count.\\n assembly {\\n mstore(out, itemCount)\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n return readList(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes value.\\\"\\n );\\n\\n return _copy(_in.ptr, itemOffset, itemLength);\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return readBytes(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return string(readBytes(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return readString(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n require(\\n _in.length <= 33,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr + itemOffset;\\n bytes32 out;\\n assembly {\\n out := mload(ptr)\\n\\n // Shift the bytes over to match the item size.\\n if lt(itemLength, 32) {\\n out := div(out, exp(256, sub(32, itemLength)))\\n }\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return readBytes32(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return uint256(readBytes32(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return readUint256(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n require(\\n _in.length == 1,\\n \\\"Invalid RLP boolean value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 out;\\n assembly {\\n out := byte(0, mload(ptr))\\n }\\n\\n require(\\n out == 0 || out == 1,\\n \\\"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\\\"\\n );\\n\\n return out != 0;\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return readBool(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n if (_in.length == 1) {\\n return address(0);\\n }\\n\\n require(\\n _in.length == 21,\\n \\\"Invalid RLP address value.\\\"\\n );\\n\\n return address(readUint256(_in));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return readAddress(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads the raw bytes of an RLP item.\\n * @param _in RLP item to read.\\n * @return Raw RLP bytes.\\n */\\n function readRawBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in);\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Decodes the length of an RLP item.\\n * @param _in RLP item to decode.\\n * @return Offset of the encoded data.\\n * @return Length of the encoded data.\\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\\n */\\n function _decodeLength(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n uint256,\\n uint256,\\n RLPItemType\\n )\\n {\\n require(\\n _in.length > 0,\\n \\\"RLP item cannot be null.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 prefix;\\n assembly {\\n prefix := byte(0, mload(ptr))\\n }\\n\\n if (prefix <= 0x7f) {\\n // Single byte.\\n\\n return (0, 1, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xb7) {\\n // Short string.\\n\\n uint256 strLen = prefix - 0x80;\\n\\n require(\\n _in.length > strLen,\\n \\\"Invalid RLP short string.\\\"\\n );\\n\\n return (1, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xbf) {\\n // Long string.\\n uint256 lenOfStrLen = prefix - 0xb7;\\n\\n require(\\n _in.length > lenOfStrLen,\\n \\\"Invalid RLP long string length.\\\"\\n );\\n\\n uint256 strLen;\\n assembly {\\n // Pick out the string length.\\n strLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfStrLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfStrLen + strLen,\\n \\\"Invalid RLP long string.\\\"\\n );\\n\\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xf7) {\\n // Short list.\\n uint256 listLen = prefix - 0xc0;\\n\\n require(\\n _in.length > listLen,\\n \\\"Invalid RLP short list.\\\"\\n );\\n\\n return (1, listLen, RLPItemType.LIST_ITEM);\\n } else {\\n // Long list.\\n uint256 lenOfListLen = prefix - 0xf7;\\n\\n require(\\n _in.length > lenOfListLen,\\n \\\"Invalid RLP long list length.\\\"\\n );\\n\\n uint256 listLen;\\n assembly {\\n // Pick out the list length.\\n listLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfListLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfListLen + listLen,\\n \\\"Invalid RLP long list.\\\"\\n );\\n\\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\\n }\\n }\\n\\n /**\\n * Copies the bytes from a memory location.\\n * @param _src Pointer to the location to read from.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Copied bytes.\\n */\\n function _copy(\\n uint256 _src,\\n uint256 _offset,\\n uint256 _length\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out = new bytes(_length);\\n if (out.length == 0) {\\n return out;\\n }\\n\\n uint256 src = _src + _offset;\\n uint256 dest;\\n assembly {\\n dest := add(out, 32)\\n }\\n\\n // Copy over as many complete words as we can.\\n for (uint256 i = 0; i < _length / 32; i++) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n\\n src += 32;\\n dest += 32;\\n }\\n\\n // Pick out the remaining bytes.\\n uint256 mask = 256 ** (32 - (_length % 32)) - 1;\\n assembly {\\n mstore(\\n dest,\\n or(\\n and(mload(src), not(mask)),\\n and(mload(dest), mask)\\n )\\n )\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Copies an RLP item into bytes.\\n * @param _in RLP item to copy.\\n * @return Copied bytes.\\n */\\n function _copy(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in.ptr, 0, _in.length);\\n }\\n}\\n\",\"keccak256\":\"0x829174c61216dce35fdb888383b6022e0365eb7fbdc71ad79d98b108091969fe\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPWriter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/**\\n * @title Lib_RLPWriter\\n * @author Bakaoh (with modifications)\\n */\\nlibrary Lib_RLPWriter {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * RLP encodes a byte string.\\n * @param _in The byte string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded;\\n\\n if (_in.length == 1 && uint8(_in[0]) < 128) {\\n encoded = _in;\\n } else {\\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * RLP encodes a list of RLP encoded byte byte strings.\\n * @param _in The list of RLP encoded byte strings.\\n * @return The RLP encoded list of items in bytes.\\n */\\n function writeList(\\n bytes[] memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory list = _flatten(_in);\\n return abi.encodePacked(_writeLength(list.length, 192), list);\\n }\\n\\n /**\\n * RLP encodes a string.\\n * @param _in The string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeString(\\n string memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(bytes(_in));\\n }\\n\\n /**\\n * RLP encodes an address.\\n * @param _in The address to encode.\\n * @return The RLP encoded address in bytes.\\n */\\n function writeAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a bytes32 value.\\n * @param _in The bytes32 to encode.\\n * @return _out The RLP encoded bytes32 in bytes.\\n */\\n function writeBytes32(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a uint.\\n * @param _in The uint256 to encode.\\n * @return The RLP encoded uint256 in bytes.\\n */\\n function writeUint(\\n uint256 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(_toBinary(_in));\\n }\\n\\n /**\\n * RLP encodes a bool.\\n * @param _in The bool to encode.\\n * @return The RLP encoded bool in bytes.\\n */\\n function writeBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded = new bytes(1);\\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\\n return encoded;\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\\n * @param _len The length of the string or the payload.\\n * @param _offset 128 if item is string, 192 if item is list.\\n * @return RLP encoded bytes.\\n */\\n function _writeLength(\\n uint256 _len,\\n uint256 _offset\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded;\\n\\n if (_len < 56) {\\n encoded = new bytes(1);\\n encoded[0] = byte(uint8(_len) + uint8(_offset));\\n } else {\\n uint256 lenLen;\\n uint256 i = 1;\\n while (_len / i != 0) {\\n lenLen++;\\n i *= 256;\\n }\\n\\n encoded = new bytes(lenLen + 1);\\n encoded[0] = byte(uint8(lenLen) + uint8(_offset) + 55);\\n for(i = 1; i <= lenLen; i++) {\\n encoded[i] = byte(uint8((_len / (256**(lenLen-i))) % 256));\\n }\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * Encode integer in big endian binary form with no leading zeroes.\\n * @notice TODO: This should be optimized with assembly to save gas costs.\\n * @param _x The integer to encode.\\n * @return RLP encoded bytes.\\n */\\n function _toBinary(\\n uint256 _x\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory b = abi.encodePacked(_x);\\n\\n uint256 i = 0;\\n for (; i < 32; i++) {\\n if (b[i] != 0) {\\n break;\\n }\\n }\\n\\n bytes memory res = new bytes(32 - i);\\n for (uint256 j = 0; j < res.length; j++) {\\n res[j] = b[i++];\\n }\\n\\n return res;\\n }\\n\\n /**\\n * Copies a piece of memory to another location.\\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\\n * @param _dest Destination location.\\n * @param _src Source location.\\n * @param _len Length of memory to copy.\\n */\\n function _memcpy(\\n uint256 _dest,\\n uint256 _src,\\n uint256 _len\\n )\\n private\\n pure\\n {\\n uint256 dest = _dest;\\n uint256 src = _src;\\n uint256 len = _len;\\n\\n for(; len >= 32; len -= 32) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n dest += 32;\\n src += 32;\\n }\\n\\n uint256 mask = 256 ** (32 - len) - 1;\\n assembly {\\n let srcpart := and(mload(src), not(mask))\\n let destpart := and(mload(dest), mask)\\n mstore(dest, or(destpart, srcpart))\\n }\\n }\\n\\n /**\\n * Flattens a list of byte strings into one byte string.\\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\\n * @param _list List of byte strings to flatten.\\n * @return The flattened byte string.\\n */\\n function _flatten(\\n bytes[] memory _list\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n if (_list.length == 0) {\\n return new bytes(0);\\n }\\n\\n uint256 len;\\n uint256 i = 0;\\n for (; i < _list.length; i++) {\\n len += _list[i].length;\\n }\\n\\n bytes memory flattened = new bytes(len);\\n uint256 flattenedPtr;\\n assembly { flattenedPtr := add(flattened, 0x20) }\\n\\n for(i = 0; i < _list.length; i++) {\\n bytes memory item = _list[i];\\n\\n uint256 listPtr;\\n assembly { listPtr := add(item, 0x20)}\\n\\n _memcpy(flattenedPtr, listPtr, item.length);\\n flattenedPtr += _list[i].length;\\n }\\n\\n return flattened;\\n }\\n}\\n\",\"keccak256\":\"0xb60ee4b03ad372c3deff21d454ab714dd0c18ee3e6f9d45532e209fc59d5a54d\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_Bytes32Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_Byte32Utils\\n */\\nlibrary Lib_Bytes32Utils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \\\"true.\\\"\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as a boolean.\\n */\\n function toBool(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return _in != 0;\\n }\\n\\n /**\\n * Converts a boolean to a bytes32 value.\\n * @param _in Input boolean value.\\n * @return Boolean as a bytes32.\\n */\\n function fromBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in ? 1 : 0));\\n }\\n\\n /**\\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as an address.\\n */\\n function toAddress(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return address(uint160(uint256(_in)));\\n }\\n\\n /**\\n * Converts an address to a bytes32.\\n * @param _in Input address value.\\n * @return Address as a bytes32.\\n */\\n function fromAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in));\\n }\\n\\n /**\\n * Removes the leading zeros from a bytes32 value and returns a new (smaller) bytes value.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 without any leading zeros.\\n */\\n function removeLeadingZeros(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out;\\n\\n assembly {\\n // Figure out how many leading zero bytes to remove.\\n let shift := 0\\n for { let i := 0 } and(lt(i, 32), eq(byte(i, _in), 0)) { i := add(i, 1) } {\\n shift := add(shift, 1)\\n }\\n\\n // Reserve some space for our output and fix the free memory pointer.\\n out := mload(0x40)\\n mstore(0x40, add(out, 0x40))\\n\\n // Shift the value and store it into the output bytes.\\n mstore(add(out, 0x20), shl(mul(shift, 8), _in))\\n\\n // Store the new size (with leading zero bytes removed) in the output byte size.\\n mstore(out, sub(32, shift))\\n }\\n\\n return out;\\n }\\n}\\n\",\"keccak256\":\"0xfa2def593e3fc56a31852c3744aefdaa93cec74e721bfcfeb1e5d166c7c60b64\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_BytesUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_BytesUtils\\n */\\nlibrary Lib_BytesUtils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_start + _length >= _start, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n if (_bytes.length - _start == 0) {\\n return bytes('');\\n }\\n\\n return slice(_bytes, _start, _bytes.length - _start);\\n }\\n\\n function toBytes32PadLeft(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n bytes32 ret;\\n uint256 len = _bytes.length <= 32 ? _bytes.length : 32;\\n assembly {\\n ret := shr(mul(sub(32, len), 8), mload(add(_bytes, 32)))\\n }\\n return ret;\\n }\\n\\n function toBytes32(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n if (_bytes.length < 32) {\\n bytes32 ret;\\n assembly {\\n ret := mload(add(_bytes, 32))\\n }\\n return ret;\\n }\\n\\n return abi.decode(_bytes,(bytes32)); // will truncate if input length > 32 bytes\\n }\\n\\n function toUint256(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return uint256(toBytes32(_bytes));\\n }\\n\\n function toUint24(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n uint24\\n )\\n {\\n require(_start + 3 >= _start, \\\"toUint24_overflow\\\");\\n require(_bytes.length >= _start + 3 , \\\"toUint24_outOfBounds\\\");\\n uint24 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x3), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toUint8(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n uint8\\n )\\n {\\n require(_start + 1 >= _start, \\\"toUint8_overflow\\\");\\n require(_bytes.length >= _start + 1 , \\\"toUint8_outOfBounds\\\");\\n uint8 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x1), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toAddress(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n require(_start + 20 >= _start, \\\"toAddress_overflow\\\");\\n require(_bytes.length >= _start + 20, \\\"toAddress_outOfBounds\\\");\\n address tempAddress;\\n\\n assembly {\\n tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000)\\n }\\n\\n return tempAddress;\\n }\\n\\n function toNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory nibbles = new bytes(_bytes.length * 2);\\n\\n for (uint256 i = 0; i < _bytes.length; i++) {\\n nibbles[i * 2] = _bytes[i] >> 4;\\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\\n }\\n\\n return nibbles;\\n }\\n\\n function fromNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory ret = new bytes(_bytes.length / 2);\\n\\n for (uint256 i = 0; i < ret.length; i++) {\\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\\n }\\n\\n return ret;\\n }\\n\\n function equal(\\n bytes memory _bytes,\\n bytes memory _other\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return keccak256(_bytes) == keccak256(_other);\\n }\\n}\\n\",\"keccak256\":\"0xa5195afe32fb2cf104d156e8f4bd39df1ec79bf6ba232097b9e8e0ee14fbc298\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_ErrorUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/**\\n * @title Lib_ErrorUtils\\n */\\nlibrary Lib_ErrorUtils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Encodes an error string into raw solidity-style revert data.\\n * (i.e. ascii bytes, prefixed with bytes4(keccak(\\\"Error(string))\\\"))\\n * Ref: https://docs.soliditylang.org/en/v0.8.2/control-structures.html?highlight=Error(string)#panic-via-assert-and-error-via-require\\n * @param _reason Reason for the reversion.\\n * @return Standard solidity revert data for the given reason.\\n */\\n function encodeRevertString(\\n string memory _reason\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return abi.encodeWithSignature(\\n \\\"Error(string)\\\",\\n _reason\\n );\\n }\\n}\\n\",\"keccak256\":\"0xfc64ec4a81fb50865b502a0004ed154e8598e1a313db77303fc95e41f536e6b7\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_EthUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// @unsupported: ovm\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"./Lib_Bytes32Utils.sol\\\";\\n\\n/**\\n * @title Lib_EthUtils\\n */\\nlibrary Lib_EthUtils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Gets the code for a given address.\\n * @param _address Address to get code for.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Code read from the contract.\\n */\\n function getCode(\\n address _address,\\n uint256 _offset,\\n uint256 _length\\n )\\n internal\\n view\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory code;\\n assembly {\\n code := mload(0x40)\\n mstore(0x40, add(code, add(_length, 0x20)))\\n mstore(code, _length)\\n extcodecopy(_address, add(code, 0x20), _offset, _length)\\n }\\n\\n return code;\\n }\\n\\n /**\\n * Gets the full code for a given address.\\n * @param _address Address to get code for.\\n * @return Full code of the contract.\\n */\\n function getCode(\\n address _address\\n )\\n internal\\n view\\n returns (\\n bytes memory\\n )\\n {\\n return getCode(\\n _address,\\n 0,\\n getCodeSize(_address)\\n );\\n }\\n\\n /**\\n * Gets the size of a contract's code in bytes.\\n * @param _address Address to get code size for.\\n * @return Size of the contract's code in bytes.\\n */\\n function getCodeSize(\\n address _address\\n )\\n internal\\n view\\n returns (\\n uint256\\n )\\n {\\n uint256 codeSize;\\n assembly {\\n codeSize := extcodesize(_address)\\n }\\n\\n return codeSize;\\n }\\n\\n /**\\n * Gets the hash of a contract's code.\\n * @param _address Address to get a code hash for.\\n * @return Hash of the contract's code.\\n */\\n function getCodeHash(\\n address _address\\n )\\n internal\\n view\\n returns (\\n bytes32\\n )\\n {\\n bytes32 codeHash;\\n assembly {\\n codeHash := extcodehash(_address)\\n }\\n\\n return codeHash;\\n }\\n\\n /**\\n * Creates a contract with some given initialization code.\\n * @param _code Contract initialization code.\\n * @return Address of the created contract.\\n */\\n function createContract(\\n bytes memory _code\\n )\\n internal\\n returns (\\n address\\n )\\n {\\n address created;\\n assembly {\\n created := create(\\n 0,\\n add(_code, 0x20),\\n mload(_code)\\n )\\n }\\n\\n return created;\\n }\\n\\n /**\\n * Computes the address that would be generated by CREATE.\\n * @param _creator Address creating the contract.\\n * @param _nonce Creator's nonce.\\n * @return Address to be generated by CREATE.\\n */\\n function getAddressForCREATE(\\n address _creator,\\n uint256 _nonce\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n bytes[] memory encoded = new bytes[](2);\\n encoded[0] = Lib_RLPWriter.writeAddress(_creator);\\n encoded[1] = Lib_RLPWriter.writeUint(_nonce);\\n\\n bytes memory encodedList = Lib_RLPWriter.writeList(encoded);\\n return Lib_Bytes32Utils.toAddress(keccak256(encodedList));\\n }\\n\\n /**\\n * Computes the address that would be generated by CREATE2.\\n * @param _creator Address creating the contract.\\n * @param _bytecode Bytecode of the contract to be created.\\n * @param _salt 32 byte salt value mixed into the hash.\\n * @return Address to be generated by CREATE2.\\n */\\n function getAddressForCREATE2(\\n address _creator,\\n bytes memory _bytecode,\\n bytes32 _salt\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n bytes32 hashedData = keccak256(abi.encodePacked(\\n byte(0xff),\\n _creator,\\n _salt,\\n keccak256(_bytecode)\\n ));\\n\\n return Lib_Bytes32Utils.toAddress(hashedData);\\n }\\n}\\n\",\"keccak256\":\"0xf29a67d78e61cb472d524b779b32cfcb39a587f4096500d5419e6425ed367d49\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x60806040523480156200001157600080fd5b506040516200313838038062003138833981016040819052620000349162000292565b600080546001600160a01b0319166001600160a01b03851617905560408051808201909152601181527027ab26afa9b0b332ba3ca1b432b1b5b2b960791b60208201526200008290620000d7565b600180546001600160a01b0319166001600160a01b039290921691909117905581516003556020820151600455604082015160055560608201516006558051600755620000ce620001b9565b50505062000337565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b83811015620001395781810151838201526020016200011f565b50505050905090810190601f168015620001675780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b1580156200018557600080fd5b505afa1580156200019a573d6000803e3d6000fd5b505050506040513d6020811015620001b157600080fd5b505192915050565b600d80546001600160a01b031990811673defa017defa017defa017defa017defa017defa09081179092557fdefa017defa017defa017defa017defa017defa017defa017defa017defa017d6009819055600a819055600b819055600c8190556008805460ff191690556010819055600e8054831684179055600f8054831690931760ff60a01b1916909255601191909155600280549091169055565b60006020828403121562000268578081fd5b604051602081016001600160401b03811182821017156200028557fe5b6040529151825250919050565b600080600083850360c0811215620002a8578384fd5b84516001600160a01b0381168114620002bf578485fd5b93506080601f1982011215620002d3578283fd5b50604051608081016001600160401b0381118282101715620002f157fe5b806040525060208501518152604085015160208201526060850151604082015260808501516060820152809250506200032e8560a0860162000256565b90509250925092565b612df180620003476000396000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c80637cebbe94116100f957806399ccd98b11610097578063bdbf8c3611610071578063bdbf8c361461037e578063c1fb2ea214610386578063fcb6829b1461038e578063ffe73914146103a1576101c4565b806399ccd98b146103505780639be3ad67146103635780639dc9dc9314610376576101c4565b806385979f76116100d357806385979f761461031a5780638bb42e151461032d5780639058025614610340578063996d79a514610348576101c4565b80637cebbe94146102de5780638435035b146102e65780638540661f146102f9576101c4565b8063299ca478116101665780635a98c361116101405780635a98c3611461029b57806373509064146102a3578063741a33eb146102ab578063746c32f1146102be576101c4565b8063299ca478146102605780632a2a7adb14610275578063461a447814610288576101c4565b80631c4712a7116101a25780631c4712a71461022857806320160f3a1461023057806322bd64c01461023857806324749d5c1461024d576101c4565b806303daa959146101c9578063101185a4146101f257806314aa2ff714610207575b600080fd5b6101dc6101d73660046125d4565b6103b4565b6040516101e99190612a20565b60405180910390f35b6101fa6103f9565b6040516101e99190612b0b565b61021a610215366004612666565b610402565b6040516101e9929190612a9b565b6101dc61049a565b6101dc6104a0565b61024b610246366004612604565b6104a6565b005b6101dc61025b366004612548565b610509565b610268610524565b6040516101e99190612a29565b61024b610283366004612666565b610533565b610268610296366004612777565b610541565b6101dc61061d565b610268610623565b61024b6102b9366004612625565b610632565b6102d16102cc366004612580565b61079f565b6040516101e99190612af8565b61024b6107bc565b6101dc6102f4366004612548565b610813565b61030c61030736600461286c565b610826565b6040516101e9929190612abf565b61030c61032836600461286c565b61089f565b61030c61033b36600461280b565b6108ee565b6101dc6109c1565b6102686109c7565b61021a61035e366004612698565b6109d6565b6102d16103713660046127bc565b610a69565b610268610bcb565b6101dc610bda565b6101dc610be0565b61024b61039c3660046128c2565b610bf7565b61030c6103af36600461286c565b610de1565b6000619c4060005a905060006103c86109c7565b90506103d48186610e32565b93505060005a82039050808310156103f157601080548483030190555b505050919050565b60085460ff1690565b600f5460009060609060ff600160a01b9091041615156001141561042a5761042a6006610ec0565b619c4060005a9050600061043c6109c7565b905061044781610ed9565b600061045b8261045684610f5e565b610fe9565b90506104678188611083565b95509550505060005a8203905080831015610489576010805484019055610492565b60108054820190555b505050915091565b60045490565b600b5490565b600f5460ff600160a01b909104161515600114156104c8576104c86006610ec0565b61ea6060005a905060006104da6109c7565b90506104e7818686611109565b5060005a820390508083101561050257601080548483030190555b5050505050565b600061051c6105178361118b565b611216565b90505b919050565b6000546001600160a01b031681565b61053e60018261121a565b50565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b838110156105a1578181015183820152602001610589565b50505050905090810190601f1680156105ce5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b1580156105eb57600080fd5b505afa1580156105ff573d6000803e3d6000fd5b505050506040513d602081101561061557600080fd5b505192915050565b600a5490565b600e546001600160a01b031690565b600f5460ff600160a01b90910416151560011415610654576106546006610ec0565b600060018585601b0185856040516000815260200160405260405161067c9493929190612ada565b6020604051602081039080840390855afa15801561069e573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166106da576106da604051806060016040528060388152602001612caa60389139610533565b6106e381611230565b6106ed5750610799565b6106f6816112bb565b600f80546001600160a01b038381166001600160a01b031983161790925516600061075361072f6009602160991b01836102cc82610813565b60405160200161073f91906129ea565b604051602081830303815290604052611322565b600f80546001600160a01b0319166001600160a01b038516179055905061078a838261077e81611335565b8051906020012061134b565b610795836000611388565b5050505b50505050565b60606107b46107ad8561118b565b84846113f9565b949350505050565b600f5460ff600160a01b909104161515600114156107de576107de6006610ec0565b60006107e86109c7565b905060006107f582610f5e565b90508081600101111561080f5761080f8282600101611388565b5050565b600061051c6108218361118b565b61141d565b600060606201388060005a60408051606081018252600f546001600160a01b0390811682528916602082015260019181019190915290915061086a81898989611421565b945094505060005a820390508083101561088b576010805484019055610894565b60108054820190555b505050935093915050565b60006060620186a060005a60408051606081018252600f5460ff600160a01b8204161515928201929092526001600160a01b039182168152908816602082015290915061086a81898989611421565b6000606033156108fd57600080fd5b600280546001600160a01b0319166001600160a01b038516179055610921856114b2565b600019601155600f80546001600160a01b0319166001600160a01b038681169190911790915560808601511615801561099c576000806109648860c00151610402565b90925090506001600160a01b038216610985576000945092506109b9915050565b600161099083611335565b945094505050506109b9565b6109b38660a0015187608001518860c0015161089f565b92509250505b935093915050565b60075490565b600f546001600160a01b031690565b600f5460009060609060ff600160a01b909104161515600114156109fe576109fe6006610ec0565b619c4060005a90506000610a106109c7565b9050610a1b81610ed9565b6000610a28828989611524565b9050610a348189611083565b95509550505060005a8203905080831015610a56576010805484019055610a5f565b60108054820190555b5050509250929050565b600a546060907fdefa017defa017defa017defa017defa017defa017defa017defa017defa017d14610aaa5750604080516020810190915260008152610bc5565b600280546001600160a01b0319166001600160a01b038481169190911791829055604051630d15d41560e41b815291169063d15d415090610aef903390600401612a29565b60206040518083038186803b158015610b0757600080fd5b505afa158015610b1b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b3f91906125b4565b610b645760405162461bcd60e51b8152600401610b5b90612b87565b60405180910390fd5b610b6d836114b2565b610b768361156a565b610b9757610b826115c6565b50604080516020810190915260008152610bc5565b6000610bb76003600001548560a001510385608001518660c0015161089f565b915050610bc26115c6565b90505b92915050565b600d546001600160a01b031690565b60095490565b6000610bf2610bed6109c7565b610f5e565b905090565b333014610c0357610ddc565b610c0c81611230565b610c3b57610c3b6005610c36604051806060016040528060348152602001612d5860349139611663565b61121a565b6001546040516352275acd60e11b81526001600160a01b039091169063a44eb59a90610c6b908590600401612af8565b60206040518083038186803b158015610c8357600080fd5b505afa158015610c97573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cbb91906125b4565b610ce557610ce56004610c366040518060a0016040528060768152602001612ce260769139611663565b610cee816112bb565b6000610cf983611322565b90506001600160a01b038116610d13573d6000803e3d6000fd5b6000610d1e82611335565b6001546040516352275acd60e11b81529192506001600160a01b03169063a44eb59a90610d4f908490600401612af8565b60206040518083038186803b158015610d6757600080fd5b505afa158015610d7b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d9f91906125b4565b610dc957610dc96004610c36604051806060016040528060308152602001612d8c60309139611663565b6105028383610dd785611216565b61134b565b505050565b60006060619c4060005a60408051606081018252600e546001600160a01b039081168252600f549081166020830152600160a01b900460ff1615159181019190915290915061086a81898989611421565b6000610e3e83836116a6565b600254604051631aaf392f60e01b81526001600160a01b0390911690631aaf392f90610e709086908690600401612a61565b60206040518083038186803b158015610e8857600080fd5b505afa158015610e9c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bc291906125ec565b61053e816040518060200160405280600081525061121a565b600080610f285a6002602160991b0185604051602401610ef99190612a29565b60408051601f198184030181529190526020810180516001600160e01b031663b1540a0160e01b17905261089f565b91509150600081806020019051810190610f4291906125b4565b9050801580610f4f575082155b15610799576107996007610ec0565b6000610f69826117e1565b60025460405163d126199f60e01b81526001600160a01b039091169063d126199f90610f99908590600401612a29565b60206040518083038186803b158015610fb157600080fd5b505afa158015610fc5573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061051c91906125ec565b60408051600280825260608201909252600091829190816020015b606081526020019060019003908161100457905050905061102484611928565b8160008151811061103157fe5b602002602001018190525061104583611952565b8160018151811061105257fe5b6020026020010181905250600061106882611965565b905061107a81805190602001206119a9565b95945050505050565b600060606110a56110926109c7565b61109d610bed6109c7565b600101611388565b60408051606081018252600f5460ff600160a01b8204161515928201929092526001600160a01b03918216815290851660208201526000806110eb835a898960016119ac565b91509150816110fb5760006110fd565b865b97909650945050505050565b806111148484610e32565b141561111f57610ddc565b6111298383611c1a565b600254604051635c17d62960e01b81526001600160a01b0390911690635c17d6299061115d90869086908690600401612a7a565b600060405180830381600087803b15801561117757600080fd5b505af1158015610795573d6000803e3d6000fd5b6000611196826117e1565b600254604051637c8ee70360e01b81526001600160a01b0390911690637c8ee703906111c6908590600401612a29565b60206040518083038186803b1580156111de57600080fd5b505afa1580156111f2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061051c9190612564565b3f90565b60006112268383611d2c565b9050805160208201fd5b600061123b826117e1565b6002546040516307a1294560e01b81526001600160a01b03909116906307a129459061126b908590600401612a29565b60206040518083038186803b15801561128357600080fd5b505afa158015611297573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061051c91906125b4565b6112c4816117e1565b600254604051637e78a4d160e11b81526001600160a01b039091169063fcf149a2906112f4908490600401612a29565b600060405180830381600087803b15801561130e57600080fd5b505af1158015610502573d6000803e3d6000fd5b6000808251602084016000f09392505050565b606061051c8260006113468561141d565b6113f9565b61135483611dd5565b6002546040516368510af960e11b81526001600160a01b039091169063d0a215f29061115d90869086908690600401612a3d565b61139182611dd5565b6002546040516374855dc360e11b81526001600160a01b039091169063e90abb86906113c39085908590600401612a61565b600060405180830381600087803b1580156113dd57600080fd5b505af11580156113f1573d6000803e3d6000fd5b505050505050565b6060806040519050602083018101604052828152828460208301873c949350505050565b3b90565b6000606073ffffffffffffffffffffffffffffffffffff0000841673deaddeaddeaddeaddeaddeaddeaddeaddead000014156114705750506040805160208101909152600081526001906114a9565b60006064856001600160a01b0316106114915761148c8561118b565b611493565b845b90506114a38787838760006119ac565b92509250505b94509492505050565b80516009556020810151600a5560a0810151600c5560408101516008805460ff1916600183818111156114e157fe5b02179055506060810151600d80546001600160a01b0319166001600160a01b03909216919091179055600554600b5560a081015161151e90611ee4565b60115550565b60008060ff60f81b858486805190602001206040516020016115499493929190612966565b60405160208183030381529060405280519060200120905061107a816119a9565b60007fdefa017defa017defa017defa017defa017defa017defa017defa017defa017d826020015114156115a05750600061051f565b6115b28260a001518360400151611ef7565b6115be5750600061051f565b506001919050565b600d80546001600160a01b031990811673defa017defa017defa017defa017defa017defa09081179092557fdefa017defa017defa017defa017defa017defa017defa017defa017defa017d6009819055600a819055600b819055600c8190556008805460ff191690556010819055600e8054831684179055600f8054831690931760ff60a01b1916909255601191909155600280549091169055565b6060816040516024016116769190612af8565b60408051601f198184030181529190526020810180516001600160e01b031662461bcd60e51b1790529050919050565b6175305a10156116ba576116ba6000610ec0565b600254604051630ad2267960e01b81526001600160a01b0390911690630ad22679906116ec9085908590600401612a61565b60206040518083038186803b15801561170457600080fd5b505afa158015611718573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061173c91906125b4565b61174a5761174a6003610ec0565b600254604051632bcdee1960e21b81526000916001600160a01b03169063af37b8649061177d9086908690600401612a61565b602060405180830381600087803b15801561179757600080fd5b505af11580156117ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117cf91906125b4565b905080610ddc57610ddc614e20611f27565b6175305a10156117f5576117f56000610ec0565b60025460405163c8e40fbf60e01b81526001600160a01b039091169063c8e40fbf90611825908490600401612a29565b60206040518083038186803b15801561183d57600080fd5b505afa158015611851573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061187591906125b4565b611883576118836003610ec0565b600254604051633ecdecc760e21b81526000916001600160a01b03169063fb37b31c906118b4908590600401612a29565b602060405180830381600087803b1580156118ce57600080fd5b505af11580156118e2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061190691906125b4565b90508061080f5761080f61753060646119216108218661118b565b0201611f27565b606061051c8260405160200161193e9190612949565b604051602081830303815290604052611f47565b606061051c61196083611f99565b611f47565b606060006119728361209d565b9050611980815160c061219d565b816040516020016119929291906129bb565b604051602081830303815290604052915050919050565b90565b6040805160608082018352600e546001600160a01b039081168352600f549081166020840152600160a01b900460ff16151592820192909252600091906119f381896122ed565b6011546000611a0189611ee4565b60118190559050600060608715611abd57604051309063fcb6829b60e01b90611a32908e908d908f90602401612bf3565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909416939093179092529051611a70919061299f565b6000604051808303816000865af19150503d8060008114611aad576040519150601f19603f3d011682016040523d82523d6000602084013e611ab2565b606091505b509092509050611b20565b896001600160a01b03168b8a604051611ad6919061299f565b60006040518083038160008787f1925050503d8060008114611b14576040519150601f19603f3d011682016040523d82523d6000602084013e611b19565b606091505b5090925090505b611b2a8c866122ed565b60115482611c0257600080600080611b41866123a1565b929650909450925090506003846007811115611b5957fe5b1415611b6857611b6884610ec0565b6001846007811115611b7657fe5b1480611b8d57506004846007811115611b8b57fe5b145b80611ba357506006846007811115611ba157fe5b145b80611bb957506007846007811115611bb757fe5b145b15611bc45760108290555b6001846007811115611bd257fe5b1480611bdb57508c5b15611be857809550611bfb565b6040518060200160405280600081525095505b5090925050505b90920390920360115590999098509650505050505050565b611c2482826116a6565b60025460405163af3dc01160e01b81526000916001600160a01b03169063af3dc01190611c579086908690600401612a61565b602060405180830381600087803b158015611c7157600080fd5b505af1158015611c85573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ca991906125b4565b905080610ddc57611cb983611dd5565b600260009054906101000a90046001600160a01b03166001600160a01b031663c3fd9b256040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611d0957600080fd5b505af1158015611d1d573d6000803e3d6000fd5b50505050610ddc614e20611f27565b60606000836007811115611d3c57fe5b1415611d575750604080516020810190915260008152610bc5565b6003836007811115611d6557fe5b1415611da357604080516020808201835260008083529251611d8d9387939092839201612b1f565b6040516020818303038152906040529050610bc5565b601154601054604051611dbe92869290918690602001612b5b565b604051602081830303815290604052905092915050565b611dde816117e1565b60025460405163011b1f7960e41b81526000916001600160a01b0316906311b1f79090611e0f908590600401612a29565b602060405180830381600087803b158015611e2957600080fd5b505af1158015611e3d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e6191906125b4565b90508061080f57600260009054906101000a90046001600160a01b03166001600160a01b03166333f943056040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611eb857600080fd5b505af1158015611ecc573d6000803e3d6000fd5b5050505061080f61753060646119216108218661118b565b60005a8210611ef3575a61051c565b5090565b600454600090831115611f0c57506000610bc5565b600354831015611f1e57506000610bc5565b50600192915050565b601154811115611f3b57611f3b6002610ec0565b60118054919091039055565b60608082516001148015611f6f5750608083600081518110611f6557fe5b016020015160f81c105b15611f7b57508161051c565b611f878351608061219d565b83604051602001611dbe9291906129bb565b6060600082604051602001611fae9190612a20565b604051602081830303815290604052905060005b6020811015611ff857818181518110611fd757fe5b01602001516001600160f81b03191615611ff057611ff8565b600101611fc2565b6000816020036001600160401b038111801561201357600080fd5b506040519080825280601f01601f19166020018201604052801561203e576020820181803683370190505b50905060005b815181101561209457835160018401938591811061205e57fe5b602001015160f81c60f81b82828151811061207557fe5b60200101906001600160f81b031916908160001a905350600101612044565b50949350505050565b60608151600014156120be575060408051600081526020810190915261051f565b6000805b83518110156120f1578381815181106120d757fe5b6020026020010151518201915080806001019150506120c2565b6000826001600160401b038111801561210957600080fd5b506040519080825280601f01601f191660200182016040528015612134576020820181803683370190505b50600092509050602081015b855183101561209457600086848151811061215757fe5b602002602001015190506000602082019050612175838284516123f4565b87858151811061218157fe5b6020026020010151518301925050508280600101935050612140565b60608060388410156121f7576040805160018082528183019092529060208201818036833701905050905082840160f81b816000815181106121db57fe5b60200101906001600160f81b031916908160001a905350610bc2565b600060015b80868161220557fe5b041561221a57600190910190610100026121fc565b816001016001600160401b038111801561223357600080fd5b506040519080825280601f01601f19166020018201604052801561225e576020820181803683370190505b50925084820160370160f81b8360008151811061227757fe5b60200101906001600160f81b031916908160001a905350600190505b8181116122e3576101008183036101000a87816122ac57fe5b04816122b457fe5b0660f81b8382815181106122c457fe5b60200101906001600160f81b031916908160001a905350600101612293565b5050905092915050565b805182516001600160a01b03908116911614612325578051600e80546001600160a01b0319166001600160a01b039092169190911790555b80602001516001600160a01b031682602001516001600160a01b03161461236b576020810151600f80546001600160a01b0319166001600160a01b039092169190911790555b80604001511515826040015115151461080f5760400151600f8054911515600160a01b0260ff60a01b1990921691909117905550565b600080600060608451600014156123d057505060408051602081019091526000808252925082915081906123ed565b848060200190518101906123e491906126da565b93509350935093505b9193509193565b8282825b60208110612417578151835260209283019290910190601f19016123f8565b905182516020929092036101000a6000190180199091169116179052505050565b600061244b61244684612c47565b612c24565b905082815283838301111561245f57600080fd5b828260208301376000602084830101529392505050565b803561051f81612c94565b600082601f830112612491578081fd5b610bc283833560208501612438565b80356002811061051f57600080fd5b600060e082840312156124c0578081fd5b6124ca60e0612c24565b905081358152602082013560208201526124e6604083016124a0565b60408201526124f760608301612476565b606082015261250860808301612476565b608082015260a082013560a082015260c08201356001600160401b0381111561253057600080fd5b61253c84828501612481565b60c08301525092915050565b600060208284031215612559578081fd5b8135610bc281612c94565b600060208284031215612575578081fd5b8151610bc281612c94565b600080600060608486031215612594578182fd5b833561259f81612c94565b95602085013595506040909401359392505050565b6000602082840312156125c5578081fd5b81518015158114610bc2578182fd5b6000602082840312156125e5578081fd5b5035919050565b6000602082840312156125fd578081fd5b5051919050565b60008060408385031215612616578182fd5b50508035926020909101359150565b6000806000806080858703121561263a578081fd5b84359350602085013560ff81168114612651578182fd5b93969395505050506040820135916060013590565b600060208284031215612677578081fd5b81356001600160401b0381111561268c578182fd5b6107b484828501612481565b600080604083850312156126aa578182fd5b82356001600160401b038111156126bf578283fd5b6126cb85828601612481565b95602094909401359450505050565b600080600080608085870312156126ef578182fd5b8451600881106126fd578283fd5b80945050602085015192506040850151915060608501516001600160401b03811115612727578182fd5b8501601f81018713612737578182fd5b805161274561244682612c47565b818152886020838501011115612759578384fd5b61276a826020830160208601612c68565b9598949750929550505050565b600060208284031215612788578081fd5b81356001600160401b0381111561279d578182fd5b8201601f810184136127ad578182fd5b6107b484823560208401612438565b600080604083850312156127ce578182fd5b82356001600160401b038111156127e3578283fd5b6127ef858286016124af565b925050602083013561280081612c94565b809150509250929050565b60008060006060848603121561281f578081fd5b83356001600160401b03811115612834578182fd5b612840868287016124af565b935050602084013561285181612c94565b9150604084013561286181612c94565b809150509250925092565b600080600060608486031215612880578081fd5b83359250602084013561289281612c94565b915060408401356001600160401b038111156128ac578182fd5b6128b886828701612481565b9150509250925092565b6000806000606084860312156128d6578081fd5b8335925060208401356001600160401b038111156128f2578182fd5b6128fe86828701612481565b925050604084013561286181612c94565b60008151808452612927816020860160208601612c68565b601f01601f19169290920160200192915050565b6008811061294557fe5b9052565b60609190911b6bffffffffffffffffffffffff1916815260140190565b6001600160f81b031994909416845260609290921b6bffffffffffffffffffffffff191660018401526015830152603582015260550190565b600082516129b1818460208701612c68565b9190910192915050565b600083516129cd818460208801612c68565b8351908301906129e1818360208801612c68565b01949350505050565b6c600d380380600d6000396000f360981b81528151600090612a1381600d850160208701612c68565b91909101600d0192915050565b90815260200190565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039390931683526020830191909152604082015260600190565b6001600160a01b03831681526040602082018190526000906107b49083018461290f565b60008315158252604060208301526107b4604083018461290f565b93845260ff9290921660208401526040830152606082015260800190565b600060208252610bc2602083018461290f565b6020810160028310612b1957fe5b91905290565b6000612b2b828761293b565b60ff8516602083015260ff8416604083015260806060830152612b51608083018461290f565b9695505050505050565b6000612b67828761293b565b84602083015283604083015260806060830152612b51608083018461290f565b60208082526046908201527f4f6e6c792061757468656e746963617465642061646472657373657320696e2060408201527f6f766d53746174654d616e616765722063616e2063616c6c20746869732066756060820152653731ba34b7b760d11b608082015260a00190565b600084825260606020830152612c0c606083018561290f565b905060018060a01b0383166040830152949350505050565b6040518181016001600160401b0381118282101715612c3f57fe5b604052919050565b60006001600160401b03821115612c5a57fe5b50601f01601f191660200190565b60005b83811015612c83578181015183820152602001612c6b565b838111156107995750506000910152565b6001600160a01b038116811461053e57600080fdfe5369676e61747572652070726f766964656420666f7220454f4120636f6e7472616374206372656174696f6e20697320696e76616c69642e436f6e7472616374206372656174696f6e20636f646520636f6e7461696e7320756e73616665206f70636f6465732e2044696420796f75207573652074686520726967687420636f6d70696c6572206f72207061737320616e20756e7361666520636f6e7374727563746f7220617267756d656e743f4120636f6e74726163742068617320616c7265616479206265656e206465706c6f79656420746f20746869732061646472657373436f6e7374727563746f7220617474656d7074656420746f206465706c6f7920756e736166652062797465636f64652ea2646970667358221220ba09f3066e98cffa8b50d7fb9822c62cac7bc36099454fe6dbe318573486c14d64736f6c63430007060033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101c45760003560e01c80637cebbe94116100f957806399ccd98b11610097578063bdbf8c3611610071578063bdbf8c361461037e578063c1fb2ea214610386578063fcb6829b1461038e578063ffe73914146103a1576101c4565b806399ccd98b146103505780639be3ad67146103635780639dc9dc9314610376576101c4565b806385979f76116100d357806385979f761461031a5780638bb42e151461032d5780639058025614610340578063996d79a514610348576101c4565b80637cebbe94146102de5780638435035b146102e65780638540661f146102f9576101c4565b8063299ca478116101665780635a98c361116101405780635a98c3611461029b57806373509064146102a3578063741a33eb146102ab578063746c32f1146102be576101c4565b8063299ca478146102605780632a2a7adb14610275578063461a447814610288576101c4565b80631c4712a7116101a25780631c4712a71461022857806320160f3a1461023057806322bd64c01461023857806324749d5c1461024d576101c4565b806303daa959146101c9578063101185a4146101f257806314aa2ff714610207575b600080fd5b6101dc6101d73660046125d4565b6103b4565b6040516101e99190612a20565b60405180910390f35b6101fa6103f9565b6040516101e99190612b0b565b61021a610215366004612666565b610402565b6040516101e9929190612a9b565b6101dc61049a565b6101dc6104a0565b61024b610246366004612604565b6104a6565b005b6101dc61025b366004612548565b610509565b610268610524565b6040516101e99190612a29565b61024b610283366004612666565b610533565b610268610296366004612777565b610541565b6101dc61061d565b610268610623565b61024b6102b9366004612625565b610632565b6102d16102cc366004612580565b61079f565b6040516101e99190612af8565b61024b6107bc565b6101dc6102f4366004612548565b610813565b61030c61030736600461286c565b610826565b6040516101e9929190612abf565b61030c61032836600461286c565b61089f565b61030c61033b36600461280b565b6108ee565b6101dc6109c1565b6102686109c7565b61021a61035e366004612698565b6109d6565b6102d16103713660046127bc565b610a69565b610268610bcb565b6101dc610bda565b6101dc610be0565b61024b61039c3660046128c2565b610bf7565b61030c6103af36600461286c565b610de1565b6000619c4060005a905060006103c86109c7565b90506103d48186610e32565b93505060005a82039050808310156103f157601080548483030190555b505050919050565b60085460ff1690565b600f5460009060609060ff600160a01b9091041615156001141561042a5761042a6006610ec0565b619c4060005a9050600061043c6109c7565b905061044781610ed9565b600061045b8261045684610f5e565b610fe9565b90506104678188611083565b95509550505060005a8203905080831015610489576010805484019055610492565b60108054820190555b505050915091565b60045490565b600b5490565b600f5460ff600160a01b909104161515600114156104c8576104c86006610ec0565b61ea6060005a905060006104da6109c7565b90506104e7818686611109565b5060005a820390508083101561050257601080548483030190555b5050505050565b600061051c6105178361118b565b611216565b90505b919050565b6000546001600160a01b031681565b61053e60018261121a565b50565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b838110156105a1578181015183820152602001610589565b50505050905090810190601f1680156105ce5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b1580156105eb57600080fd5b505afa1580156105ff573d6000803e3d6000fd5b505050506040513d602081101561061557600080fd5b505192915050565b600a5490565b600e546001600160a01b031690565b600f5460ff600160a01b90910416151560011415610654576106546006610ec0565b600060018585601b0185856040516000815260200160405260405161067c9493929190612ada565b6020604051602081039080840390855afa15801561069e573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166106da576106da604051806060016040528060388152602001612caa60389139610533565b6106e381611230565b6106ed5750610799565b6106f6816112bb565b600f80546001600160a01b038381166001600160a01b031983161790925516600061075361072f6009602160991b01836102cc82610813565b60405160200161073f91906129ea565b604051602081830303815290604052611322565b600f80546001600160a01b0319166001600160a01b038516179055905061078a838261077e81611335565b8051906020012061134b565b610795836000611388565b5050505b50505050565b60606107b46107ad8561118b565b84846113f9565b949350505050565b600f5460ff600160a01b909104161515600114156107de576107de6006610ec0565b60006107e86109c7565b905060006107f582610f5e565b90508081600101111561080f5761080f8282600101611388565b5050565b600061051c6108218361118b565b61141d565b600060606201388060005a60408051606081018252600f546001600160a01b0390811682528916602082015260019181019190915290915061086a81898989611421565b945094505060005a820390508083101561088b576010805484019055610894565b60108054820190555b505050935093915050565b60006060620186a060005a60408051606081018252600f5460ff600160a01b8204161515928201929092526001600160a01b039182168152908816602082015290915061086a81898989611421565b6000606033156108fd57600080fd5b600280546001600160a01b0319166001600160a01b038516179055610921856114b2565b600019601155600f80546001600160a01b0319166001600160a01b038681169190911790915560808601511615801561099c576000806109648860c00151610402565b90925090506001600160a01b038216610985576000945092506109b9915050565b600161099083611335565b945094505050506109b9565b6109b38660a0015187608001518860c0015161089f565b92509250505b935093915050565b60075490565b600f546001600160a01b031690565b600f5460009060609060ff600160a01b909104161515600114156109fe576109fe6006610ec0565b619c4060005a90506000610a106109c7565b9050610a1b81610ed9565b6000610a28828989611524565b9050610a348189611083565b95509550505060005a8203905080831015610a56576010805484019055610a5f565b60108054820190555b5050509250929050565b600a546060907fdefa017defa017defa017defa017defa017defa017defa017defa017defa017d14610aaa5750604080516020810190915260008152610bc5565b600280546001600160a01b0319166001600160a01b038481169190911791829055604051630d15d41560e41b815291169063d15d415090610aef903390600401612a29565b60206040518083038186803b158015610b0757600080fd5b505afa158015610b1b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b3f91906125b4565b610b645760405162461bcd60e51b8152600401610b5b90612b87565b60405180910390fd5b610b6d836114b2565b610b768361156a565b610b9757610b826115c6565b50604080516020810190915260008152610bc5565b6000610bb76003600001548560a001510385608001518660c0015161089f565b915050610bc26115c6565b90505b92915050565b600d546001600160a01b031690565b60095490565b6000610bf2610bed6109c7565b610f5e565b905090565b333014610c0357610ddc565b610c0c81611230565b610c3b57610c3b6005610c36604051806060016040528060348152602001612d5860349139611663565b61121a565b6001546040516352275acd60e11b81526001600160a01b039091169063a44eb59a90610c6b908590600401612af8565b60206040518083038186803b158015610c8357600080fd5b505afa158015610c97573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cbb91906125b4565b610ce557610ce56004610c366040518060a0016040528060768152602001612ce260769139611663565b610cee816112bb565b6000610cf983611322565b90506001600160a01b038116610d13573d6000803e3d6000fd5b6000610d1e82611335565b6001546040516352275acd60e11b81529192506001600160a01b03169063a44eb59a90610d4f908490600401612af8565b60206040518083038186803b158015610d6757600080fd5b505afa158015610d7b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d9f91906125b4565b610dc957610dc96004610c36604051806060016040528060308152602001612d8c60309139611663565b6105028383610dd785611216565b61134b565b505050565b60006060619c4060005a60408051606081018252600e546001600160a01b039081168252600f549081166020830152600160a01b900460ff1615159181019190915290915061086a81898989611421565b6000610e3e83836116a6565b600254604051631aaf392f60e01b81526001600160a01b0390911690631aaf392f90610e709086908690600401612a61565b60206040518083038186803b158015610e8857600080fd5b505afa158015610e9c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bc291906125ec565b61053e816040518060200160405280600081525061121a565b600080610f285a6002602160991b0185604051602401610ef99190612a29565b60408051601f198184030181529190526020810180516001600160e01b031663b1540a0160e01b17905261089f565b91509150600081806020019051810190610f4291906125b4565b9050801580610f4f575082155b15610799576107996007610ec0565b6000610f69826117e1565b60025460405163d126199f60e01b81526001600160a01b039091169063d126199f90610f99908590600401612a29565b60206040518083038186803b158015610fb157600080fd5b505afa158015610fc5573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061051c91906125ec565b60408051600280825260608201909252600091829190816020015b606081526020019060019003908161100457905050905061102484611928565b8160008151811061103157fe5b602002602001018190525061104583611952565b8160018151811061105257fe5b6020026020010181905250600061106882611965565b905061107a81805190602001206119a9565b95945050505050565b600060606110a56110926109c7565b61109d610bed6109c7565b600101611388565b60408051606081018252600f5460ff600160a01b8204161515928201929092526001600160a01b03918216815290851660208201526000806110eb835a898960016119ac565b91509150816110fb5760006110fd565b865b97909650945050505050565b806111148484610e32565b141561111f57610ddc565b6111298383611c1a565b600254604051635c17d62960e01b81526001600160a01b0390911690635c17d6299061115d90869086908690600401612a7a565b600060405180830381600087803b15801561117757600080fd5b505af1158015610795573d6000803e3d6000fd5b6000611196826117e1565b600254604051637c8ee70360e01b81526001600160a01b0390911690637c8ee703906111c6908590600401612a29565b60206040518083038186803b1580156111de57600080fd5b505afa1580156111f2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061051c9190612564565b3f90565b60006112268383611d2c565b9050805160208201fd5b600061123b826117e1565b6002546040516307a1294560e01b81526001600160a01b03909116906307a129459061126b908590600401612a29565b60206040518083038186803b15801561128357600080fd5b505afa158015611297573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061051c91906125b4565b6112c4816117e1565b600254604051637e78a4d160e11b81526001600160a01b039091169063fcf149a2906112f4908490600401612a29565b600060405180830381600087803b15801561130e57600080fd5b505af1158015610502573d6000803e3d6000fd5b6000808251602084016000f09392505050565b606061051c8260006113468561141d565b6113f9565b61135483611dd5565b6002546040516368510af960e11b81526001600160a01b039091169063d0a215f29061115d90869086908690600401612a3d565b61139182611dd5565b6002546040516374855dc360e11b81526001600160a01b039091169063e90abb86906113c39085908590600401612a61565b600060405180830381600087803b1580156113dd57600080fd5b505af11580156113f1573d6000803e3d6000fd5b505050505050565b6060806040519050602083018101604052828152828460208301873c949350505050565b3b90565b6000606073ffffffffffffffffffffffffffffffffffff0000841673deaddeaddeaddeaddeaddeaddeaddeaddead000014156114705750506040805160208101909152600081526001906114a9565b60006064856001600160a01b0316106114915761148c8561118b565b611493565b845b90506114a38787838760006119ac565b92509250505b94509492505050565b80516009556020810151600a5560a0810151600c5560408101516008805460ff1916600183818111156114e157fe5b02179055506060810151600d80546001600160a01b0319166001600160a01b03909216919091179055600554600b5560a081015161151e90611ee4565b60115550565b60008060ff60f81b858486805190602001206040516020016115499493929190612966565b60405160208183030381529060405280519060200120905061107a816119a9565b60007fdefa017defa017defa017defa017defa017defa017defa017defa017defa017d826020015114156115a05750600061051f565b6115b28260a001518360400151611ef7565b6115be5750600061051f565b506001919050565b600d80546001600160a01b031990811673defa017defa017defa017defa017defa017defa09081179092557fdefa017defa017defa017defa017defa017defa017defa017defa017defa017d6009819055600a819055600b819055600c8190556008805460ff191690556010819055600e8054831684179055600f8054831690931760ff60a01b1916909255601191909155600280549091169055565b6060816040516024016116769190612af8565b60408051601f198184030181529190526020810180516001600160e01b031662461bcd60e51b1790529050919050565b6175305a10156116ba576116ba6000610ec0565b600254604051630ad2267960e01b81526001600160a01b0390911690630ad22679906116ec9085908590600401612a61565b60206040518083038186803b15801561170457600080fd5b505afa158015611718573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061173c91906125b4565b61174a5761174a6003610ec0565b600254604051632bcdee1960e21b81526000916001600160a01b03169063af37b8649061177d9086908690600401612a61565b602060405180830381600087803b15801561179757600080fd5b505af11580156117ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117cf91906125b4565b905080610ddc57610ddc614e20611f27565b6175305a10156117f5576117f56000610ec0565b60025460405163c8e40fbf60e01b81526001600160a01b039091169063c8e40fbf90611825908490600401612a29565b60206040518083038186803b15801561183d57600080fd5b505afa158015611851573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061187591906125b4565b611883576118836003610ec0565b600254604051633ecdecc760e21b81526000916001600160a01b03169063fb37b31c906118b4908590600401612a29565b602060405180830381600087803b1580156118ce57600080fd5b505af11580156118e2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061190691906125b4565b90508061080f5761080f61753060646119216108218661118b565b0201611f27565b606061051c8260405160200161193e9190612949565b604051602081830303815290604052611f47565b606061051c61196083611f99565b611f47565b606060006119728361209d565b9050611980815160c061219d565b816040516020016119929291906129bb565b604051602081830303815290604052915050919050565b90565b6040805160608082018352600e546001600160a01b039081168352600f549081166020840152600160a01b900460ff16151592820192909252600091906119f381896122ed565b6011546000611a0189611ee4565b60118190559050600060608715611abd57604051309063fcb6829b60e01b90611a32908e908d908f90602401612bf3565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909416939093179092529051611a70919061299f565b6000604051808303816000865af19150503d8060008114611aad576040519150601f19603f3d011682016040523d82523d6000602084013e611ab2565b606091505b509092509050611b20565b896001600160a01b03168b8a604051611ad6919061299f565b60006040518083038160008787f1925050503d8060008114611b14576040519150601f19603f3d011682016040523d82523d6000602084013e611b19565b606091505b5090925090505b611b2a8c866122ed565b60115482611c0257600080600080611b41866123a1565b929650909450925090506003846007811115611b5957fe5b1415611b6857611b6884610ec0565b6001846007811115611b7657fe5b1480611b8d57506004846007811115611b8b57fe5b145b80611ba357506006846007811115611ba157fe5b145b80611bb957506007846007811115611bb757fe5b145b15611bc45760108290555b6001846007811115611bd257fe5b1480611bdb57508c5b15611be857809550611bfb565b6040518060200160405280600081525095505b5090925050505b90920390920360115590999098509650505050505050565b611c2482826116a6565b60025460405163af3dc01160e01b81526000916001600160a01b03169063af3dc01190611c579086908690600401612a61565b602060405180830381600087803b158015611c7157600080fd5b505af1158015611c85573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ca991906125b4565b905080610ddc57611cb983611dd5565b600260009054906101000a90046001600160a01b03166001600160a01b031663c3fd9b256040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611d0957600080fd5b505af1158015611d1d573d6000803e3d6000fd5b50505050610ddc614e20611f27565b60606000836007811115611d3c57fe5b1415611d575750604080516020810190915260008152610bc5565b6003836007811115611d6557fe5b1415611da357604080516020808201835260008083529251611d8d9387939092839201612b1f565b6040516020818303038152906040529050610bc5565b601154601054604051611dbe92869290918690602001612b5b565b604051602081830303815290604052905092915050565b611dde816117e1565b60025460405163011b1f7960e41b81526000916001600160a01b0316906311b1f79090611e0f908590600401612a29565b602060405180830381600087803b158015611e2957600080fd5b505af1158015611e3d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e6191906125b4565b90508061080f57600260009054906101000a90046001600160a01b03166001600160a01b03166333f943056040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611eb857600080fd5b505af1158015611ecc573d6000803e3d6000fd5b5050505061080f61753060646119216108218661118b565b60005a8210611ef3575a61051c565b5090565b600454600090831115611f0c57506000610bc5565b600354831015611f1e57506000610bc5565b50600192915050565b601154811115611f3b57611f3b6002610ec0565b60118054919091039055565b60608082516001148015611f6f5750608083600081518110611f6557fe5b016020015160f81c105b15611f7b57508161051c565b611f878351608061219d565b83604051602001611dbe9291906129bb565b6060600082604051602001611fae9190612a20565b604051602081830303815290604052905060005b6020811015611ff857818181518110611fd757fe5b01602001516001600160f81b03191615611ff057611ff8565b600101611fc2565b6000816020036001600160401b038111801561201357600080fd5b506040519080825280601f01601f19166020018201604052801561203e576020820181803683370190505b50905060005b815181101561209457835160018401938591811061205e57fe5b602001015160f81c60f81b82828151811061207557fe5b60200101906001600160f81b031916908160001a905350600101612044565b50949350505050565b60608151600014156120be575060408051600081526020810190915261051f565b6000805b83518110156120f1578381815181106120d757fe5b6020026020010151518201915080806001019150506120c2565b6000826001600160401b038111801561210957600080fd5b506040519080825280601f01601f191660200182016040528015612134576020820181803683370190505b50600092509050602081015b855183101561209457600086848151811061215757fe5b602002602001015190506000602082019050612175838284516123f4565b87858151811061218157fe5b6020026020010151518301925050508280600101935050612140565b60608060388410156121f7576040805160018082528183019092529060208201818036833701905050905082840160f81b816000815181106121db57fe5b60200101906001600160f81b031916908160001a905350610bc2565b600060015b80868161220557fe5b041561221a57600190910190610100026121fc565b816001016001600160401b038111801561223357600080fd5b506040519080825280601f01601f19166020018201604052801561225e576020820181803683370190505b50925084820160370160f81b8360008151811061227757fe5b60200101906001600160f81b031916908160001a905350600190505b8181116122e3576101008183036101000a87816122ac57fe5b04816122b457fe5b0660f81b8382815181106122c457fe5b60200101906001600160f81b031916908160001a905350600101612293565b5050905092915050565b805182516001600160a01b03908116911614612325578051600e80546001600160a01b0319166001600160a01b039092169190911790555b80602001516001600160a01b031682602001516001600160a01b03161461236b576020810151600f80546001600160a01b0319166001600160a01b039092169190911790555b80604001511515826040015115151461080f5760400151600f8054911515600160a01b0260ff60a01b1990921691909117905550565b600080600060608451600014156123d057505060408051602081019091526000808252925082915081906123ed565b848060200190518101906123e491906126da565b93509350935093505b9193509193565b8282825b60208110612417578151835260209283019290910190601f19016123f8565b905182516020929092036101000a6000190180199091169116179052505050565b600061244b61244684612c47565b612c24565b905082815283838301111561245f57600080fd5b828260208301376000602084830101529392505050565b803561051f81612c94565b600082601f830112612491578081fd5b610bc283833560208501612438565b80356002811061051f57600080fd5b600060e082840312156124c0578081fd5b6124ca60e0612c24565b905081358152602082013560208201526124e6604083016124a0565b60408201526124f760608301612476565b606082015261250860808301612476565b608082015260a082013560a082015260c08201356001600160401b0381111561253057600080fd5b61253c84828501612481565b60c08301525092915050565b600060208284031215612559578081fd5b8135610bc281612c94565b600060208284031215612575578081fd5b8151610bc281612c94565b600080600060608486031215612594578182fd5b833561259f81612c94565b95602085013595506040909401359392505050565b6000602082840312156125c5578081fd5b81518015158114610bc2578182fd5b6000602082840312156125e5578081fd5b5035919050565b6000602082840312156125fd578081fd5b5051919050565b60008060408385031215612616578182fd5b50508035926020909101359150565b6000806000806080858703121561263a578081fd5b84359350602085013560ff81168114612651578182fd5b93969395505050506040820135916060013590565b600060208284031215612677578081fd5b81356001600160401b0381111561268c578182fd5b6107b484828501612481565b600080604083850312156126aa578182fd5b82356001600160401b038111156126bf578283fd5b6126cb85828601612481565b95602094909401359450505050565b600080600080608085870312156126ef578182fd5b8451600881106126fd578283fd5b80945050602085015192506040850151915060608501516001600160401b03811115612727578182fd5b8501601f81018713612737578182fd5b805161274561244682612c47565b818152886020838501011115612759578384fd5b61276a826020830160208601612c68565b9598949750929550505050565b600060208284031215612788578081fd5b81356001600160401b0381111561279d578182fd5b8201601f810184136127ad578182fd5b6107b484823560208401612438565b600080604083850312156127ce578182fd5b82356001600160401b038111156127e3578283fd5b6127ef858286016124af565b925050602083013561280081612c94565b809150509250929050565b60008060006060848603121561281f578081fd5b83356001600160401b03811115612834578182fd5b612840868287016124af565b935050602084013561285181612c94565b9150604084013561286181612c94565b809150509250925092565b600080600060608486031215612880578081fd5b83359250602084013561289281612c94565b915060408401356001600160401b038111156128ac578182fd5b6128b886828701612481565b9150509250925092565b6000806000606084860312156128d6578081fd5b8335925060208401356001600160401b038111156128f2578182fd5b6128fe86828701612481565b925050604084013561286181612c94565b60008151808452612927816020860160208601612c68565b601f01601f19169290920160200192915050565b6008811061294557fe5b9052565b60609190911b6bffffffffffffffffffffffff1916815260140190565b6001600160f81b031994909416845260609290921b6bffffffffffffffffffffffff191660018401526015830152603582015260550190565b600082516129b1818460208701612c68565b9190910192915050565b600083516129cd818460208801612c68565b8351908301906129e1818360208801612c68565b01949350505050565b6c600d380380600d6000396000f360981b81528151600090612a1381600d850160208701612c68565b91909101600d0192915050565b90815260200190565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039390931683526020830191909152604082015260600190565b6001600160a01b03831681526040602082018190526000906107b49083018461290f565b60008315158252604060208301526107b4604083018461290f565b93845260ff9290921660208401526040830152606082015260800190565b600060208252610bc2602083018461290f565b6020810160028310612b1957fe5b91905290565b6000612b2b828761293b565b60ff8516602083015260ff8416604083015260806060830152612b51608083018461290f565b9695505050505050565b6000612b67828761293b565b84602083015283604083015260806060830152612b51608083018461290f565b60208082526046908201527f4f6e6c792061757468656e746963617465642061646472657373657320696e2060408201527f6f766d53746174654d616e616765722063616e2063616c6c20746869732066756060820152653731ba34b7b760d11b608082015260a00190565b600084825260606020830152612c0c606083018561290f565b905060018060a01b0383166040830152949350505050565b6040518181016001600160401b0381118282101715612c3f57fe5b604052919050565b60006001600160401b03821115612c5a57fe5b50601f01601f191660200190565b60005b83811015612c83578181015183820152602001612c6b565b838111156107995750506000910152565b6001600160a01b038116811461053e57600080fdfe5369676e61747572652070726f766964656420666f7220454f4120636f6e7472616374206372656174696f6e20697320696e76616c69642e436f6e7472616374206372656174696f6e20636f646520636f6e7461696e7320756e73616665206f70636f6465732e2044696420796f75207573652074686520726967687420636f6d70696c6572206f72207061737320616e20756e7361666520636f6e7374727563746f7220617267756d656e743f4120636f6e74726163742068617320616c7265616479206265656e206465706c6f79656420746f20746869732061646472657373436f6e7374727563746f7220617474656d7074656420746f206465706c6f7920756e736166652062797465636f64652ea2646970667358221220ba09f3066e98cffa8b50d7fb9822c62cac7bc36099454fe6dbe318573486c14d64736f6c63430007060033", "devdoc": { "details": "The Execution Manager (EM) is the core of our OVM implementation, and provides a sandboxed environment allowing us to execute OVM transactions deterministically on either Layer 1 or Layer 2. The EM's run() function is the first function called during the execution of any transaction on L2. For each context-dependent EVM operation the EM has a function which implements a corresponding OVM operation, which will read state from the State Manager contract. The EM relies on the Safety Checker to verify that code deployed to Layer 2 does not contain any context-dependent operations. Compiler used: solc Runtime target: EVM", "kind": "dev", @@ -791,7 +820,7 @@ }, "ovmL1QUEUEORIGIN()": { "returns": { - "_queueOrigin": "Address of the ovmL1QUEUEORIGIN within the current message context." + "_queueOrigin": "Enum indicating the ovmL1QUEUEORIGIN within the current message context." } }, "ovmL1TXORIGIN()": { @@ -839,12 +868,27 @@ "_TIMESTAMP": "Value of the TIMESTAMP within the transaction context." } }, + "resolve(string)": { + "params": { + "_name": "Name to resolve an address for." + }, + "returns": { + "_0": "Address associated with the given name." + } + }, "run((uint256,uint256,uint8,address,address,uint256,bytes),address)": { "params": { "_ovmStateManager": "iOVM_StateManager implementation providing account state.", "_transaction": "Transaction data to be executed." } }, + "safeCREATE(uint256,bytes,address)": { + "params": { + "_address": "OVM address being deployed to.", + "_creationCode": "Code to pass into CREATE for deployment.", + "_gasLimit": "Amount of gas to be passed into this creation." + } + }, "simulateMessage((uint256,uint256,uint8,address,address,uint256,bytes),address,address)": { "params": { "_from": "the OVM account the simulated call should be from.", @@ -901,7 +945,7 @@ "notice": "Bumps the nonce of the current ovmADDRESS by one." }, "ovmL1QUEUEORIGIN()": { - "notice": "Specifies from which L1 rollup queue this transaction originated from." + "notice": "Specifies from which source (Sequencer or Queue) this transaction originated from." }, "ovmL1TXORIGIN()": { "notice": "Specifies which L1 account, if any, sent this transaction by calling enqueue()." @@ -924,9 +968,15 @@ "ovmTIMESTAMP()": { "notice": "Overrides TIMESTAMP." }, + "resolve(string)": { + "notice": "Resolves the address associated with a given name." + }, "run((uint256,uint256,uint8,address,address,uint256,bytes),address)": { "notice": "Starts the execution of a transaction via the OVM_ExecutionManager." }, + "safeCREATE(uint256,bytes,address)": { + "notice": "Handles the creation-specific safety measures required for OVM contract deployment. This function sanitizes the return types for creation messages to match calls (bool, bytes), by being an external function which the EM can call, that mimics the success/fail case of the CREATE. This allows for consistent handling of both types of messages in _handleExternalMessage(). Having this step occur as a separate call frame also allows us to easily revert the contract deployment in the event that the code is unsafe." + }, "simulateMessage((uint256,uint256,uint8,address,address,uint256,bytes),address,address)": { "notice": "Unreachable helper function for simulating eth_calls with an OVM message context. This function will throw an exception in all cases other than when used as a custom entrypoint in L2 Geth to simulate eth_call." } @@ -936,76 +986,76 @@ "storageLayout": { "storage": [ { - "astId": 12526, + "astId": 12800, "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", "label": "libAddressManager", "offset": 0, "slot": "0", - "type": "t_contract(Lib_AddressManager)12519" + "type": "t_contract(Lib_AddressManager)12793" }, { - "astId": 4494, + "astId": 5184, "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", "label": "ovmSafetyChecker", "offset": 0, "slot": "1", - "type": "t_contract(iOVM_SafetyChecker)11034" + "type": "t_contract(iOVM_SafetyChecker)11280" }, { - "astId": 4496, + "astId": 5186, "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", "label": "ovmStateManager", "offset": 0, "slot": "2", - "type": "t_contract(iOVM_StateManager)11266" + "type": "t_contract(iOVM_StateManager)11512" }, { - "astId": 4498, + "astId": 5188, "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", "label": "gasMeterConfig", "offset": 0, "slot": "3", - "type": "t_struct(GasMeterConfig)10819_storage" + "type": "t_struct(GasMeterConfig)11063_storage" }, { - "astId": 4500, + "astId": 5190, "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", "label": "globalContext", "offset": 0, "slot": "7", - "type": "t_struct(GlobalContext)10822_storage" + "type": "t_struct(GlobalContext)11066_storage" }, { - "astId": 4502, + "astId": 5192, "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", "label": "transactionContext", "offset": 0, "slot": "8", - "type": "t_struct(TransactionContext)10835_storage" + "type": "t_struct(TransactionContext)11079_storage" }, { - "astId": 4504, + "astId": 5194, "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", "label": "messageContext", "offset": 0, "slot": "14", - "type": "t_struct(MessageContext)10845_storage" + "type": "t_struct(MessageContext)11089_storage" }, { - "astId": 4506, + "astId": 5196, "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", "label": "transactionRecord", "offset": 0, "slot": "16", - "type": "t_struct(TransactionRecord)10838_storage" + "type": "t_struct(TransactionRecord)11082_storage" }, { - "astId": 4508, + "astId": 5198, "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", "label": "messageRecord", "offset": 0, "slot": "17", - "type": "t_struct(MessageRecord)10848_storage" + "type": "t_struct(MessageRecord)11092_storage" } ], "types": { @@ -1019,32 +1069,32 @@ "label": "bool", "numberOfBytes": "1" }, - "t_contract(Lib_AddressManager)12519": { + "t_contract(Lib_AddressManager)12793": { "encoding": "inplace", "label": "contract Lib_AddressManager", "numberOfBytes": "20" }, - "t_contract(iOVM_SafetyChecker)11034": { + "t_contract(iOVM_SafetyChecker)11280": { "encoding": "inplace", "label": "contract iOVM_SafetyChecker", "numberOfBytes": "20" }, - "t_contract(iOVM_StateManager)11266": { + "t_contract(iOVM_StateManager)11512": { "encoding": "inplace", "label": "contract iOVM_StateManager", "numberOfBytes": "20" }, - "t_enum(QueueOrigin)11832": { + "t_enum(QueueOrigin)12433": { "encoding": "inplace", "label": "enum Lib_OVMCodec.QueueOrigin", "numberOfBytes": "1" }, - "t_struct(GasMeterConfig)10819_storage": { + "t_struct(GasMeterConfig)11063_storage": { "encoding": "inplace", "label": "struct iOVM_ExecutionManager.GasMeterConfig", "members": [ { - "astId": 10812, + "astId": 11056, "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", "label": "minTransactionGasLimit", "offset": 0, @@ -1052,7 +1102,7 @@ "type": "t_uint256" }, { - "astId": 10814, + "astId": 11058, "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", "label": "maxTransactionGasLimit", "offset": 0, @@ -1060,7 +1110,7 @@ "type": "t_uint256" }, { - "astId": 10816, + "astId": 11060, "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", "label": "maxGasPerQueuePerEpoch", "offset": 0, @@ -1068,7 +1118,7 @@ "type": "t_uint256" }, { - "astId": 10818, + "astId": 11062, "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", "label": "secondsPerEpoch", "offset": 0, @@ -1078,12 +1128,12 @@ ], "numberOfBytes": "128" }, - "t_struct(GlobalContext)10822_storage": { + "t_struct(GlobalContext)11066_storage": { "encoding": "inplace", "label": "struct iOVM_ExecutionManager.GlobalContext", "members": [ { - "astId": 10821, + "astId": 11065, "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", "label": "ovmCHAINID", "offset": 0, @@ -1093,12 +1143,12 @@ ], "numberOfBytes": "32" }, - "t_struct(MessageContext)10845_storage": { + "t_struct(MessageContext)11089_storage": { "encoding": "inplace", "label": "struct iOVM_ExecutionManager.MessageContext", "members": [ { - "astId": 10840, + "astId": 11084, "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", "label": "ovmCALLER", "offset": 0, @@ -1106,7 +1156,7 @@ "type": "t_address" }, { - "astId": 10842, + "astId": 11086, "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", "label": "ovmADDRESS", "offset": 0, @@ -1114,7 +1164,7 @@ "type": "t_address" }, { - "astId": 10844, + "astId": 11088, "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", "label": "isStatic", "offset": 20, @@ -1124,12 +1174,12 @@ ], "numberOfBytes": "64" }, - "t_struct(MessageRecord)10848_storage": { + "t_struct(MessageRecord)11092_storage": { "encoding": "inplace", "label": "struct iOVM_ExecutionManager.MessageRecord", "members": [ { - "astId": 10847, + "astId": 11091, "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", "label": "nuisanceGasLeft", "offset": 0, @@ -1139,20 +1189,20 @@ ], "numberOfBytes": "32" }, - "t_struct(TransactionContext)10835_storage": { + "t_struct(TransactionContext)11079_storage": { "encoding": "inplace", "label": "struct iOVM_ExecutionManager.TransactionContext", "members": [ { - "astId": 10824, + "astId": 11068, "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", "label": "ovmL1QUEUEORIGIN", "offset": 0, "slot": "0", - "type": "t_enum(QueueOrigin)11832" + "type": "t_enum(QueueOrigin)12433" }, { - "astId": 10826, + "astId": 11070, "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", "label": "ovmTIMESTAMP", "offset": 0, @@ -1160,7 +1210,7 @@ "type": "t_uint256" }, { - "astId": 10828, + "astId": 11072, "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", "label": "ovmNUMBER", "offset": 0, @@ -1168,7 +1218,7 @@ "type": "t_uint256" }, { - "astId": 10830, + "astId": 11074, "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", "label": "ovmGASLIMIT", "offset": 0, @@ -1176,7 +1226,7 @@ "type": "t_uint256" }, { - "astId": 10832, + "astId": 11076, "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", "label": "ovmTXGASLIMIT", "offset": 0, @@ -1184,7 +1234,7 @@ "type": "t_uint256" }, { - "astId": 10834, + "astId": 11078, "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", "label": "ovmL1TXORIGIN", "offset": 0, @@ -1194,12 +1244,12 @@ ], "numberOfBytes": "192" }, - "t_struct(TransactionRecord)10838_storage": { + "t_struct(TransactionRecord)11082_storage": { "encoding": "inplace", "label": "struct iOVM_ExecutionManager.TransactionRecord", "members": [ { - "astId": 10837, + "astId": 11081, "contract": "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol:OVM_ExecutionManager", "label": "ovmGasRefund", "offset": 0, diff --git a/packages/contracts/deployments/kovan/OVM_FraudVerifier.json b/packages/contracts/deployments/kovan/OVM_FraudVerifier.json index f9976d5f381ca..dafeec721864e 100644 --- a/packages/contracts/deployments/kovan/OVM_FraudVerifier.json +++ b/packages/contracts/deployments/kovan/OVM_FraudVerifier.json @@ -1,5 +1,5 @@ { - "address": "0x139D12963897129D48C99402Cc481e8C0E8FD0BC", + "address": "0x4B2F74938Ddb8742C33b46aD1a402c85e9dABC44", "abi": [ { "inputs": [ @@ -429,7 +429,7 @@ "outputs": [ { "internalType": "address", - "name": "_contract", + "name": "", "type": "address" } ], @@ -437,31 +437,31 @@ "type": "function" } ], - "transactionHash": "0x45df9eeb3d12e638b475e82cc6ed745b55649dfc98c9f3e3f5c4c2eba7a38897", + "transactionHash": "0xb8082579bad0f835bc920bd0a9914c2579d22b880631c0d48e905bc30c4dc913", "receipt": { "to": null, "from": "0x18394B52d3Cb931dfA76F63251919D051953413d", - "contractAddress": "0x139D12963897129D48C99402Cc481e8C0E8FD0BC", - "transactionIndex": 1, - "gasUsed": "1376835", + "contractAddress": "0x4B2F74938Ddb8742C33b46aD1a402c85e9dABC44", + "transactionIndex": 2, + "gasUsed": "1385698", "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0x55c3eff83f800e90134f1e5c8d7908dacd90a7f677c215862f12916d213f3e56", - "transactionHash": "0x45df9eeb3d12e638b475e82cc6ed745b55649dfc98c9f3e3f5c4c2eba7a38897", + "blockHash": "0x064d3a146603fa300614898ab7c1d631f1f7bdda0144fa855991c6da4ce5103b", + "transactionHash": "0xb8082579bad0f835bc920bd0a9914c2579d22b880631c0d48e905bc30c4dc913", "logs": [], - "blockNumber": 24199509, - "cumulativeGasUsed": "1495398", + "blockNumber": 24572850, + "cumulativeGasUsed": "1633498", "status": 1, "byzantium": true }, "args": [ - "0xFaf27b24ba54C6910C12CFF5C9453C0e8D634e05" + "0xd56F695e73286ac252A37593DD4E7c14270eC1Df" ], - "solcInputHash": "03aed03b958b1d37f90bd88d0f56dd85", - "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"_preStateRoot\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_preStateRootIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"_transactionHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_who\",\"type\":\"address\"}],\"name\":\"FraudProofFinalized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"_preStateRoot\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_preStateRootIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"_transactionHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_who\",\"type\":\"address\"}],\"name\":\"FraudProofInitialized\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_preStateRoot\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"_preStateRootBatchHeader\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"siblings\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct Lib_OVMCodec.ChainInclusionProof\",\"name\":\"_preStateRootProof\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"_txHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"_postStateRoot\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"_postStateRootBatchHeader\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"siblings\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct Lib_OVMCodec.ChainInclusionProof\",\"name\":\"_postStateRootProof\",\"type\":\"tuple\"}],\"name\":\"finalizeFraudVerification\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_preStateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"_txHash\",\"type\":\"bytes32\"}],\"name\":\"getStateTransitioner\",\"outputs\":[{\"internalType\":\"contract iOVM_StateTransitioner\",\"name\":\"_transitioner\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_preStateRoot\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"_preStateRootBatchHeader\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"siblings\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct Lib_OVMCodec.ChainInclusionProof\",\"name\":\"_preStateRootProof\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"enum Lib_OVMCodec.QueueOrigin\",\"name\":\"l1QueueOrigin\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"l1TxOrigin\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"entrypoint\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.Transaction\",\"name\":\"_transaction\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isSequenced\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"queueIndex\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"txData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.TransactionChainElement\",\"name\":\"_txChainElement\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"_transactionBatchHeader\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"siblings\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct Lib_OVMCodec.ChainInclusionProof\",\"name\":\"_transactionProof\",\"type\":\"tuple\"}],\"name\":\"initializeFraudVerification\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"_contract\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The Fraud Verifier contract coordinates the entire fraud proof verification process. If the fraud proof was successful it prunes any state batches from State Commitment Chain which were published after the fraudulent state root. Compiler used: solc Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\"}},\"finalizeFraudVerification(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes32,bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))\":{\"params\":{\"_postStateRoot\":\"State root after the fraudulent transaction.\",\"_postStateRootBatchHeader\":\"Batch header for the provided post-state root.\",\"_postStateRootProof\":\"Inclusion proof for the provided post-state root.\",\"_preStateRoot\":\"State root before the fraudulent transaction.\",\"_preStateRootBatchHeader\":\"Batch header for the provided pre-state root.\",\"_preStateRootProof\":\"Inclusion proof for the provided pre-state root.\",\"_txHash\":\"The transaction for the state root\"}},\"getStateTransitioner(bytes32,bytes32)\":{\"params\":{\"_preStateRoot\":\"State root to query a transitioner for.\"},\"returns\":{\"_transitioner\":\"Corresponding state transitioner contract.\"}},\"initializeFraudVerification(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),(uint256,uint256,uint8,address,address,uint256,bytes),(bool,uint256,uint256,uint256,bytes),(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))\":{\"params\":{\"_preStateRoot\":\"State root before the fraudulent transaction.\",\"_preStateRootBatchHeader\":\"Batch header for the provided pre-state root.\",\"_preStateRootProof\":\"Inclusion proof for the provided pre-state root.\",\"_transaction\":\"OVM transaction claimed to be fraudulent.\",\"_transactionBatchHeader\":\"Batch header for the provided transaction.\",\"_transactionProof\":\"Inclusion proof for the provided transaction.\",\"_txChainElement\":\"OVM transaction chain element.\"}}},\"title\":\"OVM_FraudVerifier\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"finalizeFraudVerification(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes32,bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))\":{\"notice\":\"Finalizes the fraud verification process.\"},\"getStateTransitioner(bytes32,bytes32)\":{\"notice\":\"Retrieves the state transitioner for a given root.\"},\"initializeFraudVerification(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),(uint256,uint256,uint8,address,address,uint256,bytes),(bool,uint256,uint256,uint256,bytes),(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))\":{\"notice\":\"Begins the fraud verification process.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/OVM/verification/OVM_FraudVerifier.sol\":\"OVM_FraudVerifier\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/optimistic-ethereum/OVM/verification/Abs_FraudContributor.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\nimport { iOVM_BondManager } from \\\"../../iOVM/verification/iOVM_BondManager.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/// Minimal contract to be inherited by contracts consumed by users that provide\\n/// data for fraud proofs\\nabstract contract Abs_FraudContributor is Lib_AddressResolver {\\n /// Decorate your functions with this modifier to store how much total gas was\\n /// consumed by the sender, to reward users fairly\\n modifier contributesToFraudProof(bytes32 preStateRoot, bytes32 txHash) {\\n uint256 startGas = gasleft();\\n _;\\n uint256 gasSpent = startGas - gasleft();\\n iOVM_BondManager(resolve('OVM_BondManager')).recordGasSpent(preStateRoot, txHash, msg.sender, gasSpent);\\n }\\n}\\n\",\"keccak256\":\"0x6c27d089a297103cb93b30f7649ab68691cc6b948c315f1037e5de1fe9bf5903\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/verification/OVM_FraudVerifier.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_FraudVerifier } from \\\"../../iOVM/verification/iOVM_FraudVerifier.sol\\\";\\nimport { iOVM_StateTransitioner } from \\\"../../iOVM/verification/iOVM_StateTransitioner.sol\\\";\\nimport { iOVM_StateTransitionerFactory } from \\\"../../iOVM/verification/iOVM_StateTransitionerFactory.sol\\\";\\nimport { iOVM_BondManager } from \\\"../../iOVM/verification/iOVM_BondManager.sol\\\";\\nimport { iOVM_StateCommitmentChain } from \\\"../../iOVM/chain/iOVM_StateCommitmentChain.sol\\\";\\nimport { iOVM_CanonicalTransactionChain } from \\\"../../iOVM/chain/iOVM_CanonicalTransactionChain.sol\\\";\\n\\n/* Contract Imports */\\nimport { Abs_FraudContributor } from \\\"./Abs_FraudContributor.sol\\\";\\n\\n\\n\\n/**\\n * @title OVM_FraudVerifier\\n * @dev The Fraud Verifier contract coordinates the entire fraud proof verification process. \\n * If the fraud proof was successful it prunes any state batches from State Commitment Chain\\n * which were published after the fraudulent state root.\\n * \\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract OVM_FraudVerifier is Lib_AddressResolver, Abs_FraudContributor, iOVM_FraudVerifier {\\n\\n /*******************************************\\n * Contract Variables: Internal Accounting *\\n *******************************************/\\n\\n mapping (bytes32 => iOVM_StateTransitioner) internal transitioners;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n */\\n constructor(\\n address _libAddressManager\\n )\\n Lib_AddressResolver(_libAddressManager)\\n {}\\n\\n\\n /***************************************\\n * Public Functions: Transition Status *\\n ***************************************/\\n\\n /**\\n * Retrieves the state transitioner for a given root.\\n * @param _preStateRoot State root to query a transitioner for.\\n * @return _transitioner Corresponding state transitioner contract.\\n */\\n function getStateTransitioner(\\n bytes32 _preStateRoot,\\n bytes32 _txHash\\n )\\n override\\n public\\n view\\n returns (\\n iOVM_StateTransitioner _transitioner\\n )\\n {\\n return transitioners[keccak256(abi.encodePacked(_preStateRoot, _txHash))];\\n }\\n\\n\\n /****************************************\\n * Public Functions: Fraud Verification *\\n ****************************************/\\n\\n /**\\n * Begins the fraud verification process.\\n * @param _preStateRoot State root before the fraudulent transaction.\\n * @param _preStateRootBatchHeader Batch header for the provided pre-state root.\\n * @param _preStateRootProof Inclusion proof for the provided pre-state root.\\n * @param _transaction OVM transaction claimed to be fraudulent.\\n * @param _txChainElement OVM transaction chain element.\\n * @param _transactionBatchHeader Batch header for the provided transaction.\\n * @param _transactionProof Inclusion proof for the provided transaction.\\n */\\n function initializeFraudVerification(\\n bytes32 _preStateRoot,\\n Lib_OVMCodec.ChainBatchHeader memory _preStateRootBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _preStateRootProof,\\n Lib_OVMCodec.Transaction memory _transaction,\\n Lib_OVMCodec.TransactionChainElement memory _txChainElement,\\n Lib_OVMCodec.ChainBatchHeader memory _transactionBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _transactionProof\\n )\\n override\\n public\\n contributesToFraudProof(_preStateRoot, Lib_OVMCodec.hashTransaction(_transaction))\\n {\\n bytes32 _txHash = Lib_OVMCodec.hashTransaction(_transaction);\\n\\n if (_hasStateTransitioner(_preStateRoot, _txHash)) {\\n return;\\n }\\n\\n iOVM_StateCommitmentChain ovmStateCommitmentChain = iOVM_StateCommitmentChain(resolve(\\\"OVM_StateCommitmentChain\\\"));\\n iOVM_CanonicalTransactionChain ovmCanonicalTransactionChain = iOVM_CanonicalTransactionChain(resolve(\\\"OVM_CanonicalTransactionChain\\\"));\\n\\n require(\\n ovmStateCommitmentChain.verifyStateCommitment(\\n _preStateRoot,\\n _preStateRootBatchHeader,\\n _preStateRootProof\\n ),\\n \\\"Invalid pre-state root inclusion proof.\\\"\\n );\\n\\n require(\\n ovmCanonicalTransactionChain.verifyTransaction(\\n _transaction,\\n _txChainElement,\\n _transactionBatchHeader,\\n _transactionProof\\n ),\\n \\\"Invalid transaction inclusion proof.\\\"\\n );\\n\\n require (\\n _preStateRootBatchHeader.prevTotalElements + _preStateRootProof.index + 1 == _transactionBatchHeader.prevTotalElements + _transactionProof.index,\\n \\\"Pre-state root global index must equal to the transaction root global index.\\\"\\n );\\n\\n _deployTransitioner(_preStateRoot, _txHash, _preStateRootProof.index);\\n\\n emit FraudProofInitialized(\\n _preStateRoot,\\n _preStateRootProof.index,\\n _txHash,\\n msg.sender\\n );\\n }\\n\\n /**\\n * Finalizes the fraud verification process.\\n * @param _preStateRoot State root before the fraudulent transaction.\\n * @param _preStateRootBatchHeader Batch header for the provided pre-state root.\\n * @param _preStateRootProof Inclusion proof for the provided pre-state root.\\n * @param _txHash The transaction for the state root\\n * @param _postStateRoot State root after the fraudulent transaction.\\n * @param _postStateRootBatchHeader Batch header for the provided post-state root.\\n * @param _postStateRootProof Inclusion proof for the provided post-state root.\\n */\\n function finalizeFraudVerification(\\n bytes32 _preStateRoot,\\n Lib_OVMCodec.ChainBatchHeader memory _preStateRootBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _preStateRootProof,\\n bytes32 _txHash,\\n bytes32 _postStateRoot,\\n Lib_OVMCodec.ChainBatchHeader memory _postStateRootBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _postStateRootProof\\n )\\n override\\n public\\n contributesToFraudProof(_preStateRoot, _txHash)\\n {\\n iOVM_StateTransitioner transitioner = getStateTransitioner(_preStateRoot, _txHash);\\n iOVM_StateCommitmentChain ovmStateCommitmentChain = iOVM_StateCommitmentChain(resolve(\\\"OVM_StateCommitmentChain\\\"));\\n\\n require(\\n transitioner.isComplete() == true,\\n \\\"State transition process must be completed prior to finalization.\\\"\\n );\\n\\n require (\\n _postStateRootBatchHeader.prevTotalElements + _postStateRootProof.index == _preStateRootBatchHeader.prevTotalElements + _preStateRootProof.index + 1,\\n \\\"Post-state root global index must equal to the pre state root global index plus one.\\\"\\n );\\n\\n require(\\n ovmStateCommitmentChain.verifyStateCommitment(\\n _preStateRoot,\\n _preStateRootBatchHeader,\\n _preStateRootProof\\n ),\\n \\\"Invalid pre-state root inclusion proof.\\\"\\n );\\n\\n require(\\n ovmStateCommitmentChain.verifyStateCommitment(\\n _postStateRoot,\\n _postStateRootBatchHeader,\\n _postStateRootProof\\n ),\\n \\\"Invalid post-state root inclusion proof.\\\"\\n );\\n\\n // If the post state root did not match, then there was fraud and we should delete the batch\\n require(\\n _postStateRoot != transitioner.getPostStateRoot(),\\n \\\"State transition has not been proven fraudulent.\\\"\\n );\\n \\n _cancelStateTransition(_postStateRootBatchHeader, _preStateRoot);\\n\\n // TEMPORARY: Remove the transitioner; for minnet.\\n transitioners[keccak256(abi.encodePacked(_preStateRoot, _txHash))] = iOVM_StateTransitioner(0x0000000000000000000000000000000000000000);\\n\\n emit FraudProofFinalized(\\n _preStateRoot,\\n _preStateRootProof.index,\\n _txHash,\\n msg.sender\\n );\\n }\\n\\n\\n /************************************\\n * Internal Functions: Verification *\\n ************************************/\\n\\n /**\\n * Checks whether a transitioner already exists for a given pre-state root.\\n * @param _preStateRoot Pre-state root to check.\\n * @return _exists Whether or not we already have a transitioner for the root.\\n */\\n function _hasStateTransitioner(\\n bytes32 _preStateRoot,\\n bytes32 _txHash\\n )\\n internal\\n view\\n returns (\\n bool _exists\\n )\\n {\\n return address(getStateTransitioner(_preStateRoot, _txHash)) != address(0);\\n }\\n\\n /**\\n * Deploys a new state transitioner.\\n * @param _preStateRoot Pre-state root to initialize the transitioner with.\\n * @param _txHash Hash of the transaction this transitioner will execute.\\n * @param _stateTransitionIndex Index of the transaction in the chain.\\n */\\n function _deployTransitioner(\\n bytes32 _preStateRoot,\\n bytes32 _txHash,\\n uint256 _stateTransitionIndex\\n )\\n internal\\n {\\n transitioners[keccak256(abi.encodePacked(_preStateRoot, _txHash))] = iOVM_StateTransitionerFactory(\\n resolve(\\\"OVM_StateTransitionerFactory\\\")\\n ).create(\\n address(libAddressManager),\\n _stateTransitionIndex,\\n _preStateRoot,\\n _txHash\\n );\\n }\\n\\n /**\\n * Removes a state transition from the state commitment chain.\\n * @param _postStateRootBatchHeader Header for the post-state root.\\n * @param _preStateRoot Pre-state root hash.\\n */\\n function _cancelStateTransition(\\n Lib_OVMCodec.ChainBatchHeader memory _postStateRootBatchHeader,\\n bytes32 _preStateRoot\\n )\\n internal\\n {\\n iOVM_StateCommitmentChain ovmStateCommitmentChain = iOVM_StateCommitmentChain(resolve(\\\"OVM_StateCommitmentChain\\\"));\\n iOVM_BondManager ovmBondManager = iOVM_BondManager(resolve(\\\"OVM_BondManager\\\"));\\n\\n // Delete the state batch.\\n ovmStateCommitmentChain.deleteStateBatch(\\n _postStateRootBatchHeader\\n );\\n\\n // Get the timestamp and publisher for that block.\\n (uint256 timestamp, address publisher) = abi.decode(_postStateRootBatchHeader.extraData, (uint256, address));\\n\\n // Slash the bonds at the bond manager.\\n ovmBondManager.finalize(\\n _preStateRoot,\\n publisher,\\n timestamp\\n );\\n }\\n}\\n\",\"keccak256\":\"0x5a0ee382d8b4a7aa46d3c52f10005e58b374ddf2113dd7e0113591477c4cfa04\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_CanonicalTransactionChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_ChainStorageContainer } from \\\"./iOVM_ChainStorageContainer.sol\\\";\\n\\n/**\\n * @title iOVM_CanonicalTransactionChain\\n */\\ninterface iOVM_CanonicalTransactionChain {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event TransactionEnqueued(\\n address _l1TxOrigin,\\n address _target,\\n uint256 _gasLimit,\\n bytes _data,\\n uint256 _queueIndex,\\n uint256 _timestamp\\n );\\n\\n event QueueBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event SequencerBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event TransactionBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct BatchContext {\\n uint256 numSequencedTransactions;\\n uint256 numSubsequentQueueTransactions;\\n uint256 timestamp;\\n uint256 blockNumber;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n\\n /**\\n * Accesses the batch storage container.\\n * @return Reference to the batch storage container.\\n */\\n function batches()\\n external\\n view\\n returns (\\n iOVM_ChainStorageContainer\\n );\\n\\n /**\\n * Accesses the queue storage container.\\n * @return Reference to the queue storage container.\\n */\\n function queue()\\n external\\n view\\n returns (\\n iOVM_ChainStorageContainer\\n );\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements()\\n external\\n view\\n returns (\\n uint256 _totalElements\\n );\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches()\\n external\\n view\\n returns (\\n uint256 _totalBatches\\n );\\n\\n /**\\n * Returns the index of the next element to be enqueued.\\n * @return Index for the next queue element.\\n */\\n function getNextQueueIndex()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Gets the queue element at a particular index.\\n * @param _index Index of the queue element to access.\\n * @return _element Queue element at the given index.\\n */\\n function getQueueElement(\\n uint256 _index\\n )\\n external\\n view\\n returns (\\n Lib_OVMCodec.QueueElement memory _element\\n );\\n\\n /**\\n * Returns the timestamp of the last transaction.\\n * @return Timestamp for the last transaction.\\n */\\n function getLastTimestamp()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Returns the blocknumber of the last transaction.\\n * @return Blocknumber for the last transaction.\\n */\\n function getLastBlockNumber()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Get the number of queue elements which have not yet been included.\\n * @return Number of pending queue elements.\\n */\\n function getNumPendingQueueElements()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Retrieves the length of the queue, including\\n * both pending and canonical transactions.\\n * @return Length of the queue.\\n */\\n function getQueueLength()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n\\n /**\\n * Adds a transaction to the queue.\\n * @param _target Target contract to send the transaction to.\\n * @param _gasLimit Gas limit for the given transaction.\\n * @param _data Transaction data.\\n */\\n function enqueue(\\n address _target,\\n uint256 _gasLimit,\\n bytes memory _data\\n )\\n external;\\n\\n /**\\n * Appends a given number of queued transactions as a single batch.\\n * @param _numQueuedTransactions Number of transactions to append.\\n */\\n function appendQueueBatch(\\n uint256 _numQueuedTransactions\\n )\\n external;\\n\\n /**\\n * Allows the sequencer to append a batch of transactions.\\n * @dev This function uses a custom encoding scheme for efficiency reasons.\\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\\n * .param _contexts Array of batch contexts.\\n * .param _transactionDataFields Array of raw transaction data.\\n */\\n function appendSequencerBatch(\\n // uint40 _shouldStartAtElement,\\n // uint24 _totalElementsToAppend,\\n // BatchContext[] _contexts,\\n // bytes[] _transactionDataFields\\n )\\n external;\\n\\n /**\\n * Verifies whether a transaction is included in the chain.\\n * @param _transaction Transaction to verify.\\n * @param _txChainElement Transaction chain element corresponding to the transaction.\\n * @param _batchHeader Header of the batch the transaction was included in.\\n * @param _inclusionProof Inclusion proof for the provided transaction chain element.\\n * @return True if the transaction exists in the CTC, false if not.\\n */\\n function verifyTransaction(\\n Lib_OVMCodec.Transaction memory _transaction,\\n Lib_OVMCodec.TransactionChainElement memory _txChainElement,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _inclusionProof\\n )\\n external\\n view\\n returns (\\n bool\\n );\\n}\\n\",\"keccak256\":\"0xb5e55488a1982841c07cdf5ff475da4789596f111dd48f01b1918ee4c775cf3a\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_ChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title iOVM_ChainStorageContainer\\n */\\ninterface iOVM_ChainStorageContainer {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata()\\n external\\n view\\n returns (\\n bytes27\\n );\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length()\\n external\\n view\\n returns (\\n uint256\\n );\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(\\n bytes32 _object\\n )\\n external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(\\n bytes32 _object,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(\\n uint256 _index\\n )\\n external\\n view\\n returns (\\n bytes32\\n );\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index\\n )\\n external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Marks an index as overwritable, meaing the underlying buffer can start to write values over\\n * any objects before and including the given index.\\n */\\n function setNextOverwritableIndex(\\n uint256 _index\\n )\\n external;\\n}\\n\",\"keccak256\":\"0x2d7973a0ad84c23ec62624d3f1e3aeb198cc72686ff1e6cfa17155556b320c94\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_StateCommitmentChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title iOVM_StateCommitmentChain\\n */\\ninterface iOVM_StateCommitmentChain {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event StateBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n event StateBatchDeleted(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot\\n );\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements()\\n external\\n view\\n returns (\\n uint256 _totalElements\\n );\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches()\\n external\\n view\\n returns (\\n uint256 _totalBatches\\n );\\n\\n /**\\n * Retrieves the timestamp of the last batch submitted by the sequencer.\\n * @return _lastSequencerTimestamp Last sequencer batch timestamp.\\n */\\n function getLastSequencerTimestamp()\\n external\\n view\\n returns (\\n uint256 _lastSequencerTimestamp\\n );\\n\\n /**\\n * Appends a batch of state roots to the chain.\\n * @param _batch Batch of state roots.\\n * @param _shouldStartAtElement Index of the element at which this batch should start.\\n */\\n function appendStateBatch(\\n bytes32[] calldata _batch,\\n uint256 _shouldStartAtElement\\n )\\n external;\\n\\n /**\\n * Deletes all state roots after (and including) a given batch.\\n * @param _batchHeader Header of the batch to start deleting from.\\n */\\n function deleteStateBatch(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n external;\\n\\n /**\\n * Verifies a batch inclusion proof.\\n * @param _element Hash of the element to verify a proof for.\\n * @param _batchHeader Header of the batch in which the element was included.\\n * @param _proof Merkle inclusion proof for the element.\\n */\\n function verifyStateCommitment(\\n bytes32 _element,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _proof\\n )\\n external\\n view\\n returns (\\n bool _verified\\n );\\n\\n /**\\n * Checks whether a given batch is still inside its fraud proof window.\\n * @param _batchHeader Header of the batch to check.\\n * @return _inside Whether or not the batch is inside the fraud proof window.\\n */\\n function insideFraudProofWindow(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n external\\n view\\n returns (\\n bool _inside\\n );\\n}\\n\",\"keccak256\":\"0x6646d6ff392b81aab52a7a277e91540819464751de0af5afd1962094b2e92448\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/verification/iOVM_BondManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\ninterface ERC20 {\\n function transfer(address, uint256) external returns (bool);\\n function transferFrom(address, address, uint256) external returns (bool);\\n}\\n\\n/// All the errors which may be encountered on the bond manager\\nlibrary Errors {\\n string constant ERC20_ERR = \\\"BondManager: Could not post bond\\\";\\n string constant ALREADY_FINALIZED = \\\"BondManager: Fraud proof for this pre-state root has already been finalized\\\";\\n string constant SLASHED = \\\"BondManager: Cannot finalize withdrawal, you probably got slashed\\\";\\n string constant WRONG_STATE = \\\"BondManager: Wrong bond state for proposer\\\";\\n string constant CANNOT_CLAIM = \\\"BondManager: Cannot claim yet. Dispute must be finalized first\\\";\\n\\n string constant WITHDRAWAL_PENDING = \\\"BondManager: Withdrawal already pending\\\";\\n string constant TOO_EARLY = \\\"BondManager: Too early to finalize your withdrawal\\\";\\n\\n string constant ONLY_TRANSITIONER = \\\"BondManager: Only the transitioner for this pre-state root may call this function\\\";\\n string constant ONLY_FRAUD_VERIFIER = \\\"BondManager: Only the fraud verifier may call this function\\\";\\n string constant ONLY_STATE_COMMITMENT_CHAIN = \\\"BondManager: Only the state commitment chain may call this function\\\";\\n string constant WAIT_FOR_DISPUTES = \\\"BondManager: Wait for other potential disputes\\\";\\n}\\n\\n/**\\n * @title iOVM_BondManager\\n */\\ninterface iOVM_BondManager {\\n\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n /// The lifecycle of a proposer's bond\\n enum State {\\n // Before depositing or after getting slashed, a user is uncollateralized\\n NOT_COLLATERALIZED,\\n // After depositing, a user is collateralized\\n COLLATERALIZED,\\n // After a user has initiated a withdrawal\\n WITHDRAWING\\n }\\n\\n /// A bond posted by a proposer\\n struct Bond {\\n // The user's state\\n State state;\\n // The timestamp at which a proposer issued their withdrawal request\\n uint32 withdrawalTimestamp;\\n // The time when the first disputed was initiated for this bond\\n uint256 firstDisputeAt;\\n // The earliest observed state root for this bond which has had fraud\\n bytes32 earliestDisputedStateRoot;\\n // The state root's timestamp\\n uint256 earliestTimestamp;\\n }\\n\\n // Per pre-state root, store the number of state provisions that were made\\n // and how many of these calls were made by each user. Payouts will then be\\n // claimed by users proportionally for that dispute.\\n struct Rewards {\\n // Flag to check if rewards for a fraud proof are claimable\\n bool canClaim;\\n // Total number of `recordGasSpent` calls made\\n uint256 total;\\n // The gas spent by each user to provide witness data. The sum of all\\n // values inside this map MUST be equal to the value of `total`\\n mapping(address => uint256) gasSpent;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function recordGasSpent(\\n bytes32 _preStateRoot,\\n bytes32 _txHash,\\n address _who,\\n uint256 _gasSpent\\n ) external;\\n\\n function finalize(\\n bytes32 _preStateRoot,\\n address _publisher,\\n uint256 _timestamp\\n ) external;\\n\\n function deposit() external;\\n\\n function startWithdrawal() external;\\n\\n function finalizeWithdrawal() external;\\n\\n function claim(\\n address _who\\n ) external;\\n\\n function isCollateralized(\\n address _who\\n ) external view returns (bool);\\n\\n function getGasSpent(\\n bytes32 _preStateRoot,\\n address _who\\n ) external view returns (uint256);\\n}\\n\",\"keccak256\":\"0x3c2a8a399487857158649db1896749d86e39cba545a8aeb2e2bb0f3bdfa7a5b1\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/verification/iOVM_FraudVerifier.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_StateTransitioner } from \\\"./iOVM_StateTransitioner.sol\\\";\\n\\n/**\\n * @title iOVM_FraudVerifier\\n */\\ninterface iOVM_FraudVerifier {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event FraudProofInitialized(\\n bytes32 _preStateRoot,\\n uint256 _preStateRootIndex,\\n bytes32 _transactionHash,\\n address _who\\n );\\n\\n event FraudProofFinalized(\\n bytes32 _preStateRoot,\\n uint256 _preStateRootIndex,\\n bytes32 _transactionHash,\\n address _who\\n );\\n\\n\\n /***************************************\\n * Public Functions: Transition Status *\\n ***************************************/\\n\\n function getStateTransitioner(bytes32 _preStateRoot, bytes32 _txHash) external view returns (iOVM_StateTransitioner _transitioner);\\n\\n\\n /****************************************\\n * Public Functions: Fraud Verification *\\n ****************************************/\\n\\n function initializeFraudVerification(\\n bytes32 _preStateRoot,\\n Lib_OVMCodec.ChainBatchHeader calldata _preStateRootBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof calldata _preStateRootProof,\\n Lib_OVMCodec.Transaction calldata _transaction,\\n Lib_OVMCodec.TransactionChainElement calldata _txChainElement,\\n Lib_OVMCodec.ChainBatchHeader calldata _transactionBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof calldata _transactionProof\\n ) external;\\n\\n function finalizeFraudVerification(\\n bytes32 _preStateRoot,\\n Lib_OVMCodec.ChainBatchHeader calldata _preStateRootBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof calldata _preStateRootProof,\\n bytes32 _txHash,\\n bytes32 _postStateRoot,\\n Lib_OVMCodec.ChainBatchHeader calldata _postStateRootBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof calldata _postStateRootProof\\n ) external;\\n}\\n\",\"keccak256\":\"0x5efd7bb18164bbd3e9d58379e8203fbf2a7ee802b1a48dff3ceaaec1523b1751\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/verification/iOVM_StateTransitioner.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title iOVM_StateTransitioner\\n */\\ninterface iOVM_StateTransitioner {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AccountCommitted(\\n address _address\\n );\\n\\n event ContractStorageCommitted(\\n address _address,\\n bytes32 _key\\n );\\n\\n\\n /**********************************\\n * Public Functions: State Access *\\n **********************************/\\n\\n function getPreStateRoot() external view returns (bytes32 _preStateRoot);\\n function getPostStateRoot() external view returns (bytes32 _postStateRoot);\\n function isComplete() external view returns (bool _complete);\\n\\n\\n /***********************************\\n * Public Functions: Pre-Execution *\\n ***********************************/\\n\\n function proveContractState(\\n address _ovmContractAddress,\\n address _ethContractAddress,\\n bytes calldata _stateTrieWitness\\n ) external;\\n\\n function proveStorageSlot(\\n address _ovmContractAddress,\\n bytes32 _key,\\n bytes calldata _storageTrieWitness\\n ) external;\\n\\n\\n /*******************************\\n * Public Functions: Execution *\\n *******************************/\\n\\n function applyTransaction(\\n Lib_OVMCodec.Transaction calldata _transaction\\n ) external;\\n\\n\\n /************************************\\n * Public Functions: Post-Execution *\\n ************************************/\\n\\n function commitContractState(\\n address _ovmContractAddress,\\n bytes calldata _stateTrieWitness\\n ) external;\\n\\n function commitStorageSlot(\\n address _ovmContractAddress,\\n bytes32 _key,\\n bytes calldata _storageTrieWitness\\n ) external;\\n\\n\\n /**********************************\\n * Public Functions: Finalization *\\n **********************************/\\n\\n function completeTransition() external;\\n}\\n\",\"keccak256\":\"0x3d044ac0a3bb6ad3d529f904b3191117511f9c379678ca03010e1ebdfcb5c34b\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/verification/iOVM_StateTransitionerFactory.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Contract Imports */\\nimport { iOVM_StateTransitioner } from \\\"./iOVM_StateTransitioner.sol\\\";\\n\\n/**\\n * @title iOVM_StateTransitionerFactory\\n */\\ninterface iOVM_StateTransitionerFactory {\\n\\n /***************************************\\n * Public Functions: Contract Creation *\\n ***************************************/\\n\\n function create(\\n address _proxyManager,\\n uint256 _stateTransitionIndex,\\n bytes32 _preStateRoot,\\n bytes32 _transactionHash\\n )\\n external\\n returns (\\n iOVM_StateTransitioner _ovmStateTransitioner\\n );\\n}\\n\",\"keccak256\":\"0x60a0f0c104e4c0c7863268a93005762e8146d393f9cfddfdd6a2d6585c5911fc\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/codec/Lib_OVMCodec.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../utils/Lib_Bytes32Utils.sol\\\";\\nimport { Lib_SafeExecutionManagerWrapper } from \\\"../../libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\\\";\\n\\n/**\\n * @title Lib_OVMCodec\\n */\\nlibrary Lib_OVMCodec {\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum EOASignatureType {\\n EIP155_TRANSACTION,\\n ETH_SIGNED_MESSAGE\\n }\\n\\n enum QueueOrigin {\\n SEQUENCER_QUEUE,\\n L1TOL2_QUEUE\\n }\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Account {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n address ethAddress;\\n bool isFresh;\\n }\\n\\n struct EVMAccount {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n }\\n\\n struct ChainBatchHeader {\\n uint256 batchIndex;\\n bytes32 batchRoot;\\n uint256 batchSize;\\n uint256 prevTotalElements;\\n bytes extraData;\\n }\\n\\n struct ChainInclusionProof {\\n uint256 index;\\n bytes32[] siblings;\\n }\\n\\n struct Transaction {\\n uint256 timestamp;\\n uint256 blockNumber;\\n QueueOrigin l1QueueOrigin;\\n address l1TxOrigin;\\n address entrypoint;\\n uint256 gasLimit;\\n bytes data;\\n }\\n\\n struct TransactionChainElement {\\n bool isSequenced;\\n uint256 queueIndex; // QUEUED TX ONLY\\n uint256 timestamp; // SEQUENCER TX ONLY\\n uint256 blockNumber; // SEQUENCER TX ONLY\\n bytes txData; // SEQUENCER TX ONLY\\n }\\n\\n struct QueueElement {\\n bytes32 transactionHash;\\n uint40 timestamp;\\n uint40 blockNumber;\\n }\\n\\n struct EIP155Transaction {\\n uint256 nonce;\\n uint256 gasPrice;\\n uint256 gasLimit;\\n address to;\\n uint256 value;\\n bytes data;\\n uint256 chainId;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Decodes an EOA transaction (i.e., native Ethereum RLP encoding).\\n * @param _transaction Encoded EOA transaction.\\n * @return Transaction decoded into a struct.\\n */\\n function decodeEIP155Transaction(\\n bytes memory _transaction,\\n bool _isEthSignedMessage\\n )\\n internal\\n pure\\n returns (\\n EIP155Transaction memory\\n )\\n {\\n if (_isEthSignedMessage) {\\n (\\n uint256 _nonce,\\n uint256 _gasLimit,\\n uint256 _gasPrice,\\n uint256 _chainId,\\n address _to,\\n bytes memory _data\\n ) = abi.decode(\\n _transaction,\\n (uint256, uint256, uint256, uint256, address ,bytes)\\n );\\n return EIP155Transaction({\\n nonce: _nonce,\\n gasPrice: _gasPrice,\\n gasLimit: _gasLimit,\\n to: _to,\\n value: 0,\\n data: _data,\\n chainId: _chainId\\n });\\n } else {\\n Lib_RLPReader.RLPItem[] memory decoded = Lib_RLPReader.readList(_transaction);\\n\\n return EIP155Transaction({\\n nonce: Lib_RLPReader.readUint256(decoded[0]),\\n gasPrice: Lib_RLPReader.readUint256(decoded[1]),\\n gasLimit: Lib_RLPReader.readUint256(decoded[2]),\\n to: Lib_RLPReader.readAddress(decoded[3]),\\n value: Lib_RLPReader.readUint256(decoded[4]),\\n data: Lib_RLPReader.readBytes(decoded[5]),\\n chainId: Lib_RLPReader.readUint256(decoded[6])\\n });\\n }\\n }\\n\\n /**\\n * Decompresses a compressed EIP155 transaction.\\n * @param _transaction Compressed EIP155 transaction bytes.\\n * @return Transaction parsed into a struct.\\n */\\n function decompressEIP155Transaction(\\n bytes memory _transaction\\n )\\n internal\\n returns (\\n EIP155Transaction memory\\n )\\n {\\n return EIP155Transaction({\\n gasLimit: Lib_BytesUtils.toUint24(_transaction, 0),\\n gasPrice: uint256(Lib_BytesUtils.toUint24(_transaction, 3)) * 1000000,\\n nonce: Lib_BytesUtils.toUint24(_transaction, 6),\\n to: Lib_BytesUtils.toAddress(_transaction, 9),\\n data: Lib_BytesUtils.slice(_transaction, 29),\\n chainId: Lib_SafeExecutionManagerWrapper.safeCHAINID(),\\n value: 0\\n });\\n }\\n\\n /**\\n * Encodes an EOA transaction back into the original transaction.\\n * @param _transaction EIP155transaction to encode.\\n * @param _isEthSignedMessage Whether or not this was an eth signed message.\\n * @return Encoded transaction.\\n */\\n function encodeEIP155Transaction(\\n EIP155Transaction memory _transaction,\\n bool _isEthSignedMessage\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n if (_isEthSignedMessage) {\\n return abi.encode(\\n _transaction.nonce,\\n _transaction.gasLimit,\\n _transaction.gasPrice,\\n _transaction.chainId,\\n _transaction.to,\\n _transaction.data\\n );\\n } else {\\n bytes[] memory raw = new bytes[](9);\\n\\n raw[0] = Lib_RLPWriter.writeUint(_transaction.nonce);\\n raw[1] = Lib_RLPWriter.writeUint(_transaction.gasPrice);\\n raw[2] = Lib_RLPWriter.writeUint(_transaction.gasLimit);\\n if (_transaction.to == address(0)) {\\n raw[3] = Lib_RLPWriter.writeBytes('');\\n } else {\\n raw[3] = Lib_RLPWriter.writeAddress(_transaction.to);\\n }\\n raw[4] = Lib_RLPWriter.writeUint(0);\\n raw[5] = Lib_RLPWriter.writeBytes(_transaction.data);\\n raw[6] = Lib_RLPWriter.writeUint(_transaction.chainId);\\n raw[7] = Lib_RLPWriter.writeBytes(bytes(''));\\n raw[8] = Lib_RLPWriter.writeBytes(bytes(''));\\n\\n return Lib_RLPWriter.writeList(raw);\\n }\\n }\\n\\n /**\\n * Encodes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Encoded transaction bytes.\\n */\\n function encodeTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return abi.encodePacked(\\n _transaction.timestamp,\\n _transaction.blockNumber,\\n _transaction.l1QueueOrigin,\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n );\\n }\\n\\n /**\\n * Hashes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Hashed transaction\\n */\\n function hashTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(encodeTransaction(_transaction));\\n }\\n\\n /**\\n * Converts an OVM account to an EVM account.\\n * @param _in OVM account to convert.\\n * @return Converted EVM account.\\n */\\n function toEVMAccount(\\n Account memory _in\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n return EVMAccount({\\n nonce: _in.nonce,\\n balance: _in.balance,\\n storageRoot: _in.storageRoot,\\n codeHash: _in.codeHash\\n });\\n }\\n\\n /**\\n * @notice RLP-encodes an account state struct.\\n * @param _account Account state struct.\\n * @return RLP-encoded account state.\\n */\\n function encodeEVMAccount(\\n EVMAccount memory _account\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes[] memory raw = new bytes[](4);\\n\\n // Unfortunately we can't create this array outright because\\n // Lib_RLPWriter.writeList will reject fixed-size arrays. Assigning\\n // index-by-index circumvents this issue.\\n raw[0] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.nonce)\\n )\\n );\\n raw[1] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.balance)\\n )\\n );\\n raw[2] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.storageRoot));\\n raw[3] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.codeHash));\\n\\n return Lib_RLPWriter.writeList(raw);\\n }\\n\\n /**\\n * @notice Decodes an RLP-encoded account state into a useful struct.\\n * @param _encoded RLP-encoded account state.\\n * @return Account state struct.\\n */\\n function decodeEVMAccount(\\n bytes memory _encoded\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\\n\\n return EVMAccount({\\n nonce: Lib_RLPReader.readUint256(accountState[0]),\\n balance: Lib_RLPReader.readUint256(accountState[1]),\\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\\n });\\n }\\n\\n /**\\n * Calculates a hash for a given batch header.\\n * @param _batchHeader Header to hash.\\n * @return Hash of the header.\\n */\\n function hashBatchHeader(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(\\n abi.encode(\\n _batchHeader.batchRoot,\\n _batchHeader.batchSize,\\n _batchHeader.prevTotalElements,\\n _batchHeader.extraData\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0xe7e518ba7bba3fa28c532f8902576c1bb4dfc1ec4b62bed6da50623248ba17c3\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Contract Imports */\\nimport { Ownable } from \\\"./Lib_Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n /*******************************************\\n * Contract Variables: Internal Accounting *\\n *******************************************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n public\\n onlyOwner\\n {\\n emit AddressSet(_name, _address);\\n addresses[_getNameHash(_name)] = _address;\\n }\\n\\n function getAddress(\\n string memory _name\\n )\\n public\\n view\\n returns (address)\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32 _hash\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0x3a490595cc21ff170e4027843093670ff845d5972481fbfb956b722ea564bb06\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n\\n /*******************************************\\n * Contract Variables: Contract References *\\n *******************************************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(\\n address _libAddressManager\\n ) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function resolve(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address _contract\\n )\\n {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0xaa3ed342f6deb156c660fd83afa579a3b80db17eb465e8949cf5c1b114780143\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Ownable\\n * @dev Adapted from https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol\\n */\\nabstract contract Ownable {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n address public owner;\\n\\n\\n /**********\\n * Events *\\n **********/\\n\\n event OwnershipTransferred(\\n address indexed previousOwner,\\n address indexed newOwner\\n );\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n constructor() {\\n owner = msg.sender;\\n emit OwnershipTransferred(address(0), owner);\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n owner == msg.sender,\\n \\\"Ownable: caller is not the owner\\\"\\n );\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function renounceOwnership()\\n public\\n virtual\\n onlyOwner\\n {\\n emit OwnershipTransferred(owner, address(0));\\n owner = address(0);\\n }\\n\\n function transferOwnership(address _newOwner)\\n public\\n virtual\\n onlyOwner\\n {\\n require(\\n _newOwner != address(0),\\n \\\"Ownable: new owner cannot be the zero address\\\"\\n );\\n\\n emit OwnershipTransferred(owner, _newOwner);\\n owner = _newOwner;\\n }\\n}\\n\",\"keccak256\":\"0xd9dfd9264e5b5fedd53a5b10fdf179c3f367614b0fe69179bce4e45119f5b739\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPReader.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_RLPReader\\n * @dev Adapted from \\\"RLPReader\\\" by Hamdi Allam (hamdi.allam97@gmail.com).\\n */\\nlibrary Lib_RLPReader {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 constant internal MAX_LIST_LENGTH = 32;\\n\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum RLPItemType {\\n DATA_ITEM,\\n LIST_ITEM\\n }\\n\\n \\n /***********\\n * Structs *\\n ***********/\\n\\n struct RLPItem {\\n uint256 length;\\n uint256 ptr;\\n }\\n \\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n \\n /**\\n * Converts bytes to a reference to memory position and length.\\n * @param _in Input bytes to convert.\\n * @return Output memory reference.\\n */\\n function toRLPItem(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem memory\\n )\\n {\\n uint256 ptr;\\n assembly {\\n ptr := add(_in, 32)\\n }\\n\\n return RLPItem({\\n length: _in.length,\\n ptr: ptr\\n });\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n (\\n uint256 listOffset,\\n ,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.LIST_ITEM,\\n \\\"Invalid RLP list value.\\\"\\n );\\n\\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\\n // writing to the length. Since we can't know the number of RLP items without looping over\\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\\n // simply set a reasonable maximum list length and decrease the size before we finish.\\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\\n\\n uint256 itemCount = 0;\\n uint256 offset = listOffset;\\n while (offset < _in.length) {\\n require(\\n itemCount < MAX_LIST_LENGTH,\\n \\\"Provided RLP list exceeds max list length.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n ) = _decodeLength(RLPItem({\\n length: _in.length - offset,\\n ptr: _in.ptr + offset\\n }));\\n\\n out[itemCount] = RLPItem({\\n length: itemLength + itemOffset,\\n ptr: _in.ptr + offset\\n });\\n\\n itemCount += 1;\\n offset += itemOffset + itemLength;\\n }\\n\\n // Decrease the array size to match the actual item count.\\n assembly {\\n mstore(out, itemCount)\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n return readList(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes value.\\\"\\n );\\n\\n return _copy(_in.ptr, itemOffset, itemLength);\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return readBytes(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return string(readBytes(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return readString(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n require(\\n _in.length <= 33,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr + itemOffset;\\n bytes32 out;\\n assembly {\\n out := mload(ptr)\\n\\n // Shift the bytes over to match the item size.\\n if lt(itemLength, 32) {\\n out := div(out, exp(256, sub(32, itemLength)))\\n }\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return readBytes32(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return uint256(readBytes32(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return readUint256(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n require(\\n _in.length == 1,\\n \\\"Invalid RLP boolean value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 out;\\n assembly {\\n out := byte(0, mload(ptr))\\n }\\n\\n require(\\n out == 0 || out == 1,\\n \\\"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\\\"\\n );\\n\\n return out != 0;\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return readBool(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n if (_in.length == 1) {\\n return address(0);\\n }\\n\\n require(\\n _in.length == 21,\\n \\\"Invalid RLP address value.\\\"\\n );\\n\\n return address(readUint256(_in));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return readAddress(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads the raw bytes of an RLP item.\\n * @param _in RLP item to read.\\n * @return Raw RLP bytes.\\n */\\n function readRawBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in);\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Decodes the length of an RLP item.\\n * @param _in RLP item to decode.\\n * @return Offset of the encoded data.\\n * @return Length of the encoded data.\\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\\n */\\n function _decodeLength(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n uint256,\\n uint256,\\n RLPItemType\\n )\\n {\\n require(\\n _in.length > 0,\\n \\\"RLP item cannot be null.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 prefix;\\n assembly {\\n prefix := byte(0, mload(ptr))\\n }\\n\\n if (prefix <= 0x7f) {\\n // Single byte.\\n\\n return (0, 1, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xb7) {\\n // Short string.\\n\\n uint256 strLen = prefix - 0x80;\\n \\n require(\\n _in.length > strLen,\\n \\\"Invalid RLP short string.\\\"\\n );\\n\\n return (1, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xbf) {\\n // Long string.\\n uint256 lenOfStrLen = prefix - 0xb7;\\n\\n require(\\n _in.length > lenOfStrLen,\\n \\\"Invalid RLP long string length.\\\"\\n );\\n\\n uint256 strLen;\\n assembly {\\n // Pick out the string length.\\n strLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfStrLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfStrLen + strLen,\\n \\\"Invalid RLP long string.\\\"\\n );\\n\\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xf7) {\\n // Short list.\\n uint256 listLen = prefix - 0xc0;\\n\\n require(\\n _in.length > listLen,\\n \\\"Invalid RLP short list.\\\"\\n );\\n\\n return (1, listLen, RLPItemType.LIST_ITEM);\\n } else {\\n // Long list.\\n uint256 lenOfListLen = prefix - 0xf7;\\n\\n require(\\n _in.length > lenOfListLen,\\n \\\"Invalid RLP long list length.\\\"\\n );\\n\\n uint256 listLen;\\n assembly {\\n // Pick out the list length.\\n listLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfListLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfListLen + listLen,\\n \\\"Invalid RLP long list.\\\"\\n );\\n\\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\\n }\\n }\\n\\n /**\\n * Copies the bytes from a memory location.\\n * @param _src Pointer to the location to read from.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Copied bytes.\\n */\\n function _copy(\\n uint256 _src,\\n uint256 _offset,\\n uint256 _length\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out = new bytes(_length);\\n if (out.length == 0) {\\n return out;\\n }\\n\\n uint256 src = _src + _offset;\\n uint256 dest;\\n assembly {\\n dest := add(out, 32)\\n }\\n\\n // Copy over as many complete words as we can.\\n for (uint256 i = 0; i < _length / 32; i++) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n\\n src += 32;\\n dest += 32;\\n }\\n\\n // Pick out the remaining bytes.\\n uint256 mask = 256 ** (32 - (_length % 32)) - 1;\\n assembly {\\n mstore(\\n dest,\\n or(\\n and(mload(src), not(mask)),\\n and(mload(dest), mask)\\n )\\n )\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Copies an RLP item into bytes.\\n * @param _in RLP item to copy.\\n * @return Copied bytes.\\n */\\n function _copy(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in.ptr, 0, _in.length);\\n }\\n}\\n\",\"keccak256\":\"0xbdb8fae0ca2483b4cc07607a5070fc25e33c54b4e4462b99e7c0b13aac48a09b\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPWriter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\n\\n/**\\n * @title Lib_RLPWriter\\n * @author Bakaoh (with modifications)\\n */\\nlibrary Lib_RLPWriter {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * RLP encodes a byte string.\\n * @param _in The byte string to encode.\\n * @return _out The RLP encoded string in bytes.\\n */\\n function writeBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n bytes memory encoded;\\n\\n if (_in.length == 1 && uint8(_in[0]) < 128) {\\n encoded = _in;\\n } else {\\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * RLP encodes a list of RLP encoded byte byte strings.\\n * @param _in The list of RLP encoded byte strings.\\n * @return _out The RLP encoded list of items in bytes.\\n */\\n function writeList(\\n bytes[] memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n bytes memory list = _flatten(_in);\\n return abi.encodePacked(_writeLength(list.length, 192), list);\\n }\\n\\n /**\\n * RLP encodes a string.\\n * @param _in The string to encode.\\n * @return _out The RLP encoded string in bytes.\\n */\\n function writeString(\\n string memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(bytes(_in));\\n }\\n\\n /**\\n * RLP encodes an address.\\n * @param _in The address to encode.\\n * @return _out The RLP encoded address in bytes.\\n */\\n function writeAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a uint.\\n * @param _in The uint256 to encode.\\n * @return _out The RLP encoded uint256 in bytes.\\n */\\n function writeUint(\\n uint256 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(_toBinary(_in));\\n }\\n\\n /**\\n * RLP encodes a bool.\\n * @param _in The bool to encode.\\n * @return _out The RLP encoded bool in bytes.\\n */\\n function writeBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n bytes memory encoded = new bytes(1);\\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\\n return encoded;\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\\n * @param _len The length of the string or the payload.\\n * @param _offset 128 if item is string, 192 if item is list.\\n * @return _encoded RLP encoded bytes.\\n */\\n function _writeLength(\\n uint256 _len,\\n uint256 _offset\\n )\\n private\\n pure\\n returns (\\n bytes memory _encoded\\n )\\n {\\n bytes memory encoded;\\n\\n if (_len < 56) {\\n encoded = new bytes(1);\\n encoded[0] = byte(uint8(_len) + uint8(_offset));\\n } else {\\n uint256 lenLen;\\n uint256 i = 1;\\n while (_len / i != 0) {\\n lenLen++;\\n i *= 256;\\n }\\n\\n encoded = new bytes(lenLen + 1);\\n encoded[0] = byte(uint8(lenLen) + uint8(_offset) + 55);\\n for(i = 1; i <= lenLen; i++) {\\n encoded[i] = byte(uint8((_len / (256**(lenLen-i))) % 256));\\n }\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * Encode integer in big endian binary form with no leading zeroes.\\n * @notice TODO: This should be optimized with assembly to save gas costs.\\n * @param _x The integer to encode.\\n * @return _binary RLP encoded bytes.\\n */\\n function _toBinary(\\n uint256 _x\\n )\\n private\\n pure\\n returns (\\n bytes memory _binary\\n )\\n {\\n bytes memory b = abi.encodePacked(_x);\\n\\n uint256 i = 0;\\n for (; i < 32; i++) {\\n if (b[i] != 0) {\\n break;\\n }\\n }\\n\\n bytes memory res = new bytes(32 - i);\\n for (uint256 j = 0; j < res.length; j++) {\\n res[j] = b[i++];\\n }\\n\\n return res;\\n }\\n\\n /**\\n * Copies a piece of memory to another location.\\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\\n * @param _dest Destination location.\\n * @param _src Source location.\\n * @param _len Length of memory to copy.\\n */\\n function _memcpy(\\n uint256 _dest,\\n uint256 _src,\\n uint256 _len\\n )\\n private\\n pure\\n {\\n uint256 dest = _dest;\\n uint256 src = _src;\\n uint256 len = _len;\\n\\n for(; len >= 32; len -= 32) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n dest += 32;\\n src += 32;\\n }\\n\\n uint256 mask = 256 ** (32 - len) - 1;\\n assembly {\\n let srcpart := and(mload(src), not(mask))\\n let destpart := and(mload(dest), mask)\\n mstore(dest, or(destpart, srcpart))\\n }\\n }\\n\\n /**\\n * Flattens a list of byte strings into one byte string.\\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\\n * @param _list List of byte strings to flatten.\\n * @return _flattened The flattened byte string.\\n */\\n function _flatten(\\n bytes[] memory _list\\n )\\n private\\n pure\\n returns (\\n bytes memory _flattened\\n )\\n {\\n if (_list.length == 0) {\\n return new bytes(0);\\n }\\n\\n uint256 len;\\n uint256 i = 0;\\n for (; i < _list.length; i++) {\\n len += _list[i].length;\\n }\\n\\n bytes memory flattened = new bytes(len);\\n uint256 flattenedPtr;\\n assembly { flattenedPtr := add(flattened, 0x20) }\\n\\n for(i = 0; i < _list.length; i++) {\\n bytes memory item = _list[i];\\n\\n uint256 listPtr;\\n assembly { listPtr := add(item, 0x20)}\\n\\n _memcpy(flattenedPtr, listPtr, item.length);\\n flattenedPtr += _list[i].length;\\n }\\n\\n return flattened;\\n }\\n}\",\"keccak256\":\"0xbcb24619c1758cb0d9f3fe5c79495950045a9087046a02b9ce01df46ae09ae5b\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_Bytes32Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_Byte32Utils\\n */\\nlibrary Lib_Bytes32Utils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \\\"true.\\\"\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as a boolean.\\n */\\n function toBool(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return _in != 0;\\n }\\n\\n /**\\n * Converts a boolean to a bytes32 value.\\n * @param _in Input boolean value.\\n * @return Boolean as a bytes32.\\n */\\n function fromBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in ? 1 : 0));\\n }\\n\\n /**\\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as an address.\\n */\\n function toAddress(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return address(uint160(uint256(_in)));\\n }\\n\\n /**\\n * Converts an address to a bytes32.\\n * @param _in Input address value.\\n * @return Address as a bytes32.\\n */\\n function fromAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in));\\n }\\n\\n /**\\n * Removes the leading zeros from a bytes32 value and returns a new (smaller) bytes value.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 without any leading zeros.\\n */\\n function removeLeadingZeros(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out;\\n\\n assembly {\\n // Figure out how many leading zero bytes to remove.\\n let shift := 0\\n for { let i := 0 } and(lt(i, 32), eq(byte(i, _in), 0)) { i := add(i, 1) } {\\n shift := add(shift, 1)\\n }\\n\\n // Reserve some space for our output and fix the free memory pointer.\\n out := mload(0x40)\\n mstore(0x40, add(out, 0x40))\\n\\n // Shift the value and store it into the output bytes.\\n mstore(add(out, 0x20), shl(mul(shift, 8), _in))\\n\\n // Store the new size (with leading zero bytes removed) in the output byte size.\\n mstore(out, sub(32, shift))\\n }\\n\\n return out;\\n }\\n}\\n\",\"keccak256\":\"0xfa2def593e3fc56a31852c3744aefdaa93cec74e721bfcfeb1e5d166c7c60b64\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_BytesUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_BytesUtils\\n */\\nlibrary Lib_BytesUtils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_start + _length >= _start, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n if (_bytes.length - _start == 0) {\\n return bytes('');\\n }\\n\\n return slice(_bytes, _start, _bytes.length - _start);\\n }\\n\\n function toBytes32PadLeft(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes32)\\n {\\n bytes32 ret;\\n uint256 len = _bytes.length <= 32 ? _bytes.length : 32;\\n assembly {\\n ret := shr(mul(sub(32, len), 8), mload(add(_bytes, 32)))\\n }\\n return ret;\\n }\\n\\n function toBytes32(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes32)\\n {\\n if (_bytes.length < 32) {\\n bytes32 ret;\\n assembly {\\n ret := mload(add(_bytes, 32))\\n }\\n return ret;\\n }\\n\\n return abi.decode(_bytes,(bytes32)); // will truncate if input length > 32 bytes\\n }\\n\\n function toUint256(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (uint256)\\n {\\n return uint256(toBytes32(_bytes));\\n }\\n\\n function toUint24(bytes memory _bytes, uint256 _start) internal pure returns (uint24) {\\n require(_start + 3 >= _start, \\\"toUint24_overflow\\\");\\n require(_bytes.length >= _start + 3 , \\\"toUint24_outOfBounds\\\");\\n uint24 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x3), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toUint8(bytes memory _bytes, uint256 _start) internal pure returns (uint8) {\\n require(_start + 1 >= _start, \\\"toUint8_overflow\\\");\\n require(_bytes.length >= _start + 1 , \\\"toUint8_outOfBounds\\\");\\n uint8 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x1), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toAddress(bytes memory _bytes, uint256 _start) internal pure returns (address) {\\n require(_start + 20 >= _start, \\\"toAddress_overflow\\\");\\n require(_bytes.length >= _start + 20, \\\"toAddress_outOfBounds\\\");\\n address tempAddress;\\n\\n assembly {\\n tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000)\\n }\\n\\n return tempAddress;\\n }\\n\\n function toNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n bytes memory nibbles = new bytes(_bytes.length * 2);\\n\\n for (uint256 i = 0; i < _bytes.length; i++) {\\n nibbles[i * 2] = _bytes[i] >> 4;\\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\\n }\\n\\n return nibbles;\\n }\\n\\n function fromNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n bytes memory ret = new bytes(_bytes.length / 2);\\n\\n for (uint256 i = 0; i < ret.length; i++) {\\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\\n }\\n\\n return ret;\\n }\\n\\n function equal(\\n bytes memory _bytes,\\n bytes memory _other\\n )\\n internal\\n pure\\n returns (bool)\\n {\\n return keccak256(_bytes) == keccak256(_other);\\n }\\n}\\n\",\"keccak256\":\"0x0adf22e1b22ba09911e859f64cb3b484e992be4f9fd3b09088e6225bf8d06ce0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_ErrorUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/**\\n * @title Lib_ErrorUtils\\n */\\nlibrary Lib_ErrorUtils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Encodes an error string into raw solidity-style revert data.\\n * (i.e. ascii bytes, prefixed with bytes4(keccak(\\\"Error(string))\\\"))\\n * Ref: https://docs.soliditylang.org/en/v0.8.2/control-structures.html?highlight=Error(string)#panic-via-assert-and-error-via-require\\n * @param _reason Reason for the reversion.\\n * @return Standard solidity revert data for the given reason.\\n */\\n function encodeRevertString(\\n string memory _reason\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return abi.encodeWithSignature(\\n \\\"Error(string)\\\",\\n _reason\\n );\\n }\\n}\\n\",\"keccak256\":\"0xfc64ec4a81fb50865b502a0004ed154e8598e1a313db77303fc95e41f536e6b7\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_ErrorUtils } from \\\"../utils/Lib_ErrorUtils.sol\\\";\\n\\n/**\\n * @title Lib_SafeExecutionManagerWrapper\\n * @dev The Safe Execution Manager Wrapper provides functions which facilitate writing OVM safe \\n * code using the standard solidity compiler, by routing all its operations through the Execution \\n * Manager.\\n * \\n * Compiler used: solc\\n * Runtime target: OVM\\n */\\nlibrary Lib_SafeExecutionManagerWrapper {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Performs a safe ovmCALL.\\n * @param _gasLimit Gas limit for the call.\\n * @param _target Address to call.\\n * @param _calldata Data to send to the call.\\n * @return _success Whether or not the call reverted.\\n * @return _returndata Data returned by the call.\\n */\\n function safeCALL(\\n uint256 _gasLimit,\\n address _target,\\n bytes memory _calldata\\n )\\n internal\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCALL(uint256,address,bytes)\\\",\\n _gasLimit,\\n _target,\\n _calldata\\n )\\n );\\n\\n return abi.decode(returndata, (bool, bytes));\\n }\\n\\n /**\\n * Performs a safe ovmDELEGATECALL.\\n * @param _gasLimit Gas limit for the call.\\n * @param _target Address to call.\\n * @param _calldata Data to send to the call.\\n * @return _success Whether or not the call reverted.\\n * @return _returndata Data returned by the call.\\n */\\n function safeDELEGATECALL(\\n uint256 _gasLimit,\\n address _target,\\n bytes memory _calldata\\n )\\n internal\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmDELEGATECALL(uint256,address,bytes)\\\",\\n _gasLimit,\\n _target,\\n _calldata\\n )\\n );\\n\\n return abi.decode(returndata, (bool, bytes));\\n }\\n\\n /**\\n * Performs a safe ovmCREATE call.\\n * @param _gasLimit Gas limit for the creation.\\n * @param _bytecode Code for the new contract.\\n * @return _contract Address of the created contract.\\n */\\n function safeCREATE(\\n uint256 _gasLimit,\\n bytes memory _bytecode\\n )\\n internal\\n returns (\\n address,\\n bytes memory\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n _gasLimit,\\n abi.encodeWithSignature(\\n \\\"ovmCREATE(bytes)\\\",\\n _bytecode\\n )\\n );\\n\\n return abi.decode(returndata, (address, bytes));\\n }\\n\\n /**\\n * Performs a safe ovmEXTCODESIZE call.\\n * @param _contract Address of the contract to query the size of.\\n * @return _EXTCODESIZE Size of the requested contract in bytes.\\n */\\n function safeEXTCODESIZE(\\n address _contract\\n )\\n internal\\n returns (\\n uint256 _EXTCODESIZE\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmEXTCODESIZE(address)\\\",\\n _contract\\n )\\n );\\n\\n return abi.decode(returndata, (uint256));\\n }\\n\\n /**\\n * Performs a safe ovmCHAINID call.\\n * @return _CHAINID Result of calling ovmCHAINID.\\n */\\n function safeCHAINID()\\n internal\\n returns (\\n uint256 _CHAINID\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCHAINID()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (uint256));\\n }\\n\\n /**\\n * Performs a safe ovmCALLER call.\\n * @return _CALLER Result of calling ovmCALLER.\\n */\\n function safeCALLER()\\n internal\\n returns (\\n address _CALLER\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCALLER()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (address));\\n }\\n\\n /**\\n * Performs a safe ovmADDRESS call.\\n * @return _ADDRESS Result of calling ovmADDRESS.\\n */\\n function safeADDRESS()\\n internal\\n returns (\\n address _ADDRESS\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmADDRESS()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (address));\\n }\\n\\n /**\\n * Performs a safe ovmGETNONCE call.\\n * @return _nonce Result of calling ovmGETNONCE.\\n */\\n function safeGETNONCE()\\n internal\\n returns (\\n uint256 _nonce\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmGETNONCE()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (uint256));\\n }\\n\\n /**\\n * Performs a safe ovmINCREMENTNONCE call.\\n */\\n function safeINCREMENTNONCE()\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmINCREMENTNONCE()\\\"\\n )\\n );\\n }\\n\\n /**\\n * Performs a safe ovmCREATEEOA call.\\n * @param _messageHash Message hash which was signed by EOA\\n * @param _v v value of signature (0 or 1)\\n * @param _r r value of signature\\n * @param _s s value of signature\\n */\\n function safeCREATEEOA(\\n bytes32 _messageHash,\\n uint8 _v,\\n bytes32 _r,\\n bytes32 _s\\n )\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCREATEEOA(bytes32,uint8,bytes32,bytes32)\\\",\\n _messageHash,\\n _v,\\n _r,\\n _s\\n )\\n );\\n }\\n\\n /**\\n * Performs a safe REVERT.\\n * @param _reason String revert reason to pass along with the REVERT.\\n */\\n function safeREVERT(\\n string memory _reason\\n )\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmREVERT(bytes)\\\",\\n Lib_ErrorUtils.encodeRevertString(\\n _reason\\n )\\n )\\n );\\n }\\n\\n /**\\n * Performs a safe \\\"require\\\".\\n * @param _condition Boolean condition that must be true or will revert.\\n * @param _reason String revert reason to pass along with the REVERT.\\n */\\n function safeREQUIRE(\\n bool _condition,\\n string memory _reason\\n )\\n internal\\n {\\n if (!_condition) {\\n safeREVERT(\\n _reason\\n );\\n }\\n }\\n\\n /**\\n * Performs a safe ovmSLOAD call.\\n */\\n function safeSLOAD(\\n bytes32 _key\\n )\\n internal\\n returns (\\n bytes32\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmSLOAD(bytes32)\\\",\\n _key\\n )\\n );\\n\\n return abi.decode(returndata, (bytes32));\\n }\\n\\n /**\\n * Performs a safe ovmSSTORE call.\\n */\\n function safeSSTORE(\\n bytes32 _key,\\n bytes32 _value\\n )\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmSSTORE(bytes32,bytes32)\\\",\\n _key,\\n _value\\n )\\n );\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Performs an ovm interaction and the necessary safety checks.\\n * @param _gasLimit Gas limit for the interaction.\\n * @param _calldata Data to send to the OVM_ExecutionManager (encoded with sighash).\\n * @return _returndata Data sent back by the OVM_ExecutionManager.\\n */\\n function _safeExecutionManagerInteraction(\\n uint256 _gasLimit,\\n bytes memory _calldata\\n )\\n private\\n returns (\\n bytes memory _returndata\\n )\\n {\\n address ovmExecutionManager = msg.sender;\\n (\\n bool success,\\n bytes memory returndata\\n ) = ovmExecutionManager.call{gas: _gasLimit}(_calldata);\\n\\n if (success == false) {\\n assembly {\\n revert(add(returndata, 0x20), mload(returndata))\\n }\\n } else if (returndata.length == 1) {\\n assembly {\\n return(0, 1)\\n }\\n } else {\\n return returndata;\\n }\\n }\\n\\n function _safeExecutionManagerInteraction(\\n bytes memory _calldata\\n )\\n private\\n returns (\\n bytes memory _returndata\\n )\\n {\\n return _safeExecutionManagerInteraction(\\n gasleft(),\\n _calldata\\n );\\n }\\n}\\n\",\"keccak256\":\"0x41e146e7912af794a17cd43c5a276674be956bfa8f3ca5b451bcb82d81e6f492\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x608060405234801561001057600080fd5b5060405161181838038061181883398101604081905261002f91610054565b600080546001600160a01b0319166001600160a01b0392909216919091179055610082565b600060208284031215610065578081fd5b81516001600160a01b038116811461007b578182fd5b9392505050565b611787806100916000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c8063299ca4781461005c578063461a44781461007a57806398d8867d1461008d578063a286ba1c146100a2578063b48ec820146100b5575b600080fd5b6100646100c8565b6040516100719190611306565b60405180910390f35b610064610088366004611101565b6100d7565b6100a061009b366004611029565b6101b5565b005b6100a06100b0366004610f64565b6104f4565b6100646100c3366004610f43565b6108bb565b6000546001600160a01b031681565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b8381101561013757818101518382015260200161011f565b50505050905090810190601f1680156101645780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561018157600080fd5b505afa158015610195573d6000803e3d6000fd5b505050506040513d60208110156101ab57600080fd5b505190505b919050565b866101bf8561090a565b60005a905060006101cf8861090a565b90506101db8b82610923565b156101e65750610432565b60006102216040518060400160405280601881526020017727ab26afa9ba30ba32a1b7b6b6b4ba36b2b73a21b430b4b760411b8152506100d7565b905060006102636040518060400160405280601d81526020017f4f564d5f43616e6f6e6963616c5472616e73616374696f6e436861696e0000008152506100d7565b9050816001600160a01b0316634d69ee578e8e8e6040518463ffffffff1660e01b81526004016102959392919061135f565b60206040518083038186803b1580156102ad57600080fd5b505afa1580156102c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102e59190610f0f565b61030a5760405162461bcd60e51b8152600401610301906115e7565b60405180910390fd5b6040516326f2b4e760e11b81526001600160a01b03821690634de569ce9061033c908d908d908d908d90600401611641565b60206040518083038186803b15801561035457600080fd5b505afa158015610368573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061038c9190610f0f565b6103a85760405162461bcd60e51b815260040161030190611499565b86600001518860600151018b600001518d6060015101600101146103de5760405162461bcd60e51b815260040161030190611525565b6103ed8d848d60000151610942565b7f41a48bde2468fac6f670f39b66d7b91f311053e1f28eab9d75056546e6eaac958d8c6000015185336040516104269493929190611394565b60405180910390a15050505b60005a820390506104696040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506100d7565b6001600160a01b0316631e16e92f858533856040518563ffffffff1660e01b815260040180858152602001848152602001836001600160a01b03168152602001828152602001945050505050600060405180830381600087803b1580156104cf57600080fd5b505af11580156104e3573d6000803e3d6000fd5b505050505050505050505050505050565b868460005a905060006105078b896108bb565b905060006105446040518060400160405280601881526020017727ab26afa9ba30ba32a1b7b6b6b4ba36b2b73a21b430b4b760411b8152506100d7565b9050816001600160a01b031663b2fa1c9e6040518163ffffffff1660e01b815260040160206040518083038186803b15801561057f57600080fd5b505afa158015610593573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b79190610f0f565b15156001146105d85760405162461bcd60e51b8152600401610301906113b8565b89600001518b606001510160010186600001518860600151011461060e5760405162461bcd60e51b81526004016103019061141f565b604051634d69ee5760e01b81526001600160a01b03821690634d69ee579061063e908f908f908f9060040161135f565b60206040518083038186803b15801561065657600080fd5b505afa15801561066a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061068e9190610f0f565b6106aa5760405162461bcd60e51b8152600401610301906115e7565b604051634d69ee5760e01b81526001600160a01b03821690634d69ee57906106da908b908b908b9060040161135f565b60206040518083038186803b1580156106f257600080fd5b505afa158015610706573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061072a9190610f0f565b6107465760405162461bcd60e51b8152600401610301906114dd565b816001600160a01b031663c1c618b86040518163ffffffff1660e01b815260040160206040518083038186803b15801561077f57600080fd5b505afa158015610793573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107b79190610f2b565b8814156107d65760405162461bcd60e51b815260040161030190611597565b6107e0878d610a6d565b6000600160008e8c6040516020016107f9929190611289565b60405160208183030381529060405280519060200120815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b031602179055507f1e5fff3c23daf51ea67aaa3bbc738bcedaa98be5a5503f0e63a336a004b075b18c8b600001518b3360405161087a9493929190611394565b60405180910390a1505060005a820390506104696040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506100d7565b60006001600084846040516020016108d4929190611289565b60408051808303601f19018152918152815160209283012083529082019290925201600020546001600160a01b03169392505050565b600061091582610bc7565b805190602001209050919050565b60008061093084846108bb565b6001600160a01b031614159392505050565b6109806040518060400160405280601c81526020017f4f564d5f53746174655472616e736974696f6e6572466163746f7279000000008152506100d7565b600054604051631168a38160e11b81526001600160a01b03928316926322d14702926109b79291169085908890889060040161131a565b602060405180830381600087803b1580156109d157600080fd5b505af11580156109e5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a0991906110e5565b600160008585604051602001610a20929190611289565b60405160208183030381529060405280519060200120815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b03160217905550505050565b6000610aa86040518060400160405280601881526020017727ab26afa9ba30ba32a1b7b6b6b4ba36b2b73a21b430b4b760411b8152506100d7565b90506000610adc6040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506100d7565b604051632e38626b60e21b81529091506001600160a01b0383169063b8e189ac90610b0b90879060040161162e565b600060405180830381600087803b158015610b2557600080fd5b505af1158015610b39573d6000803e3d6000fd5b505050506000808560800151806020019051810190610b58919061114f565b60405163abfbbe1360e01b815291935091506001600160a01b0384169063abfbbe1390610b8d90889085908790600401611340565b600060405180830381600087803b158015610ba757600080fd5b505af1158015610bbb573d6000803e3d6000fd5b50505050505050505050565b6060816000015182602001518360400151846060015185608001518660a001518760c00151604051602001610c029796959493929190611297565b6040516020818303038152906040529050919050565b600067ffffffffffffffff831115610c2c57fe5b610c3f601f8401601f1916602001611700565b9050828152838383011115610c5357600080fd5b828260208301376000602084830101529392505050565b80356101b081611754565b600082601f830112610c85578081fd5b610c9483833560208501610c18565b9392505050565b8035600281106101b057600080fd5b600060a08284031215610cbb578081fd5b60405160a0810167ffffffffffffffff8282108183111715610cd957fe5b81604052829350843583526020850135602084015260408501356040840152606085013560608401526080850135915080821115610d1657600080fd5b50610d2385828601610c75565b6080830152505092915050565b600060408284031215610d41578081fd5b6040516040810167ffffffffffffffff8282108183111715610d5f57fe5b8160405282935084358352602091508185013581811115610d7f57600080fd5b8501601f81018713610d9057600080fd5b803582811115610d9c57fe5b8381029250610dac848401611700565b8181528481019083860185850187018b1015610dc757600080fd5b600095505b83861015610dea578035835260019590950194918601918601610dcc565b5080868801525050505050505092915050565b600060a08284031215610e0e578081fd5b60405160a0810167ffffffffffffffff8282108183111715610e2c57fe5b8160405282935084359150610e408261176c565b8183526020850135602084015260408501356040840152606085013560608401526080850135915080821115610d1657600080fd5b600060e08284031215610e86578081fd5b610e9060e0611700565b90508135815260208201356020820152610eac60408301610c9b565b6040820152610ebd60608301610c6a565b6060820152610ece60808301610c6a565b608082015260a082013560a082015260c082013567ffffffffffffffff811115610ef757600080fd5b610f0384828501610c75565b60c08301525092915050565b600060208284031215610f20578081fd5b8151610c948161176c565b600060208284031215610f3c578081fd5b5051919050565b60008060408385031215610f55578081fd5b50508035926020909101359150565b600080600080600080600060e0888a031215610f7e578283fd5b87359650602088013567ffffffffffffffff80821115610f9c578485fd5b610fa88b838c01610caa565b975060408a0135915080821115610fbd578485fd5b610fc98b838c01610d30565b965060608a0135955060808a0135945060a08a0135915080821115610fec578384fd5b610ff88b838c01610caa565b935060c08a013591508082111561100d578283fd5b5061101a8a828b01610d30565b91505092959891949750929550565b600080600080600080600060e0888a031215611043578081fd5b87359650602088013567ffffffffffffffff80821115611061578283fd5b61106d8b838c01610caa565b975060408a0135915080821115611082578283fd5b61108e8b838c01610d30565b965060608a01359150808211156110a3578283fd5b6110af8b838c01610e75565b955060808a01359150808211156110c4578283fd5b6110d08b838c01610dfd565b945060a08a0135915080821115610fec578283fd5b6000602082840312156110f6578081fd5b8151610c9481611754565b600060208284031215611112578081fd5b813567ffffffffffffffff811115611128578182fd5b8201601f81018413611138578182fd5b61114784823560208401610c18565b949350505050565b60008060408385031215611161578182fd5b82519150602083015161117381611754565b809150509250929050565b6001600160a01b03169052565b600081518084526111a3816020860160208601611724565b601f01601f19169290920160200192915050565b600081518352602082015160208401526040820151604084015260608201516060840152608082015160a0608085015261114760a085018261118b565b6000604083018251845260208084015160408287015282815180855260608801915083830194508592505b8083101561123f578451825293830193600192909201919083019061121f565b509695505050505050565b6000815115158352602082015160208401526040820151604084015260608201516060840152608082015160a0608085015261114760a085018261118b565b918252602082015260400190565b6000888252876020830152600287106112ac57fe5b8660f81b60408301526bffffffffffffffffffffffff19808760601b166041840152808660601b1660558401525083606983015282516112f3816089850160208701611724565b9190910160890198975050505050505050565b6001600160a01b0391909116815260200190565b6001600160a01b0394909416845260208401929092526040830152606082015260800190565b9283526001600160a01b03919091166020830152604082015260600190565b60008482526060602083015261137860608301856111b7565b828103604084015261138a81856111f4565b9695505050505050565b938452602084019290925260408301526001600160a01b0316606082015260800190565b60208082526041908201527f5374617465207472616e736974696f6e2070726f63657373206d75737420626560408201527f20636f6d706c65746564207072696f7220746f2066696e616c697a6174696f6e6060820152601760f91b608082015260a00190565b60208082526054908201527f506f73742d737461746520726f6f7420676c6f62616c20696e646578206d757360408201527f7420657175616c20746f207468652070726520737461746520726f6f7420676c60608201527337b130b61034b73232bc1038363ab99037b7329760611b608082015260a00190565b60208082526024908201527f496e76616c6964207472616e73616374696f6e20696e636c7573696f6e20707260408201526337b7b31760e11b606082015260800190565b60208082526028908201527f496e76616c696420706f73742d737461746520726f6f7420696e636c7573696f6040820152673710383937b7b31760c11b606082015260800190565b6020808252604c908201527f5072652d737461746520726f6f7420676c6f62616c20696e646578206d75737460408201527f20657175616c20746f20746865207472616e73616374696f6e20726f6f74206760608201526b3637b130b61034b73232bc1760a11b608082015260a00190565b60208082526030908201527f5374617465207472616e736974696f6e20686173206e6f74206265656e20707260408201526f37bb32b710333930bab23ab632b73a1760811b606082015260800190565b60208082526027908201527f496e76616c6964207072652d737461746520726f6f7420696e636c7573696f6e60408201526610383937b7b31760c91b606082015260800190565b600060208252610c9460208301846111b7565b60006080825285516080830152602086015160a083015260408601516002811061166757fe5b60c083015260608601516001600160a01b031660e0830152608086015161169261010084018261117e565b5060a086015161012083015260c086015160e06101408401526116b961016084018261118b565b905082810360208401526116cd818761124a565b905082810360408401526116e181866111b7565b905082810360608401526116f581856111f4565b979650505050505050565b60405181810167ffffffffffffffff8111828210171561171c57fe5b604052919050565b60005b8381101561173f578181015183820152602001611727565b8381111561174e576000848401525b50505050565b6001600160a01b038116811461176957600080fd5b50565b801515811461176957600080fdfea164736f6c6343000706000a", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100575760003560e01c8063299ca4781461005c578063461a44781461007a57806398d8867d1461008d578063a286ba1c146100a2578063b48ec820146100b5575b600080fd5b6100646100c8565b6040516100719190611306565b60405180910390f35b610064610088366004611101565b6100d7565b6100a061009b366004611029565b6101b5565b005b6100a06100b0366004610f64565b6104f4565b6100646100c3366004610f43565b6108bb565b6000546001600160a01b031681565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b8381101561013757818101518382015260200161011f565b50505050905090810190601f1680156101645780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561018157600080fd5b505afa158015610195573d6000803e3d6000fd5b505050506040513d60208110156101ab57600080fd5b505190505b919050565b866101bf8561090a565b60005a905060006101cf8861090a565b90506101db8b82610923565b156101e65750610432565b60006102216040518060400160405280601881526020017727ab26afa9ba30ba32a1b7b6b6b4ba36b2b73a21b430b4b760411b8152506100d7565b905060006102636040518060400160405280601d81526020017f4f564d5f43616e6f6e6963616c5472616e73616374696f6e436861696e0000008152506100d7565b9050816001600160a01b0316634d69ee578e8e8e6040518463ffffffff1660e01b81526004016102959392919061135f565b60206040518083038186803b1580156102ad57600080fd5b505afa1580156102c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102e59190610f0f565b61030a5760405162461bcd60e51b8152600401610301906115e7565b60405180910390fd5b6040516326f2b4e760e11b81526001600160a01b03821690634de569ce9061033c908d908d908d908d90600401611641565b60206040518083038186803b15801561035457600080fd5b505afa158015610368573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061038c9190610f0f565b6103a85760405162461bcd60e51b815260040161030190611499565b86600001518860600151018b600001518d6060015101600101146103de5760405162461bcd60e51b815260040161030190611525565b6103ed8d848d60000151610942565b7f41a48bde2468fac6f670f39b66d7b91f311053e1f28eab9d75056546e6eaac958d8c6000015185336040516104269493929190611394565b60405180910390a15050505b60005a820390506104696040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506100d7565b6001600160a01b0316631e16e92f858533856040518563ffffffff1660e01b815260040180858152602001848152602001836001600160a01b03168152602001828152602001945050505050600060405180830381600087803b1580156104cf57600080fd5b505af11580156104e3573d6000803e3d6000fd5b505050505050505050505050505050565b868460005a905060006105078b896108bb565b905060006105446040518060400160405280601881526020017727ab26afa9ba30ba32a1b7b6b6b4ba36b2b73a21b430b4b760411b8152506100d7565b9050816001600160a01b031663b2fa1c9e6040518163ffffffff1660e01b815260040160206040518083038186803b15801561057f57600080fd5b505afa158015610593573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b79190610f0f565b15156001146105d85760405162461bcd60e51b8152600401610301906113b8565b89600001518b606001510160010186600001518860600151011461060e5760405162461bcd60e51b81526004016103019061141f565b604051634d69ee5760e01b81526001600160a01b03821690634d69ee579061063e908f908f908f9060040161135f565b60206040518083038186803b15801561065657600080fd5b505afa15801561066a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061068e9190610f0f565b6106aa5760405162461bcd60e51b8152600401610301906115e7565b604051634d69ee5760e01b81526001600160a01b03821690634d69ee57906106da908b908b908b9060040161135f565b60206040518083038186803b1580156106f257600080fd5b505afa158015610706573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061072a9190610f0f565b6107465760405162461bcd60e51b8152600401610301906114dd565b816001600160a01b031663c1c618b86040518163ffffffff1660e01b815260040160206040518083038186803b15801561077f57600080fd5b505afa158015610793573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107b79190610f2b565b8814156107d65760405162461bcd60e51b815260040161030190611597565b6107e0878d610a6d565b6000600160008e8c6040516020016107f9929190611289565b60405160208183030381529060405280519060200120815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b031602179055507f1e5fff3c23daf51ea67aaa3bbc738bcedaa98be5a5503f0e63a336a004b075b18c8b600001518b3360405161087a9493929190611394565b60405180910390a1505060005a820390506104696040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506100d7565b60006001600084846040516020016108d4929190611289565b60408051808303601f19018152918152815160209283012083529082019290925201600020546001600160a01b03169392505050565b600061091582610bc7565b805190602001209050919050565b60008061093084846108bb565b6001600160a01b031614159392505050565b6109806040518060400160405280601c81526020017f4f564d5f53746174655472616e736974696f6e6572466163746f7279000000008152506100d7565b600054604051631168a38160e11b81526001600160a01b03928316926322d14702926109b79291169085908890889060040161131a565b602060405180830381600087803b1580156109d157600080fd5b505af11580156109e5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a0991906110e5565b600160008585604051602001610a20929190611289565b60405160208183030381529060405280519060200120815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b03160217905550505050565b6000610aa86040518060400160405280601881526020017727ab26afa9ba30ba32a1b7b6b6b4ba36b2b73a21b430b4b760411b8152506100d7565b90506000610adc6040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506100d7565b604051632e38626b60e21b81529091506001600160a01b0383169063b8e189ac90610b0b90879060040161162e565b600060405180830381600087803b158015610b2557600080fd5b505af1158015610b39573d6000803e3d6000fd5b505050506000808560800151806020019051810190610b58919061114f565b60405163abfbbe1360e01b815291935091506001600160a01b0384169063abfbbe1390610b8d90889085908790600401611340565b600060405180830381600087803b158015610ba757600080fd5b505af1158015610bbb573d6000803e3d6000fd5b50505050505050505050565b6060816000015182602001518360400151846060015185608001518660a001518760c00151604051602001610c029796959493929190611297565b6040516020818303038152906040529050919050565b600067ffffffffffffffff831115610c2c57fe5b610c3f601f8401601f1916602001611700565b9050828152838383011115610c5357600080fd5b828260208301376000602084830101529392505050565b80356101b081611754565b600082601f830112610c85578081fd5b610c9483833560208501610c18565b9392505050565b8035600281106101b057600080fd5b600060a08284031215610cbb578081fd5b60405160a0810167ffffffffffffffff8282108183111715610cd957fe5b81604052829350843583526020850135602084015260408501356040840152606085013560608401526080850135915080821115610d1657600080fd5b50610d2385828601610c75565b6080830152505092915050565b600060408284031215610d41578081fd5b6040516040810167ffffffffffffffff8282108183111715610d5f57fe5b8160405282935084358352602091508185013581811115610d7f57600080fd5b8501601f81018713610d9057600080fd5b803582811115610d9c57fe5b8381029250610dac848401611700565b8181528481019083860185850187018b1015610dc757600080fd5b600095505b83861015610dea578035835260019590950194918601918601610dcc565b5080868801525050505050505092915050565b600060a08284031215610e0e578081fd5b60405160a0810167ffffffffffffffff8282108183111715610e2c57fe5b8160405282935084359150610e408261176c565b8183526020850135602084015260408501356040840152606085013560608401526080850135915080821115610d1657600080fd5b600060e08284031215610e86578081fd5b610e9060e0611700565b90508135815260208201356020820152610eac60408301610c9b565b6040820152610ebd60608301610c6a565b6060820152610ece60808301610c6a565b608082015260a082013560a082015260c082013567ffffffffffffffff811115610ef757600080fd5b610f0384828501610c75565b60c08301525092915050565b600060208284031215610f20578081fd5b8151610c948161176c565b600060208284031215610f3c578081fd5b5051919050565b60008060408385031215610f55578081fd5b50508035926020909101359150565b600080600080600080600060e0888a031215610f7e578283fd5b87359650602088013567ffffffffffffffff80821115610f9c578485fd5b610fa88b838c01610caa565b975060408a0135915080821115610fbd578485fd5b610fc98b838c01610d30565b965060608a0135955060808a0135945060a08a0135915080821115610fec578384fd5b610ff88b838c01610caa565b935060c08a013591508082111561100d578283fd5b5061101a8a828b01610d30565b91505092959891949750929550565b600080600080600080600060e0888a031215611043578081fd5b87359650602088013567ffffffffffffffff80821115611061578283fd5b61106d8b838c01610caa565b975060408a0135915080821115611082578283fd5b61108e8b838c01610d30565b965060608a01359150808211156110a3578283fd5b6110af8b838c01610e75565b955060808a01359150808211156110c4578283fd5b6110d08b838c01610dfd565b945060a08a0135915080821115610fec578283fd5b6000602082840312156110f6578081fd5b8151610c9481611754565b600060208284031215611112578081fd5b813567ffffffffffffffff811115611128578182fd5b8201601f81018413611138578182fd5b61114784823560208401610c18565b949350505050565b60008060408385031215611161578182fd5b82519150602083015161117381611754565b809150509250929050565b6001600160a01b03169052565b600081518084526111a3816020860160208601611724565b601f01601f19169290920160200192915050565b600081518352602082015160208401526040820151604084015260608201516060840152608082015160a0608085015261114760a085018261118b565b6000604083018251845260208084015160408287015282815180855260608801915083830194508592505b8083101561123f578451825293830193600192909201919083019061121f565b509695505050505050565b6000815115158352602082015160208401526040820151604084015260608201516060840152608082015160a0608085015261114760a085018261118b565b918252602082015260400190565b6000888252876020830152600287106112ac57fe5b8660f81b60408301526bffffffffffffffffffffffff19808760601b166041840152808660601b1660558401525083606983015282516112f3816089850160208701611724565b9190910160890198975050505050505050565b6001600160a01b0391909116815260200190565b6001600160a01b0394909416845260208401929092526040830152606082015260800190565b9283526001600160a01b03919091166020830152604082015260600190565b60008482526060602083015261137860608301856111b7565b828103604084015261138a81856111f4565b9695505050505050565b938452602084019290925260408301526001600160a01b0316606082015260800190565b60208082526041908201527f5374617465207472616e736974696f6e2070726f63657373206d75737420626560408201527f20636f6d706c65746564207072696f7220746f2066696e616c697a6174696f6e6060820152601760f91b608082015260a00190565b60208082526054908201527f506f73742d737461746520726f6f7420676c6f62616c20696e646578206d757360408201527f7420657175616c20746f207468652070726520737461746520726f6f7420676c60608201527337b130b61034b73232bc1038363ab99037b7329760611b608082015260a00190565b60208082526024908201527f496e76616c6964207472616e73616374696f6e20696e636c7573696f6e20707260408201526337b7b31760e11b606082015260800190565b60208082526028908201527f496e76616c696420706f73742d737461746520726f6f7420696e636c7573696f6040820152673710383937b7b31760c11b606082015260800190565b6020808252604c908201527f5072652d737461746520726f6f7420676c6f62616c20696e646578206d75737460408201527f20657175616c20746f20746865207472616e73616374696f6e20726f6f74206760608201526b3637b130b61034b73232bc1760a11b608082015260a00190565b60208082526030908201527f5374617465207472616e736974696f6e20686173206e6f74206265656e20707260408201526f37bb32b710333930bab23ab632b73a1760811b606082015260800190565b60208082526027908201527f496e76616c6964207072652d737461746520726f6f7420696e636c7573696f6e60408201526610383937b7b31760c91b606082015260800190565b600060208252610c9460208301846111b7565b60006080825285516080830152602086015160a083015260408601516002811061166757fe5b60c083015260608601516001600160a01b031660e0830152608086015161169261010084018261117e565b5060a086015161012083015260c086015160e06101408401526116b961016084018261118b565b905082810360208401526116cd818761124a565b905082810360408401526116e181866111b7565b905082810360608401526116f581856111f4565b979650505050505050565b60405181810167ffffffffffffffff8111828210171561171c57fe5b604052919050565b60005b8381101561173f578181015183820152602001611727565b8381111561174e576000848401525b50505050565b6001600160a01b038116811461176957600080fd5b50565b801515811461176957600080fdfea164736f6c6343000706000a", + "solcInputHash": "5ee8e508e2c54cb5ac6783b4855b1558", + "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"_preStateRoot\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_preStateRootIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"_transactionHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_who\",\"type\":\"address\"}],\"name\":\"FraudProofFinalized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"_preStateRoot\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_preStateRootIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"_transactionHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_who\",\"type\":\"address\"}],\"name\":\"FraudProofInitialized\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_preStateRoot\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"_preStateRootBatchHeader\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"siblings\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct Lib_OVMCodec.ChainInclusionProof\",\"name\":\"_preStateRootProof\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"_txHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"_postStateRoot\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"_postStateRootBatchHeader\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"siblings\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct Lib_OVMCodec.ChainInclusionProof\",\"name\":\"_postStateRootProof\",\"type\":\"tuple\"}],\"name\":\"finalizeFraudVerification\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_preStateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"_txHash\",\"type\":\"bytes32\"}],\"name\":\"getStateTransitioner\",\"outputs\":[{\"internalType\":\"contract iOVM_StateTransitioner\",\"name\":\"_transitioner\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_preStateRoot\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"_preStateRootBatchHeader\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"siblings\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct Lib_OVMCodec.ChainInclusionProof\",\"name\":\"_preStateRootProof\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"enum Lib_OVMCodec.QueueOrigin\",\"name\":\"l1QueueOrigin\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"l1TxOrigin\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"entrypoint\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.Transaction\",\"name\":\"_transaction\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isSequenced\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"queueIndex\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"txData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.TransactionChainElement\",\"name\":\"_txChainElement\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"_transactionBatchHeader\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"siblings\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct Lib_OVMCodec.ChainInclusionProof\",\"name\":\"_transactionProof\",\"type\":\"tuple\"}],\"name\":\"initializeFraudVerification\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The Fraud Verifier contract coordinates the entire fraud proof verification process. If the fraud proof was successful it prunes any state batches from State Commitment Chain which were published after the fraudulent state root. Compiler used: solc Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\"}},\"finalizeFraudVerification(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes32,bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))\":{\"params\":{\"_postStateRoot\":\"State root after the fraudulent transaction.\",\"_postStateRootBatchHeader\":\"Batch header for the provided post-state root.\",\"_postStateRootProof\":\"Inclusion proof for the provided post-state root.\",\"_preStateRoot\":\"State root before the fraudulent transaction.\",\"_preStateRootBatchHeader\":\"Batch header for the provided pre-state root.\",\"_preStateRootProof\":\"Inclusion proof for the provided pre-state root.\",\"_txHash\":\"The transaction for the state root\"}},\"getStateTransitioner(bytes32,bytes32)\":{\"params\":{\"_preStateRoot\":\"State root to query a transitioner for.\"},\"returns\":{\"_transitioner\":\"Corresponding state transitioner contract.\"}},\"initializeFraudVerification(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),(uint256,uint256,uint8,address,address,uint256,bytes),(bool,uint256,uint256,uint256,bytes),(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))\":{\"params\":{\"_preStateRoot\":\"State root before the fraudulent transaction.\",\"_preStateRootBatchHeader\":\"Batch header for the provided pre-state root.\",\"_preStateRootProof\":\"Inclusion proof for the provided pre-state root.\",\"_transaction\":\"OVM transaction claimed to be fraudulent.\",\"_transactionBatchHeader\":\"Batch header for the provided transaction.\",\"_transactionProof\":\"Inclusion proof for the provided transaction.\",\"_txChainElement\":\"OVM transaction chain element.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}}},\"title\":\"OVM_FraudVerifier\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"finalizeFraudVerification(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes32,bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))\":{\"notice\":\"Finalizes the fraud verification process.\"},\"getStateTransitioner(bytes32,bytes32)\":{\"notice\":\"Retrieves the state transitioner for a given root.\"},\"initializeFraudVerification(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),(uint256,uint256,uint8,address,address,uint256,bytes),(bool,uint256,uint256,uint256,bytes),(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))\":{\"notice\":\"Begins the fraud verification process.\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/OVM/verification/OVM_FraudVerifier.sol\":\"OVM_FraudVerifier\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor () internal {\\n address msgSender = _msgSender();\\n _owner = msgSender;\\n emit OwnershipTransferred(address(0), msgSender);\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n emit OwnershipTransferred(_owner, address(0));\\n _owner = address(0);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n emit OwnershipTransferred(_owner, newOwner);\\n _owner = newOwner;\\n }\\n}\\n\",\"keccak256\":\"0x15e2d5bd4c28a88548074c54d220e8086f638a71ed07e6b3ba5a70066fcf458d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with GSN meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address payable) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes memory) {\\n this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x8d3cb350f04ff49cfb10aef08d87f19dcbaecc8027b0bed12f3275cd12f38cf0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/verification/Abs_FraudContributor.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\nimport { iOVM_BondManager } from \\\"../../iOVM/verification/iOVM_BondManager.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/// Minimal contract to be inherited by contracts consumed by users that provide\\n/// data for fraud proofs\\nabstract contract Abs_FraudContributor is Lib_AddressResolver {\\n /// Decorate your functions with this modifier to store how much total gas was\\n /// consumed by the sender, to reward users fairly\\n modifier contributesToFraudProof(bytes32 preStateRoot, bytes32 txHash) {\\n uint256 startGas = gasleft();\\n _;\\n uint256 gasSpent = startGas - gasleft();\\n iOVM_BondManager(resolve('OVM_BondManager')).recordGasSpent(preStateRoot, txHash, msg.sender, gasSpent);\\n }\\n}\\n\",\"keccak256\":\"0x6c27d089a297103cb93b30f7649ab68691cc6b948c315f1037e5de1fe9bf5903\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/verification/OVM_FraudVerifier.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_FraudVerifier } from \\\"../../iOVM/verification/iOVM_FraudVerifier.sol\\\";\\nimport { iOVM_StateTransitioner } from \\\"../../iOVM/verification/iOVM_StateTransitioner.sol\\\";\\nimport { iOVM_StateTransitionerFactory } from \\\"../../iOVM/verification/iOVM_StateTransitionerFactory.sol\\\";\\nimport { iOVM_BondManager } from \\\"../../iOVM/verification/iOVM_BondManager.sol\\\";\\nimport { iOVM_StateCommitmentChain } from \\\"../../iOVM/chain/iOVM_StateCommitmentChain.sol\\\";\\nimport { iOVM_CanonicalTransactionChain } from \\\"../../iOVM/chain/iOVM_CanonicalTransactionChain.sol\\\";\\n\\n/* Contract Imports */\\nimport { Abs_FraudContributor } from \\\"./Abs_FraudContributor.sol\\\";\\n\\n\\n\\n/**\\n * @title OVM_FraudVerifier\\n * @dev The Fraud Verifier contract coordinates the entire fraud proof verification process.\\n * If the fraud proof was successful it prunes any state batches from State Commitment Chain\\n * which were published after the fraudulent state root.\\n *\\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract OVM_FraudVerifier is Lib_AddressResolver, Abs_FraudContributor, iOVM_FraudVerifier {\\n\\n /*******************************************\\n * Contract Variables: Internal Accounting *\\n *******************************************/\\n\\n mapping (bytes32 => iOVM_StateTransitioner) internal transitioners;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n */\\n constructor(\\n address _libAddressManager\\n )\\n Lib_AddressResolver(_libAddressManager)\\n {}\\n\\n\\n /***************************************\\n * Public Functions: Transition Status *\\n ***************************************/\\n\\n /**\\n * Retrieves the state transitioner for a given root.\\n * @param _preStateRoot State root to query a transitioner for.\\n * @return _transitioner Corresponding state transitioner contract.\\n */\\n function getStateTransitioner(\\n bytes32 _preStateRoot,\\n bytes32 _txHash\\n )\\n override\\n public\\n view\\n returns (\\n iOVM_StateTransitioner _transitioner\\n )\\n {\\n return transitioners[keccak256(abi.encodePacked(_preStateRoot, _txHash))];\\n }\\n\\n\\n /****************************************\\n * Public Functions: Fraud Verification *\\n ****************************************/\\n\\n /**\\n * Begins the fraud verification process.\\n * @param _preStateRoot State root before the fraudulent transaction.\\n * @param _preStateRootBatchHeader Batch header for the provided pre-state root.\\n * @param _preStateRootProof Inclusion proof for the provided pre-state root.\\n * @param _transaction OVM transaction claimed to be fraudulent.\\n * @param _txChainElement OVM transaction chain element.\\n * @param _transactionBatchHeader Batch header for the provided transaction.\\n * @param _transactionProof Inclusion proof for the provided transaction.\\n */\\n function initializeFraudVerification(\\n bytes32 _preStateRoot,\\n Lib_OVMCodec.ChainBatchHeader memory _preStateRootBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _preStateRootProof,\\n Lib_OVMCodec.Transaction memory _transaction,\\n Lib_OVMCodec.TransactionChainElement memory _txChainElement,\\n Lib_OVMCodec.ChainBatchHeader memory _transactionBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _transactionProof\\n )\\n override\\n public\\n contributesToFraudProof(_preStateRoot, Lib_OVMCodec.hashTransaction(_transaction))\\n {\\n bytes32 _txHash = Lib_OVMCodec.hashTransaction(_transaction);\\n\\n if (_hasStateTransitioner(_preStateRoot, _txHash)) {\\n return;\\n }\\n\\n iOVM_StateCommitmentChain ovmStateCommitmentChain = iOVM_StateCommitmentChain(resolve(\\\"OVM_StateCommitmentChain\\\"));\\n iOVM_CanonicalTransactionChain ovmCanonicalTransactionChain = iOVM_CanonicalTransactionChain(resolve(\\\"OVM_CanonicalTransactionChain\\\"));\\n\\n require(\\n ovmStateCommitmentChain.verifyStateCommitment(\\n _preStateRoot,\\n _preStateRootBatchHeader,\\n _preStateRootProof\\n ),\\n \\\"Invalid pre-state root inclusion proof.\\\"\\n );\\n\\n require(\\n ovmCanonicalTransactionChain.verifyTransaction(\\n _transaction,\\n _txChainElement,\\n _transactionBatchHeader,\\n _transactionProof\\n ),\\n \\\"Invalid transaction inclusion proof.\\\"\\n );\\n\\n require (\\n _preStateRootBatchHeader.prevTotalElements + _preStateRootProof.index + 1 == _transactionBatchHeader.prevTotalElements + _transactionProof.index,\\n \\\"Pre-state root global index must equal to the transaction root global index.\\\"\\n );\\n\\n _deployTransitioner(_preStateRoot, _txHash, _preStateRootProof.index);\\n\\n emit FraudProofInitialized(\\n _preStateRoot,\\n _preStateRootProof.index,\\n _txHash,\\n msg.sender\\n );\\n }\\n\\n /**\\n * Finalizes the fraud verification process.\\n * @param _preStateRoot State root before the fraudulent transaction.\\n * @param _preStateRootBatchHeader Batch header for the provided pre-state root.\\n * @param _preStateRootProof Inclusion proof for the provided pre-state root.\\n * @param _txHash The transaction for the state root\\n * @param _postStateRoot State root after the fraudulent transaction.\\n * @param _postStateRootBatchHeader Batch header for the provided post-state root.\\n * @param _postStateRootProof Inclusion proof for the provided post-state root.\\n */\\n function finalizeFraudVerification(\\n bytes32 _preStateRoot,\\n Lib_OVMCodec.ChainBatchHeader memory _preStateRootBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _preStateRootProof,\\n bytes32 _txHash,\\n bytes32 _postStateRoot,\\n Lib_OVMCodec.ChainBatchHeader memory _postStateRootBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _postStateRootProof\\n )\\n override\\n public\\n contributesToFraudProof(_preStateRoot, _txHash)\\n {\\n iOVM_StateTransitioner transitioner = getStateTransitioner(_preStateRoot, _txHash);\\n iOVM_StateCommitmentChain ovmStateCommitmentChain = iOVM_StateCommitmentChain(resolve(\\\"OVM_StateCommitmentChain\\\"));\\n\\n require(\\n transitioner.isComplete() == true,\\n \\\"State transition process must be completed prior to finalization.\\\"\\n );\\n\\n require (\\n _postStateRootBatchHeader.prevTotalElements + _postStateRootProof.index == _preStateRootBatchHeader.prevTotalElements + _preStateRootProof.index + 1,\\n \\\"Post-state root global index must equal to the pre state root global index plus one.\\\"\\n );\\n\\n require(\\n ovmStateCommitmentChain.verifyStateCommitment(\\n _preStateRoot,\\n _preStateRootBatchHeader,\\n _preStateRootProof\\n ),\\n \\\"Invalid pre-state root inclusion proof.\\\"\\n );\\n\\n require(\\n ovmStateCommitmentChain.verifyStateCommitment(\\n _postStateRoot,\\n _postStateRootBatchHeader,\\n _postStateRootProof\\n ),\\n \\\"Invalid post-state root inclusion proof.\\\"\\n );\\n\\n // If the post state root did not match, then there was fraud and we should delete the batch\\n require(\\n _postStateRoot != transitioner.getPostStateRoot(),\\n \\\"State transition has not been proven fraudulent.\\\"\\n );\\n\\n _cancelStateTransition(_postStateRootBatchHeader, _preStateRoot);\\n\\n // TEMPORARY: Remove the transitioner; for minnet.\\n transitioners[keccak256(abi.encodePacked(_preStateRoot, _txHash))] = iOVM_StateTransitioner(0x0000000000000000000000000000000000000000);\\n\\n emit FraudProofFinalized(\\n _preStateRoot,\\n _preStateRootProof.index,\\n _txHash,\\n msg.sender\\n );\\n }\\n\\n\\n /************************************\\n * Internal Functions: Verification *\\n ************************************/\\n\\n /**\\n * Checks whether a transitioner already exists for a given pre-state root.\\n * @param _preStateRoot Pre-state root to check.\\n * @return _exists Whether or not we already have a transitioner for the root.\\n */\\n function _hasStateTransitioner(\\n bytes32 _preStateRoot,\\n bytes32 _txHash\\n )\\n internal\\n view\\n returns (\\n bool _exists\\n )\\n {\\n return address(getStateTransitioner(_preStateRoot, _txHash)) != address(0);\\n }\\n\\n /**\\n * Deploys a new state transitioner.\\n * @param _preStateRoot Pre-state root to initialize the transitioner with.\\n * @param _txHash Hash of the transaction this transitioner will execute.\\n * @param _stateTransitionIndex Index of the transaction in the chain.\\n */\\n function _deployTransitioner(\\n bytes32 _preStateRoot,\\n bytes32 _txHash,\\n uint256 _stateTransitionIndex\\n )\\n internal\\n {\\n transitioners[keccak256(abi.encodePacked(_preStateRoot, _txHash))] = iOVM_StateTransitionerFactory(\\n resolve(\\\"OVM_StateTransitionerFactory\\\")\\n ).create(\\n address(libAddressManager),\\n _stateTransitionIndex,\\n _preStateRoot,\\n _txHash\\n );\\n }\\n\\n /**\\n * Removes a state transition from the state commitment chain.\\n * @param _postStateRootBatchHeader Header for the post-state root.\\n * @param _preStateRoot Pre-state root hash.\\n */\\n function _cancelStateTransition(\\n Lib_OVMCodec.ChainBatchHeader memory _postStateRootBatchHeader,\\n bytes32 _preStateRoot\\n )\\n internal\\n {\\n iOVM_StateCommitmentChain ovmStateCommitmentChain = iOVM_StateCommitmentChain(resolve(\\\"OVM_StateCommitmentChain\\\"));\\n iOVM_BondManager ovmBondManager = iOVM_BondManager(resolve(\\\"OVM_BondManager\\\"));\\n\\n // Delete the state batch.\\n ovmStateCommitmentChain.deleteStateBatch(\\n _postStateRootBatchHeader\\n );\\n\\n // Get the timestamp and publisher for that block.\\n (uint256 timestamp, address publisher) = abi.decode(_postStateRootBatchHeader.extraData, (uint256, address));\\n\\n // Slash the bonds at the bond manager.\\n ovmBondManager.finalize(\\n _preStateRoot,\\n publisher,\\n timestamp\\n );\\n }\\n}\\n\",\"keccak256\":\"0x879cef57019254ad958a75db64f0b58eb0a6fcf74f386ed958f75384b860dd35\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_CanonicalTransactionChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_ChainStorageContainer } from \\\"./iOVM_ChainStorageContainer.sol\\\";\\n\\n/**\\n * @title iOVM_CanonicalTransactionChain\\n */\\ninterface iOVM_CanonicalTransactionChain {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event TransactionEnqueued(\\n address _l1TxOrigin,\\n address _target,\\n uint256 _gasLimit,\\n bytes _data,\\n uint256 _queueIndex,\\n uint256 _timestamp\\n );\\n\\n event QueueBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event SequencerBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event TransactionBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct BatchContext {\\n uint256 numSequencedTransactions;\\n uint256 numSubsequentQueueTransactions;\\n uint256 timestamp;\\n uint256 blockNumber;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n\\n /**\\n * Accesses the batch storage container.\\n * @return Reference to the batch storage container.\\n */\\n function batches()\\n external\\n view\\n returns (\\n iOVM_ChainStorageContainer\\n );\\n\\n /**\\n * Accesses the queue storage container.\\n * @return Reference to the queue storage container.\\n */\\n function queue()\\n external\\n view\\n returns (\\n iOVM_ChainStorageContainer\\n );\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements()\\n external\\n view\\n returns (\\n uint256 _totalElements\\n );\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches()\\n external\\n view\\n returns (\\n uint256 _totalBatches\\n );\\n\\n /**\\n * Returns the index of the next element to be enqueued.\\n * @return Index for the next queue element.\\n */\\n function getNextQueueIndex()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Gets the queue element at a particular index.\\n * @param _index Index of the queue element to access.\\n * @return _element Queue element at the given index.\\n */\\n function getQueueElement(\\n uint256 _index\\n )\\n external\\n view\\n returns (\\n Lib_OVMCodec.QueueElement memory _element\\n );\\n\\n /**\\n * Returns the timestamp of the last transaction.\\n * @return Timestamp for the last transaction.\\n */\\n function getLastTimestamp()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Returns the blocknumber of the last transaction.\\n * @return Blocknumber for the last transaction.\\n */\\n function getLastBlockNumber()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Get the number of queue elements which have not yet been included.\\n * @return Number of pending queue elements.\\n */\\n function getNumPendingQueueElements()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Retrieves the length of the queue, including\\n * both pending and canonical transactions.\\n * @return Length of the queue.\\n */\\n function getQueueLength()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n\\n /**\\n * Adds a transaction to the queue.\\n * @param _target Target contract to send the transaction to.\\n * @param _gasLimit Gas limit for the given transaction.\\n * @param _data Transaction data.\\n */\\n function enqueue(\\n address _target,\\n uint256 _gasLimit,\\n bytes memory _data\\n )\\n external;\\n\\n /**\\n * Appends a given number of queued transactions as a single batch.\\n * @param _numQueuedTransactions Number of transactions to append.\\n */\\n function appendQueueBatch(\\n uint256 _numQueuedTransactions\\n )\\n external;\\n\\n /**\\n * Allows the sequencer to append a batch of transactions.\\n * @dev This function uses a custom encoding scheme for efficiency reasons.\\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\\n * .param _contexts Array of batch contexts.\\n * .param _transactionDataFields Array of raw transaction data.\\n */\\n function appendSequencerBatch(\\n // uint40 _shouldStartAtElement,\\n // uint24 _totalElementsToAppend,\\n // BatchContext[] _contexts,\\n // bytes[] _transactionDataFields\\n )\\n external;\\n\\n /**\\n * Verifies whether a transaction is included in the chain.\\n * @param _transaction Transaction to verify.\\n * @param _txChainElement Transaction chain element corresponding to the transaction.\\n * @param _batchHeader Header of the batch the transaction was included in.\\n * @param _inclusionProof Inclusion proof for the provided transaction chain element.\\n * @return True if the transaction exists in the CTC, false if not.\\n */\\n function verifyTransaction(\\n Lib_OVMCodec.Transaction memory _transaction,\\n Lib_OVMCodec.TransactionChainElement memory _txChainElement,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _inclusionProof\\n )\\n external\\n view\\n returns (\\n bool\\n );\\n}\\n\",\"keccak256\":\"0xb5e55488a1982841c07cdf5ff475da4789596f111dd48f01b1918ee4c775cf3a\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_ChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title iOVM_ChainStorageContainer\\n */\\ninterface iOVM_ChainStorageContainer {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata()\\n external\\n view\\n returns (\\n bytes27\\n );\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length()\\n external\\n view\\n returns (\\n uint256\\n );\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(\\n bytes32 _object\\n )\\n external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(\\n bytes32 _object,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(\\n uint256 _index\\n )\\n external\\n view\\n returns (\\n bytes32\\n );\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index\\n )\\n external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Marks an index as overwritable, meaing the underlying buffer can start to write values over\\n * any objects before and including the given index.\\n */\\n function setNextOverwritableIndex(\\n uint256 _index\\n )\\n external;\\n}\\n\",\"keccak256\":\"0x2d7973a0ad84c23ec62624d3f1e3aeb198cc72686ff1e6cfa17155556b320c94\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_StateCommitmentChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title iOVM_StateCommitmentChain\\n */\\ninterface iOVM_StateCommitmentChain {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event StateBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n event StateBatchDeleted(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot\\n );\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements()\\n external\\n view\\n returns (\\n uint256 _totalElements\\n );\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches()\\n external\\n view\\n returns (\\n uint256 _totalBatches\\n );\\n\\n /**\\n * Retrieves the timestamp of the last batch submitted by the sequencer.\\n * @return _lastSequencerTimestamp Last sequencer batch timestamp.\\n */\\n function getLastSequencerTimestamp()\\n external\\n view\\n returns (\\n uint256 _lastSequencerTimestamp\\n );\\n\\n /**\\n * Appends a batch of state roots to the chain.\\n * @param _batch Batch of state roots.\\n * @param _shouldStartAtElement Index of the element at which this batch should start.\\n */\\n function appendStateBatch(\\n bytes32[] calldata _batch,\\n uint256 _shouldStartAtElement\\n )\\n external;\\n\\n /**\\n * Deletes all state roots after (and including) a given batch.\\n * @param _batchHeader Header of the batch to start deleting from.\\n */\\n function deleteStateBatch(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n external;\\n\\n /**\\n * Verifies a batch inclusion proof.\\n * @param _element Hash of the element to verify a proof for.\\n * @param _batchHeader Header of the batch in which the element was included.\\n * @param _proof Merkle inclusion proof for the element.\\n */\\n function verifyStateCommitment(\\n bytes32 _element,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _proof\\n )\\n external\\n view\\n returns (\\n bool _verified\\n );\\n\\n /**\\n * Checks whether a given batch is still inside its fraud proof window.\\n * @param _batchHeader Header of the batch to check.\\n * @return _inside Whether or not the batch is inside the fraud proof window.\\n */\\n function insideFraudProofWindow(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n external\\n view\\n returns (\\n bool _inside\\n );\\n}\\n\",\"keccak256\":\"0x6646d6ff392b81aab52a7a277e91540819464751de0af5afd1962094b2e92448\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/verification/iOVM_BondManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\ninterface ERC20 {\\n function transfer(address, uint256) external returns (bool);\\n function transferFrom(address, address, uint256) external returns (bool);\\n}\\n\\n/// All the errors which may be encountered on the bond manager\\nlibrary Errors {\\n string constant ERC20_ERR = \\\"BondManager: Could not post bond\\\";\\n string constant ALREADY_FINALIZED = \\\"BondManager: Fraud proof for this pre-state root has already been finalized\\\";\\n string constant SLASHED = \\\"BondManager: Cannot finalize withdrawal, you probably got slashed\\\";\\n string constant WRONG_STATE = \\\"BondManager: Wrong bond state for proposer\\\";\\n string constant CANNOT_CLAIM = \\\"BondManager: Cannot claim yet. Dispute must be finalized first\\\";\\n\\n string constant WITHDRAWAL_PENDING = \\\"BondManager: Withdrawal already pending\\\";\\n string constant TOO_EARLY = \\\"BondManager: Too early to finalize your withdrawal\\\";\\n\\n string constant ONLY_TRANSITIONER = \\\"BondManager: Only the transitioner for this pre-state root may call this function\\\";\\n string constant ONLY_FRAUD_VERIFIER = \\\"BondManager: Only the fraud verifier may call this function\\\";\\n string constant ONLY_STATE_COMMITMENT_CHAIN = \\\"BondManager: Only the state commitment chain may call this function\\\";\\n string constant WAIT_FOR_DISPUTES = \\\"BondManager: Wait for other potential disputes\\\";\\n}\\n\\n/**\\n * @title iOVM_BondManager\\n */\\ninterface iOVM_BondManager {\\n\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n /// The lifecycle of a proposer's bond\\n enum State {\\n // Before depositing or after getting slashed, a user is uncollateralized\\n NOT_COLLATERALIZED,\\n // After depositing, a user is collateralized\\n COLLATERALIZED,\\n // After a user has initiated a withdrawal\\n WITHDRAWING\\n }\\n\\n /// A bond posted by a proposer\\n struct Bond {\\n // The user's state\\n State state;\\n // The timestamp at which a proposer issued their withdrawal request\\n uint32 withdrawalTimestamp;\\n // The time when the first disputed was initiated for this bond\\n uint256 firstDisputeAt;\\n // The earliest observed state root for this bond which has had fraud\\n bytes32 earliestDisputedStateRoot;\\n // The state root's timestamp\\n uint256 earliestTimestamp;\\n }\\n\\n // Per pre-state root, store the number of state provisions that were made\\n // and how many of these calls were made by each user. Payouts will then be\\n // claimed by users proportionally for that dispute.\\n struct Rewards {\\n // Flag to check if rewards for a fraud proof are claimable\\n bool canClaim;\\n // Total number of `recordGasSpent` calls made\\n uint256 total;\\n // The gas spent by each user to provide witness data. The sum of all\\n // values inside this map MUST be equal to the value of `total`\\n mapping(address => uint256) gasSpent;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function recordGasSpent(\\n bytes32 _preStateRoot,\\n bytes32 _txHash,\\n address _who,\\n uint256 _gasSpent\\n ) external;\\n\\n function finalize(\\n bytes32 _preStateRoot,\\n address _publisher,\\n uint256 _timestamp\\n ) external;\\n\\n function deposit() external;\\n\\n function startWithdrawal() external;\\n\\n function finalizeWithdrawal() external;\\n\\n function claim(\\n address _who\\n ) external;\\n\\n function isCollateralized(\\n address _who\\n ) external view returns (bool);\\n\\n function getGasSpent(\\n bytes32 _preStateRoot,\\n address _who\\n ) external view returns (uint256);\\n}\\n\",\"keccak256\":\"0x3c2a8a399487857158649db1896749d86e39cba545a8aeb2e2bb0f3bdfa7a5b1\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/verification/iOVM_FraudVerifier.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_StateTransitioner } from \\\"./iOVM_StateTransitioner.sol\\\";\\n\\n/**\\n * @title iOVM_FraudVerifier\\n */\\ninterface iOVM_FraudVerifier {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event FraudProofInitialized(\\n bytes32 _preStateRoot,\\n uint256 _preStateRootIndex,\\n bytes32 _transactionHash,\\n address _who\\n );\\n\\n event FraudProofFinalized(\\n bytes32 _preStateRoot,\\n uint256 _preStateRootIndex,\\n bytes32 _transactionHash,\\n address _who\\n );\\n\\n\\n /***************************************\\n * Public Functions: Transition Status *\\n ***************************************/\\n\\n function getStateTransitioner(bytes32 _preStateRoot, bytes32 _txHash) external view returns (iOVM_StateTransitioner _transitioner);\\n\\n\\n /****************************************\\n * Public Functions: Fraud Verification *\\n ****************************************/\\n\\n function initializeFraudVerification(\\n bytes32 _preStateRoot,\\n Lib_OVMCodec.ChainBatchHeader calldata _preStateRootBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof calldata _preStateRootProof,\\n Lib_OVMCodec.Transaction calldata _transaction,\\n Lib_OVMCodec.TransactionChainElement calldata _txChainElement,\\n Lib_OVMCodec.ChainBatchHeader calldata _transactionBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof calldata _transactionProof\\n ) external;\\n\\n function finalizeFraudVerification(\\n bytes32 _preStateRoot,\\n Lib_OVMCodec.ChainBatchHeader calldata _preStateRootBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof calldata _preStateRootProof,\\n bytes32 _txHash,\\n bytes32 _postStateRoot,\\n Lib_OVMCodec.ChainBatchHeader calldata _postStateRootBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof calldata _postStateRootProof\\n ) external;\\n}\\n\",\"keccak256\":\"0x5efd7bb18164bbd3e9d58379e8203fbf2a7ee802b1a48dff3ceaaec1523b1751\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/verification/iOVM_StateTransitioner.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title iOVM_StateTransitioner\\n */\\ninterface iOVM_StateTransitioner {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AccountCommitted(\\n address _address\\n );\\n\\n event ContractStorageCommitted(\\n address _address,\\n bytes32 _key\\n );\\n\\n\\n /**********************************\\n * Public Functions: State Access *\\n **********************************/\\n\\n function getPreStateRoot() external view returns (bytes32 _preStateRoot);\\n function getPostStateRoot() external view returns (bytes32 _postStateRoot);\\n function isComplete() external view returns (bool _complete);\\n\\n\\n /***********************************\\n * Public Functions: Pre-Execution *\\n ***********************************/\\n\\n function proveContractState(\\n address _ovmContractAddress,\\n address _ethContractAddress,\\n bytes calldata _stateTrieWitness\\n ) external;\\n\\n function proveStorageSlot(\\n address _ovmContractAddress,\\n bytes32 _key,\\n bytes calldata _storageTrieWitness\\n ) external;\\n\\n\\n /*******************************\\n * Public Functions: Execution *\\n *******************************/\\n\\n function applyTransaction(\\n Lib_OVMCodec.Transaction calldata _transaction\\n ) external;\\n\\n\\n /************************************\\n * Public Functions: Post-Execution *\\n ************************************/\\n\\n function commitContractState(\\n address _ovmContractAddress,\\n bytes calldata _stateTrieWitness\\n ) external;\\n\\n function commitStorageSlot(\\n address _ovmContractAddress,\\n bytes32 _key,\\n bytes calldata _storageTrieWitness\\n ) external;\\n\\n\\n /**********************************\\n * Public Functions: Finalization *\\n **********************************/\\n\\n function completeTransition() external;\\n}\\n\",\"keccak256\":\"0x3d044ac0a3bb6ad3d529f904b3191117511f9c379678ca03010e1ebdfcb5c34b\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/verification/iOVM_StateTransitionerFactory.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Contract Imports */\\nimport { iOVM_StateTransitioner } from \\\"./iOVM_StateTransitioner.sol\\\";\\n\\n/**\\n * @title iOVM_StateTransitionerFactory\\n */\\ninterface iOVM_StateTransitionerFactory {\\n\\n /***************************************\\n * Public Functions: Contract Creation *\\n ***************************************/\\n\\n function create(\\n address _proxyManager,\\n uint256 _stateTransitionIndex,\\n bytes32 _preStateRoot,\\n bytes32 _transactionHash\\n )\\n external\\n returns (\\n iOVM_StateTransitioner _ovmStateTransitioner\\n );\\n}\\n\",\"keccak256\":\"0x60a0f0c104e4c0c7863268a93005762e8146d393f9cfddfdd6a2d6585c5911fc\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/codec/Lib_OVMCodec.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../utils/Lib_Bytes32Utils.sol\\\";\\n\\n/**\\n * @title Lib_OVMCodec\\n */\\nlibrary Lib_OVMCodec {\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum QueueOrigin {\\n SEQUENCER_QUEUE,\\n L1TOL2_QUEUE\\n }\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Account {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n address ethAddress;\\n bool isFresh;\\n }\\n\\n struct EVMAccount {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n }\\n\\n struct ChainBatchHeader {\\n uint256 batchIndex;\\n bytes32 batchRoot;\\n uint256 batchSize;\\n uint256 prevTotalElements;\\n bytes extraData;\\n }\\n\\n struct ChainInclusionProof {\\n uint256 index;\\n bytes32[] siblings;\\n }\\n\\n struct Transaction {\\n uint256 timestamp;\\n uint256 blockNumber;\\n QueueOrigin l1QueueOrigin;\\n address l1TxOrigin;\\n address entrypoint;\\n uint256 gasLimit;\\n bytes data;\\n }\\n\\n struct TransactionChainElement {\\n bool isSequenced;\\n uint256 queueIndex; // QUEUED TX ONLY\\n uint256 timestamp; // SEQUENCER TX ONLY\\n uint256 blockNumber; // SEQUENCER TX ONLY\\n bytes txData; // SEQUENCER TX ONLY\\n }\\n\\n struct QueueElement {\\n bytes32 transactionHash;\\n uint40 timestamp;\\n uint40 blockNumber;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Encodes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Encoded transaction bytes.\\n */\\n function encodeTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return abi.encodePacked(\\n _transaction.timestamp,\\n _transaction.blockNumber,\\n _transaction.l1QueueOrigin,\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n );\\n }\\n\\n /**\\n * Hashes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Hashed transaction\\n */\\n function hashTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(encodeTransaction(_transaction));\\n }\\n\\n /**\\n * Converts an OVM account to an EVM account.\\n * @param _in OVM account to convert.\\n * @return Converted EVM account.\\n */\\n function toEVMAccount(\\n Account memory _in\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n return EVMAccount({\\n nonce: _in.nonce,\\n balance: _in.balance,\\n storageRoot: _in.storageRoot,\\n codeHash: _in.codeHash\\n });\\n }\\n\\n /**\\n * @notice RLP-encodes an account state struct.\\n * @param _account Account state struct.\\n * @return RLP-encoded account state.\\n */\\n function encodeEVMAccount(\\n EVMAccount memory _account\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes[] memory raw = new bytes[](4);\\n\\n // Unfortunately we can't create this array outright because\\n // Lib_RLPWriter.writeList will reject fixed-size arrays. Assigning\\n // index-by-index circumvents this issue.\\n raw[0] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.nonce)\\n )\\n );\\n raw[1] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.balance)\\n )\\n );\\n raw[2] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.storageRoot));\\n raw[3] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.codeHash));\\n\\n return Lib_RLPWriter.writeList(raw);\\n }\\n\\n /**\\n * @notice Decodes an RLP-encoded account state into a useful struct.\\n * @param _encoded RLP-encoded account state.\\n * @return Account state struct.\\n */\\n function decodeEVMAccount(\\n bytes memory _encoded\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\\n\\n return EVMAccount({\\n nonce: Lib_RLPReader.readUint256(accountState[0]),\\n balance: Lib_RLPReader.readUint256(accountState[1]),\\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\\n });\\n }\\n\\n /**\\n * Calculates a hash for a given batch header.\\n * @param _batchHeader Header to hash.\\n * @return Hash of the header.\\n */\\n function hashBatchHeader(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(\\n abi.encode(\\n _batchHeader.batchRoot,\\n _batchHeader.batchSize,\\n _batchHeader.prevTotalElements,\\n _batchHeader.extraData\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0xd85ba2066057a2677926f484b938c7c2ef33ff3853f3b71cda252f4a54f30e05\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n public\\n onlyOwner\\n {\\n addresses[_getNameHash(_name)] = _address;\\n\\n emit AddressSet(\\n _name,\\n _address\\n );\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0x2ce671a0e004df88b136bea5a3c59d0732cea8887c8496da1d509e0200b03d7d\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(\\n address _libAddressManager\\n ) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x65981feeabff6a81783ea97d44baf988a18a86c8cb374c46fdb71819cbacc7c0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPReader.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_RLPReader\\n * @dev Adapted from \\\"RLPReader\\\" by Hamdi Allam (hamdi.allam97@gmail.com).\\n */\\nlibrary Lib_RLPReader {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 constant internal MAX_LIST_LENGTH = 32;\\n\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum RLPItemType {\\n DATA_ITEM,\\n LIST_ITEM\\n }\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct RLPItem {\\n uint256 length;\\n uint256 ptr;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts bytes to a reference to memory position and length.\\n * @param _in Input bytes to convert.\\n * @return Output memory reference.\\n */\\n function toRLPItem(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem memory\\n )\\n {\\n uint256 ptr;\\n assembly {\\n ptr := add(_in, 32)\\n }\\n\\n return RLPItem({\\n length: _in.length,\\n ptr: ptr\\n });\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n (\\n uint256 listOffset,\\n ,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.LIST_ITEM,\\n \\\"Invalid RLP list value.\\\"\\n );\\n\\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\\n // writing to the length. Since we can't know the number of RLP items without looping over\\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\\n // simply set a reasonable maximum list length and decrease the size before we finish.\\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\\n\\n uint256 itemCount = 0;\\n uint256 offset = listOffset;\\n while (offset < _in.length) {\\n require(\\n itemCount < MAX_LIST_LENGTH,\\n \\\"Provided RLP list exceeds max list length.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n ) = _decodeLength(RLPItem({\\n length: _in.length - offset,\\n ptr: _in.ptr + offset\\n }));\\n\\n out[itemCount] = RLPItem({\\n length: itemLength + itemOffset,\\n ptr: _in.ptr + offset\\n });\\n\\n itemCount += 1;\\n offset += itemOffset + itemLength;\\n }\\n\\n // Decrease the array size to match the actual item count.\\n assembly {\\n mstore(out, itemCount)\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n return readList(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes value.\\\"\\n );\\n\\n return _copy(_in.ptr, itemOffset, itemLength);\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return readBytes(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return string(readBytes(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return readString(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n require(\\n _in.length <= 33,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr + itemOffset;\\n bytes32 out;\\n assembly {\\n out := mload(ptr)\\n\\n // Shift the bytes over to match the item size.\\n if lt(itemLength, 32) {\\n out := div(out, exp(256, sub(32, itemLength)))\\n }\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return readBytes32(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return uint256(readBytes32(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return readUint256(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n require(\\n _in.length == 1,\\n \\\"Invalid RLP boolean value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 out;\\n assembly {\\n out := byte(0, mload(ptr))\\n }\\n\\n require(\\n out == 0 || out == 1,\\n \\\"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\\\"\\n );\\n\\n return out != 0;\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return readBool(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n if (_in.length == 1) {\\n return address(0);\\n }\\n\\n require(\\n _in.length == 21,\\n \\\"Invalid RLP address value.\\\"\\n );\\n\\n return address(readUint256(_in));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return readAddress(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads the raw bytes of an RLP item.\\n * @param _in RLP item to read.\\n * @return Raw RLP bytes.\\n */\\n function readRawBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in);\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Decodes the length of an RLP item.\\n * @param _in RLP item to decode.\\n * @return Offset of the encoded data.\\n * @return Length of the encoded data.\\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\\n */\\n function _decodeLength(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n uint256,\\n uint256,\\n RLPItemType\\n )\\n {\\n require(\\n _in.length > 0,\\n \\\"RLP item cannot be null.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 prefix;\\n assembly {\\n prefix := byte(0, mload(ptr))\\n }\\n\\n if (prefix <= 0x7f) {\\n // Single byte.\\n\\n return (0, 1, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xb7) {\\n // Short string.\\n\\n uint256 strLen = prefix - 0x80;\\n\\n require(\\n _in.length > strLen,\\n \\\"Invalid RLP short string.\\\"\\n );\\n\\n return (1, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xbf) {\\n // Long string.\\n uint256 lenOfStrLen = prefix - 0xb7;\\n\\n require(\\n _in.length > lenOfStrLen,\\n \\\"Invalid RLP long string length.\\\"\\n );\\n\\n uint256 strLen;\\n assembly {\\n // Pick out the string length.\\n strLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfStrLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfStrLen + strLen,\\n \\\"Invalid RLP long string.\\\"\\n );\\n\\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xf7) {\\n // Short list.\\n uint256 listLen = prefix - 0xc0;\\n\\n require(\\n _in.length > listLen,\\n \\\"Invalid RLP short list.\\\"\\n );\\n\\n return (1, listLen, RLPItemType.LIST_ITEM);\\n } else {\\n // Long list.\\n uint256 lenOfListLen = prefix - 0xf7;\\n\\n require(\\n _in.length > lenOfListLen,\\n \\\"Invalid RLP long list length.\\\"\\n );\\n\\n uint256 listLen;\\n assembly {\\n // Pick out the list length.\\n listLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfListLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfListLen + listLen,\\n \\\"Invalid RLP long list.\\\"\\n );\\n\\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\\n }\\n }\\n\\n /**\\n * Copies the bytes from a memory location.\\n * @param _src Pointer to the location to read from.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Copied bytes.\\n */\\n function _copy(\\n uint256 _src,\\n uint256 _offset,\\n uint256 _length\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out = new bytes(_length);\\n if (out.length == 0) {\\n return out;\\n }\\n\\n uint256 src = _src + _offset;\\n uint256 dest;\\n assembly {\\n dest := add(out, 32)\\n }\\n\\n // Copy over as many complete words as we can.\\n for (uint256 i = 0; i < _length / 32; i++) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n\\n src += 32;\\n dest += 32;\\n }\\n\\n // Pick out the remaining bytes.\\n uint256 mask = 256 ** (32 - (_length % 32)) - 1;\\n assembly {\\n mstore(\\n dest,\\n or(\\n and(mload(src), not(mask)),\\n and(mload(dest), mask)\\n )\\n )\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Copies an RLP item into bytes.\\n * @param _in RLP item to copy.\\n * @return Copied bytes.\\n */\\n function _copy(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in.ptr, 0, _in.length);\\n }\\n}\\n\",\"keccak256\":\"0x829174c61216dce35fdb888383b6022e0365eb7fbdc71ad79d98b108091969fe\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPWriter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/**\\n * @title Lib_RLPWriter\\n * @author Bakaoh (with modifications)\\n */\\nlibrary Lib_RLPWriter {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * RLP encodes a byte string.\\n * @param _in The byte string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded;\\n\\n if (_in.length == 1 && uint8(_in[0]) < 128) {\\n encoded = _in;\\n } else {\\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * RLP encodes a list of RLP encoded byte byte strings.\\n * @param _in The list of RLP encoded byte strings.\\n * @return The RLP encoded list of items in bytes.\\n */\\n function writeList(\\n bytes[] memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory list = _flatten(_in);\\n return abi.encodePacked(_writeLength(list.length, 192), list);\\n }\\n\\n /**\\n * RLP encodes a string.\\n * @param _in The string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeString(\\n string memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(bytes(_in));\\n }\\n\\n /**\\n * RLP encodes an address.\\n * @param _in The address to encode.\\n * @return The RLP encoded address in bytes.\\n */\\n function writeAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a bytes32 value.\\n * @param _in The bytes32 to encode.\\n * @return _out The RLP encoded bytes32 in bytes.\\n */\\n function writeBytes32(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a uint.\\n * @param _in The uint256 to encode.\\n * @return The RLP encoded uint256 in bytes.\\n */\\n function writeUint(\\n uint256 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(_toBinary(_in));\\n }\\n\\n /**\\n * RLP encodes a bool.\\n * @param _in The bool to encode.\\n * @return The RLP encoded bool in bytes.\\n */\\n function writeBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded = new bytes(1);\\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\\n return encoded;\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\\n * @param _len The length of the string or the payload.\\n * @param _offset 128 if item is string, 192 if item is list.\\n * @return RLP encoded bytes.\\n */\\n function _writeLength(\\n uint256 _len,\\n uint256 _offset\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded;\\n\\n if (_len < 56) {\\n encoded = new bytes(1);\\n encoded[0] = byte(uint8(_len) + uint8(_offset));\\n } else {\\n uint256 lenLen;\\n uint256 i = 1;\\n while (_len / i != 0) {\\n lenLen++;\\n i *= 256;\\n }\\n\\n encoded = new bytes(lenLen + 1);\\n encoded[0] = byte(uint8(lenLen) + uint8(_offset) + 55);\\n for(i = 1; i <= lenLen; i++) {\\n encoded[i] = byte(uint8((_len / (256**(lenLen-i))) % 256));\\n }\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * Encode integer in big endian binary form with no leading zeroes.\\n * @notice TODO: This should be optimized with assembly to save gas costs.\\n * @param _x The integer to encode.\\n * @return RLP encoded bytes.\\n */\\n function _toBinary(\\n uint256 _x\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory b = abi.encodePacked(_x);\\n\\n uint256 i = 0;\\n for (; i < 32; i++) {\\n if (b[i] != 0) {\\n break;\\n }\\n }\\n\\n bytes memory res = new bytes(32 - i);\\n for (uint256 j = 0; j < res.length; j++) {\\n res[j] = b[i++];\\n }\\n\\n return res;\\n }\\n\\n /**\\n * Copies a piece of memory to another location.\\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\\n * @param _dest Destination location.\\n * @param _src Source location.\\n * @param _len Length of memory to copy.\\n */\\n function _memcpy(\\n uint256 _dest,\\n uint256 _src,\\n uint256 _len\\n )\\n private\\n pure\\n {\\n uint256 dest = _dest;\\n uint256 src = _src;\\n uint256 len = _len;\\n\\n for(; len >= 32; len -= 32) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n dest += 32;\\n src += 32;\\n }\\n\\n uint256 mask = 256 ** (32 - len) - 1;\\n assembly {\\n let srcpart := and(mload(src), not(mask))\\n let destpart := and(mload(dest), mask)\\n mstore(dest, or(destpart, srcpart))\\n }\\n }\\n\\n /**\\n * Flattens a list of byte strings into one byte string.\\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\\n * @param _list List of byte strings to flatten.\\n * @return The flattened byte string.\\n */\\n function _flatten(\\n bytes[] memory _list\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n if (_list.length == 0) {\\n return new bytes(0);\\n }\\n\\n uint256 len;\\n uint256 i = 0;\\n for (; i < _list.length; i++) {\\n len += _list[i].length;\\n }\\n\\n bytes memory flattened = new bytes(len);\\n uint256 flattenedPtr;\\n assembly { flattenedPtr := add(flattened, 0x20) }\\n\\n for(i = 0; i < _list.length; i++) {\\n bytes memory item = _list[i];\\n\\n uint256 listPtr;\\n assembly { listPtr := add(item, 0x20)}\\n\\n _memcpy(flattenedPtr, listPtr, item.length);\\n flattenedPtr += _list[i].length;\\n }\\n\\n return flattened;\\n }\\n}\\n\",\"keccak256\":\"0xb60ee4b03ad372c3deff21d454ab714dd0c18ee3e6f9d45532e209fc59d5a54d\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_Bytes32Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_Byte32Utils\\n */\\nlibrary Lib_Bytes32Utils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \\\"true.\\\"\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as a boolean.\\n */\\n function toBool(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return _in != 0;\\n }\\n\\n /**\\n * Converts a boolean to a bytes32 value.\\n * @param _in Input boolean value.\\n * @return Boolean as a bytes32.\\n */\\n function fromBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in ? 1 : 0));\\n }\\n\\n /**\\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as an address.\\n */\\n function toAddress(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return address(uint160(uint256(_in)));\\n }\\n\\n /**\\n * Converts an address to a bytes32.\\n * @param _in Input address value.\\n * @return Address as a bytes32.\\n */\\n function fromAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in));\\n }\\n\\n /**\\n * Removes the leading zeros from a bytes32 value and returns a new (smaller) bytes value.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 without any leading zeros.\\n */\\n function removeLeadingZeros(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out;\\n\\n assembly {\\n // Figure out how many leading zero bytes to remove.\\n let shift := 0\\n for { let i := 0 } and(lt(i, 32), eq(byte(i, _in), 0)) { i := add(i, 1) } {\\n shift := add(shift, 1)\\n }\\n\\n // Reserve some space for our output and fix the free memory pointer.\\n out := mload(0x40)\\n mstore(0x40, add(out, 0x40))\\n\\n // Shift the value and store it into the output bytes.\\n mstore(add(out, 0x20), shl(mul(shift, 8), _in))\\n\\n // Store the new size (with leading zero bytes removed) in the output byte size.\\n mstore(out, sub(32, shift))\\n }\\n\\n return out;\\n }\\n}\\n\",\"keccak256\":\"0xfa2def593e3fc56a31852c3744aefdaa93cec74e721bfcfeb1e5d166c7c60b64\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_BytesUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_BytesUtils\\n */\\nlibrary Lib_BytesUtils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_start + _length >= _start, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n if (_bytes.length - _start == 0) {\\n return bytes('');\\n }\\n\\n return slice(_bytes, _start, _bytes.length - _start);\\n }\\n\\n function toBytes32PadLeft(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n bytes32 ret;\\n uint256 len = _bytes.length <= 32 ? _bytes.length : 32;\\n assembly {\\n ret := shr(mul(sub(32, len), 8), mload(add(_bytes, 32)))\\n }\\n return ret;\\n }\\n\\n function toBytes32(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n if (_bytes.length < 32) {\\n bytes32 ret;\\n assembly {\\n ret := mload(add(_bytes, 32))\\n }\\n return ret;\\n }\\n\\n return abi.decode(_bytes,(bytes32)); // will truncate if input length > 32 bytes\\n }\\n\\n function toUint256(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return uint256(toBytes32(_bytes));\\n }\\n\\n function toUint24(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n uint24\\n )\\n {\\n require(_start + 3 >= _start, \\\"toUint24_overflow\\\");\\n require(_bytes.length >= _start + 3 , \\\"toUint24_outOfBounds\\\");\\n uint24 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x3), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toUint8(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n uint8\\n )\\n {\\n require(_start + 1 >= _start, \\\"toUint8_overflow\\\");\\n require(_bytes.length >= _start + 1 , \\\"toUint8_outOfBounds\\\");\\n uint8 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x1), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toAddress(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n require(_start + 20 >= _start, \\\"toAddress_overflow\\\");\\n require(_bytes.length >= _start + 20, \\\"toAddress_outOfBounds\\\");\\n address tempAddress;\\n\\n assembly {\\n tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000)\\n }\\n\\n return tempAddress;\\n }\\n\\n function toNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory nibbles = new bytes(_bytes.length * 2);\\n\\n for (uint256 i = 0; i < _bytes.length; i++) {\\n nibbles[i * 2] = _bytes[i] >> 4;\\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\\n }\\n\\n return nibbles;\\n }\\n\\n function fromNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory ret = new bytes(_bytes.length / 2);\\n\\n for (uint256 i = 0; i < ret.length; i++) {\\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\\n }\\n\\n return ret;\\n }\\n\\n function equal(\\n bytes memory _bytes,\\n bytes memory _other\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return keccak256(_bytes) == keccak256(_other);\\n }\\n}\\n\",\"keccak256\":\"0xa5195afe32fb2cf104d156e8f4bd39df1ec79bf6ba232097b9e8e0ee14fbc298\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x608060405234801561001057600080fd5b5060405161184138038061184183398101604081905261002f91610054565b600080546001600160a01b0319166001600160a01b0392909216919091179055610082565b600060208284031215610065578081fd5b81516001600160a01b038116811461007b578182fd5b9392505050565b6117b0806100916000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c8063299ca4781461005c578063461a44781461007a57806398d8867d1461008d578063a286ba1c146100a2578063b48ec820146100b5575b600080fd5b6100646100c8565b6040516100719190611306565b60405180910390f35b610064610088366004611101565b6100d7565b6100a061009b366004611029565b6101b5565b005b6100a06100b0366004610f64565b6104f4565b6100646100c3366004610f43565b6108bb565b6000546001600160a01b031681565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b8381101561013757818101518382015260200161011f565b50505050905090810190601f1680156101645780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561018157600080fd5b505afa158015610195573d6000803e3d6000fd5b505050506040513d60208110156101ab57600080fd5b505190505b919050565b866101bf8561090a565b60005a905060006101cf8861090a565b90506101db8b82610923565b156101e65750610432565b60006102216040518060400160405280601881526020017727ab26afa9ba30ba32a1b7b6b6b4ba36b2b73a21b430b4b760411b8152506100d7565b905060006102636040518060400160405280601d81526020017f4f564d5f43616e6f6e6963616c5472616e73616374696f6e436861696e0000008152506100d7565b9050816001600160a01b0316634d69ee578e8e8e6040518463ffffffff1660e01b81526004016102959392919061135f565b60206040518083038186803b1580156102ad57600080fd5b505afa1580156102c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102e59190610f0f565b61030a5760405162461bcd60e51b8152600401610301906115e7565b60405180910390fd5b6040516326f2b4e760e11b81526001600160a01b03821690634de569ce9061033c908d908d908d908d90600401611641565b60206040518083038186803b15801561035457600080fd5b505afa158015610368573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061038c9190610f0f565b6103a85760405162461bcd60e51b815260040161030190611499565b86600001518860600151018b600001518d6060015101600101146103de5760405162461bcd60e51b815260040161030190611525565b6103ed8d848d60000151610942565b7f41a48bde2468fac6f670f39b66d7b91f311053e1f28eab9d75056546e6eaac958d8c6000015185336040516104269493929190611394565b60405180910390a15050505b60005a820390506104696040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506100d7565b6001600160a01b0316631e16e92f858533856040518563ffffffff1660e01b815260040180858152602001848152602001836001600160a01b03168152602001828152602001945050505050600060405180830381600087803b1580156104cf57600080fd5b505af11580156104e3573d6000803e3d6000fd5b505050505050505050505050505050565b868460005a905060006105078b896108bb565b905060006105446040518060400160405280601881526020017727ab26afa9ba30ba32a1b7b6b6b4ba36b2b73a21b430b4b760411b8152506100d7565b9050816001600160a01b031663b2fa1c9e6040518163ffffffff1660e01b815260040160206040518083038186803b15801561057f57600080fd5b505afa158015610593573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b79190610f0f565b15156001146105d85760405162461bcd60e51b8152600401610301906113b8565b89600001518b606001510160010186600001518860600151011461060e5760405162461bcd60e51b81526004016103019061141f565b604051634d69ee5760e01b81526001600160a01b03821690634d69ee579061063e908f908f908f9060040161135f565b60206040518083038186803b15801561065657600080fd5b505afa15801561066a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061068e9190610f0f565b6106aa5760405162461bcd60e51b8152600401610301906115e7565b604051634d69ee5760e01b81526001600160a01b03821690634d69ee57906106da908b908b908b9060040161135f565b60206040518083038186803b1580156106f257600080fd5b505afa158015610706573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061072a9190610f0f565b6107465760405162461bcd60e51b8152600401610301906114dd565b816001600160a01b031663c1c618b86040518163ffffffff1660e01b815260040160206040518083038186803b15801561077f57600080fd5b505afa158015610793573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107b79190610f2b565b8814156107d65760405162461bcd60e51b815260040161030190611597565b6107e0878d610a6d565b6000600160008e8c6040516020016107f9929190611289565b60405160208183030381529060405280519060200120815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b031602179055507f1e5fff3c23daf51ea67aaa3bbc738bcedaa98be5a5503f0e63a336a004b075b18c8b600001518b3360405161087a9493929190611394565b60405180910390a1505060005a820390506104696040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506100d7565b60006001600084846040516020016108d4929190611289565b60408051808303601f19018152918152815160209283012083529082019290925201600020546001600160a01b03169392505050565b600061091582610bc7565b805190602001209050919050565b60008061093084846108bb565b6001600160a01b031614159392505050565b6109806040518060400160405280601c81526020017f4f564d5f53746174655472616e736974696f6e6572466163746f7279000000008152506100d7565b600054604051631168a38160e11b81526001600160a01b03928316926322d14702926109b79291169085908890889060040161131a565b602060405180830381600087803b1580156109d157600080fd5b505af11580156109e5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a0991906110e5565b600160008585604051602001610a20929190611289565b60405160208183030381529060405280519060200120815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b03160217905550505050565b6000610aa86040518060400160405280601881526020017727ab26afa9ba30ba32a1b7b6b6b4ba36b2b73a21b430b4b760411b8152506100d7565b90506000610adc6040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506100d7565b604051632e38626b60e21b81529091506001600160a01b0383169063b8e189ac90610b0b90879060040161162e565b600060405180830381600087803b158015610b2557600080fd5b505af1158015610b39573d6000803e3d6000fd5b505050506000808560800151806020019051810190610b58919061114f565b60405163abfbbe1360e01b815291935091506001600160a01b0384169063abfbbe1390610b8d90889085908790600401611340565b600060405180830381600087803b158015610ba757600080fd5b505af1158015610bbb573d6000803e3d6000fd5b50505050505050505050565b6060816000015182602001518360400151846060015185608001518660a001518760c00151604051602001610c029796959493929190611297565b6040516020818303038152906040529050919050565b600067ffffffffffffffff831115610c2c57fe5b610c3f601f8401601f1916602001611700565b9050828152838383011115610c5357600080fd5b828260208301376000602084830101529392505050565b80356101b081611754565b600082601f830112610c85578081fd5b610c9483833560208501610c18565b9392505050565b8035600281106101b057600080fd5b600060a08284031215610cbb578081fd5b60405160a0810167ffffffffffffffff8282108183111715610cd957fe5b81604052829350843583526020850135602084015260408501356040840152606085013560608401526080850135915080821115610d1657600080fd5b50610d2385828601610c75565b6080830152505092915050565b600060408284031215610d41578081fd5b6040516040810167ffffffffffffffff8282108183111715610d5f57fe5b8160405282935084358352602091508185013581811115610d7f57600080fd5b8501601f81018713610d9057600080fd5b803582811115610d9c57fe5b8381029250610dac848401611700565b8181528481019083860185850187018b1015610dc757600080fd5b600095505b83861015610dea578035835260019590950194918601918601610dcc565b5080868801525050505050505092915050565b600060a08284031215610e0e578081fd5b60405160a0810167ffffffffffffffff8282108183111715610e2c57fe5b8160405282935084359150610e408261176c565b8183526020850135602084015260408501356040840152606085013560608401526080850135915080821115610d1657600080fd5b600060e08284031215610e86578081fd5b610e9060e0611700565b90508135815260208201356020820152610eac60408301610c9b565b6040820152610ebd60608301610c6a565b6060820152610ece60808301610c6a565b608082015260a082013560a082015260c082013567ffffffffffffffff811115610ef757600080fd5b610f0384828501610c75565b60c08301525092915050565b600060208284031215610f20578081fd5b8151610c948161176c565b600060208284031215610f3c578081fd5b5051919050565b60008060408385031215610f55578081fd5b50508035926020909101359150565b600080600080600080600060e0888a031215610f7e578283fd5b87359650602088013567ffffffffffffffff80821115610f9c578485fd5b610fa88b838c01610caa565b975060408a0135915080821115610fbd578485fd5b610fc98b838c01610d30565b965060608a0135955060808a0135945060a08a0135915080821115610fec578384fd5b610ff88b838c01610caa565b935060c08a013591508082111561100d578283fd5b5061101a8a828b01610d30565b91505092959891949750929550565b600080600080600080600060e0888a031215611043578081fd5b87359650602088013567ffffffffffffffff80821115611061578283fd5b61106d8b838c01610caa565b975060408a0135915080821115611082578283fd5b61108e8b838c01610d30565b965060608a01359150808211156110a3578283fd5b6110af8b838c01610e75565b955060808a01359150808211156110c4578283fd5b6110d08b838c01610dfd565b945060a08a0135915080821115610fec578283fd5b6000602082840312156110f6578081fd5b8151610c9481611754565b600060208284031215611112578081fd5b813567ffffffffffffffff811115611128578182fd5b8201601f81018413611138578182fd5b61114784823560208401610c18565b949350505050565b60008060408385031215611161578182fd5b82519150602083015161117381611754565b809150509250929050565b6001600160a01b03169052565b600081518084526111a3816020860160208601611724565b601f01601f19169290920160200192915050565b600081518352602082015160208401526040820151604084015260608201516060840152608082015160a0608085015261114760a085018261118b565b6000604083018251845260208084015160408287015282815180855260608801915083830194508592505b8083101561123f578451825293830193600192909201919083019061121f565b509695505050505050565b6000815115158352602082015160208401526040820151604084015260608201516060840152608082015160a0608085015261114760a085018261118b565b918252602082015260400190565b6000888252876020830152600287106112ac57fe5b8660f81b60408301526bffffffffffffffffffffffff19808760601b166041840152808660601b1660558401525083606983015282516112f3816089850160208701611724565b9190910160890198975050505050505050565b6001600160a01b0391909116815260200190565b6001600160a01b0394909416845260208401929092526040830152606082015260800190565b9283526001600160a01b03919091166020830152604082015260600190565b60008482526060602083015261137860608301856111b7565b828103604084015261138a81856111f4565b9695505050505050565b938452602084019290925260408301526001600160a01b0316606082015260800190565b60208082526041908201527f5374617465207472616e736974696f6e2070726f63657373206d75737420626560408201527f20636f6d706c65746564207072696f7220746f2066696e616c697a6174696f6e6060820152601760f91b608082015260a00190565b60208082526054908201527f506f73742d737461746520726f6f7420676c6f62616c20696e646578206d757360408201527f7420657175616c20746f207468652070726520737461746520726f6f7420676c60608201527337b130b61034b73232bc1038363ab99037b7329760611b608082015260a00190565b60208082526024908201527f496e76616c6964207472616e73616374696f6e20696e636c7573696f6e20707260408201526337b7b31760e11b606082015260800190565b60208082526028908201527f496e76616c696420706f73742d737461746520726f6f7420696e636c7573696f6040820152673710383937b7b31760c11b606082015260800190565b6020808252604c908201527f5072652d737461746520726f6f7420676c6f62616c20696e646578206d75737460408201527f20657175616c20746f20746865207472616e73616374696f6e20726f6f74206760608201526b3637b130b61034b73232bc1760a11b608082015260a00190565b60208082526030908201527f5374617465207472616e736974696f6e20686173206e6f74206265656e20707260408201526f37bb32b710333930bab23ab632b73a1760811b606082015260800190565b60208082526027908201527f496e76616c6964207072652d737461746520726f6f7420696e636c7573696f6e60408201526610383937b7b31760c91b606082015260800190565b600060208252610c9460208301846111b7565b60006080825285516080830152602086015160a083015260408601516002811061166757fe5b60c083015260608601516001600160a01b031660e0830152608086015161169261010084018261117e565b5060a086015161012083015260c086015160e06101408401526116b961016084018261118b565b905082810360208401526116cd818761124a565b905082810360408401526116e181866111b7565b905082810360608401526116f581856111f4565b979650505050505050565b60405181810167ffffffffffffffff8111828210171561171c57fe5b604052919050565b60005b8381101561173f578181015183820152602001611727565b8381111561174e576000848401525b50505050565b6001600160a01b038116811461176957600080fd5b50565b801515811461176957600080fdfea26469706673582212205dbab94b86b7fa55149dd4efe74e8533d11e06735abd7d989856c9aa60c89c1064736f6c63430007060033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100575760003560e01c8063299ca4781461005c578063461a44781461007a57806398d8867d1461008d578063a286ba1c146100a2578063b48ec820146100b5575b600080fd5b6100646100c8565b6040516100719190611306565b60405180910390f35b610064610088366004611101565b6100d7565b6100a061009b366004611029565b6101b5565b005b6100a06100b0366004610f64565b6104f4565b6100646100c3366004610f43565b6108bb565b6000546001600160a01b031681565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b8381101561013757818101518382015260200161011f565b50505050905090810190601f1680156101645780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561018157600080fd5b505afa158015610195573d6000803e3d6000fd5b505050506040513d60208110156101ab57600080fd5b505190505b919050565b866101bf8561090a565b60005a905060006101cf8861090a565b90506101db8b82610923565b156101e65750610432565b60006102216040518060400160405280601881526020017727ab26afa9ba30ba32a1b7b6b6b4ba36b2b73a21b430b4b760411b8152506100d7565b905060006102636040518060400160405280601d81526020017f4f564d5f43616e6f6e6963616c5472616e73616374696f6e436861696e0000008152506100d7565b9050816001600160a01b0316634d69ee578e8e8e6040518463ffffffff1660e01b81526004016102959392919061135f565b60206040518083038186803b1580156102ad57600080fd5b505afa1580156102c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102e59190610f0f565b61030a5760405162461bcd60e51b8152600401610301906115e7565b60405180910390fd5b6040516326f2b4e760e11b81526001600160a01b03821690634de569ce9061033c908d908d908d908d90600401611641565b60206040518083038186803b15801561035457600080fd5b505afa158015610368573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061038c9190610f0f565b6103a85760405162461bcd60e51b815260040161030190611499565b86600001518860600151018b600001518d6060015101600101146103de5760405162461bcd60e51b815260040161030190611525565b6103ed8d848d60000151610942565b7f41a48bde2468fac6f670f39b66d7b91f311053e1f28eab9d75056546e6eaac958d8c6000015185336040516104269493929190611394565b60405180910390a15050505b60005a820390506104696040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506100d7565b6001600160a01b0316631e16e92f858533856040518563ffffffff1660e01b815260040180858152602001848152602001836001600160a01b03168152602001828152602001945050505050600060405180830381600087803b1580156104cf57600080fd5b505af11580156104e3573d6000803e3d6000fd5b505050505050505050505050505050565b868460005a905060006105078b896108bb565b905060006105446040518060400160405280601881526020017727ab26afa9ba30ba32a1b7b6b6b4ba36b2b73a21b430b4b760411b8152506100d7565b9050816001600160a01b031663b2fa1c9e6040518163ffffffff1660e01b815260040160206040518083038186803b15801561057f57600080fd5b505afa158015610593573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b79190610f0f565b15156001146105d85760405162461bcd60e51b8152600401610301906113b8565b89600001518b606001510160010186600001518860600151011461060e5760405162461bcd60e51b81526004016103019061141f565b604051634d69ee5760e01b81526001600160a01b03821690634d69ee579061063e908f908f908f9060040161135f565b60206040518083038186803b15801561065657600080fd5b505afa15801561066a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061068e9190610f0f565b6106aa5760405162461bcd60e51b8152600401610301906115e7565b604051634d69ee5760e01b81526001600160a01b03821690634d69ee57906106da908b908b908b9060040161135f565b60206040518083038186803b1580156106f257600080fd5b505afa158015610706573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061072a9190610f0f565b6107465760405162461bcd60e51b8152600401610301906114dd565b816001600160a01b031663c1c618b86040518163ffffffff1660e01b815260040160206040518083038186803b15801561077f57600080fd5b505afa158015610793573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107b79190610f2b565b8814156107d65760405162461bcd60e51b815260040161030190611597565b6107e0878d610a6d565b6000600160008e8c6040516020016107f9929190611289565b60405160208183030381529060405280519060200120815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b031602179055507f1e5fff3c23daf51ea67aaa3bbc738bcedaa98be5a5503f0e63a336a004b075b18c8b600001518b3360405161087a9493929190611394565b60405180910390a1505060005a820390506104696040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506100d7565b60006001600084846040516020016108d4929190611289565b60408051808303601f19018152918152815160209283012083529082019290925201600020546001600160a01b03169392505050565b600061091582610bc7565b805190602001209050919050565b60008061093084846108bb565b6001600160a01b031614159392505050565b6109806040518060400160405280601c81526020017f4f564d5f53746174655472616e736974696f6e6572466163746f7279000000008152506100d7565b600054604051631168a38160e11b81526001600160a01b03928316926322d14702926109b79291169085908890889060040161131a565b602060405180830381600087803b1580156109d157600080fd5b505af11580156109e5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a0991906110e5565b600160008585604051602001610a20929190611289565b60405160208183030381529060405280519060200120815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b03160217905550505050565b6000610aa86040518060400160405280601881526020017727ab26afa9ba30ba32a1b7b6b6b4ba36b2b73a21b430b4b760411b8152506100d7565b90506000610adc6040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506100d7565b604051632e38626b60e21b81529091506001600160a01b0383169063b8e189ac90610b0b90879060040161162e565b600060405180830381600087803b158015610b2557600080fd5b505af1158015610b39573d6000803e3d6000fd5b505050506000808560800151806020019051810190610b58919061114f565b60405163abfbbe1360e01b815291935091506001600160a01b0384169063abfbbe1390610b8d90889085908790600401611340565b600060405180830381600087803b158015610ba757600080fd5b505af1158015610bbb573d6000803e3d6000fd5b50505050505050505050565b6060816000015182602001518360400151846060015185608001518660a001518760c00151604051602001610c029796959493929190611297565b6040516020818303038152906040529050919050565b600067ffffffffffffffff831115610c2c57fe5b610c3f601f8401601f1916602001611700565b9050828152838383011115610c5357600080fd5b828260208301376000602084830101529392505050565b80356101b081611754565b600082601f830112610c85578081fd5b610c9483833560208501610c18565b9392505050565b8035600281106101b057600080fd5b600060a08284031215610cbb578081fd5b60405160a0810167ffffffffffffffff8282108183111715610cd957fe5b81604052829350843583526020850135602084015260408501356040840152606085013560608401526080850135915080821115610d1657600080fd5b50610d2385828601610c75565b6080830152505092915050565b600060408284031215610d41578081fd5b6040516040810167ffffffffffffffff8282108183111715610d5f57fe5b8160405282935084358352602091508185013581811115610d7f57600080fd5b8501601f81018713610d9057600080fd5b803582811115610d9c57fe5b8381029250610dac848401611700565b8181528481019083860185850187018b1015610dc757600080fd5b600095505b83861015610dea578035835260019590950194918601918601610dcc565b5080868801525050505050505092915050565b600060a08284031215610e0e578081fd5b60405160a0810167ffffffffffffffff8282108183111715610e2c57fe5b8160405282935084359150610e408261176c565b8183526020850135602084015260408501356040840152606085013560608401526080850135915080821115610d1657600080fd5b600060e08284031215610e86578081fd5b610e9060e0611700565b90508135815260208201356020820152610eac60408301610c9b565b6040820152610ebd60608301610c6a565b6060820152610ece60808301610c6a565b608082015260a082013560a082015260c082013567ffffffffffffffff811115610ef757600080fd5b610f0384828501610c75565b60c08301525092915050565b600060208284031215610f20578081fd5b8151610c948161176c565b600060208284031215610f3c578081fd5b5051919050565b60008060408385031215610f55578081fd5b50508035926020909101359150565b600080600080600080600060e0888a031215610f7e578283fd5b87359650602088013567ffffffffffffffff80821115610f9c578485fd5b610fa88b838c01610caa565b975060408a0135915080821115610fbd578485fd5b610fc98b838c01610d30565b965060608a0135955060808a0135945060a08a0135915080821115610fec578384fd5b610ff88b838c01610caa565b935060c08a013591508082111561100d578283fd5b5061101a8a828b01610d30565b91505092959891949750929550565b600080600080600080600060e0888a031215611043578081fd5b87359650602088013567ffffffffffffffff80821115611061578283fd5b61106d8b838c01610caa565b975060408a0135915080821115611082578283fd5b61108e8b838c01610d30565b965060608a01359150808211156110a3578283fd5b6110af8b838c01610e75565b955060808a01359150808211156110c4578283fd5b6110d08b838c01610dfd565b945060a08a0135915080821115610fec578283fd5b6000602082840312156110f6578081fd5b8151610c9481611754565b600060208284031215611112578081fd5b813567ffffffffffffffff811115611128578182fd5b8201601f81018413611138578182fd5b61114784823560208401610c18565b949350505050565b60008060408385031215611161578182fd5b82519150602083015161117381611754565b809150509250929050565b6001600160a01b03169052565b600081518084526111a3816020860160208601611724565b601f01601f19169290920160200192915050565b600081518352602082015160208401526040820151604084015260608201516060840152608082015160a0608085015261114760a085018261118b565b6000604083018251845260208084015160408287015282815180855260608801915083830194508592505b8083101561123f578451825293830193600192909201919083019061121f565b509695505050505050565b6000815115158352602082015160208401526040820151604084015260608201516060840152608082015160a0608085015261114760a085018261118b565b918252602082015260400190565b6000888252876020830152600287106112ac57fe5b8660f81b60408301526bffffffffffffffffffffffff19808760601b166041840152808660601b1660558401525083606983015282516112f3816089850160208701611724565b9190910160890198975050505050505050565b6001600160a01b0391909116815260200190565b6001600160a01b0394909416845260208401929092526040830152606082015260800190565b9283526001600160a01b03919091166020830152604082015260600190565b60008482526060602083015261137860608301856111b7565b828103604084015261138a81856111f4565b9695505050505050565b938452602084019290925260408301526001600160a01b0316606082015260800190565b60208082526041908201527f5374617465207472616e736974696f6e2070726f63657373206d75737420626560408201527f20636f6d706c65746564207072696f7220746f2066696e616c697a6174696f6e6060820152601760f91b608082015260a00190565b60208082526054908201527f506f73742d737461746520726f6f7420676c6f62616c20696e646578206d757360408201527f7420657175616c20746f207468652070726520737461746520726f6f7420676c60608201527337b130b61034b73232bc1038363ab99037b7329760611b608082015260a00190565b60208082526024908201527f496e76616c6964207472616e73616374696f6e20696e636c7573696f6e20707260408201526337b7b31760e11b606082015260800190565b60208082526028908201527f496e76616c696420706f73742d737461746520726f6f7420696e636c7573696f6040820152673710383937b7b31760c11b606082015260800190565b6020808252604c908201527f5072652d737461746520726f6f7420676c6f62616c20696e646578206d75737460408201527f20657175616c20746f20746865207472616e73616374696f6e20726f6f74206760608201526b3637b130b61034b73232bc1760a11b608082015260a00190565b60208082526030908201527f5374617465207472616e736974696f6e20686173206e6f74206265656e20707260408201526f37bb32b710333930bab23ab632b73a1760811b606082015260800190565b60208082526027908201527f496e76616c6964207072652d737461746520726f6f7420696e636c7573696f6e60408201526610383937b7b31760c91b606082015260800190565b600060208252610c9460208301846111b7565b60006080825285516080830152602086015160a083015260408601516002811061166757fe5b60c083015260608601516001600160a01b031660e0830152608086015161169261010084018261117e565b5060a086015161012083015260c086015160e06101408401526116b961016084018261118b565b905082810360208401526116cd818761124a565b905082810360408401526116e181866111b7565b905082810360608401526116f581856111f4565b979650505050505050565b60405181810167ffffffffffffffff8111828210171561171c57fe5b604052919050565b60005b8381101561173f578181015183820152602001611727565b8381111561174e576000848401525b50505050565b6001600160a01b038116811461176957600080fd5b50565b801515811461176957600080fdfea26469706673582212205dbab94b86b7fa55149dd4efe74e8533d11e06735abd7d989856c9aa60c89c1064736f6c63430007060033", "devdoc": { - "details": "The Fraud Verifier contract coordinates the entire fraud proof verification process. If the fraud proof was successful it prunes any state batches from State Commitment Chain which were published after the fraudulent state root. Compiler used: solc Runtime target: EVM", + "details": "The Fraud Verifier contract coordinates the entire fraud proof verification process. If the fraud proof was successful it prunes any state batches from State Commitment Chain which were published after the fraudulent state root. Compiler used: solc Runtime target: EVM", "kind": "dev", "methods": { "constructor": { @@ -498,6 +498,14 @@ "_transactionProof": "Inclusion proof for the provided transaction.", "_txChainElement": "OVM transaction chain element." } + }, + "resolve(string)": { + "params": { + "_name": "Name to resolve an address for." + }, + "returns": { + "_0": "Address associated with the given name." + } } }, "title": "OVM_FraudVerifier", @@ -514,6 +522,9 @@ }, "initializeFraudVerification(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),(uint256,uint256,uint8,address,address,uint256,bytes),(bool,uint256,uint256,uint256,bytes),(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))": { "notice": "Begins the fraud verification process." + }, + "resolve(string)": { + "notice": "Resolves the address associated with a given name." } }, "version": 1 @@ -521,20 +532,20 @@ "storageLayout": { "storage": [ { - "astId": 12526, + "astId": 12800, "contract": "contracts/optimistic-ethereum/OVM/verification/OVM_FraudVerifier.sol:OVM_FraudVerifier", "label": "libAddressManager", "offset": 0, "slot": "0", - "type": "t_contract(Lib_AddressManager)12519" + "type": "t_contract(Lib_AddressManager)12793" }, { - "astId": 9143, + "astId": 9391, "contract": "contracts/optimistic-ethereum/OVM/verification/OVM_FraudVerifier.sol:OVM_FraudVerifier", "label": "transitioners", "offset": 0, "slot": "1", - "type": "t_mapping(t_bytes32,t_contract(iOVM_StateTransitioner)11716)" + "type": "t_mapping(t_bytes32,t_contract(iOVM_StateTransitioner)11962)" } ], "types": { @@ -543,22 +554,22 @@ "label": "bytes32", "numberOfBytes": "32" }, - "t_contract(Lib_AddressManager)12519": { + "t_contract(Lib_AddressManager)12793": { "encoding": "inplace", "label": "contract Lib_AddressManager", "numberOfBytes": "20" }, - "t_contract(iOVM_StateTransitioner)11716": { + "t_contract(iOVM_StateTransitioner)11962": { "encoding": "inplace", "label": "contract iOVM_StateTransitioner", "numberOfBytes": "20" }, - "t_mapping(t_bytes32,t_contract(iOVM_StateTransitioner)11716)": { + "t_mapping(t_bytes32,t_contract(iOVM_StateTransitioner)11962)": { "encoding": "mapping", "key": "t_bytes32", "label": "mapping(bytes32 => contract iOVM_StateTransitioner)", "numberOfBytes": "32", - "value": "t_contract(iOVM_StateTransitioner)11716" + "value": "t_contract(iOVM_StateTransitioner)11962" } } } diff --git a/packages/contracts/deployments/kovan/OVM_L1CrossDomainMessenger.json b/packages/contracts/deployments/kovan/OVM_L1CrossDomainMessenger.json index 2446710d2adc4..ceb42bc0a5762 100644 --- a/packages/contracts/deployments/kovan/OVM_L1CrossDomainMessenger.json +++ b/packages/contracts/deployments/kovan/OVM_L1CrossDomainMessenger.json @@ -1,11 +1,82 @@ { - "address": "0xDBafb4AB19eafE27aF30Dd9C811a1BF4F64b603b", + "address": "0xa9D9045E4A753c856Fc0053369E780f23559E0A1", "abi": [ { "inputs": [], "stateMutability": "nonpayable", "type": "constructor" }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes32", + "name": "msgHash", + "type": "bytes32" + } + ], + "name": "FailedRelayedMessage", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "_xDomainCalldataHash", + "type": "bytes32" + } + ], + "name": "MessageAllowed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "_xDomainCalldataHash", + "type": "bytes32" + } + ], + "name": "MessageBlocked", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "Paused", + "type": "event" + }, { "anonymous": false, "inputs": [ @@ -32,6 +103,64 @@ "name": "SentMessage", "type": "event" }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "Unpaused", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_xDomainCalldataHash", + "type": "bytes32" + } + ], + "name": "allowMessage", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_xDomainCalldataHash", + "type": "bytes32" + } + ], + "name": "blockMessage", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "name": "blockedMessages", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { @@ -71,6 +200,39 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "pause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "paused", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { @@ -189,6 +351,13 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [ { @@ -234,7 +403,7 @@ "outputs": [ { "internalType": "address", - "name": "_contract", + "name": "", "type": "address" } ], @@ -302,6 +471,19 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [], "name": "xDomainMessageSender", @@ -316,36 +498,52 @@ "type": "function" } ], - "transactionHash": "0x6c86b1b4888d81fdb7529951e9f143b25a95bac8b0fca2c80e43265dff45f71d", + "transactionHash": "0x1fb0b55a40eda69d78843a052c4874a608d32099c0bea4eefd52a100543ae5ed", "receipt": { "to": null, "from": "0x18394B52d3Cb931dfA76F63251919D051953413d", - "contractAddress": "0xDBafb4AB19eafE27aF30Dd9C811a1BF4F64b603b", - "transactionIndex": 1, - "gasUsed": "2210921", + "contractAddress": "0xa9D9045E4A753c856Fc0053369E780f23559E0A1", + "transactionIndex": 0, + "gasUsed": "2795220", "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0xbf40a87245132972106c7d3b453e52d110846e8b3d9852bffbec662b2db33cf9", - "transactionHash": "0x6c86b1b4888d81fdb7529951e9f143b25a95bac8b0fca2c80e43265dff45f71d", + "blockHash": "0xea435110780744f5598fc90e58d58c96add2c612a30faface1580cf6aaf66882", + "transactionHash": "0x1fb0b55a40eda69d78843a052c4874a608d32099c0bea4eefd52a100543ae5ed", "logs": [], - "blockNumber": 24199494, - "cumulativeGasUsed": "2243515", + "blockNumber": 24572827, + "cumulativeGasUsed": "2795220", "status": 1, "byzantium": true }, "args": [], - "solcInputHash": "03aed03b958b1d37f90bd88d0f56dd85", - "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"msgHash\",\"type\":\"bytes32\"}],\"name\":\"RelayedMessage\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"}],\"name\":\"SentMessage\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"messageNonce\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_sender\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_message\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"_messageNonce\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"stateRootBatchHeader\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"siblings\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct Lib_OVMCodec.ChainInclusionProof\",\"name\":\"stateRootProof\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"stateTrieWitness\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"storageTrieWitness\",\"type\":\"bytes\"}],\"internalType\":\"struct iOVM_L1CrossDomainMessenger.L2MessageInclusionProof\",\"name\":\"_proof\",\"type\":\"tuple\"}],\"name\":\"relayMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"relayedMessages\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_sender\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_message\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"_messageNonce\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"_gasLimit\",\"type\":\"uint32\"}],\"name\":\"replayMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"_contract\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_message\",\"type\":\"bytes\"},{\"internalType\":\"uint32\",\"name\":\"_gasLimit\",\"type\":\"uint32\"}],\"name\":\"sendMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"sentMessages\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"successfulMessages\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"xDomainMessageSender\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The L1 Cross Domain Messenger contract sends messages from L1 to L2, and relays messages from L2 onto L1. In the event that a message sent from L1 to L2 is rejected for exceeding the L2 epoch gas limit, it can be resubmitted via this contract's replay function. Compiler used: solc Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"initialize(address)\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\"}},\"relayMessage(address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))\":{\"params\":{\"_message\":\"Message to send to the target.\",\"_messageNonce\":\"Nonce for the provided message.\",\"_proof\":\"Inclusion proof for the given message.\",\"_sender\":\"Message sender address.\",\"_target\":\"Target contract address.\"}},\"replayMessage(address,address,bytes,uint256,uint32)\":{\"params\":{\"_gasLimit\":\"Gas limit for the provided message.\",\"_message\":\"Message to send to the target.\",\"_messageNonce\":\"Nonce for the provided message.\",\"_sender\":\"Original sender address.\",\"_target\":\"Target contract address.\"}},\"sendMessage(address,bytes,uint32)\":{\"params\":{\"_gasLimit\":\"Gas limit for the provided message.\",\"_message\":\"Message to send to the target.\",\"_target\":\"Target contract address.\"}}},\"title\":\"OVM_L1CrossDomainMessenger\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"constructor\":{\"notice\":\"Pass a default zero address to the address resolver. This will be updated when initialized.\"},\"relayMessage(address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))\":{\"notice\":\"Relays a cross domain message to a contract.\"},\"replayMessage(address,address,bytes,uint256,uint32)\":{\"notice\":\"Replays a cross domain message to the target messenger.\"},\"sendMessage(address,bytes,uint32)\":{\"notice\":\"Sends a cross domain message to the target messenger.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1CrossDomainMessenger.sol\":\"OVM_L1CrossDomainMessenger\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/optimistic-ethereum/OVM/bridge/messaging/Abs_BaseCrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Interface Imports */\\nimport { iAbs_BaseCrossDomainMessenger } from \\\"../../../iOVM/bridge/messaging/iAbs_BaseCrossDomainMessenger.sol\\\";\\n\\n/* Library Imports */\\nimport { Lib_ReentrancyGuard } from \\\"../../../libraries/utils/Lib_ReentrancyGuard.sol\\\";\\n\\n/**\\n * @title Abs_BaseCrossDomainMessenger\\n * @dev The Base Cross Domain Messenger is an abstract contract providing the interface and common functionality used in the\\n * L1 and L2 Cross Domain Messengers. It can also serve as a template for developers wishing to implement a custom bridge \\n * contract to suit their needs.\\n *\\n * Compiler used: defined by child contract\\n * Runtime target: defined by child contract\\n */\\nabstract contract Abs_BaseCrossDomainMessenger is iAbs_BaseCrossDomainMessenger, Lib_ReentrancyGuard {\\n /**************\\n * Constants *\\n **************/\\n\\n // The default x-domain message sender being set to a non-zero value makes\\n // deployment a bit more expensive, but in exchange the refund on every call to\\n // `relayMessage` by the L1 and L2 messengers will be higher.\\n address internal constant DEFAULT_XDOMAIN_SENDER = 0x000000000000000000000000000000000000dEaD;\\n\\n /**********************\\n * Contract Variables *\\n **********************/\\n\\n mapping (bytes32 => bool) public relayedMessages;\\n mapping (bytes32 => bool) public successfulMessages;\\n mapping (bytes32 => bool) public sentMessages;\\n uint256 public messageNonce;\\n address internal xDomainMsgSender = DEFAULT_XDOMAIN_SENDER;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n constructor() Lib_ReentrancyGuard() {}\\n\\n function xDomainMessageSender() public override view returns (address) {\\n require(xDomainMsgSender != DEFAULT_XDOMAIN_SENDER, \\\"xDomainMessageSender is not set\\\");\\n return xDomainMsgSender;\\n }\\n\\n /**\\n * Sends a cross domain message to the target messenger.\\n * @param _target Target contract address.\\n * @param _message Message to send to the target.\\n * @param _gasLimit Gas limit for the provided message.\\n */\\n function sendMessage(\\n address _target,\\n bytes memory _message,\\n uint32 _gasLimit\\n )\\n override\\n public\\n {\\n bytes memory xDomainCalldata = _getXDomainCalldata(\\n _target,\\n msg.sender,\\n _message,\\n messageNonce\\n );\\n\\n messageNonce += 1;\\n sentMessages[keccak256(xDomainCalldata)] = true;\\n\\n _sendXDomainMessage(xDomainCalldata, _gasLimit);\\n emit SentMessage(xDomainCalldata);\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Generates the correct cross domain calldata for a message.\\n * @param _target Target contract address.\\n * @param _sender Message sender address.\\n * @param _message Message to send to the target.\\n * @param _messageNonce Nonce for the provided message.\\n * @return ABI encoded cross domain calldata.\\n */\\n function _getXDomainCalldata(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _messageNonce\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return abi.encodeWithSignature(\\n \\\"relayMessage(address,address,bytes,uint256)\\\",\\n _target,\\n _sender,\\n _message,\\n _messageNonce\\n );\\n }\\n\\n /**\\n * Sends a cross domain message.\\n * param // Message to send.\\n * param // Gas limit for the provided message.\\n */\\n function _sendXDomainMessage(\\n bytes memory, // _message,\\n uint256 // _gasLimit\\n )\\n virtual\\n internal\\n {\\n revert(\\\"Implement me in child contracts!\\\");\\n }\\n}\\n\",\"keccak256\":\"0xe6fa23a72685870720dcc4c2b4b6ff7f40aec284c3e1a02251f2369703a87260\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1CrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../../libraries/resolver/Lib_AddressResolver.sol\\\";\\nimport { Lib_AddressManager } from \\\"../../../libraries/resolver/Lib_AddressManager.sol\\\";\\nimport { Lib_SecureMerkleTrie } from \\\"../../../libraries/trie/Lib_SecureMerkleTrie.sol\\\";\\nimport { Lib_ReentrancyGuard } from \\\"../../../libraries/utils/Lib_ReentrancyGuard.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_L1CrossDomainMessenger } from \\\"../../../iOVM/bridge/messaging/iOVM_L1CrossDomainMessenger.sol\\\";\\nimport { iOVM_CanonicalTransactionChain } from \\\"../../../iOVM/chain/iOVM_CanonicalTransactionChain.sol\\\";\\nimport { iOVM_StateCommitmentChain } from \\\"../../../iOVM/chain/iOVM_StateCommitmentChain.sol\\\";\\n\\n/* Contract Imports */\\nimport { Abs_BaseCrossDomainMessenger } from \\\"./Abs_BaseCrossDomainMessenger.sol\\\";\\n\\n/**\\n * @title OVM_L1CrossDomainMessenger\\n * @dev The L1 Cross Domain Messenger contract sends messages from L1 to L2, and relays messages from L2 onto L1.\\n * In the event that a message sent from L1 to L2 is rejected for exceeding the L2 epoch gas limit, it can be resubmitted\\n * via this contract's replay function.\\n *\\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract OVM_L1CrossDomainMessenger is iOVM_L1CrossDomainMessenger, Abs_BaseCrossDomainMessenger, Lib_AddressResolver {\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * Pass a default zero address to the address resolver. This will be updated when initialized.\\n */\\n constructor()\\n Lib_AddressResolver(address(0))\\n {}\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n */\\n function initialize(\\n address _libAddressManager\\n )\\n public\\n {\\n require(address(libAddressManager) == address(0), \\\"L1CrossDomainMessenger already intialized.\\\");\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n xDomainMsgSender = DEFAULT_XDOMAIN_SENDER;\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n /**\\n * Modifier to enforce that, if configured, only the OVM_L2MessageRelayer contract may successfully call a method.\\n */\\n modifier onlyRelayer() {\\n address relayer = resolve(\\\"OVM_L2MessageRelayer\\\");\\n if (relayer != address(0)) {\\n require(\\n msg.sender == relayer,\\n \\\"Only OVM_L2MessageRelayer can relay L2-to-L1 messages.\\\"\\n );\\n }\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Relays a cross domain message to a contract.\\n * @inheritdoc iOVM_L1CrossDomainMessenger\\n */\\n function relayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _messageNonce,\\n L2MessageInclusionProof memory _proof\\n )\\n override\\n public\\n nonReentrant\\n onlyRelayer()\\n {\\n bytes memory xDomainCalldata = _getXDomainCalldata(\\n _target,\\n _sender,\\n _message,\\n _messageNonce\\n );\\n\\n require(\\n _verifyXDomainMessage(\\n xDomainCalldata,\\n _proof\\n ) == true,\\n \\\"Provided message could not be verified.\\\"\\n );\\n\\n bytes32 xDomainCalldataHash = keccak256(xDomainCalldata);\\n\\n require(\\n successfulMessages[xDomainCalldataHash] == false,\\n \\\"Provided message has already been received.\\\"\\n );\\n\\n xDomainMsgSender = _sender;\\n (bool success, ) = _target.call(_message);\\n xDomainMsgSender = DEFAULT_XDOMAIN_SENDER;\\n\\n // Mark the message as received if the call was successful. Ensures that a message can be\\n // relayed multiple times in the case that the call reverted.\\n if (success == true) {\\n successfulMessages[xDomainCalldataHash] = true;\\n emit RelayedMessage(xDomainCalldataHash);\\n }\\n\\n // Store an identifier that can be used to prove that the given message was relayed by some\\n // user. Gives us an easy way to pay relayers for their work.\\n bytes32 relayId = keccak256(\\n abi.encodePacked(\\n xDomainCalldata,\\n msg.sender,\\n block.number\\n )\\n );\\n relayedMessages[relayId] = true;\\n }\\n\\n /**\\n * Replays a cross domain message to the target messenger.\\n * @inheritdoc iOVM_L1CrossDomainMessenger\\n */\\n function replayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _messageNonce,\\n uint32 _gasLimit\\n )\\n override\\n public\\n {\\n bytes memory xDomainCalldata = _getXDomainCalldata(\\n _target,\\n _sender,\\n _message,\\n _messageNonce\\n );\\n\\n require(\\n sentMessages[keccak256(xDomainCalldata)] == true,\\n \\\"Provided message has not already been sent.\\\"\\n );\\n\\n _sendXDomainMessage(xDomainCalldata, _gasLimit);\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Verifies that the given message is valid.\\n * @param _xDomainCalldata Calldata to verify.\\n * @param _proof Inclusion proof for the message.\\n * @return Whether or not the provided message is valid.\\n */\\n function _verifyXDomainMessage(\\n bytes memory _xDomainCalldata,\\n L2MessageInclusionProof memory _proof\\n )\\n internal\\n view\\n returns (\\n bool\\n )\\n {\\n return (\\n _verifyStateRootProof(_proof)\\n && _verifyStorageProof(_xDomainCalldata, _proof)\\n );\\n }\\n\\n /**\\n * Verifies that the state root within an inclusion proof is valid.\\n * @param _proof Message inclusion proof.\\n * @return Whether or not the provided proof is valid.\\n */\\n function _verifyStateRootProof(\\n L2MessageInclusionProof memory _proof\\n )\\n internal\\n view\\n returns (\\n bool\\n )\\n {\\n iOVM_StateCommitmentChain ovmStateCommitmentChain = iOVM_StateCommitmentChain(resolve(\\\"OVM_StateCommitmentChain\\\"));\\n\\n return (\\n ovmStateCommitmentChain.insideFraudProofWindow(_proof.stateRootBatchHeader) == false\\n && ovmStateCommitmentChain.verifyStateCommitment(\\n _proof.stateRoot,\\n _proof.stateRootBatchHeader,\\n _proof.stateRootProof\\n )\\n );\\n }\\n\\n /**\\n * Verifies that the storage proof within an inclusion proof is valid.\\n * @param _xDomainCalldata Encoded message calldata.\\n * @param _proof Message inclusion proof.\\n * @return Whether or not the provided proof is valid.\\n */\\n function _verifyStorageProof(\\n bytes memory _xDomainCalldata,\\n L2MessageInclusionProof memory _proof\\n )\\n internal\\n view\\n returns (\\n bool\\n )\\n {\\n bytes32 storageKey = keccak256(\\n abi.encodePacked(\\n keccak256(\\n abi.encodePacked(\\n _xDomainCalldata,\\n resolve(\\\"OVM_L2CrossDomainMessenger\\\")\\n )\\n ),\\n uint256(0)\\n )\\n );\\n\\n (\\n bool exists,\\n bytes memory encodedMessagePassingAccount\\n ) = Lib_SecureMerkleTrie.get(\\n abi.encodePacked(0x4200000000000000000000000000000000000000),\\n _proof.stateTrieWitness,\\n _proof.stateRoot\\n );\\n\\n require(\\n exists == true,\\n \\\"Message passing predeploy has not been initialized or invalid proof provided.\\\"\\n );\\n\\n Lib_OVMCodec.EVMAccount memory account = Lib_OVMCodec.decodeEVMAccount(\\n encodedMessagePassingAccount\\n );\\n\\n return Lib_SecureMerkleTrie.verifyInclusionProof(\\n abi.encodePacked(storageKey),\\n abi.encodePacked(uint8(1)),\\n _proof.storageTrieWitness,\\n account.storageRoot\\n );\\n }\\n\\n /**\\n * Sends a cross domain message.\\n * @param _message Message to send.\\n * @param _gasLimit OVM gas limit for the message.\\n */\\n function _sendXDomainMessage(\\n bytes memory _message,\\n uint256 _gasLimit\\n )\\n override\\n internal\\n {\\n iOVM_CanonicalTransactionChain(resolve(\\\"OVM_CanonicalTransactionChain\\\")).enqueue(\\n resolve(\\\"OVM_L2CrossDomainMessenger\\\"),\\n _gasLimit,\\n _message\\n );\\n }\\n}\\n\",\"keccak256\":\"0xf1ffb01c7274d1fde7713cc1e6c5ee5c77edfb0849b94d34a7ac0c26d795c478\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/bridge/messaging/iAbs_BaseCrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/**\\n * @title iAbs_BaseCrossDomainMessenger\\n */\\ninterface iAbs_BaseCrossDomainMessenger {\\n\\n /**********\\n * Events *\\n **********/\\n event SentMessage(bytes message);\\n event RelayedMessage(bytes32 msgHash);\\n\\n /**********************\\n * Contract Variables *\\n **********************/\\n function xDomainMessageSender() external view returns (address);\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sends a cross domain message to the target messenger.\\n * @param _target Target contract address.\\n * @param _message Message to send to the target.\\n * @param _gasLimit Gas limit for the provided message.\\n */\\n function sendMessage(\\n address _target,\\n bytes calldata _message,\\n uint32 _gasLimit\\n ) external;\\n}\\n\",\"keccak256\":\"0xc2bd6b373daae2ede34281f4be5938d02b9d1cfb056b40d65ff70b7f16ce3c86\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/bridge/messaging/iOVM_L1CrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { iAbs_BaseCrossDomainMessenger } from \\\"./iAbs_BaseCrossDomainMessenger.sol\\\";\\n\\n/**\\n * @title iOVM_L1CrossDomainMessenger\\n */\\ninterface iOVM_L1CrossDomainMessenger is iAbs_BaseCrossDomainMessenger {\\n\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n struct L2MessageInclusionProof {\\n bytes32 stateRoot;\\n Lib_OVMCodec.ChainBatchHeader stateRootBatchHeader;\\n Lib_OVMCodec.ChainInclusionProof stateRootProof;\\n bytes stateTrieWitness;\\n bytes storageTrieWitness;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Relays a cross domain message to a contract.\\n * @param _target Target contract address.\\n * @param _sender Message sender address.\\n * @param _message Message to send to the target.\\n * @param _messageNonce Nonce for the provided message.\\n * @param _proof Inclusion proof for the given message.\\n */\\n function relayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _messageNonce,\\n L2MessageInclusionProof memory _proof\\n ) external;\\n\\n /**\\n * Replays a cross domain message to the target messenger.\\n * @param _target Target contract address.\\n * @param _sender Original sender address.\\n * @param _message Message to send to the target.\\n * @param _messageNonce Nonce for the provided message.\\n * @param _gasLimit Gas limit for the provided message.\\n */\\n function replayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _messageNonce,\\n uint32 _gasLimit\\n ) external;\\n}\\n\",\"keccak256\":\"0xdcd239d0b215e400674d78e8db4ac12ba18efc34fa78e24c2ff867f61062dba2\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_CanonicalTransactionChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_ChainStorageContainer } from \\\"./iOVM_ChainStorageContainer.sol\\\";\\n\\n/**\\n * @title iOVM_CanonicalTransactionChain\\n */\\ninterface iOVM_CanonicalTransactionChain {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event TransactionEnqueued(\\n address _l1TxOrigin,\\n address _target,\\n uint256 _gasLimit,\\n bytes _data,\\n uint256 _queueIndex,\\n uint256 _timestamp\\n );\\n\\n event QueueBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event SequencerBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event TransactionBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct BatchContext {\\n uint256 numSequencedTransactions;\\n uint256 numSubsequentQueueTransactions;\\n uint256 timestamp;\\n uint256 blockNumber;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n\\n /**\\n * Accesses the batch storage container.\\n * @return Reference to the batch storage container.\\n */\\n function batches()\\n external\\n view\\n returns (\\n iOVM_ChainStorageContainer\\n );\\n\\n /**\\n * Accesses the queue storage container.\\n * @return Reference to the queue storage container.\\n */\\n function queue()\\n external\\n view\\n returns (\\n iOVM_ChainStorageContainer\\n );\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements()\\n external\\n view\\n returns (\\n uint256 _totalElements\\n );\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches()\\n external\\n view\\n returns (\\n uint256 _totalBatches\\n );\\n\\n /**\\n * Returns the index of the next element to be enqueued.\\n * @return Index for the next queue element.\\n */\\n function getNextQueueIndex()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Gets the queue element at a particular index.\\n * @param _index Index of the queue element to access.\\n * @return _element Queue element at the given index.\\n */\\n function getQueueElement(\\n uint256 _index\\n )\\n external\\n view\\n returns (\\n Lib_OVMCodec.QueueElement memory _element\\n );\\n\\n /**\\n * Returns the timestamp of the last transaction.\\n * @return Timestamp for the last transaction.\\n */\\n function getLastTimestamp()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Returns the blocknumber of the last transaction.\\n * @return Blocknumber for the last transaction.\\n */\\n function getLastBlockNumber()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Get the number of queue elements which have not yet been included.\\n * @return Number of pending queue elements.\\n */\\n function getNumPendingQueueElements()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Retrieves the length of the queue, including\\n * both pending and canonical transactions.\\n * @return Length of the queue.\\n */\\n function getQueueLength()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n\\n /**\\n * Adds a transaction to the queue.\\n * @param _target Target contract to send the transaction to.\\n * @param _gasLimit Gas limit for the given transaction.\\n * @param _data Transaction data.\\n */\\n function enqueue(\\n address _target,\\n uint256 _gasLimit,\\n bytes memory _data\\n )\\n external;\\n\\n /**\\n * Appends a given number of queued transactions as a single batch.\\n * @param _numQueuedTransactions Number of transactions to append.\\n */\\n function appendQueueBatch(\\n uint256 _numQueuedTransactions\\n )\\n external;\\n\\n /**\\n * Allows the sequencer to append a batch of transactions.\\n * @dev This function uses a custom encoding scheme for efficiency reasons.\\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\\n * .param _contexts Array of batch contexts.\\n * .param _transactionDataFields Array of raw transaction data.\\n */\\n function appendSequencerBatch(\\n // uint40 _shouldStartAtElement,\\n // uint24 _totalElementsToAppend,\\n // BatchContext[] _contexts,\\n // bytes[] _transactionDataFields\\n )\\n external;\\n\\n /**\\n * Verifies whether a transaction is included in the chain.\\n * @param _transaction Transaction to verify.\\n * @param _txChainElement Transaction chain element corresponding to the transaction.\\n * @param _batchHeader Header of the batch the transaction was included in.\\n * @param _inclusionProof Inclusion proof for the provided transaction chain element.\\n * @return True if the transaction exists in the CTC, false if not.\\n */\\n function verifyTransaction(\\n Lib_OVMCodec.Transaction memory _transaction,\\n Lib_OVMCodec.TransactionChainElement memory _txChainElement,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _inclusionProof\\n )\\n external\\n view\\n returns (\\n bool\\n );\\n}\\n\",\"keccak256\":\"0xb5e55488a1982841c07cdf5ff475da4789596f111dd48f01b1918ee4c775cf3a\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_ChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title iOVM_ChainStorageContainer\\n */\\ninterface iOVM_ChainStorageContainer {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata()\\n external\\n view\\n returns (\\n bytes27\\n );\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length()\\n external\\n view\\n returns (\\n uint256\\n );\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(\\n bytes32 _object\\n )\\n external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(\\n bytes32 _object,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(\\n uint256 _index\\n )\\n external\\n view\\n returns (\\n bytes32\\n );\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index\\n )\\n external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Marks an index as overwritable, meaing the underlying buffer can start to write values over\\n * any objects before and including the given index.\\n */\\n function setNextOverwritableIndex(\\n uint256 _index\\n )\\n external;\\n}\\n\",\"keccak256\":\"0x2d7973a0ad84c23ec62624d3f1e3aeb198cc72686ff1e6cfa17155556b320c94\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_StateCommitmentChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title iOVM_StateCommitmentChain\\n */\\ninterface iOVM_StateCommitmentChain {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event StateBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n event StateBatchDeleted(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot\\n );\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements()\\n external\\n view\\n returns (\\n uint256 _totalElements\\n );\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches()\\n external\\n view\\n returns (\\n uint256 _totalBatches\\n );\\n\\n /**\\n * Retrieves the timestamp of the last batch submitted by the sequencer.\\n * @return _lastSequencerTimestamp Last sequencer batch timestamp.\\n */\\n function getLastSequencerTimestamp()\\n external\\n view\\n returns (\\n uint256 _lastSequencerTimestamp\\n );\\n\\n /**\\n * Appends a batch of state roots to the chain.\\n * @param _batch Batch of state roots.\\n * @param _shouldStartAtElement Index of the element at which this batch should start.\\n */\\n function appendStateBatch(\\n bytes32[] calldata _batch,\\n uint256 _shouldStartAtElement\\n )\\n external;\\n\\n /**\\n * Deletes all state roots after (and including) a given batch.\\n * @param _batchHeader Header of the batch to start deleting from.\\n */\\n function deleteStateBatch(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n external;\\n\\n /**\\n * Verifies a batch inclusion proof.\\n * @param _element Hash of the element to verify a proof for.\\n * @param _batchHeader Header of the batch in which the element was included.\\n * @param _proof Merkle inclusion proof for the element.\\n */\\n function verifyStateCommitment(\\n bytes32 _element,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _proof\\n )\\n external\\n view\\n returns (\\n bool _verified\\n );\\n\\n /**\\n * Checks whether a given batch is still inside its fraud proof window.\\n * @param _batchHeader Header of the batch to check.\\n * @return _inside Whether or not the batch is inside the fraud proof window.\\n */\\n function insideFraudProofWindow(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n external\\n view\\n returns (\\n bool _inside\\n );\\n}\\n\",\"keccak256\":\"0x6646d6ff392b81aab52a7a277e91540819464751de0af5afd1962094b2e92448\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/codec/Lib_OVMCodec.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../utils/Lib_Bytes32Utils.sol\\\";\\nimport { Lib_SafeExecutionManagerWrapper } from \\\"../../libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\\\";\\n\\n/**\\n * @title Lib_OVMCodec\\n */\\nlibrary Lib_OVMCodec {\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum EOASignatureType {\\n EIP155_TRANSACTION,\\n ETH_SIGNED_MESSAGE\\n }\\n\\n enum QueueOrigin {\\n SEQUENCER_QUEUE,\\n L1TOL2_QUEUE\\n }\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Account {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n address ethAddress;\\n bool isFresh;\\n }\\n\\n struct EVMAccount {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n }\\n\\n struct ChainBatchHeader {\\n uint256 batchIndex;\\n bytes32 batchRoot;\\n uint256 batchSize;\\n uint256 prevTotalElements;\\n bytes extraData;\\n }\\n\\n struct ChainInclusionProof {\\n uint256 index;\\n bytes32[] siblings;\\n }\\n\\n struct Transaction {\\n uint256 timestamp;\\n uint256 blockNumber;\\n QueueOrigin l1QueueOrigin;\\n address l1TxOrigin;\\n address entrypoint;\\n uint256 gasLimit;\\n bytes data;\\n }\\n\\n struct TransactionChainElement {\\n bool isSequenced;\\n uint256 queueIndex; // QUEUED TX ONLY\\n uint256 timestamp; // SEQUENCER TX ONLY\\n uint256 blockNumber; // SEQUENCER TX ONLY\\n bytes txData; // SEQUENCER TX ONLY\\n }\\n\\n struct QueueElement {\\n bytes32 transactionHash;\\n uint40 timestamp;\\n uint40 blockNumber;\\n }\\n\\n struct EIP155Transaction {\\n uint256 nonce;\\n uint256 gasPrice;\\n uint256 gasLimit;\\n address to;\\n uint256 value;\\n bytes data;\\n uint256 chainId;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Decodes an EOA transaction (i.e., native Ethereum RLP encoding).\\n * @param _transaction Encoded EOA transaction.\\n * @return Transaction decoded into a struct.\\n */\\n function decodeEIP155Transaction(\\n bytes memory _transaction,\\n bool _isEthSignedMessage\\n )\\n internal\\n pure\\n returns (\\n EIP155Transaction memory\\n )\\n {\\n if (_isEthSignedMessage) {\\n (\\n uint256 _nonce,\\n uint256 _gasLimit,\\n uint256 _gasPrice,\\n uint256 _chainId,\\n address _to,\\n bytes memory _data\\n ) = abi.decode(\\n _transaction,\\n (uint256, uint256, uint256, uint256, address ,bytes)\\n );\\n return EIP155Transaction({\\n nonce: _nonce,\\n gasPrice: _gasPrice,\\n gasLimit: _gasLimit,\\n to: _to,\\n value: 0,\\n data: _data,\\n chainId: _chainId\\n });\\n } else {\\n Lib_RLPReader.RLPItem[] memory decoded = Lib_RLPReader.readList(_transaction);\\n\\n return EIP155Transaction({\\n nonce: Lib_RLPReader.readUint256(decoded[0]),\\n gasPrice: Lib_RLPReader.readUint256(decoded[1]),\\n gasLimit: Lib_RLPReader.readUint256(decoded[2]),\\n to: Lib_RLPReader.readAddress(decoded[3]),\\n value: Lib_RLPReader.readUint256(decoded[4]),\\n data: Lib_RLPReader.readBytes(decoded[5]),\\n chainId: Lib_RLPReader.readUint256(decoded[6])\\n });\\n }\\n }\\n\\n /**\\n * Decompresses a compressed EIP155 transaction.\\n * @param _transaction Compressed EIP155 transaction bytes.\\n * @return Transaction parsed into a struct.\\n */\\n function decompressEIP155Transaction(\\n bytes memory _transaction\\n )\\n internal\\n returns (\\n EIP155Transaction memory\\n )\\n {\\n return EIP155Transaction({\\n gasLimit: Lib_BytesUtils.toUint24(_transaction, 0),\\n gasPrice: uint256(Lib_BytesUtils.toUint24(_transaction, 3)) * 1000000,\\n nonce: Lib_BytesUtils.toUint24(_transaction, 6),\\n to: Lib_BytesUtils.toAddress(_transaction, 9),\\n data: Lib_BytesUtils.slice(_transaction, 29),\\n chainId: Lib_SafeExecutionManagerWrapper.safeCHAINID(),\\n value: 0\\n });\\n }\\n\\n /**\\n * Encodes an EOA transaction back into the original transaction.\\n * @param _transaction EIP155transaction to encode.\\n * @param _isEthSignedMessage Whether or not this was an eth signed message.\\n * @return Encoded transaction.\\n */\\n function encodeEIP155Transaction(\\n EIP155Transaction memory _transaction,\\n bool _isEthSignedMessage\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n if (_isEthSignedMessage) {\\n return abi.encode(\\n _transaction.nonce,\\n _transaction.gasLimit,\\n _transaction.gasPrice,\\n _transaction.chainId,\\n _transaction.to,\\n _transaction.data\\n );\\n } else {\\n bytes[] memory raw = new bytes[](9);\\n\\n raw[0] = Lib_RLPWriter.writeUint(_transaction.nonce);\\n raw[1] = Lib_RLPWriter.writeUint(_transaction.gasPrice);\\n raw[2] = Lib_RLPWriter.writeUint(_transaction.gasLimit);\\n if (_transaction.to == address(0)) {\\n raw[3] = Lib_RLPWriter.writeBytes('');\\n } else {\\n raw[3] = Lib_RLPWriter.writeAddress(_transaction.to);\\n }\\n raw[4] = Lib_RLPWriter.writeUint(0);\\n raw[5] = Lib_RLPWriter.writeBytes(_transaction.data);\\n raw[6] = Lib_RLPWriter.writeUint(_transaction.chainId);\\n raw[7] = Lib_RLPWriter.writeBytes(bytes(''));\\n raw[8] = Lib_RLPWriter.writeBytes(bytes(''));\\n\\n return Lib_RLPWriter.writeList(raw);\\n }\\n }\\n\\n /**\\n * Encodes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Encoded transaction bytes.\\n */\\n function encodeTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return abi.encodePacked(\\n _transaction.timestamp,\\n _transaction.blockNumber,\\n _transaction.l1QueueOrigin,\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n );\\n }\\n\\n /**\\n * Hashes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Hashed transaction\\n */\\n function hashTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(encodeTransaction(_transaction));\\n }\\n\\n /**\\n * Converts an OVM account to an EVM account.\\n * @param _in OVM account to convert.\\n * @return Converted EVM account.\\n */\\n function toEVMAccount(\\n Account memory _in\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n return EVMAccount({\\n nonce: _in.nonce,\\n balance: _in.balance,\\n storageRoot: _in.storageRoot,\\n codeHash: _in.codeHash\\n });\\n }\\n\\n /**\\n * @notice RLP-encodes an account state struct.\\n * @param _account Account state struct.\\n * @return RLP-encoded account state.\\n */\\n function encodeEVMAccount(\\n EVMAccount memory _account\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes[] memory raw = new bytes[](4);\\n\\n // Unfortunately we can't create this array outright because\\n // Lib_RLPWriter.writeList will reject fixed-size arrays. Assigning\\n // index-by-index circumvents this issue.\\n raw[0] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.nonce)\\n )\\n );\\n raw[1] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.balance)\\n )\\n );\\n raw[2] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.storageRoot));\\n raw[3] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.codeHash));\\n\\n return Lib_RLPWriter.writeList(raw);\\n }\\n\\n /**\\n * @notice Decodes an RLP-encoded account state into a useful struct.\\n * @param _encoded RLP-encoded account state.\\n * @return Account state struct.\\n */\\n function decodeEVMAccount(\\n bytes memory _encoded\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\\n\\n return EVMAccount({\\n nonce: Lib_RLPReader.readUint256(accountState[0]),\\n balance: Lib_RLPReader.readUint256(accountState[1]),\\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\\n });\\n }\\n\\n /**\\n * Calculates a hash for a given batch header.\\n * @param _batchHeader Header to hash.\\n * @return Hash of the header.\\n */\\n function hashBatchHeader(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(\\n abi.encode(\\n _batchHeader.batchRoot,\\n _batchHeader.batchSize,\\n _batchHeader.prevTotalElements,\\n _batchHeader.extraData\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0xe7e518ba7bba3fa28c532f8902576c1bb4dfc1ec4b62bed6da50623248ba17c3\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Contract Imports */\\nimport { Ownable } from \\\"./Lib_Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n /*******************************************\\n * Contract Variables: Internal Accounting *\\n *******************************************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n public\\n onlyOwner\\n {\\n emit AddressSet(_name, _address);\\n addresses[_getNameHash(_name)] = _address;\\n }\\n\\n function getAddress(\\n string memory _name\\n )\\n public\\n view\\n returns (address)\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32 _hash\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0x3a490595cc21ff170e4027843093670ff845d5972481fbfb956b722ea564bb06\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n\\n /*******************************************\\n * Contract Variables: Contract References *\\n *******************************************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(\\n address _libAddressManager\\n ) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function resolve(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address _contract\\n )\\n {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0xaa3ed342f6deb156c660fd83afa579a3b80db17eb465e8949cf5c1b114780143\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Ownable\\n * @dev Adapted from https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol\\n */\\nabstract contract Ownable {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n address public owner;\\n\\n\\n /**********\\n * Events *\\n **********/\\n\\n event OwnershipTransferred(\\n address indexed previousOwner,\\n address indexed newOwner\\n );\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n constructor() {\\n owner = msg.sender;\\n emit OwnershipTransferred(address(0), owner);\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n owner == msg.sender,\\n \\\"Ownable: caller is not the owner\\\"\\n );\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function renounceOwnership()\\n public\\n virtual\\n onlyOwner\\n {\\n emit OwnershipTransferred(owner, address(0));\\n owner = address(0);\\n }\\n\\n function transferOwnership(address _newOwner)\\n public\\n virtual\\n onlyOwner\\n {\\n require(\\n _newOwner != address(0),\\n \\\"Ownable: new owner cannot be the zero address\\\"\\n );\\n\\n emit OwnershipTransferred(owner, _newOwner);\\n owner = _newOwner;\\n }\\n}\\n\",\"keccak256\":\"0xd9dfd9264e5b5fedd53a5b10fdf179c3f367614b0fe69179bce4e45119f5b739\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPReader.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_RLPReader\\n * @dev Adapted from \\\"RLPReader\\\" by Hamdi Allam (hamdi.allam97@gmail.com).\\n */\\nlibrary Lib_RLPReader {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 constant internal MAX_LIST_LENGTH = 32;\\n\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum RLPItemType {\\n DATA_ITEM,\\n LIST_ITEM\\n }\\n\\n \\n /***********\\n * Structs *\\n ***********/\\n\\n struct RLPItem {\\n uint256 length;\\n uint256 ptr;\\n }\\n \\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n \\n /**\\n * Converts bytes to a reference to memory position and length.\\n * @param _in Input bytes to convert.\\n * @return Output memory reference.\\n */\\n function toRLPItem(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem memory\\n )\\n {\\n uint256 ptr;\\n assembly {\\n ptr := add(_in, 32)\\n }\\n\\n return RLPItem({\\n length: _in.length,\\n ptr: ptr\\n });\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n (\\n uint256 listOffset,\\n ,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.LIST_ITEM,\\n \\\"Invalid RLP list value.\\\"\\n );\\n\\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\\n // writing to the length. Since we can't know the number of RLP items without looping over\\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\\n // simply set a reasonable maximum list length and decrease the size before we finish.\\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\\n\\n uint256 itemCount = 0;\\n uint256 offset = listOffset;\\n while (offset < _in.length) {\\n require(\\n itemCount < MAX_LIST_LENGTH,\\n \\\"Provided RLP list exceeds max list length.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n ) = _decodeLength(RLPItem({\\n length: _in.length - offset,\\n ptr: _in.ptr + offset\\n }));\\n\\n out[itemCount] = RLPItem({\\n length: itemLength + itemOffset,\\n ptr: _in.ptr + offset\\n });\\n\\n itemCount += 1;\\n offset += itemOffset + itemLength;\\n }\\n\\n // Decrease the array size to match the actual item count.\\n assembly {\\n mstore(out, itemCount)\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n return readList(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes value.\\\"\\n );\\n\\n return _copy(_in.ptr, itemOffset, itemLength);\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return readBytes(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return string(readBytes(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return readString(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n require(\\n _in.length <= 33,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr + itemOffset;\\n bytes32 out;\\n assembly {\\n out := mload(ptr)\\n\\n // Shift the bytes over to match the item size.\\n if lt(itemLength, 32) {\\n out := div(out, exp(256, sub(32, itemLength)))\\n }\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return readBytes32(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return uint256(readBytes32(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return readUint256(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n require(\\n _in.length == 1,\\n \\\"Invalid RLP boolean value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 out;\\n assembly {\\n out := byte(0, mload(ptr))\\n }\\n\\n require(\\n out == 0 || out == 1,\\n \\\"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\\\"\\n );\\n\\n return out != 0;\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return readBool(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n if (_in.length == 1) {\\n return address(0);\\n }\\n\\n require(\\n _in.length == 21,\\n \\\"Invalid RLP address value.\\\"\\n );\\n\\n return address(readUint256(_in));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return readAddress(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads the raw bytes of an RLP item.\\n * @param _in RLP item to read.\\n * @return Raw RLP bytes.\\n */\\n function readRawBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in);\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Decodes the length of an RLP item.\\n * @param _in RLP item to decode.\\n * @return Offset of the encoded data.\\n * @return Length of the encoded data.\\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\\n */\\n function _decodeLength(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n uint256,\\n uint256,\\n RLPItemType\\n )\\n {\\n require(\\n _in.length > 0,\\n \\\"RLP item cannot be null.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 prefix;\\n assembly {\\n prefix := byte(0, mload(ptr))\\n }\\n\\n if (prefix <= 0x7f) {\\n // Single byte.\\n\\n return (0, 1, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xb7) {\\n // Short string.\\n\\n uint256 strLen = prefix - 0x80;\\n \\n require(\\n _in.length > strLen,\\n \\\"Invalid RLP short string.\\\"\\n );\\n\\n return (1, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xbf) {\\n // Long string.\\n uint256 lenOfStrLen = prefix - 0xb7;\\n\\n require(\\n _in.length > lenOfStrLen,\\n \\\"Invalid RLP long string length.\\\"\\n );\\n\\n uint256 strLen;\\n assembly {\\n // Pick out the string length.\\n strLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfStrLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfStrLen + strLen,\\n \\\"Invalid RLP long string.\\\"\\n );\\n\\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xf7) {\\n // Short list.\\n uint256 listLen = prefix - 0xc0;\\n\\n require(\\n _in.length > listLen,\\n \\\"Invalid RLP short list.\\\"\\n );\\n\\n return (1, listLen, RLPItemType.LIST_ITEM);\\n } else {\\n // Long list.\\n uint256 lenOfListLen = prefix - 0xf7;\\n\\n require(\\n _in.length > lenOfListLen,\\n \\\"Invalid RLP long list length.\\\"\\n );\\n\\n uint256 listLen;\\n assembly {\\n // Pick out the list length.\\n listLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfListLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfListLen + listLen,\\n \\\"Invalid RLP long list.\\\"\\n );\\n\\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\\n }\\n }\\n\\n /**\\n * Copies the bytes from a memory location.\\n * @param _src Pointer to the location to read from.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Copied bytes.\\n */\\n function _copy(\\n uint256 _src,\\n uint256 _offset,\\n uint256 _length\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out = new bytes(_length);\\n if (out.length == 0) {\\n return out;\\n }\\n\\n uint256 src = _src + _offset;\\n uint256 dest;\\n assembly {\\n dest := add(out, 32)\\n }\\n\\n // Copy over as many complete words as we can.\\n for (uint256 i = 0; i < _length / 32; i++) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n\\n src += 32;\\n dest += 32;\\n }\\n\\n // Pick out the remaining bytes.\\n uint256 mask = 256 ** (32 - (_length % 32)) - 1;\\n assembly {\\n mstore(\\n dest,\\n or(\\n and(mload(src), not(mask)),\\n and(mload(dest), mask)\\n )\\n )\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Copies an RLP item into bytes.\\n * @param _in RLP item to copy.\\n * @return Copied bytes.\\n */\\n function _copy(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in.ptr, 0, _in.length);\\n }\\n}\\n\",\"keccak256\":\"0xbdb8fae0ca2483b4cc07607a5070fc25e33c54b4e4462b99e7c0b13aac48a09b\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPWriter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\n\\n/**\\n * @title Lib_RLPWriter\\n * @author Bakaoh (with modifications)\\n */\\nlibrary Lib_RLPWriter {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * RLP encodes a byte string.\\n * @param _in The byte string to encode.\\n * @return _out The RLP encoded string in bytes.\\n */\\n function writeBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n bytes memory encoded;\\n\\n if (_in.length == 1 && uint8(_in[0]) < 128) {\\n encoded = _in;\\n } else {\\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * RLP encodes a list of RLP encoded byte byte strings.\\n * @param _in The list of RLP encoded byte strings.\\n * @return _out The RLP encoded list of items in bytes.\\n */\\n function writeList(\\n bytes[] memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n bytes memory list = _flatten(_in);\\n return abi.encodePacked(_writeLength(list.length, 192), list);\\n }\\n\\n /**\\n * RLP encodes a string.\\n * @param _in The string to encode.\\n * @return _out The RLP encoded string in bytes.\\n */\\n function writeString(\\n string memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(bytes(_in));\\n }\\n\\n /**\\n * RLP encodes an address.\\n * @param _in The address to encode.\\n * @return _out The RLP encoded address in bytes.\\n */\\n function writeAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a uint.\\n * @param _in The uint256 to encode.\\n * @return _out The RLP encoded uint256 in bytes.\\n */\\n function writeUint(\\n uint256 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(_toBinary(_in));\\n }\\n\\n /**\\n * RLP encodes a bool.\\n * @param _in The bool to encode.\\n * @return _out The RLP encoded bool in bytes.\\n */\\n function writeBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n bytes memory encoded = new bytes(1);\\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\\n return encoded;\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\\n * @param _len The length of the string or the payload.\\n * @param _offset 128 if item is string, 192 if item is list.\\n * @return _encoded RLP encoded bytes.\\n */\\n function _writeLength(\\n uint256 _len,\\n uint256 _offset\\n )\\n private\\n pure\\n returns (\\n bytes memory _encoded\\n )\\n {\\n bytes memory encoded;\\n\\n if (_len < 56) {\\n encoded = new bytes(1);\\n encoded[0] = byte(uint8(_len) + uint8(_offset));\\n } else {\\n uint256 lenLen;\\n uint256 i = 1;\\n while (_len / i != 0) {\\n lenLen++;\\n i *= 256;\\n }\\n\\n encoded = new bytes(lenLen + 1);\\n encoded[0] = byte(uint8(lenLen) + uint8(_offset) + 55);\\n for(i = 1; i <= lenLen; i++) {\\n encoded[i] = byte(uint8((_len / (256**(lenLen-i))) % 256));\\n }\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * Encode integer in big endian binary form with no leading zeroes.\\n * @notice TODO: This should be optimized with assembly to save gas costs.\\n * @param _x The integer to encode.\\n * @return _binary RLP encoded bytes.\\n */\\n function _toBinary(\\n uint256 _x\\n )\\n private\\n pure\\n returns (\\n bytes memory _binary\\n )\\n {\\n bytes memory b = abi.encodePacked(_x);\\n\\n uint256 i = 0;\\n for (; i < 32; i++) {\\n if (b[i] != 0) {\\n break;\\n }\\n }\\n\\n bytes memory res = new bytes(32 - i);\\n for (uint256 j = 0; j < res.length; j++) {\\n res[j] = b[i++];\\n }\\n\\n return res;\\n }\\n\\n /**\\n * Copies a piece of memory to another location.\\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\\n * @param _dest Destination location.\\n * @param _src Source location.\\n * @param _len Length of memory to copy.\\n */\\n function _memcpy(\\n uint256 _dest,\\n uint256 _src,\\n uint256 _len\\n )\\n private\\n pure\\n {\\n uint256 dest = _dest;\\n uint256 src = _src;\\n uint256 len = _len;\\n\\n for(; len >= 32; len -= 32) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n dest += 32;\\n src += 32;\\n }\\n\\n uint256 mask = 256 ** (32 - len) - 1;\\n assembly {\\n let srcpart := and(mload(src), not(mask))\\n let destpart := and(mload(dest), mask)\\n mstore(dest, or(destpart, srcpart))\\n }\\n }\\n\\n /**\\n * Flattens a list of byte strings into one byte string.\\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\\n * @param _list List of byte strings to flatten.\\n * @return _flattened The flattened byte string.\\n */\\n function _flatten(\\n bytes[] memory _list\\n )\\n private\\n pure\\n returns (\\n bytes memory _flattened\\n )\\n {\\n if (_list.length == 0) {\\n return new bytes(0);\\n }\\n\\n uint256 len;\\n uint256 i = 0;\\n for (; i < _list.length; i++) {\\n len += _list[i].length;\\n }\\n\\n bytes memory flattened = new bytes(len);\\n uint256 flattenedPtr;\\n assembly { flattenedPtr := add(flattened, 0x20) }\\n\\n for(i = 0; i < _list.length; i++) {\\n bytes memory item = _list[i];\\n\\n uint256 listPtr;\\n assembly { listPtr := add(item, 0x20)}\\n\\n _memcpy(flattenedPtr, listPtr, item.length);\\n flattenedPtr += _list[i].length;\\n }\\n\\n return flattened;\\n }\\n}\",\"keccak256\":\"0xbcb24619c1758cb0d9f3fe5c79495950045a9087046a02b9ce01df46ae09ae5b\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/trie/Lib_MerkleTrie.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\n\\n/**\\n * @title Lib_MerkleTrie\\n */\\nlibrary Lib_MerkleTrie {\\n\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n enum NodeType {\\n BranchNode,\\n ExtensionNode,\\n LeafNode\\n }\\n\\n struct TrieNode {\\n bytes encoded;\\n Lib_RLPReader.RLPItem[] decoded;\\n }\\n\\n\\n /**********************\\n * Contract Constants *\\n **********************/\\n\\n // TREE_RADIX determines the number of elements per branch node.\\n uint256 constant TREE_RADIX = 16;\\n // Branch nodes have TREE_RADIX elements plus an additional `value` slot.\\n uint256 constant BRANCH_NODE_LENGTH = TREE_RADIX + 1;\\n // Leaf nodes and extension nodes always have two elements, a `path` and a `value`.\\n uint256 constant LEAF_OR_EXTENSION_NODE_LENGTH = 2;\\n\\n // Prefixes are prepended to the `path` within a leaf or extension node and\\n // allow us to differentiate between the two node types. `ODD` or `EVEN` is\\n // determined by the number of nibbles within the unprefixed `path`. If the\\n // number of nibbles if even, we need to insert an extra padding nibble so\\n // the resulting prefixed `path` has an even number of nibbles.\\n uint8 constant PREFIX_EXTENSION_EVEN = 0;\\n uint8 constant PREFIX_EXTENSION_ODD = 1;\\n uint8 constant PREFIX_LEAF_EVEN = 2;\\n uint8 constant PREFIX_LEAF_ODD = 3;\\n\\n // Just a utility constant. RLP represents `NULL` as 0x80.\\n bytes1 constant RLP_NULL = bytes1(0x80);\\n bytes constant RLP_NULL_BYTES = hex'80';\\n bytes32 constant internal KECCAK256_RLP_NULL_BYTES = keccak256(RLP_NULL_BYTES);\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * @notice Verifies a proof that a given key/value pair is present in the\\n * Merkle trie.\\n * @param _key Key of the node to search for, as a hex string.\\n * @param _value Value of the node to search for, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the desired node. Unlike\\n * traditional Merkle trees, this proof is executed top-down and consists\\n * of a list of RLP-encoded nodes that make a path down to the target node.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _verified `true` if the k/v pair exists in the trie, `false` otherwise.\\n */\\n function verifyInclusionProof(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bool _verified\\n )\\n {\\n (\\n bool exists,\\n bytes memory value\\n ) = get(_key, _proof, _root);\\n\\n return (\\n exists && Lib_BytesUtils.equal(_value, value)\\n );\\n }\\n\\n /**\\n * @notice Verifies a proof that a given key is *not* present in\\n * the Merkle trie.\\n * @param _key Key of the node to search for, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\\n * target node.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _verified `true` if the key is absent in the trie, `false` otherwise.\\n */\\n function verifyExclusionProof(\\n bytes memory _key,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bool _verified\\n )\\n {\\n (\\n bool exists,\\n ) = get(_key, _proof, _root);\\n\\n return exists == false;\\n }\\n\\n /**\\n * @notice Updates a Merkle trie and returns a new root hash.\\n * @param _key Key of the node to update, as a hex string.\\n * @param _value Value of the node to update, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\\n * target node. If the key exists, we can simply update the value.\\n * Otherwise, we need to modify the trie to handle the new k/v pair.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _updatedRoot Root hash of the newly constructed trie.\\n */\\n function update(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bytes32 _updatedRoot\\n )\\n {\\n // Special case when inserting the very first node.\\n if (_root == KECCAK256_RLP_NULL_BYTES) {\\n return getSingleNodeRootHash(_key, _value);\\n }\\n\\n TrieNode[] memory proof = _parseProof(_proof);\\n (uint256 pathLength, bytes memory keyRemainder, ) = _walkNodePath(proof, _key, _root);\\n TrieNode[] memory newPath = _getNewPath(proof, pathLength, keyRemainder, _value);\\n\\n return _getUpdatedTrieRoot(newPath, _key);\\n }\\n\\n /**\\n * @notice Retrieves the value associated with a given key.\\n * @param _key Key to search for, as hex bytes.\\n * @param _proof Merkle trie inclusion proof for the key.\\n * @param _root Known root of the Merkle trie.\\n * @return _exists Whether or not the key exists.\\n * @return _value Value of the key if it exists.\\n */\\n function get(\\n bytes memory _key,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bool _exists,\\n bytes memory _value\\n )\\n {\\n TrieNode[] memory proof = _parseProof(_proof);\\n (uint256 pathLength, bytes memory keyRemainder, bool isFinalNode) = _walkNodePath(proof, _key, _root);\\n\\n bool exists = keyRemainder.length == 0;\\n\\n require(\\n exists || isFinalNode,\\n \\\"Provided proof is invalid.\\\"\\n );\\n\\n bytes memory value = exists ? _getNodeValue(proof[pathLength - 1]) : bytes('');\\n\\n return (\\n exists,\\n value\\n );\\n }\\n\\n /**\\n * Computes the root hash for a trie with a single node.\\n * @param _key Key for the single node.\\n * @param _value Value for the single node.\\n * @return _updatedRoot Hash of the trie.\\n */\\n function getSingleNodeRootHash(\\n bytes memory _key,\\n bytes memory _value\\n )\\n internal\\n pure\\n returns (\\n bytes32 _updatedRoot\\n )\\n {\\n return keccak256(_makeLeafNode(\\n Lib_BytesUtils.toNibbles(_key),\\n _value\\n ).encoded);\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * @notice Walks through a proof using a provided key.\\n * @param _proof Inclusion proof to walk through.\\n * @param _key Key to use for the walk.\\n * @param _root Known root of the trie.\\n * @return _pathLength Length of the final path\\n * @return _keyRemainder Portion of the key remaining after the walk.\\n * @return _isFinalNode Whether or not we've hit a dead end.\\n */\\n function _walkNodePath(\\n TrieNode[] memory _proof,\\n bytes memory _key,\\n bytes32 _root\\n )\\n private\\n pure\\n returns (\\n uint256 _pathLength,\\n bytes memory _keyRemainder,\\n bool _isFinalNode\\n )\\n {\\n uint256 pathLength = 0;\\n bytes memory key = Lib_BytesUtils.toNibbles(_key);\\n\\n bytes32 currentNodeID = _root;\\n uint256 currentKeyIndex = 0;\\n uint256 currentKeyIncrement = 0;\\n TrieNode memory currentNode;\\n\\n // Proof is top-down, so we start at the first element (root).\\n for (uint256 i = 0; i < _proof.length; i++) {\\n currentNode = _proof[i];\\n currentKeyIndex += currentKeyIncrement;\\n\\n // Keep track of the proof elements we actually need.\\n // It's expensive to resize arrays, so this simply reduces gas costs.\\n pathLength += 1;\\n\\n if (currentKeyIndex == 0) {\\n // First proof element is always the root node.\\n require(\\n keccak256(currentNode.encoded) == currentNodeID,\\n \\\"Invalid root hash\\\"\\n );\\n } else if (currentNode.encoded.length >= 32) {\\n // Nodes 32 bytes or larger are hashed inside branch nodes.\\n require(\\n keccak256(currentNode.encoded) == currentNodeID,\\n \\\"Invalid large internal hash\\\"\\n );\\n } else {\\n // Nodes smaller than 31 bytes aren't hashed.\\n require(\\n Lib_BytesUtils.toBytes32(currentNode.encoded) == currentNodeID,\\n \\\"Invalid internal node hash\\\"\\n );\\n }\\n\\n if (currentNode.decoded.length == BRANCH_NODE_LENGTH) {\\n if (currentKeyIndex == key.length) {\\n // We've hit the end of the key, meaning the value should be within this branch node.\\n break;\\n } else {\\n // We're not at the end of the key yet.\\n // Figure out what the next node ID should be and continue.\\n uint8 branchKey = uint8(key[currentKeyIndex]);\\n Lib_RLPReader.RLPItem memory nextNode = currentNode.decoded[branchKey];\\n currentNodeID = _getNodeID(nextNode);\\n currentKeyIncrement = 1;\\n continue;\\n }\\n } else if (currentNode.decoded.length == LEAF_OR_EXTENSION_NODE_LENGTH) {\\n bytes memory path = _getNodePath(currentNode);\\n uint8 prefix = uint8(path[0]);\\n uint8 offset = 2 - prefix % 2;\\n bytes memory pathRemainder = Lib_BytesUtils.slice(path, offset);\\n bytes memory keyRemainder = Lib_BytesUtils.slice(key, currentKeyIndex);\\n uint256 sharedNibbleLength = _getSharedNibbleLength(pathRemainder, keyRemainder);\\n\\n if (prefix == PREFIX_LEAF_EVEN || prefix == PREFIX_LEAF_ODD) {\\n if (\\n pathRemainder.length == sharedNibbleLength &&\\n keyRemainder.length == sharedNibbleLength\\n ) {\\n // The key within this leaf matches our key exactly.\\n // Increment the key index to reflect that we have no remainder.\\n currentKeyIndex += sharedNibbleLength;\\n }\\n\\n // We've hit a leaf node, so our next node should be NULL.\\n currentNodeID = bytes32(RLP_NULL);\\n break;\\n } else if (prefix == PREFIX_EXTENSION_EVEN || prefix == PREFIX_EXTENSION_ODD) {\\n if (sharedNibbleLength == 0) {\\n // Our extension node doesn't share any part of our key.\\n // We've hit the end of this path, updates will need to modify this extension.\\n currentNodeID = bytes32(RLP_NULL);\\n break;\\n } else {\\n // Our extension shares some nibbles.\\n // Carry on to the next node.\\n currentNodeID = _getNodeID(currentNode.decoded[1]);\\n currentKeyIncrement = sharedNibbleLength;\\n continue;\\n }\\n } else {\\n revert(\\\"Received a node with an unknown prefix\\\");\\n }\\n } else {\\n revert(\\\"Received an unparseable node.\\\");\\n }\\n }\\n\\n // If our node ID is NULL, then we're at a dead end.\\n bool isFinalNode = currentNodeID == bytes32(RLP_NULL);\\n return (pathLength, Lib_BytesUtils.slice(key, currentKeyIndex), isFinalNode);\\n }\\n\\n /**\\n * @notice Creates new nodes to support a k/v pair insertion into a given\\n * Merkle trie path.\\n * @param _path Path to the node nearest the k/v pair.\\n * @param _pathLength Length of the path. Necessary because the provided\\n * path may include additional nodes (e.g., it comes directly from a proof)\\n * and we can't resize in-memory arrays without costly duplication.\\n * @param _keyRemainder Portion of the initial key that must be inserted\\n * into the trie.\\n * @param _value Value to insert at the given key.\\n * @return _newPath A new path with the inserted k/v pair and extra supporting nodes.\\n */\\n function _getNewPath(\\n TrieNode[] memory _path,\\n uint256 _pathLength,\\n bytes memory _keyRemainder,\\n bytes memory _value\\n )\\n private\\n pure\\n returns (\\n TrieNode[] memory _newPath\\n )\\n {\\n bytes memory keyRemainder = _keyRemainder;\\n\\n // Most of our logic depends on the status of the last node in the path.\\n TrieNode memory lastNode = _path[_pathLength - 1];\\n NodeType lastNodeType = _getNodeType(lastNode);\\n\\n // Create an array for newly created nodes.\\n // We need up to three new nodes, depending on the contents of the last node.\\n // Since array resizing is expensive, we'll keep track of the size manually.\\n // We're using an explicit `totalNewNodes += 1` after insertions for clarity.\\n TrieNode[] memory newNodes = new TrieNode[](3);\\n uint256 totalNewNodes = 0;\\n\\n if (keyRemainder.length == 0 && lastNodeType == NodeType.LeafNode) {\\n // We've found a leaf node with the given key.\\n // Simply need to update the value of the node to match.\\n newNodes[totalNewNodes] = _makeLeafNode(_getNodeKey(lastNode), _value);\\n totalNewNodes += 1;\\n } else if (lastNodeType == NodeType.BranchNode) {\\n if (keyRemainder.length == 0) {\\n // We've found a branch node with the given key.\\n // Simply need to update the value of the node to match.\\n newNodes[totalNewNodes] = _editBranchValue(lastNode, _value);\\n totalNewNodes += 1;\\n } else {\\n // We've found a branch node, but it doesn't contain our key.\\n // Reinsert the old branch for now.\\n newNodes[totalNewNodes] = lastNode;\\n totalNewNodes += 1;\\n // Create a new leaf node, slicing our remainder since the first byte points\\n // to our branch node.\\n newNodes[totalNewNodes] = _makeLeafNode(Lib_BytesUtils.slice(keyRemainder, 1), _value);\\n totalNewNodes += 1;\\n }\\n } else {\\n // Our last node is either an extension node or a leaf node with a different key.\\n bytes memory lastNodeKey = _getNodeKey(lastNode);\\n uint256 sharedNibbleLength = _getSharedNibbleLength(lastNodeKey, keyRemainder);\\n\\n if (sharedNibbleLength != 0) {\\n // We've got some shared nibbles between the last node and our key remainder.\\n // We'll need to insert an extension node that covers these shared nibbles.\\n bytes memory nextNodeKey = Lib_BytesUtils.slice(lastNodeKey, 0, sharedNibbleLength);\\n newNodes[totalNewNodes] = _makeExtensionNode(nextNodeKey, _getNodeHash(_value));\\n totalNewNodes += 1;\\n\\n // Cut down the keys since we've just covered these shared nibbles.\\n lastNodeKey = Lib_BytesUtils.slice(lastNodeKey, sharedNibbleLength);\\n keyRemainder = Lib_BytesUtils.slice(keyRemainder, sharedNibbleLength);\\n }\\n\\n // Create an empty branch to fill in.\\n TrieNode memory newBranch = _makeEmptyBranchNode();\\n\\n if (lastNodeKey.length == 0) {\\n // Key remainder was larger than the key for our last node.\\n // The value within our last node is therefore going to be shifted into\\n // a branch value slot.\\n newBranch = _editBranchValue(newBranch, _getNodeValue(lastNode));\\n } else {\\n // Last node key was larger than the key remainder.\\n // We're going to modify some index of our branch.\\n uint8 branchKey = uint8(lastNodeKey[0]);\\n // Move on to the next nibble.\\n lastNodeKey = Lib_BytesUtils.slice(lastNodeKey, 1);\\n\\n if (lastNodeType == NodeType.LeafNode) {\\n // We're dealing with a leaf node.\\n // We'll modify the key and insert the old leaf node into the branch index.\\n TrieNode memory modifiedLastNode = _makeLeafNode(lastNodeKey, _getNodeValue(lastNode));\\n newBranch = _editBranchIndex(newBranch, branchKey, _getNodeHash(modifiedLastNode.encoded));\\n } else if (lastNodeKey.length != 0) {\\n // We're dealing with a shrinking extension node.\\n // We need to modify the node to decrease the size of the key.\\n TrieNode memory modifiedLastNode = _makeExtensionNode(lastNodeKey, _getNodeValue(lastNode));\\n newBranch = _editBranchIndex(newBranch, branchKey, _getNodeHash(modifiedLastNode.encoded));\\n } else {\\n // We're dealing with an unnecessary extension node.\\n // We're going to delete the node entirely.\\n // Simply insert its current value into the branch index.\\n newBranch = _editBranchIndex(newBranch, branchKey, _getNodeValue(lastNode));\\n }\\n }\\n\\n if (keyRemainder.length == 0) {\\n // We've got nothing left in the key remainder.\\n // Simply insert the value into the branch value slot.\\n newBranch = _editBranchValue(newBranch, _value);\\n // Push the branch into the list of new nodes.\\n newNodes[totalNewNodes] = newBranch;\\n totalNewNodes += 1;\\n } else {\\n // We've got some key remainder to work with.\\n // We'll be inserting a leaf node into the trie.\\n // First, move on to the next nibble.\\n keyRemainder = Lib_BytesUtils.slice(keyRemainder, 1);\\n // Push the branch into the list of new nodes.\\n newNodes[totalNewNodes] = newBranch;\\n totalNewNodes += 1;\\n // Push a new leaf node for our k/v pair.\\n newNodes[totalNewNodes] = _makeLeafNode(keyRemainder, _value);\\n totalNewNodes += 1;\\n }\\n }\\n\\n // Finally, join the old path with our newly created nodes.\\n // Since we're overwriting the last node in the path, we use `_pathLength - 1`.\\n return _joinNodeArrays(_path, _pathLength - 1, newNodes, totalNewNodes);\\n }\\n\\n /**\\n * @notice Computes the trie root from a given path.\\n * @param _nodes Path to some k/v pair.\\n * @param _key Key for the k/v pair.\\n * @return _updatedRoot Root hash for the updated trie.\\n */\\n function _getUpdatedTrieRoot(\\n TrieNode[] memory _nodes,\\n bytes memory _key\\n )\\n private\\n pure\\n returns (\\n bytes32 _updatedRoot\\n )\\n {\\n bytes memory key = Lib_BytesUtils.toNibbles(_key);\\n\\n // Some variables to keep track of during iteration.\\n TrieNode memory currentNode;\\n NodeType currentNodeType;\\n bytes memory previousNodeHash;\\n\\n // Run through the path backwards to rebuild our root hash.\\n for (uint256 i = _nodes.length; i > 0; i--) {\\n // Pick out the current node.\\n currentNode = _nodes[i - 1];\\n currentNodeType = _getNodeType(currentNode);\\n\\n if (currentNodeType == NodeType.LeafNode) {\\n // Leaf nodes are already correctly encoded.\\n // Shift the key over to account for the nodes key.\\n bytes memory nodeKey = _getNodeKey(currentNode);\\n key = Lib_BytesUtils.slice(key, 0, key.length - nodeKey.length);\\n } else if (currentNodeType == NodeType.ExtensionNode) {\\n // Shift the key over to account for the nodes key.\\n bytes memory nodeKey = _getNodeKey(currentNode);\\n key = Lib_BytesUtils.slice(key, 0, key.length - nodeKey.length);\\n\\n // If this node is the last element in the path, it'll be correctly encoded\\n // and we can skip this part.\\n if (previousNodeHash.length > 0) {\\n // Re-encode the node based on the previous node.\\n currentNode = _makeExtensionNode(nodeKey, previousNodeHash);\\n }\\n } else if (currentNodeType == NodeType.BranchNode) {\\n // If this node is the last element in the path, it'll be correctly encoded\\n // and we can skip this part.\\n if (previousNodeHash.length > 0) {\\n // Re-encode the node based on the previous node.\\n uint8 branchKey = uint8(key[key.length - 1]);\\n key = Lib_BytesUtils.slice(key, 0, key.length - 1);\\n currentNode = _editBranchIndex(currentNode, branchKey, previousNodeHash);\\n }\\n }\\n\\n // Compute the node hash for the next iteration.\\n previousNodeHash = _getNodeHash(currentNode.encoded);\\n }\\n\\n // Current node should be the root at this point.\\n // Simply return the hash of its encoding.\\n return keccak256(currentNode.encoded);\\n }\\n\\n /**\\n * @notice Parses an RLP-encoded proof into something more useful.\\n * @param _proof RLP-encoded proof to parse.\\n * @return _parsed Proof parsed into easily accessible structs.\\n */\\n function _parseProof(\\n bytes memory _proof\\n )\\n private\\n pure\\n returns (\\n TrieNode[] memory _parsed\\n )\\n {\\n Lib_RLPReader.RLPItem[] memory nodes = Lib_RLPReader.readList(_proof);\\n TrieNode[] memory proof = new TrieNode[](nodes.length);\\n\\n for (uint256 i = 0; i < nodes.length; i++) {\\n bytes memory encoded = Lib_RLPReader.readBytes(nodes[i]);\\n proof[i] = TrieNode({\\n encoded: encoded,\\n decoded: Lib_RLPReader.readList(encoded)\\n });\\n }\\n\\n return proof;\\n }\\n\\n /**\\n * @notice Picks out the ID for a node. Node ID is referred to as the\\n * \\\"hash\\\" within the specification, but nodes < 32 bytes are not actually\\n * hashed.\\n * @param _node Node to pull an ID for.\\n * @return _nodeID ID for the node, depending on the size of its contents.\\n */\\n function _getNodeID(\\n Lib_RLPReader.RLPItem memory _node\\n )\\n private\\n pure\\n returns (\\n bytes32 _nodeID\\n )\\n {\\n bytes memory nodeID;\\n\\n if (_node.length < 32) {\\n // Nodes smaller than 32 bytes are RLP encoded.\\n nodeID = Lib_RLPReader.readRawBytes(_node);\\n } else {\\n // Nodes 32 bytes or larger are hashed.\\n nodeID = Lib_RLPReader.readBytes(_node);\\n }\\n\\n return Lib_BytesUtils.toBytes32(nodeID);\\n }\\n\\n /**\\n * @notice Gets the path for a leaf or extension node.\\n * @param _node Node to get a path for.\\n * @return _path Node path, converted to an array of nibbles.\\n */\\n function _getNodePath(\\n TrieNode memory _node\\n )\\n private\\n pure\\n returns (\\n bytes memory _path\\n )\\n {\\n return Lib_BytesUtils.toNibbles(Lib_RLPReader.readBytes(_node.decoded[0]));\\n }\\n\\n /**\\n * @notice Gets the key for a leaf or extension node. Keys are essentially\\n * just paths without any prefix.\\n * @param _node Node to get a key for.\\n * @return _key Node key, converted to an array of nibbles.\\n */\\n function _getNodeKey(\\n TrieNode memory _node\\n )\\n private\\n pure\\n returns (\\n bytes memory _key\\n )\\n {\\n return _removeHexPrefix(_getNodePath(_node));\\n }\\n\\n /**\\n * @notice Gets the path for a node.\\n * @param _node Node to get a value for.\\n * @return _value Node value, as hex bytes.\\n */\\n function _getNodeValue(\\n TrieNode memory _node\\n )\\n private\\n pure\\n returns (\\n bytes memory _value\\n )\\n {\\n return Lib_RLPReader.readBytes(_node.decoded[_node.decoded.length - 1]);\\n }\\n\\n /**\\n * @notice Computes the node hash for an encoded node. Nodes < 32 bytes\\n * are not hashed, all others are keccak256 hashed.\\n * @param _encoded Encoded node to hash.\\n * @return _hash Hash of the encoded node. Simply the input if < 32 bytes.\\n */\\n function _getNodeHash(\\n bytes memory _encoded\\n )\\n private\\n pure\\n returns (\\n bytes memory _hash\\n )\\n {\\n if (_encoded.length < 32) {\\n return _encoded;\\n } else {\\n return abi.encodePacked(keccak256(_encoded));\\n }\\n }\\n\\n /**\\n * @notice Determines the type for a given node.\\n * @param _node Node to determine a type for.\\n * @return _type Type of the node; BranchNode/ExtensionNode/LeafNode.\\n */\\n function _getNodeType(\\n TrieNode memory _node\\n )\\n private\\n pure\\n returns (\\n NodeType _type\\n )\\n {\\n if (_node.decoded.length == BRANCH_NODE_LENGTH) {\\n return NodeType.BranchNode;\\n } else if (_node.decoded.length == LEAF_OR_EXTENSION_NODE_LENGTH) {\\n bytes memory path = _getNodePath(_node);\\n uint8 prefix = uint8(path[0]);\\n\\n if (prefix == PREFIX_LEAF_EVEN || prefix == PREFIX_LEAF_ODD) {\\n return NodeType.LeafNode;\\n } else if (prefix == PREFIX_EXTENSION_EVEN || prefix == PREFIX_EXTENSION_ODD) {\\n return NodeType.ExtensionNode;\\n }\\n }\\n\\n revert(\\\"Invalid node type\\\");\\n }\\n\\n /**\\n * @notice Utility; determines the number of nibbles shared between two\\n * nibble arrays.\\n * @param _a First nibble array.\\n * @param _b Second nibble array.\\n * @return _shared Number of shared nibbles.\\n */\\n function _getSharedNibbleLength(\\n bytes memory _a,\\n bytes memory _b\\n )\\n private\\n pure\\n returns (\\n uint256 _shared\\n )\\n {\\n uint256 i = 0;\\n while (_a.length > i && _b.length > i && _a[i] == _b[i]) {\\n i++;\\n }\\n return i;\\n }\\n\\n /**\\n * @notice Utility; converts an RLP-encoded node into our nice struct.\\n * @param _raw RLP-encoded node to convert.\\n * @return _node Node as a TrieNode struct.\\n */\\n function _makeNode(\\n bytes[] memory _raw\\n )\\n private\\n pure\\n returns (\\n TrieNode memory _node\\n )\\n {\\n bytes memory encoded = Lib_RLPWriter.writeList(_raw);\\n\\n return TrieNode({\\n encoded: encoded,\\n decoded: Lib_RLPReader.readList(encoded)\\n });\\n }\\n\\n /**\\n * @notice Utility; converts an RLP-decoded node into our nice struct.\\n * @param _items RLP-decoded node to convert.\\n * @return _node Node as a TrieNode struct.\\n */\\n function _makeNode(\\n Lib_RLPReader.RLPItem[] memory _items\\n )\\n private\\n pure\\n returns (\\n TrieNode memory _node\\n )\\n {\\n bytes[] memory raw = new bytes[](_items.length);\\n for (uint256 i = 0; i < _items.length; i++) {\\n raw[i] = Lib_RLPReader.readRawBytes(_items[i]);\\n }\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Creates a new extension node.\\n * @param _key Key for the extension node, unprefixed.\\n * @param _value Value for the extension node.\\n * @return _node New extension node with the given k/v pair.\\n */\\n function _makeExtensionNode(\\n bytes memory _key,\\n bytes memory _value\\n )\\n private\\n pure\\n returns (\\n TrieNode memory _node\\n )\\n {\\n bytes[] memory raw = new bytes[](2);\\n bytes memory key = _addHexPrefix(_key, false);\\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\\n raw[1] = Lib_RLPWriter.writeBytes(_value);\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Creates a new leaf node.\\n * @dev This function is essentially identical to `_makeExtensionNode`.\\n * Although we could route both to a single method with a flag, it's\\n * more gas efficient to keep them separate and duplicate the logic.\\n * @param _key Key for the leaf node, unprefixed.\\n * @param _value Value for the leaf node.\\n * @return _node New leaf node with the given k/v pair.\\n */\\n function _makeLeafNode(\\n bytes memory _key,\\n bytes memory _value\\n )\\n private\\n pure\\n returns (\\n TrieNode memory _node\\n )\\n {\\n bytes[] memory raw = new bytes[](2);\\n bytes memory key = _addHexPrefix(_key, true);\\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\\n raw[1] = Lib_RLPWriter.writeBytes(_value);\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Creates an empty branch node.\\n * @return _node Empty branch node as a TrieNode struct.\\n */\\n function _makeEmptyBranchNode()\\n private\\n pure\\n returns (\\n TrieNode memory _node\\n )\\n {\\n bytes[] memory raw = new bytes[](BRANCH_NODE_LENGTH);\\n for (uint256 i = 0; i < raw.length; i++) {\\n raw[i] = RLP_NULL_BYTES;\\n }\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Modifies the value slot for a given branch.\\n * @param _branch Branch node to modify.\\n * @param _value Value to insert into the branch.\\n * @return _updatedNode Modified branch node.\\n */\\n function _editBranchValue(\\n TrieNode memory _branch,\\n bytes memory _value\\n )\\n private\\n pure\\n returns (\\n TrieNode memory _updatedNode\\n )\\n {\\n bytes memory encoded = Lib_RLPWriter.writeBytes(_value);\\n _branch.decoded[_branch.decoded.length - 1] = Lib_RLPReader.toRLPItem(encoded);\\n return _makeNode(_branch.decoded);\\n }\\n\\n /**\\n * @notice Modifies a slot at an index for a given branch.\\n * @param _branch Branch node to modify.\\n * @param _index Slot index to modify.\\n * @param _value Value to insert into the slot.\\n * @return _updatedNode Modified branch node.\\n */\\n function _editBranchIndex(\\n TrieNode memory _branch,\\n uint8 _index,\\n bytes memory _value\\n )\\n private\\n pure\\n returns (\\n TrieNode memory _updatedNode\\n )\\n {\\n bytes memory encoded = _value.length < 32 ? _value : Lib_RLPWriter.writeBytes(_value);\\n _branch.decoded[_index] = Lib_RLPReader.toRLPItem(encoded);\\n return _makeNode(_branch.decoded);\\n }\\n\\n /**\\n * @notice Utility; adds a prefix to a key.\\n * @param _key Key to prefix.\\n * @param _isLeaf Whether or not the key belongs to a leaf.\\n * @return _prefixedKey Prefixed key.\\n */\\n function _addHexPrefix(\\n bytes memory _key,\\n bool _isLeaf\\n )\\n private\\n pure\\n returns (\\n bytes memory _prefixedKey\\n )\\n {\\n uint8 prefix = _isLeaf ? uint8(0x02) : uint8(0x00);\\n uint8 offset = uint8(_key.length % 2);\\n bytes memory prefixed = new bytes(2 - offset);\\n prefixed[0] = bytes1(prefix + offset);\\n return abi.encodePacked(prefixed, _key);\\n }\\n\\n /**\\n * @notice Utility; removes a prefix from a path.\\n * @param _path Path to remove the prefix from.\\n * @return _unprefixedKey Unprefixed key.\\n */\\n function _removeHexPrefix(\\n bytes memory _path\\n )\\n private\\n pure\\n returns (\\n bytes memory _unprefixedKey\\n )\\n {\\n if (uint8(_path[0]) % 2 == 0) {\\n return Lib_BytesUtils.slice(_path, 2);\\n } else {\\n return Lib_BytesUtils.slice(_path, 1);\\n }\\n }\\n\\n /**\\n * @notice Utility; combines two node arrays. Array lengths are required\\n * because the actual lengths may be longer than the filled lengths.\\n * Array resizing is extremely costly and should be avoided.\\n * @param _a First array to join.\\n * @param _aLength Length of the first array.\\n * @param _b Second array to join.\\n * @param _bLength Length of the second array.\\n * @return _joined Combined node array.\\n */\\n function _joinNodeArrays(\\n TrieNode[] memory _a,\\n uint256 _aLength,\\n TrieNode[] memory _b,\\n uint256 _bLength\\n )\\n private\\n pure\\n returns (\\n TrieNode[] memory _joined\\n )\\n {\\n TrieNode[] memory ret = new TrieNode[](_aLength + _bLength);\\n\\n // Copy elements from the first array.\\n for (uint256 i = 0; i < _aLength; i++) {\\n ret[i] = _a[i];\\n }\\n\\n // Copy elements from the second array.\\n for (uint256 i = 0; i < _bLength; i++) {\\n ret[i + _aLength] = _b[i];\\n }\\n\\n return ret;\\n }\\n}\\n\",\"keccak256\":\"0x161f65220b8c5cf295232f8c58c2744fbc898bf77da5f9d9c5b2dd673dafc6f6\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/trie/Lib_SecureMerkleTrie.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_MerkleTrie } from \\\"./Lib_MerkleTrie.sol\\\";\\n\\n/**\\n * @title Lib_SecureMerkleTrie\\n */\\nlibrary Lib_SecureMerkleTrie {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * @notice Verifies a proof that a given key/value pair is present in the\\n * Merkle trie.\\n * @param _key Key of the node to search for, as a hex string.\\n * @param _value Value of the node to search for, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the desired node. Unlike\\n * traditional Merkle trees, this proof is executed top-down and consists\\n * of a list of RLP-encoded nodes that make a path down to the target node.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _verified `true` if the k/v pair exists in the trie, `false` otherwise.\\n */\\n function verifyInclusionProof(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bool _verified\\n )\\n {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.verifyInclusionProof(key, _value, _proof, _root);\\n }\\n\\n /**\\n * @notice Verifies a proof that a given key is *not* present in\\n * the Merkle trie.\\n * @param _key Key of the node to search for, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\\n * target node.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _verified `true` if the key is not present in the trie, `false` otherwise.\\n */\\n function verifyExclusionProof(\\n bytes memory _key,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bool _verified\\n )\\n {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.verifyExclusionProof(key, _proof, _root);\\n }\\n\\n /**\\n * @notice Updates a Merkle trie and returns a new root hash.\\n * @param _key Key of the node to update, as a hex string.\\n * @param _value Value of the node to update, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\\n * target node. If the key exists, we can simply update the value.\\n * Otherwise, we need to modify the trie to handle the new k/v pair.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _updatedRoot Root hash of the newly constructed trie.\\n */\\n function update(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bytes32 _updatedRoot\\n )\\n {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.update(key, _value, _proof, _root);\\n }\\n\\n /**\\n * @notice Retrieves the value associated with a given key.\\n * @param _key Key to search for, as hex bytes.\\n * @param _proof Merkle trie inclusion proof for the key.\\n * @param _root Known root of the Merkle trie.\\n * @return _exists Whether or not the key exists.\\n * @return _value Value of the key if it exists.\\n */\\n function get(\\n bytes memory _key,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bool _exists,\\n bytes memory _value\\n )\\n {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.get(key, _proof, _root);\\n }\\n\\n /**\\n * Computes the root hash for a trie with a single node.\\n * @param _key Key for the single node.\\n * @param _value Value for the single node.\\n * @return _updatedRoot Hash of the trie.\\n */\\n function getSingleNodeRootHash(\\n bytes memory _key,\\n bytes memory _value\\n )\\n internal\\n pure\\n returns (\\n bytes32 _updatedRoot\\n )\\n {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.getSingleNodeRootHash(key, _value);\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Computes the secure counterpart to a key.\\n * @param _key Key to get a secure key from.\\n * @return _secureKey Secure version of the key.\\n */\\n function _getSecureKey(\\n bytes memory _key\\n )\\n private\\n pure\\n returns (\\n bytes memory _secureKey\\n )\\n {\\n return abi.encodePacked(keccak256(_key));\\n }\\n}\",\"keccak256\":\"0x79355346f74bb1eb9eeb733cb5d9677d50115c4f390307cbf608fe071a1ada0c\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_Bytes32Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_Byte32Utils\\n */\\nlibrary Lib_Bytes32Utils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \\\"true.\\\"\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as a boolean.\\n */\\n function toBool(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return _in != 0;\\n }\\n\\n /**\\n * Converts a boolean to a bytes32 value.\\n * @param _in Input boolean value.\\n * @return Boolean as a bytes32.\\n */\\n function fromBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in ? 1 : 0));\\n }\\n\\n /**\\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as an address.\\n */\\n function toAddress(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return address(uint160(uint256(_in)));\\n }\\n\\n /**\\n * Converts an address to a bytes32.\\n * @param _in Input address value.\\n * @return Address as a bytes32.\\n */\\n function fromAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in));\\n }\\n\\n /**\\n * Removes the leading zeros from a bytes32 value and returns a new (smaller) bytes value.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 without any leading zeros.\\n */\\n function removeLeadingZeros(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out;\\n\\n assembly {\\n // Figure out how many leading zero bytes to remove.\\n let shift := 0\\n for { let i := 0 } and(lt(i, 32), eq(byte(i, _in), 0)) { i := add(i, 1) } {\\n shift := add(shift, 1)\\n }\\n\\n // Reserve some space for our output and fix the free memory pointer.\\n out := mload(0x40)\\n mstore(0x40, add(out, 0x40))\\n\\n // Shift the value and store it into the output bytes.\\n mstore(add(out, 0x20), shl(mul(shift, 8), _in))\\n\\n // Store the new size (with leading zero bytes removed) in the output byte size.\\n mstore(out, sub(32, shift))\\n }\\n\\n return out;\\n }\\n}\\n\",\"keccak256\":\"0xfa2def593e3fc56a31852c3744aefdaa93cec74e721bfcfeb1e5d166c7c60b64\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_BytesUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_BytesUtils\\n */\\nlibrary Lib_BytesUtils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_start + _length >= _start, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n if (_bytes.length - _start == 0) {\\n return bytes('');\\n }\\n\\n return slice(_bytes, _start, _bytes.length - _start);\\n }\\n\\n function toBytes32PadLeft(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes32)\\n {\\n bytes32 ret;\\n uint256 len = _bytes.length <= 32 ? _bytes.length : 32;\\n assembly {\\n ret := shr(mul(sub(32, len), 8), mload(add(_bytes, 32)))\\n }\\n return ret;\\n }\\n\\n function toBytes32(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes32)\\n {\\n if (_bytes.length < 32) {\\n bytes32 ret;\\n assembly {\\n ret := mload(add(_bytes, 32))\\n }\\n return ret;\\n }\\n\\n return abi.decode(_bytes,(bytes32)); // will truncate if input length > 32 bytes\\n }\\n\\n function toUint256(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (uint256)\\n {\\n return uint256(toBytes32(_bytes));\\n }\\n\\n function toUint24(bytes memory _bytes, uint256 _start) internal pure returns (uint24) {\\n require(_start + 3 >= _start, \\\"toUint24_overflow\\\");\\n require(_bytes.length >= _start + 3 , \\\"toUint24_outOfBounds\\\");\\n uint24 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x3), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toUint8(bytes memory _bytes, uint256 _start) internal pure returns (uint8) {\\n require(_start + 1 >= _start, \\\"toUint8_overflow\\\");\\n require(_bytes.length >= _start + 1 , \\\"toUint8_outOfBounds\\\");\\n uint8 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x1), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toAddress(bytes memory _bytes, uint256 _start) internal pure returns (address) {\\n require(_start + 20 >= _start, \\\"toAddress_overflow\\\");\\n require(_bytes.length >= _start + 20, \\\"toAddress_outOfBounds\\\");\\n address tempAddress;\\n\\n assembly {\\n tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000)\\n }\\n\\n return tempAddress;\\n }\\n\\n function toNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n bytes memory nibbles = new bytes(_bytes.length * 2);\\n\\n for (uint256 i = 0; i < _bytes.length; i++) {\\n nibbles[i * 2] = _bytes[i] >> 4;\\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\\n }\\n\\n return nibbles;\\n }\\n\\n function fromNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n bytes memory ret = new bytes(_bytes.length / 2);\\n\\n for (uint256 i = 0; i < ret.length; i++) {\\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\\n }\\n\\n return ret;\\n }\\n\\n function equal(\\n bytes memory _bytes,\\n bytes memory _other\\n )\\n internal\\n pure\\n returns (bool)\\n {\\n return keccak256(_bytes) == keccak256(_other);\\n }\\n}\\n\",\"keccak256\":\"0x0adf22e1b22ba09911e859f64cb3b484e992be4f9fd3b09088e6225bf8d06ce0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_ErrorUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/**\\n * @title Lib_ErrorUtils\\n */\\nlibrary Lib_ErrorUtils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Encodes an error string into raw solidity-style revert data.\\n * (i.e. ascii bytes, prefixed with bytes4(keccak(\\\"Error(string))\\\"))\\n * Ref: https://docs.soliditylang.org/en/v0.8.2/control-structures.html?highlight=Error(string)#panic-via-assert-and-error-via-require\\n * @param _reason Reason for the reversion.\\n * @return Standard solidity revert data for the given reason.\\n */\\n function encodeRevertString(\\n string memory _reason\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return abi.encodeWithSignature(\\n \\\"Error(string)\\\",\\n _reason\\n );\\n }\\n}\\n\",\"keccak256\":\"0xfc64ec4a81fb50865b502a0004ed154e8598e1a313db77303fc95e41f536e6b7\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_ReentrancyGuard.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @dev Contract module that helps prevent reentrant calls to a function.\\n *\\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\\n * available, which can be applied to functions to make sure there are no nested\\n * (reentrant) calls to them.\\n *\\n * Note that because there is a single `nonReentrant` guard, functions marked as\\n * `nonReentrant` may not call one another. This can be worked around by making\\n * those functions `private`, and then adding `external` `nonReentrant` entry\\n * points to them.\\n *\\n * TIP: If you would like to learn more about reentrancy and alternative ways\\n * to protect against it, check out our blog post\\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\\n */\\nabstract contract Lib_ReentrancyGuard {\\n // Booleans are more expensive than uint256 or any type that takes up a full\\n // word because each write operation emits an extra SLOAD to first read the\\n // slot's contents, replace the bits taken up by the boolean, and then write\\n // back. This is the compiler's defense against contract upgrades and\\n // pointer aliasing, and it cannot be disabled.\\n\\n // The values being non-zero value makes deployment a bit more expensive,\\n // but in exchange the refund on every call to nonReentrant will be lower in\\n // amount. Since refunds are capped to a percentage of the total\\n // transaction's gas, it is best to keep them low in cases like this one, to\\n // increase the likelihood of the full refund coming into effect.\\n uint256 private constant _NOT_ENTERED = 1;\\n uint256 private constant _ENTERED = 2;\\n\\n uint256 private _status;\\n\\n constructor () {\\n _status = _NOT_ENTERED;\\n }\\n\\n /**\\n * @dev Prevents a contract from calling itself, directly or indirectly.\\n * Calling a `nonReentrant` function from another `nonReentrant`\\n * function is not supported. It is possible to prevent this from happening\\n * by making the `nonReentrant` function external, and make it call a\\n * `private` function that does the actual work.\\n */\\n modifier nonReentrant() {\\n // On the first call to nonReentrant, _notEntered will be true\\n require(_status != _ENTERED, \\\"ReentrancyGuard: reentrant call\\\");\\n\\n // Any calls to nonReentrant after this point will fail\\n _status = _ENTERED;\\n\\n _;\\n\\n // By storing the original value once again, a refund is triggered (see\\n // https://eips.ethereum.org/EIPS/eip-2200)\\n _status = _NOT_ENTERED;\\n }\\n}\\n\",\"keccak256\":\"0x4e1727687288cb1db2a4df3b056626f1bf0513520c3651667b1762f579c4ca7f\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_ErrorUtils } from \\\"../utils/Lib_ErrorUtils.sol\\\";\\n\\n/**\\n * @title Lib_SafeExecutionManagerWrapper\\n * @dev The Safe Execution Manager Wrapper provides functions which facilitate writing OVM safe \\n * code using the standard solidity compiler, by routing all its operations through the Execution \\n * Manager.\\n * \\n * Compiler used: solc\\n * Runtime target: OVM\\n */\\nlibrary Lib_SafeExecutionManagerWrapper {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Performs a safe ovmCALL.\\n * @param _gasLimit Gas limit for the call.\\n * @param _target Address to call.\\n * @param _calldata Data to send to the call.\\n * @return _success Whether or not the call reverted.\\n * @return _returndata Data returned by the call.\\n */\\n function safeCALL(\\n uint256 _gasLimit,\\n address _target,\\n bytes memory _calldata\\n )\\n internal\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCALL(uint256,address,bytes)\\\",\\n _gasLimit,\\n _target,\\n _calldata\\n )\\n );\\n\\n return abi.decode(returndata, (bool, bytes));\\n }\\n\\n /**\\n * Performs a safe ovmDELEGATECALL.\\n * @param _gasLimit Gas limit for the call.\\n * @param _target Address to call.\\n * @param _calldata Data to send to the call.\\n * @return _success Whether or not the call reverted.\\n * @return _returndata Data returned by the call.\\n */\\n function safeDELEGATECALL(\\n uint256 _gasLimit,\\n address _target,\\n bytes memory _calldata\\n )\\n internal\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmDELEGATECALL(uint256,address,bytes)\\\",\\n _gasLimit,\\n _target,\\n _calldata\\n )\\n );\\n\\n return abi.decode(returndata, (bool, bytes));\\n }\\n\\n /**\\n * Performs a safe ovmCREATE call.\\n * @param _gasLimit Gas limit for the creation.\\n * @param _bytecode Code for the new contract.\\n * @return _contract Address of the created contract.\\n */\\n function safeCREATE(\\n uint256 _gasLimit,\\n bytes memory _bytecode\\n )\\n internal\\n returns (\\n address,\\n bytes memory\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n _gasLimit,\\n abi.encodeWithSignature(\\n \\\"ovmCREATE(bytes)\\\",\\n _bytecode\\n )\\n );\\n\\n return abi.decode(returndata, (address, bytes));\\n }\\n\\n /**\\n * Performs a safe ovmEXTCODESIZE call.\\n * @param _contract Address of the contract to query the size of.\\n * @return _EXTCODESIZE Size of the requested contract in bytes.\\n */\\n function safeEXTCODESIZE(\\n address _contract\\n )\\n internal\\n returns (\\n uint256 _EXTCODESIZE\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmEXTCODESIZE(address)\\\",\\n _contract\\n )\\n );\\n\\n return abi.decode(returndata, (uint256));\\n }\\n\\n /**\\n * Performs a safe ovmCHAINID call.\\n * @return _CHAINID Result of calling ovmCHAINID.\\n */\\n function safeCHAINID()\\n internal\\n returns (\\n uint256 _CHAINID\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCHAINID()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (uint256));\\n }\\n\\n /**\\n * Performs a safe ovmCALLER call.\\n * @return _CALLER Result of calling ovmCALLER.\\n */\\n function safeCALLER()\\n internal\\n returns (\\n address _CALLER\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCALLER()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (address));\\n }\\n\\n /**\\n * Performs a safe ovmADDRESS call.\\n * @return _ADDRESS Result of calling ovmADDRESS.\\n */\\n function safeADDRESS()\\n internal\\n returns (\\n address _ADDRESS\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmADDRESS()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (address));\\n }\\n\\n /**\\n * Performs a safe ovmGETNONCE call.\\n * @return _nonce Result of calling ovmGETNONCE.\\n */\\n function safeGETNONCE()\\n internal\\n returns (\\n uint256 _nonce\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmGETNONCE()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (uint256));\\n }\\n\\n /**\\n * Performs a safe ovmINCREMENTNONCE call.\\n */\\n function safeINCREMENTNONCE()\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmINCREMENTNONCE()\\\"\\n )\\n );\\n }\\n\\n /**\\n * Performs a safe ovmCREATEEOA call.\\n * @param _messageHash Message hash which was signed by EOA\\n * @param _v v value of signature (0 or 1)\\n * @param _r r value of signature\\n * @param _s s value of signature\\n */\\n function safeCREATEEOA(\\n bytes32 _messageHash,\\n uint8 _v,\\n bytes32 _r,\\n bytes32 _s\\n )\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCREATEEOA(bytes32,uint8,bytes32,bytes32)\\\",\\n _messageHash,\\n _v,\\n _r,\\n _s\\n )\\n );\\n }\\n\\n /**\\n * Performs a safe REVERT.\\n * @param _reason String revert reason to pass along with the REVERT.\\n */\\n function safeREVERT(\\n string memory _reason\\n )\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmREVERT(bytes)\\\",\\n Lib_ErrorUtils.encodeRevertString(\\n _reason\\n )\\n )\\n );\\n }\\n\\n /**\\n * Performs a safe \\\"require\\\".\\n * @param _condition Boolean condition that must be true or will revert.\\n * @param _reason String revert reason to pass along with the REVERT.\\n */\\n function safeREQUIRE(\\n bool _condition,\\n string memory _reason\\n )\\n internal\\n {\\n if (!_condition) {\\n safeREVERT(\\n _reason\\n );\\n }\\n }\\n\\n /**\\n * Performs a safe ovmSLOAD call.\\n */\\n function safeSLOAD(\\n bytes32 _key\\n )\\n internal\\n returns (\\n bytes32\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmSLOAD(bytes32)\\\",\\n _key\\n )\\n );\\n\\n return abi.decode(returndata, (bytes32));\\n }\\n\\n /**\\n * Performs a safe ovmSSTORE call.\\n */\\n function safeSSTORE(\\n bytes32 _key,\\n bytes32 _value\\n )\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmSSTORE(bytes32,bytes32)\\\",\\n _key,\\n _value\\n )\\n );\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Performs an ovm interaction and the necessary safety checks.\\n * @param _gasLimit Gas limit for the interaction.\\n * @param _calldata Data to send to the OVM_ExecutionManager (encoded with sighash).\\n * @return _returndata Data sent back by the OVM_ExecutionManager.\\n */\\n function _safeExecutionManagerInteraction(\\n uint256 _gasLimit,\\n bytes memory _calldata\\n )\\n private\\n returns (\\n bytes memory _returndata\\n )\\n {\\n address ovmExecutionManager = msg.sender;\\n (\\n bool success,\\n bytes memory returndata\\n ) = ovmExecutionManager.call{gas: _gasLimit}(_calldata);\\n\\n if (success == false) {\\n assembly {\\n revert(add(returndata, 0x20), mload(returndata))\\n }\\n } else if (returndata.length == 1) {\\n assembly {\\n return(0, 1)\\n }\\n } else {\\n return returndata;\\n }\\n }\\n\\n function _safeExecutionManagerInteraction(\\n bytes memory _calldata\\n )\\n private\\n returns (\\n bytes memory _returndata\\n )\\n {\\n return _safeExecutionManagerInteraction(\\n gasleft(),\\n _calldata\\n );\\n }\\n}\\n\",\"keccak256\":\"0x41e146e7912af794a17cd43c5a276674be956bfa8f3ca5b451bcb82d81e6f492\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x6080604052600580546001600160a01b03191661dead17905534801561002457600080fd5b506001600055600680546001600160a01b0319169055612644806100496000396000f3fe608060405234801561001057600080fd5b50600436106100a95760003560e01c8063706ceab611610071578063706ceab61461011c57806382e3702d1461012f578063b1b1b20914610142578063c4d66de814610155578063d7fd19dd14610168578063ecc704281461017b576100a9565b806321d800ec146100ae578063299ca478146100d75780633dbb202b146100ec578063461a4478146101015780636e296e4514610114575b600080fd5b6100c16100bc3660046120ae565b610190565b6040516100ce91906122c4565b60405180910390f35b6100df6101a5565b6040516100ce919061224c565b6100ff6100fa366004612032565b6101b4565b005b6100df61010f3660046120c6565b610243565b6100df61031f565b6100ff61012a366004611fbb565b610368565b6100c161013d3660046120ae565b6103cf565b6100c16101503660046120ae565b6103e4565b6100ff610163366004611e72565b6103f9565b6100ff610176366004611e8c565b61044f565b6101836106d0565b6040516100ce9190612195565b60016020526000908152604090205460ff1681565b6006546001600160a01b031681565b60006101c48433856004546106d6565b60048054600190810190915581516020808401919091206000908152600390915260409020805460ff1916909117905590506102068163ffffffff8416610723565b7f0ee9ffdb2334d78de97ffb066b23a352a4d35180cefb36589d663fbb1eb6f326816040516102359190612346565b60405180910390a150505050565b60065460405163bf40fac160e01b81526020600482018181528451602484015284516000946001600160a01b03169363bf40fac1938793928392604401918501908083838b5b838110156102a1578181015183820152602001610289565b50505050905090810190601f1680156102ce5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b1580156102eb57600080fd5b505afa1580156102ff573d6000803e3d6000fd5b505050506040513d602081101561031557600080fd5b505190505b919050565b6005546000906001600160a01b031661dead14156103585760405162461bcd60e51b815260040161034f90612359565b60405180910390fd5b506005546001600160a01b031690565b6000610376868686866106d6565b805160208083019190912060009081526003909152604090205490915060ff1615156001146103b75760405162461bcd60e51b815260040161034f9061244e565b6103c7818363ffffffff16610723565b505050505050565b60036020526000908152604090205460ff1681565b60026020526000908152604090205460ff1681565b6006546001600160a01b0316156104225760405162461bcd60e51b815260040161034f90612536565b600680546001600160a01b039092166001600160a01b03199283161790556005805490911661dead179055565b600260005414156104a7576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6002600090815560408051808201909152601481527327ab26afa61926b2b9b9b0b3b2a932b630bcb2b960611b60208201526104e290610243565b90506001600160a01b0381161561051b57336001600160a01b0382161461051b5760405162461bcd60e51b815260040161034f90612499565b6000610529878787876106d6565b905061053581846107fb565b15156001146105565760405162461bcd60e51b815260040161034f906124ef565b80516020808301919091206000818152600290925260409091205460ff16156105915760405162461bcd60e51b815260040161034f90612390565b600580546001600160a01b0319166001600160a01b03898116919091179091556040516000918a16906105c59089906121ac565b6000604051808303816000865af19150503d8060008114610602576040519150601f19603f3d011682016040523d82523d6000602084013e610607565b606091505b5050600580546001600160a01b03191661dead17905590508015156001141561067c5760008281526002602052604090819020805460ff19166001179055517f4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c90610673908490612195565b60405180910390a15b6000833343604051602001610693939291906121fa565b60408051601f1981840301815291815281516020928301206000908152600192839052908120805460ff1916831790555550505050505050505050565b60045481565b6060848484846040516024016106ef9493929190612260565b60408051601f198184030181529190526020810180516001600160e01b031663cbd4ece960e01b1790529050949350505050565b6107616040518060400160405280601d81526020017f4f564d5f43616e6f6e6963616c5472616e73616374696f6e436861696e000000815250610243565b6001600160a01b0316636fee07e06107ad6040518060400160405280601a81526020017f4f564d5f4c3243726f7373446f6d61696e4d657373656e676572000000000000815250610243565b83856040518463ffffffff1660e01b81526004016107cd9392919061229d565b600060405180830381600087803b1580156107e757600080fd5b505af11580156103c7573d6000803e3d6000fd5b600061080682610820565b80156108175750610817838361097d565b90505b92915050565b6000806108616040518060400160405280601881526020017f4f564d5f5374617465436f6d6d69746d656e74436861696e0000000000000000815250610243565b6020840151604051639418bddd60e01b81529192506001600160a01b03831691639418bddd9161089391600401612580565b60206040518083038186803b1580156108ab57600080fd5b505afa1580156108bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108e3919061208e565b1580156109765750825160208401516040808601519051634d69ee5760e01b81526001600160a01b03851693634d69ee57936109269391929091906004016122cf565b60206040518083038186803b15801561093e57600080fd5b505afa158015610952573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610976919061208e565b9392505050565b600080836109bf6040518060400160405280601a81526020017f4f564d5f4c3243726f7373446f6d61696e4d657373656e676572000000000000815250610243565b6040516020016109d09291906121c8565b6040516020818303038152906040528051906020012060006040516020016109f992919061219e565b604051602081830303815290604052805190602001209050600080610a48602160991b604051602001610a2c919061217d565b60408051601f1981840301815291905260608701518751610ada565b9092509050600182151514610a6f5760405162461bcd60e51b815260040161034f906123db565b6000610a7a82610b03565b9050610acf84604051602001610a909190612195565b6040516020818303038152906040526001604051602001610ab19190612234565b60405160208183030381529060405288608001518460400151610b95565b979650505050505050565b600060606000610ae986610bb9565b9050610af6818686610be9565b9250925050935093915050565b610b0b611c28565b6000610b1683610cbc565b90506040518060800160405280610b4083600081518110610b3357fe5b6020026020010151610ccf565b8152602001610b5583600181518110610b3357fe5b8152602001610b7783600281518110610b6a57fe5b6020026020010151610cd6565b8152602001610b8c83600381518110610b6a57fe5b90529392505050565b600080610ba186610bb9565b9050610baf81868686610dcf565b9695505050505050565b60608180519060200120604051602001610bd39190612195565b6040516020818303038152906040529050919050565b600060606000610bf885610df5565b90506000806000610c0a848a89610ecc565b81519295509093509150158080610c1e5750815b610c6f576040805162461bcd60e51b815260206004820152601a60248201527f50726f76696465642070726f6f6620697320696e76616c69642e000000000000604482015290519081900360640190fd5b600081610c8b5760405180602001604052806000815250610caa565b610caa866001870381518110610c9d57fe5b602002602001015161126f565b919b919a509098505050505050505050565b606061081a610cca8361128b565b6112b0565b600061081a825b6000602182600001511115610d32576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e000000000000604482015290519081900360640190fd5b6000806000610d4085611426565b919450925090506000816001811115610d5557fe5b14610da7576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e000000000000604482015290519081900360640190fd5b602080860151840180519091841015610baf5760208490036101000a90049695505050505050565b6000806000610ddf878686610be9565b91509150818015610acf5750610acf868261174f565b60606000610e0283610cbc565b90506000815167ffffffffffffffff81118015610e1e57600080fd5b50604051908082528060200260200182016040528015610e5857816020015b610e45611c4f565b815260200190600190039081610e3d5790505b50905060005b8251811015610ec4576000610e85848381518110610e7857fe5b6020026020010151611765565b90506040518060400160405280828152602001610ea183610cbc565b815250838381518110610eb057fe5b602090810291909101015250600101610e5e565b509392505050565b60006060818080610edc876117f4565b905085600080610eea611c4f565b60005b8c51811015611247578c8181518110610f0257fe5b6020026020010151915082840193506001870196508360001415610f7657815180516020909101208514610f71576040805162461bcd60e51b8152602060048201526011602482015270092dcecc2d8d2c840e4dedee840d0c2e6d607b1b604482015290519081900360640190fd5b61103d565b815151602011610fdd57815180516020909101208514610f71576040805162461bcd60e51b815260206004820152601b60248201527f496e76616c6964206c6172676520696e7465726e616c20686173680000000000604482015290519081900360640190fd5b84610feb83600001516118f1565b1461103d576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420696e7465726e616c206e6f64652068617368000000000000604482015290519081900360640190fd5b602082015151601114156110ac57855184141561105957611247565b600086858151811061106757fe5b602001015160f81c60f81b60f81c9050600083602001518260ff168151811061108c57fe5b6020026020010151905061109f8161191d565b965060019450505061123f565b600282602001515114156111f25760006110c583611953565b90506000816000815181106110d657fe5b016020015160f81c90506001811660020360006110f68460ff8416611971565b905060006111048b8a611971565b9050600061111283836119a2565b905060ff851660021480611129575060ff85166003145b1561115b5780835114801561113e5750808251145b1561114857988901985b50600160ff1b9950611247945050505050565b60ff8516158061116e575060ff85166001145b156111bb578061118b5750600160ff1b9950611247945050505050565b6111ac886020015160018151811061119f57fe5b602002602001015161191d565b9a50975061123f945050505050565b60405162461bcd60e51b81526004018080602001828103825260268152602001806126126026913960400191505060405180910390fd5b6040805162461bcd60e51b815260206004820152601d60248201527f526563656976656420616e20756e706172736561626c65206e6f64652e000000604482015290519081900360640190fd5b600101610eed565b50600160ff1b84148661125a8786611971565b909e909d50909b509950505050505050505050565b6020810151805160609161081a916000198101908110610e7857fe5b611293611c69565b506040805180820190915281518152602082810190820152919050565b60606000806112be84611426565b919350909150600190508160018111156112d457fe5b14611326576040805162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c50206c6973742076616c75652e000000000000000000604482015290519081900360640190fd5b6040805160208082526104208201909252600091816020015b611347611c69565b81526020019060019003908161133f5790505090506000835b865181101561141b57602082106113a85760405162461bcd60e51b815260040180806020018281038252602a8152602001806125e8602a913960400191505060405180910390fd5b6000806113d46040518060400160405280858c60000151038152602001858c6020015101815250611426565b509150915060405180604001604052808383018152602001848b602001510181525085858151811061140257fe5b6020908102919091010152600193909301920101611360565b508152949350505050565b600080600080846000015111611483576040805162461bcd60e51b815260206004820152601860248201527f524c50206974656d2063616e6e6f74206265206e756c6c2e0000000000000000604482015290519081900360640190fd5b6020840151805160001a607f81116114a8576000600160009450945094505050611748565b60b7811161151d578551607f19820190811061150b576040805162461bcd60e51b815260206004820152601960248201527f496e76616c696420524c502073686f727420737472696e672e00000000000000604482015290519081900360640190fd5b60019550935060009250611748915050565b60bf811161160157855160b6198201908110611580576040805162461bcd60e51b815260206004820152601f60248201527f496e76616c696420524c50206c6f6e6720737472696e67206c656e6774682e00604482015290519081900360640190fd5b6000816020036101000a60018501510490508082018860000151116115ec576040805162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c50206c6f6e6720737472696e672e0000000000000000604482015290519081900360640190fd5b60019091019550935060009250611748915050565b60f7811161167557855160bf198201908110611664576040805162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c502073686f7274206c6973742e000000000000000000604482015290519081900360640190fd5b600195509350849250611748915050565b855160f61982019081106116d0576040805162461bcd60e51b815260206004820152601d60248201527f496e76616c696420524c50206c6f6e67206c697374206c656e6774682e000000604482015290519081900360640190fd5b6000816020036101000a6001850151049050808201886000015111611735576040805162461bcd60e51b815260206004820152601660248201527524b73b30b634b210292628103637b733903634b9ba1760511b604482015290519081900360640190fd5b6001918201965094509250611748915050565b9193909250565b8051602091820120825192909101919091201490565b6060600080600061177585611426565b91945092509050600081600181111561178a57fe5b146117dc576040805162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c502062797465732076616c75652e0000000000000000604482015290519081900360640190fd5b6117eb85602001518484611a08565b95945050505050565b60606000825160020267ffffffffffffffff8111801561181357600080fd5b506040519080825280601f01601f19166020018201604052801561183e576020820181803683370190505b50905060005b83518110156118ea57600484828151811061185b57fe5b602001015160f81c60f81b6001600160f81b031916901c82826002028151811061188157fe5b60200101906001600160f81b031916908160001a90535060108482815181106118a657fe5b016020015160f81c816118b557fe5b0660f81b8282600202600101815181106118cb57fe5b60200101906001600160f81b031916908160001a905350600101611844565b5092915050565b60006020825110156119085750602081015161031a565b81806020019051602081101561031557600080fd5b6000606060208360000151101561193e5761193783611ab6565b905061194a565b61194783611765565b90505b610976816118f1565b606061081a61196c8360200151600081518110610e7857fe5b6117f4565b60608183510360001415611994575060408051602081019091526000815261081a565b610817838384865103611ac1565b6000805b8084511180156119b65750808351115b80156119fb57508281815181106119c957fe5b602001015160f81c60f81b6001600160f81b0319168482815181106119ea57fe5b01602001516001600160f81b031916145b15610817576001016119a6565b606060008267ffffffffffffffff81118015611a2357600080fd5b506040519080825280601f01601f191660200182016040528015611a4e576020820181803683370190505b509050805160001415611a62579050610976565b8484016020820160005b60208604811015611a8d578251825260209283019290910190600101611a6c565b5080519151601f959095166020036101000a600019019182169119909416179092525092915050565b606061081a82611c12565b60608182601f011015611b0c576040805162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b604482015290519081900360640190fd5b828284011015611b54576040805162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b604482015290519081900360640190fd5b81830184511015611ba0576040805162461bcd60e51b8152602060048201526011602482015270736c6963655f6f75744f66426f756e647360781b604482015290519081900360640190fd5b606082158015611bbf5760405191506000825260208201604052611c09565b6040519150601f8416801560200281840101858101878315602002848b0101015b81831015611bf8578051835260209283019201611be0565b5050858452601f01601f1916604052505b50949350505050565b606061081a826020015160008460000151611a08565b60408051608081018252600080825260208201819052918101829052606081019190915290565b604051806040016040528060608152602001606081525090565b604051806040016040528060008152602001600081525090565b600067ffffffffffffffff831115611c9757fe5b611caa601f8401601f1916602001612593565b9050828152838383011115611cbe57600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b038116811461031a57600080fd5b600082601f830112611cfc578081fd5b61081783833560208501611c83565b600060a08284031215611d1c578081fd5b60405160a0810167ffffffffffffffff8282108183111715611d3a57fe5b81604052829350843583526020850135602084015260408501356040840152606085013560608401526080850135915080821115611d7757600080fd5b50611d8485828601611cec565b6080830152505092915050565b600060408284031215611da2578081fd5b6040516040810167ffffffffffffffff8282108183111715611dc057fe5b8160405282935084358352602091508185013581811115611de057600080fd5b8501601f81018713611df157600080fd5b803582811115611dfd57fe5b8381029250611e0d848401612593565b8181528481019083860185850187018b1015611e2857600080fd5b600095505b83861015611e4b578035835260019590950194918601918601611e2d565b5080868801525050505050505092915050565b803563ffffffff8116811461031a57600080fd5b600060208284031215611e83578081fd5b61081782611cd5565b600080600080600060a08688031215611ea3578081fd5b611eac86611cd5565b9450611eba60208701611cd5565b9350604086013567ffffffffffffffff80821115611ed6578283fd5b611ee289838a01611cec565b9450606088013593506080880135915080821115611efe578283fd5b9087019060a0828a031215611f11578283fd5b611f1b60a0612593565b82358152602083013582811115611f30578485fd5b611f3c8b828601611d0b565b602083015250604083013582811115611f53578485fd5b611f5f8b828601611d91565b604083015250606083013582811115611f76578485fd5b611f828b828601611cec565b606083015250608083013582811115611f99578485fd5b611fa58b828601611cec565b6080830152508093505050509295509295909350565b600080600080600060a08688031215611fd2578081fd5b611fdb86611cd5565b9450611fe960208701611cd5565b9350604086013567ffffffffffffffff811115612004578182fd5b61201088828901611cec565b9350506060860135915061202660808701611e5e565b90509295509295909350565b600080600060608486031215612046578283fd5b61204f84611cd5565b9250602084013567ffffffffffffffff81111561206a578283fd5b61207686828701611cec565b92505061208560408501611e5e565b90509250925092565b60006020828403121561209f578081fd5b81518015158114610817578182fd5b6000602082840312156120bf578081fd5b5035919050565b6000602082840312156120d7578081fd5b813567ffffffffffffffff8111156120ed578182fd5b8201601f810184136120fd578182fd5b61210c84823560208401611c83565b949350505050565b6000815180845261212c8160208601602086016125b7565b601f01601f19169290920160200192915050565b600081518352602082015160208401526040820151604084015260608201516060840152608082015160a0608085015261210c60a0850182612114565b60609190911b6001600160601b031916815260140190565b90815260200190565b918252602082015260400190565b600082516121be8184602087016125b7565b9190910192915050565b600083516121da8184602088016125b7565b60609390931b6001600160601b0319169190920190815260140192915050565b6000845161220c8184602089016125b7565b60609490941b6001600160601b03191691909301908152601481019190915260340192915050565b60f89190911b6001600160f81b031916815260010190565b6001600160a01b0391909116815260200190565b6001600160a01b0385811682528416602082015260806040820181905260009061228c90830185612114565b905082606083015295945050505050565b600060018060a01b0385168252836020830152606060408301526117eb6060830184612114565b901515815260200190565b600084825260206060818401526122e96060840186612140565b838103604085015260408101855182528286015160408484015281815180845260608501915085830194508693505b808410156123385784518252938501936001939093019290850190612318565b509998505050505050505050565b6000602082526108176020830184612114565b6020808252601f908201527f78446f6d61696e4d65737361676553656e646572206973206e6f742073657400604082015260600190565b6020808252602b908201527f50726f7669646564206d6573736167652068617320616c72656164792062656560408201526a37103932b1b2b4bb32b21760a91b606082015260800190565b6020808252604d908201527f4d6573736167652070617373696e67207072656465706c6f7920686173206e6f60408201527f74206265656e20696e697469616c697a6564206f7220696e76616c696420707260608201526c37b7b310383937bb34b232b21760991b608082015260a00190565b6020808252602b908201527f50726f7669646564206d65737361676520686173206e6f7420616c726561647960408201526a103132b2b71039b2b73a1760a91b606082015260800190565b60208082526036908201527f4f6e6c79204f564d5f4c324d65737361676552656c617965722063616e2072656040820152753630bc90261916ba3796a6189036b2b9b9b0b3b2b99760511b606082015260800190565b60208082526027908201527f50726f7669646564206d65737361676520636f756c64206e6f742062652076656040820152663934b334b2b21760c91b606082015260800190565b6020808252602a908201527f4c3143726f7373446f6d61696e4d657373656e67657220616c72656164792069604082015269373a34b0b634bd32b21760b11b606082015260800190565b6000602082526108176020830184612140565b60405181810167ffffffffffffffff811182821017156125af57fe5b604052919050565b60005b838110156125d25781810151838201526020016125ba565b838111156125e1576000848401525b5050505056fe50726f766964656420524c50206c6973742065786365656473206d6178206c697374206c656e6774682e52656365697665642061206e6f6465207769746820616e20756e6b6e6f776e20707265666978a164736f6c6343000706000a", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100a95760003560e01c8063706ceab611610071578063706ceab61461011c57806382e3702d1461012f578063b1b1b20914610142578063c4d66de814610155578063d7fd19dd14610168578063ecc704281461017b576100a9565b806321d800ec146100ae578063299ca478146100d75780633dbb202b146100ec578063461a4478146101015780636e296e4514610114575b600080fd5b6100c16100bc3660046120ae565b610190565b6040516100ce91906122c4565b60405180910390f35b6100df6101a5565b6040516100ce919061224c565b6100ff6100fa366004612032565b6101b4565b005b6100df61010f3660046120c6565b610243565b6100df61031f565b6100ff61012a366004611fbb565b610368565b6100c161013d3660046120ae565b6103cf565b6100c16101503660046120ae565b6103e4565b6100ff610163366004611e72565b6103f9565b6100ff610176366004611e8c565b61044f565b6101836106d0565b6040516100ce9190612195565b60016020526000908152604090205460ff1681565b6006546001600160a01b031681565b60006101c48433856004546106d6565b60048054600190810190915581516020808401919091206000908152600390915260409020805460ff1916909117905590506102068163ffffffff8416610723565b7f0ee9ffdb2334d78de97ffb066b23a352a4d35180cefb36589d663fbb1eb6f326816040516102359190612346565b60405180910390a150505050565b60065460405163bf40fac160e01b81526020600482018181528451602484015284516000946001600160a01b03169363bf40fac1938793928392604401918501908083838b5b838110156102a1578181015183820152602001610289565b50505050905090810190601f1680156102ce5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b1580156102eb57600080fd5b505afa1580156102ff573d6000803e3d6000fd5b505050506040513d602081101561031557600080fd5b505190505b919050565b6005546000906001600160a01b031661dead14156103585760405162461bcd60e51b815260040161034f90612359565b60405180910390fd5b506005546001600160a01b031690565b6000610376868686866106d6565b805160208083019190912060009081526003909152604090205490915060ff1615156001146103b75760405162461bcd60e51b815260040161034f9061244e565b6103c7818363ffffffff16610723565b505050505050565b60036020526000908152604090205460ff1681565b60026020526000908152604090205460ff1681565b6006546001600160a01b0316156104225760405162461bcd60e51b815260040161034f90612536565b600680546001600160a01b039092166001600160a01b03199283161790556005805490911661dead179055565b600260005414156104a7576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6002600090815560408051808201909152601481527327ab26afa61926b2b9b9b0b3b2a932b630bcb2b960611b60208201526104e290610243565b90506001600160a01b0381161561051b57336001600160a01b0382161461051b5760405162461bcd60e51b815260040161034f90612499565b6000610529878787876106d6565b905061053581846107fb565b15156001146105565760405162461bcd60e51b815260040161034f906124ef565b80516020808301919091206000818152600290925260409091205460ff16156105915760405162461bcd60e51b815260040161034f90612390565b600580546001600160a01b0319166001600160a01b03898116919091179091556040516000918a16906105c59089906121ac565b6000604051808303816000865af19150503d8060008114610602576040519150601f19603f3d011682016040523d82523d6000602084013e610607565b606091505b5050600580546001600160a01b03191661dead17905590508015156001141561067c5760008281526002602052604090819020805460ff19166001179055517f4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c90610673908490612195565b60405180910390a15b6000833343604051602001610693939291906121fa565b60408051601f1981840301815291815281516020928301206000908152600192839052908120805460ff1916831790555550505050505050505050565b60045481565b6060848484846040516024016106ef9493929190612260565b60408051601f198184030181529190526020810180516001600160e01b031663cbd4ece960e01b1790529050949350505050565b6107616040518060400160405280601d81526020017f4f564d5f43616e6f6e6963616c5472616e73616374696f6e436861696e000000815250610243565b6001600160a01b0316636fee07e06107ad6040518060400160405280601a81526020017f4f564d5f4c3243726f7373446f6d61696e4d657373656e676572000000000000815250610243565b83856040518463ffffffff1660e01b81526004016107cd9392919061229d565b600060405180830381600087803b1580156107e757600080fd5b505af11580156103c7573d6000803e3d6000fd5b600061080682610820565b80156108175750610817838361097d565b90505b92915050565b6000806108616040518060400160405280601881526020017f4f564d5f5374617465436f6d6d69746d656e74436861696e0000000000000000815250610243565b6020840151604051639418bddd60e01b81529192506001600160a01b03831691639418bddd9161089391600401612580565b60206040518083038186803b1580156108ab57600080fd5b505afa1580156108bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108e3919061208e565b1580156109765750825160208401516040808601519051634d69ee5760e01b81526001600160a01b03851693634d69ee57936109269391929091906004016122cf565b60206040518083038186803b15801561093e57600080fd5b505afa158015610952573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610976919061208e565b9392505050565b600080836109bf6040518060400160405280601a81526020017f4f564d5f4c3243726f7373446f6d61696e4d657373656e676572000000000000815250610243565b6040516020016109d09291906121c8565b6040516020818303038152906040528051906020012060006040516020016109f992919061219e565b604051602081830303815290604052805190602001209050600080610a48602160991b604051602001610a2c919061217d565b60408051601f1981840301815291905260608701518751610ada565b9092509050600182151514610a6f5760405162461bcd60e51b815260040161034f906123db565b6000610a7a82610b03565b9050610acf84604051602001610a909190612195565b6040516020818303038152906040526001604051602001610ab19190612234565b60405160208183030381529060405288608001518460400151610b95565b979650505050505050565b600060606000610ae986610bb9565b9050610af6818686610be9565b9250925050935093915050565b610b0b611c28565b6000610b1683610cbc565b90506040518060800160405280610b4083600081518110610b3357fe5b6020026020010151610ccf565b8152602001610b5583600181518110610b3357fe5b8152602001610b7783600281518110610b6a57fe5b6020026020010151610cd6565b8152602001610b8c83600381518110610b6a57fe5b90529392505050565b600080610ba186610bb9565b9050610baf81868686610dcf565b9695505050505050565b60608180519060200120604051602001610bd39190612195565b6040516020818303038152906040529050919050565b600060606000610bf885610df5565b90506000806000610c0a848a89610ecc565b81519295509093509150158080610c1e5750815b610c6f576040805162461bcd60e51b815260206004820152601a60248201527f50726f76696465642070726f6f6620697320696e76616c69642e000000000000604482015290519081900360640190fd5b600081610c8b5760405180602001604052806000815250610caa565b610caa866001870381518110610c9d57fe5b602002602001015161126f565b919b919a509098505050505050505050565b606061081a610cca8361128b565b6112b0565b600061081a825b6000602182600001511115610d32576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e000000000000604482015290519081900360640190fd5b6000806000610d4085611426565b919450925090506000816001811115610d5557fe5b14610da7576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e000000000000604482015290519081900360640190fd5b602080860151840180519091841015610baf5760208490036101000a90049695505050505050565b6000806000610ddf878686610be9565b91509150818015610acf5750610acf868261174f565b60606000610e0283610cbc565b90506000815167ffffffffffffffff81118015610e1e57600080fd5b50604051908082528060200260200182016040528015610e5857816020015b610e45611c4f565b815260200190600190039081610e3d5790505b50905060005b8251811015610ec4576000610e85848381518110610e7857fe5b6020026020010151611765565b90506040518060400160405280828152602001610ea183610cbc565b815250838381518110610eb057fe5b602090810291909101015250600101610e5e565b509392505050565b60006060818080610edc876117f4565b905085600080610eea611c4f565b60005b8c51811015611247578c8181518110610f0257fe5b6020026020010151915082840193506001870196508360001415610f7657815180516020909101208514610f71576040805162461bcd60e51b8152602060048201526011602482015270092dcecc2d8d2c840e4dedee840d0c2e6d607b1b604482015290519081900360640190fd5b61103d565b815151602011610fdd57815180516020909101208514610f71576040805162461bcd60e51b815260206004820152601b60248201527f496e76616c6964206c6172676520696e7465726e616c20686173680000000000604482015290519081900360640190fd5b84610feb83600001516118f1565b1461103d576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420696e7465726e616c206e6f64652068617368000000000000604482015290519081900360640190fd5b602082015151601114156110ac57855184141561105957611247565b600086858151811061106757fe5b602001015160f81c60f81b60f81c9050600083602001518260ff168151811061108c57fe5b6020026020010151905061109f8161191d565b965060019450505061123f565b600282602001515114156111f25760006110c583611953565b90506000816000815181106110d657fe5b016020015160f81c90506001811660020360006110f68460ff8416611971565b905060006111048b8a611971565b9050600061111283836119a2565b905060ff851660021480611129575060ff85166003145b1561115b5780835114801561113e5750808251145b1561114857988901985b50600160ff1b9950611247945050505050565b60ff8516158061116e575060ff85166001145b156111bb578061118b5750600160ff1b9950611247945050505050565b6111ac886020015160018151811061119f57fe5b602002602001015161191d565b9a50975061123f945050505050565b60405162461bcd60e51b81526004018080602001828103825260268152602001806126126026913960400191505060405180910390fd5b6040805162461bcd60e51b815260206004820152601d60248201527f526563656976656420616e20756e706172736561626c65206e6f64652e000000604482015290519081900360640190fd5b600101610eed565b50600160ff1b84148661125a8786611971565b909e909d50909b509950505050505050505050565b6020810151805160609161081a916000198101908110610e7857fe5b611293611c69565b506040805180820190915281518152602082810190820152919050565b60606000806112be84611426565b919350909150600190508160018111156112d457fe5b14611326576040805162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c50206c6973742076616c75652e000000000000000000604482015290519081900360640190fd5b6040805160208082526104208201909252600091816020015b611347611c69565b81526020019060019003908161133f5790505090506000835b865181101561141b57602082106113a85760405162461bcd60e51b815260040180806020018281038252602a8152602001806125e8602a913960400191505060405180910390fd5b6000806113d46040518060400160405280858c60000151038152602001858c6020015101815250611426565b509150915060405180604001604052808383018152602001848b602001510181525085858151811061140257fe5b6020908102919091010152600193909301920101611360565b508152949350505050565b600080600080846000015111611483576040805162461bcd60e51b815260206004820152601860248201527f524c50206974656d2063616e6e6f74206265206e756c6c2e0000000000000000604482015290519081900360640190fd5b6020840151805160001a607f81116114a8576000600160009450945094505050611748565b60b7811161151d578551607f19820190811061150b576040805162461bcd60e51b815260206004820152601960248201527f496e76616c696420524c502073686f727420737472696e672e00000000000000604482015290519081900360640190fd5b60019550935060009250611748915050565b60bf811161160157855160b6198201908110611580576040805162461bcd60e51b815260206004820152601f60248201527f496e76616c696420524c50206c6f6e6720737472696e67206c656e6774682e00604482015290519081900360640190fd5b6000816020036101000a60018501510490508082018860000151116115ec576040805162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c50206c6f6e6720737472696e672e0000000000000000604482015290519081900360640190fd5b60019091019550935060009250611748915050565b60f7811161167557855160bf198201908110611664576040805162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c502073686f7274206c6973742e000000000000000000604482015290519081900360640190fd5b600195509350849250611748915050565b855160f61982019081106116d0576040805162461bcd60e51b815260206004820152601d60248201527f496e76616c696420524c50206c6f6e67206c697374206c656e6774682e000000604482015290519081900360640190fd5b6000816020036101000a6001850151049050808201886000015111611735576040805162461bcd60e51b815260206004820152601660248201527524b73b30b634b210292628103637b733903634b9ba1760511b604482015290519081900360640190fd5b6001918201965094509250611748915050565b9193909250565b8051602091820120825192909101919091201490565b6060600080600061177585611426565b91945092509050600081600181111561178a57fe5b146117dc576040805162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c502062797465732076616c75652e0000000000000000604482015290519081900360640190fd5b6117eb85602001518484611a08565b95945050505050565b60606000825160020267ffffffffffffffff8111801561181357600080fd5b506040519080825280601f01601f19166020018201604052801561183e576020820181803683370190505b50905060005b83518110156118ea57600484828151811061185b57fe5b602001015160f81c60f81b6001600160f81b031916901c82826002028151811061188157fe5b60200101906001600160f81b031916908160001a90535060108482815181106118a657fe5b016020015160f81c816118b557fe5b0660f81b8282600202600101815181106118cb57fe5b60200101906001600160f81b031916908160001a905350600101611844565b5092915050565b60006020825110156119085750602081015161031a565b81806020019051602081101561031557600080fd5b6000606060208360000151101561193e5761193783611ab6565b905061194a565b61194783611765565b90505b610976816118f1565b606061081a61196c8360200151600081518110610e7857fe5b6117f4565b60608183510360001415611994575060408051602081019091526000815261081a565b610817838384865103611ac1565b6000805b8084511180156119b65750808351115b80156119fb57508281815181106119c957fe5b602001015160f81c60f81b6001600160f81b0319168482815181106119ea57fe5b01602001516001600160f81b031916145b15610817576001016119a6565b606060008267ffffffffffffffff81118015611a2357600080fd5b506040519080825280601f01601f191660200182016040528015611a4e576020820181803683370190505b509050805160001415611a62579050610976565b8484016020820160005b60208604811015611a8d578251825260209283019290910190600101611a6c565b5080519151601f959095166020036101000a600019019182169119909416179092525092915050565b606061081a82611c12565b60608182601f011015611b0c576040805162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b604482015290519081900360640190fd5b828284011015611b54576040805162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b604482015290519081900360640190fd5b81830184511015611ba0576040805162461bcd60e51b8152602060048201526011602482015270736c6963655f6f75744f66426f756e647360781b604482015290519081900360640190fd5b606082158015611bbf5760405191506000825260208201604052611c09565b6040519150601f8416801560200281840101858101878315602002848b0101015b81831015611bf8578051835260209283019201611be0565b5050858452601f01601f1916604052505b50949350505050565b606061081a826020015160008460000151611a08565b60408051608081018252600080825260208201819052918101829052606081019190915290565b604051806040016040528060608152602001606081525090565b604051806040016040528060008152602001600081525090565b600067ffffffffffffffff831115611c9757fe5b611caa601f8401601f1916602001612593565b9050828152838383011115611cbe57600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b038116811461031a57600080fd5b600082601f830112611cfc578081fd5b61081783833560208501611c83565b600060a08284031215611d1c578081fd5b60405160a0810167ffffffffffffffff8282108183111715611d3a57fe5b81604052829350843583526020850135602084015260408501356040840152606085013560608401526080850135915080821115611d7757600080fd5b50611d8485828601611cec565b6080830152505092915050565b600060408284031215611da2578081fd5b6040516040810167ffffffffffffffff8282108183111715611dc057fe5b8160405282935084358352602091508185013581811115611de057600080fd5b8501601f81018713611df157600080fd5b803582811115611dfd57fe5b8381029250611e0d848401612593565b8181528481019083860185850187018b1015611e2857600080fd5b600095505b83861015611e4b578035835260019590950194918601918601611e2d565b5080868801525050505050505092915050565b803563ffffffff8116811461031a57600080fd5b600060208284031215611e83578081fd5b61081782611cd5565b600080600080600060a08688031215611ea3578081fd5b611eac86611cd5565b9450611eba60208701611cd5565b9350604086013567ffffffffffffffff80821115611ed6578283fd5b611ee289838a01611cec565b9450606088013593506080880135915080821115611efe578283fd5b9087019060a0828a031215611f11578283fd5b611f1b60a0612593565b82358152602083013582811115611f30578485fd5b611f3c8b828601611d0b565b602083015250604083013582811115611f53578485fd5b611f5f8b828601611d91565b604083015250606083013582811115611f76578485fd5b611f828b828601611cec565b606083015250608083013582811115611f99578485fd5b611fa58b828601611cec565b6080830152508093505050509295509295909350565b600080600080600060a08688031215611fd2578081fd5b611fdb86611cd5565b9450611fe960208701611cd5565b9350604086013567ffffffffffffffff811115612004578182fd5b61201088828901611cec565b9350506060860135915061202660808701611e5e565b90509295509295909350565b600080600060608486031215612046578283fd5b61204f84611cd5565b9250602084013567ffffffffffffffff81111561206a578283fd5b61207686828701611cec565b92505061208560408501611e5e565b90509250925092565b60006020828403121561209f578081fd5b81518015158114610817578182fd5b6000602082840312156120bf578081fd5b5035919050565b6000602082840312156120d7578081fd5b813567ffffffffffffffff8111156120ed578182fd5b8201601f810184136120fd578182fd5b61210c84823560208401611c83565b949350505050565b6000815180845261212c8160208601602086016125b7565b601f01601f19169290920160200192915050565b600081518352602082015160208401526040820151604084015260608201516060840152608082015160a0608085015261210c60a0850182612114565b60609190911b6001600160601b031916815260140190565b90815260200190565b918252602082015260400190565b600082516121be8184602087016125b7565b9190910192915050565b600083516121da8184602088016125b7565b60609390931b6001600160601b0319169190920190815260140192915050565b6000845161220c8184602089016125b7565b60609490941b6001600160601b03191691909301908152601481019190915260340192915050565b60f89190911b6001600160f81b031916815260010190565b6001600160a01b0391909116815260200190565b6001600160a01b0385811682528416602082015260806040820181905260009061228c90830185612114565b905082606083015295945050505050565b600060018060a01b0385168252836020830152606060408301526117eb6060830184612114565b901515815260200190565b600084825260206060818401526122e96060840186612140565b838103604085015260408101855182528286015160408484015281815180845260608501915085830194508693505b808410156123385784518252938501936001939093019290850190612318565b509998505050505050505050565b6000602082526108176020830184612114565b6020808252601f908201527f78446f6d61696e4d65737361676553656e646572206973206e6f742073657400604082015260600190565b6020808252602b908201527f50726f7669646564206d6573736167652068617320616c72656164792062656560408201526a37103932b1b2b4bb32b21760a91b606082015260800190565b6020808252604d908201527f4d6573736167652070617373696e67207072656465706c6f7920686173206e6f60408201527f74206265656e20696e697469616c697a6564206f7220696e76616c696420707260608201526c37b7b310383937bb34b232b21760991b608082015260a00190565b6020808252602b908201527f50726f7669646564206d65737361676520686173206e6f7420616c726561647960408201526a103132b2b71039b2b73a1760a91b606082015260800190565b60208082526036908201527f4f6e6c79204f564d5f4c324d65737361676552656c617965722063616e2072656040820152753630bc90261916ba3796a6189036b2b9b9b0b3b2b99760511b606082015260800190565b60208082526027908201527f50726f7669646564206d65737361676520636f756c64206e6f742062652076656040820152663934b334b2b21760c91b606082015260800190565b6020808252602a908201527f4c3143726f7373446f6d61696e4d657373656e67657220616c72656164792069604082015269373a34b0b634bd32b21760b11b606082015260800190565b6000602082526108176020830184612140565b60405181810167ffffffffffffffff811182821017156125af57fe5b604052919050565b60005b838110156125d25781810151838201526020016125ba565b838111156125e1576000848401525b5050505056fe50726f766964656420524c50206c6973742065786365656473206d6178206c697374206c656e6774682e52656365697665642061206e6f6465207769746820616e20756e6b6e6f776e20707265666978a164736f6c6343000706000a", + "solcInputHash": "5ee8e508e2c54cb5ac6783b4855b1558", + "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"msgHash\",\"type\":\"bytes32\"}],\"name\":\"FailedRelayedMessage\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"_xDomainCalldataHash\",\"type\":\"bytes32\"}],\"name\":\"MessageAllowed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"_xDomainCalldataHash\",\"type\":\"bytes32\"}],\"name\":\"MessageBlocked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Paused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"msgHash\",\"type\":\"bytes32\"}],\"name\":\"RelayedMessage\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"}],\"name\":\"SentMessage\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Unpaused\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_xDomainCalldataHash\",\"type\":\"bytes32\"}],\"name\":\"allowMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_xDomainCalldataHash\",\"type\":\"bytes32\"}],\"name\":\"blockMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"blockedMessages\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"messageNonce\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"paused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_sender\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_message\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"_messageNonce\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"stateRootBatchHeader\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"siblings\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct Lib_OVMCodec.ChainInclusionProof\",\"name\":\"stateRootProof\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"stateTrieWitness\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"storageTrieWitness\",\"type\":\"bytes\"}],\"internalType\":\"struct iOVM_L1CrossDomainMessenger.L2MessageInclusionProof\",\"name\":\"_proof\",\"type\":\"tuple\"}],\"name\":\"relayMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"relayedMessages\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_sender\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_message\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"_messageNonce\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"_gasLimit\",\"type\":\"uint32\"}],\"name\":\"replayMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_message\",\"type\":\"bytes\"},{\"internalType\":\"uint32\",\"name\":\"_gasLimit\",\"type\":\"uint32\"}],\"name\":\"sendMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"sentMessages\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"successfulMessages\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"xDomainMessageSender\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The L1 Cross Domain Messenger contract sends messages from L1 to L2, and relays messages from L2 onto L1. In the event that a message sent from L1 to L2 is rejected for exceeding the L2 epoch gas limit, it can be resubmitted via this contract's replay function. Compiler used: solc Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"allowMessage(bytes32)\":{\"params\":{\"_xDomainCalldataHash\":\"Hash of the message to block.\"}},\"blockMessage(bytes32)\":{\"params\":{\"_xDomainCalldataHash\":\"Hash of the message to block.\"}},\"initialize(address)\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"paused()\":{\"details\":\"Returns true if the contract is paused, and false otherwise.\"},\"relayMessage(address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))\":{\"params\":{\"_message\":\"Message to send to the target.\",\"_messageNonce\":\"Nonce for the provided message.\",\"_proof\":\"Inclusion proof for the given message.\",\"_sender\":\"Message sender address.\",\"_target\":\"Target contract address.\"}},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner.\"},\"replayMessage(address,address,bytes,uint256,uint32)\":{\"params\":{\"_gasLimit\":\"Gas limit for the provided message.\",\"_message\":\"Message to send to the target.\",\"_messageNonce\":\"Nonce for the provided message.\",\"_sender\":\"Original sender address.\",\"_target\":\"Target contract address.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}},\"sendMessage(address,bytes,uint32)\":{\"params\":{\"_gasLimit\":\"Gas limit for the provided message.\",\"_message\":\"Message to send to the target.\",\"_target\":\"Target contract address.\"}},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"}},\"title\":\"OVM_L1CrossDomainMessenger\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"allowMessage(bytes32)\":{\"notice\":\"Allow a message.\"},\"blockMessage(bytes32)\":{\"notice\":\"Block a message.\"},\"constructor\":{\"notice\":\"This contract is intended to be behind a delegate proxy. We pass the zero address to the address resolver just to satisfy the constructor. We still need to set this value in initialize().\"},\"pause()\":{\"notice\":\"Pause relaying.\"},\"relayMessage(address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))\":{\"notice\":\"Relays a cross domain message to a contract.\"},\"replayMessage(address,address,bytes,uint256,uint32)\":{\"notice\":\"Replays a cross domain message to the target messenger.\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"},\"sendMessage(address,bytes,uint32)\":{\"notice\":\"Sends a cross domain message to the target messenger.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1CrossDomainMessenger.sol\":\"OVM_L1CrossDomainMessenger\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../utils/ContextUpgradeable.sol\\\";\\nimport \\\"../proxy/Initializable.sol\\\";\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n function __Ownable_init() internal initializer {\\n __Context_init_unchained();\\n __Ownable_init_unchained();\\n }\\n\\n function __Ownable_init_unchained() internal initializer {\\n address msgSender = _msgSender();\\n _owner = msgSender;\\n emit OwnershipTransferred(address(0), msgSender);\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n emit OwnershipTransferred(_owner, address(0));\\n _owner = address(0);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n emit OwnershipTransferred(_owner, newOwner);\\n _owner = newOwner;\\n }\\n uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0xb419e68addcb82ecda3ad3974b0d2db76435ce9b08435a04d5b119a0c5d45ea5\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\n// solhint-disable-next-line compiler-version\\npragma solidity >=0.4.24 <0.8.0;\\n\\nimport \\\"../utils/AddressUpgradeable.sol\\\";\\n\\n/**\\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\\n * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an\\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\\n *\\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\\n * possible by providing the encoded function call as the `_data` argument to {UpgradeableProxy-constructor}.\\n *\\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\\n */\\nabstract contract Initializable {\\n\\n /**\\n * @dev Indicates that the contract has been initialized.\\n */\\n bool private _initialized;\\n\\n /**\\n * @dev Indicates that the contract is in the process of being initialized.\\n */\\n bool private _initializing;\\n\\n /**\\n * @dev Modifier to protect an initializer function from being invoked twice.\\n */\\n modifier initializer() {\\n require(_initializing || _isConstructor() || !_initialized, \\\"Initializable: contract is already initialized\\\");\\n\\n bool isTopLevelCall = !_initializing;\\n if (isTopLevelCall) {\\n _initializing = true;\\n _initialized = true;\\n }\\n\\n _;\\n\\n if (isTopLevelCall) {\\n _initializing = false;\\n }\\n }\\n\\n /// @dev Returns true if and only if the function is running in the constructor\\n function _isConstructor() private view returns (bool) {\\n return !AddressUpgradeable.isContract(address(this));\\n }\\n}\\n\",\"keccak256\":\"0xd8e4eb08dcc1d1860fb347ba5ffd595242b9a1b66d49a47f2b4cb51c3f35017e\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.2 <0.8.0;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary AddressUpgradeable {\\n /**\\n * @dev Returns true if `account` is a contract.\\n *\\n * [IMPORTANT]\\n * ====\\n * It is unsafe to assume that an address for which this function returns\\n * false is an externally-owned account (EOA) and not a contract.\\n *\\n * Among others, `isContract` will return false for the following\\n * types of addresses:\\n *\\n * - an externally-owned account\\n * - a contract in construction\\n * - an address where a contract will be created\\n * - an address where a contract lived, but was destroyed\\n * ====\\n */\\n function isContract(address account) internal view returns (bool) {\\n // This method relies on extcodesize, which returns 0 for contracts in\\n // construction, since the code is only stored at the end of the\\n // constructor execution.\\n\\n uint256 size;\\n // solhint-disable-next-line no-inline-assembly\\n assembly { size := extcodesize(account) }\\n return size > 0;\\n }\\n\\n /**\\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n * `recipient`, forwarding all available gas and reverting on errors.\\n *\\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n * imposed by `transfer`, making them unable to receive funds via\\n * `transfer`. {sendValue} removes this limitation.\\n *\\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n *\\n * IMPORTANT: because control is transferred to `recipient`, care must be\\n * taken to not create reentrancy vulnerabilities. Consider using\\n * {ReentrancyGuard} or the\\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n */\\n function sendValue(address payable recipient, uint256 amount) internal {\\n require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n // solhint-disable-next-line avoid-low-level-calls, avoid-call-value\\n (bool success, ) = recipient.call{ value: amount }(\\\"\\\");\\n require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n }\\n\\n /**\\n * @dev Performs a Solidity function call using a low level `call`. A\\n * plain`call` is an unsafe replacement for a function call: use this\\n * function instead.\\n *\\n * If `target` reverts with a revert reason, it is bubbled up by this\\n * function (like regular Solidity function calls).\\n *\\n * Returns the raw returned data. To convert to the expected return value,\\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n *\\n * Requirements:\\n *\\n * - `target` must be a contract.\\n * - calling `target` with `data` must not revert.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionCall(target, data, \\\"Address: low-level call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n * `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but also transferring `value` wei to `target`.\\n *\\n * Requirements:\\n *\\n * - the calling contract must have an ETH balance of at least `value`.\\n * - the called Solidity function must be `payable`.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n * with `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {\\n require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n require(isContract(target), \\\"Address: call to non-contract\\\");\\n\\n // solhint-disable-next-line avoid-low-level-calls\\n (bool success, bytes memory returndata) = target.call{ value: value }(data);\\n return _verifyCallResult(success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {\\n require(isContract(target), \\\"Address: static call to non-contract\\\");\\n\\n // solhint-disable-next-line avoid-low-level-calls\\n (bool success, bytes memory returndata) = target.staticcall(data);\\n return _verifyCallResult(success, returndata, errorMessage);\\n }\\n\\n function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {\\n if (success) {\\n return returndata;\\n } else {\\n // Look for revert reason and bubble it up if present\\n if (returndata.length > 0) {\\n // The easiest way to bubble the revert reason is using memory via assembly\\n\\n // solhint-disable-next-line no-inline-assembly\\n assembly {\\n let returndata_size := mload(returndata)\\n revert(add(32, returndata), returndata_size)\\n }\\n } else {\\n revert(errorMessage);\\n }\\n }\\n }\\n}\\n\",\"keccak256\":\"0xfc5ea91fa9ceb1961023b2a6c978b902888c52b90847ac7813fe3b79524165f6\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with GSN meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract ContextUpgradeable is Initializable {\\n function __Context_init() internal initializer {\\n __Context_init_unchained();\\n }\\n\\n function __Context_init_unchained() internal initializer {\\n }\\n function _msgSender() internal view virtual returns (address payable) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes memory) {\\n this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n return msg.data;\\n }\\n uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0xbbf8a21b9a66c48d45ff771b8563c6df19ba451d63dfb8380a865c1e1f29d1a0\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"./ContextUpgradeable.sol\\\";\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev Contract module which allows children to implement an emergency stop\\n * mechanism that can be triggered by an authorized account.\\n *\\n * This module is used through inheritance. It will make available the\\n * modifiers `whenNotPaused` and `whenPaused`, which can be applied to\\n * the functions of your contract. Note that they will not be pausable by\\n * simply including this module, only once the modifiers are put in place.\\n */\\nabstract contract PausableUpgradeable is Initializable, ContextUpgradeable {\\n /**\\n * @dev Emitted when the pause is triggered by `account`.\\n */\\n event Paused(address account);\\n\\n /**\\n * @dev Emitted when the pause is lifted by `account`.\\n */\\n event Unpaused(address account);\\n\\n bool private _paused;\\n\\n /**\\n * @dev Initializes the contract in unpaused state.\\n */\\n function __Pausable_init() internal initializer {\\n __Context_init_unchained();\\n __Pausable_init_unchained();\\n }\\n\\n function __Pausable_init_unchained() internal initializer {\\n _paused = false;\\n }\\n\\n /**\\n * @dev Returns true if the contract is paused, and false otherwise.\\n */\\n function paused() public view virtual returns (bool) {\\n return _paused;\\n }\\n\\n /**\\n * @dev Modifier to make a function callable only when the contract is not paused.\\n *\\n * Requirements:\\n *\\n * - The contract must not be paused.\\n */\\n modifier whenNotPaused() {\\n require(!paused(), \\\"Pausable: paused\\\");\\n _;\\n }\\n\\n /**\\n * @dev Modifier to make a function callable only when the contract is paused.\\n *\\n * Requirements:\\n *\\n * - The contract must be paused.\\n */\\n modifier whenPaused() {\\n require(paused(), \\\"Pausable: not paused\\\");\\n _;\\n }\\n\\n /**\\n * @dev Triggers stopped state.\\n *\\n * Requirements:\\n *\\n * - The contract must not be paused.\\n */\\n function _pause() internal virtual whenNotPaused {\\n _paused = true;\\n emit Paused(_msgSender());\\n }\\n\\n /**\\n * @dev Returns to normal state.\\n *\\n * Requirements:\\n *\\n * - The contract must be paused.\\n */\\n function _unpause() internal virtual whenPaused {\\n _paused = false;\\n emit Unpaused(_msgSender());\\n }\\n uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0x73bef0a5dec3efde8183c4858d90f683ed2771656c4329647b4d5b0f89498fd5\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev Contract module that helps prevent reentrant calls to a function.\\n *\\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\\n * available, which can be applied to functions to make sure there are no nested\\n * (reentrant) calls to them.\\n *\\n * Note that because there is a single `nonReentrant` guard, functions marked as\\n * `nonReentrant` may not call one another. This can be worked around by making\\n * those functions `private`, and then adding `external` `nonReentrant` entry\\n * points to them.\\n *\\n * TIP: If you would like to learn more about reentrancy and alternative ways\\n * to protect against it, check out our blog post\\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\\n */\\nabstract contract ReentrancyGuardUpgradeable is Initializable {\\n // Booleans are more expensive than uint256 or any type that takes up a full\\n // word because each write operation emits an extra SLOAD to first read the\\n // slot's contents, replace the bits taken up by the boolean, and then write\\n // back. This is the compiler's defense against contract upgrades and\\n // pointer aliasing, and it cannot be disabled.\\n\\n // The values being non-zero value makes deployment a bit more expensive,\\n // but in exchange the refund on every call to nonReentrant will be lower in\\n // amount. Since refunds are capped to a percentage of the total\\n // transaction's gas, it is best to keep them low in cases like this one, to\\n // increase the likelihood of the full refund coming into effect.\\n uint256 private constant _NOT_ENTERED = 1;\\n uint256 private constant _ENTERED = 2;\\n\\n uint256 private _status;\\n\\n function __ReentrancyGuard_init() internal initializer {\\n __ReentrancyGuard_init_unchained();\\n }\\n\\n function __ReentrancyGuard_init_unchained() internal initializer {\\n _status = _NOT_ENTERED;\\n }\\n\\n /**\\n * @dev Prevents a contract from calling itself, directly or indirectly.\\n * Calling a `nonReentrant` function from another `nonReentrant`\\n * function is not supported. It is possible to prevent this from happening\\n * by making the `nonReentrant` function external, and make it call a\\n * `private` function that does the actual work.\\n */\\n modifier nonReentrant() {\\n // On the first call to nonReentrant, _notEntered will be true\\n require(_status != _ENTERED, \\\"ReentrancyGuard: reentrant call\\\");\\n\\n // Any calls to nonReentrant after this point will fail\\n _status = _ENTERED;\\n\\n _;\\n\\n // By storing the original value once again, a refund is triggered (see\\n // https://eips.ethereum.org/EIPS/eip-2200)\\n _status = _NOT_ENTERED;\\n }\\n uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0x46034cd5cca740f636345c8f7aebae0f78adfd4b70e31e6f888cccbe1086586e\",\"license\":\"MIT\"},\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor () internal {\\n address msgSender = _msgSender();\\n _owner = msgSender;\\n emit OwnershipTransferred(address(0), msgSender);\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n emit OwnershipTransferred(_owner, address(0));\\n _owner = address(0);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n emit OwnershipTransferred(_owner, newOwner);\\n _owner = newOwner;\\n }\\n}\\n\",\"keccak256\":\"0x15e2d5bd4c28a88548074c54d220e8086f638a71ed07e6b3ba5a70066fcf458d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with GSN meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address payable) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes memory) {\\n this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x8d3cb350f04ff49cfb10aef08d87f19dcbaecc8027b0bed12f3275cd12f38cf0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/bridge/messaging/Abs_BaseCrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Interface Imports */\\nimport { iAbs_BaseCrossDomainMessenger } from \\\"../../../iOVM/bridge/messaging/iAbs_BaseCrossDomainMessenger.sol\\\";\\n\\n/**\\n * @title Abs_BaseCrossDomainMessenger\\n * @dev The Base Cross Domain Messenger is an abstract contract providing the interface and common\\n * functionality used in the L1 and L2 Cross Domain Messengers. It can also serve as a template for\\n * developers wishing to implement a custom bridge contract to suit their needs.\\n *\\n * Compiler used: defined by child contract\\n * Runtime target: defined by child contract\\n */\\nabstract contract Abs_BaseCrossDomainMessenger is iAbs_BaseCrossDomainMessenger {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n // The default x-domain message sender being set to a non-zero value makes\\n // deployment a bit more expensive, but in exchange the refund on every call to\\n // `relayMessage` by the L1 and L2 messengers will be higher.\\n address internal constant DEFAULT_XDOMAIN_SENDER = 0x000000000000000000000000000000000000dEaD;\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping (bytes32 => bool) public relayedMessages;\\n mapping (bytes32 => bool) public successfulMessages;\\n mapping (bytes32 => bool) public sentMessages;\\n uint256 public messageNonce;\\n address internal xDomainMsgSender = DEFAULT_XDOMAIN_SENDER;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n constructor() {}\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function xDomainMessageSender()\\n public\\n override\\n view\\n returns (\\n address\\n )\\n {\\n require(xDomainMsgSender != DEFAULT_XDOMAIN_SENDER, \\\"xDomainMessageSender is not set\\\");\\n return xDomainMsgSender;\\n }\\n\\n /**\\n * Sends a cross domain message to the target messenger.\\n * @param _target Target contract address.\\n * @param _message Message to send to the target.\\n * @param _gasLimit Gas limit for the provided message.\\n */\\n function sendMessage(\\n address _target,\\n bytes memory _message,\\n uint32 _gasLimit\\n )\\n override\\n public\\n {\\n bytes memory xDomainCalldata = _getXDomainCalldata(\\n _target,\\n msg.sender,\\n _message,\\n messageNonce\\n );\\n\\n messageNonce += 1;\\n sentMessages[keccak256(xDomainCalldata)] = true;\\n\\n _sendXDomainMessage(xDomainCalldata, _gasLimit);\\n emit SentMessage(xDomainCalldata);\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Generates the correct cross domain calldata for a message.\\n * @param _target Target contract address.\\n * @param _sender Message sender address.\\n * @param _message Message to send to the target.\\n * @param _messageNonce Nonce for the provided message.\\n * @return ABI encoded cross domain calldata.\\n */\\n function _getXDomainCalldata(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _messageNonce\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return abi.encodeWithSignature(\\n \\\"relayMessage(address,address,bytes,uint256)\\\",\\n _target,\\n _sender,\\n _message,\\n _messageNonce\\n );\\n }\\n\\n /**\\n * Sends a cross domain message.\\n * param // Message to send.\\n * param // Gas limit for the provided message.\\n */\\n function _sendXDomainMessage(\\n bytes memory, // _message,\\n uint256 // _gasLimit\\n )\\n virtual\\n internal\\n {\\n revert(\\\"Implement me in child contracts!\\\");\\n }\\n}\\n\",\"keccak256\":\"0xed5dafa41fadfd461e33c042da3a721f2cce73e0d2418d170a44161f7714a439\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1CrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../../libraries/resolver/Lib_AddressResolver.sol\\\";\\nimport { Lib_AddressManager } from \\\"../../../libraries/resolver/Lib_AddressManager.sol\\\";\\nimport { Lib_SecureMerkleTrie } from \\\"../../../libraries/trie/Lib_SecureMerkleTrie.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_L1CrossDomainMessenger } from \\\"../../../iOVM/bridge/messaging/iOVM_L1CrossDomainMessenger.sol\\\";\\nimport { iOVM_CanonicalTransactionChain } from \\\"../../../iOVM/chain/iOVM_CanonicalTransactionChain.sol\\\";\\nimport { iOVM_StateCommitmentChain } from \\\"../../../iOVM/chain/iOVM_StateCommitmentChain.sol\\\";\\n\\n/* Contract Imports */\\nimport { Abs_BaseCrossDomainMessenger } from \\\"./Abs_BaseCrossDomainMessenger.sol\\\";\\n\\n/* External Imports */\\nimport { OwnableUpgradeable } from \\\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\\\";\\nimport { PausableUpgradeable } from \\\"@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol\\\";\\nimport { ReentrancyGuardUpgradeable } from \\\"@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol\\\";\\n\\n/**\\n * @title OVM_L1CrossDomainMessenger\\n * @dev The L1 Cross Domain Messenger contract sends messages from L1 to L2, and relays messages\\n * from L2 onto L1. In the event that a message sent from L1 to L2 is rejected for exceeding the L2\\n * epoch gas limit, it can be resubmitted via this contract's replay function.\\n *\\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract OVM_L1CrossDomainMessenger is\\n iOVM_L1CrossDomainMessenger,\\n Abs_BaseCrossDomainMessenger,\\n Lib_AddressResolver,\\n OwnableUpgradeable,\\n PausableUpgradeable,\\n ReentrancyGuardUpgradeable\\n{\\n\\n /**********\\n * Events *\\n **********/\\n\\n event MessageBlocked(\\n bytes32 indexed _xDomainCalldataHash\\n );\\n\\n event MessageAllowed(\\n bytes32 indexed _xDomainCalldataHash\\n );\\n\\n /**********************\\n * Contract Variables *\\n **********************/\\n\\n mapping (bytes32 => bool) public blockedMessages;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * This contract is intended to be behind a delegate proxy.\\n * We pass the zero address to the address resolver just to satisfy the constructor.\\n * We still need to set this value in initialize().\\n */\\n constructor()\\n Lib_AddressResolver(address(0))\\n {}\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n /**\\n * Modifier to enforce that, if configured, only the OVM_L2MessageRelayer contract may\\n * successfully call a method.\\n */\\n modifier onlyRelayer() {\\n address relayer = resolve(\\\"OVM_L2MessageRelayer\\\");\\n if (relayer != address(0)) {\\n require(\\n msg.sender == relayer,\\n \\\"Only OVM_L2MessageRelayer can relay L2-to-L1 messages.\\\"\\n );\\n }\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n */\\n function initialize(\\n address _libAddressManager\\n )\\n public\\n initializer\\n {\\n require(\\n address(libAddressManager) == address(0),\\n \\\"L1CrossDomainMessenger already intialized.\\\"\\n );\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n xDomainMsgSender = DEFAULT_XDOMAIN_SENDER;\\n\\n // Initialize upgradable OZ contracts\\n __Context_init_unchained(); // Context is a dependency for both Ownable and Pausable\\n __Ownable_init_unchained();\\n __Pausable_init_unchained();\\n __ReentrancyGuard_init_unchained();\\n }\\n\\n /**\\n * Pause relaying.\\n */\\n function pause()\\n external\\n onlyOwner\\n {\\n _pause();\\n }\\n\\n /**\\n * Block a message.\\n * @param _xDomainCalldataHash Hash of the message to block.\\n */\\n function blockMessage(\\n bytes32 _xDomainCalldataHash\\n )\\n external\\n onlyOwner\\n {\\n blockedMessages[_xDomainCalldataHash] = true;\\n emit MessageBlocked(_xDomainCalldataHash);\\n }\\n\\n /**\\n * Allow a message.\\n * @param _xDomainCalldataHash Hash of the message to block.\\n */\\n function allowMessage(\\n bytes32 _xDomainCalldataHash\\n )\\n external\\n onlyOwner\\n {\\n blockedMessages[_xDomainCalldataHash] = false;\\n emit MessageAllowed(_xDomainCalldataHash);\\n }\\n\\n /**\\n * Relays a cross domain message to a contract.\\n * @inheritdoc iOVM_L1CrossDomainMessenger\\n */\\n function relayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _messageNonce,\\n L2MessageInclusionProof memory _proof\\n )\\n override\\n public\\n nonReentrant\\n onlyRelayer\\n whenNotPaused\\n {\\n bytes memory xDomainCalldata = _getXDomainCalldata(\\n _target,\\n _sender,\\n _message,\\n _messageNonce\\n );\\n\\n require(\\n _verifyXDomainMessage(\\n xDomainCalldata,\\n _proof\\n ) == true,\\n \\\"Provided message could not be verified.\\\"\\n );\\n\\n bytes32 xDomainCalldataHash = keccak256(xDomainCalldata);\\n\\n require(\\n successfulMessages[xDomainCalldataHash] == false,\\n \\\"Provided message has already been received.\\\"\\n );\\n\\n require(\\n blockedMessages[xDomainCalldataHash] == false,\\n \\\"Provided message has been blocked.\\\"\\n );\\n\\n xDomainMsgSender = _sender;\\n (bool success, ) = _target.call(_message);\\n xDomainMsgSender = DEFAULT_XDOMAIN_SENDER;\\n\\n // Mark the message as received if the call was successful. Ensures that a message can be\\n // relayed multiple times in the case that the call reverted.\\n if (success == true) {\\n successfulMessages[xDomainCalldataHash] = true;\\n emit RelayedMessage(xDomainCalldataHash);\\n } else {\\n emit FailedRelayedMessage(xDomainCalldataHash);\\n }\\n\\n // Store an identifier that can be used to prove that the given message was relayed by some\\n // user. Gives us an easy way to pay relayers for their work.\\n bytes32 relayId = keccak256(\\n abi.encodePacked(\\n xDomainCalldata,\\n msg.sender,\\n block.number\\n )\\n );\\n relayedMessages[relayId] = true;\\n }\\n\\n /**\\n * Replays a cross domain message to the target messenger.\\n * @inheritdoc iOVM_L1CrossDomainMessenger\\n */\\n function replayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _messageNonce,\\n uint32 _gasLimit\\n )\\n override\\n public\\n {\\n bytes memory xDomainCalldata = _getXDomainCalldata(\\n _target,\\n _sender,\\n _message,\\n _messageNonce\\n );\\n\\n require(\\n sentMessages[keccak256(xDomainCalldata)] == true,\\n \\\"Provided message has not already been sent.\\\"\\n );\\n\\n _sendXDomainMessage(xDomainCalldata, _gasLimit);\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Verifies that the given message is valid.\\n * @param _xDomainCalldata Calldata to verify.\\n * @param _proof Inclusion proof for the message.\\n * @return Whether or not the provided message is valid.\\n */\\n function _verifyXDomainMessage(\\n bytes memory _xDomainCalldata,\\n L2MessageInclusionProof memory _proof\\n )\\n internal\\n view\\n returns (\\n bool\\n )\\n {\\n return (\\n _verifyStateRootProof(_proof)\\n && _verifyStorageProof(_xDomainCalldata, _proof)\\n );\\n }\\n\\n /**\\n * Verifies that the state root within an inclusion proof is valid.\\n * @param _proof Message inclusion proof.\\n * @return Whether or not the provided proof is valid.\\n */\\n function _verifyStateRootProof(\\n L2MessageInclusionProof memory _proof\\n )\\n internal\\n view\\n returns (\\n bool\\n )\\n {\\n iOVM_StateCommitmentChain ovmStateCommitmentChain = iOVM_StateCommitmentChain(\\n resolve(\\\"OVM_StateCommitmentChain\\\")\\n );\\n\\n return (\\n ovmStateCommitmentChain.insideFraudProofWindow(_proof.stateRootBatchHeader) == false\\n && ovmStateCommitmentChain.verifyStateCommitment(\\n _proof.stateRoot,\\n _proof.stateRootBatchHeader,\\n _proof.stateRootProof\\n )\\n );\\n }\\n\\n /**\\n * Verifies that the storage proof within an inclusion proof is valid.\\n * @param _xDomainCalldata Encoded message calldata.\\n * @param _proof Message inclusion proof.\\n * @return Whether or not the provided proof is valid.\\n */\\n function _verifyStorageProof(\\n bytes memory _xDomainCalldata,\\n L2MessageInclusionProof memory _proof\\n )\\n internal\\n view\\n returns (\\n bool\\n )\\n {\\n bytes32 storageKey = keccak256(\\n abi.encodePacked(\\n keccak256(\\n abi.encodePacked(\\n _xDomainCalldata,\\n resolve(\\\"OVM_L2CrossDomainMessenger\\\")\\n )\\n ),\\n uint256(0)\\n )\\n );\\n\\n (\\n bool exists,\\n bytes memory encodedMessagePassingAccount\\n ) = Lib_SecureMerkleTrie.get(\\n abi.encodePacked(0x4200000000000000000000000000000000000000),\\n _proof.stateTrieWitness,\\n _proof.stateRoot\\n );\\n\\n require(\\n exists == true,\\n \\\"Message passing predeploy has not been initialized or invalid proof provided.\\\"\\n );\\n\\n Lib_OVMCodec.EVMAccount memory account = Lib_OVMCodec.decodeEVMAccount(\\n encodedMessagePassingAccount\\n );\\n\\n return Lib_SecureMerkleTrie.verifyInclusionProof(\\n abi.encodePacked(storageKey),\\n abi.encodePacked(uint8(1)),\\n _proof.storageTrieWitness,\\n account.storageRoot\\n );\\n }\\n\\n /**\\n * Sends a cross domain message.\\n * @param _message Message to send.\\n * @param _gasLimit OVM gas limit for the message.\\n */\\n function _sendXDomainMessage(\\n bytes memory _message,\\n uint256 _gasLimit\\n )\\n override\\n internal\\n {\\n iOVM_CanonicalTransactionChain(resolve(\\\"OVM_CanonicalTransactionChain\\\")).enqueue(\\n resolve(\\\"OVM_L2CrossDomainMessenger\\\"),\\n _gasLimit,\\n _message\\n );\\n }\\n}\\n\",\"keccak256\":\"0xba49f550a93c91448340fdb85ad8e4d4dff523532eb1524add38ee2825cc0442\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/bridge/messaging/iAbs_BaseCrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/**\\n * @title iAbs_BaseCrossDomainMessenger\\n */\\ninterface iAbs_BaseCrossDomainMessenger {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event SentMessage(bytes message);\\n event RelayedMessage(bytes32 msgHash);\\n event FailedRelayedMessage(bytes32 msgHash);\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n function xDomainMessageSender() external view returns (address);\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sends a cross domain message to the target messenger.\\n * @param _target Target contract address.\\n * @param _message Message to send to the target.\\n * @param _gasLimit Gas limit for the provided message.\\n */\\n function sendMessage(\\n address _target,\\n bytes calldata _message,\\n uint32 _gasLimit\\n ) external;\\n}\\n\",\"keccak256\":\"0x89981ed48e99d6939cc6cdef827d484fa3e2292d66c0ba5056c7050cb6282d7e\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/bridge/messaging/iOVM_L1CrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { iAbs_BaseCrossDomainMessenger } from \\\"./iAbs_BaseCrossDomainMessenger.sol\\\";\\n\\n/**\\n * @title iOVM_L1CrossDomainMessenger\\n */\\ninterface iOVM_L1CrossDomainMessenger is iAbs_BaseCrossDomainMessenger {\\n\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n struct L2MessageInclusionProof {\\n bytes32 stateRoot;\\n Lib_OVMCodec.ChainBatchHeader stateRootBatchHeader;\\n Lib_OVMCodec.ChainInclusionProof stateRootProof;\\n bytes stateTrieWitness;\\n bytes storageTrieWitness;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Relays a cross domain message to a contract.\\n * @param _target Target contract address.\\n * @param _sender Message sender address.\\n * @param _message Message to send to the target.\\n * @param _messageNonce Nonce for the provided message.\\n * @param _proof Inclusion proof for the given message.\\n */\\n function relayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _messageNonce,\\n L2MessageInclusionProof memory _proof\\n ) external;\\n\\n /**\\n * Replays a cross domain message to the target messenger.\\n * @param _target Target contract address.\\n * @param _sender Original sender address.\\n * @param _message Message to send to the target.\\n * @param _messageNonce Nonce for the provided message.\\n * @param _gasLimit Gas limit for the provided message.\\n */\\n function replayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _messageNonce,\\n uint32 _gasLimit\\n ) external;\\n}\\n\",\"keccak256\":\"0xdcd239d0b215e400674d78e8db4ac12ba18efc34fa78e24c2ff867f61062dba2\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_CanonicalTransactionChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_ChainStorageContainer } from \\\"./iOVM_ChainStorageContainer.sol\\\";\\n\\n/**\\n * @title iOVM_CanonicalTransactionChain\\n */\\ninterface iOVM_CanonicalTransactionChain {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event TransactionEnqueued(\\n address _l1TxOrigin,\\n address _target,\\n uint256 _gasLimit,\\n bytes _data,\\n uint256 _queueIndex,\\n uint256 _timestamp\\n );\\n\\n event QueueBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event SequencerBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event TransactionBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct BatchContext {\\n uint256 numSequencedTransactions;\\n uint256 numSubsequentQueueTransactions;\\n uint256 timestamp;\\n uint256 blockNumber;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n\\n /**\\n * Accesses the batch storage container.\\n * @return Reference to the batch storage container.\\n */\\n function batches()\\n external\\n view\\n returns (\\n iOVM_ChainStorageContainer\\n );\\n\\n /**\\n * Accesses the queue storage container.\\n * @return Reference to the queue storage container.\\n */\\n function queue()\\n external\\n view\\n returns (\\n iOVM_ChainStorageContainer\\n );\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements()\\n external\\n view\\n returns (\\n uint256 _totalElements\\n );\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches()\\n external\\n view\\n returns (\\n uint256 _totalBatches\\n );\\n\\n /**\\n * Returns the index of the next element to be enqueued.\\n * @return Index for the next queue element.\\n */\\n function getNextQueueIndex()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Gets the queue element at a particular index.\\n * @param _index Index of the queue element to access.\\n * @return _element Queue element at the given index.\\n */\\n function getQueueElement(\\n uint256 _index\\n )\\n external\\n view\\n returns (\\n Lib_OVMCodec.QueueElement memory _element\\n );\\n\\n /**\\n * Returns the timestamp of the last transaction.\\n * @return Timestamp for the last transaction.\\n */\\n function getLastTimestamp()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Returns the blocknumber of the last transaction.\\n * @return Blocknumber for the last transaction.\\n */\\n function getLastBlockNumber()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Get the number of queue elements which have not yet been included.\\n * @return Number of pending queue elements.\\n */\\n function getNumPendingQueueElements()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Retrieves the length of the queue, including\\n * both pending and canonical transactions.\\n * @return Length of the queue.\\n */\\n function getQueueLength()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n\\n /**\\n * Adds a transaction to the queue.\\n * @param _target Target contract to send the transaction to.\\n * @param _gasLimit Gas limit for the given transaction.\\n * @param _data Transaction data.\\n */\\n function enqueue(\\n address _target,\\n uint256 _gasLimit,\\n bytes memory _data\\n )\\n external;\\n\\n /**\\n * Appends a given number of queued transactions as a single batch.\\n * @param _numQueuedTransactions Number of transactions to append.\\n */\\n function appendQueueBatch(\\n uint256 _numQueuedTransactions\\n )\\n external;\\n\\n /**\\n * Allows the sequencer to append a batch of transactions.\\n * @dev This function uses a custom encoding scheme for efficiency reasons.\\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\\n * .param _contexts Array of batch contexts.\\n * .param _transactionDataFields Array of raw transaction data.\\n */\\n function appendSequencerBatch(\\n // uint40 _shouldStartAtElement,\\n // uint24 _totalElementsToAppend,\\n // BatchContext[] _contexts,\\n // bytes[] _transactionDataFields\\n )\\n external;\\n\\n /**\\n * Verifies whether a transaction is included in the chain.\\n * @param _transaction Transaction to verify.\\n * @param _txChainElement Transaction chain element corresponding to the transaction.\\n * @param _batchHeader Header of the batch the transaction was included in.\\n * @param _inclusionProof Inclusion proof for the provided transaction chain element.\\n * @return True if the transaction exists in the CTC, false if not.\\n */\\n function verifyTransaction(\\n Lib_OVMCodec.Transaction memory _transaction,\\n Lib_OVMCodec.TransactionChainElement memory _txChainElement,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _inclusionProof\\n )\\n external\\n view\\n returns (\\n bool\\n );\\n}\\n\",\"keccak256\":\"0xb5e55488a1982841c07cdf5ff475da4789596f111dd48f01b1918ee4c775cf3a\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_ChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title iOVM_ChainStorageContainer\\n */\\ninterface iOVM_ChainStorageContainer {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata()\\n external\\n view\\n returns (\\n bytes27\\n );\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length()\\n external\\n view\\n returns (\\n uint256\\n );\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(\\n bytes32 _object\\n )\\n external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(\\n bytes32 _object,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(\\n uint256 _index\\n )\\n external\\n view\\n returns (\\n bytes32\\n );\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index\\n )\\n external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Marks an index as overwritable, meaing the underlying buffer can start to write values over\\n * any objects before and including the given index.\\n */\\n function setNextOverwritableIndex(\\n uint256 _index\\n )\\n external;\\n}\\n\",\"keccak256\":\"0x2d7973a0ad84c23ec62624d3f1e3aeb198cc72686ff1e6cfa17155556b320c94\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_StateCommitmentChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title iOVM_StateCommitmentChain\\n */\\ninterface iOVM_StateCommitmentChain {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event StateBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n event StateBatchDeleted(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot\\n );\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements()\\n external\\n view\\n returns (\\n uint256 _totalElements\\n );\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches()\\n external\\n view\\n returns (\\n uint256 _totalBatches\\n );\\n\\n /**\\n * Retrieves the timestamp of the last batch submitted by the sequencer.\\n * @return _lastSequencerTimestamp Last sequencer batch timestamp.\\n */\\n function getLastSequencerTimestamp()\\n external\\n view\\n returns (\\n uint256 _lastSequencerTimestamp\\n );\\n\\n /**\\n * Appends a batch of state roots to the chain.\\n * @param _batch Batch of state roots.\\n * @param _shouldStartAtElement Index of the element at which this batch should start.\\n */\\n function appendStateBatch(\\n bytes32[] calldata _batch,\\n uint256 _shouldStartAtElement\\n )\\n external;\\n\\n /**\\n * Deletes all state roots after (and including) a given batch.\\n * @param _batchHeader Header of the batch to start deleting from.\\n */\\n function deleteStateBatch(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n external;\\n\\n /**\\n * Verifies a batch inclusion proof.\\n * @param _element Hash of the element to verify a proof for.\\n * @param _batchHeader Header of the batch in which the element was included.\\n * @param _proof Merkle inclusion proof for the element.\\n */\\n function verifyStateCommitment(\\n bytes32 _element,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _proof\\n )\\n external\\n view\\n returns (\\n bool _verified\\n );\\n\\n /**\\n * Checks whether a given batch is still inside its fraud proof window.\\n * @param _batchHeader Header of the batch to check.\\n * @return _inside Whether or not the batch is inside the fraud proof window.\\n */\\n function insideFraudProofWindow(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n external\\n view\\n returns (\\n bool _inside\\n );\\n}\\n\",\"keccak256\":\"0x6646d6ff392b81aab52a7a277e91540819464751de0af5afd1962094b2e92448\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/codec/Lib_OVMCodec.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../utils/Lib_Bytes32Utils.sol\\\";\\n\\n/**\\n * @title Lib_OVMCodec\\n */\\nlibrary Lib_OVMCodec {\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum QueueOrigin {\\n SEQUENCER_QUEUE,\\n L1TOL2_QUEUE\\n }\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Account {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n address ethAddress;\\n bool isFresh;\\n }\\n\\n struct EVMAccount {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n }\\n\\n struct ChainBatchHeader {\\n uint256 batchIndex;\\n bytes32 batchRoot;\\n uint256 batchSize;\\n uint256 prevTotalElements;\\n bytes extraData;\\n }\\n\\n struct ChainInclusionProof {\\n uint256 index;\\n bytes32[] siblings;\\n }\\n\\n struct Transaction {\\n uint256 timestamp;\\n uint256 blockNumber;\\n QueueOrigin l1QueueOrigin;\\n address l1TxOrigin;\\n address entrypoint;\\n uint256 gasLimit;\\n bytes data;\\n }\\n\\n struct TransactionChainElement {\\n bool isSequenced;\\n uint256 queueIndex; // QUEUED TX ONLY\\n uint256 timestamp; // SEQUENCER TX ONLY\\n uint256 blockNumber; // SEQUENCER TX ONLY\\n bytes txData; // SEQUENCER TX ONLY\\n }\\n\\n struct QueueElement {\\n bytes32 transactionHash;\\n uint40 timestamp;\\n uint40 blockNumber;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Encodes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Encoded transaction bytes.\\n */\\n function encodeTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return abi.encodePacked(\\n _transaction.timestamp,\\n _transaction.blockNumber,\\n _transaction.l1QueueOrigin,\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n );\\n }\\n\\n /**\\n * Hashes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Hashed transaction\\n */\\n function hashTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(encodeTransaction(_transaction));\\n }\\n\\n /**\\n * Converts an OVM account to an EVM account.\\n * @param _in OVM account to convert.\\n * @return Converted EVM account.\\n */\\n function toEVMAccount(\\n Account memory _in\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n return EVMAccount({\\n nonce: _in.nonce,\\n balance: _in.balance,\\n storageRoot: _in.storageRoot,\\n codeHash: _in.codeHash\\n });\\n }\\n\\n /**\\n * @notice RLP-encodes an account state struct.\\n * @param _account Account state struct.\\n * @return RLP-encoded account state.\\n */\\n function encodeEVMAccount(\\n EVMAccount memory _account\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes[] memory raw = new bytes[](4);\\n\\n // Unfortunately we can't create this array outright because\\n // Lib_RLPWriter.writeList will reject fixed-size arrays. Assigning\\n // index-by-index circumvents this issue.\\n raw[0] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.nonce)\\n )\\n );\\n raw[1] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.balance)\\n )\\n );\\n raw[2] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.storageRoot));\\n raw[3] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.codeHash));\\n\\n return Lib_RLPWriter.writeList(raw);\\n }\\n\\n /**\\n * @notice Decodes an RLP-encoded account state into a useful struct.\\n * @param _encoded RLP-encoded account state.\\n * @return Account state struct.\\n */\\n function decodeEVMAccount(\\n bytes memory _encoded\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\\n\\n return EVMAccount({\\n nonce: Lib_RLPReader.readUint256(accountState[0]),\\n balance: Lib_RLPReader.readUint256(accountState[1]),\\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\\n });\\n }\\n\\n /**\\n * Calculates a hash for a given batch header.\\n * @param _batchHeader Header to hash.\\n * @return Hash of the header.\\n */\\n function hashBatchHeader(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(\\n abi.encode(\\n _batchHeader.batchRoot,\\n _batchHeader.batchSize,\\n _batchHeader.prevTotalElements,\\n _batchHeader.extraData\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0xd85ba2066057a2677926f484b938c7c2ef33ff3853f3b71cda252f4a54f30e05\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n public\\n onlyOwner\\n {\\n addresses[_getNameHash(_name)] = _address;\\n\\n emit AddressSet(\\n _name,\\n _address\\n );\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0x2ce671a0e004df88b136bea5a3c59d0732cea8887c8496da1d509e0200b03d7d\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(\\n address _libAddressManager\\n ) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x65981feeabff6a81783ea97d44baf988a18a86c8cb374c46fdb71819cbacc7c0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPReader.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_RLPReader\\n * @dev Adapted from \\\"RLPReader\\\" by Hamdi Allam (hamdi.allam97@gmail.com).\\n */\\nlibrary Lib_RLPReader {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 constant internal MAX_LIST_LENGTH = 32;\\n\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum RLPItemType {\\n DATA_ITEM,\\n LIST_ITEM\\n }\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct RLPItem {\\n uint256 length;\\n uint256 ptr;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts bytes to a reference to memory position and length.\\n * @param _in Input bytes to convert.\\n * @return Output memory reference.\\n */\\n function toRLPItem(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem memory\\n )\\n {\\n uint256 ptr;\\n assembly {\\n ptr := add(_in, 32)\\n }\\n\\n return RLPItem({\\n length: _in.length,\\n ptr: ptr\\n });\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n (\\n uint256 listOffset,\\n ,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.LIST_ITEM,\\n \\\"Invalid RLP list value.\\\"\\n );\\n\\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\\n // writing to the length. Since we can't know the number of RLP items without looping over\\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\\n // simply set a reasonable maximum list length and decrease the size before we finish.\\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\\n\\n uint256 itemCount = 0;\\n uint256 offset = listOffset;\\n while (offset < _in.length) {\\n require(\\n itemCount < MAX_LIST_LENGTH,\\n \\\"Provided RLP list exceeds max list length.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n ) = _decodeLength(RLPItem({\\n length: _in.length - offset,\\n ptr: _in.ptr + offset\\n }));\\n\\n out[itemCount] = RLPItem({\\n length: itemLength + itemOffset,\\n ptr: _in.ptr + offset\\n });\\n\\n itemCount += 1;\\n offset += itemOffset + itemLength;\\n }\\n\\n // Decrease the array size to match the actual item count.\\n assembly {\\n mstore(out, itemCount)\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n return readList(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes value.\\\"\\n );\\n\\n return _copy(_in.ptr, itemOffset, itemLength);\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return readBytes(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return string(readBytes(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return readString(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n require(\\n _in.length <= 33,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr + itemOffset;\\n bytes32 out;\\n assembly {\\n out := mload(ptr)\\n\\n // Shift the bytes over to match the item size.\\n if lt(itemLength, 32) {\\n out := div(out, exp(256, sub(32, itemLength)))\\n }\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return readBytes32(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return uint256(readBytes32(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return readUint256(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n require(\\n _in.length == 1,\\n \\\"Invalid RLP boolean value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 out;\\n assembly {\\n out := byte(0, mload(ptr))\\n }\\n\\n require(\\n out == 0 || out == 1,\\n \\\"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\\\"\\n );\\n\\n return out != 0;\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return readBool(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n if (_in.length == 1) {\\n return address(0);\\n }\\n\\n require(\\n _in.length == 21,\\n \\\"Invalid RLP address value.\\\"\\n );\\n\\n return address(readUint256(_in));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return readAddress(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads the raw bytes of an RLP item.\\n * @param _in RLP item to read.\\n * @return Raw RLP bytes.\\n */\\n function readRawBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in);\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Decodes the length of an RLP item.\\n * @param _in RLP item to decode.\\n * @return Offset of the encoded data.\\n * @return Length of the encoded data.\\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\\n */\\n function _decodeLength(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n uint256,\\n uint256,\\n RLPItemType\\n )\\n {\\n require(\\n _in.length > 0,\\n \\\"RLP item cannot be null.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 prefix;\\n assembly {\\n prefix := byte(0, mload(ptr))\\n }\\n\\n if (prefix <= 0x7f) {\\n // Single byte.\\n\\n return (0, 1, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xb7) {\\n // Short string.\\n\\n uint256 strLen = prefix - 0x80;\\n\\n require(\\n _in.length > strLen,\\n \\\"Invalid RLP short string.\\\"\\n );\\n\\n return (1, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xbf) {\\n // Long string.\\n uint256 lenOfStrLen = prefix - 0xb7;\\n\\n require(\\n _in.length > lenOfStrLen,\\n \\\"Invalid RLP long string length.\\\"\\n );\\n\\n uint256 strLen;\\n assembly {\\n // Pick out the string length.\\n strLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfStrLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfStrLen + strLen,\\n \\\"Invalid RLP long string.\\\"\\n );\\n\\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xf7) {\\n // Short list.\\n uint256 listLen = prefix - 0xc0;\\n\\n require(\\n _in.length > listLen,\\n \\\"Invalid RLP short list.\\\"\\n );\\n\\n return (1, listLen, RLPItemType.LIST_ITEM);\\n } else {\\n // Long list.\\n uint256 lenOfListLen = prefix - 0xf7;\\n\\n require(\\n _in.length > lenOfListLen,\\n \\\"Invalid RLP long list length.\\\"\\n );\\n\\n uint256 listLen;\\n assembly {\\n // Pick out the list length.\\n listLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfListLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfListLen + listLen,\\n \\\"Invalid RLP long list.\\\"\\n );\\n\\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\\n }\\n }\\n\\n /**\\n * Copies the bytes from a memory location.\\n * @param _src Pointer to the location to read from.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Copied bytes.\\n */\\n function _copy(\\n uint256 _src,\\n uint256 _offset,\\n uint256 _length\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out = new bytes(_length);\\n if (out.length == 0) {\\n return out;\\n }\\n\\n uint256 src = _src + _offset;\\n uint256 dest;\\n assembly {\\n dest := add(out, 32)\\n }\\n\\n // Copy over as many complete words as we can.\\n for (uint256 i = 0; i < _length / 32; i++) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n\\n src += 32;\\n dest += 32;\\n }\\n\\n // Pick out the remaining bytes.\\n uint256 mask = 256 ** (32 - (_length % 32)) - 1;\\n assembly {\\n mstore(\\n dest,\\n or(\\n and(mload(src), not(mask)),\\n and(mload(dest), mask)\\n )\\n )\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Copies an RLP item into bytes.\\n * @param _in RLP item to copy.\\n * @return Copied bytes.\\n */\\n function _copy(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in.ptr, 0, _in.length);\\n }\\n}\\n\",\"keccak256\":\"0x829174c61216dce35fdb888383b6022e0365eb7fbdc71ad79d98b108091969fe\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPWriter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/**\\n * @title Lib_RLPWriter\\n * @author Bakaoh (with modifications)\\n */\\nlibrary Lib_RLPWriter {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * RLP encodes a byte string.\\n * @param _in The byte string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded;\\n\\n if (_in.length == 1 && uint8(_in[0]) < 128) {\\n encoded = _in;\\n } else {\\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * RLP encodes a list of RLP encoded byte byte strings.\\n * @param _in The list of RLP encoded byte strings.\\n * @return The RLP encoded list of items in bytes.\\n */\\n function writeList(\\n bytes[] memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory list = _flatten(_in);\\n return abi.encodePacked(_writeLength(list.length, 192), list);\\n }\\n\\n /**\\n * RLP encodes a string.\\n * @param _in The string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeString(\\n string memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(bytes(_in));\\n }\\n\\n /**\\n * RLP encodes an address.\\n * @param _in The address to encode.\\n * @return The RLP encoded address in bytes.\\n */\\n function writeAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a bytes32 value.\\n * @param _in The bytes32 to encode.\\n * @return _out The RLP encoded bytes32 in bytes.\\n */\\n function writeBytes32(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a uint.\\n * @param _in The uint256 to encode.\\n * @return The RLP encoded uint256 in bytes.\\n */\\n function writeUint(\\n uint256 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(_toBinary(_in));\\n }\\n\\n /**\\n * RLP encodes a bool.\\n * @param _in The bool to encode.\\n * @return The RLP encoded bool in bytes.\\n */\\n function writeBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded = new bytes(1);\\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\\n return encoded;\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\\n * @param _len The length of the string or the payload.\\n * @param _offset 128 if item is string, 192 if item is list.\\n * @return RLP encoded bytes.\\n */\\n function _writeLength(\\n uint256 _len,\\n uint256 _offset\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded;\\n\\n if (_len < 56) {\\n encoded = new bytes(1);\\n encoded[0] = byte(uint8(_len) + uint8(_offset));\\n } else {\\n uint256 lenLen;\\n uint256 i = 1;\\n while (_len / i != 0) {\\n lenLen++;\\n i *= 256;\\n }\\n\\n encoded = new bytes(lenLen + 1);\\n encoded[0] = byte(uint8(lenLen) + uint8(_offset) + 55);\\n for(i = 1; i <= lenLen; i++) {\\n encoded[i] = byte(uint8((_len / (256**(lenLen-i))) % 256));\\n }\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * Encode integer in big endian binary form with no leading zeroes.\\n * @notice TODO: This should be optimized with assembly to save gas costs.\\n * @param _x The integer to encode.\\n * @return RLP encoded bytes.\\n */\\n function _toBinary(\\n uint256 _x\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory b = abi.encodePacked(_x);\\n\\n uint256 i = 0;\\n for (; i < 32; i++) {\\n if (b[i] != 0) {\\n break;\\n }\\n }\\n\\n bytes memory res = new bytes(32 - i);\\n for (uint256 j = 0; j < res.length; j++) {\\n res[j] = b[i++];\\n }\\n\\n return res;\\n }\\n\\n /**\\n * Copies a piece of memory to another location.\\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\\n * @param _dest Destination location.\\n * @param _src Source location.\\n * @param _len Length of memory to copy.\\n */\\n function _memcpy(\\n uint256 _dest,\\n uint256 _src,\\n uint256 _len\\n )\\n private\\n pure\\n {\\n uint256 dest = _dest;\\n uint256 src = _src;\\n uint256 len = _len;\\n\\n for(; len >= 32; len -= 32) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n dest += 32;\\n src += 32;\\n }\\n\\n uint256 mask = 256 ** (32 - len) - 1;\\n assembly {\\n let srcpart := and(mload(src), not(mask))\\n let destpart := and(mload(dest), mask)\\n mstore(dest, or(destpart, srcpart))\\n }\\n }\\n\\n /**\\n * Flattens a list of byte strings into one byte string.\\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\\n * @param _list List of byte strings to flatten.\\n * @return The flattened byte string.\\n */\\n function _flatten(\\n bytes[] memory _list\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n if (_list.length == 0) {\\n return new bytes(0);\\n }\\n\\n uint256 len;\\n uint256 i = 0;\\n for (; i < _list.length; i++) {\\n len += _list[i].length;\\n }\\n\\n bytes memory flattened = new bytes(len);\\n uint256 flattenedPtr;\\n assembly { flattenedPtr := add(flattened, 0x20) }\\n\\n for(i = 0; i < _list.length; i++) {\\n bytes memory item = _list[i];\\n\\n uint256 listPtr;\\n assembly { listPtr := add(item, 0x20)}\\n\\n _memcpy(flattenedPtr, listPtr, item.length);\\n flattenedPtr += _list[i].length;\\n }\\n\\n return flattened;\\n }\\n}\\n\",\"keccak256\":\"0xb60ee4b03ad372c3deff21d454ab714dd0c18ee3e6f9d45532e209fc59d5a54d\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/trie/Lib_MerkleTrie.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\n\\n/**\\n * @title Lib_MerkleTrie\\n */\\nlibrary Lib_MerkleTrie {\\n\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n enum NodeType {\\n BranchNode,\\n ExtensionNode,\\n LeafNode\\n }\\n\\n struct TrieNode {\\n bytes encoded;\\n Lib_RLPReader.RLPItem[] decoded;\\n }\\n\\n\\n /**********************\\n * Contract Constants *\\n **********************/\\n\\n // TREE_RADIX determines the number of elements per branch node.\\n uint256 constant TREE_RADIX = 16;\\n // Branch nodes have TREE_RADIX elements plus an additional `value` slot.\\n uint256 constant BRANCH_NODE_LENGTH = TREE_RADIX + 1;\\n // Leaf nodes and extension nodes always have two elements, a `path` and a `value`.\\n uint256 constant LEAF_OR_EXTENSION_NODE_LENGTH = 2;\\n\\n // Prefixes are prepended to the `path` within a leaf or extension node and\\n // allow us to differentiate between the two node types. `ODD` or `EVEN` is\\n // determined by the number of nibbles within the unprefixed `path`. If the\\n // number of nibbles if even, we need to insert an extra padding nibble so\\n // the resulting prefixed `path` has an even number of nibbles.\\n uint8 constant PREFIX_EXTENSION_EVEN = 0;\\n uint8 constant PREFIX_EXTENSION_ODD = 1;\\n uint8 constant PREFIX_LEAF_EVEN = 2;\\n uint8 constant PREFIX_LEAF_ODD = 3;\\n\\n // Just a utility constant. RLP represents `NULL` as 0x80.\\n bytes1 constant RLP_NULL = bytes1(0x80);\\n bytes constant RLP_NULL_BYTES = hex'80';\\n bytes32 constant internal KECCAK256_RLP_NULL_BYTES = keccak256(RLP_NULL_BYTES);\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * @notice Verifies a proof that a given key/value pair is present in the\\n * Merkle trie.\\n * @param _key Key of the node to search for, as a hex string.\\n * @param _value Value of the node to search for, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the desired node. Unlike\\n * traditional Merkle trees, this proof is executed top-down and consists\\n * of a list of RLP-encoded nodes that make a path down to the target node.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _verified `true` if the k/v pair exists in the trie, `false` otherwise.\\n */\\n function verifyInclusionProof(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bool _verified\\n )\\n {\\n (\\n bool exists,\\n bytes memory value\\n ) = get(_key, _proof, _root);\\n\\n return (\\n exists && Lib_BytesUtils.equal(_value, value)\\n );\\n }\\n\\n /**\\n * @notice Verifies a proof that a given key is *not* present in\\n * the Merkle trie.\\n * @param _key Key of the node to search for, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\\n * target node.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _verified `true` if the key is absent in the trie, `false` otherwise.\\n */\\n function verifyExclusionProof(\\n bytes memory _key,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bool _verified\\n )\\n {\\n (\\n bool exists,\\n ) = get(_key, _proof, _root);\\n\\n return exists == false;\\n }\\n\\n /**\\n * @notice Updates a Merkle trie and returns a new root hash.\\n * @param _key Key of the node to update, as a hex string.\\n * @param _value Value of the node to update, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\\n * target node. If the key exists, we can simply update the value.\\n * Otherwise, we need to modify the trie to handle the new k/v pair.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _updatedRoot Root hash of the newly constructed trie.\\n */\\n function update(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bytes32 _updatedRoot\\n )\\n {\\n // Special case when inserting the very first node.\\n if (_root == KECCAK256_RLP_NULL_BYTES) {\\n return getSingleNodeRootHash(_key, _value);\\n }\\n\\n TrieNode[] memory proof = _parseProof(_proof);\\n (uint256 pathLength, bytes memory keyRemainder, ) = _walkNodePath(proof, _key, _root);\\n TrieNode[] memory newPath = _getNewPath(proof, pathLength, keyRemainder, _value);\\n\\n return _getUpdatedTrieRoot(newPath, _key);\\n }\\n\\n /**\\n * @notice Retrieves the value associated with a given key.\\n * @param _key Key to search for, as hex bytes.\\n * @param _proof Merkle trie inclusion proof for the key.\\n * @param _root Known root of the Merkle trie.\\n * @return _exists Whether or not the key exists.\\n * @return _value Value of the key if it exists.\\n */\\n function get(\\n bytes memory _key,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bool _exists,\\n bytes memory _value\\n )\\n {\\n TrieNode[] memory proof = _parseProof(_proof);\\n (uint256 pathLength, bytes memory keyRemainder, bool isFinalNode) = _walkNodePath(proof, _key, _root);\\n\\n bool exists = keyRemainder.length == 0;\\n\\n require(\\n exists || isFinalNode,\\n \\\"Provided proof is invalid.\\\"\\n );\\n\\n bytes memory value = exists ? _getNodeValue(proof[pathLength - 1]) : bytes('');\\n\\n return (\\n exists,\\n value\\n );\\n }\\n\\n /**\\n * Computes the root hash for a trie with a single node.\\n * @param _key Key for the single node.\\n * @param _value Value for the single node.\\n * @return _updatedRoot Hash of the trie.\\n */\\n function getSingleNodeRootHash(\\n bytes memory _key,\\n bytes memory _value\\n )\\n internal\\n pure\\n returns (\\n bytes32 _updatedRoot\\n )\\n {\\n return keccak256(_makeLeafNode(\\n Lib_BytesUtils.toNibbles(_key),\\n _value\\n ).encoded);\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * @notice Walks through a proof using a provided key.\\n * @param _proof Inclusion proof to walk through.\\n * @param _key Key to use for the walk.\\n * @param _root Known root of the trie.\\n * @return _pathLength Length of the final path\\n * @return _keyRemainder Portion of the key remaining after the walk.\\n * @return _isFinalNode Whether or not we've hit a dead end.\\n */\\n function _walkNodePath(\\n TrieNode[] memory _proof,\\n bytes memory _key,\\n bytes32 _root\\n )\\n private\\n pure\\n returns (\\n uint256 _pathLength,\\n bytes memory _keyRemainder,\\n bool _isFinalNode\\n )\\n {\\n uint256 pathLength = 0;\\n bytes memory key = Lib_BytesUtils.toNibbles(_key);\\n\\n bytes32 currentNodeID = _root;\\n uint256 currentKeyIndex = 0;\\n uint256 currentKeyIncrement = 0;\\n TrieNode memory currentNode;\\n\\n // Proof is top-down, so we start at the first element (root).\\n for (uint256 i = 0; i < _proof.length; i++) {\\n currentNode = _proof[i];\\n currentKeyIndex += currentKeyIncrement;\\n\\n // Keep track of the proof elements we actually need.\\n // It's expensive to resize arrays, so this simply reduces gas costs.\\n pathLength += 1;\\n\\n if (currentKeyIndex == 0) {\\n // First proof element is always the root node.\\n require(\\n keccak256(currentNode.encoded) == currentNodeID,\\n \\\"Invalid root hash\\\"\\n );\\n } else if (currentNode.encoded.length >= 32) {\\n // Nodes 32 bytes or larger are hashed inside branch nodes.\\n require(\\n keccak256(currentNode.encoded) == currentNodeID,\\n \\\"Invalid large internal hash\\\"\\n );\\n } else {\\n // Nodes smaller than 31 bytes aren't hashed.\\n require(\\n Lib_BytesUtils.toBytes32(currentNode.encoded) == currentNodeID,\\n \\\"Invalid internal node hash\\\"\\n );\\n }\\n\\n if (currentNode.decoded.length == BRANCH_NODE_LENGTH) {\\n if (currentKeyIndex == key.length) {\\n // We've hit the end of the key, meaning the value should be within this branch node.\\n break;\\n } else {\\n // We're not at the end of the key yet.\\n // Figure out what the next node ID should be and continue.\\n uint8 branchKey = uint8(key[currentKeyIndex]);\\n Lib_RLPReader.RLPItem memory nextNode = currentNode.decoded[branchKey];\\n currentNodeID = _getNodeID(nextNode);\\n currentKeyIncrement = 1;\\n continue;\\n }\\n } else if (currentNode.decoded.length == LEAF_OR_EXTENSION_NODE_LENGTH) {\\n bytes memory path = _getNodePath(currentNode);\\n uint8 prefix = uint8(path[0]);\\n uint8 offset = 2 - prefix % 2;\\n bytes memory pathRemainder = Lib_BytesUtils.slice(path, offset);\\n bytes memory keyRemainder = Lib_BytesUtils.slice(key, currentKeyIndex);\\n uint256 sharedNibbleLength = _getSharedNibbleLength(pathRemainder, keyRemainder);\\n\\n if (prefix == PREFIX_LEAF_EVEN || prefix == PREFIX_LEAF_ODD) {\\n if (\\n pathRemainder.length == sharedNibbleLength &&\\n keyRemainder.length == sharedNibbleLength\\n ) {\\n // The key within this leaf matches our key exactly.\\n // Increment the key index to reflect that we have no remainder.\\n currentKeyIndex += sharedNibbleLength;\\n }\\n\\n // We've hit a leaf node, so our next node should be NULL.\\n currentNodeID = bytes32(RLP_NULL);\\n break;\\n } else if (prefix == PREFIX_EXTENSION_EVEN || prefix == PREFIX_EXTENSION_ODD) {\\n if (sharedNibbleLength == 0) {\\n // Our extension node doesn't share any part of our key.\\n // We've hit the end of this path, updates will need to modify this extension.\\n currentNodeID = bytes32(RLP_NULL);\\n break;\\n } else {\\n // Our extension shares some nibbles.\\n // Carry on to the next node.\\n currentNodeID = _getNodeID(currentNode.decoded[1]);\\n currentKeyIncrement = sharedNibbleLength;\\n continue;\\n }\\n } else {\\n revert(\\\"Received a node with an unknown prefix\\\");\\n }\\n } else {\\n revert(\\\"Received an unparseable node.\\\");\\n }\\n }\\n\\n // If our node ID is NULL, then we're at a dead end.\\n bool isFinalNode = currentNodeID == bytes32(RLP_NULL);\\n return (pathLength, Lib_BytesUtils.slice(key, currentKeyIndex), isFinalNode);\\n }\\n\\n /**\\n * @notice Creates new nodes to support a k/v pair insertion into a given\\n * Merkle trie path.\\n * @param _path Path to the node nearest the k/v pair.\\n * @param _pathLength Length of the path. Necessary because the provided\\n * path may include additional nodes (e.g., it comes directly from a proof)\\n * and we can't resize in-memory arrays without costly duplication.\\n * @param _keyRemainder Portion of the initial key that must be inserted\\n * into the trie.\\n * @param _value Value to insert at the given key.\\n * @return _newPath A new path with the inserted k/v pair and extra supporting nodes.\\n */\\n function _getNewPath(\\n TrieNode[] memory _path,\\n uint256 _pathLength,\\n bytes memory _keyRemainder,\\n bytes memory _value\\n )\\n private\\n pure\\n returns (\\n TrieNode[] memory _newPath\\n )\\n {\\n bytes memory keyRemainder = _keyRemainder;\\n\\n // Most of our logic depends on the status of the last node in the path.\\n TrieNode memory lastNode = _path[_pathLength - 1];\\n NodeType lastNodeType = _getNodeType(lastNode);\\n\\n // Create an array for newly created nodes.\\n // We need up to three new nodes, depending on the contents of the last node.\\n // Since array resizing is expensive, we'll keep track of the size manually.\\n // We're using an explicit `totalNewNodes += 1` after insertions for clarity.\\n TrieNode[] memory newNodes = new TrieNode[](3);\\n uint256 totalNewNodes = 0;\\n\\n if (keyRemainder.length == 0 && lastNodeType == NodeType.LeafNode) {\\n // We've found a leaf node with the given key.\\n // Simply need to update the value of the node to match.\\n newNodes[totalNewNodes] = _makeLeafNode(_getNodeKey(lastNode), _value);\\n totalNewNodes += 1;\\n } else if (lastNodeType == NodeType.BranchNode) {\\n if (keyRemainder.length == 0) {\\n // We've found a branch node with the given key.\\n // Simply need to update the value of the node to match.\\n newNodes[totalNewNodes] = _editBranchValue(lastNode, _value);\\n totalNewNodes += 1;\\n } else {\\n // We've found a branch node, but it doesn't contain our key.\\n // Reinsert the old branch for now.\\n newNodes[totalNewNodes] = lastNode;\\n totalNewNodes += 1;\\n // Create a new leaf node, slicing our remainder since the first byte points\\n // to our branch node.\\n newNodes[totalNewNodes] = _makeLeafNode(Lib_BytesUtils.slice(keyRemainder, 1), _value);\\n totalNewNodes += 1;\\n }\\n } else {\\n // Our last node is either an extension node or a leaf node with a different key.\\n bytes memory lastNodeKey = _getNodeKey(lastNode);\\n uint256 sharedNibbleLength = _getSharedNibbleLength(lastNodeKey, keyRemainder);\\n\\n if (sharedNibbleLength != 0) {\\n // We've got some shared nibbles between the last node and our key remainder.\\n // We'll need to insert an extension node that covers these shared nibbles.\\n bytes memory nextNodeKey = Lib_BytesUtils.slice(lastNodeKey, 0, sharedNibbleLength);\\n newNodes[totalNewNodes] = _makeExtensionNode(nextNodeKey, _getNodeHash(_value));\\n totalNewNodes += 1;\\n\\n // Cut down the keys since we've just covered these shared nibbles.\\n lastNodeKey = Lib_BytesUtils.slice(lastNodeKey, sharedNibbleLength);\\n keyRemainder = Lib_BytesUtils.slice(keyRemainder, sharedNibbleLength);\\n }\\n\\n // Create an empty branch to fill in.\\n TrieNode memory newBranch = _makeEmptyBranchNode();\\n\\n if (lastNodeKey.length == 0) {\\n // Key remainder was larger than the key for our last node.\\n // The value within our last node is therefore going to be shifted into\\n // a branch value slot.\\n newBranch = _editBranchValue(newBranch, _getNodeValue(lastNode));\\n } else {\\n // Last node key was larger than the key remainder.\\n // We're going to modify some index of our branch.\\n uint8 branchKey = uint8(lastNodeKey[0]);\\n // Move on to the next nibble.\\n lastNodeKey = Lib_BytesUtils.slice(lastNodeKey, 1);\\n\\n if (lastNodeType == NodeType.LeafNode) {\\n // We're dealing with a leaf node.\\n // We'll modify the key and insert the old leaf node into the branch index.\\n TrieNode memory modifiedLastNode = _makeLeafNode(lastNodeKey, _getNodeValue(lastNode));\\n newBranch = _editBranchIndex(newBranch, branchKey, _getNodeHash(modifiedLastNode.encoded));\\n } else if (lastNodeKey.length != 0) {\\n // We're dealing with a shrinking extension node.\\n // We need to modify the node to decrease the size of the key.\\n TrieNode memory modifiedLastNode = _makeExtensionNode(lastNodeKey, _getNodeValue(lastNode));\\n newBranch = _editBranchIndex(newBranch, branchKey, _getNodeHash(modifiedLastNode.encoded));\\n } else {\\n // We're dealing with an unnecessary extension node.\\n // We're going to delete the node entirely.\\n // Simply insert its current value into the branch index.\\n newBranch = _editBranchIndex(newBranch, branchKey, _getNodeValue(lastNode));\\n }\\n }\\n\\n if (keyRemainder.length == 0) {\\n // We've got nothing left in the key remainder.\\n // Simply insert the value into the branch value slot.\\n newBranch = _editBranchValue(newBranch, _value);\\n // Push the branch into the list of new nodes.\\n newNodes[totalNewNodes] = newBranch;\\n totalNewNodes += 1;\\n } else {\\n // We've got some key remainder to work with.\\n // We'll be inserting a leaf node into the trie.\\n // First, move on to the next nibble.\\n keyRemainder = Lib_BytesUtils.slice(keyRemainder, 1);\\n // Push the branch into the list of new nodes.\\n newNodes[totalNewNodes] = newBranch;\\n totalNewNodes += 1;\\n // Push a new leaf node for our k/v pair.\\n newNodes[totalNewNodes] = _makeLeafNode(keyRemainder, _value);\\n totalNewNodes += 1;\\n }\\n }\\n\\n // Finally, join the old path with our newly created nodes.\\n // Since we're overwriting the last node in the path, we use `_pathLength - 1`.\\n return _joinNodeArrays(_path, _pathLength - 1, newNodes, totalNewNodes);\\n }\\n\\n /**\\n * @notice Computes the trie root from a given path.\\n * @param _nodes Path to some k/v pair.\\n * @param _key Key for the k/v pair.\\n * @return _updatedRoot Root hash for the updated trie.\\n */\\n function _getUpdatedTrieRoot(\\n TrieNode[] memory _nodes,\\n bytes memory _key\\n )\\n private\\n pure\\n returns (\\n bytes32 _updatedRoot\\n )\\n {\\n bytes memory key = Lib_BytesUtils.toNibbles(_key);\\n\\n // Some variables to keep track of during iteration.\\n TrieNode memory currentNode;\\n NodeType currentNodeType;\\n bytes memory previousNodeHash;\\n\\n // Run through the path backwards to rebuild our root hash.\\n for (uint256 i = _nodes.length; i > 0; i--) {\\n // Pick out the current node.\\n currentNode = _nodes[i - 1];\\n currentNodeType = _getNodeType(currentNode);\\n\\n if (currentNodeType == NodeType.LeafNode) {\\n // Leaf nodes are already correctly encoded.\\n // Shift the key over to account for the nodes key.\\n bytes memory nodeKey = _getNodeKey(currentNode);\\n key = Lib_BytesUtils.slice(key, 0, key.length - nodeKey.length);\\n } else if (currentNodeType == NodeType.ExtensionNode) {\\n // Shift the key over to account for the nodes key.\\n bytes memory nodeKey = _getNodeKey(currentNode);\\n key = Lib_BytesUtils.slice(key, 0, key.length - nodeKey.length);\\n\\n // If this node is the last element in the path, it'll be correctly encoded\\n // and we can skip this part.\\n if (previousNodeHash.length > 0) {\\n // Re-encode the node based on the previous node.\\n currentNode = _makeExtensionNode(nodeKey, previousNodeHash);\\n }\\n } else if (currentNodeType == NodeType.BranchNode) {\\n // If this node is the last element in the path, it'll be correctly encoded\\n // and we can skip this part.\\n if (previousNodeHash.length > 0) {\\n // Re-encode the node based on the previous node.\\n uint8 branchKey = uint8(key[key.length - 1]);\\n key = Lib_BytesUtils.slice(key, 0, key.length - 1);\\n currentNode = _editBranchIndex(currentNode, branchKey, previousNodeHash);\\n }\\n }\\n\\n // Compute the node hash for the next iteration.\\n previousNodeHash = _getNodeHash(currentNode.encoded);\\n }\\n\\n // Current node should be the root at this point.\\n // Simply return the hash of its encoding.\\n return keccak256(currentNode.encoded);\\n }\\n\\n /**\\n * @notice Parses an RLP-encoded proof into something more useful.\\n * @param _proof RLP-encoded proof to parse.\\n * @return _parsed Proof parsed into easily accessible structs.\\n */\\n function _parseProof(\\n bytes memory _proof\\n )\\n private\\n pure\\n returns (\\n TrieNode[] memory _parsed\\n )\\n {\\n Lib_RLPReader.RLPItem[] memory nodes = Lib_RLPReader.readList(_proof);\\n TrieNode[] memory proof = new TrieNode[](nodes.length);\\n\\n for (uint256 i = 0; i < nodes.length; i++) {\\n bytes memory encoded = Lib_RLPReader.readBytes(nodes[i]);\\n proof[i] = TrieNode({\\n encoded: encoded,\\n decoded: Lib_RLPReader.readList(encoded)\\n });\\n }\\n\\n return proof;\\n }\\n\\n /**\\n * @notice Picks out the ID for a node. Node ID is referred to as the\\n * \\\"hash\\\" within the specification, but nodes < 32 bytes are not actually\\n * hashed.\\n * @param _node Node to pull an ID for.\\n * @return _nodeID ID for the node, depending on the size of its contents.\\n */\\n function _getNodeID(\\n Lib_RLPReader.RLPItem memory _node\\n )\\n private\\n pure\\n returns (\\n bytes32 _nodeID\\n )\\n {\\n bytes memory nodeID;\\n\\n if (_node.length < 32) {\\n // Nodes smaller than 32 bytes are RLP encoded.\\n nodeID = Lib_RLPReader.readRawBytes(_node);\\n } else {\\n // Nodes 32 bytes or larger are hashed.\\n nodeID = Lib_RLPReader.readBytes(_node);\\n }\\n\\n return Lib_BytesUtils.toBytes32(nodeID);\\n }\\n\\n /**\\n * @notice Gets the path for a leaf or extension node.\\n * @param _node Node to get a path for.\\n * @return _path Node path, converted to an array of nibbles.\\n */\\n function _getNodePath(\\n TrieNode memory _node\\n )\\n private\\n pure\\n returns (\\n bytes memory _path\\n )\\n {\\n return Lib_BytesUtils.toNibbles(Lib_RLPReader.readBytes(_node.decoded[0]));\\n }\\n\\n /**\\n * @notice Gets the key for a leaf or extension node. Keys are essentially\\n * just paths without any prefix.\\n * @param _node Node to get a key for.\\n * @return _key Node key, converted to an array of nibbles.\\n */\\n function _getNodeKey(\\n TrieNode memory _node\\n )\\n private\\n pure\\n returns (\\n bytes memory _key\\n )\\n {\\n return _removeHexPrefix(_getNodePath(_node));\\n }\\n\\n /**\\n * @notice Gets the path for a node.\\n * @param _node Node to get a value for.\\n * @return _value Node value, as hex bytes.\\n */\\n function _getNodeValue(\\n TrieNode memory _node\\n )\\n private\\n pure\\n returns (\\n bytes memory _value\\n )\\n {\\n return Lib_RLPReader.readBytes(_node.decoded[_node.decoded.length - 1]);\\n }\\n\\n /**\\n * @notice Computes the node hash for an encoded node. Nodes < 32 bytes\\n * are not hashed, all others are keccak256 hashed.\\n * @param _encoded Encoded node to hash.\\n * @return _hash Hash of the encoded node. Simply the input if < 32 bytes.\\n */\\n function _getNodeHash(\\n bytes memory _encoded\\n )\\n private\\n pure\\n returns (\\n bytes memory _hash\\n )\\n {\\n if (_encoded.length < 32) {\\n return _encoded;\\n } else {\\n return abi.encodePacked(keccak256(_encoded));\\n }\\n }\\n\\n /**\\n * @notice Determines the type for a given node.\\n * @param _node Node to determine a type for.\\n * @return _type Type of the node; BranchNode/ExtensionNode/LeafNode.\\n */\\n function _getNodeType(\\n TrieNode memory _node\\n )\\n private\\n pure\\n returns (\\n NodeType _type\\n )\\n {\\n if (_node.decoded.length == BRANCH_NODE_LENGTH) {\\n return NodeType.BranchNode;\\n } else if (_node.decoded.length == LEAF_OR_EXTENSION_NODE_LENGTH) {\\n bytes memory path = _getNodePath(_node);\\n uint8 prefix = uint8(path[0]);\\n\\n if (prefix == PREFIX_LEAF_EVEN || prefix == PREFIX_LEAF_ODD) {\\n return NodeType.LeafNode;\\n } else if (prefix == PREFIX_EXTENSION_EVEN || prefix == PREFIX_EXTENSION_ODD) {\\n return NodeType.ExtensionNode;\\n }\\n }\\n\\n revert(\\\"Invalid node type\\\");\\n }\\n\\n /**\\n * @notice Utility; determines the number of nibbles shared between two\\n * nibble arrays.\\n * @param _a First nibble array.\\n * @param _b Second nibble array.\\n * @return _shared Number of shared nibbles.\\n */\\n function _getSharedNibbleLength(\\n bytes memory _a,\\n bytes memory _b\\n )\\n private\\n pure\\n returns (\\n uint256 _shared\\n )\\n {\\n uint256 i = 0;\\n while (_a.length > i && _b.length > i && _a[i] == _b[i]) {\\n i++;\\n }\\n return i;\\n }\\n\\n /**\\n * @notice Utility; converts an RLP-encoded node into our nice struct.\\n * @param _raw RLP-encoded node to convert.\\n * @return _node Node as a TrieNode struct.\\n */\\n function _makeNode(\\n bytes[] memory _raw\\n )\\n private\\n pure\\n returns (\\n TrieNode memory _node\\n )\\n {\\n bytes memory encoded = Lib_RLPWriter.writeList(_raw);\\n\\n return TrieNode({\\n encoded: encoded,\\n decoded: Lib_RLPReader.readList(encoded)\\n });\\n }\\n\\n /**\\n * @notice Utility; converts an RLP-decoded node into our nice struct.\\n * @param _items RLP-decoded node to convert.\\n * @return _node Node as a TrieNode struct.\\n */\\n function _makeNode(\\n Lib_RLPReader.RLPItem[] memory _items\\n )\\n private\\n pure\\n returns (\\n TrieNode memory _node\\n )\\n {\\n bytes[] memory raw = new bytes[](_items.length);\\n for (uint256 i = 0; i < _items.length; i++) {\\n raw[i] = Lib_RLPReader.readRawBytes(_items[i]);\\n }\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Creates a new extension node.\\n * @param _key Key for the extension node, unprefixed.\\n * @param _value Value for the extension node.\\n * @return _node New extension node with the given k/v pair.\\n */\\n function _makeExtensionNode(\\n bytes memory _key,\\n bytes memory _value\\n )\\n private\\n pure\\n returns (\\n TrieNode memory _node\\n )\\n {\\n bytes[] memory raw = new bytes[](2);\\n bytes memory key = _addHexPrefix(_key, false);\\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\\n raw[1] = Lib_RLPWriter.writeBytes(_value);\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Creates a new leaf node.\\n * @dev This function is essentially identical to `_makeExtensionNode`.\\n * Although we could route both to a single method with a flag, it's\\n * more gas efficient to keep them separate and duplicate the logic.\\n * @param _key Key for the leaf node, unprefixed.\\n * @param _value Value for the leaf node.\\n * @return _node New leaf node with the given k/v pair.\\n */\\n function _makeLeafNode(\\n bytes memory _key,\\n bytes memory _value\\n )\\n private\\n pure\\n returns (\\n TrieNode memory _node\\n )\\n {\\n bytes[] memory raw = new bytes[](2);\\n bytes memory key = _addHexPrefix(_key, true);\\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\\n raw[1] = Lib_RLPWriter.writeBytes(_value);\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Creates an empty branch node.\\n * @return _node Empty branch node as a TrieNode struct.\\n */\\n function _makeEmptyBranchNode()\\n private\\n pure\\n returns (\\n TrieNode memory _node\\n )\\n {\\n bytes[] memory raw = new bytes[](BRANCH_NODE_LENGTH);\\n for (uint256 i = 0; i < raw.length; i++) {\\n raw[i] = RLP_NULL_BYTES;\\n }\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Modifies the value slot for a given branch.\\n * @param _branch Branch node to modify.\\n * @param _value Value to insert into the branch.\\n * @return _updatedNode Modified branch node.\\n */\\n function _editBranchValue(\\n TrieNode memory _branch,\\n bytes memory _value\\n )\\n private\\n pure\\n returns (\\n TrieNode memory _updatedNode\\n )\\n {\\n bytes memory encoded = Lib_RLPWriter.writeBytes(_value);\\n _branch.decoded[_branch.decoded.length - 1] = Lib_RLPReader.toRLPItem(encoded);\\n return _makeNode(_branch.decoded);\\n }\\n\\n /**\\n * @notice Modifies a slot at an index for a given branch.\\n * @param _branch Branch node to modify.\\n * @param _index Slot index to modify.\\n * @param _value Value to insert into the slot.\\n * @return _updatedNode Modified branch node.\\n */\\n function _editBranchIndex(\\n TrieNode memory _branch,\\n uint8 _index,\\n bytes memory _value\\n )\\n private\\n pure\\n returns (\\n TrieNode memory _updatedNode\\n )\\n {\\n bytes memory encoded = _value.length < 32 ? _value : Lib_RLPWriter.writeBytes(_value);\\n _branch.decoded[_index] = Lib_RLPReader.toRLPItem(encoded);\\n return _makeNode(_branch.decoded);\\n }\\n\\n /**\\n * @notice Utility; adds a prefix to a key.\\n * @param _key Key to prefix.\\n * @param _isLeaf Whether or not the key belongs to a leaf.\\n * @return _prefixedKey Prefixed key.\\n */\\n function _addHexPrefix(\\n bytes memory _key,\\n bool _isLeaf\\n )\\n private\\n pure\\n returns (\\n bytes memory _prefixedKey\\n )\\n {\\n uint8 prefix = _isLeaf ? uint8(0x02) : uint8(0x00);\\n uint8 offset = uint8(_key.length % 2);\\n bytes memory prefixed = new bytes(2 - offset);\\n prefixed[0] = bytes1(prefix + offset);\\n return abi.encodePacked(prefixed, _key);\\n }\\n\\n /**\\n * @notice Utility; removes a prefix from a path.\\n * @param _path Path to remove the prefix from.\\n * @return _unprefixedKey Unprefixed key.\\n */\\n function _removeHexPrefix(\\n bytes memory _path\\n )\\n private\\n pure\\n returns (\\n bytes memory _unprefixedKey\\n )\\n {\\n if (uint8(_path[0]) % 2 == 0) {\\n return Lib_BytesUtils.slice(_path, 2);\\n } else {\\n return Lib_BytesUtils.slice(_path, 1);\\n }\\n }\\n\\n /**\\n * @notice Utility; combines two node arrays. Array lengths are required\\n * because the actual lengths may be longer than the filled lengths.\\n * Array resizing is extremely costly and should be avoided.\\n * @param _a First array to join.\\n * @param _aLength Length of the first array.\\n * @param _b Second array to join.\\n * @param _bLength Length of the second array.\\n * @return _joined Combined node array.\\n */\\n function _joinNodeArrays(\\n TrieNode[] memory _a,\\n uint256 _aLength,\\n TrieNode[] memory _b,\\n uint256 _bLength\\n )\\n private\\n pure\\n returns (\\n TrieNode[] memory _joined\\n )\\n {\\n TrieNode[] memory ret = new TrieNode[](_aLength + _bLength);\\n\\n // Copy elements from the first array.\\n for (uint256 i = 0; i < _aLength; i++) {\\n ret[i] = _a[i];\\n }\\n\\n // Copy elements from the second array.\\n for (uint256 i = 0; i < _bLength; i++) {\\n ret[i + _aLength] = _b[i];\\n }\\n\\n return ret;\\n }\\n}\\n\",\"keccak256\":\"0x161f65220b8c5cf295232f8c58c2744fbc898bf77da5f9d9c5b2dd673dafc6f6\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/trie/Lib_SecureMerkleTrie.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_MerkleTrie } from \\\"./Lib_MerkleTrie.sol\\\";\\n\\n/**\\n * @title Lib_SecureMerkleTrie\\n */\\nlibrary Lib_SecureMerkleTrie {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * @notice Verifies a proof that a given key/value pair is present in the\\n * Merkle trie.\\n * @param _key Key of the node to search for, as a hex string.\\n * @param _value Value of the node to search for, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the desired node. Unlike\\n * traditional Merkle trees, this proof is executed top-down and consists\\n * of a list of RLP-encoded nodes that make a path down to the target node.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _verified `true` if the k/v pair exists in the trie, `false` otherwise.\\n */\\n function verifyInclusionProof(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bool _verified\\n )\\n {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.verifyInclusionProof(key, _value, _proof, _root);\\n }\\n\\n /**\\n * @notice Verifies a proof that a given key is *not* present in\\n * the Merkle trie.\\n * @param _key Key of the node to search for, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\\n * target node.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _verified `true` if the key is not present in the trie, `false` otherwise.\\n */\\n function verifyExclusionProof(\\n bytes memory _key,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bool _verified\\n )\\n {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.verifyExclusionProof(key, _proof, _root);\\n }\\n\\n /**\\n * @notice Updates a Merkle trie and returns a new root hash.\\n * @param _key Key of the node to update, as a hex string.\\n * @param _value Value of the node to update, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\\n * target node. If the key exists, we can simply update the value.\\n * Otherwise, we need to modify the trie to handle the new k/v pair.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _updatedRoot Root hash of the newly constructed trie.\\n */\\n function update(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bytes32 _updatedRoot\\n )\\n {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.update(key, _value, _proof, _root);\\n }\\n\\n /**\\n * @notice Retrieves the value associated with a given key.\\n * @param _key Key to search for, as hex bytes.\\n * @param _proof Merkle trie inclusion proof for the key.\\n * @param _root Known root of the Merkle trie.\\n * @return _exists Whether or not the key exists.\\n * @return _value Value of the key if it exists.\\n */\\n function get(\\n bytes memory _key,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bool _exists,\\n bytes memory _value\\n )\\n {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.get(key, _proof, _root);\\n }\\n\\n /**\\n * Computes the root hash for a trie with a single node.\\n * @param _key Key for the single node.\\n * @param _value Value for the single node.\\n * @return _updatedRoot Hash of the trie.\\n */\\n function getSingleNodeRootHash(\\n bytes memory _key,\\n bytes memory _value\\n )\\n internal\\n pure\\n returns (\\n bytes32 _updatedRoot\\n )\\n {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.getSingleNodeRootHash(key, _value);\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Computes the secure counterpart to a key.\\n * @param _key Key to get a secure key from.\\n * @return _secureKey Secure version of the key.\\n */\\n function _getSecureKey(\\n bytes memory _key\\n )\\n private\\n pure\\n returns (\\n bytes memory _secureKey\\n )\\n {\\n return abi.encodePacked(keccak256(_key));\\n }\\n}\",\"keccak256\":\"0x79355346f74bb1eb9eeb733cb5d9677d50115c4f390307cbf608fe071a1ada0c\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_Bytes32Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_Byte32Utils\\n */\\nlibrary Lib_Bytes32Utils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \\\"true.\\\"\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as a boolean.\\n */\\n function toBool(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return _in != 0;\\n }\\n\\n /**\\n * Converts a boolean to a bytes32 value.\\n * @param _in Input boolean value.\\n * @return Boolean as a bytes32.\\n */\\n function fromBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in ? 1 : 0));\\n }\\n\\n /**\\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as an address.\\n */\\n function toAddress(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return address(uint160(uint256(_in)));\\n }\\n\\n /**\\n * Converts an address to a bytes32.\\n * @param _in Input address value.\\n * @return Address as a bytes32.\\n */\\n function fromAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in));\\n }\\n\\n /**\\n * Removes the leading zeros from a bytes32 value and returns a new (smaller) bytes value.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 without any leading zeros.\\n */\\n function removeLeadingZeros(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out;\\n\\n assembly {\\n // Figure out how many leading zero bytes to remove.\\n let shift := 0\\n for { let i := 0 } and(lt(i, 32), eq(byte(i, _in), 0)) { i := add(i, 1) } {\\n shift := add(shift, 1)\\n }\\n\\n // Reserve some space for our output and fix the free memory pointer.\\n out := mload(0x40)\\n mstore(0x40, add(out, 0x40))\\n\\n // Shift the value and store it into the output bytes.\\n mstore(add(out, 0x20), shl(mul(shift, 8), _in))\\n\\n // Store the new size (with leading zero bytes removed) in the output byte size.\\n mstore(out, sub(32, shift))\\n }\\n\\n return out;\\n }\\n}\\n\",\"keccak256\":\"0xfa2def593e3fc56a31852c3744aefdaa93cec74e721bfcfeb1e5d166c7c60b64\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_BytesUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_BytesUtils\\n */\\nlibrary Lib_BytesUtils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_start + _length >= _start, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n if (_bytes.length - _start == 0) {\\n return bytes('');\\n }\\n\\n return slice(_bytes, _start, _bytes.length - _start);\\n }\\n\\n function toBytes32PadLeft(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n bytes32 ret;\\n uint256 len = _bytes.length <= 32 ? _bytes.length : 32;\\n assembly {\\n ret := shr(mul(sub(32, len), 8), mload(add(_bytes, 32)))\\n }\\n return ret;\\n }\\n\\n function toBytes32(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n if (_bytes.length < 32) {\\n bytes32 ret;\\n assembly {\\n ret := mload(add(_bytes, 32))\\n }\\n return ret;\\n }\\n\\n return abi.decode(_bytes,(bytes32)); // will truncate if input length > 32 bytes\\n }\\n\\n function toUint256(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return uint256(toBytes32(_bytes));\\n }\\n\\n function toUint24(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n uint24\\n )\\n {\\n require(_start + 3 >= _start, \\\"toUint24_overflow\\\");\\n require(_bytes.length >= _start + 3 , \\\"toUint24_outOfBounds\\\");\\n uint24 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x3), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toUint8(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n uint8\\n )\\n {\\n require(_start + 1 >= _start, \\\"toUint8_overflow\\\");\\n require(_bytes.length >= _start + 1 , \\\"toUint8_outOfBounds\\\");\\n uint8 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x1), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toAddress(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n require(_start + 20 >= _start, \\\"toAddress_overflow\\\");\\n require(_bytes.length >= _start + 20, \\\"toAddress_outOfBounds\\\");\\n address tempAddress;\\n\\n assembly {\\n tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000)\\n }\\n\\n return tempAddress;\\n }\\n\\n function toNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory nibbles = new bytes(_bytes.length * 2);\\n\\n for (uint256 i = 0; i < _bytes.length; i++) {\\n nibbles[i * 2] = _bytes[i] >> 4;\\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\\n }\\n\\n return nibbles;\\n }\\n\\n function fromNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory ret = new bytes(_bytes.length / 2);\\n\\n for (uint256 i = 0; i < ret.length; i++) {\\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\\n }\\n\\n return ret;\\n }\\n\\n function equal(\\n bytes memory _bytes,\\n bytes memory _other\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return keccak256(_bytes) == keccak256(_other);\\n }\\n}\\n\",\"keccak256\":\"0xa5195afe32fb2cf104d156e8f4bd39df1ec79bf6ba232097b9e8e0ee14fbc298\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x6080604052600480546001600160a01b03191661dead17905534801561002457600080fd5b50600580546001600160a01b031916905561312f806100446000396000f3fe608060405234801561001057600080fd5b50600436106101215760003560e01c806381ada46c116100ad578063c4d66de811610071578063c4d66de814610213578063c6b94ab014610226578063d7fd19dd14610239578063ecc704281461024c578063f2fde38b1461026157610121565b806381ada46c146101ca57806382e3702d146101dd5780638456cb59146101f05780638da5cb5b146101f8578063b1b1b2091461020057610121565b8063461a4478116100f4578063461a44781461018c5780635c975abb1461019f5780636e296e45146101a7578063706ceab6146101af578063715018a6146101c257610121565b80630ecf2eea1461012657806321d800ec1461013b578063299ca478146101645780633dbb202b14610179575b600080fd5b610139610134366004612aba565b610274565b005b61014e610149366004612aba565b610319565b60405161015b9190612cd0565b60405180910390f35b61016c61032e565b60405161015b9190612c58565b610139610187366004612a3e565b61033d565b61016c61019a366004612ad2565b6103cc565b61014e6104a8565b61016c6104b1565b6101396101bd3660046129c7565b6104fa565b610139610561565b6101396101d8366004612aba565b61060d565b61014e6101eb366004612aba565b6106af565b6101396106c4565b61016c610730565b61014e61020e366004612aba565b61073f565b61013961022136600461287e565b610754565b61014e610234366004612aba565b610882565b610139610247366004612898565b610897565b610254610bd6565b60405161015b9190612ba1565b61013961026f36600461287e565b610bdc565b61027c610cdf565b6001600160a01b031661028d610730565b6001600160a01b0316146102d6576040805162461bcd60e51b815260206004820181905260248201526000805160206130da833981519152604482015290519081900360640190fd5b600081815260ce6020526040808220805460ff191660011790555182917ff52508d5339edf0d7e5060a416df98db067af561bdc60872d29c0439eaa13a0291a250565b60006020819052908152604090205460ff1681565b6005546001600160a01b031681565b600061034d843385600354610ce3565b60038054600190810190915581516020808401919091206000908152600290915260409020805460ff19169091179055905061038f8163ffffffff8416610d30565b7f0ee9ffdb2334d78de97ffb066b23a352a4d35180cefb36589d663fbb1eb6f326816040516103be9190612d52565b60405180910390a150505050565b60055460405163bf40fac160e01b81526020600482018181528451602484015284516000946001600160a01b03169363bf40fac1938793928392604401918501908083838b5b8381101561042a578181015183820152602001610412565b50505050905090810190601f1680156104575780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561047457600080fd5b505afa158015610488573d6000803e3d6000fd5b505050506040513d602081101561049e57600080fd5b505190505b919050565b606a5460ff1690565b6004546000906001600160a01b031661dead14156104ea5760405162461bcd60e51b81526004016104e190612d65565b60405180910390fd5b506004546001600160a01b031690565b600061050886868686610ce3565b805160208083019190912060009081526002909152604090205490915060ff1615156001146105495760405162461bcd60e51b81526004016104e190612e5a565b610559818363ffffffff16610d30565b505050505050565b610569610cdf565b6001600160a01b031661057a610730565b6001600160a01b0316146105c3576040805162461bcd60e51b815260206004820181905260248201526000805160206130da833981519152604482015290519081900360640190fd5b6038546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3603880546001600160a01b0319169055565b610615610cdf565b6001600160a01b0316610626610730565b6001600160a01b03161461066f576040805162461bcd60e51b815260206004820181905260248201526000805160206130da833981519152604482015290519081900360640190fd5b600081815260ce6020526040808220805460ff191690555182917f52c8a2680a9f4cc0ad0bf88f32096eadbebf0646ea611d93a0ce6a29a024040591a250565b60026020526000908152604090205460ff1681565b6106cc610cdf565b6001600160a01b03166106dd610730565b6001600160a01b031614610726576040805162461bcd60e51b815260206004820181905260248201526000805160206130da833981519152604482015290519081900360640190fd5b61072e610e08565b565b6038546001600160a01b031690565b60016020526000908152604090205460ff1681565b600554600160a81b900460ff168061076f575061076f610ea8565b806107845750600554600160a01b900460ff16155b6107bf5760405162461bcd60e51b815260040180806020018281038252602e815260200180613086602e913960400191505060405180910390fd5b600554600160a81b900460ff161580156107f6576005805460ff60a01b1960ff60a81b19909116600160a81b1716600160a01b1790555b6005546001600160a01b03161561081f5760405162461bcd60e51b81526004016104e190612f84565b600580546001600160a01b0384166001600160a01b0319918216179091556004805490911661dead179055610852610eb9565b61085a610f72565b610862611082565b61086a611144565b801561087e576005805460ff60a81b191690555b5050565b60ce6020526000908152604090205460ff1681565b6002609c5414156108ef576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6002609c5560408051808201909152601481527327ab26afa61926b2b9b9b0b3b2a932b630bcb2b960611b602082015260009061092b906103cc565b90506001600160a01b0381161561096457336001600160a01b038216146109645760405162461bcd60e51b81526004016104e190612ee7565b61096c6104a8565b156109b1576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b60006109bf87878787610ce3565b90506109cb8184611201565b15156001146109ec5760405162461bcd60e51b81526004016104e190612f3d565b80516020808301919091206000818152600190925260409091205460ff1615610a275760405162461bcd60e51b81526004016104e190612d9c565b600081815260ce602052604090205460ff1615610a565760405162461bcd60e51b81526004016104e190612ea5565b600480546001600160a01b0319166001600160a01b03898116919091179091556040516000918a1690610a8a908990612bb8565b6000604051808303816000865af19150503d8060008114610ac7576040519150601f19603f3d011682016040523d82523d6000602084013e610acc565b606091505b5050600480546001600160a01b03191661dead179055905080151560011415610b4757600082815260016020819052604091829020805460ff19169091179055517f4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c90610b3a908490612ba1565b60405180910390a1610b7f565b7f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f82604051610b769190612ba1565b60405180910390a15b6000833343604051602001610b9693929190612c06565b60408051601f1981840301815291815281516020928301206000908152918290529020805460ff19166001908117909155609c5550505050505050505050565b60035481565b610be4610cdf565b6001600160a01b0316610bf5610730565b6001600160a01b031614610c3e576040805162461bcd60e51b815260206004820181905260248201526000805160206130da833981519152604482015290519081900360640190fd5b6001600160a01b038116610c835760405162461bcd60e51b81526004018080602001828103825260268152602001806130366026913960400191505060405180910390fd5b6038546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3603880546001600160a01b0319166001600160a01b0392909216919091179055565b3390565b606084848484604051602401610cfc9493929190612c6c565b60408051601f198184030181529190526020810180516001600160e01b031663cbd4ece960e01b1790529050949350505050565b610d6e6040518060400160405280601d81526020017f4f564d5f43616e6f6e6963616c5472616e73616374696f6e436861696e0000008152506103cc565b6001600160a01b0316636fee07e0610dba6040518060400160405280601a81526020017f4f564d5f4c3243726f7373446f6d61696e4d657373656e6765720000000000008152506103cc565b83856040518463ffffffff1660e01b8152600401610dda93929190612ca9565b600060405180830381600087803b158015610df457600080fd5b505af1158015610559573d6000803e3d6000fd5b610e106104a8565b15610e55576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b606a805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258610e8b610cdf565b604080516001600160a01b039092168252519081900360200190a1565b6000610eb330611226565b15905090565b600554600160a81b900460ff1680610ed45750610ed4610ea8565b80610ee95750600554600160a01b900460ff16155b610f245760405162461bcd60e51b815260040180806020018281038252602e815260200180613086602e913960400191505060405180910390fd5b600554600160a81b900460ff16158015610f5b576005805460ff60a01b1960ff60a81b19909116600160a81b1716600160a01b1790555b8015610f6f576005805460ff60a81b191690555b50565b600554600160a81b900460ff1680610f8d5750610f8d610ea8565b80610fa25750600554600160a01b900460ff16155b610fdd5760405162461bcd60e51b815260040180806020018281038252602e815260200180613086602e913960400191505060405180910390fd5b600554600160a81b900460ff16158015611014576005805460ff60a01b1960ff60a81b19909116600160a81b1716600160a01b1790555b600061101e610cdf565b603880546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3508015610f6f576005805460ff60a81b1916905550565b600554600160a81b900460ff168061109d575061109d610ea8565b806110b25750600554600160a01b900460ff16155b6110ed5760405162461bcd60e51b815260040180806020018281038252602e815260200180613086602e913960400191505060405180910390fd5b600554600160a81b900460ff16158015611124576005805460ff60a01b1960ff60a81b19909116600160a81b1716600160a01b1790555b606a805460ff191690558015610f6f576005805460ff60a81b1916905550565b600554600160a81b900460ff168061115f575061115f610ea8565b806111745750600554600160a01b900460ff16155b6111af5760405162461bcd60e51b815260040180806020018281038252602e815260200180613086602e913960400191505060405180910390fd5b600554600160a81b900460ff161580156111e6576005805460ff60a01b1960ff60a81b19909116600160a81b1716600160a01b1790555b6001609c558015610f6f576005805460ff60a81b1916905550565b600061120c8261122c565b801561121d575061121d8383611389565b90505b92915050565b3b151590565b60008061126d6040518060400160405280601881526020017f4f564d5f5374617465436f6d6d69746d656e74436861696e00000000000000008152506103cc565b6020840151604051639418bddd60e01b81529192506001600160a01b03831691639418bddd9161129f91600401612fce565b60206040518083038186803b1580156112b757600080fd5b505afa1580156112cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112ef9190612a9a565b1580156113825750825160208401516040808601519051634d69ee5760e01b81526001600160a01b03851693634d69ee5793611332939192909190600401612cdb565b60206040518083038186803b15801561134a57600080fd5b505afa15801561135e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113829190612a9a565b9392505050565b600080836113cb6040518060400160405280601a81526020017f4f564d5f4c3243726f7373446f6d61696e4d657373656e6765720000000000008152506103cc565b6040516020016113dc929190612bd4565b604051602081830303815290604052805190602001206000604051602001611405929190612baa565b604051602081830303815290604052805190602001209050600080611454602160991b6040516020016114389190612b89565b60408051601f19818403018152919052606087015187516114e6565b909250905060018215151461147b5760405162461bcd60e51b81526004016104e190612de7565b60006114868261150f565b90506114db8460405160200161149c9190612ba1565b60405160208183030381529060405260016040516020016114bd9190612c40565b604051602081830303815290604052886080015184604001516115a1565b979650505050505050565b6000606060006114f5866115c5565b90506115028186866115f5565b9250925050935093915050565b611517612634565b6000611522836116c8565b9050604051806080016040528061154c8360008151811061153f57fe5b60200260200101516116db565b81526020016115618360018151811061153f57fe5b81526020016115838360028151811061157657fe5b60200260200101516116e2565b81526020016115988360038151811061157657fe5b90529392505050565b6000806115ad866115c5565b90506115bb818686866117db565b9695505050505050565b606081805190602001206040516020016115df9190612ba1565b6040516020818303038152906040529050919050565b60006060600061160485611801565b90506000806000611616848a896118d8565b8151929550909350915015808061162a5750815b61167b576040805162461bcd60e51b815260206004820152601a60248201527f50726f76696465642070726f6f6620697320696e76616c69642e000000000000604482015290519081900360640190fd5b60008161169757604051806020016040528060008152506116b6565b6116b68660018703815181106116a957fe5b6020026020010151611c7b565b919b919a509098505050505050505050565b60606112206116d683611c97565b611cbc565b6000611220825b600060218260000151111561173e576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e000000000000604482015290519081900360640190fd5b600080600061174c85611e32565b91945092509050600081600181111561176157fe5b146117b3576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e000000000000604482015290519081900360640190fd5b6020808601518401805190918410156115bb5760208490036101000a90049695505050505050565b60008060006117eb8786866115f5565b915091508180156114db57506114db868261215b565b6060600061180e836116c8565b90506000815167ffffffffffffffff8111801561182a57600080fd5b5060405190808252806020026020018201604052801561186457816020015b61185161265b565b8152602001906001900390816118495790505b50905060005b82518110156118d057600061189184838151811061188457fe5b6020026020010151612171565b905060405180604001604052808281526020016118ad836116c8565b8152508383815181106118bc57fe5b60209081029190910101525060010161186a565b509392505050565b600060608180806118e887612200565b9050856000806118f661265b565b60005b8c51811015611c53578c818151811061190e57fe5b60200260200101519150828401935060018701965083600014156119825781518051602090910120851461197d576040805162461bcd60e51b8152602060048201526011602482015270092dcecc2d8d2c840e4dedee840d0c2e6d607b1b604482015290519081900360640190fd5b611a49565b8151516020116119e95781518051602090910120851461197d576040805162461bcd60e51b815260206004820152601b60248201527f496e76616c6964206c6172676520696e7465726e616c20686173680000000000604482015290519081900360640190fd5b846119f783600001516122fd565b14611a49576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420696e7465726e616c206e6f64652068617368000000000000604482015290519081900360640190fd5b60208201515160111415611ab8578551841415611a6557611c53565b6000868581518110611a7357fe5b602001015160f81c60f81b60f81c9050600083602001518260ff1681518110611a9857fe5b60200260200101519050611aab81612329565b9650600194505050611c4b565b60028260200151511415611bfe576000611ad18361235f565b9050600081600081518110611ae257fe5b016020015160f81c9050600181166002036000611b028460ff841661237d565b90506000611b108b8a61237d565b90506000611b1e83836123ae565b905060ff851660021480611b35575060ff85166003145b15611b6757808351148015611b4a5750808251145b15611b5457988901985b50600160ff1b9950611c53945050505050565b60ff85161580611b7a575060ff85166001145b15611bc75780611b975750600160ff1b9950611c53945050505050565b611bb88860200151600181518110611bab57fe5b6020026020010151612329565b9a509750611c4b945050505050565b60405162461bcd60e51b81526004018080602001828103825260268152602001806130b46026913960400191505060405180910390fd5b6040805162461bcd60e51b815260206004820152601d60248201527f526563656976656420616e20756e706172736561626c65206e6f64652e000000604482015290519081900360640190fd5b6001016118f9565b50600160ff1b841486611c66878661237d565b909e909d50909b509950505050505050505050565b6020810151805160609161122091600019810190811061188457fe5b611c9f612675565b506040805180820190915281518152602082810190820152919050565b6060600080611cca84611e32565b91935090915060019050816001811115611ce057fe5b14611d32576040805162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c50206c6973742076616c75652e000000000000000000604482015290519081900360640190fd5b6040805160208082526104208201909252600091816020015b611d53612675565b815260200190600190039081611d4b5790505090506000835b8651811015611e275760208210611db45760405162461bcd60e51b815260040180806020018281038252602a81526020018061305c602a913960400191505060405180910390fd5b600080611de06040518060400160405280858c60000151038152602001858c6020015101815250611e32565b509150915060405180604001604052808383018152602001848b6020015101815250858581518110611e0e57fe5b6020908102919091010152600193909301920101611d6c565b508152949350505050565b600080600080846000015111611e8f576040805162461bcd60e51b815260206004820152601860248201527f524c50206974656d2063616e6e6f74206265206e756c6c2e0000000000000000604482015290519081900360640190fd5b6020840151805160001a607f8111611eb4576000600160009450945094505050612154565b60b78111611f29578551607f198201908110611f17576040805162461bcd60e51b815260206004820152601960248201527f496e76616c696420524c502073686f727420737472696e672e00000000000000604482015290519081900360640190fd5b60019550935060009250612154915050565b60bf811161200d57855160b6198201908110611f8c576040805162461bcd60e51b815260206004820152601f60248201527f496e76616c696420524c50206c6f6e6720737472696e67206c656e6774682e00604482015290519081900360640190fd5b6000816020036101000a6001850151049050808201886000015111611ff8576040805162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c50206c6f6e6720737472696e672e0000000000000000604482015290519081900360640190fd5b60019091019550935060009250612154915050565b60f7811161208157855160bf198201908110612070576040805162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c502073686f7274206c6973742e000000000000000000604482015290519081900360640190fd5b600195509350849250612154915050565b855160f61982019081106120dc576040805162461bcd60e51b815260206004820152601d60248201527f496e76616c696420524c50206c6f6e67206c697374206c656e6774682e000000604482015290519081900360640190fd5b6000816020036101000a6001850151049050808201886000015111612141576040805162461bcd60e51b815260206004820152601660248201527524b73b30b634b210292628103637b733903634b9ba1760511b604482015290519081900360640190fd5b6001918201965094509250612154915050565b9193909250565b8051602091820120825192909101919091201490565b6060600080600061218185611e32565b91945092509050600081600181111561219657fe5b146121e8576040805162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c502062797465732076616c75652e0000000000000000604482015290519081900360640190fd5b6121f785602001518484612414565b95945050505050565b60606000825160020267ffffffffffffffff8111801561221f57600080fd5b506040519080825280601f01601f19166020018201604052801561224a576020820181803683370190505b50905060005b83518110156122f657600484828151811061226757fe5b602001015160f81c60f81b6001600160f81b031916901c82826002028151811061228d57fe5b60200101906001600160f81b031916908160001a90535060108482815181106122b257fe5b016020015160f81c816122c157fe5b0660f81b8282600202600101815181106122d757fe5b60200101906001600160f81b031916908160001a905350600101612250565b5092915050565b6000602082511015612314575060208101516104a3565b81806020019051602081101561049e57600080fd5b6000606060208360000151101561234a57612343836124c2565b9050612356565b61235383612171565b90505b611382816122fd565b6060611220612378836020015160008151811061188457fe5b612200565b606081835103600014156123a05750604080516020810190915260008152611220565b61121d8383848651036124cd565b6000805b8084511180156123c25750808351115b801561240757508281815181106123d557fe5b602001015160f81c60f81b6001600160f81b0319168482815181106123f657fe5b01602001516001600160f81b031916145b1561121d576001016123b2565b606060008267ffffffffffffffff8111801561242f57600080fd5b506040519080825280601f01601f19166020018201604052801561245a576020820181803683370190505b50905080516000141561246e579050611382565b8484016020820160005b60208604811015612499578251825260209283019290910190600101612478565b5080519151601f959095166020036101000a600019019182169119909416179092525092915050565b60606112208261261e565b60608182601f011015612518576040805162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b604482015290519081900360640190fd5b828284011015612560576040805162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b604482015290519081900360640190fd5b818301845110156125ac576040805162461bcd60e51b8152602060048201526011602482015270736c6963655f6f75744f66426f756e647360781b604482015290519081900360640190fd5b6060821580156125cb5760405191506000825260208201604052612615565b6040519150601f8416801560200281840101858101878315602002848b0101015b818310156126045780518352602092830192016125ec565b5050858452601f01601f1916604052505b50949350505050565b6060611220826020015160008460000151612414565b60408051608081018252600080825260208201819052918101829052606081019190915290565b604051806040016040528060608152602001606081525090565b604051806040016040528060008152602001600081525090565b600067ffffffffffffffff8311156126a357fe5b6126b6601f8401601f1916602001612fe1565b90508281528383830111156126ca57600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b03811681146104a357600080fd5b600082601f830112612708578081fd5b61121d8383356020850161268f565b600060a08284031215612728578081fd5b60405160a0810167ffffffffffffffff828210818311171561274657fe5b8160405282935084358352602085013560208401526040850135604084015260608501356060840152608085013591508082111561278357600080fd5b50612790858286016126f8565b6080830152505092915050565b6000604082840312156127ae578081fd5b6040516040810167ffffffffffffffff82821081831117156127cc57fe5b81604052829350843583526020915081850135818111156127ec57600080fd5b8501601f810187136127fd57600080fd5b80358281111561280957fe5b8381029250612819848401612fe1565b8181528481019083860185850187018b101561283457600080fd5b600095505b83861015612857578035835260019590950194918601918601612839565b5080868801525050505050505092915050565b803563ffffffff811681146104a357600080fd5b60006020828403121561288f578081fd5b61121d826126e1565b600080600080600060a086880312156128af578081fd5b6128b8866126e1565b94506128c6602087016126e1565b9350604086013567ffffffffffffffff808211156128e2578283fd5b6128ee89838a016126f8565b945060608801359350608088013591508082111561290a578283fd5b9087019060a0828a03121561291d578283fd5b61292760a0612fe1565b8235815260208301358281111561293c578485fd5b6129488b828601612717565b60208301525060408301358281111561295f578485fd5b61296b8b82860161279d565b604083015250606083013582811115612982578485fd5b61298e8b8286016126f8565b6060830152506080830135828111156129a5578485fd5b6129b18b8286016126f8565b6080830152508093505050509295509295909350565b600080600080600060a086880312156129de578081fd5b6129e7866126e1565b94506129f5602087016126e1565b9350604086013567ffffffffffffffff811115612a10578182fd5b612a1c888289016126f8565b93505060608601359150612a326080870161286a565b90509295509295909350565b600080600060608486031215612a52578283fd5b612a5b846126e1565b9250602084013567ffffffffffffffff811115612a76578283fd5b612a82868287016126f8565b925050612a916040850161286a565b90509250925092565b600060208284031215612aab578081fd5b8151801515811461121d578182fd5b600060208284031215612acb578081fd5b5035919050565b600060208284031215612ae3578081fd5b813567ffffffffffffffff811115612af9578182fd5b8201601f81018413612b09578182fd5b612b188482356020840161268f565b949350505050565b60008151808452612b38816020860160208601613005565b601f01601f19169290920160200192915050565b600081518352602082015160208401526040820151604084015260608201516060840152608082015160a06080850152612b1860a0850182612b20565b60609190911b6001600160601b031916815260140190565b90815260200190565b918252602082015260400190565b60008251612bca818460208701613005565b9190910192915050565b60008351612be6818460208801613005565b60609390931b6001600160601b0319169190920190815260140192915050565b60008451612c18818460208901613005565b60609490941b6001600160601b03191691909301908152601481019190915260340192915050565b60f89190911b6001600160f81b031916815260010190565b6001600160a01b0391909116815260200190565b6001600160a01b03858116825284166020820152608060408201819052600090612c9890830185612b20565b905082606083015295945050505050565b600060018060a01b0385168252836020830152606060408301526121f76060830184612b20565b901515815260200190565b60008482526020606081840152612cf56060840186612b4c565b838103604085015260408101855182528286015160408484015281815180845260608501915085830194508693505b80841015612d445784518252938501936001939093019290850190612d24565b509998505050505050505050565b60006020825261121d6020830184612b20565b6020808252601f908201527f78446f6d61696e4d65737361676553656e646572206973206e6f742073657400604082015260600190565b6020808252602b908201527f50726f7669646564206d6573736167652068617320616c72656164792062656560408201526a37103932b1b2b4bb32b21760a91b606082015260800190565b6020808252604d908201527f4d6573736167652070617373696e67207072656465706c6f7920686173206e6f60408201527f74206265656e20696e697469616c697a6564206f7220696e76616c696420707260608201526c37b7b310383937bb34b232b21760991b608082015260a00190565b6020808252602b908201527f50726f7669646564206d65737361676520686173206e6f7420616c726561647960408201526a103132b2b71039b2b73a1760a91b606082015260800190565b60208082526022908201527f50726f7669646564206d65737361676520686173206265656e20626c6f636b65604082015261321760f11b606082015260800190565b60208082526036908201527f4f6e6c79204f564d5f4c324d65737361676552656c617965722063616e2072656040820152753630bc90261916ba3796a6189036b2b9b9b0b3b2b99760511b606082015260800190565b60208082526027908201527f50726f7669646564206d65737361676520636f756c64206e6f742062652076656040820152663934b334b2b21760c91b606082015260800190565b6020808252602a908201527f4c3143726f7373446f6d61696e4d657373656e67657220616c72656164792069604082015269373a34b0b634bd32b21760b11b606082015260800190565b60006020825261121d6020830184612b4c565b60405181810167ffffffffffffffff81118282101715612ffd57fe5b604052919050565b60005b83811015613020578181015183820152602001613008565b8381111561302f576000848401525b5050505056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737350726f766964656420524c50206c6973742065786365656473206d6178206c697374206c656e6774682e496e697469616c697a61626c653a20636f6e747261637420697320616c726561647920696e697469616c697a656452656365697665642061206e6f6465207769746820616e20756e6b6e6f776e207072656669784f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a2646970667358221220c8b08248358fc9118d8d145603700ec8109487e93128f8f4b5dafd0a63cf3bad64736f6c63430007060033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101215760003560e01c806381ada46c116100ad578063c4d66de811610071578063c4d66de814610213578063c6b94ab014610226578063d7fd19dd14610239578063ecc704281461024c578063f2fde38b1461026157610121565b806381ada46c146101ca57806382e3702d146101dd5780638456cb59146101f05780638da5cb5b146101f8578063b1b1b2091461020057610121565b8063461a4478116100f4578063461a44781461018c5780635c975abb1461019f5780636e296e45146101a7578063706ceab6146101af578063715018a6146101c257610121565b80630ecf2eea1461012657806321d800ec1461013b578063299ca478146101645780633dbb202b14610179575b600080fd5b610139610134366004612aba565b610274565b005b61014e610149366004612aba565b610319565b60405161015b9190612cd0565b60405180910390f35b61016c61032e565b60405161015b9190612c58565b610139610187366004612a3e565b61033d565b61016c61019a366004612ad2565b6103cc565b61014e6104a8565b61016c6104b1565b6101396101bd3660046129c7565b6104fa565b610139610561565b6101396101d8366004612aba565b61060d565b61014e6101eb366004612aba565b6106af565b6101396106c4565b61016c610730565b61014e61020e366004612aba565b61073f565b61013961022136600461287e565b610754565b61014e610234366004612aba565b610882565b610139610247366004612898565b610897565b610254610bd6565b60405161015b9190612ba1565b61013961026f36600461287e565b610bdc565b61027c610cdf565b6001600160a01b031661028d610730565b6001600160a01b0316146102d6576040805162461bcd60e51b815260206004820181905260248201526000805160206130da833981519152604482015290519081900360640190fd5b600081815260ce6020526040808220805460ff191660011790555182917ff52508d5339edf0d7e5060a416df98db067af561bdc60872d29c0439eaa13a0291a250565b60006020819052908152604090205460ff1681565b6005546001600160a01b031681565b600061034d843385600354610ce3565b60038054600190810190915581516020808401919091206000908152600290915260409020805460ff19169091179055905061038f8163ffffffff8416610d30565b7f0ee9ffdb2334d78de97ffb066b23a352a4d35180cefb36589d663fbb1eb6f326816040516103be9190612d52565b60405180910390a150505050565b60055460405163bf40fac160e01b81526020600482018181528451602484015284516000946001600160a01b03169363bf40fac1938793928392604401918501908083838b5b8381101561042a578181015183820152602001610412565b50505050905090810190601f1680156104575780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561047457600080fd5b505afa158015610488573d6000803e3d6000fd5b505050506040513d602081101561049e57600080fd5b505190505b919050565b606a5460ff1690565b6004546000906001600160a01b031661dead14156104ea5760405162461bcd60e51b81526004016104e190612d65565b60405180910390fd5b506004546001600160a01b031690565b600061050886868686610ce3565b805160208083019190912060009081526002909152604090205490915060ff1615156001146105495760405162461bcd60e51b81526004016104e190612e5a565b610559818363ffffffff16610d30565b505050505050565b610569610cdf565b6001600160a01b031661057a610730565b6001600160a01b0316146105c3576040805162461bcd60e51b815260206004820181905260248201526000805160206130da833981519152604482015290519081900360640190fd5b6038546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3603880546001600160a01b0319169055565b610615610cdf565b6001600160a01b0316610626610730565b6001600160a01b03161461066f576040805162461bcd60e51b815260206004820181905260248201526000805160206130da833981519152604482015290519081900360640190fd5b600081815260ce6020526040808220805460ff191690555182917f52c8a2680a9f4cc0ad0bf88f32096eadbebf0646ea611d93a0ce6a29a024040591a250565b60026020526000908152604090205460ff1681565b6106cc610cdf565b6001600160a01b03166106dd610730565b6001600160a01b031614610726576040805162461bcd60e51b815260206004820181905260248201526000805160206130da833981519152604482015290519081900360640190fd5b61072e610e08565b565b6038546001600160a01b031690565b60016020526000908152604090205460ff1681565b600554600160a81b900460ff168061076f575061076f610ea8565b806107845750600554600160a01b900460ff16155b6107bf5760405162461bcd60e51b815260040180806020018281038252602e815260200180613086602e913960400191505060405180910390fd5b600554600160a81b900460ff161580156107f6576005805460ff60a01b1960ff60a81b19909116600160a81b1716600160a01b1790555b6005546001600160a01b03161561081f5760405162461bcd60e51b81526004016104e190612f84565b600580546001600160a01b0384166001600160a01b0319918216179091556004805490911661dead179055610852610eb9565b61085a610f72565b610862611082565b61086a611144565b801561087e576005805460ff60a81b191690555b5050565b60ce6020526000908152604090205460ff1681565b6002609c5414156108ef576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6002609c5560408051808201909152601481527327ab26afa61926b2b9b9b0b3b2a932b630bcb2b960611b602082015260009061092b906103cc565b90506001600160a01b0381161561096457336001600160a01b038216146109645760405162461bcd60e51b81526004016104e190612ee7565b61096c6104a8565b156109b1576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b60006109bf87878787610ce3565b90506109cb8184611201565b15156001146109ec5760405162461bcd60e51b81526004016104e190612f3d565b80516020808301919091206000818152600190925260409091205460ff1615610a275760405162461bcd60e51b81526004016104e190612d9c565b600081815260ce602052604090205460ff1615610a565760405162461bcd60e51b81526004016104e190612ea5565b600480546001600160a01b0319166001600160a01b03898116919091179091556040516000918a1690610a8a908990612bb8565b6000604051808303816000865af19150503d8060008114610ac7576040519150601f19603f3d011682016040523d82523d6000602084013e610acc565b606091505b5050600480546001600160a01b03191661dead179055905080151560011415610b4757600082815260016020819052604091829020805460ff19169091179055517f4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c90610b3a908490612ba1565b60405180910390a1610b7f565b7f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f82604051610b769190612ba1565b60405180910390a15b6000833343604051602001610b9693929190612c06565b60408051601f1981840301815291815281516020928301206000908152918290529020805460ff19166001908117909155609c5550505050505050505050565b60035481565b610be4610cdf565b6001600160a01b0316610bf5610730565b6001600160a01b031614610c3e576040805162461bcd60e51b815260206004820181905260248201526000805160206130da833981519152604482015290519081900360640190fd5b6001600160a01b038116610c835760405162461bcd60e51b81526004018080602001828103825260268152602001806130366026913960400191505060405180910390fd5b6038546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3603880546001600160a01b0319166001600160a01b0392909216919091179055565b3390565b606084848484604051602401610cfc9493929190612c6c565b60408051601f198184030181529190526020810180516001600160e01b031663cbd4ece960e01b1790529050949350505050565b610d6e6040518060400160405280601d81526020017f4f564d5f43616e6f6e6963616c5472616e73616374696f6e436861696e0000008152506103cc565b6001600160a01b0316636fee07e0610dba6040518060400160405280601a81526020017f4f564d5f4c3243726f7373446f6d61696e4d657373656e6765720000000000008152506103cc565b83856040518463ffffffff1660e01b8152600401610dda93929190612ca9565b600060405180830381600087803b158015610df457600080fd5b505af1158015610559573d6000803e3d6000fd5b610e106104a8565b15610e55576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b606a805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258610e8b610cdf565b604080516001600160a01b039092168252519081900360200190a1565b6000610eb330611226565b15905090565b600554600160a81b900460ff1680610ed45750610ed4610ea8565b80610ee95750600554600160a01b900460ff16155b610f245760405162461bcd60e51b815260040180806020018281038252602e815260200180613086602e913960400191505060405180910390fd5b600554600160a81b900460ff16158015610f5b576005805460ff60a01b1960ff60a81b19909116600160a81b1716600160a01b1790555b8015610f6f576005805460ff60a81b191690555b50565b600554600160a81b900460ff1680610f8d5750610f8d610ea8565b80610fa25750600554600160a01b900460ff16155b610fdd5760405162461bcd60e51b815260040180806020018281038252602e815260200180613086602e913960400191505060405180910390fd5b600554600160a81b900460ff16158015611014576005805460ff60a01b1960ff60a81b19909116600160a81b1716600160a01b1790555b600061101e610cdf565b603880546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3508015610f6f576005805460ff60a81b1916905550565b600554600160a81b900460ff168061109d575061109d610ea8565b806110b25750600554600160a01b900460ff16155b6110ed5760405162461bcd60e51b815260040180806020018281038252602e815260200180613086602e913960400191505060405180910390fd5b600554600160a81b900460ff16158015611124576005805460ff60a01b1960ff60a81b19909116600160a81b1716600160a01b1790555b606a805460ff191690558015610f6f576005805460ff60a81b1916905550565b600554600160a81b900460ff168061115f575061115f610ea8565b806111745750600554600160a01b900460ff16155b6111af5760405162461bcd60e51b815260040180806020018281038252602e815260200180613086602e913960400191505060405180910390fd5b600554600160a81b900460ff161580156111e6576005805460ff60a01b1960ff60a81b19909116600160a81b1716600160a01b1790555b6001609c558015610f6f576005805460ff60a81b1916905550565b600061120c8261122c565b801561121d575061121d8383611389565b90505b92915050565b3b151590565b60008061126d6040518060400160405280601881526020017f4f564d5f5374617465436f6d6d69746d656e74436861696e00000000000000008152506103cc565b6020840151604051639418bddd60e01b81529192506001600160a01b03831691639418bddd9161129f91600401612fce565b60206040518083038186803b1580156112b757600080fd5b505afa1580156112cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112ef9190612a9a565b1580156113825750825160208401516040808601519051634d69ee5760e01b81526001600160a01b03851693634d69ee5793611332939192909190600401612cdb565b60206040518083038186803b15801561134a57600080fd5b505afa15801561135e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113829190612a9a565b9392505050565b600080836113cb6040518060400160405280601a81526020017f4f564d5f4c3243726f7373446f6d61696e4d657373656e6765720000000000008152506103cc565b6040516020016113dc929190612bd4565b604051602081830303815290604052805190602001206000604051602001611405929190612baa565b604051602081830303815290604052805190602001209050600080611454602160991b6040516020016114389190612b89565b60408051601f19818403018152919052606087015187516114e6565b909250905060018215151461147b5760405162461bcd60e51b81526004016104e190612de7565b60006114868261150f565b90506114db8460405160200161149c9190612ba1565b60405160208183030381529060405260016040516020016114bd9190612c40565b604051602081830303815290604052886080015184604001516115a1565b979650505050505050565b6000606060006114f5866115c5565b90506115028186866115f5565b9250925050935093915050565b611517612634565b6000611522836116c8565b9050604051806080016040528061154c8360008151811061153f57fe5b60200260200101516116db565b81526020016115618360018151811061153f57fe5b81526020016115838360028151811061157657fe5b60200260200101516116e2565b81526020016115988360038151811061157657fe5b90529392505050565b6000806115ad866115c5565b90506115bb818686866117db565b9695505050505050565b606081805190602001206040516020016115df9190612ba1565b6040516020818303038152906040529050919050565b60006060600061160485611801565b90506000806000611616848a896118d8565b8151929550909350915015808061162a5750815b61167b576040805162461bcd60e51b815260206004820152601a60248201527f50726f76696465642070726f6f6620697320696e76616c69642e000000000000604482015290519081900360640190fd5b60008161169757604051806020016040528060008152506116b6565b6116b68660018703815181106116a957fe5b6020026020010151611c7b565b919b919a509098505050505050505050565b60606112206116d683611c97565b611cbc565b6000611220825b600060218260000151111561173e576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e000000000000604482015290519081900360640190fd5b600080600061174c85611e32565b91945092509050600081600181111561176157fe5b146117b3576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e000000000000604482015290519081900360640190fd5b6020808601518401805190918410156115bb5760208490036101000a90049695505050505050565b60008060006117eb8786866115f5565b915091508180156114db57506114db868261215b565b6060600061180e836116c8565b90506000815167ffffffffffffffff8111801561182a57600080fd5b5060405190808252806020026020018201604052801561186457816020015b61185161265b565b8152602001906001900390816118495790505b50905060005b82518110156118d057600061189184838151811061188457fe5b6020026020010151612171565b905060405180604001604052808281526020016118ad836116c8565b8152508383815181106118bc57fe5b60209081029190910101525060010161186a565b509392505050565b600060608180806118e887612200565b9050856000806118f661265b565b60005b8c51811015611c53578c818151811061190e57fe5b60200260200101519150828401935060018701965083600014156119825781518051602090910120851461197d576040805162461bcd60e51b8152602060048201526011602482015270092dcecc2d8d2c840e4dedee840d0c2e6d607b1b604482015290519081900360640190fd5b611a49565b8151516020116119e95781518051602090910120851461197d576040805162461bcd60e51b815260206004820152601b60248201527f496e76616c6964206c6172676520696e7465726e616c20686173680000000000604482015290519081900360640190fd5b846119f783600001516122fd565b14611a49576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420696e7465726e616c206e6f64652068617368000000000000604482015290519081900360640190fd5b60208201515160111415611ab8578551841415611a6557611c53565b6000868581518110611a7357fe5b602001015160f81c60f81b60f81c9050600083602001518260ff1681518110611a9857fe5b60200260200101519050611aab81612329565b9650600194505050611c4b565b60028260200151511415611bfe576000611ad18361235f565b9050600081600081518110611ae257fe5b016020015160f81c9050600181166002036000611b028460ff841661237d565b90506000611b108b8a61237d565b90506000611b1e83836123ae565b905060ff851660021480611b35575060ff85166003145b15611b6757808351148015611b4a5750808251145b15611b5457988901985b50600160ff1b9950611c53945050505050565b60ff85161580611b7a575060ff85166001145b15611bc75780611b975750600160ff1b9950611c53945050505050565b611bb88860200151600181518110611bab57fe5b6020026020010151612329565b9a509750611c4b945050505050565b60405162461bcd60e51b81526004018080602001828103825260268152602001806130b46026913960400191505060405180910390fd5b6040805162461bcd60e51b815260206004820152601d60248201527f526563656976656420616e20756e706172736561626c65206e6f64652e000000604482015290519081900360640190fd5b6001016118f9565b50600160ff1b841486611c66878661237d565b909e909d50909b509950505050505050505050565b6020810151805160609161122091600019810190811061188457fe5b611c9f612675565b506040805180820190915281518152602082810190820152919050565b6060600080611cca84611e32565b91935090915060019050816001811115611ce057fe5b14611d32576040805162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c50206c6973742076616c75652e000000000000000000604482015290519081900360640190fd5b6040805160208082526104208201909252600091816020015b611d53612675565b815260200190600190039081611d4b5790505090506000835b8651811015611e275760208210611db45760405162461bcd60e51b815260040180806020018281038252602a81526020018061305c602a913960400191505060405180910390fd5b600080611de06040518060400160405280858c60000151038152602001858c6020015101815250611e32565b509150915060405180604001604052808383018152602001848b6020015101815250858581518110611e0e57fe5b6020908102919091010152600193909301920101611d6c565b508152949350505050565b600080600080846000015111611e8f576040805162461bcd60e51b815260206004820152601860248201527f524c50206974656d2063616e6e6f74206265206e756c6c2e0000000000000000604482015290519081900360640190fd5b6020840151805160001a607f8111611eb4576000600160009450945094505050612154565b60b78111611f29578551607f198201908110611f17576040805162461bcd60e51b815260206004820152601960248201527f496e76616c696420524c502073686f727420737472696e672e00000000000000604482015290519081900360640190fd5b60019550935060009250612154915050565b60bf811161200d57855160b6198201908110611f8c576040805162461bcd60e51b815260206004820152601f60248201527f496e76616c696420524c50206c6f6e6720737472696e67206c656e6774682e00604482015290519081900360640190fd5b6000816020036101000a6001850151049050808201886000015111611ff8576040805162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c50206c6f6e6720737472696e672e0000000000000000604482015290519081900360640190fd5b60019091019550935060009250612154915050565b60f7811161208157855160bf198201908110612070576040805162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c502073686f7274206c6973742e000000000000000000604482015290519081900360640190fd5b600195509350849250612154915050565b855160f61982019081106120dc576040805162461bcd60e51b815260206004820152601d60248201527f496e76616c696420524c50206c6f6e67206c697374206c656e6774682e000000604482015290519081900360640190fd5b6000816020036101000a6001850151049050808201886000015111612141576040805162461bcd60e51b815260206004820152601660248201527524b73b30b634b210292628103637b733903634b9ba1760511b604482015290519081900360640190fd5b6001918201965094509250612154915050565b9193909250565b8051602091820120825192909101919091201490565b6060600080600061218185611e32565b91945092509050600081600181111561219657fe5b146121e8576040805162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c502062797465732076616c75652e0000000000000000604482015290519081900360640190fd5b6121f785602001518484612414565b95945050505050565b60606000825160020267ffffffffffffffff8111801561221f57600080fd5b506040519080825280601f01601f19166020018201604052801561224a576020820181803683370190505b50905060005b83518110156122f657600484828151811061226757fe5b602001015160f81c60f81b6001600160f81b031916901c82826002028151811061228d57fe5b60200101906001600160f81b031916908160001a90535060108482815181106122b257fe5b016020015160f81c816122c157fe5b0660f81b8282600202600101815181106122d757fe5b60200101906001600160f81b031916908160001a905350600101612250565b5092915050565b6000602082511015612314575060208101516104a3565b81806020019051602081101561049e57600080fd5b6000606060208360000151101561234a57612343836124c2565b9050612356565b61235383612171565b90505b611382816122fd565b6060611220612378836020015160008151811061188457fe5b612200565b606081835103600014156123a05750604080516020810190915260008152611220565b61121d8383848651036124cd565b6000805b8084511180156123c25750808351115b801561240757508281815181106123d557fe5b602001015160f81c60f81b6001600160f81b0319168482815181106123f657fe5b01602001516001600160f81b031916145b1561121d576001016123b2565b606060008267ffffffffffffffff8111801561242f57600080fd5b506040519080825280601f01601f19166020018201604052801561245a576020820181803683370190505b50905080516000141561246e579050611382565b8484016020820160005b60208604811015612499578251825260209283019290910190600101612478565b5080519151601f959095166020036101000a600019019182169119909416179092525092915050565b60606112208261261e565b60608182601f011015612518576040805162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b604482015290519081900360640190fd5b828284011015612560576040805162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b604482015290519081900360640190fd5b818301845110156125ac576040805162461bcd60e51b8152602060048201526011602482015270736c6963655f6f75744f66426f756e647360781b604482015290519081900360640190fd5b6060821580156125cb5760405191506000825260208201604052612615565b6040519150601f8416801560200281840101858101878315602002848b0101015b818310156126045780518352602092830192016125ec565b5050858452601f01601f1916604052505b50949350505050565b6060611220826020015160008460000151612414565b60408051608081018252600080825260208201819052918101829052606081019190915290565b604051806040016040528060608152602001606081525090565b604051806040016040528060008152602001600081525090565b600067ffffffffffffffff8311156126a357fe5b6126b6601f8401601f1916602001612fe1565b90508281528383830111156126ca57600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b03811681146104a357600080fd5b600082601f830112612708578081fd5b61121d8383356020850161268f565b600060a08284031215612728578081fd5b60405160a0810167ffffffffffffffff828210818311171561274657fe5b8160405282935084358352602085013560208401526040850135604084015260608501356060840152608085013591508082111561278357600080fd5b50612790858286016126f8565b6080830152505092915050565b6000604082840312156127ae578081fd5b6040516040810167ffffffffffffffff82821081831117156127cc57fe5b81604052829350843583526020915081850135818111156127ec57600080fd5b8501601f810187136127fd57600080fd5b80358281111561280957fe5b8381029250612819848401612fe1565b8181528481019083860185850187018b101561283457600080fd5b600095505b83861015612857578035835260019590950194918601918601612839565b5080868801525050505050505092915050565b803563ffffffff811681146104a357600080fd5b60006020828403121561288f578081fd5b61121d826126e1565b600080600080600060a086880312156128af578081fd5b6128b8866126e1565b94506128c6602087016126e1565b9350604086013567ffffffffffffffff808211156128e2578283fd5b6128ee89838a016126f8565b945060608801359350608088013591508082111561290a578283fd5b9087019060a0828a03121561291d578283fd5b61292760a0612fe1565b8235815260208301358281111561293c578485fd5b6129488b828601612717565b60208301525060408301358281111561295f578485fd5b61296b8b82860161279d565b604083015250606083013582811115612982578485fd5b61298e8b8286016126f8565b6060830152506080830135828111156129a5578485fd5b6129b18b8286016126f8565b6080830152508093505050509295509295909350565b600080600080600060a086880312156129de578081fd5b6129e7866126e1565b94506129f5602087016126e1565b9350604086013567ffffffffffffffff811115612a10578182fd5b612a1c888289016126f8565b93505060608601359150612a326080870161286a565b90509295509295909350565b600080600060608486031215612a52578283fd5b612a5b846126e1565b9250602084013567ffffffffffffffff811115612a76578283fd5b612a82868287016126f8565b925050612a916040850161286a565b90509250925092565b600060208284031215612aab578081fd5b8151801515811461121d578182fd5b600060208284031215612acb578081fd5b5035919050565b600060208284031215612ae3578081fd5b813567ffffffffffffffff811115612af9578182fd5b8201601f81018413612b09578182fd5b612b188482356020840161268f565b949350505050565b60008151808452612b38816020860160208601613005565b601f01601f19169290920160200192915050565b600081518352602082015160208401526040820151604084015260608201516060840152608082015160a06080850152612b1860a0850182612b20565b60609190911b6001600160601b031916815260140190565b90815260200190565b918252602082015260400190565b60008251612bca818460208701613005565b9190910192915050565b60008351612be6818460208801613005565b60609390931b6001600160601b0319169190920190815260140192915050565b60008451612c18818460208901613005565b60609490941b6001600160601b03191691909301908152601481019190915260340192915050565b60f89190911b6001600160f81b031916815260010190565b6001600160a01b0391909116815260200190565b6001600160a01b03858116825284166020820152608060408201819052600090612c9890830185612b20565b905082606083015295945050505050565b600060018060a01b0385168252836020830152606060408301526121f76060830184612b20565b901515815260200190565b60008482526020606081840152612cf56060840186612b4c565b838103604085015260408101855182528286015160408484015281815180845260608501915085830194508693505b80841015612d445784518252938501936001939093019290850190612d24565b509998505050505050505050565b60006020825261121d6020830184612b20565b6020808252601f908201527f78446f6d61696e4d65737361676553656e646572206973206e6f742073657400604082015260600190565b6020808252602b908201527f50726f7669646564206d6573736167652068617320616c72656164792062656560408201526a37103932b1b2b4bb32b21760a91b606082015260800190565b6020808252604d908201527f4d6573736167652070617373696e67207072656465706c6f7920686173206e6f60408201527f74206265656e20696e697469616c697a6564206f7220696e76616c696420707260608201526c37b7b310383937bb34b232b21760991b608082015260a00190565b6020808252602b908201527f50726f7669646564206d65737361676520686173206e6f7420616c726561647960408201526a103132b2b71039b2b73a1760a91b606082015260800190565b60208082526022908201527f50726f7669646564206d65737361676520686173206265656e20626c6f636b65604082015261321760f11b606082015260800190565b60208082526036908201527f4f6e6c79204f564d5f4c324d65737361676552656c617965722063616e2072656040820152753630bc90261916ba3796a6189036b2b9b9b0b3b2b99760511b606082015260800190565b60208082526027908201527f50726f7669646564206d65737361676520636f756c64206e6f742062652076656040820152663934b334b2b21760c91b606082015260800190565b6020808252602a908201527f4c3143726f7373446f6d61696e4d657373656e67657220616c72656164792069604082015269373a34b0b634bd32b21760b11b606082015260800190565b60006020825261121d6020830184612b4c565b60405181810167ffffffffffffffff81118282101715612ffd57fe5b604052919050565b60005b83811015613020578181015183820152602001613008565b8381111561302f576000848401525b5050505056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737350726f766964656420524c50206c6973742065786365656473206d6178206c697374206c656e6774682e496e697469616c697a61626c653a20636f6e747261637420697320616c726561647920696e697469616c697a656452656365697665642061206e6f6465207769746820616e20756e6b6e6f776e207072656669784f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a2646970667358221220c8b08248358fc9118d8d145603700ec8109487e93128f8f4b5dafd0a63cf3bad64736f6c63430007060033", "devdoc": { "details": "The L1 Cross Domain Messenger contract sends messages from L1 to L2, and relays messages from L2 onto L1. In the event that a message sent from L1 to L2 is rejected for exceeding the L2 epoch gas limit, it can be resubmitted via this contract's replay function. Compiler used: solc Runtime target: EVM", "kind": "dev", "methods": { + "allowMessage(bytes32)": { + "params": { + "_xDomainCalldataHash": "Hash of the message to block." + } + }, + "blockMessage(bytes32)": { + "params": { + "_xDomainCalldataHash": "Hash of the message to block." + } + }, "initialize(address)": { "params": { "_libAddressManager": "Address of the Address Manager." } }, + "owner()": { + "details": "Returns the address of the current owner." + }, + "paused()": { + "details": "Returns true if the contract is paused, and false otherwise." + }, "relayMessage(address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))": { "params": { "_message": "Message to send to the target.", @@ -355,6 +553,9 @@ "_target": "Target contract address." } }, + "renounceOwnership()": { + "details": "Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner." + }, "replayMessage(address,address,bytes,uint256,uint32)": { "params": { "_gasLimit": "Gas limit for the provided message.", @@ -364,12 +565,23 @@ "_target": "Target contract address." } }, + "resolve(string)": { + "params": { + "_name": "Name to resolve an address for." + }, + "returns": { + "_0": "Address associated with the given name." + } + }, "sendMessage(address,bytes,uint32)": { "params": { "_gasLimit": "Gas limit for the provided message.", "_message": "Message to send to the target.", "_target": "Target contract address." } + }, + "transferOwnership(address)": { + "details": "Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner." } }, "title": "OVM_L1CrossDomainMessenger", @@ -378,8 +590,17 @@ "userdoc": { "kind": "user", "methods": { + "allowMessage(bytes32)": { + "notice": "Allow a message." + }, + "blockMessage(bytes32)": { + "notice": "Block a message." + }, "constructor": { - "notice": "Pass a default zero address to the address resolver. This will be updated when initialized." + "notice": "This contract is intended to be behind a delegate proxy. We pass the zero address to the address resolver just to satisfy the constructor. We still need to set this value in initialize()." + }, + "pause()": { + "notice": "Pause relaying." }, "relayMessage(address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))": { "notice": "Relays a cross domain message to a contract." @@ -387,6 +608,9 @@ "replayMessage(address,address,bytes,uint256,uint32)": { "notice": "Replays a cross domain message to the target messenger." }, + "resolve(string)": { + "notice": "Resolves the address associated with a given name." + }, "sendMessage(address,bytes,uint32)": { "notice": "Sends a cross domain message to the target messenger." } @@ -396,60 +620,132 @@ "storageLayout": { "storage": [ { - "astId": 17744, + "astId": 1272, "contract": "contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1CrossDomainMessenger.sol:OVM_L1CrossDomainMessenger", - "label": "_status", + "label": "relayedMessages", "offset": 0, "slot": "0", - "type": "t_uint256" + "type": "t_mapping(t_bytes32,t_bool)" }, { - "astId": 686, + "astId": 1276, "contract": "contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1CrossDomainMessenger.sol:OVM_L1CrossDomainMessenger", - "label": "relayedMessages", + "label": "successfulMessages", "offset": 0, "slot": "1", "type": "t_mapping(t_bytes32,t_bool)" }, { - "astId": 690, + "astId": 1280, "contract": "contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1CrossDomainMessenger.sol:OVM_L1CrossDomainMessenger", - "label": "successfulMessages", + "label": "sentMessages", "offset": 0, "slot": "2", "type": "t_mapping(t_bytes32,t_bool)" }, { - "astId": 694, + "astId": 1282, "contract": "contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1CrossDomainMessenger.sol:OVM_L1CrossDomainMessenger", - "label": "sentMessages", + "label": "messageNonce", "offset": 0, "slot": "3", - "type": "t_mapping(t_bytes32,t_bool)" + "type": "t_uint256" }, { - "astId": 696, + "astId": 1285, "contract": "contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1CrossDomainMessenger.sol:OVM_L1CrossDomainMessenger", - "label": "messageNonce", + "label": "xDomainMsgSender", "offset": 0, "slot": "4", - "type": "t_uint256" + "type": "t_address" }, { - "astId": 699, + "astId": 12800, "contract": "contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1CrossDomainMessenger.sol:OVM_L1CrossDomainMessenger", - "label": "xDomainMsgSender", + "label": "libAddressManager", "offset": 0, "slot": "5", - "type": "t_address" + "type": "t_contract(Lib_AddressManager)12793" }, { - "astId": 12526, + "astId": 137, "contract": "contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1CrossDomainMessenger.sol:OVM_L1CrossDomainMessenger", - "label": "libAddressManager", + "label": "_initialized", + "offset": 20, + "slot": "5", + "type": "t_bool" + }, + { + "astId": 140, + "contract": "contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1CrossDomainMessenger.sol:OVM_L1CrossDomainMessenger", + "label": "_initializing", + "offset": 21, + "slot": "5", + "type": "t_bool" + }, + { + "astId": 484, + "contract": "contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1CrossDomainMessenger.sol:OVM_L1CrossDomainMessenger", + "label": "__gap", "offset": 0, "slot": "6", - "type": "t_contract(Lib_AddressManager)12519" + "type": "t_array(t_uint256)50_storage" + }, + { + "astId": 10, + "contract": "contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1CrossDomainMessenger.sol:OVM_L1CrossDomainMessenger", + "label": "_owner", + "offset": 0, + "slot": "56", + "type": "t_address" + }, + { + "astId": 129, + "contract": "contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1CrossDomainMessenger.sol:OVM_L1CrossDomainMessenger", + "label": "__gap", + "offset": 0, + "slot": "57", + "type": "t_array(t_uint256)49_storage" + }, + { + "astId": 506, + "contract": "contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1CrossDomainMessenger.sol:OVM_L1CrossDomainMessenger", + "label": "_paused", + "offset": 0, + "slot": "106", + "type": "t_bool" + }, + { + "astId": 597, + "contract": "contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1CrossDomainMessenger.sol:OVM_L1CrossDomainMessenger", + "label": "__gap", + "offset": 0, + "slot": "107", + "type": "t_array(t_uint256)49_storage" + }, + { + "astId": 612, + "contract": "contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1CrossDomainMessenger.sol:OVM_L1CrossDomainMessenger", + "label": "_status", + "offset": 0, + "slot": "156", + "type": "t_uint256" + }, + { + "astId": 655, + "contract": "contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1CrossDomainMessenger.sol:OVM_L1CrossDomainMessenger", + "label": "__gap", + "offset": 0, + "slot": "157", + "type": "t_array(t_uint256)49_storage" + }, + { + "astId": 1436, + "contract": "contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1CrossDomainMessenger.sol:OVM_L1CrossDomainMessenger", + "label": "blockedMessages", + "offset": 0, + "slot": "206", + "type": "t_mapping(t_bytes32,t_bool)" } ], "types": { @@ -458,6 +754,18 @@ "label": "address", "numberOfBytes": "20" }, + "t_array(t_uint256)49_storage": { + "base": "t_uint256", + "encoding": "inplace", + "label": "uint256[49]", + "numberOfBytes": "1568" + }, + "t_array(t_uint256)50_storage": { + "base": "t_uint256", + "encoding": "inplace", + "label": "uint256[50]", + "numberOfBytes": "1600" + }, "t_bool": { "encoding": "inplace", "label": "bool", @@ -468,7 +776,7 @@ "label": "bytes32", "numberOfBytes": "32" }, - "t_contract(Lib_AddressManager)12519": { + "t_contract(Lib_AddressManager)12793": { "encoding": "inplace", "label": "contract Lib_AddressManager", "numberOfBytes": "20" diff --git a/packages/contracts/deployments/kovan/OVM_L1ETHGateway.json b/packages/contracts/deployments/kovan/OVM_L1ETHGateway.json index ea3f3cbbf5dbe..71e3eabd74fbf 100644 --- a/packages/contracts/deployments/kovan/OVM_L1ETHGateway.json +++ b/packages/contracts/deployments/kovan/OVM_L1ETHGateway.json @@ -1,5 +1,5 @@ { - "address": "0x0E8917aF9eB7812c7819EF4e80D2217679d11324", + "address": "0x25bb69ee5665536Ce6aeb51094F0bed9e4DACc30", "abi": [ { "inputs": [], @@ -170,7 +170,7 @@ "outputs": [ { "internalType": "address", - "name": "_contract", + "name": "", "type": "address" } ], @@ -182,27 +182,27 @@ "type": "receive" } ], - "transactionHash": "0xb87d7da559c1abfbf55ae1d57e9bcccd86a6ee98c61b43a5ae0d6416fe3388ae", + "transactionHash": "0xdee55e4f063e0e623d64d84766a08cdff904d121126b845ebc3e565fad826f6b", "receipt": { "to": null, "from": "0x18394B52d3Cb931dfA76F63251919D051953413d", - "contractAddress": "0x0E8917aF9eB7812c7819EF4e80D2217679d11324", + "contractAddress": "0x25bb69ee5665536Ce6aeb51094F0bed9e4DACc30", "transactionIndex": 3, - "gasUsed": "599914", + "gasUsed": "608764", "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0xadb2eeb73396f7ba8103108bd8590b03772148fed1f42b8c0455fb01cc2c6a6c", - "transactionHash": "0xb87d7da559c1abfbf55ae1d57e9bcccd86a6ee98c61b43a5ae0d6416fe3388ae", + "blockHash": "0x7b251469ad62221d42e05992bb7fac0bb492bc2939a072d90039a585f58e524f", + "transactionHash": "0xdee55e4f063e0e623d64d84766a08cdff904d121126b845ebc3e565fad826f6b", "logs": [], - "blockNumber": 24199529, - "cumulativeGasUsed": "760986", + "blockNumber": 24572892, + "cumulativeGasUsed": "752908", "status": 1, "byzantium": true }, "args": [], - "solcInputHash": "03aed03b958b1d37f90bd88d0f56dd85", - "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"DepositInitiated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"WithdrawalFinalized\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"deposit\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"}],\"name\":\"depositTo\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"finalizeWithdrawal\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getFinalizeDepositL2Gas\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_ovmEth\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"messenger\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ovmEth\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"_contract\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"details\":\"The L1 ETH Gateway is a contract which stores deposited ETH that is in use on L2. Compiler used: solc Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"deposit()\":{\"details\":\"deposit an amount of the ETH to the caller's balance on L2\"},\"depositTo(address)\":{\"details\":\"deposit an amount of ETH to a recipients's balance on L2\",\"params\":{\"_to\":\"L2 address to credit the withdrawal to\"}},\"finalizeWithdrawal(address,uint256)\":{\"details\":\"Complete a withdrawal from L2 to L1, and credit funds to the recipient's balance of the L1 ETH token. Since only the xDomainMessenger can call this function, it will never be called before the withdrawal is finalized. \",\"params\":{\"_amount\":\"Amount of the ETH to withdraw\",\"_to\":\"L1 address to credit the withdrawal to\"}},\"initialize(address,address)\":{\"params\":{\"_libAddressManager\":\"Address manager for this OE deployment\",\"_ovmEth\":\"L2 OVM_ETH implementation of iOVM_DepositedToken\"}}},\"title\":\"OVM_L1ETHGateway\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/OVM/bridge/tokens/OVM_L1ETHGateway.sol\":\"OVM_L1ETHGateway\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/optimistic-ethereum/OVM/bridge/tokens/OVM_L1ETHGateway.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// @unsupported: ovm\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Interface Imports */\\nimport { iOVM_L1ETHGateway } from \\\"../../../iOVM/bridge/tokens/iOVM_L1ETHGateway.sol\\\";\\nimport { iOVM_L2DepositedToken } from \\\"../../../iOVM/bridge/tokens/iOVM_L2DepositedToken.sol\\\";\\n\\n/* Library Imports */\\nimport { OVM_CrossDomainEnabled } from \\\"../../../libraries/bridge/OVM_CrossDomainEnabled.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../../libraries/resolver/Lib_AddressResolver.sol\\\";\\nimport { Lib_AddressManager } from \\\"../../../libraries/resolver/Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title OVM_L1ETHGateway\\n * @dev The L1 ETH Gateway is a contract which stores deposited ETH that is in use on L2.\\n *\\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract OVM_L1ETHGateway is iOVM_L1ETHGateway, OVM_CrossDomainEnabled, Lib_AddressResolver {\\n\\n /********************\\n * Public Constants *\\n ********************/\\n\\n uint32 public constant override getFinalizeDepositL2Gas = 1200000;\\n\\n /********************************\\n * External Contract References *\\n ********************************/\\n\\n address public ovmEth;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n // This contract lives behind a proxy, so the constructor parameters will go unused.\\n constructor()\\n OVM_CrossDomainEnabled(address(0))\\n Lib_AddressResolver(address(0))\\n public\\n {}\\n\\n /******************\\n * Initialization *\\n ******************/\\n\\n /**\\n * @param _libAddressManager Address manager for this OE deployment\\n * @param _ovmEth L2 OVM_ETH implementation of iOVM_DepositedToken\\n */\\n function initialize(\\n address _libAddressManager,\\n address _ovmEth\\n )\\n public\\n {\\n require(libAddressManager == Lib_AddressManager(0), \\\"Contract has already been initialized.\\\");\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n ovmEth = _ovmEth;\\n messenger = resolve(\\\"Proxy__OVM_L1CrossDomainMessenger\\\");\\n }\\n\\n /**************\\n * Depositing *\\n **************/\\n\\n receive()\\n external\\n payable\\n {\\n _initiateDeposit(msg.sender, msg.sender);\\n }\\n\\n /**\\n * @dev deposit an amount of the ETH to the caller's balance on L2\\n */\\n function deposit() \\n external\\n override\\n payable\\n {\\n _initiateDeposit(msg.sender, msg.sender);\\n }\\n\\n /**\\n * @dev deposit an amount of ETH to a recipients's balance on L2\\n * @param _to L2 address to credit the withdrawal to\\n */\\n function depositTo(\\n address _to\\n )\\n external\\n override\\n payable\\n {\\n _initiateDeposit(msg.sender, _to);\\n }\\n\\n /**\\n * @dev Performs the logic for deposits by storing the ETH and informing the L2 ETH Gateway of the deposit.\\n *\\n * @param _from Account to pull the deposit from on L1\\n * @param _to Account to give the deposit to on L2\\n */\\n function _initiateDeposit(\\n address _from,\\n address _to\\n )\\n internal\\n {\\n // Construct calldata for l2ETHGateway.finalizeDeposit(_to, _amount)\\n bytes memory data =\\n abi.encodeWithSelector(\\n iOVM_L2DepositedToken.finalizeDeposit.selector,\\n _to,\\n msg.value\\n );\\n\\n // Send calldata into L2\\n sendCrossDomainMessage(\\n ovmEth,\\n data,\\n getFinalizeDepositL2Gas\\n );\\n\\n emit DepositInitiated(_from, _to, msg.value);\\n }\\n\\n /*************************\\n * Cross-chain Functions *\\n *************************/\\n\\n /**\\n * @dev Complete a withdrawal from L2 to L1, and credit funds to the recipient's balance of the\\n * L1 ETH token.\\n * Since only the xDomainMessenger can call this function, it will never be called before the withdrawal is finalized. \\n *\\n * @param _to L1 address to credit the withdrawal to\\n * @param _amount Amount of the ETH to withdraw\\n */\\n function finalizeWithdrawal(\\n address _to,\\n uint256 _amount\\n )\\n external\\n override\\n onlyFromCrossDomainAccount(ovmEth)\\n {\\n _safeTransferETH(_to, _amount);\\n\\n emit WithdrawalFinalized(_to, _amount);\\n }\\n\\n /**********************************\\n * Internal Functions: Accounting *\\n **********************************/\\n\\n /**\\n * @dev Internal accounting function for moving around L1 ETH.\\n *\\n * @param _to L1 address to transfer ETH to\\n * @param _value Amount of ETH to send to\\n */\\n function _safeTransferETH(\\n address _to,\\n uint256 _value\\n )\\n internal\\n {\\n (bool success, ) = _to.call{value: _value}(new bytes(0));\\n require(success, 'TransferHelper::safeTransferETH: ETH transfer failed');\\n }\\n}\\n\",\"keccak256\":\"0x2fff613bf362d01f05d8653247fe46b07dd7bb21c460a30e471d45b7ebd0e627\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/bridge/messaging/iAbs_BaseCrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/**\\n * @title iAbs_BaseCrossDomainMessenger\\n */\\ninterface iAbs_BaseCrossDomainMessenger {\\n\\n /**********\\n * Events *\\n **********/\\n event SentMessage(bytes message);\\n event RelayedMessage(bytes32 msgHash);\\n\\n /**********************\\n * Contract Variables *\\n **********************/\\n function xDomainMessageSender() external view returns (address);\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sends a cross domain message to the target messenger.\\n * @param _target Target contract address.\\n * @param _message Message to send to the target.\\n * @param _gasLimit Gas limit for the provided message.\\n */\\n function sendMessage(\\n address _target,\\n bytes calldata _message,\\n uint32 _gasLimit\\n ) external;\\n}\\n\",\"keccak256\":\"0xc2bd6b373daae2ede34281f4be5938d02b9d1cfb056b40d65ff70b7f16ce3c86\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/bridge/tokens/iOVM_L1ETHGateway.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0;\\npragma experimental ABIEncoderV2;\\n\\n/**\\n * @title iOVM_L1ETHGateway\\n */\\ninterface iOVM_L1ETHGateway {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event DepositInitiated(\\n address indexed _from,\\n address _to,\\n uint256 _amount\\n );\\n\\n event WithdrawalFinalized(\\n address indexed _to,\\n uint256 _amount\\n );\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function deposit()\\n external\\n payable;\\n\\n function depositTo(\\n address _to\\n )\\n external\\n payable;\\n\\n /*************************\\n * Cross-chain Functions *\\n *************************/\\n\\n function finalizeWithdrawal(\\n address _to,\\n uint _amount\\n )\\n external;\\n\\n function getFinalizeDepositL2Gas()\\n external\\n view\\n returns(\\n uint32\\n );\\n}\\n\",\"keccak256\":\"0x7e6805c5cacfd159410c7cd57a3d586e0fc5810bc46600bbd840a252e243e5ba\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/bridge/tokens/iOVM_L2DepositedToken.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0;\\npragma experimental ABIEncoderV2;\\n\\n/**\\n * @title iOVM_L2DepositedToken\\n */\\ninterface iOVM_L2DepositedToken {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event WithdrawalInitiated(\\n address indexed _from,\\n address _to,\\n uint256 _amount\\n );\\n\\n event DepositFinalized(\\n address indexed _to,\\n uint256 _amount\\n ); \\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function withdraw(\\n uint _amount\\n )\\n external;\\n\\n function withdrawTo(\\n address _to,\\n uint _amount\\n )\\n external;\\n\\n\\n /*************************\\n * Cross-chain Functions *\\n *************************/\\n\\n function finalizeDeposit(\\n address _to,\\n uint _amount\\n )\\n external;\\n}\\n\",\"keccak256\":\"0xaa874355e98c444a58712179acaf5ca344296dfa8229577a38a1d14160ce46f8\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/bridge/OVM_CrossDomainEnabled.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n/* Interface Imports */\\nimport { iAbs_BaseCrossDomainMessenger } from \\\"../../iOVM/bridge/messaging/iAbs_BaseCrossDomainMessenger.sol\\\";\\n\\n/**\\n * @title OVM_CrossDomainEnabled\\n * @dev Helper contract for contracts performing cross-domain communications\\n *\\n * Compiler used: defined by inheriting contract\\n * Runtime target: defined by inheriting contract\\n */\\ncontract OVM_CrossDomainEnabled {\\n // Messenger contract used to send and recieve messages from the other domain.\\n address public messenger;\\n\\n /***************\\n * Constructor *\\n ***************/ \\n constructor(\\n address _messenger\\n ) {\\n messenger = _messenger;\\n }\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n /**\\n * @notice Enforces that the modified function is only callable by a specific cross-domain account.\\n * @param _sourceDomainAccount The only account on the originating domain which is authenticated to call this function.\\n */\\n modifier onlyFromCrossDomainAccount(\\n address _sourceDomainAccount\\n ) {\\n require(\\n msg.sender == address(getCrossDomainMessenger()),\\n \\\"OVM_XCHAIN: messenger contract unauthenticated\\\"\\n );\\n\\n require(\\n getCrossDomainMessenger().xDomainMessageSender() == _sourceDomainAccount,\\n \\\"OVM_XCHAIN: wrong sender of cross-domain message\\\"\\n );\\n\\n _;\\n }\\n \\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * @notice Gets the messenger, usually from storage. This function is exposed in case a child contract needs to override.\\n * @return The address of the cross-domain messenger contract which should be used. \\n */\\n function getCrossDomainMessenger()\\n internal\\n virtual\\n returns(\\n iAbs_BaseCrossDomainMessenger\\n )\\n {\\n return iAbs_BaseCrossDomainMessenger(messenger);\\n }\\n\\n /**\\n * @notice Sends a message to an account on another domain\\n * @param _crossDomainTarget The intended recipient on the destination domain\\n * @param _data The data to send to the target (usually calldata to a function with `onlyFromCrossDomainAccount()`)\\n * @param _gasLimit The gasLimit for the receipt of the message on the target domain.\\n */\\n function sendCrossDomainMessage(\\n address _crossDomainTarget,\\n bytes memory _data,\\n uint32 _gasLimit\\n ) internal {\\n getCrossDomainMessenger().sendMessage(_crossDomainTarget, _data, _gasLimit);\\n }\\n}\\n\",\"keccak256\":\"0x1b1c5adbb359f3f46ca9e43b366a80563c031560e9f1f24ab4742b2d79403ce7\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Contract Imports */\\nimport { Ownable } from \\\"./Lib_Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n /*******************************************\\n * Contract Variables: Internal Accounting *\\n *******************************************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n public\\n onlyOwner\\n {\\n emit AddressSet(_name, _address);\\n addresses[_getNameHash(_name)] = _address;\\n }\\n\\n function getAddress(\\n string memory _name\\n )\\n public\\n view\\n returns (address)\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32 _hash\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0x3a490595cc21ff170e4027843093670ff845d5972481fbfb956b722ea564bb06\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n\\n /*******************************************\\n * Contract Variables: Contract References *\\n *******************************************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(\\n address _libAddressManager\\n ) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function resolve(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address _contract\\n )\\n {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0xaa3ed342f6deb156c660fd83afa579a3b80db17eb465e8949cf5c1b114780143\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Ownable\\n * @dev Adapted from https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol\\n */\\nabstract contract Ownable {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n address public owner;\\n\\n\\n /**********\\n * Events *\\n **********/\\n\\n event OwnershipTransferred(\\n address indexed previousOwner,\\n address indexed newOwner\\n );\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n constructor() {\\n owner = msg.sender;\\n emit OwnershipTransferred(address(0), owner);\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n owner == msg.sender,\\n \\\"Ownable: caller is not the owner\\\"\\n );\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function renounceOwnership()\\n public\\n virtual\\n onlyOwner\\n {\\n emit OwnershipTransferred(owner, address(0));\\n owner = address(0);\\n }\\n\\n function transferOwnership(address _newOwner)\\n public\\n virtual\\n onlyOwner\\n {\\n require(\\n _newOwner != address(0),\\n \\\"Ownable: new owner cannot be the zero address\\\"\\n );\\n\\n emit OwnershipTransferred(owner, _newOwner);\\n owner = _newOwner;\\n }\\n}\\n\",\"keccak256\":\"0xd9dfd9264e5b5fedd53a5b10fdf179c3f367614b0fe69179bce4e45119f5b739\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x608060405234801561001057600080fd5b50600080546001600160a01b03199081169091556001805490911690556109d28061003c6000396000f3fe60806040526004361061008a5760003560e01c8063485cc95511610059578063485cc95514610122578063490b5b7814610142578063b760faf914610157578063d0e30db01461016a578063f4f7b41a146101725761009b565b80631273a090146100a0578063299ca478146100cb5780633cb747bf146100ed578063461a4478146101025761009b565b3661009b576100993333610192565b005b600080fd5b3480156100ac57600080fd5b506100b5610246565b6040516100c29190610935565b60405180910390f35b3480156100d757600080fd5b506100e061024d565b6040516100c29190610865565b3480156100f957600080fd5b506100e061025c565b34801561010e57600080fd5b506100e061011d366004610797565b61026b565b34801561012e57600080fd5b5061009961013d36600461073c565b610347565b34801561014e57600080fd5b506100e06103ef565b61009961016536600461071b565b6103fe565b61009961040b565b34801561017e57600080fd5b5061009961018d36600461076e565b610417565b6000638d6e9a5b60e01b82346040516024016101af929190610879565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526002549091506101fe906001600160a01b03168262124f80610578565b826001600160a01b03167ff531653a5819e21265de50358610d55dbe6594c61605b209dfa4280d277938c18334604051610239929190610879565b60405180910390a2505050565b62124f8081565b6001546001600160a01b031681565b6000546001600160a01b031681565b60015460405163bf40fac160e01b81526020600482018181528451602484015284516000946001600160a01b03169363bf40fac1938793928392604401918501908083838b5b838110156102c95781810151838201526020016102b1565b50505050905090810190601f1680156102f65780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561031357600080fd5b505afa158015610327573d6000803e3d6000fd5b505050506040513d602081101561033d57600080fd5b505190505b919050565b6001546001600160a01b0316156103795760405162461bcd60e51b8152600401610370906108e6565b60405180910390fd5b600180546001600160a01b038085166001600160a01b0319928316179092556002805492841692909116919091179055604080516060810190915260218082526103cb91906109a5602083013961026b565b600080546001600160a01b0319166001600160a01b03929092169190911790555050565b6002546001600160a01b031681565b6104083382610192565b50565b6104153333610192565b565b6002546001600160a01b031661042b610663565b6001600160a01b0316336001600160a01b03161461047a5760405162461bcd60e51b815260040180806020018281038252602e815260200180610947602e913960400191505060405180910390fd5b806001600160a01b031661048c610663565b6001600160a01b0316636e296e456040518163ffffffff1660e01b815260040160206040518083038186803b1580156104c457600080fd5b505afa1580156104d8573d6000803e3d6000fd5b505050506040513d60208110156104ee57600080fd5b50516001600160a01b0316146105355760405162461bcd60e51b81526004018080602001828103825260308152602001806109756030913960400191505060405180910390fd5b61053f8383610672565b826001600160a01b03167f9e5c4f9f4e46b8629d3dda85f43a69194f50254404a72dc62b9e932d9c94eda883604051610239919061092c565b610580610663565b6001600160a01b0316633dbb202b8484846040518463ffffffff1660e01b815260040180846001600160a01b03168152602001806020018363ffffffff168152602001828103825284818151815260200191508051906020019080838360005b838110156105f85781810151838201526020016105e0565b50505050905090810190601f1680156106255780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b15801561064657600080fd5b505af115801561065a573d6000803e3d6000fd5b50505050505050565b6000546001600160a01b031690565b604080516000808252602082019092526001600160a01b03841690839060405161069c919061082c565b60006040518083038185875af1925050503d80600081146106d9576040519150601f19603f3d011682016040523d82523d6000602084013e6106de565b606091505b50509050806106ff5760405162461bcd60e51b815260040161037090610892565b505050565b80356001600160a01b038116811461034257600080fd5b60006020828403121561072c578081fd5b61073582610704565b9392505050565b6000806040838503121561074e578081fd5b61075783610704565b915061076560208401610704565b90509250929050565b60008060408385031215610780578182fd5b61078983610704565b946020939093013593505050565b600060208083850312156107a9578182fd5b823567ffffffffffffffff808211156107c0578384fd5b818501915085601f8301126107d3578384fd5b8135818111156107df57fe5b604051601f8201601f19168101850183811182821017156107fc57fe5b6040528181528382018501881015610812578586fd5b818585018683013790810190930193909352509392505050565b60008251815b8181101561084c5760208186018101518583015201610832565b8181111561085a5782828501525b509190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b60208082526034908201527f5472616e7366657248656c7065723a3a736166655472616e736665724554483a60408201527308115512081d1c985b9cd9995c8819985a5b195960621b606082015260800190565b60208082526026908201527f436f6e74726163742068617320616c7265616479206265656e20696e697469616040820152653634bd32b21760d11b606082015260800190565b90815260200190565b63ffffffff9190911681526020019056fe4f564d5f58434841494e3a206d657373656e67657220636f6e747261637420756e61757468656e746963617465644f564d5f58434841494e3a2077726f6e672073656e646572206f662063726f73732d646f6d61696e206d65737361676550726f78795f5f4f564d5f4c3143726f7373446f6d61696e4d657373656e676572a164736f6c6343000706000a", - "deployedBytecode": "0x60806040526004361061008a5760003560e01c8063485cc95511610059578063485cc95514610122578063490b5b7814610142578063b760faf914610157578063d0e30db01461016a578063f4f7b41a146101725761009b565b80631273a090146100a0578063299ca478146100cb5780633cb747bf146100ed578063461a4478146101025761009b565b3661009b576100993333610192565b005b600080fd5b3480156100ac57600080fd5b506100b5610246565b6040516100c29190610935565b60405180910390f35b3480156100d757600080fd5b506100e061024d565b6040516100c29190610865565b3480156100f957600080fd5b506100e061025c565b34801561010e57600080fd5b506100e061011d366004610797565b61026b565b34801561012e57600080fd5b5061009961013d36600461073c565b610347565b34801561014e57600080fd5b506100e06103ef565b61009961016536600461071b565b6103fe565b61009961040b565b34801561017e57600080fd5b5061009961018d36600461076e565b610417565b6000638d6e9a5b60e01b82346040516024016101af929190610879565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526002549091506101fe906001600160a01b03168262124f80610578565b826001600160a01b03167ff531653a5819e21265de50358610d55dbe6594c61605b209dfa4280d277938c18334604051610239929190610879565b60405180910390a2505050565b62124f8081565b6001546001600160a01b031681565b6000546001600160a01b031681565b60015460405163bf40fac160e01b81526020600482018181528451602484015284516000946001600160a01b03169363bf40fac1938793928392604401918501908083838b5b838110156102c95781810151838201526020016102b1565b50505050905090810190601f1680156102f65780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561031357600080fd5b505afa158015610327573d6000803e3d6000fd5b505050506040513d602081101561033d57600080fd5b505190505b919050565b6001546001600160a01b0316156103795760405162461bcd60e51b8152600401610370906108e6565b60405180910390fd5b600180546001600160a01b038085166001600160a01b0319928316179092556002805492841692909116919091179055604080516060810190915260218082526103cb91906109a5602083013961026b565b600080546001600160a01b0319166001600160a01b03929092169190911790555050565b6002546001600160a01b031681565b6104083382610192565b50565b6104153333610192565b565b6002546001600160a01b031661042b610663565b6001600160a01b0316336001600160a01b03161461047a5760405162461bcd60e51b815260040180806020018281038252602e815260200180610947602e913960400191505060405180910390fd5b806001600160a01b031661048c610663565b6001600160a01b0316636e296e456040518163ffffffff1660e01b815260040160206040518083038186803b1580156104c457600080fd5b505afa1580156104d8573d6000803e3d6000fd5b505050506040513d60208110156104ee57600080fd5b50516001600160a01b0316146105355760405162461bcd60e51b81526004018080602001828103825260308152602001806109756030913960400191505060405180910390fd5b61053f8383610672565b826001600160a01b03167f9e5c4f9f4e46b8629d3dda85f43a69194f50254404a72dc62b9e932d9c94eda883604051610239919061092c565b610580610663565b6001600160a01b0316633dbb202b8484846040518463ffffffff1660e01b815260040180846001600160a01b03168152602001806020018363ffffffff168152602001828103825284818151815260200191508051906020019080838360005b838110156105f85781810151838201526020016105e0565b50505050905090810190601f1680156106255780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b15801561064657600080fd5b505af115801561065a573d6000803e3d6000fd5b50505050505050565b6000546001600160a01b031690565b604080516000808252602082019092526001600160a01b03841690839060405161069c919061082c565b60006040518083038185875af1925050503d80600081146106d9576040519150601f19603f3d011682016040523d82523d6000602084013e6106de565b606091505b50509050806106ff5760405162461bcd60e51b815260040161037090610892565b505050565b80356001600160a01b038116811461034257600080fd5b60006020828403121561072c578081fd5b61073582610704565b9392505050565b6000806040838503121561074e578081fd5b61075783610704565b915061076560208401610704565b90509250929050565b60008060408385031215610780578182fd5b61078983610704565b946020939093013593505050565b600060208083850312156107a9578182fd5b823567ffffffffffffffff808211156107c0578384fd5b818501915085601f8301126107d3578384fd5b8135818111156107df57fe5b604051601f8201601f19168101850183811182821017156107fc57fe5b6040528181528382018501881015610812578586fd5b818585018683013790810190930193909352509392505050565b60008251815b8181101561084c5760208186018101518583015201610832565b8181111561085a5782828501525b509190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b60208082526034908201527f5472616e7366657248656c7065723a3a736166655472616e736665724554483a60408201527308115512081d1c985b9cd9995c8819985a5b195960621b606082015260800190565b60208082526026908201527f436f6e74726163742068617320616c7265616479206265656e20696e697469616040820152653634bd32b21760d11b606082015260800190565b90815260200190565b63ffffffff9190911681526020019056fe4f564d5f58434841494e3a206d657373656e67657220636f6e747261637420756e61757468656e746963617465644f564d5f58434841494e3a2077726f6e672073656e646572206f662063726f73732d646f6d61696e206d65737361676550726f78795f5f4f564d5f4c3143726f7373446f6d61696e4d657373656e676572a164736f6c6343000706000a", + "solcInputHash": "5ee8e508e2c54cb5ac6783b4855b1558", + "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"DepositInitiated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"WithdrawalFinalized\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"deposit\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"}],\"name\":\"depositTo\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"finalizeWithdrawal\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getFinalizeDepositL2Gas\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_ovmEth\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"messenger\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ovmEth\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"details\":\"The L1 ETH Gateway is a contract which stores deposited ETH that is in use on L2. Compiler used: solc Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"deposit()\":{\"details\":\"deposit an amount of the ETH to the caller's balance on L2\"},\"depositTo(address)\":{\"details\":\"deposit an amount of ETH to a recipients's balance on L2\",\"params\":{\"_to\":\"L2 address to credit the withdrawal to\"}},\"finalizeWithdrawal(address,uint256)\":{\"details\":\"Complete a withdrawal from L2 to L1, and credit funds to the recipient's balance of the L1 ETH token. Since only the xDomainMessenger can call this function, it will never be called before the withdrawal is finalized.\",\"params\":{\"_amount\":\"Amount of the ETH to withdraw\",\"_to\":\"L1 address to credit the withdrawal to\"}},\"initialize(address,address)\":{\"params\":{\"_libAddressManager\":\"Address manager for this OE deployment\",\"_ovmEth\":\"L2 OVM_ETH implementation of iOVM_DepositedToken\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}}},\"title\":\"OVM_L1ETHGateway\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/OVM/bridge/tokens/OVM_L1ETHGateway.sol\":\"OVM_L1ETHGateway\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor () internal {\\n address msgSender = _msgSender();\\n _owner = msgSender;\\n emit OwnershipTransferred(address(0), msgSender);\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n emit OwnershipTransferred(_owner, address(0));\\n _owner = address(0);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n emit OwnershipTransferred(_owner, newOwner);\\n _owner = newOwner;\\n }\\n}\\n\",\"keccak256\":\"0x15e2d5bd4c28a88548074c54d220e8086f638a71ed07e6b3ba5a70066fcf458d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with GSN meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address payable) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes memory) {\\n this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x8d3cb350f04ff49cfb10aef08d87f19dcbaecc8027b0bed12f3275cd12f38cf0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/bridge/tokens/OVM_L1ETHGateway.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// @unsupported: ovm\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Interface Imports */\\nimport { iOVM_L1ETHGateway } from \\\"../../../iOVM/bridge/tokens/iOVM_L1ETHGateway.sol\\\";\\nimport { iOVM_L2DepositedToken } from \\\"../../../iOVM/bridge/tokens/iOVM_L2DepositedToken.sol\\\";\\n\\n/* Library Imports */\\nimport { OVM_CrossDomainEnabled } from \\\"../../../libraries/bridge/OVM_CrossDomainEnabled.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../../libraries/resolver/Lib_AddressResolver.sol\\\";\\nimport { Lib_AddressManager } from \\\"../../../libraries/resolver/Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title OVM_L1ETHGateway\\n * @dev The L1 ETH Gateway is a contract which stores deposited ETH that is in use on L2.\\n *\\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract OVM_L1ETHGateway is iOVM_L1ETHGateway, OVM_CrossDomainEnabled, Lib_AddressResolver {\\n\\n /********************\\n * Public Constants *\\n ********************/\\n\\n uint32 public constant override getFinalizeDepositL2Gas = 1200000;\\n\\n /********************************\\n * External Contract References *\\n ********************************/\\n\\n address public ovmEth;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n // This contract lives behind a proxy, so the constructor parameters will go unused.\\n constructor()\\n OVM_CrossDomainEnabled(address(0))\\n Lib_AddressResolver(address(0))\\n public\\n {}\\n\\n /******************\\n * Initialization *\\n ******************/\\n\\n /**\\n * @param _libAddressManager Address manager for this OE deployment\\n * @param _ovmEth L2 OVM_ETH implementation of iOVM_DepositedToken\\n */\\n function initialize(\\n address _libAddressManager,\\n address _ovmEth\\n )\\n public\\n {\\n require(libAddressManager == Lib_AddressManager(0), \\\"Contract has already been initialized.\\\");\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n ovmEth = _ovmEth;\\n messenger = resolve(\\\"Proxy__OVM_L1CrossDomainMessenger\\\");\\n }\\n\\n /**************\\n * Depositing *\\n **************/\\n\\n receive()\\n external\\n payable\\n {\\n _initiateDeposit(msg.sender, msg.sender);\\n }\\n\\n /**\\n * @dev deposit an amount of the ETH to the caller's balance on L2\\n */\\n function deposit()\\n external\\n override\\n payable\\n {\\n _initiateDeposit(msg.sender, msg.sender);\\n }\\n\\n /**\\n * @dev deposit an amount of ETH to a recipients's balance on L2\\n * @param _to L2 address to credit the withdrawal to\\n */\\n function depositTo(\\n address _to\\n )\\n external\\n override\\n payable\\n {\\n _initiateDeposit(msg.sender, _to);\\n }\\n\\n /**\\n * @dev Performs the logic for deposits by storing the ETH and informing the L2 ETH Gateway of the deposit.\\n *\\n * @param _from Account to pull the deposit from on L1\\n * @param _to Account to give the deposit to on L2\\n */\\n function _initiateDeposit(\\n address _from,\\n address _to\\n )\\n internal\\n {\\n // Construct calldata for l2ETHGateway.finalizeDeposit(_to, _amount)\\n bytes memory data =\\n abi.encodeWithSelector(\\n iOVM_L2DepositedToken.finalizeDeposit.selector,\\n _to,\\n msg.value\\n );\\n\\n // Send calldata into L2\\n sendCrossDomainMessage(\\n ovmEth,\\n data,\\n getFinalizeDepositL2Gas\\n );\\n\\n emit DepositInitiated(_from, _to, msg.value);\\n }\\n\\n /*************************\\n * Cross-chain Functions *\\n *************************/\\n\\n /**\\n * @dev Complete a withdrawal from L2 to L1, and credit funds to the recipient's balance of the\\n * L1 ETH token.\\n * Since only the xDomainMessenger can call this function, it will never be called before the withdrawal is finalized.\\n *\\n * @param _to L1 address to credit the withdrawal to\\n * @param _amount Amount of the ETH to withdraw\\n */\\n function finalizeWithdrawal(\\n address _to,\\n uint256 _amount\\n )\\n external\\n override\\n onlyFromCrossDomainAccount(ovmEth)\\n {\\n _safeTransferETH(_to, _amount);\\n\\n emit WithdrawalFinalized(_to, _amount);\\n }\\n\\n /**********************************\\n * Internal Functions: Accounting *\\n **********************************/\\n\\n /**\\n * @dev Internal accounting function for moving around L1 ETH.\\n *\\n * @param _to L1 address to transfer ETH to\\n * @param _value Amount of ETH to send to\\n */\\n function _safeTransferETH(\\n address _to,\\n uint256 _value\\n )\\n internal\\n {\\n (bool success, ) = _to.call{value: _value}(new bytes(0));\\n require(success, 'TransferHelper::safeTransferETH: ETH transfer failed');\\n }\\n}\\n\",\"keccak256\":\"0xee7c0d4bea0e01b0de4def829c9c8aa313ad6a788a7150adcc62c1e4190831db\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/bridge/messaging/iAbs_BaseCrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/**\\n * @title iAbs_BaseCrossDomainMessenger\\n */\\ninterface iAbs_BaseCrossDomainMessenger {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event SentMessage(bytes message);\\n event RelayedMessage(bytes32 msgHash);\\n event FailedRelayedMessage(bytes32 msgHash);\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n function xDomainMessageSender() external view returns (address);\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sends a cross domain message to the target messenger.\\n * @param _target Target contract address.\\n * @param _message Message to send to the target.\\n * @param _gasLimit Gas limit for the provided message.\\n */\\n function sendMessage(\\n address _target,\\n bytes calldata _message,\\n uint32 _gasLimit\\n ) external;\\n}\\n\",\"keccak256\":\"0x89981ed48e99d6939cc6cdef827d484fa3e2292d66c0ba5056c7050cb6282d7e\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/bridge/tokens/iOVM_L1ETHGateway.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0;\\npragma experimental ABIEncoderV2;\\n\\n/**\\n * @title iOVM_L1ETHGateway\\n */\\ninterface iOVM_L1ETHGateway {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event DepositInitiated(\\n address indexed _from,\\n address _to,\\n uint256 _amount\\n );\\n\\n event WithdrawalFinalized(\\n address indexed _to,\\n uint256 _amount\\n );\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function deposit()\\n external\\n payable;\\n\\n function depositTo(\\n address _to\\n )\\n external\\n payable;\\n\\n /*************************\\n * Cross-chain Functions *\\n *************************/\\n\\n function finalizeWithdrawal(\\n address _to,\\n uint _amount\\n )\\n external;\\n\\n function getFinalizeDepositL2Gas()\\n external\\n view\\n returns(\\n uint32\\n );\\n}\\n\",\"keccak256\":\"0x7e6805c5cacfd159410c7cd57a3d586e0fc5810bc46600bbd840a252e243e5ba\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/bridge/tokens/iOVM_L2DepositedToken.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0;\\npragma experimental ABIEncoderV2;\\n\\n/**\\n * @title iOVM_L2DepositedToken\\n */\\ninterface iOVM_L2DepositedToken {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event WithdrawalInitiated(\\n address indexed _from,\\n address _to,\\n uint256 _amount\\n );\\n\\n event DepositFinalized(\\n address indexed _to,\\n uint256 _amount\\n );\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function withdraw(\\n uint _amount\\n )\\n external;\\n\\n function withdrawTo(\\n address _to,\\n uint _amount\\n )\\n external;\\n\\n\\n /*************************\\n * Cross-chain Functions *\\n *************************/\\n\\n function finalizeDeposit(\\n address _to,\\n uint _amount\\n )\\n external;\\n}\\n\",\"keccak256\":\"0x59c807dfb01dbc00409431820457c350681af30d2f972a065231483a8ec926c4\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/bridge/OVM_CrossDomainEnabled.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Interface Imports */\\nimport { iAbs_BaseCrossDomainMessenger } from \\\"../../iOVM/bridge/messaging/iAbs_BaseCrossDomainMessenger.sol\\\";\\n\\n/**\\n * @title OVM_CrossDomainEnabled\\n * @dev Helper contract for contracts performing cross-domain communications\\n *\\n * Compiler used: defined by inheriting contract\\n * Runtime target: defined by inheriting contract\\n */\\ncontract OVM_CrossDomainEnabled {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n // Messenger contract used to send and recieve messages from the other domain.\\n address public messenger;\\n\\n\\n /***************\\n * Constructor *\\n ***************/ \\n\\n /**\\n * @param _messenger Address of the CrossDomainMessenger on the current layer.\\n */\\n constructor(\\n address _messenger\\n ) {\\n messenger = _messenger;\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n /**\\n * Enforces that the modified function is only callable by a specific cross-domain account.\\n * @param _sourceDomainAccount The only account on the originating domain which is\\n * authenticated to call this function.\\n */\\n modifier onlyFromCrossDomainAccount(\\n address _sourceDomainAccount\\n ) {\\n require(\\n msg.sender == address(getCrossDomainMessenger()),\\n \\\"OVM_XCHAIN: messenger contract unauthenticated\\\"\\n );\\n\\n require(\\n getCrossDomainMessenger().xDomainMessageSender() == _sourceDomainAccount,\\n \\\"OVM_XCHAIN: wrong sender of cross-domain message\\\"\\n );\\n\\n _;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Gets the messenger, usually from storage. This function is exposed in case a child contract\\n * needs to override.\\n * @return The address of the cross-domain messenger contract which should be used. \\n */\\n function getCrossDomainMessenger()\\n internal\\n virtual\\n returns (\\n iAbs_BaseCrossDomainMessenger\\n )\\n {\\n return iAbs_BaseCrossDomainMessenger(messenger);\\n }\\n\\n /**\\n * Sends a message to an account on another domain\\n * @param _crossDomainTarget The intended recipient on the destination domain\\n * @param _data The data to send to the target (usually calldata to a function with\\n * `onlyFromCrossDomainAccount()`)\\n * @param _gasLimit The gasLimit for the receipt of the message on the target domain.\\n */\\n function sendCrossDomainMessage(\\n address _crossDomainTarget,\\n bytes memory _data,\\n uint32 _gasLimit\\n )\\n internal\\n {\\n getCrossDomainMessenger().sendMessage(_crossDomainTarget, _data, _gasLimit);\\n }\\n}\\n\",\"keccak256\":\"0x054c802a5c1318566b7727ff5327a1ad4dc0f18038a4586b7ada467cc6b08761\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n public\\n onlyOwner\\n {\\n addresses[_getNameHash(_name)] = _address;\\n\\n emit AddressSet(\\n _name,\\n _address\\n );\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0x2ce671a0e004df88b136bea5a3c59d0732cea8887c8496da1d509e0200b03d7d\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(\\n address _libAddressManager\\n ) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x65981feeabff6a81783ea97d44baf988a18a86c8cb374c46fdb71819cbacc7c0\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x608060405234801561001057600080fd5b50600080546001600160a01b03199081169091556001805490911690556109fb8061003c6000396000f3fe60806040526004361061008a5760003560e01c8063485cc95511610059578063485cc95514610122578063490b5b7814610142578063b760faf914610157578063d0e30db01461016a578063f4f7b41a146101725761009b565b80631273a090146100a0578063299ca478146100cb5780633cb747bf146100ed578063461a4478146101025761009b565b3661009b576100993333610192565b005b600080fd5b3480156100ac57600080fd5b506100b5610246565b6040516100c29190610935565b60405180910390f35b3480156100d757600080fd5b506100e061024d565b6040516100c29190610865565b3480156100f957600080fd5b506100e061025c565b34801561010e57600080fd5b506100e061011d366004610797565b61026b565b34801561012e57600080fd5b5061009961013d36600461073c565b610347565b34801561014e57600080fd5b506100e06103ef565b61009961016536600461071b565b6103fe565b61009961040b565b34801561017e57600080fd5b5061009961018d36600461076e565b610417565b6000638d6e9a5b60e01b82346040516024016101af929190610879565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526002549091506101fe906001600160a01b03168262124f80610578565b826001600160a01b03167ff531653a5819e21265de50358610d55dbe6594c61605b209dfa4280d277938c18334604051610239929190610879565b60405180910390a2505050565b62124f8081565b6001546001600160a01b031681565b6000546001600160a01b031681565b60015460405163bf40fac160e01b81526020600482018181528451602484015284516000946001600160a01b03169363bf40fac1938793928392604401918501908083838b5b838110156102c95781810151838201526020016102b1565b50505050905090810190601f1680156102f65780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561031357600080fd5b505afa158015610327573d6000803e3d6000fd5b505050506040513d602081101561033d57600080fd5b505190505b919050565b6001546001600160a01b0316156103795760405162461bcd60e51b8152600401610370906108e6565b60405180910390fd5b600180546001600160a01b038085166001600160a01b0319928316179092556002805492841692909116919091179055604080516060810190915260218082526103cb91906109a5602083013961026b565b600080546001600160a01b0319166001600160a01b03929092169190911790555050565b6002546001600160a01b031681565b6104083382610192565b50565b6104153333610192565b565b6002546001600160a01b031661042b610663565b6001600160a01b0316336001600160a01b03161461047a5760405162461bcd60e51b815260040180806020018281038252602e815260200180610947602e913960400191505060405180910390fd5b806001600160a01b031661048c610663565b6001600160a01b0316636e296e456040518163ffffffff1660e01b815260040160206040518083038186803b1580156104c457600080fd5b505afa1580156104d8573d6000803e3d6000fd5b505050506040513d60208110156104ee57600080fd5b50516001600160a01b0316146105355760405162461bcd60e51b81526004018080602001828103825260308152602001806109756030913960400191505060405180910390fd5b61053f8383610672565b826001600160a01b03167f9e5c4f9f4e46b8629d3dda85f43a69194f50254404a72dc62b9e932d9c94eda883604051610239919061092c565b610580610663565b6001600160a01b0316633dbb202b8484846040518463ffffffff1660e01b815260040180846001600160a01b03168152602001806020018363ffffffff168152602001828103825284818151815260200191508051906020019080838360005b838110156105f85781810151838201526020016105e0565b50505050905090810190601f1680156106255780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b15801561064657600080fd5b505af115801561065a573d6000803e3d6000fd5b50505050505050565b6000546001600160a01b031690565b604080516000808252602082019092526001600160a01b03841690839060405161069c919061082c565b60006040518083038185875af1925050503d80600081146106d9576040519150601f19603f3d011682016040523d82523d6000602084013e6106de565b606091505b50509050806106ff5760405162461bcd60e51b815260040161037090610892565b505050565b80356001600160a01b038116811461034257600080fd5b60006020828403121561072c578081fd5b61073582610704565b9392505050565b6000806040838503121561074e578081fd5b61075783610704565b915061076560208401610704565b90509250929050565b60008060408385031215610780578182fd5b61078983610704565b946020939093013593505050565b600060208083850312156107a9578182fd5b823567ffffffffffffffff808211156107c0578384fd5b818501915085601f8301126107d3578384fd5b8135818111156107df57fe5b604051601f8201601f19168101850183811182821017156107fc57fe5b6040528181528382018501881015610812578586fd5b818585018683013790810190930193909352509392505050565b60008251815b8181101561084c5760208186018101518583015201610832565b8181111561085a5782828501525b509190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b60208082526034908201527f5472616e7366657248656c7065723a3a736166655472616e736665724554483a60408201527308115512081d1c985b9cd9995c8819985a5b195960621b606082015260800190565b60208082526026908201527f436f6e74726163742068617320616c7265616479206265656e20696e697469616040820152653634bd32b21760d11b606082015260800190565b90815260200190565b63ffffffff9190911681526020019056fe4f564d5f58434841494e3a206d657373656e67657220636f6e747261637420756e61757468656e746963617465644f564d5f58434841494e3a2077726f6e672073656e646572206f662063726f73732d646f6d61696e206d65737361676550726f78795f5f4f564d5f4c3143726f7373446f6d61696e4d657373656e676572a2646970667358221220d8a6002280930d6eb8035b95d663889b1a8e3dbd1b07997ca03239bd5372e85b64736f6c63430007060033", + "deployedBytecode": "0x60806040526004361061008a5760003560e01c8063485cc95511610059578063485cc95514610122578063490b5b7814610142578063b760faf914610157578063d0e30db01461016a578063f4f7b41a146101725761009b565b80631273a090146100a0578063299ca478146100cb5780633cb747bf146100ed578063461a4478146101025761009b565b3661009b576100993333610192565b005b600080fd5b3480156100ac57600080fd5b506100b5610246565b6040516100c29190610935565b60405180910390f35b3480156100d757600080fd5b506100e061024d565b6040516100c29190610865565b3480156100f957600080fd5b506100e061025c565b34801561010e57600080fd5b506100e061011d366004610797565b61026b565b34801561012e57600080fd5b5061009961013d36600461073c565b610347565b34801561014e57600080fd5b506100e06103ef565b61009961016536600461071b565b6103fe565b61009961040b565b34801561017e57600080fd5b5061009961018d36600461076e565b610417565b6000638d6e9a5b60e01b82346040516024016101af929190610879565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526002549091506101fe906001600160a01b03168262124f80610578565b826001600160a01b03167ff531653a5819e21265de50358610d55dbe6594c61605b209dfa4280d277938c18334604051610239929190610879565b60405180910390a2505050565b62124f8081565b6001546001600160a01b031681565b6000546001600160a01b031681565b60015460405163bf40fac160e01b81526020600482018181528451602484015284516000946001600160a01b03169363bf40fac1938793928392604401918501908083838b5b838110156102c95781810151838201526020016102b1565b50505050905090810190601f1680156102f65780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561031357600080fd5b505afa158015610327573d6000803e3d6000fd5b505050506040513d602081101561033d57600080fd5b505190505b919050565b6001546001600160a01b0316156103795760405162461bcd60e51b8152600401610370906108e6565b60405180910390fd5b600180546001600160a01b038085166001600160a01b0319928316179092556002805492841692909116919091179055604080516060810190915260218082526103cb91906109a5602083013961026b565b600080546001600160a01b0319166001600160a01b03929092169190911790555050565b6002546001600160a01b031681565b6104083382610192565b50565b6104153333610192565b565b6002546001600160a01b031661042b610663565b6001600160a01b0316336001600160a01b03161461047a5760405162461bcd60e51b815260040180806020018281038252602e815260200180610947602e913960400191505060405180910390fd5b806001600160a01b031661048c610663565b6001600160a01b0316636e296e456040518163ffffffff1660e01b815260040160206040518083038186803b1580156104c457600080fd5b505afa1580156104d8573d6000803e3d6000fd5b505050506040513d60208110156104ee57600080fd5b50516001600160a01b0316146105355760405162461bcd60e51b81526004018080602001828103825260308152602001806109756030913960400191505060405180910390fd5b61053f8383610672565b826001600160a01b03167f9e5c4f9f4e46b8629d3dda85f43a69194f50254404a72dc62b9e932d9c94eda883604051610239919061092c565b610580610663565b6001600160a01b0316633dbb202b8484846040518463ffffffff1660e01b815260040180846001600160a01b03168152602001806020018363ffffffff168152602001828103825284818151815260200191508051906020019080838360005b838110156105f85781810151838201526020016105e0565b50505050905090810190601f1680156106255780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b15801561064657600080fd5b505af115801561065a573d6000803e3d6000fd5b50505050505050565b6000546001600160a01b031690565b604080516000808252602082019092526001600160a01b03841690839060405161069c919061082c565b60006040518083038185875af1925050503d80600081146106d9576040519150601f19603f3d011682016040523d82523d6000602084013e6106de565b606091505b50509050806106ff5760405162461bcd60e51b815260040161037090610892565b505050565b80356001600160a01b038116811461034257600080fd5b60006020828403121561072c578081fd5b61073582610704565b9392505050565b6000806040838503121561074e578081fd5b61075783610704565b915061076560208401610704565b90509250929050565b60008060408385031215610780578182fd5b61078983610704565b946020939093013593505050565b600060208083850312156107a9578182fd5b823567ffffffffffffffff808211156107c0578384fd5b818501915085601f8301126107d3578384fd5b8135818111156107df57fe5b604051601f8201601f19168101850183811182821017156107fc57fe5b6040528181528382018501881015610812578586fd5b818585018683013790810190930193909352509392505050565b60008251815b8181101561084c5760208186018101518583015201610832565b8181111561085a5782828501525b509190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b60208082526034908201527f5472616e7366657248656c7065723a3a736166655472616e736665724554483a60408201527308115512081d1c985b9cd9995c8819985a5b195960621b606082015260800190565b60208082526026908201527f436f6e74726163742068617320616c7265616479206265656e20696e697469616040820152653634bd32b21760d11b606082015260800190565b90815260200190565b63ffffffff9190911681526020019056fe4f564d5f58434841494e3a206d657373656e67657220636f6e747261637420756e61757468656e746963617465644f564d5f58434841494e3a2077726f6e672073656e646572206f662063726f73732d646f6d61696e206d65737361676550726f78795f5f4f564d5f4c3143726f7373446f6d61696e4d657373656e676572a2646970667358221220d8a6002280930d6eb8035b95d663889b1a8e3dbd1b07997ca03239bd5372e85b64736f6c63430007060033", "devdoc": { "details": "The L1 ETH Gateway is a contract which stores deposited ETH that is in use on L2. Compiler used: solc Runtime target: EVM", "kind": "dev", @@ -217,7 +217,7 @@ } }, "finalizeWithdrawal(address,uint256)": { - "details": "Complete a withdrawal from L2 to L1, and credit funds to the recipient's balance of the L1 ETH token. Since only the xDomainMessenger can call this function, it will never be called before the withdrawal is finalized. ", + "details": "Complete a withdrawal from L2 to L1, and credit funds to the recipient's balance of the L1 ETH token. Since only the xDomainMessenger can call this function, it will never be called before the withdrawal is finalized.", "params": { "_amount": "Amount of the ETH to withdraw", "_to": "L1 address to credit the withdrawal to" @@ -228,6 +228,14 @@ "_libAddressManager": "Address manager for this OE deployment", "_ovmEth": "L2 OVM_ETH implementation of iOVM_DepositedToken" } + }, + "resolve(string)": { + "params": { + "_name": "Name to resolve an address for." + }, + "returns": { + "_0": "Address associated with the given name." + } } }, "title": "OVM_L1ETHGateway", @@ -235,13 +243,17 @@ }, "userdoc": { "kind": "user", - "methods": {}, + "methods": { + "resolve(string)": { + "notice": "Resolves the address associated with a given name." + } + }, "version": 1 }, "storageLayout": { "storage": [ { - "astId": 11742, + "astId": 11988, "contract": "contracts/optimistic-ethereum/OVM/bridge/tokens/OVM_L1ETHGateway.sol:OVM_L1ETHGateway", "label": "messenger", "offset": 0, @@ -249,15 +261,15 @@ "type": "t_address" }, { - "astId": 12526, + "astId": 12800, "contract": "contracts/optimistic-ethereum/OVM/bridge/tokens/OVM_L1ETHGateway.sol:OVM_L1ETHGateway", "label": "libAddressManager", "offset": 0, "slot": "1", - "type": "t_contract(Lib_AddressManager)12519" + "type": "t_contract(Lib_AddressManager)12793" }, { - "astId": 1967, + "astId": 2661, "contract": "contracts/optimistic-ethereum/OVM/bridge/tokens/OVM_L1ETHGateway.sol:OVM_L1ETHGateway", "label": "ovmEth", "offset": 0, @@ -271,7 +283,7 @@ "label": "address", "numberOfBytes": "20" }, - "t_contract(Lib_AddressManager)12519": { + "t_contract(Lib_AddressManager)12793": { "encoding": "inplace", "label": "contract Lib_AddressManager", "numberOfBytes": "20" diff --git a/packages/contracts/deployments/kovan/OVM_L1MultiMessageRelayer.json b/packages/contracts/deployments/kovan/OVM_L1MultiMessageRelayer.json index 41bd59fded839..62ca79e117c05 100644 --- a/packages/contracts/deployments/kovan/OVM_L1MultiMessageRelayer.json +++ b/packages/contracts/deployments/kovan/OVM_L1MultiMessageRelayer.json @@ -1,5 +1,5 @@ { - "address": "0xf56d4FAeD6F52c4ce14e44885084dAFc5c440138", + "address": "0x942b1B1CaF9e7654318CbfCfD1bca6727C716638", "abi": [ { "inputs": [ @@ -143,7 +143,7 @@ "outputs": [ { "internalType": "address", - "name": "_contract", + "name": "", "type": "address" } ], @@ -151,37 +151,50 @@ "type": "function" } ], - "transactionHash": "0x0e4af02ac2041ee5a1e4c30275da9a1daa76b9c7e1b07f3a82cf2073ba75fe5c", + "transactionHash": "0xd93f806d3c8503f36c537f09883e9165dd32239e00b881f705a3441e13a3d510", "receipt": { "to": null, "from": "0x18394B52d3Cb931dfA76F63251919D051953413d", - "contractAddress": "0xf56d4FAeD6F52c4ce14e44885084dAFc5c440138", - "transactionIndex": 4, - "gasUsed": "596327", + "contractAddress": "0x942b1B1CaF9e7654318CbfCfD1bca6727C716638", + "transactionIndex": 1, + "gasUsed": "605189", "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0xc8cb94bc6a30dc6c6f9e0594d0f98f09383fd0be3e28cd670e7cee855adb6024", - "transactionHash": "0x0e4af02ac2041ee5a1e4c30275da9a1daa76b9c7e1b07f3a82cf2073ba75fe5c", + "blockHash": "0xc85c83fe27b2839cc9aee380d27e1fab4612af37f0d80a87aea6047caec2a0e1", + "transactionHash": "0xd93f806d3c8503f36c537f09883e9165dd32239e00b881f705a3441e13a3d510", "logs": [], - "blockNumber": 24199525, - "cumulativeGasUsed": "942270", + "blockNumber": 24572884, + "cumulativeGasUsed": "674512", "status": 1, "byzantium": true }, "args": [ - "0xFaf27b24ba54C6910C12CFF5C9453C0e8D634e05" + "0xd56F695e73286ac252A37593DD4E7c14270eC1Df" ], - "solcInputHash": "03aed03b958b1d37f90bd88d0f56dd85", - "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"messageNonce\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"stateRootBatchHeader\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"siblings\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct Lib_OVMCodec.ChainInclusionProof\",\"name\":\"stateRootProof\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"stateTrieWitness\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"storageTrieWitness\",\"type\":\"bytes\"}],\"internalType\":\"struct iOVM_L1CrossDomainMessenger.L2MessageInclusionProof\",\"name\":\"proof\",\"type\":\"tuple\"}],\"internalType\":\"struct iOVM_L1MultiMessageRelayer.L2ToL1Message[]\",\"name\":\"_messages\",\"type\":\"tuple[]\"}],\"name\":\"batchRelayMessages\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"_contract\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The L1 Multi-Message Relayer contract is a gas efficiency optimization which enables the relayer to submit multiple messages in a single transaction to be relayed by the L1 Cross Domain Message Sender. Compiler used: solc Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"batchRelayMessages((address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))[])\":{\"params\":{\"_messages\":\"An array of L2 to L1 messages\"}}},\"title\":\"OVM_L1MultiMessageRelayer\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"batchRelayMessages((address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))[])\":{\"notice\":\"Forwards multiple cross domain messages to the L1 Cross Domain Messenger for relaying\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1MultiMessageRelayer.sol\":\"OVM_L1MultiMessageRelayer\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1MultiMessageRelayer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// @unsupported: ovm\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n/* Interface Imports */\\nimport { iOVM_L1CrossDomainMessenger } from \\\"../../../iOVM/bridge/messaging/iOVM_L1CrossDomainMessenger.sol\\\";\\nimport { iOVM_L1MultiMessageRelayer } from \\\"../../../iOVM/bridge/messaging/iOVM_L1MultiMessageRelayer.sol\\\";\\n\\n/* Contract Imports */\\nimport { Lib_AddressResolver } from \\\"../../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n\\n/**\\n * @title OVM_L1MultiMessageRelayer\\n * @dev The L1 Multi-Message Relayer contract is a gas efficiency optimization which enables the \\n * relayer to submit multiple messages in a single transaction to be relayed by the L1 Cross Domain\\n * Message Sender.\\n *\\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract OVM_L1MultiMessageRelayer is iOVM_L1MultiMessageRelayer, Lib_AddressResolver {\\n\\n /***************\\n * Constructor *\\n ***************/\\n constructor(\\n address _libAddressManager\\n ) \\n Lib_AddressResolver(_libAddressManager)\\n {}\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyBatchRelayer() {\\n require(\\n msg.sender == resolve(\\\"OVM_L2BatchMessageRelayer\\\"),\\n \\\"OVM_L1MultiMessageRelayer: Function can only be called by the OVM_L2BatchMessageRelayer\\\"\\n );\\n _;\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * @notice Forwards multiple cross domain messages to the L1 Cross Domain Messenger for relaying\\n * @param _messages An array of L2 to L1 messages\\n */\\n function batchRelayMessages(L2ToL1Message[] calldata _messages) \\n override\\n external\\n onlyBatchRelayer \\n {\\n iOVM_L1CrossDomainMessenger messenger = iOVM_L1CrossDomainMessenger(resolve(\\\"Proxy__OVM_L1CrossDomainMessenger\\\"));\\n for (uint256 i = 0; i < _messages.length; i++) {\\n L2ToL1Message memory message = _messages[i];\\n messenger.relayMessage(\\n message.target,\\n message.sender,\\n message.message,\\n message.messageNonce,\\n message.proof\\n );\\n }\\n }\\n}\\n\",\"keccak256\":\"0xbccd671aae35ef04fa45b3019f0a9d8d3e1d7b60a6261d979579f93f9c508725\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/bridge/messaging/iAbs_BaseCrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/**\\n * @title iAbs_BaseCrossDomainMessenger\\n */\\ninterface iAbs_BaseCrossDomainMessenger {\\n\\n /**********\\n * Events *\\n **********/\\n event SentMessage(bytes message);\\n event RelayedMessage(bytes32 msgHash);\\n\\n /**********************\\n * Contract Variables *\\n **********************/\\n function xDomainMessageSender() external view returns (address);\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sends a cross domain message to the target messenger.\\n * @param _target Target contract address.\\n * @param _message Message to send to the target.\\n * @param _gasLimit Gas limit for the provided message.\\n */\\n function sendMessage(\\n address _target,\\n bytes calldata _message,\\n uint32 _gasLimit\\n ) external;\\n}\\n\",\"keccak256\":\"0xc2bd6b373daae2ede34281f4be5938d02b9d1cfb056b40d65ff70b7f16ce3c86\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/bridge/messaging/iOVM_L1CrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { iAbs_BaseCrossDomainMessenger } from \\\"./iAbs_BaseCrossDomainMessenger.sol\\\";\\n\\n/**\\n * @title iOVM_L1CrossDomainMessenger\\n */\\ninterface iOVM_L1CrossDomainMessenger is iAbs_BaseCrossDomainMessenger {\\n\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n struct L2MessageInclusionProof {\\n bytes32 stateRoot;\\n Lib_OVMCodec.ChainBatchHeader stateRootBatchHeader;\\n Lib_OVMCodec.ChainInclusionProof stateRootProof;\\n bytes stateTrieWitness;\\n bytes storageTrieWitness;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Relays a cross domain message to a contract.\\n * @param _target Target contract address.\\n * @param _sender Message sender address.\\n * @param _message Message to send to the target.\\n * @param _messageNonce Nonce for the provided message.\\n * @param _proof Inclusion proof for the given message.\\n */\\n function relayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _messageNonce,\\n L2MessageInclusionProof memory _proof\\n ) external;\\n\\n /**\\n * Replays a cross domain message to the target messenger.\\n * @param _target Target contract address.\\n * @param _sender Original sender address.\\n * @param _message Message to send to the target.\\n * @param _messageNonce Nonce for the provided message.\\n * @param _gasLimit Gas limit for the provided message.\\n */\\n function replayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _messageNonce,\\n uint32 _gasLimit\\n ) external;\\n}\\n\",\"keccak256\":\"0xdcd239d0b215e400674d78e8db4ac12ba18efc34fa78e24c2ff867f61062dba2\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/bridge/messaging/iOVM_L1MultiMessageRelayer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Interface Imports */\\nimport { iOVM_L1CrossDomainMessenger } from \\\"../../../iOVM/bridge/messaging/iOVM_L1CrossDomainMessenger.sol\\\";\\ninterface iOVM_L1MultiMessageRelayer {\\n\\n struct L2ToL1Message {\\n address target;\\n address sender;\\n bytes message;\\n uint256 messageNonce;\\n iOVM_L1CrossDomainMessenger.L2MessageInclusionProof proof;\\n }\\n\\n function batchRelayMessages(L2ToL1Message[] calldata _messages) external; \\n}\\n\",\"keccak256\":\"0xed86c23182a66b1a6c90c3f484b5d7264069e1a3849eb2fdd3608f9686282687\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/codec/Lib_OVMCodec.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../utils/Lib_Bytes32Utils.sol\\\";\\nimport { Lib_SafeExecutionManagerWrapper } from \\\"../../libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\\\";\\n\\n/**\\n * @title Lib_OVMCodec\\n */\\nlibrary Lib_OVMCodec {\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum EOASignatureType {\\n EIP155_TRANSACTION,\\n ETH_SIGNED_MESSAGE\\n }\\n\\n enum QueueOrigin {\\n SEQUENCER_QUEUE,\\n L1TOL2_QUEUE\\n }\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Account {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n address ethAddress;\\n bool isFresh;\\n }\\n\\n struct EVMAccount {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n }\\n\\n struct ChainBatchHeader {\\n uint256 batchIndex;\\n bytes32 batchRoot;\\n uint256 batchSize;\\n uint256 prevTotalElements;\\n bytes extraData;\\n }\\n\\n struct ChainInclusionProof {\\n uint256 index;\\n bytes32[] siblings;\\n }\\n\\n struct Transaction {\\n uint256 timestamp;\\n uint256 blockNumber;\\n QueueOrigin l1QueueOrigin;\\n address l1TxOrigin;\\n address entrypoint;\\n uint256 gasLimit;\\n bytes data;\\n }\\n\\n struct TransactionChainElement {\\n bool isSequenced;\\n uint256 queueIndex; // QUEUED TX ONLY\\n uint256 timestamp; // SEQUENCER TX ONLY\\n uint256 blockNumber; // SEQUENCER TX ONLY\\n bytes txData; // SEQUENCER TX ONLY\\n }\\n\\n struct QueueElement {\\n bytes32 transactionHash;\\n uint40 timestamp;\\n uint40 blockNumber;\\n }\\n\\n struct EIP155Transaction {\\n uint256 nonce;\\n uint256 gasPrice;\\n uint256 gasLimit;\\n address to;\\n uint256 value;\\n bytes data;\\n uint256 chainId;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Decodes an EOA transaction (i.e., native Ethereum RLP encoding).\\n * @param _transaction Encoded EOA transaction.\\n * @return Transaction decoded into a struct.\\n */\\n function decodeEIP155Transaction(\\n bytes memory _transaction,\\n bool _isEthSignedMessage\\n )\\n internal\\n pure\\n returns (\\n EIP155Transaction memory\\n )\\n {\\n if (_isEthSignedMessage) {\\n (\\n uint256 _nonce,\\n uint256 _gasLimit,\\n uint256 _gasPrice,\\n uint256 _chainId,\\n address _to,\\n bytes memory _data\\n ) = abi.decode(\\n _transaction,\\n (uint256, uint256, uint256, uint256, address ,bytes)\\n );\\n return EIP155Transaction({\\n nonce: _nonce,\\n gasPrice: _gasPrice,\\n gasLimit: _gasLimit,\\n to: _to,\\n value: 0,\\n data: _data,\\n chainId: _chainId\\n });\\n } else {\\n Lib_RLPReader.RLPItem[] memory decoded = Lib_RLPReader.readList(_transaction);\\n\\n return EIP155Transaction({\\n nonce: Lib_RLPReader.readUint256(decoded[0]),\\n gasPrice: Lib_RLPReader.readUint256(decoded[1]),\\n gasLimit: Lib_RLPReader.readUint256(decoded[2]),\\n to: Lib_RLPReader.readAddress(decoded[3]),\\n value: Lib_RLPReader.readUint256(decoded[4]),\\n data: Lib_RLPReader.readBytes(decoded[5]),\\n chainId: Lib_RLPReader.readUint256(decoded[6])\\n });\\n }\\n }\\n\\n /**\\n * Decompresses a compressed EIP155 transaction.\\n * @param _transaction Compressed EIP155 transaction bytes.\\n * @return Transaction parsed into a struct.\\n */\\n function decompressEIP155Transaction(\\n bytes memory _transaction\\n )\\n internal\\n returns (\\n EIP155Transaction memory\\n )\\n {\\n return EIP155Transaction({\\n gasLimit: Lib_BytesUtils.toUint24(_transaction, 0),\\n gasPrice: uint256(Lib_BytesUtils.toUint24(_transaction, 3)) * 1000000,\\n nonce: Lib_BytesUtils.toUint24(_transaction, 6),\\n to: Lib_BytesUtils.toAddress(_transaction, 9),\\n data: Lib_BytesUtils.slice(_transaction, 29),\\n chainId: Lib_SafeExecutionManagerWrapper.safeCHAINID(),\\n value: 0\\n });\\n }\\n\\n /**\\n * Encodes an EOA transaction back into the original transaction.\\n * @param _transaction EIP155transaction to encode.\\n * @param _isEthSignedMessage Whether or not this was an eth signed message.\\n * @return Encoded transaction.\\n */\\n function encodeEIP155Transaction(\\n EIP155Transaction memory _transaction,\\n bool _isEthSignedMessage\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n if (_isEthSignedMessage) {\\n return abi.encode(\\n _transaction.nonce,\\n _transaction.gasLimit,\\n _transaction.gasPrice,\\n _transaction.chainId,\\n _transaction.to,\\n _transaction.data\\n );\\n } else {\\n bytes[] memory raw = new bytes[](9);\\n\\n raw[0] = Lib_RLPWriter.writeUint(_transaction.nonce);\\n raw[1] = Lib_RLPWriter.writeUint(_transaction.gasPrice);\\n raw[2] = Lib_RLPWriter.writeUint(_transaction.gasLimit);\\n if (_transaction.to == address(0)) {\\n raw[3] = Lib_RLPWriter.writeBytes('');\\n } else {\\n raw[3] = Lib_RLPWriter.writeAddress(_transaction.to);\\n }\\n raw[4] = Lib_RLPWriter.writeUint(0);\\n raw[5] = Lib_RLPWriter.writeBytes(_transaction.data);\\n raw[6] = Lib_RLPWriter.writeUint(_transaction.chainId);\\n raw[7] = Lib_RLPWriter.writeBytes(bytes(''));\\n raw[8] = Lib_RLPWriter.writeBytes(bytes(''));\\n\\n return Lib_RLPWriter.writeList(raw);\\n }\\n }\\n\\n /**\\n * Encodes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Encoded transaction bytes.\\n */\\n function encodeTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return abi.encodePacked(\\n _transaction.timestamp,\\n _transaction.blockNumber,\\n _transaction.l1QueueOrigin,\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n );\\n }\\n\\n /**\\n * Hashes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Hashed transaction\\n */\\n function hashTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(encodeTransaction(_transaction));\\n }\\n\\n /**\\n * Converts an OVM account to an EVM account.\\n * @param _in OVM account to convert.\\n * @return Converted EVM account.\\n */\\n function toEVMAccount(\\n Account memory _in\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n return EVMAccount({\\n nonce: _in.nonce,\\n balance: _in.balance,\\n storageRoot: _in.storageRoot,\\n codeHash: _in.codeHash\\n });\\n }\\n\\n /**\\n * @notice RLP-encodes an account state struct.\\n * @param _account Account state struct.\\n * @return RLP-encoded account state.\\n */\\n function encodeEVMAccount(\\n EVMAccount memory _account\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes[] memory raw = new bytes[](4);\\n\\n // Unfortunately we can't create this array outright because\\n // Lib_RLPWriter.writeList will reject fixed-size arrays. Assigning\\n // index-by-index circumvents this issue.\\n raw[0] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.nonce)\\n )\\n );\\n raw[1] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.balance)\\n )\\n );\\n raw[2] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.storageRoot));\\n raw[3] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.codeHash));\\n\\n return Lib_RLPWriter.writeList(raw);\\n }\\n\\n /**\\n * @notice Decodes an RLP-encoded account state into a useful struct.\\n * @param _encoded RLP-encoded account state.\\n * @return Account state struct.\\n */\\n function decodeEVMAccount(\\n bytes memory _encoded\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\\n\\n return EVMAccount({\\n nonce: Lib_RLPReader.readUint256(accountState[0]),\\n balance: Lib_RLPReader.readUint256(accountState[1]),\\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\\n });\\n }\\n\\n /**\\n * Calculates a hash for a given batch header.\\n * @param _batchHeader Header to hash.\\n * @return Hash of the header.\\n */\\n function hashBatchHeader(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(\\n abi.encode(\\n _batchHeader.batchRoot,\\n _batchHeader.batchSize,\\n _batchHeader.prevTotalElements,\\n _batchHeader.extraData\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0xe7e518ba7bba3fa28c532f8902576c1bb4dfc1ec4b62bed6da50623248ba17c3\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Contract Imports */\\nimport { Ownable } from \\\"./Lib_Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n /*******************************************\\n * Contract Variables: Internal Accounting *\\n *******************************************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n public\\n onlyOwner\\n {\\n emit AddressSet(_name, _address);\\n addresses[_getNameHash(_name)] = _address;\\n }\\n\\n function getAddress(\\n string memory _name\\n )\\n public\\n view\\n returns (address)\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32 _hash\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0x3a490595cc21ff170e4027843093670ff845d5972481fbfb956b722ea564bb06\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n\\n /*******************************************\\n * Contract Variables: Contract References *\\n *******************************************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(\\n address _libAddressManager\\n ) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function resolve(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address _contract\\n )\\n {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0xaa3ed342f6deb156c660fd83afa579a3b80db17eb465e8949cf5c1b114780143\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Ownable\\n * @dev Adapted from https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol\\n */\\nabstract contract Ownable {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n address public owner;\\n\\n\\n /**********\\n * Events *\\n **********/\\n\\n event OwnershipTransferred(\\n address indexed previousOwner,\\n address indexed newOwner\\n );\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n constructor() {\\n owner = msg.sender;\\n emit OwnershipTransferred(address(0), owner);\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n owner == msg.sender,\\n \\\"Ownable: caller is not the owner\\\"\\n );\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function renounceOwnership()\\n public\\n virtual\\n onlyOwner\\n {\\n emit OwnershipTransferred(owner, address(0));\\n owner = address(0);\\n }\\n\\n function transferOwnership(address _newOwner)\\n public\\n virtual\\n onlyOwner\\n {\\n require(\\n _newOwner != address(0),\\n \\\"Ownable: new owner cannot be the zero address\\\"\\n );\\n\\n emit OwnershipTransferred(owner, _newOwner);\\n owner = _newOwner;\\n }\\n}\\n\",\"keccak256\":\"0xd9dfd9264e5b5fedd53a5b10fdf179c3f367614b0fe69179bce4e45119f5b739\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPReader.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_RLPReader\\n * @dev Adapted from \\\"RLPReader\\\" by Hamdi Allam (hamdi.allam97@gmail.com).\\n */\\nlibrary Lib_RLPReader {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 constant internal MAX_LIST_LENGTH = 32;\\n\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum RLPItemType {\\n DATA_ITEM,\\n LIST_ITEM\\n }\\n\\n \\n /***********\\n * Structs *\\n ***********/\\n\\n struct RLPItem {\\n uint256 length;\\n uint256 ptr;\\n }\\n \\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n \\n /**\\n * Converts bytes to a reference to memory position and length.\\n * @param _in Input bytes to convert.\\n * @return Output memory reference.\\n */\\n function toRLPItem(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem memory\\n )\\n {\\n uint256 ptr;\\n assembly {\\n ptr := add(_in, 32)\\n }\\n\\n return RLPItem({\\n length: _in.length,\\n ptr: ptr\\n });\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n (\\n uint256 listOffset,\\n ,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.LIST_ITEM,\\n \\\"Invalid RLP list value.\\\"\\n );\\n\\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\\n // writing to the length. Since we can't know the number of RLP items without looping over\\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\\n // simply set a reasonable maximum list length and decrease the size before we finish.\\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\\n\\n uint256 itemCount = 0;\\n uint256 offset = listOffset;\\n while (offset < _in.length) {\\n require(\\n itemCount < MAX_LIST_LENGTH,\\n \\\"Provided RLP list exceeds max list length.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n ) = _decodeLength(RLPItem({\\n length: _in.length - offset,\\n ptr: _in.ptr + offset\\n }));\\n\\n out[itemCount] = RLPItem({\\n length: itemLength + itemOffset,\\n ptr: _in.ptr + offset\\n });\\n\\n itemCount += 1;\\n offset += itemOffset + itemLength;\\n }\\n\\n // Decrease the array size to match the actual item count.\\n assembly {\\n mstore(out, itemCount)\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n return readList(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes value.\\\"\\n );\\n\\n return _copy(_in.ptr, itemOffset, itemLength);\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return readBytes(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return string(readBytes(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return readString(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n require(\\n _in.length <= 33,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr + itemOffset;\\n bytes32 out;\\n assembly {\\n out := mload(ptr)\\n\\n // Shift the bytes over to match the item size.\\n if lt(itemLength, 32) {\\n out := div(out, exp(256, sub(32, itemLength)))\\n }\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return readBytes32(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return uint256(readBytes32(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return readUint256(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n require(\\n _in.length == 1,\\n \\\"Invalid RLP boolean value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 out;\\n assembly {\\n out := byte(0, mload(ptr))\\n }\\n\\n require(\\n out == 0 || out == 1,\\n \\\"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\\\"\\n );\\n\\n return out != 0;\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return readBool(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n if (_in.length == 1) {\\n return address(0);\\n }\\n\\n require(\\n _in.length == 21,\\n \\\"Invalid RLP address value.\\\"\\n );\\n\\n return address(readUint256(_in));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return readAddress(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads the raw bytes of an RLP item.\\n * @param _in RLP item to read.\\n * @return Raw RLP bytes.\\n */\\n function readRawBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in);\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Decodes the length of an RLP item.\\n * @param _in RLP item to decode.\\n * @return Offset of the encoded data.\\n * @return Length of the encoded data.\\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\\n */\\n function _decodeLength(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n uint256,\\n uint256,\\n RLPItemType\\n )\\n {\\n require(\\n _in.length > 0,\\n \\\"RLP item cannot be null.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 prefix;\\n assembly {\\n prefix := byte(0, mload(ptr))\\n }\\n\\n if (prefix <= 0x7f) {\\n // Single byte.\\n\\n return (0, 1, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xb7) {\\n // Short string.\\n\\n uint256 strLen = prefix - 0x80;\\n \\n require(\\n _in.length > strLen,\\n \\\"Invalid RLP short string.\\\"\\n );\\n\\n return (1, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xbf) {\\n // Long string.\\n uint256 lenOfStrLen = prefix - 0xb7;\\n\\n require(\\n _in.length > lenOfStrLen,\\n \\\"Invalid RLP long string length.\\\"\\n );\\n\\n uint256 strLen;\\n assembly {\\n // Pick out the string length.\\n strLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfStrLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfStrLen + strLen,\\n \\\"Invalid RLP long string.\\\"\\n );\\n\\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xf7) {\\n // Short list.\\n uint256 listLen = prefix - 0xc0;\\n\\n require(\\n _in.length > listLen,\\n \\\"Invalid RLP short list.\\\"\\n );\\n\\n return (1, listLen, RLPItemType.LIST_ITEM);\\n } else {\\n // Long list.\\n uint256 lenOfListLen = prefix - 0xf7;\\n\\n require(\\n _in.length > lenOfListLen,\\n \\\"Invalid RLP long list length.\\\"\\n );\\n\\n uint256 listLen;\\n assembly {\\n // Pick out the list length.\\n listLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfListLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfListLen + listLen,\\n \\\"Invalid RLP long list.\\\"\\n );\\n\\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\\n }\\n }\\n\\n /**\\n * Copies the bytes from a memory location.\\n * @param _src Pointer to the location to read from.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Copied bytes.\\n */\\n function _copy(\\n uint256 _src,\\n uint256 _offset,\\n uint256 _length\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out = new bytes(_length);\\n if (out.length == 0) {\\n return out;\\n }\\n\\n uint256 src = _src + _offset;\\n uint256 dest;\\n assembly {\\n dest := add(out, 32)\\n }\\n\\n // Copy over as many complete words as we can.\\n for (uint256 i = 0; i < _length / 32; i++) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n\\n src += 32;\\n dest += 32;\\n }\\n\\n // Pick out the remaining bytes.\\n uint256 mask = 256 ** (32 - (_length % 32)) - 1;\\n assembly {\\n mstore(\\n dest,\\n or(\\n and(mload(src), not(mask)),\\n and(mload(dest), mask)\\n )\\n )\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Copies an RLP item into bytes.\\n * @param _in RLP item to copy.\\n * @return Copied bytes.\\n */\\n function _copy(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in.ptr, 0, _in.length);\\n }\\n}\\n\",\"keccak256\":\"0xbdb8fae0ca2483b4cc07607a5070fc25e33c54b4e4462b99e7c0b13aac48a09b\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPWriter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\n\\n/**\\n * @title Lib_RLPWriter\\n * @author Bakaoh (with modifications)\\n */\\nlibrary Lib_RLPWriter {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * RLP encodes a byte string.\\n * @param _in The byte string to encode.\\n * @return _out The RLP encoded string in bytes.\\n */\\n function writeBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n bytes memory encoded;\\n\\n if (_in.length == 1 && uint8(_in[0]) < 128) {\\n encoded = _in;\\n } else {\\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * RLP encodes a list of RLP encoded byte byte strings.\\n * @param _in The list of RLP encoded byte strings.\\n * @return _out The RLP encoded list of items in bytes.\\n */\\n function writeList(\\n bytes[] memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n bytes memory list = _flatten(_in);\\n return abi.encodePacked(_writeLength(list.length, 192), list);\\n }\\n\\n /**\\n * RLP encodes a string.\\n * @param _in The string to encode.\\n * @return _out The RLP encoded string in bytes.\\n */\\n function writeString(\\n string memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(bytes(_in));\\n }\\n\\n /**\\n * RLP encodes an address.\\n * @param _in The address to encode.\\n * @return _out The RLP encoded address in bytes.\\n */\\n function writeAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a uint.\\n * @param _in The uint256 to encode.\\n * @return _out The RLP encoded uint256 in bytes.\\n */\\n function writeUint(\\n uint256 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(_toBinary(_in));\\n }\\n\\n /**\\n * RLP encodes a bool.\\n * @param _in The bool to encode.\\n * @return _out The RLP encoded bool in bytes.\\n */\\n function writeBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n bytes memory encoded = new bytes(1);\\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\\n return encoded;\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\\n * @param _len The length of the string or the payload.\\n * @param _offset 128 if item is string, 192 if item is list.\\n * @return _encoded RLP encoded bytes.\\n */\\n function _writeLength(\\n uint256 _len,\\n uint256 _offset\\n )\\n private\\n pure\\n returns (\\n bytes memory _encoded\\n )\\n {\\n bytes memory encoded;\\n\\n if (_len < 56) {\\n encoded = new bytes(1);\\n encoded[0] = byte(uint8(_len) + uint8(_offset));\\n } else {\\n uint256 lenLen;\\n uint256 i = 1;\\n while (_len / i != 0) {\\n lenLen++;\\n i *= 256;\\n }\\n\\n encoded = new bytes(lenLen + 1);\\n encoded[0] = byte(uint8(lenLen) + uint8(_offset) + 55);\\n for(i = 1; i <= lenLen; i++) {\\n encoded[i] = byte(uint8((_len / (256**(lenLen-i))) % 256));\\n }\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * Encode integer in big endian binary form with no leading zeroes.\\n * @notice TODO: This should be optimized with assembly to save gas costs.\\n * @param _x The integer to encode.\\n * @return _binary RLP encoded bytes.\\n */\\n function _toBinary(\\n uint256 _x\\n )\\n private\\n pure\\n returns (\\n bytes memory _binary\\n )\\n {\\n bytes memory b = abi.encodePacked(_x);\\n\\n uint256 i = 0;\\n for (; i < 32; i++) {\\n if (b[i] != 0) {\\n break;\\n }\\n }\\n\\n bytes memory res = new bytes(32 - i);\\n for (uint256 j = 0; j < res.length; j++) {\\n res[j] = b[i++];\\n }\\n\\n return res;\\n }\\n\\n /**\\n * Copies a piece of memory to another location.\\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\\n * @param _dest Destination location.\\n * @param _src Source location.\\n * @param _len Length of memory to copy.\\n */\\n function _memcpy(\\n uint256 _dest,\\n uint256 _src,\\n uint256 _len\\n )\\n private\\n pure\\n {\\n uint256 dest = _dest;\\n uint256 src = _src;\\n uint256 len = _len;\\n\\n for(; len >= 32; len -= 32) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n dest += 32;\\n src += 32;\\n }\\n\\n uint256 mask = 256 ** (32 - len) - 1;\\n assembly {\\n let srcpart := and(mload(src), not(mask))\\n let destpart := and(mload(dest), mask)\\n mstore(dest, or(destpart, srcpart))\\n }\\n }\\n\\n /**\\n * Flattens a list of byte strings into one byte string.\\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\\n * @param _list List of byte strings to flatten.\\n * @return _flattened The flattened byte string.\\n */\\n function _flatten(\\n bytes[] memory _list\\n )\\n private\\n pure\\n returns (\\n bytes memory _flattened\\n )\\n {\\n if (_list.length == 0) {\\n return new bytes(0);\\n }\\n\\n uint256 len;\\n uint256 i = 0;\\n for (; i < _list.length; i++) {\\n len += _list[i].length;\\n }\\n\\n bytes memory flattened = new bytes(len);\\n uint256 flattenedPtr;\\n assembly { flattenedPtr := add(flattened, 0x20) }\\n\\n for(i = 0; i < _list.length; i++) {\\n bytes memory item = _list[i];\\n\\n uint256 listPtr;\\n assembly { listPtr := add(item, 0x20)}\\n\\n _memcpy(flattenedPtr, listPtr, item.length);\\n flattenedPtr += _list[i].length;\\n }\\n\\n return flattened;\\n }\\n}\",\"keccak256\":\"0xbcb24619c1758cb0d9f3fe5c79495950045a9087046a02b9ce01df46ae09ae5b\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_Bytes32Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_Byte32Utils\\n */\\nlibrary Lib_Bytes32Utils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \\\"true.\\\"\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as a boolean.\\n */\\n function toBool(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return _in != 0;\\n }\\n\\n /**\\n * Converts a boolean to a bytes32 value.\\n * @param _in Input boolean value.\\n * @return Boolean as a bytes32.\\n */\\n function fromBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in ? 1 : 0));\\n }\\n\\n /**\\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as an address.\\n */\\n function toAddress(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return address(uint160(uint256(_in)));\\n }\\n\\n /**\\n * Converts an address to a bytes32.\\n * @param _in Input address value.\\n * @return Address as a bytes32.\\n */\\n function fromAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in));\\n }\\n\\n /**\\n * Removes the leading zeros from a bytes32 value and returns a new (smaller) bytes value.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 without any leading zeros.\\n */\\n function removeLeadingZeros(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out;\\n\\n assembly {\\n // Figure out how many leading zero bytes to remove.\\n let shift := 0\\n for { let i := 0 } and(lt(i, 32), eq(byte(i, _in), 0)) { i := add(i, 1) } {\\n shift := add(shift, 1)\\n }\\n\\n // Reserve some space for our output and fix the free memory pointer.\\n out := mload(0x40)\\n mstore(0x40, add(out, 0x40))\\n\\n // Shift the value and store it into the output bytes.\\n mstore(add(out, 0x20), shl(mul(shift, 8), _in))\\n\\n // Store the new size (with leading zero bytes removed) in the output byte size.\\n mstore(out, sub(32, shift))\\n }\\n\\n return out;\\n }\\n}\\n\",\"keccak256\":\"0xfa2def593e3fc56a31852c3744aefdaa93cec74e721bfcfeb1e5d166c7c60b64\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_BytesUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_BytesUtils\\n */\\nlibrary Lib_BytesUtils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_start + _length >= _start, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n if (_bytes.length - _start == 0) {\\n return bytes('');\\n }\\n\\n return slice(_bytes, _start, _bytes.length - _start);\\n }\\n\\n function toBytes32PadLeft(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes32)\\n {\\n bytes32 ret;\\n uint256 len = _bytes.length <= 32 ? _bytes.length : 32;\\n assembly {\\n ret := shr(mul(sub(32, len), 8), mload(add(_bytes, 32)))\\n }\\n return ret;\\n }\\n\\n function toBytes32(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes32)\\n {\\n if (_bytes.length < 32) {\\n bytes32 ret;\\n assembly {\\n ret := mload(add(_bytes, 32))\\n }\\n return ret;\\n }\\n\\n return abi.decode(_bytes,(bytes32)); // will truncate if input length > 32 bytes\\n }\\n\\n function toUint256(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (uint256)\\n {\\n return uint256(toBytes32(_bytes));\\n }\\n\\n function toUint24(bytes memory _bytes, uint256 _start) internal pure returns (uint24) {\\n require(_start + 3 >= _start, \\\"toUint24_overflow\\\");\\n require(_bytes.length >= _start + 3 , \\\"toUint24_outOfBounds\\\");\\n uint24 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x3), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toUint8(bytes memory _bytes, uint256 _start) internal pure returns (uint8) {\\n require(_start + 1 >= _start, \\\"toUint8_overflow\\\");\\n require(_bytes.length >= _start + 1 , \\\"toUint8_outOfBounds\\\");\\n uint8 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x1), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toAddress(bytes memory _bytes, uint256 _start) internal pure returns (address) {\\n require(_start + 20 >= _start, \\\"toAddress_overflow\\\");\\n require(_bytes.length >= _start + 20, \\\"toAddress_outOfBounds\\\");\\n address tempAddress;\\n\\n assembly {\\n tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000)\\n }\\n\\n return tempAddress;\\n }\\n\\n function toNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n bytes memory nibbles = new bytes(_bytes.length * 2);\\n\\n for (uint256 i = 0; i < _bytes.length; i++) {\\n nibbles[i * 2] = _bytes[i] >> 4;\\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\\n }\\n\\n return nibbles;\\n }\\n\\n function fromNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n bytes memory ret = new bytes(_bytes.length / 2);\\n\\n for (uint256 i = 0; i < ret.length; i++) {\\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\\n }\\n\\n return ret;\\n }\\n\\n function equal(\\n bytes memory _bytes,\\n bytes memory _other\\n )\\n internal\\n pure\\n returns (bool)\\n {\\n return keccak256(_bytes) == keccak256(_other);\\n }\\n}\\n\",\"keccak256\":\"0x0adf22e1b22ba09911e859f64cb3b484e992be4f9fd3b09088e6225bf8d06ce0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_ErrorUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/**\\n * @title Lib_ErrorUtils\\n */\\nlibrary Lib_ErrorUtils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Encodes an error string into raw solidity-style revert data.\\n * (i.e. ascii bytes, prefixed with bytes4(keccak(\\\"Error(string))\\\"))\\n * Ref: https://docs.soliditylang.org/en/v0.8.2/control-structures.html?highlight=Error(string)#panic-via-assert-and-error-via-require\\n * @param _reason Reason for the reversion.\\n * @return Standard solidity revert data for the given reason.\\n */\\n function encodeRevertString(\\n string memory _reason\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return abi.encodeWithSignature(\\n \\\"Error(string)\\\",\\n _reason\\n );\\n }\\n}\\n\",\"keccak256\":\"0xfc64ec4a81fb50865b502a0004ed154e8598e1a313db77303fc95e41f536e6b7\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_ErrorUtils } from \\\"../utils/Lib_ErrorUtils.sol\\\";\\n\\n/**\\n * @title Lib_SafeExecutionManagerWrapper\\n * @dev The Safe Execution Manager Wrapper provides functions which facilitate writing OVM safe \\n * code using the standard solidity compiler, by routing all its operations through the Execution \\n * Manager.\\n * \\n * Compiler used: solc\\n * Runtime target: OVM\\n */\\nlibrary Lib_SafeExecutionManagerWrapper {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Performs a safe ovmCALL.\\n * @param _gasLimit Gas limit for the call.\\n * @param _target Address to call.\\n * @param _calldata Data to send to the call.\\n * @return _success Whether or not the call reverted.\\n * @return _returndata Data returned by the call.\\n */\\n function safeCALL(\\n uint256 _gasLimit,\\n address _target,\\n bytes memory _calldata\\n )\\n internal\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCALL(uint256,address,bytes)\\\",\\n _gasLimit,\\n _target,\\n _calldata\\n )\\n );\\n\\n return abi.decode(returndata, (bool, bytes));\\n }\\n\\n /**\\n * Performs a safe ovmDELEGATECALL.\\n * @param _gasLimit Gas limit for the call.\\n * @param _target Address to call.\\n * @param _calldata Data to send to the call.\\n * @return _success Whether or not the call reverted.\\n * @return _returndata Data returned by the call.\\n */\\n function safeDELEGATECALL(\\n uint256 _gasLimit,\\n address _target,\\n bytes memory _calldata\\n )\\n internal\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmDELEGATECALL(uint256,address,bytes)\\\",\\n _gasLimit,\\n _target,\\n _calldata\\n )\\n );\\n\\n return abi.decode(returndata, (bool, bytes));\\n }\\n\\n /**\\n * Performs a safe ovmCREATE call.\\n * @param _gasLimit Gas limit for the creation.\\n * @param _bytecode Code for the new contract.\\n * @return _contract Address of the created contract.\\n */\\n function safeCREATE(\\n uint256 _gasLimit,\\n bytes memory _bytecode\\n )\\n internal\\n returns (\\n address,\\n bytes memory\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n _gasLimit,\\n abi.encodeWithSignature(\\n \\\"ovmCREATE(bytes)\\\",\\n _bytecode\\n )\\n );\\n\\n return abi.decode(returndata, (address, bytes));\\n }\\n\\n /**\\n * Performs a safe ovmEXTCODESIZE call.\\n * @param _contract Address of the contract to query the size of.\\n * @return _EXTCODESIZE Size of the requested contract in bytes.\\n */\\n function safeEXTCODESIZE(\\n address _contract\\n )\\n internal\\n returns (\\n uint256 _EXTCODESIZE\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmEXTCODESIZE(address)\\\",\\n _contract\\n )\\n );\\n\\n return abi.decode(returndata, (uint256));\\n }\\n\\n /**\\n * Performs a safe ovmCHAINID call.\\n * @return _CHAINID Result of calling ovmCHAINID.\\n */\\n function safeCHAINID()\\n internal\\n returns (\\n uint256 _CHAINID\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCHAINID()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (uint256));\\n }\\n\\n /**\\n * Performs a safe ovmCALLER call.\\n * @return _CALLER Result of calling ovmCALLER.\\n */\\n function safeCALLER()\\n internal\\n returns (\\n address _CALLER\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCALLER()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (address));\\n }\\n\\n /**\\n * Performs a safe ovmADDRESS call.\\n * @return _ADDRESS Result of calling ovmADDRESS.\\n */\\n function safeADDRESS()\\n internal\\n returns (\\n address _ADDRESS\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmADDRESS()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (address));\\n }\\n\\n /**\\n * Performs a safe ovmGETNONCE call.\\n * @return _nonce Result of calling ovmGETNONCE.\\n */\\n function safeGETNONCE()\\n internal\\n returns (\\n uint256 _nonce\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmGETNONCE()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (uint256));\\n }\\n\\n /**\\n * Performs a safe ovmINCREMENTNONCE call.\\n */\\n function safeINCREMENTNONCE()\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmINCREMENTNONCE()\\\"\\n )\\n );\\n }\\n\\n /**\\n * Performs a safe ovmCREATEEOA call.\\n * @param _messageHash Message hash which was signed by EOA\\n * @param _v v value of signature (0 or 1)\\n * @param _r r value of signature\\n * @param _s s value of signature\\n */\\n function safeCREATEEOA(\\n bytes32 _messageHash,\\n uint8 _v,\\n bytes32 _r,\\n bytes32 _s\\n )\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCREATEEOA(bytes32,uint8,bytes32,bytes32)\\\",\\n _messageHash,\\n _v,\\n _r,\\n _s\\n )\\n );\\n }\\n\\n /**\\n * Performs a safe REVERT.\\n * @param _reason String revert reason to pass along with the REVERT.\\n */\\n function safeREVERT(\\n string memory _reason\\n )\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmREVERT(bytes)\\\",\\n Lib_ErrorUtils.encodeRevertString(\\n _reason\\n )\\n )\\n );\\n }\\n\\n /**\\n * Performs a safe \\\"require\\\".\\n * @param _condition Boolean condition that must be true or will revert.\\n * @param _reason String revert reason to pass along with the REVERT.\\n */\\n function safeREQUIRE(\\n bool _condition,\\n string memory _reason\\n )\\n internal\\n {\\n if (!_condition) {\\n safeREVERT(\\n _reason\\n );\\n }\\n }\\n\\n /**\\n * Performs a safe ovmSLOAD call.\\n */\\n function safeSLOAD(\\n bytes32 _key\\n )\\n internal\\n returns (\\n bytes32\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmSLOAD(bytes32)\\\",\\n _key\\n )\\n );\\n\\n return abi.decode(returndata, (bytes32));\\n }\\n\\n /**\\n * Performs a safe ovmSSTORE call.\\n */\\n function safeSSTORE(\\n bytes32 _key,\\n bytes32 _value\\n )\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmSSTORE(bytes32,bytes32)\\\",\\n _key,\\n _value\\n )\\n );\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Performs an ovm interaction and the necessary safety checks.\\n * @param _gasLimit Gas limit for the interaction.\\n * @param _calldata Data to send to the OVM_ExecutionManager (encoded with sighash).\\n * @return _returndata Data sent back by the OVM_ExecutionManager.\\n */\\n function _safeExecutionManagerInteraction(\\n uint256 _gasLimit,\\n bytes memory _calldata\\n )\\n private\\n returns (\\n bytes memory _returndata\\n )\\n {\\n address ovmExecutionManager = msg.sender;\\n (\\n bool success,\\n bytes memory returndata\\n ) = ovmExecutionManager.call{gas: _gasLimit}(_calldata);\\n\\n if (success == false) {\\n assembly {\\n revert(add(returndata, 0x20), mload(returndata))\\n }\\n } else if (returndata.length == 1) {\\n assembly {\\n return(0, 1)\\n }\\n } else {\\n return returndata;\\n }\\n }\\n\\n function _safeExecutionManagerInteraction(\\n bytes memory _calldata\\n )\\n private\\n returns (\\n bytes memory _returndata\\n )\\n {\\n return _safeExecutionManagerInteraction(\\n gasleft(),\\n _calldata\\n );\\n }\\n}\\n\",\"keccak256\":\"0x41e146e7912af794a17cd43c5a276674be956bfa8f3ca5b451bcb82d81e6f492\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x608060405234801561001057600080fd5b506040516109f93803806109f983398101604081905261002f91610054565b600080546001600160a01b0319166001600160a01b0392909216919091179055610082565b600060208284031215610065578081fd5b81516001600160a01b038116811461007b578182fd5b9392505050565b610968806100916000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c806316e9cd9b14610046578063299ca4781461005b578063461a447814610079575b600080fd5b61005961005436600461057d565b61008c565b005b6100636101ea565b60405161007091906106db565b60405180910390f35b6100636100873660046105ec565b6101f9565b6100ca6040518060400160405280601981526020017f4f564d5f4c3242617463684d65737361676552656c61796572000000000000008152506101f9565b6001600160a01b0316336001600160a01b0316146101035760405162461bcd60e51b81526004016100fa906107d7565b60405180910390fd5b600061012660405180606001604052806021815260200161093b602191396101f9565b905060005b828110156101e457600084848381811061014157fe5b9050602002810190610153919061085a565b61015c9061089d565b8051602082015160408084015160608501516080860151925163d7fd19dd60e01b81529596506001600160a01b0389169563d7fd19dd956101a5959094909392916004016106ef565b600060405180830381600087803b1580156101bf57600080fd5b505af11580156101d3573d6000803e3d6000fd5b50506001909301925061012b915050565b50505050565b6000546001600160a01b031681565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b83811015610259578181015183820152602001610241565b50505050905090810190601f1680156102865780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b1580156102a357600080fd5b505afa1580156102b7573d6000803e3d6000fd5b505050506040513d60208110156102cd57600080fd5b505190505b919050565b600067ffffffffffffffff8311156102eb57fe5b6102fe601f8401601f1916602001610879565b905082815283838301111561031257600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b03811681146102d257600080fd5b600082601f830112610350578081fd5b61035f838335602085016102d7565b9392505050565b600060a08284031215610377578081fd5b60405160a0810167ffffffffffffffff828210818311171561039557fe5b816040528293508435835260208501356020840152604085013560408401526060850135606084015260808501359150808211156103d257600080fd5b506103df85828601610340565b6080830152505092915050565b6000604082840312156103fd578081fd5b6040516040810167ffffffffffffffff828210818311171561041b57fe5b816040528293508435835260209150818501358181111561043b57600080fd5b8501601f8101871361044c57600080fd5b80358281111561045857fe5b8381029250610468848401610879565b8181528481019083860185850187018b101561048357600080fd5b600095505b838610156104a6578035835260019590950194918601918601610488565b5080868801525050505050505092915050565b600060a082840312156104ca578081fd5b6104d460a0610879565b905081358152602082013567ffffffffffffffff808211156104f557600080fd5b61050185838601610366565b6020840152604084013591508082111561051a57600080fd5b610526858386016103ec565b6040840152606084013591508082111561053f57600080fd5b61054b85838601610340565b6060840152608084013591508082111561056457600080fd5b5061057184828501610340565b60808301525092915050565b6000806020838503121561058f578182fd5b823567ffffffffffffffff808211156105a6578384fd5b818501915085601f8301126105b9578384fd5b8135818111156105c7578485fd5b86602080830285010111156105da578485fd5b60209290920196919550909350505050565b6000602082840312156105fd578081fd5b813567ffffffffffffffff811115610613578182fd5b8201601f81018413610623578182fd5b610632848235602084016102d7565b949350505050565b60008151808452815b8181101561065f57602081850181015186830182015201610643565b818111156106705782602083870101525b50601f01601f19169290920160200192915050565b6000604083018251845260208084015160408287015282815180855260608801915083830194508592505b808310156106d057845182529383019360019290920191908301906106b0565b509695505050505050565b6001600160a01b0391909116815260200190565b6001600160a01b0386811682528516602082015260a06040820181905260009061071b9083018661063a565b846060840152828103608084015283518152602084015160a06020830152805160a0830152602081015160c0830152604081015160e083015260608101516101008301526080810151905060a061012083015261077c61014083018261063a565b9050604085015182820360408401526107958282610685565b915050606085015182820360608401526107af828261063a565b915050608085015182820360808401526107c9828261063a565b9a9950505050505050505050565b60208082526057908201527f4f564d5f4c314d756c74694d65737361676552656c617965723a2046756e637460408201527f696f6e2063616e206f6e6c792062652063616c6c656420627920746865204f5660608201527f4d5f4c3242617463684d65737361676552656c61796572000000000000000000608082015260a00190565b60008235609e1983360301811261086f578182fd5b9190910192915050565b60405181810167ffffffffffffffff8111828210171561089557fe5b604052919050565b600060a082360312156108ae578081fd5b60405160a0810167ffffffffffffffff82821081831117156108cc57fe5b816040526108d985610329565b83526108e760208601610329565b602084015260408501359150808211156108ff578384fd5b61090b36838701610340565b604084015260608501356060840152608085013591508082111561092d578384fd5b50610571368286016104b956fe50726f78795f5f4f564d5f4c3143726f7373446f6d61696e4d657373656e676572a164736f6c6343000706000a", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100415760003560e01c806316e9cd9b14610046578063299ca4781461005b578063461a447814610079575b600080fd5b61005961005436600461057d565b61008c565b005b6100636101ea565b60405161007091906106db565b60405180910390f35b6100636100873660046105ec565b6101f9565b6100ca6040518060400160405280601981526020017f4f564d5f4c3242617463684d65737361676552656c61796572000000000000008152506101f9565b6001600160a01b0316336001600160a01b0316146101035760405162461bcd60e51b81526004016100fa906107d7565b60405180910390fd5b600061012660405180606001604052806021815260200161093b602191396101f9565b905060005b828110156101e457600084848381811061014157fe5b9050602002810190610153919061085a565b61015c9061089d565b8051602082015160408084015160608501516080860151925163d7fd19dd60e01b81529596506001600160a01b0389169563d7fd19dd956101a5959094909392916004016106ef565b600060405180830381600087803b1580156101bf57600080fd5b505af11580156101d3573d6000803e3d6000fd5b50506001909301925061012b915050565b50505050565b6000546001600160a01b031681565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b83811015610259578181015183820152602001610241565b50505050905090810190601f1680156102865780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b1580156102a357600080fd5b505afa1580156102b7573d6000803e3d6000fd5b505050506040513d60208110156102cd57600080fd5b505190505b919050565b600067ffffffffffffffff8311156102eb57fe5b6102fe601f8401601f1916602001610879565b905082815283838301111561031257600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b03811681146102d257600080fd5b600082601f830112610350578081fd5b61035f838335602085016102d7565b9392505050565b600060a08284031215610377578081fd5b60405160a0810167ffffffffffffffff828210818311171561039557fe5b816040528293508435835260208501356020840152604085013560408401526060850135606084015260808501359150808211156103d257600080fd5b506103df85828601610340565b6080830152505092915050565b6000604082840312156103fd578081fd5b6040516040810167ffffffffffffffff828210818311171561041b57fe5b816040528293508435835260209150818501358181111561043b57600080fd5b8501601f8101871361044c57600080fd5b80358281111561045857fe5b8381029250610468848401610879565b8181528481019083860185850187018b101561048357600080fd5b600095505b838610156104a6578035835260019590950194918601918601610488565b5080868801525050505050505092915050565b600060a082840312156104ca578081fd5b6104d460a0610879565b905081358152602082013567ffffffffffffffff808211156104f557600080fd5b61050185838601610366565b6020840152604084013591508082111561051a57600080fd5b610526858386016103ec565b6040840152606084013591508082111561053f57600080fd5b61054b85838601610340565b6060840152608084013591508082111561056457600080fd5b5061057184828501610340565b60808301525092915050565b6000806020838503121561058f578182fd5b823567ffffffffffffffff808211156105a6578384fd5b818501915085601f8301126105b9578384fd5b8135818111156105c7578485fd5b86602080830285010111156105da578485fd5b60209290920196919550909350505050565b6000602082840312156105fd578081fd5b813567ffffffffffffffff811115610613578182fd5b8201601f81018413610623578182fd5b610632848235602084016102d7565b949350505050565b60008151808452815b8181101561065f57602081850181015186830182015201610643565b818111156106705782602083870101525b50601f01601f19169290920160200192915050565b6000604083018251845260208084015160408287015282815180855260608801915083830194508592505b808310156106d057845182529383019360019290920191908301906106b0565b509695505050505050565b6001600160a01b0391909116815260200190565b6001600160a01b0386811682528516602082015260a06040820181905260009061071b9083018661063a565b846060840152828103608084015283518152602084015160a06020830152805160a0830152602081015160c0830152604081015160e083015260608101516101008301526080810151905060a061012083015261077c61014083018261063a565b9050604085015182820360408401526107958282610685565b915050606085015182820360608401526107af828261063a565b915050608085015182820360808401526107c9828261063a565b9a9950505050505050505050565b60208082526057908201527f4f564d5f4c314d756c74694d65737361676552656c617965723a2046756e637460408201527f696f6e2063616e206f6e6c792062652063616c6c656420627920746865204f5660608201527f4d5f4c3242617463684d65737361676552656c61796572000000000000000000608082015260a00190565b60008235609e1983360301811261086f578182fd5b9190910192915050565b60405181810167ffffffffffffffff8111828210171561089557fe5b604052919050565b600060a082360312156108ae578081fd5b60405160a0810167ffffffffffffffff82821081831117156108cc57fe5b816040526108d985610329565b83526108e760208601610329565b602084015260408501359150808211156108ff578384fd5b61090b36838701610340565b604084015260608501356060840152608085013591508082111561092d578384fd5b50610571368286016104b956fe50726f78795f5f4f564d5f4c3143726f7373446f6d61696e4d657373656e676572a164736f6c6343000706000a", + "solcInputHash": "5ee8e508e2c54cb5ac6783b4855b1558", + "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"messageNonce\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"stateRootBatchHeader\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"siblings\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct Lib_OVMCodec.ChainInclusionProof\",\"name\":\"stateRootProof\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"stateTrieWitness\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"storageTrieWitness\",\"type\":\"bytes\"}],\"internalType\":\"struct iOVM_L1CrossDomainMessenger.L2MessageInclusionProof\",\"name\":\"proof\",\"type\":\"tuple\"}],\"internalType\":\"struct iOVM_L1MultiMessageRelayer.L2ToL1Message[]\",\"name\":\"_messages\",\"type\":\"tuple[]\"}],\"name\":\"batchRelayMessages\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The L1 Multi-Message Relayer contract is a gas efficiency optimization which enables the relayer to submit multiple messages in a single transaction to be relayed by the L1 Cross Domain Message Sender. Compiler used: solc Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"batchRelayMessages((address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))[])\":{\"params\":{\"_messages\":\"An array of L2 to L1 messages\"}},\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}}},\"title\":\"OVM_L1MultiMessageRelayer\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"batchRelayMessages((address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))[])\":{\"notice\":\"Forwards multiple cross domain messages to the L1 Cross Domain Messenger for relaying\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1MultiMessageRelayer.sol\":\"OVM_L1MultiMessageRelayer\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor () internal {\\n address msgSender = _msgSender();\\n _owner = msgSender;\\n emit OwnershipTransferred(address(0), msgSender);\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n emit OwnershipTransferred(_owner, address(0));\\n _owner = address(0);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n emit OwnershipTransferred(_owner, newOwner);\\n _owner = newOwner;\\n }\\n}\\n\",\"keccak256\":\"0x15e2d5bd4c28a88548074c54d220e8086f638a71ed07e6b3ba5a70066fcf458d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with GSN meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address payable) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes memory) {\\n this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x8d3cb350f04ff49cfb10aef08d87f19dcbaecc8027b0bed12f3275cd12f38cf0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1MultiMessageRelayer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// @unsupported: ovm\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Interface Imports */\\nimport { iOVM_L1CrossDomainMessenger } from \\\"../../../iOVM/bridge/messaging/iOVM_L1CrossDomainMessenger.sol\\\";\\nimport { iOVM_L1MultiMessageRelayer } from \\\"../../../iOVM/bridge/messaging/iOVM_L1MultiMessageRelayer.sol\\\";\\n\\n/* Library Imports */\\nimport { Lib_AddressResolver } from \\\"../../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/**\\n * @title OVM_L1MultiMessageRelayer\\n * @dev The L1 Multi-Message Relayer contract is a gas efficiency optimization which enables the\\n * relayer to submit multiple messages in a single transaction to be relayed by the L1 Cross Domain\\n * Message Sender.\\n *\\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract OVM_L1MultiMessageRelayer is iOVM_L1MultiMessageRelayer, Lib_AddressResolver {\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n */\\n constructor(\\n address _libAddressManager\\n )\\n Lib_AddressResolver(_libAddressManager)\\n {}\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyBatchRelayer() {\\n require(\\n msg.sender == resolve(\\\"OVM_L2BatchMessageRelayer\\\"),\\n \\\"OVM_L1MultiMessageRelayer: Function can only be called by the OVM_L2BatchMessageRelayer\\\"\\n );\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * @notice Forwards multiple cross domain messages to the L1 Cross Domain Messenger for relaying\\n * @param _messages An array of L2 to L1 messages\\n */\\n function batchRelayMessages(\\n L2ToL1Message[] calldata _messages\\n ) \\n override\\n external\\n onlyBatchRelayer\\n {\\n iOVM_L1CrossDomainMessenger messenger = iOVM_L1CrossDomainMessenger(\\n resolve(\\\"Proxy__OVM_L1CrossDomainMessenger\\\")\\n );\\n\\n for (uint256 i = 0; i < _messages.length; i++) {\\n L2ToL1Message memory message = _messages[i];\\n messenger.relayMessage(\\n message.target,\\n message.sender,\\n message.message,\\n message.messageNonce,\\n message.proof\\n );\\n }\\n }\\n}\\n\",\"keccak256\":\"0xe698b8dbdcecd055ee77cc553963f966faebcdefbed1e586f7fd603fa816d9c6\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/bridge/messaging/iAbs_BaseCrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/**\\n * @title iAbs_BaseCrossDomainMessenger\\n */\\ninterface iAbs_BaseCrossDomainMessenger {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event SentMessage(bytes message);\\n event RelayedMessage(bytes32 msgHash);\\n event FailedRelayedMessage(bytes32 msgHash);\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n function xDomainMessageSender() external view returns (address);\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sends a cross domain message to the target messenger.\\n * @param _target Target contract address.\\n * @param _message Message to send to the target.\\n * @param _gasLimit Gas limit for the provided message.\\n */\\n function sendMessage(\\n address _target,\\n bytes calldata _message,\\n uint32 _gasLimit\\n ) external;\\n}\\n\",\"keccak256\":\"0x89981ed48e99d6939cc6cdef827d484fa3e2292d66c0ba5056c7050cb6282d7e\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/bridge/messaging/iOVM_L1CrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { iAbs_BaseCrossDomainMessenger } from \\\"./iAbs_BaseCrossDomainMessenger.sol\\\";\\n\\n/**\\n * @title iOVM_L1CrossDomainMessenger\\n */\\ninterface iOVM_L1CrossDomainMessenger is iAbs_BaseCrossDomainMessenger {\\n\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n struct L2MessageInclusionProof {\\n bytes32 stateRoot;\\n Lib_OVMCodec.ChainBatchHeader stateRootBatchHeader;\\n Lib_OVMCodec.ChainInclusionProof stateRootProof;\\n bytes stateTrieWitness;\\n bytes storageTrieWitness;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Relays a cross domain message to a contract.\\n * @param _target Target contract address.\\n * @param _sender Message sender address.\\n * @param _message Message to send to the target.\\n * @param _messageNonce Nonce for the provided message.\\n * @param _proof Inclusion proof for the given message.\\n */\\n function relayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _messageNonce,\\n L2MessageInclusionProof memory _proof\\n ) external;\\n\\n /**\\n * Replays a cross domain message to the target messenger.\\n * @param _target Target contract address.\\n * @param _sender Original sender address.\\n * @param _message Message to send to the target.\\n * @param _messageNonce Nonce for the provided message.\\n * @param _gasLimit Gas limit for the provided message.\\n */\\n function replayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _messageNonce,\\n uint32 _gasLimit\\n ) external;\\n}\\n\",\"keccak256\":\"0xdcd239d0b215e400674d78e8db4ac12ba18efc34fa78e24c2ff867f61062dba2\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/bridge/messaging/iOVM_L1MultiMessageRelayer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Interface Imports */\\nimport { iOVM_L1CrossDomainMessenger } from \\\"../../../iOVM/bridge/messaging/iOVM_L1CrossDomainMessenger.sol\\\";\\ninterface iOVM_L1MultiMessageRelayer {\\n\\n struct L2ToL1Message {\\n address target;\\n address sender;\\n bytes message;\\n uint256 messageNonce;\\n iOVM_L1CrossDomainMessenger.L2MessageInclusionProof proof;\\n }\\n\\n function batchRelayMessages(L2ToL1Message[] calldata _messages) external;\\n}\\n\",\"keccak256\":\"0x8bc1fb2a33dcac59ec307195f8b8358d1ae2ab021c70a1589038b366d1b949d7\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/codec/Lib_OVMCodec.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../utils/Lib_Bytes32Utils.sol\\\";\\n\\n/**\\n * @title Lib_OVMCodec\\n */\\nlibrary Lib_OVMCodec {\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum QueueOrigin {\\n SEQUENCER_QUEUE,\\n L1TOL2_QUEUE\\n }\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Account {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n address ethAddress;\\n bool isFresh;\\n }\\n\\n struct EVMAccount {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n }\\n\\n struct ChainBatchHeader {\\n uint256 batchIndex;\\n bytes32 batchRoot;\\n uint256 batchSize;\\n uint256 prevTotalElements;\\n bytes extraData;\\n }\\n\\n struct ChainInclusionProof {\\n uint256 index;\\n bytes32[] siblings;\\n }\\n\\n struct Transaction {\\n uint256 timestamp;\\n uint256 blockNumber;\\n QueueOrigin l1QueueOrigin;\\n address l1TxOrigin;\\n address entrypoint;\\n uint256 gasLimit;\\n bytes data;\\n }\\n\\n struct TransactionChainElement {\\n bool isSequenced;\\n uint256 queueIndex; // QUEUED TX ONLY\\n uint256 timestamp; // SEQUENCER TX ONLY\\n uint256 blockNumber; // SEQUENCER TX ONLY\\n bytes txData; // SEQUENCER TX ONLY\\n }\\n\\n struct QueueElement {\\n bytes32 transactionHash;\\n uint40 timestamp;\\n uint40 blockNumber;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Encodes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Encoded transaction bytes.\\n */\\n function encodeTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return abi.encodePacked(\\n _transaction.timestamp,\\n _transaction.blockNumber,\\n _transaction.l1QueueOrigin,\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n );\\n }\\n\\n /**\\n * Hashes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Hashed transaction\\n */\\n function hashTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(encodeTransaction(_transaction));\\n }\\n\\n /**\\n * Converts an OVM account to an EVM account.\\n * @param _in OVM account to convert.\\n * @return Converted EVM account.\\n */\\n function toEVMAccount(\\n Account memory _in\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n return EVMAccount({\\n nonce: _in.nonce,\\n balance: _in.balance,\\n storageRoot: _in.storageRoot,\\n codeHash: _in.codeHash\\n });\\n }\\n\\n /**\\n * @notice RLP-encodes an account state struct.\\n * @param _account Account state struct.\\n * @return RLP-encoded account state.\\n */\\n function encodeEVMAccount(\\n EVMAccount memory _account\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes[] memory raw = new bytes[](4);\\n\\n // Unfortunately we can't create this array outright because\\n // Lib_RLPWriter.writeList will reject fixed-size arrays. Assigning\\n // index-by-index circumvents this issue.\\n raw[0] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.nonce)\\n )\\n );\\n raw[1] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.balance)\\n )\\n );\\n raw[2] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.storageRoot));\\n raw[3] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.codeHash));\\n\\n return Lib_RLPWriter.writeList(raw);\\n }\\n\\n /**\\n * @notice Decodes an RLP-encoded account state into a useful struct.\\n * @param _encoded RLP-encoded account state.\\n * @return Account state struct.\\n */\\n function decodeEVMAccount(\\n bytes memory _encoded\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\\n\\n return EVMAccount({\\n nonce: Lib_RLPReader.readUint256(accountState[0]),\\n balance: Lib_RLPReader.readUint256(accountState[1]),\\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\\n });\\n }\\n\\n /**\\n * Calculates a hash for a given batch header.\\n * @param _batchHeader Header to hash.\\n * @return Hash of the header.\\n */\\n function hashBatchHeader(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(\\n abi.encode(\\n _batchHeader.batchRoot,\\n _batchHeader.batchSize,\\n _batchHeader.prevTotalElements,\\n _batchHeader.extraData\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0xd85ba2066057a2677926f484b938c7c2ef33ff3853f3b71cda252f4a54f30e05\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n public\\n onlyOwner\\n {\\n addresses[_getNameHash(_name)] = _address;\\n\\n emit AddressSet(\\n _name,\\n _address\\n );\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0x2ce671a0e004df88b136bea5a3c59d0732cea8887c8496da1d509e0200b03d7d\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(\\n address _libAddressManager\\n ) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x65981feeabff6a81783ea97d44baf988a18a86c8cb374c46fdb71819cbacc7c0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPReader.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_RLPReader\\n * @dev Adapted from \\\"RLPReader\\\" by Hamdi Allam (hamdi.allam97@gmail.com).\\n */\\nlibrary Lib_RLPReader {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 constant internal MAX_LIST_LENGTH = 32;\\n\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum RLPItemType {\\n DATA_ITEM,\\n LIST_ITEM\\n }\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct RLPItem {\\n uint256 length;\\n uint256 ptr;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts bytes to a reference to memory position and length.\\n * @param _in Input bytes to convert.\\n * @return Output memory reference.\\n */\\n function toRLPItem(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem memory\\n )\\n {\\n uint256 ptr;\\n assembly {\\n ptr := add(_in, 32)\\n }\\n\\n return RLPItem({\\n length: _in.length,\\n ptr: ptr\\n });\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n (\\n uint256 listOffset,\\n ,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.LIST_ITEM,\\n \\\"Invalid RLP list value.\\\"\\n );\\n\\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\\n // writing to the length. Since we can't know the number of RLP items without looping over\\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\\n // simply set a reasonable maximum list length and decrease the size before we finish.\\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\\n\\n uint256 itemCount = 0;\\n uint256 offset = listOffset;\\n while (offset < _in.length) {\\n require(\\n itemCount < MAX_LIST_LENGTH,\\n \\\"Provided RLP list exceeds max list length.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n ) = _decodeLength(RLPItem({\\n length: _in.length - offset,\\n ptr: _in.ptr + offset\\n }));\\n\\n out[itemCount] = RLPItem({\\n length: itemLength + itemOffset,\\n ptr: _in.ptr + offset\\n });\\n\\n itemCount += 1;\\n offset += itemOffset + itemLength;\\n }\\n\\n // Decrease the array size to match the actual item count.\\n assembly {\\n mstore(out, itemCount)\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n return readList(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes value.\\\"\\n );\\n\\n return _copy(_in.ptr, itemOffset, itemLength);\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return readBytes(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return string(readBytes(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return readString(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n require(\\n _in.length <= 33,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr + itemOffset;\\n bytes32 out;\\n assembly {\\n out := mload(ptr)\\n\\n // Shift the bytes over to match the item size.\\n if lt(itemLength, 32) {\\n out := div(out, exp(256, sub(32, itemLength)))\\n }\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return readBytes32(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return uint256(readBytes32(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return readUint256(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n require(\\n _in.length == 1,\\n \\\"Invalid RLP boolean value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 out;\\n assembly {\\n out := byte(0, mload(ptr))\\n }\\n\\n require(\\n out == 0 || out == 1,\\n \\\"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\\\"\\n );\\n\\n return out != 0;\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return readBool(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n if (_in.length == 1) {\\n return address(0);\\n }\\n\\n require(\\n _in.length == 21,\\n \\\"Invalid RLP address value.\\\"\\n );\\n\\n return address(readUint256(_in));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return readAddress(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads the raw bytes of an RLP item.\\n * @param _in RLP item to read.\\n * @return Raw RLP bytes.\\n */\\n function readRawBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in);\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Decodes the length of an RLP item.\\n * @param _in RLP item to decode.\\n * @return Offset of the encoded data.\\n * @return Length of the encoded data.\\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\\n */\\n function _decodeLength(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n uint256,\\n uint256,\\n RLPItemType\\n )\\n {\\n require(\\n _in.length > 0,\\n \\\"RLP item cannot be null.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 prefix;\\n assembly {\\n prefix := byte(0, mload(ptr))\\n }\\n\\n if (prefix <= 0x7f) {\\n // Single byte.\\n\\n return (0, 1, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xb7) {\\n // Short string.\\n\\n uint256 strLen = prefix - 0x80;\\n\\n require(\\n _in.length > strLen,\\n \\\"Invalid RLP short string.\\\"\\n );\\n\\n return (1, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xbf) {\\n // Long string.\\n uint256 lenOfStrLen = prefix - 0xb7;\\n\\n require(\\n _in.length > lenOfStrLen,\\n \\\"Invalid RLP long string length.\\\"\\n );\\n\\n uint256 strLen;\\n assembly {\\n // Pick out the string length.\\n strLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfStrLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfStrLen + strLen,\\n \\\"Invalid RLP long string.\\\"\\n );\\n\\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xf7) {\\n // Short list.\\n uint256 listLen = prefix - 0xc0;\\n\\n require(\\n _in.length > listLen,\\n \\\"Invalid RLP short list.\\\"\\n );\\n\\n return (1, listLen, RLPItemType.LIST_ITEM);\\n } else {\\n // Long list.\\n uint256 lenOfListLen = prefix - 0xf7;\\n\\n require(\\n _in.length > lenOfListLen,\\n \\\"Invalid RLP long list length.\\\"\\n );\\n\\n uint256 listLen;\\n assembly {\\n // Pick out the list length.\\n listLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfListLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfListLen + listLen,\\n \\\"Invalid RLP long list.\\\"\\n );\\n\\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\\n }\\n }\\n\\n /**\\n * Copies the bytes from a memory location.\\n * @param _src Pointer to the location to read from.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Copied bytes.\\n */\\n function _copy(\\n uint256 _src,\\n uint256 _offset,\\n uint256 _length\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out = new bytes(_length);\\n if (out.length == 0) {\\n return out;\\n }\\n\\n uint256 src = _src + _offset;\\n uint256 dest;\\n assembly {\\n dest := add(out, 32)\\n }\\n\\n // Copy over as many complete words as we can.\\n for (uint256 i = 0; i < _length / 32; i++) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n\\n src += 32;\\n dest += 32;\\n }\\n\\n // Pick out the remaining bytes.\\n uint256 mask = 256 ** (32 - (_length % 32)) - 1;\\n assembly {\\n mstore(\\n dest,\\n or(\\n and(mload(src), not(mask)),\\n and(mload(dest), mask)\\n )\\n )\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Copies an RLP item into bytes.\\n * @param _in RLP item to copy.\\n * @return Copied bytes.\\n */\\n function _copy(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in.ptr, 0, _in.length);\\n }\\n}\\n\",\"keccak256\":\"0x829174c61216dce35fdb888383b6022e0365eb7fbdc71ad79d98b108091969fe\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPWriter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/**\\n * @title Lib_RLPWriter\\n * @author Bakaoh (with modifications)\\n */\\nlibrary Lib_RLPWriter {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * RLP encodes a byte string.\\n * @param _in The byte string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded;\\n\\n if (_in.length == 1 && uint8(_in[0]) < 128) {\\n encoded = _in;\\n } else {\\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * RLP encodes a list of RLP encoded byte byte strings.\\n * @param _in The list of RLP encoded byte strings.\\n * @return The RLP encoded list of items in bytes.\\n */\\n function writeList(\\n bytes[] memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory list = _flatten(_in);\\n return abi.encodePacked(_writeLength(list.length, 192), list);\\n }\\n\\n /**\\n * RLP encodes a string.\\n * @param _in The string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeString(\\n string memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(bytes(_in));\\n }\\n\\n /**\\n * RLP encodes an address.\\n * @param _in The address to encode.\\n * @return The RLP encoded address in bytes.\\n */\\n function writeAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a bytes32 value.\\n * @param _in The bytes32 to encode.\\n * @return _out The RLP encoded bytes32 in bytes.\\n */\\n function writeBytes32(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a uint.\\n * @param _in The uint256 to encode.\\n * @return The RLP encoded uint256 in bytes.\\n */\\n function writeUint(\\n uint256 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(_toBinary(_in));\\n }\\n\\n /**\\n * RLP encodes a bool.\\n * @param _in The bool to encode.\\n * @return The RLP encoded bool in bytes.\\n */\\n function writeBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded = new bytes(1);\\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\\n return encoded;\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\\n * @param _len The length of the string or the payload.\\n * @param _offset 128 if item is string, 192 if item is list.\\n * @return RLP encoded bytes.\\n */\\n function _writeLength(\\n uint256 _len,\\n uint256 _offset\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded;\\n\\n if (_len < 56) {\\n encoded = new bytes(1);\\n encoded[0] = byte(uint8(_len) + uint8(_offset));\\n } else {\\n uint256 lenLen;\\n uint256 i = 1;\\n while (_len / i != 0) {\\n lenLen++;\\n i *= 256;\\n }\\n\\n encoded = new bytes(lenLen + 1);\\n encoded[0] = byte(uint8(lenLen) + uint8(_offset) + 55);\\n for(i = 1; i <= lenLen; i++) {\\n encoded[i] = byte(uint8((_len / (256**(lenLen-i))) % 256));\\n }\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * Encode integer in big endian binary form with no leading zeroes.\\n * @notice TODO: This should be optimized with assembly to save gas costs.\\n * @param _x The integer to encode.\\n * @return RLP encoded bytes.\\n */\\n function _toBinary(\\n uint256 _x\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory b = abi.encodePacked(_x);\\n\\n uint256 i = 0;\\n for (; i < 32; i++) {\\n if (b[i] != 0) {\\n break;\\n }\\n }\\n\\n bytes memory res = new bytes(32 - i);\\n for (uint256 j = 0; j < res.length; j++) {\\n res[j] = b[i++];\\n }\\n\\n return res;\\n }\\n\\n /**\\n * Copies a piece of memory to another location.\\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\\n * @param _dest Destination location.\\n * @param _src Source location.\\n * @param _len Length of memory to copy.\\n */\\n function _memcpy(\\n uint256 _dest,\\n uint256 _src,\\n uint256 _len\\n )\\n private\\n pure\\n {\\n uint256 dest = _dest;\\n uint256 src = _src;\\n uint256 len = _len;\\n\\n for(; len >= 32; len -= 32) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n dest += 32;\\n src += 32;\\n }\\n\\n uint256 mask = 256 ** (32 - len) - 1;\\n assembly {\\n let srcpart := and(mload(src), not(mask))\\n let destpart := and(mload(dest), mask)\\n mstore(dest, or(destpart, srcpart))\\n }\\n }\\n\\n /**\\n * Flattens a list of byte strings into one byte string.\\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\\n * @param _list List of byte strings to flatten.\\n * @return The flattened byte string.\\n */\\n function _flatten(\\n bytes[] memory _list\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n if (_list.length == 0) {\\n return new bytes(0);\\n }\\n\\n uint256 len;\\n uint256 i = 0;\\n for (; i < _list.length; i++) {\\n len += _list[i].length;\\n }\\n\\n bytes memory flattened = new bytes(len);\\n uint256 flattenedPtr;\\n assembly { flattenedPtr := add(flattened, 0x20) }\\n\\n for(i = 0; i < _list.length; i++) {\\n bytes memory item = _list[i];\\n\\n uint256 listPtr;\\n assembly { listPtr := add(item, 0x20)}\\n\\n _memcpy(flattenedPtr, listPtr, item.length);\\n flattenedPtr += _list[i].length;\\n }\\n\\n return flattened;\\n }\\n}\\n\",\"keccak256\":\"0xb60ee4b03ad372c3deff21d454ab714dd0c18ee3e6f9d45532e209fc59d5a54d\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_Bytes32Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_Byte32Utils\\n */\\nlibrary Lib_Bytes32Utils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \\\"true.\\\"\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as a boolean.\\n */\\n function toBool(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return _in != 0;\\n }\\n\\n /**\\n * Converts a boolean to a bytes32 value.\\n * @param _in Input boolean value.\\n * @return Boolean as a bytes32.\\n */\\n function fromBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in ? 1 : 0));\\n }\\n\\n /**\\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as an address.\\n */\\n function toAddress(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return address(uint160(uint256(_in)));\\n }\\n\\n /**\\n * Converts an address to a bytes32.\\n * @param _in Input address value.\\n * @return Address as a bytes32.\\n */\\n function fromAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in));\\n }\\n\\n /**\\n * Removes the leading zeros from a bytes32 value and returns a new (smaller) bytes value.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 without any leading zeros.\\n */\\n function removeLeadingZeros(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out;\\n\\n assembly {\\n // Figure out how many leading zero bytes to remove.\\n let shift := 0\\n for { let i := 0 } and(lt(i, 32), eq(byte(i, _in), 0)) { i := add(i, 1) } {\\n shift := add(shift, 1)\\n }\\n\\n // Reserve some space for our output and fix the free memory pointer.\\n out := mload(0x40)\\n mstore(0x40, add(out, 0x40))\\n\\n // Shift the value and store it into the output bytes.\\n mstore(add(out, 0x20), shl(mul(shift, 8), _in))\\n\\n // Store the new size (with leading zero bytes removed) in the output byte size.\\n mstore(out, sub(32, shift))\\n }\\n\\n return out;\\n }\\n}\\n\",\"keccak256\":\"0xfa2def593e3fc56a31852c3744aefdaa93cec74e721bfcfeb1e5d166c7c60b64\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_BytesUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_BytesUtils\\n */\\nlibrary Lib_BytesUtils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_start + _length >= _start, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n if (_bytes.length - _start == 0) {\\n return bytes('');\\n }\\n\\n return slice(_bytes, _start, _bytes.length - _start);\\n }\\n\\n function toBytes32PadLeft(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n bytes32 ret;\\n uint256 len = _bytes.length <= 32 ? _bytes.length : 32;\\n assembly {\\n ret := shr(mul(sub(32, len), 8), mload(add(_bytes, 32)))\\n }\\n return ret;\\n }\\n\\n function toBytes32(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n if (_bytes.length < 32) {\\n bytes32 ret;\\n assembly {\\n ret := mload(add(_bytes, 32))\\n }\\n return ret;\\n }\\n\\n return abi.decode(_bytes,(bytes32)); // will truncate if input length > 32 bytes\\n }\\n\\n function toUint256(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return uint256(toBytes32(_bytes));\\n }\\n\\n function toUint24(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n uint24\\n )\\n {\\n require(_start + 3 >= _start, \\\"toUint24_overflow\\\");\\n require(_bytes.length >= _start + 3 , \\\"toUint24_outOfBounds\\\");\\n uint24 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x3), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toUint8(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n uint8\\n )\\n {\\n require(_start + 1 >= _start, \\\"toUint8_overflow\\\");\\n require(_bytes.length >= _start + 1 , \\\"toUint8_outOfBounds\\\");\\n uint8 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x1), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toAddress(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n require(_start + 20 >= _start, \\\"toAddress_overflow\\\");\\n require(_bytes.length >= _start + 20, \\\"toAddress_outOfBounds\\\");\\n address tempAddress;\\n\\n assembly {\\n tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000)\\n }\\n\\n return tempAddress;\\n }\\n\\n function toNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory nibbles = new bytes(_bytes.length * 2);\\n\\n for (uint256 i = 0; i < _bytes.length; i++) {\\n nibbles[i * 2] = _bytes[i] >> 4;\\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\\n }\\n\\n return nibbles;\\n }\\n\\n function fromNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory ret = new bytes(_bytes.length / 2);\\n\\n for (uint256 i = 0; i < ret.length; i++) {\\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\\n }\\n\\n return ret;\\n }\\n\\n function equal(\\n bytes memory _bytes,\\n bytes memory _other\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return keccak256(_bytes) == keccak256(_other);\\n }\\n}\\n\",\"keccak256\":\"0xa5195afe32fb2cf104d156e8f4bd39df1ec79bf6ba232097b9e8e0ee14fbc298\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x608060405234801561001057600080fd5b50604051610a22380380610a2283398101604081905261002f91610054565b600080546001600160a01b0319166001600160a01b0392909216919091179055610082565b600060208284031215610065578081fd5b81516001600160a01b038116811461007b578182fd5b9392505050565b610991806100916000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c806316e9cd9b14610046578063299ca4781461005b578063461a447814610079575b600080fd5b61005961005436600461057d565b61008c565b005b6100636101ea565b60405161007091906106db565b60405180910390f35b6100636100873660046105ec565b6101f9565b6100ca6040518060400160405280601981526020017f4f564d5f4c3242617463684d65737361676552656c61796572000000000000008152506101f9565b6001600160a01b0316336001600160a01b0316146101035760405162461bcd60e51b81526004016100fa906107d7565b60405180910390fd5b600061012660405180606001604052806021815260200161093b602191396101f9565b905060005b828110156101e457600084848381811061014157fe5b9050602002810190610153919061085a565b61015c9061089d565b8051602082015160408084015160608501516080860151925163d7fd19dd60e01b81529596506001600160a01b0389169563d7fd19dd956101a5959094909392916004016106ef565b600060405180830381600087803b1580156101bf57600080fd5b505af11580156101d3573d6000803e3d6000fd5b50506001909301925061012b915050565b50505050565b6000546001600160a01b031681565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b83811015610259578181015183820152602001610241565b50505050905090810190601f1680156102865780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b1580156102a357600080fd5b505afa1580156102b7573d6000803e3d6000fd5b505050506040513d60208110156102cd57600080fd5b505190505b919050565b600067ffffffffffffffff8311156102eb57fe5b6102fe601f8401601f1916602001610879565b905082815283838301111561031257600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b03811681146102d257600080fd5b600082601f830112610350578081fd5b61035f838335602085016102d7565b9392505050565b600060a08284031215610377578081fd5b60405160a0810167ffffffffffffffff828210818311171561039557fe5b816040528293508435835260208501356020840152604085013560408401526060850135606084015260808501359150808211156103d257600080fd5b506103df85828601610340565b6080830152505092915050565b6000604082840312156103fd578081fd5b6040516040810167ffffffffffffffff828210818311171561041b57fe5b816040528293508435835260209150818501358181111561043b57600080fd5b8501601f8101871361044c57600080fd5b80358281111561045857fe5b8381029250610468848401610879565b8181528481019083860185850187018b101561048357600080fd5b600095505b838610156104a6578035835260019590950194918601918601610488565b5080868801525050505050505092915050565b600060a082840312156104ca578081fd5b6104d460a0610879565b905081358152602082013567ffffffffffffffff808211156104f557600080fd5b61050185838601610366565b6020840152604084013591508082111561051a57600080fd5b610526858386016103ec565b6040840152606084013591508082111561053f57600080fd5b61054b85838601610340565b6060840152608084013591508082111561056457600080fd5b5061057184828501610340565b60808301525092915050565b6000806020838503121561058f578182fd5b823567ffffffffffffffff808211156105a6578384fd5b818501915085601f8301126105b9578384fd5b8135818111156105c7578485fd5b86602080830285010111156105da578485fd5b60209290920196919550909350505050565b6000602082840312156105fd578081fd5b813567ffffffffffffffff811115610613578182fd5b8201601f81018413610623578182fd5b610632848235602084016102d7565b949350505050565b60008151808452815b8181101561065f57602081850181015186830182015201610643565b818111156106705782602083870101525b50601f01601f19169290920160200192915050565b6000604083018251845260208084015160408287015282815180855260608801915083830194508592505b808310156106d057845182529383019360019290920191908301906106b0565b509695505050505050565b6001600160a01b0391909116815260200190565b6001600160a01b0386811682528516602082015260a06040820181905260009061071b9083018661063a565b846060840152828103608084015283518152602084015160a06020830152805160a0830152602081015160c0830152604081015160e083015260608101516101008301526080810151905060a061012083015261077c61014083018261063a565b9050604085015182820360408401526107958282610685565b915050606085015182820360608401526107af828261063a565b915050608085015182820360808401526107c9828261063a565b9a9950505050505050505050565b60208082526057908201527f4f564d5f4c314d756c74694d65737361676552656c617965723a2046756e637460408201527f696f6e2063616e206f6e6c792062652063616c6c656420627920746865204f5660608201527f4d5f4c3242617463684d65737361676552656c61796572000000000000000000608082015260a00190565b60008235609e1983360301811261086f578182fd5b9190910192915050565b60405181810167ffffffffffffffff8111828210171561089557fe5b604052919050565b600060a082360312156108ae578081fd5b60405160a0810167ffffffffffffffff82821081831117156108cc57fe5b816040526108d985610329565b83526108e760208601610329565b602084015260408501359150808211156108ff578384fd5b61090b36838701610340565b604084015260608501356060840152608085013591508082111561092d578384fd5b50610571368286016104b956fe50726f78795f5f4f564d5f4c3143726f7373446f6d61696e4d657373656e676572a264697066735822122054e57719bdaae865a83549e03668e0558acc8a0d1d5ba65034f61a02d9a35c6264736f6c63430007060033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100415760003560e01c806316e9cd9b14610046578063299ca4781461005b578063461a447814610079575b600080fd5b61005961005436600461057d565b61008c565b005b6100636101ea565b60405161007091906106db565b60405180910390f35b6100636100873660046105ec565b6101f9565b6100ca6040518060400160405280601981526020017f4f564d5f4c3242617463684d65737361676552656c61796572000000000000008152506101f9565b6001600160a01b0316336001600160a01b0316146101035760405162461bcd60e51b81526004016100fa906107d7565b60405180910390fd5b600061012660405180606001604052806021815260200161093b602191396101f9565b905060005b828110156101e457600084848381811061014157fe5b9050602002810190610153919061085a565b61015c9061089d565b8051602082015160408084015160608501516080860151925163d7fd19dd60e01b81529596506001600160a01b0389169563d7fd19dd956101a5959094909392916004016106ef565b600060405180830381600087803b1580156101bf57600080fd5b505af11580156101d3573d6000803e3d6000fd5b50506001909301925061012b915050565b50505050565b6000546001600160a01b031681565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b83811015610259578181015183820152602001610241565b50505050905090810190601f1680156102865780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b1580156102a357600080fd5b505afa1580156102b7573d6000803e3d6000fd5b505050506040513d60208110156102cd57600080fd5b505190505b919050565b600067ffffffffffffffff8311156102eb57fe5b6102fe601f8401601f1916602001610879565b905082815283838301111561031257600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b03811681146102d257600080fd5b600082601f830112610350578081fd5b61035f838335602085016102d7565b9392505050565b600060a08284031215610377578081fd5b60405160a0810167ffffffffffffffff828210818311171561039557fe5b816040528293508435835260208501356020840152604085013560408401526060850135606084015260808501359150808211156103d257600080fd5b506103df85828601610340565b6080830152505092915050565b6000604082840312156103fd578081fd5b6040516040810167ffffffffffffffff828210818311171561041b57fe5b816040528293508435835260209150818501358181111561043b57600080fd5b8501601f8101871361044c57600080fd5b80358281111561045857fe5b8381029250610468848401610879565b8181528481019083860185850187018b101561048357600080fd5b600095505b838610156104a6578035835260019590950194918601918601610488565b5080868801525050505050505092915050565b600060a082840312156104ca578081fd5b6104d460a0610879565b905081358152602082013567ffffffffffffffff808211156104f557600080fd5b61050185838601610366565b6020840152604084013591508082111561051a57600080fd5b610526858386016103ec565b6040840152606084013591508082111561053f57600080fd5b61054b85838601610340565b6060840152608084013591508082111561056457600080fd5b5061057184828501610340565b60808301525092915050565b6000806020838503121561058f578182fd5b823567ffffffffffffffff808211156105a6578384fd5b818501915085601f8301126105b9578384fd5b8135818111156105c7578485fd5b86602080830285010111156105da578485fd5b60209290920196919550909350505050565b6000602082840312156105fd578081fd5b813567ffffffffffffffff811115610613578182fd5b8201601f81018413610623578182fd5b610632848235602084016102d7565b949350505050565b60008151808452815b8181101561065f57602081850181015186830182015201610643565b818111156106705782602083870101525b50601f01601f19169290920160200192915050565b6000604083018251845260208084015160408287015282815180855260608801915083830194508592505b808310156106d057845182529383019360019290920191908301906106b0565b509695505050505050565b6001600160a01b0391909116815260200190565b6001600160a01b0386811682528516602082015260a06040820181905260009061071b9083018661063a565b846060840152828103608084015283518152602084015160a06020830152805160a0830152602081015160c0830152604081015160e083015260608101516101008301526080810151905060a061012083015261077c61014083018261063a565b9050604085015182820360408401526107958282610685565b915050606085015182820360608401526107af828261063a565b915050608085015182820360808401526107c9828261063a565b9a9950505050505050505050565b60208082526057908201527f4f564d5f4c314d756c74694d65737361676552656c617965723a2046756e637460408201527f696f6e2063616e206f6e6c792062652063616c6c656420627920746865204f5660608201527f4d5f4c3242617463684d65737361676552656c61796572000000000000000000608082015260a00190565b60008235609e1983360301811261086f578182fd5b9190910192915050565b60405181810167ffffffffffffffff8111828210171561089557fe5b604052919050565b600060a082360312156108ae578081fd5b60405160a0810167ffffffffffffffff82821081831117156108cc57fe5b816040526108d985610329565b83526108e760208601610329565b602084015260408501359150808211156108ff578384fd5b61090b36838701610340565b604084015260608501356060840152608085013591508082111561092d578384fd5b50610571368286016104b956fe50726f78795f5f4f564d5f4c3143726f7373446f6d61696e4d657373656e676572a264697066735822122054e57719bdaae865a83549e03668e0558acc8a0d1d5ba65034f61a02d9a35c6264736f6c63430007060033", "devdoc": { - "details": "The L1 Multi-Message Relayer contract is a gas efficiency optimization which enables the relayer to submit multiple messages in a single transaction to be relayed by the L1 Cross Domain Message Sender. Compiler used: solc Runtime target: EVM", + "details": "The L1 Multi-Message Relayer contract is a gas efficiency optimization which enables the relayer to submit multiple messages in a single transaction to be relayed by the L1 Cross Domain Message Sender. Compiler used: solc Runtime target: EVM", "kind": "dev", "methods": { "batchRelayMessages((address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))[])": { "params": { "_messages": "An array of L2 to L1 messages" } + }, + "constructor": { + "params": { + "_libAddressManager": "Address of the Address Manager." + } + }, + "resolve(string)": { + "params": { + "_name": "Name to resolve an address for." + }, + "returns": { + "_0": "Address associated with the given name." + } } }, "title": "OVM_L1MultiMessageRelayer", @@ -192,6 +205,9 @@ "methods": { "batchRelayMessages((address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))[])": { "notice": "Forwards multiple cross domain messages to the L1 Cross Domain Messenger for relaying" + }, + "resolve(string)": { + "notice": "Resolves the address associated with a given name." } }, "version": 1 @@ -199,16 +215,16 @@ "storageLayout": { "storage": [ { - "astId": 12526, + "astId": 12800, "contract": "contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1MultiMessageRelayer.sol:OVM_L1MultiMessageRelayer", "label": "libAddressManager", "offset": 0, "slot": "0", - "type": "t_contract(Lib_AddressManager)12519" + "type": "t_contract(Lib_AddressManager)12793" } ], "types": { - "t_contract(Lib_AddressManager)12519": { + "t_contract(Lib_AddressManager)12793": { "encoding": "inplace", "label": "contract Lib_AddressManager", "numberOfBytes": "20" diff --git a/packages/contracts/deployments/kovan/OVM_SafetyChecker.json b/packages/contracts/deployments/kovan/OVM_SafetyChecker.json index 1bedf2501e4f2..aa5d39e753eab 100644 --- a/packages/contracts/deployments/kovan/OVM_SafetyChecker.json +++ b/packages/contracts/deployments/kovan/OVM_SafetyChecker.json @@ -1,5 +1,5 @@ { - "address": "0xeb91D9059761aFa197deD7b1FB4228F7ea921d3e", + "address": "0xf0FaB0ce35a6d3F82b0B42f09A2734065908dB6a", "abi": [ { "inputs": [ @@ -21,29 +21,29 @@ "type": "function" } ], - "transactionHash": "0x5fd7e2024d76674df64d9004bfc79403b8708ecdd98726e97a1a53f946001850", + "transactionHash": "0x3db100815c1e0b4b185f3eca0541d88c95348ba8e6a7beba8d0a96f6437544c3", "receipt": { "to": null, "from": "0x18394B52d3Cb931dfA76F63251919D051953413d", - "contractAddress": "0xeb91D9059761aFa197deD7b1FB4228F7ea921d3e", + "contractAddress": "0xf0FaB0ce35a6d3F82b0B42f09A2734065908dB6a", "transactionIndex": 1, - "gasUsed": "234686", + "gasUsed": "243548", "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0x156001de46bcd44ae0563a00d750d6ba81fc6c7e7da4c1af4926c8ea92218319", - "transactionHash": "0x5fd7e2024d76674df64d9004bfc79403b8708ecdd98726e97a1a53f946001850", + "blockHash": "0xb26ad9738f8cc5da3a4e95a3e73bb4b26ca317503fa696d4dc1acdf8d12c63db", + "transactionHash": "0x3db100815c1e0b4b185f3eca0541d88c95348ba8e6a7beba8d0a96f6437544c3", "logs": [], - "blockNumber": 24199521, - "cumulativeGasUsed": "301566", + "blockNumber": 24572875, + "cumulativeGasUsed": "288408", "status": 1, "byzantium": true }, "args": [], - "solcInputHash": "03aed03b958b1d37f90bd88d0f56dd85", - "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_bytecode\",\"type\":\"bytes\"}],\"name\":\"isBytecodeSafe\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The Safety Checker verifies that contracts deployed on L2 do not contain any \\\"unsafe\\\" operations. An operation is considered unsafe if it would access state variables which are specific to the environment (ie. L1 or L2) in which it is executed, as this could be used to \\\"escape the sandbox\\\" of the OVM, resulting in non-deterministic fraud proofs. That is, an attacker would be able to \\\"prove fraud\\\" on an honestly applied transaction. Note that a \\\"safe\\\" contract requires opcodes to appear in a particular pattern; omission of \\\"unsafe\\\" opcodes is necessary, but not sufficient. Compiler used: solc Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"isBytecodeSafe(bytes)\":{\"params\":{\"_bytecode\":\"The bytecode to safety check.\"},\"returns\":{\"_0\":\"`true` if the bytecode is safe, `false` otherwise.\"}}},\"title\":\"OVM_SafetyChecker\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"isBytecodeSafe(bytes)\":{\"notice\":\"Returns whether or not all of the provided bytecode is safe.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/OVM/execution/OVM_SafetyChecker.sol\":\"OVM_SafetyChecker\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/optimistic-ethereum/OVM/execution/OVM_SafetyChecker.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Interface Imports */\\nimport { iOVM_SafetyChecker } from \\\"../../iOVM/execution/iOVM_SafetyChecker.sol\\\";\\n\\n/**\\n * @title OVM_SafetyChecker\\n * @dev The Safety Checker verifies that contracts deployed on L2 do not contain any\\n * \\\"unsafe\\\" operations. An operation is considered unsafe if it would access state variables which\\n * are specific to the environment (ie. L1 or L2) in which it is executed, as this could be used\\n * to \\\"escape the sandbox\\\" of the OVM, resulting in non-deterministic fraud proofs. \\n * That is, an attacker would be able to \\\"prove fraud\\\" on an honestly applied transaction.\\n * Note that a \\\"safe\\\" contract requires opcodes to appear in a particular pattern;\\n * omission of \\\"unsafe\\\" opcodes is necessary, but not sufficient.\\n *\\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract OVM_SafetyChecker is iOVM_SafetyChecker {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Returns whether or not all of the provided bytecode is safe.\\n * @param _bytecode The bytecode to safety check.\\n * @return `true` if the bytecode is safe, `false` otherwise.\\n */\\n function isBytecodeSafe(\\n bytes memory _bytecode\\n )\\n override\\n external\\n pure\\n returns (\\n bool\\n )\\n {\\n // autogenerated by gen_safety_checker_constants.py\\n // number of bytes to skip for each opcode\\n uint256[8] memory opcodeSkippableBytes = [\\n uint256(0x0001010101010101010101010000000001010101010101010101010101010000),\\n uint256(0x0100000000000000000000000000000000000000010101010101000000010100),\\n uint256(0x0000000000000000000000000000000001010101000000010101010100000000),\\n uint256(0x0203040500000000000000000000000000000000000000000000000000000000),\\n uint256(0x0101010101010101010101010101010101010101010101010101010101010101),\\n uint256(0x0101010101000000000000000000000000000000000000000000000000000000),\\n uint256(0x0000000000000000000000000000000000000000000000000000000000000000),\\n uint256(0x0000000000000000000000000000000000000000000000000000000000000000)\\n ];\\n // Mask to gate opcode specific cases\\n uint256 opcodeGateMask = ~uint256(0xffffffffffffffffffffffe000000000fffffffff070ffff9c0ffffec000f001);\\n // Halting opcodes\\n uint256 opcodeHaltingMask = ~uint256(0x4008000000000000000000000000000000000000004000000000000000000001);\\n // PUSH opcodes\\n uint256 opcodePushMask = ~uint256(0xffffffff000000000000000000000000);\\n\\n uint256 codeLength;\\n uint256 _pc;\\n assembly {\\n _pc := add(_bytecode, 0x20)\\n }\\n codeLength = _pc + _bytecode.length;\\n do {\\n // current opcode: 0x00...0xff\\n uint256 opNum;\\n\\n // inline assembly removes the extra add + bounds check\\n assembly {\\n let word := mload(_pc) //load the next 32 bytes at pc into word\\n\\n // Look up number of bytes to skip from opcodeSkippableBytes and then update indexInWord\\n // E.g. the 02030405 in opcodeSkippableBytes is the number of bytes to skip for PUSH1->4\\n // We repeat this 6 times, thus we can only skip bytes for up to PUSH4 ((1+4) * 6 = 30 < 32).\\n // If we see an opcode that is listed as 0 skippable bytes e.g. PUSH5,\\n // then we will get stuck on that indexInWord and then opNum will be set to the PUSH5 opcode.\\n let indexInWord := byte(0, mload(add(opcodeSkippableBytes, byte(0, word))))\\n indexInWord := add(indexInWord, byte(0, mload(add(opcodeSkippableBytes, byte(indexInWord, word)))))\\n indexInWord := add(indexInWord, byte(0, mload(add(opcodeSkippableBytes, byte(indexInWord, word)))))\\n indexInWord := add(indexInWord, byte(0, mload(add(opcodeSkippableBytes, byte(indexInWord, word)))))\\n indexInWord := add(indexInWord, byte(0, mload(add(opcodeSkippableBytes, byte(indexInWord, word)))))\\n indexInWord := add(indexInWord, byte(0, mload(add(opcodeSkippableBytes, byte(indexInWord, word)))))\\n _pc := add(_pc, indexInWord)\\n\\n opNum := byte(indexInWord, word)\\n }\\n\\n // + push opcodes\\n // + stop opcodes [STOP(0x00),JUMP(0x56),RETURN(0xf3),INVALID(0xfe)]\\n // + caller opcode CALLER(0x33)\\n // + blacklisted opcodes\\n uint256 opBit = 1 << opNum;\\n if (opBit & opcodeGateMask == 0) {\\n if (opBit & opcodePushMask == 0) {\\n // all pushes are valid opcodes\\n // subsequent bytes are not opcodes. Skip them.\\n _pc += (opNum - 0x5e); // PUSH1 is 0x60, so opNum-0x5f = PUSHed bytes and we +1 to\\n // skip the _pc++; line below in order to save gas ((-0x5f + 1) = -0x5e)\\n continue;\\n } else if (opBit & opcodeHaltingMask == 0) {\\n // STOP or JUMP or RETURN or INVALID (Note: REVERT is blacklisted, so not included here)\\n // We are now inside unreachable code until we hit a JUMPDEST!\\n do {\\n _pc++;\\n assembly {\\n opNum := byte(0, mload(_pc))\\n }\\n // encountered a JUMPDEST\\n if (opNum == 0x5b) break;\\n // skip PUSHed bytes\\n if ((1 << opNum) & opcodePushMask == 0) _pc += (opNum - 0x5f); // opNum-0x5f = PUSHed bytes (PUSH1 is 0x60)\\n } while (_pc < codeLength);\\n // opNum is 0x5b, so we don't continue here since the pc++ is fine\\n } else if (opNum == 0x33) { // Caller opcode\\n uint256 firstOps; // next 32 bytes of bytecode\\n uint256 secondOps; // following 32 bytes of bytecode\\n\\n assembly {\\n firstOps := mload(_pc)\\n // 37 bytes total, 5 left over --> 32 - 5 bytes = 27 bytes = 216 bits\\n secondOps := shr(216, mload(add(_pc, 0x20)))\\n }\\n\\n // Call identity precompile\\n // CALLER POP PUSH1 0x00 PUSH1 0x04 GAS CALL\\n // 32 - 8 bytes = 24 bytes = 192\\n if ((firstOps >> 192) == 0x3350600060045af1) {\\n _pc += 8;\\n // Call EM and abort execution if instructed\\n // CALLER PUSH1 0x00 SWAP1 GAS CALL PC PUSH1 0x0E ADD JUMPI RETURNDATASIZE PUSH1 0x00 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x00 REVERT JUMPDEST RETURNDATASIZE PUSH1 0x01 EQ ISZERO PC PUSH1 0x0a ADD JUMPI PUSH1 0x01 PUSH1 0x00 RETURN JUMPDEST \\n } else if (firstOps == 0x336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a015760 && secondOps == 0x016000f35b) {\\n _pc += 37;\\n } else {\\n return false;\\n }\\n continue;\\n } else {\\n // encountered a non-whitelisted opcode!\\n return false;\\n }\\n }\\n _pc++;\\n } while (_pc < codeLength);\\n return true;\\n }\\n}\\n\",\"keccak256\":\"0xb1578ea95da5f6e7d5f5428ccc5efe629b3b9ef88fed7625fa7b78cdb9539508\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/execution/iOVM_SafetyChecker.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title iOVM_SafetyChecker\\n */\\ninterface iOVM_SafetyChecker {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function isBytecodeSafe(bytes calldata _bytecode) external pure returns (bool);\\n}\\n\",\"keccak256\":\"0xde6639676d4ec4f77297652d5ede2429bc93e74e11fefd9e9de4bc92dd784878\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x608060405234801561001057600080fd5b5061034a806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063a44eb59a14610030575b600080fd5b6100d66004803603602081101561004657600080fd5b81019060208101813564010000000081111561006157600080fd5b82018360208201111561007357600080fd5b8035906020019184600183028401116401000000008311171561009557600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506100ea945050505050565b604080519115158252519081900360200190f35b60408051610100810182527e0101010101010101010101000000000101010101010101010101010101000081526b010101010101000000010100600160f81b016020808301919091526f0101010100000001010101010000000092820192909252630203040560e01b60608201527f0101010101010101010101010101010101010101010101010101010101010101608082015264010101010160d81b60a0820152600060c0820181905260e0820181905283519092741fffffffff000000000f8f000063f000013fff0ffe916a40000000000000000000026117ff60f31b039163ffffffff60601b1991870181019087015b8051600081811a880151811a82811a890151821a0182811a890151821a0182811a890151821a0182811a890151821a0182811a89015190911a01918201911a6001811b86811661032057808516610239575001605d1901610326565b80861661027e575b8280600101935050825160001a915081605b141561025e57610279565b6001821b851661027157918101605e1901915b838310610241575b610320565b816033141561030f578251602084015160d81c673350600060045af160c083901c14156102b057600885019450610306565b817f336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a0157601480156102e357508064016000f35b145b156102f357602585019450610306565b60009a5050505050505050505050610338565b50505050610326565b600098505050505050505050610338565b50506001015b8181106101dd57600196505050505050505b91905056fea164736f6c6343000706000a", - "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061002b5760003560e01c8063a44eb59a14610030575b600080fd5b6100d66004803603602081101561004657600080fd5b81019060208101813564010000000081111561006157600080fd5b82018360208201111561007357600080fd5b8035906020019184600183028401116401000000008311171561009557600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506100ea945050505050565b604080519115158252519081900360200190f35b60408051610100810182527e0101010101010101010101000000000101010101010101010101010101000081526b010101010101000000010100600160f81b016020808301919091526f0101010100000001010101010000000092820192909252630203040560e01b60608201527f0101010101010101010101010101010101010101010101010101010101010101608082015264010101010160d81b60a0820152600060c0820181905260e0820181905283519092741fffffffff000000000f8f000063f000013fff0ffe916a40000000000000000000026117ff60f31b039163ffffffff60601b1991870181019087015b8051600081811a880151811a82811a890151821a0182811a890151821a0182811a890151821a0182811a890151821a0182811a89015190911a01918201911a6001811b86811661032057808516610239575001605d1901610326565b80861661027e575b8280600101935050825160001a915081605b141561025e57610279565b6001821b851661027157918101605e1901915b838310610241575b610320565b816033141561030f578251602084015160d81c673350600060045af160c083901c14156102b057600885019450610306565b817f336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a0157601480156102e357508064016000f35b145b156102f357602585019450610306565b60009a5050505050505050505050610338565b50505050610326565b600098505050505050505050610338565b50506001015b8181106101dd57600196505050505050505b91905056fea164736f6c6343000706000a", + "solcInputHash": "5ee8e508e2c54cb5ac6783b4855b1558", + "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_bytecode\",\"type\":\"bytes\"}],\"name\":\"isBytecodeSafe\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The Safety Checker verifies that contracts deployed on L2 do not contain any \\\"unsafe\\\" operations. An operation is considered unsafe if it would access state variables which are specific to the environment (ie. L1 or L2) in which it is executed, as this could be used to \\\"escape the sandbox\\\" of the OVM, resulting in non-deterministic fraud proofs. That is, an attacker would be able to \\\"prove fraud\\\" on an honestly applied transaction. Note that a \\\"safe\\\" contract requires opcodes to appear in a particular pattern; omission of \\\"unsafe\\\" opcodes is necessary, but not sufficient. Compiler used: solc Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"isBytecodeSafe(bytes)\":{\"params\":{\"_bytecode\":\"The bytecode to safety check.\"},\"returns\":{\"_0\":\"`true` if the bytecode is safe, `false` otherwise.\"}}},\"title\":\"OVM_SafetyChecker\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"isBytecodeSafe(bytes)\":{\"notice\":\"Returns whether or not all of the provided bytecode is safe.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/OVM/execution/OVM_SafetyChecker.sol\":\"OVM_SafetyChecker\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/optimistic-ethereum/OVM/execution/OVM_SafetyChecker.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Interface Imports */\\nimport { iOVM_SafetyChecker } from \\\"../../iOVM/execution/iOVM_SafetyChecker.sol\\\";\\n\\n/**\\n * @title OVM_SafetyChecker\\n * @dev The Safety Checker verifies that contracts deployed on L2 do not contain any\\n * \\\"unsafe\\\" operations. An operation is considered unsafe if it would access state variables which\\n * are specific to the environment (ie. L1 or L2) in which it is executed, as this could be used\\n * to \\\"escape the sandbox\\\" of the OVM, resulting in non-deterministic fraud proofs.\\n * That is, an attacker would be able to \\\"prove fraud\\\" on an honestly applied transaction.\\n * Note that a \\\"safe\\\" contract requires opcodes to appear in a particular pattern;\\n * omission of \\\"unsafe\\\" opcodes is necessary, but not sufficient.\\n *\\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract OVM_SafetyChecker is iOVM_SafetyChecker {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Returns whether or not all of the provided bytecode is safe.\\n * @param _bytecode The bytecode to safety check.\\n * @return `true` if the bytecode is safe, `false` otherwise.\\n */\\n function isBytecodeSafe(\\n bytes memory _bytecode\\n )\\n override\\n external\\n pure\\n returns (\\n bool\\n )\\n {\\n // autogenerated by gen_safety_checker_constants.py\\n // number of bytes to skip for each opcode\\n uint256[8] memory opcodeSkippableBytes = [\\n uint256(0x0001010101010101010101010000000001010101010101010101010101010000),\\n uint256(0x0100000000000000000000000000000000000000010101010101000000010100),\\n uint256(0x0000000000000000000000000000000001010101000000010101010100000000),\\n uint256(0x0203040500000000000000000000000000000000000000000000000000000000),\\n uint256(0x0101010101010101010101010101010101010101010101010101010101010101),\\n uint256(0x0101010101000000000000000000000000000000000000000000000000000000),\\n uint256(0x0000000000000000000000000000000000000000000000000000000000000000),\\n uint256(0x0000000000000000000000000000000000000000000000000000000000000000)\\n ];\\n // Mask to gate opcode specific cases\\n uint256 opcodeGateMask = ~uint256(0xffffffffffffffffffffffe000000000fffffffff070ffff9c0ffffec000f001);\\n // Halting opcodes\\n uint256 opcodeHaltingMask = ~uint256(0x4008000000000000000000000000000000000000004000000000000000000001);\\n // PUSH opcodes\\n uint256 opcodePushMask = ~uint256(0xffffffff000000000000000000000000);\\n\\n uint256 codeLength;\\n uint256 _pc;\\n assembly {\\n _pc := add(_bytecode, 0x20)\\n }\\n codeLength = _pc + _bytecode.length;\\n do {\\n // current opcode: 0x00...0xff\\n uint256 opNum;\\n\\n // inline assembly removes the extra add + bounds check\\n assembly {\\n let word := mload(_pc) //load the next 32 bytes at pc into word\\n\\n // Look up number of bytes to skip from opcodeSkippableBytes and then update indexInWord\\n // E.g. the 02030405 in opcodeSkippableBytes is the number of bytes to skip for PUSH1->4\\n // We repeat this 6 times, thus we can only skip bytes for up to PUSH4 ((1+4) * 6 = 30 < 32).\\n // If we see an opcode that is listed as 0 skippable bytes e.g. PUSH5,\\n // then we will get stuck on that indexInWord and then opNum will be set to the PUSH5 opcode.\\n let indexInWord := byte(0, mload(add(opcodeSkippableBytes, byte(0, word))))\\n indexInWord := add(indexInWord, byte(0, mload(add(opcodeSkippableBytes, byte(indexInWord, word)))))\\n indexInWord := add(indexInWord, byte(0, mload(add(opcodeSkippableBytes, byte(indexInWord, word)))))\\n indexInWord := add(indexInWord, byte(0, mload(add(opcodeSkippableBytes, byte(indexInWord, word)))))\\n indexInWord := add(indexInWord, byte(0, mload(add(opcodeSkippableBytes, byte(indexInWord, word)))))\\n indexInWord := add(indexInWord, byte(0, mload(add(opcodeSkippableBytes, byte(indexInWord, word)))))\\n _pc := add(_pc, indexInWord)\\n\\n opNum := byte(indexInWord, word)\\n }\\n\\n // + push opcodes\\n // + stop opcodes [STOP(0x00),JUMP(0x56),RETURN(0xf3),INVALID(0xfe)]\\n // + caller opcode CALLER(0x33)\\n // + blacklisted opcodes\\n uint256 opBit = 1 << opNum;\\n if (opBit & opcodeGateMask == 0) {\\n if (opBit & opcodePushMask == 0) {\\n // all pushes are valid opcodes\\n // subsequent bytes are not opcodes. Skip them.\\n _pc += (opNum - 0x5e); // PUSH1 is 0x60, so opNum-0x5f = PUSHed bytes and we +1 to\\n // skip the _pc++; line below in order to save gas ((-0x5f + 1) = -0x5e)\\n continue;\\n } else if (opBit & opcodeHaltingMask == 0) {\\n // STOP or JUMP or RETURN or INVALID (Note: REVERT is blacklisted, so not included here)\\n // We are now inside unreachable code until we hit a JUMPDEST!\\n do {\\n _pc++;\\n assembly {\\n opNum := byte(0, mload(_pc))\\n }\\n // encountered a JUMPDEST\\n if (opNum == 0x5b) break;\\n // skip PUSHed bytes\\n if ((1 << opNum) & opcodePushMask == 0) _pc += (opNum - 0x5f); // opNum-0x5f = PUSHed bytes (PUSH1 is 0x60)\\n } while (_pc < codeLength);\\n // opNum is 0x5b, so we don't continue here since the pc++ is fine\\n } else if (opNum == 0x33) { // Caller opcode\\n uint256 firstOps; // next 32 bytes of bytecode\\n uint256 secondOps; // following 32 bytes of bytecode\\n\\n assembly {\\n firstOps := mload(_pc)\\n // 37 bytes total, 5 left over --> 32 - 5 bytes = 27 bytes = 216 bits\\n secondOps := shr(216, mload(add(_pc, 0x20)))\\n }\\n\\n // Call identity precompile\\n // CALLER POP PUSH1 0x00 PUSH1 0x04 GAS CALL\\n // 32 - 8 bytes = 24 bytes = 192\\n if ((firstOps >> 192) == 0x3350600060045af1) {\\n _pc += 8;\\n // Call EM and abort execution if instructed\\n // CALLER PUSH1 0x00 SWAP1 GAS CALL PC PUSH1 0x0E ADD JUMPI RETURNDATASIZE PUSH1 0x00 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x00 REVERT JUMPDEST RETURNDATASIZE PUSH1 0x01 EQ ISZERO PC PUSH1 0x0a ADD JUMPI PUSH1 0x01 PUSH1 0x00 RETURN JUMPDEST\\n } else if (firstOps == 0x336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a015760 && secondOps == 0x016000f35b) {\\n _pc += 37;\\n } else {\\n return false;\\n }\\n continue;\\n } else {\\n // encountered a non-whitelisted opcode!\\n return false;\\n }\\n }\\n _pc++;\\n } while (_pc < codeLength);\\n return true;\\n }\\n}\\n\",\"keccak256\":\"0x44cd4fcdcb25a233fa98da5ba66706ce2f9fbf13359cf7f2891793739687a86f\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/execution/iOVM_SafetyChecker.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title iOVM_SafetyChecker\\n */\\ninterface iOVM_SafetyChecker {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function isBytecodeSafe(bytes calldata _bytecode) external pure returns (bool);\\n}\\n\",\"keccak256\":\"0xde6639676d4ec4f77297652d5ede2429bc93e74e11fefd9e9de4bc92dd784878\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x608060405234801561001057600080fd5b50610373806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063a44eb59a14610030575b600080fd5b6100d66004803603602081101561004657600080fd5b81019060208101813564010000000081111561006157600080fd5b82018360208201111561007357600080fd5b8035906020019184600183028401116401000000008311171561009557600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506100ea945050505050565b604080519115158252519081900360200190f35b60408051610100810182527e0101010101010101010101000000000101010101010101010101010101000081526b010101010101000000010100600160f81b016020808301919091526f0101010100000001010101010000000092820192909252630203040560e01b60608201527f0101010101010101010101010101010101010101010101010101010101010101608082015264010101010160d81b60a0820152600060c0820181905260e0820181905283519092741fffffffff000000000f8f000063f000013fff0ffe916a40000000000000000000026117ff60f31b039163ffffffff60601b1991870181019087015b8051600081811a880151811a82811a890151821a0182811a890151821a0182811a890151821a0182811a890151821a0182811a89015190911a01918201911a6001811b86811661032057808516610239575001605d1901610326565b80861661027e575b8280600101935050825160001a915081605b141561025e57610279565b6001821b851661027157918101605e1901915b838310610241575b610320565b816033141561030f578251602084015160d81c673350600060045af160c083901c14156102b057600885019450610306565b817f336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a0157601480156102e357508064016000f35b145b156102f357602585019450610306565b60009a5050505050505050505050610338565b50505050610326565b600098505050505050505050610338565b50506001015b8181106101dd57600196505050505050505b91905056fea26469706673582212209a836b268dcf58167a9f65bb872e3ddb5bd93b231f6b456f1c5e6d75b92a746364736f6c63430007060033", + "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061002b5760003560e01c8063a44eb59a14610030575b600080fd5b6100d66004803603602081101561004657600080fd5b81019060208101813564010000000081111561006157600080fd5b82018360208201111561007357600080fd5b8035906020019184600183028401116401000000008311171561009557600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506100ea945050505050565b604080519115158252519081900360200190f35b60408051610100810182527e0101010101010101010101000000000101010101010101010101010101000081526b010101010101000000010100600160f81b016020808301919091526f0101010100000001010101010000000092820192909252630203040560e01b60608201527f0101010101010101010101010101010101010101010101010101010101010101608082015264010101010160d81b60a0820152600060c0820181905260e0820181905283519092741fffffffff000000000f8f000063f000013fff0ffe916a40000000000000000000026117ff60f31b039163ffffffff60601b1991870181019087015b8051600081811a880151811a82811a890151821a0182811a890151821a0182811a890151821a0182811a890151821a0182811a89015190911a01918201911a6001811b86811661032057808516610239575001605d1901610326565b80861661027e575b8280600101935050825160001a915081605b141561025e57610279565b6001821b851661027157918101605e1901915b838310610241575b610320565b816033141561030f578251602084015160d81c673350600060045af160c083901c14156102b057600885019450610306565b817f336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a0157601480156102e357508064016000f35b145b156102f357602585019450610306565b60009a5050505050505050505050610338565b50505050610326565b600098505050505050505050610338565b50506001015b8181106101dd57600196505050505050505b91905056fea26469706673582212209a836b268dcf58167a9f65bb872e3ddb5bd93b231f6b456f1c5e6d75b92a746364736f6c63430007060033", "devdoc": { - "details": "The Safety Checker verifies that contracts deployed on L2 do not contain any \"unsafe\" operations. An operation is considered unsafe if it would access state variables which are specific to the environment (ie. L1 or L2) in which it is executed, as this could be used to \"escape the sandbox\" of the OVM, resulting in non-deterministic fraud proofs. That is, an attacker would be able to \"prove fraud\" on an honestly applied transaction. Note that a \"safe\" contract requires opcodes to appear in a particular pattern; omission of \"unsafe\" opcodes is necessary, but not sufficient. Compiler used: solc Runtime target: EVM", + "details": "The Safety Checker verifies that contracts deployed on L2 do not contain any \"unsafe\" operations. An operation is considered unsafe if it would access state variables which are specific to the environment (ie. L1 or L2) in which it is executed, as this could be used to \"escape the sandbox\" of the OVM, resulting in non-deterministic fraud proofs. That is, an attacker would be able to \"prove fraud\" on an honestly applied transaction. Note that a \"safe\" contract requires opcodes to appear in a particular pattern; omission of \"unsafe\" opcodes is necessary, but not sufficient. Compiler used: solc Runtime target: EVM", "kind": "dev", "methods": { "isBytecodeSafe(bytes)": { diff --git a/packages/contracts/deployments/kovan/OVM_StateCommitmentChain.json b/packages/contracts/deployments/kovan/OVM_StateCommitmentChain.json index c3d0b366d1b9c..1e34677174753 100644 --- a/packages/contracts/deployments/kovan/OVM_StateCommitmentChain.json +++ b/packages/contracts/deployments/kovan/OVM_StateCommitmentChain.json @@ -1,5 +1,5 @@ { - "address": "0x41f707A213FB83010586860f81A4BF2F0FEbe56D", + "address": "0xdB1367bB36C34618778D492725C3eD11B508aC54", "abi": [ { "inputs": [ @@ -285,7 +285,7 @@ "outputs": [ { "internalType": "address", - "name": "_contract", + "name": "", "type": "address" } ], @@ -361,31 +361,31 @@ "type": "function" } ], - "transactionHash": "0x2553660fec6e10c863aed1953b6042121eb1535ff2c4b6012f79fb47e8ea1f4d", + "transactionHash": "0x8c4c4052dc351f960e93b01fdd1e39be3b8dab99459b1be05254609d70df6c9f", "receipt": { "to": null, "from": "0x18394B52d3Cb931dfA76F63251919D051953413d", - "contractAddress": "0x41f707A213FB83010586860f81A4BF2F0FEbe56D", - "transactionIndex": 4, - "gasUsed": "1615783", + "contractAddress": "0xdB1367bB36C34618778D492725C3eD11B508aC54", + "transactionIndex": 1, + "gasUsed": "1624653", "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0xc22bea0a9c75453250ad60c75ba6a178412ff52ecf0287e9c92bdaa03efe8222", - "transactionHash": "0x2553660fec6e10c863aed1953b6042121eb1535ff2c4b6012f79fb47e8ea1f4d", + "blockHash": "0x82d155659e443e841339b8422848b42afa81a4fcb8e285c6e423b3e266ee431b", + "transactionHash": "0x8c4c4052dc351f960e93b01fdd1e39be3b8dab99459b1be05254609d70df6c9f", "logs": [], - "blockNumber": 24199487, - "cumulativeGasUsed": "2240543", + "blockNumber": 24572817, + "cumulativeGasUsed": "1667041", "status": 1, "byzantium": true }, "args": [ - "0xFaf27b24ba54C6910C12CFF5C9453C0e8D634e05", + "0xd56F695e73286ac252A37593DD4E7c14270eC1Df", 60, - 315360000 + 15769999 ], - "solcInputHash": "03aed03b958b1d37f90bd88d0f56dd85", - "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_fraudProofWindow\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_sequencerPublishWindow\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_batchIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"_batchRoot\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_batchSize\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_prevTotalElements\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"_extraData\",\"type\":\"bytes\"}],\"name\":\"StateBatchAppended\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_batchIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"_batchRoot\",\"type\":\"bytes32\"}],\"name\":\"StateBatchDeleted\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"FRAUD_PROOF_WINDOW\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"SEQUENCER_PUBLISH_WINDOW\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"_batch\",\"type\":\"bytes32[]\"},{\"internalType\":\"uint256\",\"name\":\"_shouldStartAtElement\",\"type\":\"uint256\"}],\"name\":\"appendStateBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"batches\",\"outputs\":[{\"internalType\":\"contract iOVM_ChainStorageContainer\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"_batchHeader\",\"type\":\"tuple\"}],\"name\":\"deleteStateBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLastSequencerTimestamp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_lastSequencerTimestamp\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTotalBatches\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_totalBatches\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTotalElements\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_totalElements\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"_batchHeader\",\"type\":\"tuple\"}],\"name\":\"insideFraudProofWindow\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"_inside\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"_contract\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_element\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"_batchHeader\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"siblings\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct Lib_OVMCodec.ChainInclusionProof\",\"name\":\"_proof\",\"type\":\"tuple\"}],\"name\":\"verifyStateCommitment\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The State Commitment Chain (SCC) contract contains a list of proposed state roots which Proposers assert to be a result of each transaction in the Canonical Transaction Chain (CTC). Elements here have a 1:1 correspondence with transactions in the CTC, and should be the unique state root calculated off-chain by applying the canonical transactions one by one. Compiler used: solc Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"appendStateBatch(bytes32[],uint256)\":{\"params\":{\"_batch\":\"Batch of state roots.\",\"_shouldStartAtElement\":\"Index of the element at which this batch should start.\"}},\"batches()\":{\"returns\":{\"_0\":\"Reference to the batch storage container.\"}},\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\"}},\"deleteStateBatch((uint256,bytes32,uint256,uint256,bytes))\":{\"params\":{\"_batchHeader\":\"Header of the batch to start deleting from.\"}},\"getLastSequencerTimestamp()\":{\"returns\":{\"_lastSequencerTimestamp\":\"Last sequencer batch timestamp.\"}},\"getTotalBatches()\":{\"returns\":{\"_totalBatches\":\"Total submitted batches.\"}},\"getTotalElements()\":{\"returns\":{\"_totalElements\":\"Total submitted elements.\"}},\"insideFraudProofWindow((uint256,bytes32,uint256,uint256,bytes))\":{\"params\":{\"_batchHeader\":\"Header of the batch to check.\"},\"returns\":{\"_inside\":\"Whether or not the batch is inside the fraud proof window.\"}},\"verifyStateCommitment(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))\":{\"params\":{\"_batchHeader\":\"Header of the batch in which the element was included.\",\"_element\":\"Hash of the element to verify a proof for.\",\"_proof\":\"Merkle inclusion proof for the element.\"}}},\"title\":\"OVM_StateCommitmentChain\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"appendStateBatch(bytes32[],uint256)\":{\"notice\":\"Appends a batch of state roots to the chain.\"},\"batches()\":{\"notice\":\"Accesses the batch storage container.\"},\"deleteStateBatch((uint256,bytes32,uint256,uint256,bytes))\":{\"notice\":\"Deletes all state roots after (and including) a given batch.\"},\"getLastSequencerTimestamp()\":{\"notice\":\"Retrieves the timestamp of the last batch submitted by the sequencer.\"},\"getTotalBatches()\":{\"notice\":\"Retrieves the total number of batches submitted.\"},\"getTotalElements()\":{\"notice\":\"Retrieves the total number of elements submitted.\"},\"insideFraudProofWindow((uint256,bytes32,uint256,uint256,bytes))\":{\"notice\":\"Checks whether a given batch is still inside its fraud proof window.\"},\"verifyStateCommitment(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))\":{\"notice\":\"Verifies a batch inclusion proof.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/OVM/chain/OVM_StateCommitmentChain.sol\":\"OVM_StateCommitmentChain\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/math/SafeMath.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\n * checks.\\n *\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\n * in bugs, because programmers usually assume that an overflow raises an\\n * error, which is the standard behavior in high level programming languages.\\n * `SafeMath` restores this intuition by reverting the transaction when an\\n * operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n */\\nlibrary SafeMath {\\n /**\\n * @dev Returns the addition of two unsigned integers, with an overflow flag.\\n *\\n * _Available since v3.4._\\n */\\n function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n uint256 c = a + b;\\n if (c < a) return (false, 0);\\n return (true, c);\\n }\\n\\n /**\\n * @dev Returns the substraction of two unsigned integers, with an overflow flag.\\n *\\n * _Available since v3.4._\\n */\\n function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n if (b > a) return (false, 0);\\n return (true, a - b);\\n }\\n\\n /**\\n * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\\n *\\n * _Available since v3.4._\\n */\\n function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\n // benefit is lost if 'b' is also tested.\\n // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\n if (a == 0) return (true, 0);\\n uint256 c = a * b;\\n if (c / a != b) return (false, 0);\\n return (true, c);\\n }\\n\\n /**\\n * @dev Returns the division of two unsigned integers, with a division by zero flag.\\n *\\n * _Available since v3.4._\\n */\\n function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n if (b == 0) return (false, 0);\\n return (true, a / b);\\n }\\n\\n /**\\n * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\\n *\\n * _Available since v3.4._\\n */\\n function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n if (b == 0) return (false, 0);\\n return (true, a % b);\\n }\\n\\n /**\\n * @dev Returns the addition of two unsigned integers, reverting on\\n * overflow.\\n *\\n * Counterpart to Solidity's `+` operator.\\n *\\n * Requirements:\\n *\\n * - Addition cannot overflow.\\n */\\n function add(uint256 a, uint256 b) internal pure returns (uint256) {\\n uint256 c = a + b;\\n require(c >= a, \\\"SafeMath: addition overflow\\\");\\n return c;\\n }\\n\\n /**\\n * @dev Returns the subtraction of two unsigned integers, reverting on\\n * overflow (when the result is negative).\\n *\\n * Counterpart to Solidity's `-` operator.\\n *\\n * Requirements:\\n *\\n * - Subtraction cannot overflow.\\n */\\n function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\n require(b <= a, \\\"SafeMath: subtraction overflow\\\");\\n return a - b;\\n }\\n\\n /**\\n * @dev Returns the multiplication of two unsigned integers, reverting on\\n * overflow.\\n *\\n * Counterpart to Solidity's `*` operator.\\n *\\n * Requirements:\\n *\\n * - Multiplication cannot overflow.\\n */\\n function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\n if (a == 0) return 0;\\n uint256 c = a * b;\\n require(c / a == b, \\\"SafeMath: multiplication overflow\\\");\\n return c;\\n }\\n\\n /**\\n * @dev Returns the integer division of two unsigned integers, reverting on\\n * division by zero. The result is rounded towards zero.\\n *\\n * Counterpart to Solidity's `/` operator. Note: this function uses a\\n * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n * uses an invalid opcode to revert (consuming all remaining gas).\\n *\\n * Requirements:\\n *\\n * - The divisor cannot be zero.\\n */\\n function div(uint256 a, uint256 b) internal pure returns (uint256) {\\n require(b > 0, \\\"SafeMath: division by zero\\\");\\n return a / b;\\n }\\n\\n /**\\n * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n * reverting when dividing by zero.\\n *\\n * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n * opcode (which leaves remaining gas untouched) while Solidity uses an\\n * invalid opcode to revert (consuming all remaining gas).\\n *\\n * Requirements:\\n *\\n * - The divisor cannot be zero.\\n */\\n function mod(uint256 a, uint256 b) internal pure returns (uint256) {\\n require(b > 0, \\\"SafeMath: modulo by zero\\\");\\n return a % b;\\n }\\n\\n /**\\n * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\n * overflow (when the result is negative).\\n *\\n * CAUTION: This function is deprecated because it requires allocating memory for the error\\n * message unnecessarily. For custom revert reasons use {trySub}.\\n *\\n * Counterpart to Solidity's `-` operator.\\n *\\n * Requirements:\\n *\\n * - Subtraction cannot overflow.\\n */\\n function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n require(b <= a, errorMessage);\\n return a - b;\\n }\\n\\n /**\\n * @dev Returns the integer division of two unsigned integers, reverting with custom message on\\n * division by zero. The result is rounded towards zero.\\n *\\n * CAUTION: This function is deprecated because it requires allocating memory for the error\\n * message unnecessarily. For custom revert reasons use {tryDiv}.\\n *\\n * Counterpart to Solidity's `/` operator. Note: this function uses a\\n * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n * uses an invalid opcode to revert (consuming all remaining gas).\\n *\\n * Requirements:\\n *\\n * - The divisor cannot be zero.\\n */\\n function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n require(b > 0, errorMessage);\\n return a / b;\\n }\\n\\n /**\\n * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n * reverting with custom message when dividing by zero.\\n *\\n * CAUTION: This function is deprecated because it requires allocating memory for the error\\n * message unnecessarily. For custom revert reasons use {tryMod}.\\n *\\n * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n * opcode (which leaves remaining gas untouched) while Solidity uses an\\n * invalid opcode to revert (consuming all remaining gas).\\n *\\n * Requirements:\\n *\\n * - The divisor cannot be zero.\\n */\\n function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n require(b > 0, errorMessage);\\n return a % b;\\n }\\n}\\n\",\"keccak256\":\"0xcc78a17dd88fa5a2edc60c8489e2f405c0913b377216a5b26b35656b2d0dab52\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/chain/OVM_StateCommitmentChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\nimport { Lib_MerkleTree } from \\\"../../libraries/utils/Lib_MerkleTree.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_FraudVerifier } from \\\"../../iOVM/verification/iOVM_FraudVerifier.sol\\\";\\nimport { iOVM_StateCommitmentChain } from \\\"../../iOVM/chain/iOVM_StateCommitmentChain.sol\\\";\\nimport { iOVM_CanonicalTransactionChain } from \\\"../../iOVM/chain/iOVM_CanonicalTransactionChain.sol\\\";\\nimport { iOVM_BondManager } from \\\"../../iOVM/verification/iOVM_BondManager.sol\\\";\\nimport { iOVM_ChainStorageContainer } from \\\"../../iOVM/chain/iOVM_ChainStorageContainer.sol\\\";\\n\\n/* External Imports */\\nimport '@openzeppelin/contracts/math/SafeMath.sol';\\n\\n/**\\n * @title OVM_StateCommitmentChain\\n * @dev The State Commitment Chain (SCC) contract contains a list of proposed state roots which\\n * Proposers assert to be a result of each transaction in the Canonical Transaction Chain (CTC).\\n * Elements here have a 1:1 correspondence with transactions in the CTC, and should be the unique\\n * state root calculated off-chain by applying the canonical transactions one by one.\\n *\\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract OVM_StateCommitmentChain is iOVM_StateCommitmentChain, Lib_AddressResolver {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 public FRAUD_PROOF_WINDOW;\\n uint256 public SEQUENCER_PUBLISH_WINDOW;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n */\\n constructor(\\n address _libAddressManager,\\n uint256 _fraudProofWindow,\\n uint256 _sequencerPublishWindow\\n )\\n Lib_AddressResolver(_libAddressManager)\\n {\\n FRAUD_PROOF_WINDOW = _fraudProofWindow;\\n SEQUENCER_PUBLISH_WINDOW = _sequencerPublishWindow;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Accesses the batch storage container.\\n * @return Reference to the batch storage container.\\n */\\n function batches()\\n public\\n view\\n returns (\\n iOVM_ChainStorageContainer\\n )\\n {\\n return iOVM_ChainStorageContainer(\\n resolve(\\\"OVM_ChainStorageContainer:SCC:batches\\\")\\n );\\n }\\n\\n /**\\n * @inheritdoc iOVM_StateCommitmentChain\\n */\\n function getTotalElements()\\n override\\n public\\n view\\n returns (\\n uint256 _totalElements\\n )\\n {\\n (uint40 totalElements, ) = _getBatchExtraData();\\n return uint256(totalElements);\\n }\\n\\n /**\\n * @inheritdoc iOVM_StateCommitmentChain\\n */\\n function getTotalBatches()\\n override\\n public\\n view\\n returns (\\n uint256 _totalBatches\\n )\\n {\\n return batches().length();\\n }\\n\\n /**\\n * @inheritdoc iOVM_StateCommitmentChain\\n */\\n function getLastSequencerTimestamp()\\n override\\n public\\n view\\n returns (\\n uint256 _lastSequencerTimestamp\\n )\\n {\\n (, uint40 lastSequencerTimestamp) = _getBatchExtraData();\\n return uint256(lastSequencerTimestamp);\\n }\\n\\n /**\\n * @inheritdoc iOVM_StateCommitmentChain\\n */\\n function appendStateBatch(\\n bytes32[] memory _batch,\\n uint256 _shouldStartAtElement\\n )\\n override\\n public\\n {\\n // Fail fast in to make sure our batch roots aren't accidentally made fraudulent by the\\n // publication of batches by some other user.\\n require(\\n _shouldStartAtElement == getTotalElements(),\\n \\\"Actual batch start index does not match expected start index.\\\"\\n );\\n\\n // Proposers must have previously staked at the BondManager\\n require(\\n iOVM_BondManager(resolve(\\\"OVM_BondManager\\\")).isCollateralized(msg.sender),\\n \\\"Proposer does not have enough collateral posted\\\"\\n );\\n\\n require(\\n _batch.length > 0,\\n \\\"Cannot submit an empty state batch.\\\"\\n );\\n\\n require(\\n getTotalElements() + _batch.length <= iOVM_CanonicalTransactionChain(resolve(\\\"OVM_CanonicalTransactionChain\\\")).getTotalElements(),\\n \\\"Number of state roots cannot exceed the number of canonical transactions.\\\"\\n );\\n\\n // Pass the block's timestamp and the publisher of the data\\n // to be used in the fraud proofs\\n _appendBatch(\\n _batch,\\n abi.encode(block.timestamp, msg.sender)\\n );\\n }\\n\\n /**\\n * @inheritdoc iOVM_StateCommitmentChain\\n */\\n function deleteStateBatch(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n override\\n public\\n {\\n require(\\n msg.sender == resolve(\\\"OVM_FraudVerifier\\\"),\\n \\\"State batches can only be deleted by the OVM_FraudVerifier.\\\"\\n );\\n\\n require(\\n _isValidBatchHeader(_batchHeader),\\n \\\"Invalid batch header.\\\"\\n );\\n\\n require(\\n insideFraudProofWindow(_batchHeader),\\n \\\"State batches can only be deleted within the fraud proof window.\\\"\\n );\\n\\n _deleteBatch(_batchHeader);\\n }\\n\\n /**\\n * @inheritdoc iOVM_StateCommitmentChain\\n */\\n function verifyStateCommitment(\\n bytes32 _element,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _proof\\n )\\n override\\n public\\n view\\n returns (\\n bool\\n )\\n {\\n require(\\n _isValidBatchHeader(_batchHeader),\\n \\\"Invalid batch header.\\\"\\n );\\n\\n require(\\n Lib_MerkleTree.verify(\\n _batchHeader.batchRoot,\\n _element,\\n _proof.index,\\n _proof.siblings,\\n _batchHeader.batchSize\\n ),\\n \\\"Invalid inclusion proof.\\\"\\n );\\n\\n return true;\\n }\\n\\n /**\\n * @inheritdoc iOVM_StateCommitmentChain\\n */\\n function insideFraudProofWindow(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n override\\n public\\n view\\n returns (\\n bool _inside\\n )\\n {\\n (uint256 timestamp,) = abi.decode(\\n _batchHeader.extraData,\\n (uint256, address)\\n );\\n\\n require(\\n timestamp != 0,\\n \\\"Batch header timestamp cannot be zero\\\"\\n );\\n return SafeMath.add(timestamp, FRAUD_PROOF_WINDOW) > block.timestamp;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Parses the batch context from the extra data.\\n * @return Total number of elements submitted.\\n * @return Timestamp of the last batch submitted by the sequencer.\\n */\\n function _getBatchExtraData()\\n internal\\n view\\n returns (\\n uint40,\\n uint40\\n )\\n {\\n bytes27 extraData = batches().getGlobalMetadata();\\n\\n uint40 totalElements;\\n uint40 lastSequencerTimestamp;\\n assembly {\\n extraData := shr(40, extraData)\\n totalElements := and(extraData, 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF)\\n lastSequencerTimestamp := shr(40, and(extraData, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000))\\n }\\n\\n return (\\n totalElements,\\n lastSequencerTimestamp\\n );\\n }\\n\\n /**\\n * Encodes the batch context for the extra data.\\n * @param _totalElements Total number of elements submitted.\\n * @param _lastSequencerTimestamp Timestamp of the last batch submitted by the sequencer.\\n * @return Encoded batch context.\\n */\\n function _makeBatchExtraData(\\n uint40 _totalElements,\\n uint40 _lastSequencerTimestamp\\n )\\n internal\\n pure\\n returns (\\n bytes27\\n )\\n {\\n bytes27 extraData;\\n assembly {\\n extraData := _totalElements\\n extraData := or(extraData, shl(40, _lastSequencerTimestamp))\\n extraData := shl(40, extraData)\\n }\\n\\n return extraData;\\n }\\n\\n /**\\n * Appends a batch to the chain.\\n * @param _batch Elements within the batch.\\n * @param _extraData Any extra data to append to the batch.\\n */\\n function _appendBatch(\\n bytes32[] memory _batch,\\n bytes memory _extraData\\n )\\n internal\\n {\\n address sequencer = resolve(\\\"OVM_Proposer\\\");\\n (uint40 totalElements, uint40 lastSequencerTimestamp) = _getBatchExtraData();\\n\\n if (msg.sender == sequencer) {\\n lastSequencerTimestamp = uint40(block.timestamp);\\n } else {\\n // We keep track of the last batch submitted by the sequencer so there's a window in\\n // which only the sequencer can publish state roots. A window like this just reduces\\n // the chance of \\\"system breaking\\\" state roots being published while we're still in\\n // testing mode. This window should be removed or significantly reduced in the future.\\n require(\\n lastSequencerTimestamp + SEQUENCER_PUBLISH_WINDOW < block.timestamp,\\n \\\"Cannot publish state roots within the sequencer publication window.\\\"\\n );\\n }\\n\\n // For efficiency reasons getMerkleRoot modifies the `_batch` argument in place\\n // while calculating the root hash therefore any arguments passed to it must not\\n // be used again afterwards\\n Lib_OVMCodec.ChainBatchHeader memory batchHeader = Lib_OVMCodec.ChainBatchHeader({\\n batchIndex: getTotalBatches(),\\n batchRoot: Lib_MerkleTree.getMerkleRoot(_batch),\\n batchSize: _batch.length,\\n prevTotalElements: totalElements,\\n extraData: _extraData\\n });\\n\\n emit StateBatchAppended(\\n batchHeader.batchIndex,\\n batchHeader.batchRoot,\\n batchHeader.batchSize,\\n batchHeader.prevTotalElements,\\n batchHeader.extraData\\n );\\n\\n batches().push(\\n Lib_OVMCodec.hashBatchHeader(batchHeader),\\n _makeBatchExtraData(\\n uint40(batchHeader.prevTotalElements + batchHeader.batchSize),\\n lastSequencerTimestamp\\n )\\n );\\n }\\n\\n /**\\n * Removes a batch and all subsequent batches from the chain.\\n * @param _batchHeader Header of the batch to remove.\\n */\\n function _deleteBatch(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n internal\\n {\\n require(\\n _batchHeader.batchIndex < batches().length(),\\n \\\"Invalid batch index.\\\"\\n );\\n\\n require(\\n _isValidBatchHeader(_batchHeader),\\n \\\"Invalid batch header.\\\"\\n );\\n\\n batches().deleteElementsAfterInclusive(\\n _batchHeader.batchIndex,\\n _makeBatchExtraData(\\n uint40(_batchHeader.prevTotalElements),\\n 0\\n )\\n );\\n\\n emit StateBatchDeleted(\\n _batchHeader.batchIndex,\\n _batchHeader.batchRoot\\n );\\n }\\n\\n /**\\n * Checks that a batch header matches the stored hash for the given index.\\n * @param _batchHeader Batch header to validate.\\n * @return Whether or not the header matches the stored one.\\n */\\n function _isValidBatchHeader(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n internal\\n view\\n returns (\\n bool\\n )\\n {\\n return Lib_OVMCodec.hashBatchHeader(_batchHeader) == batches().get(_batchHeader.batchIndex);\\n }\\n}\\n\",\"keccak256\":\"0x5b72c845f856a06c978880d3cb2db40dafebaebf399df100c6ac832eaf41d7bd\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_CanonicalTransactionChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_ChainStorageContainer } from \\\"./iOVM_ChainStorageContainer.sol\\\";\\n\\n/**\\n * @title iOVM_CanonicalTransactionChain\\n */\\ninterface iOVM_CanonicalTransactionChain {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event TransactionEnqueued(\\n address _l1TxOrigin,\\n address _target,\\n uint256 _gasLimit,\\n bytes _data,\\n uint256 _queueIndex,\\n uint256 _timestamp\\n );\\n\\n event QueueBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event SequencerBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event TransactionBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct BatchContext {\\n uint256 numSequencedTransactions;\\n uint256 numSubsequentQueueTransactions;\\n uint256 timestamp;\\n uint256 blockNumber;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n\\n /**\\n * Accesses the batch storage container.\\n * @return Reference to the batch storage container.\\n */\\n function batches()\\n external\\n view\\n returns (\\n iOVM_ChainStorageContainer\\n );\\n\\n /**\\n * Accesses the queue storage container.\\n * @return Reference to the queue storage container.\\n */\\n function queue()\\n external\\n view\\n returns (\\n iOVM_ChainStorageContainer\\n );\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements()\\n external\\n view\\n returns (\\n uint256 _totalElements\\n );\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches()\\n external\\n view\\n returns (\\n uint256 _totalBatches\\n );\\n\\n /**\\n * Returns the index of the next element to be enqueued.\\n * @return Index for the next queue element.\\n */\\n function getNextQueueIndex()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Gets the queue element at a particular index.\\n * @param _index Index of the queue element to access.\\n * @return _element Queue element at the given index.\\n */\\n function getQueueElement(\\n uint256 _index\\n )\\n external\\n view\\n returns (\\n Lib_OVMCodec.QueueElement memory _element\\n );\\n\\n /**\\n * Returns the timestamp of the last transaction.\\n * @return Timestamp for the last transaction.\\n */\\n function getLastTimestamp()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Returns the blocknumber of the last transaction.\\n * @return Blocknumber for the last transaction.\\n */\\n function getLastBlockNumber()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Get the number of queue elements which have not yet been included.\\n * @return Number of pending queue elements.\\n */\\n function getNumPendingQueueElements()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Retrieves the length of the queue, including\\n * both pending and canonical transactions.\\n * @return Length of the queue.\\n */\\n function getQueueLength()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n\\n /**\\n * Adds a transaction to the queue.\\n * @param _target Target contract to send the transaction to.\\n * @param _gasLimit Gas limit for the given transaction.\\n * @param _data Transaction data.\\n */\\n function enqueue(\\n address _target,\\n uint256 _gasLimit,\\n bytes memory _data\\n )\\n external;\\n\\n /**\\n * Appends a given number of queued transactions as a single batch.\\n * @param _numQueuedTransactions Number of transactions to append.\\n */\\n function appendQueueBatch(\\n uint256 _numQueuedTransactions\\n )\\n external;\\n\\n /**\\n * Allows the sequencer to append a batch of transactions.\\n * @dev This function uses a custom encoding scheme for efficiency reasons.\\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\\n * .param _contexts Array of batch contexts.\\n * .param _transactionDataFields Array of raw transaction data.\\n */\\n function appendSequencerBatch(\\n // uint40 _shouldStartAtElement,\\n // uint24 _totalElementsToAppend,\\n // BatchContext[] _contexts,\\n // bytes[] _transactionDataFields\\n )\\n external;\\n\\n /**\\n * Verifies whether a transaction is included in the chain.\\n * @param _transaction Transaction to verify.\\n * @param _txChainElement Transaction chain element corresponding to the transaction.\\n * @param _batchHeader Header of the batch the transaction was included in.\\n * @param _inclusionProof Inclusion proof for the provided transaction chain element.\\n * @return True if the transaction exists in the CTC, false if not.\\n */\\n function verifyTransaction(\\n Lib_OVMCodec.Transaction memory _transaction,\\n Lib_OVMCodec.TransactionChainElement memory _txChainElement,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _inclusionProof\\n )\\n external\\n view\\n returns (\\n bool\\n );\\n}\\n\",\"keccak256\":\"0xb5e55488a1982841c07cdf5ff475da4789596f111dd48f01b1918ee4c775cf3a\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_ChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title iOVM_ChainStorageContainer\\n */\\ninterface iOVM_ChainStorageContainer {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata()\\n external\\n view\\n returns (\\n bytes27\\n );\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length()\\n external\\n view\\n returns (\\n uint256\\n );\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(\\n bytes32 _object\\n )\\n external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(\\n bytes32 _object,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(\\n uint256 _index\\n )\\n external\\n view\\n returns (\\n bytes32\\n );\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index\\n )\\n external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Marks an index as overwritable, meaing the underlying buffer can start to write values over\\n * any objects before and including the given index.\\n */\\n function setNextOverwritableIndex(\\n uint256 _index\\n )\\n external;\\n}\\n\",\"keccak256\":\"0x2d7973a0ad84c23ec62624d3f1e3aeb198cc72686ff1e6cfa17155556b320c94\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_StateCommitmentChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title iOVM_StateCommitmentChain\\n */\\ninterface iOVM_StateCommitmentChain {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event StateBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n event StateBatchDeleted(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot\\n );\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements()\\n external\\n view\\n returns (\\n uint256 _totalElements\\n );\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches()\\n external\\n view\\n returns (\\n uint256 _totalBatches\\n );\\n\\n /**\\n * Retrieves the timestamp of the last batch submitted by the sequencer.\\n * @return _lastSequencerTimestamp Last sequencer batch timestamp.\\n */\\n function getLastSequencerTimestamp()\\n external\\n view\\n returns (\\n uint256 _lastSequencerTimestamp\\n );\\n\\n /**\\n * Appends a batch of state roots to the chain.\\n * @param _batch Batch of state roots.\\n * @param _shouldStartAtElement Index of the element at which this batch should start.\\n */\\n function appendStateBatch(\\n bytes32[] calldata _batch,\\n uint256 _shouldStartAtElement\\n )\\n external;\\n\\n /**\\n * Deletes all state roots after (and including) a given batch.\\n * @param _batchHeader Header of the batch to start deleting from.\\n */\\n function deleteStateBatch(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n external;\\n\\n /**\\n * Verifies a batch inclusion proof.\\n * @param _element Hash of the element to verify a proof for.\\n * @param _batchHeader Header of the batch in which the element was included.\\n * @param _proof Merkle inclusion proof for the element.\\n */\\n function verifyStateCommitment(\\n bytes32 _element,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _proof\\n )\\n external\\n view\\n returns (\\n bool _verified\\n );\\n\\n /**\\n * Checks whether a given batch is still inside its fraud proof window.\\n * @param _batchHeader Header of the batch to check.\\n * @return _inside Whether or not the batch is inside the fraud proof window.\\n */\\n function insideFraudProofWindow(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n external\\n view\\n returns (\\n bool _inside\\n );\\n}\\n\",\"keccak256\":\"0x6646d6ff392b81aab52a7a277e91540819464751de0af5afd1962094b2e92448\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/verification/iOVM_BondManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\ninterface ERC20 {\\n function transfer(address, uint256) external returns (bool);\\n function transferFrom(address, address, uint256) external returns (bool);\\n}\\n\\n/// All the errors which may be encountered on the bond manager\\nlibrary Errors {\\n string constant ERC20_ERR = \\\"BondManager: Could not post bond\\\";\\n string constant ALREADY_FINALIZED = \\\"BondManager: Fraud proof for this pre-state root has already been finalized\\\";\\n string constant SLASHED = \\\"BondManager: Cannot finalize withdrawal, you probably got slashed\\\";\\n string constant WRONG_STATE = \\\"BondManager: Wrong bond state for proposer\\\";\\n string constant CANNOT_CLAIM = \\\"BondManager: Cannot claim yet. Dispute must be finalized first\\\";\\n\\n string constant WITHDRAWAL_PENDING = \\\"BondManager: Withdrawal already pending\\\";\\n string constant TOO_EARLY = \\\"BondManager: Too early to finalize your withdrawal\\\";\\n\\n string constant ONLY_TRANSITIONER = \\\"BondManager: Only the transitioner for this pre-state root may call this function\\\";\\n string constant ONLY_FRAUD_VERIFIER = \\\"BondManager: Only the fraud verifier may call this function\\\";\\n string constant ONLY_STATE_COMMITMENT_CHAIN = \\\"BondManager: Only the state commitment chain may call this function\\\";\\n string constant WAIT_FOR_DISPUTES = \\\"BondManager: Wait for other potential disputes\\\";\\n}\\n\\n/**\\n * @title iOVM_BondManager\\n */\\ninterface iOVM_BondManager {\\n\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n /// The lifecycle of a proposer's bond\\n enum State {\\n // Before depositing or after getting slashed, a user is uncollateralized\\n NOT_COLLATERALIZED,\\n // After depositing, a user is collateralized\\n COLLATERALIZED,\\n // After a user has initiated a withdrawal\\n WITHDRAWING\\n }\\n\\n /// A bond posted by a proposer\\n struct Bond {\\n // The user's state\\n State state;\\n // The timestamp at which a proposer issued their withdrawal request\\n uint32 withdrawalTimestamp;\\n // The time when the first disputed was initiated for this bond\\n uint256 firstDisputeAt;\\n // The earliest observed state root for this bond which has had fraud\\n bytes32 earliestDisputedStateRoot;\\n // The state root's timestamp\\n uint256 earliestTimestamp;\\n }\\n\\n // Per pre-state root, store the number of state provisions that were made\\n // and how many of these calls were made by each user. Payouts will then be\\n // claimed by users proportionally for that dispute.\\n struct Rewards {\\n // Flag to check if rewards for a fraud proof are claimable\\n bool canClaim;\\n // Total number of `recordGasSpent` calls made\\n uint256 total;\\n // The gas spent by each user to provide witness data. The sum of all\\n // values inside this map MUST be equal to the value of `total`\\n mapping(address => uint256) gasSpent;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function recordGasSpent(\\n bytes32 _preStateRoot,\\n bytes32 _txHash,\\n address _who,\\n uint256 _gasSpent\\n ) external;\\n\\n function finalize(\\n bytes32 _preStateRoot,\\n address _publisher,\\n uint256 _timestamp\\n ) external;\\n\\n function deposit() external;\\n\\n function startWithdrawal() external;\\n\\n function finalizeWithdrawal() external;\\n\\n function claim(\\n address _who\\n ) external;\\n\\n function isCollateralized(\\n address _who\\n ) external view returns (bool);\\n\\n function getGasSpent(\\n bytes32 _preStateRoot,\\n address _who\\n ) external view returns (uint256);\\n}\\n\",\"keccak256\":\"0x3c2a8a399487857158649db1896749d86e39cba545a8aeb2e2bb0f3bdfa7a5b1\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/verification/iOVM_FraudVerifier.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_StateTransitioner } from \\\"./iOVM_StateTransitioner.sol\\\";\\n\\n/**\\n * @title iOVM_FraudVerifier\\n */\\ninterface iOVM_FraudVerifier {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event FraudProofInitialized(\\n bytes32 _preStateRoot,\\n uint256 _preStateRootIndex,\\n bytes32 _transactionHash,\\n address _who\\n );\\n\\n event FraudProofFinalized(\\n bytes32 _preStateRoot,\\n uint256 _preStateRootIndex,\\n bytes32 _transactionHash,\\n address _who\\n );\\n\\n\\n /***************************************\\n * Public Functions: Transition Status *\\n ***************************************/\\n\\n function getStateTransitioner(bytes32 _preStateRoot, bytes32 _txHash) external view returns (iOVM_StateTransitioner _transitioner);\\n\\n\\n /****************************************\\n * Public Functions: Fraud Verification *\\n ****************************************/\\n\\n function initializeFraudVerification(\\n bytes32 _preStateRoot,\\n Lib_OVMCodec.ChainBatchHeader calldata _preStateRootBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof calldata _preStateRootProof,\\n Lib_OVMCodec.Transaction calldata _transaction,\\n Lib_OVMCodec.TransactionChainElement calldata _txChainElement,\\n Lib_OVMCodec.ChainBatchHeader calldata _transactionBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof calldata _transactionProof\\n ) external;\\n\\n function finalizeFraudVerification(\\n bytes32 _preStateRoot,\\n Lib_OVMCodec.ChainBatchHeader calldata _preStateRootBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof calldata _preStateRootProof,\\n bytes32 _txHash,\\n bytes32 _postStateRoot,\\n Lib_OVMCodec.ChainBatchHeader calldata _postStateRootBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof calldata _postStateRootProof\\n ) external;\\n}\\n\",\"keccak256\":\"0x5efd7bb18164bbd3e9d58379e8203fbf2a7ee802b1a48dff3ceaaec1523b1751\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/verification/iOVM_StateTransitioner.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title iOVM_StateTransitioner\\n */\\ninterface iOVM_StateTransitioner {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AccountCommitted(\\n address _address\\n );\\n\\n event ContractStorageCommitted(\\n address _address,\\n bytes32 _key\\n );\\n\\n\\n /**********************************\\n * Public Functions: State Access *\\n **********************************/\\n\\n function getPreStateRoot() external view returns (bytes32 _preStateRoot);\\n function getPostStateRoot() external view returns (bytes32 _postStateRoot);\\n function isComplete() external view returns (bool _complete);\\n\\n\\n /***********************************\\n * Public Functions: Pre-Execution *\\n ***********************************/\\n\\n function proveContractState(\\n address _ovmContractAddress,\\n address _ethContractAddress,\\n bytes calldata _stateTrieWitness\\n ) external;\\n\\n function proveStorageSlot(\\n address _ovmContractAddress,\\n bytes32 _key,\\n bytes calldata _storageTrieWitness\\n ) external;\\n\\n\\n /*******************************\\n * Public Functions: Execution *\\n *******************************/\\n\\n function applyTransaction(\\n Lib_OVMCodec.Transaction calldata _transaction\\n ) external;\\n\\n\\n /************************************\\n * Public Functions: Post-Execution *\\n ************************************/\\n\\n function commitContractState(\\n address _ovmContractAddress,\\n bytes calldata _stateTrieWitness\\n ) external;\\n\\n function commitStorageSlot(\\n address _ovmContractAddress,\\n bytes32 _key,\\n bytes calldata _storageTrieWitness\\n ) external;\\n\\n\\n /**********************************\\n * Public Functions: Finalization *\\n **********************************/\\n\\n function completeTransition() external;\\n}\\n\",\"keccak256\":\"0x3d044ac0a3bb6ad3d529f904b3191117511f9c379678ca03010e1ebdfcb5c34b\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/codec/Lib_OVMCodec.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../utils/Lib_Bytes32Utils.sol\\\";\\nimport { Lib_SafeExecutionManagerWrapper } from \\\"../../libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\\\";\\n\\n/**\\n * @title Lib_OVMCodec\\n */\\nlibrary Lib_OVMCodec {\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum EOASignatureType {\\n EIP155_TRANSACTION,\\n ETH_SIGNED_MESSAGE\\n }\\n\\n enum QueueOrigin {\\n SEQUENCER_QUEUE,\\n L1TOL2_QUEUE\\n }\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Account {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n address ethAddress;\\n bool isFresh;\\n }\\n\\n struct EVMAccount {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n }\\n\\n struct ChainBatchHeader {\\n uint256 batchIndex;\\n bytes32 batchRoot;\\n uint256 batchSize;\\n uint256 prevTotalElements;\\n bytes extraData;\\n }\\n\\n struct ChainInclusionProof {\\n uint256 index;\\n bytes32[] siblings;\\n }\\n\\n struct Transaction {\\n uint256 timestamp;\\n uint256 blockNumber;\\n QueueOrigin l1QueueOrigin;\\n address l1TxOrigin;\\n address entrypoint;\\n uint256 gasLimit;\\n bytes data;\\n }\\n\\n struct TransactionChainElement {\\n bool isSequenced;\\n uint256 queueIndex; // QUEUED TX ONLY\\n uint256 timestamp; // SEQUENCER TX ONLY\\n uint256 blockNumber; // SEQUENCER TX ONLY\\n bytes txData; // SEQUENCER TX ONLY\\n }\\n\\n struct QueueElement {\\n bytes32 transactionHash;\\n uint40 timestamp;\\n uint40 blockNumber;\\n }\\n\\n struct EIP155Transaction {\\n uint256 nonce;\\n uint256 gasPrice;\\n uint256 gasLimit;\\n address to;\\n uint256 value;\\n bytes data;\\n uint256 chainId;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Decodes an EOA transaction (i.e., native Ethereum RLP encoding).\\n * @param _transaction Encoded EOA transaction.\\n * @return Transaction decoded into a struct.\\n */\\n function decodeEIP155Transaction(\\n bytes memory _transaction,\\n bool _isEthSignedMessage\\n )\\n internal\\n pure\\n returns (\\n EIP155Transaction memory\\n )\\n {\\n if (_isEthSignedMessage) {\\n (\\n uint256 _nonce,\\n uint256 _gasLimit,\\n uint256 _gasPrice,\\n uint256 _chainId,\\n address _to,\\n bytes memory _data\\n ) = abi.decode(\\n _transaction,\\n (uint256, uint256, uint256, uint256, address ,bytes)\\n );\\n return EIP155Transaction({\\n nonce: _nonce,\\n gasPrice: _gasPrice,\\n gasLimit: _gasLimit,\\n to: _to,\\n value: 0,\\n data: _data,\\n chainId: _chainId\\n });\\n } else {\\n Lib_RLPReader.RLPItem[] memory decoded = Lib_RLPReader.readList(_transaction);\\n\\n return EIP155Transaction({\\n nonce: Lib_RLPReader.readUint256(decoded[0]),\\n gasPrice: Lib_RLPReader.readUint256(decoded[1]),\\n gasLimit: Lib_RLPReader.readUint256(decoded[2]),\\n to: Lib_RLPReader.readAddress(decoded[3]),\\n value: Lib_RLPReader.readUint256(decoded[4]),\\n data: Lib_RLPReader.readBytes(decoded[5]),\\n chainId: Lib_RLPReader.readUint256(decoded[6])\\n });\\n }\\n }\\n\\n /**\\n * Decompresses a compressed EIP155 transaction.\\n * @param _transaction Compressed EIP155 transaction bytes.\\n * @return Transaction parsed into a struct.\\n */\\n function decompressEIP155Transaction(\\n bytes memory _transaction\\n )\\n internal\\n returns (\\n EIP155Transaction memory\\n )\\n {\\n return EIP155Transaction({\\n gasLimit: Lib_BytesUtils.toUint24(_transaction, 0),\\n gasPrice: uint256(Lib_BytesUtils.toUint24(_transaction, 3)) * 1000000,\\n nonce: Lib_BytesUtils.toUint24(_transaction, 6),\\n to: Lib_BytesUtils.toAddress(_transaction, 9),\\n data: Lib_BytesUtils.slice(_transaction, 29),\\n chainId: Lib_SafeExecutionManagerWrapper.safeCHAINID(),\\n value: 0\\n });\\n }\\n\\n /**\\n * Encodes an EOA transaction back into the original transaction.\\n * @param _transaction EIP155transaction to encode.\\n * @param _isEthSignedMessage Whether or not this was an eth signed message.\\n * @return Encoded transaction.\\n */\\n function encodeEIP155Transaction(\\n EIP155Transaction memory _transaction,\\n bool _isEthSignedMessage\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n if (_isEthSignedMessage) {\\n return abi.encode(\\n _transaction.nonce,\\n _transaction.gasLimit,\\n _transaction.gasPrice,\\n _transaction.chainId,\\n _transaction.to,\\n _transaction.data\\n );\\n } else {\\n bytes[] memory raw = new bytes[](9);\\n\\n raw[0] = Lib_RLPWriter.writeUint(_transaction.nonce);\\n raw[1] = Lib_RLPWriter.writeUint(_transaction.gasPrice);\\n raw[2] = Lib_RLPWriter.writeUint(_transaction.gasLimit);\\n if (_transaction.to == address(0)) {\\n raw[3] = Lib_RLPWriter.writeBytes('');\\n } else {\\n raw[3] = Lib_RLPWriter.writeAddress(_transaction.to);\\n }\\n raw[4] = Lib_RLPWriter.writeUint(0);\\n raw[5] = Lib_RLPWriter.writeBytes(_transaction.data);\\n raw[6] = Lib_RLPWriter.writeUint(_transaction.chainId);\\n raw[7] = Lib_RLPWriter.writeBytes(bytes(''));\\n raw[8] = Lib_RLPWriter.writeBytes(bytes(''));\\n\\n return Lib_RLPWriter.writeList(raw);\\n }\\n }\\n\\n /**\\n * Encodes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Encoded transaction bytes.\\n */\\n function encodeTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return abi.encodePacked(\\n _transaction.timestamp,\\n _transaction.blockNumber,\\n _transaction.l1QueueOrigin,\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n );\\n }\\n\\n /**\\n * Hashes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Hashed transaction\\n */\\n function hashTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(encodeTransaction(_transaction));\\n }\\n\\n /**\\n * Converts an OVM account to an EVM account.\\n * @param _in OVM account to convert.\\n * @return Converted EVM account.\\n */\\n function toEVMAccount(\\n Account memory _in\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n return EVMAccount({\\n nonce: _in.nonce,\\n balance: _in.balance,\\n storageRoot: _in.storageRoot,\\n codeHash: _in.codeHash\\n });\\n }\\n\\n /**\\n * @notice RLP-encodes an account state struct.\\n * @param _account Account state struct.\\n * @return RLP-encoded account state.\\n */\\n function encodeEVMAccount(\\n EVMAccount memory _account\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes[] memory raw = new bytes[](4);\\n\\n // Unfortunately we can't create this array outright because\\n // Lib_RLPWriter.writeList will reject fixed-size arrays. Assigning\\n // index-by-index circumvents this issue.\\n raw[0] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.nonce)\\n )\\n );\\n raw[1] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.balance)\\n )\\n );\\n raw[2] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.storageRoot));\\n raw[3] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.codeHash));\\n\\n return Lib_RLPWriter.writeList(raw);\\n }\\n\\n /**\\n * @notice Decodes an RLP-encoded account state into a useful struct.\\n * @param _encoded RLP-encoded account state.\\n * @return Account state struct.\\n */\\n function decodeEVMAccount(\\n bytes memory _encoded\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\\n\\n return EVMAccount({\\n nonce: Lib_RLPReader.readUint256(accountState[0]),\\n balance: Lib_RLPReader.readUint256(accountState[1]),\\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\\n });\\n }\\n\\n /**\\n * Calculates a hash for a given batch header.\\n * @param _batchHeader Header to hash.\\n * @return Hash of the header.\\n */\\n function hashBatchHeader(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(\\n abi.encode(\\n _batchHeader.batchRoot,\\n _batchHeader.batchSize,\\n _batchHeader.prevTotalElements,\\n _batchHeader.extraData\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0xe7e518ba7bba3fa28c532f8902576c1bb4dfc1ec4b62bed6da50623248ba17c3\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Contract Imports */\\nimport { Ownable } from \\\"./Lib_Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n /*******************************************\\n * Contract Variables: Internal Accounting *\\n *******************************************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n public\\n onlyOwner\\n {\\n emit AddressSet(_name, _address);\\n addresses[_getNameHash(_name)] = _address;\\n }\\n\\n function getAddress(\\n string memory _name\\n )\\n public\\n view\\n returns (address)\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32 _hash\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0x3a490595cc21ff170e4027843093670ff845d5972481fbfb956b722ea564bb06\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n\\n /*******************************************\\n * Contract Variables: Contract References *\\n *******************************************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(\\n address _libAddressManager\\n ) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function resolve(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address _contract\\n )\\n {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0xaa3ed342f6deb156c660fd83afa579a3b80db17eb465e8949cf5c1b114780143\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Ownable\\n * @dev Adapted from https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol\\n */\\nabstract contract Ownable {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n address public owner;\\n\\n\\n /**********\\n * Events *\\n **********/\\n\\n event OwnershipTransferred(\\n address indexed previousOwner,\\n address indexed newOwner\\n );\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n constructor() {\\n owner = msg.sender;\\n emit OwnershipTransferred(address(0), owner);\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n owner == msg.sender,\\n \\\"Ownable: caller is not the owner\\\"\\n );\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function renounceOwnership()\\n public\\n virtual\\n onlyOwner\\n {\\n emit OwnershipTransferred(owner, address(0));\\n owner = address(0);\\n }\\n\\n function transferOwnership(address _newOwner)\\n public\\n virtual\\n onlyOwner\\n {\\n require(\\n _newOwner != address(0),\\n \\\"Ownable: new owner cannot be the zero address\\\"\\n );\\n\\n emit OwnershipTransferred(owner, _newOwner);\\n owner = _newOwner;\\n }\\n}\\n\",\"keccak256\":\"0xd9dfd9264e5b5fedd53a5b10fdf179c3f367614b0fe69179bce4e45119f5b739\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPReader.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_RLPReader\\n * @dev Adapted from \\\"RLPReader\\\" by Hamdi Allam (hamdi.allam97@gmail.com).\\n */\\nlibrary Lib_RLPReader {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 constant internal MAX_LIST_LENGTH = 32;\\n\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum RLPItemType {\\n DATA_ITEM,\\n LIST_ITEM\\n }\\n\\n \\n /***********\\n * Structs *\\n ***********/\\n\\n struct RLPItem {\\n uint256 length;\\n uint256 ptr;\\n }\\n \\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n \\n /**\\n * Converts bytes to a reference to memory position and length.\\n * @param _in Input bytes to convert.\\n * @return Output memory reference.\\n */\\n function toRLPItem(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem memory\\n )\\n {\\n uint256 ptr;\\n assembly {\\n ptr := add(_in, 32)\\n }\\n\\n return RLPItem({\\n length: _in.length,\\n ptr: ptr\\n });\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n (\\n uint256 listOffset,\\n ,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.LIST_ITEM,\\n \\\"Invalid RLP list value.\\\"\\n );\\n\\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\\n // writing to the length. Since we can't know the number of RLP items without looping over\\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\\n // simply set a reasonable maximum list length and decrease the size before we finish.\\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\\n\\n uint256 itemCount = 0;\\n uint256 offset = listOffset;\\n while (offset < _in.length) {\\n require(\\n itemCount < MAX_LIST_LENGTH,\\n \\\"Provided RLP list exceeds max list length.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n ) = _decodeLength(RLPItem({\\n length: _in.length - offset,\\n ptr: _in.ptr + offset\\n }));\\n\\n out[itemCount] = RLPItem({\\n length: itemLength + itemOffset,\\n ptr: _in.ptr + offset\\n });\\n\\n itemCount += 1;\\n offset += itemOffset + itemLength;\\n }\\n\\n // Decrease the array size to match the actual item count.\\n assembly {\\n mstore(out, itemCount)\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n return readList(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes value.\\\"\\n );\\n\\n return _copy(_in.ptr, itemOffset, itemLength);\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return readBytes(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return string(readBytes(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return readString(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n require(\\n _in.length <= 33,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr + itemOffset;\\n bytes32 out;\\n assembly {\\n out := mload(ptr)\\n\\n // Shift the bytes over to match the item size.\\n if lt(itemLength, 32) {\\n out := div(out, exp(256, sub(32, itemLength)))\\n }\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return readBytes32(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return uint256(readBytes32(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return readUint256(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n require(\\n _in.length == 1,\\n \\\"Invalid RLP boolean value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 out;\\n assembly {\\n out := byte(0, mload(ptr))\\n }\\n\\n require(\\n out == 0 || out == 1,\\n \\\"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\\\"\\n );\\n\\n return out != 0;\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return readBool(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n if (_in.length == 1) {\\n return address(0);\\n }\\n\\n require(\\n _in.length == 21,\\n \\\"Invalid RLP address value.\\\"\\n );\\n\\n return address(readUint256(_in));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return readAddress(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads the raw bytes of an RLP item.\\n * @param _in RLP item to read.\\n * @return Raw RLP bytes.\\n */\\n function readRawBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in);\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Decodes the length of an RLP item.\\n * @param _in RLP item to decode.\\n * @return Offset of the encoded data.\\n * @return Length of the encoded data.\\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\\n */\\n function _decodeLength(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n uint256,\\n uint256,\\n RLPItemType\\n )\\n {\\n require(\\n _in.length > 0,\\n \\\"RLP item cannot be null.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 prefix;\\n assembly {\\n prefix := byte(0, mload(ptr))\\n }\\n\\n if (prefix <= 0x7f) {\\n // Single byte.\\n\\n return (0, 1, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xb7) {\\n // Short string.\\n\\n uint256 strLen = prefix - 0x80;\\n \\n require(\\n _in.length > strLen,\\n \\\"Invalid RLP short string.\\\"\\n );\\n\\n return (1, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xbf) {\\n // Long string.\\n uint256 lenOfStrLen = prefix - 0xb7;\\n\\n require(\\n _in.length > lenOfStrLen,\\n \\\"Invalid RLP long string length.\\\"\\n );\\n\\n uint256 strLen;\\n assembly {\\n // Pick out the string length.\\n strLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfStrLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfStrLen + strLen,\\n \\\"Invalid RLP long string.\\\"\\n );\\n\\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xf7) {\\n // Short list.\\n uint256 listLen = prefix - 0xc0;\\n\\n require(\\n _in.length > listLen,\\n \\\"Invalid RLP short list.\\\"\\n );\\n\\n return (1, listLen, RLPItemType.LIST_ITEM);\\n } else {\\n // Long list.\\n uint256 lenOfListLen = prefix - 0xf7;\\n\\n require(\\n _in.length > lenOfListLen,\\n \\\"Invalid RLP long list length.\\\"\\n );\\n\\n uint256 listLen;\\n assembly {\\n // Pick out the list length.\\n listLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfListLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfListLen + listLen,\\n \\\"Invalid RLP long list.\\\"\\n );\\n\\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\\n }\\n }\\n\\n /**\\n * Copies the bytes from a memory location.\\n * @param _src Pointer to the location to read from.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Copied bytes.\\n */\\n function _copy(\\n uint256 _src,\\n uint256 _offset,\\n uint256 _length\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out = new bytes(_length);\\n if (out.length == 0) {\\n return out;\\n }\\n\\n uint256 src = _src + _offset;\\n uint256 dest;\\n assembly {\\n dest := add(out, 32)\\n }\\n\\n // Copy over as many complete words as we can.\\n for (uint256 i = 0; i < _length / 32; i++) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n\\n src += 32;\\n dest += 32;\\n }\\n\\n // Pick out the remaining bytes.\\n uint256 mask = 256 ** (32 - (_length % 32)) - 1;\\n assembly {\\n mstore(\\n dest,\\n or(\\n and(mload(src), not(mask)),\\n and(mload(dest), mask)\\n )\\n )\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Copies an RLP item into bytes.\\n * @param _in RLP item to copy.\\n * @return Copied bytes.\\n */\\n function _copy(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in.ptr, 0, _in.length);\\n }\\n}\\n\",\"keccak256\":\"0xbdb8fae0ca2483b4cc07607a5070fc25e33c54b4e4462b99e7c0b13aac48a09b\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPWriter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\n\\n/**\\n * @title Lib_RLPWriter\\n * @author Bakaoh (with modifications)\\n */\\nlibrary Lib_RLPWriter {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * RLP encodes a byte string.\\n * @param _in The byte string to encode.\\n * @return _out The RLP encoded string in bytes.\\n */\\n function writeBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n bytes memory encoded;\\n\\n if (_in.length == 1 && uint8(_in[0]) < 128) {\\n encoded = _in;\\n } else {\\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * RLP encodes a list of RLP encoded byte byte strings.\\n * @param _in The list of RLP encoded byte strings.\\n * @return _out The RLP encoded list of items in bytes.\\n */\\n function writeList(\\n bytes[] memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n bytes memory list = _flatten(_in);\\n return abi.encodePacked(_writeLength(list.length, 192), list);\\n }\\n\\n /**\\n * RLP encodes a string.\\n * @param _in The string to encode.\\n * @return _out The RLP encoded string in bytes.\\n */\\n function writeString(\\n string memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(bytes(_in));\\n }\\n\\n /**\\n * RLP encodes an address.\\n * @param _in The address to encode.\\n * @return _out The RLP encoded address in bytes.\\n */\\n function writeAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a uint.\\n * @param _in The uint256 to encode.\\n * @return _out The RLP encoded uint256 in bytes.\\n */\\n function writeUint(\\n uint256 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(_toBinary(_in));\\n }\\n\\n /**\\n * RLP encodes a bool.\\n * @param _in The bool to encode.\\n * @return _out The RLP encoded bool in bytes.\\n */\\n function writeBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n bytes memory encoded = new bytes(1);\\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\\n return encoded;\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\\n * @param _len The length of the string or the payload.\\n * @param _offset 128 if item is string, 192 if item is list.\\n * @return _encoded RLP encoded bytes.\\n */\\n function _writeLength(\\n uint256 _len,\\n uint256 _offset\\n )\\n private\\n pure\\n returns (\\n bytes memory _encoded\\n )\\n {\\n bytes memory encoded;\\n\\n if (_len < 56) {\\n encoded = new bytes(1);\\n encoded[0] = byte(uint8(_len) + uint8(_offset));\\n } else {\\n uint256 lenLen;\\n uint256 i = 1;\\n while (_len / i != 0) {\\n lenLen++;\\n i *= 256;\\n }\\n\\n encoded = new bytes(lenLen + 1);\\n encoded[0] = byte(uint8(lenLen) + uint8(_offset) + 55);\\n for(i = 1; i <= lenLen; i++) {\\n encoded[i] = byte(uint8((_len / (256**(lenLen-i))) % 256));\\n }\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * Encode integer in big endian binary form with no leading zeroes.\\n * @notice TODO: This should be optimized with assembly to save gas costs.\\n * @param _x The integer to encode.\\n * @return _binary RLP encoded bytes.\\n */\\n function _toBinary(\\n uint256 _x\\n )\\n private\\n pure\\n returns (\\n bytes memory _binary\\n )\\n {\\n bytes memory b = abi.encodePacked(_x);\\n\\n uint256 i = 0;\\n for (; i < 32; i++) {\\n if (b[i] != 0) {\\n break;\\n }\\n }\\n\\n bytes memory res = new bytes(32 - i);\\n for (uint256 j = 0; j < res.length; j++) {\\n res[j] = b[i++];\\n }\\n\\n return res;\\n }\\n\\n /**\\n * Copies a piece of memory to another location.\\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\\n * @param _dest Destination location.\\n * @param _src Source location.\\n * @param _len Length of memory to copy.\\n */\\n function _memcpy(\\n uint256 _dest,\\n uint256 _src,\\n uint256 _len\\n )\\n private\\n pure\\n {\\n uint256 dest = _dest;\\n uint256 src = _src;\\n uint256 len = _len;\\n\\n for(; len >= 32; len -= 32) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n dest += 32;\\n src += 32;\\n }\\n\\n uint256 mask = 256 ** (32 - len) - 1;\\n assembly {\\n let srcpart := and(mload(src), not(mask))\\n let destpart := and(mload(dest), mask)\\n mstore(dest, or(destpart, srcpart))\\n }\\n }\\n\\n /**\\n * Flattens a list of byte strings into one byte string.\\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\\n * @param _list List of byte strings to flatten.\\n * @return _flattened The flattened byte string.\\n */\\n function _flatten(\\n bytes[] memory _list\\n )\\n private\\n pure\\n returns (\\n bytes memory _flattened\\n )\\n {\\n if (_list.length == 0) {\\n return new bytes(0);\\n }\\n\\n uint256 len;\\n uint256 i = 0;\\n for (; i < _list.length; i++) {\\n len += _list[i].length;\\n }\\n\\n bytes memory flattened = new bytes(len);\\n uint256 flattenedPtr;\\n assembly { flattenedPtr := add(flattened, 0x20) }\\n\\n for(i = 0; i < _list.length; i++) {\\n bytes memory item = _list[i];\\n\\n uint256 listPtr;\\n assembly { listPtr := add(item, 0x20)}\\n\\n _memcpy(flattenedPtr, listPtr, item.length);\\n flattenedPtr += _list[i].length;\\n }\\n\\n return flattened;\\n }\\n}\",\"keccak256\":\"0xbcb24619c1758cb0d9f3fe5c79495950045a9087046a02b9ce01df46ae09ae5b\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_Bytes32Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_Byte32Utils\\n */\\nlibrary Lib_Bytes32Utils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \\\"true.\\\"\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as a boolean.\\n */\\n function toBool(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return _in != 0;\\n }\\n\\n /**\\n * Converts a boolean to a bytes32 value.\\n * @param _in Input boolean value.\\n * @return Boolean as a bytes32.\\n */\\n function fromBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in ? 1 : 0));\\n }\\n\\n /**\\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as an address.\\n */\\n function toAddress(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return address(uint160(uint256(_in)));\\n }\\n\\n /**\\n * Converts an address to a bytes32.\\n * @param _in Input address value.\\n * @return Address as a bytes32.\\n */\\n function fromAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in));\\n }\\n\\n /**\\n * Removes the leading zeros from a bytes32 value and returns a new (smaller) bytes value.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 without any leading zeros.\\n */\\n function removeLeadingZeros(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out;\\n\\n assembly {\\n // Figure out how many leading zero bytes to remove.\\n let shift := 0\\n for { let i := 0 } and(lt(i, 32), eq(byte(i, _in), 0)) { i := add(i, 1) } {\\n shift := add(shift, 1)\\n }\\n\\n // Reserve some space for our output and fix the free memory pointer.\\n out := mload(0x40)\\n mstore(0x40, add(out, 0x40))\\n\\n // Shift the value and store it into the output bytes.\\n mstore(add(out, 0x20), shl(mul(shift, 8), _in))\\n\\n // Store the new size (with leading zero bytes removed) in the output byte size.\\n mstore(out, sub(32, shift))\\n }\\n\\n return out;\\n }\\n}\\n\",\"keccak256\":\"0xfa2def593e3fc56a31852c3744aefdaa93cec74e721bfcfeb1e5d166c7c60b64\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_BytesUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_BytesUtils\\n */\\nlibrary Lib_BytesUtils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_start + _length >= _start, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n if (_bytes.length - _start == 0) {\\n return bytes('');\\n }\\n\\n return slice(_bytes, _start, _bytes.length - _start);\\n }\\n\\n function toBytes32PadLeft(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes32)\\n {\\n bytes32 ret;\\n uint256 len = _bytes.length <= 32 ? _bytes.length : 32;\\n assembly {\\n ret := shr(mul(sub(32, len), 8), mload(add(_bytes, 32)))\\n }\\n return ret;\\n }\\n\\n function toBytes32(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes32)\\n {\\n if (_bytes.length < 32) {\\n bytes32 ret;\\n assembly {\\n ret := mload(add(_bytes, 32))\\n }\\n return ret;\\n }\\n\\n return abi.decode(_bytes,(bytes32)); // will truncate if input length > 32 bytes\\n }\\n\\n function toUint256(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (uint256)\\n {\\n return uint256(toBytes32(_bytes));\\n }\\n\\n function toUint24(bytes memory _bytes, uint256 _start) internal pure returns (uint24) {\\n require(_start + 3 >= _start, \\\"toUint24_overflow\\\");\\n require(_bytes.length >= _start + 3 , \\\"toUint24_outOfBounds\\\");\\n uint24 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x3), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toUint8(bytes memory _bytes, uint256 _start) internal pure returns (uint8) {\\n require(_start + 1 >= _start, \\\"toUint8_overflow\\\");\\n require(_bytes.length >= _start + 1 , \\\"toUint8_outOfBounds\\\");\\n uint8 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x1), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toAddress(bytes memory _bytes, uint256 _start) internal pure returns (address) {\\n require(_start + 20 >= _start, \\\"toAddress_overflow\\\");\\n require(_bytes.length >= _start + 20, \\\"toAddress_outOfBounds\\\");\\n address tempAddress;\\n\\n assembly {\\n tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000)\\n }\\n\\n return tempAddress;\\n }\\n\\n function toNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n bytes memory nibbles = new bytes(_bytes.length * 2);\\n\\n for (uint256 i = 0; i < _bytes.length; i++) {\\n nibbles[i * 2] = _bytes[i] >> 4;\\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\\n }\\n\\n return nibbles;\\n }\\n\\n function fromNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n bytes memory ret = new bytes(_bytes.length / 2);\\n\\n for (uint256 i = 0; i < ret.length; i++) {\\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\\n }\\n\\n return ret;\\n }\\n\\n function equal(\\n bytes memory _bytes,\\n bytes memory _other\\n )\\n internal\\n pure\\n returns (bool)\\n {\\n return keccak256(_bytes) == keccak256(_other);\\n }\\n}\\n\",\"keccak256\":\"0x0adf22e1b22ba09911e859f64cb3b484e992be4f9fd3b09088e6225bf8d06ce0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_ErrorUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/**\\n * @title Lib_ErrorUtils\\n */\\nlibrary Lib_ErrorUtils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Encodes an error string into raw solidity-style revert data.\\n * (i.e. ascii bytes, prefixed with bytes4(keccak(\\\"Error(string))\\\"))\\n * Ref: https://docs.soliditylang.org/en/v0.8.2/control-structures.html?highlight=Error(string)#panic-via-assert-and-error-via-require\\n * @param _reason Reason for the reversion.\\n * @return Standard solidity revert data for the given reason.\\n */\\n function encodeRevertString(\\n string memory _reason\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return abi.encodeWithSignature(\\n \\\"Error(string)\\\",\\n _reason\\n );\\n }\\n}\\n\",\"keccak256\":\"0xfc64ec4a81fb50865b502a0004ed154e8598e1a313db77303fc95e41f536e6b7\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_MerkleTree.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_MerkleTree\\n * @author River Keefer\\n */\\nlibrary Lib_MerkleTree {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Calculates a merkle root for a list of 32-byte leaf hashes. WARNING: If the number\\n * of leaves passed in is not a power of two, it pads out the tree with zero hashes.\\n * If you do not know the original length of elements for the tree you are verifying,\\n * then this may allow empty leaves past _elements.length to pass a verification check down the line.\\n * Note that the _elements argument is modified, therefore it must not be used again afterwards\\n * @param _elements Array of hashes from which to generate a merkle root.\\n * @return Merkle root of the leaves, with zero hashes for non-powers-of-two (see above).\\n */\\n function getMerkleRoot(\\n bytes32[] memory _elements\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n require(\\n _elements.length > 0,\\n \\\"Lib_MerkleTree: Must provide at least one leaf hash.\\\"\\n );\\n\\n if (_elements.length == 1) {\\n return _elements[0];\\n }\\n\\n uint256[16] memory defaults = [\\n 0x290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563,\\n 0x633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d,\\n 0x890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d,\\n 0x3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd8,\\n 0xecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da,\\n 0xdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da5,\\n 0x617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d7,\\n 0x292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead,\\n 0xe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e10,\\n 0x7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f82,\\n 0xe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e83636516,\\n 0x3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c,\\n 0xad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e,\\n 0xa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab,\\n 0x4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c862,\\n 0x2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf10\\n ];\\n\\n // Reserve memory space for our hashes.\\n bytes memory buf = new bytes(64);\\n\\n // We'll need to keep track of left and right siblings.\\n bytes32 leftSibling;\\n bytes32 rightSibling;\\n\\n // Number of non-empty nodes at the current depth.\\n uint256 rowSize = _elements.length;\\n\\n // Current depth, counting from 0 at the leaves\\n uint256 depth = 0;\\n\\n // Common sub-expressions\\n uint256 halfRowSize; // rowSize / 2\\n bool rowSizeIsOdd; // rowSize % 2 == 1\\n\\n while (rowSize > 1) {\\n halfRowSize = rowSize / 2;\\n rowSizeIsOdd = rowSize % 2 == 1;\\n\\n for (uint256 i = 0; i < halfRowSize; i++) {\\n leftSibling = _elements[(2 * i) ];\\n rightSibling = _elements[(2 * i) + 1];\\n assembly {\\n mstore(add(buf, 32), leftSibling )\\n mstore(add(buf, 64), rightSibling)\\n }\\n\\n _elements[i] = keccak256(buf);\\n }\\n\\n if (rowSizeIsOdd) {\\n leftSibling = _elements[rowSize - 1];\\n rightSibling = bytes32(defaults[depth]);\\n assembly {\\n mstore(add(buf, 32), leftSibling)\\n mstore(add(buf, 64), rightSibling)\\n }\\n\\n _elements[halfRowSize] = keccak256(buf);\\n }\\n\\n rowSize = halfRowSize + (rowSizeIsOdd ? 1 : 0);\\n depth++;\\n }\\n\\n return _elements[0];\\n }\\n\\n /**\\n * Verifies a merkle branch for the given leaf hash. Assumes the original length\\n * of leaves generated is a known, correct input, and does not return true for indices\\n * extending past that index (even if _siblings would be otherwise valid.)\\n * @param _root The Merkle root to verify against.\\n * @param _leaf The leaf hash to verify inclusion of.\\n * @param _index The index in the tree of this leaf.\\n * @param _siblings Array of sibline nodes in the inclusion proof, starting from depth 0 (bottom of the tree).\\n * @param _totalLeaves The total number of leaves originally passed into.\\n * @return Whether or not the merkle branch and leaf passes verification.\\n */\\n function verify(\\n bytes32 _root,\\n bytes32 _leaf,\\n uint256 _index,\\n bytes32[] memory _siblings,\\n uint256 _totalLeaves\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n require(\\n _totalLeaves > 0,\\n \\\"Lib_MerkleTree: Total leaves must be greater than zero.\\\"\\n );\\n\\n require(\\n _index < _totalLeaves,\\n \\\"Lib_MerkleTree: Index out of bounds.\\\"\\n );\\n\\n require(\\n _siblings.length == _ceilLog2(_totalLeaves),\\n \\\"Lib_MerkleTree: Total siblings does not correctly correspond to total leaves.\\\"\\n );\\n\\n bytes32 computedRoot = _leaf;\\n\\n for (uint256 i = 0; i < _siblings.length; i++) {\\n if ((_index & 1) == 1) {\\n computedRoot = keccak256(\\n abi.encodePacked(\\n _siblings[i],\\n computedRoot\\n )\\n );\\n } else {\\n computedRoot = keccak256(\\n abi.encodePacked(\\n computedRoot,\\n _siblings[i]\\n )\\n );\\n }\\n\\n _index >>= 1;\\n }\\n\\n return _root == computedRoot;\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Calculates the integer ceiling of the log base 2 of an input.\\n * @param _in Unsigned input to calculate the log.\\n * @return ceil(log_base_2(_in))\\n */\\n function _ceilLog2(\\n uint256 _in\\n )\\n private\\n pure\\n returns (\\n uint256\\n )\\n {\\n require(\\n _in > 0,\\n \\\"Lib_MerkleTree: Cannot compute ceil(log_2) of 0.\\\"\\n );\\n\\n if (_in == 1) {\\n return 0;\\n }\\n\\n // Find the highest set bit (will be floor(log_2)).\\n // Borrowed with <3 from https://github.com/ethereum/solidity-examples\\n uint256 val = _in;\\n uint256 highest = 0;\\n for (uint256 i = 128; i >= 1; i >>= 1) {\\n if (val & (uint(1) << i) - 1 << i != 0) {\\n highest += i;\\n val >>= i;\\n }\\n }\\n\\n // Increment by one if this is not a perfect logarithm.\\n if ((uint(1) << highest) != _in) {\\n highest += 1;\\n }\\n\\n return highest;\\n }\\n}\\n\",\"keccak256\":\"0xa78edb9fbd34712771a1ebff05bc5e1abec7fc1e9a1bfb709d183099b44fa62a\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_ErrorUtils } from \\\"../utils/Lib_ErrorUtils.sol\\\";\\n\\n/**\\n * @title Lib_SafeExecutionManagerWrapper\\n * @dev The Safe Execution Manager Wrapper provides functions which facilitate writing OVM safe \\n * code using the standard solidity compiler, by routing all its operations through the Execution \\n * Manager.\\n * \\n * Compiler used: solc\\n * Runtime target: OVM\\n */\\nlibrary Lib_SafeExecutionManagerWrapper {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Performs a safe ovmCALL.\\n * @param _gasLimit Gas limit for the call.\\n * @param _target Address to call.\\n * @param _calldata Data to send to the call.\\n * @return _success Whether or not the call reverted.\\n * @return _returndata Data returned by the call.\\n */\\n function safeCALL(\\n uint256 _gasLimit,\\n address _target,\\n bytes memory _calldata\\n )\\n internal\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCALL(uint256,address,bytes)\\\",\\n _gasLimit,\\n _target,\\n _calldata\\n )\\n );\\n\\n return abi.decode(returndata, (bool, bytes));\\n }\\n\\n /**\\n * Performs a safe ovmDELEGATECALL.\\n * @param _gasLimit Gas limit for the call.\\n * @param _target Address to call.\\n * @param _calldata Data to send to the call.\\n * @return _success Whether or not the call reverted.\\n * @return _returndata Data returned by the call.\\n */\\n function safeDELEGATECALL(\\n uint256 _gasLimit,\\n address _target,\\n bytes memory _calldata\\n )\\n internal\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmDELEGATECALL(uint256,address,bytes)\\\",\\n _gasLimit,\\n _target,\\n _calldata\\n )\\n );\\n\\n return abi.decode(returndata, (bool, bytes));\\n }\\n\\n /**\\n * Performs a safe ovmCREATE call.\\n * @param _gasLimit Gas limit for the creation.\\n * @param _bytecode Code for the new contract.\\n * @return _contract Address of the created contract.\\n */\\n function safeCREATE(\\n uint256 _gasLimit,\\n bytes memory _bytecode\\n )\\n internal\\n returns (\\n address,\\n bytes memory\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n _gasLimit,\\n abi.encodeWithSignature(\\n \\\"ovmCREATE(bytes)\\\",\\n _bytecode\\n )\\n );\\n\\n return abi.decode(returndata, (address, bytes));\\n }\\n\\n /**\\n * Performs a safe ovmEXTCODESIZE call.\\n * @param _contract Address of the contract to query the size of.\\n * @return _EXTCODESIZE Size of the requested contract in bytes.\\n */\\n function safeEXTCODESIZE(\\n address _contract\\n )\\n internal\\n returns (\\n uint256 _EXTCODESIZE\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmEXTCODESIZE(address)\\\",\\n _contract\\n )\\n );\\n\\n return abi.decode(returndata, (uint256));\\n }\\n\\n /**\\n * Performs a safe ovmCHAINID call.\\n * @return _CHAINID Result of calling ovmCHAINID.\\n */\\n function safeCHAINID()\\n internal\\n returns (\\n uint256 _CHAINID\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCHAINID()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (uint256));\\n }\\n\\n /**\\n * Performs a safe ovmCALLER call.\\n * @return _CALLER Result of calling ovmCALLER.\\n */\\n function safeCALLER()\\n internal\\n returns (\\n address _CALLER\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCALLER()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (address));\\n }\\n\\n /**\\n * Performs a safe ovmADDRESS call.\\n * @return _ADDRESS Result of calling ovmADDRESS.\\n */\\n function safeADDRESS()\\n internal\\n returns (\\n address _ADDRESS\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmADDRESS()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (address));\\n }\\n\\n /**\\n * Performs a safe ovmGETNONCE call.\\n * @return _nonce Result of calling ovmGETNONCE.\\n */\\n function safeGETNONCE()\\n internal\\n returns (\\n uint256 _nonce\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmGETNONCE()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (uint256));\\n }\\n\\n /**\\n * Performs a safe ovmINCREMENTNONCE call.\\n */\\n function safeINCREMENTNONCE()\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmINCREMENTNONCE()\\\"\\n )\\n );\\n }\\n\\n /**\\n * Performs a safe ovmCREATEEOA call.\\n * @param _messageHash Message hash which was signed by EOA\\n * @param _v v value of signature (0 or 1)\\n * @param _r r value of signature\\n * @param _s s value of signature\\n */\\n function safeCREATEEOA(\\n bytes32 _messageHash,\\n uint8 _v,\\n bytes32 _r,\\n bytes32 _s\\n )\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCREATEEOA(bytes32,uint8,bytes32,bytes32)\\\",\\n _messageHash,\\n _v,\\n _r,\\n _s\\n )\\n );\\n }\\n\\n /**\\n * Performs a safe REVERT.\\n * @param _reason String revert reason to pass along with the REVERT.\\n */\\n function safeREVERT(\\n string memory _reason\\n )\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmREVERT(bytes)\\\",\\n Lib_ErrorUtils.encodeRevertString(\\n _reason\\n )\\n )\\n );\\n }\\n\\n /**\\n * Performs a safe \\\"require\\\".\\n * @param _condition Boolean condition that must be true or will revert.\\n * @param _reason String revert reason to pass along with the REVERT.\\n */\\n function safeREQUIRE(\\n bool _condition,\\n string memory _reason\\n )\\n internal\\n {\\n if (!_condition) {\\n safeREVERT(\\n _reason\\n );\\n }\\n }\\n\\n /**\\n * Performs a safe ovmSLOAD call.\\n */\\n function safeSLOAD(\\n bytes32 _key\\n )\\n internal\\n returns (\\n bytes32\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmSLOAD(bytes32)\\\",\\n _key\\n )\\n );\\n\\n return abi.decode(returndata, (bytes32));\\n }\\n\\n /**\\n * Performs a safe ovmSSTORE call.\\n */\\n function safeSSTORE(\\n bytes32 _key,\\n bytes32 _value\\n )\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmSSTORE(bytes32,bytes32)\\\",\\n _key,\\n _value\\n )\\n );\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Performs an ovm interaction and the necessary safety checks.\\n * @param _gasLimit Gas limit for the interaction.\\n * @param _calldata Data to send to the OVM_ExecutionManager (encoded with sighash).\\n * @return _returndata Data sent back by the OVM_ExecutionManager.\\n */\\n function _safeExecutionManagerInteraction(\\n uint256 _gasLimit,\\n bytes memory _calldata\\n )\\n private\\n returns (\\n bytes memory _returndata\\n )\\n {\\n address ovmExecutionManager = msg.sender;\\n (\\n bool success,\\n bytes memory returndata\\n ) = ovmExecutionManager.call{gas: _gasLimit}(_calldata);\\n\\n if (success == false) {\\n assembly {\\n revert(add(returndata, 0x20), mload(returndata))\\n }\\n } else if (returndata.length == 1) {\\n assembly {\\n return(0, 1)\\n }\\n } else {\\n return returndata;\\n }\\n }\\n\\n function _safeExecutionManagerInteraction(\\n bytes memory _calldata\\n )\\n private\\n returns (\\n bytes memory _returndata\\n )\\n {\\n return _safeExecutionManagerInteraction(\\n gasleft(),\\n _calldata\\n );\\n }\\n}\\n\",\"keccak256\":\"0x41e146e7912af794a17cd43c5a276674be956bfa8f3ca5b451bcb82d81e6f492\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x608060405234801561001057600080fd5b50604051611bc5380380611bc583398101604081905261002f9161005b565b600080546001600160a01b0319166001600160a01b03949094169390931790925560015560025561009c565b60008060006060848603121561006f578283fd5b83516001600160a01b0381168114610085578384fd5b602085015160409095015190969495509392505050565b611b1a806100ab6000396000f3fe608060405234801561001057600080fd5b50600436106100b45760003560e01c80638ca5cbb9116100715780638ca5cbb91461012f5780639418bddd14610144578063b8e189ac14610157578063c17b291b1461016a578063cfdf677e14610172578063e561dddc1461017a576100b4565b8063299ca478146100b9578063461a4478146100d75780634d69ee57146100ea5780637aa63a861461010a5780637ad168a01461011f57806381eb62ef14610127575b600080fd5b6100c1610182565b6040516100ce919061159f565b60405180910390f35b6100c16100e53660046114e3565b610191565b6100fd6100f8366004611431565b61026f565b6040516100ce91906115b3565b6101126102e2565b6040516100ce91906115be565b6101126102fb565b610112610314565b61014261013d366004611390565b61031a565b005b6100fd610152366004611531565b61052e565b610142610165366004611531565b61057e565b610112610636565b6100c161063c565b610112610664565b6000546001600160a01b031681565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b838110156101f15781810151838201526020016101d9565b50505050905090810190601f16801561021e5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561023b57600080fd5b505afa15801561024f573d6000803e3d6000fd5b505050506040513d602081101561026557600080fd5b505190505b919050565b600061027a836106de565b61029f5760405162461bcd60e51b815260040161029690611749565b60405180910390fd5b6102bc836020015185846000015185602001518760400151610776565b6102d85760405162461bcd60e51b8152600401610296906116b5565b5060019392505050565b6000806102ed6108fb565b5064ffffffffff1691505090565b6000806103066108fb565b64ffffffffff169250505090565b60025481565b6103226102e2565b81146103405760405162461bcd60e51b8152600401610296906116ec565b6103706040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b815250610191565b6001600160a01b03166302ad4d2a336040518263ffffffff1660e01b815260040161039b919061159f565b60206040518083038186803b1580156103b357600080fd5b505afa1580156103c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103eb91906113d3565b6104075760405162461bcd60e51b8152600401610296906118bb565b60008251116104285760405162461bcd60e51b815260040161029690611878565b6104666040518060400160405280601d81526020017f4f564d5f43616e6f6e6963616c5472616e73616374696f6e436861696e000000815250610191565b6001600160a01b0316637aa63a866040518163ffffffff1660e01b815260040160206040518083038186803b15801561049e57600080fd5b505afa1580156104b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104d69190611419565b82516104e06102e2565b0111156104ff5760405162461bcd60e51b815260040161029690611646565b61052a8242336040516020016105169291906119a1565b604051602081830303815290604052610990565b5050565b60008082608001518060200190518101906105499190611564565b509050806105695760405162461bcd60e51b815260040161029690611833565b4261057682600154610b31565b119392505050565b6105b06040518060400160405280601181526020017027ab26afa33930bab22b32b934b334b2b960791b815250610191565b6001600160a01b0316336001600160a01b0316146105e05760405162461bcd60e51b8152600401610296906117d6565b6105e9816106de565b6106055760405162461bcd60e51b815260040161029690611749565b61060e8161052e565b61062a5760405162461bcd60e51b815260040161029690611778565b61063381610b92565b50565b60015481565b600061065f604051806060016040528060258152602001611ab560259139610191565b905090565b600061066e61063c565b6001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b1580156106a657600080fd5b505afa1580156106ba573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061065f9190611419565b60006106e861063c565b8251604051634a83e9cd60e11b81526001600160a01b039290921691639507d39a91610716916004016115be565b60206040518083038186803b15801561072e57600080fd5b505afa158015610742573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107669190611419565b61076f83610d0a565b1492915050565b60008082116107b65760405162461bcd60e51b8152600401808060200182810382526037815260200180611a316037913960400191505060405180910390fd5b8184106107f45760405162461bcd60e51b81526004018080602001828103825260248152602001806119dd6024913960400191505060405180910390fd5b6107fd82610d50565b83511461083b5760405162461bcd60e51b815260040180806020018281038252604d815260200180611a68604d913960600191505060405180910390fd5b8460005b84518110156108ee57856001166001141561089d5784818151811061086057fe5b60200260200101518260405160200180838152602001828152602001925050506040516020818303038152906040528051906020012091506108e2565b818582815181106108aa57fe5b602002602001015160405160200180838152602001828152602001925050506040516020818303038152906040528051906020012091505b600195861c950161083f565b5090951495945050505050565b600080600061090861063c565b6001600160a01b031663ccf8f9696040518163ffffffff1660e01b815260040160206040518083038186803b15801561094057600080fd5b505afa158015610954573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061097891906113f3565b64ffffffffff602882901c16935060501c9150509091565b60006109bf6040518060400160405280600c81526020016b27ab26afa83937b837b9b2b960a11b815250610191565b90506000806109cc6108fb565b9092509050336001600160a01b03841614156109e9575042610a13565b426002548264ffffffffff160110610a135760405162461bcd60e51b81526004016102969061190a565b60006040518060a00160405280610a28610664565b8152602001610a3688610de6565b8152602001875181526020018464ffffffffff16815260200186815250905080600001517f16be4c5129a4e03cf3350262e181dc02ddfb4a6008d925368c0899fcd97ca9c58260200151836040015184606001518560800151604051610a9f94939291906115dd565b60405180910390a2610aaf61063c565b6001600160a01b0316632015276c610ac683610d0a565b610ada84604001518560600151018661121a565b6040518363ffffffff1660e01b8152600401610af79291906115c7565b600060405180830381600087803b158015610b1157600080fd5b505af1158015610b25573d6000803e3d6000fd5b50505050505050505050565b600082820183811015610b8b576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b610b9a61063c565b6001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b158015610bd257600080fd5b505afa158015610be6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c0a9190611419565b815110610c295760405162461bcd60e51b815260040161029690611973565b610c32816106de565b610c4e5760405162461bcd60e51b815260040161029690611749565b610c5661063c565b6001600160a01b031663167fd6818260000151610c788460600151600061121a565b6040518363ffffffff1660e01b8152600401610c959291906115c7565b600060405180830381600087803b158015610caf57600080fd5b505af1158015610cc3573d6000803e3d6000fd5b5050505080600001517f8747b69ce8fdb31c3b9b0a67bd8049ad8c1a69ea417b69b12174068abd9cbd648260200151604051610cff91906115be565b60405180910390a250565b60008160200151826040015183606001518460800151604051602001610d3394939291906115dd565b604051602081830303815290604052805190602001209050919050565b6000808211610d905760405162461bcd60e51b8152600401808060200182810382526030815260200180611a016030913960400191505060405180910390fd5b8160011415610da15750600061026a565b81600060805b60018110610dd1576000196001821b01811b831615610dc95791821c91908101905b60011c610da7565b506001811b8414610b8b576001019392505050565b600080825111610e275760405162461bcd60e51b8152600401808060200182810382526034815260200180611ada6034913960400191505060405180910390fd5b815160011415610e4d5781600081518110610e3e57fe5b6020026020010151905061026a565b60408051610200810182527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56381527f633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d60208201527f890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d818301527f3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd86060808301919091527fecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da60808301527fdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da560a08301527f617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d760c08301527f292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead60e08301527fe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e106101008301527f7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f826101208301527fe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e836365166101408301527f3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c6101608301527fad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e6101808301527fa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab6101a08301527f4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c8626101c08301527f2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf106101e083015282518381529081018352909160009190602082018180368337505085519192506000918291508180805b60018411156111f65750506002820460018084161460005b82811015611172578a816002028151811061111957fe5b602002602001015196508a816002026001018151811061113557fe5b6020026020010151955086602089015285604089015287805190602001208b828151811061115f57fe5b6020908102919091010152600101611102565b5080156111d55789600185038151811061118857fe5b6020026020010151955087836010811061119e57fe5b602002015160001b945085602088015284604088015286805190602001208a83815181106111c857fe5b6020026020010181815250505b806111e15760006111e4565b60015b60ff16820193506001909201916110ea565b8960008151811061120357fe5b602002602001015198505050505050505050919050565b602890811b91909117901b90565b600067ffffffffffffffff83111561123c57fe5b61124f601f8401601f19166020016119b8565b905082815283838301111561126357600080fd5b828260208301376000602084830101529392505050565b600082601f83011261128a578081fd5b8135602067ffffffffffffffff8211156112a057fe5b8082026112ae8282016119b8565b8381528281019086840183880185018910156112c8578687fd5b8693505b858410156112ea5780358352600193909301929184019184016112cc565b50979650505050505050565b600060a08284031215611307578081fd5b60405160a0810167ffffffffffffffff828210818311171561132557fe5b8160405282935084358352602085013560208401526040850135604084015260608501356060840152608085013591508082111561136257600080fd5b508301601f8101851361137457600080fd5b61138385823560208401611228565b6080830152505092915050565b600080604083850312156113a2578182fd5b823567ffffffffffffffff8111156113b8578283fd5b6113c48582860161127a565b95602094909401359450505050565b6000602082840312156113e4578081fd5b81518015158114610b8b578182fd5b600060208284031215611404578081fd5b815164ffffffffff1981168114610b8b578182fd5b60006020828403121561142a578081fd5b5051919050565b600080600060608486031215611445578081fd5b83359250602084013567ffffffffffffffff80821115611463578283fd5b61146f878388016112f6565b93506040860135915080821115611484578283fd5b9085019060408288031215611497578283fd5b6040516040810181811083821117156114ac57fe5b604052823581526020830135828111156114c4578485fd5b6114d08982860161127a565b6020830152508093505050509250925092565b6000602082840312156114f4578081fd5b813567ffffffffffffffff81111561150a578182fd5b8201601f8101841361151a578182fd5b61152984823560208401611228565b949350505050565b600060208284031215611542578081fd5b813567ffffffffffffffff811115611558578182fd5b611529848285016112f6565b60008060408385031215611576578182fd5b825160208401519092506001600160a01b0381168114611594578182fd5b809150509250929050565b6001600160a01b0391909116815260200190565b901515815260200190565b90815260200190565b91825264ffffffffff1916602082015260400190565b600085825260208581840152846040840152608060608401528351806080850152825b8181101561161c5785810183015185820160a001528201611600565b8181111561162d578360a083870101525b50601f01601f19169290920160a0019695505050505050565b60208082526049908201527f4e756d626572206f6620737461746520726f6f74732063616e6e6f742065786360408201527f65656420746865206e756d626572206f662063616e6f6e6963616c207472616e60608201526839b0b1ba34b7b7399760b91b608082015260a00190565b60208082526018908201527f496e76616c696420696e636c7573696f6e2070726f6f662e0000000000000000604082015260600190565b6020808252603d908201527f41637475616c20626174636820737461727420696e64657820646f6573206e6f60408201527f74206d6174636820657870656374656420737461727420696e6465782e000000606082015260800190565b60208082526015908201527424b73b30b634b2103130ba31b4103432b0b232b91760591b604082015260600190565b602080825260409082018190527f537461746520626174636865732063616e206f6e6c792062652064656c657465908201527f642077697468696e207468652066726175642070726f6f662077696e646f772e606082015260800190565b6020808252603b908201527f537461746520626174636865732063616e206f6e6c792062652064656c65746560408201527f6420627920746865204f564d5f467261756456657269666965722e0000000000606082015260800190565b60208082526025908201527f4261746368206865616465722074696d657374616d702063616e6e6f74206265604082015264207a65726f60d81b606082015260800190565b60208082526023908201527f43616e6e6f74207375626d697420616e20656d7074792073746174652062617460408201526231b41760e91b606082015260800190565b6020808252602f908201527f50726f706f73657220646f6573206e6f74206861766520656e6f75676820636f60408201526e1b1b185d195c985b081c1bdcdd1959608a1b606082015260800190565b60208082526043908201527f43616e6e6f74207075626c69736820737461746520726f6f747320776974686960408201527f6e207468652073657175656e636572207075626c69636174696f6e2077696e6460608201526237bb9760e91b608082015260a00190565b60208082526014908201527324b73b30b634b2103130ba31b41034b73232bc1760611b604082015260600190565b9182526001600160a01b0316602082015260400190565b60405181810167ffffffffffffffff811182821017156119d457fe5b60405291905056fe4c69625f4d65726b6c65547265653a20496e646578206f7574206f6620626f756e64732e4c69625f4d65726b6c65547265653a2043616e6e6f7420636f6d70757465206365696c286c6f675f3229206f6620302e4c69625f4d65726b6c65547265653a20546f74616c206c6561766573206d7573742062652067726561746572207468616e207a65726f2e4c69625f4d65726b6c65547265653a20546f74616c207369626c696e677320646f6573206e6f7420636f72726563746c7920636f72726573706f6e6420746f20746f74616c206c65617665732e4f564d5f436861696e53746f72616765436f6e7461696e65723a5343433a626174636865734c69625f4d65726b6c65547265653a204d7573742070726f76696465206174206c65617374206f6e65206c65616620686173682ea164736f6c6343000706000a", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100b45760003560e01c80638ca5cbb9116100715780638ca5cbb91461012f5780639418bddd14610144578063b8e189ac14610157578063c17b291b1461016a578063cfdf677e14610172578063e561dddc1461017a576100b4565b8063299ca478146100b9578063461a4478146100d75780634d69ee57146100ea5780637aa63a861461010a5780637ad168a01461011f57806381eb62ef14610127575b600080fd5b6100c1610182565b6040516100ce919061159f565b60405180910390f35b6100c16100e53660046114e3565b610191565b6100fd6100f8366004611431565b61026f565b6040516100ce91906115b3565b6101126102e2565b6040516100ce91906115be565b6101126102fb565b610112610314565b61014261013d366004611390565b61031a565b005b6100fd610152366004611531565b61052e565b610142610165366004611531565b61057e565b610112610636565b6100c161063c565b610112610664565b6000546001600160a01b031681565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b838110156101f15781810151838201526020016101d9565b50505050905090810190601f16801561021e5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561023b57600080fd5b505afa15801561024f573d6000803e3d6000fd5b505050506040513d602081101561026557600080fd5b505190505b919050565b600061027a836106de565b61029f5760405162461bcd60e51b815260040161029690611749565b60405180910390fd5b6102bc836020015185846000015185602001518760400151610776565b6102d85760405162461bcd60e51b8152600401610296906116b5565b5060019392505050565b6000806102ed6108fb565b5064ffffffffff1691505090565b6000806103066108fb565b64ffffffffff169250505090565b60025481565b6103226102e2565b81146103405760405162461bcd60e51b8152600401610296906116ec565b6103706040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b815250610191565b6001600160a01b03166302ad4d2a336040518263ffffffff1660e01b815260040161039b919061159f565b60206040518083038186803b1580156103b357600080fd5b505afa1580156103c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103eb91906113d3565b6104075760405162461bcd60e51b8152600401610296906118bb565b60008251116104285760405162461bcd60e51b815260040161029690611878565b6104666040518060400160405280601d81526020017f4f564d5f43616e6f6e6963616c5472616e73616374696f6e436861696e000000815250610191565b6001600160a01b0316637aa63a866040518163ffffffff1660e01b815260040160206040518083038186803b15801561049e57600080fd5b505afa1580156104b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104d69190611419565b82516104e06102e2565b0111156104ff5760405162461bcd60e51b815260040161029690611646565b61052a8242336040516020016105169291906119a1565b604051602081830303815290604052610990565b5050565b60008082608001518060200190518101906105499190611564565b509050806105695760405162461bcd60e51b815260040161029690611833565b4261057682600154610b31565b119392505050565b6105b06040518060400160405280601181526020017027ab26afa33930bab22b32b934b334b2b960791b815250610191565b6001600160a01b0316336001600160a01b0316146105e05760405162461bcd60e51b8152600401610296906117d6565b6105e9816106de565b6106055760405162461bcd60e51b815260040161029690611749565b61060e8161052e565b61062a5760405162461bcd60e51b815260040161029690611778565b61063381610b92565b50565b60015481565b600061065f604051806060016040528060258152602001611ab560259139610191565b905090565b600061066e61063c565b6001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b1580156106a657600080fd5b505afa1580156106ba573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061065f9190611419565b60006106e861063c565b8251604051634a83e9cd60e11b81526001600160a01b039290921691639507d39a91610716916004016115be565b60206040518083038186803b15801561072e57600080fd5b505afa158015610742573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107669190611419565b61076f83610d0a565b1492915050565b60008082116107b65760405162461bcd60e51b8152600401808060200182810382526037815260200180611a316037913960400191505060405180910390fd5b8184106107f45760405162461bcd60e51b81526004018080602001828103825260248152602001806119dd6024913960400191505060405180910390fd5b6107fd82610d50565b83511461083b5760405162461bcd60e51b815260040180806020018281038252604d815260200180611a68604d913960600191505060405180910390fd5b8460005b84518110156108ee57856001166001141561089d5784818151811061086057fe5b60200260200101518260405160200180838152602001828152602001925050506040516020818303038152906040528051906020012091506108e2565b818582815181106108aa57fe5b602002602001015160405160200180838152602001828152602001925050506040516020818303038152906040528051906020012091505b600195861c950161083f565b5090951495945050505050565b600080600061090861063c565b6001600160a01b031663ccf8f9696040518163ffffffff1660e01b815260040160206040518083038186803b15801561094057600080fd5b505afa158015610954573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061097891906113f3565b64ffffffffff602882901c16935060501c9150509091565b60006109bf6040518060400160405280600c81526020016b27ab26afa83937b837b9b2b960a11b815250610191565b90506000806109cc6108fb565b9092509050336001600160a01b03841614156109e9575042610a13565b426002548264ffffffffff160110610a135760405162461bcd60e51b81526004016102969061190a565b60006040518060a00160405280610a28610664565b8152602001610a3688610de6565b8152602001875181526020018464ffffffffff16815260200186815250905080600001517f16be4c5129a4e03cf3350262e181dc02ddfb4a6008d925368c0899fcd97ca9c58260200151836040015184606001518560800151604051610a9f94939291906115dd565b60405180910390a2610aaf61063c565b6001600160a01b0316632015276c610ac683610d0a565b610ada84604001518560600151018661121a565b6040518363ffffffff1660e01b8152600401610af79291906115c7565b600060405180830381600087803b158015610b1157600080fd5b505af1158015610b25573d6000803e3d6000fd5b50505050505050505050565b600082820183811015610b8b576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b610b9a61063c565b6001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b158015610bd257600080fd5b505afa158015610be6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c0a9190611419565b815110610c295760405162461bcd60e51b815260040161029690611973565b610c32816106de565b610c4e5760405162461bcd60e51b815260040161029690611749565b610c5661063c565b6001600160a01b031663167fd6818260000151610c788460600151600061121a565b6040518363ffffffff1660e01b8152600401610c959291906115c7565b600060405180830381600087803b158015610caf57600080fd5b505af1158015610cc3573d6000803e3d6000fd5b5050505080600001517f8747b69ce8fdb31c3b9b0a67bd8049ad8c1a69ea417b69b12174068abd9cbd648260200151604051610cff91906115be565b60405180910390a250565b60008160200151826040015183606001518460800151604051602001610d3394939291906115dd565b604051602081830303815290604052805190602001209050919050565b6000808211610d905760405162461bcd60e51b8152600401808060200182810382526030815260200180611a016030913960400191505060405180910390fd5b8160011415610da15750600061026a565b81600060805b60018110610dd1576000196001821b01811b831615610dc95791821c91908101905b60011c610da7565b506001811b8414610b8b576001019392505050565b600080825111610e275760405162461bcd60e51b8152600401808060200182810382526034815260200180611ada6034913960400191505060405180910390fd5b815160011415610e4d5781600081518110610e3e57fe5b6020026020010151905061026a565b60408051610200810182527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56381527f633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d60208201527f890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d818301527f3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd86060808301919091527fecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da60808301527fdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da560a08301527f617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d760c08301527f292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead60e08301527fe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e106101008301527f7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f826101208301527fe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e836365166101408301527f3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c6101608301527fad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e6101808301527fa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab6101a08301527f4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c8626101c08301527f2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf106101e083015282518381529081018352909160009190602082018180368337505085519192506000918291508180805b60018411156111f65750506002820460018084161460005b82811015611172578a816002028151811061111957fe5b602002602001015196508a816002026001018151811061113557fe5b6020026020010151955086602089015285604089015287805190602001208b828151811061115f57fe5b6020908102919091010152600101611102565b5080156111d55789600185038151811061118857fe5b6020026020010151955087836010811061119e57fe5b602002015160001b945085602088015284604088015286805190602001208a83815181106111c857fe5b6020026020010181815250505b806111e15760006111e4565b60015b60ff16820193506001909201916110ea565b8960008151811061120357fe5b602002602001015198505050505050505050919050565b602890811b91909117901b90565b600067ffffffffffffffff83111561123c57fe5b61124f601f8401601f19166020016119b8565b905082815283838301111561126357600080fd5b828260208301376000602084830101529392505050565b600082601f83011261128a578081fd5b8135602067ffffffffffffffff8211156112a057fe5b8082026112ae8282016119b8565b8381528281019086840183880185018910156112c8578687fd5b8693505b858410156112ea5780358352600193909301929184019184016112cc565b50979650505050505050565b600060a08284031215611307578081fd5b60405160a0810167ffffffffffffffff828210818311171561132557fe5b8160405282935084358352602085013560208401526040850135604084015260608501356060840152608085013591508082111561136257600080fd5b508301601f8101851361137457600080fd5b61138385823560208401611228565b6080830152505092915050565b600080604083850312156113a2578182fd5b823567ffffffffffffffff8111156113b8578283fd5b6113c48582860161127a565b95602094909401359450505050565b6000602082840312156113e4578081fd5b81518015158114610b8b578182fd5b600060208284031215611404578081fd5b815164ffffffffff1981168114610b8b578182fd5b60006020828403121561142a578081fd5b5051919050565b600080600060608486031215611445578081fd5b83359250602084013567ffffffffffffffff80821115611463578283fd5b61146f878388016112f6565b93506040860135915080821115611484578283fd5b9085019060408288031215611497578283fd5b6040516040810181811083821117156114ac57fe5b604052823581526020830135828111156114c4578485fd5b6114d08982860161127a565b6020830152508093505050509250925092565b6000602082840312156114f4578081fd5b813567ffffffffffffffff81111561150a578182fd5b8201601f8101841361151a578182fd5b61152984823560208401611228565b949350505050565b600060208284031215611542578081fd5b813567ffffffffffffffff811115611558578182fd5b611529848285016112f6565b60008060408385031215611576578182fd5b825160208401519092506001600160a01b0381168114611594578182fd5b809150509250929050565b6001600160a01b0391909116815260200190565b901515815260200190565b90815260200190565b91825264ffffffffff1916602082015260400190565b600085825260208581840152846040840152608060608401528351806080850152825b8181101561161c5785810183015185820160a001528201611600565b8181111561162d578360a083870101525b50601f01601f19169290920160a0019695505050505050565b60208082526049908201527f4e756d626572206f6620737461746520726f6f74732063616e6e6f742065786360408201527f65656420746865206e756d626572206f662063616e6f6e6963616c207472616e60608201526839b0b1ba34b7b7399760b91b608082015260a00190565b60208082526018908201527f496e76616c696420696e636c7573696f6e2070726f6f662e0000000000000000604082015260600190565b6020808252603d908201527f41637475616c20626174636820737461727420696e64657820646f6573206e6f60408201527f74206d6174636820657870656374656420737461727420696e6465782e000000606082015260800190565b60208082526015908201527424b73b30b634b2103130ba31b4103432b0b232b91760591b604082015260600190565b602080825260409082018190527f537461746520626174636865732063616e206f6e6c792062652064656c657465908201527f642077697468696e207468652066726175642070726f6f662077696e646f772e606082015260800190565b6020808252603b908201527f537461746520626174636865732063616e206f6e6c792062652064656c65746560408201527f6420627920746865204f564d5f467261756456657269666965722e0000000000606082015260800190565b60208082526025908201527f4261746368206865616465722074696d657374616d702063616e6e6f74206265604082015264207a65726f60d81b606082015260800190565b60208082526023908201527f43616e6e6f74207375626d697420616e20656d7074792073746174652062617460408201526231b41760e91b606082015260800190565b6020808252602f908201527f50726f706f73657220646f6573206e6f74206861766520656e6f75676820636f60408201526e1b1b185d195c985b081c1bdcdd1959608a1b606082015260800190565b60208082526043908201527f43616e6e6f74207075626c69736820737461746520726f6f747320776974686960408201527f6e207468652073657175656e636572207075626c69636174696f6e2077696e6460608201526237bb9760e91b608082015260a00190565b60208082526014908201527324b73b30b634b2103130ba31b41034b73232bc1760611b604082015260600190565b9182526001600160a01b0316602082015260400190565b60405181810167ffffffffffffffff811182821017156119d457fe5b60405291905056fe4c69625f4d65726b6c65547265653a20496e646578206f7574206f6620626f756e64732e4c69625f4d65726b6c65547265653a2043616e6e6f7420636f6d70757465206365696c286c6f675f3229206f6620302e4c69625f4d65726b6c65547265653a20546f74616c206c6561766573206d7573742062652067726561746572207468616e207a65726f2e4c69625f4d65726b6c65547265653a20546f74616c207369626c696e677320646f6573206e6f7420636f72726563746c7920636f72726573706f6e6420746f20746f74616c206c65617665732e4f564d5f436861696e53746f72616765436f6e7461696e65723a5343433a626174636865734c69625f4d65726b6c65547265653a204d7573742070726f76696465206174206c65617374206f6e65206c65616620686173682ea164736f6c6343000706000a", + "solcInputHash": "5ee8e508e2c54cb5ac6783b4855b1558", + "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_fraudProofWindow\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_sequencerPublishWindow\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_batchIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"_batchRoot\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_batchSize\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_prevTotalElements\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"_extraData\",\"type\":\"bytes\"}],\"name\":\"StateBatchAppended\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_batchIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"_batchRoot\",\"type\":\"bytes32\"}],\"name\":\"StateBatchDeleted\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"FRAUD_PROOF_WINDOW\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"SEQUENCER_PUBLISH_WINDOW\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"_batch\",\"type\":\"bytes32[]\"},{\"internalType\":\"uint256\",\"name\":\"_shouldStartAtElement\",\"type\":\"uint256\"}],\"name\":\"appendStateBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"batches\",\"outputs\":[{\"internalType\":\"contract iOVM_ChainStorageContainer\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"_batchHeader\",\"type\":\"tuple\"}],\"name\":\"deleteStateBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLastSequencerTimestamp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_lastSequencerTimestamp\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTotalBatches\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_totalBatches\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTotalElements\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_totalElements\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"_batchHeader\",\"type\":\"tuple\"}],\"name\":\"insideFraudProofWindow\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"_inside\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_element\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"_batchHeader\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"siblings\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct Lib_OVMCodec.ChainInclusionProof\",\"name\":\"_proof\",\"type\":\"tuple\"}],\"name\":\"verifyStateCommitment\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The State Commitment Chain (SCC) contract contains a list of proposed state roots which Proposers assert to be a result of each transaction in the Canonical Transaction Chain (CTC). Elements here have a 1:1 correspondence with transactions in the CTC, and should be the unique state root calculated off-chain by applying the canonical transactions one by one. Compiler used: solc Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"appendStateBatch(bytes32[],uint256)\":{\"params\":{\"_batch\":\"Batch of state roots.\",\"_shouldStartAtElement\":\"Index of the element at which this batch should start.\"}},\"batches()\":{\"returns\":{\"_0\":\"Reference to the batch storage container.\"}},\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\"}},\"deleteStateBatch((uint256,bytes32,uint256,uint256,bytes))\":{\"params\":{\"_batchHeader\":\"Header of the batch to start deleting from.\"}},\"getLastSequencerTimestamp()\":{\"returns\":{\"_lastSequencerTimestamp\":\"Last sequencer batch timestamp.\"}},\"getTotalBatches()\":{\"returns\":{\"_totalBatches\":\"Total submitted batches.\"}},\"getTotalElements()\":{\"returns\":{\"_totalElements\":\"Total submitted elements.\"}},\"insideFraudProofWindow((uint256,bytes32,uint256,uint256,bytes))\":{\"params\":{\"_batchHeader\":\"Header of the batch to check.\"},\"returns\":{\"_inside\":\"Whether or not the batch is inside the fraud proof window.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}},\"verifyStateCommitment(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))\":{\"params\":{\"_batchHeader\":\"Header of the batch in which the element was included.\",\"_element\":\"Hash of the element to verify a proof for.\",\"_proof\":\"Merkle inclusion proof for the element.\"}}},\"title\":\"OVM_StateCommitmentChain\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"appendStateBatch(bytes32[],uint256)\":{\"notice\":\"Appends a batch of state roots to the chain.\"},\"batches()\":{\"notice\":\"Accesses the batch storage container.\"},\"deleteStateBatch((uint256,bytes32,uint256,uint256,bytes))\":{\"notice\":\"Deletes all state roots after (and including) a given batch.\"},\"getLastSequencerTimestamp()\":{\"notice\":\"Retrieves the timestamp of the last batch submitted by the sequencer.\"},\"getTotalBatches()\":{\"notice\":\"Retrieves the total number of batches submitted.\"},\"getTotalElements()\":{\"notice\":\"Retrieves the total number of elements submitted.\"},\"insideFraudProofWindow((uint256,bytes32,uint256,uint256,bytes))\":{\"notice\":\"Checks whether a given batch is still inside its fraud proof window.\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"},\"verifyStateCommitment(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))\":{\"notice\":\"Verifies a batch inclusion proof.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/OVM/chain/OVM_StateCommitmentChain.sol\":\"OVM_StateCommitmentChain\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor () internal {\\n address msgSender = _msgSender();\\n _owner = msgSender;\\n emit OwnershipTransferred(address(0), msgSender);\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n emit OwnershipTransferred(_owner, address(0));\\n _owner = address(0);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n emit OwnershipTransferred(_owner, newOwner);\\n _owner = newOwner;\\n }\\n}\\n\",\"keccak256\":\"0x15e2d5bd4c28a88548074c54d220e8086f638a71ed07e6b3ba5a70066fcf458d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/math/SafeMath.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\n * checks.\\n *\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\n * in bugs, because programmers usually assume that an overflow raises an\\n * error, which is the standard behavior in high level programming languages.\\n * `SafeMath` restores this intuition by reverting the transaction when an\\n * operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n */\\nlibrary SafeMath {\\n /**\\n * @dev Returns the addition of two unsigned integers, with an overflow flag.\\n *\\n * _Available since v3.4._\\n */\\n function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n uint256 c = a + b;\\n if (c < a) return (false, 0);\\n return (true, c);\\n }\\n\\n /**\\n * @dev Returns the substraction of two unsigned integers, with an overflow flag.\\n *\\n * _Available since v3.4._\\n */\\n function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n if (b > a) return (false, 0);\\n return (true, a - b);\\n }\\n\\n /**\\n * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\\n *\\n * _Available since v3.4._\\n */\\n function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\n // benefit is lost if 'b' is also tested.\\n // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\n if (a == 0) return (true, 0);\\n uint256 c = a * b;\\n if (c / a != b) return (false, 0);\\n return (true, c);\\n }\\n\\n /**\\n * @dev Returns the division of two unsigned integers, with a division by zero flag.\\n *\\n * _Available since v3.4._\\n */\\n function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n if (b == 0) return (false, 0);\\n return (true, a / b);\\n }\\n\\n /**\\n * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\\n *\\n * _Available since v3.4._\\n */\\n function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n if (b == 0) return (false, 0);\\n return (true, a % b);\\n }\\n\\n /**\\n * @dev Returns the addition of two unsigned integers, reverting on\\n * overflow.\\n *\\n * Counterpart to Solidity's `+` operator.\\n *\\n * Requirements:\\n *\\n * - Addition cannot overflow.\\n */\\n function add(uint256 a, uint256 b) internal pure returns (uint256) {\\n uint256 c = a + b;\\n require(c >= a, \\\"SafeMath: addition overflow\\\");\\n return c;\\n }\\n\\n /**\\n * @dev Returns the subtraction of two unsigned integers, reverting on\\n * overflow (when the result is negative).\\n *\\n * Counterpart to Solidity's `-` operator.\\n *\\n * Requirements:\\n *\\n * - Subtraction cannot overflow.\\n */\\n function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\n require(b <= a, \\\"SafeMath: subtraction overflow\\\");\\n return a - b;\\n }\\n\\n /**\\n * @dev Returns the multiplication of two unsigned integers, reverting on\\n * overflow.\\n *\\n * Counterpart to Solidity's `*` operator.\\n *\\n * Requirements:\\n *\\n * - Multiplication cannot overflow.\\n */\\n function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\n if (a == 0) return 0;\\n uint256 c = a * b;\\n require(c / a == b, \\\"SafeMath: multiplication overflow\\\");\\n return c;\\n }\\n\\n /**\\n * @dev Returns the integer division of two unsigned integers, reverting on\\n * division by zero. The result is rounded towards zero.\\n *\\n * Counterpart to Solidity's `/` operator. Note: this function uses a\\n * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n * uses an invalid opcode to revert (consuming all remaining gas).\\n *\\n * Requirements:\\n *\\n * - The divisor cannot be zero.\\n */\\n function div(uint256 a, uint256 b) internal pure returns (uint256) {\\n require(b > 0, \\\"SafeMath: division by zero\\\");\\n return a / b;\\n }\\n\\n /**\\n * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n * reverting when dividing by zero.\\n *\\n * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n * opcode (which leaves remaining gas untouched) while Solidity uses an\\n * invalid opcode to revert (consuming all remaining gas).\\n *\\n * Requirements:\\n *\\n * - The divisor cannot be zero.\\n */\\n function mod(uint256 a, uint256 b) internal pure returns (uint256) {\\n require(b > 0, \\\"SafeMath: modulo by zero\\\");\\n return a % b;\\n }\\n\\n /**\\n * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\n * overflow (when the result is negative).\\n *\\n * CAUTION: This function is deprecated because it requires allocating memory for the error\\n * message unnecessarily. For custom revert reasons use {trySub}.\\n *\\n * Counterpart to Solidity's `-` operator.\\n *\\n * Requirements:\\n *\\n * - Subtraction cannot overflow.\\n */\\n function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n require(b <= a, errorMessage);\\n return a - b;\\n }\\n\\n /**\\n * @dev Returns the integer division of two unsigned integers, reverting with custom message on\\n * division by zero. The result is rounded towards zero.\\n *\\n * CAUTION: This function is deprecated because it requires allocating memory for the error\\n * message unnecessarily. For custom revert reasons use {tryDiv}.\\n *\\n * Counterpart to Solidity's `/` operator. Note: this function uses a\\n * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n * uses an invalid opcode to revert (consuming all remaining gas).\\n *\\n * Requirements:\\n *\\n * - The divisor cannot be zero.\\n */\\n function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n require(b > 0, errorMessage);\\n return a / b;\\n }\\n\\n /**\\n * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n * reverting with custom message when dividing by zero.\\n *\\n * CAUTION: This function is deprecated because it requires allocating memory for the error\\n * message unnecessarily. For custom revert reasons use {tryMod}.\\n *\\n * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n * opcode (which leaves remaining gas untouched) while Solidity uses an\\n * invalid opcode to revert (consuming all remaining gas).\\n *\\n * Requirements:\\n *\\n * - The divisor cannot be zero.\\n */\\n function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n require(b > 0, errorMessage);\\n return a % b;\\n }\\n}\\n\",\"keccak256\":\"0xcc78a17dd88fa5a2edc60c8489e2f405c0913b377216a5b26b35656b2d0dab52\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with GSN meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address payable) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes memory) {\\n this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x8d3cb350f04ff49cfb10aef08d87f19dcbaecc8027b0bed12f3275cd12f38cf0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/chain/OVM_StateCommitmentChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\nimport { Lib_MerkleTree } from \\\"../../libraries/utils/Lib_MerkleTree.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_FraudVerifier } from \\\"../../iOVM/verification/iOVM_FraudVerifier.sol\\\";\\nimport { iOVM_StateCommitmentChain } from \\\"../../iOVM/chain/iOVM_StateCommitmentChain.sol\\\";\\nimport { iOVM_CanonicalTransactionChain } from \\\"../../iOVM/chain/iOVM_CanonicalTransactionChain.sol\\\";\\nimport { iOVM_BondManager } from \\\"../../iOVM/verification/iOVM_BondManager.sol\\\";\\nimport { iOVM_ChainStorageContainer } from \\\"../../iOVM/chain/iOVM_ChainStorageContainer.sol\\\";\\n\\n/* External Imports */\\nimport '@openzeppelin/contracts/math/SafeMath.sol';\\n\\n/**\\n * @title OVM_StateCommitmentChain\\n * @dev The State Commitment Chain (SCC) contract contains a list of proposed state roots which\\n * Proposers assert to be a result of each transaction in the Canonical Transaction Chain (CTC).\\n * Elements here have a 1:1 correspondence with transactions in the CTC, and should be the unique\\n * state root calculated off-chain by applying the canonical transactions one by one.\\n *\\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract OVM_StateCommitmentChain is iOVM_StateCommitmentChain, Lib_AddressResolver {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 public FRAUD_PROOF_WINDOW;\\n uint256 public SEQUENCER_PUBLISH_WINDOW;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n */\\n constructor(\\n address _libAddressManager,\\n uint256 _fraudProofWindow,\\n uint256 _sequencerPublishWindow\\n )\\n Lib_AddressResolver(_libAddressManager)\\n {\\n FRAUD_PROOF_WINDOW = _fraudProofWindow;\\n SEQUENCER_PUBLISH_WINDOW = _sequencerPublishWindow;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Accesses the batch storage container.\\n * @return Reference to the batch storage container.\\n */\\n function batches()\\n public\\n view\\n returns (\\n iOVM_ChainStorageContainer\\n )\\n {\\n return iOVM_ChainStorageContainer(\\n resolve(\\\"OVM_ChainStorageContainer:SCC:batches\\\")\\n );\\n }\\n\\n /**\\n * @inheritdoc iOVM_StateCommitmentChain\\n */\\n function getTotalElements()\\n override\\n public\\n view\\n returns (\\n uint256 _totalElements\\n )\\n {\\n (uint40 totalElements, ) = _getBatchExtraData();\\n return uint256(totalElements);\\n }\\n\\n /**\\n * @inheritdoc iOVM_StateCommitmentChain\\n */\\n function getTotalBatches()\\n override\\n public\\n view\\n returns (\\n uint256 _totalBatches\\n )\\n {\\n return batches().length();\\n }\\n\\n /**\\n * @inheritdoc iOVM_StateCommitmentChain\\n */\\n function getLastSequencerTimestamp()\\n override\\n public\\n view\\n returns (\\n uint256 _lastSequencerTimestamp\\n )\\n {\\n (, uint40 lastSequencerTimestamp) = _getBatchExtraData();\\n return uint256(lastSequencerTimestamp);\\n }\\n\\n /**\\n * @inheritdoc iOVM_StateCommitmentChain\\n */\\n function appendStateBatch(\\n bytes32[] memory _batch,\\n uint256 _shouldStartAtElement\\n )\\n override\\n public\\n {\\n // Fail fast in to make sure our batch roots aren't accidentally made fraudulent by the\\n // publication of batches by some other user.\\n require(\\n _shouldStartAtElement == getTotalElements(),\\n \\\"Actual batch start index does not match expected start index.\\\"\\n );\\n\\n // Proposers must have previously staked at the BondManager\\n require(\\n iOVM_BondManager(resolve(\\\"OVM_BondManager\\\")).isCollateralized(msg.sender),\\n \\\"Proposer does not have enough collateral posted\\\"\\n );\\n\\n require(\\n _batch.length > 0,\\n \\\"Cannot submit an empty state batch.\\\"\\n );\\n\\n require(\\n getTotalElements() + _batch.length <= iOVM_CanonicalTransactionChain(resolve(\\\"OVM_CanonicalTransactionChain\\\")).getTotalElements(),\\n \\\"Number of state roots cannot exceed the number of canonical transactions.\\\"\\n );\\n\\n // Pass the block's timestamp and the publisher of the data\\n // to be used in the fraud proofs\\n _appendBatch(\\n _batch,\\n abi.encode(block.timestamp, msg.sender)\\n );\\n }\\n\\n /**\\n * @inheritdoc iOVM_StateCommitmentChain\\n */\\n function deleteStateBatch(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n override\\n public\\n {\\n require(\\n msg.sender == resolve(\\\"OVM_FraudVerifier\\\"),\\n \\\"State batches can only be deleted by the OVM_FraudVerifier.\\\"\\n );\\n\\n require(\\n _isValidBatchHeader(_batchHeader),\\n \\\"Invalid batch header.\\\"\\n );\\n\\n require(\\n insideFraudProofWindow(_batchHeader),\\n \\\"State batches can only be deleted within the fraud proof window.\\\"\\n );\\n\\n _deleteBatch(_batchHeader);\\n }\\n\\n /**\\n * @inheritdoc iOVM_StateCommitmentChain\\n */\\n function verifyStateCommitment(\\n bytes32 _element,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _proof\\n )\\n override\\n public\\n view\\n returns (\\n bool\\n )\\n {\\n require(\\n _isValidBatchHeader(_batchHeader),\\n \\\"Invalid batch header.\\\"\\n );\\n\\n require(\\n Lib_MerkleTree.verify(\\n _batchHeader.batchRoot,\\n _element,\\n _proof.index,\\n _proof.siblings,\\n _batchHeader.batchSize\\n ),\\n \\\"Invalid inclusion proof.\\\"\\n );\\n\\n return true;\\n }\\n\\n /**\\n * @inheritdoc iOVM_StateCommitmentChain\\n */\\n function insideFraudProofWindow(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n override\\n public\\n view\\n returns (\\n bool _inside\\n )\\n {\\n (uint256 timestamp,) = abi.decode(\\n _batchHeader.extraData,\\n (uint256, address)\\n );\\n\\n require(\\n timestamp != 0,\\n \\\"Batch header timestamp cannot be zero\\\"\\n );\\n return SafeMath.add(timestamp, FRAUD_PROOF_WINDOW) > block.timestamp;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Parses the batch context from the extra data.\\n * @return Total number of elements submitted.\\n * @return Timestamp of the last batch submitted by the sequencer.\\n */\\n function _getBatchExtraData()\\n internal\\n view\\n returns (\\n uint40,\\n uint40\\n )\\n {\\n bytes27 extraData = batches().getGlobalMetadata();\\n\\n uint40 totalElements;\\n uint40 lastSequencerTimestamp;\\n assembly {\\n extraData := shr(40, extraData)\\n totalElements := and(extraData, 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF)\\n lastSequencerTimestamp := shr(40, and(extraData, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000))\\n }\\n\\n return (\\n totalElements,\\n lastSequencerTimestamp\\n );\\n }\\n\\n /**\\n * Encodes the batch context for the extra data.\\n * @param _totalElements Total number of elements submitted.\\n * @param _lastSequencerTimestamp Timestamp of the last batch submitted by the sequencer.\\n * @return Encoded batch context.\\n */\\n function _makeBatchExtraData(\\n uint40 _totalElements,\\n uint40 _lastSequencerTimestamp\\n )\\n internal\\n pure\\n returns (\\n bytes27\\n )\\n {\\n bytes27 extraData;\\n assembly {\\n extraData := _totalElements\\n extraData := or(extraData, shl(40, _lastSequencerTimestamp))\\n extraData := shl(40, extraData)\\n }\\n\\n return extraData;\\n }\\n\\n /**\\n * Appends a batch to the chain.\\n * @param _batch Elements within the batch.\\n * @param _extraData Any extra data to append to the batch.\\n */\\n function _appendBatch(\\n bytes32[] memory _batch,\\n bytes memory _extraData\\n )\\n internal\\n {\\n address sequencer = resolve(\\\"OVM_Proposer\\\");\\n (uint40 totalElements, uint40 lastSequencerTimestamp) = _getBatchExtraData();\\n\\n if (msg.sender == sequencer) {\\n lastSequencerTimestamp = uint40(block.timestamp);\\n } else {\\n // We keep track of the last batch submitted by the sequencer so there's a window in\\n // which only the sequencer can publish state roots. A window like this just reduces\\n // the chance of \\\"system breaking\\\" state roots being published while we're still in\\n // testing mode. This window should be removed or significantly reduced in the future.\\n require(\\n lastSequencerTimestamp + SEQUENCER_PUBLISH_WINDOW < block.timestamp,\\n \\\"Cannot publish state roots within the sequencer publication window.\\\"\\n );\\n }\\n\\n // For efficiency reasons getMerkleRoot modifies the `_batch` argument in place\\n // while calculating the root hash therefore any arguments passed to it must not\\n // be used again afterwards\\n Lib_OVMCodec.ChainBatchHeader memory batchHeader = Lib_OVMCodec.ChainBatchHeader({\\n batchIndex: getTotalBatches(),\\n batchRoot: Lib_MerkleTree.getMerkleRoot(_batch),\\n batchSize: _batch.length,\\n prevTotalElements: totalElements,\\n extraData: _extraData\\n });\\n\\n emit StateBatchAppended(\\n batchHeader.batchIndex,\\n batchHeader.batchRoot,\\n batchHeader.batchSize,\\n batchHeader.prevTotalElements,\\n batchHeader.extraData\\n );\\n\\n batches().push(\\n Lib_OVMCodec.hashBatchHeader(batchHeader),\\n _makeBatchExtraData(\\n uint40(batchHeader.prevTotalElements + batchHeader.batchSize),\\n lastSequencerTimestamp\\n )\\n );\\n }\\n\\n /**\\n * Removes a batch and all subsequent batches from the chain.\\n * @param _batchHeader Header of the batch to remove.\\n */\\n function _deleteBatch(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n internal\\n {\\n require(\\n _batchHeader.batchIndex < batches().length(),\\n \\\"Invalid batch index.\\\"\\n );\\n\\n require(\\n _isValidBatchHeader(_batchHeader),\\n \\\"Invalid batch header.\\\"\\n );\\n\\n batches().deleteElementsAfterInclusive(\\n _batchHeader.batchIndex,\\n _makeBatchExtraData(\\n uint40(_batchHeader.prevTotalElements),\\n 0\\n )\\n );\\n\\n emit StateBatchDeleted(\\n _batchHeader.batchIndex,\\n _batchHeader.batchRoot\\n );\\n }\\n\\n /**\\n * Checks that a batch header matches the stored hash for the given index.\\n * @param _batchHeader Batch header to validate.\\n * @return Whether or not the header matches the stored one.\\n */\\n function _isValidBatchHeader(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n internal\\n view\\n returns (\\n bool\\n )\\n {\\n return Lib_OVMCodec.hashBatchHeader(_batchHeader) == batches().get(_batchHeader.batchIndex);\\n }\\n}\\n\",\"keccak256\":\"0x5b72c845f856a06c978880d3cb2db40dafebaebf399df100c6ac832eaf41d7bd\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_CanonicalTransactionChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_ChainStorageContainer } from \\\"./iOVM_ChainStorageContainer.sol\\\";\\n\\n/**\\n * @title iOVM_CanonicalTransactionChain\\n */\\ninterface iOVM_CanonicalTransactionChain {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event TransactionEnqueued(\\n address _l1TxOrigin,\\n address _target,\\n uint256 _gasLimit,\\n bytes _data,\\n uint256 _queueIndex,\\n uint256 _timestamp\\n );\\n\\n event QueueBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event SequencerBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event TransactionBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct BatchContext {\\n uint256 numSequencedTransactions;\\n uint256 numSubsequentQueueTransactions;\\n uint256 timestamp;\\n uint256 blockNumber;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n\\n /**\\n * Accesses the batch storage container.\\n * @return Reference to the batch storage container.\\n */\\n function batches()\\n external\\n view\\n returns (\\n iOVM_ChainStorageContainer\\n );\\n\\n /**\\n * Accesses the queue storage container.\\n * @return Reference to the queue storage container.\\n */\\n function queue()\\n external\\n view\\n returns (\\n iOVM_ChainStorageContainer\\n );\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements()\\n external\\n view\\n returns (\\n uint256 _totalElements\\n );\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches()\\n external\\n view\\n returns (\\n uint256 _totalBatches\\n );\\n\\n /**\\n * Returns the index of the next element to be enqueued.\\n * @return Index for the next queue element.\\n */\\n function getNextQueueIndex()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Gets the queue element at a particular index.\\n * @param _index Index of the queue element to access.\\n * @return _element Queue element at the given index.\\n */\\n function getQueueElement(\\n uint256 _index\\n )\\n external\\n view\\n returns (\\n Lib_OVMCodec.QueueElement memory _element\\n );\\n\\n /**\\n * Returns the timestamp of the last transaction.\\n * @return Timestamp for the last transaction.\\n */\\n function getLastTimestamp()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Returns the blocknumber of the last transaction.\\n * @return Blocknumber for the last transaction.\\n */\\n function getLastBlockNumber()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Get the number of queue elements which have not yet been included.\\n * @return Number of pending queue elements.\\n */\\n function getNumPendingQueueElements()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Retrieves the length of the queue, including\\n * both pending and canonical transactions.\\n * @return Length of the queue.\\n */\\n function getQueueLength()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n\\n /**\\n * Adds a transaction to the queue.\\n * @param _target Target contract to send the transaction to.\\n * @param _gasLimit Gas limit for the given transaction.\\n * @param _data Transaction data.\\n */\\n function enqueue(\\n address _target,\\n uint256 _gasLimit,\\n bytes memory _data\\n )\\n external;\\n\\n /**\\n * Appends a given number of queued transactions as a single batch.\\n * @param _numQueuedTransactions Number of transactions to append.\\n */\\n function appendQueueBatch(\\n uint256 _numQueuedTransactions\\n )\\n external;\\n\\n /**\\n * Allows the sequencer to append a batch of transactions.\\n * @dev This function uses a custom encoding scheme for efficiency reasons.\\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\\n * .param _contexts Array of batch contexts.\\n * .param _transactionDataFields Array of raw transaction data.\\n */\\n function appendSequencerBatch(\\n // uint40 _shouldStartAtElement,\\n // uint24 _totalElementsToAppend,\\n // BatchContext[] _contexts,\\n // bytes[] _transactionDataFields\\n )\\n external;\\n\\n /**\\n * Verifies whether a transaction is included in the chain.\\n * @param _transaction Transaction to verify.\\n * @param _txChainElement Transaction chain element corresponding to the transaction.\\n * @param _batchHeader Header of the batch the transaction was included in.\\n * @param _inclusionProof Inclusion proof for the provided transaction chain element.\\n * @return True if the transaction exists in the CTC, false if not.\\n */\\n function verifyTransaction(\\n Lib_OVMCodec.Transaction memory _transaction,\\n Lib_OVMCodec.TransactionChainElement memory _txChainElement,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _inclusionProof\\n )\\n external\\n view\\n returns (\\n bool\\n );\\n}\\n\",\"keccak256\":\"0xb5e55488a1982841c07cdf5ff475da4789596f111dd48f01b1918ee4c775cf3a\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_ChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title iOVM_ChainStorageContainer\\n */\\ninterface iOVM_ChainStorageContainer {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata()\\n external\\n view\\n returns (\\n bytes27\\n );\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length()\\n external\\n view\\n returns (\\n uint256\\n );\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(\\n bytes32 _object\\n )\\n external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(\\n bytes32 _object,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(\\n uint256 _index\\n )\\n external\\n view\\n returns (\\n bytes32\\n );\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index\\n )\\n external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Marks an index as overwritable, meaing the underlying buffer can start to write values over\\n * any objects before and including the given index.\\n */\\n function setNextOverwritableIndex(\\n uint256 _index\\n )\\n external;\\n}\\n\",\"keccak256\":\"0x2d7973a0ad84c23ec62624d3f1e3aeb198cc72686ff1e6cfa17155556b320c94\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/chain/iOVM_StateCommitmentChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title iOVM_StateCommitmentChain\\n */\\ninterface iOVM_StateCommitmentChain {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event StateBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n event StateBatchDeleted(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot\\n );\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements()\\n external\\n view\\n returns (\\n uint256 _totalElements\\n );\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches()\\n external\\n view\\n returns (\\n uint256 _totalBatches\\n );\\n\\n /**\\n * Retrieves the timestamp of the last batch submitted by the sequencer.\\n * @return _lastSequencerTimestamp Last sequencer batch timestamp.\\n */\\n function getLastSequencerTimestamp()\\n external\\n view\\n returns (\\n uint256 _lastSequencerTimestamp\\n );\\n\\n /**\\n * Appends a batch of state roots to the chain.\\n * @param _batch Batch of state roots.\\n * @param _shouldStartAtElement Index of the element at which this batch should start.\\n */\\n function appendStateBatch(\\n bytes32[] calldata _batch,\\n uint256 _shouldStartAtElement\\n )\\n external;\\n\\n /**\\n * Deletes all state roots after (and including) a given batch.\\n * @param _batchHeader Header of the batch to start deleting from.\\n */\\n function deleteStateBatch(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n external;\\n\\n /**\\n * Verifies a batch inclusion proof.\\n * @param _element Hash of the element to verify a proof for.\\n * @param _batchHeader Header of the batch in which the element was included.\\n * @param _proof Merkle inclusion proof for the element.\\n */\\n function verifyStateCommitment(\\n bytes32 _element,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _proof\\n )\\n external\\n view\\n returns (\\n bool _verified\\n );\\n\\n /**\\n * Checks whether a given batch is still inside its fraud proof window.\\n * @param _batchHeader Header of the batch to check.\\n * @return _inside Whether or not the batch is inside the fraud proof window.\\n */\\n function insideFraudProofWindow(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n external\\n view\\n returns (\\n bool _inside\\n );\\n}\\n\",\"keccak256\":\"0x6646d6ff392b81aab52a7a277e91540819464751de0af5afd1962094b2e92448\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/verification/iOVM_BondManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\ninterface ERC20 {\\n function transfer(address, uint256) external returns (bool);\\n function transferFrom(address, address, uint256) external returns (bool);\\n}\\n\\n/// All the errors which may be encountered on the bond manager\\nlibrary Errors {\\n string constant ERC20_ERR = \\\"BondManager: Could not post bond\\\";\\n string constant ALREADY_FINALIZED = \\\"BondManager: Fraud proof for this pre-state root has already been finalized\\\";\\n string constant SLASHED = \\\"BondManager: Cannot finalize withdrawal, you probably got slashed\\\";\\n string constant WRONG_STATE = \\\"BondManager: Wrong bond state for proposer\\\";\\n string constant CANNOT_CLAIM = \\\"BondManager: Cannot claim yet. Dispute must be finalized first\\\";\\n\\n string constant WITHDRAWAL_PENDING = \\\"BondManager: Withdrawal already pending\\\";\\n string constant TOO_EARLY = \\\"BondManager: Too early to finalize your withdrawal\\\";\\n\\n string constant ONLY_TRANSITIONER = \\\"BondManager: Only the transitioner for this pre-state root may call this function\\\";\\n string constant ONLY_FRAUD_VERIFIER = \\\"BondManager: Only the fraud verifier may call this function\\\";\\n string constant ONLY_STATE_COMMITMENT_CHAIN = \\\"BondManager: Only the state commitment chain may call this function\\\";\\n string constant WAIT_FOR_DISPUTES = \\\"BondManager: Wait for other potential disputes\\\";\\n}\\n\\n/**\\n * @title iOVM_BondManager\\n */\\ninterface iOVM_BondManager {\\n\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n /// The lifecycle of a proposer's bond\\n enum State {\\n // Before depositing or after getting slashed, a user is uncollateralized\\n NOT_COLLATERALIZED,\\n // After depositing, a user is collateralized\\n COLLATERALIZED,\\n // After a user has initiated a withdrawal\\n WITHDRAWING\\n }\\n\\n /// A bond posted by a proposer\\n struct Bond {\\n // The user's state\\n State state;\\n // The timestamp at which a proposer issued their withdrawal request\\n uint32 withdrawalTimestamp;\\n // The time when the first disputed was initiated for this bond\\n uint256 firstDisputeAt;\\n // The earliest observed state root for this bond which has had fraud\\n bytes32 earliestDisputedStateRoot;\\n // The state root's timestamp\\n uint256 earliestTimestamp;\\n }\\n\\n // Per pre-state root, store the number of state provisions that were made\\n // and how many of these calls were made by each user. Payouts will then be\\n // claimed by users proportionally for that dispute.\\n struct Rewards {\\n // Flag to check if rewards for a fraud proof are claimable\\n bool canClaim;\\n // Total number of `recordGasSpent` calls made\\n uint256 total;\\n // The gas spent by each user to provide witness data. The sum of all\\n // values inside this map MUST be equal to the value of `total`\\n mapping(address => uint256) gasSpent;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function recordGasSpent(\\n bytes32 _preStateRoot,\\n bytes32 _txHash,\\n address _who,\\n uint256 _gasSpent\\n ) external;\\n\\n function finalize(\\n bytes32 _preStateRoot,\\n address _publisher,\\n uint256 _timestamp\\n ) external;\\n\\n function deposit() external;\\n\\n function startWithdrawal() external;\\n\\n function finalizeWithdrawal() external;\\n\\n function claim(\\n address _who\\n ) external;\\n\\n function isCollateralized(\\n address _who\\n ) external view returns (bool);\\n\\n function getGasSpent(\\n bytes32 _preStateRoot,\\n address _who\\n ) external view returns (uint256);\\n}\\n\",\"keccak256\":\"0x3c2a8a399487857158649db1896749d86e39cba545a8aeb2e2bb0f3bdfa7a5b1\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/verification/iOVM_FraudVerifier.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_StateTransitioner } from \\\"./iOVM_StateTransitioner.sol\\\";\\n\\n/**\\n * @title iOVM_FraudVerifier\\n */\\ninterface iOVM_FraudVerifier {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event FraudProofInitialized(\\n bytes32 _preStateRoot,\\n uint256 _preStateRootIndex,\\n bytes32 _transactionHash,\\n address _who\\n );\\n\\n event FraudProofFinalized(\\n bytes32 _preStateRoot,\\n uint256 _preStateRootIndex,\\n bytes32 _transactionHash,\\n address _who\\n );\\n\\n\\n /***************************************\\n * Public Functions: Transition Status *\\n ***************************************/\\n\\n function getStateTransitioner(bytes32 _preStateRoot, bytes32 _txHash) external view returns (iOVM_StateTransitioner _transitioner);\\n\\n\\n /****************************************\\n * Public Functions: Fraud Verification *\\n ****************************************/\\n\\n function initializeFraudVerification(\\n bytes32 _preStateRoot,\\n Lib_OVMCodec.ChainBatchHeader calldata _preStateRootBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof calldata _preStateRootProof,\\n Lib_OVMCodec.Transaction calldata _transaction,\\n Lib_OVMCodec.TransactionChainElement calldata _txChainElement,\\n Lib_OVMCodec.ChainBatchHeader calldata _transactionBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof calldata _transactionProof\\n ) external;\\n\\n function finalizeFraudVerification(\\n bytes32 _preStateRoot,\\n Lib_OVMCodec.ChainBatchHeader calldata _preStateRootBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof calldata _preStateRootProof,\\n bytes32 _txHash,\\n bytes32 _postStateRoot,\\n Lib_OVMCodec.ChainBatchHeader calldata _postStateRootBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof calldata _postStateRootProof\\n ) external;\\n}\\n\",\"keccak256\":\"0x5efd7bb18164bbd3e9d58379e8203fbf2a7ee802b1a48dff3ceaaec1523b1751\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/verification/iOVM_StateTransitioner.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title iOVM_StateTransitioner\\n */\\ninterface iOVM_StateTransitioner {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AccountCommitted(\\n address _address\\n );\\n\\n event ContractStorageCommitted(\\n address _address,\\n bytes32 _key\\n );\\n\\n\\n /**********************************\\n * Public Functions: State Access *\\n **********************************/\\n\\n function getPreStateRoot() external view returns (bytes32 _preStateRoot);\\n function getPostStateRoot() external view returns (bytes32 _postStateRoot);\\n function isComplete() external view returns (bool _complete);\\n\\n\\n /***********************************\\n * Public Functions: Pre-Execution *\\n ***********************************/\\n\\n function proveContractState(\\n address _ovmContractAddress,\\n address _ethContractAddress,\\n bytes calldata _stateTrieWitness\\n ) external;\\n\\n function proveStorageSlot(\\n address _ovmContractAddress,\\n bytes32 _key,\\n bytes calldata _storageTrieWitness\\n ) external;\\n\\n\\n /*******************************\\n * Public Functions: Execution *\\n *******************************/\\n\\n function applyTransaction(\\n Lib_OVMCodec.Transaction calldata _transaction\\n ) external;\\n\\n\\n /************************************\\n * Public Functions: Post-Execution *\\n ************************************/\\n\\n function commitContractState(\\n address _ovmContractAddress,\\n bytes calldata _stateTrieWitness\\n ) external;\\n\\n function commitStorageSlot(\\n address _ovmContractAddress,\\n bytes32 _key,\\n bytes calldata _storageTrieWitness\\n ) external;\\n\\n\\n /**********************************\\n * Public Functions: Finalization *\\n **********************************/\\n\\n function completeTransition() external;\\n}\\n\",\"keccak256\":\"0x3d044ac0a3bb6ad3d529f904b3191117511f9c379678ca03010e1ebdfcb5c34b\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/codec/Lib_OVMCodec.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../utils/Lib_Bytes32Utils.sol\\\";\\n\\n/**\\n * @title Lib_OVMCodec\\n */\\nlibrary Lib_OVMCodec {\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum QueueOrigin {\\n SEQUENCER_QUEUE,\\n L1TOL2_QUEUE\\n }\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Account {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n address ethAddress;\\n bool isFresh;\\n }\\n\\n struct EVMAccount {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n }\\n\\n struct ChainBatchHeader {\\n uint256 batchIndex;\\n bytes32 batchRoot;\\n uint256 batchSize;\\n uint256 prevTotalElements;\\n bytes extraData;\\n }\\n\\n struct ChainInclusionProof {\\n uint256 index;\\n bytes32[] siblings;\\n }\\n\\n struct Transaction {\\n uint256 timestamp;\\n uint256 blockNumber;\\n QueueOrigin l1QueueOrigin;\\n address l1TxOrigin;\\n address entrypoint;\\n uint256 gasLimit;\\n bytes data;\\n }\\n\\n struct TransactionChainElement {\\n bool isSequenced;\\n uint256 queueIndex; // QUEUED TX ONLY\\n uint256 timestamp; // SEQUENCER TX ONLY\\n uint256 blockNumber; // SEQUENCER TX ONLY\\n bytes txData; // SEQUENCER TX ONLY\\n }\\n\\n struct QueueElement {\\n bytes32 transactionHash;\\n uint40 timestamp;\\n uint40 blockNumber;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Encodes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Encoded transaction bytes.\\n */\\n function encodeTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return abi.encodePacked(\\n _transaction.timestamp,\\n _transaction.blockNumber,\\n _transaction.l1QueueOrigin,\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n );\\n }\\n\\n /**\\n * Hashes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Hashed transaction\\n */\\n function hashTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(encodeTransaction(_transaction));\\n }\\n\\n /**\\n * Converts an OVM account to an EVM account.\\n * @param _in OVM account to convert.\\n * @return Converted EVM account.\\n */\\n function toEVMAccount(\\n Account memory _in\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n return EVMAccount({\\n nonce: _in.nonce,\\n balance: _in.balance,\\n storageRoot: _in.storageRoot,\\n codeHash: _in.codeHash\\n });\\n }\\n\\n /**\\n * @notice RLP-encodes an account state struct.\\n * @param _account Account state struct.\\n * @return RLP-encoded account state.\\n */\\n function encodeEVMAccount(\\n EVMAccount memory _account\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes[] memory raw = new bytes[](4);\\n\\n // Unfortunately we can't create this array outright because\\n // Lib_RLPWriter.writeList will reject fixed-size arrays. Assigning\\n // index-by-index circumvents this issue.\\n raw[0] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.nonce)\\n )\\n );\\n raw[1] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.balance)\\n )\\n );\\n raw[2] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.storageRoot));\\n raw[3] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.codeHash));\\n\\n return Lib_RLPWriter.writeList(raw);\\n }\\n\\n /**\\n * @notice Decodes an RLP-encoded account state into a useful struct.\\n * @param _encoded RLP-encoded account state.\\n * @return Account state struct.\\n */\\n function decodeEVMAccount(\\n bytes memory _encoded\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\\n\\n return EVMAccount({\\n nonce: Lib_RLPReader.readUint256(accountState[0]),\\n balance: Lib_RLPReader.readUint256(accountState[1]),\\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\\n });\\n }\\n\\n /**\\n * Calculates a hash for a given batch header.\\n * @param _batchHeader Header to hash.\\n * @return Hash of the header.\\n */\\n function hashBatchHeader(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(\\n abi.encode(\\n _batchHeader.batchRoot,\\n _batchHeader.batchSize,\\n _batchHeader.prevTotalElements,\\n _batchHeader.extraData\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0xd85ba2066057a2677926f484b938c7c2ef33ff3853f3b71cda252f4a54f30e05\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n public\\n onlyOwner\\n {\\n addresses[_getNameHash(_name)] = _address;\\n\\n emit AddressSet(\\n _name,\\n _address\\n );\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0x2ce671a0e004df88b136bea5a3c59d0732cea8887c8496da1d509e0200b03d7d\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(\\n address _libAddressManager\\n ) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x65981feeabff6a81783ea97d44baf988a18a86c8cb374c46fdb71819cbacc7c0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPReader.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_RLPReader\\n * @dev Adapted from \\\"RLPReader\\\" by Hamdi Allam (hamdi.allam97@gmail.com).\\n */\\nlibrary Lib_RLPReader {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 constant internal MAX_LIST_LENGTH = 32;\\n\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum RLPItemType {\\n DATA_ITEM,\\n LIST_ITEM\\n }\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct RLPItem {\\n uint256 length;\\n uint256 ptr;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts bytes to a reference to memory position and length.\\n * @param _in Input bytes to convert.\\n * @return Output memory reference.\\n */\\n function toRLPItem(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem memory\\n )\\n {\\n uint256 ptr;\\n assembly {\\n ptr := add(_in, 32)\\n }\\n\\n return RLPItem({\\n length: _in.length,\\n ptr: ptr\\n });\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n (\\n uint256 listOffset,\\n ,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.LIST_ITEM,\\n \\\"Invalid RLP list value.\\\"\\n );\\n\\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\\n // writing to the length. Since we can't know the number of RLP items without looping over\\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\\n // simply set a reasonable maximum list length and decrease the size before we finish.\\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\\n\\n uint256 itemCount = 0;\\n uint256 offset = listOffset;\\n while (offset < _in.length) {\\n require(\\n itemCount < MAX_LIST_LENGTH,\\n \\\"Provided RLP list exceeds max list length.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n ) = _decodeLength(RLPItem({\\n length: _in.length - offset,\\n ptr: _in.ptr + offset\\n }));\\n\\n out[itemCount] = RLPItem({\\n length: itemLength + itemOffset,\\n ptr: _in.ptr + offset\\n });\\n\\n itemCount += 1;\\n offset += itemOffset + itemLength;\\n }\\n\\n // Decrease the array size to match the actual item count.\\n assembly {\\n mstore(out, itemCount)\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n return readList(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes value.\\\"\\n );\\n\\n return _copy(_in.ptr, itemOffset, itemLength);\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return readBytes(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return string(readBytes(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return readString(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n require(\\n _in.length <= 33,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr + itemOffset;\\n bytes32 out;\\n assembly {\\n out := mload(ptr)\\n\\n // Shift the bytes over to match the item size.\\n if lt(itemLength, 32) {\\n out := div(out, exp(256, sub(32, itemLength)))\\n }\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return readBytes32(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return uint256(readBytes32(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return readUint256(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n require(\\n _in.length == 1,\\n \\\"Invalid RLP boolean value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 out;\\n assembly {\\n out := byte(0, mload(ptr))\\n }\\n\\n require(\\n out == 0 || out == 1,\\n \\\"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\\\"\\n );\\n\\n return out != 0;\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return readBool(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n if (_in.length == 1) {\\n return address(0);\\n }\\n\\n require(\\n _in.length == 21,\\n \\\"Invalid RLP address value.\\\"\\n );\\n\\n return address(readUint256(_in));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return readAddress(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads the raw bytes of an RLP item.\\n * @param _in RLP item to read.\\n * @return Raw RLP bytes.\\n */\\n function readRawBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in);\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Decodes the length of an RLP item.\\n * @param _in RLP item to decode.\\n * @return Offset of the encoded data.\\n * @return Length of the encoded data.\\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\\n */\\n function _decodeLength(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n uint256,\\n uint256,\\n RLPItemType\\n )\\n {\\n require(\\n _in.length > 0,\\n \\\"RLP item cannot be null.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 prefix;\\n assembly {\\n prefix := byte(0, mload(ptr))\\n }\\n\\n if (prefix <= 0x7f) {\\n // Single byte.\\n\\n return (0, 1, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xb7) {\\n // Short string.\\n\\n uint256 strLen = prefix - 0x80;\\n\\n require(\\n _in.length > strLen,\\n \\\"Invalid RLP short string.\\\"\\n );\\n\\n return (1, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xbf) {\\n // Long string.\\n uint256 lenOfStrLen = prefix - 0xb7;\\n\\n require(\\n _in.length > lenOfStrLen,\\n \\\"Invalid RLP long string length.\\\"\\n );\\n\\n uint256 strLen;\\n assembly {\\n // Pick out the string length.\\n strLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfStrLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfStrLen + strLen,\\n \\\"Invalid RLP long string.\\\"\\n );\\n\\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xf7) {\\n // Short list.\\n uint256 listLen = prefix - 0xc0;\\n\\n require(\\n _in.length > listLen,\\n \\\"Invalid RLP short list.\\\"\\n );\\n\\n return (1, listLen, RLPItemType.LIST_ITEM);\\n } else {\\n // Long list.\\n uint256 lenOfListLen = prefix - 0xf7;\\n\\n require(\\n _in.length > lenOfListLen,\\n \\\"Invalid RLP long list length.\\\"\\n );\\n\\n uint256 listLen;\\n assembly {\\n // Pick out the list length.\\n listLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfListLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfListLen + listLen,\\n \\\"Invalid RLP long list.\\\"\\n );\\n\\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\\n }\\n }\\n\\n /**\\n * Copies the bytes from a memory location.\\n * @param _src Pointer to the location to read from.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Copied bytes.\\n */\\n function _copy(\\n uint256 _src,\\n uint256 _offset,\\n uint256 _length\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out = new bytes(_length);\\n if (out.length == 0) {\\n return out;\\n }\\n\\n uint256 src = _src + _offset;\\n uint256 dest;\\n assembly {\\n dest := add(out, 32)\\n }\\n\\n // Copy over as many complete words as we can.\\n for (uint256 i = 0; i < _length / 32; i++) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n\\n src += 32;\\n dest += 32;\\n }\\n\\n // Pick out the remaining bytes.\\n uint256 mask = 256 ** (32 - (_length % 32)) - 1;\\n assembly {\\n mstore(\\n dest,\\n or(\\n and(mload(src), not(mask)),\\n and(mload(dest), mask)\\n )\\n )\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Copies an RLP item into bytes.\\n * @param _in RLP item to copy.\\n * @return Copied bytes.\\n */\\n function _copy(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in.ptr, 0, _in.length);\\n }\\n}\\n\",\"keccak256\":\"0x829174c61216dce35fdb888383b6022e0365eb7fbdc71ad79d98b108091969fe\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPWriter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/**\\n * @title Lib_RLPWriter\\n * @author Bakaoh (with modifications)\\n */\\nlibrary Lib_RLPWriter {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * RLP encodes a byte string.\\n * @param _in The byte string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded;\\n\\n if (_in.length == 1 && uint8(_in[0]) < 128) {\\n encoded = _in;\\n } else {\\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * RLP encodes a list of RLP encoded byte byte strings.\\n * @param _in The list of RLP encoded byte strings.\\n * @return The RLP encoded list of items in bytes.\\n */\\n function writeList(\\n bytes[] memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory list = _flatten(_in);\\n return abi.encodePacked(_writeLength(list.length, 192), list);\\n }\\n\\n /**\\n * RLP encodes a string.\\n * @param _in The string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeString(\\n string memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(bytes(_in));\\n }\\n\\n /**\\n * RLP encodes an address.\\n * @param _in The address to encode.\\n * @return The RLP encoded address in bytes.\\n */\\n function writeAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a bytes32 value.\\n * @param _in The bytes32 to encode.\\n * @return _out The RLP encoded bytes32 in bytes.\\n */\\n function writeBytes32(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a uint.\\n * @param _in The uint256 to encode.\\n * @return The RLP encoded uint256 in bytes.\\n */\\n function writeUint(\\n uint256 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(_toBinary(_in));\\n }\\n\\n /**\\n * RLP encodes a bool.\\n * @param _in The bool to encode.\\n * @return The RLP encoded bool in bytes.\\n */\\n function writeBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded = new bytes(1);\\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\\n return encoded;\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\\n * @param _len The length of the string or the payload.\\n * @param _offset 128 if item is string, 192 if item is list.\\n * @return RLP encoded bytes.\\n */\\n function _writeLength(\\n uint256 _len,\\n uint256 _offset\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded;\\n\\n if (_len < 56) {\\n encoded = new bytes(1);\\n encoded[0] = byte(uint8(_len) + uint8(_offset));\\n } else {\\n uint256 lenLen;\\n uint256 i = 1;\\n while (_len / i != 0) {\\n lenLen++;\\n i *= 256;\\n }\\n\\n encoded = new bytes(lenLen + 1);\\n encoded[0] = byte(uint8(lenLen) + uint8(_offset) + 55);\\n for(i = 1; i <= lenLen; i++) {\\n encoded[i] = byte(uint8((_len / (256**(lenLen-i))) % 256));\\n }\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * Encode integer in big endian binary form with no leading zeroes.\\n * @notice TODO: This should be optimized with assembly to save gas costs.\\n * @param _x The integer to encode.\\n * @return RLP encoded bytes.\\n */\\n function _toBinary(\\n uint256 _x\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory b = abi.encodePacked(_x);\\n\\n uint256 i = 0;\\n for (; i < 32; i++) {\\n if (b[i] != 0) {\\n break;\\n }\\n }\\n\\n bytes memory res = new bytes(32 - i);\\n for (uint256 j = 0; j < res.length; j++) {\\n res[j] = b[i++];\\n }\\n\\n return res;\\n }\\n\\n /**\\n * Copies a piece of memory to another location.\\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\\n * @param _dest Destination location.\\n * @param _src Source location.\\n * @param _len Length of memory to copy.\\n */\\n function _memcpy(\\n uint256 _dest,\\n uint256 _src,\\n uint256 _len\\n )\\n private\\n pure\\n {\\n uint256 dest = _dest;\\n uint256 src = _src;\\n uint256 len = _len;\\n\\n for(; len >= 32; len -= 32) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n dest += 32;\\n src += 32;\\n }\\n\\n uint256 mask = 256 ** (32 - len) - 1;\\n assembly {\\n let srcpart := and(mload(src), not(mask))\\n let destpart := and(mload(dest), mask)\\n mstore(dest, or(destpart, srcpart))\\n }\\n }\\n\\n /**\\n * Flattens a list of byte strings into one byte string.\\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\\n * @param _list List of byte strings to flatten.\\n * @return The flattened byte string.\\n */\\n function _flatten(\\n bytes[] memory _list\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n if (_list.length == 0) {\\n return new bytes(0);\\n }\\n\\n uint256 len;\\n uint256 i = 0;\\n for (; i < _list.length; i++) {\\n len += _list[i].length;\\n }\\n\\n bytes memory flattened = new bytes(len);\\n uint256 flattenedPtr;\\n assembly { flattenedPtr := add(flattened, 0x20) }\\n\\n for(i = 0; i < _list.length; i++) {\\n bytes memory item = _list[i];\\n\\n uint256 listPtr;\\n assembly { listPtr := add(item, 0x20)}\\n\\n _memcpy(flattenedPtr, listPtr, item.length);\\n flattenedPtr += _list[i].length;\\n }\\n\\n return flattened;\\n }\\n}\\n\",\"keccak256\":\"0xb60ee4b03ad372c3deff21d454ab714dd0c18ee3e6f9d45532e209fc59d5a54d\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_Bytes32Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_Byte32Utils\\n */\\nlibrary Lib_Bytes32Utils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \\\"true.\\\"\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as a boolean.\\n */\\n function toBool(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return _in != 0;\\n }\\n\\n /**\\n * Converts a boolean to a bytes32 value.\\n * @param _in Input boolean value.\\n * @return Boolean as a bytes32.\\n */\\n function fromBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in ? 1 : 0));\\n }\\n\\n /**\\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as an address.\\n */\\n function toAddress(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return address(uint160(uint256(_in)));\\n }\\n\\n /**\\n * Converts an address to a bytes32.\\n * @param _in Input address value.\\n * @return Address as a bytes32.\\n */\\n function fromAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in));\\n }\\n\\n /**\\n * Removes the leading zeros from a bytes32 value and returns a new (smaller) bytes value.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 without any leading zeros.\\n */\\n function removeLeadingZeros(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out;\\n\\n assembly {\\n // Figure out how many leading zero bytes to remove.\\n let shift := 0\\n for { let i := 0 } and(lt(i, 32), eq(byte(i, _in), 0)) { i := add(i, 1) } {\\n shift := add(shift, 1)\\n }\\n\\n // Reserve some space for our output and fix the free memory pointer.\\n out := mload(0x40)\\n mstore(0x40, add(out, 0x40))\\n\\n // Shift the value and store it into the output bytes.\\n mstore(add(out, 0x20), shl(mul(shift, 8), _in))\\n\\n // Store the new size (with leading zero bytes removed) in the output byte size.\\n mstore(out, sub(32, shift))\\n }\\n\\n return out;\\n }\\n}\\n\",\"keccak256\":\"0xfa2def593e3fc56a31852c3744aefdaa93cec74e721bfcfeb1e5d166c7c60b64\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_BytesUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_BytesUtils\\n */\\nlibrary Lib_BytesUtils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_start + _length >= _start, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n if (_bytes.length - _start == 0) {\\n return bytes('');\\n }\\n\\n return slice(_bytes, _start, _bytes.length - _start);\\n }\\n\\n function toBytes32PadLeft(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n bytes32 ret;\\n uint256 len = _bytes.length <= 32 ? _bytes.length : 32;\\n assembly {\\n ret := shr(mul(sub(32, len), 8), mload(add(_bytes, 32)))\\n }\\n return ret;\\n }\\n\\n function toBytes32(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n if (_bytes.length < 32) {\\n bytes32 ret;\\n assembly {\\n ret := mload(add(_bytes, 32))\\n }\\n return ret;\\n }\\n\\n return abi.decode(_bytes,(bytes32)); // will truncate if input length > 32 bytes\\n }\\n\\n function toUint256(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return uint256(toBytes32(_bytes));\\n }\\n\\n function toUint24(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n uint24\\n )\\n {\\n require(_start + 3 >= _start, \\\"toUint24_overflow\\\");\\n require(_bytes.length >= _start + 3 , \\\"toUint24_outOfBounds\\\");\\n uint24 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x3), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toUint8(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n uint8\\n )\\n {\\n require(_start + 1 >= _start, \\\"toUint8_overflow\\\");\\n require(_bytes.length >= _start + 1 , \\\"toUint8_outOfBounds\\\");\\n uint8 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x1), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toAddress(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n require(_start + 20 >= _start, \\\"toAddress_overflow\\\");\\n require(_bytes.length >= _start + 20, \\\"toAddress_outOfBounds\\\");\\n address tempAddress;\\n\\n assembly {\\n tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000)\\n }\\n\\n return tempAddress;\\n }\\n\\n function toNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory nibbles = new bytes(_bytes.length * 2);\\n\\n for (uint256 i = 0; i < _bytes.length; i++) {\\n nibbles[i * 2] = _bytes[i] >> 4;\\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\\n }\\n\\n return nibbles;\\n }\\n\\n function fromNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory ret = new bytes(_bytes.length / 2);\\n\\n for (uint256 i = 0; i < ret.length; i++) {\\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\\n }\\n\\n return ret;\\n }\\n\\n function equal(\\n bytes memory _bytes,\\n bytes memory _other\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return keccak256(_bytes) == keccak256(_other);\\n }\\n}\\n\",\"keccak256\":\"0xa5195afe32fb2cf104d156e8f4bd39df1ec79bf6ba232097b9e8e0ee14fbc298\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_MerkleTree.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_MerkleTree\\n * @author River Keefer\\n */\\nlibrary Lib_MerkleTree {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Calculates a merkle root for a list of 32-byte leaf hashes. WARNING: If the number\\n * of leaves passed in is not a power of two, it pads out the tree with zero hashes.\\n * If you do not know the original length of elements for the tree you are verifying,\\n * then this may allow empty leaves past _elements.length to pass a verification check down the line.\\n * Note that the _elements argument is modified, therefore it must not be used again afterwards\\n * @param _elements Array of hashes from which to generate a merkle root.\\n * @return Merkle root of the leaves, with zero hashes for non-powers-of-two (see above).\\n */\\n function getMerkleRoot(\\n bytes32[] memory _elements\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n require(\\n _elements.length > 0,\\n \\\"Lib_MerkleTree: Must provide at least one leaf hash.\\\"\\n );\\n\\n if (_elements.length == 1) {\\n return _elements[0];\\n }\\n\\n uint256[16] memory defaults = [\\n 0x290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563,\\n 0x633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d,\\n 0x890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d,\\n 0x3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd8,\\n 0xecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da,\\n 0xdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da5,\\n 0x617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d7,\\n 0x292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead,\\n 0xe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e10,\\n 0x7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f82,\\n 0xe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e83636516,\\n 0x3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c,\\n 0xad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e,\\n 0xa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab,\\n 0x4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c862,\\n 0x2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf10\\n ];\\n\\n // Reserve memory space for our hashes.\\n bytes memory buf = new bytes(64);\\n\\n // We'll need to keep track of left and right siblings.\\n bytes32 leftSibling;\\n bytes32 rightSibling;\\n\\n // Number of non-empty nodes at the current depth.\\n uint256 rowSize = _elements.length;\\n\\n // Current depth, counting from 0 at the leaves\\n uint256 depth = 0;\\n\\n // Common sub-expressions\\n uint256 halfRowSize; // rowSize / 2\\n bool rowSizeIsOdd; // rowSize % 2 == 1\\n\\n while (rowSize > 1) {\\n halfRowSize = rowSize / 2;\\n rowSizeIsOdd = rowSize % 2 == 1;\\n\\n for (uint256 i = 0; i < halfRowSize; i++) {\\n leftSibling = _elements[(2 * i) ];\\n rightSibling = _elements[(2 * i) + 1];\\n assembly {\\n mstore(add(buf, 32), leftSibling )\\n mstore(add(buf, 64), rightSibling)\\n }\\n\\n _elements[i] = keccak256(buf);\\n }\\n\\n if (rowSizeIsOdd) {\\n leftSibling = _elements[rowSize - 1];\\n rightSibling = bytes32(defaults[depth]);\\n assembly {\\n mstore(add(buf, 32), leftSibling)\\n mstore(add(buf, 64), rightSibling)\\n }\\n\\n _elements[halfRowSize] = keccak256(buf);\\n }\\n\\n rowSize = halfRowSize + (rowSizeIsOdd ? 1 : 0);\\n depth++;\\n }\\n\\n return _elements[0];\\n }\\n\\n /**\\n * Verifies a merkle branch for the given leaf hash. Assumes the original length\\n * of leaves generated is a known, correct input, and does not return true for indices\\n * extending past that index (even if _siblings would be otherwise valid.)\\n * @param _root The Merkle root to verify against.\\n * @param _leaf The leaf hash to verify inclusion of.\\n * @param _index The index in the tree of this leaf.\\n * @param _siblings Array of sibline nodes in the inclusion proof, starting from depth 0 (bottom of the tree).\\n * @param _totalLeaves The total number of leaves originally passed into.\\n * @return Whether or not the merkle branch and leaf passes verification.\\n */\\n function verify(\\n bytes32 _root,\\n bytes32 _leaf,\\n uint256 _index,\\n bytes32[] memory _siblings,\\n uint256 _totalLeaves\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n require(\\n _totalLeaves > 0,\\n \\\"Lib_MerkleTree: Total leaves must be greater than zero.\\\"\\n );\\n\\n require(\\n _index < _totalLeaves,\\n \\\"Lib_MerkleTree: Index out of bounds.\\\"\\n );\\n\\n require(\\n _siblings.length == _ceilLog2(_totalLeaves),\\n \\\"Lib_MerkleTree: Total siblings does not correctly correspond to total leaves.\\\"\\n );\\n\\n bytes32 computedRoot = _leaf;\\n\\n for (uint256 i = 0; i < _siblings.length; i++) {\\n if ((_index & 1) == 1) {\\n computedRoot = keccak256(\\n abi.encodePacked(\\n _siblings[i],\\n computedRoot\\n )\\n );\\n } else {\\n computedRoot = keccak256(\\n abi.encodePacked(\\n computedRoot,\\n _siblings[i]\\n )\\n );\\n }\\n\\n _index >>= 1;\\n }\\n\\n return _root == computedRoot;\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Calculates the integer ceiling of the log base 2 of an input.\\n * @param _in Unsigned input to calculate the log.\\n * @return ceil(log_base_2(_in))\\n */\\n function _ceilLog2(\\n uint256 _in\\n )\\n private\\n pure\\n returns (\\n uint256\\n )\\n {\\n require(\\n _in > 0,\\n \\\"Lib_MerkleTree: Cannot compute ceil(log_2) of 0.\\\"\\n );\\n\\n if (_in == 1) {\\n return 0;\\n }\\n\\n // Find the highest set bit (will be floor(log_2)).\\n // Borrowed with <3 from https://github.com/ethereum/solidity-examples\\n uint256 val = _in;\\n uint256 highest = 0;\\n for (uint256 i = 128; i >= 1; i >>= 1) {\\n if (val & (uint(1) << i) - 1 << i != 0) {\\n highest += i;\\n val >>= i;\\n }\\n }\\n\\n // Increment by one if this is not a perfect logarithm.\\n if ((uint(1) << highest) != _in) {\\n highest += 1;\\n }\\n\\n return highest;\\n }\\n}\\n\",\"keccak256\":\"0xa78edb9fbd34712771a1ebff05bc5e1abec7fc1e9a1bfb709d183099b44fa62a\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x608060405234801561001057600080fd5b50604051611bee380380611bee83398101604081905261002f9161005b565b600080546001600160a01b0319166001600160a01b03949094169390931790925560015560025561009c565b60008060006060848603121561006f578283fd5b83516001600160a01b0381168114610085578384fd5b602085015160409095015190969495509392505050565b611b43806100ab6000396000f3fe608060405234801561001057600080fd5b50600436106100b45760003560e01c80638ca5cbb9116100715780638ca5cbb91461012f5780639418bddd14610144578063b8e189ac14610157578063c17b291b1461016a578063cfdf677e14610172578063e561dddc1461017a576100b4565b8063299ca478146100b9578063461a4478146100d75780634d69ee57146100ea5780637aa63a861461010a5780637ad168a01461011f57806381eb62ef14610127575b600080fd5b6100c1610182565b6040516100ce919061159f565b60405180910390f35b6100c16100e53660046114e3565b610191565b6100fd6100f8366004611431565b61026f565b6040516100ce91906115b3565b6101126102e2565b6040516100ce91906115be565b6101126102fb565b610112610314565b61014261013d366004611390565b61031a565b005b6100fd610152366004611531565b61052e565b610142610165366004611531565b61057e565b610112610636565b6100c161063c565b610112610664565b6000546001600160a01b031681565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b838110156101f15781810151838201526020016101d9565b50505050905090810190601f16801561021e5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561023b57600080fd5b505afa15801561024f573d6000803e3d6000fd5b505050506040513d602081101561026557600080fd5b505190505b919050565b600061027a836106de565b61029f5760405162461bcd60e51b815260040161029690611749565b60405180910390fd5b6102bc836020015185846000015185602001518760400151610776565b6102d85760405162461bcd60e51b8152600401610296906116b5565b5060019392505050565b6000806102ed6108fb565b5064ffffffffff1691505090565b6000806103066108fb565b64ffffffffff169250505090565b60025481565b6103226102e2565b81146103405760405162461bcd60e51b8152600401610296906116ec565b6103706040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b815250610191565b6001600160a01b03166302ad4d2a336040518263ffffffff1660e01b815260040161039b919061159f565b60206040518083038186803b1580156103b357600080fd5b505afa1580156103c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103eb91906113d3565b6104075760405162461bcd60e51b8152600401610296906118bb565b60008251116104285760405162461bcd60e51b815260040161029690611878565b6104666040518060400160405280601d81526020017f4f564d5f43616e6f6e6963616c5472616e73616374696f6e436861696e000000815250610191565b6001600160a01b0316637aa63a866040518163ffffffff1660e01b815260040160206040518083038186803b15801561049e57600080fd5b505afa1580156104b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104d69190611419565b82516104e06102e2565b0111156104ff5760405162461bcd60e51b815260040161029690611646565b61052a8242336040516020016105169291906119a1565b604051602081830303815290604052610990565b5050565b60008082608001518060200190518101906105499190611564565b509050806105695760405162461bcd60e51b815260040161029690611833565b4261057682600154610b31565b119392505050565b6105b06040518060400160405280601181526020017027ab26afa33930bab22b32b934b334b2b960791b815250610191565b6001600160a01b0316336001600160a01b0316146105e05760405162461bcd60e51b8152600401610296906117d6565b6105e9816106de565b6106055760405162461bcd60e51b815260040161029690611749565b61060e8161052e565b61062a5760405162461bcd60e51b815260040161029690611778565b61063381610b92565b50565b60015481565b600061065f604051806060016040528060258152602001611ab560259139610191565b905090565b600061066e61063c565b6001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b1580156106a657600080fd5b505afa1580156106ba573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061065f9190611419565b60006106e861063c565b8251604051634a83e9cd60e11b81526001600160a01b039290921691639507d39a91610716916004016115be565b60206040518083038186803b15801561072e57600080fd5b505afa158015610742573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107669190611419565b61076f83610d0a565b1492915050565b60008082116107b65760405162461bcd60e51b8152600401808060200182810382526037815260200180611a316037913960400191505060405180910390fd5b8184106107f45760405162461bcd60e51b81526004018080602001828103825260248152602001806119dd6024913960400191505060405180910390fd5b6107fd82610d50565b83511461083b5760405162461bcd60e51b815260040180806020018281038252604d815260200180611a68604d913960600191505060405180910390fd5b8460005b84518110156108ee57856001166001141561089d5784818151811061086057fe5b60200260200101518260405160200180838152602001828152602001925050506040516020818303038152906040528051906020012091506108e2565b818582815181106108aa57fe5b602002602001015160405160200180838152602001828152602001925050506040516020818303038152906040528051906020012091505b600195861c950161083f565b5090951495945050505050565b600080600061090861063c565b6001600160a01b031663ccf8f9696040518163ffffffff1660e01b815260040160206040518083038186803b15801561094057600080fd5b505afa158015610954573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061097891906113f3565b64ffffffffff602882901c16935060501c9150509091565b60006109bf6040518060400160405280600c81526020016b27ab26afa83937b837b9b2b960a11b815250610191565b90506000806109cc6108fb565b9092509050336001600160a01b03841614156109e9575042610a13565b426002548264ffffffffff160110610a135760405162461bcd60e51b81526004016102969061190a565b60006040518060a00160405280610a28610664565b8152602001610a3688610de6565b8152602001875181526020018464ffffffffff16815260200186815250905080600001517f16be4c5129a4e03cf3350262e181dc02ddfb4a6008d925368c0899fcd97ca9c58260200151836040015184606001518560800151604051610a9f94939291906115dd565b60405180910390a2610aaf61063c565b6001600160a01b0316632015276c610ac683610d0a565b610ada84604001518560600151018661121a565b6040518363ffffffff1660e01b8152600401610af79291906115c7565b600060405180830381600087803b158015610b1157600080fd5b505af1158015610b25573d6000803e3d6000fd5b50505050505050505050565b600082820183811015610b8b576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b610b9a61063c565b6001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b158015610bd257600080fd5b505afa158015610be6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c0a9190611419565b815110610c295760405162461bcd60e51b815260040161029690611973565b610c32816106de565b610c4e5760405162461bcd60e51b815260040161029690611749565b610c5661063c565b6001600160a01b031663167fd6818260000151610c788460600151600061121a565b6040518363ffffffff1660e01b8152600401610c959291906115c7565b600060405180830381600087803b158015610caf57600080fd5b505af1158015610cc3573d6000803e3d6000fd5b5050505080600001517f8747b69ce8fdb31c3b9b0a67bd8049ad8c1a69ea417b69b12174068abd9cbd648260200151604051610cff91906115be565b60405180910390a250565b60008160200151826040015183606001518460800151604051602001610d3394939291906115dd565b604051602081830303815290604052805190602001209050919050565b6000808211610d905760405162461bcd60e51b8152600401808060200182810382526030815260200180611a016030913960400191505060405180910390fd5b8160011415610da15750600061026a565b81600060805b60018110610dd1576000196001821b01811b831615610dc95791821c91908101905b60011c610da7565b506001811b8414610b8b576001019392505050565b600080825111610e275760405162461bcd60e51b8152600401808060200182810382526034815260200180611ada6034913960400191505060405180910390fd5b815160011415610e4d5781600081518110610e3e57fe5b6020026020010151905061026a565b60408051610200810182527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56381527f633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d60208201527f890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d818301527f3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd86060808301919091527fecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da60808301527fdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da560a08301527f617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d760c08301527f292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead60e08301527fe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e106101008301527f7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f826101208301527fe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e836365166101408301527f3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c6101608301527fad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e6101808301527fa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab6101a08301527f4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c8626101c08301527f2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf106101e083015282518381529081018352909160009190602082018180368337505085519192506000918291508180805b60018411156111f65750506002820460018084161460005b82811015611172578a816002028151811061111957fe5b602002602001015196508a816002026001018151811061113557fe5b6020026020010151955086602089015285604089015287805190602001208b828151811061115f57fe5b6020908102919091010152600101611102565b5080156111d55789600185038151811061118857fe5b6020026020010151955087836010811061119e57fe5b602002015160001b945085602088015284604088015286805190602001208a83815181106111c857fe5b6020026020010181815250505b806111e15760006111e4565b60015b60ff16820193506001909201916110ea565b8960008151811061120357fe5b602002602001015198505050505050505050919050565b602890811b91909117901b90565b600067ffffffffffffffff83111561123c57fe5b61124f601f8401601f19166020016119b8565b905082815283838301111561126357600080fd5b828260208301376000602084830101529392505050565b600082601f83011261128a578081fd5b8135602067ffffffffffffffff8211156112a057fe5b8082026112ae8282016119b8565b8381528281019086840183880185018910156112c8578687fd5b8693505b858410156112ea5780358352600193909301929184019184016112cc565b50979650505050505050565b600060a08284031215611307578081fd5b60405160a0810167ffffffffffffffff828210818311171561132557fe5b8160405282935084358352602085013560208401526040850135604084015260608501356060840152608085013591508082111561136257600080fd5b508301601f8101851361137457600080fd5b61138385823560208401611228565b6080830152505092915050565b600080604083850312156113a2578182fd5b823567ffffffffffffffff8111156113b8578283fd5b6113c48582860161127a565b95602094909401359450505050565b6000602082840312156113e4578081fd5b81518015158114610b8b578182fd5b600060208284031215611404578081fd5b815164ffffffffff1981168114610b8b578182fd5b60006020828403121561142a578081fd5b5051919050565b600080600060608486031215611445578081fd5b83359250602084013567ffffffffffffffff80821115611463578283fd5b61146f878388016112f6565b93506040860135915080821115611484578283fd5b9085019060408288031215611497578283fd5b6040516040810181811083821117156114ac57fe5b604052823581526020830135828111156114c4578485fd5b6114d08982860161127a565b6020830152508093505050509250925092565b6000602082840312156114f4578081fd5b813567ffffffffffffffff81111561150a578182fd5b8201601f8101841361151a578182fd5b61152984823560208401611228565b949350505050565b600060208284031215611542578081fd5b813567ffffffffffffffff811115611558578182fd5b611529848285016112f6565b60008060408385031215611576578182fd5b825160208401519092506001600160a01b0381168114611594578182fd5b809150509250929050565b6001600160a01b0391909116815260200190565b901515815260200190565b90815260200190565b91825264ffffffffff1916602082015260400190565b600085825260208581840152846040840152608060608401528351806080850152825b8181101561161c5785810183015185820160a001528201611600565b8181111561162d578360a083870101525b50601f01601f19169290920160a0019695505050505050565b60208082526049908201527f4e756d626572206f6620737461746520726f6f74732063616e6e6f742065786360408201527f65656420746865206e756d626572206f662063616e6f6e6963616c207472616e60608201526839b0b1ba34b7b7399760b91b608082015260a00190565b60208082526018908201527f496e76616c696420696e636c7573696f6e2070726f6f662e0000000000000000604082015260600190565b6020808252603d908201527f41637475616c20626174636820737461727420696e64657820646f6573206e6f60408201527f74206d6174636820657870656374656420737461727420696e6465782e000000606082015260800190565b60208082526015908201527424b73b30b634b2103130ba31b4103432b0b232b91760591b604082015260600190565b602080825260409082018190527f537461746520626174636865732063616e206f6e6c792062652064656c657465908201527f642077697468696e207468652066726175642070726f6f662077696e646f772e606082015260800190565b6020808252603b908201527f537461746520626174636865732063616e206f6e6c792062652064656c65746560408201527f6420627920746865204f564d5f467261756456657269666965722e0000000000606082015260800190565b60208082526025908201527f4261746368206865616465722074696d657374616d702063616e6e6f74206265604082015264207a65726f60d81b606082015260800190565b60208082526023908201527f43616e6e6f74207375626d697420616e20656d7074792073746174652062617460408201526231b41760e91b606082015260800190565b6020808252602f908201527f50726f706f73657220646f6573206e6f74206861766520656e6f75676820636f60408201526e1b1b185d195c985b081c1bdcdd1959608a1b606082015260800190565b60208082526043908201527f43616e6e6f74207075626c69736820737461746520726f6f747320776974686960408201527f6e207468652073657175656e636572207075626c69636174696f6e2077696e6460608201526237bb9760e91b608082015260a00190565b60208082526014908201527324b73b30b634b2103130ba31b41034b73232bc1760611b604082015260600190565b9182526001600160a01b0316602082015260400190565b60405181810167ffffffffffffffff811182821017156119d457fe5b60405291905056fe4c69625f4d65726b6c65547265653a20496e646578206f7574206f6620626f756e64732e4c69625f4d65726b6c65547265653a2043616e6e6f7420636f6d70757465206365696c286c6f675f3229206f6620302e4c69625f4d65726b6c65547265653a20546f74616c206c6561766573206d7573742062652067726561746572207468616e207a65726f2e4c69625f4d65726b6c65547265653a20546f74616c207369626c696e677320646f6573206e6f7420636f72726563746c7920636f72726573706f6e6420746f20746f74616c206c65617665732e4f564d5f436861696e53746f72616765436f6e7461696e65723a5343433a626174636865734c69625f4d65726b6c65547265653a204d7573742070726f76696465206174206c65617374206f6e65206c65616620686173682ea26469706673582212209a79aee928c48a8e868127cc94d1fe1eb4eea95e98e6709cd65bda19d650209064736f6c63430007060033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100b45760003560e01c80638ca5cbb9116100715780638ca5cbb91461012f5780639418bddd14610144578063b8e189ac14610157578063c17b291b1461016a578063cfdf677e14610172578063e561dddc1461017a576100b4565b8063299ca478146100b9578063461a4478146100d75780634d69ee57146100ea5780637aa63a861461010a5780637ad168a01461011f57806381eb62ef14610127575b600080fd5b6100c1610182565b6040516100ce919061159f565b60405180910390f35b6100c16100e53660046114e3565b610191565b6100fd6100f8366004611431565b61026f565b6040516100ce91906115b3565b6101126102e2565b6040516100ce91906115be565b6101126102fb565b610112610314565b61014261013d366004611390565b61031a565b005b6100fd610152366004611531565b61052e565b610142610165366004611531565b61057e565b610112610636565b6100c161063c565b610112610664565b6000546001600160a01b031681565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b838110156101f15781810151838201526020016101d9565b50505050905090810190601f16801561021e5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561023b57600080fd5b505afa15801561024f573d6000803e3d6000fd5b505050506040513d602081101561026557600080fd5b505190505b919050565b600061027a836106de565b61029f5760405162461bcd60e51b815260040161029690611749565b60405180910390fd5b6102bc836020015185846000015185602001518760400151610776565b6102d85760405162461bcd60e51b8152600401610296906116b5565b5060019392505050565b6000806102ed6108fb565b5064ffffffffff1691505090565b6000806103066108fb565b64ffffffffff169250505090565b60025481565b6103226102e2565b81146103405760405162461bcd60e51b8152600401610296906116ec565b6103706040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b815250610191565b6001600160a01b03166302ad4d2a336040518263ffffffff1660e01b815260040161039b919061159f565b60206040518083038186803b1580156103b357600080fd5b505afa1580156103c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103eb91906113d3565b6104075760405162461bcd60e51b8152600401610296906118bb565b60008251116104285760405162461bcd60e51b815260040161029690611878565b6104666040518060400160405280601d81526020017f4f564d5f43616e6f6e6963616c5472616e73616374696f6e436861696e000000815250610191565b6001600160a01b0316637aa63a866040518163ffffffff1660e01b815260040160206040518083038186803b15801561049e57600080fd5b505afa1580156104b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104d69190611419565b82516104e06102e2565b0111156104ff5760405162461bcd60e51b815260040161029690611646565b61052a8242336040516020016105169291906119a1565b604051602081830303815290604052610990565b5050565b60008082608001518060200190518101906105499190611564565b509050806105695760405162461bcd60e51b815260040161029690611833565b4261057682600154610b31565b119392505050565b6105b06040518060400160405280601181526020017027ab26afa33930bab22b32b934b334b2b960791b815250610191565b6001600160a01b0316336001600160a01b0316146105e05760405162461bcd60e51b8152600401610296906117d6565b6105e9816106de565b6106055760405162461bcd60e51b815260040161029690611749565b61060e8161052e565b61062a5760405162461bcd60e51b815260040161029690611778565b61063381610b92565b50565b60015481565b600061065f604051806060016040528060258152602001611ab560259139610191565b905090565b600061066e61063c565b6001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b1580156106a657600080fd5b505afa1580156106ba573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061065f9190611419565b60006106e861063c565b8251604051634a83e9cd60e11b81526001600160a01b039290921691639507d39a91610716916004016115be565b60206040518083038186803b15801561072e57600080fd5b505afa158015610742573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107669190611419565b61076f83610d0a565b1492915050565b60008082116107b65760405162461bcd60e51b8152600401808060200182810382526037815260200180611a316037913960400191505060405180910390fd5b8184106107f45760405162461bcd60e51b81526004018080602001828103825260248152602001806119dd6024913960400191505060405180910390fd5b6107fd82610d50565b83511461083b5760405162461bcd60e51b815260040180806020018281038252604d815260200180611a68604d913960600191505060405180910390fd5b8460005b84518110156108ee57856001166001141561089d5784818151811061086057fe5b60200260200101518260405160200180838152602001828152602001925050506040516020818303038152906040528051906020012091506108e2565b818582815181106108aa57fe5b602002602001015160405160200180838152602001828152602001925050506040516020818303038152906040528051906020012091505b600195861c950161083f565b5090951495945050505050565b600080600061090861063c565b6001600160a01b031663ccf8f9696040518163ffffffff1660e01b815260040160206040518083038186803b15801561094057600080fd5b505afa158015610954573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061097891906113f3565b64ffffffffff602882901c16935060501c9150509091565b60006109bf6040518060400160405280600c81526020016b27ab26afa83937b837b9b2b960a11b815250610191565b90506000806109cc6108fb565b9092509050336001600160a01b03841614156109e9575042610a13565b426002548264ffffffffff160110610a135760405162461bcd60e51b81526004016102969061190a565b60006040518060a00160405280610a28610664565b8152602001610a3688610de6565b8152602001875181526020018464ffffffffff16815260200186815250905080600001517f16be4c5129a4e03cf3350262e181dc02ddfb4a6008d925368c0899fcd97ca9c58260200151836040015184606001518560800151604051610a9f94939291906115dd565b60405180910390a2610aaf61063c565b6001600160a01b0316632015276c610ac683610d0a565b610ada84604001518560600151018661121a565b6040518363ffffffff1660e01b8152600401610af79291906115c7565b600060405180830381600087803b158015610b1157600080fd5b505af1158015610b25573d6000803e3d6000fd5b50505050505050505050565b600082820183811015610b8b576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b610b9a61063c565b6001600160a01b0316631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b158015610bd257600080fd5b505afa158015610be6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c0a9190611419565b815110610c295760405162461bcd60e51b815260040161029690611973565b610c32816106de565b610c4e5760405162461bcd60e51b815260040161029690611749565b610c5661063c565b6001600160a01b031663167fd6818260000151610c788460600151600061121a565b6040518363ffffffff1660e01b8152600401610c959291906115c7565b600060405180830381600087803b158015610caf57600080fd5b505af1158015610cc3573d6000803e3d6000fd5b5050505080600001517f8747b69ce8fdb31c3b9b0a67bd8049ad8c1a69ea417b69b12174068abd9cbd648260200151604051610cff91906115be565b60405180910390a250565b60008160200151826040015183606001518460800151604051602001610d3394939291906115dd565b604051602081830303815290604052805190602001209050919050565b6000808211610d905760405162461bcd60e51b8152600401808060200182810382526030815260200180611a016030913960400191505060405180910390fd5b8160011415610da15750600061026a565b81600060805b60018110610dd1576000196001821b01811b831615610dc95791821c91908101905b60011c610da7565b506001811b8414610b8b576001019392505050565b600080825111610e275760405162461bcd60e51b8152600401808060200182810382526034815260200180611ada6034913960400191505060405180910390fd5b815160011415610e4d5781600081518110610e3e57fe5b6020026020010151905061026a565b60408051610200810182527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56381527f633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d60208201527f890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d818301527f3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd86060808301919091527fecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da60808301527fdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da560a08301527f617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d760c08301527f292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead60e08301527fe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e106101008301527f7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f826101208301527fe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e836365166101408301527f3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c6101608301527fad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e6101808301527fa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab6101a08301527f4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c8626101c08301527f2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf106101e083015282518381529081018352909160009190602082018180368337505085519192506000918291508180805b60018411156111f65750506002820460018084161460005b82811015611172578a816002028151811061111957fe5b602002602001015196508a816002026001018151811061113557fe5b6020026020010151955086602089015285604089015287805190602001208b828151811061115f57fe5b6020908102919091010152600101611102565b5080156111d55789600185038151811061118857fe5b6020026020010151955087836010811061119e57fe5b602002015160001b945085602088015284604088015286805190602001208a83815181106111c857fe5b6020026020010181815250505b806111e15760006111e4565b60015b60ff16820193506001909201916110ea565b8960008151811061120357fe5b602002602001015198505050505050505050919050565b602890811b91909117901b90565b600067ffffffffffffffff83111561123c57fe5b61124f601f8401601f19166020016119b8565b905082815283838301111561126357600080fd5b828260208301376000602084830101529392505050565b600082601f83011261128a578081fd5b8135602067ffffffffffffffff8211156112a057fe5b8082026112ae8282016119b8565b8381528281019086840183880185018910156112c8578687fd5b8693505b858410156112ea5780358352600193909301929184019184016112cc565b50979650505050505050565b600060a08284031215611307578081fd5b60405160a0810167ffffffffffffffff828210818311171561132557fe5b8160405282935084358352602085013560208401526040850135604084015260608501356060840152608085013591508082111561136257600080fd5b508301601f8101851361137457600080fd5b61138385823560208401611228565b6080830152505092915050565b600080604083850312156113a2578182fd5b823567ffffffffffffffff8111156113b8578283fd5b6113c48582860161127a565b95602094909401359450505050565b6000602082840312156113e4578081fd5b81518015158114610b8b578182fd5b600060208284031215611404578081fd5b815164ffffffffff1981168114610b8b578182fd5b60006020828403121561142a578081fd5b5051919050565b600080600060608486031215611445578081fd5b83359250602084013567ffffffffffffffff80821115611463578283fd5b61146f878388016112f6565b93506040860135915080821115611484578283fd5b9085019060408288031215611497578283fd5b6040516040810181811083821117156114ac57fe5b604052823581526020830135828111156114c4578485fd5b6114d08982860161127a565b6020830152508093505050509250925092565b6000602082840312156114f4578081fd5b813567ffffffffffffffff81111561150a578182fd5b8201601f8101841361151a578182fd5b61152984823560208401611228565b949350505050565b600060208284031215611542578081fd5b813567ffffffffffffffff811115611558578182fd5b611529848285016112f6565b60008060408385031215611576578182fd5b825160208401519092506001600160a01b0381168114611594578182fd5b809150509250929050565b6001600160a01b0391909116815260200190565b901515815260200190565b90815260200190565b91825264ffffffffff1916602082015260400190565b600085825260208581840152846040840152608060608401528351806080850152825b8181101561161c5785810183015185820160a001528201611600565b8181111561162d578360a083870101525b50601f01601f19169290920160a0019695505050505050565b60208082526049908201527f4e756d626572206f6620737461746520726f6f74732063616e6e6f742065786360408201527f65656420746865206e756d626572206f662063616e6f6e6963616c207472616e60608201526839b0b1ba34b7b7399760b91b608082015260a00190565b60208082526018908201527f496e76616c696420696e636c7573696f6e2070726f6f662e0000000000000000604082015260600190565b6020808252603d908201527f41637475616c20626174636820737461727420696e64657820646f6573206e6f60408201527f74206d6174636820657870656374656420737461727420696e6465782e000000606082015260800190565b60208082526015908201527424b73b30b634b2103130ba31b4103432b0b232b91760591b604082015260600190565b602080825260409082018190527f537461746520626174636865732063616e206f6e6c792062652064656c657465908201527f642077697468696e207468652066726175642070726f6f662077696e646f772e606082015260800190565b6020808252603b908201527f537461746520626174636865732063616e206f6e6c792062652064656c65746560408201527f6420627920746865204f564d5f467261756456657269666965722e0000000000606082015260800190565b60208082526025908201527f4261746368206865616465722074696d657374616d702063616e6e6f74206265604082015264207a65726f60d81b606082015260800190565b60208082526023908201527f43616e6e6f74207375626d697420616e20656d7074792073746174652062617460408201526231b41760e91b606082015260800190565b6020808252602f908201527f50726f706f73657220646f6573206e6f74206861766520656e6f75676820636f60408201526e1b1b185d195c985b081c1bdcdd1959608a1b606082015260800190565b60208082526043908201527f43616e6e6f74207075626c69736820737461746520726f6f747320776974686960408201527f6e207468652073657175656e636572207075626c69636174696f6e2077696e6460608201526237bb9760e91b608082015260a00190565b60208082526014908201527324b73b30b634b2103130ba31b41034b73232bc1760611b604082015260600190565b9182526001600160a01b0316602082015260400190565b60405181810167ffffffffffffffff811182821017156119d457fe5b60405291905056fe4c69625f4d65726b6c65547265653a20496e646578206f7574206f6620626f756e64732e4c69625f4d65726b6c65547265653a2043616e6e6f7420636f6d70757465206365696c286c6f675f3229206f6620302e4c69625f4d65726b6c65547265653a20546f74616c206c6561766573206d7573742062652067726561746572207468616e207a65726f2e4c69625f4d65726b6c65547265653a20546f74616c207369626c696e677320646f6573206e6f7420636f72726563746c7920636f72726573706f6e6420746f20746f74616c206c65617665732e4f564d5f436861696e53746f72616765436f6e7461696e65723a5343433a626174636865734c69625f4d65726b6c65547265653a204d7573742070726f76696465206174206c65617374206f6e65206c65616620686173682ea26469706673582212209a79aee928c48a8e868127cc94d1fe1eb4eea95e98e6709cd65bda19d650209064736f6c63430007060033", "devdoc": { "details": "The State Commitment Chain (SCC) contract contains a list of proposed state roots which Proposers assert to be a result of each transaction in the Canonical Transaction Chain (CTC). Elements here have a 1:1 correspondence with transactions in the CTC, and should be the unique state root calculated off-chain by applying the canonical transactions one by one. Compiler used: solc Runtime target: EVM", "kind": "dev", @@ -434,6 +434,14 @@ "_inside": "Whether or not the batch is inside the fraud proof window." } }, + "resolve(string)": { + "params": { + "_name": "Name to resolve an address for." + }, + "returns": { + "_0": "Address associated with the given name." + } + }, "verifyStateCommitment(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))": { "params": { "_batchHeader": "Header of the batch in which the element was included.", @@ -469,6 +477,9 @@ "insideFraudProofWindow((uint256,bytes32,uint256,uint256,bytes))": { "notice": "Checks whether a given batch is still inside its fraud proof window." }, + "resolve(string)": { + "notice": "Resolves the address associated with a given name." + }, "verifyStateCommitment(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))": { "notice": "Verifies a batch inclusion proof." } @@ -478,15 +489,15 @@ "storageLayout": { "storage": [ { - "astId": 12526, + "astId": 12800, "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_StateCommitmentChain.sol:OVM_StateCommitmentChain", "label": "libAddressManager", "offset": 0, "slot": "0", - "type": "t_contract(Lib_AddressManager)12519" + "type": "t_contract(Lib_AddressManager)12793" }, { - "astId": 3984, + "astId": 4678, "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_StateCommitmentChain.sol:OVM_StateCommitmentChain", "label": "FRAUD_PROOF_WINDOW", "offset": 0, @@ -494,7 +505,7 @@ "type": "t_uint256" }, { - "astId": 3986, + "astId": 4680, "contract": "contracts/optimistic-ethereum/OVM/chain/OVM_StateCommitmentChain.sol:OVM_StateCommitmentChain", "label": "SEQUENCER_PUBLISH_WINDOW", "offset": 0, @@ -503,7 +514,7 @@ } ], "types": { - "t_contract(Lib_AddressManager)12519": { + "t_contract(Lib_AddressManager)12793": { "encoding": "inplace", "label": "contract Lib_AddressManager", "numberOfBytes": "20" diff --git a/packages/contracts/deployments/kovan/OVM_StateManagerFactory.json b/packages/contracts/deployments/kovan/OVM_StateManagerFactory.json index 6299d7f981e26..bda9b91247e60 100644 --- a/packages/contracts/deployments/kovan/OVM_StateManagerFactory.json +++ b/packages/contracts/deployments/kovan/OVM_StateManagerFactory.json @@ -1,5 +1,5 @@ { - "address": "0xda9Da06A7b7D902A746649cA1304665C83a465F8", + "address": "0x3b96673C9e24D362501e87B239F60543e20beD50", "abi": [ { "inputs": [ @@ -21,29 +21,29 @@ "type": "function" } ], - "transactionHash": "0x2a6d1c5e46273effaf0fa72600685526c54c5c7490fa691e89d3bd78e78f5285", + "transactionHash": "0x9926548d5337a7b624a7c7aa3d4ea80c4e9a2fc3afaef0bfc634b19145bb56c1", "receipt": { "to": null, "from": "0x18394B52d3Cb931dfA76F63251919D051953413d", - "contractAddress": "0xda9Da06A7b7D902A746649cA1304665C83a465F8", - "transactionIndex": 2, - "gasUsed": "1153245", + "contractAddress": "0x3b96673C9e24D362501e87B239F60543e20beD50", + "transactionIndex": 1, + "gasUsed": "1170970", "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0xdfd00ecbfeaa62f2bec53684018e748970831fb8d1b18abd2b272148d123993a", - "transactionHash": "0x2a6d1c5e46273effaf0fa72600685526c54c5c7490fa691e89d3bd78e78f5285", + "blockHash": "0x20e3b8b73d8c3667eed92aa3bc04339f6a2c45f7d7bc3e7887163bed2bde2240", + "transactionHash": "0x9926548d5337a7b624a7c7aa3d4ea80c4e9a2fc3afaef0bfc634b19145bb56c1", "logs": [], - "blockNumber": 24199513, - "cumulativeGasUsed": "1367385", + "blockNumber": 24572858, + "cumulativeGasUsed": "1215716", "status": 1, "byzantium": true }, "args": [], - "solcInputHash": "03aed03b958b1d37f90bd88d0f56dd85", - "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"}],\"name\":\"create\",\"outputs\":[{\"internalType\":\"contract iOVM_StateManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The State Manager Factory is called by a State Transitioner's init code, to create a new State Manager for use in the Fraud Verification process. Compiler used: solc Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"create(address)\":{\"params\":{\"_owner\":\"Owner of the created contract.\"},\"returns\":{\"_0\":\"New OVM_StateManager instance.\"}}},\"title\":\"OVM_StateManagerFactory\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"create(address)\":{\"notice\":\"Creates a new OVM_StateManager\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/OVM/execution/OVM_StateManagerFactory.sol\":\"OVM_StateManagerFactory\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/optimistic-ethereum/OVM/execution/OVM_StateManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_StateManager } from \\\"../../iOVM/execution/iOVM_StateManager.sol\\\";\\n\\n/**\\n * @title OVM_StateManager\\n * @dev The State Manager contract holds all storage values for contracts in the OVM. It can only be written to by the\\n * the Execution Manager and State Transitioner. It runs on L1 during the setup and execution of a fraud proof.\\n * The same logic runs on L2, but has been implemented as a precompile in the L2 go-ethereum client\\n * (see https://github.com/ethereum-optimism/go-ethereum/blob/master/core/vm/ovm_state_manager.go).\\n * \\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract OVM_StateManager is iOVM_StateManager {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n bytes32 constant internal EMPTY_ACCOUNT_STORAGE_ROOT = 0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421;\\n bytes32 constant internal EMPTY_ACCOUNT_CODE_HASH = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;\\n bytes32 constant internal STORAGE_XOR_VALUE = 0xFEEDFACECAFEBEEFFEEDFACECAFEBEEFFEEDFACECAFEBEEFFEEDFACECAFEBEEF;\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n address override public owner;\\n address override public ovmExecutionManager;\\n mapping (address => Lib_OVMCodec.Account) internal accounts;\\n mapping (address => mapping (bytes32 => bytes32)) internal contractStorage;\\n mapping (address => mapping (bytes32 => bool)) internal verifiedContractStorage;\\n mapping (bytes32 => ItemState) internal itemStates;\\n uint256 internal totalUncommittedAccounts;\\n uint256 internal totalUncommittedContractStorage;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _owner Address of the owner of this contract.\\n */\\n constructor(\\n address _owner\\n )\\n {\\n owner = _owner;\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n /**\\n * Simple authentication, this contract should only be accessible to the owner (which is expected to be the State Transitioner during `PRE_EXECUTION` \\n * or the OVM_ExecutionManager during transaction execution.\\n */\\n modifier authenticated() {\\n // owner is the State Transitioner\\n require(\\n msg.sender == owner || msg.sender == ovmExecutionManager,\\n \\\"Function can only be called by authenticated addresses\\\"\\n );\\n _;\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Checks whether a given address is allowed to modify this contract.\\n * @param _address Address to check.\\n * @return Whether or not the address can modify this contract.\\n */\\n function isAuthenticated(\\n address _address\\n )\\n override\\n public\\n view\\n returns (\\n bool\\n )\\n {\\n return (_address == owner || _address == ovmExecutionManager);\\n }\\n\\n /**\\n * Sets the address of the OVM_ExecutionManager.\\n * @param _ovmExecutionManager Address of the OVM_ExecutionManager.\\n */\\n function setExecutionManager(\\n address _ovmExecutionManager\\n )\\n override\\n public\\n authenticated\\n {\\n ovmExecutionManager = _ovmExecutionManager;\\n }\\n\\n /**\\n * Inserts an account into the state.\\n * @param _address Address of the account to insert.\\n * @param _account Account to insert for the given address.\\n */\\n function putAccount(\\n address _address,\\n Lib_OVMCodec.Account memory _account\\n )\\n override\\n public\\n authenticated\\n {\\n accounts[_address] = _account;\\n }\\n\\n /**\\n * Marks an account as empty.\\n * @param _address Address of the account to mark.\\n */\\n function putEmptyAccount(\\n address _address\\n )\\n override\\n public\\n authenticated\\n {\\n Lib_OVMCodec.Account storage account = accounts[_address];\\n account.storageRoot = EMPTY_ACCOUNT_STORAGE_ROOT;\\n account.codeHash = EMPTY_ACCOUNT_CODE_HASH;\\n }\\n\\n /**\\n * Retrieves an account from the state.\\n * @param _address Address of the account to retrieve.\\n * @return Account for the given address.\\n */\\n function getAccount(\\n address _address\\n )\\n override\\n public\\n view\\n returns (\\n Lib_OVMCodec.Account memory\\n )\\n {\\n return accounts[_address];\\n }\\n\\n /**\\n * Checks whether the state has a given account.\\n * @param _address Address of the account to check.\\n * @return Whether or not the state has the account.\\n */\\n function hasAccount(\\n address _address\\n )\\n override\\n public\\n view\\n returns (\\n bool\\n )\\n {\\n return accounts[_address].codeHash != bytes32(0);\\n }\\n\\n /**\\n * Checks whether the state has a given known empty account.\\n * @param _address Address of the account to check.\\n * @return Whether or not the state has the empty account.\\n */\\n function hasEmptyAccount(\\n address _address\\n )\\n override\\n public\\n view\\n returns (\\n bool\\n )\\n {\\n return (\\n accounts[_address].codeHash == EMPTY_ACCOUNT_CODE_HASH\\n && accounts[_address].nonce == 0\\n );\\n }\\n\\n /**\\n * Sets the nonce of an account.\\n * @param _address Address of the account to modify.\\n * @param _nonce New account nonce.\\n */\\n function setAccountNonce(\\n address _address,\\n uint256 _nonce\\n )\\n override\\n public\\n authenticated\\n {\\n accounts[_address].nonce = _nonce;\\n }\\n\\n /**\\n * Gets the nonce of an account.\\n * @param _address Address of the account to access.\\n * @return Nonce of the account.\\n */\\n function getAccountNonce(\\n address _address\\n )\\n override\\n public\\n view\\n returns (\\n uint256\\n )\\n {\\n return accounts[_address].nonce;\\n }\\n\\n /**\\n * Retrieves the Ethereum address of an account.\\n * @param _address Address of the account to access.\\n * @return Corresponding Ethereum address.\\n */\\n function getAccountEthAddress(\\n address _address\\n )\\n override\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return accounts[_address].ethAddress;\\n }\\n\\n /**\\n * Retrieves the storage root of an account.\\n * @param _address Address of the account to access.\\n * @return Corresponding storage root.\\n */\\n function getAccountStorageRoot(\\n address _address\\n )\\n override\\n public\\n view\\n returns (\\n bytes32\\n )\\n {\\n return accounts[_address].storageRoot;\\n }\\n\\n /**\\n * Initializes a pending account (during CREATE or CREATE2) with the default values.\\n * @param _address Address of the account to initialize.\\n */\\n function initPendingAccount(\\n address _address\\n )\\n override\\n public\\n authenticated\\n {\\n Lib_OVMCodec.Account storage account = accounts[_address];\\n account.nonce = 1;\\n account.storageRoot = EMPTY_ACCOUNT_STORAGE_ROOT;\\n account.codeHash = EMPTY_ACCOUNT_CODE_HASH;\\n account.isFresh = true;\\n }\\n\\n /**\\n * Finalizes the creation of a pending account (during CREATE or CREATE2).\\n * @param _address Address of the account to finalize.\\n * @param _ethAddress Address of the account's associated contract on Ethereum.\\n * @param _codeHash Hash of the account's code.\\n */\\n function commitPendingAccount(\\n address _address,\\n address _ethAddress,\\n bytes32 _codeHash\\n )\\n override\\n public\\n authenticated\\n {\\n Lib_OVMCodec.Account storage account = accounts[_address];\\n account.ethAddress = _ethAddress;\\n account.codeHash = _codeHash;\\n }\\n\\n /**\\n * Checks whether an account has already been retrieved, and marks it as retrieved if not.\\n * @param _address Address of the account to check.\\n * @return Whether or not the account was already loaded.\\n */\\n function testAndSetAccountLoaded(\\n address _address\\n )\\n override\\n public\\n authenticated\\n returns (\\n bool\\n )\\n {\\n return _testAndSetItemState(\\n _getItemHash(_address),\\n ItemState.ITEM_LOADED\\n );\\n }\\n\\n /**\\n * Checks whether an account has already been modified, and marks it as modified if not.\\n * @param _address Address of the account to check.\\n * @return Whether or not the account was already modified.\\n */\\n function testAndSetAccountChanged(\\n address _address\\n )\\n override\\n public\\n authenticated\\n returns (\\n bool\\n )\\n {\\n return _testAndSetItemState(\\n _getItemHash(_address),\\n ItemState.ITEM_CHANGED\\n );\\n }\\n\\n /**\\n * Attempts to mark an account as committed.\\n * @param _address Address of the account to commit.\\n * @return Whether or not the account was committed.\\n */\\n function commitAccount(\\n address _address\\n )\\n override\\n public\\n authenticated\\n returns (\\n bool\\n )\\n {\\n bytes32 item = _getItemHash(_address);\\n if (itemStates[item] != ItemState.ITEM_CHANGED) {\\n return false;\\n }\\n\\n itemStates[item] = ItemState.ITEM_COMMITTED;\\n totalUncommittedAccounts -= 1;\\n\\n return true;\\n }\\n\\n /**\\n * Increments the total number of uncommitted accounts.\\n */\\n function incrementTotalUncommittedAccounts()\\n override\\n public\\n authenticated\\n {\\n totalUncommittedAccounts += 1;\\n }\\n\\n /**\\n * Gets the total number of uncommitted accounts.\\n * @return Total uncommitted accounts.\\n */\\n function getTotalUncommittedAccounts()\\n override\\n public\\n view\\n returns (\\n uint256\\n )\\n {\\n return totalUncommittedAccounts;\\n }\\n\\n /**\\n * Checks whether a given account was changed during execution.\\n * @param _address Address to check.\\n * @return Whether or not the account was changed.\\n */\\n function wasAccountChanged(\\n address _address\\n )\\n override\\n public\\n view\\n returns (\\n bool\\n )\\n {\\n bytes32 item = _getItemHash(_address);\\n return itemStates[item] >= ItemState.ITEM_CHANGED;\\n }\\n\\n /**\\n * Checks whether a given account was committed after execution.\\n * @param _address Address to check.\\n * @return Whether or not the account was committed.\\n */\\n function wasAccountCommitted(\\n address _address\\n )\\n override\\n public\\n view\\n returns (\\n bool\\n )\\n {\\n bytes32 item = _getItemHash(_address);\\n return itemStates[item] >= ItemState.ITEM_COMMITTED;\\n }\\n\\n\\n /************************************\\n * Public Functions: Storage Access *\\n ************************************/\\n\\n /**\\n * Changes a contract storage slot value.\\n * @param _contract Address of the contract to modify.\\n * @param _key 32 byte storage slot key.\\n * @param _value 32 byte storage slot value.\\n */\\n function putContractStorage(\\n address _contract,\\n bytes32 _key,\\n bytes32 _value\\n )\\n override\\n public\\n authenticated\\n {\\n // A hilarious optimization. `SSTORE`ing a value of `bytes32(0)` is common enough that it's\\n // worth populating this with a non-zero value in advance (during the fraud proof\\n // initialization phase) to cut the execution-time cost down to 5000 gas.\\n contractStorage[_contract][_key] = _value ^ STORAGE_XOR_VALUE;\\n\\n // Only used when initially populating the contract storage. OVM_ExecutionManager will\\n // perform a `hasContractStorage` INVALID_STATE_ACCESS check before putting any contract\\n // storage because writing to zero when the actual value is nonzero causes a gas\\n // discrepancy. Could be moved into a new `putVerifiedContractStorage` function, or\\n // something along those lines.\\n if (verifiedContractStorage[_contract][_key] == false) {\\n verifiedContractStorage[_contract][_key] = true;\\n }\\n }\\n\\n /**\\n * Retrieves a contract storage slot value.\\n * @param _contract Address of the contract to access.\\n * @param _key 32 byte storage slot key.\\n * @return 32 byte storage slot value.\\n */\\n function getContractStorage(\\n address _contract,\\n bytes32 _key\\n )\\n override\\n public\\n view\\n returns (\\n bytes32\\n )\\n {\\n // Storage XOR system doesn't work for newly created contracts that haven't set this\\n // storage slot value yet.\\n if (\\n verifiedContractStorage[_contract][_key] == false\\n && accounts[_contract].isFresh\\n ) {\\n return bytes32(0);\\n }\\n\\n // See `putContractStorage` for more information about the XOR here.\\n return contractStorage[_contract][_key] ^ STORAGE_XOR_VALUE;\\n }\\n\\n /**\\n * Checks whether a contract storage slot exists in the state.\\n * @param _contract Address of the contract to access.\\n * @param _key 32 byte storage slot key.\\n * @return Whether or not the key was set in the state.\\n */\\n function hasContractStorage(\\n address _contract,\\n bytes32 _key\\n )\\n override\\n public\\n view\\n returns (\\n bool\\n )\\n {\\n return verifiedContractStorage[_contract][_key] || accounts[_contract].isFresh;\\n }\\n\\n /**\\n * Checks whether a storage slot has already been retrieved, and marks it as retrieved if not.\\n * @param _contract Address of the contract to check.\\n * @param _key 32 byte storage slot key.\\n * @return Whether or not the slot was already loaded.\\n */\\n function testAndSetContractStorageLoaded(\\n address _contract,\\n bytes32 _key\\n )\\n override\\n public\\n authenticated\\n returns (\\n bool\\n )\\n {\\n return _testAndSetItemState(\\n _getItemHash(_contract, _key),\\n ItemState.ITEM_LOADED\\n );\\n }\\n\\n /**\\n * Checks whether a storage slot has already been modified, and marks it as modified if not.\\n * @param _contract Address of the contract to check.\\n * @param _key 32 byte storage slot key.\\n * @return Whether or not the slot was already modified.\\n */\\n function testAndSetContractStorageChanged(\\n address _contract,\\n bytes32 _key\\n )\\n override\\n public\\n authenticated\\n returns (\\n bool\\n )\\n {\\n return _testAndSetItemState(\\n _getItemHash(_contract, _key),\\n ItemState.ITEM_CHANGED\\n );\\n }\\n\\n /**\\n * Attempts to mark a storage slot as committed.\\n * @param _contract Address of the account to commit.\\n * @param _key 32 byte slot key to commit.\\n * @return Whether or not the slot was committed.\\n */\\n function commitContractStorage(\\n address _contract,\\n bytes32 _key\\n )\\n override\\n public\\n authenticated\\n returns (\\n bool\\n )\\n {\\n bytes32 item = _getItemHash(_contract, _key);\\n if (itemStates[item] != ItemState.ITEM_CHANGED) {\\n return false;\\n }\\n\\n itemStates[item] = ItemState.ITEM_COMMITTED;\\n totalUncommittedContractStorage -= 1;\\n\\n return true;\\n }\\n\\n /**\\n * Increments the total number of uncommitted storage slots.\\n */\\n function incrementTotalUncommittedContractStorage()\\n override\\n public\\n authenticated\\n {\\n totalUncommittedContractStorage += 1;\\n }\\n\\n /**\\n * Gets the total number of uncommitted storage slots.\\n * @return Total uncommitted storage slots.\\n */\\n function getTotalUncommittedContractStorage()\\n override\\n public\\n view\\n returns (\\n uint256\\n )\\n {\\n return totalUncommittedContractStorage;\\n }\\n\\n /**\\n * Checks whether a given storage slot was changed during execution.\\n * @param _contract Address to check.\\n * @param _key Key of the storage slot to check.\\n * @return Whether or not the storage slot was changed.\\n */\\n function wasContractStorageChanged(\\n address _contract,\\n bytes32 _key\\n )\\n override\\n public\\n view\\n returns (\\n bool\\n )\\n {\\n bytes32 item = _getItemHash(_contract, _key);\\n return itemStates[item] >= ItemState.ITEM_CHANGED;\\n }\\n\\n /**\\n * Checks whether a given storage slot was committed after execution.\\n * @param _contract Address to check.\\n * @param _key Key of the storage slot to check.\\n * @return Whether or not the storage slot was committed.\\n */\\n function wasContractStorageCommitted(\\n address _contract,\\n bytes32 _key\\n )\\n override\\n public\\n view\\n returns (\\n bool\\n )\\n {\\n bytes32 item = _getItemHash(_contract, _key);\\n return itemStates[item] >= ItemState.ITEM_COMMITTED;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Generates a unique hash for an address.\\n * @param _address Address to generate a hash for.\\n * @return Unique hash for the given address.\\n */\\n function _getItemHash(\\n address _address\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(abi.encodePacked(_address));\\n }\\n\\n /**\\n * Generates a unique hash for an address/key pair.\\n * @param _contract Address to generate a hash for.\\n * @param _key Key to generate a hash for.\\n * @return Unique hash for the given pair.\\n */\\n function _getItemHash(\\n address _contract,\\n bytes32 _key\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(abi.encodePacked(\\n _contract,\\n _key\\n ));\\n }\\n\\n /**\\n * Checks whether an item is in a particular state (ITEM_LOADED or ITEM_CHANGED) and sets the\\n * item to the provided state if not.\\n * @param _item 32 byte item ID to check.\\n * @param _minItemState Minimum state that must be satisfied by the item.\\n * @return Whether or not the item was already in the state.\\n */\\n function _testAndSetItemState(\\n bytes32 _item,\\n ItemState _minItemState\\n )\\n internal\\n returns (\\n bool\\n )\\n {\\n bool wasItemState = itemStates[_item] >= _minItemState;\\n\\n if (wasItemState == false) {\\n itemStates[_item] = _minItemState;\\n }\\n\\n return wasItemState;\\n }\\n}\\n\",\"keccak256\":\"0x8509e24a2c361ce37710e637800cf46ed97482ab5d12d32b5f1ef8adeb474814\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/execution/OVM_StateManagerFactory.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Interface Imports */\\nimport { iOVM_StateManager } from \\\"../../iOVM/execution/iOVM_StateManager.sol\\\";\\nimport { iOVM_StateManagerFactory } from \\\"../../iOVM/execution/iOVM_StateManagerFactory.sol\\\";\\n\\n/* Contract Imports */\\nimport { OVM_StateManager } from \\\"./OVM_StateManager.sol\\\";\\n\\n/**\\n * @title OVM_StateManagerFactory\\n * @dev The State Manager Factory is called by a State Transitioner's init code, to create a new\\n * State Manager for use in the Fraud Verification process.\\n * \\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract OVM_StateManagerFactory is iOVM_StateManagerFactory {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Creates a new OVM_StateManager\\n * @param _owner Owner of the created contract.\\n * @return New OVM_StateManager instance.\\n */\\n function create(\\n address _owner\\n )\\n override\\n public\\n returns (\\n iOVM_StateManager\\n )\\n {\\n return new OVM_StateManager(_owner);\\n }\\n}\\n\",\"keccak256\":\"0xe2576f2a2ef4e829464216212d919f4aa4bda7144b5454d111f6eaca4aaf4a33\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/execution/iOVM_StateManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title iOVM_StateManager\\n */\\ninterface iOVM_StateManager {\\n\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n enum ItemState {\\n ITEM_UNTOUCHED,\\n ITEM_LOADED,\\n ITEM_CHANGED,\\n ITEM_COMMITTED\\n }\\n\\n /***************************\\n * Public Functions: Misc *\\n ***************************/\\n\\n function isAuthenticated(address _address) external view returns (bool);\\n\\n /***************************\\n * Public Functions: Setup *\\n ***************************/\\n\\n function owner() external view returns (address _owner);\\n function ovmExecutionManager() external view returns (address _ovmExecutionManager);\\n function setExecutionManager(address _ovmExecutionManager) external;\\n\\n\\n /************************************\\n * Public Functions: Account Access *\\n ************************************/\\n\\n function putAccount(address _address, Lib_OVMCodec.Account memory _account) external;\\n function putEmptyAccount(address _address) external;\\n function getAccount(address _address) external view returns (Lib_OVMCodec.Account memory _account);\\n function hasAccount(address _address) external view returns (bool _exists);\\n function hasEmptyAccount(address _address) external view returns (bool _exists);\\n function setAccountNonce(address _address, uint256 _nonce) external;\\n function getAccountNonce(address _address) external view returns (uint256 _nonce);\\n function getAccountEthAddress(address _address) external view returns (address _ethAddress);\\n function getAccountStorageRoot(address _address) external view returns (bytes32 _storageRoot);\\n function initPendingAccount(address _address) external;\\n function commitPendingAccount(address _address, address _ethAddress, bytes32 _codeHash) external;\\n function testAndSetAccountLoaded(address _address) external returns (bool _wasAccountAlreadyLoaded);\\n function testAndSetAccountChanged(address _address) external returns (bool _wasAccountAlreadyChanged);\\n function commitAccount(address _address) external returns (bool _wasAccountCommitted);\\n function incrementTotalUncommittedAccounts() external;\\n function getTotalUncommittedAccounts() external view returns (uint256 _total);\\n function wasAccountChanged(address _address) external view returns (bool);\\n function wasAccountCommitted(address _address) external view returns (bool);\\n\\n\\n /************************************\\n * Public Functions: Storage Access *\\n ************************************/\\n\\n function putContractStorage(address _contract, bytes32 _key, bytes32 _value) external;\\n function getContractStorage(address _contract, bytes32 _key) external view returns (bytes32 _value);\\n function hasContractStorage(address _contract, bytes32 _key) external view returns (bool _exists);\\n function testAndSetContractStorageLoaded(address _contract, bytes32 _key) external returns (bool _wasContractStorageAlreadyLoaded);\\n function testAndSetContractStorageChanged(address _contract, bytes32 _key) external returns (bool _wasContractStorageAlreadyChanged);\\n function commitContractStorage(address _contract, bytes32 _key) external returns (bool _wasContractStorageCommitted);\\n function incrementTotalUncommittedContractStorage() external;\\n function getTotalUncommittedContractStorage() external view returns (uint256 _total);\\n function wasContractStorageChanged(address _contract, bytes32 _key) external view returns (bool);\\n function wasContractStorageCommitted(address _contract, bytes32 _key) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x7a11dbd1f61593ba34debe07e39eef59967307f7f372ba9855bee0953585d08d\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/execution/iOVM_StateManagerFactory.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Contract Imports */\\nimport { iOVM_StateManager } from \\\"./iOVM_StateManager.sol\\\";\\n\\n/**\\n * @title iOVM_StateManagerFactory\\n */\\ninterface iOVM_StateManagerFactory {\\n\\n /***************************************\\n * Public Functions: Contract Creation *\\n ***************************************/\\n\\n function create(\\n address _owner\\n )\\n external\\n returns (\\n iOVM_StateManager _ovmStateManager\\n );\\n}\\n\",\"keccak256\":\"0x27a90fc43889d0c7d1db50f37907ef7386d9b415d15a1e91a0a068cba59afd36\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/codec/Lib_OVMCodec.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../utils/Lib_Bytes32Utils.sol\\\";\\nimport { Lib_SafeExecutionManagerWrapper } from \\\"../../libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\\\";\\n\\n/**\\n * @title Lib_OVMCodec\\n */\\nlibrary Lib_OVMCodec {\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum EOASignatureType {\\n EIP155_TRANSACTION,\\n ETH_SIGNED_MESSAGE\\n }\\n\\n enum QueueOrigin {\\n SEQUENCER_QUEUE,\\n L1TOL2_QUEUE\\n }\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Account {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n address ethAddress;\\n bool isFresh;\\n }\\n\\n struct EVMAccount {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n }\\n\\n struct ChainBatchHeader {\\n uint256 batchIndex;\\n bytes32 batchRoot;\\n uint256 batchSize;\\n uint256 prevTotalElements;\\n bytes extraData;\\n }\\n\\n struct ChainInclusionProof {\\n uint256 index;\\n bytes32[] siblings;\\n }\\n\\n struct Transaction {\\n uint256 timestamp;\\n uint256 blockNumber;\\n QueueOrigin l1QueueOrigin;\\n address l1TxOrigin;\\n address entrypoint;\\n uint256 gasLimit;\\n bytes data;\\n }\\n\\n struct TransactionChainElement {\\n bool isSequenced;\\n uint256 queueIndex; // QUEUED TX ONLY\\n uint256 timestamp; // SEQUENCER TX ONLY\\n uint256 blockNumber; // SEQUENCER TX ONLY\\n bytes txData; // SEQUENCER TX ONLY\\n }\\n\\n struct QueueElement {\\n bytes32 transactionHash;\\n uint40 timestamp;\\n uint40 blockNumber;\\n }\\n\\n struct EIP155Transaction {\\n uint256 nonce;\\n uint256 gasPrice;\\n uint256 gasLimit;\\n address to;\\n uint256 value;\\n bytes data;\\n uint256 chainId;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Decodes an EOA transaction (i.e., native Ethereum RLP encoding).\\n * @param _transaction Encoded EOA transaction.\\n * @return Transaction decoded into a struct.\\n */\\n function decodeEIP155Transaction(\\n bytes memory _transaction,\\n bool _isEthSignedMessage\\n )\\n internal\\n pure\\n returns (\\n EIP155Transaction memory\\n )\\n {\\n if (_isEthSignedMessage) {\\n (\\n uint256 _nonce,\\n uint256 _gasLimit,\\n uint256 _gasPrice,\\n uint256 _chainId,\\n address _to,\\n bytes memory _data\\n ) = abi.decode(\\n _transaction,\\n (uint256, uint256, uint256, uint256, address ,bytes)\\n );\\n return EIP155Transaction({\\n nonce: _nonce,\\n gasPrice: _gasPrice,\\n gasLimit: _gasLimit,\\n to: _to,\\n value: 0,\\n data: _data,\\n chainId: _chainId\\n });\\n } else {\\n Lib_RLPReader.RLPItem[] memory decoded = Lib_RLPReader.readList(_transaction);\\n\\n return EIP155Transaction({\\n nonce: Lib_RLPReader.readUint256(decoded[0]),\\n gasPrice: Lib_RLPReader.readUint256(decoded[1]),\\n gasLimit: Lib_RLPReader.readUint256(decoded[2]),\\n to: Lib_RLPReader.readAddress(decoded[3]),\\n value: Lib_RLPReader.readUint256(decoded[4]),\\n data: Lib_RLPReader.readBytes(decoded[5]),\\n chainId: Lib_RLPReader.readUint256(decoded[6])\\n });\\n }\\n }\\n\\n /**\\n * Decompresses a compressed EIP155 transaction.\\n * @param _transaction Compressed EIP155 transaction bytes.\\n * @return Transaction parsed into a struct.\\n */\\n function decompressEIP155Transaction(\\n bytes memory _transaction\\n )\\n internal\\n returns (\\n EIP155Transaction memory\\n )\\n {\\n return EIP155Transaction({\\n gasLimit: Lib_BytesUtils.toUint24(_transaction, 0),\\n gasPrice: uint256(Lib_BytesUtils.toUint24(_transaction, 3)) * 1000000,\\n nonce: Lib_BytesUtils.toUint24(_transaction, 6),\\n to: Lib_BytesUtils.toAddress(_transaction, 9),\\n data: Lib_BytesUtils.slice(_transaction, 29),\\n chainId: Lib_SafeExecutionManagerWrapper.safeCHAINID(),\\n value: 0\\n });\\n }\\n\\n /**\\n * Encodes an EOA transaction back into the original transaction.\\n * @param _transaction EIP155transaction to encode.\\n * @param _isEthSignedMessage Whether or not this was an eth signed message.\\n * @return Encoded transaction.\\n */\\n function encodeEIP155Transaction(\\n EIP155Transaction memory _transaction,\\n bool _isEthSignedMessage\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n if (_isEthSignedMessage) {\\n return abi.encode(\\n _transaction.nonce,\\n _transaction.gasLimit,\\n _transaction.gasPrice,\\n _transaction.chainId,\\n _transaction.to,\\n _transaction.data\\n );\\n } else {\\n bytes[] memory raw = new bytes[](9);\\n\\n raw[0] = Lib_RLPWriter.writeUint(_transaction.nonce);\\n raw[1] = Lib_RLPWriter.writeUint(_transaction.gasPrice);\\n raw[2] = Lib_RLPWriter.writeUint(_transaction.gasLimit);\\n if (_transaction.to == address(0)) {\\n raw[3] = Lib_RLPWriter.writeBytes('');\\n } else {\\n raw[3] = Lib_RLPWriter.writeAddress(_transaction.to);\\n }\\n raw[4] = Lib_RLPWriter.writeUint(0);\\n raw[5] = Lib_RLPWriter.writeBytes(_transaction.data);\\n raw[6] = Lib_RLPWriter.writeUint(_transaction.chainId);\\n raw[7] = Lib_RLPWriter.writeBytes(bytes(''));\\n raw[8] = Lib_RLPWriter.writeBytes(bytes(''));\\n\\n return Lib_RLPWriter.writeList(raw);\\n }\\n }\\n\\n /**\\n * Encodes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Encoded transaction bytes.\\n */\\n function encodeTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return abi.encodePacked(\\n _transaction.timestamp,\\n _transaction.blockNumber,\\n _transaction.l1QueueOrigin,\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n );\\n }\\n\\n /**\\n * Hashes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Hashed transaction\\n */\\n function hashTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(encodeTransaction(_transaction));\\n }\\n\\n /**\\n * Converts an OVM account to an EVM account.\\n * @param _in OVM account to convert.\\n * @return Converted EVM account.\\n */\\n function toEVMAccount(\\n Account memory _in\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n return EVMAccount({\\n nonce: _in.nonce,\\n balance: _in.balance,\\n storageRoot: _in.storageRoot,\\n codeHash: _in.codeHash\\n });\\n }\\n\\n /**\\n * @notice RLP-encodes an account state struct.\\n * @param _account Account state struct.\\n * @return RLP-encoded account state.\\n */\\n function encodeEVMAccount(\\n EVMAccount memory _account\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes[] memory raw = new bytes[](4);\\n\\n // Unfortunately we can't create this array outright because\\n // Lib_RLPWriter.writeList will reject fixed-size arrays. Assigning\\n // index-by-index circumvents this issue.\\n raw[0] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.nonce)\\n )\\n );\\n raw[1] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.balance)\\n )\\n );\\n raw[2] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.storageRoot));\\n raw[3] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.codeHash));\\n\\n return Lib_RLPWriter.writeList(raw);\\n }\\n\\n /**\\n * @notice Decodes an RLP-encoded account state into a useful struct.\\n * @param _encoded RLP-encoded account state.\\n * @return Account state struct.\\n */\\n function decodeEVMAccount(\\n bytes memory _encoded\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\\n\\n return EVMAccount({\\n nonce: Lib_RLPReader.readUint256(accountState[0]),\\n balance: Lib_RLPReader.readUint256(accountState[1]),\\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\\n });\\n }\\n\\n /**\\n * Calculates a hash for a given batch header.\\n * @param _batchHeader Header to hash.\\n * @return Hash of the header.\\n */\\n function hashBatchHeader(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(\\n abi.encode(\\n _batchHeader.batchRoot,\\n _batchHeader.batchSize,\\n _batchHeader.prevTotalElements,\\n _batchHeader.extraData\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0xe7e518ba7bba3fa28c532f8902576c1bb4dfc1ec4b62bed6da50623248ba17c3\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPReader.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_RLPReader\\n * @dev Adapted from \\\"RLPReader\\\" by Hamdi Allam (hamdi.allam97@gmail.com).\\n */\\nlibrary Lib_RLPReader {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 constant internal MAX_LIST_LENGTH = 32;\\n\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum RLPItemType {\\n DATA_ITEM,\\n LIST_ITEM\\n }\\n\\n \\n /***********\\n * Structs *\\n ***********/\\n\\n struct RLPItem {\\n uint256 length;\\n uint256 ptr;\\n }\\n \\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n \\n /**\\n * Converts bytes to a reference to memory position and length.\\n * @param _in Input bytes to convert.\\n * @return Output memory reference.\\n */\\n function toRLPItem(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem memory\\n )\\n {\\n uint256 ptr;\\n assembly {\\n ptr := add(_in, 32)\\n }\\n\\n return RLPItem({\\n length: _in.length,\\n ptr: ptr\\n });\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n (\\n uint256 listOffset,\\n ,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.LIST_ITEM,\\n \\\"Invalid RLP list value.\\\"\\n );\\n\\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\\n // writing to the length. Since we can't know the number of RLP items without looping over\\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\\n // simply set a reasonable maximum list length and decrease the size before we finish.\\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\\n\\n uint256 itemCount = 0;\\n uint256 offset = listOffset;\\n while (offset < _in.length) {\\n require(\\n itemCount < MAX_LIST_LENGTH,\\n \\\"Provided RLP list exceeds max list length.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n ) = _decodeLength(RLPItem({\\n length: _in.length - offset,\\n ptr: _in.ptr + offset\\n }));\\n\\n out[itemCount] = RLPItem({\\n length: itemLength + itemOffset,\\n ptr: _in.ptr + offset\\n });\\n\\n itemCount += 1;\\n offset += itemOffset + itemLength;\\n }\\n\\n // Decrease the array size to match the actual item count.\\n assembly {\\n mstore(out, itemCount)\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n return readList(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes value.\\\"\\n );\\n\\n return _copy(_in.ptr, itemOffset, itemLength);\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return readBytes(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return string(readBytes(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return readString(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n require(\\n _in.length <= 33,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr + itemOffset;\\n bytes32 out;\\n assembly {\\n out := mload(ptr)\\n\\n // Shift the bytes over to match the item size.\\n if lt(itemLength, 32) {\\n out := div(out, exp(256, sub(32, itemLength)))\\n }\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return readBytes32(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return uint256(readBytes32(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return readUint256(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n require(\\n _in.length == 1,\\n \\\"Invalid RLP boolean value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 out;\\n assembly {\\n out := byte(0, mload(ptr))\\n }\\n\\n require(\\n out == 0 || out == 1,\\n \\\"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\\\"\\n );\\n\\n return out != 0;\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return readBool(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n if (_in.length == 1) {\\n return address(0);\\n }\\n\\n require(\\n _in.length == 21,\\n \\\"Invalid RLP address value.\\\"\\n );\\n\\n return address(readUint256(_in));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return readAddress(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads the raw bytes of an RLP item.\\n * @param _in RLP item to read.\\n * @return Raw RLP bytes.\\n */\\n function readRawBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in);\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Decodes the length of an RLP item.\\n * @param _in RLP item to decode.\\n * @return Offset of the encoded data.\\n * @return Length of the encoded data.\\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\\n */\\n function _decodeLength(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n uint256,\\n uint256,\\n RLPItemType\\n )\\n {\\n require(\\n _in.length > 0,\\n \\\"RLP item cannot be null.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 prefix;\\n assembly {\\n prefix := byte(0, mload(ptr))\\n }\\n\\n if (prefix <= 0x7f) {\\n // Single byte.\\n\\n return (0, 1, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xb7) {\\n // Short string.\\n\\n uint256 strLen = prefix - 0x80;\\n \\n require(\\n _in.length > strLen,\\n \\\"Invalid RLP short string.\\\"\\n );\\n\\n return (1, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xbf) {\\n // Long string.\\n uint256 lenOfStrLen = prefix - 0xb7;\\n\\n require(\\n _in.length > lenOfStrLen,\\n \\\"Invalid RLP long string length.\\\"\\n );\\n\\n uint256 strLen;\\n assembly {\\n // Pick out the string length.\\n strLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfStrLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfStrLen + strLen,\\n \\\"Invalid RLP long string.\\\"\\n );\\n\\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xf7) {\\n // Short list.\\n uint256 listLen = prefix - 0xc0;\\n\\n require(\\n _in.length > listLen,\\n \\\"Invalid RLP short list.\\\"\\n );\\n\\n return (1, listLen, RLPItemType.LIST_ITEM);\\n } else {\\n // Long list.\\n uint256 lenOfListLen = prefix - 0xf7;\\n\\n require(\\n _in.length > lenOfListLen,\\n \\\"Invalid RLP long list length.\\\"\\n );\\n\\n uint256 listLen;\\n assembly {\\n // Pick out the list length.\\n listLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfListLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfListLen + listLen,\\n \\\"Invalid RLP long list.\\\"\\n );\\n\\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\\n }\\n }\\n\\n /**\\n * Copies the bytes from a memory location.\\n * @param _src Pointer to the location to read from.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Copied bytes.\\n */\\n function _copy(\\n uint256 _src,\\n uint256 _offset,\\n uint256 _length\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out = new bytes(_length);\\n if (out.length == 0) {\\n return out;\\n }\\n\\n uint256 src = _src + _offset;\\n uint256 dest;\\n assembly {\\n dest := add(out, 32)\\n }\\n\\n // Copy over as many complete words as we can.\\n for (uint256 i = 0; i < _length / 32; i++) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n\\n src += 32;\\n dest += 32;\\n }\\n\\n // Pick out the remaining bytes.\\n uint256 mask = 256 ** (32 - (_length % 32)) - 1;\\n assembly {\\n mstore(\\n dest,\\n or(\\n and(mload(src), not(mask)),\\n and(mload(dest), mask)\\n )\\n )\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Copies an RLP item into bytes.\\n * @param _in RLP item to copy.\\n * @return Copied bytes.\\n */\\n function _copy(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in.ptr, 0, _in.length);\\n }\\n}\\n\",\"keccak256\":\"0xbdb8fae0ca2483b4cc07607a5070fc25e33c54b4e4462b99e7c0b13aac48a09b\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPWriter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\n\\n/**\\n * @title Lib_RLPWriter\\n * @author Bakaoh (with modifications)\\n */\\nlibrary Lib_RLPWriter {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * RLP encodes a byte string.\\n * @param _in The byte string to encode.\\n * @return _out The RLP encoded string in bytes.\\n */\\n function writeBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n bytes memory encoded;\\n\\n if (_in.length == 1 && uint8(_in[0]) < 128) {\\n encoded = _in;\\n } else {\\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * RLP encodes a list of RLP encoded byte byte strings.\\n * @param _in The list of RLP encoded byte strings.\\n * @return _out The RLP encoded list of items in bytes.\\n */\\n function writeList(\\n bytes[] memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n bytes memory list = _flatten(_in);\\n return abi.encodePacked(_writeLength(list.length, 192), list);\\n }\\n\\n /**\\n * RLP encodes a string.\\n * @param _in The string to encode.\\n * @return _out The RLP encoded string in bytes.\\n */\\n function writeString(\\n string memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(bytes(_in));\\n }\\n\\n /**\\n * RLP encodes an address.\\n * @param _in The address to encode.\\n * @return _out The RLP encoded address in bytes.\\n */\\n function writeAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a uint.\\n * @param _in The uint256 to encode.\\n * @return _out The RLP encoded uint256 in bytes.\\n */\\n function writeUint(\\n uint256 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(_toBinary(_in));\\n }\\n\\n /**\\n * RLP encodes a bool.\\n * @param _in The bool to encode.\\n * @return _out The RLP encoded bool in bytes.\\n */\\n function writeBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n bytes memory encoded = new bytes(1);\\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\\n return encoded;\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\\n * @param _len The length of the string or the payload.\\n * @param _offset 128 if item is string, 192 if item is list.\\n * @return _encoded RLP encoded bytes.\\n */\\n function _writeLength(\\n uint256 _len,\\n uint256 _offset\\n )\\n private\\n pure\\n returns (\\n bytes memory _encoded\\n )\\n {\\n bytes memory encoded;\\n\\n if (_len < 56) {\\n encoded = new bytes(1);\\n encoded[0] = byte(uint8(_len) + uint8(_offset));\\n } else {\\n uint256 lenLen;\\n uint256 i = 1;\\n while (_len / i != 0) {\\n lenLen++;\\n i *= 256;\\n }\\n\\n encoded = new bytes(lenLen + 1);\\n encoded[0] = byte(uint8(lenLen) + uint8(_offset) + 55);\\n for(i = 1; i <= lenLen; i++) {\\n encoded[i] = byte(uint8((_len / (256**(lenLen-i))) % 256));\\n }\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * Encode integer in big endian binary form with no leading zeroes.\\n * @notice TODO: This should be optimized with assembly to save gas costs.\\n * @param _x The integer to encode.\\n * @return _binary RLP encoded bytes.\\n */\\n function _toBinary(\\n uint256 _x\\n )\\n private\\n pure\\n returns (\\n bytes memory _binary\\n )\\n {\\n bytes memory b = abi.encodePacked(_x);\\n\\n uint256 i = 0;\\n for (; i < 32; i++) {\\n if (b[i] != 0) {\\n break;\\n }\\n }\\n\\n bytes memory res = new bytes(32 - i);\\n for (uint256 j = 0; j < res.length; j++) {\\n res[j] = b[i++];\\n }\\n\\n return res;\\n }\\n\\n /**\\n * Copies a piece of memory to another location.\\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\\n * @param _dest Destination location.\\n * @param _src Source location.\\n * @param _len Length of memory to copy.\\n */\\n function _memcpy(\\n uint256 _dest,\\n uint256 _src,\\n uint256 _len\\n )\\n private\\n pure\\n {\\n uint256 dest = _dest;\\n uint256 src = _src;\\n uint256 len = _len;\\n\\n for(; len >= 32; len -= 32) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n dest += 32;\\n src += 32;\\n }\\n\\n uint256 mask = 256 ** (32 - len) - 1;\\n assembly {\\n let srcpart := and(mload(src), not(mask))\\n let destpart := and(mload(dest), mask)\\n mstore(dest, or(destpart, srcpart))\\n }\\n }\\n\\n /**\\n * Flattens a list of byte strings into one byte string.\\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\\n * @param _list List of byte strings to flatten.\\n * @return _flattened The flattened byte string.\\n */\\n function _flatten(\\n bytes[] memory _list\\n )\\n private\\n pure\\n returns (\\n bytes memory _flattened\\n )\\n {\\n if (_list.length == 0) {\\n return new bytes(0);\\n }\\n\\n uint256 len;\\n uint256 i = 0;\\n for (; i < _list.length; i++) {\\n len += _list[i].length;\\n }\\n\\n bytes memory flattened = new bytes(len);\\n uint256 flattenedPtr;\\n assembly { flattenedPtr := add(flattened, 0x20) }\\n\\n for(i = 0; i < _list.length; i++) {\\n bytes memory item = _list[i];\\n\\n uint256 listPtr;\\n assembly { listPtr := add(item, 0x20)}\\n\\n _memcpy(flattenedPtr, listPtr, item.length);\\n flattenedPtr += _list[i].length;\\n }\\n\\n return flattened;\\n }\\n}\",\"keccak256\":\"0xbcb24619c1758cb0d9f3fe5c79495950045a9087046a02b9ce01df46ae09ae5b\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_Bytes32Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_Byte32Utils\\n */\\nlibrary Lib_Bytes32Utils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \\\"true.\\\"\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as a boolean.\\n */\\n function toBool(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return _in != 0;\\n }\\n\\n /**\\n * Converts a boolean to a bytes32 value.\\n * @param _in Input boolean value.\\n * @return Boolean as a bytes32.\\n */\\n function fromBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in ? 1 : 0));\\n }\\n\\n /**\\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as an address.\\n */\\n function toAddress(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return address(uint160(uint256(_in)));\\n }\\n\\n /**\\n * Converts an address to a bytes32.\\n * @param _in Input address value.\\n * @return Address as a bytes32.\\n */\\n function fromAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in));\\n }\\n\\n /**\\n * Removes the leading zeros from a bytes32 value and returns a new (smaller) bytes value.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 without any leading zeros.\\n */\\n function removeLeadingZeros(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out;\\n\\n assembly {\\n // Figure out how many leading zero bytes to remove.\\n let shift := 0\\n for { let i := 0 } and(lt(i, 32), eq(byte(i, _in), 0)) { i := add(i, 1) } {\\n shift := add(shift, 1)\\n }\\n\\n // Reserve some space for our output and fix the free memory pointer.\\n out := mload(0x40)\\n mstore(0x40, add(out, 0x40))\\n\\n // Shift the value and store it into the output bytes.\\n mstore(add(out, 0x20), shl(mul(shift, 8), _in))\\n\\n // Store the new size (with leading zero bytes removed) in the output byte size.\\n mstore(out, sub(32, shift))\\n }\\n\\n return out;\\n }\\n}\\n\",\"keccak256\":\"0xfa2def593e3fc56a31852c3744aefdaa93cec74e721bfcfeb1e5d166c7c60b64\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_BytesUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_BytesUtils\\n */\\nlibrary Lib_BytesUtils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_start + _length >= _start, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n if (_bytes.length - _start == 0) {\\n return bytes('');\\n }\\n\\n return slice(_bytes, _start, _bytes.length - _start);\\n }\\n\\n function toBytes32PadLeft(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes32)\\n {\\n bytes32 ret;\\n uint256 len = _bytes.length <= 32 ? _bytes.length : 32;\\n assembly {\\n ret := shr(mul(sub(32, len), 8), mload(add(_bytes, 32)))\\n }\\n return ret;\\n }\\n\\n function toBytes32(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes32)\\n {\\n if (_bytes.length < 32) {\\n bytes32 ret;\\n assembly {\\n ret := mload(add(_bytes, 32))\\n }\\n return ret;\\n }\\n\\n return abi.decode(_bytes,(bytes32)); // will truncate if input length > 32 bytes\\n }\\n\\n function toUint256(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (uint256)\\n {\\n return uint256(toBytes32(_bytes));\\n }\\n\\n function toUint24(bytes memory _bytes, uint256 _start) internal pure returns (uint24) {\\n require(_start + 3 >= _start, \\\"toUint24_overflow\\\");\\n require(_bytes.length >= _start + 3 , \\\"toUint24_outOfBounds\\\");\\n uint24 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x3), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toUint8(bytes memory _bytes, uint256 _start) internal pure returns (uint8) {\\n require(_start + 1 >= _start, \\\"toUint8_overflow\\\");\\n require(_bytes.length >= _start + 1 , \\\"toUint8_outOfBounds\\\");\\n uint8 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x1), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toAddress(bytes memory _bytes, uint256 _start) internal pure returns (address) {\\n require(_start + 20 >= _start, \\\"toAddress_overflow\\\");\\n require(_bytes.length >= _start + 20, \\\"toAddress_outOfBounds\\\");\\n address tempAddress;\\n\\n assembly {\\n tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000)\\n }\\n\\n return tempAddress;\\n }\\n\\n function toNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n bytes memory nibbles = new bytes(_bytes.length * 2);\\n\\n for (uint256 i = 0; i < _bytes.length; i++) {\\n nibbles[i * 2] = _bytes[i] >> 4;\\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\\n }\\n\\n return nibbles;\\n }\\n\\n function fromNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n bytes memory ret = new bytes(_bytes.length / 2);\\n\\n for (uint256 i = 0; i < ret.length; i++) {\\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\\n }\\n\\n return ret;\\n }\\n\\n function equal(\\n bytes memory _bytes,\\n bytes memory _other\\n )\\n internal\\n pure\\n returns (bool)\\n {\\n return keccak256(_bytes) == keccak256(_other);\\n }\\n}\\n\",\"keccak256\":\"0x0adf22e1b22ba09911e859f64cb3b484e992be4f9fd3b09088e6225bf8d06ce0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_ErrorUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/**\\n * @title Lib_ErrorUtils\\n */\\nlibrary Lib_ErrorUtils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Encodes an error string into raw solidity-style revert data.\\n * (i.e. ascii bytes, prefixed with bytes4(keccak(\\\"Error(string))\\\"))\\n * Ref: https://docs.soliditylang.org/en/v0.8.2/control-structures.html?highlight=Error(string)#panic-via-assert-and-error-via-require\\n * @param _reason Reason for the reversion.\\n * @return Standard solidity revert data for the given reason.\\n */\\n function encodeRevertString(\\n string memory _reason\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return abi.encodeWithSignature(\\n \\\"Error(string)\\\",\\n _reason\\n );\\n }\\n}\\n\",\"keccak256\":\"0xfc64ec4a81fb50865b502a0004ed154e8598e1a313db77303fc95e41f536e6b7\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_ErrorUtils } from \\\"../utils/Lib_ErrorUtils.sol\\\";\\n\\n/**\\n * @title Lib_SafeExecutionManagerWrapper\\n * @dev The Safe Execution Manager Wrapper provides functions which facilitate writing OVM safe \\n * code using the standard solidity compiler, by routing all its operations through the Execution \\n * Manager.\\n * \\n * Compiler used: solc\\n * Runtime target: OVM\\n */\\nlibrary Lib_SafeExecutionManagerWrapper {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Performs a safe ovmCALL.\\n * @param _gasLimit Gas limit for the call.\\n * @param _target Address to call.\\n * @param _calldata Data to send to the call.\\n * @return _success Whether or not the call reverted.\\n * @return _returndata Data returned by the call.\\n */\\n function safeCALL(\\n uint256 _gasLimit,\\n address _target,\\n bytes memory _calldata\\n )\\n internal\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCALL(uint256,address,bytes)\\\",\\n _gasLimit,\\n _target,\\n _calldata\\n )\\n );\\n\\n return abi.decode(returndata, (bool, bytes));\\n }\\n\\n /**\\n * Performs a safe ovmDELEGATECALL.\\n * @param _gasLimit Gas limit for the call.\\n * @param _target Address to call.\\n * @param _calldata Data to send to the call.\\n * @return _success Whether or not the call reverted.\\n * @return _returndata Data returned by the call.\\n */\\n function safeDELEGATECALL(\\n uint256 _gasLimit,\\n address _target,\\n bytes memory _calldata\\n )\\n internal\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmDELEGATECALL(uint256,address,bytes)\\\",\\n _gasLimit,\\n _target,\\n _calldata\\n )\\n );\\n\\n return abi.decode(returndata, (bool, bytes));\\n }\\n\\n /**\\n * Performs a safe ovmCREATE call.\\n * @param _gasLimit Gas limit for the creation.\\n * @param _bytecode Code for the new contract.\\n * @return _contract Address of the created contract.\\n */\\n function safeCREATE(\\n uint256 _gasLimit,\\n bytes memory _bytecode\\n )\\n internal\\n returns (\\n address,\\n bytes memory\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n _gasLimit,\\n abi.encodeWithSignature(\\n \\\"ovmCREATE(bytes)\\\",\\n _bytecode\\n )\\n );\\n\\n return abi.decode(returndata, (address, bytes));\\n }\\n\\n /**\\n * Performs a safe ovmEXTCODESIZE call.\\n * @param _contract Address of the contract to query the size of.\\n * @return _EXTCODESIZE Size of the requested contract in bytes.\\n */\\n function safeEXTCODESIZE(\\n address _contract\\n )\\n internal\\n returns (\\n uint256 _EXTCODESIZE\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmEXTCODESIZE(address)\\\",\\n _contract\\n )\\n );\\n\\n return abi.decode(returndata, (uint256));\\n }\\n\\n /**\\n * Performs a safe ovmCHAINID call.\\n * @return _CHAINID Result of calling ovmCHAINID.\\n */\\n function safeCHAINID()\\n internal\\n returns (\\n uint256 _CHAINID\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCHAINID()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (uint256));\\n }\\n\\n /**\\n * Performs a safe ovmCALLER call.\\n * @return _CALLER Result of calling ovmCALLER.\\n */\\n function safeCALLER()\\n internal\\n returns (\\n address _CALLER\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCALLER()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (address));\\n }\\n\\n /**\\n * Performs a safe ovmADDRESS call.\\n * @return _ADDRESS Result of calling ovmADDRESS.\\n */\\n function safeADDRESS()\\n internal\\n returns (\\n address _ADDRESS\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmADDRESS()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (address));\\n }\\n\\n /**\\n * Performs a safe ovmGETNONCE call.\\n * @return _nonce Result of calling ovmGETNONCE.\\n */\\n function safeGETNONCE()\\n internal\\n returns (\\n uint256 _nonce\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmGETNONCE()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (uint256));\\n }\\n\\n /**\\n * Performs a safe ovmINCREMENTNONCE call.\\n */\\n function safeINCREMENTNONCE()\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmINCREMENTNONCE()\\\"\\n )\\n );\\n }\\n\\n /**\\n * Performs a safe ovmCREATEEOA call.\\n * @param _messageHash Message hash which was signed by EOA\\n * @param _v v value of signature (0 or 1)\\n * @param _r r value of signature\\n * @param _s s value of signature\\n */\\n function safeCREATEEOA(\\n bytes32 _messageHash,\\n uint8 _v,\\n bytes32 _r,\\n bytes32 _s\\n )\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCREATEEOA(bytes32,uint8,bytes32,bytes32)\\\",\\n _messageHash,\\n _v,\\n _r,\\n _s\\n )\\n );\\n }\\n\\n /**\\n * Performs a safe REVERT.\\n * @param _reason String revert reason to pass along with the REVERT.\\n */\\n function safeREVERT(\\n string memory _reason\\n )\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmREVERT(bytes)\\\",\\n Lib_ErrorUtils.encodeRevertString(\\n _reason\\n )\\n )\\n );\\n }\\n\\n /**\\n * Performs a safe \\\"require\\\".\\n * @param _condition Boolean condition that must be true or will revert.\\n * @param _reason String revert reason to pass along with the REVERT.\\n */\\n function safeREQUIRE(\\n bool _condition,\\n string memory _reason\\n )\\n internal\\n {\\n if (!_condition) {\\n safeREVERT(\\n _reason\\n );\\n }\\n }\\n\\n /**\\n * Performs a safe ovmSLOAD call.\\n */\\n function safeSLOAD(\\n bytes32 _key\\n )\\n internal\\n returns (\\n bytes32\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmSLOAD(bytes32)\\\",\\n _key\\n )\\n );\\n\\n return abi.decode(returndata, (bytes32));\\n }\\n\\n /**\\n * Performs a safe ovmSSTORE call.\\n */\\n function safeSSTORE(\\n bytes32 _key,\\n bytes32 _value\\n )\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmSSTORE(bytes32,bytes32)\\\",\\n _key,\\n _value\\n )\\n );\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Performs an ovm interaction and the necessary safety checks.\\n * @param _gasLimit Gas limit for the interaction.\\n * @param _calldata Data to send to the OVM_ExecutionManager (encoded with sighash).\\n * @return _returndata Data sent back by the OVM_ExecutionManager.\\n */\\n function _safeExecutionManagerInteraction(\\n uint256 _gasLimit,\\n bytes memory _calldata\\n )\\n private\\n returns (\\n bytes memory _returndata\\n )\\n {\\n address ovmExecutionManager = msg.sender;\\n (\\n bool success,\\n bytes memory returndata\\n ) = ovmExecutionManager.call{gas: _gasLimit}(_calldata);\\n\\n if (success == false) {\\n assembly {\\n revert(add(returndata, 0x20), mload(returndata))\\n }\\n } else if (returndata.length == 1) {\\n assembly {\\n return(0, 1)\\n }\\n } else {\\n return returndata;\\n }\\n }\\n\\n function _safeExecutionManagerInteraction(\\n bytes memory _calldata\\n )\\n private\\n returns (\\n bytes memory _returndata\\n )\\n {\\n return _safeExecutionManagerInteraction(\\n gasleft(),\\n _calldata\\n );\\n }\\n}\\n\",\"keccak256\":\"0x41e146e7912af794a17cd43c5a276674be956bfa8f3ca5b451bcb82d81e6f492\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x608060405234801561001057600080fd5b506113e5806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c80639ed9331814610030575b600080fd5b6100566004803603602081101561004657600080fd5b50356001600160a01b0316610072565b604080516001600160a01b039092168252519081900360200190f35b600081604051610081906100b5565b6001600160a01b03909116815260405190819003602001906000f0801580156100ae573d6000803e3d6000fd5b5092915050565b611316806100c38339019056fe608060405234801561001057600080fd5b5060405161131638038061131683398101604081905261002f91610054565b600080546001600160a01b0319166001600160a01b0392909216919091179055610082565b600060208284031215610065578081fd5b81516001600160a01b038116811461007b578182fd5b9392505050565b611285806100916000396000f3fe608060405234801561001057600080fd5b50600436106101f05760003560e01c80638f3b96471161010f578063d126199f116100a2578063e90abb8611610071578063e90abb86146103f9578063fb37b31c1461040c578063fbcbc0f11461041f578063fcf149a21461043f576101f0565b8063d126199f146103b8578063d15d4150146103cb578063d54414c8146103de578063d7bd4a2a146103f1576101f0565b8063c3fd9b25116100de578063c3fd9b2514610377578063c7650bf21461037f578063c8e40fbf14610392578063d0a215f2146103a5576101f0565b80638f3b96471461033657806399056ba914610349578063af37b86414610351578063af3dc01114610364576101f0565b806333f94305116101875780636f3c75af116101565780636f3c75af146102f55780637c8ee703146103085780637e86faa81461031b5780638da5cb5b1461032e576101f0565b806333f94305146102b25780635c17d629146102ba5780636b18e4e8146102cd5780636c87ad20146102e0576101f0565b8063167020d2116101c3578063167020d2146102595780631aaf392f1461026c5780631b208a5a1461028c57806326dc5b121461029f576101f0565b806307a12945146101f55780630ad226791461021e57806311b1f790146102315780631381ba4d14610244575b600080fd5b61020861020336600461101d565b610452565b60405161021591906111c4565b60405180910390f35b61020861022c366004611072565b6104ba565b61020861023f36600461101d565b610517565b61025761025236600461101d565b610573565b005b61020861026736600461101d565b6105d4565b61027f61027a366004611072565b610679565b60405161021591906111cf565b61020861029a36600461101d565b610727565b61027f6102ad36600461101d565b61075e565b61025761077d565b6102576102c836600461109b565b6107c7565b6102576102db36600461101d565b61089a565b6102e8610944565b60405161021591906111b0565b610208610303366004611072565b610953565b6102e861031636600461101d565b61098c565b610208610329366004611072565b6109ad565b6102e86109c3565b6102576103443660046110cd565b6109d2565b61027f610a88565b61020861035f366004611072565b610a8e565b610208610372366004611072565b610ae2565b610257610b2f565b61020861038d366004611072565b610b79565b6102086103a036600461101d565b610c20565b6102576103b3366004611037565b610c40565b61027f6103c636600461101d565b610cb9565b6102086103d936600461101d565b610cd4565b6102086103ec36600461101d565b610d01565b61027f610d16565b610257610407366004611072565b610d1c565b61020861041a36600461101d565b610d77565b61043261042d36600461101d565b610dc3565b604051610215919061122e565b61025761044d36600461101d565b610e37565b6001600160a01b0381166000908152600260205260408120600301547fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4701480156104b257506001600160a01b038216600090815260026020526040902054155b90505b919050565b6001600160a01b038216600090815260046020908152604080832084845290915281205460ff168061050e57506001600160a01b038316600090815260026020526040902060040154600160a01b900460ff165b90505b92915050565b600080546001600160a01b031633148061053b57506001546001600160a01b031633145b6105605760405162461bcd60e51b8152600401610557906111d8565b60405180910390fd5b6104b261056c83610ef8565b6002610f28565b6000546001600160a01b031633148061059657506001546001600160a01b031633145b6105b25760405162461bcd60e51b8152600401610557906111d8565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b600080546001600160a01b03163314806105f857506001546001600160a01b031633145b6106145760405162461bcd60e51b8152600401610557906111d8565b600061061f83610ef8565b9050600260008281526005602052604090205460ff16600381111561064057fe5b1461064f5760009150506104b5565b6000908152600560205260409020805460ff19166003179055505060068054600019019055600190565b6001600160a01b038216600090815260046020908152604080832084845290915281205460ff161580156106cf57506001600160a01b038316600090815260026020526040902060040154600160a01b900460ff165b156106dc57506000610511565b506001600160a01b0391909116600090815260036020908152604080832093835292905220547ffeedfacecafebeeffeedfacecafebeeffeedfacecafebeeffeedfacecafebeef1890565b60008061073383610ef8565b905060025b60008281526005602052604090205460ff16600381111561075557fe5b10159392505050565b6001600160a01b03166000908152600260208190526040909120015490565b6000546001600160a01b03163314806107a057506001546001600160a01b031633145b6107bc5760405162461bcd60e51b8152600401610557906111d8565b600680546001019055565b6000546001600160a01b03163314806107ea57506001546001600160a01b031633145b6108065760405162461bcd60e51b8152600401610557906111d8565b6001600160a01b038316600081815260036020908152604080832086845282528083207ffeedfacecafebeeffeedfacecafebeeffeedfacecafebeeffeedfacecafebeef86189055928252600481528282208583529052205460ff16610895576001600160a01b03831660009081526004602090815260408083208584529091529020805460ff191660011790555b505050565b6000546001600160a01b03163314806108bd57506001546001600160a01b031633145b6108d95760405162461bcd60e51b8152600401610557906111d8565b6001600160a01b031660009081526002602081905260409091207f56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421918101919091557fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470600390910155565b6001546001600160a01b031681565b6000806109608484610f8e565b905060025b60008281526005602052604090205460ff16600381111561098257fe5b1015949350505050565b6001600160a01b039081166000908152600260205260409020600401541690565b6000806109ba8484610f8e565b90506003610965565b6000546001600160a01b031681565b6000546001600160a01b03163314806109f557506001546001600160a01b031633145b610a115760405162461bcd60e51b8152600401610557906111d8565b6001600160a01b039182166000908152600260208181526040928390208451815590840151600182015591830151908201556060820151600382015560808201516004909101805460a0909301516001600160a01b0319909316919093161760ff60a01b1916600160a01b91151591909102179055565b60075490565b600080546001600160a01b0316331480610ab257506001546001600160a01b031633145b610ace5760405162461bcd60e51b8152600401610557906111d8565b61050e610adb8484610f8e565b6001610f28565b600080546001600160a01b0316331480610b0657506001546001600160a01b031633145b610b225760405162461bcd60e51b8152600401610557906111d8565b61050e61056c8484610f8e565b6000546001600160a01b0316331480610b5257506001546001600160a01b031633145b610b6e5760405162461bcd60e51b8152600401610557906111d8565b600780546001019055565b600080546001600160a01b0316331480610b9d57506001546001600160a01b031633145b610bb95760405162461bcd60e51b8152600401610557906111d8565b6000610bc58484610f8e565b9050600260008281526005602052604090205460ff166003811115610be657fe5b14610bf5576000915050610511565b6000908152600560205260409020805460ff1916600317905550506007805460001901905550600190565b6001600160a01b0316600090815260026020526040902060030154151590565b6000546001600160a01b0316331480610c6357506001546001600160a01b031633145b610c7f5760405162461bcd60e51b8152600401610557906111d8565b6001600160a01b0392831660009081526002602052604090206004810180546001600160a01b031916939094169290921790925560030155565b6001600160a01b031660009081526002602052604090205490565b600080546001600160a01b03838116911614806104b25750506001546001600160a01b0390811691161490565b600080610d0d83610ef8565b90506003610738565b60065490565b6000546001600160a01b0316331480610d3f57506001546001600160a01b031633145b610d5b5760405162461bcd60e51b8152600401610557906111d8565b6001600160a01b03909116600090815260026020526040902055565b600080546001600160a01b0316331480610d9b57506001546001600160a01b031633145b610db75760405162461bcd60e51b8152600401610557906111d8565b6104b2610adb83610ef8565b610dcb610fc1565b506001600160a01b03908116600090815260026020818152604092839020835160c08101855281548152600182015492810192909252918201549281019290925260038101546060830152600401549182166080820152600160a01b90910460ff16151560a082015290565b6000546001600160a01b0316331480610e5a57506001546001600160a01b031633145b610e765760405162461bcd60e51b8152600401610557906111d8565b6001600160a01b03166000908152600260208190526040909120600181557f56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421918101919091557fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4706003820155600401805460ff60a01b1916600160a01b179055565b600081604051602001610f0b9190611171565b604051602081830303815290604052805190602001209050919050565b600080826003811115610f3757fe5b60008581526005602052604090205460ff166003811115610f5457fe5b101590508061050e576000848152600560205260409020805484919060ff19166001836003811115610f8257fe5b02179055509392505050565b60008282604051602001610fa392919061118e565b60405160208183030381529060405280519060200120905092915050565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081019190915290565b80356001600160a01b03811681146104b557600080fd5b803580151581146104b557600080fd5b60006020828403121561102e578081fd5b61050e82610ff6565b60008060006060848603121561104b578182fd5b61105484610ff6565b925061106260208501610ff6565b9150604084013590509250925092565b60008060408385031215611084578182fd5b61108d83610ff6565b946020939093013593505050565b6000806000606084860312156110af578283fd5b6110b884610ff6565b95602085013595506040909401359392505050565b60008082840360e08112156110e0578283fd5b6110e984610ff6565b925060c0601f19820112156110fc578182fd5b5060405160c0810181811067ffffffffffffffff8211171561111a57fe5b80604052506020840135815260408401356020820152606084013560408201526080840135606082015261115060a08501610ff6565b608082015261116160c0850161100d565b60a0820152809150509250929050565b60609190911b6bffffffffffffffffffffffff1916815260140190565b60609290921b6bffffffffffffffffffffffff19168252601482015260340190565b6001600160a01b0391909116815260200190565b901515815260200190565b90815260200190565b60208082526036908201527f46756e6374696f6e2063616e206f6e6c792062652063616c6c65642062792061604082015275757468656e746963617465642061646472657373657360501b606082015260800190565b815181526020808301519082015260408083015190820152606080830151908201526080808301516001600160a01b03169082015260a09182015115159181019190915260c0019056fea164736f6c6343000706000aa164736f6c6343000706000a", - "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061002b5760003560e01c80639ed9331814610030575b600080fd5b6100566004803603602081101561004657600080fd5b50356001600160a01b0316610072565b604080516001600160a01b039092168252519081900360200190f35b600081604051610081906100b5565b6001600160a01b03909116815260405190819003602001906000f0801580156100ae573d6000803e3d6000fd5b5092915050565b611316806100c38339019056fe608060405234801561001057600080fd5b5060405161131638038061131683398101604081905261002f91610054565b600080546001600160a01b0319166001600160a01b0392909216919091179055610082565b600060208284031215610065578081fd5b81516001600160a01b038116811461007b578182fd5b9392505050565b611285806100916000396000f3fe608060405234801561001057600080fd5b50600436106101f05760003560e01c80638f3b96471161010f578063d126199f116100a2578063e90abb8611610071578063e90abb86146103f9578063fb37b31c1461040c578063fbcbc0f11461041f578063fcf149a21461043f576101f0565b8063d126199f146103b8578063d15d4150146103cb578063d54414c8146103de578063d7bd4a2a146103f1576101f0565b8063c3fd9b25116100de578063c3fd9b2514610377578063c7650bf21461037f578063c8e40fbf14610392578063d0a215f2146103a5576101f0565b80638f3b96471461033657806399056ba914610349578063af37b86414610351578063af3dc01114610364576101f0565b806333f94305116101875780636f3c75af116101565780636f3c75af146102f55780637c8ee703146103085780637e86faa81461031b5780638da5cb5b1461032e576101f0565b806333f94305146102b25780635c17d629146102ba5780636b18e4e8146102cd5780636c87ad20146102e0576101f0565b8063167020d2116101c3578063167020d2146102595780631aaf392f1461026c5780631b208a5a1461028c57806326dc5b121461029f576101f0565b806307a12945146101f55780630ad226791461021e57806311b1f790146102315780631381ba4d14610244575b600080fd5b61020861020336600461101d565b610452565b60405161021591906111c4565b60405180910390f35b61020861022c366004611072565b6104ba565b61020861023f36600461101d565b610517565b61025761025236600461101d565b610573565b005b61020861026736600461101d565b6105d4565b61027f61027a366004611072565b610679565b60405161021591906111cf565b61020861029a36600461101d565b610727565b61027f6102ad36600461101d565b61075e565b61025761077d565b6102576102c836600461109b565b6107c7565b6102576102db36600461101d565b61089a565b6102e8610944565b60405161021591906111b0565b610208610303366004611072565b610953565b6102e861031636600461101d565b61098c565b610208610329366004611072565b6109ad565b6102e86109c3565b6102576103443660046110cd565b6109d2565b61027f610a88565b61020861035f366004611072565b610a8e565b610208610372366004611072565b610ae2565b610257610b2f565b61020861038d366004611072565b610b79565b6102086103a036600461101d565b610c20565b6102576103b3366004611037565b610c40565b61027f6103c636600461101d565b610cb9565b6102086103d936600461101d565b610cd4565b6102086103ec36600461101d565b610d01565b61027f610d16565b610257610407366004611072565b610d1c565b61020861041a36600461101d565b610d77565b61043261042d36600461101d565b610dc3565b604051610215919061122e565b61025761044d36600461101d565b610e37565b6001600160a01b0381166000908152600260205260408120600301547fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4701480156104b257506001600160a01b038216600090815260026020526040902054155b90505b919050565b6001600160a01b038216600090815260046020908152604080832084845290915281205460ff168061050e57506001600160a01b038316600090815260026020526040902060040154600160a01b900460ff165b90505b92915050565b600080546001600160a01b031633148061053b57506001546001600160a01b031633145b6105605760405162461bcd60e51b8152600401610557906111d8565b60405180910390fd5b6104b261056c83610ef8565b6002610f28565b6000546001600160a01b031633148061059657506001546001600160a01b031633145b6105b25760405162461bcd60e51b8152600401610557906111d8565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b600080546001600160a01b03163314806105f857506001546001600160a01b031633145b6106145760405162461bcd60e51b8152600401610557906111d8565b600061061f83610ef8565b9050600260008281526005602052604090205460ff16600381111561064057fe5b1461064f5760009150506104b5565b6000908152600560205260409020805460ff19166003179055505060068054600019019055600190565b6001600160a01b038216600090815260046020908152604080832084845290915281205460ff161580156106cf57506001600160a01b038316600090815260026020526040902060040154600160a01b900460ff165b156106dc57506000610511565b506001600160a01b0391909116600090815260036020908152604080832093835292905220547ffeedfacecafebeeffeedfacecafebeeffeedfacecafebeeffeedfacecafebeef1890565b60008061073383610ef8565b905060025b60008281526005602052604090205460ff16600381111561075557fe5b10159392505050565b6001600160a01b03166000908152600260208190526040909120015490565b6000546001600160a01b03163314806107a057506001546001600160a01b031633145b6107bc5760405162461bcd60e51b8152600401610557906111d8565b600680546001019055565b6000546001600160a01b03163314806107ea57506001546001600160a01b031633145b6108065760405162461bcd60e51b8152600401610557906111d8565b6001600160a01b038316600081815260036020908152604080832086845282528083207ffeedfacecafebeeffeedfacecafebeeffeedfacecafebeeffeedfacecafebeef86189055928252600481528282208583529052205460ff16610895576001600160a01b03831660009081526004602090815260408083208584529091529020805460ff191660011790555b505050565b6000546001600160a01b03163314806108bd57506001546001600160a01b031633145b6108d95760405162461bcd60e51b8152600401610557906111d8565b6001600160a01b031660009081526002602081905260409091207f56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421918101919091557fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470600390910155565b6001546001600160a01b031681565b6000806109608484610f8e565b905060025b60008281526005602052604090205460ff16600381111561098257fe5b1015949350505050565b6001600160a01b039081166000908152600260205260409020600401541690565b6000806109ba8484610f8e565b90506003610965565b6000546001600160a01b031681565b6000546001600160a01b03163314806109f557506001546001600160a01b031633145b610a115760405162461bcd60e51b8152600401610557906111d8565b6001600160a01b039182166000908152600260208181526040928390208451815590840151600182015591830151908201556060820151600382015560808201516004909101805460a0909301516001600160a01b0319909316919093161760ff60a01b1916600160a01b91151591909102179055565b60075490565b600080546001600160a01b0316331480610ab257506001546001600160a01b031633145b610ace5760405162461bcd60e51b8152600401610557906111d8565b61050e610adb8484610f8e565b6001610f28565b600080546001600160a01b0316331480610b0657506001546001600160a01b031633145b610b225760405162461bcd60e51b8152600401610557906111d8565b61050e61056c8484610f8e565b6000546001600160a01b0316331480610b5257506001546001600160a01b031633145b610b6e5760405162461bcd60e51b8152600401610557906111d8565b600780546001019055565b600080546001600160a01b0316331480610b9d57506001546001600160a01b031633145b610bb95760405162461bcd60e51b8152600401610557906111d8565b6000610bc58484610f8e565b9050600260008281526005602052604090205460ff166003811115610be657fe5b14610bf5576000915050610511565b6000908152600560205260409020805460ff1916600317905550506007805460001901905550600190565b6001600160a01b0316600090815260026020526040902060030154151590565b6000546001600160a01b0316331480610c6357506001546001600160a01b031633145b610c7f5760405162461bcd60e51b8152600401610557906111d8565b6001600160a01b0392831660009081526002602052604090206004810180546001600160a01b031916939094169290921790925560030155565b6001600160a01b031660009081526002602052604090205490565b600080546001600160a01b03838116911614806104b25750506001546001600160a01b0390811691161490565b600080610d0d83610ef8565b90506003610738565b60065490565b6000546001600160a01b0316331480610d3f57506001546001600160a01b031633145b610d5b5760405162461bcd60e51b8152600401610557906111d8565b6001600160a01b03909116600090815260026020526040902055565b600080546001600160a01b0316331480610d9b57506001546001600160a01b031633145b610db75760405162461bcd60e51b8152600401610557906111d8565b6104b2610adb83610ef8565b610dcb610fc1565b506001600160a01b03908116600090815260026020818152604092839020835160c08101855281548152600182015492810192909252918201549281019290925260038101546060830152600401549182166080820152600160a01b90910460ff16151560a082015290565b6000546001600160a01b0316331480610e5a57506001546001600160a01b031633145b610e765760405162461bcd60e51b8152600401610557906111d8565b6001600160a01b03166000908152600260208190526040909120600181557f56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421918101919091557fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4706003820155600401805460ff60a01b1916600160a01b179055565b600081604051602001610f0b9190611171565b604051602081830303815290604052805190602001209050919050565b600080826003811115610f3757fe5b60008581526005602052604090205460ff166003811115610f5457fe5b101590508061050e576000848152600560205260409020805484919060ff19166001836003811115610f8257fe5b02179055509392505050565b60008282604051602001610fa392919061118e565b60405160208183030381529060405280519060200120905092915050565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081019190915290565b80356001600160a01b03811681146104b557600080fd5b803580151581146104b557600080fd5b60006020828403121561102e578081fd5b61050e82610ff6565b60008060006060848603121561104b578182fd5b61105484610ff6565b925061106260208501610ff6565b9150604084013590509250925092565b60008060408385031215611084578182fd5b61108d83610ff6565b946020939093013593505050565b6000806000606084860312156110af578283fd5b6110b884610ff6565b95602085013595506040909401359392505050565b60008082840360e08112156110e0578283fd5b6110e984610ff6565b925060c0601f19820112156110fc578182fd5b5060405160c0810181811067ffffffffffffffff8211171561111a57fe5b80604052506020840135815260408401356020820152606084013560408201526080840135606082015261115060a08501610ff6565b608082015261116160c0850161100d565b60a0820152809150509250929050565b60609190911b6bffffffffffffffffffffffff1916815260140190565b60609290921b6bffffffffffffffffffffffff19168252601482015260340190565b6001600160a01b0391909116815260200190565b901515815260200190565b90815260200190565b60208082526036908201527f46756e6374696f6e2063616e206f6e6c792062652063616c6c65642062792061604082015275757468656e746963617465642061646472657373657360501b606082015260800190565b815181526020808301519082015260408083015190820152606080830151908201526080808301516001600160a01b03169082015260a09182015115159181019190915260c0019056fea164736f6c6343000706000aa164736f6c6343000706000a", + "solcInputHash": "5ee8e508e2c54cb5ac6783b4855b1558", + "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"}],\"name\":\"create\",\"outputs\":[{\"internalType\":\"contract iOVM_StateManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The State Manager Factory is called by a State Transitioner's init code, to create a new State Manager for use in the Fraud Verification process. Compiler used: solc Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"create(address)\":{\"params\":{\"_owner\":\"Owner of the created contract.\"},\"returns\":{\"_0\":\"New OVM_StateManager instance.\"}}},\"title\":\"OVM_StateManagerFactory\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"create(address)\":{\"notice\":\"Creates a new OVM_StateManager\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/OVM/execution/OVM_StateManagerFactory.sol\":\"OVM_StateManagerFactory\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/optimistic-ethereum/OVM/execution/OVM_StateManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_StateManager } from \\\"../../iOVM/execution/iOVM_StateManager.sol\\\";\\n\\n/**\\n * @title OVM_StateManager\\n * @dev The State Manager contract holds all storage values for contracts in the OVM. It can only be written to by the\\n * the Execution Manager and State Transitioner. It runs on L1 during the setup and execution of a fraud proof.\\n * The same logic runs on L2, but has been implemented as a precompile in the L2 go-ethereum client\\n * (see https://github.com/ethereum-optimism/go-ethereum/blob/master/core/vm/ovm_state_manager.go).\\n *\\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract OVM_StateManager is iOVM_StateManager {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n bytes32 constant internal EMPTY_ACCOUNT_STORAGE_ROOT = 0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421;\\n bytes32 constant internal EMPTY_ACCOUNT_CODE_HASH = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;\\n bytes32 constant internal STORAGE_XOR_VALUE = 0xFEEDFACECAFEBEEFFEEDFACECAFEBEEFFEEDFACECAFEBEEFFEEDFACECAFEBEEF;\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n address override public owner;\\n address override public ovmExecutionManager;\\n mapping (address => Lib_OVMCodec.Account) internal accounts;\\n mapping (address => mapping (bytes32 => bytes32)) internal contractStorage;\\n mapping (address => mapping (bytes32 => bool)) internal verifiedContractStorage;\\n mapping (bytes32 => ItemState) internal itemStates;\\n uint256 internal totalUncommittedAccounts;\\n uint256 internal totalUncommittedContractStorage;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _owner Address of the owner of this contract.\\n */\\n constructor(\\n address _owner\\n )\\n {\\n owner = _owner;\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n /**\\n * Simple authentication, this contract should only be accessible to the owner (which is expected to be the State Transitioner during `PRE_EXECUTION`\\n * or the OVM_ExecutionManager during transaction execution.\\n */\\n modifier authenticated() {\\n // owner is the State Transitioner\\n require(\\n msg.sender == owner || msg.sender == ovmExecutionManager,\\n \\\"Function can only be called by authenticated addresses\\\"\\n );\\n _;\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Checks whether a given address is allowed to modify this contract.\\n * @param _address Address to check.\\n * @return Whether or not the address can modify this contract.\\n */\\n function isAuthenticated(\\n address _address\\n )\\n override\\n public\\n view\\n returns (\\n bool\\n )\\n {\\n return (_address == owner || _address == ovmExecutionManager);\\n }\\n\\n /**\\n * Sets the address of the OVM_ExecutionManager.\\n * @param _ovmExecutionManager Address of the OVM_ExecutionManager.\\n */\\n function setExecutionManager(\\n address _ovmExecutionManager\\n )\\n override\\n public\\n authenticated\\n {\\n ovmExecutionManager = _ovmExecutionManager;\\n }\\n\\n /**\\n * Inserts an account into the state.\\n * @param _address Address of the account to insert.\\n * @param _account Account to insert for the given address.\\n */\\n function putAccount(\\n address _address,\\n Lib_OVMCodec.Account memory _account\\n )\\n override\\n public\\n authenticated\\n {\\n accounts[_address] = _account;\\n }\\n\\n /**\\n * Marks an account as empty.\\n * @param _address Address of the account to mark.\\n */\\n function putEmptyAccount(\\n address _address\\n )\\n override\\n public\\n authenticated\\n {\\n Lib_OVMCodec.Account storage account = accounts[_address];\\n account.storageRoot = EMPTY_ACCOUNT_STORAGE_ROOT;\\n account.codeHash = EMPTY_ACCOUNT_CODE_HASH;\\n }\\n\\n /**\\n * Retrieves an account from the state.\\n * @param _address Address of the account to retrieve.\\n * @return Account for the given address.\\n */\\n function getAccount(\\n address _address\\n )\\n override\\n public\\n view\\n returns (\\n Lib_OVMCodec.Account memory\\n )\\n {\\n return accounts[_address];\\n }\\n\\n /**\\n * Checks whether the state has a given account.\\n * @param _address Address of the account to check.\\n * @return Whether or not the state has the account.\\n */\\n function hasAccount(\\n address _address\\n )\\n override\\n public\\n view\\n returns (\\n bool\\n )\\n {\\n return accounts[_address].codeHash != bytes32(0);\\n }\\n\\n /**\\n * Checks whether the state has a given known empty account.\\n * @param _address Address of the account to check.\\n * @return Whether or not the state has the empty account.\\n */\\n function hasEmptyAccount(\\n address _address\\n )\\n override\\n public\\n view\\n returns (\\n bool\\n )\\n {\\n return (\\n accounts[_address].codeHash == EMPTY_ACCOUNT_CODE_HASH\\n && accounts[_address].nonce == 0\\n );\\n }\\n\\n /**\\n * Sets the nonce of an account.\\n * @param _address Address of the account to modify.\\n * @param _nonce New account nonce.\\n */\\n function setAccountNonce(\\n address _address,\\n uint256 _nonce\\n )\\n override\\n public\\n authenticated\\n {\\n accounts[_address].nonce = _nonce;\\n }\\n\\n /**\\n * Gets the nonce of an account.\\n * @param _address Address of the account to access.\\n * @return Nonce of the account.\\n */\\n function getAccountNonce(\\n address _address\\n )\\n override\\n public\\n view\\n returns (\\n uint256\\n )\\n {\\n return accounts[_address].nonce;\\n }\\n\\n /**\\n * Retrieves the Ethereum address of an account.\\n * @param _address Address of the account to access.\\n * @return Corresponding Ethereum address.\\n */\\n function getAccountEthAddress(\\n address _address\\n )\\n override\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return accounts[_address].ethAddress;\\n }\\n\\n /**\\n * Retrieves the storage root of an account.\\n * @param _address Address of the account to access.\\n * @return Corresponding storage root.\\n */\\n function getAccountStorageRoot(\\n address _address\\n )\\n override\\n public\\n view\\n returns (\\n bytes32\\n )\\n {\\n return accounts[_address].storageRoot;\\n }\\n\\n /**\\n * Initializes a pending account (during CREATE or CREATE2) with the default values.\\n * @param _address Address of the account to initialize.\\n */\\n function initPendingAccount(\\n address _address\\n )\\n override\\n public\\n authenticated\\n {\\n Lib_OVMCodec.Account storage account = accounts[_address];\\n account.nonce = 1;\\n account.storageRoot = EMPTY_ACCOUNT_STORAGE_ROOT;\\n account.codeHash = EMPTY_ACCOUNT_CODE_HASH;\\n account.isFresh = true;\\n }\\n\\n /**\\n * Finalizes the creation of a pending account (during CREATE or CREATE2).\\n * @param _address Address of the account to finalize.\\n * @param _ethAddress Address of the account's associated contract on Ethereum.\\n * @param _codeHash Hash of the account's code.\\n */\\n function commitPendingAccount(\\n address _address,\\n address _ethAddress,\\n bytes32 _codeHash\\n )\\n override\\n public\\n authenticated\\n {\\n Lib_OVMCodec.Account storage account = accounts[_address];\\n account.ethAddress = _ethAddress;\\n account.codeHash = _codeHash;\\n }\\n\\n /**\\n * Checks whether an account has already been retrieved, and marks it as retrieved if not.\\n * @param _address Address of the account to check.\\n * @return Whether or not the account was already loaded.\\n */\\n function testAndSetAccountLoaded(\\n address _address\\n )\\n override\\n public\\n authenticated\\n returns (\\n bool\\n )\\n {\\n return _testAndSetItemState(\\n _getItemHash(_address),\\n ItemState.ITEM_LOADED\\n );\\n }\\n\\n /**\\n * Checks whether an account has already been modified, and marks it as modified if not.\\n * @param _address Address of the account to check.\\n * @return Whether or not the account was already modified.\\n */\\n function testAndSetAccountChanged(\\n address _address\\n )\\n override\\n public\\n authenticated\\n returns (\\n bool\\n )\\n {\\n return _testAndSetItemState(\\n _getItemHash(_address),\\n ItemState.ITEM_CHANGED\\n );\\n }\\n\\n /**\\n * Attempts to mark an account as committed.\\n * @param _address Address of the account to commit.\\n * @return Whether or not the account was committed.\\n */\\n function commitAccount(\\n address _address\\n )\\n override\\n public\\n authenticated\\n returns (\\n bool\\n )\\n {\\n bytes32 item = _getItemHash(_address);\\n if (itemStates[item] != ItemState.ITEM_CHANGED) {\\n return false;\\n }\\n\\n itemStates[item] = ItemState.ITEM_COMMITTED;\\n totalUncommittedAccounts -= 1;\\n\\n return true;\\n }\\n\\n /**\\n * Increments the total number of uncommitted accounts.\\n */\\n function incrementTotalUncommittedAccounts()\\n override\\n public\\n authenticated\\n {\\n totalUncommittedAccounts += 1;\\n }\\n\\n /**\\n * Gets the total number of uncommitted accounts.\\n * @return Total uncommitted accounts.\\n */\\n function getTotalUncommittedAccounts()\\n override\\n public\\n view\\n returns (\\n uint256\\n )\\n {\\n return totalUncommittedAccounts;\\n }\\n\\n /**\\n * Checks whether a given account was changed during execution.\\n * @param _address Address to check.\\n * @return Whether or not the account was changed.\\n */\\n function wasAccountChanged(\\n address _address\\n )\\n override\\n public\\n view\\n returns (\\n bool\\n )\\n {\\n bytes32 item = _getItemHash(_address);\\n return itemStates[item] >= ItemState.ITEM_CHANGED;\\n }\\n\\n /**\\n * Checks whether a given account was committed after execution.\\n * @param _address Address to check.\\n * @return Whether or not the account was committed.\\n */\\n function wasAccountCommitted(\\n address _address\\n )\\n override\\n public\\n view\\n returns (\\n bool\\n )\\n {\\n bytes32 item = _getItemHash(_address);\\n return itemStates[item] >= ItemState.ITEM_COMMITTED;\\n }\\n\\n\\n /************************************\\n * Public Functions: Storage Access *\\n ************************************/\\n\\n /**\\n * Changes a contract storage slot value.\\n * @param _contract Address of the contract to modify.\\n * @param _key 32 byte storage slot key.\\n * @param _value 32 byte storage slot value.\\n */\\n function putContractStorage(\\n address _contract,\\n bytes32 _key,\\n bytes32 _value\\n )\\n override\\n public\\n authenticated\\n {\\n // A hilarious optimization. `SSTORE`ing a value of `bytes32(0)` is common enough that it's\\n // worth populating this with a non-zero value in advance (during the fraud proof\\n // initialization phase) to cut the execution-time cost down to 5000 gas.\\n contractStorage[_contract][_key] = _value ^ STORAGE_XOR_VALUE;\\n\\n // Only used when initially populating the contract storage. OVM_ExecutionManager will\\n // perform a `hasContractStorage` INVALID_STATE_ACCESS check before putting any contract\\n // storage because writing to zero when the actual value is nonzero causes a gas\\n // discrepancy. Could be moved into a new `putVerifiedContractStorage` function, or\\n // something along those lines.\\n if (verifiedContractStorage[_contract][_key] == false) {\\n verifiedContractStorage[_contract][_key] = true;\\n }\\n }\\n\\n /**\\n * Retrieves a contract storage slot value.\\n * @param _contract Address of the contract to access.\\n * @param _key 32 byte storage slot key.\\n * @return 32 byte storage slot value.\\n */\\n function getContractStorage(\\n address _contract,\\n bytes32 _key\\n )\\n override\\n public\\n view\\n returns (\\n bytes32\\n )\\n {\\n // Storage XOR system doesn't work for newly created contracts that haven't set this\\n // storage slot value yet.\\n if (\\n verifiedContractStorage[_contract][_key] == false\\n && accounts[_contract].isFresh\\n ) {\\n return bytes32(0);\\n }\\n\\n // See `putContractStorage` for more information about the XOR here.\\n return contractStorage[_contract][_key] ^ STORAGE_XOR_VALUE;\\n }\\n\\n /**\\n * Checks whether a contract storage slot exists in the state.\\n * @param _contract Address of the contract to access.\\n * @param _key 32 byte storage slot key.\\n * @return Whether or not the key was set in the state.\\n */\\n function hasContractStorage(\\n address _contract,\\n bytes32 _key\\n )\\n override\\n public\\n view\\n returns (\\n bool\\n )\\n {\\n return verifiedContractStorage[_contract][_key] || accounts[_contract].isFresh;\\n }\\n\\n /**\\n * Checks whether a storage slot has already been retrieved, and marks it as retrieved if not.\\n * @param _contract Address of the contract to check.\\n * @param _key 32 byte storage slot key.\\n * @return Whether or not the slot was already loaded.\\n */\\n function testAndSetContractStorageLoaded(\\n address _contract,\\n bytes32 _key\\n )\\n override\\n public\\n authenticated\\n returns (\\n bool\\n )\\n {\\n return _testAndSetItemState(\\n _getItemHash(_contract, _key),\\n ItemState.ITEM_LOADED\\n );\\n }\\n\\n /**\\n * Checks whether a storage slot has already been modified, and marks it as modified if not.\\n * @param _contract Address of the contract to check.\\n * @param _key 32 byte storage slot key.\\n * @return Whether or not the slot was already modified.\\n */\\n function testAndSetContractStorageChanged(\\n address _contract,\\n bytes32 _key\\n )\\n override\\n public\\n authenticated\\n returns (\\n bool\\n )\\n {\\n return _testAndSetItemState(\\n _getItemHash(_contract, _key),\\n ItemState.ITEM_CHANGED\\n );\\n }\\n\\n /**\\n * Attempts to mark a storage slot as committed.\\n * @param _contract Address of the account to commit.\\n * @param _key 32 byte slot key to commit.\\n * @return Whether or not the slot was committed.\\n */\\n function commitContractStorage(\\n address _contract,\\n bytes32 _key\\n )\\n override\\n public\\n authenticated\\n returns (\\n bool\\n )\\n {\\n bytes32 item = _getItemHash(_contract, _key);\\n if (itemStates[item] != ItemState.ITEM_CHANGED) {\\n return false;\\n }\\n\\n itemStates[item] = ItemState.ITEM_COMMITTED;\\n totalUncommittedContractStorage -= 1;\\n\\n return true;\\n }\\n\\n /**\\n * Increments the total number of uncommitted storage slots.\\n */\\n function incrementTotalUncommittedContractStorage()\\n override\\n public\\n authenticated\\n {\\n totalUncommittedContractStorage += 1;\\n }\\n\\n /**\\n * Gets the total number of uncommitted storage slots.\\n * @return Total uncommitted storage slots.\\n */\\n function getTotalUncommittedContractStorage()\\n override\\n public\\n view\\n returns (\\n uint256\\n )\\n {\\n return totalUncommittedContractStorage;\\n }\\n\\n /**\\n * Checks whether a given storage slot was changed during execution.\\n * @param _contract Address to check.\\n * @param _key Key of the storage slot to check.\\n * @return Whether or not the storage slot was changed.\\n */\\n function wasContractStorageChanged(\\n address _contract,\\n bytes32 _key\\n )\\n override\\n public\\n view\\n returns (\\n bool\\n )\\n {\\n bytes32 item = _getItemHash(_contract, _key);\\n return itemStates[item] >= ItemState.ITEM_CHANGED;\\n }\\n\\n /**\\n * Checks whether a given storage slot was committed after execution.\\n * @param _contract Address to check.\\n * @param _key Key of the storage slot to check.\\n * @return Whether or not the storage slot was committed.\\n */\\n function wasContractStorageCommitted(\\n address _contract,\\n bytes32 _key\\n )\\n override\\n public\\n view\\n returns (\\n bool\\n )\\n {\\n bytes32 item = _getItemHash(_contract, _key);\\n return itemStates[item] >= ItemState.ITEM_COMMITTED;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Generates a unique hash for an address.\\n * @param _address Address to generate a hash for.\\n * @return Unique hash for the given address.\\n */\\n function _getItemHash(\\n address _address\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(abi.encodePacked(_address));\\n }\\n\\n /**\\n * Generates a unique hash for an address/key pair.\\n * @param _contract Address to generate a hash for.\\n * @param _key Key to generate a hash for.\\n * @return Unique hash for the given pair.\\n */\\n function _getItemHash(\\n address _contract,\\n bytes32 _key\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(abi.encodePacked(\\n _contract,\\n _key\\n ));\\n }\\n\\n /**\\n * Checks whether an item is in a particular state (ITEM_LOADED or ITEM_CHANGED) and sets the\\n * item to the provided state if not.\\n * @param _item 32 byte item ID to check.\\n * @param _minItemState Minimum state that must be satisfied by the item.\\n * @return Whether or not the item was already in the state.\\n */\\n function _testAndSetItemState(\\n bytes32 _item,\\n ItemState _minItemState\\n )\\n internal\\n returns (\\n bool\\n )\\n {\\n bool wasItemState = itemStates[_item] >= _minItemState;\\n\\n if (wasItemState == false) {\\n itemStates[_item] = _minItemState;\\n }\\n\\n return wasItemState;\\n }\\n}\\n\",\"keccak256\":\"0x0df9654f9f958038435c2b2a2c7793b20fa16afe866a69cbed32a371aaa4c78b\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/execution/OVM_StateManagerFactory.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Interface Imports */\\nimport { iOVM_StateManager } from \\\"../../iOVM/execution/iOVM_StateManager.sol\\\";\\nimport { iOVM_StateManagerFactory } from \\\"../../iOVM/execution/iOVM_StateManagerFactory.sol\\\";\\n\\n/* Contract Imports */\\nimport { OVM_StateManager } from \\\"./OVM_StateManager.sol\\\";\\n\\n/**\\n * @title OVM_StateManagerFactory\\n * @dev The State Manager Factory is called by a State Transitioner's init code, to create a new\\n * State Manager for use in the Fraud Verification process.\\n *\\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract OVM_StateManagerFactory is iOVM_StateManagerFactory {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Creates a new OVM_StateManager\\n * @param _owner Owner of the created contract.\\n * @return New OVM_StateManager instance.\\n */\\n function create(\\n address _owner\\n )\\n override\\n public\\n returns (\\n iOVM_StateManager\\n )\\n {\\n return new OVM_StateManager(_owner);\\n }\\n}\\n\",\"keccak256\":\"0xc557f05b8a82eee7b36a389795fe4acc0803bcf5ae33e15e9cba8226e9ab49fc\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/execution/iOVM_StateManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title iOVM_StateManager\\n */\\ninterface iOVM_StateManager {\\n\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n enum ItemState {\\n ITEM_UNTOUCHED,\\n ITEM_LOADED,\\n ITEM_CHANGED,\\n ITEM_COMMITTED\\n }\\n\\n /***************************\\n * Public Functions: Misc *\\n ***************************/\\n\\n function isAuthenticated(address _address) external view returns (bool);\\n\\n /***************************\\n * Public Functions: Setup *\\n ***************************/\\n\\n function owner() external view returns (address _owner);\\n function ovmExecutionManager() external view returns (address _ovmExecutionManager);\\n function setExecutionManager(address _ovmExecutionManager) external;\\n\\n\\n /************************************\\n * Public Functions: Account Access *\\n ************************************/\\n\\n function putAccount(address _address, Lib_OVMCodec.Account memory _account) external;\\n function putEmptyAccount(address _address) external;\\n function getAccount(address _address) external view returns (Lib_OVMCodec.Account memory _account);\\n function hasAccount(address _address) external view returns (bool _exists);\\n function hasEmptyAccount(address _address) external view returns (bool _exists);\\n function setAccountNonce(address _address, uint256 _nonce) external;\\n function getAccountNonce(address _address) external view returns (uint256 _nonce);\\n function getAccountEthAddress(address _address) external view returns (address _ethAddress);\\n function getAccountStorageRoot(address _address) external view returns (bytes32 _storageRoot);\\n function initPendingAccount(address _address) external;\\n function commitPendingAccount(address _address, address _ethAddress, bytes32 _codeHash) external;\\n function testAndSetAccountLoaded(address _address) external returns (bool _wasAccountAlreadyLoaded);\\n function testAndSetAccountChanged(address _address) external returns (bool _wasAccountAlreadyChanged);\\n function commitAccount(address _address) external returns (bool _wasAccountCommitted);\\n function incrementTotalUncommittedAccounts() external;\\n function getTotalUncommittedAccounts() external view returns (uint256 _total);\\n function wasAccountChanged(address _address) external view returns (bool);\\n function wasAccountCommitted(address _address) external view returns (bool);\\n\\n\\n /************************************\\n * Public Functions: Storage Access *\\n ************************************/\\n\\n function putContractStorage(address _contract, bytes32 _key, bytes32 _value) external;\\n function getContractStorage(address _contract, bytes32 _key) external view returns (bytes32 _value);\\n function hasContractStorage(address _contract, bytes32 _key) external view returns (bool _exists);\\n function testAndSetContractStorageLoaded(address _contract, bytes32 _key) external returns (bool _wasContractStorageAlreadyLoaded);\\n function testAndSetContractStorageChanged(address _contract, bytes32 _key) external returns (bool _wasContractStorageAlreadyChanged);\\n function commitContractStorage(address _contract, bytes32 _key) external returns (bool _wasContractStorageCommitted);\\n function incrementTotalUncommittedContractStorage() external;\\n function getTotalUncommittedContractStorage() external view returns (uint256 _total);\\n function wasContractStorageChanged(address _contract, bytes32 _key) external view returns (bool);\\n function wasContractStorageCommitted(address _contract, bytes32 _key) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x7a11dbd1f61593ba34debe07e39eef59967307f7f372ba9855bee0953585d08d\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/execution/iOVM_StateManagerFactory.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Contract Imports */\\nimport { iOVM_StateManager } from \\\"./iOVM_StateManager.sol\\\";\\n\\n/**\\n * @title iOVM_StateManagerFactory\\n */\\ninterface iOVM_StateManagerFactory {\\n\\n /***************************************\\n * Public Functions: Contract Creation *\\n ***************************************/\\n\\n function create(\\n address _owner\\n )\\n external\\n returns (\\n iOVM_StateManager _ovmStateManager\\n );\\n}\\n\",\"keccak256\":\"0x27a90fc43889d0c7d1db50f37907ef7386d9b415d15a1e91a0a068cba59afd36\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/codec/Lib_OVMCodec.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../utils/Lib_Bytes32Utils.sol\\\";\\n\\n/**\\n * @title Lib_OVMCodec\\n */\\nlibrary Lib_OVMCodec {\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum QueueOrigin {\\n SEQUENCER_QUEUE,\\n L1TOL2_QUEUE\\n }\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Account {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n address ethAddress;\\n bool isFresh;\\n }\\n\\n struct EVMAccount {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n }\\n\\n struct ChainBatchHeader {\\n uint256 batchIndex;\\n bytes32 batchRoot;\\n uint256 batchSize;\\n uint256 prevTotalElements;\\n bytes extraData;\\n }\\n\\n struct ChainInclusionProof {\\n uint256 index;\\n bytes32[] siblings;\\n }\\n\\n struct Transaction {\\n uint256 timestamp;\\n uint256 blockNumber;\\n QueueOrigin l1QueueOrigin;\\n address l1TxOrigin;\\n address entrypoint;\\n uint256 gasLimit;\\n bytes data;\\n }\\n\\n struct TransactionChainElement {\\n bool isSequenced;\\n uint256 queueIndex; // QUEUED TX ONLY\\n uint256 timestamp; // SEQUENCER TX ONLY\\n uint256 blockNumber; // SEQUENCER TX ONLY\\n bytes txData; // SEQUENCER TX ONLY\\n }\\n\\n struct QueueElement {\\n bytes32 transactionHash;\\n uint40 timestamp;\\n uint40 blockNumber;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Encodes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Encoded transaction bytes.\\n */\\n function encodeTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return abi.encodePacked(\\n _transaction.timestamp,\\n _transaction.blockNumber,\\n _transaction.l1QueueOrigin,\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n );\\n }\\n\\n /**\\n * Hashes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Hashed transaction\\n */\\n function hashTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(encodeTransaction(_transaction));\\n }\\n\\n /**\\n * Converts an OVM account to an EVM account.\\n * @param _in OVM account to convert.\\n * @return Converted EVM account.\\n */\\n function toEVMAccount(\\n Account memory _in\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n return EVMAccount({\\n nonce: _in.nonce,\\n balance: _in.balance,\\n storageRoot: _in.storageRoot,\\n codeHash: _in.codeHash\\n });\\n }\\n\\n /**\\n * @notice RLP-encodes an account state struct.\\n * @param _account Account state struct.\\n * @return RLP-encoded account state.\\n */\\n function encodeEVMAccount(\\n EVMAccount memory _account\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes[] memory raw = new bytes[](4);\\n\\n // Unfortunately we can't create this array outright because\\n // Lib_RLPWriter.writeList will reject fixed-size arrays. Assigning\\n // index-by-index circumvents this issue.\\n raw[0] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.nonce)\\n )\\n );\\n raw[1] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.balance)\\n )\\n );\\n raw[2] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.storageRoot));\\n raw[3] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.codeHash));\\n\\n return Lib_RLPWriter.writeList(raw);\\n }\\n\\n /**\\n * @notice Decodes an RLP-encoded account state into a useful struct.\\n * @param _encoded RLP-encoded account state.\\n * @return Account state struct.\\n */\\n function decodeEVMAccount(\\n bytes memory _encoded\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\\n\\n return EVMAccount({\\n nonce: Lib_RLPReader.readUint256(accountState[0]),\\n balance: Lib_RLPReader.readUint256(accountState[1]),\\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\\n });\\n }\\n\\n /**\\n * Calculates a hash for a given batch header.\\n * @param _batchHeader Header to hash.\\n * @return Hash of the header.\\n */\\n function hashBatchHeader(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(\\n abi.encode(\\n _batchHeader.batchRoot,\\n _batchHeader.batchSize,\\n _batchHeader.prevTotalElements,\\n _batchHeader.extraData\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0xd85ba2066057a2677926f484b938c7c2ef33ff3853f3b71cda252f4a54f30e05\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPReader.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_RLPReader\\n * @dev Adapted from \\\"RLPReader\\\" by Hamdi Allam (hamdi.allam97@gmail.com).\\n */\\nlibrary Lib_RLPReader {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 constant internal MAX_LIST_LENGTH = 32;\\n\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum RLPItemType {\\n DATA_ITEM,\\n LIST_ITEM\\n }\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct RLPItem {\\n uint256 length;\\n uint256 ptr;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts bytes to a reference to memory position and length.\\n * @param _in Input bytes to convert.\\n * @return Output memory reference.\\n */\\n function toRLPItem(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem memory\\n )\\n {\\n uint256 ptr;\\n assembly {\\n ptr := add(_in, 32)\\n }\\n\\n return RLPItem({\\n length: _in.length,\\n ptr: ptr\\n });\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n (\\n uint256 listOffset,\\n ,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.LIST_ITEM,\\n \\\"Invalid RLP list value.\\\"\\n );\\n\\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\\n // writing to the length. Since we can't know the number of RLP items without looping over\\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\\n // simply set a reasonable maximum list length and decrease the size before we finish.\\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\\n\\n uint256 itemCount = 0;\\n uint256 offset = listOffset;\\n while (offset < _in.length) {\\n require(\\n itemCount < MAX_LIST_LENGTH,\\n \\\"Provided RLP list exceeds max list length.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n ) = _decodeLength(RLPItem({\\n length: _in.length - offset,\\n ptr: _in.ptr + offset\\n }));\\n\\n out[itemCount] = RLPItem({\\n length: itemLength + itemOffset,\\n ptr: _in.ptr + offset\\n });\\n\\n itemCount += 1;\\n offset += itemOffset + itemLength;\\n }\\n\\n // Decrease the array size to match the actual item count.\\n assembly {\\n mstore(out, itemCount)\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n return readList(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes value.\\\"\\n );\\n\\n return _copy(_in.ptr, itemOffset, itemLength);\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return readBytes(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return string(readBytes(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return readString(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n require(\\n _in.length <= 33,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr + itemOffset;\\n bytes32 out;\\n assembly {\\n out := mload(ptr)\\n\\n // Shift the bytes over to match the item size.\\n if lt(itemLength, 32) {\\n out := div(out, exp(256, sub(32, itemLength)))\\n }\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return readBytes32(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return uint256(readBytes32(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return readUint256(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n require(\\n _in.length == 1,\\n \\\"Invalid RLP boolean value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 out;\\n assembly {\\n out := byte(0, mload(ptr))\\n }\\n\\n require(\\n out == 0 || out == 1,\\n \\\"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\\\"\\n );\\n\\n return out != 0;\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return readBool(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n if (_in.length == 1) {\\n return address(0);\\n }\\n\\n require(\\n _in.length == 21,\\n \\\"Invalid RLP address value.\\\"\\n );\\n\\n return address(readUint256(_in));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return readAddress(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads the raw bytes of an RLP item.\\n * @param _in RLP item to read.\\n * @return Raw RLP bytes.\\n */\\n function readRawBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in);\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Decodes the length of an RLP item.\\n * @param _in RLP item to decode.\\n * @return Offset of the encoded data.\\n * @return Length of the encoded data.\\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\\n */\\n function _decodeLength(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n uint256,\\n uint256,\\n RLPItemType\\n )\\n {\\n require(\\n _in.length > 0,\\n \\\"RLP item cannot be null.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 prefix;\\n assembly {\\n prefix := byte(0, mload(ptr))\\n }\\n\\n if (prefix <= 0x7f) {\\n // Single byte.\\n\\n return (0, 1, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xb7) {\\n // Short string.\\n\\n uint256 strLen = prefix - 0x80;\\n\\n require(\\n _in.length > strLen,\\n \\\"Invalid RLP short string.\\\"\\n );\\n\\n return (1, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xbf) {\\n // Long string.\\n uint256 lenOfStrLen = prefix - 0xb7;\\n\\n require(\\n _in.length > lenOfStrLen,\\n \\\"Invalid RLP long string length.\\\"\\n );\\n\\n uint256 strLen;\\n assembly {\\n // Pick out the string length.\\n strLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfStrLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfStrLen + strLen,\\n \\\"Invalid RLP long string.\\\"\\n );\\n\\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xf7) {\\n // Short list.\\n uint256 listLen = prefix - 0xc0;\\n\\n require(\\n _in.length > listLen,\\n \\\"Invalid RLP short list.\\\"\\n );\\n\\n return (1, listLen, RLPItemType.LIST_ITEM);\\n } else {\\n // Long list.\\n uint256 lenOfListLen = prefix - 0xf7;\\n\\n require(\\n _in.length > lenOfListLen,\\n \\\"Invalid RLP long list length.\\\"\\n );\\n\\n uint256 listLen;\\n assembly {\\n // Pick out the list length.\\n listLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfListLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfListLen + listLen,\\n \\\"Invalid RLP long list.\\\"\\n );\\n\\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\\n }\\n }\\n\\n /**\\n * Copies the bytes from a memory location.\\n * @param _src Pointer to the location to read from.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Copied bytes.\\n */\\n function _copy(\\n uint256 _src,\\n uint256 _offset,\\n uint256 _length\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out = new bytes(_length);\\n if (out.length == 0) {\\n return out;\\n }\\n\\n uint256 src = _src + _offset;\\n uint256 dest;\\n assembly {\\n dest := add(out, 32)\\n }\\n\\n // Copy over as many complete words as we can.\\n for (uint256 i = 0; i < _length / 32; i++) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n\\n src += 32;\\n dest += 32;\\n }\\n\\n // Pick out the remaining bytes.\\n uint256 mask = 256 ** (32 - (_length % 32)) - 1;\\n assembly {\\n mstore(\\n dest,\\n or(\\n and(mload(src), not(mask)),\\n and(mload(dest), mask)\\n )\\n )\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Copies an RLP item into bytes.\\n * @param _in RLP item to copy.\\n * @return Copied bytes.\\n */\\n function _copy(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in.ptr, 0, _in.length);\\n }\\n}\\n\",\"keccak256\":\"0x829174c61216dce35fdb888383b6022e0365eb7fbdc71ad79d98b108091969fe\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPWriter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/**\\n * @title Lib_RLPWriter\\n * @author Bakaoh (with modifications)\\n */\\nlibrary Lib_RLPWriter {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * RLP encodes a byte string.\\n * @param _in The byte string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded;\\n\\n if (_in.length == 1 && uint8(_in[0]) < 128) {\\n encoded = _in;\\n } else {\\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * RLP encodes a list of RLP encoded byte byte strings.\\n * @param _in The list of RLP encoded byte strings.\\n * @return The RLP encoded list of items in bytes.\\n */\\n function writeList(\\n bytes[] memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory list = _flatten(_in);\\n return abi.encodePacked(_writeLength(list.length, 192), list);\\n }\\n\\n /**\\n * RLP encodes a string.\\n * @param _in The string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeString(\\n string memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(bytes(_in));\\n }\\n\\n /**\\n * RLP encodes an address.\\n * @param _in The address to encode.\\n * @return The RLP encoded address in bytes.\\n */\\n function writeAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a bytes32 value.\\n * @param _in The bytes32 to encode.\\n * @return _out The RLP encoded bytes32 in bytes.\\n */\\n function writeBytes32(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a uint.\\n * @param _in The uint256 to encode.\\n * @return The RLP encoded uint256 in bytes.\\n */\\n function writeUint(\\n uint256 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(_toBinary(_in));\\n }\\n\\n /**\\n * RLP encodes a bool.\\n * @param _in The bool to encode.\\n * @return The RLP encoded bool in bytes.\\n */\\n function writeBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded = new bytes(1);\\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\\n return encoded;\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\\n * @param _len The length of the string or the payload.\\n * @param _offset 128 if item is string, 192 if item is list.\\n * @return RLP encoded bytes.\\n */\\n function _writeLength(\\n uint256 _len,\\n uint256 _offset\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded;\\n\\n if (_len < 56) {\\n encoded = new bytes(1);\\n encoded[0] = byte(uint8(_len) + uint8(_offset));\\n } else {\\n uint256 lenLen;\\n uint256 i = 1;\\n while (_len / i != 0) {\\n lenLen++;\\n i *= 256;\\n }\\n\\n encoded = new bytes(lenLen + 1);\\n encoded[0] = byte(uint8(lenLen) + uint8(_offset) + 55);\\n for(i = 1; i <= lenLen; i++) {\\n encoded[i] = byte(uint8((_len / (256**(lenLen-i))) % 256));\\n }\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * Encode integer in big endian binary form with no leading zeroes.\\n * @notice TODO: This should be optimized with assembly to save gas costs.\\n * @param _x The integer to encode.\\n * @return RLP encoded bytes.\\n */\\n function _toBinary(\\n uint256 _x\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory b = abi.encodePacked(_x);\\n\\n uint256 i = 0;\\n for (; i < 32; i++) {\\n if (b[i] != 0) {\\n break;\\n }\\n }\\n\\n bytes memory res = new bytes(32 - i);\\n for (uint256 j = 0; j < res.length; j++) {\\n res[j] = b[i++];\\n }\\n\\n return res;\\n }\\n\\n /**\\n * Copies a piece of memory to another location.\\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\\n * @param _dest Destination location.\\n * @param _src Source location.\\n * @param _len Length of memory to copy.\\n */\\n function _memcpy(\\n uint256 _dest,\\n uint256 _src,\\n uint256 _len\\n )\\n private\\n pure\\n {\\n uint256 dest = _dest;\\n uint256 src = _src;\\n uint256 len = _len;\\n\\n for(; len >= 32; len -= 32) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n dest += 32;\\n src += 32;\\n }\\n\\n uint256 mask = 256 ** (32 - len) - 1;\\n assembly {\\n let srcpart := and(mload(src), not(mask))\\n let destpart := and(mload(dest), mask)\\n mstore(dest, or(destpart, srcpart))\\n }\\n }\\n\\n /**\\n * Flattens a list of byte strings into one byte string.\\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\\n * @param _list List of byte strings to flatten.\\n * @return The flattened byte string.\\n */\\n function _flatten(\\n bytes[] memory _list\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n if (_list.length == 0) {\\n return new bytes(0);\\n }\\n\\n uint256 len;\\n uint256 i = 0;\\n for (; i < _list.length; i++) {\\n len += _list[i].length;\\n }\\n\\n bytes memory flattened = new bytes(len);\\n uint256 flattenedPtr;\\n assembly { flattenedPtr := add(flattened, 0x20) }\\n\\n for(i = 0; i < _list.length; i++) {\\n bytes memory item = _list[i];\\n\\n uint256 listPtr;\\n assembly { listPtr := add(item, 0x20)}\\n\\n _memcpy(flattenedPtr, listPtr, item.length);\\n flattenedPtr += _list[i].length;\\n }\\n\\n return flattened;\\n }\\n}\\n\",\"keccak256\":\"0xb60ee4b03ad372c3deff21d454ab714dd0c18ee3e6f9d45532e209fc59d5a54d\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_Bytes32Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_Byte32Utils\\n */\\nlibrary Lib_Bytes32Utils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \\\"true.\\\"\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as a boolean.\\n */\\n function toBool(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return _in != 0;\\n }\\n\\n /**\\n * Converts a boolean to a bytes32 value.\\n * @param _in Input boolean value.\\n * @return Boolean as a bytes32.\\n */\\n function fromBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in ? 1 : 0));\\n }\\n\\n /**\\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as an address.\\n */\\n function toAddress(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return address(uint160(uint256(_in)));\\n }\\n\\n /**\\n * Converts an address to a bytes32.\\n * @param _in Input address value.\\n * @return Address as a bytes32.\\n */\\n function fromAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in));\\n }\\n\\n /**\\n * Removes the leading zeros from a bytes32 value and returns a new (smaller) bytes value.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 without any leading zeros.\\n */\\n function removeLeadingZeros(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out;\\n\\n assembly {\\n // Figure out how many leading zero bytes to remove.\\n let shift := 0\\n for { let i := 0 } and(lt(i, 32), eq(byte(i, _in), 0)) { i := add(i, 1) } {\\n shift := add(shift, 1)\\n }\\n\\n // Reserve some space for our output and fix the free memory pointer.\\n out := mload(0x40)\\n mstore(0x40, add(out, 0x40))\\n\\n // Shift the value and store it into the output bytes.\\n mstore(add(out, 0x20), shl(mul(shift, 8), _in))\\n\\n // Store the new size (with leading zero bytes removed) in the output byte size.\\n mstore(out, sub(32, shift))\\n }\\n\\n return out;\\n }\\n}\\n\",\"keccak256\":\"0xfa2def593e3fc56a31852c3744aefdaa93cec74e721bfcfeb1e5d166c7c60b64\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_BytesUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_BytesUtils\\n */\\nlibrary Lib_BytesUtils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_start + _length >= _start, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n if (_bytes.length - _start == 0) {\\n return bytes('');\\n }\\n\\n return slice(_bytes, _start, _bytes.length - _start);\\n }\\n\\n function toBytes32PadLeft(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n bytes32 ret;\\n uint256 len = _bytes.length <= 32 ? _bytes.length : 32;\\n assembly {\\n ret := shr(mul(sub(32, len), 8), mload(add(_bytes, 32)))\\n }\\n return ret;\\n }\\n\\n function toBytes32(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n if (_bytes.length < 32) {\\n bytes32 ret;\\n assembly {\\n ret := mload(add(_bytes, 32))\\n }\\n return ret;\\n }\\n\\n return abi.decode(_bytes,(bytes32)); // will truncate if input length > 32 bytes\\n }\\n\\n function toUint256(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return uint256(toBytes32(_bytes));\\n }\\n\\n function toUint24(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n uint24\\n )\\n {\\n require(_start + 3 >= _start, \\\"toUint24_overflow\\\");\\n require(_bytes.length >= _start + 3 , \\\"toUint24_outOfBounds\\\");\\n uint24 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x3), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toUint8(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n uint8\\n )\\n {\\n require(_start + 1 >= _start, \\\"toUint8_overflow\\\");\\n require(_bytes.length >= _start + 1 , \\\"toUint8_outOfBounds\\\");\\n uint8 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x1), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toAddress(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n require(_start + 20 >= _start, \\\"toAddress_overflow\\\");\\n require(_bytes.length >= _start + 20, \\\"toAddress_outOfBounds\\\");\\n address tempAddress;\\n\\n assembly {\\n tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000)\\n }\\n\\n return tempAddress;\\n }\\n\\n function toNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory nibbles = new bytes(_bytes.length * 2);\\n\\n for (uint256 i = 0; i < _bytes.length; i++) {\\n nibbles[i * 2] = _bytes[i] >> 4;\\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\\n }\\n\\n return nibbles;\\n }\\n\\n function fromNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory ret = new bytes(_bytes.length / 2);\\n\\n for (uint256 i = 0; i < ret.length; i++) {\\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\\n }\\n\\n return ret;\\n }\\n\\n function equal(\\n bytes memory _bytes,\\n bytes memory _other\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return keccak256(_bytes) == keccak256(_other);\\n }\\n}\\n\",\"keccak256\":\"0xa5195afe32fb2cf104d156e8f4bd39df1ec79bf6ba232097b9e8e0ee14fbc298\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x608060405234801561001057600080fd5b50611437806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c80639ed9331814610030575b600080fd5b6100566004803603602081101561004657600080fd5b50356001600160a01b0316610072565b604080516001600160a01b039092168252519081900360200190f35b600081604051610081906100b5565b6001600160a01b03909116815260405190819003602001906000f0801580156100ae573d6000803e3d6000fd5b5092915050565b61133f806100c38339019056fe608060405234801561001057600080fd5b5060405161133f38038061133f83398101604081905261002f91610054565b600080546001600160a01b0319166001600160a01b0392909216919091179055610082565b600060208284031215610065578081fd5b81516001600160a01b038116811461007b578182fd5b9392505050565b6112ae806100916000396000f3fe608060405234801561001057600080fd5b50600436106101f05760003560e01c80638f3b96471161010f578063d126199f116100a2578063e90abb8611610071578063e90abb86146103f9578063fb37b31c1461040c578063fbcbc0f11461041f578063fcf149a21461043f576101f0565b8063d126199f146103b8578063d15d4150146103cb578063d54414c8146103de578063d7bd4a2a146103f1576101f0565b8063c3fd9b25116100de578063c3fd9b2514610377578063c7650bf21461037f578063c8e40fbf14610392578063d0a215f2146103a5576101f0565b80638f3b96471461033657806399056ba914610349578063af37b86414610351578063af3dc01114610364576101f0565b806333f94305116101875780636f3c75af116101565780636f3c75af146102f55780637c8ee703146103085780637e86faa81461031b5780638da5cb5b1461032e576101f0565b806333f94305146102b25780635c17d629146102ba5780636b18e4e8146102cd5780636c87ad20146102e0576101f0565b8063167020d2116101c3578063167020d2146102595780631aaf392f1461026c5780631b208a5a1461028c57806326dc5b121461029f576101f0565b806307a12945146101f55780630ad226791461021e57806311b1f790146102315780631381ba4d14610244575b600080fd5b61020861020336600461101d565b610452565b60405161021591906111c4565b60405180910390f35b61020861022c366004611072565b6104ba565b61020861023f36600461101d565b610517565b61025761025236600461101d565b610573565b005b61020861026736600461101d565b6105d4565b61027f61027a366004611072565b610679565b60405161021591906111cf565b61020861029a36600461101d565b610727565b61027f6102ad36600461101d565b61075e565b61025761077d565b6102576102c836600461109b565b6107c7565b6102576102db36600461101d565b61089a565b6102e8610944565b60405161021591906111b0565b610208610303366004611072565b610953565b6102e861031636600461101d565b61098c565b610208610329366004611072565b6109ad565b6102e86109c3565b6102576103443660046110cd565b6109d2565b61027f610a88565b61020861035f366004611072565b610a8e565b610208610372366004611072565b610ae2565b610257610b2f565b61020861038d366004611072565b610b79565b6102086103a036600461101d565b610c20565b6102576103b3366004611037565b610c40565b61027f6103c636600461101d565b610cb9565b6102086103d936600461101d565b610cd4565b6102086103ec36600461101d565b610d01565b61027f610d16565b610257610407366004611072565b610d1c565b61020861041a36600461101d565b610d77565b61043261042d36600461101d565b610dc3565b604051610215919061122e565b61025761044d36600461101d565b610e37565b6001600160a01b0381166000908152600260205260408120600301547fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4701480156104b257506001600160a01b038216600090815260026020526040902054155b90505b919050565b6001600160a01b038216600090815260046020908152604080832084845290915281205460ff168061050e57506001600160a01b038316600090815260026020526040902060040154600160a01b900460ff165b90505b92915050565b600080546001600160a01b031633148061053b57506001546001600160a01b031633145b6105605760405162461bcd60e51b8152600401610557906111d8565b60405180910390fd5b6104b261056c83610ef8565b6002610f28565b6000546001600160a01b031633148061059657506001546001600160a01b031633145b6105b25760405162461bcd60e51b8152600401610557906111d8565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b600080546001600160a01b03163314806105f857506001546001600160a01b031633145b6106145760405162461bcd60e51b8152600401610557906111d8565b600061061f83610ef8565b9050600260008281526005602052604090205460ff16600381111561064057fe5b1461064f5760009150506104b5565b6000908152600560205260409020805460ff19166003179055505060068054600019019055600190565b6001600160a01b038216600090815260046020908152604080832084845290915281205460ff161580156106cf57506001600160a01b038316600090815260026020526040902060040154600160a01b900460ff165b156106dc57506000610511565b506001600160a01b0391909116600090815260036020908152604080832093835292905220547ffeedfacecafebeeffeedfacecafebeeffeedfacecafebeeffeedfacecafebeef1890565b60008061073383610ef8565b905060025b60008281526005602052604090205460ff16600381111561075557fe5b10159392505050565b6001600160a01b03166000908152600260208190526040909120015490565b6000546001600160a01b03163314806107a057506001546001600160a01b031633145b6107bc5760405162461bcd60e51b8152600401610557906111d8565b600680546001019055565b6000546001600160a01b03163314806107ea57506001546001600160a01b031633145b6108065760405162461bcd60e51b8152600401610557906111d8565b6001600160a01b038316600081815260036020908152604080832086845282528083207ffeedfacecafebeeffeedfacecafebeeffeedfacecafebeeffeedfacecafebeef86189055928252600481528282208583529052205460ff16610895576001600160a01b03831660009081526004602090815260408083208584529091529020805460ff191660011790555b505050565b6000546001600160a01b03163314806108bd57506001546001600160a01b031633145b6108d95760405162461bcd60e51b8152600401610557906111d8565b6001600160a01b031660009081526002602081905260409091207f56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421918101919091557fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470600390910155565b6001546001600160a01b031681565b6000806109608484610f8e565b905060025b60008281526005602052604090205460ff16600381111561098257fe5b1015949350505050565b6001600160a01b039081166000908152600260205260409020600401541690565b6000806109ba8484610f8e565b90506003610965565b6000546001600160a01b031681565b6000546001600160a01b03163314806109f557506001546001600160a01b031633145b610a115760405162461bcd60e51b8152600401610557906111d8565b6001600160a01b039182166000908152600260208181526040928390208451815590840151600182015591830151908201556060820151600382015560808201516004909101805460a0909301516001600160a01b0319909316919093161760ff60a01b1916600160a01b91151591909102179055565b60075490565b600080546001600160a01b0316331480610ab257506001546001600160a01b031633145b610ace5760405162461bcd60e51b8152600401610557906111d8565b61050e610adb8484610f8e565b6001610f28565b600080546001600160a01b0316331480610b0657506001546001600160a01b031633145b610b225760405162461bcd60e51b8152600401610557906111d8565b61050e61056c8484610f8e565b6000546001600160a01b0316331480610b5257506001546001600160a01b031633145b610b6e5760405162461bcd60e51b8152600401610557906111d8565b600780546001019055565b600080546001600160a01b0316331480610b9d57506001546001600160a01b031633145b610bb95760405162461bcd60e51b8152600401610557906111d8565b6000610bc58484610f8e565b9050600260008281526005602052604090205460ff166003811115610be657fe5b14610bf5576000915050610511565b6000908152600560205260409020805460ff1916600317905550506007805460001901905550600190565b6001600160a01b0316600090815260026020526040902060030154151590565b6000546001600160a01b0316331480610c6357506001546001600160a01b031633145b610c7f5760405162461bcd60e51b8152600401610557906111d8565b6001600160a01b0392831660009081526002602052604090206004810180546001600160a01b031916939094169290921790925560030155565b6001600160a01b031660009081526002602052604090205490565b600080546001600160a01b03838116911614806104b25750506001546001600160a01b0390811691161490565b600080610d0d83610ef8565b90506003610738565b60065490565b6000546001600160a01b0316331480610d3f57506001546001600160a01b031633145b610d5b5760405162461bcd60e51b8152600401610557906111d8565b6001600160a01b03909116600090815260026020526040902055565b600080546001600160a01b0316331480610d9b57506001546001600160a01b031633145b610db75760405162461bcd60e51b8152600401610557906111d8565b6104b2610adb83610ef8565b610dcb610fc1565b506001600160a01b03908116600090815260026020818152604092839020835160c08101855281548152600182015492810192909252918201549281019290925260038101546060830152600401549182166080820152600160a01b90910460ff16151560a082015290565b6000546001600160a01b0316331480610e5a57506001546001600160a01b031633145b610e765760405162461bcd60e51b8152600401610557906111d8565b6001600160a01b03166000908152600260208190526040909120600181557f56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421918101919091557fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4706003820155600401805460ff60a01b1916600160a01b179055565b600081604051602001610f0b9190611171565b604051602081830303815290604052805190602001209050919050565b600080826003811115610f3757fe5b60008581526005602052604090205460ff166003811115610f5457fe5b101590508061050e576000848152600560205260409020805484919060ff19166001836003811115610f8257fe5b02179055509392505050565b60008282604051602001610fa392919061118e565b60405160208183030381529060405280519060200120905092915050565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081019190915290565b80356001600160a01b03811681146104b557600080fd5b803580151581146104b557600080fd5b60006020828403121561102e578081fd5b61050e82610ff6565b60008060006060848603121561104b578182fd5b61105484610ff6565b925061106260208501610ff6565b9150604084013590509250925092565b60008060408385031215611084578182fd5b61108d83610ff6565b946020939093013593505050565b6000806000606084860312156110af578283fd5b6110b884610ff6565b95602085013595506040909401359392505050565b60008082840360e08112156110e0578283fd5b6110e984610ff6565b925060c0601f19820112156110fc578182fd5b5060405160c0810181811067ffffffffffffffff8211171561111a57fe5b80604052506020840135815260408401356020820152606084013560408201526080840135606082015261115060a08501610ff6565b608082015261116160c0850161100d565b60a0820152809150509250929050565b60609190911b6bffffffffffffffffffffffff1916815260140190565b60609290921b6bffffffffffffffffffffffff19168252601482015260340190565b6001600160a01b0391909116815260200190565b901515815260200190565b90815260200190565b60208082526036908201527f46756e6374696f6e2063616e206f6e6c792062652063616c6c65642062792061604082015275757468656e746963617465642061646472657373657360501b606082015260800190565b815181526020808301519082015260408083015190820152606080830151908201526080808301516001600160a01b03169082015260a09182015115159181019190915260c0019056fea26469706673582212205bac84845119d44a384d804ab40cf5b8661877b394d879fd05cdd049485222d964736f6c63430007060033a264697066735822122049d6bdb64f1e5e1bffb7aba87ce3a0db62412188b801b3e899b8b558b75755a364736f6c63430007060033", + "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061002b5760003560e01c80639ed9331814610030575b600080fd5b6100566004803603602081101561004657600080fd5b50356001600160a01b0316610072565b604080516001600160a01b039092168252519081900360200190f35b600081604051610081906100b5565b6001600160a01b03909116815260405190819003602001906000f0801580156100ae573d6000803e3d6000fd5b5092915050565b61133f806100c38339019056fe608060405234801561001057600080fd5b5060405161133f38038061133f83398101604081905261002f91610054565b600080546001600160a01b0319166001600160a01b0392909216919091179055610082565b600060208284031215610065578081fd5b81516001600160a01b038116811461007b578182fd5b9392505050565b6112ae806100916000396000f3fe608060405234801561001057600080fd5b50600436106101f05760003560e01c80638f3b96471161010f578063d126199f116100a2578063e90abb8611610071578063e90abb86146103f9578063fb37b31c1461040c578063fbcbc0f11461041f578063fcf149a21461043f576101f0565b8063d126199f146103b8578063d15d4150146103cb578063d54414c8146103de578063d7bd4a2a146103f1576101f0565b8063c3fd9b25116100de578063c3fd9b2514610377578063c7650bf21461037f578063c8e40fbf14610392578063d0a215f2146103a5576101f0565b80638f3b96471461033657806399056ba914610349578063af37b86414610351578063af3dc01114610364576101f0565b806333f94305116101875780636f3c75af116101565780636f3c75af146102f55780637c8ee703146103085780637e86faa81461031b5780638da5cb5b1461032e576101f0565b806333f94305146102b25780635c17d629146102ba5780636b18e4e8146102cd5780636c87ad20146102e0576101f0565b8063167020d2116101c3578063167020d2146102595780631aaf392f1461026c5780631b208a5a1461028c57806326dc5b121461029f576101f0565b806307a12945146101f55780630ad226791461021e57806311b1f790146102315780631381ba4d14610244575b600080fd5b61020861020336600461101d565b610452565b60405161021591906111c4565b60405180910390f35b61020861022c366004611072565b6104ba565b61020861023f36600461101d565b610517565b61025761025236600461101d565b610573565b005b61020861026736600461101d565b6105d4565b61027f61027a366004611072565b610679565b60405161021591906111cf565b61020861029a36600461101d565b610727565b61027f6102ad36600461101d565b61075e565b61025761077d565b6102576102c836600461109b565b6107c7565b6102576102db36600461101d565b61089a565b6102e8610944565b60405161021591906111b0565b610208610303366004611072565b610953565b6102e861031636600461101d565b61098c565b610208610329366004611072565b6109ad565b6102e86109c3565b6102576103443660046110cd565b6109d2565b61027f610a88565b61020861035f366004611072565b610a8e565b610208610372366004611072565b610ae2565b610257610b2f565b61020861038d366004611072565b610b79565b6102086103a036600461101d565b610c20565b6102576103b3366004611037565b610c40565b61027f6103c636600461101d565b610cb9565b6102086103d936600461101d565b610cd4565b6102086103ec36600461101d565b610d01565b61027f610d16565b610257610407366004611072565b610d1c565b61020861041a36600461101d565b610d77565b61043261042d36600461101d565b610dc3565b604051610215919061122e565b61025761044d36600461101d565b610e37565b6001600160a01b0381166000908152600260205260408120600301547fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4701480156104b257506001600160a01b038216600090815260026020526040902054155b90505b919050565b6001600160a01b038216600090815260046020908152604080832084845290915281205460ff168061050e57506001600160a01b038316600090815260026020526040902060040154600160a01b900460ff165b90505b92915050565b600080546001600160a01b031633148061053b57506001546001600160a01b031633145b6105605760405162461bcd60e51b8152600401610557906111d8565b60405180910390fd5b6104b261056c83610ef8565b6002610f28565b6000546001600160a01b031633148061059657506001546001600160a01b031633145b6105b25760405162461bcd60e51b8152600401610557906111d8565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b600080546001600160a01b03163314806105f857506001546001600160a01b031633145b6106145760405162461bcd60e51b8152600401610557906111d8565b600061061f83610ef8565b9050600260008281526005602052604090205460ff16600381111561064057fe5b1461064f5760009150506104b5565b6000908152600560205260409020805460ff19166003179055505060068054600019019055600190565b6001600160a01b038216600090815260046020908152604080832084845290915281205460ff161580156106cf57506001600160a01b038316600090815260026020526040902060040154600160a01b900460ff165b156106dc57506000610511565b506001600160a01b0391909116600090815260036020908152604080832093835292905220547ffeedfacecafebeeffeedfacecafebeeffeedfacecafebeeffeedfacecafebeef1890565b60008061073383610ef8565b905060025b60008281526005602052604090205460ff16600381111561075557fe5b10159392505050565b6001600160a01b03166000908152600260208190526040909120015490565b6000546001600160a01b03163314806107a057506001546001600160a01b031633145b6107bc5760405162461bcd60e51b8152600401610557906111d8565b600680546001019055565b6000546001600160a01b03163314806107ea57506001546001600160a01b031633145b6108065760405162461bcd60e51b8152600401610557906111d8565b6001600160a01b038316600081815260036020908152604080832086845282528083207ffeedfacecafebeeffeedfacecafebeeffeedfacecafebeeffeedfacecafebeef86189055928252600481528282208583529052205460ff16610895576001600160a01b03831660009081526004602090815260408083208584529091529020805460ff191660011790555b505050565b6000546001600160a01b03163314806108bd57506001546001600160a01b031633145b6108d95760405162461bcd60e51b8152600401610557906111d8565b6001600160a01b031660009081526002602081905260409091207f56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421918101919091557fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470600390910155565b6001546001600160a01b031681565b6000806109608484610f8e565b905060025b60008281526005602052604090205460ff16600381111561098257fe5b1015949350505050565b6001600160a01b039081166000908152600260205260409020600401541690565b6000806109ba8484610f8e565b90506003610965565b6000546001600160a01b031681565b6000546001600160a01b03163314806109f557506001546001600160a01b031633145b610a115760405162461bcd60e51b8152600401610557906111d8565b6001600160a01b039182166000908152600260208181526040928390208451815590840151600182015591830151908201556060820151600382015560808201516004909101805460a0909301516001600160a01b0319909316919093161760ff60a01b1916600160a01b91151591909102179055565b60075490565b600080546001600160a01b0316331480610ab257506001546001600160a01b031633145b610ace5760405162461bcd60e51b8152600401610557906111d8565b61050e610adb8484610f8e565b6001610f28565b600080546001600160a01b0316331480610b0657506001546001600160a01b031633145b610b225760405162461bcd60e51b8152600401610557906111d8565b61050e61056c8484610f8e565b6000546001600160a01b0316331480610b5257506001546001600160a01b031633145b610b6e5760405162461bcd60e51b8152600401610557906111d8565b600780546001019055565b600080546001600160a01b0316331480610b9d57506001546001600160a01b031633145b610bb95760405162461bcd60e51b8152600401610557906111d8565b6000610bc58484610f8e565b9050600260008281526005602052604090205460ff166003811115610be657fe5b14610bf5576000915050610511565b6000908152600560205260409020805460ff1916600317905550506007805460001901905550600190565b6001600160a01b0316600090815260026020526040902060030154151590565b6000546001600160a01b0316331480610c6357506001546001600160a01b031633145b610c7f5760405162461bcd60e51b8152600401610557906111d8565b6001600160a01b0392831660009081526002602052604090206004810180546001600160a01b031916939094169290921790925560030155565b6001600160a01b031660009081526002602052604090205490565b600080546001600160a01b03838116911614806104b25750506001546001600160a01b0390811691161490565b600080610d0d83610ef8565b90506003610738565b60065490565b6000546001600160a01b0316331480610d3f57506001546001600160a01b031633145b610d5b5760405162461bcd60e51b8152600401610557906111d8565b6001600160a01b03909116600090815260026020526040902055565b600080546001600160a01b0316331480610d9b57506001546001600160a01b031633145b610db75760405162461bcd60e51b8152600401610557906111d8565b6104b2610adb83610ef8565b610dcb610fc1565b506001600160a01b03908116600090815260026020818152604092839020835160c08101855281548152600182015492810192909252918201549281019290925260038101546060830152600401549182166080820152600160a01b90910460ff16151560a082015290565b6000546001600160a01b0316331480610e5a57506001546001600160a01b031633145b610e765760405162461bcd60e51b8152600401610557906111d8565b6001600160a01b03166000908152600260208190526040909120600181557f56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421918101919091557fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4706003820155600401805460ff60a01b1916600160a01b179055565b600081604051602001610f0b9190611171565b604051602081830303815290604052805190602001209050919050565b600080826003811115610f3757fe5b60008581526005602052604090205460ff166003811115610f5457fe5b101590508061050e576000848152600560205260409020805484919060ff19166001836003811115610f8257fe5b02179055509392505050565b60008282604051602001610fa392919061118e565b60405160208183030381529060405280519060200120905092915050565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081019190915290565b80356001600160a01b03811681146104b557600080fd5b803580151581146104b557600080fd5b60006020828403121561102e578081fd5b61050e82610ff6565b60008060006060848603121561104b578182fd5b61105484610ff6565b925061106260208501610ff6565b9150604084013590509250925092565b60008060408385031215611084578182fd5b61108d83610ff6565b946020939093013593505050565b6000806000606084860312156110af578283fd5b6110b884610ff6565b95602085013595506040909401359392505050565b60008082840360e08112156110e0578283fd5b6110e984610ff6565b925060c0601f19820112156110fc578182fd5b5060405160c0810181811067ffffffffffffffff8211171561111a57fe5b80604052506020840135815260408401356020820152606084013560408201526080840135606082015261115060a08501610ff6565b608082015261116160c0850161100d565b60a0820152809150509250929050565b60609190911b6bffffffffffffffffffffffff1916815260140190565b60609290921b6bffffffffffffffffffffffff19168252601482015260340190565b6001600160a01b0391909116815260200190565b901515815260200190565b90815260200190565b60208082526036908201527f46756e6374696f6e2063616e206f6e6c792062652063616c6c65642062792061604082015275757468656e746963617465642061646472657373657360501b606082015260800190565b815181526020808301519082015260408083015190820152606080830151908201526080808301516001600160a01b03169082015260a09182015115159181019190915260c0019056fea26469706673582212205bac84845119d44a384d804ab40cf5b8661877b394d879fd05cdd049485222d964736f6c63430007060033a264697066735822122049d6bdb64f1e5e1bffb7aba87ce3a0db62412188b801b3e899b8b558b75755a364736f6c63430007060033", "devdoc": { - "details": "The State Manager Factory is called by a State Transitioner's init code, to create a new State Manager for use in the Fraud Verification process. Compiler used: solc Runtime target: EVM", + "details": "The State Manager Factory is called by a State Transitioner's init code, to create a new State Manager for use in the Fraud Verification process. Compiler used: solc Runtime target: EVM", "kind": "dev", "methods": { "create(address)": { diff --git a/packages/contracts/deployments/kovan/OVM_StateTransitionerFactory.json b/packages/contracts/deployments/kovan/OVM_StateTransitionerFactory.json index 4fa5215547398..8c6de8d67c0c3 100644 --- a/packages/contracts/deployments/kovan/OVM_StateTransitionerFactory.json +++ b/packages/contracts/deployments/kovan/OVM_StateTransitionerFactory.json @@ -1,5 +1,5 @@ { - "address": "0xE77250c2663d4E81a0Cd7B321f0BB270694A4851", + "address": "0xd6eDb16a89A2EE4484fa8fdCDb11B8B5633c3687", "abi": [ { "inputs": [ @@ -71,7 +71,7 @@ "outputs": [ { "internalType": "address", - "name": "_contract", + "name": "", "type": "address" } ], @@ -79,31 +79,31 @@ "type": "function" } ], - "transactionHash": "0x75f252f9b1cdafd0f8a72835dc8f35d79618c3d2da71e52f1d0a244b7bfef738", + "transactionHash": "0x36cca1310ad53537bb898174d480b15209ef5ad4c1be506c4516c6de43a39de9", "receipt": { "to": null, "from": "0x18394B52d3Cb931dfA76F63251919D051953413d", - "contractAddress": "0xE77250c2663d4E81a0Cd7B321f0BB270694A4851", - "transactionIndex": 5, - "gasUsed": "4076323", + "contractAddress": "0xd6eDb16a89A2EE4484fa8fdCDb11B8B5633c3687", + "transactionIndex": 0, + "gasUsed": "4127740", "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0xd793fcb28f4650cc64734891e03850c8128280d71b22ae10d56b3382125290ac", - "transactionHash": "0x75f252f9b1cdafd0f8a72835dc8f35d79618c3d2da71e52f1d0a244b7bfef738", + "blockHash": "0x6d044d596657c12c5311fc0306f862a5f678a150f15ef785ab4546deb6f0e3b7", + "transactionHash": "0x36cca1310ad53537bb898174d480b15209ef5ad4c1be506c4516c6de43a39de9", "logs": [], - "blockNumber": 24199517, - "cumulativeGasUsed": "4739143", + "blockNumber": 24572864, + "cumulativeGasUsed": "4127740", "status": 1, "byzantium": true }, "args": [ - "0xFaf27b24ba54C6910C12CFF5C9453C0e8D634e05" + "0xd56F695e73286ac252A37593DD4E7c14270eC1Df" ], - "solcInputHash": "03aed03b958b1d37f90bd88d0f56dd85", - "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_stateTransitionIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"_preStateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"_transactionHash\",\"type\":\"bytes32\"}],\"name\":\"create\",\"outputs\":[{\"internalType\":\"contract iOVM_StateTransitioner\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"_contract\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The State Transitioner Factory is used by the Fraud Verifier to create a new State Transitioner during the initialization of a fraud proof. Compiler used: solc Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"create(address,uint256,bytes32,bytes32)\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\",\"_preStateRoot\":\"State root before the transition was executed.\",\"_stateTransitionIndex\":\"Index of the state transition being verified.\",\"_transactionHash\":\"Hash of the executed transaction.\"},\"returns\":{\"_0\":\"New OVM_StateTransitioner instance.\"}}},\"title\":\"OVM_StateTransitionerFactory\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"create(address,uint256,bytes32,bytes32)\":{\"notice\":\"Creates a new OVM_StateTransitioner\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/OVM/verification/OVM_StateTransitionerFactory.sol\":\"OVM_StateTransitionerFactory\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/optimistic-ethereum/OVM/verification/Abs_FraudContributor.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\nimport { iOVM_BondManager } from \\\"../../iOVM/verification/iOVM_BondManager.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/// Minimal contract to be inherited by contracts consumed by users that provide\\n/// data for fraud proofs\\nabstract contract Abs_FraudContributor is Lib_AddressResolver {\\n /// Decorate your functions with this modifier to store how much total gas was\\n /// consumed by the sender, to reward users fairly\\n modifier contributesToFraudProof(bytes32 preStateRoot, bytes32 txHash) {\\n uint256 startGas = gasleft();\\n _;\\n uint256 gasSpent = startGas - gasleft();\\n iOVM_BondManager(resolve('OVM_BondManager')).recordGasSpent(preStateRoot, txHash, msg.sender, gasSpent);\\n }\\n}\\n\",\"keccak256\":\"0x6c27d089a297103cb93b30f7649ab68691cc6b948c315f1037e5de1fe9bf5903\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/verification/OVM_StateTransitioner.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// @unsupported: ovm\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\nimport { Lib_EthUtils } from \\\"../../libraries/utils/Lib_EthUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../../libraries/utils/Lib_Bytes32Utils.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../../libraries/utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_SecureMerkleTrie } from \\\"../../libraries/trie/Lib_SecureMerkleTrie.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../../libraries/rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_RLPReader } from \\\"../../libraries/rlp/Lib_RLPReader.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_StateTransitioner } from \\\"../../iOVM/verification/iOVM_StateTransitioner.sol\\\";\\nimport { iOVM_BondManager } from \\\"../../iOVM/verification/iOVM_BondManager.sol\\\";\\nimport { iOVM_ExecutionManager } from \\\"../../iOVM/execution/iOVM_ExecutionManager.sol\\\";\\nimport { iOVM_StateManager } from \\\"../../iOVM/execution/iOVM_StateManager.sol\\\";\\nimport { iOVM_StateManagerFactory } from \\\"../../iOVM/execution/iOVM_StateManagerFactory.sol\\\";\\n\\n/* Contract Imports */\\nimport { Abs_FraudContributor } from \\\"./Abs_FraudContributor.sol\\\";\\n\\n/**\\n * @title OVM_StateTransitioner\\n * @dev The State Transitioner coordinates the execution of a state transition during the evaluation of a\\n * fraud proof. It feeds verified input to the Execution Manager's run(), and controls a State Manager (which is\\n * uniquely created for each fraud proof).\\n * Once a fraud proof has been initialized, this contract is provided with the pre-state root and verifies\\n * that the OVM storage slots committed to the State Mangager are contained in that state\\n * This contract controls the State Manager and Execution Manager, and uses them to calculate the\\n * post-state root by applying the transaction. The Fraud Verifier can then check for fraud by comparing\\n * the calculated post-state root with the proposed post-state root.\\n *\\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract OVM_StateTransitioner is Lib_AddressResolver, Abs_FraudContributor, iOVM_StateTransitioner {\\n\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n enum TransitionPhase {\\n PRE_EXECUTION,\\n POST_EXECUTION,\\n COMPLETE\\n }\\n\\n\\n /*******************************************\\n * Contract Variables: Contract References *\\n *******************************************/\\n\\n iOVM_StateManager public ovmStateManager;\\n\\n\\n /*******************************************\\n * Contract Variables: Internal Accounting *\\n *******************************************/\\n\\n bytes32 internal preStateRoot;\\n bytes32 internal postStateRoot;\\n TransitionPhase public phase;\\n uint256 internal stateTransitionIndex;\\n bytes32 internal transactionHash;\\n\\n\\n /*************\\n * Constants *\\n *************/\\n\\n bytes32 internal constant EMPTY_ACCOUNT_CODE_HASH = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;\\n bytes32 internal constant EMPTY_ACCOUNT_STORAGE_ROOT = 0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n * @param _stateTransitionIndex Index of the state transition being verified.\\n * @param _preStateRoot State root before the transition was executed.\\n * @param _transactionHash Hash of the executed transaction.\\n */\\n constructor(\\n address _libAddressManager,\\n uint256 _stateTransitionIndex,\\n bytes32 _preStateRoot,\\n bytes32 _transactionHash\\n )\\n Lib_AddressResolver(_libAddressManager)\\n {\\n stateTransitionIndex = _stateTransitionIndex;\\n preStateRoot = _preStateRoot;\\n postStateRoot = _preStateRoot;\\n transactionHash = _transactionHash;\\n\\n ovmStateManager = iOVM_StateManagerFactory(resolve(\\\"OVM_StateManagerFactory\\\")).create(address(this));\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n /**\\n * Checks that a function is only run during a specific phase.\\n * @param _phase Phase the function must run within.\\n */\\n modifier onlyDuringPhase(\\n TransitionPhase _phase\\n ) {\\n require(\\n phase == _phase,\\n \\\"Function must be called during the correct phase.\\\"\\n );\\n _;\\n }\\n\\n\\n /**********************************\\n * Public Functions: State Access *\\n **********************************/\\n\\n /**\\n * Retrieves the state root before execution.\\n * @return _preStateRoot State root before execution.\\n */\\n function getPreStateRoot()\\n override\\n public\\n view\\n returns (\\n bytes32 _preStateRoot\\n )\\n {\\n return preStateRoot;\\n }\\n\\n /**\\n * Retrieves the state root after execution.\\n * @return _postStateRoot State root after execution.\\n */\\n function getPostStateRoot()\\n override\\n public\\n view\\n returns (\\n bytes32 _postStateRoot\\n )\\n {\\n return postStateRoot;\\n }\\n\\n /**\\n * Checks whether the transitioner is complete.\\n * @return _complete Whether or not the transition process is finished.\\n */\\n function isComplete()\\n override\\n public\\n view\\n returns (\\n bool _complete\\n )\\n {\\n return phase == TransitionPhase.COMPLETE;\\n }\\n\\n\\n /***********************************\\n * Public Functions: Pre-Execution *\\n ***********************************/\\n\\n /**\\n * Allows a user to prove the initial state of a contract.\\n * @param _ovmContractAddress Address of the contract on the OVM.\\n * @param _ethContractAddress Address of the corresponding contract on L1.\\n * @param _stateTrieWitness Proof of the account state.\\n */\\n function proveContractState(\\n address _ovmContractAddress,\\n address _ethContractAddress,\\n bytes memory _stateTrieWitness\\n )\\n override\\n public\\n onlyDuringPhase(TransitionPhase.PRE_EXECUTION)\\n contributesToFraudProof(preStateRoot, transactionHash)\\n {\\n // Exit quickly to avoid unnecessary work.\\n require(\\n (\\n ovmStateManager.hasAccount(_ovmContractAddress) == false\\n && ovmStateManager.hasEmptyAccount(_ovmContractAddress) == false\\n ),\\n \\\"Account state has already been proven.\\\"\\n );\\n\\n // Function will fail if the proof is not a valid inclusion or exclusion proof.\\n (\\n bool exists,\\n bytes memory encodedAccount\\n ) = Lib_SecureMerkleTrie.get(\\n abi.encodePacked(_ovmContractAddress),\\n _stateTrieWitness,\\n preStateRoot\\n );\\n\\n if (exists == true) {\\n // Account exists, this was an inclusion proof.\\n Lib_OVMCodec.EVMAccount memory account = Lib_OVMCodec.decodeEVMAccount(\\n encodedAccount\\n );\\n\\n address ethContractAddress = _ethContractAddress;\\n if (account.codeHash == EMPTY_ACCOUNT_CODE_HASH) {\\n // Use a known empty contract to prevent an attack in which a user provides a\\n // contract address here and then later deploys code to it.\\n ethContractAddress = 0x0000000000000000000000000000000000000000;\\n } else {\\n // Otherwise, make sure that the code at the provided eth address matches the hash\\n // of the code stored on L2.\\n require(\\n Lib_EthUtils.getCodeHash(ethContractAddress) == account.codeHash,\\n \\\"OVM_StateTransitioner: Provided L1 contract code hash does not match L2 contract code hash.\\\"\\n );\\n }\\n\\n ovmStateManager.putAccount(\\n _ovmContractAddress,\\n Lib_OVMCodec.Account({\\n nonce: account.nonce,\\n balance: account.balance,\\n storageRoot: account.storageRoot,\\n codeHash: account.codeHash,\\n ethAddress: ethContractAddress,\\n isFresh: false\\n })\\n );\\n } else {\\n // Account does not exist, this was an exclusion proof.\\n ovmStateManager.putEmptyAccount(_ovmContractAddress);\\n }\\n }\\n\\n /**\\n * Allows a user to prove the initial state of a contract storage slot.\\n * @param _ovmContractAddress Address of the contract on the OVM.\\n * @param _key Claimed account slot key.\\n * @param _storageTrieWitness Proof of the storage slot.\\n */\\n function proveStorageSlot(\\n address _ovmContractAddress,\\n bytes32 _key,\\n bytes memory _storageTrieWitness\\n )\\n override\\n public\\n onlyDuringPhase(TransitionPhase.PRE_EXECUTION)\\n contributesToFraudProof(preStateRoot, transactionHash)\\n {\\n // Exit quickly to avoid unnecessary work.\\n require(\\n ovmStateManager.hasContractStorage(_ovmContractAddress, _key) == false,\\n \\\"Storage slot has already been proven.\\\"\\n );\\n\\n require(\\n ovmStateManager.hasAccount(_ovmContractAddress) == true,\\n \\\"Contract must be verified before proving a storage slot.\\\"\\n );\\n\\n bytes32 storageRoot = ovmStateManager.getAccountStorageRoot(_ovmContractAddress);\\n bytes32 value;\\n\\n if (storageRoot == EMPTY_ACCOUNT_STORAGE_ROOT) {\\n // Storage trie was empty, so the user is always allowed to insert zero-byte values.\\n value = bytes32(0);\\n } else {\\n // Function will fail if the proof is not a valid inclusion or exclusion proof.\\n (\\n bool exists,\\n bytes memory encodedValue\\n ) = Lib_SecureMerkleTrie.get(\\n abi.encodePacked(_key),\\n _storageTrieWitness,\\n storageRoot\\n );\\n\\n if (exists == true) {\\n // Inclusion proof.\\n // Stored values are RLP encoded, with leading zeros removed.\\n value = Lib_BytesUtils.toBytes32PadLeft(\\n Lib_RLPReader.readBytes(encodedValue)\\n );\\n } else {\\n // Exclusion proof, can only be zero bytes.\\n value = bytes32(0);\\n }\\n }\\n\\n ovmStateManager.putContractStorage(\\n _ovmContractAddress,\\n _key,\\n value\\n );\\n }\\n\\n\\n /*******************************\\n * Public Functions: Execution *\\n *******************************/\\n\\n /**\\n * Executes the state transition.\\n * @param _transaction OVM transaction to execute.\\n */\\n function applyTransaction(\\n Lib_OVMCodec.Transaction memory _transaction\\n )\\n override\\n public\\n onlyDuringPhase(TransitionPhase.PRE_EXECUTION)\\n contributesToFraudProof(preStateRoot, transactionHash)\\n {\\n require(\\n Lib_OVMCodec.hashTransaction(_transaction) == transactionHash,\\n \\\"Invalid transaction provided.\\\"\\n );\\n\\n // We require gas to complete the logic here in run() before/after execution,\\n // But must ensure the full _tx.gasLimit can be given to the ovmCALL (determinism)\\n // This includes 1/64 of the gas getting lost because of EIP-150 (lost twice--first\\n // going into EM, then going into the code contract).\\n require(\\n gasleft() >= 100000 + _transaction.gasLimit * 1032 / 1000, // 1032/1000 = 1.032 = (64/63)^2 rounded up\\n \\\"Not enough gas to execute transaction deterministically.\\\"\\n );\\n\\n iOVM_ExecutionManager ovmExecutionManager = iOVM_ExecutionManager(resolve(\\\"OVM_ExecutionManager\\\"));\\n\\n // We call `setExecutionManager` right before `run` (and not earlier) just in case the\\n // OVM_ExecutionManager address was updated between the time when this contract was created\\n // and when `applyTransaction` was called.\\n ovmStateManager.setExecutionManager(address(ovmExecutionManager));\\n\\n // `run` always succeeds *unless* the user hasn't provided enough gas to `applyTransaction`\\n // or an INVALID_STATE_ACCESS flag was triggered. Either way, we won't get beyond this line\\n // if that's the case.\\n ovmExecutionManager.run(_transaction, address(ovmStateManager));\\n\\n // Prevent the Execution Manager from calling this SM again.\\n ovmStateManager.setExecutionManager(address(0));\\n phase = TransitionPhase.POST_EXECUTION;\\n }\\n\\n\\n /************************************\\n * Public Functions: Post-Execution *\\n ************************************/\\n\\n /**\\n * Allows a user to commit the final state of a contract.\\n * @param _ovmContractAddress Address of the contract on the OVM.\\n * @param _stateTrieWitness Proof of the account state.\\n */\\n function commitContractState(\\n address _ovmContractAddress,\\n bytes memory _stateTrieWitness\\n )\\n override\\n public\\n onlyDuringPhase(TransitionPhase.POST_EXECUTION)\\n contributesToFraudProof(preStateRoot, transactionHash)\\n {\\n require(\\n ovmStateManager.getTotalUncommittedContractStorage() == 0,\\n \\\"All storage must be committed before committing account states.\\\"\\n );\\n\\n require (\\n ovmStateManager.commitAccount(_ovmContractAddress) == true,\\n \\\"Account state wasn't changed or has already been committed.\\\"\\n );\\n\\n Lib_OVMCodec.Account memory account = ovmStateManager.getAccount(_ovmContractAddress);\\n\\n postStateRoot = Lib_SecureMerkleTrie.update(\\n abi.encodePacked(_ovmContractAddress),\\n Lib_OVMCodec.encodeEVMAccount(\\n Lib_OVMCodec.toEVMAccount(account)\\n ),\\n _stateTrieWitness,\\n postStateRoot\\n );\\n\\n // Emit an event to help clients figure out the proof ordering.\\n emit AccountCommitted(\\n _ovmContractAddress\\n );\\n }\\n\\n /**\\n * Allows a user to commit the final state of a contract storage slot.\\n * @param _ovmContractAddress Address of the contract on the OVM.\\n * @param _key Claimed account slot key.\\n * @param _storageTrieWitness Proof of the storage slot.\\n */\\n function commitStorageSlot(\\n address _ovmContractAddress,\\n bytes32 _key,\\n bytes memory _storageTrieWitness\\n )\\n override\\n public\\n onlyDuringPhase(TransitionPhase.POST_EXECUTION)\\n contributesToFraudProof(preStateRoot, transactionHash)\\n {\\n require(\\n ovmStateManager.commitContractStorage(_ovmContractAddress, _key) == true,\\n \\\"Storage slot value wasn't changed or has already been committed.\\\"\\n );\\n\\n Lib_OVMCodec.Account memory account = ovmStateManager.getAccount(_ovmContractAddress);\\n bytes32 value = ovmStateManager.getContractStorage(_ovmContractAddress, _key);\\n\\n account.storageRoot = Lib_SecureMerkleTrie.update(\\n abi.encodePacked(_key),\\n Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(value)\\n ),\\n _storageTrieWitness,\\n account.storageRoot\\n );\\n\\n ovmStateManager.putAccount(_ovmContractAddress, account);\\n\\n // Emit an event to help clients figure out the proof ordering.\\n emit ContractStorageCommitted(\\n _ovmContractAddress,\\n _key\\n );\\n }\\n\\n\\n /**********************************\\n * Public Functions: Finalization *\\n **********************************/\\n\\n /**\\n * Finalizes the transition process.\\n */\\n function completeTransition()\\n override\\n public\\n onlyDuringPhase(TransitionPhase.POST_EXECUTION)\\n {\\n require(\\n ovmStateManager.getTotalUncommittedAccounts() == 0,\\n \\\"All accounts must be committed before completing a transition.\\\"\\n );\\n\\n require(\\n ovmStateManager.getTotalUncommittedContractStorage() == 0,\\n \\\"All storage must be committed before completing a transition.\\\"\\n );\\n\\n phase = TransitionPhase.COMPLETE;\\n }\\n}\\n\",\"keccak256\":\"0xc363807221625338a396c52a4bc3b7439e63972ac87521670c47745641e91fa6\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/verification/OVM_StateTransitionerFactory.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// @unsupported: ovm\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_StateTransitioner } from \\\"../../iOVM/verification/iOVM_StateTransitioner.sol\\\";\\nimport { iOVM_StateTransitionerFactory } from \\\"../../iOVM/verification/iOVM_StateTransitionerFactory.sol\\\";\\nimport { iOVM_FraudVerifier } from \\\"../../iOVM/verification/iOVM_FraudVerifier.sol\\\";\\n\\n/* Contract Imports */\\nimport { OVM_StateTransitioner } from \\\"./OVM_StateTransitioner.sol\\\";\\n\\n/**\\n * @title OVM_StateTransitionerFactory\\n * @dev The State Transitioner Factory is used by the Fraud Verifier to create a new State \\n * Transitioner during the initialization of a fraud proof.\\n * \\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract OVM_StateTransitionerFactory is iOVM_StateTransitionerFactory, Lib_AddressResolver {\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n constructor(\\n address _libAddressManager\\n )\\n Lib_AddressResolver(_libAddressManager)\\n {}\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Creates a new OVM_StateTransitioner\\n * @param _libAddressManager Address of the Address Manager.\\n * @param _stateTransitionIndex Index of the state transition being verified.\\n * @param _preStateRoot State root before the transition was executed.\\n * @param _transactionHash Hash of the executed transaction.\\n * @return New OVM_StateTransitioner instance.\\n */\\n function create(\\n address _libAddressManager,\\n uint256 _stateTransitionIndex,\\n bytes32 _preStateRoot,\\n bytes32 _transactionHash\\n )\\n override\\n public\\n returns (\\n iOVM_StateTransitioner\\n )\\n {\\n require(\\n msg.sender == resolve(\\\"OVM_FraudVerifier\\\"),\\n \\\"Create can only be done by the OVM_FraudVerifier.\\\"\\n );\\n\\n return new OVM_StateTransitioner(\\n _libAddressManager,\\n _stateTransitionIndex,\\n _preStateRoot,\\n _transactionHash\\n );\\n }\\n}\\n\",\"keccak256\":\"0xf9e4c100a38655d5198f13ae918b460244394f1cda29cddbd46b11b25aaafba5\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/execution/iOVM_ExecutionManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\ninterface iOVM_ExecutionManager {\\n /**********\\n * Enums *\\n *********/\\n\\n enum RevertFlag {\\n OUT_OF_GAS,\\n INTENTIONAL_REVERT,\\n EXCEEDS_NUISANCE_GAS,\\n INVALID_STATE_ACCESS,\\n UNSAFE_BYTECODE,\\n CREATE_COLLISION,\\n STATIC_VIOLATION,\\n CREATOR_NOT_ALLOWED\\n }\\n\\n enum GasMetadataKey {\\n CURRENT_EPOCH_START_TIMESTAMP,\\n CUMULATIVE_SEQUENCER_QUEUE_GAS,\\n CUMULATIVE_L1TOL2_QUEUE_GAS,\\n PREV_EPOCH_SEQUENCER_QUEUE_GAS,\\n PREV_EPOCH_L1TOL2_QUEUE_GAS\\n }\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct GasMeterConfig {\\n uint256 minTransactionGasLimit;\\n uint256 maxTransactionGasLimit;\\n uint256 maxGasPerQueuePerEpoch;\\n uint256 secondsPerEpoch;\\n }\\n\\n struct GlobalContext {\\n uint256 ovmCHAINID;\\n }\\n\\n struct TransactionContext {\\n Lib_OVMCodec.QueueOrigin ovmL1QUEUEORIGIN;\\n uint256 ovmTIMESTAMP;\\n uint256 ovmNUMBER;\\n uint256 ovmGASLIMIT;\\n uint256 ovmTXGASLIMIT;\\n address ovmL1TXORIGIN;\\n }\\n\\n struct TransactionRecord {\\n uint256 ovmGasRefund;\\n }\\n\\n struct MessageContext {\\n address ovmCALLER;\\n address ovmADDRESS;\\n bool isStatic;\\n }\\n\\n struct MessageRecord {\\n uint256 nuisanceGasLeft;\\n }\\n\\n\\n /************************************\\n * Transaction Execution Entrypoint *\\n ************************************/\\n\\n function run(\\n Lib_OVMCodec.Transaction calldata _transaction,\\n address _txStateManager\\n ) external;\\n\\n\\n /*******************\\n * Context Opcodes *\\n *******************/\\n\\n function ovmCALLER() external view returns (address _caller);\\n function ovmADDRESS() external view returns (address _address);\\n function ovmTIMESTAMP() external view returns (uint256 _timestamp);\\n function ovmNUMBER() external view returns (uint256 _number);\\n function ovmGASLIMIT() external view returns (uint256 _gasLimit);\\n function ovmCHAINID() external view returns (uint256 _chainId);\\n\\n\\n /**********************\\n * L2 Context Opcodes *\\n **********************/\\n\\n function ovmL1QUEUEORIGIN() external view returns (Lib_OVMCodec.QueueOrigin _queueOrigin);\\n function ovmL1TXORIGIN() external view returns (address _l1TxOrigin);\\n\\n\\n /*******************\\n * Halting Opcodes *\\n *******************/\\n\\n function ovmREVERT(bytes memory _data) external;\\n\\n\\n /*****************************\\n * Contract Creation Opcodes *\\n *****************************/\\n\\n function ovmCREATE(bytes memory _bytecode) external returns (address _contract, bytes memory _revertdata);\\n function ovmCREATE2(bytes memory _bytecode, bytes32 _salt) external returns (address _contract, bytes memory _revertdata);\\n\\n\\n /*******************************\\n * Account Abstraction Opcodes *\\n ******************************/\\n\\n function ovmGETNONCE() external returns (uint256 _nonce);\\n function ovmINCREMENTNONCE() external;\\n function ovmCREATEEOA(bytes32 _messageHash, uint8 _v, bytes32 _r, bytes32 _s) external;\\n\\n\\n /****************************\\n * Contract Calling Opcodes *\\n ****************************/\\n\\n function ovmCALL(uint256 _gasLimit, address _address, bytes memory _calldata) external returns (bool _success, bytes memory _returndata);\\n function ovmSTATICCALL(uint256 _gasLimit, address _address, bytes memory _calldata) external returns (bool _success, bytes memory _returndata);\\n function ovmDELEGATECALL(uint256 _gasLimit, address _address, bytes memory _calldata) external returns (bool _success, bytes memory _returndata);\\n\\n\\n /****************************\\n * Contract Storage Opcodes *\\n ****************************/\\n\\n function ovmSLOAD(bytes32 _key) external returns (bytes32 _value);\\n function ovmSSTORE(bytes32 _key, bytes32 _value) external;\\n\\n\\n /*************************\\n * Contract Code Opcodes *\\n *************************/\\n\\n function ovmEXTCODECOPY(address _contract, uint256 _offset, uint256 _length) external returns (bytes memory _code);\\n function ovmEXTCODESIZE(address _contract) external returns (uint256 _size);\\n function ovmEXTCODEHASH(address _contract) external returns (bytes32 _hash);\\n\\n\\n /***************************************\\n * Public Functions: Execution Context *\\n ***************************************/\\n\\n function getMaxTransactionGasLimit() external view returns (uint _maxTransactionGasLimit);\\n}\\n\",\"keccak256\":\"0xa613e2f578d56aa80f0916df538b487f8213a18933e78fdecb9efeedae02cf9c\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/execution/iOVM_StateManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title iOVM_StateManager\\n */\\ninterface iOVM_StateManager {\\n\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n enum ItemState {\\n ITEM_UNTOUCHED,\\n ITEM_LOADED,\\n ITEM_CHANGED,\\n ITEM_COMMITTED\\n }\\n\\n /***************************\\n * Public Functions: Misc *\\n ***************************/\\n\\n function isAuthenticated(address _address) external view returns (bool);\\n\\n /***************************\\n * Public Functions: Setup *\\n ***************************/\\n\\n function owner() external view returns (address _owner);\\n function ovmExecutionManager() external view returns (address _ovmExecutionManager);\\n function setExecutionManager(address _ovmExecutionManager) external;\\n\\n\\n /************************************\\n * Public Functions: Account Access *\\n ************************************/\\n\\n function putAccount(address _address, Lib_OVMCodec.Account memory _account) external;\\n function putEmptyAccount(address _address) external;\\n function getAccount(address _address) external view returns (Lib_OVMCodec.Account memory _account);\\n function hasAccount(address _address) external view returns (bool _exists);\\n function hasEmptyAccount(address _address) external view returns (bool _exists);\\n function setAccountNonce(address _address, uint256 _nonce) external;\\n function getAccountNonce(address _address) external view returns (uint256 _nonce);\\n function getAccountEthAddress(address _address) external view returns (address _ethAddress);\\n function getAccountStorageRoot(address _address) external view returns (bytes32 _storageRoot);\\n function initPendingAccount(address _address) external;\\n function commitPendingAccount(address _address, address _ethAddress, bytes32 _codeHash) external;\\n function testAndSetAccountLoaded(address _address) external returns (bool _wasAccountAlreadyLoaded);\\n function testAndSetAccountChanged(address _address) external returns (bool _wasAccountAlreadyChanged);\\n function commitAccount(address _address) external returns (bool _wasAccountCommitted);\\n function incrementTotalUncommittedAccounts() external;\\n function getTotalUncommittedAccounts() external view returns (uint256 _total);\\n function wasAccountChanged(address _address) external view returns (bool);\\n function wasAccountCommitted(address _address) external view returns (bool);\\n\\n\\n /************************************\\n * Public Functions: Storage Access *\\n ************************************/\\n\\n function putContractStorage(address _contract, bytes32 _key, bytes32 _value) external;\\n function getContractStorage(address _contract, bytes32 _key) external view returns (bytes32 _value);\\n function hasContractStorage(address _contract, bytes32 _key) external view returns (bool _exists);\\n function testAndSetContractStorageLoaded(address _contract, bytes32 _key) external returns (bool _wasContractStorageAlreadyLoaded);\\n function testAndSetContractStorageChanged(address _contract, bytes32 _key) external returns (bool _wasContractStorageAlreadyChanged);\\n function commitContractStorage(address _contract, bytes32 _key) external returns (bool _wasContractStorageCommitted);\\n function incrementTotalUncommittedContractStorage() external;\\n function getTotalUncommittedContractStorage() external view returns (uint256 _total);\\n function wasContractStorageChanged(address _contract, bytes32 _key) external view returns (bool);\\n function wasContractStorageCommitted(address _contract, bytes32 _key) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x7a11dbd1f61593ba34debe07e39eef59967307f7f372ba9855bee0953585d08d\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/execution/iOVM_StateManagerFactory.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Contract Imports */\\nimport { iOVM_StateManager } from \\\"./iOVM_StateManager.sol\\\";\\n\\n/**\\n * @title iOVM_StateManagerFactory\\n */\\ninterface iOVM_StateManagerFactory {\\n\\n /***************************************\\n * Public Functions: Contract Creation *\\n ***************************************/\\n\\n function create(\\n address _owner\\n )\\n external\\n returns (\\n iOVM_StateManager _ovmStateManager\\n );\\n}\\n\",\"keccak256\":\"0x27a90fc43889d0c7d1db50f37907ef7386d9b415d15a1e91a0a068cba59afd36\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/verification/iOVM_BondManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\ninterface ERC20 {\\n function transfer(address, uint256) external returns (bool);\\n function transferFrom(address, address, uint256) external returns (bool);\\n}\\n\\n/// All the errors which may be encountered on the bond manager\\nlibrary Errors {\\n string constant ERC20_ERR = \\\"BondManager: Could not post bond\\\";\\n string constant ALREADY_FINALIZED = \\\"BondManager: Fraud proof for this pre-state root has already been finalized\\\";\\n string constant SLASHED = \\\"BondManager: Cannot finalize withdrawal, you probably got slashed\\\";\\n string constant WRONG_STATE = \\\"BondManager: Wrong bond state for proposer\\\";\\n string constant CANNOT_CLAIM = \\\"BondManager: Cannot claim yet. Dispute must be finalized first\\\";\\n\\n string constant WITHDRAWAL_PENDING = \\\"BondManager: Withdrawal already pending\\\";\\n string constant TOO_EARLY = \\\"BondManager: Too early to finalize your withdrawal\\\";\\n\\n string constant ONLY_TRANSITIONER = \\\"BondManager: Only the transitioner for this pre-state root may call this function\\\";\\n string constant ONLY_FRAUD_VERIFIER = \\\"BondManager: Only the fraud verifier may call this function\\\";\\n string constant ONLY_STATE_COMMITMENT_CHAIN = \\\"BondManager: Only the state commitment chain may call this function\\\";\\n string constant WAIT_FOR_DISPUTES = \\\"BondManager: Wait for other potential disputes\\\";\\n}\\n\\n/**\\n * @title iOVM_BondManager\\n */\\ninterface iOVM_BondManager {\\n\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n /// The lifecycle of a proposer's bond\\n enum State {\\n // Before depositing or after getting slashed, a user is uncollateralized\\n NOT_COLLATERALIZED,\\n // After depositing, a user is collateralized\\n COLLATERALIZED,\\n // After a user has initiated a withdrawal\\n WITHDRAWING\\n }\\n\\n /// A bond posted by a proposer\\n struct Bond {\\n // The user's state\\n State state;\\n // The timestamp at which a proposer issued their withdrawal request\\n uint32 withdrawalTimestamp;\\n // The time when the first disputed was initiated for this bond\\n uint256 firstDisputeAt;\\n // The earliest observed state root for this bond which has had fraud\\n bytes32 earliestDisputedStateRoot;\\n // The state root's timestamp\\n uint256 earliestTimestamp;\\n }\\n\\n // Per pre-state root, store the number of state provisions that were made\\n // and how many of these calls were made by each user. Payouts will then be\\n // claimed by users proportionally for that dispute.\\n struct Rewards {\\n // Flag to check if rewards for a fraud proof are claimable\\n bool canClaim;\\n // Total number of `recordGasSpent` calls made\\n uint256 total;\\n // The gas spent by each user to provide witness data. The sum of all\\n // values inside this map MUST be equal to the value of `total`\\n mapping(address => uint256) gasSpent;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function recordGasSpent(\\n bytes32 _preStateRoot,\\n bytes32 _txHash,\\n address _who,\\n uint256 _gasSpent\\n ) external;\\n\\n function finalize(\\n bytes32 _preStateRoot,\\n address _publisher,\\n uint256 _timestamp\\n ) external;\\n\\n function deposit() external;\\n\\n function startWithdrawal() external;\\n\\n function finalizeWithdrawal() external;\\n\\n function claim(\\n address _who\\n ) external;\\n\\n function isCollateralized(\\n address _who\\n ) external view returns (bool);\\n\\n function getGasSpent(\\n bytes32 _preStateRoot,\\n address _who\\n ) external view returns (uint256);\\n}\\n\",\"keccak256\":\"0x3c2a8a399487857158649db1896749d86e39cba545a8aeb2e2bb0f3bdfa7a5b1\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/verification/iOVM_FraudVerifier.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_StateTransitioner } from \\\"./iOVM_StateTransitioner.sol\\\";\\n\\n/**\\n * @title iOVM_FraudVerifier\\n */\\ninterface iOVM_FraudVerifier {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event FraudProofInitialized(\\n bytes32 _preStateRoot,\\n uint256 _preStateRootIndex,\\n bytes32 _transactionHash,\\n address _who\\n );\\n\\n event FraudProofFinalized(\\n bytes32 _preStateRoot,\\n uint256 _preStateRootIndex,\\n bytes32 _transactionHash,\\n address _who\\n );\\n\\n\\n /***************************************\\n * Public Functions: Transition Status *\\n ***************************************/\\n\\n function getStateTransitioner(bytes32 _preStateRoot, bytes32 _txHash) external view returns (iOVM_StateTransitioner _transitioner);\\n\\n\\n /****************************************\\n * Public Functions: Fraud Verification *\\n ****************************************/\\n\\n function initializeFraudVerification(\\n bytes32 _preStateRoot,\\n Lib_OVMCodec.ChainBatchHeader calldata _preStateRootBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof calldata _preStateRootProof,\\n Lib_OVMCodec.Transaction calldata _transaction,\\n Lib_OVMCodec.TransactionChainElement calldata _txChainElement,\\n Lib_OVMCodec.ChainBatchHeader calldata _transactionBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof calldata _transactionProof\\n ) external;\\n\\n function finalizeFraudVerification(\\n bytes32 _preStateRoot,\\n Lib_OVMCodec.ChainBatchHeader calldata _preStateRootBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof calldata _preStateRootProof,\\n bytes32 _txHash,\\n bytes32 _postStateRoot,\\n Lib_OVMCodec.ChainBatchHeader calldata _postStateRootBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof calldata _postStateRootProof\\n ) external;\\n}\\n\",\"keccak256\":\"0x5efd7bb18164bbd3e9d58379e8203fbf2a7ee802b1a48dff3ceaaec1523b1751\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/verification/iOVM_StateTransitioner.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title iOVM_StateTransitioner\\n */\\ninterface iOVM_StateTransitioner {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AccountCommitted(\\n address _address\\n );\\n\\n event ContractStorageCommitted(\\n address _address,\\n bytes32 _key\\n );\\n\\n\\n /**********************************\\n * Public Functions: State Access *\\n **********************************/\\n\\n function getPreStateRoot() external view returns (bytes32 _preStateRoot);\\n function getPostStateRoot() external view returns (bytes32 _postStateRoot);\\n function isComplete() external view returns (bool _complete);\\n\\n\\n /***********************************\\n * Public Functions: Pre-Execution *\\n ***********************************/\\n\\n function proveContractState(\\n address _ovmContractAddress,\\n address _ethContractAddress,\\n bytes calldata _stateTrieWitness\\n ) external;\\n\\n function proveStorageSlot(\\n address _ovmContractAddress,\\n bytes32 _key,\\n bytes calldata _storageTrieWitness\\n ) external;\\n\\n\\n /*******************************\\n * Public Functions: Execution *\\n *******************************/\\n\\n function applyTransaction(\\n Lib_OVMCodec.Transaction calldata _transaction\\n ) external;\\n\\n\\n /************************************\\n * Public Functions: Post-Execution *\\n ************************************/\\n\\n function commitContractState(\\n address _ovmContractAddress,\\n bytes calldata _stateTrieWitness\\n ) external;\\n\\n function commitStorageSlot(\\n address _ovmContractAddress,\\n bytes32 _key,\\n bytes calldata _storageTrieWitness\\n ) external;\\n\\n\\n /**********************************\\n * Public Functions: Finalization *\\n **********************************/\\n\\n function completeTransition() external;\\n}\\n\",\"keccak256\":\"0x3d044ac0a3bb6ad3d529f904b3191117511f9c379678ca03010e1ebdfcb5c34b\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/verification/iOVM_StateTransitionerFactory.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Contract Imports */\\nimport { iOVM_StateTransitioner } from \\\"./iOVM_StateTransitioner.sol\\\";\\n\\n/**\\n * @title iOVM_StateTransitionerFactory\\n */\\ninterface iOVM_StateTransitionerFactory {\\n\\n /***************************************\\n * Public Functions: Contract Creation *\\n ***************************************/\\n\\n function create(\\n address _proxyManager,\\n uint256 _stateTransitionIndex,\\n bytes32 _preStateRoot,\\n bytes32 _transactionHash\\n )\\n external\\n returns (\\n iOVM_StateTransitioner _ovmStateTransitioner\\n );\\n}\\n\",\"keccak256\":\"0x60a0f0c104e4c0c7863268a93005762e8146d393f9cfddfdd6a2d6585c5911fc\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/codec/Lib_OVMCodec.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../utils/Lib_Bytes32Utils.sol\\\";\\nimport { Lib_SafeExecutionManagerWrapper } from \\\"../../libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\\\";\\n\\n/**\\n * @title Lib_OVMCodec\\n */\\nlibrary Lib_OVMCodec {\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum EOASignatureType {\\n EIP155_TRANSACTION,\\n ETH_SIGNED_MESSAGE\\n }\\n\\n enum QueueOrigin {\\n SEQUENCER_QUEUE,\\n L1TOL2_QUEUE\\n }\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Account {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n address ethAddress;\\n bool isFresh;\\n }\\n\\n struct EVMAccount {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n }\\n\\n struct ChainBatchHeader {\\n uint256 batchIndex;\\n bytes32 batchRoot;\\n uint256 batchSize;\\n uint256 prevTotalElements;\\n bytes extraData;\\n }\\n\\n struct ChainInclusionProof {\\n uint256 index;\\n bytes32[] siblings;\\n }\\n\\n struct Transaction {\\n uint256 timestamp;\\n uint256 blockNumber;\\n QueueOrigin l1QueueOrigin;\\n address l1TxOrigin;\\n address entrypoint;\\n uint256 gasLimit;\\n bytes data;\\n }\\n\\n struct TransactionChainElement {\\n bool isSequenced;\\n uint256 queueIndex; // QUEUED TX ONLY\\n uint256 timestamp; // SEQUENCER TX ONLY\\n uint256 blockNumber; // SEQUENCER TX ONLY\\n bytes txData; // SEQUENCER TX ONLY\\n }\\n\\n struct QueueElement {\\n bytes32 transactionHash;\\n uint40 timestamp;\\n uint40 blockNumber;\\n }\\n\\n struct EIP155Transaction {\\n uint256 nonce;\\n uint256 gasPrice;\\n uint256 gasLimit;\\n address to;\\n uint256 value;\\n bytes data;\\n uint256 chainId;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Decodes an EOA transaction (i.e., native Ethereum RLP encoding).\\n * @param _transaction Encoded EOA transaction.\\n * @return Transaction decoded into a struct.\\n */\\n function decodeEIP155Transaction(\\n bytes memory _transaction,\\n bool _isEthSignedMessage\\n )\\n internal\\n pure\\n returns (\\n EIP155Transaction memory\\n )\\n {\\n if (_isEthSignedMessage) {\\n (\\n uint256 _nonce,\\n uint256 _gasLimit,\\n uint256 _gasPrice,\\n uint256 _chainId,\\n address _to,\\n bytes memory _data\\n ) = abi.decode(\\n _transaction,\\n (uint256, uint256, uint256, uint256, address ,bytes)\\n );\\n return EIP155Transaction({\\n nonce: _nonce,\\n gasPrice: _gasPrice,\\n gasLimit: _gasLimit,\\n to: _to,\\n value: 0,\\n data: _data,\\n chainId: _chainId\\n });\\n } else {\\n Lib_RLPReader.RLPItem[] memory decoded = Lib_RLPReader.readList(_transaction);\\n\\n return EIP155Transaction({\\n nonce: Lib_RLPReader.readUint256(decoded[0]),\\n gasPrice: Lib_RLPReader.readUint256(decoded[1]),\\n gasLimit: Lib_RLPReader.readUint256(decoded[2]),\\n to: Lib_RLPReader.readAddress(decoded[3]),\\n value: Lib_RLPReader.readUint256(decoded[4]),\\n data: Lib_RLPReader.readBytes(decoded[5]),\\n chainId: Lib_RLPReader.readUint256(decoded[6])\\n });\\n }\\n }\\n\\n /**\\n * Decompresses a compressed EIP155 transaction.\\n * @param _transaction Compressed EIP155 transaction bytes.\\n * @return Transaction parsed into a struct.\\n */\\n function decompressEIP155Transaction(\\n bytes memory _transaction\\n )\\n internal\\n returns (\\n EIP155Transaction memory\\n )\\n {\\n return EIP155Transaction({\\n gasLimit: Lib_BytesUtils.toUint24(_transaction, 0),\\n gasPrice: uint256(Lib_BytesUtils.toUint24(_transaction, 3)) * 1000000,\\n nonce: Lib_BytesUtils.toUint24(_transaction, 6),\\n to: Lib_BytesUtils.toAddress(_transaction, 9),\\n data: Lib_BytesUtils.slice(_transaction, 29),\\n chainId: Lib_SafeExecutionManagerWrapper.safeCHAINID(),\\n value: 0\\n });\\n }\\n\\n /**\\n * Encodes an EOA transaction back into the original transaction.\\n * @param _transaction EIP155transaction to encode.\\n * @param _isEthSignedMessage Whether or not this was an eth signed message.\\n * @return Encoded transaction.\\n */\\n function encodeEIP155Transaction(\\n EIP155Transaction memory _transaction,\\n bool _isEthSignedMessage\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n if (_isEthSignedMessage) {\\n return abi.encode(\\n _transaction.nonce,\\n _transaction.gasLimit,\\n _transaction.gasPrice,\\n _transaction.chainId,\\n _transaction.to,\\n _transaction.data\\n );\\n } else {\\n bytes[] memory raw = new bytes[](9);\\n\\n raw[0] = Lib_RLPWriter.writeUint(_transaction.nonce);\\n raw[1] = Lib_RLPWriter.writeUint(_transaction.gasPrice);\\n raw[2] = Lib_RLPWriter.writeUint(_transaction.gasLimit);\\n if (_transaction.to == address(0)) {\\n raw[3] = Lib_RLPWriter.writeBytes('');\\n } else {\\n raw[3] = Lib_RLPWriter.writeAddress(_transaction.to);\\n }\\n raw[4] = Lib_RLPWriter.writeUint(0);\\n raw[5] = Lib_RLPWriter.writeBytes(_transaction.data);\\n raw[6] = Lib_RLPWriter.writeUint(_transaction.chainId);\\n raw[7] = Lib_RLPWriter.writeBytes(bytes(''));\\n raw[8] = Lib_RLPWriter.writeBytes(bytes(''));\\n\\n return Lib_RLPWriter.writeList(raw);\\n }\\n }\\n\\n /**\\n * Encodes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Encoded transaction bytes.\\n */\\n function encodeTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return abi.encodePacked(\\n _transaction.timestamp,\\n _transaction.blockNumber,\\n _transaction.l1QueueOrigin,\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n );\\n }\\n\\n /**\\n * Hashes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Hashed transaction\\n */\\n function hashTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(encodeTransaction(_transaction));\\n }\\n\\n /**\\n * Converts an OVM account to an EVM account.\\n * @param _in OVM account to convert.\\n * @return Converted EVM account.\\n */\\n function toEVMAccount(\\n Account memory _in\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n return EVMAccount({\\n nonce: _in.nonce,\\n balance: _in.balance,\\n storageRoot: _in.storageRoot,\\n codeHash: _in.codeHash\\n });\\n }\\n\\n /**\\n * @notice RLP-encodes an account state struct.\\n * @param _account Account state struct.\\n * @return RLP-encoded account state.\\n */\\n function encodeEVMAccount(\\n EVMAccount memory _account\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes[] memory raw = new bytes[](4);\\n\\n // Unfortunately we can't create this array outright because\\n // Lib_RLPWriter.writeList will reject fixed-size arrays. Assigning\\n // index-by-index circumvents this issue.\\n raw[0] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.nonce)\\n )\\n );\\n raw[1] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.balance)\\n )\\n );\\n raw[2] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.storageRoot));\\n raw[3] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.codeHash));\\n\\n return Lib_RLPWriter.writeList(raw);\\n }\\n\\n /**\\n * @notice Decodes an RLP-encoded account state into a useful struct.\\n * @param _encoded RLP-encoded account state.\\n * @return Account state struct.\\n */\\n function decodeEVMAccount(\\n bytes memory _encoded\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\\n\\n return EVMAccount({\\n nonce: Lib_RLPReader.readUint256(accountState[0]),\\n balance: Lib_RLPReader.readUint256(accountState[1]),\\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\\n });\\n }\\n\\n /**\\n * Calculates a hash for a given batch header.\\n * @param _batchHeader Header to hash.\\n * @return Hash of the header.\\n */\\n function hashBatchHeader(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(\\n abi.encode(\\n _batchHeader.batchRoot,\\n _batchHeader.batchSize,\\n _batchHeader.prevTotalElements,\\n _batchHeader.extraData\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0xe7e518ba7bba3fa28c532f8902576c1bb4dfc1ec4b62bed6da50623248ba17c3\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Contract Imports */\\nimport { Ownable } from \\\"./Lib_Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n /*******************************************\\n * Contract Variables: Internal Accounting *\\n *******************************************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n public\\n onlyOwner\\n {\\n emit AddressSet(_name, _address);\\n addresses[_getNameHash(_name)] = _address;\\n }\\n\\n function getAddress(\\n string memory _name\\n )\\n public\\n view\\n returns (address)\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32 _hash\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0x3a490595cc21ff170e4027843093670ff845d5972481fbfb956b722ea564bb06\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n\\n /*******************************************\\n * Contract Variables: Contract References *\\n *******************************************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(\\n address _libAddressManager\\n ) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function resolve(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address _contract\\n )\\n {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0xaa3ed342f6deb156c660fd83afa579a3b80db17eb465e8949cf5c1b114780143\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Ownable\\n * @dev Adapted from https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol\\n */\\nabstract contract Ownable {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n address public owner;\\n\\n\\n /**********\\n * Events *\\n **********/\\n\\n event OwnershipTransferred(\\n address indexed previousOwner,\\n address indexed newOwner\\n );\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n constructor() {\\n owner = msg.sender;\\n emit OwnershipTransferred(address(0), owner);\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n owner == msg.sender,\\n \\\"Ownable: caller is not the owner\\\"\\n );\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function renounceOwnership()\\n public\\n virtual\\n onlyOwner\\n {\\n emit OwnershipTransferred(owner, address(0));\\n owner = address(0);\\n }\\n\\n function transferOwnership(address _newOwner)\\n public\\n virtual\\n onlyOwner\\n {\\n require(\\n _newOwner != address(0),\\n \\\"Ownable: new owner cannot be the zero address\\\"\\n );\\n\\n emit OwnershipTransferred(owner, _newOwner);\\n owner = _newOwner;\\n }\\n}\\n\",\"keccak256\":\"0xd9dfd9264e5b5fedd53a5b10fdf179c3f367614b0fe69179bce4e45119f5b739\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPReader.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_RLPReader\\n * @dev Adapted from \\\"RLPReader\\\" by Hamdi Allam (hamdi.allam97@gmail.com).\\n */\\nlibrary Lib_RLPReader {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 constant internal MAX_LIST_LENGTH = 32;\\n\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum RLPItemType {\\n DATA_ITEM,\\n LIST_ITEM\\n }\\n\\n \\n /***********\\n * Structs *\\n ***********/\\n\\n struct RLPItem {\\n uint256 length;\\n uint256 ptr;\\n }\\n \\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n \\n /**\\n * Converts bytes to a reference to memory position and length.\\n * @param _in Input bytes to convert.\\n * @return Output memory reference.\\n */\\n function toRLPItem(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem memory\\n )\\n {\\n uint256 ptr;\\n assembly {\\n ptr := add(_in, 32)\\n }\\n\\n return RLPItem({\\n length: _in.length,\\n ptr: ptr\\n });\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n (\\n uint256 listOffset,\\n ,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.LIST_ITEM,\\n \\\"Invalid RLP list value.\\\"\\n );\\n\\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\\n // writing to the length. Since we can't know the number of RLP items without looping over\\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\\n // simply set a reasonable maximum list length and decrease the size before we finish.\\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\\n\\n uint256 itemCount = 0;\\n uint256 offset = listOffset;\\n while (offset < _in.length) {\\n require(\\n itemCount < MAX_LIST_LENGTH,\\n \\\"Provided RLP list exceeds max list length.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n ) = _decodeLength(RLPItem({\\n length: _in.length - offset,\\n ptr: _in.ptr + offset\\n }));\\n\\n out[itemCount] = RLPItem({\\n length: itemLength + itemOffset,\\n ptr: _in.ptr + offset\\n });\\n\\n itemCount += 1;\\n offset += itemOffset + itemLength;\\n }\\n\\n // Decrease the array size to match the actual item count.\\n assembly {\\n mstore(out, itemCount)\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n return readList(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes value.\\\"\\n );\\n\\n return _copy(_in.ptr, itemOffset, itemLength);\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return readBytes(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return string(readBytes(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return readString(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n require(\\n _in.length <= 33,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr + itemOffset;\\n bytes32 out;\\n assembly {\\n out := mload(ptr)\\n\\n // Shift the bytes over to match the item size.\\n if lt(itemLength, 32) {\\n out := div(out, exp(256, sub(32, itemLength)))\\n }\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return readBytes32(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return uint256(readBytes32(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return readUint256(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n require(\\n _in.length == 1,\\n \\\"Invalid RLP boolean value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 out;\\n assembly {\\n out := byte(0, mload(ptr))\\n }\\n\\n require(\\n out == 0 || out == 1,\\n \\\"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\\\"\\n );\\n\\n return out != 0;\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return readBool(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n if (_in.length == 1) {\\n return address(0);\\n }\\n\\n require(\\n _in.length == 21,\\n \\\"Invalid RLP address value.\\\"\\n );\\n\\n return address(readUint256(_in));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return readAddress(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads the raw bytes of an RLP item.\\n * @param _in RLP item to read.\\n * @return Raw RLP bytes.\\n */\\n function readRawBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in);\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Decodes the length of an RLP item.\\n * @param _in RLP item to decode.\\n * @return Offset of the encoded data.\\n * @return Length of the encoded data.\\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\\n */\\n function _decodeLength(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n uint256,\\n uint256,\\n RLPItemType\\n )\\n {\\n require(\\n _in.length > 0,\\n \\\"RLP item cannot be null.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 prefix;\\n assembly {\\n prefix := byte(0, mload(ptr))\\n }\\n\\n if (prefix <= 0x7f) {\\n // Single byte.\\n\\n return (0, 1, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xb7) {\\n // Short string.\\n\\n uint256 strLen = prefix - 0x80;\\n \\n require(\\n _in.length > strLen,\\n \\\"Invalid RLP short string.\\\"\\n );\\n\\n return (1, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xbf) {\\n // Long string.\\n uint256 lenOfStrLen = prefix - 0xb7;\\n\\n require(\\n _in.length > lenOfStrLen,\\n \\\"Invalid RLP long string length.\\\"\\n );\\n\\n uint256 strLen;\\n assembly {\\n // Pick out the string length.\\n strLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfStrLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfStrLen + strLen,\\n \\\"Invalid RLP long string.\\\"\\n );\\n\\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xf7) {\\n // Short list.\\n uint256 listLen = prefix - 0xc0;\\n\\n require(\\n _in.length > listLen,\\n \\\"Invalid RLP short list.\\\"\\n );\\n\\n return (1, listLen, RLPItemType.LIST_ITEM);\\n } else {\\n // Long list.\\n uint256 lenOfListLen = prefix - 0xf7;\\n\\n require(\\n _in.length > lenOfListLen,\\n \\\"Invalid RLP long list length.\\\"\\n );\\n\\n uint256 listLen;\\n assembly {\\n // Pick out the list length.\\n listLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfListLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfListLen + listLen,\\n \\\"Invalid RLP long list.\\\"\\n );\\n\\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\\n }\\n }\\n\\n /**\\n * Copies the bytes from a memory location.\\n * @param _src Pointer to the location to read from.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Copied bytes.\\n */\\n function _copy(\\n uint256 _src,\\n uint256 _offset,\\n uint256 _length\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out = new bytes(_length);\\n if (out.length == 0) {\\n return out;\\n }\\n\\n uint256 src = _src + _offset;\\n uint256 dest;\\n assembly {\\n dest := add(out, 32)\\n }\\n\\n // Copy over as many complete words as we can.\\n for (uint256 i = 0; i < _length / 32; i++) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n\\n src += 32;\\n dest += 32;\\n }\\n\\n // Pick out the remaining bytes.\\n uint256 mask = 256 ** (32 - (_length % 32)) - 1;\\n assembly {\\n mstore(\\n dest,\\n or(\\n and(mload(src), not(mask)),\\n and(mload(dest), mask)\\n )\\n )\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Copies an RLP item into bytes.\\n * @param _in RLP item to copy.\\n * @return Copied bytes.\\n */\\n function _copy(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in.ptr, 0, _in.length);\\n }\\n}\\n\",\"keccak256\":\"0xbdb8fae0ca2483b4cc07607a5070fc25e33c54b4e4462b99e7c0b13aac48a09b\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPWriter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\n\\n/**\\n * @title Lib_RLPWriter\\n * @author Bakaoh (with modifications)\\n */\\nlibrary Lib_RLPWriter {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * RLP encodes a byte string.\\n * @param _in The byte string to encode.\\n * @return _out The RLP encoded string in bytes.\\n */\\n function writeBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n bytes memory encoded;\\n\\n if (_in.length == 1 && uint8(_in[0]) < 128) {\\n encoded = _in;\\n } else {\\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * RLP encodes a list of RLP encoded byte byte strings.\\n * @param _in The list of RLP encoded byte strings.\\n * @return _out The RLP encoded list of items in bytes.\\n */\\n function writeList(\\n bytes[] memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n bytes memory list = _flatten(_in);\\n return abi.encodePacked(_writeLength(list.length, 192), list);\\n }\\n\\n /**\\n * RLP encodes a string.\\n * @param _in The string to encode.\\n * @return _out The RLP encoded string in bytes.\\n */\\n function writeString(\\n string memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(bytes(_in));\\n }\\n\\n /**\\n * RLP encodes an address.\\n * @param _in The address to encode.\\n * @return _out The RLP encoded address in bytes.\\n */\\n function writeAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a uint.\\n * @param _in The uint256 to encode.\\n * @return _out The RLP encoded uint256 in bytes.\\n */\\n function writeUint(\\n uint256 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(_toBinary(_in));\\n }\\n\\n /**\\n * RLP encodes a bool.\\n * @param _in The bool to encode.\\n * @return _out The RLP encoded bool in bytes.\\n */\\n function writeBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n bytes memory encoded = new bytes(1);\\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\\n return encoded;\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\\n * @param _len The length of the string or the payload.\\n * @param _offset 128 if item is string, 192 if item is list.\\n * @return _encoded RLP encoded bytes.\\n */\\n function _writeLength(\\n uint256 _len,\\n uint256 _offset\\n )\\n private\\n pure\\n returns (\\n bytes memory _encoded\\n )\\n {\\n bytes memory encoded;\\n\\n if (_len < 56) {\\n encoded = new bytes(1);\\n encoded[0] = byte(uint8(_len) + uint8(_offset));\\n } else {\\n uint256 lenLen;\\n uint256 i = 1;\\n while (_len / i != 0) {\\n lenLen++;\\n i *= 256;\\n }\\n\\n encoded = new bytes(lenLen + 1);\\n encoded[0] = byte(uint8(lenLen) + uint8(_offset) + 55);\\n for(i = 1; i <= lenLen; i++) {\\n encoded[i] = byte(uint8((_len / (256**(lenLen-i))) % 256));\\n }\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * Encode integer in big endian binary form with no leading zeroes.\\n * @notice TODO: This should be optimized with assembly to save gas costs.\\n * @param _x The integer to encode.\\n * @return _binary RLP encoded bytes.\\n */\\n function _toBinary(\\n uint256 _x\\n )\\n private\\n pure\\n returns (\\n bytes memory _binary\\n )\\n {\\n bytes memory b = abi.encodePacked(_x);\\n\\n uint256 i = 0;\\n for (; i < 32; i++) {\\n if (b[i] != 0) {\\n break;\\n }\\n }\\n\\n bytes memory res = new bytes(32 - i);\\n for (uint256 j = 0; j < res.length; j++) {\\n res[j] = b[i++];\\n }\\n\\n return res;\\n }\\n\\n /**\\n * Copies a piece of memory to another location.\\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\\n * @param _dest Destination location.\\n * @param _src Source location.\\n * @param _len Length of memory to copy.\\n */\\n function _memcpy(\\n uint256 _dest,\\n uint256 _src,\\n uint256 _len\\n )\\n private\\n pure\\n {\\n uint256 dest = _dest;\\n uint256 src = _src;\\n uint256 len = _len;\\n\\n for(; len >= 32; len -= 32) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n dest += 32;\\n src += 32;\\n }\\n\\n uint256 mask = 256 ** (32 - len) - 1;\\n assembly {\\n let srcpart := and(mload(src), not(mask))\\n let destpart := and(mload(dest), mask)\\n mstore(dest, or(destpart, srcpart))\\n }\\n }\\n\\n /**\\n * Flattens a list of byte strings into one byte string.\\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\\n * @param _list List of byte strings to flatten.\\n * @return _flattened The flattened byte string.\\n */\\n function _flatten(\\n bytes[] memory _list\\n )\\n private\\n pure\\n returns (\\n bytes memory _flattened\\n )\\n {\\n if (_list.length == 0) {\\n return new bytes(0);\\n }\\n\\n uint256 len;\\n uint256 i = 0;\\n for (; i < _list.length; i++) {\\n len += _list[i].length;\\n }\\n\\n bytes memory flattened = new bytes(len);\\n uint256 flattenedPtr;\\n assembly { flattenedPtr := add(flattened, 0x20) }\\n\\n for(i = 0; i < _list.length; i++) {\\n bytes memory item = _list[i];\\n\\n uint256 listPtr;\\n assembly { listPtr := add(item, 0x20)}\\n\\n _memcpy(flattenedPtr, listPtr, item.length);\\n flattenedPtr += _list[i].length;\\n }\\n\\n return flattened;\\n }\\n}\",\"keccak256\":\"0xbcb24619c1758cb0d9f3fe5c79495950045a9087046a02b9ce01df46ae09ae5b\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/trie/Lib_MerkleTrie.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\n\\n/**\\n * @title Lib_MerkleTrie\\n */\\nlibrary Lib_MerkleTrie {\\n\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n enum NodeType {\\n BranchNode,\\n ExtensionNode,\\n LeafNode\\n }\\n\\n struct TrieNode {\\n bytes encoded;\\n Lib_RLPReader.RLPItem[] decoded;\\n }\\n\\n\\n /**********************\\n * Contract Constants *\\n **********************/\\n\\n // TREE_RADIX determines the number of elements per branch node.\\n uint256 constant TREE_RADIX = 16;\\n // Branch nodes have TREE_RADIX elements plus an additional `value` slot.\\n uint256 constant BRANCH_NODE_LENGTH = TREE_RADIX + 1;\\n // Leaf nodes and extension nodes always have two elements, a `path` and a `value`.\\n uint256 constant LEAF_OR_EXTENSION_NODE_LENGTH = 2;\\n\\n // Prefixes are prepended to the `path` within a leaf or extension node and\\n // allow us to differentiate between the two node types. `ODD` or `EVEN` is\\n // determined by the number of nibbles within the unprefixed `path`. If the\\n // number of nibbles if even, we need to insert an extra padding nibble so\\n // the resulting prefixed `path` has an even number of nibbles.\\n uint8 constant PREFIX_EXTENSION_EVEN = 0;\\n uint8 constant PREFIX_EXTENSION_ODD = 1;\\n uint8 constant PREFIX_LEAF_EVEN = 2;\\n uint8 constant PREFIX_LEAF_ODD = 3;\\n\\n // Just a utility constant. RLP represents `NULL` as 0x80.\\n bytes1 constant RLP_NULL = bytes1(0x80);\\n bytes constant RLP_NULL_BYTES = hex'80';\\n bytes32 constant internal KECCAK256_RLP_NULL_BYTES = keccak256(RLP_NULL_BYTES);\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * @notice Verifies a proof that a given key/value pair is present in the\\n * Merkle trie.\\n * @param _key Key of the node to search for, as a hex string.\\n * @param _value Value of the node to search for, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the desired node. Unlike\\n * traditional Merkle trees, this proof is executed top-down and consists\\n * of a list of RLP-encoded nodes that make a path down to the target node.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _verified `true` if the k/v pair exists in the trie, `false` otherwise.\\n */\\n function verifyInclusionProof(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bool _verified\\n )\\n {\\n (\\n bool exists,\\n bytes memory value\\n ) = get(_key, _proof, _root);\\n\\n return (\\n exists && Lib_BytesUtils.equal(_value, value)\\n );\\n }\\n\\n /**\\n * @notice Verifies a proof that a given key is *not* present in\\n * the Merkle trie.\\n * @param _key Key of the node to search for, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\\n * target node.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _verified `true` if the key is absent in the trie, `false` otherwise.\\n */\\n function verifyExclusionProof(\\n bytes memory _key,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bool _verified\\n )\\n {\\n (\\n bool exists,\\n ) = get(_key, _proof, _root);\\n\\n return exists == false;\\n }\\n\\n /**\\n * @notice Updates a Merkle trie and returns a new root hash.\\n * @param _key Key of the node to update, as a hex string.\\n * @param _value Value of the node to update, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\\n * target node. If the key exists, we can simply update the value.\\n * Otherwise, we need to modify the trie to handle the new k/v pair.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _updatedRoot Root hash of the newly constructed trie.\\n */\\n function update(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bytes32 _updatedRoot\\n )\\n {\\n // Special case when inserting the very first node.\\n if (_root == KECCAK256_RLP_NULL_BYTES) {\\n return getSingleNodeRootHash(_key, _value);\\n }\\n\\n TrieNode[] memory proof = _parseProof(_proof);\\n (uint256 pathLength, bytes memory keyRemainder, ) = _walkNodePath(proof, _key, _root);\\n TrieNode[] memory newPath = _getNewPath(proof, pathLength, keyRemainder, _value);\\n\\n return _getUpdatedTrieRoot(newPath, _key);\\n }\\n\\n /**\\n * @notice Retrieves the value associated with a given key.\\n * @param _key Key to search for, as hex bytes.\\n * @param _proof Merkle trie inclusion proof for the key.\\n * @param _root Known root of the Merkle trie.\\n * @return _exists Whether or not the key exists.\\n * @return _value Value of the key if it exists.\\n */\\n function get(\\n bytes memory _key,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bool _exists,\\n bytes memory _value\\n )\\n {\\n TrieNode[] memory proof = _parseProof(_proof);\\n (uint256 pathLength, bytes memory keyRemainder, bool isFinalNode) = _walkNodePath(proof, _key, _root);\\n\\n bool exists = keyRemainder.length == 0;\\n\\n require(\\n exists || isFinalNode,\\n \\\"Provided proof is invalid.\\\"\\n );\\n\\n bytes memory value = exists ? _getNodeValue(proof[pathLength - 1]) : bytes('');\\n\\n return (\\n exists,\\n value\\n );\\n }\\n\\n /**\\n * Computes the root hash for a trie with a single node.\\n * @param _key Key for the single node.\\n * @param _value Value for the single node.\\n * @return _updatedRoot Hash of the trie.\\n */\\n function getSingleNodeRootHash(\\n bytes memory _key,\\n bytes memory _value\\n )\\n internal\\n pure\\n returns (\\n bytes32 _updatedRoot\\n )\\n {\\n return keccak256(_makeLeafNode(\\n Lib_BytesUtils.toNibbles(_key),\\n _value\\n ).encoded);\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * @notice Walks through a proof using a provided key.\\n * @param _proof Inclusion proof to walk through.\\n * @param _key Key to use for the walk.\\n * @param _root Known root of the trie.\\n * @return _pathLength Length of the final path\\n * @return _keyRemainder Portion of the key remaining after the walk.\\n * @return _isFinalNode Whether or not we've hit a dead end.\\n */\\n function _walkNodePath(\\n TrieNode[] memory _proof,\\n bytes memory _key,\\n bytes32 _root\\n )\\n private\\n pure\\n returns (\\n uint256 _pathLength,\\n bytes memory _keyRemainder,\\n bool _isFinalNode\\n )\\n {\\n uint256 pathLength = 0;\\n bytes memory key = Lib_BytesUtils.toNibbles(_key);\\n\\n bytes32 currentNodeID = _root;\\n uint256 currentKeyIndex = 0;\\n uint256 currentKeyIncrement = 0;\\n TrieNode memory currentNode;\\n\\n // Proof is top-down, so we start at the first element (root).\\n for (uint256 i = 0; i < _proof.length; i++) {\\n currentNode = _proof[i];\\n currentKeyIndex += currentKeyIncrement;\\n\\n // Keep track of the proof elements we actually need.\\n // It's expensive to resize arrays, so this simply reduces gas costs.\\n pathLength += 1;\\n\\n if (currentKeyIndex == 0) {\\n // First proof element is always the root node.\\n require(\\n keccak256(currentNode.encoded) == currentNodeID,\\n \\\"Invalid root hash\\\"\\n );\\n } else if (currentNode.encoded.length >= 32) {\\n // Nodes 32 bytes or larger are hashed inside branch nodes.\\n require(\\n keccak256(currentNode.encoded) == currentNodeID,\\n \\\"Invalid large internal hash\\\"\\n );\\n } else {\\n // Nodes smaller than 31 bytes aren't hashed.\\n require(\\n Lib_BytesUtils.toBytes32(currentNode.encoded) == currentNodeID,\\n \\\"Invalid internal node hash\\\"\\n );\\n }\\n\\n if (currentNode.decoded.length == BRANCH_NODE_LENGTH) {\\n if (currentKeyIndex == key.length) {\\n // We've hit the end of the key, meaning the value should be within this branch node.\\n break;\\n } else {\\n // We're not at the end of the key yet.\\n // Figure out what the next node ID should be and continue.\\n uint8 branchKey = uint8(key[currentKeyIndex]);\\n Lib_RLPReader.RLPItem memory nextNode = currentNode.decoded[branchKey];\\n currentNodeID = _getNodeID(nextNode);\\n currentKeyIncrement = 1;\\n continue;\\n }\\n } else if (currentNode.decoded.length == LEAF_OR_EXTENSION_NODE_LENGTH) {\\n bytes memory path = _getNodePath(currentNode);\\n uint8 prefix = uint8(path[0]);\\n uint8 offset = 2 - prefix % 2;\\n bytes memory pathRemainder = Lib_BytesUtils.slice(path, offset);\\n bytes memory keyRemainder = Lib_BytesUtils.slice(key, currentKeyIndex);\\n uint256 sharedNibbleLength = _getSharedNibbleLength(pathRemainder, keyRemainder);\\n\\n if (prefix == PREFIX_LEAF_EVEN || prefix == PREFIX_LEAF_ODD) {\\n if (\\n pathRemainder.length == sharedNibbleLength &&\\n keyRemainder.length == sharedNibbleLength\\n ) {\\n // The key within this leaf matches our key exactly.\\n // Increment the key index to reflect that we have no remainder.\\n currentKeyIndex += sharedNibbleLength;\\n }\\n\\n // We've hit a leaf node, so our next node should be NULL.\\n currentNodeID = bytes32(RLP_NULL);\\n break;\\n } else if (prefix == PREFIX_EXTENSION_EVEN || prefix == PREFIX_EXTENSION_ODD) {\\n if (sharedNibbleLength == 0) {\\n // Our extension node doesn't share any part of our key.\\n // We've hit the end of this path, updates will need to modify this extension.\\n currentNodeID = bytes32(RLP_NULL);\\n break;\\n } else {\\n // Our extension shares some nibbles.\\n // Carry on to the next node.\\n currentNodeID = _getNodeID(currentNode.decoded[1]);\\n currentKeyIncrement = sharedNibbleLength;\\n continue;\\n }\\n } else {\\n revert(\\\"Received a node with an unknown prefix\\\");\\n }\\n } else {\\n revert(\\\"Received an unparseable node.\\\");\\n }\\n }\\n\\n // If our node ID is NULL, then we're at a dead end.\\n bool isFinalNode = currentNodeID == bytes32(RLP_NULL);\\n return (pathLength, Lib_BytesUtils.slice(key, currentKeyIndex), isFinalNode);\\n }\\n\\n /**\\n * @notice Creates new nodes to support a k/v pair insertion into a given\\n * Merkle trie path.\\n * @param _path Path to the node nearest the k/v pair.\\n * @param _pathLength Length of the path. Necessary because the provided\\n * path may include additional nodes (e.g., it comes directly from a proof)\\n * and we can't resize in-memory arrays without costly duplication.\\n * @param _keyRemainder Portion of the initial key that must be inserted\\n * into the trie.\\n * @param _value Value to insert at the given key.\\n * @return _newPath A new path with the inserted k/v pair and extra supporting nodes.\\n */\\n function _getNewPath(\\n TrieNode[] memory _path,\\n uint256 _pathLength,\\n bytes memory _keyRemainder,\\n bytes memory _value\\n )\\n private\\n pure\\n returns (\\n TrieNode[] memory _newPath\\n )\\n {\\n bytes memory keyRemainder = _keyRemainder;\\n\\n // Most of our logic depends on the status of the last node in the path.\\n TrieNode memory lastNode = _path[_pathLength - 1];\\n NodeType lastNodeType = _getNodeType(lastNode);\\n\\n // Create an array for newly created nodes.\\n // We need up to three new nodes, depending on the contents of the last node.\\n // Since array resizing is expensive, we'll keep track of the size manually.\\n // We're using an explicit `totalNewNodes += 1` after insertions for clarity.\\n TrieNode[] memory newNodes = new TrieNode[](3);\\n uint256 totalNewNodes = 0;\\n\\n if (keyRemainder.length == 0 && lastNodeType == NodeType.LeafNode) {\\n // We've found a leaf node with the given key.\\n // Simply need to update the value of the node to match.\\n newNodes[totalNewNodes] = _makeLeafNode(_getNodeKey(lastNode), _value);\\n totalNewNodes += 1;\\n } else if (lastNodeType == NodeType.BranchNode) {\\n if (keyRemainder.length == 0) {\\n // We've found a branch node with the given key.\\n // Simply need to update the value of the node to match.\\n newNodes[totalNewNodes] = _editBranchValue(lastNode, _value);\\n totalNewNodes += 1;\\n } else {\\n // We've found a branch node, but it doesn't contain our key.\\n // Reinsert the old branch for now.\\n newNodes[totalNewNodes] = lastNode;\\n totalNewNodes += 1;\\n // Create a new leaf node, slicing our remainder since the first byte points\\n // to our branch node.\\n newNodes[totalNewNodes] = _makeLeafNode(Lib_BytesUtils.slice(keyRemainder, 1), _value);\\n totalNewNodes += 1;\\n }\\n } else {\\n // Our last node is either an extension node or a leaf node with a different key.\\n bytes memory lastNodeKey = _getNodeKey(lastNode);\\n uint256 sharedNibbleLength = _getSharedNibbleLength(lastNodeKey, keyRemainder);\\n\\n if (sharedNibbleLength != 0) {\\n // We've got some shared nibbles between the last node and our key remainder.\\n // We'll need to insert an extension node that covers these shared nibbles.\\n bytes memory nextNodeKey = Lib_BytesUtils.slice(lastNodeKey, 0, sharedNibbleLength);\\n newNodes[totalNewNodes] = _makeExtensionNode(nextNodeKey, _getNodeHash(_value));\\n totalNewNodes += 1;\\n\\n // Cut down the keys since we've just covered these shared nibbles.\\n lastNodeKey = Lib_BytesUtils.slice(lastNodeKey, sharedNibbleLength);\\n keyRemainder = Lib_BytesUtils.slice(keyRemainder, sharedNibbleLength);\\n }\\n\\n // Create an empty branch to fill in.\\n TrieNode memory newBranch = _makeEmptyBranchNode();\\n\\n if (lastNodeKey.length == 0) {\\n // Key remainder was larger than the key for our last node.\\n // The value within our last node is therefore going to be shifted into\\n // a branch value slot.\\n newBranch = _editBranchValue(newBranch, _getNodeValue(lastNode));\\n } else {\\n // Last node key was larger than the key remainder.\\n // We're going to modify some index of our branch.\\n uint8 branchKey = uint8(lastNodeKey[0]);\\n // Move on to the next nibble.\\n lastNodeKey = Lib_BytesUtils.slice(lastNodeKey, 1);\\n\\n if (lastNodeType == NodeType.LeafNode) {\\n // We're dealing with a leaf node.\\n // We'll modify the key and insert the old leaf node into the branch index.\\n TrieNode memory modifiedLastNode = _makeLeafNode(lastNodeKey, _getNodeValue(lastNode));\\n newBranch = _editBranchIndex(newBranch, branchKey, _getNodeHash(modifiedLastNode.encoded));\\n } else if (lastNodeKey.length != 0) {\\n // We're dealing with a shrinking extension node.\\n // We need to modify the node to decrease the size of the key.\\n TrieNode memory modifiedLastNode = _makeExtensionNode(lastNodeKey, _getNodeValue(lastNode));\\n newBranch = _editBranchIndex(newBranch, branchKey, _getNodeHash(modifiedLastNode.encoded));\\n } else {\\n // We're dealing with an unnecessary extension node.\\n // We're going to delete the node entirely.\\n // Simply insert its current value into the branch index.\\n newBranch = _editBranchIndex(newBranch, branchKey, _getNodeValue(lastNode));\\n }\\n }\\n\\n if (keyRemainder.length == 0) {\\n // We've got nothing left in the key remainder.\\n // Simply insert the value into the branch value slot.\\n newBranch = _editBranchValue(newBranch, _value);\\n // Push the branch into the list of new nodes.\\n newNodes[totalNewNodes] = newBranch;\\n totalNewNodes += 1;\\n } else {\\n // We've got some key remainder to work with.\\n // We'll be inserting a leaf node into the trie.\\n // First, move on to the next nibble.\\n keyRemainder = Lib_BytesUtils.slice(keyRemainder, 1);\\n // Push the branch into the list of new nodes.\\n newNodes[totalNewNodes] = newBranch;\\n totalNewNodes += 1;\\n // Push a new leaf node for our k/v pair.\\n newNodes[totalNewNodes] = _makeLeafNode(keyRemainder, _value);\\n totalNewNodes += 1;\\n }\\n }\\n\\n // Finally, join the old path with our newly created nodes.\\n // Since we're overwriting the last node in the path, we use `_pathLength - 1`.\\n return _joinNodeArrays(_path, _pathLength - 1, newNodes, totalNewNodes);\\n }\\n\\n /**\\n * @notice Computes the trie root from a given path.\\n * @param _nodes Path to some k/v pair.\\n * @param _key Key for the k/v pair.\\n * @return _updatedRoot Root hash for the updated trie.\\n */\\n function _getUpdatedTrieRoot(\\n TrieNode[] memory _nodes,\\n bytes memory _key\\n )\\n private\\n pure\\n returns (\\n bytes32 _updatedRoot\\n )\\n {\\n bytes memory key = Lib_BytesUtils.toNibbles(_key);\\n\\n // Some variables to keep track of during iteration.\\n TrieNode memory currentNode;\\n NodeType currentNodeType;\\n bytes memory previousNodeHash;\\n\\n // Run through the path backwards to rebuild our root hash.\\n for (uint256 i = _nodes.length; i > 0; i--) {\\n // Pick out the current node.\\n currentNode = _nodes[i - 1];\\n currentNodeType = _getNodeType(currentNode);\\n\\n if (currentNodeType == NodeType.LeafNode) {\\n // Leaf nodes are already correctly encoded.\\n // Shift the key over to account for the nodes key.\\n bytes memory nodeKey = _getNodeKey(currentNode);\\n key = Lib_BytesUtils.slice(key, 0, key.length - nodeKey.length);\\n } else if (currentNodeType == NodeType.ExtensionNode) {\\n // Shift the key over to account for the nodes key.\\n bytes memory nodeKey = _getNodeKey(currentNode);\\n key = Lib_BytesUtils.slice(key, 0, key.length - nodeKey.length);\\n\\n // If this node is the last element in the path, it'll be correctly encoded\\n // and we can skip this part.\\n if (previousNodeHash.length > 0) {\\n // Re-encode the node based on the previous node.\\n currentNode = _makeExtensionNode(nodeKey, previousNodeHash);\\n }\\n } else if (currentNodeType == NodeType.BranchNode) {\\n // If this node is the last element in the path, it'll be correctly encoded\\n // and we can skip this part.\\n if (previousNodeHash.length > 0) {\\n // Re-encode the node based on the previous node.\\n uint8 branchKey = uint8(key[key.length - 1]);\\n key = Lib_BytesUtils.slice(key, 0, key.length - 1);\\n currentNode = _editBranchIndex(currentNode, branchKey, previousNodeHash);\\n }\\n }\\n\\n // Compute the node hash for the next iteration.\\n previousNodeHash = _getNodeHash(currentNode.encoded);\\n }\\n\\n // Current node should be the root at this point.\\n // Simply return the hash of its encoding.\\n return keccak256(currentNode.encoded);\\n }\\n\\n /**\\n * @notice Parses an RLP-encoded proof into something more useful.\\n * @param _proof RLP-encoded proof to parse.\\n * @return _parsed Proof parsed into easily accessible structs.\\n */\\n function _parseProof(\\n bytes memory _proof\\n )\\n private\\n pure\\n returns (\\n TrieNode[] memory _parsed\\n )\\n {\\n Lib_RLPReader.RLPItem[] memory nodes = Lib_RLPReader.readList(_proof);\\n TrieNode[] memory proof = new TrieNode[](nodes.length);\\n\\n for (uint256 i = 0; i < nodes.length; i++) {\\n bytes memory encoded = Lib_RLPReader.readBytes(nodes[i]);\\n proof[i] = TrieNode({\\n encoded: encoded,\\n decoded: Lib_RLPReader.readList(encoded)\\n });\\n }\\n\\n return proof;\\n }\\n\\n /**\\n * @notice Picks out the ID for a node. Node ID is referred to as the\\n * \\\"hash\\\" within the specification, but nodes < 32 bytes are not actually\\n * hashed.\\n * @param _node Node to pull an ID for.\\n * @return _nodeID ID for the node, depending on the size of its contents.\\n */\\n function _getNodeID(\\n Lib_RLPReader.RLPItem memory _node\\n )\\n private\\n pure\\n returns (\\n bytes32 _nodeID\\n )\\n {\\n bytes memory nodeID;\\n\\n if (_node.length < 32) {\\n // Nodes smaller than 32 bytes are RLP encoded.\\n nodeID = Lib_RLPReader.readRawBytes(_node);\\n } else {\\n // Nodes 32 bytes or larger are hashed.\\n nodeID = Lib_RLPReader.readBytes(_node);\\n }\\n\\n return Lib_BytesUtils.toBytes32(nodeID);\\n }\\n\\n /**\\n * @notice Gets the path for a leaf or extension node.\\n * @param _node Node to get a path for.\\n * @return _path Node path, converted to an array of nibbles.\\n */\\n function _getNodePath(\\n TrieNode memory _node\\n )\\n private\\n pure\\n returns (\\n bytes memory _path\\n )\\n {\\n return Lib_BytesUtils.toNibbles(Lib_RLPReader.readBytes(_node.decoded[0]));\\n }\\n\\n /**\\n * @notice Gets the key for a leaf or extension node. Keys are essentially\\n * just paths without any prefix.\\n * @param _node Node to get a key for.\\n * @return _key Node key, converted to an array of nibbles.\\n */\\n function _getNodeKey(\\n TrieNode memory _node\\n )\\n private\\n pure\\n returns (\\n bytes memory _key\\n )\\n {\\n return _removeHexPrefix(_getNodePath(_node));\\n }\\n\\n /**\\n * @notice Gets the path for a node.\\n * @param _node Node to get a value for.\\n * @return _value Node value, as hex bytes.\\n */\\n function _getNodeValue(\\n TrieNode memory _node\\n )\\n private\\n pure\\n returns (\\n bytes memory _value\\n )\\n {\\n return Lib_RLPReader.readBytes(_node.decoded[_node.decoded.length - 1]);\\n }\\n\\n /**\\n * @notice Computes the node hash for an encoded node. Nodes < 32 bytes\\n * are not hashed, all others are keccak256 hashed.\\n * @param _encoded Encoded node to hash.\\n * @return _hash Hash of the encoded node. Simply the input if < 32 bytes.\\n */\\n function _getNodeHash(\\n bytes memory _encoded\\n )\\n private\\n pure\\n returns (\\n bytes memory _hash\\n )\\n {\\n if (_encoded.length < 32) {\\n return _encoded;\\n } else {\\n return abi.encodePacked(keccak256(_encoded));\\n }\\n }\\n\\n /**\\n * @notice Determines the type for a given node.\\n * @param _node Node to determine a type for.\\n * @return _type Type of the node; BranchNode/ExtensionNode/LeafNode.\\n */\\n function _getNodeType(\\n TrieNode memory _node\\n )\\n private\\n pure\\n returns (\\n NodeType _type\\n )\\n {\\n if (_node.decoded.length == BRANCH_NODE_LENGTH) {\\n return NodeType.BranchNode;\\n } else if (_node.decoded.length == LEAF_OR_EXTENSION_NODE_LENGTH) {\\n bytes memory path = _getNodePath(_node);\\n uint8 prefix = uint8(path[0]);\\n\\n if (prefix == PREFIX_LEAF_EVEN || prefix == PREFIX_LEAF_ODD) {\\n return NodeType.LeafNode;\\n } else if (prefix == PREFIX_EXTENSION_EVEN || prefix == PREFIX_EXTENSION_ODD) {\\n return NodeType.ExtensionNode;\\n }\\n }\\n\\n revert(\\\"Invalid node type\\\");\\n }\\n\\n /**\\n * @notice Utility; determines the number of nibbles shared between two\\n * nibble arrays.\\n * @param _a First nibble array.\\n * @param _b Second nibble array.\\n * @return _shared Number of shared nibbles.\\n */\\n function _getSharedNibbleLength(\\n bytes memory _a,\\n bytes memory _b\\n )\\n private\\n pure\\n returns (\\n uint256 _shared\\n )\\n {\\n uint256 i = 0;\\n while (_a.length > i && _b.length > i && _a[i] == _b[i]) {\\n i++;\\n }\\n return i;\\n }\\n\\n /**\\n * @notice Utility; converts an RLP-encoded node into our nice struct.\\n * @param _raw RLP-encoded node to convert.\\n * @return _node Node as a TrieNode struct.\\n */\\n function _makeNode(\\n bytes[] memory _raw\\n )\\n private\\n pure\\n returns (\\n TrieNode memory _node\\n )\\n {\\n bytes memory encoded = Lib_RLPWriter.writeList(_raw);\\n\\n return TrieNode({\\n encoded: encoded,\\n decoded: Lib_RLPReader.readList(encoded)\\n });\\n }\\n\\n /**\\n * @notice Utility; converts an RLP-decoded node into our nice struct.\\n * @param _items RLP-decoded node to convert.\\n * @return _node Node as a TrieNode struct.\\n */\\n function _makeNode(\\n Lib_RLPReader.RLPItem[] memory _items\\n )\\n private\\n pure\\n returns (\\n TrieNode memory _node\\n )\\n {\\n bytes[] memory raw = new bytes[](_items.length);\\n for (uint256 i = 0; i < _items.length; i++) {\\n raw[i] = Lib_RLPReader.readRawBytes(_items[i]);\\n }\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Creates a new extension node.\\n * @param _key Key for the extension node, unprefixed.\\n * @param _value Value for the extension node.\\n * @return _node New extension node with the given k/v pair.\\n */\\n function _makeExtensionNode(\\n bytes memory _key,\\n bytes memory _value\\n )\\n private\\n pure\\n returns (\\n TrieNode memory _node\\n )\\n {\\n bytes[] memory raw = new bytes[](2);\\n bytes memory key = _addHexPrefix(_key, false);\\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\\n raw[1] = Lib_RLPWriter.writeBytes(_value);\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Creates a new leaf node.\\n * @dev This function is essentially identical to `_makeExtensionNode`.\\n * Although we could route both to a single method with a flag, it's\\n * more gas efficient to keep them separate and duplicate the logic.\\n * @param _key Key for the leaf node, unprefixed.\\n * @param _value Value for the leaf node.\\n * @return _node New leaf node with the given k/v pair.\\n */\\n function _makeLeafNode(\\n bytes memory _key,\\n bytes memory _value\\n )\\n private\\n pure\\n returns (\\n TrieNode memory _node\\n )\\n {\\n bytes[] memory raw = new bytes[](2);\\n bytes memory key = _addHexPrefix(_key, true);\\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\\n raw[1] = Lib_RLPWriter.writeBytes(_value);\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Creates an empty branch node.\\n * @return _node Empty branch node as a TrieNode struct.\\n */\\n function _makeEmptyBranchNode()\\n private\\n pure\\n returns (\\n TrieNode memory _node\\n )\\n {\\n bytes[] memory raw = new bytes[](BRANCH_NODE_LENGTH);\\n for (uint256 i = 0; i < raw.length; i++) {\\n raw[i] = RLP_NULL_BYTES;\\n }\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Modifies the value slot for a given branch.\\n * @param _branch Branch node to modify.\\n * @param _value Value to insert into the branch.\\n * @return _updatedNode Modified branch node.\\n */\\n function _editBranchValue(\\n TrieNode memory _branch,\\n bytes memory _value\\n )\\n private\\n pure\\n returns (\\n TrieNode memory _updatedNode\\n )\\n {\\n bytes memory encoded = Lib_RLPWriter.writeBytes(_value);\\n _branch.decoded[_branch.decoded.length - 1] = Lib_RLPReader.toRLPItem(encoded);\\n return _makeNode(_branch.decoded);\\n }\\n\\n /**\\n * @notice Modifies a slot at an index for a given branch.\\n * @param _branch Branch node to modify.\\n * @param _index Slot index to modify.\\n * @param _value Value to insert into the slot.\\n * @return _updatedNode Modified branch node.\\n */\\n function _editBranchIndex(\\n TrieNode memory _branch,\\n uint8 _index,\\n bytes memory _value\\n )\\n private\\n pure\\n returns (\\n TrieNode memory _updatedNode\\n )\\n {\\n bytes memory encoded = _value.length < 32 ? _value : Lib_RLPWriter.writeBytes(_value);\\n _branch.decoded[_index] = Lib_RLPReader.toRLPItem(encoded);\\n return _makeNode(_branch.decoded);\\n }\\n\\n /**\\n * @notice Utility; adds a prefix to a key.\\n * @param _key Key to prefix.\\n * @param _isLeaf Whether or not the key belongs to a leaf.\\n * @return _prefixedKey Prefixed key.\\n */\\n function _addHexPrefix(\\n bytes memory _key,\\n bool _isLeaf\\n )\\n private\\n pure\\n returns (\\n bytes memory _prefixedKey\\n )\\n {\\n uint8 prefix = _isLeaf ? uint8(0x02) : uint8(0x00);\\n uint8 offset = uint8(_key.length % 2);\\n bytes memory prefixed = new bytes(2 - offset);\\n prefixed[0] = bytes1(prefix + offset);\\n return abi.encodePacked(prefixed, _key);\\n }\\n\\n /**\\n * @notice Utility; removes a prefix from a path.\\n * @param _path Path to remove the prefix from.\\n * @return _unprefixedKey Unprefixed key.\\n */\\n function _removeHexPrefix(\\n bytes memory _path\\n )\\n private\\n pure\\n returns (\\n bytes memory _unprefixedKey\\n )\\n {\\n if (uint8(_path[0]) % 2 == 0) {\\n return Lib_BytesUtils.slice(_path, 2);\\n } else {\\n return Lib_BytesUtils.slice(_path, 1);\\n }\\n }\\n\\n /**\\n * @notice Utility; combines two node arrays. Array lengths are required\\n * because the actual lengths may be longer than the filled lengths.\\n * Array resizing is extremely costly and should be avoided.\\n * @param _a First array to join.\\n * @param _aLength Length of the first array.\\n * @param _b Second array to join.\\n * @param _bLength Length of the second array.\\n * @return _joined Combined node array.\\n */\\n function _joinNodeArrays(\\n TrieNode[] memory _a,\\n uint256 _aLength,\\n TrieNode[] memory _b,\\n uint256 _bLength\\n )\\n private\\n pure\\n returns (\\n TrieNode[] memory _joined\\n )\\n {\\n TrieNode[] memory ret = new TrieNode[](_aLength + _bLength);\\n\\n // Copy elements from the first array.\\n for (uint256 i = 0; i < _aLength; i++) {\\n ret[i] = _a[i];\\n }\\n\\n // Copy elements from the second array.\\n for (uint256 i = 0; i < _bLength; i++) {\\n ret[i + _aLength] = _b[i];\\n }\\n\\n return ret;\\n }\\n}\\n\",\"keccak256\":\"0x161f65220b8c5cf295232f8c58c2744fbc898bf77da5f9d9c5b2dd673dafc6f6\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/trie/Lib_SecureMerkleTrie.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_MerkleTrie } from \\\"./Lib_MerkleTrie.sol\\\";\\n\\n/**\\n * @title Lib_SecureMerkleTrie\\n */\\nlibrary Lib_SecureMerkleTrie {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * @notice Verifies a proof that a given key/value pair is present in the\\n * Merkle trie.\\n * @param _key Key of the node to search for, as a hex string.\\n * @param _value Value of the node to search for, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the desired node. Unlike\\n * traditional Merkle trees, this proof is executed top-down and consists\\n * of a list of RLP-encoded nodes that make a path down to the target node.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _verified `true` if the k/v pair exists in the trie, `false` otherwise.\\n */\\n function verifyInclusionProof(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bool _verified\\n )\\n {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.verifyInclusionProof(key, _value, _proof, _root);\\n }\\n\\n /**\\n * @notice Verifies a proof that a given key is *not* present in\\n * the Merkle trie.\\n * @param _key Key of the node to search for, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\\n * target node.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _verified `true` if the key is not present in the trie, `false` otherwise.\\n */\\n function verifyExclusionProof(\\n bytes memory _key,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bool _verified\\n )\\n {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.verifyExclusionProof(key, _proof, _root);\\n }\\n\\n /**\\n * @notice Updates a Merkle trie and returns a new root hash.\\n * @param _key Key of the node to update, as a hex string.\\n * @param _value Value of the node to update, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\\n * target node. If the key exists, we can simply update the value.\\n * Otherwise, we need to modify the trie to handle the new k/v pair.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _updatedRoot Root hash of the newly constructed trie.\\n */\\n function update(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bytes32 _updatedRoot\\n )\\n {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.update(key, _value, _proof, _root);\\n }\\n\\n /**\\n * @notice Retrieves the value associated with a given key.\\n * @param _key Key to search for, as hex bytes.\\n * @param _proof Merkle trie inclusion proof for the key.\\n * @param _root Known root of the Merkle trie.\\n * @return _exists Whether or not the key exists.\\n * @return _value Value of the key if it exists.\\n */\\n function get(\\n bytes memory _key,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bool _exists,\\n bytes memory _value\\n )\\n {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.get(key, _proof, _root);\\n }\\n\\n /**\\n * Computes the root hash for a trie with a single node.\\n * @param _key Key for the single node.\\n * @param _value Value for the single node.\\n * @return _updatedRoot Hash of the trie.\\n */\\n function getSingleNodeRootHash(\\n bytes memory _key,\\n bytes memory _value\\n )\\n internal\\n pure\\n returns (\\n bytes32 _updatedRoot\\n )\\n {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.getSingleNodeRootHash(key, _value);\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Computes the secure counterpart to a key.\\n * @param _key Key to get a secure key from.\\n * @return _secureKey Secure version of the key.\\n */\\n function _getSecureKey(\\n bytes memory _key\\n )\\n private\\n pure\\n returns (\\n bytes memory _secureKey\\n )\\n {\\n return abi.encodePacked(keccak256(_key));\\n }\\n}\",\"keccak256\":\"0x79355346f74bb1eb9eeb733cb5d9677d50115c4f390307cbf608fe071a1ada0c\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_Bytes32Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_Byte32Utils\\n */\\nlibrary Lib_Bytes32Utils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \\\"true.\\\"\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as a boolean.\\n */\\n function toBool(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return _in != 0;\\n }\\n\\n /**\\n * Converts a boolean to a bytes32 value.\\n * @param _in Input boolean value.\\n * @return Boolean as a bytes32.\\n */\\n function fromBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in ? 1 : 0));\\n }\\n\\n /**\\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as an address.\\n */\\n function toAddress(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return address(uint160(uint256(_in)));\\n }\\n\\n /**\\n * Converts an address to a bytes32.\\n * @param _in Input address value.\\n * @return Address as a bytes32.\\n */\\n function fromAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in));\\n }\\n\\n /**\\n * Removes the leading zeros from a bytes32 value and returns a new (smaller) bytes value.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 without any leading zeros.\\n */\\n function removeLeadingZeros(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out;\\n\\n assembly {\\n // Figure out how many leading zero bytes to remove.\\n let shift := 0\\n for { let i := 0 } and(lt(i, 32), eq(byte(i, _in), 0)) { i := add(i, 1) } {\\n shift := add(shift, 1)\\n }\\n\\n // Reserve some space for our output and fix the free memory pointer.\\n out := mload(0x40)\\n mstore(0x40, add(out, 0x40))\\n\\n // Shift the value and store it into the output bytes.\\n mstore(add(out, 0x20), shl(mul(shift, 8), _in))\\n\\n // Store the new size (with leading zero bytes removed) in the output byte size.\\n mstore(out, sub(32, shift))\\n }\\n\\n return out;\\n }\\n}\\n\",\"keccak256\":\"0xfa2def593e3fc56a31852c3744aefdaa93cec74e721bfcfeb1e5d166c7c60b64\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_BytesUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_BytesUtils\\n */\\nlibrary Lib_BytesUtils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_start + _length >= _start, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n if (_bytes.length - _start == 0) {\\n return bytes('');\\n }\\n\\n return slice(_bytes, _start, _bytes.length - _start);\\n }\\n\\n function toBytes32PadLeft(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes32)\\n {\\n bytes32 ret;\\n uint256 len = _bytes.length <= 32 ? _bytes.length : 32;\\n assembly {\\n ret := shr(mul(sub(32, len), 8), mload(add(_bytes, 32)))\\n }\\n return ret;\\n }\\n\\n function toBytes32(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes32)\\n {\\n if (_bytes.length < 32) {\\n bytes32 ret;\\n assembly {\\n ret := mload(add(_bytes, 32))\\n }\\n return ret;\\n }\\n\\n return abi.decode(_bytes,(bytes32)); // will truncate if input length > 32 bytes\\n }\\n\\n function toUint256(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (uint256)\\n {\\n return uint256(toBytes32(_bytes));\\n }\\n\\n function toUint24(bytes memory _bytes, uint256 _start) internal pure returns (uint24) {\\n require(_start + 3 >= _start, \\\"toUint24_overflow\\\");\\n require(_bytes.length >= _start + 3 , \\\"toUint24_outOfBounds\\\");\\n uint24 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x3), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toUint8(bytes memory _bytes, uint256 _start) internal pure returns (uint8) {\\n require(_start + 1 >= _start, \\\"toUint8_overflow\\\");\\n require(_bytes.length >= _start + 1 , \\\"toUint8_outOfBounds\\\");\\n uint8 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x1), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toAddress(bytes memory _bytes, uint256 _start) internal pure returns (address) {\\n require(_start + 20 >= _start, \\\"toAddress_overflow\\\");\\n require(_bytes.length >= _start + 20, \\\"toAddress_outOfBounds\\\");\\n address tempAddress;\\n\\n assembly {\\n tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000)\\n }\\n\\n return tempAddress;\\n }\\n\\n function toNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n bytes memory nibbles = new bytes(_bytes.length * 2);\\n\\n for (uint256 i = 0; i < _bytes.length; i++) {\\n nibbles[i * 2] = _bytes[i] >> 4;\\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\\n }\\n\\n return nibbles;\\n }\\n\\n function fromNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n bytes memory ret = new bytes(_bytes.length / 2);\\n\\n for (uint256 i = 0; i < ret.length; i++) {\\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\\n }\\n\\n return ret;\\n }\\n\\n function equal(\\n bytes memory _bytes,\\n bytes memory _other\\n )\\n internal\\n pure\\n returns (bool)\\n {\\n return keccak256(_bytes) == keccak256(_other);\\n }\\n}\\n\",\"keccak256\":\"0x0adf22e1b22ba09911e859f64cb3b484e992be4f9fd3b09088e6225bf8d06ce0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_ErrorUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/**\\n * @title Lib_ErrorUtils\\n */\\nlibrary Lib_ErrorUtils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Encodes an error string into raw solidity-style revert data.\\n * (i.e. ascii bytes, prefixed with bytes4(keccak(\\\"Error(string))\\\"))\\n * Ref: https://docs.soliditylang.org/en/v0.8.2/control-structures.html?highlight=Error(string)#panic-via-assert-and-error-via-require\\n * @param _reason Reason for the reversion.\\n * @return Standard solidity revert data for the given reason.\\n */\\n function encodeRevertString(\\n string memory _reason\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return abi.encodeWithSignature(\\n \\\"Error(string)\\\",\\n _reason\\n );\\n }\\n}\\n\",\"keccak256\":\"0xfc64ec4a81fb50865b502a0004ed154e8598e1a313db77303fc95e41f536e6b7\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_EthUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// @unsupported: ovm\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"./Lib_Bytes32Utils.sol\\\";\\n\\n/**\\n * @title Lib_EthUtils\\n */\\nlibrary Lib_EthUtils {\\n\\n /***********************************\\n * Internal Functions: Code Access *\\n ***********************************/\\n\\n /**\\n * Gets the code for a given address.\\n * @param _address Address to get code for.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return _code Code read from the contract.\\n */\\n function getCode(\\n address _address,\\n uint256 _offset,\\n uint256 _length\\n )\\n internal\\n view\\n returns (\\n bytes memory _code\\n )\\n {\\n assembly {\\n _code := mload(0x40)\\n mstore(0x40, add(_code, add(_length, 0x20)))\\n mstore(_code, _length)\\n extcodecopy(_address, add(_code, 0x20), _offset, _length)\\n }\\n\\n return _code;\\n }\\n\\n /**\\n * Gets the full code for a given address.\\n * @param _address Address to get code for.\\n * @return _code Full code of the contract.\\n */\\n function getCode(\\n address _address\\n )\\n internal\\n view\\n returns (\\n bytes memory _code\\n )\\n {\\n return getCode(\\n _address,\\n 0,\\n getCodeSize(_address)\\n );\\n }\\n\\n /**\\n * Gets the size of a contract's code in bytes.\\n * @param _address Address to get code size for.\\n * @return _codeSize Size of the contract's code in bytes.\\n */\\n function getCodeSize(\\n address _address\\n )\\n internal\\n view\\n returns (\\n uint256 _codeSize\\n )\\n {\\n assembly {\\n _codeSize := extcodesize(_address)\\n }\\n\\n return _codeSize;\\n }\\n\\n /**\\n * Gets the hash of a contract's code.\\n * @param _address Address to get a code hash for.\\n * @return _codeHash Hash of the contract's code.\\n */\\n function getCodeHash(\\n address _address\\n )\\n internal\\n view\\n returns (\\n bytes32 _codeHash\\n )\\n {\\n assembly {\\n _codeHash := extcodehash(_address)\\n }\\n\\n return _codeHash;\\n }\\n\\n\\n /*****************************************\\n * Internal Functions: Contract Creation *\\n *****************************************/\\n\\n /**\\n * Creates a contract with some given initialization code.\\n * @param _code Contract initialization code.\\n * @return _created Address of the created contract.\\n */\\n function createContract(\\n bytes memory _code\\n )\\n internal\\n returns (\\n address _created\\n )\\n {\\n assembly {\\n _created := create(\\n 0,\\n add(_code, 0x20),\\n mload(_code)\\n )\\n }\\n\\n return _created;\\n }\\n\\n /**\\n * Computes the address that would be generated by CREATE.\\n * @param _creator Address creating the contract.\\n * @param _nonce Creator's nonce.\\n * @return _address Address to be generated by CREATE.\\n */\\n function getAddressForCREATE(\\n address _creator,\\n uint256 _nonce\\n )\\n internal\\n pure\\n returns (\\n address _address\\n )\\n {\\n bytes[] memory encoded = new bytes[](2);\\n encoded[0] = Lib_RLPWriter.writeAddress(_creator);\\n encoded[1] = Lib_RLPWriter.writeUint(_nonce);\\n\\n bytes memory encodedList = Lib_RLPWriter.writeList(encoded);\\n return Lib_Bytes32Utils.toAddress(keccak256(encodedList));\\n }\\n\\n /**\\n * Computes the address that would be generated by CREATE2.\\n * @param _creator Address creating the contract.\\n * @param _bytecode Bytecode of the contract to be created.\\n * @param _salt 32 byte salt value mixed into the hash.\\n * @return _address Address to be generated by CREATE2.\\n */\\n function getAddressForCREATE2(\\n address _creator,\\n bytes memory _bytecode,\\n bytes32 _salt\\n )\\n internal\\n pure\\n returns (address _address)\\n {\\n bytes32 hashedData = keccak256(abi.encodePacked(\\n byte(0xff),\\n _creator,\\n _salt,\\n keccak256(_bytecode)\\n ));\\n\\n return Lib_Bytes32Utils.toAddress(hashedData);\\n }\\n}\\n\",\"keccak256\":\"0x5fdf009da11f90cb5e99e5cd160d07bb744a5a2055774a646bdf277ad6910595\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_ErrorUtils } from \\\"../utils/Lib_ErrorUtils.sol\\\";\\n\\n/**\\n * @title Lib_SafeExecutionManagerWrapper\\n * @dev The Safe Execution Manager Wrapper provides functions which facilitate writing OVM safe \\n * code using the standard solidity compiler, by routing all its operations through the Execution \\n * Manager.\\n * \\n * Compiler used: solc\\n * Runtime target: OVM\\n */\\nlibrary Lib_SafeExecutionManagerWrapper {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Performs a safe ovmCALL.\\n * @param _gasLimit Gas limit for the call.\\n * @param _target Address to call.\\n * @param _calldata Data to send to the call.\\n * @return _success Whether or not the call reverted.\\n * @return _returndata Data returned by the call.\\n */\\n function safeCALL(\\n uint256 _gasLimit,\\n address _target,\\n bytes memory _calldata\\n )\\n internal\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCALL(uint256,address,bytes)\\\",\\n _gasLimit,\\n _target,\\n _calldata\\n )\\n );\\n\\n return abi.decode(returndata, (bool, bytes));\\n }\\n\\n /**\\n * Performs a safe ovmDELEGATECALL.\\n * @param _gasLimit Gas limit for the call.\\n * @param _target Address to call.\\n * @param _calldata Data to send to the call.\\n * @return _success Whether or not the call reverted.\\n * @return _returndata Data returned by the call.\\n */\\n function safeDELEGATECALL(\\n uint256 _gasLimit,\\n address _target,\\n bytes memory _calldata\\n )\\n internal\\n returns (\\n bool _success,\\n bytes memory _returndata\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmDELEGATECALL(uint256,address,bytes)\\\",\\n _gasLimit,\\n _target,\\n _calldata\\n )\\n );\\n\\n return abi.decode(returndata, (bool, bytes));\\n }\\n\\n /**\\n * Performs a safe ovmCREATE call.\\n * @param _gasLimit Gas limit for the creation.\\n * @param _bytecode Code for the new contract.\\n * @return _contract Address of the created contract.\\n */\\n function safeCREATE(\\n uint256 _gasLimit,\\n bytes memory _bytecode\\n )\\n internal\\n returns (\\n address,\\n bytes memory\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n _gasLimit,\\n abi.encodeWithSignature(\\n \\\"ovmCREATE(bytes)\\\",\\n _bytecode\\n )\\n );\\n\\n return abi.decode(returndata, (address, bytes));\\n }\\n\\n /**\\n * Performs a safe ovmEXTCODESIZE call.\\n * @param _contract Address of the contract to query the size of.\\n * @return _EXTCODESIZE Size of the requested contract in bytes.\\n */\\n function safeEXTCODESIZE(\\n address _contract\\n )\\n internal\\n returns (\\n uint256 _EXTCODESIZE\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmEXTCODESIZE(address)\\\",\\n _contract\\n )\\n );\\n\\n return abi.decode(returndata, (uint256));\\n }\\n\\n /**\\n * Performs a safe ovmCHAINID call.\\n * @return _CHAINID Result of calling ovmCHAINID.\\n */\\n function safeCHAINID()\\n internal\\n returns (\\n uint256 _CHAINID\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCHAINID()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (uint256));\\n }\\n\\n /**\\n * Performs a safe ovmCALLER call.\\n * @return _CALLER Result of calling ovmCALLER.\\n */\\n function safeCALLER()\\n internal\\n returns (\\n address _CALLER\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCALLER()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (address));\\n }\\n\\n /**\\n * Performs a safe ovmADDRESS call.\\n * @return _ADDRESS Result of calling ovmADDRESS.\\n */\\n function safeADDRESS()\\n internal\\n returns (\\n address _ADDRESS\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmADDRESS()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (address));\\n }\\n\\n /**\\n * Performs a safe ovmGETNONCE call.\\n * @return _nonce Result of calling ovmGETNONCE.\\n */\\n function safeGETNONCE()\\n internal\\n returns (\\n uint256 _nonce\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmGETNONCE()\\\"\\n )\\n );\\n\\n return abi.decode(returndata, (uint256));\\n }\\n\\n /**\\n * Performs a safe ovmINCREMENTNONCE call.\\n */\\n function safeINCREMENTNONCE()\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmINCREMENTNONCE()\\\"\\n )\\n );\\n }\\n\\n /**\\n * Performs a safe ovmCREATEEOA call.\\n * @param _messageHash Message hash which was signed by EOA\\n * @param _v v value of signature (0 or 1)\\n * @param _r r value of signature\\n * @param _s s value of signature\\n */\\n function safeCREATEEOA(\\n bytes32 _messageHash,\\n uint8 _v,\\n bytes32 _r,\\n bytes32 _s\\n )\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmCREATEEOA(bytes32,uint8,bytes32,bytes32)\\\",\\n _messageHash,\\n _v,\\n _r,\\n _s\\n )\\n );\\n }\\n\\n /**\\n * Performs a safe REVERT.\\n * @param _reason String revert reason to pass along with the REVERT.\\n */\\n function safeREVERT(\\n string memory _reason\\n )\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmREVERT(bytes)\\\",\\n Lib_ErrorUtils.encodeRevertString(\\n _reason\\n )\\n )\\n );\\n }\\n\\n /**\\n * Performs a safe \\\"require\\\".\\n * @param _condition Boolean condition that must be true or will revert.\\n * @param _reason String revert reason to pass along with the REVERT.\\n */\\n function safeREQUIRE(\\n bool _condition,\\n string memory _reason\\n )\\n internal\\n {\\n if (!_condition) {\\n safeREVERT(\\n _reason\\n );\\n }\\n }\\n\\n /**\\n * Performs a safe ovmSLOAD call.\\n */\\n function safeSLOAD(\\n bytes32 _key\\n )\\n internal\\n returns (\\n bytes32\\n )\\n {\\n bytes memory returndata = _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmSLOAD(bytes32)\\\",\\n _key\\n )\\n );\\n\\n return abi.decode(returndata, (bytes32));\\n }\\n\\n /**\\n * Performs a safe ovmSSTORE call.\\n */\\n function safeSSTORE(\\n bytes32 _key,\\n bytes32 _value\\n )\\n internal\\n {\\n _safeExecutionManagerInteraction(\\n abi.encodeWithSignature(\\n \\\"ovmSSTORE(bytes32,bytes32)\\\",\\n _key,\\n _value\\n )\\n );\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Performs an ovm interaction and the necessary safety checks.\\n * @param _gasLimit Gas limit for the interaction.\\n * @param _calldata Data to send to the OVM_ExecutionManager (encoded with sighash).\\n * @return _returndata Data sent back by the OVM_ExecutionManager.\\n */\\n function _safeExecutionManagerInteraction(\\n uint256 _gasLimit,\\n bytes memory _calldata\\n )\\n private\\n returns (\\n bytes memory _returndata\\n )\\n {\\n address ovmExecutionManager = msg.sender;\\n (\\n bool success,\\n bytes memory returndata\\n ) = ovmExecutionManager.call{gas: _gasLimit}(_calldata);\\n\\n if (success == false) {\\n assembly {\\n revert(add(returndata, 0x20), mload(returndata))\\n }\\n } else if (returndata.length == 1) {\\n assembly {\\n return(0, 1)\\n }\\n } else {\\n return returndata;\\n }\\n }\\n\\n function _safeExecutionManagerInteraction(\\n bytes memory _calldata\\n )\\n private\\n returns (\\n bytes memory _returndata\\n )\\n {\\n return _safeExecutionManagerInteraction(\\n gasleft(),\\n _calldata\\n );\\n }\\n}\\n\",\"keccak256\":\"0x41e146e7912af794a17cd43c5a276674be956bfa8f3ca5b451bcb82d81e6f492\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x608060405234801561001057600080fd5b506040516148cb3803806148cb8339818101604052602081101561003357600080fd5b5051600080546001600160a01b039092166001600160a01b0319909216919091179055614866806100656000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c806322d1470214610046578063299ca4781461009a578063461a4478146100a2575b600080fd5b61007e6004803603608081101561005c57600080fd5b506001600160a01b038135169060208101359060408101359060600135610148565b604080516001600160a01b039092168252519081900360200190f35b61007e610229565b61007e600480360360208110156100b857600080fd5b8101906020810181356401000000008111156100d357600080fd5b8201836020820111156100e557600080fd5b8035906020019184600183028401116401000000008311171561010757600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610238945050505050565b600061017c6040518060400160405280601181526020017027ab26afa33930bab22b32b934b334b2b960791b815250610238565b6001600160a01b0316336001600160a01b0316146101cb5760405162461bcd60e51b81526004018080602001828103825260318152602001806148296031913960400191505060405180910390fd5b848484846040516101db90610314565b80856001600160a01b03168152602001848152602001838152602001828152602001945050505050604051809103906000f08015801561021f573d6000803e3d6000fd5b5095945050505050565b6000546001600160a01b031681565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b83811015610298578181015183820152602001610280565b50505050905090810190601f1680156102c55780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b1580156102e257600080fd5b505afa1580156102f6573d6000803e3d6000fd5b505050506040513d602081101561030c57600080fd5b505192915050565b614507806103228339019056fe60806040523480156200001157600080fd5b506040516200450738038062004507833981016040819052620000349162000232565b600080546001600160a01b0319166001600160a01b038616179055600583905560028290556003829055600681905560408051808201909152601781527f4f564d5f53746174654d616e61676572466163746f72790000000000000000006020820152620000a29062000150565b6001600160a01b0316639ed93318306040518263ffffffff1660e01b8152600401620000cf919062000299565b602060405180830381600087803b158015620000ea57600080fd5b505af1158015620000ff573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000125919062000273565b600180546001600160a01b0319166001600160a01b039290921691909117905550620002c692505050565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b83811015620001b257818101518382015260200162000198565b50505050905090810190601f168015620001e05780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b158015620001fe57600080fd5b505afa15801562000213573d6000803e3d6000fd5b505050506040513d60208110156200022a57600080fd5b505192915050565b6000806000806080858703121562000248578384fd5b84516200025581620002ad565b60208601516040870151606090970151919890975090945092505050565b60006020828403121562000285578081fd5b81516200029281620002ad565b9392505050565b6001600160a01b0391909116815260200190565b6001600160a01b0381168114620002c357600080fd5b50565b61423180620002d66000396000f3fe608060405234801561001057600080fd5b50600436106100cf5760003560e01c8063845fe7a31161008c578063b2fa1c9e11610066578063b2fa1c9e14610185578063b52805711461019a578063b9194310146101a2578063c1c618b8146101b5576100cf565b8063845fe7a314610155578063a244316a14610168578063b1c9fe6e14610170576100cf565b8063299ca478146100d45780632e1ac36c146100f25780632eb1375814610107578063461a44781461011a578063732f960b1461012d578063805e9d3014610140575b600080fd5b6100dc6101bd565b6040516100e99190613bf9565b60405180910390f35b6101056101003660046138be565b6101cc565b005b6101056101153660046138fe565b610565565b6100dc61012836600461397d565b6108a1565b61010561013b366004613a41565b61097f565b610148610c4a565b6040516100e99190613b52565b6101056101633660046138be565b610c50565b610105610f7c565b610178611103565b6040516100e99190613cab565b61018d61110c565b6040516100e99190613ca0565b6100dc611127565b6101056101b036600461385f565b611136565b610148611450565b6000546001600160a01b031681565b60018060045460ff1660028111156101e057fe5b146102065760405162461bcd60e51b81526004016101fd90613ffc565b60405180910390fd5b60025460065460005a6001546040516363b285f960e11b81529192506001600160a01b03169063c7650bf290610242908a908a90600401613c0d565b602060405180830381600087803b15801561025c57600080fd5b505af1158015610270573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610294919061394b565b15156001146102b55760405162461bcd60e51b81526004016101fd90613da7565b60015460405163fbcbc0f160e01b81526000916001600160a01b03169063fbcbc0f1906102e6908b90600401613bf9565b60c06040518083038186803b1580156102fe57600080fd5b505afa158015610312573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061033691906139c2565b600154604051631aaf392f60e01b81529192506000916001600160a01b0390911690631aaf392f9061036e908c908c90600401613c0d565b60206040518083038186803b15801561038657600080fd5b505afa15801561039a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103be9190613965565b90506103ff886040516020016103d49190613b52565b6040516020818303038152906040526103f46103ef84611456565b61149f565b898560400151611509565b6040808401919091526001549051638f3b964760e01b81526001600160a01b0390911690638f3b964790610439908c908690600401613c47565b600060405180830381600087803b15801561045357600080fd5b505af1158015610467573d6000803e3d6000fd5b505050507f3e3ed1a676a2754a041b49bf752e0f167c8753495e36c320fe01d1ef7476253c898960405161049c929190613c0d565b60405180910390a1505060005a820390506104dd6040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506108a1565b6001600160a01b0316631e16e92f858533856040518563ffffffff1660e01b815260040180858152602001848152602001836001600160a01b03168152602001828152602001945050505050600060405180830381600087803b15801561054357600080fd5b505af1158015610557573d6000803e3d6000fd5b505050505050505050505050565b60018060045460ff16600281111561057957fe5b146105965760405162461bcd60e51b81526004016101fd90613ffc565b60025460065460005a9050600160009054906101000a90046001600160a01b03166001600160a01b03166399056ba96040518163ffffffff1660e01b815260040160206040518083038186803b1580156105ef57600080fd5b505afa158015610603573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106279190613965565b156106445760405162461bcd60e51b81526004016101fd90613e88565b600154604051630b38106960e11b81526001600160a01b039091169063167020d290610674908990600401613bf9565b602060405180830381600087803b15801561068e57600080fd5b505af11580156106a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106c6919061394b565b15156001146106e75760405162461bcd60e51b81526004016101fd90613f42565b60015460405163fbcbc0f160e01b81526000916001600160a01b03169063fbcbc0f190610718908a90600401613bf9565b60c06040518083038186803b15801561073057600080fd5b505afa158015610744573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061076891906139c2565b90506107a78760405160200161077e9190613b35565b60405160208183030381529060405261079e6107998461152f565b61156f565b88600354611509565b6003556040517fcec9ef675d775706a02b43afe48af52c5019bc50f99582e3208c6ff55d59c008906107da908990613bf9565b60405180910390a15060005a8203905061081a6040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506108a1565b6001600160a01b0316631e16e92f858533856040518563ffffffff1660e01b815260040180858152602001848152602001836001600160a01b03168152602001828152602001945050505050600060405180830381600087803b15801561088057600080fd5b505af1158015610894573d6000803e3d6000fd5b5050505050505050505050565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b838110156109015781810151838201526020016108e9565b50505050905090810190601f16801561092e5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561094b57600080fd5b505afa15801561095f573d6000803e3d6000fd5b505050506040513d602081101561097557600080fd5b505190505b919050565b60008060045460ff16600281111561099357fe5b146109b05760405162461bcd60e51b81526004016101fd90613ffc565b60025460065460005a90506006546109c786611678565b146109e45760405162461bcd60e51b81526004016101fd9061404d565b6103e88560a0015161040802816109f757fe5b04620186a0015a1015610a1c5760405162461bcd60e51b81526004016101fd90613ee5565b6000610a536040518060400160405280601481526020017327ab26afa2bc32b1baba34b7b726b0b730b3b2b960611b8152506108a1565b600154604051631381ba4d60e01b81529192506001600160a01b031690631381ba4d90610a84908490600401613bf9565b600060405180830381600087803b158015610a9e57600080fd5b505af1158015610ab2573d6000803e3d6000fd5b5050600154604051639be3ad6760e01b81526001600160a01b038086169450639be3ad679350610ae9928b929116906004016140e1565b600060405180830381600087803b158015610b0357600080fd5b505af1158015610b17573d6000803e3d6000fd5b5050600154604051631381ba4d60e01b81526001600160a01b039091169250631381ba4d9150610b4c90600090600401613bf9565b600060405180830381600087803b158015610b6657600080fd5b505af1158015610b7a573d6000803e3d6000fd5b50506004805460ff191660011790555060009150505a82039050610bc46040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506108a1565b6001600160a01b0316631e16e92f858533856040518563ffffffff1660e01b815260040180858152602001848152602001836001600160a01b03168152602001828152602001945050505050600060405180830381600087803b158015610c2a57600080fd5b505af1158015610c3e573d6000803e3d6000fd5b50505050505050505050565b60025490565b60008060045460ff166002811115610c6457fe5b14610c815760405162461bcd60e51b81526004016101fd90613ffc565b60025460065460005a600154604051630ad2267960e01b81529192506001600160a01b031690630ad2267990610cbd908a908a90600401613c0d565b60206040518083038186803b158015610cd557600080fd5b505afa158015610ce9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d0d919061394b565b15610d2a5760405162461bcd60e51b81526004016101fd90613cbf565b60015460405163c8e40fbf60e01b81526001600160a01b039091169063c8e40fbf90610d5a908a90600401613bf9565b60206040518083038186803b158015610d7257600080fd5b505afa158015610d86573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610daa919061394b565b1515600114610dcb5760405162461bcd60e51b81526004016101fd90614084565b60015460405163136e2d8960e11b81526000916001600160a01b0316906326dc5b1290610dfc908b90600401613bf9565b60206040518083038186803b158015610e1457600080fd5b505afa158015610e28573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e4c9190613965565b905060007f56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421821415610e8057506000610edd565b600080610ead8a604051602001610e979190613b52565b6040516020818303038152906040528a86611691565b909250905060018215151415610ed557610ece610ec9826116ba565b6116cd565b9250610eda565b600092505b50505b600154604051635c17d62960e01b81526001600160a01b0390911690635c17d62990610f11908c908c908690600401613c26565b600060405180830381600087803b158015610f2b57600080fd5b505af1158015610f3f573d6000803e3d6000fd5b50505050505060005a820390506104dd6040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506108a1565b60018060045460ff166002811115610f9057fe5b14610fad5760405162461bcd60e51b81526004016101fd90613ffc565b600160009054906101000a90046001600160a01b03166001600160a01b031663d7bd4a2a6040518163ffffffff1660e01b815260040160206040518083038186803b158015610ffb57600080fd5b505afa15801561100f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110339190613965565b156110505760405162461bcd60e51b81526004016101fd90613d4a565b600160009054906101000a90046001600160a01b03166001600160a01b03166399056ba96040518163ffffffff1660e01b815260040160206040518083038186803b15801561109e57600080fd5b505afa1580156110b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110d69190613965565b156110f35760405162461bcd60e51b81526004016101fd90613f9f565b506004805460ff19166002179055565b60045460ff1681565b6000600260045460ff16600281111561112157fe5b14905090565b6001546001600160a01b031681565b60008060045460ff16600281111561114a57fe5b146111675760405162461bcd60e51b81526004016101fd90613ffc565b60025460065460005a60015460405163c8e40fbf60e01b81529192506001600160a01b03169063c8e40fbf906111a1908a90600401613bf9565b60206040518083038186803b1580156111b957600080fd5b505afa1580156111cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111f1919061394b565b15801561127b57506001546040516307a1294560e01b81526001600160a01b03909116906307a1294590611229908a90600401613bf9565b60206040518083038186803b15801561124157600080fd5b505afa158015611255573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611279919061394b565b155b6112975760405162461bcd60e51b81526004016101fd90613d04565b6000806112c6896040516020016112ae9190613b35565b60405160208183030381529060405288600254611691565b9092509050600182151514156113e75760006112e1826116fc565b606081015190915089907fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470141561131a57506000611345565b81606001516113288261178e565b146113455760405162461bcd60e51b81526004016101fd90613e05565b6001546040805160c08101825284518152602080860151908201528482015181830152606080860151908201526001600160a01b038481166080830152600060a08301529151638f3b964760e01b81529190921691638f3b9647916113ae918f91600401613c47565b600060405180830381600087803b1580156113c857600080fd5b505af11580156113dc573d6000803e3d6000fd5b505050505050611417565b600154604051630d631c9d60e31b81526001600160a01b0390911690636b18e4e890610f11908c90600401613bf9565b505060005a820390506104dd6040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506108a1565b60035490565b6060806000805b6020811085821a151615611477576001918201910161145d565b5060405191506040820160405283600882021b60208301528060200382525080915050919050565b606080825160011480156114c757506080836000815181106114bd57fe5b016020015160f81c105b156114d3575081611503565b6114df83516080611792565b836040516020016114f1929190613b5b565b60405160208183030381529060405290505b92915050565b600080611515866118e1565b905061152381868686611911565b9150505b949350505050565b61153761376a565b604051806080016040528083600001518152602001836020015181526020018360400151815260200183606001518152509050919050565b60408051600480825260a0820190925260609160009190816020015b606081526020019060019003908161158b57505083519091506115b1906103ef90611456565b816000815181106115be57fe5b60200260200101819052506115dc6103ef846020015160001b611456565b816001815181106115e957fe5b6020026020010181905250611620836040015160405160200161160c9190613b52565b60405160208183030381529060405261149f565b8160028151811061162d57fe5b6020026020010181905250611650836060015160405160200161160c9190613b52565b8160038151811061165d57fe5b6020026020010181905250611671816119ac565b9392505050565b6000611683826119f0565b805190602001209050919050565b6000606060006116a0866118e1565b90506116ad818686611a2b565b9250925050935093915050565b60606115036116c883611afe565b611b23565b60008060006020845111156116e35760206116e6565b83515b6020858101519190036008021c92505050919050565b61170461376a565b600061170f83611bb2565b905060405180608001604052806117398360008151811061172c57fe5b6020026020010151611bc5565b815260200161174e8360018151811061172c57fe5b81526020016117708360028151811061176357fe5b6020026020010151611bcc565b81526020016117858360038151811061176357fe5b90529392505050565b3f90565b60608060388410156117ec576040805160018082528183019092529060208201818036833701905050905082840160f81b816000815181106117d057fe5b60200101906001600160f81b031916908160001a905350611671565b600060015b8086816117fa57fe5b041561180f57600190910190610100026117f1565b816001016001600160401b038111801561182857600080fd5b506040519080825280601f01601f191660200182016040528015611853576020820181803683370190505b50925084820160370160f81b8360008151811061186c57fe5b60200101906001600160f81b031916908160001a905350600190505b8181116118d8576101008183036101000a87816118a157fe5b04816118a957fe5b0660f81b8382815181106118b957fe5b60200101906001600160f81b031916908160001a905350600101611888565b50509392505050565b606081805190602001206040516020016118fb9190613b52565b6040516020818303038152906040529050919050565b6040805180820190915260018152600160ff1b60209091015260007f56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b4218214156119655761195e8585611cc6565b9050611527565b600061197084611cea565b9050600080611980838987611dc0565b509150915060006119938484848b612163565b905061199f818a61247b565b9998505050505050505050565b606060006119b9836125d4565b90506119c7815160c0611792565b816040516020016119d9929190613b5b565b604051602081830303815290604052915050919050565b6060816000015182602001518360400151846060015185608001518660a001518760c001516040516020016118fb9796959493929190613b8a565b600060606000611a3a85611cea565b90506000806000611a4c848a89611dc0565b81519295509093509150158080611a605750815b611ab1576040805162461bcd60e51b815260206004820152601a60248201527f50726f76696465642070726f6f6620697320696e76616c69642e000000000000604482015290519081900360640190fd5b600081611acd5760405180602001604052806000815250611aec565b611aec866001870381518110611adf57fe5b60200260200101516126dd565b919b919a509098505050505050505050565b611b06613791565b506040805180820190915281518152602082810190820152919050565b60606000806000611b33856126f9565b919450925090506000816001811115611b4857fe5b14611b9a576040805162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c502062797465732076616c75652e0000000000000000604482015290519081900360640190fd5b611ba985602001518484612a22565b95945050505050565b6060611503611bc083611afe565b612acf565b6000611503825b6000602182600001511115611c28576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e000000000000604482015290519081900360640190fd5b6000806000611c36856126f9565b919450925090506000816001811115611c4b57fe5b14611c9d576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e000000000000604482015290519081900360640190fd5b602080860151840180519091841015611cbc5760208490036101000a90045b9695505050505050565b6000611cda611cd484612c45565b83612d41565b5180516020909101209392505050565b60606000611cf783611bb2565b9050600081516001600160401b0381118015611d1257600080fd5b50604051908082528060200260200182016040528015611d4c57816020015b611d396137ab565b815260200190600190039081611d315790505b50905060005b8251811015611db8576000611d79848381518110611d6c57fe5b6020026020010151611b23565b90506040518060400160405280828152602001611d9583611bb2565b815250838381518110611da457fe5b602090810291909101015250600101611d52565b509392505050565b60006060818080611dd087612c45565b905085600080611dde6137ab565b60005b8c5181101561213b578c8181518110611df657fe5b6020026020010151915082840193506001870196508360001415611e6a57815180516020909101208514611e65576040805162461bcd60e51b8152602060048201526011602482015270092dcecc2d8d2c840e4dedee840d0c2e6d607b1b604482015290519081900360640190fd5b611f31565b815151602011611ed157815180516020909101208514611e65576040805162461bcd60e51b815260206004820152601b60248201527f496e76616c6964206c6172676520696e7465726e616c20686173680000000000604482015290519081900360640190fd5b84611edf8360000151612dd5565b14611f31576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420696e7465726e616c206e6f64652068617368000000000000604482015290519081900360640190fd5b60208201515160111415611fa0578551841415611f4d5761213b565b6000868581518110611f5b57fe5b602001015160f81c60f81b60f81c9050600083602001518260ff1681518110611f8057fe5b60200260200101519050611f9381612e01565b9650600194505050612133565b600282602001515114156120e6576000611fb983612e37565b9050600081600081518110611fca57fe5b016020015160f81c9050600181166002036000611fea8460ff8416612e55565b90506000611ff88b8a612e55565b905060006120068383612e86565b905060ff85166002148061201d575060ff85166003145b1561204f578083511480156120325750808251145b1561203c57988901985b50600160ff1b995061213b945050505050565b60ff85161580612062575060ff85166001145b156120af578061207f5750600160ff1b995061213b945050505050565b6120a0886020015160018151811061209357fe5b6020026020010151612e01565b9a509750612133945050505050565b60405162461bcd60e51b81526004018080602001828103825260268152602001806141ff6026913960400191505060405180910390fd5b6040805162461bcd60e51b815260206004820152601d60248201527f526563656976656420616e20756e706172736561626c65206e6f64652e000000604482015290519081900360640190fd5b600101611de1565b50600160ff1b84148661214e8786612e55565b909e909d50909b509950505050505050505050565b60606000839050600086600187038151811061217b57fe5b60200260200101519050600061219082612eec565b6040805160038082526080820190925291925060009190816020015b6121b46137ab565b8152602001906001900390816121ac5790505090506000845160001480156121e7575060028360028111156121e557fe5b145b1561221d576121fe6121f885612fc2565b88612d41565b82828151811061220a57fe5b602090810291909101015260010161245e565b600083600281111561222b57fe5b1415612291578451612260576122418488612fd5565b82828151811061224d57fe5b602090810291909101015260010161228c565b8382828151811061226d57fe5b60200260200101819052506001810190506121fe6121f8866001612e55565b61245e565b600061229c85612fc2565b905060006122aa8288612e86565b9050801561230b5760006122c083600084613020565b90506122d4816122cf8c613170565b6131b1565b8585815181106122e057fe5b60200260200101819052506001840193506122fb8383612e55565b92506123078883612e55565b9750505b60006123156131f5565b905082516000141561233a576123338161232e896126dd565b612fd5565b90506123d2565b60008360008151811061234957fe5b016020015160f81c905061235e846001612e55565b9350600287600281111561236e57fe5b14156123a9576000612388856123838b6126dd565b612d41565b90506123a1838361239c8460000151613170565b613282565b9250506123d0565b8351156123bf576000612388856122cf8b6126dd565b6123cd828261239c8b6126dd565b91505b505b8751612407576123e2818b612fd5565b9050808585815181106123f157fe5b602002602001018190525060018401935061245a565b612412886001612e55565b97508085858151811061242157fe5b602002602001018190525060018401935061243c888b612d41565b85858151811061244857fe5b60200260200101819052506001840193505b5050505b61246d8a60018b0384846132db565b9a9950505050505050505050565b60008061248783612c45565b90506124916137ab565b84516000906060905b80156125bf578760018203815181106124af57fe5b602002602001015193506124c284612eec565b925060028360028111156124d257fe5b14156124fd5760006124e385612fc2565b90506124f58660008351895103613020565b9550506125a9565b600183600281111561250b57fe5b141561254b57600061251c85612fc2565b905061252e8660008351895103613020565b8351909650156125455761254281846131b1565b94505b506125a9565b600083600281111561255957fe5b14156125a9578151156125a95760008560018751038151811061257857fe5b602001015160f81c60f81b60f81c90506125988660006001895103613020565b95506125a5858285613282565b9450505b83516125b490613170565b91506000190161249a565b50509051805160209091012095945050505050565b60608151600014156125f5575060408051600081526020810190915261097a565b6000805b83518110156126285783818151811061260e57fe5b6020026020010151518201915080806001019150506125f9565b6000826001600160401b038111801561264057600080fd5b506040519080825280601f01601f19166020018201604052801561266b576020820181803683370190505b50600092509050602081015b85518310156126d457600086848151811061268e57fe5b6020026020010151905060006020820190506126ac838284516133bd565b8785815181106126b857fe5b6020026020010151518301925050508280600101935050612677565b50949350505050565b60208101518051606091611503916000198101908110611d6c57fe5b600080600080846000015111612756576040805162461bcd60e51b815260206004820152601860248201527f524c50206974656d2063616e6e6f74206265206e756c6c2e0000000000000000604482015290519081900360640190fd5b6020840151805160001a607f811161277b576000600160009450945094505050612a1b565b60b781116127f0578551607f1982019081106127de576040805162461bcd60e51b815260206004820152601960248201527f496e76616c696420524c502073686f727420737472696e672e00000000000000604482015290519081900360640190fd5b60019550935060009250612a1b915050565b60bf81116128d457855160b6198201908110612853576040805162461bcd60e51b815260206004820152601f60248201527f496e76616c696420524c50206c6f6e6720737472696e67206c656e6774682e00604482015290519081900360640190fd5b6000816020036101000a60018501510490508082018860000151116128bf576040805162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c50206c6f6e6720737472696e672e0000000000000000604482015290519081900360640190fd5b60019091019550935060009250612a1b915050565b60f7811161294857855160bf198201908110612937576040805162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c502073686f7274206c6973742e000000000000000000604482015290519081900360640190fd5b600195509350849250612a1b915050565b855160f61982019081106129a3576040805162461bcd60e51b815260206004820152601d60248201527f496e76616c696420524c50206c6f6e67206c697374206c656e6774682e000000604482015290519081900360640190fd5b6000816020036101000a6001850151049050808201886000015111612a08576040805162461bcd60e51b815260206004820152601660248201527524b73b30b634b210292628103637b733903634b9ba1760511b604482015290519081900360640190fd5b6001918201965094509250612a1b915050565b9193909250565b60606000826001600160401b0381118015612a3c57600080fd5b506040519080825280601f01601f191660200182016040528015612a67576020820181803683370190505b509050805160001415612a7b579050611671565b8484016020820160005b60208604811015612aa6578251825260209283019290910190600101612a85565b5080519151601f959095166020036101000a600019019182169119909416179092525092915050565b6060600080612add846126f9565b91935090915060019050816001811115612af357fe5b14612b45576040805162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c50206c6973742076616c75652e000000000000000000604482015290519081900360640190fd5b6040805160208082526104208201909252600091816020015b612b66613791565b815260200190600190039081612b5e5790505090506000835b8651811015612c3a5760208210612bc75760405162461bcd60e51b815260040180806020018281038252602a8152602001806141d5602a913960400191505060405180910390fd5b600080612bf36040518060400160405280858c60000151038152602001858c60200151018152506126f9565b509150915060405180604001604052808383018152602001848b6020015101815250858581518110612c2157fe5b6020908102919091010152600193909301920101612b7f565b508152949350505050565b6060600082516002026001600160401b0381118015612c6357600080fd5b506040519080825280601f01601f191660200182016040528015612c8e576020820181803683370190505b50905060005b8351811015612d3a576004848281518110612cab57fe5b602001015160f81c60f81b6001600160f81b031916901c828260020281518110612cd157fe5b60200101906001600160f81b031916908160001a9053506010848281518110612cf657fe5b016020015160f81c81612d0557fe5b0660f81b828260020260010181518110612d1b57fe5b60200101906001600160f81b031916908160001a905350600101612c94565b5092915050565b612d496137ab565b60408051600280825260608201909252600091816020015b6060815260200190600190039081612d615790505090506000612d85856001613401565b9050612d936103ef82613558565b82600081518110612da057fe5b6020026020010181905250612db48461149f565b82600181518110612dc157fe5b6020026020010181905250611ba982613628565b6000602082511015612dec5750602081015161097a565b81806020019051602081101561097557600080fd5b60006060602083600001511015612e2257612e1b83613657565b9050612e2e565b612e2b83611b23565b90505b61167181612dd5565b6060611503612e508360200151600081518110611d6c57fe5b612c45565b60608183510360001415612e785750604080516020810190915260008152611503565b611671838384865103613020565b6000805b808451118015612e9a5750808351115b8015612edf5750828181518110612ead57fe5b602001015160f81c60f81b6001600160f81b031916848281518110612ece57fe5b01602001516001600160f81b031916145b1561167157600101612e8a565b60208101515160009060111415612f055750600061097a565b60028260200151511415612f81576000612f1e83612e37565b9050600081600081518110612f2f57fe5b016020015160f81c90506002811480612f4b575060ff81166003145b15612f5b5760029250505061097a565b60ff81161580612f6e575060ff81166001145b15612f7e5760019250505061097a565b50505b6040805162461bcd60e51b8152602060048201526011602482015270496e76616c6964206e6f6465207479706560781b604482015290519081900360640190fd5b6060611503612fd083612e37565b613662565b612fdd6137ab565b6000612fe88361149f565b9050612ff381611afe565b60208501518051600019810190811061300857fe5b602002602001018190525061152784602001516136ab565b60608182601f01101561306b576040805162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b604482015290519081900360640190fd5b8282840110156130b3576040805162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b604482015290519081900360640190fd5b818301845110156130ff576040805162461bcd60e51b8152602060048201526011602482015270736c6963655f6f75744f66426f756e647360781b604482015290519081900360640190fd5b60608215801561311e57604051915060008252602082016040526126d4565b6040519150601f8416801560200281840101858101878315602002848b0101015b8183101561315757805183526020928301920161313f565b5050858452601f01601f19166040525050949350505050565b606060208251101561318357508061097a565b818051906020012060405160200180828152602001915050604051602081830303815290604052905061097a565b6131b96137ab565b60408051600280825260608201909252600091816020015b60608152602001906001900390816131d15790505090506000612d85856000613401565b6131fd6137ab565b6040805160118082526102408201909252600091816020015b606081526020019060019003908161321657905050905060005b815181101561327257604051806040016040528060018152602001600160ff1b81525082828151811061325f57fe5b6020908102919091010152600101613230565b5061327c81613628565b91505090565b61328a6137ab565b600060208351106132a35761329e8361149f565b6132a5565b825b90506132b081611afe565b85602001518560ff16815181106132c357fe5b6020026020010181905250611ba985602001516136ab565b606060008285016001600160401b03811180156132f757600080fd5b5060405190808252806020026020018201604052801561333157816020015b61331e6137ab565b8152602001906001900390816133165790505b50905060005b858110156133725786818151811061334b57fe5b602002602001015182828151811061335f57fe5b6020908102919091010152600101613337565b5060005b838110156133b35784818151811061338a57fe5b602002602001015182878301815181106133a057fe5b6020908102919091010152600101613376565b5095945050505050565b8282825b602081106133e0578151835260209283019290910190601f19016133c1565b905182516020929092036101000a6000190180199091169116179052505050565b6060600082613411576000613414565b60025b90506000600285518161342357fe5b06905060008160020360ff166001600160401b038111801561344457600080fd5b506040519080825280601f01601f19166020018201604052801561346f576020820181803683370190505b50905081830160f81b8160008151811061348557fe5b60200101906001600160f81b031916908160001a90535080866040516020018083805190602001908083835b602083106134d05780518252601f1990920191602091820191016134b1565b51815160209384036101000a600019018019909216911617905285519190930192850191508083835b602083106135185780518252601f1990920191602091820191016134f9565b6001836020036101000a03801982511681845116808217855250505050505090500192505050604051602081830303815290604052935050505092915050565b60606000600283518161356757fe5b046001600160401b038111801561357d57600080fd5b506040519080825280601f01601f1916602001820160405280156135a8576020820181803683370190505b50905060005b8151811015612d3a578381600202600101815181106135c957fe5b602001015160f81c60f81b60048583600202815181106135e557fe5b602001015160f81c60f81b6001600160f81b031916901b1782828151811061360957fe5b60200101906001600160f81b031916908160001a9053506001016135ae565b6136306137ab565b600061363b836119ac565b9050604051806040016040528082815260200161178583611bb2565b606061150382613754565b606060028260008151811061367357fe5b016020015160f81c8161368257fe5b0660ff16600014156136a057613699826002612e55565b905061097a565b613699826001612e55565b6136b36137ab565b600082516001600160401b03811180156136cc57600080fd5b5060405190808252806020026020018201604052801561370057816020015b60608152602001906001900390816136eb5790505b50905060005b835181101561374a5761372b84828151811061371e57fe5b6020026020010151613657565b82828151811061373757fe5b6020908102919091010152600101613706565b5061167181613628565b6060611503826020015160008460000151612a22565b60408051608081018252600080825260208201819052918101829052606081019190915290565b604051806040016040528060008152602001600081525090565b604051806040016040528060608152602001606081525090565b60006001600160401b038311156137d857fe5b6137eb601f8401601f1916602001614169565b90508281528383830111156137ff57600080fd5b828260208301376000602084830101529392505050565b803561097a816141bc565b8051801515811461097a57600080fd5b600082601f830112613841578081fd5b611671838335602085016137c5565b80356002811061097a57600080fd5b600080600060608486031215613873578283fd5b833561387e816141bc565b9250602084013561388e816141bc565b915060408401356001600160401b038111156138a8578182fd5b6138b486828701613831565b9150509250925092565b6000806000606084860312156138d2578283fd5b83356138dd816141bc565b92506020840135915060408401356001600160401b038111156138a8578182fd5b60008060408385031215613910578182fd5b823561391b816141bc565b915060208301356001600160401b03811115613935578182fd5b61394185828601613831565b9150509250929050565b60006020828403121561395c578081fd5b61167182613821565b600060208284031215613976578081fd5b5051919050565b60006020828403121561398e578081fd5b81356001600160401b038111156139a3578182fd5b8201601f810184136139b3578182fd5b611527848235602084016137c5565b600060c082840312156139d3578081fd5b60405160c081018181106001600160401b03821117156139ef57fe5b8060405250825181526020830151602082015260408301516040820152606083015160608201526080830151613a24816141bc565b6080820152613a3560a08401613821565b60a08201529392505050565b600060208284031215613a52578081fd5b81356001600160401b0380821115613a68578283fd5b9083019060e08286031215613a7b578283fd5b613a8560e0614169565b8235815260208301356020820152613a9f60408401613850565b6040820152613ab060608401613816565b6060820152613ac160808401613816565b608082015260a083013560a082015260c083013582811115613ae1578485fd5b613aed87828601613831565b60c08301525095945050505050565b6001600160a01b03169052565b60008151808452613b2181602086016020860161418c565b601f01601f19169290920160200192915050565b60609190911b6bffffffffffffffffffffffff1916815260140190565b90815260200190565b60008351613b6d81846020880161418c565b835190830190613b8181836020880161418c565b01949350505050565b600088825287602083015260028710613b9f57fe5b8660f81b60408301526bffffffffffffffffffffffff19808760601b166041840152808660601b166055840152508360698301528251613be681608985016020870161418c565b9190910160890198975050505050505050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039390931683526020830191909152604082015260600190565b600060e08201905060018060a01b038085168352835160208401526020840151604084015260408401516060840152606084015160808401528060808501511660a08401525060a0830151151560c08301529392505050565b901515815260200190565b6020810160038310613cb957fe5b91905290565b60208082526025908201527f53746f7261676520736c6f742068617320616c7265616479206265656e20707260408201526437bb32b71760d91b606082015260800190565b60208082526026908201527f4163636f756e742073746174652068617320616c7265616479206265656e20706040820152653937bb32b71760d11b606082015260800190565b6020808252603e908201527f416c6c206163636f756e7473206d75737420626520636f6d6d6974746564206260408201527f65666f726520636f6d706c6574696e672061207472616e736974696f6e2e0000606082015260800190565b602080825260409082018190527f53746f7261676520736c6f742076616c7565207761736e2774206368616e6765908201527f64206f722068617320616c7265616479206265656e20636f6d6d69747465642e606082015260800190565b6020808252605b908201527f4f564d5f53746174655472616e736974696f6e65723a2050726f76696465642060408201527f4c3120636f6e747261637420636f6465206861736820646f6573206e6f74206d60608201527f61746368204c3220636f6e747261637420636f646520686173682e0000000000608082015260a00190565b6020808252603f908201527f416c6c2073746f72616765206d75737420626520636f6d6d697474656420626560408201527f666f726520636f6d6d697474696e67206163636f756e74207374617465732e00606082015260800190565b60208082526038908201527f4e6f7420656e6f7567682067617320746f2065786563757465207472616e736160408201527f6374696f6e2064657465726d696e6973746963616c6c792e0000000000000000606082015260800190565b6020808252603b908201527f4163636f756e74207374617465207761736e2774206368616e676564206f722060408201527f68617320616c7265616479206265656e20636f6d6d69747465642e0000000000606082015260800190565b6020808252603d908201527f416c6c2073746f72616765206d75737420626520636f6d6d697474656420626560408201527f666f726520636f6d706c6574696e672061207472616e736974696f6e2e000000606082015260800190565b60208082526031908201527f46756e6374696f6e206d7573742062652063616c6c656420647572696e67207460408201527034329031b7b93932b1ba10383430b9b29760791b606082015260800190565b6020808252601d908201527f496e76616c6964207472616e73616374696f6e2070726f76696465642e000000604082015260600190565b60208082526038908201527f436f6e7472616374206d757374206265207665726966696564206265666f726560408201527f2070726f76696e6720612073746f7261676520736c6f742e0000000000000000606082015260800190565b600060408252835160408301526020840151606083015260408401516002811061410757fe5b60808381019190915260608501516001600160a01b031660a084015284015161413360c0840182613afc565b5060a084015160e083015260c084015160e0610100840152614159610120840182613b09565b9150506116716020830184613afc565b6040518181016001600160401b038111828210171561418457fe5b604052919050565b60005b838110156141a757818101518382015260200161418f565b838111156141b6576000848401525b50505050565b6001600160a01b03811681146141d157600080fd5b5056fe50726f766964656420524c50206c6973742065786365656473206d6178206c697374206c656e6774682e52656365697665642061206e6f6465207769746820616e20756e6b6e6f776e20707265666978a164736f6c6343000706000a4372656174652063616e206f6e6c7920626520646f6e6520627920746865204f564d5f467261756456657269666965722ea164736f6c6343000706000a", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100415760003560e01c806322d1470214610046578063299ca4781461009a578063461a4478146100a2575b600080fd5b61007e6004803603608081101561005c57600080fd5b506001600160a01b038135169060208101359060408101359060600135610148565b604080516001600160a01b039092168252519081900360200190f35b61007e610229565b61007e600480360360208110156100b857600080fd5b8101906020810181356401000000008111156100d357600080fd5b8201836020820111156100e557600080fd5b8035906020019184600183028401116401000000008311171561010757600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610238945050505050565b600061017c6040518060400160405280601181526020017027ab26afa33930bab22b32b934b334b2b960791b815250610238565b6001600160a01b0316336001600160a01b0316146101cb5760405162461bcd60e51b81526004018080602001828103825260318152602001806148296031913960400191505060405180910390fd5b848484846040516101db90610314565b80856001600160a01b03168152602001848152602001838152602001828152602001945050505050604051809103906000f08015801561021f573d6000803e3d6000fd5b5095945050505050565b6000546001600160a01b031681565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b83811015610298578181015183820152602001610280565b50505050905090810190601f1680156102c55780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b1580156102e257600080fd5b505afa1580156102f6573d6000803e3d6000fd5b505050506040513d602081101561030c57600080fd5b505192915050565b614507806103228339019056fe60806040523480156200001157600080fd5b506040516200450738038062004507833981016040819052620000349162000232565b600080546001600160a01b0319166001600160a01b038616179055600583905560028290556003829055600681905560408051808201909152601781527f4f564d5f53746174654d616e61676572466163746f72790000000000000000006020820152620000a29062000150565b6001600160a01b0316639ed93318306040518263ffffffff1660e01b8152600401620000cf919062000299565b602060405180830381600087803b158015620000ea57600080fd5b505af1158015620000ff573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000125919062000273565b600180546001600160a01b0319166001600160a01b039290921691909117905550620002c692505050565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b83811015620001b257818101518382015260200162000198565b50505050905090810190601f168015620001e05780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b158015620001fe57600080fd5b505afa15801562000213573d6000803e3d6000fd5b505050506040513d60208110156200022a57600080fd5b505192915050565b6000806000806080858703121562000248578384fd5b84516200025581620002ad565b60208601516040870151606090970151919890975090945092505050565b60006020828403121562000285578081fd5b81516200029281620002ad565b9392505050565b6001600160a01b0391909116815260200190565b6001600160a01b0381168114620002c357600080fd5b50565b61423180620002d66000396000f3fe608060405234801561001057600080fd5b50600436106100cf5760003560e01c8063845fe7a31161008c578063b2fa1c9e11610066578063b2fa1c9e14610185578063b52805711461019a578063b9194310146101a2578063c1c618b8146101b5576100cf565b8063845fe7a314610155578063a244316a14610168578063b1c9fe6e14610170576100cf565b8063299ca478146100d45780632e1ac36c146100f25780632eb1375814610107578063461a44781461011a578063732f960b1461012d578063805e9d3014610140575b600080fd5b6100dc6101bd565b6040516100e99190613bf9565b60405180910390f35b6101056101003660046138be565b6101cc565b005b6101056101153660046138fe565b610565565b6100dc61012836600461397d565b6108a1565b61010561013b366004613a41565b61097f565b610148610c4a565b6040516100e99190613b52565b6101056101633660046138be565b610c50565b610105610f7c565b610178611103565b6040516100e99190613cab565b61018d61110c565b6040516100e99190613ca0565b6100dc611127565b6101056101b036600461385f565b611136565b610148611450565b6000546001600160a01b031681565b60018060045460ff1660028111156101e057fe5b146102065760405162461bcd60e51b81526004016101fd90613ffc565b60405180910390fd5b60025460065460005a6001546040516363b285f960e11b81529192506001600160a01b03169063c7650bf290610242908a908a90600401613c0d565b602060405180830381600087803b15801561025c57600080fd5b505af1158015610270573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610294919061394b565b15156001146102b55760405162461bcd60e51b81526004016101fd90613da7565b60015460405163fbcbc0f160e01b81526000916001600160a01b03169063fbcbc0f1906102e6908b90600401613bf9565b60c06040518083038186803b1580156102fe57600080fd5b505afa158015610312573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061033691906139c2565b600154604051631aaf392f60e01b81529192506000916001600160a01b0390911690631aaf392f9061036e908c908c90600401613c0d565b60206040518083038186803b15801561038657600080fd5b505afa15801561039a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103be9190613965565b90506103ff886040516020016103d49190613b52565b6040516020818303038152906040526103f46103ef84611456565b61149f565b898560400151611509565b6040808401919091526001549051638f3b964760e01b81526001600160a01b0390911690638f3b964790610439908c908690600401613c47565b600060405180830381600087803b15801561045357600080fd5b505af1158015610467573d6000803e3d6000fd5b505050507f3e3ed1a676a2754a041b49bf752e0f167c8753495e36c320fe01d1ef7476253c898960405161049c929190613c0d565b60405180910390a1505060005a820390506104dd6040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506108a1565b6001600160a01b0316631e16e92f858533856040518563ffffffff1660e01b815260040180858152602001848152602001836001600160a01b03168152602001828152602001945050505050600060405180830381600087803b15801561054357600080fd5b505af1158015610557573d6000803e3d6000fd5b505050505050505050505050565b60018060045460ff16600281111561057957fe5b146105965760405162461bcd60e51b81526004016101fd90613ffc565b60025460065460005a9050600160009054906101000a90046001600160a01b03166001600160a01b03166399056ba96040518163ffffffff1660e01b815260040160206040518083038186803b1580156105ef57600080fd5b505afa158015610603573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106279190613965565b156106445760405162461bcd60e51b81526004016101fd90613e88565b600154604051630b38106960e11b81526001600160a01b039091169063167020d290610674908990600401613bf9565b602060405180830381600087803b15801561068e57600080fd5b505af11580156106a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106c6919061394b565b15156001146106e75760405162461bcd60e51b81526004016101fd90613f42565b60015460405163fbcbc0f160e01b81526000916001600160a01b03169063fbcbc0f190610718908a90600401613bf9565b60c06040518083038186803b15801561073057600080fd5b505afa158015610744573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061076891906139c2565b90506107a78760405160200161077e9190613b35565b60405160208183030381529060405261079e6107998461152f565b61156f565b88600354611509565b6003556040517fcec9ef675d775706a02b43afe48af52c5019bc50f99582e3208c6ff55d59c008906107da908990613bf9565b60405180910390a15060005a8203905061081a6040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506108a1565b6001600160a01b0316631e16e92f858533856040518563ffffffff1660e01b815260040180858152602001848152602001836001600160a01b03168152602001828152602001945050505050600060405180830381600087803b15801561088057600080fd5b505af1158015610894573d6000803e3d6000fd5b5050505050505050505050565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b838110156109015781810151838201526020016108e9565b50505050905090810190601f16801561092e5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561094b57600080fd5b505afa15801561095f573d6000803e3d6000fd5b505050506040513d602081101561097557600080fd5b505190505b919050565b60008060045460ff16600281111561099357fe5b146109b05760405162461bcd60e51b81526004016101fd90613ffc565b60025460065460005a90506006546109c786611678565b146109e45760405162461bcd60e51b81526004016101fd9061404d565b6103e88560a0015161040802816109f757fe5b04620186a0015a1015610a1c5760405162461bcd60e51b81526004016101fd90613ee5565b6000610a536040518060400160405280601481526020017327ab26afa2bc32b1baba34b7b726b0b730b3b2b960611b8152506108a1565b600154604051631381ba4d60e01b81529192506001600160a01b031690631381ba4d90610a84908490600401613bf9565b600060405180830381600087803b158015610a9e57600080fd5b505af1158015610ab2573d6000803e3d6000fd5b5050600154604051639be3ad6760e01b81526001600160a01b038086169450639be3ad679350610ae9928b929116906004016140e1565b600060405180830381600087803b158015610b0357600080fd5b505af1158015610b17573d6000803e3d6000fd5b5050600154604051631381ba4d60e01b81526001600160a01b039091169250631381ba4d9150610b4c90600090600401613bf9565b600060405180830381600087803b158015610b6657600080fd5b505af1158015610b7a573d6000803e3d6000fd5b50506004805460ff191660011790555060009150505a82039050610bc46040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506108a1565b6001600160a01b0316631e16e92f858533856040518563ffffffff1660e01b815260040180858152602001848152602001836001600160a01b03168152602001828152602001945050505050600060405180830381600087803b158015610c2a57600080fd5b505af1158015610c3e573d6000803e3d6000fd5b50505050505050505050565b60025490565b60008060045460ff166002811115610c6457fe5b14610c815760405162461bcd60e51b81526004016101fd90613ffc565b60025460065460005a600154604051630ad2267960e01b81529192506001600160a01b031690630ad2267990610cbd908a908a90600401613c0d565b60206040518083038186803b158015610cd557600080fd5b505afa158015610ce9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d0d919061394b565b15610d2a5760405162461bcd60e51b81526004016101fd90613cbf565b60015460405163c8e40fbf60e01b81526001600160a01b039091169063c8e40fbf90610d5a908a90600401613bf9565b60206040518083038186803b158015610d7257600080fd5b505afa158015610d86573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610daa919061394b565b1515600114610dcb5760405162461bcd60e51b81526004016101fd90614084565b60015460405163136e2d8960e11b81526000916001600160a01b0316906326dc5b1290610dfc908b90600401613bf9565b60206040518083038186803b158015610e1457600080fd5b505afa158015610e28573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e4c9190613965565b905060007f56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421821415610e8057506000610edd565b600080610ead8a604051602001610e979190613b52565b6040516020818303038152906040528a86611691565b909250905060018215151415610ed557610ece610ec9826116ba565b6116cd565b9250610eda565b600092505b50505b600154604051635c17d62960e01b81526001600160a01b0390911690635c17d62990610f11908c908c908690600401613c26565b600060405180830381600087803b158015610f2b57600080fd5b505af1158015610f3f573d6000803e3d6000fd5b50505050505060005a820390506104dd6040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506108a1565b60018060045460ff166002811115610f9057fe5b14610fad5760405162461bcd60e51b81526004016101fd90613ffc565b600160009054906101000a90046001600160a01b03166001600160a01b031663d7bd4a2a6040518163ffffffff1660e01b815260040160206040518083038186803b158015610ffb57600080fd5b505afa15801561100f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110339190613965565b156110505760405162461bcd60e51b81526004016101fd90613d4a565b600160009054906101000a90046001600160a01b03166001600160a01b03166399056ba96040518163ffffffff1660e01b815260040160206040518083038186803b15801561109e57600080fd5b505afa1580156110b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110d69190613965565b156110f35760405162461bcd60e51b81526004016101fd90613f9f565b506004805460ff19166002179055565b60045460ff1681565b6000600260045460ff16600281111561112157fe5b14905090565b6001546001600160a01b031681565b60008060045460ff16600281111561114a57fe5b146111675760405162461bcd60e51b81526004016101fd90613ffc565b60025460065460005a60015460405163c8e40fbf60e01b81529192506001600160a01b03169063c8e40fbf906111a1908a90600401613bf9565b60206040518083038186803b1580156111b957600080fd5b505afa1580156111cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111f1919061394b565b15801561127b57506001546040516307a1294560e01b81526001600160a01b03909116906307a1294590611229908a90600401613bf9565b60206040518083038186803b15801561124157600080fd5b505afa158015611255573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611279919061394b565b155b6112975760405162461bcd60e51b81526004016101fd90613d04565b6000806112c6896040516020016112ae9190613b35565b60405160208183030381529060405288600254611691565b9092509050600182151514156113e75760006112e1826116fc565b606081015190915089907fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470141561131a57506000611345565b81606001516113288261178e565b146113455760405162461bcd60e51b81526004016101fd90613e05565b6001546040805160c08101825284518152602080860151908201528482015181830152606080860151908201526001600160a01b038481166080830152600060a08301529151638f3b964760e01b81529190921691638f3b9647916113ae918f91600401613c47565b600060405180830381600087803b1580156113c857600080fd5b505af11580156113dc573d6000803e3d6000fd5b505050505050611417565b600154604051630d631c9d60e31b81526001600160a01b0390911690636b18e4e890610f11908c90600401613bf9565b505060005a820390506104dd6040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506108a1565b60035490565b6060806000805b6020811085821a151615611477576001918201910161145d565b5060405191506040820160405283600882021b60208301528060200382525080915050919050565b606080825160011480156114c757506080836000815181106114bd57fe5b016020015160f81c105b156114d3575081611503565b6114df83516080611792565b836040516020016114f1929190613b5b565b60405160208183030381529060405290505b92915050565b600080611515866118e1565b905061152381868686611911565b9150505b949350505050565b61153761376a565b604051806080016040528083600001518152602001836020015181526020018360400151815260200183606001518152509050919050565b60408051600480825260a0820190925260609160009190816020015b606081526020019060019003908161158b57505083519091506115b1906103ef90611456565b816000815181106115be57fe5b60200260200101819052506115dc6103ef846020015160001b611456565b816001815181106115e957fe5b6020026020010181905250611620836040015160405160200161160c9190613b52565b60405160208183030381529060405261149f565b8160028151811061162d57fe5b6020026020010181905250611650836060015160405160200161160c9190613b52565b8160038151811061165d57fe5b6020026020010181905250611671816119ac565b9392505050565b6000611683826119f0565b805190602001209050919050565b6000606060006116a0866118e1565b90506116ad818686611a2b565b9250925050935093915050565b60606115036116c883611afe565b611b23565b60008060006020845111156116e35760206116e6565b83515b6020858101519190036008021c92505050919050565b61170461376a565b600061170f83611bb2565b905060405180608001604052806117398360008151811061172c57fe5b6020026020010151611bc5565b815260200161174e8360018151811061172c57fe5b81526020016117708360028151811061176357fe5b6020026020010151611bcc565b81526020016117858360038151811061176357fe5b90529392505050565b3f90565b60608060388410156117ec576040805160018082528183019092529060208201818036833701905050905082840160f81b816000815181106117d057fe5b60200101906001600160f81b031916908160001a905350611671565b600060015b8086816117fa57fe5b041561180f57600190910190610100026117f1565b816001016001600160401b038111801561182857600080fd5b506040519080825280601f01601f191660200182016040528015611853576020820181803683370190505b50925084820160370160f81b8360008151811061186c57fe5b60200101906001600160f81b031916908160001a905350600190505b8181116118d8576101008183036101000a87816118a157fe5b04816118a957fe5b0660f81b8382815181106118b957fe5b60200101906001600160f81b031916908160001a905350600101611888565b50509392505050565b606081805190602001206040516020016118fb9190613b52565b6040516020818303038152906040529050919050565b6040805180820190915260018152600160ff1b60209091015260007f56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b4218214156119655761195e8585611cc6565b9050611527565b600061197084611cea565b9050600080611980838987611dc0565b509150915060006119938484848b612163565b905061199f818a61247b565b9998505050505050505050565b606060006119b9836125d4565b90506119c7815160c0611792565b816040516020016119d9929190613b5b565b604051602081830303815290604052915050919050565b6060816000015182602001518360400151846060015185608001518660a001518760c001516040516020016118fb9796959493929190613b8a565b600060606000611a3a85611cea565b90506000806000611a4c848a89611dc0565b81519295509093509150158080611a605750815b611ab1576040805162461bcd60e51b815260206004820152601a60248201527f50726f76696465642070726f6f6620697320696e76616c69642e000000000000604482015290519081900360640190fd5b600081611acd5760405180602001604052806000815250611aec565b611aec866001870381518110611adf57fe5b60200260200101516126dd565b919b919a509098505050505050505050565b611b06613791565b506040805180820190915281518152602082810190820152919050565b60606000806000611b33856126f9565b919450925090506000816001811115611b4857fe5b14611b9a576040805162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c502062797465732076616c75652e0000000000000000604482015290519081900360640190fd5b611ba985602001518484612a22565b95945050505050565b6060611503611bc083611afe565b612acf565b6000611503825b6000602182600001511115611c28576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e000000000000604482015290519081900360640190fd5b6000806000611c36856126f9565b919450925090506000816001811115611c4b57fe5b14611c9d576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e000000000000604482015290519081900360640190fd5b602080860151840180519091841015611cbc5760208490036101000a90045b9695505050505050565b6000611cda611cd484612c45565b83612d41565b5180516020909101209392505050565b60606000611cf783611bb2565b9050600081516001600160401b0381118015611d1257600080fd5b50604051908082528060200260200182016040528015611d4c57816020015b611d396137ab565b815260200190600190039081611d315790505b50905060005b8251811015611db8576000611d79848381518110611d6c57fe5b6020026020010151611b23565b90506040518060400160405280828152602001611d9583611bb2565b815250838381518110611da457fe5b602090810291909101015250600101611d52565b509392505050565b60006060818080611dd087612c45565b905085600080611dde6137ab565b60005b8c5181101561213b578c8181518110611df657fe5b6020026020010151915082840193506001870196508360001415611e6a57815180516020909101208514611e65576040805162461bcd60e51b8152602060048201526011602482015270092dcecc2d8d2c840e4dedee840d0c2e6d607b1b604482015290519081900360640190fd5b611f31565b815151602011611ed157815180516020909101208514611e65576040805162461bcd60e51b815260206004820152601b60248201527f496e76616c6964206c6172676520696e7465726e616c20686173680000000000604482015290519081900360640190fd5b84611edf8360000151612dd5565b14611f31576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420696e7465726e616c206e6f64652068617368000000000000604482015290519081900360640190fd5b60208201515160111415611fa0578551841415611f4d5761213b565b6000868581518110611f5b57fe5b602001015160f81c60f81b60f81c9050600083602001518260ff1681518110611f8057fe5b60200260200101519050611f9381612e01565b9650600194505050612133565b600282602001515114156120e6576000611fb983612e37565b9050600081600081518110611fca57fe5b016020015160f81c9050600181166002036000611fea8460ff8416612e55565b90506000611ff88b8a612e55565b905060006120068383612e86565b905060ff85166002148061201d575060ff85166003145b1561204f578083511480156120325750808251145b1561203c57988901985b50600160ff1b995061213b945050505050565b60ff85161580612062575060ff85166001145b156120af578061207f5750600160ff1b995061213b945050505050565b6120a0886020015160018151811061209357fe5b6020026020010151612e01565b9a509750612133945050505050565b60405162461bcd60e51b81526004018080602001828103825260268152602001806141ff6026913960400191505060405180910390fd5b6040805162461bcd60e51b815260206004820152601d60248201527f526563656976656420616e20756e706172736561626c65206e6f64652e000000604482015290519081900360640190fd5b600101611de1565b50600160ff1b84148661214e8786612e55565b909e909d50909b509950505050505050505050565b60606000839050600086600187038151811061217b57fe5b60200260200101519050600061219082612eec565b6040805160038082526080820190925291925060009190816020015b6121b46137ab565b8152602001906001900390816121ac5790505090506000845160001480156121e7575060028360028111156121e557fe5b145b1561221d576121fe6121f885612fc2565b88612d41565b82828151811061220a57fe5b602090810291909101015260010161245e565b600083600281111561222b57fe5b1415612291578451612260576122418488612fd5565b82828151811061224d57fe5b602090810291909101015260010161228c565b8382828151811061226d57fe5b60200260200101819052506001810190506121fe6121f8866001612e55565b61245e565b600061229c85612fc2565b905060006122aa8288612e86565b9050801561230b5760006122c083600084613020565b90506122d4816122cf8c613170565b6131b1565b8585815181106122e057fe5b60200260200101819052506001840193506122fb8383612e55565b92506123078883612e55565b9750505b60006123156131f5565b905082516000141561233a576123338161232e896126dd565b612fd5565b90506123d2565b60008360008151811061234957fe5b016020015160f81c905061235e846001612e55565b9350600287600281111561236e57fe5b14156123a9576000612388856123838b6126dd565b612d41565b90506123a1838361239c8460000151613170565b613282565b9250506123d0565b8351156123bf576000612388856122cf8b6126dd565b6123cd828261239c8b6126dd565b91505b505b8751612407576123e2818b612fd5565b9050808585815181106123f157fe5b602002602001018190525060018401935061245a565b612412886001612e55565b97508085858151811061242157fe5b602002602001018190525060018401935061243c888b612d41565b85858151811061244857fe5b60200260200101819052506001840193505b5050505b61246d8a60018b0384846132db565b9a9950505050505050505050565b60008061248783612c45565b90506124916137ab565b84516000906060905b80156125bf578760018203815181106124af57fe5b602002602001015193506124c284612eec565b925060028360028111156124d257fe5b14156124fd5760006124e385612fc2565b90506124f58660008351895103613020565b9550506125a9565b600183600281111561250b57fe5b141561254b57600061251c85612fc2565b905061252e8660008351895103613020565b8351909650156125455761254281846131b1565b94505b506125a9565b600083600281111561255957fe5b14156125a9578151156125a95760008560018751038151811061257857fe5b602001015160f81c60f81b60f81c90506125988660006001895103613020565b95506125a5858285613282565b9450505b83516125b490613170565b91506000190161249a565b50509051805160209091012095945050505050565b60608151600014156125f5575060408051600081526020810190915261097a565b6000805b83518110156126285783818151811061260e57fe5b6020026020010151518201915080806001019150506125f9565b6000826001600160401b038111801561264057600080fd5b506040519080825280601f01601f19166020018201604052801561266b576020820181803683370190505b50600092509050602081015b85518310156126d457600086848151811061268e57fe5b6020026020010151905060006020820190506126ac838284516133bd565b8785815181106126b857fe5b6020026020010151518301925050508280600101935050612677565b50949350505050565b60208101518051606091611503916000198101908110611d6c57fe5b600080600080846000015111612756576040805162461bcd60e51b815260206004820152601860248201527f524c50206974656d2063616e6e6f74206265206e756c6c2e0000000000000000604482015290519081900360640190fd5b6020840151805160001a607f811161277b576000600160009450945094505050612a1b565b60b781116127f0578551607f1982019081106127de576040805162461bcd60e51b815260206004820152601960248201527f496e76616c696420524c502073686f727420737472696e672e00000000000000604482015290519081900360640190fd5b60019550935060009250612a1b915050565b60bf81116128d457855160b6198201908110612853576040805162461bcd60e51b815260206004820152601f60248201527f496e76616c696420524c50206c6f6e6720737472696e67206c656e6774682e00604482015290519081900360640190fd5b6000816020036101000a60018501510490508082018860000151116128bf576040805162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c50206c6f6e6720737472696e672e0000000000000000604482015290519081900360640190fd5b60019091019550935060009250612a1b915050565b60f7811161294857855160bf198201908110612937576040805162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c502073686f7274206c6973742e000000000000000000604482015290519081900360640190fd5b600195509350849250612a1b915050565b855160f61982019081106129a3576040805162461bcd60e51b815260206004820152601d60248201527f496e76616c696420524c50206c6f6e67206c697374206c656e6774682e000000604482015290519081900360640190fd5b6000816020036101000a6001850151049050808201886000015111612a08576040805162461bcd60e51b815260206004820152601660248201527524b73b30b634b210292628103637b733903634b9ba1760511b604482015290519081900360640190fd5b6001918201965094509250612a1b915050565b9193909250565b60606000826001600160401b0381118015612a3c57600080fd5b506040519080825280601f01601f191660200182016040528015612a67576020820181803683370190505b509050805160001415612a7b579050611671565b8484016020820160005b60208604811015612aa6578251825260209283019290910190600101612a85565b5080519151601f959095166020036101000a600019019182169119909416179092525092915050565b6060600080612add846126f9565b91935090915060019050816001811115612af357fe5b14612b45576040805162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c50206c6973742076616c75652e000000000000000000604482015290519081900360640190fd5b6040805160208082526104208201909252600091816020015b612b66613791565b815260200190600190039081612b5e5790505090506000835b8651811015612c3a5760208210612bc75760405162461bcd60e51b815260040180806020018281038252602a8152602001806141d5602a913960400191505060405180910390fd5b600080612bf36040518060400160405280858c60000151038152602001858c60200151018152506126f9565b509150915060405180604001604052808383018152602001848b6020015101815250858581518110612c2157fe5b6020908102919091010152600193909301920101612b7f565b508152949350505050565b6060600082516002026001600160401b0381118015612c6357600080fd5b506040519080825280601f01601f191660200182016040528015612c8e576020820181803683370190505b50905060005b8351811015612d3a576004848281518110612cab57fe5b602001015160f81c60f81b6001600160f81b031916901c828260020281518110612cd157fe5b60200101906001600160f81b031916908160001a9053506010848281518110612cf657fe5b016020015160f81c81612d0557fe5b0660f81b828260020260010181518110612d1b57fe5b60200101906001600160f81b031916908160001a905350600101612c94565b5092915050565b612d496137ab565b60408051600280825260608201909252600091816020015b6060815260200190600190039081612d615790505090506000612d85856001613401565b9050612d936103ef82613558565b82600081518110612da057fe5b6020026020010181905250612db48461149f565b82600181518110612dc157fe5b6020026020010181905250611ba982613628565b6000602082511015612dec5750602081015161097a565b81806020019051602081101561097557600080fd5b60006060602083600001511015612e2257612e1b83613657565b9050612e2e565b612e2b83611b23565b90505b61167181612dd5565b6060611503612e508360200151600081518110611d6c57fe5b612c45565b60608183510360001415612e785750604080516020810190915260008152611503565b611671838384865103613020565b6000805b808451118015612e9a5750808351115b8015612edf5750828181518110612ead57fe5b602001015160f81c60f81b6001600160f81b031916848281518110612ece57fe5b01602001516001600160f81b031916145b1561167157600101612e8a565b60208101515160009060111415612f055750600061097a565b60028260200151511415612f81576000612f1e83612e37565b9050600081600081518110612f2f57fe5b016020015160f81c90506002811480612f4b575060ff81166003145b15612f5b5760029250505061097a565b60ff81161580612f6e575060ff81166001145b15612f7e5760019250505061097a565b50505b6040805162461bcd60e51b8152602060048201526011602482015270496e76616c6964206e6f6465207479706560781b604482015290519081900360640190fd5b6060611503612fd083612e37565b613662565b612fdd6137ab565b6000612fe88361149f565b9050612ff381611afe565b60208501518051600019810190811061300857fe5b602002602001018190525061152784602001516136ab565b60608182601f01101561306b576040805162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b604482015290519081900360640190fd5b8282840110156130b3576040805162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b604482015290519081900360640190fd5b818301845110156130ff576040805162461bcd60e51b8152602060048201526011602482015270736c6963655f6f75744f66426f756e647360781b604482015290519081900360640190fd5b60608215801561311e57604051915060008252602082016040526126d4565b6040519150601f8416801560200281840101858101878315602002848b0101015b8183101561315757805183526020928301920161313f565b5050858452601f01601f19166040525050949350505050565b606060208251101561318357508061097a565b818051906020012060405160200180828152602001915050604051602081830303815290604052905061097a565b6131b96137ab565b60408051600280825260608201909252600091816020015b60608152602001906001900390816131d15790505090506000612d85856000613401565b6131fd6137ab565b6040805160118082526102408201909252600091816020015b606081526020019060019003908161321657905050905060005b815181101561327257604051806040016040528060018152602001600160ff1b81525082828151811061325f57fe5b6020908102919091010152600101613230565b5061327c81613628565b91505090565b61328a6137ab565b600060208351106132a35761329e8361149f565b6132a5565b825b90506132b081611afe565b85602001518560ff16815181106132c357fe5b6020026020010181905250611ba985602001516136ab565b606060008285016001600160401b03811180156132f757600080fd5b5060405190808252806020026020018201604052801561333157816020015b61331e6137ab565b8152602001906001900390816133165790505b50905060005b858110156133725786818151811061334b57fe5b602002602001015182828151811061335f57fe5b6020908102919091010152600101613337565b5060005b838110156133b35784818151811061338a57fe5b602002602001015182878301815181106133a057fe5b6020908102919091010152600101613376565b5095945050505050565b8282825b602081106133e0578151835260209283019290910190601f19016133c1565b905182516020929092036101000a6000190180199091169116179052505050565b6060600082613411576000613414565b60025b90506000600285518161342357fe5b06905060008160020360ff166001600160401b038111801561344457600080fd5b506040519080825280601f01601f19166020018201604052801561346f576020820181803683370190505b50905081830160f81b8160008151811061348557fe5b60200101906001600160f81b031916908160001a90535080866040516020018083805190602001908083835b602083106134d05780518252601f1990920191602091820191016134b1565b51815160209384036101000a600019018019909216911617905285519190930192850191508083835b602083106135185780518252601f1990920191602091820191016134f9565b6001836020036101000a03801982511681845116808217855250505050505090500192505050604051602081830303815290604052935050505092915050565b60606000600283518161356757fe5b046001600160401b038111801561357d57600080fd5b506040519080825280601f01601f1916602001820160405280156135a8576020820181803683370190505b50905060005b8151811015612d3a578381600202600101815181106135c957fe5b602001015160f81c60f81b60048583600202815181106135e557fe5b602001015160f81c60f81b6001600160f81b031916901b1782828151811061360957fe5b60200101906001600160f81b031916908160001a9053506001016135ae565b6136306137ab565b600061363b836119ac565b9050604051806040016040528082815260200161178583611bb2565b606061150382613754565b606060028260008151811061367357fe5b016020015160f81c8161368257fe5b0660ff16600014156136a057613699826002612e55565b905061097a565b613699826001612e55565b6136b36137ab565b600082516001600160401b03811180156136cc57600080fd5b5060405190808252806020026020018201604052801561370057816020015b60608152602001906001900390816136eb5790505b50905060005b835181101561374a5761372b84828151811061371e57fe5b6020026020010151613657565b82828151811061373757fe5b6020908102919091010152600101613706565b5061167181613628565b6060611503826020015160008460000151612a22565b60408051608081018252600080825260208201819052918101829052606081019190915290565b604051806040016040528060008152602001600081525090565b604051806040016040528060608152602001606081525090565b60006001600160401b038311156137d857fe5b6137eb601f8401601f1916602001614169565b90508281528383830111156137ff57600080fd5b828260208301376000602084830101529392505050565b803561097a816141bc565b8051801515811461097a57600080fd5b600082601f830112613841578081fd5b611671838335602085016137c5565b80356002811061097a57600080fd5b600080600060608486031215613873578283fd5b833561387e816141bc565b9250602084013561388e816141bc565b915060408401356001600160401b038111156138a8578182fd5b6138b486828701613831565b9150509250925092565b6000806000606084860312156138d2578283fd5b83356138dd816141bc565b92506020840135915060408401356001600160401b038111156138a8578182fd5b60008060408385031215613910578182fd5b823561391b816141bc565b915060208301356001600160401b03811115613935578182fd5b61394185828601613831565b9150509250929050565b60006020828403121561395c578081fd5b61167182613821565b600060208284031215613976578081fd5b5051919050565b60006020828403121561398e578081fd5b81356001600160401b038111156139a3578182fd5b8201601f810184136139b3578182fd5b611527848235602084016137c5565b600060c082840312156139d3578081fd5b60405160c081018181106001600160401b03821117156139ef57fe5b8060405250825181526020830151602082015260408301516040820152606083015160608201526080830151613a24816141bc565b6080820152613a3560a08401613821565b60a08201529392505050565b600060208284031215613a52578081fd5b81356001600160401b0380821115613a68578283fd5b9083019060e08286031215613a7b578283fd5b613a8560e0614169565b8235815260208301356020820152613a9f60408401613850565b6040820152613ab060608401613816565b6060820152613ac160808401613816565b608082015260a083013560a082015260c083013582811115613ae1578485fd5b613aed87828601613831565b60c08301525095945050505050565b6001600160a01b03169052565b60008151808452613b2181602086016020860161418c565b601f01601f19169290920160200192915050565b60609190911b6bffffffffffffffffffffffff1916815260140190565b90815260200190565b60008351613b6d81846020880161418c565b835190830190613b8181836020880161418c565b01949350505050565b600088825287602083015260028710613b9f57fe5b8660f81b60408301526bffffffffffffffffffffffff19808760601b166041840152808660601b166055840152508360698301528251613be681608985016020870161418c565b9190910160890198975050505050505050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039390931683526020830191909152604082015260600190565b600060e08201905060018060a01b038085168352835160208401526020840151604084015260408401516060840152606084015160808401528060808501511660a08401525060a0830151151560c08301529392505050565b901515815260200190565b6020810160038310613cb957fe5b91905290565b60208082526025908201527f53746f7261676520736c6f742068617320616c7265616479206265656e20707260408201526437bb32b71760d91b606082015260800190565b60208082526026908201527f4163636f756e742073746174652068617320616c7265616479206265656e20706040820152653937bb32b71760d11b606082015260800190565b6020808252603e908201527f416c6c206163636f756e7473206d75737420626520636f6d6d6974746564206260408201527f65666f726520636f6d706c6574696e672061207472616e736974696f6e2e0000606082015260800190565b602080825260409082018190527f53746f7261676520736c6f742076616c7565207761736e2774206368616e6765908201527f64206f722068617320616c7265616479206265656e20636f6d6d69747465642e606082015260800190565b6020808252605b908201527f4f564d5f53746174655472616e736974696f6e65723a2050726f76696465642060408201527f4c3120636f6e747261637420636f6465206861736820646f6573206e6f74206d60608201527f61746368204c3220636f6e747261637420636f646520686173682e0000000000608082015260a00190565b6020808252603f908201527f416c6c2073746f72616765206d75737420626520636f6d6d697474656420626560408201527f666f726520636f6d6d697474696e67206163636f756e74207374617465732e00606082015260800190565b60208082526038908201527f4e6f7420656e6f7567682067617320746f2065786563757465207472616e736160408201527f6374696f6e2064657465726d696e6973746963616c6c792e0000000000000000606082015260800190565b6020808252603b908201527f4163636f756e74207374617465207761736e2774206368616e676564206f722060408201527f68617320616c7265616479206265656e20636f6d6d69747465642e0000000000606082015260800190565b6020808252603d908201527f416c6c2073746f72616765206d75737420626520636f6d6d697474656420626560408201527f666f726520636f6d706c6574696e672061207472616e736974696f6e2e000000606082015260800190565b60208082526031908201527f46756e6374696f6e206d7573742062652063616c6c656420647572696e67207460408201527034329031b7b93932b1ba10383430b9b29760791b606082015260800190565b6020808252601d908201527f496e76616c6964207472616e73616374696f6e2070726f76696465642e000000604082015260600190565b60208082526038908201527f436f6e7472616374206d757374206265207665726966696564206265666f726560408201527f2070726f76696e6720612073746f7261676520736c6f742e0000000000000000606082015260800190565b600060408252835160408301526020840151606083015260408401516002811061410757fe5b60808381019190915260608501516001600160a01b031660a084015284015161413360c0840182613afc565b5060a084015160e083015260c084015160e0610100840152614159610120840182613b09565b9150506116716020830184613afc565b6040518181016001600160401b038111828210171561418457fe5b604052919050565b60005b838110156141a757818101518382015260200161418f565b838111156141b6576000848401525b50505050565b6001600160a01b03811681146141d157600080fd5b5056fe50726f766964656420524c50206c6973742065786365656473206d6178206c697374206c656e6774682e52656365697665642061206e6f6465207769746820616e20756e6b6e6f776e20707265666978a164736f6c6343000706000a4372656174652063616e206f6e6c7920626520646f6e6520627920746865204f564d5f467261756456657269666965722ea164736f6c6343000706000a", + "solcInputHash": "5ee8e508e2c54cb5ac6783b4855b1558", + "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_stateTransitionIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"_preStateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"_transactionHash\",\"type\":\"bytes32\"}],\"name\":\"create\",\"outputs\":[{\"internalType\":\"contract iOVM_StateTransitioner\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The State Transitioner Factory is used by the Fraud Verifier to create a new State Transitioner during the initialization of a fraud proof. Compiler used: solc Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"create(address,uint256,bytes32,bytes32)\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\",\"_preStateRoot\":\"State root before the transition was executed.\",\"_stateTransitionIndex\":\"Index of the state transition being verified.\",\"_transactionHash\":\"Hash of the executed transaction.\"},\"returns\":{\"_0\":\"New OVM_StateTransitioner instance.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}}},\"title\":\"OVM_StateTransitionerFactory\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"create(address,uint256,bytes32,bytes32)\":{\"notice\":\"Creates a new OVM_StateTransitioner\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/OVM/verification/OVM_StateTransitionerFactory.sol\":\"OVM_StateTransitionerFactory\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor () internal {\\n address msgSender = _msgSender();\\n _owner = msgSender;\\n emit OwnershipTransferred(address(0), msgSender);\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n emit OwnershipTransferred(_owner, address(0));\\n _owner = address(0);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n emit OwnershipTransferred(_owner, newOwner);\\n _owner = newOwner;\\n }\\n}\\n\",\"keccak256\":\"0x15e2d5bd4c28a88548074c54d220e8086f638a71ed07e6b3ba5a70066fcf458d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with GSN meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address payable) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes memory) {\\n this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x8d3cb350f04ff49cfb10aef08d87f19dcbaecc8027b0bed12f3275cd12f38cf0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/verification/Abs_FraudContributor.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\nimport { iOVM_BondManager } from \\\"../../iOVM/verification/iOVM_BondManager.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/// Minimal contract to be inherited by contracts consumed by users that provide\\n/// data for fraud proofs\\nabstract contract Abs_FraudContributor is Lib_AddressResolver {\\n /// Decorate your functions with this modifier to store how much total gas was\\n /// consumed by the sender, to reward users fairly\\n modifier contributesToFraudProof(bytes32 preStateRoot, bytes32 txHash) {\\n uint256 startGas = gasleft();\\n _;\\n uint256 gasSpent = startGas - gasleft();\\n iOVM_BondManager(resolve('OVM_BondManager')).recordGasSpent(preStateRoot, txHash, msg.sender, gasSpent);\\n }\\n}\\n\",\"keccak256\":\"0x6c27d089a297103cb93b30f7649ab68691cc6b948c315f1037e5de1fe9bf5903\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/verification/OVM_StateTransitioner.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// @unsupported: ovm\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\nimport { Lib_EthUtils } from \\\"../../libraries/utils/Lib_EthUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../../libraries/utils/Lib_Bytes32Utils.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../../libraries/utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_SecureMerkleTrie } from \\\"../../libraries/trie/Lib_SecureMerkleTrie.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../../libraries/rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_RLPReader } from \\\"../../libraries/rlp/Lib_RLPReader.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_StateTransitioner } from \\\"../../iOVM/verification/iOVM_StateTransitioner.sol\\\";\\nimport { iOVM_BondManager } from \\\"../../iOVM/verification/iOVM_BondManager.sol\\\";\\nimport { iOVM_ExecutionManager } from \\\"../../iOVM/execution/iOVM_ExecutionManager.sol\\\";\\nimport { iOVM_StateManager } from \\\"../../iOVM/execution/iOVM_StateManager.sol\\\";\\nimport { iOVM_StateManagerFactory } from \\\"../../iOVM/execution/iOVM_StateManagerFactory.sol\\\";\\n\\n/* Contract Imports */\\nimport { Abs_FraudContributor } from \\\"./Abs_FraudContributor.sol\\\";\\n\\n/**\\n * @title OVM_StateTransitioner\\n * @dev The State Transitioner coordinates the execution of a state transition during the evaluation of a\\n * fraud proof. It feeds verified input to the Execution Manager's run(), and controls a State Manager (which is\\n * uniquely created for each fraud proof).\\n * Once a fraud proof has been initialized, this contract is provided with the pre-state root and verifies\\n * that the OVM storage slots committed to the State Mangager are contained in that state\\n * This contract controls the State Manager and Execution Manager, and uses them to calculate the\\n * post-state root by applying the transaction. The Fraud Verifier can then check for fraud by comparing\\n * the calculated post-state root with the proposed post-state root.\\n *\\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract OVM_StateTransitioner is Lib_AddressResolver, Abs_FraudContributor, iOVM_StateTransitioner {\\n\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n enum TransitionPhase {\\n PRE_EXECUTION,\\n POST_EXECUTION,\\n COMPLETE\\n }\\n\\n\\n /*******************************************\\n * Contract Variables: Contract References *\\n *******************************************/\\n\\n iOVM_StateManager public ovmStateManager;\\n\\n\\n /*******************************************\\n * Contract Variables: Internal Accounting *\\n *******************************************/\\n\\n bytes32 internal preStateRoot;\\n bytes32 internal postStateRoot;\\n TransitionPhase public phase;\\n uint256 internal stateTransitionIndex;\\n bytes32 internal transactionHash;\\n\\n\\n /*************\\n * Constants *\\n *************/\\n\\n bytes32 internal constant EMPTY_ACCOUNT_CODE_HASH = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;\\n bytes32 internal constant EMPTY_ACCOUNT_STORAGE_ROOT = 0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n * @param _stateTransitionIndex Index of the state transition being verified.\\n * @param _preStateRoot State root before the transition was executed.\\n * @param _transactionHash Hash of the executed transaction.\\n */\\n constructor(\\n address _libAddressManager,\\n uint256 _stateTransitionIndex,\\n bytes32 _preStateRoot,\\n bytes32 _transactionHash\\n )\\n Lib_AddressResolver(_libAddressManager)\\n {\\n stateTransitionIndex = _stateTransitionIndex;\\n preStateRoot = _preStateRoot;\\n postStateRoot = _preStateRoot;\\n transactionHash = _transactionHash;\\n\\n ovmStateManager = iOVM_StateManagerFactory(resolve(\\\"OVM_StateManagerFactory\\\")).create(address(this));\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n /**\\n * Checks that a function is only run during a specific phase.\\n * @param _phase Phase the function must run within.\\n */\\n modifier onlyDuringPhase(\\n TransitionPhase _phase\\n ) {\\n require(\\n phase == _phase,\\n \\\"Function must be called during the correct phase.\\\"\\n );\\n _;\\n }\\n\\n\\n /**********************************\\n * Public Functions: State Access *\\n **********************************/\\n\\n /**\\n * Retrieves the state root before execution.\\n * @return _preStateRoot State root before execution.\\n */\\n function getPreStateRoot()\\n override\\n public\\n view\\n returns (\\n bytes32 _preStateRoot\\n )\\n {\\n return preStateRoot;\\n }\\n\\n /**\\n * Retrieves the state root after execution.\\n * @return _postStateRoot State root after execution.\\n */\\n function getPostStateRoot()\\n override\\n public\\n view\\n returns (\\n bytes32 _postStateRoot\\n )\\n {\\n return postStateRoot;\\n }\\n\\n /**\\n * Checks whether the transitioner is complete.\\n * @return _complete Whether or not the transition process is finished.\\n */\\n function isComplete()\\n override\\n public\\n view\\n returns (\\n bool _complete\\n )\\n {\\n return phase == TransitionPhase.COMPLETE;\\n }\\n\\n\\n /***********************************\\n * Public Functions: Pre-Execution *\\n ***********************************/\\n\\n /**\\n * Allows a user to prove the initial state of a contract.\\n * @param _ovmContractAddress Address of the contract on the OVM.\\n * @param _ethContractAddress Address of the corresponding contract on L1.\\n * @param _stateTrieWitness Proof of the account state.\\n */\\n function proveContractState(\\n address _ovmContractAddress,\\n address _ethContractAddress,\\n bytes memory _stateTrieWitness\\n )\\n override\\n public\\n onlyDuringPhase(TransitionPhase.PRE_EXECUTION)\\n contributesToFraudProof(preStateRoot, transactionHash)\\n {\\n // Exit quickly to avoid unnecessary work.\\n require(\\n (\\n ovmStateManager.hasAccount(_ovmContractAddress) == false\\n && ovmStateManager.hasEmptyAccount(_ovmContractAddress) == false\\n ),\\n \\\"Account state has already been proven.\\\"\\n );\\n\\n // Function will fail if the proof is not a valid inclusion or exclusion proof.\\n (\\n bool exists,\\n bytes memory encodedAccount\\n ) = Lib_SecureMerkleTrie.get(\\n abi.encodePacked(_ovmContractAddress),\\n _stateTrieWitness,\\n preStateRoot\\n );\\n\\n if (exists == true) {\\n // Account exists, this was an inclusion proof.\\n Lib_OVMCodec.EVMAccount memory account = Lib_OVMCodec.decodeEVMAccount(\\n encodedAccount\\n );\\n\\n address ethContractAddress = _ethContractAddress;\\n if (account.codeHash == EMPTY_ACCOUNT_CODE_HASH) {\\n // Use a known empty contract to prevent an attack in which a user provides a\\n // contract address here and then later deploys code to it.\\n ethContractAddress = 0x0000000000000000000000000000000000000000;\\n } else {\\n // Otherwise, make sure that the code at the provided eth address matches the hash\\n // of the code stored on L2.\\n require(\\n Lib_EthUtils.getCodeHash(ethContractAddress) == account.codeHash,\\n \\\"OVM_StateTransitioner: Provided L1 contract code hash does not match L2 contract code hash.\\\"\\n );\\n }\\n\\n ovmStateManager.putAccount(\\n _ovmContractAddress,\\n Lib_OVMCodec.Account({\\n nonce: account.nonce,\\n balance: account.balance,\\n storageRoot: account.storageRoot,\\n codeHash: account.codeHash,\\n ethAddress: ethContractAddress,\\n isFresh: false\\n })\\n );\\n } else {\\n // Account does not exist, this was an exclusion proof.\\n ovmStateManager.putEmptyAccount(_ovmContractAddress);\\n }\\n }\\n\\n /**\\n * Allows a user to prove the initial state of a contract storage slot.\\n * @param _ovmContractAddress Address of the contract on the OVM.\\n * @param _key Claimed account slot key.\\n * @param _storageTrieWitness Proof of the storage slot.\\n */\\n function proveStorageSlot(\\n address _ovmContractAddress,\\n bytes32 _key,\\n bytes memory _storageTrieWitness\\n )\\n override\\n public\\n onlyDuringPhase(TransitionPhase.PRE_EXECUTION)\\n contributesToFraudProof(preStateRoot, transactionHash)\\n {\\n // Exit quickly to avoid unnecessary work.\\n require(\\n ovmStateManager.hasContractStorage(_ovmContractAddress, _key) == false,\\n \\\"Storage slot has already been proven.\\\"\\n );\\n\\n require(\\n ovmStateManager.hasAccount(_ovmContractAddress) == true,\\n \\\"Contract must be verified before proving a storage slot.\\\"\\n );\\n\\n bytes32 storageRoot = ovmStateManager.getAccountStorageRoot(_ovmContractAddress);\\n bytes32 value;\\n\\n if (storageRoot == EMPTY_ACCOUNT_STORAGE_ROOT) {\\n // Storage trie was empty, so the user is always allowed to insert zero-byte values.\\n value = bytes32(0);\\n } else {\\n // Function will fail if the proof is not a valid inclusion or exclusion proof.\\n (\\n bool exists,\\n bytes memory encodedValue\\n ) = Lib_SecureMerkleTrie.get(\\n abi.encodePacked(_key),\\n _storageTrieWitness,\\n storageRoot\\n );\\n\\n if (exists == true) {\\n // Inclusion proof.\\n // Stored values are RLP encoded, with leading zeros removed.\\n value = Lib_BytesUtils.toBytes32PadLeft(\\n Lib_RLPReader.readBytes(encodedValue)\\n );\\n } else {\\n // Exclusion proof, can only be zero bytes.\\n value = bytes32(0);\\n }\\n }\\n\\n ovmStateManager.putContractStorage(\\n _ovmContractAddress,\\n _key,\\n value\\n );\\n }\\n\\n\\n /*******************************\\n * Public Functions: Execution *\\n *******************************/\\n\\n /**\\n * Executes the state transition.\\n * @param _transaction OVM transaction to execute.\\n */\\n function applyTransaction(\\n Lib_OVMCodec.Transaction memory _transaction\\n )\\n override\\n public\\n onlyDuringPhase(TransitionPhase.PRE_EXECUTION)\\n contributesToFraudProof(preStateRoot, transactionHash)\\n {\\n require(\\n Lib_OVMCodec.hashTransaction(_transaction) == transactionHash,\\n \\\"Invalid transaction provided.\\\"\\n );\\n\\n // We require gas to complete the logic here in run() before/after execution,\\n // But must ensure the full _tx.gasLimit can be given to the ovmCALL (determinism)\\n // This includes 1/64 of the gas getting lost because of EIP-150 (lost twice--first\\n // going into EM, then going into the code contract).\\n require(\\n gasleft() >= 100000 + _transaction.gasLimit * 1032 / 1000, // 1032/1000 = 1.032 = (64/63)^2 rounded up\\n \\\"Not enough gas to execute transaction deterministically.\\\"\\n );\\n\\n iOVM_ExecutionManager ovmExecutionManager = iOVM_ExecutionManager(resolve(\\\"OVM_ExecutionManager\\\"));\\n\\n // We call `setExecutionManager` right before `run` (and not earlier) just in case the\\n // OVM_ExecutionManager address was updated between the time when this contract was created\\n // and when `applyTransaction` was called.\\n ovmStateManager.setExecutionManager(address(ovmExecutionManager));\\n\\n // `run` always succeeds *unless* the user hasn't provided enough gas to `applyTransaction`\\n // or an INVALID_STATE_ACCESS flag was triggered. Either way, we won't get beyond this line\\n // if that's the case.\\n ovmExecutionManager.run(_transaction, address(ovmStateManager));\\n\\n // Prevent the Execution Manager from calling this SM again.\\n ovmStateManager.setExecutionManager(address(0));\\n phase = TransitionPhase.POST_EXECUTION;\\n }\\n\\n\\n /************************************\\n * Public Functions: Post-Execution *\\n ************************************/\\n\\n /**\\n * Allows a user to commit the final state of a contract.\\n * @param _ovmContractAddress Address of the contract on the OVM.\\n * @param _stateTrieWitness Proof of the account state.\\n */\\n function commitContractState(\\n address _ovmContractAddress,\\n bytes memory _stateTrieWitness\\n )\\n override\\n public\\n onlyDuringPhase(TransitionPhase.POST_EXECUTION)\\n contributesToFraudProof(preStateRoot, transactionHash)\\n {\\n require(\\n ovmStateManager.getTotalUncommittedContractStorage() == 0,\\n \\\"All storage must be committed before committing account states.\\\"\\n );\\n\\n require (\\n ovmStateManager.commitAccount(_ovmContractAddress) == true,\\n \\\"Account state wasn't changed or has already been committed.\\\"\\n );\\n\\n Lib_OVMCodec.Account memory account = ovmStateManager.getAccount(_ovmContractAddress);\\n\\n postStateRoot = Lib_SecureMerkleTrie.update(\\n abi.encodePacked(_ovmContractAddress),\\n Lib_OVMCodec.encodeEVMAccount(\\n Lib_OVMCodec.toEVMAccount(account)\\n ),\\n _stateTrieWitness,\\n postStateRoot\\n );\\n\\n // Emit an event to help clients figure out the proof ordering.\\n emit AccountCommitted(\\n _ovmContractAddress\\n );\\n }\\n\\n /**\\n * Allows a user to commit the final state of a contract storage slot.\\n * @param _ovmContractAddress Address of the contract on the OVM.\\n * @param _key Claimed account slot key.\\n * @param _storageTrieWitness Proof of the storage slot.\\n */\\n function commitStorageSlot(\\n address _ovmContractAddress,\\n bytes32 _key,\\n bytes memory _storageTrieWitness\\n )\\n override\\n public\\n onlyDuringPhase(TransitionPhase.POST_EXECUTION)\\n contributesToFraudProof(preStateRoot, transactionHash)\\n {\\n require(\\n ovmStateManager.commitContractStorage(_ovmContractAddress, _key) == true,\\n \\\"Storage slot value wasn't changed or has already been committed.\\\"\\n );\\n\\n Lib_OVMCodec.Account memory account = ovmStateManager.getAccount(_ovmContractAddress);\\n bytes32 value = ovmStateManager.getContractStorage(_ovmContractAddress, _key);\\n\\n account.storageRoot = Lib_SecureMerkleTrie.update(\\n abi.encodePacked(_key),\\n Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(value)\\n ),\\n _storageTrieWitness,\\n account.storageRoot\\n );\\n\\n ovmStateManager.putAccount(_ovmContractAddress, account);\\n\\n // Emit an event to help clients figure out the proof ordering.\\n emit ContractStorageCommitted(\\n _ovmContractAddress,\\n _key\\n );\\n }\\n\\n\\n /**********************************\\n * Public Functions: Finalization *\\n **********************************/\\n\\n /**\\n * Finalizes the transition process.\\n */\\n function completeTransition()\\n override\\n public\\n onlyDuringPhase(TransitionPhase.POST_EXECUTION)\\n {\\n require(\\n ovmStateManager.getTotalUncommittedAccounts() == 0,\\n \\\"All accounts must be committed before completing a transition.\\\"\\n );\\n\\n require(\\n ovmStateManager.getTotalUncommittedContractStorage() == 0,\\n \\\"All storage must be committed before completing a transition.\\\"\\n );\\n\\n phase = TransitionPhase.COMPLETE;\\n }\\n}\\n\",\"keccak256\":\"0xc363807221625338a396c52a4bc3b7439e63972ac87521670c47745641e91fa6\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/OVM/verification/OVM_StateTransitionerFactory.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// @unsupported: ovm\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_StateTransitioner } from \\\"../../iOVM/verification/iOVM_StateTransitioner.sol\\\";\\nimport { iOVM_StateTransitionerFactory } from \\\"../../iOVM/verification/iOVM_StateTransitionerFactory.sol\\\";\\nimport { iOVM_FraudVerifier } from \\\"../../iOVM/verification/iOVM_FraudVerifier.sol\\\";\\n\\n/* Contract Imports */\\nimport { OVM_StateTransitioner } from \\\"./OVM_StateTransitioner.sol\\\";\\n\\n/**\\n * @title OVM_StateTransitionerFactory\\n * @dev The State Transitioner Factory is used by the Fraud Verifier to create a new State\\n * Transitioner during the initialization of a fraud proof.\\n *\\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract OVM_StateTransitionerFactory is iOVM_StateTransitionerFactory, Lib_AddressResolver {\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n constructor(\\n address _libAddressManager\\n )\\n Lib_AddressResolver(_libAddressManager)\\n {}\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Creates a new OVM_StateTransitioner\\n * @param _libAddressManager Address of the Address Manager.\\n * @param _stateTransitionIndex Index of the state transition being verified.\\n * @param _preStateRoot State root before the transition was executed.\\n * @param _transactionHash Hash of the executed transaction.\\n * @return New OVM_StateTransitioner instance.\\n */\\n function create(\\n address _libAddressManager,\\n uint256 _stateTransitionIndex,\\n bytes32 _preStateRoot,\\n bytes32 _transactionHash\\n )\\n override\\n public\\n returns (\\n iOVM_StateTransitioner\\n )\\n {\\n require(\\n msg.sender == resolve(\\\"OVM_FraudVerifier\\\"),\\n \\\"Create can only be done by the OVM_FraudVerifier.\\\"\\n );\\n\\n return new OVM_StateTransitioner(\\n _libAddressManager,\\n _stateTransitionIndex,\\n _preStateRoot,\\n _transactionHash\\n );\\n }\\n}\\n\",\"keccak256\":\"0x65ef11334a2d6931b6d3a85e7b29c39c774d19443e7040e132a58be505e3b52c\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/execution/iOVM_ExecutionManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\ninterface iOVM_ExecutionManager {\\n /**********\\n * Enums *\\n *********/\\n\\n enum RevertFlag {\\n OUT_OF_GAS,\\n INTENTIONAL_REVERT,\\n EXCEEDS_NUISANCE_GAS,\\n INVALID_STATE_ACCESS,\\n UNSAFE_BYTECODE,\\n CREATE_COLLISION,\\n STATIC_VIOLATION,\\n CREATOR_NOT_ALLOWED\\n }\\n\\n enum GasMetadataKey {\\n CURRENT_EPOCH_START_TIMESTAMP,\\n CUMULATIVE_SEQUENCER_QUEUE_GAS,\\n CUMULATIVE_L1TOL2_QUEUE_GAS,\\n PREV_EPOCH_SEQUENCER_QUEUE_GAS,\\n PREV_EPOCH_L1TOL2_QUEUE_GAS\\n }\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct GasMeterConfig {\\n uint256 minTransactionGasLimit;\\n uint256 maxTransactionGasLimit;\\n uint256 maxGasPerQueuePerEpoch;\\n uint256 secondsPerEpoch;\\n }\\n\\n struct GlobalContext {\\n uint256 ovmCHAINID;\\n }\\n\\n struct TransactionContext {\\n Lib_OVMCodec.QueueOrigin ovmL1QUEUEORIGIN;\\n uint256 ovmTIMESTAMP;\\n uint256 ovmNUMBER;\\n uint256 ovmGASLIMIT;\\n uint256 ovmTXGASLIMIT;\\n address ovmL1TXORIGIN;\\n }\\n\\n struct TransactionRecord {\\n uint256 ovmGasRefund;\\n }\\n\\n struct MessageContext {\\n address ovmCALLER;\\n address ovmADDRESS;\\n bool isStatic;\\n }\\n\\n struct MessageRecord {\\n uint256 nuisanceGasLeft;\\n }\\n\\n\\n /************************************\\n * Transaction Execution Entrypoint *\\n ************************************/\\n\\n function run(\\n Lib_OVMCodec.Transaction calldata _transaction,\\n address _txStateManager\\n ) external returns (bytes memory);\\n\\n\\n /*******************\\n * Context Opcodes *\\n *******************/\\n\\n function ovmCALLER() external view returns (address _caller);\\n function ovmADDRESS() external view returns (address _address);\\n function ovmTIMESTAMP() external view returns (uint256 _timestamp);\\n function ovmNUMBER() external view returns (uint256 _number);\\n function ovmGASLIMIT() external view returns (uint256 _gasLimit);\\n function ovmCHAINID() external view returns (uint256 _chainId);\\n\\n\\n /**********************\\n * L2 Context Opcodes *\\n **********************/\\n\\n function ovmL1QUEUEORIGIN() external view returns (Lib_OVMCodec.QueueOrigin _queueOrigin);\\n function ovmL1TXORIGIN() external view returns (address _l1TxOrigin);\\n\\n\\n /*******************\\n * Halting Opcodes *\\n *******************/\\n\\n function ovmREVERT(bytes memory _data) external;\\n\\n\\n /*****************************\\n * Contract Creation Opcodes *\\n *****************************/\\n\\n function ovmCREATE(bytes memory _bytecode) external returns (address _contract, bytes memory _revertdata);\\n function ovmCREATE2(bytes memory _bytecode, bytes32 _salt) external returns (address _contract, bytes memory _revertdata);\\n\\n\\n /*******************************\\n * Account Abstraction Opcodes *\\n ******************************/\\n\\n function ovmGETNONCE() external returns (uint256 _nonce);\\n function ovmINCREMENTNONCE() external;\\n function ovmCREATEEOA(bytes32 _messageHash, uint8 _v, bytes32 _r, bytes32 _s) external;\\n\\n\\n /****************************\\n * Contract Calling Opcodes *\\n ****************************/\\n\\n function ovmCALL(uint256 _gasLimit, address _address, bytes memory _calldata) external returns (bool _success, bytes memory _returndata);\\n function ovmSTATICCALL(uint256 _gasLimit, address _address, bytes memory _calldata) external returns (bool _success, bytes memory _returndata);\\n function ovmDELEGATECALL(uint256 _gasLimit, address _address, bytes memory _calldata) external returns (bool _success, bytes memory _returndata);\\n\\n\\n /****************************\\n * Contract Storage Opcodes *\\n ****************************/\\n\\n function ovmSLOAD(bytes32 _key) external returns (bytes32 _value);\\n function ovmSSTORE(bytes32 _key, bytes32 _value) external;\\n\\n\\n /*************************\\n * Contract Code Opcodes *\\n *************************/\\n\\n function ovmEXTCODECOPY(address _contract, uint256 _offset, uint256 _length) external returns (bytes memory _code);\\n function ovmEXTCODESIZE(address _contract) external returns (uint256 _size);\\n function ovmEXTCODEHASH(address _contract) external returns (bytes32 _hash);\\n\\n\\n /***************************************\\n * Public Functions: Execution Context *\\n ***************************************/\\n\\n function getMaxTransactionGasLimit() external view returns (uint _maxTransactionGasLimit);\\n}\\n\",\"keccak256\":\"0xf023d5d6fc6a03bd52f7a57af6e21076de77e8925d065bb79db062e73e43b684\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/execution/iOVM_StateManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title iOVM_StateManager\\n */\\ninterface iOVM_StateManager {\\n\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n enum ItemState {\\n ITEM_UNTOUCHED,\\n ITEM_LOADED,\\n ITEM_CHANGED,\\n ITEM_COMMITTED\\n }\\n\\n /***************************\\n * Public Functions: Misc *\\n ***************************/\\n\\n function isAuthenticated(address _address) external view returns (bool);\\n\\n /***************************\\n * Public Functions: Setup *\\n ***************************/\\n\\n function owner() external view returns (address _owner);\\n function ovmExecutionManager() external view returns (address _ovmExecutionManager);\\n function setExecutionManager(address _ovmExecutionManager) external;\\n\\n\\n /************************************\\n * Public Functions: Account Access *\\n ************************************/\\n\\n function putAccount(address _address, Lib_OVMCodec.Account memory _account) external;\\n function putEmptyAccount(address _address) external;\\n function getAccount(address _address) external view returns (Lib_OVMCodec.Account memory _account);\\n function hasAccount(address _address) external view returns (bool _exists);\\n function hasEmptyAccount(address _address) external view returns (bool _exists);\\n function setAccountNonce(address _address, uint256 _nonce) external;\\n function getAccountNonce(address _address) external view returns (uint256 _nonce);\\n function getAccountEthAddress(address _address) external view returns (address _ethAddress);\\n function getAccountStorageRoot(address _address) external view returns (bytes32 _storageRoot);\\n function initPendingAccount(address _address) external;\\n function commitPendingAccount(address _address, address _ethAddress, bytes32 _codeHash) external;\\n function testAndSetAccountLoaded(address _address) external returns (bool _wasAccountAlreadyLoaded);\\n function testAndSetAccountChanged(address _address) external returns (bool _wasAccountAlreadyChanged);\\n function commitAccount(address _address) external returns (bool _wasAccountCommitted);\\n function incrementTotalUncommittedAccounts() external;\\n function getTotalUncommittedAccounts() external view returns (uint256 _total);\\n function wasAccountChanged(address _address) external view returns (bool);\\n function wasAccountCommitted(address _address) external view returns (bool);\\n\\n\\n /************************************\\n * Public Functions: Storage Access *\\n ************************************/\\n\\n function putContractStorage(address _contract, bytes32 _key, bytes32 _value) external;\\n function getContractStorage(address _contract, bytes32 _key) external view returns (bytes32 _value);\\n function hasContractStorage(address _contract, bytes32 _key) external view returns (bool _exists);\\n function testAndSetContractStorageLoaded(address _contract, bytes32 _key) external returns (bool _wasContractStorageAlreadyLoaded);\\n function testAndSetContractStorageChanged(address _contract, bytes32 _key) external returns (bool _wasContractStorageAlreadyChanged);\\n function commitContractStorage(address _contract, bytes32 _key) external returns (bool _wasContractStorageCommitted);\\n function incrementTotalUncommittedContractStorage() external;\\n function getTotalUncommittedContractStorage() external view returns (uint256 _total);\\n function wasContractStorageChanged(address _contract, bytes32 _key) external view returns (bool);\\n function wasContractStorageCommitted(address _contract, bytes32 _key) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x7a11dbd1f61593ba34debe07e39eef59967307f7f372ba9855bee0953585d08d\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/execution/iOVM_StateManagerFactory.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Contract Imports */\\nimport { iOVM_StateManager } from \\\"./iOVM_StateManager.sol\\\";\\n\\n/**\\n * @title iOVM_StateManagerFactory\\n */\\ninterface iOVM_StateManagerFactory {\\n\\n /***************************************\\n * Public Functions: Contract Creation *\\n ***************************************/\\n\\n function create(\\n address _owner\\n )\\n external\\n returns (\\n iOVM_StateManager _ovmStateManager\\n );\\n}\\n\",\"keccak256\":\"0x27a90fc43889d0c7d1db50f37907ef7386d9b415d15a1e91a0a068cba59afd36\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/verification/iOVM_BondManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\ninterface ERC20 {\\n function transfer(address, uint256) external returns (bool);\\n function transferFrom(address, address, uint256) external returns (bool);\\n}\\n\\n/// All the errors which may be encountered on the bond manager\\nlibrary Errors {\\n string constant ERC20_ERR = \\\"BondManager: Could not post bond\\\";\\n string constant ALREADY_FINALIZED = \\\"BondManager: Fraud proof for this pre-state root has already been finalized\\\";\\n string constant SLASHED = \\\"BondManager: Cannot finalize withdrawal, you probably got slashed\\\";\\n string constant WRONG_STATE = \\\"BondManager: Wrong bond state for proposer\\\";\\n string constant CANNOT_CLAIM = \\\"BondManager: Cannot claim yet. Dispute must be finalized first\\\";\\n\\n string constant WITHDRAWAL_PENDING = \\\"BondManager: Withdrawal already pending\\\";\\n string constant TOO_EARLY = \\\"BondManager: Too early to finalize your withdrawal\\\";\\n\\n string constant ONLY_TRANSITIONER = \\\"BondManager: Only the transitioner for this pre-state root may call this function\\\";\\n string constant ONLY_FRAUD_VERIFIER = \\\"BondManager: Only the fraud verifier may call this function\\\";\\n string constant ONLY_STATE_COMMITMENT_CHAIN = \\\"BondManager: Only the state commitment chain may call this function\\\";\\n string constant WAIT_FOR_DISPUTES = \\\"BondManager: Wait for other potential disputes\\\";\\n}\\n\\n/**\\n * @title iOVM_BondManager\\n */\\ninterface iOVM_BondManager {\\n\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n /// The lifecycle of a proposer's bond\\n enum State {\\n // Before depositing or after getting slashed, a user is uncollateralized\\n NOT_COLLATERALIZED,\\n // After depositing, a user is collateralized\\n COLLATERALIZED,\\n // After a user has initiated a withdrawal\\n WITHDRAWING\\n }\\n\\n /// A bond posted by a proposer\\n struct Bond {\\n // The user's state\\n State state;\\n // The timestamp at which a proposer issued their withdrawal request\\n uint32 withdrawalTimestamp;\\n // The time when the first disputed was initiated for this bond\\n uint256 firstDisputeAt;\\n // The earliest observed state root for this bond which has had fraud\\n bytes32 earliestDisputedStateRoot;\\n // The state root's timestamp\\n uint256 earliestTimestamp;\\n }\\n\\n // Per pre-state root, store the number of state provisions that were made\\n // and how many of these calls were made by each user. Payouts will then be\\n // claimed by users proportionally for that dispute.\\n struct Rewards {\\n // Flag to check if rewards for a fraud proof are claimable\\n bool canClaim;\\n // Total number of `recordGasSpent` calls made\\n uint256 total;\\n // The gas spent by each user to provide witness data. The sum of all\\n // values inside this map MUST be equal to the value of `total`\\n mapping(address => uint256) gasSpent;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function recordGasSpent(\\n bytes32 _preStateRoot,\\n bytes32 _txHash,\\n address _who,\\n uint256 _gasSpent\\n ) external;\\n\\n function finalize(\\n bytes32 _preStateRoot,\\n address _publisher,\\n uint256 _timestamp\\n ) external;\\n\\n function deposit() external;\\n\\n function startWithdrawal() external;\\n\\n function finalizeWithdrawal() external;\\n\\n function claim(\\n address _who\\n ) external;\\n\\n function isCollateralized(\\n address _who\\n ) external view returns (bool);\\n\\n function getGasSpent(\\n bytes32 _preStateRoot,\\n address _who\\n ) external view returns (uint256);\\n}\\n\",\"keccak256\":\"0x3c2a8a399487857158649db1896749d86e39cba545a8aeb2e2bb0f3bdfa7a5b1\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/verification/iOVM_FraudVerifier.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { iOVM_StateTransitioner } from \\\"./iOVM_StateTransitioner.sol\\\";\\n\\n/**\\n * @title iOVM_FraudVerifier\\n */\\ninterface iOVM_FraudVerifier {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event FraudProofInitialized(\\n bytes32 _preStateRoot,\\n uint256 _preStateRootIndex,\\n bytes32 _transactionHash,\\n address _who\\n );\\n\\n event FraudProofFinalized(\\n bytes32 _preStateRoot,\\n uint256 _preStateRootIndex,\\n bytes32 _transactionHash,\\n address _who\\n );\\n\\n\\n /***************************************\\n * Public Functions: Transition Status *\\n ***************************************/\\n\\n function getStateTransitioner(bytes32 _preStateRoot, bytes32 _txHash) external view returns (iOVM_StateTransitioner _transitioner);\\n\\n\\n /****************************************\\n * Public Functions: Fraud Verification *\\n ****************************************/\\n\\n function initializeFraudVerification(\\n bytes32 _preStateRoot,\\n Lib_OVMCodec.ChainBatchHeader calldata _preStateRootBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof calldata _preStateRootProof,\\n Lib_OVMCodec.Transaction calldata _transaction,\\n Lib_OVMCodec.TransactionChainElement calldata _txChainElement,\\n Lib_OVMCodec.ChainBatchHeader calldata _transactionBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof calldata _transactionProof\\n ) external;\\n\\n function finalizeFraudVerification(\\n bytes32 _preStateRoot,\\n Lib_OVMCodec.ChainBatchHeader calldata _preStateRootBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof calldata _preStateRootProof,\\n bytes32 _txHash,\\n bytes32 _postStateRoot,\\n Lib_OVMCodec.ChainBatchHeader calldata _postStateRootBatchHeader,\\n Lib_OVMCodec.ChainInclusionProof calldata _postStateRootProof\\n ) external;\\n}\\n\",\"keccak256\":\"0x5efd7bb18164bbd3e9d58379e8203fbf2a7ee802b1a48dff3ceaaec1523b1751\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/verification/iOVM_StateTransitioner.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title iOVM_StateTransitioner\\n */\\ninterface iOVM_StateTransitioner {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AccountCommitted(\\n address _address\\n );\\n\\n event ContractStorageCommitted(\\n address _address,\\n bytes32 _key\\n );\\n\\n\\n /**********************************\\n * Public Functions: State Access *\\n **********************************/\\n\\n function getPreStateRoot() external view returns (bytes32 _preStateRoot);\\n function getPostStateRoot() external view returns (bytes32 _postStateRoot);\\n function isComplete() external view returns (bool _complete);\\n\\n\\n /***********************************\\n * Public Functions: Pre-Execution *\\n ***********************************/\\n\\n function proveContractState(\\n address _ovmContractAddress,\\n address _ethContractAddress,\\n bytes calldata _stateTrieWitness\\n ) external;\\n\\n function proveStorageSlot(\\n address _ovmContractAddress,\\n bytes32 _key,\\n bytes calldata _storageTrieWitness\\n ) external;\\n\\n\\n /*******************************\\n * Public Functions: Execution *\\n *******************************/\\n\\n function applyTransaction(\\n Lib_OVMCodec.Transaction calldata _transaction\\n ) external;\\n\\n\\n /************************************\\n * Public Functions: Post-Execution *\\n ************************************/\\n\\n function commitContractState(\\n address _ovmContractAddress,\\n bytes calldata _stateTrieWitness\\n ) external;\\n\\n function commitStorageSlot(\\n address _ovmContractAddress,\\n bytes32 _key,\\n bytes calldata _storageTrieWitness\\n ) external;\\n\\n\\n /**********************************\\n * Public Functions: Finalization *\\n **********************************/\\n\\n function completeTransition() external;\\n}\\n\",\"keccak256\":\"0x3d044ac0a3bb6ad3d529f904b3191117511f9c379678ca03010e1ebdfcb5c34b\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/verification/iOVM_StateTransitionerFactory.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Contract Imports */\\nimport { iOVM_StateTransitioner } from \\\"./iOVM_StateTransitioner.sol\\\";\\n\\n/**\\n * @title iOVM_StateTransitionerFactory\\n */\\ninterface iOVM_StateTransitionerFactory {\\n\\n /***************************************\\n * Public Functions: Contract Creation *\\n ***************************************/\\n\\n function create(\\n address _proxyManager,\\n uint256 _stateTransitionIndex,\\n bytes32 _preStateRoot,\\n bytes32 _transactionHash\\n )\\n external\\n returns (\\n iOVM_StateTransitioner _ovmStateTransitioner\\n );\\n}\\n\",\"keccak256\":\"0x60a0f0c104e4c0c7863268a93005762e8146d393f9cfddfdd6a2d6585c5911fc\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/codec/Lib_OVMCodec.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../utils/Lib_Bytes32Utils.sol\\\";\\n\\n/**\\n * @title Lib_OVMCodec\\n */\\nlibrary Lib_OVMCodec {\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum QueueOrigin {\\n SEQUENCER_QUEUE,\\n L1TOL2_QUEUE\\n }\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Account {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n address ethAddress;\\n bool isFresh;\\n }\\n\\n struct EVMAccount {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n }\\n\\n struct ChainBatchHeader {\\n uint256 batchIndex;\\n bytes32 batchRoot;\\n uint256 batchSize;\\n uint256 prevTotalElements;\\n bytes extraData;\\n }\\n\\n struct ChainInclusionProof {\\n uint256 index;\\n bytes32[] siblings;\\n }\\n\\n struct Transaction {\\n uint256 timestamp;\\n uint256 blockNumber;\\n QueueOrigin l1QueueOrigin;\\n address l1TxOrigin;\\n address entrypoint;\\n uint256 gasLimit;\\n bytes data;\\n }\\n\\n struct TransactionChainElement {\\n bool isSequenced;\\n uint256 queueIndex; // QUEUED TX ONLY\\n uint256 timestamp; // SEQUENCER TX ONLY\\n uint256 blockNumber; // SEQUENCER TX ONLY\\n bytes txData; // SEQUENCER TX ONLY\\n }\\n\\n struct QueueElement {\\n bytes32 transactionHash;\\n uint40 timestamp;\\n uint40 blockNumber;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Encodes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Encoded transaction bytes.\\n */\\n function encodeTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return abi.encodePacked(\\n _transaction.timestamp,\\n _transaction.blockNumber,\\n _transaction.l1QueueOrigin,\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n );\\n }\\n\\n /**\\n * Hashes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Hashed transaction\\n */\\n function hashTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(encodeTransaction(_transaction));\\n }\\n\\n /**\\n * Converts an OVM account to an EVM account.\\n * @param _in OVM account to convert.\\n * @return Converted EVM account.\\n */\\n function toEVMAccount(\\n Account memory _in\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n return EVMAccount({\\n nonce: _in.nonce,\\n balance: _in.balance,\\n storageRoot: _in.storageRoot,\\n codeHash: _in.codeHash\\n });\\n }\\n\\n /**\\n * @notice RLP-encodes an account state struct.\\n * @param _account Account state struct.\\n * @return RLP-encoded account state.\\n */\\n function encodeEVMAccount(\\n EVMAccount memory _account\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes[] memory raw = new bytes[](4);\\n\\n // Unfortunately we can't create this array outright because\\n // Lib_RLPWriter.writeList will reject fixed-size arrays. Assigning\\n // index-by-index circumvents this issue.\\n raw[0] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.nonce)\\n )\\n );\\n raw[1] = Lib_RLPWriter.writeBytes(\\n Lib_Bytes32Utils.removeLeadingZeros(\\n bytes32(_account.balance)\\n )\\n );\\n raw[2] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.storageRoot));\\n raw[3] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.codeHash));\\n\\n return Lib_RLPWriter.writeList(raw);\\n }\\n\\n /**\\n * @notice Decodes an RLP-encoded account state into a useful struct.\\n * @param _encoded RLP-encoded account state.\\n * @return Account state struct.\\n */\\n function decodeEVMAccount(\\n bytes memory _encoded\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\\n\\n return EVMAccount({\\n nonce: Lib_RLPReader.readUint256(accountState[0]),\\n balance: Lib_RLPReader.readUint256(accountState[1]),\\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\\n });\\n }\\n\\n /**\\n * Calculates a hash for a given batch header.\\n * @param _batchHeader Header to hash.\\n * @return Hash of the header.\\n */\\n function hashBatchHeader(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(\\n abi.encode(\\n _batchHeader.batchRoot,\\n _batchHeader.batchSize,\\n _batchHeader.prevTotalElements,\\n _batchHeader.extraData\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0xd85ba2066057a2677926f484b938c7c2ef33ff3853f3b71cda252f4a54f30e05\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n public\\n onlyOwner\\n {\\n addresses[_getNameHash(_name)] = _address;\\n\\n emit AddressSet(\\n _name,\\n _address\\n );\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0x2ce671a0e004df88b136bea5a3c59d0732cea8887c8496da1d509e0200b03d7d\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(\\n address _libAddressManager\\n ) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x65981feeabff6a81783ea97d44baf988a18a86c8cb374c46fdb71819cbacc7c0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPReader.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_RLPReader\\n * @dev Adapted from \\\"RLPReader\\\" by Hamdi Allam (hamdi.allam97@gmail.com).\\n */\\nlibrary Lib_RLPReader {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 constant internal MAX_LIST_LENGTH = 32;\\n\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum RLPItemType {\\n DATA_ITEM,\\n LIST_ITEM\\n }\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct RLPItem {\\n uint256 length;\\n uint256 ptr;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts bytes to a reference to memory position and length.\\n * @param _in Input bytes to convert.\\n * @return Output memory reference.\\n */\\n function toRLPItem(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem memory\\n )\\n {\\n uint256 ptr;\\n assembly {\\n ptr := add(_in, 32)\\n }\\n\\n return RLPItem({\\n length: _in.length,\\n ptr: ptr\\n });\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n (\\n uint256 listOffset,\\n ,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.LIST_ITEM,\\n \\\"Invalid RLP list value.\\\"\\n );\\n\\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\\n // writing to the length. Since we can't know the number of RLP items without looping over\\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\\n // simply set a reasonable maximum list length and decrease the size before we finish.\\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\\n\\n uint256 itemCount = 0;\\n uint256 offset = listOffset;\\n while (offset < _in.length) {\\n require(\\n itemCount < MAX_LIST_LENGTH,\\n \\\"Provided RLP list exceeds max list length.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n ) = _decodeLength(RLPItem({\\n length: _in.length - offset,\\n ptr: _in.ptr + offset\\n }));\\n\\n out[itemCount] = RLPItem({\\n length: itemLength + itemOffset,\\n ptr: _in.ptr + offset\\n });\\n\\n itemCount += 1;\\n offset += itemOffset + itemLength;\\n }\\n\\n // Decrease the array size to match the actual item count.\\n assembly {\\n mstore(out, itemCount)\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n return readList(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes value.\\\"\\n );\\n\\n return _copy(_in.ptr, itemOffset, itemLength);\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return readBytes(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return string(readBytes(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return readString(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n require(\\n _in.length <= 33,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr + itemOffset;\\n bytes32 out;\\n assembly {\\n out := mload(ptr)\\n\\n // Shift the bytes over to match the item size.\\n if lt(itemLength, 32) {\\n out := div(out, exp(256, sub(32, itemLength)))\\n }\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return readBytes32(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return uint256(readBytes32(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return readUint256(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n require(\\n _in.length == 1,\\n \\\"Invalid RLP boolean value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 out;\\n assembly {\\n out := byte(0, mload(ptr))\\n }\\n\\n require(\\n out == 0 || out == 1,\\n \\\"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\\\"\\n );\\n\\n return out != 0;\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return readBool(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n if (_in.length == 1) {\\n return address(0);\\n }\\n\\n require(\\n _in.length == 21,\\n \\\"Invalid RLP address value.\\\"\\n );\\n\\n return address(readUint256(_in));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return readAddress(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads the raw bytes of an RLP item.\\n * @param _in RLP item to read.\\n * @return Raw RLP bytes.\\n */\\n function readRawBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in);\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Decodes the length of an RLP item.\\n * @param _in RLP item to decode.\\n * @return Offset of the encoded data.\\n * @return Length of the encoded data.\\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\\n */\\n function _decodeLength(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n uint256,\\n uint256,\\n RLPItemType\\n )\\n {\\n require(\\n _in.length > 0,\\n \\\"RLP item cannot be null.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 prefix;\\n assembly {\\n prefix := byte(0, mload(ptr))\\n }\\n\\n if (prefix <= 0x7f) {\\n // Single byte.\\n\\n return (0, 1, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xb7) {\\n // Short string.\\n\\n uint256 strLen = prefix - 0x80;\\n\\n require(\\n _in.length > strLen,\\n \\\"Invalid RLP short string.\\\"\\n );\\n\\n return (1, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xbf) {\\n // Long string.\\n uint256 lenOfStrLen = prefix - 0xb7;\\n\\n require(\\n _in.length > lenOfStrLen,\\n \\\"Invalid RLP long string length.\\\"\\n );\\n\\n uint256 strLen;\\n assembly {\\n // Pick out the string length.\\n strLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfStrLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfStrLen + strLen,\\n \\\"Invalid RLP long string.\\\"\\n );\\n\\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xf7) {\\n // Short list.\\n uint256 listLen = prefix - 0xc0;\\n\\n require(\\n _in.length > listLen,\\n \\\"Invalid RLP short list.\\\"\\n );\\n\\n return (1, listLen, RLPItemType.LIST_ITEM);\\n } else {\\n // Long list.\\n uint256 lenOfListLen = prefix - 0xf7;\\n\\n require(\\n _in.length > lenOfListLen,\\n \\\"Invalid RLP long list length.\\\"\\n );\\n\\n uint256 listLen;\\n assembly {\\n // Pick out the list length.\\n listLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfListLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfListLen + listLen,\\n \\\"Invalid RLP long list.\\\"\\n );\\n\\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\\n }\\n }\\n\\n /**\\n * Copies the bytes from a memory location.\\n * @param _src Pointer to the location to read from.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Copied bytes.\\n */\\n function _copy(\\n uint256 _src,\\n uint256 _offset,\\n uint256 _length\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out = new bytes(_length);\\n if (out.length == 0) {\\n return out;\\n }\\n\\n uint256 src = _src + _offset;\\n uint256 dest;\\n assembly {\\n dest := add(out, 32)\\n }\\n\\n // Copy over as many complete words as we can.\\n for (uint256 i = 0; i < _length / 32; i++) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n\\n src += 32;\\n dest += 32;\\n }\\n\\n // Pick out the remaining bytes.\\n uint256 mask = 256 ** (32 - (_length % 32)) - 1;\\n assembly {\\n mstore(\\n dest,\\n or(\\n and(mload(src), not(mask)),\\n and(mload(dest), mask)\\n )\\n )\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Copies an RLP item into bytes.\\n * @param _in RLP item to copy.\\n * @return Copied bytes.\\n */\\n function _copy(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in.ptr, 0, _in.length);\\n }\\n}\\n\",\"keccak256\":\"0x829174c61216dce35fdb888383b6022e0365eb7fbdc71ad79d98b108091969fe\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/rlp/Lib_RLPWriter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/**\\n * @title Lib_RLPWriter\\n * @author Bakaoh (with modifications)\\n */\\nlibrary Lib_RLPWriter {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * RLP encodes a byte string.\\n * @param _in The byte string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded;\\n\\n if (_in.length == 1 && uint8(_in[0]) < 128) {\\n encoded = _in;\\n } else {\\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * RLP encodes a list of RLP encoded byte byte strings.\\n * @param _in The list of RLP encoded byte strings.\\n * @return The RLP encoded list of items in bytes.\\n */\\n function writeList(\\n bytes[] memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory list = _flatten(_in);\\n return abi.encodePacked(_writeLength(list.length, 192), list);\\n }\\n\\n /**\\n * RLP encodes a string.\\n * @param _in The string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeString(\\n string memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(bytes(_in));\\n }\\n\\n /**\\n * RLP encodes an address.\\n * @param _in The address to encode.\\n * @return The RLP encoded address in bytes.\\n */\\n function writeAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a bytes32 value.\\n * @param _in The bytes32 to encode.\\n * @return _out The RLP encoded bytes32 in bytes.\\n */\\n function writeBytes32(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory _out\\n )\\n {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a uint.\\n * @param _in The uint256 to encode.\\n * @return The RLP encoded uint256 in bytes.\\n */\\n function writeUint(\\n uint256 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(_toBinary(_in));\\n }\\n\\n /**\\n * RLP encodes a bool.\\n * @param _in The bool to encode.\\n * @return The RLP encoded bool in bytes.\\n */\\n function writeBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded = new bytes(1);\\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\\n return encoded;\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\\n * @param _len The length of the string or the payload.\\n * @param _offset 128 if item is string, 192 if item is list.\\n * @return RLP encoded bytes.\\n */\\n function _writeLength(\\n uint256 _len,\\n uint256 _offset\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded;\\n\\n if (_len < 56) {\\n encoded = new bytes(1);\\n encoded[0] = byte(uint8(_len) + uint8(_offset));\\n } else {\\n uint256 lenLen;\\n uint256 i = 1;\\n while (_len / i != 0) {\\n lenLen++;\\n i *= 256;\\n }\\n\\n encoded = new bytes(lenLen + 1);\\n encoded[0] = byte(uint8(lenLen) + uint8(_offset) + 55);\\n for(i = 1; i <= lenLen; i++) {\\n encoded[i] = byte(uint8((_len / (256**(lenLen-i))) % 256));\\n }\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * Encode integer in big endian binary form with no leading zeroes.\\n * @notice TODO: This should be optimized with assembly to save gas costs.\\n * @param _x The integer to encode.\\n * @return RLP encoded bytes.\\n */\\n function _toBinary(\\n uint256 _x\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory b = abi.encodePacked(_x);\\n\\n uint256 i = 0;\\n for (; i < 32; i++) {\\n if (b[i] != 0) {\\n break;\\n }\\n }\\n\\n bytes memory res = new bytes(32 - i);\\n for (uint256 j = 0; j < res.length; j++) {\\n res[j] = b[i++];\\n }\\n\\n return res;\\n }\\n\\n /**\\n * Copies a piece of memory to another location.\\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\\n * @param _dest Destination location.\\n * @param _src Source location.\\n * @param _len Length of memory to copy.\\n */\\n function _memcpy(\\n uint256 _dest,\\n uint256 _src,\\n uint256 _len\\n )\\n private\\n pure\\n {\\n uint256 dest = _dest;\\n uint256 src = _src;\\n uint256 len = _len;\\n\\n for(; len >= 32; len -= 32) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n dest += 32;\\n src += 32;\\n }\\n\\n uint256 mask = 256 ** (32 - len) - 1;\\n assembly {\\n let srcpart := and(mload(src), not(mask))\\n let destpart := and(mload(dest), mask)\\n mstore(dest, or(destpart, srcpart))\\n }\\n }\\n\\n /**\\n * Flattens a list of byte strings into one byte string.\\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\\n * @param _list List of byte strings to flatten.\\n * @return The flattened byte string.\\n */\\n function _flatten(\\n bytes[] memory _list\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n if (_list.length == 0) {\\n return new bytes(0);\\n }\\n\\n uint256 len;\\n uint256 i = 0;\\n for (; i < _list.length; i++) {\\n len += _list[i].length;\\n }\\n\\n bytes memory flattened = new bytes(len);\\n uint256 flattenedPtr;\\n assembly { flattenedPtr := add(flattened, 0x20) }\\n\\n for(i = 0; i < _list.length; i++) {\\n bytes memory item = _list[i];\\n\\n uint256 listPtr;\\n assembly { listPtr := add(item, 0x20)}\\n\\n _memcpy(flattenedPtr, listPtr, item.length);\\n flattenedPtr += _list[i].length;\\n }\\n\\n return flattened;\\n }\\n}\\n\",\"keccak256\":\"0xb60ee4b03ad372c3deff21d454ab714dd0c18ee3e6f9d45532e209fc59d5a54d\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/trie/Lib_MerkleTrie.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\n\\n/**\\n * @title Lib_MerkleTrie\\n */\\nlibrary Lib_MerkleTrie {\\n\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n enum NodeType {\\n BranchNode,\\n ExtensionNode,\\n LeafNode\\n }\\n\\n struct TrieNode {\\n bytes encoded;\\n Lib_RLPReader.RLPItem[] decoded;\\n }\\n\\n\\n /**********************\\n * Contract Constants *\\n **********************/\\n\\n // TREE_RADIX determines the number of elements per branch node.\\n uint256 constant TREE_RADIX = 16;\\n // Branch nodes have TREE_RADIX elements plus an additional `value` slot.\\n uint256 constant BRANCH_NODE_LENGTH = TREE_RADIX + 1;\\n // Leaf nodes and extension nodes always have two elements, a `path` and a `value`.\\n uint256 constant LEAF_OR_EXTENSION_NODE_LENGTH = 2;\\n\\n // Prefixes are prepended to the `path` within a leaf or extension node and\\n // allow us to differentiate between the two node types. `ODD` or `EVEN` is\\n // determined by the number of nibbles within the unprefixed `path`. If the\\n // number of nibbles if even, we need to insert an extra padding nibble so\\n // the resulting prefixed `path` has an even number of nibbles.\\n uint8 constant PREFIX_EXTENSION_EVEN = 0;\\n uint8 constant PREFIX_EXTENSION_ODD = 1;\\n uint8 constant PREFIX_LEAF_EVEN = 2;\\n uint8 constant PREFIX_LEAF_ODD = 3;\\n\\n // Just a utility constant. RLP represents `NULL` as 0x80.\\n bytes1 constant RLP_NULL = bytes1(0x80);\\n bytes constant RLP_NULL_BYTES = hex'80';\\n bytes32 constant internal KECCAK256_RLP_NULL_BYTES = keccak256(RLP_NULL_BYTES);\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * @notice Verifies a proof that a given key/value pair is present in the\\n * Merkle trie.\\n * @param _key Key of the node to search for, as a hex string.\\n * @param _value Value of the node to search for, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the desired node. Unlike\\n * traditional Merkle trees, this proof is executed top-down and consists\\n * of a list of RLP-encoded nodes that make a path down to the target node.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _verified `true` if the k/v pair exists in the trie, `false` otherwise.\\n */\\n function verifyInclusionProof(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bool _verified\\n )\\n {\\n (\\n bool exists,\\n bytes memory value\\n ) = get(_key, _proof, _root);\\n\\n return (\\n exists && Lib_BytesUtils.equal(_value, value)\\n );\\n }\\n\\n /**\\n * @notice Verifies a proof that a given key is *not* present in\\n * the Merkle trie.\\n * @param _key Key of the node to search for, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\\n * target node.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _verified `true` if the key is absent in the trie, `false` otherwise.\\n */\\n function verifyExclusionProof(\\n bytes memory _key,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bool _verified\\n )\\n {\\n (\\n bool exists,\\n ) = get(_key, _proof, _root);\\n\\n return exists == false;\\n }\\n\\n /**\\n * @notice Updates a Merkle trie and returns a new root hash.\\n * @param _key Key of the node to update, as a hex string.\\n * @param _value Value of the node to update, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\\n * target node. If the key exists, we can simply update the value.\\n * Otherwise, we need to modify the trie to handle the new k/v pair.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _updatedRoot Root hash of the newly constructed trie.\\n */\\n function update(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bytes32 _updatedRoot\\n )\\n {\\n // Special case when inserting the very first node.\\n if (_root == KECCAK256_RLP_NULL_BYTES) {\\n return getSingleNodeRootHash(_key, _value);\\n }\\n\\n TrieNode[] memory proof = _parseProof(_proof);\\n (uint256 pathLength, bytes memory keyRemainder, ) = _walkNodePath(proof, _key, _root);\\n TrieNode[] memory newPath = _getNewPath(proof, pathLength, keyRemainder, _value);\\n\\n return _getUpdatedTrieRoot(newPath, _key);\\n }\\n\\n /**\\n * @notice Retrieves the value associated with a given key.\\n * @param _key Key to search for, as hex bytes.\\n * @param _proof Merkle trie inclusion proof for the key.\\n * @param _root Known root of the Merkle trie.\\n * @return _exists Whether or not the key exists.\\n * @return _value Value of the key if it exists.\\n */\\n function get(\\n bytes memory _key,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bool _exists,\\n bytes memory _value\\n )\\n {\\n TrieNode[] memory proof = _parseProof(_proof);\\n (uint256 pathLength, bytes memory keyRemainder, bool isFinalNode) = _walkNodePath(proof, _key, _root);\\n\\n bool exists = keyRemainder.length == 0;\\n\\n require(\\n exists || isFinalNode,\\n \\\"Provided proof is invalid.\\\"\\n );\\n\\n bytes memory value = exists ? _getNodeValue(proof[pathLength - 1]) : bytes('');\\n\\n return (\\n exists,\\n value\\n );\\n }\\n\\n /**\\n * Computes the root hash for a trie with a single node.\\n * @param _key Key for the single node.\\n * @param _value Value for the single node.\\n * @return _updatedRoot Hash of the trie.\\n */\\n function getSingleNodeRootHash(\\n bytes memory _key,\\n bytes memory _value\\n )\\n internal\\n pure\\n returns (\\n bytes32 _updatedRoot\\n )\\n {\\n return keccak256(_makeLeafNode(\\n Lib_BytesUtils.toNibbles(_key),\\n _value\\n ).encoded);\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * @notice Walks through a proof using a provided key.\\n * @param _proof Inclusion proof to walk through.\\n * @param _key Key to use for the walk.\\n * @param _root Known root of the trie.\\n * @return _pathLength Length of the final path\\n * @return _keyRemainder Portion of the key remaining after the walk.\\n * @return _isFinalNode Whether or not we've hit a dead end.\\n */\\n function _walkNodePath(\\n TrieNode[] memory _proof,\\n bytes memory _key,\\n bytes32 _root\\n )\\n private\\n pure\\n returns (\\n uint256 _pathLength,\\n bytes memory _keyRemainder,\\n bool _isFinalNode\\n )\\n {\\n uint256 pathLength = 0;\\n bytes memory key = Lib_BytesUtils.toNibbles(_key);\\n\\n bytes32 currentNodeID = _root;\\n uint256 currentKeyIndex = 0;\\n uint256 currentKeyIncrement = 0;\\n TrieNode memory currentNode;\\n\\n // Proof is top-down, so we start at the first element (root).\\n for (uint256 i = 0; i < _proof.length; i++) {\\n currentNode = _proof[i];\\n currentKeyIndex += currentKeyIncrement;\\n\\n // Keep track of the proof elements we actually need.\\n // It's expensive to resize arrays, so this simply reduces gas costs.\\n pathLength += 1;\\n\\n if (currentKeyIndex == 0) {\\n // First proof element is always the root node.\\n require(\\n keccak256(currentNode.encoded) == currentNodeID,\\n \\\"Invalid root hash\\\"\\n );\\n } else if (currentNode.encoded.length >= 32) {\\n // Nodes 32 bytes or larger are hashed inside branch nodes.\\n require(\\n keccak256(currentNode.encoded) == currentNodeID,\\n \\\"Invalid large internal hash\\\"\\n );\\n } else {\\n // Nodes smaller than 31 bytes aren't hashed.\\n require(\\n Lib_BytesUtils.toBytes32(currentNode.encoded) == currentNodeID,\\n \\\"Invalid internal node hash\\\"\\n );\\n }\\n\\n if (currentNode.decoded.length == BRANCH_NODE_LENGTH) {\\n if (currentKeyIndex == key.length) {\\n // We've hit the end of the key, meaning the value should be within this branch node.\\n break;\\n } else {\\n // We're not at the end of the key yet.\\n // Figure out what the next node ID should be and continue.\\n uint8 branchKey = uint8(key[currentKeyIndex]);\\n Lib_RLPReader.RLPItem memory nextNode = currentNode.decoded[branchKey];\\n currentNodeID = _getNodeID(nextNode);\\n currentKeyIncrement = 1;\\n continue;\\n }\\n } else if (currentNode.decoded.length == LEAF_OR_EXTENSION_NODE_LENGTH) {\\n bytes memory path = _getNodePath(currentNode);\\n uint8 prefix = uint8(path[0]);\\n uint8 offset = 2 - prefix % 2;\\n bytes memory pathRemainder = Lib_BytesUtils.slice(path, offset);\\n bytes memory keyRemainder = Lib_BytesUtils.slice(key, currentKeyIndex);\\n uint256 sharedNibbleLength = _getSharedNibbleLength(pathRemainder, keyRemainder);\\n\\n if (prefix == PREFIX_LEAF_EVEN || prefix == PREFIX_LEAF_ODD) {\\n if (\\n pathRemainder.length == sharedNibbleLength &&\\n keyRemainder.length == sharedNibbleLength\\n ) {\\n // The key within this leaf matches our key exactly.\\n // Increment the key index to reflect that we have no remainder.\\n currentKeyIndex += sharedNibbleLength;\\n }\\n\\n // We've hit a leaf node, so our next node should be NULL.\\n currentNodeID = bytes32(RLP_NULL);\\n break;\\n } else if (prefix == PREFIX_EXTENSION_EVEN || prefix == PREFIX_EXTENSION_ODD) {\\n if (sharedNibbleLength == 0) {\\n // Our extension node doesn't share any part of our key.\\n // We've hit the end of this path, updates will need to modify this extension.\\n currentNodeID = bytes32(RLP_NULL);\\n break;\\n } else {\\n // Our extension shares some nibbles.\\n // Carry on to the next node.\\n currentNodeID = _getNodeID(currentNode.decoded[1]);\\n currentKeyIncrement = sharedNibbleLength;\\n continue;\\n }\\n } else {\\n revert(\\\"Received a node with an unknown prefix\\\");\\n }\\n } else {\\n revert(\\\"Received an unparseable node.\\\");\\n }\\n }\\n\\n // If our node ID is NULL, then we're at a dead end.\\n bool isFinalNode = currentNodeID == bytes32(RLP_NULL);\\n return (pathLength, Lib_BytesUtils.slice(key, currentKeyIndex), isFinalNode);\\n }\\n\\n /**\\n * @notice Creates new nodes to support a k/v pair insertion into a given\\n * Merkle trie path.\\n * @param _path Path to the node nearest the k/v pair.\\n * @param _pathLength Length of the path. Necessary because the provided\\n * path may include additional nodes (e.g., it comes directly from a proof)\\n * and we can't resize in-memory arrays without costly duplication.\\n * @param _keyRemainder Portion of the initial key that must be inserted\\n * into the trie.\\n * @param _value Value to insert at the given key.\\n * @return _newPath A new path with the inserted k/v pair and extra supporting nodes.\\n */\\n function _getNewPath(\\n TrieNode[] memory _path,\\n uint256 _pathLength,\\n bytes memory _keyRemainder,\\n bytes memory _value\\n )\\n private\\n pure\\n returns (\\n TrieNode[] memory _newPath\\n )\\n {\\n bytes memory keyRemainder = _keyRemainder;\\n\\n // Most of our logic depends on the status of the last node in the path.\\n TrieNode memory lastNode = _path[_pathLength - 1];\\n NodeType lastNodeType = _getNodeType(lastNode);\\n\\n // Create an array for newly created nodes.\\n // We need up to three new nodes, depending on the contents of the last node.\\n // Since array resizing is expensive, we'll keep track of the size manually.\\n // We're using an explicit `totalNewNodes += 1` after insertions for clarity.\\n TrieNode[] memory newNodes = new TrieNode[](3);\\n uint256 totalNewNodes = 0;\\n\\n if (keyRemainder.length == 0 && lastNodeType == NodeType.LeafNode) {\\n // We've found a leaf node with the given key.\\n // Simply need to update the value of the node to match.\\n newNodes[totalNewNodes] = _makeLeafNode(_getNodeKey(lastNode), _value);\\n totalNewNodes += 1;\\n } else if (lastNodeType == NodeType.BranchNode) {\\n if (keyRemainder.length == 0) {\\n // We've found a branch node with the given key.\\n // Simply need to update the value of the node to match.\\n newNodes[totalNewNodes] = _editBranchValue(lastNode, _value);\\n totalNewNodes += 1;\\n } else {\\n // We've found a branch node, but it doesn't contain our key.\\n // Reinsert the old branch for now.\\n newNodes[totalNewNodes] = lastNode;\\n totalNewNodes += 1;\\n // Create a new leaf node, slicing our remainder since the first byte points\\n // to our branch node.\\n newNodes[totalNewNodes] = _makeLeafNode(Lib_BytesUtils.slice(keyRemainder, 1), _value);\\n totalNewNodes += 1;\\n }\\n } else {\\n // Our last node is either an extension node or a leaf node with a different key.\\n bytes memory lastNodeKey = _getNodeKey(lastNode);\\n uint256 sharedNibbleLength = _getSharedNibbleLength(lastNodeKey, keyRemainder);\\n\\n if (sharedNibbleLength != 0) {\\n // We've got some shared nibbles between the last node and our key remainder.\\n // We'll need to insert an extension node that covers these shared nibbles.\\n bytes memory nextNodeKey = Lib_BytesUtils.slice(lastNodeKey, 0, sharedNibbleLength);\\n newNodes[totalNewNodes] = _makeExtensionNode(nextNodeKey, _getNodeHash(_value));\\n totalNewNodes += 1;\\n\\n // Cut down the keys since we've just covered these shared nibbles.\\n lastNodeKey = Lib_BytesUtils.slice(lastNodeKey, sharedNibbleLength);\\n keyRemainder = Lib_BytesUtils.slice(keyRemainder, sharedNibbleLength);\\n }\\n\\n // Create an empty branch to fill in.\\n TrieNode memory newBranch = _makeEmptyBranchNode();\\n\\n if (lastNodeKey.length == 0) {\\n // Key remainder was larger than the key for our last node.\\n // The value within our last node is therefore going to be shifted into\\n // a branch value slot.\\n newBranch = _editBranchValue(newBranch, _getNodeValue(lastNode));\\n } else {\\n // Last node key was larger than the key remainder.\\n // We're going to modify some index of our branch.\\n uint8 branchKey = uint8(lastNodeKey[0]);\\n // Move on to the next nibble.\\n lastNodeKey = Lib_BytesUtils.slice(lastNodeKey, 1);\\n\\n if (lastNodeType == NodeType.LeafNode) {\\n // We're dealing with a leaf node.\\n // We'll modify the key and insert the old leaf node into the branch index.\\n TrieNode memory modifiedLastNode = _makeLeafNode(lastNodeKey, _getNodeValue(lastNode));\\n newBranch = _editBranchIndex(newBranch, branchKey, _getNodeHash(modifiedLastNode.encoded));\\n } else if (lastNodeKey.length != 0) {\\n // We're dealing with a shrinking extension node.\\n // We need to modify the node to decrease the size of the key.\\n TrieNode memory modifiedLastNode = _makeExtensionNode(lastNodeKey, _getNodeValue(lastNode));\\n newBranch = _editBranchIndex(newBranch, branchKey, _getNodeHash(modifiedLastNode.encoded));\\n } else {\\n // We're dealing with an unnecessary extension node.\\n // We're going to delete the node entirely.\\n // Simply insert its current value into the branch index.\\n newBranch = _editBranchIndex(newBranch, branchKey, _getNodeValue(lastNode));\\n }\\n }\\n\\n if (keyRemainder.length == 0) {\\n // We've got nothing left in the key remainder.\\n // Simply insert the value into the branch value slot.\\n newBranch = _editBranchValue(newBranch, _value);\\n // Push the branch into the list of new nodes.\\n newNodes[totalNewNodes] = newBranch;\\n totalNewNodes += 1;\\n } else {\\n // We've got some key remainder to work with.\\n // We'll be inserting a leaf node into the trie.\\n // First, move on to the next nibble.\\n keyRemainder = Lib_BytesUtils.slice(keyRemainder, 1);\\n // Push the branch into the list of new nodes.\\n newNodes[totalNewNodes] = newBranch;\\n totalNewNodes += 1;\\n // Push a new leaf node for our k/v pair.\\n newNodes[totalNewNodes] = _makeLeafNode(keyRemainder, _value);\\n totalNewNodes += 1;\\n }\\n }\\n\\n // Finally, join the old path with our newly created nodes.\\n // Since we're overwriting the last node in the path, we use `_pathLength - 1`.\\n return _joinNodeArrays(_path, _pathLength - 1, newNodes, totalNewNodes);\\n }\\n\\n /**\\n * @notice Computes the trie root from a given path.\\n * @param _nodes Path to some k/v pair.\\n * @param _key Key for the k/v pair.\\n * @return _updatedRoot Root hash for the updated trie.\\n */\\n function _getUpdatedTrieRoot(\\n TrieNode[] memory _nodes,\\n bytes memory _key\\n )\\n private\\n pure\\n returns (\\n bytes32 _updatedRoot\\n )\\n {\\n bytes memory key = Lib_BytesUtils.toNibbles(_key);\\n\\n // Some variables to keep track of during iteration.\\n TrieNode memory currentNode;\\n NodeType currentNodeType;\\n bytes memory previousNodeHash;\\n\\n // Run through the path backwards to rebuild our root hash.\\n for (uint256 i = _nodes.length; i > 0; i--) {\\n // Pick out the current node.\\n currentNode = _nodes[i - 1];\\n currentNodeType = _getNodeType(currentNode);\\n\\n if (currentNodeType == NodeType.LeafNode) {\\n // Leaf nodes are already correctly encoded.\\n // Shift the key over to account for the nodes key.\\n bytes memory nodeKey = _getNodeKey(currentNode);\\n key = Lib_BytesUtils.slice(key, 0, key.length - nodeKey.length);\\n } else if (currentNodeType == NodeType.ExtensionNode) {\\n // Shift the key over to account for the nodes key.\\n bytes memory nodeKey = _getNodeKey(currentNode);\\n key = Lib_BytesUtils.slice(key, 0, key.length - nodeKey.length);\\n\\n // If this node is the last element in the path, it'll be correctly encoded\\n // and we can skip this part.\\n if (previousNodeHash.length > 0) {\\n // Re-encode the node based on the previous node.\\n currentNode = _makeExtensionNode(nodeKey, previousNodeHash);\\n }\\n } else if (currentNodeType == NodeType.BranchNode) {\\n // If this node is the last element in the path, it'll be correctly encoded\\n // and we can skip this part.\\n if (previousNodeHash.length > 0) {\\n // Re-encode the node based on the previous node.\\n uint8 branchKey = uint8(key[key.length - 1]);\\n key = Lib_BytesUtils.slice(key, 0, key.length - 1);\\n currentNode = _editBranchIndex(currentNode, branchKey, previousNodeHash);\\n }\\n }\\n\\n // Compute the node hash for the next iteration.\\n previousNodeHash = _getNodeHash(currentNode.encoded);\\n }\\n\\n // Current node should be the root at this point.\\n // Simply return the hash of its encoding.\\n return keccak256(currentNode.encoded);\\n }\\n\\n /**\\n * @notice Parses an RLP-encoded proof into something more useful.\\n * @param _proof RLP-encoded proof to parse.\\n * @return _parsed Proof parsed into easily accessible structs.\\n */\\n function _parseProof(\\n bytes memory _proof\\n )\\n private\\n pure\\n returns (\\n TrieNode[] memory _parsed\\n )\\n {\\n Lib_RLPReader.RLPItem[] memory nodes = Lib_RLPReader.readList(_proof);\\n TrieNode[] memory proof = new TrieNode[](nodes.length);\\n\\n for (uint256 i = 0; i < nodes.length; i++) {\\n bytes memory encoded = Lib_RLPReader.readBytes(nodes[i]);\\n proof[i] = TrieNode({\\n encoded: encoded,\\n decoded: Lib_RLPReader.readList(encoded)\\n });\\n }\\n\\n return proof;\\n }\\n\\n /**\\n * @notice Picks out the ID for a node. Node ID is referred to as the\\n * \\\"hash\\\" within the specification, but nodes < 32 bytes are not actually\\n * hashed.\\n * @param _node Node to pull an ID for.\\n * @return _nodeID ID for the node, depending on the size of its contents.\\n */\\n function _getNodeID(\\n Lib_RLPReader.RLPItem memory _node\\n )\\n private\\n pure\\n returns (\\n bytes32 _nodeID\\n )\\n {\\n bytes memory nodeID;\\n\\n if (_node.length < 32) {\\n // Nodes smaller than 32 bytes are RLP encoded.\\n nodeID = Lib_RLPReader.readRawBytes(_node);\\n } else {\\n // Nodes 32 bytes or larger are hashed.\\n nodeID = Lib_RLPReader.readBytes(_node);\\n }\\n\\n return Lib_BytesUtils.toBytes32(nodeID);\\n }\\n\\n /**\\n * @notice Gets the path for a leaf or extension node.\\n * @param _node Node to get a path for.\\n * @return _path Node path, converted to an array of nibbles.\\n */\\n function _getNodePath(\\n TrieNode memory _node\\n )\\n private\\n pure\\n returns (\\n bytes memory _path\\n )\\n {\\n return Lib_BytesUtils.toNibbles(Lib_RLPReader.readBytes(_node.decoded[0]));\\n }\\n\\n /**\\n * @notice Gets the key for a leaf or extension node. Keys are essentially\\n * just paths without any prefix.\\n * @param _node Node to get a key for.\\n * @return _key Node key, converted to an array of nibbles.\\n */\\n function _getNodeKey(\\n TrieNode memory _node\\n )\\n private\\n pure\\n returns (\\n bytes memory _key\\n )\\n {\\n return _removeHexPrefix(_getNodePath(_node));\\n }\\n\\n /**\\n * @notice Gets the path for a node.\\n * @param _node Node to get a value for.\\n * @return _value Node value, as hex bytes.\\n */\\n function _getNodeValue(\\n TrieNode memory _node\\n )\\n private\\n pure\\n returns (\\n bytes memory _value\\n )\\n {\\n return Lib_RLPReader.readBytes(_node.decoded[_node.decoded.length - 1]);\\n }\\n\\n /**\\n * @notice Computes the node hash for an encoded node. Nodes < 32 bytes\\n * are not hashed, all others are keccak256 hashed.\\n * @param _encoded Encoded node to hash.\\n * @return _hash Hash of the encoded node. Simply the input if < 32 bytes.\\n */\\n function _getNodeHash(\\n bytes memory _encoded\\n )\\n private\\n pure\\n returns (\\n bytes memory _hash\\n )\\n {\\n if (_encoded.length < 32) {\\n return _encoded;\\n } else {\\n return abi.encodePacked(keccak256(_encoded));\\n }\\n }\\n\\n /**\\n * @notice Determines the type for a given node.\\n * @param _node Node to determine a type for.\\n * @return _type Type of the node; BranchNode/ExtensionNode/LeafNode.\\n */\\n function _getNodeType(\\n TrieNode memory _node\\n )\\n private\\n pure\\n returns (\\n NodeType _type\\n )\\n {\\n if (_node.decoded.length == BRANCH_NODE_LENGTH) {\\n return NodeType.BranchNode;\\n } else if (_node.decoded.length == LEAF_OR_EXTENSION_NODE_LENGTH) {\\n bytes memory path = _getNodePath(_node);\\n uint8 prefix = uint8(path[0]);\\n\\n if (prefix == PREFIX_LEAF_EVEN || prefix == PREFIX_LEAF_ODD) {\\n return NodeType.LeafNode;\\n } else if (prefix == PREFIX_EXTENSION_EVEN || prefix == PREFIX_EXTENSION_ODD) {\\n return NodeType.ExtensionNode;\\n }\\n }\\n\\n revert(\\\"Invalid node type\\\");\\n }\\n\\n /**\\n * @notice Utility; determines the number of nibbles shared between two\\n * nibble arrays.\\n * @param _a First nibble array.\\n * @param _b Second nibble array.\\n * @return _shared Number of shared nibbles.\\n */\\n function _getSharedNibbleLength(\\n bytes memory _a,\\n bytes memory _b\\n )\\n private\\n pure\\n returns (\\n uint256 _shared\\n )\\n {\\n uint256 i = 0;\\n while (_a.length > i && _b.length > i && _a[i] == _b[i]) {\\n i++;\\n }\\n return i;\\n }\\n\\n /**\\n * @notice Utility; converts an RLP-encoded node into our nice struct.\\n * @param _raw RLP-encoded node to convert.\\n * @return _node Node as a TrieNode struct.\\n */\\n function _makeNode(\\n bytes[] memory _raw\\n )\\n private\\n pure\\n returns (\\n TrieNode memory _node\\n )\\n {\\n bytes memory encoded = Lib_RLPWriter.writeList(_raw);\\n\\n return TrieNode({\\n encoded: encoded,\\n decoded: Lib_RLPReader.readList(encoded)\\n });\\n }\\n\\n /**\\n * @notice Utility; converts an RLP-decoded node into our nice struct.\\n * @param _items RLP-decoded node to convert.\\n * @return _node Node as a TrieNode struct.\\n */\\n function _makeNode(\\n Lib_RLPReader.RLPItem[] memory _items\\n )\\n private\\n pure\\n returns (\\n TrieNode memory _node\\n )\\n {\\n bytes[] memory raw = new bytes[](_items.length);\\n for (uint256 i = 0; i < _items.length; i++) {\\n raw[i] = Lib_RLPReader.readRawBytes(_items[i]);\\n }\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Creates a new extension node.\\n * @param _key Key for the extension node, unprefixed.\\n * @param _value Value for the extension node.\\n * @return _node New extension node with the given k/v pair.\\n */\\n function _makeExtensionNode(\\n bytes memory _key,\\n bytes memory _value\\n )\\n private\\n pure\\n returns (\\n TrieNode memory _node\\n )\\n {\\n bytes[] memory raw = new bytes[](2);\\n bytes memory key = _addHexPrefix(_key, false);\\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\\n raw[1] = Lib_RLPWriter.writeBytes(_value);\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Creates a new leaf node.\\n * @dev This function is essentially identical to `_makeExtensionNode`.\\n * Although we could route both to a single method with a flag, it's\\n * more gas efficient to keep them separate and duplicate the logic.\\n * @param _key Key for the leaf node, unprefixed.\\n * @param _value Value for the leaf node.\\n * @return _node New leaf node with the given k/v pair.\\n */\\n function _makeLeafNode(\\n bytes memory _key,\\n bytes memory _value\\n )\\n private\\n pure\\n returns (\\n TrieNode memory _node\\n )\\n {\\n bytes[] memory raw = new bytes[](2);\\n bytes memory key = _addHexPrefix(_key, true);\\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\\n raw[1] = Lib_RLPWriter.writeBytes(_value);\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Creates an empty branch node.\\n * @return _node Empty branch node as a TrieNode struct.\\n */\\n function _makeEmptyBranchNode()\\n private\\n pure\\n returns (\\n TrieNode memory _node\\n )\\n {\\n bytes[] memory raw = new bytes[](BRANCH_NODE_LENGTH);\\n for (uint256 i = 0; i < raw.length; i++) {\\n raw[i] = RLP_NULL_BYTES;\\n }\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Modifies the value slot for a given branch.\\n * @param _branch Branch node to modify.\\n * @param _value Value to insert into the branch.\\n * @return _updatedNode Modified branch node.\\n */\\n function _editBranchValue(\\n TrieNode memory _branch,\\n bytes memory _value\\n )\\n private\\n pure\\n returns (\\n TrieNode memory _updatedNode\\n )\\n {\\n bytes memory encoded = Lib_RLPWriter.writeBytes(_value);\\n _branch.decoded[_branch.decoded.length - 1] = Lib_RLPReader.toRLPItem(encoded);\\n return _makeNode(_branch.decoded);\\n }\\n\\n /**\\n * @notice Modifies a slot at an index for a given branch.\\n * @param _branch Branch node to modify.\\n * @param _index Slot index to modify.\\n * @param _value Value to insert into the slot.\\n * @return _updatedNode Modified branch node.\\n */\\n function _editBranchIndex(\\n TrieNode memory _branch,\\n uint8 _index,\\n bytes memory _value\\n )\\n private\\n pure\\n returns (\\n TrieNode memory _updatedNode\\n )\\n {\\n bytes memory encoded = _value.length < 32 ? _value : Lib_RLPWriter.writeBytes(_value);\\n _branch.decoded[_index] = Lib_RLPReader.toRLPItem(encoded);\\n return _makeNode(_branch.decoded);\\n }\\n\\n /**\\n * @notice Utility; adds a prefix to a key.\\n * @param _key Key to prefix.\\n * @param _isLeaf Whether or not the key belongs to a leaf.\\n * @return _prefixedKey Prefixed key.\\n */\\n function _addHexPrefix(\\n bytes memory _key,\\n bool _isLeaf\\n )\\n private\\n pure\\n returns (\\n bytes memory _prefixedKey\\n )\\n {\\n uint8 prefix = _isLeaf ? uint8(0x02) : uint8(0x00);\\n uint8 offset = uint8(_key.length % 2);\\n bytes memory prefixed = new bytes(2 - offset);\\n prefixed[0] = bytes1(prefix + offset);\\n return abi.encodePacked(prefixed, _key);\\n }\\n\\n /**\\n * @notice Utility; removes a prefix from a path.\\n * @param _path Path to remove the prefix from.\\n * @return _unprefixedKey Unprefixed key.\\n */\\n function _removeHexPrefix(\\n bytes memory _path\\n )\\n private\\n pure\\n returns (\\n bytes memory _unprefixedKey\\n )\\n {\\n if (uint8(_path[0]) % 2 == 0) {\\n return Lib_BytesUtils.slice(_path, 2);\\n } else {\\n return Lib_BytesUtils.slice(_path, 1);\\n }\\n }\\n\\n /**\\n * @notice Utility; combines two node arrays. Array lengths are required\\n * because the actual lengths may be longer than the filled lengths.\\n * Array resizing is extremely costly and should be avoided.\\n * @param _a First array to join.\\n * @param _aLength Length of the first array.\\n * @param _b Second array to join.\\n * @param _bLength Length of the second array.\\n * @return _joined Combined node array.\\n */\\n function _joinNodeArrays(\\n TrieNode[] memory _a,\\n uint256 _aLength,\\n TrieNode[] memory _b,\\n uint256 _bLength\\n )\\n private\\n pure\\n returns (\\n TrieNode[] memory _joined\\n )\\n {\\n TrieNode[] memory ret = new TrieNode[](_aLength + _bLength);\\n\\n // Copy elements from the first array.\\n for (uint256 i = 0; i < _aLength; i++) {\\n ret[i] = _a[i];\\n }\\n\\n // Copy elements from the second array.\\n for (uint256 i = 0; i < _bLength; i++) {\\n ret[i + _aLength] = _b[i];\\n }\\n\\n return ret;\\n }\\n}\\n\",\"keccak256\":\"0x161f65220b8c5cf295232f8c58c2744fbc898bf77da5f9d9c5b2dd673dafc6f6\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/trie/Lib_SecureMerkleTrie.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_MerkleTrie } from \\\"./Lib_MerkleTrie.sol\\\";\\n\\n/**\\n * @title Lib_SecureMerkleTrie\\n */\\nlibrary Lib_SecureMerkleTrie {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * @notice Verifies a proof that a given key/value pair is present in the\\n * Merkle trie.\\n * @param _key Key of the node to search for, as a hex string.\\n * @param _value Value of the node to search for, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the desired node. Unlike\\n * traditional Merkle trees, this proof is executed top-down and consists\\n * of a list of RLP-encoded nodes that make a path down to the target node.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _verified `true` if the k/v pair exists in the trie, `false` otherwise.\\n */\\n function verifyInclusionProof(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bool _verified\\n )\\n {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.verifyInclusionProof(key, _value, _proof, _root);\\n }\\n\\n /**\\n * @notice Verifies a proof that a given key is *not* present in\\n * the Merkle trie.\\n * @param _key Key of the node to search for, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\\n * target node.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _verified `true` if the key is not present in the trie, `false` otherwise.\\n */\\n function verifyExclusionProof(\\n bytes memory _key,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bool _verified\\n )\\n {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.verifyExclusionProof(key, _proof, _root);\\n }\\n\\n /**\\n * @notice Updates a Merkle trie and returns a new root hash.\\n * @param _key Key of the node to update, as a hex string.\\n * @param _value Value of the node to update, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\\n * target node. If the key exists, we can simply update the value.\\n * Otherwise, we need to modify the trie to handle the new k/v pair.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _updatedRoot Root hash of the newly constructed trie.\\n */\\n function update(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bytes32 _updatedRoot\\n )\\n {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.update(key, _value, _proof, _root);\\n }\\n\\n /**\\n * @notice Retrieves the value associated with a given key.\\n * @param _key Key to search for, as hex bytes.\\n * @param _proof Merkle trie inclusion proof for the key.\\n * @param _root Known root of the Merkle trie.\\n * @return _exists Whether or not the key exists.\\n * @return _value Value of the key if it exists.\\n */\\n function get(\\n bytes memory _key,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bool _exists,\\n bytes memory _value\\n )\\n {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.get(key, _proof, _root);\\n }\\n\\n /**\\n * Computes the root hash for a trie with a single node.\\n * @param _key Key for the single node.\\n * @param _value Value for the single node.\\n * @return _updatedRoot Hash of the trie.\\n */\\n function getSingleNodeRootHash(\\n bytes memory _key,\\n bytes memory _value\\n )\\n internal\\n pure\\n returns (\\n bytes32 _updatedRoot\\n )\\n {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.getSingleNodeRootHash(key, _value);\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Computes the secure counterpart to a key.\\n * @param _key Key to get a secure key from.\\n * @return _secureKey Secure version of the key.\\n */\\n function _getSecureKey(\\n bytes memory _key\\n )\\n private\\n pure\\n returns (\\n bytes memory _secureKey\\n )\\n {\\n return abi.encodePacked(keccak256(_key));\\n }\\n}\",\"keccak256\":\"0x79355346f74bb1eb9eeb733cb5d9677d50115c4f390307cbf608fe071a1ada0c\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_Bytes32Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_Byte32Utils\\n */\\nlibrary Lib_Bytes32Utils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \\\"true.\\\"\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as a boolean.\\n */\\n function toBool(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return _in != 0;\\n }\\n\\n /**\\n * Converts a boolean to a bytes32 value.\\n * @param _in Input boolean value.\\n * @return Boolean as a bytes32.\\n */\\n function fromBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in ? 1 : 0));\\n }\\n\\n /**\\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as an address.\\n */\\n function toAddress(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return address(uint160(uint256(_in)));\\n }\\n\\n /**\\n * Converts an address to a bytes32.\\n * @param _in Input address value.\\n * @return Address as a bytes32.\\n */\\n function fromAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in));\\n }\\n\\n /**\\n * Removes the leading zeros from a bytes32 value and returns a new (smaller) bytes value.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 without any leading zeros.\\n */\\n function removeLeadingZeros(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out;\\n\\n assembly {\\n // Figure out how many leading zero bytes to remove.\\n let shift := 0\\n for { let i := 0 } and(lt(i, 32), eq(byte(i, _in), 0)) { i := add(i, 1) } {\\n shift := add(shift, 1)\\n }\\n\\n // Reserve some space for our output and fix the free memory pointer.\\n out := mload(0x40)\\n mstore(0x40, add(out, 0x40))\\n\\n // Shift the value and store it into the output bytes.\\n mstore(add(out, 0x20), shl(mul(shift, 8), _in))\\n\\n // Store the new size (with leading zero bytes removed) in the output byte size.\\n mstore(out, sub(32, shift))\\n }\\n\\n return out;\\n }\\n}\\n\",\"keccak256\":\"0xfa2def593e3fc56a31852c3744aefdaa93cec74e721bfcfeb1e5d166c7c60b64\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_BytesUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Lib_BytesUtils\\n */\\nlibrary Lib_BytesUtils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_start + _length >= _start, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n if (_bytes.length - _start == 0) {\\n return bytes('');\\n }\\n\\n return slice(_bytes, _start, _bytes.length - _start);\\n }\\n\\n function toBytes32PadLeft(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n bytes32 ret;\\n uint256 len = _bytes.length <= 32 ? _bytes.length : 32;\\n assembly {\\n ret := shr(mul(sub(32, len), 8), mload(add(_bytes, 32)))\\n }\\n return ret;\\n }\\n\\n function toBytes32(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n if (_bytes.length < 32) {\\n bytes32 ret;\\n assembly {\\n ret := mload(add(_bytes, 32))\\n }\\n return ret;\\n }\\n\\n return abi.decode(_bytes,(bytes32)); // will truncate if input length > 32 bytes\\n }\\n\\n function toUint256(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return uint256(toBytes32(_bytes));\\n }\\n\\n function toUint24(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n uint24\\n )\\n {\\n require(_start + 3 >= _start, \\\"toUint24_overflow\\\");\\n require(_bytes.length >= _start + 3 , \\\"toUint24_outOfBounds\\\");\\n uint24 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x3), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toUint8(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n uint8\\n )\\n {\\n require(_start + 1 >= _start, \\\"toUint8_overflow\\\");\\n require(_bytes.length >= _start + 1 , \\\"toUint8_outOfBounds\\\");\\n uint8 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x1), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toAddress(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n require(_start + 20 >= _start, \\\"toAddress_overflow\\\");\\n require(_bytes.length >= _start + 20, \\\"toAddress_outOfBounds\\\");\\n address tempAddress;\\n\\n assembly {\\n tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000)\\n }\\n\\n return tempAddress;\\n }\\n\\n function toNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory nibbles = new bytes(_bytes.length * 2);\\n\\n for (uint256 i = 0; i < _bytes.length; i++) {\\n nibbles[i * 2] = _bytes[i] >> 4;\\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\\n }\\n\\n return nibbles;\\n }\\n\\n function fromNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory ret = new bytes(_bytes.length / 2);\\n\\n for (uint256 i = 0; i < ret.length; i++) {\\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\\n }\\n\\n return ret;\\n }\\n\\n function equal(\\n bytes memory _bytes,\\n bytes memory _other\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return keccak256(_bytes) == keccak256(_other);\\n }\\n}\\n\",\"keccak256\":\"0xa5195afe32fb2cf104d156e8f4bd39df1ec79bf6ba232097b9e8e0ee14fbc298\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/utils/Lib_EthUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// @unsupported: ovm\\npragma solidity >0.5.0 <0.8.0;\\npragma experimental ABIEncoderV2;\\n\\n/* Library Imports */\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"./Lib_Bytes32Utils.sol\\\";\\n\\n/**\\n * @title Lib_EthUtils\\n */\\nlibrary Lib_EthUtils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Gets the code for a given address.\\n * @param _address Address to get code for.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Code read from the contract.\\n */\\n function getCode(\\n address _address,\\n uint256 _offset,\\n uint256 _length\\n )\\n internal\\n view\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory code;\\n assembly {\\n code := mload(0x40)\\n mstore(0x40, add(code, add(_length, 0x20)))\\n mstore(code, _length)\\n extcodecopy(_address, add(code, 0x20), _offset, _length)\\n }\\n\\n return code;\\n }\\n\\n /**\\n * Gets the full code for a given address.\\n * @param _address Address to get code for.\\n * @return Full code of the contract.\\n */\\n function getCode(\\n address _address\\n )\\n internal\\n view\\n returns (\\n bytes memory\\n )\\n {\\n return getCode(\\n _address,\\n 0,\\n getCodeSize(_address)\\n );\\n }\\n\\n /**\\n * Gets the size of a contract's code in bytes.\\n * @param _address Address to get code size for.\\n * @return Size of the contract's code in bytes.\\n */\\n function getCodeSize(\\n address _address\\n )\\n internal\\n view\\n returns (\\n uint256\\n )\\n {\\n uint256 codeSize;\\n assembly {\\n codeSize := extcodesize(_address)\\n }\\n\\n return codeSize;\\n }\\n\\n /**\\n * Gets the hash of a contract's code.\\n * @param _address Address to get a code hash for.\\n * @return Hash of the contract's code.\\n */\\n function getCodeHash(\\n address _address\\n )\\n internal\\n view\\n returns (\\n bytes32\\n )\\n {\\n bytes32 codeHash;\\n assembly {\\n codeHash := extcodehash(_address)\\n }\\n\\n return codeHash;\\n }\\n\\n /**\\n * Creates a contract with some given initialization code.\\n * @param _code Contract initialization code.\\n * @return Address of the created contract.\\n */\\n function createContract(\\n bytes memory _code\\n )\\n internal\\n returns (\\n address\\n )\\n {\\n address created;\\n assembly {\\n created := create(\\n 0,\\n add(_code, 0x20),\\n mload(_code)\\n )\\n }\\n\\n return created;\\n }\\n\\n /**\\n * Computes the address that would be generated by CREATE.\\n * @param _creator Address creating the contract.\\n * @param _nonce Creator's nonce.\\n * @return Address to be generated by CREATE.\\n */\\n function getAddressForCREATE(\\n address _creator,\\n uint256 _nonce\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n bytes[] memory encoded = new bytes[](2);\\n encoded[0] = Lib_RLPWriter.writeAddress(_creator);\\n encoded[1] = Lib_RLPWriter.writeUint(_nonce);\\n\\n bytes memory encodedList = Lib_RLPWriter.writeList(encoded);\\n return Lib_Bytes32Utils.toAddress(keccak256(encodedList));\\n }\\n\\n /**\\n * Computes the address that would be generated by CREATE2.\\n * @param _creator Address creating the contract.\\n * @param _bytecode Bytecode of the contract to be created.\\n * @param _salt 32 byte salt value mixed into the hash.\\n * @return Address to be generated by CREATE2.\\n */\\n function getAddressForCREATE2(\\n address _creator,\\n bytes memory _bytecode,\\n bytes32 _salt\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n bytes32 hashedData = keccak256(abi.encodePacked(\\n byte(0xff),\\n _creator,\\n _salt,\\n keccak256(_bytecode)\\n ));\\n\\n return Lib_Bytes32Utils.toAddress(hashedData);\\n }\\n}\\n\",\"keccak256\":\"0xf29a67d78e61cb472d524b779b32cfcb39a587f4096500d5419e6425ed367d49\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x608060405234801561001057600080fd5b506040516149b93803806149b98339818101604052602081101561003357600080fd5b5051600080546001600160a01b039092166001600160a01b0319909216919091179055614954806100656000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c806322d1470214610046578063299ca4781461009a578063461a4478146100a2575b600080fd5b61007e6004803603608081101561005c57600080fd5b506001600160a01b038135169060208101359060408101359060600135610148565b604080516001600160a01b039092168252519081900360200190f35b61007e610229565b61007e600480360360208110156100b857600080fd5b8101906020810181356401000000008111156100d357600080fd5b8201836020820111156100e557600080fd5b8035906020019184600183028401116401000000008311171561010757600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610238945050505050565b600061017c6040518060400160405280601181526020017027ab26afa33930bab22b32b934b334b2b960791b815250610238565b6001600160a01b0316336001600160a01b0316146101cb5760405162461bcd60e51b81526004018080602001828103825260318152602001806148ee6031913960400191505060405180910390fd5b848484846040516101db90610314565b80856001600160a01b03168152602001848152602001838152602001828152602001945050505050604051809103906000f08015801561021f573d6000803e3d6000fd5b5095945050505050565b6000546001600160a01b031681565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b83811015610298578181015183820152602001610280565b50505050905090810190601f1680156102c55780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b1580156102e257600080fd5b505afa1580156102f6573d6000803e3d6000fd5b505050506040513d602081101561030c57600080fd5b505192915050565b6145cc806103228339019056fe60806040523480156200001157600080fd5b50604051620045cc380380620045cc833981016040819052620000349162000232565b600080546001600160a01b0319166001600160a01b038616179055600583905560028290556003829055600681905560408051808201909152601781527f4f564d5f53746174654d616e61676572466163746f72790000000000000000006020820152620000a29062000150565b6001600160a01b0316639ed93318306040518263ffffffff1660e01b8152600401620000cf919062000299565b602060405180830381600087803b158015620000ea57600080fd5b505af1158015620000ff573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000125919062000273565b600180546001600160a01b0319166001600160a01b039290921691909117905550620002c692505050565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b83811015620001b257818101518382015260200162000198565b50505050905090810190601f168015620001e05780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b158015620001fe57600080fd5b505afa15801562000213573d6000803e3d6000fd5b505050506040513d60208110156200022a57600080fd5b505192915050565b6000806000806080858703121562000248578384fd5b84516200025581620002ad565b60208601516040870151606090970151919890975090945092505050565b60006020828403121562000285578081fd5b81516200029281620002ad565b9392505050565b6001600160a01b0391909116815260200190565b6001600160a01b0381168114620002c357600080fd5b50565b6142f680620002d66000396000f3fe608060405234801561001057600080fd5b50600436106100cf5760003560e01c8063845fe7a31161008c578063b2fa1c9e11610066578063b2fa1c9e14610185578063b52805711461019a578063b9194310146101a2578063c1c618b8146101b5576100cf565b8063845fe7a314610155578063a244316a14610168578063b1c9fe6e14610170576100cf565b8063299ca478146100d45780632e1ac36c146100f25780632eb1375814610107578063461a44781461011a578063732f960b1461012d578063805e9d3014610140575b600080fd5b6100dc6101bd565b6040516100e99190613c74565b60405180910390f35b6101056101003660046138d0565b6101cc565b005b610105610115366004613910565b610565565b6100dc6101283660046139f8565b6108a1565b61010561013b366004613abc565b61097f565b610148610c6f565b6040516100e99190613bcd565b6101056101633660046138d0565b610c75565b610105610fa1565b610178611128565b6040516100e99190613d26565b61018d611131565b6040516100e99190613d1b565b6100dc61114c565b6101056101b0366004613871565b61115b565b610148611475565b6000546001600160a01b031681565b60018060045460ff1660028111156101e057fe5b146102065760405162461bcd60e51b81526004016101fd90614077565b60405180910390fd5b60025460065460005a6001546040516363b285f960e11b81529192506001600160a01b03169063c7650bf290610242908a908a90600401613c88565b602060405180830381600087803b15801561025c57600080fd5b505af1158015610270573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610294919061395d565b15156001146102b55760405162461bcd60e51b81526004016101fd90613e22565b60015460405163fbcbc0f160e01b81526000916001600160a01b03169063fbcbc0f1906102e6908b90600401613c74565b60c06040518083038186803b1580156102fe57600080fd5b505afa158015610312573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103369190613a3d565b600154604051631aaf392f60e01b81529192506000916001600160a01b0390911690631aaf392f9061036e908c908c90600401613c88565b60206040518083038186803b15801561038657600080fd5b505afa15801561039a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103be9190613977565b90506103ff886040516020016103d49190613bcd565b6040516020818303038152906040526103f46103ef8461147b565b6114c4565b89856040015161152e565b6040808401919091526001549051638f3b964760e01b81526001600160a01b0390911690638f3b964790610439908c908690600401613cc2565b600060405180830381600087803b15801561045357600080fd5b505af1158015610467573d6000803e3d6000fd5b505050507f3e3ed1a676a2754a041b49bf752e0f167c8753495e36c320fe01d1ef7476253c898960405161049c929190613c88565b60405180910390a1505060005a820390506104dd6040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506108a1565b6001600160a01b0316631e16e92f858533856040518563ffffffff1660e01b815260040180858152602001848152602001836001600160a01b03168152602001828152602001945050505050600060405180830381600087803b15801561054357600080fd5b505af1158015610557573d6000803e3d6000fd5b505050505050505050505050565b60018060045460ff16600281111561057957fe5b146105965760405162461bcd60e51b81526004016101fd90614077565b60025460065460005a9050600160009054906101000a90046001600160a01b03166001600160a01b03166399056ba96040518163ffffffff1660e01b815260040160206040518083038186803b1580156105ef57600080fd5b505afa158015610603573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106279190613977565b156106445760405162461bcd60e51b81526004016101fd90613f03565b600154604051630b38106960e11b81526001600160a01b039091169063167020d290610674908990600401613c74565b602060405180830381600087803b15801561068e57600080fd5b505af11580156106a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106c6919061395d565b15156001146106e75760405162461bcd60e51b81526004016101fd90613fbd565b60015460405163fbcbc0f160e01b81526000916001600160a01b03169063fbcbc0f190610718908a90600401613c74565b60c06040518083038186803b15801561073057600080fd5b505afa158015610744573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107689190613a3d565b90506107a78760405160200161077e9190613bb0565b60405160208183030381529060405261079e61079984611554565b611594565b8860035461152e565b6003556040517fcec9ef675d775706a02b43afe48af52c5019bc50f99582e3208c6ff55d59c008906107da908990613c74565b60405180910390a15060005a8203905061081a6040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506108a1565b6001600160a01b0316631e16e92f858533856040518563ffffffff1660e01b815260040180858152602001848152602001836001600160a01b03168152602001828152602001945050505050600060405180830381600087803b15801561088057600080fd5b505af1158015610894573d6000803e3d6000fd5b5050505050505050505050565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b838110156109015781810151838201526020016108e9565b50505050905090810190601f16801561092e5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561094b57600080fd5b505afa15801561095f573d6000803e3d6000fd5b505050506040513d602081101561097557600080fd5b505190505b919050565b60008060045460ff16600281111561099357fe5b146109b05760405162461bcd60e51b81526004016101fd90614077565b60025460065460005a90506006546109c78661169d565b146109e45760405162461bcd60e51b81526004016101fd906140c8565b6103e88560a0015161040802816109f757fe5b04620186a0015a1015610a1c5760405162461bcd60e51b81526004016101fd90613f60565b6000610a536040518060400160405280601481526020017327ab26afa2bc32b1baba34b7b726b0b730b3b2b960611b8152506108a1565b600154604051631381ba4d60e01b81529192506001600160a01b031690631381ba4d90610a84908490600401613c74565b600060405180830381600087803b158015610a9e57600080fd5b505af1158015610ab2573d6000803e3d6000fd5b5050600154604051639be3ad6760e01b81526001600160a01b038086169450639be3ad679350610ae9928b9291169060040161415c565b600060405180830381600087803b158015610b0357600080fd5b505af1158015610b17573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610b3f919081019061398f565b50600154604051631381ba4d60e01b81526001600160a01b0390911690631381ba4d90610b7190600090600401613c74565b600060405180830381600087803b158015610b8b57600080fd5b505af1158015610b9f573d6000803e3d6000fd5b50506004805460ff191660011790555060009150505a82039050610be96040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506108a1565b6001600160a01b0316631e16e92f858533856040518563ffffffff1660e01b815260040180858152602001848152602001836001600160a01b03168152602001828152602001945050505050600060405180830381600087803b158015610c4f57600080fd5b505af1158015610c63573d6000803e3d6000fd5b50505050505050505050565b60025490565b60008060045460ff166002811115610c8957fe5b14610ca65760405162461bcd60e51b81526004016101fd90614077565b60025460065460005a600154604051630ad2267960e01b81529192506001600160a01b031690630ad2267990610ce2908a908a90600401613c88565b60206040518083038186803b158015610cfa57600080fd5b505afa158015610d0e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d32919061395d565b15610d4f5760405162461bcd60e51b81526004016101fd90613d3a565b60015460405163c8e40fbf60e01b81526001600160a01b039091169063c8e40fbf90610d7f908a90600401613c74565b60206040518083038186803b158015610d9757600080fd5b505afa158015610dab573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dcf919061395d565b1515600114610df05760405162461bcd60e51b81526004016101fd906140ff565b60015460405163136e2d8960e11b81526000916001600160a01b0316906326dc5b1290610e21908b90600401613c74565b60206040518083038186803b158015610e3957600080fd5b505afa158015610e4d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e719190613977565b905060007f56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421821415610ea557506000610f02565b600080610ed28a604051602001610ebc9190613bcd565b6040516020818303038152906040528a866116b6565b909250905060018215151415610efa57610ef3610eee826116df565b6116f2565b9250610eff565b600092505b50505b600154604051635c17d62960e01b81526001600160a01b0390911690635c17d62990610f36908c908c908690600401613ca1565b600060405180830381600087803b158015610f5057600080fd5b505af1158015610f64573d6000803e3d6000fd5b50505050505060005a820390506104dd6040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506108a1565b60018060045460ff166002811115610fb557fe5b14610fd25760405162461bcd60e51b81526004016101fd90614077565b600160009054906101000a90046001600160a01b03166001600160a01b031663d7bd4a2a6040518163ffffffff1660e01b815260040160206040518083038186803b15801561102057600080fd5b505afa158015611034573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110589190613977565b156110755760405162461bcd60e51b81526004016101fd90613dc5565b600160009054906101000a90046001600160a01b03166001600160a01b03166399056ba96040518163ffffffff1660e01b815260040160206040518083038186803b1580156110c357600080fd5b505afa1580156110d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110fb9190613977565b156111185760405162461bcd60e51b81526004016101fd9061401a565b506004805460ff19166002179055565b60045460ff1681565b6000600260045460ff16600281111561114657fe5b14905090565b6001546001600160a01b031681565b60008060045460ff16600281111561116f57fe5b1461118c5760405162461bcd60e51b81526004016101fd90614077565b60025460065460005a60015460405163c8e40fbf60e01b81529192506001600160a01b03169063c8e40fbf906111c6908a90600401613c74565b60206040518083038186803b1580156111de57600080fd5b505afa1580156111f2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611216919061395d565b1580156112a057506001546040516307a1294560e01b81526001600160a01b03909116906307a129459061124e908a90600401613c74565b60206040518083038186803b15801561126657600080fd5b505afa15801561127a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061129e919061395d565b155b6112bc5760405162461bcd60e51b81526004016101fd90613d7f565b6000806112eb896040516020016112d39190613bb0565b604051602081830303815290604052886002546116b6565b90925090506001821515141561140c57600061130682611721565b606081015190915089907fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470141561133f5750600061136a565b816060015161134d826117b3565b1461136a5760405162461bcd60e51b81526004016101fd90613e80565b6001546040805160c08101825284518152602080860151908201528482015181830152606080860151908201526001600160a01b038481166080830152600060a08301529151638f3b964760e01b81529190921691638f3b9647916113d3918f91600401613cc2565b600060405180830381600087803b1580156113ed57600080fd5b505af1158015611401573d6000803e3d6000fd5b50505050505061143c565b600154604051630d631c9d60e31b81526001600160a01b0390911690636b18e4e890610f36908c90600401613c74565b505060005a820390506104dd6040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506108a1565b60035490565b6060806000805b6020811085821a15161561149c5760019182019101611482565b5060405191506040820160405283600882021b60208301528060200382525080915050919050565b606080825160011480156114ec57506080836000815181106114e257fe5b016020015160f81c105b156114f8575081611528565b611504835160806117b7565b83604051602001611516929190613bd6565b60405160208183030381529060405290505b92915050565b60008061153a86611906565b905061154881868686611936565b9150505b949350505050565b61155c61378f565b604051806080016040528083600001518152602001836020015181526020018360400151815260200183606001518152509050919050565b60408051600480825260a0820190925260609160009190816020015b60608152602001906001900390816115b057505083519091506115d6906103ef9061147b565b816000815181106115e357fe5b60200260200101819052506116016103ef846020015160001b61147b565b8160018151811061160e57fe5b602002602001018190525061164583604001516040516020016116319190613bcd565b6040516020818303038152906040526114c4565b8160028151811061165257fe5b602002602001018190525061167583606001516040516020016116319190613bcd565b8160038151811061168257fe5b6020026020010181905250611696816119d1565b9392505050565b60006116a882611a15565b805190602001209050919050565b6000606060006116c586611906565b90506116d2818686611a50565b9250925050935093915050565b60606115286116ed83611b23565b611b48565b600080600060208451111561170857602061170b565b83515b6020858101519190036008021c92505050919050565b61172961378f565b600061173483611bd7565b9050604051806080016040528061175e8360008151811061175157fe5b6020026020010151611bea565b81526020016117738360018151811061175157fe5b81526020016117958360028151811061178857fe5b6020026020010151611bf1565b81526020016117aa8360038151811061178857fe5b90529392505050565b3f90565b6060806038841015611811576040805160018082528183019092529060208201818036833701905050905082840160f81b816000815181106117f557fe5b60200101906001600160f81b031916908160001a905350611696565b600060015b80868161181f57fe5b04156118345760019091019061010002611816565b816001016001600160401b038111801561184d57600080fd5b506040519080825280601f01601f191660200182016040528015611878576020820181803683370190505b50925084820160370160f81b8360008151811061189157fe5b60200101906001600160f81b031916908160001a905350600190505b8181116118fd576101008183036101000a87816118c657fe5b04816118ce57fe5b0660f81b8382815181106118de57fe5b60200101906001600160f81b031916908160001a9053506001016118ad565b50509392505050565b606081805190602001206040516020016119209190613bcd565b6040516020818303038152906040529050919050565b6040805180820190915260018152600160ff1b60209091015260007f56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42182141561198a576119838585611ceb565b905061154c565b600061199584611d0f565b90506000806119a5838987611de5565b509150915060006119b88484848b612188565b90506119c4818a6124a0565b9998505050505050505050565b606060006119de836125f9565b90506119ec815160c06117b7565b816040516020016119fe929190613bd6565b604051602081830303815290604052915050919050565b6060816000015182602001518360400151846060015185608001518660a001518760c001516040516020016119209796959493929190613c05565b600060606000611a5f85611d0f565b90506000806000611a71848a89611de5565b81519295509093509150158080611a855750815b611ad6576040805162461bcd60e51b815260206004820152601a60248201527f50726f76696465642070726f6f6620697320696e76616c69642e000000000000604482015290519081900360640190fd5b600081611af25760405180602001604052806000815250611b11565b611b11866001870381518110611b0457fe5b6020026020010151612702565b919b919a509098505050505050505050565b611b2b6137b6565b506040805180820190915281518152602082810190820152919050565b60606000806000611b588561271e565b919450925090506000816001811115611b6d57fe5b14611bbf576040805162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c502062797465732076616c75652e0000000000000000604482015290519081900360640190fd5b611bce85602001518484612a47565b95945050505050565b6060611528611be583611b23565b612af4565b6000611528825b6000602182600001511115611c4d576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e000000000000604482015290519081900360640190fd5b6000806000611c5b8561271e565b919450925090506000816001811115611c7057fe5b14611cc2576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e000000000000604482015290519081900360640190fd5b602080860151840180519091841015611ce15760208490036101000a90045b9695505050505050565b6000611cff611cf984612c6a565b83612d66565b5180516020909101209392505050565b60606000611d1c83611bd7565b9050600081516001600160401b0381118015611d3757600080fd5b50604051908082528060200260200182016040528015611d7157816020015b611d5e6137d0565b815260200190600190039081611d565790505b50905060005b8251811015611ddd576000611d9e848381518110611d9157fe5b6020026020010151611b48565b90506040518060400160405280828152602001611dba83611bd7565b815250838381518110611dc957fe5b602090810291909101015250600101611d77565b509392505050565b60006060818080611df587612c6a565b905085600080611e036137d0565b60005b8c51811015612160578c8181518110611e1b57fe5b6020026020010151915082840193506001870196508360001415611e8f57815180516020909101208514611e8a576040805162461bcd60e51b8152602060048201526011602482015270092dcecc2d8d2c840e4dedee840d0c2e6d607b1b604482015290519081900360640190fd5b611f56565b815151602011611ef657815180516020909101208514611e8a576040805162461bcd60e51b815260206004820152601b60248201527f496e76616c6964206c6172676520696e7465726e616c20686173680000000000604482015290519081900360640190fd5b84611f048360000151612dfa565b14611f56576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420696e7465726e616c206e6f64652068617368000000000000604482015290519081900360640190fd5b60208201515160111415611fc5578551841415611f7257612160565b6000868581518110611f8057fe5b602001015160f81c60f81b60f81c9050600083602001518260ff1681518110611fa557fe5b60200260200101519050611fb881612e26565b9650600194505050612158565b6002826020015151141561210b576000611fde83612e5c565b9050600081600081518110611fef57fe5b016020015160f81c905060018116600203600061200f8460ff8416612e7a565b9050600061201d8b8a612e7a565b9050600061202b8383612eab565b905060ff851660021480612042575060ff85166003145b15612074578083511480156120575750808251145b1561206157988901985b50600160ff1b9950612160945050505050565b60ff85161580612087575060ff85166001145b156120d457806120a45750600160ff1b9950612160945050505050565b6120c588602001516001815181106120b857fe5b6020026020010151612e26565b9a509750612158945050505050565b60405162461bcd60e51b815260040180806020018281038252602681526020018061429b6026913960400191505060405180910390fd5b6040805162461bcd60e51b815260206004820152601d60248201527f526563656976656420616e20756e706172736561626c65206e6f64652e000000604482015290519081900360640190fd5b600101611e06565b50600160ff1b8414866121738786612e7a565b909e909d50909b509950505050505050505050565b6060600083905060008660018703815181106121a057fe5b6020026020010151905060006121b582612f11565b6040805160038082526080820190925291925060009190816020015b6121d96137d0565b8152602001906001900390816121d157905050905060008451600014801561220c5750600283600281111561220a57fe5b145b156122425761222361221d85612fe7565b88612d66565b82828151811061222f57fe5b6020908102919091010152600101612483565b600083600281111561225057fe5b14156122b6578451612285576122668488612ffa565b82828151811061227257fe5b60209081029190910101526001016122b1565b8382828151811061229257fe5b602002602001018190525060018101905061222361221d866001612e7a565b612483565b60006122c185612fe7565b905060006122cf8288612eab565b905080156123305760006122e583600084613045565b90506122f9816122f48c613195565b6131d6565b85858151811061230557fe5b60200260200101819052506001840193506123208383612e7a565b925061232c8883612e7a565b9750505b600061233a61321a565b905082516000141561235f576123588161235389612702565b612ffa565b90506123f7565b60008360008151811061236e57fe5b016020015160f81c9050612383846001612e7a565b9350600287600281111561239357fe5b14156123ce5760006123ad856123a88b612702565b612d66565b90506123c683836123c18460000151613195565b6132a7565b9250506123f5565b8351156123e45760006123ad856122f48b612702565b6123f282826123c18b612702565b91505b505b875161242c57612407818b612ffa565b90508085858151811061241657fe5b602002602001018190525060018401935061247f565b612437886001612e7a565b97508085858151811061244657fe5b6020026020010181905250600184019350612461888b612d66565b85858151811061246d57fe5b60200260200101819052506001840193505b5050505b6124928a60018b038484613300565b9a9950505050505050505050565b6000806124ac83612c6a565b90506124b66137d0565b84516000906060905b80156125e4578760018203815181106124d457fe5b602002602001015193506124e784612f11565b925060028360028111156124f757fe5b141561252257600061250885612fe7565b905061251a8660008351895103613045565b9550506125ce565b600183600281111561253057fe5b141561257057600061254185612fe7565b90506125538660008351895103613045565b83519096501561256a5761256781846131d6565b94505b506125ce565b600083600281111561257e57fe5b14156125ce578151156125ce5760008560018751038151811061259d57fe5b602001015160f81c60f81b60f81c90506125bd8660006001895103613045565b95506125ca8582856132a7565b9450505b83516125d990613195565b9150600019016124bf565b50509051805160209091012095945050505050565b606081516000141561261a575060408051600081526020810190915261097a565b6000805b835181101561264d5783818151811061263357fe5b60200260200101515182019150808060010191505061261e565b6000826001600160401b038111801561266557600080fd5b506040519080825280601f01601f191660200182016040528015612690576020820181803683370190505b50600092509050602081015b85518310156126f95760008684815181106126b357fe5b6020026020010151905060006020820190506126d1838284516133e2565b8785815181106126dd57fe5b602002602001015151830192505050828060010193505061269c565b50949350505050565b60208101518051606091611528916000198101908110611d9157fe5b60008060008084600001511161277b576040805162461bcd60e51b815260206004820152601860248201527f524c50206974656d2063616e6e6f74206265206e756c6c2e0000000000000000604482015290519081900360640190fd5b6020840151805160001a607f81116127a0576000600160009450945094505050612a40565b60b78111612815578551607f198201908110612803576040805162461bcd60e51b815260206004820152601960248201527f496e76616c696420524c502073686f727420737472696e672e00000000000000604482015290519081900360640190fd5b60019550935060009250612a40915050565b60bf81116128f957855160b6198201908110612878576040805162461bcd60e51b815260206004820152601f60248201527f496e76616c696420524c50206c6f6e6720737472696e67206c656e6774682e00604482015290519081900360640190fd5b6000816020036101000a60018501510490508082018860000151116128e4576040805162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c50206c6f6e6720737472696e672e0000000000000000604482015290519081900360640190fd5b60019091019550935060009250612a40915050565b60f7811161296d57855160bf19820190811061295c576040805162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c502073686f7274206c6973742e000000000000000000604482015290519081900360640190fd5b600195509350849250612a40915050565b855160f61982019081106129c8576040805162461bcd60e51b815260206004820152601d60248201527f496e76616c696420524c50206c6f6e67206c697374206c656e6774682e000000604482015290519081900360640190fd5b6000816020036101000a6001850151049050808201886000015111612a2d576040805162461bcd60e51b815260206004820152601660248201527524b73b30b634b210292628103637b733903634b9ba1760511b604482015290519081900360640190fd5b6001918201965094509250612a40915050565b9193909250565b60606000826001600160401b0381118015612a6157600080fd5b506040519080825280601f01601f191660200182016040528015612a8c576020820181803683370190505b509050805160001415612aa0579050611696565b8484016020820160005b60208604811015612acb578251825260209283019290910190600101612aaa565b5080519151601f959095166020036101000a600019019182169119909416179092525092915050565b6060600080612b028461271e565b91935090915060019050816001811115612b1857fe5b14612b6a576040805162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c50206c6973742076616c75652e000000000000000000604482015290519081900360640190fd5b6040805160208082526104208201909252600091816020015b612b8b6137b6565b815260200190600190039081612b835790505090506000835b8651811015612c5f5760208210612bec5760405162461bcd60e51b815260040180806020018281038252602a815260200180614271602a913960400191505060405180910390fd5b600080612c186040518060400160405280858c60000151038152602001858c602001510181525061271e565b509150915060405180604001604052808383018152602001848b6020015101815250858581518110612c4657fe5b6020908102919091010152600193909301920101612ba4565b508152949350505050565b6060600082516002026001600160401b0381118015612c8857600080fd5b506040519080825280601f01601f191660200182016040528015612cb3576020820181803683370190505b50905060005b8351811015612d5f576004848281518110612cd057fe5b602001015160f81c60f81b6001600160f81b031916901c828260020281518110612cf657fe5b60200101906001600160f81b031916908160001a9053506010848281518110612d1b57fe5b016020015160f81c81612d2a57fe5b0660f81b828260020260010181518110612d4057fe5b60200101906001600160f81b031916908160001a905350600101612cb9565b5092915050565b612d6e6137d0565b60408051600280825260608201909252600091816020015b6060815260200190600190039081612d865790505090506000612daa856001613426565b9050612db86103ef8261357d565b82600081518110612dc557fe5b6020026020010181905250612dd9846114c4565b82600181518110612de657fe5b6020026020010181905250611bce8261364d565b6000602082511015612e115750602081015161097a565b81806020019051602081101561097557600080fd5b60006060602083600001511015612e4757612e408361367c565b9050612e53565b612e5083611b48565b90505b61169681612dfa565b6060611528612e758360200151600081518110611d9157fe5b612c6a565b60608183510360001415612e9d5750604080516020810190915260008152611528565b611696838384865103613045565b6000805b808451118015612ebf5750808351115b8015612f045750828181518110612ed257fe5b602001015160f81c60f81b6001600160f81b031916848281518110612ef357fe5b01602001516001600160f81b031916145b1561169657600101612eaf565b60208101515160009060111415612f2a5750600061097a565b60028260200151511415612fa6576000612f4383612e5c565b9050600081600081518110612f5457fe5b016020015160f81c90506002811480612f70575060ff81166003145b15612f805760029250505061097a565b60ff81161580612f93575060ff81166001145b15612fa35760019250505061097a565b50505b6040805162461bcd60e51b8152602060048201526011602482015270496e76616c6964206e6f6465207479706560781b604482015290519081900360640190fd5b6060611528612ff583612e5c565b613687565b6130026137d0565b600061300d836114c4565b905061301881611b23565b60208501518051600019810190811061302d57fe5b602002602001018190525061154c84602001516136d0565b60608182601f011015613090576040805162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b604482015290519081900360640190fd5b8282840110156130d8576040805162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b604482015290519081900360640190fd5b81830184511015613124576040805162461bcd60e51b8152602060048201526011602482015270736c6963655f6f75744f66426f756e647360781b604482015290519081900360640190fd5b60608215801561314357604051915060008252602082016040526126f9565b6040519150601f8416801560200281840101858101878315602002848b0101015b8183101561317c578051835260209283019201613164565b5050858452601f01601f19166040525050949350505050565b60606020825110156131a857508061097a565b818051906020012060405160200180828152602001915050604051602081830303815290604052905061097a565b6131de6137d0565b60408051600280825260608201909252600091816020015b60608152602001906001900390816131f65790505090506000612daa856000613426565b6132226137d0565b6040805160118082526102408201909252600091816020015b606081526020019060019003908161323b57905050905060005b815181101561329757604051806040016040528060018152602001600160ff1b81525082828151811061328457fe5b6020908102919091010152600101613255565b506132a18161364d565b91505090565b6132af6137d0565b600060208351106132c8576132c3836114c4565b6132ca565b825b90506132d581611b23565b85602001518560ff16815181106132e857fe5b6020026020010181905250611bce85602001516136d0565b606060008285016001600160401b038111801561331c57600080fd5b5060405190808252806020026020018201604052801561335657816020015b6133436137d0565b81526020019060019003908161333b5790505b50905060005b858110156133975786818151811061337057fe5b602002602001015182828151811061338457fe5b602090810291909101015260010161335c565b5060005b838110156133d8578481815181106133af57fe5b602002602001015182878301815181106133c557fe5b602090810291909101015260010161339b565b5095945050505050565b8282825b60208110613405578151835260209283019290910190601f19016133e6565b905182516020929092036101000a6000190180199091169116179052505050565b6060600082613436576000613439565b60025b90506000600285518161344857fe5b06905060008160020360ff166001600160401b038111801561346957600080fd5b506040519080825280601f01601f191660200182016040528015613494576020820181803683370190505b50905081830160f81b816000815181106134aa57fe5b60200101906001600160f81b031916908160001a90535080866040516020018083805190602001908083835b602083106134f55780518252601f1990920191602091820191016134d6565b51815160209384036101000a600019018019909216911617905285519190930192850191508083835b6020831061353d5780518252601f19909201916020918201910161351e565b6001836020036101000a03801982511681845116808217855250505050505090500192505050604051602081830303815290604052935050505092915050565b60606000600283518161358c57fe5b046001600160401b03811180156135a257600080fd5b506040519080825280601f01601f1916602001820160405280156135cd576020820181803683370190505b50905060005b8151811015612d5f578381600202600101815181106135ee57fe5b602001015160f81c60f81b600485836002028151811061360a57fe5b602001015160f81c60f81b6001600160f81b031916901b1782828151811061362e57fe5b60200101906001600160f81b031916908160001a9053506001016135d3565b6136556137d0565b6000613660836119d1565b905060405180604001604052808281526020016117aa83611bd7565b606061152882613779565b606060028260008151811061369857fe5b016020015160f81c816136a757fe5b0660ff16600014156136c5576136be826002612e7a565b905061097a565b6136be826001612e7a565b6136d86137d0565b600082516001600160401b03811180156136f157600080fd5b5060405190808252806020026020018201604052801561372557816020015b60608152602001906001900390816137105790505b50905060005b835181101561376f5761375084828151811061374357fe5b602002602001015161367c565b82828151811061375c57fe5b602090810291909101015260010161372b565b506116968161364d565b6060611528826020015160008460000151612a47565b60408051608081018252600080825260208201819052918101829052606081019190915290565b604051806040016040528060008152602001600081525090565b604051806040016040528060608152602001606081525090565b60006137fd6137f884614207565b6141e4565b905082815283838301111561381157600080fd5b828260208301376000602084830101529392505050565b803561097a81614258565b8051801515811461097a57600080fd5b600082601f830112613853578081fd5b611696838335602085016137ea565b80356002811061097a57600080fd5b600080600060608486031215613885578283fd5b833561389081614258565b925060208401356138a081614258565b915060408401356001600160401b038111156138ba578182fd5b6138c686828701613843565b9150509250925092565b6000806000606084860312156138e4578283fd5b83356138ef81614258565b92506020840135915060408401356001600160401b038111156138ba578182fd5b60008060408385031215613922578182fd5b823561392d81614258565b915060208301356001600160401b03811115613947578182fd5b61395385828601613843565b9150509250929050565b60006020828403121561396e578081fd5b61169682613833565b600060208284031215613988578081fd5b5051919050565b6000602082840312156139a0578081fd5b81516001600160401b038111156139b5578182fd5b8201601f810184136139c5578182fd5b80516139d36137f882614207565b8181528560208385010111156139e7578384fd5b611bce826020830160208601614228565b600060208284031215613a09578081fd5b81356001600160401b03811115613a1e578182fd5b8201601f81018413613a2e578182fd5b61154c848235602084016137ea565b600060c08284031215613a4e578081fd5b60405160c081018181106001600160401b0382111715613a6a57fe5b8060405250825181526020830151602082015260408301516040820152606083015160608201526080830151613a9f81614258565b6080820152613ab060a08401613833565b60a08201529392505050565b600060208284031215613acd578081fd5b81356001600160401b0380821115613ae3578283fd5b9083019060e08286031215613af6578283fd5b613b0060e06141e4565b8235815260208301356020820152613b1a60408401613862565b6040820152613b2b60608401613828565b6060820152613b3c60808401613828565b608082015260a083013560a082015260c083013582811115613b5c578485fd5b613b6887828601613843565b60c08301525095945050505050565b6001600160a01b03169052565b60008151808452613b9c816020860160208601614228565b601f01601f19169290920160200192915050565b60609190911b6bffffffffffffffffffffffff1916815260140190565b90815260200190565b60008351613be8818460208801614228565b835190830190613bfc818360208801614228565b01949350505050565b600088825287602083015260028710613c1a57fe5b8660f81b60408301526bffffffffffffffffffffffff19808760601b166041840152808660601b166055840152508360698301528251613c61816089850160208701614228565b9190910160890198975050505050505050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039390931683526020830191909152604082015260600190565b600060e08201905060018060a01b038085168352835160208401526020840151604084015260408401516060840152606084015160808401528060808501511660a08401525060a0830151151560c08301529392505050565b901515815260200190565b6020810160038310613d3457fe5b91905290565b60208082526025908201527f53746f7261676520736c6f742068617320616c7265616479206265656e20707260408201526437bb32b71760d91b606082015260800190565b60208082526026908201527f4163636f756e742073746174652068617320616c7265616479206265656e20706040820152653937bb32b71760d11b606082015260800190565b6020808252603e908201527f416c6c206163636f756e7473206d75737420626520636f6d6d6974746564206260408201527f65666f726520636f6d706c6574696e672061207472616e736974696f6e2e0000606082015260800190565b602080825260409082018190527f53746f7261676520736c6f742076616c7565207761736e2774206368616e6765908201527f64206f722068617320616c7265616479206265656e20636f6d6d69747465642e606082015260800190565b6020808252605b908201527f4f564d5f53746174655472616e736974696f6e65723a2050726f76696465642060408201527f4c3120636f6e747261637420636f6465206861736820646f6573206e6f74206d60608201527f61746368204c3220636f6e747261637420636f646520686173682e0000000000608082015260a00190565b6020808252603f908201527f416c6c2073746f72616765206d75737420626520636f6d6d697474656420626560408201527f666f726520636f6d6d697474696e67206163636f756e74207374617465732e00606082015260800190565b60208082526038908201527f4e6f7420656e6f7567682067617320746f2065786563757465207472616e736160408201527f6374696f6e2064657465726d696e6973746963616c6c792e0000000000000000606082015260800190565b6020808252603b908201527f4163636f756e74207374617465207761736e2774206368616e676564206f722060408201527f68617320616c7265616479206265656e20636f6d6d69747465642e0000000000606082015260800190565b6020808252603d908201527f416c6c2073746f72616765206d75737420626520636f6d6d697474656420626560408201527f666f726520636f6d706c6574696e672061207472616e736974696f6e2e000000606082015260800190565b60208082526031908201527f46756e6374696f6e206d7573742062652063616c6c656420647572696e67207460408201527034329031b7b93932b1ba10383430b9b29760791b606082015260800190565b6020808252601d908201527f496e76616c6964207472616e73616374696f6e2070726f76696465642e000000604082015260600190565b60208082526038908201527f436f6e7472616374206d757374206265207665726966696564206265666f726560408201527f2070726f76696e6720612073746f7261676520736c6f742e0000000000000000606082015260800190565b600060408252835160408301526020840151606083015260408401516002811061418257fe5b60808381019190915260608501516001600160a01b031660a08401528401516141ae60c0840182613b77565b5060a084015160e083015260c084015160e06101008401526141d4610120840182613b84565b9150506116966020830184613b77565b6040518181016001600160401b03811182821017156141ff57fe5b604052919050565b60006001600160401b0382111561421a57fe5b50601f01601f191660200190565b60005b8381101561424357818101518382015260200161422b565b83811115614252576000848401525b50505050565b6001600160a01b038116811461426d57600080fd5b5056fe50726f766964656420524c50206c6973742065786365656473206d6178206c697374206c656e6774682e52656365697665642061206e6f6465207769746820616e20756e6b6e6f776e20707265666978a2646970667358221220ce5bdf188c3574b3ab8fd8d954100f14bc36e9cb42e1ca798a8f556d7ace41f564736f6c634300070600334372656174652063616e206f6e6c7920626520646f6e6520627920746865204f564d5f467261756456657269666965722ea26469706673582212200d398ad651c22ef8f9239e5104dc8b8e30dec6c479966de4f2382a136a81db4864736f6c63430007060033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100415760003560e01c806322d1470214610046578063299ca4781461009a578063461a4478146100a2575b600080fd5b61007e6004803603608081101561005c57600080fd5b506001600160a01b038135169060208101359060408101359060600135610148565b604080516001600160a01b039092168252519081900360200190f35b61007e610229565b61007e600480360360208110156100b857600080fd5b8101906020810181356401000000008111156100d357600080fd5b8201836020820111156100e557600080fd5b8035906020019184600183028401116401000000008311171561010757600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610238945050505050565b600061017c6040518060400160405280601181526020017027ab26afa33930bab22b32b934b334b2b960791b815250610238565b6001600160a01b0316336001600160a01b0316146101cb5760405162461bcd60e51b81526004018080602001828103825260318152602001806148ee6031913960400191505060405180910390fd5b848484846040516101db90610314565b80856001600160a01b03168152602001848152602001838152602001828152602001945050505050604051809103906000f08015801561021f573d6000803e3d6000fd5b5095945050505050565b6000546001600160a01b031681565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b83811015610298578181015183820152602001610280565b50505050905090810190601f1680156102c55780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b1580156102e257600080fd5b505afa1580156102f6573d6000803e3d6000fd5b505050506040513d602081101561030c57600080fd5b505192915050565b6145cc806103228339019056fe60806040523480156200001157600080fd5b50604051620045cc380380620045cc833981016040819052620000349162000232565b600080546001600160a01b0319166001600160a01b038616179055600583905560028290556003829055600681905560408051808201909152601781527f4f564d5f53746174654d616e61676572466163746f72790000000000000000006020820152620000a29062000150565b6001600160a01b0316639ed93318306040518263ffffffff1660e01b8152600401620000cf919062000299565b602060405180830381600087803b158015620000ea57600080fd5b505af1158015620000ff573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000125919062000273565b600180546001600160a01b0319166001600160a01b039290921691909117905550620002c692505050565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b83811015620001b257818101518382015260200162000198565b50505050905090810190601f168015620001e05780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b158015620001fe57600080fd5b505afa15801562000213573d6000803e3d6000fd5b505050506040513d60208110156200022a57600080fd5b505192915050565b6000806000806080858703121562000248578384fd5b84516200025581620002ad565b60208601516040870151606090970151919890975090945092505050565b60006020828403121562000285578081fd5b81516200029281620002ad565b9392505050565b6001600160a01b0391909116815260200190565b6001600160a01b0381168114620002c357600080fd5b50565b6142f680620002d66000396000f3fe608060405234801561001057600080fd5b50600436106100cf5760003560e01c8063845fe7a31161008c578063b2fa1c9e11610066578063b2fa1c9e14610185578063b52805711461019a578063b9194310146101a2578063c1c618b8146101b5576100cf565b8063845fe7a314610155578063a244316a14610168578063b1c9fe6e14610170576100cf565b8063299ca478146100d45780632e1ac36c146100f25780632eb1375814610107578063461a44781461011a578063732f960b1461012d578063805e9d3014610140575b600080fd5b6100dc6101bd565b6040516100e99190613c74565b60405180910390f35b6101056101003660046138d0565b6101cc565b005b610105610115366004613910565b610565565b6100dc6101283660046139f8565b6108a1565b61010561013b366004613abc565b61097f565b610148610c6f565b6040516100e99190613bcd565b6101056101633660046138d0565b610c75565b610105610fa1565b610178611128565b6040516100e99190613d26565b61018d611131565b6040516100e99190613d1b565b6100dc61114c565b6101056101b0366004613871565b61115b565b610148611475565b6000546001600160a01b031681565b60018060045460ff1660028111156101e057fe5b146102065760405162461bcd60e51b81526004016101fd90614077565b60405180910390fd5b60025460065460005a6001546040516363b285f960e11b81529192506001600160a01b03169063c7650bf290610242908a908a90600401613c88565b602060405180830381600087803b15801561025c57600080fd5b505af1158015610270573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610294919061395d565b15156001146102b55760405162461bcd60e51b81526004016101fd90613e22565b60015460405163fbcbc0f160e01b81526000916001600160a01b03169063fbcbc0f1906102e6908b90600401613c74565b60c06040518083038186803b1580156102fe57600080fd5b505afa158015610312573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103369190613a3d565b600154604051631aaf392f60e01b81529192506000916001600160a01b0390911690631aaf392f9061036e908c908c90600401613c88565b60206040518083038186803b15801561038657600080fd5b505afa15801561039a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103be9190613977565b90506103ff886040516020016103d49190613bcd565b6040516020818303038152906040526103f46103ef8461147b565b6114c4565b89856040015161152e565b6040808401919091526001549051638f3b964760e01b81526001600160a01b0390911690638f3b964790610439908c908690600401613cc2565b600060405180830381600087803b15801561045357600080fd5b505af1158015610467573d6000803e3d6000fd5b505050507f3e3ed1a676a2754a041b49bf752e0f167c8753495e36c320fe01d1ef7476253c898960405161049c929190613c88565b60405180910390a1505060005a820390506104dd6040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506108a1565b6001600160a01b0316631e16e92f858533856040518563ffffffff1660e01b815260040180858152602001848152602001836001600160a01b03168152602001828152602001945050505050600060405180830381600087803b15801561054357600080fd5b505af1158015610557573d6000803e3d6000fd5b505050505050505050505050565b60018060045460ff16600281111561057957fe5b146105965760405162461bcd60e51b81526004016101fd90614077565b60025460065460005a9050600160009054906101000a90046001600160a01b03166001600160a01b03166399056ba96040518163ffffffff1660e01b815260040160206040518083038186803b1580156105ef57600080fd5b505afa158015610603573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106279190613977565b156106445760405162461bcd60e51b81526004016101fd90613f03565b600154604051630b38106960e11b81526001600160a01b039091169063167020d290610674908990600401613c74565b602060405180830381600087803b15801561068e57600080fd5b505af11580156106a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106c6919061395d565b15156001146106e75760405162461bcd60e51b81526004016101fd90613fbd565b60015460405163fbcbc0f160e01b81526000916001600160a01b03169063fbcbc0f190610718908a90600401613c74565b60c06040518083038186803b15801561073057600080fd5b505afa158015610744573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107689190613a3d565b90506107a78760405160200161077e9190613bb0565b60405160208183030381529060405261079e61079984611554565b611594565b8860035461152e565b6003556040517fcec9ef675d775706a02b43afe48af52c5019bc50f99582e3208c6ff55d59c008906107da908990613c74565b60405180910390a15060005a8203905061081a6040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506108a1565b6001600160a01b0316631e16e92f858533856040518563ffffffff1660e01b815260040180858152602001848152602001836001600160a01b03168152602001828152602001945050505050600060405180830381600087803b15801561088057600080fd5b505af1158015610894573d6000803e3d6000fd5b5050505050505050505050565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b838110156109015781810151838201526020016108e9565b50505050905090810190601f16801561092e5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561094b57600080fd5b505afa15801561095f573d6000803e3d6000fd5b505050506040513d602081101561097557600080fd5b505190505b919050565b60008060045460ff16600281111561099357fe5b146109b05760405162461bcd60e51b81526004016101fd90614077565b60025460065460005a90506006546109c78661169d565b146109e45760405162461bcd60e51b81526004016101fd906140c8565b6103e88560a0015161040802816109f757fe5b04620186a0015a1015610a1c5760405162461bcd60e51b81526004016101fd90613f60565b6000610a536040518060400160405280601481526020017327ab26afa2bc32b1baba34b7b726b0b730b3b2b960611b8152506108a1565b600154604051631381ba4d60e01b81529192506001600160a01b031690631381ba4d90610a84908490600401613c74565b600060405180830381600087803b158015610a9e57600080fd5b505af1158015610ab2573d6000803e3d6000fd5b5050600154604051639be3ad6760e01b81526001600160a01b038086169450639be3ad679350610ae9928b9291169060040161415c565b600060405180830381600087803b158015610b0357600080fd5b505af1158015610b17573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610b3f919081019061398f565b50600154604051631381ba4d60e01b81526001600160a01b0390911690631381ba4d90610b7190600090600401613c74565b600060405180830381600087803b158015610b8b57600080fd5b505af1158015610b9f573d6000803e3d6000fd5b50506004805460ff191660011790555060009150505a82039050610be96040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506108a1565b6001600160a01b0316631e16e92f858533856040518563ffffffff1660e01b815260040180858152602001848152602001836001600160a01b03168152602001828152602001945050505050600060405180830381600087803b158015610c4f57600080fd5b505af1158015610c63573d6000803e3d6000fd5b50505050505050505050565b60025490565b60008060045460ff166002811115610c8957fe5b14610ca65760405162461bcd60e51b81526004016101fd90614077565b60025460065460005a600154604051630ad2267960e01b81529192506001600160a01b031690630ad2267990610ce2908a908a90600401613c88565b60206040518083038186803b158015610cfa57600080fd5b505afa158015610d0e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d32919061395d565b15610d4f5760405162461bcd60e51b81526004016101fd90613d3a565b60015460405163c8e40fbf60e01b81526001600160a01b039091169063c8e40fbf90610d7f908a90600401613c74565b60206040518083038186803b158015610d9757600080fd5b505afa158015610dab573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dcf919061395d565b1515600114610df05760405162461bcd60e51b81526004016101fd906140ff565b60015460405163136e2d8960e11b81526000916001600160a01b0316906326dc5b1290610e21908b90600401613c74565b60206040518083038186803b158015610e3957600080fd5b505afa158015610e4d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e719190613977565b905060007f56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421821415610ea557506000610f02565b600080610ed28a604051602001610ebc9190613bcd565b6040516020818303038152906040528a866116b6565b909250905060018215151415610efa57610ef3610eee826116df565b6116f2565b9250610eff565b600092505b50505b600154604051635c17d62960e01b81526001600160a01b0390911690635c17d62990610f36908c908c908690600401613ca1565b600060405180830381600087803b158015610f5057600080fd5b505af1158015610f64573d6000803e3d6000fd5b50505050505060005a820390506104dd6040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506108a1565b60018060045460ff166002811115610fb557fe5b14610fd25760405162461bcd60e51b81526004016101fd90614077565b600160009054906101000a90046001600160a01b03166001600160a01b031663d7bd4a2a6040518163ffffffff1660e01b815260040160206040518083038186803b15801561102057600080fd5b505afa158015611034573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110589190613977565b156110755760405162461bcd60e51b81526004016101fd90613dc5565b600160009054906101000a90046001600160a01b03166001600160a01b03166399056ba96040518163ffffffff1660e01b815260040160206040518083038186803b1580156110c357600080fd5b505afa1580156110d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110fb9190613977565b156111185760405162461bcd60e51b81526004016101fd9061401a565b506004805460ff19166002179055565b60045460ff1681565b6000600260045460ff16600281111561114657fe5b14905090565b6001546001600160a01b031681565b60008060045460ff16600281111561116f57fe5b1461118c5760405162461bcd60e51b81526004016101fd90614077565b60025460065460005a60015460405163c8e40fbf60e01b81529192506001600160a01b03169063c8e40fbf906111c6908a90600401613c74565b60206040518083038186803b1580156111de57600080fd5b505afa1580156111f2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611216919061395d565b1580156112a057506001546040516307a1294560e01b81526001600160a01b03909116906307a129459061124e908a90600401613c74565b60206040518083038186803b15801561126657600080fd5b505afa15801561127a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061129e919061395d565b155b6112bc5760405162461bcd60e51b81526004016101fd90613d7f565b6000806112eb896040516020016112d39190613bb0565b604051602081830303815290604052886002546116b6565b90925090506001821515141561140c57600061130682611721565b606081015190915089907fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470141561133f5750600061136a565b816060015161134d826117b3565b1461136a5760405162461bcd60e51b81526004016101fd90613e80565b6001546040805160c08101825284518152602080860151908201528482015181830152606080860151908201526001600160a01b038481166080830152600060a08301529151638f3b964760e01b81529190921691638f3b9647916113d3918f91600401613cc2565b600060405180830381600087803b1580156113ed57600080fd5b505af1158015611401573d6000803e3d6000fd5b50505050505061143c565b600154604051630d631c9d60e31b81526001600160a01b0390911690636b18e4e890610f36908c90600401613c74565b505060005a820390506104dd6040518060400160405280600f81526020016e27ab26afa137b73226b0b730b3b2b960891b8152506108a1565b60035490565b6060806000805b6020811085821a15161561149c5760019182019101611482565b5060405191506040820160405283600882021b60208301528060200382525080915050919050565b606080825160011480156114ec57506080836000815181106114e257fe5b016020015160f81c105b156114f8575081611528565b611504835160806117b7565b83604051602001611516929190613bd6565b60405160208183030381529060405290505b92915050565b60008061153a86611906565b905061154881868686611936565b9150505b949350505050565b61155c61378f565b604051806080016040528083600001518152602001836020015181526020018360400151815260200183606001518152509050919050565b60408051600480825260a0820190925260609160009190816020015b60608152602001906001900390816115b057505083519091506115d6906103ef9061147b565b816000815181106115e357fe5b60200260200101819052506116016103ef846020015160001b61147b565b8160018151811061160e57fe5b602002602001018190525061164583604001516040516020016116319190613bcd565b6040516020818303038152906040526114c4565b8160028151811061165257fe5b602002602001018190525061167583606001516040516020016116319190613bcd565b8160038151811061168257fe5b6020026020010181905250611696816119d1565b9392505050565b60006116a882611a15565b805190602001209050919050565b6000606060006116c586611906565b90506116d2818686611a50565b9250925050935093915050565b60606115286116ed83611b23565b611b48565b600080600060208451111561170857602061170b565b83515b6020858101519190036008021c92505050919050565b61172961378f565b600061173483611bd7565b9050604051806080016040528061175e8360008151811061175157fe5b6020026020010151611bea565b81526020016117738360018151811061175157fe5b81526020016117958360028151811061178857fe5b6020026020010151611bf1565b81526020016117aa8360038151811061178857fe5b90529392505050565b3f90565b6060806038841015611811576040805160018082528183019092529060208201818036833701905050905082840160f81b816000815181106117f557fe5b60200101906001600160f81b031916908160001a905350611696565b600060015b80868161181f57fe5b04156118345760019091019061010002611816565b816001016001600160401b038111801561184d57600080fd5b506040519080825280601f01601f191660200182016040528015611878576020820181803683370190505b50925084820160370160f81b8360008151811061189157fe5b60200101906001600160f81b031916908160001a905350600190505b8181116118fd576101008183036101000a87816118c657fe5b04816118ce57fe5b0660f81b8382815181106118de57fe5b60200101906001600160f81b031916908160001a9053506001016118ad565b50509392505050565b606081805190602001206040516020016119209190613bcd565b6040516020818303038152906040529050919050565b6040805180820190915260018152600160ff1b60209091015260007f56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42182141561198a576119838585611ceb565b905061154c565b600061199584611d0f565b90506000806119a5838987611de5565b509150915060006119b88484848b612188565b90506119c4818a6124a0565b9998505050505050505050565b606060006119de836125f9565b90506119ec815160c06117b7565b816040516020016119fe929190613bd6565b604051602081830303815290604052915050919050565b6060816000015182602001518360400151846060015185608001518660a001518760c001516040516020016119209796959493929190613c05565b600060606000611a5f85611d0f565b90506000806000611a71848a89611de5565b81519295509093509150158080611a855750815b611ad6576040805162461bcd60e51b815260206004820152601a60248201527f50726f76696465642070726f6f6620697320696e76616c69642e000000000000604482015290519081900360640190fd5b600081611af25760405180602001604052806000815250611b11565b611b11866001870381518110611b0457fe5b6020026020010151612702565b919b919a509098505050505050505050565b611b2b6137b6565b506040805180820190915281518152602082810190820152919050565b60606000806000611b588561271e565b919450925090506000816001811115611b6d57fe5b14611bbf576040805162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c502062797465732076616c75652e0000000000000000604482015290519081900360640190fd5b611bce85602001518484612a47565b95945050505050565b6060611528611be583611b23565b612af4565b6000611528825b6000602182600001511115611c4d576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e000000000000604482015290519081900360640190fd5b6000806000611c5b8561271e565b919450925090506000816001811115611c7057fe5b14611cc2576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e000000000000604482015290519081900360640190fd5b602080860151840180519091841015611ce15760208490036101000a90045b9695505050505050565b6000611cff611cf984612c6a565b83612d66565b5180516020909101209392505050565b60606000611d1c83611bd7565b9050600081516001600160401b0381118015611d3757600080fd5b50604051908082528060200260200182016040528015611d7157816020015b611d5e6137d0565b815260200190600190039081611d565790505b50905060005b8251811015611ddd576000611d9e848381518110611d9157fe5b6020026020010151611b48565b90506040518060400160405280828152602001611dba83611bd7565b815250838381518110611dc957fe5b602090810291909101015250600101611d77565b509392505050565b60006060818080611df587612c6a565b905085600080611e036137d0565b60005b8c51811015612160578c8181518110611e1b57fe5b6020026020010151915082840193506001870196508360001415611e8f57815180516020909101208514611e8a576040805162461bcd60e51b8152602060048201526011602482015270092dcecc2d8d2c840e4dedee840d0c2e6d607b1b604482015290519081900360640190fd5b611f56565b815151602011611ef657815180516020909101208514611e8a576040805162461bcd60e51b815260206004820152601b60248201527f496e76616c6964206c6172676520696e7465726e616c20686173680000000000604482015290519081900360640190fd5b84611f048360000151612dfa565b14611f56576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420696e7465726e616c206e6f64652068617368000000000000604482015290519081900360640190fd5b60208201515160111415611fc5578551841415611f7257612160565b6000868581518110611f8057fe5b602001015160f81c60f81b60f81c9050600083602001518260ff1681518110611fa557fe5b60200260200101519050611fb881612e26565b9650600194505050612158565b6002826020015151141561210b576000611fde83612e5c565b9050600081600081518110611fef57fe5b016020015160f81c905060018116600203600061200f8460ff8416612e7a565b9050600061201d8b8a612e7a565b9050600061202b8383612eab565b905060ff851660021480612042575060ff85166003145b15612074578083511480156120575750808251145b1561206157988901985b50600160ff1b9950612160945050505050565b60ff85161580612087575060ff85166001145b156120d457806120a45750600160ff1b9950612160945050505050565b6120c588602001516001815181106120b857fe5b6020026020010151612e26565b9a509750612158945050505050565b60405162461bcd60e51b815260040180806020018281038252602681526020018061429b6026913960400191505060405180910390fd5b6040805162461bcd60e51b815260206004820152601d60248201527f526563656976656420616e20756e706172736561626c65206e6f64652e000000604482015290519081900360640190fd5b600101611e06565b50600160ff1b8414866121738786612e7a565b909e909d50909b509950505050505050505050565b6060600083905060008660018703815181106121a057fe5b6020026020010151905060006121b582612f11565b6040805160038082526080820190925291925060009190816020015b6121d96137d0565b8152602001906001900390816121d157905050905060008451600014801561220c5750600283600281111561220a57fe5b145b156122425761222361221d85612fe7565b88612d66565b82828151811061222f57fe5b6020908102919091010152600101612483565b600083600281111561225057fe5b14156122b6578451612285576122668488612ffa565b82828151811061227257fe5b60209081029190910101526001016122b1565b8382828151811061229257fe5b602002602001018190525060018101905061222361221d866001612e7a565b612483565b60006122c185612fe7565b905060006122cf8288612eab565b905080156123305760006122e583600084613045565b90506122f9816122f48c613195565b6131d6565b85858151811061230557fe5b60200260200101819052506001840193506123208383612e7a565b925061232c8883612e7a565b9750505b600061233a61321a565b905082516000141561235f576123588161235389612702565b612ffa565b90506123f7565b60008360008151811061236e57fe5b016020015160f81c9050612383846001612e7a565b9350600287600281111561239357fe5b14156123ce5760006123ad856123a88b612702565b612d66565b90506123c683836123c18460000151613195565b6132a7565b9250506123f5565b8351156123e45760006123ad856122f48b612702565b6123f282826123c18b612702565b91505b505b875161242c57612407818b612ffa565b90508085858151811061241657fe5b602002602001018190525060018401935061247f565b612437886001612e7a565b97508085858151811061244657fe5b6020026020010181905250600184019350612461888b612d66565b85858151811061246d57fe5b60200260200101819052506001840193505b5050505b6124928a60018b038484613300565b9a9950505050505050505050565b6000806124ac83612c6a565b90506124b66137d0565b84516000906060905b80156125e4578760018203815181106124d457fe5b602002602001015193506124e784612f11565b925060028360028111156124f757fe5b141561252257600061250885612fe7565b905061251a8660008351895103613045565b9550506125ce565b600183600281111561253057fe5b141561257057600061254185612fe7565b90506125538660008351895103613045565b83519096501561256a5761256781846131d6565b94505b506125ce565b600083600281111561257e57fe5b14156125ce578151156125ce5760008560018751038151811061259d57fe5b602001015160f81c60f81b60f81c90506125bd8660006001895103613045565b95506125ca8582856132a7565b9450505b83516125d990613195565b9150600019016124bf565b50509051805160209091012095945050505050565b606081516000141561261a575060408051600081526020810190915261097a565b6000805b835181101561264d5783818151811061263357fe5b60200260200101515182019150808060010191505061261e565b6000826001600160401b038111801561266557600080fd5b506040519080825280601f01601f191660200182016040528015612690576020820181803683370190505b50600092509050602081015b85518310156126f95760008684815181106126b357fe5b6020026020010151905060006020820190506126d1838284516133e2565b8785815181106126dd57fe5b602002602001015151830192505050828060010193505061269c565b50949350505050565b60208101518051606091611528916000198101908110611d9157fe5b60008060008084600001511161277b576040805162461bcd60e51b815260206004820152601860248201527f524c50206974656d2063616e6e6f74206265206e756c6c2e0000000000000000604482015290519081900360640190fd5b6020840151805160001a607f81116127a0576000600160009450945094505050612a40565b60b78111612815578551607f198201908110612803576040805162461bcd60e51b815260206004820152601960248201527f496e76616c696420524c502073686f727420737472696e672e00000000000000604482015290519081900360640190fd5b60019550935060009250612a40915050565b60bf81116128f957855160b6198201908110612878576040805162461bcd60e51b815260206004820152601f60248201527f496e76616c696420524c50206c6f6e6720737472696e67206c656e6774682e00604482015290519081900360640190fd5b6000816020036101000a60018501510490508082018860000151116128e4576040805162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c50206c6f6e6720737472696e672e0000000000000000604482015290519081900360640190fd5b60019091019550935060009250612a40915050565b60f7811161296d57855160bf19820190811061295c576040805162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c502073686f7274206c6973742e000000000000000000604482015290519081900360640190fd5b600195509350849250612a40915050565b855160f61982019081106129c8576040805162461bcd60e51b815260206004820152601d60248201527f496e76616c696420524c50206c6f6e67206c697374206c656e6774682e000000604482015290519081900360640190fd5b6000816020036101000a6001850151049050808201886000015111612a2d576040805162461bcd60e51b815260206004820152601660248201527524b73b30b634b210292628103637b733903634b9ba1760511b604482015290519081900360640190fd5b6001918201965094509250612a40915050565b9193909250565b60606000826001600160401b0381118015612a6157600080fd5b506040519080825280601f01601f191660200182016040528015612a8c576020820181803683370190505b509050805160001415612aa0579050611696565b8484016020820160005b60208604811015612acb578251825260209283019290910190600101612aaa565b5080519151601f959095166020036101000a600019019182169119909416179092525092915050565b6060600080612b028461271e565b91935090915060019050816001811115612b1857fe5b14612b6a576040805162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c50206c6973742076616c75652e000000000000000000604482015290519081900360640190fd5b6040805160208082526104208201909252600091816020015b612b8b6137b6565b815260200190600190039081612b835790505090506000835b8651811015612c5f5760208210612bec5760405162461bcd60e51b815260040180806020018281038252602a815260200180614271602a913960400191505060405180910390fd5b600080612c186040518060400160405280858c60000151038152602001858c602001510181525061271e565b509150915060405180604001604052808383018152602001848b6020015101815250858581518110612c4657fe5b6020908102919091010152600193909301920101612ba4565b508152949350505050565b6060600082516002026001600160401b0381118015612c8857600080fd5b506040519080825280601f01601f191660200182016040528015612cb3576020820181803683370190505b50905060005b8351811015612d5f576004848281518110612cd057fe5b602001015160f81c60f81b6001600160f81b031916901c828260020281518110612cf657fe5b60200101906001600160f81b031916908160001a9053506010848281518110612d1b57fe5b016020015160f81c81612d2a57fe5b0660f81b828260020260010181518110612d4057fe5b60200101906001600160f81b031916908160001a905350600101612cb9565b5092915050565b612d6e6137d0565b60408051600280825260608201909252600091816020015b6060815260200190600190039081612d865790505090506000612daa856001613426565b9050612db86103ef8261357d565b82600081518110612dc557fe5b6020026020010181905250612dd9846114c4565b82600181518110612de657fe5b6020026020010181905250611bce8261364d565b6000602082511015612e115750602081015161097a565b81806020019051602081101561097557600080fd5b60006060602083600001511015612e4757612e408361367c565b9050612e53565b612e5083611b48565b90505b61169681612dfa565b6060611528612e758360200151600081518110611d9157fe5b612c6a565b60608183510360001415612e9d5750604080516020810190915260008152611528565b611696838384865103613045565b6000805b808451118015612ebf5750808351115b8015612f045750828181518110612ed257fe5b602001015160f81c60f81b6001600160f81b031916848281518110612ef357fe5b01602001516001600160f81b031916145b1561169657600101612eaf565b60208101515160009060111415612f2a5750600061097a565b60028260200151511415612fa6576000612f4383612e5c565b9050600081600081518110612f5457fe5b016020015160f81c90506002811480612f70575060ff81166003145b15612f805760029250505061097a565b60ff81161580612f93575060ff81166001145b15612fa35760019250505061097a565b50505b6040805162461bcd60e51b8152602060048201526011602482015270496e76616c6964206e6f6465207479706560781b604482015290519081900360640190fd5b6060611528612ff583612e5c565b613687565b6130026137d0565b600061300d836114c4565b905061301881611b23565b60208501518051600019810190811061302d57fe5b602002602001018190525061154c84602001516136d0565b60608182601f011015613090576040805162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b604482015290519081900360640190fd5b8282840110156130d8576040805162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b604482015290519081900360640190fd5b81830184511015613124576040805162461bcd60e51b8152602060048201526011602482015270736c6963655f6f75744f66426f756e647360781b604482015290519081900360640190fd5b60608215801561314357604051915060008252602082016040526126f9565b6040519150601f8416801560200281840101858101878315602002848b0101015b8183101561317c578051835260209283019201613164565b5050858452601f01601f19166040525050949350505050565b60606020825110156131a857508061097a565b818051906020012060405160200180828152602001915050604051602081830303815290604052905061097a565b6131de6137d0565b60408051600280825260608201909252600091816020015b60608152602001906001900390816131f65790505090506000612daa856000613426565b6132226137d0565b6040805160118082526102408201909252600091816020015b606081526020019060019003908161323b57905050905060005b815181101561329757604051806040016040528060018152602001600160ff1b81525082828151811061328457fe5b6020908102919091010152600101613255565b506132a18161364d565b91505090565b6132af6137d0565b600060208351106132c8576132c3836114c4565b6132ca565b825b90506132d581611b23565b85602001518560ff16815181106132e857fe5b6020026020010181905250611bce85602001516136d0565b606060008285016001600160401b038111801561331c57600080fd5b5060405190808252806020026020018201604052801561335657816020015b6133436137d0565b81526020019060019003908161333b5790505b50905060005b858110156133975786818151811061337057fe5b602002602001015182828151811061338457fe5b602090810291909101015260010161335c565b5060005b838110156133d8578481815181106133af57fe5b602002602001015182878301815181106133c557fe5b602090810291909101015260010161339b565b5095945050505050565b8282825b60208110613405578151835260209283019290910190601f19016133e6565b905182516020929092036101000a6000190180199091169116179052505050565b6060600082613436576000613439565b60025b90506000600285518161344857fe5b06905060008160020360ff166001600160401b038111801561346957600080fd5b506040519080825280601f01601f191660200182016040528015613494576020820181803683370190505b50905081830160f81b816000815181106134aa57fe5b60200101906001600160f81b031916908160001a90535080866040516020018083805190602001908083835b602083106134f55780518252601f1990920191602091820191016134d6565b51815160209384036101000a600019018019909216911617905285519190930192850191508083835b6020831061353d5780518252601f19909201916020918201910161351e565b6001836020036101000a03801982511681845116808217855250505050505090500192505050604051602081830303815290604052935050505092915050565b60606000600283518161358c57fe5b046001600160401b03811180156135a257600080fd5b506040519080825280601f01601f1916602001820160405280156135cd576020820181803683370190505b50905060005b8151811015612d5f578381600202600101815181106135ee57fe5b602001015160f81c60f81b600485836002028151811061360a57fe5b602001015160f81c60f81b6001600160f81b031916901b1782828151811061362e57fe5b60200101906001600160f81b031916908160001a9053506001016135d3565b6136556137d0565b6000613660836119d1565b905060405180604001604052808281526020016117aa83611bd7565b606061152882613779565b606060028260008151811061369857fe5b016020015160f81c816136a757fe5b0660ff16600014156136c5576136be826002612e7a565b905061097a565b6136be826001612e7a565b6136d86137d0565b600082516001600160401b03811180156136f157600080fd5b5060405190808252806020026020018201604052801561372557816020015b60608152602001906001900390816137105790505b50905060005b835181101561376f5761375084828151811061374357fe5b602002602001015161367c565b82828151811061375c57fe5b602090810291909101015260010161372b565b506116968161364d565b6060611528826020015160008460000151612a47565b60408051608081018252600080825260208201819052918101829052606081019190915290565b604051806040016040528060008152602001600081525090565b604051806040016040528060608152602001606081525090565b60006137fd6137f884614207565b6141e4565b905082815283838301111561381157600080fd5b828260208301376000602084830101529392505050565b803561097a81614258565b8051801515811461097a57600080fd5b600082601f830112613853578081fd5b611696838335602085016137ea565b80356002811061097a57600080fd5b600080600060608486031215613885578283fd5b833561389081614258565b925060208401356138a081614258565b915060408401356001600160401b038111156138ba578182fd5b6138c686828701613843565b9150509250925092565b6000806000606084860312156138e4578283fd5b83356138ef81614258565b92506020840135915060408401356001600160401b038111156138ba578182fd5b60008060408385031215613922578182fd5b823561392d81614258565b915060208301356001600160401b03811115613947578182fd5b61395385828601613843565b9150509250929050565b60006020828403121561396e578081fd5b61169682613833565b600060208284031215613988578081fd5b5051919050565b6000602082840312156139a0578081fd5b81516001600160401b038111156139b5578182fd5b8201601f810184136139c5578182fd5b80516139d36137f882614207565b8181528560208385010111156139e7578384fd5b611bce826020830160208601614228565b600060208284031215613a09578081fd5b81356001600160401b03811115613a1e578182fd5b8201601f81018413613a2e578182fd5b61154c848235602084016137ea565b600060c08284031215613a4e578081fd5b60405160c081018181106001600160401b0382111715613a6a57fe5b8060405250825181526020830151602082015260408301516040820152606083015160608201526080830151613a9f81614258565b6080820152613ab060a08401613833565b60a08201529392505050565b600060208284031215613acd578081fd5b81356001600160401b0380821115613ae3578283fd5b9083019060e08286031215613af6578283fd5b613b0060e06141e4565b8235815260208301356020820152613b1a60408401613862565b6040820152613b2b60608401613828565b6060820152613b3c60808401613828565b608082015260a083013560a082015260c083013582811115613b5c578485fd5b613b6887828601613843565b60c08301525095945050505050565b6001600160a01b03169052565b60008151808452613b9c816020860160208601614228565b601f01601f19169290920160200192915050565b60609190911b6bffffffffffffffffffffffff1916815260140190565b90815260200190565b60008351613be8818460208801614228565b835190830190613bfc818360208801614228565b01949350505050565b600088825287602083015260028710613c1a57fe5b8660f81b60408301526bffffffffffffffffffffffff19808760601b166041840152808660601b166055840152508360698301528251613c61816089850160208701614228565b9190910160890198975050505050505050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039390931683526020830191909152604082015260600190565b600060e08201905060018060a01b038085168352835160208401526020840151604084015260408401516060840152606084015160808401528060808501511660a08401525060a0830151151560c08301529392505050565b901515815260200190565b6020810160038310613d3457fe5b91905290565b60208082526025908201527f53746f7261676520736c6f742068617320616c7265616479206265656e20707260408201526437bb32b71760d91b606082015260800190565b60208082526026908201527f4163636f756e742073746174652068617320616c7265616479206265656e20706040820152653937bb32b71760d11b606082015260800190565b6020808252603e908201527f416c6c206163636f756e7473206d75737420626520636f6d6d6974746564206260408201527f65666f726520636f6d706c6574696e672061207472616e736974696f6e2e0000606082015260800190565b602080825260409082018190527f53746f7261676520736c6f742076616c7565207761736e2774206368616e6765908201527f64206f722068617320616c7265616479206265656e20636f6d6d69747465642e606082015260800190565b6020808252605b908201527f4f564d5f53746174655472616e736974696f6e65723a2050726f76696465642060408201527f4c3120636f6e747261637420636f6465206861736820646f6573206e6f74206d60608201527f61746368204c3220636f6e747261637420636f646520686173682e0000000000608082015260a00190565b6020808252603f908201527f416c6c2073746f72616765206d75737420626520636f6d6d697474656420626560408201527f666f726520636f6d6d697474696e67206163636f756e74207374617465732e00606082015260800190565b60208082526038908201527f4e6f7420656e6f7567682067617320746f2065786563757465207472616e736160408201527f6374696f6e2064657465726d696e6973746963616c6c792e0000000000000000606082015260800190565b6020808252603b908201527f4163636f756e74207374617465207761736e2774206368616e676564206f722060408201527f68617320616c7265616479206265656e20636f6d6d69747465642e0000000000606082015260800190565b6020808252603d908201527f416c6c2073746f72616765206d75737420626520636f6d6d697474656420626560408201527f666f726520636f6d706c6574696e672061207472616e736974696f6e2e000000606082015260800190565b60208082526031908201527f46756e6374696f6e206d7573742062652063616c6c656420647572696e67207460408201527034329031b7b93932b1ba10383430b9b29760791b606082015260800190565b6020808252601d908201527f496e76616c6964207472616e73616374696f6e2070726f76696465642e000000604082015260600190565b60208082526038908201527f436f6e7472616374206d757374206265207665726966696564206265666f726560408201527f2070726f76696e6720612073746f7261676520736c6f742e0000000000000000606082015260800190565b600060408252835160408301526020840151606083015260408401516002811061418257fe5b60808381019190915260608501516001600160a01b031660a08401528401516141ae60c0840182613b77565b5060a084015160e083015260c084015160e06101008401526141d4610120840182613b84565b9150506116966020830184613b77565b6040518181016001600160401b03811182821017156141ff57fe5b604052919050565b60006001600160401b0382111561421a57fe5b50601f01601f191660200190565b60005b8381101561424357818101518382015260200161422b565b83811115614252576000848401525b50505050565b6001600160a01b038116811461426d57600080fd5b5056fe50726f766964656420524c50206c6973742065786365656473206d6178206c697374206c656e6774682e52656365697665642061206e6f6465207769746820616e20756e6b6e6f776e20707265666978a2646970667358221220ce5bdf188c3574b3ab8fd8d954100f14bc36e9cb42e1ca798a8f556d7ace41f564736f6c634300070600334372656174652063616e206f6e6c7920626520646f6e6520627920746865204f564d5f467261756456657269666965722ea26469706673582212200d398ad651c22ef8f9239e5104dc8b8e30dec6c479966de4f2382a136a81db4864736f6c63430007060033", "devdoc": { - "details": "The State Transitioner Factory is used by the Fraud Verifier to create a new State Transitioner during the initialization of a fraud proof. Compiler used: solc Runtime target: EVM", + "details": "The State Transitioner Factory is used by the Fraud Verifier to create a new State Transitioner during the initialization of a fraud proof. Compiler used: solc Runtime target: EVM", "kind": "dev", "methods": { "create(address,uint256,bytes32,bytes32)": { @@ -116,6 +116,14 @@ "returns": { "_0": "New OVM_StateTransitioner instance." } + }, + "resolve(string)": { + "params": { + "_name": "Name to resolve an address for." + }, + "returns": { + "_0": "Address associated with the given name." + } } }, "title": "OVM_StateTransitionerFactory", @@ -126,6 +134,9 @@ "methods": { "create(address,uint256,bytes32,bytes32)": { "notice": "Creates a new OVM_StateTransitioner" + }, + "resolve(string)": { + "notice": "Resolves the address associated with a given name." } }, "version": 1 @@ -133,16 +144,16 @@ "storageLayout": { "storage": [ { - "astId": 12526, + "astId": 12800, "contract": "contracts/optimistic-ethereum/OVM/verification/OVM_StateTransitionerFactory.sol:OVM_StateTransitionerFactory", "label": "libAddressManager", "offset": 0, "slot": "0", - "type": "t_contract(Lib_AddressManager)12519" + "type": "t_contract(Lib_AddressManager)12793" } ], "types": { - "t_contract(Lib_AddressManager)12519": { + "t_contract(Lib_AddressManager)12793": { "encoding": "inplace", "label": "contract Lib_AddressManager", "numberOfBytes": "20" diff --git a/packages/contracts/deployments/kovan/Proxy__OVM_L1CrossDomainMessenger.json b/packages/contracts/deployments/kovan/Proxy__OVM_L1CrossDomainMessenger.json index 98439da44740d..c42f5d0bf1550 100644 --- a/packages/contracts/deployments/kovan/Proxy__OVM_L1CrossDomainMessenger.json +++ b/packages/contracts/deployments/kovan/Proxy__OVM_L1CrossDomainMessenger.json @@ -1,5 +1,5 @@ { - "address": "0x48062eD9b6488EC41c4CfbF2f568D7773819d8C9", + "address": "0x78b88FD62FBdBf67b9C5C6528CF84E9d30BB28e0", "abi": [ { "inputs": [ @@ -22,30 +22,30 @@ "type": "fallback" } ], - "transactionHash": "0x84a219d4344a0ac4965fc5c4d1552f733611d4e54870586319f4406ca1e46564", + "transactionHash": "0xd175bdbcd00f66a7b3a247bf2d0c3719912b845f4898cfe6e09062cc7c33849f", "receipt": { "to": null, "from": "0x18394B52d3Cb931dfA76F63251919D051953413d", - "contractAddress": "0x48062eD9b6488EC41c4CfbF2f568D7773819d8C9", + "contractAddress": "0x78b88FD62FBdBf67b9C5C6528CF84E9d30BB28e0", "transactionIndex": 1, - "gasUsed": "213556", + "gasUsed": "222424", "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0x79b0c0265808192ed8489d258fea40635f62e5f8136578694294d6a4b0ee7f44", - "transactionHash": "0x84a219d4344a0ac4965fc5c4d1552f733611d4e54870586319f4406ca1e46564", + "blockHash": "0x1e1bc36b9553544c99025041f703c41760904c63ad443300a44e9ef0e2be7f56", + "transactionHash": "0xd175bdbcd00f66a7b3a247bf2d0c3719912b845f4898cfe6e09062cc7c33849f", "logs": [], - "blockNumber": 24199499, - "cumulativeGasUsed": "280400", + "blockNumber": 24572837, + "cumulativeGasUsed": "252381", "status": 1, "byzantium": true }, "args": [ - "0xFaf27b24ba54C6910C12CFF5C9453C0e8D634e05", + "0xd56F695e73286ac252A37593DD4E7c14270eC1Df", "OVM_L1CrossDomainMessenger" ], - "solcInputHash": "03aed03b958b1d37f90bd88d0f56dd85", - "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_implementationName\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"stateMutability\":\"payable\",\"type\":\"fallback\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_implementationName\":\"implementationName of the contract to proxy to.\",\"_libAddressManager\":\"Address of the Lib_AddressManager.\"}}},\"title\":\"Lib_ResolvedDelegateProxy\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/libraries/resolver/Lib_ResolvedDelegateProxy.sol\":\"Lib_ResolvedDelegateProxy\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Contract Imports */\\nimport { Ownable } from \\\"./Lib_Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n /*******************************************\\n * Contract Variables: Internal Accounting *\\n *******************************************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n public\\n onlyOwner\\n {\\n emit AddressSet(_name, _address);\\n addresses[_getNameHash(_name)] = _address;\\n }\\n\\n function getAddress(\\n string memory _name\\n )\\n public\\n view\\n returns (address)\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32 _hash\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0x3a490595cc21ff170e4027843093670ff845d5972481fbfb956b722ea564bb06\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Ownable\\n * @dev Adapted from https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol\\n */\\nabstract contract Ownable {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n address public owner;\\n\\n\\n /**********\\n * Events *\\n **********/\\n\\n event OwnershipTransferred(\\n address indexed previousOwner,\\n address indexed newOwner\\n );\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n constructor() {\\n owner = msg.sender;\\n emit OwnershipTransferred(address(0), owner);\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n owner == msg.sender,\\n \\\"Ownable: caller is not the owner\\\"\\n );\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function renounceOwnership()\\n public\\n virtual\\n onlyOwner\\n {\\n emit OwnershipTransferred(owner, address(0));\\n owner = address(0);\\n }\\n\\n function transferOwnership(address _newOwner)\\n public\\n virtual\\n onlyOwner\\n {\\n require(\\n _newOwner != address(0),\\n \\\"Ownable: new owner cannot be the zero address\\\"\\n );\\n\\n emit OwnershipTransferred(owner, _newOwner);\\n owner = _newOwner;\\n }\\n}\\n\",\"keccak256\":\"0xd9dfd9264e5b5fedd53a5b10fdf179c3f367614b0fe69179bce4e45119f5b739\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_ResolvedDelegateProxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_ResolvedDelegateProxy\\n */\\ncontract Lib_ResolvedDelegateProxy {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n\\n // Using mappings to store fields to avoid overwriting storage slots in the\\n // implementation contract. For example, instead of storing these fields at\\n // storage slot `0` & `1`, they are stored at `keccak256(key + slot)`.\\n // See: https://solidity.readthedocs.io/en/v0.7.0/internals/layout_in_storage.html\\n // NOTE: Do not use this code in your own contract system. \\n // There is a known flaw in this contract, and we will remove it from the repository\\n // in the near future. Due to the very limited way that we are using it, this flaw is\\n // not an issue in our system. \\n mapping(address=>string) private implementationName;\\n mapping(address=>Lib_AddressManager) private addressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n * @param _implementationName implementationName of the contract to proxy to.\\n */\\n constructor(\\n address _libAddressManager,\\n string memory _implementationName\\n )\\n {\\n addressManager[address(this)] = Lib_AddressManager(_libAddressManager);\\n implementationName[address(this)] = _implementationName;\\n }\\n\\n\\n /*********************\\n * Fallback Function *\\n *********************/\\n\\n fallback()\\n external\\n payable\\n {\\n address target = addressManager[address(this)].getAddress((implementationName[address(this)]));\\n require(\\n target != address(0),\\n \\\"Target address must be initialized.\\\"\\n );\\n\\n (bool success, bytes memory returndata) = target.delegatecall(msg.data);\\n\\n if (success == true) {\\n assembly {\\n return(add(returndata, 0x20), mload(returndata))\\n }\\n } else {\\n assembly {\\n revert(add(returndata, 0x20), mload(returndata))\\n }\\n }\\n }\\n}\\n\",\"keccak256\":\"0xa08435359a6365e850d6abf5b0a552f1f19d694d10e59849614f49705184fa54\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x608060405234801561001057600080fd5b506040516103df3803806103df8339818101604052604081101561003357600080fd5b81516020830180516040519294929383019291908464010000000082111561005a57600080fd5b90830190602082018581111561006f57600080fd5b825164010000000081118282018810171561008957600080fd5b82525081516020918201929091019080838360005b838110156100b657818101518382015260200161009e565b50505050905090810190601f1680156100e35780820380516001836020036101000a031916815260200191505b5060409081523060009081526001602090815282822080546001600160a01b0319166001600160a01b038a16179055818152919020855161012c95509093509085019150610134565b5050506101d5565b828054600181600116156101000203166002900490600052602060002090601f01602090048101928261016a57600085556101b0565b82601f1061018357805160ff19168380011785556101b0565b828001600101855582156101b0579182015b828111156101b0578251825591602001919060010190610195565b506101bc9291506101c0565b5090565b5b808211156101bc57600081556001016101c1565b6101fb806101e46000396000f3fe60806040818152306000908152600160208181528383205483825293832063bf40fac160e01b909552608490815284546002610100938216159390930260001901169190910460a481905291936001600160a01b039093169263bf40fac192909190819060c490849080156100b55780601f1061008a576101008083540402835291602001916100b5565b820191906000526020600020905b81548152906001019060200180831161009857829003601f168201915b50509250505060206040518083038186803b1580156100d357600080fd5b505afa1580156100e7573d6000803e3d6000fd5b505050506040513d60208110156100fd57600080fd5b505190506001600160a01b0381166101465760405162461bcd60e51b81526004018080602001828103825260238152602001806101cc6023913960400191505060405180910390fd5b600080826001600160a01b03166000366040518083838082843760405192019450600093509091505080830381855af49150503d80600081146101a5576040519150601f19603f3d011682016040523d82523d6000602084013e6101aa565b606091505b509092509050600182151514156101c357805160208201f35b805160208201fdfe5461726765742061646472657373206d75737420626520696e697469616c697a65642ea164736f6c6343000706000a", - "deployedBytecode": "0x60806040818152306000908152600160208181528383205483825293832063bf40fac160e01b909552608490815284546002610100938216159390930260001901169190910460a481905291936001600160a01b039093169263bf40fac192909190819060c490849080156100b55780601f1061008a576101008083540402835291602001916100b5565b820191906000526020600020905b81548152906001019060200180831161009857829003601f168201915b50509250505060206040518083038186803b1580156100d357600080fd5b505afa1580156100e7573d6000803e3d6000fd5b505050506040513d60208110156100fd57600080fd5b505190506001600160a01b0381166101465760405162461bcd60e51b81526004018080602001828103825260238152602001806101cc6023913960400191505060405180910390fd5b600080826001600160a01b03166000366040518083838082843760405192019450600093509091505080830381855af49150503d80600081146101a5576040519150601f19603f3d011682016040523d82523d6000602084013e6101aa565b606091505b509092509050600182151514156101c357805160208201f35b805160208201fdfe5461726765742061646472657373206d75737420626520696e697469616c697a65642ea164736f6c6343000706000a", + "solcInputHash": "5ee8e508e2c54cb5ac6783b4855b1558", + "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_implementationName\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"stateMutability\":\"payable\",\"type\":\"fallback\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_implementationName\":\"implementationName of the contract to proxy to.\",\"_libAddressManager\":\"Address of the Lib_AddressManager.\"}}},\"title\":\"Lib_ResolvedDelegateProxy\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/libraries/resolver/Lib_ResolvedDelegateProxy.sol\":\"Lib_ResolvedDelegateProxy\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor () internal {\\n address msgSender = _msgSender();\\n _owner = msgSender;\\n emit OwnershipTransferred(address(0), msgSender);\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n emit OwnershipTransferred(_owner, address(0));\\n _owner = address(0);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n emit OwnershipTransferred(_owner, newOwner);\\n _owner = newOwner;\\n }\\n}\\n\",\"keccak256\":\"0x15e2d5bd4c28a88548074c54d220e8086f638a71ed07e6b3ba5a70066fcf458d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with GSN meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address payable) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes memory) {\\n this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x8d3cb350f04ff49cfb10aef08d87f19dcbaecc8027b0bed12f3275cd12f38cf0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n public\\n onlyOwner\\n {\\n addresses[_getNameHash(_name)] = _address;\\n\\n emit AddressSet(\\n _name,\\n _address\\n );\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0x2ce671a0e004df88b136bea5a3c59d0732cea8887c8496da1d509e0200b03d7d\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_ResolvedDelegateProxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_ResolvedDelegateProxy\\n */\\ncontract Lib_ResolvedDelegateProxy {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n // Using mappings to store fields to avoid overwriting storage slots in the\\n // implementation contract. For example, instead of storing these fields at\\n // storage slot `0` & `1`, they are stored at `keccak256(key + slot)`.\\n // See: https://solidity.readthedocs.io/en/v0.7.0/internals/layout_in_storage.html\\n // NOTE: Do not use this code in your own contract system.\\n // There is a known flaw in this contract, and we will remove it from the repository\\n // in the near future. Due to the very limited way that we are using it, this flaw is\\n // not an issue in our system.\\n mapping (address => string) private implementationName;\\n mapping (address => Lib_AddressManager) private addressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n * @param _implementationName implementationName of the contract to proxy to.\\n */\\n constructor(\\n address _libAddressManager,\\n string memory _implementationName\\n ) {\\n addressManager[address(this)] = Lib_AddressManager(_libAddressManager);\\n implementationName[address(this)] = _implementationName;\\n }\\n\\n\\n /*********************\\n * Fallback Function *\\n *********************/\\n\\n fallback()\\n external\\n payable\\n {\\n address target = addressManager[address(this)].getAddress(\\n (implementationName[address(this)])\\n );\\n\\n require(\\n target != address(0),\\n \\\"Target address must be initialized.\\\"\\n );\\n\\n (bool success, bytes memory returndata) = target.delegatecall(msg.data);\\n\\n if (success == true) {\\n assembly {\\n return(add(returndata, 0x20), mload(returndata))\\n }\\n } else {\\n assembly {\\n revert(add(returndata, 0x20), mload(returndata))\\n }\\n }\\n }\\n}\\n\",\"keccak256\":\"0xfaecb051b37f1d87d588cafb17a575723cbdf7c3c2079772110f33e747e05027\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x608060405234801561001057600080fd5b506040516104083803806104088339818101604052604081101561003357600080fd5b81516020830180516040519294929383019291908464010000000082111561005a57600080fd5b90830190602082018581111561006f57600080fd5b825164010000000081118282018810171561008957600080fd5b82525081516020918201929091019080838360005b838110156100b657818101518382015260200161009e565b50505050905090810190601f1680156100e35780820380516001836020036101000a031916815260200191505b5060409081523060009081526001602090815282822080546001600160a01b0319166001600160a01b038a16179055818152919020855161012c95509093509085019150610134565b5050506101d5565b828054600181600116156101000203166002900490600052602060002090601f01602090048101928261016a57600085556101b0565b82601f1061018357805160ff19168380011785556101b0565b828001600101855582156101b0579182015b828111156101b0578251825591602001919060010190610195565b506101bc9291506101c0565b5090565b5b808211156101bc57600081556001016101c1565b610224806101e46000396000f3fe60806040818152306000908152600160208181528383205483825293832063bf40fac160e01b909552608490815284546002610100938216159390930260001901169190910460a481905291936001600160a01b039093169263bf40fac192909190819060c490849080156100b55780601f1061008a576101008083540402835291602001916100b5565b820191906000526020600020905b81548152906001019060200180831161009857829003601f168201915b50509250505060206040518083038186803b1580156100d357600080fd5b505afa1580156100e7573d6000803e3d6000fd5b505050506040513d60208110156100fd57600080fd5b505190506001600160a01b0381166101465760405162461bcd60e51b81526004018080602001828103825260238152602001806101cc6023913960400191505060405180910390fd5b600080826001600160a01b03166000366040518083838082843760405192019450600093509091505080830381855af49150503d80600081146101a5576040519150601f19603f3d011682016040523d82523d6000602084013e6101aa565b606091505b509092509050600182151514156101c357805160208201f35b805160208201fdfe5461726765742061646472657373206d75737420626520696e697469616c697a65642ea264697066735822122026d4992ed7562b49b7d3e306977cab94c29f8fb64a137b48d18960cc5ef1341d64736f6c63430007060033", + "deployedBytecode": "0x60806040818152306000908152600160208181528383205483825293832063bf40fac160e01b909552608490815284546002610100938216159390930260001901169190910460a481905291936001600160a01b039093169263bf40fac192909190819060c490849080156100b55780601f1061008a576101008083540402835291602001916100b5565b820191906000526020600020905b81548152906001019060200180831161009857829003601f168201915b50509250505060206040518083038186803b1580156100d357600080fd5b505afa1580156100e7573d6000803e3d6000fd5b505050506040513d60208110156100fd57600080fd5b505190506001600160a01b0381166101465760405162461bcd60e51b81526004018080602001828103825260238152602001806101cc6023913960400191505060405180910390fd5b600080826001600160a01b03166000366040518083838082843760405192019450600093509091505080830381855af49150503d80600081146101a5576040519150601f19603f3d011682016040523d82523d6000602084013e6101aa565b606091505b509092509050600182151514156101c357805160208201f35b805160208201fdfe5461726765742061646472657373206d75737420626520696e697469616c697a65642ea264697066735822122026d4992ed7562b49b7d3e306977cab94c29f8fb64a137b48d18960cc5ef1341d64736f6c63430007060033", "devdoc": { "kind": "dev", "methods": { @@ -67,7 +67,7 @@ "storageLayout": { "storage": [ { - "astId": 12651, + "astId": 12837, "contract": "contracts/optimistic-ethereum/libraries/resolver/Lib_ResolvedDelegateProxy.sol:Lib_ResolvedDelegateProxy", "label": "implementationName", "offset": 0, @@ -75,12 +75,12 @@ "type": "t_mapping(t_address,t_string_storage)" }, { - "astId": 12655, + "astId": 12841, "contract": "contracts/optimistic-ethereum/libraries/resolver/Lib_ResolvedDelegateProxy.sol:Lib_ResolvedDelegateProxy", "label": "addressManager", "offset": 0, "slot": "1", - "type": "t_mapping(t_address,t_contract(Lib_AddressManager)12519)" + "type": "t_mapping(t_address,t_contract(Lib_AddressManager)12793)" } ], "types": { @@ -89,17 +89,17 @@ "label": "address", "numberOfBytes": "20" }, - "t_contract(Lib_AddressManager)12519": { + "t_contract(Lib_AddressManager)12793": { "encoding": "inplace", "label": "contract Lib_AddressManager", "numberOfBytes": "20" }, - "t_mapping(t_address,t_contract(Lib_AddressManager)12519)": { + "t_mapping(t_address,t_contract(Lib_AddressManager)12793)": { "encoding": "mapping", "key": "t_address", "label": "mapping(address => contract Lib_AddressManager)", "numberOfBytes": "32", - "value": "t_contract(Lib_AddressManager)12519" + "value": "t_contract(Lib_AddressManager)12793" }, "t_mapping(t_address,t_string_storage)": { "encoding": "mapping", diff --git a/packages/contracts/deployments/kovan/Proxy__OVM_L1ETHGateway.json b/packages/contracts/deployments/kovan/Proxy__OVM_L1ETHGateway.json index 487fe0e800a4b..65948c09a9c25 100644 --- a/packages/contracts/deployments/kovan/Proxy__OVM_L1ETHGateway.json +++ b/packages/contracts/deployments/kovan/Proxy__OVM_L1ETHGateway.json @@ -1,5 +1,5 @@ { - "address": "0xf3902e50dA095bD2e954AB320E8eafDA6152dFDa", + "address": "0xB191d67F69e823445cD59e5A88953a82be73b9C6", "abi": [ { "inputs": [ @@ -22,30 +22,30 @@ "type": "fallback" } ], - "transactionHash": "0x6fe4b36e6065e2c9b0a0a903574e07561941816dd2e17d5c9f7b4bb706e2074a", + "transactionHash": "0xbb58732ffd132b5fa62c010e3bdc4ee2a500adf82d3ced38f1175e2b00cd0afb", "receipt": { "to": null, "from": "0x18394B52d3Cb931dfA76F63251919D051953413d", - "contractAddress": "0xf3902e50dA095bD2e954AB320E8eafDA6152dFDa", - "transactionIndex": 8, - "gasUsed": "213436", + "contractAddress": "0xB191d67F69e823445cD59e5A88953a82be73b9C6", + "transactionIndex": 1, + "gasUsed": "222304", "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0xfd814e73b8091e7e4b609f9dc82a9ad3fd9e92a886fcb4caf11c9374f2e5bed8", - "transactionHash": "0x6fe4b36e6065e2c9b0a0a903574e07561941816dd2e17d5c9f7b4bb706e2074a", + "blockHash": "0x918daf79ddefb51f9a507188032a29c44ad2b8e42bd1d90fda2943895ad18806", + "transactionHash": "0xbb58732ffd132b5fa62c010e3bdc4ee2a500adf82d3ced38f1175e2b00cd0afb", "logs": [], - "blockNumber": 24199533, - "cumulativeGasUsed": "1483231", + "blockNumber": 24572909, + "cumulativeGasUsed": "267164", "status": 1, "byzantium": true }, "args": [ - "0xFaf27b24ba54C6910C12CFF5C9453C0e8D634e05", + "0xd56F695e73286ac252A37593DD4E7c14270eC1Df", "OVM_L1ETHGateway" ], - "solcInputHash": "03aed03b958b1d37f90bd88d0f56dd85", - "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_implementationName\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"stateMutability\":\"payable\",\"type\":\"fallback\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_implementationName\":\"implementationName of the contract to proxy to.\",\"_libAddressManager\":\"Address of the Lib_AddressManager.\"}}},\"title\":\"Lib_ResolvedDelegateProxy\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/libraries/resolver/Lib_ResolvedDelegateProxy.sol\":\"Lib_ResolvedDelegateProxy\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Contract Imports */\\nimport { Ownable } from \\\"./Lib_Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n /*******************************************\\n * Contract Variables: Internal Accounting *\\n *******************************************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n public\\n onlyOwner\\n {\\n emit AddressSet(_name, _address);\\n addresses[_getNameHash(_name)] = _address;\\n }\\n\\n function getAddress(\\n string memory _name\\n )\\n public\\n view\\n returns (address)\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32 _hash\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0x3a490595cc21ff170e4027843093670ff845d5972481fbfb956b722ea564bb06\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Ownable\\n * @dev Adapted from https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol\\n */\\nabstract contract Ownable {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n address public owner;\\n\\n\\n /**********\\n * Events *\\n **********/\\n\\n event OwnershipTransferred(\\n address indexed previousOwner,\\n address indexed newOwner\\n );\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n constructor() {\\n owner = msg.sender;\\n emit OwnershipTransferred(address(0), owner);\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n owner == msg.sender,\\n \\\"Ownable: caller is not the owner\\\"\\n );\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function renounceOwnership()\\n public\\n virtual\\n onlyOwner\\n {\\n emit OwnershipTransferred(owner, address(0));\\n owner = address(0);\\n }\\n\\n function transferOwnership(address _newOwner)\\n public\\n virtual\\n onlyOwner\\n {\\n require(\\n _newOwner != address(0),\\n \\\"Ownable: new owner cannot be the zero address\\\"\\n );\\n\\n emit OwnershipTransferred(owner, _newOwner);\\n owner = _newOwner;\\n }\\n}\\n\",\"keccak256\":\"0xd9dfd9264e5b5fedd53a5b10fdf179c3f367614b0fe69179bce4e45119f5b739\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_ResolvedDelegateProxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_ResolvedDelegateProxy\\n */\\ncontract Lib_ResolvedDelegateProxy {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n\\n // Using mappings to store fields to avoid overwriting storage slots in the\\n // implementation contract. For example, instead of storing these fields at\\n // storage slot `0` & `1`, they are stored at `keccak256(key + slot)`.\\n // See: https://solidity.readthedocs.io/en/v0.7.0/internals/layout_in_storage.html\\n // NOTE: Do not use this code in your own contract system. \\n // There is a known flaw in this contract, and we will remove it from the repository\\n // in the near future. Due to the very limited way that we are using it, this flaw is\\n // not an issue in our system. \\n mapping(address=>string) private implementationName;\\n mapping(address=>Lib_AddressManager) private addressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n * @param _implementationName implementationName of the contract to proxy to.\\n */\\n constructor(\\n address _libAddressManager,\\n string memory _implementationName\\n )\\n {\\n addressManager[address(this)] = Lib_AddressManager(_libAddressManager);\\n implementationName[address(this)] = _implementationName;\\n }\\n\\n\\n /*********************\\n * Fallback Function *\\n *********************/\\n\\n fallback()\\n external\\n payable\\n {\\n address target = addressManager[address(this)].getAddress((implementationName[address(this)]));\\n require(\\n target != address(0),\\n \\\"Target address must be initialized.\\\"\\n );\\n\\n (bool success, bytes memory returndata) = target.delegatecall(msg.data);\\n\\n if (success == true) {\\n assembly {\\n return(add(returndata, 0x20), mload(returndata))\\n }\\n } else {\\n assembly {\\n revert(add(returndata, 0x20), mload(returndata))\\n }\\n }\\n }\\n}\\n\",\"keccak256\":\"0xa08435359a6365e850d6abf5b0a552f1f19d694d10e59849614f49705184fa54\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x608060405234801561001057600080fd5b506040516103df3803806103df8339818101604052604081101561003357600080fd5b81516020830180516040519294929383019291908464010000000082111561005a57600080fd5b90830190602082018581111561006f57600080fd5b825164010000000081118282018810171561008957600080fd5b82525081516020918201929091019080838360005b838110156100b657818101518382015260200161009e565b50505050905090810190601f1680156100e35780820380516001836020036101000a031916815260200191505b5060409081523060009081526001602090815282822080546001600160a01b0319166001600160a01b038a16179055818152919020855161012c95509093509085019150610134565b5050506101d5565b828054600181600116156101000203166002900490600052602060002090601f01602090048101928261016a57600085556101b0565b82601f1061018357805160ff19168380011785556101b0565b828001600101855582156101b0579182015b828111156101b0578251825591602001919060010190610195565b506101bc9291506101c0565b5090565b5b808211156101bc57600081556001016101c1565b6101fb806101e46000396000f3fe60806040818152306000908152600160208181528383205483825293832063bf40fac160e01b909552608490815284546002610100938216159390930260001901169190910460a481905291936001600160a01b039093169263bf40fac192909190819060c490849080156100b55780601f1061008a576101008083540402835291602001916100b5565b820191906000526020600020905b81548152906001019060200180831161009857829003601f168201915b50509250505060206040518083038186803b1580156100d357600080fd5b505afa1580156100e7573d6000803e3d6000fd5b505050506040513d60208110156100fd57600080fd5b505190506001600160a01b0381166101465760405162461bcd60e51b81526004018080602001828103825260238152602001806101cc6023913960400191505060405180910390fd5b600080826001600160a01b03166000366040518083838082843760405192019450600093509091505080830381855af49150503d80600081146101a5576040519150601f19603f3d011682016040523d82523d6000602084013e6101aa565b606091505b509092509050600182151514156101c357805160208201f35b805160208201fdfe5461726765742061646472657373206d75737420626520696e697469616c697a65642ea164736f6c6343000706000a", - "deployedBytecode": "0x60806040818152306000908152600160208181528383205483825293832063bf40fac160e01b909552608490815284546002610100938216159390930260001901169190910460a481905291936001600160a01b039093169263bf40fac192909190819060c490849080156100b55780601f1061008a576101008083540402835291602001916100b5565b820191906000526020600020905b81548152906001019060200180831161009857829003601f168201915b50509250505060206040518083038186803b1580156100d357600080fd5b505afa1580156100e7573d6000803e3d6000fd5b505050506040513d60208110156100fd57600080fd5b505190506001600160a01b0381166101465760405162461bcd60e51b81526004018080602001828103825260238152602001806101cc6023913960400191505060405180910390fd5b600080826001600160a01b03166000366040518083838082843760405192019450600093509091505080830381855af49150503d80600081146101a5576040519150601f19603f3d011682016040523d82523d6000602084013e6101aa565b606091505b509092509050600182151514156101c357805160208201f35b805160208201fdfe5461726765742061646472657373206d75737420626520696e697469616c697a65642ea164736f6c6343000706000a", + "solcInputHash": "5ee8e508e2c54cb5ac6783b4855b1558", + "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_implementationName\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"stateMutability\":\"payable\",\"type\":\"fallback\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_implementationName\":\"implementationName of the contract to proxy to.\",\"_libAddressManager\":\"Address of the Lib_AddressManager.\"}}},\"title\":\"Lib_ResolvedDelegateProxy\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/libraries/resolver/Lib_ResolvedDelegateProxy.sol\":\"Lib_ResolvedDelegateProxy\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor () internal {\\n address msgSender = _msgSender();\\n _owner = msgSender;\\n emit OwnershipTransferred(address(0), msgSender);\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n emit OwnershipTransferred(_owner, address(0));\\n _owner = address(0);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n emit OwnershipTransferred(_owner, newOwner);\\n _owner = newOwner;\\n }\\n}\\n\",\"keccak256\":\"0x15e2d5bd4c28a88548074c54d220e8086f638a71ed07e6b3ba5a70066fcf458d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with GSN meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address payable) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes memory) {\\n this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x8d3cb350f04ff49cfb10aef08d87f19dcbaecc8027b0bed12f3275cd12f38cf0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n public\\n onlyOwner\\n {\\n addresses[_getNameHash(_name)] = _address;\\n\\n emit AddressSet(\\n _name,\\n _address\\n );\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0x2ce671a0e004df88b136bea5a3c59d0732cea8887c8496da1d509e0200b03d7d\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_ResolvedDelegateProxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_ResolvedDelegateProxy\\n */\\ncontract Lib_ResolvedDelegateProxy {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n // Using mappings to store fields to avoid overwriting storage slots in the\\n // implementation contract. For example, instead of storing these fields at\\n // storage slot `0` & `1`, they are stored at `keccak256(key + slot)`.\\n // See: https://solidity.readthedocs.io/en/v0.7.0/internals/layout_in_storage.html\\n // NOTE: Do not use this code in your own contract system.\\n // There is a known flaw in this contract, and we will remove it from the repository\\n // in the near future. Due to the very limited way that we are using it, this flaw is\\n // not an issue in our system.\\n mapping (address => string) private implementationName;\\n mapping (address => Lib_AddressManager) private addressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n * @param _implementationName implementationName of the contract to proxy to.\\n */\\n constructor(\\n address _libAddressManager,\\n string memory _implementationName\\n ) {\\n addressManager[address(this)] = Lib_AddressManager(_libAddressManager);\\n implementationName[address(this)] = _implementationName;\\n }\\n\\n\\n /*********************\\n * Fallback Function *\\n *********************/\\n\\n fallback()\\n external\\n payable\\n {\\n address target = addressManager[address(this)].getAddress(\\n (implementationName[address(this)])\\n );\\n\\n require(\\n target != address(0),\\n \\\"Target address must be initialized.\\\"\\n );\\n\\n (bool success, bytes memory returndata) = target.delegatecall(msg.data);\\n\\n if (success == true) {\\n assembly {\\n return(add(returndata, 0x20), mload(returndata))\\n }\\n } else {\\n assembly {\\n revert(add(returndata, 0x20), mload(returndata))\\n }\\n }\\n }\\n}\\n\",\"keccak256\":\"0xfaecb051b37f1d87d588cafb17a575723cbdf7c3c2079772110f33e747e05027\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x608060405234801561001057600080fd5b506040516104083803806104088339818101604052604081101561003357600080fd5b81516020830180516040519294929383019291908464010000000082111561005a57600080fd5b90830190602082018581111561006f57600080fd5b825164010000000081118282018810171561008957600080fd5b82525081516020918201929091019080838360005b838110156100b657818101518382015260200161009e565b50505050905090810190601f1680156100e35780820380516001836020036101000a031916815260200191505b5060409081523060009081526001602090815282822080546001600160a01b0319166001600160a01b038a16179055818152919020855161012c95509093509085019150610134565b5050506101d5565b828054600181600116156101000203166002900490600052602060002090601f01602090048101928261016a57600085556101b0565b82601f1061018357805160ff19168380011785556101b0565b828001600101855582156101b0579182015b828111156101b0578251825591602001919060010190610195565b506101bc9291506101c0565b5090565b5b808211156101bc57600081556001016101c1565b610224806101e46000396000f3fe60806040818152306000908152600160208181528383205483825293832063bf40fac160e01b909552608490815284546002610100938216159390930260001901169190910460a481905291936001600160a01b039093169263bf40fac192909190819060c490849080156100b55780601f1061008a576101008083540402835291602001916100b5565b820191906000526020600020905b81548152906001019060200180831161009857829003601f168201915b50509250505060206040518083038186803b1580156100d357600080fd5b505afa1580156100e7573d6000803e3d6000fd5b505050506040513d60208110156100fd57600080fd5b505190506001600160a01b0381166101465760405162461bcd60e51b81526004018080602001828103825260238152602001806101cc6023913960400191505060405180910390fd5b600080826001600160a01b03166000366040518083838082843760405192019450600093509091505080830381855af49150503d80600081146101a5576040519150601f19603f3d011682016040523d82523d6000602084013e6101aa565b606091505b509092509050600182151514156101c357805160208201f35b805160208201fdfe5461726765742061646472657373206d75737420626520696e697469616c697a65642ea264697066735822122026d4992ed7562b49b7d3e306977cab94c29f8fb64a137b48d18960cc5ef1341d64736f6c63430007060033", + "deployedBytecode": "0x60806040818152306000908152600160208181528383205483825293832063bf40fac160e01b909552608490815284546002610100938216159390930260001901169190910460a481905291936001600160a01b039093169263bf40fac192909190819060c490849080156100b55780601f1061008a576101008083540402835291602001916100b5565b820191906000526020600020905b81548152906001019060200180831161009857829003601f168201915b50509250505060206040518083038186803b1580156100d357600080fd5b505afa1580156100e7573d6000803e3d6000fd5b505050506040513d60208110156100fd57600080fd5b505190506001600160a01b0381166101465760405162461bcd60e51b81526004018080602001828103825260238152602001806101cc6023913960400191505060405180910390fd5b600080826001600160a01b03166000366040518083838082843760405192019450600093509091505080830381855af49150503d80600081146101a5576040519150601f19603f3d011682016040523d82523d6000602084013e6101aa565b606091505b509092509050600182151514156101c357805160208201f35b805160208201fdfe5461726765742061646472657373206d75737420626520696e697469616c697a65642ea264697066735822122026d4992ed7562b49b7d3e306977cab94c29f8fb64a137b48d18960cc5ef1341d64736f6c63430007060033", "devdoc": { "kind": "dev", "methods": { @@ -67,7 +67,7 @@ "storageLayout": { "storage": [ { - "astId": 12651, + "astId": 12837, "contract": "contracts/optimistic-ethereum/libraries/resolver/Lib_ResolvedDelegateProxy.sol:Lib_ResolvedDelegateProxy", "label": "implementationName", "offset": 0, @@ -75,12 +75,12 @@ "type": "t_mapping(t_address,t_string_storage)" }, { - "astId": 12655, + "astId": 12841, "contract": "contracts/optimistic-ethereum/libraries/resolver/Lib_ResolvedDelegateProxy.sol:Lib_ResolvedDelegateProxy", "label": "addressManager", "offset": 0, "slot": "1", - "type": "t_mapping(t_address,t_contract(Lib_AddressManager)12519)" + "type": "t_mapping(t_address,t_contract(Lib_AddressManager)12793)" } ], "types": { @@ -89,17 +89,17 @@ "label": "address", "numberOfBytes": "20" }, - "t_contract(Lib_AddressManager)12519": { + "t_contract(Lib_AddressManager)12793": { "encoding": "inplace", "label": "contract Lib_AddressManager", "numberOfBytes": "20" }, - "t_mapping(t_address,t_contract(Lib_AddressManager)12519)": { + "t_mapping(t_address,t_contract(Lib_AddressManager)12793)": { "encoding": "mapping", "key": "t_address", "label": "mapping(address => contract Lib_AddressManager)", "numberOfBytes": "32", - "value": "t_contract(Lib_AddressManager)12519" + "value": "t_contract(Lib_AddressManager)12793" }, "t_mapping(t_address,t_string_storage)": { "encoding": "mapping", diff --git a/packages/contracts/deployments/kovan/mockOVM_BondManager.json b/packages/contracts/deployments/kovan/mockOVM_BondManager.json index 934017601a038..4ef5baaa33b78 100644 --- a/packages/contracts/deployments/kovan/mockOVM_BondManager.json +++ b/packages/contracts/deployments/kovan/mockOVM_BondManager.json @@ -1,5 +1,5 @@ { - "address": "0x77e244ec49014cFb9c4572453568eCC3AbB70A2d", + "address": "0x8ECe272C9f83041bcb1Cd57AC49Ca6494776bE01", "abi": [ { "inputs": [ @@ -158,7 +158,7 @@ "outputs": [ { "internalType": "address", - "name": "_contract", + "name": "", "type": "address" } ], @@ -173,53 +173,66 @@ "type": "function" } ], - "transactionHash": "0xfa0ce06133a8e92441053bbf890354b29e2b0002c362bd186e7ddc118a0c415c", + "transactionHash": "0x51934b4913fc6cb446cb9b81b11c91393e8a00eb70ba44ac7fa1361fb8119deb", "receipt": { "to": null, "from": "0x18394B52d3Cb931dfA76F63251919D051953413d", - "contractAddress": "0x77e244ec49014cFb9c4572453568eCC3AbB70A2d", - "transactionIndex": 3, - "gasUsed": "288329", + "contractAddress": "0x8ECe272C9f83041bcb1Cd57AC49Ca6494776bE01", + "transactionIndex": 1, + "gasUsed": "297198", "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0x6a09b96f7d2bc7769a5bf25d764699b553141f750c447e5a7b15926839d4e95a", - "transactionHash": "0xfa0ce06133a8e92441053bbf890354b29e2b0002c362bd186e7ddc118a0c415c", + "blockHash": "0xd12c9c8a22bc6d6e515104cc5c8473933eb037f559f8ab725149f9dee9d5f25f", + "transactionHash": "0x51934b4913fc6cb446cb9b81b11c91393e8a00eb70ba44ac7fa1361fb8119deb", "logs": [], - "blockNumber": 24199491, - "cumulativeGasUsed": "784369", + "blockNumber": 24572822, + "cumulativeGasUsed": "595662", "status": 1, "byzantium": true }, "args": [ - "0xFaf27b24ba54C6910C12CFF5C9453C0e8D634e05" + "0xd56F695e73286ac252A37593DD4E7c14270eC1Df" ], - "solcInputHash": "03aed03b958b1d37f90bd88d0f56dd85", - "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_who\",\"type\":\"address\"}],\"name\":\"claim\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"deposit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_preStateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"_publisher\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_timestamp\",\"type\":\"uint256\"}],\"name\":\"finalize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"finalizeWithdrawal\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"getGasSpent\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_who\",\"type\":\"address\"}],\"name\":\"isCollateralized\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_preStateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"_txHash\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"_who\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_gasSpent\",\"type\":\"uint256\"}],\"name\":\"recordGasSpent\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"_contract\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"startWithdrawal\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"title\":\"mockOVM_BondManager\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/mockOVM/verification/mockOVM_BondManager.sol\":\"mockOVM_BondManager\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/optimistic-ethereum/iOVM/verification/iOVM_BondManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\ninterface ERC20 {\\n function transfer(address, uint256) external returns (bool);\\n function transferFrom(address, address, uint256) external returns (bool);\\n}\\n\\n/// All the errors which may be encountered on the bond manager\\nlibrary Errors {\\n string constant ERC20_ERR = \\\"BondManager: Could not post bond\\\";\\n string constant ALREADY_FINALIZED = \\\"BondManager: Fraud proof for this pre-state root has already been finalized\\\";\\n string constant SLASHED = \\\"BondManager: Cannot finalize withdrawal, you probably got slashed\\\";\\n string constant WRONG_STATE = \\\"BondManager: Wrong bond state for proposer\\\";\\n string constant CANNOT_CLAIM = \\\"BondManager: Cannot claim yet. Dispute must be finalized first\\\";\\n\\n string constant WITHDRAWAL_PENDING = \\\"BondManager: Withdrawal already pending\\\";\\n string constant TOO_EARLY = \\\"BondManager: Too early to finalize your withdrawal\\\";\\n\\n string constant ONLY_TRANSITIONER = \\\"BondManager: Only the transitioner for this pre-state root may call this function\\\";\\n string constant ONLY_FRAUD_VERIFIER = \\\"BondManager: Only the fraud verifier may call this function\\\";\\n string constant ONLY_STATE_COMMITMENT_CHAIN = \\\"BondManager: Only the state commitment chain may call this function\\\";\\n string constant WAIT_FOR_DISPUTES = \\\"BondManager: Wait for other potential disputes\\\";\\n}\\n\\n/**\\n * @title iOVM_BondManager\\n */\\ninterface iOVM_BondManager {\\n\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n /// The lifecycle of a proposer's bond\\n enum State {\\n // Before depositing or after getting slashed, a user is uncollateralized\\n NOT_COLLATERALIZED,\\n // After depositing, a user is collateralized\\n COLLATERALIZED,\\n // After a user has initiated a withdrawal\\n WITHDRAWING\\n }\\n\\n /// A bond posted by a proposer\\n struct Bond {\\n // The user's state\\n State state;\\n // The timestamp at which a proposer issued their withdrawal request\\n uint32 withdrawalTimestamp;\\n // The time when the first disputed was initiated for this bond\\n uint256 firstDisputeAt;\\n // The earliest observed state root for this bond which has had fraud\\n bytes32 earliestDisputedStateRoot;\\n // The state root's timestamp\\n uint256 earliestTimestamp;\\n }\\n\\n // Per pre-state root, store the number of state provisions that were made\\n // and how many of these calls were made by each user. Payouts will then be\\n // claimed by users proportionally for that dispute.\\n struct Rewards {\\n // Flag to check if rewards for a fraud proof are claimable\\n bool canClaim;\\n // Total number of `recordGasSpent` calls made\\n uint256 total;\\n // The gas spent by each user to provide witness data. The sum of all\\n // values inside this map MUST be equal to the value of `total`\\n mapping(address => uint256) gasSpent;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function recordGasSpent(\\n bytes32 _preStateRoot,\\n bytes32 _txHash,\\n address _who,\\n uint256 _gasSpent\\n ) external;\\n\\n function finalize(\\n bytes32 _preStateRoot,\\n address _publisher,\\n uint256 _timestamp\\n ) external;\\n\\n function deposit() external;\\n\\n function startWithdrawal() external;\\n\\n function finalizeWithdrawal() external;\\n\\n function claim(\\n address _who\\n ) external;\\n\\n function isCollateralized(\\n address _who\\n ) external view returns (bool);\\n\\n function getGasSpent(\\n bytes32 _preStateRoot,\\n address _who\\n ) external view returns (uint256);\\n}\\n\",\"keccak256\":\"0x3c2a8a399487857158649db1896749d86e39cba545a8aeb2e2bb0f3bdfa7a5b1\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Contract Imports */\\nimport { Ownable } from \\\"./Lib_Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n /*******************************************\\n * Contract Variables: Internal Accounting *\\n *******************************************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n public\\n onlyOwner\\n {\\n emit AddressSet(_name, _address);\\n addresses[_getNameHash(_name)] = _address;\\n }\\n\\n function getAddress(\\n string memory _name\\n )\\n public\\n view\\n returns (address)\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32 _hash\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0x3a490595cc21ff170e4027843093670ff845d5972481fbfb956b722ea564bb06\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n\\n /*******************************************\\n * Contract Variables: Contract References *\\n *******************************************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(\\n address _libAddressManager\\n ) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function resolve(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address _contract\\n )\\n {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0xaa3ed342f6deb156c660fd83afa579a3b80db17eb465e8949cf5c1b114780143\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title Ownable\\n * @dev Adapted from https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol\\n */\\nabstract contract Ownable {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n address public owner;\\n\\n\\n /**********\\n * Events *\\n **********/\\n\\n event OwnershipTransferred(\\n address indexed previousOwner,\\n address indexed newOwner\\n );\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n constructor() {\\n owner = msg.sender;\\n emit OwnershipTransferred(address(0), owner);\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n owner == msg.sender,\\n \\\"Ownable: caller is not the owner\\\"\\n );\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function renounceOwnership()\\n public\\n virtual\\n onlyOwner\\n {\\n emit OwnershipTransferred(owner, address(0));\\n owner = address(0);\\n }\\n\\n function transferOwnership(address _newOwner)\\n public\\n virtual\\n onlyOwner\\n {\\n require(\\n _newOwner != address(0),\\n \\\"Ownable: new owner cannot be the zero address\\\"\\n );\\n\\n emit OwnershipTransferred(owner, _newOwner);\\n owner = _newOwner;\\n }\\n}\\n\",\"keccak256\":\"0xd9dfd9264e5b5fedd53a5b10fdf179c3f367614b0fe69179bce4e45119f5b739\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/mockOVM/verification/mockOVM_BondManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Interface Imports */\\nimport { iOVM_BondManager } from \\\"../../iOVM/verification/iOVM_BondManager.sol\\\";\\n\\n/* Contract Imports */\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/**\\n * @title mockOVM_BondManager\\n */\\ncontract mockOVM_BondManager is iOVM_BondManager, Lib_AddressResolver {\\n constructor(\\n address _libAddressManager\\n )\\n Lib_AddressResolver(_libAddressManager)\\n {}\\n\\n function recordGasSpent(\\n bytes32 _preStateRoot,\\n bytes32 _txHash,\\n address _who,\\n uint256 _gasSpent\\n )\\n override\\n public\\n {}\\n\\n function finalize(\\n bytes32 _preStateRoot,\\n address _publisher,\\n uint256 _timestamp\\n )\\n override\\n public\\n {}\\n\\n function deposit()\\n override\\n public\\n {}\\n\\n function startWithdrawal()\\n override\\n public\\n {}\\n\\n function finalizeWithdrawal()\\n override\\n public\\n {}\\n\\n function claim(\\n address _who\\n )\\n override\\n public\\n {}\\n\\n function isCollateralized(\\n address _who\\n )\\n override\\n public\\n view\\n returns (\\n bool\\n )\\n {\\n // Only authenticate sequencer to submit state root batches.\\n return _who == resolve(\\\"OVM_Proposer\\\");\\n }\\n\\n function getGasSpent(\\n bytes32, // _preStateRoot,\\n address // _who\\n )\\n override\\n public\\n pure \\n returns (\\n uint256\\n )\\n {\\n return 0;\\n }\\n}\\n\",\"keccak256\":\"0x7742f2892255ca236320217d067f846bbd8f17d1561fae97f492de390598c667\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x608060405234801561001057600080fd5b5060405161043e38038061043e8339818101604052602081101561003357600080fd5b5051600080546001600160a01b039092166001600160a01b03199092169190911790556103d9806100656000396000f3fe608060405234801561001057600080fd5b506004361061009e5760003560e01c8063abfbbe1311610066578063abfbbe1314610207578063bc2f8dd814610239578063c5b6aa2f14610239578063d0e30db014610239578063dc6453dc146102415761009e565b806302ad4d2a146100a35780631e16e92f146100dd5780631e83409a14610117578063299ca4781461013d578063461a447814610161575b600080fd5b6100c9600480360360208110156100b957600080fd5b50356001600160a01b031661027f565b604080519115158252519081900360200190f35b610115600480360360808110156100f357600080fd5b508035906020810135906001600160a01b0360408201351690606001356102c9565b005b6101156004803603602081101561012d57600080fd5b50356001600160a01b03166102cf565b6101456102d2565b604080516001600160a01b039092168252519081900360200190f35b6101456004803603602081101561017757600080fd5b81019060208101813564010000000081111561019257600080fd5b8201836020820111156101a457600080fd5b803590602001918460018302840111640100000000831117156101c657600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506102e1945050505050565b6101156004803603606081101561021d57600080fd5b508035906001600160a01b0360208201351690604001356103bd565b6101156103c2565b61026d6004803603604081101561025757600080fd5b50803590602001356001600160a01b03166103c4565b60408051918252519081900360200190f35b60006102ae6040518060400160405280600c81526020016b27ab26afa83937b837b9b2b960a11b8152506102e1565b6001600160a01b0316826001600160a01b0316149050919050565b50505050565b50565b6000546001600160a01b031681565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b83811015610341578181015183820152602001610329565b50505050905090810190601f16801561036e5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561038b57600080fd5b505afa15801561039f573d6000803e3d6000fd5b505050506040513d60208110156103b557600080fd5b505192915050565b505050565b565b60009291505056fea164736f6c6343000706000a", - "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061009e5760003560e01c8063abfbbe1311610066578063abfbbe1314610207578063bc2f8dd814610239578063c5b6aa2f14610239578063d0e30db014610239578063dc6453dc146102415761009e565b806302ad4d2a146100a35780631e16e92f146100dd5780631e83409a14610117578063299ca4781461013d578063461a447814610161575b600080fd5b6100c9600480360360208110156100b957600080fd5b50356001600160a01b031661027f565b604080519115158252519081900360200190f35b610115600480360360808110156100f357600080fd5b508035906020810135906001600160a01b0360408201351690606001356102c9565b005b6101156004803603602081101561012d57600080fd5b50356001600160a01b03166102cf565b6101456102d2565b604080516001600160a01b039092168252519081900360200190f35b6101456004803603602081101561017757600080fd5b81019060208101813564010000000081111561019257600080fd5b8201836020820111156101a457600080fd5b803590602001918460018302840111640100000000831117156101c657600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506102e1945050505050565b6101156004803603606081101561021d57600080fd5b508035906001600160a01b0360208201351690604001356103bd565b6101156103c2565b61026d6004803603604081101561025757600080fd5b50803590602001356001600160a01b03166103c4565b60408051918252519081900360200190f35b60006102ae6040518060400160405280600c81526020016b27ab26afa83937b837b9b2b960a11b8152506102e1565b6001600160a01b0316826001600160a01b0316149050919050565b50505050565b50565b6000546001600160a01b031681565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b83811015610341578181015183820152602001610329565b50505050905090810190601f16801561036e5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561038b57600080fd5b505afa15801561039f573d6000803e3d6000fd5b505050506040513d60208110156103b557600080fd5b505192915050565b505050565b565b60009291505056fea164736f6c6343000706000a", + "solcInputHash": "5ee8e508e2c54cb5ac6783b4855b1558", + "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_who\",\"type\":\"address\"}],\"name\":\"claim\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"deposit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_preStateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"_publisher\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_timestamp\",\"type\":\"uint256\"}],\"name\":\"finalize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"finalizeWithdrawal\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"getGasSpent\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_who\",\"type\":\"address\"}],\"name\":\"isCollateralized\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_preStateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"_txHash\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"_who\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_gasSpent\",\"type\":\"uint256\"}],\"name\":\"recordGasSpent\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"startWithdrawal\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}}},\"title\":\"mockOVM_BondManager\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/mockOVM/verification/mockOVM_BondManager.sol\":\"mockOVM_BondManager\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor () internal {\\n address msgSender = _msgSender();\\n _owner = msgSender;\\n emit OwnershipTransferred(address(0), msgSender);\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n emit OwnershipTransferred(_owner, address(0));\\n _owner = address(0);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n emit OwnershipTransferred(_owner, newOwner);\\n _owner = newOwner;\\n }\\n}\\n\",\"keccak256\":\"0x15e2d5bd4c28a88548074c54d220e8086f638a71ed07e6b3ba5a70066fcf458d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with GSN meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address payable) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes memory) {\\n this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x8d3cb350f04ff49cfb10aef08d87f19dcbaecc8027b0bed12f3275cd12f38cf0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/iOVM/verification/iOVM_BondManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\ninterface ERC20 {\\n function transfer(address, uint256) external returns (bool);\\n function transferFrom(address, address, uint256) external returns (bool);\\n}\\n\\n/// All the errors which may be encountered on the bond manager\\nlibrary Errors {\\n string constant ERC20_ERR = \\\"BondManager: Could not post bond\\\";\\n string constant ALREADY_FINALIZED = \\\"BondManager: Fraud proof for this pre-state root has already been finalized\\\";\\n string constant SLASHED = \\\"BondManager: Cannot finalize withdrawal, you probably got slashed\\\";\\n string constant WRONG_STATE = \\\"BondManager: Wrong bond state for proposer\\\";\\n string constant CANNOT_CLAIM = \\\"BondManager: Cannot claim yet. Dispute must be finalized first\\\";\\n\\n string constant WITHDRAWAL_PENDING = \\\"BondManager: Withdrawal already pending\\\";\\n string constant TOO_EARLY = \\\"BondManager: Too early to finalize your withdrawal\\\";\\n\\n string constant ONLY_TRANSITIONER = \\\"BondManager: Only the transitioner for this pre-state root may call this function\\\";\\n string constant ONLY_FRAUD_VERIFIER = \\\"BondManager: Only the fraud verifier may call this function\\\";\\n string constant ONLY_STATE_COMMITMENT_CHAIN = \\\"BondManager: Only the state commitment chain may call this function\\\";\\n string constant WAIT_FOR_DISPUTES = \\\"BondManager: Wait for other potential disputes\\\";\\n}\\n\\n/**\\n * @title iOVM_BondManager\\n */\\ninterface iOVM_BondManager {\\n\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n /// The lifecycle of a proposer's bond\\n enum State {\\n // Before depositing or after getting slashed, a user is uncollateralized\\n NOT_COLLATERALIZED,\\n // After depositing, a user is collateralized\\n COLLATERALIZED,\\n // After a user has initiated a withdrawal\\n WITHDRAWING\\n }\\n\\n /// A bond posted by a proposer\\n struct Bond {\\n // The user's state\\n State state;\\n // The timestamp at which a proposer issued their withdrawal request\\n uint32 withdrawalTimestamp;\\n // The time when the first disputed was initiated for this bond\\n uint256 firstDisputeAt;\\n // The earliest observed state root for this bond which has had fraud\\n bytes32 earliestDisputedStateRoot;\\n // The state root's timestamp\\n uint256 earliestTimestamp;\\n }\\n\\n // Per pre-state root, store the number of state provisions that were made\\n // and how many of these calls were made by each user. Payouts will then be\\n // claimed by users proportionally for that dispute.\\n struct Rewards {\\n // Flag to check if rewards for a fraud proof are claimable\\n bool canClaim;\\n // Total number of `recordGasSpent` calls made\\n uint256 total;\\n // The gas spent by each user to provide witness data. The sum of all\\n // values inside this map MUST be equal to the value of `total`\\n mapping(address => uint256) gasSpent;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function recordGasSpent(\\n bytes32 _preStateRoot,\\n bytes32 _txHash,\\n address _who,\\n uint256 _gasSpent\\n ) external;\\n\\n function finalize(\\n bytes32 _preStateRoot,\\n address _publisher,\\n uint256 _timestamp\\n ) external;\\n\\n function deposit() external;\\n\\n function startWithdrawal() external;\\n\\n function finalizeWithdrawal() external;\\n\\n function claim(\\n address _who\\n ) external;\\n\\n function isCollateralized(\\n address _who\\n ) external view returns (bool);\\n\\n function getGasSpent(\\n bytes32 _preStateRoot,\\n address _who\\n ) external view returns (uint256);\\n}\\n\",\"keccak256\":\"0x3c2a8a399487857158649db1896749d86e39cba545a8aeb2e2bb0f3bdfa7a5b1\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string _name,\\n address _newAddress\\n );\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n public\\n onlyOwner\\n {\\n addresses[_getNameHash(_name)] = _address;\\n\\n emit AddressSet(\\n _name,\\n _address\\n );\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0x2ce671a0e004df88b136bea5a3c59d0732cea8887c8496da1d509e0200b03d7d\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(\\n address _libAddressManager\\n ) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x65981feeabff6a81783ea97d44baf988a18a86c8cb374c46fdb71819cbacc7c0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/mockOVM/verification/mockOVM_BondManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Interface Imports */\\nimport { iOVM_BondManager } from \\\"../../iOVM/verification/iOVM_BondManager.sol\\\";\\n\\n/* Contract Imports */\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/**\\n * @title mockOVM_BondManager\\n */\\ncontract mockOVM_BondManager is iOVM_BondManager, Lib_AddressResolver {\\n constructor(\\n address _libAddressManager\\n )\\n Lib_AddressResolver(_libAddressManager)\\n {}\\n\\n function recordGasSpent(\\n bytes32 _preStateRoot,\\n bytes32 _txHash,\\n address _who,\\n uint256 _gasSpent\\n )\\n override\\n public\\n {}\\n\\n function finalize(\\n bytes32 _preStateRoot,\\n address _publisher,\\n uint256 _timestamp\\n )\\n override\\n public\\n {}\\n\\n function deposit()\\n override\\n public\\n {}\\n\\n function startWithdrawal()\\n override\\n public\\n {}\\n\\n function finalizeWithdrawal()\\n override\\n public\\n {}\\n\\n function claim(\\n address _who\\n )\\n override\\n public\\n {}\\n\\n function isCollateralized(\\n address _who\\n )\\n override\\n public\\n view\\n returns (\\n bool\\n )\\n {\\n // Only authenticate sequencer to submit state root batches.\\n return _who == resolve(\\\"OVM_Proposer\\\");\\n }\\n\\n function getGasSpent(\\n bytes32, // _preStateRoot,\\n address // _who\\n )\\n override\\n public\\n pure\\n returns (\\n uint256\\n )\\n {\\n return 0;\\n }\\n}\\n\",\"keccak256\":\"0xe649b49573ba5babca407f116e97dc13f24bf677cbcd03824a2eb98a7750c4e8\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x608060405234801561001057600080fd5b506040516104673803806104678339818101604052602081101561003357600080fd5b5051600080546001600160a01b039092166001600160a01b0319909216919091179055610402806100656000396000f3fe608060405234801561001057600080fd5b506004361061009e5760003560e01c8063abfbbe1311610066578063abfbbe1314610207578063bc2f8dd814610239578063c5b6aa2f14610239578063d0e30db014610239578063dc6453dc146102415761009e565b806302ad4d2a146100a35780631e16e92f146100dd5780631e83409a14610117578063299ca4781461013d578063461a447814610161575b600080fd5b6100c9600480360360208110156100b957600080fd5b50356001600160a01b031661027f565b604080519115158252519081900360200190f35b610115600480360360808110156100f357600080fd5b508035906020810135906001600160a01b0360408201351690606001356102c9565b005b6101156004803603602081101561012d57600080fd5b50356001600160a01b03166102cf565b6101456102d2565b604080516001600160a01b039092168252519081900360200190f35b6101456004803603602081101561017757600080fd5b81019060208101813564010000000081111561019257600080fd5b8201836020820111156101a457600080fd5b803590602001918460018302840111640100000000831117156101c657600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506102e1945050505050565b6101156004803603606081101561021d57600080fd5b508035906001600160a01b0360208201351690604001356103bd565b6101156103c2565b61026d6004803603604081101561025757600080fd5b50803590602001356001600160a01b03166103c4565b60408051918252519081900360200190f35b60006102ae6040518060400160405280600c81526020016b27ab26afa83937b837b9b2b960a11b8152506102e1565b6001600160a01b0316826001600160a01b0316149050919050565b50505050565b50565b6000546001600160a01b031681565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b83811015610341578181015183820152602001610329565b50505050905090810190601f16801561036e5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561038b57600080fd5b505afa15801561039f573d6000803e3d6000fd5b505050506040513d60208110156103b557600080fd5b505192915050565b505050565b565b60009291505056fea264697066735822122023ce16ce6de3f7672940d40a33de4b777fbb7eaa3ec117bcace31640220db75d64736f6c63430007060033", + "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061009e5760003560e01c8063abfbbe1311610066578063abfbbe1314610207578063bc2f8dd814610239578063c5b6aa2f14610239578063d0e30db014610239578063dc6453dc146102415761009e565b806302ad4d2a146100a35780631e16e92f146100dd5780631e83409a14610117578063299ca4781461013d578063461a447814610161575b600080fd5b6100c9600480360360208110156100b957600080fd5b50356001600160a01b031661027f565b604080519115158252519081900360200190f35b610115600480360360808110156100f357600080fd5b508035906020810135906001600160a01b0360408201351690606001356102c9565b005b6101156004803603602081101561012d57600080fd5b50356001600160a01b03166102cf565b6101456102d2565b604080516001600160a01b039092168252519081900360200190f35b6101456004803603602081101561017757600080fd5b81019060208101813564010000000081111561019257600080fd5b8201836020820111156101a457600080fd5b803590602001918460018302840111640100000000831117156101c657600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506102e1945050505050565b6101156004803603606081101561021d57600080fd5b508035906001600160a01b0360208201351690604001356103bd565b6101156103c2565b61026d6004803603604081101561025757600080fd5b50803590602001356001600160a01b03166103c4565b60408051918252519081900360200190f35b60006102ae6040518060400160405280600c81526020016b27ab26afa83937b837b9b2b960a11b8152506102e1565b6001600160a01b0316826001600160a01b0316149050919050565b50505050565b50565b6000546001600160a01b031681565b6000805460405163bf40fac160e01b81526020600482018181528551602484015285516001600160a01b039094169363bf40fac19387938392604490920191908501908083838b5b83811015610341578181015183820152602001610329565b50505050905090810190601f16801561036e5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561038b57600080fd5b505afa15801561039f573d6000803e3d6000fd5b505050506040513d60208110156103b557600080fd5b505192915050565b505050565b565b60009291505056fea264697066735822122023ce16ce6de3f7672940d40a33de4b777fbb7eaa3ec117bcace31640220db75d64736f6c63430007060033", "devdoc": { "kind": "dev", - "methods": {}, + "methods": { + "resolve(string)": { + "params": { + "_name": "Name to resolve an address for." + }, + "returns": { + "_0": "Address associated with the given name." + } + } + }, "title": "mockOVM_BondManager", "version": 1 }, "userdoc": { "kind": "user", - "methods": {}, + "methods": { + "resolve(string)": { + "notice": "Resolves the address associated with a given name." + } + }, "version": 1 }, "storageLayout": { "storage": [ { - "astId": 12526, + "astId": 12800, "contract": "contracts/optimistic-ethereum/mockOVM/verification/mockOVM_BondManager.sol:mockOVM_BondManager", "label": "libAddressManager", "offset": 0, "slot": "0", - "type": "t_contract(Lib_AddressManager)12519" + "type": "t_contract(Lib_AddressManager)12793" } ], "types": { - "t_contract(Lib_AddressManager)12519": { + "t_contract(Lib_AddressManager)12793": { "encoding": "inplace", "label": "contract Lib_AddressManager", "numberOfBytes": "20" diff --git a/packages/contracts/deployments/kovan/solcInputs/03aed03b958b1d37f90bd88d0f56dd85.json b/packages/contracts/deployments/kovan/solcInputs/03aed03b958b1d37f90bd88d0f56dd85.json deleted file mode 100644 index 27d56451448ca..0000000000000 --- a/packages/contracts/deployments/kovan/solcInputs/03aed03b958b1d37f90bd88d0f56dd85.json +++ /dev/null @@ -1,312 +0,0 @@ -{ - "language": "Solidity", - "sources": { - "contracts/optimistic-ethereum/iOVM/accounts/iOVM_ECDSAContractAccount.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/**\n * @title iOVM_ECDSAContractAccount\n */\ninterface iOVM_ECDSAContractAccount {\n\n /********************\n * Public Functions *\n ********************/\n\n function execute(\n bytes memory _transaction,\n Lib_OVMCodec.EOASignatureType _signatureType,\n uint8 _v,\n bytes32 _r,\n bytes32 _s\n ) external returns (bool _success, bytes memory _returndata);\n}\n" - }, - "contracts/optimistic-ethereum/libraries/codec/Lib_OVMCodec.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_RLPReader } from \"../rlp/Lib_RLPReader.sol\";\nimport { Lib_RLPWriter } from \"../rlp/Lib_RLPWriter.sol\";\nimport { Lib_BytesUtils } from \"../utils/Lib_BytesUtils.sol\";\nimport { Lib_Bytes32Utils } from \"../utils/Lib_Bytes32Utils.sol\";\nimport { Lib_SafeExecutionManagerWrapper } from \"../../libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\";\n\n/**\n * @title Lib_OVMCodec\n */\nlibrary Lib_OVMCodec {\n\n /*********\n * Enums *\n *********/\n\n enum EOASignatureType {\n EIP155_TRANSACTION,\n ETH_SIGNED_MESSAGE\n }\n\n enum QueueOrigin {\n SEQUENCER_QUEUE,\n L1TOL2_QUEUE\n }\n\n\n /***********\n * Structs *\n ***********/\n\n struct Account {\n uint256 nonce;\n uint256 balance;\n bytes32 storageRoot;\n bytes32 codeHash;\n address ethAddress;\n bool isFresh;\n }\n\n struct EVMAccount {\n uint256 nonce;\n uint256 balance;\n bytes32 storageRoot;\n bytes32 codeHash;\n }\n\n struct ChainBatchHeader {\n uint256 batchIndex;\n bytes32 batchRoot;\n uint256 batchSize;\n uint256 prevTotalElements;\n bytes extraData;\n }\n\n struct ChainInclusionProof {\n uint256 index;\n bytes32[] siblings;\n }\n\n struct Transaction {\n uint256 timestamp;\n uint256 blockNumber;\n QueueOrigin l1QueueOrigin;\n address l1TxOrigin;\n address entrypoint;\n uint256 gasLimit;\n bytes data;\n }\n\n struct TransactionChainElement {\n bool isSequenced;\n uint256 queueIndex; // QUEUED TX ONLY\n uint256 timestamp; // SEQUENCER TX ONLY\n uint256 blockNumber; // SEQUENCER TX ONLY\n bytes txData; // SEQUENCER TX ONLY\n }\n\n struct QueueElement {\n bytes32 transactionHash;\n uint40 timestamp;\n uint40 blockNumber;\n }\n\n struct EIP155Transaction {\n uint256 nonce;\n uint256 gasPrice;\n uint256 gasLimit;\n address to;\n uint256 value;\n bytes data;\n uint256 chainId;\n }\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Decodes an EOA transaction (i.e., native Ethereum RLP encoding).\n * @param _transaction Encoded EOA transaction.\n * @return Transaction decoded into a struct.\n */\n function decodeEIP155Transaction(\n bytes memory _transaction,\n bool _isEthSignedMessage\n )\n internal\n pure\n returns (\n EIP155Transaction memory\n )\n {\n if (_isEthSignedMessage) {\n (\n uint256 _nonce,\n uint256 _gasLimit,\n uint256 _gasPrice,\n uint256 _chainId,\n address _to,\n bytes memory _data\n ) = abi.decode(\n _transaction,\n (uint256, uint256, uint256, uint256, address ,bytes)\n );\n return EIP155Transaction({\n nonce: _nonce,\n gasPrice: _gasPrice,\n gasLimit: _gasLimit,\n to: _to,\n value: 0,\n data: _data,\n chainId: _chainId\n });\n } else {\n Lib_RLPReader.RLPItem[] memory decoded = Lib_RLPReader.readList(_transaction);\n\n return EIP155Transaction({\n nonce: Lib_RLPReader.readUint256(decoded[0]),\n gasPrice: Lib_RLPReader.readUint256(decoded[1]),\n gasLimit: Lib_RLPReader.readUint256(decoded[2]),\n to: Lib_RLPReader.readAddress(decoded[3]),\n value: Lib_RLPReader.readUint256(decoded[4]),\n data: Lib_RLPReader.readBytes(decoded[5]),\n chainId: Lib_RLPReader.readUint256(decoded[6])\n });\n }\n }\n\n /**\n * Decompresses a compressed EIP155 transaction.\n * @param _transaction Compressed EIP155 transaction bytes.\n * @return Transaction parsed into a struct.\n */\n function decompressEIP155Transaction(\n bytes memory _transaction\n )\n internal\n returns (\n EIP155Transaction memory\n )\n {\n return EIP155Transaction({\n gasLimit: Lib_BytesUtils.toUint24(_transaction, 0),\n gasPrice: uint256(Lib_BytesUtils.toUint24(_transaction, 3)) * 1000000,\n nonce: Lib_BytesUtils.toUint24(_transaction, 6),\n to: Lib_BytesUtils.toAddress(_transaction, 9),\n data: Lib_BytesUtils.slice(_transaction, 29),\n chainId: Lib_SafeExecutionManagerWrapper.safeCHAINID(),\n value: 0\n });\n }\n\n /**\n * Encodes an EOA transaction back into the original transaction.\n * @param _transaction EIP155transaction to encode.\n * @param _isEthSignedMessage Whether or not this was an eth signed message.\n * @return Encoded transaction.\n */\n function encodeEIP155Transaction(\n EIP155Transaction memory _transaction,\n bool _isEthSignedMessage\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n if (_isEthSignedMessage) {\n return abi.encode(\n _transaction.nonce,\n _transaction.gasLimit,\n _transaction.gasPrice,\n _transaction.chainId,\n _transaction.to,\n _transaction.data\n );\n } else {\n bytes[] memory raw = new bytes[](9);\n\n raw[0] = Lib_RLPWriter.writeUint(_transaction.nonce);\n raw[1] = Lib_RLPWriter.writeUint(_transaction.gasPrice);\n raw[2] = Lib_RLPWriter.writeUint(_transaction.gasLimit);\n if (_transaction.to == address(0)) {\n raw[3] = Lib_RLPWriter.writeBytes('');\n } else {\n raw[3] = Lib_RLPWriter.writeAddress(_transaction.to);\n }\n raw[4] = Lib_RLPWriter.writeUint(0);\n raw[5] = Lib_RLPWriter.writeBytes(_transaction.data);\n raw[6] = Lib_RLPWriter.writeUint(_transaction.chainId);\n raw[7] = Lib_RLPWriter.writeBytes(bytes(''));\n raw[8] = Lib_RLPWriter.writeBytes(bytes(''));\n\n return Lib_RLPWriter.writeList(raw);\n }\n }\n\n /**\n * Encodes a standard OVM transaction.\n * @param _transaction OVM transaction to encode.\n * @return Encoded transaction bytes.\n */\n function encodeTransaction(\n Transaction memory _transaction\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n return abi.encodePacked(\n _transaction.timestamp,\n _transaction.blockNumber,\n _transaction.l1QueueOrigin,\n _transaction.l1TxOrigin,\n _transaction.entrypoint,\n _transaction.gasLimit,\n _transaction.data\n );\n }\n\n /**\n * Hashes a standard OVM transaction.\n * @param _transaction OVM transaction to encode.\n * @return Hashed transaction\n */\n function hashTransaction(\n Transaction memory _transaction\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n return keccak256(encodeTransaction(_transaction));\n }\n\n /**\n * Converts an OVM account to an EVM account.\n * @param _in OVM account to convert.\n * @return Converted EVM account.\n */\n function toEVMAccount(\n Account memory _in\n )\n internal\n pure\n returns (\n EVMAccount memory\n )\n {\n return EVMAccount({\n nonce: _in.nonce,\n balance: _in.balance,\n storageRoot: _in.storageRoot,\n codeHash: _in.codeHash\n });\n }\n\n /**\n * @notice RLP-encodes an account state struct.\n * @param _account Account state struct.\n * @return RLP-encoded account state.\n */\n function encodeEVMAccount(\n EVMAccount memory _account\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n bytes[] memory raw = new bytes[](4);\n\n // Unfortunately we can't create this array outright because\n // Lib_RLPWriter.writeList will reject fixed-size arrays. Assigning\n // index-by-index circumvents this issue.\n raw[0] = Lib_RLPWriter.writeBytes(\n Lib_Bytes32Utils.removeLeadingZeros(\n bytes32(_account.nonce)\n )\n );\n raw[1] = Lib_RLPWriter.writeBytes(\n Lib_Bytes32Utils.removeLeadingZeros(\n bytes32(_account.balance)\n )\n );\n raw[2] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.storageRoot));\n raw[3] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.codeHash));\n\n return Lib_RLPWriter.writeList(raw);\n }\n\n /**\n * @notice Decodes an RLP-encoded account state into a useful struct.\n * @param _encoded RLP-encoded account state.\n * @return Account state struct.\n */\n function decodeEVMAccount(\n bytes memory _encoded\n )\n internal\n pure\n returns (\n EVMAccount memory\n )\n {\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\n\n return EVMAccount({\n nonce: Lib_RLPReader.readUint256(accountState[0]),\n balance: Lib_RLPReader.readUint256(accountState[1]),\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\n });\n }\n\n /**\n * Calculates a hash for a given batch header.\n * @param _batchHeader Header to hash.\n * @return Hash of the header.\n */\n function hashBatchHeader(\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n return keccak256(\n abi.encode(\n _batchHeader.batchRoot,\n _batchHeader.batchSize,\n _batchHeader.prevTotalElements,\n _batchHeader.extraData\n )\n );\n }\n}\n" - }, - "contracts/optimistic-ethereum/libraries/rlp/Lib_RLPReader.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/**\n * @title Lib_RLPReader\n * @dev Adapted from \"RLPReader\" by Hamdi Allam (hamdi.allam97@gmail.com).\n */\nlibrary Lib_RLPReader {\n\n /*************\n * Constants *\n *************/\n\n uint256 constant internal MAX_LIST_LENGTH = 32;\n\n\n /*********\n * Enums *\n *********/\n\n enum RLPItemType {\n DATA_ITEM,\n LIST_ITEM\n }\n\n \n /***********\n * Structs *\n ***********/\n\n struct RLPItem {\n uint256 length;\n uint256 ptr;\n }\n \n\n /**********************\n * Internal Functions *\n **********************/\n \n /**\n * Converts bytes to a reference to memory position and length.\n * @param _in Input bytes to convert.\n * @return Output memory reference.\n */\n function toRLPItem(\n bytes memory _in\n )\n internal\n pure\n returns (\n RLPItem memory\n )\n {\n uint256 ptr;\n assembly {\n ptr := add(_in, 32)\n }\n\n return RLPItem({\n length: _in.length,\n ptr: ptr\n });\n }\n\n /**\n * Reads an RLP list value into a list of RLP items.\n * @param _in RLP list value.\n * @return Decoded RLP list items.\n */\n function readList(\n RLPItem memory _in\n )\n internal\n pure\n returns (\n RLPItem[] memory\n )\n {\n (\n uint256 listOffset,\n ,\n RLPItemType itemType\n ) = _decodeLength(_in);\n\n require(\n itemType == RLPItemType.LIST_ITEM,\n \"Invalid RLP list value.\"\n );\n\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\n // writing to the length. Since we can't know the number of RLP items without looping over\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\n // simply set a reasonable maximum list length and decrease the size before we finish.\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\n\n uint256 itemCount = 0;\n uint256 offset = listOffset;\n while (offset < _in.length) {\n require(\n itemCount < MAX_LIST_LENGTH,\n \"Provided RLP list exceeds max list length.\"\n );\n\n (\n uint256 itemOffset,\n uint256 itemLength,\n ) = _decodeLength(RLPItem({\n length: _in.length - offset,\n ptr: _in.ptr + offset\n }));\n\n out[itemCount] = RLPItem({\n length: itemLength + itemOffset,\n ptr: _in.ptr + offset\n });\n\n itemCount += 1;\n offset += itemOffset + itemLength;\n }\n\n // Decrease the array size to match the actual item count.\n assembly {\n mstore(out, itemCount)\n }\n\n return out;\n }\n\n /**\n * Reads an RLP list value into a list of RLP items.\n * @param _in RLP list value.\n * @return Decoded RLP list items.\n */\n function readList(\n bytes memory _in\n )\n internal\n pure\n returns (\n RLPItem[] memory\n )\n {\n return readList(\n toRLPItem(_in)\n );\n }\n\n /**\n * Reads an RLP bytes value into bytes.\n * @param _in RLP bytes value.\n * @return Decoded bytes.\n */\n function readBytes(\n RLPItem memory _in\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n (\n uint256 itemOffset,\n uint256 itemLength,\n RLPItemType itemType\n ) = _decodeLength(_in);\n\n require(\n itemType == RLPItemType.DATA_ITEM,\n \"Invalid RLP bytes value.\"\n );\n\n return _copy(_in.ptr, itemOffset, itemLength);\n }\n\n /**\n * Reads an RLP bytes value into bytes.\n * @param _in RLP bytes value.\n * @return Decoded bytes.\n */\n function readBytes(\n bytes memory _in\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n return readBytes(\n toRLPItem(_in)\n );\n }\n\n /**\n * Reads an RLP string value into a string.\n * @param _in RLP string value.\n * @return Decoded string.\n */\n function readString(\n RLPItem memory _in\n )\n internal\n pure\n returns (\n string memory\n )\n {\n return string(readBytes(_in));\n }\n\n /**\n * Reads an RLP string value into a string.\n * @param _in RLP string value.\n * @return Decoded string.\n */\n function readString(\n bytes memory _in\n )\n internal\n pure\n returns (\n string memory\n )\n {\n return readString(\n toRLPItem(_in)\n );\n }\n\n /**\n * Reads an RLP bytes32 value into a bytes32.\n * @param _in RLP bytes32 value.\n * @return Decoded bytes32.\n */\n function readBytes32(\n RLPItem memory _in\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n require(\n _in.length <= 33,\n \"Invalid RLP bytes32 value.\"\n );\n\n (\n uint256 itemOffset,\n uint256 itemLength,\n RLPItemType itemType\n ) = _decodeLength(_in);\n\n require(\n itemType == RLPItemType.DATA_ITEM,\n \"Invalid RLP bytes32 value.\"\n );\n\n uint256 ptr = _in.ptr + itemOffset;\n bytes32 out;\n assembly {\n out := mload(ptr)\n\n // Shift the bytes over to match the item size.\n if lt(itemLength, 32) {\n out := div(out, exp(256, sub(32, itemLength)))\n }\n }\n\n return out;\n }\n\n /**\n * Reads an RLP bytes32 value into a bytes32.\n * @param _in RLP bytes32 value.\n * @return Decoded bytes32.\n */\n function readBytes32(\n bytes memory _in\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n return readBytes32(\n toRLPItem(_in)\n );\n }\n\n /**\n * Reads an RLP uint256 value into a uint256.\n * @param _in RLP uint256 value.\n * @return Decoded uint256.\n */\n function readUint256(\n RLPItem memory _in\n )\n internal\n pure\n returns (\n uint256\n )\n {\n return uint256(readBytes32(_in));\n }\n\n /**\n * Reads an RLP uint256 value into a uint256.\n * @param _in RLP uint256 value.\n * @return Decoded uint256.\n */\n function readUint256(\n bytes memory _in\n )\n internal\n pure\n returns (\n uint256\n )\n {\n return readUint256(\n toRLPItem(_in)\n );\n }\n\n /**\n * Reads an RLP bool value into a bool.\n * @param _in RLP bool value.\n * @return Decoded bool.\n */\n function readBool(\n RLPItem memory _in\n )\n internal\n pure\n returns (\n bool\n )\n {\n require(\n _in.length == 1,\n \"Invalid RLP boolean value.\"\n );\n\n uint256 ptr = _in.ptr;\n uint256 out;\n assembly {\n out := byte(0, mload(ptr))\n }\n\n require(\n out == 0 || out == 1,\n \"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\"\n );\n\n return out != 0;\n }\n\n /**\n * Reads an RLP bool value into a bool.\n * @param _in RLP bool value.\n * @return Decoded bool.\n */\n function readBool(\n bytes memory _in\n )\n internal\n pure\n returns (\n bool\n )\n {\n return readBool(\n toRLPItem(_in)\n );\n }\n\n /**\n * Reads an RLP address value into a address.\n * @param _in RLP address value.\n * @return Decoded address.\n */\n function readAddress(\n RLPItem memory _in\n )\n internal\n pure\n returns (\n address\n )\n {\n if (_in.length == 1) {\n return address(0);\n }\n\n require(\n _in.length == 21,\n \"Invalid RLP address value.\"\n );\n\n return address(readUint256(_in));\n }\n\n /**\n * Reads an RLP address value into a address.\n * @param _in RLP address value.\n * @return Decoded address.\n */\n function readAddress(\n bytes memory _in\n )\n internal\n pure\n returns (\n address\n )\n {\n return readAddress(\n toRLPItem(_in)\n );\n }\n\n /**\n * Reads the raw bytes of an RLP item.\n * @param _in RLP item to read.\n * @return Raw RLP bytes.\n */\n function readRawBytes(\n RLPItem memory _in\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n return _copy(_in);\n }\n\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * Decodes the length of an RLP item.\n * @param _in RLP item to decode.\n * @return Offset of the encoded data.\n * @return Length of the encoded data.\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\n */\n function _decodeLength(\n RLPItem memory _in\n )\n private\n pure\n returns (\n uint256,\n uint256,\n RLPItemType\n )\n {\n require(\n _in.length > 0,\n \"RLP item cannot be null.\"\n );\n\n uint256 ptr = _in.ptr;\n uint256 prefix;\n assembly {\n prefix := byte(0, mload(ptr))\n }\n\n if (prefix <= 0x7f) {\n // Single byte.\n\n return (0, 1, RLPItemType.DATA_ITEM);\n } else if (prefix <= 0xb7) {\n // Short string.\n\n uint256 strLen = prefix - 0x80;\n \n require(\n _in.length > strLen,\n \"Invalid RLP short string.\"\n );\n\n return (1, strLen, RLPItemType.DATA_ITEM);\n } else if (prefix <= 0xbf) {\n // Long string.\n uint256 lenOfStrLen = prefix - 0xb7;\n\n require(\n _in.length > lenOfStrLen,\n \"Invalid RLP long string length.\"\n );\n\n uint256 strLen;\n assembly {\n // Pick out the string length.\n strLen := div(\n mload(add(ptr, 1)),\n exp(256, sub(32, lenOfStrLen))\n )\n }\n\n require(\n _in.length > lenOfStrLen + strLen,\n \"Invalid RLP long string.\"\n );\n\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\n } else if (prefix <= 0xf7) {\n // Short list.\n uint256 listLen = prefix - 0xc0;\n\n require(\n _in.length > listLen,\n \"Invalid RLP short list.\"\n );\n\n return (1, listLen, RLPItemType.LIST_ITEM);\n } else {\n // Long list.\n uint256 lenOfListLen = prefix - 0xf7;\n\n require(\n _in.length > lenOfListLen,\n \"Invalid RLP long list length.\"\n );\n\n uint256 listLen;\n assembly {\n // Pick out the list length.\n listLen := div(\n mload(add(ptr, 1)),\n exp(256, sub(32, lenOfListLen))\n )\n }\n\n require(\n _in.length > lenOfListLen + listLen,\n \"Invalid RLP long list.\"\n );\n\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\n }\n }\n\n /**\n * Copies the bytes from a memory location.\n * @param _src Pointer to the location to read from.\n * @param _offset Offset to start reading from.\n * @param _length Number of bytes to read.\n * @return Copied bytes.\n */\n function _copy(\n uint256 _src,\n uint256 _offset,\n uint256 _length\n )\n private\n pure\n returns (\n bytes memory\n )\n {\n bytes memory out = new bytes(_length);\n if (out.length == 0) {\n return out;\n }\n\n uint256 src = _src + _offset;\n uint256 dest;\n assembly {\n dest := add(out, 32)\n }\n\n // Copy over as many complete words as we can.\n for (uint256 i = 0; i < _length / 32; i++) {\n assembly {\n mstore(dest, mload(src))\n }\n\n src += 32;\n dest += 32;\n }\n\n // Pick out the remaining bytes.\n uint256 mask = 256 ** (32 - (_length % 32)) - 1;\n assembly {\n mstore(\n dest,\n or(\n and(mload(src), not(mask)),\n and(mload(dest), mask)\n )\n )\n }\n\n return out;\n }\n\n /**\n * Copies an RLP item into bytes.\n * @param _in RLP item to copy.\n * @return Copied bytes.\n */\n function _copy(\n RLPItem memory _in\n )\n private\n pure\n returns (\n bytes memory\n )\n {\n return _copy(_in.ptr, 0, _in.length);\n }\n}\n" - }, - "contracts/optimistic-ethereum/libraries/rlp/Lib_RLPWriter.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_BytesUtils } from \"../utils/Lib_BytesUtils.sol\";\n\n/**\n * @title Lib_RLPWriter\n * @author Bakaoh (with modifications)\n */\nlibrary Lib_RLPWriter {\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * RLP encodes a byte string.\n * @param _in The byte string to encode.\n * @return _out The RLP encoded string in bytes.\n */\n function writeBytes(\n bytes memory _in\n )\n internal\n pure\n returns (\n bytes memory _out\n )\n {\n bytes memory encoded;\n\n if (_in.length == 1 && uint8(_in[0]) < 128) {\n encoded = _in;\n } else {\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\n }\n\n return encoded;\n }\n\n /**\n * RLP encodes a list of RLP encoded byte byte strings.\n * @param _in The list of RLP encoded byte strings.\n * @return _out The RLP encoded list of items in bytes.\n */\n function writeList(\n bytes[] memory _in\n )\n internal\n pure\n returns (\n bytes memory _out\n )\n {\n bytes memory list = _flatten(_in);\n return abi.encodePacked(_writeLength(list.length, 192), list);\n }\n\n /**\n * RLP encodes a string.\n * @param _in The string to encode.\n * @return _out The RLP encoded string in bytes.\n */\n function writeString(\n string memory _in\n )\n internal\n pure\n returns (\n bytes memory _out\n )\n {\n return writeBytes(bytes(_in));\n }\n\n /**\n * RLP encodes an address.\n * @param _in The address to encode.\n * @return _out The RLP encoded address in bytes.\n */\n function writeAddress(\n address _in\n )\n internal\n pure\n returns (\n bytes memory _out\n )\n {\n return writeBytes(abi.encodePacked(_in));\n }\n\n /**\n * RLP encodes a uint.\n * @param _in The uint256 to encode.\n * @return _out The RLP encoded uint256 in bytes.\n */\n function writeUint(\n uint256 _in\n )\n internal\n pure\n returns (\n bytes memory _out\n )\n {\n return writeBytes(_toBinary(_in));\n }\n\n /**\n * RLP encodes a bool.\n * @param _in The bool to encode.\n * @return _out The RLP encoded bool in bytes.\n */\n function writeBool(\n bool _in\n )\n internal\n pure\n returns (\n bytes memory _out\n )\n {\n bytes memory encoded = new bytes(1);\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\n return encoded;\n }\n\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\n * @param _len The length of the string or the payload.\n * @param _offset 128 if item is string, 192 if item is list.\n * @return _encoded RLP encoded bytes.\n */\n function _writeLength(\n uint256 _len,\n uint256 _offset\n )\n private\n pure\n returns (\n bytes memory _encoded\n )\n {\n bytes memory encoded;\n\n if (_len < 56) {\n encoded = new bytes(1);\n encoded[0] = byte(uint8(_len) + uint8(_offset));\n } else {\n uint256 lenLen;\n uint256 i = 1;\n while (_len / i != 0) {\n lenLen++;\n i *= 256;\n }\n\n encoded = new bytes(lenLen + 1);\n encoded[0] = byte(uint8(lenLen) + uint8(_offset) + 55);\n for(i = 1; i <= lenLen; i++) {\n encoded[i] = byte(uint8((_len / (256**(lenLen-i))) % 256));\n }\n }\n\n return encoded;\n }\n\n /**\n * Encode integer in big endian binary form with no leading zeroes.\n * @notice TODO: This should be optimized with assembly to save gas costs.\n * @param _x The integer to encode.\n * @return _binary RLP encoded bytes.\n */\n function _toBinary(\n uint256 _x\n )\n private\n pure\n returns (\n bytes memory _binary\n )\n {\n bytes memory b = abi.encodePacked(_x);\n\n uint256 i = 0;\n for (; i < 32; i++) {\n if (b[i] != 0) {\n break;\n }\n }\n\n bytes memory res = new bytes(32 - i);\n for (uint256 j = 0; j < res.length; j++) {\n res[j] = b[i++];\n }\n\n return res;\n }\n\n /**\n * Copies a piece of memory to another location.\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\n * @param _dest Destination location.\n * @param _src Source location.\n * @param _len Length of memory to copy.\n */\n function _memcpy(\n uint256 _dest,\n uint256 _src,\n uint256 _len\n )\n private\n pure\n {\n uint256 dest = _dest;\n uint256 src = _src;\n uint256 len = _len;\n\n for(; len >= 32; len -= 32) {\n assembly {\n mstore(dest, mload(src))\n }\n dest += 32;\n src += 32;\n }\n\n uint256 mask = 256 ** (32 - len) - 1;\n assembly {\n let srcpart := and(mload(src), not(mask))\n let destpart := and(mload(dest), mask)\n mstore(dest, or(destpart, srcpart))\n }\n }\n\n /**\n * Flattens a list of byte strings into one byte string.\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\n * @param _list List of byte strings to flatten.\n * @return _flattened The flattened byte string.\n */\n function _flatten(\n bytes[] memory _list\n )\n private\n pure\n returns (\n bytes memory _flattened\n )\n {\n if (_list.length == 0) {\n return new bytes(0);\n }\n\n uint256 len;\n uint256 i = 0;\n for (; i < _list.length; i++) {\n len += _list[i].length;\n }\n\n bytes memory flattened = new bytes(len);\n uint256 flattenedPtr;\n assembly { flattenedPtr := add(flattened, 0x20) }\n\n for(i = 0; i < _list.length; i++) {\n bytes memory item = _list[i];\n\n uint256 listPtr;\n assembly { listPtr := add(item, 0x20)}\n\n _memcpy(flattenedPtr, listPtr, item.length);\n flattenedPtr += _list[i].length;\n }\n\n return flattened;\n }\n}" - }, - "contracts/optimistic-ethereum/libraries/utils/Lib_BytesUtils.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/**\n * @title Lib_BytesUtils\n */\nlibrary Lib_BytesUtils {\n\n /**********************\n * Internal Functions *\n **********************/\n\n function slice(\n bytes memory _bytes,\n uint256 _start,\n uint256 _length\n )\n internal\n pure\n returns (bytes memory)\n {\n require(_length + 31 >= _length, \"slice_overflow\");\n require(_start + _length >= _start, \"slice_overflow\");\n require(_bytes.length >= _start + _length, \"slice_outOfBounds\");\n\n bytes memory tempBytes;\n\n assembly {\n switch iszero(_length)\n case 0 {\n // Get a location of some free memory and store it in tempBytes as\n // Solidity does for memory variables.\n tempBytes := mload(0x40)\n\n // The first word of the slice result is potentially a partial\n // word read from the original array. To read it, we calculate\n // the length of that partial word and start copying that many\n // bytes into the array. The first word we copy will start with\n // data we don't care about, but the last `lengthmod` bytes will\n // land at the beginning of the contents of the new array. When\n // we're done copying, we overwrite the full first word with\n // the actual length of the slice.\n let lengthmod := and(_length, 31)\n\n // The multiplication in the next line is necessary\n // because when slicing multiples of 32 bytes (lengthmod == 0)\n // the following copy loop was copying the origin's length\n // and then ending prematurely not copying everything it should.\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\n let end := add(mc, _length)\n\n for {\n // The multiplication in the next line has the same exact purpose\n // as the one above.\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\n } lt(mc, end) {\n mc := add(mc, 0x20)\n cc := add(cc, 0x20)\n } {\n mstore(mc, mload(cc))\n }\n\n mstore(tempBytes, _length)\n\n //update free-memory pointer\n //allocating the array padded to 32 bytes like the compiler does now\n mstore(0x40, and(add(mc, 31), not(31)))\n }\n //if we want a zero-length slice let's just return a zero-length array\n default {\n tempBytes := mload(0x40)\n\n //zero out the 32 bytes slice we are about to return\n //we need to do it because Solidity does not garbage collect\n mstore(tempBytes, 0)\n\n mstore(0x40, add(tempBytes, 0x20))\n }\n }\n\n return tempBytes;\n }\n\n function slice(\n bytes memory _bytes,\n uint256 _start\n )\n internal\n pure\n returns (bytes memory)\n {\n if (_bytes.length - _start == 0) {\n return bytes('');\n }\n\n return slice(_bytes, _start, _bytes.length - _start);\n }\n\n function toBytes32PadLeft(\n bytes memory _bytes\n )\n internal\n pure\n returns (bytes32)\n {\n bytes32 ret;\n uint256 len = _bytes.length <= 32 ? _bytes.length : 32;\n assembly {\n ret := shr(mul(sub(32, len), 8), mload(add(_bytes, 32)))\n }\n return ret;\n }\n\n function toBytes32(\n bytes memory _bytes\n )\n internal\n pure\n returns (bytes32)\n {\n if (_bytes.length < 32) {\n bytes32 ret;\n assembly {\n ret := mload(add(_bytes, 32))\n }\n return ret;\n }\n\n return abi.decode(_bytes,(bytes32)); // will truncate if input length > 32 bytes\n }\n\n function toUint256(\n bytes memory _bytes\n )\n internal\n pure\n returns (uint256)\n {\n return uint256(toBytes32(_bytes));\n }\n\n function toUint24(bytes memory _bytes, uint256 _start) internal pure returns (uint24) {\n require(_start + 3 >= _start, \"toUint24_overflow\");\n require(_bytes.length >= _start + 3 , \"toUint24_outOfBounds\");\n uint24 tempUint;\n\n assembly {\n tempUint := mload(add(add(_bytes, 0x3), _start))\n }\n\n return tempUint;\n }\n\n function toUint8(bytes memory _bytes, uint256 _start) internal pure returns (uint8) {\n require(_start + 1 >= _start, \"toUint8_overflow\");\n require(_bytes.length >= _start + 1 , \"toUint8_outOfBounds\");\n uint8 tempUint;\n\n assembly {\n tempUint := mload(add(add(_bytes, 0x1), _start))\n }\n\n return tempUint;\n }\n\n function toAddress(bytes memory _bytes, uint256 _start) internal pure returns (address) {\n require(_start + 20 >= _start, \"toAddress_overflow\");\n require(_bytes.length >= _start + 20, \"toAddress_outOfBounds\");\n address tempAddress;\n\n assembly {\n tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000)\n }\n\n return tempAddress;\n }\n\n function toNibbles(\n bytes memory _bytes\n )\n internal\n pure\n returns (bytes memory)\n {\n bytes memory nibbles = new bytes(_bytes.length * 2);\n\n for (uint256 i = 0; i < _bytes.length; i++) {\n nibbles[i * 2] = _bytes[i] >> 4;\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\n }\n\n return nibbles;\n }\n\n function fromNibbles(\n bytes memory _bytes\n )\n internal\n pure\n returns (bytes memory)\n {\n bytes memory ret = new bytes(_bytes.length / 2);\n\n for (uint256 i = 0; i < ret.length; i++) {\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\n }\n\n return ret;\n }\n\n function equal(\n bytes memory _bytes,\n bytes memory _other\n )\n internal\n pure\n returns (bool)\n {\n return keccak256(_bytes) == keccak256(_other);\n }\n}\n" - }, - "contracts/optimistic-ethereum/libraries/utils/Lib_Bytes32Utils.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/**\n * @title Lib_Byte32Utils\n */\nlibrary Lib_Bytes32Utils {\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \"true.\"\n * @param _in Input bytes32 value.\n * @return Bytes32 as a boolean.\n */\n function toBool(\n bytes32 _in\n )\n internal\n pure\n returns (\n bool\n )\n {\n return _in != 0;\n }\n\n /**\n * Converts a boolean to a bytes32 value.\n * @param _in Input boolean value.\n * @return Boolean as a bytes32.\n */\n function fromBool(\n bool _in\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n return bytes32(uint256(_in ? 1 : 0));\n }\n\n /**\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\n * @param _in Input bytes32 value.\n * @return Bytes32 as an address.\n */\n function toAddress(\n bytes32 _in\n )\n internal\n pure\n returns (\n address\n )\n {\n return address(uint160(uint256(_in)));\n }\n\n /**\n * Converts an address to a bytes32.\n * @param _in Input address value.\n * @return Address as a bytes32.\n */\n function fromAddress(\n address _in\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n return bytes32(uint256(_in));\n }\n\n /**\n * Removes the leading zeros from a bytes32 value and returns a new (smaller) bytes value.\n * @param _in Input bytes32 value.\n * @return Bytes32 without any leading zeros.\n */\n function removeLeadingZeros(\n bytes32 _in\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n bytes memory out;\n\n assembly {\n // Figure out how many leading zero bytes to remove.\n let shift := 0\n for { let i := 0 } and(lt(i, 32), eq(byte(i, _in), 0)) { i := add(i, 1) } {\n shift := add(shift, 1)\n }\n\n // Reserve some space for our output and fix the free memory pointer.\n out := mload(0x40)\n mstore(0x40, add(out, 0x40))\n\n // Shift the value and store it into the output bytes.\n mstore(add(out, 0x20), shl(mul(shift, 8), _in))\n\n // Store the new size (with leading zero bytes removed) in the output byte size.\n mstore(out, sub(32, shift))\n }\n\n return out;\n }\n}\n" - }, - "contracts/optimistic-ethereum/libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Library Imports */\nimport { Lib_ErrorUtils } from \"../utils/Lib_ErrorUtils.sol\";\n\n/**\n * @title Lib_SafeExecutionManagerWrapper\n * @dev The Safe Execution Manager Wrapper provides functions which facilitate writing OVM safe \n * code using the standard solidity compiler, by routing all its operations through the Execution \n * Manager.\n * \n * Compiler used: solc\n * Runtime target: OVM\n */\nlibrary Lib_SafeExecutionManagerWrapper {\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Performs a safe ovmCALL.\n * @param _gasLimit Gas limit for the call.\n * @param _target Address to call.\n * @param _calldata Data to send to the call.\n * @return _success Whether or not the call reverted.\n * @return _returndata Data returned by the call.\n */\n function safeCALL(\n uint256 _gasLimit,\n address _target,\n bytes memory _calldata\n )\n internal\n returns (\n bool _success,\n bytes memory _returndata\n )\n {\n bytes memory returndata = _safeExecutionManagerInteraction(\n abi.encodeWithSignature(\n \"ovmCALL(uint256,address,bytes)\",\n _gasLimit,\n _target,\n _calldata\n )\n );\n\n return abi.decode(returndata, (bool, bytes));\n }\n\n /**\n * Performs a safe ovmDELEGATECALL.\n * @param _gasLimit Gas limit for the call.\n * @param _target Address to call.\n * @param _calldata Data to send to the call.\n * @return _success Whether or not the call reverted.\n * @return _returndata Data returned by the call.\n */\n function safeDELEGATECALL(\n uint256 _gasLimit,\n address _target,\n bytes memory _calldata\n )\n internal\n returns (\n bool _success,\n bytes memory _returndata\n )\n {\n bytes memory returndata = _safeExecutionManagerInteraction(\n abi.encodeWithSignature(\n \"ovmDELEGATECALL(uint256,address,bytes)\",\n _gasLimit,\n _target,\n _calldata\n )\n );\n\n return abi.decode(returndata, (bool, bytes));\n }\n\n /**\n * Performs a safe ovmCREATE call.\n * @param _gasLimit Gas limit for the creation.\n * @param _bytecode Code for the new contract.\n * @return _contract Address of the created contract.\n */\n function safeCREATE(\n uint256 _gasLimit,\n bytes memory _bytecode\n )\n internal\n returns (\n address,\n bytes memory\n )\n {\n bytes memory returndata = _safeExecutionManagerInteraction(\n _gasLimit,\n abi.encodeWithSignature(\n \"ovmCREATE(bytes)\",\n _bytecode\n )\n );\n\n return abi.decode(returndata, (address, bytes));\n }\n\n /**\n * Performs a safe ovmEXTCODESIZE call.\n * @param _contract Address of the contract to query the size of.\n * @return _EXTCODESIZE Size of the requested contract in bytes.\n */\n function safeEXTCODESIZE(\n address _contract\n )\n internal\n returns (\n uint256 _EXTCODESIZE\n )\n {\n bytes memory returndata = _safeExecutionManagerInteraction(\n abi.encodeWithSignature(\n \"ovmEXTCODESIZE(address)\",\n _contract\n )\n );\n\n return abi.decode(returndata, (uint256));\n }\n\n /**\n * Performs a safe ovmCHAINID call.\n * @return _CHAINID Result of calling ovmCHAINID.\n */\n function safeCHAINID()\n internal\n returns (\n uint256 _CHAINID\n )\n {\n bytes memory returndata = _safeExecutionManagerInteraction(\n abi.encodeWithSignature(\n \"ovmCHAINID()\"\n )\n );\n\n return abi.decode(returndata, (uint256));\n }\n\n /**\n * Performs a safe ovmCALLER call.\n * @return _CALLER Result of calling ovmCALLER.\n */\n function safeCALLER()\n internal\n returns (\n address _CALLER\n )\n {\n bytes memory returndata = _safeExecutionManagerInteraction(\n abi.encodeWithSignature(\n \"ovmCALLER()\"\n )\n );\n\n return abi.decode(returndata, (address));\n }\n\n /**\n * Performs a safe ovmADDRESS call.\n * @return _ADDRESS Result of calling ovmADDRESS.\n */\n function safeADDRESS()\n internal\n returns (\n address _ADDRESS\n )\n {\n bytes memory returndata = _safeExecutionManagerInteraction(\n abi.encodeWithSignature(\n \"ovmADDRESS()\"\n )\n );\n\n return abi.decode(returndata, (address));\n }\n\n /**\n * Performs a safe ovmGETNONCE call.\n * @return _nonce Result of calling ovmGETNONCE.\n */\n function safeGETNONCE()\n internal\n returns (\n uint256 _nonce\n )\n {\n bytes memory returndata = _safeExecutionManagerInteraction(\n abi.encodeWithSignature(\n \"ovmGETNONCE()\"\n )\n );\n\n return abi.decode(returndata, (uint256));\n }\n\n /**\n * Performs a safe ovmINCREMENTNONCE call.\n */\n function safeINCREMENTNONCE()\n internal\n {\n _safeExecutionManagerInteraction(\n abi.encodeWithSignature(\n \"ovmINCREMENTNONCE()\"\n )\n );\n }\n\n /**\n * Performs a safe ovmCREATEEOA call.\n * @param _messageHash Message hash which was signed by EOA\n * @param _v v value of signature (0 or 1)\n * @param _r r value of signature\n * @param _s s value of signature\n */\n function safeCREATEEOA(\n bytes32 _messageHash,\n uint8 _v,\n bytes32 _r,\n bytes32 _s\n )\n internal\n {\n _safeExecutionManagerInteraction(\n abi.encodeWithSignature(\n \"ovmCREATEEOA(bytes32,uint8,bytes32,bytes32)\",\n _messageHash,\n _v,\n _r,\n _s\n )\n );\n }\n\n /**\n * Performs a safe REVERT.\n * @param _reason String revert reason to pass along with the REVERT.\n */\n function safeREVERT(\n string memory _reason\n )\n internal\n {\n _safeExecutionManagerInteraction(\n abi.encodeWithSignature(\n \"ovmREVERT(bytes)\",\n Lib_ErrorUtils.encodeRevertString(\n _reason\n )\n )\n );\n }\n\n /**\n * Performs a safe \"require\".\n * @param _condition Boolean condition that must be true or will revert.\n * @param _reason String revert reason to pass along with the REVERT.\n */\n function safeREQUIRE(\n bool _condition,\n string memory _reason\n )\n internal\n {\n if (!_condition) {\n safeREVERT(\n _reason\n );\n }\n }\n\n /**\n * Performs a safe ovmSLOAD call.\n */\n function safeSLOAD(\n bytes32 _key\n )\n internal\n returns (\n bytes32\n )\n {\n bytes memory returndata = _safeExecutionManagerInteraction(\n abi.encodeWithSignature(\n \"ovmSLOAD(bytes32)\",\n _key\n )\n );\n\n return abi.decode(returndata, (bytes32));\n }\n\n /**\n * Performs a safe ovmSSTORE call.\n */\n function safeSSTORE(\n bytes32 _key,\n bytes32 _value\n )\n internal\n {\n _safeExecutionManagerInteraction(\n abi.encodeWithSignature(\n \"ovmSSTORE(bytes32,bytes32)\",\n _key,\n _value\n )\n );\n }\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * Performs an ovm interaction and the necessary safety checks.\n * @param _gasLimit Gas limit for the interaction.\n * @param _calldata Data to send to the OVM_ExecutionManager (encoded with sighash).\n * @return _returndata Data sent back by the OVM_ExecutionManager.\n */\n function _safeExecutionManagerInteraction(\n uint256 _gasLimit,\n bytes memory _calldata\n )\n private\n returns (\n bytes memory _returndata\n )\n {\n address ovmExecutionManager = msg.sender;\n (\n bool success,\n bytes memory returndata\n ) = ovmExecutionManager.call{gas: _gasLimit}(_calldata);\n\n if (success == false) {\n assembly {\n revert(add(returndata, 0x20), mload(returndata))\n }\n } else if (returndata.length == 1) {\n assembly {\n return(0, 1)\n }\n } else {\n return returndata;\n }\n }\n\n function _safeExecutionManagerInteraction(\n bytes memory _calldata\n )\n private\n returns (\n bytes memory _returndata\n )\n {\n return _safeExecutionManagerInteraction(\n gasleft(),\n _calldata\n );\n }\n}\n" - }, - "contracts/optimistic-ethereum/libraries/utils/Lib_ErrorUtils.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/**\n * @title Lib_ErrorUtils\n */\nlibrary Lib_ErrorUtils {\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Encodes an error string into raw solidity-style revert data.\n * (i.e. ascii bytes, prefixed with bytes4(keccak(\"Error(string))\"))\n * Ref: https://docs.soliditylang.org/en/v0.8.2/control-structures.html?highlight=Error(string)#panic-via-assert-and-error-via-require\n * @param _reason Reason for the reversion.\n * @return Standard solidity revert data for the given reason.\n */\n function encodeRevertString(\n string memory _reason\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n return abi.encodeWithSignature(\n \"Error(string)\",\n _reason\n );\n }\n}\n" - }, - "contracts/optimistic-ethereum/OVM/accounts/OVM_ECDSAContractAccount.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Interface Imports */\nimport { iOVM_ECDSAContractAccount } from \"../../iOVM/accounts/iOVM_ECDSAContractAccount.sol\";\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_ECDSAUtils } from \"../../libraries/utils/Lib_ECDSAUtils.sol\";\nimport { Lib_SafeExecutionManagerWrapper } from \"../../libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\";\nimport { Lib_SafeMathWrapper } from \"../../libraries/wrappers/Lib_SafeMathWrapper.sol\";\n\n/**\n * @title OVM_ECDSAContractAccount\n * @dev The ECDSA Contract Account can be used as the implementation for a ProxyEOA deployed by the\n * ovmCREATEEOA operation. It enables backwards compatibility with Ethereum's Layer 1, by \n * providing eth_sign and EIP155 formatted transaction encodings.\n *\n * Compiler used: solc\n * Runtime target: OVM\n */\ncontract OVM_ECDSAContractAccount is iOVM_ECDSAContractAccount {\n\n /*************\n * Constants *\n *************/\n\n // TODO: should be the amount sufficient to cover the gas costs of all of the transactions up\n // to and including the CALL/CREATE which forms the entrypoint of the transaction.\n uint256 constant EXECUTION_VALIDATION_GAS_OVERHEAD = 25000;\n address constant ETH_ERC20_ADDRESS = 0x4200000000000000000000000000000000000006;\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Executes a signed transaction.\n * @param _transaction Signed EOA transaction.\n * @param _signatureType Hashing scheme used for the transaction (e.g., ETH signed message).\n * @param _v Signature `v` parameter.\n * @param _r Signature `r` parameter.\n * @param _s Signature `s` parameter.\n * @return Whether or not the call returned (rather than reverted).\n * @return Data returned by the call.\n */\n function execute(\n bytes memory _transaction,\n Lib_OVMCodec.EOASignatureType _signatureType,\n uint8 _v,\n bytes32 _r,\n bytes32 _s\n )\n override\n public\n returns (\n bool,\n bytes memory\n )\n {\n bool isEthSign = _signatureType == Lib_OVMCodec.EOASignatureType.ETH_SIGNED_MESSAGE;\n\n // Address of this contract within the ovm (ovmADDRESS) should be the same as the\n // recovered address of the user who signed this message. This is how we manage to shim\n // account abstraction even though the user isn't a contract.\n // Need to make sure that the transaction nonce is right and bump it if so.\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(\n Lib_ECDSAUtils.recover(\n _transaction,\n isEthSign,\n _v,\n _r,\n _s\n ) == Lib_SafeExecutionManagerWrapper.safeADDRESS(),\n \"Signature provided for EOA transaction execution is invalid.\"\n );\n\n Lib_OVMCodec.EIP155Transaction memory decodedTx = Lib_OVMCodec.decodeEIP155Transaction(_transaction, isEthSign);\n\n // Need to make sure that the transaction chainId is correct.\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(\n decodedTx.chainId == Lib_SafeExecutionManagerWrapper.safeCHAINID(),\n \"Transaction chainId does not match expected OVM chainId.\"\n );\n\n // Need to make sure that the transaction nonce is right.\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(\n decodedTx.nonce == Lib_SafeExecutionManagerWrapper.safeGETNONCE(),\n \"Transaction nonce does not match the expected nonce.\"\n );\n\n // TEMPORARY: Disable gas checks for mainnet.\n // // Need to make sure that the gas is sufficient to execute the transaction.\n // Lib_SafeExecutionManagerWrapper.safeREQUIRE(\n // gasleft() >= Lib_SafeMathWrapper.add(decodedTx.gasLimit, EXECUTION_VALIDATION_GAS_OVERHEAD),\n // \"Gas is not sufficient to execute the transaction.\"\n // );\n\n // Transfer fee to relayer.\n address relayer = Lib_SafeExecutionManagerWrapper.safeCALLER();\n uint256 fee = Lib_SafeMathWrapper.mul(decodedTx.gasLimit, decodedTx.gasPrice);\n (bool success, ) = Lib_SafeExecutionManagerWrapper.safeCALL(\n gasleft(),\n ETH_ERC20_ADDRESS,\n abi.encodeWithSignature(\"transfer(address,uint256)\", relayer, fee)\n );\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(\n success == true,\n \"Fee was not transferred to relayer.\"\n );\n\n // Contract creations are signalled by sending a transaction to the zero address.\n if (decodedTx.to == address(0)) {\n (address created, bytes memory revertData) = Lib_SafeExecutionManagerWrapper.safeCREATE(\n gasleft(),\n decodedTx.data\n );\n\n // Return true if the contract creation succeeded, false w/ revertData otherwise.\n if (created != address(0)) {\n return (true, abi.encode(created));\n } else {\n return (false, revertData);\n }\n } else {\n // We only want to bump the nonce for `ovmCALL` because `ovmCREATE` automatically bumps\n // the nonce of the calling account. Normally an EOA would bump the nonce for both\n // cases, but since this is a contract we'd end up bumping the nonce twice.\n Lib_SafeExecutionManagerWrapper.safeINCREMENTNONCE();\n\n return Lib_SafeExecutionManagerWrapper.safeCALL(\n gasleft(),\n decodedTx.to,\n decodedTx.data\n );\n }\n }\n}\n" - }, - "contracts/optimistic-ethereum/libraries/utils/Lib_ECDSAUtils.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/**\n * @title Lib_ECDSAUtils\n */\nlibrary Lib_ECDSAUtils {\n\n /**************************************\n * Internal Functions: ECDSA Recovery *\n **************************************/\n\n /**\n * Recovers a signed address given a message and signature.\n * @param _message Message that was originally signed.\n * @param _isEthSignedMessage Whether or not the user used the `Ethereum Signed Message` prefix.\n * @param _v Signature `v` parameter.\n * @param _r Signature `r` parameter.\n * @param _s Signature `s` parameter.\n * @return _sender Signer address.\n */\n function recover(\n bytes memory _message,\n bool _isEthSignedMessage,\n uint8 _v,\n bytes32 _r,\n bytes32 _s\n )\n internal\n pure\n returns (\n address _sender\n )\n {\n bytes32 messageHash = getMessageHash(_message, _isEthSignedMessage);\n\n return ecrecover(\n messageHash,\n _v + 27,\n _r,\n _s\n );\n }\n\n function getMessageHash(\n bytes memory _message,\n bool _isEthSignedMessage\n )\n internal\n pure\n returns (bytes32) {\n if (_isEthSignedMessage) {\n return getEthSignedMessageHash(_message);\n }\n return getNativeMessageHash(_message);\n }\n\n\n /*************************************\n * Private Functions: ECDSA Recovery *\n *************************************/\n\n /**\n * Gets the native message hash (simple keccak256) for a message.\n * @param _message Message to hash.\n * @return _messageHash Native message hash.\n */\n function getNativeMessageHash(\n bytes memory _message\n )\n private\n pure\n returns (\n bytes32 _messageHash\n )\n {\n return keccak256(_message);\n }\n\n /**\n * Gets the hash of a message with the `Ethereum Signed Message` prefix.\n * @param _message Message to hash.\n * @return _messageHash Prefixed message hash.\n */\n function getEthSignedMessageHash(\n bytes memory _message\n )\n private\n pure\n returns (\n bytes32 _messageHash\n )\n {\n bytes memory prefix = \"\\x19Ethereum Signed Message:\\n32\";\n bytes32 messageHash = keccak256(_message);\n return keccak256(abi.encodePacked(prefix, messageHash));\n }\n}" - }, - "contracts/optimistic-ethereum/libraries/wrappers/Lib_SafeMathWrapper.sol": { - "content": "// SPDX-License-Identifier: MIT\n// Pulled from @openzeppelin/contracts/math/SafeMath.sol\n// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Library Imports */\nimport { Lib_SafeExecutionManagerWrapper } from \"./Lib_SafeExecutionManagerWrapper.sol\";\n\n/**\n * @title Lib_SafeMathWrapper\n */\n\n/**\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\n * checks.\n *\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\n * in bugs, because programmers usually assume that an overflow raises an\n * error, which is the standard behavior in high level programming languages.\n * `SafeMath` restores this intuition by reverting the transaction when an\n * operation overflows.\n *\n * Using this library instead of the unchecked operations eliminates an entire\n * class of bugs, so it's recommended to use it always.\n */\n\nlibrary Lib_SafeMathWrapper {\n /**\n * @dev Returns the addition of two unsigned integers, reverting on\n * overflow.\n *\n * Counterpart to Solidity's `+` operator.\n *\n * Requirements:\n *\n * - Addition cannot overflow.\n */\n function add(uint256 a, uint256 b) internal returns (uint256) {\n uint256 c = a + b;\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(c >= a, \"Lib_SafeMathWrapper: addition overflow\");\n\n return c;\n }\n\n /**\n * @dev Returns the subtraction of two unsigned integers, reverting on\n * overflow (when the result is negative).\n *\n * Counterpart to Solidity's `-` operator.\n *\n * Requirements:\n *\n * - Subtraction cannot overflow.\n */\n function sub(uint256 a, uint256 b) internal returns (uint256) {\n return sub(a, b, \"Lib_SafeMathWrapper: subtraction overflow\");\n }\n\n /**\n * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\n * overflow (when the result is negative).\n *\n * Counterpart to Solidity's `-` operator.\n *\n * Requirements:\n *\n * - Subtraction cannot overflow.\n */\n function sub(uint256 a, uint256 b, string memory errorMessage) internal returns (uint256) {\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(b <= a, errorMessage);\n uint256 c = a - b;\n\n return c;\n }\n\n /**\n * @dev Returns the multiplication of two unsigned integers, reverting on\n * overflow.\n *\n * Counterpart to Solidity's `*` operator.\n *\n * Requirements:\n *\n * - Multiplication cannot overflow.\n */\n function mul(uint256 a, uint256 b) internal returns (uint256) {\n // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\n // benefit is lost if 'b' is also tested.\n // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\n if (a == 0) {\n return 0;\n }\n\n uint256 c = a * b;\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(c / a == b, \"Lib_SafeMathWrapper: multiplication overflow\");\n\n return c;\n }\n\n /**\n * @dev Returns the integer division of two unsigned integers. Reverts on\n * division by zero. The result is rounded towards zero.\n *\n * Counterpart to Solidity's `/` operator. Note: this function uses a\n * `revert` opcode (which leaves remaining gas untouched) while Solidity\n * uses an invalid opcode to revert (consuming all remaining gas).\n *\n * Requirements:\n *\n * - The divisor cannot be zero.\n */\n function div(uint256 a, uint256 b) internal returns (uint256) {\n return div(a, b, \"Lib_SafeMathWrapper: division by zero\");\n }\n\n /**\n * @dev Returns the integer division of two unsigned integers. Reverts with custom message on\n * division by zero. The result is rounded towards zero.\n *\n * Counterpart to Solidity's `/` operator. Note: this function uses a\n * `revert` opcode (which leaves remaining gas untouched) while Solidity\n * uses an invalid opcode to revert (consuming all remaining gas).\n *\n * Requirements:\n *\n * - The divisor cannot be zero.\n */\n function div(uint256 a, uint256 b, string memory errorMessage) internal returns (uint256) {\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(b > 0, errorMessage);\n uint256 c = a / b;\n // assert(a == b * c + a % b); // There is no case in which this doesn't hold\n\n return c;\n }\n\n /**\n * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\n * Reverts when dividing by zero.\n *\n * Counterpart to Solidity's `%` operator. This function uses a `revert`\n * opcode (which leaves remaining gas untouched) while Solidity uses an\n * invalid opcode to revert (consuming all remaining gas).\n *\n * Requirements:\n *\n * - The divisor cannot be zero.\n */\n function mod(uint256 a, uint256 b) internal returns (uint256) {\n return mod(a, b, \"Lib_SafeMathWrapper: modulo by zero\");\n }\n\n /**\n * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\n * Reverts with custom message when dividing by zero.\n *\n * Counterpart to Solidity's `%` operator. This function uses a `revert`\n * opcode (which leaves remaining gas untouched) while Solidity uses an\n * invalid opcode to revert (consuming all remaining gas).\n *\n * Requirements:\n *\n * - The divisor cannot be zero.\n */\n function mod(uint256 a, uint256 b, string memory errorMessage) internal returns (uint256) {\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(b != 0, errorMessage);\n return a % b;\n }\n}" - }, - "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol": { - "content": "// SPDX-License-Identifier: MIT\n// @unsupported: ovm\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\nimport { Lib_EthUtils } from \"../../libraries/utils/Lib_EthUtils.sol\";\nimport { Lib_ErrorUtils } from \"../../libraries/utils/Lib_ErrorUtils.sol\";\n\n/* Interface Imports */\nimport { iOVM_ExecutionManager } from \"../../iOVM/execution/iOVM_ExecutionManager.sol\";\nimport { iOVM_StateManager } from \"../../iOVM/execution/iOVM_StateManager.sol\";\nimport { iOVM_SafetyChecker } from \"../../iOVM/execution/iOVM_SafetyChecker.sol\";\n\n/* Contract Imports */\nimport { OVM_ECDSAContractAccount } from \"../accounts/OVM_ECDSAContractAccount.sol\";\nimport { OVM_ProxyEOA } from \"../accounts/OVM_ProxyEOA.sol\";\nimport { OVM_DeployerWhitelist } from \"../predeploys/OVM_DeployerWhitelist.sol\";\n\n/**\n * @title OVM_ExecutionManager\n * @dev The Execution Manager (EM) is the core of our OVM implementation, and provides a sandboxed\n * environment allowing us to execute OVM transactions deterministically on either Layer 1 or\n * Layer 2.\n * The EM's run() function is the first function called during the execution of any\n * transaction on L2.\n * For each context-dependent EVM operation the EM has a function which implements a corresponding\n * OVM operation, which will read state from the State Manager contract.\n * The EM relies on the Safety Checker to verify that code deployed to Layer 2 does not contain any\n * context-dependent operations.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract OVM_ExecutionManager is iOVM_ExecutionManager, Lib_AddressResolver {\n\n /********************************\n * External Contract References *\n ********************************/\n\n iOVM_SafetyChecker internal ovmSafetyChecker;\n iOVM_StateManager internal ovmStateManager;\n\n\n /*******************************\n * Execution Context Variables *\n *******************************/\n\n GasMeterConfig internal gasMeterConfig;\n GlobalContext internal globalContext;\n TransactionContext internal transactionContext;\n MessageContext internal messageContext;\n TransactionRecord internal transactionRecord;\n MessageRecord internal messageRecord;\n\n\n /**************************\n * Gas Metering Constants *\n **************************/\n\n address constant GAS_METADATA_ADDRESS = 0x06a506A506a506A506a506a506A506A506A506A5;\n uint256 constant NUISANCE_GAS_SLOAD = 20000;\n uint256 constant NUISANCE_GAS_SSTORE = 20000;\n uint256 constant MIN_NUISANCE_GAS_PER_CONTRACT = 30000;\n uint256 constant NUISANCE_GAS_PER_CONTRACT_BYTE = 100;\n uint256 constant MIN_GAS_FOR_INVALID_STATE_ACCESS = 30000;\n\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n constructor(\n address _libAddressManager,\n GasMeterConfig memory _gasMeterConfig,\n GlobalContext memory _globalContext\n )\n Lib_AddressResolver(_libAddressManager)\n {\n ovmSafetyChecker = iOVM_SafetyChecker(resolve(\"OVM_SafetyChecker\"));\n gasMeterConfig = _gasMeterConfig;\n globalContext = _globalContext;\n _resetContext();\n }\n\n\n /**********************\n * Function Modifiers *\n **********************/\n\n /**\n * Applies dynamically-sized refund to a transaction to account for the difference in execution\n * between L1 and L2, so that the overall cost of the ovmOPCODE is fixed.\n * @param _cost Desired gas cost for the function after the refund.\n */\n modifier netGasCost(\n uint256 _cost\n ) {\n uint256 gasProvided = gasleft();\n _;\n uint256 gasUsed = gasProvided - gasleft();\n\n // We want to refund everything *except* the specified cost.\n if (_cost < gasUsed) {\n transactionRecord.ovmGasRefund += gasUsed - _cost;\n }\n }\n\n /**\n * Applies a fixed-size gas refund to a transaction to account for the difference in execution\n * between L1 and L2, so that the overall cost of an ovmOPCODE can be lowered.\n * @param _discount Amount of gas cost to refund for the ovmOPCODE.\n */\n modifier fixedGasDiscount(\n uint256 _discount\n ) {\n uint256 gasProvided = gasleft();\n _;\n uint256 gasUsed = gasProvided - gasleft();\n\n // We want to refund the specified _discount, unless this risks underflow.\n if (_discount < gasUsed) {\n transactionRecord.ovmGasRefund += _discount;\n } else {\n // refund all we can without risking underflow.\n transactionRecord.ovmGasRefund += gasUsed;\n }\n }\n\n /**\n * Makes sure we're not inside a static context.\n */\n modifier notStatic() {\n if (messageContext.isStatic == true) {\n _revertWithFlag(RevertFlag.STATIC_VIOLATION);\n }\n _;\n }\n\n\n /************************************\n * Transaction Execution Entrypoint *\n ************************************/\n\n /**\n * Starts the execution of a transaction via the OVM_ExecutionManager.\n * @param _transaction Transaction data to be executed.\n * @param _ovmStateManager iOVM_StateManager implementation providing account state.\n */\n function run(\n Lib_OVMCodec.Transaction memory _transaction,\n address _ovmStateManager\n )\n override\n public\n {\n require(transactionContext.ovmNUMBER == 0, \"Only callable at the start of a transaction\");\n // Store our OVM_StateManager instance (significantly easier than attempting to pass the\n // address around in calldata).\n ovmStateManager = iOVM_StateManager(_ovmStateManager);\n\n // Make sure this function can't be called by anyone except the owner of the\n // OVM_StateManager (expected to be an OVM_StateTransitioner). We can revert here because\n // this would make the `run` itself invalid.\n require(\n // This method may return false during fraud proofs, but always returns true in L2 nodes' State Manager precompile.\n ovmStateManager.isAuthenticated(msg.sender),\n \"Only authenticated addresses in ovmStateManager can call this function\"\n );\n\n // Initialize the execution context, must be initialized before we perform any gas metering\n // or we'll throw a nuisance gas error.\n _initContext(_transaction);\n\n // TEMPORARY: Gas metering is disabled for minnet.\n // // Check whether we need to start a new epoch, do so if necessary.\n // _checkNeedsNewEpoch(_transaction.timestamp);\n\n // Make sure the transaction's gas limit is valid. We don't revert here because we reserve\n // reverts for INVALID_STATE_ACCESS.\n if (_isValidGasLimit(_transaction.gasLimit, _transaction.l1QueueOrigin) == false) {\n _resetContext();\n return;\n }\n\n // TEMPORARY: Gas metering is disabled for minnet.\n // // Check gas right before the call to get total gas consumed by OVM transaction.\n // uint256 gasProvided = gasleft();\n\n // Run the transaction, make sure to meter the gas usage.\n ovmCALL(\n _transaction.gasLimit - gasMeterConfig.minTransactionGasLimit,\n _transaction.entrypoint,\n _transaction.data\n );\n\n // TEMPORARY: Gas metering is disabled for minnet.\n // // Update the cumulative gas based on the amount of gas used.\n // uint256 gasUsed = gasProvided - gasleft();\n // _updateCumulativeGas(gasUsed, _transaction.l1QueueOrigin);\n\n // Wipe the execution context.\n _resetContext();\n }\n\n\n /******************************\n * Opcodes: Execution Context *\n ******************************/\n\n /**\n * @notice Overrides CALLER.\n * @return _CALLER Address of the CALLER within the current message context.\n */\n function ovmCALLER()\n override\n public\n view\n returns (\n address _CALLER\n )\n {\n return messageContext.ovmCALLER;\n }\n\n /**\n * @notice Overrides ADDRESS.\n * @return _ADDRESS Active ADDRESS within the current message context.\n */\n function ovmADDRESS()\n override\n public\n view\n returns (\n address _ADDRESS\n )\n {\n return messageContext.ovmADDRESS;\n }\n\n /**\n * @notice Overrides TIMESTAMP.\n * @return _TIMESTAMP Value of the TIMESTAMP within the transaction context.\n */\n function ovmTIMESTAMP()\n override\n public\n view\n returns (\n uint256 _TIMESTAMP\n )\n {\n return transactionContext.ovmTIMESTAMP;\n }\n\n /**\n * @notice Overrides NUMBER.\n * @return _NUMBER Value of the NUMBER within the transaction context.\n */\n function ovmNUMBER()\n override\n public\n view\n returns (\n uint256 _NUMBER\n )\n {\n return transactionContext.ovmNUMBER;\n }\n\n /**\n * @notice Overrides GASLIMIT.\n * @return _GASLIMIT Value of the block's GASLIMIT within the transaction context.\n */\n function ovmGASLIMIT()\n override\n public\n view\n returns (\n uint256 _GASLIMIT\n )\n {\n return transactionContext.ovmGASLIMIT;\n }\n\n /**\n * @notice Overrides CHAINID.\n * @return _CHAINID Value of the chain's CHAINID within the global context.\n */\n function ovmCHAINID()\n override\n public\n view\n returns (\n uint256 _CHAINID\n )\n {\n return globalContext.ovmCHAINID;\n }\n\n /*********************************\n * Opcodes: L2 Execution Context *\n *********************************/\n\n /**\n * @notice Specifies from which L1 rollup queue this transaction originated from.\n * @return _queueOrigin Address of the ovmL1QUEUEORIGIN within the current message context.\n */\n function ovmL1QUEUEORIGIN()\n override\n public\n view\n returns (\n Lib_OVMCodec.QueueOrigin _queueOrigin\n )\n {\n return transactionContext.ovmL1QUEUEORIGIN;\n }\n\n /**\n * @notice Specifies which L1 account, if any, sent this transaction by calling enqueue().\n * @return _l1TxOrigin Address of the account which sent the tx into L2 from L1.\n */\n function ovmL1TXORIGIN()\n override\n public\n view\n returns (\n address _l1TxOrigin\n )\n {\n return transactionContext.ovmL1TXORIGIN;\n }\n\n /********************\n * Opcodes: Halting *\n ********************/\n\n /**\n * @notice Overrides REVERT.\n * @param _data Bytes data to pass along with the REVERT.\n */\n function ovmREVERT(\n bytes memory _data\n )\n override\n public\n {\n _revertWithFlag(RevertFlag.INTENTIONAL_REVERT, _data);\n }\n\n\n /******************************\n * Opcodes: Contract Creation *\n ******************************/\n\n /**\n * @notice Overrides CREATE.\n * @param _bytecode Code to be used to CREATE a new contract.\n * @return Address of the created contract.\n * @return Revert data, if and only if the creation threw an exception.\n */\n function ovmCREATE(\n bytes memory _bytecode\n )\n override\n public\n notStatic\n fixedGasDiscount(40000)\n returns (\n address,\n bytes memory\n )\n {\n // Creator is always the current ADDRESS.\n address creator = ovmADDRESS();\n\n // Check that the deployer is whitelisted, or\n // that arbitrary contract deployment has been enabled.\n _checkDeployerAllowed(creator);\n\n // Generate the correct CREATE address.\n address contractAddress = Lib_EthUtils.getAddressForCREATE(\n creator,\n _getAccountNonce(creator)\n );\n\n return _createContract(\n contractAddress,\n _bytecode\n );\n }\n\n /**\n * @notice Overrides CREATE2.\n * @param _bytecode Code to be used to CREATE2 a new contract.\n * @param _salt Value used to determine the contract's address.\n * @return Address of the created contract.\n * @return Revert data, if and only if the creation threw an exception.\n */\n function ovmCREATE2(\n bytes memory _bytecode,\n bytes32 _salt\n )\n override\n public\n notStatic\n fixedGasDiscount(40000)\n returns (\n address,\n bytes memory\n )\n {\n // Creator is always the current ADDRESS.\n address creator = ovmADDRESS();\n\n // Check that the deployer is whitelisted, or\n // that arbitrary contract deployment has been enabled.\n _checkDeployerAllowed(creator);\n\n // Generate the correct CREATE2 address.\n address contractAddress = Lib_EthUtils.getAddressForCREATE2(\n creator,\n _bytecode,\n _salt\n );\n\n return _createContract(\n contractAddress,\n _bytecode\n );\n }\n\n\n /*******************************\n * Account Abstraction Opcodes *\n ******************************/\n\n /**\n * Retrieves the nonce of the current ovmADDRESS.\n * @return _nonce Nonce of the current contract.\n */\n function ovmGETNONCE()\n override\n public\n returns (\n uint256 _nonce\n )\n {\n return _getAccountNonce(ovmADDRESS());\n }\n\n /**\n * Bumps the nonce of the current ovmADDRESS by one.\n */\n function ovmINCREMENTNONCE()\n override\n public\n notStatic\n {\n address account = ovmADDRESS();\n uint256 nonce = _getAccountNonce(account);\n\n // Prevent overflow.\n if (nonce + 1 > nonce) {\n _setAccountNonce(account, nonce + 1);\n }\n }\n\n /**\n * Creates a new EOA contract account, for account abstraction.\n * @dev Essentially functions like ovmCREATE or ovmCREATE2, but we can bypass a lot of checks\n * because the contract we're creating is trusted (no need to do safety checking or to\n * handle unexpected reverts). Doesn't need to return an address because the address is\n * assumed to be the user's actual address.\n * @param _messageHash Hash of a message signed by some user, for verification.\n * @param _v Signature `v` parameter.\n * @param _r Signature `r` parameter.\n * @param _s Signature `s` parameter.\n */\n function ovmCREATEEOA(\n bytes32 _messageHash,\n uint8 _v,\n bytes32 _r,\n bytes32 _s\n )\n override\n public\n notStatic\n {\n // Recover the EOA address from the message hash and signature parameters. Since we do the\n // hashing in advance, we don't have handle different message hashing schemes. Even if this\n // function were to return the wrong address (rather than explicitly returning the zero\n // address), the rest of the transaction would simply fail (since there's no EOA account to\n // actually execute the transaction).\n address eoa = ecrecover(\n _messageHash,\n _v + 27,\n _r,\n _s\n );\n\n // Invalid signature is a case we proactively handle with a revert. We could alternatively\n // have this function return a `success` boolean, but this is just easier.\n if (eoa == address(0)) {\n ovmREVERT(bytes(\"Signature provided for EOA contract creation is invalid.\"));\n }\n\n // If the user already has an EOA account, then there's no need to perform this operation.\n if (_hasEmptyAccount(eoa) == false) {\n return;\n }\n\n // We always need to initialize the contract with the default account values.\n _initPendingAccount(eoa);\n\n // Temporarily set the current address so it's easier to access on L2.\n address prevADDRESS = messageContext.ovmADDRESS;\n messageContext.ovmADDRESS = eoa;\n\n // Now actually create the account and get its bytecode. We're not worried about reverts\n // (other than out of gas, which we can't capture anyway) because this contract is trusted.\n OVM_ProxyEOA proxyEOA = new OVM_ProxyEOA(0x4200000000000000000000000000000000000003);\n\n // Reset the address now that we're done deploying.\n messageContext.ovmADDRESS = prevADDRESS;\n\n // Commit the account with its final values.\n _commitPendingAccount(\n eoa,\n address(proxyEOA),\n keccak256(Lib_EthUtils.getCode(address(proxyEOA)))\n );\n\n _setAccountNonce(eoa, 0);\n }\n\n\n /*********************************\n * Opcodes: Contract Interaction *\n *********************************/\n\n /**\n * @notice Overrides CALL.\n * @param _gasLimit Amount of gas to be passed into this call.\n * @param _address Address of the contract to call.\n * @param _calldata Data to send along with the call.\n * @return _success Whether or not the call returned (rather than reverted).\n * @return _returndata Data returned by the call.\n */\n function ovmCALL(\n uint256 _gasLimit,\n address _address,\n bytes memory _calldata\n )\n override\n public\n fixedGasDiscount(100000)\n returns (\n bool _success,\n bytes memory _returndata\n )\n {\n // CALL updates the CALLER and ADDRESS.\n MessageContext memory nextMessageContext = messageContext;\n nextMessageContext.ovmCALLER = nextMessageContext.ovmADDRESS;\n nextMessageContext.ovmADDRESS = _address;\n\n return _callContract(\n nextMessageContext,\n _gasLimit,\n _address,\n _calldata\n );\n }\n\n /**\n * @notice Overrides STATICCALL.\n * @param _gasLimit Amount of gas to be passed into this call.\n * @param _address Address of the contract to call.\n * @param _calldata Data to send along with the call.\n * @return _success Whether or not the call returned (rather than reverted).\n * @return _returndata Data returned by the call.\n */\n function ovmSTATICCALL(\n uint256 _gasLimit,\n address _address,\n bytes memory _calldata\n )\n override\n public\n fixedGasDiscount(80000)\n returns (\n bool _success,\n bytes memory _returndata\n )\n {\n // STATICCALL updates the CALLER, updates the ADDRESS, and runs in a static context.\n MessageContext memory nextMessageContext = messageContext;\n nextMessageContext.ovmCALLER = nextMessageContext.ovmADDRESS;\n nextMessageContext.ovmADDRESS = _address;\n nextMessageContext.isStatic = true;\n\n return _callContract(\n nextMessageContext,\n _gasLimit,\n _address,\n _calldata\n );\n }\n\n /**\n * @notice Overrides DELEGATECALL.\n * @param _gasLimit Amount of gas to be passed into this call.\n * @param _address Address of the contract to call.\n * @param _calldata Data to send along with the call.\n * @return _success Whether or not the call returned (rather than reverted).\n * @return _returndata Data returned by the call.\n */\n function ovmDELEGATECALL(\n uint256 _gasLimit,\n address _address,\n bytes memory _calldata\n )\n override\n public\n fixedGasDiscount(40000)\n returns (\n bool _success,\n bytes memory _returndata\n )\n {\n // DELEGATECALL does not change anything about the message context.\n MessageContext memory nextMessageContext = messageContext;\n\n return _callContract(\n nextMessageContext,\n _gasLimit,\n _address,\n _calldata\n );\n }\n\n\n /************************************\n * Opcodes: Contract Storage Access *\n ************************************/\n\n /**\n * @notice Overrides SLOAD.\n * @param _key 32 byte key of the storage slot to load.\n * @return _value 32 byte value of the requested storage slot.\n */\n function ovmSLOAD(\n bytes32 _key\n )\n override\n public\n netGasCost(40000)\n returns (\n bytes32 _value\n )\n {\n // We always SLOAD from the storage of ADDRESS.\n address contractAddress = ovmADDRESS();\n\n return _getContractStorage(\n contractAddress,\n _key\n );\n }\n\n /**\n * @notice Overrides SSTORE.\n * @param _key 32 byte key of the storage slot to set.\n * @param _value 32 byte value for the storage slot.\n */\n function ovmSSTORE(\n bytes32 _key,\n bytes32 _value\n )\n override\n public\n notStatic\n netGasCost(60000)\n {\n // We always SSTORE to the storage of ADDRESS.\n address contractAddress = ovmADDRESS();\n\n _putContractStorage(\n contractAddress,\n _key,\n _value\n );\n }\n\n\n /*********************************\n * Opcodes: Contract Code Access *\n *********************************/\n\n /**\n * @notice Overrides EXTCODECOPY.\n * @param _contract Address of the contract to copy code from.\n * @param _offset Offset in bytes from the start of contract code to copy beyond.\n * @param _length Total number of bytes to copy from the contract's code.\n * @return _code Bytes of code copied from the requested contract.\n */\n function ovmEXTCODECOPY(\n address _contract,\n uint256 _offset,\n uint256 _length\n )\n override\n public\n returns (\n bytes memory _code\n )\n {\n // `ovmEXTCODECOPY` is the only overridden opcode capable of producing exactly one byte of\n // return data. By blocking reads of one byte, we're able to use the condition that an\n // OVM_ExecutionManager function return value having a length of exactly one byte indicates\n // an error without an explicit revert. If users were able to read a single byte, they\n // could forcibly trigger behavior that should only be available to this contract.\n uint256 length = _length == 1 ? 2 : _length;\n\n return Lib_EthUtils.getCode(\n _getAccountEthAddress(_contract),\n _offset,\n length\n );\n }\n\n /**\n * @notice Overrides EXTCODESIZE.\n * @param _contract Address of the contract to query the size of.\n * @return _EXTCODESIZE Size of the requested contract in bytes.\n */\n function ovmEXTCODESIZE(\n address _contract\n )\n override\n public\n returns (\n uint256 _EXTCODESIZE\n )\n {\n return Lib_EthUtils.getCodeSize(\n _getAccountEthAddress(_contract)\n );\n }\n\n /**\n * @notice Overrides EXTCODEHASH.\n * @param _contract Address of the contract to query the hash of.\n * @return _EXTCODEHASH Hash of the requested contract.\n */\n function ovmEXTCODEHASH(\n address _contract\n )\n override\n public\n returns (\n bytes32 _EXTCODEHASH\n )\n {\n return Lib_EthUtils.getCodeHash(\n _getAccountEthAddress(_contract)\n );\n }\n\n /***************************************\n * Public Functions: Execution Context *\n ***************************************/\n\n function getMaxTransactionGasLimit()\n external\n view\n override\n returns (\n uint256 _maxTransactionGasLimit\n )\n {\n return gasMeterConfig.maxTransactionGasLimit;\n }\n\n /********************************************\n * Public Functions: Deployment Whitelisting *\n ********************************************/\n\n /**\n * Checks whether the given address is on the whitelist to ovmCREATE/ovmCREATE2, and reverts if not.\n * @param _deployerAddress Address attempting to deploy a contract.\n */\n function _checkDeployerAllowed(\n address _deployerAddress\n )\n internal\n {\n // From an OVM semantics perspective, this will appear identical to\n // the deployer ovmCALLing the whitelist. This is fine--in a sense, we are forcing them to.\n (bool success, bytes memory data) = ovmCALL(\n gasleft(),\n 0x4200000000000000000000000000000000000002,\n abi.encodeWithSignature(\"isDeployerAllowed(address)\", _deployerAddress)\n );\n bool isAllowed = abi.decode(data, (bool));\n\n if (!isAllowed || !success) {\n _revertWithFlag(RevertFlag.CREATOR_NOT_ALLOWED);\n }\n }\n\n /********************************************\n * Internal Functions: Contract Interaction *\n ********************************************/\n\n /**\n * Creates a new contract and associates it with some contract address.\n * @param _contractAddress Address to associate the created contract with.\n * @param _bytecode Bytecode to be used to create the contract.\n * @return Final OVM contract address.\n * @return Revertdata, if and only if the creation threw an exception.\n */\n function _createContract(\n address _contractAddress,\n bytes memory _bytecode\n )\n internal\n returns (\n address,\n bytes memory\n )\n {\n // We always update the nonce of the creating account, even if the creation fails.\n _setAccountNonce(ovmADDRESS(), _getAccountNonce(ovmADDRESS()) + 1);\n\n // We're stepping into a CREATE or CREATE2, so we need to update ADDRESS to point\n // to the contract's associated address and CALLER to point to the previous ADDRESS.\n MessageContext memory nextMessageContext = messageContext;\n nextMessageContext.ovmCALLER = messageContext.ovmADDRESS;\n nextMessageContext.ovmADDRESS = _contractAddress;\n\n // Run the common logic which occurs between call-type and create-type messages,\n // passing in the creation bytecode and `true` to trigger create-specific logic.\n (bool success, bytes memory data) = _handleExternalMessage(\n nextMessageContext,\n gasleft(),\n _contractAddress,\n _bytecode,\n true\n );\n\n // Yellow paper requires that address returned is zero if the contract deployment fails.\n return (\n success ? _contractAddress : address(0),\n data\n );\n }\n\n /**\n * Calls the deployed contract associated with a given address.\n * @param _nextMessageContext Message context to be used for the call.\n * @param _gasLimit Amount of gas to be passed into this call.\n * @param _contract OVM address to be called.\n * @param _calldata Data to send along with the call.\n * @return _success Whether or not the call returned (rather than reverted).\n * @return _returndata Data returned by the call.\n */\n function _callContract(\n MessageContext memory _nextMessageContext,\n uint256 _gasLimit,\n address _contract,\n bytes memory _calldata\n )\n internal\n returns (\n bool _success,\n bytes memory _returndata\n )\n {\n // We reserve addresses of the form 0xdeaddeaddead...NNNN for the container contracts in L2 geth.\n // So, we block calls to these addresses since they are not safe to run as an OVM contract itself.\n if (\n (uint256(_contract) & uint256(0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000))\n == uint256(0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000)\n ) {\n // EVM does not return data in the success case, see: https://github.com/ethereum/go-ethereum/blob/aae7660410f0ef90279e14afaaf2f429fdc2a186/core/vm/instructions.go#L600-L604\n return (true, hex'');\n }\n\n // Both 0x0000... and the EVM precompiles have the same address on L1 and L2 --> no trie lookup needed.\n address codeContractAddress =\n uint(_contract) < 100\n ? _contract\n : _getAccountEthAddress(_contract);\n\n return _handleExternalMessage(\n _nextMessageContext,\n _gasLimit,\n codeContractAddress,\n _calldata,\n false\n );\n }\n\n /**\n * Handles all interactions which involve the execution manager calling out to untrusted code (both calls and creates).\n * Ensures that OVM-related measures are enforced, including L2 gas refunds, nuisance gas, and flagged reversions.\n *\n * @param _nextMessageContext Message context to be used for the external message.\n * @param _gasLimit Amount of gas to be passed into this message.\n * @param _contract OVM address being called or deployed to\n * @param _data Data for the message (either calldata or creation code)\n * @param _isCreate Whether this is a create-type message.\n * @return Whether or not the message (either a call or deployment) succeeded.\n * @return Data returned by the message.\n */\n function _handleExternalMessage(\n MessageContext memory _nextMessageContext,\n uint256 _gasLimit,\n address _contract,\n bytes memory _data,\n bool _isCreate\n )\n internal\n returns (\n bool,\n bytes memory\n )\n {\n // We need to switch over to our next message context for the duration of this call.\n MessageContext memory prevMessageContext = messageContext;\n _switchMessageContext(prevMessageContext, _nextMessageContext);\n\n // Nuisance gas is a system used to bound the ability for an attacker to make fraud proofs\n // expensive by touching a lot of different accounts or storage slots. Since most contracts\n // only use a few storage slots during any given transaction, this shouldn't be a limiting\n // factor.\n uint256 prevNuisanceGasLeft = messageRecord.nuisanceGasLeft;\n uint256 nuisanceGasLimit = _getNuisanceGasLimit(_gasLimit);\n messageRecord.nuisanceGasLeft = nuisanceGasLimit;\n\n // Make the call and make sure to pass in the gas limit. Another instance of hidden\n // complexity. `_contract` is guaranteed to be a safe contract, meaning its return/revert\n // behavior can be controlled. In particular, we enforce that flags are passed through\n // revert data as to retrieve execution metadata that would normally be reverted out of\n // existence.\n\n (bool success, bytes memory returndata) =\n _isCreate\n ? _handleContractCreation(_gasLimit, _data, _contract)\n : _contract.call{gas: _gasLimit}(_data);\n\n // Switch back to the original message context now that we're out of the call.\n _switchMessageContext(_nextMessageContext, prevMessageContext);\n\n // Assuming there were no reverts, the message record should be accurate here. We'll update\n // this value in the case of a revert.\n uint256 nuisanceGasLeft = messageRecord.nuisanceGasLeft;\n\n // Reverts at this point are completely OK, but we need to make a few updates based on the\n // information passed through the revert.\n if (success == false) {\n (\n RevertFlag flag,\n uint256 nuisanceGasLeftPostRevert,\n uint256 ovmGasRefund,\n bytes memory returndataFromFlag\n ) = _decodeRevertData(returndata);\n\n // INVALID_STATE_ACCESS is the only flag that triggers an immediate abort of the\n // parent EVM message. This behavior is necessary because INVALID_STATE_ACCESS must\n // halt any further transaction execution that could impact the execution result.\n if (flag == RevertFlag.INVALID_STATE_ACCESS) {\n _revertWithFlag(flag);\n }\n\n // INTENTIONAL_REVERT, UNSAFE_BYTECODE, STATIC_VIOLATION, and CREATOR_NOT_ALLOWED aren't\n // dependent on the input state, so we can just handle them like standard reverts. Our only change here\n // is to record the gas refund reported by the call (enforced by safety checking).\n if (\n flag == RevertFlag.INTENTIONAL_REVERT\n || flag == RevertFlag.UNSAFE_BYTECODE\n || flag == RevertFlag.STATIC_VIOLATION\n || flag == RevertFlag.CREATOR_NOT_ALLOWED\n ) {\n transactionRecord.ovmGasRefund = ovmGasRefund;\n }\n\n // INTENTIONAL_REVERT needs to pass up the user-provided return data encoded into the\n // flag, *not* the full encoded flag. All other revert types return no data.\n if (\n flag == RevertFlag.INTENTIONAL_REVERT\n || _isCreate\n ) {\n returndata = returndataFromFlag;\n } else {\n returndata = hex'';\n }\n\n // Reverts mean we need to use up whatever \"nuisance gas\" was used by the call.\n // EXCEEDS_NUISANCE_GAS explicitly reduces the remaining nuisance gas for this message\n // to zero. OUT_OF_GAS is a \"pseudo\" flag given that messages return no data when they\n // run out of gas, so we have to treat this like EXCEEDS_NUISANCE_GAS. All other flags\n // will simply pass up the remaining nuisance gas.\n nuisanceGasLeft = nuisanceGasLeftPostRevert;\n }\n\n // We need to reset the nuisance gas back to its original value minus the amount used here.\n messageRecord.nuisanceGasLeft = prevNuisanceGasLeft - (nuisanceGasLimit - nuisanceGasLeft);\n\n return (\n success,\n returndata\n );\n }\n\n /**\n * Handles the creation-specific safety measures required for OVM contract deployment.\n * This function sanitizes the return types for creation messages to match calls (bool, bytes).\n * This allows for consistent handling of both types of messages in _handleExternalMessage().\n *\n * @param _gasLimit Amount of gas to be passed into this creation.\n * @param _creationCode Code to pass into CREATE for deployment.\n * @param _address OVM address being deployed to.\n * @return Whether or not the call succeeded.\n * @return If creation fails: revert data. Otherwise: empty.\n */\n function _handleContractCreation(\n uint _gasLimit,\n bytes memory _creationCode,\n address _address\n )\n internal\n returns(\n bool,\n bytes memory\n )\n {\n // Check that there is not already code at this address.\n if (_hasEmptyAccount(_address) == false) {\n // Note: in the EVM, this case burns all allotted gas. For improved\n // developer experience, we do return the remaining ones.\n return (\n false,\n _encodeRevertData(\n RevertFlag.CREATE_COLLISION,\n Lib_ErrorUtils.encodeRevertString(\"A contract has already been deployed to this address\")\n )\n );\n }\n\n // Check the creation bytecode against the OVM_SafetyChecker.\n if (ovmSafetyChecker.isBytecodeSafe(_creationCode) == false) {\n return (\n false,\n _encodeRevertData(\n RevertFlag.UNSAFE_BYTECODE,\n Lib_ErrorUtils.encodeRevertString(\"Contract creation code contains unsafe opcodes. Did you use the right compiler or pass an unsafe constructor argument?\")\n )\n );\n }\n\n // We always need to initialize the contract with the default account values.\n _initPendingAccount(_address);\n\n // Actually execute the EVM create message,\n address ethAddress = Lib_EthUtils.createContract(_creationCode);\n\n if (ethAddress == address(0)) {\n // If the creation fails, the EVM lets us grab its revert data. This may contain a revert flag\n // to be used above in _handleExternalMessage.\n uint256 revertDataSize;\n assembly { revertDataSize := returndatasize() }\n bytes memory revertdata = new bytes(revertDataSize);\n assembly {\n returndatacopy(\n add(revertdata, 0x20),\n 0,\n revertDataSize\n )\n }\n // Return that the creation failed, and the data it reverted with.\n return (false, revertdata);\n }\n\n // Again simply checking that the deployed code is safe too. Contracts can generate\n // arbitrary deployment code, so there's no easy way to analyze this beforehand.\n bytes memory deployedCode = Lib_EthUtils.getCode(ethAddress);\n if (ovmSafetyChecker.isBytecodeSafe(deployedCode) == false) {\n return (\n false,\n _encodeRevertData(\n RevertFlag.UNSAFE_BYTECODE,\n Lib_ErrorUtils.encodeRevertString(\"Constructor attempted to deploy unsafe bytecode.\")\n )\n );\n }\n\n // Contract creation didn't need to be reverted and the bytecode is safe. We finish up by\n // associating the desired address with the newly created contract's code hash and address.\n _commitPendingAccount(\n _address,\n ethAddress,\n Lib_EthUtils.getCodeHash(ethAddress)\n );\n\n // Successful deployments will not give access to returndata, in both the EVM and the OVM.\n return (true, hex'');\n }\n\n /******************************************\n * Internal Functions: State Manipulation *\n ******************************************/\n\n /**\n * Checks whether an account exists within the OVM_StateManager.\n * @param _address Address of the account to check.\n * @return _exists Whether or not the account exists.\n */\n function _hasAccount(\n address _address\n )\n internal\n returns (\n bool _exists\n )\n {\n _checkAccountLoad(_address);\n return ovmStateManager.hasAccount(_address);\n }\n\n /**\n * Checks whether a known empty account exists within the OVM_StateManager.\n * @param _address Address of the account to check.\n * @return _exists Whether or not the account empty exists.\n */\n function _hasEmptyAccount(\n address _address\n )\n internal\n returns (\n bool _exists\n )\n {\n _checkAccountLoad(_address);\n return ovmStateManager.hasEmptyAccount(_address);\n }\n\n /**\n * Sets the nonce of an account.\n * @param _address Address of the account to modify.\n * @param _nonce New account nonce.\n */\n function _setAccountNonce(\n address _address,\n uint256 _nonce\n )\n internal\n {\n _checkAccountChange(_address);\n ovmStateManager.setAccountNonce(_address, _nonce);\n }\n\n /**\n * Gets the nonce of an account.\n * @param _address Address of the account to access.\n * @return _nonce Nonce of the account.\n */\n function _getAccountNonce(\n address _address\n )\n internal\n returns (\n uint256 _nonce\n )\n {\n _checkAccountLoad(_address);\n return ovmStateManager.getAccountNonce(_address);\n }\n\n /**\n * Retrieves the Ethereum address of an account.\n * @param _address Address of the account to access.\n * @return _ethAddress Corresponding Ethereum address.\n */\n function _getAccountEthAddress(\n address _address\n )\n internal\n returns (\n address _ethAddress\n )\n {\n _checkAccountLoad(_address);\n return ovmStateManager.getAccountEthAddress(_address);\n }\n\n /**\n * Creates the default account object for the given address.\n * @param _address Address of the account create.\n */\n function _initPendingAccount(\n address _address\n )\n internal\n {\n // Although it seems like `_checkAccountChange` would be more appropriate here, we don't\n // actually consider an account \"changed\" until it's inserted into the state (in this case\n // by `_commitPendingAccount`).\n _checkAccountLoad(_address);\n ovmStateManager.initPendingAccount(_address);\n }\n\n /**\n * Stores additional relevant data for a new account, thereby \"committing\" it to the state.\n * This function is only called during `ovmCREATE` and `ovmCREATE2` after a successful contract\n * creation.\n * @param _address Address of the account to commit.\n * @param _ethAddress Address of the associated deployed contract.\n * @param _codeHash Hash of the code stored at the address.\n */\n function _commitPendingAccount(\n address _address,\n address _ethAddress,\n bytes32 _codeHash\n )\n internal\n {\n _checkAccountChange(_address);\n ovmStateManager.commitPendingAccount(\n _address,\n _ethAddress,\n _codeHash\n );\n }\n\n /**\n * Retrieves the value of a storage slot.\n * @param _contract Address of the contract to query.\n * @param _key 32 byte key of the storage slot.\n * @return _value 32 byte storage slot value.\n */\n function _getContractStorage(\n address _contract,\n bytes32 _key\n )\n internal\n returns (\n bytes32 _value\n )\n {\n _checkContractStorageLoad(_contract, _key);\n return ovmStateManager.getContractStorage(_contract, _key);\n }\n\n /**\n * Sets the value of a storage slot.\n * @param _contract Address of the contract to modify.\n * @param _key 32 byte key of the storage slot.\n * @param _value 32 byte storage slot value.\n */\n function _putContractStorage(\n address _contract,\n bytes32 _key,\n bytes32 _value\n )\n internal\n {\n // We don't set storage if the value didn't change. Although this acts as a convenient\n // optimization, it's also necessary to avoid the case in which a contract with no storage\n // attempts to store the value \"0\" at any key. Putting this value (and therefore requiring\n // that the value be committed into the storage trie after execution) would incorrectly\n // modify the storage root.\n if (_getContractStorage(_contract, _key) == _value) {\n return;\n }\n\n _checkContractStorageChange(_contract, _key);\n ovmStateManager.putContractStorage(_contract, _key, _value);\n }\n\n /**\n * Validation whenever a contract needs to be loaded. Checks that the account exists, charges\n * nuisance gas if the account hasn't been loaded before.\n * @param _address Address of the account to load.\n */\n function _checkAccountLoad(\n address _address\n )\n internal\n {\n // See `_checkContractStorageLoad` for more information.\n if (gasleft() < MIN_GAS_FOR_INVALID_STATE_ACCESS) {\n _revertWithFlag(RevertFlag.OUT_OF_GAS);\n }\n\n // See `_checkContractStorageLoad` for more information.\n if (ovmStateManager.hasAccount(_address) == false) {\n _revertWithFlag(RevertFlag.INVALID_STATE_ACCESS);\n }\n\n // Check whether the account has been loaded before and mark it as loaded if not. We need\n // this because \"nuisance gas\" only applies to the first time that an account is loaded.\n (\n bool _wasAccountAlreadyLoaded\n ) = ovmStateManager.testAndSetAccountLoaded(_address);\n\n // If we hadn't already loaded the account, then we'll need to charge \"nuisance gas\" based\n // on the size of the contract code.\n if (_wasAccountAlreadyLoaded == false) {\n _useNuisanceGas(\n (Lib_EthUtils.getCodeSize(_getAccountEthAddress(_address)) * NUISANCE_GAS_PER_CONTRACT_BYTE) + MIN_NUISANCE_GAS_PER_CONTRACT\n );\n }\n }\n\n /**\n * Validation whenever a contract needs to be changed. Checks that the account exists, charges\n * nuisance gas if the account hasn't been changed before.\n * @param _address Address of the account to change.\n */\n function _checkAccountChange(\n address _address\n )\n internal\n {\n // Start by checking for a load as we only want to charge nuisance gas proportional to\n // contract size once.\n _checkAccountLoad(_address);\n\n // Check whether the account has been changed before and mark it as changed if not. We need\n // this because \"nuisance gas\" only applies to the first time that an account is changed.\n (\n bool _wasAccountAlreadyChanged\n ) = ovmStateManager.testAndSetAccountChanged(_address);\n\n // If we hadn't already loaded the account, then we'll need to charge \"nuisance gas\" based\n // on the size of the contract code.\n if (_wasAccountAlreadyChanged == false) {\n ovmStateManager.incrementTotalUncommittedAccounts();\n _useNuisanceGas(\n (Lib_EthUtils.getCodeSize(_getAccountEthAddress(_address)) * NUISANCE_GAS_PER_CONTRACT_BYTE) + MIN_NUISANCE_GAS_PER_CONTRACT\n );\n }\n }\n\n /**\n * Validation whenever a slot needs to be loaded. Checks that the account exists, charges\n * nuisance gas if the slot hasn't been loaded before.\n * @param _contract Address of the account to load from.\n * @param _key 32 byte key to load.\n */\n function _checkContractStorageLoad(\n address _contract,\n bytes32 _key\n )\n internal\n {\n // Another case of hidden complexity. If we didn't enforce this requirement, then a\n // contract could pass in just enough gas to cause the INVALID_STATE_ACCESS check to fail\n // on L1 but not on L2. A contract could use this behavior to prevent the\n // OVM_ExecutionManager from detecting an invalid state access. Reverting with OUT_OF_GAS\n // allows us to also charge for the full message nuisance gas, because you deserve that for\n // trying to break the contract in this way.\n if (gasleft() < MIN_GAS_FOR_INVALID_STATE_ACCESS) {\n _revertWithFlag(RevertFlag.OUT_OF_GAS);\n }\n\n // We need to make sure that the transaction isn't trying to access storage that hasn't\n // been provided to the OVM_StateManager. We'll immediately abort if this is the case.\n // We know that we have enough gas to do this check because of the above test.\n if (ovmStateManager.hasContractStorage(_contract, _key) == false) {\n _revertWithFlag(RevertFlag.INVALID_STATE_ACCESS);\n }\n\n // Check whether the slot has been loaded before and mark it as loaded if not. We need\n // this because \"nuisance gas\" only applies to the first time that a slot is loaded.\n (\n bool _wasContractStorageAlreadyLoaded\n ) = ovmStateManager.testAndSetContractStorageLoaded(_contract, _key);\n\n // If we hadn't already loaded the account, then we'll need to charge some fixed amount of\n // \"nuisance gas\".\n if (_wasContractStorageAlreadyLoaded == false) {\n _useNuisanceGas(NUISANCE_GAS_SLOAD);\n }\n }\n\n /**\n * Validation whenever a slot needs to be changed. Checks that the account exists, charges\n * nuisance gas if the slot hasn't been changed before.\n * @param _contract Address of the account to change.\n * @param _key 32 byte key to change.\n */\n function _checkContractStorageChange(\n address _contract,\n bytes32 _key\n )\n internal\n {\n // Start by checking for load to make sure we have the storage slot and that we charge the\n // \"nuisance gas\" necessary to prove the storage slot state.\n _checkContractStorageLoad(_contract, _key);\n\n // Check whether the slot has been changed before and mark it as changed if not. We need\n // this because \"nuisance gas\" only applies to the first time that a slot is changed.\n (\n bool _wasContractStorageAlreadyChanged\n ) = ovmStateManager.testAndSetContractStorageChanged(_contract, _key);\n\n // If we hadn't already changed the account, then we'll need to charge some fixed amount of\n // \"nuisance gas\".\n if (_wasContractStorageAlreadyChanged == false) {\n // Changing a storage slot means that we're also going to have to change the\n // corresponding account, so do an account change check.\n _checkAccountChange(_contract);\n\n ovmStateManager.incrementTotalUncommittedContractStorage();\n _useNuisanceGas(NUISANCE_GAS_SSTORE);\n }\n }\n\n\n /************************************\n * Internal Functions: Revert Logic *\n ************************************/\n\n /**\n * Simple encoding for revert data.\n * @param _flag Flag to revert with.\n * @param _data Additional user-provided revert data.\n * @return _revertdata Encoded revert data.\n */\n function _encodeRevertData(\n RevertFlag _flag,\n bytes memory _data\n )\n internal\n view\n returns (\n bytes memory _revertdata\n )\n {\n // Out of gas and create exceptions will fundamentally return no data, so simulating it shouldn't either.\n if (\n _flag == RevertFlag.OUT_OF_GAS\n ) {\n return bytes('');\n }\n\n // INVALID_STATE_ACCESS doesn't need to return any data other than the flag.\n if (_flag == RevertFlag.INVALID_STATE_ACCESS) {\n return abi.encode(\n _flag,\n 0,\n 0,\n bytes('')\n );\n }\n\n // Just ABI encode the rest of the parameters.\n return abi.encode(\n _flag,\n messageRecord.nuisanceGasLeft,\n transactionRecord.ovmGasRefund,\n _data\n );\n }\n\n /**\n * Simple decoding for revert data.\n * @param _revertdata Revert data to decode.\n * @return _flag Flag used to revert.\n * @return _nuisanceGasLeft Amount of nuisance gas unused by the message.\n * @return _ovmGasRefund Amount of gas refunded during the message.\n * @return _data Additional user-provided revert data.\n */\n function _decodeRevertData(\n bytes memory _revertdata\n )\n internal\n pure\n returns (\n RevertFlag _flag,\n uint256 _nuisanceGasLeft,\n uint256 _ovmGasRefund,\n bytes memory _data\n )\n {\n // A length of zero means the call ran out of gas, just return empty data.\n if (_revertdata.length == 0) {\n return (\n RevertFlag.OUT_OF_GAS,\n 0,\n 0,\n bytes('')\n );\n }\n\n // ABI decode the incoming data.\n return abi.decode(_revertdata, (RevertFlag, uint256, uint256, bytes));\n }\n\n /**\n * Causes a message to revert or abort.\n * @param _flag Flag to revert with.\n * @param _data Additional user-provided data.\n */\n function _revertWithFlag(\n RevertFlag _flag,\n bytes memory _data\n )\n internal\n view\n {\n bytes memory revertdata = _encodeRevertData(\n _flag,\n _data\n );\n\n assembly {\n revert(add(revertdata, 0x20), mload(revertdata))\n }\n }\n\n /**\n * Causes a message to revert or abort.\n * @param _flag Flag to revert with.\n */\n function _revertWithFlag(\n RevertFlag _flag\n )\n internal\n {\n _revertWithFlag(_flag, bytes(''));\n }\n\n\n /******************************************\n * Internal Functions: Nuisance Gas Logic *\n ******************************************/\n\n /**\n * Computes the nuisance gas limit from the gas limit.\n * @dev This function is currently using a naive implementation whereby the nuisance gas limit\n * is set to exactly equal the lesser of the gas limit or remaining gas. It's likely that\n * this implementation is perfectly fine, but we may change this formula later.\n * @param _gasLimit Gas limit to compute from.\n * @return _nuisanceGasLimit Computed nuisance gas limit.\n */\n function _getNuisanceGasLimit(\n uint256 _gasLimit\n )\n internal\n view\n returns (\n uint256 _nuisanceGasLimit\n )\n {\n return _gasLimit < gasleft() ? _gasLimit : gasleft();\n }\n\n /**\n * Uses a certain amount of nuisance gas.\n * @param _amount Amount of nuisance gas to use.\n */\n function _useNuisanceGas(\n uint256 _amount\n )\n internal\n {\n // Essentially the same as a standard OUT_OF_GAS, except we also retain a record of the gas\n // refund to be given at the end of the transaction.\n if (messageRecord.nuisanceGasLeft < _amount) {\n _revertWithFlag(RevertFlag.EXCEEDS_NUISANCE_GAS);\n }\n\n messageRecord.nuisanceGasLeft -= _amount;\n }\n\n\n /************************************\n * Internal Functions: Gas Metering *\n ************************************/\n\n /**\n * Checks whether a transaction needs to start a new epoch and does so if necessary.\n * @param _timestamp Transaction timestamp.\n */\n function _checkNeedsNewEpoch(\n uint256 _timestamp\n )\n internal\n {\n if (\n _timestamp >= (\n _getGasMetadata(GasMetadataKey.CURRENT_EPOCH_START_TIMESTAMP)\n + gasMeterConfig.secondsPerEpoch\n )\n ) {\n _putGasMetadata(\n GasMetadataKey.CURRENT_EPOCH_START_TIMESTAMP,\n _timestamp\n );\n\n _putGasMetadata(\n GasMetadataKey.PREV_EPOCH_SEQUENCER_QUEUE_GAS,\n _getGasMetadata(\n GasMetadataKey.CUMULATIVE_SEQUENCER_QUEUE_GAS\n )\n );\n\n _putGasMetadata(\n GasMetadataKey.PREV_EPOCH_L1TOL2_QUEUE_GAS,\n _getGasMetadata(\n GasMetadataKey.CUMULATIVE_L1TOL2_QUEUE_GAS\n )\n );\n }\n }\n\n /**\n * Validates the gas limit for a given transaction.\n * @param _gasLimit Gas limit provided by the transaction.\n * param _queueOrigin Queue from which the transaction originated.\n * @return _valid Whether or not the gas limit is valid.\n */\n function _isValidGasLimit(\n uint256 _gasLimit,\n Lib_OVMCodec.QueueOrigin // _queueOrigin\n )\n view\n internal\n returns (\n bool _valid\n )\n {\n // Always have to be below the maximum gas limit.\n if (_gasLimit > gasMeterConfig.maxTransactionGasLimit) {\n return false;\n }\n\n // Always have to be above the minimum gas limit.\n if (_gasLimit < gasMeterConfig.minTransactionGasLimit) {\n return false;\n }\n\n // TEMPORARY: Gas metering is disabled for minnet.\n return true;\n // GasMetadataKey cumulativeGasKey;\n // GasMetadataKey prevEpochGasKey;\n // if (_queueOrigin == Lib_OVMCodec.QueueOrigin.SEQUENCER_QUEUE) {\n // cumulativeGasKey = GasMetadataKey.CUMULATIVE_SEQUENCER_QUEUE_GAS;\n // prevEpochGasKey = GasMetadataKey.PREV_EPOCH_SEQUENCER_QUEUE_GAS;\n // } else {\n // cumulativeGasKey = GasMetadataKey.CUMULATIVE_L1TOL2_QUEUE_GAS;\n // prevEpochGasKey = GasMetadataKey.PREV_EPOCH_L1TOL2_QUEUE_GAS;\n // }\n\n // return (\n // (\n // _getGasMetadata(cumulativeGasKey)\n // - _getGasMetadata(prevEpochGasKey)\n // + _gasLimit\n // ) < gasMeterConfig.maxGasPerQueuePerEpoch\n // );\n }\n\n /**\n * Updates the cumulative gas after a transaction.\n * @param _gasUsed Gas used by the transaction.\n * @param _queueOrigin Queue from which the transaction originated.\n */\n function _updateCumulativeGas(\n uint256 _gasUsed,\n Lib_OVMCodec.QueueOrigin _queueOrigin\n )\n internal\n {\n GasMetadataKey cumulativeGasKey;\n if (_queueOrigin == Lib_OVMCodec.QueueOrigin.SEQUENCER_QUEUE) {\n cumulativeGasKey = GasMetadataKey.CUMULATIVE_SEQUENCER_QUEUE_GAS;\n } else {\n cumulativeGasKey = GasMetadataKey.CUMULATIVE_L1TOL2_QUEUE_GAS;\n }\n\n _putGasMetadata(\n cumulativeGasKey,\n (\n _getGasMetadata(cumulativeGasKey)\n + gasMeterConfig.minTransactionGasLimit\n + _gasUsed\n - transactionRecord.ovmGasRefund\n )\n );\n }\n\n /**\n * Retrieves the value of a gas metadata key.\n * @param _key Gas metadata key to retrieve.\n * @return _value Value stored at the given key.\n */\n function _getGasMetadata(\n GasMetadataKey _key\n )\n internal\n returns (\n uint256 _value\n )\n {\n return uint256(_getContractStorage(\n GAS_METADATA_ADDRESS,\n bytes32(uint256(_key))\n ));\n }\n\n /**\n * Sets the value of a gas metadata key.\n * @param _key Gas metadata key to set.\n * @param _value Value to store at the given key.\n */\n function _putGasMetadata(\n GasMetadataKey _key,\n uint256 _value\n )\n internal\n {\n _putContractStorage(\n GAS_METADATA_ADDRESS,\n bytes32(uint256(_key)),\n bytes32(uint256(_value))\n );\n }\n\n\n /*****************************************\n * Internal Functions: Execution Context *\n *****************************************/\n\n /**\n * Swaps over to a new message context.\n * @param _prevMessageContext Context we're switching from.\n * @param _nextMessageContext Context we're switching to.\n */\n function _switchMessageContext(\n MessageContext memory _prevMessageContext,\n MessageContext memory _nextMessageContext\n )\n internal\n {\n // Avoid unnecessary the SSTORE.\n if (_prevMessageContext.ovmCALLER != _nextMessageContext.ovmCALLER) {\n messageContext.ovmCALLER = _nextMessageContext.ovmCALLER;\n }\n\n // Avoid unnecessary the SSTORE.\n if (_prevMessageContext.ovmADDRESS != _nextMessageContext.ovmADDRESS) {\n messageContext.ovmADDRESS = _nextMessageContext.ovmADDRESS;\n }\n\n // Avoid unnecessary the SSTORE.\n if (_prevMessageContext.isStatic != _nextMessageContext.isStatic) {\n messageContext.isStatic = _nextMessageContext.isStatic;\n }\n }\n\n /**\n * Initializes the execution context.\n * @param _transaction OVM transaction being executed.\n */\n function _initContext(\n Lib_OVMCodec.Transaction memory _transaction\n )\n internal\n {\n transactionContext.ovmTIMESTAMP = _transaction.timestamp;\n transactionContext.ovmNUMBER = _transaction.blockNumber;\n transactionContext.ovmTXGASLIMIT = _transaction.gasLimit;\n transactionContext.ovmL1QUEUEORIGIN = _transaction.l1QueueOrigin;\n transactionContext.ovmL1TXORIGIN = _transaction.l1TxOrigin;\n transactionContext.ovmGASLIMIT = gasMeterConfig.maxGasPerQueuePerEpoch;\n\n messageRecord.nuisanceGasLeft = _getNuisanceGasLimit(_transaction.gasLimit);\n }\n\n /**\n * Resets the transaction and message context.\n */\n function _resetContext()\n internal\n {\n transactionContext.ovmL1TXORIGIN = address(0);\n transactionContext.ovmTIMESTAMP = 0;\n transactionContext.ovmNUMBER = 0;\n transactionContext.ovmGASLIMIT = 0;\n transactionContext.ovmTXGASLIMIT = 0;\n transactionContext.ovmL1QUEUEORIGIN = Lib_OVMCodec.QueueOrigin.SEQUENCER_QUEUE;\n\n transactionRecord.ovmGasRefund = 0;\n\n messageContext.ovmCALLER = address(0);\n messageContext.ovmADDRESS = address(0);\n messageContext.isStatic = false;\n\n messageRecord.nuisanceGasLeft = 0;\n\n // Reset the ovmStateManager.\n ovmStateManager = iOVM_StateManager(address(0));\n }\n\n /*****************************\n * L2-only Helper Functions *\n *****************************/\n\n /**\n * Unreachable helper function for simulating eth_calls with an OVM message context.\n * This function will throw an exception in all cases other than when used as a custom entrypoint in L2 Geth to simulate eth_call.\n * @param _transaction the message transaction to simulate.\n * @param _from the OVM account the simulated call should be from.\n */\n function simulateMessage(\n Lib_OVMCodec.Transaction memory _transaction,\n address _from,\n iOVM_StateManager _ovmStateManager\n )\n external\n returns (\n bool,\n bytes memory\n )\n {\n // Prevent this call from having any effect unless in a custom-set VM frame\n require(msg.sender == address(0));\n\n ovmStateManager = _ovmStateManager;\n _initContext(_transaction);\n messageRecord.nuisanceGasLeft = uint(-1);\n\n messageContext.ovmADDRESS = _from;\n\n bool isCreate = _transaction.entrypoint == address(0);\n if (isCreate) {\n (address created, bytes memory revertData) = ovmCREATE(_transaction.data);\n if (created == address(0)) {\n return (false, revertData);\n } else {\n // The eth_call RPC endpoint for to = undefined will return the deployed bytecode\n // in the success case, differing from standard create messages.\n return (true, Lib_EthUtils.getCode(created));\n }\n } else {\n return ovmCALL(\n _transaction.gasLimit,\n _transaction.entrypoint,\n _transaction.data\n );\n }\n }\n}\n" - }, - "contracts/optimistic-ethereum/libraries/resolver/Lib_AddressResolver.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Library Imports */\nimport { Lib_AddressManager } from \"./Lib_AddressManager.sol\";\n\n/**\n * @title Lib_AddressResolver\n */\nabstract contract Lib_AddressResolver {\n\n /*******************************************\n * Contract Variables: Contract References *\n *******************************************/\n\n Lib_AddressManager public libAddressManager;\n\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Lib_AddressManager.\n */\n constructor(\n address _libAddressManager\n ) {\n libAddressManager = Lib_AddressManager(_libAddressManager);\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n function resolve(\n string memory _name\n )\n public\n view\n returns (\n address _contract\n )\n {\n return libAddressManager.getAddress(_name);\n }\n}\n" - }, - "contracts/optimistic-ethereum/libraries/utils/Lib_EthUtils.sol": { - "content": "// SPDX-License-Identifier: MIT\n// @unsupported: ovm\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_RLPWriter } from \"../rlp/Lib_RLPWriter.sol\";\nimport { Lib_Bytes32Utils } from \"./Lib_Bytes32Utils.sol\";\n\n/**\n * @title Lib_EthUtils\n */\nlibrary Lib_EthUtils {\n\n /***********************************\n * Internal Functions: Code Access *\n ***********************************/\n\n /**\n * Gets the code for a given address.\n * @param _address Address to get code for.\n * @param _offset Offset to start reading from.\n * @param _length Number of bytes to read.\n * @return _code Code read from the contract.\n */\n function getCode(\n address _address,\n uint256 _offset,\n uint256 _length\n )\n internal\n view\n returns (\n bytes memory _code\n )\n {\n assembly {\n _code := mload(0x40)\n mstore(0x40, add(_code, add(_length, 0x20)))\n mstore(_code, _length)\n extcodecopy(_address, add(_code, 0x20), _offset, _length)\n }\n\n return _code;\n }\n\n /**\n * Gets the full code for a given address.\n * @param _address Address to get code for.\n * @return _code Full code of the contract.\n */\n function getCode(\n address _address\n )\n internal\n view\n returns (\n bytes memory _code\n )\n {\n return getCode(\n _address,\n 0,\n getCodeSize(_address)\n );\n }\n\n /**\n * Gets the size of a contract's code in bytes.\n * @param _address Address to get code size for.\n * @return _codeSize Size of the contract's code in bytes.\n */\n function getCodeSize(\n address _address\n )\n internal\n view\n returns (\n uint256 _codeSize\n )\n {\n assembly {\n _codeSize := extcodesize(_address)\n }\n\n return _codeSize;\n }\n\n /**\n * Gets the hash of a contract's code.\n * @param _address Address to get a code hash for.\n * @return _codeHash Hash of the contract's code.\n */\n function getCodeHash(\n address _address\n )\n internal\n view\n returns (\n bytes32 _codeHash\n )\n {\n assembly {\n _codeHash := extcodehash(_address)\n }\n\n return _codeHash;\n }\n\n\n /*****************************************\n * Internal Functions: Contract Creation *\n *****************************************/\n\n /**\n * Creates a contract with some given initialization code.\n * @param _code Contract initialization code.\n * @return _created Address of the created contract.\n */\n function createContract(\n bytes memory _code\n )\n internal\n returns (\n address _created\n )\n {\n assembly {\n _created := create(\n 0,\n add(_code, 0x20),\n mload(_code)\n )\n }\n\n return _created;\n }\n\n /**\n * Computes the address that would be generated by CREATE.\n * @param _creator Address creating the contract.\n * @param _nonce Creator's nonce.\n * @return _address Address to be generated by CREATE.\n */\n function getAddressForCREATE(\n address _creator,\n uint256 _nonce\n )\n internal\n pure\n returns (\n address _address\n )\n {\n bytes[] memory encoded = new bytes[](2);\n encoded[0] = Lib_RLPWriter.writeAddress(_creator);\n encoded[1] = Lib_RLPWriter.writeUint(_nonce);\n\n bytes memory encodedList = Lib_RLPWriter.writeList(encoded);\n return Lib_Bytes32Utils.toAddress(keccak256(encodedList));\n }\n\n /**\n * Computes the address that would be generated by CREATE2.\n * @param _creator Address creating the contract.\n * @param _bytecode Bytecode of the contract to be created.\n * @param _salt 32 byte salt value mixed into the hash.\n * @return _address Address to be generated by CREATE2.\n */\n function getAddressForCREATE2(\n address _creator,\n bytes memory _bytecode,\n bytes32 _salt\n )\n internal\n pure\n returns (address _address)\n {\n bytes32 hashedData = keccak256(abi.encodePacked(\n byte(0xff),\n _creator,\n _salt,\n keccak256(_bytecode)\n ));\n\n return Lib_Bytes32Utils.toAddress(hashedData);\n }\n}\n" - }, - "contracts/optimistic-ethereum/iOVM/execution/iOVM_ExecutionManager.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\ninterface iOVM_ExecutionManager {\n /**********\n * Enums *\n *********/\n\n enum RevertFlag {\n OUT_OF_GAS,\n INTENTIONAL_REVERT,\n EXCEEDS_NUISANCE_GAS,\n INVALID_STATE_ACCESS,\n UNSAFE_BYTECODE,\n CREATE_COLLISION,\n STATIC_VIOLATION,\n CREATOR_NOT_ALLOWED\n }\n\n enum GasMetadataKey {\n CURRENT_EPOCH_START_TIMESTAMP,\n CUMULATIVE_SEQUENCER_QUEUE_GAS,\n CUMULATIVE_L1TOL2_QUEUE_GAS,\n PREV_EPOCH_SEQUENCER_QUEUE_GAS,\n PREV_EPOCH_L1TOL2_QUEUE_GAS\n }\n\n /***********\n * Structs *\n ***********/\n\n struct GasMeterConfig {\n uint256 minTransactionGasLimit;\n uint256 maxTransactionGasLimit;\n uint256 maxGasPerQueuePerEpoch;\n uint256 secondsPerEpoch;\n }\n\n struct GlobalContext {\n uint256 ovmCHAINID;\n }\n\n struct TransactionContext {\n Lib_OVMCodec.QueueOrigin ovmL1QUEUEORIGIN;\n uint256 ovmTIMESTAMP;\n uint256 ovmNUMBER;\n uint256 ovmGASLIMIT;\n uint256 ovmTXGASLIMIT;\n address ovmL1TXORIGIN;\n }\n\n struct TransactionRecord {\n uint256 ovmGasRefund;\n }\n\n struct MessageContext {\n address ovmCALLER;\n address ovmADDRESS;\n bool isStatic;\n }\n\n struct MessageRecord {\n uint256 nuisanceGasLeft;\n }\n\n\n /************************************\n * Transaction Execution Entrypoint *\n ************************************/\n\n function run(\n Lib_OVMCodec.Transaction calldata _transaction,\n address _txStateManager\n ) external;\n\n\n /*******************\n * Context Opcodes *\n *******************/\n\n function ovmCALLER() external view returns (address _caller);\n function ovmADDRESS() external view returns (address _address);\n function ovmTIMESTAMP() external view returns (uint256 _timestamp);\n function ovmNUMBER() external view returns (uint256 _number);\n function ovmGASLIMIT() external view returns (uint256 _gasLimit);\n function ovmCHAINID() external view returns (uint256 _chainId);\n\n\n /**********************\n * L2 Context Opcodes *\n **********************/\n\n function ovmL1QUEUEORIGIN() external view returns (Lib_OVMCodec.QueueOrigin _queueOrigin);\n function ovmL1TXORIGIN() external view returns (address _l1TxOrigin);\n\n\n /*******************\n * Halting Opcodes *\n *******************/\n\n function ovmREVERT(bytes memory _data) external;\n\n\n /*****************************\n * Contract Creation Opcodes *\n *****************************/\n\n function ovmCREATE(bytes memory _bytecode) external returns (address _contract, bytes memory _revertdata);\n function ovmCREATE2(bytes memory _bytecode, bytes32 _salt) external returns (address _contract, bytes memory _revertdata);\n\n\n /*******************************\n * Account Abstraction Opcodes *\n ******************************/\n\n function ovmGETNONCE() external returns (uint256 _nonce);\n function ovmINCREMENTNONCE() external;\n function ovmCREATEEOA(bytes32 _messageHash, uint8 _v, bytes32 _r, bytes32 _s) external;\n\n\n /****************************\n * Contract Calling Opcodes *\n ****************************/\n\n function ovmCALL(uint256 _gasLimit, address _address, bytes memory _calldata) external returns (bool _success, bytes memory _returndata);\n function ovmSTATICCALL(uint256 _gasLimit, address _address, bytes memory _calldata) external returns (bool _success, bytes memory _returndata);\n function ovmDELEGATECALL(uint256 _gasLimit, address _address, bytes memory _calldata) external returns (bool _success, bytes memory _returndata);\n\n\n /****************************\n * Contract Storage Opcodes *\n ****************************/\n\n function ovmSLOAD(bytes32 _key) external returns (bytes32 _value);\n function ovmSSTORE(bytes32 _key, bytes32 _value) external;\n\n\n /*************************\n * Contract Code Opcodes *\n *************************/\n\n function ovmEXTCODECOPY(address _contract, uint256 _offset, uint256 _length) external returns (bytes memory _code);\n function ovmEXTCODESIZE(address _contract) external returns (uint256 _size);\n function ovmEXTCODEHASH(address _contract) external returns (bytes32 _hash);\n\n\n /***************************************\n * Public Functions: Execution Context *\n ***************************************/\n\n function getMaxTransactionGasLimit() external view returns (uint _maxTransactionGasLimit);\n}\n" - }, - "contracts/optimistic-ethereum/iOVM/execution/iOVM_StateManager.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/**\n * @title iOVM_StateManager\n */\ninterface iOVM_StateManager {\n\n /*******************\n * Data Structures *\n *******************/\n\n enum ItemState {\n ITEM_UNTOUCHED,\n ITEM_LOADED,\n ITEM_CHANGED,\n ITEM_COMMITTED\n }\n\n /***************************\n * Public Functions: Misc *\n ***************************/\n\n function isAuthenticated(address _address) external view returns (bool);\n\n /***************************\n * Public Functions: Setup *\n ***************************/\n\n function owner() external view returns (address _owner);\n function ovmExecutionManager() external view returns (address _ovmExecutionManager);\n function setExecutionManager(address _ovmExecutionManager) external;\n\n\n /************************************\n * Public Functions: Account Access *\n ************************************/\n\n function putAccount(address _address, Lib_OVMCodec.Account memory _account) external;\n function putEmptyAccount(address _address) external;\n function getAccount(address _address) external view returns (Lib_OVMCodec.Account memory _account);\n function hasAccount(address _address) external view returns (bool _exists);\n function hasEmptyAccount(address _address) external view returns (bool _exists);\n function setAccountNonce(address _address, uint256 _nonce) external;\n function getAccountNonce(address _address) external view returns (uint256 _nonce);\n function getAccountEthAddress(address _address) external view returns (address _ethAddress);\n function getAccountStorageRoot(address _address) external view returns (bytes32 _storageRoot);\n function initPendingAccount(address _address) external;\n function commitPendingAccount(address _address, address _ethAddress, bytes32 _codeHash) external;\n function testAndSetAccountLoaded(address _address) external returns (bool _wasAccountAlreadyLoaded);\n function testAndSetAccountChanged(address _address) external returns (bool _wasAccountAlreadyChanged);\n function commitAccount(address _address) external returns (bool _wasAccountCommitted);\n function incrementTotalUncommittedAccounts() external;\n function getTotalUncommittedAccounts() external view returns (uint256 _total);\n function wasAccountChanged(address _address) external view returns (bool);\n function wasAccountCommitted(address _address) external view returns (bool);\n\n\n /************************************\n * Public Functions: Storage Access *\n ************************************/\n\n function putContractStorage(address _contract, bytes32 _key, bytes32 _value) external;\n function getContractStorage(address _contract, bytes32 _key) external view returns (bytes32 _value);\n function hasContractStorage(address _contract, bytes32 _key) external view returns (bool _exists);\n function testAndSetContractStorageLoaded(address _contract, bytes32 _key) external returns (bool _wasContractStorageAlreadyLoaded);\n function testAndSetContractStorageChanged(address _contract, bytes32 _key) external returns (bool _wasContractStorageAlreadyChanged);\n function commitContractStorage(address _contract, bytes32 _key) external returns (bool _wasContractStorageCommitted);\n function incrementTotalUncommittedContractStorage() external;\n function getTotalUncommittedContractStorage() external view returns (uint256 _total);\n function wasContractStorageChanged(address _contract, bytes32 _key) external view returns (bool);\n function wasContractStorageCommitted(address _contract, bytes32 _key) external view returns (bool);\n}\n" - }, - "contracts/optimistic-ethereum/iOVM/execution/iOVM_SafetyChecker.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/**\n * @title iOVM_SafetyChecker\n */\ninterface iOVM_SafetyChecker {\n\n /********************\n * Public Functions *\n ********************/\n\n function isBytecodeSafe(bytes calldata _bytecode) external pure returns (bool);\n}\n" - }, - "contracts/optimistic-ethereum/OVM/accounts/OVM_ProxyEOA.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Library Imports */\nimport { Lib_Bytes32Utils } from \"../../libraries/utils/Lib_Bytes32Utils.sol\";\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_ECDSAUtils } from \"../../libraries/utils/Lib_ECDSAUtils.sol\";\nimport { Lib_SafeExecutionManagerWrapper } from \"../../libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\";\n\n/**\n * @title OVM_ProxyEOA\n * @dev The Proxy EOA contract uses a delegate call to execute the logic in an implementation contract.\n * In combination with the logic implemented in the ECDSA Contract Account, this enables a form of upgradable \n * 'account abstraction' on layer 2. \n * \n * Compiler used: solc\n * Runtime target: OVM\n */\ncontract OVM_ProxyEOA {\n\n /*************\n * Constants *\n *************/\n\n bytes32 constant IMPLEMENTATION_KEY = 0xdeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddead;\n\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _implementation Address of the initial implementation contract.\n */\n constructor(\n address _implementation\n )\n {\n _setImplementation(_implementation);\n }\n\n\n /*********************\n * Fallback Function *\n *********************/\n\n fallback()\n external\n {\n (bool success, bytes memory returndata) = Lib_SafeExecutionManagerWrapper.safeDELEGATECALL(\n gasleft(),\n getImplementation(),\n msg.data\n );\n\n if (success) {\n assembly {\n return(add(returndata, 0x20), mload(returndata))\n }\n } else {\n Lib_SafeExecutionManagerWrapper.safeREVERT(\n string(returndata)\n );\n }\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Changes the implementation address.\n * @param _implementation New implementation address.\n */\n function upgrade(\n address _implementation\n )\n external\n {\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(\n Lib_SafeExecutionManagerWrapper.safeADDRESS() == Lib_SafeExecutionManagerWrapper.safeCALLER(),\n \"EOAs can only upgrade their own EOA implementation\"\n );\n\n _setImplementation(_implementation);\n }\n\n /**\n * Gets the address of the current implementation.\n * @return Current implementation address.\n */\n function getImplementation()\n public\n returns (\n address\n )\n {\n return Lib_Bytes32Utils.toAddress(\n Lib_SafeExecutionManagerWrapper.safeSLOAD(\n IMPLEMENTATION_KEY\n )\n );\n }\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n function _setImplementation(\n address _implementation\n )\n internal\n {\n Lib_SafeExecutionManagerWrapper.safeSSTORE(\n IMPLEMENTATION_KEY,\n Lib_Bytes32Utils.fromAddress(_implementation)\n );\n }\n}\n" - }, - "contracts/optimistic-ethereum/OVM/predeploys/OVM_DeployerWhitelist.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Library Imports */\nimport { Lib_Bytes32Utils } from \"../../libraries/utils/Lib_Bytes32Utils.sol\";\n\n/* Interface Imports */\nimport { iOVM_DeployerWhitelist } from \"../../iOVM/predeploys/iOVM_DeployerWhitelist.sol\";\nimport { Lib_SafeExecutionManagerWrapper } from \"../../libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\";\n\n/**\n * @title OVM_DeployerWhitelist\n * @dev The Deployer Whitelist is a temporary predeploy used to provide additional safety during the\n * initial phases of our mainnet roll out. It is owned by the Optimism team, and defines accounts\n * which are allowed to deploy contracts on Layer2. The Execution Manager will only allow an \n * ovmCREATE or ovmCREATE2 operation to proceed if the deployer's address whitelisted.\n * \n * Compiler used: solc\n * Runtime target: OVM\n */\ncontract OVM_DeployerWhitelist is iOVM_DeployerWhitelist {\n\n /**********************\n * Contract Constants *\n **********************/\n\n bytes32 internal constant KEY_INITIALIZED = 0x0000000000000000000000000000000000000000000000000000000000000010;\n bytes32 internal constant KEY_OWNER = 0x0000000000000000000000000000000000000000000000000000000000000011;\n bytes32 internal constant KEY_ALLOW_ARBITRARY_DEPLOYMENT = 0x0000000000000000000000000000000000000000000000000000000000000012;\n\n\n /**********************\n * Function Modifiers *\n **********************/\n \n /**\n * Blocks functions to anyone except the contract owner.\n */\n modifier onlyOwner() {\n address owner = Lib_Bytes32Utils.toAddress(\n Lib_SafeExecutionManagerWrapper.safeSLOAD(\n KEY_OWNER\n )\n );\n\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(\n Lib_SafeExecutionManagerWrapper.safeCALLER() == owner,\n \"Function can only be called by the owner of this contract.\"\n );\n _;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n \n /**\n * Initializes the whitelist.\n * @param _owner Address of the owner for this contract.\n * @param _allowArbitraryDeployment Whether or not to allow arbitrary contract deployment.\n */\n function initialize(\n address _owner,\n bool _allowArbitraryDeployment\n )\n override\n public\n {\n bool initialized = Lib_Bytes32Utils.toBool(\n Lib_SafeExecutionManagerWrapper.safeSLOAD(KEY_INITIALIZED)\n );\n\n if (initialized == true) {\n return;\n }\n\n Lib_SafeExecutionManagerWrapper.safeSSTORE(\n KEY_INITIALIZED,\n Lib_Bytes32Utils.fromBool(true)\n );\n Lib_SafeExecutionManagerWrapper.safeSSTORE(\n KEY_OWNER,\n Lib_Bytes32Utils.fromAddress(_owner)\n );\n Lib_SafeExecutionManagerWrapper.safeSSTORE(\n KEY_ALLOW_ARBITRARY_DEPLOYMENT,\n Lib_Bytes32Utils.fromBool(_allowArbitraryDeployment)\n );\n }\n\n /**\n * Gets the owner of the whitelist.\n */\n function getOwner()\n override\n public\n returns(\n address\n )\n {\n return Lib_Bytes32Utils.toAddress(\n Lib_SafeExecutionManagerWrapper.safeSLOAD(\n KEY_OWNER\n )\n );\n }\n\n /**\n * Adds or removes an address from the deployment whitelist.\n * @param _deployer Address to update permissions for.\n * @param _isWhitelisted Whether or not the address is whitelisted.\n */\n function setWhitelistedDeployer(\n address _deployer,\n bool _isWhitelisted\n )\n override\n public\n onlyOwner\n {\n Lib_SafeExecutionManagerWrapper.safeSSTORE(\n Lib_Bytes32Utils.fromAddress(_deployer),\n Lib_Bytes32Utils.fromBool(_isWhitelisted)\n );\n }\n\n /**\n * Updates the owner of this contract.\n * @param _owner Address of the new owner.\n */\n function setOwner(\n address _owner\n )\n override\n public\n onlyOwner\n {\n Lib_SafeExecutionManagerWrapper.safeSSTORE(\n KEY_OWNER,\n Lib_Bytes32Utils.fromAddress(_owner)\n );\n }\n\n /**\n * Updates the arbitrary deployment flag.\n * @param _allowArbitraryDeployment Whether or not to allow arbitrary contract deployment.\n */\n function setAllowArbitraryDeployment(\n bool _allowArbitraryDeployment\n )\n override\n public\n onlyOwner\n {\n Lib_SafeExecutionManagerWrapper.safeSSTORE(\n KEY_ALLOW_ARBITRARY_DEPLOYMENT,\n Lib_Bytes32Utils.fromBool(_allowArbitraryDeployment)\n );\n }\n\n /**\n * Permanently enables arbitrary contract deployment and deletes the owner.\n */\n function enableArbitraryContractDeployment()\n override\n public\n onlyOwner\n {\n setAllowArbitraryDeployment(true);\n setOwner(address(0));\n }\n\n /**\n * Checks whether an address is allowed to deploy contracts.\n * @param _deployer Address to check.\n * @return _allowed Whether or not the address can deploy contracts.\n */\n function isDeployerAllowed(\n address _deployer\n )\n override\n public\n returns (\n bool _allowed\n )\n {\n bool initialized = Lib_Bytes32Utils.toBool(\n Lib_SafeExecutionManagerWrapper.safeSLOAD(KEY_INITIALIZED)\n );\n\n if (initialized == false) {\n return true;\n }\n\n bool allowArbitraryDeployment = Lib_Bytes32Utils.toBool(\n Lib_SafeExecutionManagerWrapper.safeSLOAD(KEY_ALLOW_ARBITRARY_DEPLOYMENT)\n );\n\n if (allowArbitraryDeployment == true) {\n return true;\n }\n\n bool isWhitelisted = Lib_Bytes32Utils.toBool(\n Lib_SafeExecutionManagerWrapper.safeSLOAD(\n Lib_Bytes32Utils.fromAddress(_deployer)\n )\n );\n\n return isWhitelisted; \n }\n}\n" - }, - "contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Contract Imports */\nimport { Ownable } from \"./Lib_Ownable.sol\";\n\n/**\n * @title Lib_AddressManager\n */\ncontract Lib_AddressManager is Ownable {\n\n /**********\n * Events *\n **********/\n\n event AddressSet(\n string _name,\n address _newAddress\n );\n\n /*******************************************\n * Contract Variables: Internal Accounting *\n *******************************************/\n\n mapping (bytes32 => address) private addresses;\n\n\n /********************\n * Public Functions *\n ********************/\n\n function setAddress(\n string memory _name,\n address _address\n )\n public\n onlyOwner\n {\n emit AddressSet(_name, _address);\n addresses[_getNameHash(_name)] = _address;\n }\n\n function getAddress(\n string memory _name\n )\n public\n view\n returns (address)\n {\n return addresses[_getNameHash(_name)];\n }\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n function _getNameHash(\n string memory _name\n )\n internal\n pure\n returns (\n bytes32 _hash\n )\n {\n return keccak256(abi.encodePacked(_name));\n }\n}\n" - }, - "contracts/optimistic-ethereum/libraries/resolver/Lib_Ownable.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/**\n * @title Ownable\n * @dev Adapted from https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol\n */\nabstract contract Ownable {\n\n /*************\n * Variables *\n *************/\n\n address public owner;\n\n\n /**********\n * Events *\n **********/\n\n event OwnershipTransferred(\n address indexed previousOwner,\n address indexed newOwner\n );\n\n\n /***************\n * Constructor *\n ***************/\n\n constructor() {\n owner = msg.sender;\n emit OwnershipTransferred(address(0), owner);\n }\n\n\n /**********************\n * Function Modifiers *\n **********************/\n\n modifier onlyOwner() {\n require(\n owner == msg.sender,\n \"Ownable: caller is not the owner\"\n );\n _;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n function renounceOwnership()\n public\n virtual\n onlyOwner\n {\n emit OwnershipTransferred(owner, address(0));\n owner = address(0);\n }\n\n function transferOwnership(address _newOwner)\n public\n virtual\n onlyOwner\n {\n require(\n _newOwner != address(0),\n \"Ownable: new owner cannot be the zero address\"\n );\n\n emit OwnershipTransferred(owner, _newOwner);\n owner = _newOwner;\n }\n}\n" - }, - "contracts/optimistic-ethereum/iOVM/predeploys/iOVM_DeployerWhitelist.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/**\n * @title iOVM_DeployerWhitelist\n */\ninterface iOVM_DeployerWhitelist {\n\n /********************\n * Public Functions *\n ********************/\n\n function initialize(address _owner, bool _allowArbitraryDeployment) external;\n function getOwner() external returns (address _owner);\n function setWhitelistedDeployer(address _deployer, bool _isWhitelisted) external;\n function setOwner(address _newOwner) external;\n function setAllowArbitraryDeployment(bool _allowArbitraryDeployment) external;\n function enableArbitraryContractDeployment() external;\n function isDeployerAllowed(address _deployer) external returns (bool _allowed);\n}\n" - }, - "contracts/optimistic-ethereum/OVM/predeploys/OVM_SequencerEntrypoint.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Library Imports */\nimport { Lib_BytesUtils } from \"../../libraries/utils/Lib_BytesUtils.sol\";\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_ECDSAUtils } from \"../../libraries/utils/Lib_ECDSAUtils.sol\";\nimport { Lib_SafeExecutionManagerWrapper } from \"../../libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\";\n\n/**\n * @title OVM_SequencerEntrypoint\n * @dev The Sequencer Entrypoint is a predeploy which, despite its name, can in fact be called by \n * any account. It accepts a more efficient compressed calldata format, which it decompresses and \n * encodes to the standard EIP155 transaction format.\n * This contract is the implementation referenced by the Proxy Sequencer Entrypoint, thus enabling\n * the Optimism team to upgrade the decompression of calldata from the Sequencer.\n * \n * Compiler used: solc\n * Runtime target: OVM\n */\ncontract OVM_SequencerEntrypoint {\n\n /*********\n * Enums *\n *********/\n \n enum TransactionType {\n NATIVE_ETH_TRANSACTION,\n ETH_SIGNED_MESSAGE\n }\n\n\n /*********************\n * Fallback Function *\n *********************/\n\n /**\n * Uses a custom \"compressed\" format to save on calldata gas:\n * calldata[00:01]: transaction type (0 == EIP 155, 2 == Eth Sign Message)\n * calldata[01:33]: signature \"r\" parameter\n * calldata[33:65]: signature \"s\" parameter\n * calldata[65:66]: signature \"v\" parameter\n * calldata[66:69]: transaction gas limit\n * calldata[69:72]: transaction gas price\n * calldata[72:75]: transaction nonce\n * calldata[75:95]: transaction target address\n * calldata[95:XX]: transaction data\n */\n fallback()\n external\n {\n TransactionType transactionType = _getTransactionType(Lib_BytesUtils.toUint8(msg.data, 0));\n\n bytes32 r = Lib_BytesUtils.toBytes32(Lib_BytesUtils.slice(msg.data, 1, 32));\n bytes32 s = Lib_BytesUtils.toBytes32(Lib_BytesUtils.slice(msg.data, 33, 32));\n uint8 v = Lib_BytesUtils.toUint8(msg.data, 65);\n\n // Remainder is the transaction to execute.\n bytes memory compressedTx = Lib_BytesUtils.slice(msg.data, 66);\n bool isEthSignedMessage = transactionType == TransactionType.ETH_SIGNED_MESSAGE;\n\n // Need to decompress and then re-encode the transaction based on the original encoding.\n bytes memory encodedTx = Lib_OVMCodec.encodeEIP155Transaction(\n Lib_OVMCodec.decompressEIP155Transaction(compressedTx),\n isEthSignedMessage\n );\n\n address target = Lib_ECDSAUtils.recover(\n encodedTx,\n isEthSignedMessage,\n uint8(v),\n r,\n s\n );\n\n if (Lib_SafeExecutionManagerWrapper.safeEXTCODESIZE(target) == 0) {\n // ProxyEOA has not yet been deployed for this EOA.\n bytes32 messageHash = Lib_ECDSAUtils.getMessageHash(encodedTx, isEthSignedMessage);\n Lib_SafeExecutionManagerWrapper.safeCREATEEOA(messageHash, uint8(v), r, s);\n }\n\n // ProxyEOA has been deployed for this EOA, continue to CALL.\n bytes memory callbytes = abi.encodeWithSignature(\n \"execute(bytes,uint8,uint8,bytes32,bytes32)\",\n encodedTx,\n isEthSignedMessage,\n uint8(v),\n r,\n s\n );\n\n Lib_SafeExecutionManagerWrapper.safeCALL(\n gasleft(),\n target,\n callbytes\n );\n }\n \n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Converts a uint256 into a TransactionType enum.\n * @param _transactionType Transaction type index.\n * @return _txType Transaction type enum value.\n */\n function _getTransactionType(\n uint8 _transactionType\n )\n internal\n returns (\n TransactionType _txType\n )\n {\n if (_transactionType == 0) {\n return TransactionType.NATIVE_ETH_TRANSACTION;\n } if (_transactionType == 2) {\n return TransactionType.ETH_SIGNED_MESSAGE;\n } else {\n Lib_SafeExecutionManagerWrapper.safeREVERT(\n \"Transaction type must be 0 or 2\"\n );\n }\n }\n}\n" - }, - "contracts/test-libraries/utils/TestLib_ECDSAUtils.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Library Imports */\nimport { Lib_ECDSAUtils } from \"../../optimistic-ethereum/libraries/utils/Lib_ECDSAUtils.sol\";\n\n/**\n * @title TestLib_ECDSAUtils\n */\ncontract TestLib_ECDSAUtils {\n\n function recover(\n bytes memory _message,\n bool _isEthSignedMessage,\n uint8 _v,\n bytes32 _r,\n bytes32 _s\n )\n public\n pure\n returns (\n address _sender\n )\n {\n return Lib_ECDSAUtils.recover(\n _message,\n _isEthSignedMessage,\n _v,\n _r,\n _s\n );\n }\n}\n" - }, - "contracts/test-libraries/codec/TestLib_OVMCodec.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../optimistic-ethereum/libraries/codec/Lib_OVMCodec.sol\";\n\n/**\n * @title TestLib_OVMCodec\n */\ncontract TestLib_OVMCodec {\n\n function decodeEIP155Transaction(\n bytes memory _transaction,\n bool _isEthSignedMessage\n )\n public\n pure\n returns (\n Lib_OVMCodec.EIP155Transaction memory _decoded\n )\n {\n return Lib_OVMCodec.decodeEIP155Transaction(_transaction, _isEthSignedMessage);\n }\n\n function encodeTransaction(\n Lib_OVMCodec.Transaction memory _transaction\n )\n public\n pure\n returns (\n bytes memory _encoded\n )\n {\n return Lib_OVMCodec.encodeTransaction(_transaction);\n }\n\n function hashTransaction(\n Lib_OVMCodec.Transaction memory _transaction\n )\n public\n pure\n returns (\n bytes32 _hash\n )\n {\n return Lib_OVMCodec.hashTransaction(_transaction);\n }\n\n function decompressEIP155Transaction(\n bytes memory _transaction\n )\n public\n returns (\n Lib_OVMCodec.EIP155Transaction memory _decompressed\n )\n {\n return Lib_OVMCodec.decompressEIP155Transaction(_transaction);\n }\n}\n" - }, - "contracts/optimistic-ethereum/OVM/verification/OVM_StateTransitioner.sol": { - "content": "// SPDX-License-Identifier: MIT\n// @unsupported: ovm\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\nimport { Lib_EthUtils } from \"../../libraries/utils/Lib_EthUtils.sol\";\nimport { Lib_Bytes32Utils } from \"../../libraries/utils/Lib_Bytes32Utils.sol\";\nimport { Lib_BytesUtils } from \"../../libraries/utils/Lib_BytesUtils.sol\";\nimport { Lib_SecureMerkleTrie } from \"../../libraries/trie/Lib_SecureMerkleTrie.sol\";\nimport { Lib_RLPWriter } from \"../../libraries/rlp/Lib_RLPWriter.sol\";\nimport { Lib_RLPReader } from \"../../libraries/rlp/Lib_RLPReader.sol\";\n\n/* Interface Imports */\nimport { iOVM_StateTransitioner } from \"../../iOVM/verification/iOVM_StateTransitioner.sol\";\nimport { iOVM_BondManager } from \"../../iOVM/verification/iOVM_BondManager.sol\";\nimport { iOVM_ExecutionManager } from \"../../iOVM/execution/iOVM_ExecutionManager.sol\";\nimport { iOVM_StateManager } from \"../../iOVM/execution/iOVM_StateManager.sol\";\nimport { iOVM_StateManagerFactory } from \"../../iOVM/execution/iOVM_StateManagerFactory.sol\";\n\n/* Contract Imports */\nimport { Abs_FraudContributor } from \"./Abs_FraudContributor.sol\";\n\n/**\n * @title OVM_StateTransitioner\n * @dev The State Transitioner coordinates the execution of a state transition during the evaluation of a\n * fraud proof. It feeds verified input to the Execution Manager's run(), and controls a State Manager (which is\n * uniquely created for each fraud proof).\n * Once a fraud proof has been initialized, this contract is provided with the pre-state root and verifies\n * that the OVM storage slots committed to the State Mangager are contained in that state\n * This contract controls the State Manager and Execution Manager, and uses them to calculate the\n * post-state root by applying the transaction. The Fraud Verifier can then check for fraud by comparing\n * the calculated post-state root with the proposed post-state root.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract OVM_StateTransitioner is Lib_AddressResolver, Abs_FraudContributor, iOVM_StateTransitioner {\n\n /*******************\n * Data Structures *\n *******************/\n\n enum TransitionPhase {\n PRE_EXECUTION,\n POST_EXECUTION,\n COMPLETE\n }\n\n\n /*******************************************\n * Contract Variables: Contract References *\n *******************************************/\n\n iOVM_StateManager public ovmStateManager;\n\n\n /*******************************************\n * Contract Variables: Internal Accounting *\n *******************************************/\n\n bytes32 internal preStateRoot;\n bytes32 internal postStateRoot;\n TransitionPhase public phase;\n uint256 internal stateTransitionIndex;\n bytes32 internal transactionHash;\n\n\n /*************\n * Constants *\n *************/\n\n bytes32 internal constant EMPTY_ACCOUNT_CODE_HASH = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;\n bytes32 internal constant EMPTY_ACCOUNT_STORAGE_ROOT = 0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421;\n\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n * @param _stateTransitionIndex Index of the state transition being verified.\n * @param _preStateRoot State root before the transition was executed.\n * @param _transactionHash Hash of the executed transaction.\n */\n constructor(\n address _libAddressManager,\n uint256 _stateTransitionIndex,\n bytes32 _preStateRoot,\n bytes32 _transactionHash\n )\n Lib_AddressResolver(_libAddressManager)\n {\n stateTransitionIndex = _stateTransitionIndex;\n preStateRoot = _preStateRoot;\n postStateRoot = _preStateRoot;\n transactionHash = _transactionHash;\n\n ovmStateManager = iOVM_StateManagerFactory(resolve(\"OVM_StateManagerFactory\")).create(address(this));\n }\n\n\n /**********************\n * Function Modifiers *\n **********************/\n\n /**\n * Checks that a function is only run during a specific phase.\n * @param _phase Phase the function must run within.\n */\n modifier onlyDuringPhase(\n TransitionPhase _phase\n ) {\n require(\n phase == _phase,\n \"Function must be called during the correct phase.\"\n );\n _;\n }\n\n\n /**********************************\n * Public Functions: State Access *\n **********************************/\n\n /**\n * Retrieves the state root before execution.\n * @return _preStateRoot State root before execution.\n */\n function getPreStateRoot()\n override\n public\n view\n returns (\n bytes32 _preStateRoot\n )\n {\n return preStateRoot;\n }\n\n /**\n * Retrieves the state root after execution.\n * @return _postStateRoot State root after execution.\n */\n function getPostStateRoot()\n override\n public\n view\n returns (\n bytes32 _postStateRoot\n )\n {\n return postStateRoot;\n }\n\n /**\n * Checks whether the transitioner is complete.\n * @return _complete Whether or not the transition process is finished.\n */\n function isComplete()\n override\n public\n view\n returns (\n bool _complete\n )\n {\n return phase == TransitionPhase.COMPLETE;\n }\n\n\n /***********************************\n * Public Functions: Pre-Execution *\n ***********************************/\n\n /**\n * Allows a user to prove the initial state of a contract.\n * @param _ovmContractAddress Address of the contract on the OVM.\n * @param _ethContractAddress Address of the corresponding contract on L1.\n * @param _stateTrieWitness Proof of the account state.\n */\n function proveContractState(\n address _ovmContractAddress,\n address _ethContractAddress,\n bytes memory _stateTrieWitness\n )\n override\n public\n onlyDuringPhase(TransitionPhase.PRE_EXECUTION)\n contributesToFraudProof(preStateRoot, transactionHash)\n {\n // Exit quickly to avoid unnecessary work.\n require(\n (\n ovmStateManager.hasAccount(_ovmContractAddress) == false\n && ovmStateManager.hasEmptyAccount(_ovmContractAddress) == false\n ),\n \"Account state has already been proven.\"\n );\n\n // Function will fail if the proof is not a valid inclusion or exclusion proof.\n (\n bool exists,\n bytes memory encodedAccount\n ) = Lib_SecureMerkleTrie.get(\n abi.encodePacked(_ovmContractAddress),\n _stateTrieWitness,\n preStateRoot\n );\n\n if (exists == true) {\n // Account exists, this was an inclusion proof.\n Lib_OVMCodec.EVMAccount memory account = Lib_OVMCodec.decodeEVMAccount(\n encodedAccount\n );\n\n address ethContractAddress = _ethContractAddress;\n if (account.codeHash == EMPTY_ACCOUNT_CODE_HASH) {\n // Use a known empty contract to prevent an attack in which a user provides a\n // contract address here and then later deploys code to it.\n ethContractAddress = 0x0000000000000000000000000000000000000000;\n } else {\n // Otherwise, make sure that the code at the provided eth address matches the hash\n // of the code stored on L2.\n require(\n Lib_EthUtils.getCodeHash(ethContractAddress) == account.codeHash,\n \"OVM_StateTransitioner: Provided L1 contract code hash does not match L2 contract code hash.\"\n );\n }\n\n ovmStateManager.putAccount(\n _ovmContractAddress,\n Lib_OVMCodec.Account({\n nonce: account.nonce,\n balance: account.balance,\n storageRoot: account.storageRoot,\n codeHash: account.codeHash,\n ethAddress: ethContractAddress,\n isFresh: false\n })\n );\n } else {\n // Account does not exist, this was an exclusion proof.\n ovmStateManager.putEmptyAccount(_ovmContractAddress);\n }\n }\n\n /**\n * Allows a user to prove the initial state of a contract storage slot.\n * @param _ovmContractAddress Address of the contract on the OVM.\n * @param _key Claimed account slot key.\n * @param _storageTrieWitness Proof of the storage slot.\n */\n function proveStorageSlot(\n address _ovmContractAddress,\n bytes32 _key,\n bytes memory _storageTrieWitness\n )\n override\n public\n onlyDuringPhase(TransitionPhase.PRE_EXECUTION)\n contributesToFraudProof(preStateRoot, transactionHash)\n {\n // Exit quickly to avoid unnecessary work.\n require(\n ovmStateManager.hasContractStorage(_ovmContractAddress, _key) == false,\n \"Storage slot has already been proven.\"\n );\n\n require(\n ovmStateManager.hasAccount(_ovmContractAddress) == true,\n \"Contract must be verified before proving a storage slot.\"\n );\n\n bytes32 storageRoot = ovmStateManager.getAccountStorageRoot(_ovmContractAddress);\n bytes32 value;\n\n if (storageRoot == EMPTY_ACCOUNT_STORAGE_ROOT) {\n // Storage trie was empty, so the user is always allowed to insert zero-byte values.\n value = bytes32(0);\n } else {\n // Function will fail if the proof is not a valid inclusion or exclusion proof.\n (\n bool exists,\n bytes memory encodedValue\n ) = Lib_SecureMerkleTrie.get(\n abi.encodePacked(_key),\n _storageTrieWitness,\n storageRoot\n );\n\n if (exists == true) {\n // Inclusion proof.\n // Stored values are RLP encoded, with leading zeros removed.\n value = Lib_BytesUtils.toBytes32PadLeft(\n Lib_RLPReader.readBytes(encodedValue)\n );\n } else {\n // Exclusion proof, can only be zero bytes.\n value = bytes32(0);\n }\n }\n\n ovmStateManager.putContractStorage(\n _ovmContractAddress,\n _key,\n value\n );\n }\n\n\n /*******************************\n * Public Functions: Execution *\n *******************************/\n\n /**\n * Executes the state transition.\n * @param _transaction OVM transaction to execute.\n */\n function applyTransaction(\n Lib_OVMCodec.Transaction memory _transaction\n )\n override\n public\n onlyDuringPhase(TransitionPhase.PRE_EXECUTION)\n contributesToFraudProof(preStateRoot, transactionHash)\n {\n require(\n Lib_OVMCodec.hashTransaction(_transaction) == transactionHash,\n \"Invalid transaction provided.\"\n );\n\n // We require gas to complete the logic here in run() before/after execution,\n // But must ensure the full _tx.gasLimit can be given to the ovmCALL (determinism)\n // This includes 1/64 of the gas getting lost because of EIP-150 (lost twice--first\n // going into EM, then going into the code contract).\n require(\n gasleft() >= 100000 + _transaction.gasLimit * 1032 / 1000, // 1032/1000 = 1.032 = (64/63)^2 rounded up\n \"Not enough gas to execute transaction deterministically.\"\n );\n\n iOVM_ExecutionManager ovmExecutionManager = iOVM_ExecutionManager(resolve(\"OVM_ExecutionManager\"));\n\n // We call `setExecutionManager` right before `run` (and not earlier) just in case the\n // OVM_ExecutionManager address was updated between the time when this contract was created\n // and when `applyTransaction` was called.\n ovmStateManager.setExecutionManager(address(ovmExecutionManager));\n\n // `run` always succeeds *unless* the user hasn't provided enough gas to `applyTransaction`\n // or an INVALID_STATE_ACCESS flag was triggered. Either way, we won't get beyond this line\n // if that's the case.\n ovmExecutionManager.run(_transaction, address(ovmStateManager));\n\n // Prevent the Execution Manager from calling this SM again.\n ovmStateManager.setExecutionManager(address(0));\n phase = TransitionPhase.POST_EXECUTION;\n }\n\n\n /************************************\n * Public Functions: Post-Execution *\n ************************************/\n\n /**\n * Allows a user to commit the final state of a contract.\n * @param _ovmContractAddress Address of the contract on the OVM.\n * @param _stateTrieWitness Proof of the account state.\n */\n function commitContractState(\n address _ovmContractAddress,\n bytes memory _stateTrieWitness\n )\n override\n public\n onlyDuringPhase(TransitionPhase.POST_EXECUTION)\n contributesToFraudProof(preStateRoot, transactionHash)\n {\n require(\n ovmStateManager.getTotalUncommittedContractStorage() == 0,\n \"All storage must be committed before committing account states.\"\n );\n\n require (\n ovmStateManager.commitAccount(_ovmContractAddress) == true,\n \"Account state wasn't changed or has already been committed.\"\n );\n\n Lib_OVMCodec.Account memory account = ovmStateManager.getAccount(_ovmContractAddress);\n\n postStateRoot = Lib_SecureMerkleTrie.update(\n abi.encodePacked(_ovmContractAddress),\n Lib_OVMCodec.encodeEVMAccount(\n Lib_OVMCodec.toEVMAccount(account)\n ),\n _stateTrieWitness,\n postStateRoot\n );\n\n // Emit an event to help clients figure out the proof ordering.\n emit AccountCommitted(\n _ovmContractAddress\n );\n }\n\n /**\n * Allows a user to commit the final state of a contract storage slot.\n * @param _ovmContractAddress Address of the contract on the OVM.\n * @param _key Claimed account slot key.\n * @param _storageTrieWitness Proof of the storage slot.\n */\n function commitStorageSlot(\n address _ovmContractAddress,\n bytes32 _key,\n bytes memory _storageTrieWitness\n )\n override\n public\n onlyDuringPhase(TransitionPhase.POST_EXECUTION)\n contributesToFraudProof(preStateRoot, transactionHash)\n {\n require(\n ovmStateManager.commitContractStorage(_ovmContractAddress, _key) == true,\n \"Storage slot value wasn't changed or has already been committed.\"\n );\n\n Lib_OVMCodec.Account memory account = ovmStateManager.getAccount(_ovmContractAddress);\n bytes32 value = ovmStateManager.getContractStorage(_ovmContractAddress, _key);\n\n account.storageRoot = Lib_SecureMerkleTrie.update(\n abi.encodePacked(_key),\n Lib_RLPWriter.writeBytes(\n Lib_Bytes32Utils.removeLeadingZeros(value)\n ),\n _storageTrieWitness,\n account.storageRoot\n );\n\n ovmStateManager.putAccount(_ovmContractAddress, account);\n\n // Emit an event to help clients figure out the proof ordering.\n emit ContractStorageCommitted(\n _ovmContractAddress,\n _key\n );\n }\n\n\n /**********************************\n * Public Functions: Finalization *\n **********************************/\n\n /**\n * Finalizes the transition process.\n */\n function completeTransition()\n override\n public\n onlyDuringPhase(TransitionPhase.POST_EXECUTION)\n {\n require(\n ovmStateManager.getTotalUncommittedAccounts() == 0,\n \"All accounts must be committed before completing a transition.\"\n );\n\n require(\n ovmStateManager.getTotalUncommittedContractStorage() == 0,\n \"All storage must be committed before completing a transition.\"\n );\n\n phase = TransitionPhase.COMPLETE;\n }\n}\n" - }, - "contracts/optimistic-ethereum/libraries/trie/Lib_SecureMerkleTrie.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_MerkleTrie } from \"./Lib_MerkleTrie.sol\";\n\n/**\n * @title Lib_SecureMerkleTrie\n */\nlibrary Lib_SecureMerkleTrie {\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * @notice Verifies a proof that a given key/value pair is present in the\n * Merkle trie.\n * @param _key Key of the node to search for, as a hex string.\n * @param _value Value of the node to search for, as a hex string.\n * @param _proof Merkle trie inclusion proof for the desired node. Unlike\n * traditional Merkle trees, this proof is executed top-down and consists\n * of a list of RLP-encoded nodes that make a path down to the target node.\n * @param _root Known root of the Merkle trie. Used to verify that the\n * included proof is correctly constructed.\n * @return _verified `true` if the k/v pair exists in the trie, `false` otherwise.\n */\n function verifyInclusionProof(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n )\n internal\n pure\n returns (\n bool _verified\n )\n {\n bytes memory key = _getSecureKey(_key);\n return Lib_MerkleTrie.verifyInclusionProof(key, _value, _proof, _root);\n }\n\n /**\n * @notice Verifies a proof that a given key is *not* present in\n * the Merkle trie.\n * @param _key Key of the node to search for, as a hex string.\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\n * target node.\n * @param _root Known root of the Merkle trie. Used to verify that the\n * included proof is correctly constructed.\n * @return _verified `true` if the key is not present in the trie, `false` otherwise.\n */\n function verifyExclusionProof(\n bytes memory _key,\n bytes memory _proof,\n bytes32 _root\n )\n internal\n pure\n returns (\n bool _verified\n )\n {\n bytes memory key = _getSecureKey(_key);\n return Lib_MerkleTrie.verifyExclusionProof(key, _proof, _root);\n }\n\n /**\n * @notice Updates a Merkle trie and returns a new root hash.\n * @param _key Key of the node to update, as a hex string.\n * @param _value Value of the node to update, as a hex string.\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\n * target node. If the key exists, we can simply update the value.\n * Otherwise, we need to modify the trie to handle the new k/v pair.\n * @param _root Known root of the Merkle trie. Used to verify that the\n * included proof is correctly constructed.\n * @return _updatedRoot Root hash of the newly constructed trie.\n */\n function update(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n )\n internal\n pure\n returns (\n bytes32 _updatedRoot\n )\n {\n bytes memory key = _getSecureKey(_key);\n return Lib_MerkleTrie.update(key, _value, _proof, _root);\n }\n\n /**\n * @notice Retrieves the value associated with a given key.\n * @param _key Key to search for, as hex bytes.\n * @param _proof Merkle trie inclusion proof for the key.\n * @param _root Known root of the Merkle trie.\n * @return _exists Whether or not the key exists.\n * @return _value Value of the key if it exists.\n */\n function get(\n bytes memory _key,\n bytes memory _proof,\n bytes32 _root\n )\n internal\n pure\n returns (\n bool _exists,\n bytes memory _value\n )\n {\n bytes memory key = _getSecureKey(_key);\n return Lib_MerkleTrie.get(key, _proof, _root);\n }\n\n /**\n * Computes the root hash for a trie with a single node.\n * @param _key Key for the single node.\n * @param _value Value for the single node.\n * @return _updatedRoot Hash of the trie.\n */\n function getSingleNodeRootHash(\n bytes memory _key,\n bytes memory _value\n )\n internal\n pure\n returns (\n bytes32 _updatedRoot\n )\n {\n bytes memory key = _getSecureKey(_key);\n return Lib_MerkleTrie.getSingleNodeRootHash(key, _value);\n }\n\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * Computes the secure counterpart to a key.\n * @param _key Key to get a secure key from.\n * @return _secureKey Secure version of the key.\n */\n function _getSecureKey(\n bytes memory _key\n )\n private\n pure\n returns (\n bytes memory _secureKey\n )\n {\n return abi.encodePacked(keccak256(_key));\n }\n}" - }, - "contracts/optimistic-ethereum/iOVM/verification/iOVM_StateTransitioner.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/**\n * @title iOVM_StateTransitioner\n */\ninterface iOVM_StateTransitioner {\n\n /**********\n * Events *\n **********/\n\n event AccountCommitted(\n address _address\n );\n\n event ContractStorageCommitted(\n address _address,\n bytes32 _key\n );\n\n\n /**********************************\n * Public Functions: State Access *\n **********************************/\n\n function getPreStateRoot() external view returns (bytes32 _preStateRoot);\n function getPostStateRoot() external view returns (bytes32 _postStateRoot);\n function isComplete() external view returns (bool _complete);\n\n\n /***********************************\n * Public Functions: Pre-Execution *\n ***********************************/\n\n function proveContractState(\n address _ovmContractAddress,\n address _ethContractAddress,\n bytes calldata _stateTrieWitness\n ) external;\n\n function proveStorageSlot(\n address _ovmContractAddress,\n bytes32 _key,\n bytes calldata _storageTrieWitness\n ) external;\n\n\n /*******************************\n * Public Functions: Execution *\n *******************************/\n\n function applyTransaction(\n Lib_OVMCodec.Transaction calldata _transaction\n ) external;\n\n\n /************************************\n * Public Functions: Post-Execution *\n ************************************/\n\n function commitContractState(\n address _ovmContractAddress,\n bytes calldata _stateTrieWitness\n ) external;\n\n function commitStorageSlot(\n address _ovmContractAddress,\n bytes32 _key,\n bytes calldata _storageTrieWitness\n ) external;\n\n\n /**********************************\n * Public Functions: Finalization *\n **********************************/\n\n function completeTransition() external;\n}\n" - }, - "contracts/optimistic-ethereum/iOVM/verification/iOVM_BondManager.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\ninterface ERC20 {\n function transfer(address, uint256) external returns (bool);\n function transferFrom(address, address, uint256) external returns (bool);\n}\n\n/// All the errors which may be encountered on the bond manager\nlibrary Errors {\n string constant ERC20_ERR = \"BondManager: Could not post bond\";\n string constant ALREADY_FINALIZED = \"BondManager: Fraud proof for this pre-state root has already been finalized\";\n string constant SLASHED = \"BondManager: Cannot finalize withdrawal, you probably got slashed\";\n string constant WRONG_STATE = \"BondManager: Wrong bond state for proposer\";\n string constant CANNOT_CLAIM = \"BondManager: Cannot claim yet. Dispute must be finalized first\";\n\n string constant WITHDRAWAL_PENDING = \"BondManager: Withdrawal already pending\";\n string constant TOO_EARLY = \"BondManager: Too early to finalize your withdrawal\";\n\n string constant ONLY_TRANSITIONER = \"BondManager: Only the transitioner for this pre-state root may call this function\";\n string constant ONLY_FRAUD_VERIFIER = \"BondManager: Only the fraud verifier may call this function\";\n string constant ONLY_STATE_COMMITMENT_CHAIN = \"BondManager: Only the state commitment chain may call this function\";\n string constant WAIT_FOR_DISPUTES = \"BondManager: Wait for other potential disputes\";\n}\n\n/**\n * @title iOVM_BondManager\n */\ninterface iOVM_BondManager {\n\n /*******************\n * Data Structures *\n *******************/\n\n /// The lifecycle of a proposer's bond\n enum State {\n // Before depositing or after getting slashed, a user is uncollateralized\n NOT_COLLATERALIZED,\n // After depositing, a user is collateralized\n COLLATERALIZED,\n // After a user has initiated a withdrawal\n WITHDRAWING\n }\n\n /// A bond posted by a proposer\n struct Bond {\n // The user's state\n State state;\n // The timestamp at which a proposer issued their withdrawal request\n uint32 withdrawalTimestamp;\n // The time when the first disputed was initiated for this bond\n uint256 firstDisputeAt;\n // The earliest observed state root for this bond which has had fraud\n bytes32 earliestDisputedStateRoot;\n // The state root's timestamp\n uint256 earliestTimestamp;\n }\n\n // Per pre-state root, store the number of state provisions that were made\n // and how many of these calls were made by each user. Payouts will then be\n // claimed by users proportionally for that dispute.\n struct Rewards {\n // Flag to check if rewards for a fraud proof are claimable\n bool canClaim;\n // Total number of `recordGasSpent` calls made\n uint256 total;\n // The gas spent by each user to provide witness data. The sum of all\n // values inside this map MUST be equal to the value of `total`\n mapping(address => uint256) gasSpent;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n function recordGasSpent(\n bytes32 _preStateRoot,\n bytes32 _txHash,\n address _who,\n uint256 _gasSpent\n ) external;\n\n function finalize(\n bytes32 _preStateRoot,\n address _publisher,\n uint256 _timestamp\n ) external;\n\n function deposit() external;\n\n function startWithdrawal() external;\n\n function finalizeWithdrawal() external;\n\n function claim(\n address _who\n ) external;\n\n function isCollateralized(\n address _who\n ) external view returns (bool);\n\n function getGasSpent(\n bytes32 _preStateRoot,\n address _who\n ) external view returns (uint256);\n}\n" - }, - "contracts/optimistic-ethereum/iOVM/execution/iOVM_StateManagerFactory.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Contract Imports */\nimport { iOVM_StateManager } from \"./iOVM_StateManager.sol\";\n\n/**\n * @title iOVM_StateManagerFactory\n */\ninterface iOVM_StateManagerFactory {\n\n /***************************************\n * Public Functions: Contract Creation *\n ***************************************/\n\n function create(\n address _owner\n )\n external\n returns (\n iOVM_StateManager _ovmStateManager\n );\n}\n" - }, - "contracts/optimistic-ethereum/OVM/verification/Abs_FraudContributor.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\nimport { iOVM_BondManager } from \"../../iOVM/verification/iOVM_BondManager.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/// Minimal contract to be inherited by contracts consumed by users that provide\n/// data for fraud proofs\nabstract contract Abs_FraudContributor is Lib_AddressResolver {\n /// Decorate your functions with this modifier to store how much total gas was\n /// consumed by the sender, to reward users fairly\n modifier contributesToFraudProof(bytes32 preStateRoot, bytes32 txHash) {\n uint256 startGas = gasleft();\n _;\n uint256 gasSpent = startGas - gasleft();\n iOVM_BondManager(resolve('OVM_BondManager')).recordGasSpent(preStateRoot, txHash, msg.sender, gasSpent);\n }\n}\n" - }, - "contracts/optimistic-ethereum/libraries/trie/Lib_MerkleTrie.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Library Imports */\nimport { Lib_BytesUtils } from \"../utils/Lib_BytesUtils.sol\";\nimport { Lib_RLPReader } from \"../rlp/Lib_RLPReader.sol\";\nimport { Lib_RLPWriter } from \"../rlp/Lib_RLPWriter.sol\";\n\n/**\n * @title Lib_MerkleTrie\n */\nlibrary Lib_MerkleTrie {\n\n /*******************\n * Data Structures *\n *******************/\n\n enum NodeType {\n BranchNode,\n ExtensionNode,\n LeafNode\n }\n\n struct TrieNode {\n bytes encoded;\n Lib_RLPReader.RLPItem[] decoded;\n }\n\n\n /**********************\n * Contract Constants *\n **********************/\n\n // TREE_RADIX determines the number of elements per branch node.\n uint256 constant TREE_RADIX = 16;\n // Branch nodes have TREE_RADIX elements plus an additional `value` slot.\n uint256 constant BRANCH_NODE_LENGTH = TREE_RADIX + 1;\n // Leaf nodes and extension nodes always have two elements, a `path` and a `value`.\n uint256 constant LEAF_OR_EXTENSION_NODE_LENGTH = 2;\n\n // Prefixes are prepended to the `path` within a leaf or extension node and\n // allow us to differentiate between the two node types. `ODD` or `EVEN` is\n // determined by the number of nibbles within the unprefixed `path`. If the\n // number of nibbles if even, we need to insert an extra padding nibble so\n // the resulting prefixed `path` has an even number of nibbles.\n uint8 constant PREFIX_EXTENSION_EVEN = 0;\n uint8 constant PREFIX_EXTENSION_ODD = 1;\n uint8 constant PREFIX_LEAF_EVEN = 2;\n uint8 constant PREFIX_LEAF_ODD = 3;\n\n // Just a utility constant. RLP represents `NULL` as 0x80.\n bytes1 constant RLP_NULL = bytes1(0x80);\n bytes constant RLP_NULL_BYTES = hex'80';\n bytes32 constant internal KECCAK256_RLP_NULL_BYTES = keccak256(RLP_NULL_BYTES);\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * @notice Verifies a proof that a given key/value pair is present in the\n * Merkle trie.\n * @param _key Key of the node to search for, as a hex string.\n * @param _value Value of the node to search for, as a hex string.\n * @param _proof Merkle trie inclusion proof for the desired node. Unlike\n * traditional Merkle trees, this proof is executed top-down and consists\n * of a list of RLP-encoded nodes that make a path down to the target node.\n * @param _root Known root of the Merkle trie. Used to verify that the\n * included proof is correctly constructed.\n * @return _verified `true` if the k/v pair exists in the trie, `false` otherwise.\n */\n function verifyInclusionProof(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n )\n internal\n pure\n returns (\n bool _verified\n )\n {\n (\n bool exists,\n bytes memory value\n ) = get(_key, _proof, _root);\n\n return (\n exists && Lib_BytesUtils.equal(_value, value)\n );\n }\n\n /**\n * @notice Verifies a proof that a given key is *not* present in\n * the Merkle trie.\n * @param _key Key of the node to search for, as a hex string.\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\n * target node.\n * @param _root Known root of the Merkle trie. Used to verify that the\n * included proof is correctly constructed.\n * @return _verified `true` if the key is absent in the trie, `false` otherwise.\n */\n function verifyExclusionProof(\n bytes memory _key,\n bytes memory _proof,\n bytes32 _root\n )\n internal\n pure\n returns (\n bool _verified\n )\n {\n (\n bool exists,\n ) = get(_key, _proof, _root);\n\n return exists == false;\n }\n\n /**\n * @notice Updates a Merkle trie and returns a new root hash.\n * @param _key Key of the node to update, as a hex string.\n * @param _value Value of the node to update, as a hex string.\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\n * target node. If the key exists, we can simply update the value.\n * Otherwise, we need to modify the trie to handle the new k/v pair.\n * @param _root Known root of the Merkle trie. Used to verify that the\n * included proof is correctly constructed.\n * @return _updatedRoot Root hash of the newly constructed trie.\n */\n function update(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n )\n internal\n pure\n returns (\n bytes32 _updatedRoot\n )\n {\n // Special case when inserting the very first node.\n if (_root == KECCAK256_RLP_NULL_BYTES) {\n return getSingleNodeRootHash(_key, _value);\n }\n\n TrieNode[] memory proof = _parseProof(_proof);\n (uint256 pathLength, bytes memory keyRemainder, ) = _walkNodePath(proof, _key, _root);\n TrieNode[] memory newPath = _getNewPath(proof, pathLength, keyRemainder, _value);\n\n return _getUpdatedTrieRoot(newPath, _key);\n }\n\n /**\n * @notice Retrieves the value associated with a given key.\n * @param _key Key to search for, as hex bytes.\n * @param _proof Merkle trie inclusion proof for the key.\n * @param _root Known root of the Merkle trie.\n * @return _exists Whether or not the key exists.\n * @return _value Value of the key if it exists.\n */\n function get(\n bytes memory _key,\n bytes memory _proof,\n bytes32 _root\n )\n internal\n pure\n returns (\n bool _exists,\n bytes memory _value\n )\n {\n TrieNode[] memory proof = _parseProof(_proof);\n (uint256 pathLength, bytes memory keyRemainder, bool isFinalNode) = _walkNodePath(proof, _key, _root);\n\n bool exists = keyRemainder.length == 0;\n\n require(\n exists || isFinalNode,\n \"Provided proof is invalid.\"\n );\n\n bytes memory value = exists ? _getNodeValue(proof[pathLength - 1]) : bytes('');\n\n return (\n exists,\n value\n );\n }\n\n /**\n * Computes the root hash for a trie with a single node.\n * @param _key Key for the single node.\n * @param _value Value for the single node.\n * @return _updatedRoot Hash of the trie.\n */\n function getSingleNodeRootHash(\n bytes memory _key,\n bytes memory _value\n )\n internal\n pure\n returns (\n bytes32 _updatedRoot\n )\n {\n return keccak256(_makeLeafNode(\n Lib_BytesUtils.toNibbles(_key),\n _value\n ).encoded);\n }\n\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * @notice Walks through a proof using a provided key.\n * @param _proof Inclusion proof to walk through.\n * @param _key Key to use for the walk.\n * @param _root Known root of the trie.\n * @return _pathLength Length of the final path\n * @return _keyRemainder Portion of the key remaining after the walk.\n * @return _isFinalNode Whether or not we've hit a dead end.\n */\n function _walkNodePath(\n TrieNode[] memory _proof,\n bytes memory _key,\n bytes32 _root\n )\n private\n pure\n returns (\n uint256 _pathLength,\n bytes memory _keyRemainder,\n bool _isFinalNode\n )\n {\n uint256 pathLength = 0;\n bytes memory key = Lib_BytesUtils.toNibbles(_key);\n\n bytes32 currentNodeID = _root;\n uint256 currentKeyIndex = 0;\n uint256 currentKeyIncrement = 0;\n TrieNode memory currentNode;\n\n // Proof is top-down, so we start at the first element (root).\n for (uint256 i = 0; i < _proof.length; i++) {\n currentNode = _proof[i];\n currentKeyIndex += currentKeyIncrement;\n\n // Keep track of the proof elements we actually need.\n // It's expensive to resize arrays, so this simply reduces gas costs.\n pathLength += 1;\n\n if (currentKeyIndex == 0) {\n // First proof element is always the root node.\n require(\n keccak256(currentNode.encoded) == currentNodeID,\n \"Invalid root hash\"\n );\n } else if (currentNode.encoded.length >= 32) {\n // Nodes 32 bytes or larger are hashed inside branch nodes.\n require(\n keccak256(currentNode.encoded) == currentNodeID,\n \"Invalid large internal hash\"\n );\n } else {\n // Nodes smaller than 31 bytes aren't hashed.\n require(\n Lib_BytesUtils.toBytes32(currentNode.encoded) == currentNodeID,\n \"Invalid internal node hash\"\n );\n }\n\n if (currentNode.decoded.length == BRANCH_NODE_LENGTH) {\n if (currentKeyIndex == key.length) {\n // We've hit the end of the key, meaning the value should be within this branch node.\n break;\n } else {\n // We're not at the end of the key yet.\n // Figure out what the next node ID should be and continue.\n uint8 branchKey = uint8(key[currentKeyIndex]);\n Lib_RLPReader.RLPItem memory nextNode = currentNode.decoded[branchKey];\n currentNodeID = _getNodeID(nextNode);\n currentKeyIncrement = 1;\n continue;\n }\n } else if (currentNode.decoded.length == LEAF_OR_EXTENSION_NODE_LENGTH) {\n bytes memory path = _getNodePath(currentNode);\n uint8 prefix = uint8(path[0]);\n uint8 offset = 2 - prefix % 2;\n bytes memory pathRemainder = Lib_BytesUtils.slice(path, offset);\n bytes memory keyRemainder = Lib_BytesUtils.slice(key, currentKeyIndex);\n uint256 sharedNibbleLength = _getSharedNibbleLength(pathRemainder, keyRemainder);\n\n if (prefix == PREFIX_LEAF_EVEN || prefix == PREFIX_LEAF_ODD) {\n if (\n pathRemainder.length == sharedNibbleLength &&\n keyRemainder.length == sharedNibbleLength\n ) {\n // The key within this leaf matches our key exactly.\n // Increment the key index to reflect that we have no remainder.\n currentKeyIndex += sharedNibbleLength;\n }\n\n // We've hit a leaf node, so our next node should be NULL.\n currentNodeID = bytes32(RLP_NULL);\n break;\n } else if (prefix == PREFIX_EXTENSION_EVEN || prefix == PREFIX_EXTENSION_ODD) {\n if (sharedNibbleLength == 0) {\n // Our extension node doesn't share any part of our key.\n // We've hit the end of this path, updates will need to modify this extension.\n currentNodeID = bytes32(RLP_NULL);\n break;\n } else {\n // Our extension shares some nibbles.\n // Carry on to the next node.\n currentNodeID = _getNodeID(currentNode.decoded[1]);\n currentKeyIncrement = sharedNibbleLength;\n continue;\n }\n } else {\n revert(\"Received a node with an unknown prefix\");\n }\n } else {\n revert(\"Received an unparseable node.\");\n }\n }\n\n // If our node ID is NULL, then we're at a dead end.\n bool isFinalNode = currentNodeID == bytes32(RLP_NULL);\n return (pathLength, Lib_BytesUtils.slice(key, currentKeyIndex), isFinalNode);\n }\n\n /**\n * @notice Creates new nodes to support a k/v pair insertion into a given\n * Merkle trie path.\n * @param _path Path to the node nearest the k/v pair.\n * @param _pathLength Length of the path. Necessary because the provided\n * path may include additional nodes (e.g., it comes directly from a proof)\n * and we can't resize in-memory arrays without costly duplication.\n * @param _keyRemainder Portion of the initial key that must be inserted\n * into the trie.\n * @param _value Value to insert at the given key.\n * @return _newPath A new path with the inserted k/v pair and extra supporting nodes.\n */\n function _getNewPath(\n TrieNode[] memory _path,\n uint256 _pathLength,\n bytes memory _keyRemainder,\n bytes memory _value\n )\n private\n pure\n returns (\n TrieNode[] memory _newPath\n )\n {\n bytes memory keyRemainder = _keyRemainder;\n\n // Most of our logic depends on the status of the last node in the path.\n TrieNode memory lastNode = _path[_pathLength - 1];\n NodeType lastNodeType = _getNodeType(lastNode);\n\n // Create an array for newly created nodes.\n // We need up to three new nodes, depending on the contents of the last node.\n // Since array resizing is expensive, we'll keep track of the size manually.\n // We're using an explicit `totalNewNodes += 1` after insertions for clarity.\n TrieNode[] memory newNodes = new TrieNode[](3);\n uint256 totalNewNodes = 0;\n\n if (keyRemainder.length == 0 && lastNodeType == NodeType.LeafNode) {\n // We've found a leaf node with the given key.\n // Simply need to update the value of the node to match.\n newNodes[totalNewNodes] = _makeLeafNode(_getNodeKey(lastNode), _value);\n totalNewNodes += 1;\n } else if (lastNodeType == NodeType.BranchNode) {\n if (keyRemainder.length == 0) {\n // We've found a branch node with the given key.\n // Simply need to update the value of the node to match.\n newNodes[totalNewNodes] = _editBranchValue(lastNode, _value);\n totalNewNodes += 1;\n } else {\n // We've found a branch node, but it doesn't contain our key.\n // Reinsert the old branch for now.\n newNodes[totalNewNodes] = lastNode;\n totalNewNodes += 1;\n // Create a new leaf node, slicing our remainder since the first byte points\n // to our branch node.\n newNodes[totalNewNodes] = _makeLeafNode(Lib_BytesUtils.slice(keyRemainder, 1), _value);\n totalNewNodes += 1;\n }\n } else {\n // Our last node is either an extension node or a leaf node with a different key.\n bytes memory lastNodeKey = _getNodeKey(lastNode);\n uint256 sharedNibbleLength = _getSharedNibbleLength(lastNodeKey, keyRemainder);\n\n if (sharedNibbleLength != 0) {\n // We've got some shared nibbles between the last node and our key remainder.\n // We'll need to insert an extension node that covers these shared nibbles.\n bytes memory nextNodeKey = Lib_BytesUtils.slice(lastNodeKey, 0, sharedNibbleLength);\n newNodes[totalNewNodes] = _makeExtensionNode(nextNodeKey, _getNodeHash(_value));\n totalNewNodes += 1;\n\n // Cut down the keys since we've just covered these shared nibbles.\n lastNodeKey = Lib_BytesUtils.slice(lastNodeKey, sharedNibbleLength);\n keyRemainder = Lib_BytesUtils.slice(keyRemainder, sharedNibbleLength);\n }\n\n // Create an empty branch to fill in.\n TrieNode memory newBranch = _makeEmptyBranchNode();\n\n if (lastNodeKey.length == 0) {\n // Key remainder was larger than the key for our last node.\n // The value within our last node is therefore going to be shifted into\n // a branch value slot.\n newBranch = _editBranchValue(newBranch, _getNodeValue(lastNode));\n } else {\n // Last node key was larger than the key remainder.\n // We're going to modify some index of our branch.\n uint8 branchKey = uint8(lastNodeKey[0]);\n // Move on to the next nibble.\n lastNodeKey = Lib_BytesUtils.slice(lastNodeKey, 1);\n\n if (lastNodeType == NodeType.LeafNode) {\n // We're dealing with a leaf node.\n // We'll modify the key and insert the old leaf node into the branch index.\n TrieNode memory modifiedLastNode = _makeLeafNode(lastNodeKey, _getNodeValue(lastNode));\n newBranch = _editBranchIndex(newBranch, branchKey, _getNodeHash(modifiedLastNode.encoded));\n } else if (lastNodeKey.length != 0) {\n // We're dealing with a shrinking extension node.\n // We need to modify the node to decrease the size of the key.\n TrieNode memory modifiedLastNode = _makeExtensionNode(lastNodeKey, _getNodeValue(lastNode));\n newBranch = _editBranchIndex(newBranch, branchKey, _getNodeHash(modifiedLastNode.encoded));\n } else {\n // We're dealing with an unnecessary extension node.\n // We're going to delete the node entirely.\n // Simply insert its current value into the branch index.\n newBranch = _editBranchIndex(newBranch, branchKey, _getNodeValue(lastNode));\n }\n }\n\n if (keyRemainder.length == 0) {\n // We've got nothing left in the key remainder.\n // Simply insert the value into the branch value slot.\n newBranch = _editBranchValue(newBranch, _value);\n // Push the branch into the list of new nodes.\n newNodes[totalNewNodes] = newBranch;\n totalNewNodes += 1;\n } else {\n // We've got some key remainder to work with.\n // We'll be inserting a leaf node into the trie.\n // First, move on to the next nibble.\n keyRemainder = Lib_BytesUtils.slice(keyRemainder, 1);\n // Push the branch into the list of new nodes.\n newNodes[totalNewNodes] = newBranch;\n totalNewNodes += 1;\n // Push a new leaf node for our k/v pair.\n newNodes[totalNewNodes] = _makeLeafNode(keyRemainder, _value);\n totalNewNodes += 1;\n }\n }\n\n // Finally, join the old path with our newly created nodes.\n // Since we're overwriting the last node in the path, we use `_pathLength - 1`.\n return _joinNodeArrays(_path, _pathLength - 1, newNodes, totalNewNodes);\n }\n\n /**\n * @notice Computes the trie root from a given path.\n * @param _nodes Path to some k/v pair.\n * @param _key Key for the k/v pair.\n * @return _updatedRoot Root hash for the updated trie.\n */\n function _getUpdatedTrieRoot(\n TrieNode[] memory _nodes,\n bytes memory _key\n )\n private\n pure\n returns (\n bytes32 _updatedRoot\n )\n {\n bytes memory key = Lib_BytesUtils.toNibbles(_key);\n\n // Some variables to keep track of during iteration.\n TrieNode memory currentNode;\n NodeType currentNodeType;\n bytes memory previousNodeHash;\n\n // Run through the path backwards to rebuild our root hash.\n for (uint256 i = _nodes.length; i > 0; i--) {\n // Pick out the current node.\n currentNode = _nodes[i - 1];\n currentNodeType = _getNodeType(currentNode);\n\n if (currentNodeType == NodeType.LeafNode) {\n // Leaf nodes are already correctly encoded.\n // Shift the key over to account for the nodes key.\n bytes memory nodeKey = _getNodeKey(currentNode);\n key = Lib_BytesUtils.slice(key, 0, key.length - nodeKey.length);\n } else if (currentNodeType == NodeType.ExtensionNode) {\n // Shift the key over to account for the nodes key.\n bytes memory nodeKey = _getNodeKey(currentNode);\n key = Lib_BytesUtils.slice(key, 0, key.length - nodeKey.length);\n\n // If this node is the last element in the path, it'll be correctly encoded\n // and we can skip this part.\n if (previousNodeHash.length > 0) {\n // Re-encode the node based on the previous node.\n currentNode = _makeExtensionNode(nodeKey, previousNodeHash);\n }\n } else if (currentNodeType == NodeType.BranchNode) {\n // If this node is the last element in the path, it'll be correctly encoded\n // and we can skip this part.\n if (previousNodeHash.length > 0) {\n // Re-encode the node based on the previous node.\n uint8 branchKey = uint8(key[key.length - 1]);\n key = Lib_BytesUtils.slice(key, 0, key.length - 1);\n currentNode = _editBranchIndex(currentNode, branchKey, previousNodeHash);\n }\n }\n\n // Compute the node hash for the next iteration.\n previousNodeHash = _getNodeHash(currentNode.encoded);\n }\n\n // Current node should be the root at this point.\n // Simply return the hash of its encoding.\n return keccak256(currentNode.encoded);\n }\n\n /**\n * @notice Parses an RLP-encoded proof into something more useful.\n * @param _proof RLP-encoded proof to parse.\n * @return _parsed Proof parsed into easily accessible structs.\n */\n function _parseProof(\n bytes memory _proof\n )\n private\n pure\n returns (\n TrieNode[] memory _parsed\n )\n {\n Lib_RLPReader.RLPItem[] memory nodes = Lib_RLPReader.readList(_proof);\n TrieNode[] memory proof = new TrieNode[](nodes.length);\n\n for (uint256 i = 0; i < nodes.length; i++) {\n bytes memory encoded = Lib_RLPReader.readBytes(nodes[i]);\n proof[i] = TrieNode({\n encoded: encoded,\n decoded: Lib_RLPReader.readList(encoded)\n });\n }\n\n return proof;\n }\n\n /**\n * @notice Picks out the ID for a node. Node ID is referred to as the\n * \"hash\" within the specification, but nodes < 32 bytes are not actually\n * hashed.\n * @param _node Node to pull an ID for.\n * @return _nodeID ID for the node, depending on the size of its contents.\n */\n function _getNodeID(\n Lib_RLPReader.RLPItem memory _node\n )\n private\n pure\n returns (\n bytes32 _nodeID\n )\n {\n bytes memory nodeID;\n\n if (_node.length < 32) {\n // Nodes smaller than 32 bytes are RLP encoded.\n nodeID = Lib_RLPReader.readRawBytes(_node);\n } else {\n // Nodes 32 bytes or larger are hashed.\n nodeID = Lib_RLPReader.readBytes(_node);\n }\n\n return Lib_BytesUtils.toBytes32(nodeID);\n }\n\n /**\n * @notice Gets the path for a leaf or extension node.\n * @param _node Node to get a path for.\n * @return _path Node path, converted to an array of nibbles.\n */\n function _getNodePath(\n TrieNode memory _node\n )\n private\n pure\n returns (\n bytes memory _path\n )\n {\n return Lib_BytesUtils.toNibbles(Lib_RLPReader.readBytes(_node.decoded[0]));\n }\n\n /**\n * @notice Gets the key for a leaf or extension node. Keys are essentially\n * just paths without any prefix.\n * @param _node Node to get a key for.\n * @return _key Node key, converted to an array of nibbles.\n */\n function _getNodeKey(\n TrieNode memory _node\n )\n private\n pure\n returns (\n bytes memory _key\n )\n {\n return _removeHexPrefix(_getNodePath(_node));\n }\n\n /**\n * @notice Gets the path for a node.\n * @param _node Node to get a value for.\n * @return _value Node value, as hex bytes.\n */\n function _getNodeValue(\n TrieNode memory _node\n )\n private\n pure\n returns (\n bytes memory _value\n )\n {\n return Lib_RLPReader.readBytes(_node.decoded[_node.decoded.length - 1]);\n }\n\n /**\n * @notice Computes the node hash for an encoded node. Nodes < 32 bytes\n * are not hashed, all others are keccak256 hashed.\n * @param _encoded Encoded node to hash.\n * @return _hash Hash of the encoded node. Simply the input if < 32 bytes.\n */\n function _getNodeHash(\n bytes memory _encoded\n )\n private\n pure\n returns (\n bytes memory _hash\n )\n {\n if (_encoded.length < 32) {\n return _encoded;\n } else {\n return abi.encodePacked(keccak256(_encoded));\n }\n }\n\n /**\n * @notice Determines the type for a given node.\n * @param _node Node to determine a type for.\n * @return _type Type of the node; BranchNode/ExtensionNode/LeafNode.\n */\n function _getNodeType(\n TrieNode memory _node\n )\n private\n pure\n returns (\n NodeType _type\n )\n {\n if (_node.decoded.length == BRANCH_NODE_LENGTH) {\n return NodeType.BranchNode;\n } else if (_node.decoded.length == LEAF_OR_EXTENSION_NODE_LENGTH) {\n bytes memory path = _getNodePath(_node);\n uint8 prefix = uint8(path[0]);\n\n if (prefix == PREFIX_LEAF_EVEN || prefix == PREFIX_LEAF_ODD) {\n return NodeType.LeafNode;\n } else if (prefix == PREFIX_EXTENSION_EVEN || prefix == PREFIX_EXTENSION_ODD) {\n return NodeType.ExtensionNode;\n }\n }\n\n revert(\"Invalid node type\");\n }\n\n /**\n * @notice Utility; determines the number of nibbles shared between two\n * nibble arrays.\n * @param _a First nibble array.\n * @param _b Second nibble array.\n * @return _shared Number of shared nibbles.\n */\n function _getSharedNibbleLength(\n bytes memory _a,\n bytes memory _b\n )\n private\n pure\n returns (\n uint256 _shared\n )\n {\n uint256 i = 0;\n while (_a.length > i && _b.length > i && _a[i] == _b[i]) {\n i++;\n }\n return i;\n }\n\n /**\n * @notice Utility; converts an RLP-encoded node into our nice struct.\n * @param _raw RLP-encoded node to convert.\n * @return _node Node as a TrieNode struct.\n */\n function _makeNode(\n bytes[] memory _raw\n )\n private\n pure\n returns (\n TrieNode memory _node\n )\n {\n bytes memory encoded = Lib_RLPWriter.writeList(_raw);\n\n return TrieNode({\n encoded: encoded,\n decoded: Lib_RLPReader.readList(encoded)\n });\n }\n\n /**\n * @notice Utility; converts an RLP-decoded node into our nice struct.\n * @param _items RLP-decoded node to convert.\n * @return _node Node as a TrieNode struct.\n */\n function _makeNode(\n Lib_RLPReader.RLPItem[] memory _items\n )\n private\n pure\n returns (\n TrieNode memory _node\n )\n {\n bytes[] memory raw = new bytes[](_items.length);\n for (uint256 i = 0; i < _items.length; i++) {\n raw[i] = Lib_RLPReader.readRawBytes(_items[i]);\n }\n return _makeNode(raw);\n }\n\n /**\n * @notice Creates a new extension node.\n * @param _key Key for the extension node, unprefixed.\n * @param _value Value for the extension node.\n * @return _node New extension node with the given k/v pair.\n */\n function _makeExtensionNode(\n bytes memory _key,\n bytes memory _value\n )\n private\n pure\n returns (\n TrieNode memory _node\n )\n {\n bytes[] memory raw = new bytes[](2);\n bytes memory key = _addHexPrefix(_key, false);\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\n raw[1] = Lib_RLPWriter.writeBytes(_value);\n return _makeNode(raw);\n }\n\n /**\n * @notice Creates a new leaf node.\n * @dev This function is essentially identical to `_makeExtensionNode`.\n * Although we could route both to a single method with a flag, it's\n * more gas efficient to keep them separate and duplicate the logic.\n * @param _key Key for the leaf node, unprefixed.\n * @param _value Value for the leaf node.\n * @return _node New leaf node with the given k/v pair.\n */\n function _makeLeafNode(\n bytes memory _key,\n bytes memory _value\n )\n private\n pure\n returns (\n TrieNode memory _node\n )\n {\n bytes[] memory raw = new bytes[](2);\n bytes memory key = _addHexPrefix(_key, true);\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\n raw[1] = Lib_RLPWriter.writeBytes(_value);\n return _makeNode(raw);\n }\n\n /**\n * @notice Creates an empty branch node.\n * @return _node Empty branch node as a TrieNode struct.\n */\n function _makeEmptyBranchNode()\n private\n pure\n returns (\n TrieNode memory _node\n )\n {\n bytes[] memory raw = new bytes[](BRANCH_NODE_LENGTH);\n for (uint256 i = 0; i < raw.length; i++) {\n raw[i] = RLP_NULL_BYTES;\n }\n return _makeNode(raw);\n }\n\n /**\n * @notice Modifies the value slot for a given branch.\n * @param _branch Branch node to modify.\n * @param _value Value to insert into the branch.\n * @return _updatedNode Modified branch node.\n */\n function _editBranchValue(\n TrieNode memory _branch,\n bytes memory _value\n )\n private\n pure\n returns (\n TrieNode memory _updatedNode\n )\n {\n bytes memory encoded = Lib_RLPWriter.writeBytes(_value);\n _branch.decoded[_branch.decoded.length - 1] = Lib_RLPReader.toRLPItem(encoded);\n return _makeNode(_branch.decoded);\n }\n\n /**\n * @notice Modifies a slot at an index for a given branch.\n * @param _branch Branch node to modify.\n * @param _index Slot index to modify.\n * @param _value Value to insert into the slot.\n * @return _updatedNode Modified branch node.\n */\n function _editBranchIndex(\n TrieNode memory _branch,\n uint8 _index,\n bytes memory _value\n )\n private\n pure\n returns (\n TrieNode memory _updatedNode\n )\n {\n bytes memory encoded = _value.length < 32 ? _value : Lib_RLPWriter.writeBytes(_value);\n _branch.decoded[_index] = Lib_RLPReader.toRLPItem(encoded);\n return _makeNode(_branch.decoded);\n }\n\n /**\n * @notice Utility; adds a prefix to a key.\n * @param _key Key to prefix.\n * @param _isLeaf Whether or not the key belongs to a leaf.\n * @return _prefixedKey Prefixed key.\n */\n function _addHexPrefix(\n bytes memory _key,\n bool _isLeaf\n )\n private\n pure\n returns (\n bytes memory _prefixedKey\n )\n {\n uint8 prefix = _isLeaf ? uint8(0x02) : uint8(0x00);\n uint8 offset = uint8(_key.length % 2);\n bytes memory prefixed = new bytes(2 - offset);\n prefixed[0] = bytes1(prefix + offset);\n return abi.encodePacked(prefixed, _key);\n }\n\n /**\n * @notice Utility; removes a prefix from a path.\n * @param _path Path to remove the prefix from.\n * @return _unprefixedKey Unprefixed key.\n */\n function _removeHexPrefix(\n bytes memory _path\n )\n private\n pure\n returns (\n bytes memory _unprefixedKey\n )\n {\n if (uint8(_path[0]) % 2 == 0) {\n return Lib_BytesUtils.slice(_path, 2);\n } else {\n return Lib_BytesUtils.slice(_path, 1);\n }\n }\n\n /**\n * @notice Utility; combines two node arrays. Array lengths are required\n * because the actual lengths may be longer than the filled lengths.\n * Array resizing is extremely costly and should be avoided.\n * @param _a First array to join.\n * @param _aLength Length of the first array.\n * @param _b Second array to join.\n * @param _bLength Length of the second array.\n * @return _joined Combined node array.\n */\n function _joinNodeArrays(\n TrieNode[] memory _a,\n uint256 _aLength,\n TrieNode[] memory _b,\n uint256 _bLength\n )\n private\n pure\n returns (\n TrieNode[] memory _joined\n )\n {\n TrieNode[] memory ret = new TrieNode[](_aLength + _bLength);\n\n // Copy elements from the first array.\n for (uint256 i = 0; i < _aLength; i++) {\n ret[i] = _a[i];\n }\n\n // Copy elements from the second array.\n for (uint256 i = 0; i < _bLength; i++) {\n ret[i + _aLength] = _b[i];\n }\n\n return ret;\n }\n}\n" - }, - "contracts/optimistic-ethereum/OVM/verification/OVM_StateTransitionerFactory.sol": { - "content": "// SPDX-License-Identifier: MIT\n// @unsupported: ovm\npragma solidity >0.5.0 <0.8.0;\n\n/* Library Imports */\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/* Interface Imports */\nimport { iOVM_StateTransitioner } from \"../../iOVM/verification/iOVM_StateTransitioner.sol\";\nimport { iOVM_StateTransitionerFactory } from \"../../iOVM/verification/iOVM_StateTransitionerFactory.sol\";\nimport { iOVM_FraudVerifier } from \"../../iOVM/verification/iOVM_FraudVerifier.sol\";\n\n/* Contract Imports */\nimport { OVM_StateTransitioner } from \"./OVM_StateTransitioner.sol\";\n\n/**\n * @title OVM_StateTransitionerFactory\n * @dev The State Transitioner Factory is used by the Fraud Verifier to create a new State \n * Transitioner during the initialization of a fraud proof.\n * \n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract OVM_StateTransitionerFactory is iOVM_StateTransitionerFactory, Lib_AddressResolver {\n\n /***************\n * Constructor *\n ***************/\n\n constructor(\n address _libAddressManager\n )\n Lib_AddressResolver(_libAddressManager)\n {}\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Creates a new OVM_StateTransitioner\n * @param _libAddressManager Address of the Address Manager.\n * @param _stateTransitionIndex Index of the state transition being verified.\n * @param _preStateRoot State root before the transition was executed.\n * @param _transactionHash Hash of the executed transaction.\n * @return New OVM_StateTransitioner instance.\n */\n function create(\n address _libAddressManager,\n uint256 _stateTransitionIndex,\n bytes32 _preStateRoot,\n bytes32 _transactionHash\n )\n override\n public\n returns (\n iOVM_StateTransitioner\n )\n {\n require(\n msg.sender == resolve(\"OVM_FraudVerifier\"),\n \"Create can only be done by the OVM_FraudVerifier.\"\n );\n\n return new OVM_StateTransitioner(\n _libAddressManager,\n _stateTransitionIndex,\n _preStateRoot,\n _transactionHash\n );\n }\n}\n" - }, - "contracts/optimistic-ethereum/iOVM/verification/iOVM_StateTransitionerFactory.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Contract Imports */\nimport { iOVM_StateTransitioner } from \"./iOVM_StateTransitioner.sol\";\n\n/**\n * @title iOVM_StateTransitionerFactory\n */\ninterface iOVM_StateTransitionerFactory {\n\n /***************************************\n * Public Functions: Contract Creation *\n ***************************************/\n\n function create(\n address _proxyManager,\n uint256 _stateTransitionIndex,\n bytes32 _preStateRoot,\n bytes32 _transactionHash\n )\n external\n returns (\n iOVM_StateTransitioner _ovmStateTransitioner\n );\n}\n" - }, - "contracts/optimistic-ethereum/iOVM/verification/iOVM_FraudVerifier.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/* Interface Imports */\nimport { iOVM_StateTransitioner } from \"./iOVM_StateTransitioner.sol\";\n\n/**\n * @title iOVM_FraudVerifier\n */\ninterface iOVM_FraudVerifier {\n\n /**********\n * Events *\n **********/\n\n event FraudProofInitialized(\n bytes32 _preStateRoot,\n uint256 _preStateRootIndex,\n bytes32 _transactionHash,\n address _who\n );\n\n event FraudProofFinalized(\n bytes32 _preStateRoot,\n uint256 _preStateRootIndex,\n bytes32 _transactionHash,\n address _who\n );\n\n\n /***************************************\n * Public Functions: Transition Status *\n ***************************************/\n\n function getStateTransitioner(bytes32 _preStateRoot, bytes32 _txHash) external view returns (iOVM_StateTransitioner _transitioner);\n\n\n /****************************************\n * Public Functions: Fraud Verification *\n ****************************************/\n\n function initializeFraudVerification(\n bytes32 _preStateRoot,\n Lib_OVMCodec.ChainBatchHeader calldata _preStateRootBatchHeader,\n Lib_OVMCodec.ChainInclusionProof calldata _preStateRootProof,\n Lib_OVMCodec.Transaction calldata _transaction,\n Lib_OVMCodec.TransactionChainElement calldata _txChainElement,\n Lib_OVMCodec.ChainBatchHeader calldata _transactionBatchHeader,\n Lib_OVMCodec.ChainInclusionProof calldata _transactionProof\n ) external;\n\n function finalizeFraudVerification(\n bytes32 _preStateRoot,\n Lib_OVMCodec.ChainBatchHeader calldata _preStateRootBatchHeader,\n Lib_OVMCodec.ChainInclusionProof calldata _preStateRootProof,\n bytes32 _txHash,\n bytes32 _postStateRoot,\n Lib_OVMCodec.ChainBatchHeader calldata _postStateRootBatchHeader,\n Lib_OVMCodec.ChainInclusionProof calldata _postStateRootProof\n ) external;\n}\n" - }, - "contracts/optimistic-ethereum/OVM/verification/OVM_FraudVerifier.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/* Interface Imports */\nimport { iOVM_FraudVerifier } from \"../../iOVM/verification/iOVM_FraudVerifier.sol\";\nimport { iOVM_StateTransitioner } from \"../../iOVM/verification/iOVM_StateTransitioner.sol\";\nimport { iOVM_StateTransitionerFactory } from \"../../iOVM/verification/iOVM_StateTransitionerFactory.sol\";\nimport { iOVM_BondManager } from \"../../iOVM/verification/iOVM_BondManager.sol\";\nimport { iOVM_StateCommitmentChain } from \"../../iOVM/chain/iOVM_StateCommitmentChain.sol\";\nimport { iOVM_CanonicalTransactionChain } from \"../../iOVM/chain/iOVM_CanonicalTransactionChain.sol\";\n\n/* Contract Imports */\nimport { Abs_FraudContributor } from \"./Abs_FraudContributor.sol\";\n\n\n\n/**\n * @title OVM_FraudVerifier\n * @dev The Fraud Verifier contract coordinates the entire fraud proof verification process. \n * If the fraud proof was successful it prunes any state batches from State Commitment Chain\n * which were published after the fraudulent state root.\n * \n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract OVM_FraudVerifier is Lib_AddressResolver, Abs_FraudContributor, iOVM_FraudVerifier {\n\n /*******************************************\n * Contract Variables: Internal Accounting *\n *******************************************/\n\n mapping (bytes32 => iOVM_StateTransitioner) internal transitioners;\n\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n constructor(\n address _libAddressManager\n )\n Lib_AddressResolver(_libAddressManager)\n {}\n\n\n /***************************************\n * Public Functions: Transition Status *\n ***************************************/\n\n /**\n * Retrieves the state transitioner for a given root.\n * @param _preStateRoot State root to query a transitioner for.\n * @return _transitioner Corresponding state transitioner contract.\n */\n function getStateTransitioner(\n bytes32 _preStateRoot,\n bytes32 _txHash\n )\n override\n public\n view\n returns (\n iOVM_StateTransitioner _transitioner\n )\n {\n return transitioners[keccak256(abi.encodePacked(_preStateRoot, _txHash))];\n }\n\n\n /****************************************\n * Public Functions: Fraud Verification *\n ****************************************/\n\n /**\n * Begins the fraud verification process.\n * @param _preStateRoot State root before the fraudulent transaction.\n * @param _preStateRootBatchHeader Batch header for the provided pre-state root.\n * @param _preStateRootProof Inclusion proof for the provided pre-state root.\n * @param _transaction OVM transaction claimed to be fraudulent.\n * @param _txChainElement OVM transaction chain element.\n * @param _transactionBatchHeader Batch header for the provided transaction.\n * @param _transactionProof Inclusion proof for the provided transaction.\n */\n function initializeFraudVerification(\n bytes32 _preStateRoot,\n Lib_OVMCodec.ChainBatchHeader memory _preStateRootBatchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _preStateRootProof,\n Lib_OVMCodec.Transaction memory _transaction,\n Lib_OVMCodec.TransactionChainElement memory _txChainElement,\n Lib_OVMCodec.ChainBatchHeader memory _transactionBatchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _transactionProof\n )\n override\n public\n contributesToFraudProof(_preStateRoot, Lib_OVMCodec.hashTransaction(_transaction))\n {\n bytes32 _txHash = Lib_OVMCodec.hashTransaction(_transaction);\n\n if (_hasStateTransitioner(_preStateRoot, _txHash)) {\n return;\n }\n\n iOVM_StateCommitmentChain ovmStateCommitmentChain = iOVM_StateCommitmentChain(resolve(\"OVM_StateCommitmentChain\"));\n iOVM_CanonicalTransactionChain ovmCanonicalTransactionChain = iOVM_CanonicalTransactionChain(resolve(\"OVM_CanonicalTransactionChain\"));\n\n require(\n ovmStateCommitmentChain.verifyStateCommitment(\n _preStateRoot,\n _preStateRootBatchHeader,\n _preStateRootProof\n ),\n \"Invalid pre-state root inclusion proof.\"\n );\n\n require(\n ovmCanonicalTransactionChain.verifyTransaction(\n _transaction,\n _txChainElement,\n _transactionBatchHeader,\n _transactionProof\n ),\n \"Invalid transaction inclusion proof.\"\n );\n\n require (\n _preStateRootBatchHeader.prevTotalElements + _preStateRootProof.index + 1 == _transactionBatchHeader.prevTotalElements + _transactionProof.index,\n \"Pre-state root global index must equal to the transaction root global index.\"\n );\n\n _deployTransitioner(_preStateRoot, _txHash, _preStateRootProof.index);\n\n emit FraudProofInitialized(\n _preStateRoot,\n _preStateRootProof.index,\n _txHash,\n msg.sender\n );\n }\n\n /**\n * Finalizes the fraud verification process.\n * @param _preStateRoot State root before the fraudulent transaction.\n * @param _preStateRootBatchHeader Batch header for the provided pre-state root.\n * @param _preStateRootProof Inclusion proof for the provided pre-state root.\n * @param _txHash The transaction for the state root\n * @param _postStateRoot State root after the fraudulent transaction.\n * @param _postStateRootBatchHeader Batch header for the provided post-state root.\n * @param _postStateRootProof Inclusion proof for the provided post-state root.\n */\n function finalizeFraudVerification(\n bytes32 _preStateRoot,\n Lib_OVMCodec.ChainBatchHeader memory _preStateRootBatchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _preStateRootProof,\n bytes32 _txHash,\n bytes32 _postStateRoot,\n Lib_OVMCodec.ChainBatchHeader memory _postStateRootBatchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _postStateRootProof\n )\n override\n public\n contributesToFraudProof(_preStateRoot, _txHash)\n {\n iOVM_StateTransitioner transitioner = getStateTransitioner(_preStateRoot, _txHash);\n iOVM_StateCommitmentChain ovmStateCommitmentChain = iOVM_StateCommitmentChain(resolve(\"OVM_StateCommitmentChain\"));\n\n require(\n transitioner.isComplete() == true,\n \"State transition process must be completed prior to finalization.\"\n );\n\n require (\n _postStateRootBatchHeader.prevTotalElements + _postStateRootProof.index == _preStateRootBatchHeader.prevTotalElements + _preStateRootProof.index + 1,\n \"Post-state root global index must equal to the pre state root global index plus one.\"\n );\n\n require(\n ovmStateCommitmentChain.verifyStateCommitment(\n _preStateRoot,\n _preStateRootBatchHeader,\n _preStateRootProof\n ),\n \"Invalid pre-state root inclusion proof.\"\n );\n\n require(\n ovmStateCommitmentChain.verifyStateCommitment(\n _postStateRoot,\n _postStateRootBatchHeader,\n _postStateRootProof\n ),\n \"Invalid post-state root inclusion proof.\"\n );\n\n // If the post state root did not match, then there was fraud and we should delete the batch\n require(\n _postStateRoot != transitioner.getPostStateRoot(),\n \"State transition has not been proven fraudulent.\"\n );\n \n _cancelStateTransition(_postStateRootBatchHeader, _preStateRoot);\n\n // TEMPORARY: Remove the transitioner; for minnet.\n transitioners[keccak256(abi.encodePacked(_preStateRoot, _txHash))] = iOVM_StateTransitioner(0x0000000000000000000000000000000000000000);\n\n emit FraudProofFinalized(\n _preStateRoot,\n _preStateRootProof.index,\n _txHash,\n msg.sender\n );\n }\n\n\n /************************************\n * Internal Functions: Verification *\n ************************************/\n\n /**\n * Checks whether a transitioner already exists for a given pre-state root.\n * @param _preStateRoot Pre-state root to check.\n * @return _exists Whether or not we already have a transitioner for the root.\n */\n function _hasStateTransitioner(\n bytes32 _preStateRoot,\n bytes32 _txHash\n )\n internal\n view\n returns (\n bool _exists\n )\n {\n return address(getStateTransitioner(_preStateRoot, _txHash)) != address(0);\n }\n\n /**\n * Deploys a new state transitioner.\n * @param _preStateRoot Pre-state root to initialize the transitioner with.\n * @param _txHash Hash of the transaction this transitioner will execute.\n * @param _stateTransitionIndex Index of the transaction in the chain.\n */\n function _deployTransitioner(\n bytes32 _preStateRoot,\n bytes32 _txHash,\n uint256 _stateTransitionIndex\n )\n internal\n {\n transitioners[keccak256(abi.encodePacked(_preStateRoot, _txHash))] = iOVM_StateTransitionerFactory(\n resolve(\"OVM_StateTransitionerFactory\")\n ).create(\n address(libAddressManager),\n _stateTransitionIndex,\n _preStateRoot,\n _txHash\n );\n }\n\n /**\n * Removes a state transition from the state commitment chain.\n * @param _postStateRootBatchHeader Header for the post-state root.\n * @param _preStateRoot Pre-state root hash.\n */\n function _cancelStateTransition(\n Lib_OVMCodec.ChainBatchHeader memory _postStateRootBatchHeader,\n bytes32 _preStateRoot\n )\n internal\n {\n iOVM_StateCommitmentChain ovmStateCommitmentChain = iOVM_StateCommitmentChain(resolve(\"OVM_StateCommitmentChain\"));\n iOVM_BondManager ovmBondManager = iOVM_BondManager(resolve(\"OVM_BondManager\"));\n\n // Delete the state batch.\n ovmStateCommitmentChain.deleteStateBatch(\n _postStateRootBatchHeader\n );\n\n // Get the timestamp and publisher for that block.\n (uint256 timestamp, address publisher) = abi.decode(_postStateRootBatchHeader.extraData, (uint256, address));\n\n // Slash the bonds at the bond manager.\n ovmBondManager.finalize(\n _preStateRoot,\n publisher,\n timestamp\n );\n }\n}\n" - }, - "contracts/optimistic-ethereum/iOVM/chain/iOVM_StateCommitmentChain.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/**\n * @title iOVM_StateCommitmentChain\n */\ninterface iOVM_StateCommitmentChain {\n\n /**********\n * Events *\n **********/\n\n event StateBatchAppended(\n uint256 indexed _batchIndex,\n bytes32 _batchRoot,\n uint256 _batchSize,\n uint256 _prevTotalElements,\n bytes _extraData\n );\n\n event StateBatchDeleted(\n uint256 indexed _batchIndex,\n bytes32 _batchRoot\n );\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Retrieves the total number of elements submitted.\n * @return _totalElements Total submitted elements.\n */\n function getTotalElements()\n external\n view\n returns (\n uint256 _totalElements\n );\n\n /**\n * Retrieves the total number of batches submitted.\n * @return _totalBatches Total submitted batches.\n */\n function getTotalBatches()\n external\n view\n returns (\n uint256 _totalBatches\n );\n\n /**\n * Retrieves the timestamp of the last batch submitted by the sequencer.\n * @return _lastSequencerTimestamp Last sequencer batch timestamp.\n */\n function getLastSequencerTimestamp()\n external\n view\n returns (\n uint256 _lastSequencerTimestamp\n );\n\n /**\n * Appends a batch of state roots to the chain.\n * @param _batch Batch of state roots.\n * @param _shouldStartAtElement Index of the element at which this batch should start.\n */\n function appendStateBatch(\n bytes32[] calldata _batch,\n uint256 _shouldStartAtElement\n )\n external;\n\n /**\n * Deletes all state roots after (and including) a given batch.\n * @param _batchHeader Header of the batch to start deleting from.\n */\n function deleteStateBatch(\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\n )\n external;\n\n /**\n * Verifies a batch inclusion proof.\n * @param _element Hash of the element to verify a proof for.\n * @param _batchHeader Header of the batch in which the element was included.\n * @param _proof Merkle inclusion proof for the element.\n */\n function verifyStateCommitment(\n bytes32 _element,\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _proof\n )\n external\n view\n returns (\n bool _verified\n );\n\n /**\n * Checks whether a given batch is still inside its fraud proof window.\n * @param _batchHeader Header of the batch to check.\n * @return _inside Whether or not the batch is inside the fraud proof window.\n */\n function insideFraudProofWindow(\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\n )\n external\n view\n returns (\n bool _inside\n );\n}\n" - }, - "contracts/optimistic-ethereum/iOVM/chain/iOVM_CanonicalTransactionChain.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/* Interface Imports */\nimport { iOVM_ChainStorageContainer } from \"./iOVM_ChainStorageContainer.sol\";\n\n/**\n * @title iOVM_CanonicalTransactionChain\n */\ninterface iOVM_CanonicalTransactionChain {\n\n /**********\n * Events *\n **********/\n\n event TransactionEnqueued(\n address _l1TxOrigin,\n address _target,\n uint256 _gasLimit,\n bytes _data,\n uint256 _queueIndex,\n uint256 _timestamp\n );\n\n event QueueBatchAppended(\n uint256 _startingQueueIndex,\n uint256 _numQueueElements,\n uint256 _totalElements\n );\n\n event SequencerBatchAppended(\n uint256 _startingQueueIndex,\n uint256 _numQueueElements,\n uint256 _totalElements\n );\n\n event TransactionBatchAppended(\n uint256 indexed _batchIndex,\n bytes32 _batchRoot,\n uint256 _batchSize,\n uint256 _prevTotalElements,\n bytes _extraData\n );\n\n\n /***********\n * Structs *\n ***********/\n\n struct BatchContext {\n uint256 numSequencedTransactions;\n uint256 numSubsequentQueueTransactions;\n uint256 timestamp;\n uint256 blockNumber;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n\n /**\n * Accesses the batch storage container.\n * @return Reference to the batch storage container.\n */\n function batches()\n external\n view\n returns (\n iOVM_ChainStorageContainer\n );\n\n /**\n * Accesses the queue storage container.\n * @return Reference to the queue storage container.\n */\n function queue()\n external\n view\n returns (\n iOVM_ChainStorageContainer\n );\n\n /**\n * Retrieves the total number of elements submitted.\n * @return _totalElements Total submitted elements.\n */\n function getTotalElements()\n external\n view\n returns (\n uint256 _totalElements\n );\n\n /**\n * Retrieves the total number of batches submitted.\n * @return _totalBatches Total submitted batches.\n */\n function getTotalBatches()\n external\n view\n returns (\n uint256 _totalBatches\n );\n\n /**\n * Returns the index of the next element to be enqueued.\n * @return Index for the next queue element.\n */\n function getNextQueueIndex()\n external\n view\n returns (\n uint40\n );\n\n /**\n * Gets the queue element at a particular index.\n * @param _index Index of the queue element to access.\n * @return _element Queue element at the given index.\n */\n function getQueueElement(\n uint256 _index\n )\n external\n view\n returns (\n Lib_OVMCodec.QueueElement memory _element\n );\n\n /**\n * Returns the timestamp of the last transaction.\n * @return Timestamp for the last transaction.\n */\n function getLastTimestamp()\n external\n view\n returns (\n uint40\n );\n\n /**\n * Returns the blocknumber of the last transaction.\n * @return Blocknumber for the last transaction.\n */\n function getLastBlockNumber()\n external\n view\n returns (\n uint40\n );\n\n /**\n * Get the number of queue elements which have not yet been included.\n * @return Number of pending queue elements.\n */\n function getNumPendingQueueElements()\n external\n view\n returns (\n uint40\n );\n\n /**\n * Retrieves the length of the queue, including\n * both pending and canonical transactions.\n * @return Length of the queue.\n */\n function getQueueLength()\n external\n view\n returns (\n uint40\n );\n\n\n /**\n * Adds a transaction to the queue.\n * @param _target Target contract to send the transaction to.\n * @param _gasLimit Gas limit for the given transaction.\n * @param _data Transaction data.\n */\n function enqueue(\n address _target,\n uint256 _gasLimit,\n bytes memory _data\n )\n external;\n\n /**\n * Appends a given number of queued transactions as a single batch.\n * @param _numQueuedTransactions Number of transactions to append.\n */\n function appendQueueBatch(\n uint256 _numQueuedTransactions\n )\n external;\n\n /**\n * Allows the sequencer to append a batch of transactions.\n * @dev This function uses a custom encoding scheme for efficiency reasons.\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\n * .param _contexts Array of batch contexts.\n * .param _transactionDataFields Array of raw transaction data.\n */\n function appendSequencerBatch(\n // uint40 _shouldStartAtElement,\n // uint24 _totalElementsToAppend,\n // BatchContext[] _contexts,\n // bytes[] _transactionDataFields\n )\n external;\n\n /**\n * Verifies whether a transaction is included in the chain.\n * @param _transaction Transaction to verify.\n * @param _txChainElement Transaction chain element corresponding to the transaction.\n * @param _batchHeader Header of the batch the transaction was included in.\n * @param _inclusionProof Inclusion proof for the provided transaction chain element.\n * @return True if the transaction exists in the CTC, false if not.\n */\n function verifyTransaction(\n Lib_OVMCodec.Transaction memory _transaction,\n Lib_OVMCodec.TransactionChainElement memory _txChainElement,\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _inclusionProof\n )\n external\n view\n returns (\n bool\n );\n}\n" - }, - "contracts/optimistic-ethereum/iOVM/chain/iOVM_ChainStorageContainer.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/**\n * @title iOVM_ChainStorageContainer\n */\ninterface iOVM_ChainStorageContainer {\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\n * 27 bytes to store arbitrary data.\n * @param _globalMetadata New global metadata to set.\n */\n function setGlobalMetadata(\n bytes27 _globalMetadata\n )\n external;\n\n /**\n * Retrieves the container's global metadata field.\n * @return Container global metadata field.\n */\n function getGlobalMetadata()\n external\n view\n returns (\n bytes27\n );\n\n /**\n * Retrieves the number of objects stored in the container.\n * @return Number of objects in the container.\n */\n function length()\n external\n view\n returns (\n uint256\n );\n\n /**\n * Pushes an object into the container.\n * @param _object A 32 byte value to insert into the container.\n */\n function push(\n bytes32 _object\n )\n external;\n\n /**\n * Pushes an object into the container. Function allows setting the global metadata since\n * we'll need to touch the \"length\" storage slot anyway, which also contains the global\n * metadata (it's an optimization).\n * @param _object A 32 byte value to insert into the container.\n * @param _globalMetadata New global metadata for the container.\n */\n function push(\n bytes32 _object,\n bytes27 _globalMetadata\n )\n external;\n\n /**\n * Retrieves an object from the container.\n * @param _index Index of the particular object to access.\n * @return 32 byte object value.\n */\n function get(\n uint256 _index\n )\n external\n view\n returns (\n bytes32\n );\n\n /**\n * Removes all objects after and including a given index.\n * @param _index Object index to delete from.\n */\n function deleteElementsAfterInclusive(\n uint256 _index\n )\n external;\n\n /**\n * Removes all objects after and including a given index. Also allows setting the global\n * metadata field.\n * @param _index Object index to delete from.\n * @param _globalMetadata New global metadata for the container.\n */\n function deleteElementsAfterInclusive(\n uint256 _index,\n bytes27 _globalMetadata\n )\n external;\n\n /**\n * Marks an index as overwritable, meaing the underlying buffer can start to write values over\n * any objects before and including the given index.\n */\n function setNextOverwritableIndex(\n uint256 _index\n )\n external;\n}\n" - }, - "contracts/optimistic-ethereum/OVM/verification/OVM_BondManager.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Library Imports */\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/* Interface Imports */\nimport { iOVM_BondManager, Errors, ERC20 } from \"../../iOVM/verification/iOVM_BondManager.sol\";\nimport { iOVM_FraudVerifier } from \"../../iOVM/verification/iOVM_FraudVerifier.sol\";\n\n/**\n * @title OVM_BondManager\n * @dev The Bond Manager contract handles deposits in the form of an ERC20 token from bonded \n * Proposers. It also handles the accounting of gas costs spent by a Verifier during the course of a\n * fraud proof. In the event of a successful fraud proof, the fraudulent Proposer's bond is slashed, \n * and the Verifier's gas costs are refunded.\n * \n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract OVM_BondManager is iOVM_BondManager, Lib_AddressResolver {\n\n /****************************\n * Constants and Parameters *\n ****************************/\n\n /// The period to find the earliest fraud proof for a publisher\n uint256 public constant multiFraudProofPeriod = 7 days;\n\n /// The dispute period\n uint256 public constant disputePeriodSeconds = 7 days;\n\n /// The minimum collateral a sequencer must post\n uint256 public constant requiredCollateral = 1 ether;\n\n\n /*******************************************\n * Contract Variables: Contract References *\n *******************************************/\n\n /// The bond token\n ERC20 immutable public token;\n\n\n /********************************************\n * Contract Variables: Internal Accounting *\n *******************************************/\n\n /// The bonds posted by each proposer\n mapping(address => Bond) public bonds;\n\n /// For each pre-state root, there's an array of witnessProviders that must be rewarded\n /// for posting witnesses\n mapping(bytes32 => Rewards) public witnessProviders;\n\n\n /***************\n * Constructor *\n ***************/\n\n /// Initializes with a ERC20 token to be used for the fidelity bonds\n /// and with the Address Manager\n constructor(\n ERC20 _token,\n address _libAddressManager\n )\n Lib_AddressResolver(_libAddressManager)\n {\n token = _token;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n /// Adds `who` to the list of witnessProviders for the provided `preStateRoot`.\n function recordGasSpent(bytes32 _preStateRoot, bytes32 _txHash, address who, uint256 gasSpent) override public {\n // The sender must be the transitioner that corresponds to the claimed pre-state root\n address transitioner = address(iOVM_FraudVerifier(resolve(\"OVM_FraudVerifier\")).getStateTransitioner(_preStateRoot, _txHash));\n require(transitioner == msg.sender, Errors.ONLY_TRANSITIONER);\n\n witnessProviders[_preStateRoot].total += gasSpent;\n witnessProviders[_preStateRoot].gasSpent[who] += gasSpent;\n }\n\n /// Slashes + distributes rewards or frees up the sequencer's bond, only called by\n /// `FraudVerifier.finalizeFraudVerification`\n function finalize(bytes32 _preStateRoot, address publisher, uint256 timestamp) override public {\n require(msg.sender == resolve(\"OVM_FraudVerifier\"), Errors.ONLY_FRAUD_VERIFIER);\n require(witnessProviders[_preStateRoot].canClaim == false, Errors.ALREADY_FINALIZED);\n\n // allow users to claim from that state root's\n // pool of collateral (effectively slashing the sequencer)\n witnessProviders[_preStateRoot].canClaim = true;\n\n Bond storage bond = bonds[publisher];\n if (bond.firstDisputeAt == 0) {\n bond.firstDisputeAt = block.timestamp;\n bond.earliestDisputedStateRoot = _preStateRoot;\n bond.earliestTimestamp = timestamp;\n } else if (\n // only update the disputed state root for the publisher if it's within\n // the dispute period _and_ if it's before the previous one\n block.timestamp < bond.firstDisputeAt + multiFraudProofPeriod &&\n timestamp < bond.earliestTimestamp\n ) {\n bond.earliestDisputedStateRoot = _preStateRoot;\n bond.earliestTimestamp = timestamp;\n }\n\n // if the fraud proof's dispute period does not intersect with the \n // withdrawal's timestamp, then the user should not be slashed\n // e.g if a user at day 10 submits a withdrawal, and a fraud proof\n // from day 1 gets published, the user won't be slashed since day 8 (1d + 7d)\n // is before the user started their withdrawal. on the contrary, if the user\n // had started their withdrawal at, say, day 6, they would be slashed\n if (\n bond.withdrawalTimestamp != 0 && \n uint256(bond.withdrawalTimestamp) > timestamp + disputePeriodSeconds &&\n bond.state == State.WITHDRAWING\n ) {\n return;\n }\n\n // slash!\n bond.state = State.NOT_COLLATERALIZED;\n }\n\n /// Sequencers call this function to post collateral which will be used for\n /// the `appendBatch` call\n function deposit() override public {\n require(\n token.transferFrom(msg.sender, address(this), requiredCollateral),\n Errors.ERC20_ERR\n );\n\n // This cannot overflow\n bonds[msg.sender].state = State.COLLATERALIZED;\n }\n\n /// Starts the withdrawal for a publisher\n function startWithdrawal() override public {\n Bond storage bond = bonds[msg.sender];\n require(bond.withdrawalTimestamp == 0, Errors.WITHDRAWAL_PENDING);\n require(bond.state == State.COLLATERALIZED, Errors.WRONG_STATE);\n\n bond.state = State.WITHDRAWING;\n bond.withdrawalTimestamp = uint32(block.timestamp);\n }\n\n /// Finalizes a pending withdrawal from a publisher\n function finalizeWithdrawal() override public {\n Bond storage bond = bonds[msg.sender];\n\n require(\n block.timestamp >= uint256(bond.withdrawalTimestamp) + disputePeriodSeconds, \n Errors.TOO_EARLY\n );\n require(bond.state == State.WITHDRAWING, Errors.SLASHED);\n \n // refunds!\n bond.state = State.NOT_COLLATERALIZED;\n bond.withdrawalTimestamp = 0;\n \n require(\n token.transfer(msg.sender, requiredCollateral),\n Errors.ERC20_ERR\n );\n }\n\n /// Claims the user's reward for the witnesses they provided for the earliest\n /// disputed state root of the designated publisher\n function claim(address who) override public {\n Bond storage bond = bonds[who];\n require(\n block.timestamp >= bond.firstDisputeAt + multiFraudProofPeriod,\n Errors.WAIT_FOR_DISPUTES\n );\n\n // reward the earliest state root for this publisher\n bytes32 _preStateRoot = bond.earliestDisputedStateRoot;\n Rewards storage rewards = witnessProviders[_preStateRoot];\n\n // only allow claiming if fraud was proven in `finalize`\n require(rewards.canClaim, Errors.CANNOT_CLAIM);\n\n // proportional allocation - only reward 50% (rest gets locked in the\n // contract forever\n uint256 amount = (requiredCollateral * rewards.gasSpent[msg.sender]) / (2 * rewards.total);\n\n // reset the user's spent gas so they cannot double claim\n rewards.gasSpent[msg.sender] = 0;\n\n // transfer\n require(token.transfer(msg.sender, amount), Errors.ERC20_ERR);\n }\n\n /// Checks if the user is collateralized\n function isCollateralized(address who) override public view returns (bool) {\n return bonds[who].state == State.COLLATERALIZED;\n }\n\n /// Gets how many witnesses the user has provided for the state root\n function getGasSpent(bytes32 preStateRoot, address who) override public view returns (uint256) {\n return witnessProviders[preStateRoot].gasSpent[who];\n }\n}\n" - }, - "contracts/test-helpers/Mock_FraudVerifier.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\nimport { OVM_BondManager } from \"./../optimistic-ethereum/OVM/verification/OVM_BondManager.sol\";\n\ncontract Mock_FraudVerifier {\n OVM_BondManager bondManager;\n\n mapping (bytes32 => address) transitioners;\n\n function setBondManager(OVM_BondManager _bondManager) public {\n bondManager = _bondManager;\n }\n\n function setStateTransitioner(bytes32 preStateRoot, bytes32 txHash, address addr) public {\n transitioners[keccak256(abi.encodePacked(preStateRoot, txHash))] = addr;\n }\n\n function getStateTransitioner(\n bytes32 _preStateRoot,\n bytes32 _txHash\n )\n public\n view\n returns (\n address\n )\n {\n return transitioners[keccak256(abi.encodePacked(_preStateRoot, _txHash))];\n }\n\n function finalize(bytes32 _preStateRoot, address publisher, uint256 timestamp) public {\n bondManager.finalize(_preStateRoot, publisher, timestamp);\n }\n}\n" - }, - "contracts/optimistic-ethereum/OVM/chain/OVM_StateCommitmentChain.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\nimport { Lib_MerkleTree } from \"../../libraries/utils/Lib_MerkleTree.sol\";\n\n/* Interface Imports */\nimport { iOVM_FraudVerifier } from \"../../iOVM/verification/iOVM_FraudVerifier.sol\";\nimport { iOVM_StateCommitmentChain } from \"../../iOVM/chain/iOVM_StateCommitmentChain.sol\";\nimport { iOVM_CanonicalTransactionChain } from \"../../iOVM/chain/iOVM_CanonicalTransactionChain.sol\";\nimport { iOVM_BondManager } from \"../../iOVM/verification/iOVM_BondManager.sol\";\nimport { iOVM_ChainStorageContainer } from \"../../iOVM/chain/iOVM_ChainStorageContainer.sol\";\n\n/* External Imports */\nimport '@openzeppelin/contracts/math/SafeMath.sol';\n\n/**\n * @title OVM_StateCommitmentChain\n * @dev The State Commitment Chain (SCC) contract contains a list of proposed state roots which\n * Proposers assert to be a result of each transaction in the Canonical Transaction Chain (CTC).\n * Elements here have a 1:1 correspondence with transactions in the CTC, and should be the unique\n * state root calculated off-chain by applying the canonical transactions one by one.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract OVM_StateCommitmentChain is iOVM_StateCommitmentChain, Lib_AddressResolver {\n\n /*************\n * Constants *\n *************/\n\n uint256 public FRAUD_PROOF_WINDOW;\n uint256 public SEQUENCER_PUBLISH_WINDOW;\n\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n constructor(\n address _libAddressManager,\n uint256 _fraudProofWindow,\n uint256 _sequencerPublishWindow\n )\n Lib_AddressResolver(_libAddressManager)\n {\n FRAUD_PROOF_WINDOW = _fraudProofWindow;\n SEQUENCER_PUBLISH_WINDOW = _sequencerPublishWindow;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Accesses the batch storage container.\n * @return Reference to the batch storage container.\n */\n function batches()\n public\n view\n returns (\n iOVM_ChainStorageContainer\n )\n {\n return iOVM_ChainStorageContainer(\n resolve(\"OVM_ChainStorageContainer:SCC:batches\")\n );\n }\n\n /**\n * @inheritdoc iOVM_StateCommitmentChain\n */\n function getTotalElements()\n override\n public\n view\n returns (\n uint256 _totalElements\n )\n {\n (uint40 totalElements, ) = _getBatchExtraData();\n return uint256(totalElements);\n }\n\n /**\n * @inheritdoc iOVM_StateCommitmentChain\n */\n function getTotalBatches()\n override\n public\n view\n returns (\n uint256 _totalBatches\n )\n {\n return batches().length();\n }\n\n /**\n * @inheritdoc iOVM_StateCommitmentChain\n */\n function getLastSequencerTimestamp()\n override\n public\n view\n returns (\n uint256 _lastSequencerTimestamp\n )\n {\n (, uint40 lastSequencerTimestamp) = _getBatchExtraData();\n return uint256(lastSequencerTimestamp);\n }\n\n /**\n * @inheritdoc iOVM_StateCommitmentChain\n */\n function appendStateBatch(\n bytes32[] memory _batch,\n uint256 _shouldStartAtElement\n )\n override\n public\n {\n // Fail fast in to make sure our batch roots aren't accidentally made fraudulent by the\n // publication of batches by some other user.\n require(\n _shouldStartAtElement == getTotalElements(),\n \"Actual batch start index does not match expected start index.\"\n );\n\n // Proposers must have previously staked at the BondManager\n require(\n iOVM_BondManager(resolve(\"OVM_BondManager\")).isCollateralized(msg.sender),\n \"Proposer does not have enough collateral posted\"\n );\n\n require(\n _batch.length > 0,\n \"Cannot submit an empty state batch.\"\n );\n\n require(\n getTotalElements() + _batch.length <= iOVM_CanonicalTransactionChain(resolve(\"OVM_CanonicalTransactionChain\")).getTotalElements(),\n \"Number of state roots cannot exceed the number of canonical transactions.\"\n );\n\n // Pass the block's timestamp and the publisher of the data\n // to be used in the fraud proofs\n _appendBatch(\n _batch,\n abi.encode(block.timestamp, msg.sender)\n );\n }\n\n /**\n * @inheritdoc iOVM_StateCommitmentChain\n */\n function deleteStateBatch(\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\n )\n override\n public\n {\n require(\n msg.sender == resolve(\"OVM_FraudVerifier\"),\n \"State batches can only be deleted by the OVM_FraudVerifier.\"\n );\n\n require(\n _isValidBatchHeader(_batchHeader),\n \"Invalid batch header.\"\n );\n\n require(\n insideFraudProofWindow(_batchHeader),\n \"State batches can only be deleted within the fraud proof window.\"\n );\n\n _deleteBatch(_batchHeader);\n }\n\n /**\n * @inheritdoc iOVM_StateCommitmentChain\n */\n function verifyStateCommitment(\n bytes32 _element,\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _proof\n )\n override\n public\n view\n returns (\n bool\n )\n {\n require(\n _isValidBatchHeader(_batchHeader),\n \"Invalid batch header.\"\n );\n\n require(\n Lib_MerkleTree.verify(\n _batchHeader.batchRoot,\n _element,\n _proof.index,\n _proof.siblings,\n _batchHeader.batchSize\n ),\n \"Invalid inclusion proof.\"\n );\n\n return true;\n }\n\n /**\n * @inheritdoc iOVM_StateCommitmentChain\n */\n function insideFraudProofWindow(\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\n )\n override\n public\n view\n returns (\n bool _inside\n )\n {\n (uint256 timestamp,) = abi.decode(\n _batchHeader.extraData,\n (uint256, address)\n );\n\n require(\n timestamp != 0,\n \"Batch header timestamp cannot be zero\"\n );\n return SafeMath.add(timestamp, FRAUD_PROOF_WINDOW) > block.timestamp;\n }\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Parses the batch context from the extra data.\n * @return Total number of elements submitted.\n * @return Timestamp of the last batch submitted by the sequencer.\n */\n function _getBatchExtraData()\n internal\n view\n returns (\n uint40,\n uint40\n )\n {\n bytes27 extraData = batches().getGlobalMetadata();\n\n uint40 totalElements;\n uint40 lastSequencerTimestamp;\n assembly {\n extraData := shr(40, extraData)\n totalElements := and(extraData, 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF)\n lastSequencerTimestamp := shr(40, and(extraData, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000))\n }\n\n return (\n totalElements,\n lastSequencerTimestamp\n );\n }\n\n /**\n * Encodes the batch context for the extra data.\n * @param _totalElements Total number of elements submitted.\n * @param _lastSequencerTimestamp Timestamp of the last batch submitted by the sequencer.\n * @return Encoded batch context.\n */\n function _makeBatchExtraData(\n uint40 _totalElements,\n uint40 _lastSequencerTimestamp\n )\n internal\n pure\n returns (\n bytes27\n )\n {\n bytes27 extraData;\n assembly {\n extraData := _totalElements\n extraData := or(extraData, shl(40, _lastSequencerTimestamp))\n extraData := shl(40, extraData)\n }\n\n return extraData;\n }\n\n /**\n * Appends a batch to the chain.\n * @param _batch Elements within the batch.\n * @param _extraData Any extra data to append to the batch.\n */\n function _appendBatch(\n bytes32[] memory _batch,\n bytes memory _extraData\n )\n internal\n {\n address sequencer = resolve(\"OVM_Proposer\");\n (uint40 totalElements, uint40 lastSequencerTimestamp) = _getBatchExtraData();\n\n if (msg.sender == sequencer) {\n lastSequencerTimestamp = uint40(block.timestamp);\n } else {\n // We keep track of the last batch submitted by the sequencer so there's a window in\n // which only the sequencer can publish state roots. A window like this just reduces\n // the chance of \"system breaking\" state roots being published while we're still in\n // testing mode. This window should be removed or significantly reduced in the future.\n require(\n lastSequencerTimestamp + SEQUENCER_PUBLISH_WINDOW < block.timestamp,\n \"Cannot publish state roots within the sequencer publication window.\"\n );\n }\n\n // For efficiency reasons getMerkleRoot modifies the `_batch` argument in place\n // while calculating the root hash therefore any arguments passed to it must not\n // be used again afterwards\n Lib_OVMCodec.ChainBatchHeader memory batchHeader = Lib_OVMCodec.ChainBatchHeader({\n batchIndex: getTotalBatches(),\n batchRoot: Lib_MerkleTree.getMerkleRoot(_batch),\n batchSize: _batch.length,\n prevTotalElements: totalElements,\n extraData: _extraData\n });\n\n emit StateBatchAppended(\n batchHeader.batchIndex,\n batchHeader.batchRoot,\n batchHeader.batchSize,\n batchHeader.prevTotalElements,\n batchHeader.extraData\n );\n\n batches().push(\n Lib_OVMCodec.hashBatchHeader(batchHeader),\n _makeBatchExtraData(\n uint40(batchHeader.prevTotalElements + batchHeader.batchSize),\n lastSequencerTimestamp\n )\n );\n }\n\n /**\n * Removes a batch and all subsequent batches from the chain.\n * @param _batchHeader Header of the batch to remove.\n */\n function _deleteBatch(\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\n )\n internal\n {\n require(\n _batchHeader.batchIndex < batches().length(),\n \"Invalid batch index.\"\n );\n\n require(\n _isValidBatchHeader(_batchHeader),\n \"Invalid batch header.\"\n );\n\n batches().deleteElementsAfterInclusive(\n _batchHeader.batchIndex,\n _makeBatchExtraData(\n uint40(_batchHeader.prevTotalElements),\n 0\n )\n );\n\n emit StateBatchDeleted(\n _batchHeader.batchIndex,\n _batchHeader.batchRoot\n );\n }\n\n /**\n * Checks that a batch header matches the stored hash for the given index.\n * @param _batchHeader Batch header to validate.\n * @return Whether or not the header matches the stored one.\n */\n function _isValidBatchHeader(\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\n )\n internal\n view\n returns (\n bool\n )\n {\n return Lib_OVMCodec.hashBatchHeader(_batchHeader) == batches().get(_batchHeader.batchIndex);\n }\n}\n" - }, - "contracts/optimistic-ethereum/libraries/utils/Lib_MerkleTree.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/**\n * @title Lib_MerkleTree\n * @author River Keefer\n */\nlibrary Lib_MerkleTree {\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Calculates a merkle root for a list of 32-byte leaf hashes. WARNING: If the number\n * of leaves passed in is not a power of two, it pads out the tree with zero hashes.\n * If you do not know the original length of elements for the tree you are verifying,\n * then this may allow empty leaves past _elements.length to pass a verification check down the line.\n * Note that the _elements argument is modified, therefore it must not be used again afterwards\n * @param _elements Array of hashes from which to generate a merkle root.\n * @return Merkle root of the leaves, with zero hashes for non-powers-of-two (see above).\n */\n function getMerkleRoot(\n bytes32[] memory _elements\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n require(\n _elements.length > 0,\n \"Lib_MerkleTree: Must provide at least one leaf hash.\"\n );\n\n if (_elements.length == 1) {\n return _elements[0];\n }\n\n uint256[16] memory defaults = [\n 0x290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563,\n 0x633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d,\n 0x890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d,\n 0x3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd8,\n 0xecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da,\n 0xdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da5,\n 0x617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d7,\n 0x292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead,\n 0xe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e10,\n 0x7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f82,\n 0xe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e83636516,\n 0x3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c,\n 0xad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e,\n 0xa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab,\n 0x4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c862,\n 0x2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf10\n ];\n\n // Reserve memory space for our hashes.\n bytes memory buf = new bytes(64);\n\n // We'll need to keep track of left and right siblings.\n bytes32 leftSibling;\n bytes32 rightSibling;\n\n // Number of non-empty nodes at the current depth.\n uint256 rowSize = _elements.length;\n\n // Current depth, counting from 0 at the leaves\n uint256 depth = 0;\n\n // Common sub-expressions\n uint256 halfRowSize; // rowSize / 2\n bool rowSizeIsOdd; // rowSize % 2 == 1\n\n while (rowSize > 1) {\n halfRowSize = rowSize / 2;\n rowSizeIsOdd = rowSize % 2 == 1;\n\n for (uint256 i = 0; i < halfRowSize; i++) {\n leftSibling = _elements[(2 * i) ];\n rightSibling = _elements[(2 * i) + 1];\n assembly {\n mstore(add(buf, 32), leftSibling )\n mstore(add(buf, 64), rightSibling)\n }\n\n _elements[i] = keccak256(buf);\n }\n\n if (rowSizeIsOdd) {\n leftSibling = _elements[rowSize - 1];\n rightSibling = bytes32(defaults[depth]);\n assembly {\n mstore(add(buf, 32), leftSibling)\n mstore(add(buf, 64), rightSibling)\n }\n\n _elements[halfRowSize] = keccak256(buf);\n }\n\n rowSize = halfRowSize + (rowSizeIsOdd ? 1 : 0);\n depth++;\n }\n\n return _elements[0];\n }\n\n /**\n * Verifies a merkle branch for the given leaf hash. Assumes the original length\n * of leaves generated is a known, correct input, and does not return true for indices\n * extending past that index (even if _siblings would be otherwise valid.)\n * @param _root The Merkle root to verify against.\n * @param _leaf The leaf hash to verify inclusion of.\n * @param _index The index in the tree of this leaf.\n * @param _siblings Array of sibline nodes in the inclusion proof, starting from depth 0 (bottom of the tree).\n * @param _totalLeaves The total number of leaves originally passed into.\n * @return Whether or not the merkle branch and leaf passes verification.\n */\n function verify(\n bytes32 _root,\n bytes32 _leaf,\n uint256 _index,\n bytes32[] memory _siblings,\n uint256 _totalLeaves\n )\n internal\n pure\n returns (\n bool\n )\n {\n require(\n _totalLeaves > 0,\n \"Lib_MerkleTree: Total leaves must be greater than zero.\"\n );\n\n require(\n _index < _totalLeaves,\n \"Lib_MerkleTree: Index out of bounds.\"\n );\n\n require(\n _siblings.length == _ceilLog2(_totalLeaves),\n \"Lib_MerkleTree: Total siblings does not correctly correspond to total leaves.\"\n );\n\n bytes32 computedRoot = _leaf;\n\n for (uint256 i = 0; i < _siblings.length; i++) {\n if ((_index & 1) == 1) {\n computedRoot = keccak256(\n abi.encodePacked(\n _siblings[i],\n computedRoot\n )\n );\n } else {\n computedRoot = keccak256(\n abi.encodePacked(\n computedRoot,\n _siblings[i]\n )\n );\n }\n\n _index >>= 1;\n }\n\n return _root == computedRoot;\n }\n\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * Calculates the integer ceiling of the log base 2 of an input.\n * @param _in Unsigned input to calculate the log.\n * @return ceil(log_base_2(_in))\n */\n function _ceilLog2(\n uint256 _in\n )\n private\n pure\n returns (\n uint256\n )\n {\n require(\n _in > 0,\n \"Lib_MerkleTree: Cannot compute ceil(log_2) of 0.\"\n );\n\n if (_in == 1) {\n return 0;\n }\n\n // Find the highest set bit (will be floor(log_2)).\n // Borrowed with <3 from https://github.com/ethereum/solidity-examples\n uint256 val = _in;\n uint256 highest = 0;\n for (uint256 i = 128; i >= 1; i >>= 1) {\n if (val & (uint(1) << i) - 1 << i != 0) {\n highest += i;\n val >>= i;\n }\n }\n\n // Increment by one if this is not a perfect logarithm.\n if ((uint(1) << highest) != _in) {\n highest += 1;\n }\n\n return highest;\n }\n}\n" - }, - "@openzeppelin/contracts/math/SafeMath.sol": { - "content": "// SPDX-License-Identifier: MIT\n\npragma solidity >=0.6.0 <0.8.0;\n\n/**\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\n * checks.\n *\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\n * in bugs, because programmers usually assume that an overflow raises an\n * error, which is the standard behavior in high level programming languages.\n * `SafeMath` restores this intuition by reverting the transaction when an\n * operation overflows.\n *\n * Using this library instead of the unchecked operations eliminates an entire\n * class of bugs, so it's recommended to use it always.\n */\nlibrary SafeMath {\n /**\n * @dev Returns the addition of two unsigned integers, with an overflow flag.\n *\n * _Available since v3.4._\n */\n function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n uint256 c = a + b;\n if (c < a) return (false, 0);\n return (true, c);\n }\n\n /**\n * @dev Returns the substraction of two unsigned integers, with an overflow flag.\n *\n * _Available since v3.4._\n */\n function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n if (b > a) return (false, 0);\n return (true, a - b);\n }\n\n /**\n * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\n *\n * _Available since v3.4._\n */\n function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\n // benefit is lost if 'b' is also tested.\n // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\n if (a == 0) return (true, 0);\n uint256 c = a * b;\n if (c / a != b) return (false, 0);\n return (true, c);\n }\n\n /**\n * @dev Returns the division of two unsigned integers, with a division by zero flag.\n *\n * _Available since v3.4._\n */\n function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n if (b == 0) return (false, 0);\n return (true, a / b);\n }\n\n /**\n * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\n *\n * _Available since v3.4._\n */\n function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n if (b == 0) return (false, 0);\n return (true, a % b);\n }\n\n /**\n * @dev Returns the addition of two unsigned integers, reverting on\n * overflow.\n *\n * Counterpart to Solidity's `+` operator.\n *\n * Requirements:\n *\n * - Addition cannot overflow.\n */\n function add(uint256 a, uint256 b) internal pure returns (uint256) {\n uint256 c = a + b;\n require(c >= a, \"SafeMath: addition overflow\");\n return c;\n }\n\n /**\n * @dev Returns the subtraction of two unsigned integers, reverting on\n * overflow (when the result is negative).\n *\n * Counterpart to Solidity's `-` operator.\n *\n * Requirements:\n *\n * - Subtraction cannot overflow.\n */\n function sub(uint256 a, uint256 b) internal pure returns (uint256) {\n require(b <= a, \"SafeMath: subtraction overflow\");\n return a - b;\n }\n\n /**\n * @dev Returns the multiplication of two unsigned integers, reverting on\n * overflow.\n *\n * Counterpart to Solidity's `*` operator.\n *\n * Requirements:\n *\n * - Multiplication cannot overflow.\n */\n function mul(uint256 a, uint256 b) internal pure returns (uint256) {\n if (a == 0) return 0;\n uint256 c = a * b;\n require(c / a == b, \"SafeMath: multiplication overflow\");\n return c;\n }\n\n /**\n * @dev Returns the integer division of two unsigned integers, reverting on\n * division by zero. The result is rounded towards zero.\n *\n * Counterpart to Solidity's `/` operator. Note: this function uses a\n * `revert` opcode (which leaves remaining gas untouched) while Solidity\n * uses an invalid opcode to revert (consuming all remaining gas).\n *\n * Requirements:\n *\n * - The divisor cannot be zero.\n */\n function div(uint256 a, uint256 b) internal pure returns (uint256) {\n require(b > 0, \"SafeMath: division by zero\");\n return a / b;\n }\n\n /**\n * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\n * reverting when dividing by zero.\n *\n * Counterpart to Solidity's `%` operator. This function uses a `revert`\n * opcode (which leaves remaining gas untouched) while Solidity uses an\n * invalid opcode to revert (consuming all remaining gas).\n *\n * Requirements:\n *\n * - The divisor cannot be zero.\n */\n function mod(uint256 a, uint256 b) internal pure returns (uint256) {\n require(b > 0, \"SafeMath: modulo by zero\");\n return a % b;\n }\n\n /**\n * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\n * overflow (when the result is negative).\n *\n * CAUTION: This function is deprecated because it requires allocating memory for the error\n * message unnecessarily. For custom revert reasons use {trySub}.\n *\n * Counterpart to Solidity's `-` operator.\n *\n * Requirements:\n *\n * - Subtraction cannot overflow.\n */\n function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\n require(b <= a, errorMessage);\n return a - b;\n }\n\n /**\n * @dev Returns the integer division of two unsigned integers, reverting with custom message on\n * division by zero. The result is rounded towards zero.\n *\n * CAUTION: This function is deprecated because it requires allocating memory for the error\n * message unnecessarily. For custom revert reasons use {tryDiv}.\n *\n * Counterpart to Solidity's `/` operator. Note: this function uses a\n * `revert` opcode (which leaves remaining gas untouched) while Solidity\n * uses an invalid opcode to revert (consuming all remaining gas).\n *\n * Requirements:\n *\n * - The divisor cannot be zero.\n */\n function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\n require(b > 0, errorMessage);\n return a / b;\n }\n\n /**\n * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\n * reverting with custom message when dividing by zero.\n *\n * CAUTION: This function is deprecated because it requires allocating memory for the error\n * message unnecessarily. For custom revert reasons use {tryMod}.\n *\n * Counterpart to Solidity's `%` operator. This function uses a `revert`\n * opcode (which leaves remaining gas untouched) while Solidity uses an\n * invalid opcode to revert (consuming all remaining gas).\n *\n * Requirements:\n *\n * - The divisor cannot be zero.\n */\n function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\n require(b > 0, errorMessage);\n return a % b;\n }\n}\n" - }, - "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Library Imports */\nimport { Lib_RingBuffer } from \"../../libraries/utils/Lib_RingBuffer.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/* Interface Imports */\nimport { iOVM_ChainStorageContainer } from \"../../iOVM/chain/iOVM_ChainStorageContainer.sol\";\n\n/**\n * @title OVM_ChainStorageContainer\n * @dev The Chain Storage Container provides its owner contract with read, write and delete functionality.\n * This provides gas efficiency gains by enabling it to overwrite storage slots which can no longer be used\n * in a fraud proof due to the fraud window having passed, and the associated chain state or\n * transactions being finalized.\n * Three distinct Chain Storage Containers will be deployed on Layer 1:\n * 1. Stores transaction batches for the Canonical Transaction Chain\n * 2. Stores queued transactions for the Canonical Transaction Chain\n * 3. Stores chain state batches for the State Commitment Chain\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract OVM_ChainStorageContainer is iOVM_ChainStorageContainer, Lib_AddressResolver {\n\n /*************\n * Libraries *\n *************/\n\n using Lib_RingBuffer for Lib_RingBuffer.RingBuffer;\n\n\n /*************\n * Variables *\n *************/\n\n string public owner;\n Lib_RingBuffer.RingBuffer internal buffer;\n\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n * @param _owner Name of the contract that owns this container (will be resolved later).\n */\n constructor(\n address _libAddressManager,\n string memory _owner\n )\n Lib_AddressResolver(_libAddressManager)\n {\n owner = _owner;\n }\n\n\n /**********************\n * Function Modifiers *\n **********************/\n\n modifier onlyOwner() {\n require(\n msg.sender == resolve(owner),\n \"OVM_ChainStorageContainer: Function can only be called by the owner.\"\n );\n _;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @inheritdoc iOVM_ChainStorageContainer\n */\n function setGlobalMetadata(\n bytes27 _globalMetadata\n )\n override\n public\n onlyOwner\n {\n return buffer.setExtraData(_globalMetadata);\n }\n\n /**\n * @inheritdoc iOVM_ChainStorageContainer\n */\n function getGlobalMetadata()\n override\n public\n view\n returns (\n bytes27\n )\n {\n return buffer.getExtraData();\n }\n\n /**\n * @inheritdoc iOVM_ChainStorageContainer\n */\n function length()\n override\n public\n view\n returns (\n uint256\n )\n {\n return uint256(buffer.getLength());\n }\n\n /**\n * @inheritdoc iOVM_ChainStorageContainer\n */\n function push(\n bytes32 _object\n )\n override\n public\n onlyOwner\n {\n buffer.push(_object);\n }\n\n /**\n * @inheritdoc iOVM_ChainStorageContainer\n */\n function push(\n bytes32 _object,\n bytes27 _globalMetadata\n )\n override\n public\n onlyOwner\n {\n buffer.push(_object, _globalMetadata);\n }\n\n /**\n * @inheritdoc iOVM_ChainStorageContainer\n */\n function get(\n uint256 _index\n )\n override\n public\n view\n returns (\n bytes32\n )\n {\n return buffer.get(uint40(_index));\n }\n \n /**\n * @inheritdoc iOVM_ChainStorageContainer\n */\n function deleteElementsAfterInclusive(\n uint256 _index\n )\n override\n public\n onlyOwner\n {\n buffer.deleteElementsAfterInclusive(\n uint40(_index)\n );\n }\n\n /**\n * @inheritdoc iOVM_ChainStorageContainer\n */\n function deleteElementsAfterInclusive(\n uint256 _index,\n bytes27 _globalMetadata\n )\n override\n public\n onlyOwner\n {\n buffer.deleteElementsAfterInclusive(\n uint40(_index),\n _globalMetadata\n );\n }\n\n /**\n * @inheritdoc iOVM_ChainStorageContainer\n */\n function setNextOverwritableIndex(\n uint256 _index\n )\n override\n public\n onlyOwner\n {\n buffer.nextOverwritableIndex = _index;\n }\n}\n" - }, - "contracts/optimistic-ethereum/libraries/utils/Lib_RingBuffer.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\nlibrary Lib_RingBuffer {\n using Lib_RingBuffer for RingBuffer;\n\n /***********\n * Structs *\n ***********/\n\n struct Buffer {\n uint256 length;\n mapping (uint256 => bytes32) buf;\n }\n\n struct RingBuffer {\n bytes32 contextA;\n bytes32 contextB;\n Buffer bufferA;\n Buffer bufferB;\n uint256 nextOverwritableIndex;\n }\n\n struct RingBufferContext {\n // contextA\n uint40 globalIndex;\n bytes27 extraData;\n\n // contextB\n uint64 currBufferIndex;\n uint40 prevResetIndex;\n uint40 currResetIndex;\n }\n\n\n /*************\n * Constants *\n *************/\n\n uint256 constant MIN_CAPACITY = 16;\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Pushes a single element to the buffer.\n * @param _self Buffer to access.\n * @param _value Value to push to the buffer.\n * @param _extraData Optional global extra data.\n */\n function push(\n RingBuffer storage _self,\n bytes32 _value,\n bytes27 _extraData\n )\n internal\n {\n RingBufferContext memory ctx = _self.getContext();\n Buffer storage currBuffer = _self.getBuffer(ctx.currBufferIndex);\n\n // Set a minimum capacity.\n if (currBuffer.length == 0) {\n currBuffer.length = MIN_CAPACITY;\n }\n\n // Check if we need to expand the buffer.\n if (ctx.globalIndex - ctx.currResetIndex >= currBuffer.length) {\n if (ctx.currResetIndex < _self.nextOverwritableIndex) {\n // We're going to overwrite the inactive buffer.\n // Bump the buffer index, reset the delete offset, and set our reset indices.\n ctx.currBufferIndex++;\n ctx.prevResetIndex = ctx.currResetIndex;\n ctx.currResetIndex = ctx.globalIndex;\n\n // Swap over to the next buffer.\n currBuffer = _self.getBuffer(ctx.currBufferIndex);\n } else {\n // We're not overwriting yet, double the length of the current buffer.\n currBuffer.length *= 2;\n }\n }\n\n // Index to write to is the difference of the global and reset indices.\n uint256 writeHead = ctx.globalIndex - ctx.currResetIndex;\n currBuffer.buf[writeHead] = _value;\n\n // Bump the global index and insert our extra data, then save the context.\n ctx.globalIndex++;\n ctx.extraData = _extraData;\n _self.setContext(ctx);\n }\n\n /**\n * Pushes a single element to the buffer.\n * @param _self Buffer to access.\n * @param _value Value to push to the buffer.\n */\n function push(\n RingBuffer storage _self,\n bytes32 _value\n )\n internal\n {\n RingBufferContext memory ctx = _self.getContext();\n \n _self.push(\n _value,\n ctx.extraData\n );\n }\n\n /**\n * Retrieves an element from the buffer.\n * @param _self Buffer to access.\n * @param _index Element index to retrieve.\n * @return Value of the element at the given index.\n */\n function get(\n RingBuffer storage _self,\n uint256 _index\n )\n internal\n view\n returns (\n bytes32 \n )\n {\n RingBufferContext memory ctx = _self.getContext();\n\n require(\n _index < ctx.globalIndex,\n \"Index out of bounds.\"\n );\n\n Buffer storage currBuffer = _self.getBuffer(ctx.currBufferIndex);\n Buffer storage prevBuffer = _self.getBuffer(ctx.currBufferIndex + 1);\n\n if (_index >= ctx.currResetIndex) {\n // We're trying to load an element from the current buffer.\n // Relative index is just the difference from the reset index.\n uint256 relativeIndex = _index - ctx.currResetIndex;\n\n // Shouldn't happen but why not check.\n require(\n relativeIndex < currBuffer.length,\n \"Index out of bounds.\"\n );\n\n return currBuffer.buf[relativeIndex];\n } else {\n // We're trying to load an element from the previous buffer.\n // Relative index is the difference from the reset index in the other direction.\n uint256 relativeIndex = ctx.currResetIndex - _index;\n\n // Condition only fails in the case that we deleted and flipped buffers.\n require(\n ctx.currResetIndex > ctx.prevResetIndex,\n \"Index out of bounds.\"\n );\n\n // Make sure we're not trying to read beyond the array.\n require(\n relativeIndex <= prevBuffer.length,\n \"Index out of bounds.\"\n );\n\n return prevBuffer.buf[prevBuffer.length - relativeIndex];\n }\n }\n\n /**\n * Deletes all elements after (and including) a given index.\n * @param _self Buffer to access.\n * @param _index Index of the element to delete from (inclusive).\n * @param _extraData Optional global extra data.\n */\n function deleteElementsAfterInclusive(\n RingBuffer storage _self,\n uint40 _index,\n bytes27 _extraData\n )\n internal\n {\n RingBufferContext memory ctx = _self.getContext();\n\n require(\n _index < ctx.globalIndex && _index >= ctx.prevResetIndex,\n \"Index out of bounds.\"\n );\n\n if (_index < ctx.currResetIndex) {\n // We're switching back to the previous buffer.\n // Reduce the buffer index, set the current reset index back to match the previous one.\n // We use the equality of these two values to prevent reading beyond this buffer.\n ctx.currBufferIndex--;\n ctx.currResetIndex = ctx.prevResetIndex;\n }\n\n // Set our global index and extra data, save the context.\n ctx.globalIndex = _index;\n ctx.extraData = _extraData;\n _self.setContext(ctx);\n }\n\n /**\n * Deletes all elements after (and including) a given index.\n * @param _self Buffer to access.\n * @param _index Index of the element to delete from (inclusive).\n */\n function deleteElementsAfterInclusive(\n RingBuffer storage _self,\n uint40 _index\n )\n internal\n {\n RingBufferContext memory ctx = _self.getContext();\n _self.deleteElementsAfterInclusive(\n _index,\n ctx.extraData\n );\n }\n\n /**\n * Retrieves the current global index.\n * @param _self Buffer to access.\n * @return Current global index.\n */\n function getLength(\n RingBuffer storage _self\n )\n internal\n view\n returns (\n uint40\n )\n {\n RingBufferContext memory ctx = _self.getContext();\n return ctx.globalIndex;\n }\n\n /**\n * Changes current global extra data.\n * @param _self Buffer to access.\n * @param _extraData New global extra data.\n */\n function setExtraData(\n RingBuffer storage _self,\n bytes27 _extraData\n )\n internal\n {\n RingBufferContext memory ctx = _self.getContext();\n ctx.extraData = _extraData;\n _self.setContext(ctx);\n }\n\n /**\n * Retrieves the current global extra data.\n * @param _self Buffer to access.\n * @return Current global extra data.\n */\n function getExtraData(\n RingBuffer storage _self\n )\n internal\n view\n returns (\n bytes27\n )\n {\n RingBufferContext memory ctx = _self.getContext();\n return ctx.extraData;\n }\n\n /**\n * Sets the current ring buffer context.\n * @param _self Buffer to access.\n * @param _ctx Current ring buffer context.\n */\n function setContext(\n RingBuffer storage _self,\n RingBufferContext memory _ctx\n )\n internal\n {\n bytes32 contextA;\n bytes32 contextB;\n\n uint40 globalIndex = _ctx.globalIndex;\n bytes27 extraData = _ctx.extraData;\n assembly {\n contextA := globalIndex\n contextA := or(contextA, extraData)\n }\n\n uint64 currBufferIndex = _ctx.currBufferIndex;\n uint40 prevResetIndex = _ctx.prevResetIndex;\n uint40 currResetIndex = _ctx.currResetIndex;\n assembly {\n contextB := currBufferIndex\n contextB := or(contextB, shl(64, prevResetIndex))\n contextB := or(contextB, shl(104, currResetIndex))\n }\n\n if (_self.contextA != contextA) {\n _self.contextA = contextA;\n }\n\n if (_self.contextB != contextB) {\n _self.contextB = contextB;\n }\n }\n\n /**\n * Retrieves the current ring buffer context.\n * @param _self Buffer to access.\n * @return Current ring buffer context.\n */\n function getContext(\n RingBuffer storage _self\n )\n internal\n view\n returns (\n RingBufferContext memory\n )\n {\n bytes32 contextA = _self.contextA;\n bytes32 contextB = _self.contextB;\n\n uint40 globalIndex;\n bytes27 extraData;\n assembly {\n globalIndex := and(contextA, 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF)\n extraData := and(contextA, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000)\n }\n\n uint64 currBufferIndex;\n uint40 prevResetIndex;\n uint40 currResetIndex;\n assembly {\n currBufferIndex := and(contextB, 0x000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF)\n prevResetIndex := shr(64, and(contextB, 0x00000000000000000000000000000000000000FFFFFFFFFF0000000000000000))\n currResetIndex := shr(104, and(contextB, 0x0000000000000000000000000000FFFFFFFFFF00000000000000000000000000))\n }\n\n return RingBufferContext({\n globalIndex: globalIndex,\n extraData: extraData,\n currBufferIndex: currBufferIndex,\n prevResetIndex: prevResetIndex,\n currResetIndex: currResetIndex\n });\n }\n\n /**\n * Retrieves the a buffer from the ring buffer by index.\n * @param _self Buffer to access.\n * @param _which Index of the sub buffer to access.\n * @return Sub buffer for the index.\n */\n function getBuffer(\n RingBuffer storage _self,\n uint256 _which\n )\n internal\n view\n returns (\n Buffer storage\n )\n {\n return _which % 2 == 0 ? _self.bufferA : _self.bufferB;\n }\n}\n" - }, - "contracts/test-libraries/utils/TestLib_RingBuffer.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_RingBuffer } from \"../../optimistic-ethereum/libraries/utils/Lib_RingBuffer.sol\";\n\n/**\n * @title TestLib_RingBuffer\n */\ncontract TestLib_RingBuffer {\n using Lib_RingBuffer for Lib_RingBuffer.RingBuffer;\n \n Lib_RingBuffer.RingBuffer internal buf;\n\n function push(\n bytes32 _value,\n bytes27 _extraData\n )\n public\n {\n buf.push(\n _value,\n _extraData\n );\n }\n\n function get(\n uint256 _index\n )\n public\n view\n returns (\n bytes32 \n )\n {\n return buf.get(_index);\n }\n\n function deleteElementsAfterInclusive(\n uint40 _index,\n bytes27 _extraData\n )\n internal\n {\n return buf.deleteElementsAfterInclusive(\n _index,\n _extraData\n );\n }\n\n function getLength()\n internal\n view\n returns (\n uint40\n )\n {\n return buf.getLength();\n }\n\n function getExtraData()\n internal\n view\n returns (\n bytes27\n )\n {\n return buf.getExtraData();\n }\n}\n" - }, - "contracts/optimistic-ethereum/OVM/chain/OVM_CanonicalTransactionChain.sol": { - "content": "// SPDX-License-Identifier: MIT\n// @unsupported: ovm\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\nimport { Lib_MerkleTree } from \"../../libraries/utils/Lib_MerkleTree.sol\";\nimport { Lib_Math } from \"../../libraries/utils/Lib_Math.sol\";\n\n/* Interface Imports */\nimport { iOVM_CanonicalTransactionChain } from \"../../iOVM/chain/iOVM_CanonicalTransactionChain.sol\";\nimport { iOVM_ChainStorageContainer } from \"../../iOVM/chain/iOVM_ChainStorageContainer.sol\";\n\n/* Contract Imports */\nimport { OVM_ExecutionManager } from \"../execution/OVM_ExecutionManager.sol\";\n\n\n/**\n * @title OVM_CanonicalTransactionChain\n * @dev The Canonical Transaction Chain (CTC) contract is an append-only log of transactions\n * which must be applied to the rollup state. It defines the ordering of rollup transactions by\n * writing them to the 'CTC:batches' instance of the Chain Storage Container.\n * The CTC also allows any account to 'enqueue' an L2 transaction, which will require that the Sequencer\n * will eventually append it to the rollup state.\n * If the Sequencer does not include an enqueued transaction within the 'force inclusion period',\n * then any account may force it to be included by calling appendQueueBatch().\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract OVM_CanonicalTransactionChain is iOVM_CanonicalTransactionChain, Lib_AddressResolver {\n\n /*************\n * Constants *\n *************/\n\n // L2 tx gas-related\n uint256 constant public MIN_ROLLUP_TX_GAS = 100000;\n uint256 constant public MAX_ROLLUP_TX_SIZE = 50000;\n uint256 constant public L2_GAS_DISCOUNT_DIVISOR = 32;\n\n // Encoding-related (all in bytes)\n uint256 constant internal BATCH_CONTEXT_SIZE = 16;\n uint256 constant internal BATCH_CONTEXT_LENGTH_POS = 12;\n uint256 constant internal BATCH_CONTEXT_START_POS = 15;\n uint256 constant internal TX_DATA_HEADER_SIZE = 3;\n uint256 constant internal BYTES_TILL_TX_DATA = 65;\n\n\n /*************\n * Variables *\n *************/\n\n uint256 public forceInclusionPeriodSeconds;\n uint256 public forceInclusionPeriodBlocks;\n uint256 public maxTransactionGasLimit;\n\n\n /***************\n * Constructor *\n ***************/\n\n constructor(\n address _libAddressManager,\n uint256 _forceInclusionPeriodSeconds,\n uint256 _forceInclusionPeriodBlocks,\n uint256 _maxTransactionGasLimit\n )\n Lib_AddressResolver(_libAddressManager)\n {\n forceInclusionPeriodSeconds = _forceInclusionPeriodSeconds;\n forceInclusionPeriodBlocks = _forceInclusionPeriodBlocks;\n maxTransactionGasLimit = _maxTransactionGasLimit;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Accesses the batch storage container.\n * @return Reference to the batch storage container.\n */\n function batches()\n override\n public\n view\n returns (\n iOVM_ChainStorageContainer\n )\n {\n return iOVM_ChainStorageContainer(\n resolve(\"OVM_ChainStorageContainer:CTC:batches\")\n );\n }\n\n /**\n * Accesses the queue storage container.\n * @return Reference to the queue storage container.\n */\n function queue()\n override\n public\n view\n returns (\n iOVM_ChainStorageContainer\n )\n {\n return iOVM_ChainStorageContainer(\n resolve(\"OVM_ChainStorageContainer:CTC:queue\")\n );\n }\n\n /**\n * Retrieves the total number of elements submitted.\n * @return _totalElements Total submitted elements.\n */\n function getTotalElements()\n override\n public\n view\n returns (\n uint256 _totalElements\n )\n {\n (uint40 totalElements,,,) = _getBatchExtraData();\n return uint256(totalElements);\n }\n\n /**\n * Retrieves the total number of batches submitted.\n * @return _totalBatches Total submitted batches.\n */\n function getTotalBatches()\n override\n public\n view\n returns (\n uint256 _totalBatches\n )\n {\n return batches().length();\n }\n\n /**\n * Returns the index of the next element to be enqueued.\n * @return Index for the next queue element.\n */\n function getNextQueueIndex()\n override\n public\n view\n returns (\n uint40\n )\n {\n (,uint40 nextQueueIndex,,) = _getBatchExtraData();\n return nextQueueIndex;\n }\n\n /**\n * Returns the timestamp of the last transaction.\n * @return Timestamp for the last transaction.\n */\n function getLastTimestamp()\n override\n public\n view\n returns (\n uint40\n )\n {\n (,,uint40 lastTimestamp,) = _getBatchExtraData();\n return lastTimestamp;\n }\n\n /**\n * Returns the blocknumber of the last transaction.\n * @return Blocknumber for the last transaction.\n */\n function getLastBlockNumber()\n override\n public\n view\n returns (\n uint40\n )\n {\n (,,,uint40 lastBlockNumber) = _getBatchExtraData();\n return lastBlockNumber;\n }\n\n /**\n * Gets the queue element at a particular index.\n * @param _index Index of the queue element to access.\n * @return _element Queue element at the given index.\n */\n function getQueueElement(\n uint256 _index\n )\n override\n public\n view\n returns (\n Lib_OVMCodec.QueueElement memory _element\n )\n {\n return _getQueueElement(\n _index,\n queue()\n );\n }\n\n /**\n * Get the number of queue elements which have not yet been included.\n * @return Number of pending queue elements.\n */\n function getNumPendingQueueElements()\n override\n public\n view\n returns (\n uint40\n )\n {\n return getQueueLength() - getNextQueueIndex();\n }\n\n /**\n * Retrieves the length of the queue, including\n * both pending and canonical transactions.\n * @return Length of the queue.\n */\n function getQueueLength()\n override\n public\n view\n returns (\n uint40\n )\n {\n return _getQueueLength(\n queue()\n );\n }\n\n /**\n * Adds a transaction to the queue.\n * @param _target Target L2 contract to send the transaction to.\n * @param _gasLimit Gas limit for the enqueued L2 transaction.\n * @param _data Transaction data.\n */\n function enqueue(\n address _target,\n uint256 _gasLimit,\n bytes memory _data\n )\n override\n public\n {\n require(\n _data.length <= MAX_ROLLUP_TX_SIZE,\n \"Transaction data size exceeds maximum for rollup transaction.\"\n );\n\n require(\n _gasLimit <= maxTransactionGasLimit,\n \"Transaction gas limit exceeds maximum for rollup transaction.\"\n );\n\n require(\n _gasLimit >= MIN_ROLLUP_TX_GAS,\n \"Transaction gas limit too low to enqueue.\"\n );\n\n // We need to consume some amount of L1 gas in order to rate limit transactions going into\n // L2. However, L2 is cheaper than L1 so we only need to burn some small proportion of the\n // provided L1 gas.\n uint256 gasToConsume = _gasLimit/L2_GAS_DISCOUNT_DIVISOR;\n uint256 startingGas = gasleft();\n\n // Although this check is not necessary (burn below will run out of gas if not true), it\n // gives the user an explicit reason as to why the enqueue attempt failed.\n require(\n startingGas > gasToConsume,\n \"Insufficient gas for L2 rate limiting burn.\"\n );\n\n // Here we do some \"dumb\" work in order to burn gas, although we should probably replace\n // this with something like minting gas token later on.\n uint256 i;\n while(startingGas - gasleft() < gasToConsume) {\n i++;\n }\n\n bytes32 transactionHash = keccak256(\n abi.encode(\n msg.sender,\n _target,\n _gasLimit,\n _data\n )\n );\n\n bytes32 timestampAndBlockNumber;\n assembly {\n timestampAndBlockNumber := timestamp()\n timestampAndBlockNumber := or(timestampAndBlockNumber, shl(40, number()))\n }\n\n iOVM_ChainStorageContainer queueRef = queue();\n\n queueRef.push(transactionHash);\n queueRef.push(timestampAndBlockNumber);\n\n // The underlying queue data structure stores 2 elements\n // per insertion, so to get the real queue length we need\n // to divide by 2 and subtract 1.\n uint256 queueIndex = queueRef.length() / 2 - 1;\n emit TransactionEnqueued(\n msg.sender,\n _target,\n _gasLimit,\n _data,\n queueIndex,\n block.timestamp\n );\n }\n\n /**\n * Appends a given number of queued transactions as a single batch.\n * param _numQueuedTransactions Number of transactions to append.\n */\n function appendQueueBatch(\n uint256 // _numQueuedTransactions\n )\n override\n public\n pure\n {\n // TEMPORARY: Disable `appendQueueBatch` for minnet\n revert(\"appendQueueBatch is currently disabled.\");\n\n // _numQueuedTransactions = Lib_Math.min(_numQueuedTransactions, getNumPendingQueueElements());\n // require(\n // _numQueuedTransactions > 0,\n // \"Must append more than zero transactions.\"\n // );\n\n // bytes32[] memory leaves = new bytes32[](_numQueuedTransactions);\n // uint40 nextQueueIndex = getNextQueueIndex();\n\n // for (uint256 i = 0; i < _numQueuedTransactions; i++) {\n // if (msg.sender != resolve(\"OVM_Sequencer\")) {\n // Lib_OVMCodec.QueueElement memory el = getQueueElement(nextQueueIndex);\n // require(\n // el.timestamp + forceInclusionPeriodSeconds < block.timestamp,\n // \"Queue transactions cannot be submitted during the sequencer inclusion period.\"\n // );\n // }\n // leaves[i] = _getQueueLeafHash(nextQueueIndex);\n // nextQueueIndex++;\n // }\n\n // Lib_OVMCodec.QueueElement memory lastElement = getQueueElement(nextQueueIndex - 1);\n\n // _appendBatch(\n // Lib_MerkleTree.getMerkleRoot(leaves),\n // _numQueuedTransactions,\n // _numQueuedTransactions,\n // lastElement.timestamp,\n // lastElement.blockNumber\n // );\n\n // emit QueueBatchAppended(\n // nextQueueIndex - _numQueuedTransactions,\n // _numQueuedTransactions,\n // getTotalElements()\n // );\n }\n\n /**\n * Allows the sequencer to append a batch of transactions.\n * @dev This function uses a custom encoding scheme for efficiency reasons.\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\n * .param _contexts Array of batch contexts.\n * .param _transactionDataFields Array of raw transaction data.\n */\n function appendSequencerBatch()\n override\n public\n {\n uint40 shouldStartAtElement;\n uint24 totalElementsToAppend;\n uint24 numContexts;\n assembly {\n shouldStartAtElement := shr(216, calldataload(4))\n totalElementsToAppend := shr(232, calldataload(9))\n numContexts := shr(232, calldataload(12))\n }\n\n require(\n shouldStartAtElement == getTotalElements(),\n \"Actual batch start index does not match expected start index.\"\n );\n\n require(\n msg.sender == resolve(\"OVM_Sequencer\"),\n \"Function can only be called by the Sequencer.\"\n );\n\n require(\n numContexts > 0,\n \"Must provide at least one batch context.\"\n );\n\n require(\n totalElementsToAppend > 0,\n \"Must append at least one element.\"\n );\n\n uint40 nextTransactionPtr = uint40(BATCH_CONTEXT_START_POS + BATCH_CONTEXT_SIZE * numContexts);\n\n require(\n msg.data.length >= nextTransactionPtr,\n \"Not enough BatchContexts provided.\"\n );\n\n // Take a reference to the queue and its length so we don't have to keep resolving it.\n // Length isn't going to change during the course of execution, so it's fine to simply\n // resolve this once at the start. Saves gas.\n iOVM_ChainStorageContainer queueRef = queue();\n uint40 queueLength = _getQueueLength(queueRef);\n\n // Reserve some memory to save gas on hashing later on. This is a relatively safe estimate\n // for the average transaction size that will prevent having to resize this chunk of memory\n // later on. Saves gas.\n bytes memory hashMemory = new bytes((msg.data.length / totalElementsToAppend) * 2);\n\n // Initialize the array of canonical chain leaves that we will append.\n bytes32[] memory leaves = new bytes32[](totalElementsToAppend);\n\n // Each leaf index corresponds to a tx, either sequenced or enqueued.\n uint32 leafIndex = 0;\n\n // Counter for number of sequencer transactions appended so far.\n uint32 numSequencerTransactions = 0;\n\n // We will sequentially append leaves which are pointers to the queue.\n // The initial queue index is what is currently in storage.\n uint40 nextQueueIndex = getNextQueueIndex();\n\n BatchContext memory curContext;\n for (uint32 i = 0; i < numContexts; i++) {\n BatchContext memory nextContext = _getBatchContext(i);\n\n if (i == 0) {\n // Execute a special check for the first batch.\n _validateFirstBatchContext(nextContext);\n }\n\n // Execute this check on every single batch, including the first one.\n _validateNextBatchContext(\n curContext,\n nextContext,\n nextQueueIndex,\n queueRef\n );\n\n // Now we can update our current context.\n curContext = nextContext;\n\n // Process sequencer transactions first.\n for (uint32 j = 0; j < curContext.numSequencedTransactions; j++) {\n uint256 txDataLength;\n assembly {\n txDataLength := shr(232, calldataload(nextTransactionPtr))\n }\n require(\n txDataLength <= MAX_ROLLUP_TX_SIZE,\n \"Transaction data size exceeds maximum for rollup transaction.\"\n );\n\n leaves[leafIndex] = _getSequencerLeafHash(\n curContext,\n nextTransactionPtr,\n txDataLength,\n hashMemory\n );\n\n nextTransactionPtr += uint40(TX_DATA_HEADER_SIZE + txDataLength);\n numSequencerTransactions++;\n leafIndex++;\n }\n\n // Now process any subsequent queue transactions.\n for (uint32 j = 0; j < curContext.numSubsequentQueueTransactions; j++) {\n require(\n nextQueueIndex < queueLength,\n \"Not enough queued transactions to append.\"\n );\n\n leaves[leafIndex] = _getQueueLeafHash(nextQueueIndex);\n nextQueueIndex++;\n leafIndex++;\n }\n }\n\n _validateFinalBatchContext(\n curContext,\n nextQueueIndex,\n queueLength,\n queueRef\n );\n\n require(\n msg.data.length == nextTransactionPtr,\n \"Not all sequencer transactions were processed.\"\n );\n\n require(\n leafIndex == totalElementsToAppend,\n \"Actual transaction index does not match expected total elements to append.\"\n );\n\n // Generate the required metadata that we need to append this batch\n uint40 numQueuedTransactions = totalElementsToAppend - numSequencerTransactions;\n uint40 blockTimestamp;\n uint40 blockNumber;\n if (curContext.numSubsequentQueueTransactions == 0) {\n // The last element is a sequencer tx, therefore pull timestamp and block number from the last context.\n blockTimestamp = uint40(curContext.timestamp);\n blockNumber = uint40(curContext.blockNumber);\n } else {\n // The last element is a queue tx, therefore pull timestamp and block number from the queue element.\n // curContext.numSubsequentQueueTransactions > 0 which means that we've processed at least one queue element.\n // We increment nextQueueIndex after processing each queue element,\n // so the index of the last element we processed is nextQueueIndex - 1.\n Lib_OVMCodec.QueueElement memory lastElement = _getQueueElement(\n nextQueueIndex - 1,\n queueRef\n );\n\n blockTimestamp = lastElement.timestamp;\n blockNumber = lastElement.blockNumber;\n }\n\n // For efficiency reasons getMerkleRoot modifies the `leaves` argument in place\n // while calculating the root hash therefore any arguments passed to it must not\n // be used again afterwards\n _appendBatch(\n Lib_MerkleTree.getMerkleRoot(leaves),\n totalElementsToAppend,\n numQueuedTransactions,\n blockTimestamp,\n blockNumber\n );\n\n emit SequencerBatchAppended(\n nextQueueIndex - numQueuedTransactions,\n numQueuedTransactions,\n getTotalElements()\n );\n }\n\n /**\n * Verifies whether a transaction is included in the chain.\n * @param _transaction Transaction to verify.\n * @param _txChainElement Transaction chain element corresponding to the transaction.\n * @param _batchHeader Header of the batch the transaction was included in.\n * @param _inclusionProof Inclusion proof for the provided transaction chain element.\n * @return True if the transaction exists in the CTC, false if not.\n */\n function verifyTransaction(\n Lib_OVMCodec.Transaction memory _transaction,\n Lib_OVMCodec.TransactionChainElement memory _txChainElement,\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _inclusionProof\n )\n override\n public\n view\n returns (\n bool\n )\n {\n if (_txChainElement.isSequenced == true) {\n return _verifySequencerTransaction(\n _transaction,\n _txChainElement,\n _batchHeader,\n _inclusionProof\n );\n } else {\n return _verifyQueueTransaction(\n _transaction,\n _txChainElement.queueIndex,\n _batchHeader,\n _inclusionProof\n );\n }\n }\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Returns the BatchContext located at a particular index.\n * @param _index The index of the BatchContext\n * @return The BatchContext at the specified index.\n */\n function _getBatchContext(\n uint256 _index\n )\n internal\n pure\n returns (\n BatchContext memory\n )\n {\n uint256 contextPtr = 15 + _index * BATCH_CONTEXT_SIZE;\n uint256 numSequencedTransactions;\n uint256 numSubsequentQueueTransactions;\n uint256 ctxTimestamp;\n uint256 ctxBlockNumber;\n\n assembly {\n numSequencedTransactions := shr(232, calldataload(contextPtr))\n numSubsequentQueueTransactions := shr(232, calldataload(add(contextPtr, 3)))\n ctxTimestamp := shr(216, calldataload(add(contextPtr, 6)))\n ctxBlockNumber := shr(216, calldataload(add(contextPtr, 11)))\n }\n\n return BatchContext({\n numSequencedTransactions: numSequencedTransactions,\n numSubsequentQueueTransactions: numSubsequentQueueTransactions,\n timestamp: ctxTimestamp,\n blockNumber: ctxBlockNumber\n });\n }\n\n /**\n * Parses the batch context from the extra data.\n * @return Total number of elements submitted.\n * @return Index of the next queue element.\n */\n function _getBatchExtraData()\n internal\n view\n returns (\n uint40,\n uint40,\n uint40,\n uint40\n )\n {\n bytes27 extraData = batches().getGlobalMetadata();\n\n uint40 totalElements;\n uint40 nextQueueIndex;\n uint40 lastTimestamp;\n uint40 lastBlockNumber;\n assembly {\n extraData := shr(40, extraData)\n totalElements := and(extraData, 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF)\n nextQueueIndex := shr(40, and(extraData, 0x00000000000000000000000000000000000000000000FFFFFFFFFF0000000000))\n lastTimestamp := shr(80, and(extraData, 0x0000000000000000000000000000000000FFFFFFFFFF00000000000000000000))\n lastBlockNumber := shr(120, and(extraData, 0x000000000000000000000000FFFFFFFFFF000000000000000000000000000000))\n }\n\n return (\n totalElements,\n nextQueueIndex,\n lastTimestamp,\n lastBlockNumber\n );\n }\n\n /**\n * Encodes the batch context for the extra data.\n * @param _totalElements Total number of elements submitted.\n * @param _nextQueueIndex Index of the next queue element.\n * @param _timestamp Timestamp for the last batch.\n * @param _blockNumber Block number of the last batch.\n * @return Encoded batch context.\n */\n function _makeBatchExtraData(\n uint40 _totalElements,\n uint40 _nextQueueIndex,\n uint40 _timestamp,\n uint40 _blockNumber\n )\n internal\n pure\n returns (\n bytes27\n )\n {\n bytes27 extraData;\n assembly {\n extraData := _totalElements\n extraData := or(extraData, shl(40, _nextQueueIndex))\n extraData := or(extraData, shl(80, _timestamp))\n extraData := or(extraData, shl(120, _blockNumber))\n extraData := shl(40, extraData)\n }\n\n return extraData;\n }\n\n /**\n * Retrieves the hash of a queue element.\n * @param _index Index of the queue element to retrieve a hash for.\n * @return Hash of the queue element.\n */\n function _getQueueLeafHash(\n uint256 _index\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n return _hashTransactionChainElement(\n Lib_OVMCodec.TransactionChainElement({\n isSequenced: false,\n queueIndex: _index,\n timestamp: 0,\n blockNumber: 0,\n txData: hex\"\"\n })\n );\n }\n\n /**\n * Gets the queue element at a particular index.\n * @param _index Index of the queue element to access.\n * @return _element Queue element at the given index.\n */\n function _getQueueElement(\n uint256 _index,\n iOVM_ChainStorageContainer _queueRef\n )\n internal\n view\n returns (\n Lib_OVMCodec.QueueElement memory _element\n )\n {\n // The underlying queue data structure stores 2 elements\n // per insertion, so to get the actual desired queue index\n // we need to multiply by 2.\n uint40 trueIndex = uint40(_index * 2);\n bytes32 transactionHash = _queueRef.get(trueIndex);\n bytes32 timestampAndBlockNumber = _queueRef.get(trueIndex + 1);\n\n uint40 elementTimestamp;\n uint40 elementBlockNumber;\n assembly {\n elementTimestamp := and(timestampAndBlockNumber, 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF)\n elementBlockNumber := shr(40, and(timestampAndBlockNumber, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000))\n }\n\n return Lib_OVMCodec.QueueElement({\n transactionHash: transactionHash,\n timestamp: elementTimestamp,\n blockNumber: elementBlockNumber\n });\n }\n\n /**\n * Retrieves the length of the queue.\n * @return Length of the queue.\n */\n function _getQueueLength(\n iOVM_ChainStorageContainer _queueRef\n )\n internal\n view\n returns (\n uint40\n )\n {\n // The underlying queue data structure stores 2 elements\n // per insertion, so to get the real queue length we need\n // to divide by 2.\n return uint40(_queueRef.length() / 2);\n }\n\n /**\n * Retrieves the hash of a sequencer element.\n * @param _context Batch context for the given element.\n * @param _nextTransactionPtr Pointer to the next transaction in the calldata.\n * @param _txDataLength Length of the transaction item.\n * @return Hash of the sequencer element.\n */\n function _getSequencerLeafHash(\n BatchContext memory _context,\n uint256 _nextTransactionPtr,\n uint256 _txDataLength,\n bytes memory _hashMemory\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n // Only allocate more memory if we didn't reserve enough to begin with.\n if (BYTES_TILL_TX_DATA + _txDataLength > _hashMemory.length) {\n _hashMemory = new bytes(BYTES_TILL_TX_DATA + _txDataLength);\n }\n\n uint256 ctxTimestamp = _context.timestamp;\n uint256 ctxBlockNumber = _context.blockNumber;\n\n bytes32 leafHash;\n assembly {\n let chainElementStart := add(_hashMemory, 0x20)\n\n // Set the first byte equal to `1` to indicate this is a sequencer chain element.\n // This distinguishes sequencer ChainElements from queue ChainElements because\n // all queue ChainElements are ABI encoded and the first byte of ABI encoded\n // elements is always zero\n mstore8(chainElementStart, 1)\n\n mstore(add(chainElementStart, 1), ctxTimestamp)\n mstore(add(chainElementStart, 33), ctxBlockNumber)\n\n calldatacopy(add(chainElementStart, BYTES_TILL_TX_DATA), add(_nextTransactionPtr, 3), _txDataLength)\n\n leafHash := keccak256(chainElementStart, add(BYTES_TILL_TX_DATA, _txDataLength))\n }\n\n return leafHash;\n }\n\n /**\n * Retrieves the hash of a sequencer element.\n * @param _txChainElement The chain element which is hashed to calculate the leaf.\n * @return Hash of the sequencer element.\n */\n function _getSequencerLeafHash(\n Lib_OVMCodec.TransactionChainElement memory _txChainElement\n )\n internal\n view\n returns(\n bytes32\n )\n {\n bytes memory txData = _txChainElement.txData;\n uint256 txDataLength = _txChainElement.txData.length;\n\n bytes memory chainElement = new bytes(BYTES_TILL_TX_DATA + txDataLength);\n uint256 ctxTimestamp = _txChainElement.timestamp;\n uint256 ctxBlockNumber = _txChainElement.blockNumber;\n\n bytes32 leafHash;\n assembly {\n let chainElementStart := add(chainElement, 0x20)\n\n // Set the first byte equal to `1` to indicate this is a sequencer chain element.\n // This distinguishes sequencer ChainElements from queue ChainElements because\n // all queue ChainElements are ABI encoded and the first byte of ABI encoded\n // elements is always zero\n mstore8(chainElementStart, 1)\n\n mstore(add(chainElementStart, 1), ctxTimestamp)\n mstore(add(chainElementStart, 33), ctxBlockNumber)\n\n pop(staticcall(gas(), 0x04, add(txData, 0x20), txDataLength, add(chainElementStart, BYTES_TILL_TX_DATA), txDataLength))\n\n leafHash := keccak256(chainElementStart, add(BYTES_TILL_TX_DATA, txDataLength))\n }\n\n return leafHash;\n }\n\n /**\n * Inserts a batch into the chain of batches.\n * @param _transactionRoot Root of the transaction tree for this batch.\n * @param _batchSize Number of elements in the batch.\n * @param _numQueuedTransactions Number of queue transactions in the batch.\n * @param _timestamp The latest batch timestamp.\n * @param _blockNumber The latest batch blockNumber.\n */\n function _appendBatch(\n bytes32 _transactionRoot,\n uint256 _batchSize,\n uint256 _numQueuedTransactions,\n uint40 _timestamp,\n uint40 _blockNumber\n )\n internal\n {\n iOVM_ChainStorageContainer batchesRef = batches();\n (uint40 totalElements, uint40 nextQueueIndex,,) = _getBatchExtraData();\n\n Lib_OVMCodec.ChainBatchHeader memory header = Lib_OVMCodec.ChainBatchHeader({\n batchIndex: batchesRef.length(),\n batchRoot: _transactionRoot,\n batchSize: _batchSize,\n prevTotalElements: totalElements,\n extraData: hex\"\"\n });\n\n emit TransactionBatchAppended(\n header.batchIndex,\n header.batchRoot,\n header.batchSize,\n header.prevTotalElements,\n header.extraData\n );\n\n bytes32 batchHeaderHash = Lib_OVMCodec.hashBatchHeader(header);\n bytes27 latestBatchContext = _makeBatchExtraData(\n totalElements + uint40(header.batchSize),\n nextQueueIndex + uint40(_numQueuedTransactions),\n _timestamp,\n _blockNumber\n );\n\n batchesRef.push(batchHeaderHash, latestBatchContext);\n }\n\n /**\n * Checks that the first batch context in a sequencer submission is valid\n * @param _firstContext The batch context to validate.\n */\n function _validateFirstBatchContext(\n BatchContext memory _firstContext\n )\n internal\n view\n {\n // If there are existing elements, this batch must have the same context\n // or a later timestamp and block number.\n if (getTotalElements() > 0) {\n (,, uint40 lastTimestamp, uint40 lastBlockNumber) = _getBatchExtraData();\n\n require(\n _firstContext.blockNumber >= lastBlockNumber,\n \"Context block number is lower than last submitted.\"\n );\n\n require(\n _firstContext.timestamp >= lastTimestamp,\n \"Context timestamp is lower than last submitted.\"\n );\n }\n\n // Sequencer cannot submit contexts which are more than the force inclusion period old.\n require(\n _firstContext.timestamp + forceInclusionPeriodSeconds >= block.timestamp,\n \"Context timestamp too far in the past.\"\n );\n\n require(\n _firstContext.blockNumber + forceInclusionPeriodBlocks >= block.number,\n \"Context block number too far in the past.\"\n );\n }\n\n /**\n * Checks that a given batch context has a time context which is below a given que element\n * @param _context The batch context to validate has values lower.\n * @param _queueIndex Index of the queue element we are validating came later than the context.\n * @param _queueRef The storage container for the queue.\n */\n function _validateContextBeforeEnqueue(\n BatchContext memory _context,\n uint40 _queueIndex,\n iOVM_ChainStorageContainer _queueRef\n )\n internal\n view\n {\n Lib_OVMCodec.QueueElement memory nextQueueElement = _getQueueElement(\n _queueIndex,\n _queueRef\n );\n\n // If the force inclusion period has passed for an enqueued transaction, it MUST be the next chain element.\n require(\n block.timestamp < nextQueueElement.timestamp + forceInclusionPeriodSeconds,\n \"Previously enqueued batches have expired and must be appended before a new sequencer batch.\"\n );\n\n // Just like sequencer transaction times must be increasing relative to each other,\n // We also require that they be increasing relative to any interspersed queue elements.\n require(\n _context.timestamp <= nextQueueElement.timestamp,\n \"Sequencer transaction timestamp exceeds that of next queue element.\"\n );\n\n require(\n _context.blockNumber <= nextQueueElement.blockNumber,\n \"Sequencer transaction blockNumber exceeds that of next queue element.\"\n );\n }\n\n /**\n * Checks that a given batch context is valid based on its previous context, and the next queue elemtent.\n * @param _prevContext The previously validated batch context.\n * @param _nextContext The batch context to validate with this call.\n * @param _nextQueueIndex Index of the next queue element to process for the _nextContext's subsequentQueueElements.\n * @param _queueRef The storage container for the queue.\n */\n function _validateNextBatchContext(\n BatchContext memory _prevContext,\n BatchContext memory _nextContext,\n uint40 _nextQueueIndex,\n iOVM_ChainStorageContainer _queueRef\n )\n internal\n view\n {\n // All sequencer transactions' times must be greater than or equal to the previous ones.\n require(\n _nextContext.timestamp >= _prevContext.timestamp,\n \"Context timestamp values must monotonically increase.\"\n );\n\n require(\n _nextContext.blockNumber >= _prevContext.blockNumber,\n \"Context blockNumber values must monotonically increase.\"\n );\n\n // If there is going to be a queue element pulled in from this context:\n if (_nextContext.numSubsequentQueueTransactions > 0) {\n _validateContextBeforeEnqueue(\n _nextContext,\n _nextQueueIndex,\n _queueRef\n );\n }\n }\n\n /**\n * Checks that the final batch context in a sequencer submission is valid.\n * @param _finalContext The batch context to validate.\n * @param _queueLength The length of the queue at the start of the batchAppend call.\n * @param _nextQueueIndex The next element in the queue that will be pulled into the CTC.\n * @param _queueRef The storage container for the queue.\n */\n function _validateFinalBatchContext(\n BatchContext memory _finalContext,\n uint40 _nextQueueIndex,\n uint40 _queueLength,\n iOVM_ChainStorageContainer _queueRef\n )\n internal\n view\n {\n // If the queue is not now empty, check the mononoticity of whatever the next batch that will come in is.\n if (_queueLength - _nextQueueIndex > 0 && _finalContext.numSubsequentQueueTransactions == 0) {\n _validateContextBeforeEnqueue(\n _finalContext,\n _nextQueueIndex,\n _queueRef\n );\n }\n // Batches cannot be added from the future, or subsequent enqueue() contexts would violate monotonicity.\n require(_finalContext.timestamp <= block.timestamp, \"Context timestamp is from the future.\");\n require(_finalContext.blockNumber <= block.number, \"Context block number is from the future.\");\n }\n\n /**\n * Hashes a transaction chain element.\n * @param _element Chain element to hash.\n * @return Hash of the chain element.\n */\n function _hashTransactionChainElement(\n Lib_OVMCodec.TransactionChainElement memory _element\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n return keccak256(\n abi.encode(\n _element.isSequenced,\n _element.queueIndex,\n _element.timestamp,\n _element.blockNumber,\n _element.txData\n )\n );\n }\n\n /**\n * Verifies a sequencer transaction, returning true if it was indeed included in the CTC\n * @param _transaction The transaction we are verifying inclusion of.\n * @param _txChainElement The chain element that the transaction is claimed to be a part of.\n * @param _batchHeader Header of the batch the transaction was included in.\n * @param _inclusionProof An inclusion proof into the CTC at a particular index.\n * @return True if the transaction was included in the specified location, else false.\n */\n function _verifySequencerTransaction(\n Lib_OVMCodec.Transaction memory _transaction,\n Lib_OVMCodec.TransactionChainElement memory _txChainElement,\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _inclusionProof\n )\n internal\n view\n returns (\n bool\n )\n {\n OVM_ExecutionManager ovmExecutionManager = OVM_ExecutionManager(resolve(\"OVM_ExecutionManager\"));\n uint256 gasLimit = ovmExecutionManager.getMaxTransactionGasLimit();\n bytes32 leafHash = _getSequencerLeafHash(_txChainElement);\n\n require(\n _verifyElement(\n leafHash,\n _batchHeader,\n _inclusionProof\n ),\n \"Invalid Sequencer transaction inclusion proof.\"\n );\n\n require(\n _transaction.blockNumber == _txChainElement.blockNumber\n && _transaction.timestamp == _txChainElement.timestamp\n && _transaction.entrypoint == resolve(\"OVM_DecompressionPrecompileAddress\")\n && _transaction.gasLimit == gasLimit\n && _transaction.l1TxOrigin == address(0)\n && _transaction.l1QueueOrigin == Lib_OVMCodec.QueueOrigin.SEQUENCER_QUEUE\n && keccak256(_transaction.data) == keccak256(_txChainElement.txData),\n \"Invalid Sequencer transaction.\"\n );\n\n return true;\n }\n\n /**\n * Verifies a queue transaction, returning true if it was indeed included in the CTC\n * @param _transaction The transaction we are verifying inclusion of.\n * @param _queueIndex The queueIndex of the queued transaction.\n * @param _batchHeader Header of the batch the transaction was included in.\n * @param _inclusionProof An inclusion proof into the CTC at a particular index (should point to queue tx).\n * @return True if the transaction was included in the specified location, else false.\n */\n function _verifyQueueTransaction(\n Lib_OVMCodec.Transaction memory _transaction,\n uint256 _queueIndex,\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _inclusionProof\n )\n internal\n view\n returns (\n bool\n )\n {\n bytes32 leafHash = _getQueueLeafHash(_queueIndex);\n\n require(\n _verifyElement(\n leafHash,\n _batchHeader,\n _inclusionProof\n ),\n \"Invalid Queue transaction inclusion proof.\"\n );\n\n bytes32 transactionHash = keccak256(\n abi.encode(\n _transaction.l1TxOrigin,\n _transaction.entrypoint,\n _transaction.gasLimit,\n _transaction.data\n )\n );\n\n Lib_OVMCodec.QueueElement memory el = getQueueElement(_queueIndex);\n require(\n el.transactionHash == transactionHash\n && el.timestamp == _transaction.timestamp\n && el.blockNumber == _transaction.blockNumber,\n \"Invalid Queue transaction.\"\n );\n\n return true;\n }\n\n /**\n * Verifies a batch inclusion proof.\n * @param _element Hash of the element to verify a proof for.\n * @param _batchHeader Header of the batch in which the element was included.\n * @param _proof Merkle inclusion proof for the element.\n */\n function _verifyElement(\n bytes32 _element,\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _proof\n )\n internal\n view\n returns (\n bool\n )\n {\n require(\n Lib_OVMCodec.hashBatchHeader(_batchHeader) == batches().get(uint32(_batchHeader.batchIndex)),\n \"Invalid batch header.\"\n );\n\n require(\n Lib_MerkleTree.verify(\n _batchHeader.batchRoot,\n _element,\n _proof.index,\n _proof.siblings,\n _batchHeader.batchSize\n ),\n \"Invalid inclusion proof.\"\n );\n\n return true;\n }\n}\n" - }, - "contracts/optimistic-ethereum/libraries/utils/Lib_Math.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/**\n * @title Lib_Math\n */\nlibrary Lib_Math {\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Calculates the minumum of two numbers.\n * @param _x First number to compare.\n * @param _y Second number to compare.\n * @return Lesser of the two numbers.\n */\n function min(\n uint256 _x,\n uint256 _y\n )\n internal\n pure\n returns (\n uint256\n )\n {\n if (_x < _y) {\n return _x;\n }\n\n return _y;\n }\n}\n" - }, - "contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1CrossDomainMessenger.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_AddressResolver } from \"../../../libraries/resolver/Lib_AddressResolver.sol\";\nimport { Lib_AddressManager } from \"../../../libraries/resolver/Lib_AddressManager.sol\";\nimport { Lib_SecureMerkleTrie } from \"../../../libraries/trie/Lib_SecureMerkleTrie.sol\";\nimport { Lib_ReentrancyGuard } from \"../../../libraries/utils/Lib_ReentrancyGuard.sol\";\n\n/* Interface Imports */\nimport { iOVM_L1CrossDomainMessenger } from \"../../../iOVM/bridge/messaging/iOVM_L1CrossDomainMessenger.sol\";\nimport { iOVM_CanonicalTransactionChain } from \"../../../iOVM/chain/iOVM_CanonicalTransactionChain.sol\";\nimport { iOVM_StateCommitmentChain } from \"../../../iOVM/chain/iOVM_StateCommitmentChain.sol\";\n\n/* Contract Imports */\nimport { Abs_BaseCrossDomainMessenger } from \"./Abs_BaseCrossDomainMessenger.sol\";\n\n/**\n * @title OVM_L1CrossDomainMessenger\n * @dev The L1 Cross Domain Messenger contract sends messages from L1 to L2, and relays messages from L2 onto L1.\n * In the event that a message sent from L1 to L2 is rejected for exceeding the L2 epoch gas limit, it can be resubmitted\n * via this contract's replay function.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract OVM_L1CrossDomainMessenger is iOVM_L1CrossDomainMessenger, Abs_BaseCrossDomainMessenger, Lib_AddressResolver {\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * Pass a default zero address to the address resolver. This will be updated when initialized.\n */\n constructor()\n Lib_AddressResolver(address(0))\n {}\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n function initialize(\n address _libAddressManager\n )\n public\n {\n require(address(libAddressManager) == address(0), \"L1CrossDomainMessenger already intialized.\");\n libAddressManager = Lib_AddressManager(_libAddressManager);\n xDomainMsgSender = DEFAULT_XDOMAIN_SENDER;\n }\n\n\n /**********************\n * Function Modifiers *\n **********************/\n\n /**\n * Modifier to enforce that, if configured, only the OVM_L2MessageRelayer contract may successfully call a method.\n */\n modifier onlyRelayer() {\n address relayer = resolve(\"OVM_L2MessageRelayer\");\n if (relayer != address(0)) {\n require(\n msg.sender == relayer,\n \"Only OVM_L2MessageRelayer can relay L2-to-L1 messages.\"\n );\n }\n _;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Relays a cross domain message to a contract.\n * @inheritdoc iOVM_L1CrossDomainMessenger\n */\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce,\n L2MessageInclusionProof memory _proof\n )\n override\n public\n nonReentrant\n onlyRelayer()\n {\n bytes memory xDomainCalldata = _getXDomainCalldata(\n _target,\n _sender,\n _message,\n _messageNonce\n );\n\n require(\n _verifyXDomainMessage(\n xDomainCalldata,\n _proof\n ) == true,\n \"Provided message could not be verified.\"\n );\n\n bytes32 xDomainCalldataHash = keccak256(xDomainCalldata);\n\n require(\n successfulMessages[xDomainCalldataHash] == false,\n \"Provided message has already been received.\"\n );\n\n xDomainMsgSender = _sender;\n (bool success, ) = _target.call(_message);\n xDomainMsgSender = DEFAULT_XDOMAIN_SENDER;\n\n // Mark the message as received if the call was successful. Ensures that a message can be\n // relayed multiple times in the case that the call reverted.\n if (success == true) {\n successfulMessages[xDomainCalldataHash] = true;\n emit RelayedMessage(xDomainCalldataHash);\n }\n\n // Store an identifier that can be used to prove that the given message was relayed by some\n // user. Gives us an easy way to pay relayers for their work.\n bytes32 relayId = keccak256(\n abi.encodePacked(\n xDomainCalldata,\n msg.sender,\n block.number\n )\n );\n relayedMessages[relayId] = true;\n }\n\n /**\n * Replays a cross domain message to the target messenger.\n * @inheritdoc iOVM_L1CrossDomainMessenger\n */\n function replayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce,\n uint32 _gasLimit\n )\n override\n public\n {\n bytes memory xDomainCalldata = _getXDomainCalldata(\n _target,\n _sender,\n _message,\n _messageNonce\n );\n\n require(\n sentMessages[keccak256(xDomainCalldata)] == true,\n \"Provided message has not already been sent.\"\n );\n\n _sendXDomainMessage(xDomainCalldata, _gasLimit);\n }\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Verifies that the given message is valid.\n * @param _xDomainCalldata Calldata to verify.\n * @param _proof Inclusion proof for the message.\n * @return Whether or not the provided message is valid.\n */\n function _verifyXDomainMessage(\n bytes memory _xDomainCalldata,\n L2MessageInclusionProof memory _proof\n )\n internal\n view\n returns (\n bool\n )\n {\n return (\n _verifyStateRootProof(_proof)\n && _verifyStorageProof(_xDomainCalldata, _proof)\n );\n }\n\n /**\n * Verifies that the state root within an inclusion proof is valid.\n * @param _proof Message inclusion proof.\n * @return Whether or not the provided proof is valid.\n */\n function _verifyStateRootProof(\n L2MessageInclusionProof memory _proof\n )\n internal\n view\n returns (\n bool\n )\n {\n iOVM_StateCommitmentChain ovmStateCommitmentChain = iOVM_StateCommitmentChain(resolve(\"OVM_StateCommitmentChain\"));\n\n return (\n ovmStateCommitmentChain.insideFraudProofWindow(_proof.stateRootBatchHeader) == false\n && ovmStateCommitmentChain.verifyStateCommitment(\n _proof.stateRoot,\n _proof.stateRootBatchHeader,\n _proof.stateRootProof\n )\n );\n }\n\n /**\n * Verifies that the storage proof within an inclusion proof is valid.\n * @param _xDomainCalldata Encoded message calldata.\n * @param _proof Message inclusion proof.\n * @return Whether or not the provided proof is valid.\n */\n function _verifyStorageProof(\n bytes memory _xDomainCalldata,\n L2MessageInclusionProof memory _proof\n )\n internal\n view\n returns (\n bool\n )\n {\n bytes32 storageKey = keccak256(\n abi.encodePacked(\n keccak256(\n abi.encodePacked(\n _xDomainCalldata,\n resolve(\"OVM_L2CrossDomainMessenger\")\n )\n ),\n uint256(0)\n )\n );\n\n (\n bool exists,\n bytes memory encodedMessagePassingAccount\n ) = Lib_SecureMerkleTrie.get(\n abi.encodePacked(0x4200000000000000000000000000000000000000),\n _proof.stateTrieWitness,\n _proof.stateRoot\n );\n\n require(\n exists == true,\n \"Message passing predeploy has not been initialized or invalid proof provided.\"\n );\n\n Lib_OVMCodec.EVMAccount memory account = Lib_OVMCodec.decodeEVMAccount(\n encodedMessagePassingAccount\n );\n\n return Lib_SecureMerkleTrie.verifyInclusionProof(\n abi.encodePacked(storageKey),\n abi.encodePacked(uint8(1)),\n _proof.storageTrieWitness,\n account.storageRoot\n );\n }\n\n /**\n * Sends a cross domain message.\n * @param _message Message to send.\n * @param _gasLimit OVM gas limit for the message.\n */\n function _sendXDomainMessage(\n bytes memory _message,\n uint256 _gasLimit\n )\n override\n internal\n {\n iOVM_CanonicalTransactionChain(resolve(\"OVM_CanonicalTransactionChain\")).enqueue(\n resolve(\"OVM_L2CrossDomainMessenger\"),\n _gasLimit,\n _message\n );\n }\n}\n" - }, - "contracts/optimistic-ethereum/libraries/utils/Lib_ReentrancyGuard.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/**\n * @dev Contract module that helps prevent reentrant calls to a function.\n *\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\n * available, which can be applied to functions to make sure there are no nested\n * (reentrant) calls to them.\n *\n * Note that because there is a single `nonReentrant` guard, functions marked as\n * `nonReentrant` may not call one another. This can be worked around by making\n * those functions `private`, and then adding `external` `nonReentrant` entry\n * points to them.\n *\n * TIP: If you would like to learn more about reentrancy and alternative ways\n * to protect against it, check out our blog post\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\n */\nabstract contract Lib_ReentrancyGuard {\n // Booleans are more expensive than uint256 or any type that takes up a full\n // word because each write operation emits an extra SLOAD to first read the\n // slot's contents, replace the bits taken up by the boolean, and then write\n // back. This is the compiler's defense against contract upgrades and\n // pointer aliasing, and it cannot be disabled.\n\n // The values being non-zero value makes deployment a bit more expensive,\n // but in exchange the refund on every call to nonReentrant will be lower in\n // amount. Since refunds are capped to a percentage of the total\n // transaction's gas, it is best to keep them low in cases like this one, to\n // increase the likelihood of the full refund coming into effect.\n uint256 private constant _NOT_ENTERED = 1;\n uint256 private constant _ENTERED = 2;\n\n uint256 private _status;\n\n constructor () {\n _status = _NOT_ENTERED;\n }\n\n /**\n * @dev Prevents a contract from calling itself, directly or indirectly.\n * Calling a `nonReentrant` function from another `nonReentrant`\n * function is not supported. It is possible to prevent this from happening\n * by making the `nonReentrant` function external, and make it call a\n * `private` function that does the actual work.\n */\n modifier nonReentrant() {\n // On the first call to nonReentrant, _notEntered will be true\n require(_status != _ENTERED, \"ReentrancyGuard: reentrant call\");\n\n // Any calls to nonReentrant after this point will fail\n _status = _ENTERED;\n\n _;\n\n // By storing the original value once again, a refund is triggered (see\n // https://eips.ethereum.org/EIPS/eip-2200)\n _status = _NOT_ENTERED;\n }\n}\n" - }, - "contracts/optimistic-ethereum/iOVM/bridge/messaging/iOVM_L1CrossDomainMessenger.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../../libraries/codec/Lib_OVMCodec.sol\";\n\n/* Interface Imports */\nimport { iAbs_BaseCrossDomainMessenger } from \"./iAbs_BaseCrossDomainMessenger.sol\";\n\n/**\n * @title iOVM_L1CrossDomainMessenger\n */\ninterface iOVM_L1CrossDomainMessenger is iAbs_BaseCrossDomainMessenger {\n\n /*******************\n * Data Structures *\n *******************/\n\n struct L2MessageInclusionProof {\n bytes32 stateRoot;\n Lib_OVMCodec.ChainBatchHeader stateRootBatchHeader;\n Lib_OVMCodec.ChainInclusionProof stateRootProof;\n bytes stateTrieWitness;\n bytes storageTrieWitness;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Relays a cross domain message to a contract.\n * @param _target Target contract address.\n * @param _sender Message sender address.\n * @param _message Message to send to the target.\n * @param _messageNonce Nonce for the provided message.\n * @param _proof Inclusion proof for the given message.\n */\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce,\n L2MessageInclusionProof memory _proof\n ) external;\n\n /**\n * Replays a cross domain message to the target messenger.\n * @param _target Target contract address.\n * @param _sender Original sender address.\n * @param _message Message to send to the target.\n * @param _messageNonce Nonce for the provided message.\n * @param _gasLimit Gas limit for the provided message.\n */\n function replayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce,\n uint32 _gasLimit\n ) external;\n}\n" - }, - "contracts/optimistic-ethereum/OVM/bridge/messaging/Abs_BaseCrossDomainMessenger.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Interface Imports */\nimport { iAbs_BaseCrossDomainMessenger } from \"../../../iOVM/bridge/messaging/iAbs_BaseCrossDomainMessenger.sol\";\n\n/* Library Imports */\nimport { Lib_ReentrancyGuard } from \"../../../libraries/utils/Lib_ReentrancyGuard.sol\";\n\n/**\n * @title Abs_BaseCrossDomainMessenger\n * @dev The Base Cross Domain Messenger is an abstract contract providing the interface and common functionality used in the\n * L1 and L2 Cross Domain Messengers. It can also serve as a template for developers wishing to implement a custom bridge \n * contract to suit their needs.\n *\n * Compiler used: defined by child contract\n * Runtime target: defined by child contract\n */\nabstract contract Abs_BaseCrossDomainMessenger is iAbs_BaseCrossDomainMessenger, Lib_ReentrancyGuard {\n /**************\n * Constants *\n **************/\n\n // The default x-domain message sender being set to a non-zero value makes\n // deployment a bit more expensive, but in exchange the refund on every call to\n // `relayMessage` by the L1 and L2 messengers will be higher.\n address internal constant DEFAULT_XDOMAIN_SENDER = 0x000000000000000000000000000000000000dEaD;\n\n /**********************\n * Contract Variables *\n **********************/\n\n mapping (bytes32 => bool) public relayedMessages;\n mapping (bytes32 => bool) public successfulMessages;\n mapping (bytes32 => bool) public sentMessages;\n uint256 public messageNonce;\n address internal xDomainMsgSender = DEFAULT_XDOMAIN_SENDER;\n\n /********************\n * Public Functions *\n ********************/\n\n constructor() Lib_ReentrancyGuard() {}\n\n function xDomainMessageSender() public override view returns (address) {\n require(xDomainMsgSender != DEFAULT_XDOMAIN_SENDER, \"xDomainMessageSender is not set\");\n return xDomainMsgSender;\n }\n\n /**\n * Sends a cross domain message to the target messenger.\n * @param _target Target contract address.\n * @param _message Message to send to the target.\n * @param _gasLimit Gas limit for the provided message.\n */\n function sendMessage(\n address _target,\n bytes memory _message,\n uint32 _gasLimit\n )\n override\n public\n {\n bytes memory xDomainCalldata = _getXDomainCalldata(\n _target,\n msg.sender,\n _message,\n messageNonce\n );\n\n messageNonce += 1;\n sentMessages[keccak256(xDomainCalldata)] = true;\n\n _sendXDomainMessage(xDomainCalldata, _gasLimit);\n emit SentMessage(xDomainCalldata);\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Generates the correct cross domain calldata for a message.\n * @param _target Target contract address.\n * @param _sender Message sender address.\n * @param _message Message to send to the target.\n * @param _messageNonce Nonce for the provided message.\n * @return ABI encoded cross domain calldata.\n */\n function _getXDomainCalldata(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n return abi.encodeWithSignature(\n \"relayMessage(address,address,bytes,uint256)\",\n _target,\n _sender,\n _message,\n _messageNonce\n );\n }\n\n /**\n * Sends a cross domain message.\n * param // Message to send.\n * param // Gas limit for the provided message.\n */\n function _sendXDomainMessage(\n bytes memory, // _message,\n uint256 // _gasLimit\n )\n virtual\n internal\n {\n revert(\"Implement me in child contracts!\");\n }\n}\n" - }, - "contracts/optimistic-ethereum/iOVM/bridge/messaging/iAbs_BaseCrossDomainMessenger.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/**\n * @title iAbs_BaseCrossDomainMessenger\n */\ninterface iAbs_BaseCrossDomainMessenger {\n\n /**********\n * Events *\n **********/\n event SentMessage(bytes message);\n event RelayedMessage(bytes32 msgHash);\n\n /**********************\n * Contract Variables *\n **********************/\n function xDomainMessageSender() external view returns (address);\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Sends a cross domain message to the target messenger.\n * @param _target Target contract address.\n * @param _message Message to send to the target.\n * @param _gasLimit Gas limit for the provided message.\n */\n function sendMessage(\n address _target,\n bytes calldata _message,\n uint32 _gasLimit\n ) external;\n}\n" - }, - "contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L2CrossDomainMessenger.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_AddressResolver } from \"../../../libraries/resolver/Lib_AddressResolver.sol\";\nimport { Lib_ReentrancyGuard } from \"../../../libraries/utils/Lib_ReentrancyGuard.sol\";\n\n/* Interface Imports */\nimport { iOVM_L2CrossDomainMessenger } from \"../../../iOVM/bridge/messaging/iOVM_L2CrossDomainMessenger.sol\";\nimport { iOVM_L1MessageSender } from \"../../../iOVM/predeploys/iOVM_L1MessageSender.sol\";\nimport { iOVM_L2ToL1MessagePasser } from \"../../../iOVM/predeploys/iOVM_L2ToL1MessagePasser.sol\";\n\n/* Contract Imports */\nimport { Abs_BaseCrossDomainMessenger } from \"./Abs_BaseCrossDomainMessenger.sol\";\n\n/**\n * @title OVM_L2CrossDomainMessenger\n * @dev The L2 Cross Domain Messenger contract sends messages from L2 to L1, and is the entry point\n * for L2 messages sent via the L1 Cross Domain Messenger.\n *\n * Compiler used: optimistic-solc\n * Runtime target: OVM\n */\ncontract OVM_L2CrossDomainMessenger is iOVM_L2CrossDomainMessenger, Abs_BaseCrossDomainMessenger, Lib_AddressResolver {\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n constructor(\n address _libAddressManager\n )\n Lib_AddressResolver(_libAddressManager)\n {}\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Relays a cross domain message to a contract.\n * @inheritdoc iOVM_L2CrossDomainMessenger\n */\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce\n )\n override\n nonReentrant\n public\n {\n require(\n _verifyXDomainMessage() == true,\n \"Provided message could not be verified.\"\n );\n\n bytes memory xDomainCalldata = _getXDomainCalldata(\n _target,\n _sender,\n _message,\n _messageNonce\n );\n\n bytes32 xDomainCalldataHash = keccak256(xDomainCalldata);\n\n require(\n successfulMessages[xDomainCalldataHash] == false,\n \"Provided message has already been received.\"\n );\n\n // Prevent calls to OVM_L2ToL1MessagePasser, which would enable\n // an attacker to maliciously craft the _message to spoof\n // a call from any L2 account.\n if(_target == resolve(\"OVM_L2ToL1MessagePasser\")){\n // Write to the successfulMessages mapping and return immediately.\n successfulMessages[xDomainCalldataHash] = true;\n return;\n }\n\n xDomainMsgSender = _sender;\n (bool success, ) = _target.call(_message);\n xDomainMsgSender = DEFAULT_XDOMAIN_SENDER;\n\n // Mark the message as received if the call was successful. Ensures that a message can be\n // relayed multiple times in the case that the call reverted.\n if (success == true) {\n successfulMessages[xDomainCalldataHash] = true;\n emit RelayedMessage(xDomainCalldataHash);\n }\n\n // Store an identifier that can be used to prove that the given message was relayed by some\n // user. Gives us an easy way to pay relayers for their work.\n bytes32 relayId = keccak256(\n abi.encodePacked(\n xDomainCalldata,\n msg.sender,\n block.number\n )\n );\n relayedMessages[relayId] = true;\n }\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Verifies that a received cross domain message is valid.\n * @return _valid Whether or not the message is valid.\n */\n function _verifyXDomainMessage()\n view\n internal\n returns (\n bool _valid\n )\n {\n return (\n iOVM_L1MessageSender(resolve(\"OVM_L1MessageSender\")).getL1MessageSender() == resolve(\"OVM_L1CrossDomainMessenger\")\n );\n }\n\n /**\n * Sends a cross domain message.\n * @param _message Message to send.\n * param _gasLimit Gas limit for the provided message.\n */\n function _sendXDomainMessage(\n bytes memory _message,\n uint256 // _gasLimit\n )\n override\n internal\n {\n iOVM_L2ToL1MessagePasser(resolve(\"OVM_L2ToL1MessagePasser\")).passMessageToL1(_message);\n }\n}\n" - }, - "contracts/optimistic-ethereum/iOVM/bridge/messaging/iOVM_L2CrossDomainMessenger.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Interface Imports */\nimport { iAbs_BaseCrossDomainMessenger } from \"./iAbs_BaseCrossDomainMessenger.sol\";\n\n/**\n * @title iOVM_L2CrossDomainMessenger\n */\ninterface iOVM_L2CrossDomainMessenger is iAbs_BaseCrossDomainMessenger {\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Relays a cross domain message to a contract.\n * @param _target Target contract address.\n * @param _sender Message sender address.\n * @param _message Message to send to the target.\n * @param _messageNonce Nonce for the provided message.\n */\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce\n ) external;\n}\n" - }, - "contracts/optimistic-ethereum/iOVM/predeploys/iOVM_L1MessageSender.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/**\n * @title iOVM_L1MessageSender\n */\ninterface iOVM_L1MessageSender {\n\n /********************\n * Public Functions *\n ********************/\n\n function getL1MessageSender() external view returns (address _l1MessageSender);\n}\n" - }, - "contracts/optimistic-ethereum/iOVM/predeploys/iOVM_L2ToL1MessagePasser.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/**\n * @title iOVM_L2ToL1MessagePasser\n */\ninterface iOVM_L2ToL1MessagePasser {\n\n /**********\n * Events *\n **********/\n\n event L2ToL1Message(\n uint256 _nonce,\n address _sender,\n bytes _data\n );\n\n\n /********************\n * Public Functions *\n ********************/\n\n function passMessageToL1(bytes calldata _message) external;\n}\n" - }, - "contracts/optimistic-ethereum/OVM/predeploys/OVM_L2ToL1MessagePasser.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Interface Imports */\nimport { iOVM_L2ToL1MessagePasser } from \"../../iOVM/predeploys/iOVM_L2ToL1MessagePasser.sol\";\n\n/**\n * @title OVM_L2ToL1MessagePasser\n * @dev The L2 to L1 Message Passer is a utility contract which facilitate an L1 proof of the \n * of a message on L2. The L1 Cross Domain Messenger performs this proof in its\n * _verifyStorageProof function, which verifies the existence of the transaction hash in this \n * contract's `sentMessages` mapping.\n * \n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract OVM_L2ToL1MessagePasser is iOVM_L2ToL1MessagePasser {\n\n /**********************\n * Contract Variables *\n **********************/\n\n mapping (bytes32 => bool) public sentMessages;\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Passes a message to L1.\n * @param _message Message to pass to L1.\n */\n function passMessageToL1(\n bytes memory _message\n )\n override\n public\n {\n // Note: although this function is public, only messages sent from the OVM_L2CrossDomainMessenger \n // will be relayed by the OVM_L1CrossDomainMessenger. This is enforced by a check in \n // OVM_L1CrossDomainMessenger._verifyStorageProof().\n sentMessages[keccak256(\n abi.encodePacked(\n _message,\n msg.sender\n )\n )] = true;\n }\n}\n" - }, - "contracts/optimistic-ethereum/OVM/predeploys/OVM_L1MessageSender.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Interface Imports */\nimport { iOVM_L1MessageSender } from \"../../iOVM/predeploys/iOVM_L1MessageSender.sol\";\nimport { iOVM_ExecutionManager } from \"../../iOVM/execution/iOVM_ExecutionManager.sol\";\n\n/**\n * @title OVM_L1MessageSender\n * @dev The L1MessageSender is a predeploy contract running on L2. During the execution of cross \n * domain transaction from L1 to L2, it returns the address of the L1 account (either an EOA or\n * contract) which sent the message to L2 via the Canonical Transaction Chain's `enqueue()` \n * function.\n * \n * This contract exclusively serves as a getter for the ovmL1TXORIGIN operation. This is necessary \n * because there is no corresponding operation in the EVM which the the optimistic solidity compiler \n * can be replaced with a call to the ExecutionManager's ovmL1TXORIGIN() function.\n *\n * \n * Compiler used: solc\n * Runtime target: OVM\n */\ncontract OVM_L1MessageSender is iOVM_L1MessageSender {\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @return _l1MessageSender L1 message sender address (msg.sender).\n */\n function getL1MessageSender()\n override\n public\n view\n returns (\n address _l1MessageSender\n )\n {\n // Note that on L2 msg.sender (ie. evmCALLER) will always be the Execution Manager \n return iOVM_ExecutionManager(msg.sender).ovmL1TXORIGIN();\n }\n}\n" - }, - "contracts/optimistic-ethereum/mockOVM/bridge/mockOVM_CrossDomainMessenger.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Contract Imports */\nimport { iAbs_BaseCrossDomainMessenger } from \"../../iOVM/bridge/messaging/iAbs_BaseCrossDomainMessenger.sol\";\n\n/**\n * @title mockOVM_CrossDomainMessenger\n */\ncontract mockOVM_CrossDomainMessenger is iAbs_BaseCrossDomainMessenger {\n\n /***********\n * Structs *\n ***********/\n\n struct ReceivedMessage {\n uint256 timestamp;\n address target;\n address sender;\n bytes message;\n uint256 messageNonce;\n uint32 gasLimit;\n }\n\n\n /**********************\n * Contract Variables *\n **********************/\n\n ReceivedMessage[] internal fullReceivedMessages;\n address internal targetMessengerAddress;\n uint256 internal lastRelayedMessage;\n uint256 internal delay;\n uint256 public messageNonce;\n address override public xDomainMessageSender;\n\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _delay Time in seconds before a message can be relayed.\n */\n constructor(\n uint256 _delay\n )\n {\n delay = _delay;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Sets the target messenger address.\n * @dev Currently, this function is public and therefore allows anyone to modify the target\n * messenger for a given xdomain messenger contract. Obviously this shouldn't be allowed,\n * but we still need to determine an adequate mechanism for updating this address.\n * @param _targetMessengerAddress New messenger address.\n */\n function setTargetMessengerAddress(\n address _targetMessengerAddress\n )\n public\n {\n targetMessengerAddress = _targetMessengerAddress;\n }\n\n /**\n * Sends a message to another mock xdomain messenger.\n * @param _target Target for the message.\n * @param _message Message to send.\n * @param _gasLimit Amount of gas to send with the call.\n */\n function sendMessage(\n address _target,\n bytes memory _message,\n uint32 _gasLimit\n )\n override\n public\n {\n mockOVM_CrossDomainMessenger targetMessenger = mockOVM_CrossDomainMessenger(\n targetMessengerAddress\n );\n\n // Just send it over!\n targetMessenger.receiveMessage(ReceivedMessage({\n timestamp: block.timestamp,\n target: _target,\n sender: msg.sender,\n message: _message,\n messageNonce: messageNonce,\n gasLimit: _gasLimit\n }));\n\n messageNonce += 1;\n }\n\n /**\n * Receives a message to be sent later.\n * @param _message Message to send later.\n */\n function receiveMessage(\n ReceivedMessage memory _message\n )\n public\n {\n fullReceivedMessages.push(_message);\n }\n\n /**\n * Checks whether we have messages to relay.\n * @param _exists Whether or not we have more messages to relay.\n */\n function hasNextMessage()\n public\n view\n returns (\n bool _exists\n )\n {\n return fullReceivedMessages.length > lastRelayedMessage;\n }\n\n /**\n * Relays the last received message not yet relayed.\n */\n function relayNextMessage()\n public\n {\n require(hasNextMessage(), \"No pending messages to relay\");\n ReceivedMessage memory nextMessage = fullReceivedMessages[lastRelayedMessage];\n require(nextMessage.timestamp + delay < block.timestamp, \"Message is not ready to be relayed. The delay period is not up yet!\");\n\n xDomainMessageSender = nextMessage.sender;\n (bool success,) = nextMessage.target.call{gas: nextMessage.gasLimit}(nextMessage.message);\n require(success, \"Cross-domain message call reverted. Did you set your gas limit high enough?\");\n lastRelayedMessage += 1;\n }\n}\n" - }, - "contracts/optimistic-ethereum/libraries/bridge/OVM_CrossDomainEnabled.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n/* Interface Imports */\nimport { iAbs_BaseCrossDomainMessenger } from \"../../iOVM/bridge/messaging/iAbs_BaseCrossDomainMessenger.sol\";\n\n/**\n * @title OVM_CrossDomainEnabled\n * @dev Helper contract for contracts performing cross-domain communications\n *\n * Compiler used: defined by inheriting contract\n * Runtime target: defined by inheriting contract\n */\ncontract OVM_CrossDomainEnabled {\n // Messenger contract used to send and recieve messages from the other domain.\n address public messenger;\n\n /***************\n * Constructor *\n ***************/ \n constructor(\n address _messenger\n ) {\n messenger = _messenger;\n }\n\n /**********************\n * Function Modifiers *\n **********************/\n\n /**\n * @notice Enforces that the modified function is only callable by a specific cross-domain account.\n * @param _sourceDomainAccount The only account on the originating domain which is authenticated to call this function.\n */\n modifier onlyFromCrossDomainAccount(\n address _sourceDomainAccount\n ) {\n require(\n msg.sender == address(getCrossDomainMessenger()),\n \"OVM_XCHAIN: messenger contract unauthenticated\"\n );\n\n require(\n getCrossDomainMessenger().xDomainMessageSender() == _sourceDomainAccount,\n \"OVM_XCHAIN: wrong sender of cross-domain message\"\n );\n\n _;\n }\n \n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * @notice Gets the messenger, usually from storage. This function is exposed in case a child contract needs to override.\n * @return The address of the cross-domain messenger contract which should be used. \n */\n function getCrossDomainMessenger()\n internal\n virtual\n returns(\n iAbs_BaseCrossDomainMessenger\n )\n {\n return iAbs_BaseCrossDomainMessenger(messenger);\n }\n\n /**\n * @notice Sends a message to an account on another domain\n * @param _crossDomainTarget The intended recipient on the destination domain\n * @param _data The data to send to the target (usually calldata to a function with `onlyFromCrossDomainAccount()`)\n * @param _gasLimit The gasLimit for the receipt of the message on the target domain.\n */\n function sendCrossDomainMessage(\n address _crossDomainTarget,\n bytes memory _data,\n uint32 _gasLimit\n ) internal {\n getCrossDomainMessenger().sendMessage(_crossDomainTarget, _data, _gasLimit);\n }\n}\n" - }, - "contracts/optimistic-ethereum/OVM/bridge/tokens/OVM_L1ETHGateway.sol": { - "content": "// SPDX-License-Identifier: MIT\n// @unsupported: ovm\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Interface Imports */\nimport { iOVM_L1ETHGateway } from \"../../../iOVM/bridge/tokens/iOVM_L1ETHGateway.sol\";\nimport { iOVM_L2DepositedToken } from \"../../../iOVM/bridge/tokens/iOVM_L2DepositedToken.sol\";\n\n/* Library Imports */\nimport { OVM_CrossDomainEnabled } from \"../../../libraries/bridge/OVM_CrossDomainEnabled.sol\";\nimport { Lib_AddressResolver } from \"../../../libraries/resolver/Lib_AddressResolver.sol\";\nimport { Lib_AddressManager } from \"../../../libraries/resolver/Lib_AddressManager.sol\";\n\n/**\n * @title OVM_L1ETHGateway\n * @dev The L1 ETH Gateway is a contract which stores deposited ETH that is in use on L2.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract OVM_L1ETHGateway is iOVM_L1ETHGateway, OVM_CrossDomainEnabled, Lib_AddressResolver {\n\n /********************\n * Public Constants *\n ********************/\n\n uint32 public constant override getFinalizeDepositL2Gas = 1200000;\n\n /********************************\n * External Contract References *\n ********************************/\n\n address public ovmEth;\n\n /***************\n * Constructor *\n ***************/\n\n // This contract lives behind a proxy, so the constructor parameters will go unused.\n constructor()\n OVM_CrossDomainEnabled(address(0))\n Lib_AddressResolver(address(0))\n public\n {}\n\n /******************\n * Initialization *\n ******************/\n\n /**\n * @param _libAddressManager Address manager for this OE deployment\n * @param _ovmEth L2 OVM_ETH implementation of iOVM_DepositedToken\n */\n function initialize(\n address _libAddressManager,\n address _ovmEth\n )\n public\n {\n require(libAddressManager == Lib_AddressManager(0), \"Contract has already been initialized.\");\n libAddressManager = Lib_AddressManager(_libAddressManager);\n ovmEth = _ovmEth;\n messenger = resolve(\"Proxy__OVM_L1CrossDomainMessenger\");\n }\n\n /**************\n * Depositing *\n **************/\n\n receive()\n external\n payable\n {\n _initiateDeposit(msg.sender, msg.sender);\n }\n\n /**\n * @dev deposit an amount of the ETH to the caller's balance on L2\n */\n function deposit() \n external\n override\n payable\n {\n _initiateDeposit(msg.sender, msg.sender);\n }\n\n /**\n * @dev deposit an amount of ETH to a recipients's balance on L2\n * @param _to L2 address to credit the withdrawal to\n */\n function depositTo(\n address _to\n )\n external\n override\n payable\n {\n _initiateDeposit(msg.sender, _to);\n }\n\n /**\n * @dev Performs the logic for deposits by storing the ETH and informing the L2 ETH Gateway of the deposit.\n *\n * @param _from Account to pull the deposit from on L1\n * @param _to Account to give the deposit to on L2\n */\n function _initiateDeposit(\n address _from,\n address _to\n )\n internal\n {\n // Construct calldata for l2ETHGateway.finalizeDeposit(_to, _amount)\n bytes memory data =\n abi.encodeWithSelector(\n iOVM_L2DepositedToken.finalizeDeposit.selector,\n _to,\n msg.value\n );\n\n // Send calldata into L2\n sendCrossDomainMessage(\n ovmEth,\n data,\n getFinalizeDepositL2Gas\n );\n\n emit DepositInitiated(_from, _to, msg.value);\n }\n\n /*************************\n * Cross-chain Functions *\n *************************/\n\n /**\n * @dev Complete a withdrawal from L2 to L1, and credit funds to the recipient's balance of the\n * L1 ETH token.\n * Since only the xDomainMessenger can call this function, it will never be called before the withdrawal is finalized. \n *\n * @param _to L1 address to credit the withdrawal to\n * @param _amount Amount of the ETH to withdraw\n */\n function finalizeWithdrawal(\n address _to,\n uint256 _amount\n )\n external\n override\n onlyFromCrossDomainAccount(ovmEth)\n {\n _safeTransferETH(_to, _amount);\n\n emit WithdrawalFinalized(_to, _amount);\n }\n\n /**********************************\n * Internal Functions: Accounting *\n **********************************/\n\n /**\n * @dev Internal accounting function for moving around L1 ETH.\n *\n * @param _to L1 address to transfer ETH to\n * @param _value Amount of ETH to send to\n */\n function _safeTransferETH(\n address _to,\n uint256 _value\n )\n internal\n {\n (bool success, ) = _to.call{value: _value}(new bytes(0));\n require(success, 'TransferHelper::safeTransferETH: ETH transfer failed');\n }\n}\n" - }, - "contracts/optimistic-ethereum/iOVM/bridge/tokens/iOVM_L1ETHGateway.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0;\npragma experimental ABIEncoderV2;\n\n/**\n * @title iOVM_L1ETHGateway\n */\ninterface iOVM_L1ETHGateway {\n\n /**********\n * Events *\n **********/\n\n event DepositInitiated(\n address indexed _from,\n address _to,\n uint256 _amount\n );\n\n event WithdrawalFinalized(\n address indexed _to,\n uint256 _amount\n );\n\n /********************\n * Public Functions *\n ********************/\n\n function deposit()\n external\n payable;\n\n function depositTo(\n address _to\n )\n external\n payable;\n\n /*************************\n * Cross-chain Functions *\n *************************/\n\n function finalizeWithdrawal(\n address _to,\n uint _amount\n )\n external;\n\n function getFinalizeDepositL2Gas()\n external\n view\n returns(\n uint32\n );\n}\n" - }, - "contracts/optimistic-ethereum/iOVM/bridge/tokens/iOVM_L2DepositedToken.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0;\npragma experimental ABIEncoderV2;\n\n/**\n * @title iOVM_L2DepositedToken\n */\ninterface iOVM_L2DepositedToken {\n\n /**********\n * Events *\n **********/\n\n event WithdrawalInitiated(\n address indexed _from,\n address _to,\n uint256 _amount\n );\n\n event DepositFinalized(\n address indexed _to,\n uint256 _amount\n ); \n\n\n /********************\n * Public Functions *\n ********************/\n\n function withdraw(\n uint _amount\n )\n external;\n\n function withdrawTo(\n address _to,\n uint _amount\n )\n external;\n\n\n /*************************\n * Cross-chain Functions *\n *************************/\n\n function finalizeDeposit(\n address _to,\n uint _amount\n )\n external;\n}\n" - }, - "contracts/optimistic-ethereum/libraries/resolver/Lib_ResolvedDelegateProxy.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Library Imports */\nimport { Lib_AddressManager } from \"./Lib_AddressManager.sol\";\n\n/**\n * @title Lib_ResolvedDelegateProxy\n */\ncontract Lib_ResolvedDelegateProxy {\n\n /*************\n * Variables *\n *************/\n\n\n // Using mappings to store fields to avoid overwriting storage slots in the\n // implementation contract. For example, instead of storing these fields at\n // storage slot `0` & `1`, they are stored at `keccak256(key + slot)`.\n // See: https://solidity.readthedocs.io/en/v0.7.0/internals/layout_in_storage.html\n // NOTE: Do not use this code in your own contract system. \n // There is a known flaw in this contract, and we will remove it from the repository\n // in the near future. Due to the very limited way that we are using it, this flaw is\n // not an issue in our system. \n mapping(address=>string) private implementationName;\n mapping(address=>Lib_AddressManager) private addressManager;\n\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Lib_AddressManager.\n * @param _implementationName implementationName of the contract to proxy to.\n */\n constructor(\n address _libAddressManager,\n string memory _implementationName\n )\n {\n addressManager[address(this)] = Lib_AddressManager(_libAddressManager);\n implementationName[address(this)] = _implementationName;\n }\n\n\n /*********************\n * Fallback Function *\n *********************/\n\n fallback()\n external\n payable\n {\n address target = addressManager[address(this)].getAddress((implementationName[address(this)]));\n require(\n target != address(0),\n \"Target address must be initialized.\"\n );\n\n (bool success, bytes memory returndata) = target.delegatecall(msg.data);\n\n if (success == true) {\n assembly {\n return(add(returndata, 0x20), mload(returndata))\n }\n } else {\n assembly {\n revert(add(returndata, 0x20), mload(returndata))\n }\n }\n }\n}\n" - }, - "contracts/optimistic-ethereum/OVM/bridge/tokens/Abs_L2DepositedToken.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Interface Imports */\nimport { iOVM_L2DepositedToken } from \"../../../iOVM/bridge/tokens/iOVM_L2DepositedToken.sol\";\nimport { iOVM_L1TokenGateway } from \"../../../iOVM/bridge/tokens/iOVM_L1TokenGateway.sol\";\n\n/* Library Imports */\nimport { OVM_CrossDomainEnabled } from \"../../../libraries/bridge/OVM_CrossDomainEnabled.sol\";\n\n/**\n * @title Abs_L2DepositedToken\n * @dev An L2 Deposited Token is an L2 representation of funds which were deposited from L1.\n * Usually contract mints new tokens when it hears about deposits into the L1 ERC20 gateway.\n * This contract also burns the tokens intended for withdrawal, informing the L1 gateway to release L1 funds.\n *\n * NOTE: This abstract contract gives all the core functionality of a deposited token implementation except for the\n * token's internal accounting itself. This gives developers an easy way to implement children with their own token code.\n *\n * Compiler used: optimistic-solc\n * Runtime target: OVM\n */\nabstract contract Abs_L2DepositedToken is iOVM_L2DepositedToken, OVM_CrossDomainEnabled {\n\n /*******************\n * Contract Events *\n *******************/\n\n event Initialized(iOVM_L1TokenGateway _l1TokenGateway);\n\n /********************************\n * External Contract References *\n ********************************/\n\n iOVM_L1TokenGateway public l1TokenGateway;\n\n /********************************\n * Constructor & Initialization *\n ********************************/\n\n /**\n * @param _l2CrossDomainMessenger L1 Messenger address being used for cross-chain communications.\n */\n constructor(\n address _l2CrossDomainMessenger\n )\n OVM_CrossDomainEnabled(_l2CrossDomainMessenger)\n {}\n\n /**\n * @dev Initialize this contract with the L1 token gateway address.\n * The flow: 1) this contract gets deployed on L2, 2) the L1\n * gateway is deployed with addr from (1), 3) L1 gateway address passed here.\n *\n * @param _l1TokenGateway Address of the corresponding L1 gateway deployed to the main chain\n */\n\n function init(\n iOVM_L1TokenGateway _l1TokenGateway\n )\n public\n {\n require(address(l1TokenGateway) == address(0), \"Contract has already been initialized\");\n\n l1TokenGateway = _l1TokenGateway;\n \n emit Initialized(l1TokenGateway);\n }\n\n /**********************\n * Function Modifiers *\n **********************/\n\n modifier onlyInitialized() {\n require(address(l1TokenGateway) != address(0), \"Contract has not yet been initialized\");\n _;\n }\n\n /********************************\n * Overridable Accounting logic *\n ********************************/\n\n // Default gas value which can be overridden if more complex logic runs on L2.\n uint32 constant DEFAULT_FINALIZE_WITHDRAWAL_L1_GAS = 100000;\n\n /**\n * @dev Core logic to be performed when a withdrawal from L2 is initialized.\n * In most cases, this will simply burn the withdrawn L2 funds.\n *\n * param _to Address being withdrawn to\n * param _amount Amount being withdrawn\n */\n\n function _handleInitiateWithdrawal(\n address, // _to,\n uint // _amount\n )\n internal\n virtual\n {\n revert(\"Accounting must be implemented by child contract.\");\n }\n\n /**\n * @dev Core logic to be performed when a deposit from L2 is finalized on L2.\n * In most cases, this will simply _mint() to credit L2 funds to the recipient.\n *\n * param _to Address being deposited to on L2\n * param _amount Amount which was deposited on L1\n */\n function _handleFinalizeDeposit(\n address, // _to\n uint // _amount\n )\n internal\n virtual\n {\n revert(\"Accounting must be implemented by child contract.\");\n }\n\n /**\n * @dev Overridable getter for the *L1* gas limit of settling the withdrawal, in the case it may be\n * dynamic, and the above public constant does not suffice.\n *\n */\n\n function getFinalizeWithdrawalL1Gas()\n public\n view\n virtual\n returns(\n uint32\n )\n {\n return DEFAULT_FINALIZE_WITHDRAWAL_L1_GAS;\n }\n\n\n /***************\n * Withdrawing *\n ***************/\n\n /**\n * @dev initiate a withdraw of some tokens to the caller's account on L1\n * @param _amount Amount of the token to withdraw\n */\n function withdraw(\n uint _amount\n )\n external\n override\n onlyInitialized()\n {\n _initiateWithdrawal(msg.sender, _amount);\n }\n\n /**\n * @dev initiate a withdraw of some token to a recipient's account on L1\n * @param _to L1 adress to credit the withdrawal to\n * @param _amount Amount of the token to withdraw\n */\n function withdrawTo(\n address _to,\n uint _amount\n )\n external\n override\n onlyInitialized()\n {\n _initiateWithdrawal(_to, _amount);\n }\n\n /**\n * @dev Performs the logic for deposits by storing the token and informing the L2 token Gateway of the deposit.\n *\n * @param _to Account to give the withdrawal to on L1\n * @param _amount Amount of the token to withdraw\n */\n function _initiateWithdrawal(\n address _to,\n uint _amount\n )\n internal\n {\n // Call our withdrawal accounting handler implemented by child contracts (usually a _burn)\n _handleInitiateWithdrawal(_to, _amount);\n\n // Construct calldata for l1TokenGateway.finalizeWithdrawal(_to, _amount)\n bytes memory data = abi.encodeWithSelector(\n iOVM_L1TokenGateway.finalizeWithdrawal.selector,\n _to,\n _amount\n );\n\n // Send message up to L1 gateway\n sendCrossDomainMessage(\n address(l1TokenGateway),\n data,\n getFinalizeWithdrawalL1Gas()\n );\n\n emit WithdrawalInitiated(msg.sender, _to, _amount);\n }\n\n /************************************\n * Cross-chain Function: Depositing *\n ************************************/\n\n /**\n * @dev Complete a deposit from L1 to L2, and credits funds to the recipient's balance of this \n * L2 token. \n * This call will fail if it did not originate from a corresponding deposit in OVM_l1TokenGateway. \n *\n * @param _to Address to receive the withdrawal at\n * @param _amount Amount of the token to withdraw\n */\n function finalizeDeposit(\n address _to,\n uint _amount\n )\n external\n override \n onlyInitialized()\n onlyFromCrossDomainAccount(address(l1TokenGateway))\n {\n _handleFinalizeDeposit(_to, _amount);\n emit DepositFinalized(_to, _amount);\n }\n}\n" - }, - "contracts/optimistic-ethereum/iOVM/bridge/tokens/iOVM_L1TokenGateway.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0;\npragma experimental ABIEncoderV2;\n\n/**\n * @title iOVM_L1TokenGateway\n */\ninterface iOVM_L1TokenGateway {\n\n /**********\n * Events *\n **********/\n\n event DepositInitiated(\n address indexed _from,\n address _to,\n uint256 _amount\n );\n \n event WithdrawalFinalized(\n address indexed _to,\n uint256 _amount\n );\n\n\n /********************\n * Public Functions *\n ********************/\n\n function deposit(\n uint _amount\n )\n external;\n\n function depositTo(\n address _to,\n uint _amount\n )\n external;\n\n\n /*************************\n * Cross-chain Functions *\n *************************/\n\n function finalizeWithdrawal(\n address _to,\n uint _amount\n )\n external;\n}\n" - }, - "contracts/optimistic-ethereum/OVM/bridge/tokens/OVM_L2DepositedERC20.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Interface Imports */\nimport { iOVM_L1TokenGateway } from \"../../../iOVM/bridge/tokens/iOVM_L1TokenGateway.sol\";\n\n/* Contract Imports */\nimport { UniswapV2ERC20 } from \"../../../libraries/standards/UniswapV2ERC20.sol\";\n\n/* Library Imports */\nimport { Abs_L2DepositedToken } from \"./Abs_L2DepositedToken.sol\";\n\n/**\n * @title OVM_L2DepositedERC20\n * @dev The L2 Deposited ERC20 is an ERC20 implementation which represents L1 assets deposited into L2.\n * This contract mints new tokens when it hears about deposits into the L1 ERC20 gateway.\n * This contract also burns the tokens intended for withdrawal, informing the L1 gateway to release L1 funds.\n *\n * NOTE: This contract implements the Abs_L2DepositedToken contract using Uniswap's ERC20 as the implementation.\n * Alternative implementations can be used in this similar manner.\n *\n * Compiler used: optimistic-solc\n * Runtime target: OVM\n */\ncontract OVM_L2DepositedERC20 is Abs_L2DepositedToken, UniswapV2ERC20 {\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _l2CrossDomainMessenger Cross-domain messenger used by this contract.\n * @param _name ERC20 name\n * @param _symbol ERC20 symbol\n */\n constructor(\n address _l2CrossDomainMessenger,\n string memory _name,\n string memory _symbol\n )\n Abs_L2DepositedToken(_l2CrossDomainMessenger)\n UniswapV2ERC20(_name, _symbol)\n {}\n\n // When a withdrawal is initiated, we burn the withdrawer's funds to prevent subsequent L2 usage.\n function _handleInitiateWithdrawal(\n address, // _to,\n uint _amount\n )\n internal\n override\n {\n _burn(msg.sender, _amount);\n }\n\n // When a deposit is finalized, we credit the account on L2 with the same amount of tokens.\n function _handleFinalizeDeposit(\n address _to,\n uint _amount\n )\n internal\n override\n {\n _mint(_to, _amount);\n }\n}\n" - }, - "contracts/optimistic-ethereum/libraries/standards/UniswapV2ERC20.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.5.16 <0.8.0;\n\nimport './IUniswapV2ERC20.sol';\nimport './UniSafeMath.sol';\n\ncontract UniswapV2ERC20 is IUniswapV2ERC20 {\n using UniSafeMath for uint;\n\n string public override name;\n string public override symbol;\n uint8 public constant override decimals = 18;\n uint public override totalSupply;\n mapping(address => uint) public override balanceOf;\n mapping(address => mapping(address => uint)) public override allowance;\n\n bytes32 public override DOMAIN_SEPARATOR;\n // keccak256(\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\");\n bytes32 public constant override PERMIT_TYPEHASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9;\n mapping(address => uint) public override nonces;\n\n constructor(\n string memory _name,\n string memory _symbol\n ) {\n name = _name;\n symbol = _symbol;\n\n uint chainId;\n assembly {\n chainId := chainid()\n }\n DOMAIN_SEPARATOR = keccak256(\n abi.encode(\n keccak256('EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)'),\n keccak256(bytes(name)),\n keccak256(bytes('1')),\n chainId,\n address(this)\n )\n );\n }\n\n function _mint(address to, uint value) internal {\n totalSupply = totalSupply.add(value);\n balanceOf[to] = balanceOf[to].add(value);\n emit Transfer(address(0), to, value);\n }\n\n function _burn(address from, uint value) internal {\n balanceOf[from] = balanceOf[from].sub(value);\n totalSupply = totalSupply.sub(value);\n emit Transfer(from, address(0), value);\n }\n\n function _approve(address owner, address spender, uint value) private {\n allowance[owner][spender] = value;\n emit Approval(owner, spender, value);\n }\n\n function _transfer(address from, address to, uint value) private {\n balanceOf[from] = balanceOf[from].sub(value);\n balanceOf[to] = balanceOf[to].add(value);\n emit Transfer(from, to, value);\n }\n\n function approve(address spender, uint value) external override returns (bool) {\n _approve(msg.sender, spender, value);\n return true;\n }\n\n function transfer(address to, uint value) external override returns (bool) {\n _transfer(msg.sender, to, value);\n return true;\n }\n\n function transferFrom(address from, address to, uint value) external override returns (bool) {\n if (allowance[from][msg.sender] != uint(-1)) {\n allowance[from][msg.sender] = allowance[from][msg.sender].sub(value);\n }\n _transfer(from, to, value);\n return true;\n }\n\n function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external override {\n require(deadline >= block.timestamp, 'UniswapV2: EXPIRED');\n bytes32 digest = keccak256(\n abi.encodePacked(\n '\\x19\\x01',\n DOMAIN_SEPARATOR,\n keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, value, nonces[owner]++, deadline))\n )\n );\n address recoveredAddress = ecrecover(digest, v, r, s);\n require(recoveredAddress != address(0) && recoveredAddress == owner, 'UniswapV2: INVALID_SIGNATURE');\n _approve(owner, spender, value);\n }\n}\n" - }, - "contracts/optimistic-ethereum/libraries/standards/IUniswapV2ERC20.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.5.16 <0.8.0;\n\ninterface IUniswapV2ERC20 {\n event Approval(address indexed owner, address indexed spender, uint value);\n event Transfer(address indexed from, address indexed to, uint value);\n\n function name() external view returns (string memory);\n function symbol() external view returns (string memory);\n function decimals() external view returns (uint8);\n function totalSupply() external view returns (uint);\n function balanceOf(address owner) external view returns (uint);\n function allowance(address owner, address spender) external view returns (uint);\n\n function approve(address spender, uint value) external returns (bool);\n function transfer(address to, uint value) external returns (bool);\n function transferFrom(address from, address to, uint value) external returns (bool);\n\n function DOMAIN_SEPARATOR() external view returns (bytes32);\n function PERMIT_TYPEHASH() external pure returns (bytes32);\n function nonces(address owner) external view returns (uint);\n\n function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;\n}\n" - }, - "contracts/optimistic-ethereum/libraries/standards/UniSafeMath.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.5.16 <0.8.0;\n\n// a library for performing overflow-safe math, courtesy of DappHub (https://github.com/dapphub/ds-math)\n\nlibrary UniSafeMath {\n function add(uint x, uint y) internal pure returns (uint z) {\n require((z = x + y) >= x, 'ds-math-add-overflow');\n }\n\n function sub(uint x, uint y) internal pure returns (uint z) {\n require((z = x - y) <= x, 'ds-math-sub-underflow');\n }\n\n function mul(uint x, uint y) internal pure returns (uint z) {\n require(y == 0 || (z = x * y) / y == x, 'ds-math-mul-overflow');\n }\n}\n" - }, - "contracts/optimistic-ethereum/OVM/predeploys/OVM_ETH.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Library Imports */\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/* Interface Imports */\nimport { iOVM_L1TokenGateway } from \"../../iOVM/bridge/tokens/iOVM_L1TokenGateway.sol\";\n\n/* Contract Imports */\nimport { OVM_L2DepositedERC20 } from \"../bridge/tokens/OVM_L2DepositedERC20.sol\";\n\n/**\n * @title OVM_ETH\n * @dev The ETH predeploy provides an ERC20 interface for ETH deposited to Layer 2. Note that \n * unlike on Layer 1, Layer 2 accounts do not have a balance field.\n * \n * Compiler used: optimistic-solc\n * Runtime target: OVM\n */\ncontract OVM_ETH is OVM_L2DepositedERC20 {\n constructor(\n address _l2CrossDomainMessenger,\n address _l1ETHGateway\n ) \n OVM_L2DepositedERC20(\n _l2CrossDomainMessenger,\n \"Ether\",\n \"ETH\"\n )\n {\n init(iOVM_L1TokenGateway(_l1ETHGateway));\n }\n}\n" - }, - "contracts/optimistic-ethereum/OVM/bridge/tokens/OVM_L1ERC20Gateway.sol": { - "content": "// SPDX-License-Identifier: MIT\n// @unsupported: ovm \npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Interface Imports */\nimport { iOVM_L1TokenGateway } from \"../../../iOVM/bridge/tokens/iOVM_L1TokenGateway.sol\";\nimport { Abs_L1TokenGateway } from \"./Abs_L1TokenGateway.sol\";\nimport { iOVM_ERC20 } from \"../../../iOVM/predeploys/iOVM_ERC20.sol\";\n\n/**\n * @title OVM_L1ERC20Gateway\n * @dev The L1 ERC20 Gateway is a contract which stores deposited L1 funds that are in use on L2.\n * It synchronizes a corresponding L2 ERC20 Gateway, informing it of deposits, and listening to it\n * for newly finalized withdrawals.\n *\n * NOTE: This contract extends Abs_L1TokenGateway, which is where we\n * takes care of most of the initialization and the cross-chain logic.\n * If you are looking to implement your own deposit/withdrawal contracts, you\n * may also want to extend the abstract contract in a similar manner.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract OVM_L1ERC20Gateway is Abs_L1TokenGateway {\n\n /********************************\n * External Contract References *\n ********************************/\n \n iOVM_ERC20 public l1ERC20;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _l1ERC20 L1 ERC20 address this contract stores deposits for\n * @param _l2DepositedERC20 L2 Gateway address on the chain being deposited into\n */\n constructor(\n iOVM_ERC20 _l1ERC20,\n address _l2DepositedERC20,\n address _l1messenger \n )\n Abs_L1TokenGateway(\n _l2DepositedERC20,\n _l1messenger\n )\n {\n l1ERC20 = _l1ERC20;\n }\n\n\n /**************\n * Accounting *\n **************/\n\n /**\n * @dev When a deposit is initiated on L1, the L1 Gateway\n * transfers the funds to itself for future withdrawals\n *\n * @param _from L1 address ETH is being deposited from\n * param _to L2 address that the ETH is being deposited to\n * @param _amount Amount of ERC20 to send\n */\n function _handleInitiateDeposit(\n address _from,\n address, // _to,\n uint256 _amount\n )\n internal\n override\n {\n // Hold on to the newly deposited funds\n l1ERC20.transferFrom(\n _from,\n address(this),\n _amount\n );\n }\n\n /**\n * @dev When a withdrawal is finalized on L1, the L1 Gateway\n * transfers the funds to the withdrawer\n *\n * @param _to L1 address that the ERC20 is being withdrawn to\n * @param _amount Amount of ERC20 to send\n */\n function _handleFinalizeWithdrawal(\n address _to,\n uint _amount\n )\n internal\n override\n {\n // Transfer withdrawn funds out to withdrawer\n l1ERC20.transfer(_to, _amount);\n }\n}\n" - }, - "contracts/optimistic-ethereum/OVM/bridge/tokens/Abs_L1TokenGateway.sol": { - "content": "// SPDX-License-Identifier: MIT\n// @unsupported: ovm \npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Interface Imports */\nimport { iOVM_L1TokenGateway } from \"../../../iOVM/bridge/tokens/iOVM_L1TokenGateway.sol\";\nimport { iOVM_L2DepositedToken } from \"../../../iOVM/bridge/tokens/iOVM_L2DepositedToken.sol\";\n\n/* Library Imports */\nimport { OVM_CrossDomainEnabled } from \"../../../libraries/bridge/OVM_CrossDomainEnabled.sol\";\n\n/**\n * @title Abs_L1TokenGateway\n * @dev An L1 Token Gateway is a contract which stores deposited L1 funds that are in use on L2.\n * It synchronizes a corresponding L2 representation of the \"deposited token\", informing it\n * of new deposits and releasing L1 funds when there are newly finalized withdrawals.\n *\n * NOTE: This abstract contract gives all the core functionality of an L1 token gateway, \n * but provides easy hooks in case developers need extensions in child contracts.\n * In many cases, the default OVM_L1ERC20Gateway will suffice.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\nabstract contract Abs_L1TokenGateway is iOVM_L1TokenGateway, OVM_CrossDomainEnabled {\n\n /********************************\n * External Contract References *\n ********************************/\n\n address public l2DepositedToken;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _l2DepositedToken iOVM_L2DepositedToken-compatible address on the chain being deposited into.\n * @param _l1messenger L1 Messenger address being used for cross-chain communications.\n */\n constructor(\n address _l2DepositedToken,\n address _l1messenger \n )\n OVM_CrossDomainEnabled(_l1messenger)\n {\n l2DepositedToken = _l2DepositedToken;\n }\n\n /********************************\n * Overridable Accounting logic *\n ********************************/\n\n // Default gas value which can be overridden if more complex logic runs on L2.\n uint32 public DEFAULT_FINALIZE_DEPOSIT_L2_GAS = 1200000;\n\n /**\n * @dev Core logic to be performed when a withdrawal is finalized on L1.\n * In most cases, this will simply send locked funds to the withdrawer.\n *\n * param _to Address being withdrawn to.\n * param _amount Amount being withdrawn.\n */\n function _handleFinalizeWithdrawal(\n address, // _to,\n uint256 // _amount\n )\n internal\n virtual\n {\n revert(\"Implement me in child contracts\");\n }\n\n /**\n * @dev Core logic to be performed when a deposit is initiated on L1.\n * In most cases, this will simply send locked funds to the withdrawer.\n *\n * param _from Address being deposited from on L1.\n * param _to Address being deposited into on L2.\n * param _amount Amount being deposited.\n */\n function _handleInitiateDeposit(\n address, // _from,\n address, // _to,\n uint256 // _amount\n )\n internal\n virtual\n {\n revert(\"Implement me in child contracts\");\n }\n\n /**\n * @dev Overridable getter for the L2 gas limit, in the case it may be\n * dynamic, and the above public constant does not suffice.\n *\n */\n\n function getFinalizeDepositL2Gas()\n public\n view\n returns(\n uint32\n )\n {\n return DEFAULT_FINALIZE_DEPOSIT_L2_GAS;\n }\n\n /**************\n * Depositing *\n **************/\n\n /**\n * @dev deposit an amount of the ERC20 to the caller's balance on L2\n * @param _amount Amount of the ERC20 to deposit\n */\n function deposit(\n uint _amount\n )\n public\n override\n {\n _initiateDeposit(msg.sender, msg.sender, _amount);\n }\n\n /**\n * @dev deposit an amount of ERC20 to a recipients's balance on L2\n * @param _to L2 address to credit the withdrawal to\n * @param _amount Amount of the ERC20 to deposit\n */\n function depositTo(\n address _to,\n uint _amount\n )\n public\n override\n {\n _initiateDeposit(msg.sender, _to, _amount);\n }\n\n /**\n * @dev Performs the logic for deposits by informing the L2 Deposited Token\n * contract of the deposit and calling a handler to lock the L1 funds. (e.g. transferFrom)\n *\n * @param _from Account to pull the deposit from on L1\n * @param _to Account to give the deposit to on L2\n * @param _amount Amount of the ERC20 to deposit.\n */\n function _initiateDeposit(\n address _from,\n address _to,\n uint _amount\n )\n internal\n {\n // Call our deposit accounting handler implemented by child contracts.\n _handleInitiateDeposit(\n _from,\n _to,\n _amount\n );\n\n // Construct calldata for l2DepositedToken.finalizeDeposit(_to, _amount)\n bytes memory data = abi.encodeWithSelector(\n iOVM_L2DepositedToken.finalizeDeposit.selector,\n _to,\n _amount\n );\n\n // Send calldata into L2\n sendCrossDomainMessage(\n l2DepositedToken,\n data,\n getFinalizeDepositL2Gas()\n );\n\n emit DepositInitiated(_from, _to, _amount);\n }\n\n /*************************\n * Cross-chain Functions *\n *************************/\n\n /**\n * @dev Complete a withdrawal from L2 to L1, and credit funds to the recipient's balance of the \n * L1 ERC20 token. \n * This call will fail if the initialized withdrawal from L2 has not been finalized. \n *\n * @param _to L1 address to credit the withdrawal to\n * @param _amount Amount of the ERC20 to withdraw\n */\n function finalizeWithdrawal(\n address _to,\n uint _amount\n )\n external\n override \n onlyFromCrossDomainAccount(l2DepositedToken)\n {\n // Call our withdrawal accounting handler implemented by child contracts.\n _handleFinalizeWithdrawal(\n _to,\n _amount\n );\n\n emit WithdrawalFinalized(_to, _amount);\n }\n}\n" - }, - "contracts/optimistic-ethereum/iOVM/predeploys/iOVM_ERC20.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/**\n * @title iOVM_ERC20\n */\ninterface iOVM_ERC20 {\n /* This is a slight change to the ERC20 base standard.\n function totalSupply() constant returns (uint256 supply);\n is replaced with:\n uint256 public totalSupply;\n This automatically creates a getter function for the totalSupply.\n This is moved to the base contract since public getter functions are not\n currently recognised as an implementation of the matching abstract\n function by the compiler.\n */\n /// total amount of tokens\n function totalSupply() external view returns (uint256);\n\n /// @param _owner The address from which the balance will be retrieved\n /// @return balance The balance\n function balanceOf(address _owner) external view returns (uint256 balance);\n\n /// @notice send `_value` token to `_to` from `msg.sender`\n /// @param _to The address of the recipient\n /// @param _value The amount of token to be transferred\n /// @return success Whether the transfer was successful or not\n function transfer(address _to, uint256 _value) external returns (bool success);\n\n /// @notice send `_value` token to `_to` from `_from` on the condition it is approved by `_from`\n /// @param _from The address of the sender\n /// @param _to The address of the recipient\n /// @param _value The amount of token to be transferred\n /// @return success Whether the transfer was successful or not\n function transferFrom(address _from, address _to, uint256 _value) external returns (bool success);\n\n /// @notice `msg.sender` approves `_spender` to spend `_value` tokens\n /// @param _spender The address of the account able to transfer the tokens\n /// @param _value The amount of tokens to be approved for transfer\n /// @return success Whether the approval was successful or not\n function approve(address _spender, uint256 _value) external returns (bool success);\n\n /// @param _owner The address of the account owning tokens\n /// @param _spender The address of the account able to transfer the tokens\n /// @return remaining Amount of remaining tokens allowed to spent\n function allowance(address _owner, address _spender) external view returns (uint256 remaining);\n\n // solhint-disable-next-line no-simple-event-func-name\n event Transfer(address indexed _from, address indexed _to, uint256 _value);\n event Approval(address indexed _owner, address indexed _spender, uint256 _value);\n event Mint(address indexed _account, uint256 _amount);\n event Burn(address indexed _account, uint256 _amount);\n}\n" - }, - "contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1MultiMessageRelayer.sol": { - "content": "// SPDX-License-Identifier: MIT\n// @unsupported: ovm\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n/* Interface Imports */\nimport { iOVM_L1CrossDomainMessenger } from \"../../../iOVM/bridge/messaging/iOVM_L1CrossDomainMessenger.sol\";\nimport { iOVM_L1MultiMessageRelayer } from \"../../../iOVM/bridge/messaging/iOVM_L1MultiMessageRelayer.sol\";\n\n/* Contract Imports */\nimport { Lib_AddressResolver } from \"../../../libraries/resolver/Lib_AddressResolver.sol\";\n\n\n/**\n * @title OVM_L1MultiMessageRelayer\n * @dev The L1 Multi-Message Relayer contract is a gas efficiency optimization which enables the \n * relayer to submit multiple messages in a single transaction to be relayed by the L1 Cross Domain\n * Message Sender.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract OVM_L1MultiMessageRelayer is iOVM_L1MultiMessageRelayer, Lib_AddressResolver {\n\n /***************\n * Constructor *\n ***************/\n constructor(\n address _libAddressManager\n ) \n Lib_AddressResolver(_libAddressManager)\n {}\n\n /**********************\n * Function Modifiers *\n **********************/\n\n modifier onlyBatchRelayer() {\n require(\n msg.sender == resolve(\"OVM_L2BatchMessageRelayer\"),\n \"OVM_L1MultiMessageRelayer: Function can only be called by the OVM_L2BatchMessageRelayer\"\n );\n _;\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @notice Forwards multiple cross domain messages to the L1 Cross Domain Messenger for relaying\n * @param _messages An array of L2 to L1 messages\n */\n function batchRelayMessages(L2ToL1Message[] calldata _messages) \n override\n external\n onlyBatchRelayer \n {\n iOVM_L1CrossDomainMessenger messenger = iOVM_L1CrossDomainMessenger(resolve(\"Proxy__OVM_L1CrossDomainMessenger\"));\n for (uint256 i = 0; i < _messages.length; i++) {\n L2ToL1Message memory message = _messages[i];\n messenger.relayMessage(\n message.target,\n message.sender,\n message.message,\n message.messageNonce,\n message.proof\n );\n }\n }\n}\n" - }, - "contracts/optimistic-ethereum/iOVM/bridge/messaging/iOVM_L1MultiMessageRelayer.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Interface Imports */\nimport { iOVM_L1CrossDomainMessenger } from \"../../../iOVM/bridge/messaging/iOVM_L1CrossDomainMessenger.sol\";\ninterface iOVM_L1MultiMessageRelayer {\n\n struct L2ToL1Message {\n address target;\n address sender;\n bytes message;\n uint256 messageNonce;\n iOVM_L1CrossDomainMessenger.L2MessageInclusionProof proof;\n }\n\n function batchRelayMessages(L2ToL1Message[] calldata _messages) external; \n}\n" - }, - "contracts/test-libraries/trie/TestLib_SecureMerkleTrie.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_SecureMerkleTrie } from \"../../optimistic-ethereum/libraries/trie/Lib_SecureMerkleTrie.sol\";\n\n/**\n * @title TestLib_SecureMerkleTrie\n */\ncontract TestLib_SecureMerkleTrie {\n\n function verifyInclusionProof(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n )\n public\n pure\n returns (\n bool\n )\n {\n return Lib_SecureMerkleTrie.verifyInclusionProof(\n _key,\n _value,\n _proof,\n _root\n );\n }\n\n function verifyExclusionProof(\n bytes memory _key,\n bytes memory _proof,\n bytes32 _root\n )\n public\n pure\n returns (\n bool\n )\n {\n return Lib_SecureMerkleTrie.verifyExclusionProof(\n _key,\n _proof,\n _root\n );\n }\n\n function update(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n )\n public\n pure\n returns (\n bytes32\n )\n {\n return Lib_SecureMerkleTrie.update(\n _key,\n _value,\n _proof,\n _root\n );\n }\n\n function get(\n bytes memory _key,\n bytes memory _proof,\n bytes32 _root\n )\n public\n pure\n returns (\n bool,\n bytes memory\n )\n {\n return Lib_SecureMerkleTrie.get(\n _key,\n _proof,\n _root\n );\n }\n\n function getSingleNodeRootHash(\n bytes memory _key,\n bytes memory _value\n )\n public\n pure\n returns (\n bytes32\n )\n {\n return Lib_SecureMerkleTrie.getSingleNodeRootHash(\n _key,\n _value\n );\n }\n}\n" - }, - "contracts/test-libraries/trie/TestLib_MerkleTrie.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Library Imports */\nimport { Lib_MerkleTrie } from \"../../optimistic-ethereum/libraries/trie/Lib_MerkleTrie.sol\";\n\n/**\n * @title TestLib_MerkleTrie\n */\ncontract TestLib_MerkleTrie {\n\n function verifyInclusionProof(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n )\n public\n pure\n returns (\n bool\n )\n {\n return Lib_MerkleTrie.verifyInclusionProof(\n _key,\n _value,\n _proof,\n _root\n );\n }\n\n function verifyExclusionProof(\n bytes memory _key,\n bytes memory _proof,\n bytes32 _root\n )\n public\n pure\n returns (\n bool\n )\n {\n return Lib_MerkleTrie.verifyExclusionProof(\n _key,\n _proof,\n _root\n );\n }\n\n function update(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n )\n public\n pure\n returns (\n bytes32\n )\n {\n return Lib_MerkleTrie.update(\n _key,\n _value,\n _proof,\n _root\n );\n }\n\n function get(\n bytes memory _key,\n bytes memory _proof,\n bytes32 _root\n )\n public\n pure\n returns (\n bool,\n bytes memory\n )\n {\n return Lib_MerkleTrie.get(\n _key,\n _proof,\n _root\n );\n }\n\n function getSingleNodeRootHash(\n bytes memory _key,\n bytes memory _value\n )\n public\n pure\n returns (\n bytes32\n )\n {\n return Lib_MerkleTrie.getSingleNodeRootHash(\n _key,\n _value\n );\n }\n}\n" - }, - "contracts/test-libraries/rlp/TestLib_RLPWriter.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_RLPWriter } from \"../../optimistic-ethereum/libraries/rlp/Lib_RLPWriter.sol\";\nimport { TestERC20 } from \"../../test-helpers/TestERC20.sol\";\n\n/**\n * @title TestLib_RLPWriter\n */\ncontract TestLib_RLPWriter {\n\n function writeBytes(\n bytes memory _in\n )\n public\n pure\n returns (\n bytes memory _out\n )\n {\n return Lib_RLPWriter.writeBytes(_in);\n }\n\n function writeList(\n bytes[] memory _in\n )\n public\n pure\n returns (\n bytes memory _out\n )\n {\n return Lib_RLPWriter.writeList(_in);\n }\n\n function writeString(\n string memory _in\n )\n public\n pure\n returns (\n bytes memory _out\n )\n {\n return Lib_RLPWriter.writeString(_in);\n }\n\n function writeAddress(\n address _in\n )\n public\n pure\n returns (\n bytes memory _out\n )\n {\n return Lib_RLPWriter.writeAddress(_in);\n }\n\n function writeUint(\n uint256 _in\n )\n public\n pure\n returns (\n bytes memory _out\n )\n {\n return Lib_RLPWriter.writeUint(_in);\n }\n\n function writeBool(\n bool _in\n )\n public\n pure\n returns (\n bytes memory _out\n )\n {\n return Lib_RLPWriter.writeBool(_in);\n }\n\n function writeAddressWithTaintedMemory(\n address _in\n )\n public\n returns (\n bytes memory _out\n )\n {\n new TestERC20();\n return Lib_RLPWriter.writeAddress(_in);\n }\n}\n" - }, - "contracts/test-helpers/TestERC20.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n// a test ERC20 token with an open mint function\ncontract TestERC20 {\n using SafeMath for uint;\n\n string public constant name = 'Test';\n string public constant symbol = 'TST';\n uint8 public constant decimals = 18;\n uint256 public totalSupply;\n mapping(address => uint) public balanceOf;\n mapping(address => mapping(address => uint)) public allowance;\n\n event Approval(address indexed owner, address indexed spender, uint256 value);\n event Transfer(address indexed from, address indexed to, uint256 value);\n\n constructor() {}\n\n function mint(address to, uint256 value) public {\n totalSupply = totalSupply.add(value);\n balanceOf[to] = balanceOf[to].add(value);\n emit Transfer(address(0), to, value);\n }\n\n function _approve(address owner, address spender, uint256 value) private {\n allowance[owner][spender] = value;\n emit Approval(owner, spender, value);\n }\n\n function _transfer(address from, address to, uint256 value) private {\n balanceOf[from] = balanceOf[from].sub(value);\n balanceOf[to] = balanceOf[to].add(value);\n emit Transfer(from, to, value);\n }\n\n function approve(address spender, uint256 value) external returns (bool) {\n _approve(msg.sender, spender, value);\n return true;\n }\n\n function transfer(address to, uint256 value) external returns (bool) {\n _transfer(msg.sender, to, value);\n return true;\n }\n\n function transferFrom(address from, address to, uint256 value) external returns (bool) {\n if (allowance[from][msg.sender] != uint(-1)) {\n allowance[from][msg.sender] = allowance[from][msg.sender].sub(value);\n }\n _transfer(from, to, value);\n return true;\n }\n}\n\nlibrary SafeMath {\n function add(uint256 x, uint256 y) internal pure returns (uint256 z) {\n require((z = x + y) >= x, 'ds-math-add-overflow');\n }\n\n function sub(uint256 x, uint256 y) internal pure returns (uint256 z) {\n require((z = x - y) <= x, 'ds-math-sub-underflow');\n }\n\n function mul(uint256 x, uint256 y) internal pure returns (uint256 z) {\n require(y == 0 || (z = x * y) / y == x, 'ds-math-mul-overflow');\n }\n}\n" - }, - "contracts/test-libraries/utils/TestLib_BytesUtils.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_BytesUtils } from \"../../optimistic-ethereum/libraries/utils/Lib_BytesUtils.sol\";\nimport { TestERC20 } from \"../../test-helpers/TestERC20.sol\";\n\n/**\n * @title TestLib_BytesUtils\n */\ncontract TestLib_BytesUtils {\n\n function concat(\n bytes memory _preBytes,\n bytes memory _postBytes\n )\n public\n pure\n returns (bytes memory)\n {\n return abi.encodePacked(\n _preBytes,\n _postBytes\n );\n }\n\n function slice(\n bytes memory _bytes,\n uint256 _start,\n uint256 _length\n )\n public\n pure\n returns (bytes memory)\n {\n return Lib_BytesUtils.slice(\n _bytes,\n _start,\n _length\n );\n }\n\n function toBytes32(\n bytes memory _bytes\n )\n public\n pure\n returns (bytes32)\n {\n return Lib_BytesUtils.toBytes32(\n _bytes\n );\n }\n\n function toUint256(\n bytes memory _bytes\n )\n public\n pure\n returns (uint256)\n {\n return Lib_BytesUtils.toUint256(\n _bytes\n );\n }\n\n function toNibbles(\n bytes memory _bytes\n )\n public\n pure\n returns (bytes memory)\n {\n return Lib_BytesUtils.toNibbles(\n _bytes\n );\n }\n\n function fromNibbles(\n bytes memory _bytes\n )\n public\n pure\n returns (bytes memory)\n {\n return Lib_BytesUtils.fromNibbles(\n _bytes\n );\n }\n\n function equal(\n bytes memory _bytes,\n bytes memory _other\n )\n public\n pure\n returns (bool)\n {\n return Lib_BytesUtils.equal(\n _bytes,\n _other\n );\n }\n\n function sliceWithTaintedMemory(\n bytes memory _bytes,\n uint256 _start,\n uint256 _length\n )\n public\n returns (bytes memory)\n {\n new TestERC20();\n return Lib_BytesUtils.slice(\n _bytes,\n _start,\n _length\n );\n }\n}\n" - }, - "contracts/test-libraries/utils/TestLib_EthUtils.sol": { - "content": "// SPDX-License-Identifier: MIT\n// @unsupported: ovm\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_EthUtils } from \"../../optimistic-ethereum/libraries/utils/Lib_EthUtils.sol\";\n\n/**\n * @title TestLib_EthUtils\n */\ncontract TestLib_EthUtils {\n\n function getCode(\n address _address,\n uint256 _offset,\n uint256 _length\n )\n public\n view\n returns (\n bytes memory _code\n )\n {\n return Lib_EthUtils.getCode(\n _address,\n _offset,\n _length\n );\n }\n\n function getCode(\n address _address\n )\n public\n view\n returns (\n bytes memory _code\n )\n {\n return Lib_EthUtils.getCode(\n _address\n );\n }\n\n function getCodeSize(\n address _address\n )\n public\n view\n returns (\n uint256 _codeSize\n )\n {\n return Lib_EthUtils.getCodeSize(\n _address\n );\n }\n\n function getCodeHash(\n address _address\n )\n public\n view\n returns (\n bytes32 _codeHash\n )\n {\n return Lib_EthUtils.getCodeHash(\n _address\n );\n }\n\n function createContract(\n bytes memory _code\n )\n public\n returns (\n address _created\n )\n {\n return Lib_EthUtils.createContract(\n _code\n );\n }\n\n function getAddressForCREATE(\n address _creator,\n uint256 _nonce\n )\n public\n pure\n returns (\n address _address\n )\n {\n return Lib_EthUtils.getAddressForCREATE(\n _creator,\n _nonce\n );\n }\n\n function getAddressForCREATE2(\n address _creator,\n bytes memory _bytecode,\n bytes32 _salt\n )\n public\n pure\n returns (address _address)\n {\n return Lib_EthUtils.getAddressForCREATE2(\n _creator,\n _bytecode,\n _salt\n );\n }\n}\n" - }, - "contracts/test-libraries/utils/TestLib_Bytes32Utils.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Library Imports */\nimport { Lib_Bytes32Utils } from \"../../optimistic-ethereum/libraries/utils/Lib_Bytes32Utils.sol\";\n\n/**\n * @title TestLib_Byte32Utils\n */\ncontract TestLib_Bytes32Utils {\n\n function toBool(\n bytes32 _in\n )\n public\n pure\n returns (\n bool _out\n )\n {\n return Lib_Bytes32Utils.toBool(_in);\n }\n\n function fromBool(\n bool _in\n )\n public\n pure\n returns (\n bytes32 _out\n )\n {\n return Lib_Bytes32Utils.fromBool(_in);\n }\n\n function toAddress(\n bytes32 _in\n )\n public\n pure\n returns (\n address _out\n )\n {\n return Lib_Bytes32Utils.toAddress(_in);\n }\n\n function fromAddress(\n address _in\n )\n public\n pure\n returns (\n bytes32 _out\n )\n {\n return Lib_Bytes32Utils.fromAddress(_in);\n }\n}\n" - }, - "contracts/test-libraries/rlp/TestLib_RLPReader.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_RLPReader } from \"../../optimistic-ethereum/libraries/rlp/Lib_RLPReader.sol\";\n\n/**\n * @title TestLib_RLPReader\n */\ncontract TestLib_RLPReader {\n\n function readList(\n bytes memory _in\n )\n public\n pure\n returns (\n bytes[] memory\n )\n {\n Lib_RLPReader.RLPItem[] memory decoded = Lib_RLPReader.readList(_in);\n bytes[] memory out = new bytes[](decoded.length);\n for (uint256 i = 0; i < out.length; i++) {\n out[i] = Lib_RLPReader.readRawBytes(decoded[i]);\n }\n return out;\n }\n\n function readString(\n bytes memory _in\n )\n public\n pure\n returns (\n string memory\n )\n {\n return Lib_RLPReader.readString(_in);\n }\n\n function readBytes(\n bytes memory _in\n )\n public\n pure\n returns (\n bytes memory\n )\n {\n return Lib_RLPReader.readBytes(_in);\n }\n\n function readBytes32(\n bytes memory _in\n )\n public\n pure\n returns (\n bytes32\n )\n {\n return Lib_RLPReader.readBytes32(_in);\n }\n\n function readUint256(\n bytes memory _in\n )\n public\n pure\n returns (\n uint256\n )\n {\n return Lib_RLPReader.readUint256(_in);\n }\n\n function readBool(\n bytes memory _in\n )\n public\n pure\n returns (\n bool\n )\n {\n return Lib_RLPReader.readBool(_in);\n }\n\n function readAddress(\n bytes memory _in\n )\n public\n pure\n returns (\n address\n )\n {\n return Lib_RLPReader.readAddress(_in);\n }\n}\n" - }, - "contracts/test-libraries/utils/TestLib_MerkleTree.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_MerkleTree } from \"../../optimistic-ethereum/libraries/utils/Lib_MerkleTree.sol\";\n\n/**\n * @title TestLib_MerkleTree\n */\ncontract TestLib_MerkleTree {\n\n function getMerkleRoot(\n bytes32[] memory _elements\n )\n public\n pure \n returns (\n bytes32\n )\n {\n return Lib_MerkleTree.getMerkleRoot(\n _elements\n );\n }\n\n function verify(\n bytes32 _root,\n bytes32 _leaf,\n uint256 _index,\n bytes32[] memory _siblings,\n uint256 _totalLeaves\n )\n public\n pure\n returns (\n bool\n )\n {\n return Lib_MerkleTree.verify(\n _root,\n _leaf,\n _index,\n _siblings,\n _totalLeaves\n );\n }\n}\n" - }, - "contracts/optimistic-ethereum/mockOVM/verification/mockOVM_BondManager.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Interface Imports */\nimport { iOVM_BondManager } from \"../../iOVM/verification/iOVM_BondManager.sol\";\n\n/* Contract Imports */\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/**\n * @title mockOVM_BondManager\n */\ncontract mockOVM_BondManager is iOVM_BondManager, Lib_AddressResolver {\n constructor(\n address _libAddressManager\n )\n Lib_AddressResolver(_libAddressManager)\n {}\n\n function recordGasSpent(\n bytes32 _preStateRoot,\n bytes32 _txHash,\n address _who,\n uint256 _gasSpent\n )\n override\n public\n {}\n\n function finalize(\n bytes32 _preStateRoot,\n address _publisher,\n uint256 _timestamp\n )\n override\n public\n {}\n\n function deposit()\n override\n public\n {}\n\n function startWithdrawal()\n override\n public\n {}\n\n function finalizeWithdrawal()\n override\n public\n {}\n\n function claim(\n address _who\n )\n override\n public\n {}\n\n function isCollateralized(\n address _who\n )\n override\n public\n view\n returns (\n bool\n )\n {\n // Only authenticate sequencer to submit state root batches.\n return _who == resolve(\"OVM_Proposer\");\n }\n\n function getGasSpent(\n bytes32, // _preStateRoot,\n address // _who\n )\n override\n public\n pure \n returns (\n uint256\n )\n {\n return 0;\n }\n}\n" - }, - "contracts/optimistic-ethereum/OVM/execution/OVM_StateManagerFactory.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Interface Imports */\nimport { iOVM_StateManager } from \"../../iOVM/execution/iOVM_StateManager.sol\";\nimport { iOVM_StateManagerFactory } from \"../../iOVM/execution/iOVM_StateManagerFactory.sol\";\n\n/* Contract Imports */\nimport { OVM_StateManager } from \"./OVM_StateManager.sol\";\n\n/**\n * @title OVM_StateManagerFactory\n * @dev The State Manager Factory is called by a State Transitioner's init code, to create a new\n * State Manager for use in the Fraud Verification process.\n * \n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract OVM_StateManagerFactory is iOVM_StateManagerFactory {\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Creates a new OVM_StateManager\n * @param _owner Owner of the created contract.\n * @return New OVM_StateManager instance.\n */\n function create(\n address _owner\n )\n override\n public\n returns (\n iOVM_StateManager\n )\n {\n return new OVM_StateManager(_owner);\n }\n}\n" - }, - "contracts/optimistic-ethereum/OVM/execution/OVM_StateManager.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/* Interface Imports */\nimport { iOVM_StateManager } from \"../../iOVM/execution/iOVM_StateManager.sol\";\n\n/**\n * @title OVM_StateManager\n * @dev The State Manager contract holds all storage values for contracts in the OVM. It can only be written to by the\n * the Execution Manager and State Transitioner. It runs on L1 during the setup and execution of a fraud proof.\n * The same logic runs on L2, but has been implemented as a precompile in the L2 go-ethereum client\n * (see https://github.com/ethereum-optimism/go-ethereum/blob/master/core/vm/ovm_state_manager.go).\n * \n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract OVM_StateManager is iOVM_StateManager {\n\n /*************\n * Constants *\n *************/\n\n bytes32 constant internal EMPTY_ACCOUNT_STORAGE_ROOT = 0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421;\n bytes32 constant internal EMPTY_ACCOUNT_CODE_HASH = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;\n bytes32 constant internal STORAGE_XOR_VALUE = 0xFEEDFACECAFEBEEFFEEDFACECAFEBEEFFEEDFACECAFEBEEFFEEDFACECAFEBEEF;\n\n\n /*************\n * Variables *\n *************/\n\n address override public owner;\n address override public ovmExecutionManager;\n mapping (address => Lib_OVMCodec.Account) internal accounts;\n mapping (address => mapping (bytes32 => bytes32)) internal contractStorage;\n mapping (address => mapping (bytes32 => bool)) internal verifiedContractStorage;\n mapping (bytes32 => ItemState) internal itemStates;\n uint256 internal totalUncommittedAccounts;\n uint256 internal totalUncommittedContractStorage;\n\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _owner Address of the owner of this contract.\n */\n constructor(\n address _owner\n )\n {\n owner = _owner;\n }\n\n\n /**********************\n * Function Modifiers *\n **********************/\n\n /**\n * Simple authentication, this contract should only be accessible to the owner (which is expected to be the State Transitioner during `PRE_EXECUTION` \n * or the OVM_ExecutionManager during transaction execution.\n */\n modifier authenticated() {\n // owner is the State Transitioner\n require(\n msg.sender == owner || msg.sender == ovmExecutionManager,\n \"Function can only be called by authenticated addresses\"\n );\n _;\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Checks whether a given address is allowed to modify this contract.\n * @param _address Address to check.\n * @return Whether or not the address can modify this contract.\n */\n function isAuthenticated(\n address _address\n )\n override\n public\n view\n returns (\n bool\n )\n {\n return (_address == owner || _address == ovmExecutionManager);\n }\n\n /**\n * Sets the address of the OVM_ExecutionManager.\n * @param _ovmExecutionManager Address of the OVM_ExecutionManager.\n */\n function setExecutionManager(\n address _ovmExecutionManager\n )\n override\n public\n authenticated\n {\n ovmExecutionManager = _ovmExecutionManager;\n }\n\n /**\n * Inserts an account into the state.\n * @param _address Address of the account to insert.\n * @param _account Account to insert for the given address.\n */\n function putAccount(\n address _address,\n Lib_OVMCodec.Account memory _account\n )\n override\n public\n authenticated\n {\n accounts[_address] = _account;\n }\n\n /**\n * Marks an account as empty.\n * @param _address Address of the account to mark.\n */\n function putEmptyAccount(\n address _address\n )\n override\n public\n authenticated\n {\n Lib_OVMCodec.Account storage account = accounts[_address];\n account.storageRoot = EMPTY_ACCOUNT_STORAGE_ROOT;\n account.codeHash = EMPTY_ACCOUNT_CODE_HASH;\n }\n\n /**\n * Retrieves an account from the state.\n * @param _address Address of the account to retrieve.\n * @return Account for the given address.\n */\n function getAccount(\n address _address\n )\n override\n public\n view\n returns (\n Lib_OVMCodec.Account memory\n )\n {\n return accounts[_address];\n }\n\n /**\n * Checks whether the state has a given account.\n * @param _address Address of the account to check.\n * @return Whether or not the state has the account.\n */\n function hasAccount(\n address _address\n )\n override\n public\n view\n returns (\n bool\n )\n {\n return accounts[_address].codeHash != bytes32(0);\n }\n\n /**\n * Checks whether the state has a given known empty account.\n * @param _address Address of the account to check.\n * @return Whether or not the state has the empty account.\n */\n function hasEmptyAccount(\n address _address\n )\n override\n public\n view\n returns (\n bool\n )\n {\n return (\n accounts[_address].codeHash == EMPTY_ACCOUNT_CODE_HASH\n && accounts[_address].nonce == 0\n );\n }\n\n /**\n * Sets the nonce of an account.\n * @param _address Address of the account to modify.\n * @param _nonce New account nonce.\n */\n function setAccountNonce(\n address _address,\n uint256 _nonce\n )\n override\n public\n authenticated\n {\n accounts[_address].nonce = _nonce;\n }\n\n /**\n * Gets the nonce of an account.\n * @param _address Address of the account to access.\n * @return Nonce of the account.\n */\n function getAccountNonce(\n address _address\n )\n override\n public\n view\n returns (\n uint256\n )\n {\n return accounts[_address].nonce;\n }\n\n /**\n * Retrieves the Ethereum address of an account.\n * @param _address Address of the account to access.\n * @return Corresponding Ethereum address.\n */\n function getAccountEthAddress(\n address _address\n )\n override\n public\n view\n returns (\n address\n )\n {\n return accounts[_address].ethAddress;\n }\n\n /**\n * Retrieves the storage root of an account.\n * @param _address Address of the account to access.\n * @return Corresponding storage root.\n */\n function getAccountStorageRoot(\n address _address\n )\n override\n public\n view\n returns (\n bytes32\n )\n {\n return accounts[_address].storageRoot;\n }\n\n /**\n * Initializes a pending account (during CREATE or CREATE2) with the default values.\n * @param _address Address of the account to initialize.\n */\n function initPendingAccount(\n address _address\n )\n override\n public\n authenticated\n {\n Lib_OVMCodec.Account storage account = accounts[_address];\n account.nonce = 1;\n account.storageRoot = EMPTY_ACCOUNT_STORAGE_ROOT;\n account.codeHash = EMPTY_ACCOUNT_CODE_HASH;\n account.isFresh = true;\n }\n\n /**\n * Finalizes the creation of a pending account (during CREATE or CREATE2).\n * @param _address Address of the account to finalize.\n * @param _ethAddress Address of the account's associated contract on Ethereum.\n * @param _codeHash Hash of the account's code.\n */\n function commitPendingAccount(\n address _address,\n address _ethAddress,\n bytes32 _codeHash\n )\n override\n public\n authenticated\n {\n Lib_OVMCodec.Account storage account = accounts[_address];\n account.ethAddress = _ethAddress;\n account.codeHash = _codeHash;\n }\n\n /**\n * Checks whether an account has already been retrieved, and marks it as retrieved if not.\n * @param _address Address of the account to check.\n * @return Whether or not the account was already loaded.\n */\n function testAndSetAccountLoaded(\n address _address\n )\n override\n public\n authenticated\n returns (\n bool\n )\n {\n return _testAndSetItemState(\n _getItemHash(_address),\n ItemState.ITEM_LOADED\n );\n }\n\n /**\n * Checks whether an account has already been modified, and marks it as modified if not.\n * @param _address Address of the account to check.\n * @return Whether or not the account was already modified.\n */\n function testAndSetAccountChanged(\n address _address\n )\n override\n public\n authenticated\n returns (\n bool\n )\n {\n return _testAndSetItemState(\n _getItemHash(_address),\n ItemState.ITEM_CHANGED\n );\n }\n\n /**\n * Attempts to mark an account as committed.\n * @param _address Address of the account to commit.\n * @return Whether or not the account was committed.\n */\n function commitAccount(\n address _address\n )\n override\n public\n authenticated\n returns (\n bool\n )\n {\n bytes32 item = _getItemHash(_address);\n if (itemStates[item] != ItemState.ITEM_CHANGED) {\n return false;\n }\n\n itemStates[item] = ItemState.ITEM_COMMITTED;\n totalUncommittedAccounts -= 1;\n\n return true;\n }\n\n /**\n * Increments the total number of uncommitted accounts.\n */\n function incrementTotalUncommittedAccounts()\n override\n public\n authenticated\n {\n totalUncommittedAccounts += 1;\n }\n\n /**\n * Gets the total number of uncommitted accounts.\n * @return Total uncommitted accounts.\n */\n function getTotalUncommittedAccounts()\n override\n public\n view\n returns (\n uint256\n )\n {\n return totalUncommittedAccounts;\n }\n\n /**\n * Checks whether a given account was changed during execution.\n * @param _address Address to check.\n * @return Whether or not the account was changed.\n */\n function wasAccountChanged(\n address _address\n )\n override\n public\n view\n returns (\n bool\n )\n {\n bytes32 item = _getItemHash(_address);\n return itemStates[item] >= ItemState.ITEM_CHANGED;\n }\n\n /**\n * Checks whether a given account was committed after execution.\n * @param _address Address to check.\n * @return Whether or not the account was committed.\n */\n function wasAccountCommitted(\n address _address\n )\n override\n public\n view\n returns (\n bool\n )\n {\n bytes32 item = _getItemHash(_address);\n return itemStates[item] >= ItemState.ITEM_COMMITTED;\n }\n\n\n /************************************\n * Public Functions: Storage Access *\n ************************************/\n\n /**\n * Changes a contract storage slot value.\n * @param _contract Address of the contract to modify.\n * @param _key 32 byte storage slot key.\n * @param _value 32 byte storage slot value.\n */\n function putContractStorage(\n address _contract,\n bytes32 _key,\n bytes32 _value\n )\n override\n public\n authenticated\n {\n // A hilarious optimization. `SSTORE`ing a value of `bytes32(0)` is common enough that it's\n // worth populating this with a non-zero value in advance (during the fraud proof\n // initialization phase) to cut the execution-time cost down to 5000 gas.\n contractStorage[_contract][_key] = _value ^ STORAGE_XOR_VALUE;\n\n // Only used when initially populating the contract storage. OVM_ExecutionManager will\n // perform a `hasContractStorage` INVALID_STATE_ACCESS check before putting any contract\n // storage because writing to zero when the actual value is nonzero causes a gas\n // discrepancy. Could be moved into a new `putVerifiedContractStorage` function, or\n // something along those lines.\n if (verifiedContractStorage[_contract][_key] == false) {\n verifiedContractStorage[_contract][_key] = true;\n }\n }\n\n /**\n * Retrieves a contract storage slot value.\n * @param _contract Address of the contract to access.\n * @param _key 32 byte storage slot key.\n * @return 32 byte storage slot value.\n */\n function getContractStorage(\n address _contract,\n bytes32 _key\n )\n override\n public\n view\n returns (\n bytes32\n )\n {\n // Storage XOR system doesn't work for newly created contracts that haven't set this\n // storage slot value yet.\n if (\n verifiedContractStorage[_contract][_key] == false\n && accounts[_contract].isFresh\n ) {\n return bytes32(0);\n }\n\n // See `putContractStorage` for more information about the XOR here.\n return contractStorage[_contract][_key] ^ STORAGE_XOR_VALUE;\n }\n\n /**\n * Checks whether a contract storage slot exists in the state.\n * @param _contract Address of the contract to access.\n * @param _key 32 byte storage slot key.\n * @return Whether or not the key was set in the state.\n */\n function hasContractStorage(\n address _contract,\n bytes32 _key\n )\n override\n public\n view\n returns (\n bool\n )\n {\n return verifiedContractStorage[_contract][_key] || accounts[_contract].isFresh;\n }\n\n /**\n * Checks whether a storage slot has already been retrieved, and marks it as retrieved if not.\n * @param _contract Address of the contract to check.\n * @param _key 32 byte storage slot key.\n * @return Whether or not the slot was already loaded.\n */\n function testAndSetContractStorageLoaded(\n address _contract,\n bytes32 _key\n )\n override\n public\n authenticated\n returns (\n bool\n )\n {\n return _testAndSetItemState(\n _getItemHash(_contract, _key),\n ItemState.ITEM_LOADED\n );\n }\n\n /**\n * Checks whether a storage slot has already been modified, and marks it as modified if not.\n * @param _contract Address of the contract to check.\n * @param _key 32 byte storage slot key.\n * @return Whether or not the slot was already modified.\n */\n function testAndSetContractStorageChanged(\n address _contract,\n bytes32 _key\n )\n override\n public\n authenticated\n returns (\n bool\n )\n {\n return _testAndSetItemState(\n _getItemHash(_contract, _key),\n ItemState.ITEM_CHANGED\n );\n }\n\n /**\n * Attempts to mark a storage slot as committed.\n * @param _contract Address of the account to commit.\n * @param _key 32 byte slot key to commit.\n * @return Whether or not the slot was committed.\n */\n function commitContractStorage(\n address _contract,\n bytes32 _key\n )\n override\n public\n authenticated\n returns (\n bool\n )\n {\n bytes32 item = _getItemHash(_contract, _key);\n if (itemStates[item] != ItemState.ITEM_CHANGED) {\n return false;\n }\n\n itemStates[item] = ItemState.ITEM_COMMITTED;\n totalUncommittedContractStorage -= 1;\n\n return true;\n }\n\n /**\n * Increments the total number of uncommitted storage slots.\n */\n function incrementTotalUncommittedContractStorage()\n override\n public\n authenticated\n {\n totalUncommittedContractStorage += 1;\n }\n\n /**\n * Gets the total number of uncommitted storage slots.\n * @return Total uncommitted storage slots.\n */\n function getTotalUncommittedContractStorage()\n override\n public\n view\n returns (\n uint256\n )\n {\n return totalUncommittedContractStorage;\n }\n\n /**\n * Checks whether a given storage slot was changed during execution.\n * @param _contract Address to check.\n * @param _key Key of the storage slot to check.\n * @return Whether or not the storage slot was changed.\n */\n function wasContractStorageChanged(\n address _contract,\n bytes32 _key\n )\n override\n public\n view\n returns (\n bool\n )\n {\n bytes32 item = _getItemHash(_contract, _key);\n return itemStates[item] >= ItemState.ITEM_CHANGED;\n }\n\n /**\n * Checks whether a given storage slot was committed after execution.\n * @param _contract Address to check.\n * @param _key Key of the storage slot to check.\n * @return Whether or not the storage slot was committed.\n */\n function wasContractStorageCommitted(\n address _contract,\n bytes32 _key\n )\n override\n public\n view\n returns (\n bool\n )\n {\n bytes32 item = _getItemHash(_contract, _key);\n return itemStates[item] >= ItemState.ITEM_COMMITTED;\n }\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Generates a unique hash for an address.\n * @param _address Address to generate a hash for.\n * @return Unique hash for the given address.\n */\n function _getItemHash(\n address _address\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n return keccak256(abi.encodePacked(_address));\n }\n\n /**\n * Generates a unique hash for an address/key pair.\n * @param _contract Address to generate a hash for.\n * @param _key Key to generate a hash for.\n * @return Unique hash for the given pair.\n */\n function _getItemHash(\n address _contract,\n bytes32 _key\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n return keccak256(abi.encodePacked(\n _contract,\n _key\n ));\n }\n\n /**\n * Checks whether an item is in a particular state (ITEM_LOADED or ITEM_CHANGED) and sets the\n * item to the provided state if not.\n * @param _item 32 byte item ID to check.\n * @param _minItemState Minimum state that must be satisfied by the item.\n * @return Whether or not the item was already in the state.\n */\n function _testAndSetItemState(\n bytes32 _item,\n ItemState _minItemState\n )\n internal\n returns (\n bool\n )\n {\n bool wasItemState = itemStates[_item] >= _minItemState;\n\n if (wasItemState == false) {\n itemStates[_item] = _minItemState;\n }\n\n return wasItemState;\n }\n}\n" - }, - "contracts/optimistic-ethereum/mockOVM/accounts/mockOVM_ECDSAContractAccount.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Interface Imports */\nimport { iOVM_ECDSAContractAccount } from \"../../iOVM/accounts/iOVM_ECDSAContractAccount.sol\";\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_ECDSAUtils } from \"../../libraries/utils/Lib_ECDSAUtils.sol\";\nimport { Lib_SafeExecutionManagerWrapper } from \"../../libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\";\n\n/**\n * @title mockOVM_ECDSAContractAccount\n */\ncontract mockOVM_ECDSAContractAccount is iOVM_ECDSAContractAccount {\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Executes a signed transaction.\n * @param _transaction Signed EOA transaction.\n * @param _signatureType Hashing scheme used for the transaction (e.g., ETH signed message).\n * param _v Signature `v` parameter.\n * param _r Signature `r` parameter.\n * param _s Signature `s` parameter.\n * @return _success Whether or not the call returned (rather than reverted).\n * @return _returndata Data returned by the call.\n */\n function execute(\n bytes memory _transaction,\n Lib_OVMCodec.EOASignatureType _signatureType,\n uint8, // _v,\n bytes32, // _r,\n bytes32 // _s\n )\n override\n public\n returns (\n bool _success,\n bytes memory _returndata\n )\n {\n bool isEthSign = _signatureType == Lib_OVMCodec.EOASignatureType.ETH_SIGNED_MESSAGE;\n Lib_OVMCodec.EIP155Transaction memory decodedTx = Lib_OVMCodec.decodeEIP155Transaction(_transaction, isEthSign);\n\n // Need to make sure that the transaction nonce is right.\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(\n decodedTx.nonce == Lib_SafeExecutionManagerWrapper.safeGETNONCE(),\n \"Transaction nonce does not match the expected nonce.\"\n );\n\n // Contract creations are signalled by sending a transaction to the zero address.\n if (decodedTx.to == address(0)) {\n (address created, ) = Lib_SafeExecutionManagerWrapper.safeCREATE(\n decodedTx.gasLimit,\n decodedTx.data\n );\n\n // If the created address is the ZERO_ADDRESS then we know the deployment failed, though not why\n return (created != address(0), abi.encode(created));\n } else {\n // We only want to bump the nonce for `ovmCALL` because `ovmCREATE` automatically bumps\n // the nonce of the calling account. Normally an EOA would bump the nonce for both\n // cases, but since this is a contract we'd end up bumping the nonce twice.\n Lib_SafeExecutionManagerWrapper.safeINCREMENTNONCE();\n\n return Lib_SafeExecutionManagerWrapper.safeCALL(\n decodedTx.gasLimit,\n decodedTx.to,\n decodedTx.data\n );\n }\n }\n\n function qall(\n uint256 _gasLimit,\n address _to,\n bytes memory _data\n )\n public\n returns (\n bool _success,\n bytes memory _returndata\n )\n {\n return Lib_SafeExecutionManagerWrapper.safeCALL(\n _gasLimit,\n _to,\n _data\n );\n }\n}\n" - }, - "contracts/optimistic-ethereum/OVM/predeploys/OVM_ProxySequencerEntrypoint.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Library Imports */\nimport { Lib_SafeExecutionManagerWrapper } from \"../../libraries/wrappers/Lib_SafeExecutionManagerWrapper.sol\";\n\n/**\n * @title OVM_ProxySequencerEntrypoint \n * @dev The Proxy Sequencer Entrypoint is a predeployed proxy to the implementation of the \n * Sequencer Entrypoint. This will enable the Optimism team to upgrade the Sequencer Entrypoint \n * contract.\n * \n * Compiler used: solc\n * Runtime target: OVM\n */\ncontract OVM_ProxySequencerEntrypoint {\n\n /*********************\n * Fallback Function *\n *********************/\n\n fallback()\n external\n {\n Lib_SafeExecutionManagerWrapper.safeDELEGATECALL(\n gasleft(),\n _getImplementation(),\n msg.data\n );\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n function init(\n address _implementation,\n address _owner\n )\n external\n {\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(\n _getOwner() == address(0),\n \"ProxySequencerEntrypoint has already been inited\"\n );\n _setOwner(_owner);\n _setImplementation(_implementation);\n }\n\n function upgrade(\n address _implementation\n )\n external\n {\n Lib_SafeExecutionManagerWrapper.safeREQUIRE(\n _getOwner() == Lib_SafeExecutionManagerWrapper.safeCALLER(),\n \"Only owner can upgrade the Entrypoint\"\n );\n\n _setImplementation(_implementation);\n }\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n function _setImplementation(\n address _implementation\n )\n internal\n {\n Lib_SafeExecutionManagerWrapper.safeSSTORE(\n bytes32(uint256(0)),\n bytes32(uint256(uint160(_implementation)))\n );\n }\n\n function _getImplementation()\n internal\n returns (\n address _implementation\n )\n {\n return address(uint160(uint256(\n Lib_SafeExecutionManagerWrapper.safeSLOAD(\n bytes32(uint256(0))\n )\n )));\n }\n\n function _setOwner(\n address _owner\n )\n internal\n {\n Lib_SafeExecutionManagerWrapper.safeSSTORE(\n bytes32(uint256(1)),\n bytes32(uint256(uint160(_owner)))\n );\n }\n\n function _getOwner()\n internal\n returns (\n address _owner\n )\n {\n return address(uint160(uint256(\n Lib_SafeExecutionManagerWrapper.safeSLOAD(\n bytes32(uint256(1))\n )\n )));\n }\n}\n" - }, - "contracts/optimistic-ethereum/OVM/execution/OVM_SafetyChecker.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Interface Imports */\nimport { iOVM_SafetyChecker } from \"../../iOVM/execution/iOVM_SafetyChecker.sol\";\n\n/**\n * @title OVM_SafetyChecker\n * @dev The Safety Checker verifies that contracts deployed on L2 do not contain any\n * \"unsafe\" operations. An operation is considered unsafe if it would access state variables which\n * are specific to the environment (ie. L1 or L2) in which it is executed, as this could be used\n * to \"escape the sandbox\" of the OVM, resulting in non-deterministic fraud proofs. \n * That is, an attacker would be able to \"prove fraud\" on an honestly applied transaction.\n * Note that a \"safe\" contract requires opcodes to appear in a particular pattern;\n * omission of \"unsafe\" opcodes is necessary, but not sufficient.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract OVM_SafetyChecker is iOVM_SafetyChecker {\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Returns whether or not all of the provided bytecode is safe.\n * @param _bytecode The bytecode to safety check.\n * @return `true` if the bytecode is safe, `false` otherwise.\n */\n function isBytecodeSafe(\n bytes memory _bytecode\n )\n override\n external\n pure\n returns (\n bool\n )\n {\n // autogenerated by gen_safety_checker_constants.py\n // number of bytes to skip for each opcode\n uint256[8] memory opcodeSkippableBytes = [\n uint256(0x0001010101010101010101010000000001010101010101010101010101010000),\n uint256(0x0100000000000000000000000000000000000000010101010101000000010100),\n uint256(0x0000000000000000000000000000000001010101000000010101010100000000),\n uint256(0x0203040500000000000000000000000000000000000000000000000000000000),\n uint256(0x0101010101010101010101010101010101010101010101010101010101010101),\n uint256(0x0101010101000000000000000000000000000000000000000000000000000000),\n uint256(0x0000000000000000000000000000000000000000000000000000000000000000),\n uint256(0x0000000000000000000000000000000000000000000000000000000000000000)\n ];\n // Mask to gate opcode specific cases\n uint256 opcodeGateMask = ~uint256(0xffffffffffffffffffffffe000000000fffffffff070ffff9c0ffffec000f001);\n // Halting opcodes\n uint256 opcodeHaltingMask = ~uint256(0x4008000000000000000000000000000000000000004000000000000000000001);\n // PUSH opcodes\n uint256 opcodePushMask = ~uint256(0xffffffff000000000000000000000000);\n\n uint256 codeLength;\n uint256 _pc;\n assembly {\n _pc := add(_bytecode, 0x20)\n }\n codeLength = _pc + _bytecode.length;\n do {\n // current opcode: 0x00...0xff\n uint256 opNum;\n\n // inline assembly removes the extra add + bounds check\n assembly {\n let word := mload(_pc) //load the next 32 bytes at pc into word\n\n // Look up number of bytes to skip from opcodeSkippableBytes and then update indexInWord\n // E.g. the 02030405 in opcodeSkippableBytes is the number of bytes to skip for PUSH1->4\n // We repeat this 6 times, thus we can only skip bytes for up to PUSH4 ((1+4) * 6 = 30 < 32).\n // If we see an opcode that is listed as 0 skippable bytes e.g. PUSH5,\n // then we will get stuck on that indexInWord and then opNum will be set to the PUSH5 opcode.\n let indexInWord := byte(0, mload(add(opcodeSkippableBytes, byte(0, word))))\n indexInWord := add(indexInWord, byte(0, mload(add(opcodeSkippableBytes, byte(indexInWord, word)))))\n indexInWord := add(indexInWord, byte(0, mload(add(opcodeSkippableBytes, byte(indexInWord, word)))))\n indexInWord := add(indexInWord, byte(0, mload(add(opcodeSkippableBytes, byte(indexInWord, word)))))\n indexInWord := add(indexInWord, byte(0, mload(add(opcodeSkippableBytes, byte(indexInWord, word)))))\n indexInWord := add(indexInWord, byte(0, mload(add(opcodeSkippableBytes, byte(indexInWord, word)))))\n _pc := add(_pc, indexInWord)\n\n opNum := byte(indexInWord, word)\n }\n\n // + push opcodes\n // + stop opcodes [STOP(0x00),JUMP(0x56),RETURN(0xf3),INVALID(0xfe)]\n // + caller opcode CALLER(0x33)\n // + blacklisted opcodes\n uint256 opBit = 1 << opNum;\n if (opBit & opcodeGateMask == 0) {\n if (opBit & opcodePushMask == 0) {\n // all pushes are valid opcodes\n // subsequent bytes are not opcodes. Skip them.\n _pc += (opNum - 0x5e); // PUSH1 is 0x60, so opNum-0x5f = PUSHed bytes and we +1 to\n // skip the _pc++; line below in order to save gas ((-0x5f + 1) = -0x5e)\n continue;\n } else if (opBit & opcodeHaltingMask == 0) {\n // STOP or JUMP or RETURN or INVALID (Note: REVERT is blacklisted, so not included here)\n // We are now inside unreachable code until we hit a JUMPDEST!\n do {\n _pc++;\n assembly {\n opNum := byte(0, mload(_pc))\n }\n // encountered a JUMPDEST\n if (opNum == 0x5b) break;\n // skip PUSHed bytes\n if ((1 << opNum) & opcodePushMask == 0) _pc += (opNum - 0x5f); // opNum-0x5f = PUSHed bytes (PUSH1 is 0x60)\n } while (_pc < codeLength);\n // opNum is 0x5b, so we don't continue here since the pc++ is fine\n } else if (opNum == 0x33) { // Caller opcode\n uint256 firstOps; // next 32 bytes of bytecode\n uint256 secondOps; // following 32 bytes of bytecode\n\n assembly {\n firstOps := mload(_pc)\n // 37 bytes total, 5 left over --> 32 - 5 bytes = 27 bytes = 216 bits\n secondOps := shr(216, mload(add(_pc, 0x20)))\n }\n\n // Call identity precompile\n // CALLER POP PUSH1 0x00 PUSH1 0x04 GAS CALL\n // 32 - 8 bytes = 24 bytes = 192\n if ((firstOps >> 192) == 0x3350600060045af1) {\n _pc += 8;\n // Call EM and abort execution if instructed\n // CALLER PUSH1 0x00 SWAP1 GAS CALL PC PUSH1 0x0E ADD JUMPI RETURNDATASIZE PUSH1 0x00 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x00 REVERT JUMPDEST RETURNDATASIZE PUSH1 0x01 EQ ISZERO PC PUSH1 0x0a ADD JUMPI PUSH1 0x01 PUSH1 0x00 RETURN JUMPDEST \n } else if (firstOps == 0x336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a015760 && secondOps == 0x016000f35b) {\n _pc += 37;\n } else {\n return false;\n }\n continue;\n } else {\n // encountered a non-whitelisted opcode!\n return false;\n }\n }\n _pc++;\n } while (_pc < codeLength);\n return true;\n }\n}\n" - } - }, - "settings": { - "optimizer": { - "enabled": true, - "runs": 200 - }, - "metadata": { - "bytecodeHash": "none", - "useLiteralContent": true - }, - "outputSelection": { - "*": { - "*": [ - "storageLayout", - "abi", - "evm.bytecode", - "evm.deployedBytecode", - "evm.methodIdentifiers", - "metadata", - "devdoc", - "userdoc", - "evm.gasEstimates" - ], - "": [ - "ast" - ] - } - } - } -} \ No newline at end of file diff --git a/packages/contracts/deployments/kovan-v3/solcInputs/5ee8e508e2c54cb5ac6783b4855b1558.json b/packages/contracts/deployments/kovan/solcInputs/5ee8e508e2c54cb5ac6783b4855b1558.json similarity index 100% rename from packages/contracts/deployments/kovan-v3/solcInputs/5ee8e508e2c54cb5ac6783b4855b1558.json rename to packages/contracts/deployments/kovan/solcInputs/5ee8e508e2c54cb5ac6783b4855b1558.json From 5ccf42e247774595da5eb1a6b926a6fce9fa92b8 Mon Sep 17 00:00:00 2001 From: Annie Ke Date: Wed, 12 May 2021 12:08:44 -0700 Subject: [PATCH 72/81] chore: update READMEs with new env vars (#842) * chore: update READMEs with new env vars * extra context in dtl readme * more context --- packages/batch-submitter/README.md | 4 +++ packages/data-transport-layer/README.md | 38 ++++++++++++++----------- 2 files changed, 25 insertions(+), 17 deletions(-) diff --git a/packages/batch-submitter/README.md b/packages/batch-submitter/README.md index 900b3b70f65d5..0868486a64aee 100644 --- a/packages/batch-submitter/README.md +++ b/packages/batch-submitter/README.md @@ -38,3 +38,7 @@ You may test a submission locally against a local Hardhat fork. 3. Also check `L2_NODE_WEB3_URL` is correctly set and has transactions to submit. 3. Run `yarn build` to build your changes. 4. Start Batch Submitter with `yarn start`. It will automatically start submitting pending transactions from L2. + +## Observability in production + +When deploying Batch Submitter to production / a live ETH network, populate the environment variables `NODE_ENV` (`development`, `production`, or `test`) and `ETH_NETWORK_NAME` (`mainnet`, `kovan`, `goerli`). This enables Batch Submitter to capture more context in logs and metrics, and initializes [Sentry](https://docs.sentry.io/platforms/node/) to track errors. diff --git a/packages/data-transport-layer/README.md b/packages/data-transport-layer/README.md index 31d18ec008d61..d609cbaef8fea 100644 --- a/packages/data-transport-layer/README.md +++ b/packages/data-transport-layer/README.md @@ -43,23 +43,27 @@ We're using `dotenv` for our configuration. Copy `.env.example` into `.env`, feel free to modify it. Here's the list of environment variables you can change: -| Variable | Default | Description | -| ------------------------------------------------------- | --------- | ------------ | -| DATA_TRANSPORT_LAYER__DB_PATH | ./db | Path to the database for this service. | -| DATA_TRANSPORT_LAYER__ADDRESS_MANAGER | - | Address of the AddressManager contract on L1. See [regenesis](https://github.com/ethereum-optimism/regenesis) repo to find this address for mainnet or kovan. | -| DATA_TRANSPORT_LAYER__POLLING_INTERVAL | 5000 | Period of time between execution loops. | -| DATA_TRANSPORT_LAYER__DANGEROUSLY_CATCH_ALL_ERRORS | false | If true, will catch all errors without throwing. | -| DATA_TRANSPORT_LAYER__CONFIRMATIONS | 12 | Number of confirmations to wait before accepting transactions as "canonical". | -| DATA_TRANSPORT_LAYER__SERVER_HOSTNAME | localhost | Host to run the API on. | -| DATA_TRANSPORT_LAYER__SERVER_PORT | 7878 | Port to run the API on. | -| DATA_TRANSPORT_LAYER__SYNC_FROM_L1 | true | Whether or not to sync from L1. | -| DATA_TRANSPORT_LAYER__L1_RPC_ENDPOINT | - | RPC endpoint for an L1 node. | -| DATA_TRANSPORT_LAYER__LOGS_PER_POLLING_INTERVAL | 2000 | Logs to sync per polling interval. | -| DATA_TRANSPORT_LAYER__SYNC_FROM_L2 | false | Whether or not to sync from L2. | -| DATA_TRANSPORT_LAYER__L2_RPC_ENDPOINT | - | RPC endpoint for an L2 node. | -| DATA_TRANSPORT_LAYER__TRANSACTIONS_PER_POLLING_INTERVAL | 1000 | Number of L2 transactions to query per polling interval. | -| DATA_TRANSPORT_LAYER__L2_CHAIN_ID | - | L2 chain ID. | -| DATA_TRANSPORT_LAYER__LEGACY_SEQUENCER_COMPATIBILITY | false | Whether or not to enable "legacy" sequencer sync (without the custom `eth_getBlockRange` endpoint) | +| Variable | Default | Description | +| ------------------------------------------------------- | ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| DATA_TRANSPORT_LAYER__DB_PATH | ./db | Path to the database for this service. | +| DATA_TRANSPORT_LAYER__ADDRESS_MANAGER | - | Address of the AddressManager contract on L1. See [regenesis](https://github.com/ethereum-optimism/regenesis) repo to find this address for mainnet or kovan. | +| DATA_TRANSPORT_LAYER__POLLING_INTERVAL | 5000 | Period of time between execution loops. | +| DATA_TRANSPORT_LAYER__DANGEROUSLY_CATCH_ALL_ERRORS | false | If true, will catch all errors without throwing. | +| DATA_TRANSPORT_LAYER__CONFIRMATIONS | 12 | Number of confirmations to wait before accepting transactions as "canonical". | +| DATA_TRANSPORT_LAYER__SERVER_HOSTNAME | localhost | Host to run the API on. | +| DATA_TRANSPORT_LAYER__SERVER_PORT | 7878 | Port to run the API on. | +| DATA_TRANSPORT_LAYER__SYNC_FROM_L1 | true | Whether or not to sync from L1. | +| DATA_TRANSPORT_LAYER__L1_RPC_ENDPOINT | - | RPC endpoint for an L1 node. | +| DATA_TRANSPORT_LAYER__LOGS_PER_POLLING_INTERVAL | 2000 | Logs to sync per polling interval. | +| DATA_TRANSPORT_LAYER__SYNC_FROM_L2 | false | Whether or not to sync from L2. | +| DATA_TRANSPORT_LAYER__L2_RPC_ENDPOINT | - | RPC endpoint for an L2 node. | +| DATA_TRANSPORT_LAYER__TRANSACTIONS_PER_POLLING_INTERVAL | 1000 | Number of L2 transactions to query per polling interval. | +| DATA_TRANSPORT_LAYER__L2_CHAIN_ID | - | L2 chain ID. | +| DATA_TRANSPORT_LAYER__LEGACY_SEQUENCER_COMPATIBILITY | false | Whether or not to enable "legacy" sequencer sync (without the custom `eth_getBlockRange` endpoint) | +| DATA_TRANSPORT_LAYER__NODE_ENV | development | Environment the service is running in: production, development, or test. | +| DATA_TRANSPORT_LAYER__ETH_NETWORK_NAME | - | L1 Ethereum network the service is deployed to: mainnet, kovan, goerli. | + +To enable proper error tracking via Sentry on deployed instances, make sure `NODE_ENV` and `ETH_NETWORK_NAME` are set in addition to [`SENTRY_DSN`](https://docs.sentry.io/platforms/node/). ## HTTP API From de5e3dca0ebcc1d7bd074e9dcac6db1dfc8675da Mon Sep 17 00:00:00 2001 From: Mark Tyneway Date: Wed, 12 May 2021 13:00:53 -0700 Subject: [PATCH 73/81] l2 geth: start script mainnetv3 (#852) * l2geth: update start script for mainnet v3 * chore: add changeset --- .changeset/thin-rockets-clean.md | 5 +++++ l2geth/scripts/start.sh | 17 ++++++++++++----- 2 files changed, 17 insertions(+), 5 deletions(-) create mode 100644 .changeset/thin-rockets-clean.md diff --git a/.changeset/thin-rockets-clean.md b/.changeset/thin-rockets-clean.md new file mode 100644 index 0000000000000..67c3a28fcefff --- /dev/null +++ b/.changeset/thin-rockets-clean.md @@ -0,0 +1,5 @@ +--- +'@eth-optimism/l2geth': patch +--- + +Updates `scripts/start.sh` with the mainnet config by default diff --git a/l2geth/scripts/start.sh b/l2geth/scripts/start.sh index e7d7fad14e860..7dca8ce9aa5b6 100755 --- a/l2geth/scripts/start.sh +++ b/l2geth/scripts/start.sh @@ -4,14 +4,15 @@ DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" > /dev/null && pwd )" REPO=$DIR/.. IS_VERIFIER= +ROLLUP_SYNC_SERVICE_ENABLE=true DATADIR=$HOME/.ethereum TARGET_GAS_LIMIT=9000000 CHAIN_ID=10 -ETH1_CTC_DEPLOYMENT_HEIGHT=12207792 -ETH1_L1_GATEWAY_ADDRESS=0xF20C38fCdDF0C790319Fd7431d17ea0c2bC9959c -ETH1_L1_CROSS_DOMAIN_MESSENGER_ADDRESS=0xD1EC7d40CCd01EB7A305b94cBa8AB6D17f6a9eFE +ETH1_CTC_DEPLOYMENT_HEIGHT=12410807 +ETH1_L1_GATEWAY_ADDRESS=0xe681F80966a8b1fFadECf8068bD6F99034791c95 +ETH1_L1_CROSS_DOMAIN_MESSENGER_ADDRESS=0x902e5fF5A99C4eC1C21bbab089fdabE32EF0A5DF ADDRESS_MANAGER_OWNER_ADDRESS=0x9BA6e03D8B90dE867373Db8cF1A58d2F7F006b3A -ROLLUP_STATE_DUMP_PATH=https://storage.googleapis.com/optimism/mainnet/3.json +ROLLUP_STATE_DUMP_PATH=https://storage.googleapis.com/optimism/mainnet/4.json ROLLUP_CLIENT_HTTP=http://localhost:7878 ROLLUP_POLL_INTERVAL=15s ROLLUP_TIMESTAMP_REFRESH=3m @@ -49,6 +50,10 @@ while (( "$#" )); do IS_VERIFIER=true shift 1 ;; + --rollup.disablesyncservice) + ROLLUP_SYNC_SERVICE_ENABLE= + shift 1 + ;; --verbosity) if [ -n "$2" ] && [ ${2:0:1} != "-" ]; then VERBOSITY="$2" @@ -210,7 +215,9 @@ while (( "$#" )); do done cmd="$REPO/build/bin/geth" -cmd="$cmd --eth1.syncservice" +if [[ ! -z "$ROLLUP_SYNC_SERVICE_ENABLE" ]]; then + cmd="$cmd --eth1.syncservice" +fi cmd="$cmd --datadir $DATADIR" cmd="$cmd --eth1.l1crossdomainmessengeraddress $ETH1_L1_CROSS_DOMAIN_MESSENGER_ADDRESS" cmd="$cmd --rollup.addressmanagerowneraddress $ADDRESS_MANAGER_OWNER_ADDRESS" From 7d8d29461ec745d1bc8f15fe73cb526c36be6789 Mon Sep 17 00:00:00 2001 From: Ben Wilson <82120899+optimisticben@users.noreply.github.com> Date: Wed, 12 May 2021 17:41:08 -0400 Subject: [PATCH 74/81] Update Github Actions for the develop branch (#856) * Update Github Actions for the develop branch * Rebased and updated changeset config --- .changeset/config.json | 2 +- .github/workflows/release.yml | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.changeset/config.json b/.changeset/config.json index b3008c6a2fc01..d18f3a96e5afa 100644 --- a/.changeset/config.json +++ b/.changeset/config.json @@ -4,7 +4,7 @@ "commit": false, "linked": [], "access": "public", - "baseBranch": "master", + "baseBranch": "develop", "updateInternalDependencies": "patch", "ignore": [] } diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 2bdc59c027b47..b87f259b03e73 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -3,6 +3,7 @@ name: Release on: push: branches: + - develop - master jobs: From 20242af4e7afd772588bff9d54302a8c906ce0ad Mon Sep 17 00:00:00 2001 From: Mark Tyneway Date: Wed, 12 May 2021 15:57:43 -0700 Subject: [PATCH 75/81] fix: get last confirmed enqueue (#846) * l2geth: fix get last confirmed enqueue * chore: add changeset * client: return error correctly --- .changeset/big-moose-type.md | 5 +++++ l2geth/rollup/client.go | 9 ++++++--- 2 files changed, 11 insertions(+), 3 deletions(-) create mode 100644 .changeset/big-moose-type.md diff --git a/.changeset/big-moose-type.md b/.changeset/big-moose-type.md new file mode 100644 index 0000000000000..e87e713c4622f --- /dev/null +++ b/.changeset/big-moose-type.md @@ -0,0 +1,5 @@ +--- +'@eth-optimism/l2geth': patch +--- + +Fixes a bug in L2geth that causes it to skip the first deposit if there have been no deposits batch-submitted yet diff --git a/l2geth/rollup/client.go b/l2geth/rollup/client.go index 729848017bda8..79045f3dc5971 100644 --- a/l2geth/rollup/client.go +++ b/l2geth/rollup/client.go @@ -449,23 +449,26 @@ func (c *Client) GetLastConfirmedEnqueue() (*types.Transaction, error) { if err != nil { return nil, fmt.Errorf("Cannot get latest enqueue: %w", err) } - // This should only happen if the database is empty + // This should only happen if there are no L1 to L2 transactions yet if enqueue == nil { - return nil, nil + return nil, errElementNotFound } // Work backwards looking for the first enqueue // to have an index, which means it has been included // in the canonical transaction chain. for { meta := enqueue.GetMeta() + // The enqueue has an index so it has been confirmed if meta.Index != nil { return enqueue, nil } + // There is no queue index so this is a bug if meta.QueueIndex == nil { return nil, fmt.Errorf("queue index is nil") } + // No enqueue transactions have been confirmed yet if *meta.QueueIndex == uint64(0) { - return enqueue, nil + return nil, errElementNotFound } next, err := c.GetEnqueue(*meta.QueueIndex - 1) if err != nil { From 96a586e7389703e6622c093a8014422487d26c99 Mon Sep 17 00:00:00 2001 From: Mark Tyneway Date: Wed, 12 May 2021 20:56:47 -0700 Subject: [PATCH 76/81] batch-submitter: updated config (#847) * batch-submitter: backwards compatible configuration * chore: add changeset * deps: update * js: move bcfg interface to core-utils * batch-submitter: parse USE_SENTRY and add to env example * chore: add changeset * batch-submitter: parse as float instead of int * batch-submitter: better error logging --- .changeset/lovely-plants-clean.md | 7 + .changeset/soft-squids-switch.md | 5 + packages/batch-submitter/.env.example | 1 + packages/batch-submitter/package.json | 1 + .../src/exec/run-batch-submitter.ts | 340 +++++++++++------- packages/core-utils/src/bcfg.ts | 8 + packages/core-utils/src/index.ts | 1 + .../data-transport-layer/src/services/run.ts | 11 +- packages/message-relayer/src/exec/run.ts | 9 +- 9 files changed, 244 insertions(+), 139 deletions(-) create mode 100644 .changeset/lovely-plants-clean.md create mode 100644 .changeset/soft-squids-switch.md create mode 100644 packages/core-utils/src/bcfg.ts diff --git a/.changeset/lovely-plants-clean.md b/.changeset/lovely-plants-clean.md new file mode 100644 index 0000000000000..6ea61e2d79ada --- /dev/null +++ b/.changeset/lovely-plants-clean.md @@ -0,0 +1,7 @@ +--- +'@eth-optimism/core-utils': patch +'@eth-optimism/data-transport-layer': patch +'@eth-optimism/message-relayer': patch +--- + +Migrate bcfg interface to core-utils diff --git a/.changeset/soft-squids-switch.md b/.changeset/soft-squids-switch.md new file mode 100644 index 0000000000000..0ff4c22153fb5 --- /dev/null +++ b/.changeset/soft-squids-switch.md @@ -0,0 +1,5 @@ +--- +'@eth-optimism/batch-submitter': patch +--- + +Updates the configuration to use bcfg in a backwards compatible way diff --git a/packages/batch-submitter/.env.example b/packages/batch-submitter/.env.example index 54576ac4f2fe0..fe7a77704cd2b 100644 --- a/packages/batch-submitter/.env.example +++ b/packages/batch-submitter/.env.example @@ -7,6 +7,7 @@ DEBUG=info*,error*,warn*,debug* # Leave the SENTRY_DSN variable unset during local development SENTRY_DSN= SENTRY_TRACE_RATE= +USE_SENTRY= L1_NODE_WEB3_URL=http://localhost:9545 L2_NODE_WEB3_URL=http://localhost:8545 diff --git a/packages/batch-submitter/package.json b/packages/batch-submitter/package.json index 5ed68527cf993..9a887ab5c4103 100644 --- a/packages/batch-submitter/package.json +++ b/packages/batch-submitter/package.json @@ -37,6 +37,7 @@ "@eth-optimism/ynatm": "^0.2.2", "@ethersproject/abstract-provider": "^5.0.5", "@ethersproject/providers": "^5.0.14", + "bcfg": "^0.1.6", "bluebird": "^3.7.2", "dotenv": "^8.2.0", "ethers": "5.0.0", diff --git a/packages/batch-submitter/src/exec/run-batch-submitter.ts b/packages/batch-submitter/src/exec/run-batch-submitter.ts index 00319f59330b0..6ef7e8445287b 100644 --- a/packages/batch-submitter/src/exec/run-batch-submitter.ts +++ b/packages/batch-submitter/src/exec/run-batch-submitter.ts @@ -1,11 +1,11 @@ /* External Imports */ -import { injectL2Context } from '@eth-optimism/core-utils' +import { injectL2Context, Bcfg } from '@eth-optimism/core-utils' import { Logger, Metrics } from '@eth-optimism/common-ts' import { exit } from 'process' import { Signer, Wallet } from 'ethers' import { JsonRpcProvider, TransactionReceipt } from '@ethersproject/providers' -import { config } from 'dotenv' -config() +import * as dotenv from 'dotenv' +import Config from 'bcfg' /* Internal Imports */ import { @@ -16,89 +16,41 @@ import { TX_BATCH_SUBMITTER_LOG_TAG, } from '..' -const environment = process.env.NODE_ENV -const network = process.env.ETH_NETWORK_NAME -const release = `batch-submitter@${process.env.npm_package_version}` - -/* Logger */ -const name = 'oe:batch_submitter:init' -let logger - -if (network) { - // Initialize Sentry for Batch Submitter deployed to a network - logger = new Logger({ - name, - sentryOptions: { - release, - dsn: process.env.SENTRY_DSN, - tracesSampleRate: parseInt(process.env.SENTRY_TRACE_RATE, 10) || 0.05, - environment: network, // separate our Sentry errors by network instead of node environment - }, - }) -} else { - // Skip initializing Sentry - logger = new Logger({ name }) -} - -/* Metrics */ -const metrics = new Metrics({ - prefix: name, - labels: { environment, release, network }, -}) - interface RequiredEnvVars { // The HTTP provider URL for L1. - L1_NODE_WEB3_URL: 'L1_NODE_WEB3_URL' + L1_NODE_WEB3_URL: string // The HTTP provider URL for L2. - L2_NODE_WEB3_URL: 'L2_NODE_WEB3_URL' + L2_NODE_WEB3_URL: string // The layer one address manager address - ADDRESS_MANAGER_ADDRESS: 'ADDRESS_MANAGER_ADDRESS' + ADDRESS_MANAGER_ADDRESS: string // The minimum size in bytes of any L1 transactions generated by the batch submitter. - MIN_L1_TX_SIZE: 'MIN_L1_TX_SIZE' + MIN_L1_TX_SIZE: number // The maximum size in bytes of any L1 transactions generated by the batch submitter. - MAX_L1_TX_SIZE: 'MAX_L1_TX_SIZE' + MAX_L1_TX_SIZE: number // The maximum number of L2 transactions that can ever be in a batch. - MAX_TX_BATCH_COUNT: 'MAX_TX_BATCH_COUNT' + MAX_TX_BATCH_COUNT: number // The maximum number of L2 state roots that can ever be in a batch. - MAX_STATE_BATCH_COUNT: 'MAX_STATE_BATCH_COUNT' + MAX_STATE_BATCH_COUNT: number // The maximum amount of time (seconds) that we will wait before submitting an under-sized batch. - MAX_BATCH_SUBMISSION_TIME: 'MAX_BATCH_SUBMISSION_TIME' + MAX_BATCH_SUBMISSION_TIME: number // The delay in milliseconds between querying L2 for more transactions / to create a new batch. - POLL_INTERVAL: 'POLL_INTERVAL' + POLL_INTERVAL: number // The number of confirmations which we will wait after appending new batches. - NUM_CONFIRMATIONS: 'NUM_CONFIRMATIONS' + NUM_CONFIRMATIONS: number // The number of seconds to wait before resubmitting a transaction. - RESUBMISSION_TIMEOUT: 'RESUBMISSION_TIMEOUT' + RESUBMISSION_TIMEOUT: number // The number of confirmations that we should wait before submitting state roots for CTC elements. - FINALITY_CONFIRMATIONS: 'FINALITY_CONFIRMATIONS' + FINALITY_CONFIRMATIONS: number // Whether or not to run the tx batch submitter. - RUN_TX_BATCH_SUBMITTER: 'true' | 'false' | 'RUN_TX_BATCH_SUBMITTER' + RUN_TX_BATCH_SUBMITTER: boolean // Whether or not to run the state batch submitter. - RUN_STATE_BATCH_SUBMITTER: 'true' | 'false' | 'RUN_STATE_BATCH_SUBMITTER' + RUN_STATE_BATCH_SUBMITTER: boolean // The safe minimum amount of ether the batch submitter key should // hold before it starts to log errors. - SAFE_MINIMUM_ETHER_BALANCE: 'SAFE_MINIMUM_ETHER_BALANCE' + SAFE_MINIMUM_ETHER_BALANCE: number // A boolean to clear the pending transactions in the mempool // on start up. - CLEAR_PENDING_TXS: 'true' | 'false' | 'CLEAR_PENDING_TXS' -} -const requiredEnvVars: RequiredEnvVars = { - L1_NODE_WEB3_URL: 'L1_NODE_WEB3_URL', - L2_NODE_WEB3_URL: 'L2_NODE_WEB3_URL', - ADDRESS_MANAGER_ADDRESS: 'ADDRESS_MANAGER_ADDRESS', - MIN_L1_TX_SIZE: 'MIN_L1_TX_SIZE', - MAX_L1_TX_SIZE: 'MAX_L1_TX_SIZE', - MAX_TX_BATCH_COUNT: 'MAX_TX_BATCH_COUNT', - MAX_STATE_BATCH_COUNT: 'MAX_STATE_BATCH_COUNT', - MAX_BATCH_SUBMISSION_TIME: 'MAX_BATCH_SUBMISSION_TIME', - POLL_INTERVAL: 'POLL_INTERVAL', - NUM_CONFIRMATIONS: 'NUM_CONFIRMATIONS', - RESUBMISSION_TIMEOUT: 'RESUBMISSION_TIMEOUT', - FINALITY_CONFIRMATIONS: 'FINALITY_CONFIRMATIONS', - RUN_TX_BATCH_SUBMITTER: 'RUN_TX_BATCH_SUBMITTER', - RUN_STATE_BATCH_SUBMITTER: 'RUN_STATE_BATCH_SUBMITTER', - SAFE_MINIMUM_ETHER_BALANCE: 'SAFE_MINIMUM_ETHER_BALANCE', - CLEAR_PENDING_TXS: 'CLEAR_PENDING_TXS', + CLEAR_PENDING_TXS: boolean } /* Optional Env Vars @@ -112,50 +64,196 @@ const requiredEnvVars: RequiredEnvVars = { * SEQUENCER_HD_PATH * PROPOSER_HD_PATH */ -const env = process.env -const FRAUD_SUBMISSION_ADDRESS = env.FRAUD_SUBMISSION_ADDRESS || 'no fraud' -const DISABLE_QUEUE_BATCH_APPEND = !!env.DISABLE_QUEUE_BATCH_APPEND -const MIN_GAS_PRICE_IN_GWEI = parseInt(env.MIN_GAS_PRICE_IN_GWEI, 10) || 0 -const MAX_GAS_PRICE_IN_GWEI = parseInt(env.MAX_GAS_PRICE_IN_GWEI, 10) || 70 -const GAS_RETRY_INCREMENT = parseInt(env.GAS_RETRY_INCREMENT, 10) || 5 -const GAS_THRESHOLD_IN_GWEI = parseInt(env.GAS_THRESHOLD_IN_GWEI, 10) || 100 - -// Private keys & mnemonics -const SEQUENCER_PRIVATE_KEY = env.SEQUENCER_PRIVATE_KEY -const PROPOSER_PRIVATE_KEY = - env.PROPOSER_PRIVATE_KEY || env.SEQUENCER_PRIVATE_KEY // Kept for backwards compatibility -const SEQUENCER_MNEMONIC = env.SEQUENCER_MNEMONIC || env.MNEMONIC -const PROPOSER_MNEMONIC = env.PROPOSER_MNEMONIC || env.MNEMONIC -const SEQUENCER_HD_PATH = env.SEQUENCER_HD_PATH || env.HD_PATH -const PROPOSER_HD_PATH = env.PROPOSER_HD_PATH || env.HD_PATH -// Auto fix batch options -- TODO: Remove this very hacky config -const AUTO_FIX_BATCH_OPTIONS_CONF = env.AUTO_FIX_BATCH_OPTIONS_CONF -const autoFixBatchOptions: AutoFixBatchOptions = { - fixDoublePlayedDeposits: AUTO_FIX_BATCH_OPTIONS_CONF - ? AUTO_FIX_BATCH_OPTIONS_CONF.includes('fixDoublePlayedDeposits') - : false, - fixMonotonicity: AUTO_FIX_BATCH_OPTIONS_CONF - ? AUTO_FIX_BATCH_OPTIONS_CONF.includes('fixMonotonicity') - : false, - fixSkippedDeposits: AUTO_FIX_BATCH_OPTIONS_CONF - ? AUTO_FIX_BATCH_OPTIONS_CONF.includes('fixSkippedDeposits') - : false, -} export const run = async () => { + dotenv.config() + + const config: Bcfg = new Config('batch-submitter') + config.load({ + env: true, + argv: true, + }) + + // Parse config + const env = process.env + const environment = config.str('node-env', env.NODE_ENV) + const network = config.str('eth-network-name', env.ETH_NETWORK_NAME) + const release = `batch-submitter@${env.npm_package_version}` + const sentryDsn = config.str('sentry-dsn', env.SENTRY_DSN) + const sentryTraceRate = config.ufloat( + 'sentry-trace-rate', + parseFloat(env.SENTRY_TRACE_RATE) || 0.05 + ) + + /* Logger */ + const name = 'oe:batch_submitter:init' + let logger + + if (config.bool('use-sentry', env.USE_SENTRY === 'true')) { + // Initialize Sentry for Batch Submitter deployed to a network + logger = new Logger({ + name, + sentryOptions: { + release, + dsn: sentryDsn, + tracesSampleRate: sentryTraceRate, + environment: network, + }, + }) + } else { + // Skip initializing Sentry + logger = new Logger({ name }) + } + + /* Metrics */ + const metrics = new Metrics({ + prefix: name, + labels: { environment, release, network }, + }) + + const FRAUD_SUBMISSION_ADDRESS = config.str( + 'fraud-submisison-address', + env.FRAUD_SUBMISSION_ADDRESS || 'no fraud' + ) + const DISABLE_QUEUE_BATCH_APPEND = config.bool( + 'disable-queue-batch-append', + !!env.DISABLE_QUEUE_BATCH_APPEND + ) + const MIN_GAS_PRICE_IN_GWEI = config.uint( + 'min-gas-price-in-gwei', + parseInt(env.MIN_GAS_PRICE_IN_GWEI, 10) || 0 + ) + const MAX_GAS_PRICE_IN_GWEI = config.uint( + 'max-gas-price-in-gwei', + parseInt(env.MAX_GAS_PRICE_IN_GWEI, 10) || 70 + ) + const GAS_RETRY_INCREMENT = config.uint( + 'gas-retry-increment', + parseInt(env.GAS_RETRY_INCREMENT, 10) || 5 + ) + const GAS_THRESHOLD_IN_GWEI = config.uint( + 'gas-threshold-in-gwei', + parseInt(env.GAS_THRESHOLD_IN_GWEI, 10) || 100 + ) + + // Private keys & mnemonics + const SEQUENCER_PRIVATE_KEY = config.str( + 'sequencer-private-key', + env.SEQUENCER_PRIVATE_KEY + ) + // Kept for backwards compatibility + const PROPOSER_PRIVATE_KEY = config.str( + 'proposer-private-key', + env.PROPOSER_PRIVATE_KEY || env.SEQUENCER_PRIVATE_KEY + ) + const SEQUENCER_MNEMONIC = config.str( + 'sequencer-mnemonic', + env.SEQUENCER_MNEMONIC || env.MNEMONIC + ) + const PROPOSER_MNEMONIC = config.str( + 'proposer-mnemonic', + env.PROPOSER_MNEMONIC || env.MNEMONIC + ) + const SEQUENCER_HD_PATH = config.str( + 'sequencer-hd-path', + env.SEQUENCER_HD_PATH || env.HD_PATH + ) + const PROPOSER_HD_PATH = config.str( + 'proposer-hd-path', + env.PROPOSER_HD_PATH || env.HD_PATH + ) + + // Auto fix batch options -- TODO: Remove this very hacky config + const AUTO_FIX_BATCH_OPTIONS_CONF = config.str( + 'auto-fix-batch-conf', + env.AUTO_FIX_BATCH_OPTIONS_CONF || '' + ) + const autoFixBatchOptions: AutoFixBatchOptions = { + fixDoublePlayedDeposits: AUTO_FIX_BATCH_OPTIONS_CONF + ? AUTO_FIX_BATCH_OPTIONS_CONF.includes('fixDoublePlayedDeposits') + : false, + fixMonotonicity: AUTO_FIX_BATCH_OPTIONS_CONF + ? AUTO_FIX_BATCH_OPTIONS_CONF.includes('fixMonotonicity') + : false, + fixSkippedDeposits: AUTO_FIX_BATCH_OPTIONS_CONF + ? AUTO_FIX_BATCH_OPTIONS_CONF.includes('fixSkippedDeposits') + : false, + } + logger.info('Starting batch submitter...') - for (const [i, val] of Object.entries(requiredEnvVars)) { - if (!process.env[val]) { + const requiredEnvVars: RequiredEnvVars = { + L1_NODE_WEB3_URL: config.str('l1-node-web3-url', env.L1_NODE_WEB3_URL), + L2_NODE_WEB3_URL: config.str('l2-node-web3-url', env.L2_NODE_WEB3_URL), + ADDRESS_MANAGER_ADDRESS: config.str( + 'address-manager-address', + env.ADDRESS_MANAGER_ADDRESS + ), + MIN_L1_TX_SIZE: config.uint( + 'min-l1-tx-size', + parseInt(env.MIN_L1_TX_SIZE, 10) + ), + MAX_L1_TX_SIZE: config.uint( + 'max-l1-tx-size', + parseInt(env.MAX_L1_TX_SIZE, 10) + ), + MAX_TX_BATCH_COUNT: config.uint( + 'max-tx-batch-count', + parseInt(env.MAX_TX_BATCH_COUNT, 10) + ), + MAX_STATE_BATCH_COUNT: config.uint( + 'max-state-batch-count', + parseInt(env.MAX_STATE_BATCH_COUNT, 10) + ), + MAX_BATCH_SUBMISSION_TIME: config.uint( + 'max-batch-submisison-time', + parseInt(env.MAX_BATCH_SUBMISSION_TIME, 10) + ), + POLL_INTERVAL: config.uint( + 'poll-interval', + parseInt(env.POLL_INTERVAL, 10) + ), + NUM_CONFIRMATIONS: config.uint( + 'num-confirmations', + parseInt(env.NUM_CONFIRMATIONS, 10) + ), + RESUBMISSION_TIMEOUT: config.uint( + 'resubmission-timeout', + parseInt(env.RESUBMISSION_TIMEOUT, 10) + ), + FINALITY_CONFIRMATIONS: config.uint( + 'finality-confirmations', + parseInt(env.FINALITY_CONFIRMATIONS, 10) + ), + RUN_TX_BATCH_SUBMITTER: config.bool( + 'run-tx-batch-submitter', + env.RUN_TX_BATCH_SUBMITTER === 'true' + ), + RUN_STATE_BATCH_SUBMITTER: config.bool( + 'run-state-batch-submitter', + env.RUN_STATE_BATCH_SUBMITTER === 'true' + ), + SAFE_MINIMUM_ETHER_BALANCE: config.ufloat( + 'safe-minimum-ether-balance', + parseFloat(env.SAFE_MINIMUM_ETHER_BALANCE) + ), + CLEAR_PENDING_TXS: config.bool( + 'clear-pending-txs', + env.CLEAR_PENDING_TXS === 'true' + ), + } + + for (const [key, val] of Object.entries(requiredEnvVars)) { + if (val === null || val === undefined) { logger.warn('Missing environment variable', { - varName: val, + key, + value: val, }) exit(1) } - requiredEnvVars[val] = process.env[val] } - const clearPendingTxs = requiredEnvVars.CLEAR_PENDING_TXS === 'true' + const clearPendingTxs = requiredEnvVars.CLEAR_PENDING_TXS const l1Provider = new JsonRpcProvider(requiredEnvVars.L1_NODE_WEB3_URL) const l2Provider = injectL2Context( @@ -206,14 +304,14 @@ export const run = async () => { const txBatchSubmitter = new TransactionBatchSubmitter( sequencerSigner, l2Provider, - parseInt(requiredEnvVars.MIN_L1_TX_SIZE, 10), - parseInt(requiredEnvVars.MAX_L1_TX_SIZE, 10), - parseInt(requiredEnvVars.MAX_TX_BATCH_COUNT, 10), - parseInt(requiredEnvVars.MAX_BATCH_SUBMISSION_TIME, 10) * 1_000, - parseInt(requiredEnvVars.NUM_CONFIRMATIONS, 10), - parseInt(requiredEnvVars.RESUBMISSION_TIMEOUT, 10) * 1_000, + requiredEnvVars.MIN_L1_TX_SIZE, + requiredEnvVars.MAX_L1_TX_SIZE, + requiredEnvVars.MAX_TX_BATCH_COUNT, + requiredEnvVars.MAX_BATCH_SUBMISSION_TIME * 1_000, + requiredEnvVars.NUM_CONFIRMATIONS, + requiredEnvVars.RESUBMISSION_TIMEOUT * 1_000, requiredEnvVars.ADDRESS_MANAGER_ADDRESS, - parseFloat(requiredEnvVars.SAFE_MINIMUM_ETHER_BALANCE), + requiredEnvVars.SAFE_MINIMUM_ETHER_BALANCE, MIN_GAS_PRICE_IN_GWEI, MAX_GAS_PRICE_IN_GWEI, GAS_RETRY_INCREMENT, @@ -230,15 +328,15 @@ export const run = async () => { const stateBatchSubmitter = new StateBatchSubmitter( proposerSigner, l2Provider, - parseInt(requiredEnvVars.MIN_L1_TX_SIZE, 10), - parseInt(requiredEnvVars.MAX_L1_TX_SIZE, 10), - parseInt(requiredEnvVars.MAX_STATE_BATCH_COUNT, 10), - parseInt(requiredEnvVars.MAX_BATCH_SUBMISSION_TIME, 10) * 1_000, - parseInt(requiredEnvVars.NUM_CONFIRMATIONS, 10), - parseInt(requiredEnvVars.RESUBMISSION_TIMEOUT, 10) * 1_000, - parseInt(requiredEnvVars.FINALITY_CONFIRMATIONS, 10), + requiredEnvVars.MIN_L1_TX_SIZE, + requiredEnvVars.MAX_L1_TX_SIZE, + requiredEnvVars.MAX_STATE_BATCH_COUNT, + requiredEnvVars.MAX_BATCH_SUBMISSION_TIME * 1_000, + requiredEnvVars.NUM_CONFIRMATIONS, + requiredEnvVars.RESUBMISSION_TIMEOUT * 1_000, + requiredEnvVars.FINALITY_CONFIRMATIONS, requiredEnvVars.ADDRESS_MANAGER_ADDRESS, - parseFloat(requiredEnvVars.SAFE_MINIMUM_ETHER_BALANCE), + requiredEnvVars.SAFE_MINIMUM_ETHER_BALANCE, MIN_GAS_PRICE_IN_GWEI, MAX_GAS_PRICE_IN_GWEI, GAS_RETRY_INCREMENT, @@ -281,7 +379,7 @@ export const run = async () => { }) await sequencerSigner.provider.waitForTransaction( response.hash, - parseInt(requiredEnvVars.NUM_CONFIRMATIONS, 10) + requiredEnvVars.NUM_CONFIRMATIONS ) } } @@ -307,17 +405,15 @@ export const run = async () => { logger.info('Retrying...') } // Sleep - await new Promise((r) => - setTimeout(r, parseInt(requiredEnvVars.POLL_INTERVAL, 10)) - ) + await new Promise((r) => setTimeout(r, requiredEnvVars.POLL_INTERVAL)) } } // Run batch submitters in two seperate infinite loops! - if (requiredEnvVars.RUN_TX_BATCH_SUBMITTER === 'true') { + if (requiredEnvVars.RUN_TX_BATCH_SUBMITTER) { loop(() => txBatchSubmitter.submitNextBatch()) } - if (requiredEnvVars.RUN_STATE_BATCH_SUBMITTER === 'true') { + if (requiredEnvVars.RUN_STATE_BATCH_SUBMITTER) { loop(() => stateBatchSubmitter.submitNextBatch()) } } diff --git a/packages/core-utils/src/bcfg.ts b/packages/core-utils/src/bcfg.ts new file mode 100644 index 0000000000000..8b40de591d2bf --- /dev/null +++ b/packages/core-utils/src/bcfg.ts @@ -0,0 +1,8 @@ +export interface Bcfg { + load: (options: { env?: boolean; argv?: boolean }) => void + str: (name: string, defaultValue?: string) => string + uint: (name: string, defaultValue?: number) => number + bool: (name: string, defaultValue?: boolean) => boolean + ufloat: (name: string, defaultValue?: number) => number + has: (name: string) => boolean +} diff --git a/packages/core-utils/src/index.ts b/packages/core-utils/src/index.ts index 2cc9c43e90977..aa5525f4dda43 100644 --- a/packages/core-utils/src/index.ts +++ b/packages/core-utils/src/index.ts @@ -4,3 +4,4 @@ export * from './watcher' export * from './l2context' export * from './events' export * from './batches' +export * from './bcfg' diff --git a/packages/data-transport-layer/src/services/run.ts b/packages/data-transport-layer/src/services/run.ts index 9074916a48583..877aaeded2cbe 100644 --- a/packages/data-transport-layer/src/services/run.ts +++ b/packages/data-transport-layer/src/services/run.ts @@ -1,18 +1,11 @@ /* Imports: External */ import * as dotenv from 'dotenv' -import Config from 'bcfg' // TODO: Add some types for bcfg if we get the chance. +import { Bcfg } from '@eth-optimism/core-utils' +import Config from 'bcfg' /* Imports: Internal */ import { L1DataTransportService } from './main/service' -interface Bcfg { - load: (options: { env?: boolean; argv?: boolean }) => void - str: (name: string, defaultValue?: string) => string - uint: (name: string, defaultValue?: number) => number - bool: (name: string, defaultValue?: boolean) => boolean - ufloat: (name: string, defaultValue?: number) => number -} - type ethNetwork = 'mainnet' | 'kovan' | 'goerli' ;(async () => { try { diff --git a/packages/message-relayer/src/exec/run.ts b/packages/message-relayer/src/exec/run.ts index 50ff1a72c12ff..c12c67d09215f 100644 --- a/packages/message-relayer/src/exec/run.ts +++ b/packages/message-relayer/src/exec/run.ts @@ -1,17 +1,10 @@ import { Wallet, providers } from 'ethers' import { MessageRelayerService } from '../service' +import { Bcfg } from '@eth-optimism/core-utils' import SpreadSheet from '../spreadsheet' import * as dotenv from 'dotenv' import Config from 'bcfg' -interface Bcfg { - load: (options: { env?: boolean; argv?: boolean }) => void - str: (name: string, defaultValue?: string) => string - uint: (name: string, defaultValue?: number) => number - bool: (name: string, defaultValue?: boolean) => boolean - ufloat: (name: string, defaultValue?: number) => number -} - dotenv.config() const main = async () => { From 0d1ed6734877a502ada875d64f309411a2f2ac2d Mon Sep 17 00:00:00 2001 From: smartcontracts Date: Thu, 13 May 2021 14:14:12 -0400 Subject: [PATCH 77/81] maintenance: standardize license usage (#861) * maintenance: standardize license usage * fix: rename LICENSE.txt to LICENSE --- .../LICENSE.txt => LICENSE | 0 .../LICENSE.txt => examples/hardhat/LICENSE | 3 +- examples/hardhat/package.json | 1 + .../LICENSE.txt => examples/truffle/LICENSE | 2 +- examples/waffle/LICENSE | 35 ++++++++++--------- .../LICENSE.txt => integration-tests/LICENSE | 4 +-- package.json | 1 + packages/batch-submitter/LICENSE | 22 ++++++++++++ packages/batch-submitter/package.json | 2 +- packages/common-ts/LICENSE | 22 ++++++++++++ packages/common-ts/package.json | 1 + packages/contracts/LICENSE | 22 ++++++++++++ packages/contracts/package.json | 1 + packages/core-utils/LICENSE | 22 ++++++++++++ packages/core-utils/package.json | 2 +- packages/data-transport-layer/LICENSE | 22 ++++++++++++ packages/data-transport-layer/package.json | 2 ++ packages/hardhat-ovm/LICENSE | 22 ++++++++++++ packages/hardhat-ovm/package.json | 1 + packages/message-relayer/LICENSE | 22 ++++++++++++ packages/message-relayer/package.json | 2 +- packages/smock/LICENSE | 22 ++++++++++++ packages/smock/package.json | 1 + specs/LICENSE | 22 ++++++++++++ 24 files changed, 231 insertions(+), 25 deletions(-) rename packages/data-transport-layer/LICENSE.txt => LICENSE (100%) rename packages/core-utils/LICENSE.txt => examples/hardhat/LICENSE (97%) rename packages/hardhat-ovm/LICENSE.txt => examples/truffle/LICENSE (97%) rename packages/contracts/LICENSE.txt => integration-tests/LICENSE (92%) create mode 100644 packages/batch-submitter/LICENSE create mode 100644 packages/common-ts/LICENSE create mode 100644 packages/contracts/LICENSE create mode 100644 packages/core-utils/LICENSE create mode 100644 packages/data-transport-layer/LICENSE create mode 100644 packages/hardhat-ovm/LICENSE create mode 100644 packages/message-relayer/LICENSE create mode 100644 packages/smock/LICENSE create mode 100644 specs/LICENSE diff --git a/packages/data-transport-layer/LICENSE.txt b/LICENSE similarity index 100% rename from packages/data-transport-layer/LICENSE.txt rename to LICENSE diff --git a/packages/core-utils/LICENSE.txt b/examples/hardhat/LICENSE similarity index 97% rename from packages/core-utils/LICENSE.txt rename to examples/hardhat/LICENSE index 36e597d780210..6a7da5218bb25 100644 --- a/packages/core-utils/LICENSE.txt +++ b/examples/hardhat/LICENSE @@ -1,6 +1,6 @@ (The MIT License) -Copyright 2020 Optimism +Copyright 2020-2021 Optimism Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the @@ -20,4 +20,3 @@ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - diff --git a/examples/hardhat/package.json b/examples/hardhat/package.json index f6b4cde125dee..89ff6fa2c267f 100644 --- a/examples/hardhat/package.json +++ b/examples/hardhat/package.json @@ -3,6 +3,7 @@ "private": true, "version": "1.0.0", "main": "index.js", + "author": "Optimism PBC", "license": "MIT", "scripts": { "deploy": "hardhat deploy", diff --git a/packages/hardhat-ovm/LICENSE.txt b/examples/truffle/LICENSE similarity index 97% rename from packages/hardhat-ovm/LICENSE.txt rename to examples/truffle/LICENSE index db5c80bc4af39..6a7da5218bb25 100644 --- a/packages/hardhat-ovm/LICENSE.txt +++ b/examples/truffle/LICENSE @@ -1,6 +1,6 @@ (The MIT License) -Copyright 2020 Optimism +Copyright 2020-2021 Optimism Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the diff --git a/examples/waffle/LICENSE b/examples/waffle/LICENSE index de42dad73d28f..6a7da5218bb25 100644 --- a/examples/waffle/LICENSE +++ b/examples/waffle/LICENSE @@ -1,21 +1,22 @@ -MIT License +(The MIT License) -Copyright (c) 2021 OptimismPBC +Copyright 2020-2021 Optimism -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/packages/contracts/LICENSE.txt b/integration-tests/LICENSE similarity index 92% rename from packages/contracts/LICENSE.txt rename to integration-tests/LICENSE index 6389df6bc15c2..6a7da5218bb25 100644 --- a/packages/contracts/LICENSE.txt +++ b/integration-tests/LICENSE @@ -1,6 +1,6 @@ (The MIT License) -Copyright 2020 Optimism +Copyright 2020-2021 Optimism Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the @@ -19,4 +19,4 @@ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/package.json b/package.json index cc516cd0f7e79..66755c07b4d4e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,7 @@ { "name": "optimism", "version": "1.0.0", + "author": "Optimism PBC", "license": "MIT", "workspaces": [ "packages/*", diff --git a/packages/batch-submitter/LICENSE b/packages/batch-submitter/LICENSE new file mode 100644 index 0000000000000..6a7da5218bb25 --- /dev/null +++ b/packages/batch-submitter/LICENSE @@ -0,0 +1,22 @@ +(The MIT License) + +Copyright 2020-2021 Optimism + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/packages/batch-submitter/package.json b/packages/batch-submitter/package.json index 9a887ab5c4103..4b21089721201 100644 --- a/packages/batch-submitter/package.json +++ b/packages/batch-submitter/package.json @@ -25,7 +25,7 @@ ], "homepage": "https://github.com/ethereum-optimism/optimism-monorepo/tree/master/packages/batch-submitter#readme", "license": "MIT", - "author": "Optimism", + "author": "Optimism PBC", "repository": { "type": "git", "url": "https://github.com/ethereum-optimism/optimism-monorepo.git" diff --git a/packages/common-ts/LICENSE b/packages/common-ts/LICENSE new file mode 100644 index 0000000000000..6a7da5218bb25 --- /dev/null +++ b/packages/common-ts/LICENSE @@ -0,0 +1,22 @@ +(The MIT License) + +Copyright 2020-2021 Optimism + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/packages/common-ts/package.json b/packages/common-ts/package.json index 17c73f740c2ad..f31ac49b8c373 100644 --- a/packages/common-ts/package.json +++ b/packages/common-ts/package.json @@ -6,6 +6,7 @@ "dist/*" ], "types": "dist/index", + "author": "Optimism PBC", "license": "MIT", "scripts": { "all": "yarn clean && yarn build && yarn test && yarn lint:fix && yarn lint", diff --git a/packages/contracts/LICENSE b/packages/contracts/LICENSE new file mode 100644 index 0000000000000..6a7da5218bb25 --- /dev/null +++ b/packages/contracts/LICENSE @@ -0,0 +1,22 @@ +(The MIT License) + +Copyright 2020-2021 Optimism + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/packages/contracts/package.json b/packages/contracts/package.json index 03212a89d9cd1..bbc10c56206fb 100644 --- a/packages/contracts/package.json +++ b/packages/contracts/package.json @@ -14,6 +14,7 @@ "mockOVM" ], "types": "dist/index", + "author": "Optimism PBC", "license": "MIT", "scripts": { "all": "yarn clean && yarn build && yarn test && yarn lint:fix && yarn lint", diff --git a/packages/core-utils/LICENSE b/packages/core-utils/LICENSE new file mode 100644 index 0000000000000..6a7da5218bb25 --- /dev/null +++ b/packages/core-utils/LICENSE @@ -0,0 +1,22 @@ +(The MIT License) + +Copyright 2020-2021 Optimism + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/packages/core-utils/package.json b/packages/core-utils/package.json index 70d3beebcf959..0837f75588ce3 100644 --- a/packages/core-utils/package.json +++ b/packages/core-utils/package.json @@ -7,7 +7,7 @@ ], "types": "dist/index", "repository": "git@github.com:ethereum-optimism/core-utils.git", - "author": "Kelvin Fichter ", + "author": "Optimism PBC", "license": "MIT", "scripts": { "all": "yarn clean && yarn build && yarn test && yarn lint:fix && yarn lint", diff --git a/packages/data-transport-layer/LICENSE b/packages/data-transport-layer/LICENSE new file mode 100644 index 0000000000000..6a7da5218bb25 --- /dev/null +++ b/packages/data-transport-layer/LICENSE @@ -0,0 +1,22 @@ +(The MIT License) + +Copyright 2020-2021 Optimism + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/packages/data-transport-layer/package.json b/packages/data-transport-layer/package.json index 1b59136fb5de1..6530b02be0b45 100644 --- a/packages/data-transport-layer/package.json +++ b/packages/data-transport-layer/package.json @@ -7,6 +7,8 @@ "dist/index" ], "types": "dist/index", + "author": "Optimism PBC", + "license": "MIT", "scripts": { "clean": "rimraf ./dist ./tsconfig.build.tsbuildinfo", "clean:db": "rimraf ./db", diff --git a/packages/hardhat-ovm/LICENSE b/packages/hardhat-ovm/LICENSE new file mode 100644 index 0000000000000..6a7da5218bb25 --- /dev/null +++ b/packages/hardhat-ovm/LICENSE @@ -0,0 +1,22 @@ +(The MIT License) + +Copyright 2020-2021 Optimism + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/packages/hardhat-ovm/package.json b/packages/hardhat-ovm/package.json index 17649420df811..3d59a64efac34 100644 --- a/packages/hardhat-ovm/package.json +++ b/packages/hardhat-ovm/package.json @@ -6,6 +6,7 @@ "files": [ "dist/*" ], + "author": "Optimism PBC", "license": "MIT", "scripts": { "clean": "rimraf tsconfig.build.tsbuildinfo dist", diff --git a/packages/message-relayer/LICENSE b/packages/message-relayer/LICENSE new file mode 100644 index 0000000000000..6a7da5218bb25 --- /dev/null +++ b/packages/message-relayer/LICENSE @@ -0,0 +1,22 @@ +(The MIT License) + +Copyright 2020-2021 Optimism + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/packages/message-relayer/package.json b/packages/message-relayer/package.json index 774c1c1692265..2fac7068c6fd1 100644 --- a/packages/message-relayer/package.json +++ b/packages/message-relayer/package.json @@ -23,7 +23,7 @@ ], "homepage": "https://github.com/ethereum-optimism/optimism-monorepo/tree/master/packages/batch-submitter#readme", "license": "MIT", - "author": "Optimism", + "author": "Optimism PBC", "repository": { "type": "git", "url": "https://github.com/ethereum-optimism/optimism.git" diff --git a/packages/smock/LICENSE b/packages/smock/LICENSE new file mode 100644 index 0000000000000..6a7da5218bb25 --- /dev/null +++ b/packages/smock/LICENSE @@ -0,0 +1,22 @@ +(The MIT License) + +Copyright 2020-2021 Optimism + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/packages/smock/package.json b/packages/smock/package.json index aaacc69b3ec4e..c68d35e415e47 100644 --- a/packages/smock/package.json +++ b/packages/smock/package.json @@ -6,6 +6,7 @@ "version": "1.1.3", "main": "dist/src/index", "types": "dist/src/index", + "author": "Optimism PBC", "license": "MIT", "scripts": { "build": "tsc -p tsconfig.build.json", diff --git a/specs/LICENSE b/specs/LICENSE new file mode 100644 index 0000000000000..6a7da5218bb25 --- /dev/null +++ b/specs/LICENSE @@ -0,0 +1,22 @@ +(The MIT License) + +Copyright 2020-2021 Optimism + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. From e1cc9898ba8bb60e7b0d935ad7256dc9c1ee82ed Mon Sep 17 00:00:00 2001 From: Matt Masurka Date: Thu, 13 May 2021 12:36:56 -0700 Subject: [PATCH 78/81] Link to new contributing guide (#867) * Links to new contributing guide * Adds 1 vs 2 reviewer list * More detail Co-authored-by: platocrat <37757724+platocrat@users.noreply.github.com> --- CONTRIBUTING.md | 307 ++---------------------------------------------- 1 file changed, 9 insertions(+), 298 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 04faa5223c0b6..fce460afc7efa 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,303 +1,14 @@ -# Contributing +# Optimism monorepo contributing guide -🚨 Before making any non-trivial change via Pull Request, please first open an issue -describing the change to solicit feedback and guidance. This will increase the -likelihood of your Pull Request getting merged. +**Please read our [general contributing guide](https://github.com/ethereum-optimism/.github/blob/master/CONTRIBUTING.md) before continuing** -## Contributing in Issues -For any issue, there are fundamentally three ways an individual can contribute: +These packages only require 1 reviewer (all other packages require 2 reviewers, unless the changes do not affect production or test code). +- packages/smock +- packages/core-utils +- packages/hardhat-ovm +- packages/common-ts +- examples +- integration-tests -1. By opening the issue for discussion: For instance, if you believe that you - have uncovered a bug in Optimism, creating a new issue in this repository's - issue tracker is the way to report it. -2. By helping to triage the issue: This can be done by providing - supporting details (a test case that demonstrates a bug), providing - suggestions on how to address the issue, or ensuring that the issue is tagged - correctly. - -3. By helping to resolve the issue: Typically this is done either in the form of - demonstrating that the issue reported is not a problem after all, or more - often, by opening a Pull Request that changes some bit of something in - Optimism in a concrete and reviewable manner. - -**Anybody can participate in any stage of contribution**. We urge you to -participate in the discussion around bugs and participate in reviewing PRs. - -### Asking for General Help - -If you have reviewed existing documentation and still have questions or are -having problems, you can open an issue asking for help. - -In exchange for receiving help, we ask that you contribute back a documentation -PR that helps others avoid the problems that you encountered. - -### Submitting a Bug Report - -When opening a new issue in the Optimism issue tracker, users will be presented -with a [basic template][template] that should be filled in. If you believe that you have -uncovered a bug, please fill out this form, following the template to the best -of your ability. Do not worry if you cannot answer every detail, just fill in -what you can. - -The two most important pieces of information we need in order to properly -evaluate the report is a description of the behavior you are seeing and a simple -test case we can use to recreate the problem on our own. If we cannot recreate -the issue, it becomes impossible for us to fix. - -In order to rule out the possibility of bugs introduced by userland code, test -cases should be limited, as much as possible, to using only Optimism APIs. - -See [How to create a Minimal, Complete, and Verifiable example][mcve]. - -[mcve]: https://stackoverflow.com/help/mcve -[template]: .github/PULL_REQUEST_TEMPLATE.md - -### Triaging a Bug Report - -Once an issue has been opened, it is not uncommon for there to be discussion -around it. Some contributors may have differing opinions about the issue, -including whether the behavior being seen is a bug or a feature. This discussion -is part of the process and should be kept focused, helpful, and professional. - -Short, clipped responses—that provide neither additional context nor supporting -detail—are not helpful or professional. To many, such responses are simply -annoying and unfriendly. - -Contributors are encouraged to help one another make forward progress as much as -possible, empowering one another to solve issues collaboratively. If you choose -to comment on an issue that you feel either is not a problem that needs to be -fixed, or if you encounter information in an issue that you feel is incorrect, -explain why you feel that way with additional supporting context, and be willing -to be convinced that you may be wrong. By doing so, we can often reach the -correct outcome much faster. - -### Resolving a Bug Report - -In the majority of cases, issues are resolved by opening a Pull Request. The -process for opening and reviewing a Pull Request is similar to that of opening -and triaging issues, but carries with it a necessary review and approval -workflow that ensures that the proposed changes meet the minimal quality and -functional guidelines of the Optimism project. - -## Pull Requests - -1. Ensure that tests pass and code is lint free. -2. Update the README.md if any changes invalidate its current content. -3. Include tests for any new functionality. -4. Reference relevant issues in your PR comment. - -### Commands - -This section lists some commonly needed commands. - -``` -# compile typescript -yarn build -# typescript lint checks -yarn lint -# typescript lint fixes -yarn lint:fix -# typescript unit tests -yarn test -# typescript integration tests -yarn test:integration -# l2geth lints -make lint -# l2geth tests -make test -``` - -### Tests - -If the change being proposed alters code (as opposed to only documentation for -example), it is either adding new functionality to Optimis or it is fixing -existing, broken functionality. In both of these cases, the pull request should -include one or more tests to ensure that functionality does not regress in the future. - -#### Unit Tests - -Functions which have very specific tasks should be unit tested. We encourage using -table tests to cover a large number of cases in a succinct readable manner. - -#### Integration tests - -Integration tests go in the `integration-tests` package. - -The best strategy for writing a new integration test is to look at existing -integration tests and follow the style. A common pattern is to -instantiate an Optimism environment first by bringing the docker-compose network -up (via `docker-compose up`) and then inside your test environment via [`OptimismEnv.new()`](https://github.com/ethereum-optimism/optimism/blob/18c122debc6b1acbd56be2d33c99109dc8f006fa/integration-tests/test/shared/env.ts#L23) - -### Commits - -It is a recommended best practice to keep your changes as logically grouped as -possible within individual commits. There is no limit to the number of commits -any single Pull Request may have, and many contributors find it easier to review -changes that are split across multiple commits. - -That said, if you have a number of commits that are "checkpoints" and don't -represent a single logical change, please squash those together. - -Note that multiple commits often get squashed when they are landed (see the -notes about [commit squashing](#commit-squashing)). - -#### Commit message guidelines - - -A good commit message should describe what changed and why. While we do not enforce it, -we would prefer it if your commit messages follow the [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/) convention. - -1. The first line should: - - * contain a short description of the change (preferably 50 characters or less, - and no more than 72 characters) - * be entirely in lowercase with the exception of proper nouns, acronyms, and - the words that refer to code, like function/variable names - * be prefixed with the name of the sub package being changed and start with an imperative verb. - - Examples: - - * batch-submitter: introduce ENS querying for names and addresses - * perf(integration-tests): tune down poll intervals - -2. Keep the second line blank. -3. Wrap all other lines at 72 columns (except for long URLs). -4. If your patch fixes an open issue, you can add a reference to it at the end - of the log. Use the `Fixes: #` prefix and the issue number. For other - references use `Refs: #`. `Refs` may include multiple issues, separated by a - comma. - - Examples: - - - `Fixes: #1337` - - `Refs: #1234` - -Sample complete commit message: - -```txt -package: explain the commit in one line - -Body of commit message is a few lines of text, explaining things -in more detail, possibly giving some background about the issue -being fixed, etc. - -The body of the commit message can be several paragraphs, and -please do proper word-wrap and keep columns shorter than about -72 characters or so. That way, `git log` will show things -nicely even when it is indented. - -Fixes: #1337 -Refs: #453, #154 -``` - -### Opening the Pull Request - -From within GitHub, opening a new Pull Request will present you with a -[template] that should be filled out. Please try to do your best at filling out -the details, but feel free to skip parts if you're not sure what to put. - -[template]: .github/PULL_REQUEST_TEMPLATE.md - -### Discuss and update - -You will probably get feedback or requests for changes to your Pull Request. -This is a big part of the submission process so don't be discouraged! Some -contributors may sign off on the Pull Request right away, others may have -more detailed comments or feedback. This is a necessary part of the process -in order to evaluate whether the changes are correct and necessary. - -**Any community member can review a PR and you might get conflicting feedback**. -Keep an eye out for comments from code owners to provide guidance on conflicting -feedback. - -**Once the PR is open, do not rebase the commits**. See [Commit Squashing](#commit-squashing) for -more details. - -### Commit Squashing - -In most cases, **do not squash commits that you add to your Pull Request during -the review process**. When the commits in your Pull Request land, they may be -squashed into one commit per logical change. Metadata will be added to the -commit message (including links to the Pull Request, links to relevant issues, -and the names of the reviewers). The commit history of your Pull Request, -however, will stay intact on the Pull Request page. - -## Reviewing Pull Requests - -**Any Optimism community member is welcome to review any pull request**. - -All Optimism contributors who choose to review and provide feedback on Pull -Requests have a responsibility to both the project and the individual making the -contribution. Reviews and feedback must be helpful, insightful, and geared -towards improving the contribution as opposed to simply blocking it. If there -are reasons why you feel the PR should not land, explain what those are. Do not -expect to be able to block a Pull Request from advancing simply because you say -"No" without giving an explanation. Be open to having your mind changed. Be open -to working with the contributor to make the Pull Request better. - -Reviews that are dismissive or disrespectful of the contributor or any other -reviewers are strictly counter to the Code of Conduct. - -When reviewing a Pull Request, the primary goals are for the codebase to improve -and for the person submitting the request to succeed. **Even if a Pull Request -does not land, the submitters should come away from the experience feeling like -their effort was not wasted or unappreciated**. Every Pull Request from a new -contributor is an opportunity to grow the community. - -### Review a bit at a time. - -Do not overwhelm new contributors. - -It is tempting to micro-optimize and make everything about relative performance, -perfect grammar, or exact style matches. Do not succumb to that temptation. - -Focus first on the most significant aspects of the change: - -1. Does this change make sense for Optimism? -2. Does this change make Optimism better, even if only incrementally? -3. Are there clear bugs or larger scale issues that need attending to? -4. Is the commit message readable and correct? If it contains a breaking change - is it clear enough? - -Note that only **incremental** improvement is needed to land a PR. This means -that the PR does not need to be perfect, only better than the status quo. Follow -up PRs may be opened to continue iterating. - -When changes are necessary, *request* them, do not *demand* them, and **do not -assume that the submitter already knows how to add a test or run a benchmark**. - -Specific performance optimization techniques, coding styles and conventions -change over time. The first impression you give to a new contributor never does. - -Nits (requests for small changes that are not essential) are fine, but try to -avoid stalling the Pull Request. Most nits can typically be fixed by the Optimism -Collaborator landing the Pull Request but they can also be an opportunity for -the contributor to learn a bit more about the project. - -It is always good to clearly indicate nits when you comment: e.g. -`Nit: change foo() to bar(). But this is not blocking.` - -If your comments were addressed but were not folded automatically after new -commits or if they proved to be mistaken, please, [hide them][hiding-a-comment] -with the appropriate reason to keep the conversation flow concise and relevant. - -### Be aware of the person behind the code - -Be aware that *how* you communicate requests and reviews in your feedback can -have a significant impact on the success of the Pull Request. Yes, we may land -a particular change that makes Optimism better, but the individual might just not -want to have anything to do with Optimism ever again. The goal is not just having -good code. - -### Abandoned or Stalled Pull Requests - -If a Pull Request appears to be abandoned or stalled, it is polite to first -check with the contributor to see if they intend to continue the work before -checking if they would mind if you took it over (especially if it just has nits -left). When doing so, it is courteous to give the original contributor credit -for the work they started (either by preserving their name and email address in -the commit log, or by using an `Author: ` meta-data tag in the commit. - -[hiding-a-comment]: https://help.github.com/articles/managing-disruptive-comments/#hiding-a-comment From c79dc8b209721c57c404b25749a934772dc5dd3b Mon Sep 17 00:00:00 2001 From: Karl Floersch Date: Thu, 13 May 2021 12:37:21 -0700 Subject: [PATCH 79/81] feat: add config for impersonating accounts to BS (#864) * feat: add config for impersonating accounts to BS Useful for testing against hardhat forks. * Make block offset configurable (#865) * feat: make block offset configurable * Add a USE_HARDHAT config * batch-submitter: must pass both impersonate options (#866) Co-authored-by: Mark Tyneway * batch-submitter: update example env * batch-submitter: lint fix * batch-submitter: clean up old comments * batch-submitter: USE_HARDHAT * batch-submitter: add error messages Co-authored-by: Mark Tyneway --- .changeset/odd-feet-think.md | 5 + .changeset/twenty-garlics-poke.md | 5 + packages/batch-submitter/.env.example | 4 + packages/batch-submitter/hardhat.config.ts | 2 + .../src/batch-submitter/batch-submitter.ts | 1 + .../src/batch-submitter/index.ts | 4 - .../batch-submitter/state-batch-submitter.ts | 12 +- .../src/batch-submitter/tx-batch-submitter.ts | 11 +- .../src/exec/run-batch-submitter.ts | 112 ++++++++++++------ .../batch-submitter/batch-submitter.spec.ts | 2 + 10 files changed, 111 insertions(+), 47 deletions(-) create mode 100644 .changeset/odd-feet-think.md create mode 100644 .changeset/twenty-garlics-poke.md diff --git a/.changeset/odd-feet-think.md b/.changeset/odd-feet-think.md new file mode 100644 index 0000000000000..a52efe5a0376b --- /dev/null +++ b/.changeset/odd-feet-think.md @@ -0,0 +1,5 @@ +--- +'@eth-optimism/batch-submitter': patch +--- + +Add impersonate account debug config. diff --git a/.changeset/twenty-garlics-poke.md b/.changeset/twenty-garlics-poke.md new file mode 100644 index 0000000000000..3397735ebc47e --- /dev/null +++ b/.changeset/twenty-garlics-poke.md @@ -0,0 +1,5 @@ +--- +'@eth-optimism/batch-submitter': patch +--- + +Make BLOCK_OFFSET configurable. diff --git a/packages/batch-submitter/.env.example b/packages/batch-submitter/.env.example index fe7a77704cd2b..18b3fa5ec1c3b 100644 --- a/packages/batch-submitter/.env.example +++ b/packages/batch-submitter/.env.example @@ -28,6 +28,10 @@ SAFE_MINIMUM_ETHER_BALANCE=0 CLEAR_PENDING_TXS=false ADDRESS_MANAGER_ADDRESS= +USE_HARDHAT= +DEBUG_IMPERSONATE_SEQUENCER_ADDRESS= +DEBUG_IMPERSONATE_PROPOSER_ADDRESS= + # Optional gas settings MAX_GAS_PRICE_IN_GWEI=200 GAS_RETRY_INCREMENT=5 diff --git a/packages/batch-submitter/hardhat.config.ts b/packages/batch-submitter/hardhat.config.ts index bb9ac2acb5659..312900b1bd036 100644 --- a/packages/batch-submitter/hardhat.config.ts +++ b/packages/batch-submitter/hardhat.config.ts @@ -6,6 +6,8 @@ import { RUN_OVM_TEST_GAS, } from './test/helpers/constants' +import '@nomiclabs/hardhat-ethers' + const config: HardhatUserConfig = { networks: { hardhat: { diff --git a/packages/batch-submitter/src/batch-submitter/batch-submitter.ts b/packages/batch-submitter/src/batch-submitter/batch-submitter.ts index 24097af75e0ce..c2e2fb64f8610 100644 --- a/packages/batch-submitter/src/batch-submitter/batch-submitter.ts +++ b/packages/batch-submitter/src/batch-submitter/batch-submitter.ts @@ -50,6 +50,7 @@ export abstract class BatchSubmitter { readonly maxGasPriceInGwei: number, readonly gasRetryIncrement: number, readonly gasThresholdInGwei: number, + readonly blockOffset: number, readonly logger: Logger, readonly defaultMetrics: Metrics ) { diff --git a/packages/batch-submitter/src/batch-submitter/index.ts b/packages/batch-submitter/src/batch-submitter/index.ts index 3e66fa8b8c3ee..0b96dc9a09d38 100644 --- a/packages/batch-submitter/src/batch-submitter/index.ts +++ b/packages/batch-submitter/src/batch-submitter/index.ts @@ -4,7 +4,3 @@ export * from './state-batch-submitter' export const TX_BATCH_SUBMITTER_LOG_TAG = 'oe:batch_submitter:tx_chain' export const STATE_BATCH_SUBMITTER_LOG_TAG = 'oe:batch_submitter:state_chain' - -// BLOCK_OFFSET is the number of L2 blocks we need to skip for the -// batch submitter. -export const BLOCK_OFFSET = 1 // TODO: Update testnet / mainnet to make this zero. diff --git a/packages/batch-submitter/src/batch-submitter/state-batch-submitter.ts b/packages/batch-submitter/src/batch-submitter/state-batch-submitter.ts index c1b3fbdaa9d97..2ccb68b8a8b96 100644 --- a/packages/batch-submitter/src/batch-submitter/state-batch-submitter.ts +++ b/packages/batch-submitter/src/batch-submitter/state-batch-submitter.ts @@ -12,7 +12,7 @@ import { import { Logger, Metrics } from '@eth-optimism/common-ts' /* Internal Imports */ -import { Range, BatchSubmitter, BLOCK_OFFSET } from '.' +import { Range, BatchSubmitter } from '.' export class StateBatchSubmitter extends BatchSubmitter { // TODO: Change this so that we calculate start = scc.totalElements() and end = ctc.totalElements()! @@ -40,6 +40,7 @@ export class StateBatchSubmitter extends BatchSubmitter { maxGasPriceInGwei: number, gasRetryIncrement: number, gasThresholdInGwei: number, + blockOffset: number, logger: Logger, metrics: Metrics, fraudSubmissionAddress: string @@ -60,6 +61,7 @@ export class StateBatchSubmitter extends BatchSubmitter { maxGasPriceInGwei, gasRetryIncrement, gasThresholdInGwei, + blockOffset, logger, metrics ) @@ -116,16 +118,16 @@ export class StateBatchSubmitter extends BatchSubmitter { public async _getBatchStartAndEnd(): Promise { this.logger.info('Getting batch start and end for state batch submitter...') - // TODO: Remove BLOCK_OFFSET by adding a tx to Geth's genesis const startBlock: number = - (await this.chainContract.getTotalElements()).toNumber() + BLOCK_OFFSET + (await this.chainContract.getTotalElements()).toNumber() + + this.blockOffset this.logger.info('Retrieved start block number from SCC', { startBlock, }) // We will submit state roots for txs which have been in the tx chain for a while. const totalElements: number = - (await this.ctcContract.getTotalElements()).toNumber() + BLOCK_OFFSET + (await this.ctcContract.getTotalElements()).toNumber() + this.blockOffset this.logger.info('Retrieved total elements from CTC', { totalElements, }) @@ -171,7 +173,7 @@ export class StateBatchSubmitter extends BatchSubmitter { return } - const offsetStartsAtIndex = startBlock - BLOCK_OFFSET // TODO: Remove BLOCK_OFFSET by adding a tx to Geth's genesis + const offsetStartsAtIndex = startBlock - this.blockOffset this.logger.debug('Submitting batch.', { tx }) const nonce = await this.signer.getTransactionCount() diff --git a/packages/batch-submitter/src/batch-submitter/tx-batch-submitter.ts b/packages/batch-submitter/src/batch-submitter/tx-batch-submitter.ts index d33b9e4be694d..b52be781aa525 100644 --- a/packages/batch-submitter/src/batch-submitter/tx-batch-submitter.ts +++ b/packages/batch-submitter/src/batch-submitter/tx-batch-submitter.ts @@ -21,7 +21,7 @@ import { AppendSequencerBatchParams, } from '../transaction-chain-contract' -import { Range, BatchSubmitter, BLOCK_OFFSET } from '.' +import { Range, BatchSubmitter } from '.' export interface AutoFixBatchOptions { fixDoublePlayedDeposits: boolean @@ -51,6 +51,7 @@ export class TransactionBatchSubmitter extends BatchSubmitter { maxGasPriceInGwei: number, gasRetryIncrement: number, gasThresholdInGwei: number, + blockOffset: number, logger: Logger, metrics: Metrics, disableQueueBatchAppend: boolean, @@ -76,6 +77,7 @@ export class TransactionBatchSubmitter extends BatchSubmitter { maxGasPriceInGwei, gasRetryIncrement, gasThresholdInGwei, + blockOffset, logger, metrics ) @@ -172,9 +174,9 @@ export class TransactionBatchSubmitter extends BatchSubmitter { this.logger.info( 'Getting batch start and end for transaction batch submitter...' ) - // TODO: Remove BLOCK_OFFSET by adding a tx to Geth's genesis const startBlock = - (await this.chainContract.getTotalElements()).toNumber() + BLOCK_OFFSET + (await this.chainContract.getTotalElements()).toNumber() + + this.blockOffset this.logger.info('Retrieved start block number from CTC', { startBlock, }) @@ -753,8 +755,7 @@ export class TransactionBatchSubmitter extends BatchSubmitter { } return { - // TODO: Remove BLOCK_OFFSET by adding a tx to Geth's genesis - shouldStartAtElement: shouldStartAtIndex - BLOCK_OFFSET, + shouldStartAtElement: shouldStartAtIndex - this.blockOffset, totalElementsToAppend, contexts, transactions, diff --git a/packages/batch-submitter/src/exec/run-batch-submitter.ts b/packages/batch-submitter/src/exec/run-batch-submitter.ts index 6ef7e8445287b..893d38970a6a5 100644 --- a/packages/batch-submitter/src/exec/run-batch-submitter.ts +++ b/packages/batch-submitter/src/exec/run-batch-submitter.ts @@ -63,6 +63,10 @@ interface RequiredEnvVars { * PROPOSER_MNEMONIC * SEQUENCER_HD_PATH * PROPOSER_HD_PATH + * BLOCK_OFFSET + * USE_HARDHAT + * DEBUG_IMPERSONATE_SEQUENCER_ADDRESS + * DEBUG_IMPERSONATE_PROPOSER_ADDRESS */ export const run = async () => { @@ -85,6 +89,12 @@ export const run = async () => { parseFloat(env.SENTRY_TRACE_RATE) || 0.05 ) + // Default is 1 because Geth normally has 1 more block than L1 + const BLOCK_OFFSET = config.uint( + 'block-offset', + parseInt(env.BLOCK_OFFSET, 10) || 1 + ) + /* Logger */ const name = 'oe:batch_submitter:init' let logger @@ -105,6 +115,66 @@ export const run = async () => { logger = new Logger({ name }) } + const useHardhat = config.bool('use-hardhat', !!env.USE_HARDAT) + const DEBUG_IMPERSONATE_SEQUENCER_ADDRESS = config.str( + 'debug-impersonate-sequencer-address', + env.DEBUG_IMPERSONATE_SEQUENCER_ADDRESS + ) + const DEBUG_IMPERSONATE_PROPOSER_ADDRESS = config.str( + 'debug-impersonate-proposer-address', + env.DEBUG_IMPERSONATE_PROPOSER_ADDRESS + ) + + const getSequencerSigner = async (): Promise => { + const l1Provider = new JsonRpcProvider(requiredEnvVars.L1_NODE_WEB3_URL) + + if (useHardhat) { + if (!DEBUG_IMPERSONATE_SEQUENCER_ADDRESS) { + throw new Error('Must pass DEBUG_IMPERSONATE_SEQUENCER_ADDRESS') + } + await l1Provider.send('hardhat_impersonateAccount', [ + DEBUG_IMPERSONATE_SEQUENCER_ADDRESS, + ]) + return l1Provider.getSigner(DEBUG_IMPERSONATE_SEQUENCER_ADDRESS) + } + + if (SEQUENCER_PRIVATE_KEY) { + return new Wallet(SEQUENCER_PRIVATE_KEY, l1Provider) + } else if (SEQUENCER_MNEMONIC) { + return Wallet.fromMnemonic(SEQUENCER_MNEMONIC, SEQUENCER_HD_PATH).connect( + l1Provider + ) + } + throw new Error( + 'Must pass one of SEQUENCER_PRIVATE_KEY, MNEMONIC, or SEQUENCER_MNEMONIC' + ) + } + + const getProposerSigner = async (): Promise => { + const l1Provider = new JsonRpcProvider(requiredEnvVars.L1_NODE_WEB3_URL) + + if (useHardhat) { + if (!DEBUG_IMPERSONATE_PROPOSER_ADDRESS) { + throw new Error('Must pass DEBUG_IMPERSONATE_PROPOSER_ADDRESS') + } + await l1Provider.send('hardhat_impersonateAccount', [ + DEBUG_IMPERSONATE_PROPOSER_ADDRESS, + ]) + return l1Provider.getSigner(DEBUG_IMPERSONATE_PROPOSER_ADDRESS) + } + + if (PROPOSER_PRIVATE_KEY) { + return new Wallet(PROPOSER_PRIVATE_KEY, l1Provider) + } else if (PROPOSER_MNEMONIC) { + return Wallet.fromMnemonic(PROPOSER_MNEMONIC, PROPOSER_HD_PATH).connect( + l1Provider + ) + } + throw new Error( + 'Must pass one of PROPOSER_PRIVATE_KEY, MNEMONIC, or PROPOSER_MNEMONIC' + ) + } + /* Metrics */ const metrics = new Metrics({ prefix: name, @@ -255,52 +325,26 @@ export const run = async () => { const clearPendingTxs = requiredEnvVars.CLEAR_PENDING_TXS - const l1Provider = new JsonRpcProvider(requiredEnvVars.L1_NODE_WEB3_URL) const l2Provider = injectL2Context( new JsonRpcProvider(requiredEnvVars.L2_NODE_WEB3_URL) ) - let sequencerSigner: Signer - let proposerSigner: Signer - if (SEQUENCER_PRIVATE_KEY) { - sequencerSigner = new Wallet(SEQUENCER_PRIVATE_KEY, l1Provider) - } else if (SEQUENCER_MNEMONIC) { - sequencerSigner = Wallet.fromMnemonic( - SEQUENCER_MNEMONIC, - SEQUENCER_HD_PATH - ).connect(l1Provider) - } else { - throw new Error( - 'Must pass one of SEQUENCER_PRIVATE_KEY, MNEMONIC, or SEQUENCER_MNEMONIC' - ) - } - if (PROPOSER_PRIVATE_KEY) { - proposerSigner = new Wallet(PROPOSER_PRIVATE_KEY, l1Provider) - } else if (PROPOSER_MNEMONIC) { - proposerSigner = Wallet.fromMnemonic( - PROPOSER_MNEMONIC, - PROPOSER_HD_PATH - ).connect(l1Provider) - } else { - throw new Error( - 'Must pass one of PROPOSER_PRIVATE_KEY, MNEMONIC, or PROPOSER_MNEMONIC' - ) - } + const sequencerSigner: Signer = await getSequencerSigner() + let proposerSigner: Signer = await getProposerSigner() const sequencerAddress = await sequencerSigner.getAddress() const proposerAddress = await proposerSigner.getAddress() - const address = await sequencerSigner.getAddress() + // If the sequencer & proposer are the same, use a single wallet + if (sequencerAddress === proposerAddress) { + proposerSigner = sequencerSigner + } + logger.info('Configured batch submitter addresses', { sequencerAddress, proposerAddress, addressManagerAddress: requiredEnvVars.ADDRESS_MANAGER_ADDRESS, }) - // If the sequencer & proposer are the same, use a single wallet - if (sequencerAddress === proposerAddress) { - proposerSigner = sequencerSigner - } - const txBatchSubmitter = new TransactionBatchSubmitter( sequencerSigner, l2Provider, @@ -316,6 +360,7 @@ export const run = async () => { MAX_GAS_PRICE_IN_GWEI, GAS_RETRY_INCREMENT, GAS_THRESHOLD_IN_GWEI, + BLOCK_OFFSET, logger.child({ name: TX_BATCH_SUBMITTER_LOG_TAG }), new Metrics({ prefix: TX_BATCH_SUBMITTER_LOG_TAG, @@ -341,6 +386,7 @@ export const run = async () => { MAX_GAS_PRICE_IN_GWEI, GAS_RETRY_INCREMENT, GAS_THRESHOLD_IN_GWEI, + BLOCK_OFFSET, logger.child({ name: STATE_BATCH_SUBMITTER_LOG_TAG }), new Metrics({ prefix: STATE_BATCH_SUBMITTER_LOG_TAG, diff --git a/packages/batch-submitter/test/batch-submitter/batch-submitter.spec.ts b/packages/batch-submitter/test/batch-submitter/batch-submitter.spec.ts index 30da81bd01ee3..f0b0e4686e8e9 100644 --- a/packages/batch-submitter/test/batch-submitter/batch-submitter.spec.ts +++ b/packages/batch-submitter/test/batch-submitter/batch-submitter.spec.ts @@ -216,6 +216,7 @@ describe('BatchSubmitter', () => { MAX_GAS_PRICE_IN_GWEI, GAS_RETRY_INCREMENT, GAS_THRESHOLD_IN_GWEI, + 1, new Logger({ name: TX_BATCH_SUBMITTER_LOG_TAG }), testMetrics, false @@ -432,6 +433,7 @@ describe('BatchSubmitter', () => { MAX_GAS_PRICE_IN_GWEI, GAS_RETRY_INCREMENT, GAS_THRESHOLD_IN_GWEI, + 1, new Logger({ name: STATE_BATCH_SUBMITTER_LOG_TAG }), testMetrics, '0x' + '01'.repeat(20) // placeholder for fraudSubmissionAddress From 775118a05280057f431f5eec4b47a52b57a9715d Mon Sep 17 00:00:00 2001 From: Matt Masurka Date: Thu, 13 May 2021 13:51:15 -0700 Subject: [PATCH 80/81] Contracts: connectToL1Contracts & connectToL2Contracts (part 1) (#858) * Contracts: connectToL1Contracts & connectToL2Contrats (part 1) * chore: add changeset Co-authored-by: Kelvin Fichter --- .changeset/real-pugs-suffer.md | 5 +++++ packages/contracts/package.json | 10 ++++++---- packages/contracts/test/helpers/constants.ts | 2 +- packages/contracts/tsconfig.json | 4 ++-- packages/contracts/tslint.json | 3 ++- 5 files changed, 16 insertions(+), 8 deletions(-) create mode 100644 .changeset/real-pugs-suffer.md diff --git a/.changeset/real-pugs-suffer.md b/.changeset/real-pugs-suffer.md new file mode 100644 index 0000000000000..dae2b959a5842 --- /dev/null +++ b/.changeset/real-pugs-suffer.md @@ -0,0 +1,5 @@ +--- +'@eth-optimism/contracts': patch +--- + +Updated package json with a missing dependency diff --git a/packages/contracts/package.json b/packages/contracts/package.json index bbc10c56206fb..9f24760c79e58 100644 --- a/packages/contracts/package.json +++ b/packages/contracts/package.json @@ -8,6 +8,7 @@ "dist/types-ovm/*.ts", "artifacts/contracts/**/*.json", "artifacts-ovm/contracts/**/*.json", + "deployments/**/*.json", "OVM", "iOVM", "libraries", @@ -48,6 +49,7 @@ "dependencies": { "@eth-optimism/core-utils": "^0.4.2", "@ethersproject/abstract-provider": "^5.0.8", + "@ethersproject/abstract-signer": "^5.1.0", "@ethersproject/contracts": "^5.0.5", "glob": "^7.1.6" }, @@ -57,11 +59,11 @@ "@eth-optimism/smock": "^1.1.3", "@nomiclabs/hardhat-ethers": "^2.0.1", "@nomiclabs/hardhat-waffle": "^2.0.1", - "@typechain/ethers-v5": "1.0.0", - "@types/buffer-xor": "^2.0.0", - "@typechain/hardhat": "^1.0.1", "@openzeppelin/contracts": "^3.3.0", "@openzeppelin/contracts-upgradeable": "^3.3.0", + "@typechain/ethers-v5": "1.0.0", + "@typechain/hardhat": "^1.0.1", + "@types/buffer-xor": "^2.0.0", "@types/chai": "^4.2.17", "@types/copyfiles": "^2.4.0", "@types/glob": "^7.1.3", @@ -70,13 +72,13 @@ "@types/mocha": "^8.2.2", "@types/yargs": "^16.0.1", "buffer-xor": "^2.0.2", - "ganache-core": "^2.13.2", "chai": "^4.3.1", "copyfiles": "^2.3.0", "directory-tree": "^2.2.7", "dotenv": "^8.2.0", "ethereum-waffle": "^3.3.0", "ethers": "^5.0.31", + "ganache-core": "^2.13.2", "hardhat": "^2.2.1", "hardhat-deploy": "^0.7.4", "hardhat-gas-reporter": "^1.0.4", diff --git a/packages/contracts/test/helpers/constants.ts b/packages/contracts/test/helpers/constants.ts index 2a55a97092d10..a2573a90ae000 100644 --- a/packages/contracts/test/helpers/constants.ts +++ b/packages/contracts/test/helpers/constants.ts @@ -5,7 +5,7 @@ import { fromHexString, toHexString } from '@eth-optimism/core-utils' import xor from 'buffer-xor' /* Internal Imports */ -import { getContractDefinition } from '../../src' +import { getContractDefinition } from '../../src/contract-defs' export const DEFAULT_ACCOUNTS = defaultAccounts export const DEFAULT_ACCOUNTS_HARDHAT = defaultAccounts.map((account) => { diff --git a/packages/contracts/tsconfig.json b/packages/contracts/tsconfig.json index 77c80113a45c4..9622d152c5da3 100644 --- a/packages/contracts/tsconfig.json +++ b/packages/contracts/tsconfig.json @@ -1,8 +1,8 @@ { "extends": "../../tsconfig.json", "compilerOptions": { - "resolveJsonModule": true + "resolveJsonModule": true }, - "include": ["./test"], + "include": ["./test", "src/**/*", "deployments"], "files": ["./hardhat.config.ts"] } diff --git a/packages/contracts/tslint.json b/packages/contracts/tslint.json index 9727d8b9fa814..08c0a483cadc4 100644 --- a/packages/contracts/tslint.json +++ b/packages/contracts/tslint.json @@ -2,6 +2,7 @@ "extends": "../../tslint.base.json", "rules": { "array-type": false, - "class-name": false + "class-name": false, + "no-var-requires": false } } From b448867776bd199bb5649fe2e2db8a59c7a8e3d6 Mon Sep 17 00:00:00 2001 From: Mark Tyneway Date: Thu, 13 May 2021 14:14:10 -0700 Subject: [PATCH 81/81] optimism: bump gaslimit to 10million --- ops/envs/geth.env | 2 +- packages/contracts/src/contract-dumps.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ops/envs/geth.env b/ops/envs/geth.env index b9c9dce5e904b..a9a5e08efad01 100644 --- a/ops/envs/geth.env +++ b/ops/envs/geth.env @@ -29,5 +29,5 @@ IPC_DISABLE=true NETWORK_ID=420 NO_USB=true NO_DISCOVER=true -TARGET_GAS_LIMIT=9000000 +TARGET_GAS_LIMIT=10000000 USING_OVM=true diff --git a/packages/contracts/src/contract-dumps.ts b/packages/contracts/src/contract-dumps.ts index b9fdc941702c0..3be73b350db15 100644 --- a/packages/contracts/src/contract-dumps.ts +++ b/packages/contracts/src/contract-dumps.ts @@ -115,7 +115,7 @@ export const makeStateDump = async (cfg: RollupDeployConfig): Promise => { deploymentSigner: signer, ovmGasMeteringConfig: { minTransactionGasLimit: 0, - maxTransactionGasLimit: 9_000_000, + maxTransactionGasLimit: 10_000_000, maxGasPerQueuePerEpoch: 1_000_000_000_000, secondsPerEpoch: 0, },